--b799 000eff0823140120002 Page 1 of MANIFEST
88872c 1 test-file
e80832 2 MANIFEST
e183bc 3 machashes.asc
59eeee D clients/
3f4290 D clients/disk/
5aacb9 D clients/disk/mac/
cc64d6 D clients/disk/mac/source/
e9863c D clients/disk/mac/source/App/
0a6e9e 4 CDiskTestsTable.cp
6c1794 5 CDiskTestsTable.h
859130 6 CDiskTestsWindow.cp
549ed6 7 CDiskTestsWindow.h
ccb772 8 CEditDiskTestDialog.cp
6b8aa9 9 CEditDiskTestDialog.h
ffb794 10 CGetPassphraseDialog.cp
2f3396 11 CGetPassphraseDialog.h
1cfa50 12 CMainWindow.cp
960142 13 CMainWindow.h
27601a 14 CNewDiskWizardDialog.cp
673857 15 CNewDiskWizardDialog.h
0c06eb 16 CPGPDiskApplication.cp
d8b85d 17 CPGPDiskApplication.h
931a66 18 CPGPDiskDialog.cp
2e1c8c 19 CPGPDiskDialog.h
d6f421 20 CPGPDiskWindow.cp
601df5 21 CPGPDiskWindow.h
f4a2fe 22 CPassphraseDialog.cp
b25df5 23 CPassphraseDialog.h
b20a31 24 CPreferencesDialog.cp
1bd01c 25 CPreferencesDialog.h
401590 26 CSetPassphraseDialog.cp
510541 27 CSetPassphraseDialog.h
21f89e 28 PGPDiskApp.prefix
8cdc29 29 PGPDiskAppDebug.prefix
236834 30 PGPDiskBeta.c
ad028c 31 PGPDiskBeta.h
40be0b 32 PGPDiskFile.c
a6d4b3 33 PGPDiskFile.h
4a4f89 34 PGPDiskPreferences.c
0722e8 35 PGPDiskPreferences.h
3685fd 36 PGPdiskAppShared.prefix
9d2607 D clients/disk/mac/source/CipherProc/
d41c64 37 CipherContext.h
4400ff 38 CipherProc.h
8af8e4 39 CipherProc.prefix
c1d438 40 CipherProcDebug.prefix
af6efc 41 CipherProcGlue.c
ea379e 42 CipherProcGlue.h
ee9f92 43 CipherProcMain.c
9d09d2 D clients/disk/mac/source/Driver/
9f4e38 44 CBlindWriteQueue.cp
ef539f 45 CBlindWriteQueue.h
750d64 46 CChangeModDateQueue.cp
066fe6 47 CChangeModDateQueue.h
39bc9e 48 CCloseQueue.cp
01eb46 49 CCloseQueue.h
db740f 50 CDrive.cp
c1dde9 51 CDrive.h
e698d8 52 CDriveList.cp
8b4109 53 CDriveList.h
2db942 54 CDriver.cp
531456 55 CDriver.h
25ff03 56 CPBQueue.cp
0cf1aa 57 CPBQueue.h
bc63ae 58 PGPDiskDRVR.prefix
edef09 59 PGPDiskDRVRDebug.prefix
7f8a65 60 PGPDiskDRVRHeader.c
0f146e 61 PGPDiskDRVRMain.h
c0f20d D clients/disk/mac/source/Encryption/
14758f 62 PGPDiskCastCFB.cp
5e9320 63 PGPDiskCastCFB.h
ef96f5 64 SHA.cpp
--df68 000763e315b40120002 Page 2 of MANIFEST
e17f25 65 SHA.h
f33133 66 cast5.cpp
d28dc7 67 cast5.h
ac1c8d 68 cast5box.c
1027fd 69 randpool.c
10957a 70 randpool.h
cd43b4 D clients/disk/mac/source/GestaltProc/
b17db5 71 GestaltProc.c
8354c4 72 GestaltProc.prefix
2919c1 73 GestaltProcDebug.prefix
deeb3c D clients/disk/mac/source/PatchesProc/
bed32f 74 PatchesProc.c
5044de 75 PatchesProc.prefix
b0b039 76 PatchesProcDebug.prefix
21cd3e D clients/disk/mac/source/Shared/
1830a5 77 AddDriveStruct.h
f01b6a 78 CTuner.cp
a5de45 79 CTuner.h
381365 80 DriverAPI.cp
9cbab6 81 DriverAPI.h
c82806 82 DriverPrefs.h
6c67a6 83 PGPDisk.h
8c332f 84 PGPDiskEncryptDecrypt.c
d31ad7 85 PGPDiskEncryptDecrypt.h
efe684 86 PGPDiskFileFormat.h
eefe38 87 PGPDiskGestalt.h
35a858 88 PGPDiskGlobals.c
42dfb9 89 PGPDiskGlobals.h
3d2509 90 PGPDiskPatches.h
5a7ec4 91 PGPDiskResources.h
a770e5 92 PGPDiskShared.prefix
4c1db8 93 PGPDiskUtils.c
24893d 94 PGPDiskUtils.h
c9caab 95 PGPMountUtils.cp
34fe4b 96 PGPMountUtils.h
0ce601 97 SleepAlert.cp
b19e3b 98 SleepAlert.h
aa0e9e 99 TunerStruct.h
09a921 100 usuals.h
654213 D clients/disk/mac/source/Test/
935709 101 CInterruptLevelDRVRTester.cp
85fd6f 102 CInterruptLevelDRVRTester.h
98e15d 103 CInterruptLevelFileTester.cp
c2b920 104 CInterruptLevelFileTester.h
e110d7 105 CInterruptLevelTestMgr.cp
c798b7 106 CInterruptLevelTestMgr.h
7b1ca9 107 CInterruptLevelTester.cp
7758d7 108 CInterruptLevelTester.h
470fa2 109 CSyncFileTester.cp
cdc06c 110 CSyncFileTester.h
749673 111 CTestDrive.cp
110ab3 112 CTestDrive.h
f72ddc 113 TestDrive.prefix
42d871 114 TestDriveMain.cp
5b1b95 D clients/pgp/
3bdd13 D clients/pgp/mac/
643437 D clients/pgp/mac/PGPEudoraPlugIn/
4da057 D clients/pgp/mac/PGPEudoraPlugIn/EudoraAPISupport/
119792 115 copycat.c
1ff4d4 116 copycat.h
4c86e0 117 ctencode.c
385763 118 ctencode.h
b92d37 119 emsapi-component.c
30902e 120 emsapi-mac.h
86976d 121 emsdrive.c
904776 122 lglio.c
f98ff9 123 lglio.h
650c59 124 mimetype.c
a8ed5c 125 mimetype.h
5a1783 126 rfc1847.c
79767e 127 rfc1847.h
7640a3 128 rfc822.c
--7c60 000205cf2fa40120002 Page 3 of MANIFEST
5af19a 129 rfc822.h
624f49 130 usertrans.h_sample
e9b450 D clients/pgp/mac/PGPEudoraPlugIn/Source/
808d5f 131 CDecryptTranslator.cp
04b52c 132 CDecryptTranslator.h
a3af86 133 CEncryptTranslator.cp
a94139 134 CEncryptTranslator.h
198b34 135 CManualTranslator.cp
b78ff6 136 CManualTranslator.h
ffa26d 137 CSignTranslator.cp
29a1fe 138 CSignTranslator.h
a0f13f 139 CTranslator.cp
351610 140 CTranslator.h
c61d87 141 CVerifyTranslator.cp
93a544 142 CVerifyTranslator.h
e7edbe 143 EudoraTypes.h
2b5eae 144 MyMIMEUtils.c
593416 145 MyMIMEUtils.h
673108 146 PGPPlug.cp
2d361a 147 PGPPlug.h
84f468 148 PGPPlugGlue.cp
8798e3 149 PGPPlugTypes.h
982de7 150 PGPPlugin.inc
bc3f57 151 PGPPlugin.prefix
144375 152 PGPPluginDebug.prefix
758690 153 PGPPluginGlobals.h
98e479 154 PGPPluginMain.cp
cb5452 155 PlugInLibUtils.cp
846283 156 PlugInLibUtils.h
1c19c0 157 PluginProcInfo.h
34658c 158 PluginResources.h
4c0a58 159 TranslatorFactory.cp
3a697f 160 TranslatorFactory.h
583d22 161 TranslatorIDs.h
1fa833 162 TranslatorPrefs.c
bf93cd 163 TranslatorPrefs.h
56149c 164 TranslatorStrings.h
aad267 165 TranslatorUtils.cp
119b00 166 TranslatorUtils.h
734bb3 167 usertrans.h
70ee99 D clients/pgp/mac/PGPadmin/
43c46d D clients/pgp/mac/PGPadmin/code/
b9f6a0 168 CAdminDialog.cp
7f0f91 169 CAdminDialog.h
a7a0ef 170 CKeyTable.cp
078b60 171 CKeyTable.h
1309d0 172 PGPadmin.cp
57a54b 173 PGPadmin.h
653dba 174 PGPadmin.pch++
169a3c 175 PGPadmin.prefix
0b9fbd 176 PGPadminDebug.pch++
829f0f 177 PGPadminDebug.prefix
dbebf9 178 PGPadminGlobals.h
ab80b7 D clients/pgp/mac/PGPclientLib/
b3d646 179 PGPclientLib.prj.exp
92e84c D clients/pgp/mac/PGPclientLib/pub/
dce883 180 pgpClientLib.h
c05663 D clients/pgp/mac/PGPclientLib/source/
2f6544 181 CConfirmRemoteKeyDialog.cp
38104a 182 CConfirmRemoteKeyDialog.h
aebaf4 183 CFYEODialog.cp
cb8d73 184 CFYEODialog.h
1e2c1e 185 CKeyserverTable.cp
602569 186 CKeyserverTable.h
aa87ec 187 CPGPPreferencesGrafPortView.cp
582bd0 188 CPGPPreferencesGrafPortView.h
f063a9 189 CReconstitutionDialog.cp
3152e1 190 CReconstitutionDialog.h
4c70a0 191 CServerStatusDialog.cp
85eaf0 192 CServerStatusDialog.h
de2c0d 193 CWhiteList.cp
20af45 194 CWhiteList.h
--cbea 0002fdc5cfa40120002 Page 4 of MANIFEST
8d2531 195 PGPKeyServerDialogs.cp
e1558a 196 PGPSelectKeysDialog.cp
77541c 197 PGPSelectKeysDialog.h
22cd24 198 PGPSplash.r
2269be 199 PGPclientLib.prefix
0df775 200 PGPclientLibCommon.h
89451f 201 PGPclientLibDebug.prefix
3a3b9b 202 PGPclientLibDialogs.cp
942ba1 203 PGPclientLibDialogs.h
79b507 204 PGPclientLibHeaders.prefix
6f0e8a 205 PGPclientLibInitAndTerm.cp
7860ad 206 PGPclientLibUtils.cp
662271 207 PGPclientLibUtils.h
865fd8 D clients/pgp/mac/PGPcontextmenu/
81732c D clients/pgp/mac/PGPcontextmenu/code/
43aa2e 208 PGPCMPlugin.cp
a0ea30 209 PGPCMPlugin.h
52cb56 210 PGPcontextmenu.pch++
69140b 211 PGPcontextmenu.prefix
36315c 212 PGPcontextmenuDebug.pch++
3d19de 213 PGPcontextmenuDebug.prefix
edca85 214 cfrg.r
0d7763 D clients/pgp/mac/PGPemailer/
6cc870 D clients/pgp/mac/PGPemailer/Interface/
1ac9a1 215 CPGPemailerView.cp
8284ab 216 CPGPemailerView.h
728daf D clients/pgp/mac/PGPemailer/Patchers/
8c6b6f 217 CemailerCloseWindowPatch.cp
a41fdd 218 CemailerCloseWindowPatch.h
39afb3 219 CemailerEndUpdatePatch.cp
9f5b6c 220 CemailerEndUpdatePatch.h
1da94e 221 CemailerSetWTitlePatch.cp
31eacb 222 CemailerSetWTitlePatch.h
8fe33a 223 CemailerSizeWindowPatch.cp
3556a3 224 CemailerSizeWindowPatch.h
cf41ee 225 CemailerWaitNextEventPatch.cp
6c8d41 226 CemailerWaitNextEventPatch.h
cebc0c D clients/pgp/mac/PGPemailer/Plug/
5d9350 227 CPGPemailer.cp
3a3b1f 228 CPGPemailer.h
6bb6b3 229 PGPEmailerGlobals.h
c39737 230 PGPemailer.pch++
a1e2ca 231 PGPemailer.prefix
a1fb2c 232 PGPemailerDebug.pch++
e997d9 233 PGPemailerDebug.prefix
7c84e3 D clients/pgp/mac/PGPtools/
6c5b76 D clients/pgp/mac/PGPtools/source/
22fabb 234 CDragTextEdit.cp
b89cb5 235 CDragTextEdit.h
5f089f 236 CDropReceiver.cp
961f10 237 CDropReceiver.h
58b784 238 CPGPtools.cp
f35907 239 CPGPtools.h
34b82a 240 CPGPtoolsBufferTask.cp
3aaa56 241 CPGPtoolsBufferTask.h
fed250 242 CPGPtoolsClipboardTask.cp
f397a3 243 CPGPtoolsClipboardTask.h
5edac2 244 CPGPtoolsCryptoTask.cp
374c27 245 CPGPtoolsCryptoTask.h
bfc594 246 CPGPtoolsFileTask.cp
e311d1 247 CPGPtoolsFileTask.h
9c8790 248 CPGPtoolsMainWindow.cp
dde388 249 CPGPtoolsMainWindow.h
f8b0e9 250 CPGPtoolsPassphraseList.cp
dfbc84 251 CPGPtoolsPassphraseList.h
7baeae 252 CPGPtoolsProcessingList.cp
be0a7a 253 CPGPtoolsProcessingList.h
21c624 254 CPGPtoolsTask.cp
d6e858 255 CPGPtoolsTask.h
e6e7d6 256 CPGPtoolsTaskList.cp
1149c2 257 CPGPtoolsTaskList.h
2f1819 258 CPGPtoolsTaskProgressDialog.cp
--f98f 000f8e31ea940120002 Page 5 of MANIFEST
bb9785 259 CPGPtoolsTaskProgressDialog.h
657aa2 260 CPGPtoolsTextTask.cp
b5fccb 261 CPGPtoolsTextTask.h
d899a5 262 CPGPtoolsTextWindow.cp
932776 263 CPGPtoolsTextWindow.h
32c55e 264 CPGPtoolsWindow.cp
afadda 265 CPGPtoolsWindow.h
82e876 266 CPGPtoolsWipeTask.cp
97913d 267 CPGPtoolsWipeTask.h
78bbb4 268 CResultsTable.cp
878fc6 269 CResultsTable.h
76b8ac 270 CResultsWindow.cp
a8e45b 271 CResultsWindow.h
34c973 272 CWipeFreeSpaceWizardDialog.cp
c6fa74 273 CWipeFreeSpaceWizardDialog.h
f5b9c1 274 PGPtools.h
ac7f3b 275 PGPtoolsCommonHeaders.h
0fc2b8 276 PGPtoolsDebugHeaders.prefix
744236 277 PGPtoolsEncryptDecrypt.cp
ff3fb4 278 PGPtoolsEncryptDecrypt.h
1d4e09 279 PGPtoolsHeaders.prefix
d9b9fe 280 PGPtoolsPreferences.c
110612 281 PGPtoolsPreferences.h
4ea022 282 PGPtoolsResources.h
962b0c 283 PGPtoolsUtils.cp
b99c62 284 PGPtoolsUtils.h
99c929 D clients/pgp/mac/PGPmenu/
03b6b8 D clients/pgp/mac/PGPmenu/PGPmenu MESP/
674471 D clients/pgp/mac/PGPmenu/PGPmenu MESP/PGPmenuMESP code/
ce009f 285 PGPmenuMESP.cp
7a4276 286 PGPmenuMESP68KPrefix.h
81c71c 287 PGPmenuMESPPPCPrefix.h
e9999b D clients/pgp/mac/PGPmenu/Patchers/
27c2ff 288 CmenuDrawMenuBarPatch.cp
b826ab 289 CmenuDrawMenuBarPatch.h
3e85c1 290 CmenuEventAvailPatch.cp
c4fd95 291 CmenuEventAvailPatch.h
496959 292 CmenuGetKeysPatch.cp
a29ee8 293 CmenuGetKeysPatch.h
687261 294 CmenuGetResourcePatch.cp
521b4e 295 CmenuGetResourcePatch.h
f3ce1a 296 CmenuInsertMenuPatch.cp
0b6a4c 297 CmenuInsertMenuPatch.h
e177e7 298 CmenuMenuSelectPatch.cp
8b7c30 299 CmenuMenuSelectPatch.h
06ecb8 300 CmenuPutScrapPatch.cp
275fed 301 CmenuPutScrapPatch.h
e3a58e 302 CmenuSetMenuBarPatch.cp
4ab8a4 303 CmenuSetMenuBarPatch.h
274441 304 CmenuWaitNextEventPatch.cp
4d8347 305 CmenuWaitNextEventPatch.h
dafe58 D clients/pgp/mac/PGPmenu/Plug/
cdae5e 306 CCopyPasteHack.cp
c7a72d 307 CCopyPasteHack.h
a6a32d 308 CGAModalCPHResultDialog.cp
2ae1a7 309 CGAModalCPHResultDialog.h
3715c8 310 COutputDialog.cp
1fa1dd 311 COutputDialog.h
4828fc 312 CPGPmenu.cp
c58b6b 313 CPGPmenu.h
0744be 314 PGPappmenu.prefix
0a4a10 315 PGPappmenuDebug.prefix
ced310 316 PGPfindermenu.prefix
8cb2e7 317 PGPfindermenuDebug.prefix
90cead 318 PGPmenu.pch++
041619 319 PGPmenu.prefix
0e53eb 320 PGPmenuDebug.pch++
b388e4 321 PGPmenuDebug.prefix
26e6d0 322 PGPmenuGlobals.h
449b87 D clients/pgp/mac/Shared/
c3c53e 323 ABalloon.cp
f80acf 324 ABalloon.h
--08c7 0001f2cfef040120002 Page 6 of MANIFEST
bec042 325 BETA.c
95f2ed 326 BETA.h
8ea039 327 CGADurationEditField.cp
6c1d33 328 CGADurationEditField.h
5c63e6 329 CSecureMemory.h
1c3b10 330 CSharedProgressBar.cp
05722c 331 CSharedProgressBar.h
5b4372 332 PGPDemo.c
0b228f 333 PGPDemo.h
60aa9f 334 PGPOpenAdminPrefs.cp
1c9cb8 335 PGPOpenPrefs.cp
f07976 336 PGPOpenPrefs.h
c36a69 337 PGPSharedEncryptDecrypt.cp
162568 338 PGPSharedEncryptDecrypt.h
b9c3c1 339 PGPSharedParse.cp
12f82f 340 PGPSharedParse.h
bd1538 341 PassphraseCache.cp
93c0d1 342 PassphraseCache.h
3f9f2e 343 SignatureStatusMessage.cp
1670bd 344 SignatureStatusMessage.h
72d086 345 WordWrap.cp
e60d3e 346 WordWrap.h
b1bdb9 347 pgpMacCustomContextAlloc.c
7c575b 348 pgpMacCustomContextAlloc.h
a4ad67 349 pgpNavServices.cp
9ae344 350 pgpNavServices.h
4dcca9 D clients/pgp/mac/Shared/CModalDialogGrafPortView/
2b95e3 351 CModalDialogGrafPortView.cp
6e59bc 352 CModalDialogGrafPortView.h
f3abc7 D clients/pgp/mac/Shared/CPGPEncoderDecoders/
1c680f 353 CPGPEncoderDecoder.cp
e7cce8 354 CPGPEncoderDecoder.h
9a8b62 D clients/pgp/mac/Shared/CPanel/
7bcd12 355 CPanel.cp
de80b7 356 CPanel.h
ea6711 D clients/pgp/mac/Shared/CPassphraseCache/
eaee60 357 CPassphraseCache.cp
5b2973 358 CPassphraseCache.h
4abf51 D clients/pgp/mac/Shared/CPatchers/
ec9999 359 CCloseWindowPatcher.cp
3cddf9 360 CCloseWindowPatcher.h
0a284d 361 CDrawMenuBarPatcher.cp
89d20a 362 CDrawMenuBarPatcher.h
c0786d 363 CEndUpdatePatcher.cp
5acc14 364 CEndUpdatePatcher.h
8df2f7 365 CEventAvailPatcher.cp
77fa90 366 CEventAvailPatcher.h
bcb17e 367 CGetKeysPatcher.cp
8b2bdd 368 CGetKeysPatcher.h
3f10a8 369 CGetResourcePatcher.cp
0b8452 370 CGetResourcePatcher.h
3860af 371 CInsertMenuPatcher.cp
331b66 372 CInsertMenuPatcher.h
1ac6ed 373 CMenuSelectPatcher.cp
547cf3 374 CMenuSelectPatcher.h
2e6f96 375 CPatcher.cp
dcc624 376 CPatcher.h
92183e 377 CPopUpMenuSelectPatcher.cp
25fd09 378 CPopUpMenuSelectPatcher.h
afb5bb 379 CPutScrapPatcher.cp
8fa8cf 380 CPutScrapPatcher.h
fbf588 381 CSetMenuBarPatcher.cp
73bde7 382 CSetMenuBarPatcher.h
c08064 383 CSetWTitlePatcher.cp
7f321b 384 CSetWTitlePatcher.h
b0571c 385 CSizeWindowPatcher.cp
cf1b30 386 CSizeWindowPatcher.h
e5b654 387 CWaitNextEventDispatcher.cp
d2f1b6 388 CWaitNextEventDispatcher.h
539f0e 389 CWaitNextEventPatcher.cp
2522aa 390 CWaitNextEventPatcher.h
1ff6a8 D clients/pgp/mac/Shared/CRestorePortColorsAttachment/
--d204 0008fbef8cb40120002 Page 7 of MANIFEST
b52103 391 CRestorePortColorsAttachment.cp
13f9fa 392 CRestorePortColorsAttachment.h
97c332 D clients/pgp/mac/Shared/CSaveRestoreScrap/
f3b161 393 CSaveRestoreScrap.cp
11b42b 394 CSaveRestoreScrap.h
b3c0fd D clients/pgp/mac/Shared/CShareholderList/
7c7c4d 395 CShareholderList.cp
e1d344 396 CShareholderList.h
3f8042 D clients/pgp/mac/Shared/CString/
e7c18c 397 CString.cp
f008bc 398 CString.h
b92fa9 D clients/pgp/mac/Shared/CTempFile/
f09efc 399 CTempFile.cp
7a27d7 400 CTempFile.h
c9c083 D clients/pgp/mac/Shared/CWindowRefArray/
b90cfb 401 CWindowRefArray.cp
a1ca58 402 CWindowRefArray.h
67d6ff D clients/pgp/mac/Shared/MES Resource/
f245cc D clients/pgp/mac/Shared/MES Resource/CFM-MESP code/
4d9b8f 403 CFM-MESP.cp
026451 404 CFM68K-MESPPrefix.h
7543dd 405 CFMPPC-MESPPrefix.h
68bde5 D clients/pgp/mac/Shared/MES Resource/INIT code/
64d9a9 406 init.c
e770fc 407 init.h
1bb49f D clients/pgp/mac/Shared/MES Resource/Jimi code/
2538a7 408 Jimi.cp
17192b 409 Jimi.h
5a46fd D clients/pgp/mac/Shared/MES Resource/Shared Memory/
cc211c 410 sharedmem.c
f3bb5e 411 sharedmem.h
6b4e19 D clients/pgp/mac/Shared/MES Resource/pub/
727a1d 412 plugin.h
6a682e D clients/pgp/mac/Shared/ShowInitIcon/
2e5704 413 ShowInitIcon.c
e5c381 414 ShowInitIcon.h
ee6bef D clients/pgp/mac/Shared/StackBasedClasses/
58ba28 415 StSaveCurResFile.cp
3aba84 416 StSaveCurResFile.h
d100bd 417 StSaveHeapZone.h
7d38ef 418 StSuspendAESpecialHandler.cp
293c25 419 StSuspendAESpecialHandler.h
ee7bd0 D clients/pgp/mac/Shared/UPGPException/
067d6e 420 UPGPException.cp
635906 421 UPGPException.h
cb938a D clients/pgp/mac/PGPkeys/
f755f1 D clients/pgp/mac/PGPkeys/src/
43a59a 422 BackupHandler.cp
515038 423 BackupHandler.h
b81eda 424 CDragSource.h
1b9823 425 CFingerprintField.cp
7901d5 426 CFingerprintField.h
6c4c9b 427 CGroupsWindow.cp
8ad209 428 CGroupsWindow.h
499318 429 CKeyDragTask.cp
29f908 430 CKeyDragTask.h
5d6b9c 431 CKeyGenWizardDialog.cp
a90f5b 432 CKeyGenWizardDialog.h
b85a8b 433 CKeyInfoWindow.cp
71966b 434 CKeyInfoWindow.h
bdb82d 435 CKeyTable.cp
52752c 436 CKeyTable.h
a62303 437 CKeyTableLabels.cp
4cef2b 438 CKeyTableLabels.h
e6a4cc 439 CKeyView.cp
49ae8c 440 CKeyView.h
771412 441 CKeyWindow.cp
bd5355 442 CKeyWindow.h
c74a7e 443 CPGPKeys.cp
cb1af4 444 CPGPKeys.h
4289f1 445 CPhotoUserID.cp
8f9933 446 CPhotoUserID.h
--e621 00068e590c740120002 Page 8 of MANIFEST
fc8cbc 447 CRecessedCaption.cp
b5fb02 448 CRecessedCaption.h
04d408 449 CSearchPanel.cp
3cc51d 450 CSearchPanel.h
94b070 451 CSearchWindow.cp
0deaa2 452 CSearchWindow.h
82f47a 453 CSendKeyShares.cp
bc3570 454 CSendKeyShares.h
dfc27a 455 CSignDialog.cp
4cf4da 456 CSignDialog.h
20fd14 457 CSplitWindow.cp
fc0370 458 CSplitWindow.h
d66dfd 459 GetPassphrase.cp
440993 460 GetPassphrase.h
d345f2 461 LMenuBar.h
8f5b22 462 PGPKeysMenuBar.cp
2144ff 463 PGPKeysMenuBar.h
edadb5 464 PGPkeysCommonHeaders.h
26e307 465 PGPkeysDebugHeaders.prefix
fae921 466 PGPkeysHeaders.prefix
40b6a5 467 ResourceConstants.h
44d78b 468 UDragAndDropUtils.cp
ff9fe3 469 UDragAndDropUtils.h
524883 D clients/pgp/mac/install/
55f307 D clients/pgp/mac/install/InstallAdmin Resource/
87d3ee D clients/pgp/mac/install/InstallAdmin Resource/code/
44f1cc 470 InstallAdmin.cp
bad795 471 InstallAdmin.prefix
5f96b1 D libs/
118acf D libs/network/
42f770 D libs/network/ldaplib/
f48558 D libs/network/ldaplib/macintosh/
8792af 472 Make-template
559236 473 Makefile
2565a2 474 README
e5c74d 475 getopt.c
297aa5 476 kerberos-macos.c
3ba446 477 macos-ip.c
ea92a8 478 macos.h
1c6b7e 479 strings.c
ee1d78 D libs/network/ldaplib/macintosh/pgp/
6f23d8 480 PGPCommonldapLib.prefix
4a0ac8 481 PGPDebugldapLib.prefix
8e5802 482 PGPldapLib.prefix
38d6a5 483 PGPldapLibEntry.c
0e9546 484 PGPldapLibEntryMappings.h
c1960c 485 PGPldapLibEntryUnmappings.h
cd9e6e 486 PGPldapLibMain.c
ddca11 487 PGPldapLibUtils.c
d7e8ef 488 PGPldapLibUtils.h
164284 D libs/network/ldaplib/macintosh/tcp/
dde25d 489 AddressXlation.h
5b91c0 490 GetMyIPAddr.h
9209fb 491 MacTCPCommonTypes.h
26c25e 492 MiscIPPB.h
8bf64f 493 TCPPB.h
c4741d 494 UDPPB.h
c02ae9 495 dnr.c
18a78b 496 tcp.c
a4c29c 497 tcp.h
0906ed D libs/pfl/
741864 D libs/pfl/mac/
7e4557 498 pgpPFLConfig.h
10cd2f D libs/pfl/mac/debug/
28974e 499 MacDebug.cp
8c16ba 500 MacDebug.h
86326f 501 MacDebugErrStrings.h
0c9e50 502 MacDebugLeaks.cp
b749a2 503 MacDebugLeaks.h
fa7b18 504 MacDebugPatches.cp
9338d1 505 MacDebugPatches.h
68ebeb 506 MacDebugTraps.cp
--03b4 00043c388a040120002 Page 9 of MANIFEST
0f45b4 507 MacDebugTraps.h
5c1d95 508 MacDebugTrapsOff.h
0f7269 509 PowerPlantLeaks.h
ab4540 D libs/pfl/mac/powerplant/
7164dd 510 CGAProgressDialog.cp
667235 511 CGAProgressDialog.h
a5ec23 512 CPGPModalGrafPortView.cp
c38074 513 CPGPModalGrafPortView.h
54be9c 514 CPGPStDialogHandler.cp
8e2c30 515 CPGPStDialogHandler.h
4bc32f 516 CPassphraseEdit.cp
44ecbc 517 CPassphraseEdit.h
96704a 518 CPicture.cp
98e891 519 CPicture.h
171302 520 CProgressBar.cp
3cb353 521 CProgressBar.h
2e8838 522 CVersionCaption.cp
2db765 523 CVersionCaption.h
3284c0 524 CWarningAlert.cp
9a0818 525 CWarningAlert.h
a7d53a D libs/pfl/mac/powerplant/bugfixes/
972e39 526 CPGPAMEditTextImp.cp
41d2fd 527 CPGPAMEditTextImp.h
893ac9 528 CPGPAMTabsControlImp.cp
352e8f 529 CPGPAMTabsControlImp.h
6f66e7 530 CPGPActiveScroller.cp
ba7883 531 CPGPActiveScroller.h
2a824b 532 CPGPGAPopupButtonImp.cp
9f4fe2 533 CPGPGAPopupButtonImp.h
1a19d9 534 CPGPHierarchyTable.cp
fba13f 535 CPGPHierarchyTable.h
0c71ec 536 CPGPNodeArrayTree.cp
bcea70 537 CPGPNodeArrayTree.h
a48cec D libs/pfl/mac/utilities/
d6158c 538 CLog.cp
8950c7 539 CLog.h
ecef2a 540 CMacFSWiper.cp
7bd207 541 CMacFSWiper.h
291226 542 CMacQueue.h
0f13d1 543 MacBTree.cp
01681f 544 MacBTree.h
a00e2d 545 MacBasics.h
5dba71 546 MacCursors.c
fa16f3 547 MacCursors.h
eb0079 548 MacDesktop.c
8cacfb 549 MacDesktop.h
451843 550 MacDialogs.c
14b4c1 551 MacDialogs.h
4b3edf 552 MacDriverUtils.cp
d48ff9 553 MacDriverUtils.h
9980fb 554 MacEnvirons.c
4eea43 555 MacEnvirons.h
a421f0 556 MacErrors.c
afbbb2 557 MacErrors.h
979b42 558 MacEvents.c
0e0100 559 MacEvents.h
86d43b 560 MacFiles.cp
5c9b20 561 MacFiles.h
791c5f 562 MacIcons.cp
00830e 563 MacIcons.h
e2e66b 564 MacInternet.c
5a8cd3 565 MacInternet.h
724533 566 MacInterrupts.c
00597c 567 MacInterrupts.h
5bfdad 568 MacMenus.c
7a1ca8 569 MacMenus.h
9217ed 570 MacNew.cp
c53989 571 MacNew.h
501808 572 MacNumerics.c
c672b0 573 MacNumerics.h
41443b 574 MacProcesses.c
43b09c 575 MacProcesses.h
--1b8c 000a99a3ea140120002 Page 10 of MANIFEST
9eb04f 576 MacQuickdraw.c
b444e8 577 MacQuickdraw.h
f79ab2 578 MacResources.c
466e15 579 MacResources.h
4951dd 580 MacSecureMemory.h
60671e 581 MacStrings.c
8e5bc8 582 MacStrings.h
f7a14b 583 MacTraps.c
f95da0 584 MacTraps.h
0ab185 585 SetupA5.h
1103b1 586 UInt64.cp
a1c4dd 587 UInt64.h
ee3d14 588 WarningAlert.cp
83df8c 589 WarningAlert.h
fd72f4 590 WarningAlertTypes.h
b09087 591 pgpMacMemory.c
da443e 592 pgpMacMemory.h
37260c 593 pgpMacVolumeWiping.c
2d67e8 594 pgpMacVolumeWiping.h
b1393a 595 pgpMacWiping.h
d5f26f 596 strlen.c
def57b D libs/pfl/mac/wrappers/
474c5c 597 CFSCloser.h
20fe4e 598 CFree.h
dd026e 599 CFreePGPFileSpec.h
5e4ecf 600 CFreePGPIO.h
435165 601 CPGPFree.h
70aa31 602 CResFileCloser.h
4cfbef 603 CSaveResFile.h
b51aa0 604 CSaveResLoad.h
75f43e 605 CWrappers.h
ebec61 D libs/pgpcdk/
b6d8e5 D libs/pgpcdk/mac/
57d6e8 D libs/pgpcdk/mac/lib/
405950 606 PGPsdk.prj.exp
cccaa8 D libs/pgpcdk/mac/lib/src/
c8a355 607 PGPLibCommonHeaders.h
008449 608 PGPLibDebugHeaders.prefix
c38dce 609 PGPLibHeaders.prefix
1a7c2d 610 PGPLibHeadersDEBUG.prefix
f98b3e 611 PGPsdkHeaders.pch++
ee6fbe 612 PGPsdkWin32.prefix
436144 613 main.c
0edce7 D libs/pgpcdk/mac/networklib/
a3a7f9 614 PGPsdkNetworkLib.prj.exp
2b410d D libs/pgpcdk/mac/pub/
48356e 615 pgpConfig.h
13dfa9 D libs/pgpcdk/mac/ui/
6f3303 616 PGPsdkUILib.prj.exp
cd1863 D libs/pgpcdk/mac/ui/source/
327742 617 CPGPCheckboxOptionView.cp
0be8c0 618 CPGPCheckboxOptionView.h
c8dfa7 619 CPGPConfPassphraseGrafPort.cp
8e1f62 620 CPGPConfPassphraseGrafPort.h
adfac4 621 CPGPDecrPassphraseGrafPort.cp
0c5c1f 622 CPGPDecrPassphraseGrafPort.h
482500 623 CPGPKeyPassphraseGrafPort.cp
b9f8c2 624 CPGPKeyPassphraseGrafPort.h
c5f1aa 625 CPGPKeyServerGrafPort.cp
fa7208 626 CPGPKeyServerGrafPort.h
6a5e68 627 CPGPOptionView.cp
6aef23 628 CPGPOptionView.h
20cbde 629 CPGPOptionsGrafPort.cp
93175f 630 CPGPOptionsGrafPort.h
f573ab 631 CPGPOptionsListView.cp
11f9c3 632 CPGPOptionsListView.h
8514c1 633 CPGPPassphraseGrafPortView.cp
761385 634 CPGPPassphraseGrafPortView.h
998d83 635 CPGPPopupMenuOptionView.cp
c0a155 636 CPGPPopupMenuOptionView.h
0b252a 637 CPGPRandomDataGrafPort.cp
a90590 638 CPGPRandomDataGrafPort.h
--0d32 00126ce5a9b40120002 Page 11 of MANIFEST
f8d309 639 CPGPRecipientGrafPort.cp
45b4a5 640 CPGPRecipientGrafPort.h
5f94a6 641 CPGPRecipientTable.cp
a385a5 642 CPGPRecipientTable.h
1bd5e1 643 CPGPSearchKeyServerGrafPort.cp
2200a3 644 CPGPSearchKeyServerGrafPort.h
03a24a 645 CPGPSendToKeyServerGrafPort.cp
83d90e 646 CPGPSendToKeyServerGrafPort.h
bc5dbb 647 CPGPSignPassphraseGrafPort.cp
1c2cb8 648 CPGPSignPassphraseGrafPort.h
66d4a6 649 CPGPUIGrafPortView.cp
f3bf0c 650 CPGPUIGrafPortView.h
a41372 651 CPrivateKeysPopup.cp
0120aa 652 CPrivateKeysPopup.h
59fbe5 653 CUserIDTable.cp
23426e 654 CUserIDTable.h
e50390 655 PGPCollectRandomDataDialog.cp
67e9c0 656 PGPKeyServerDialogs.cp
2a2a27 657 PGPOptionsDialog.cp
3d98fb 658 PGPPassphraseDialog.cp
d63f67 659 PGPRecipientDialog.cp
193b04 660 PGPsdkUILibCommon.h
c8c16d 661 PGPsdkUILibDebugHeader.prefix
d36099 662 PGPsdkUILibDialogs.cp
3136e5 663 PGPsdkUILibDialogs.h
d7103c 664 PGPsdkUILibHeader.prefix
551874 665 PGPsdkUILibInitAndTerm.cp
c66fa4 666 PGPsdkUILibUtils.cp
33cdbf 667 PGPsdkUILibUtils.h
065f1a D libs/pgpcdk/priv/
086a79 D libs/pgpcdk/priv/networklib/
5789a4 D libs/pgpcdk/priv/networklib/pgpsockets/
9eb19b D libs/pgpcdk/priv/networklib/pgpsockets/mac/
703c68 D libs/pgpcdk/priv/networklib/pgpsockets/mac/src/
e978db 668 CInternetSocket.cp
00e3e2 669 CInternetSocket.h
f40d92 670 CInternetUtilities.cp
454b6b 671 CInternetUtilities.h
a8dfab 672 CMacTCPInternetSocket.cp
829b66 673 CMacTCPInternetSocket.h
1163ee 674 CMacTCPInternetUtilities.cp
64292e 675 CMacTCPInternetUtilities.h
78d35d 676 CMacTCPTCPSocket.cp
44f796 677 CMacTCPTCPSocket.h
38d928 678 CMacTCPUDPSocket.cp
57d23c 679 CMacTCPUDPSocket.h
d12c1c 680 COTInternetSocket.cp
bae7df 681 COTInternetSocket.h
8e6352 682 COTInternetUtilities.cp
4c6864 683 COTInternetUtilities.h
8a6db3 684 COTTCPSocket.cp
b7edfe 685 COTTCPSocket.h
661359 686 COTUDPSocket.cp
8ae853 687 COTUDPSocket.h
dcd552 688 CSocket.cp
477ac9 689 CSocket.h
492f25 690 PGPSockets.cp
cdbd2b D·
c17432 691 binaries1.zip
14bd2b D·
26e26e 692 binaries2.zip
--d3f6 0005417017140120003 Page 1 of machashes.asc
2a0fa4 -----BEGIN PGP SIGNED MESSAGE-----
851b04 Hash: SHA1
6caf5a
6f1090 6363fcc1268ca044018ab97da273f5c203e263dc ·MANIFEST
f2c9f4 87f6cc450d496c99ea5c44084544a9942077543b ·clients/disk/mac/projects/CipherProc.¶
cd68c6 prj.bin
62a5e0 280154a7241ace8183e4fc6d849dfbf474f3c01a ·clients/disk/mac/projects/GestaltProc¶
5c442a .prj.bin
fec356 3e1a9a473b1347f0ecda5070fc678f1808e2aee7 ·clients/disk/mac/projects/PGPdiskApp.¶
1e68c6 prj.bin
64644c ea5d3c67684a4f0924d21ea90017ff6e7ff63328 ·clients/disk/mac/projects/PGPdiskDRVR¶
f7442a .prj.bin
3c1e65 e81119e58b5fe54d4b6cc0b1d7608b23522b27c9 ·clients/disk/mac/projects/PatchesProc¶
38442a .prj.bin
e34ba6 9395629cea18d66cf08293dd054b937de050c515 ·clients/disk/mac/resources/PGPDisk.pp¶
545a61 ob.bin
a8d592 5321ac4f93fdbf611afc99ba7346cda723ee4b24 ·clients/disk/mac/resources/PGPDisk.rs¶
b4c5cc rc.bin
f7518b 9e353fd9186bdb309871091ac5eb10c1cc2f2146 ·clients/disk/mac/resources/PGPDiskDeb¶
8877da ug.ppob.bin
a3c32a 5a1cadd3a0f6a26c57e5e3441935b52b4df1ec0f ·clients/disk/mac/source/App/CDiskTest¶
511963 sTable.cp
b7166e f761f14782d7bb55773bc3448453a821fe46b7ad ·clients/disk/mac/source/App/CDiskTest¶
1b92f6 sTable.h
605e54 1e747c5386dcfc090c2c933c1196f12aaf439d6f ·clients/disk/mac/source/App/CDiskTest¶
4be786 sWindow.cp
7f7dc4 44ff52766e8b99e71a7db51f71ce7c328c48a803 ·clients/disk/mac/source/App/CDiskTest¶
dab09f sWindow.h
5edd9a 0cefe2938ba9497b73c22cf692dd68ea641b225a ·clients/disk/mac/source/App/CEditDisk¶
92774a TestDialog.cp
a8bb23 ad293dfbe690560832748011166982a39fd0d48c ·clients/disk/mac/source/App/CEditDisk¶
4ed54b TestDialog.h
4a978d d4b4310bf0e62749e50aff2561831ddaa44ee074 ·clients/disk/mac/source/App/CGetPassp¶
5669e1 hraseDialog.cp
068ebe 8398939d298210127ec6db2bbe80b732b3eb2c3b ·clients/disk/mac/source/App/CGetPassp¶
f48fb5 hraseDialog.h
e1db2d 4f3c89ff78101c302b3137908e9a0829e3bebff3 ·clients/disk/mac/source/App/CMainWind¶
7d0bb1 ow.cp
cea792 ba4cc65c611c5f397fc637e2ffd3d75f59ea18f5 ·clients/disk/mac/source/App/CMainWind¶
2cd1c4 ow.h
0cba1e d8f8f51efbff59fda81e63307215514e329cce50 ·clients/disk/mac/source/App/CNewDiskW¶
ea1e6c izardDialog.cp
0f7746 64f8d446aa8209bd95344527b2c5af73366bb8f8 ·clients/disk/mac/source/App/CNewDiskW¶
1da581 izardDialog.h
0274bc 36be47933beb466ffaecde407d1ae35a1a57272c ·clients/disk/mac/source/App/CPGPDiskA¶
0c4956 pplication.cp
ed56db fad6ae8bc6a36ae7ea38c5c52019156831320551 ·clients/disk/mac/source/App/CPGPDiskA¶
1a3284 pplication.h
7c9653 3e7342cfdbd3163f3c2fe6d107cc1f0b1f101160 ·clients/disk/mac/source/App/CPGPDiskD¶
63db3d ialog.cp
c8924a 5a98c7d2c68d271acdfd720456fc9bd995982a09 ·clients/disk/mac/source/App/CPGPDiskD¶
6ae072 ialog.h
a72bfd 3d5da60140130fcfda4003af78d4c8a2cd204cf2 ·clients/disk/mac/source/App/CPGPDiskW¶
6d0023 indow.cp
7d126f 4bc163ec8184f02fce3c691b610b61feaed5da20 ·clients/disk/mac/source/App/CPGPDiskW¶
1d1b7f indow.h
f3e982 f3dbc1912f11c24b38db06af7aa3e0a248c5c878 ·clients/disk/mac/source/App/CPassphra¶
baf077 seDialog.cp
bf327e f54ad4d978a05b03c2dfba60cd0c8b7fc2227d0c ·clients/disk/mac/source/App/CPassphra¶
35f8f8 seDialog.h
ece0d9 b28d927cb52bd8023b7e0620b428936bd05079f5 ·clients/disk/mac/source/App/CPreferen¶
93be56 cesDialog.cp
7b9c6d fbe0232f7d5ce285413132579caf25c60b273479 ·clients/disk/mac/source/App/CPreferen¶
afbd74 cesDialog.h
63002d fb1de58557687889f146eb46b171651b6712999b ·clients/disk/mac/source/App/CSetPassp¶
4f69e1 hraseDialog.cp
d5fe5e 428caa0cfc0bfdb7c95e17d2d9fb7a17691897de ·clients/disk/mac/source/App/CSetPassp¶
7b8fb5 hraseDialog.h
1184b0 15aa19457900fde24a3c743ff11877723fe790bd ·clients/disk/mac/source/App/PGPDiskAp¶
b7e9bc p.prefix
5162a9 50b5fb70a697cee342df2268d9265a0fc68afa25 ·clients/disk/mac/source/App/PGPDiskAp¶
547151 pDebug.prefix
--06ad 00084f5ccce40120003 Page 2 of machashes.asc
876e0f efd250b058e89412d03feca9a5e2bb822f20afff ·clients/disk/mac/source/App/PGPDiskBe¶
3d4efb ta.c
1abf23 76ebb1c27382b8f75da5f45d31dd40f6fa8eccbf ·clients/disk/mac/source/App/PGPDiskBe¶
c9aa53 ta.h
e956ff e8930df846c089bce2b836c424d3535b1900b557 ·clients/disk/mac/source/App/PGPDiskFi¶
0dd277 le.c
8d7adb 8c427868e00228d12645d8d4508d57ad1c94889e ·clients/disk/mac/source/App/PGPDiskFi¶
e436df le.h
810084 3197e2bed730e96700a45d9ed0bd415bb9a7d2e8 ·clients/disk/mac/source/App/PGPDiskPr¶
0ed46a eferences.c
ce8b3c 6a1e8dd5d5d489d63bcf35b50eb3f91762a7ad41 ·clients/disk/mac/source/App/PGPDiskPr¶
b130c2 eferences.h
0126af 25618dd5b00e160317eb01eec3b0f60722f81701 ·clients/disk/mac/source/App/PGPdiskAp¶
2bdd45 pShared.prefix
446753 f3c7f76f4f2a449e7b421b7d642b67832bcf7087 ·clients/disk/mac/source/CipherProc/Ci¶
d31e70 pherContext.h
140aed e58475a31af6985eec1ebdc75dc4e2910856787d ·clients/disk/mac/source/CipherProc/Ci¶
01f568 pherProc.h
de7726 c807f898577cbbb547109e4c338083d5a310042a ·clients/disk/mac/source/CipherProc/Ci¶
f93007 pherProc.prefix
dc2c2f 7d65eaa277e1473619c4132dd184be71d133fb31 ·clients/disk/mac/source/CipherProc/Ci¶
c96922 pherProcDebug.prefix
3f53c2 19af0dc15b3d07b90e5c343f818acc51eba4dfd0 ·clients/disk/mac/source/CipherProc/Ci¶
4a475e pherProcGlue.c
27e0f9 406a27693e8cd6ea3cbf49b8d0de79ebccec308b ·clients/disk/mac/source/CipherProc/Ci¶
a2a3f6 pherProcGlue.h
bfe5a4 10688425b2d4d28d177e501a926f14493723a054 ·clients/disk/mac/source/CipherProc/Ci¶
8698b3 pherProcMain.c
565610 2262772002fb92a39a92509e4ccbcddf9039b16d ·clients/disk/mac/source/Driver/CBlind¶
5c2d34 WriteQueue.cp
35a377 56f4f94028d1d18f3095422fed4e08a3bd83978b ·clients/disk/mac/source/Driver/CBlind¶
a36e93 WriteQueue.h
a8460a 6673c46c3d64ca2b097ae4a19127d1630fb38eae ·clients/disk/mac/source/Driver/CChang¶
ba500f eModDateQueue.cp
155664 713f7e42679dbcd64edce9e4694c3c9d1628bf90 ·clients/disk/mac/source/Driver/CChang¶
fda20d eModDateQueue.h
57fb61 c22365370464cc4a4877fd4c36331bd769c2812b ·clients/disk/mac/source/Driver/CClose¶
57ddf3 Queue.cp
d7f791 5058654c74c8febe8207595f6559ef2ca7840096 ·clients/disk/mac/source/Driver/CClose¶
5a1e14 Queue.h
507544 5869292df153949f69c25233261efee03e396da9 ·clients/disk/mac/source/Driver/CDrive¶
1f94a6 .cp
db40c0 51558e7fdb20ec703e8f87b8ba5c3da26840aa29 ·clients/disk/mac/source/Driver/CDrive¶
6717ef .h
918489 83632261ae504991fca65e5fa3fd8d04aee86658 ·clients/disk/mac/source/Driver/CDrive¶
96de16 List.cp
bde665 2aa00a70734c4a4b18b7c2837cdb6aa3f83a2d74 ·clients/disk/mac/source/Driver/CDrive¶
07e327 List.h
acec1f ed7475da7e4d2119d79541610d9ffb1692fdb451 ·clients/disk/mac/source/Driver/CDrive¶
8a97dd r.cp
ffff9f fc775856703f7d8feaed46d31857151428e70cde ·clients/disk/mac/source/Driver/CDrive¶
7774dc r.h
3d3a10 6807b2229b085a087695ddfdcc52338ab4d082bc ·clients/disk/mac/source/Driver/CPBQue¶
adc2c7 ue.cp
8de606 d383b3951bbae45f358b2d09b3e3b7d13ce00f03 ·clients/disk/mac/source/Driver/CPBQue¶
05d3fb ue.h
63b43a f9dbe51676c67840b41597ecb32d84acef65a12c ·clients/disk/mac/source/Driver/PGPDis¶
575e9e kDRVR.prefix
bc271c c8a367e0efe49a8ad2a33fbddbbbabd62a08180d ·clients/disk/mac/source/Driver/PGPDis¶
e631f5 kDRVRDebug.prefix
4f7cd4 99bc814221fce87543a404fab87b0ce889cb593c ·clients/disk/mac/source/Driver/PGPDis¶
164b2c kDRVRHeader.c
aa2bf5 4abc1c230b3dc602c6d67002ca682582f4c5eb93 ·clients/disk/mac/source/Driver/PGPDis¶
e58ba6 kDRVRMain.h
aa7742 8683bb8475a37a58e2e9d2f12e8f64e27f0ee3a3 ·clients/disk/mac/source/Encryption/PG¶
2df2a2 PDiskCastCFB.cp
6ce756 46e7a6ede3198e133f0e26da31229a081f0e2a8c ·clients/disk/mac/source/Encryption/PG¶
523dda PDiskCastCFB.h
020746 f0c3cb83dab19a197c48ff92ac4c79455f870a5f ·clients/disk/mac/source/Encryption/SH¶
2d64bc A.cpp
c2fbd3 beec1ea248da249462f23657cae4c2dd68785b1d ·clients/disk/mac/source/Encryption/SH¶
841de3 A.h
--22a9 000e7cb1f8340120003 Page 3 of machashes.asc
55460a cc5d367537e6b6979b68f8ec153fa33f33803ca8 ·clients/disk/mac/source/Encryption/ca¶
e6cd82 st5.cpp
1e7162 9d254745e7c040b291aaa8ec4ae51687a864ff6a ·clients/disk/mac/source/Encryption/ca¶
bbc4d5 st5.h
c22573 410737a210fda50b8914f2791000d2755bc13a3e ·clients/disk/mac/source/Encryption/ca¶
ba88f5 st5box.c
0a858b a58a4449fb82f8332a85b14c0abde84ddc2aee21 ·clients/disk/mac/source/Encryption/ra¶
c992fc ndpool.c
5c13d7 e762c76e3a8a6dce7850d22247f9da9f762708ef ·clients/disk/mac/source/Encryption/ra¶
c27654 ndpool.h
598271 d62c9200d644248544d4eca7166e2739953e0a97 ·clients/disk/mac/source/GestaltProc/G¶
1d0e13 estaltProc.c
e171af ce3d58122c9d5fd999f7ff1d67fbfe27b337b21b ·clients/disk/mac/source/GestaltProc/G¶
bda3a4 estaltProc.prefix
f67754 ee06433b89ddcc20edd8af2c6faaa79cdebc6f18 ·clients/disk/mac/source/GestaltProc/G¶
1c5528 estaltProcDebug.prefix
c99c11 770558d29c3669f67f42807d9aaa5d4df19da24b ·clients/disk/mac/source/MyCustomCRSta¶
08e144 rtup.Lib.bin
a3109c 7f270566d454f7c08a246c4730817ba3374d60c2 ·clients/disk/mac/source/PatchesProc/P¶
82a0ab atchesProc.c
259dc3 c01f386297ec1a0c6b99a1b84d65141e760f191a ·clients/disk/mac/source/PatchesProc/P¶
e9ab7f atchesProc.prefix
7f9e41 2a897d81b470cacd03e8b34a667b6add2534762a ·clients/disk/mac/source/PatchesProc/P¶
ec082b atchesProcDebug.prefix
b876db f9cf08d96ed56decc9fa1cefba54a470f10c748e ·clients/disk/mac/source/Shared/AddDri¶
a5efd7 veStruct.h
f37d04 50ac08bc755aef11e5ca75755cee62cb4b461183 ·clients/disk/mac/source/Shared/CTuner¶
4f94a6 .cp
736387 bf32938c81160c60a689be10bcf88c4ccb5348e3 ·clients/disk/mac/source/Shared/CTuner¶
c317ef .h
0e34d1 a3ec5fc0768124eca58ee58b35bc7d61211fc1d0 ·clients/disk/mac/source/Shared/Driver¶
701c52 API.cp
a8eed0 85d6a56bf0f14010be7f7cfa5c3b7c0db5c2e001 ·clients/disk/mac/source/Shared/Driver¶
108ba3 API.h
ee680f 63ed34f2045d009b1510acb85735a6157e54ddfd ·clients/disk/mac/source/Shared/Driver¶
fa7904 Prefs.h
ed4018 36aa3928880f3338fbf209fda44a60b3bd2a3fb8 ·clients/disk/mac/source/Shared/PGPDis¶
314e1e k.h
fb6586 b1345dfde1f719e6dd8950515f523c7e26bdad18 ·clients/disk/mac/source/Shared/PGPDis¶
2cc60d kEncryptDecrypt.c
bcda75 6a02ccf513cf1983f16cd7b16c7cb84dc1edd7d5 ·clients/disk/mac/source/Shared/PGPDis¶
9d22a5 kEncryptDecrypt.h
8624c4 fa6930be9ed381fb1e0f6122bdec020f888d6536 ·clients/disk/mac/source/Shared/PGPDis¶
0b8ab9 kFileFormat.h
5da329 745d0274e61fd10298d99f92a4d6b965ccbec3cb ·clients/disk/mac/source/Shared/PGPDis¶
e88d96 kGestalt.h
d9c9ab ccf0f0a539c87fe6559e4c751998adaea5a7c4ae ·clients/disk/mac/source/Shared/PGPDis¶
148136 kGlobals.c
28ae79 c8d2c1d7ec277c93826f2e1b1b27ec24e1cc4924 ·clients/disk/mac/source/Shared/PGPDis¶
48659e kGlobals.h
2663a7 87858105d0a64c6392d487ab02b8ca68d0cec000 ·clients/disk/mac/source/Shared/PGPDis¶
da693d kPatches.h
939d8b 26fae99aea9f857166cfd3ed55c554d12a78fe80 ·clients/disk/mac/source/Shared/PGPDis¶
f71002 kResources.h
25a704 1b90ed27f77d8fd586c8b98dc094357b32e11f43 ·clients/disk/mac/source/Shared/PGPDis¶
a5f6ad kShared.prefix
0434e1 f12ea1f12dc7351bb356f9b17cf8b411a1b3eae6 ·clients/disk/mac/source/Shared/PGPDis¶
df97cb kUtils.c
170250 68b2d6bf1f077450fb5ec1ed592a60e28ab050e1 ·clients/disk/mac/source/Shared/PGPDis¶
5d7363 kUtils.h
213e02 62dc2a69edfa890a40579d6b237ebdf7b30f530f ·clients/disk/mac/source/Shared/PGPMou¶
13c37a ntUtils.cp
3ad662 e291dee8e723bc53497a09ca3f17121a99bbf96a ·clients/disk/mac/source/Shared/PGPMou¶
cf66ea ntUtils.h
ea85e8 054459a0da3af2e12b3f1cbe798e8640c7329833 ·clients/disk/mac/source/Shared/SleepA¶
62dd57 lert.cp
33169a dd3c9af06818626e34000ee60dd157d2bb4707e5 ·clients/disk/mac/source/Shared/SleepA¶
55ba14 lert.h
a441c4 ba66d53c528c7e4d044c79c476ae9f70bca24d97 ·clients/disk/mac/source/Shared/TunerS¶
6feaef truct.h
9c9ebb 4eb1ab354e873ac3b52dd88cbe362d70451b882c ·clients/disk/mac/source/Shared/usuals¶
e717ef .h
--3b16 000b5aa0a4f40120003 Page 4 of machashes.asc
9273d9 b6a871a54d00fcfb97e80f3404fc4858ccdfaba9 ·clients/disk/mac/source/Test/CInterru¶
5be015 ptLevelDRVRTester.cp
df7dd9 64dc8f6405b058ea9d62cbca51ea8590a4477e53 ·clients/disk/mac/source/Test/CInterru¶
351be8 ptLevelDRVRTester.h
a6c609 a49236c985636c9e691907460e7b59507b170bdb ·clients/disk/mac/source/Test/CInterru¶
4bd438 ptLevelFileTester.cp
ada9fc 10236ae10612bcfd9250a6c0fd7e9be00e4b5d74 ·clients/disk/mac/source/Test/CInterru¶
259d8d ptLevelFileTester.h
61374a a8436ee1ce3eaecbc8f695f588c163f72e1c1140 ·clients/disk/mac/source/Test/CInterru¶
04bb7a ptLevelTestMgr.cp
1264f0 33df9cff31331f43d84e01a3173e2d7f9f61e4df ·clients/disk/mac/source/Test/CInterru¶
adb921 ptLevelTestMgr.h
ff4a1b d8b9192bb1d080099bd234fd5c9bd58b5b1d405f ·clients/disk/mac/source/Test/CInterru¶
2e6f77 ptLevelTester.cp
593682 46124bf19bf2ffcaf4391565733bc61cde524711 ·clients/disk/mac/source/Test/CInterru¶
9229d3 ptLevelTester.h
5c7018 91149d713a0e2f3bd64ac99dc5c4ed66d93f2a5a ·clients/disk/mac/source/Test/CSyncFil¶
bc0cc4 eTester.cp
56651f 70a941883bff893d9acd8b95cd0fd19e34a3b078 ·clients/disk/mac/source/Test/CSyncFil¶
c29cb3 eTester.h
8e2d52 35134d5f084a4b38e7dfe4a4881d3056dc728286 ·clients/disk/mac/source/Test/CTestDri¶
83ceba ve.cp
5c70d4 c52af4ca654c0e29f8a22c495c9adf3ce731532f ·clients/disk/mac/source/Test/CTestDri¶
e4ce37 ve.h
25c768 088ef68150af3e88e6cc167a5622b0f7b4ed7cd3 ·clients/disk/mac/source/Test/TestDriv¶
7e6430 e.prefix
5e5ac8 36e9d1343db66caaa7ec1fd8a685ad8e8398fdbb ·clients/disk/mac/source/Test/TestDriv¶
a57151 eMain.cp
855272 0a61dbd34a0d5ea06a5549c1dd1db2aa1b98f39f ·clients/pgp/mac/Build60.prj.bin
093461 39ed162a9da76f4b75ec4e4d719c73bb5129592a ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
3d9f1a aAPISupport/copycat.c
547d7f 6a1aba14029ae038fbef6fa48d614280fdc13956 ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
7b7bb2 aAPISupport/copycat.h
cc5742 e141cbe2b54ea136570409ac6a9ded3a7add835c ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
ce85f2 aAPISupport/ctencode.c
6ad03e 6fe2216ddb9a7a3daa307b12616b5b7b0aea2cbd ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
58615a aAPISupport/ctencode.h
f187ab fe5457c31285dcaaf9b7dafcda5d274a68967f4d ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
87d557 aAPISupport/emsapi-component.c
681da2 8c66bc11681c5667a7c13868b5f22ffd8148e64c ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
8a6e72 aAPISupport/emsapi-mac.h
bf9f3f cab3457338b943dbdbfeffe2426bce0355666651 ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
ea0aaf aAPISupport/emsdrive.c
c5e0a4 81aa8f2675f5e5c04294c88c0cfe66eabf373b11 ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
8286bb aAPISupport/emsdrive.rsrc.bin
89dc28 2b7ce5916d34b1cbda795de9778d76ae2de84039 ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
39891e aAPISupport/lglio.c
8d09c1 6e57f768b90d317c96336a2afcb9e1a167f1da61 ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
dc6db6 aAPISupport/lglio.h
85873c 091607908b080529c0f7ff5d9cb020e7516f5ca4 ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
ec8282 aAPISupport/mimetype.c
72eba3 4da30e9109bbceb5a45a5819f5e75f921cd2bca8 ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
29662a aAPISupport/mimetype.h
e80e6e cb2be61d0ca7a14d1282d09694d7347e62d81a42 ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
619612 aAPISupport/rfc1847.c
af2d49 43835f3bc175c7e73c644e08692ff0caeb9d6472 ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
c172ba aAPISupport/rfc1847.h
06590b 00cf24301c7ee456f8240a1052e6d9b9fa427fba ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
fdb8ab aAPISupport/rfc822.c
131e2c c8c7bcd416dbf734c66d05d98592b9d620ccd5e7 ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
015c03 aAPISupport/rfc822.h
8a7c90 69db89a15ae345e8eeb52eb6752e1dfbda89d5dc ·clients/pgp/mac/PGPEudoraPlugIn/Eudor¶
2b699f aAPISupport/usertrans.h_sample
9c0645 0a40324051bb137236450895d94c880671152541 ·clients/pgp/mac/PGPEudoraPlugIn/PGPPl¶
d079c2 ugin.rsrc.bin
0421a7 6128b998fde2e371a83cc05a07de2ddcc920a6d4 ·clients/pgp/mac/PGPEudoraPlugIn/PGPpl¶
749fdb ugin.prj.bin
e571c1 fa0716fd5116d9f38f35d875c9d0fbde27d62fd9 ·clients/pgp/mac/PGPEudoraPlugIn/PGPpl¶
bc2295 uginStub.prj.bin
79f0a0 46c4d1f82ccbfffa1458a1d0ce2cdef2791a18ce ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
420035 e/CDecryptTranslator.cp
b5f3f6 cde1dad539cf9a2976f22f8bb6423fd730894efd ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
--1b1e 00027a52bac40120003 Page 5 of machashes.asc
2a0d7f e/CDecryptTranslator.h
ad1bf3 908c32d15f5d978b82d794d75328397656b5e484 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
409464 e/CEncryptTranslator.cp
b951a1 4434d05ae4b2656bfc9d62d5bfc8a8b49050e7d3 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
22d5ef e/CEncryptTranslator.h
4c9489 28e5109ffed038419b8ec33c87ecb756d6ff4e0b ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
67962b e/CManualTranslator.cp
0dbc4d f452a28ae71343d37fb2afb40b0a486117117cc2 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
fd8acd e/CManualTranslator.h
8aa3cf 5c4941bfd48dfe5ad70c336a9459af2fca7509c7 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
bd8654 e/CSignTranslator.cp
d6f640 d3345209be5035361f16ab892e6198e25e695c9f ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
6f74dd e/CSignTranslator.h
409fe1 3ce5ec4bf6beb0e1fc171d701aa2ba612f281e20 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
81fd73 e/CTranslator.cp
f7e82a 6af19db83a6ad49cf52d29d654ab7ee3befcfb21 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
b49425 e/CTranslator.h
533b5c 0b03a4136b211e251b79f53cc0926392ad07cde7 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
4ebf53 e/CVerifyTranslator.cp
124397 19a1258d6194d0d5ea088413545f6813a1422ff2 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
30b065 e/CVerifyTranslator.h
53575b de127766e950cf25a1e3f600c76534026d0e9883 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
f7f5aa e/EudoraTypes.h
cb7f61 cf7131e6bd39940615e75cc80c5ffe3748ff3bfd ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
d7f4f9 e/MyMIMEUtils.c
296e61 579dc9ba3f6b9491e8336f69bd9751678a94a0d9 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
291051 e/MyMIMEUtils.h
eb6cd1 42a5ffa062e172f96513cb9c4a2c69da903968cc ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
3aa9cc e/PGPPlug.cp
dac157 01d96caa314d8944af37f463d17f9437289bc203 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
679e13 e/PGPPlug.h
9341e0 0a4512400d5e1780414fc491900146d67d0b76f0 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
5112bc e/PGPPlugGlue.cp
b087ac ed811e699e85a362fe1b5363cf41c5c94fbccd47 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
ee6e38 e/PGPPlugTypes.h
d46452 6fa097f7a3c390ea4b3fbfd68f3367c37baa5812 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
55bfdd e/PGPPlugin.inc
b8ddd9 0b6d3db1f1e59a23d1e1af48433c2e803e1b331d ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
5f7327 e/PGPPlugin.prefix
9e6c6f 393edd5fc7a976a21ebcb31fcc6ac3cb9e8b4e4b ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
f43ac9 e/PGPPluginDebug.prefix
4890a7 5c6f666cb2728a0c7485a5c02ed3273c0778a4f6 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
ee90e4 e/PGPPluginGlobals.h
32793e 9630f43da09fed59046ae223f256b900e3ebbec3 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
856646 e/PGPPluginMain.cp
5693a4 39db746816c36217e01e4558acc8d27f2298085f ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
4642f2 e/PlugInLibUtils.cp
ccf2c3 9035fe444847b2c0f47b63172ce8bfffc04021bd ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
37ce3f e/PlugInLibUtils.h
4c507c 1561d8ae286d4fb3bcb7e7b1efd61fb46b2553e2 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
e22635 e/PluginProcInfo.h
86f6f1 da86785f88f1deef6417e74326adcb12106f77a2 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
bc03c7 e/PluginResources.h
0438f9 7f2a1cd8608a8254b816e4963eedc73452528b3b ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
f99dc4 e/TranslatorFactory.cp
13701c d8da31d62f330e429fa37db1d50c9a1fecd6db48 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
893d76 e/TranslatorFactory.h
c87182 3f254e901aa05278e134b112417d72f8e5905b63 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
738446 e/TranslatorIDs.h
32d7e2 ed7ca1dcd1f478fa0bba64a1310366b54b77a1b9 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
caeba7 e/TranslatorPrefs.c
0808b3 e4bf864dc19654074e2b229d9fe4b04e644ac995 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
5d0f0f e/TranslatorPrefs.h
340a05 fc0838bc4ec449478b2bc0af4a1ace32a4e92c86 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
2ef5c3 e/TranslatorStrings.h
549001 358ec7a0c81e312c9c30d78556aa315ffcc36843 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
5c848d e/TranslatorUtils.cp
c3c59b 0a16b386a5ad91b6c3ff76b9faa737214adc4d34 ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
0ebdff e/TranslatorUtils.h
9746e3 39752e075671c3d10eda2ca03478ed00d699859d ·clients/pgp/mac/PGPEudoraPlugIn/Sourc¶
0d25bd e/usertrans.h
270b52 ec5dbae205356b3e78e3a0f9a608a423ebecb9fd ·clients/pgp/mac/PGPadmin/PGPadmin.prj¶
--dd3d 000d77e0e2240120003 Page 6 of machashes.asc
b368f7 .bin
bf88ee 8cb70e9d95de781f7623a3510c87d601765b275a ·clients/pgp/mac/PGPadmin/code/CAdminD¶
8edb3d ialog.cp
345018 06344828422afd42c3bebd7550fdd365b7257bd7 ·clients/pgp/mac/PGPadmin/code/CAdminD¶
82e072 ialog.h
62bd2c 3805abfcad8a7d810650078efc3d17eedd0e5f7f ·clients/pgp/mac/PGPadmin/code/CKeyTab¶
aaa504 le.cp
0fbe13 4462c0db82d2f4663bfe4e8b87771a36bad76054 ·clients/pgp/mac/PGPadmin/code/CKeyTab¶
4e36df le.h
24bdba 3dc1e01cc940bb9708b64fb9e8d1cd29d7a25bd7 ·clients/pgp/mac/PGPadmin/code/PGPadmi¶
0254ad n.cp
d5c352 b9c766f22190b2960ebe67c2ccc18023f19a997d ·clients/pgp/mac/PGPadmin/code/PGPadmi¶
182049 n.h
0387e5 c95b67b0837bc24f18a861b5fd7acf6987f65402 ·clients/pgp/mac/PGPadmin/code/PGPadmi¶
5741b0 n.pch++
a48a4a 43cf83b1f556263d231790a6a8bbd0d18c477032 ·clients/pgp/mac/PGPadmin/code/PGPadmi¶
a5cdfd n.prefix
454ee1 67cdba7372f1d66017068a798babed59823f77a3 ·clients/pgp/mac/PGPadmin/code/PGPadmi¶
d744cf nDebug.pch++
7fe437 8d6740f783507ab266d19b1ad200797ad55b403e ·clients/pgp/mac/PGPadmin/code/PGPadmi¶
4f4688 nDebug.prefix
7c78fd 9e1dceb12b0d4858a207732e2c3145f25c217fed ·clients/pgp/mac/PGPadmin/code/PGPadmi¶
876e5a nGlobals.h
a237d3 adc7dcc7e61db5baf763448efbe1632a3e370099 ·clients/pgp/mac/PGPadmin/resources/PG¶
88d081 Padmin.ppob.bin
c63f0b a6d7185a68ffc892e2fe594db874f93e73b32105 ·clients/pgp/mac/PGPadmin/resources/PG¶
af5e06 Padmin.rsrc.bin
9e37cc 91e5a57bff3c687e7134f3bb12f4d669ea0da1fb ·clients/pgp/mac/PGPclientLib/PGPclien¶
00e571 tLib.prj.bin
39f285 ea4afbb57018a2a5e2707b0a31471a07b6957739 ·clients/pgp/mac/PGPclientLib/PGPclien¶
566298 tLib.prj.exp
7008a7 f3ff77ac3cd959a1cb5da808853ff6c20f0e4ccf ·clients/pgp/mac/PGPclientLib/pub/pgpC¶
b0ff4b lientLib.h
e853f8 4d1354932abcb8c371ae481c7a497d3168c69583 ·clients/pgp/mac/PGPclientLib/source/C¶
b6d88f ConfirmRemoteKeyDialog.cp
79b9bc a723e3ef8b4b02e97df0977a1d4fa1593f995aa0 ·clients/pgp/mac/PGPclientLib/source/C¶
2e4a41 ConfirmRemoteKeyDialog.h
c81bf5 d777f6fa89b3697bced59e897b7d9838d56e1233 ·clients/pgp/mac/PGPclientLib/source/C¶
576096 FYEODialog.cp
1723fc d14540844f0139e1a32ae9c6557bcf729381cc52 ·clients/pgp/mac/PGPclientLib/source/C¶
1eb02c FYEODialog.h
de56cc cb9aa9e8e86bf23f4eed5c73a34e2bfa2574dda1 ·clients/pgp/mac/PGPclientLib/source/C¶
47c391 KeyserverTable.cp
77729d c20d44cb2c972d59eba2a4f9d7162a0e77895d1d ·clients/pgp/mac/PGPclientLib/source/C¶
e88dea KeyserverTable.h
379dfa c1f4140bc787babd758581f51847b714908265d9 ·clients/pgp/mac/PGPclientLib/source/C¶
b18046 PGPPreferencesGrafPortView.cp
f17bcf 9eb6298cc1b8eed0d54379302a6dca93243de3b6 ·clients/pgp/mac/PGPclientLib/source/C¶
b056bb PGPPreferencesGrafPortView.h
f26cf4 e19ddca7a502f469f80c50088bd552617bc97a0f ·clients/pgp/mac/PGPclientLib/source/C¶
e9d9cb ReconstitutionDialog.cp
d2fc32 ece2074b2dbd706b27c51aa652e087729cf02baf ·clients/pgp/mac/PGPclientLib/source/C¶
370650 ReconstitutionDialog.h
d561e4 d5952a17c9905fa24b4ccb70369a9797776131ee ·clients/pgp/mac/PGPclientLib/source/C¶
3570ed ServerStatusDialog.cp
fe63c3 61822a91b498cd7c8a6edfa0e47650b4efe4d016 ·clients/pgp/mac/PGPclientLib/source/C¶
354a3c ServerStatusDialog.h
cadc0e 67c663ccee36a5425f40b9b85b240509ac69d5a5 ·clients/pgp/mac/PGPclientLib/source/C¶
7fb31e WhiteList.cp
85527e 7f9d9151ebfe91d0d849938ae1b73f50596295ca ·clients/pgp/mac/PGPclientLib/source/C¶
b59da9 WhiteList.h
3fe85c 8f43cdb0bc021e69094b288afbda6cba80b98c1d ·clients/pgp/mac/PGPclientLib/source/P¶
907ac2 GPKeyServerDialogs.cp
7f47fb 403ec9813cd0a49fd65a285d01872a87931075ce ·clients/pgp/mac/PGPclientLib/source/P¶
e506f4 GPSelectKeysDialog.cp
d973cd ee9ebb4829bdd2c61f57289c867d4069ab03657d ·clients/pgp/mac/PGPclientLib/source/P¶
a4fc19 GPSelectKeysDialog.h
7ab98c 7d7862d6706e9ebe84337b087dc717c43c82b214 ·clients/pgp/mac/PGPclientLib/source/P¶
7b34cb GPSplash.r
78cf96 6b782dffaa6472d36db954b496228e8c788ed631 ·clients/pgp/mac/PGPclientLib/source/P¶
f01a06 GPSplashBS.rsrc.bin
d7aa88 92db8c81a9f4bd822812634120fa237cebf0fbd9 ·clients/pgp/mac/PGPclientLib/source/P¶
--58d5 0001c38aa8f40120003 Page 7 of machashes.asc
107dbe GPSplashCredits.rsrc.bin
4d32b5 9a6a69de48227f6a4521442c7b4c16b9c6eca0f3 ·clients/pgp/mac/PGPclientLib/source/P¶
be953f GPSplashFree.rsrc.bin
faf65f ab24aa2e3f7d9320983b3fa0adb189d4be6c08c8 ·clients/pgp/mac/PGPclientLib/source/P¶
baf3d6 GPSplashPP.rsrc.bin
eb9651 40062957805db3ac0aaf9582fb50e3e5497fe71f ·clients/pgp/mac/PGPclientLib/source/P¶
a24964 GPclientLib.ppob.bin
5acfd2 9cfdbcd1b280afa67867cd31af73e10cb2562dcc ·clients/pgp/mac/PGPclientLib/source/P¶
c6bfda GPclientLib.prefix
d32193 c1f1b3206fd3909f9e471d6e213c44252894f047 ·clients/pgp/mac/PGPclientLib/source/P¶
72c7e3 GPclientLib.rsrc.bin
6ca0f7 bfd77b975e39c0422bdbf0415aa1c00b6ac8c446 ·clients/pgp/mac/PGPclientLib/source/P¶
c9a88f GPclientLibCommon.h
acde74 6370f829e463915cc0fc25d1963fe9a6f905791e ·clients/pgp/mac/PGPclientLib/source/P¶
8e75f6 GPclientLibDebug.prefix
725fce 769da40da147988f4f3ccc9259d6321e70b3895d ·clients/pgp/mac/PGPclientLib/source/P¶
301867 GPclientLibDialogs.cp
b0ea43 f04632ec6af69cbb79bff39a413e79d58fc56330 ·clients/pgp/mac/PGPclientLib/source/P¶
5b9ee7 GPclientLibDialogs.h
850cae 2fbdc5e316a890439a5b3501c82296bd2fddd433 ·clients/pgp/mac/PGPclientLib/source/P¶
89bfc3 GPclientLibHeaders.prefix
60c22c f63845685932962d9045f80c6ff124086e1b04e3 ·clients/pgp/mac/PGPclientLib/source/P¶
e0fd7f GPclientLibInitAndTerm.cp
435b0a 363501a376c2591eddb90f7e96a5a919f6c017ef ·clients/pgp/mac/PGPclientLib/source/P¶
5313d2 GPclientLibUtils.cp
3e8e51 f8e3d5eac9f2a3b9c7bec864a86ac1049c42aacd ·clients/pgp/mac/PGPclientLib/source/P¶
33735c GPclientLibUtils.h
880aaf de029e653d3f6dd35a9faa44c078293786e4b30d ·clients/pgp/mac/PGPcontextmenu/PGPcon¶
d4ad33 textmenuPPC.prj.bin
d1e1f5 bac68971e901dbddc1142107cf4ca656fb64ad57 ·clients/pgp/mac/PGPcontextmenu/code/P¶
04f83a GPCMPlugin.cp
2515b5 ecb5f309663f24c69b8b4e1faf577443d96c49e0 ·clients/pgp/mac/PGPcontextmenu/code/P¶
81f570 GPCMPlugin.h
db3495 ccfc112f8f70f58710b7cd0268b3435b78fe1e61 ·clients/pgp/mac/PGPcontextmenu/code/P¶
c93f7a GPCMPlugin.rsrc.bin
dba599 517a8acdf0265b1c6daff16d1aed9f509f104f2f ·clients/pgp/mac/PGPcontextmenu/code/P¶
12cfe8 GPcontextmenu.pch++
5e65c4 0f7795130e9bc9a5dcb0e1544d031e82ac61b33a ·clients/pgp/mac/PGPcontextmenu/code/P¶
1e13be GPcontextmenu.prefix
2971ac ca80299bbd3e0b6d175a657fbf952318cb48a52e ·clients/pgp/mac/PGPcontextmenu/code/P¶
95e8a1 GPcontextmenuDebug.pch++
e76c9c ab61a848460067f5b63c729f34e03828163779d4 ·clients/pgp/mac/PGPcontextmenu/code/P¶
72cc5c GPcontextmenuDebug.prefix
1f0d12 63c5ed1f4496c243ebd33176502da95828d1c129 ·clients/pgp/mac/PGPcontextmenu/code/c¶
162dfb frg.r
285e02 55b83c75e01f2b814b8024ad76ad0853fb6dccd7 ·clients/pgp/mac/PGPemailer/Interface/¶
bb3a7b CPGPemailerView.cp
617999 f2fccba8fea19594771ac6bada1da2ca0484bd4e ·clients/pgp/mac/PGPemailer/Interface/¶
0b98f4 CPGPemailerView.h
06e1f0 5dd1ebffbbb3d1e4bfd19c4fb4e6d80157958289 ·clients/pgp/mac/PGPemailer/PGPemailer¶
16442a .prj.bin
7646d0 d211afffbbee8ea651c4dc36364e0060e40a94f3 ·clients/pgp/mac/PGPemailer/Patchers/C¶
669473 emailerCloseWindowPatch.cp
adc097 5faa35933b32a1f6e92692a136edcde610abc999 ·clients/pgp/mac/PGPemailer/Patchers/C¶
52c2ef emailerCloseWindowPatch.h
33dcd9 48ba9f1fa53f4925ae47e07145f71bbf5dcc6a8b ·clients/pgp/mac/PGPemailer/Patchers/C¶
2686c6 emailerEndUpdatePatch.cp
62c1f2 50baa9f7a2503ab05152a6b0bfc0f9cd24bb01ae ·clients/pgp/mac/PGPemailer/Patchers/C¶
72e6dd emailerEndUpdatePatch.h
488b3a 5f8264488b829c7e4c44707f6a3c012b3a946ac3 ·clients/pgp/mac/PGPemailer/Patchers/C¶
d1c3ef emailerSetWTitlePatch.cp
e2af50 da3dc9322a6b488dac8765d1735288c9930e9f05 ·clients/pgp/mac/PGPemailer/Patchers/C¶
c0f3ea emailerSetWTitlePatch.h
f14728 01c40beaf745c38b2fb36cdc56776272410b8d46 ·clients/pgp/mac/PGPemailer/Patchers/C¶
3cada0 emailerSizeWindowPatch.cp
fc6769 0779c6142e9aec1c80dbe9c3e887e889945c24a0 ·clients/pgp/mac/PGPemailer/Patchers/C¶
f1d257 emailerSizeWindowPatch.h
109932 987406f6c9af7fcf5b7ac539d17e8d21f35c1709 ·clients/pgp/mac/PGPemailer/Patchers/C¶
d85cc6 emailerWaitNextEventPatch.cp
a15236 574513548ccf304c11e0fbdcd299c85b45b0e4c9 ·clients/pgp/mac/PGPemailer/Patchers/C¶
590bc1 emailerWaitNextEventPatch.h
1cda42 aeba2dae09c85b90f5be3893b07f068e6ed7773d ·clients/pgp/mac/PGPemailer/Plug/CPGPe¶
--0fa8 000e715b39a40120003 Page 8 of machashes.asc
f23a0d mailer.cp
46f2e4 02adfe59b6147ff031439f74173a566d78027364 ·clients/pgp/mac/PGPemailer/Plug/CPGPe¶
aeeef4 mailer.h
8c097b c8e01ca0bb70ffdc4c2e75be1964eac9e4a909ee ·clients/pgp/mac/PGPemailer/Plug/PGPEm¶
400526 ailerGlobals.h
3cf9e9 e2f446c9108ea6cea74646aac4450d9f9485c615 ·clients/pgp/mac/PGPemailer/Plug/PGPem¶
b459a2 ailer.pch++
8ffa37 b3e8555c4bcb632c27321a25a94d8e46c710206f ·clients/pgp/mac/PGPemailer/Plug/PGPem¶
dffe76 ailer.prefix
1b3c9c f464424e369e53e2c67922107867fa29a624d5d1 ·clients/pgp/mac/PGPemailer/Plug/PGPem¶
44c07e ailerDebug.pch++
b3770d 14a3536a2f50722cb47659d9c7926b092e4c2720 ·clients/pgp/mac/PGPemailer/Plug/PGPem¶
9ee20e ailerDebug.prefix
10c9fc a2450608c5a3ace23987b8a55208f62b93a9f7c0 ·clients/pgp/mac/PGPemailer/Resources/¶
cd8264 PGPemailer.ppob.bin
ad5212 edab9079dca69ed8062a09cacda8cf1deeeaf175 ·clients/pgp/mac/PGPemailer/Resources/¶
2f0ce3 PGPemailer.rsrc.bin
5b1554 a24abea91a033365fc1b51191187976ca7fa64db ·clients/pgp/mac/PGPkeys/PGPkeys.prj.b¶
65c94c in
cca0af 48efb921cc6a1cd7e52601647eae8587aac45e8a ·clients/pgp/mac/PGPkeys/src/BackupHan¶
edd42b dler.cp
94f83a 696376aab10c0a30dc56db1c3c432d374d138307 ·clients/pgp/mac/PGPkeys/src/BackupHan¶
728e8d dler.h
d550e8 169a76620f472e237be1f0db06067988417afe53 ·clients/pgp/mac/PGPkeys/src/CDragSour¶
c55c23 ce.h
b6d358 fdc3025dcfc0c4b323fef5a74d379965027deef8 ·clients/pgp/mac/PGPkeys/src/CFingerpr¶
07cd23 intField.cp
a3e8ea 010b0a8494c5c860c846910f5f09b1dd1158ae63 ·clients/pgp/mac/PGPkeys/src/CFingerpr¶
cd4f04 intField.h
6cb72c 5f0768522d4cd9504d0e8b6bc7f96df0504c1816 ·clients/pgp/mac/PGPkeys/src/CGroupsWi¶
6b234e ndow.cp
c25249 4eef43584390990d7730f83f25579d478c805cef ·clients/pgp/mac/PGPkeys/src/CGroupsWi¶
7a647d ndow.h
592bcb 363986738c3e1afa524ed23997f2360c61687061 ·clients/pgp/mac/PGPkeys/src/CKeyDragT¶
6a80d5 ask.cp
ff68d3 83e2e1c6f733467d139c9e1b3440cdce389ebd2e ·clients/pgp/mac/PGPkeys/src/CKeyDragT¶
e1c5bb ask.h
403018 8eb5b5f3ba72a4ec7ff90a3dcde56ce98829f8ae ·clients/pgp/mac/PGPkeys/src/CKeyGenWi¶
16d15f zardDialog.cp
d5d92e 74fcb14b2fdb5d51956889cfe70a78b1955bea48 ·clients/pgp/mac/PGPkeys/src/CKeyGenWi¶
e1d2d8 zardDialog.h
e7430b 15661c009dc38334689be491a8cca19814de3edb ·clients/pgp/mac/PGPkeys/src/CKeyInfoW¶
610023 indow.cp
e3504b fb15cae12a57b780271580d1f64610fe7f88f21e ·clients/pgp/mac/PGPkeys/src/CKeyInfoW¶
681b7f indow.h
e638af e8b69dfd6de3cec2e1b6aab0ae69c51b8b0c3e27 ·clients/pgp/mac/PGPkeys/src/CKeyTable¶
3194a6 .cp
453049 f4737e46b9b409eb44ba3bb7eaa5524d18715a29 ·clients/pgp/mac/PGPkeys/src/CKeyTable¶
1117ef .h
bf50c7 3eabd2a03a306e4cac68bae64e3124138f348d5f ·clients/pgp/mac/PGPkeys/src/CKeyTable¶
8172fd Labels.cp
461f75 73e6acd135ceede81197a435d856a14e04bbdb6f ·clients/pgp/mac/PGPkeys/src/CKeyTable¶
364a1e Labels.h
89eb70 55ece4a290d61e2921ac30fdf5b9fe25ebb9420b ·clients/pgp/mac/PGPkeys/src/CKeyView.¶
98b5b7 cp
f89500 d7c498716326eeda34c90d13411795d9912aa760 ·clients/pgp/mac/PGPkeys/src/CKeyView.h
8c6e8e 8e07ab23791265d0e7ccc7850909bf73a9d255e2 ·clients/pgp/mac/PGPkeys/src/CKeyWindo¶
34b189 w.cp
836ffd e8498a18a760df66ab8b895e67b1fb713fba7265 ·clients/pgp/mac/PGPkeys/src/CKeyWindo¶
341a8b w.h
558d88 8e045d2768f420c776cbf96bac8f11356692f0f3 ·clients/pgp/mac/PGPkeys/src/CPGPKeys.¶
d1b5b7 cp
51a6a5 4913101e90d890eed05acf3440481e4891f47aa1 ·clients/pgp/mac/PGPkeys/src/CPGPKeys.h
5c0ba3 9a71d912b77e1bbfb1411d2ad117ee42c3888db4 ·clients/pgp/mac/PGPkeys/src/CPhotoUse¶
6679c1 rID.cp
821ef6 0c81aed1e69cea6e5c0e539d3d34a4577a261282 ·clients/pgp/mac/PGPkeys/src/CPhotoUse¶
c72ea5 rID.h
8231c8 1f768d84977efecb2d191bbf9c9ce2f00d949510 ·clients/pgp/mac/PGPkeys/src/CRecessed¶
fd991f Caption.cp
e55218 7b4cc7ac5707264929e6111676fc8f9604f75d9c ·clients/pgp/mac/PGPkeys/src/CRecessed¶
44c632 Caption.h
e78ad3 cda180262b3c9a12623f1e19155a3c7c6e328afa ·clients/pgp/mac/PGPkeys/src/CSearchPa¶
--9530 0004148ffc340120003 Page 9 of machashes.asc
1af3b7 nel.cp
9335ec c2808e41d7604c8622b3d42783685eebe81b325e ·clients/pgp/mac/PGPkeys/src/CSearchPa¶
b820cb nel.h
d0cb75 8572d32c9cec31a96ddf3175e336b402d400c1c1 ·clients/pgp/mac/PGPkeys/src/CSearchWi¶
6e234e ndow.cp
9a2f0b 9350418ea0132d2495966b2a684819992ca0f0ff ·clients/pgp/mac/PGPkeys/src/CSearchWi¶
1b647d ndow.h
41ee83 df845c356ff0ed1c7e198557d3ab65bde03dbcc7 ·clients/pgp/mac/PGPkeys/src/CSendKeyS¶
0e1576 hares.cp
2c62da 9d9eef1526f0d48445303bf2a1a9ef161266ae01 ·clients/pgp/mac/PGPkeys/src/CSendKeyS¶
52e73a hares.h
c83465 d2e05b8cda0407ad145cbbcb8275f09a8078ae74 ·clients/pgp/mac/PGPkeys/src/CSignDial¶
77bff1 og.cp
d9c394 417436f41b16fa9b5ec20c48da517c6ebf1e1863 ·clients/pgp/mac/PGPkeys/src/CSignDial¶
af1265 og.h
80a243 596a2efdf52d4bb340ef32561375329d86391518 ·clients/pgp/mac/PGPkeys/src/CSplitWin¶
86c042 dow.cp
d85013 026ca7564817e92053934a0a115acbcdcb83885d ·clients/pgp/mac/PGPkeys/src/CSplitWin¶
7046d9 dow.h
493b5c a7c4bd08a80a83980eb378fe8eea5eeb8c1b2b48 ·clients/pgp/mac/PGPkeys/src/GetPassph¶
9d627b rase.cp
7b5f02 d3ff8bbabc50ed523879d915089d5422e55134c1 ·clients/pgp/mac/PGPkeys/src/GetPassph¶
c84d0e rase.h
257616 f86e54cfc872b5f5c407f60913924cc580f9e0d4 ·clients/pgp/mac/PGPkeys/src/LMenuBar.h
39cd15 dc1dfb58e82d9ea4443116093f094fe83ef6be24 ·clients/pgp/mac/PGPkeys/src/PGPKeys.p¶
3bd218 pob.bin
2f26c7 ad5710370293205dd15997f9324ad652d8287501 ·clients/pgp/mac/PGPkeys/src/PGPKeys.r¶
73c765 src.bin
0ee336 28a964b3260aad083e25054eb3b331cec92a897f ·clients/pgp/mac/PGPkeys/src/PGPKeysMe¶
db316d nuBar.cp
8e0af8 07801543bfaeba138654c443878a5fc0bf3a006f ·clients/pgp/mac/PGPkeys/src/PGPKeysMe¶
a7d64f nuBar.h
861a6e a7c6039747883bf825dc3ca37d9de1429277a7a6 ·clients/pgp/mac/PGPkeys/src/PGPkeysCo¶
6ac4e1 mmonHeaders.h
061329 cf7a9c79fa71c0aefd9a866138395fbba12daf0f ·clients/pgp/mac/PGPkeys/src/PGPkeysDe¶
85bc90 bugHeaders.prefix
6e5f38 adbf820cfabcfd9716d12380770e0a24cf09f33b ·clients/pgp/mac/PGPkeys/src/PGPkeysHe¶
d9c6d8 aders.prefix
9cb83b a36a01c09399dda084fd4b7bba6b1103c7e65300 ·clients/pgp/mac/PGPkeys/src/ResourceC¶
373c5f onstants.h
b88d94 fa8b8e8a750f820e07ce41603d30f9660e170743 ·clients/pgp/mac/PGPkeys/src/UDragAndD¶
824dc4 ropUtils.cp
1cd7e2 67eda4117f3b1f69520825d4abbf31cb723e7edb ·clients/pgp/mac/PGPkeys/src/UDragAndD¶
3180c0 ropUtils.h
c3898f 4008f0e4e015da22c6c1d9350c829dadace999c9 ·clients/pgp/mac/PGPmenu/PGPmenu MESP/¶
1831bf PGPmenuMESP code/PGPmenuMESP.cp
65a363 309dda0b0e40fb0a66252a55aed80172518f2a30 ·clients/pgp/mac/PGPmenu/PGPmenu MESP/¶
09b194 PGPmenuMESP code/PGPmenuMESP68KPrefix.h
adfc9e 5e31944f36595ba1c58556f4f026263666a9358a ·clients/pgp/mac/PGPmenu/PGPmenu MESP/¶
633085 PGPmenuMESP code/PGPmenuMESPPPCPrefix.h
667d10 71fda5fe1f3a57f3b889b4b988e7cea0b5de62a3 ·clients/pgp/mac/PGPmenu/PGPmenu MESP/¶
f8c35d PGPmenuMESP.prj.bin
acd334 9f31c4182d4a4b6fec8d4b7f30fac34251c9e11f ·clients/pgp/mac/PGPmenu/PGPmenu.prj.b¶
edc94c in
e049f3 99d2f9dc31f085d8010ca8cbad0c38378c6d1bcb ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
3be95e uDrawMenuBarPatch.cp
0b9990 af70bf759a6e435c292a605e1014f0f11f9e381d ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
391871 uDrawMenuBarPatch.h
010e76 dd8181ce8b134ae004d64331beeb92ad7d252698 ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
e67ee5 uEventAvailPatch.cp
580711 0b224591ea509523f079b1a262d405f6e1207b62 ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
d532d2 uEventAvailPatch.h
c0933f ecc4dd68bcdaf863e2a734578cf9639a37b96d83 ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
3bba20 uGetKeysPatch.cp
a5b1e5 fcd7448679c9f8ae6732ab76e5485d3dfee50fa0 ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
8eeb30 uGetKeysPatch.h
77c361 c945622afd7ec024f19bbdf4bfe83cd7e0a8c50a ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
0f548d uGetResourcePatch.cp
3eee1e d868586806486434ba9123cbb69339afc5bceff5 ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
6c0049 uGetResourcePatch.h
ae24e6 b666214afc0d936f5764c35b013a4ccb76b7e275 ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
418afc uInsertMenuPatch.cp
--c5d3 00028966bb640120003 Page 10 of machashes.asc
566128 34279b4d774853de6b960013079680ec54c51403 ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
b5bc11 uInsertMenuPatch.h
a4cd3f 083e74b0c6d1c8ebeedc706747f552201d8110e9 ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
10d625 uMenuSelectPatch.cp
18f4eb 52ca72a3a39e24bc6ba65adaf35b69e1572f282a ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
7090af uMenuSelectPatch.h
53a1b1 23ccb5072cae9ec133d3157263ebe5af5d50fcbf ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
db5e56 uPutScrapPatch.cp
049a06 b6b549c3a1ef0d86f6a0773d92d265ca5ae73407 ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
2b8be3 uPutScrapPatch.h
085304 10b4642895b6f57610f86a9ebdd6d717429ca51c ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
8ad22f uSetMenuBarPatch.cp
9f2c05 8e0cac3a02f92c7c0f3af8da35c1dd2bced97cc4 ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
b8baeb uSetMenuBarPatch.h
541b69 d3a6622e8d104c9a0c11ab5f684a9d7559fa690f ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
48aa02 uWaitNextEventPatch.cp
a7ca45 e008997a2dfcd72c418504d81d0e6b738b66102c ·clients/pgp/mac/PGPmenu/Patchers/Cmen¶
3e4820 uWaitNextEventPatch.h
d65c89 1becbbe782042de8891e72256339205185c21214 ·clients/pgp/mac/PGPmenu/Plug/CCopyPas¶
37766a teHack.cp
3dea2f 6e00cf13619896705f8a8db52ad7c60eb343deeb ·clients/pgp/mac/PGPmenu/Plug/CCopyPas¶
19fd5a teHack.h
4a1057 7c3d59fefcea9c9e5d4f9f6a524520ae44765b0f ·clients/pgp/mac/PGPmenu/Plug/CGAModal¶
7222ce CPHResultDialog.cp
06c578 3e84d7d41f4bb7c96a30727fa3ad9a46118444d1 ·clients/pgp/mac/PGPmenu/Plug/CGAModal¶
6eec6c CPHResultDialog.h
674f37 08f119ea4d94c1a4e408c92e341b564fede691eb ·clients/pgp/mac/PGPmenu/Plug/COutputD¶
4adb3d ialog.cp
fa8c37 b27f412a21f3e6094ae1ff1dd26eaaf75f1d64bb ·clients/pgp/mac/PGPmenu/Plug/COutputD¶
57e072 ialog.h
c79cdc 66bd331f82f7a8b339cc8f6b7fec4a9ab1776923 ·clients/pgp/mac/PGPmenu/Plug/CPGPmenu¶
1094a6 .cp
5f94ac f4d32f69d16ed96991256c58cc287941c674b3dc ·clients/pgp/mac/PGPmenu/Plug/CPGPmenu¶
b817ef .h
68c100 db038e561757d6185592603925ec8c502c011976 ·clients/pgp/mac/PGPmenu/Plug/PGPappme¶
f8e791 nu.prefix
a34b4d 889204b8231ae1e7d6b12695767723e31d99830b ·clients/pgp/mac/PGPmenu/Plug/PGPappme¶
c1c3f6 nuDebug.prefix
68c562 463d6e85330bfa5ec0fab831cb4f362ddc3b97d8 ·clients/pgp/mac/PGPmenu/Plug/PGPfinde¶
60b2be rmenu.prefix
6ebec6 23d6e3d1db5c6a5276cdded23a012be78c1d967b ·clients/pgp/mac/PGPmenu/Plug/PGPfinde¶
4072da rmenuDebug.prefix
10b12a 82622b24e65de2eae72300238e5e3f0ca8e09c20 ·clients/pgp/mac/PGPmenu/Plug/PGPmenu.¶
b1471e pch++
7a7167 cbe926d61c2fcab194f792c13b30f4bf1900c3b9 ·clients/pgp/mac/PGPmenu/Plug/PGPmenu.¶
2a818f prefix
9e2054 086c41ac019ee6b3ff73da170b6b3f80ce5e482a ·clients/pgp/mac/PGPmenu/Plug/PGPmenuD¶
9ef0ae ebug.pch++
4290fb e549acacd9002f1c1ec756b7a3a200925673f681 ·clients/pgp/mac/PGPmenu/Plug/PGPmenuD¶
c134b3 ebug.prefix
bc7392 62f1b0e3d5404893c517a68c58ea56188d1af952 ·clients/pgp/mac/PGPmenu/Plug/PGPmenuG¶
319d86 lobals.h
a01fb9 dbdd62b86f005d611a14e71557b18da106fa8012 ·clients/pgp/mac/PGPmenu/Resources/CPG¶
164d39 Pmenu.ppob.bin
0e6b70 ff6de693e56c5c6509681e3976320fe50a3ee621 ·clients/pgp/mac/PGPmenu/Resources/CPG¶
4dc3be Pmenu.rsrc.bin
ef2dec bd497e1d904491bd02b1b84109a1ce80d61118ac ·clients/pgp/mac/PGPtools/PGPtools.prj¶
0068f7 .bin
4ff9a7 a8c61533bd951e88302aa38ee9b6b7a39f0174d7 ·clients/pgp/mac/PGPtools/source/CDrag¶
e4c3ff TextEdit.cp
98a9be 9079227b73757c3ce7f870884d4e91f1fc33f7a0 ·clients/pgp/mac/PGPtools/source/CDrag¶
9ce3ea TextEdit.h
e5610e 6483727965a3b39f5d70d5daf924cebe8e43f226 ·clients/pgp/mac/PGPtools/source/CDrop¶
58bcc5 Receiver.cp
b0876b bf42d43e69b967f64b2faba5a7761edeee7349cf ·clients/pgp/mac/PGPtools/source/CDrop¶
633e56 Receiver.h
807f05 4a095296ec7e6ffd193c06ca352183abef41e799 ·clients/pgp/mac/PGPtools/source/CPGPt¶
56f51e ools.cp
3e32ec 4517de549e1a430b3e4b1ddd7fceeec6e009a290 ·clients/pgp/mac/PGPtools/source/CPGPt¶
83b9ad ools.h
5ef503 5079e697e4bccb3a6a1bf4dfd4de6b5a03b2af8f ·clients/pgp/mac/PGPtools/source/CPGPt¶
28d53a oolsBufferTask.cp
--0c1f 0006253ae7c40120003 Page 11 of machashes.asc
b39a55 5793454d0d9b25a8a7c5b5eb23d9ac1f0d5063b7 ·clients/pgp/mac/PGPtools/source/CPGPt¶
b1979c oolsBufferTask.h
b610f4 438498f865d1a05e327efd772ddee4a8627f354f ·clients/pgp/mac/PGPtools/source/CPGPt¶
5a16c5 oolsClipboardTask.cp
029bfe 9e4195ed2c92ba6e58b52c22db0d3982201ba019 ·clients/pgp/mac/PGPtools/source/CPGPt¶
2e4c09 oolsClipboardTask.h
4f0f2d 737186beb056206eece97a5df3ee2943f727c3c2 ·clients/pgp/mac/PGPtools/source/CPGPt¶
08a63e oolsCryptoTask.cp
41df88 13ab278de8e530450138959ab859497c6294662e ·clients/pgp/mac/PGPtools/source/CPGPt¶
b414ec oolsCryptoTask.h
4c5af8 248854bf9b8f94c1ed264b37a710f6e0eaec2031 ·clients/pgp/mac/PGPtools/source/CPGPt¶
2a4924 oolsFileTask.cp
caee04 751a512eba25b89bdfa55cc991284d45a7213e28 ·clients/pgp/mac/PGPtools/source/CPGPt¶
ef4084 oolsFileTask.h
9ef549 bffc492ebb1c9bc0efc52bb83b51e351eac0cbdc ·clients/pgp/mac/PGPtools/source/CPGPt¶
81c958 oolsMainWindow.cp
4233d4 119760d3bc5a380ce2814ab6ff09bfda96f41e28 ·clients/pgp/mac/PGPtools/source/CPGPt¶
751440 oolsMainWindow.h
a21bb6 4b143d8e8b0349fb29209b4be46c232332b25258 ·clients/pgp/mac/PGPtools/source/CPGPt¶
cba989 oolsPassphraseList.cp
a1eb75 541e53684e07c0428e937234fba51e5baef0870b ·clients/pgp/mac/PGPtools/source/CPGPt¶
63db13 oolsPassphraseList.h
1b57ac 453fc8a6f71bbd56bd7a373973b5616b243133e7 ·clients/pgp/mac/PGPtools/source/CPGPt¶
d14dbd oolsProcessingList.cp
b048fb d1783b745abc8734e7530ea803732d986f19cbda ·clients/pgp/mac/PGPtools/source/CPGPt¶
dcf9c0 oolsProcessingList.h
d9dd5f b5b99d53724afbcf1885d40b5f4bbee9cf5ac24c ·clients/pgp/mac/PGPtools/source/CPGPt¶
837357 oolsTask.cp
2304fa 92f2f2877e7f5eab726146cba29380e04adb2d3c ·clients/pgp/mac/PGPtools/source/CPGPt¶
ffe80f oolsTask.h
bb2787 68b5e10e520a42d296fd19c8ac3d69b491ef6994 ·clients/pgp/mac/PGPtools/source/CPGPt¶
363022 oolsTaskList.cp
85ac19 373f10cf99a1b34e3b057c4faa692e334db4b48f ·clients/pgp/mac/PGPtools/source/CPGPt¶
f9915e oolsTaskList.h
fd1bf0 6edeac904f011f207dd4c08cda6efb3aeebe6647 ·clients/pgp/mac/PGPtools/source/CPGPt¶
1b8b4c oolsTaskProgressDialog.cp
567bd7 7f9bc89a30c600bdae9f181deeef7ab8a0922b45 ·clients/pgp/mac/PGPtools/source/CPGPt¶
930400 oolsTaskProgressDialog.h
343507 10ddc2341064b89814348542620aab1ea231ccf1 ·clients/pgp/mac/PGPtools/source/CPGPt¶
2f6c1f oolsTextTask.cp
fe151e ac27bc4168a544d378f0d0be88ab4edd277399b4 ·clients/pgp/mac/PGPtools/source/CPGPt¶
bb59e0 oolsTextTask.h
02447d 6512ccdf8a66c0f41ac04ee53e3588a74c50c3ce ·clients/pgp/mac/PGPtools/source/CPGPt¶
c66ef2 oolsTextWindow.cp
114084 afdca6af3c445b29a17bd3c1a301041ba5dc2148 ·clients/pgp/mac/PGPtools/source/CPGPt¶
1aa4c2 oolsTextWindow.h
1c8a61 e4e7dc42bafff1dacfb6965fd07b164ca19e3ece ·clients/pgp/mac/PGPtools/source/CPGPt¶
740e22 oolsWindow.cp
4325e2 eef009afbb4fdffaa18daea6978d877af8e15dcd ·clients/pgp/mac/PGPtools/source/CPGPt¶
3f6a91 oolsWindow.h
e55f94 b5486c977d90f9075a47e9ef7b24786d51b349a9 ·clients/pgp/mac/PGPtools/source/CPGPt¶
b2d24e oolsWipeTask.cp
9828db 888a24bac2dda12693c4ec437e61669903a13804 ·clients/pgp/mac/PGPtools/source/CPGPt¶
65dbeb oolsWipeTask.h
dc01db 8209b9e24ec5e36f677c8f57591cda0fcb11b8e7 ·clients/pgp/mac/PGPtools/source/CResu¶
086ab6 ltsTable.cp
101f23 7e35352445bd761df9053741ec61ea3c483c6a56 ·clients/pgp/mac/PGPtools/source/CResu¶
04c086 ltsTable.h
6035fe 02d5da69809f5f7d5789221bd9d9cc89d45c966e ·clients/pgp/mac/PGPtools/source/CResu¶
8b66d5 ltsWindow.cp
70c672 aac203a03c4d00cd12d40d8a5fd8417fccff3ad3 ·clients/pgp/mac/PGPtools/source/CResu¶
cac34a ltsWindow.h
578bbf ccfd6a94aa33b7c4f2757711ccd289a522be3b45 ·clients/pgp/mac/PGPtools/source/CWipe¶
9c808f FreeSpaceWizardDialog.cp
4ca47d b2ddbd4def298cd421b95075a011cf21058a05e3 ·clients/pgp/mac/PGPtools/source/CWipe¶
5f9fbb FreeSpaceWizardDialog.h
a1ab00 9f1c75f89f602fd2cdf7658b07221546b25b9611 ·clients/pgp/mac/PGPtools/source/PGPto¶
9104dc ols.h
61f679 0b4c6a114349b8f7a91c48d57f79a3814a1aaf64 ·clients/pgp/mac/PGPtools/source/PGPto¶
022171 ols.ppob.bin
f10d5a 85af102eb92e8fe6ae8d6eda17d76e06300ad7ea ·clients/pgp/mac/PGPtools/source/PGPto¶
62aff6 ols.rsrc.bin
--f6ea 000c9e227ab40120003 Page 12 of machashes.asc
06b0bd 8b4b6f5bf96e8542ca14e83bc1ebfca982860dfe ·clients/pgp/mac/PGPtools/source/PGPto¶
abccad olsCommonHeaders.h
51228f a5df7dbe0e0943da5eebb68ff359aa134bde4553 ·clients/pgp/mac/PGPtools/source/PGPto¶
1f63de olsDebugHeaders.prefix
434974 4f624364121c3c1ae4c55bc0898384e588bd662c ·clients/pgp/mac/PGPtools/source/PGPto¶
901c86 olsEncryptDecrypt.cp
691d89 fadd6b7dde5b98823b9fc6540fd297d33ef2ba1a ·clients/pgp/mac/PGPtools/source/PGPto¶
315fa3 olsEncryptDecrypt.h
bbc677 841c400f1568f7712be9582d1001932d8609d915 ·clients/pgp/mac/PGPtools/source/PGPto¶
6c51eb olsHeaders.prefix
0b12dc 1f18bd65283b62587ba2aea15d023def4161fb03 ·clients/pgp/mac/PGPtools/source/PGPto¶
380dee olsPreferences.c
1a5175 d2011b1d81f76372e1be7c5c0ebb8a13af085a36 ·clients/pgp/mac/PGPtools/source/PGPto¶
16e946 olsPreferences.h
9bb04d f451b01604fe75efe649f1ba48be401a7adc6bd4 ·clients/pgp/mac/PGPtools/source/PGPto¶
c8ea6e olsResources.h
c13a0b 56e964a4256aa944a1f7e9e4f4ea6c936f300687 ·clients/pgp/mac/PGPtools/source/PGPto¶
aa5809 olsUtils.cp
e84522 ce7ecb4d3877d9478b8cb2efa874c6e319a168b0 ·clients/pgp/mac/PGPtools/source/PGPto¶
d2e485 olsUtils.h
8523a9 182afa106697bda948b7b5351ed3185058474701 ·clients/pgp/mac/Shared/ABalloon.cp
5c7827 b564947b77aaebc6cb95592a899bc7a727381977 ·clients/pgp/mac/Shared/ABalloon.h
38e153 8bd6df2f3153232201e7451e0265322f7a25fce0 ·clients/pgp/mac/Shared/BETA.c
c0bad8 a21e8ad3f73a7a04c45ed9366dab4cca49fe798c ·clients/pgp/mac/Shared/BETA.h
2a27c1 914d25a784b772f8d039afc8a2c0d76a1f2692ca ·clients/pgp/mac/Shared/CGADurationEdi¶
ea5818 tField.cp
4539dd 7bf2bad5c7adc79dcc07a3cbb989d859d50f5067 ·clients/pgp/mac/Shared/CGADurationEdi¶
fff585 tField.h
7c479e 1cbd5142856cfe381177f7b01c2ae258df33c21f ·clients/pgp/mac/Shared/CModalDialogGr¶
32c63b afPortView/CModalDialogGrafPortView.cp
b9fe50 eaf4c99b39d2855d16985e57e0a8c45632b999e4 ·clients/pgp/mac/Shared/CModalDialogGr¶
a10fbf afPortView/CModalDialogGrafPortView.h
444fbb c7b8871f50bfd9c5032b1fd502e67761e1d9e59d ·clients/pgp/mac/Shared/CPGPEncoderDec¶
d64a6f oders/CPGPEncoderDecoder.cp
132801 d44628475f1ec4faf673dec48a6fc2089171c937 ·clients/pgp/mac/Shared/CPGPEncoderDec¶
1013b7 oders/CPGPEncoderDecoder.h
40a069 80ac973b5b1d811619e015274e41ed70099a6db6 ·clients/pgp/mac/Shared/CPGPEncoderDec¶
af2390 oders/CPGPEncoderDecoder.rsrc.bin
0709cd 75a20ea63fd8718628324635ec36028e0bd8b2b8 ·clients/pgp/mac/Shared/CPanel/CPanel.¶
03b5b7 cp
ab317b 1835ce5c654c8f08c0a0aadaf66009b71f2e6420 ·clients/pgp/mac/Shared/CPanel/CPanel.h
c18ace a26b09551b53700a697e8516e9d2929196f563f5 ·clients/pgp/mac/Shared/CPassphraseCac¶
776e75 he/CPassphraseCache.cp
5fea8a e43fdfa4190dfdafe55e594b860f1e466f956806 ·clients/pgp/mac/Shared/CPassphraseCac¶
9e23c2 he/CPassphraseCache.h
a489a9 c99b053b13a2f3ad7256b61bba67bb0cf8ce3a98 ·clients/pgp/mac/Shared/CPatchers/CClo¶
4c0435 seWindowPatcher.cp
f8def4 cfe08ee7628eb610501555523efd1bbd01337c1e ·clients/pgp/mac/Shared/CPatchers/CClo¶
b92d3b seWindowPatcher.h
03d168 5d6e2096918c1d3bdde7b14e1a951d432bee51f4 ·clients/pgp/mac/Shared/CPatchers/CDra¶
19f892 wMenuBarPatcher.cp
2a07b9 3c8b783750c05f9f28de347f8724fb5289c29f31 ·clients/pgp/mac/Shared/CPatchers/CDra¶
225d70 wMenuBarPatcher.h
b518ad 03f6d2849272be5971d350d877ae965996822398 ·clients/pgp/mac/Shared/CPatchers/CEnd¶
d09c82 UpdatePatcher.cp
1a85e1 5c24e939c910eda7992767b3067c18c16bb2740b ·clients/pgp/mac/Shared/CPatchers/CEnd¶
cf7367 UpdatePatcher.h
76c370 8cc304fe0dd3676b1cb6f55651fa23ab299c1a61 ·clients/pgp/mac/Shared/CPatchers/CEve¶
74fa41 ntAvailPatcher.cp
5c24f0 5d7491f9b150396ade12fc2039d978660f0f00e6 ·clients/pgp/mac/Shared/CPatchers/CEve¶
969e52 ntAvailPatcher.h
2a6f48 d47b86336176741d63bef1bd56dd6f91b6a7c1e6 ·clients/pgp/mac/Shared/CPatchers/CGet¶
7ca8ee KeysPatcher.cp
7eccf5 5e62c6e177f0b6a246761ea95fa7385d7336a6b9 ·clients/pgp/mac/Shared/CPatchers/CGet¶
1fb402 KeysPatcher.h
28e12b ecdeba59ce695d26be4c16e790977ac87c082941 ·clients/pgp/mac/Shared/CPatchers/CGet¶
68dd2e ResourcePatcher.cp
c4b96a 3bef76c9997a9978f7d2937eb6134383484f5e9c ·clients/pgp/mac/Shared/CPatchers/CGet¶
62c314 ResourcePatcher.h
d9f39b 50e92f37cfad8f252da6c4c8753c7afe77694253 ·clients/pgp/mac/Shared/CPatchers/CIns¶
293f45 ertMenuPatcher.cp
c96a7d c8a135d02a62e7b3b3ad6d8e463a5320a0054074 ·clients/pgp/mac/Shared/CPatchers/CIns¶
--5d28 000aa50b01040120003 Page 13 of machashes.asc
938ea1 ertMenuPatcher.h
ed6aa0 ccaee0d9729280d3073e0f84d49a897c3b70993e ·clients/pgp/mac/Shared/CPatchers/CMen¶
445948 uSelectPatcher.cp
3a7b7c b75fc3e26495adb969914b59f8bf674d94b16b9b ·clients/pgp/mac/Shared/CPatchers/CMen¶
efad94 uSelectPatcher.h
2b1e7e bea9c0a9bb7292758aada0177a9077b4e3ee56f8 ·clients/pgp/mac/Shared/CPatchers/CPat¶
412753 cher.cp
cf4b4b 18a07a00ef1f99f0fbfa4da9470304dfb9851320 ·clients/pgp/mac/Shared/CPatchers/CPat¶
c45939 cher.h
52bb59 fa118f7fb7d6e9d874798f9d8cdcd0099a8c382d ·clients/pgp/mac/Shared/CPatchers/CPop¶
44d5d6 UpMenuSelectPatcher.cp
00a597 c18e6c2a5d7fd0e5f555ba8543eadf66a4e22247 ·clients/pgp/mac/Shared/CPatchers/CPop¶
e67b9c UpMenuSelectPatcher.h
835e8b 1937e8f3de79c7b98c89af2714b98f33ed3cb757 ·clients/pgp/mac/Shared/CPatchers/CPut¶
a64fe8 ScrapPatcher.cp
31fcd4 b6c18f8bcf783c06953dcce4a3a00546deb8ef21 ·clients/pgp/mac/Shared/CPatchers/CPut¶
28bce2 ScrapPatcher.h
693d45 70d930be949db1128c8bf34319ce7dd19b88c16f ·clients/pgp/mac/Shared/CPatchers/CSet¶
f86470 MenuBarPatcher.cp
d5e986 e08f0e2236c0f2f7aae8d61444c6f2d60b795345 ·clients/pgp/mac/Shared/CPatchers/CSet¶
ad7668 MenuBarPatcher.h
dc9647 963fa89fc14c7f7015f7aa7c3028d4434873ea44 ·clients/pgp/mac/Shared/CPatchers/CSet¶
74c222 WTitlePatcher.cp
052535 42c43f14d35b54397af5b8852073e644126ef6cc ·clients/pgp/mac/Shared/CPatchers/CSet¶
7236fb WTitlePatcher.h
0433e1 b93b0b3717ddb80d9a63b03233e0630db7f6cb9a ·clients/pgp/mac/Shared/CPatchers/CSiz¶
c7c5d1 eWindowPatcher.cp
c32136 2e02ea6ebcd4b829c724ee281341bed6c5b20933 ·clients/pgp/mac/Shared/CPatchers/CSiz¶
f4fd8c eWindowPatcher.h
e2895f 47e7007504e87752e06339acd538ad42256deee7 ·clients/pgp/mac/Shared/CPatchers/CWai¶
72bd69 tNextEventDispatcher.cp
4798a4 1c419df16d4172316fc5afca2b08482d37b1c6c2 ·clients/pgp/mac/Shared/CPatchers/CWai¶
e89a47 tNextEventDispatcher.h
df2c7f ed2a10b6cfdf43e391c98749f40266c5202c7653 ·clients/pgp/mac/Shared/CPatchers/CWai¶
36bed4 tNextEventPatcher.cp
3eef25 1d7fa81364cb9ed091cbbc073bc08620a44acbac ·clients/pgp/mac/Shared/CPatchers/CWai¶
063f74 tNextEventPatcher.h
14ed18 4aa78576e132713e9a99f0bda0a55ccb1830df0b ·clients/pgp/mac/Shared/CRestorePortCo¶
9396f6 lorsAttachment/CRestorePortColorsAtt.ppob.bin
287b9f 5a9fdad0f4373c691a550774ddfa12a2d8276af7 ·clients/pgp/mac/Shared/CRestorePortCo¶
33387a lorsAttachment/CRestorePortColorsAttachment.cp
e83aac d66b35234a1fd1873b5c03bec54051461c1f77c7 ·clients/pgp/mac/Shared/CRestorePortCo¶
b689d6 lorsAttachment/CRestorePortColorsAttachment.h
2bcc27 e006f1afd4297df0c447941bed7a1c7758ae8fc1 ·clients/pgp/mac/Shared/CSaveRestoreSc¶
004bae rap/CSaveRestoreScrap.cp
660d02 f647fe4bd0c322dec22b56d40802347676770513 ·clients/pgp/mac/Shared/CSaveRestoreSc¶
0cdaa6 rap/CSaveRestoreScrap.h
897263 a396a52638292fb5d8650a33cd7c973ac7c4650e ·clients/pgp/mac/Shared/CSecureMemory.h
db35ac 4fad6d8e7886a1cf151e6e91b10c25caf74d6003 ·clients/pgp/mac/Shared/CSharedProgres¶
eee653 sBar.cp
e5d2ec 2b78d720f299e221bedee314d081c047dac2bebf ·clients/pgp/mac/Shared/CSharedProgres¶
606d8e sBar.h
f24919 f6da1231cb37b49de7cd84637b7438288fb7ced4 ·clients/pgp/mac/Shared/CSharedProgres¶
194840 sBar.rsrc.bin
fb59cd f9bf0f899dfca2f8943430bd152c8df7627a54b2 ·clients/pgp/mac/Shared/CShareholderLi¶
50b380 st/CShareholderList.cp
996399 71078b5ab33a6f9dab6da16cc03312f9e22f4e67 ·clients/pgp/mac/Shared/CShareholderLi¶
3b03a9 st/CShareholderList.h
9a3c0b f31996c99b9921bfc5d9925469621091a12df1ed ·clients/pgp/mac/Shared/CString/CStrin¶
0105c9 g.cp
082b69 5a8d11f6f4208903727c0663d8eb75269bf092bd ·clients/pgp/mac/Shared/CString/CStrin¶
78d92a g.h
4ad7c6 5f55f9818b210482dc80f94ade8ca5aa105948d1 ·clients/pgp/mac/Shared/CTempFile/CTem¶
42d636 pFile.cp
bb28cc 0b844f50e4489b7c46a5aaddb133ac324f580309 ·clients/pgp/mac/Shared/CTempFile/CTem¶
b883af pFile.h
9cb1e0 5f7e7aa0d74bd0cc4e5335196b6d6a5d0aa1db91 ·clients/pgp/mac/Shared/CWindowRefArra¶
1bd6a1 y/CWindowRefArray.cp
c92745 b9f2473ca66587862a2341a630ab8db01e713501 ·clients/pgp/mac/Shared/CWindowRefArra¶
c514af y/CWindowRefArray.h
8c0faf e3f422a4916af7043b553bd2cceb9acde19edb53 ·clients/pgp/mac/Shared/MES Resource/C¶
aaf961 FM-MESP code/CFM-MESP.cp
--117f 0009327bcb440120003 Page 14 of machashes.asc
e14aa3 4e9352e35cce6086f813aedb45dc5cc3b46500a4 ·clients/pgp/mac/Shared/MES Resource/C¶
c59921 FM-MESP code/CFM68K-MESPPrefix.h
31d51c 294d448861649f6bf7a7772f10034c5e090385d7 ·clients/pgp/mac/Shared/MES Resource/C¶
8117f0 FM-MESP code/CFMPPC-MESPPrefix.h
c38537 be721e34bb0c68c30c7ca853debb3bcac210ef0d ·clients/pgp/mac/Shared/MES Resource/I¶
4d3ae7 NIT code/init.c
1c7ce3 d852356abee667b2a9365aa82819cb4b6d9d604e ·clients/pgp/mac/Shared/MES Resource/I¶
dfde4f NIT code/init.h
f11595 240910ac115f7a5ce7f6fcc438605f991b991fe0 ·clients/pgp/mac/Shared/MES Resource/J¶
05ce95 imi code/Jimi.cp
a68f86 38e3b8fa859c70e93085b37aecc4f3c1fc449a60 ·clients/pgp/mac/Shared/MES Resource/J¶
8de137 imi code/Jimi.h
84cb5e e4920d1b6f0bfbcee2aab84bbde1834069d70ceb ·clients/pgp/mac/Shared/MES Resource/M¶
efa6e5 ESResource.prj.bin
620b31 3e517378713fde491a838593a8e82b40a7d7f716 ·clients/pgp/mac/Shared/MES Resource/S¶
2a8f1d hared Memory/sharedmem.c
99c88e 99d96dc533f5ff8debb61a2686a7a6be5fb19a3e ·clients/pgp/mac/Shared/MES Resource/S¶
886bb5 hared Memory/sharedmem.h
8e7ffe 7badd253300e66c416eda70ff0dbe5531a153932 ·clients/pgp/mac/Shared/MES Resource/p¶
ebc053 ub/plugin.h
803b67 2f3bfda153822838b1feab1631e458fce515b65e ·clients/pgp/mac/Shared/PGPDemo.c
ceed97 c4c7a54088056cee6b4ac8645c62f978ee4fb56c ·clients/pgp/mac/Shared/PGPDemo.h
ab1652 032ad58c398ce51ed0d435f214ebbc46fc9a9b79 ·clients/pgp/mac/Shared/PGPOpenAdminPr¶
cf57f4 efs.cp
5c6814 427532a74f14bdc733cd926778c198ef98a48729 ·clients/pgp/mac/Shared/PGPOpenPrefs.cp
1c0df8 6361781df6d5c8664dd468c7933ef8d3c68c40c8 ·clients/pgp/mac/Shared/PGPOpenPrefs.h
afe456 98f5bb8ed1e1f800039f1f485a6d128d33ad7ed8 ·clients/pgp/mac/Shared/PGPPrefs.rsrc.¶
5769de bin
7df77f 245b9f45b4e2475a68edb5f555dd22dfb1d166ff ·clients/pgp/mac/Shared/PGPSharedEncry¶
ac6f00 ptDecrypt.cp
7db926 81dcc6101c8f1db360b00f00b581166c75ba79ff ·clients/pgp/mac/Shared/PGPSharedEncry¶
925ed3 ptDecrypt.h
d94aba a3368f1d6f3ec1d68333d26cfc59d66dda8cc307 ·clients/pgp/mac/Shared/PGPSharedParse¶
c994a6 .cp
cfb162 7d3d7ea0059f1b37e437b08a2b80dcdfee6398ac ·clients/pgp/mac/Shared/PGPSharedParse¶
5d17ef .h
63a5ea 6dece5d09e77a06c89b592b63ad8fefb08b0ca5e ·clients/pgp/mac/Shared/PGPVersion.rsr¶
78e33b c.bin
538757 39367d10409c6fda0f7f6d47a4e683532a761360 ·clients/pgp/mac/Shared/PassphraseCach¶
601341 e.cp
4be4f7 ff3fc0815fec36a8284d7d0c47ddf50dc5042f59 ·clients/pgp/mac/Shared/PassphraseCach¶
68e05c e.h
63f536 7761a6b9cd1366661e8144f08bcf97a0281643d2 ·clients/pgp/mac/Shared/ShowInitIcon/S¶
37e665 howInitIcon.c
40f705 05457d41b381c6bc00d65ffec574a35dfc6d3e84 ·clients/pgp/mac/Shared/ShowInitIcon/S¶
9002cd howInitIcon.h
7b838f 93dea806cf46aec4421e9d65c03f2920f61a112d ·clients/pgp/mac/Shared/ShowInitIcon/S¶
6a9d10 howInitIcon.rsrc.bin
1fa76b acc4e63db24e41fd014970cd01cd132e31705cac ·clients/pgp/mac/Shared/SignatureStatu¶
de7ce9 sMessage.cp
3179ca 1de1bd640e5576277c49a0bc1747d7cefb54b5c8 ·clients/pgp/mac/Shared/SignatureStatu¶
bc2ef0 sMessage.h
a514b8 76ce7c8ab34c9b231811e08973a99c7e25d4a3e0 ·clients/pgp/mac/Shared/SignatureStatu¶
74d181 sMessage.rsrc.bin
2d14fc a2901060517ef07168c226bdbc0af5247aaed40a ·clients/pgp/mac/Shared/StackBasedClas¶
d3048d ses/StSaveCurResFile.cp
1bf53b 03016dc166b294d270f2308177b72692af8830a4 ·clients/pgp/mac/Shared/StackBasedClas¶
a7953b ses/StSaveCurResFile.h
41bde9 df06938f919b4c737a1153e66b47c781ab8f5681 ·clients/pgp/mac/Shared/StackBasedClas¶
36098f ses/StSaveHeapZone.h
ffbbba 1743297273532be4e9f5ed002f8ac55b0cbfdcda ·clients/pgp/mac/Shared/StackBasedClas¶
f1bf6f ses/StSuspendAESpecialHandler.cp
67f49a ea479a10fc40ce2a78be3394283910b4943a706a ·clients/pgp/mac/Shared/StackBasedClas¶
7a8c65 ses/StSuspendAESpecialHandler.h
c28604 898b0e19347999d4e8aea6a5ffe8dc8b30c91b3f ·clients/pgp/mac/Shared/UPGPException/¶
d66ab4 UPGPException.cp
fe7d76 8a187038d913c00dc67a768dacc8a255aeff078c ·clients/pgp/mac/Shared/UPGPException/¶
18c286 UPGPException.h
aa63fa 5556f4f625739fec5ff098129fe8e415b4fbe6bc ·clients/pgp/mac/Shared/WordWrap.cp
7f25bb 960e534461fa77bf19b73c344dd6adf7a46b28e6 ·clients/pgp/mac/Shared/WordWrap.h
8f38f0 6923b704dd97b0c37985bae40a698aa0086c01d3 ·clients/pgp/mac/Shared/pgpMacCustomCo¶
93fae9 ntextAlloc.c
--6319 00046db447e40120003 Page 15 of machashes.asc
8c4994 69435ded1138ab655a6295e42c6abde43afca652 ·clients/pgp/mac/Shared/pgpMacCustomCo¶
d91e41 ntextAlloc.h
431b9b e4bbfb99d1670deb91b6d4d44df3c22c9194874c ·clients/pgp/mac/Shared/pgpNavServices¶
0b94a6 .cp
19b682 a33d7ab0242576932605aa7475ba9a1372cc333a ·clients/pgp/mac/Shared/pgpNavServices¶
c317ef .h
e3495f c1a9a7831b07152a71c9ace751c7effda9d00255 ·clients/pgp/mac/install/InstallAdmin ¶
ed824d Resource/InstallAdmin.prj.bin
ccfaa3 c8ee114e51f53b8a108b985a04a42510bd22fd2c ·clients/pgp/mac/install/InstallAdmin ¶
edafb2 Resource/code/InstallAdmin.cp
9d4d11 3b6277a9280fa5a8e9783b765c5335377cc53977 ·clients/pgp/mac/install/InstallAdmin ¶
6c1937 Resource/code/InstallAdmin.prefix
3a3ded e35f09714d8cde02c97c3491dafb63fcad9020ae ·clients/pgp/mac/install/Installer.sea¶
5668f7 .bin
87fbfc c10c68b09065ed313b67e4a56354e63314073cd8 ·clients/pgp/mac/install/docs/Intro to¶
5cae21 ·Crypto.bin
99d03c 66d7b75a1161ac6d7cb3d4e4d23fefee583655cc ·clients/pgp/mac/install/docs/PGP 6.0 ¶
179bf7 Manual.bin
59d702 2eaf0969f60c079200a392e21f940c27e2e2fd50 ·clients/pgp/mac/install/docs/PGP Inst¶
7a0c39 allation Guide.bin
3672be 08171b9d1bdf510c2b92cbb7c9d0d0134a5fb759 ·libs/network/ldaplib/macintosh/Make-t¶
df0f79 emplate
94d806 5f4e07b8e2790ea3817aec8830b0dcda1336da7e ·libs/network/ldaplib/macintosh/Makefi¶
d81459 le
6cdc95 3782ad4bbd54db9f6736045b3457bd43f7e76c06 ·libs/network/ldaplib/macintosh/README
fb6314 dffb591b6b672aaf0ce6cb4a5196b591e73289d0 ·libs/network/ldaplib/macintosh/getopt¶
1ff347 .c
726251 0b0601d864eed37552bc15cfbdf1420f61bbd08a ·libs/network/ldaplib/macintosh/kerber¶
c90c1d os-macos.c
6b9b61 f4e0326fa571d67abd43750cef969faecc6fa50c ·libs/network/ldaplib/macintosh/macos-¶
f359d5 ip.c
a088e5 5cc2ed7a71bada04853b3527e070a592cfae70ea ·libs/network/ldaplib/macintosh/macos.h
d6f44f 90ace9ec0d3988465dfeff9063d6021b64724d82 ·libs/network/ldaplib/macintosh/pgp/PG¶
3e77b2 PCommonldapLib.prefix
085756 a43c2f10a625be1e4030a3c1bdd1d8478ce75c13 ·libs/network/ldaplib/macintosh/pgp/PG¶
5ed185 PDebugldapLib.prefix
365df8 27eb5ac354e922101aea00e4ce6f196f87a6e5e2 ·libs/network/ldaplib/macintosh/pgp/PG¶
9a2dff PldapLib.prefix
e48355 89a249d91cca97f0c1951e13803649d831b32fee ·libs/network/ldaplib/macintosh/pgp/PG¶
1f7c0e PldapLibEntry.c
7e1a6d ac9acce40dfc7f381c0a6512bcb2393a974cfcd9 ·libs/network/ldaplib/macintosh/pgp/PG¶
383989 PldapLibEntryMappings.h
54ca90 10cd58faea0512c579f459d8126839fcd3988180 ·libs/network/ldaplib/macintosh/pgp/PG¶
8190fb PldapLibEntryUnmappings.h
3f943d 0164894215e91946ce2deb072b03e64463c65fac ·libs/network/ldaplib/macintosh/pgp/PG¶
b5897e PldapLibMain.c
3edfe5 637e96ed4368d22c029782132bcbce0791851611 ·libs/network/ldaplib/macintosh/pgp/PG¶
5605d1 PldapLibUtils.c
e1d0aa 4854fb471f06bab2bfcf71875fe21c6731efff06 ·libs/network/ldaplib/macintosh/pgp/PG¶
61e179 PldapLibUtils.h
fc65e9 c1b811742204cc494da48061f37bb6182547cd5d ·libs/network/ldaplib/macintosh/string¶
bd8ccf s.c
c2d160 7a572788f47506cf77cc98e00dbf587490166dc2 ·libs/network/ldaplib/macintosh/tcp/Ad¶
f66643 dressXlation.h
ee3191 e7dab736fea3400b4c29e8960445088d15c352e2 ·libs/network/ldaplib/macintosh/tcp/Ge¶
08a1eb tMyIPAddr.h
ba8fad 243d595abc7e76469157a309e44d4451ffa300b4 ·libs/network/ldaplib/macintosh/tcp/Ma¶
13fd5f cTCPCommonTypes.h
2ab01d 1730cca2d45f0e00e0bd65dad523f00a669549ee ·libs/network/ldaplib/macintosh/tcp/Mi¶
43ea0a scIPPB.h
6145e4 3f7996ef31dd376df0627a7f2fbf403e12913ca1 ·libs/network/ldaplib/macintosh/tcp/TC¶
af0d2d PPB.h
6dc510 66c744d8fb833817d5679201690bf3e5faeeea29 ·libs/network/ldaplib/macintosh/tcp/UD¶
a50d2d PPB.h
374911 a02823e12705e1b7b4947f903266309c97fbcdee ·libs/network/ldaplib/macintosh/tcp/dn¶
5b9074 r.c
c7124e 610baf269c9a917b3279cce2f3df0ddb118be2f4 ·libs/network/ldaplib/macintosh/tcp/tc¶
89a902 p.c
977cc8 a47b2e4167795873f865902666a5eaacd38ffba2 ·libs/network/ldaplib/macintosh/tcp/tc¶
714daa p.h
b571c4 fb6fd7cb83baece8b32d307cdf9fe58457312d6b ·libs/pfl/mac/debug/MacDebug.cp
4641d9 7fb3d47d605f540ea5c5351ca87e32aa3220fe0d ·libs/pfl/mac/debug/MacDebug.h
--04cb 0006fe8b37e40120003 Page 16 of machashes.asc
3562c1 9a8d58e35ce01293a383bc9209375bfa7a1d0399 ·libs/pfl/mac/debug/MacDebugErrStrings¶
7417ef .h
e3c720 cacccd5a3bdf8076ca0b50d053003345a4adbdbd ·libs/pfl/mac/debug/MacDebugLeaks.cp
8d8774 01042c3d53c39c60afea134991bcc905803816bb ·libs/pfl/mac/debug/MacDebugLeaks.h
d11c2b c9431d83747b588a8fe946207a84454a3c484256 ·libs/pfl/mac/debug/MacDebugPatches.cp
176d51 5b8994d277f8b2d5ee5713a35518d9d5ab4f0a7d ·libs/pfl/mac/debug/MacDebugPatches.h
4e1d19 c83def3250b280cca0c9f78ede4ec9ceb5e5d2a1 ·libs/pfl/mac/debug/MacDebugTraps.cp
2644ea e24911f23072fcf0c32e304eaa62308d1cf93697 ·libs/pfl/mac/debug/MacDebugTraps.h
645135 cbf045d9d64613f9316838a1a71e8edc9d0675ac ·libs/pfl/mac/debug/MacDebugTrapsOff.h
d147fb 1fe5c6ae96d6bd17f8e6073d2168e5c519fa09b5 ·libs/pfl/mac/debug/PowerPlantLeaks.h
1efe07 b9af837f5dfacf8bc203d65047544e24352fed99 ·libs/pfl/mac/pgpPFLConfig.h
75fe42 fe5e432596d4d9597a7245c23726ea9ebcd89109 ·libs/pfl/mac/powerplant/CGAProgressDi¶
65f850 alog.cp
e8bbb3 779eb96df5c3f6d4015f6b25140c0b0e4bb9bce6 ·libs/pfl/mac/powerplant/CGAProgressDi¶
469f70 alog.h
e64fa6 d7ef936d6b2107662332cef03fdc885836e8c7ed ·libs/pfl/mac/powerplant/CGAProgressDi¶
de1f42 alog.ppob.bin
1c2543 223c8e966f6fc61d7cc3a3362ec4a52161947eef ·libs/pfl/mac/powerplant/CPGPModalGraf¶
4133b9 PortView.cp
6dd657 b6353a47e589f0339e26483ecc98c67d45e644fb ·libs/pfl/mac/powerplant/CPGPModalGraf¶
fa126d PortView.h
afc30b 875f3a401a35b5f641393cb1edd1f6c9b22e2fe8 ·libs/pfl/mac/powerplant/CPGPStDialogH¶
a6cf4d andler.cp
cff6e0 2f6b0dbe3070c4da4b4912e20083d7969acfa97b ·libs/pfl/mac/powerplant/CPGPStDialogH¶
6d3126 andler.h
1cbe10 7a28db166957b967a5e8f4a66044956bb8bc31e8 ·libs/pfl/mac/powerplant/CPassphraseEd¶
ec0e87 it.cp
f03410 7149c1b496a72a0da6b4de59b129f5eb7bfe0d5d ·libs/pfl/mac/powerplant/CPassphraseEd¶
2bcf91 it.h
738f04 e5a4a9b753fc6d326781b9d54e628d0f1eaebe17 ·libs/pfl/mac/powerplant/CPicture.cp
1cdaff b671f3d8606f5e2386d343f03a5f426942d7a784 ·libs/pfl/mac/powerplant/CPicture.h
1592b6 4638a0ddea2ebfc2c580da95a23410d0898e1fb8 ·libs/pfl/mac/powerplant/CProgressBar.¶
42b5b7 cp
239be4 6868935b720dd89729866b993ddc16b9437cfd24 ·libs/pfl/mac/powerplant/CProgressBar.h
368dd1 406ca47b20004f89a1a7b5764f526299f397b92d ·libs/pfl/mac/powerplant/CVersionCapti¶
23ee95 on.cp
7ada30 1ef86bda445f0e007b9ac2de5a32c84a3db1875c ·libs/pfl/mac/powerplant/CVersionCapti¶
fbeb06 on.h
23fa9e ecc9f5b71d5eeded9c3168b3b33aac4575441e43 ·libs/pfl/mac/powerplant/CWarningAlert¶
7894a6 .cp
8ac511 cac800fd483f0868c693e59b0a00a323f48e938d ·libs/pfl/mac/powerplant/CWarningAlert¶
fd17ef .h
1dfaf3 7008b2e73e34a045f6febc5ba3439d0be1c3473f ·libs/pfl/mac/powerplant/CWarningAlert¶
671198 .ppob.bin
486335 b617e6fdc53c57a9c1e382253502a4ca1a3a4ac0 ·libs/pfl/mac/powerplant/PFLMacCustomC¶
f54719 lasses.ppob.bin
e5e473 5dae3494b2234cfcee101e5cb7f67b31e7653b43 ·libs/pfl/mac/powerplant/bugfixes/CPGP¶
2216fa AMEditTextImp.cp
d47b04 8757d957c3dd8b15f31eab7d95c00a27e6aff04c ·libs/pfl/mac/powerplant/bugfixes/CPGP¶
727309 AMEditTextImp.h
2c9c5d 9da6f334cedbf18cb170b8fe42e908294ac25fca ·libs/pfl/mac/powerplant/bugfixes/CPGP¶
ab4271 AMTabsControlImp.cp
40f139 e844674701e981c92dc5cbef98ec0f9a19fa1908 ·libs/pfl/mac/powerplant/bugfixes/CPGP¶
d54d3f AMTabsControlImp.h
1b236b 0a5a475ab2cf6dcfa3d21751c955c2185e5739a3 ·libs/pfl/mac/powerplant/bugfixes/CPGP¶
e345ba ActiveScroller.cp
c1fd9f 35a684aeda0b99ef02678c93d11058c289d74be6 ·libs/pfl/mac/powerplant/bugfixes/CPGP¶
e8be48 ActiveScroller.h
d23e38 6b28fc44d1d3d85b7b3a4af2d8ffa296c2c136aa ·libs/pfl/mac/powerplant/bugfixes/CPGP¶
b460ec GAPopupButtonImp.cp
b2df7e b82ae4f6a8b6421868092b74b2ff2af43062c00b ·libs/pfl/mac/powerplant/bugfixes/CPGP¶
96ca2c GAPopupButtonImp.h
147e6c 7fa3f28ffe787616f42ba0f733aea896e7f07dda ·libs/pfl/mac/powerplant/bugfixes/CPGP¶
c05f85 HierarchyTable.cp
b8b46a 5b42b63dd60771fa68a489e41fb05009b0d1c217 ·libs/pfl/mac/powerplant/bugfixes/CPGP¶
eb50f2 HierarchyTable.h
cffba7 2307c4abf9e169432663b3ce7eb8a657d97e67d1 ·libs/pfl/mac/powerplant/bugfixes/CPGP¶
8b126b NodeArrayTree.cp
105203 7fff8d1e3e1ba9cba2fe10de2c41a2013ba9369e ·libs/pfl/mac/powerplant/bugfixes/CPGP¶
f4c24d NodeArrayTree.h
1c2e6d 4904df84dea87d8b06bcf93e7a84cd8c5f283d45 ·libs/pfl/mac/utilities/CLog.cp
6f080f ab18c55093c216d69daa794f5ee188e08503cbc0 ·libs/pfl/mac/utilities/CLog.h
--76a1 000292a5cf440120003 Page 17 of machashes.asc
7ed6be 08c7d3c732200392db22579709821135ec088ed2 ·libs/pfl/mac/utilities/CMacFSWiper.cp
38dfbf b318bb91b397b34c7a5c4a306341042e56b0f03b ·libs/pfl/mac/utilities/CMacFSWiper.h
d4d6da 74ff26a5e9173d250e1196adc9b47027b4e6391f ·libs/pfl/mac/utilities/CMacQueue.h
ba6d72 6810a4204f1d581a2b8a00d36e0afbcb6b654607 ·libs/pfl/mac/utilities/MacBTree.cp
57ca8f a78cefe9f72358c80a6fae35f1ffd7dcf9e9bf96 ·libs/pfl/mac/utilities/MacBTree.h
967806 e74c0ac63d7f587222a88104aa70cbf6585b778a ·libs/pfl/mac/utilities/MacBasics.h
a57823 28c290e2090340b21c81358a15abe00a2dd5d175 ·libs/pfl/mac/utilities/MacCursors.c
4e9d39 be9b0293e0ead1ceab39d55aa6f3415cd34133d6 ·libs/pfl/mac/utilities/MacCursors.h
448c05 8a50f60068202c5947f3874b16c225989b088386 ·libs/pfl/mac/utilities/MacDesktop.c
b4d1f5 5ae3479f2f42425c6220e6270a1f7cdd309197f3 ·libs/pfl/mac/utilities/MacDesktop.h
a16217 6c5a0474902bfa7891e10c785b17eb0937525f0e ·libs/pfl/mac/utilities/MacDialogs.c
7a94ea 5aceda9d649721bbb504deef28270e1533ee3094 ·libs/pfl/mac/utilities/MacDialogs.h
f5adf8 55802bc40b992f1025b7b4c799c4095599874450 ·libs/pfl/mac/utilities/MacDriverUtils¶
1d94a6 .cp
599979 e88cba083bbd54b76eeeb12053b745fa78f858d6 ·libs/pfl/mac/utilities/MacDriverUtils¶
5e17ef .h
ab9588 fb4c0cd6310aff4da6774e26facca1ad91a9bca8 ·libs/pfl/mac/utilities/MacEnvirons.c
a81f21 a460e75e106f4431cf72158693127a3cc64b7960 ·libs/pfl/mac/utilities/MacEnvirons.h
cfcc9e 8f4e765af0d766da5da45f0f23ad50c6d6aca543 ·libs/pfl/mac/utilities/MacErrors.c
d8ad9c 83aaf4a92e1031721a79320cf6d6512fb8148bdd ·libs/pfl/mac/utilities/MacErrors.h
7a2c1f eee4b027a49148631b4213bb95308901148c9b83 ·libs/pfl/mac/utilities/MacErrors.rsrc¶
1868f7 .bin
7841d0 ff272f98f821f2ffebde5407d8c1b1ca7cfe21fa ·libs/pfl/mac/utilities/MacEvents.c
5af185 1574a5b0cf6736cc88599889d5663b43f3b0d6d9 ·libs/pfl/mac/utilities/MacEvents.h
574d85 2646e0f1f6ba7e9e3060533796d362f2d06dbbf2 ·libs/pfl/mac/utilities/MacFiles.cp
93e477 e6faf52952daab11634b9bce9bfccdf0d8517c93 ·libs/pfl/mac/utilities/MacFiles.h
0a873c 8ece9516f276eaa2351b1eb87f0e6795c2afdaf1 ·libs/pfl/mac/utilities/MacIcons.cp
c92f29 0a9f989a16a4192a94e6e92256777978a14bf47f ·libs/pfl/mac/utilities/MacIcons.h
9a0bc8 c36e114115974c4a5823d83332694d68cbea6b3c ·libs/pfl/mac/utilities/MacInternet.c
0c2a1e bb3044e9f4548681ec582e294782149ff8fe1829 ·libs/pfl/mac/utilities/MacInternet.h
7de1fa 883d4303c2749ad611e56be3c289c69f0a023b57 ·libs/pfl/mac/utilities/MacInterrupts.c
726d5b c77adf5d00594728ffe8239b1812791a25682b55 ·libs/pfl/mac/utilities/MacInterrupts.h
c0036e c10725079fe47f068f274a402ffb8348209e4d15 ·libs/pfl/mac/utilities/MacMenus.c
1293b1 97c81317c7002ea0fe946272494b2ec68a586571 ·libs/pfl/mac/utilities/MacMenus.h
8ab290 f9edb32a0644f2eecfa7d1300c6666b56255b88e ·libs/pfl/mac/utilities/MacNew.cp
321d85 8f549b145b76effce42607c8e63425b1018fb835 ·libs/pfl/mac/utilities/MacNew.h
681470 74051359a9a64519d50fe7d66a8366386dce26b2 ·libs/pfl/mac/utilities/MacNumerics.c
0a1b69 f86178d6e75bc2b623e46efb94c2a2720da0bdde ·libs/pfl/mac/utilities/MacNumerics.h
919811 46931b9e1958ed14f70f0b4ffcdbcc0a6a011a5d ·libs/pfl/mac/utilities/MacProcesses.c
21b9f6 0b95e3ee72fd9f098fbb4c5442967312869c0e89 ·libs/pfl/mac/utilities/MacProcesses.h
246ea8 b36f6b908212b4a74955055087eeba1a364e87aa ·libs/pfl/mac/utilities/MacQuickdraw.c
215a73 e372f548df8bb10df4e45e3fbf1e34857ddd1eeb ·libs/pfl/mac/utilities/MacQuickdraw.h
0a6de4 e7d1f5bdd18ff1c5c7149ced42bb7aeace2d361b ·libs/pfl/mac/utilities/MacResources.c
47b89b f8dc7449ea8decd49bbe70eedba9321c7169e5ed ·libs/pfl/mac/utilities/MacResources.h
e6f4b6 bad318dba90524a4446fde82ad81a63267979e0b ·libs/pfl/mac/utilities/MacSecureMemor¶
41b4c9 y.h
aa7f71 971eb27bd27deb7c859c4cb2551157cdfe447377 ·libs/pfl/mac/utilities/MacStrings.c
9fe15c 0a34df8fc7179eccf6f9e0803657885fc04884ff ·libs/pfl/mac/utilities/MacStrings.h
45ec3b aa1afca81566dd97d87df60acb6033099ff5d518 ·libs/pfl/mac/utilities/MacTraps.c
11683b b18e97947d838ffb4764f0fafcf675dcf2998f2b ·libs/pfl/mac/utilities/MacTraps.h
bb9dc5 9b34df3219bd7940537c199f4b7944f839c22f97 ·libs/pfl/mac/utilities/SetupA5.h
3399c4 db818d6b5ffcc3f4ad3de36a40da8af326754ddb ·libs/pfl/mac/utilities/UInt64.cp
7502b8 28a360d56a13672361f9f0d8d0d47bcdb31269e1 ·libs/pfl/mac/utilities/UInt64.h
41122c dba57b68d0ddac60bef48e066a7706464350b9bd ·libs/pfl/mac/utilities/WarningAlert.cp
3e4f55 4aabbae6f1dd86684dc316670b1a641134c9a3fe ·libs/pfl/mac/utilities/WarningAlert.h
dd0785 2b1eba2ac16e0f2e42fe05d4bc4454b2d79f933a ·libs/pfl/mac/utilities/WarningAlert.r¶
0ec765 src.bin
013dc4 8407583899c7ee4f2f8fd0e4ba7551cbd85c750b ·libs/pfl/mac/utilities/WarningAlertTy¶
c72a81 pes.h
696bf1 5471d7e1dfbfab97946e00c05b2e98ca725a6e6d ·libs/pfl/mac/utilities/pgpMacMemory.c
3479a6 87a0595f560af314052006773f0178031db13eaa ·libs/pfl/mac/utilities/pgpMacMemory.h
edc601 d4ed2a79f6930872e161dcf3bbbc6f59b4e76a84 ·libs/pfl/mac/utilities/pgpMacVolumeWi¶
2c4e07 ping.c
d64fd5 6f9550ee7c5e3516d68938617d7e16a8713aeebf ·libs/pfl/mac/utilities/pgpMacVolumeWi¶
ccaaaf ping.h
28c287 e93519285c2124bfa4b785a179bbe5040a0fb1cc ·libs/pfl/mac/utilities/pgpMacWiping.h
c32113 f46b2b102a75602da7053446e0ae95b3730fe399 ·libs/pfl/mac/utilities/strlen.c
b03a60 40480bd447d4cf8d87f206fb19074cd03dacee62 ·libs/pfl/mac/wrappers/CFSCloser.h
3bd36d 6c6477b24de9912b408e00f82d9144ab1b6176a6 ·libs/pfl/mac/wrappers/CFree.h
80b161 51dccbd84b351550f864e536300756297ee520a2 ·libs/pfl/mac/wrappers/CFreePGPFileSpe¶
30abc6 c.h
2915d0 ffed40d10ca72c5fdd23f7199b00c373f25b886a ·libs/pfl/mac/wrappers/CFreePGPIO.h
--1e84 000e8d4745d40120003 Page 18 of machashes.asc
c8bca5 64ae12e3d830e2597912b6ab417c8d3202a77ec2 ·libs/pfl/mac/wrappers/CPGPFree.h
eae3d1 517ad14bc0cd99446c05e5f9fa46fb5c1df73d34 ·libs/pfl/mac/wrappers/CResFileCloser.h
8bc5ba c120189e3fa5f76a5f2690de10651d8628589bea ·libs/pfl/mac/wrappers/CSaveResFile.h
d90033 52f09fbc813fce80bee85b9f3fcb441d9a161fe4 ·libs/pfl/mac/wrappers/CSaveResLoad.h
9e85ed 1fde9c3e19d026593270fe7cf12e15a4ca60689d ·libs/pfl/mac/wrappers/CWrappers.h
918f39 93c7c934ed20f356eaa2375a05f26d5d8bc27e3a ·libs/pgpcdk/mac/BuildAllSDK.prj.bin
0deed1 953b6bcbde492e490b9107def4290a7937b93f17 ·libs/pgpcdk/mac/lib/PGPsdk.prj.bin
4e600f bea9fd19e083337446793fc924be64793f54599d ·libs/pgpcdk/mac/lib/PGPsdk.prj.exp
72a102 b8b1362ae41d7b2cb259208c6daceb30307a4ad9 ·libs/pgpcdk/mac/lib/src/PGPLibCommonH¶
780225 eaders.h
b6428b 7ccae94c3998eb7c19b394c5abec02737c959a59 ·libs/pgpcdk/mac/lib/src/PGPLibDebugHe¶
bac6d8 aders.prefix
ab245d e719b3c5348f96d2ccb94486078120a9e1f922ea ·libs/pgpcdk/mac/lib/src/PGPLibHeaders¶
e50772 .prefix
49c6f2 91e210f5891af83a2ee78d0b58d3d81b4f614cb7 ·libs/pgpcdk/mac/lib/src/PGPLibHeaders¶
b9d3e0 DEBUG.prefix
7f2a31 0556d4b7e2eeff1c993050ba821b28189436cd18 ·libs/pgpcdk/mac/lib/src/PGPsdkHeaders¶
05a2bc .pch++
b0a4ac d65838c8d72032bbb15f77622ca7c8110dd563c8 ·libs/pgpcdk/mac/lib/src/PGPsdkWin32.p¶
1390c3 refix
54c9dd 0f21ae3dba709509e1044cf16c892c794898b192 ·libs/pgpcdk/mac/lib/src/main.c
31e928 23ad3829466a759fb6d349be38273d94100f8c5b ·libs/pgpcdk/mac/networklib/PGPsdkNetw¶
083087 orkLib.prj.bin
6affd7 c56e984ecea543aef48b4722f58aa7b02a2ff881 ·libs/pgpcdk/mac/networklib/PGPsdkNetw¶
5eb76e orkLib.prj.exp
29be65 5dc46c1e3566df744af40ff04b0173e14e4c66cc ·libs/pgpcdk/mac/pub/pgpConfig.h
a19774 ccd60ec86d622b0aaf621f59912adb87a4ef5f6c ·libs/pgpcdk/mac/shared/PGPcdkShared.r¶
ebc765 src.bin
fc335f 4daac61957ed01852192d532099f61d871458b69 ·libs/pgpcdk/mac/ui/PGPsdkUILib.prj.bin
b2d11a 176cdff3317de6797efabdfea1f800fe128329f0 ·libs/pgpcdk/mac/ui/PGPsdkUILib.prj.exp
f5bf7c aa69f893095de45def994d5a10dd6807a9e66a7a ·libs/pgpcdk/mac/ui/source/CPGPCheckbo¶
aba13b xOptionView.cp
591056 13cbe7a06072d64987e766e71e0dc99b5e658e73 ·libs/pgpcdk/mac/ui/source/CPGPCheckbo¶
44299b xOptionView.h
6ba83c 15867b5e443f9229b2d3f0b8ad542c8c5e45d5eb ·libs/pgpcdk/mac/ui/source/CPGPConfPas¶
608429 sphraseGrafPort.cp
1a6c7f 9ce1172f2ca2ae83bd8fa77efdb2d26c6488b683 ·libs/pgpcdk/mac/ui/source/CPGPConfPas¶
c519ff sphraseGrafPort.h
e1c3c1 cad10aa91aafef89c627dbef84c9646e48e00ccd ·libs/pgpcdk/mac/ui/source/CPGPDecrPas¶
c98429 sphraseGrafPort.cp
808d7c 099b4e4b1a70c1f5845b6a4c3ad02eb92f4e8ab7 ·libs/pgpcdk/mac/ui/source/CPGPDecrPas¶
6e19ff sphraseGrafPort.h
ee4dca 4db31bf70f8691f8913927374a127753adbb9507 ·libs/pgpcdk/mac/ui/source/CPGPKeyPass¶
6f45cd phraseGrafPort.cp
90008d b8f751d6670a3f7c434448f4a1f5355823f0144a ·libs/pgpcdk/mac/ui/source/CPGPKeyPass¶
6cc948 phraseGrafPort.h
8da7d0 a08453af55f7ba2eeb831487b4767f0f779caa4b ·libs/pgpcdk/mac/ui/source/CPGPKeyServ¶
4b4aae erGrafPort.cp
164ed2 8512c5a5a6965afe176c2ba736c650f623cfb143 ·libs/pgpcdk/mac/ui/source/CPGPKeyServ¶
b0d2b7 erGrafPort.h
faaab6 01f6a613f1ab27061ee6582c62ce02e8dde837ff ·libs/pgpcdk/mac/ui/source/CPGPOptionV¶
c1c703 iew.cp
41d73a bc91d6c1ecf51178a300655d787fc89ce45b00e8 ·libs/pgpcdk/mac/ui/source/CPGPOptionV¶
af3fae iew.h
673929 24aac8d23593b77d6155cc612f951297791a983e ·libs/pgpcdk/mac/ui/source/CPGPOptions¶
dfa656 GrafPort.cp
69abde 760e716f45875a908dfc83a9debd828f2b15aa79 ·libs/pgpcdk/mac/ui/source/CPGPOptions¶
ef7cec GrafPort.h
a989b4 109d2b6666bb1e5b2e7c4a4007c201aa2f3b9331 ·libs/pgpcdk/mac/ui/source/CPGPOptions¶
c0f0ab ListView.cp
e74a62 4df1950f44a420409cc119d48b1e1410240f1f71 ·libs/pgpcdk/mac/ui/source/CPGPOptions¶
5124f8 ListView.h
f7bd45 c48714ffbb366d5340e209820a5bf1db828e20b6 ·libs/pgpcdk/mac/ui/source/CPGPPassphr¶
c281aa aseGrafPortView.cp
31e636 1e312a1f7f5421bd42b7efc38ef64a48369fddee ·libs/pgpcdk/mac/ui/source/CPGPPassphr¶
39b2aa aseGrafPortView.h
6f8237 95c1f02976fcaa9ec2c1d6d949d1fcd914e36d33 ·libs/pgpcdk/mac/ui/source/CPGPPopupMe¶
00214e nuOptionView.cp
17271e 95245c0960fe6428cfd974af48f4f9b21bbb63a6 ·libs/pgpcdk/mac/ui/source/CPGPPopupMe¶
c7745f nuOptionView.h
6c1ff2 a0446eebc23969c15b792a0eda754c5421cc5f2d ·libs/pgpcdk/mac/ui/source/CPGPRandomD¶
e828f5 ataGrafPort.cp
--5b96 00044831b8340120003 Page 19 of machashes.asc
548cdc 0d5d764d257ca79ba2444a205cad1dcad63a3fe8 ·libs/pgpcdk/mac/ui/source/CPGPRandomD¶
1b87c6 ataGrafPort.h
6d355f fc05f6abb0e3579623a34fc5ff920086b401e3d2 ·libs/pgpcdk/mac/ui/source/CPGPRecipie¶
fc3b1d ntGrafPort.cp
30ac1e a759fe0aee16b43be5368b9635879148b7824bd2 ·libs/pgpcdk/mac/ui/source/CPGPRecipie¶
8ef6e5 ntGrafPort.h
1103ae 8fce551de4e92c4ee177a807e82c5f5fa394b5e0 ·libs/pgpcdk/mac/ui/source/CPGPRecipie¶
40bbc4 ntTable.cp
0350d3 00373e0f9b78444606c3d4edb2cff9e01543f77d ·libs/pgpcdk/mac/ui/source/CPGPRecipie¶
8d0721 ntTable.h
773e42 4532dfb63020e66c17224b1a1c505af3f11e5aa5 ·libs/pgpcdk/mac/ui/source/CPGPSearchK¶
1a0350 eyServerGrafPort.cp
26f668 463f966d450e215a870355e758cbfb799b90bd58 ·libs/pgpcdk/mac/ui/source/CPGPSearchK¶
b3704c eyServerGrafPort.h
62ccd8 f4fb1c5740d7348485a2e933fb65aa0af7916639 ·libs/pgpcdk/mac/ui/source/CPGPSendToK¶
1e0350 eyServerGrafPort.cp
1e7d89 2b03bb54d1892ffdfb4dd1a508bf4408b7143b0e ·libs/pgpcdk/mac/ui/source/CPGPSendToK¶
31704c eyServerGrafPort.h
0880f3 2737d94feb9dce869de2e0ee257ebe5f4673c1f4 ·libs/pgpcdk/mac/ui/source/CPGPSignPas¶
af8429 sphraseGrafPort.cp
c7c3d5 5dea80b856b0a25edf7948e4d5567c305c40bd3a ·libs/pgpcdk/mac/ui/source/CPGPSignPas¶
f319ff sphraseGrafPort.h
46bb5c 345d6af40cb02628b90d4227b1688ed7bb313ed5 ·libs/pgpcdk/mac/ui/source/CPGPUIGrafP¶
4b7101 ortView.cp
6d4f26 55ca6b25f388a0fb6a5e246cac0bcef28ea9506a ·libs/pgpcdk/mac/ui/source/CPGPUIGrafP¶
02ae2d ortView.h
0ae81e 53fb5e2a1ca5c8fd1d828afafac6d12772ecd904 ·libs/pgpcdk/mac/ui/source/CPrivateKey¶
0b612e sPopup.cp
c22dcb 6d530d3d79563f0013d59460bbf0ecf65b48dafc ·libs/pgpcdk/mac/ui/source/CPrivateKey¶
41003d sPopup.h
cf59f5 de426ca96b5ddd42d7336297d6bd218e86b860cf ·libs/pgpcdk/mac/ui/source/CUserIDTabl¶
f01341 e.cp
206883 ab3e9f3827c0ba78d5ee48d0e49c2cfe812035df ·libs/pgpcdk/mac/ui/source/CUserIDTabl¶
fae05c e.h
58ee0e 1ccf1a6765358e2c47662955d26299037a78172b ·libs/pgpcdk/mac/ui/source/PGPCollectR¶
53ac15 andomDataDialog.cp
5f9998 f1fe946208687ea2582992c679dd1d62c59980ad ·libs/pgpcdk/mac/ui/source/PGPKeyServe¶
5e4e6f rDialogs.cp
861b19 890e44c62212f4116c7f02ab77744b6ec88b78c4 ·libs/pgpcdk/mac/ui/source/PGPOptionsD¶
90db3d ialog.cp
e5ea76 b2a7e4fe4e9315dcd3425a15a54fd39e44768f4f ·libs/pgpcdk/mac/ui/source/PGPPassphra¶
aaf077 seDialog.cp
35dc4a a658a86866e6a65b5788fbd8c1ee8472e3076608 ·libs/pgpcdk/mac/ui/source/PGPRecipien¶
fb3a45 tDialog.cp
15168c 02788cdfcebc51482269065f387d16a0bf72b6fb ·libs/pgpcdk/mac/ui/source/PGPsdkUILib¶
081198 .ppob.bin
d85e1f bb157fda3ff66cd62e733c7338f18a38f11baa6d ·libs/pgpcdk/mac/ui/source/PGPsdkUILib¶
1d9f1f .rsrc.bin
d62b09 5aac096c5d114b0dba8fe3dcac2c8503808a7305 ·libs/pgpcdk/mac/ui/source/PGPsdkUILib¶
d88175 Common.h
e62185 7fe6247fa390521cbbac908879f24881750c545e ·libs/pgpcdk/mac/ui/source/PGPsdkUILib¶
fe9dfe DebugHeader.prefix
35e254 726a6c2892bc08a8dd6e3862f4f2d2bcb59a1a58 ·libs/pgpcdk/mac/ui/source/PGPsdkUILib¶
fb25dc Dialogs.cp
e5f9ca bdf9bc6f12a2fbd6ec91fcafee89f2f012dd57e1 ·libs/pgpcdk/mac/ui/source/PGPsdkUILib¶
41c61b Dialogs.h
74e4ef 566b4d6c981969402a85f06e0c65162a4e6b91d6 ·libs/pgpcdk/mac/ui/source/PGPsdkUILib¶
84f288 Header.prefix
988ff8 e57ff2393086246a5728cb37c589d6b24864b22e ·libs/pgpcdk/mac/ui/source/PGPsdkUILib¶
542527 InitAndTerm.cp
7d0132 38e1edb8209ca168ceaa5d751479583ab63f0464 ·libs/pgpcdk/mac/ui/source/PGPsdkUILib¶
083a28 Utils.cp
b52406 c3c5a0b042ec082e698d89d18968c84e03721ca3 ·libs/pgpcdk/mac/ui/source/PGPsdkUILib¶
53cbf4 Utils.h
01d140 75877a0bd583d0cf43086a2ac7c7ef289cd0341d ·libs/pgpcdk/priv/networklib/pgpsocket¶
9662db s/mac/src/CInternetSocket.cp
0d43e2 2b27ade232f2e53ac6fcab538384bb8dbfb9f3df ·libs/pgpcdk/priv/networklib/pgpsocket¶
7fed0e s/mac/src/CInternetSocket.h
b046d0 b6d7e65acd16f7a8ecd9da51cb662c5660d8e1c8 ·libs/pgpcdk/priv/networklib/pgpsocket¶
ffab0a s/mac/src/CInternetUtilities.cp
c0af60 90ec6a810a54ed5d98f73445704847115c0d4d35 ·libs/pgpcdk/priv/networklib/pgpsocket¶
444831 s/mac/src/CInternetUtilities.h
--4cee 00137acec5140120003 Page 20 of machashes.asc
1c20cc 49c95df0a44343bc322c5b4a4e4e93df4583afb8 ·libs/pgpcdk/priv/networklib/pgpsocket¶
4acfaf s/mac/src/CMacTCPInternetSocket.cp
90db4b 482b9ea670eec009e7c03b650a4a04912bc04ab2 ·libs/pgpcdk/priv/networklib/pgpsocket¶
6bd326 s/mac/src/CMacTCPInternetSocket.h
2beb8d 1eeaefc534216aaacf83063ff1bb1186b5348728 ·libs/pgpcdk/priv/networklib/pgpsocket¶
c45734 s/mac/src/CMacTCPInternetUtilities.cp
6c6088 c094b557f7b6fbdbcdd2cdcc70dfbbff413f3260 ·libs/pgpcdk/priv/networklib/pgpsocket¶
1ba17a s/mac/src/CMacTCPInternetUtilities.h
cc71b2 75637e0ca9c894ca91118462079fc5b3834065c2 ·libs/pgpcdk/priv/networklib/pgpsocket¶
38d7ce s/mac/src/CMacTCPTCPSocket.cp
a0ce95 12facda94c3969b97c35371d42db41f9de650336 ·libs/pgpcdk/priv/networklib/pgpsocket¶
d273be s/mac/src/CMacTCPTCPSocket.h
1edf70 4eeb414e388111486efd5aa0670285a55eca4c14 ·libs/pgpcdk/priv/networklib/pgpsocket¶
8350fb s/mac/src/CMacTCPUDPSocket.cp
36b36d 61494bed8e90db8565ce6ddf1e81f68b2a39c35b ·libs/pgpcdk/priv/networklib/pgpsocket¶
f3560d s/mac/src/CMacTCPUDPSocket.h
b8ff0a 594b0a378eece74ada3d934962a47207ba61fb29 ·libs/pgpcdk/priv/networklib/pgpsocket¶
a5e440 s/mac/src/COTInternetSocket.cp
8fbfdd cab5bb0e1085885e3cf34c9b1d091b62bf9ad990 ·libs/pgpcdk/priv/networklib/pgpsocket¶
c86eac s/mac/src/COTInternetSocket.h
25fadd 2b106c757683216d622b6f6876724aeca605ecbb ·libs/pgpcdk/priv/networklib/pgpsocket¶
18d3c9 s/mac/src/COTInternetUtilities.cp
aa0551 32ecba629b730bbc545ae5ac0bf10ab7ba6f8e5d ·libs/pgpcdk/priv/networklib/pgpsocket¶
7354fa s/mac/src/COTInternetUtilities.h
e46f40 9c5d99d129cd51ef6b52428bd204a063d801a093 ·libs/pgpcdk/priv/networklib/pgpsocket¶
977f25 s/mac/src/COTTCPSocket.cp
04e693 0c7704bf39894adbdf50a8f3859ab302dd18d771 ·libs/pgpcdk/priv/networklib/pgpsocket¶
5dfac3 s/mac/src/COTTCPSocket.h
13964d ba1b8dcbb67c507347318bf5e0f409983fd3eb11 ·libs/pgpcdk/priv/networklib/pgpsocket¶
29f810 s/mac/src/COTUDPSocket.cp
45f3d6 eba42c5aac510a3c700c4fc931cdeb75c26d2cfd ·libs/pgpcdk/priv/networklib/pgpsocket¶
a7df70 s/mac/src/COTUDPSocket.h
1bc08d ebd45b5634c5594a9eba60fa7623fb01710ffceb ·libs/pgpcdk/priv/networklib/pgpsocket¶
4941d2 s/mac/src/CSocket.cp
93740d 120b55bdf88a83c28a62605b8ed3e5c647e2f7e9 ·libs/pgpcdk/priv/networklib/pgpsocket¶
89f60c s/mac/src/CSocket.h
5c6cc3 9e339eecd9b0a0b7dbee0699d79ae706e816888d ·libs/pgpcdk/priv/networklib/pgpsocket¶
8a1d3f s/mac/src/PGPSockets.cp
172940 c6b5c49af48c6096bd52475fa69332363030fd37 ·test-file
7caf5a
56e38f -----BEGIN PGP SIGNATURE-----
b9d11c Version: PGP 6.0.2
63af5a
f05ef6 iQA/AwUBNk314ROghfzXeyCUEQIO/gCeLS0lB+cdGGlfyy4bw016d1ooQJYAoPIF
28cdda OBDvLSi8Bug+9YRTiIsnlpxP
366729 =Bd1s
37e726 -----END PGP SIGNATURE-----
--8a77 000f719674f40120004 Page 1 of CDiskTestsTable.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
6dd9c9 ¤   $Id: CDiskTestsTable.cp,v 1.6.8.1 1998/11/12 03:05:03 heller Exp $
d0f7f7 ____________________________________________________________________________*/
6caf5a
dd9ba8 #if PGP_DEBUG¤  // [
16af5a
8add56 #include <PP_Messages.h>
fff8a6 #include <UTextTraits.h>
14af5a
aebbf4 #include "MacFiles.h"
bdc110 #include "pgpMacMemory.h"
88b86a #include "MacQuickdraw.h"
8385c2 #include "MacStrings.h"
91af5a
147dc1 #include "CDiskTestsTable.h"
4f7f0c #include "CEditDiskTestDialog.h"
a1af5a
34c2a7 const ResIDT¤   kDiskTestsTableTextTraits¤  = 21000;
fdaf5a
985ae0 static RGBColor¤sWhiteRGBColor = {0xFFFF, 0xFFFF, 0xFFFF};
08af5a
bef294 CDiskTestsTable::CDiskTestsTable() : LColumnView(nil)
dfbb36 {
c8842a ¤   pgpAssert( "CDiskTestsTable default constructor should never be called" );
c9efe6 }
2faf5a
430cb2 CDiskTestsTable::CDiskTestsTable(LStream *inStream) : LColumnView(inStream)
ccbb36 {
a72f37 ¤   mTextHeight = 0;
efefe6 }
ebaf5a
77bb76 CDiskTestsTable::~CDiskTestsTable()
13bb36 {
ffefe6 }
b8af5a
f07e69 ¤   Boolean
edb482 CDiskTestsTable::FocusDraw(LPane *pane)
cabb36 {
31f5fb ¤   Boolean¤focused = LColumnView::FocusDraw( pane );
ce67c5 ¤
ef6c59 ¤   UTextTraits::SetPortTextTraits ( kDiskTestsTableTextTraits );
a167c5 ¤
9ed1d5 ¤   if( mTextHeight == 0 )
02c7a1 ¤   {
c33d3e ¤   ¤   FontInfo¤   fontInfo;
a41b52 ¤   ¤
d8c25e ¤   ¤   GetFontInfo( &fontInfo );
521b52 ¤   ¤
8ba5b6 ¤   ¤   mTextHeight = fontInfo.ascent + fontInfo.descent + fontInfo.leading;
f99371 ¤   }
2b67c5 ¤
6c22b5 ¤   RGBBackColor ( &sWhiteRGBColor );
c067c5 ¤
1eda88 ¤   return focused;
08efe6 }
68af5a
296d52 ¤   void
fe4bea CDiskTestsTable::DrawSelf(void)
02bb36 {
f48e9d ¤   RgnHandle¤  updateRgn;
2c67c5 ¤
c1476a ¤   FocusDraw( this );
5667c5 ¤
1b724e ¤   updateRgn = GetLocalUpdateRgn();
1c144d ¤   AssertHandleIsValid( updateRgn, "CDiskTestsTable::DrawSelf" );
5b67c5 ¤
370563 ¤   if( updateRgn != nil )
50c7a1 ¤   {
f7b1ab ¤   ¤   EraseRgn( updateRgn );
--e5b7 00016690e1040120004 Page 2 of CDiskTestsTable.cp
c11451 ¤   ¤   DisposeRgn( updateRgn );
349371 ¤   }
c067c5 ¤
d1a6b8 ¤   LColumnView::DrawSelf();
3fefe6 }
d1af5a
fb7e69 ¤   Boolean
d8c77c CDiskTestsTable::AddTest(void)
c3bb36 {
fb8bff ¤   DiskTestInfo¤   testInfo;
4d6920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
ee67c5 ¤
ce7c9c ¤   pgpClearMemory( &testInfo, sizeof( testInfo ) );
b967c5 ¤
65abc2 ¤   if( DoEditDiskTestDialog( &testInfo.config ) )
f2c7a1 ¤   {
918720 ¤   ¤   testInfo.testDriveObj = new( CTestDrive );
db9c42 ¤   ¤   if( testInfo.testDriveObj != nil )
255b34 ¤   ¤   {
b3d3ad ¤   ¤   ¤   err¤= testInfo.testDriveObj->Run( &testInfo.config );
dae090 ¤   ¤   ¤   if ( IsntErr( err ) )
39f776 ¤   ¤   ¤   {
8f4504 ¤   ¤   ¤   ¤   InsertRows( 1, 20000, &testInfo, sizeof( testInfo ), TRUE );
f387c7 ¤   ¤   ¤
7ea5f2 ¤   ¤   ¤   ¤   StartIdling();
3f2b85 ¤   ¤   ¤   ¤
1e38a9 ¤   ¤   ¤   ¤   return( TRUE );
8ba3a6 ¤   ¤   ¤   }
82bb8c ¤   ¤   ¤   else
63f776 ¤   ¤   ¤   {
9a0d86 ¤   ¤   ¤   ¤   delete( testInfo.testDriveObj );
11a3a6 ¤   ¤   ¤   }
b5ec70 ¤   ¤   }¤  ¤
679371 ¤   }
3267c5 ¤
3e53dc ¤   return( FALSE );
41efe6 }
06af5a
606d52 ¤   void
cb3795 CDiskTestsTable::DeleteTest(TableIndexT rowIndex)
67bb36 {
388bff ¤   DiskTestInfo¤   testInfo;
023c1e ¤   UInt32¤ ¤   ¤   dataSize;
62f391 ¤   STableCell¤ ¤   theCell;
5267c5 ¤
d3a5a7 ¤   theCell.col = 1;
b43a15 ¤   theCell.row¤= rowIndex;
6d67c5 ¤
c3d209 ¤   dataSize = sizeof( testInfo );
f1041d ¤   GetCellData( theCell, &testInfo, dataSize );
901cd7 ¤   pgpAssert( dataSize == sizeof( testInfo ) );
3e67c5 ¤
dd920e ¤   if( testInfo.testDriveObj != nil )
5ac7a1 ¤   {
75cc8f ¤   ¤   testInfo.testDriveObj->Stop();
fc59a3 ¤   ¤   delete( testInfo.testDriveObj );
019371 ¤   }
1267c5 ¤
5d2908 ¤   RemoveRows( 1, rowIndex, TRUE );
0cefe6 }
b4af5a
4b6d52 ¤   void
0d42b8 CDiskTestsTable::DeleteSelectedTests(void)
dfbb36 {
5b8fb5 ¤   TableIndexT¤numRows;
fde23d ¤   TableIndexT¤numColumns;
31baa2 ¤   STableCell¤ theCell( 0, 0 );
1167c5 ¤
f6a4e4 ¤   while( GetNextSelectedCell( theCell ) )
44c7a1 ¤   {
07d6a2 ¤   ¤   DeleteTest( theCell.row );
161b52 ¤   ¤
--1ca5 0003df4fc1640120004 Page 3 of CDiskTestsTable.cp
40f57f ¤   ¤   theCell.row = theCell.col = 0;
699371 ¤   }
5eaf5a
61b4a2 ¤   GetTableSize( numRows, numColumns );
4d67c5 ¤
65efd3 ¤   if( numRows == 0 )
8489c5 ¤   ¤   StopIdling();
f6efe6 }
9aaf5a
1f6d52 ¤   void
009856 CDiskTestsTable::DeleteAllTests(void)
07bb36 {
9c8fb5 ¤   TableIndexT¤numRows;
a0e23d ¤   TableIndexT¤numColumns;
f580a4 ¤   TableIndexT¤rowIndex;
d967c5 ¤
64b4a2 ¤   GetTableSize( numRows, numColumns );
34b35f ¤   StopIdling();
af1b52 ¤   ¤
d400da ¤   for( rowIndex = numRows; rowIndex >= 1; rowIndex-- )
fdc7a1 ¤   {
fd110b ¤   ¤   DeleteTest( rowIndex );
e99371 ¤   }
2cefe6 }
e8af5a
8e6d52 ¤   void
c6bb31 CDiskTestsTable::DrawCell(
6b1bb3 ¤   const STableCell¤   &inCell,
46c050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
61bb36 {
9b8bff ¤   DiskTestInfo¤   testInfo;
be3c1e ¤   UInt32¤ ¤   ¤   dataSize;
3a3230 ¤   Rect¤   ¤   ¤   textRect;
146521 ¤   Str255¤ ¤   ¤   text;
91fded ¤   Str255¤ ¤   ¤   volName;
6e67c5 ¤
dcd209 ¤   dataSize = sizeof( testInfo );
0ad642 ¤   GetCellData( inCell, &testInfo, dataSize );
aa1cd7 ¤   pgpAssert( dataSize == sizeof( testInfo ) );
3c67c5 ¤
f7e7ed ¤   (void) GetVolumeName( testInfo.config.vRefNum, volName );
f7b3f6 ¤   PrintPString( text, "\p%s (Volume: %s)", testInfo.config.testName );
e0f7ab ¤   PrintPString( text, text, volName );
3667c5 ¤
b24eab ¤   textRect.left ¤ = inLocalRect.left + 5;
6bbbc6 ¤   textRect.right ¤= textRect.left + StringWidth( text ) + 2;
714ed2 ¤   textRect.top¤   = inLocalRect.top;
32c121 ¤   textRect.bottom¤= textRect.top + mTextHeight;
d167c5 ¤
e10fc6 ¤   AlignRect( &inLocalRect, &textRect, kAlignAtVerticalCenter );
5c67c5 ¤
1ee14a ¤   TETextBox( &text[1], text[0], &textRect, teJustLeft );
0aefe6 }
35af5a
496d52 ¤   void
80c8ce CDiskTestsTable::SpendTime(const EventRecord &inMacEvent)
83bb36 {
488fb5 ¤   TableIndexT¤numRows;
41e23d ¤   TableIndexT¤numColumns;
7880a4 ¤   TableIndexT¤rowIndex;
63af5a
f07172 ¤   #pragma unused( inMacEvent )
04af5a
bc0608 ¤   // Idle each of the active tests
5c67c5 ¤
ffb4a2 ¤   GetTableSize( numRows, numColumns );
171b52 ¤   ¤
6c0641 ¤   for( rowIndex = 1; rowIndex <= numRows; ++rowIndex )
75c7a1 ¤   {
55bcf7 ¤   ¤   DiskTestInfo¤   testInfo;
f00b16 ¤   ¤   UInt32¤ ¤   ¤   dataSize;
3d48c7 ¤   ¤   STableCell¤ ¤   theCell;
--ed19 0016819ec1040120004 Page 4 of CDiskTestsTable.cp
f11b52 ¤   ¤
9a49f6 ¤   ¤   dataSize ¤  = sizeof( testInfo );
63974b ¤   ¤   theCell.row¤= rowIndex;
9d0178 ¤   ¤   theCell.col¤= 1;
f71b52 ¤   ¤
465706 ¤   ¤   GetCellData( theCell, &testInfo, dataSize );
fa4fcc ¤   ¤   pgpAssert( dataSize == sizeof( testInfo ) );
111b52 ¤   ¤
c19c42 ¤   ¤   if( testInfo.testDriveObj != nil )
db5b34 ¤   ¤   {
0a94c8 ¤   ¤   ¤   testInfo.testDriveObj->Idle();
e80fe4 ¤   ¤   }
409371 ¤   }
3aefe6 }
d7af5a
c757db //¤ Broadcast message for a double-click on a cell
acaf5a
916d52 ¤   void
be4acd CDiskTestsTable::ClickCell(
81df40 ¤   const STableCell&¤  ¤   inCell,
1c067a ¤   const SMouseDownEvent&¤ inMouseDown)
66bb36 {
cf50ad ¤   #pragma unused( inCell, inMouseDown )
56af5a
8a15b7 ¤   if (GetClickCount() == 2)
75c7a1 ¤   {
45fbe5 ¤   ¤   if (mDoubleClickMsg != msg_Nothing)
925b34 ¤   ¤   {
cd9bae ¤   ¤   ¤   BroadcastMessage(mDoubleClickMsg, (void*) this);
640fe4 ¤   ¤   }
119371 ¤   }
4aefe6 }
a3af5a
685000 #endif¤ // ] PGP_DEBUG¶
--c03d 00127b3f28440120005 Page 1 of CDiskTestsTable.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
fdd4a9 ¤   $Id: CDiskTestsTable.h,v 1.4.8.1 1998/11/12 03:05:03 heller Exp $
20f7f7 ____________________________________________________________________________*/
c1af5a
957b7d #pragma once
3eaf5a
5e9ba8 #if PGP_DEBUG¤  // [
0aaf5a
041818 #include <LColumnView.h>
960a93 #include <LPeriodical.h>
1eaf5a
eb231f #include "CTestDrive.h"
3eaf5a
85b381 typedef struct DiskTestInfo
03bb36 {
11cd9b ¤   TestDriveConfiguration¤ config;
06d9d9 ¤   CTestDrive¤ ¤   ¤   ¤   *testDriveObj;
bcaf5a
73a11f } DiskTestInfo;
1caf5a
2a1c8e class CDiskTestsTable : public LColumnView, public LPeriodical
55bb36 {
f55ed4 public:
18a41e ¤   enum¤   ¤   ¤   ¤   { class_ID = 'DTbl' };
23af5a
00a1e8 ¤   ¤   ¤   ¤   ¤   ¤   CDiskTestsTable();
e804f9 ¤   ¤   ¤   ¤   ¤   ¤   CDiskTestsTable(LStream *inStream);
84c73a ¤   virtual¤¤   ¤   ¤   ~CDiskTestsTable();
06af5a
0c1c21 ¤   Boolean¤¤   ¤   ¤   AddTest(void);
e937a0 ¤   void¤   ¤   ¤   ¤   DeleteAllTests(void);
949489 ¤   void¤   ¤   ¤   ¤   DeleteSelectedTests(void);
c7e77a ¤   virtual Boolean¤¤   FocusDraw(LPane *pane);
34cc99 ¤   virtual¤void¤   ¤   SpendTime(const EventRecord &inMacEvent);
5caf5a
38a2d3 protected:
cfaf5a
e9da7b ¤   virtual void¤   ¤   ClickCell(const STableCell &inCell,
2f098f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent &inMouseDown);
c8d43f ¤   virtual void¤   ¤   DrawCell(const STableCell &inCell,
e49191 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect &inLocalRect);
18e40b ¤   virtual void¤   ¤   DrawSelf(void);
2e67c5 ¤
ba0fb9 private:
32af5a
68f587 ¤   short¤  ¤   ¤   ¤   mTextHeight;
2967c5 ¤
e4cb41 ¤   void¤   ¤   ¤   ¤   DeleteTest(TableIndexT rowIndex);
3382f7 };
85af5a
275000 #endif¤ // ] PGP_DEBUG¶
--83b8 00090095f9d40120006 Page 1 of CDiskTestsWindow.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
82d928 ¤   $Id: CDiskTestsWindow.cp,v 1.4.8.1 1998/11/12 03:05:04 heller Exp $
dff7f7 ____________________________________________________________________________*/
59af5a
7a9ba8 #if PGP_DEBUG¤  // [
5faf5a
9dd797 #include <LPushButton.h>
b6af5a
217dc1 #include "CDiskTestsTable.h"
e05e55 #include "CDiskTestsWindow.h"
24af5a
63cd05 const PaneIDT¤  kDiskTestsTableScrollerPaneID¤  = 21001;
ff353d const PaneIDT¤  kDiskTestsTablePaneID¤  ¤   ¤   = 21002;
390c29 const PaneIDT¤  kAddTestButtonPaneID¤   ¤   ¤   = 21003;
80bb46 const PaneIDT¤  kDeleteTestButtonPaneID¤¤   ¤   = 21004;
06fdf0 const PaneIDT¤  kDeleteAllTestsButtonPaneID¤¤   = 21005;
9daf5a
49591a const MessageT¤ msg_AddTest¤¤   ¤   ¤   = kAddTestButtonPaneID;
66bd39 const MessageT¤ msg_DeleteTest¤ ¤   ¤   = kDeleteTestButtonPaneID;
197c61 const MessageT¤ msg_DeleteAllTests¤ ¤   = kDeleteAllTestsButtonPaneID;
ddffc7 const MessageT¤ msg_SelectionChanged¤   = kDiskTestsTablePaneID;
55af5a
e0fbbe CDiskTestsWindow::CDiskTestsWindow()
3bbb36 {
b5efe6 }
a2af5a
c70d1b CDiskTestsWindow::CDiskTestsWindow(LStream *inStream)
90645c ¤   : LWindow(inStream)
5fbb36 {
ae998d ¤   mDiskTestsTable = nil;
3aefe6 }
77af5a
6ce609 CDiskTestsWindow::~CDiskTestsWindow()
6cbb36 {
f4043e ¤   if( mDiskTestsTable != nil )
7434b8 ¤   ¤   mDiskTestsTable->DeleteAllTests();
dfefe6 }
8caf5a
116d52 ¤   void
d0b504 CDiskTestsWindow::FinishCreateSelf(void)
89bb36 {
c92ee7 ¤   LPushButton¤*controlObj;
8a67c5 ¤
590305 ¤   LWindow::FinishCreateSelf();
b367c5 ¤
5cb75e ¤   controlObj = (LPushButton *) FindPaneByID( kAddTestButtonPaneID );
b41db0 ¤   pgpAssertAddrValid( controlObj, VoidAlign );
cdaf5a
b9e408 ¤   controlObj->AddListener( this );
d2af5a
b37fe1 ¤   mDeleteButtonObj = (LPushButton *) FindPaneByID( kDeleteTestButtonPaneID );
1c81d9 ¤   pgpAssertAddrValid( mDeleteButtonObj, VoidAlign );
bb67c5 ¤
d59f51 ¤   mDeleteButtonObj->AddListener( this );
797739 ¤   mDeleteButtonObj->Disable();¤   ¤
e9af5a
54d89b ¤   mDeleteAllButtonObj =
4e66ed ¤   ¤   ¤   (LPushButton *) FindPaneByID( kDeleteAllTestsButtonPaneID );
90f45f ¤   pgpAssertAddrValid( mDeleteAllButtonObj, VoidAlign );
03af5a
a4e9a0 ¤   mDeleteAllButtonObj->AddListener( this );
a78a9c ¤   mDeleteAllButtonObj->Disable();
4167c5 ¤
896493 ¤   mDiskTestsTable =
b004c4 ¤   ¤   ¤   (CDiskTestsTable *) FindPaneByID( kDiskTestsTablePaneID );
e3cbe1 ¤   pgpAssertAddrValid( mDiskTestsTable, CDiskTestsTable );
9067c5 ¤
24b81c ¤   mDiskTestsTable->AddListener( this );
90efe6 }
--c4b4 001060e300e40120006 Page 2 of CDiskTestsWindow.cp
e0af5a
2c6d52 ¤   void
72229f CDiskTestsWindow::AttemptClose(void)
cdbb36 {
618cf5 ¤   Hide();
6defe6 }
00af5a
ce6d52 ¤   void
8a947c CDiskTestsWindow::ListenToMessage(MessageT inMessage, void *ioParam)
9ebb36 {
914cda #pragma unused( ioParam )
8faf5a
2a769e ¤   switch( inMessage )
64c7a1 ¤   {
bfa168 ¤   ¤   case msg_AddTest:
9a5b34 ¤   ¤   {
a515ea ¤   ¤   ¤   if( mDiskTestsTable->AddTest() )
f1f776 ¤   ¤   ¤   {
ca2ef6 ¤   ¤   ¤   ¤   mDeleteAllButtonObj->Enable();
00a3a6 ¤   ¤   ¤   }
fc87c7 ¤   ¤   ¤
13cdcb ¤   ¤   ¤   break;
e80fe4 ¤   ¤   }
2aaf5a
8b8549 ¤   ¤   case msg_DeleteTest:
4a5b34 ¤   ¤   {
ae5ed7 ¤   ¤   ¤   STableCell¤ theCell(0,0);
e187c7 ¤   ¤   ¤
8defad ¤   ¤   ¤   mDiskTestsTable->DeleteSelectedTests();
f7d61b ¤   ¤   ¤   mDeleteButtonObj->Disable();
20af5a
46a6ef ¤   ¤   ¤   if( mDiskTestsTable->GetNextCell( theCell ) )
a1e39b ¤   ¤   ¤   {¤  ¤   ¤
658b4f ¤   ¤   ¤   ¤   mDeleteAllButtonObj->Enable();¤ ¤
daa3a6 ¤   ¤   ¤   }
67bb8c ¤   ¤   ¤   else
a8f776 ¤   ¤   ¤   {
2da9b3 ¤   ¤   ¤   ¤   mDeleteAllButtonObj->Disable();¤¤
99a3a6 ¤   ¤   ¤   }
4baf5a
4ecdcb ¤   ¤   ¤   break;
570fe4 ¤   ¤   }
bd1b52 ¤   ¤
69b5f0 ¤   ¤   case msg_DeleteAllTests:
745b34 ¤   ¤   {
6da520 ¤   ¤   ¤   mDiskTestsTable->DeleteAllTests();
e07212 ¤   ¤   ¤   mDeleteButtonObj->Disable();¤   ¤
7fe68d ¤   ¤   ¤   mDeleteAllButtonObj->Disable();¤¤
ffcdcb ¤   ¤   ¤   break;
940fe4 ¤   ¤   }
70ae30 ¤   ¤   ¤   ¤   ¤
57a6bc ¤   ¤   case msg_SelectionChanged:
775b34 ¤   ¤   {
2c754e ¤   ¤   ¤   STableCell¤ theCell;
1a87c7 ¤   ¤   ¤
3be660 ¤   ¤   ¤   theCell = mDiskTestsTable->GetFirstSelectedCell();
3b87c7 ¤   ¤   ¤
376414 ¤   ¤   ¤   if( mDiskTestsTable->IsValidCell( theCell ) )
f1f776 ¤   ¤   ¤   {
45004b ¤   ¤   ¤   ¤   mDeleteButtonObj->Enable();¤¤
e6a3a6 ¤   ¤   ¤   }
9abb8c ¤   ¤   ¤   else
56f776 ¤   ¤   ¤   {
403d2c ¤   ¤   ¤   ¤   mDeleteButtonObj->Disable();¤   ¤
71a3a6 ¤   ¤   ¤   }
0a87c7 ¤   ¤   ¤
accdcb ¤   ¤   ¤   break;
980fe4 ¤   ¤   }
689371 ¤   }
50efe6 }
069725 #endif¤ // ] Debug¶
--8365 0014581b2ad40120007 Page 1 of CDiskTestsWindow.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
4014f3 ¤   $Id: CDiskTestsWindow.h,v 1.3.8.1 1998/11/12 03:05:04 heller Exp $
6ff7f7 ____________________________________________________________________________*/
6baf5a
2c7b7d #pragma once
25af5a
729ba8 #if PGP_DEBUG¤  // [
a6af5a
e1f1a9 #include <LListener.h>
b58fd4 #include <LWindow.h>
baaf5a
0de7b1 class CDiskTestsTable;
b8af5a
d22b4c class CDiskTestsWindow : public LWindow, public LListener
d1bb36 {
afa2d3 protected:
f4af5a
0d80fd ¤   virtual void¤   ¤   FinishCreateSelf();
4267c5 ¤
715ed4 public:
012c3e ¤   enum { class_ID = 'DTst' };
8967c5 ¤
029fec ¤   ¤   ¤   ¤   ¤   ¤   CDiskTestsWindow();
09c2db ¤   ¤   ¤   ¤   ¤   ¤   CDiskTestsWindow(LStream *inStream);
3194aa ¤   ¤   ¤   ¤   ¤   ¤
536a15 ¤   virtual¤¤   ¤   ¤   ~CDiskTestsWindow();
d967c5 ¤
6a86da ¤   virtual¤void¤   ¤   AttemptClose(void);
27e629 ¤   virtual void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
5367c5 ¤
070fb9 private:
88af5a
190ebe ¤   CDiskTestsTable¤¤   *mDiskTestsTable;
446798 ¤   LControl¤   ¤   ¤   *mDeleteButtonObj;
e2ac6f ¤   LControl¤   ¤   ¤   *mDeleteAllButtonObj;
0a82f7 };
1aaf5a
455000 #endif¤ // ] PGP_DEBUG¶
--2125 000c1774fdb40120008 Page 1 of CEditDiskTestDialog.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
4fb0c0 ¤   $Id: CEditDiskTestDialog.cp,v 1.12.8.1 1998/11/12 03:05:05 heller Exp $
92f7f7 ____________________________________________________________________________*/
f6af5a
eb9ba8 #if PGP_DEBUG¤  // [
23af5a
a87c09 #include <LEditText.h>
540aae #include <LPopupButton.h>
3cdd56 #include <PP_Messages.h>
7cafac #include <UModalDialogs.h>
0d59c5 #include "CPGPStDialogHandler.h"
88af5a
9bc110 #include "pgpMacMemory.h"
3585c2 #include "MacStrings.h"
3375a9 #include "MacDriverUtils.h"
44af5a
bfba14 #include "PGPMountUtils.h"
59de36 #include "PGPDisk.h"
1faf5a
1f7dc1 #include "CDiskTestsTable.h"
757f0c #include "CEditDiskTestDialog.h"
0d9dc2 #include "CWarningAlert.h"
13af5a
e30ac1 const short¤¤   kEditDiskTestDialogResID¤   = 22000;
d94c4e const short¤¤   kVolumeMenuResID¤   ¤   ¤   = 22000;
e2af5a
cda464 const PaneIDT¤  kOKButtonPaneID¤¤   ¤   ¤   = 22001;
d58a46 const PaneIDT¤  kCancelButtonPaneID¤¤   ¤   = 22002;
ad9ff6 const PaneIDT¤  kVolumePopupMenuPaneID¤ ¤   = 22003;
a95ec5 const PaneIDT¤  kTestNameEditTextPaneID¤¤   = 22005;
69af5a
f4ff6b const PaneIDT¤  kDriverReadTasksEditTextPaneID¤ ¤   = 22102;
a72cc9 const PaneIDT¤  kDriverMinReadBlocksEditTextPaneID¤ = 22104;
eb0617 const PaneIDT¤  kDriverMaxReadBlocksEditTextPaneID¤ = 22106;
98bac3 const PaneIDT¤  kDriverWriteTasksEditTextPaneID¤¤   = 22112;
ec2f17 const PaneIDT¤  kDriverMinWriteBlocksEditTextPaneID¤= 22114;
5005c9 const PaneIDT¤  kDriverMaxWriteBlocksEditTextPaneID¤= 22116;
6caf5a
7cfe8d const PaneIDT¤  kFMReadTasksEditTextPaneID¤ ¤   ¤   = 22202;
ed81c9 const PaneIDT¤  kFMMinReadBytesEditTextPaneID¤  ¤   = 22204;
0c25b1 const PaneIDT¤  kFMMaxReadBytesEditTextPaneID¤  ¤   = 22206;
471ba7 const PaneIDT¤  kFMWriteTasksEditTextPaneID¤¤   ¤   = 22212;
468f49 const PaneIDT¤  kFMMinWriteBytesEditTextPaneID¤ ¤   = 22214;
d62b31 const PaneIDT¤  kFMMaxWriteBytesEditTextPaneID¤ ¤   = 22216;
2eaf5a
377e69 ¤   Boolean
1b38f6 DoEditDiskTestDialog(struct TestDriveConfiguration *testConfig)
8ebb36 {
c3c344 ¤   CPGPStDialogHandler¤¤   ¤   dialogHandler( kEditDiskTestDialogResID, nil );
82f424 ¤   CEditDiskTestDialog¤¤   *dialogObj;
568dc4 ¤   Boolean¤¤   ¤   ¤   ¤   valid;
8f67c5 ¤
17ec57 ¤   pgpAssertAddrValid( testConfig, TestDriveConfiguration );
ae67c5 ¤
90cbe1 ¤   dialogObj = (CEditDiskTestDialog *) dialogHandler.GetDialog();
f075ef ¤   if( IsNull( dialogObj ) )
e0c7a1 ¤   {
fa0e4d ¤   ¤   pgpDebugMsg( "DoEditDiskTestDialog: Nil dialog object" );
c5e20d ¤   ¤   return( FALSE );
6e9371 ¤   }
2767c5 ¤
cbe395 ¤   dialogObj->Show();
f667c5 ¤
853101 ¤   while (TRUE)
efc7a1 ¤   {
dd9881 ¤   ¤   MessageT¤   hitMessage = dialogHandler.DoDialog();
6baf5a
43df94 ¤   ¤   if( hitMessage == msg_Cancel )
c15b34 ¤   ¤   {
--5952 000b837e69b40120008 Page 2 of CEditDiskTestDialog.cp
2f0234 ¤   ¤   ¤   valid = FALSE;
e2cdcb ¤   ¤   ¤   break;
c50fe4 ¤   ¤   }
42cd78 ¤   ¤   else if( hitMessage == msg_OK &&
4cf874 ¤   ¤   ¤   ¤   ¤   dialogObj->GetTestConfiguration( testConfig ) )
a25b34 ¤   ¤   {
dbe412 ¤   ¤   ¤   valid = TRUE;
6ecdcb ¤   ¤   ¤   break;
660fe4 ¤   ¤   }
5c9371 ¤   }
1aaf5a
8b0fb9 ¤   dialogObj->Hide();
6267c5 ¤
4a0b09 ¤   return( valid );
abefe6 }
3faf5a
60ed5d CEditDiskTestDialog::CEditDiskTestDialog()
6fbb36 {
21efe6 }
c7af5a
40d59f CEditDiskTestDialog::CEditDiskTestDialog(LStream *inStream)
3b0078 ¤   : CPGPDiskDialog(inStream)
c7bb36 {
83efe6 }
a4af5a
0eb1d0 CEditDiskTestDialog::~CEditDiskTestDialog()
f4bb36 {
7aefe6 }
48af5a
676d52 ¤   void
bd37c1 CEditDiskTestDialog::FinishCreateSelf(void)
48bb36 {
ac1069 ¤   CPGPDiskDialog::FinishCreateSelf();
1d67c5 ¤
748edb ¤   AddMountedVolumesToPopup();
92efe6 }
74af5a
7e6d52 ¤   void
6af825 CEditDiskTestDialog::AddMountedVolumesToPopup(void)
dcbb36 {
b85805 ¤   MenuHandle¤ ¤   volumeMenu;
1e67c5 ¤
2f37ab ¤   pgpClearMemory( mVRefNumList, sizeof( mVRefNumList ) );
b267c5 ¤
e86f2d ¤   volumeMenu = GetMenu( kVolumeMenuResID );
ca9e96 ¤   AssertHandleIsValid( volumeMenu, nil );
0867c5 ¤
77919e ¤   if( volumeMenu != nil )
c6c7a1 ¤   {
576e73 ¤   ¤   HParamBlockRec¤ pb;
269f9c ¤   ¤   short¤  ¤   ¤   numMenuItems;
0b3317 ¤   ¤   short¤  ¤   ¤   menuItemIndex;
6a4c76 ¤   ¤   short¤  ¤   ¤   firstPGPDiskIndex;
e288ba ¤   ¤   OSStatus¤   ¤   status;
4e6b56 ¤   ¤   Str255¤ ¤   ¤   volumeName;
d7d8f8 ¤   ¤   short¤  ¤   ¤   driverRefNum;
7f8576 ¤   ¤   LPopupButton¤   ¤   *popupMenuObj;
8b1b52 ¤   ¤
8cea36 ¤   ¤   // Remove existing menu items, if any.
65593c ¤   ¤   numMenuItems = CountMItems( volumeMenu );
1077dd ¤   ¤   for( menuItemIndex = numMenuItems; menuItemIndex >= 1;
9198c1 ¤   ¤   ¤   ¤   menuItemIndex-- )
425b34 ¤   ¤   {
0f0a54 ¤   ¤   ¤   DeleteMenuItem( volumeMenu, menuItemIndex );
220fe4 ¤   ¤   }
b91b52 ¤   ¤
c8eb53 ¤   ¤   // Find the PGPDisk driver
3ab609 ¤   ¤   if( ! DriverIsInstalled( kPGPDiskDriverName, &driverRefNum ) )
519178 ¤   ¤   ¤   driverRefNum = 0;
181b52 ¤   ¤
249301 ¤   ¤   // Loop over all mounted volumes and add them to the menu.
b8800a ¤   ¤   // Volumes which cannot be tested are dimmed. PGPDisk are marked
--c239 0002c3d5aba40120008 Page 3 of CEditDiskTestDialog.cp
578861 ¤   ¤   // with a bullet character.
5c1b52 ¤   ¤
a57a37 ¤   ¤   firstPGPDiskIndex ¤ = 0;
56af07 ¤   ¤   menuItemIndex¤  ¤   = 1;
e91b52 ¤   ¤
7ad8cd ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
4d67c5 ¤
6bd437 ¤   ¤   pb.volumeParam.ioNamePtr = volumeName;
101b52 ¤   ¤
1c0c19 ¤   ¤   do
fe5b34 ¤   ¤   {
264e7c ¤   ¤   ¤   pb.volumeParam.ioVolIndex = menuItemIndex;
1baf5a
cfae52 ¤   ¤   ¤   status = PBHGetVInfoSync( &pb );
5afb92 ¤   ¤   ¤   if( IsntErr( status ) )
d9f776 ¤   ¤   ¤   {
325efb ¤   ¤   ¤   ¤   mVRefNumList[menuItemIndex - 1] = pb.volumeParam.ioVRefNum;
8c2b85 ¤   ¤   ¤   ¤
6461d9 ¤   ¤   ¤   ¤   AppendMenu( volumeMenu, volumeName );
cc2b85 ¤   ¤   ¤   ¤
20f1b9 ¤   ¤   ¤   ¤   // Check to see if it is a PGPDisk
d49b02 ¤   ¤   ¤   ¤   if( pb.volumeParam.ioVDRefNum != 0 &&
cec98d ¤   ¤   ¤   ¤   ¤   pb.volumeParam.ioVDRefNum == driverRefNum )
0072c3 ¤   ¤   ¤   ¤   {
ed3d1b ¤   ¤   ¤   ¤   ¤   if( firstPGPDiskIndex == 0 )
b2ca36 ¤   ¤   ¤   ¤   ¤   ¤   firstPGPDiskIndex = menuItemIndex;
d987c7 ¤   ¤   ¤
7eff87 ¤   ¤   ¤   ¤   ¤   SetItemIcon( volumeMenu, menuItemIndex, 1 );
d82613 ¤   ¤   ¤   ¤   }
102b85 ¤   ¤   ¤   ¤
d2189b ¤   ¤   ¤   ¤   // Check to see if we can test this volume
2f1d79 ¤   ¤   ¤   ¤   // Check for volume lock.
5b3573 ¤   ¤   ¤   ¤   if( ( pb.volumeParam.ioVAtrb & 0x8080 ) != 0 )
9172c3 ¤   ¤   ¤   ¤   {
fbcbe5 ¤   ¤   ¤   ¤   ¤   DisableItem( volumeMenu, menuItemIndex );
eb2613 ¤   ¤   ¤   ¤   }
242b85 ¤   ¤   ¤   ¤
b3959d ¤   ¤   ¤   ¤   ++menuItemIndex;
5ca3a6 ¤   ¤   ¤   }
df1b52 ¤   ¤
17753a ¤   ¤   } while( IsntErr( status ) );
4e1b52 ¤   ¤
895ab3 ¤   ¤   popupMenuObj = (LPopupButton *) FindPaneByID( kVolumePopupMenuPaneID );
47e0e0 ¤   ¤   pgpAssertAddrValid( popupMenuObj, VoidAlign );
fb67c5 ¤
90e48a ¤   ¤   popupMenuObj->SetMacMenuH( volumeMenu );
8f1b52 ¤   ¤
5a6880 ¤   ¤   if( firstPGPDiskIndex != 0 )
b35b34 ¤   ¤   {
98504f ¤   ¤   ¤   popupMenuObj->SetValue( firstPGPDiskIndex );
550fe4 ¤   ¤   }
4d0e1d ¤   ¤   else
595b34 ¤   ¤   {
e706f6 ¤   ¤   ¤   popupMenuObj->SetValue( 1 );
b30fe4 ¤   ¤   }
489371 ¤   }
22efe6 }
f2af5a
f81017 ¤   Int32
348291 CEditDiskTestDialog::GetEditFieldValue(PaneIDT editFieldPaneID)
e5bb36 {
9ea3e4 ¤   LEditText¤  *editFieldObj;
58af5a
f9381e ¤   editFieldObj = (LEditText *) FindPaneByID( editFieldPaneID );
426ffa ¤   pgpAssertAddrValid( editFieldObj, LEditText );
ea67c5 ¤
1b7d15 ¤   return( editFieldObj->GetValue() );
59efe6 }
66af5a
8c7e69 ¤   Boolean
ca1999 CEditDiskTestDialog::GetTestConfiguration(TestDriveConfiguration *testConfig)
2cbb36 {
--bacd 0003601e14e40120008 Page 4 of CEditDiskTestDialog.cp
6a2537 ¤   LEditText¤  ¤   *editFieldObj;
2caebc ¤   LPopupButton¤   *popupMenuObj;
8667c5 ¤
94ec57 ¤   pgpAssertAddrValid( testConfig, TestDriveConfiguration );
4167c5 ¤
0cfc01 ¤   pgpClearMemory( testConfig, sizeof( *testConfig ) );
6a67c5 ¤
f632d7 ¤   // Get test name
893990 ¤   editFieldObj = (LEditText *) FindPaneByID( kTestNameEditTextPaneID );
286ffa ¤   pgpAssertAddrValid( editFieldObj, LEditText );
7367c5 ¤
defcf9 ¤   editFieldObj->GetDescriptor( testConfig->testName );
8f53cb ¤   if( testConfig->testName[0] == 0 )
87c7a1 ¤   {
18f33d ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
7b80b9 ¤   ¤   ¤   ¤   "\pPlease enter a test name" );
2fe20d ¤   ¤   return( FALSE );
1a9371 ¤   }
6267c5 ¤
9dcff3 ¤   // Get test volume vRefNum
100fe3 ¤   popupMenuObj = (LPopupButton *) FindPaneByID( kVolumePopupMenuPaneID );
45f1c7 ¤   pgpAssertAddrValid( popupMenuObj, VoidAlign );
08af5a
ce0d7c ¤   pgpAssert( popupMenuObj->GetValue() >= 1 );
ef67c5 ¤
f00f72 ¤   testConfig->vRefNum = mVRefNumList[popupMenuObj->GetValue() - 1];
0067c5 ¤
944a20 ¤   // Driver read tasks
03dbef ¤   testConfig->numDriverReadTasks =
2c1f16 ¤   ¤   ¤   GetEditFieldValue( kDriverReadTasksEditTextPaneID );
f771f1 ¤   testConfig->minDriverReadBlocks =
fd0b01 ¤   ¤   ¤   GetEditFieldValue( kDriverMinReadBlocksEditTextPaneID );
de8ceb ¤   testConfig->maxDriverReadBlocks =
b3e9e3 ¤   ¤   ¤   GetEditFieldValue( kDriverMaxReadBlocksEditTextPaneID );
d2af5a
4242a3 ¤   if( testConfig->minDriverReadBlocks > testConfig->maxDriverReadBlocks )
77c7a1 ¤   {
27f33d ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
970567 ¤   ¤   ¤   ¤   "\pMinimum driver read blocks must not exceed maximum driver "
c41d31 ¤   ¤   ¤   ¤   "read blocks" );
2ee20d ¤   ¤   return( FALSE );
af9371 ¤   }
0daf5a
f7100b ¤   // Driver write tasks
6b1b01 ¤   testConfig->numDriverWriteTasks =
4a3600 ¤   ¤   ¤   GetEditFieldValue( kDriverWriteTasksEditTextPaneID );
5a3c01 ¤   testConfig->minDriverWriteBlocks =
6cf987 ¤   ¤   ¤   GetEditFieldValue( kDriverMinWriteBlocksEditTextPaneID );
ef8327 ¤   testConfig->maxDriverWriteBlocks =
523d79 ¤   ¤   ¤   GetEditFieldValue( kDriverMaxWriteBlocksEditTextPaneID );
d7af5a
43e24e ¤   if( testConfig->minDriverWriteBlocks > testConfig->maxDriverWriteBlocks )
c9c7a1 ¤   {
52f33d ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
4f1836 ¤   ¤   ¤   ¤   ¤   "\pMinimum driver write blocks must not exceed maximum "
5e8d8d ¤   ¤   ¤   ¤   ¤   "driver write blocks" );
1ae20d ¤   ¤   return( FALSE );
059371 ¤   }
f5af5a
084878 ¤   // FM read tasks
5f41e1 ¤   testConfig->numFMReadTasks ¤=
68f29b ¤   ¤   ¤   GetEditFieldValue( kFMReadTasksEditTextPaneID );
dec1a8 ¤   testConfig->minFMReadBytes ¤=
ba5bc7 ¤   ¤   ¤   GetEditFieldValue( kFMMinReadBytesEditTextPaneID );
cedc0b ¤   testConfig->maxFMReadBytes ¤=
769f72 ¤   ¤   ¤   GetEditFieldValue( kFMMaxReadBytesEditTextPaneID );
82af5a
f9e525 ¤   if( testConfig->minFMReadBytes > testConfig->maxFMReadBytes )
bac7a1 ¤   {
f5f33d ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
6e5b5b ¤   ¤   ¤   ¤   ¤   "\pMinimum file manager read bytes must not exceed "
36f598 ¤   ¤   ¤   ¤   ¤   "maximum file manger read bytes" );
--4b8e 001ff3ca77540120008 Page 5 of CEditDiskTestDialog.cp
a7e20d ¤   ¤   return( FALSE );
f39371 ¤   }
74af5a
4bcec4 ¤   // FM write tasks
6b0455 ¤   testConfig->numFMWriteTasks =
b56900 ¤   ¤   ¤   GetEditFieldValue( kFMWriteTasksEditTextPaneID );
b7076c ¤   testConfig->minFMWriteBytes =
ba802f ¤   ¤   ¤   GetEditFieldValue( kFMMinWriteBytesEditTextPaneID );
811acf ¤   testConfig->maxFMWriteBytes =
e762cd ¤   ¤   ¤   GetEditFieldValue( kFMMaxWriteBytesEditTextPaneID );
dbaf5a
76bf4c ¤   if( testConfig->minFMWriteBytes > testConfig->maxFMWriteBytes )
82c7a1 ¤   {
5df33d ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
a1fe73 ¤   ¤   ¤   ¤   ¤   "\pMinimum file manager write bytes must not exceed "
02861d ¤   ¤   ¤   ¤   ¤   "maximum file manger write bytes" );
ace20d ¤   ¤   return( FALSE );
a99371 ¤   }
73af5a
c11966 ¤   return( TRUE );
1eefe6 }
08af5a
ffea9f #endif¤ // ] PGP_DEBUG
--269e 0014f8bdd3f40120009 Page 1 of CEditDiskTestDialog.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
d6e3d0 ¤   $Id: CEditDiskTestDialog.h,v 1.7.8.1 1998/11/12 03:05:06 heller Exp $
e0f7f7 ____________________________________________________________________________*/
3baf5a
747b7d #pragma once
73af5a
899ba8 #if PGP_DEBUG¤  // [
59af5a
a6ab5f #include "CPGPDiskDialog.h"
d5af5a
7835f2 struct TestDriveConfiguration;
f4af5a
0f775c class CEditDiskTestDialog : public CPGPDiskDialog
f5bb36 {
3e5ed4 public:
d4af5a
1d61c3 ¤   enum { class_ID = 'ETst' };
f467c5 ¤
1ec510 ¤   ¤   ¤   ¤   ¤   CEditDiskTestDialog();
260c4f ¤   ¤   ¤   ¤   ¤   CEditDiskTestDialog(LStream *inStream);
3ce60c ¤   virtual¤¤   ¤   ~CEditDiskTestDialog();
fdaf5a
bdd7d9 ¤   Boolean¤¤   ¤   GetTestConfiguration(
31786a ¤   ¤   ¤   ¤   ¤   ¤   ¤   struct TestDriveConfiguration *testConfig);
0caf5a
60a2d3 protected:
08af5a
3ca2f8 ¤   virtual void¤   FinishCreateSelf(void);
4267c5 ¤
2e0fb9 private:
4eaf5a
55fa16 ¤   short¤  ¤   ¤   mVRefNumList[100];
b267c5 ¤
3f66dd ¤   void¤   ¤   ¤   AddMountedVolumesToPopup(void);
5439f7 ¤   Int32¤  ¤   ¤   GetEditFieldValue(PaneIDT editFieldPaneID);
ed82f7 };
3faf5a
fad9af Boolean¤¤   DoEditDiskTestDialog(struct TestDriveConfiguration *testConfig);
9aaf5a
4f5000 #endif¤ // ] PGP_DEBUG¶
--07eb 00086d63fc14012000a Page 1 of CGetPassphraseDialog.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
f2cd69 ¤   $Id: CGetPassphraseDialog.cp,v 1.10.8.1 1998/11/12 03:05:06 heller Exp $
2af7f7 ____________________________________________________________________________*/
c6af5a
558708 #include <LCheckBox.h>
6ddd56 #include <PP_Messages.h>
58afac #include <UModalDialogs.h>
e8c110 #include "pgpMacMemory.h"
9085c2 #include "MacStrings.h"
0caf5a
23de36 #include "PGPDisk.h"
9cbdd3 #include "PGPDiskBeta.h"
512465 #include "PGPDiskFileFormat.h"
ba0927 #include "PGPDiskResources.h"
16e5dd #include "PGPDiskUtils.h"
7caf5a
ed0fdb #include "CGetPassphraseDialog.h"
73829c #include "CPassphraseEdit.h"
ca59c5 #include "CPGPStDialogHandler.h"
e6af5a
f04739 const short¤¤   kGetPassphraseDialogResID ¤ = 4000;
2faf5a
8b2a5a const PaneIDT¤  kReadOnlyCheckboxPaneID ¤   = 5007;
9faf5a
ee6bdb //¤ Presents the get passphrase dialog to the user until the user aborts or
f45891 //¤ enters a passphrase of the correct format. If the user chooses to set a
d7e0ef //¤ new passphrase, *changePassphrase is TRUE
3faf5a
972473 ¤   static OSStatus
bc5887 DoCommonGetPassphraseDialog(
74d4bf ¤   ConstStr255Param ¤  prompt,
283e27 ¤   Boolean¤¤   ¤   ¤   defaultReadOnly,
75e2b1 ¤   Boolean¤¤   ¤   ¤   disableReadOnly,
a9f43b ¤   Boolean¤¤   ¤   ¤   hideReadOnly,
2678e4 ¤   StringPtr ¤ ¤   ¤   passphrase,
296da2 ¤   Boolean¤¤   ¤   ¤   *mountReadOnly)
8fbb36 {
ee6b93 ¤   CPGPStDialogHandler¤¤   dialogHandler( kGetPassphraseDialogResID, nil );
6028f7 ¤   CGetPassphraseDialog¤   *dialogObj;
14a94f ¤   OSStatus¤   ¤   ¤   ¤   status;
8167c5 ¤
a7b6fc ¤   pgpAssertAddrValid( prompt, uchar );
bb8da6 ¤   pgpAssertAddrValid( passphrase, uchar );
03d75c ¤   pgpAssertAddrValid( mountReadOnly, Boolean );
e967c5 ¤
73adc1 ¤   status = noErr;
6a67c5 ¤
bfe15a ¤   dialogObj = (CGetPassphraseDialog *) dialogHandler.GetDialog();
6275ef ¤   if( IsNull( dialogObj ) )
e0c7a1 ¤   {
5c7314 ¤   ¤   pgpDebugMsg( "GetNewPassphraseForDisk: Nil dialog object" );
a7f848 ¤   ¤   return( memFullErr );
669371 ¤   }
7f67c5 ¤
8bb726 ¤   dialogObj->SetPrompt( prompt );
84652e ¤   dialogObj->SetReadOnlyStatus( defaultReadOnly, disableReadOnly,
31dd38 ¤   ¤   ¤   ¤   ¤   hideReadOnly );
2767c5 ¤
02e395 ¤   dialogObj->Show();
8467c5 ¤
1b3101 ¤   while (TRUE)
b9c7a1 ¤   {
829881 ¤   ¤   MessageT¤   hitMessage = dialogHandler.DoDialog();
cdaf5a
4edf94 ¤   ¤   if( hitMessage == msg_Cancel )
a45b34 ¤   ¤   {
0449b2 ¤   ¤   ¤   status = userCanceledErr;
93cdcb ¤   ¤   ¤   break;
860fe4 ¤   ¤   }
--2ce2 000f96378234012000a Page 2 of CGetPassphraseDialog.cp
7744d7 ¤   ¤   else if( hitMessage == msg_OK )
6e5b34 ¤   ¤   {
25a222 ¤   ¤   ¤   dialogObj->GetPassphrase( passphrase );
83b178 ¤   ¤   ¤   *mountReadOnly = dialogObj->GetReadOnlyStatus();
d387c7 ¤   ¤   ¤
aecdcb ¤   ¤   ¤   break;
760fe4 ¤   ¤   }
ef9371 ¤   }
71af5a
240fb9 ¤   dialogObj->Hide();
4367c5 ¤
db4afd ¤   return( status );
bdefe6 }
56af5a
5e6bdb //¤ Presents the get passphrase dialog to the user until the user aborts or
881946 //¤ enters a passphrase of the correct format.
d0af5a
3b85ea ¤   OSStatus
159910 DoMountDiskPassphraseDialog(
8d57a4 ¤   const FSSpec¤   *fileSpec,
476efd ¤   Boolean¤¤   ¤   forceReadOnly,
e58545 ¤   StringPtr ¤ ¤   passphrase,
511a2f ¤   Boolean¤¤   ¤   *mountReadOnly)
30bb36 {
c3cac1 ¤   Str255¤ ¤   prompt;
c7323e ¤   OSStatus¤   status = noErr;
ec6147 ¤   Boolean¤¤   readOnly;
0967c5 ¤
4c8820 ¤   AssertSpecIsValid( fileSpec, "DoMountDiskPassphraseDialog" );
f88da6 ¤   pgpAssertAddrValid( passphrase, uchar );
b8d75c ¤   pgpAssertAddrValid( mountReadOnly, Boolean );
32af5a
51b4d1 ¤   GetIndString( prompt, kDialogStringListResID,
e4932d ¤   ¤   ¤   kGetPassphraseDialogPromptStrIndex );
be6cd4 ¤   PrintPString( prompt, prompt, fileSpec->name );
5d67c5 ¤
6593c1 ¤   readOnly = forceReadOnly;
1160a8 ¤   if( ! readOnly )
56c7a1 ¤   {
3af051 ¤   ¤   PGPDiskFileInfo¤¤   fileInfo;
b21b52 ¤   ¤
c5d6a2 ¤   ¤   status = GetPGPDiskFileInfo( fileSpec, &fileInfo );
52706e ¤   ¤   if( IsntErr( status ) )
225b34 ¤   ¤   {
38088d ¤   ¤   ¤   readOnly = fileInfo.fileIsOnLockedVolume || fileInfo.fileIsLocked;
2d0fe4 ¤   ¤   }
ff9371 ¤   }
c367c5 ¤
1edd30 ¤   if( IsntErr( status ) )
5dc7a1 ¤   {
9c02c5 ¤   ¤   status = DoCommonGetPassphraseDialog( prompt, readOnly, readOnly,
2e8f8e ¤   ¤   ¤   ¤   ¤   ¤   FALSE, passphrase, mountReadOnly );
4d9371 ¤   }
7d67c5 ¤
534afd ¤   return( status );
99efe6 }
10af5a
f26bdb //¤ Presents the get passphrase dialog to the user until the user aborts or
cc1946 //¤ enters a passphrase of the correct format.
a7af5a
1185ea ¤   OSStatus
238294 DoGetOldPassphraseDialog(
5b2966 ¤   ConstStr255Param ¤  diskName,
66065c ¤   StringPtr ¤ ¤   ¤   passphrase)
86bb36 {
70cac1 ¤   Str255¤ ¤   prompt;
13c412 ¤   OSStatus¤   status;
214123 ¤   Boolean¤¤   mountReadOnly;
7f67c5 ¤
a8c79c ¤   pgpAssertAddrValid( diskName, uchar );
da8da6 ¤   pgpAssertAddrValid( passphrase, uchar );
f9af5a
--47af 000606663b64012000a Page 3 of CGetPassphraseDialog.cp
f2b4d1 ¤   GetIndString( prompt, kDialogStringListResID,
185c72 ¤   ¤   ¤   kOldPassphraseDialogPromptStrIndex );
19274e ¤   PrintPString( prompt, prompt, diskName );
4e67c5 ¤
6aa151 ¤   status = DoCommonGetPassphraseDialog( prompt, FALSE, FALSE, TRUE,
61533e ¤   ¤   ¤   ¤   ¤   passphrase, &mountReadOnly );
3a67c5 ¤
664afd ¤   return( status );
8eefe6 }
4aaf5a
bd96f0 //¤ Presents the remove passphrase dialog to the user until the user aborts or
2e1946 //¤ enters a passphrase of the correct format.
ceaf5a
6d85ea ¤   OSStatus
40aceb DoGetRemovePassphraseDialog(
fe2966 ¤   ConstStr255Param ¤  diskName,
0c065c ¤   StringPtr ¤ ¤   ¤   passphrase)
72bb36 {
77cac1 ¤   Str255¤ ¤   prompt;
3bc412 ¤   OSStatus¤   status;
494123 ¤   Boolean¤¤   mountReadOnly;
8567c5 ¤
50c79c ¤   pgpAssertAddrValid( diskName, uchar );
e38da6 ¤   pgpAssertAddrValid( passphrase, uchar );
85af5a
91b4d1 ¤   GetIndString( prompt, kDialogStringListResID,
870086 ¤   ¤   ¤   kRemovePassphraseDialogPromptStrIndex );
fc274e ¤   PrintPString( prompt, prompt, diskName );
b167c5 ¤
5ca151 ¤   status = DoCommonGetPassphraseDialog( prompt, FALSE, FALSE, TRUE,
48533e ¤   ¤   ¤   ¤   ¤   passphrase, &mountReadOnly );
cc67c5 ¤
6f4afd ¤   return( status );
6fefe6 }
08af5a
736bdb //¤ Presents the get passphrase dialog to the user until the user aborts or
c1e930 //¤ enters the master passphrase.
b5af5a
ef85ea ¤   OSStatus
20e1a8 DoGetMasterPassphraseDialog(
ee2966 ¤   ConstStr255Param ¤  diskName,
2f9bb9 ¤   StringPtr ¤ ¤   ¤   masterPassphrase)
1cbb36 {
8bcac1 ¤   Str255¤ ¤   prompt;
34c412 ¤   OSStatus¤   status;
664123 ¤   Boolean¤¤   mountReadOnly;
2e67c5 ¤
8dc79c ¤   pgpAssertAddrValid( diskName, uchar );
c4be24 ¤   pgpAssertAddrValid( masterPassphrase, uchar );
2eaf5a
19b4d1 ¤   GetIndString( prompt, kDialogStringListResID,
34a6f6 ¤   ¤   ¤   kMasterPassphraseDialogPromptStrIndex );
e3274e ¤   PrintPString( prompt, prompt, diskName );
2a67c5 ¤
59a151 ¤   status = DoCommonGetPassphraseDialog( prompt, FALSE, FALSE, TRUE,
58a3ad ¤   ¤   ¤   ¤   ¤   ¤   masterPassphrase, &mountReadOnly );
aa67c5 ¤
aa4afd ¤   return( status );
56efe6 }
76af5a
246df5 CGetPassphraseDialog::CGetPassphraseDialog()
a5bb36 {
75efe6 }
6eaf5a
182738 CGetPassphraseDialog::CGetPassphraseDialog(LStream *inStream)
6415c5 ¤   : CPassphraseDialog(inStream)
03bb36 {
52efe6 }
1eaf5a
8c1d16 CGetPassphraseDialog::~CGetPassphraseDialog()
3bbb36 {
60efe6 }
--268e 0013c845e594012000a Page 4 of CGetPassphraseDialog.cp
e0af5a
e77e69 ¤   Boolean
db4d11 CGetPassphraseDialog::GetReadOnlyStatus(void)
d2bb36 {
0f960c ¤   LCheckBox¤  *readOnlyCheckboxObj;
fb67c5 ¤
39ae9c ¤   readOnlyCheckboxObj = (LCheckBox *) FindPaneByID( kReadOnlyCheckboxPaneID );
281351 ¤   pgpAssertAddrValid( readOnlyCheckboxObj, VoidAlign);
5167c5 ¤
c84942 ¤   return( readOnlyCheckboxObj->GetValue() == kControlCheckBoxCheckedValue );
89efe6 }
5baf5a
476d52 ¤   void
7c323c CGetPassphraseDialog::SetReadOnlyStatus(
a3f1c6 ¤   Boolean¤readOnly,
ccbfb6 ¤   Boolean¤disableCheckbox,
17d277 ¤   Boolean¤hideCheckbox)
d8bb36 {
71960c ¤   LCheckBox¤  *readOnlyCheckboxObj;
a4af5a
e19838 #if BETA
a76711 ¤   if ( BetaExpired() )
73c7a1 ¤   {
f36f3b ¤   ¤   readOnly¤   ¤   = TRUE;
c15057 ¤   ¤   disableCheckbox¤= TRUE;
159371 ¤   }
1b7454 #endif
00af5a
e0ef66 ¤   readOnlyCheckboxObj =
49b959 ¤   ¤   ¤   (LCheckBox *) FindPaneByID( kReadOnlyCheckboxPaneID );
401351 ¤   pgpAssertAddrValid( readOnlyCheckboxObj, VoidAlign);
d967c5 ¤
036c08 ¤   readOnlyCheckboxObj->SetValue( readOnly ?
080fd9 ¤   ¤   ¤   kControlCheckBoxCheckedValue : 0 );
6d67c5 ¤
d2cd0c ¤   if( hideCheckbox )
afc7a1 ¤   {
fcce09 ¤   ¤   readOnlyCheckboxObj->Hide();
169371 ¤   }
9e67c5 ¤
1bbf82 ¤   if( disableCheckbox )
9ac7a1 ¤   {
10d67e ¤   ¤   readOnlyCheckboxObj->Disable();
b29371 ¤   }
3cefe6 }
--c9a7 001abbb810c4012000b Page 1 of CGetPassphraseDialog.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
f0cb79 ¤   $Id: CGetPassphraseDialog.h,v 1.2.8.1 1998/11/12 03:05:07 heller Exp $
f1f7f7 ____________________________________________________________________________*/
c9af5a
f27b7d #pragma once
acaf5a
7f8495 #include "CPassphraseDialog.h"
ffaf5a
da3361 class CPassphraseField;
60af5a
343dd3 class CGetPassphraseDialog : public CPassphraseDialog
3dbb36 {
7d5ed4 public:
e0af5a
013756 ¤   enum { class_ID = 'GPhr' };
c967c5 ¤
faa82a ¤   ¤   ¤   ¤   ¤   CGetPassphraseDialog();
f572e4 ¤   virtual¤¤   ¤   ~CGetPassphraseDialog();
149ebf ¤   ¤   ¤   ¤   ¤   CGetPassphraseDialog(LStream *inStream);
52af5a
676a74 ¤   Boolean¤¤   ¤   GetReadOnlyStatus(void);
03f9eb ¤   void¤   ¤   ¤   SetReadOnlyStatus(Boolean readOnly,
bf5757 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean disableCheckbox, Boolean hideCheckbox);
fd82f7 };
56af5a
8face7 OSStatus¤   DoMountDiskPassphraseDialog(const FSSpec *fileSpec,
41d5d1 ¤   ¤   ¤   ¤   ¤   Boolean forceReadOnly, StringPtr passphrase,
879615 ¤   ¤   ¤   ¤   ¤   Boolean *mountReadOnly);
813481 OSStatus¤   DoGetOldPassphraseDialog(ConstStr255Param diskName,
004e29 ¤   ¤   ¤   ¤   ¤   StringPtr passphrase);
aa616a OSStatus¤   DoGetMasterPassphraseDialog(ConstStr255Param diskName,
1176b7 ¤   ¤   ¤   ¤   ¤   StringPtr masterPassphrase);
efd907 OSStatus¤   DoGetRemovePassphraseDialog(ConstStr255Param diskName,
abfdd6 ¤   ¤   ¤   ¤   ¤   StringPtr masterPassphrase);¶
--8e61 001a14fd8114012000c Page 1 of CMainWindow.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
92ce8e ¤   $Id: CMainWindow.cp,v 1.5.8.1 1998/11/12 03:05:07 heller Exp $
9bf7f7 ____________________________________________________________________________*/
5faf5a
2bb86a #include "MacQuickdraw.h"
fd85c2 #include "MacStrings.h"
8c75de #include <UWindows.h>
82af5a
41ffe3 #include <UGraphicUtils.h>
c4af5a
6de5dd #include "PGPDiskUtils.h"
adaf5a
b44b63 #include "CMainWindow.h"
5aaf5a
5067c5 ¤
e75f97 CMainWindow::CMainWindow()
4dbb36 {
2fefe6 }
89af5a
b9cbd8 CMainWindow::CMainWindow(LStream *inStream)
f36386 ¤   : CPGPDiskWindow(inStream)
4cbb36 {
6defe6 }
97af5a
ae3e72 CMainWindow::~CMainWindow()
a6bb36 {
89efe6 }
27af5a
cdaf5a
b549b6 //¤ Validates that the window will be visible and moveable before calling
48fbc6 //¤ the real DoSetPosition().
41af5a
1a6d52 ¤   void
34ea47 CMainWindow::DoSetPosition( Point inPosition)¤  // Top left in global coords
21bb36 {
f764a7 ¤   RgnHandle¤  myGrayRgn = NewRgn();
cd5019 ¤   Rect¤   ¤   windowRect;
3c4194 ¤   Point¤  ¤   upperRight;
a367c5 ¤
ab6399 ¤   AssertHandleIsValid( myGrayRgn, "DoSetPosition" );
d067c5 ¤
401cb2 ¤   CopyRgn( GetGrayRgn(), myGrayRgn );
c27ce1 ¤   InsetRgn( myGrayRgn, 10, 10 );
3a67c5 ¤
cdf680 ¤   windowRect ¤= UWindows::GetWindowContentRect( mMacWindowP );
9eaf5a
5568ce ¤   upperRight¤ ¤   = inPosition;
683b49 ¤   upperRight.h¤   = inPosition.h + UGraphicUtils::RectWidth( windowRect );
2467c5 ¤
f9f2d5 ¤   if( PtInRgn( inPosition, myGrayRgn ) ||
c610fa ¤   ¤   PtInRgn( upperRight, myGrayRgn ) )
eec7a1 ¤   {
4b40a0 ¤   ¤   CPGPDiskWindow::DoSetPosition( inPosition );
009371 ¤   }
9f67c5 ¤
950092 ¤   DisposeRgn( myGrayRgn );
9eefe6 }
a1af5a
--64af 001c814aa014012000d Page 1 of CMainWindow.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
2b5ba9 ¤   $Id: CMainWindow.h,v 1.3.8.1 1998/11/12 03:05:08 heller Exp $
4bf7f7 ____________________________________________________________________________*/
76af5a
977b7d #pragma once
11af5a
62d67a #include "CPGPDiskWindow.h"
33af5a
dc729a class CMainWindow : public CPGPDiskWindow
e8bb36 {
4e5ed4 public:
dc4def ¤   enum { class_ID = 'MWnd' };
5567c5 ¤
491d5c ¤   ¤   ¤   ¤   ¤   ¤   CMainWindow();
f2acd4 ¤   ¤   ¤   ¤   ¤   ¤   CMainWindow(LStream *inStream);
9c94aa ¤   ¤   ¤   ¤   ¤   ¤
a5ded2 ¤   virtual¤¤   ¤   ¤   ~CMainWindow();
9794aa ¤   ¤   ¤   ¤   ¤   ¤
6d8aee ¤   virtual void¤   ¤   DoSetPosition(Point inPosition);
c882f7 };
--213e 00092eb51b14012000e Page 1 of CNewDiskWizardDialog.cp
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
397cec ¤   $Id: CNewDiskWizardDialog.cp,v 1.8.8.1 1998/11/12 03:05:09 heller Exp $
9df7f7 ____________________________________________________________________________*/
c6af5a
f68708 #include <LCheckBox.h>
597c09 #include <LEditText.h>
2249f7 #include <LProgressBar.h>
6dd797 #include <LPushButton.h>
ff40db #include <LRadioButton.h>
e105c6 #include <LStaticText.h>
dcdd56 #include <PP_Messages.h>
f5dd06 #include <UDesktop.h>
8b7c99 #include <URegistrar.h>
ff17f9 #include <UReanimator.h>
3eaf5a
b5be29 #if PGP_BUSINESS_SECURITY
48a076 #include "pgpKeys.h"
a24919 #include "pgpUtilities.h"
ed7454 #endif
72af5a
ba829c #include "CPassphraseEdit.h"
fb9dc2 #include "CWarningAlert.h"
0d5286 #include "MacDialogs.h"
a2bbf4 #include "MacFiles.h"
b685c2 #include "MacStrings.h"
a10d08 #include "pgpMem.h"
2bafa7 #include "pgpPassphraseUtils.h"
5eaf5a
23f526 #include "CNewDiskWizardDialog.h"
e5ef42 #include "CPGPDiskApplication.h"
c4546f #include "PGPDiskFile.h"
d78ec6 #include "PGPDiskPreferences.h"
be0927 #include "PGPDiskResources.h"
d8e5dd #include "PGPDiskUtils.h"
3e3c1e #include "randpool.h"
9daf5a
e20dbd // The number of random data points needed is approximately the number of
2b244c // bits we need. Right now that is 64 bits for the salt and 128 bits for
2592b9 // the encrypted key. We use 300 here to give ourselves a margin.
62af5a
80e5c2 #define kRandomDataSampleCount¤ 300
63af5a
e042f8 const ResIDT¤   ¤   view_Introduction¤  ¤   ¤   = 8100;
ca00b6 const ResIDT¤   ¤   view_GetInfo¤   ¤   ¤   ¤   = 8200;
5e2341 const ResIDT¤   ¤   view_GetPassphrase¤ ¤   ¤   = 8300;
0c57cc const ResIDT¤   ¤   view_GatherRandomData¤  ¤   = 8400;
326ac3 const ResIDT¤   ¤   view_Formatting¤¤   ¤   ¤   = 8500;
4edec7 const ResIDT¤   ¤   view_Error¤ ¤   ¤   ¤   ¤   = 8600;
84a488 const ResIDT¤   ¤   view_Conclusion¤¤   ¤   ¤   = 8700;
58af5a
f4be29 #if PGP_BUSINESS_SECURITY
059476 const ResIDT¤   ¤   view_ADKWarning¤¤   ¤   ¤   = 8350;
767454 #endif
f8af5a
a602f4 const MessageT¤ ¤   kNextViewMessage¤   ¤   ¤   = 'Next';
dac5f3 const MessageT¤ ¤   kPreviousViewMessage¤   ¤   = 'Prev';
211c92 const MessageT¤ ¤   kAllowNextViewSwitchMessage¤= 'ANxt';
0ff582 const MessageT¤ ¤   kAllowPrevViewSwitchMessage¤= 'APrv';
a96e96 const MessageT¤ ¤   kDenyNextViewSwitchMessage¤ = 'DNxt';
8c7c5c const MessageT¤ ¤   kDenyPrevViewSwitchMessage¤ = 'DPrv';
a7349b const MessageT¤ ¤   kDenyCancelMessage¤ ¤   ¤   = 'DCan';
5faf5a
f543d2 const PaneIDT¤  ¤   kNextButtonPaneID¤  ¤   ¤   = 'bNxt';
93fe78 const PaneIDT¤  ¤   kPreviousButtonPaneID¤  ¤   = 'bPrv';
c9243b const PaneIDT¤  ¤   kCancelButtonPaneID¤¤   ¤   = 'bCan';
94af5a
8f48c0 const PaneIDT¤  ¤   kGetInfoDescTextPaneID¤ ¤   = 'cDes';
791262 const PaneIDT¤  ¤   kDiskNameEditTextPaneID¤¤   = 'eNam';
920c1c const PaneIDT¤  ¤   kDiskSizeEditTextPaneID¤¤   = 'eSiz';
--4589 00016fd90cc4012000e Page 2 of CNewDiskWizardDialog.cp
c46f6e const PaneIDT¤  ¤   kKBRadioButtonPaneID¤   ¤   = 'rKB ';
39f265 const PaneIDT¤  ¤   kMBRadioButtonPaneID¤   ¤   = 'rMB ';
0daf5a
0af9ff const PaneIDT¤  ¤   kADKUserIDTextPaneID¤   ¤   = 'cADK';
ceaf5a
4c3b0e const PaneIDT¤  ¤   kPassphraseEditTextPaneID¤  = 'ePas';
a490e7 const PaneIDT¤  ¤   kConfirmationEditTextPaneID¤= 'eCon';
9b036e const PaneIDT¤  ¤   kHideTypingCheckboxPaneID¤  = 'xHid';
9f523f const PaneIDT¤  ¤   kQualityProgressBarPaneID¤  = 'pbPQ';
80af5a
22f6ea const PaneIDT¤  ¤   kRandomProgressBarPaneID¤   = 'pbRD';
8c560a const PaneIDT¤  ¤   kClickNextTextPaneID¤   ¤   = 'cNxt';
10af5a
bb8601 const PaneIDT¤  ¤   kFormattingNameTextPaneID¤  = 'cFmt';
4046ca const PaneIDT¤  ¤   kFormattingProgressBarPaneID¤   = 'pbFM';
83af5a
1d9d4f const PaneIDT¤  ¤   kErrorTextPaneID¤   ¤   ¤   = 'cErr';
a7af5a
b89339 const MessageT¤ ¤   msg_ChangedDiskName¤¤   ¤   = kDiskNameEditTextPaneID;
919bea const MessageT¤ ¤   msg_ChangedDiskSize¤¤   ¤   = kDiskSizeEditTextPaneID;
15802a const MessageT¤ ¤   msg_HideTyping¤ ¤   ¤   ¤   = kHideTypingCheckboxPaneID;
84c088 const MessageT¤ ¤   msg_ChangedPassphrase¤  ¤   = kPassphraseEditTextPaneID;
dbe915 const MessageT¤ ¤   msg_ChangedConfirmation¤¤   = kConfirmationEditTextPaneID;
d9af5a
337c37 NewDiskView¤¤   CNewDiskWizardDialog::mNewView ¤¤   = kNewDiskView_Invalid;
2b3653 CComboError¤¤   CNewDiskWizardDialog::mNewDiskError;
d0af5a
22a750 LProgressBar¤   *CNewDiskWizardDialog::mFormattingProgressBar = NULL;
b9af5a
3fc0ea #pragma mark ------GetNewPGPDiskFSSpec--------
1baf5a
c7fad8 enum¤
25bb36 {
da8d6a ¤   kNewPGPDiskSFDialogResID¤   ¤   = 2002,
a1e528 ¤   kNewPGPDiskMinimumSizeInK¤  ¤   = 400,
efa841 ¤   kNewPGPDiskMaximumSizeInMB¤ ¤   = 2047L,
09dc76 ¤   kNewPGPDiskMaximumSizeInK¤  ¤   = ( kNewPGPDiskMaximumSizeInMB * 1024L ),
da67c5 ¤
7daaaa ¤   kAvailableFreeSpaceStaticText¤  = 13
dc82f7 };
d3af5a
f0ad97 typedef struct NewPGPDiskSFData
b8bb36 {
fd04da ¤   short¤  ¤   ¤   ¤   curVRefNum;
455c56 ¤   StandardFileReply¤  *sfReply;
37af5a
348efb } NewPGPDiskSFData;
79af5a
8b9280 ¤   static UInt32
bf29b4 GetVolumeFreeSpaceInK(short vRefNum)
41bb36 {
3bb02f ¤   UInt32¤ freeAllocBlocks;
5e213e ¤   UInt32¤ allocBlockSize;
5af829 ¤   UInt32¤ freeKilobytes = 0;
2f67c5 ¤
ef894e ¤   if( GetVolumeBlockCounts( vRefNum, &freeAllocBlocks, NULL,
a6c792 ¤   ¤   ¤   ¤   &allocBlockSize ) == noErr )
05c7a1 ¤   {
46ecb3 ¤   ¤   UInt32¤ freeBlocks;
ed1b52 ¤   ¤
fb1f7f ¤   ¤   // Compute free space
035d1c ¤   ¤   freeBlocks¤ ¤   = freeAllocBlocks * ( allocBlockSize / 512L );
aac954 ¤   ¤   freeKilobytes¤  = freeBlocks / 2;
2b9371 ¤   }
5f67c5 ¤
7c0392 ¤   return( freeKilobytes );
2eaf5a
8defe6 }
1faf5a
6d6867 ¤   static pascal short
3b5cb2 NewPGPDiskSFHook(short item, DialogPtr dialog, void *dataPtr)
16bb36 {
--b34d 0001799240f4012000e Page 3 of CNewDiskWizardDialog.cp
5d63e1 ¤   pgpAssertAddrValid( dialog, DialogRecord );
c20d6a ¤   pgpAssertAddrValid( dataPtr, NewPGPDiskSFData );
c467c5 ¤
6b9a3a ¤   if ( GetWRefCon( dialog ) == sfMainDialogRefCon )
69c7a1 ¤   {
000284 ¤   ¤   NewPGPDiskSFData¤   *sfData = (NewPGPDiskSFData *) dataPtr;
ea1b52 ¤   ¤
9ecf9c ¤   ¤   pgpAssertAddrValid( sfData->sfReply, StandardFileReply );
3b1b52 ¤   ¤
88217e ¤   ¤   switch( item )
da5b34 ¤   ¤   {
234f27 ¤   ¤   ¤   case sfHookNullEvent:
30f776 ¤   ¤   ¤   {
45a121 ¤   ¤   ¤   ¤   // Check to see if the disk has changed. If so, recompute
14e9dd ¤   ¤   ¤   ¤   // the available free space on the disk and update the text.
5c9526 ¤   ¤   ¤   ¤   // Round the free space up so that the user can enter this
143248 ¤   ¤   ¤   ¤   // number in order to use all the space
7787c7 ¤   ¤   ¤
85eecb ¤   ¤   ¤   ¤   if( sfData->curVRefNum != sfData->sfReply->sfFile.vRefNum )
cd72c3 ¤   ¤   ¤   ¤   {
a420ad ¤   ¤   ¤   ¤   ¤   Str255¤ freeSpaceStr;
aff527 ¤   ¤   ¤   ¤   ¤   Str255¤ tempStr;
4c54a4 ¤   ¤   ¤   ¤   ¤   UInt32¤ freeMB;
8e0422 ¤   ¤   ¤   ¤   ¤   UInt32¤ freeKilobytes;
b9ae30 ¤   ¤   ¤   ¤   ¤
abb3db ¤   ¤   ¤   ¤   ¤   sfData->curVRefNum = sfData->sfReply->sfFile.vRefNum;
7fae30 ¤   ¤   ¤   ¤   ¤
3f7c68 ¤   ¤   ¤   ¤   ¤   freeSpaceStr[0] = 0;
fdae30 ¤   ¤   ¤   ¤   ¤
64efd8 ¤   ¤   ¤   ¤   ¤   freeKilobytes = GetVolumeFreeSpaceInK( sfData->curVRefNum );
82c5e7 ¤   ¤   ¤   ¤   ¤   if ( freeKilobytes > kNewPGPDiskMaximumSizeInK )
dd2644 ¤   ¤   ¤   ¤   ¤   ¤   freeKilobytes = kNewPGPDiskMaximumSizeInK;
7d94aa ¤   ¤   ¤   ¤   ¤   ¤
cb61b3 ¤   ¤   ¤   ¤   ¤   freeMB = freeKilobytes / 1024UL;
2594aa ¤   ¤   ¤   ¤   ¤   ¤
fd16a9 ¤   ¤   ¤   ¤   ¤   if ( freeMB >= 10 )
dc4859 ¤   ¤   ¤   ¤   ¤   {
260d09 ¤   ¤   ¤   ¤   ¤   ¤   GetIndString( freeSpaceStr, kDialogStringListResID,
9cff35 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAvailableFreeSpaceMegabytesFormatStrIndex );
cf1ca9 ¤   ¤   ¤   ¤   ¤   ¤   NumToString( freeMB, tempStr );¤¤   ¤   ¤
fbd75b ¤   ¤   ¤   ¤   ¤   ¤   PrintPString( freeSpaceStr, freeSpaceStr, tempStr );
341c89 ¤   ¤   ¤   ¤   ¤   }
dd4bd6 ¤   ¤   ¤   ¤   ¤   else
8a4859 ¤   ¤   ¤   ¤   ¤   {
420d09 ¤   ¤   ¤   ¤   ¤   ¤   GetIndString( freeSpaceStr, kDialogStringListResID,
de5bdf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAvailableFreeSpaceKilobytesFormatStrIndex );
589b84 ¤   ¤   ¤   ¤   ¤   ¤   NumToString( freeKilobytes, tempStr );¤ ¤   ¤   ¤
f8d75b ¤   ¤   ¤   ¤   ¤   ¤   PrintPString( freeSpaceStr, freeSpaceStr, tempStr );
4b1c89 ¤   ¤   ¤   ¤   ¤   }
97ae30 ¤   ¤   ¤   ¤   ¤
3d24c8 ¤   ¤   ¤   ¤   ¤   SetIndDialogItemText( dialog,
5b34d7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAvailableFreeSpaceStaticText, freeSpaceStr );
0c2613 ¤   ¤   ¤   ¤   }
ae2b85 ¤   ¤   ¤   ¤
cdf622 ¤   ¤   ¤   ¤   break;
fea3a6 ¤   ¤   ¤   }
150fe4 ¤   ¤   }
fa9371 ¤   }
a067c5 ¤
f4e2ea ¤   return item;
7eefe6 }
4daf5a
69642a //¤ Presents a Standard File put dialog for saving the new PGP disk. Also
41afa3 // ¤prompts the user for the size of the disk. Default values come from the
359745 //¤ preferences. Returns userCanceledErr if the user cancelled the dialog.
cfaf5a
ad2473 ¤   static OSStatus
c08a3e GetNewPGPDiskFSSpec(
6f102e ¤   FSSpec ¤¤   *fileSpec,
e3bd9f ¤   ScriptCode¤ *fileScript)
bfbb36 {
17f959 ¤   OSStatus¤   ¤   ¤   status = noErr;
--82ba 0000eddf8414012000e Page 4 of CNewDiskWizardDialog.cp
90b41e ¤   Point¤  ¤   ¤   ¤   where;
64ce69 ¤   Str255¤ ¤   ¤   ¤   prompt;
e36b2a ¤   Str255¤ ¤   ¤   ¤   defaultFileName;
aab7d5 ¤   DlgHookYDUPP¤   ¤   dialogHookUPP;
a50925 ¤   StandardFileReply¤  sfReply;
855d90 ¤   NewPGPDiskSFData¤   sfData;
9667c5 ¤
dc9dd5 ¤   pgpAssertAddrValid( fileSpec, FSSpec );
dc0032 ¤   pgpAssertAddrValid( fileScript, ScriptCode );
5a67c5 ¤
ab57e6 ¤   where.h¤= 0;
41640e ¤   where.v¤= 0;
0367c5 ¤
cdca24 ¤   GetIndString( prompt, kDialogStringListResID, kNewPGPDiskPromptStrIndex );
3bae3a ¤   GetIndString( defaultFileName, kDialogStringListResID,
c95635 ¤   ¤   ¤   kNewPGPDiskFileNameStrIndex );
9d67c5 ¤
7f77d3 ¤   dialogHookUPP = NewDlgHookYDProc( NewPGPDiskSFHook );
0ad6a2 ¤   if( dialogHookUPP == nil )
0ac7a1 ¤   {
c94e71 ¤   ¤   pgpDebugMsg( "GetNewPGPDiskFSSpec: Cannot allocate dialog hook UPP" );
cb1b52 ¤   ¤
89c589 ¤   ¤   status = memFullErr;
4cab92 ¤   ¤   goto Exit;
ad9371 ¤   }
5baf5a
31aa16 ¤   pgpClearMemory( &sfData, sizeof( sfData ) );
f567c5 ¤
1f69e4 ¤   sfData.sfReply = &sfReply;
0367c5 ¤
229ae6 TryAgain:
5caf5a
90be17 ¤   CustomPutFile( prompt, defaultFileName, &sfReply,
f8eb68 ¤   ¤   ¤   ¤   ¤   kNewPGPDiskSFDialogResID, where, dialogHookUPP, NULL,
854c71 ¤   ¤   ¤   ¤   ¤   NULL, NULL, &sfData );
cc67c5 ¤
94026c ¤   if( sfReply.sfGood )
d5c7a1 ¤   {
f144e8 ¤   ¤   (void) FSMakeFSSpec( sfReply.sfFile.vRefNum, sfReply.sfFile.parID,
aef2ca ¤   ¤   ¤   ¤   ¤   sfReply.sfFile.name, fileSpec );
997f85 ¤   ¤   *fileScript¤= sfReply.sfScript;
5f67c5 ¤
ace561 ¤   ¤   AssertSpecIsValid( fileSpec, "CPGPDiskApplication::"
291c24 ¤   ¤   ¤   ¤   "GetNewPGPDiskFSSpec: bad spec from sfReply.sfFile" );
7c1b52 ¤   ¤
ee5418 ¤   ¤   status = CheckForLocalPGPDiskVolume( fileSpec->vRefNum );
e028d3 ¤   ¤   if( IsErr( status ) )
735b34 ¤   ¤   {
88caab ¤   ¤   ¤   CInfoPBRec¤ cpb;
8b1422 ¤   ¤   ¤   Boolean¤¤   fileAlreadyExists = FALSE;
2f87c7 ¤   ¤   ¤
087b52 ¤   ¤   ¤   if( status == kPGPDiskRemoteVolumeTypeError ||
b4b4a0 ¤   ¤   ¤   ¤   status == kPGPDiskForeignVolumeTypeError )
47f776 ¤   ¤   ¤   {
55205c ¤   ¤   ¤   ¤   Str255¤ msg;
fd34c5 ¤   ¤   ¤   ¤   Str255¤ volumeName;
a42b85 ¤   ¤   ¤   ¤
8bf62a ¤   ¤   ¤   ¤   GetIndString( msg, kErrorStringListResID,
bd9f21 ¤   ¤   ¤   ¤   ¤   ¤   kPGPDisksMustBeOnLocalVolumeStrIndex );
b8bd59 ¤   ¤   ¤   ¤   PrintPString( msg, msg, fileSpec->name );
f1af5a
676c94 ¤   ¤   ¤   ¤   GetVolumeName( sfReply.sfFile.vRefNum, volumeName );
81271b ¤   ¤   ¤   ¤   PrintPString( msg, msg, volumeName );
dbaf5a
7b4b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
8c0f22 ¤   ¤   ¤   ¤   CWarningAlert::Display( kWACautionAlertType, kWAOKStyle, msg );
512b85 ¤   ¤   ¤   ¤
5d7f9e ¤   ¤   ¤   ¤   goto TryAgain;
13a3a6 ¤   ¤   ¤   }
88bb8c ¤   ¤   ¤   else
fdf776 ¤   ¤   ¤   {
0e881a ¤   ¤   ¤   ¤   pgpDebugMsg( "GetNewPGPDiskFSSpec: Unexpected error from "
--384f 000c5c7f6744012000e Page 5 of CNewDiskWizardDialog.cp
0a8bef ¤   ¤   ¤   ¤   ¤   ¤   "CheckForLocalPGPDiskVolume" );
563a2b ¤   ¤   ¤   ¤   // punt
8da3a6 ¤   ¤   ¤   }
b21b52 ¤   ¤
676092 ¤   ¤   ¤   if( IsntErr( FSpGetCatInfo( fileSpec, &cpb ) ) )
2ef776 ¤   ¤   ¤   {
a1acfd ¤   ¤   ¤   ¤   fileAlreadyExists = TRUE;
962b85 ¤   ¤   ¤   ¤
b86d1f ¤   ¤   ¤   ¤   // Standard file will not let the user try to replace a
dc1f7f ¤   ¤   ¤   ¤   // folder, so we don't need to handle that case.
d12b85 ¤   ¤   ¤   ¤
aaa978 ¤   ¤   ¤   ¤   if( ( cpbFileAttributes( &cpb ) &
bda33a ¤   ¤   ¤   ¤   ¤   ( kFileAttributeFileLockedMask |
80313b ¤   ¤   ¤   ¤   ¤   ¤   kFileAttributeFileOpenMask ) ) != 0 )
6d72c3 ¤   ¤   ¤   ¤   {
309b0a ¤   ¤   ¤   ¤   ¤   Str255¤ msg;
7bae30 ¤   ¤   ¤   ¤   ¤
b67420 ¤   ¤   ¤   ¤   ¤   // File is locked or open. Inform the user and try again.
d1142a ¤   ¤   ¤   ¤   ¤   GetIndString( msg, kErrorStringListResID,
cb872a ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCantReplaceLockedOrBusyFileStrIndex );
8c5f59 ¤   ¤   ¤   ¤   ¤   PrintPString( msg, msg, fileSpec->name );
a7ae30 ¤   ¤   ¤   ¤   ¤
ec7c97 ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
51ab01 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
b03e01 ¤   ¤   ¤   ¤   ¤   ¤   ¤   msg );
0ef3e1 ¤   ¤   ¤   ¤   ¤   goto TryAgain;
2b2613 ¤   ¤   ¤   ¤   }
275a84 ¤   ¤   ¤   ¤   else if( IsPGPDiskFileType( cpbFileCreator( &cpb ),
83e929 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cpbFileType( &cpb ) ) )
4d72c3 ¤   ¤   ¤   ¤   {
1a2ddf ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   msg;
1058e9 ¤   ¤   ¤   ¤   ¤   MessageT¤   result;
41ae30 ¤   ¤   ¤   ¤   ¤
f99367 ¤   ¤   ¤   ¤   ¤   // If it is a PGPDisk file, get double confirmation
ef4d17 ¤   ¤   ¤   ¤   ¤   // before replacing the file.
c3ae30 ¤   ¤   ¤   ¤   ¤
1b142a ¤   ¤   ¤   ¤   ¤   GetIndString( msg, kErrorStringListResID,
51bccb ¤   ¤   ¤   ¤   ¤   ¤   ¤   kConfirmReplacePGPDiskFileStrIndex );
4a5f59 ¤   ¤   ¤   ¤   ¤   PrintPString( msg, msg, fileSpec->name );
d65f59 ¤   ¤   ¤   ¤   ¤   PrintPString( msg, msg, fileSpec->name );
a2da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
d17c97 ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
24dd60 ¤   ¤   ¤   ¤   ¤   result = CWarningAlert::Display( kWACautionAlertType,
d71e2a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWACancelOKStyle, msg );
b49a45 ¤   ¤   ¤   ¤   ¤   if( result == msg_Cancel )
9db212 ¤   ¤   ¤   ¤   ¤   ¤   goto TryAgain;
fe2613 ¤   ¤   ¤   ¤   }
25a3a6 ¤   ¤   ¤   }
dc0fe4 ¤   ¤   }
1f9371 ¤   }
830e24 ¤   else
37c7a1 ¤   {
b9a6c1 ¤   ¤   status = userCanceledErr;
619371 ¤   }
9a1b52 ¤   ¤
5e3e33 Exit:
47af5a
2f6919 ¤   if( dialogHookUPP != nil )
f767bf ¤   ¤   DisposeRoutineDescriptor( dialogHookUPP );
dd67c5 ¤
6d4afd ¤   return( status );
c8efe6 }
57af5a
1198ad #pragma mark --- CNewDiskWizardDialog ---
afaf5a
abe73e CNewDiskWizardDialog::CNewDiskWizardDialog(LStream *inStream)
a90078 ¤   : CPGPDiskDialog(inStream)
64bb36 {
64b70e ¤   mCurrentView ¤  ¤   ¤   = kNewDiskView_Invalid;
128beb ¤   mCurrentViewObj¤¤   ¤   = NULL;
4dd975 ¤   mDiskSize¤  ¤   ¤   ¤   = gPGPDiskPrefs.newDiskDefaultSize;
c59345 ¤   mDiskSizeIsMB¤  ¤   ¤   = gPGPDiskPrefs.newDiskDefaultIsMB;
--f350 000baf688434012000e Page 6 of CNewDiskWizardDialog.cp
c49a3a ¤   mCollectingRandomData¤  = FALSE;
d1cb7c ¤   mFormattingNewDisk¤ ¤   = FALSE;
62639e ¤   mLastRandomDataTicks¤   = 0;
1067c5 ¤
90be29 #if PGP_BUSINESS_SECURITY
52d924 ¤   mContext¤   = kInvalidPGPContextRef;
8a37df ¤   mAllKeys¤   = kInvalidPGPKeySetRef;
805285 ¤   mADKRef¤¤   = kInvalidPGPKeyRef;
4e7454 #endif
e7efe6 }
3daf5a
9d9ab5 CNewDiskWizardDialog::~CNewDiskWizardDialog()
aabb36 {
a69586 ¤   if( gPGPDiskPrefs.newDiskDefaultSize != mDiskSize ||
ae9363 ¤   ¤   gPGPDiskPrefs.newDiskDefaultIsMB != mDiskSizeIsMB )
71c7a1 ¤   {
e5b460 ¤   ¤   WritePreferences( &gPGPDiskPrefs );
f59371 ¤   }
7daf5a
0a26c8 #if PGP_BUSINESS_SECURITY¤
047633 ¤   if( PGPKeySetRefIsValid( mAllKeys ) )
936e4d ¤   ¤   PGPFreeKeySet( mAllKeys );
c267c5 ¤
7fec4a ¤   if( PGPContextRefIsValid( mContext ) )
8716b9 ¤   ¤   PGPFreeContext( mContext );
077454 #endif
d9efe6 }
57af5a
8e8871 #if PGP_BUSINESS_SECURITY¤  ¤   ·// [
ceaf5a
276d52 ¤   void
865e3c CNewDiskWizardDialog::SetADK(
4c35f6 ¤   PGPContextRef ¤ context,
79215d ¤   PGPKeySetRef ¤  keySet,
459cf5 ¤   PGPKeyRef ¤ ¤   adkRef)
7fbb36 {
8615a9 ¤   mContext ¤  = context;
6b6ec1 ¤   mAllKeys¤   = keySet;
1603e7 ¤   mADKRef¤¤   = adkRef;
1aefe6 }
06af5a
cc76d8 #endif¤ // ]
1daf5a
e56d52 ¤   void
376afc CNewDiskWizardDialog::FinishCreateSelf()
3dbb36 {
771069 ¤   CPGPDiskDialog::FinishCreateSelf();
1167c5 ¤
3eeab8 ¤   mNextButton = (LPushButton *) FindPaneByID( kNextButtonPaneID );
1d4451 ¤   pgpAssertAddrValid( mNextButton, VoidAlign );
19af5a
f650ad ¤   mPreviousButton = (LPushButton *) FindPaneByID( kPreviousButtonPaneID );
989521 ¤   pgpAssertAddrValid( mPreviousButton, VoidAlign );
40af5a
ed73a9 ¤   mCancelButton = (LPushButton *) FindPaneByID( kCancelButtonPaneID );
ea82a9 ¤   pgpAssertAddrValid( mCancelButton, VoidAlign );
5baf5a
f0b39b ¤   // mNextButton already added by the modal dialog handler.
b1f014 ¤   mPreviousButton->AddListener( this );
69af5a
48565d ¤   mNewView = kNewDiskView_Invalid;
0367c5 ¤
ab324a ¤   SwitchToView( kNewDiskView_Introduction );
ff68d2 ¤   StartIdling();
e3efe6 }
e4af5a
5f6d52 ¤   void
efcbd2 CNewDiskWizardDialog::ListenToMessage(
e819a3 ¤   MessageT ¤  inMessage,
df7503 ¤   void ¤  ¤   *ioParam)
09bb36 {
ba769e ¤   switch( inMessage )
--d53a 000d3482db44012000e Page 7 of CNewDiskWizardDialog.cp
f7c7a1 ¤   {
bd570b ¤   ¤   case msg_ChangedDiskName:
9deec4 ¤   ¤   case msg_ChangedDiskSize:
f8648b ¤   ¤   case msg_ChangedPassphrase:
7cf989 ¤   ¤   case msg_ChangedConfirmation:
538470 ¤   ¤   ¤   AdjustControlsForView( mCurrentView );
68cdcb ¤   ¤   ¤   break;
091b52 ¤   ¤
fd7385 ¤   ¤   case msg_HideTyping:
055b34 ¤   ¤   {
426c13 ¤   ¤   ¤   Boolean¤hideTyping;
2087c7 ¤   ¤   ¤
d4091b ¤   ¤   ¤   pgpAssertAddrValid( mPassphraseEdit, VoidAlign );
e96aa3 ¤   ¤   ¤   pgpAssertAddrValid( mConfirmationEdit, VoidAlign );
c687c7 ¤   ¤   ¤
c34a80 ¤   ¤   ¤   hideTyping = (*(UInt32 *) ioParam) != 0;
2d87c7 ¤   ¤   ¤
ce1b96 ¤   ¤   ¤   mPassphraseEdit->SetHideTyping( hideTyping );
5792e0 ¤   ¤   ¤   mConfirmationEdit->SetHideTyping( hideTyping );
ed87c7 ¤   ¤   ¤
decdcb ¤   ¤   ¤   break;
730fe4 ¤   ¤   }
e11b52 ¤   ¤
5b2806 ¤   ¤   case kNextViewMessage:
997e20 ¤   ¤   ¤   SetNewView( GetNextView( mCurrentView ) );
a3cdcb ¤   ¤   ¤   break;
e887c7 ¤   ¤   ¤
1fc01f ¤   ¤   case kPreviousViewMessage:
28e8c5 ¤   ¤   ¤   SetNewView( GetPreviousView( mCurrentView ) );
b7cdcb ¤   ¤   ¤   break;
2387c7 ¤   ¤   ¤
3d5686 ¤   ¤   case msg_Cancel:
4c5b34 ¤   ¤   {
61a9e5 ¤   ¤   ¤   if( mFormattingNewDisk )
b0f776 ¤   ¤   ¤   {
fa4db3 ¤   ¤   ¤   ¤   mNewDiskError.err = userCanceledErr;
55a3a6 ¤   ¤   ¤   }
94bb8c ¤   ¤   ¤   else
33f776 ¤   ¤   ¤   {
9bba40 ¤   ¤   ¤   ¤   DoClose();
83a3a6 ¤   ¤   ¤   }
7d87c7 ¤   ¤   ¤
c0cdcb ¤   ¤   ¤   break;
0b0fe4 ¤   ¤   }
401b52 ¤   ¤
467d54 ¤   ¤   case kAllowNextViewSwitchMessage:
3017a3 ¤   ¤   ¤   mNextButton->Enable();
74cdcb ¤   ¤   ¤   break;
2cae30 ¤   ¤   ¤   ¤   ¤
2ee1fc ¤   ¤   case kAllowPrevViewSwitchMessage:
5c6ce0 ¤   ¤   ¤   mPreviousButton->Enable();
7dcdcb ¤   ¤   ¤   break;
9287c7 ¤   ¤   ¤
3c114f ¤   ¤   case kDenyNextViewSwitchMessage:
01daee ¤   ¤   ¤   mNextButton->Disable();
c7cdcb ¤   ¤   ¤   break;
c187c7 ¤   ¤   ¤
d98de7 ¤   ¤   case kDenyPrevViewSwitchMessage:
4daa0a ¤   ¤   ¤   mPreviousButton->Disable();
e4cdcb ¤   ¤   ¤   break;
38af5a
856b3f ¤   ¤   case kDenyCancelMessage:
fecfee ¤   ¤   ¤   mCancelButton->Disable();
60cdcb ¤   ¤   ¤   break;
c987c7 ¤   ¤   ¤
f59ae3 ¤   ¤   default:
7735c2 ¤   ¤   ¤   CPGPDiskDialog::ListenToMessage( inMessage, ioParam );
f6cdcb ¤   ¤   ¤   break;
5c9371 ¤   }
9cefe6 }
3faf5a
d36d52 ¤   void
--d857 000276533fa4012000e Page 8 of CNewDiskWizardDialog.cp
e2f774 CNewDiskWizardDialog::AdjustControlsForView(NewDiskView theView)
27bb36 {
c7e4bd ¤   Boolean¤enableNextButton¤   = TRUE;
3a85a5 ¤   Boolean¤enablePrevButton¤   = TRUE;
71a893 ¤   Boolean¤enableCancelButton¤ = TRUE;
4767c5 ¤
c84d1e ¤   switch( theView )
9bc7a1 ¤   {
bd914d ¤   ¤   case kNewDiskView_Introduction:
cf2a8e ¤   ¤   ¤   enablePrevButton = FALSE;
03cdcb ¤   ¤   ¤   break;
6f1b52 ¤   ¤
2c3f55 ¤   ¤   case kNewDiskView_GetInfo:
175b34 ¤   ¤   {
9d9510 ¤   ¤   ¤   Str255¤ ¤   str;
0187c7 ¤   ¤   ¤
ea1232 ¤   ¤   ¤   mDiskNameEdit->GetDescriptor( str );
854efc ¤   ¤   ¤   if( str[0] == 0 )
84f776 ¤   ¤   ¤   {
2f248e ¤   ¤   ¤   ¤   enableNextButton = FALSE;
32a3a6 ¤   ¤   ¤   }
ffbb8c ¤   ¤   ¤   else
2af776 ¤   ¤   ¤   {
9deaab ¤   ¤   ¤   ¤   mDiskSizeEdit->GetDescriptor( str );
fb79f4 ¤   ¤   ¤   ¤   if( str[0] == 0 )
6972c3 ¤   ¤   ¤   ¤   {
921d4b ¤   ¤   ¤   ¤   ¤   enableNextButton = FALSE;
0b2613 ¤   ¤   ¤   ¤   }
47a3a6 ¤   ¤   ¤   }
dcaf5a
a5cdcb ¤   ¤   ¤   break;
370fe4 ¤   ¤   }
6e1b52 ¤   ¤
6f8df8 ¤   ¤   case kNewDiskView_GetPassphrase:
365b34 ¤   ¤   {
68b51a ¤   ¤   ¤   ushort¤ ¤   ¤   ¤   passphraseQuality;
1cb26d ¤   ¤   ¤   CSecureCString256¤  cPassphrase;
a087c7 ¤   ¤   ¤
9e1f44 ¤   ¤   ¤   mPassphraseEdit->GetDescriptor( mPassphrase );
cc6f99 ¤   ¤   ¤   if( mPassphrase[0] < 8 )
73f776 ¤   ¤   ¤   {
ab248e ¤   ¤   ¤   ¤   enableNextButton = FALSE;
52a3a6 ¤   ¤   ¤   }
6987c7 ¤   ¤   ¤
866d81 ¤   ¤   ¤   PToCString( mPassphrase, cPassphrase );
5087c7 ¤   ¤   ¤
9c7193 ¤   ¤   ¤   passphraseQuality = pgpEstimatePassphraseQuality( cPassphrase );
c83ad8 ¤   ¤   ¤   mQualityProgressBar->SetValue( passphraseQuality );
1087c7 ¤   ¤   ¤
46cdcb ¤   ¤   ¤   break;
bc0fe4 ¤   ¤   }
3b1b52 ¤   ¤
acb873 ¤   ¤   case kNewDiskView_GatherRandomData:
ae5b34 ¤   ¤   {
161860 ¤   ¤   ¤   enableNextButton = FALSE;
91cdcb ¤   ¤   ¤   break;
800fe4 ¤   ¤   }
761b52 ¤   ¤
bd8fd4 ¤   ¤   case kNewDiskView_Formatting:
015b34 ¤   ¤   {
c3a724 ¤   ¤   ¤   enableNextButton ¤  = FALSE;
313b8c ¤   ¤   ¤   enablePrevButton ¤  = FALSE;
9ccdcb ¤   ¤   ¤   break;
980fe4 ¤   ¤   }
6eaf5a
a666b9 ¤   ¤   case kNewDiskView_Conclusion:
193ee8 ¤   ¤   case kNewDiskView_Error:
105b34 ¤   ¤   {
b0d211 ¤   ¤   ¤   Str255¤ buttonTitle;
b987c7 ¤   ¤   ¤
d0c5c4 ¤   ¤   ¤   GetIndString( buttonTitle, kMiscStringsListResID,
277372 ¤   ¤   ¤   ¤   ¤   ¤   kDoneButtonTitleStrIndex );
--121e 00022fe5ae64012000e Page 9 of CNewDiskWizardDialog.cp
fd8263 ¤   ¤   ¤   mNextButton->SetDescriptor( buttonTitle );
5d87c7 ¤   ¤   ¤
083b8c ¤   ¤   ¤   enablePrevButton ¤  = FALSE;
a514b4 ¤   ¤   ¤   enableCancelButton¤ = FALSE;
9ecdcb ¤   ¤   ¤   break;
170fe4 ¤   ¤   }
2f9371 ¤   }
1067c5 ¤
9b6497 ¤   if( enableNextButton )
77c7a1 ¤   {
4e9bdc ¤   ¤   mNextButton->Enable();
d49371 ¤   }
400e24 ¤   else
1ec7a1 ¤   {
355112 ¤   ¤   mNextButton->Disable();
a29371 ¤   }
43af5a
8f07e4 ¤   if( enablePrevButton )
b8c7a1 ¤   {
f12d13 ¤   ¤   mPreviousButton->Enable();
df9371 ¤   }
ad0e24 ¤   else
6ec7a1 ¤   {
ad6f5f ¤   ¤   mPreviousButton->Disable();
679371 ¤   }
e5af5a
2bf2e1 ¤   if( enableCancelButton )
aec7a1 ¤   {
e7838e ¤   ¤   mCancelButton->Enable();
369371 ¤   }
440e24 ¤   else
3bc7a1 ¤   {
2f209d ¤   ¤   mCancelButton->Disable();
dc9371 ¤   }
f8efe6 }
33af5a
553afa ¤   NewDiskView
7d1872 CNewDiskWizardDialog::GetNextView(NewDiskView theView)
bfbb36 {
5a0326 ¤   NewDiskView¤nextView;
bf67c5 ¤
b24d1e ¤   switch( theView )
cac7a1 ¤   {
39914d ¤   ¤   case kNewDiskView_Introduction:
bed3e3 ¤   ¤   ¤   nextView = kNewDiskView_GetInfo;
29cdcb ¤   ¤   ¤   break;
33af5a
543f55 ¤   ¤   case kNewDiskView_GetInfo:
fe93c1 ¤   ¤   ¤   nextView = kNewDiskView_GetPassphrase;
33377d ¤   #if PGP_BUSINESS_SECURITY
e9aab4 ¤   ¤   ¤   if( PGPKeyRefIsValid( mADKRef ) )
62d1a7 ¤   ¤   ¤   ¤   nextView = kNewDiskView_ADKWarning;
54b7ec ¤   #endif
2ecdcb ¤   ¤   ¤   break;
fd1b52 ¤   ¤
4e377d ¤   #if PGP_BUSINESS_SECURITY
f149d8 ¤   ¤   case kNewDiskView_ADKWarning:
6e93c1 ¤   ¤   ¤   nextView = kNewDiskView_GetPassphrase;
13cdcb ¤   ¤   ¤   break;
2fb7ec ¤   #endif
8387c7 ¤   ¤   ¤
a98df8 ¤   ¤   case kNewDiskView_GetPassphrase:
22bfde ¤   ¤   ¤   nextView = kNewDiskView_GatherRandomData;
62cdcb ¤   ¤   ¤   break;
0faf5a
e8b873 ¤   ¤   case kNewDiskView_GatherRandomData:
bf81ea ¤   ¤   ¤   nextView = kNewDiskView_Formatting;
6ecdcb ¤   ¤   ¤   break;
35af5a
f68fd4 ¤   ¤   case kNewDiskView_Formatting:
c26887 ¤   ¤   ¤   nextView = kNewDiskView_Conclusion;
22cdcb ¤   ¤   ¤   break;
--a52f 000659764c74012000e Page 10 of CNewDiskWizardDialog.cp
e0af5a
df66b9 ¤   ¤   case kNewDiskView_Conclusion:
a03ee8 ¤   ¤   case kNewDiskView_Error:
94b099 ¤   ¤   ¤   nextView = kNewDiskView_Exit;
35cdcb ¤   ¤   ¤   break;
c7af5a
789ae3 ¤   ¤   default:
45a311 ¤   ¤   ¤   pgpDebugMsg( "Missing next view" );
a3ba2c ¤   ¤   ¤   nextView = theView;
3ccdcb ¤   ¤   ¤   break;
019371 ¤   }
4967c5 ¤
d27d38 ¤   return( nextView );
e4efe6 }
e2af5a
f83afa ¤   NewDiskView
3f5714 CNewDiskWizardDialog::GetPreviousView(NewDiskView theView)
02bb36 {
f321d7 ¤   NewDiskView¤previousView;
da67c5 ¤
e94d1e ¤   switch( theView )
4ac7a1 ¤   {
e83f55 ¤   ¤   case kNewDiskView_GetInfo:
173e89 ¤   ¤   ¤   previousView = kNewDiskView_Introduction;
a1cdcb ¤   ¤   ¤   break;
3aaf5a
12377d ¤   #if PGP_BUSINESS_SECURITY
b049d8 ¤   ¤   case kNewDiskView_ADKWarning:
aae933 ¤   ¤   ¤   previousView = kNewDiskView_GetInfo;
41cdcb ¤   ¤   ¤   break;
c8b7ec ¤   #endif
3287c7 ¤   ¤   ¤
bd8df8 ¤   ¤   case kNewDiskView_GetPassphrase:
5ee933 ¤   ¤   ¤   previousView = kNewDiskView_GetInfo;
23377d ¤   #if PGP_BUSINESS_SECURITY
e7aab4 ¤   ¤   ¤   if( PGPKeyRefIsValid( mADKRef ) )
9cd697 ¤   ¤   ¤   ¤   previousView = kNewDiskView_ADKWarning;
9bb7ec ¤   #endif
b0cdcb ¤   ¤   ¤   break;
7baf5a
b0b873 ¤   ¤   case kNewDiskView_GatherRandomData:
8b4e7b ¤   ¤   ¤   previousView = kNewDiskView_GetPassphrase;
56cdcb ¤   ¤   ¤   break;
2487c7 ¤   ¤   ¤
7f9ae3 ¤   ¤   default:
288f2e ¤   ¤   ¤   pgpDebugMsg( "Missing previous view" );
79ac25 ¤   ¤   ¤   previousView = theView;
85cdcb ¤   ¤   ¤   break;
289371 ¤   }
7967c5 ¤
40f77c ¤   return( previousView );
5defe6 }
44af5a
d43afa ¤   NewDiskView
344f24 CNewDiskWizardDialog::LeaveGetInfoView(NewDiskView newView)
16bb36 {
9bf8ea ¤   if( newView == kNewDiskView_GetPassphrase
36be29 #if PGP_BUSINESS_SECURITY
34903a ¤   ¤   || newView == kNewDiskView_ADKWarning
7c7454 #endif
f827e6 ¤   )
41c7a1 ¤   {
28f9a8 ¤   ¤   LRadioButton¤   *buttonObj;
e3167a ¤   ¤   UInt32¤ ¤   ¤   diskSizeInK;
c6b52a ¤   ¤   UInt32¤ ¤   ¤   strIndex;
1b1b52 ¤   ¤
a88462 ¤   ¤   mDiskNameEdit->GetDescriptor( mDiskName );
ac1b52 ¤   ¤
11818d ¤   ¤   // Remove ':' characters from name and replace with '-'
a56994 ¤   ¤   for( strIndex = 0; strIndex < mDiskName[0]; strIndex++ )
685b34 ¤   ¤   {
65e3b9 ¤   ¤   ¤   if( mDiskName[strIndex] == ':' )
--9888 00081690caa4012000e Page 11 of CNewDiskWizardDialog.cp
50a9d9 ¤   ¤   ¤   ¤   mDiskName[strIndex] = '-';
f80fe4 ¤   ¤   }
611b52 ¤   ¤
0bdea6 ¤   ¤   mDiskSize = mDiskSizeEdit->GetValue();
ee1b52 ¤   ¤
1e25c4 ¤   ¤   buttonObj = (LRadioButton *) FindPaneByID( kMBRadioButtonPaneID );
57678b ¤   ¤   pgpAssertAddrValid( buttonObj, VoidAlign );
b5af5a
a36e5c ¤   ¤   mDiskSizeIsMB = ( buttonObj->GetValue() != 0 );
d5af5a
3e78d4 ¤   ¤   diskSizeInK = mDiskSize;
3f195c ¤   ¤   if( mDiskSizeIsMB )
4b5b34 ¤   ¤   {
b54238 ¤   ¤   ¤   diskSizeInK = diskSizeInK * 1024L;
e10fe4 ¤   ¤   }
451b52 ¤   ¤
c3ac34 ¤   ¤   if( diskSizeInK < kNewPGPDiskMinimumSizeInK )
a45b34 ¤   ¤   {
69b70a ¤   ¤   ¤   Str32¤  numStr;
1887c7 ¤   ¤   ¤
315feb ¤   ¤   ¤   NumToString( kNewPGPDiskMinimumSizeInK, numStr );
2d87c7 ¤   ¤   ¤
a6c2cb ¤   ¤   ¤   SysBeep( 1 );
f1fff1 ¤   ¤   ¤   CWarningAlert::Display( kWACautionAlertType, kWAOKStyle,
ee385b ¤   ¤   ¤   ¤   ¤   kErrorStringListResID, kPGPDiskMustBeLargerThanXStrIndex,
5035e2 ¤   ¤   ¤   ¤   ¤   numStr );
63af5a
fc1b54 ¤   ¤   ¤   mDiskSizeEdit->SelectAll();
dedc45 ¤   ¤   ¤   newView = kNewDiskView_GetInfo;
650fe4 ¤   ¤   }
c7eb55 ¤   ¤   else if( diskSizeInK > kNewPGPDiskMaximumSizeInK )
495b34 ¤   ¤   {
c0b70a ¤   ¤   ¤   Str32¤  numStr;
1587c7 ¤   ¤   ¤
19baba ¤   ¤   ¤   NumToString( kNewPGPDiskMaximumSizeInMB, numStr );
c687c7 ¤   ¤   ¤
03c2cb ¤   ¤   ¤   SysBeep( 1 );
47fff1 ¤   ¤   ¤   CWarningAlert::Display( kWACautionAlertType, kWAOKStyle,
0ca1f9 ¤   ¤   ¤   ¤   ¤   kErrorStringListResID, kPGPDiskMustBeSmallerThanXStrIndex,
0435e2 ¤   ¤   ¤   ¤   ¤   numStr );
bcaf5a
5d1b54 ¤   ¤   ¤   mDiskSizeEdit->SelectAll();
1edc45 ¤   ¤   ¤   newView = kNewDiskView_GetInfo;
460fe4 ¤   ¤   }
570e1d ¤   ¤   else
845b34 ¤   ¤   {
2b4b9d ¤   ¤   ¤   UInt32¤ freeKilobytes;
2687c7 ¤   ¤   ¤
895aa3 ¤   ¤   ¤   freeKilobytes = GetVolumeFreeSpaceInK( mDiskFileSpec.vRefNum );
b23f42 ¤   ¤   ¤   if( freeKilobytes < diskSizeInK )
3bf776 ¤   ¤   ¤   {
13a70f ¤   ¤   ¤   ¤   Str255¤ ¤   volumeName;
edaf5a
273aed ¤   ¤   ¤   ¤   GetVolumeName( mDiskFileSpec.vRefNum, volumeName );
272b85 ¤   ¤   ¤   ¤
464b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
e42b85 ¤   ¤   ¤   ¤
c8bae0 ¤   ¤   ¤   ¤   if( CWarningAlert::Display( kWANoteAlertType,
e6a6b3 ¤   ¤   ¤   ¤   ¤   ¤   kWAOKCancelStyle, kErrorStringListResID,
4c232c ¤   ¤   ¤   ¤   ¤   ¤   kSizeExceedsFreeSpaceStrIndex, volumeName ) !=
3dd2f3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   msg_OK )
1472c3 ¤   ¤   ¤   ¤   {
3c8b62 ¤   ¤   ¤   ¤   ¤   mDiskSizeEdit->SelectAll();
e85254 ¤   ¤   ¤   ¤   ¤   newView = kNewDiskView_GetInfo;
a32613 ¤   ¤   ¤   ¤   }
a0a3a6 ¤   ¤   ¤   }
840fe4 ¤   ¤   }
339371 ¤   }
6b67c5 ¤
0220a3 ¤   return( newView );
d7efe6 }
81af5a
--5fba 000076353d54012000e Page 12 of CNewDiskWizardDialog.cp
493afa ¤   NewDiskView
58d64f CNewDiskWizardDialog::LeaveGetPassphraseView(NewDiskView newView)
b2bb36 {
d60eef ¤   if( newView == kNewDiskView_GatherRandomData )
c3c7a1 ¤   {
8b6809 ¤   ¤   CSecurePString255¤  confirmation;
911b52 ¤   ¤
68187f ¤   ¤   mPassphraseEdit->GetDescriptor( mPassphrase );
2c7c28 ¤   ¤   mConfirmationEdit->GetDescriptor( confirmation );
ae1b52 ¤   ¤
b33316 ¤   ¤   if( ! PStringsAreEqual( mPassphrase, confirmation ) )
c85b34 ¤   ¤   {
6ec2cb ¤   ¤   ¤   SysBeep( 1 );
864f24 ¤   ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
fa776c ¤   ¤   ¤   ¤   ¤   ¤   kErrorStringListResID,
dd4014 ¤   ¤   ¤   ¤   ¤   ¤   kPassphrasesMustMatchStrIndex );
3a87c7 ¤   ¤   ¤
c978fc ¤   ¤   ¤   mPassphraseEdit->ClearPassphrase();
d76f88 ¤   ¤   ¤   mConfirmationEdit->ClearPassphrase();
9087c7 ¤   ¤   ¤
2429d9 ¤   ¤   ¤   SwitchTarget( mPassphraseEdit );
b91b52 ¤   ¤
936105 ¤   ¤   ¤   newView = kNewDiskView_GetPassphrase;
b90fe4 ¤   ¤   }
c09371 ¤   }
c367c5 ¤
7f20a3 ¤   return( newView );
63efe6 }
36af5a
ab3afa ¤   NewDiskView
1a039a CNewDiskWizardDialog::LeaveCurrentView(NewDiskView newView)
e5bb36 {
02c99d ¤   switch( mCurrentView )
e1c7a1 ¤   {
11914d ¤   ¤   case kNewDiskView_Introduction:
b95b34 ¤   ¤   {
6559ce ¤   ¤   ¤   OSStatus¤   err;
a187c7 ¤   ¤   ¤
1cdd8b ¤   ¤   ¤   UDesktop::Deactivate();
7f1701 ¤   ¤   ¤   err = GetNewPGPDiskFSSpec( &mDiskFileSpec,
ecf3c1 ¤   ¤   ¤   ¤   ¤   ¤   &mDiskFileScript );
4ce678 ¤   ¤   ¤   UDesktop::Activate();
a187c7 ¤   ¤   ¤
0717c7 ¤   ¤   ¤   if( IsErr( err ) )
0cf776 ¤   ¤   ¤   {
a06f73 ¤   ¤   ¤   ¤   newView = mCurrentView;
c5a3a6 ¤   ¤   ¤   }
33bb8c ¤   ¤   ¤   else
acf776 ¤   ¤   ¤   {
acac1c ¤   ¤   ¤   ¤   CopyPStringMax( mDiskFileSpec.name, mDiskName, 27 );
03a3a6 ¤   ¤   ¤   }
4c0fe4 ¤   ¤   }
4f1b52 ¤   ¤
ae3f55 ¤   ¤   case kNewDiskView_GetInfo:
095b34 ¤   ¤   {
418013 ¤   ¤   ¤   newView = LeaveGetInfoView( newView );
0dcdcb ¤   ¤   ¤   break;
a30fe4 ¤   ¤   }
301b52 ¤   ¤
c18df8 ¤   ¤   case kNewDiskView_GetPassphrase:
f35b34 ¤   ¤   {
2992c9 ¤   ¤   ¤   newView = LeaveGetPassphraseView( newView );
85cdcb ¤   ¤   ¤   break;
db0fe4 ¤   ¤   }
05af5a
57b873 ¤   ¤   case kNewDiskView_GatherRandomData:
f75b34 ¤   ¤   {
b8206e ¤   ¤   ¤   mCollectingRandomData = FALSE;
9acdcb ¤   ¤   ¤   break;
910fe4 ¤   ¤   }
0e9371 ¤   }
07af5a
--7803 000d9d476da4012000e Page 13 of CNewDiskWizardDialog.cp
c3f9aa ¤   if( newView != kNewDiskView_Invalid &&
d8b146 ¤   ¤   newView != mCurrentView &&
bf85d2 ¤   ¤   IsntNull( mCurrentViewObj ) )
cec7a1 ¤   {
66fe54 ¤   ¤   Rect¤   viewRect;
aa1b52 ¤   ¤
a737e7 ¤   ¤   mCurrentViewObj->CalcPortFrameRect( viewRect );
c64035 ¤   ¤   delete mCurrentViewObj;¤¤   ¤   ¤   // delete it
1ef5b1 ¤   ¤   mCurrentViewObj = NULL;
611b52 ¤   ¤
f8df40 ¤   ¤   FocusDraw();
af1b52 ¤   ¤
05fe46 ¤   ¤   ApplyForeAndBackColors();
5bb28c ¤   ¤   EraseRect( &viewRect );
c69371 ¤   }
e167c5 ¤
f820a3 ¤   return( newView );
87efe6 }
efaf5a
fd6d52 ¤   void
5a0f77 CNewDiskWizardDialog::EnterGetInfoView(void)
6ebb36 {
437254 ¤   LRadioButton¤   *buttonObj;
96afb0 ¤   LStaticText¤¤   *caption;
710924 ¤   PaneIDT¤¤   ¤   buttonPaneID;
226e14 ¤   Str255¤ ¤   ¤   str;
7b8609 ¤   UInt32¤ ¤   ¤   freeKilobytes;
86869b ¤   UInt32¤ ¤   ¤   freeMB;
df478b ¤   Str32¤  ¤   ¤   volumeName;
fe842b ¤   Str32¤  ¤   ¤   numStr;
2887c7 ¤   ¤   ¤
668b2c ¤   mDiskNameEdit = (LEditText *) FindPaneByID(
bec1fb ¤   ¤   ¤   ¤   ¤   ¤   kDiskNameEditTextPaneID );
1cf526 ¤   pgpAssertAddrValid( mDiskNameEdit, VoidAlign );
8567c5 ¤
affdb7 ¤   mDiskNameEdit->SetDescriptor( mDiskName );
63363b ¤   mDiskNameEdit->AddListener( this );
1867c5 ¤
75a1f8 ¤   NumToString( mDiskSize, str );
d867c5 ¤
4a976d ¤   mDiskSizeEdit = (LEditText *) FindPaneByID(
1c587b ¤   ¤   ¤   ¤   ¤   ¤   kDiskSizeEditTextPaneID );
1971b7 ¤   pgpAssertAddrValid( mDiskSizeEdit, VoidAlign );
1d67c5 ¤
ef9db9 ¤   mDiskSizeEdit->SetDescriptor( str );
84ce75 ¤   mDiskSizeEdit->AddListener( this );
4daf5a
45ef39 ¤   if( mDiskSizeIsMB )
3ac7a1 ¤   {
c92e4c ¤   ¤   buttonPaneID = kMBRadioButtonPaneID;
c49371 ¤   }
640e24 ¤   else
4ec7a1 ¤   {
ea9d24 ¤   ¤   buttonPaneID = kKBRadioButtonPaneID;
469371 ¤   }
3b67c5 ¤
2d62f6 ¤   buttonObj = (LRadioButton *) FindPaneByID( buttonPaneID );
3ff1ca ¤   pgpAssertAddrValid( buttonObj, VoidAlign );
0667c5 ¤
6b1adb ¤   buttonObj->SetValue( 1 );
8167c5 ¤
64d5c4 ¤   freeKilobytes ¤ = GetVolumeFreeSpaceInK( mDiskFileSpec.vRefNum );
3a7dd6 ¤   freeMB ¤¤   ¤   = freeKilobytes / 1024UL;
031b52 ¤   ¤
89033b ¤   if ( freeMB >= 10 )
d7c7a1 ¤   {
1d987a ¤   ¤   GetIndString( numStr, kDialogStringListResID, kMegabytesSizeStrIndex );
c3b540 ¤   ¤   NumToString( freeMB, str );¤¤   ¤   ¤
5b9371 ¤   }
0e0e24 ¤   else
5cc7a1 ¤   {
d95f65 ¤   ¤   GetIndString( numStr, kDialogStringListResID, kKilobytesSizeStrIndex );
--6d4a 000336b47db4012000e Page 14 of CNewDiskWizardDialog.cp
725084 ¤   ¤   NumToString( freeKilobytes, str );¤ ¤   ¤   ¤
459371 ¤   }
8daf5a
ad346b ¤   caption = (LStaticText *) FindPaneByID( kGetInfoDescTextPaneID );
2ceb9b ¤   pgpAssertAddrValid( caption, VoidAlign );
e667c5 ¤
144cd9 ¤   PrintPString( numStr, numStr, str );
104cc8 ¤   GetVolumeName( mDiskFileSpec.vRefNum, volumeName );
a267c5 ¤
f12617 ¤   caption->GetDescriptor( str );
93af5a
d41187 ¤   PrintPString( str, str, volumeName );
2e52a7 ¤   PrintPString( str, str, numStr );
8167c5 ¤
f1563b ¤   caption->SetDescriptor( str );
aeaf5a
7bb702 ¤   SwitchTarget( mDiskNameEdit );
93efe6 }
00af5a
2a6d52 ¤   void
6a0427 CNewDiskWizardDialog::EnterGetPassphraseView(void)
ddbb36 {
2cc709 ¤   gPGPDiskPrefs.newDiskDefaultSize ¤  = mDiskSize;
27a4ab ¤   gPGPDiskPrefs.newDiskDefaultIsMB ¤  = mDiskSizeIsMB;
e267c5 ¤
6f97d6 ¤   mPassphraseEdit = (CPassphraseEdit *) FindPaneByID(
7418e5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPassphraseEditTextPaneID );
34e86c ¤   pgpAssertAddrValid( mPassphraseEdit, VoidAlign );
0daf5a
fe844e ¤   mConfirmationEdit = (CPassphraseEdit *) FindPaneByID(
5b08d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kConfirmationEditTextPaneID );
8c21e8 ¤   pgpAssertAddrValid( mConfirmationEdit, VoidAlign );
40af5a
ea5c0d ¤   mHideTypingCheckbox = (LCheckBox *) FindPaneByID(
eb81ec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kHideTypingCheckboxPaneID );
5e089c ¤   pgpAssertAddrValid( mHideTypingCheckbox, VoidAlign );
32af5a
f60219 ¤   mQualityProgressBar = (LProgressBar *) FindPaneByID(
f0f87e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kQualityProgressBarPaneID );
568327 ¤   pgpAssertAddrValid( mQualityProgressBar, VoidAlign );
ceaf5a
3d103b ¤   mPassphraseEdit->AddListener( this );
5f1b4b ¤   mConfirmationEdit->AddListener( this );
0deba8 ¤   mHideTypingCheckbox->AddListener( this );
e567c5 ¤
e32a8c ¤   SwitchTarget( mPassphraseEdit );
0befe6 }
bbaf5a
326d52 ¤   void
c14e42 CNewDiskWizardDialog::EnterView(NewDiskView newView)
b9bb36 {
c1ff1f ¤   ResIDT¤ newViewResID;
6667c5 ¤
6ef3ee ¤   switch( newView )
14c7a1 ¤   {
41914d ¤   ¤   case kNewDiskView_Introduction:
c24534 ¤   ¤   ¤   newViewResID = view_Introduction;
f4cdcb ¤   ¤   ¤   break;
faaf5a
c03f55 ¤   ¤   case kNewDiskView_GetInfo:
3980d4 ¤   ¤   ¤   newViewResID = view_GetInfo;
bccdcb ¤   ¤   ¤   break;
f587c7 ¤   ¤   ¤
068df8 ¤   ¤   case kNewDiskView_GetPassphrase:
0f206e ¤   ¤   ¤   newViewResID = view_GetPassphrase;
fecdcb ¤   ¤   ¤   break;
cdaf5a
ef377d ¤   #if PGP_BUSINESS_SECURITY
fd49d8 ¤   ¤   case kNewDiskView_ADKWarning:
a4b4d2 ¤   ¤   ¤   newViewResID = view_ADKWarning;
0dcdcb ¤   ¤   ¤   break;
33b7ec ¤   #endif
--7807 000a68684514012000e Page 15 of CNewDiskWizardDialog.cp
f11b52 ¤   ¤
fdb873 ¤   ¤   case kNewDiskView_GatherRandomData:
0beac8 ¤   ¤   ¤   newViewResID = view_GatherRandomData;
d6cdcb ¤   ¤   ¤   break;
94af5a
f88fd4 ¤   ¤   case kNewDiskView_Formatting:
b772de ¤   ¤   ¤   newViewResID = view_Formatting;
b5cdcb ¤   ¤   ¤   break;
c9af5a
2f3ee8 ¤   ¤   case kNewDiskView_Error:
6ff8e9 ¤   ¤   ¤   newViewResID = view_Error;
02cdcb ¤   ¤   ¤   break;
5caf5a
c766b9 ¤   ¤   case kNewDiskView_Conclusion:
ec9bb3 ¤   ¤   ¤   newViewResID = view_Conclusion;
c1cdcb ¤   ¤   ¤   break;
ec87c7 ¤   ¤   ¤
319ae3 ¤   ¤   default:
9b2c57 ¤   ¤   ¤   newViewResID = 0;
29cdcb ¤   ¤   ¤   break;
6b9371 ¤   }
7baf5a
a68620 ¤   if( newViewResID != 0 )
23c7a1 ¤   {
90e776 ¤   ¤   LCommander::SetDefaultCommander( this );
a20ad3 ¤   ¤   LPane::SetDefaultView( this );
1e1b52 ¤   ¤
054abd ¤   ¤   mCurrentViewObj = (LView *)
fb711e ¤   ¤   ¤   ¤   ¤   ¤   ¤   UReanimator::ReadObjects( 'PPob', newViewResID );
f8cc83 ¤   ¤   mCurrentViewObj->FinishCreate();
571b52 ¤   ¤
97345b ¤   ¤   switch( newView )
b15b34 ¤   ¤   {
3c7ea6 ¤   ¤   ¤   case kNewDiskView_GetInfo:
e1517c ¤   ¤   ¤   ¤   EnterGetInfoView();
9cf622 ¤   ¤   ¤   ¤   break;
ef87c7 ¤   ¤   ¤
a00075 ¤   ¤   #if PGP_BUSINESS_SECURITY
907536 ¤   ¤   ¤   case kNewDiskView_ADKWarning:
15f776 ¤   ¤   ¤   {
06409a ¤   ¤   ¤   ¤   Str255¤ userID;
bdf8a7 ¤   ¤   ¤   ¤   PGPSize¤userIDLength;
c62b85 ¤   ¤   ¤   ¤
c027c9 ¤   ¤   ¤   ¤   pgpAssert( PGPKeyRefIsValid( mADKRef ) );
3b87c7 ¤   ¤   ¤
4d4453 ¤   ¤   ¤   ¤   if( IsntPGPError( PGPGetPrimaryUserIDNameBuffer(
7d8011 ¤   ¤   ¤   ¤   ¤   ¤   mADKRef, sizeof( userID ) - 1, (char *) &userID[1],
1f0462 ¤   ¤   ¤   ¤   ¤   ¤   &userIDLength ) ) )
8372c3 ¤   ¤   ¤   ¤   {
363270 ¤   ¤   ¤   ¤   ¤   userID[0] = userIDLength;
20ae30 ¤   ¤   ¤   ¤   ¤
015f8d ¤   ¤   ¤   ¤   ¤   FindPaneByID( kADKUserIDTextPaneID )->
ec9bc5 ¤   ¤   ¤   ¤   ¤   ¤   SetDescriptor( userID );
192613 ¤   ¤   ¤   ¤   }
1a2b85 ¤   ¤   ¤   ¤
6af622 ¤   ¤   ¤   ¤   break;
2fa3a6 ¤   ¤   ¤   }
60d656 ¤   ¤   #endif
8e1b52 ¤   ¤
d68b40 ¤   ¤   ¤   case kNewDiskView_GetPassphrase:
25098c ¤   ¤   ¤   ¤   EnterGetPassphraseView();
04f622 ¤   ¤   ¤   ¤   break;
2e531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
7ba023 ¤   ¤   ¤   case kNewDiskView_GatherRandomData:
1cf776 ¤   ¤   ¤   {
7752e1 ¤   ¤   ¤   ¤   mRandomDataProgressBar = (LProgressBar *) FindPaneByID(
067ac8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kRandomProgressBarPaneID );
63c9cf ¤   ¤   ¤   ¤   pgpAssertAddrValid( mRandomDataProgressBar, VoidAlign );
7aaf5a
6c8809 ¤   ¤   ¤   ¤   mCollectingRandomData ¤ = TRUE;
114b87 ¤   ¤   ¤   ¤   mRandomDataCount¤   ¤   = 0;
a6f622 ¤   ¤   ¤   ¤   break;
--97cc 000bee5e40b4012000e Page 16 of CNewDiskWizardDialog.cp
cfa3a6 ¤   ¤   ¤   }
7987c7 ¤   ¤   ¤
33b33a ¤   ¤   ¤   case kNewDiskView_Formatting:
edf776 ¤   ¤   ¤   {
84c028 ¤   ¤   ¤   ¤   LStaticText¤*descPane;
869fc3 ¤   ¤   ¤   ¤   Str255¤ ¤   desc;
1d2b85 ¤   ¤   ¤   ¤
5ce446 ¤   ¤   ¤   ¤   mFormattingProgressBar = (LProgressBar *) FindPaneByID(
9de69b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kFormattingProgressBarPaneID );
1a1b59 ¤   ¤   ¤   ¤   pgpAssertAddrValid( mFormattingProgressBar, VoidAlign );
dbaf5a
0a1451 ¤   ¤   ¤   ¤   descPane = (LStaticText *) FindPaneByID(
9a1ca6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kFormattingNameTextPaneID );
8083ae ¤   ¤   ¤   ¤   pgpAssertAddrValid( descPane, VoidAlign );
b2af5a
a1636e ¤   ¤   ¤   ¤   descPane->GetDescriptor( desc );
ac0c60 ¤   ¤   ¤   ¤   PrintPString( desc, desc, mDiskName );
9d8870 ¤   ¤   ¤   ¤   descPane->SetDescriptor( desc );
932b85 ¤   ¤   ¤   ¤
23f622 ¤   ¤   ¤   ¤   break;
1ea3a6 ¤   ¤   ¤   }
8f87c7 ¤   ¤   ¤
300380 ¤   ¤   ¤   case kNewDiskView_Error:
1af776 ¤   ¤   ¤   {
9cc028 ¤   ¤   ¤   ¤   LStaticText¤*descPane;
7c9fc3 ¤   ¤   ¤   ¤   Str255¤ ¤   desc;
c934e3 ¤   ¤   ¤   ¤   Str255¤ ¤   errorStr;
d6af5a
f94b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
922b85 ¤   ¤   ¤   ¤
05a2b1 ¤   ¤   ¤   ¤   descPane = (LStaticText *) FindPaneByID( kErrorTextPaneID );
8183ae ¤   ¤   ¤   ¤   pgpAssertAddrValid( descPane, VoidAlign );
12af5a
bd636e ¤   ¤   ¤   ¤   descPane->GetDescriptor( desc );
5a2b85 ¤   ¤   ¤   ¤
8c0c60 ¤   ¤   ¤   ¤   PrintPString( desc, desc, mDiskName );
a62b85 ¤   ¤   ¤   ¤
c5ef73 ¤   ¤   ¤   ¤   GetComboErrorString( mNewDiskError, errorStr );
6f9a98 ¤   ¤   ¤   ¤   PrintPString( desc, desc, errorStr );
a5af5a
378870 ¤   ¤   ¤   ¤   descPane->SetDescriptor( desc );
332b85 ¤   ¤   ¤   ¤
a7f622 ¤   ¤   ¤   ¤   break;
56a3a6 ¤   ¤   ¤   }
b70fe4 ¤   ¤   }
1e1b52 ¤   ¤
5598ef ¤   ¤   AdjustControlsForView( newView );
96af5a
191863 ¤   ¤   mCurrentViewObj->Show();
a09c3a ¤   ¤   mCurrentViewObj->Draw( NULL );
41d1bf ¤   ¤   mCurrentViewObj->DontRefresh();
06af5a
da7f07 ¤   ¤   if( newView == kNewDiskView_Formatting )
be5b34 ¤   ¤   {
204013 ¤   ¤   ¤   UInt32¤ ¤   diskSizeInK;
933d69 ¤   ¤   ¤   CComboError¤err;
4887c7 ¤   ¤   ¤
8b7d50 ¤   ¤   ¤   mNewDiskError = err;¤   // Clear out mNewDiskError
c987c7 ¤   ¤   ¤
7445bc ¤   ¤   ¤   diskSizeInK = mDiskSize;
eab402 ¤   ¤   ¤   if( mDiskSizeIsMB )
33f776 ¤   ¤   ¤   {
a39a8a ¤   ¤   ¤   ¤   diskSizeInK = diskSizeInK * 1024L;
94a3a6 ¤   ¤   ¤   }
c7af5a
f96b3a ¤   ¤   ¤   mFormattingNewDisk = TRUE;
1187c7 ¤   ¤   ¤
06b8d7 ¤   ¤   ¤   err.err = NewPGPDiskFile( &mDiskFileSpec, diskSizeInK,
017d48 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDefaultEncryptionAlgorithm, mPassphrase );
830075 ¤   ¤   #if PGP_BUSINESS_SECURITY
c86394 ¤   ¤   ¤   if( err.IsntError() && PGPKeyRefIsValid( mADKRef ) )
bef776 ¤   ¤   ¤   {
--8a11 000d9e50e6a4012000e Page 17 of CNewDiskWizardDialog.cp
f2343c ¤   ¤   ¤   ¤   CComboError¤¤   err;
f9261a ¤   ¤   ¤   ¤   PGPDiskFileRef¤ diskFileRef;
9d2b85 ¤   ¤   ¤   ¤
ae63b5 ¤   ¤   ¤   ¤   err.err = OpenPGPDiskFile( &mDiskFileSpec, &diskFileRef );
ba82e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
d272c3 ¤   ¤   ¤   ¤   {
1f8101 ¤   ¤   ¤   ¤   ¤   err = AddPublicPGPDiskKey( diskFileRef, mADKRef,
453c34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPassphrase, TRUE, TRUE );
4dbe0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
f34859 ¤   ¤   ¤   ¤   ¤   {
8c7317 ¤   ¤   ¤   ¤   ¤   ¤   err.err = SavePGPDiskFile( diskFileRef );
e11c89 ¤   ¤   ¤   ¤   ¤   }
2cae30 ¤   ¤   ¤   ¤   ¤
38adb5 ¤   ¤   ¤   ¤   ¤   ClosePGPDiskFile( diskFileRef );
da2613 ¤   ¤   ¤   ¤   }
6ba3a6 ¤   ¤   ¤   }
5ed656 ¤   ¤   #endif
74af5a
926d97 ¤   ¤   ¤   if( err.IsntError() )
cff776 ¤   ¤   ¤   {
f00fba ¤   ¤   ¤   ¤   err = MountPGPDisk( &mDiskFileSpec, TRUE, FALSE,
d55c6e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPassphrase, FALSE, mDiskName,
ec622c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NewDiskProgressProc, NULL );
5aa3a6 ¤   ¤   ¤   }
241b52 ¤   ¤
e0aff1 ¤   ¤   ¤   mFormattingNewDisk = FALSE;
2d87c7 ¤   ¤   ¤
a36d97 ¤   ¤   ¤   if( err.IsntError() )
3bf776 ¤   ¤   ¤   {
9605b1 ¤   ¤   ¤   ¤   LStaticText¤*clickNextText;
5c2b85 ¤   ¤   ¤   ¤
d450d7 ¤   ¤   ¤   ¤   mFormattingProgressBar->SetValue( 100 );
252b85 ¤   ¤   ¤   ¤
d48d70 ¤   ¤   ¤   ¤   clickNextText = (LStaticText *) FindPaneByID(
96aa60 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kClickNextTextPaneID );
9abf92 ¤   ¤   ¤   ¤   pgpAssertAddrValid( clickNextText, VoidAlign );
d32b85 ¤   ¤   ¤   ¤
d1c611 ¤   ¤   ¤   ¤   clickNextText->Show();
fc2b85 ¤   ¤   ¤   ¤
b25650 ¤   ¤   ¤   ¤   mNextButton->Enable();
91a3a6 ¤   ¤   ¤   }
cdbb8c ¤   ¤   ¤   else
50f776 ¤   ¤   ¤   {
76c4d5 ¤   ¤   ¤   ¤   mNewDiskError = err;
062b85 ¤   ¤   ¤   ¤
82ca7b ¤   ¤   ¤   ¤   if( err.IsCancelError() )
4972c3 ¤   ¤   ¤   ¤   {
3318f6 ¤   ¤   ¤   ¤   ¤   SetNewView( kNewDiskView_Exit );
3a2613 ¤   ¤   ¤   ¤   }
c8fa07 ¤   ¤   ¤   ¤   else
4d72c3 ¤   ¤   ¤   ¤   {
3fb228 ¤   ¤   ¤   ¤   ¤   SetNewView( kNewDiskView_Error );
9a2613 ¤   ¤   ¤   ¤   }
5ea3a6 ¤   ¤   ¤   }
c30fe4 ¤   ¤   }
3f9371 ¤   }
8467c5 ¤
65ee3e ¤   mCurrentView = newView;
2fefe6 }
1caf5a
a485ea ¤   OSStatus
2b3ec4 CNewDiskWizardDialog::NewDiskProgressProc(
65f132 ¤   UInt32 ¤pctComplete,
9b9267 ¤   void¤   *userValue)
bdbb36 {
524d52 ¤   (void) userValue;
a667c5 ¤
1e999e ¤   mFormattingProgressBar->SetValue( pctComplete );
2a92ef ¤   CPGPDiskApplication::mApplication->ProcessNextEvent();
c967c5 ¤
57b654 ¤   return( mNewDiskError.err );
d9efe6 }
--258f 0017a551a244012000e Page 18 of CNewDiskWizardDialog.cp
e0af5a
2c6d52 ¤   void
6d5d31 CNewDiskWizardDialog::SwitchToView(NewDiskView newView)
39bb36 {
bbd7c4 ¤   newView = LeaveCurrentView( newView );
3ef9aa ¤   if( newView != kNewDiskView_Invalid &&
738558 ¤   ¤   newView != mCurrentView )
769108 ¤   {·
99ea60 ¤   ¤   EnterView( newView );
f19371 ¤   }
8defe6 }
f8af5a
396d52 ¤   void
2dde7e CNewDiskWizardDialog::SetNewView(NewDiskView newView)
ccbb36 {
ea6eba ¤   mNewView = newView;
91efe6 }
d1af5a
c06d52 ¤   void
625d29 CNewDiskWizardDialog::SpendTime(const EventRecord &inMacEvent)
42bb36 {
d464da ¤   (void) inMacEvent;
3967c5 ¤
ecd771 ¤   if( mNewView == kNewDiskView_Exit )
7cc7a1 ¤   {
206348 ¤   ¤   DoClose();
179371 ¤   }
eeb8c4 ¤   else if( mNewView != kNewDiskView_Invalid )
a1c7a1 ¤   {
55485e ¤   ¤   NewDiskView¤newView;
8a1b52 ¤   ¤
6de75c ¤   ¤   newView ¤   = mNewView;
5f34d9 ¤   ¤   mNewView¤   = kNewDiskView_Invalid;
b01b52 ¤   ¤
8e95f1 ¤   ¤   SwitchToView( newView );
179371 ¤   }
608718 ¤   else if( mCollectingRandomData )
1ec7a1 ¤   {
9482d4 ¤   ¤   UInt32¤ ticks;
101b52 ¤   ¤
9d965f ¤   ¤   ticks = TickCount();
9cb4c6 ¤   ¤   if( ticks != mLastRandomDataTicks )
755b34 ¤   ¤   {
4f0a28 ¤   ¤   ¤   mLastRandomDataTicks = ticks;
8f87c7 ¤   ¤   ¤
67d7bc ¤   ¤   ¤   if( AddRandomEntropy() )
80f776 ¤   ¤   ¤   {
7a7712 ¤   ¤   ¤   ¤   ++mRandomDataCount;
da2b85 ¤   ¤   ¤   ¤
b6356a ¤   ¤   ¤   ¤   mRandomDataProgressBar->SetValue( ( mRandomDataCount * 100 ) /
44459f ¤   ¤   ¤   ¤   ¤   ¤   ¤   kRandomDataSampleCount );
89531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
7af844 ¤   ¤   ¤   ¤   if( mRandomDataCount > kRandomDataSampleCount )
0572c3 ¤   ¤   ¤   ¤   {
051de1 ¤   ¤   ¤   ¤   ¤   LStaticText¤*clickNextText;
6fae30 ¤   ¤   ¤   ¤   ¤
5a3169 ¤   ¤   ¤   ¤   ¤   clickNextText = (LStaticText *) FindPaneByID(
bd970e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kClickNextTextPaneID );
7482fc ¤   ¤   ¤   ¤   ¤   pgpAssertAddrValid( clickNextText, VoidAlign );
37ae30 ¤   ¤   ¤   ¤   ¤
ffc85d ¤   ¤   ¤   ¤   ¤   clickNextText->Show();
53ae30 ¤   ¤   ¤   ¤   ¤
f66944 ¤   ¤   ¤   ¤   ¤   mCollectingRandomData = FALSE;
65581c ¤   ¤   ¤   ¤   ¤   mNextButton->Enable();
3c2613 ¤   ¤   ¤   ¤   }
bea3a6 ¤   ¤   ¤   }
800fe4 ¤   ¤   }
859371 ¤   }
7abe43 }¶
--3fbf 000eb5bbe214012000f Page 1 of CNewDiskWizardDialog.h
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
236f3c ¤   $Id: CNewDiskWizardDialog.h,v 1.7.8.1 1998/11/12 03:05:09 heller Exp $
b1f7f7 ____________________________________________________________________________*/
767b7d #pragma once
fdaf5a
73ea2f #include <LBroadcaster.h>
370a93 #include <LPeriodical.h>
4daf5a
4fbe29 #if PGP_BUSINESS_SECURITY
d5a076 #include "pgpKeys.h"
6d7454 #endif
feaf5a
2d76f0 #include "CComboError.h"
96ab5f #include "CPGPDiskDialog.h"
c7bf4a #include "MacSecureMemory.h"
f7af5a
0bb432 // It is assumed that this enum is kept in user presentation order.
6519fd typedef enum NewDiskView
25bb36 {
ec6116 ¤   kNewDiskView_Invalid¤   ¤   ¤   = 1,
fa0970 ¤   kNewDiskView_Introduction,
0118be ¤   kNewDiskView_GetInfo,
debe29 #if PGP_BUSINESS_SECURITY
9a497d ¤   kNewDiskView_ADKWarning,
747454 #endif
62f50b ¤   kNewDiskView_GetPassphrase,
29abbe ¤   kNewDiskView_GatherRandomData,
528f71 ¤   kNewDiskView_Formatting,
284c90 ¤   kNewDiskView_Error,
ef661c ¤   kNewDiskView_Conclusion,
a7f6a9 ¤   kNewDiskView_Exit¤  ¤   ¤   ¤   // Not a real view
0267c5 ¤
3d0d8f } NewDiskView;
c0af5a
8c2647 class CPassphraseEdit;
a7e276 class LCheckBox;
7b79e9 class LProgressBar;
2688da class LPushButton;
c7af5a
8206f9 class CNewDiskWizardDialog : ¤  public CPGPDiskDialog,
1694f6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LPeriodical
e8bb36 {
1e5ed4 public:
53ec4f ¤   enum { class_ID = 'NDsk' };
8067c5 ¤
6ef519 ¤   ¤   ¤   ¤   ¤   ¤   CNewDiskWizardDialog(LStream *inStream);
c37146 ¤   virtual¤¤   ¤   ¤   ~CNewDiskWizardDialog();
5baf5a
addad0 ¤   virtual¤void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
db445a ¤   virtual void¤   ¤   SpendTime(const EventRecord &inMacEvent);
9aaf5a
76be29 #if PGP_BUSINESS_SECURITY
9cb9f9 ¤   void¤   ¤   ¤   ¤   SetADK(PGPContextRef context, PGPKeySetRef keySet,
60175b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef adkRef);
1a7454 #endif
a2af5a
7bac3a ¤   static void¤¤   ¤   SetNewView(NewDiskView newView);
77af5a
25a2d3 protected:
9faf5a
b4d5cd ¤   virtual¤void¤   ¤   FinishCreateSelf(void);
7baf5a
5e0fb9 private:
2eaf5a
ba4828 ¤   NewDiskView¤¤   ¤   mCurrentView;
6d9ed6 ¤   LView¤  ¤   ¤   ¤   *mCurrentViewObj;
30f017 ¤   LPushButton¤¤   ¤   *mNextButton;
6f7ae1 ¤   LPushButton¤¤   ¤   *mPreviousButton;
ebf9d0 ¤   LPushButton¤¤   ¤   *mCancelButton;
--7636 00114995e4a4012000f Page 2 of CNewDiskWizardDialog.h
55f6b7 ¤   Str32¤  ¤   ¤   ¤   mDiskName;
4b2652 ¤   UInt32¤ ¤   ¤   ¤   mDiskSize;
6e1a13 ¤   Boolean¤¤   ¤   ¤   mDiskSizeIsMB;
fc37ba ¤   FSSpec¤ ¤   ¤   ¤   mDiskFileSpec;
16e381 ¤   ScriptCode¤ ¤   ¤   mDiskFileScript;
065b82 ¤   CSecurePString255¤  mPassphrase;
51705c ¤   Boolean¤¤   ¤   ¤   mCollectingRandomData;
948dee ¤   Boolean¤¤   ¤   ¤   mFormattingNewDisk;
449cc2 ¤   UInt32¤ ¤   ¤   ¤   mRandomDataCount;
12b5c1 ¤   UInt32¤ ¤   ¤   ¤   mLastRandomDataTicks;
5267c5 ¤
eed0a2 ¤   LEditText¤  ¤   ¤   *mDiskNameEdit;
524fde ¤   LEditText¤  ¤   ¤   *mDiskSizeEdit;
8767c5 ¤
91676f ¤   CPassphraseEdit¤¤   *mPassphraseEdit;
aca919 ¤   CPassphraseEdit¤¤   *mConfirmationEdit;
25e463 ¤   LCheckBox¤  ¤   ¤   *mHideTypingCheckbox;
24408f ¤   LProgressBar¤   ¤   *mQualityProgressBar;
f667c5 ¤
b0df41 ¤   LProgressBar¤   ¤   *mRandomDataProgressBar;
2eaf5a
ffbe29 #if PGP_BUSINESS_SECURITY
ffc810 ¤   PGPContextRef¤  ¤   mContext;
f43a66 ¤   PGPKeySetRef¤   ¤   mAllKeys;
8fb218 ¤   PGPKeyRef¤  ¤   ¤   mADKRef;
d67454 #endif
18af5a
254081 ¤   static NewDiskView¤ mNewView;
0cf47b ¤   static CComboError¤ mNewDiskError;
ca7a66 ¤   static LProgressBar¤*mFormattingProgressBar;
4267c5 ¤
23df2d ¤   void¤   ¤   ¤   ¤   AdjustControlsForView(NewDiskView theView);
5331d5 ¤   void¤   ¤   ¤   ¤   EnterGetInfoView(void);
62b5f5 ¤   void¤   ¤   ¤   ¤   EnterGetPassphraseView(void);
994a83 ¤   void¤   ¤   ¤   ¤   EnterView(NewDiskView newView);
793121 ¤   NewDiskView¤¤   ¤   GetNextView(NewDiskView theView);
8db319 ¤   NewDiskView¤¤   ¤   GetPreviousView(NewDiskView theView);
a043ca ¤   NewDiskView¤¤   ¤   LeaveCurrentView(NewDiskView newView);
db1f73 ¤   NewDiskView¤¤   ¤   LeaveGetInfoView(NewDiskView newView);
531b08 ¤   NewDiskView¤¤   ¤   LeaveGetPassphraseView(NewDiskView newView);
95427e ¤   void¤   ¤   ¤   ¤   SwitchToView(NewDiskView newView);
7a303e ¤   Boolean¤¤   ¤   ¤   ValidateCurrentView(void);
c667c5 ¤
7b6e3b ¤   static OSStatus¤¤   NewDiskProgressProc(UInt32 pctComplete,
63698e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *userValue);
9882f7 };
14af5a
--514c 00045ada00d40120010 Page 1 of CPGPDiskApplication.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
324712 ¤   $Id: CPGPDiskApplication.cp,v 1.28.2.1.2.2 1998/11/13 02:49:35 heller Exp $
14f7f7 ____________________________________________________________________________*/
96af5a
2d84be #include <Sound.h>
3c324c #include <string.h>
d2af5a
8c5286 #include "MacDialogs.h"
33fd2e #include "MacDebugPatches.h"
fd8bd8 #include "MacEnvirons.h"
4e090b #include "MacEvents.h"
8b76b7 #include "MacErrors.h"
c5bbf4 #include "MacFiles.h"
291e0f #include "MacInternet.h"
1d75a9 #include "MacDriverUtils.h"
f5c110 #include "pgpMacMemory.h"
db6915 #include "MacResources.h"
6fbf4a #include "MacSecureMemory.h"
6285c2 #include "MacStrings.h"
6e5bf6 #include "MacTraps.h"
d1af5a
2bea4b #if PGPDISK_PUBLIC_KEY
1d4720 #include "pflPrefTypes.h"
f03991 #include "pgpAdminPrefs.h"
77c97b #include "pgpClientPrefs.h"
14a076 #include "pgpKeys.h"
cc91b9 #include "pgpSDKPrefs.h"
97e684 #include "pgpUserInterface.h"
3a4919 #include "pgpUtilities.h"
afb397 #include "PGPOpenPrefs.h"
5d7454 #endif
35af5a
0ad7fc #include <LDialogBox.h>
f07c09 #include <LEditText.h>
56f841 #include <LGrowZone.h>
535a50 #include <LMenu.h>
f596c2 #include <LMenuBar.h>
6a740c #include <UAppleEventsMgr.h>
99dd06 #include <UDesktop.h>
be7e6d #include <UDrawingState.h>
d2e8ae #include <UDrawingUtils.h>
6ccc5c #include <UMemoryMgr.h>
fc7c99 #include <URegistrar.h>
80af5a
1dde36 #include "PGPDisk.h"
ca8ec6 #include "PGPDiskPreferences.h"
b00927 #include "PGPDiskResources.h"
17e5dd #include "PGPDiskUtils.h"
83af5a
62f0a0 #include <LGADialog.h>
09bce5 #include <LIconPane.h>
3e9a4b #include <LScroller.h>
487e73 #include <LTabGroup.h>
68afac #include <UModalDialogs.h>
e775de #include <UWindows.h>
54af5a
8bb125 #include <LBevelButton.h>
968708 #include <LCheckBox.h>
6766bb #include <LCmdBevelButton.h>
577c09 #include <LEditText.h>
da76ae #include <LIconControl.h>
c90aae #include <LPopupButton.h>
cc49f7 #include <LProgressBar.h>
12d797 #include <LPushButton.h>
9540db #include <LRadioButton.h>
88dfe2 #include <LRadioGroupView.h>
402786 #include <LSeparatorLine.h>
db05c6 #include <LStaticText.h>
45a94f #include <LTextGroupBox.h>
--4c47 0002b471e7c40120010 Page 2 of CPGPDiskApplication.cp
e0af5a
87fd90 #include <LAMControlImp.h>
d0d770 #include <LAMControlViewImp.h>
3ef0f6 #include <LAMEditTextImp.h>
cd34b5 #include <LAMPopupButtonImp.h>
a1ef3e #include <LAMPushButtonImp.h>
c45a8a #include <LAMStaticTextImp.h>
e3af5a
2bfbe5 #include <LGABevelButtonImp.h>
b22a0e #include <LGACheckBoxImp.h>
dbe872 #include <LGAEditTextImp.h>
c2590d #include <LGAIconControlImp.h>
0d0069 #include <LGAPopupButtonImp.h>
78739a #include <LGAProgressBarImp.h>
46985b #include <LGAPushButtonImp.h>
5e021a #include <LGARadioButtonImp.h>
e225f4 #include <LGASeparatorImp.h>
502def #include <LGAStaticTextImp.h>
c4016b #include <LGATextGroupBoxImp.h>
57af5a
60f526 #include "CNewDiskWizardDialog.h"
88e4c5 #include "CSetPassphraseDialog.h"
627dc1 #include "CDiskTestsTable.h"
b25e55 #include "CDiskTestsWindow.h"
267f0c #include "CEditDiskTestDialog.h"
3d0fdb #include "CGetPassphraseDialog.h"
9b4b63 #include "CMainWindow.h"
f0829c #include "CPassphraseEdit.h"
47e213 #include "CPGPAMEditTextImp.h"
31002e #include "CPGPActiveScroller.h"
ea59c5 #include "CPGPStDialogHandler.h"
5dab5f #include "CPGPDiskDialog.h"
26d67a #include "CPGPDiskWindow.h"
ffef42 #include "CPGPDiskApplication.h"
560021 #include "CPicture.h"
373be4 #include "CPreferencesDialog.h"
07e7cd #include "CVersionCaption.h"
d89dc2 #include "CWarningAlert.h"
353c1e #include "randpool.h"
0daa66 #include "PowerPlantLeaks.h"
d8ee83 #include "CLog.h"
960421 #include "SleepAlert.h"
b9bdd3 #include "PGPDiskBeta.h"
8f546f #include "PGPDiskFile.h"
11af5a
c19f8b const short¤¤   kMainWindowResID¤   ¤   ¤   = 3000;
4f4149 const short¤¤   kNewDiskWizardResID¤¤   ¤   = 8000;
734ce3 const short¤¤   kAboutDialogResID¤  ¤   ¤   = 9000;
a5af5a
bb356f const short¤¤   kMinSystemVersionAlertResID¤¤   ¤   = 2100;
5b74e5 const short¤¤   kNeed68020AlertResID¤   ¤   ¤   ¤   = 2102;
a175cd const short¤¤   kCastSBoxesInvalidAlertResID¤   ¤   = 2103;
ba0dfb const short¤¤   kFoundLaterDriverAlertResID¤¤   ¤   = 2104;
5a01a0 const short¤¤   kDiskExpressIncompatibleAlertResID¤ = 2105;
0255ec const short¤¤   kBetaExpiredAlertResID¤ ¤   ¤   ¤   = 2106;
165a6a const short¤¤   kRAMDoublerIncompatibleAlertResID¤  = 2107;
ddab50 const short¤¤   kNeedPGPsdkAlertResID¤  ¤   ¤   ¤   = 2108;
1eaf5a
0d93de const CommandT¤ cmd_NewPGPDisk¤ ¤   ¤   = 2000;
270d5c const CommandT¤ cmd_MountPGPDisk¤   ¤   = 2001;
a1af5a
be2622 const CommandT¤ cmd_AddPassphrase¤  ¤   = 2100;
3a9851 const CommandT¤ cmd_ChangePassphrase¤   = 2101;
7a1da3 const CommandT¤ cmd_RemovePassphrase¤   = 2102;
3eaf5a
6aea4b #if PGPDISK_PUBLIC_KEY
ed81f4 const CommandT¤ cmd_AddRemovePublicKeys¤= 2200;
e17454 #endif
4caf5a
40ed25 static CMainWindow¤ ¤   *sMainWindowObj;
9daf5a
2b2680 #if PGP_DEBUG // [
--7390 0002ec45f4f40120010 Page 3 of CPGPDiskApplication.cp
a1ca8b const short¤¤   kDiskTestsWindowResID¤  ¤   = 21000;
d92a13 const short¤¤   kDebugMenuResID¤¤   ¤   ¤   = 20000;
6daf5a
ed8a6d const CommandT¤ cmd_DebugDiskTestsWindow¤   = 20001;
c89357 const CommandT¤ cmd_DebugMountUnmountTest¤  = 20002;
b2af5a
38a171 const CommandT¤ cmd_DebugUnmountAllPGPDisks¤= 20101;
589695 const CommandT¤ cmd_DebugFragmentFile¤  ¤   = 20102;
7aaf5a
5f4743 const CommandT¤ cmd_DebugTemp1¤ = 20201;
8a2fc9 const CommandT¤ cmd_DebugTemp2¤ = 20202;
56f040 const CommandT¤ cmd_DebugTemp3¤ = 20203;
0caf5a
8b987f static CDiskTestsWindow¤¤   *sDiskTestsWindowObj;
d0af5a
7f249c #endif // ]
10af5a
1ce240 static Boolean¤ sHaveOAPPEvent = FALSE;
622215 static Boolean¤ sHaveODOCEvent = FALSE;
65821e static Boolean¤ sRemoveAlternatePassphrases¤= FALSE;
dbaf5a
22ea28 CPGPDiskApplication¤*CPGPDiskApplication::mApplication = NULL;
a9af5a
705275 class CAboutCaption : public LCaption
78bb36 {
485ed4 public:
815692 ¤   enum { class_ID = 'cApt' };
393af3 ¤   ¤   ¤   ¤   ¤   ¤   CAboutCaption( LStream * inStream)
b97345 ¤   ¤   ¤   ¤   ¤   ¤   ¤   : LCaption( inStream )
ce0e3f ¤   ¤   ¤   ¤   ¤   ¤   ¤   { }
57af5a
45a2d3 protected:
6ccdee ¤   virtual void¤   ¤   DrawSelf( void );
ed82f7 };
73af5a
39af5a
26af5a
c733c8 ¤   static void
54d2b9 RealMain( void ·)
2bbb36 {
f95006 ¤   LGrowZone¤  *myGrowZoneObj;
b367c5 ¤
282b2c ¤   MacLeaks_Suspend();¤
ee67c5 ¤
26f81b ¤   myGrowZoneObj = new LGrowZone(20000);
7507a8 ¤   CPGPDiskApplication theApp;
bc67c5 ¤
af77d9 ¤   MacLeaks_Resume();
1967c5 ¤
d3c25d ¤   theApp.Run();
0967c5 ¤
18427c ¤   // PP LGrowZone assumes zone is set correctly when deleting the object.
cedefe ¤   SetZone( ApplicationZone() );
1c67c5 ¤
5212b7 ¤   if( myGrowZoneObj != nil )
c82459 ¤   ¤   delete( myGrowZoneObj );
d5efe6 }
5daf5a
21af5a
44cd8d ¤   static Boolean
cda03e FindItemInFolder(
5c2fea ¤   short¤  ¤   vRefNum,
1e2402 ¤   long¤   ¤   dirID,
b91e20 ¤   OSType¤ ¤   fileCreator,
d96987 ¤   OSType¤ ¤   fileType,
16ed76 ¤   FSSpec *¤   outSpec)
5cbb36 {
e7addf ¤   Boolean¤¤   foundIt;
1c4f27 ¤   CInfoPBRec¤ cpb;
d6ef84 ¤   Str255¤ ¤   itemName;
38d17d ¤   UInt32¤ ¤   dirIndex;
2e67c5 ¤
--2722 0005d16712e40120010 Page 4 of CPGPDiskApplication.cp
e6f0dd ¤   foundIt ¤   = false;
57a1f8 ¤   dirIndex¤   = 1;
0e67c5 ¤
4035c8 ¤   pgpClearMemory( &cpb, sizeof( cpb ) );
2267c5 ¤
affb1d ¤   cpb.hFileInfo.ioVRefNum¤= vRefNum;
4cf6df ¤   cpb.hFileInfo.ioNamePtr¤= itemName;
7e67c5 ¤
4aa551 ¤   while( ! foundIt )
ccc7a1 ¤   {
fd3d9e ¤   ¤   cpb.hFileInfo.ioDirID¤  ·¤  = dirID;
02fb92 ¤   ¤   cpb.hFileInfo.ioFDirIndex ¤ = dirIndex;
c967c5 ¤
498081 ¤   ¤   if( IsErr( PBGetCatInfoSync( &cpb ) ) )
02cdcb ¤   ¤   ¤   break;
9b1b52 ¤   ¤
07e62b ¤   ¤   // allow wildcarding with '****'
7ac799 ¤   ¤   if( cpbIsFile( &cpb ) &&
d1773d ¤   ¤   ¤   ( cpbFileType( &cpb ) == fileType ||
b8555e ¤   ¤   ¤   ¤   ¤   cpbFileType( &cpb ) == '****' ) &&
c03323 ¤   ¤   ¤   ( cpbFileCreator( &cpb ) == fileCreator ||
bc2798 ¤   ¤   ¤   ¤   ¤   cpbFileCreator( &cpb ) == '****' ) )
cf5b34 ¤   ¤   {
eb9dc5 ¤   ¤   ¤   foundIt = TRUE;
ba477c ¤   ¤   ¤   if ( IsntNull( outSpec ) )
03f776 ¤   ¤   ¤   {
95c08d ¤   ¤   ¤   ¤   outSpec->vRefNum¤   = vRefNum;
2f42e0 ¤   ¤   ¤   ¤   outSpec->parID¤ ¤   = dirID;
4d9c7b ¤   ¤   ¤   ¤   CopyPString( itemName, outSpec->name );
5aa3a6 ¤   ¤   ¤   }
980fe4 ¤   ¤   }
5e1b52 ¤   ¤
1f9ebd ¤   ¤   ++dirIndex;
b19371 ¤   }
fdaf5a
5d71b7 ¤   return( foundIt );
a4efe6 }
a6af5a
08af5a
90cd8d ¤   static Boolean
13a966 FindDiskExpressInFolder(short vRefNum, long dirID)
2bbb36 {
a668c0 ¤   return( FindItemInFolder( vRefNum, dirID, 'DExp', 'cdev', nil ) );
ebefe6 }
4baf5a
c2af5a
0a3c2f //¤ Validate that that application can run on this machine. Return TRUE if we
71a75f //¤ can run.
53af5a
06aee8 const ushort¤   kMinSystemVersion = 0x0710;
9baf5a
56af5a
39cd8d ¤   static Boolean
82b5fa DiskExpressIsRunning()
1abb36 {
d714bb ¤   // PGPdisk is not currently compatible with DiskExpressII because it may
7dc044 ¤   // move our mounted disks files and the driver does not check for this
c9540e ¤   // case. Alsoft is sending more info to dynamically detect this case.·
50ed0e ¤   // For now, we do not run.
ff0feb ¤   short¤  vRefNum;
c2f269 ¤   long¤   dirID;
4a65ef ¤   Boolean¤foundDiskExpress;
5caf5a
8e3ec2 ¤   foundDiskExpress = FALSE;
c567c5 ¤
2e9e71 ¤   if( IsntErr( FindFolder( kOnSystemDisk, kControlPanelFolderType,
d9e69d ¤   ¤   ¤   ¤   ¤   kDontCreateFolder, &vRefNum, &dirID ) ) )
7dc7a1 ¤   {
e43646 ¤   ¤   foundDiskExpress = FindDiskExpressInFolder( vRefNum, dirID );
0f9371 ¤   }
3b67c5 ¤
5d7b19 ¤   if( ! foundDiskExpress )
--97b0 000ef04fda240120010 Page 5 of CPGPDiskApplication.cp
f7c7a1 ¤   {
707208 ¤   ¤   if( IsntErr( FindFolder( kOnSystemDisk, kExtensionFolderType,
455a84 ¤   ¤   ¤   ¤   ¤   ¤   kDontCreateFolder, &vRefNum, &dirID ) ) )
275b34 ¤   ¤   {
8220f0 ¤   ¤   ¤   foundDiskExpress = FindDiskExpressInFolder( vRefNum, dirID );
270fe4 ¤   ¤   }
ab9371 ¤   }
efaf5a
757b19 ¤   if( ! foundDiskExpress )
f7c7a1 ¤   {
17f0af ¤   ¤   if( IsntErr( FindFolder( kOnSystemDisk, kSystemFolderType,
c65a84 ¤   ¤   ¤   ¤   ¤   ¤   kDontCreateFolder, &vRefNum, &dirID ) ) )
745b34 ¤   ¤   {
0120f0 ¤   ¤   ¤   foundDiskExpress = FindDiskExpressInFolder( vRefNum, dirID );
440fe4 ¤   ¤   }
349371 ¤   }
56beab ¤   return( foundDiskExpress );
b6efe6 }
2daf5a
a5af5a
e3cd8d ¤   static Boolean
4ed3c2 IncompatibleRAMDoublerIsRunning()
7bbb36 {
670feb ¤   short¤  vRefNum;
39f269 ¤   long¤   dirID;
d45814 ¤   Boolean¤foundProblem¤   = false;
0baf5a
9f1740 ¤   if ( VirtualMemoryIsOn() )
a7c7a1 ¤   {
de9907 ¤   ¤   if( IsntErr( FindFolder( kOnSystemDisk, kControlPanelFolderType,
055a84 ¤   ¤   ¤   ¤   ¤   ¤   kDontCreateFolder, &vRefNum, &dirID ) ) )
1a5b34 ¤   ¤   {
ec48e4 ¤   ¤   ¤   const OSType¤   kRAMDoubler2Creator¤= 'RaM2';¤  // type 'cdev'
77d1d9 ¤   ¤   ¤   FSSpec¤ ¤   ¤   spec;
6b87c7 ¤   ¤   ¤
2ea4db ¤   ¤   ¤   foundProblem = FindItemInFolder( vRefNum, dirID,
aabf6c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kRAMDoubler2Creator, 'cdev', &spec );
ead956 ¤   ¤   ¤   if ( foundProblem )
1ef776 ¤   ¤   ¤   {
0db6c0 ¤   ¤   ¤   ¤   ushort¤ version;
b08756 ¤   ¤   ¤   ¤   OSErr¤  err;
3f2b85 ¤   ¤   ¤   ¤
f59c12 ¤   ¤   ¤   ¤   // check the version number
186d60 ¤   ¤   ¤   ¤   err¤= FSpGetFileVersion( &spec, &version );
3d21d7 ¤   ¤   ¤   ¤   foundProblem¤   = IsntErr( err ) && version < 0x0201;
8da3a6 ¤   ¤   ¤   }
510fe4 ¤   ¤   }
0f8616 ¤   ¤   else if ( IsntErr( FindFolder( kOnSystemDisk, kExtensionFolderType,
4d5a84 ¤   ¤   ¤   ¤   ¤   ¤   kDontCreateFolder, &vRefNum, &dirID ) ) )
e85b34 ¤   ¤   {
b99a97 ¤   ¤   ¤   const OSType¤   kRAMDoubler1Creator¤= 'RaM2';¤  // type 'INIT'
4e87c7 ¤   ¤   ¤
02a4db ¤   ¤   ¤   foundProblem = FindItemInFolder( vRefNum, dirID,
1d1054 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kRAMDoubler1Creator, 'INIT', nil );
a00fe4 ¤   ¤   }
9f9371 ¤   }
c667c5 ¤
27d5d2 ¤   return( foundProblem );
9befe6 }
e0af5a
ddea4b #if PGPDISK_PUBLIC_KEY
a5af5a
13cd8d ¤   static Boolean
56f011 HavePGPsdk(void)
b1bb36 {
919a91 ¤   Boolean¤haveSDK¤= FALSE;
4167c5 ¤
e0d00e ¤   if( (void *) PGPNewContext != (void *) kUnresolvedCFragSymbolAddress )
ecc7a1 ¤   {
6731c1 ¤   ¤   PGPContextRef¤  context;
9d1b52 ¤   ¤
eff3af ¤   ¤   if( IsntPGPError( PGPNewContext( kPGPsdkAPIVersion, &context ) ) )
--6ecc 00063015cc040120010 Page 6 of CPGPDiskApplication.cp
e35b34 ¤   ¤   {
0c60c9 ¤   ¤   ¤   haveSDK = TRUE;
2487c7 ¤   ¤   ¤
b6d288 ¤   ¤   ¤   PGPFreeContext( context );
ab0fe4 ¤   ¤   }
659371 ¤   }
1a67c5 ¤
df525a ¤   return( haveSDK );
d5efe6 }
bcaf5a
107454 #endif
eeaf5a
18cd8d ¤   static Boolean
13f86b VerifyEnvironment(void)
f3bb36 {
b2baed ¤   long¤   gestaltResult;
4e6022 ¤   ushort¤ systemVersion;
dd67c5 ¤
ad49fe ¤   systemVersion = GetSystemVersion();
13af5a
e09885 ¤   if( systemVersion >= kMinSystemVersion )
09c7a1 ¤   {
dfe17c ¤   ¤   // don't forward check
409371 ¤   }
190e24 ¤   else
e8c7a1 ¤   {
2e78c2 ¤   ¤   Str255¤ versionString;
f31b52 ¤   ¤
8dfb7d ¤   ¤   VersionToString( kMinSystemVersion, versionString );
db6740 ¤   ¤   ParamText( versionString, "\p", "\p", "\p" );
9cd13a ¤   ¤   StopAlert( kMinSystemVersionAlertResID, nil );
42e20d ¤   ¤   return( FALSE );
3c9371 ¤   }
4baf5a
dfc3ca ¤   if( Gestalt( gestaltProcessorType, &gestaltResult ) == noErr &&
a18237 ¤   ¤   gestaltResult >= gestalt68020 )
78c7a1 ¤   {
aa4c25 ¤   ¤   // OK
8f9371 ¤   }
1a0e24 ¤   else
aec7a1 ¤   {
67a65e ¤   ¤   StopAlert( kNeed68020AlertResID, nil );
3ee20d ¤   ¤   return( FALSE );
fa9371 ¤   }
7aaf5a
af34eb ¤   if ( ! VerifyCastSBoxesValid() )
a4c7a1 ¤   {
73ed6a ¤   ¤   StopAlert( kCastSBoxesInvalidAlertResID, nil);
0d25b6 ¤   ¤   return( false );
409371 ¤   }
5567c5 ¤
782b14 ¤   // Check to make sure that ¤there are not later version of the driver
daaece ¤   // active. If so, refuse to run. It is assumed that the user has access
3fa929 ¤   // to the later version of the active application.
7f67c5 ¤
77c7a1 ¤   {
ccd0bb ¤   ¤   const ushort¤   kMaxDrivers¤= 200;
681156 ¤   ¤   short¤  ¤   ¤   driverRefNums[ kMaxDrivers ];
fad356 ¤   ¤   ushort¤ ¤   ¤   numDrivers;
cbbf51 ¤   ¤   Boolean¤¤   ¤   foundLaterDriver = FALSE;
1287c7 ¤   ¤   ¤
ade6b5 ¤   ¤   GetAllPGPDiskDrivers( driverRefNums, kMaxDrivers, &numDrivers );
ac1b52 ¤   ¤
d5af09 ¤   ¤   for( ushort driverIndex = 0; driverIndex < numDrivers; ++driverIndex )
db5b34 ¤   ¤   {
28553d ¤   ¤   ¤   PGPDriverInfoStruct¤info;
11af5a
4e75e8 ¤   ¤   ¤   if ( IsntErr( GetPGPDiskDriverInfo( driverRefNums[ driverIndex ],
43a6b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &info ) ) )
1cf776 ¤   ¤   ¤   {
14a906 ¤   ¤   ¤   ¤   if( info.versionOut > kPGPDiskDriverVersion )
6372c3 ¤   ¤   ¤   ¤   {
--d802 000def220a640120010 Page 7 of CPGPDiskApplication.cp
586607 ¤   ¤   ¤   ¤   ¤   foundLaterDriver = TRUE;
9d14c3 ¤   ¤   ¤   ¤   ¤   break;
272613 ¤   ¤   ¤   ¤   }
45a3a6 ¤   ¤   ¤   }
75bb8c ¤   ¤   ¤   else
dff776 ¤   ¤   ¤   {
fb60bf ¤   ¤   ¤   ¤   foundLaterDriver = TRUE;
cdf622 ¤   ¤   ¤   ¤   break;
68a3a6 ¤   ¤   ¤   }
1d0fe4 ¤   ¤   }
0f67c5 ¤
b1edae ¤   ¤   if( foundLaterDriver )
c55b34 ¤   ¤   {
9ad7f3 ¤   ¤   ¤   StopAlert( kFoundLaterDriverAlertResID, nil);
04f4dc ¤   ¤   ¤   return( FALSE );¤   ¤
f20fe4 ¤   ¤   }
6d9371 ¤   }
a1af5a
26c14a ¤   if( DiskExpressIsRunning() )
07c7a1 ¤   {
2a3b21 ¤   ¤   StopAlert( kDiskExpressIncompatibleAlertResID, nil);
16c3d4 ¤   ¤   return( FALSE );¤   ¤
179371 ¤   }
1baf5a
ce6d1b ¤   if( IncompatibleRAMDoublerIsRunning() )
85c7a1 ¤   {
9858b3 ¤   ¤   StopAlert( kRAMDoublerIncompatibleAlertResID, nil);
dfc3d4 ¤   ¤   return( FALSE );¤   ¤
a29371 ¤   }
5267c5 ¤
e067c5 ¤
ab9838 #if BETA
9e6711 ¤   if ( BetaExpired() )
f2c7a1 ¤   {
64b202 ¤   ¤   NoteAlert( kBetaExpiredAlertResID, nil );
5308ed ¤   ¤   // keep going
319371 ¤   }
bd7454 #endif
b9af5a
e8ea4b #if PGPDISK_PUBLIC_KEY
7b48bb ¤   if( ! HavePGPsdk() )
fdc7a1 ¤   {
a2a109 ¤   ¤   StopAlert( kNeedPGPsdkAlertResID, nil);
51c3d4 ¤   ¤   return( FALSE );¤   ¤
43f828 ¤   }¤
a67454 #endif
04af5a
521966 ¤   return( TRUE );
5defe6 }
efaf5a
ba3944 ¤   static Handle
e62928 AllocLargeHandle(void)
7dbb36 {
2a387f ¤   Handle¤ theHandle¤  = nil;
74ea8f ¤   UInt32¤ attemptSize = 128UL * 1024UL;
af67c5 ¤
f31ad9 ¤   while ( attemptSize >= 4 )
edc7a1 ¤   {
948ee7 ¤   ¤   theHandle = NewHandle( attemptSize );
f3b2f7 ¤   ¤   if ( IsntNull( theHandle ) )
46cdcb ¤   ¤   ¤   break;
001b52 ¤   ¤
68b1e1 ¤   ¤   attemptSize¤/= 2;
a79371 ¤   }
0167c5 ¤
ed89fb ¤   return( theHandle );
8defe6 }
cdaf5a
2533c8 ¤   static void
f1a723 ClearAllFreeMemory()
ffbb36 {
de4cf6 ¤   typedef struct ListItem
--9f44 00074cd582040120010 Page 8 of CPGPDiskApplication.cp
f7c7a1 ¤   {
60825c ¤   ¤   struct ListItem **¤ next;
866592 ¤   } ListItem, **ListItemHandle;
9967c5 ¤
036996 ¤   ListItemHandle¤ nextHandle;
e6fd1a ¤   ListItemHandle¤ listHead¤   = nil;
b167c5 ¤
048b38 ¤   pgpAssert( GetZone() == ApplicationZone() );
c6defe ¤   SetZone( ApplicationZone() );
4867c5 ¤
a9af0e ¤   // allocate all free space and link it into a singly linked list
c5e4a0 ¤   while ( ( nextHandle = (ListItemHandle)AllocLargeHandle() ) != nil )
a8c7a1 ¤   {
5298f0 ¤   ¤   // safety check: could a Handle ever be less than the size of our
2d7797 ¤   ¤   // link?
d0a4a1 ¤   ¤   if ( GetHandleSize( (Handle)nextHandle ) < sizeof( **nextHandle ) )
f35b34 ¤   ¤   {
4b879a ¤   ¤   ¤   DisposeHandle( (Handle)nextHandle );
65cdcb ¤   ¤   ¤   break;
ba0fe4 ¤   ¤   }
d287c7 ¤   ¤   ¤
9d0fe3 ¤   ¤   (**nextHandle).next¤= listHead;
3be0ce ¤   ¤   listHead¤   ¤   ¤   = nextHandle;
279371 ¤   }
4caf5a
f55588 ¤   // we've now allocated all the space in the heap
94805c ¤   // clear all the bytes and free the space
f92e62 ¤   while ( IsntNull( listHead ) )
31c7a1 ¤   {
7f0c11 ¤   ¤   nextHandle¤ = (**listHead).next;
f81b52 ¤   ¤
7b89be ¤   ¤   pgpClearMemory( *listHead, GetHandleSize( (Handle)listHead ) );
99bfc0 ¤   ¤   DisposeHandle( (Handle)listHead );
9f1b52 ¤   ¤
73d3f9 ¤   ¤   listHead = nextHandle;
6d9371 ¤   }
33efe6 }
e9af5a
0c6d52 ¤   void
967f68 main(void)
2dbb36 {
1d5c98 #if PGP_DEBUG
d535b2 ¤   gDebugThrow = debugAction_LowLevelDebugger;
ea82d0 ¤   gDebugSignal = debugAction_LowLevelDebugger;
337454 #endif
b267c5 ¤
5eb567 ¤   InitializeHeap(3);
cb1fc2 ¤   UQDGlobals::InitializeToolbox(&qd);
f8bc3c ¤   UnloadScrap();
ee67c5 ¤
5c2681 ¤   DebugPatches_PatchDisposeTraps();
f2af5a
fb5bbb ¤   if( VerifyEnvironment() )
ddc7a1 ¤   {
24dadd ¤   ¤   #if USE_MAC_DEBUG_LEAKS
2937ed ¤   ¤   { CForceInitLPeriodical¤temp; }
acd656 ¤   ¤   #endif
6c1b52 ¤   ¤
549455 ¤   ¤   pgpLeaksBeginSession( "main" );
199da8 ¤   ¤   ¤   RealMain();
6a92f8 ¤   ¤   pgpLeaksEndSession( );
359371 ¤   }
7767c5 ¤
53d4ab ¤   ClearAllFreeMemory();
72efe6 }
32af5a
35f12d CPGPDiskApplication::CPGPDiskApplication()
20bb36 {
da270f ¤   gApplicationResFile = CurResFile();
b2e994 ¤   mApplication¤   ¤   = this;
0567c5 ¤
746b6b ¤   UEnvironment::InitEnvironment();
--af8b 000214190b740120010 Page 9 of CPGPDiskApplication.cp
1678cd ¤   UGraphicUtils::InitGraphicsUtilities();
e8af5a
bd0d59 #if PGPDISK_STANDALONE
9c52ca ¤   pgpClearMemory( &mPersonalization, sizeof( mPersonalization ) );
3171d7 ¤   mHavePersonalized = false;
087454 #endif
26af5a
1998c9 ¤   // Standard PowerPlant Classes
d5169d ¤   RegisterClass_( LCaption );
6559ed ¤   RegisterClass_( LDialogBox );
942dd2 ¤   RegisterClass_( LGADialog );
006197 ¤   RegisterClass_( LIconPane );
4f7e8d ¤   RegisterClass_( LPane );
c0ed01 ¤   RegisterClass_( LPicture );
f6a301 ¤   RegisterClass_( LTabGroup );
26323d ¤   RegisterClass_( LView );
67bb9e ¤   RegisterClass_( LWindow );
a9af5a
907a97 ¤   // PowerPlant Grayscale Classes
2daf5a
2941d9 ¤   RegisterClass_( LBevelButton );
845a7a ¤   RegisterClass_( LCheckBox );
2619fb ¤   RegisterClass_( LCmdBevelButton );
42a17b ¤   RegisterClass_( LEditText );
cb8652 ¤   RegisterClass_( LIconControl );
ecb90b ¤   RegisterClass_( LProgressBar );
300848 ¤   RegisterClass_( LPushButton );
a9b027 ¤   RegisterClass_( LRadioButton );
31a0a2 ¤   RegisterClass_( LRadioGroupView );
701462 ¤   RegisterClass_( LSeparatorLine );
ccda19 ¤   RegisterClass_( LStaticText );
f14a05 ¤   RegisterClass_( LTextGroupBox );
f167c5 ¤
075627 ¤   if( HaveAppearanceMgr() )
69c7a1 ¤   {
ec2f9a ¤   ¤   // Register Appearance Manager implementations
fbaf5a
cdfefb ¤   ¤   (void) RegisterAppearanceClient();
841b52 ¤   ¤
67b658 ¤   ¤   RegisterClassID_( LAMControlImp,¤   ¤   LBevelButton::imp_class_ID);
2d862a ¤   ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LCheckBox::imp_class_ID);
8b20a6 ¤   ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LIconControl::imp_class_ID);
8387fe ¤   ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LProgressBar::imp_class_ID);
da8ec0 ¤   ¤   RegisterClassID_( LAMControlImp,¤   ¤   LRadioButton::imp_class_ID);
c8c36d ¤   ¤   RegisterClassID_( LAMControlImp,¤   ¤   LSeparatorLine::imp_class_ID );
d1d6c1 ¤   ¤   RegisterClassID_( LAMControlViewImp, ¤  LTextGroupBox::imp_class_ID);
a2d7dc ¤   ¤   RegisterClassID_( CPGPAMEditTextImp,¤   LEditText::imp_class_ID);
06e3a4 ¤   ¤   RegisterClassID_( LAMPushButtonImp,¤¤   LPushButton::imp_class_ID);
f63dc8 ¤   ¤   RegisterClassID_( LAMStaticTextImp,¤¤   LStaticText::imp_class_ID);
f59371 ¤   }
c60e24 ¤   else
dfc7a1 ¤   {
6b9526 ¤   ¤   // Register Grayscale implementations
feaf5a
2a09a5 ¤   ¤   RegisterClassID_( LGABevelButtonImp,¤   LBevelButton::imp_class_ID );
784583 ¤   ¤   RegisterClassID_( LGACheckboxImp,¤  ¤   LCheckBox::imp_class_ID );
d55b09 ¤   ¤   RegisterClassID_( LGAEditTextImp,¤  ¤   LEditText::imp_class_ID );
e8fd5b ¤   ¤   RegisterClassID_( LGAIconControlImp,¤   LIconControl::imp_class_ID );
19bf29 ¤   ¤   RegisterClassID_( LGAProgressBarImp,¤   LProgressBar::imp_class_ID );
a4f5fb ¤   ¤   RegisterClassID_( LGAPushButtonImp,¤¤   LPushButton::imp_class_ID );
ca6bee ¤   ¤   RegisterClassID_( LGARadioButtonImp,¤   LRadioButton::imp_class_ID);
ca7362 ¤   ¤   RegisterClassID_( LGASeparatorImp,¤ ¤   LSeparatorLine::imp_class_ID );
c15c4f ¤   ¤   RegisterClassID_( LGAStaticTextImp,¤¤   LStaticText::imp_class_ID );
ad5c54 ¤   ¤   RegisterClassID_( LGATextGroupBoxImp,¤  LTextGroupBox::imp_class_ID );
559371 ¤   }
bcaf5a
bb0c53 ¤   // Custom classes·
2beeac ¤   RegisterClass_( CAboutCaption );
986592 ¤   RegisterClass_( CMainWindow );
69110a ¤   RegisterClass_( CPGPDiskDialog );
ae6c2f ¤   RegisterClass_( CPGPDiskWindow );
216575 ¤   RegisterClass_( CPicture );
--accf 000f17ebc1d40120010 Page 10 of CPGPDiskApplication.cp
e0cf70 ¤   RegisterClass_( CSetPassphraseDialog );
c7246e ¤   RegisterClass_( CGetPassphraseDialog );
aec6e1 ¤   RegisterClass_( CPreferencesDialog );
7f4550 ¤   RegisterClass_( CPassphraseEdit );
862001 ¤   RegisterClass_( CVersionCaption );
554909 ¤   RegisterClass_( CWarningAlert );
edde93 ¤   RegisterClass_( CNewDiskWizardDialog );
93af5a
3caf5a
d75c98 #if PGP_DEBUG
8067c5 ¤
90fa52 ¤   RegisterClass_( LPopupButton );
30af5a
844a66 ¤   RegisterClassID_( LGAPopupButtonImp, LPopupButton::imp_class_ID );
03af5a
c5fd2b ¤   RegisterClass_( CPGPActiveScroller );
b590ac ¤   RegisterClass_( CDiskTestsWindow );
1aba0d ¤   RegisterClass_( CDiskTestsTable );
8dea02 ¤   RegisterClass_( CEditDiskTestDialog );
a467c5 ¤
421e67 #endif¤ // PGP_DEBUG
d9af5a
c75618 ¤   ReadPreferences( &gPGPDiskPrefs );
aa2163 ¤   // Write out preferences to make sure sleep alert resources get copied
73e247 ¤   // to the preferences file.
5e3c06 ¤   WritePreferences( &gPGPDiskPrefs );
bcaf5a
69b52b ¤   randPoolStir();
84efe6 }
d6af5a
2db5d1 CPGPDiskApplication::~CPGPDiskApplication()
1ebb36 {
c73c06 ¤   WritePreferences( &gPGPDiskPrefs );
0aefe6 }
0baf5a
bc6d52 ¤   void
76be29 CPGPDiskApplication::Run()
8fbb36 {
3342dd ¤   LApplication::Run();
1267c5 ¤
502335 ¤   if( sMainWindowObj != nil )
57c7a1 ¤   {
e2bd32 ¤   ¤   Rect¤   contentRect;
681b52 ¤   ¤
b54720 ¤   ¤   contentRect = UWindows::GetWindowContentRect(
919af3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sMainWindowObj->GetMacPort() );
b51b52 ¤   ¤
8c7b6a ¤   ¤   gPGPDiskPrefs.mainWindowLocation.v = contentRect.top;
696ff7 ¤   ¤   gPGPDiskPrefs.mainWindowLocation.h = contentRect.left;
291b52 ¤   ¤
83581c ¤   ¤   sMainWindowObj->ProcessCommand( cmd_Close, nil );
849371 ¤   }
4e1b52 ¤   ¤
9d5c98 #if PGP_DEBUG
e89f95 ¤   if( sDiskTestsWindowObj != nil )
15c7a1 ¤   {
b2dd46 ¤   ¤   sDiskTestsWindowObj->ProcessCommand( cmd_Close, nil );
451b52 ¤   ¤
cc5e0b ¤   ¤   delete( sDiskTestsWindowObj );
097d5f ¤   ¤   sDiskTestsWindowObj = nil;
999371 ¤   }
4a7454 #endif
22efe6 }
b0af5a
156d52 ¤   void
04d736 CPGPDiskApplication::Initialize()
36bb36 {
011781 ¤   // we need to suspend leaks checking for the duration of these things
c0d3aa ¤   // because PowerPlant will never release certain items
98af5a
d632f4 ¤   MacLeaks_Suspend();
f1a0a2 ¤   ¤   LApplication::Initialize();
--504a 0001e93bd5c40120010 Page 11 of CPGPDiskApplication.cp
ba77d9 ¤   MacLeaks_Resume();
99af5a
9965f5 ¤   sMainWindowObj = (CMainWindow *) CMainWindow::CreateWindow(
d7608b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMainWindowResID, this );
454653 ¤   pgpAssertAddrValid( sMainWindowObj, CMainWindow );
63af5a
712335 ¤   if( sMainWindowObj != nil )
aac7a1 ¤   {
9927b8 ¤   ¤   sMainWindowObj->DoSetPosition( gPGPDiskPrefs.mainWindowLocation );
9f9371 ¤   }
78af5a
cbf066 ¤   StartRepeating();
3e67c5 ¤
225c98 #if PGP_DEBUG
c524fd ¤   InstallDebugMenu();
727454 #endif
12efe6 }
70af5a
c9af5a
a36d52 ¤   void
0230c4 CAboutCaption::DrawSelf()
45bb36 {
cb4cd0 ¤   Rect¤   ¤   paneRect;
968257 ¤   ResIDT¤ ¤   saveTxtrID¤ = mTxtrID;
1267c5 ¤
c9865e ¤   CalcLocalFrameRect( paneRect );
fbaf5a
854d4e ¤   StDeviceLoop¤   ¤   ¤   devLoop( paneRect );¤   ¤
95c896 ¤   SInt16¤ ¤   ¤   ¤   ¤   depth;
e9f8c6 ¤   RGBColor¤   ¤   ¤   ¤   saveBackColor;
75355c ¤   static const RGBColor¤  sRGBWhiteColor = {0xFFFF, 0xFFFF, 0xFFFF};
abaf5a
a44fd0 ¤   GetBackColor( &saveBackColor );
dbfba2 ¤   RGBBackColor( &sRGBWhiteColor );
8567c5 ¤
1ab111 ¤   while( devLoop.NextDepth( depth ) )
3dc7a1 ¤   {
17767d ¤   ¤   const ResIDT¤   kTextTraitsForSolidBackbround¤  = 133;
a65136 ¤   ¤   const ResIDT¤   kTextTraitsForWhiteBackbround¤  = 134;
db1b52 ¤   ¤
a08b92 ¤   ¤   if( depth >= 4 )
c95b34 ¤   ¤   {
007f91 ¤   ¤   ¤   mTxtrID = kTextTraitsForSolidBackbround;
3c0fe4 ¤   ¤   }
8c0e1d ¤   ¤   else
1d5b34 ¤   ¤   {
a85c37 ¤   ¤   ¤   mTxtrID = kTextTraitsForWhiteBackbround;
3c0fe4 ¤   ¤   }
9daf5a
531d55 ¤   ¤   LCaption::DrawSelf();
309371 ¤   }
d3af5a
85a501 ¤   RGBBackColor( &saveBackColor );
1c67c5 ¤
6eb835 ¤   mTxtrID¤= saveTxtrID;
7befe6 }
d2af5a
b5af5a
b96d52 ¤   void
1d6136 CPGPDiskApplication::GetPersonalizationString(StringPtr persStr)
7dbb36 {
017844 ¤   persStr[0] = 0;
2baf5a
3a55fc #if PGPDISK_STANDALONE¤
3db763 ¤   if( StrLength( mPersonalization.userName ) != 0 )
f2c7a1 ¤   {
692ff1 ¤   ¤   CopyPString( mPersonalization.userName, persStr );
e565f8 ¤   ¤   AppendPString( "\p\r", persStr );
849371 ¤   }
4daf5a
44e9df ¤   if( StrLength( mPersonalization.organization ) != 0 )
1ec7a1 ¤   {
--635c 000c4eb66cf40120010 Page 12 of CPGPDiskApplication.cp
e59fce ¤   ¤   AppendPString( mPersonalization.organization, persStr );
2965f8 ¤   ¤   AppendPString( "\p\r", persStr );
849371 ¤   }
f6db21 #else
1fc7a1 ¤   {
f3cf44 ¤   ¤   PGPError¤   ¤   err;
a35563 ¤   ¤   PGPMemoryMgrRef¤memoryMgr;
601b52 ¤   ¤
36faa7 ¤   ¤   err = PGPNewMemoryMgr( 0, &memoryMgr );
ca5e0d ¤   ¤   if( IsntPGPError( err ) )·
c55b34 ¤   ¤   {
dca4c2 ¤   ¤   ¤   PGPPrefRef¤ ¤   clientPrefsRef¤ = kInvalidPGPPrefRef;
9c87c7 ¤   ¤   ¤
550075 ¤   ¤   #if PGP_BUSINESS_SECURITY
725901 ¤   ¤   ¤   PGPPrefRef¤ ¤   adminPrefsRef¤  = kInvalidPGPPrefRef;¤
2ad656 ¤   ¤   #endif
92af5a
7e8d9d ¤   ¤   ¤   err = PGPOpenClientPrefs( memoryMgr, &clientPrefsRef );
81af5a
7e0075 ¤   ¤   #if PGP_BUSINESS_SECURITY
a51ffe ¤   ¤   ¤   if( IsntPGPError( err ) )·
0ef776 ¤   ¤   ¤   {
c60e99 ¤   ¤   ¤   ¤   err = PGPOpenAdminPrefs( memoryMgr, &adminPrefsRef );
aca3a6 ¤   ¤   ¤   }
7fd656 ¤   ¤   #endif
c1af5a
d8698b ¤   ¤   ¤   if( IsntPGPError( err ) )
e5f776 ¤   ¤   ¤   {
73cc58 ¤   ¤   ¤   ¤   char¤   ¤   companyStr[128];
7009bf ¤   ¤   ¤   ¤   char¤   ¤   nameStr[128];
2b708b ¤   ¤   ¤   ¤   char¤   ¤   str[256];
482b85 ¤   ¤   ¤   ¤
7017d6 ¤   ¤   ¤   ¤   companyStr[0] = 0;
692b85 ¤   ¤   ¤   ¤
a8ef06 ¤   ¤   ¤   #if PGP_BUSINESS_SECURITY
db69dd ¤   ¤   ¤   ¤   err = PGPGetPrefStringBuffer( adminPrefsRef, kPGPPrefAdminCompa¶
9329af nyName,
734c35 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( companyStr ) - 1, companySt¶
12ee5d r );
af55be ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
c734f5 ¤   ¤   ¤   #endif
4692fd ¤   ¤   ¤   ¤   if( companyStr[0] == 0 )
6472c3 ¤   ¤   ¤   ¤   {
a65605 ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefStringBuffer( clientPrefsRef, kPGPPrefCompa¶
4229af nyName,
a24c35 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( companyStr ) - 1, companySt¶
d3ee5d r );
dd5bf2 ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
942613 ¤   ¤   ¤   ¤   }
6d2b85 ¤   ¤   ¤   ¤
9ba785 ¤   ¤   ¤   ¤   err = PGPGetPrefStringBuffer( clientPrefsRef, kPGPPrefOwnerName,
2c44ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( companyStr ) - 1, nameStr );
5255be ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
282b85 ¤   ¤   ¤   ¤
d26a62 ¤   ¤   ¤   ¤   strcpy( str, nameStr );
d1fd5f ¤   ¤   ¤   ¤   strcat( str, "\r" );
d0dcb3 ¤   ¤   ¤   ¤   strcat( str, companyStr );
5c8220 ¤   ¤   ¤   ¤   CToPString( str, persStr );
1ea3a6 ¤   ¤   ¤   }
2987c7 ¤   ¤   ¤
c9c933 ¤   ¤   ¤   if( PGPPrefRefIsValid( clientPrefsRef ) )
4416e5 ¤   ¤   ¤   ¤   PGPClosePrefFile( clientPrefsRef );
bcaf5a
320075 ¤   ¤   #if PGP_BUSINESS_SECURITY
d9bc44 ¤   ¤   ¤   if( PGPPrefRefIsValid( adminPrefsRef ) )
570691 ¤   ¤   ¤   ¤   PGPClosePrefFile( adminPrefsRef );
45d656 ¤   ¤   #endif
481b52 ¤   ¤
54dbb7 ¤   ¤   ¤   PGPFreeMemoryMgr( memoryMgr );
ea0fe4 ¤   ¤   }
889371 ¤   }
c47454 #endif
--03e0 000419d3ea940120010 Page 13 of CPGPDiskApplication.cp
7aefe6 }
46af5a
8eaf5a
79af5a
85af5a
366d52 ¤   void
92e18a CPGPDiskApplication::ShowAboutBox()
17bb36 {
7e9c71 ¤   CPGPStDialogHandler¤aboutDialog(kAboutDialogResID, this);
6441d1 ¤   LWindow¤¤   ¤   *theDialog;
fe6cf8 ¤   MessageT¤   ¤   message;
966215 ¤   Boolean¤¤   ¤   credits = FALSE;
a6c8f3 ¤   LCaption¤   ¤   *persInfo;
b24fcd ¤   Str255¤ ¤   ¤   persStr;
ac67c5 ¤
c051f1 ¤   const MessageT¤ ¤   kPGPButtonMessage¤  ¤   = 'bPGP';
add793 ¤   const MessageT¤ ¤   kCreditsButtonMessage¤  = 'bCre';
ac7281 ¤   const MessageT¤ ¤   kOKButtonMessage¤   ¤   = 'bOK ';
c267c5 ¤
e45a36 ¤   const PaneIDT¤  ¤   kCreditsButtonPaneID¤   = 'bCre';
3cb0be ¤   const PaneIDT¤  ¤   kAboutPicturePaneID¤¤   = 'APIC';
720070 ¤   const PaneIDT¤  ¤   kCreditsPicturePaneID¤  = 'CPIC';
36659f ¤   const PaneIDT¤  ¤   kPersonalizationPaneID¤ = 'Pers';
9667c5 ¤
dfc199 ¤   theDialog = aboutDialog.GetDialog();
2caf5a
508885 ¤   persInfo = (LCaption *) theDialog->FindPaneByID( kPersonalizationPaneID );
05eae0 ¤   pgpAssertAddrValid( persInfo, LCaption );
9867c5 ¤
7a152f ¤   GetPersonalizationString( persStr );
3467c5 ¤
631ef2 ¤   persInfo->SetDescriptor( persStr );
0e67c5 ¤
f305f5 ¤   theDialog->Select();
490cf4 ¤   theDialog->Show();
4667c5 ¤
f1396b ¤   while((message = aboutDialog.DoDialog()) != kOKButtonMessage )
09c7a1 ¤   {
592afa ¤   ¤   if( message == kPGPButtonMessage )
055b34 ¤   ¤   {
f5cf7c ¤   ¤   ¤   Str255¤ url;
e887c7 ¤   ¤   ¤
936f7d ¤   ¤   ¤   GetIndString( url, kMiscStringsListResID, kPGPWebSiteURLStrIndex );
ea93b1 ¤   ¤   ¤   if( IsErr( OpenURL( url ) ) )
2cf776 ¤   ¤   ¤   {
174b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
42a3a6 ¤   ¤   ¤   }
e90fe4 ¤   ¤   }
efb1df ¤   ¤   else if ( message == kCreditsButtonMessage )
b15b34 ¤   ¤   {
0bd211 ¤   ¤   ¤   Str255¤ buttonTitle;
8187c7 ¤   ¤   ¤
3ec9e9 ¤   ¤   ¤   if( credits )
75f776 ¤   ¤   ¤   {
21090e ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kAboutPicturePaneID )->Show();
fc67c1 ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kCreditsPicturePaneID )->Hide();
492b85 ¤   ¤   ¤   ¤
df79dd ¤   ¤   ¤   ¤   GetIndString( buttonTitle, kMiscStringsListResID,
a6d0ee ¤   ¤   ¤   ¤   ¤   ¤   kAboutCreditsButtonTitleStrIndex );
72a3a6 ¤   ¤   ¤   }
0fbb8c ¤   ¤   ¤   else
15f776 ¤   ¤   ¤   {
108bed ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kCreditsPicturePaneID )->Show();
0ae522 ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kAboutPicturePaneID )->Hide();
ba2b85 ¤   ¤   ¤   ¤
f479dd ¤   ¤   ¤   ¤   GetIndString( buttonTitle, kMiscStringsListResID,
903c2d ¤   ¤   ¤   ¤   ¤   ¤   kAboutInfoButtonTitleStrIndex );
7da3a6 ¤   ¤   ¤   }
8587c7 ¤   ¤   ¤
d2acbe ¤   ¤   ¤   ((LPushButton *)theDialog->FindPaneByID(kCreditsButtonPaneID))->
99528a ¤   ¤   ¤   ¤   ¤   ¤   SetDescriptor( buttonTitle );
41af5a
--f396 00013e9acb240120010 Page 14 of CPGPDiskApplication.cp
e0b644 ¤   ¤   ¤   credits = ! credits;
540fe4 ¤   ¤   }
369371 ¤   }
40efe6 }
07af5a
477e69 ¤   Boolean
1fb740 CPGPDiskApplication::ObeyCommand(CommandT inCommand, void *ioParam)
ecbb36 {
3efad8 ¤   Boolean¤cmdHandled = TRUE;
74af5a
eec469 ¤   switch (inCommand)
d6c7a1 ¤   {
ff2708 ¤   ¤   case cmd_NewPGPDisk:
eaa8d7 ¤   ¤   ¤   HandleNewPGPDisk();
afcdcb ¤   ¤   ¤   break;
dd87c7 ¤   ¤   ¤
a468b1 ¤   ¤   case cmd_MountPGPDisk:
31d0af ¤   ¤   ¤   (void) HandleMountPGPDisk( NULL );
26cdcb ¤   ¤   ¤   break;
3567c5 ¤
f217cc ¤   ¤   case cmd_AddPassphrase:
184877 ¤   ¤   ¤   HandleAddPassphrase();
02cdcb ¤   ¤   ¤   break;
8887c7 ¤   ¤   ¤
d6a3e0 ¤   ¤   case cmd_ChangePassphrase:
9dfd90 ¤   ¤   ¤   HandleChangePassphrase();
b8cdcb ¤   ¤   ¤   break;
972b85 ¤   ¤   ¤   ¤
88e572 ¤   ¤   case cmd_RemovePassphrase:
045b34 ¤   ¤   {
b1335d ¤   ¤   ¤   if( sRemoveAlternatePassphrases )
18f776 ¤   ¤   ¤   {
e0262f ¤   ¤   ¤   ¤   HandleRemoveAltPassphrases();
eaa3a6 ¤   ¤   ¤   }
43bb8c ¤   ¤   ¤   else
d6f776 ¤   ¤   ¤   {
b8cca1 ¤   ¤   ¤   ¤   HandleRemovePassphrase();
66a3a6 ¤   ¤   ¤   }
edcdcb ¤   ¤   ¤   break;
af0fe4 ¤   ¤   }
58af5a
1c9562 ¤   ¤   case cmd_Preferences:
b45fac ¤   ¤   ¤   DoPreferencesDialog();
38cdcb ¤   ¤   ¤   break;
89af5a
33ea4b #if PGPDISK_PUBLIC_KEY
ab3669 ¤   ¤   case cmd_AddRemovePublicKeys:
84fdbc ¤   ¤   ¤   (void) HandleAddRemovePublicKeys();
10cdcb ¤   ¤   ¤   break;
397454 #endif
d3af5a
6f5c98 #if PGP_DEBUG
eca246 ¤   ¤   case cmd_DebugDiskTestsWindow:
a55b34 ¤   ¤   {
8e237b ¤   ¤   ¤   if( sDiskTestsWindowObj == nil )
d0f776 ¤   ¤   ¤   {
9ce233 ¤   ¤   ¤   ¤   MacLeaks_Suspend();
012b85 ¤   ¤   ¤   ¤
076331 ¤   ¤   ¤   ¤   sDiskTestsWindowObj =
e41785 ¤   ¤   ¤   ¤   ¤   ¤   (CDiskTestsWindow *) CDiskTestsWindow::CreateWindow(
f93d21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDiskTestsWindowResID, this );
897ee0 ¤   ¤   ¤   ¤   pgpAssertAddrValid( sDiskTestsWindowObj, CDiskTestsWindow );
10af5a
890149 ¤   ¤   ¤   ¤   MacLeaks_Resume();¤
43a3a6 ¤   ¤   ¤   }
a587c7 ¤   ¤   ¤
3b9cc0 ¤   ¤   ¤   if( sDiskTestsWindowObj != nil )
70f776 ¤   ¤   ¤   {
5cca0c ¤   ¤   ¤   ¤   sDiskTestsWindowObj->Select();
b5af5a
f599c2 ¤   ¤   ¤   ¤   if( ! sDiskTestsWindowObj->IsVisible() )
13cc51 ¤   ¤   ¤   ¤   ¤   sDiskTestsWindowObj->Show();
--a766 000472fcaa440120010 Page 15 of CPGPDiskApplication.cp
cfa3a6 ¤   ¤   ¤   }
ea2b85 ¤   ¤   ¤   ¤
48cdcb ¤   ¤   ¤   break;
600fe4 ¤   ¤   }
b91b52 ¤   ¤
c700c9 ¤   ¤   case cmd_DebugMountUnmountTest:
e58300 ¤   ¤   ¤   DebugMountUnmountTest();
cecdcb ¤   ¤   ¤   break;
8287c7 ¤   ¤   ¤
4edc4d ¤   ¤   case cmd_DebugUnmountAllPGPDisks:
51bd28 ¤   ¤   ¤   DebugUnmountAllPGPDisks();
e4cdcb ¤   ¤   ¤   break;
4d87c7 ¤   ¤   ¤
63c4ce ¤   ¤   case cmd_DebugFragmentFile:
94c2d7 ¤   ¤   ¤   DebugFragmentFile();
bfcdcb ¤   ¤   ¤   break;
45af5a
15441e ¤   ¤   case cmd_DebugTemp1:
f0e528 ¤   ¤   ¤   DebugTemp1();
2ecdcb ¤   ¤   ¤   break;
1daf5a
b2ab7a ¤   ¤   case cmd_DebugTemp2:
f6f8e4 ¤   ¤   ¤   DebugTemp2();
f3cdcb ¤   ¤   ¤   break;
7daf5a
19f1a6 ¤   ¤   case cmd_DebugTemp3:
15f3a0 ¤   ¤   ¤   DebugTemp3();
2ccdcb ¤   ¤   ¤   break;
3f7454 #endif
a0af5a
2f9ae3 ¤   ¤   default:
6ce7f2 ¤   ¤   ¤   cmdHandled = LApplication::ObeyCommand(inCommand, ioParam);
0bcdcb ¤   ¤   ¤   break;
0d9371 ¤   }
b1af5a
6b51a4 ¤   return cmdHandled;
fdefe6 }
5daf5a
8d6d52 ¤   void
201ff0 CPGPDiskApplication::FindCommandStatus(
55ea24 ¤   CommandT¤   inCommand,
88a472 ¤   Boolean¤¤   &outEnabled,
4f3a4d ¤   Boolean¤¤   &outUsesMark,
155dc0 ¤   Char16¤ ¤   &outMark,
f7d894 ¤   Str255¤ ¤   outName)
34bb36 {
63ad11 ¤   outUsesMark = false;
9e67c5 ¤
f23093 ¤   switch(inCommand)
1dc7a1 ¤   {
6b3e39 ¤   ¤   case cmd_About:
adf85a ¤   ¤   case cmd_Quit:
1c68b1 ¤   ¤   case cmd_MountPGPDisk:
019562 ¤   ¤   case cmd_Preferences:
7fc1db ¤   ¤   ¤   outEnabled¤ = ! UDesktop::FrontWindowIsModal();
34cdcb ¤   ¤   ¤   break;
87af5a
112708 ¤   ¤   case cmd_NewPGPDisk:
8617cc ¤   ¤   case cmd_AddPassphrase:
75a3e0 ¤   ¤   case cmd_ChangePassphrase:
c8e572 ¤   ¤   case cmd_RemovePassphrase:
9c5b34 ¤   ¤   {
f8c1db ¤   ¤   ¤   outEnabled¤ = ! UDesktop::FrontWindowIsModal();
fe9801 ¤   #if BETA
f0e81a ¤   ¤   ¤   if ( BetaExpired() )
92f776 ¤   ¤   ¤   {
5b6f5d ¤   ¤   ¤   ¤   outEnabled¤ = false;
f4a3a6 ¤   ¤   ¤   }
b8b7ec ¤   #endif
5f67c5 ¤
db829f ¤   ¤   ¤   if( inCommand == cmd_RemovePassphrase )
47f776 ¤   ¤   ¤   {
--bff5 000ae9c2d2040120010 Page 16 of CPGPDiskApplication.cp
c66429 ¤   ¤   ¤   ¤   short¤  strIndex;
9c2b85 ¤   ¤   ¤   ¤
f5236d ¤   ¤   ¤   ¤   if( ( GetModifiers() & optionKey ) == optionKey )
f072c3 ¤   ¤   ¤   ¤   {
7a3eb1 ¤   ¤   ¤   ¤   ¤   strIndex = kRemoveAltPassphrasesMenuItemStrIndex;
4989a6 ¤   ¤   ¤   ¤   ¤   sRemoveAlternatePassphrases¤= TRUE;
442613 ¤   ¤   ¤   ¤   }
4afa07 ¤   ¤   ¤   ¤   else
7772c3 ¤   ¤   ¤   ¤   {
a0840f ¤   ¤   ¤   ¤   ¤   strIndex = kRemovePassphraseMenuItemStrIndex;
79e39c ¤   ¤   ¤   ¤   ¤   sRemoveAlternatePassphrases = FALSE;
0c2613 ¤   ¤   ¤   ¤   }
f72b85 ¤   ¤   ¤   ¤
17d41e ¤   ¤   ¤   ¤   GetIndString( outName, kMiscStringsListResID, strIndex );
81a3a6 ¤   ¤   ¤   }
1bcdcb ¤   ¤   ¤   break;
520fe4 ¤   ¤   }
8eaf5a
ffea4b #if PGPDISK_PUBLIC_KEY
603669 ¤   ¤   case cmd_AddRemovePublicKeys:
7de6cf ¤   ¤   ¤   outEnabled = TRUE;
f2cdcb ¤   ¤   ¤   break;
cb7454 #endif
16af5a
d05c98 #if PGP_DEBUG
f7a246 ¤   ¤   case cmd_DebugDiskTestsWindow:
2500c9 ¤   ¤   case cmd_DebugMountUnmountTest:
08dc4d ¤   ¤   case cmd_DebugUnmountAllPGPDisks:
24c4ce ¤   ¤   case cmd_DebugFragmentFile:
e0441e ¤   ¤   case cmd_DebugTemp1:
30ab7a ¤   ¤   case cmd_DebugTemp2:
e9f1a6 ¤   ¤   case cmd_DebugTemp3:
fce6cf ¤   ¤   ¤   outEnabled = TRUE;
c6cdcb ¤   ¤   ¤   break;
be7454 #endif
b0af5a
ec9ae3 ¤   ¤   default:
05131d ¤   ¤   ¤   LApplication::FindCommandStatus(inCommand, outEnabled,
f09a8f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outUsesMark, outMark, outName);
e3cdcb ¤   ¤   ¤   break;
d79371 ¤   }
4aefe6 }
52af5a
da1a2a ¤   static pascal Boolean
4eb7b9 sFilterOpenFiles(CInfoPBRec * cpb)
73bb36 {
8829f7 ¤   Boolean¤showFile¤   = TRUE;
fc67c5 ¤
3340c6 ¤   showFile¤   = ! cpbIsOpen( cpb );
7667c5 ¤
64e597 ¤   return( ! showFile );
74efe6 }
19af5a
3faf5a
66a8fc //¤ Presents a Standard File put dialog for getting an exting PGPDisk file.
f9af5a
9c85ea ¤   OSStatus
3b7702 CPGPDiskApplication::GetExistingPGPDiskFSSpec(FSSpec *fileSpec)
0bbb36 {
fc0925 ¤   StandardFileReply¤  sfReply;
79b9bd ¤   SFTypeList¤ ¤   ¤   typeList;
dff959 ¤   OSStatus¤   ¤   ¤   status = noErr;
3c1c2d ¤   FileFilterUPP¤  ¤   upp;
5c67c5 ¤
ca9ac1 ¤   upp¤= NewFileFilterProc( sFilterOpenFiles );
8267c5 ¤
1c9dd5 ¤   pgpAssertAddrValid( fileSpec, FSSpec );
7567c5 ¤
8bb55c ¤   typeList[0] = kPGPDiskFileType;
ed67c5 ¤
f52e94 ¤   StandardGetFile( upp, 1, typeList, &sfReply );
ae67c5 ¤
--8249 000babc957440120010 Page 17 of CPGPDiskApplication.cp
a09428 ¤   DisposeRoutineDescriptor( upp );
0167c5 ¤
b0026c ¤   if( sfReply.sfGood )
98c7a1 ¤   {
09803e ¤   ¤   // Canonicalize the spec.
1544e8 ¤   ¤   (void) FSMakeFSSpec( sfReply.sfFile.vRefNum, sfReply.sfFile.parID,
ee6165 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sfReply.sfFile.name, fileSpec );
f39371 ¤   }
a40e24 ¤   else
f2c7a1 ¤   {
15a6c1 ¤   ¤   status = userCanceledErr;
899371 ¤   }
9867c5 ¤
244afd ¤   return( status );
c4efe6 }
28af5a
2d6d52 ¤   void
e7260c CPGPDiskApplication::HandleNewPGPDisk(void)
bdbb36 {
bbb8e5 ¤   CComboError¤err;
1c67c5 ¤
c3be29 #if PGP_BUSINESS_SECURITY
fcd11e ¤   PGPContextRef¤  ¤   ¤   context = kInvalidPGPContextRef;
55ea48 ¤   PGPKeySetRef¤   ¤   ¤   allKeys = kInvalidPGPKeySetRef;
3771fd ¤   PGPKeyRef¤  ¤   ¤   ¤   adkRef = kInvalidPGPKeyRef;
42bfe9 ¤   PGPBoolean¤ ¤   ¤   ¤   haveADK;
953f1b ¤   PGPKeyID¤   ¤   ¤   ¤   keyID;
91ea37 ¤   PGPPublicKeyAlgorithm¤  algorithm;
9c1b52 ¤   ¤
df7cab ¤   err.pgpErr = GetADKInfo( &haveADK, &keyID, &algorithm );
05d6b4 ¤   if( err.IsntError() && haveADK )
1bc7a1 ¤   {
bf294d ¤   ¤   PGPError¤   tempErr;
fc2b85 ¤   ¤   ¤   ¤
cdaeb2 ¤   ¤   tempErr = PGPNewContext( kPGPsdkAPIVersion, &context );
c3ad81 ¤   ¤   if( IsntPGPError( tempErr ) )
215b34 ¤   ¤   {
cdecae ¤   ¤   ¤   tempErr = PGPsdkLoadDefaultPrefs( context );
dc916f ¤   ¤   ¤   if( IsntPGPError( tempErr ) )
fcf776 ¤   ¤   ¤   {
75708d ¤   ¤   ¤   ¤   tempErr = PGPOpenDefaultKeyRings( context, 0, &allKeys );
50a8aa ¤   ¤   ¤   ¤   if( IsntPGPError( tempErr ) )
5872c3 ¤   ¤   ¤   ¤   {
9540b7 ¤   ¤   ¤   ¤   ¤   tempErr = PGPGetKeyByKeyID( allKeys, &keyID, algorithm,
8621e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &adkRef );
f92613 ¤   ¤   ¤   ¤   }
3aa3a6 ¤   ¤   ¤   }
ca0fe4 ¤   ¤   }
5b1b52 ¤   ¤
7f756e ¤   ¤   if( IsPGPError( tempErr ) )
209784 ¤   ¤   ¤   err.err = kPGPdiskADKNotFoundError;
909371 ¤   }
6a7454 #endif
fd1b52 ¤   ¤
51d3cb ¤   if( err.IsntError() )
7fc7a1 ¤   {
06869e ¤   ¤   CNewDiskWizardDialog¤   *theDialog;
b51b52 ¤   ¤
020c24 ¤   ¤   theDialog = (CNewDiskWizardDialog *) LWindow::CreateWindow(
296e1b ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNewDiskWizardResID, this );
26377d ¤   #if PGP_BUSINESS_SECURITY
1bd3b0 ¤   ¤   if( IsntNull( theDialog ) && haveADK )
cd5b34 ¤   ¤   {
453a81 ¤   ¤   ¤   theDialog->SetADK( context, allKeys, adkRef );
0a87c7 ¤   ¤   ¤
ad1a2d ¤   ¤   ¤   // Dialog takes ownership of keyset and context
b118f0 ¤   ¤   ¤   context = kInvalidPGPContextRef;
a89389 ¤   ¤   ¤   allKeys¤= kInvalidPGPKeySetRef;
ea0fe4 ¤   ¤   }
97b7ec ¤   #endif
1a9371 ¤   }
ba0e24 ¤   else
--327c 0002b465e8c40120010 Page 18 of CPGPDiskApplication.cp
a72ef1 ¤   {¤
f5aa47 ¤   ¤   Str255¤ errorStr;
b21b52 ¤   ¤
f336ff ¤   ¤   GetComboErrorString( err, errorStr );
d51b52 ¤   ¤
b2057e ¤   ¤   SysBeep( 1 );
39148d ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
26e6f4 ¤   ¤   ¤   ¤   ¤   kErrorStringListResID,
a15b03 ¤   ¤   ¤   ¤   ¤   kCouldNotCreateDiskBecauseStrIndex,
8d37f0 ¤   ¤   ¤   ¤   ¤   errorStr );
b69371 ¤   }
c6af5a
92be29 #if PGP_BUSINESS_SECURITY
bbba78 ¤   if( PGPKeySetRefIsValid( allKeys ) )
a58231 ¤   ¤   PGPFreeKeySet( allKeys );
2167c5 ¤
3aafbd ¤   if( PGPContextRefIsValid( context ) )
cd937b ¤   ¤   PGPFreeContext( context );
9b7454 #endif
50efe6 }
4baf5a
3485b7 ¤   CComboError
de6277 CPGPDiskApplication::HandleMountPGPDisk(const FSSpec *inFileSpec)
4bbb36 {
1fb8e5 ¤   CComboError¤err;
84fc44 ¤   FSSpec¤ ¤   fileSpec;
e42c29 ¤   Boolean¤¤   mountFailed;
8fae30 ¤   ¤   ¤   ¤   ¤
f0267d ¤   mountFailed = FALSE;
f267c5 ¤
bd531d ¤   // Prompt for the file if inFileSpec is nil
3ebf3b ¤   if( IsNull( inFileSpec ) )
56c7a1 ¤   {
e553b0 ¤   ¤   err.err = GetExistingPGPDiskFSSpec( &fileSpec );
2b9371 ¤   }
ab0e24 ¤   else
71c7a1 ¤   {
71955e ¤   ¤   AssertSpecIsValid( inFileSpec, "HandleMountPGPDisk" );
821b52 ¤   ¤
8f5aa4 ¤   ¤   fileSpec = *inFileSpec;
d99371 ¤   }
ea67c5 ¤
cb3653 tryAgain:
87d3cb ¤   if( err.IsntError() )
85c7a1 ¤   {
12f051 ¤   ¤   PGPDiskFileInfo¤¤   fileInfo;
5e1b52 ¤   ¤
77cf54 ¤   ¤   err.err = GetPGPDiskFileInfo( &fileSpec, &fileInfo );
005a9f ¤   ¤   if( err.IsntError() )
d05b34 ¤   ¤   {
ab62ce ¤   ¤   ¤   if( fileInfo.fileIsOpen )
3af776 ¤   ¤   ¤   {
d9a635 ¤   ¤   ¤   ¤   if( fileInfo.fileIsInUseByDriver )
c972c3 ¤   ¤   ¤   ¤   {
10fbf8 ¤   ¤   ¤   ¤   ¤   if( fileInfo.fileIsMounted )
714859 ¤   ¤   ¤   ¤   ¤   {
92cc27 ¤   ¤   ¤   ¤   ¤   ¤   err.err = kPGPDiskFileInUseByDriverError;
e31c89 ¤   ¤   ¤   ¤   ¤   }
fa4bd6 ¤   ¤   ¤   ¤   ¤   else
044859 ¤   ¤   ¤   ¤   ¤   {
da654f ¤   ¤   ¤   ¤   ¤   ¤   // This is the window case where the volume had been
acc719 ¤   ¤   ¤   ¤   ¤   ¤   // unmounted, but the drive queue element has not
8b3429 ¤   ¤   ¤   ¤   ¤   ¤   // been deleted yet. If the user is attempting to
a8932a ¤   ¤   ¤   ¤   ¤   ¤   // open the file again, then just try to mount the
dcedf9 ¤   ¤   ¤   ¤   ¤   ¤   // disk.
2994aa ¤   ¤   ¤   ¤   ¤   ¤
76b33a ¤   ¤   ¤   ¤   ¤   ¤   ParamBlockRec¤  pb;
d194aa ¤   ¤   ¤   ¤   ¤   ¤
a090cd ¤   ¤   ¤   ¤   ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
6294aa ¤   ¤   ¤   ¤   ¤   ¤
58902a ¤   ¤   ¤   ¤   ¤   ¤   pb.volumeParam.ioVRefNum = fileInfo.fileDriveNumber;
2b94aa ¤   ¤   ¤   ¤   ¤   ¤
--94e7 0005e8d28e640120010 Page 19 of CPGPDiskApplication.cp
0b66e2 ¤   ¤   ¤   ¤   ¤   ¤   err.err = PBMountVol( &pb );
d387cf ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
778fec ¤   ¤   ¤   ¤   ¤   ¤   {
5002c3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mountFailed = TRUE;
28db3c ¤   ¤   ¤   ¤   ¤   ¤   }
288360 ¤   ¤   ¤   ¤   ¤   }¤
112613 ¤   ¤   ¤   ¤   }
fefa07 ¤   ¤   ¤   ¤   else
4672c3 ¤   ¤   ¤   ¤   {
43ac76 ¤   ¤   ¤   ¤   ¤   err.err = kPGPDiskFileAlreadyOpenError;
b62613 ¤   ¤   ¤   ¤   }
f8a3a6 ¤   ¤   ¤   }
e8bb8c ¤   ¤   ¤   else
e0f776 ¤   ¤   ¤   {
e62a44 ¤   ¤   ¤   ¤   CSecurePString255¤  passphrase;
43104e ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   mountReadOnly = FALSE;
1a2b85 ¤   ¤   ¤   ¤
896c83 ¤   ¤   ¤   ¤   err.err = DoMountDiskPassphraseDialog( &fileSpec, FALSE,
0cb572 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passphrase, &mountReadOnly );
e782e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
e772c3 ¤   ¤   ¤   ¤   {
a7981b ¤   ¤   ¤   ¤   ¤   err = MountPGPDisk( &fileSpec, FALSE, mountReadOnly,
65f4cb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passphrase, TRUE, NULL, NULL, NULL );
b82613 ¤   ¤   ¤   ¤   }
35a3a6 ¤   ¤   ¤   }
700fe4 ¤   ¤   }
7b9371 ¤   }
1267c5 ¤
ed91d4 ¤   if( err.IsError() && ! err.IsCancelError() )
cfc7a1 ¤   {
57a5d0 ¤   ¤   Str255¤ msg;
d9aa47 ¤   ¤   Str255¤ errorStr;
2c1b52 ¤   ¤
055b5c ¤   ¤   GetIndString( msg, kErrorStringListResID,
45d37e ¤   ¤   ¤   ¤   kCouldNotMountDiskBecauseStrIndex );
c45661 ¤   ¤   PrintPString( msg, msg, fileSpec.name );
dd1b52 ¤   ¤
b736ff ¤   ¤   GetComboErrorString( err, errorStr );
d9e3c0 ¤   ¤   PrintPString( msg, msg, errorStr );
891b52 ¤   ¤
ee057e ¤   ¤   SysBeep( 1 );
395592 ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle, msg );
ad1b52 ¤   ¤
0e08aa ¤   #if PGPDISK_PUBLIC_KEY
f307a9 ¤   ¤   if( err.err == kPGPDiskIncorrectPassphraseError ||
7f3779 ¤   ¤   ¤   err.err == kPGPDiskIncorrectPassphraseNoKeyringsError ||
adb814 ¤   ¤   ¤   err.err == kPGPDiskIncorrectPassphraseKeyNotFoundError )
3147b4 ¤   #else
6c5244 ¤   ¤   if ( err.err == kPGPDiskIncorrectPassphraseError )
82b7ec ¤   #endif
f15b34 ¤   ¤   {
15d78e ¤   ¤   ¤   err.err¤¤   = noErr;
3db619 ¤   ¤   ¤   err.pgpErr¤ = kPGPError_NoErr;
6f87c7 ¤   ¤   ¤
05c703 ¤   ¤   ¤   goto tryAgain;
b90fe4 ¤   ¤   }
679371 ¤   }
0a67c5 ¤
77deb7 ¤   return( err );
4defe6 }
24af5a
f46d52 ¤   void
1cca06 CPGPDiskApplication::HandleAddPassphrase(void)
54bb36 {
17323e ¤   OSStatus¤   status = noErr;
35fc44 ¤   FSSpec¤ ¤   fileSpec;
e067c5 ¤
eb5652 ¤   status = GetExistingPGPDiskFSSpec( &fileSpec );
8cdd30 ¤   if( IsntErr( status ) )
acc7a1 ¤   {
4b8a67 ¤   ¤   status = VerifyPGPDiskFileIsModifiable( &fileSpec );
5e706e ¤   ¤   if( IsntErr( status ) )
--82c4 00017d2243e40120010 Page 20 of CPGPDiskApplication.cp
e35b34 ¤   ¤   {
2a204e ¤   ¤   ¤   CSecurePString255¤  ¤   masterPassphrase;
ac2b85 ¤   ¤   ¤   ¤
6d7046 ¤   ¤   ¤   status = DoGetMasterPassphraseDialog( fileSpec.name,
902e62 ¤   ¤   ¤   ¤   ¤   ¤   ¤   masterPassphrase );
bffb92 ¤   ¤   ¤   if( IsntErr( status ) )
faf776 ¤   ¤   ¤   {
ef7226 ¤   ¤   ¤   ¤   status = VerifyMasterPassphrase( &fileSpec, masterPassphrase );
5e3ec7 ¤   ¤   ¤   ¤   if( IsntErr( status ) )
8a72c3 ¤   ¤   ¤   ¤   {
e912c1 ¤   ¤   ¤   ¤   ¤   CSecurePString255¤  newPassphrase;
a5c9fb ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   readOnly = FALSE;
40ae30 ¤   ¤   ¤   ¤   ¤
08824d ¤   ¤   ¤   ¤   ¤   status = DoAddPassphraseDialog( fileSpec.name,
573d84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newPassphrase, &readOnly );
09b6a1 ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
af4859 ¤   ¤   ¤   ¤   ¤   {
868938 ¤   ¤   ¤   ¤   ¤   ¤   status = AddPassphrase( &fileSpec, masterPassphrase,
67ff2b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newPassphrase, readOnly );
4c1c89 ¤   ¤   ¤   ¤   ¤   }
9f2613 ¤   ¤   ¤   ¤   }
61a3a6 ¤   ¤   ¤   }
130fe4 ¤   ¤   }
dd9371 ¤   }
0567c5 ¤
fcdd30 ¤   if( IsntErr( status ) )
56c7a1 ¤   {
92f33d ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
a8dfc9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDialogStringListResID,
725d2e ¤   ¤   ¤   ¤   ¤   ¤   ·¤  kPassphraseAddedSuccessfullyStrIndex );
4f9371 ¤   }
13fa54 ¤   else if( status != userCanceledErr )
fdc7a1 ¤   {
eca5d0 ¤   ¤   Str255¤ msg;
81aa47 ¤   ¤   Str255¤ errorStr;
db1b52 ¤   ¤
bb5b5c ¤   ¤   GetIndString( msg, kErrorStringListResID,
9bc815 ¤   ¤   ¤   ¤   kCouldNotAddPassphraseBecauseStrIndex );
9e5661 ¤   ¤   PrintPString( msg, msg, fileSpec.name );
641b52 ¤   ¤
231d0e ¤   ¤   GetErrorString( status, errorStr );
27e3c0 ¤   ¤   PrintPString( msg, msg, errorStr );
a71b52 ¤   ¤
04057e ¤   ¤   SysBeep( 1 );
4f5592 ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle, msg );
cc9371 ¤   }
baefe6 }
19af5a
ce6d52 ¤   void
469313 CPGPDiskApplication::HandleChangePassphrase(void)
acbb36 {
5b323e ¤   OSStatus¤   status = noErr;
a7fc44 ¤   FSSpec¤ ¤   fileSpec;
b31b52 ¤   ¤
665652 ¤   status = GetExistingPGPDiskFSSpec( &fileSpec );
d7dd30 ¤   if( IsntErr( status ) )
13c7a1 ¤   {
148a67 ¤   ¤   status = VerifyPGPDiskFileIsModifiable( &fileSpec );
3b706e ¤   ¤   if( IsntErr( status ) )
275b34 ¤   ¤   {
9856d0 ¤   ¤   ¤   CSecurePString255¤  oldPassphrase;
822b85 ¤   ¤   ¤   ¤
b3a44a ¤   ¤   ¤   status = DoGetOldPassphraseDialog( fileSpec.name, oldPassphrase );
a5fb92 ¤   ¤   ¤   if( IsntErr( status ) )
c2f776 ¤   ¤   ¤   {
9dbb9e ¤   ¤   ¤   ¤   status = VerifyPassphrase( &fileSpec, oldPassphrase );
f83ec7 ¤   ¤   ¤   ¤   if( IsntErr( status ) )
1472c3 ¤   ¤   ¤   ¤   {
9c12c1 ¤   ¤   ¤   ¤   ¤   CSecurePString255¤  newPassphrase;
27ae30 ¤   ¤   ¤   ¤   ¤
a35f65 ¤   ¤   ¤   ¤   ¤   status = DoNewPassphraseDialog( fileSpec.name,
173f43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newPassphrase );
--b7d3 000333b5ae740120010 Page 21 of CPGPDiskApplication.cp
76b6a1 ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
464859 ¤   ¤   ¤   ¤   ¤   {
949803 ¤   ¤   ¤   ¤   ¤   ¤   status = ChangePassphrase( &fileSpec, oldPassphrase,
4f3f43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newPassphrase );
271c89 ¤   ¤   ¤   ¤   ¤   }
7b2613 ¤   ¤   ¤   ¤   }
1ba3a6 ¤   ¤   ¤   }
450fe4 ¤   ¤   }
469371 ¤   }
0667c5 ¤
cfdd30 ¤   if( IsntErr( status ) )
62c7a1 ¤   {
2ff33d ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
ffdfc9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDialogStringListResID,
24b364 ¤   ¤   ¤   ¤   ¤   ¤   ·¤  kPassphraseChangedSuccessfullyStrIndex );
d59371 ¤   }
9cfa54 ¤   else if( status != userCanceledErr )
45c7a1 ¤   {
b0a5d0 ¤   ¤   Str255¤ msg;
82aa47 ¤   ¤   Str255¤ errorStr;
021b52 ¤   ¤
9b5b5c ¤   ¤   GetIndString( msg, kErrorStringListResID,
6f6904 ¤   ¤   ¤   ¤   kCouldNotChangePassphraseBecauseStrIndex );
825661 ¤   ¤   PrintPString( msg, msg, fileSpec.name );
cc1b52 ¤   ¤
cc1d0e ¤   ¤   GetErrorString( status, errorStr );
55e3c0 ¤   ¤   PrintPString( msg, msg, errorStr );
b41b52 ¤   ¤
e4057e ¤   ¤   SysBeep( 1 );
3c5592 ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle, msg );
8e9371 ¤   }
e8efe6 }
28af5a
466d52 ¤   void
53e6a3 CPGPDiskApplication::HandleRemovePassphrase(void)
12bb36 {
dc323e ¤   OSStatus¤   status = noErr;
e5fc44 ¤   FSSpec¤ ¤   fileSpec;
c01b52 ¤   ¤
9d5652 ¤   status = GetExistingPGPDiskFSSpec( &fileSpec );
55dd30 ¤   if( IsntErr( status ) )
02c7a1 ¤   {
948a67 ¤   ¤   status = VerifyPGPDiskFileIsModifiable( &fileSpec );
bf706e ¤   ¤   if( IsntErr( status ) )
f35b34 ¤   ¤   {
ed3214 ¤   ¤   ¤   CSecurePString255¤  passphrase;
feae30 ¤   ¤   ¤   ¤   ¤
12b473 ¤   ¤   ¤   status = DoGetRemovePassphraseDialog( fileSpec.name, passphrase );
83fb92 ¤   ¤   ¤   if( IsntErr( status ) )
63f776 ¤   ¤   ¤   {
d41acf ¤   ¤   ¤   ¤   status = VerifyPassphrase( &fileSpec, passphrase );
843ec7 ¤   ¤   ¤   ¤   if( IsntErr( status ) )
1b72c3 ¤   ¤   ¤   ¤   {
9ac3bf ¤   ¤   ¤   ¤   ¤   status = RemovePassphrase( &fileSpec, passphrase );
df2613 ¤   ¤   ¤   ¤   }
8ca3a6 ¤   ¤   ¤   }
060fe4 ¤   ¤   }
229371 ¤   }
a467c5 ¤
3cdd30 ¤   if( IsntErr( status ) )
e1c7a1 ¤   {
e3f33d ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
5fdfc9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDialogStringListResID,
3374e1 ¤   ¤   ¤   ¤   ¤   ¤   ·¤  kPassphraseRemovedSuccessfullyStrIndex );
9f9371 ¤   }
affa54 ¤   else if( status != userCanceledErr )
c2c7a1 ¤   {
06a5d0 ¤   ¤   Str255¤ msg;
bbaa47 ¤   ¤   Str255¤ errorStr;
531b52 ¤   ¤
2b5b5c ¤   ¤   GetIndString( msg, kErrorStringListResID,
33aca2 ¤   ¤   ¤   ¤   kCouldNotRemovePassphraseBecauseStrIndex );
--0131 000b79e988e40120010 Page 22 of CPGPDiskApplication.cp
fc5661 ¤   ¤   PrintPString( msg, msg, fileSpec.name );
5e1b52 ¤   ¤
ee1d0e ¤   ¤   GetErrorString( status, errorStr );
70e3c0 ¤   ¤   PrintPString( msg, msg, errorStr );
db1b52 ¤   ¤
f3057e ¤   ¤   SysBeep( 1 );
095592 ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle, msg );
689371 ¤   }
45efe6 }
04af5a
146d52 ¤   void
c1f8cb CPGPDiskApplication::HandleRemoveAltPassphrases(void)
39bb36 {
d5323e ¤   OSStatus¤   status = noErr;
bdfc44 ¤   FSSpec¤ ¤   fileSpec;
d81b52 ¤   ¤
ce5652 ¤   status = GetExistingPGPDiskFSSpec( &fileSpec );
0bdd30 ¤   if( IsntErr( status ) )
c3c7a1 ¤   {
608a67 ¤   ¤   status = VerifyPGPDiskFileIsModifiable( &fileSpec );
26706e ¤   ¤   if( IsntErr( status ) )
c15b34 ¤   ¤   {
abb7c7 ¤   ¤   ¤   CSecurePString255¤  masterPassphrase;
b82b85 ¤   ¤   ¤   ¤
417046 ¤   ¤   ¤   status = DoGetMasterPassphraseDialog( fileSpec.name,
4c3632 ¤   ¤   ¤   ¤   ¤   ¤   masterPassphrase );
bafb92 ¤   ¤   ¤   if( IsntErr( status ) )
eff776 ¤   ¤   ¤   {
e97226 ¤   ¤   ¤   ¤   status = VerifyMasterPassphrase( &fileSpec, masterPassphrase );
263ec7 ¤   ¤   ¤   ¤   if( IsntErr( status ) )
6672c3 ¤   ¤   ¤   ¤   {
d3ed55 ¤   ¤   ¤   ¤   ¤   status = RemoveAlternatePassphrases( &fileSpec );
912613 ¤   ¤   ¤   ¤   }
04a3a6 ¤   ¤   ¤   }
a30fe4 ¤   ¤   }
989371 ¤   }
9e67c5 ¤
4ddd30 ¤   if( IsntErr( status ) )
c8c7a1 ¤   {
65f33d ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
b7dfc9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDialogStringListResID,
406e06 ¤   ¤   ¤   ¤   ¤   ¤   ·¤  kAltPassphrasesRemovedSuccessfullyStrIndex );
fc9371 ¤   }
24fa54 ¤   else if( status != userCanceledErr )
75c7a1 ¤   {
94a5d0 ¤   ¤   Str255¤ msg;
9baa47 ¤   ¤   Str255¤ errorStr;
4c1b52 ¤   ¤
cf5b5c ¤   ¤   GetIndString( msg, kErrorStringListResID,
6c0665 ¤   ¤   ¤   ¤   kCouldNotRemoveAltPassphrasesBecauseStrIndex );
285661 ¤   ¤   PrintPString( msg, msg, fileSpec.name );
391b52 ¤   ¤
351d0e ¤   ¤   GetErrorString( status, errorStr );
02e3c0 ¤   ¤   PrintPString( msg, msg, errorStr );
ae1b52 ¤   ¤
1c057e ¤   ¤   SysBeep( 1 );
035592 ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle, msg );
849371 ¤   }
46efe6 }
9daf5a
e235fa //¤ Respond to 'odoc' AppleEvent events
5baf5a
de6d52 ¤   void
57d624 CPGPDiskApplication::HandleAppleEvent(
8a8e4e ¤   const AppleEvent¤   &inAppleEvent,
655341 ¤   AppleEvent¤ ¤   ¤   &outAEReply,
b4df45 ¤   AEDesc¤ ¤   ¤   ¤   &outResult,
9be675 ¤   long¤   ¤   ¤   ¤   inAENumber)
bdbb36 {
3cb47a ¤   switch (inAENumber)
22c7a1 ¤   {
b7fb7e ¤   ¤   case ae_OpenDoc:
--e106 000f860552440120010 Page 23 of CPGPDiskApplication.cp
76c7cd ¤   ¤   ¤   DoOpenDocAppleEvent( inAppleEvent );
a6cdcb ¤   ¤   ¤   break;
f787c7 ¤   ¤   ¤
659ae3 ¤   ¤   default:
1e552a ¤   ¤   ¤   LApplication::HandleAppleEvent(inAppleEvent, outAEReply,
7612dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outResult, inAENumber);
74cdcb ¤   ¤   ¤   break;
4a9371 ¤   }
d5efe6 }
6eaf5a
636d52 ¤   void
f5047e CPGPDiskApplication::DoOpenFile(const FSSpec *theFile)
01bb36 {
0b4f27 ¤   CInfoPBRec¤ cpb;
edc412 ¤   OSStatus¤   status;
6767c5 ¤
c806ce ¤   AssertSpecIsValid( theFile, "DoOpenFile" );
5867c5 ¤
ff14aa ¤   status = FSpGetCatInfo( theFile, &cpb );
5c1095 ¤   if( IsntErr( status ) && cpbIsFile( &cpb ) )
71c7a1 ¤   {
dad454 ¤   ¤   if( IsPGPDiskFileType( cpbFileCreator( &cpb ), cpbFileType( &cpb ) ) )
925b34 ¤   ¤   {
e31f98 ¤   ¤   ¤   Boolean¤enabled;
e9a3ab ¤   ¤   ¤   Boolean¤usesMark;
851313 ¤   ¤   ¤   Char16¤ mark;
14f05e ¤   ¤   ¤   Str255¤ name;
1087c7 ¤   ¤   ¤
57f0fe ¤   ¤   ¤   enabled = FALSE;
329c72 ¤   ¤   ¤   FindCommandStatus( cmd_MountPGPDisk, enabled, usesMark, mark,
8838a1 ¤   ¤   ¤   ¤   ¤   name );
fdaf5a
a0ef90 ¤   ¤   ¤   if( enabled )
dff776 ¤   ¤   ¤   {
dc280b ¤   ¤   ¤   ¤   HandleMountPGPDisk( theFile );
27a3a6 ¤   ¤   ¤   }
f50fe4 ¤   ¤   }
ca0e1d ¤   ¤   else
e15b34 ¤   ¤   {
c46430 ¤   ¤   ¤   // Ignore all other file types
7d0fe4 ¤   ¤   }
af9371 ¤   }
96efe6 }
6eaf5a
18ba7c //¤ Respond to an AppleEvent to open a Document. Stolen From LApplication
59af5a
e76d52 ¤   void
8cf7a8 CPGPDiskApplication::DoOpenDocAppleEvent(const AppleEvent &inAppleEvent)
adbb36 {
9e3ee9 ¤   AEDescList¤ docList;
b05967 ¤   OSErr¤  ¤   err = ::AEGetParamDesc(&inAppleEvent, keyDirectObject,
fab3bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeAEList, &docList);
0ae457 ¤   ThrowIfOSErr_(err);
1067c5 ¤
f46d35 ¤   Int32¤  numDocs;
debd04 ¤   err = ::AECountItems(&docList, &numDocs);
1867c5 ¤
e6d728 ¤   sHaveODOCEvent = TRUE;
3167c5 ¤
81e457 ¤   ThrowIfOSErr_(err);
b1af5a
f30d59 #if PGPDISK_STANDALONE
4de284 ¤   if( ! mHavePersonalized )
6bc7a1 ¤   {
eefdc0 ¤   ¤   mHavePersonalized = TRUE;
657945 ¤   ¤   DoPersonalization();
189371 ¤   }
cb7454 #endif
1b00a4 ¤   ¤   // Loop through all items in the list
d3a367 ¤   ¤   ¤   // Extract descriptor for the document
61d544 ¤   ¤   ¤   // Coerce descriptor data into a FSSpec
f837ed ¤   ¤   ¤   // Tell Program object to open document
--b4d7 000f5a16b2c40120010 Page 24 of CPGPDiskApplication.cp
f11b52 ¤   ¤
8dcea0 ¤   for (Int32 i = 1; i <= numDocs; i++)
f3c7a1 ¤   {
fc6ec3 ¤   ¤   AEKeyword¤  theKey;
21c181 ¤   ¤   DescType¤   theType;
2f1f2c ¤   ¤   FSSpec¤ ¤   theFileSpec;
d8b85a ¤   ¤   Size¤   ¤   theSize;
aa67c5 ¤
22616c ¤   ¤   err = ::AEGetNthPtr(&docList, i, typeFSS, &theKey, &theType,
bd0ba1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr) &theFileSpec, sizeof(FSSpec), &theSize);
5c1232 ¤   ¤   ThrowIfOSErr_(err);
0b1b52 ¤   ¤
b8ae15 ¤   ¤   DoOpenFile( &theFileSpec );
c19371 ¤   }
e667c5 ¤
dc821f ¤   if( ! sHaveOAPPEvent )
3ec7a1 ¤   {
fbd3dd ¤   ¤   // User launched app from finder by double clicking on a document.
2de815 ¤   ¤   // Don't leave the app running in this case.
d58364 ¤   ¤   DoQuit();
339371 ¤   }
9967c5 ¤
2a47b6 ¤   ::AEDisposeDesc(&docList);
9eefe6 }
c9af5a
d96d52 ¤   void
d11362 CPGPDiskApplication::StartUp(void)
5fbb36 {
2bc706 ¤   DateTimeRec¤¤   nowDTRec;
76ee50 ¤   DateTimeRec¤¤   lastSplashDTRec;
867861 ¤   UInt32¤ ¤   ¤   now;
7567c5 ¤
5584cb ¤   LApplication::StartUp();
5067c5 ¤
5b0d59 #if PGPDISK_STANDALONE
6ce284 ¤   if( ! mHavePersonalized )
0bc7a1 ¤   {
4afdc0 ¤   ¤   mHavePersonalized = TRUE;
c37945 ¤   ¤   DoPersonalization();
b49371 ¤   }
307454 #endif
7c67c5 ¤
7dbe8e ¤   sHaveOAPPEvent = TRUE;
a267c5 ¤
e31c13 ¤   // Show the splash screen once per day for two seconds or until the
26af99 ¤   // user clicks the mouse.
5367c5 ¤
2a3248 ¤   GetDateTime( &now );
739bd5 ¤   SecondsToDate( now, &nowDTRec );
2bd36a ¤   SecondsToDate( gPGPDiskPrefs.lastSplashShowTime, &lastSplashDTRec );
9267c5 ¤
c61ac4 ¤   if( nowDTRec.day != lastSplashDTRec.day ||
6e99ba ¤   ¤   nowDTRec.month != lastSplashDTRec.month ||
30513e ¤   ¤   nowDTRec.year != lastSplashDTRec.year )
dcc7a1 ¤   {
df2483 ¤   ¤   const ResID¤kSplashDialogResID¤ = 10000;
370691 ¤   ¤   LWindow¤¤   *splashWindow;
b31b52 ¤   ¤
b956bd ¤   ¤   splashWindow = LWindow::CreateWindow( kSplashDialogResID, this );
0eaec4 ¤   ¤   if( IsntNull( splashWindow ) )
865b34 ¤   ¤   {
a6aa13 ¤   ¤   ¤   UInt32¤ ¤   startTicks;
35a1c4 ¤   ¤   ¤   const ulong¤kSplashTicks¤   = (2 * 60 ) + 30;¤  // 2.5 seconds
c487c7 ¤   ¤   ¤
fdc9b6 ¤   ¤   ¤   splashWindow->Select();
529f1b ¤   ¤   ¤   splashWindow->Show();
6b6a48 ¤   ¤   ¤   splashWindow->UpdatePort();
0687c7 ¤   ¤   ¤
46f5b3 ¤   ¤   ¤   startTicks = TickCount();
6841d2 ¤   ¤   ¤   while( TickCount() - startTicks <= kSplashTicks && ! Button() )
aff776 ¤   ¤   ¤   {
f5a3a6 ¤   ¤   ¤   }
--b74c 000bcce5cdf40120010 Page 25 of CPGPDiskApplication.cp
e587c7 ¤   ¤   ¤
8d7337 ¤   ¤   ¤   splashWindow->Hide();
5d41b5 ¤   ¤   ¤   delete splashWindow;
9f87c7 ¤   ¤   ¤
3dec24 ¤   ¤   ¤   FlushEvents( mDownMask, 0 );
4a87c7 ¤   ¤   ¤
bda72a ¤   ¤   ¤   gPGPDiskPrefs.lastSplashShowTime = now;
5c0fe4 ¤   ¤   }
4b9371 ¤   }
2a67c5 ¤
d07872 ¤   sMainWindowObj->Show();
e7d3b0 ¤   sMainWindowObj->UpdatePort();
a4efe6 }
b7af5a
076d52 ¤   void
6ff98a CPGPDiskApplication::ProcessNextEvent(void)
54bb36 {
9725c7 ¤   LApplication::ProcessNextEvent();
3067c5 ¤
a176f8 ¤   // Stir up the random data a little
5db52b ¤   randPoolStir();
a067c5 ¤
7b980c ¤   if( ! sHaveODOCEvent && ! sHaveOAPPEvent )
afc7a1 ¤   {
818d08 ¤   ¤   static Boolean¤ sNumProcessedEvents = 0;
9967c5 ¤
be21f7 ¤   ¤   ++sNumProcessedEvents;
291b0b ¤   ¤   if( sNumProcessedEvents > 10 )
045b34 ¤   ¤   {
01ffd1 ¤   ¤   ¤   pgpDebugMsg( "Forcing application startup" );
5c8d63 ¤   ¤   ¤   StartUp();
520fe4 ¤   ¤   }
ec9371 ¤   }
2aefe6 }
06af5a
622357 #if PGPDISK_STANDALONE¤ /* [ */
42af5a
516d52 ¤   void
2495d7 CPGPDiskApplication::DoPersonalization(void)
71bb36 {
b55982 ¤   Personalization¤**persRes;
26a4f8 ¤   const OSType¤   kPersonalizationResType¤= 'Pers';
ebc059 ¤   const ResID¤¤   kPersonalizationResID¤  = 1000;
b567c5 ¤
afc5bd ¤   persRes = (Personalization **) Get1Resource( kPersonalizationResType,
dfa015 ¤   ¤   ¤   ¤   ¤   ¤   kPersonalizationResID );
fadd7b ¤   if( IsNull( persRes ) || GetHandleSize( (Handle) persRes ) <
6a5938 ¤   ¤   ¤   ¤   sizeof( **persRes ) )
09c7a1 ¤   {
19dfa6 ¤   ¤   const ResID¤¤   kPersonalizationDialogResID¤= 11000;
3b2fa0 ¤   ¤   const PaneIDT¤  kUserNamePaneID¤¤   ¤   ¤   = 'Name';
608308 ¤   ¤   const PaneIDT¤  kOrganizationPaneID¤¤   ¤   = 'Org ';
53af5a
2f910f ¤   ¤   CPGPStDialogHandler¤¤   dialogHandler( kPersonalizationDialogResID,
08f0d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   this );
7f5031 ¤   ¤   CPGPDiskDialog¤ ¤   ¤   *persDialog;
2e07c1 ¤   ¤   MessageT¤   ¤   ¤   ¤   dialogMessage = 0;
9711bb ¤   ¤   Str255¤ ¤   ¤   ¤   ¤   machineOwner;
811244 ¤   ¤   LEditText¤  ¤   ¤   ¤   *editFieldObj;
801b52 ¤   ¤
696f2b ¤   ¤   persDialog = (CPGPDiskDialog *) dialogHandler.GetDialog();
b31b52 ¤   ¤
f0f083 ¤   ¤   // Grab the user's chooser name if it exists.
398c9f ¤   ¤   GetMachineOwnerName( machineOwner );
4ef314 ¤   ¤   if( machineOwner[0] != 0 )
835b34 ¤   ¤   {
23ad82 ¤   ¤   ¤   editFieldObj =
650136 ¤   ¤   ¤   ¤   ¤   (LEditText *) persDialog->FindPaneByID( kUserNamePaneID );
ff79e6 ¤   ¤   ¤   pgpAssertAddrValid( editFieldObj, LEditText );
f587c7 ¤   ¤   ¤
4fa3dd ¤   ¤   ¤   editFieldObj->SetDescriptor( machineOwner );
bcf1f8 ¤   ¤   ¤   editFieldObj->SelectAll();
--bd0b 000e11a5b2240120010 Page 26 of CPGPDiskApplication.cp
b50fe4 ¤   ¤   }
3b1b52 ¤   ¤
060744 ¤   ¤   persDialog->Select();
110410 ¤   ¤   persDialog->Show();
151b52 ¤   ¤
7621a6 ¤   ¤   while( dialogMessage != msg_OK && dialogMessage != msg_Cancel )
4f5b34 ¤   ¤   {
d59f7d ¤   ¤   ¤   dialogMessage = dialogHandler.DoDialog();
8c0fe4 ¤   ¤   }
961b52 ¤   ¤
8cc452 ¤   ¤   if( dialogMessage == msg_OK )
be5b34 ¤   ¤   {
7bc866 ¤   ¤   ¤   pgpClearMemory( &mPersonalization, sizeof( mPersonalization ) );
4987c7 ¤   ¤   ¤
31ad82 ¤   ¤   ¤   editFieldObj =
bd0136 ¤   ¤   ¤   ¤   ¤   (LEditText *) persDialog->FindPaneByID( kUserNamePaneID );
a079e6 ¤   ¤   ¤   pgpAssertAddrValid( editFieldObj, LEditText );
fb87c7 ¤   ¤   ¤
1a4151 ¤   ¤   ¤   editFieldObj->GetDescriptor( mPersonalization.userName );
23af5a
85ad82 ¤   ¤   ¤   editFieldObj =
f79db7 ¤   ¤   ¤   ¤   (LEditText *) persDialog->FindPaneByID( kOrganizationPaneID );
1079e6 ¤   ¤   ¤   pgpAssertAddrValid( editFieldObj, LEditText );
2387c7 ¤   ¤   ¤
98f1e2 ¤   ¤   ¤   editFieldObj->GetDescriptor( mPersonalization.organization );
70af5a
c908b5 ¤   ¤   ¤   if( mPersonalization.userName[0] != 0 ||
d0d245 ¤   ¤   ¤   ¤   mPersonalization.organization[0] != 0 ||
153657 ¤   ¤   ¤   ¤   mPersonalization.registationNumber[0] != 0 )
5ef776 ¤   ¤   ¤   {
5ce7aa ¤   ¤   ¤   ¤   (void) AddWriteResourcePtr( &mPersonalization,
403c9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( mPersonalization ),·
04829e ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPersonalizationResType,
38ed77 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPersonalizationResID, nil );
4ca3a6 ¤   ¤   ¤   }
680fe4 ¤   ¤   }
501b52 ¤   ¤
57e83c ¤   ¤   persDialog->Hide();
9d9371 ¤   }
ce0e24 ¤   else
d32ef1 ¤   {¤
9180ee ¤   ¤   mPersonalization = **persRes;
94af5a
9ec7da ¤   ¤   ReleaseResource( (Handle) ¤ persRes );¤
b99371 ¤   }
47efe6 }
57af5a
021580 #endif¤ /* ] PGPDISK_STANDALONE */
80af5a
4c6d52 ¤   void
95d4f3 CPGPDiskApplication::SpendTime(const EventRecord &inMacEvent)
7cbb36 {
027172 ¤   #pragma unused( inMacEvent )
f5af5a
6549af ¤   ushort¤ ¤   ¤   modifiers;
8be26a ¤   static ushort¤  lastModifiers;
3d67c5 ¤
22b14d ¤   modifiers = GetModifiers();
9f4b80 ¤   if( modifiers != lastModifiers )
8bc7a1 ¤   {
c09827 ¤   ¤   lastModifiers = modifiers;
12b150 ¤   ¤   LCommander::SetUpdateCommandStatus( TRUE );
7d9371 ¤   }
61efe6 }
f4af5a
1b6d52 ¤   void
58a962 CPGPDiskApplication::MakeMenuBar(void)
83bb36 {
e3a633 ¤   // we need to suspend leaks checking for MakeMenuBar
f9d3aa ¤   // because PowerPlant will never release certain items
dfaf5a
e132f4 ¤   MacLeaks_Suspend();
--8398 000cad07f5140120010 Page 27 of CPGPDiskApplication.cp
e0af5a
a0ea4b #if PGPDISK_PUBLIC_KEY
556c6a ¤   new LMenuBar( 129 );
9ddb21 #else
93672e ¤   new LMenuBar( 128 );
897454 #endif
b3af5a
8477d9 ¤   MacLeaks_Resume();
7defe6 }
62af5a
d1029c #if PGPDISK_PUBLIC_KEY¤ // [
cdaf5a
5266dd ¤   static PGPError
c0f716 RecipientsDialog(
6197bc ¤   PGPContextRef ¤ ¤   ¤   context,
16760e ¤   PGPKeySetRef¤   ¤   ¤   allKeys,
0ac955 ¤   PGPUInt32¤  ¤   ¤   ¤   numDefaultKeys,
fc7acc ¤   const PGPRecipientSpec¤ *defaultKeyList,
03600b ¤   PGPUInt32¤  ¤   ¤   ¤   *numKeys,
7d6070 ¤   PGPRecipientSpec¤   ¤   **keyList,
3bc296 ¤   PGPBoolean¤ ¤   ¤   ¤   *readOnly)
05bb36 {
6dfb19 ¤   PGPError¤   ¤   err;
0fd91c ¤   PGPMemoryMgrRef¤memoryMgr;
16fadb ¤   PGPPrefRef¤ ¤   clientPrefsRef¤ = kInvalidPGPPrefRef;
0767c5 ¤
9dbe29 #if PGP_BUSINESS_SECURITY
a4d41f ¤   PGPPrefRef¤ ¤   adminPrefsRef¤  = kInvalidPGPPrefRef;¤
e07454 #endif
5aaf5a
eaf790 ¤   memoryMgr ¤ = PGPGetContextMemoryMgr( context );
bc0e23 ¤   *keyList¤   = NULL;
0a816e ¤   *numKeys¤   = 0;
bdd99c ¤   *readOnly¤  = FALSE;
b067c5 ¤
d674ef ¤   err = PGPOpenClientPrefs( memoryMgr, &clientPrefsRef );
beaf5a
d8be29 #if PGP_BUSINESS_SECURITY
0bd272 ¤   if( IsntPGPError( err ) )·
c0c7a1 ¤   {
87a7a3 ¤   ¤   err = PGPOpenAdminPrefs( memoryMgr, &adminPrefsRef );
e49371 ¤   }
1f7454 #endif
bfaf5a
f3b1f0 ¤   if( IsntPGPError( err ) )
8dc7a1 ¤   {
8009d0 ¤   ¤   PGPOptionListRef¤   recipientOptions;
c77358 ¤   ¤   PGPBoolean¤ ¤   ¤   showMarginalValidity;
1c1e23 ¤   ¤   PGPBoolean¤ ¤   ¤   marginalIsInvalid;
ed6783 ¤   ¤   PGPBoolean¤ ¤   ¤   warnOnADKs;
bb4f26 ¤   ¤   char¤   ¤   ¤   ¤   title[256];
5a60eb ¤   ¤   char¤   ¤   ¤   ¤   desc[256];
3a7c97 ¤   ¤   PGPUInt32¤  ¤   ¤   readOnlyInt;
989168 ¤   ¤   PGPKeySetRef¤   ¤   recipients;
de1b52 ¤   ¤
5f23c0 ¤   ¤   (void) PGPGetPrefBoolean( clientPrefsRef,
a0310d ¤   ¤   ¤   ¤   ¤   kPGPPrefDisplayMarginalValidity, &showMarginalValidity);
38f3fd ¤   ¤   (void) PGPGetPrefBoolean( clientPrefsRef, kPGPPrefMarginalIsInvalid,
343acb ¤   ¤   ¤   ¤   ¤   &marginalIsInvalid);
ee29f9 ¤   ¤   (void) PGPGetPrefBoolean( clientPrefsRef, kPGPPrefWarnOnADK,
0839fd ¤   ¤   ¤   ¤   ¤   ¤   &warnOnADKs );
e5af5a
578709 ¤   ¤   GetIndCString( title, kDialogStringListResID,
df2827 ¤   ¤   ¤   ¤   kReadOnlyCheckboxTitleStrIndex );
f1aab7 ¤   ¤   GetIndCString( desc, kDialogStringListResID,
a0e76a ¤   ¤   ¤   ¤   kReadOnlyCheckboxDescStrIndex );
84af5a
521383 ¤   ¤   err = PGPBuildOptionList( context, &recipientOptions,
993168 ¤   ¤   ¤   ¤   ¤   PGPOUIDisplayMarginalValidity( context,
e82766 ¤   ¤   ¤   ¤   ¤   ¤   showMarginalValidity ),
4d20b7 ¤   ¤   ¤   ¤   ¤   PGPOUIIgnoreMarginalValidity( context, marginalIsInvalid ),
ca97cc ¤   ¤   ¤   ¤   ¤   PGPOUIRecipientList( context, numKeys, keyList ),
--6266 0007714f79e40120010 Page 28 of CPGPDiskApplication.cp
57afce ¤   ¤   ¤   ¤   ¤   PGPOUIDialogOptions( context,
84afbb ¤   ¤   ¤   ¤   ¤   ¤   PGPOUICheckbox( context, 1, title, desc, 0,
b3cf80 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &readOnlyInt ),
134b82 ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) ),
26c000 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
f95a26 ¤   ¤   if( IsntPGPError( err ) && IsntNull( defaultKeyList ) )
5c5b34 ¤   ¤   {
793fe7 ¤   ¤   ¤   err = PGPAppendOptionList( recipientOptions,
c7c3b2 ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDefaultRecipients( context, numDefaultKeys,
b71978 ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeyList ),
42931b ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
ed0fe4 ¤   ¤   }
bd1b52 ¤   ¤
4686f8 ¤   ¤   if( IsntPGPError( err ) )
775b34 ¤   ¤   {
8f1dac ¤   ¤   ¤   PGPAdditionalRecipientRequestEnforcement¤   arrEnforcement;
df87c7 ¤   ¤   ¤
0a7bd9 ¤   ¤   ¤   arrEnforcement = kPGPARREnforcement_Warn;
4c87c7 ¤   ¤   ¤
7b0075 ¤   ¤   #if PGP_BUSINESS_SECURITY
97f776 ¤   ¤   ¤   {
5c8dc5 ¤   ¤   ¤   ¤   PGPBoolean¤ enforceRemoteADKClass;
712b85 ¤   ¤   ¤   ¤
24d3e9 ¤   ¤   ¤   ¤   if( IsntPGPError( PGPGetPrefBoolean( adminPrefsRef,
fafd86 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefEnforceRemoteADKClass,
6f54e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &enforceRemoteADKClass ) ) &&
e25fc4 ¤   ¤   ¤   ¤   ¤   enforceRemoteADKClass )
8872c3 ¤   ¤   ¤   ¤   {
843009 ¤   ¤   ¤   ¤   ¤   arrEnforcement = kPGPARREnforcement_Strict;
0e2613 ¤   ¤   ¤   ¤   }
8ba3a6 ¤   ¤   ¤   }
2c7019 ¤   ¤   #endif // PGP_BUSINESS_SECURITY
b687c7 ¤   ¤   ¤
0e1d05 ¤   ¤   ¤   UDesktop::Deactivate();¤¤
1d2ddf ¤   ¤   ¤   err = PGPRecipientDialog( context, allKeys, TRUE, &recipients,
c20b1e ¤   ¤   ¤   ¤   ¤   ¤   recipientOptions,
34d93c ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIEnforceAdditionalRecipientRequests(
12441e ¤   ¤   ¤   ¤   ¤   ¤   ¤   context, arrEnforcement, warnOnADKs ),
ef931b ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
c70034 ¤   ¤   ¤   UDesktop::Activate();¤  ¤
2faf5a
b1698b ¤   ¤   ¤   if( IsntPGPError( err ) )
faf776 ¤   ¤   ¤   {
d3e9be ¤   ¤   ¤   ¤   *readOnly = ( readOnlyInt != 0 );
312b85 ¤   ¤   ¤   ¤
a3ba4b ¤   ¤   ¤   ¤   pgpAssert( IsntNull( *keyList ) );
d12b85 ¤   ¤   ¤   ¤
0e9708 ¤   ¤   ¤   ¤   if( *numKeys != 0 )
7d72c3 ¤   ¤   ¤   ¤   {
d751b3 ¤   ¤   ¤   ¤   ¤   PGPRecipientSpec¤   *curSpec = *keyList;
0d6b32 ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   keyIndex;
b8ae30 ¤   ¤   ¤   ¤   ¤
f0a3e7 ¤   ¤   ¤   ¤   ¤   /*
8cbfbd ¤   ¤   ¤   ¤   ¤   ** Need to convert keyrefs in the list to key ID's
671446 ¤   ¤   ¤   ¤   ¤   ** before disposing of the recipients key set
6ae4e2 ¤   ¤   ¤   ¤   ¤   */
9dae30 ¤   ¤   ¤   ¤   ¤
61a064 ¤   ¤   ¤   ¤   ¤   for( keyIndex = 0; keyIndex < *numKeys; keyIndex++ )
d44859 ¤   ¤   ¤   ¤   ¤   {
e6dc09 ¤   ¤   ¤   ¤   ¤   ¤   if( curSpec->type == kPGPRecipientSpecType_Key )
4c8fec ¤   ¤   ¤   ¤   ¤   ¤   {
fe747c ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef¤  keyRef;
6b531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
76949f ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* Structure is a union, so save off keyref */
94531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
dcb094 ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyRef ¤¤   ¤   = curSpec->u.key;
25c0e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   curSpec->type¤  = kPGPRecipientSpecType_KeyID;
8e531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
285943 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyIDFromKey( keyRef,
28f2c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &curSpec->u.id.keyID );
a28d9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
7706b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
--58cd 0007e89529f40120010 Page 29 of CPGPDiskApplication.cp
91ba9e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPInt32¤   alg;
28da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
0c4447 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyNumber( keyRef,
31f2f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropAlgID, &alg );
11531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
6f22ec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   curSpec->u.id.algorithm =
f1cf38 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPPublicKeyAlgorithm) alg;
445268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
0e531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
b49afd ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
88cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
ebda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
25d544 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ++curSpec;
7edb3c ¤   ¤   ¤   ¤   ¤   ¤   }
ad1c89 ¤   ¤   ¤   ¤   ¤   }
082613 ¤   ¤   ¤   ¤   }
062b85 ¤   ¤   ¤   ¤
1e9c8a ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
a372c3 ¤   ¤   ¤   ¤   {
2f6b2f ¤   ¤   ¤   ¤   ¤   PGPFreeData( *keyList );
d4133c ¤   ¤   ¤   ¤   ¤   *keyList = NULL;
952613 ¤   ¤   ¤   ¤   }
fb2b85 ¤   ¤   ¤   ¤
83b50c ¤   ¤   ¤   ¤   PGPFreeKeySet( recipients );
17a3a6 ¤   ¤   ¤   }
ce87c7 ¤   ¤   ¤
fe8a94 ¤   ¤   ¤   PGPFreeOptionList( recipientOptions );
4e0fe4 ¤   ¤   }
009371 ¤   }
1067c5 ¤
2f280c ¤   if( PGPPrefRefIsValid( clientPrefsRef ) )
b698f4 ¤   ¤   PGPClosePrefFile( clientPrefsRef );
d9af5a
84be29 #if PGP_BUSINESS_SECURITY
3fbdc2 ¤   if( PGPPrefRefIsValid( adminPrefsRef ) )
f24fbb ¤   ¤   PGPClosePrefFile( adminPrefsRef );
b78e60 #endif¤
0daf5a
dddeb7 ¤   return( err );
cbefe6 }
5aaf5a
fa26f7 ¤   static CComboError
0c6105 UpdateKeys(
926e46 ¤   PGPDiskFileRef¤ ¤   diskFileRef,
be3ec1 ¤   PGPKeySetRef¤   ¤   allKeys,
71395c ¤   PGPUInt32¤  ¤   ¤   numNewKeys,
fb4a0b ¤   PGPRecipientSpec¤   *newKeyList,
e6024a ¤   ConstStr255Param¤   masterPassphrase,
1d95e7 ¤   PGPBoolean¤ ¤   ¤   readOnly)
dabb36 {
1eb8e5 ¤   CComboError¤err;
08d3b3 ¤   PGPUInt32¤  numOldKeys;
2d67c5 ¤
21d8af ¤   /*
b17a20 ¤   ** First pass: Remove existing keys not in the new
8bef81 ¤   ** key list.
839faa ¤   */
9667c5 ¤
ba1a41 ¤   numOldKeys = GetPublicPGPDiskKeyCount( diskFileRef );
4aa433 ¤   if( numOldKeys != 0 )
45c7a1 ¤   {
84a46b ¤   ¤   PGPInt32¤   oldIndex;
3d67c5 ¤
1f5162 ¤   ¤   for( oldIndex = numOldKeys - 1; oldIndex >= 0; oldIndex-- )
7f5b34 ¤   ¤   {
0fb9ee ¤   ¤   ¤   PGPDiskKeyRef¤  diskKeyRef;
2887c7 ¤   ¤   ¤
31be4d ¤   ¤   ¤   err.err = GetIndPublicPGPDiskKey( diskFileRef, oldIndex,
55db16 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &diskKeyRef );
ad6d97 ¤   ¤   ¤   if( err.IsntError() )
01f776 ¤   ¤   ¤   {
7ee13c ¤   ¤   ¤   ¤   PGPKeyID¤   ¤   ¤   ¤   keyID;
--f52a 0005cfedaca40120010 Page 30 of CPGPDiskApplication.cp
eead51 ¤   ¤   ¤   ¤   PGPPublicKeyAlgorithm¤  algorithm;
9eee49 ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   ¤   ¤   locked;
082b85 ¤   ¤   ¤   ¤
e3f3a7 ¤   ¤   ¤   ¤   err = GetPublicPGPDiskKeyInfo( diskKeyRef, &keyID,
5d70e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm, &locked );
406ec5 ¤   ¤   ¤   ¤   if( err.IsntError() && ! locked )
c772c3 ¤   ¤   ¤   ¤   {
dc4143 ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  newIndex;
6a3c0d ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ foundKey = FALSE;
acae30 ¤   ¤   ¤   ¤   ¤
763a5d ¤   ¤   ¤   ¤   ¤   for( newIndex = 0; newIndex < numNewKeys; ++newIndex )
aa4859 ¤   ¤   ¤   ¤   ¤   {
e3c614 ¤   ¤   ¤   ¤   ¤   ¤   PGPRecipientSpec¤   *spec = &newKeyList[newIndex];
fa94aa ¤   ¤   ¤   ¤   ¤   ¤
43fce0 ¤   ¤   ¤   ¤   ¤   ¤   if( PGPCompareKeyIDs( &spec->u.id.keyID,
60fbe2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID ) == 0 &&
1f85d1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   spec->u.id.algorithm == algorithm )
f08fec ¤   ¤   ¤   ¤   ¤   ¤   {
76e2a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   foundKey = TRUE;
778c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
c26181 ¤   ¤   ¤   ¤   ¤   ¤   }¤
921c89 ¤   ¤   ¤   ¤   ¤   }
78ae30 ¤   ¤   ¤   ¤   ¤
7e4e4d ¤   ¤   ¤   ¤   ¤   if( ! foundKey )
b54859 ¤   ¤   ¤   ¤   ¤   {
440e61 ¤   ¤   ¤   ¤   ¤   ¤   err.err = RemovePGPDiskKey( diskKeyRef );
051c89 ¤   ¤   ¤   ¤   ¤   }
b42613 ¤   ¤   ¤   ¤   }
5e2b85 ¤   ¤   ¤   ¤
414bfd ¤   ¤   ¤   ¤   DisposePGPDiskKey( diskKeyRef );
1ea3a6 ¤   ¤   ¤   }
fe0fe4 ¤   ¤   }
2b9371 ¤   }
b967c5 ¤
acd8af ¤   /*
08e990 ¤   ** Second pass: Add all keys on the new list. If a key is already
1b916f ¤   ** on the disk it will be ignored. If we cannot find a key in the
44d35a ¤   ** keyring then it should already be on the disk.
669faa ¤   */
d7af5a
48d3cb ¤   if( err.IsntError() )
26c7a1 ¤   {
d5a5d6 ¤   ¤   PGPUInt32¤  newIndex;
5d1b52 ¤   ¤
997486 ¤   ¤   for( newIndex = 0; newIndex < numNewKeys; ++newIndex )
c95b34 ¤   ¤   {
1788cf ¤   ¤   ¤   PGPRecipientSpec¤   *spec = &newKeyList[newIndex];
535439 ¤   ¤   ¤   PGPKeyRef¤  ¤   ¤   keyRef;
db87c7 ¤   ¤   ¤
754ca8 ¤   ¤   ¤   pgpAssert( spec->type == kPGPRecipientSpecType_KeyID );
bb87c7 ¤   ¤   ¤
252f1a ¤   ¤   ¤   if( IsntPGPError( PGPGetKeyByKeyID( allKeys, &spec->u.id.keyID,
45e798 ¤   ¤   ¤   ¤   ¤   spec->u.id.algorithm, &keyRef ) ) )
d6f776 ¤   ¤   ¤   {
d7114b ¤   ¤   ¤   ¤   err = AddPublicPGPDiskKey( diskFileRef, keyRef,
1a6668 ¤   ¤   ¤   ¤   ¤   ¤   ¤   masterPassphrase, readOnly, FALSE );
bc62de ¤   ¤   ¤   ¤   if( err.IsError() )
d972c3 ¤   ¤   ¤   ¤   {
c314c3 ¤   ¤   ¤   ¤   ¤   break;
172613 ¤   ¤   ¤   ¤   }
f5a3a6 ¤   ¤   ¤   }
ca3b90 ¤   ¤   }¤
2c9371 ¤   }
a567c5 ¤
8ed3cb ¤   if( err.IsntError() )
d6c7a1 ¤   {
268078 ¤   ¤   err.err = SavePGPDiskFile( diskFileRef );
899371 ¤   }
2667c5 ¤
c2deb7 ¤   return( err );
4defe6 }
5caf5a
--748f 000a005711940120010 Page 31 of CPGPDiskApplication.cp
3b6d52 ¤   void
d1c2ce CPGPDiskApplication::HandleAddRemovePublicKeys(void)
19bb36 {
4eadd8 ¤   CComboError¤¤   ¤   err;
9febe1 ¤   FSSpec¤ ¤   ¤   ¤   fileSpec;
57c13c ¤   CSecurePString255¤  masterPassphrase;
d887c7 ¤   ¤   ¤
013c83 ¤   err.err = GetExistingPGPDiskFSSpec( &fileSpec );
d2d3cb ¤   if( err.IsntError() )
50c7a1 ¤   {
87ffeb ¤   ¤   err.err = VerifyPGPDiskFileIsModifiable( &fileSpec );
ba5a9f ¤   ¤   if( err.IsntError() )
235b34 ¤   ¤   {
e963fa ¤   ¤   ¤   err.err = DoGetMasterPassphraseDialog( fileSpec.name,
022e62 ¤   ¤   ¤   ¤   ¤   ¤   ¤   masterPassphrase );
1a6d97 ¤   ¤   ¤   if( err.IsntError() )
85f776 ¤   ¤   ¤   {
3cd815 ¤   ¤   ¤   ¤   err.err = VerifyMasterPassphrase( &fileSpec,
19b823 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   masterPassphrase );
5da3a6 ¤   ¤   ¤   }
300fe4 ¤   ¤   }
969371 ¤   }
ceaf5a
20d3cb ¤   if( err.IsntError() )
27c7a1 ¤   {
f7254f ¤   ¤   PGPDiskFileRef¤ diskFileRef;
901b52 ¤   ¤
0cc56e ¤   ¤   err.err = OpenPGPDiskFile( &fileSpec, &diskFileRef );
b65a9f ¤   ¤   if( err.IsntError() )
6e5b34 ¤   ¤   {
d6cbc4 ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   numKeys;
239a34 ¤   ¤   ¤   PGPRecipientSpec¤   *oldKeyList = NULL;
bdec12 ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   numOldKeys = 0;
ed87c7 ¤   ¤   ¤
6680e1 ¤   ¤   ¤   numKeys = GetPublicPGPDiskKeyCount( diskFileRef );
15115b ¤   ¤   ¤   if( numKeys != 0 )
5cf776 ¤   ¤   ¤   {
5cd0b7 ¤   ¤   ¤   ¤   oldKeyList = (PGPRecipientSpec *) pgpAllocMac( numKeys *
58f113 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( oldKeyList[0] ),
1565db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_ClearBytes |
9641f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap );
143f99 ¤   ¤   ¤   ¤   if( IsntNull( oldKeyList ) )
1f72c3 ¤   ¤   ¤   ¤   {
1b97b9 ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   defaultKeyIndex;
db9874 ¤   ¤   ¤   ¤   ¤   PGPRecipientSpec¤   *curSpec = oldKeyList;
d42b85 ¤   ¤   ¤   ¤
b028a0 ¤   ¤   ¤   ¤   ¤   for( defaultKeyIndex = 0; defaultKeyIndex < numKeys;
6c20d7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeyIndex++ )
bd4859 ¤   ¤   ¤   ¤   ¤   {
03297b ¤   ¤   ¤   ¤   ¤   ¤   PGPDiskKeyRef¤  ¤   diskKeyRef;
6794aa ¤   ¤   ¤   ¤   ¤   ¤
5d6ce8 ¤   ¤   ¤   ¤   ¤   ¤   err.err = GetIndPublicPGPDiskKey( diskFileRef,
9d9a36 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeyIndex, &diskKeyRef );
fa87cf ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
b38fec ¤   ¤   ¤   ¤   ¤   ¤   {
cdde1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ locked;
f9531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
034a29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = GetPublicPGPDiskKeyInfo(
1544e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   diskKeyRef, &curSpec->u.id.keyID,
374d01 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &curSpec->u.id.algorithm,
a7d1f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &locked );
50c8f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
9306b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
e3f4be ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   curSpec->type ¤ = kPGPRecipientSpecType_KeyID;
7e0b12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   #if PGP_BUSINESS_SECURITY
9bb9fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   curSpec->locked¤= locked;
6a75aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   #endif
84531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
65db08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ++curSpec;
0d95e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ++numOldKeys;
9f5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
a0531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
--62f3 000dcb8691940120010 Page 32 of CPGPDiskApplication.cp
ba5160 ¤   ¤   ¤   ¤   ¤   ¤   ¤   DisposePGPDiskKey( diskKeyRef );
e4db3c ¤   ¤   ¤   ¤   ¤   ¤   }
ed94aa ¤   ¤   ¤   ¤   ¤   ¤
5e2fed ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsError() )
2e8c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
661c89 ¤   ¤   ¤   ¤   ¤   }
9e2613 ¤   ¤   ¤   ¤   }
00fa07 ¤   ¤   ¤   ¤   else
4972c3 ¤   ¤   ¤   ¤   {
038e64 ¤   ¤   ¤   ¤   ¤   err.pgpErr = kPGPError_OutOfMemory;
262613 ¤   ¤   ¤   ¤   }
9ba3a6 ¤   ¤   ¤   }
ea87c7 ¤   ¤   ¤
f56d97 ¤   ¤   ¤   if( err.IsntError() )
d6f776 ¤   ¤   ¤   {
a90944 ¤   ¤   ¤   ¤   PGPContextRef¤  context;
082b85 ¤   ¤   ¤   ¤
e5cda2 ¤   ¤   ¤   ¤   err.pgpErr = PGPNewContext( kPGPsdkAPIVersion, &context );
fe82e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
b372c3 ¤   ¤   ¤   ¤   {
775bd8 ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPsdkLoadDefaultPrefs( context );
e5be0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
3b4859 ¤   ¤   ¤   ¤   ¤   {
37092d ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   allKeys;
2794aa ¤   ¤   ¤   ¤   ¤   ¤
74740a ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPOpenDefaultKeyRings( context, 0,
98546f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &allKeys );
bd87cf ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
158fec ¤   ¤   ¤   ¤   ¤   ¤   {
7415ac ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPRecipientSpec¤   *newKeyList = NULL;
7b8bc5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   numNewKeys¤ = 0;
033bd6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   ¤   readOnly;
c0531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
1b1ea9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UDesktop::Deactivate();
713791 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = RecipientsDialog( context,
583eaf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   allKeys, numOldKeys,
2e46a3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   oldKeyList, &numNewKeys,
869fb7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &newKeyList, &readOnly );
e7431e ¤   ¤   ¤   ¤   ¤   ¤   ¤   UDesktop::Activate();
2a531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
89c8f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
f406b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
fd2a0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = UpdateKeys( diskFileRef, allKeys,
2a3125 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numNewKeys, newKeyList,
db1da0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   masterPassphrase, readOnly );
81af5a
9a9a7c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeData( newKeyList );
b55268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
9c94aa ¤   ¤   ¤   ¤   ¤   ¤
b48956 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( allKeys );
b3db3c ¤   ¤   ¤   ¤   ¤   ¤   }
a51c89 ¤   ¤   ¤   ¤   ¤   }
7a87c7 ¤   ¤   ¤
8f4d5c ¤   ¤   ¤   ¤   ¤   PGPFreeContext( context );
c42613 ¤   ¤   ¤   ¤   }
c7a3a6 ¤   ¤   ¤   }
0487c7 ¤   ¤   ¤
7e3921 ¤   ¤   ¤   if( IsntNull( oldKeyList ) )
297423 ¤   ¤   ¤   ¤   pgpFreeMac( oldKeyList );
44af5a
6aac33 ¤   ¤   ¤   ClosePGPDiskFile( diskFileRef );
540fe4 ¤   ¤   }
ec9371 ¤   }
da67c5 ¤
a191d4 ¤   if( err.IsError() && ! err.IsCancelError() )
62c7a1 ¤   {
5da5d0 ¤   ¤   Str255¤ msg;
abaa47 ¤   ¤   Str255¤ errorStr;
7d1b52 ¤   ¤
1f5b5c ¤   ¤   GetIndString( msg, kErrorStringListResID,
ec2fd1 ¤   ¤   ¤   kCouldNotAddPublicKeysBecauseStrIndex );
dc5661 ¤   ¤   PrintPString( msg, msg, fileSpec.name );
--bdab 000ffb7d76a40120010 Page 33 of CPGPDiskApplication.cp
f11b52 ¤   ¤
9136ff ¤   ¤   GetComboErrorString( err, errorStr );
6ee3c0 ¤   ¤   PrintPString( msg, msg, errorStr );
7f1b52 ¤   ¤
2b057e ¤   ¤   SysBeep( 1 );
1a5592 ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle, msg );
c09371 ¤   }
0667c5 ¤
e8efe6 }
aaaf5a
93af5a
2a76d8 #endif¤ // ]
09af5a
8e9ba8 #if PGP_DEBUG¤  // [
42af5a
d6c852 #define¤kDebugMenuID¤   10001¤  // Must not conflict with regular menus
faaf5a
1e6d52 ¤   void
b9eb76 CPGPDiskApplication::InstallDebugMenu(void)
25bb36 {
ce5f59 ¤   LMenu¤  *debugMenu;
ad67c5 ¤
efc272 ¤   // Need to suspend leaking because PowerPlant menu objects leak like
217325 ¤   // crazy
a832f4 ¤   MacLeaks_Suspend();
d067c5 ¤
094faf ¤   debugMenu = new( LMenu )( kDebugMenuResID );
108dbc ¤   if( debugMenu != nil )
9fc7a1 ¤   {
8dc377 ¤   ¤   LMenuBar::GetCurrentMenuBar()->InstallMenu( debugMenu, 0 );
9b9371 ¤   }
bb0e24 ¤   else
b0c7a1 ¤   {
b8ad1a ¤   ¤   pgpDebugMsg( "InstallDebugMenu: Failed to create menu" );
159371 ¤   }
85af5a
d877d9 ¤   MacLeaks_Resume();
c9efe6 }
83af5a
8caf5a
dc6d52 ¤   void
2a792b CPGPDiskApplication::DebugMountUnmountTest(void)
50bb36 {
deadd8 ¤   CComboError¤¤   ¤   err;
18ebe1 ¤   FSSpec¤ ¤   ¤   ¤   fileSpec;
527f27 ¤   CSecurePString255¤  passphrase;
77a304 ¤   Boolean¤¤   ¤   ¤   mountReadOnly;
59ae30 ¤   ¤   ¤   ¤   ¤
9b3c83 ¤   err.err = GetExistingPGPDiskFSSpec( &fileSpec );
18d3cb ¤   if( err.IsntError() )
d7c7a1 ¤   {
cee1b0 ¤   ¤   err.err = DoMountDiskPassphraseDialog( &fileSpec, FALSE,
a0fe48 ¤   ¤   ¤   ¤   ¤   ¤   ¤   passphrase, &mountReadOnly );
c09371 ¤   }
fa67c5 ¤
86d3cb ¤   if( err.IsntError() )
57c7a1 ¤   {
bcc8c5 ¤   ¤   CPGPStDialogHandler¤dialogHandler( kWarningAlertDialogResID, nil );
da47db ¤   ¤   CWarningAlert¤  *dialogObj;
c264b8 ¤   ¤   Str255¤ ¤   ¤   msg;
8a1b52 ¤   ¤
01985e ¤   ¤   dialogObj = (CWarningAlert *) dialogHandler.GetDialog();
f142e7 ¤   ¤   if( IsNull( dialogObj ) )
cd5b34 ¤   ¤   {
33ee93 ¤   ¤   ¤   pgpDebugMsg( "WarningAlert: Nil dialog object" );
e10fe4 ¤   ¤   }
801b52 ¤   ¤
889ae1 ¤   ¤   PrintPString( msg, "\pMounting and unmounting the PGPDisk \322%1\323...¶
09934a ",
57354c ¤   ¤   ¤   ¤   fileSpec.name );
761b52 ¤   ¤
ffd86f ¤   ¤   if( dialogObj->SetupDialog( kWANoteAlertType, kWACancelStyle, msg ) )
--6a7e 00050ea3bed40120010 Page 34 of CPGPDiskApplication.cp
e35b34 ¤   ¤   {
8e7b82 ¤   ¤   ¤   Boolean¤mounted = FALSE;
944fc1 ¤   ¤   ¤   Boolean¤done = FALSE;
a687c7 ¤   ¤   ¤
5f155c ¤   ¤   ¤   dialogObj->Show();
0e87c7 ¤   ¤   ¤
f838b3 ¤   ¤   ¤   while ( ! done )
45f776 ¤   ¤   ¤   {
53ec12 ¤   ¤   ¤   ¤   UInt32¤ startTicks;
992b85 ¤   ¤   ¤   ¤
42c95d ¤   ¤   ¤   ¤   startTicks = TickCount();
7f2b85 ¤   ¤   ¤   ¤
787f24 ¤   ¤   ¤   ¤   // Delay 5 seconds between each mount/unmount cycle
f68071 ¤   ¤   ¤   ¤   while( TickCount() - startTicks < 5 * 60L )
2772c3 ¤   ¤   ¤   ¤   {
62b4c5 ¤   ¤   ¤   ¤   ¤   MessageT¤   ¤   result;
b1ae30 ¤   ¤   ¤   ¤   ¤
ac802d ¤   ¤   ¤   ¤   ¤   result = dialogHandler.DoDialog();
1cf690 ¤   ¤   ¤   ¤   ¤   if( result > 0 )
0a4859 ¤   ¤   ¤   ¤   ¤   {
4a4d7c ¤   ¤   ¤   ¤   ¤   ¤   done = TRUE;
2300eb ¤   ¤   ¤   ¤   ¤   ¤   break;
981c89 ¤   ¤   ¤   ¤   ¤   }
c42613 ¤   ¤   ¤   ¤   }
252b85 ¤   ¤   ¤   ¤
d82b85 ¤   ¤   ¤   ¤
23ddc4 ¤   ¤   ¤   ¤   if( mounted )
9172c3 ¤   ¤   ¤   ¤   {
c2ba44 ¤   ¤   ¤   ¤   ¤   PGPDiskFileInfo¤¤   fileInfo;
18ae30 ¤   ¤   ¤   ¤   ¤
42830a ¤   ¤   ¤   ¤   ¤   // Unmount our disk.
e387c7 ¤   ¤   ¤
4770d8 ¤   ¤   ¤   ¤   ¤   err.err = GetPGPDiskFileInfo( &fileSpec, &fileInfo );
17be0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
4f4859 ¤   ¤   ¤   ¤   ¤   {
dfb33a ¤   ¤   ¤   ¤   ¤   ¤   ParamBlockRec¤  pb;
6394aa ¤   ¤   ¤   ¤   ¤   ¤
4a5041 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssert( fileInfo.fileIsInUseByDriver );
0098c8 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssert( fileInfo.fileIsMounted );
af9930 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssert( fileInfo.fileDriveNumber > 0 );
ac94aa ¤   ¤   ¤   ¤   ¤   ¤
8f90cd ¤   ¤   ¤   ¤   ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
a894aa ¤   ¤   ¤   ¤   ¤   ¤
7028a7 ¤   ¤   ¤   ¤   ¤   ¤   pb.volumeParam.ioVRefNum = GetVCBForDrive(
139df5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileInfo.fileDriveNumber )->vcbVRefNum;
f594aa ¤   ¤   ¤   ¤   ¤   ¤
850336 ¤   ¤   ¤   ¤   ¤   ¤   err.err = PBUnmountVol( &pb );
111c89 ¤   ¤   ¤   ¤   ¤   }
8eae30 ¤   ¤   ¤   ¤   ¤
fb9997 ¤   ¤   ¤   ¤   ¤   mounted = FALSE;
71ae30 ¤   ¤   ¤   ¤   ¤
992613 ¤   ¤   ¤   ¤   }
960565 ¤   ¤   ¤   ¤   else if( ! done )
9772c3 ¤   ¤   ¤   ¤   {
3a981b ¤   ¤   ¤   ¤   ¤   err = MountPGPDisk( &fileSpec, FALSE, mountReadOnly,
876e49 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passphrase, FALSE, NULL, NULL, NULL );
3cbe0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
984859 ¤   ¤   ¤   ¤   ¤   {
237328 ¤   ¤   ¤   ¤   ¤   ¤   mounted = TRUE;
471c89 ¤   ¤   ¤   ¤   ¤   }
d72613 ¤   ¤   ¤   ¤   }
3ba3a6 ¤   ¤   ¤   }
002b85 ¤   ¤   ¤   ¤
75f970 ¤   ¤   ¤   dialogObj->Hide();
a70fe4 ¤   ¤   }
5b9371 ¤   }
cc67c5 ¤
1e66f1 ¤   pgpAssert( err.IsntError() || err.IsCancelError() );
40efe6 }
c5af5a
1d6d52 ¤   void
505ad8 CPGPDiskApplication::DebugUnmountAllPGPDisks(void)
--9e8f 000d01d1fa740120010 Page 35 of CPGPDiskApplication.cp
2cbb36 {
d6c33b ¤   const ushort¤   kMaxDrivers¤= 100;
4abf57 ¤   short¤  ¤   ¤   driverRefNums[ kMaxDrivers ];
064451 ¤   ushort ¤¤   ¤   numDrivers;
5f67c5 ¤
afe7b9 ¤   GetAllPGPDiskDrivers( driverRefNums, kMaxDrivers, &numDrivers);
67422e ¤   for( ushort driverIndex = 0; driverIndex < numDrivers; ++driverIndex )
9e5b34 ¤   ¤   {
4df01d ¤   ¤   UnmountAllCloseAndRemove( driverRefNums[ driverIndex ] );
840fe4 ¤   ¤   }
ccefe6 }
43af5a
cc2473 ¤   static OSStatus
dc96a8 FragmentFork(
596f35 ¤   short ¤ sourceFileRef,
b211dd ¤   short ¤ destFileRef,
23c309 ¤   short ¤ tempFileRef,
aea72d ¤   UInt32 ¤ioSize)
a9bb36 {
82c412 ¤   OSStatus¤   status;
92bec3 ¤   Ptr¤¤   ¤   buffer;
3467c5 ¤
f92097 ¤   buffer = NewPtr( ioSize );
2944f6 ¤   if( IsntNull( buffer ) )
34c7a1 ¤   {
e8d6de ¤   ¤   status = SetFPos( sourceFileRef, fsFromStart, 0 );
bd706e ¤   ¤   if( IsntErr( status ) )
ba5b34 ¤   ¤   {
1f47ce ¤   ¤   ¤   status = SetFPos( destFileRef, fsFromStart, 0 );
f2fb92 ¤   ¤   ¤   if( IsntErr( status ) )
3bf776 ¤   ¤   ¤   {
9ef55e ¤   ¤   ¤   ¤   UInt32¤ bytesRemaining;
5a2b85 ¤   ¤   ¤   ¤
75062d ¤   ¤   ¤   ¤   status = GetEOF( sourceFileRef, (long *) &bytesRemaining );
4a3ec7 ¤   ¤   ¤   ¤   if( IsntErr( status ) )
b872c3 ¤   ¤   ¤   ¤   {
dbf677 ¤   ¤   ¤   ¤   ¤   while( bytesRemaining != 0 )
c14859 ¤   ¤   ¤   ¤   ¤   {
d2a901 ¤   ¤   ¤   ¤   ¤   ¤   UInt32¤ bytesToRead;
e5e39d ¤   ¤   ¤   ¤   ¤   ¤   UInt32¤ bytesRead;
b394aa ¤   ¤   ¤   ¤   ¤   ¤
5ae19f ¤   ¤   ¤   ¤   ¤   ¤   bytesToRead = bytesRemaining;
64008d ¤   ¤   ¤   ¤   ¤   ¤   if( bytesToRead > ioSize )
fea5e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   bytesToRead = ioSize;
ae94aa ¤   ¤   ¤   ¤   ¤   ¤
f2ee7a ¤   ¤   ¤   ¤   ¤   ¤   bytesRead = bytesToRead;
f594aa ¤   ¤   ¤   ¤   ¤   ¤
189042 ¤   ¤   ¤   ¤   ¤   ¤   status = FSRead( sourceFileRef, (long *) &bytesRead,
d9b927 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   buffer );
fbaef1 ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
3f8fec ¤   ¤   ¤   ¤   ¤   ¤   {
50fa85 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32¤ bytesToWrite;
55531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
0ddfbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   bytesToWrite = bytesRead;
ef531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
132c9c ¤   ¤   ¤   ¤   ¤   ¤   ¤   status = FSWrite( destFileRef,
2ce0d7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (long *) &bytesToWrite, buffer );
5938b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
4306b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
17f809 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) FlushFile( destFileRef );
b0da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
82dccc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   bytesToWrite = bytesRead;
83da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
99feaa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   status = FSWrite( tempFileRef,
f7999d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (long *) &bytesToWrite, buffer );
9935cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) FlushFile( tempFileRef );
795268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
f8db3c ¤   ¤   ¤   ¤   ¤   ¤   }
a994aa ¤   ¤   ¤   ¤   ¤   ¤
1ef583 ¤   ¤   ¤   ¤   ¤   ¤   if( IsErr( status ) )
818c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
d0531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
--e9db 000eb9c4e2c40120010 Page 36 of CPGPDiskApplication.cp
bd0523 ¤   ¤   ¤   ¤   ¤   ¤   bytesRemaining -= bytesRead;
a91c89 ¤   ¤   ¤   ¤   ¤   }
0e2613 ¤   ¤   ¤   ¤   }
7ea3a6 ¤   ¤   ¤   }
730fe4 ¤   ¤   }
7d1b52 ¤   ¤
0a5a10 ¤   ¤   DisposePtr( buffer );
129371 ¤   }
760e24 ¤   else
78c7a1 ¤   {
dfc589 ¤   ¤   status = memFullErr;
209371 ¤   }
e367c5 ¤
2d4afd ¤   return( status );
c6efe6 }
58af5a
ba2473 ¤   static OSStatus
27bbdd DoFragmentFiles(const FSSpec *sourceSpec, const FSSpec *destSpec)
8cbb36 {
e3c412 ¤   OSStatus¤   status;
f14f27 ¤   CInfoPBRec¤ cpb;
3267c5 ¤
cd777c ¤   status = FSpGetCatInfo( sourceSpec, &cpb );
41dd30 ¤   if( IsntErr( status ) )
d0c7a1 ¤   {
80fd21 ¤   ¤   (void) FSpDelete( destSpec );
201b52 ¤   ¤
4cfeaa ¤   ¤   status = FSpCreate( destSpec, cpbFileCreator( &cpb ),
68eb57 ¤   ¤   ¤   ¤   ¤   ¤   cpbFileType( &cpb ), 0 );
ad706e ¤   ¤   if( IsntErr( status ) )
d05b34 ¤   ¤   {
e8ec6c ¤   ¤   ¤   FSSpec¤ tempFileSpec;
d287c7 ¤   ¤   ¤
8646f4 ¤   ¤   ¤   tempFileSpec = *destSpec;
ae97f2 ¤   ¤   ¤   NumToString( TickCount(), tempFileSpec.name );
7987c7 ¤   ¤   ¤
9bfd40 ¤   ¤   ¤   status = FSpCreate( &tempFileSpec, '????', '????', 0 );
d6fb92 ¤   ¤   ¤   if( IsntErr( status ) )
b4f776 ¤   ¤   ¤   {
ffb248 ¤   ¤   ¤   ¤   short¤  tempFileRef;
fb2b85 ¤   ¤   ¤   ¤
7411cf ¤   ¤   ¤   ¤   status = FSpOpenDF( &tempFileSpec, fsRdWrPerm, &tempFileRef );
983ec7 ¤   ¤   ¤   ¤   if( IsntErr( status ) )
b572c3 ¤   ¤   ¤   ¤   {
644267 ¤   ¤   ¤   ¤   ¤   UInt32¤ ioSize;
e5ae30 ¤   ¤   ¤   ¤   ¤
14647e ¤   ¤   ¤   ¤   ¤   status = GetVolumeBlockCounts( destSpec->vRefNum, nil,
212067 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil, &ioSize );
d0b6a1 ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
9d4859 ¤   ¤   ¤   ¤   ¤   {
808148 ¤   ¤   ¤   ¤   ¤   ¤   short¤  sourceFileRef;
a863c9 ¤   ¤   ¤   ¤   ¤   ¤   short¤  destFileRef;
1294aa ¤   ¤   ¤   ¤   ¤   ¤
c1f1bb ¤   ¤   ¤   ¤   ¤   ¤   if( cpb.hFileInfo.ioFlLgLen != 0 )
d88fec ¤   ¤   ¤   ¤   ¤   ¤   {
448534 ¤   ¤   ¤   ¤   ¤   ¤   ¤   status = FSpOpenDF( sourceSpec, fsRdPerm,
37b2fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &sourceFileRef );
ea38b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
eb06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
238a5c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   status = FSpOpenDF( destSpec, fsRdWrPerm,
8dd8c6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &destFileRef );
cb6d1c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
5931b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
a7d896 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   status = FragmentFork( sourceFileRef,
1f1701 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   destFileRef, tempFileRef,
148a0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ioSize );
8d3ede ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
e59e6f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) FSClose( destFileRef );
476560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
31da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
49db75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) FSClose( sourceFileRef );
eb5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
--af86 000b4cd858840120010 Page 37 of CPGPDiskApplication.cp
0ddb3c ¤   ¤   ¤   ¤   ¤   ¤   }
ac94aa ¤   ¤   ¤   ¤   ¤   ¤
0589a6 ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) &&
55fa4a ¤   ¤   ¤   ¤   ¤   ¤   ¤   cpb.hFileInfo.ioFlRLgLen != 0 )
608fec ¤   ¤   ¤   ¤   ¤   ¤   {
dd8f3a ¤   ¤   ¤   ¤   ¤   ¤   ¤   status = FSpOpenRF( sourceSpec, fsRdPerm,
a0b2fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &sourceFileRef );
5938b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
f406b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
f68052 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   status = FSpOpenRF( destSpec, fsRdWrPerm,
7bd8c6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &destFileRef );
d86d1c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
7931b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
2ed896 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   status = FragmentFork( sourceFileRef,
1a1701 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   destFileRef, tempFileRef,
858a0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ioSize );
f73ede ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
4a9e6f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) FSClose( destFileRef );
3b6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
51da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
58db75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) FSClose( sourceFileRef );
f65268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
dadb3c ¤   ¤   ¤   ¤   ¤   ¤   }
051c89 ¤   ¤   ¤   ¤   ¤   }
9b2b85 ¤   ¤   ¤   ¤
f1c8a9 ¤   ¤   ¤   ¤   ¤   (void) FSClose( tempFileRef );
3488b2 ¤   ¤   ¤   ¤   }¤  ¤   ¤   ¤
bc1b52 ¤   ¤
d602eb ¤   ¤   ¤   ¤   (void) FSpDelete( &tempFileSpec );
f9a3a6 ¤   ¤   ¤   }
750fe4 ¤   ¤   }
8467c5 ¤
719371 ¤   }
b767c5 ¤
644afd ¤   return( status );
9eefe6 }
1caf5a
426d52 ¤   void
cefc2c CPGPDiskApplication::DebugFragmentFile(void)
d0bb36 {
dab9bd ¤   SFTypeList¤ ¤   ¤   typeList;
590925 ¤   StandardFileReply¤  sfReply;
0067c5 ¤
4a8b37 ¤   StandardGetFile( nil, -1, typeList, &sfReply );
a4026c ¤   if( sfReply.sfGood )
a2c7a1 ¤   {
02b080 ¤   ¤   FSSpec¤ sourceSpec;
b291a9 ¤   ¤   Str255¤ defaultName;
521b52 ¤   ¤
f6a106 ¤   ¤   sourceSpec = sfReply.sfFile;
cb1b52 ¤   ¤
75a4a1 ¤   ¤   CopyPString( sourceSpec.name, defaultName );
4b1b52 ¤   ¤
310c1b ¤   ¤   if( defaultName[0] > 26 )
b2c5d4 ¤   ¤   ¤   defaultName[0] = 26;
7487c7 ¤   ¤   ¤
e94df6 ¤   ¤   AppendPString( "\p.frag", defaultName );
401b52 ¤   ¤
454b9d ¤   ¤   StandardPutFile( "\pSave fragmanted file as", defaultName, &sfReply );
333631 ¤   ¤   if( sfReply.sfGood )
bc5b34 ¤   ¤   {
834cfb ¤   ¤   ¤   FSSpec¤ destSpec;
bb87c7 ¤   ¤   ¤
8e4366 ¤   ¤   ¤   destSpec = sfReply.sfFile;
a887c7 ¤   ¤   ¤
6dc15e ¤   ¤   ¤   if( ! FSpEqual( &sourceSpec, &destSpec ) )
d0f776 ¤   ¤   ¤   {
b514d5 ¤   ¤   ¤   ¤   OSStatus¤   status;
ab2b85 ¤   ¤   ¤   ¤
aeb0e9 ¤   ¤   ¤   ¤   status = DoFragmentFiles( &sourceSpec, &destSpec );
97f0a8 ¤   ¤   ¤   ¤   if( IsErr( status ) )
b472c3 ¤   ¤   ¤   ¤   {
--a992 001b16bfb3b40120010 Page 38 of CPGPDiskApplication.cp
e1ab01 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
4a5f83 ¤   ¤   ¤   ¤   ¤   ¤   "\pAn error occurred while fragmenting the file" );
22b889 ¤   ¤   ¤   ¤   }¤
c9a3a6 ¤   ¤   ¤   }
d1bb8c ¤   ¤   ¤   else
6af776 ¤   ¤   ¤   {
d1bdb7 ¤   ¤   ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
15eda9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   "\pYou cannot fragment a file in place" );
1ba3a6 ¤   ¤   ¤   }
cf0fe4 ¤   ¤   }
ed9371 ¤   }
d1efe6 }
01af5a
5e6d52 ¤   void
2f55f2 CPGPDiskApplication::DebugTemp1(void)
78bb36 {
0288da ¤   pgpDebugMsg( "DebugTemp1 not implemented" );
26efe6 }
dfaf5a
556d52 ¤   void
e3df22 CPGPDiskApplication::DebugTemp2(void)
b9bb36 {
f97b2c ¤   pgpDebugMsg( "DebugTemp2 not implemented" );
69efe6 }
4daf5a
d26d52 ¤   void
c75e9d CPGPDiskApplication::DebugTemp3(void)
fdbb36 {
eed271 ¤   pgpDebugMsg( "DebugTemp3 not implemented" );
64efe6 }
e8af5a
b1249c #endif // ]
--0c09 000e5918e7140120011 Page 1 of CPGPDiskApplication.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
7a3652 ¤   $Id: CPGPDiskApplication.h,v 1.6.2.1.2.1 1998/11/12 03:05:11 heller Exp $
76f7f7 ____________________________________________________________________________*/
e7af5a
847b7d #pragma once
29af5a
f17029 #include <LApplication.h>
1f0a93 #include <LPeriodical.h>
0faf5a
122465 #include "PGPDiskFileFormat.h"
10af5a
da0d59 #if PGPDISK_STANDALONE
8e64fa typedef struct Personalization
d2bb36 {
daa982 ¤   Str255¤ userName;
7cf012 ¤   Str255¤ organization;
74cd28 ¤   Str255¤ registationNumber;
c0762c } Personalization;
9f7454 #endif
6aaf5a
64bb97 class CPGPDiskApplication : public LApplication, public LPeriodical
1ebb36 {
9f5ed4 public:
34c4c6 ¤   ¤   ¤   ¤   ¤   ¤   CPGPDiskApplication();
b3af5a
21fd2d ¤   virtual ¤   ¤   ¤   ~CPGPDiskApplication();
85af5a
ac48a0 ¤   virtual void¤   ¤   FindCommandStatus(CommandT inCommand,
f5db44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
06f661 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName );
512d7b ¤   virtual void¤   ¤   HandleAppleEvent( const AppleEvent &inAppleEvent,
4a3eb4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   AppleEvent &outAEReply, AEDesc &outResult,
b62d9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32 inAENumber );
184118 ¤   virtual Boolean¤¤   ObeyCommand(CommandT inCommand, void *ioParam = nil);
23a817 ¤   virtual¤void¤   ¤   ProcessNextEvent(void);
b351a0 ¤   virtual void¤   ¤   Run(void);
b54642 ¤   virtual void¤   ¤   GetPersonalizationString( StringPtr persStr );
fbde80 ¤   virtual void¤   ¤   ShowAboutBox(void);
8fcc99 ¤   virtual¤void¤   ¤   SpendTime(const EventRecord &inMacEvent);
4167c5 ¤
c9fd35 ¤   static CPGPDiskApplication¤ *mApplication;
7a67c5 ¤
9da2d3 protected:
cdaf5a
7f0591 ¤   void¤   ¤   ¤   ¤   DoOpenDocAppleEvent(const AppleEvent &inAppleEvent );
08132d ¤   void¤   ¤   ¤   ¤   DoOpenFile(const FSSpec *theFile);
d3d816 ¤   OSStatus¤   ¤   ¤   GetExistingPGPDiskFSSpec(FSSpec *fileSpec);
454579 ¤   void¤   ¤   ¤   ¤   HandleAddPassphrase(void);
c037f0 ¤   void¤   ¤   ¤   ¤   HandleChangePassphrase(void);
f3820e ¤   void¤   ¤   ¤   ¤   HandleRemovePassphrase(void);
7ee85a ¤   void¤   ¤   ¤   ¤   HandleRemoveAltPassphrases(void);
6bc0fe ¤   CComboError¤¤   ¤   HandleMountPGPDisk(const FSSpec *inFileSpec);
818682 ¤   void¤   ¤   ¤   ¤   HandleNewPGPDisk(void);
97af6c ¤   virtual void¤   ¤   Initialize(void);
4028ad ¤   virtual void¤   ¤   MakeMenuBar(void);
b84b60 ¤   virtual void¤   ¤   StartUp(void);
41af5a
2aea4b #if PGPDISK_PUBLIC_KEY
96db44 ¤   void¤   ¤   ¤   ¤   HandleAddRemovePublicKeys(void);
7d7454 #endif
9167c5 ¤
6381e6 #if USE_MAC_DEBUG_LEAKS
eb1781 ¤   // we need to suspend leaks checking for the duration of these things
82d3aa ¤   // because PowerPlant will never release certain items
735c30 ¤   virtual void¤   ¤   MakeModelDirector( void )
52f1b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { ¤ MacLeaks_Suspend();
2a5682 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LApplication::MakeModelDirector();
1ea00c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   MacLeaks_Resume(); }
e5ee12 #endif // USE_MAC_DEBUG_LEAKS
--8d38 00185c8898540120011 Page 2 of CPGPDiskApplication.h
e0af5a
9d5c98 #if PGP_DEBUG
8795e6 ¤   virtual¤void¤   ¤   InstallDebugMenu(void);
c3de0e ¤   virtual¤void¤   ¤   DebugMountUnmountTest(void);
24d12e ¤   virtual¤void¤   ¤   DebugUnmountAllPGPDisks(void);
96b5d4 ¤   virtual¤void¤   ¤   DebugFragmentFile(void);
5b22a1 ¤   virtual¤void¤   ¤   DebugTemp1(void);
5cf4a6 ¤   virtual¤void¤   ¤   DebugTemp2(void);
78b95b ¤   virtual¤void¤   ¤   DebugTemp3(void);
0a1e67 #endif¤ // PGP_DEBUG
7daf5a
bc0fb9 private:
11af5a
d10d59 #if PGPDISK_STANDALONE
3ff93d ¤   Personalization¤¤   mPersonalization;
5502d0 ¤   Boolean¤¤   ¤   ¤   mHavePersonalized;
3667c5 ¤
a6c98d ¤   void¤   ¤   ¤   ¤   DoPersonalization(void);
ad7454 #endif
de82f7 };
adaf5a
85af5a
--3ed9 001663c0c8940120012 Page 1 of CPGPDiskDialog.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
a06d03 ¤   $Id: CPGPDiskDialog.cp,v 1.3.8.1 1998/11/12 03:05:12 heller Exp $
4df7f7 ____________________________________________________________________________*/
95af5a
e0b980 #include <Appearance.h>
0baf5a
d58bd8 #include "MacEnvirons.h"
13af5a
ebab5f #include "CPGPDiskDialog.h"
8aaf5a
280c7a CPGPDiskDialog::CPGPDiskDialog()
d3bb36 {
b1efe6 }
0faf5a
33c376 CPGPDiskDialog::CPGPDiskDialog(LStream *inStream)
151fb6 ¤   : LGADialog(inStream)
22bb36 {
38efe6 }
d8af5a
f0c22e CPGPDiskDialog::~CPGPDiskDialog()
1dbb36 {
3eefe6 }
a3af5a
a66d52 ¤   void
fb3c46 CPGPDiskDialog::ApplyForeAndBackColors(void) const
54bb36 {
9c5627 ¤   if( HaveAppearanceMgr() )
5cc7a1 ¤   {
28ccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
338188 ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
509371 ¤   }
cf0e24 ¤   else
b6c7a1 ¤   {
1ac77b ¤   ¤   LGADialog::ApplyForeAndBackColors();
9e9371 ¤   }
1eefe6 }
6faf5a
446d52 ¤   void
4ca660 CPGPDiskDialog::FinishCreateSelf(void)
b5bb36 {
7f893a ¤   LGADialog::FinishCreateSelf();
a8af5a
6e5627 ¤   if( HaveAppearanceMgr() )
bbc7a1 ¤   {
3cccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
7b4594 ¤   ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
829371 ¤   }
66efe6 }
--62ea 001e8a229c640120013 Page 1 of CPGPDiskDialog.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
6480a3 ¤   $Id: CPGPDiskDialog.h,v 1.3.8.1 1998/11/12 03:05:12 heller Exp $
d7f7f7 ____________________________________________________________________________*/
d2af5a
a67b7d #pragma once
c2af5a
32f0a0 #include <LGADialog.h>
51af5a
9dd842 class CPGPDiskDialog : public LGADialog
85bb36 {
f15ed4 public:
6caf5a
a095b6 ¤   enum { class_ID = 'DDlg' };
8267c5 ¤
8c0ebb ¤   ¤   ¤   ¤   ¤   ¤   CPGPDiskDialog();
ff921e ¤   ¤   ¤   ¤   ¤   ¤   CPGPDiskDialog(LStream *inStream);
6b94aa ¤   ¤   ¤   ¤   ¤   ¤
a4f28e ¤   virtual¤¤   ¤   ¤   ~CPGPDiskDialog();
5baf5a
9b42ec ¤   virtual void¤   ¤   ApplyForeAndBackColors(void) const;
ca67c5 ¤
c7a2d3 protected:
fcaf5a
23febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
e882f7 };
--848b 00117bfd74040120014 Page 1 of CPGPDiskWindow.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
7107bd ¤   $Id: CPGPDiskWindow.cp,v 1.3.8.1 1998/11/12 03:05:13 heller Exp $
9ef7f7 ____________________________________________________________________________*/
1baf5a
42b980 #include <Appearance.h>
b8af5a
148bd8 #include "MacEnvirons.h"
a3af5a
8cd67a #include "CPGPDiskWindow.h"
24af5a
3aa199 CPGPDiskWindow::CPGPDiskWindow()
0dbb36 {
4eefe6 }
c7af5a
821f8b CPGPDiskWindow::CPGPDiskWindow(LStream *inStream)
4d645c ¤   : LWindow(inStream)
97bb36 {
7defe6 }
58af5a
0fb8ad CPGPDiskWindow::~CPGPDiskWindow()
d9bb36 {
59efe6 }
f1af5a
516d52 ¤   void
89db3c CPGPDiskWindow::ApplyForeAndBackColors(void) const
01bb36 {
255627 ¤   if( HaveAppearanceMgr() )
90c7a1 ¤   {
12ccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
998188 ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
309371 ¤   }
480e24 ¤   else
1ec7a1 ¤   {
4ff32b ¤   ¤   LWindow::ApplyForeAndBackColors();
999371 ¤   }
a3efe6 }
a8af5a
7c6d52 ¤   void
7b29b1 CPGPDiskWindow::FinishCreateSelf(void)
22bb36 {
0a0305 ¤   LWindow::FinishCreateSelf();
84af5a
6f5627 ¤   if( HaveAppearanceMgr() )
c8c7a1 ¤   {
b4ccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
d44594 ¤   ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
049371 ¤   }
17efe6 }
--c922 0011703187640120015 Page 1 of CPGPDiskWindow.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
86b65d ¤   $Id: CPGPDiskWindow.h,v 1.3.8.1 1998/11/12 03:05:14 heller Exp $
4cf7f7 ____________________________________________________________________________*/
ebaf5a
9e7b7d #pragma once
38af5a
218fd4 #include <LWindow.h>
2daf5a
d9960f class CPGPDiskWindow : public LWindow
e3bb36 {
f85ed4 public:
17af5a
137fd8 ¤   enum { class_ID = 'DWnd' };
7c67c5 ¤
f3739e ¤   ¤   ¤   ¤   ¤   ¤   CPGPDiskWindow();
b159d2 ¤   ¤   ¤   ¤   ¤   ¤   CPGPDiskWindow(LStream *inStream);
8694aa ¤   ¤   ¤   ¤   ¤   ¤
6d8fab ¤   virtual¤¤   ¤   ¤   ~CPGPDiskWindow();
b9af5a
8542ec ¤   virtual void¤   ¤   ApplyForeAndBackColors(void) const;
a2af5a
60a2d3 protected:
8eaf5a
ecfebc ¤   virtual void¤   ¤   FinishCreateSelf(void);
1782f7 };
--2f7b 000281baef540120016 Page 1 of CPassphraseDialog.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
1f3a99 ¤   $Id: CPassphraseDialog.cp,v 1.9.8.1 1998/11/12 03:05:14 heller Exp $
93f7f7 ____________________________________________________________________________*/
e6af5a
1f090b #include "MacEvents.h"
dfc110 #include "pgpMacMemory.h"
a185c2 #include "MacStrings.h"
e9af5a
b225ae #include <LCaption.h>
748708 #include <LCheckBox.h>
b7af5a
a2de36 #include "PGPDisk.h"
888ec6 #include "PGPDiskPreferences.h"
89af5a
7d8495 #include "CPassphraseDialog.h"
c2829c #include "CPassphraseEdit.h"
afaf5a
1faf5a
2cb66f CPassphraseDialog::CPassphraseDialog()
dabb36 {
bdefe6 }
90af5a
9011cd CPassphraseDialog::CPassphraseDialog(LStream *inStream)
d90078 ¤   : CPGPDiskDialog(inStream)
c6bb36 {
4eca95 ¤   mCapsLockMessageVisible = FALSE;
36efe6 }
d2af5a
ca804e CPassphraseDialog::~CPassphraseDialog()
3bbb36 {
b6efe6 }
b2af5a
bd6d52 ¤   void
78db49 CPassphraseDialog::FinishCreateSelf(void)
07bb36 {
f776a7 ¤   LCheckBox¤  *hideTypingCheckboxObj;
0e67c5 ¤
8a1069 ¤   CPGPDiskDialog::FinishCreateSelf();
b767c5 ¤
b562fd ¤   mPassphraseFieldObj =
5d5096 ¤   ¤   ¤   (CPassphraseEdit *) FindPaneByID( kPassphraseEditFieldPaneID );
59dc2a ¤   pgpAssertAddrValid( mPassphraseFieldObj, VoidAlign );·
b4af5a
6be8eb ¤   // Setup the passphrase field options
c191fb ¤   mPassphraseFieldObj->SetHideTyping( TRUE );
168724 ¤   mPassphraseFieldObj->AddListener( this );
6167c5 ¤
6634e2 ¤   // Initialize the hide typing checkbox
d57457 ¤   hideTypingCheckboxObj =
0b50e9 ¤   ¤   ¤   (LCheckBox *) FindPaneByID( kHideTypingCheckboxPaneID );
a3be47 ¤   pgpAssertAddrValid( hideTypingCheckboxObj, VoidAlign);
2faf5a
362dc2 ¤   hideTypingCheckboxObj->SetValue( 1 );
850a04 ¤   hideTypingCheckboxObj->AddListener( this );
b967c5 ¤
3b68d2 ¤   StartIdling();
340590 ¤   SwitchTarget( mPassphraseFieldObj );
b2efe6 }
49af5a
1f7e69 ¤   Boolean
f2e306 CPassphraseDialog::GetPassphrase(StringPtr passphrase)
cbbb36 {
4e741c ¤   mPassphraseFieldObj->GetDescriptor( passphrase );
43af5a
c21966 ¤   return( TRUE );
f4efe6 }
75af5a
806d52 ¤   void
2819a9 CPassphraseDialog::SetHideTyping(Boolean hideTyping)
--f65b 0001f36960f40120016 Page 2 of CPassphraseDialog.cp
2cbb36 {
02991e ¤   pgpAssertAddrValid( mPassphraseFieldObj, VoidAlign );
1367c5 ¤
b2a8e6 ¤   mPassphraseFieldObj->SetHideTyping( hideTyping );
32efe6 }
7baf5a
4b6d52 ¤   void
a46310 CPassphraseDialog::ListenToMessage(MessageT inMessage, void *ioParam)
bcbb36 {
28769e ¤   switch( inMessage )
cdc7a1 ¤   {
ed261a ¤   ¤   case kPassphraseEditFieldPaneID:
e6480b ¤   ¤   ¤   PassphraseHasChanged();
f1cdcb ¤   ¤   ¤   break;
a4af5a
f77385 ¤   ¤   case msg_HideTyping:
625b34 ¤   ¤   {
77da0b ¤   ¤   ¤   Int32¤  controlValue;
e787c7 ¤   ¤   ¤
d8ae2d ¤   ¤   ¤   pgpAssertAddrValid( ioParam, Int32 );
6587c7 ¤   ¤   ¤
e55c54 ¤   ¤   ¤   controlValue = *((Int32 *) ioParam);
5a87c7 ¤   ¤   ¤
8cde07 ¤   ¤   ¤   SetHideTyping( controlValue == kControlCheckBoxCheckedValue );
73cdcb ¤   ¤   ¤   break;
080fe4 ¤   ¤   }
93af5a
d59ae3 ¤   ¤   default:
de35c2 ¤   ¤   ¤   CPGPDiskDialog::ListenToMessage( inMessage, ioParam );
5dcdcb ¤   ¤   ¤   break;
9c9371 ¤   }
36efe6 }
bcaf5a
e6c3e3 //¤ Sets the prompt text at the top of the dialog.
86af5a
566d52 ¤   void
a39318 CPassphraseDialog::SetPrompt(ConstStr255Param prompt)
7ebb36 {
af3ebf ¤   LCaption¤   *captionObj;
8467c5 ¤
5709ae ¤   captionObj = (LCaption *) FindPaneByID( kDescriptionCaptionPaneID );
4f419d ¤   pgpAssertAddrValid( captionObj, LCaption );
ec67c5 ¤
b3a333 ¤   if( captionObj != nil )
b56774 ¤   ¤   captionObj->SetDescriptor( prompt );
6aefe6 }
74af5a
316d52 ¤   void
1bec21 CPassphraseDialog::SpendTime(const EventRecord &inMacEvent)
bcbb36 {
217172 ¤   #pragma unused( inMacEvent )
3267c5 ¤
f84588 ¤   if( ( GetAllModifiers() & alphaLock ) != 0 )
a5c7a1 ¤   {
227caf ¤   ¤   if( ! mCapsLockMessageVisible )
b45b34 ¤   ¤   {
0e329c ¤   ¤   ¤   FindPaneByID( kCapsLockDownCaptionPaneID )->Show();
3f740f ¤   ¤   ¤   mCapsLockMessageVisible = TRUE;
020fe4 ¤   ¤   }
209371 ¤   }
590e24 ¤   else
dac7a1 ¤   {
2fd755 ¤   ¤   if( mCapsLockMessageVisible )
e75b34 ¤   ¤   {
88deb0 ¤   ¤   ¤   FindPaneByID( kCapsLockDownCaptionPaneID )->Hide();
17c9c0 ¤   ¤   ¤   mCapsLockMessageVisible = FALSE;
6d0fe4 ¤   ¤   }
0a9371 ¤   }
1defe6 }
8aaf5a
da6d52 ¤   void
1fb748 CPassphraseDialog::PassphraseHasChanged(void)
--67f9 001cbed4cee40120016 Page 3 of CPassphraseDialog.cp
2cbb36 {
cbefe6 }
--0e80 001e9ca6fb940120017 Page 1 of CPassphraseDialog.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
764931 ¤   $Id: CPassphraseDialog.h,v 1.7.8.1 1998/11/12 03:05:15 heller Exp $
13f7f7 ____________________________________________________________________________*/
3aaf5a
c87b7d #pragma once
79af5a
f70a93 #include <LPeriodical.h>
33af5a
c0ab5f #include "CPGPDiskDialog.h"
7caf5a
c5fbf2 const MessageT¤ msg_HideTyping = 1050;
41af5a
912647 class CPassphraseEdit;
2baf5a
ff23bf class CPassphraseDialog : public CPGPDiskDialog, public LPeriodical
7bbb36 {
fd5ed4 public:
36af5a
472120 ¤   enum { class_ID = 'PPhr' };
fa67c5 ¤
57d1b8 ¤   ¤   ¤   ¤   ¤   ¤   CPassphraseDialog();
32bb03 ¤   virtual¤¤   ¤   ¤   ~CPassphraseDialog();
f35317 ¤   ¤   ¤   ¤   ¤   ¤   CPassphraseDialog(LStream *inStream);
b9af5a
9c9df5 ¤   Boolean¤¤   ¤   ¤   GetPassphrase(StringPtr passphrase);
f6e629 ¤   virtual void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
d7e4f8 ¤   void¤   ¤   ¤   ¤   SetPrompt(ConstStr255Param prompt);
0fcc99 ¤   virtual¤void¤   ¤   SpendTime(const EventRecord &inMacEvent);
2c67c5 ¤
77a2d3 protected:
1eaf5a
c02f4b ¤   enum
c6c7a1 ¤   {
58511c ¤   ¤   kOKButtonPaneID¤¤   ¤   ¤   = 5001,
d4cccf ¤   ¤   kCancelButtonPaneID¤¤   ¤   = 5002,
7d388e ¤   ¤   kDescriptionCaptionPaneID¤  = 5003,
12afa4 ¤   ¤   kCapsLockDownCaptionPaneID¤ = 5004,
9ef5c6 ¤   ¤   kPassphraseEditFieldPaneID¤ = 5005,
6bdd54 ¤   ¤   kHideTypingCheckboxPaneID¤  = 5006
5762bd ¤   };
a1af5a
e41d5b ¤   CPassphraseEdit ¤   *mPassphraseFieldObj;
3a14d3 ¤   Boolean¤¤   ¤   ¤   mCapsLockMessageVisible;
8e67c5 ¤
c0febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
23ef47 ¤   virtual¤void¤   ¤   PassphraseHasChanged(void);
fe3bf7 ¤   virtual¤void¤   ¤   SetHideTyping(Boolean hideTyping);
e982f7 };
--d786 00098e1811e40120018 Page 1 of CPreferencesDialog.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
979ede ¤   $Id: CPreferencesDialog.cp,v 1.7.8.1 1998/11/12 03:05:16 heller Exp $
87f7f7 ____________________________________________________________________________*/
ceaf5a
c48708 #include <LCheckBox.h>
aa7c09 #include <LEditText.h>
96dd56 #include <PP_Messages.h>
95afac #include <UModalDialogs.h>
e559c5 #include "CPGPStDialogHandler.h"
5baf5a
9e0d08 #include "pgpMem.h"
e3de36 #include "PGPDisk.h"
f58ec6 #include "PGPDiskPreferences.h"
c1af5a
873be4 #include "CPreferencesDialog.h"
9daf5a
1bff6e const short¤¤   kPGPDiskPreferenceDialogResID¤  = 6000;
96af5a
d29137 const PaneIDT¤  kOKButtonPaneID¤¤   ¤   ¤   ¤   = 6001;
a07d8e const PaneIDT¤  kCancelButtonPaneID¤¤   ¤   ¤   = 6002;
a77b74 const PaneIDT¤  kSleepDismountCheckboxPaneID ¤  = 6003;
5407f9 const PaneIDT¤  kTimedDismountCheckboxPaneID ¤  = 6004;
ad394c const PaneIDT¤  kTimedDismountEditFieldPaneID¤  = 6005;
db20f6 const PaneIDT¤  kTimedDismountCaptionPaneID¤¤   = 6006;
0eaf5a
f885ea ¤   OSStatus
5e0f8a DoPreferencesDialog(void)
f7bb36 {
9112aa ¤   CPGPStDialogHandler¤¤   dialogHandler( kPGPDiskPreferenceDialogResID,
9cf582 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil );
6b7991 ¤   CPreferencesDialog¤ *dialogObj;
114a28 ¤   OSStatus¤   ¤   ¤   status;
3167c5 ¤
52adc1 ¤   status = noErr;
3767c5 ¤
975657 ¤   dialogObj = (CPreferencesDialog *) dialogHandler.GetDialog();
e475ef ¤   if( IsNull( dialogObj ) )
12c7a1 ¤   {
31cf32 ¤   ¤   pgpDebugMsg( "DoPreferencesDialog: Nil dialog object" );
8af848 ¤   ¤   return( memFullErr );
cb9371 ¤   }
0367c5 ¤
35e395 ¤   dialogObj->Show();
ce67c5 ¤
6b3101 ¤   while (TRUE)
d1c7a1 ¤   {
cf9881 ¤   ¤   MessageT¤   hitMessage = dialogHandler.DoDialog();
89af5a
00df94 ¤   ¤   if( hitMessage == msg_Cancel )
815b34 ¤   ¤   {
9c49b2 ¤   ¤   ¤   status = userCanceledErr;
6dcdcb ¤   ¤   ¤   break;
8f0fe4 ¤   ¤   }
0344d7 ¤   ¤   else if( hitMessage == msg_OK )
575b34 ¤   ¤   {
112150 ¤   ¤   ¤   status = noErr;
52cdcb ¤   ¤   ¤   break;
b80fe4 ¤   ¤   }
7f9371 ¤   }
7daf5a
f50fb9 ¤   dialogObj->Hide();
be67c5 ¤
c74afd ¤   return( status );
cbefe6 }
d4af5a
854cc9 CPreferencesDialog::CPreferencesDialog()
d8bb36 {
33efe6 }
98af5a
--9dda 0003bac705b40120018 Page 2 of CPreferencesDialog.cp
2a3b4e CPreferencesDialog::CPreferencesDialog(LStream *inStream)
ed0078 ¤   : CPGPDiskDialog(inStream)
0cbb36 {
27efe6 }
56af5a
06a02a CPreferencesDialog::~CPreferencesDialog()
e0bb36 {
aaefe6 }
33af5a
bb6d52 ¤   void
51a90f CPreferencesDialog::FinishCreateSelf(void)
90bb36 {
6a669f ¤   LCheckBox¤  *controlObj;
6ba3e4 ¤   LEditText¤  *editFieldObj;
fa67c5 ¤
ee1069 ¤   CPGPDiskDialog::FinishCreateSelf();
7a67c5 ¤
e3654e ¤   controlObj = (LCheckBox *) FindPaneByID( kSleepDismountCheckboxPaneID );
3c1db0 ¤   pgpAssertAddrValid( controlObj, VoidAlign );
2b67c5 ¤
445518 ¤   controlObj->SetValue(
e73043 ¤   ¤   ¤   gPGPDiskPrefs.driverPrefs.unmountDrivesOnPBSleep ? 1 : 0 );
2567c5 ¤
3131c4 ¤   controlObj = (LCheckBox *) FindPaneByID( kTimedDismountCheckboxPaneID );
681db0 ¤   pgpAssertAddrValid( controlObj, VoidAlign );
7eaf5a
935518 ¤   controlObj->SetValue(
11a764 ¤   ¤   ¤   gPGPDiskPrefs.driverPrefs.unmountAfterIdleTime ? 1 : 0 );
d5af5a
b295e4 ¤   editFieldObj = (LEditText *) FindPaneByID( kTimedDismountEditFieldPaneID );
ef6ffa ¤   pgpAssertAddrValid( editFieldObj, LEditText );
2567c5 ¤
82c4ae ¤   editFieldObj->SetValue(
f24e57 ¤   ¤   ¤   gPGPDiskPrefs.driverPrefs.unmountIdleTimeSeconds / 60 );
37efe6 }
afaf5a
686d52 ¤   void
1e415f CPreferencesDialog::ListenToMessage(MessageT inMessage, void *ioParam)
42bb36 {
40769e ¤   switch( inMessage )
46c7a1 ¤   {
edd8ba ¤   ¤   case msg_OK:
3e5b34 ¤   ¤   {
4be0a1 ¤   ¤   ¤   LCheckBox¤  *controlObj;
e06e68 ¤   ¤   ¤   LEditText¤  *editFieldObj;
a387c7 ¤   ¤   ¤
333857 ¤   ¤   ¤   // Copy the current state of the controls into our preferences
d21b52 ¤   ¤
35f531 ¤   ¤   ¤   controlObj =
f365ca ¤   ¤   ¤   ¤   ¤   (LCheckBox *) FindPaneByID( kSleepDismountCheckboxPaneID );
d12198 ¤   ¤   ¤   pgpAssertAddrValid( controlObj, VoidAlign );
6c87c7 ¤   ¤   ¤
b7fd5f ¤   ¤   ¤   gPGPDiskPrefs.driverPrefs.unmountDrivesOnPBSleep =
60b0c6 ¤   ¤   ¤   ¤   ¤   controlObj->GetValue() == 1;
5587c7 ¤   ¤   ¤
85fa6d ¤   ¤   ¤   controlObj = (LCheckBox *)
3ed2e7 ¤   ¤   ¤   ¤   ¤   FindPaneByID( kTimedDismountCheckboxPaneID );
3e2198 ¤   ¤   ¤   pgpAssertAddrValid( controlObj, VoidAlign );
4daf5a
80b8e4 ¤   ¤   ¤   gPGPDiskPrefs.driverPrefs.unmountAfterIdleTime =
86b0c6 ¤   ¤   ¤   ¤   ¤   controlObj->GetValue() == 1;
38af5a
e2ad82 ¤   ¤   ¤   editFieldObj =
c3dd2d ¤   ¤   ¤   ¤   (LEditText *) FindPaneByID( kTimedDismountEditFieldPaneID );
2d79e6 ¤   ¤   ¤   pgpAssertAddrValid( editFieldObj, LEditText );
3baf5a
b783f9 ¤   ¤   ¤   gPGPDiskPrefs.driverPrefs.unmountIdleTimeSeconds =
186936 ¤   ¤   ¤   ¤   ¤   editFieldObj->GetValue();
f78bad ¤   ¤   ¤   if( gPGPDiskPrefs.driverPrefs.unmountIdleTimeSeconds < 1 )
abd172 ¤   ¤   ¤   ¤   gPGPDiskPrefs.driverPrefs.unmountIdleTimeSeconds = 1;
4387c7 ¤   ¤   ¤
3b9c78 ¤   ¤   ¤   /* convert to seconds */
--6c08 0019612a8a340120018 Page 3 of CPreferencesDialog.cp
054a7b ¤   ¤   ¤   gPGPDiskPrefs.driverPrefs.unmountIdleTimeSeconds *= 60;¤
0287c7 ¤   ¤   ¤
7bac30 ¤   ¤   ¤   WritePreferences( &gPGPDiskPrefs );
d4964a ¤   ¤   ¤   SendPreferencesToAllDrivers( &gPGPDiskPrefs.driverPrefs );
660fe4 ¤   ¤   }
961b52 ¤   ¤
979ae3 ¤   ¤   default:
3e35c2 ¤   ¤   ¤   CPGPDiskDialog::ListenToMessage( inMessage, ioParam );
a3cdcb ¤   ¤   ¤   break;
eaaf5a
539371 ¤   }
1befe6 }
96af5a
--c228 0018c79cf0440120019 Page 1 of CPreferencesDialog.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
0e2460 ¤   $Id: CPreferencesDialog.h,v 1.5.8.1 1998/11/12 03:05:16 heller Exp $
edf7f7 ____________________________________________________________________________*/
7caf5a
567b7d #pragma once
5faf5a
7eab5f #include "CPGPDiskDialog.h"
14af5a
f98122 class CPreferencesDialog : public CPGPDiskDialog
6bbb36 {
df5ed4 public:
3caf5a
62e0ec ¤   enum { class_ID = 'Pref' };
6467c5 ¤
198535 ¤   ¤   ¤   ¤   ¤   CPreferencesDialog();
01dbbc ¤   ¤   ¤   ¤   ¤   CPreferencesDialog(LStream *inStream);
15ae30 ¤   ¤   ¤   ¤   ¤
568b37 ¤   virtual¤¤   ¤   ~CPreferencesDialog();
d4af5a
ca2e22 ¤   virtual void¤   ListenToMessage(MessageT inMessage, void *ioParam);
8aaf5a
59a2d3 protected:
f9af5a
eaa2f8 ¤   virtual void¤   FinishCreateSelf(void);
ac82f7 };
b9af5a
8c3cfc OSStatus¤   DoPreferencesDialog(void);
--8f1c 00081d440bb4012001a Page 1 of CSetPassphraseDialog.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
4a0167 ¤   $Id: CSetPassphraseDialog.cp,v 1.11.8.1 1998/11/12 03:05:17 heller Exp $
cff7f7 ____________________________________________________________________________*/
caaf5a
2484be #include <Sound.h>
55af5a
e08708 #include <LCheckBox.h>
bb49f7 #include <LProgressBar.h>
a6dd56 #include <PP_Messages.h>
f3afac #include <UModalDialogs.h>
bbaf5a
ce59c5 #include "CPGPStDialogHandler.h"
e7c110 #include "pgpMacMemory.h"
07afa7 #include "pgpPassphraseUtils.h"
0fbf4a #include "MacSecureMemory.h"
7d85c2 #include "MacStrings.h"
31af5a
3ede36 #include "PGPDisk.h"
510927 #include "PGPDiskResources.h"
548ec6 #include "PGPDiskPreferences.h"
ede5dd #include "PGPDiskUtils.h"
47af5a
62e4c5 #include "CSetPassphraseDialog.h"
48829c #include "CPassphraseEdit.h"
219dc2 #include "CWarningAlert.h"
01af5a
77dbf4 const short¤¤   kSetPassphraseDialogResID¤  ¤   ¤   = 5000;
c3af5a
b79fdf const PaneIDT¤  kConfirmationCaptionPaneID¤ ¤   ¤   = 5007;
567c65 const PaneIDT¤  kConfirmationEditFieldPaneID¤   ¤   = 5008;
b0a299 const PaneIDT¤  kReadOnlyPassphraseCheckboxPaneID¤  = 5009;
c7d8f3 const PaneIDT¤  kMoveHideTypingToLocationPaneID¤¤   = 5010;
19d7c1 const PaneIDT¤  kMinPasspharaseQualityCaptionPaneID¤= 5011;
91feb8 const PaneIDT¤  kMaxPasspharaseQualityCaptionPaneID¤= 5012;
26b826 const PaneIDT¤  kPasspharaseQualityBarPaneID¤   ¤   = 5013;
96af5a
59a538 //¤ Presents the new passphrase dialog to the user until the user aborts or
1b1946 //¤ enters a passphrase of the correct format.
c2af5a
1c2473 ¤   static OSStatus
1154f1 DoSetChangePassphraseDialog(
892966 ¤   ConstStr255Param ¤  diskName,
e02884 ¤   short¤  ¤   ¤   ¤   promptIndex,
64dd07 ¤   Boolean¤¤   ¤   ¤   showReadOnlyPassphraseCheckbox,
5878e4 ¤   StringPtr ¤ ¤   ¤   passphrase,
6d4cc1 ¤   Boolean¤¤   ¤   ¤   *addReadOnly)
d9bb36 {
95447a ¤   CPGPStDialogHandler¤¤   dialogHandler( kSetPassphraseDialogResID, nil );
8acf83 ¤   CSetPassphraseDialog¤   *dialogObj;
d0a94f ¤   OSStatus¤   ¤   ¤   ¤   status;
444ebf ¤   Str255¤ ¤   ¤   ¤   ¤   prompt;
3a67c5 ¤
84c79c ¤   pgpAssertAddrValid( diskName, uchar );
608da6 ¤   pgpAssertAddrValid( passphrase, uchar );
f2e4c0 ¤   pgpAssertAddrValid( addReadOnly, Boolean );
0e67c5 ¤
65adc1 ¤   status = noErr;
06af5a
7dade5 ¤   dialogObj = (CSetPassphraseDialog *) dialogHandler.GetDialog();
e375ef ¤   if( IsNull( dialogObj ) )
75c7a1 ¤   {
987314 ¤   ¤   pgpDebugMsg( "GetNewPassphraseForDisk: Nil dialog object" );
e5f848 ¤   ¤   return( memFullErr );
ef9371 ¤   }
1b67c5 ¤
ffe7c9 ¤   GetIndString( prompt, kDialogStringListResID, promptIndex );
eb274e ¤   PrintPString( prompt, prompt, diskName );
cdaf5a
81b726 ¤   dialogObj->SetPrompt( prompt );
--2ae8 00011717b6c4012001a Page 2 of CSetPassphraseDialog.cp
cda275 ¤   dialogObj->ShowReadOnlyCheckbox( showReadOnlyPassphraseCheckbox );
58e395 ¤   dialogObj->Show();
3b67c5 ¤
813101 ¤   while (TRUE)
d8c7a1 ¤   {
569881 ¤   ¤   MessageT¤   hitMessage = dialogHandler.DoDialog();
b2af5a
04df94 ¤   ¤   if( hitMessage == msg_Cancel )
1d5b34 ¤   ¤   {
f949b2 ¤   ¤   ¤   status = userCanceledErr;
c9cdcb ¤   ¤   ¤   break;
560fe4 ¤   ¤   }
6a44d7 ¤   ¤   else if( hitMessage == msg_OK )
255b34 ¤   ¤   {
33e6ed ¤   ¤   ¤   if( dialogObj->PassphraseIsConfirmed() )
07f776 ¤   ¤   ¤   {
9af78e ¤   ¤   ¤   ¤   dialogObj->GetPassphrase( passphrase );
272b85 ¤   ¤   ¤   ¤
b7686c ¤   ¤   ¤   ¤   if( passphrase[0] < kMinPassPhraseLength )
dd72c3 ¤   ¤   ¤   ¤   {
da91a8 ¤   ¤   ¤   ¤   ¤   Str32¤  numStr;
d69b0a ¤   ¤   ¤   ¤   ¤   Str255¤ msg;
58ae30 ¤   ¤   ¤   ¤   ¤
c2142a ¤   ¤   ¤   ¤   ¤   GetIndString( msg, kErrorStringListResID,
64f88a ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPassphraseToShortStrIndex );
d8822e ¤   ¤   ¤   ¤   ¤   NumToString( kMinPassPhraseLength, numStr );
175530 ¤   ¤   ¤   ¤   ¤   PrintPString( msg, msg, numStr );
2daf5a
2a7c97 ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
074cb1 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
823e01 ¤   ¤   ¤   ¤   ¤   ¤   ¤   msg );
602613 ¤   ¤   ¤   ¤   }
75fa07 ¤   ¤   ¤   ¤   else
216e50 ¤   ¤   ¤   ¤   {¤
e565ff ¤   ¤   ¤   ¤   ¤   *addReadOnly = dialogObj->GetReadOnlyCheckboxStatus();
6414c3 ¤   ¤   ¤   ¤   ¤   break;
472613 ¤   ¤   ¤   ¤   }
a1a3a6 ¤   ¤   ¤   }
b0bb8c ¤   ¤   ¤   else
c8f776 ¤   ¤   ¤   {
354b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
a45a07 ¤   ¤   ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
5cafde ¤   ¤   ¤   ¤   ¤   ¤   ¤   kErrorStringListResID,
a266a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPassphrasesMustMatchStrIndex );
f7531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
1a65d1 ¤   ¤   ¤   ¤   dialogObj->ClearPassphraseFields();
fda3a6 ¤   ¤   ¤   }
b80fe4 ¤   ¤   }
e49371 ¤   }
09af5a
690fb9 ¤   dialogObj->Hide();
c967c5 ¤
494afd ¤   return( status );
c3efe6 }
6faf5a
f6a538 //¤ Presents the new passphrase dialog to the user until the user aborts or
921946 //¤ enters a passphrase of the correct format.
82af5a
0585ea ¤   OSStatus
fca9b0 DoNewPassphraseDialog(
a22966 ¤   ConstStr255Param ¤  diskName,
54065c ¤   StringPtr ¤ ¤   ¤   passphrase)
0bbb36 {
b4c412 ¤   OSStatus¤   status;
47be5b ¤   Boolean¤¤   notUsed;
a067c5 ¤
e3c79c ¤   pgpAssertAddrValid( diskName, uchar );
308da6 ¤   pgpAssertAddrValid( passphrase, uchar );
d8af5a
622fc1 ¤   status = DoSetChangePassphraseDialog( diskName,
282377 ¤   ¤   ¤   ¤   ¤   kNewPassphraseDialogPromptStrIndex, FALSE, passphrase,
118563 ¤   ¤   ¤   ¤   ¤   &notUsed );
--192f 000786494e64012001a Page 3 of CSetPassphraseDialog.cp
2a67c5 ¤
0f4afd ¤   return( status );
18efe6 }
00af5a
3fd6b4 //¤ Presents the add passphrase dialog to the user until the user aborts or
411946 //¤ enters a passphrase of the correct format.
8aaf5a
ee85ea ¤   OSStatus
f48050 DoAddPassphraseDialog(
c12966 ¤   ConstStr255Param ¤  diskName,
0378e4 ¤   StringPtr ¤ ¤   ¤   passphrase,
064cc1 ¤   Boolean¤¤   ¤   ¤   *addReadOnly)
95bb36 {
ccc412 ¤   OSStatus¤   status;
8f67c5 ¤
d7c79c ¤   pgpAssertAddrValid( diskName, uchar );
4e8da6 ¤   pgpAssertAddrValid( passphrase, uchar );
3ee4c0 ¤   pgpAssertAddrValid( addReadOnly, Boolean );
99af5a
f12fc1 ¤   status = DoSetChangePassphraseDialog( diskName,
f18b9f ¤   ¤   ¤   ¤   ¤   ¤   kAddPassphraseDialogPromptStrIndex,
b3b35c ¤   ¤   ¤   ¤   ¤   ¤   TRUE, passphrase, addReadOnly );
8667c5 ¤
804afd ¤   return( status );
c4efe6 }
12af5a
656f1a //¤ Presents the set passphrase dialog to the user until the user aborts or
7f1946 //¤ enters a passphrase of the correct format.
1daf5a
9285ea ¤   OSStatus
cb2324 DoSetPassphraseDialog(
3b2966 ¤   ConstStr255Param ¤  diskName,
88065c ¤   StringPtr ¤ ¤   ¤   passphrase)
0abb36 {
80c412 ¤   OSStatus¤   status;
75be5b ¤   Boolean¤¤   notUsed;
6d67c5 ¤
06c79c ¤   pgpAssertAddrValid( diskName, uchar );
298da6 ¤   pgpAssertAddrValid( passphrase, uchar );
89af5a
752fc1 ¤   status = DoSetChangePassphraseDialog( diskName,
ef35d4 ¤   ¤   ¤   ¤   ¤   ¤   kSetPassphraseDialogPromptStrIndex,
4d3960 ¤   ¤   ¤   ¤   ¤   ¤   FALSE, passphrase, &notUsed );
5f67c5 ¤
574afd ¤   return( status );
c8efe6 }
daaf5a
18af5a
7b481f CSetPassphraseDialog::CSetPassphraseDialog()
63bb36 {
29efe6 }
cbaf5a
3a1f63 CSetPassphraseDialog::CSetPassphraseDialog(LStream *inStream)
d415c5 ¤   : CPassphraseDialog(inStream)
6cbb36 {
d4efe6 }
bbaf5a
e1ce55 CSetPassphraseDialog::~CSetPassphraseDialog()
9fbb36 {
9defe6 }
07af5a
356d52 ¤   void
b62b32 CSetPassphraseDialog::FinishCreateSelf(void)
7bbb36 {
990e31 ¤   CPassphraseDialog::FinishCreateSelf();
6067c5 ¤
ab4586 ¤   mConfirmationFieldObj =
7f0395 ¤   ¤   ¤   (CPassphraseEdit *) FindPaneByID( kConfirmationEditFieldPaneID );
41b9d5 ¤   pgpAssertAddrValid( mConfirmationFieldObj, VoidAlign );·
2daf5a
5dfec8 ¤   // Setup the confirmation field options
781316 ¤   mConfirmationFieldObj->SetHideTyping( TRUE );
--3be6 0005367bb1a4012001a Page 4 of CSetPassphraseDialog.cp
c7f4c7 ¤   mConfirmationFieldObj->AddListener( this );
e167c5 ¤
a910c5 ¤   mPassphraseQualityBarObj =
8bca54 ¤   ¤   ¤   (LProgressBar *) FindPaneByID( kPasspharaseQualityBarPaneID );
1af88b ¤   pgpAssertAddrValid( mPassphraseQualityBarObj, VoidAlign );·
62efe6 }
58af5a
287e69 ¤   Boolean
660d0e CSetPassphraseDialog::PassphraseIsConfirmed(void)
19bb36 {
e21d8c ¤   CSecurePString255 ¤ passphrase;
1d5fa4 ¤   CSecurePString255 ¤ confirmation;
97b5ed ¤   Boolean¤¤   ¤   ¤   confirmed;
8067c5 ¤
f2991e ¤   pgpAssertAddrValid( mPassphraseFieldObj, VoidAlign );
305018 ¤   pgpAssertAddrValid( mConfirmationFieldObj, VoidAlign );
3567c5 ¤
f0741c ¤   mPassphraseFieldObj->GetDescriptor( passphrase );
9947b9 ¤   mConfirmationFieldObj->GetDescriptor( confirmation );
ee67c5 ¤
b8eaae ¤   confirmed = PStringsAreEqual( passphrase, confirmation );
fc67c5 ¤
b25679 ¤   return( confirmed );
5aefe6 }
c2af5a
857e69 ¤   Boolean
1f8b70 CSetPassphraseDialog::GetPassphrase(StringPtr passphrase)
2dbb36 {
0c69b1 ¤   if( ! PassphraseIsConfirmed() )
7dc7a1 ¤   {
9aacaa ¤   ¤   pgpDebugMsg("GetPassphrase(): Passphrase is not correctly confirmed");
fbe20d ¤   ¤   return( FALSE );
b19371 ¤   }
1767c5 ¤
09cee5 ¤   return( CPassphraseDialog::GetPassphrase( passphrase ) );
ecefe6 }
8caf5a
7e6d52 ¤   void
8c8810 CSetPassphraseDialog::SetHideTyping(Boolean hideTyping)
c6bb36 {
045018 ¤   pgpAssertAddrValid( mConfirmationFieldObj, VoidAlign );
2d67c5 ¤
b4fc34 ¤   CPassphraseDialog::SetHideTyping( hideTyping );
6167c5 ¤
e083f7 ¤   mConfirmationFieldObj->SetHideTyping( hideTyping );
c1efe6 }
e4af5a
0f6d52 ¤   void
7efcda CSetPassphraseDialog::ShowReadOnlyCheckbox(Boolean showCheckbox)
82bb36 {
40acf2 ¤   if( showCheckbox )
dec7a1 ¤   {
dfb744 ¤   ¤   LCheckBox¤  *control;
5f548d ¤   ¤   LPane¤  ¤   *placeHolder;
59a9da ¤   ¤   SPoint32¤   placeHolderLoc;
911b52 ¤   ¤
6a1867 ¤   ¤   control =
9c3223 ¤   ¤   ¤   (LCheckBox *) FindPaneByID( kReadOnlyPassphraseCheckboxPaneID );
673cc8 ¤   ¤   pgpAssertAddrValid( control, VoidAlign );
281b52 ¤   ¤
3f5cea ¤   ¤   control->Show();
8baf5a
f0fa70 ¤   ¤   control = (LCheckBox *) FindPaneByID( kHideTypingCheckboxPaneID );
1f3cc8 ¤   ¤   pgpAssertAddrValid( control, VoidAlign );
d6af5a
6f481b ¤   ¤   placeHolder = FindPaneByID( kMoveHideTypingToLocationPaneID );
0deb2c ¤   ¤   pgpAssertAddrValid( placeHolder, LPane );
051b52 ¤   ¤
702424 ¤   ¤   placeHolder->GetFrameLocation( placeHolderLoc );
e6aa8b ¤   ¤   control->PlaceInSuperFrameAt( placeHolderLoc.h, placeHolderLoc.v,
07fda2 ¤   ¤   ¤   ¤   TRUE );
539371 ¤   }
--9480 00191db38524012001a Page 5 of CSetPassphraseDialog.cp
7aefe6 }
46af5a
cf7e69 ¤   Boolean
54e6f2 CSetPassphraseDialog::GetReadOnlyCheckboxStatus(void)
9bbb36 {
e63e10 ¤   LCheckBox¤  *control;
d867c5 ¤
f22cdf ¤   control = (LCheckBox *) FindPaneByID( kReadOnlyPassphraseCheckboxPaneID );
4d73f6 ¤   pgpAssertAddrValid( control, VoidAlign );
aeaf5a
3eaeb3 ¤   return( control->GetValue() != 0 );
86efe6 }
1faf5a
516d52 ¤   void
971514 CSetPassphraseDialog::ClearPassphraseFields(void)
e0bb36 {
1a13e0 ¤   mPassphraseFieldObj->ClearPassphrase();
ff5df7 ¤   mConfirmationFieldObj->ClearPassphrase();
2b67c5 ¤
d30590 ¤   SwitchTarget( mPassphraseFieldObj );
6567c5 ¤
f86ea9 ¤   PassphraseHasChanged();
fcefe6 }
c5af5a
186d52 ¤   void
19a12c CSetPassphraseDialog::PassphraseHasChanged(void)
d1bb36 {
03f22e ¤   CPassphraseDialog::PassphraseHasChanged();
1167c5 ¤
a86bf2 ¤   UpdatePassphraseQuality();
afefe6 }
94af5a
846d52 ¤   void
f2b8bf CSetPassphraseDialog::UpdatePassphraseQuality(void)
11bb36 {
607f27 ¤   CSecurePString255¤  passphrase;
90b138 ¤   CSecureCString256¤  cPassphrase;
d8fc30 ¤   ushort¤ ¤   ¤   ¤   passphraseQuality;
6f67c5 ¤
7e741c ¤   mPassphraseFieldObj->GetDescriptor( passphrase );
f91566 ¤   PToCString( passphrase, cPassphrase );
5f67c5 ¤
d4eb3f ¤   passphraseQuality = pgpEstimatePassphraseQuality( cPassphrase );
c37d02 ¤   pgpAssert( passphraseQuality <= 100 );
9d67c5 ¤
1a9a5f ¤   mPassphraseQualityBarObj->SetValue( passphraseQuality );
bfefe6 }
91af5a
--77e5 001aabb57474012001b Page 1 of CSetPassphraseDialog.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
6197ba ¤   $Id: CSetPassphraseDialog.h,v 1.5.8.1 1998/11/12 03:05:17 heller Exp $
94f7f7 ____________________________________________________________________________*/
e6af5a
dc7b7d #pragma once
53af5a
518495 #include "CPassphraseDialog.h"
81af5a
ad2647 class CPassphraseEdit;
de79e9 class LProgressBar;
4daf5a
c34cdf class CSetPassphraseDialog : public CPassphraseDialog
22bb36 {
e15ed4 public:
8aaf5a
5ff727 ¤   enum { class_ID = 'SPhr' };
1c67c5 ¤
8b4334 ¤   ¤   ¤   ¤   ¤   CSetPassphraseDialog();
6699fa ¤   virtual¤¤   ¤   ~CSetPassphraseDialog();
4645f7 ¤   ¤   ¤   ¤   ¤   CSetPassphraseDialog(LStream *inStream);
8aaf5a
a3d77e ¤   void¤   ¤   ¤   ClearPassphraseFields(void);
486f73 ¤   Boolean¤¤   ¤   GetPassphrase(StringPtr passphrase);
9eac2b ¤   Boolean¤¤   ¤   GetReadOnlyCheckboxStatus(void);
7c561d ¤   Boolean¤¤   ¤   PassphraseIsConfirmed(void);
e681be ¤   void¤   ¤   ¤   ShowReadOnlyCheckbox(Boolean showCheckbox);
9467c5 ¤
7fa2d3 protected:
1eaf5a
30febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
e5ef47 ¤   virtual¤void¤   ¤   PassphraseHasChanged(void);
143bf7 ¤   virtual¤void¤   ¤   SetHideTyping(Boolean hideTyping);
6767c5 ¤
950fb9 private:
a1af5a
a5aa64 ¤   CPassphraseEdit ¤   *mConfirmationFieldObj;
6a83b3 ¤   LProgressBar¤   ¤   *mPassphraseQualityBarObj;
ce67c5 ¤
90a751 ¤   void¤   ¤   ¤   ¤   UpdatePassphraseQuality(void);
1482f7 };
49af5a
0bbf53 OSStatus¤   DoNewPassphraseDialog(ConstStr255Param diskName,
394e29 ¤   ¤   ¤   ¤   ¤   StringPtr passphrase);
63353e OSStatus¤   DoAddPassphraseDialog(ConstStr255Param diskName,
ace755 ¤   ¤   ¤   ¤   ¤   StringPtr passphrase, Boolean *addReadOnly);
97a755 OSStatus¤   DoSetPassphraseDialog(ConstStr255Param diskName,
aa8019 ¤   ¤   ¤   ¤   ¤   StringPtr passphrase);¶
--2eca 001abc7efec4012001c Page 1 of PGPDiskApp.prefix
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
793e0a ¤   $Id: PGPDiskApp.prefix,v 1.4.8.1 1998/11/12 03:05:18 heller Exp $
35f7f7 ____________________________________________________________________________*/
7baf5a
7eb18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
426068 #define UNFINISHED_CODE_ALLOWED¤¤   0
96af5a
76af5a
be53cf #include "PGPdiskAppShared.prefix"
16af5a
abaf5a
--d49e 00143d34ca64012001d Page 1 of PGPDiskAppDebug.prefix
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
5d375e ¤   $Id: PGPDiskAppDebug.prefix,v 1.5.8.1 1998/11/12 03:05:19 heller Exp $
c0f7f7 ____________________________________________________________________________*/
bbaf5a
4ca853 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1
6f79b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
4daf5a
e0093f #define Debug_Throw¤¤   ¤   ¤   ¤   1¤  /* PowerPlant debugging */
d2a696 #define Debug_Signal¤   ¤   ¤   ¤   1¤  /* PowerPlant debugging */
d0af5a
43023c #include "PGPdiskAppShared.prefix"¶
--beb2 0019620c56c4012001e Page 1 of PGPDiskBeta.c
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
74bd29 ¤   $Id: PGPDiskBeta.c,v 1.5.2.1.2.1 1998/11/12 03:05:19 heller Exp $
73f7f7 ____________________________________________________________________________*/
ecaf5a
18bdd3 #include "PGPDiskBeta.h"
31af5a
dc9838 #if BETA
40af5a
7d7e69 ¤   Boolean
4f4151 BetaExpired( void )
00bb36 {
eb8359 ¤   DateTimeRec¤dt;
52b8b2 ¤   ulong¤  ¤   now;
6b7157 ¤   ulong¤  ¤   expirationDate;
0b67c5 ¤
e78ebc ¤   dt.month¤   ¤   = 11;
069834 ¤   dt.day¤ ¤   ¤   = 15;
db60f8 ¤   dt.year¤¤   ¤   = 1998;
3e6a25 ¤   dt.hour¤¤   ¤   = 0;
3d8a6b ¤   dt.minute¤  ¤   = 0;
731526 ¤   dt.second¤  ¤   = 0;
b2094d ¤   dt.dayOfWeek¤   = 0;
e0175f ¤   DateToSeconds( &dt, &expirationDate );
ef67c5 ¤
453248 ¤   GetDateTime( &now );
2867c5 ¤
97a613 ¤   return( expirationDate < now );
94efe6 }
c7af5a
962841 #endif¶
--ae14 00199b15dba4012001f Page 1 of PGPDiskBeta.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
4829a9 ¤   $Id: PGPDiskBeta.h,v 1.2.8.1 1998/11/12 03:05:20 heller Exp $
50f7f7 ____________________________________________________________________________*/
fcaf5a
ab7b7d #pragma once
43af5a
8f9838 #if BETA
696c58 ¤   Boolean¤BetaExpired( void );
997454 #endif
--7fc8 0009894d93440120020 Page 1 of PGPDiskFile.c
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
858249 ¤   $Id: PGPDiskFile.c,v 1.7.8.1 1998/11/12 03:05:21 heller Exp $
c7f7f7 ____________________________________________________________________________*/
dfaf5a
3bbf4a #include "MacSecureMemory.h"
3a85c2 #include "MacStrings.h"
ebc110 #include "pgpMacMemory.h"
28af5a
4ede36 #include "PGPDisk.h"
8f3175 #include "PGPDiskEncryptDecrypt.h"
76546f #include "PGPDiskFile.h"
7e2465 #include "PGPDiskFileFormat.h"
38e5dd #include "PGPDiskUtils.h"
1b3c1e #include "randpool.h"
7baf5a
2aea4b #if PGPDISK_PUBLIC_KEY
a82f8d #include "pgpErrors.h"
f1a076 #include "pgpKeys.h"
e642aa #include "pgpPublicKey.h"
54f436 #include "pgpsdkPrefs.h"
194919 #include "pgpUtilities.h"
597454 #endif
11af5a
73ce33 #define MIN(a,b)¤   ¤   ( (a) <= (b) ? (a) : (b) )
4caf5a
0632f5 #define¤kPGPDiskFileMagic¤  ((OSType) 'DFIL')
de0b37 #define¤kPGPDiskKeyMagic¤   ((OSType) 'DKEY')
3faf5a
4d048e typedef struct PGPDiskHeaderListItem
c5bb36 {
0707d5 ¤   struct PGPDiskHeaderListItem¤   *next;
5a66ea ¤   PGPDiskFileHeaderInfo¤  ¤   ¤   *header;
7667c5 ¤
dc9bd6 } PGPDiskHeaderListItem;
33af5a
9c0720 typedef struct PGPDiskFile
bbbb36 {
b882bc ¤   OSType¤ ¤   ¤   magic;¤ ¤   ¤   // kPGPDiskFileMagic
4f644f ¤   FSSpec¤ ¤   ¤   fileSpec;
2c1b92 ¤   UInt32¤ ¤   ¤   keyCount;
f8af5a
7fea4b #if PGPDISK_PUBLIC_KEY
138a97 ¤   PGPContextRef¤  context;
5e9e3c ¤   PGPKeySetRef¤   keySet;
3c7454 #endif
7aaf5a
c9fda5 ¤   PGPDiskFileHeader¤  ¤   *mainHeader;
1778f9 ¤   PGPDiskHeaderListItem¤  *headerList;
23af5a
858740 } PGPDiskFile;
c967c5 ¤
214689 typedef struct PGPDiskKey
b9bb36 {
c1f3e6 ¤   OSType¤ ¤   ¤   ¤   magic;¤ ¤   // kPGPDiskKeyMagic
8267c5 ¤
7e1a06 ¤   Boolean¤¤   ¤   ¤   isPassphraseKey;
653a36 ¤   Boolean¤¤   ¤   ¤   isMasterKey;
9763cc ¤   Boolean¤¤   ¤   ¤   deleted;
386380 ¤   PGPDiskFileRef¤ ¤   diskFile;
8767c5 ¤
fef20a ¤   union
72c7a1 ¤   {
2e9b54 ¤   ¤   PassphraseKey¤  ¤   ¤   *passKey;
ee88c3 ¤   ¤   long¤   ¤   ¤   ¤   ¤   dummy;
75af5a
e508aa ¤   #if PGPDISK_PUBLIC_KEY
518129 ¤   ¤   PGPDiskPublicKeyHeader¤ *publicKey;
54b7ec ¤   #endif
9862bd ¤   };
--a8e1 000ca7bc2b640120020 Page 2 of PGPDiskFile.c
2a67c5 ¤
3b6e3c } PGPDiskKey;
cdaf5a
362c28 const MacMemoryAllocFlags kMemAllocationFlags = kMacMemory_UseApplicationHeap |
55ea48 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseTempMem |
26c45f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_ClearBytes;
d3af5a
425df6 static OSStatus¤¤   GetIndKey(PGPDiskFileRef diskFileRef, UInt32 index,
b3a617 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean searchPassphraseKeys,
9ae030 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean searchPublicKeys,
d35ae6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPDiskKeyRef *keyRefPtr);
bd67c5 ¤
d967c5 ¤
492473 ¤   static OSStatus
31549d ReadPGPDiskFileHeaderAtOffset(
49a4aa ¤   short ¤ ¤   ¤   ¤   ¤   fileRef,
686525 ¤   UInt32¤ ¤   ¤   ¤   ¤   offset,
9d3942 ¤   PGPDiskFileHeaderInfo¤  **header)
bcbb36 {
dc8b38 ¤   OSStatus¤   ¤   ¤   ¤   err;
07230b ¤   PGPDiskFileHeaderInfo¤  info;
e867c5 ¤
a73a31 ¤   AssertFileRefNumIsValid( fileRef, "ReadPGPDiskFileHeaderAtOffset" );
d7c839 ¤   pgpAssertAddrValid( header, PGPDiskFileHeaderInfo * );
aeaf5a
7ef9d2 ¤   *header = NULL;
7267c5 ¤
af96e4 ¤   err = FSReadFileUsingDriver( fileRef, offset, sizeof( info ), &info,
1f87d3 ¤   ¤   ¤   ¤   ¤   NULL );
39ee03 ¤   if( IsntErr( err ) )
b9c7a1 ¤   {
540f5f ¤   ¤   if( info.headerMagic == kPGPDiskHeaderMagic )
d35b34 ¤   ¤   {
6d7cac ¤   ¤   ¤   *header = (PGPDiskFileHeaderInfo *) pgpAllocMac( info.headerSize,
6241e5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMemAllocationFlags );
bb65eb ¤   ¤   ¤   if( IsntNull( *header ) )
0ef776 ¤   ¤   ¤   {
769dae ¤   ¤   ¤   ¤   err = FSReadFileUsingDriver( fileRef, offset,
51d7d7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   info.headerSize, *header, NULL );
7fa3a6 ¤   ¤   ¤   }
febb8c ¤   ¤   ¤   else
80f776 ¤   ¤   ¤   {
a9945a ¤   ¤   ¤   ¤   err = memFullErr;
e9a3a6 ¤   ¤   ¤   }
950fe4 ¤   ¤   }
9e0e1d ¤   ¤   else
a75b34 ¤   ¤   {
1eb8db ¤   ¤   ¤   err = kPGPDiskInvalidFileHeaderError;
e90fe4 ¤   ¤   }
989371 ¤   }
de67c5 ¤
4aa3a6 ¤   if( IsErr( err ) && IsntNull( *header ) )
3ec7a1 ¤   {
455487 ¤   ¤   pgpFreeMac( *header );
3b8326 ¤   ¤   *header = NULL;
9a9371 ¤   }
8b67c5 ¤
10deb7 ¤   return( err );
beefe6 }
a9af5a
7ebaa6 ¤   static CRC32
cce8d4 ComputePGPDiskFileHeaderCRC(const PGPDiskFileHeaderInfo *headerInfo)
5fbb36 {
d7a8ba ¤   CRC32¤  saveHeaderCRC;
697741 ¤   CRC32¤  crc;
b467c5 ¤
2303b3 ¤   pgpAssertAddrValid( headerInfo, PGPDiskFileHeaderInfo );
97af5a
59c8f3 ¤   // Always set CRC and next offset value to zero before computing.
16f19f ¤   // Version 2.0 file format did not set nextHeaderOffset to zero
614d23 ¤   // before computing CRC, but it was always zero so no problem.
ca67c5 ¤
--4527 0008655677740120020 Page 3 of PGPDiskFile.c
8b2e41 ¤   saveHeaderCRC ¤ = headerInfo->headerCRC;
ec67c5 ¤
8669aa ¤   ((PGPDiskFileHeaderInfo *) headerInfo)->headerCRC = 0;
0467c5 ¤
129953 ¤   crc = ComputeCRC32( headerInfo, headerInfo->headerSize );
0267c5 ¤
43f041 ¤   ((PGPDiskFileHeaderInfo *) headerInfo)->headerCRC = saveHeaderCRC;
cd67c5 ¤
17397e ¤   return( crc );
35efe6 }
1aaf5a
7b2473 ¤   static OSStatus
7c8046 VerifyPGPDiskFileMainHeader(
2139c4 ¤   const PGPDiskFileHeader *fileHeader,
7aecb8 ¤   UInt32¤ ¤   ¤   ¤   ¤   fileSize)
1fbb36 {
2f0ab3 ¤   if( fileHeader->headerInfo.headerType != kPGPDiskPrimaryHeaderType )
c9c7a1 ¤   {
20d7a7 ¤   ¤   pgpDebugMsg( "VerifyPGPDiskFileMainHeader: Invalid header type" );
c0e98c ¤   ¤   return( kPGPDiskInvalidFileHeaderError );
e69371 ¤   }
18af5a
b6aa96 ¤   if( fileHeader->majorVersion > kPGPDiskPrimaryHeaderMajorVersion )
e5c7a1 ¤   {
294f35 ¤   ¤   pgpDebugMsg( "VerifyPGPDiskFileMainHeader: Newer header version" );
5e3c94 ¤   ¤   return( kPGPDiskNewerFileVersionError );
269371 ¤   }
0eaf5a
ae0e32 ¤   if( fileHeader->algorithm != kCASTEncryptionAlgorithm )
2cc7a1 ¤   {
ec4b2b ¤   ¤   pgpDebugMsg( "VerifyPGPDiskFileMainHeader: Unknown algorithm" );
a6da4e ¤   ¤   return( kPGPDiskUnknownAlgorithmError );
d09371 ¤   }
bcaf5a
08f28f ¤   if( fileHeader->numFileBlocks * kDiskBlockSize != fileSize )
94c7a1 ¤   {
c5b264 ¤   ¤   pgpDebugMsg( "VerifyPGPDiskFileMainHeader: Missing part of the file");
dc2395 ¤   ¤   return( eofErr );
f29371 ¤   }
a3af5a
3ed64b ¤   if( fileHeader->numHeaderBlocks > fileHeader->numFileBlocks )
72c7a1 ¤   {
57b5f5 ¤   ¤   pgpDebugMsg( "VerifyPGPDiskFileMainHeader: Too many header blocks" );
abe98c ¤   ¤   return( kPGPDiskInvalidFileHeaderError );
3b9371 ¤   }
9baf5a
530bf6 ¤   if( fileHeader->numDataBlocks > fileHeader->numFileBlocks )
3cc7a1 ¤   {
59d9e1 ¤   ¤   pgpDebugMsg( "VerifyPGPDiskFileMainHeader: Too many data blocks" );
d4e98c ¤   ¤   return( kPGPDiskInvalidFileHeaderError );
d89371 ¤   }
b4af5a
d3ce3a ¤   if( fileHeader->numHeaderBlocks + fileHeader->numDataBlocks >
3c02cc ¤   ¤   ¤   ¤   fileHeader->numFileBlocks )
3ec7a1 ¤   {
d0b2bc ¤   ¤   pgpDebugMsg( "VerifyPGPDiskFileMainHeader: Too many blocks" );
37e98c ¤   ¤   return( kPGPDiskInvalidFileHeaderError );
9f9371 ¤   }
d587c7 ¤   ¤   ¤
2b79ad ¤   return( noErr );
2cefe6 }
c9af5a
a02473 ¤   static OSStatus
d29f5a VerifyPGPDiskFileHeader(
0bb355 ¤   const PGPDiskFileHeaderInfo *fileHeader,
cad003 ¤   UInt32¤ ¤   ¤   ¤   ¤   ¤   fileSize)
d4bb36 {
066792 ¤   OSStatus¤   err = noErr;
b467c5 ¤
a69e4c ¤   pgpAssertAddrValid( fileHeader, PGPDiskFileHeaderInfo );
22a706 ¤   pgpAssert( ( fileSize % kDiskBlockSize ) == 0 );
8671ad ¤   pgpAssert( fileSize > 64 * 1024L );
--a748 000e1bbfc6e40120020 Page 4 of PGPDiskFile.c
e0af5a
363456 ¤   if( fileHeader->headerMagic != kPGPDiskHeaderMagic )
0bc7a1 ¤   {
8850b7 ¤   ¤   pgpDebugMsg( "VerifyPGPDiskFileHeader: Invalid header magic" );
1ee98c ¤   ¤   return( kPGPDiskInvalidFileHeaderError );
389371 ¤   }
97af5a
87bdca ¤   if( fileHeader->headerCRC != ComputePGPDiskFileHeaderCRC( fileHeader ) )
76c7a1 ¤   {
da51e8 ¤   ¤   pgpDebugMsg( "VerifyPGPDiskFileHeader: Bad header CRC" );
05e98c ¤   ¤   return( kPGPDiskInvalidFileHeaderError );
7a9371 ¤   }
36af5a
99474e ¤   switch( fileHeader->headerType )
a2c7a1 ¤   {
0d8295 ¤   ¤   case kPGPDiskPrimaryHeaderType:
e45b34 ¤   ¤   {
94e05a ¤   ¤   ¤   err = VerifyPGPDiskFileMainHeader(
92f575 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPDiskFileHeader *) fileHeader, fileSize );
46cdcb ¤   ¤   ¤   break;
ee0fe4 ¤   ¤   }
591b52 ¤   ¤
e49ae3 ¤   ¤   default:
b5cdcb ¤   ¤   ¤   break;
239371 ¤   }
3367c5 ¤
09deb7 ¤   return( err );
94efe6 }
c3af5a
752473 ¤   static OSStatus
dcb06d ReadFileHeaderItemAtOffset(
608a5c ¤   short¤  ¤   ¤   ¤   ¤   fileRef,
466525 ¤   UInt32¤ ¤   ¤   ¤   ¤   offset,
c89200 ¤   UInt32¤ ¤   ¤   ¤   ¤   fileSize,
d30961 ¤   PGPDiskHeaderListItem¤  **headerItem)
f1bb36 {
b5dc42 ¤   OSStatus¤   err;
c167c5 ¤
257ac3 ¤   *headerItem = (PGPDiskHeaderListItem *) pgpAllocMac(
a8908c ¤   ¤   ¤   ¤   ¤   ¤   sizeof( **headerItem ), kMemAllocationFlags );
e31b50 ¤   if( IsntNull( *headerItem ) )
28c7a1 ¤   {
a6e644 ¤   ¤   (*headerItem)->next ¤   = NULL;
b8629a ¤   ¤   (*headerItem)->header ¤ = NULL;
4f1b52 ¤   ¤
b7114d ¤   ¤   /* Read and verify main header. */
d358fa ¤   ¤   err = ReadPGPDiskFileHeaderAtOffset( fileRef, offset,
31e23d ¤   ¤   ¤   ¤   ¤   &(*headerItem)->header );
dbda5e ¤   ¤   if( IsntErr( err ) )
a35b34 ¤   ¤   {
c72511 ¤   ¤   ¤   err = VerifyPGPDiskFileHeader( (*headerItem)->header, fileSize );
8d17c7 ¤   ¤   ¤   if( IsErr( err ) )
eff776 ¤   ¤   ¤   {
c74711 ¤   ¤   ¤   ¤   pgpFreeMac( (*headerItem)->header );
d18bc1 ¤   ¤   ¤   ¤   (*headerItem)->header = NULL;
eca3a6 ¤   ¤   ¤   }
3f0fe4 ¤   ¤   }
1b1b52 ¤   ¤
d103ef ¤   ¤   if( IsErr( err ) )
f85b34 ¤   ¤   {
75fd36 ¤   ¤   ¤   pgpFreeMac( *headerItem );
a823fe ¤   ¤   ¤   *headerItem = NULL;
2b0fe4 ¤   ¤   }
e89371 ¤   }
4e0e24 ¤   else
dfc7a1 ¤   {
952a06 ¤   ¤   err = memFullErr;
519371 ¤   }
af67c5 ¤
b2deb7 ¤   return( err );
b5efe6 }
e1af5a
--c346 000bc4ef86840120020 Page 5 of PGPDiskFile.c
ac85ea ¤   OSStatus
e3c614 OpenPGPDiskFile(
7857a4 ¤   const FSSpec¤   *fileSpec,
8fa08f ¤   PGPDiskFileRef¤ *diskFileRefPtr)
2ebb36 {
c86b9d ¤   OSStatus¤   ¤   err = noErr;
a21827 ¤   PGPDiskFileRef¤ diskFileRef;
2867c5 ¤
819dd5 ¤   pgpAssertAddrValid( fileSpec, FSSpec );
bc0223 ¤   pgpAssertAddrValid( diskFileRefPtr, PGPDiskFileRef );
3b67c5 ¤
a7b305 ¤   diskFileRef = (PGPDiskFileRef) pgpAllocMac( sizeof( *diskFileRef ),
048870 ¤   ¤   ¤   ¤   ¤   ¤   kMemAllocationFlags );
cbf30d ¤   if( PGPDiskFileRefIsValid( diskFileRef ) )
61c7a1 ¤   {
ac6f79 ¤   ¤   short¤  fileRef;
8e1b52 ¤   ¤
0e1288 ¤   ¤   diskFileRef->magic¤ ¤   = kPGPDiskFileMagic;
95339d ¤   ¤   diskFileRef->fileSpec¤  = *fileSpec;
e91b52 ¤   ¤
580a95 ¤   ¤   err = FSpOpenDF( fileSpec, fsRdPerm, &fileRef );
eada5e ¤   ¤   if( IsntErr( err ) )
8f5b34 ¤   ¤   {
35df46 ¤   ¤   ¤   long¤   fileSize;
ef87c7 ¤   ¤   ¤
aef811 ¤   ¤   ¤   err = GetEOF( fileRef, &fileSize );
516108 ¤   ¤   ¤   if( IsntErr( err ) )
c5f776 ¤   ¤   ¤   {
18929d ¤   ¤   ¤   ¤   PGPDiskHeaderListItem¤  *mainHeaderItem;
682594 ¤   ¤   ¤   ¤   PGPDiskHeaderListItem¤  *curHeaderItem;
3afa9b ¤   ¤   ¤   ¤   PGPDiskFileHeader¤  ¤   *mainHeader;
e3754e ¤   ¤   ¤   ¤   UInt32¤ ¤   ¤   ¤   ¤   headerOffset;
0a2b85 ¤   ¤   ¤   ¤
a55867 ¤   ¤   ¤   ¤   /* Read and verify main header. */
3eaf5a
6512c7 ¤   ¤   ¤   ¤   err = ReadFileHeaderItemAtOffset( fileRef, 0, fileSize,
9d3067 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mainHeaderItem );
839bb8 ¤   ¤   ¤   ¤   if( IsErr( err ) )
3572c3 ¤   ¤   ¤   ¤   {
59d856 ¤   ¤   ¤   ¤   ¤   /* If an error occured, try for alternate main header */
eaaf5a
904ecd ¤   ¤   ¤   ¤   ¤   err = ReadFileHeaderItemAtOffset( fileRef, fileSize -
b02cef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskAlternateHeaderSize, fileSize,
13f9f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mainHeaderItem );
3c2613 ¤   ¤   ¤   ¤   }
ce2b85 ¤   ¤   ¤   ¤
325c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
cf72c3 ¤   ¤   ¤   ¤   {
0d82d6 ¤   ¤   ¤   ¤   ¤   mainHeader = (PGPDiskFileHeader *) mainHeaderItem->header;
6bae30 ¤   ¤   ¤   ¤   ¤
72d354 ¤   ¤   ¤   ¤   ¤   diskFileRef->mainHeader¤= mainHeader;
b35c0a ¤   ¤   ¤   ¤   ¤   diskFileRef->headerList¤= mainHeaderItem;
2faf5a
a1844b ¤   ¤   ¤   ¤   ¤   // Fix up passphrase count value. Version 2.0 of the file
72b1a6 ¤   ¤   ¤   ¤   ¤   // format did not have a valid value for this field.
d9ae30 ¤   ¤   ¤   ¤   ¤
200eb0 ¤   ¤   ¤   ¤   ¤   if( mainHeader->numPassphrases == 0 )
c84859 ¤   ¤   ¤   ¤   ¤   {
7d459e ¤   ¤   ¤   ¤   ¤   ¤   mainHeader->numPassphrases = kNumPassphrases;
a21c89 ¤   ¤   ¤   ¤   ¤   }
b42613 ¤   ¤   ¤   ¤   }
f22b85 ¤   ¤   ¤   ¤
0d7fe5 ¤   ¤   ¤   ¤   curHeaderItem = diskFileRef->headerList;
012b85 ¤   ¤   ¤   ¤
4648b3 ¤   ¤   ¤   ¤   headerOffset = mainHeader->headerInfo.nextHeaderOffset.lo;
8f8d37 ¤   ¤   ¤   ¤   while( headerOffset != 0 && IsntErr( err ) )
df72c3 ¤   ¤   ¤   ¤   {
c35df7 ¤   ¤   ¤   ¤   ¤   PGPDiskHeaderListItem¤  *headerItem;
4dae30 ¤   ¤   ¤   ¤   ¤
88dd68 ¤   ¤   ¤   ¤   ¤   err = ReadFileHeaderItemAtOffset( fileRef, headerOffset,
3bafc9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileSize, &headerItem );
bc598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
--9aba 00063437dea40120020 Page 6 of PGPDiskFile.c
e04859 ¤   ¤   ¤   ¤   ¤   {
41a8e3 ¤   ¤   ¤   ¤   ¤   ¤   // Link item at end of header list.
4e7f1a ¤   ¤   ¤   ¤   ¤   ¤   // List has one guaranteed item
fcae30 ¤   ¤   ¤   ¤   ¤
183754 ¤   ¤   ¤   ¤   ¤   ¤   headerItem->next¤   ¤   = NULL;
e583f1 ¤   ¤   ¤   ¤   ¤   ¤   curHeaderItem->next¤¤   = headerItem;
29cca6 ¤   ¤   ¤   ¤   ¤   ¤   curHeaderItem¤  ¤   ¤   = headerItem;
caaf5a
1b79cc ¤   ¤   ¤   ¤   ¤   ¤   headerOffset =
d0cea7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   headerItem->header->nextHeaderOffset.lo;
ca8360 ¤   ¤   ¤   ¤   ¤   }¤
952613 ¤   ¤   ¤   ¤   }
1da3a6 ¤   ¤   ¤   }
3e87c7 ¤   ¤   ¤
83d142 ¤   ¤   ¤   (void) FSClose( fileRef );
490fe4 ¤   ¤   }
3baf5a
1603ef ¤   ¤   if( IsErr( err ) )
d65b34 ¤   ¤   {
d5ac33 ¤   ¤   ¤   ClosePGPDiskFile( diskFileRef );
3758ff ¤   ¤   ¤   diskFileRef = kInvalidPGPDiskFileRef;
240fe4 ¤   ¤   }
f39371 ¤   }
840e24 ¤   else
4dc7a1 ¤   {
b62a06 ¤   ¤   err = memFullErr;
d19371 ¤   }
f71b52 ¤   ¤
347317 ¤   *diskFileRefPtr = diskFileRef;
c967c5 ¤
9ddeb7 ¤   return( err );
efefe6 }
8daf5a
c92473 ¤   static OSStatus
f2bddd VerifyPGPDiskFileRef(PGPDiskFileRef diskFileRef)
b5bb36 {
92e6f5 ¤   pgpAssertAddrValid( diskFileRef, PGPDiskFile );
9aaf5a
7fb418 ¤   if( PGPDiskFileRefIsValid( diskFileRef ) &&
ce836a ¤   ¤   diskFileRef->magic == kPGPDiskFileMagic )
dac7a1 ¤   {
d6c87c ¤   ¤   return( noErr );
cf9371 ¤   }
2667c5 ¤
6d67b7 ¤   return( paramErr );
a8efe6 }
d7af5a
9e6d52 ¤   void
3866cf ClosePGPDiskFile(PGPDiskFileRef diskFileRef)
7abb36 {
95ad6f ¤   if( IsntErr( VerifyPGPDiskFileRef( diskFileRef ) ) )
94c7a1 ¤   {
f7c6dd ¤   ¤   PGPDiskHeaderListItem¤  *curHeader;
76af5a
69050f ¤   ¤   pgpAssert( diskFileRef->keyCount == 0 );
b91b52 ¤   ¤
86e53e ¤   ¤   curHeader = diskFileRef->headerList;
53fd61 ¤   ¤   while( IsntNull( curHeader ) )
075b34 ¤   ¤   {
b4af0c ¤   ¤   ¤   PGPDiskHeaderListItem¤  *nextHeader;
1487c7 ¤   ¤   ¤
679d58 ¤   ¤   ¤   nextHeader = curHeader->next;
f087c7 ¤   ¤   ¤
bbb5fa ¤   ¤   ¤   if( IsntNull( curHeader->header ) )
1d8a8a ¤   ¤   ¤   ¤   pgpFreeMac( curHeader->header );
f887c7 ¤   ¤   ¤
f984d2 ¤   ¤   ¤   pgpFreeMac( curHeader );
c387c7 ¤   ¤   ¤
fe6afa ¤   ¤   ¤   curHeader = nextHeader;
000fe4 ¤   ¤   }
e21b52 ¤   ¤
6308aa ¤   #if PGPDISK_PUBLIC_KEY
--27ac 000ac597e7140120020 Page 7 of PGPDiskFile.c
a9a4a4 ¤   ¤   if( PGPKeySetRefIsValid( diskFileRef->keySet ) )
8b5b34 ¤   ¤   {
8a5a11 ¤   ¤   ¤   PGPFreeKeySet( diskFileRef->keySet );
9902cb ¤   ¤   ¤   diskFileRef->keySet = kInvalidPGPKeySetRef;
ad0fe4 ¤   ¤   }
2d1b52 ¤   ¤
cd0021 ¤   ¤   if( PGPContextRefIsValid( diskFileRef->context ) )
1a5b34 ¤   ¤   {
6b1835 ¤   ¤   ¤   PGPFreeContext( diskFileRef->context );
9d430e ¤   ¤   ¤   diskFileRef->context = kInvalidPGPContextRef;
a30fe4 ¤   ¤   }
31b7ec ¤   #endif
8287c7 ¤   ¤   ¤
fdba07 ¤   ¤   pgpFreeMac( diskFileRef );
789371 ¤   }
69af5a
99efe6 }
24af5a
f82473 ¤   static OSStatus
09acd2 WritePGPDiskFileHeaderAtOffset(
bd6a1c ¤   short ¤ ¤   ¤   ¤   ¤   ¤   fileRef,
fd1d57 ¤   UInt32¤ ¤   ¤   ¤   ¤   ¤   offset,
90eca8 ¤   const PGPDiskFileHeaderInfo¤*header)
c1bb36 {
b7dc42 ¤   OSStatus¤   err;
3167c5 ¤
f33a31 ¤   AssertFileRefNumIsValid( fileRef, "ReadPGPDiskFileHeaderAtOffset" );
8595c8 ¤   pgpAssertAddrValid( header, PGPDiskFileHeaderInfo );
ceaf5a
068b5a ¤   err = FSWriteFileUsingDriver( fileRef, offset, header->headerSize,
ace15f ¤   ¤   ¤   ¤   header, NULL );
3167c5 ¤
1fdeb7 ¤   return( err );
61efe6 }
b9af5a
142473 ¤   static OSStatus
e28300 CopyHeader(
dc9210 ¤   const PGPDiskFileHeaderInfo¤*header,
137a8e ¤   PGPDiskFileHeaderInfo¤  ¤   **headerCopy)
27bb36 {
6b6792 ¤   OSStatus¤   err = noErr;
2967c5 ¤
ff4042 ¤   *headerCopy = (PGPDiskFileHeaderInfo *) pgpAllocMac( header->headerSize,
3f50c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMemAllocationFlags );
231402 ¤   if( IsntNull( *headerCopy ) )
f8c7a1 ¤   {
bdeb9f ¤   ¤   pgpCopyMemory( header, *headerCopy, header->headerSize );
d31b52 ¤   ¤
11779a ¤   ¤   (*headerCopy)->nextHeaderOffset.hi¤ = 0;
4355ce ¤   ¤   (*headerCopy)->nextHeaderOffset.lo¤ = 0;
e49371 ¤   }
030e24 ¤   else
23c7a1 ¤   {
dd2a06 ¤   ¤   err = memFullErr;
5a9371 ¤   }
80af5a
aadeb7 ¤   return( err );
44efe6 }
a5af5a
4133c8 ¤   static void
5684f6 UpdateHeaderList(PGPDiskFileRef diskFileRef)
15bb36 {
2cfe29 ¤   PGPDiskHeaderListItem¤  *curHeaderItem;
25fda5 ¤   PGPDiskFileHeader¤  ¤   *mainHeader;
eebbd6 ¤   UInt32¤ ¤   ¤   ¤   ¤   curOffset;
184f74 ¤   UInt32¤ ¤   ¤   ¤   ¤   remainingBytes;
040ef4 ¤   UInt32¤ ¤   ¤   ¤   ¤   minFileSize;
f397e7 ¤   UInt32¤ ¤   ¤   ¤   ¤   newFileSize;
c667c5 ¤
5d41e3 ¤   curOffset¤  ¤   = 0;
2e48c1 ¤   mainHeader ¤¤   = diskFileRef->mainHeader;
acb635 ¤   remainingBytes¤ = mainHeader->numHeaderBlocks * kDiskBlockSize;
--c6dd 00065f00e3e40120020 Page 8 of PGPDiskFile.c
e587c7 ¤   ¤   ¤
cc678e ¤   // Compute offsets in file for each header
5d09a6 ¤   // For each header, fill in the actual header's offset in
d51c7a ¤   // the next header offset field first.
9467c5 ¤
f91150 ¤   curHeaderItem = diskFileRef->headerList;
b978fa ¤   while( IsntNull( curHeaderItem ) )
cbc7a1 ¤   {
956ff7 ¤   ¤   PGPDiskFileHeaderInfo¤  *curHeader = curHeaderItem->header;
ba1b52 ¤   ¤
3168c5 ¤   ¤   pgpAssert( IsntNull( curHeader ) );
cbaf5a
d824e5 ¤   ¤   if( remainingBytes > 0 )
185b34 ¤   ¤   {
0706d2 ¤   ¤   ¤   if( curHeader->headerSize < remainingBytes )
30f776 ¤   ¤   ¤   {
b7b429 ¤   ¤   ¤   ¤   // OK to put at current offset
d6e87a ¤   ¤   ¤   ¤   // Decrement remaining bytes
342b85 ¤   ¤   ¤   ¤
f4d45d ¤   ¤   ¤   ¤   remainingBytes -= curHeader->headerSize;
afa3a6 ¤   ¤   ¤   }
c5bb8c ¤   ¤   ¤   else
07f776 ¤   ¤   ¤   {
c5a9e8 ¤   ¤   ¤   ¤   // Exhausted bytes at the beginning of the file.
820492 ¤   ¤   ¤   ¤   // Moving offset to first byte after data blocks.
422b85 ¤   ¤   ¤   ¤
f5731a ¤   ¤   ¤   ¤   remainingBytes¤ = 0;
1d73fa ¤   ¤   ¤   ¤   curOffset¤  ¤   = ( mainHeader->numHeaderBlocks +
0df564 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mainHeader->numDataBlocks ) *
d5be06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDiskBlockSize;
dfa3a6 ¤   ¤   ¤   }
ea0fe4 ¤   ¤   }
740e1d ¤   ¤   else
a75b34 ¤   ¤   {
effd4f ¤   ¤   ¤   // Already after data blocks. OK to place header.
b90fe4 ¤   ¤   }
8c2b85 ¤   ¤   ¤   ¤
c64d50 ¤   ¤   curHeader->nextHeaderOffset.hi = 0;
85121d ¤   ¤   curHeader->nextHeaderOffset.lo = curOffset;
0aaf5a
864b4a ¤   ¤   curOffset += curHeader->headerSize;
8c1b52 ¤   ¤
e851a8 ¤   ¤   curHeaderItem = curHeaderItem->next;
dd9371 ¤   }
5467c5 ¤
441150 ¤   curHeaderItem = diskFileRef->headerList;
77d923 ¤   while( IsntNull( curHeaderItem->next ) )
1dc7a1 ¤   {
9b51a8 ¤   ¤   curHeaderItem = curHeaderItem->next;
8a9371 ¤   }
9067c5 ¤
a28ca2 ¤   minFileSize = ( mainHeader->numHeaderBlocks + mainHeader->numDataBlocks ) *
02eddd ¤   ¤   ¤   ¤   ¤   ¤   kDiskBlockSize;
ca8385 ¤   newFileSize = curHeaderItem->header->nextHeaderOffset.lo +
309471 ¤   ¤   ¤   ¤   ¤   ¤   curHeaderItem->header->headerSize;
cc67c5 ¤
b48153 ¤   if( newFileSize < minFileSize )
489c98 ¤   ¤   newFileSize = minFileSize;
551b52 ¤   ¤
3be91c ¤   mainHeader->numFileBlocks = ( ( newFileSize + kDiskBlockSize - 1 ) /
5e446f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDiskBlockSize ) +
0bffa9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskAlternateHeaderBlocks;
5daf5a
e1b056 ¤   // Store real values for next header offset in heach header and
9929cc ¤   // recompute the CRC's for each header.
e367c5 ¤
181150 ¤   curHeaderItem = diskFileRef->headerList;
5b78fa ¤   while( IsntNull( curHeaderItem ) )
72c7a1 ¤   {
da42ab ¤   ¤   UInt32¤ nextOffset;
a41b52 ¤   ¤
65b655 ¤   ¤   if( IsntNull( curHeaderItem->next ) )
--72ed 00025496e4340120020 Page 9 of PGPDiskFile.c
e35b34 ¤   ¤   {
415f00 ¤   ¤   ¤   nextOffset = curHeaderItem->next->header->nextHeaderOffset.lo;
bd0fe4 ¤   ¤   }
bb0e1d ¤   ¤   else
685b34 ¤   ¤   {
1a9274 ¤   ¤   ¤   nextOffset = 0;
d50fe4 ¤   ¤   }
7c87c7 ¤   ¤   ¤
7e80df ¤   ¤   curHeaderItem->header->nextHeaderOffset.lo = nextOffset;
10c440 ¤   ¤   curHeaderItem->header->headerCRC =
4fc915 ¤   ¤   ¤   ¤   ¤   ComputePGPDiskFileHeaderCRC( curHeaderItem->header );
dd1b52 ¤   ¤
a351a8 ¤   ¤   curHeaderItem = curHeaderItem->next;
669371 ¤   }
c6efe6 }
9faf5a
5fd140 ¤   static OSErr
66e8d5 FSWipeBytesUsingDriver(
fc0631 ¤   short¤  fileRef,
1d8228 ¤   UInt32¤ startOffset,
4a3926 ¤   UInt32¤ numBytes,
c150c3 ¤   uchar¤  wipeChar )
fcbb36 {
fe75f8 ¤   OSStatus¤   err¤= noErr;
f767c5 ¤
5a4287 ¤   err¤= SetFPos( fileRef, fsFromStart, startOffset );
c95ecc ¤   if ( IsntErr( err ) )
55c7a1 ¤   {
bccad7 ¤   ¤   void *¤ ¤   buffer¤ = nil;
b72fde ¤   ¤   UInt32¤ ¤   bufferSize;
cd04ec ¤   ¤   uchar¤  ¤   emergencyBuffer[ 512 ];
c4c921 ¤   ¤   Boolean¤¤   disposeBuffer¤  = false;
c42491 ¤   ¤   UInt32¤ ¤   remaining;
da331d ¤   ¤   UInt32¤ ¤   writeOffset;
3e1b52 ¤   ¤
81e027 ¤   ¤   buffer = pgpNewPtrMost( numBytes, MIN( 512, numBytes ),
63519c ¤   ¤   ¤   ¤   ¤   ¤   kMemAllocationFlags, &bufferSize );
4d709c ¤   ¤   if ( IsntNull( buffer ) )
0d5b34 ¤   ¤   {
55ef61 ¤   ¤   ¤   disposeBuffer¤  = TRUE;
ce0fe4 ¤   ¤   }
7e0e1d ¤   ¤   else
3a5b34 ¤   ¤   {
8537db ¤   ¤   ¤   buffer¤ ¤   = &emergencyBuffer[ 0 ];
d50470 ¤   ¤   ¤   bufferSize¤ = sizeof( emergencyBuffer );
290fe4 ¤   ¤   }
251b52 ¤   ¤
761b52 ¤   ¤
de65b9 ¤   ¤   pgpFillMemory( buffer, bufferSize, wipeChar );
4f1b52 ¤   ¤
f24e33 ¤   ¤   writeOffset¤= startOffset;
652385 ¤   ¤   remaining¤  = numBytes;
a1ba61 ¤   ¤   while( remaining != 0 )
785b34 ¤   ¤   {
449a83 ¤   ¤   ¤   long¤   count;
9b87c7 ¤   ¤   ¤
edc291 ¤   ¤   ¤   count¤  = MIN( remaining, bufferSize );
2d48a7 ¤   ¤   ¤   err¤= FSWriteFileUsingDriver( fileRef, writeOffset, count,
8740da ¤   ¤   ¤   ¤   ¤   ¤   buffer, nil );
7b21aa ¤   ¤   ¤   if ( IsErr( err ) )
08f622 ¤   ¤   ¤   ¤   break;
842b85 ¤   ¤   ¤   ¤
7ae906 ¤   ¤   ¤   remaining¤  -= count;
f0986d ¤   ¤   ¤   writeOffset¤+= count;
050fe4 ¤   ¤   }
411b52 ¤   ¤
9e97af ¤   ¤   if ( disposeBuffer )
b25b34 ¤   ¤   {
06f40a ¤   ¤   ¤   pgpFreeMac( buffer );
6b0fe4 ¤   ¤   }
659371 ¤   }
2567c5 ¤
--1b84 00029efa5da40120020 Page 10 of PGPDiskFile.c
afdeb7 ¤   return( err );
b7efe6 }
35af5a
3f85ea ¤   OSStatus
899aa9 SavePGPDiskFile(PGPDiskFileRef diskFileRef)
e3bb36 {
bc6792 ¤   OSStatus¤   err = noErr;
0b67c5 ¤
5c3654 ¤   err = VerifyPGPDiskFileRef( diskFileRef );
5cee03 ¤   if( IsntErr( err ) )
2ac7a1 ¤   {
606f79 ¤   ¤   short¤  fileRef;
a51b52 ¤   ¤
d22c8a ¤   ¤   UpdateHeaderList( diskFileRef );
cc1b52 ¤   ¤
f76e16 ¤   ¤   (void) FlushVol( nil, diskFileRef->fileSpec.vRefNum );
31af5a
94d064 ¤   ¤   err = FSpOpenDF( &diskFileRef->fileSpec, fsRdWrPerm, &fileRef );
25da5e ¤   ¤   if( IsntErr( err ) )
545b34 ¤   ¤   {
2d72f0 ¤   ¤   ¤   long¤   ¤   ¤   ¤   ¤   fileSize;
f1c4c1 ¤   ¤   ¤   const PGPDiskFileHeader¤*mainHeader;
6887c7 ¤   ¤   ¤
33c16c ¤   ¤   ¤   mainHeader ¤= diskFileRef->mainHeader;
a26a56 ¤   ¤   ¤   fileSize ¤  = mainHeader->numFileBlocks * kDiskBlockSize;
6687c7 ¤   ¤   ¤
65293d ¤   ¤   ¤   err = SetEOF( fileRef, fileSize );
526108 ¤   ¤   ¤   if( IsntErr( err ) )
57f776 ¤   ¤   ¤   {
142594 ¤   ¤   ¤   ¤   PGPDiskHeaderListItem¤  *curHeaderItem;
2a754e ¤   ¤   ¤   ¤   UInt32¤ ¤   ¤   ¤   ¤   headerOffset;
fb2b85 ¤   ¤   ¤   ¤
cc6133 ¤   ¤   ¤   ¤   // wipe header blocks and trailer block so people don't
5dcf30 ¤   ¤   ¤   ¤   // think there is a security issue
c12b85 ¤   ¤   ¤   ¤
992997 ¤   ¤   ¤   ¤   err¤= FSWipeBytesUsingDriver( fileRef, 0UL,
e9f2c9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mainHeader->numHeaderBlocks *
ed5a88 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDiskBlockSize, 0 );
980fe3 ¤   ¤   ¤   ¤   if ( IsntErr( err ) )
f172c3 ¤   ¤   ¤   ¤   {
1ba6fc ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  trailingBytes;
59ae30 ¤   ¤   ¤   ¤   ¤
79ae57 ¤   ¤   ¤   ¤   ¤   trailingBytes = ( mainHeader->numFileBlocks -·
6116fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mainHeader->numHeaderBlocks -
ecf6f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mainHeader->numDataBlocks ) *
a8f54d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDiskBlockSize;
ad071b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
7eaf4d ¤   ¤   ¤   ¤   ¤   err¤= FSWipeBytesUsingDriver( fileRef, fileSize -
989357 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   trailingBytes, trailingBytes, 0 );
ba2613 ¤   ¤   ¤   ¤   }
04af5a
e6737b ¤   ¤   ¤   ¤   headerOffset = 0;
832b85 ¤   ¤   ¤   ¤
437fe5 ¤   ¤   ¤   ¤   curHeaderItem = diskFileRef->headerList;
e831d4 ¤   ¤   ¤   ¤   while( IsntNull( curHeaderItem ) &&
e1d35a ¤   ¤   ¤   ¤   ¤   ¤   IsntErr( err ) )
8e72c3 ¤   ¤   ¤   ¤   {
766fd9 ¤   ¤   ¤   ¤   ¤   PGPDiskFileHeaderInfo¤  *curHeader = curHeaderItem->header;
eb2b85 ¤   ¤   ¤   ¤
39cb74 ¤   ¤   ¤   ¤   ¤   err = VerifyPGPDiskFileHeader( curHeader, fileSize );
f4598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
cc4859 ¤   ¤   ¤   ¤   ¤   {
c3184d ¤   ¤   ¤   ¤   ¤   ¤   err = WritePGPDiskFileHeaderAtOffset( fileRef,
8cc7d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   headerOffset, curHeader );
d21c89 ¤   ¤   ¤   ¤   ¤   }
ceae30 ¤   ¤   ¤   ¤   ¤
421029 ¤   ¤   ¤   ¤   ¤   headerOffset = curHeader->nextHeaderOffset.lo;
cdae30 ¤   ¤   ¤   ¤   ¤
e83f1d ¤   ¤   ¤   ¤   ¤   curHeaderItem = curHeaderItem->next;
052613 ¤   ¤   ¤   ¤   }
fc87c7 ¤   ¤   ¤
29c9cb ¤   ¤   ¤   ¤   // Always write the alternate header.
--cb16 0004baab08140120020 Page 11 of PGPDiskFile.c
9f2b85 ¤   ¤   ¤   ¤
d79a62 ¤   ¤   ¤   ¤   (void) WritePGPDiskFileHeaderAtOffset( fileRef,
9f158a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileSize - kPGPDiskAlternateHeaderSize,
70172f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mainHeader->headerInfo );
e4a3a6 ¤   ¤   ¤   }
c687c7 ¤   ¤   ¤
c3d142 ¤   ¤   ¤   (void) FSClose( fileRef );
84e3ea ¤   ¤   ¤   (void) FlushVol( nil, diskFileRef->fileSpec.vRefNum );
5a0fe4 ¤   ¤   }
8b9371 ¤   }
6b67c5 ¤
31deb7 ¤   return( err );
b0efe6 }
d9af5a
f19280 ¤   static UInt32
7eea4c CalcNumDataBlocks(
55d772 ¤   short¤  vRefNum,
a14395 ¤   UInt32¤ inDiskSizeInK
6e27e6 ¤   )
ecbb36 {
3864db ¤   const UInt32¤   kOverheadBlocks = kPGPDiskReservedHeaderBlocks +
2fffa9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskAlternateHeaderBlocks;
7467c5 ¤
97100e ¤   UInt32¤ ¤   ¤   diskSizeInBlocks;
9ad5fc ¤   UInt32¤ ¤   ¤   allocBlockSize;
7e68fb ¤   UInt32¤ ¤   ¤   blocksPerAllocBlock;
1ecbf8 ¤   UInt32¤ ¤   ¤   freeBlocks;
0867c5 ¤
8d812f ¤   diskSizeInBlocks¤   = ( inDiskSizeInK * 1024UL ) / kDiskBlockSize;
abf33e ¤   allocBlockSize¤ ¤   = GetVolumeAllocBlockSize( vRefNum );
594921 ¤   blocksPerAllocBlock¤= allocBlockSize / kDiskBlockSize;
9c711d ¤   freeBlocks¤ ¤   ¤   = GetVolumeFreeAllocBlocks( vRefNum ) *
f433ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   blocksPerAllocBlock;
da67c5 ¤
ef46d1 ¤   if ( diskSizeInBlocks + kOverheadBlocks > freeBlocks )
85c7a1 ¤   {
0f5a64 ¤   ¤   diskSizeInBlocks¤   = freeBlocks - kOverheadBlocks;
c19371 ¤   }
0b67c5 ¤
5fbcd6 ¤   return( diskSizeInBlocks );
4befe6 }
5daf5a
522473 ¤   static OSStatus
75cf05 DecryptPassphraseKey(
0b789d ¤   const PassphraseKey¤¤   *passKey,
c041bc ¤   const PassphraseSalt ¤  *salt,
29691e ¤   ConstStr255Param¤   ¤   passphrase,
f589fa ¤   CASTKey¤¤   ¤   ¤   ¤   *decryptedKey)
2dbb36 {
4ea1bf ¤   EncryptedCASTKey¤   tempKey;
168fd4 ¤   ExpandedCASTKey¤¤   expandedKey;
13a5b1 ¤   Boolean¤¤   ¤   ¤   validPassphrase;
3ab03b ¤   CheckBytes¤ ¤   ¤   checkBytes;
343a7b ¤   CMemoryWiper¤   ¤   tempKeyWiper( &tempKey, sizeof( tempKey ) );
52d2d5 ¤   CMemoryWiper¤   ¤   expandedKeyWiper(&expandedKey, sizeof( expandedKey ));
a529ff ¤   CMemoryWiper¤   ¤   checkBytesWiper( &checkBytes, sizeof( checkBytes ) );
b99fd6 ¤   short¤  ¤   ¤   ¤   hashReps;
0b7cc7 ¤   OSStatus¤   ¤   ¤   err = noErr;
d667c5 ¤
f5080a ¤   // Hash the old passphrase and compute the salted version
f3fe8a ¤   HashBuf( &passphrase[1], passphrase[0], &tempKey );
ffaf5a
b9b55b ¤   hashReps = passKey->hashReps;
db5650 ¤   SaltPassphrase( &tempKey, &tempKey, salt, &hashReps );
a1af5a
df6698 ¤   // Expand the old key for decryption purposes.
e8a9b1 ¤   CAST5schedule( expandedKey.keyWords, tempKey.keyBytes );
e1af5a
fc2aa6 ¤   // Decrypt the encrypted key
828c9a ¤   *decryptedKey = passKey->encryptedKey;
b96b41 ¤   CAST5decrypt( &decryptedKey->keyBytes[0], &decryptedKey->keyBytes[0],
4b37fd ¤   ¤   ¤   expandedKey.keyWords );
--c974 000511cf00a40120020 Page 12 of PGPDiskFile.c
e52dba ¤   CAST5decrypt( &decryptedKey->keyBytes[8], &decryptedKey->keyBytes[8],
5537fd ¤   ¤   ¤   expandedKey.keyWords );
42af5a
ccfd20 ¤   // Get the ckeck bytes
96f963 ¤   checkBytes = passKey->checkBytes;
6967c5 ¤
0b0410 ¤   // Decrypt the check bytes using the expanded key
481870 ¤   CAST5decrypt( checkBytes.theBytes, checkBytes.theBytes,
5b37fd ¤   ¤   ¤   expandedKey.keyWords );
c767c5 ¤
3cfdd2 ¤   validPassphrase = pgpMemoryEqual( &checkBytes.theBytes[ 0 ],
1141b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &tempKey.keyBytes[ 0 ], sizeof( checkBytes ) );
694d11 ¤   if( ! validPassphrase )
05c7a1 ¤   {
32a2ff ¤   ¤   err = kPGPDiskIncorrectPassphraseError;
829371 ¤   }
da67c5 ¤
1ddeb7 ¤   return( err );
3defe6 }
1faf5a
c833c8 ¤   static void
1a8c9d EncryptPassphraseKey(
88f742 ¤   CASTKey¤¤   ¤   ¤   ¤   *decryptedKey,
8d41bc ¤   const PassphraseSalt ¤  *salt,
5d691e ¤   ConstStr255Param¤   ¤   passphrase,
f3019b ¤   PassphraseKey¤  ¤   ¤   *passKey)
1fbb36 {
65a1bf ¤   EncryptedCASTKey¤   tempKey;
158fd4 ¤   ExpandedCASTKey¤¤   expandedKey;
10cdce ¤   short¤  ¤   ¤   ¤   index;
1f3a7b ¤   CMemoryWiper¤   ¤   tempKeyWiper( &tempKey, sizeof( tempKey ) );
fbce0a ¤   CMemoryWiper¤   ¤   expandedKeyWiper( &expandedKey, sizeof(expandedKey ));
fe67c5 ¤
e7c201 ¤   // Compute the hashed, salted key for the passphrase¤
f5053b ¤   passKey->hashReps = 0;
32fe8a ¤   HashBuf( &passphrase[1], passphrase[0], &tempKey );
864cbc ¤   SaltPassphrase( &tempKey, &tempKey, salt, &passKey->hashReps );
84af5a
1e184c ¤   // Expand the key for encryption purposes
2ea9b1 ¤   CAST5schedule( expandedKey.keyWords, tempKey.keyBytes );
caaf5a
1d6063 ¤   // Encrypt the new salted passphrase
5cdfff ¤   passKey->encryptedKey = *decryptedKey;
14a070 ¤   CAST5encrypt( &passKey->encryptedKey.keyBytes[0],
b2ee74 ¤   ¤   ¤   &passKey->encryptedKey.keyBytes[0], expandedKey.keyWords );
b345a8 ¤   CAST5encrypt( &passKey->encryptedKey.keyBytes[8],
54aee2 ¤   ¤   ¤   &passKey->encryptedKey.keyBytes[8], expandedKey.keyWords );
d667c5 ¤
8f615f ¤   // Compute the checkbytes. The checkbytes are the encrypted hashed salted
35031e ¤   // user key.
e0b78c ¤   CAST5encrypt( &tempKey.keyBytes[0], &tempKey.keyBytes[0],
9237fd ¤   ¤   ¤   expandedKey.keyWords );
e867c5 ¤
eaafc4 ¤   for( index = 0; index < sizeof( passKey->checkBytes ); index++ )
cfc7a1 ¤   {
f2c21a ¤   ¤   passKey->checkBytes.theBytes[ index ] = tempKey.keyBytes[ index ];
399371 ¤   }
59efe6 }
4caf5a
ae33c8 ¤   static void
982868 InitPGPDiskFileHeader(
0894ce ¤   short¤  ¤   ¤   ¤   ¤   ¤   vRefNum,
e90e72 ¤   const UInt32¤   ¤   ¤   ¤   inDiskSizeInK,
873ab0 ¤   PGPDiskEncryptionAlgorithm¤ algorithm,
758a7b ¤   const uchar ¤   ¤   ¤   ¤   *passphrase,
b63e67 ¤   PGPDiskFileHeader¤  ¤   ¤   *fileHeader)
69bb36 {
e2c114 ¤   EncryptedCASTKey¤   key;
538fd4 ¤   ExpandedCASTKey¤¤   expandedKey;
97c47e ¤   ItemCount¤  ¤   ¤   index;
9f893a ¤   CMemoryWiper¤   ¤   keyWiper( &key, sizeof( key ) );
51660d ¤   CMemoryWiper¤   ¤   expandedKeyWiper( &expandedKey, sizeof(expandedKey) );
--2a54 00056e03aca40120020 Page 13 of PGPDiskFile.c
a915d8 ¤   PassphraseKey¤  ¤   *masterPassphrase;
8867c5 ¤
5ae9f1 ¤   pgpAssertAddrValid( fileHeader, PGPDiskFileHeader );
6067c5 ¤
988c66 ¤   pgpClearMemory( fileHeader, sizeof( *fileHeader ) );
bf67c5 ¤
83c424 ¤   fileHeader->headerInfo.headerMagic¤ = kPGPDiskHeaderMagic;
9aaa26 ¤   fileHeader->headerInfo.headerType¤  = kPGPDiskPrimaryHeaderType;
373963 ¤   fileHeader->headerInfo.headerSize¤  = sizeof( *fileHeader );
42af5a
78c6a8 ¤   fileHeader->majorVersion¤   ¤   = kPGPDiskPrimaryHeaderMajorVersion;
00dff0 ¤   fileHeader->minorVersion ¤  ¤   = kPGPDiskPrimaryHeaderMinorVersion;
d667c5 ¤
4775a3 ¤   fileHeader->algorithm ¤ ¤   ¤   = algorithm;
bf8aba ¤   fileHeader->numPassphrases¤ ¤   = kNumPassphrases;
a267c5 ¤
95ae41 ¤   fileHeader->numHeaderBlocks¤= kPGPDiskReservedHeaderBlocks;
81ba1e ¤   fileHeader->numDataBlocks¤  = CalcNumDataBlocks( vRefNum, inDiskSizeInK );
6278a3 ¤   fileHeader->numFileBlocks ¤ = kPGPDiskReservedHeaderBlocks +
ba1527 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileHeader->numDataBlocks +·
962f02 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskAlternateHeaderBlocks;
1eaf5a
c2de5d ¤   for( index = 0;index < sizeof( fileHeader->salt ); index++ )
a2c7a1 ¤   {
15a990 ¤   ¤   fileHeader->salt.saltBytes[index] = randPoolGetByte();
3c9371 ¤   }
5767c5 ¤
6fa063 ¤   masterPassphrase = &fileHeader->passphrases[kMasterPassphraseIndex];
9367c5 ¤
8a31a2 ¤   for( index = 0; index < sizeof(masterPassphrase->encryptedKey); index++)
72c7a1 ¤   {
e60df3 ¤   ¤   masterPassphrase->encryptedKey.keyBytes[index] = randPoolGetByte();
d79371 ¤   }
8caf5a
5a2978 ¤   // Hash and salt the passphrase¤
1069cb ¤   HashBuf( &passphrase[1], passphrase[0], &key );
a6fa5a ¤   SaltPassphrase( &key, &key, &fileHeader->salt,
e360e8 ¤   ¤   ¤   &masterPassphrase->hashReps );
77af5a
4edfc0 ¤   // Expand the key for encrpytion purposes
f6da77 ¤   CAST5schedule( expandedKey.keyWords, key.keyBytes );
4667c5 ¤
6d8769 ¤   // Encrypt the random key twice
98eca8 ¤   CAST5encrypt( &masterPassphrase->encryptedKey.keyBytes[0],
913e49 ¤   ¤   ¤   ¤   ¤   &masterPassphrase->encryptedKey.keyBytes[0],
ab7ace ¤   ¤   ¤   ¤   ¤   expandedKey.keyWords );
be0970 ¤   CAST5encrypt( &masterPassphrase->encryptedKey.keyBytes[8],
8edb91 ¤   ¤   ¤   ¤   ¤   &masterPassphrase->encryptedKey.keyBytes[8],
957ace ¤   ¤   ¤   ¤   ¤   expandedKey.keyWords );
4eaf5a
75eca8 ¤   CAST5encrypt( &masterPassphrase->encryptedKey.keyBytes[0],
d43e49 ¤   ¤   ¤   ¤   ¤   &masterPassphrase->encryptedKey.keyBytes[0],
1c7ace ¤   ¤   ¤   ¤   ¤   expandedKey.keyWords );
ca0970 ¤   CAST5encrypt( &masterPassphrase->encryptedKey.keyBytes[8],
95db91 ¤   ¤   ¤   ¤   ¤   &masterPassphrase->encryptedKey.keyBytes[8],
b37ace ¤   ¤   ¤   ¤   ¤   expandedKey.keyWords );
3caf5a
5b3403 ¤   // Encrypt the key itself for checkbytes purposes
aa0d03 ¤   CAST5encrypt( key.keyBytes, key.keyBytes, expandedKey.keyWords);
4eaf5a
5ad4ee ¤   for( index = 0; index < sizeof( masterPassphrase->checkBytes ); index++ )
25c7a1 ¤   {
347646 ¤   ¤   masterPassphrase->checkBytes.theBytes[index] = key.keyBytes[index];
199371 ¤   }
9967c5 ¤
354adc ¤   masterPassphrase->inUse = TRUE;
6167c5 ¤
f40a36 ¤   fileHeader->headerInfo.headerCRC =
c07069 ¤   ¤   ¤   ¤   ComputePGPDiskFileHeaderCRC( &fileHeader->headerInfo );
35efe6 }
cfaf5a
5685ea ¤   OSStatus
--2b77 00028a8c20040120020 Page 14 of PGPDiskFile.c
c6d485 NewPGPDiskFile(
d8a4d5 ¤   const FSSpec¤   ¤   ¤   ¤   *fileSpec,
2f106f ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   diskSizeInK,
b73ab0 ¤   PGPDiskEncryptionAlgorithm¤ algorithm,
569072 ¤   ConstStr255Param¤   ¤   ¤   masterPassphrase)
06bb36 {
a9119a ¤   PGPDiskFileHeader¤  header;
5e8737 ¤   OSStatus¤   ¤   ¤   err;
5667c5 ¤
cec0e6 ¤   AssertSpecIsValid( fileSpec, nil );
1cbe24 ¤   pgpAssertAddrValid( masterPassphrase, uchar );
d4af5a
b865b3 ¤   InitPGPDiskFileHeader( fileSpec->vRefNum, diskSizeInK, algorithm,
6434fa ¤   ¤   ¤   masterPassphrase, &header );
35af5a
153ff1 ¤   (void) FSpDelete( fileSpec );
6d67c5 ¤
81873e ¤   err = FSpCreate( fileSpec, kPGPDiskFileCreator, kPGPDiskFileType,
625020 ¤   ¤   ¤   ¤   ¤   ¤   ¤   smSystemScript );
35ee03 ¤   if( IsntErr( err ) )
bac7a1 ¤   {
386f79 ¤   ¤   short¤  fileRef;
f81b52 ¤   ¤
f0655a ¤   ¤   // Create and initialize the data fork¤
b38d4a ¤   ¤   err = FSpOpenDF( fileSpec, fsRdWrPerm, &fileRef );
61da5e ¤   ¤   if( IsntErr( err ) )
d15b34 ¤   ¤   {
3ca930 ¤   ¤   ¤   UInt32¤ allocSize;
721aa6 ¤   ¤   ¤   UInt32¤ fileSize;
1287c7 ¤   ¤   ¤
3b5dba ¤   ¤   ¤   fileSize = header.numFileBlocks * kDiskBlockSize;
26af5a
88ee9c ¤   ¤   ¤   // Try for contiguous allocation on the file. If this fails,
ff8dce ¤   ¤   ¤   // SetEOF will allocate the file using whatever policy is
65004d ¤   ¤   ¤   // available
dfaf5a
47e21a ¤   ¤   ¤   allocSize = fileSize;¤  ¤
c33aa1 ¤   ¤   ¤   (void) AllocContig( fileRef, (long *) &allocSize );
9f87c7 ¤   ¤   ¤
d8293d ¤   ¤   ¤   err = SetEOF( fileRef, fileSize );
2e6108 ¤   ¤   ¤   if( IsntErr( err ) )
31f776 ¤   ¤   ¤   {
3e6133 ¤   ¤   ¤   ¤   // wipe header blocks and trailer block so people don't
c6cf30 ¤   ¤   ¤   ¤   // think there is a security issue
a72997 ¤   ¤   ¤   ¤   err¤= FSWipeBytesUsingDriver( fileRef, 0UL,
dbbdfb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskReservedHeaderBlocks *
fa5a88 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDiskBlockSize, 0 );
610fe3 ¤   ¤   ¤   ¤   if ( IsntErr( err ) )
da72c3 ¤   ¤   ¤   ¤   {
8f4d91 ¤   ¤   ¤   ¤   ¤   err¤= FSWipeBytesUsingDriver( fileRef,
340e83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileSize - kPGPDiskAlternateHeaderSize,
c211c1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskAlternateHeaderSize, 0 );
da2613 ¤   ¤   ¤   ¤   }
36a3a6 ¤   ¤   ¤   }
d487c7 ¤   ¤   ¤
2e6108 ¤   ¤   ¤   if( IsntErr( err ) )
30f776 ¤   ¤   ¤   {
6c5157 ¤   ¤   ¤   ¤   err = WritePGPDiskFileHeaderAtOffset( fileRef, 0,
b36024 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &header.headerInfo );
d45c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
6a72c3 ¤   ¤   ¤   ¤   {
740bc1 ¤   ¤   ¤   ¤   ¤   err = WritePGPDiskFileHeaderAtOffset( fileRef,
d4158a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileSize - kPGPDiskAlternateHeaderSize,
56ce25 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &header.headerInfo );
0e2613 ¤   ¤   ¤   ¤   }
d0a3a6 ¤   ¤   ¤   }
1587c7 ¤   ¤   ¤
d901e0 ¤   ¤   ¤   FSClose( fileRef );
a544c4 ¤   ¤   ¤   FlushVol( nil, fileSpec->vRefNum );
020fe4 ¤   ¤   }
709371 ¤   }
2867c5 ¤
--896c 000bfb8157540120020 Page 15 of PGPDiskFile.c
90e10e ¤   if( IsErr( err ) )
2ed082 ¤   ¤   (void) FSpDelete( fileSpec );
181b52 ¤   ¤
72deb7 ¤   return( err );
e91862 }¤
6eaf5a
532473 ¤   static OSStatus
ba87a6 VerifyPGPDiskKeyRef(PGPDiskKeyRef keyRef)
0ebb36 {
ee0b55 ¤   pgpAssertAddrValid( keyRef, PGPDiskKey );
12af5a
a503d4 ¤   if( PGPDiskKeyRefIsValid( keyRef ) &&
69afe0 ¤   ¤   keyRef->magic == kPGPDiskKeyMagic )
3dc7a1 ¤   {
eac87c ¤   ¤   return( noErr );
419371 ¤   }
a967c5 ¤
0267b7 ¤   return( paramErr );
b21862 }¤
ff67c5 ¤
be6d52 ¤   void
de6848 DisposePGPDiskKey(PGPDiskKeyRef keyRef)
20bb36 {
809b72 ¤   if( IsntErr( VerifyPGPDiskKeyRef( keyRef ) ) )
33c7a1 ¤   {
e654ff ¤   ¤   --keyRef->diskFile->keyCount;
fa1b52 ¤   ¤
db2085 ¤   ¤   pgpClearMemory( keyRef, sizeof( keyRef ) );
28b33e ¤   ¤   pgpFreeMac( keyRef );
0f9371 ¤   }
daefe6 }
95af5a
e32473 ¤   static OSStatus
ea9ba6 NewPassphrasePGPDiskKeyRef(
0cc0be ¤   PGPDiskFileRef¤ diskFileRef,
5226f7 ¤   PassphraseKey¤  *passphraseKey,
d11712 ¤   Boolean¤¤   ¤   isMasterKey,
f759cf ¤   PGPDiskKeyRef¤  *keyRefPtr)
a3bb36 {
0d6b9d ¤   OSStatus¤   ¤   err = noErr;
b26545 ¤   PGPDiskKeyRef¤  keyRef;
efaf5a
662473 ¤   keyRef = (PGPDiskKeyRef) pgpAllocMac( sizeof( *keyRef ),
eb19e8 ¤   ¤   ¤   ¤   ¤   kMemAllocationFlags );
35a49f ¤   if( PGPDiskKeyRefIsValid( keyRef ) )
8dc7a1 ¤   {
bc49b4 ¤   ¤   keyRef->magic¤  ¤   ¤   = kPGPDiskKeyMagic;
a4da7a ¤   ¤   keyRef->isPassphraseKey¤= TRUE;
ae8ede ¤   ¤   keyRef->isMasterKey¤¤   = isMasterKey;
126723 ¤   ¤   keyRef->diskFile¤   ¤   = diskFileRef;
ed8e8d ¤   ¤   keyRef->passKey¤¤   ¤   = passphraseKey;
551b52 ¤   ¤
d9040b ¤   ¤   ++diskFileRef->keyCount;
849371 ¤   }
ef0e24 ¤   else
8ac7a1 ¤   {
142a06 ¤   ¤   err = memFullErr;
a19371 ¤   }
2867c5 ¤
b7c121 ¤   *keyRefPtr = keyRef;
8667c5 ¤
e2deb7 ¤   return( err );
dbefe6 }
2aaf5a
d12473 ¤   static OSStatus
9e2605 VerifyPassphraseKey(
c577f4 ¤   const PassphraseKey *¤  userInfo,
803446 ¤   const PassphraseSalt *¤ salt,
aefa34 ¤   ConstStr255Param¤   ¤   passphrase )
bebb36 {
b5f959 ¤   OSStatus¤   ¤   ¤   status = noErr;
bfc114 ¤   EncryptedCASTKey¤   key;
--b5e4 0000a05c4eb40120020 Page 16 of PGPDiskFile.c
228fd4 ¤   ExpandedCASTKey¤¤   expandedKey;
d5b03b ¤   CheckBytes¤ ¤   ¤   checkBytes;
519fd6 ¤   short¤  ¤   ¤   ¤   hashReps;
bc893a ¤   CMemoryWiper¤   ¤   keyWiper( &key, sizeof( key ) );
69660d ¤   CMemoryWiper¤   ¤   expandedKeyWiper( &expandedKey, sizeof(expandedKey) );
d429ff ¤   CMemoryWiper¤   ¤   checkBytesWiper( &checkBytes, sizeof( checkBytes ) );
e067c5 ¤
ee168b ¤   pgpAssertAddrValid( userInfo, PassphraseKey );
3c8da6 ¤   pgpAssertAddrValid( passphrase, uchar );
f080a9 ¤   pgpAssertAddrValid( salt, PassphraseSalt );
5067c5 ¤
e9d583 ¤   pgpAssert( userInfo->inUse );
5467c5 ¤
3bc985 ¤   hashReps = userInfo->hashReps;
9567c5 ¤
6d76d6 ¤   // Hash and salt the passphrase
34898f ¤   HashBuf( &passphrase[1], StrLength( passphrase ), &key );
491ed2 ¤   SaltPassphrase( &key, &key, salt, &hashReps );
7e67c5 ¤
575e45 ¤   // Compute expanded key for decryption purposes.
97da77 ¤   CAST5schedule( expandedKey.keyWords, key.keyBytes );
8867c5 ¤
3cfd20 ¤   // Get the ckeck bytes
2a161b ¤   checkBytes = userInfo->checkBytes;
b867c5 ¤
4d0410 ¤   // Decrypt the check bytes using the expanded key
341870 ¤   CAST5decrypt( checkBytes.theBytes, checkBytes.theBytes,
4c37fd ¤   ¤   ¤   expandedKey.keyWords );
2567c5 ¤
eb94b6 ¤   // Compare the check bytes against the key for equality.
1d57f4 ¤   if ( ! pgpMemoryEqual( &checkBytes.theBytes[ 0 ], &key.keyBytes[ 0 ],
bb7219 ¤   ¤   ¤   ¤   sizeof( checkBytes ) ) ·)
74c7a1 ¤   {
c3abb1 ¤   ¤   status = kPGPDiskIncorrectPassphraseError;
089371 ¤   }
9eaf5a
d04afd ¤   return( status );
7cefe6 }
8eaf5a
3b85ea ¤   OSStatus
714440 FindPassphrasePGPDiskKey(
7d6e46 ¤   PGPDiskFileRef¤ ¤   diskFileRef,
97799e ¤   ConstStr255Param¤   passphrase,
bd117d ¤   PGPDiskKeyRef¤  ¤   *keyRefPtr)
16bb36 {
ae75c2 ¤   OSStatus¤   ¤   err ¤   = noErr;
10af4c ¤   PGPDiskKeyRef¤  keyRef¤ = kInvalidPGPDiskKeyRef;
d567c5 ¤
850bf8 ¤   pgpAssertAddrValid( keyRefPtr, PGPDiskKeyRef );
9067c5 ¤
733654 ¤   err = VerifyPGPDiskFileRef( diskFileRef );
dfee03 ¤   if( IsntErr( err ) )
dec7a1 ¤   {
82bd86 ¤   ¤   UInt32¤ keyIndex;
1a1b52 ¤   ¤
8cb187 ¤   ¤   for( keyIndex = 0; keyIndex < diskFileRef->mainHeader->numPassphrases;
e6362c ¤   ¤   ¤   ¤   ¤   ++keyIndex )
445b34 ¤   ¤   {
5b5cf6 ¤   ¤   ¤   PassphraseKey *¤userInfo;
b61b52 ¤   ¤
2e33b0 ¤   ¤   ¤   userInfo = &diskFileRef->mainHeader->passphrases[keyIndex];
bee6c6 ¤   ¤   ¤   if ( userInfo->inUse )
39f776 ¤   ¤   ¤   {
264343 ¤   ¤   ¤   ¤   if ( IsntErr( VerifyPassphraseKey( userInfo,
38bfd7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &diskFileRef->mainHeader->salt, passphrase ) ) )
6272c3 ¤   ¤   ¤   ¤   {
09f6dc ¤   ¤   ¤   ¤   ¤   err = NewPassphrasePGPDiskKeyRef( diskFileRef, userInfo,
5472c1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyIndex == kMasterPassphraseIndex, &keyRef );
7314c3 ¤   ¤   ¤   ¤   ¤   break;
d82613 ¤   ¤   ¤   ¤   }
9fa3a6 ¤   ¤   ¤   }
0a0fe4 ¤   ¤   }
--2c21 000b1ac5e0a40120020 Page 17 of PGPDiskFile.c
f11b52 ¤   ¤
b8dd0b ¤   ¤   if( IsntErr( err ) && ! PGPDiskKeyRefIsValid( keyRef ) )
415b34 ¤   ¤   {
0f34be ¤   ¤   ¤   err = kPGPDiskIncorrectPassphraseError;
c70fe4 ¤   ¤   }
c29371 ¤   }
c4af5a
42c121 ¤   *keyRefPtr = keyRef;
3767c5 ¤
56deb7 ¤   return( err );
a6efe6 }
50af5a
ca85ea ¤   OSStatus
3d8506 GetMasterPGPDiskKey(
a8c0be ¤   PGPDiskFileRef¤ diskFileRef,
e359cf ¤   PGPDiskKeyRef¤  *keyRefPtr)
c6bb36 {
6175c2 ¤   OSStatus¤   ¤   err ¤   = noErr;
ccaf4c ¤   PGPDiskKeyRef¤  keyRef¤ = kInvalidPGPDiskKeyRef;
a267c5 ¤
040bf8 ¤   pgpAssertAddrValid( keyRefPtr, PGPDiskKeyRef );
2167c5 ¤
a23654 ¤   err = VerifyPGPDiskFileRef( diskFileRef );
9eee03 ¤   if( IsntErr( err ) )
66c7a1 ¤   {
a1b385 ¤   ¤   PassphraseKey *¤userInfo;
aa67c5 ¤
334e17 ¤   ¤   userInfo =
ef894f ¤   ¤   ¤   &diskFileRef->mainHeader->passphrases[kMasterPassphraseIndex];
341b52 ¤   ¤
28db99 ¤   ¤   err = NewPassphrasePGPDiskKeyRef( diskFileRef, userInfo, TRUE,
ca5f3d ¤   ¤   ¤   ¤   ¤   &keyRef );
6e9371 ¤   }
daaf5a
77c121 ¤   *keyRefPtr = keyRef;
9e67c5 ¤
0d79ad ¤   return( noErr );
b4efe6 }
0eaf5a
9685ea ¤   OSStatus
9ccb3a VerifyPGPDiskKeyPassphrase(
edfc5e ¤   PGPDiskKeyRef¤  ¤   keyRef,
630726 ¤   ConstStr255Param¤   passphrase)
5ebb36 {
85dc42 ¤   OSStatus¤   err;
8267c5 ¤
768da6 ¤   pgpAssertAddrValid( passphrase, uchar );
9c67c5 ¤
6ff085 ¤   err = VerifyPGPDiskKeyRef( keyRef );
7eee03 ¤   if( IsntErr( err ) )
b8c7a1 ¤   {
fc915c ¤   ¤   err = VerifyPassphraseKey( keyRef->passKey,
06dddf ¤   ¤   ¤   ¤   ¤   &keyRef->diskFile->mainHeader->salt, passphrase );
619371 ¤   }
bdaf5a
30deb7 ¤   return( err );
e3efe6 }
27af5a
ff85ea ¤   OSStatus
de1c42 ChangePGPDiskKeyPassphrase(
67fc5e ¤   PGPDiskKeyRef¤  ¤   keyRef,
e5d78d ¤   ConstStr255Param¤   oldPassphrase,
d124b1 ¤   ConstStr255Param¤   newPassphrase)
dbbb36 {
10dc42 ¤   OSStatus¤   err;
3e67c5 ¤
1ff085 ¤   err = VerifyPGPDiskKeyRef( keyRef );
04ee03 ¤   if( IsntErr( err ) )
ebc7a1 ¤   {
b57156 ¤   ¤   if( keyRef->isPassphraseKey )
185b34 ¤   ¤   {
b1be2a ¤   ¤   ¤   err = VerifyPGPDiskKeyPassphrase( keyRef, oldPassphrase );
--381a 000e5fdc38740120020 Page 18 of PGPDiskFile.c
4f6108 ¤   ¤   ¤   if( IsntErr( err ) )
fcf776 ¤   ¤   ¤   {
765371 ¤   ¤   ¤   ¤   CASTKey¤¤   ¤   decryptedKey;
3731dc ¤   ¤   ¤   ¤   CMemoryWiper¤   decryptedKeyWiper( &decryptedKey,
2d8ea2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( decryptedKey ) );
3eaf5a
29d9c9 ¤   ¤   ¤   ¤   DecryptPassphraseKey( keyRef->passKey,
bdd34b ¤   ¤   ¤   ¤   ¤   ¤   &keyRef->diskFile->mainHeader->salt, oldPassphrase,
d89ddd ¤   ¤   ¤   ¤   ¤   ¤   &decryptedKey );
ba8182 ¤   ¤   ¤   ¤   EncryptPassphraseKey( &decryptedKey,
7c5ecf ¤   ¤   ¤   ¤   ¤   ¤   &keyRef->diskFile->mainHeader->salt, newPassphrase,
907cbf ¤   ¤   ¤   ¤   ¤   ¤   keyRef->passKey );
0ca3a6 ¤   ¤   ¤   }
430fe4 ¤   ¤   }
b30e1d ¤   ¤   else
4d5b34 ¤   ¤   {
97d110 ¤   ¤   ¤   pgpDebugMsg( "Cannot change passphrase on public key" );
9087c7 ¤   ¤   ¤
6a9f70 ¤   ¤   ¤   err = paramErr;
bd0fe4 ¤   ¤   }
269371 ¤   }
5d67c5 ¤
ffdeb7 ¤   return( err );
00efe6 }
bdaf5a
af85ea ¤   OSStatus
ef17d0 GetPGPDiskKeyBoolean(
b0fc5e ¤   PGPDiskKeyRef¤  ¤   keyRef,
406d1d ¤   PGPDiskKeyProperty¤ property,
a52c25 ¤   Boolean¤¤   ¤   ¤   *value)
50bb36 {
0ddc42 ¤   OSStatus¤   err;
0a67c5 ¤
07f085 ¤   err = VerifyPGPDiskKeyRef( keyRef );
d4ee03 ¤   if( IsntErr( err ) )
eec7a1 ¤   {
3a0d1f ¤   ¤   switch( property )
345b34 ¤   ¤   {
87787a ¤   ¤   ¤   case kPGPDiskKeyProperty_MountReadOnly:
25f776 ¤   ¤   ¤   {
4f747d ¤   ¤   ¤   ¤   if( keyRef->isPassphraseKey )
d372c3 ¤   ¤   ¤   ¤   {
e2b6aa ¤   ¤   ¤   ¤   ¤   *value = keyRef->passKey->readOnly;
7d2613 ¤   ¤   ¤   ¤   }
9d90fd ¤   ¤   ¤   #if PGPDISK_PUBLIC_KEY
fcfa07 ¤   ¤   ¤   ¤   else
e772c3 ¤   ¤   ¤   ¤   {
ba6ea8 ¤   ¤   ¤   ¤   ¤   *value = keyRef->publicKey->readOnly;
122613 ¤   ¤   ¤   ¤   }
5834f5 ¤   ¤   ¤   #endif
5f87c7 ¤   ¤   ¤
19f622 ¤   ¤   ¤   ¤   break;
8aa3a6 ¤   ¤   ¤   }
9287c7 ¤   ¤   ¤
1f127f ¤   ¤   ¤   case kPGPDiskKeyProperty_CanRemove:
1ff776 ¤   ¤   ¤   {
da5dc3 ¤   ¤   ¤   ¤   if( keyRef->isMasterKey )
6072c3 ¤   ¤   ¤   ¤   {
0844f8 ¤   ¤   ¤   ¤   ¤   *value = FALSE;
0f2613 ¤   ¤   ¤   ¤   }
48587f ¤   ¤   ¤   ¤   else if( keyRef->isPassphraseKey )
fd72c3 ¤   ¤   ¤   ¤   {
490c16 ¤   ¤   ¤   ¤   ¤   *value = TRUE;
162613 ¤   ¤   ¤   ¤   }
12ef06 ¤   ¤   ¤   #if PGP_BUSINESS_SECURITY
5dfa07 ¤   ¤   ¤   ¤   else
7b72c3 ¤   ¤   ¤   ¤   {
a0c041 ¤   ¤   ¤   ¤   ¤   *value = ! keyRef->publicKey->locked;
662613 ¤   ¤   ¤   ¤   }
7734f5 ¤   ¤   ¤   #endif
b32b85 ¤   ¤   ¤   ¤
e5f622 ¤   ¤   ¤   ¤   break;
--beca 0003f4bd91040120020 Page 19 of PGPDiskFile.c
cfa3a6 ¤   ¤   ¤   }
7987c7 ¤   ¤   ¤
fcdf80 ¤   ¤   ¤   case kPGPDiskKeyProperty_IsMasterKey:
9fe8bb ¤   ¤   ¤   ¤   *value = keyRef->isMasterKey;
33f622 ¤   ¤   ¤   ¤   break;
942b85 ¤   ¤   ¤   ¤
b7db68 ¤   ¤   ¤   default:
b80ae3 ¤   ¤   ¤   ¤   pgpDebugMsg( "GetPGPDiskKeyBoolean(): Unknown property" );
99322e ¤   ¤   ¤   ¤   err = paramErr;
24f622 ¤   ¤   ¤   ¤   break;
560fe4 ¤   ¤   }
349371 ¤   }
df67c5 ¤
f15b5f ¤   return( err );¤
f0efe6 }
26af5a
ab85ea ¤   OSStatus
42a21d RemovePGPDiskKey(PGPDiskKeyRef keyRef)
1fbb36 {
dddc42 ¤   OSStatus¤   err;
1167c5 ¤
9df085 ¤   err = VerifyPGPDiskKeyRef( keyRef );
56ee03 ¤   if( IsntErr( err ) )
d0c7a1 ¤   {
bcdd63 ¤   ¤   if( ! keyRef->isMasterKey )
925b34 ¤   ¤   {
b97ff6 ¤   ¤   ¤   keyRef->deleted = TRUE;
6487c7 ¤   ¤   ¤
b84db8 ¤   ¤   ¤   if( keyRef->isPassphraseKey )
11f776 ¤   ¤   ¤   {
a2498b ¤   ¤   ¤   ¤   pgpClearMemory( keyRef->passKey, sizeof( *keyRef->passKey ) );
6c799f ¤   ¤   ¤   ¤   keyRef->passKey = NULL;
4ca3a6 ¤   ¤   ¤   }
791c82 ¤   ¤   #if PGPDISK_PUBLIC_KEY
8abb8c ¤   ¤   ¤   else
90f776 ¤   ¤   ¤   {
fd2594 ¤   ¤   ¤   ¤   PGPDiskHeaderListItem¤  *curHeaderItem;
02a23d ¤   ¤   ¤   ¤   PGPDiskHeaderListItem¤  *prevHeaderItem = NULL;
612b85 ¤   ¤   ¤   ¤
c3b19b ¤   ¤   ¤   ¤   curHeaderItem = keyRef->diskFile->headerList;
453f9c ¤   ¤   ¤   ¤   while( IsntNull( curHeaderItem ) )
0872c3 ¤   ¤   ¤   ¤   {
27d2df ¤   ¤   ¤   ¤   ¤   if( curHeaderItem->header ==
c7a004 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPDiskFileHeaderInfo *) keyRef->publicKey )
9c4859 ¤   ¤   ¤   ¤   ¤   {
0424f6 ¤   ¤   ¤   ¤   ¤   ¤   // Remove from linked list
ef94aa ¤   ¤   ¤   ¤   ¤   ¤
99a9a1 ¤   ¤   ¤   ¤   ¤   ¤   if( prevHeaderItem == NULL )
e68fec ¤   ¤   ¤   ¤   ¤   ¤   {
9b68c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyRef->diskFile->headerList =
eb690f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   curHeaderItem->next;
64db3c ¤   ¤   ¤   ¤   ¤   ¤   }
397f8b ¤   ¤   ¤   ¤   ¤   ¤   else
648fec ¤   ¤   ¤   ¤   ¤   ¤   {
2ec0f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   prevHeaderItem->next = curHeaderItem->next;
e1db3c ¤   ¤   ¤   ¤   ¤   ¤   }
5094aa ¤   ¤   ¤   ¤   ¤   ¤
e6e19a ¤   ¤   ¤   ¤   ¤   ¤   pgpFreeMac( curHeaderItem->header );
318fb5 ¤   ¤   ¤   ¤   ¤   ¤   pgpFreeMac( curHeaderItem );
a994aa ¤   ¤   ¤   ¤   ¤   ¤
c200eb ¤   ¤   ¤   ¤   ¤   ¤   break;
0a1c89 ¤   ¤   ¤   ¤   ¤   }
5e2b85 ¤   ¤   ¤   ¤
568937 ¤   ¤   ¤   ¤   ¤   prevHeaderItem ¤= curHeaderItem;
ede756 ¤   ¤   ¤   ¤   ¤   curHeaderItem ¤ = curHeaderItem->next;
5e2613 ¤   ¤   ¤   ¤   }
fb2b85 ¤   ¤   ¤   ¤
7f6018 ¤   ¤   ¤   ¤   keyRef->publicKey = NULL;
5ea3a6 ¤   ¤   ¤   }
bbd656 ¤   ¤   #endif
0e0fe4 ¤   ¤   }
3f0e1d ¤   ¤   else
--73ed 000c9abdb8f40120020 Page 20 of PGPDiskFile.c
e35b34 ¤   ¤   {
92e39b ¤   ¤   ¤   pgpDebugMsg( "Cannot remove master key" );
149f70 ¤   ¤   ¤   err = paramErr;
e90fe4 ¤   ¤   }
8f9371 ¤   }
0267c5 ¤
5fdeb7 ¤   return( err );
faefe6 }
a9af5a
8a85ea ¤   OSStatus
7ceca2 AddPassphrasePGPDiskKey(
4e6e46 ¤   PGPDiskFileRef¤ ¤   diskFileRef,
ae024a ¤   ConstStr255Param¤   masterPassphrase,
820a1c ¤   ConstStr255Param¤   keyPassphrase,
574e85 ¤   Boolean¤¤   ¤   ¤   readOnly)
71bb36 {
3edc42 ¤   OSStatus¤   err;
1baf5a
223654 ¤   err = VerifyPGPDiskFileRef( diskFileRef );
61ee03 ¤   if( IsntErr( err ) )
7bc7a1 ¤   {
4dc6eb ¤   ¤   Boolean¤didAdd = FALSE;
d6b2bb ¤   ¤   UInt32¤ index;
ba1b52 ¤   ¤
b0fa6d ¤   ¤   for( index = 1; index < diskFileRef->mainHeader->numPassphrases;
161806 ¤   ¤   ¤   ¤   ¤   ++index )
b25b34 ¤   ¤   {
45c9a8 ¤   ¤   ¤   PassphraseKey *userInfo;
6987c7 ¤   ¤   ¤
77ff2d ¤   ¤   ¤   userInfo = &diskFileRef->mainHeader->passphrases[index];
090948 ¤   ¤   ¤   if ( ! userInfo->inUse )
fff776 ¤   ¤   ¤   {
8aca27 ¤   ¤   ¤   ¤   PassphraseKey *masterInfo;
b35371 ¤   ¤   ¤   ¤   CASTKey¤¤   ¤   decryptedKey;
5531dc ¤   ¤   ¤   ¤   CMemoryWiper¤   decryptedKeyWiper( &decryptedKey,
b8f47d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( decryptedKey ) );
782b85 ¤   ¤   ¤   ¤
1a526e ¤   ¤   ¤   ¤   userInfo->inUse ¤   = TRUE;
df6bea ¤   ¤   ¤   ¤   userInfo->readOnly¤ = readOnly;
ed87c7 ¤   ¤   ¤
03b0a5 ¤   ¤   ¤   ¤   masterInfo = &diskFileRef->mainHeader->
75f5bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passphrases[kMasterPassphraseIndex];
302b85 ¤   ¤   ¤   ¤
9ed72e ¤   ¤   ¤   ¤   // Decrypt the master key
f86407 ¤   ¤   ¤   ¤   err = DecryptPassphraseKey( masterInfo,
1c4ab6 ¤   ¤   ¤   ¤   ¤   ¤   &diskFileRef->mainHeader->salt, masterPassphrase,
cc9ddd ¤   ¤   ¤   ¤   ¤   ¤   &decryptedKey );
755c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
c072c3 ¤   ¤   ¤   ¤   {
d1aa3f ¤   ¤   ¤   ¤   ¤   // Now, encrypt the decrypted key again using the
fa85af ¤   ¤   ¤   ¤   ¤   // user's passphrase
1beeb1 ¤   ¤   ¤   ¤   ¤   EncryptPassphraseKey( &decryptedKey,
08cffb ¤   ¤   ¤   ¤   ¤   ¤   ¤   &diskFileRef->mainHeader->salt, keyPassphrase,
b2edc2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   userInfo );
abaf5a
068d9d ¤   ¤   ¤   ¤   ¤   didAdd = TRUE;
e22613 ¤   ¤   ¤   ¤   }
942b85 ¤   ¤   ¤   ¤
6af622 ¤   ¤   ¤   ¤   break;
89a3a6 ¤   ¤   ¤   }
d30fe4 ¤   ¤   }
161b52 ¤   ¤
83f499 ¤   ¤   if( IsntErr( err ) && ! didAdd )
005b34 ¤   ¤   {
9aa467 ¤   ¤   ¤   err = kNoMorePassphrasesAvailableError;
d50fe4 ¤   ¤   }
e19371 ¤   }
b867c5 ¤
cbdeb7 ¤   return( err );
d2efe6 }
c8af5a
c97f94 ¤   const PGPDiskFileHeader *
--f6ad 000aa44ca1540120020 Page 21 of PGPDiskFile.c
542f11 PeekPGPDiskFileHeader(PGPDiskFileRef diskFileRef)
efbb36 {
fc89fa ¤   pgpAssert( IsntErr( VerifyPGPDiskFileRef( diskFileRef ) ) );
1767c5 ¤
acd2a8 ¤   return( diskFileRef->mainHeader );
7befe6 }
90af5a
22029c #if PGPDISK_PUBLIC_KEY¤ // [
f7af5a
dacd56 ¤   UInt32
3f2b2f GetPublicPGPDiskKeyCount(PGPDiskFileRef diskFileRef)
cbbb36 {
79b848 ¤   UInt32¤ numPublicKeys = 0;
c3af5a
edad6f ¤   if( IsntErr( VerifyPGPDiskFileRef( diskFileRef ) ) )
37c7a1 ¤   {
a4e679 ¤   ¤   PGPDiskHeaderListItem¤  *curHeaderItem;
051b52 ¤   ¤
b443cd ¤   ¤   curHeaderItem = diskFileRef->headerList;
8e76b6 ¤   ¤   while( IsntNull( curHeaderItem ) )
315b34 ¤   ¤   {
0784d2 ¤   ¤   ¤   if( curHeaderItem->header->headerType ==
9421a2 ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskPublicKeyHeaderType )
47f776 ¤   ¤   ¤   {
2e3c4d ¤   ¤   ¤   ¤   ++numPublicKeys;
f2a3a6 ¤   ¤   ¤   }
ef1b52 ¤   ¤
940335 ¤   ¤   ¤   curHeaderItem = curHeaderItem->next;
460fe4 ¤   ¤   }
fe9371 ¤   }
dd67c5 ¤
89d684 ¤   return( numPublicKeys );
caefe6 }
daaf5a
d866dd ¤   static PGPError
91dfcc LoadKeyRings(PGPDiskFileRef diskFileRef)
dfbb36 {
3a8e12 ¤   PGPError¤   err = kPGPError_NoErr;
3267c5 ¤
7ac9a4 ¤   if( ! PGPContextRefIsValid( diskFileRef->context ) )
9dc7a1 ¤   {
f00a21 ¤   ¤   err = PGPNewContext( kPGPsdkAPIVersion, &diskFileRef->context );
b886f8 ¤   ¤   if( IsntPGPError( err ) )
615b34 ¤   ¤   {
389e47 ¤   ¤   ¤   err = PGPsdkLoadDefaultPrefs( diskFileRef->context );
0f0fe4 ¤   ¤   }
5e9371 ¤   }
e667c5 ¤
ab3071 ¤   if( IsntPGPError( err ) && ! PGPKeySetRefIsValid( diskFileRef->keySet ) )
f5c7a1 ¤   {
d9c264 ¤   ¤   err = PGPOpenDefaultKeyRings( diskFileRef->context, 0,
98093c ¤   ¤   ¤   ¤   ¤   ¤   &diskFileRef->keySet );
bd9371 ¤   }
4daf5a
f9deb7 ¤   return( err );
07efe6 }
8caf5a
f966dd ¤   static PGPError
cf953b DecryptPublicKey(
3a5fbe ¤   PGPKeyRef¤  ¤   ¤   theKey,
a1799e ¤   ConstStr255Param¤   passphrase,
6acfab ¤   const void¤ ¤   ¤   *encryptedData,
856a65 ¤   PGPSize¤¤   ¤   ¤   encryptedDataSize,
935ac0 ¤   const CheckBytes¤   *checkBytes,
ff2d26 ¤   CASTKey¤¤   ¤   ¤   *decryptedKey)
68bb36 {
2fba49 ¤   PGPError¤   ¤   ¤   ¤   err;
d25266 ¤   char¤   ¤   ¤   ¤   ¤   cPassphrase[256];
4c8f89 ¤   PGPPrivateKeyContextRef¤privContext;
a9429f ¤   PGPContextRef¤  ¤   ¤   context;
6067c5 ¤
aa1566 ¤   PToCString( passphrase, cPassphrase );
--94d3 000ce13e12040120020 Page 22 of PGPDiskFile.c
2a67c5 ¤
bc922d ¤   context = PGPGetKeyContext( theKey );
7e67c5 ¤
8904dd ¤   err = PGPNewPrivateKeyContext( theKey, kPGPPublicKeyMessageFormat_PGP,
60c5a2 ¤   ¤   ¤   ¤   ¤   &privContext, PGPOPassphrase( context, cPassphrase ),
7fc000 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
02b1f0 ¤   if( IsntPGPError( err ) )
5dc7a1 ¤   {
c73e61 ¤   ¤   PGPSize¤maxDecryptedBufferSize;
beaa30 ¤   ¤   PGPSize¤maxEncryptedBufferSize;
c89f4b ¤   ¤   PGPSize¤maxSignatureSize;
391b52 ¤   ¤
1f9d8a ¤   ¤   err = PGPGetPrivateKeyOperationSizes( privContext,
817c60 ¤   ¤   ¤   ¤   ¤   ¤   &maxDecryptedBufferSize,
44e831 ¤   ¤   ¤   ¤   ¤   ¤   &maxEncryptedBufferSize,
50e6d7 ¤   ¤   ¤   ¤   ¤   ¤   &maxSignatureSize );
a286f8 ¤   ¤   if( IsntPGPError( err ) )
e65b34 ¤   ¤   {
c7c3f1 ¤   ¤   ¤   PGPByte¤fingerPrint[128];
b65e2d ¤   ¤   ¤   PGPSize¤fingerPrintSize;
9e87c7 ¤   ¤   ¤
392763 ¤   ¤   ¤   pgpClearMemory( fingerPrint, sizeof( fingerPrint ) );
8987c7 ¤   ¤   ¤
091831 ¤   ¤   ¤   err = PGPGetKeyPropertyBuffer( theKey, kPGPKeyPropFingerprint,
286b0e ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( fingerPrint ), fingerPrint,·
a86423 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fingerPrintSize );
2a698b ¤   ¤   ¤   if( IsntPGPError( err ) )
3cf776 ¤   ¤   ¤   {
8c544e ¤   ¤   ¤   ¤   PGPByte¤*data;
172b85 ¤   ¤   ¤   ¤
42c1d0 ¤   ¤   ¤   ¤   data = (PGPByte *) pgpAllocMac( maxDecryptedBufferSize,
ee50c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMemAllocationFlags );
a1d23e ¤   ¤   ¤   ¤   if( IsntNull( data ) )
b472c3 ¤   ¤   ¤   ¤   {
5464ce ¤   ¤   ¤   ¤   ¤   PGPSize¤decryptedDataSize;
33ae30 ¤   ¤   ¤   ¤   ¤
2c1045 ¤   ¤   ¤   ¤   ¤   err = PGPPrivateKeyDecrypt( privContext, encryptedData,
ae2249 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   encryptedDataSize, data, &decryptedDataSize );
cb6ca0 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
ec4859 ¤   ¤   ¤   ¤   ¤   {
72029c ¤   ¤   ¤   ¤   ¤   ¤   if( decryptedDataSize == sizeof( *decryptedKey ) )
4e8fec ¤   ¤   ¤   ¤   ¤   ¤   {
7586f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ExpandedCASTKey¤expandedKey;
758979 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CMemoryWiper¤   expandedKeyWiper( &expandedKey,
19ecda ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( expandedKey ) );
142fd4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CheckBytes¤ ¤   decryptedCheckBytes;
f4531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
9c4856 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( data, decryptedKey,
1585b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( *decryptedKey ) );
1bed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
4f95aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Decrypt the check bytes. We encrypted the first]
68f84d ¤   ¤   ¤   ¤   ¤   ¤   ¤   // eight bytes of the fingerprint.
c8531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
1f1b29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CAST5schedule( expandedKey.keyWords,
01bee5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   decryptedKey->keyBytes );
858203 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CAST5decrypt( &checkBytes->theBytes[0],
48e3e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &decryptedCheckBytes.theBytes[0],
342e24 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   expandedKey.keyWords );
c3af5a
a4b172 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( ! pgpMemoryEqual( &decryptedCheckBytes,
17cca9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fingerPrint,
7645d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( decryptedCheckBytes ) ) )
d806b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
de0cdc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Should never get here.
00bb00 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kPGPError_KeyUnusableForDecryption;
ece2c9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }¤  ¤   ¤   ¤   ¤   ¤
2cdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
517f8b ¤   ¤   ¤   ¤   ¤   ¤   else
9b8fec ¤   ¤   ¤   ¤   ¤   ¤   {
830611 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kPGPError_OutputBufferTooSmall;
a4db3c ¤   ¤   ¤   ¤   ¤   ¤   }
ce1c89 ¤   ¤   ¤   ¤   ¤   }
--2b77 0006e6471a540120020 Page 23 of PGPDiskFile.c
5d531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
8e4baa ¤   ¤   ¤   ¤   ¤   pgpFreeMac( data );
672613 ¤   ¤   ¤   ¤   }
58fa07 ¤   ¤   ¤   ¤   else
f672c3 ¤   ¤   ¤   ¤   {
51ed29 ¤   ¤   ¤   ¤   ¤   err = kPGPError_OutOfMemory;
5cb889 ¤   ¤   ¤   ¤   }¤
b1a3a6 ¤   ¤   ¤   }
d50fe4 ¤   ¤   }
dd1b52 ¤   ¤
935b1a ¤   ¤   PGPFreePrivateKeyContext( privContext );
dd9371 ¤   }
8c67c5 ¤
a6deb7 ¤   return( err );
12efe6 }
9caf5a
ec66dd ¤   static PGPError
f0ddb5 EncryptPublicKey(
480157 ¤   const CASTKey¤  *decryptedKey,
57eeb1 ¤   PGPKeyRef¤  ¤   theKey,
fee590 ¤   void¤   ¤   ¤   **encryptedData,
f4d1a0 ¤   UInt32¤ ¤   ¤   *encryptedDataSize,
9105ef ¤   CheckBytes¤ ¤   *checkBytes)
2fbb36 {
b2ba49 ¤   PGPError¤   ¤   ¤   ¤   err;
89603a ¤   PGPPublicKeyContextRef¤ pubContext;
8ea646 ¤   PGPByte¤¤   ¤   ¤   ¤   *data;
362933 ¤   PGPSize¤¤   ¤   ¤   ¤   dataSize;
aa67c5 ¤
f06abb ¤   data ¤  ¤   = NULL;
3d48d6 ¤   dataSize¤   = 0;
f967c5 ¤
e48019 ¤   err = PGPNewPublicKeyContext( theKey,
ae8484 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPublicKeyMessageFormat_PGP,
309459 ¤   ¤   ¤   ¤   ¤   ¤   &pubContext );
edb1f0 ¤   if( IsntPGPError( err ) )
e3c7a1 ¤   {
5d3e61 ¤   ¤   PGPSize¤maxDecryptedBufferSize;
00aa30 ¤   ¤   PGPSize¤maxEncryptedBufferSize;
149f4b ¤   ¤   PGPSize¤maxSignatureSize;
231b52 ¤   ¤
1f68d7 ¤   ¤   err = PGPGetPublicKeyOperationSizes( pubContext,
607c60 ¤   ¤   ¤   ¤   ¤   ¤   &maxDecryptedBufferSize,
80e831 ¤   ¤   ¤   ¤   ¤   ¤   &maxEncryptedBufferSize,
65e6d7 ¤   ¤   ¤   ¤   ¤   ¤   &maxSignatureSize );
c686f8 ¤   ¤   if( IsntPGPError( err ) )
a05b34 ¤   ¤   {
5cc3f1 ¤   ¤   ¤   PGPByte¤fingerPrint[128];
ac5e2d ¤   ¤   ¤   PGPSize¤fingerPrintSize;
1887c7 ¤   ¤   ¤
852763 ¤   ¤   ¤   pgpClearMemory( fingerPrint, sizeof( fingerPrint ) );
ea87c7 ¤   ¤   ¤
a81831 ¤   ¤   ¤   err = PGPGetKeyPropertyBuffer( theKey, kPGPKeyPropFingerprint,
0f6b0e ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( fingerPrint ), fingerPrint,·
276423 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fingerPrintSize );
41698b ¤   ¤   ¤   if( IsntPGPError( err ) )
97f776 ¤   ¤   ¤   {
40de1c ¤   ¤   ¤   ¤   ExpandedCASTKey¤¤   expandedKey;
121d30 ¤   ¤   ¤   ¤   CMemoryWiper¤   ¤   expandedKeyWiper( &expandedKey,
a9fc33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( expandedKey ) );
aa2b85 ¤   ¤   ¤   ¤
10db37 ¤   ¤   ¤   ¤   // Compute the check bytes. We encrypt the first eight
469167 ¤   ¤   ¤   ¤   // bytes of the fingerprint.
572b85 ¤   ¤   ¤   ¤
38e27c ¤   ¤   ¤   ¤   CAST5schedule( expandedKey.keyWords, decryptedKey->keyBytes );
9036ec ¤   ¤   ¤   ¤   CAST5encrypt( fingerPrint, &checkBytes->theBytes[0],
44629e ¤   ¤   ¤   ¤   ¤   ¤   expandedKey.keyWords );
092b85 ¤   ¤   ¤   ¤
e95581 ¤   ¤   ¤   ¤   data = (PGPByte *) pgpAllocMac( maxEncryptedBufferSize,
6350c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMemAllocationFlags );
47d23e ¤   ¤   ¤   ¤   if( IsntNull( data ) )
6e72c3 ¤   ¤   ¤   ¤   {
--457e 000632f80f340120020 Page 24 of PGPDiskFile.c
f0d313 ¤   ¤   ¤   ¤   ¤   err = PGPPublicKeyEncrypt( pubContext, decryptedKey,
4f89a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( *decryptedKey ), data, &dataSize );
eb2613 ¤   ¤   ¤   ¤   }
56fa07 ¤   ¤   ¤   ¤   else
4e72c3 ¤   ¤   ¤   ¤   {
77ed29 ¤   ¤   ¤   ¤   ¤   err = kPGPError_OutOfMemory;
c2b889 ¤   ¤   ¤   ¤   }¤
2f0b49 ¤   ¤   ¤   }¤  ¤   ¤
e90fe4 ¤   ¤   }
fa1b52 ¤   ¤
2cb530 ¤   ¤   (void) PGPFreePublicKeyContext( pubContext );
829371 ¤   }
b167c5 ¤
4f8956 ¤   *encryptedData ¤¤   = data;
79c69d ¤   *encryptedDataSize¤ = dataSize;
b367c5 ¤
f0deb7 ¤   return( err );
87efe6 }
29af5a
8866dd ¤   static PGPError
3463b2 NewPublicPGPDiskKeyRef(
f1e379 ¤   PGPDiskFileRef¤ ¤   ¤   diskFileRef,
8e58b6 ¤   PGPDiskPublicKeyHeader¤ *header,
2a8923 ¤   PGPDiskKeyRef¤  ¤   ¤   *keyRefPtr)
a8bb36 {
7e3bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
e16545 ¤   PGPDiskKeyRef¤  keyRef;
31af5a
d72473 ¤   keyRef = (PGPDiskKeyRef) pgpAllocMac( sizeof( *keyRef ),
9719e8 ¤   ¤   ¤   ¤   ¤   kMemAllocationFlags );
4aa49f ¤   if( PGPDiskKeyRefIsValid( keyRef ) )
85c7a1 ¤   {
0449b4 ¤   ¤   keyRef->magic¤  ¤   ¤   = kPGPDiskKeyMagic;
68ed44 ¤   ¤   keyRef->isPassphraseKey¤= FALSE;
aec127 ¤   ¤   keyRef->isMasterKey¤¤   = FALSE;
636723 ¤   ¤   keyRef->diskFile¤   ¤   = diskFileRef;
61c6f1 ¤   ¤   keyRef->publicKey¤  ¤   = header;
f11b52 ¤   ¤
c6040b ¤   ¤   ++diskFileRef->keyCount;
c09371 ¤   }
ee0e24 ¤   else
97c7a1 ¤   {
6abce1 ¤   ¤   err = kPGPError_OutOfMemory;
509371 ¤   }
d267c5 ¤
6fc121 ¤   *keyRefPtr = keyRef;
ba67c5 ¤
b2deb7 ¤   return( err );
85efe6 }
b5af5a
2e26f7 ¤   static CComboError
49b817 FindPublicPGPDiskKey(
986e46 ¤   PGPDiskFileRef¤ ¤   diskFileRef,
9a799e ¤   ConstStr255Param¤   passphrase,
78117d ¤   PGPDiskKeyRef¤  ¤   *keyRefPtr)
90bb36 {
db865f ¤   CComboError¤¤   err;
859541 ¤   PGPDiskKeyRef¤  keyRef = kInvalidPGPDiskKeyRef;
8c67c5 ¤
78e96e ¤   err.pgpErr = LoadKeyRings( diskFileRef );
2bd3cb ¤   if( err.IsntError() )
e7c7a1 ¤   {
6de679 ¤   ¤   PGPDiskHeaderListItem¤  *curHeaderItem;
3e1d58 ¤   ¤   char¤   ¤   ¤   ¤   ¤   cPassphrase[256];
07af5a
4984fe ¤   ¤   PToCString( passphrase, cPassphrase );
971b52 ¤   ¤
6c43cd ¤   ¤   curHeaderItem = diskFileRef->headerList;
5203f7 ¤   ¤   while( IsntNull( curHeaderItem ) && err.IsntError() )
4e5b34 ¤   ¤   {
2784d2 ¤   ¤   ¤   if( curHeaderItem->header->headerType ==
638fa3 ¤   ¤   ¤   ¤   ¤   kPGPDiskPublicKeyHeaderType )
--8417 00010b19a0c40120020 Page 25 of PGPDiskFile.c
99f776 ¤   ¤   ¤   {
085652 ¤   ¤   ¤   ¤   PGPDiskPublicKeyHeader¤ *pubKeyHeader;
59d0f1 ¤   ¤   ¤   ¤   PGPByte¤¤   ¤   ¤   ¤   *exportedKeyID;
cee13c ¤   ¤   ¤   ¤   PGPKeyID¤   ¤   ¤   ¤   keyID;
d787c7 ¤   ¤   ¤
3fc7c8 ¤   ¤   ¤   ¤   pubKeyHeader ¤  = (PGPDiskPublicKeyHeader *)
fff906 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   curHeaderItem->header;
59fa3e ¤   ¤   ¤   ¤   exportedKeyID¤  = (PGPByte *) pubKeyHeader +
059133 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pubKeyHeader->keyIDOffset;
a22b85 ¤   ¤   ¤   ¤
04119c ¤   ¤   ¤   ¤   err.pgpErr = PGPImportKeyID( exportedKeyID, &keyID );
6882e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
7872c3 ¤   ¤   ¤   ¤   {
4f79fd ¤   ¤   ¤   ¤   ¤   PGPKeyRef¤  theKey;
acae30 ¤   ¤   ¤   ¤   ¤
c09145 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( PGPGetKeyByKeyID( diskFileRef->keySet,
424db4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID, pubKeyHeader->algorithm,
e32b9e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theKey ) ) )
0b4859 ¤   ¤   ¤   ¤   ¤   {
00ac0b ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ canDecrypt = FALSE;
d394aa ¤   ¤   ¤   ¤   ¤   ¤
b07518 ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPGetKeyBoolean( theKey,
7d009a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropCanDecrypt, &canDecrypt );
c2ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
a7ea8c ¤   ¤   ¤   ¤   ¤   ¤   if( canDecrypt &&
4ce243 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPPassphraseIsValid( theKey,
8d42e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( diskFileRef->context,·
85304e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cPassphrase ),
88c9f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( diskFileRef->context ) ) )
598fec ¤   ¤   ¤   ¤   ¤   ¤   {
d291d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = NewPublicPGPDiskKeyRef( diskFileRef,
c4fdfa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pubKeyHeader, &keyRef );
488c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
c4db3c ¤   ¤   ¤   ¤   ¤   ¤   }
981c89 ¤   ¤   ¤   ¤   ¤   }
a94bd6 ¤   ¤   ¤   ¤   ¤   else
384859 ¤   ¤   ¤   ¤   ¤   {
dccf39 ¤   ¤   ¤   ¤   ¤   ¤   err.err = kPGPDiskIncorrectPassphraseKeyNotFoundError;
d7ee14 ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr¤ = kPGPError_NoErr;
6b1c89 ¤   ¤   ¤   ¤   ¤   }
072613 ¤   ¤   ¤   ¤   }
aaa3a6 ¤   ¤   ¤   }
ef1b52 ¤   ¤
260335 ¤   ¤   ¤   curHeaderItem = curHeaderItem->next;
c90fe4 ¤   ¤   }
ba9371 ¤   }
9a0e24 ¤   else
73c7a1 ¤   {
96f325 ¤   ¤   err.err ¤   = kPGPDiskIncorrectPassphraseNoKeyringsError;
1db855 ¤   ¤   err.pgpErr¤ = kPGPError_NoErr;
689371 ¤   }
2367c5 ¤
83a49f ¤   if( PGPDiskKeyRefIsValid( keyRef ) )
5fc7a1 ¤   {
a6f57c ¤   ¤   *keyRefPtr = keyRef;
2a9371 ¤   }
35e67a ¤   else if( err.IsntError() )
bdc7a1 ¤   {
6afd48 ¤   ¤   err.err = kPGPDiskIncorrectPassphraseError;
ce9371 ¤   }
b967c5 ¤
a2deb7 ¤   return( err );
e1efe6 }
42af5a
7248b2 ¤   static PGPDiskPublicKeyHeader *
ec8d3c LocatePublicPGPDiskKeyID(
c86e46 ¤   PGPDiskFileRef¤ ¤   diskFileRef,
c2950c ¤   const PGPKeyID¤ ¤   *searchKeyID)
c0bb36 {
fd2fe6 ¤   PGPDiskPublicKeyHeader¤ *result = NULL;
8bfe29 ¤   PGPDiskHeaderListItem¤  *curHeaderItem;
1067c5 ¤
--4ff4 000ed2ae8da40120020 Page 26 of PGPDiskFile.c
4e1150 ¤   curHeaderItem = diskFileRef->headerList;
9d78fa ¤   while( IsntNull( curHeaderItem ) )
14c7a1 ¤   {
b28e12 ¤   ¤   if( curHeaderItem->header->headerType == kPGPDiskPublicKeyHeaderType )
955b34 ¤   ¤   {
094775 ¤   ¤   ¤   PGPDiskPublicKeyHeader¤ *pubKeyHeader;
b5855d ¤   ¤   ¤   PGPByte¤¤   ¤   ¤   ¤   *exportedKeyID;
6270a4 ¤   ¤   ¤   PGPKeyID¤   ¤   ¤   ¤   keyID;
111b52 ¤   ¤
00bbea ¤   ¤   ¤   pubKeyHeader ¤  = (PGPDiskPublicKeyHeader *) curHeaderItem->header;
8fdc8b ¤   ¤   ¤   exportedKeyID¤  = (PGPByte *) pubKeyHeader +
5182bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pubKeyHeader->keyIDOffset;
3787c7 ¤   ¤   ¤
3319cd ¤   ¤   ¤   if( IsntPGPError( PGPImportKeyID( exportedKeyID, &keyID ) ) )
16f776 ¤   ¤   ¤   {
6c553f ¤   ¤   ¤   ¤   if( PGPCompareKeyIDs( searchKeyID, &keyID ) == 0 )
cf72c3 ¤   ¤   ¤   ¤   {
d7d0a8 ¤   ¤   ¤   ¤   ¤   result = pubKeyHeader;
4d14c3 ¤   ¤   ¤   ¤   ¤   break;
302613 ¤   ¤   ¤   ¤   }
38a3a6 ¤   ¤   ¤   }
d80fe4 ¤   ¤   }
cf67c5 ¤
ea51a8 ¤   ¤   curHeaderItem = curHeaderItem->next;
059371 ¤   }
d067c5 ¤
754c6e ¤   return( result );
69efe6 }
80af5a
b966dd ¤   static PGPError
1730c1 FindPublicPGPDiskKeyID(
766e46 ¤   PGPDiskFileRef¤ ¤   diskFileRef,
7febb4 ¤   const PGPKeyID¤ ¤   *searchKeyID,
e5117d ¤   PGPDiskKeyRef¤  ¤   *keyRefPtr)
69bb36 {
1e802f ¤   PGPDiskPublicKeyHeader¤ *header;
20ba49 ¤   PGPError¤   ¤   ¤   ¤   err;
6567c5 ¤
5f3e83 ¤   *keyRefPtr = kInvalidPGPDiskKeyRef;
4467c5 ¤
d69e23 ¤   header = LocatePublicPGPDiskKeyID( diskFileRef, searchKeyID );
8863a1 ¤   if( IsntNull( header ) )
75c7a1 ¤   {
bff005 ¤   ¤   err = NewPublicPGPDiskKeyRef( diskFileRef, header, keyRefPtr );
579371 ¤   }
e00e24 ¤   else
68c7a1 ¤   {
fe2f1f ¤   ¤   err = kPGPError_ItemNotFound;
1b9371 ¤   }
aa67c5 ¤
7adeb7 ¤   return( err );
c2efe6 }
33af5a
f026f7 ¤   static CComboError
77a8a0 AddPublicKey(
06c0be ¤   PGPDiskFileRef¤ diskFileRef,
75eeb1 ¤   PGPKeyRef¤  ¤   theKey,
230157 ¤   const CASTKey¤  *decryptedKey,
dc5f13 ¤   Boolean¤¤   ¤   readOnly,
eaf988 ¤   Boolean¤¤   ¤   locked)
e4bb36 {
ebb8e5 ¤   CComboError¤err;
be4fb6 ¤   PGPKeyID¤   keyID;
ef67c5 ¤
363efb ¤   err.pgpErr = PGPGetKeyIDFromKey( theKey, &keyID );
dfd3cb ¤   if( err.IsntError() )
9ac7a1 ¤   {
2e6a56 ¤   ¤   void¤   ¤   ¤   ¤   ¤   *encryptedKey ¤ ¤   = NULL;
0b0f6f ¤   ¤   UInt32¤ ¤   ¤   ¤   ¤   encryptedKeySize¤   = 0;
065212 ¤   ¤   PGPByte ¤   ¤   ¤   ¤   exportedKeyID[kPGPMaxExportedKeyIDSize];
7441b7 ¤   ¤   PGPSize¤¤   ¤   ¤   ¤   exportedKeyIDSize;
ed67b3 ¤   ¤   CheckBytes¤ ¤   ¤   ¤   checkBytes;
--0722 000c603399940120020 Page 27 of PGPDiskFile.c
b8e47b ¤   ¤   PGPPublicKeyAlgorithm¤  algorithm;
061b52 ¤   ¤
50c0cd ¤   ¤   err.pgpErr = EncryptPublicKey( decryptedKey, theKey,
ae906d ¤   ¤   ¤   ¤   ¤   ¤   &encryptedKey, &encryptedKeySize, &checkBytes );
3f5a9f ¤   ¤   if( err.IsntError() )
a85b34 ¤   ¤   {
f5b97f ¤   ¤   ¤   PGPKeyID¤   keyID;
4b87c7 ¤   ¤   ¤
e03922 ¤   ¤   ¤   err.pgpErr = PGPGetKeyIDFromKey( theKey, &keyID );
df6d97 ¤   ¤   ¤   if( err.IsntError() )
37f776 ¤   ¤   ¤   {
7183e1 ¤   ¤   ¤   ¤   err.pgpErr = PGPExportKeyID( &keyID, exportedKeyID,
ee3b84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &exportedKeyIDSize );
c082e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
9972c3 ¤   ¤   ¤   ¤   {
2feb56 ¤   ¤   ¤   ¤   ¤   PGPInt32¤   alg;
28ae30 ¤   ¤   ¤   ¤   ¤
fc59af ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPGetKeyNumber( theKey, kPGPKeyPropAlgID,
61118e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &alg );
79ae30 ¤   ¤   ¤   ¤   ¤
0d32df ¤   ¤   ¤   ¤   ¤   algorithm = (PGPPublicKeyAlgorithm) alg;
242613 ¤   ¤   ¤   ¤   }
08a3a6 ¤   ¤   ¤   }
d40fe4 ¤   ¤   }
ba1b52 ¤   ¤
2b5a9f ¤   ¤   if( err.IsntError() )
005b34 ¤   ¤   {
6861df ¤   ¤   ¤   PGPDiskHeaderListItem¤  *headerItem;
9d87c7 ¤   ¤   ¤
9fd546 ¤   ¤   ¤   headerItem = (PGPDiskHeaderListItem *) pgpAllocMac(
cec07e ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( *headerItem ), kMemAllocationFlags );
fdec88 ¤   ¤   ¤   if( IsntNull( headerItem ) )
26f776 ¤   ¤   ¤   {
802e5a ¤   ¤   ¤   ¤   UInt32¤ ¤   ¤   ¤   ¤   headerSize;
09d1e7 ¤   ¤   ¤   ¤   PGPDiskPublicKeyHeader¤ *header;
dc2b85 ¤   ¤   ¤   ¤
fbc76b ¤   ¤   ¤   ¤   // Allocate public key header and link into list.
6a2b85 ¤   ¤   ¤   ¤
6a08ce ¤   ¤   ¤   ¤   headerSize = sizeof( *header ) + exportedKeyIDSize +·
b7954a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   encryptedKeySize;
022b85 ¤   ¤   ¤   ¤
ae15fa ¤   ¤   ¤   ¤   header = (PGPDiskPublicKeyHeader *) pgpAllocMac(
5606ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   headerSize, kMemAllocationFlags );
85e072 ¤   ¤   ¤   ¤   if( IsntNull( header ) )
8972c3 ¤   ¤   ¤   ¤   {
7aa0d3 ¤   ¤   ¤   ¤   ¤   PGPByte¤¤   ¤   ¤   ¤   *data;
1b1d60 ¤   ¤   ¤   ¤   ¤   PGPDiskHeaderListItem¤  *curHeader;
97ae30 ¤   ¤   ¤   ¤   ¤
bc7b5a ¤   ¤   ¤   ¤   ¤   headerItem->next ¤  = NULL;
051dd1 ¤   ¤   ¤   ¤   ¤   headerItem->header ¤= &header->headerInfo;
05ae30 ¤   ¤   ¤   ¤   ¤
ea265a ¤   ¤   ¤   ¤   ¤   header->headerInfo.headerMagic = kPGPDiskHeaderMagic;
d2fd53 ¤   ¤   ¤   ¤   ¤   header->headerInfo.headerType =
93dc16 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskPublicKeyHeaderType;
1baf68 ¤   ¤   ¤   ¤   ¤   header->headerInfo.headerSize = headerSize;
8faf5a
fb904e ¤   ¤   ¤   ¤   ¤   header->majorVersion =
5c2496 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskPublicKeyHeaderMajorVersion;
7a6999 ¤   ¤   ¤   ¤   ¤   header->minorVersion =
f70c88 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskPublicKeyHeaderMinorVersion;
c7071b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
1f1d8c ¤   ¤   ¤   ¤   ¤   header->readOnly ¤  ¤   ¤   = readOnly;
4d711a ¤   ¤   ¤   ¤   ¤   header->locked ¤¤   ¤   ¤   = locked;
25abb2 ¤   ¤   ¤   ¤   ¤   header->keyIDSize¤  ¤   ¤   = exportedKeyIDSize;
e38c2b ¤   ¤   ¤   ¤   ¤   header->encryptedKeySize¤   = encryptedKeySize;
bb80bb ¤   ¤   ¤   ¤   ¤   header->checkBytes¤ ¤   ¤   = checkBytes;
82b904 ¤   ¤   ¤   ¤   ¤   header->algorithm¤  ¤   ¤   = algorithm;
a7ae30 ¤   ¤   ¤   ¤   ¤
a24f62 ¤   ¤   ¤   ¤   ¤   data = (PGPByte *) header + sizeof( *header );
1e58c2 ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( exportedKeyID, data, exportedKeyIDSize );
c4ae30 ¤   ¤   ¤   ¤   ¤
c6cac5 ¤   ¤   ¤   ¤   ¤   header->keyIDOffset = data - (PGPByte *) header;
--2836 000f4bf846b40120020 Page 28 of PGPDiskFile.c
d6ae30 ¤   ¤   ¤   ¤   ¤
5c2cfe ¤   ¤   ¤   ¤   ¤   data += exportedKeyIDSize;
1ad2b4 ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( encryptedKey, data, encryptedKeySize );
58ae30 ¤   ¤   ¤   ¤   ¤
60a17a ¤   ¤   ¤   ¤   ¤   header->encryptedKeyOffset = data -
67b4ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPByte *) header;
15af5a
5c063a ¤   ¤   ¤   ¤   ¤   // Link header at end of main header list.
c0ae30 ¤   ¤   ¤   ¤   ¤
318b8b ¤   ¤   ¤   ¤   ¤   curHeader = diskFileRef->headerList;
6e71a0 ¤   ¤   ¤   ¤   ¤   while( IsntNull( curHeader->next ) )
c84859 ¤   ¤   ¤   ¤   ¤   {
723f09 ¤   ¤   ¤   ¤   ¤   ¤   curHeader = curHeader->next;
091c89 ¤   ¤   ¤   ¤   ¤   }
afae30 ¤   ¤   ¤   ¤   ¤
a5eeb4 ¤   ¤   ¤   ¤   ¤   curHeader->next = headerItem;
8f2613 ¤   ¤   ¤   ¤   }
41fa07 ¤   ¤   ¤   ¤   else
3972c3 ¤   ¤   ¤   ¤   {
c47105 ¤   ¤   ¤   ¤   ¤   pgpFreeMac( headerItem );
a9ae30 ¤   ¤   ¤   ¤   ¤
838e64 ¤   ¤   ¤   ¤   ¤   err.pgpErr = kPGPError_OutOfMemory;
222613 ¤   ¤   ¤   ¤   }
47a3a6 ¤   ¤   ¤   }
a8bb8c ¤   ¤   ¤   else
e5f776 ¤   ¤   ¤   {
d1dbc8 ¤   ¤   ¤   ¤   err.pgpErr = kPGPError_OutOfMemory;
9fa3a6 ¤   ¤   ¤   }
590fe4 ¤   ¤   }
e81b52 ¤   ¤
ae3049 ¤   ¤   if( IsntNull( encryptedKey ) )
950ad2 ¤   ¤   ¤   pgpFreeMac( encryptedKey );
4f9371 ¤   }
6467c5 ¤
fbdeb7 ¤   return( err );
f0efe6 }
d4af5a
f785b7 ¤   CComboError
5148cd AddPublicPGPDiskKey(
1b6e46 ¤   PGPDiskFileRef¤ ¤   diskFileRef,
915fbe ¤   PGPKeyRef¤  ¤   ¤   theKey,
f5024a ¤   ConstStr255Param¤   masterPassphrase,
4c303d ¤   Boolean¤¤   ¤   ¤   readOnly,
6a0162 ¤   Boolean¤¤   ¤   ¤   locked)
a1bb36 {
16b8e5 ¤   CComboError¤err;
53af5a
0aa9b9 ¤   err.err = VerifyPGPDiskFileRef( diskFileRef );
62d3cb ¤   if( err.IsntError() )
87c7a1 ¤   {
f4ad57 ¤   ¤   PGPKeyID¤   keyID;
aa1b52 ¤   ¤
ae39c0 ¤   ¤   err.pgpErr = PGPGetKeyIDFromKey( theKey, &keyID );
4d032a ¤   ¤   if( err.IsntError() &&
f8c72c ¤   ¤   ¤   IsNull( LocatePublicPGPDiskKeyID( diskFileRef, &keyID ) ) )
fe5b34 ¤   ¤   {
e2ef1c ¤   ¤   ¤   PassphraseKey ¤ *masterInfo;
606ab4 ¤   ¤   ¤   CASTKey¤¤   ¤   decryptedKey;
bd8dc5 ¤   ¤   ¤   CMemoryWiper¤   decryptedKeyWiper( &decryptedKey,
d7f47d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( decryptedKey ) );
c387c7 ¤   ¤   ¤
e9e509 ¤   ¤   ¤   masterInfo = &diskFileRef->mainHeader->
3ef2ca ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passphrases[kMasterPassphraseIndex];
1187c7 ¤   ¤   ¤
6bebc0 ¤   ¤   ¤   // Decrypt the master key
87adf1 ¤   ¤   ¤   err.err = DecryptPassphraseKey( masterInfo,
605c00 ¤   ¤   ¤   ¤   ¤   &diskFileRef->mainHeader->salt, masterPassphrase,
219830 ¤   ¤   ¤   ¤   ¤   &decryptedKey );
0e6d97 ¤   ¤   ¤   if( err.IsntError() )
53f776 ¤   ¤   ¤   {
db477f ¤   ¤   ¤   ¤   err = AddPublicKey( diskFileRef, theKey,
f488bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &decryptedKey, readOnly, locked );
--4a7c 0004168584840120020 Page 29 of PGPDiskFile.c
cfa3a6 ¤   ¤   ¤   }
290fe4 ¤   ¤   }
959371 ¤   }
0767c5 ¤
16deb7 ¤   return( err );
e0efe6 }
b7af5a
3385ea ¤   OSStatus
c7f6c3 GetIndPublicPGPDiskKey(
f3c0be ¤   PGPDiskFileRef¤ diskFileRef,
0c8200 ¤   UInt32¤ ¤   ¤   index,
1d59cf ¤   PGPDiskKeyRef¤  *keyRefPtr)
6bbb36 {
b3dc42 ¤   OSStatus¤   err;
16af5a
2c3654 ¤   err = VerifyPGPDiskFileRef( diskFileRef );
97ee03 ¤   if( IsntErr( err ) )
d1c7a1 ¤   {
1247c4 ¤   ¤   err = GetIndKey( diskFileRef, index, FALSE, TRUE, keyRefPtr );
779371 ¤   }
4a67c5 ¤
68deb7 ¤   return( err );
19efe6 }
daaf5a
9185b7 ¤   CComboError
ca3ec0 GetPublicPGPDiskKeyInfo(
b7b4ec ¤   PGPDiskKeyRef¤  ¤   ¤   keyRef,
05f2be ¤   PGPKeyID¤   ¤   ¤   ¤   *keyID,
853f75 ¤   PGPPublicKeyAlgorithm¤  *algorithm,
60c4ab ¤   PGPBoolean¤ ¤   ¤   ¤   *locked)
4cbb36 {
76b8e5 ¤   CComboError¤err;
1aaf5a
36284a ¤   err.err = VerifyPGPDiskKeyRef( keyRef );
ddd3cb ¤   if( err.IsntError() )
58c7a1 ¤   {
aa7156 ¤   ¤   if( keyRef->isPassphraseKey )
c65b34 ¤   ¤   {
3dc1b8 ¤   ¤   ¤   err.err = paramErr;
f70fe4 ¤   ¤   }
8f0e1d ¤   ¤   else
6a5b34 ¤   ¤   {
b5f927 ¤   ¤   ¤   PGPByte¤*exportedKeyID;
411b52 ¤   ¤
41e8ad ¤   ¤   ¤   exportedKeyID = (PGPByte *) keyRef->publicKey +
027bd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyRef->publicKey->keyIDOffset;
f587c7 ¤   ¤   ¤
455844 ¤   ¤   ¤   *algorithm ¤= keyRef->publicKey->algorithm;
b81b52 ¤   ¤
0d0075 ¤   ¤   #if PGP_BUSINESS_SECURITY
2ef18f ¤   ¤   ¤   *locked = keyRef->publicKey->locked;
e0ebf6 ¤   ¤   #else
f7aa42 ¤   ¤   ¤   *locked¤= FALSE;
f6d656 ¤   ¤   #endif
c887c7 ¤   ¤   ¤
5f0a38 ¤   ¤   ¤   err.pgpErr = PGPImportKeyID( exportedKeyID, keyID );
420fe4 ¤   ¤   }
889371 ¤   }
bd67c5 ¤
abdeb7 ¤   return( err );
81efe6 }
c8af5a
d0af5a
833872 #endif¤ // ] PGPDISK_PUBLIC_KEY
d4af5a
9885b7 ¤   CComboError
2894ab FindPGPDiskKey(
5b6e46 ¤   PGPDiskFileRef¤ ¤   diskFileRef,
5d799e ¤   ConstStr255Param¤   passphrase,
cf117d ¤   PGPDiskKeyRef¤  ¤   *keyRefPtr)
bfbb36 {
41b8e5 ¤   CComboError¤err;
--c123 0004d0bd92940120020 Page 30 of PGPDiskFile.c
2a67c5 ¤
c4c1dc ¤   err.err = FindPassphrasePGPDiskKey( diskFileRef, passphrase, keyRefPtr );
53af5a
96ea4b #if PGPDISK_PUBLIC_KEY
6bde8c ¤   if( err.err == kPGPDiskIncorrectPassphraseError &&
75fd47 ¤   ¤   GetPublicPGPDiskKeyCount( diskFileRef ) > 0 )
0cc7a1 ¤   {
36ed51 ¤   ¤   err = FindPublicPGPDiskKey( diskFileRef, passphrase, keyRefPtr );
c69371 ¤   }
817454 #endif
6367c5 ¤
c1deb7 ¤   return( err );
01efe6 }
8eaf5a
3b85b7 ¤   CComboError
f21a81 DecryptPGPDiskKey(
1cfc5e ¤   PGPDiskKeyRef¤  ¤   keyRef,
20799e ¤   ConstStr255Param¤   passphrase,
bb2d26 ¤   CASTKey¤¤   ¤   ¤   *decryptedKey)
c3bb36 {
04b8e5 ¤   CComboError¤err;
a167c5 ¤
48284a ¤   err.err = VerifyPGPDiskKeyRef( keyRef );
e2d3cb ¤   if( err.IsntError() )
d6c7a1 ¤   {
a47156 ¤   ¤   if( keyRef->isPassphraseKey )
955b34 ¤   ¤   {
dad504 ¤   ¤   ¤   err.err = DecryptPassphraseKey( keyRef->passKey,
048cde ¤   ¤   ¤   ¤   ¤   ¤   &keyRef->diskFile->mainHeader->salt, passphrase,
4d53fc ¤   ¤   ¤   ¤   ¤   ¤   decryptedKey );
e30fe4 ¤   ¤   }
c70e1d ¤   ¤   else
195b34 ¤   ¤   {
9e08aa ¤   #if PGPDISK_PUBLIC_KEY
2e6a38 ¤   ¤   ¤   err.pgpErr = LoadKeyRings( keyRef->diskFile );
f06d97 ¤   ¤   ¤   if( err.IsntError() )
e8f776 ¤   ¤   ¤   {
8ed08c ¤   ¤   ¤   ¤   PGPByte¤¤   *exportedKeyID;
7d3500 ¤   ¤   ¤   ¤   PGPKeyID¤   keyID;
fc87c7 ¤   ¤   ¤
952cb1 ¤   ¤   ¤   ¤   exportedKeyID = (PGPByte *) keyRef->publicKey +
8760dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyRef->publicKey->keyIDOffset;
f62b85 ¤   ¤   ¤   ¤
46119c ¤   ¤   ¤   ¤   err.pgpErr = PGPImportKeyID( exportedKeyID, &keyID );
9282e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
1672c3 ¤   ¤   ¤   ¤   {
7679fd ¤   ¤   ¤   ¤   ¤   PGPKeyRef¤  theKey;
49ae30 ¤   ¤   ¤   ¤   ¤
c5d1d4 ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPGetKeyByKeyID( keyRef->diskFile->keySet,
4a9b4a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID, keyRef->publicKey->algorithm,
7deddd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theKey );
dcbe0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
cd4859 ¤   ¤   ¤   ¤   ¤   {
8134ff ¤   ¤   ¤   ¤   ¤   ¤   PGPByte¤¤   *encryptedKey;
38af5a
278bc6 ¤   ¤   ¤   ¤   ¤   ¤   encryptedKey = (PGPByte *) keyRef->publicKey +
1c1388 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyRef->publicKey->encryptedKeyOffset;
64af5a
9746d3 ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = DecryptPublicKey( theKey, passphrase,
9cdf31 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   encryptedKey,
37b5dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyRef->publicKey->encryptedKeySize,
d2259f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyRef->publicKey->checkBytes,
790027 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   decryptedKey );
141c89 ¤   ¤   ¤   ¤   ¤   }
e32613 ¤   ¤   ¤   ¤   }
dea3a6 ¤   ¤   ¤   }
6eb7ec ¤   #endif
0c0fe4 ¤   ¤   }
389371 ¤   }
5d67c5 ¤
dedeb7 ¤   return( err );
4defe6 }
--d4fe 000a954d95540120020 Page 31 of PGPDiskFile.c
e0af5a
272473 ¤   static OSStatus
4b8ee4 GetIndKey(
00c0be ¤   PGPDiskFileRef¤ diskFileRef,
538200 ¤   UInt32¤ ¤   ¤   index,
ee1cb0 ¤   Boolean¤¤   ¤   searchPassphraseKeys,
fc7897 ¤   Boolean¤¤   ¤   searchPublicKeys,
dc59cf ¤   PGPDiskKeyRef¤  *keyRefPtr)
bbbb36 {
3e9541 ¤   PGPDiskKeyRef¤  keyRef = kInvalidPGPDiskKeyRef;
90156f ¤   OSStatus¤   ¤   err;
7e67c5 ¤
612fa4 ¤   (void) searchPublicKeys;
1e67c5 ¤
0b3654 ¤   err = VerifyPGPDiskFileRef( diskFileRef );
0bee03 ¤   if( IsntErr( err ) )
f3c7a1 ¤   {
4194ae ¤   ¤   UInt32¤ foundKeys = 0;
361b52 ¤   ¤
2926e8 ¤   ¤   if( searchPassphraseKeys )
645b34 ¤   ¤   {
ea34d2 ¤   ¤   ¤   UInt32¤ keyIndex;
2faf5a
305d37 ¤   ¤   ¤   for( keyIndex = 0;
911bae ¤   ¤   ¤   ¤   ¤   keyIndex < diskFileRef->mainHeader->numPassphrases;
1a0b44 ¤   ¤   ¤   ¤   ¤   ¤   ++keyIndex )
7af776 ¤   ¤   ¤   {
c9574f ¤   ¤   ¤   ¤   PassphraseKey *¤userInfo = nil;
f687c7 ¤   ¤   ¤
94b5a2 ¤   ¤   ¤   ¤   userInfo = &diskFileRef->mainHeader->
7dc271 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passphrases[keyIndex];
ce2b85 ¤   ¤   ¤   ¤
20a735 ¤   ¤   ¤   ¤   if ( userInfo->inUse )
5772c3 ¤   ¤   ¤   ¤   {
369425 ¤   ¤   ¤   ¤   ¤   if( foundKeys == index )
bb4859 ¤   ¤   ¤   ¤   ¤   {
2dee29 ¤   ¤   ¤   ¤   ¤   ¤   err = NewPassphrasePGPDiskKeyRef( diskFileRef,
5c3631 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   userInfo,
234467 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyIndex == kMasterPassphraseIndex,
ae0d65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyRef );
6600eb ¤   ¤   ¤   ¤   ¤   ¤   break;
961c89 ¤   ¤   ¤   ¤   ¤   }
114bd6 ¤   ¤   ¤   ¤   ¤   else
ac4859 ¤   ¤   ¤   ¤   ¤   {
fd603f ¤   ¤   ¤   ¤   ¤   ¤   ++foundKeys;
1b1c89 ¤   ¤   ¤   ¤   ¤   }
162613 ¤   ¤   ¤   ¤   }
32a3a6 ¤   ¤   ¤   }
270fe4 ¤   ¤   }
9f1b52 ¤   ¤
b208aa ¤   #if PGPDISK_PUBLIC_KEY
dbd42f ¤   ¤   if( IsntErr( err ) &&
6dda51 ¤   ¤   ¤   ! PGPDiskKeyRefIsValid( keyRef ) &&
ff2efe ¤   ¤   ¤   searchPublicKeys )
d75b34 ¤   ¤   {
5b7038 ¤   ¤   ¤   PGPDiskHeaderListItem¤  *curHeaderItem;
7487c7 ¤   ¤   ¤
2310d6 ¤   ¤   ¤   curHeaderItem = diskFileRef->headerList;
4ee72e ¤   ¤   ¤   while( IsntNull( curHeaderItem ) )
eff776 ¤   ¤   ¤   {
32ebe1 ¤   ¤   ¤   ¤   if( curHeaderItem->header->headerType ==
9b22d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskPublicKeyHeaderType )
e472c3 ¤   ¤   ¤   ¤   {
7e9425 ¤   ¤   ¤   ¤   ¤   if( foundKeys == index )
664859 ¤   ¤   ¤   ¤   ¤   {
a0518b ¤   ¤   ¤   ¤   ¤   ¤   PGPDiskPublicKeyHeader¤ *pubKeyHeader;
b0ae30 ¤   ¤   ¤   ¤   ¤
89261e ¤   ¤   ¤   ¤   ¤   ¤   pubKeyHeader = (PGPDiskPublicKeyHeader *)
5e3a21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   curHeaderItem->header;
66af5a
bd8a8c ¤   ¤   ¤   ¤   ¤   ¤   err = NewPublicPGPDiskKeyRef( diskFileRef,
a9ad96 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pubKeyHeader, &keyRef );
--bef7 001d673e53340120020 Page 32 of PGPDiskFile.c
d300eb ¤   ¤   ¤   ¤   ¤   ¤   break;
5d1c89 ¤   ¤   ¤   ¤   ¤   }
854bd6 ¤   ¤   ¤   ¤   ¤   else
654859 ¤   ¤   ¤   ¤   ¤   {
34603f ¤   ¤   ¤   ¤   ¤   ¤   ++foundKeys;
791c89 ¤   ¤   ¤   ¤   ¤   }
432613 ¤   ¤   ¤   ¤   }
a087c7 ¤   ¤   ¤
e7502e ¤   ¤   ¤   ¤   curHeaderItem = curHeaderItem->next;
cda3a6 ¤   ¤   ¤   }
f80fe4 ¤   ¤   }
b8b7ec ¤   #endif
9b1b52 ¤   ¤
7ad42f ¤   ¤   if( IsntErr( err ) &&
04d4b0 ¤   ¤   ¤   ! PGPDiskKeyRefIsValid( keyRef ) )
8d5b34 ¤   ¤   {
7bd72b ¤   ¤   ¤   err = kEndOfKeyIterationError;
c00fe4 ¤   ¤   }
309371 ¤   }
ae67c5 ¤
50c121 ¤   *keyRefPtr = keyRef;
d167c5 ¤
9adeb7 ¤   return( err );
3fefe6 }
dcaf5a
2085ea ¤   OSStatus
28d8b9 GetIndPassphrasePGPDiskKey(
7bc0be ¤   PGPDiskFileRef¤ diskFileRef,
df8200 ¤   UInt32¤ ¤   ¤   index,
9259cf ¤   PGPDiskKeyRef¤  *keyRefPtr)
b0bb36 {
77dc42 ¤   OSStatus¤   err;
a967c5 ¤
0a3654 ¤   err = VerifyPGPDiskFileRef( diskFileRef );
a3ee03 ¤   if( IsntErr( err ) )
b7c7a1 ¤   {
98a3ea ¤   ¤   err = GetIndKey( diskFileRef, index, TRUE, FALSE, keyRefPtr );
d29371 ¤   }
5d67c5 ¤
4edeb7 ¤   return( err );
07efe6 }
4baf5a
1c85ea ¤   OSStatus
1a7d27 GetIndPGPDiskKey(
c3c0be ¤   PGPDiskFileRef¤ diskFileRef,
7e8200 ¤   UInt32¤ ¤   ¤   index,
fc59cf ¤   PGPDiskKeyRef¤  *keyRefPtr)
9bbb36 {
01dc42 ¤   OSStatus¤   err;
2aaf5a
583654 ¤   err = VerifyPGPDiskFileRef( diskFileRef );
93ee03 ¤   if( IsntErr( err ) )
22c7a1 ¤   {
6c71ec ¤   ¤   err = GetIndKey( diskFileRef, index, TRUE, TRUE, keyRefPtr );
929371 ¤   }
0e67c5 ¤
bcdeb7 ¤   return( err );
4cefe6 }
a5af5a
d6af5a
--7ca4 0004ba868d540120021 Page 1 of PGPDiskFile.h
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
646681 ¤   $Id: PGPDiskFile.h,v 1.4.8.1 1998/11/12 03:05:22 heller Exp $
b7f7f7 ____________________________________________________________________________*/
4aaf5a
a37b7d #pragma once
bcaf5a
8b76f0 #include "CComboError.h"
19c5d5 #include "pgpBase.h"
262465 #include "PGPDiskFileFormat.h"
e3af5a
c7ea4b #if PGPDISK_PUBLIC_KEY
e8a076 #include "pgpKeys.h"
1d7454 #endif
8baf5a
03e0d5 typedef struct PGPDiskFile¤ ¤   ¤   ¤   *PGPDiskFileRef;
327f82 typedef struct PGPDiskKey¤  ¤   ¤   ¤   *PGPDiskKeyRef;
eeaf5a
adeadb #define¤kInvalidPGPDiskFileRef¤ ¤   ¤   ((PGPDiskFileRef) NULL)
99d172 #define PGPDiskFileRefIsValid( ref )¤   ( (ref) != kInvalidPGPDiskFileRef )
f5af5a
5327c5 #define¤kInvalidPGPDiskKeyRef¤  ¤   ¤   ((PGPDiskKeyRef) NULL)
741eea #define PGPDiskKeyRefIsValid( ref )¤¤   ( (ref) != kInvalidPGPDiskKeyRef )
02af5a
b91743 enum PGPDiskKeyProperty_
dabb36 {
b1ff61 ¤   /* Boolean key properties */
21ec5c ¤   kPGPDiskKeyProperty_MountReadOnly¤  = 1,
055a7f ¤   kPGPDiskKeyProperty_CanRemove¤  ¤   = 2,
1f3aa8 ¤   kPGPDiskKeyProperty_IsMasterKey¤¤   = 3,
6faf5a
0137e3 ¤   PGP_ENUM_FORCE( PGPDiskKeyProperty_ )
0782f7 };
7baf5a
8d85d7 PGPENUM_TYPEDEF( PGPDiskKeyProperty_, PGPDiskKeyProperty );
dcaf5a
c2d8fb OSStatus¤   AddPassphrasePGPDiskKey(PGPDiskFileRef diskFileRef,
1c79c6 ¤   ¤   ¤   ¤   ¤   ConstStr255Param masterPassphrase,
7c79aa ¤   ¤   ¤   ¤   ¤   ConstStr255Param keyPassphrase, Boolean readOnly);
42ea5e OSStatus¤   ChangePGPDiskKeyPassphrase(PGPDiskKeyRef keyRef,
228d2c ¤   ¤   ¤   ¤   ¤   ConstStr255Param oldPassphrase,
db10df ¤   ¤   ¤   ¤   ¤   ConstStr255Param newPassphrase);
79d289 void¤   ¤   ClosePGPDiskFile(PGPDiskFileRef diskFileRef);
23621a CComboError¤DecryptPGPDiskKey(PGPDiskKeyRef keyRef,
dd1db8 ¤   ¤   ¤   ¤   ¤   ConstStr255Param passphrase, CASTKey *decryptedKey);
fe63fc void¤   ¤   DisposePGPDiskKey(PGPDiskKeyRef keyRef);
e3a3d2 OSStatus¤   FindPassphrasePGPDiskKey(PGPDiskFileRef diskFileRef,
ceeaf9 ¤   ¤   ¤   ¤   ¤   ConstStr255Param passphrase, PGPDiskKeyRef *keyRefPtr);
7305a8 CComboError¤FindPGPDiskKey(PGPDiskFileRef diskFileRef,
5feaf9 ¤   ¤   ¤   ¤   ¤   ConstStr255Param passphrase, PGPDiskKeyRef *keyRefPtr);
b13aa5 OSStatus¤   GetIndPassphrasePGPDiskKey(PGPDiskFileRef diskFileRef,
7319cf ¤   ¤   ¤   ¤   ¤   UInt32 index, PGPDiskKeyRef *keyRefPtr);
b662a6 OSStatus¤   GetIndPGPDiskKey(PGPDiskFileRef diskFileRef,
b819cf ¤   ¤   ¤   ¤   ¤   UInt32 index, PGPDiskKeyRef *keyRefPtr);
b3211e OSStatus¤   GetMasterPGPDiskKey(PGPDiskFileRef diskFileRef,
469373 ¤   ¤   ¤   ¤   ¤   PGPDiskKeyRef *keyRefPtr);
c386d9 OSStatus¤   GetPGPDiskKeyBoolean(PGPDiskKeyRef keyRef,
686e2f ¤   ¤   ¤   ¤   ¤   PGPDiskKeyProperty property, Boolean *value);
391e13 OSStatus¤   OpenPGPDiskFile(const FSSpec *fileSpec,
05e582 ¤   ¤   ¤   ¤   ¤   PGPDiskFileRef *diskFileRefPtr);
659fa9 OSStatus¤   RemovePGPDiskKey(PGPDiskKeyRef keyRef);
5a3455 OSStatus¤   SavePGPDiskFile(PGPDiskFileRef diskFileRef);
d1b114 OSStatus¤   NewPGPDiskFile(const FSSpec *fileSpec, PGPUInt32 diskSizeInK,
9eb848 ¤   ¤   ¤   ¤   ¤   PGPDiskEncryptionAlgorithm algorithm,
169ade ¤   ¤   ¤   ¤   ¤   ConstStr255Param masterPassphrase);
3663a0 OSStatus¤   VerifyPGPDiskKeyPassphrase(PGPDiskKeyRef keyRef,
5da204 ¤   ¤   ¤   ¤   ¤   ConstStr255Param passphrase);
1eaf5a
acfe2c const PGPDiskFileHeader *PeekPGPDiskFileHeader(PGPDiskFileRef diskFileRef);
4baf5a
--da03 0018cc8d1fc40120021 Page 2 of PGPDiskFile.h
9ec3d4 #if PGPDISK_PUBLIC_KEY¤ /* [ */
50af5a
23270d CComboError¤AddPublicPGPDiskKey(PGPDiskFileRef diskFileRef, PGPKeyRef theKey,
2f8d2f ¤   ¤   ¤   ¤   ¤   ConstStr255Param masterPassphrase, Boolean readOnly,
6e9e5a ¤   ¤   ¤   ¤   ¤   Boolean locked);
30022b OSStatus¤   GetIndPublicPGPDiskKey(PGPDiskFileRef diskFileRef,
6c19cf ¤   ¤   ¤   ¤   ¤   UInt32 index, PGPDiskKeyRef *keyRefPtr);
5b834e UInt32¤ ¤   GetPublicPGPDiskKeyCount(PGPDiskFileRef diskFileRef);
11c742 CComboError¤GetPublicPGPDiskKeyInfo(PGPDiskKeyRef keyRef, PGPKeyID *keyID,
f2fdfd ¤   ¤   ¤   ¤   ¤   PGPPublicKeyAlgorithm *algorithm, PGPBoolean *locked);
68ae30 ¤   ¤   ¤   ¤   ¤
8cde98 #endif¤ /* ] PGPDISK_PUBLIC_KEY */¤ ¤
--c8ff 00036dec22340120022 Page 1 of PGPDiskPreferences.c
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
889291 ¤   $Id: PGPDiskPreferences.c,v 1.4.8.1 1998/11/12 03:05:22 heller Exp $
92f7f7 ____________________________________________________________________________*/
b9af5a
81c110 #include "pgpMacMemory.h"
6a85c2 #include "MacStrings.h"
79af5a
65de36 #include "PGPDisk.h"
338ec6 #include "PGPDiskPreferences.h"
8a0927 #include "PGPDiskResources.h"
96e5dd #include "PGPDiskUtils.h"
fa0421 #include "SleepAlert.h"
1faf5a
0f5293 const OSType¤   kPrefsMagic ¤   = kPrefsFileType;
cea31f const ushort¤   kPrefsVersion¤  = 0x0100;
d6af5a
9eaf5a
7472d1 PGPDiskPrefs¤   gPGPDiskPrefs;
2baf5a
d933c8 ¤   static void
61d2ac InitDefaultPreferences(PGPDiskPrefs *prefs)
c0bb36 {
fde038 ¤   pgpAssertAddrValid( prefs, PGPDiskPrefs );
2367c5 ¤
6f747f ¤   pgpClearMemory( prefs, sizeof( *prefs ) );
2167c5 ¤
5b8f72 ¤   prefs->magic ¤  = kPrefsMagic;
5dc5c4 ¤   prefs->version¤ = kPrefsVersion;
2167c5 ¤
8eea16 ¤   prefs->driverPrefs¤ = kDefaultPGPDiskDriverPrefs;
0a67c5 ¤
9769db ¤   prefs->newDiskDefaultSize¤  = 10;
ca1ea7 ¤   prefs->newDiskDefaultIsMB¤  = TRUE;
a3ac3e ¤   prefs->mainWindowLocation.v¤= 0;
b49fd6 ¤   prefs->mainWindowLocation.h¤= 0;
e4efe6 }
32af5a
5dcd8d ¤   static Boolean
be4fa6 ValidatePreferences(PGPDiskPrefs *prefs)
2dbb36 {
d3e038 ¤   pgpAssertAddrValid( prefs, PGPDiskPrefs );
5067c5 ¤
bcf653 ¤   if( prefs->magic != kPrefsMagic )
a3c7a1 ¤   {
ac9cda ¤   ¤   pgpDebugMsg( "ValidatePreferences: Invalid preferences magic" );
c1e20d ¤   ¤   return( FALSE );
8c9371 ¤   }
c267c5 ¤
2bf11f ¤   if( prefs->version != kPrefsVersion )
1dc7a1 ¤   {
90ced2 ¤   ¤   pgpDebugMsg( "ValidatePreferences: Invalid preferences version" );
06e20d ¤   ¤   return( FALSE );
b69371 ¤   }
6567c5 ¤
8a5c2d ¤   if( prefs->driverPrefs.unmountAfterIdleTime == 0 )
1fc7a1 ¤   {
7dd67a ¤   ¤   prefs->driverPrefs.unmountIdleTimeSeconds = 1 * 60;
7f9371 ¤   }
4267c5 ¤
651966 ¤   return( TRUE );
1defe6 }
cbaf5a
6685ea ¤   OSStatus
8a4da8 GetPrefsFileSpec(FSSpec *fileSpec)
2cbb36 {
73c412 ¤   OSStatus¤   status;
0567c5 ¤
859dd5 ¤   pgpAssertAddrValid( fileSpec, FSSpec );
3667c5 ¤
--cd78 0007a48033a40120022 Page 2 of PGPDiskPreferences.c
d30f2f ¤   status = FindPGPPreferencesFolder( kOnSystemDisk, &fileSpec->vRefNum,
4a24f4 ¤   ¤   ¤   ¤   ¤   ¤   &fileSpec->parID );
b4dd30 ¤   if( IsntErr( status ) )
6cc7a1 ¤   {
449dd4 ¤   ¤   Str255¤ prefsFileName;
d21b52 ¤   ¤
522c6d ¤   ¤   GetIndString( prefsFileName, kMiscStringsListResID,
aa5c4f ¤   ¤   ¤   ¤   kPreferencesFilenameStrIndex );
13e5e3 ¤   ¤   if( prefsFileName[0] != 0 && prefsFileName[0] <= 31 )
705b34 ¤   ¤   {
e9b341 ¤   ¤   ¤   CopyPString( prefsFileName, fileSpec->name );
c30fe4 ¤   ¤   }
d30e1d ¤   ¤   else
185b34 ¤   ¤   {
440f64 ¤   ¤   ¤   status = bdNamErr;
920fe4 ¤   ¤   }
a99371 ¤   }
3767c5 ¤
0b4afd ¤   return( status );
45efe6 }
dfaf5a
0d6d52 ¤   void
d61313 WritePreferences(const PGPDiskPrefs *prefs)
e7bb36 {
14c412 ¤   OSStatus¤   status;
08fc44 ¤   FSSpec¤ ¤   fileSpec;
2d67c5 ¤
8fe038 ¤   pgpAssertAddrValid( prefs, PGPDiskPrefs );
3c67c5 ¤
625e6d ¤   status = GetPrefsFileSpec( &fileSpec );
d8dd30 ¤   if( IsntErr( status ) )
26c7a1 ¤   {
2213b4 ¤   ¤   (void) FSpRstFLock( &fileSpec );
5ddaa7 ¤   ¤   (void) FSpDelete( &fileSpec );
271b52 ¤   ¤
aba2c9 ¤   ¤   status = FSpCreate( &fileSpec, kPGPDiskFileCreator, kPrefsFileType,
de69e5 ¤   ¤   ¤   ¤   ¤   ¤   smSystemScript );
37706e ¤   ¤   if( IsntErr( status ) )
4f5b34 ¤   ¤   {
cb5b24 ¤   ¤   ¤   short¤  fileRef;
8087c7 ¤   ¤   ¤
c15f66 ¤   ¤   ¤   status = FSpOpenDF( &fileSpec, fsRdWrPerm, &fileRef );
edfb92 ¤   ¤   ¤   if( IsntErr( status ) )
a3f776 ¤   ¤   ¤   {
1a8eab ¤   ¤   ¤   ¤   long¤   count;
932b85 ¤   ¤   ¤   ¤
b20e0d ¤   ¤   ¤   ¤   count = sizeof( *prefs );
502b85 ¤   ¤   ¤   ¤
02b804 ¤   ¤   ¤   ¤   status = FSWrite( fileRef, &count, prefs );
db87c7 ¤   ¤   ¤
e8df0e ¤   ¤   ¤   ¤   (void) FSClose( fileRef );
95a3a6 ¤   ¤   ¤   }
764f2c ¤   ¤   ¤   FlushVol( nil, fileSpec.vRefNum );
d90fe4 ¤   ¤   }
d69371 ¤   }
9f67c5 ¤
2bc32e ¤   CopySleepAlertToPrefs();
1467c5 ¤
6ba025 ¤   AssertNoErr( status, "WritePrefs" );
16efe6 }
d3af5a
5e6d52 ¤   void
946370 ReadPreferences(PGPDiskPrefs *prefs)
d3bb36 {
36c412 ¤   OSStatus¤   status;
8dfc44 ¤   FSSpec¤ ¤   fileSpec;
b367c5 ¤
32e038 ¤   pgpAssertAddrValid( prefs, PGPDiskPrefs );
0d67c5 ¤
815e6d ¤   status = GetPrefsFileSpec( &fileSpec );
cddd30 ¤   if( IsntErr( status ) )
7ac7a1 ¤   {
--6627 0010cc5cc8140120022 Page 3 of PGPDiskPreferences.c
c66f79 ¤   ¤   short¤  fileRef;
831b52 ¤   ¤
016469 ¤   ¤   status = FSpOpenDF( &fileSpec, fsRdPerm, &fileRef );
92706e ¤   ¤   if( IsntErr( status ) )
265b34 ¤   ¤   {
289a83 ¤   ¤   ¤   long¤   count;
8787c7 ¤   ¤   ¤
c032e3 ¤   ¤   ¤   count = sizeof( *prefs );
2887c7 ¤   ¤   ¤
170a0e ¤   ¤   ¤   status = FSRead( fileRef, &count, prefs );
c9fb92 ¤   ¤   ¤   if( IsntErr( status ) )
fef776 ¤   ¤   ¤   {
146522 ¤   ¤   ¤   ¤   if( ! ValidatePreferences( prefs ) )
c38bea ¤   ¤   ¤   ¤   ¤   status = -1;
dea3a6 ¤   ¤   ¤   }
4887c7 ¤   ¤   ¤
52d142 ¤   ¤   ¤   (void) FSClose( fileRef );
670fe4 ¤   ¤   }
979371 ¤   }
bd67c5 ¤
15a187 ¤   if( IsErr( status ) )
85c7a1 ¤   {
c2bc77 ¤   ¤   pgpAssert( status == fnfErr );
e5c911 ¤   ¤   InitDefaultPreferences( prefs );
3a9371 ¤   }
c8efe6 }
6eaf5a
f485ea ¤   OSStatus
58b28e SendPreferencesToAllDrivers(const PGPDiskDriverPrefs *driverPrefs)
46bb36 {
090aa3 ¤   OSStatus¤   ¤   err¤= nsDrvErr;
5fc33b ¤   const ushort¤   kMaxDrivers¤= 100;
57bf57 ¤   short¤  ¤   ¤   driverRefNums[ kMaxDrivers ];
514451 ¤   ushort ¤¤   ¤   numDrivers;
db67c5 ¤
02a2bc ¤   pgpAssertAddrValid( driverPrefs, PGPDiskDriverPrefs );
aaaf5a
efe7b9 ¤   GetAllPGPDiskDrivers( driverRefNums, kMaxDrivers, &numDrivers);
42422e ¤   for( ushort driverIndex = 0; driverIndex < numDrivers; ++driverIndex )
9ac7a1 ¤   {
82c73b ¤   ¤   OSStatus¤   tempErr;
521b52 ¤   ¤
b6e2c7 ¤   ¤   tempErr = SendPreferencesToDriver( driverRefNums[ driverIndex ],
fba6f3 ¤   ¤   ¤   ¤   ¤   ¤   driverPrefs );
1c5c0b ¤   ¤   if( IsErr( tempErr ) && IsntErr( err ) )
ecf2aa ¤   ¤   ¤   err = tempErr;
799371 ¤   }
111b52 ¤   ¤
74deb7 ¤   return( err );
73efe6 }
0caf5a
--b2e6 0011a02735540120023 Page 1 of PGPDiskPreferences.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
6e8f4a ¤   $Id: PGPDiskPreferences.h,v 1.2.8.1 1998/11/12 03:05:23 heller Exp $
d1f7f7 ____________________________________________________________________________*/
fbaf5a
7e7b7d #pragma once
33af5a
bd58cd #include "DriverPrefs.h"
b4af5a
200633 const OSType¤   kPrefsFileType¤ = 'Pref';
39af5a
49af5a
4aaf46 #pragma options align=mac68k
79af5a
ce1662 typedef struct PGPDiskPrefs
02bb36 {
1c18d1 ¤   OSType¤ ¤   magic;
4001e8 ¤   ushort¤ ¤   version;
e467c5 ¤
90da80 ¤   PGPDiskDriverPrefs¤ driverPrefs;
99af5a
8d757c ¤   UInt32¤ ¤   newDiskDefaultSize;
2dfe71 ¤   Boolean¤¤   newDiskDefaultIsMB;
723163 ¤   Boolean¤¤   reserved;
70a220 ¤   Point¤  ¤   mainWindowLocation;
86f9bf ¤   UInt32¤ ¤   lastSplashShowTime;
3d8976 ¤   UInt32¤ ¤   reservedLongs[10];
72af5a
42742f } PGPDiskPrefs;
67af5a
c97c46 #pragma options align=reset
faaf5a
916773 OSStatus¤   GetPrefsFileSpec(FSSpec *fileSpec);
f345ab void¤   ¤   ReadPreferences(PGPDiskPrefs *prefs);
143d28 OSStatus¤   SendPreferencesToAllDrivers(const PGPDiskDriverPrefs *driverPrefs);
164072 void¤   ¤   WritePreferences(const PGPDiskPrefs *prefs);
87af5a
d86cca extern¤ PGPDiskPrefs gPGPDiskPrefs;
1aaf5a
--e263 001465b37fb40120024 Page 1 of PGPdiskAppShared.prefix
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
3e063a ¤   $Id: PGPdiskAppShared.prefix,v 1.6.8.1 1998/11/12 03:05:24 heller Exp $
e1f7f7 ____________________________________________________________________________*/
5daf5a
3faf5a
ee77e0 #if __POWERPC__
14e322 ¤   #include <MacHeadersPPC++>
38fc58 #elif __CFM68K__
a264be ¤   #include <MacHeadersCFM68K++>
6cdb21 #else
73e3a3 ¤   #include <MacHeaders68K++>
f87454 #endif
acaf5a
973b59 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   ¤   ¤   PGP_DEBUG
bd92a8 #define USE_MAC_DEBUG_PATCHES¤  ¤   ¤   ¤   PGP_DEBUG
9440f2 #define MAC_DEBUG_PATCHES_WHACK_FREE_SPACE¤ PGP_DEBUG
52ca4f #define USE_PGP_LEAKS¤  ¤   ¤   ¤   ¤   ¤   PGP_DEBUG
58b75d #define USE_MAC_DEBUG_LEAKS¤¤   ¤   ¤   ¤   PGP_DEBUG
ba67f1 #define PGP_DEBUG_FIND_LEAKS¤   ¤   ¤   ¤   PGP_DEBUG
e7af5a
28af5a
a5f692 #include "PGPDiskShared.prefix"
efaf5a
32709d #define USE_CAST_DECRYPT_CODE¤  ¤   1
46af5a
--ca73 001c19ceca440120025 Page 1 of CipherContext.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
ab0cfa ¤   $Id: CipherContext.h,v 1.2.8.1 1998/11/12 03:05:28 heller Exp $
72f7f7 ____________________________________________________________________________*/
15af5a
a17b7d #pragma once
51af5a
6baf5a
fb3cd9 #include "PGPDiskCastCFB.h"
42af5a
e1af5a
a3af5a
9ad7f3 typedef union PassphraseSalt
11c7a1 ¤   {
ebac87 ¤   UInt8¤  saltBytes[ 8 ];
0d37d5 ¤   UInt32¤ saltLongs[ 8 / sizeof( UInt32 ) ];
48eff1 ¤   } PassphraseSalt;
d6af5a
aa7e17 typedef struct CipherContext
38c7a1 ¤   {
cf3968 ¤   CASTCFBContext¤ castCFB;
a067c5 ¤
f20a46 ¤   // random data used to salt passphrase and IVs
4fe432 ¤   PassphraseSalt¤ salt;
5afe3a ¤   } CipherContext;
96af5a
b9af5a
e2be31 typedef union CASTKey
c2c7a1 ¤   {
aea633 ¤   UInt8¤  keyBytes[ 16 ];
cba06f ¤   UInt32¤ keyLongs[ 16 / sizeof( UInt32 ) ];
bbea06 ¤   } CASTKey;
04af5a
c19dc9 typedef CASTKey¤¤   EncryptedCASTKey;
--ba70 000554d73d240120026 Page 1 of CipherProc.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
f7eab0 ¤   $Id: CipherProc.h,v 1.4.8.1 1998/11/12 03:05:28 heller Exp $
c7f7f7 ____________________________________________________________________________*/
beaf5a
8c7b7d #pragma once
c5af5a
53af5a
30af5a
943379 #ifdef __cplusplus
376dad extern "C" {
d37454 #endif
a6af5a
b9af5a
d6be95 typedef struct CipherContext¤   CipherContext;
b9af5a
1daf5a
90ec1b typedef enum·
d4c7a1 ¤   {
2ca032 ¤   kCipherOp_Encrypt = 13,
4161b7 ¤   kCipherOp_Decrypt,
12cfd3 ¤   kCipherOp_Init,
30f02d ¤   kCipherOp_Verify,
64c6ae ¤   kDummyCipherOp = 65536
81a619 ¤   } CipherOp;
f7af5a
8faf5a
1473a3 #if PRAGMA_STRUCT_ALIGN
25af46 #pragma options align=mac68k
fd7454 #endif
49af5a
5b1741 typedef struct
4ec7a1 ¤   {
813fa4 ¤   CipherOp¤   op;
1a67c5 ¤
01ddd9 ¤   const CipherContext *¤  context;
8467c5 ¤
58f20a ¤   union
665b34 ¤   ¤   {
a92b33 ¤   ¤   struct
57f776 ¤   ¤   ¤   {
40dfcc ¤   ¤   ¤   const void *¤   src;
92874a ¤   ¤   ¤   void *¤ ¤   ¤   dest;
e0790b ¤   ¤   ¤   ItemCount¤  ¤   startBlock;
392e99 ¤   ¤   ¤   ItemCount¤  ¤   numBlocks;
fe37d6 ¤   ¤   ¤   } doCipher;
d71b52 ¤   ¤
2d2b33 ¤   ¤   struct
e6f776 ¤   ¤   ¤   {
cbfcd4 ¤   ¤   ¤   const uchar *¤  keyToExpand;
8cdf33 ¤   ¤   ¤   } doInit;
65a105 ¤   ¤   };
7567c5 ¤
c5058c ¤   } CipherProcAPIStruct;
8967c5 ¤
3473a3 #if PRAGMA_STRUCT_ALIGN
db7c46 #pragma options align=reset
b07454 #endif
0faf5a
827353 enum
74bb36 {
6455e7 ¤   uppCipherProcInfo = kCStackBased
57a6f3 ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(OSStatus)))
615b08 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1,
741877 ¤   ¤   ·¤  ¤   SIZE_CODE(sizeof( CipherProcAPIStruct * )))
f782f7 };
0daf5a
2caf5a
480586 typedef OSStatus (*CipherProcPtr)( CipherProcAPIStruct *api );
55af5a
--70fb 0015095f0a440120026 Page 2 of CipherProc.h
fafdb7 #if TARGET_RT_MAC_CFM
80af5a
61391a typedef UniversalProcPtr CipherProcUPP;
0caf5a
4c94c3 #define CallCipherProcX(userRoutine, api )¤ ¤   ¤   ¤   ¤   \
1c490e ¤   ¤   CallUniversalProc((UniversalProcPtr)(userRoutine), ¤\
0ba013 ¤   ¤   uppCipherProcInfo, (api) )
3cdb21 #else
a3b6fd typedef CipherProcPtr CipherProcUPP;
14af5a
00ba9c #define CallCipherProcX(userRoutine, api )¤ ¤   \
ac1b3e ¤   ¤   (*(userRoutine))( api )
867454 #endif
22af5a
95af5a
72af5a
433379 #ifdef __cplusplus
2defe6 }
507454 #endif
--60d3 00144284ab840120027 Page 1 of CipherProc.prefix
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
96db0a ¤   $Id: CipherProc.prefix,v 1.3.8.1 1998/11/12 03:05:29 heller Exp $
29f7f7 ____________________________________________________________________________*/
caaf5a
6fe7eb #define USE_MAC_DEBUG_LEAKS¤¤   0
70bea9 #define USE_PGP_LEAKS¤  ¤   ¤   0
eea8b1 #define USE_MAC_DEBUG_PATCHES¤  0
7d7f25 #define USE_MAC_DEBUG_TRAPS¤¤   0
beaf5a
89b18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
ff6068 #define UNFINISHED_CODE_ALLOWED¤¤   0
39af5a
852aa1 #ifdef __MWERKS__
6b6a19 ¤   #if powerc
42ae06 ¤   ¤   #include <MacHeadersPPC>
1b47b4 ¤   #else
b38ed3 ¤   ¤   #include <MacHeaders68K>
5fb7ec ¤   #endif
bbdb21 #else
685399 ¤   #include <MacHeaders.c>
647454 #endif
67af5a
2daf5a
8df692 #include "PGPDiskShared.prefix"
47af5a
b1af5a
2c396d #define A4_GLOBALS¤ ¤   1
44af5a
--ea95 001b48e098a40120028 Page 1 of CipherProcDebug.prefix
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
d90375 ¤   $Id: CipherProcDebug.prefix,v 1.2.8.1 1998/11/12 03:05:30 heller Exp $
f4f7f7 ____________________________________________________________________________*/
95af5a
b4e7eb #define USE_MAC_DEBUG_LEAKS¤¤   0
50bea9 #define USE_PGP_LEAKS¤  ¤   ¤   0
e1a8b1 #define USE_MAC_DEBUG_PATCHES¤  0
577f25 #define USE_MAC_DEBUG_TRAPS¤¤   0
97af5a
bfa853 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1
ba79b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
5caf5a
c92aa1 #ifdef __MWERKS__
556a19 ¤   #if powerc
69ae06 ¤   ¤   #include <MacHeadersPPC>
ed47b4 ¤   #else
1d8ed3 ¤   ¤   #include <MacHeaders68K>
69b7ec ¤   #endif
4adb21 #else
d55399 ¤   #include <MacHeaders.c>
9c7454 #endif
43af5a
e7af5a
4cf692 #include "PGPDiskShared.prefix"
3caf5a
8eaf5a
85396d #define A4_GLOBALS¤ ¤   1
b4af5a
--2f28 000159bafb940120029 Page 1 of CipherProcGlue.c
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
9f08a0 ¤   $Id: CipherProcGlue.c,v 1.6.8.1 1998/11/12 03:05:30 heller Exp $
60f7f7 ____________________________________________________________________________*/
a0af5a
95c110 #include "pgpMacMemory.h"
e6af5a
2fd106 #include "CipherProcGlue.h"
da24f1 #include "CipherProc.h"
42af5a
51af5a
5eaf5a
d89d66 const OSType¤   kCipherProcPPCResType¤  = 'CPpc';
5fb33a const short¤¤   kCipherProcPPCResID¤¤   = 1000;
75d8da const OSType¤   kCipherProc68KResType¤  = 'CP68';
7b4b0e const short¤¤   kCipherProc68KResID¤¤   = 1000;
28af5a
36af5a
4eaf5a
d867c5 ¤
aeff79 typedef struct CipherProcStruct
6ac7a1 ¤   {
386875 ¤   Boolean¤¤   ¤   ¤   exists;
293a42 ¤   Boolean¤¤   ¤   ¤   isPPC;
d3a750 ¤   CipherProcUPP¤  ¤   entry;
b8f20a ¤   union
ec5b34 ¤   ¤   {
7850da ¤   ¤   CFragConnectionID¤  connectionID;
2d348a ¤   ¤   Handle¤ ¤   ¤   ¤   codeHandle;
78a105 ¤   ¤   };
0ffa2d ¤   } CipherProcStruct;
c5af5a
cedb19 inline CipherProcStruct *¤  RefToStruct( CipherProcRef ref )
5d40d1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( (CipherProcStruct *)ref ); }
20fe2a inline CipherProcRef¤   ¤   StructToRef( CipherProcStruct * ref )
34b339 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( (CipherProcRef)ref ); }
4167c5 ¤
11af5a
3dd140 ¤   static OSErr
403a6a GetPPCCipherProc(
3c6497 ¤   CipherProcUPP *¤¤   entryPoint,
e39e18 ¤   CFragConnectionID *¤connectionID)
e5c7a1 ¤   {
188e70 ¤   OSErr¤  err¤= noErr;
6c5d3f ¤   Handle¤ ¤   ¤   ¤   ppcCRHandle = nil;
0f6212 ¤   CFragSymbolClass¤   theSymClass;
101b52 ¤   ¤
275f93 ¤   ppcCRHandle¤= Get1Resource( kCipherProcPPCResType, kCipherProcPPCResID );
21c496 ¤   if( IsntNull( ppcCRHandle ) )
9e5b34 ¤   ¤   {
1f911f ¤   ¤   Str255¤ errName;
f729b8 ¤   ¤   Ptr¤¤   mainAddress;
57af5a
171fa2 ¤   ¤   pgpAssert( HandleZone( ppcCRHandle ) == SystemZone() );
ae1b52 ¤   ¤
34864e ¤   ¤   HLock(ppcCRHandle);
9aa79e ¤   ¤   DetachResource(ppcCRHandle);
1eabae ¤   ¤   err = GetMemFragment(*ppcCRHandle, GetHandleSize(ppcCRHandle),
abae1e ¤   ¤   ¤   ¤   "\pPGPDiskPPC", kPrivateCFragCopy, connectionID, &mainAddress,
efc933 ¤   ¤   ¤   ¤   errName);
47d798 ¤   ¤   if ( IsntErr( err ) )
5cf776 ¤   ¤   ¤   {
f79da0 ¤   ¤   ¤   MacLeaks_IgnoreItem( ppcCRHandle );
1c402a ¤   ¤   ¤   err = FindSymbol( *connectionID, "\pcipherRD", (Ptr *)entryPoint,
0c8b60 ¤   ¤   ¤   ¤   ¤   ¤   &theSymClass);
b92d2d ¤   ¤   ¤   pgpAssert( theSymClass == kDataCFragSymbol );
f3a3a6 ¤   ¤   ¤   }
260e1d ¤   ¤   else
e6f776 ¤   ¤   ¤   {
1504e1 ¤   ¤   ¤   DisposeHandle( ppcCRHandle );
--025d 000c095428040120029 Page 2 of CipherProcGlue.c
cfa3a6 ¤   ¤   ¤   }
290fe4 ¤   ¤   }
040e24 ¤   else
905b34 ¤   ¤   {
bf6873 ¤   ¤   pgpDebugPStr( "\pGetPPCCipherProc: can't load cipher proc" );
bc3dca ¤   ¤   err¤= memFullErr;
9a0fe4 ¤   ¤   }
1e1b52 ¤   ¤
84490f ¤   AssertNoErr( err, "GetPPCCipherProc" );
b7deb7 ¤   return( err );
8d9371 ¤   }
4f67c5 ¤
e567c5 ¤
081b52 ¤   ¤
3daf5a
63d140 ¤   static OSErr
787037 Get68KCipherProc(
916497 ¤   CipherProcUPP *¤¤   entryPoint,
69d796 ¤   Handle *¤   ¤   ¤   codeHandle)
f0c7a1 ¤   {
4e4461 ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
3cbecd ¤   Handle¤ ¤   ¤   ¤   codeRes = nil;
a01b52 ¤   ¤
37a956 ¤   codeRes¤= Get1Resource( kCipherProc68KResType, kCipherProc68KResID );
0a227f ¤   if( IsntNull( codeRes ) )
dc5b34 ¤   ¤   {
5cc7a7 ¤   ¤   pgpAssert( HandleZone( codeRes ) == SystemZone() );
a91b52 ¤   ¤
acf361 ¤   ¤   HLock( codeRes );
bd7ef5 ¤   ¤   DetachResource( codeRes );
9dbdae ¤   ¤   MacLeaks_IgnoreItem( codeRes );
b91b52 ¤   ¤
ff747e ¤   ¤   *codeHandle¤= codeRes;
18ab98 ¤   ¤   *entryPoint¤= (CipherProcUPP)*codeRes;
520fe4 ¤   ¤   }
600e24 ¤   else
4f5b34 ¤   ¤   {
71c9ac ¤   ¤   pgpDebugPStr( "\pGet68KCipherProc: can't load cipher proc" );
f83dca ¤   ¤   err¤= memFullErr;
cf0fe4 ¤   ¤   }
391b52 ¤   ¤
9f490f ¤   AssertNoErr( err, "GetPPCCipherProc" );
d8deb7 ¤   return( err );
a79371 ¤   }
4867c5 ¤
df67c5 ¤
be67c5 ¤
3167c5 ¤
c6d140 ¤   static OSErr
0e4ce0 InitCipherProc( CipherProcStruct *ref )
04c7a1 ¤   {
6f8e70 ¤   OSErr¤  err¤= noErr;
9cfd6e ¤   long¤   architecture;
0c67c5 ¤
184500 ¤   pgpClearMemory( ref, sizeof( *ref ) );
9667c5 ¤
831931 ¤   err¤= Gestalt( gestaltSysArchitecture, &architecture );
2f67c5 ¤
dee87c ¤   if( IsntErr( err ) && architecture == gestaltPowerPC )
015b34 ¤   ¤   {
335deb ¤   ¤   ref->isPPC¤ = TRUE;
d61b52 ¤   ¤
4dc872 ¤   ¤   err¤= GetPPCCipherProc( &ref->entry, &ref->connectionID );
d20fe4 ¤   ¤   }
7e0e24 ¤   else
fb5b34 ¤   ¤   {
7862d9 ¤   ¤   ref->isPPC¤ = false;
991b52 ¤   ¤
6aa5ec ¤   ¤   err¤= Get68KCipherProc( &ref->entry, &ref->codeHandle );
820fe4 ¤   ¤   }
e71b52 ¤   ¤
c0e181 ¤   ref->exists¤= IsntErr( err );
--75f3 000f92863c240120029 Page 3 of CipherProcGlue.c
e0af5a
060e68 ¤   AssertNoErr( err, "CDriver::InitCipherProc" );
26deb7 ¤   return( err );
b99371 ¤   }
9d67c5 ¤
3967c5 ¤
da67c5 ¤
60af5a
0233c8 ¤   static void
961225 DisposeCipherProc( CipherProcStruct *ref )
56c7a1 ¤   {
1d5c9d ¤   if ( ref->exists )
6b5b34 ¤   ¤   {
5dceca ¤   ¤   if ( ref->isPPC )
13f776 ¤   ¤   ¤   {
5caf4e ¤   ¤   ¤   CloseConnection( &ref->connectionID );
38cca3 ¤   ¤   ¤   // 3/24/97:we should dispose of the code resource here, too
cdfb2e ¤   ¤   ¤   // but we're about to ship in a few days so do this for next
d33f5f ¤   ¤   ¤   // version.
020415 ¤   ¤   ¤   //
88a3a6 ¤   ¤   ¤   }
340e1d ¤   ¤   else
45f776 ¤   ¤   ¤   {
451f11 ¤   ¤   ¤   DisposeHandle( ref->codeHandle );
cba3a6 ¤   ¤   ¤   }
741b52 ¤   ¤
f4a4c4 ¤   ¤   pgpClearMemory( ref, sizeof( ref ) );
fd0fe4 ¤   ¤   }
8a67c5 ¤
4adebf ¤   ref->exists¤= false;
429371 ¤   }
2b67c5 ¤
6eaf5a
55dacc #pragma mark -
30af5a
53af5a
82af5a
c5af5a
83eacd ¤   OSErr
3fe6ef CipherProc_Load( CipherProcRef *resultRef )
5fc7a1 ¤   {
166ead ¤   OSStatus¤   ¤   ¤   err¤= noErr;
d96580 ¤   CipherProcStruct *¤ ref;
1967c5 ¤
3c6824 ¤   ref¤= (CipherProcStruct *)NewPtrSys( sizeof( CipherProcStruct ) );
68f439 ¤   if ( IsntNull( ref ) )
015b34 ¤   ¤   {
dc1392 ¤   ¤   err¤= InitCipherProc( ref );
f88cf4 ¤   ¤   if ( IsErr( err ) )
0ff776 ¤   ¤   ¤   {
41ee06 ¤   ¤   ¤   DisposePtr( (Ptr)ref );
d6a3a6 ¤   ¤   ¤   }
581b52 ¤   ¤
1c66de ¤   ¤   *resultRef¤ = (CipherProcRef)ref;
1e0fe4 ¤   ¤   }
080e24 ¤   else
b15b34 ¤   ¤   {
313dca ¤   ¤   err¤= memFullErr;
b30fe4 ¤   ¤   }
1467c5 ¤
c5deb7 ¤   return( err );
cd9371 ¤   }
1a67c5 ¤
4e67c5 ¤
36eacd ¤   OSErr
844c64 CipherProc_Dispose( CipherProcRef¤  ref )
fdc7a1 ¤   {
898e70 ¤   OSErr¤  err¤= noErr;
b167c5 ¤
633c4a ¤   DisposeCipherProc( (CipherProcStruct *)ref );
54c8a4 ¤   DisposePtr( (Ptr)ref );
f9e3a3 ¤   err¤= MemError();
--ca8a 000fdff17fb40120029 Page 4 of CipherProcGlue.c
2a67c5 ¤
4fdeb7 ¤   return( err );
079371 ¤   }
2867c5 ¤
a0af5a
f0dacc #pragma mark -
63af5a
c48b9d ¤   inline void
2bc0f8 InitAPI(
24bab7 ¤   CipherProcAPIStruct *¤  api,
823d8b ¤   CipherOp¤   ¤   ¤   ¤   op,
9cd0c6 ¤   const CipherContext *¤  context = nil)
7fc7a1 ¤   {
d4158a ¤   pgpClearMemory( api, sizeof( api ) );
6ed39c ¤   api->op¤¤   ¤   = op;
8936a0 ¤   api->context¤   = context;
6f9371 ¤   }
0e67c5 ¤
bd67c5 ¤
c3d3b2 ¤   inline OSStatus
9ae4bb MyCallCipherProc(
3c6861 ¤   CipherProcStruct *¤ ¤   info,
8cc40f ¤   CipherProcAPIStruct *¤  api)
fcc7a1 ¤   {
80e5dd ¤   return( CallCipherProcX( info->entry, api ) );
a69371 ¤   }
0567c5 ¤
f267c5 ¤
f185ea ¤   OSStatus
9f9d0c CipherProc_CallInitContext(
6915a2 ¤   CipherProcRef¤  ref,
8722e2 ¤   CipherContext *¤context,
1049fa ¤   const uchar *¤  keyToExpand )
5fc7a1 ¤   {
28d5a9 ¤   CipherProcAPIStruct¤api;
084461 ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
a067c5 ¤
4cde6b ¤   InitAPI( &api, kCipherOp_Init, context );
6e2e05 ¤   api.doInit.keyToExpand¤ = keyToExpand;
cc67c5 ¤
e12477 ¤   err¤= MyCallCipherProc( RefToStruct( ref ), &api );
2b67c5 ¤
46deb7 ¤   return( err );
2b9371 ¤   }
a667c5 ¤
3767c5 ¤
2767c5 ¤
8985ea ¤   OSStatus
e1b7a5 CipherProc_CallVerify( CipherProcRef ref )
19c7a1 ¤   {
77d5a9 ¤   CipherProcAPIStruct¤api;
f24461 ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
6267c5 ¤
1f2ad1 ¤   InitAPI( &api, kCipherOp_Verify );
6c67c5 ¤
562477 ¤   err¤= MyCallCipherProc( RefToStruct( ref ), &api );
ba67c5 ¤
0adeb7 ¤   return( err );
d59371 ¤   }
bd67c5 ¤
f867c5 ¤
1585ea ¤   OSStatus
c3f9fb CipherProc_CallEncrypt(
4c5de3 ¤   CipherProcRef¤  ¤   ¤   ref,
7c0540 ¤   const CipherContext *¤  context,
92142e ¤   ItemCount¤  ¤   ¤   ¤   startBlock,
0ac1b0 ¤   ItemCount¤  ¤   ¤   ¤   numBlocks,
dd07d1 ¤   const void *¤   ¤   ¤   src,
920353 ¤   void *¤ ¤   ¤   ¤   ¤   dest )
ecc7a1 ¤   {
74d5a9 ¤   CipherProcAPIStruct¤api;
fd4461 ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
--30df 0019a41eb7740120029 Page 5 of CipherProcGlue.c
2a67c5 ¤
2676e6 ¤   InitAPI( &api, kCipherOp_Encrypt, context);
c13efd ¤   api.doCipher.startBlock¤= startBlock;
ef3eaa ¤   api.doCipher.numBlocks¤ = numBlocks;
ff134b ¤   api.doCipher.src¤   ¤   = src;
1c3566 ¤   api.doCipher.dest¤  ¤   = dest;
9767c5 ¤
682477 ¤   err¤= MyCallCipherProc( RefToStruct( ref ), &api );
b967c5 ¤
f0deb7 ¤   return( err );
269371 ¤   }
ef67c5 ¤
4767c5 ¤
7c85ea ¤   OSStatus
cb136a CipherProc_CallDecrypt(
035de3 ¤   CipherProcRef¤  ¤   ¤   ref,
7b0540 ¤   const CipherContext *¤  context,
2a142e ¤   ItemCount¤  ¤   ¤   ¤   startBlock,
aac1b0 ¤   ItemCount¤  ¤   ¤   ¤   numBlocks,
8207d1 ¤   const void *¤   ¤   ¤   src,
900353 ¤   void *¤ ¤   ¤   ¤   ¤   dest )
12c7a1 ¤   {
f6d5a9 ¤   CipherProcAPIStruct¤api;
0a4461 ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
b067c5 ¤
611bd8 ¤   InitAPI( &api, kCipherOp_Decrypt, context);
8f3efd ¤   api.doCipher.startBlock¤= startBlock;
2f3eaa ¤   api.doCipher.numBlocks¤ = numBlocks;
d8134b ¤   api.doCipher.src¤   ¤   = src;
e23566 ¤   api.doCipher.dest¤  ¤   = dest;
0867c5 ¤
592477 ¤   err¤= MyCallCipherProc( RefToStruct( ref ), &api );
d167c5 ¤
60deb7 ¤   return( err );
369371 ¤   }
4baf5a
f5af5a
37af5a
09af5a
8caf5a
feaf5a
9aaf5a
--af73 0013c3704c24012002a Page 1 of CipherProcGlue.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
e480a7 ¤   $Id: CipherProcGlue.h,v 1.2.8.1 1998/11/12 03:05:31 heller Exp $
47f7f7 ____________________________________________________________________________*/
37af5a
1a7b7d #pragma once
4daf5a
80af5a
8d3379 #ifdef __cplusplus
156dad extern "C" {
fb7454 #endif
59af5a
518c21 #include "CipherContext.h"
c4af5a
0e90b5 typedef const struct OpaqueCipherProcRef *¤ ¤   CipherProcRef;
8819b2 const CipherProcRef¤¤   kInvalidCipherProcRef¤  = nil;
73af5a
84af5a
832ee9 OSErr¤  CipherProc_Load( CipherProcRef *ref );
72fa43 OSErr¤  CipherProc_Dispose( CipherProcRef );
8aaf5a
84af5a
975c28 OSStatus¤   CipherProc_CallInitContext( CipherProcRef ref,
ce8722 ¤   ¤   ¤   ¤   ¤   CipherContext * context, const uchar *keyToExpand );
71af5a
aeb6fc OSStatus¤   CipherProc_CallVerify( CipherProcRef ref );
a2af5a
879207 OSStatus¤   CipherProc_CallEncrypt( CipherProcRef ref,
ff3182 ¤   ¤   ¤   ¤   ¤   const CipherContext *context, ItemCount startBlock,
ac59be ¤   ¤   ¤   ¤   ¤   ItemCount numBlocks, const void *src, void *dest );
9a87c7 ¤   ¤   ¤
2928a3 OSStatus¤   CipherProc_CallDecrypt( CipherProcRef ref,
563182 ¤   ¤   ¤   ¤   ¤   const CipherContext *context, ItemCount startBlock,
dd59be ¤   ¤   ¤   ¤   ¤   ItemCount numBlocks, const void *src, void *dest );
c4af5a
0caf5a
29af5a
683379 #ifdef __cplusplus
29efe6 }
3c7454 #endif
--43c1 000057b55f14012002b Page 1 of CipherProcMain.c
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
f342ac ¤   $Id: CipherProcMain.c,v 1.4.8.1 1998/11/12 03:05:32 heller Exp $
16f7f7 ____________________________________________________________________________*/
9daf5a
1036e5 #include "string.h"
2eaf5a
6d3175 #include "PGPDiskEncryptDecrypt.h"
d0de36 #include "PGPDisk.h"
5caf5a
1224f1 #include "CipherProc.h"
298c21 #include "CipherContext.h"
daaf5a
bbb488 #include "A4Stuff.h"
19af5a
c33379 #ifdef __cplusplus
3b6dad extern "C" {
9c7454 #endif
bfaf5a
fcc694 OSStatus¤   main( CipherProcAPIStruct *¤api );
ceaf5a
363379 #ifdef __cplusplus
e3efe6 }
ed7454 #endif
5caf5a
006536 #if TARGET_RT_MAC_CFM¤  // [
1daf5a
beedb8 #pragma export on
feaf5a
e90ec9 RoutineDescriptor cipherRD = BUILD_ROUTINE_DESCRIPTOR(uppCipherProcInfo, main);
47af5a
069c43 #pragma export off
a9af5a
3b76d8 #endif¤ // ]
97af5a
ddaf5a
8c67c5 ¤
4167c5 ¤
9585ea ¤   OSStatus
feff69 main( CipherProcAPIStruct *¤api )
a8bb36 {
aa5c98 #if PGP_DEBUG
ec31df ¤   // make sure main() is same type as it should be
0a5cc3 ¤   CipherProcPtr¤  proc¤   = main;¤
a37454 #endif
d2af5a
d66e85 ¤   OSStatus¤   ¤   ¤   ¤   err¤= noErr;
c6e42a ¤   CipherOp¤   ¤   ¤   ¤   op¤ ¤   = api->op;
d9fd7c ¤   const CipherContext *¤  context¤= api->context;
c467c5 ¤
b0953d ¤   EnterCodeResource();
8567c5 ¤
2e20ce ¤   pgpAssert( StackSpace() >= 1024UL );
ad67c5 ¤
45d32c ¤   if ( op == kCipherOp_Encrypt || op == kCipherOp_Decrypt )
e85b34 ¤   ¤   {
003fd2 ¤   ¤   pgpa((
029c96 ¤   ¤   ¤   pgpaAddrValid( api->doCipher.dest, VoidAlign ),
e04399 ¤   ¤   ¤   pgpaAssert( api->doCipher.numBlocks != 0 ),
eef8af ¤   ¤   ¤   pgpaAddrValid( context, CipherContext )
66da4b ¤   ¤   ¤   ));
561b52 ¤   ¤
2a54fe ¤   ¤   CipherBlocks( context, api->doCipher.startBlock,
3b2939 ¤   ¤   ¤   ¤   api->doCipher.numBlocks, api->doCipher.src,
77c6a8 ¤   ¤   ¤   ¤   api->doCipher.dest, op );
f90fe4 ¤   ¤   }
90d08e ¤   else if ( op == kCipherOp_Init )
775b34 ¤   ¤   {
7b3de0 ¤   ¤   CipherContext *¤contextMod¤ = (CipherContext *)context;
05af5a
--103e 00121ef37524012002b Page 2 of CipherProcMain.c
76bf75 ¤   ¤   pgpAssertAddrValid( contextMod, CipherContext );
fb1b52 ¤   ¤
382d8b ¤   ¤   CASTCFB_Init( &contextMod->castCFB,
434fd0 ¤   ¤   ¤   ¤   (const byte *) api->doInit.keyToExpand );
3a1b52 ¤   ¤
30afd0 ¤   ¤   err¤= VerifyCastSBoxesValid() ? noErr : kCastSBoxesInvalidError;
350fe4 ¤   ¤   }
33be39 ¤   else if ( op == kCipherOp_Verify )
995b34 ¤   ¤   {
d9afd0 ¤   ¤   err¤= VerifyCastSBoxesValid() ? noErr : kCastSBoxesInvalidError;
370fe4 ¤   ¤   }
c70e24 ¤   else
c25b34 ¤   ¤   {
20b903 ¤   ¤   err¤= paramErr;
460fe4 ¤   ¤   }
541b52 ¤   ¤
351487 ¤   ExitCodeResource();
a867c5 ¤
07deb7 ¤   return( err );
5befe6 }
9baf5a
46af5a
72af5a
e7af5a
feaf5a
1daf5a
5baf5a
21af5a
--a918 000c584e3324012002c Page 1 of CBlindWriteQueue.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
e2d02e ¤   $Id: CBlindWriteQueue.cp,v 1.6.8.1 1998/11/12 03:05:33 heller Exp $
70f7f7 ____________________________________________________________________________*/
09af5a
a414a8 #if BLIND_WRITES¤   // [
baaf5a
99af8a #include "MacMemory.h"
e8bbf4 #include "MacFiles.h"
d5af5a
4880c9 #include "CBlindWriteQueue.h"
b3af5a
f1b488 #include "A4Stuff.h"
66547d #include "SetupA4.h"
9baf5a
feaf5a
1faf5a
8e6964 typedef union XIOPB
e4c7a1 ¤   {
c72ece ¤   ParamBlockRec¤  pb;
ae6eed ¤   XIOParam¤   ¤   xpb;
adee02 ¤   } XIOPB;
9aaf5a
15bbd8 typedef struct RequestHeader
e5c7a1 ¤   {
425c98 #if PGP_DEBUG
070c6c ¤   ulong¤  ¤   ¤   ¤   magic;
9c153e ¤   enum { kMagic = 'BLWQ' };
ed7454 #endif
67d962 ¤   RequestHeader *¤¤   next;
14b27f ¤   XIOPB¤  ¤   ¤   ¤   ioPB;
5e0060 ¤   CBlindWriteQueue *¤ thisObject;
42f715 ¤   ulong¤  ¤   ¤   ¤   numBytes;
67c004 ¤   } RequestHeader;
5967c5 ¤
bc448a const ulong¤kMinRequestSize¤= sizeof( RequestHeader ) + 512;
2eaf5a
3b1cc1 ¤   inline ulong
edb19c TotalSize( const RequestHeader *request )
d8c7a1 ¤   {
f2e538 ¤   return( sizeof( RequestHeader ) + request->numBytes );
5d9371 ¤   }
0367c5 ¤
ee03a5 ¤   inline RequestHeader *
41f0c1 FollowingRequest( const RequestHeader *request )
c8c7a1 ¤   {
ce78bd ¤   return( (RequestHeader *) ( ((Ptr) request ) + TotalSize( request ) ) );
1c9371 ¤   }
3f67c5 ¤
607ece ¤   inline Ptr
4ff0d0 RequestBytes( RequestHeader *request )
9bc7a1 ¤   {
4ccee9 ¤   return( (Ptr) request + sizeof( RequestHeader ) );
c39371 ¤   }
ed67c5 ¤
575c98 #if PGP_DEBUG
1a8b9d ¤   inline void
b97e7b SetMagic( RequestHeader *request, ulong magic)
3cc7a1 ¤   {
edc37a ¤   request->magic = magic;
479371 ¤   }
03db21 #else
eac498 #define SetMagic( r, m )
237454 #endif
fe67c5 ¤
46af5a
fe53b1 #if ! TARGET_RT_MAC_CFM
22d83c ·
944995 #pragma parameter __D0 InterruptsOff( )
c54afc extern pascal short¤InterruptsOff( void )
--66c0 000657770554012002c Page 2 of CBlindWriteQueue.cp
bbf4ba ¤   ¤   THREEWORDINLINE( 0x40C0, 0x007C, 0x0700 );
9967c5 ¤
b267c5 ¤
52f794 #pragma parameter RestoreInterrupts( __D0 )
2902d4 extern pascal void¤ ¤   RestoreInterrupts( short sr )
dd3cef ¤   ¤   ONEWORDINLINE( 0x46C0 );
3faf5a
bf7454 #endif
bcaf5a
a07295 #define MAX( a, b ) ¤   ( (a) >= (b) ? (a) : (b) )
43af5a
5467c5 ¤
5667c5 ¤
d3af5a
5667c5 ¤
ec3ddf CBlindWriteQueue::CBlindWriteQueue( ulong bufferSize )
05c7a1 ¤   {
809661 ¤   const ulong¤kMinBufferSize¤ = 1 * ( sizeof( RequestHeader ) +
ef2586 ¤   ¤   ¤   kDiskBlockSize );
b767c5 ¤
dcab70 ¤   mGoingAway¤ = false;
bf67c5 ¤
18b32d ¤   pgpClearMemory( &mFreeList, sizeof( mFreeList ) );
5367c5 ¤
d7bc10 ¤   mBufferSize¤= MAX( bufferSize, kMinBufferSize );
5a67c5 ¤
05e907 ¤   mBuffer¤¤   = pgpNewPtrMost( mBufferSize, kMinBufferSize,
493dee ¤   ¤   ¤   ¤   ¤   kMacMemory_UseSystemHeap, &mBufferSize );
a276c1 ¤   pgpAssert( IsntNull( mBuffer ) );
c167c5 ¤
0deda2 ¤   if ( IsntNull( mBuffer ) )
055b34 ¤   ¤   {
9c8010 ¤   ¤   CreateFreeList( );
3a0fe4 ¤   ¤   }
739371 ¤   }
0faf5a
3baf5a
0d9656 CBlindWriteQueue::~CBlindWriteQueue( ·)
7dc7a1 ¤   {
8580d4 ¤   mGoingAway¤ = TRUE;
f967c5 ¤
7ddb4a ¤   WaitIODone();
2967c5 ¤
d2eda2 ¤   if ( IsntNull( mBuffer ) )
4c5b34 ¤   ¤   {
bae3bc ¤   ¤   pgpFreeMac( (Ptr)mBuffer );
c0417c ¤   ¤   mBuffer¤= nil;
bb0fe4 ¤   ¤   }
2f9371 ¤   }
8daf5a
e5af5a
806d52 ¤   void
d2f473 CBlindWriteQueue::CreateFreeList( )
16c7a1 ¤   {
fb2aa6 ¤   RequestHeader *¤request;
8f67c5 ¤
f276c1 ¤   pgpAssert( IsntNull( mBuffer ) );
59f7d2 ¤   pgpAssert( mBufferSize >= sizeof( RequestHeader ) + kDiskBlockSize );
7867c5 ¤
921b54 ¤   // initially, we have one free item, with all the space in it
7037d6 ¤   request¤¤   ¤   ¤   = (RequestHeader *)mBuffer;
0825f3 ¤   request->numBytes¤  = mBufferSize - sizeof( RequestHeader );
00333d ¤   request->next¤  ¤   = nil;
b3201a ¤   SetMagic( request, RequestHeader::kMagic );
9567c5 ¤
061a16 ¤   mFreeList.head¤ ¤   ¤   = request;
31a97e ¤   mFreeList.maxFreeBytes¤ = request->numBytes;
51073c ¤   mFreeList.curFreeBytes¤ = request->numBytes;
779371 ¤   }
e267c5 ¤
9567c5 ¤
65f71d ¤   RequestHeader *
--10df 000594769b84012002c Page 3 of CBlindWriteQueue.cp
ddefa3 CBlindWriteQueue::Allocate( ulong¤  size )
9fc7a1 ¤   {
1adaa1 ¤   RequestHeader *¤result¤ = nil;
1e67c5 ¤
9d2593 ¤   pgpAssert( mFreeList.curFreeBytes <= mFreeList.maxFreeBytes );
ee67c5 ¤
8d510e ¤   if ( size <= mBufferSize - sizeof( RequestHeader ) )
695b34 ¤   ¤   {
ff8ef5 ¤   ¤   RequestHeader *¤curRequest¤ = nil;
871b52 ¤   ¤
1fb61e ¤   ¤   short saveSR¤   = InterruptsOff();
0187c7 ¤   ¤   ¤
f2090a ¤   ¤   curRequest¤ = mFreeList.head;
4b2a3a ¤   ¤   if ( IsntNull( curRequest ) )
40f776 ¤   ¤   ¤   {
d883ba ¤   ¤   ¤   RequestHeader *¤last¤   = nil;
cf87c7 ¤   ¤   ¤
7fc62b ¤   ¤   ¤   // NOTE: this loop should be fast...interrupts are off!
d62d6f ¤   ¤   ¤   while ( IsntNull( curRequest ) )
4f72c3 ¤   ¤   ¤   ¤   {
71f4bc ¤   ¤   ¤   ¤   if ( curRequest->numBytes >= size )
574859 ¤   ¤   ¤   ¤   ¤   {
ad9e02 ¤   ¤   ¤   ¤   ¤   ulong¤  ¤   ¤   leftover;
e8ca4a ¤   ¤   ¤   ¤   ¤   RequestHeader *¤newFreeItem = nil;
9387c7 ¤   ¤   ¤
ac8fbb ¤   ¤   ¤   ¤   ¤   // carve this request up if there's enough remaining
fc96c5 ¤   ¤   ¤   ¤   ¤   leftover¤   = curRequest->numBytes - size;
75c7f0 ¤   ¤   ¤   ¤   ¤   if ( leftover >= kMinRequestSize )
1c8fec ¤   ¤   ¤   ¤   ¤   ¤   {
33379c ¤   ¤   ¤   ¤   ¤   ¤   ulong¤  totalTaken¤ = size + sizeof( RequestHeader);
ce94aa ¤   ¤   ¤   ¤   ¤   ¤
26dc89 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssert( mFreeList.curFreeBytes >= totalTaken );
0094aa ¤   ¤   ¤   ¤   ¤   ¤
1d97d0 ¤   ¤   ¤   ¤   ¤   ¤   newFreeItem¤= (RequestHeader *) ( ( (Ptr)(curRequest +
004d2c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   1 )) + size );
0a3565 ¤   ¤   ¤   ¤   ¤   ¤   newFreeItem->numBytes = curRequest->numBytes -
037973 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   totalTaken;
817679 ¤   ¤   ¤   ¤   ¤   ¤   newFreeItem->next¤  ¤   = curRequest->next;
508670 ¤   ¤   ¤   ¤   ¤   ¤   SetMagic( newFreeItem, RequestHeader::kMagic );
c594aa ¤   ¤   ¤   ¤   ¤   ¤
b92a34 ¤   ¤   ¤   ¤   ¤   ¤   mFreeList.curFreeBytes¤ -= totalTaken;
f3269c ¤   ¤   ¤   ¤   ¤   ¤   curRequest->numBytes¤   = size;
f694aa ¤   ¤   ¤   ¤   ¤   ¤
d970b0 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssert( newFreeItem->numBytes <=
5030d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mFreeList.curFreeBytes );
15db3c ¤   ¤   ¤   ¤   ¤   ¤   }
254bd6 ¤   ¤   ¤   ¤   ¤   else
a38fec ¤   ¤   ¤   ¤   ¤   ¤   {
b6cf3c ¤   ¤   ¤   ¤   ¤   ¤   newFreeItem¤¤   ¤   ¤   = curRequest->next;
defac4 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssert( mFreeList.curFreeBytes >=
eb8d91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   curRequest->numBytes );
3b9e42 ¤   ¤   ¤   ¤   ¤   ¤   mFreeList.curFreeBytes¤ -= curRequest->numBytes;
74db3c ¤   ¤   ¤   ¤   ¤   ¤   }
5dae30 ¤   ¤   ¤   ¤   ¤
5cae30 ¤   ¤   ¤   ¤   ¤
a04468 ¤   ¤   ¤   ¤   ¤   result¤ ¤   ¤   ¤   = curRequest;
71ae30 ¤   ¤   ¤   ¤   ¤
4170fe ¤   ¤   ¤   ¤   ¤   if ( IsNull( last ) )
0b73f7 ¤   ¤   ¤   ¤   ¤   ¤   mFreeList.head¤ = newFreeItem;
344bd6 ¤   ¤   ¤   ¤   ¤   else
5a8b64 ¤   ¤   ¤   ¤   ¤   ¤   last->next¤ ¤   = newFreeItem;
ae14c3 ¤   ¤   ¤   ¤   ¤   break;
0b1c89 ¤   ¤   ¤   ¤   ¤   }
23ae30 ¤   ¤   ¤   ¤   ¤
a68c3c ¤   ¤   ¤   ¤   last¤   ¤   = curRequest;
76d3ca ¤   ¤   ¤   ¤   curRequest¤ = curRequest->next;
d02613 ¤   ¤   ¤   ¤   }
aca3a6 ¤   ¤   ¤   }
1f87c7 ¤   ¤   ¤
ef4385 ¤   ¤   pgpAssert( mFreeList.curFreeBytes < mFreeList.maxFreeBytes );
4467c5 ¤
595646 ¤   ¤   RestoreInterrupts( saveSR );
--82e9 0000997c4c34012002c Page 4 of CBlindWriteQueue.cp
b50fe4 ¤   ¤   }
a967c5 ¤
974c6e ¤   return( result );
139371 ¤   }
bf67c5 ¤
7faf5a
e66d52 ¤   void
23d113 CBlindWriteQueue::MergeWithNext( RequestHeader *¤   request)
3ac7a1 ¤   {
1d59b0 ¤   RequestHeader *next;
261b52 ¤   ¤
0dc3ac ¤   while ( (next = request->next ) == FollowingRequest( request ) )
d35b34 ¤   ¤   {
aea92f ¤   ¤   // bytes themselves are already accounted for
639592 ¤   ¤   mFreeList.curFreeBytes¤ += sizeof( RequestHeader );
93758e ¤   ¤   request->numBytes¤  ¤   += sizeof( RequestHeader ) + next->numBytes;
758e15 ¤   ¤   request->next¤  ¤   ¤   = next->next;
6cc310 ¤   ¤   SetMagic( next, 0 );
8e0fe4 ¤   ¤   }
c39371 ¤   }
1167c5 ¤
0c67c5 ¤
f76d52 ¤   void
72b1c6 CBlindWriteQueue::Deallocate( RequestHeader *request)
6bc7a1 ¤   {
115a4b ¤   pgpAssertAddrValid( request, RequestHeader );
61414f ¤   pgpAssert( request->magic == RequestHeader::kMagic );
c156a6 ¤   pgpAssert( mFreeList.curFreeBytes < mFreeList.maxFreeBytes );
bb67c5 ¤
414571 ¤   // the request next in memory (may or may not exist if 'request' is last )
bf2af9 ¤   request->next¤  = nil;
051b52 ¤   ¤
a9b852 ¤   short saveSR¤   = InterruptsOff();
abae30 ¤   ¤   ¤   ¤   ¤
3df1ed ¤   if ( IsNull( mFreeList.head ) )
3f5b34 ¤   ¤   {
7a6a38 ¤   ¤   // this is the only free item
9a145a ¤   ¤   mFreeList.head¤ ¤   ¤   = request;
955427 ¤   ¤   mFreeList.curFreeBytes¤ = request->numBytes;
060fe4 ¤   ¤   }
c80e24 ¤   else
565b34 ¤   ¤   {
80b3f4 ¤   ¤   RequestHeader *¤curRequest¤ = mFreeList.head;
788df6 ¤   ¤   RequestHeader *¤last¤   = nil;
eef94e ¤   ¤   Boolean¤¤   ¤   didLinkIn¤  = false;
cb67c5 ¤
160ab9 ¤   ¤   mFreeList.curFreeBytes¤ += request->numBytes;
0d2b85 ¤   ¤   ¤   ¤
a82bd7 ¤   ¤   while ( IsntNull( curRequest ) )
26f776 ¤   ¤   ¤   {
71931d ¤   ¤   ¤   if ( (long)request < (long)curRequest )
c972c3 ¤   ¤   ¤   ¤   {
20cfde ¤   ¤   ¤   ¤   request->next¤  ¤   ¤   = curRequest;
602b85 ¤   ¤   ¤   ¤
d2fa61 ¤   ¤   ¤   ¤   if ( IsntNull( last ) )
6b4859 ¤   ¤   ¤   ¤   ¤   {
84051a ¤   ¤   ¤   ¤   ¤   last->next¤ = request;
17a1e2 ¤   ¤   ¤   ¤   ¤   MergeWithNext( last );
3a1c89 ¤   ¤   ¤   ¤   ¤   }
59fa07 ¤   ¤   ¤   ¤   else
8f4859 ¤   ¤   ¤   ¤   ¤   {
32ff5a ¤   ¤   ¤   ¤   ¤   mFreeList.head¤ = request;
135ce3 ¤   ¤   ¤   ¤   ¤   MergeWithNext( request );
3c1c89 ¤   ¤   ¤   ¤   ¤   }
8f0b40 ¤   ¤   ¤   ¤   didLinkIn¤  = TRUE;
f3f622 ¤   ¤   ¤   ¤   break;
3e2613 ¤   ¤   ¤   ¤   }
142b85 ¤   ¤   ¤   ¤
d5b0d2 ¤   ¤   ¤   last¤   ¤   = curRequest;
e8cb9a ¤   ¤   ¤   curRequest¤ = curRequest->next;
44a3a6 ¤   ¤   ¤   }
0987c7 ¤   ¤   ¤
--f3cb 0004079e4954012002c Page 5 of CBlindWriteQueue.cp
77a0a5 ¤   ¤   if ( ! didLinkIn )
3bf776 ¤   ¤   ¤   {
6c3a8c ¤   ¤   ¤   // very last block in list·
95b301 ¤   ¤   ¤   pgpAssert( IsntNull( last ) );
784aa5 ¤   ¤   ¤   last->next¤ = request;
42ee5d ¤   ¤   ¤   MergeWithNext( last );
bda3a6 ¤   ¤   ¤   }
020fe4 ¤   ¤   }
5767c5 ¤
ef6b2e ¤   RestoreInterrupts( saveSR );
e59371 ¤   }
6f67c5 ¤
f067c5 ¤
597bbe /*_________________________________________________________________________
5ac0ec ¤   An I/O request has been completed.
14807b ¤   This hook proc is called by Device Manager
308ac7 _________________________________________________________________________*/
336685 ¤   pascal void
e6fa26 CBlindWriteQueue::sCompletionProc( void )
9ec7a1 ¤   {
a56aab ¤   EnterCallback();
5467c5 ¤
b5a881 ¤   XIOPB *¤¤   ¤   pb;
152aa6 ¤   RequestHeader *¤request;
1267c5 ¤
bcc838 ¤   pb¤ = (XIOPB *)GetA0();
8b67c5 ¤
115f7d ¤   request¤= (RequestHeader *)(((char *)pb) - offsetof( RequestHeader, ioPB ));
245a4b ¤   pgpAssertAddrValid( request, RequestHeader );
c5414f ¤   pgpAssert( request->magic == RequestHeader::kMagic );
2967c5 ¤
61db93 ¤   request->thisObject->Deallocate( request );
9567c5 ¤
8036ff ¤   ExitCallback();
449371 ¤   }
02af5a
43af5a
89af5a
9a3085 ¤   CBlindWriteQueue::RequestResult
c91935 CBlindWriteQueue::HandleRequest( const ParamBlockRec * pb )
2dc7a1 ¤   {
3b3f69 ¤   RequestResult¤  result¤ = kRequestNotHandled;
f01b52 ¤   ¤
4d35f0 ¤   if ( ! mGoingAway )
ac5b34 ¤   ¤   {
c991f0 ¤   ¤   RequestHeader *¤request;
8ebb73 ¤   ¤   const ulong¤¤   requestCount¤   = pb->ioParam.ioReqCount;
fd1b52 ¤   ¤
132b4c ¤   ¤   request¤= Allocate( requestCount );
34583c ¤   ¤   if ( IsntNull( request ) )
55f776 ¤   ¤   ¤   {
020a6e ¤   ¤   ¤   pgpAssert( requestCount <= request->numBytes );
3887c7 ¤   ¤   ¤
37c4ce ¤   ¤   ¤   // copy the pb and the bytes
b7f13a ¤   ¤   ¤   request->ioPB¤  ¤   = *(const XIOPB *)pb;
8ec8e7 ¤   ¤   ¤   request->thisObject¤= this;
036c9d ¤   ¤   ¤   request->ioPB.pb.ioParam.ioCompletion¤  = sCompletionProc;
c8298e ¤   ¤   ¤   request->ioPB.pb.ioParam.ioBuffer¤  ¤   = RequestBytes( request );
c5d168 ¤   ¤   ¤   BlockMoveData( pb->ioParam.ioBuffer, RequestBytes( request ),
f129b3 ¤   ¤   ¤   ¤   ¤   requestCount );
af87c7 ¤   ¤   ¤
4b4d64 ¤   ¤   ¤   (void)PBWriteAsync( &request->ioPB.pb );
d987c7 ¤   ¤   ¤
50c94c ¤   ¤   ¤   result¤ = kRequestHandled;
26a3a6 ¤   ¤   ¤   }
850fe4 ¤   ¤   }
eb67c5 ¤
954c6e ¤   return( result );
9d9371 ¤   }
1767c5 ¤
a667c5 ¤
40af5a
--a5dc 00082d1587a4012002c Page 6 of CBlindWriteQueue.cp
3b6d52 ¤   void
d10337 CBlindWriteQueue::WaitIODone( void )
67c7a1 ¤   {
7c6736 ¤   Boolean¤notAllFree¤ = TRUE;
3b67c5 ¤
238a9f ¤   while ( mFreeList.curFreeBytes != mFreeList.maxFreeBytes )
fe5b34 ¤   ¤   {
7c5f0b ¤   ¤   // no need to turn off interrupts
e7da38 ¤   ¤   // wait
570fe4 ¤   ¤   }
991b52 ¤   ¤
bb9371 ¤   }
d6af5a
13af5a
feeacd ¤   OSErr
43b286 CBlindWriteQueue::Create(
327ad5 ¤   CBlindWriteQueue ** writerPtr,
8a5b65 ¤   ulong¤  ¤   ¤   ¤   size)
3ac7a1 ¤   {
9756f9 ¤   OSErr¤  ¤   ¤   ¤   err¤= memFullErr;
45459d ¤   CBlindWriteQueue *¤ queue;
5f67c5 ¤
81da95 ¤   *writerPtr¤ = nil;
d767c5 ¤
4e7ee8 ¤   queue¤  = new CBlindWriteQueue( size );
644b45 ¤   if ( IsntNull( queue ) )
d75b34 ¤   ¤   {
5d59ae ¤   ¤   if ( IsNull( queue->mBuffer ) )
83f776 ¤   ¤   ¤   {
1098e2 ¤   ¤   ¤   delete queue;
49cd93 ¤   ¤   ¤   queue¤  = nil;
22a3a6 ¤   ¤   ¤   }
e10e1d ¤   ¤   else
01f776 ¤   ¤   ¤   {
a4d64c ¤   ¤   ¤   err¤¤   ¤   = noErr;
f3150b ¤   ¤   ¤   *writerPtr¤ = queue;
d8a3a6 ¤   ¤   ¤   }
480fe4 ¤   ¤   }
6a67c5 ¤
ec99a2 ¤   pgpAssert( err == noErr );
4867c5 ¤
88deb7 ¤   return( err );
139371 ¤   }
3eaf5a
3b9ba8 #if PGP_DEBUG¤  // [
e2af5a
bb7bbe /*_________________________________________________________________________
614ddc ¤   test allocation followed by deallocating every other even item followed by
c9a75c ¤   deallocating every other odd item
c48ac7 _________________________________________________________________________*/
4b6d52 ¤   void
317b33 CBlindWriteQueue::TestOddEven( void )
4bc7a1 ¤   {
d448e2 ¤   const ushort¤   ¤   kNumRequests¤   = 500;
30ff2f ¤   RequestHeader *¤¤   requests[ kNumRequests ];
449196 ¤   CBlindWriteQueue¤   test;
9aaf5a
c13b73 ¤   pgpAssert( IsntNull( test.mFreeList.head ) );
1e6b82 ¤   pgpAssert( IsNull( test.mFreeList.head->next ) );
dbce22 ¤   pgpAssert( test.mFreeList.head->numBytes == test.mFreeList.maxFreeBytes );
8667c5 ¤
c1e89c ¤   ulong¤  startFree¤  = test.mFreeList.curFreeBytes;
e567c5 ¤
68a713 ¤   for ( ushort index = 0; index < kNumRequests; ++index )
205b34 ¤   ¤   {
2c6107 ¤   ¤   requests[ index ]¤  = test.Allocate( 512 );
b90fe4 ¤   ¤   }
51af5a
ecf8f7 ¤   // deallocate every even item
dfdd81 ¤   for ( ushort index = 0; index < kNumRequests; index += 2 )
dd5b34 ¤   ¤   {
82182d ¤   ¤   if ( IsntNull( requests[ index ] ) )
--a77f 0003f3282594012002c Page 7 of CBlindWriteQueue.cp
99f776 ¤   ¤   ¤   {
46eb1b ¤   ¤   ¤   test.Deallocate( requests[ index ] );
128acb ¤   ¤   ¤   requests[ index ]¤  = nil;
e7a3a6 ¤   ¤   ¤   }
da0fe4 ¤   ¤   }
161b52 ¤   ¤
9acedc ¤   // deallocate every odd item
6d7749 ¤   for ( ushort index = 1; index < kNumRequests; index += 2 )
715b34 ¤   ¤   {
a3182d ¤   ¤   if ( IsntNull( requests[ index ] ) )
4df776 ¤   ¤   ¤   {
4eeb1b ¤   ¤   ¤   test.Deallocate( requests[ index ] );
bd8acb ¤   ¤   ¤   requests[ index ]¤  = nil;
c9a3a6 ¤   ¤   ¤   }
ae0fe4 ¤   ¤   }
09af5a
3e3b73 ¤   pgpAssert( IsntNull( test.mFreeList.head ) );
676b82 ¤   pgpAssert( IsNull( test.mFreeList.head->next ) );
51ce22 ¤   pgpAssert( test.mFreeList.head->numBytes == test.mFreeList.maxFreeBytes );
f32cc9 ¤   pgpAssert( startFree == test.mFreeList.curFreeBytes );
b99371 ¤   }
a1af5a
f5af5a
ab7bbe /*_________________________________________________________________________
9eaadd ¤   test allocation followed by all possible orders of deallocation
c08ac7 _________________________________________________________________________*/
ba6d52 ¤   void
6944ce CBlindWriteQueue::TestDeallocateCombinations( void )
fdc7a1 ¤   {
824d7f ¤   CBlindWriteQueue¤   test( 3 * (sizeof( RequestHeader ) + 512 ) );
d712f0 ¤   ulong¤  ¤   ¤   ¤   startFree¤  = test.mFreeList.curFreeBytes;
6d67c5 ¤
cf3b73 ¤   pgpAssert( IsntNull( test.mFreeList.head ) );
8c6b82 ¤   pgpAssert( IsNull( test.mFreeList.head->next ) );
9fce22 ¤   pgpAssert( test.mFreeList.head->numBytes == test.mFreeList.maxFreeBytes );
8667c5 ¤
4267c5 ¤
1e728f ¤   RequestHeader *request1;
789deb ¤   RequestHeader *request2;
86c737 ¤   RequestHeader *request3;
7867c5 ¤
4e67c5 ¤
e1d2d3 ¤   request1¤   = test.Allocate( 512 );¤pgpAssert( IsntNull( request1 ) );
e2c4db ¤   request2¤   = test.Allocate( 512 );¤pgpAssert( IsntNull( request2 ) );
39c923 ¤   request3¤   = test.Allocate( 512 );¤pgpAssert( IsntNull( request3 ) );
d15b94 ¤   test.Deallocate( request1 );
a74658 ¤   test.Deallocate( request2 );
974d1c ¤   test.Deallocate( request3 );
d767c5 ¤
2267c5 ¤
920bc0 ¤   request1¤   = test.Allocate( 512 );
970882 ¤   request2¤   = test.Allocate( 512 );
cdf1b3 ¤   request3¤   = test.Allocate( 512 );
c25b94 ¤   test.Deallocate( request1 );
674d1c ¤   test.Deallocate( request3 );
cd4658 ¤   test.Deallocate( request2 );
1767c5 ¤
0667c5 ¤
ca0bc0 ¤   request1¤   = test.Allocate( 512 );
a30882 ¤   request2¤   = test.Allocate( 512 );
abf1b3 ¤   request3¤   = test.Allocate( 512 );
ca4658 ¤   test.Deallocate( request2 );
705b94 ¤   test.Deallocate( request1 );
764d1c ¤   test.Deallocate( request3 );
6167c5 ¤
2b67c5 ¤
170bc0 ¤   request1¤   = test.Allocate( 512 );
860882 ¤   request2¤   = test.Allocate( 512 );
01f1b3 ¤   request3¤   = test.Allocate( 512 );
f74658 ¤   test.Deallocate( request2 );
764d1c ¤   test.Deallocate( request3 );
3f5b94 ¤   test.Deallocate( request1 );
--e9f6 0014ad70d5e4012002c Page 8 of CBlindWriteQueue.cp
2a67c5 ¤
e567c5 ¤
2c0bc0 ¤   request1¤   = test.Allocate( 512 );
040882 ¤   request2¤   = test.Allocate( 512 );
b8f1b3 ¤   request3¤   = test.Allocate( 512 );
a54d1c ¤   test.Deallocate( request3 );
425b94 ¤   test.Deallocate( request1 );
704658 ¤   test.Deallocate( request2 );
c167c5 ¤
ae67c5 ¤
310bc0 ¤   request1¤   = test.Allocate( 512 );
660882 ¤   request2¤   = test.Allocate( 512 );
baf1b3 ¤   request3¤   = test.Allocate( 512 );
e74d1c ¤   test.Deallocate( request3 );
444658 ¤   test.Deallocate( request2 );
8e5b94 ¤   test.Deallocate( request1 );
baaf5a
f3af5a
803b73 ¤   pgpAssert( IsntNull( test.mFreeList.head ) );
a56b82 ¤   pgpAssert( IsNull( test.mFreeList.head->next ) );
ebce22 ¤   pgpAssert( test.mFreeList.head->numBytes == test.mFreeList.maxFreeBytes );
342cc9 ¤   pgpAssert( startFree == test.mFreeList.curFreeBytes );
e19371 ¤   }
0f67c5 ¤
a867c5 ¤
fc6d52 ¤   void
85792a CBlindWriteQueue::Test( void )
38c7a1 ¤   {
2d2411 ¤   TestOddEven();
53d9e8 ¤   TestDeallocateCombinations();
eb9371 ¤   }
5767c5 ¤
0276d8 #endif¤ // ]
8f67c5 ¤
7d67c5 ¤
aa67c5 ¤
22af5a
f13a26 #endif¤ // ] BLIND_WRITES
20af5a
33af5a
1aaf5a
baaf5a
b3af5a
2aaf5a
dcaf5a
c8af5a
fcaf5a
11af5a
f6af5a
acaf5a
87af5a
94af5a
d3af5a
aaaf5a
98af5a
c5af5a
08af5a
4aaf5a
--765e 00166cf2d624012002d Page 1 of CBlindWriteQueue.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
f33533 ¤   $Id: CBlindWriteQueue.h,v 1.3.8.1 1998/11/12 03:05:34 heller Exp $
83f7f7 ____________________________________________________________________________*/
57af5a
fc7b7d #pragma once
a3af5a
6214a8 #if BLIND_WRITES¤   // [
0faf5a
d8af5a
ea9fd6 struct RequestHeader;
d7af5a
741720 class CBlindWriteQueue
93c7a1 ¤   {
a36bdd ¤   enum { kDefaultBufferSize¤  = 128 * 1024UL };
c867c5 ¤
2ce503 ¤   Boolean¤¤   ¤   mGoingAway;
a067c5 ¤
65d22f ¤   void *¤ ¤   ¤   mBuffer;
491b30 ¤   ulong¤  ¤   ¤   mBufferSize;
e24a89 ¤   struct
ad5b34 ¤   ¤   {
4b0dd3 ¤   ¤   RequestHeader *¤head;
0561c1 ¤   ¤   ulong¤  ¤   ¤   maxFreeBytes;
6fc4fc ¤   ¤   ulong¤  ¤   ¤   curFreeBytes;
9e8b53 ¤   ¤   } mFreeList;
0faf5a
5ed246 ¤   void¤   ¤   ¤   CreateFreeList( void );
13b243 ¤   void¤   ¤   ¤   MergeWithNext( RequestHeader *¤ request);
c2e624 ¤   RequestHeader *¤Allocate( ulong size );
9ae360 ¤   void¤   ¤   ¤   Deallocate( RequestHeader *request );
9867c5 ¤
761be5 ¤   static pascal void¤ sCompletionProc( void );
0367c5 ¤
13b813 ¤   ¤   ¤   ¤   ¤   CBlindWriteQueue( ulong size = kDefaultBufferSize );
9c67c5 ¤
205ed4 public:
d785c8 ¤   static OSErr¤   Create( CBlindWriteQueue ** writer,
a136d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ulong size = kDefaultBufferSize);
a6134e ¤   virtual¤¤   ¤   ~CBlindWriteQueue( void );
9267c5 ¤
b8e426 ¤   enum RequestResult{ kRequestHandled = 23, kRequestNotHandled };
4b20e9 ¤   RequestResult¤  HandleRequest( const ParamBlockRec * pb );
6f67c5 ¤
a96ebd ¤   void¤   ¤   ¤   WaitIODone( void );
c5af5a
2c5c98 #if PGP_DEBUG
2240e3 ¤   static void¤¤   Test( void );
8528b1 ¤   static void¤¤   TestOddEven( void );
c93d5a ¤   static void¤¤   TestDeallocateCombinations( void );
bd7454 #endif
5662bd ¤   };
c967c5 ¤
1a67c5 ¤
66789a #endif¤ // ] BLIND_WRITES¶
--ed6d 000433f3de54012002e Page 1 of CChangeModDateQueue.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
acf741 ¤   $Id: CChangeModDateQueue.cp,v 1.4.8.1 1998/11/12 03:05:34 heller Exp $
65f7f7 ____________________________________________________________________________*/
5aaf5a
407b7d #pragma once
a6af5a
64bbf4 #include "MacFiles.h"
b3af5a
fa04ee #include "CChangeModDateQueue.h"
feaf5a
dfaf5a
09af5a
af7bbe /*_________________________________________________________________________
cc8a66 ¤   Change the modification date of the specified file asynchronously
e58ac7 _________________________________________________________________________*/
866d52 ¤   void
23874b CChangeModDateQueue::ChangeModDate(
d4fbb6 ¤   const FSSpec *¤ spec,
c9968c ¤   ulong ¤ ¤   ¤   newModificationDate )
33c7a1 ¤   {
80a45f ¤   QueuePB *¤  ¤   ¤   qpb;
de4318 ¤   ModPB *¤¤   ¤   ¤   modPB;
cd67c5 ¤
db9156 ¤   qpb¤= GetPB();
b267c5 ¤
8f5a04 ¤   modPB¤  = (ModPB *)QueuePBToCommonPBHeader( qpb );
1367c5 ¤
12c48f ¤   modPB->spec¤¤   ¤   ¤   = *spec;
bd3c06 ¤   modPB->newModificationDate¤ = newModificationDate;
71e7c7 ¤   modPB->isGetCatInfo¤¤   = TRUE;
8067c5 ¤
957d1d ¤   modPB->cpb.hFileInfo.ioVRefNum¤ ¤   = modPB->spec.vRefNum;
286938 ¤   modPB->cpb.hFileInfo.ioDirID¤   ¤   = modPB->spec.parID;
a1e99b ¤   modPB->cpb.hFileInfo.ioNamePtr¤ ¤   = modPB->spec.name;
c663f0 ¤   modPB->cpb.hFileInfo.ioFDirIndex¤   = 0;
5f67c5 ¤
f9e99e ¤   (void)PBGetCatInfoAsync( &modPB->cpb );
119371 ¤   }
33af5a
7eaf5a
43af5a
a07bbe /*_________________________________________________________________________
d0cd4d ¤   Override standard completion routine
328ac7 _________________________________________________________________________*/
766d52 ¤   void
548d5e CChangeModDateQueue::Completion( QueuePB *qpb )
b3c7a1 ¤   {
ef26b7 ¤   ModPB *¤modPB;
83af5a
505a04 ¤   modPB¤  = (ModPB *)QueuePBToCommonPBHeader( qpb );
c267c5 ¤
9de612 ¤   AssertNoErr( modPB->cpb.hFileInfo.ioResult,
78d3ef ¤   ¤   ¤   "CChangeModDateQueue::Completion" );
8c67c5 ¤
e29d80 ¤   if ( modPB->isGetCatInfo )
d35b34 ¤   ¤   {
f724e7 ¤   ¤   // this is the completion for PBGetCatInfoAsync
e7e885 ¤   ¤   // reuse same PB for PBSetCatInfoAsync
6d3ae2 ¤   ¤   modPB->isGetCatInfo¤= false;
8c1b52 ¤   ¤
4f0eb5 ¤   ¤   modPB->cpb.hFileInfo.ioVRefNum¤ ¤   ¤   = modPB->spec.vRefNum;
a38dc2 ¤   ¤   modPB->cpb.hFileInfo.ioDirID¤   ¤   ¤   = modPB->spec.parID;
88a44a ¤   ¤   modPB->cpb.hFileInfo.ioNamePtr¤ ¤   ¤   = modPB->spec.name;
488259 ¤   ¤   cpbModificationDate( &modPB->cpb )¤ ¤   = modPB->newModificationDate;
ce1b52 ¤   ¤
216a00 ¤   ¤   (void)PBSetCatInfoAsync( &modPB->cpb );
ef0fe4 ¤   ¤   }
160e24 ¤   else
435b34 ¤   ¤   {
--7c36 0012f679de04012002e Page 2 of CChangeModDateQueue.cp
13f201 ¤   ¤   // this is the completion for PBSetCatInfoAsync--all done
850deb ¤   ¤   inherited::Completion( qpb );
9b0fe4 ¤   ¤   }
579371 ¤   }
edaf5a
78af5a
49af5a
3aaf5a
34af5a
22af5a
2fbd73 ¤   ¶
--1807 001d89b3a104012002f Page 1 of CChangeModDateQueue.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
b20d59 ¤   $Id: CChangeModDateQueue.h,v 1.3.8.1 1998/11/12 03:05:35 heller Exp $
50f7f7 ____________________________________________________________________________*/
a7af5a
d67b7d #pragma once
8aaf5a
d3af5a
530a24 #include "CPBQueue.h"
22af5a
15af5a
5b495c class CChangeModDateQueue : public CPBQueue
b1c7a1 ¤   {
dfa2d3 protected:
a4e964 ¤   typedef CPBQueue¤   inherited;
e267c5 ¤
48f5e2 ¤   typedef struct
135b34 ¤   ¤   {
65adf6 ¤   ¤   CInfoPBRec¤ cpb;¤   // must be first
d98ed9 ¤   ¤   FSSpec¤ ¤   spec;
d49399 ¤   ¤   ulong¤  ¤   newModificationDate;
6381d9 ¤   ¤   Boolean¤¤   isGetCatInfo;
3da41e ¤   ¤   } ModPB;
de1b52 ¤   ¤
a407b8 ¤   virtual ulong¤  GetPBSize( void )¤  { return( sizeof( ModPB ) ); }
5767c5 ¤
1b917b ¤   virtual void¤   Completion( QueuePB *pb );
3667c5 ¤
2a5ed4 public:
ac22ab ¤   void¤   ¤   ChangeModDate( const FSSpec *spec, ulong newModDate );
d85298 ¤   };¶
--379d 001fcbdd89640120030 Page 1 of CCloseQueue.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
02ef8e ¤   $Id: CCloseQueue.cp,v 1.2.8.1 1998/11/12 03:05:36 heller Exp $
76f7f7 ____________________________________________________________________________*/
43af5a
777b7d #pragma once
4faf5a
3eae83 #include "CCloseQueue.h"
0eaf5a
0caf5a
35af5a
a37bbe /*_________________________________________________________________________
ff60fe ¤   Close the specified file asynchronously
398ac7 _________________________________________________________________________*/
216d52 ¤   void
c7e0cc CCloseQueue::Close( short fileRefNum )
34c7a1 ¤   {
6da45f ¤   QueuePB *¤  ¤   ¤   qpb;
05c7e4 ¤   ParamBlockRec *¤¤   pb;
e367c5 ¤
579156 ¤   qpb¤= GetPB();
b667c5 ¤
fcde0c ¤   pb¤ = (ParamBlockRec *)QueuePBToCommonPBHeader( qpb );
bb67c5 ¤
ade28f ¤   pb->ioParam.ioRefNum¤   ¤   = fileRefNum;
d43ec8 ¤   (void)PBCloseAsync( pb );
5bedb6 ¤   // ignore error; bogus error 2100 occassionally returned
0b9371 ¤   }
05af5a
2aaf5a
91af5a
b5af5a
fcbd73 ¤   ¶
--cc76 001277cc4b140120031 Page 1 of CCloseQueue.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
e18a06 ¤   $Id: CCloseQueue.h,v 1.2.8.1 1998/11/12 03:05:36 heller Exp $
dff7f7 ____________________________________________________________________________*/
11af5a
9b7b7d #pragma once
b7af5a
dfaf5a
a90a24 #include "CPBQueue.h"
66af5a
89af5a
83e573 class CCloseQueue : public CPBQueue
8cbb36 {
e0a2d3 protected:
dfca81 ¤   virtual ulong¤  GetPBSize( void )
8b6c4d ¤   ¤   ¤   ¤   ¤   ¤   { return( sizeof( ParamBlockRec ) ); }
5b67c5 ¤
965ed4 public:
a982ff ¤   void¤   ¤   ¤   Close( short fileRefNum );
27bf26 };¶
--9789 000b4885f1140120032 Page 1 of CDrive.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
bf7cdd ¤   $Id: CDrive.cp,v 1.10.8.2 1998/11/13 02:49:38 heller Exp $
2af7f7 ____________________________________________________________________________*/
87af5a
367cab #include <stddef.h>
38cb2f #include <Math64.h>
f18bd8 #include "MacEnvirons.h"
45af5a
0e24f1 #include "CipherProc.h"
8235cf #include "CDrive.h"
3e8c21 #include "CipherContext.h"
98b488 #include "A4Stuff.h"
5d547d #include "SetupA4.h"
13de36 #include "PGPDisk.h"
26af8a #include "MacMemory.h"
d585c2 #include "MacStrings.h"
b3bbf4 #include "MacFiles.h"
893175 #include "PGPDiskEncryptDecrypt.h"
72f359 #include "MacInterrupts.h"
e4ae83 #include "CCloseQueue.h"
4104ee #include "CChangeModDateQueue.h"
4785f6 #include "UInt64.h"
64af5a
4e50c5 #include "PGPDiskDRVRMain.h"
59bdd8 #include "AddDriveStruct.h"
a480c9 #include "CBlindWriteQueue.h"
bcaf5a
6eaf5a
477295 #define MAX( a, b ) ¤   ( (a) >= (b) ? (a) : (b) )
a8da50 #define MIN( a, b ) ¤   ( (a) <= (b) ? (a) : (b) )
dbaf5a
5baf5a
7f5c98 #if PGP_DEBUG
3a090b #include "MacEvents.h"
a7f1ad inline Boolean¤ AlphaLockIsDown( void )
954677 ¤   ¤   ¤   ¤   ¤   { return( (GetAllModifiers() & alphaLock ) != 0 ); }
9e7454 #endif
7faf5a
75af5a
4533c8 ¤   static void
1704b7 InitDeferredTask(
1f28c7 ¤   DeferredTask *¤ defTask,
6c5b37 ¤   DeferredTaskUPP¤upp,
6ed833 ¤   long¤   ¤   ¤   param )
9fc7a1 ¤   {
80b65b ¤   defTask->qLink¤ ¤   = 0;
8a797b ¤   defTask->qType¤ ¤   = dtQType;
276055 ¤   defTask->dtFlags¤   = 0;
4c4da2 ¤   defTask->dtParam¤   = param;
a3b824 ¤   defTask->dtAddr¤¤   = upp;
80f4ac ¤   defTask->dtReserved¤= 0;
439371 ¤   }
e867c5 ¤
4d67c5 ¤
c66653 #if CDRIVE_WATCHDOG
2233c8 ¤   static void
cefd8e InitTMTask(
1eabf9 ¤   TMTask *¤   tmTask,
3c31d6 ¤   TimerUPP¤   upp)
c2c7a1 ¤   {
7c40e7 ¤   pgpClearMemory( tmTask, sizeof( *tmTask ) );
81e704 ¤   tmTask->tmAddr¤ = upp;
189371 ¤   }
087454 #endif
29af5a
56af5a
32dacc #pragma mark -
83af5a
b4af5a
--51b1 000f6e5b40d40120032 Page 2 of CDrive.cp
11bcd5 void *¤ ¤   ¤   ¤   ¤   CDrive::sScratchBuffer¤ ¤   ¤   = nil;
08d09b ulong¤  ¤   ¤   ¤   ¤   CDrive::sScratchBufferSize¤ ¤   = 0;
f49b4f CCloseQueue *¤  ¤   ¤   CDrive::sCloseQueue¤¤   ¤   ¤   = nil;
d91df1 CChangeModDateQueue *¤  CDrive::sModDateQueue¤  ¤   ¤   = nil;
a5af5a
4baf5a
925c98 #if PGP_DEBUG
9caf5a
286d52 ¤   void
8da6e5 CDrive::sAssertValid( const CDrive *drive )
33c7a1 ¤   {
2cb380 ¤   pgpAssertAddrValid( drive, short);
ee04ca ¤   pgpAssert( drive->mMagic == kDriveMagic );
3a9371 ¤   }
cb67c5 ¤
297454 #endif
02af5a
59af5a
077bbe /*_________________________________________________________________________
38eef2 ¤   Make a copy of the passed extents
dd8ac7 _________________________________________________________________________*/
78eacd ¤   OSErr
068f35 CDrive::InitExtents(
82917d ¤   const DiskExtent *¤ src,
c423fd ¤   ulong¤  ¤   ¤   ¤   numExtents )
81c7a1 ¤   {
28db4d ¤   ulong¤  extentSize¤ = numExtents * sizeof( src[ 0 ] );
658e70 ¤   OSErr¤  err¤= noErr;
0367c5 ¤
c4b263 ¤   mNumExtents¤= numExtents;
5067c5 ¤
09c5c6 ¤   mExtents¤   ¤   ¤   = (const DiskExtent *)NewPtrSys( extentSize );
a3cebd ¤   if ( IsntNull( mExtents ) )
255b34 ¤   ¤   {
b27097 ¤   ¤   BlockMoveData( src, (Ptr)mExtents, extentSize );
0e0fe4 ¤   ¤   }
e70e24 ¤   else
be5b34 ¤   ¤   {
403dca ¤   ¤   err¤= memFullErr;
f50fe4 ¤   ¤   }
801b52 ¤   ¤
cadeb7 ¤   return( err );
639371 ¤   }
55af5a
caaf5a
43af5a
a97bbe /*_________________________________________________________________________
d80a23 ¤   Initialize the string which the user sees when using "Get Info".
b067c5 ¤
e75fcb ¤   Important: do *not* use the file manager here. ·Doing so can cause
1754a9 ¤   deadlock under interrupt driven driver I/O.
418ac7 _________________________________________________________________________*/
b5eacd ¤   OSErr
921eb6 CDrive::InitVolumeInfo( short fileRefNum )
29c7a1 ¤   {
e0f67f ¤   FSSpec¤ spec;
978e70 ¤   OSErr¤  err¤= noErr;
8d67c5 ¤
d68541 ¤   err¤= GetSpecFromFCBTable( fileRefNum, &spec );
c35ecc ¤   if ( IsntErr( err ) )
525b34 ¤   ¤   {
471267 ¤   ¤   Str255¤ volumeName;
dc1b52 ¤   ¤
bfe405 ¤   ¤   const VCB *¤vcb¤= GetVCBForVolume( spec.vRefNum );
5e1b52 ¤   ¤
195e1a ¤   ¤   pgpAssert( IsntNull( vcb ) );
f5974b ¤   ¤   CopyPString( vcb->vcbVN, volumeName );
ace275 ¤   ¤   CopyPString( vcb->vcbVN, mVolumeName );
b11b52 ¤   ¤
ead798 ¤   ¤   if ( IsntErr( err ) )
0ff776 ¤   ¤   ¤   {
f6bb81 ¤   ¤   ¤   // initialize mVolumeString to read:
--3866 00006225f5340120032 Page 3 of CDrive.cp
91a62c ¤   ¤   ¤   // ·"PGPDisk file name on volume Fred"·
b74735 ¤   ¤   ¤   CopyPString( "\p\322", mVolumeString);
1a9515 ¤   ¤   ¤   AppendPString( spec.name, mVolumeString);
d5a0f2 ¤   ¤   ¤   AppendPString( "\p\323 on ·volume \322", mVolumeString);
c31b07 ¤   ¤   ¤   AppendPString( volumeName, mVolumeString);
614d42 ¤   ¤   ¤   AppendPString( "\p\323", mVolumeString);
ae87c7 ¤   ¤   ¤
b1478b ¤   ¤   ¤   // any additional info can be appended here:
ba94d3 ¤   ¤   ¤   AppendPString( "\p version ", mVolumeString);
830674 ¤   ¤   ¤   NumVersion¤ ¤   version;
338d20 ¤   ¤   ¤   Str255¤ ¤   ¤   versionString;
f65a6d ¤   ¤   ¤   *(ushort *)&version¤= kPGPDiskDriverVersion;
1920e9 ¤   ¤   ¤   NumVersionToString( &version, versionString );
f39037 ¤   ¤   ¤   AppendPString( versionString, mVolumeString);
3ba3a6 ¤   ¤   ¤   }
170fe4 ¤   ¤   }
f4deb7 ¤   return( err );
4c9371 ¤   }
7867c5 ¤
8967c5 ¤
da7bbe /*_________________________________________________________________________
24f2d6 ¤   Initialize both cipher contexts and the variable which tracks which one
cbb1d4 ¤   has its bits flipped.
2f8ac7 _________________________________________________________________________*/
06eacd ¤   OSErr
0963f8 CDrive::InitCipherContext(
4e5eb6 ¤   const CASTKey *¤¤   ¤   key,
254afe ¤   const PassphraseSalt *¤ salt)
0bc7a1 ¤   {
938e70 ¤   OSErr¤  err¤= noErr;
fb67c5 ¤
7b5242 ¤   pgpAssert( mCipherProcRef != kInvalidCipherProcRef );
3167c5 ¤
448be5 ¤   // initialize our two cipher contexts. One is correct and the other
2e6422 ¤   // has its bits flipped and we periodically reverse them
21958e ¤   mWhichCipherContextValid¤   = 0;
f2e150 ¤   mCipherContext[ 0 ].salt¤   = *salt;
8a530f ¤   err¤= CipherProc_CallInitContext( mCipherProcRef, &mCipherContext[ 0 ],
71aff2 ¤   ¤   ¤   ¤   key->keyBytes);
a81b52 ¤   ¤
651b52 ¤   ¤
8c46c6 ¤   // make the 2nd one be the same, then flip its bits
caefeb ¤   mCipherContext[ 1 ]¤= mCipherContext[ 0 ];
813661 ¤   FlipBytes( (void *)mCipherContext[ 1 ].castCFB.expandedKey.keyWords,
155374 ¤   ¤   sizeof( mCipherContext[ 1 ].castCFB.expandedKey.keyWords ) );
9667c5 ¤
25deb7 ¤   return( err );
699371 ¤   }
0467c5 ¤
f9af5a
d5af5a
147bbe /*_________________________________________________________________________
4d4977 ¤   Initialize everything using the supplied info.
dd67c5 ¤
c48ff7 ¤   Important: any error conditions must return an appropriate error code.
698ac7 _________________________________________________________________________*/
6f85ea ¤   OSStatus
5c50e8 CDrive::Init( const InitInfo * init )
d0c7a1 ¤   {
5d24f0 ¤   const AddDriveStruct *¤ info¤   = init->info;
4e6e85 ¤   OSStatus¤   ¤   ¤   ¤   err¤= noErr;
848645 ¤   const VCB *¤¤   ¤   ¤   vcb¤= nil;
1767c5 ¤
6ff3dd ¤   pgpAssertAddrValid( info, CDrive::InitInfo );
6699f3 ¤   pgpAssertAddrValid( init->pbArray, CDrive::MyPB );
40bd1a ¤   pgpAssert( init->numPBs >= info->numExtents );
eba155 ¤   pgpAssert( init->cipherProcRef != kInvalidCipherProcRef );
357dd5 ¤   AssertFileRefNumIsValid( info->fileRefNum, "CDrive::CDrive" );
4438ed ¤   pgpAssertAddrValid( info->extents, DiskExtent );
8e1cf1 ¤   pgpAssert( info->numExtents != 0 );
94af5a
06af5a
--312d 0002f40511440120032 Page 4 of CDrive.cp
30f571 ¤   // all drives share sScratchBuffer, but setting it is OK
ea67c5 ¤
42e942 ¤   mCipherProcRef¤ ¤   = init->cipherProcRef;
09c762 ¤   mFileRefNum¤¤   ¤   = info->fileRefNum;
07109b ¤   mPhysicalIcon¤  ¤   = info->physicalIcon;
120abc ¤   mMediaIcon¤ ¤   ¤   = info->mediaIcon;
41345b ¤   mWriteProtected¤¤   = info->mountReadOnly;
471fd5 ¤   mBreakUpPBs¤¤   ¤   = info->shouldBreakUpRequests;
c867c5 ¤
2e3766 ¤   vcb¤= GetVCBForFile( info->fileRefNum );
e3b169 ¤   pgpAssert( IsntNull( vcb ) );
3667c5 ¤
8567c5 ¤
aa9cbc ¤   mBaseDriveVCB¤  ¤   ¤   = vcb;
29d6b5 ¤   mBaseDriveNumber¤   ¤   = vcb->vcbDrvNum;
5c4efb ¤   mBaseDriverRefNum¤  ¤   = vcb->vcbDRefNum;
9e67c5 ¤
06a8e2 ¤   const FlagsDrvQEl *¤flagsEl¤= (const FlagsDrvQEl *)
68559d ¤   ¤   ( ((const char *)::GetDriveQElem( mBaseDriveNumber )) -
9b16ec ¤   ¤   offsetof( FlagsDrvQEl, el ) );
76d095 ¤   mBaseDriveIsEjectable =
f0793c ¤   ¤   ( flagsEl->flags & kDriveIsNotEjectableMask ) == 0;
ef67c5 ¤
43ef77 ¤   SetPBs( init->pbArray, init->numPBs );
1d67c5 ¤
c85ecc ¤   if ( IsntErr( err ) )
2f5b34 ¤   ¤   {
8fa319 ¤   ¤   err¤= InitCipherContext( &info->decryptionKey, &info->salt );
eb5eab ¤   ¤   AssertNoErr( err, "CDrive::Init, InitCipherContext" );
8c0fe4 ¤   ¤   }
25af5a
485ecc ¤   if ( IsntErr( err ) )
ba5b34 ¤   ¤   {
7e64e9 ¤   ¤   err¤= InitExtents( info->extents, info->numExtents );
d6ece5 ¤   ¤   AssertNoErr( err, "CDrive::Init, InitExtents" );
bc0fe4 ¤   ¤   }
8aaf5a
465ecc ¤   if ( IsntErr( err ) )
9a5b34 ¤   ¤   {
7ba83d ¤   ¤   err¤= InitVolumeInfo( info->fileRefNum );
802d0b ¤   ¤   AssertNoErr( err, "CDrive::Init, InitVolumeInfo" );
450fe4 ¤   ¤   }
e167c5 ¤
f2bc90 ¤   AssertNoErr( err, "CDrive::Init" );
2adeb7 ¤   return( err );
579371 ¤   }
65af5a
a4af5a
19af5a
65af5a
91af5a
757bbe /*_________________________________________________________________________
3e437e ¤   Full initialization will be done later via Init().
c48ac7 _________________________________________________________________________*/
12d7a9 CDrive::CDrive( ·)
90c7a1 ¤   {
5046cc ¤   PrepareCallback();
6a67c5 ¤
e15c98 #if PGP_DEBUG
4efaf3 ¤   mMagic¤ ¤   ¤   ¤   = kDriveMagic;
407454 #endif
7267c5 ¤
2a556c ¤   mVCB¤   ¤   ¤   ¤   = nil;
3523ef ¤   mClientPB¤  ¤   ¤   = nil;
c8b321 ¤   mPBArray¤   ¤   ¤   = nil;
bc42c5 ¤   mNumPBs¤¤   ¤   ¤   = 0;
387be4 ¤   mBaseDriveNumber¤   = 0;
89b9ed ¤   mBaseDriverRefNum¤  = 0;
9d9efd ¤   mMyDQE¤ ¤   ¤   ¤   = nil;
4698a4 ¤   mCipherProcRef¤ ¤   = kInvalidCipherProcRef;
7f434b ¤   mFileRefNum¤¤   ¤   = 0;
2fdc99 ¤   mExtents¤   ¤   ¤   = 0;
--cb66 000dbb0ac6640120032 Page 5 of CDrive.cp
320d31 ¤   mNumExtents¤¤   ¤   = 0;
3a72de ¤   mReadTuner¤ ¤   ¤   = kDefaultReadTunerStruct;
f78f31 ¤   mWriteTuner¤¤   ¤   = kDefaultWriteTunerStruct128;
daac78 ¤   mVolumeString[ 0 ]¤ = 0;
2dcb2d ¤   mHasBeenMounted¤¤   = false;
adeafe ¤   mUnmountedAppPSN.highLongOfPSN¤ = 0;
ed6d8e ¤   mUnmountedAppPSN.lowLongOfPSN¤  = kNoProcess;
7d37a4 ¤   mLastWriteTime¤ ¤   ¤   ¤   = 0;
5c06fb ¤   mLastFileModDateUpdate¤ ¤   = 0;
46c81a ¤   mBreakUpPBs¤¤   ¤   = TRUE;
ea9aa9 ¤   mDecryptLock¤   ¤   = false;
95200d ¤   mEncryptLock¤   ¤   = false;
0a6653 #if CDRIVE_WATCHDOG
dc980e ¤   mWatchdog.installed¤¤   ¤   = false;
7eeda1 ¤   // note: supposedly, the problem we're working around is fixed in 7.6.
f1d81d ¤   // it's also fixed on certain machines with certain systems, (PCI Macs
51766c ¤   // for example), but it's not clear which ones. We should be able to set
062af1 ¤   // this variable to false if we recognize a system without the problem
3feabb ¤   mWatchdog.shouldUseWatchdog¤= GetSystemVersion() < 0x0760;
027454 #endif
ee67c5 ¤
fd5c79 ¤   pgpClearMemory( &mCipherContext, sizeof( mCipherContext ) );
fd6f51 ¤   pgpClearMemory( &mPhysicalIcon, sizeof( mPhysicalIcon ) );
496827 ¤   pgpClearMemory( &mMediaIcon, sizeof( mMediaIcon ) );
c8af5a
8103ef #if ALLOW_VM_PAGING
a6f632 ¤   mVirtualMemoryIsOn¤ = VirtualMemoryIsOn();
cb7454 #endif
58af5a
fb703a ¤   mReinsertNotificationPending¤   = false;
f09371 ¤   }
5f67c5 ¤
f667c5 ¤
7660b5 CDrive::~CDrive()
f2c7a1 ¤   {
144351 ¤   OSErr¤  err;
5967c5 ¤
6fcebd ¤   if ( IsntNull( mExtents ) )
985b34 ¤   ¤   {
02eb65 ¤   ¤   DisposePtr( (Ptr)mExtents );
6b04a7 ¤   ¤   mExtents¤   = nil;
ac0fe4 ¤   ¤   }
bd67c5 ¤
9117aa ¤   mPBArray¤   = nil;¤ // we didn't allocate it
2367c5 ¤
0c67c5 ¤
8626ab ¤   // don't leave key around in memory!
c9893a ¤   pgpClearMemory( &mCipherContext[ 0 ], sizeof( mCipherContext ) );
be67c5 ¤
5267c5 ¤
a278d5 ¤   DrvQEl *¤   tempQElem;
8af96a ¤   if( IsntNull( mMyDQE ) )
8c5b34 ¤   ¤   {
8d2b99 ¤   ¤   err¤= RemoveDriveQEl( mMyDQE->el.dQDrive, &tempQElem);
73e6d3 ¤   ¤   AssertNoErr( err, "CDrive::~CDrive()" );
38d798 ¤   ¤   if ( IsntErr( err ) )
11f776 ¤   ¤   ¤   {
23ce6e ¤   ¤   ¤   pgpAssert( tempQElem == &mMyDQE->el );
56a3a6 ¤   ¤   ¤   }
ef937d ¤   ¤   DisposePtr( (Ptr)mMyDQE );
e4a3ed ¤   ¤   mMyDQE¤ ¤   ¤   = nil;
eb0fe4 ¤   ¤   }
4767c5 ¤
0f0bf2 ¤   // the following don't belong to us
a8a4a9 ¤   mDCE¤   ¤   ¤   = nil;
ad67c5 ¤
665c98 #if PGP_DEBUG
cfc29d ¤   mMagic¤ ¤   ¤   = ~kDriveMagic;
fc7454 #endif
f667c5 ¤
de67c5 ¤
db146a ¤   sCloseQueue->Close( mFileRefNum );
--4ed1 000ce76da1240120032 Page 6 of CDrive.cp
fdec50 ¤   mFileRefNum¤= 0;
8e9371 ¤   }
3baf5a
7caf5a
4baf5a
ef6d52 ¤   void
e9eaf1 CDrive::sSetScratchBuffer(
dd5bc6 ¤   void *¤ buffer,
345997 ¤   ulong¤  bufferSize )
efc7a1 ¤   {
fe9054 ¤   sScratchBuffer¤ ¤   = buffer;
859172 ¤   sScratchBufferSize¤ = bufferSize;
7f9371 ¤   }
f7af5a
72af5a
ed6d52 ¤   void
442738 CDrive::SetPBs(
10f6e9 ¤   void *¤ pbArray,
5ab5b8 ¤   ushort¤ numPBs )
9ac7a1 ¤   {
a47cae ¤   mPBArray¤   = (MyPB *)pbArray;
54a0c9 ¤   mNumPBs¤¤   = numPBs;
109371 ¤   }
d5af5a
8daf5a
b0cd8d ¤   static Boolean
55e3e1 TunerValid( const TunerStruct *tuner )
9fc7a1 ¤   {
e54574 ¤   Boolean¤isValid¤= TRUE;
e067c5 ¤
4ee83d ¤   for( ushort index = 0; index < TunerStruct::kNumTune; ++ index )
6d5b34 ¤   ¤   {
fc0011 ¤   ¤   if( tuner->maxBlocks[ index ] == 0 )
b1f776 ¤   ¤   ¤   {
74ecaa ¤   ¤   ¤   isValid¤= false;
36cdcb ¤   ¤   ¤   break;
95a3a6 ¤   ¤   ¤   }
cd0fe4 ¤   ¤   }
6367c5 ¤
40195c ¤   return( isValid );
549371 ¤   }
1167c5 ¤
f667c5 ¤
066d52 ¤   void
d6cc55 CDrive::SetReadTuner( const TunerStruct *tuner )
d1c7a1 ¤   {
9df9c5 ¤   if ( TunerValid( tuner ) )
4e5b34 ¤   ¤   {
4c10a5 ¤   ¤   mReadTuner¤ = *tuner;
8b0fe4 ¤   ¤   }
439371 ¤   }
0567c5 ¤
6e67c5 ¤
6d6d52 ¤   void
41441e CDrive::SetWriteTuner( const TunerStruct *tuner )
65c7a1 ¤   {
c3f9c5 ¤   if ( TunerValid( tuner ) )
525b34 ¤   ¤   {
b5c927 ¤   ¤   mWriteTuner¤= *tuner;
580fe4 ¤   ¤   }
229371 ¤   }
ad67c5 ¤
feaf5a
406d52 ¤   void
3dd327 CDrive::DecryptPB( const MyPB *myPB )
acc7a1 ¤   {
d52379 ¤   ulong¤  ¤   numBlocks;
69829d ¤   uchar *¤¤   buffer;
f467c5 ¤
908e18 ¤   numBlocks¤  = GetPBNumBlocks( myPB );
891915 ¤   buffer¤ ¤   = (uchar *)myPB->ioPB.pb.ioParam.ioBuffer;
ce67c5 ¤
--f7bc 00038d4dd1f40120032 Page 7 of CDrive.cp
62413f ¤   CipherProc_CallDecrypt( mCipherProcRef, GetCipherContext(),
d9f42b ¤   ¤   ¤   myPB->startBlockOnSelf, numBlocks, buffer, buffer);
c29371 ¤   }
8caf5a
10af5a
1eaf5a
79af5a
e0af5a
b5af5a
1daf5a
9f8ef7 ¤   static asm void·
5f5853 CallIODone(
eaa7d8 ¤   DCtlEntry *¤dce,
deb83f ¤   OSErr¤  ¤   result)
d6bb36 {
6fc54f ¤   FRALLOC +
b50fdc ¤   move.l¤ dce, a1
a972b9 ¤   move.w¤ result, d0
15aad1 ¤   FRFREE
4b2f78 ¤   move.l¤ 0x08FC, -(A7)
3ab799 ¤   RTS
62f85d ¤   // jIODone returns to caller of this routine
a7efe6 }
abaf5a
7baf5a
69af5a
3a7bbe /*_________________________________________________________________________
3e9d5a ¤   See ScheduleRetry()
d78ac7 _________________________________________________________________________*/
b76d52 ¤   void
f1bcdd CDrive::RetryTMTask( MyPB *myPB )
51c7a1 ¤   {
a90489 ¤   RmvTime( (QElemPtr) &myPB->retry.tmTask );
be67c5 ¤
1bb10d ¤   // must reset the posOffset because the driver we called may have whacked it
d978e1 ¤   SetPosOffset( &myPB->ioPB, myPB->retry.startBlock,
4ccfcd ¤   ¤   ¤   myPB->ioPB.pb.ioParam.ioReqCount / kPGPDiskBlockSize );
bb67c5 ¤
91a0da ¤   if ( mIODirection == kReadDirection )
9a3d1b ¤   ¤   PBReadAsync( & myPB->ioPB.pb );
500e24 ¤   else
fca046 ¤   ¤   PBWriteAsync( & myPB->ioPB.pb );
b29371 ¤   }
b3af5a
99af5a
4d7bbe /*_________________________________________________________________________
7f9d5a ¤   See ScheduleRetry()
118ac7 _________________________________________________________________________*/
966d52 ¤   void
f29e72 CDrive::sRetryTMTask( void )
76c7a1 ¤   {
af1f09 ¤   TMTask *tmTask¤ = (TMTask *)GetA1();
b067c5 ¤
70953d ¤   EnterCodeResource();
8767c5 ¤
0b9ce2 ¤   MyPB *¤ myPB¤   = (MyPB *)((Ptr)tmTask - offsetof( MyPB, retry.tmTask ));
53977e ¤   pgpAssert( myPB->magic == MyPB::kMagic );
1a67c5 ¤
5a2104 ¤   myPB->theDrive->RetryTMTask( myPB );
ed1b52 ¤   ¤
181487 ¤   ExitCodeResource();
fa9371 ¤   }
1baf5a
6faf5a
d47bbe /*_________________________________________________________________________
f85217 ¤   An error was returned by the base driver for a parameter block. ··
60469d ¤   Try the I/O again. This case can occur in the following situations:
33db3c ¤   - ioErr on a flaky disk
410b60 ¤   - -4 error with FWB driver in certain situations (unknown cause)
b4e1b1 ¤   - possibly other errors
a167c5 ¤
38b1c4 ¤   As far as the rest of our code is concerned, the request never completed,
--0d7d 0004626bacb40120032 Page 8 of CDrive.cp
047ae4 ¤   so this retry need only try it again without noting the fact. ·But we want
e37f25 ¤   to introduce a delay so that the problem situation is hopefully avoided.
618ac7 _________________________________________________________________________*/
6f6d52 ¤   void
570156 CDrive::ScheduleRetry( MyPB *myPB )
06c7a1 ¤   {
7ac9b5 ¤   myPB->retry.count¤  += 1;
b867c5 ¤
a79fa6 ¤   InitTMTask( &myPB->retry.tmTask, (TimerUPP)sRetryTMTask );
3704bc ¤   InsTime( (QElemPtr) &myPB->retry.tmTask );
e367c5 ¤
158da6 ¤   enum { kRetryDelay = 5 };¤  // milliseconds
2d2153 ¤   PrimeTime( (QElemPtr)&myPB->retry.tmTask, kRetryDelay );
5b9371 ¤   }
0f67c5 ¤
fe67c5 ¤
db7bbe /*_________________________________________________________________________
57d3f2 ¤   A parameter block has completed
588ac7 _________________________________________________________________________*/
f06d52 ¤   void
bfa84e CDrive::HandleCompletion( MyPB *myPB )
53c7a1 ¤   {
48a5e2 ¤   OSErr¤  err¤= myPB->ioPB.pb.ioParam.ioResult;
ca67c5 ¤
675e68 ¤   pgpa((
22cca0 ¤   ¤   pgpaAssert( myPB->magic == MyPB::kMagic ),
20f7c6 ¤   ¤   pgpaAssert( myPB->ioPB.pb.ioParam.ioActCount ==
cd6cc5 ¤   ¤   ¤   ¤   myPB->ioPB.pb.ioParam.ioReqCount )
a0c0fb ¤   ¤   ));
cf67c5 ¤
224994 ¤   ushort¤ maxRetry¤   = MyPB::kMaxRetryCount;
93ed2e ¤   // FWB hack; may just be due to bad SCSI connection
3c693e ¤   if ( err == -4 )
7a5b34 ¤   ¤   {
b5b5e9 ¤   ¤   maxRetry¤   = MAX( maxRetry, 1000 );
9b0fe4 ¤   ¤   }
901b52 ¤   ¤
acea74 ¤   if ( IsErr( err ) &&
ea42aa ¤   ¤   myPB->retry.count < maxRetry )
e85b34 ¤   ¤   {
92e3b7 ¤   ¤   #if PGP_DEBUG
3dd5c2 ¤   ¤   if ( myPB->retry.count > 4 )
d1f776 ¤   ¤   ¤   {
5fbfc3 ¤   ¤   ¤   pgpDebugFmtMsg( ( pgpaFmtPrefix,
3fecf3 ¤   ¤   ¤   ¤   "retry failed %lu times with error %ld (will retry)",
62bc26 ¤   ¤   ¤   ¤   (ulong)myPB->retry.count, (long)err ) );
17a3a6 ¤   ¤   ¤   }
2fd656 ¤   ¤   #endif
836de8 ¤   ¤   ScheduleRetry( myPB );
910fe4 ¤   ¤   }
8f0e24 ¤   else
aa5b34 ¤   ¤   {
aaac6c ¤   ¤   // remember the last non-normal error that occurred...should be
e39415 ¤   ¤   // 'noErr' we'll return it as the result of the original client read
bd8cf4 ¤   ¤   if ( IsErr( err ) )
eff776 ¤   ¤   ¤   {
70bfc3 ¤   ¤   ¤   pgpDebugFmtMsg( ( pgpaFmtPrefix,
f33a9c ¤   ¤   ¤   ¤   "retry failed %lu times with error %l",
5bbc26 ¤   ¤   ¤   ¤   (ulong)myPB->retry.count, (long)err ) );
1d87c7 ¤   ¤   ¤
133a44 ¤   ¤   ¤   mResultErr¤ = err;
afa3a6 ¤   ¤   ¤   }
7587c7 ¤   ¤   ¤
3b991f ¤   ¤   if ( mIODirection == kReadDirection )
47f776 ¤   ¤   ¤   {
4f18ed ¤   ¤   ¤   HandleReadCompletion( myPB );
78a3a6 ¤   ¤   ¤   }
e30e1d ¤   ¤   else
70f776 ¤   ¤   ¤   {
a7ed00 ¤   ¤   ¤   pgpAssert( mIODirection == kWriteDirection );
08713f ¤   ¤   ¤   HandleWriteCompletion( myPB );
46a3a6 ¤   ¤   ¤   }
--da92 0004f13a17940120032 Page 9 of CDrive.cp
b50fe4 ¤   ¤   }
6b9371 ¤   }
b4af5a
0caf5a
e97bbe /*_________________________________________________________________________
bfc0ec ¤   An I/O request has been completed.
b6807b ¤   This hook proc is called by Device Manager
eb8ac7 _________________________________________________________________________*/
aa6685 ¤   pascal void
79dabc CDrive::sCompletionProc( void )
e5c7a1 ¤   {
5a6aab ¤   EnterCallback();
1567c5 ¤
08e2cd ¤   XIOPB *¤pb;
3c1e72 ¤   MyPB *¤ ¤   ¤   myPB;
d167c5 ¤
0dc838 ¤   pb¤ = (XIOPB *)GetA0();
c867c5 ¤
f46c5e ¤   myPB¤   = (MyPB *)(((char *)pb) - offsetof( MyPB, ioPB ));
b9977e ¤   pgpAssert( myPB->magic == MyPB::kMagic );
8c67c5 ¤
f8c930 ¤   CDrive::sAssertValid( myPB->theDrive );
a18dd3 ¤   myPB->theDrive->HandleCompletion( myPB );
0667c5 ¤
4236ff ¤   ExitCallback();
379371 ¤   }
26af5a
34af5a
d3af5a
8f67c5 ¤
847bbe /*_________________________________________________________________________
546969 ¤   Find the extent which contains the data corresponding to the block at
ca3465 ¤   offset 'blockIndexOnOurDrive' in our drive (not the base drive).
3b8ac7 _________________________________________________________________________*/
7ee9aa ¤   const DiskExtent *
73ef2a CDrive::FindExtentContainingBlock(
92d17f ¤   const ulong¤¤   blockIndex,
e35967 ¤   ulong *¤¤   ¤   startBlockOfExtentPtr)
c8c7a1 ¤   {
c4076a ¤   ulong¤  blocksCoveredSoFar¤ ¤   = 0;
db67c5 ¤
d049b8 ¤   pgpAssert( blockIndex < GetLogicalSizeInBlocks() );
e067c5 ¤
d5b25f ¤   for( ulong extentIndex = 0; extentIndex < mNumExtents; ++extentIndex )
7f5b34 ¤   ¤   {
ace47e ¤   ¤   const DiskExtent *¤ extent¤ = nil;
841b52 ¤   ¤
71b58d ¤   ¤   extent¤ = &mExtents[ extentIndex ];
c31b52 ¤   ¤
fa5c60 ¤   ¤   if ( blockIndex < blocksCoveredSoFar + extent->numBlocks )
0bf776 ¤   ¤   ¤   {
785987 ¤   ¤   ¤   *startBlockOfExtentPtr¤ = blocksCoveredSoFar;
f3c7ff ¤   ¤   ¤   return( extent );
95a3a6 ¤   ¤   ¤   }
f21b52 ¤   ¤
c57d14 ¤   ¤   blocksCoveredSoFar¤ += extent->numBlocks;
6d0fe4 ¤   ¤   }
9b67c5 ¤
220ca9 ¤   pgpDebugFmtMsg( (pgpaFmtPrefix,
7355ff ¤   ¤   "CDrive::FindExtentContainingOffset: illegal blockIndex %ul",
806784 ¤   ¤   blockIndex) );
221258 ¤   return( nil );
069371 ¤   }
a6af5a
efaf5a
2aa91f ¤   CDrive::MyPB *
01a45e CDrive::GetIndPB( ushort index )
36c7a1 ¤   {
c1e96f ¤   pgpAssert( index < mNumPBs );
cde902 ¤   return( &mPBArray[ index ] );
cc9371 ¤   }
4faf5a
--a6f8 0001abf92be40120032 Page 10 of CDrive.cp
e0af5a
2c6d52 ¤   void
337425 CDrive::SetPosOffset(
ad3a54 ¤   XIOPB *¤pb,
39d6d5 ¤   ulong¤  startBlock,
da688c ¤   ulong¤  numBlocks)
d2c7a1 ¤   {
4e95db ¤   if ( NeedWidePositioning( startBlock, numBlocks ) )
b55b34 ¤   ¤   {
e6e0a8 ¤   ¤   CUInt64¤¤   startOffset;
9f1b52 ¤   ¤
6a454e ¤   ¤   pb->xpb.ioPosMode¤  ¤   = fsFromStart | kWidePosOffsetMask;
4e1b52 ¤   ¤
e35799 ¤   ¤   // multiplication not yet defined for UInt64 so use equivalent
490caf ¤   ¤   // shift operator
3e622e ¤   ¤   pgpAssert( kPGPDiskBlockSize == 512 );¤ // 2^9
1714aa ¤   ¤   startOffset¤¤   = CUInt64( 0, startBlock ) << 9;
f32a57 ¤   ¤   pb->xpb.ioWPosOffset¤   ¤   = startOffset;
ea0fe4 ¤   ¤   }
ce0e24 ¤   else
385b34 ¤   ¤   {
5d1194 ¤   ¤   pb->pb.ioParam.ioPosMode¤   = fsFromStart;
c64efd ¤   ¤   pb->pb.ioParam.ioPosOffset¤ = startBlock * kPGPDiskBlockSize;
1a0fe4 ¤   ¤   }
bd9371 ¤   }
9c67c5 ¤
2c7bbe /*_________________________________________________________________________
02c5f9 ¤   Fill in a parameter block in preparation for I/O, taking into account
c58fc4 ¤   whether wide positioning is needed.
db8ac7 _________________________________________________________________________*/
c46d52 ¤   void
b1ea9c CDrive::FillInPB(
0ac6eb ¤   MyPB *¤ ¤   ¤   myPB,
9e885e ¤   const void *¤   src,
5aedde ¤   Ptr¤¤   ¤   ¤   dest,
7dabb3 ¤   ulong¤  ¤   ¤   startBlock,
110975 ¤   ulong¤  ¤   ¤   numBlocks )
58c7a1 ¤   {
2560e9 ¤   IOParam *¤  io;
7f67c5 ¤
1ef5dc ¤   myPB->src¤  ¤   ¤   = src;
55cd23 ¤   myPB->theDrive¤ ¤   = this;
f65e2c ¤   myPB->retry.count¤  = 0;
52e780 ¤   myPB->retry.startBlock¤ = startBlock;
020a05 ¤   SetPBMagic( myPB );
ca67c5 ¤
2aae2c ¤   io¤ = &myPB->ioPB.pb.ioParam;
0bc255 ¤   io->ioCompletion¤   = sCompletionProc;
c2a543 ¤   io->ioVRefNum¤  ¤   = GetBaseDriveNumber();
77e2ed ¤   io->ioRefNum¤   ¤   = GetBaseDriverRefNum();
93cbbe ¤   io->ioBuffer¤   ¤   = dest;
e70b8d ¤   io->ioReqCount¤ ¤   = numBlocks * kPGPDiskBlockSize;
a967c5 ¤
264cd8 ¤   SetPosOffset( &myPB->ioPB, startBlock, numBlocks );
d09371 ¤   }
b2af5a
7aaf5a
037bbe /*_________________________________________________________________________
7bce3a ¤   Is an ejectable base drive available? ·The media could have been ejected,
ab3566 ¤   and new media inserted in its place.
ed8ac7 _________________________________________________________________________*/
307e69 ¤   Boolean
8a2973 CDrive::BaseDriveIsAvailable()
dabb36 {
71b342 ¤   Boolean¤isAvailable¤= TRUE;
7f67c5 ¤
e10ac1 ¤   if ( mBaseDriveIsEjectable )
6bc7a1 ¤   {
22fdfa ¤   ¤   pgpAssertAddrValid( mBaseDriveVCB, VCB );
3d3da2 ¤   ¤   isAvailable¤= ( mBaseDriveVCB->vcbDrvNum != 0 );
f69371 ¤   }
1a67c5 ¤
--53a0 0009a4f580040120032 Page 11 of CDrive.cp
f969cd ¤   return( isAvailable );
84efe6 }
14af5a
f7af5a
861741 typedef struct
66c7a1 ¤   {
f884b3 ¤   NMRec¤  nm;
8ae45b ¤   Str255¤ msg;
a21e69 ¤   } MyNMRec;
d567c5 ¤
e667c5 ¤
646d52 ¤   void
2cc6f1 CDrive::NMProc( NMRec *nmRec )
edc7a1 ¤   {
d46108 ¤   NMRemove( nmRec );
14703a ¤   mReinsertNotificationPending¤   = false;
9567c5 ¤
d03ad5 ¤   if ( ! BaseDriveIsAvailable() )
5bc7a1 ¤   {
bf13d3 ¤   ¤   NotifyUserToReinsert( nmRec->nmStr );
629371 ¤   }
c467c5 ¤
682087 ¤   DisposePtr( (Ptr)nmRec );
bb9371 ¤   }
6c67c5 ¤
a86685 ¤   pascal void
2435af CDrive::sNMProc( NMRec *nmRec )
33c7a1 ¤   {
5dfbe0 ¤   CDrive *¤   self¤   = (CDrive *)nmRec->nmRefCon;
ea67c5 ¤
b16aab ¤   EnterCallback();
239feb ¤   CDrive::sAssertValid( self );
9b9a5d ¤   self->NMProc( nmRec );
7636ff ¤   ExitCallback();
769371 ¤   }
94af5a
cdaf5a
a16d52 ¤   void
59ce53 CDrive::NotifyUserToReinsert( ConstStr255Param¤ msg )
16c7a1 ¤   {
9c87e6 ¤   if ( ! mReinsertNotificationPending )
e65b34 ¤   ¤   {
67be62 ¤   ¤   MyNMRec *¤  myRec¤  = nil;
7287c7 ¤   ¤   ¤
10b554 ¤   ¤   myRec¤  = (MyNMRec *)NewPtrSysClear( sizeof( *myRec ) );
c4676e ¤   ¤   if ( IsntNull( myRec ) )
4af776 ¤   ¤   ¤   {
e37761 ¤   ¤   ¤   CopyPString( msg, myRec->msg );
ab87c7 ¤   ¤   ¤
66cdb9 ¤   ¤   ¤   myRec->nm.qType¤¤   = nmType;
b486d8 ¤   ¤   ¤   myRec->nm.nmResp¤   = sNMProc;
9577ef ¤   ¤   ¤   myRec->nm.nmStr¤¤   = myRec->msg;
401a17 ¤   ¤   ¤   myRec->nm.nmRefCon¤ = (long)this;
e587c7 ¤   ¤   ¤
33a1c8 ¤   ¤   ¤   mReinsertNotificationPending¤   = TRUE;
85a133 ¤   ¤   ¤   NMInstall( &myRec->nm );
87a3a6 ¤   ¤   ¤   }
460fe4 ¤   ¤   }
f59371 ¤   }
0067c5 ¤
f467c5 ¤
e87bbe /*_________________________________________________________________________
1201cb ¤   If the base drive has been ejected, we want to tell the user to put it
190ffb ¤   back immediately. ·We do so by posting a notification manager task.
e0638c ¤   The task will keep reposting the alert until the user reinserts the disk.
538ac7 _________________________________________________________________________*/
c86d52 ¤   void
c5ecb9 CDrive::CheckBaseDriveEjected( ConstStr255Param¤messageTemplate )
37c7a1 ¤   {
c8c761 ¤   if ( ( ! BaseDriveIsAvailable() ) && ( ! mReinsertNotificationPending ) )
a75b34 ¤   ¤   {
9a9fbc ¤   ¤   Str255¤ ¤   msg;
--9b2a 000859e6b5b40120032 Page 12 of CDrive.cp
e0af5a
5aa14d ¤   ¤   CopyPString( messageTemplate, msg );
4466ca ¤   ¤   PrintPString( msg, msg, mVCB->vcbVN );
c7d1ec ¤   ¤   PrintPString( msg, msg, mBaseDriveVCB->vcbVN );
a7d1ec ¤   ¤   PrintPString( msg, msg, mBaseDriveVCB->vcbVN );
db1b52 ¤   ¤
6c7425 ¤   ¤   NotifyUserToReinsert( msg );
b10fe4 ¤   ¤   }
379371 ¤   }
d41b52 ¤   ¤
ddaf5a
5caf5a
fe7bbe /*_________________________________________________________________________
3487fa ¤   Initialize any common stuff in preparation for servicing a client read
17d660 ¤   or write.
268ac7 _________________________________________________________________________*/
6f6d52 ¤   void
2dc7cc CDrive::InitReadOrWrite(
abd98c ¤   ParamBlockRec *¤¤   clientPB,
3601c3 ¤   DCtlEntry *¤¤   ¤   dce,
1d780e ¤   IODirection¤¤   ¤   direction)
f7c7a1 ¤   {
6d49fd ¤   pgpAssert( mIOQueue.IsEmpty() );
372ab3 ¤   pgpAssert( mProcessingQueue.IsEmpty() );
cf67c5 ¤
cec8cc #if INSTRUMENT
9f0a3b ¤   Microseconds( &mStartTime );
4b7454 #endif
35af5a
511ef0 ¤   clientPB->ioParam.ioResult¤ = kAsyncIOInProgress;
ad67c5 ¤
7984ca ¤   GetDateTime( &mLastAccessTime );
2567c5 ¤
b8cf45 ¤   mIODirection¤   = direction;
51b8c3 ¤   mClientPB¤  ¤   = clientPB;
8fa8b1 ¤   mDCE¤   ¤   ¤   = dce;
6a14ca ¤   mResultErr¤ ¤   = noErr;
5faf5a
5403ef #if ALLOW_VM_PAGING
ad2cb5 ¤   mTreatAsVMRequest¤  = mVirtualMemoryIsOn &&·
e4d699 ¤   ¤   ¤   ¤   ¤   ¤   PBIsSync( clientPB ) &&
643660 ¤   ¤   ¤   ¤   ¤   ¤   direction == kReadDirection &&
53b02b ¤   ¤   ¤   ¤   ¤   ¤   clientPB->ioParam.ioReqCount <= 4096 ;
9d7454 #endif
2a9371 ¤   }
d0af5a
c967c5 ¤
596d52 ¤   void
f9b2d8 CDrive::UpdatePBAndCallIODone(
314170 ¤   OSErr¤  ¤   resultErr,
1c8e51 ¤   ulong¤  ¤   actualCount)
8ac7a1 ¤   {
534e61 ¤   pgpAssert( IsntNull( mClientPB ) );
cf67c5 ¤
1bed76 ¤   mClientPB->ioParam.ioResult¤¤   = resultErr;
0ffa63 ¤   mClientPB->ioParam.ioActCount¤  = actualCount;
0667c5 ¤
aa0d02 ¤   mClientPB¤  = nil;
237d61 ¤   CallIODone( mDCE, resultErr );
739371 ¤   }
e467c5 ¤
d167c5 ¤
f067c5 ¤
1367c5 ¤
addacc #pragma mark -
f7af5a
4daf5a
31dacc #pragma mark -
2767c5 ¤
167bbe /*_________________________________________________________________________
e9955d ¤   We've finished a client io request. ·Clean up and notify client
858ac7 _________________________________________________________________________*/
--5938 00021c4980140120032 Page 13 of CDrive.cp
3b6d52 ¤   void
7490af CDrive::MyIOIsDone(
70faa8 ¤   OSErr¤  resultErr,
7acc12 ¤   ulong¤  actualCount )
7bc7a1 ¤   {
c4a9a4 ¤   IOParam *¤  clientPB¤   = (IOParam *)mClientPB;
4f67c5 ¤
225e68 ¤   pgpa((
a220f1 ¤   ¤   pgpaAssert( IsntNull( clientPB ) ),
9a99fc ¤   ¤   pgpaAssert( actualCount == clientPB->ioReqCount ),
ff37ec ¤   ¤   pgpaAssert( resultErr != kAsyncIOInProgress )
0bc0fb ¤   ¤   ));
eb67c5 ¤
933034 ¤   LogMsg( "IOD [..." /*]*/);
7167c5 ¤
369373 ¤   ¤   UpdatePBAndCallIODone( resultErr, actualCount );
d367c5 ¤
0e52d9 ¤   LogMsg(/*[*/ "...]" );
a067c5 ¤
f726f2 ¤   // to match original read or write
d49166 ¤   LogMsg( /*[*/ "...]\r" );
c19371 ¤   }
6067c5 ¤
fe67c5 ¤
2a67c5 ¤
cc67c5 ¤
6a7e69 ¤   Boolean
12327e CDrive::IsValidRequest( const IOParam *pb)
64c7a1 ¤   {
e44574 ¤   Boolean¤isValid¤= TRUE;
36d0df ¤   UInt32¤ loOffset;
e267c5 ¤
3fea30 ¤   if ( PBUsesWidePositioning( pb ) )
a95b34 ¤   ¤   {
66646d ¤   ¤   loOffset¤   = ((XIOParam *)pb)->ioWPosOffset.lo;
830fe4 ¤   ¤   }
4a0e24 ¤   else
d65b34 ¤   ¤   {
3fd208 ¤   ¤   loOffset¤   = pb->ioPosOffset;
e80fe4 ¤   ¤   }
7b67c5 ¤
2b2dfc ¤   if ( ( loOffset % kPGPDiskBlockSize ) != 0 )
f75b34 ¤   ¤   {
fcd8f7 ¤   ¤   isValid¤= false;
cb5b3d ¤   ¤   pgpDebugPStr(
872ed3 ¤   ¤   ¤   "\pCDrive::IsValidRequest: offset is not a multiple of 512" );
220fe4 ¤   ¤   }
f7330c ¤   else if ( ( pb->ioReqCount % kPGPDiskBlockSize) != 0 )
115b34 ¤   ¤   {
e4d8f7 ¤   ¤   isValid¤= false;
935b3d ¤   ¤   pgpDebugPStr(
55f17c ¤   ¤   ¤   "\pCDrive::IsValidRequest: request is not a multiple of 512" );
cb0fe4 ¤   ¤   }
820e24 ¤   else
565b34 ¤   ¤   {
d2ff07 ¤   ¤   isValid¤= ( ::GetPBStartBlock( pb ) + ::GetPBNumBlocks( pb ) ) <=
0b8cb3 ¤   ¤   ¤   ¤   ¤   ¤   GetLogicalSizeInBlocks();
de5d14 ¤   ¤   pgpDebugMsgIf( ! isValid,
fd6044 ¤   ¤   ¤   "\pCDrive::IsValidRequest: request beyond end of drive" );
4a0fe4 ¤   ¤   }
6b67c5 ¤
065590 ¤   pgpAssert( isValid );
0a67c5 ¤
13195c ¤   return( isValid );
629371 ¤   }
c0af5a
a6af5a
cfaf5a
14af5a
06dacc #pragma mark -
70af5a
21af5a
--252f 00008745d2c40120032 Page 14 of CDrive.cp
e0af5a
726685 ¤   pascal void
5e7a5c CDrive::sKickStartDeferredTask()
88c7a1 ¤   {
481b33 ¤   // register A1 contains task.dtParam
f96e1f ¤   CDrive *¤   theDrive¤   = (CDrive *)GetA1();
ba8808 ¤   IODirection¤direction;
4f67c5 ¤
f2953d ¤   EnterCodeResource();
a667c5 ¤
cc6fb6 ¤   LogMsg( "KSDT [..." );
2b67c5 ¤
7a489d ¤   CDrive::sAssertValid( theDrive );
82af5a
9a6653 #if CDRIVE_WATCHDOG
666f97 ¤   theDrive->RemoveWatchdog();
f77454 #endif
2767c5 ¤
91a03b ¤   direction¤  = theDrive->GetIODirection();
003296 ¤   pgpAssert( direction == kReadDirection || direction == kWriteDirection );
3667c5 ¤
031678 ¤   if ( direction == kReadDirection )
485b34 ¤   ¤   {
ad673c ¤   ¤   theDrive->KickStartDeferredRead();
140fe4 ¤   ¤   }
c60e24 ¤   else
d25b34 ¤   ¤   {
25435a ¤   ¤   theDrive->KickStartDeferredWrite();
980fe4 ¤   ¤   }
3b67c5 ¤
3710e1 ¤   LogMsg( "...]" );
7a67c5 ¤
6a1487 ¤   ExitCodeResource();
8f9371 ¤   }
5eaf5a
07af5a
076d52 ¤   void
9af5fb CDrive::InstallDeferredTask(·
f08cb8 ¤   DeferredTask *¤ task,
c546c5 ¤   DeferredTaskUPP¤upp )
11c7a1 ¤   {
3f6653 #if CDRIVE_WATCHDOG
58f950 ¤   // note: we should install the watchdog *before* the deferred task
e9306f ¤   InstallWatchdog( task );
c07454 #endif
59af5a
b626b9 ¤   InitDeferredTask( task, upp, (long)this );
8faf5a
e6a06c ¤   OSErr¤  err¤= DTInstall( task );
a08be7 ¤   AssertNoErr( err, "InstallDeferredTask" );
989371 ¤   }
3167c5 ¤
1867c5 ¤
15af5a
74af5a
acaf49 #if CDRIVE_WATCHDOG¤// [
80af5a
e2af5a
a167c5 ¤
81af5a
2e67c5 ¤
c46d52 ¤   void
27270c CDrive::WatchdogTask()
e2c7a1 ¤   {
a95ce8 ¤   QHdr *¤ dtQueueHdr¤ = LMGetDTQueue();
5f8e70 ¤   OSErr¤  err¤= noErr;
e767c5 ¤
b853a3 ¤   err¤= Dequeue( (QElem *)mWatchdog.watchTask, dtQueueHdr );
0e5ecc ¤   if ( IsntErr( err ) )
045b34 ¤   ¤   {
ecf083 ¤   ¤   pascal void¤¤   (*taskProc)( void );
0841ab ¤   ¤   ulong¤  ¤   ¤   taskParam;
--7d83 0001a2534d340120032 Page 15 of CDrive.cp
f11b52 ¤   ¤
4c221e ¤   ¤   taskProc¤   ¤   = mWatchdog.watchTask->dtAddr;
5877bf ¤   ¤   taskParam¤  ¤   = mWatchdog.watchTask->dtParam;
9a261a ¤   ¤   SetA1( (void *)taskParam );
c5c459 ¤   ¤   (*taskProc)();
d20fe4 ¤   ¤   }
f10e24 ¤   else
c75b34 ¤   ¤   {
f658a3 ¤   ¤   // task not present...can occur if task was dequeued by deffered
606cd2 ¤   ¤   // task mgr but has not yet had chance to remove this watchdog
970fe4 ¤   ¤   }
6e9371 ¤   }
6267c5 ¤
da67c5 ¤
026685 ¤   pascal void
1af876 CDrive::sWatchdogTMTask()
9cc7a1 ¤   {
f9a306 ¤   WatchdogTMTask *myTask¤ = (WatchdogTMTask *)GetA1();
9267c5 ¤
58953d ¤   EnterCodeResource();
5c67c5 ¤
702c61 ¤   CDrive *¤   theDrive¤   = myTask->thisObject;
ad489d ¤   CDrive::sAssertValid( theDrive );
6c6ae4 ¤   theDrive->WatchdogTask();
9367c5 ¤
8e1487 ¤   ExitCodeResource();
af9371 ¤   }
5f67c5 ¤
7067c5 ¤
657bbe /*_________________________________________________________________________
e467c5 ¤
db8ac7 _________________________________________________________________________*/
496d52 ¤   void
eaba11 CDrive::InstallWatchdog( DeferredTask *watchTask )
acc7a1 ¤   {
d18b14 ¤   if ( mWatchdog.shouldUseWatchdog )
955b34 ¤   ¤   {
432bf3 ¤   ¤   pgpAssert( ! mWatchdog.installed );
691b52 ¤   ¤
64e5a0 ¤   ¤   mWatchdog.installed¤¤   ¤   = TRUE;
4e33f6 ¤   ¤   mWatchdog.watchTask¤¤   ¤   = watchTask;
4cbd86 ¤   ¤   mWatchdog.task.thisObject¤  = this;
8c52e0 ¤   ¤   InitTMTask( &mWatchdog.task.tmTask, (TimerUPP)sWatchdogTMTask );
349f79 ¤   ¤   InsTime( (QElemPtr) &mWatchdog.task.tmTask );
701b52 ¤   ¤
b1c582 ¤   ¤   // the length of the delay should be long enough so that the watchdog
3e44c4 ¤   ¤   // ideally never runs except when the system is deadlocked.
f1a0ee ¤   ¤   enum { kWatchdogDelay = 500 };
f8455e ¤   ¤   PrimeTime( (QElemPtr)&mWatchdog.task.tmTask, kWatchdogDelay );
5f0fe4 ¤   ¤   }
cc9371 ¤   }
a8af5a
c0af5a
f76d52 ¤   void
0cffa6 CDrive::RemoveWatchdog( )
98c7a1 ¤   {
a88b14 ¤   if ( mWatchdog.shouldUseWatchdog )
355b34 ¤   ¤   {
9a1abb ¤   ¤   pgpAssert( mWatchdog.installed );
051b52 ¤   ¤
710513 ¤   ¤   // a simple check suffices; it is only removed in one place
2060af ¤   ¤   if ( mWatchdog.installed )
fcf776 ¤   ¤   ¤   {
af231d ¤   ¤   ¤   RmvTime( (QElemPtr) &mWatchdog.task.tmTask );
c935a3 ¤   ¤   ¤   mWatchdog.installed¤¤   = false;
bba3a6 ¤   ¤   ¤   }
800fe4 ¤   ¤   }
7a9371 ¤   }
5faf5a
4faf5a
ef4ab7 #endif¤ // ] USE_TIME_MGR_KICK
1a67c5 ¤
--f11c 0000f8d791940120032 Page 16 of CDrive.cp
4bdacc #pragma mark -
dfaf5a
2aaf5a
c267c5 ¤
9b7bbe /*_________________________________________________________________________
605ea0 ¤   Insert a pb at index, moving existing pbs up as needed.
398ac7 _________________________________________________________________________*/
ab6d52 ¤   void
51174c CDrive::InsertPB(
0ea0c6 ¤   const ushort¤   pbIndex,
364d70 ¤   const ushort¤   numPBsInArray,
502282 ¤   const MyPB *¤   newPB)
7ec7a1 ¤   {
4e550f ¤   pgpAssert( pbIndex < mNumPBs );
359a4f ¤   pgpAssert( pbIndex <= numPBsInArray );
bc67c5 ¤
517afb ¤   ulong¤  numPBsToMove¤   = numPBsInArray - pbIndex;
ac67c5 ¤
39a753 ¤   if ( numPBsToMove != 0 )
835b34 ¤   ¤   {
5ffb00 ¤   ¤   BlockMoveData( &mPBArray[ pbIndex ], &mPBArray[ pbIndex + 1 ],
2142bd ¤   ¤   ¤   numPBsToMove * sizeof( mPBArray[ 0 ] ) ·);
2c0fe4 ¤   ¤   }
661b52 ¤   ¤
f88001 ¤   mPBArray[ pbIndex ]¤= *newPB;
e59371 ¤   }
32af5a
c8af5a
2bd90a // find the highest bit position in number
131951 ¤   static ulong
73f39d GetHighestBitNumber(ulong number)
f3c7a1 ¤   {
65c992 ¤   ulong¤  temp¤   = number;
aeb9de ¤   ulong¤  bits¤   = 0;
f967c5 ¤
a67d06 ¤   while ( temp != 0 )
505b34 ¤   ¤   {
e6e258 ¤   ¤   ++bits;
760402 ¤   ¤   temp¤   >>= 1;
760fe4 ¤   ¤   }
192795 ¤   return( bits );
1f9371 ¤   }
c567c5 ¤
d767c5 ¤
b47bbe /*_________________________________________________________________________
ff0c45 ¤   For an io request of size 'numBlocks' blocks, what is the maximum size
76ab9b ¤   I/O we should perform.
658ac7 _________________________________________________________________________*/
fa22dc ¤   ulong
da4d16 CDrive::GetBlockLimitForSize(
9ff679 ¤   const TunerStruct *¤tuner,
5f1670 ¤   ulong¤  ¤   ¤   ¤   numBlocks)
dfc7a1 ¤   {
c4a69f ¤   ushort¤ bits¤   = 0;
fd67c5 ¤
0abfca ¤   bits¤   = GetHighestBitNumber( numBlocks );
96cbb9 ¤   pgpAssert( bits != 0 );
de67c5 ¤
2e38f4 ¤   if ( bits > TunerStruct::kNumTune - 1 )
1ede6f ¤   ¤   bits¤   = TunerStruct::kNumTune - 1;
561b52 ¤   ¤
2663cb ¤   ulong¤  max¤= tuner->maxBlocks[ bits ];
2c67c5 ¤
54023e ¤   return( max );
059371 ¤   }
77af5a
88af5a
b87bbe /*_________________________________________________________________________
05342d ¤   Break up 'myPB' into two.
5167c5 ¤
895956 ¤   If 'firstPieceBlocks' is specified, use that size for the first one.
0f1e98 ¤   Otherwise, split the request in two.
--22c0 000b5d520b140120032 Page 17 of CDrive.cp
308ac7 _________________________________________________________________________*/
406d52 ¤   void
44aac7 CDrive::BreakUpPB(
55630c ¤   MyPB *¤ ¤   ¤   ¤   myPB,
58b6f9 ¤   MyPB *¤ ¤   ¤   ¤   outPB,
4078a6 ¤   ulong¤  ¤   ¤   ¤   firstPieceBlocks)
44c7a1 ¤   {
747a5b ¤   Ptr¤¤   ioBuffer¤   ¤   ¤   = myPB->ioPB.pb.ioParam.ioBuffer;
b44280 ¤   ulong¤  startBlock¤ ¤   ¤   = GetPBStartBlock( myPB );
b7f106 ¤   ulong¤  requestBlocks¤  ¤   = GetPBNumBlocks( myPB );
ee994b ¤   ulong¤  startBlockOnSelf¤   = myPB->startBlockOnSelf;
a91af8 ¤   ulong¤  numBlocksInFirst;
cd67c5 ¤
dcde8e ¤   pgpAssert( firstPieceBlocks == 0 || (firstPieceBlocks != 0 &&
718ecf ¤   ¤   ¤   ¤   ¤   firstPieceBlocks < requestBlocks ) );
bd67c5 ¤
a7a208 ¤   *outPB¤ = *myPB;
c867c5 ¤
d8ab4a ¤   if ( firstPieceBlocks == 0)
33c9c5 ¤   ¤   numBlocksInFirst¤   = requestBlocks / 2;
aa0e24 ¤   else
717953 ¤   ¤   numBlocksInFirst¤   = firstPieceBlocks;
e31b52 ¤   ¤
56c58a ¤   pgpAssert( numBlocksInFirst >= 1 );
6767c5 ¤
bb340e ¤   FillInPB( myPB, myPB->src, ioBuffer, startBlock, numBlocksInFirst );
f9f9b8 ¤   myPB->startBlockOnSelf¤ = startBlockOnSelf;
0d67c5 ¤
bb1ebf ¤   ulong¤  bytesInFirst¤   = numBlocksInFirst * kPGPDiskBlockSize;
b52736 ¤   FillInPB( outPB, (Ptr)myPB->src + bytesInFirst, ioBuffer + bytesInFirst,
52a4d7 ¤   ¤   startBlock + numBlocksInFirst, requestBlocks - numBlocksInFirst);
a2a007 ¤   outPB->startBlockOnSelf¤= startBlockOnSelf + numBlocksInFirst;
c79371 ¤   }
c967c5 ¤
b967c5 ¤
107bbe /*_________________________________________________________________________
1b6639 ¤   Split the indexth pb into two if it qualifies for breakup.
c68ac7 _________________________________________________________________________*/
a67e69 ¤   Boolean
307331 CDrive::BreakUpPBIfNeeded(
e2ce92 ¤   const ulong¤¤   ¤   clientRequestBlocks,
8c630c ¤   MyPB *¤ ¤   ¤   ¤   myPB,
4bb6f9 ¤   MyPB *¤ ¤   ¤   ¤   outPB,
d388c1 ¤   const TunerStruct *¤tuner)
c3c7a1 ¤   {
313288 ¤   ulong¤  ¤   maxBlocks;
8bb61e ¤   ulong¤  ¤   requestBlocks;
d19e04 ¤   Boolean¤¤   didBreak¤   = false;
5367c5 ¤
5270ab ¤   pgpAssertAddrValid( tuner, TunerStruct);
0467c5 ¤
068a74 ¤   requestBlocks¤  = GetPBNumBlocks( myPB );
e767c5 ¤
55e181 ¤   maxBlocks¤  ¤   = GetBlockLimitForSize( tuner, clientRequestBlocks );
287b15 ¤   if ( requestBlocks > maxBlocks )
ee5b34 ¤   ¤   {
8e9c48 ¤   ¤   BreakUpPB( myPB, outPB );
dabe2d ¤   ¤   didBreak¤   = TRUE;
c90fe4 ¤   ¤   }
f367c5 ¤
20f2ad ¤   return( didBreak );
519371 ¤   }
d767c5 ¤
7b67c5 ¤
117bbe /*_________________________________________________________________________
47694e ¤   Loop once through the list of read pbs, breaking up any that exceed our
d401cb ¤   size limits. Does not attempt to recursively break things up again.
4c8ac7 _________________________________________________________________________*/
0f22dc ¤   ulong
97a785 CDrive::BreakUpPBs(
5ace92 ¤   const ulong¤¤   ¤   clientRequestBlocks,
b57b76 ¤   const ushort¤   ¤   numPBsIn,
--00c7 00085190eaa40120032 Page 18 of CDrive.cp
4c88c1 ¤   const TunerStruct *¤tuner)
cdc7a1 ¤   {
f9107f ¤   ushort¤ pbIndex¤= 0;
440096 ¤   ushort¤ numPBs¤ = numPBsIn;
3567c5 ¤
1c0ee5 ¤   // loop until we've done all pbs or until we run out of parameter blocks
260ea8 ¤   while( pbIndex < numPBs && numPBs < mNumPBs)
f15b34 ¤   ¤   {
093ef0 ¤   ¤   MyPB *¤ curPB;
5fd2c3 ¤   ¤   MyPB¤   tempPB;
2c362b ¤   ¤   Boolean¤didBreak;
3d1b52 ¤   ¤
a32250 ¤   ¤   curPB¤  ¤   = GetIndPB( pbIndex );
3306de ¤   ¤   didBreak¤   = BreakUpPBIfNeeded( clientRequestBlocks, curPB, &tempPB,
fa590a ¤   ¤   ¤   ¤   ¤   ¤   ¤   tuner);
c401a7 ¤   ¤   if ( didBreak )
08f776 ¤   ¤   ¤   {
82808a ¤   ¤   ¤   // advance past cur and insert new item after it
72d8d6 ¤   ¤   ¤   ++pbIndex;¤
e6f089 ¤   ¤   ¤   InsertPB( pbIndex, numPBs, &tempPB );
d387c7 ¤   ¤   ¤
0c84ae ¤   ¤   ¤   ++numPBs;
32a3a6 ¤   ¤   ¤   }
de87c7 ¤   ¤   ¤
615ca9 ¤   ¤   ++pbIndex;
5a0fe4 ¤   ¤   }
0e1b52 ¤   ¤
3dcc56 ¤   return( numPBs );
c59371 ¤   }
8267c5 ¤
db67c5 ¤
206d52 ¤   void
5d33e0 CDrive::BreakUpPBsIfNeeded(
31ce92 ¤   const ulong¤¤   ¤   clientRequestBlocks,
de7b76 ¤   const ushort¤   ¤   numPBsIn,
6f0c5a ¤   ushort *¤   ¤   ¤   numPBsOut,
4c88c1 ¤   const TunerStruct *¤tuner)
3ac7a1 ¤   {
28cc7d ¤   pgpAssert( numPBsIn != 0 );
976f06 ¤   pgpAssertAddrValid( numPBsOut, ushort );
9867c5 ¤
a6b2e5 ¤   if ( mBreakUpPBs )
815b34 ¤   ¤   {
4b33f1 ¤   ¤   ulong numPBs¤   = numPBsIn;
9167c5 ¤
ff9011 ¤   ¤   // iterate until all pbs meet our size requirement or we run out of
819f4b ¤   ¤   // pbs
660fc8 ¤   ¤   while ( numPBs < mNumPBs )
f6f776 ¤   ¤   ¤   {
99897b ¤   ¤   ¤   ulong¤  newNumPBs;
2ad88d ¤   ¤   ¤   Boolean¤noChange;
2887c7 ¤   ¤   ¤
713134 ¤   ¤   ¤   newNumPBs¤  = BreakUpPBs( clientRequestBlocks, numPBs, tuner);
374cc1 ¤   ¤   ¤   noChange¤   = ( newNumPBs == numPBs );
86668a ¤   ¤   ¤   numPBs¤ ¤   = newNumPBs;
c7af5a
902338 ¤   ¤   ¤   if ( noChange )
87f622 ¤   ¤   ¤   ¤   break;
aea3a6 ¤   ¤   ¤   }
f6361d ¤   ¤   *numPBsOut¤ = numPBs;
120fe4 ¤   ¤   }
050e24 ¤   else
6a5b34 ¤   ¤   {
2c8913 ¤   ¤   *numPBsOut¤ = numPBsIn;
810fe4 ¤   ¤   }
3a67c5 ¤
aa9371 ¤   }
28af5a
b1af5a
b77bbe /*_________________________________________________________________________
e2af6f ¤   Push the PB at index down the list until the list is sorted.
8567c5 ¤
--3d28 0009ec09f9140120032 Page 19 of CDrive.cp
f41688 ¤   Keeping the PBs sorted by ascending start block should help minimize
4eb75f ¤   head seeking.
988ac7 _________________________________________________________________________*/
736d52 ¤   void
733aa8 CDrive::InsertLastPB( const ushort indexX )
8fc7a1 ¤   {
b50e4c ¤   ulong¤  startBlock;
a267c5 ¤
1a5c98 #if PGP_DEBUG
2bbc74 ¤   // list should already be in sorted order, except for this last one
3bedb6 ¤   for ( short pbIndex = 0; pbIndex < indexX - 1; ++pbIndex )
da5b34 ¤   ¤   {
0e85ee ¤   ¤   pgpAssert( GetPBStartBlock( &mPBArray[ pbIndex ] ) <
2cd046 ¤   ¤   ¤   ¤   GetPBStartBlock( &mPBArray[ pbIndex + 1 ] ) );
560fe4 ¤   ¤   }
707454 #endif
8767c5 ¤
e6a64d ¤   startBlock¤ = GetPBStartBlock( GetIndPB( indexX ) );
435830 ¤   for ( short pbIndex = indexX - 1; pbIndex >= 0; --pbIndex )
a65b34 ¤   ¤   {
bef787 ¤   ¤   if ( startBlock < GetPBStartBlock( &mPBArray[ pbIndex ] ) )
4ff776 ¤   ¤   ¤   {
8124a6 ¤   ¤   ¤   MyPB¤   tempPB;
4c87c7 ¤   ¤   ¤
63a5ec ¤   ¤   ¤   // swap current element and following one
65777c ¤   ¤   ¤   tempPB¤ ¤   ¤   ¤   ¤   = mPBArray[ pbIndex ];
1add5d ¤   ¤   ¤   mPBArray[ pbIndex ]¤¤   = mPBArray[ pbIndex + 1 ];
a4795c ¤   ¤   ¤   mPBArray[ pbIndex + 1 ]¤= tempPB;
3ca3a6 ¤   ¤   ¤   }
cf0e1d ¤   ¤   else
31f776 ¤   ¤   ¤   {
b514c4 ¤   ¤   ¤   // now in sorted order
f1cdcb ¤   ¤   ¤   break;
e0a3a6 ¤   ¤   ¤   }
8d0fe4 ¤   ¤   }
d95c98 #if PGP_DEBUG
fbe068 ¤   if ( indexX >= 1 )
905b34 ¤   ¤   {
4564ad ¤   ¤   // list should now be in sorted order
09dfd5 ¤   ¤   for ( short pbIndex = 0; pbIndex < indexX; ++pbIndex )
c5f776 ¤   ¤   ¤   {
c25fc7 ¤   ¤   ¤   pgpAssert( GetPBStartBlock( &mPBArray[ pbIndex ] ) <
625dba ¤   ¤   ¤   ¤   ¤   GetPBStartBlock( &mPBArray[ pbIndex + 1 ] ) );
50a3a6 ¤   ¤   ¤   }
800fe4 ¤   ¤   }
997454 #endif
579371 ¤   }
b367c5 ¤
8a67c5 ¤
5867c5 ¤
137bbe /*_________________________________________________________________________
de8ccb ¤   Accounting for fragmentation, fill in as many parameter blocks as needed
96bd09 ¤   to satisfy the I/O request.
368ac7 _________________________________________________________________________*/
656d52 ¤   void
a2ab6b CDrive::FillInAllPBsForRead(
53ae9a ¤   const UInt32¤   ¤   startOffsetInBlocks,
b96028 ¤   const ByteCount¤¤   origRequestCountInBlocks,
4c4984 ¤   void *¤ ¤   ¤   ¤   buffer,
d3400c ¤   ushort *¤   ¤   ¤   numPBsUsedPtr )
d4c7a1 ¤   {
03caa2 ¤   pgpAssert( startOffsetInBlocks + origRequestCountInBlocks <=
b14aae ¤   ¤   ¤   GetLogicalSizeInBlocks() );
a167c5 ¤
b9ea30 ¤   pgpAssertAddrValid( numPBsUsedPtr, ushort);
8a93e7 ¤   pgpAssert( origRequestCountInBlocks != 0);
a649fd ¤   pgpAssert( mIOQueue.IsEmpty() );
c067c5 ¤
440462 ¤   *numPBsUsedPtr¤ = 0;
cc67c5 ¤
2b98ef ¤   ulong¤  remainingBlocks¤= origRequestCountInBlocks;
9eee23 ¤   ulong¤  curBlockOffset¤ = startOffsetInBlocks;
--2a58 0003921524f40120032 Page 20 of CDrive.cp
7600fc ¤   Ptr¤¤   curBuffer¤  = (Ptr)buffer;
2f67c5 ¤
435da9 ¤   while ( remainingBlocks != 0 )
405b34 ¤   ¤   {
cf8c9d ¤   ¤   MyPB *¤ ¤   ¤   ¤   myPB;
646086 ¤   ¤   const DiskExtent *¤ extent;
2f2d35 ¤   ¤   ulong¤  ¤   ¤   ¤   startFileBlockOfExtent;
ee1b52 ¤   ¤
1d457a ¤   ¤   pgpAssert( *numPBsUsedPtr < mNumPBs );
411b52 ¤   ¤
0ad8a9 ¤   ¤   myPB¤   = GetIndPB( *numPBsUsedPtr );
3a1b52 ¤   ¤
273595 ¤   ¤   extent = FindExtentContainingBlock( curBlockOffset,
c6123c ¤   ¤   ¤   ¤   ¤   ¤   &startFileBlockOfExtent);
f3e2ec ¤   ¤   pgpAssert( IsntNull( extent ) );
d01b52 ¤   ¤
1fb891 ¤   ¤   ulong¤  offsetFromBase¤ = curBlockOffset - startFileBlockOfExtent;
bbdbea ¤   ¤   ulong¤  blockOffsetOnBaseDrive¤ = extent->diskBlockIndex +
a305ac ¤   ¤   ¤   ¤   ¤   ¤   offsetFromBase;
26aa3f ¤   ¤   pgpAssert( extent->numBlocks >= offsetFromBase);
a91dbe ¤   ¤   ulong¤  numBlocksAvail¤ ¤   = extent->numBlocks - offsetFromBase;
7d1ad5 ¤   ¤   ulong¤  requestBlocks¤  ¤   = MIN( remainingBlocks, numBlocksAvail );
831b52 ¤   ¤
268610 ¤   ¤   pgpAssert( requestBlocks != 0 );
eeaf5a
43101a ¤   ¤   FillInPB( myPB, curBuffer, curBuffer, blockOffsetOnBaseDrive,
3d6ced ¤   ¤   ¤   ¤   ¤   ¤   requestBlocks);
f7d88c ¤   ¤   myPB->startBlockOnSelf¤ = curBlockOffset;
a89f34 ¤   ¤   InsertLastPB( *numPBsUsedPtr );
191b52 ¤   ¤
5debc1 ¤   ¤   *numPBsUsedPtr¤ += 1;
4a73ab ¤   ¤   curBuffer¤  ¤   += requestBlocks * kPGPDiskBlockSize;
0fc72e ¤   ¤   remainingBlocks¤-= requestBlocks;
4fec9a ¤   ¤   curBlockOffset¤ += requestBlocks;
fa0fe4 ¤   ¤   }
6c67c5 ¤
d53a7f ¤   BreakUpPBsIfNeeded( origRequestCountInBlocks, *numPBsUsedPtr,
ce7f58 ¤   ¤   ¤   numPBsUsedPtr, &mReadTuner);
85351a ¤   pgpAssert( *numPBsUsedPtr <= mNumPBs );
b59371 ¤   }
a1af5a
dcaf5a
961b52 ¤   ¤
626d52 ¤   void
8ba202 CDrive::QueueAllPBsForRead( ushort¤ numPBs )
b5c7a1 ¤   {
282ab3 ¤   pgpAssert( mProcessingQueue.IsEmpty() );
4549fd ¤   pgpAssert( mIOQueue.IsEmpty() );
6c67c5 ¤
d953a5 ¤   for( ushort index = 0; index < numPBs; ++index )
755b34 ¤   ¤   {
cf4c25 ¤   ¤   mIOQueue.Enqueue( & GetIndPB( index )->ioQElem );
1b0fe4 ¤   ¤   }
a39371 ¤   }
2467c5 ¤
4d67c5 ¤
506d52 ¤   void
25adf9 CDrive::ReadPBs( ushort¤numPBs )
5cc7a1 ¤   {
645e68 ¤   pgpa((
5385dd ¤   ¤   pgpaAssert( mProcessingQueue.IsEmpty() ),
8ef8bd ¤   ¤   pgpaAssert( ! mIOQueue.IsEmpty() )
afc0fb ¤   ¤   ));
0b67c5 ¤
5a8e70 ¤   OSErr¤  err¤= noErr;
bcaf5a
5a53a5 ¤   for( ushort index = 0; index < numPBs; ++index )
235b34 ¤   ¤   {
3fc489 ¤   ¤   MyPB *¤ myPB;
241b52 ¤   ¤
1589e7 ¤   ¤   myPB¤   = GetIndPB( index );
391b52 ¤   ¤
--e5e0 00042180e3a40120032 Page 21 of CDrive.cp
114513 ¤   #if ALLOW_VM_PAGING¤// [
88bd85 ¤   ¤   if ( mTreatAsVMRequest )
e6f776 ¤   ¤   ¤   {
9d20c1 ¤   ¤   ¤   err¤¤   = PBReadSync( &myPB->ioPB.pb );
dfb809 ¤   ¤   ¤   mProcessingQueue.Enqueue( &myPB->processingQElem );
d2b20b ¤   ¤   ¤   mIOQueue.Dequeue( &myPB->ioQElem );
fea3a6 ¤   ¤   ¤   }
910e1d ¤   ¤   else
4ac174 ¤   #endif¤ // ] ALLOW_VM_PAGING
73f776 ¤   ¤   ¤   {
f837be ¤   ¤   ¤   err¤¤   = PBReadAsync( &myPB->ioPB.pb );
e2a3a6 ¤   ¤   ¤   }
a9acd0 ¤   ¤   AssertNoErr( err, "CDrive::ReadAllPBs" );
d30fe4 ¤   ¤   }
9f9371 ¤   }
43af5a
27af5a
ebaf5a
03af5a
aa6d52 ¤   void
35ee3b CDrive::DecryptBlocksDeferredTask( )
a0c7a1 ¤   {
02cfa1 ¤   do
7d5b34 ¤   ¤   {
b018bd ¤   ¤   pgpAssert( mDecryptLock );
d5af5a
92cc8a ¤   ¤   // it's OK to look directly at the front of the queue;
086232 ¤   ¤   // we the only code that can remove from the queue
d4f0de ¤   ¤   MyPB *¤ ¤   myPB;
4eaacd ¤   ¤   QElem *¤¤   qElem;
77b8d4 ¤   ¤   qElem¤  = mProcessingQueue.PeekHead();
7ea415 ¤   ¤   pgpAssert( IsntNull( qElem ) );
6c62d4 ¤   ¤   myPB¤   = ProcessingQueueElemToMyPB( qElem );
8c1b52 ¤   ¤
58a0a5 ¤   ¤   DecryptPB( myPB );
421b52 ¤   ¤
34448b ¤   ¤   OSErr¤  err¤= mProcessingQueue.Dequeue( qElem );
c35d2f ¤   ¤   AssertNoErr( err, "DecryptBlocksDeferredTask" );
341b52 ¤   ¤
66f6e7 ¤   ¤   // check without critical section first to avoid disabling interrupts
2af5d5 ¤   ¤   // if we're just looping.
b538cf ¤   ¤   if ( mProcessingQueue.IsEmpty() )
28f776 ¤   ¤   ¤   {
87e9ee ¤   ¤   ¤   Boolean¤isEmpty;
511d6a ¤   ¤   ¤   Boolean¤done¤   = false;
2e87c7 ¤   ¤   ¤
936df6 ¤   ¤   ¤   EnterCriticalSection();
d8c621 ¤   ¤   ¤   ¤   isEmpty¤= mProcessingQueue.IsEmpty();
4c80a6 ¤   ¤   ¤   ¤   if ( isEmpty )
f44859 ¤   ¤   ¤   ¤   ¤   {
4b8910 ¤   ¤   ¤   ¤   ¤   // we're done if mIOQueue is empty as well
bf4e2b ¤   ¤   ¤   ¤   ¤   // in either case, relinquish the lock, since there's
492390 ¤   ¤   ¤   ¤   ¤   // nothing available
59f541 ¤   ¤   ¤   ¤   ¤   done¤   = mIOQueue.IsEmpty();
891847 ¤   ¤   ¤   ¤   ¤   mDecryptLock¤   = false;
1c1c89 ¤   ¤   ¤   ¤   ¤   }
ccbf2f ¤   ¤   ¤   ExitCriticalSection();
f787c7 ¤   ¤   ¤
e75229 ¤   ¤   ¤   if ( done )
9f72c3 ¤   ¤   ¤   ¤   {
390d6b ¤   ¤   ¤   ¤   MyIOIsDone( mResultErr, mClientPB->ioParam.ioReqCount );
a5f622 ¤   ¤   ¤   ¤   break;
d92613 ¤   ¤   ¤   ¤   }
092b85 ¤   ¤   ¤   ¤
84948e ¤   ¤   ¤   if ( isEmpty )
f072c3 ¤   ¤   ¤   ¤   {
3ef622 ¤   ¤   ¤   ¤   break;
422613 ¤   ¤   ¤   ¤   }
fea3a6 ¤   ¤   ¤   }
4e0d89 ¤   ¤   } while ( TRUE );
9c9371 ¤   }
4267c5 ¤
--60a8 0004d05188240120032 Page 22 of CDrive.cp
2a67c5 ¤
8a6685 ¤   pascal void
033ef3 CDrive::sDecryptBlocksDeferredTask( void )
f0c7a1 ¤   {
dd6e1f ¤   CDrive *¤   theDrive¤   = (CDrive *)GetA1();
bf67c5 ¤
1b953d ¤   EnterCodeResource();
9567c5 ¤
3e489d ¤   CDrive::sAssertValid( theDrive );
d367c5 ¤
de6653 #if CDRIVE_WATCHDOG
0f6f97 ¤   theDrive->RemoveWatchdog();
c57454 #endif
aaaf5a
3de5a6 ¤   theDrive->DecryptBlocksDeferredTask( );
8067c5 ¤
641487 ¤   ExitCodeResource();
b19371 ¤   }
0a67c5 ¤
3f67c5 ¤
587bbe /*_________________________________________________________________________
c41c7e ¤   When a read finishes, we need to decrypt the data. However, we must not
928703 ¤   do so right now, because we may be in an interrupt and spending too much
f0fd2d ¤   time in an interrupt is Bad. ·So install a deferred task to perform the
5b83b0 ¤   decryption.
e48ac7 _________________________________________________________________________*/
856d52 ¤   void
35c941 CDrive::HandleReadCompletion( MyPB *myPB )
13c7a1 ¤   {
0715ff ¤   Boolean¤¤   decryptNow¤ = false;
7f67c5 ¤
fff342 ¤   mProcessingQueue.Enqueue( &myPB->processingQElem );
0c223d ¤   mIOQueue.Dequeue( &myPB->ioQElem );
c567c5 ¤
4280ac ¤   Boolean¤haveLock¤   = ! TestAndSet( &mDecryptLock );
09d1f8 ¤   if ( haveLock )
4c5b34 ¤   ¤   {
2d4c8c ¤   ¤   InstallDeferredTask( &mDecryptDeferredTask,
dd8c88 ¤   ¤   ¤   ¤   sDecryptBlocksDeferredTask );
dc0fe4 ¤   ¤   }
df9371 ¤   }
78af5a
98af5a
53af5a
e97bbe /*_________________________________________________________________________
67d61d ¤   It's time to read all data needed to satisfy the client request.
098ac7 _________________________________________________________________________*/
a66d52 ¤   void
bb9904 CDrive::KickStartDeferredRead()
b0c7a1 ¤   {
80d698 ¤   ParamBlockRec *¤¤   pb¤ = mClientPB;
6f3213 ¤   ushort¤ ¤   ¤   ¤   numPBsUsed;
9667c5 ¤
84f82f ¤   pgpAssert( IsntNull( pb ) );
5b67c5 ¤
9bb10c ¤   FillInAllPBsForRead( ::GetPBStartBlock( pb ), ::GetPBNumBlocks( pb ),
2db78d ¤   ¤   pb->ioParam.ioBuffer, &numPBsUsed);
cc67c5 ¤
31362b ¤   QueueAllPBsForRead( numPBsUsed );
2a55e7 ¤   ReadPBs( numPBsUsed );
0a9371 ¤   }
0267c5 ¤
0d67c5 ¤
a467c5 ¤
6b67c5 ¤
8467c5 ¤
aa7bbe /*_________________________________________________________________________
a2fc26 ¤   Service a client read request
548ac7 _________________________________________________________________________*/
f66d52 ¤   void
4b26f3 CDrive::Read(
4d1b6f ¤   ParamBlockRec *¤clientPB,
--c9e5 000cda6228e40120032 Page 23 of CDrive.cp
ec7d7d ¤   DCtlEntry *¤¤   dce )
91c7a1 ¤   {
e54525 ¤   pgpAssert( clientPB == (ParamBlockRec *)dce->dCtlQHdr.qHead );
b767c5 ¤
a43ad5 ¤   if ( ! BaseDriveIsAvailable() )
95c7a1 ¤   {
4e37a9 ¤   ¤   pgpDebugPStr( "\pCDrive::Read: base drive is not available;g" );
04e02a ¤   ¤   mClientPB¤  = clientPB;
ab6012 ¤   ¤   MyIOIsDone( badUnitErr, 0UL );¤ // 'badUnitErr' is what base driver
b9feec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // returns
a99371 ¤   }
d7a7ec ¤   else if ( IsValidRequest( &clientPB->ioParam ) )
e95b34 ¤   ¤   {
f6ad8e ¤   ¤   InitReadOrWrite( clientPB, dce, kReadDirection);
4baf5a
f1cbb6 ¤   ¤   // all requests have been queued and are being processed
71a942 ¤   ¤   pgpAssert( clientPB->ioParam.ioResult == kAsyncIOInProgress );
751b52 ¤   ¤
5a4513 ¤   #if ALLOW_VM_PAGING¤// [
aeaf5a
49bd85 ¤   ¤   if ( mTreatAsVMRequest )
2ef776 ¤   ¤   ¤   {
cb4131 ¤   ¤   ¤   mDecryptLock¤   = TRUE;
b464ae ¤   ¤   ¤   KickStartDeferredRead();
be0bb8 ¤   ¤   ¤   DecryptBlocksDeferredTask();
d169a4 ¤   ¤   ¤   // ...done
fea3a6 ¤   ¤   ¤   }
620e1d ¤   ¤   else
5fc174 ¤   #endif¤ // ] ALLOW_VM_PAGING
e61056 ¤   ¤   if ( InterruptsAreEnabled() )
9bf776 ¤   ¤   ¤   {
6be820 ¤   ¤   ¤   // no reason to wait...start processing now
a9d013 ¤   ¤   ¤   // acquire the decrypt lock so that if I/O finishes before
6711db ¤   ¤   ¤   // returning, we can avoid the overhead of using a deferred
437c6b ¤   ¤   ¤   // task as well as the problem that the I/O could complete
990067 ¤   ¤   ¤   // synchronously·
864131 ¤   ¤   ¤   mDecryptLock¤   = TRUE;
6b87c7 ¤   ¤   ¤
e464ae ¤   ¤   ¤   KickStartDeferredRead();
1087c7 ¤   ¤   ¤
9baf83 ¤   ¤   ¤   Boolean¤¤   isEmpty;
ad6df6 ¤   ¤   ¤   EnterCriticalSection();
81c621 ¤   ¤   ¤   ¤   isEmpty¤= mProcessingQueue.IsEmpty();
0480a6 ¤   ¤   ¤   ¤   if ( isEmpty )
ea4859 ¤   ¤   ¤   ¤   ¤   {
f91847 ¤   ¤   ¤   ¤   ¤   mDecryptLock¤   = false;
3f1c89 ¤   ¤   ¤   ¤   ¤   }
2fbf2f ¤   ¤   ¤   ExitCriticalSection();
5187c7 ¤   ¤   ¤
ac8771 ¤   ¤   ¤   if ( ! isEmpty )
8272c3 ¤   ¤   ¤   ¤   {
6b0d00 ¤   ¤   ¤   ¤   DecryptBlocksDeferredTask();
772613 ¤   ¤   ¤   ¤   }
2ea3a6 ¤   ¤   ¤   }
ae0e1d ¤   ¤   else
64f776 ¤   ¤   ¤   {
814961 ¤   ¤   ¤   InstallDeferredTask( &mKickStartDeferredTask,
987b7a ¤   ¤   ¤   ¤   ¤   sKickStartDeferredTask );
42a3a6 ¤   ¤   ¤   }
a60fe4 ¤   ¤   }
070e24 ¤   else
6a5b34 ¤   ¤   {
7a5770 ¤   ¤   pgpDebugPStr( "\pCDrive::Read: invalid request;g" );
69e02a ¤   ¤   mClientPB¤  = clientPB;
3a6a1e ¤   ¤   MyIOIsDone( paramErr, 0UL );
d70fe4 ¤   ¤   }
439371 ¤   }
14af5a
01af5a
77af5a
71dacc #pragma mark -
cdaf5a
--8657 0002fab63b140120032 Page 24 of CDrive.cp
e0af5a
1aaf5a
887bbe /*_________________________________________________________________________
5191e6 ¤   Set up information needed to handle a write request.
2d8ac7 _________________________________________________________________________*/
996d52 ¤   void
69170e CDrive::InitWrite( const IOParam *¤ ¤   pb)
5fc7a1 ¤   {
494d60 ¤   pgpAssertAddrValid( pb->ioBuffer, VoidAlign );
ef8003 ¤   pgpAssert( pb->ioReqCount != 0 &&
ce23f2 ¤   ¤   ¤   ( pb->ioReqCount % kPGPDiskBlockSize) == 0 );
1567c5 ¤
106a76 ¤   mWriteStuff.curClientBuffer¤¤   = pb->ioBuffer;
1af649 ¤   mWriteStuff.curClientBlock¤ ¤   = ::GetPBStartBlock( pb );
677a39 ¤   mWriteStuff.blocksRemaining¤¤   = ::GetPBNumBlocks( pb );
0267c5 ¤
b54609 ¤   pgpAssert( mWriteStuff.curClientBlock < GetLogicalSizeInBlocks() );
7967c5 ¤
7b5ded ¤   GetDateTime( &mLastWriteTime );
d89371 ¤   }
f667c5 ¤
f6af5a
a1af5a
fc7bbe /*_________________________________________________________________________
be4c96 ¤   We've been called at deferred task time. ·We are free to use as much CPU
82c305 ¤   time as we want. ·Encrypt and write as much data as possible. Upon
cc488f ¤   return from doing that, there may still be more outstanding data, but that
e4f494 ¤   will be handled by the last write call, which will call us again.
3a8ac7 _________________________________________________________________________*/
bd6d52 ¤   void
3357f0 CDrive::KickStartDeferredWrite()
28c7a1 ¤   {
ea5e68 ¤   pgpa((
21faf8 ¤   ¤   pgpaAssert( mEncryptLock ),
d985dd ¤   ¤   pgpaAssert( mProcessingQueue.IsEmpty() ),
a8ec96 ¤   ¤   pgpaAssert( mIOQueue.IsEmpty() ),
074d73 ¤   ¤   pgpaAssert( mWriteStuff.blocksRemaining != 0 ),
697d0c ¤   ¤   pgpaAssert( mWriteStuff.curClientBlock <= GetLogicalSizeInBlocks() )
10da4b ¤   ¤   ¤   ));
c9ae30 ¤   ¤   ¤   ¤   ¤
2972c9 ¤   while ( TRUE )
f05b34 ¤   ¤   {
a3a5ca ¤   ¤   Boolean¤¤   ioPending;
431b52 ¤   ¤
243cca ¤   ¤   pgpAssert( mEncryptLock );
c98f4e ¤   ¤   QueueForEncryption();
c05e3e ¤   ¤   EncryptAndWriteQueuedItems();
fa1b52 ¤   ¤
05e60a ¤   ¤   EnterCriticalSection();
41fc8b ¤   ¤   ioPending¤  = ! mIOQueue.IsEmpty();
90fde6 ¤   ¤   if ( ioPending )
03f776 ¤   ¤   ¤   {
1fbc10 ¤   ¤   ¤   mEncryptLock¤   = false;
65a3a6 ¤   ¤   ¤   }
b03350 ¤   ¤   ExitCriticalSection();
d41b52 ¤   ¤
1dfde6 ¤   ¤   if ( ioPending )
27f776 ¤   ¤   ¤   {
5b421c ¤   ¤   ¤   // HandleWriteCompletion will reacquire lock
d8cdcb ¤   ¤   ¤   break;
f3a3a6 ¤   ¤   ¤   }
011b52 ¤   ¤
b8782e ¤   ¤   pgpAssert( mProcessingQueue.IsEmpty() );
e74c10 ¤   ¤   pgpAssert( mIOQueue.IsEmpty() );
79b921 ¤   ¤   // io is *not* pending so either we're done or we need to process more
8929e3 ¤   ¤   if ( mWriteStuff.blocksRemaining == 0 )
5af776 ¤   ¤   ¤   {
babc10 ¤   ¤   ¤   mEncryptLock¤   = false;
be0a1d ¤   ¤   ¤   MyIOIsDone( mResultErr, mClientPB->ioParam.ioReqCount );
aacdcb ¤   ¤   ¤   break;
15a3a6 ¤   ¤   ¤   }
2f0fe4 ¤   ¤   }
--1fa1 000eda74eb840120032 Page 25 of CDrive.cp
a19371 ¤   }
9967c5 ¤
0c67c5 ¤
8e67c5 ¤
9e6d52 ¤   void
87bfb3 CDrive::HandleWriteCompletion( MyPB *myPB )
59c7a1 ¤   {
ee4e61 ¤   pgpAssert( IsntNull( mClientPB ) );
4e977e ¤   pgpAssert( myPB->magic == MyPB::kMagic );
3867c5 ¤
38223d ¤   mIOQueue.Dequeue( &myPB->ioQElem );
a167c5 ¤
31565d ¤   Boolean¤¤   haveLock¤   = ! TestAndSet( &mEncryptLock );
80d1f8 ¤   if ( haveLock )
915b34 ¤   ¤   {
32158d ¤   ¤   Boolean¤¤   ioIsDone;
871b52 ¤   ¤
e7e60a ¤   ¤   EnterCriticalSection();
c0cf40 ¤   ¤   ioIsDone¤   = mIOQueue.IsEmpty();
a9dbaa ¤   ¤   if ( ! ioIsDone )
d6f776 ¤   ¤   ¤   {
31af5d ¤   ¤   ¤   // the last IO request to complete will acquire the lock
b1bc10 ¤   ¤   ¤   mEncryptLock¤   = false;
d4a3a6 ¤   ¤   ¤   }
ab3350 ¤   ¤   ExitCriticalSection();
f01b52 ¤   ¤
25abf0 ¤   ¤   if ( ioIsDone )
03f776 ¤   ¤   ¤   {
c89b5f ¤   ¤   ¤   // the processing queue must be empty; otherwise we could not
278256 ¤   ¤   ¤   // have acquired the lock
a72b35 ¤   ¤   ¤   pgpAssert( mProcessingQueue.IsEmpty() );
8487c7 ¤   ¤   ¤
e6314e ¤   ¤   ¤   // no need to retain lock; nothing else is running
78bfa2 ¤   ¤   ¤   if ( mWriteStuff.blocksRemaining == 0 )
fa72c3 ¤   ¤   ¤   ¤   {
e8b9fd ¤   ¤   ¤   ¤   mEncryptLock¤   = false;
470d6b ¤   ¤   ¤   ¤   MyIOIsDone( mResultErr, mClientPB->ioParam.ioReqCount );
d92613 ¤   ¤   ¤   ¤   }
1abb8c ¤   ¤   ¤   else
8172c3 ¤   ¤   ¤   ¤   {
3bf5b9 ¤   ¤   ¤   ¤   // retain lock for KickStartDeferredWrite
df7375 ¤   ¤   ¤   ¤   pgpAssert( mEncryptLock );
2cab61 ¤   ¤   ¤   ¤   InstallDeferredTask( &mKickStartDeferredTask,
e43444 ¤   ¤   ¤   ¤   ¤   ¤   sKickStartDeferredTask );
572613 ¤   ¤   ¤   ¤   }
9ca3a6 ¤   ¤   ¤   }
4a0fe4 ¤   ¤   }
899371 ¤   }
baaf5a
c91b52 ¤   ¤
f37bbe /*_________________________________________________________________________
394802 ¤   Queue as many requests as possible for encryption (limited by size of
bed97d ¤   our scratch buffer).
988ac7 _________________________________________________________________________*/
f76d52 ¤   void
9675cd CDrive::QueueForEncryption( void )
52c7a1 ¤   {
436ccc ¤   ushort¤ ¤   ¤   numPBsUsed¤ = 0;
0953f9 ¤   ulong¤  ¤   ¤   remainingBlocks;
7d4aab ¤   ulong¤  ¤   ¤   blocksDoneThisTime;
c61908 ¤   ulong¤  ¤   ¤   curBlockIndex;
743e9a ¤   Ptr¤¤   ¤   ¤   curScratchBuffer¤   = (Ptr)sScratchBuffer;
f3874b ¤   const void *¤   curClientBuffer¤¤   = mWriteStuff.curClientBuffer;
df67c5 ¤
299737 ¤   pgpAssert( IsntNull( curScratchBuffer ) );
b24207 ¤   pgpAssert( sScratchBufferSize != 0 );
7667c5 ¤
bde3ad ¤   blocksDoneThisTime¤ = MIN( mWriteStuff.blocksRemaining,
f56515 ¤   ¤   ¤   sScratchBufferSize / kPGPDiskBlockSize);
a85a1e ¤   curBlockIndex¤  ¤   = mWriteStuff.curClientBlock;
1f048e ¤   pgpAssert( curBlockIndex + blocksDoneThisTime <= GetLogicalSizeInBlocks() );
edaf5a
--d069 00065504c1b40120032 Page 26 of CDrive.cp
bcfd19 ¤   remainingBlocks¤¤   = blocksDoneThisTime;
8eeece ¤   while ( remainingBlocks != 0 && numPBsUsed < mNumPBs )
ee5b34 ¤   ¤   {
c38c9d ¤   ¤   MyPB *¤ ¤   ¤   ¤   myPB;
5a6086 ¤   ¤   const DiskExtent *¤ extent;
ba2d35 ¤   ¤   ulong¤  ¤   ¤   ¤   startFileBlockOfExtent;
8c1b52 ¤   ¤
4d8ad7 ¤   ¤   pgpAssert( numPBsUsed < mNumPBs );
c61b52 ¤   ¤
582071 ¤   ¤   myPB¤   = GetIndPB( numPBsUsed );
3a8f40 ¤   ¤   myPB->theDrive¤ = this;
3cfc60 ¤   ¤   SetPBMagic( myPB );
231b52 ¤   ¤
eff533 ¤   ¤   extent¤ = FindExtentContainingBlock( curBlockIndex,
1864c7 ¤   ¤   ¤   ¤   &startFileBlockOfExtent);
26e2ec ¤   ¤   pgpAssert( IsntNull( extent ) );
9d1b52 ¤   ¤
53855c ¤   ¤   ulong¤  offsetFromBase = curBlockIndex - startFileBlockOfExtent;
65bdd2 ¤   ¤   ulong¤  blockOffsetOnBaseDrive = extent->diskBlockIndex +
e11d3c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   offsetFromBase;
a7afd3 ¤   ¤   ulong¤  numBlocksAvail = extent->numBlocks - offsetFromBase;
dda3d1 ¤   ¤   ulong¤  requestBlocks = MIN( remainingBlocks, numBlocksAvail );
c7af5a
dfd0d7 ¤   ¤   FillInPB( myPB, curClientBuffer, curScratchBuffer,
83369b ¤   ¤   ¤   ¤   ¤   blockOffsetOnBaseDrive, requestBlocks);
c2095c ¤   ¤   myPB->startBlockOnSelf¤ = curBlockIndex;
441937 ¤   ¤   InsertLastPB( numPBsUsed );
072b85 ¤   ¤   ¤   ¤
8be599 ¤   ¤   curBlockIndex¤  ¤   += requestBlocks;
4c6851 ¤   ¤   numPBsUsed¤ ¤   ¤   += 1;
b3efb4 ¤   ¤   curScratchBuffer¤   += requestBlocks * kPGPDiskBlockSize;
fed3f1 ¤   ¤   curClientBuffer¤¤   = (const void *)( (Ptr)curClientBuffer +
ca5025 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   requestBlocks * kPGPDiskBlockSize );
6aa952 ¤   ¤   remainingBlocks¤¤   -= requestBlocks;
cb0fe4 ¤   ¤   }
7aaf5a
bedb0c ¤   pgpAssert( numPBsUsed <= mNumPBs );
9467c5 ¤
f0652a ¤   pgpAssert( blocksDoneThisTime <= mWriteStuff.blocksRemaining );
b7ba99 ¤   mWriteStuff.blocksRemaining¤-= blocksDoneThisTime;
fbee76 ¤   mWriteStuff.curClientBlock¤ = curBlockIndex;
d16a15 ¤   mWriteStuff.curClientBuffer¤= curClientBuffer;
2f67c5 ¤
2cf097 ¤   BreakUpPBsIfNeeded( ::GetPBNumBlocks( mClientPB ), numPBsUsed,
824380 ¤   ¤   ¤   &numPBsUsed, &mWriteTuner );
9edb0c ¤   pgpAssert( numPBsUsed <= mNumPBs );
d667c5 ¤
d690db ¤   // now queue them all up for processing
a581f6 ¤   for( ushort index = 0; index < numPBsUsed; ++index )
de5b34 ¤   ¤   {
662a2c ¤   ¤   mProcessingQueue.Enqueue( &GetIndPB( index )->processingQElem );
ad0fe4 ¤   ¤   }
b59371 ¤   }
67af5a
e7af5a
0aaf5a
4e6d52 ¤   void
c2ac01 CDrive::EncryptAndWriteQueuedItems( void )
08c7a1 ¤   {
9e7adb ¤   OSErr¤  err¤¤   = noErr;
5467c5 ¤
281d68 ¤   while ( ! mProcessingQueue.IsEmpty() )
745b34 ¤   ¤   {
fe9726 ¤   ¤   MyPB *¤ ¤   ¤   myPB;
a3d34c ¤   ¤   ulong¤  ¤   ¤   numBlocks;
c0649a ¤   ¤   const void *¤   src;
72b042 ¤   ¤   void *¤ ¤   ¤   dest;
a41b52 ¤   ¤
0e6ba3 ¤   ¤   myPB¤   ¤   = ProcessingQueueElemToMyPB( mProcessingQueue.PeekHead() );
d9d840 ¤   ¤   pgpAssert( myPB->magic == MyPB::kMagic );
3b1b52 ¤   ¤
65b7dd ¤   ¤   numBlocks¤  = GetPBNumBlocks( myPB );
--08d3 00043603f6f40120032 Page 27 of CDrive.cp
460510 ¤   ¤   src¤¤   ¤   = myPB->src;
5e1778 ¤   ¤   dest¤   ¤   = myPB->ioPB.pb.ioParam.ioBuffer;
741b52 ¤   ¤
58e0ce ¤   ¤   CipherProc_CallEncrypt( mCipherProcRef, GetCipherContext(),
966dd4 ¤   ¤   ¤   ¤   myPB->startBlockOnSelf, numBlocks, src, dest );
d91b52 ¤   ¤
90b6ea ¤   ¤   // CAUTION: it is crucial that we enqueue to mIOQueue before dequeing
6d4935 ¤   ¤   // from mProcessingQueue
33fd14 ¤   ¤   mIOQueue.Enqueue( &myPB->ioQElem );
db1d81 ¤   ¤   mProcessingQueue.Dequeue( &myPB->processingQElem );
c91b52 ¤   ¤
430d44 ¤   ¤   err¤= PBWriteAsync( &myPB->ioPB.pb );
b08a63 ¤   ¤   AssertNoErr( err, "CDrive::EncryptAndWriteQueuedItems" );
170fe4 ¤   ¤   }
4a9371 ¤   }
6567c5 ¤
a267c5 ¤
0aaf5a
f767c5 ¤
ca67c5 ¤
397bbe /*_________________________________________________________________________
798180 ¤   Service a client write request.
f367c5 ¤
f5bd2f ¤   Writing is a bit more complicated than reading because we have to copy the
8b6fba ¤   client's buffer to a temporary buffer before encrypting it and then write
717232 ¤   out the temporary buffer.
d18ac7 _________________________________________________________________________*/
ed6d52 ¤   void
c9b4a1 CDrive::Write(
741b6f ¤   ParamBlockRec *¤clientPB,
f917ef ¤   DCtlPtr¤¤   ¤   dce )
f8c7a1 ¤   {
4266ad ¤   OSErr err = noErr;
aa67c5 ¤
266b6a ¤   pgpAssert( ! mEncryptLock );
f667c5 ¤
173ad5 ¤   if ( ! BaseDriveIsAvailable() )
0ec7a1 ¤   {
0a37a9 ¤   ¤   pgpDebugPStr( "\pCDrive::Read: base drive is not available;g" );
45e02a ¤   ¤   mClientPB¤  = clientPB;
c16012 ¤   ¤   MyIOIsDone( badUnitErr, 0UL );¤ // 'badUnitErr' is what base driver
dbfeec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // returns
d29371 ¤   }
1da7ec ¤   else if ( IsValidRequest( &clientPB->ioParam ) )
6c5b34 ¤   ¤   {
7c7d39 ¤   ¤   if( IsWriteProtected() )
2ff776 ¤   ¤   ¤   {
174df1 ¤   ¤   ¤   // This error is returned when writing to locked floppies and Zip'
4d980a ¤   ¤   ¤   // disks. Writing to a CD-ROM returns a writErr (-20).
8e868d ¤   ¤   ¤   err = wPrErr;
b1a3a6 ¤   ¤   ¤   }
3e0e1d ¤   ¤   else
03f776 ¤   ¤   ¤   {
15582a ¤   ¤   ¤   InitReadOrWrite( clientPB, dce, kWriteDirection );
279ede ¤   ¤   ¤   InitWrite( &clientPB->ioParam );
3c87c7 ¤   ¤   ¤
31707c ¤   ¤   ¤   pgpAssert( clientPB->ioParam.ioResult¤  == kAsyncIOInProgress );
7b87c7 ¤   ¤   ¤
9159b3 ¤   ¤   ¤   mEncryptLock¤   = TRUE;
4f2cb8 ¤   ¤   ¤   if ( InterruptsAreEnabled() )
4b72c3 ¤   ¤   ¤   ¤   {
fec82c ¤   ¤   ¤   ¤   KickStartDeferredWrite();
282613 ¤   ¤   ¤   ¤   }
b3bb8c ¤   ¤   ¤   else
d872c3 ¤   ¤   ¤   ¤   {
f5ab61 ¤   ¤   ¤   ¤   InstallDeferredTask( &mKickStartDeferredTask,
c23444 ¤   ¤   ¤   ¤   ¤   ¤   sKickStartDeferredTask );
532613 ¤   ¤   ¤   ¤   }
0fa3a6 ¤   ¤   ¤   }
d40fe4 ¤   ¤   }
7b0e24 ¤   else
435b34 ¤   ¤   {
--9adf 00058835d8640120032 Page 28 of CDrive.cp
4835e4 ¤   ¤   pgpDebugPStr( "\pCDrive::Read: invalid request" );
706915 ¤   ¤   err = paramErr;
8e0fe4 ¤   ¤   }
62af5a
58e10e ¤   if( IsErr( err ) )
325b34 ¤   ¤   {
92e02a ¤   ¤   mClientPB¤  = clientPB;
a87990 ¤   ¤   MyIOIsDone( err, 0UL );
ec0fe4 ¤   ¤   }
139371 ¤   }
48af5a
3fdacc #pragma mark -
34af5a
88af5a
14d2ab ¤   const char *
6ee2e3 CDrive::GetPhysicalIcon( ) const
bdc7a1 ¤   {
c26f84 ¤   return( (const char *)&mPhysicalIcon );
4e9371 ¤   }
1867c5 ¤
3f67c5 ¤
4caf5a
00d2ab ¤   const char *
239a0b CDrive::GetMediaIcon( ) const
b9c7a1 ¤   {
ae293d ¤   return( (const char *)&mMediaIcon );
3b9371 ¤   }
aaaf5a
f3af5a
abaf5a
84af5a
c522dc ¤   ulong
e92f88 CDrive::GetLogicalSizeInBlocks( ·) const
3dc7a1 ¤   {
3fa0a1 ¤   const DrvQEl *¤ dqe¤= &mMyDQE->el;
ca5f33 ¤   ulong¤  ¤   ¤   numBlocks;
d167c5 ¤
d8599a ¤   pgpAssertAddrValid( mMyDQE, FlagsDrvQEl );
5a67c5 ¤
b1bb54 ¤   numBlocks¤  = dqe->dQDrvSz + (((ulong)dqe->dQDrvSz2) << 16);
8f67c5 ¤
9a3fbf ¤   return( numBlocks );
1b9371 ¤   }
3667c5 ¤
2567c5 ¤
747bbe /*_________________________________________________________________________
b731d8 ¤   The driver is responsible for creating the drive queue element.
c28ac7 _________________________________________________________________________*/
b66d52 ¤   void
c0c5dc CDrive::SetDriveQElement(const FlagsDrvQEl *queueElement)
a4c7a1 ¤   {
1811cb ¤   pgpAssertAddrValid( queueElement, FlagsDrvQEl );
c01b52 ¤   ¤
46a5e6 ¤   mMyDQE = queueElement;
b17d74 ¤   MacLeaks_RememberPtr( mMyDQE, kMacLeaks_NewPtrSysAllocType, 0,
01ffb9 ¤   ¤   ¤   "somwhere", 0);
a39371 ¤   }
66af5a
1daf5a
b2af5a
ec7bbe /*_________________________________________________________________________
a778d1 ¤   Change all 1 bits to 0 and all 0 bits to 1 (logical NOT).
0b8ac7 _________________________________________________________________________*/
786d52 ¤   void
28bbed CDrive::FlipBytes(·
6ec0cc ¤   void *¤ ¤   bytes,
f9dec1 ¤   ulong¤  ¤   numBytes )
93c7a1 ¤   {
110416 ¤   uchar *array¤   = (uchar *)bytes;
4a67c5 ¤
1f6f9d ¤   pgpAssertAddrValid( array, UInt32 );
5867c5 ¤
--8a88 00062550c8840120032 Page 29 of CDrive.cp
46900b ¤   for( ulong index = 0; index < numBytes; ++index )
7f5b34 ¤   ¤   {
ee865b ¤   ¤   array[ index ]¤ = ~ array[ index ];
450fe4 ¤   ¤   }
d69371 ¤   }
2c67c5 ¤
b667c5 ¤
647bbe /*_________________________________________________________________________
b592ae ¤   Note: the caller has taken care to call this at a time when we're not
c52719 ¤   servicing any I/O and a time during which no I/O can begin.
288ac7 _________________________________________________________________________*/
466d52 ¤   void
a195c6 CDrive::ToggleKeyBits( void )
3ec7a1 ¤   {
2a72d9 ¤   mWhichCipherContextValid¤   = ( mWhichCipherContextValid + 1 ) % 2;
c467c5 ¤
c467bc ¤   FlipBytes( (void *)mCipherContext[ 0 ].castCFB.expandedKey.keyWords,
73f9bc ¤   ¤   sizeof( mCipherContext[ 0 ].castCFB.expandedKey.keyWords ) );
521b52 ¤   ¤
863661 ¤   FlipBytes( (void *)mCipherContext[ 1 ].castCFB.expandedKey.keyWords,
165374 ¤   ¤   sizeof( mCipherContext[ 1 ].castCFB.expandedKey.keyWords ) );
3b9371 ¤   }
03af5a
54af5a
caaf5a
077bbe /*_________________________________________________________________________
8a9986 ¤   Return a pointer to the currently valid cipher context. One context is
e450c9 ¤   valid and the other has its bits flipped.
558ac7 _________________________________________________________________________*/
0bec25 ¤   const CipherContext *
c4775f CDrive::GetCipherContext( void )
e6c7a1 ¤   {
c4bb1d ¤   return( &mCipherContext[ mWhichCipherContextValid ] );
2c9371 ¤   }
82af5a
a3af5a
f97bbe /*_________________________________________________________________________
b9b292 ¤   If this is a writeable disk, change the file modification date to be the
2670df ¤   last write time to the disk.
328ac7 _________________________________________________________________________*/
9e6d52 ¤   void
6dcc0f CDrive::UpdateFileModificationDate( )
42c7a1 ¤   {
272579 ¤   if ( ! IsWriteProtected() )
a05b34 ¤   ¤   {
a1449f ¤   ¤   OSStatus¤   ¤   err¤= noErr;
5f565d ¤   ¤   const ulong¤¤   kMinSecondsBetweenUpdate¤   = 5;
e61b52 ¤   ¤
c93c4e ¤   ¤   if ( ( mLastWriteTime > mLastFileModDateUpdate ) &&
3ad79e ¤   ¤   ¤   ¤   ( mLastWriteTime - mLastFileModDateUpdate ) >=
8a67af ¤   ¤   ¤   ¤   ¤   kMinSecondsBetweenUpdate )
4bf776 ¤   ¤   ¤   {
7f0b50 ¤   ¤   ¤   FSSpec¤ spec;
a687c7 ¤   ¤   ¤
46773f ¤   ¤   ¤   // we don't want to make a sync file mgr call, so use FCBs
5ded07 ¤   ¤   ¤   err¤= GetSpecFromFCBTable( mFileRefNum, &spec );
65e090 ¤   ¤   ¤   if ( IsntErr( err ) )
c172c3 ¤   ¤   ¤   ¤   {
42f479 ¤   ¤   ¤   ¤   pgpAssert( IsntNull( sModDateQueue ) );
552817 ¤   ¤   ¤   ¤   sModDateQueue->ChangeModDate( &spec, mLastWriteTime );
c52613 ¤   ¤   ¤   ¤   }
ae2b85 ¤   ¤   ¤   ¤
522a3e ¤   ¤   ¤   GetDateTime( &mLastFileModDateUpdate );
cea3a6 ¤   ¤   ¤   }
d70fe4 ¤   ¤   }
3b9371 ¤   }
2667c5 ¤
33af5a
d2eacd ¤   OSErr
d0e0b1 CDrive::sCreateSharedQueues()
b1c7a1 ¤   {
628e70 ¤   OSErr¤  err¤= noErr;
--bc00 000cfcc2add40120032 Page 30 of CDrive.cp
2a67c5 ¤
31f861 ¤   if ( IsNull( sCloseQueue ) )
635b34 ¤   ¤   {
0847e6 ¤   ¤   sCloseQueue¤= new CCloseQueue();
d3c509 ¤   ¤   if ( IsNull( sCloseQueue ) )
49b49e ¤   ¤   ¤   err¤= memFullErr;
ec0fe4 ¤   ¤   }
f01b52 ¤   ¤
6ee6ca ¤   if ( IsntErr( err ) && IsNull( sModDateQueue ) )
8d5b34 ¤   ¤   {
a4be53 ¤   ¤   sModDateQueue¤  = new CChangeModDateQueue();
a32e41 ¤   ¤   if ( IsNull( sModDateQueue ) )
e3b49e ¤   ¤   ¤   err¤= memFullErr;
d60fe4 ¤   ¤   }
3f1b52 ¤   ¤
13deb7 ¤   return( err );
ee9371 ¤   }
d467c5 ¤
dd67c5 ¤
ef6d52 ¤   void
cbdffa CDrive::sCleanup()
97c7a1 ¤   {
7a7f2b ¤   delete sCloseQueue;
fef97c ¤   sCloseQueue¤= nil;
091b52 ¤   ¤
10c0ef ¤   delete sModDateQueue;
5daeeb ¤   sModDateQueue¤  = nil;
139371 ¤   }
efaf5a
31af5a
9f7bbe /*_________________________________________________________________________
4bd4ef ¤   Create a new CDrive object. ·If an error occurs, destroy it and set it
e989ad ¤   to nil.
3b8ac7 _________________________________________________________________________*/
e9eacd ¤   OSErr
3306a2 CDrive::sCreate(
fce693 ¤   CDrive **¤  ¤   ¤   newDrive,
1bfd49 ¤   const InitInfo *¤   info )
96c7a1 ¤   {
a7cbe3 ¤   OSErr¤  ¤   err¤= memFullErr;
558aca ¤   CDrive *¤   drive;
4367c5 ¤
ddd606 ¤   err¤= sCreateSharedQueues();
ba5ecc ¤   if ( IsntErr( err ) )
ed5b34 ¤   ¤   {
c35955 ¤   ¤   drive¤  = new CDrive( );
4e6902 ¤   ¤   if ( IsntNull( drive ) ·)
6ff776 ¤   ¤   ¤   {
a6e176 ¤   ¤   ¤   err¤= drive->Init( info );
d6a3a6 ¤   ¤   ¤   }
491b52 ¤   ¤
f04807 ¤   ¤   *newDrive¤  = drive;
100fe4 ¤   ¤   }
c667c5 ¤
8fdeb7 ¤   return( err );
319371 ¤   }
2caf5a
69af5a
41af5a
76af5a
7baf5a
e3af5a
31af5a
42af5a
bdaf5a
99af5a
ecaf5a
03af5a
76af5a
03af5a
63af5a
cf67c5 ¤
--9551 001e5209b7740120032 Page 31 of CDrive.cp
2a67c5 ¤
e567c5 ¤
--41d9 00074699f7840120033 Page 1 of CDrive.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
b4af38 ¤   $Id: CDrive.h,v 1.6.8.1 1998/11/12 03:05:38 heller Exp $
94f7f7 ____________________________________________________________________________*/
78af5a
8f7b7d #pragma once
f5af5a
6c7cab #include <stddef.h>
6db935 #include <Timer.h>
12af5a
b424f1 #include "CipherProc.h"
4767c5 ¤
038c21 #include "CipherContext.h"
e1af5a
b0de36 #include "PGPDisk.h"
30af5a
1075a9 #include "MacDriverUtils.h"
f0bbf4 #include "MacFiles.h"
18af5a
1baf5a
e608a4 #include "TunerStruct.h"
b067c5 ¤
f0d106 #include "CipherProcGlue.h"
77af5a
476964 typedef union XIOPB
56c7a1 ¤   {
892ece ¤   ParamBlockRec¤  pb;
4f6eed ¤   XIOParam¤   ¤   xpb;
7bee02 ¤   } XIOPB;
311b52 ¤   ¤
4aaf5a
bdaf5a
04af5a
cb16ab #define CDRIVE_WATCHDOG¤1
12af5a
63ebca class¤  CBlindWriteQueue;
d96f04 struct¤ AddDriveStruct;
b039da class¤  CCloseQueue;
56ffbe class¤  CChangeModDateQueue;
68af5a
be568b // yes, include it inside this class
454a30 #include "CMacQueue.h"
deaf5a
a6f8c1 class CDrive
e1c7a1 ¤   {
1e5ed4 public:
c63da5 ¤   typedef struct InitInfo
885b34 ¤   ¤   {
0f9fcb ¤   ¤   const AddDriveStruct *¤ info;
651b52 ¤   ¤
7e721c ¤   ¤   void *¤ ¤   ¤   ¤   pbArray;
79aad8 ¤   ¤   ushort¤ ¤   ¤   ¤   numPBs;
adea7b ¤   ¤   Boolean¤¤   ¤   ¤   shouldBreakUpRequests;
531b52 ¤   ¤
866b9a ¤   ¤   CipherProcRef¤  ¤   cipherProcRef;
fad441 ¤   ¤   } InitInfo;
c71b52 ¤   ¤
821b52 ¤   ¤
13a2d3 protected:
dbaf5a
3daf5a
edc8cc #if INSTRUMENT
868abc ¤   UnsignedWide¤   mStartTime;
ffa3a5 ¤   UnsignedWide¤   mIOStartTime;
2f0890 ¤   UnsignedWide¤   mIOFinishTime;
1001d9 ¤   UnsignedWide¤   mCipherTime;
fa7454 #endif
aeaf5a
15af5a
74df7f ¤   typedef ulong¤  PosOffset;
--7ceb 000cbbcb03a40120033 Page 2 of CDrive.h
e0af5a
fcc9de ¤   enum IODirection¤   { kReadDirection, kWriteDirection };
0567c5 ¤
7067c5 ¤
1467c5 ¤
a56653 #if CDRIVE_WATCHDOG
def5e2 ¤   typedef struct
2a5b34 ¤   ¤   {
58d990 ¤   ¤   TMTask¤ ¤   ¤   ¤   ¤   tmTask;
19dffa ¤   ¤   CDrive *¤   ¤   ¤   ¤   thisObject;
c2fb0e ¤   ¤   } WatchdogTMTask;
1767c5 ¤
5b4a89 ¤   struct
ff5b34 ¤   ¤   {
300699 ¤   ¤   WatchdogTMTask¤ task;
38dd1b ¤   ¤   DeferredTask *¤ watchTask;
8da9bb ¤   ¤   Boolean¤¤   ¤   shouldUseWatchdog;
6cc6c5 ¤   ¤   Boolean¤¤   ¤   installed;
970963 ¤   ¤   } mWatchdog;
b667c5 ¤
ce4c7b ¤   void¤   ¤   ¤   WatchdogTask( void );
d35bdd ¤   static pascal void¤ ¤   sWatchdogTMTask( void );
b7dfc2 ¤   void¤   ¤   ¤   InstallWatchdog( DeferredTask *watchTask );
75e474 ¤   void¤   ¤   ¤   RemoveWatchdog( void );
5b7454 #endif
9067c5 ¤
2bcf63 ¤   typedef struct MyPB
ea5b34 ¤   ¤   {
b9e3b7 ¤   ¤   #if PGP_DEBUG
ba284d ¤   ¤   enum { kMagic¤  = 'MyPB' };
85fbc1 ¤   ¤   OSType¤ ¤   ¤   magic;
67d656 ¤   ¤   #endif
d467c5 ¤
582604 ¤   ¤   ulong¤  ¤   ¤   startBlockOnSelf;
f90e20 ¤   ¤   QElem¤  ¤   ¤   ioQElem;
033788 ¤   ¤   QElem¤  ¤   ¤   processingQElem;
bd1b52 ¤   ¤
32649a ¤   ¤   const void *¤   src;
d5c3d5 ¤   ¤   CDrive *¤   ¤   theDrive;
4767c5 ¤
0e1ead ¤   ¤   XIOPB¤  ¤   ¤   ioPB;
2b1b52 ¤   ¤
b5d9f8 ¤   ¤   enum { kMaxRetryCount = 10 };
a82b33 ¤   ¤   struct
40f776 ¤   ¤   ¤   {
2924ac ¤   ¤   ¤   ushort¤ ¤   count;
61b8aa ¤   ¤   ¤   ulong¤  ¤   startBlock;
bc7b0e ¤   ¤   ¤   TMTask¤ ¤   tmTask;
74ae48 ¤   ¤   ¤   } retry;
699a86 ¤   ¤   } MyPB;
7ad92d ¤   #if PGP_DEBUG
de2c8b ¤   inline void SetPBMagic( MyPB *myPB ) const
4a7b6f ¤   ¤   ¤   { myPB->magic¤  = MyPB::kMagic;¤}
c347b4 ¤   #else
f52a7a ¤   inline void SetPBMagic( const MyPB * ) const¤   {}
77b7ec ¤   #endif
9e67c5 ¤
c8aea4 ¤   void¤   ¤   ¤   RetryTMTask( MyPB *myPB );
b71c49 ¤   static void¤¤   sRetryTMTask( void );
a373f4 ¤   void¤   ¤   ¤   ScheduleRetry( MyPB *myPB );
02af5a
4a5888 ¤   MyPB *¤ ProcessingQueueElemToMyPB( QElem *elem )
2f17bd ¤   ¤   ¤   ¤   ¤   { return( (MyPB *) ( ((Ptr)elem) -
3305e4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   offsetof( MyPB, processingQElem )) ); }
09af5a
66af5a
af676e ¤   UInt32¤ ¤   GetPBStartBlock( const MyPB ·*myPB )
889f98 ¤   ¤   ¤   ¤   ¤   { return( ::GetPBStartBlock( &myPB->ioPB.pb ) ); }
3c4884 ¤   UInt32¤ ¤   GetPBNumBlocks( const MyPB ·*myPB )
c9d5e1 ¤   ¤   ¤   ¤   ¤   { return( ::GetPBNumBlocks( &myPB->ioPB.pb ) ); }
8e67c5 ¤
cbd92d ¤   #if PGP_DEBUG
--d194 000c3fae9e040120033 Page 3 of CDrive.h
2a3c8d ¤   enum { kDriveMagic¤ = (OSType)'DRIV' };
792100 ¤   OSType¤ mMagic;
1eb7ec ¤   #endif
1567c5 ¤
dfdced ¤   BWIcon¤ ¤   ¤   ¤   mMediaIcon;
d2036e ¤   BWIcon¤ ¤   ¤   ¤   mPhysicalIcon;
556c7c ¤   Str255¤ ¤   ¤   ¤   mVolumeString;¤ // caution: MUST be after
f4c91b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // mPhysicalIcon
6c67c5 ¤
02ff63 ¤   const FlagsDrvQEl *¤mMyDQE;
898b22 ¤   const VCB *¤¤   ¤   mVCB;
73f0ce ¤   short¤  ¤   ¤   ¤   mFileRefNum;
6e837e ¤   Boolean¤¤   ¤   ¤   mHasBeenMounted;
3d0f38 ¤   Boolean¤¤   ¤   ¤   mWriteProtected;
5a0981 ¤   ProcessSerialNumber¤mUnmountedAppPSN;
4167c5 ¤
f5af5a
0504fa ¤   short¤  ¤   ¤   ¤   mBaseDriveNumber;
d7d1ab ¤   short¤  ¤   ¤   ¤   mBaseDriverRefNum;
65cb2b ¤   Str255¤ ¤   ¤   ¤   mVolumeName;¤   // when mounted
c667c5 ¤
62e666 ¤   const VCB *¤¤   ¤   mBaseDriveVCB;
2efa5e ¤   Boolean¤¤   ¤   ¤   mBaseDriveIsEjectable;
ac35e7 ¤   Boolean¤¤   ¤   ¤   BaseDriveIsAvailable( void );
6467c5 ¤
6e8c4c ¤   Boolean¤¤   ¤   ¤   mReinsertNotificationPending;
1f72ba ¤   void¤   ¤   ¤   ¤   NotifyUserToReinsert( ConstStr255Param msg );
be21c9 ¤   void¤   ¤   ¤   ¤   NMProc( NMRec *nmRec );
d43910 ¤   static pascal void¤ sNMProc( NMRec *nmRec );
ab67c5 ¤
958ebc ¤   CipherProcRef¤  ¤   mCipherProcRef;
6b67c5 ¤
96a323 ¤   IODirection¤¤   ¤   mIODirection;
6bf06f ¤   ParamBlockRec *¤¤   mClientPB;
144cde ¤   OSErr¤  ¤   ¤   ¤   mResultErr;
a3dc12 ¤   DCtlEntry *¤¤   ¤   mDCE;
e962a9 ¤   ulong¤  ¤   ¤   ¤   mLastAccessTime;
43e218 ¤   ulong¤  ¤   ¤   ¤   mLastWriteTime;
5f2bd5 ¤   ulong¤  ¤   ¤   ¤   mLastFileModDateUpdate;
9f67c5 ¤
6eb954 ¤   const DiskExtent *¤ mExtents;
20a3f2 ¤   PGPUInt32¤  ¤   ¤   mNumExtents;
7967c5 ¤
d426de ¤   ushort¤ ¤   ¤   ¤   mWhichCipherContextValid;
59b39b ¤   CipherContext ¤ ¤   mCipherContext[ 2 ];
0167c5 ¤
b512b3 ¤   MyPB *¤ ¤   ¤   ¤   mPBArray;
8350db ¤   ushort¤ ¤   ¤   ¤   mNumPBs;
1767c5 ¤
a4390d ¤   CMacQueue¤  ¤   ¤   mProcessingQueue;
759d71 ¤   CMacQueue¤  ¤   ¤   mIOQueue;
46a3ef ¤   Boolean¤¤   ¤   ¤   mDecryptLock;
892b40 ¤   Boolean¤¤   ¤   ¤   mEncryptLock;
f1af5a
3203ef #if ALLOW_VM_PAGING
5ca3cd ¤   Boolean¤¤   ¤   ¤   mVirtualMemoryIsOn;
1fd321 ¤   Boolean¤¤   ¤   ¤   mTreatAsVMRequest;
ce7454 #endif
5b1b52 ¤   ¤
ae4a89 ¤   struct
ee5b34 ¤   ¤   {
df4bdf ¤   ¤   ulong¤  ¤   ¤   curClientBlock;
2f492c ¤   ¤   const void *¤   curClientBuffer;
f25de9 ¤   ¤   ulong¤  ¤   ¤   blocksRemaining;
1e0949 ¤   ¤   } mWriteStuff;
6faf5a
70b89f ¤   DeferredTask¤   ¤   mDecryptDeferredTask;
9e085d ¤   DeferredTask¤   ¤   mKickStartDeferredTask;
e067c5 ¤
4b67c5 ¤
8459eb ¤   // shared by all drives
c3b0b3 ¤   static void *¤  ¤   sScratchBuffer;¤// needed for writes only
--7639 0005a5722aa40120033 Page 4 of CDrive.h
431bcc ¤   static ulong¤   ¤   sScratchBufferSize;
7967c5 ¤
f267c5 ¤
04a0bc ¤   Boolean¤¤   ¤   ¤   mBreakUpPBs;
7b37db ¤   TunerStruct¤¤   ¤   mReadTuner;
091984 ¤   TunerStruct¤¤   ¤   mWriteTuner;
06af5a
d967c5 ¤
2667c5 ¤
70c4bd ¤   OSErr¤  InitExtents( const DiskExtent * src, ulong numExtents );
3a5621 ¤   OSErr¤  InitCipherContext(const CASTKey * key, const PassphraseSalt *salt);
d2ba69 ¤   OSErr¤  InitVolumeInfo( short fileRefNum );
bf67c5 ¤
bc67c5 ¤
b733d2 ¤   MyPB *¤ GetIndPB( ushort index );
fce9e6 ¤   void¤   ReadPBs( ushort¤numPBs );
6a0612 ¤   void¤   QueueAllPBsForRead( ushort numPBs );
0967c5 ¤
33b40e ¤   short¤  GetBaseDriverRefNum( void ) const¤  { return( mBaseDriverRefNum ); }
b267c5 ¤
9ffd33 ¤   ushort¤ ¤   ¤   GetNumExtents( void ) const¤{ return( mNumExtents ); }
413cc3 ¤   const DiskExtent *¤ FindExtentContainingBlock( ulong blockIndex,
ba23a6 ¤   ¤   ¤   ¤   ¤   ulong *startBlockOfExtentPtr);
fa67c5 ¤
80ffb6 ¤   void¤   InitReadOrWrite( ParamBlockRec * pb, DCtlEntry * dce,
d3c4df ¤   ¤   ¤   ¤   ¤   IODirection );
ffe3fa ¤   Boolean¤IsValidRequest( const IOParam *pb);
3467c5 ¤
774e23 ¤   void¤   UpdatePBAndCallIODone( OSErr err, ulong actualCount );
8b3c89 ¤   void¤   MyIOIsDone( OSErr err, ulong actualCount );
d867c5 ¤
77a9d7 ¤   void¤   SetPosOffset( XIOPB *¤  pb, ulong startBlockOffset,
57db04 ¤   ¤   ¤   ¤   ¤   ulong numBlocks);
7642b6 ¤   void¤   FillInPB( MyPB * ioPB, const void * src, Ptr dest,
90f31c ¤   ¤   ¤   ¤   ¤   ulong startBlock, ulong numBlocks );
5682d3 ¤   ulong¤  GetBlockLimitForSize( const TunerStruct * tuner, ulong numBlocks);
171c65 ¤   void¤   InsertPB( ushort pbIndex, ushort numPBs, const MyPB * myPB );
639dd4 ¤   void¤   InsertLastPB( const ushort index );
e967c5 ¤
58e10a ¤   void¤   BreakUpPB( MyPB *in, MyPB *out, ulong firstPieceBlocks = 0);
e817f5 ¤   Boolean¤BreakUpPBIfNeeded( ulong clientRequestSize, MyPB *in, MyPB *out,
0c00ba ¤   ¤   ¤   ¤   ¤   const TunerStruct *tuner);
295aa1 ¤   ulong¤  BreakUpPBs(¤ulong clientRequestSize, ushort numPBs,
2d00ba ¤   ¤   ¤   ¤   ¤   const TunerStruct *tuner);
e5ff69 ¤   void¤   BreakUpPBsIfNeeded( ulong clientRequestSize, ushort numPBsIn,
30f43c ¤   ¤   ¤   ¤   ¤   ¤   ushort * numPBsOut, const TunerStruct *tuner);
ed67c5 ¤
4e6644 ¤   void¤   FillInAllPBsForRead( UInt32 offsetInBlocks, ulong numBlocks,
c5e957 ¤   ¤   ¤   ¤   ¤   ¤   void * buffer, ushort *¤numPBsUsed );
0c1b28 ¤   void¤   DecryptPB( const MyPB *myPB );
ebaf5a
4aaf5a
54a915 ¤   void¤   ¤   ¤   ¤   ¤   DecryptBlocksDeferredTask( void );
4eaa05 ¤   static pascal void¤ ¤   sDecryptBlocksDeferredTask( void );
d567c5 ¤
109fac ¤   static pascal void¤ ¤   sKickStartDeferredTask( void );
46cb15 ¤   void¤   ¤   ¤   ¤   KickStartDeferredRead( void );
64a80b ¤   void¤   ¤   ¤   ¤   KickStartDeferredWrite( void );
ec67c5 ¤
2267c5 ¤
83c529 ¤   void¤   ¤   InstallDeferredTask( DeferredTask* task,
12f0b2 ¤   ¤   ¤   ¤   ¤   ¤   DeferredTaskUPP proc );
3a67c5 ¤
fa86be ¤   void¤   ¤   InitWrite( const IOParam *pb );
f819ff ¤   void¤   ¤   QueueForEncryption( void );
d19152 ¤   void¤   ¤   EncryptAndWriteQueuedItems( void );
8067c5 ¤
cc1be5 ¤   static pascal void¤ sCompletionProc( void );
2a8644 ¤   void¤   ¤   HandleReadCompletion( MyPB *pb );
a38719 ¤   void¤   ¤   HandleWriteCompletion( MyPB *pb );
959690 ¤   void¤   ¤   HandleCompletion( MyPB *pb );
5a67c5 ¤
--5ae7 000604e0b2440120033 Page 5 of CDrive.h
251486 ¤   IODirection¤GetIODirection( void ) const¤   { return( mIODirection ); }
a667c5 ¤
c43f27 ¤   void¤   ¤   ¤   ¤   ¤   FlipBytes( void *bytes, ulong numBytes );
47cf71 ¤   const CipherContext *¤  GetCipherContext( void );
ee67c5 ¤
6367c5 ¤
50e70f ¤   ¤   ¤   ¤   ¤   ¤   CDrive( void );
4cf5c6 ¤   OSStatus¤   Init( const InitInfo *info );
5367c5 ¤
3e67c5 ¤
167817 ¤   static CCloseQueue *¤   ¤   ¤   sCloseQueue;
170585 ¤   static CChangeModDateQueue *¤   sModDateQueue;
fd164b ¤   static OSErr¤   ¤   ¤   ¤   ¤   sCreateSharedQueues( void );
7967c5 ¤
395ed4 public:
29d92d ¤   #if PGP_DEBUG
c6a9af ¤   static void¤¤   sAssertValid( const CDrive *drive );
dd47b4 ¤   #else
2bfbeb ¤   static void¤¤   sAssertValid( const CDrive * )¤ {}
feb7ec ¤   #endif
446cf5 ¤   static void¤¤   ¤   ¤   sCleanup( void );
7367c5 ¤
32ba91 ¤   enum { kPBSize = sizeof( MyPB ) };
e767c5 ¤
f7377e ¤   static OSErr¤   sCreate( CDrive **newDrive, const InitInfo *info );
ef67c5 ¤
02bac1 ¤   virtual¤¤   ¤   ~CDrive( void );
4d67c5 ¤
a73f80 ¤   // informational "Get" routines
ce42d6 ¤   short¤  GetBaseDriveNumber( void ) const
a52078 ¤   ¤   ¤   ¤   ¤   { return( mBaseDriveNumber ); }
891b9b ¤   short¤  GetDriveNumber( void ) const
1f2206 ¤   ¤   ¤   ¤   ¤   { return( mMyDQE->el.dQDrive ); }
b90c9d ¤   short¤  GetDriverRefNum( void ) const
24242d ¤   ¤   ¤   ¤   ¤   { return( mMyDQE->el.dQRefNum ); }
6e860c ¤   short¤  GetFileRefNum( void ) const
d59a1a ¤   ¤   ¤   ¤   ¤   { return( mFileRefNum ); }
62e9a3 ¤   Boolean¤GetBreaksUpRequests( void ) const
b4601c ¤   ¤   ¤   ¤   ¤   { return( mBreakUpPBs ); }
c58213 ¤   const FlagsDrvQEl *¤GetDriveQElem( void ) const
499792 ¤   ¤   ¤   ¤   ¤   { return( mMyDQE ); }
243ff0 ¤   const VCB *¤GetVCB( void ) const
d0606c ¤   ¤   ¤   ¤   ¤   { return( mVCB ); }
29fa28 ¤   void¤   ¤   SetVCB( const VCB *vcb )
7ddaa7 ¤   ¤   ¤   ¤   ¤   { mVCB = vcb; }
8167c5 ¤
bc15d8 ¤   void¤   Read( ParamBlockRec *pb, DCtlPtr dce );
e900e3 ¤   void¤   Write( ParamBlockRec *pb, DCtlPtr dce );
5a67c5 ¤
1d626b ¤   ulong¤  GetLastAccessTime( void ) const¤{¤  return( mLastAccessTime ); }
37abd3 ¤   void¤   SetDriveQElement(const FlagsDrvQEl *queueElement);
ab67c5 ¤
cba94a ¤   ulong¤  ¤   ¤   GetLogicalSizeInBlocks( void ) const;
c5786a ¤   const char *¤   GetPhysicalIcon( void ) const;
2bbfc7 ¤   const char *¤   GetMediaIcon( void ) const;
fa739c ¤   Boolean¤¤   ¤   IsWriteProtected( void ) const
915570 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( mWriteProtected ); }
d667c5 ¤
3b260c ¤   static void¤¤   sSetScratchBuffer( void *buffer, ulong bufferSize );
db67c5 ¤
8667c5 ¤
73f368 ¤   void¤   ¤   ¤   SetPBs( void *pbArray, ushort numPBs );
a967c5 ¤
faf247 ¤   void¤   ¤   ¤   SetReadTuner( const TunerStruct *tune );
8c0b48 ¤   void¤   ¤   ¤   SetWriteTuner( const TunerStruct *tune );
a8be40 ¤   void¤   ¤   ¤   GetReadTuner( TunerStruct *tune )
4d614f ¤   ¤   ¤   ¤   ¤   ¤   ¤   { *tune¤= mReadTuner; }
401757 ¤   void¤   ¤   ¤   GetWriteTuner( TunerStruct *tune )
7bcff0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { *tune¤= mWriteTuner; }
cb67c5 ¤
fe4e4a ¤   void¤   ¤   ¤   ToggleKeyBits( void );
60af5a
--1f7c 0019641ba3140120033 Page 6 of CDrive.h
1c2392 ¤   Boolean¤¤   ¤   HasBeenMounted( void )
46a112 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( mHasBeenMounted ); }
ec6685 ¤   void¤   ¤   ¤   SetHasBeenMounted( void )
28f138 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { mHasBeenMounted¤  = TRUE; }
5e876b ¤   ProcessSerialNumber¤GetUnmountedAppPSN(void)
44d6bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( mUnmountedAppPSN ); }
2dd55b ¤   void¤   ¤   ¤   SetUnmountedAppPSN(ProcessSerialNumber appPSN)
4408f6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { mUnmountedAppPSN = appPSN; }
4367c5 ¤
5cf7a1 ¤   void¤   ¤   ¤   UpdateFileModificationDate( void );
0467c5 ¤
71e33c ¤   void¤   ¤   ¤   ¤   CheckBaseDriveEjected( ConstStr255Param templateMsg );
e562bd ¤   };
3aaf5a
83af5a
a0af5a
48af5a
96af5a
--16e5 000d141c37440120034 Page 1 of CDriveList.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
e04a88 ¤   $Id: CDriveList.cp,v 1.3.8.1 1998/11/12 03:05:38 heller Exp $
7ff7f7 ____________________________________________________________________________*/
e8af5a
b835cf #include "CDrive.h"
c21cce #include "CDriveList.h"
24f359 #include "MacInterrupts.h"
81af5a
d5af5a
b2e4ed CDriveList *¤   CDriveList::sDriveList¤ = nil;
5eaf5a
4c4f52 ¤   CDriveList *
cc5d86 CDriveList::sGetList( void )
81c7a1 ¤   {
5b494c ¤   pgpAssert( IsntNull( sDriveList ) );
b867c5 ¤
bf88a6 ¤   return( sDriveList );
2b9371 ¤   }
6faf5a
b3af5a
27eacd ¤   OSErr
53d945 CDriveList::sCreateList( void )
84c7a1 ¤   {
b18e70 ¤   OSErr¤  err¤= noErr;
e267c5 ¤
3e31ee ¤   pgpAssert( IsNull( sDriveList ) );
8b67c5 ¤
0c1c05 ¤   sDriveList¤ = new CDriveList;
22494c ¤   pgpAssert( IsntNull( sDriveList ) );
2e4ece ¤   if ( IsNull( sDriveList) )
595b34 ¤   ¤   {
e93dca ¤   ¤   err¤= memFullErr;
a40fe4 ¤   ¤   }
ec67c5 ¤
86deb7 ¤   return( err );
c99371 ¤   }
4067c5 ¤
c167c5 ¤
9a6d52 ¤   void
1818f8 CDriveList::sDisposeList( void )
0bc7a1 ¤   {
1c494c ¤   pgpAssert( IsntNull( sDriveList ) );
14a5b3 ¤   pgpAssert( sDriveList->GetNumDrives() == 0 );
1467c5 ¤
a60392 ¤   delete sDriveList;
b8d313 ¤   sDriveList¤ = nil;
a59371 ¤   }
7caf5a
e4af5a
fcf0fb CDriveList::CDriveList( void )
f4c7a1 ¤   {
d0d68e ¤   mDriveArray¤= nil;
32e428 ¤   mNumDrives¤ = 0;
229371 ¤   }
3daf5a
84af5a
230002 CDriveList::~CDriveList( void )
a3c7a1 ¤   {
2cea9e ¤   pgpAssert( GetNumDrives() == 0 );
69d313 ¤   sDriveList¤ = nil;
1c67c5 ¤
3c8e9b ¤   if ( IsntNull( mDriveArray ) )
db5b34 ¤   ¤   {
721f6d ¤   ¤   DisposePtr( (Ptr)mDriveArray );
ac346f ¤   ¤   mDriveArray¤= nil;
580fe4 ¤   ¤   }
699371 ¤   }
abaf5a
d167c5 ¤
--c9ed 000ba325c6b40120034 Page 2 of CDriveList.cp
2a67c5 ¤
4f6cbd ¤   CDrive *
76a8ed CDriveList::GetDriveForDriveNumber( short driveNumber )
30c7a1 ¤   {
db6f49 ¤   for( ushort index = 0; index < GetNumDrives(); ++index )
155b34 ¤   ¤   {
2d682b ¤   ¤   CDrive *¤   drive;
851b52 ¤   ¤
f49ff7 ¤   ¤   drive¤  = GetIndDrive( index );
8bf782 ¤   ¤   if ( drive->GetDriveNumber() == driveNumber )
c2f776 ¤   ¤   ¤   {
005bf6 ¤   ¤   ¤   CDrive::sAssertValid( drive );
e7bf9d ¤   ¤   ¤   return( drive );
29a3a6 ¤   ¤   ¤   }
2e0fe4 ¤   ¤   }
1d67c5 ¤
5e1258 ¤   return( nil );
9f9371 ¤   }
7c67c5 ¤
821b52 ¤   ¤
b2363b ¤   ushort
a2d4f9 CDriveList::GetDriveIndex( const CDrive *driveToFind )
b0c7a1 ¤   {
7f6f49 ¤   for( ushort index = 0; index < GetNumDrives(); ++index )
1e5b34 ¤   ¤   {
97682b ¤   ¤   CDrive *¤   drive;
c41b52 ¤   ¤
f09ff7 ¤   ¤   drive¤  = GetIndDrive( index );
a69a74 ¤   ¤   if ( drive == driveToFind )
bc7ae3 ¤   ¤   ¤   return( index );
d40fe4 ¤   ¤   }
1167c5 ¤
3a910e ¤   pgpDebugPStr( "\pCDriveList::GetDriveIndex: drive not found" );
943438 ¤   return( ~0 );
389371 ¤   }
6067c5 ¤
3167c5 ¤
5867c5 ¤
4e67c5 ¤
5e6d52 ¤   void
9b4fca CDriveList::AddDrive( const CDrive *drive )
f6c7a1 ¤   {
65c99a ¤   const CDrive **¤newList¤= (const CDrive **)NewPtrSys( sizeof( CDrive * ) *
00c4ec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (mNumDrives + 1) );
8267c5 ¤
27272b ¤   if ( IsntNull( newList ) )
d65b34 ¤   ¤   {
cfb284 ¤   ¤   // copy the old list into the new and dump the old
0ecf68 ¤   ¤   if ( IsntNull( mDriveArray ) )
2df776 ¤   ¤   ¤   {
e88476 ¤   ¤   ¤   BlockMoveData( mDriveArray, newList, mNumDrives *
b37c6b ¤   ¤   ¤   ¤   ¤   sizeof( CDrive * ) );
a287c7 ¤   ¤   ¤
8f970b ¤   ¤   ¤   DisposePtr( (Ptr)mDriveArray );
382047 ¤   ¤   ¤   mDriveArray¤= nil;
5da3a6 ¤   ¤   ¤   }
231b52 ¤   ¤
dd896b ¤   ¤   newList[ mNumDrives ]¤  = drive;
e71b52 ¤   ¤
6b3235 ¤   ¤   mDriveArray¤= newList;
b381b4 ¤   ¤   ++mNumDrives;
160fe4 ¤   ¤   }
bb9371 ¤   }
89af5a
7eaf5a
dc67c5 ¤
ff6d52 ¤   void
edbbde CDriveList::RemoveDrive( const CDrive *drive )
86c7a1 ¤   {
aa535b ¤   pgpAssert( mNumDrives != 0 );
0c67c5 ¤
baf509 ¤   ushort¤ index¤  = GetDriveIndex( drive );
--507f 0011757989740120034 Page 3 of CDriveList.cp
2a67c5 ¤
394adc ¤   if ( index < GetNumDrives() && mNumDrives != 0)
495b34 ¤   ¤   {
4dea5c ¤   ¤   ulong¤  numAfter¤   = ( mNumDrives - index ) - 1;
431b52 ¤   ¤
1ce60a ¤   ¤   EnterCriticalSection();
b2fe86 ¤   ¤   if ( numAfter != 0 )
90f776 ¤   ¤   ¤   {
48e3d4 ¤   ¤   ¤   BlockMoveData( &mDriveArray[ index + 1 ], &mDriveArray[ index ],
19dad9 ¤   ¤   ¤   ¤   ¤   numAfter * sizeof( CDrive * ) );
06a3a6 ¤   ¤   ¤   }
c61b52 ¤   ¤
669237 ¤   ¤   --mNumDrives;
2c3350 ¤   ¤   ExitCriticalSection();
760fe4 ¤   ¤   }
289371 ¤   }
10af5a
acaf5a
fdaf5a
c7af5a
37af5a
f9af5a
0067c5 ¤
17bd73 ¤   ¶
--d914 001f3a6646b40120035 Page 1 of CDriveList.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
166cd5 ¤   $Id: CDriveList.h,v 1.2.8.1 1998/11/12 03:05:39 heller Exp $
b9f7f7 ____________________________________________________________________________*/
53af5a
2a7b7d #pragma once
8caf5a
02d75d class CDrive;
3467c5 ¤
47a0eb class CDriveList
b9c7a1 ¤   {
ae0fb9 private:
76f975 ¤   static CDriveList *¤sDriveList;
be67c5 ¤
512eca ¤   ushort¤ ¤   ¤   ¤   GetDriveIndex( const CDrive *driveToFind );
e967c5 ¤
8c4cb3 ¤   const CDrive **¤¤   mDriveArray;
0866b1 ¤   ulong¤  ¤   ¤   ¤   mNumDrives;
2767c5 ¤
32a7ec ¤   ¤   ¤   ¤   ¤   ¤   CDriveList( void );
955215 ¤   virtual¤¤   ¤   ¤   ~CDriveList( void );
7367c5 ¤
e15ed4 public:
467599 ¤   static CDriveList *¤sGetList( void );
6ce7ac ¤   static OSErr¤   ¤   sCreateList( void );
51158c ¤   static void¤¤   ¤   sDisposeList( void );
f067c5 ¤
725864 ¤   ushort¤ ¤   ¤   ¤   GetNumDrives( void )
d6ebbf ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( mNumDrives ); }
d6531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
e0b725 ¤   CDrive *¤   ¤   ¤   GetIndDrive( ushort index )
5a806e ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( (CDrive *)( mDriveArray[ index ] ) ); }
26531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
61ca3f ¤   void¤   ¤   ¤   ¤   AddDrive( const CDrive *drive );
49531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
b56c26 ¤   void¤   ¤   ¤   ¤   RemoveDrive( const CDrive *drive );
8d67c5 ¤
a208ea ¤   CDrive *¤   ¤   ¤   GetDriveForDriveNumber( short driveNumber );
f362bd ¤   };
--7536 0006cdc722040120036 Page 1 of CDriver.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
478f09 ¤   $Id: CDriver.cp,v 1.14.8.1 1998/11/12 03:05:40 heller Exp $
dff7f7 ____________________________________________________________________________*/
86af5a
df324c #include <string.h>
8f7387 #include <sound.h>
114293 #include <FSM.h>
24c110 #include "pgpMacMemory.h"
3b5bf6 #include "MacTraps.h"
1b85c2 #include "MacStrings.h"
968bd8 #include "MacEnvirons.h"
2f8c9b #include <DriverGestalt.h>
0caf5a
69de36 #include "PGPDisk.h"
7f3175 #include "PGPDiskEncryptDecrypt.h"
9fb488 #include "A4Stuff.h"
99af5a
cd1cce #include "CDriveList.h"
4735cf #include "CDrive.h"
95d106 #include "CipherProcGlue.h"
5daf5a
1bba14 #include "PGPMountUtils.h"
6baf5a
b250c5 #include "PGPDiskDRVRMain.h"
24bdd8 #include "AddDriveStruct.h"
dd49af #include "PGPDiskGlobals.h"
e40421 #include "SleepAlert.h"
6baf5a
695614 #include "CDriver.h"
6daf5a
06af5a
0baf5a
859b48 #if USE_LOG
a74144 CLog *¤ gLog¤   = nil;
eb7454 #endif
7baf5a
c525d0 enum¤   { kNoDriverErr¤ = -1 };
ea67c5 ¤
2a7295 #define MAX( a, b ) ¤   ( (a) >= (b) ? (a) : (b) )
9eda50 #define MIN( a, b ) ¤   ( (a) <= (b) ? (a) : (b) )
09af5a
0caf5a
1ebb49 /* Control codes */
835ca9 #define¤¤   killIOCC¤   ¤   1¤  ¤   ¤   /* kill I/O */
edaeeb #define¤¤   verifyDiskCC¤   5¤  ¤   ¤   /* verify disk */
43addb #define¤¤   formatDiskCC¤   6¤  ¤   ¤   /* format disk */
77e83b #define¤¤   ejectDiskCC¤¤   ejectCode¤  /* eject disk (ejectable media only) */
d7281c #define¤¤   setTagBufferCC¤ 8¤  ¤   ¤   /* set tag buffer (.SONY) */
50c5e4 #define¤¤   trackCacheCC¤   9,¤ ¤   ¤   /* control track cache (.SONY) */
d204a3 #define¤¤   physicalIconCC¤ 21¤ ¤   ¤   /* return physical location icon and
e70e8f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ···where string */
9920d5 #define¤¤   mediaIconCC¤¤   22¤ ¤   ¤   /* return media icon */
119c23 #define¤¤   driveInfoCC¤¤   23¤ ¤   ¤   /* return drive info */
dc913a #define¤¤   getDriveSizeCC¤ 24
cb5437 #define¤¤   trackDumpCC¤¤   18244¤  ¤   /* diagnostic raw track dump (.SONY) */
4067c5 ¤
5443fd /* Status codes */
ff9543 #define¤¤   returnFormatListSC¤ 6¤  ¤   ¤   /* return format list (.SONY) */
8c3ddb #define¤¤   driveStatusSC¤  ¤   drvStsCode¤ ¤   /* drive status */
3baf5a
53af5a
6caf5a
8b18ea const ulong¤kDefaultScratchBufferSize¤  = 128UL * 1024UL;
23d4c9 const ulong¤kMinScratchBufferSize¤  ¤   = 8UL * 1024UL;
18db0b const ulong¤kMaxScratchBufferSize¤  ¤   = 768UL * 1024UL;
72af5a
23af5a
2508f6 const ResID¤kDriverStringsRID¤  = 1003;
6c7353 enum
--1880 000012ea69740120036 Page 2 of CDriver.cp
2cbb36 {
12257e ¤   kPleaseReinsertDiskStrIndex = 1
f782f7 };
6daf5a
ccaf5a
da7bbe /*_________________________________________________________________________
ab16f5 ¤   Utility class whose constructor sets the zone to the system zone and
c4a1cc ¤   whose destructor restores the previous zone.
338ac7 _________________________________________________________________________*/
1a408d class CSystemZoneSetter
a9c7a1 ¤   {
680f80 ¤   private:
cb27b1 ¤   ¤   THz¤¤   mSaveZone;
1c1b52 ¤   ¤
f467d4 ¤   public:
09d42e ¤   ¤   CSystemZoneSetter( void )
8eb789 ¤   ¤   ¤   { mSaveZone¤= GetZone(); SetZone( SystemZone() ); }
2db25d ¤   ¤   ~CSystemZoneSetter( void)
9ed849 ¤   ¤   ¤   { SetZone( mSaveZone ); }
c262bd ¤   };
d367c5 ¤
9b67c5 ¤
e39d47 static Boolean¤ ¤   PowerMgrExists( void );
bfaf5a
f167c5 ¤
7867c5 ¤
27af5a
e65bad CDriver *¤  CDriver::sSelf¤ = nil;
55af5a
be6d52 ¤   void
80e0cb CDriver::DisposeScratchBuffer( )
b8c7a1 ¤   {
3aed15 ¤   if ( IsntNull( mScratchBuffer ) )
b85b34 ¤   ¤   {
871a6b ¤   ¤   pgpFreeMac( (Ptr)mScratchBuffer );
34d546 ¤   ¤   mScratchBuffer¤ = nil;
94bf12 ¤   ¤   CDrive::sSetScratchBuffer( nil, 0 );
150fe4 ¤   ¤   }
929371 ¤   }
3e67c5 ¤
e467c5 ¤
236d52 ¤   void
fd4d47 CDriver::DisposePBs( )
63c7a1 ¤   {
062755 ¤   if ( IsntNull( mPBArray ) )
d15b34 ¤   ¤   {
e87d6b ¤   ¤   DisposePtr( (Ptr)mPBArray );
38dd6e ¤   ¤   mPBArray¤   = nil;
060fe4 ¤   ¤   }
219371 ¤   }
7767c5 ¤
ef67c5 ¤
a1af5a
72af5a
a2af5a
4caf5a
8dd140 ¤   static OSErr
e66952 UnmountAndEjectDrive( short driveNumber )
02c7a1 ¤   {
af2ece ¤   ParamBlockRec¤  pb;
ee6920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
4267c5 ¤
e73771 ¤   pb.volumeParam.ioVRefNum¤   = driveNumber;
5314ed ¤   pb.volumeParam.ioNamePtr¤   = nil;
0dddd0 ¤   err¤= PBUnmountVol( & pb );
4a5ecc ¤   if ( IsntErr( err ) )
515b34 ¤   ¤   {
db07d4 ¤   ¤   pb.volumeParam.ioCompletion¤= nil;
53efc3 ¤   ¤   pb.volumeParam.ioVRefNum¤   = driveNumber;
3b1aa1 ¤   ¤   pb.volumeParam.ioNamePtr¤   = nil;
09445e ¤   ¤   err¤= PBEject( &pb );
010fe4 ¤   ¤   }
--458a 000ccfc438640120036 Page 3 of CDriver.cp
f11b52 ¤   ¤
dddeb7 ¤   return( err );
249371 ¤   }
a0af5a
0faf5a
c9dacc #pragma mark -
beaf5a
74af5a
52d978 CDriver::CDriver( void )
ccc7a1 ¤   {
1c91d7 ¤   sSelf¤  ¤   ¤   ¤   ¤   = this;
e967c5 ¤
b61a96 ¤   mDriverIsOpen¤  ¤   ¤   = false;
075d36 ¤   mDCE¤   ¤   ¤   ¤   ¤   = nil;
b3d8c8 ¤   mSleep.installed¤   ¤   = false;
505f40 ¤   mPGPDiskGlobals¤¤   ¤   = nil;
e786c0 ¤   mHaveShownSleepAlert¤   = false;
7d67c5 ¤
dbe99f ¤   pgpClearMemory( &mSleep, sizeof( mSleep ) );
5fbf8d ¤   pgpClearMemory( &mPrefs, sizeof( mPrefs ) );
0667c5 ¤
a53f8f ¤   mPBArray¤   = nil;
2dbb03 ¤   mNumPBs¤¤   = 0;
bc67c5 ¤
f1aad4 ¤   mScratchBuffer¤ ¤   = nil;
14576b ¤   mScratchBufferSize¤ = 0;
c063b1 ¤   mCipherProcDamaged¤ = false;
f367c5 ¤
501f58 ¤   GetIndString( mEjectStringTemplate, kDriverStringsRID,
200b4c ¤   ¤   ¤   kPleaseReinsertDiskStrIndex );
537312 ¤   pgpAssert( StrLength( mEjectStringTemplate ) != 0 );
669371 ¤   }
b067c5 ¤
af67c5 ¤
3b67c5 ¤
10658f CDriver::~CDriver( void )
a3c7a1 ¤   {
a7c29a ¤   pgpAssert( ! mDriverIsOpen );
e367c5 ¤
90bae7 ¤   // most deletion is done in Close()
8a80ac ¤   pgpAssert( IsNull( mScratchBuffer ) );
2a6fe4 ¤   pgpAssert( IsNull( mPBArray ) );
3467c5 ¤
636c05 ¤   sSelf¤  ¤   ¤   ¤   = nil;
349371 ¤   }
5067c5 ¤
26af5a
0aaf5a
3f67c5 ¤
487bbe /*_________________________________________________________________________
8bdaaf ¤   No drives remain. ·Get rid of any unnecessary stuff.
468ac7 _________________________________________________________________________*/
b86d52 ¤   void
d3bcba CDriver::NoDrivesLeft( void )
23c7a1 ¤   {
fcee09 ¤   DisposeScratchBuffer();
9e67c5 ¤
732f49 ¤   DisposePBs();
8e67c5 ¤
5ad45c ¤   mDCE->dCtlDelay¤¤   = 0;¤   // we don't want time anymore
f767c5 ¤
93367d ¤   RemoveSleepProc();
ce9371 ¤   }
b1af5a
c3af5a
ea6d52 ¤   void
5a74da CDriver::DriveHousekeeping( Boolean deleteUnmountedDrives )
6cc7a1 ¤   {
e13ca0 ¤   CDriveList *¤   driveList¤  = CDriveList::sGetList();
9a67c5 ¤
107c06 ¤   if ( IsntNull( driveList ) )
cc5b34 ¤   ¤   {
--0e0f 000472f7f5640120036 Page 4 of CDriver.cp
d40864 ¤   ¤   ushort ¤driveIndex = 0;
bb1b52 ¤   ¤
e51474 ¤   ¤   while ( driveIndex < driveList->GetNumDrives() )
4df776 ¤   ¤   ¤   {
fb7c03 ¤   ¤   ¤   CDrive *¤   drive;
8dcc3d ¤   ¤   ¤   ushort¤ ¤   driveNumber;
a4fbc7 ¤   ¤   ¤   Boolean¤¤   isMounted;
1987c7 ¤   ¤   ¤
f6098c ¤   ¤   ¤   drive¤  = driveList->GetIndDrive( driveIndex );
eb67c5 ¤
99940a ¤   ¤   ¤   driveNumber¤= drive->GetDriveNumber();
8028e2 ¤   ¤   ¤   isMounted¤  = IsntNull( GetVCBForDrive( driveNumber ) );
354426 ¤   ¤   ¤   if ( ! isMounted )
3c72c3 ¤   ¤   ¤   ¤   {
26d42d ¤   ¤   ¤   ¤   Boolean¤removeDrive = deleteUnmountedDrives;
ec2b85 ¤   ¤   ¤   ¤
679cde ¤   ¤   ¤   ¤   if ( drive->HasBeenMounted() && ! removeDrive )
6e4859 ¤   ¤   ¤   ¤   ¤   {
80e472 ¤   ¤   ¤   ¤   ¤   ProcessSerialNumber¤unmountedAppPSN;
c2ae30 ¤   ¤   ¤   ¤   ¤
072082 ¤   ¤   ¤   ¤   ¤   unmountedAppPSN = drive->GetUnmountedAppPSN();
cba49c ¤   ¤   ¤   ¤   ¤   if( unmountedAppPSN.highLongOfPSN == 0 &&
7c03dc ¤   ¤   ¤   ¤   ¤   ¤   unmountedAppPSN.lowLongOfPSN == kNoProcess )
d18fec ¤   ¤   ¤   ¤   ¤   ¤   {
13e137 ¤   ¤   ¤   ¤   ¤   ¤   // We have no unmounting process for this drive.
d1b0d5 ¤   ¤   ¤   ¤   ¤   ¤   // Assume immediate removal.
f63fff ¤   ¤   ¤   ¤   ¤   ¤   removeDrive = TRUE;
06db3c ¤   ¤   ¤   ¤   ¤   ¤   }
954bd6 ¤   ¤   ¤   ¤   ¤   else
e08fec ¤   ¤   ¤   ¤   ¤   ¤   {
696dcf ¤   ¤   ¤   ¤   ¤   ¤   ProcessInfoRec¤ processInfo;
4e62f1 ¤   ¤   ¤   ¤   ¤   ¤   FSSpec¤ ¤   ¤   unusedFileSpec;
fbb775 ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   ¤   unusedProcessName;
a294aa ¤   ¤   ¤   ¤   ¤   ¤
0ecb7e ¤   ¤   ¤   ¤   ¤   ¤   pgpClearMemory( &processInfo, sizeof( processInfo ) );
3b94aa ¤   ¤   ¤   ¤   ¤   ¤
84e958 ¤   ¤   ¤   ¤   ¤   ¤   processInfo.processInfoLength ¤ = sizeof(processInfo);
0292ca ¤   ¤   ¤   ¤   ¤   ¤   processInfo.processName¤¤   ¤   = unusedProcessName;
662308 ¤   ¤   ¤   ¤   ¤   ¤   processInfo.processAppSpec¤ ¤   = &unusedFileSpec;
ec94aa ¤   ¤   ¤   ¤   ¤   ¤
fbd71b ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( GetProcessInformation( &unmountedAppPSN,
a933cf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &processInfo ) ) )
4106b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
207d61 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( ( processInfo.processMode &
28232e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   modeOnlyBackground ) == 0 )
4931b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
4fb053 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Is not a faceless background app
06da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
8e0412 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( processInfo.processSignature == 'MACS' ||
441fd1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   processInfo.processSignature ==
2cce37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskFileCreator )
32dec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
1524aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Unmounting app is the Finder or PGPdisk.
b41de0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Removed immedaitely
68e442 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   removeDrive = TRUE;
6c8a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
906560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
b7c4dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
2231b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
fd9260 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Always remove the drive when unmounted by
c0e3e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // a background app.
ec9474 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   removeDrive = TRUE;¤
476560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
fb5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
a97f8b ¤   ¤   ¤   ¤   ¤   ¤   else
3206b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
af0367 ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Unmounting process no longer exists. Remove
9ff3a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   // the drive
bd27af ¤   ¤   ¤   ¤   ¤   ¤   ¤   removeDrive = TRUE;
f95268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
b0db3c ¤   ¤   ¤   ¤   ¤   ¤   }
471c89 ¤   ¤   ¤   ¤   ¤   }
--9329 00059bcbefb40120036 Page 5 of CDriver.cp
e0af5a
ba78c0 ¤   ¤   ¤   ¤   if( removeDrive )
9c4859 ¤   ¤   ¤   ¤   ¤   {
821d80 ¤   ¤   ¤   ¤   ¤   CDriveList::sGetList()->RemoveDrive( drive );
9eae30 ¤   ¤   ¤   ¤   ¤
a92df8 ¤   ¤   ¤   ¤   ¤   delete drive;
2d2ec7 ¤   ¤   ¤   ¤   ¤   // play sound here?
72ae30 ¤   ¤   ¤   ¤   ¤
40bf14 ¤   ¤   ¤   ¤   ¤   continue;¤  // don't increment counter
f91c89 ¤   ¤   ¤   ¤   ¤   }
822613 ¤   ¤   ¤   ¤   }
66bb8c ¤   ¤   ¤   else
a272c3 ¤   ¤   ¤   ¤   {
c409ee ¤   ¤   ¤   ¤   drive->SetHasBeenMounted( );
aa2613 ¤   ¤   ¤   ¤   }
f82b85 ¤   ¤   ¤   ¤
84e50e ¤   ¤   ¤   ++driveIndex;
68a3a6 ¤   ¤   ¤   }
2f1b52 ¤   ¤
e126a1 ¤   ¤   if ( driveList->GetNumDrives() == 0 )
4af776 ¤   ¤   ¤   {
45058f ¤   ¤   ¤   NoDrivesLeft();
59a3a6 ¤   ¤   ¤   }
3a0fe4 ¤   ¤   }
859371 ¤   }
2aaf5a
a7af5a
9b6d52 ¤   void
eada7f CDriver::UnmountAnyIdleDrives( ·)
87c7a1 ¤   {
526e22 ¤   static ulong¤   sLastTryTime¤   ¤   = 0;
d0d605 ¤   const ulong¤¤   kTryIntervalSeconds¤= 60;
0f8adc ¤   ulong¤  ¤   ¤   now;
b567c5 ¤
e63248 ¤   GetDateTime( &now );
a067c5 ¤
0eb54a ¤   // attempt to unmount no more often than 'kTryIntervalSeconds'
2c4e51 ¤   if( mPrefs.unmountAfterIdleTime &&
193402 ¤   ¤   ( now - sLastTryTime ) >= kTryIntervalSeconds )
c55b34 ¤   ¤   {
64dea0 ¤   ¤   CDriveList *¤   driveList¤  = CDriveList::sGetList();
c701ff ¤   ¤   ushort¤ ¤   ¤   numDrives;
671b52 ¤   ¤
54dedf ¤   ¤   numDrives¤  = driveList->GetNumDrives();
3b87c7 ¤   ¤   ¤
6e7ecf ¤   ¤   for( ushort driveIndex = 0; driveIndex < numDrives; ++driveIndex )
e3f776 ¤   ¤   ¤   {
04a7d4 ¤   ¤   ¤   CDrive *¤   ¤   drive;
b287c7 ¤   ¤   ¤
31098c ¤   ¤   ¤   drive¤  = driveList->GetIndDrive( driveIndex );
da87c7 ¤   ¤   ¤
e95348 ¤   ¤   ¤   if( now > ( drive->GetLastAccessTime() +
b70891 ¤   ¤   ¤   ¤   ¤   mPrefs.unmountIdleTimeSeconds ) )
6d72c3 ¤   ¤   ¤   ¤   {
e015a9 ¤   ¤   ¤   ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
5c0bd7 ¤   ¤   ¤   ¤   ProcessSerialNumber¤noProcessPSN;
4e2b85 ¤   ¤   ¤   ¤
2015dc ¤   ¤   ¤   ¤   pgpDebugPStr(
a3371f ¤   ¤   ¤   ¤   ¤   "\pDrivePeriodic: calling UnmountAndEjectDrive;g");
7ebd98 ¤   ¤   ¤   ¤   (void)UnmountAndEjectDrive( drive->GetDriveNumber() );
962b85 ¤   ¤   ¤   ¤
564684 ¤   ¤   ¤   ¤   noProcessPSN.highLongOfPSN¤ = 0;
5e2100 ¤   ¤   ¤   ¤   noProcessPSN.lowLongOfPSN¤  = kNoProcess;
db2b85 ¤   ¤   ¤   ¤
c5fcb0 ¤   ¤   ¤   ¤   drive->SetUnmountedAppPSN( noProcessPSN );
332613 ¤   ¤   ¤   ¤   }
5fa3a6 ¤   ¤   ¤   }
2f1b52 ¤   ¤
9bc207 ¤   ¤   sLastTryTime¤   = now;
5b0fe4 ¤   ¤   }
839371 ¤   }
5967c5 ¤
--36c9 000ea4acddb40120036 Page 6 of CDriver.cp
2a67c5 ¤
e567c5 ¤
546d52 ¤   void
51080d CDriver::DrivePeriodic( )
49c7a1 ¤   {
b73ca0 ¤   CDriveList *¤   driveList¤  = CDriveList::sGetList();
6967c5 ¤
737c06 ¤   if ( IsntNull( driveList ) )
ce5b34 ¤   ¤   {
76ca1d ¤   ¤   ushort numDrives¤   = driveList->GetNumDrives();
641b52 ¤   ¤
207ecf ¤   ¤   for( ushort driveIndex = 0; driveIndex < numDrives; ++driveIndex )
b1f776 ¤   ¤   ¤   {
897c03 ¤   ¤   ¤   CDrive *¤   drive;
a687c7 ¤   ¤   ¤
92098c ¤   ¤   ¤   drive¤  = driveList->GetIndDrive( driveIndex );
9687c7 ¤   ¤   ¤
86f957 ¤   ¤   ¤   drive->CheckBaseDriveEjected( mEjectStringTemplate );
aeaf5a
e52af3 ¤   ¤   ¤   if ( IsNull( drive->GetVCB() ) && drive->HasBeenMounted() )
2e72c3 ¤   ¤   ¤   ¤   {
f11d7b ¤   ¤   ¤   ¤   const VCB *¤vcb;
222b85 ¤   ¤   ¤   ¤
115a6f ¤   ¤   ¤   ¤   vcb¤= GetVCBForDrive( drive->GetDriveNumber() );
b50a82 ¤   ¤   ¤   ¤   // could be nil if drive is being created, or was unmounted
fd2730 ¤   ¤   ¤   ¤   drive->SetVCB( vcb );
592613 ¤   ¤   ¤   ¤   }
0887c7 ¤   ¤   ¤
714426 ¤   ¤   ¤   drive->UpdateFileModificationDate();
62a3a6 ¤   ¤   ¤   }
670fe4 ¤   ¤   }
269371 ¤   }
6b67c5 ¤
0d67c5 ¤
e06d52 ¤   void
c9f645 CDriver::HandleToggleKeyBitsCC( void )
47c7a1 ¤   {
103ca0 ¤   CDriveList *¤   driveList¤  = CDriveList::sGetList();
9967c5 ¤
6b7c06 ¤   if ( IsntNull( driveList ) )
fa5b34 ¤   ¤   {
29ca1d ¤   ¤   ushort numDrives¤   = driveList->GetNumDrives();
511b52 ¤   ¤
407ecf ¤   ¤   for( ushort driveIndex = 0; driveIndex < numDrives; ++driveIndex )
56f776 ¤   ¤   ¤   {
f27c03 ¤   ¤   ¤   CDrive *¤   drive;
7687c7 ¤   ¤   ¤
1e098c ¤   ¤   ¤   drive¤  = driveList->GetIndDrive( driveIndex );
a81954 ¤   ¤   ¤   drive->ToggleKeyBits();
0ba3a6 ¤   ¤   ¤   }
db0fe4 ¤   ¤   }
ce9371 ¤   }
8367c5 ¤
1267c5 ¤
c87bbe /*_________________________________________________________________________
4c7cb5 ¤   Caution:
a78226 ¤   ¤   AccRuns are made via immediate control calls. The driver could start
145d20 ¤   doing I/O while AccRun() is executing or it could already be doing I/O.
cb8ac7 _________________________________________________________________________*/
036d52 ¤   void
b670ea CDriver::AccRun()
e0c7a1 ¤   {
eb6920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
333ca0 ¤   CDriveList *¤   driveList¤  = CDriveList::sGetList();
6b8adc ¤   ulong¤  ¤   ¤   now;
da67c5 ¤
4aeec7 ¤   // Call the gestalt idle proc to install patches in this context,
b4fbff ¤   // if necessary
45d469 ¤   if( IsntNull( mPGPDiskGlobals->idleProc ) )
3e5b34 ¤   ¤   {
c6529e ¤   ¤   (*mPGPDiskGlobals->idleProc)();
ea0fe4 ¤   ¤   }
--611d 000eec3c6e040120036 Page 7 of CDriver.cp
f11b52 ¤   ¤
b80c00 ¤   UnmountAnyIdleDrives();
1767c5 ¤
1c5410 ¤   // be sure to do this first, since drives may be deleted
ee6e66 ¤   DriveHousekeeping();
5d67c5 ¤
bcf377 ¤   DrivePeriodic();
0f67c5 ¤
fd67c5 ¤
d93248 ¤   GetDateTime( &now );
1367c5 ¤
a248f6 ¤   // CAUTION: toggling key bits must be serialized with I/O; we can't
896931 ¤   // allow I/O to be processed while toggling a key. So we have to make
31c167 ¤   // a synchronous control call to do it.
7129c6 ¤   static ulong¤   sLastToggleTime¤= 0;
232ecc ¤   const ulong¤¤   kToggleTimeSeconds¤ = 5 * 60;
94ae4e ¤   if ( now - sLastToggleTime >= kToggleTimeSeconds )
455b34 ¤   ¤   {
3ad8ab ¤   ¤   ParamBlockRec¤  pb;
2a1b52 ¤   ¤
a9df48 ¤   ¤   pb.cntrlParam.ioVRefNum¤= 0;
8f69c4 ¤   ¤   pb.cntrlParam.ioCRefNum¤= mDCE->dCtlRefNum;
ce727b ¤   ¤   pb.cntrlParam.csCode¤   = kToggleKeyBitsCC;
405e75 ¤   ¤   (void)PBControlSync( &pb );
521b52 ¤   ¤
98deae ¤   ¤   GetDateTime( &sLastToggleTime );
c70fe4 ¤   ¤   }
8367c5 ¤
a267c5 ¤
7ab786 ¤   // periodically verify that the cipher proc is not damaged.
896ed0 ¤   // This is to avoid data loss; a single bit flipped in the S-boxes
540f46 ¤   // will damage any data subsequently ciphered.
5782df ¤   static ulong¤   sLastVerifyTime¤¤   ¤   = 0;
3f1070 ¤   const ulong¤¤   kVerifyIntervalSeconds¤ = 5 * 60;
10b258 ¤   if ( now - sLastVerifyTime >= kVerifyIntervalSeconds )
e95b34 ¤   ¤   {
098af8 ¤   ¤   if ( mCipherProcRef != kInvalidCipherProcRef )
0df776 ¤   ¤   ¤   {
9f58ec ¤   ¤   ¤   if ( IsErr( CipherProc_CallVerify( mCipherProcRef ) ) )
2672c3 ¤   ¤   ¤   ¤   {
fffb35 ¤   ¤   ¤   ¤   mCipherProcDamaged¤ = TRUE;
302613 ¤   ¤   ¤   ¤   }
f3a3a6 ¤   ¤   ¤   }
2787c7 ¤   ¤   ¤
c057b2 ¤   ¤   GetDateTime( &sLastVerifyTime );
8a0fe4 ¤   ¤   }
d367c5 ¤
1a67c5 ¤
909b48 #if USE_LOG
de5d31 ¤   gLog->Flush();
147454 #endif
a19371 ¤   }
19af5a
39af5a
d5af5a
986d52 ¤   void
f511b2 CDriver::InstallSleepProc( void )
0bc7a1 ¤   {
f033e2 ¤   if( PowerMgrExists() && ! mSleep.installed)
225b34 ¤   ¤   {
157a95 ¤   ¤   mSleep.sleepQRec.sleepQLink¤¤   = nil;
3b488b ¤   ¤   mSleep.sleepQRec.sleepQType¤¤   = slpQType;
03bc0e ¤   ¤   mSleep.sleepQRec.sleepQProc¤¤   = (SleepQUPP)sSleepDismount;
9bdd63 ¤   ¤   mSleep.sleepQRec.sleepQFlags¤   = 0;
eceb9c ¤   ¤   SleepQInstall( & mSleep.sleepQRec );
2e7af1 ¤   ¤   mSleep.installed¤   ¤   = TRUE;
760fe4 ¤   ¤   }
d79371 ¤   }
7f67c5 ¤
4a67c5 ¤
5067c5 ¤
ee6d52 ¤   void
--a0d3 000c739b80840120036 Page 8 of CDriver.cp
20cffb CDriver::RemoveSleepProc( void )
bbc7a1 ¤   {
e60d52 ¤   if ( mSleep.installed )
da5b34 ¤   ¤   {
3d68e8 ¤   ¤   SleepQRemove( & mSleep.sleepQRec );
55ef28 ¤   ¤   mSleep.installed¤   = false;
7c0fe4 ¤   ¤   }
989371 ¤   }
0667c5 ¤
b8af5a
456d52 ¤   void
5c6962 CDriver::InstallOrRemoveSleepProcAsAppropriate()
e2c7a1 ¤   {
8a91d5 ¤   pgpAssert( IsntNull( CDriveList::sGetList() ) );
a167c5 ¤
66aa93 ¤   ushort¤ numDrives¤  = CDriveList::sGetList()->GetNumDrives();
aa67c5 ¤
fa44ff ¤   if( mPrefs.unmountDrivesOnPBSleep &&
9a32df ¤   ¤   PowerMgrExists() &&
49aa49 ¤   ¤   numDrives != 0)
385b34 ¤   ¤   {
0b63f7 ¤   ¤   InstallSleepProc();
220fe4 ¤   ¤   }
9a0e24 ¤   else
ab5b34 ¤   ¤   {
56d49c ¤   ¤   RemoveSleepProc();
ec0fe4 ¤   ¤   }
759371 ¤   }
9767c5 ¤
1067c5 ¤
e36d52 ¤   void
324937 CDriver::HandleSetPrefsCC( const PGPDiskDriverPrefs *¤  newPrefs)
67c7a1 ¤   {
3010d8 ¤   pgpAssertAddrValid( newPrefs, PGPDiskDriverPrefs );
6e67c5 ¤
193cf3 ¤   mPrefs¤ = *newPrefs;
0167c5 ¤
e02f52 ¤   InstallOrRemoveSleepProcAsAppropriate();
b29371 ¤   }
8caf5a
4faf5a
f5eacd ¤   OSErr
844c0f CDriver::HandleDriveUnmountedCC(const PGPDriveUnmountedStruct *info)
a4c7a1 ¤   {
6d3ca0 ¤   CDriveList *¤   driveList¤  = CDriveList::sGetList();
056920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
4a67c5 ¤
de6833 ¤   pgpAssertAddrValid( info, PGPDriveUnmountedStruct );
02af5a
797c06 ¤   if ( IsntNull( driveList ) )
bc5b34 ¤   ¤   {
823a16 ¤   ¤   CDrive *drive = driveList->GetDriveForDriveNumber(info->driveNumber);
7f1b52 ¤   ¤
02c414 ¤   ¤   if ( IsntNull( drive ) )
84f776 ¤   ¤   ¤   {
13bf27 ¤   ¤   ¤   drive->SetUnmountedAppPSN( info->unmountingProcess );
66a3a6 ¤   ¤   ¤   }
190e1d ¤   ¤   else
29f776 ¤   ¤   ¤   {
e759c2 ¤   ¤   ¤   pgpDebugPStr( "\pHandleDriveUnmountedCC: no such drive" );
2bfaaa ¤   ¤   ¤   err¤= nsDrvErr;
33a3a6 ¤   ¤   ¤   }
230fe4 ¤   ¤   }
9c1b52 ¤   ¤
3d5b5f ¤   return( err );¤
969371 ¤   }
80af5a
2aaf5a
e5eacd ¤   OSErr
e6aa8c CDriver::HandleChangeIOOptionsCC( const IOOptionsStruct¤*options)
9bc7a1 ¤   {
c76920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
--ca9d 0007d9ca9b740120036 Page 9 of CDriver.cp
793f83 ¤   CDrive *¤   ¤   drive;
40af5a
063da2 ¤   drive = CDriveList::sGetList()->GetDriveForDriveNumber(
2f1f29 ¤   ¤   ¤   ¤   ¤   options->driveNumber );
ea67c5 ¤
f87f42 ¤   if ( IsntNull( drive ) )
c05b34 ¤   ¤   {
a9c79a ¤   ¤   if ( options->tunerType == IOOptionsStruct::kReadTuner )
57f776 ¤   ¤   ¤   {
f9f161 ¤   ¤   ¤   drive->SetReadTuner( &options->tuner );
7da3a6 ¤   ¤   ¤   }
256fea ¤   ¤   else if ( options->tunerType == IOOptionsStruct::kWriteTuner )
94f776 ¤   ¤   ¤   {
9d7d4e ¤   ¤   ¤   drive->SetWriteTuner( &options->tuner );
28a3a6 ¤   ¤   ¤   }
240e1d ¤   ¤   else
50f776 ¤   ¤   ¤   {
d44f66 ¤   ¤   ¤   err¤= paramErr;
30a3a6 ¤   ¤   ¤   }
fb0fe4 ¤   ¤   }
670e24 ¤   else
be5b34 ¤   ¤   {
a6b903 ¤   ¤   err¤= paramErr;
780fe4 ¤   ¤   }
6067c5 ¤
c11292 ¤   AssertNoErr( err, "CDriver::HandleChangeIOOptionsCC" );
b5deb7 ¤   return( err );
e39371 ¤   }
b267c5 ¤
7c67c5 ¤
36af5a
faaf5a
a9dc29 struct DriverGestaltVersResponse
eebb36 {
cb47ff ¤   NumVersion driverVersion;
8c82f7 };
cc7b76 typedef struct DriverGestaltVersResponse DriverGestaltVersResponse;
00af5a
a568ac struct DriverGestaltWideResponse
b0bb36 {
ae403d ¤   Boolean¤ supportsIOWPosOffset;
9782f7 };
baa0b5 typedef struct DriverGestaltWideResponse DriverGestaltWideResponse;
eeaf5a
2caf5a
a1af5a
de38e5 /*
00cfa4 ¤   The DriverGestaltVMOptionsResponse is returned by a disk driver in
c764ce ¤   response to a kdgVMOptions Driver Gestalt request. This allows a disk
3e8159 ¤   driver to tell VM a few things about a disk drive. For example:
d8af5a
bda44e ¤   * A drive that should never be in the page fault path should return
889785 ¤   ¤   kAllowVMNoneMask. Examples of this are drives that have manual
c5a11c ¤   ¤   eject buttons that are not disabled by software, drives with very slow
f88514 ¤   ¤   throughput, or drives that depend on a network connection.
771b52 ¤   ¤
45e293 ¤   * A drive that should never be written to but is safe for read-only file
e08578 ¤   ¤   mapping should return kAllowVMReadOnlyMask. Examples of this are WORM
10d477 ¤   ¤   drives where each write eats write-once space on the disk and CD-ROM
2301b8 ¤   ¤   drives which are read-only media.
531b52 ¤   ¤
05f362 ¤   * A drive that should allow VM to create its main backing store
922625 ¤   ¤   file should return kAllowVMReadWriteMask. Examples of this are fast
c2e831 ¤   ¤   read/write drives that don't allow manual eject and don't use a network
21b647 ¤   ¤   connection.
92af5a
99956d ¤   A disk driver must look at the ioVRefNum field of the DriverGestaltParam
da7146 ¤   to determine what disk drive this call is for. This is a per-drive call,
69996e ¤   not a per-driver call.
09af5a
4daeb2 ¤   The only three valid responses to kdgVMOptions at this time are
7d49c5 ¤   kAllowVMNoneMask, kAllowVMReadOnlyMask, and kAllowVMReadWriteMask
--f176 000a360569640120036 Page 10 of CDriver.cp
6d3fe1 ¤   (i.e., setting only kAllowVMWriteBit is not valid).
0caf5a
ca9425 ¤   Important: All bits not defined here are reserved and should be set
600a13 ¤   to zero until they are defined for a specific purpose.
1d7fe0 */
c8af5a
d9af5a
62eacd ¤   OSErr
83631c CDriver::HandleDriverGestalt( DriverGestaltParam *pb )
22c7a1 ¤   {
417eaa ¤   OSErr¤  err¤= statusErr;
c569df ¤   void *¤ responseBytes¤  = &pb->driverGestaltResponse;
1367c5 ¤
a79b86 ¤   switch( pb->driverGestaltSelector )
fc5b34 ¤   ¤   {
eb9ae3 ¤   ¤   default:
2ecdcb ¤   ¤   ¤   break;
2687c7 ¤   ¤   ¤
bd56e8 ¤   ¤   case kdgVersion:
49f776 ¤   ¤   ¤   {
4fb52c ¤   ¤   ¤   DriverGestaltVersResponse *response;
9887c7 ¤   ¤   ¤
99af53 ¤   ¤   ¤   response = (DriverGestaltVersResponse *)responseBytes;
a5af5a
1e6508 ¤   ¤   ¤   response->driverVersion.majorRev =
864c7a ¤   ¤   ¤   ¤   ¤   kPGPDiskDriverVersion >> 8;
93b862 ¤   ¤   ¤   response->driverVersion.minorAndBugRev =
5fcc2d ¤   ¤   ¤   ¤   ¤   kPGPDiskDriverVersion & 0xFF;
fa3b4a ¤   ¤   ¤   response->driverVersion.stage = finalStage;
d511de ¤   ¤   ¤   response->driverVersion.nonRelRev = 0;
d7c7c1 ¤   ¤   ¤   err¤= noErr;
6bcdcb ¤   ¤   ¤   break;
e7a3a6 ¤   ¤   ¤   }
0787c7 ¤   ¤   ¤
b85337 ¤   ¤   case kdgDeviceType:¤// this one is called frequently
f5f776 ¤   ¤   ¤   {
0e7305 ¤   ¤   ¤   DriverGestaltDevTResponse *response;
5787c7 ¤   ¤   ¤
4a7faf ¤   ¤   ¤   response = (DriverGestaltDevTResponse *)responseBytes;
6baf5a
b41160 ¤   ¤   ¤   response->deviceType¤   = kdgFileType;
2fc7c1 ¤   ¤   ¤   err¤= noErr;
8dcdcb ¤   ¤   ¤   break;
8fa3a6 ¤   ¤   ¤   }
9d87c7 ¤   ¤   ¤
da40dc ¤   ¤   case kdgSync:
baf776 ¤   ¤   ¤   {
927219 ¤   ¤   ¤   DriverGestaltSyncResponse *response;
3187c7 ¤   ¤   ¤
d407af ¤   ¤   ¤   response = (DriverGestaltSyncResponse *)responseBytes;
f3af5a
19ed47 ¤   ¤   ¤   response->behavesSynchronously¤ = false;
84c7c1 ¤   ¤   ¤   err¤= noErr;
5acdcb ¤   ¤   ¤   break;
ada3a6 ¤   ¤   ¤   }
5b87c7 ¤   ¤   ¤
e589c6 ¤   ¤   case kdgInterface:
d1f776 ¤   ¤   ¤   {
e9fc62 ¤   ¤   ¤   DriverGestaltIntfResponse *response;
5887c7 ¤   ¤   ¤
190466 ¤   ¤   ¤   response = (DriverGestaltIntfResponse *)responseBytes;
f0af5a
8ce0e7 ¤   ¤   ¤   response->interfaceType¤= 'pgpD';
15c7c1 ¤   ¤   ¤   err¤= noErr;
38cdcb ¤   ¤   ¤   break;
35a3a6 ¤   ¤   ¤   }
5787c7 ¤   ¤   ¤
e4ee47 ¤   ¤   case kdgWide:
18f776 ¤   ¤   ¤   {
84407e ¤   ¤   ¤   DriverGestaltWideResponse *response;
2687c7 ¤   ¤   ¤
a35e96 ¤   ¤   ¤   response = (DriverGestaltWideResponse *)responseBytes;
--b45c 000444b4a2a40120036 Page 11 of CDriver.cp
e587c7 ¤   ¤   ¤
fbb35b ¤   ¤   ¤   response->supportsIOWPosOffset¤ = TRUE;
2bc7c1 ¤   ¤   ¤   err¤= noErr;
87cdcb ¤   ¤   ¤   break;
0aa3a6 ¤   ¤   ¤   }
f387c7 ¤   ¤   ¤
b68d55 ¤   ¤   case kdgVMOptions:
15f776 ¤   ¤   ¤   {
f316b8 ¤   ¤   ¤   DriverGestaltVMOptionsResponse *response;
7faf5a
2832be ¤   ¤   ¤   response = (DriverGestaltVMOptionsResponse *)responseBytes;
d4af5a
2d67f1 ¤   ¤   ¤   response->vmOptions¤= kAllowVMNoneMask;
dcc7c1 ¤   ¤   ¤   err¤= noErr;
e8cdcb ¤   ¤   ¤   break;
29a3a6 ¤   ¤   ¤   }
6c0fe4 ¤   ¤   }
a067c5 ¤
aadeb7 ¤   return( err );
5d9371 ¤   }
0367c5 ¤
e667c5 ¤
a7eacd ¤   OSErr
f70dce CDriver::HandleDriverConfigure( ParamBlockRec *pb )
e6c7a1 ¤   {
a2c77d ¤   OSErr¤  err¤= controlErr;
d167c5 ¤
51d45c ¤   // there's nothing we support
d9844f ¤   pb¤ = pb;
b767c5 ¤
efdeb7 ¤   return( err );
229371 ¤   }
1e67c5 ¤
5b67c5 ¤
737bbe /*_________________________________________________________________________
1b6d1b ¤   Our drive has been ejected *or* unmounted. ·We may get this call even for
f969fc ¤   an unmount in the Finder because we set the 'kDriveInDriveMask' flag.
0967c5 ¤
f5e557 ¤   With VM on, we have to mark our drives as ejectable so that they won't
7593c7 ¤   be asked to service a page fault.
3f8ac7 _________________________________________________________________________*/
b3eacd ¤   OSErr
93396e CDriver::HandleEjectDiskCC( CDrive *theDrive )
bdc7a1 ¤   {
6a38bd ¤   OSErr¤  ¤   ¤   ¤   ¤   err¤= controlErr;
6867c5 ¤
cb489d ¤   CDrive::sAssertValid( theDrive );
2987c7 ¤   ¤   ¤
b6c562 ¤   VCB *¤  vcb¤= (VCB *)theDrive->GetVCB();
e267c5 ¤
5daa86 ¤   if ( IsntNull( vcb ) )
655b34 ¤   ¤   {
4e09bf ¤   ¤   // before accessing it, verify that it's still in the VCB list;
bea3be ¤   ¤   // it may have been destroyed if the drive was unmounted versus
9cfbf6 ¤   ¤   // just being ejected.
ca3d7c ¤   ¤   Boolean¤¤   ¤   stillInQueue¤   = false;
881fca ¤   ¤   const VCB *¤¤   curVCB¤ ¤   ¤   = (const VCB ·*)(GetVCBQHdr()->qHead);
641b52 ¤   ¤
e4f825 ¤   ¤   while ( IsntNull( curVCB ) )
33f776 ¤   ¤   ¤   {
c5a96c ¤   ¤   ¤   if ( curVCB == vcb )
5a72c3 ¤   ¤   ¤   ¤   {
fcdafd ¤   ¤   ¤   ¤   stillInQueue¤   = TRUE;
48f622 ¤   ¤   ¤   ¤   break;
dd2613 ¤   ¤   ¤   ¤   }
9bb19f ¤   ¤   ¤   curVCB¤ = (const VCB *)curVCB->qLink;
eba3a6 ¤   ¤   ¤   }
f01b52 ¤   ¤
3720b0 ¤   ¤   if ( stillInQueue )
e9f776 ¤   ¤   ¤   {
162e4f ¤   ¤   ¤   // undo the effects of Eject
448f47 ¤   ¤   ¤   vcb->vcbDrvNum¤ = theDrive->GetDriveNumber();
--f8fe 000ec14eeb140120036 Page 12 of CDriver.cp
6cf62c ¤   ¤   ¤   vcb->vcbDRefNum¤= mDCE->dCtlRefNum;
7287c7 ¤   ¤   ¤
414a03 ¤   ¤   ¤   pgpAssert(IsntNull(GetDriveQElem(theDrive->GetDriveNumber())));
13a3a6 ¤   ¤   ¤   }
f20fe4 ¤   ¤   }
ae0e24 ¤   else
5fc7a1 ¤   {
c2294a ¤   ¤   pgpDebugPStr( "\pCDriver::HandleEjectDiskCC: no vcb" );
8b9371 ¤   }
7267c5 ¤
2779ad ¤   return( noErr );
2f9371 ¤   }
fc67c5 ¤
0967c5 ¤
b9eacd ¤   OSErr
6ab9a2 CDriver::HandleRemoveDriveCC( short¤driveNumber )
c8c7a1 ¤   {
233ca0 ¤   CDriveList *¤   driveList¤  = CDriveList::sGetList();
766920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
a667c5 ¤
847c06 ¤   if ( IsntNull( driveList ) )
045b34 ¤   ¤   {
3fbd0b ¤   ¤   CDrive *¤   drive¤  = driveList->GetDriveForDriveNumber( driveNumber );
db1b52 ¤   ¤
21c414 ¤   ¤   if ( IsntNull( drive ) )
46f776 ¤   ¤   ¤   {
d39c88 ¤   ¤   ¤   pgpDebugPStr(
1a8cb3 ¤   ¤   ¤   ¤   "\pHandleRemoveDriveCC: removing drive from list and deleting");
6e185e ¤   ¤   ¤   driveList->RemoveDrive( drive );
4693a4 ¤   ¤   ¤   delete drive;
51c351 ¤   ¤   ¤   drive¤  = nil;
19a3a6 ¤   ¤   ¤   }
f80e1d ¤   ¤   else
0df776 ¤   ¤   ¤   {
a9b7c7 ¤   ¤   ¤   pgpDebugPStr( "\pHandleRemoveDriveCC: no such drive" );
39faaa ¤   ¤   ¤   err¤= nsDrvErr;
f4a3a6 ¤   ¤   ¤   }
030fe4 ¤   ¤   }
78deb7 ¤   return( err );
f39371 ¤   }
d1af5a
a367c5 ¤
39eacd ¤   OSErr
acaebe CDriver::HandleOtherCC( ParamBlockRec *¤pb)
b0c7a1 ¤   {
0d51b4 ¤   OSErr¤  ¤   ¤   err¤= controlErr;
4ee44d ¤   const short¤¤   csCode¤ = pb->cntrlParam.csCode;
b40580 ¤   const short¤¤   driveNumber¤= pb->cntrlParam.ioVRefNum;
f9765a ¤   CDrive *¤   ¤   drive¤  = nil;
7667c5 ¤
76cc8b ¤   // for those cases that require it, get the drive
39e629 ¤   switch( csCode )
705b34 ¤   ¤   {
349ae3 ¤   ¤   default:
b7c351 ¤   ¤   ¤   drive¤  = nil;
aacdcb ¤   ¤   ¤   break;
ff1b52 ¤   ¤
c79f2c ¤   ¤   case verifyDiskCC:
61f8bb ¤   ¤   case formatDiskCC:
51374f ¤   ¤   case physicalIconCC:
580cb7 ¤   ¤   case mediaIconCC:
07444f ¤   ¤   case driveInfoCC:
07ae83 ¤   ¤   case getDriveSizeCC:
25f0d2 ¤   ¤   ¤   drive¤  = CDriveList::sGetList()->GetDriveForDriveNumber(
b7ae6b ¤   ¤   ¤   ¤   ¤   ¤   driveNumber );
275bf6 ¤   ¤   ¤   CDrive::sAssertValid( drive );
4bcdcb ¤   ¤   ¤   break;
c20fe4 ¤   ¤   }
7467c5 ¤
4f67c5 ¤
70e629 ¤   switch( csCode )
ec5b34 ¤   ¤   {
--5559 0000e8a287940120036 Page 13 of CDriver.cp
d39ae3 ¤   ¤   default:
9fbfc3 ¤   ¤   ¤   pgpDebugFmtMsg( ( pgpaFmtPrefix,
5e3718 ¤   ¤   ¤   ¤   ¤   "HandleOtherCC: Unrecognized control call %ld",
6e3095 ¤   ¤   ¤   ¤   ¤   (long)csCode) );
fd7d69 ¤   ¤   ¤   err¤= controlErr;
09cdcb ¤   ¤   ¤   break;
ba1b52 ¤   ¤
01464b ¤   ¤   case ejectDiskCC:
5ff776 ¤   ¤   ¤   {
2732f9 ¤   ¤   ¤   short¤  ·driveNumber¤   = pb->cntrlParam.ioVRefNum;
9c87c7 ¤   ¤   ¤
3805dc ¤   ¤   ¤   // depending on the context, it could be the drive number or its
b9d2ba ¤   ¤   ¤   // negative
e7f0d2 ¤   ¤   ¤   drive¤  = CDriveList::sGetList()->GetDriveForDriveNumber(
813bbf ¤   ¤   ¤   ¤   ¤   ¤   ¤   driveNumber < 0 ? -driveNumber : driveNumber );
7f5bf6 ¤   ¤   ¤   CDrive::sAssertValid( drive );
f187c7 ¤   ¤   ¤
d1f97c ¤   ¤   ¤   if ( IsntNull( drive ) )
7c72c3 ¤   ¤   ¤   ¤   {
3585d2 ¤   ¤   ¤   ¤   err¤= HandleEjectDiskCC( drive );
fe2613 ¤   ¤   ¤   ¤   }
63cdcb ¤   ¤   ¤   break;
67a3a6 ¤   ¤   ¤   }
2267c5 ¤
bf3a80 ¤   ¤   case kDriverConfigureCode:
14c5e9 ¤   ¤   ¤   err¤= HandleDriverConfigure( pb );
07cdcb ¤   ¤   ¤   break;
5f87c7 ¤   ¤   ¤
08ccb0 ¤   ¤   case kAddDriveCC:
76f776 ¤   ¤   ¤   {
5cd058 ¤   ¤   ¤   CSystemZoneSetter¤  setter;
530e3e ¤   ¤   ¤   AddDriveStruct *¤   addInfo;
a787c7 ¤   ¤   ¤
b96a4f ¤   ¤   ¤   err¤= ExtractFromCSParam( pb, &addInfo, sizeof( addInfo ) );
0ce090 ¤   ¤   ¤   if ( IsntErr( err ) )
d572c3 ¤   ¤   ¤   ¤   {
1ddb17 ¤   ¤   ¤   ¤   err¤= HandleAddDriveCC( addInfo );
ee93f0 ¤   ¤   ¤   ¤   MarkCSParamUnderstood( pb );
7c2613 ¤   ¤   ¤   ¤   }
d8cdcb ¤   ¤   ¤   break;
ffa3a6 ¤   ¤   ¤   }
4587c7 ¤   ¤   ¤
50e093 ¤   ¤   case kSetPrefsCC:
ecf776 ¤   ¤   ¤   {
e85c79 ¤   ¤   ¤   PGPDiskDriverPrefs *¤   prefs;
9287c7 ¤   ¤   ¤
9cca4c ¤   ¤   ¤   err¤= ExtractFromCSParam( pb, &prefs, sizeof( prefs ) );
46e090 ¤   ¤   ¤   if ( IsntErr( err ) )
f772c3 ¤   ¤   ¤   ¤   {
d345b3 ¤   ¤   ¤   ¤   HandleSetPrefsCC( prefs );
dd93f0 ¤   ¤   ¤   ¤   MarkCSParamUnderstood( pb );
cb2613 ¤   ¤   ¤   ¤   }
46cdcb ¤   ¤   ¤   break;
41a3a6 ¤   ¤   ¤   }
ef1b52 ¤   ¤
2814dd ¤   ¤   case kRemoveDriveCC:
f7f776 ¤   ¤   ¤   {
429b00 ¤   ¤   ¤   long¤   driveNumber;¤   // yes, a long
7787c7 ¤   ¤   ¤
2df4af ¤   ¤   ¤   err¤= ExtractFromCSParam( pb, &driveNumber,
fcf22e ¤   ¤   ¤   ¤   ¤   ¤   sizeof( driveNumber ) );
02e090 ¤   ¤   ¤   if ( IsntErr( err ) )
ce72c3 ¤   ¤   ¤   ¤   {
642308 ¤   ¤   ¤   ¤   err¤= HandleRemoveDriveCC( (short)driveNumber );
6893f0 ¤   ¤   ¤   ¤   MarkCSParamUnderstood( pb );
832613 ¤   ¤   ¤   ¤   }
07cdcb ¤   ¤   ¤   break;
3ea3a6 ¤   ¤   ¤   }
3187c7 ¤   ¤   ¤
5dc300 ¤   ¤   case kChangeWriteBufferSizeCC:
f7f776 ¤   ¤   ¤   {
0e5c3c ¤   ¤   ¤   ulong¤  newBufferSize;
--6cb1 00002969abb40120036 Page 14 of CDriver.cp
e587c7 ¤   ¤   ¤
178159 ¤   ¤   ¤   pgpAssert( ! PBIsAsync( pb ) );
ee87c7 ¤   ¤   ¤
fb76d4 ¤   ¤   ¤   err¤= ExtractFromCSParam( pb, &newBufferSize,
daa4de ¤   ¤   ¤   ¤   ¤   ¤   sizeof( newBufferSize ) );
dde090 ¤   ¤   ¤   if ( IsntErr( err ) )
6872c3 ¤   ¤   ¤   ¤   {
d5235c ¤   ¤   ¤   ¤   err¤= ChangeScratchBufferSize( newBufferSize );
a393f0 ¤   ¤   ¤   ¤   MarkCSParamUnderstood( pb );
4b2613 ¤   ¤   ¤   ¤   }
76cdcb ¤   ¤   ¤   break;
eba3a6 ¤   ¤   ¤   }
6f87c7 ¤   ¤   ¤
e81b52 ¤   ¤
fd4af1 ¤   ¤   case kSetIOOptionsCC:
67f776 ¤   ¤   ¤   {
c73c7c ¤   ¤   ¤   IOOptionsStruct¤*options;
9687c7 ¤   ¤   ¤
208159 ¤   ¤   ¤   pgpAssert( ! PBIsAsync( pb ) );
3887c7 ¤   ¤   ¤
846c26 ¤   ¤   ¤   err¤= ExtractFromCSParam( pb, &options, sizeof( options ) );
dde090 ¤   ¤   ¤   if ( IsntErr( err ) )
e472c3 ¤   ¤   ¤   ¤   {
606fdb ¤   ¤   ¤   ¤   err¤= HandleChangeIOOptionsCC( options );
c693f0 ¤   ¤   ¤   ¤   MarkCSParamUnderstood( pb );
cf2613 ¤   ¤   ¤   ¤   }
d9cdcb ¤   ¤   ¤   break;
e6a3a6 ¤   ¤   ¤   }
0d1b52 ¤   ¤
ffa233 ¤   ¤   case kToggleKeyBitsCC:
fb0dcd ¤   ¤   ¤   HandleToggleKeyBitsCC();
24c7c1 ¤   ¤   ¤   err¤= noErr;
70cdcb ¤   ¤   ¤   break;
ab87c7 ¤   ¤   ¤
9f8afe ¤   ¤   case kDriveUnmountedCC:
7df776 ¤   ¤   ¤   {
4fe267 ¤   ¤   ¤   PGPDriveUnmountedStruct¤*info;
4d87c7 ¤   ¤   ¤
d78159 ¤   ¤   ¤   pgpAssert( ! PBIsAsync( pb ) );
2487c7 ¤   ¤   ¤
18854d ¤   ¤   ¤   err¤= ExtractFromCSParam( pb, &info, sizeof( info ) );
59e090 ¤   ¤   ¤   if ( IsntErr( err ) )
3572c3 ¤   ¤   ¤   ¤   {
123bb4 ¤   ¤   ¤   ¤   err = HandleDriveUnmountedCC( info );
bc93f0 ¤   ¤   ¤   ¤   MarkCSParamUnderstood( pb );
382613 ¤   ¤   ¤   ¤   }
e1cdcb ¤   ¤   ¤   break;
b1a3a6 ¤   ¤   ¤   }
edaf5a
7b5fc9 ¤   ¤   case killIOCC:
3cc021 ¤   ¤   ¤   // we don't support this...return an error
dc7d69 ¤   ¤   ¤   err¤= controlErr;
abcdcb ¤   ¤   ¤   break;
a187c7 ¤   ¤   ¤
5e9f2c ¤   ¤   case verifyDiskCC:
8cd5ab ¤   ¤   ¤   err = noErr;
c9cdcb ¤   ¤   ¤   break;
8887c7 ¤   ¤   ¤
c0f8bb ¤   ¤   case formatDiskCC:
0cd5ab ¤   ¤   ¤   err = noErr;
06cdcb ¤   ¤   ¤   break;
6c87c7 ¤   ¤   ¤
82374f ¤   ¤   case physicalIconCC:
cc715f ¤   ¤   ¤   /* return pointer to icon and where string */
3593fe ¤   ¤   ¤   *(Ptr *) &pb->cntrlParam.csParam[ 0 ] =
033d05 ¤   ¤   ¤   ¤   ¤   (Ptr)drive->GetPhysicalIcon( );
4ad5ab ¤   ¤   ¤   err = noErr;
76cdcb ¤   ¤   ¤   break;
ec87c7 ¤   ¤   ¤
de0cb7 ¤   ¤   case mediaIconCC:
e9715f ¤   ¤   ¤   /* return pointer to icon and where string */
0293fe ¤   ¤   ¤   *(Ptr *) &pb->cntrlParam.csParam[ 0 ] =
--ad07 00021c6523340120036 Page 15 of CDriver.cp
c3d720 ¤   ¤   ¤   ¤   ¤   (Ptr)drive->GetMediaIcon( );
90d5ab ¤   ¤   ¤   err = noErr;
a9cdcb ¤   ¤   ¤   break;
6987c7 ¤   ¤   ¤
bd444f ¤   ¤   case driveInfoCC:
a704e8 ¤   ¤   ¤   // we do NOT want to respond to this
e67d69 ¤   ¤   ¤   err¤= controlErr;
4ccdcb ¤   ¤   ¤   break;
2287c7 ¤   ¤   ¤
9b6ace ¤   ¤   case getDriveSizeCC:¤   /* Return SCSI csCode Partition Size */
8d8f0f ¤   ¤   ¤   *(ulong *)&pb->cntrlParam.csParam[ 0 ] =
93820a ¤   ¤   ¤   ¤   ¤   drive->GetLogicalSizeInBlocks( );
efd5ab ¤   ¤   ¤   err = noErr;
dacdcb ¤   ¤   ¤   break;
7787c7 ¤   ¤   ¤
dc9013 ¤   ¤   case accRun:
73f776 ¤   ¤   ¤   {
7aacba ¤   ¤   ¤   AccRun();
86c7c1 ¤   ¤   ¤   err¤= noErr;
41cdcb ¤   ¤   ¤   break;
02a3a6 ¤   ¤   ¤   }
650fe4 ¤   ¤   }
5c67c5 ¤
a7deb7 ¤   return( err );
939371 ¤   }
44af5a
26af5a
7f67c5 ¤
ee67c5 ¤
241b52 ¤   ¤
86af5a
8baf5a
9967c5 ¤
6567c5 ¤
0467c5 ¤
8ceacd ¤   OSErr
f5a05b CDriver::HandleAddDriveCC( AddDriveStruct *¤addInfo )
6cc7a1 ¤   {
c8b229 ¤   OSErr¤  ¤   ¤   ¤   ¤   err¤= noErr;
0faf5a
8cdb40 ¤   mPrefsSpec¤ = addInfo->prefsSpec;
7f67c5 ¤
5cf8f2 ¤   err¤= SetNumPBs( addInfo->numExtents );
4f5ecc ¤   if ( IsntErr( err ) )
335b34 ¤   ¤   {
4eb976 ¤   ¤   // if this drive is writeable and we don't have a scratch buffer then
a61058 ¤   ¤   // create one.
028ef3 ¤   ¤   if ( (! addInfo->mountReadOnly ) && IsNull( mScratchBuffer ) )
d4f776 ¤   ¤   ¤   {
a36645 ¤   ¤   ¤   ulong¤  desiredSize;
a387c7 ¤   ¤   ¤
2d3781 ¤   ¤   ¤   if ( addInfo->minimizeWriteBufferSize )
c072c3 ¤   ¤   ¤   ¤   {
c8547f ¤   ¤   ¤   ¤   desiredSize¤= kMinScratchBufferSize;
372613 ¤   ¤   ¤   ¤   }
eabb8c ¤   ¤   ¤   else
7972c3 ¤   ¤   ¤   ¤   {
986337 ¤   ¤   ¤   ¤   desiredSize¤= CalcScratchBufferSize();
702613 ¤   ¤   ¤   ¤   }
d587c7 ¤   ¤   ¤
d39c7e ¤   ¤   ¤   err¤= ChangeScratchBufferSize( desiredSize );
4ca3a6 ¤   ¤   ¤   }
ca0fe4 ¤   ¤   }
c21b52 ¤   ¤
a71b52 ¤   ¤
f15ecc ¤   if ( IsntErr( err ) )
dd5b34 ¤   ¤   {
1b429d ¤   ¤   CDrive *¤   ¤   ¤   ¤   newDrive;
daee72 ¤   ¤   CDrive::InitInfo¤   ¤   info;
ba87c7 ¤   ¤   ¤
d68837 ¤   ¤   pgpClearMemory( &info, sizeof( info ) );
2126cc ¤   ¤   info.info¤  ¤   ¤   ¤   = addInfo;
--0cde 0009f19c0b240120036 Page 16 of CDriver.cp
e78547 ¤   ¤   info.numPBs¤¤   ¤   ¤   = mNumPBs;
3ecc08 ¤   ¤   info.pbArray¤   ¤   ¤   = mPBArray;
153a24 ¤   ¤   info.cipherProcRef¤ ¤   = mCipherProcRef;
7a1b52 ¤   ¤
8aeffa ¤   ¤   err¤= CDrive::sCreate( &newDrive, &info );
24d798 ¤   ¤   if ( IsntErr( err ) )
5ef776 ¤   ¤   ¤   {
eac369 ¤   ¤   ¤   pgpAssert( IsNull( newDrive->GetVCB() ) );
3787c7 ¤   ¤   ¤
55613b ¤   ¤   ¤   CDriveList::sGetList()->AddDrive( newDrive );
cf87c7 ¤   ¤   ¤
392538 ¤   ¤   ¤   FlagsDrvQEl¤*driveQEl;
5887c7 ¤   ¤   ¤
142a94 ¤   ¤   ¤   err = AddDriveToQueue( addInfo->numBlocks, mDCE->dCtlRefNum,
d09d43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   addInfo->mountReadOnly, &driveQEl);
2c6108 ¤   ¤   ¤   if( IsntErr( err ) )
6172c3 ¤   ¤   ¤   ¤   {
4d90f5 ¤   ¤   ¤   ¤   newDrive->SetDriveQElement( driveQEl );
1fb417 ¤   ¤   ¤   ¤   addInfo->resultDriveNumber = driveQEl->el.dQDrive;
172b85 ¤   ¤   ¤   ¤
c11e2b ¤   ¤   ¤   ¤   mDCE->dCtlDelay¤¤   = 60;¤  // 60 ticks...call once per second
6b2613 ¤   ¤   ¤   ¤   }
e1bb8c ¤   ¤   ¤   else
fe72c3 ¤   ¤   ¤   ¤   {
acbeb0 ¤   ¤   ¤   ¤   delete( newDrive );
832613 ¤   ¤   ¤   ¤   }
39a3a6 ¤   ¤   ¤   }
bd0fe4 ¤   ¤   }
d00e24 ¤   else
f05b34 ¤   ¤   {
f53963 ¤   ¤   pgpDebugPStr( "\pCDriver::HandleAddDriveCC: can't allocate enough pbs "
016294 ¤   ¤   ¤   "for drive" );
cd0fe4 ¤   ¤   }
7c67c5 ¤
382f52 ¤   InstallOrRemoveSleepProcAsAppropriate();
f91b52 ¤   ¤
e5deb7 ¤   return( err );
fe9371 ¤   }
27af5a
b3af5a
17af5a
0baf5a
2467c5 ¤
1822dc ¤   ulong
e8e72b CDriver::CalcScratchBufferSize( )
d2c7a1 ¤   {
90f7f3 ¤   ulong¤  bufferSize¤ = kDefaultScratchBufferSize;
e7baed ¤   long¤   gestaltResult;
5f4351 ¤   OSErr¤  err;
de67c5 ¤
daacb0 ¤   err¤= Gestalt( gestaltPhysicalRAMSize, &gestaltResult );
605ecc ¤   if ( IsntErr( err ) )
305b34 ¤   ¤   {
580a01 ¤   ¤   ulong¤  ramSize¤= gestaltResult;
be1b52 ¤   ¤
282874 ¤   ¤   // use 128K for every 32MB of physical RAM, which is about 0.3%
53c2f5 ¤   ¤   ulong¤  num32MBChunks¤  = ramSize / ( 32UL * 1024UL * 1024UL );
9be9f3 ¤   ¤   if ( num32MBChunks != 0 )
d6f776 ¤   ¤   ¤   {
eb31dd ¤   ¤   ¤   bufferSize¤ *= num32MBChunks;
3ea3a6 ¤   ¤   ¤   }
901b52 ¤   ¤
dc81a6 ¤   ¤   if ( bufferSize > kMaxScratchBufferSize )
3d408a ¤   ¤   ¤   bufferSize¤ = kMaxScratchBufferSize;
ec0fe4 ¤   ¤   }
80af5a
370654 ¤   return( bufferSize );
fb9371 ¤   }
4567c5 ¤
c77bbe /*_________________________________________________________________________
3f6016 ¤   Resize the scratch buffer by destroying the old one and creating a new
9f8a78 ¤   one.
--eade 000499f5a4340120036 Page 17 of CDriver.cp
308ac7 _________________________________________________________________________*/
23eacd ¤   OSErr
e6cd52 CDriver::ChangeScratchBufferSize( ulong preferredSize)
7ec7a1 ¤   {
588e70 ¤   OSErr¤  err¤= noErr;
cc4084 ¤   void *¤ newBuffer;
ad9ae0 ¤   UInt32¤ newBufferSize;
661b52 ¤   ¤
85277e ¤   newBuffer¤  = pgpNewPtrMost( preferredSize, kMinScratchBufferSize,
4af19a ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseSystemHeap, &newBufferSize );
767c56 ¤   if ( IsntNull( newBuffer ) )
395b34 ¤   ¤   {
043c3f ¤   ¤   if ( preferredSize > mScratchBufferSize &&
0b6725 ¤   ¤   ¤   ¤   newBufferSize < mScratchBufferSize )
f2f776 ¤   ¤   ¤   {
c1a9b7 ¤   ¤   ¤   // we wanted a larger one than what we have, but we got less
39e5b3 ¤   ¤   ¤   // than what we have now
7dff5e ¤   ¤   ¤   pgpDebugPStr( "\pChangeScratchBufferSize: unable to allocate a "
835108 ¤   ¤   ¤   ¤   "larger buffer" );
89c1f9 ¤   ¤   ¤   pgpFreeMac( newBuffer );
7bb49e ¤   ¤   ¤   err¤= memFullErr;
a3a3a6 ¤   ¤   ¤   }
c60e1d ¤   ¤   else
b1f776 ¤   ¤   ¤   {
27d27f ¤   ¤   ¤   DisposeScratchBuffer( );
e21b52 ¤   ¤
76699b ¤   ¤   ¤   mScratchBuffer¤ ¤   = newBuffer;
f1f788 ¤   ¤   ¤   mScratchBufferSize¤ = ( newBufferSize / kPGPDiskBlockSize ) *
1455c0 ¤   ¤   ¤   ¤   ¤   kPGPDiskBlockSize;
841b52 ¤   ¤
87cbd2 ¤   ¤   ¤   CDrive::sSetScratchBuffer( mScratchBuffer, mScratchBufferSize );
06a3a6 ¤   ¤   ¤   }
7a0fe4 ¤   ¤   }
a30e24 ¤   else
7e5b34 ¤   ¤   {
643dca ¤   ¤   err¤= memFullErr;
0c0fe4 ¤   ¤   }
ad67c5 ¤
6267c5 ¤
01deb7 ¤   return( err );
539371 ¤   }
f1af5a
3667c5 ¤
427bbe /*_________________________________________________________________________
5add8e ¤   Allocate enough PBs to cover the maximum number of extents for the file
185bc0 ¤   representing this drive. ·Always allocate some minimum number so that
143bc3 ¤   we can split read and write requests up into multiple requests in order
e035f4 ¤   to overlap I/O and ciphering.
f58ac7 _________________________________________________________________________*/
3959fc ¤   void *
7fd6e6 CDriver::AllocatePBs(
90b0ce ¤   const ushort¤   minRequired,
aa9281 ¤   ushort *¤   ¤   numAllocated)
8cc7a1 ¤   {
136ef9 ¤   const ulong kMinPBs¤= 32;
931553 ¤   void *¤ ¤   pbArray¤= nil;
33c347 ¤   ushort¤ ¤   numPBs;
e367c5 ¤
78fbc5 ¤   numPBs¤ ¤   ¤   = MAX( minRequired, kMinPBs );
0124c5 ¤   *numAllocated¤  = numPBs;
9f67c5 ¤
f5ce73 ¤   pbArray¤= NewPtrSysClear( CDrive::kPBSize * numPBs ·);
ae36a9 ¤   pgpAssert( IsntNull( pbArray ) );
a167c5 ¤
5d620d ¤   return( pbArray );
819371 ¤   }
c2af5a
f5af5a
aa67c5 ¤
8b7bbe /*_________________________________________________________________________
24dd8e ¤   Allocate enough PBs to cover the maximum number of extents for the file
495bc0 ¤   representing this drive. ·Always allocate some minimum number so that
--ab93 00001b2a6bc40120036 Page 18 of CDriver.cp
757b32 ¤   we can split read requests up into multiple requests in order to overlap
55e0f9 ¤   decryption and reading
f58ac7 _________________________________________________________________________*/
6eeacd ¤   OSErr
da511e CDriver::SetNumPBs( const ushort newNumber )
bfc7a1 ¤   {
1b8e70 ¤   OSErr¤  err¤= noErr;
5567c5 ¤
ce8022 ¤   // we never reduce the number of pbs, only increase it,
999f3d ¤   // since an existing drive may require the current number
728d17 ¤   if ( newNumber > mNumPBs || IsNull( mPBArray ) )
885b34 ¤   ¤   {
b6bc51 ¤   ¤   void *¤ newArray;
9f4505 ¤   ¤   ushort¤ numNew;
e31b52 ¤   ¤
0f06fd ¤   ¤   newArray¤   = AllocatePBs( newNumber, &numNew );
62841e ¤   ¤   if ( IsntNull( newArray ) )
d9f776 ¤   ¤   ¤   {
b5d266 ¤   ¤   ¤   DisposePBs();
8087c7 ¤   ¤   ¤
b1ffcb ¤   ¤   ¤   mPBArray¤   = newArray;
18707e ¤   ¤   ¤   mNumPBs¤¤   = numNew;
3a87c7 ¤   ¤   ¤
f562b9 ¤   ¤   ¤   CDriveList *¤   driveList¤  = CDriveList::sGetList();
6a4260 ¤   ¤   ¤   for( ushort driveIndex = 0;
aa679d ¤   ¤   ¤   ¤   ¤   driveIndex < driveList->GetNumDrives(); ++driveIndex )
7372c3 ¤   ¤   ¤   ¤   {
5078f5 ¤   ¤   ¤   ¤   driveList->GetIndDrive( driveIndex )->SetPBs( newArray,
aa16d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   numNew );
992613 ¤   ¤   ¤   ¤   }
b5a3a6 ¤   ¤   ¤   }
510e1d ¤   ¤   else
34f776 ¤   ¤   ¤   {
44b49e ¤   ¤   ¤   err¤= memFullErr;
7ba3a6 ¤   ¤   ¤   }
670fe4 ¤   ¤   }
7a67c5 ¤
d7deb7 ¤   return( err );
279371 ¤   }
83af5a
6967c5 ¤
8067c5 ¤
6067c5 ¤
a1eacd ¤   OSErr
17f0bc CDriver::InitCipherProc( ·)
86c7a1 ¤   {
608e70 ¤   OSErr¤  err¤= noErr;
3c67c5 ¤
d3f2c9 ¤   err¤= CipherProc_Load( &mCipherProcRef );
86deb7 ¤   return( err );
299371 ¤   }
5e67c5 ¤
4e67c5 ¤
1a67c5 ¤
13af5a
4c6d52 ¤   void
fcc9fc CDriver::DisposeCipherProc( )
8ac7a1 ¤   {
a08e70 ¤   OSErr¤  err¤= noErr;
0567c5 ¤
199bdf ¤   if ( mCipherProcRef != kInvalidCipherProcRef )
c35b34 ¤   ¤   {
f1707f ¤   ¤   err¤= CipherProc_Dispose( mCipherProcRef );
67e9ad ¤   ¤   mCipherProcRef¤ = kInvalidCipherProcRef;
e60fe4 ¤   ¤   }
c5817f ¤   AssertNoErr( err, "CDriver::DisposeCipherProc" );
f99371 ¤   }
de67c5 ¤
c3af5a
d1af5a
69af5a
01af5a
--89e3 0003477e6b240120036 Page 19 of CDriver.cp
e0af5a
bfdacc #pragma mark -
edaf5a
e667c5 ¤
76af5a
bbcd8d ¤   static Boolean
f09dd8 PowerMgrExists()
78c7a1 ¤   {
52a993 ¤   Boolean¤routinesExist = false;
623670 ¤   long¤   ¤   pmgrAttributes;
7d67c5 ¤
349465 ¤   if( Gestalt(gestaltPowerMgrAttr, &pmgrAttributes) == noErr )
295b34 ¤   ¤   {
84c443 ¤   ¤   if( ( pmgrAttributes & (1<<gestaltPMgrDispatchExists)) != 0 )
e2f776 ¤   ¤   ¤   {
325c40 ¤   ¤   ¤   routinesExist¤  = (PMSelectorCount() >= 7);
a3a3a6 ¤   ¤   ¤   }
3d0fe4 ¤   ¤   }
5267c5 ¤
a2a662 ¤   return( routinesExist );
d99371 ¤   }
52af5a
a3af5a
00af5a
5caf5a
9499cb ¤   pascal Boolean
da979d CDriver::sAlertHook(
9fd55a ¤   DialogPtr¤  ¤   theDialog,
7d31c6 ¤   EventRecord *¤  theEvent,
9bc205 ¤   short *¤¤   ¤   itemHit)
47bb36 {
e1cd35 ¤   Boolean¤¤   handledIt¤  = false;
fc67c5 ¤
cb953d ¤   EnterCodeResource();
7467c5 ¤
a542e1 ¤   (void) theDialog;
9be7ae ¤   (void) theEvent;
fe67c5 ¤
4fc725 ¤   CDriver *¤  theDriver¤  = CDriver::sSelf;
596df6 ¤   if ( IsntNull( theDriver ) )
3ec7a1 ¤   {
fb8774 ¤   ¤   const ulong¤kAlertTimeoutSeconds¤   = 15;
e40963 ¤   ¤   ulong¤  ¤   now;
e61b52 ¤   ¤
b4623b ¤   ¤   GetDateTime( & now );
a61b52 ¤   ¤
eb88c8 ¤   ¤   if ( ( now - CDriver::sSelf->mAlertDisplayTime) >=
3da975 ¤   ¤   ¤   ¤   ¤   kAlertTimeoutSeconds )
2f5b34 ¤   ¤   {
fc38c4 ¤   ¤   ¤   *itemHit¤   = 1;¤   // default item
f3af32 ¤   ¤   ¤   handledIt¤  = TRUE;
850fe4 ¤   ¤   }
f09371 ¤   }
5667c5 ¤
d01487 ¤   ExitCodeResource();
9f67c5 ¤
99d40a ¤   return( handledIt );
a2efe6 }
cdaf5a
1a7e69 ¤   Boolean
73d1f6 CDriver::TellUserSleepingWithMountedDrives(
39a389 ¤   ConstStr255Param ¤  volumeName,
f4e52d ¤   Boolean ¤   ¤   ¤   canCancelSleep )
5dc7a1 ¤   {
1589c6 ¤   short¤  saveResFile¤= CurResFile();
ed7368 ¤   THz¤¤   saveZone¤   = GetZone();
f610f3 ¤   Boolean¤okToSleep¤  = TRUE;
73dea8 ¤   short¤  fileRef;
db67c5 ¤
306344 ¤   SetZone( SystemZone() );
0967c5 ¤
343fe4 ¤   SysBeep( 1 );
--cdb8 00096fa03f240120036 Page 20 of CDriver.cp
2a67c5 ¤
a99c36 ¤   fileRef¤= FSpOpenResFile( &mPrefsSpec, fsRdPerm );
03aee0 ¤   if ( fileRef > 0 )
5ec7a1 ¤   {
e8a521 ¤   ¤   typedef struct MyQDGlobals
a6f776 ¤   ¤   ¤   {
cf763b ¤   ¤   ¤   QDGlobals¤  qdGlobals;
2fe8e1 ¤   ¤   ¤   long¤   ¤   a5PointsHere;
a3e4fd ¤   ¤   ¤   long¤   ¤   appleStorage[8];
8d8b62 ¤   ¤   ¤   } MyQDGlobals;
c387c7 ¤   ¤   ¤
71dd08 ¤   ¤   MyQDGlobals¤¤   ¤   myQDGlobals;
693229 ¤   ¤   void *¤ ¤   ¤   ¤   saveA5;
17fc6d ¤   ¤   void *¤ ¤   ¤   ¤   saveCurrentA5;
de3928 ¤   ¤   short¤  ¤   ¤   ¤   result;
7f7314 ¤   ¤   UniversalProcPtr¤   saveDeskHook;
9a6eea ¤   ¤   DragGrayRgnUPP¤ saveDragHook;
d3db95 ¤   ¤   WindowRef¤  ¤   ¤   saveGhostWindow;
9edf4f ¤   ¤   CGrafPort¤  ¤   ¤   grafPort;
961b52 ¤   ¤
5ad2c6 ¤   ¤   // set up our own A5 world, in case its not valid
0aaf5a
afebd8 ¤   ¤   saveDeskHook ¤  = LMGetDeskHook();
bd7cc2 ¤   ¤   saveDragHook ¤  = LMGetDragHook();
3a24a1 ¤   ¤   saveGhostWindow = LMGetGhostWindow();
b199fd ¤   ¤   saveCurrentA5¤  = LMGetCurrentA5();
dc1b52 ¤   ¤
a84717 ¤   ¤   LMSetDeskHook( NULL );
55f3a9 ¤   ¤   LMSetDragHook( NULL );
ecf4f1 ¤   ¤   LMSetGhostWindow( NULL );
af1b52 ¤   ¤
b87adc ¤   ¤   LMSetCurrentA5( (char *) &myQDGlobals.a5PointsHere );
be9a24 ¤   ¤   saveA5 = (void *) SetA5( (long) &myQDGlobals.a5PointsHere );
8a1b52 ¤   ¤
bdf375 ¤   ¤   InitGraf( &myQDGlobals.qdGlobals.thePort );
32824a ¤   ¤   OpenCPort( &grafPort );
381b52 ¤   ¤
325b3a ¤   ¤   GetDateTime( &mAlertDisplayTime );
d71b52 ¤   ¤
fe233d ¤   ¤   ParamText( volumeName, nil, nil, nil );
226a23 ¤   ¤   result = CautionAlert( canCancelSleep ? kSleepRequestAlertResID :
63ca0f ¤   ¤   ¤   ¤   ¤   kSleepDemandAlertResID, sAlertHook );
15e41f ¤   ¤   okToSleep = ( result == 1 );
841b52 ¤   ¤
c646cb ¤   ¤   CloseCPort( &grafPort );
beaf5a
8996bd ¤   ¤   LMSetDeskHook( saveDeskHook );
70a46b ¤   ¤   LMSetDragHook( saveDragHook );
cb7c1c ¤   ¤   LMSetGhostWindow( saveGhostWindow );
79af5a
6ef7bb ¤   ¤   SetA5( (long) saveA5 );
b8fda7 ¤   ¤   LMSetCurrentA5( (char *) saveCurrentA5 );
441b52 ¤   ¤
41f63f ¤   ¤   CloseResFile( fileRef );
839371 ¤   }
ae67c5 ¤
0e60a3 ¤   UseResFile( saveResFile );
63b2fd ¤   SetZone( saveZone );
2b67c5 ¤
1d69ce ¤   return( okToSleep );
ea9371 ¤   }
7c67c5 ¤
12af5a
d0af5a
137e69 ¤   Boolean
f31fec CDriver::SleepDismount(short selector)
b5bb36 {
1695cb ¤   OSErr ¤ err¤= noErr;
8b2f05 ¤   short¤  result¤ = selector;
ff7ee9 ¤   Boolean¤okToSleep = TRUE;
191b52 ¤   ¤
961c03 ¤   if( (selector == sleepRequest) ||
--fa30 000f09206f740120036 Page 21 of CDriver.cp
f81930 ¤   ¤   (selector == sleepDemand) ||·
820f46 ¤   ¤   (selector == dozeRequest ) ||
b6acd9 ¤   ¤   (selector == dozeDemand ) )
c4c7a1 ¤   {
b054ed ¤   ¤   CDriveList *¤   driveList;
8f01ff ¤   ¤   ushort¤ ¤   ¤   numDrives;
00c0ff ¤   ¤   ushort¤ ¤   ¤   numDrivesWeCouldntDo¤   = 0;
688855 ¤   ¤   Str255¤ ¤   ¤   problemDriveName;
e70223 ¤   ¤   Boolean¤¤   ¤   canCancelSleep = FALSE;
061b52 ¤   ¤
e3af0c ¤   ¤   driveList¤  = CDriveList::sGetList();
5ddedf ¤   ¤   numDrives¤  = driveList->GetNumDrives();
d91b52 ¤   ¤
827ecf ¤   ¤   for( ushort driveIndex = 0; driveIndex < numDrives; ++driveIndex )
385b34 ¤   ¤   {
b3a7d4 ¤   ¤   ¤   CDrive *¤   ¤   drive;
be87c7 ¤   ¤   ¤
5d098c ¤   ¤   ¤   drive¤  = driveList->GetIndDrive( driveIndex );
e587c7 ¤   ¤   ¤
8e800c ¤   ¤   ¤   err¤= UnmountAndEjectDrive( drive->GetDriveNumber() );
1321aa ¤   ¤   ¤   if ( IsErr( err ) )
66f776 ¤   ¤   ¤   {
851d7b ¤   ¤   ¤   ¤   const VCB *¤vcb;
6f2b85 ¤   ¤   ¤   ¤
edb8d5 ¤   ¤   ¤   ¤   ++numDrivesWeCouldntDo;
2a2b85 ¤   ¤   ¤   ¤
db5a6f ¤   ¤   ¤   ¤   vcb¤= GetVCBForDrive( drive->GetDriveNumber() );
cb63af ¤   ¤   ¤   ¤   CopyPString( vcb->vcbVN, problemDriveName );
8da3a6 ¤   ¤   ¤   }
4e0fe4 ¤   ¤   }
651b52 ¤   ¤
bb752c ¤   ¤   // make sure any unmounted drives are actually deleted
dd712e ¤   ¤   DriveHousekeeping( TRUE );
8d1b52 ¤   ¤
103b69 ¤   ¤   if ( numDrivesWeCouldntDo != 0 )
545b34 ¤   ¤   {
f72418 ¤   ¤   ¤   if( ! mHaveShownSleepAlert )
40f776 ¤   ¤   ¤   {
3084d2 ¤   ¤   ¤   ¤   Boolean¤canCancelSleep;
ba2b85 ¤   ¤   ¤   ¤
9306d4 ¤   ¤   ¤   ¤   if( selector == sleepRequest ||
061a51 ¤   ¤   ¤   ¤   ¤   selector == dozeRequest )
3472c3 ¤   ¤   ¤   ¤   {
db2207 ¤   ¤   ¤   ¤   ¤   canCancelSleep = TRUE;
8a2613 ¤   ¤   ¤   ¤   }
bbfa07 ¤   ¤   ¤   ¤   else
7972c3 ¤   ¤   ¤   ¤   {
6445de ¤   ¤   ¤   ¤   ¤   canCancelSleep = FALSE;
6f2613 ¤   ¤   ¤   ¤   }
222b85 ¤   ¤   ¤   ¤
8bd004 ¤   ¤   ¤   ¤   okToSleep = TellUserSleepingWithMountedDrives(
b071fe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   problemDriveName, canCancelSleep );
a3da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
566bac ¤   ¤   ¤   ¤   mHaveShownSleepAlert = TRUE;
55a3a6 ¤   ¤   ¤   }
0b0fe4 ¤   ¤   }
a39371 ¤   }
070e24 ¤   else
90c7a1 ¤   {
b55b65 ¤   ¤   mHaveShownSleepAlert = FALSE;
529371 ¤   }
8467c5 ¤
a469ce ¤   return( okToSleep );
bdefe6 }
9567c5 ¤
3267c5 ¤
b96685 ¤   pascal void
d62f48 CDriver::sSleepDismount()
6ec7a1 ¤   {
1c977f ¤   long¤   ¤   selector;
6e8ad7 ¤   Boolean¤¤   okToSleep;
f01db7 ¤   long¤   ¤   saveD0;
--5651 000b9ae038940120036 Page 22 of CDriver.cp
2a67c5 ¤
efb09d #define GetSleepSelector()¤ ¤   GetD0();
5c3ddd #define SetSleepOK(void)¤   ¤   SetD0( 0 );
2baf5a
8df7e1 ¤   saveD0¤ ¤   = GetD0();
9d3add ¤   selector¤   = GetSleepSelector();
712dc9 ¤   okToSleep¤  = TRUE;
9f67c5 ¤
d6953d ¤   EnterCodeResource();
4c67c5 ¤
51c725 ¤   CDriver *¤  theDriver¤  = CDriver::sSelf;
0e978a ¤   pgpAssert( IsntNull( theDriver ) );
ea6df6 ¤   if ( IsntNull( theDriver ) )
085b34 ¤   ¤   {
3e5976 ¤   ¤   okToSleep = theDriver->SleepDismount( selector );
e10fe4 ¤   ¤   }
9b67c5 ¤
7d1487 ¤   ExitCodeResource();
6b67c5 ¤
099f33 ¤   if( okToSleep )
285b34 ¤   ¤   {
d49551 ¤   ¤   SetSleepOK();¤  // indicate OK to go ahead
a50fe4 ¤   ¤   }
a90e24 ¤   else
a95b34 ¤   ¤   {
5ebd2f ¤   ¤   SetD0( saveD0 );
310fe4 ¤   ¤   }
2f9371 ¤   }
8faf5a
ddaf5a
81af5a
caaf5a
6bdacc #pragma mark -
a5af5a
5aeacd ¤   OSErr
e22d59 CDriver::Open( DCtlEntry *¤ dce)
05c7a1 ¤   {
24560b ¤   OSErr¤  ¤   ¤   ¤   err = noErr;
5267c5 ¤
1bbfd3 ¤   if ( ! DriverIsOpen() )
1d5b34 ¤   ¤   {
e6bfb9 ¤   ¤   /* set dCtlFlags because Device Mgr copied header */
8f03f7 ¤   ¤   dce->dCtlFlags |= dCtlEnableMask | dStatEnableMask |
87e0ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dWritEnableMask | dReadEnableMask |
c626f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dNeedTimeMask | dNeedLockMask;
026eb4 ¤   ¤   dce->dCtlDelay¤ ¤   = 60;¤  // 60 ticks...call once per second
8d1b52 ¤   ¤
12d2fc ¤   ¤   dce->dCtlFlags¤ |= kmDriverGestaltEnableMask;
141b52 ¤   ¤
f48b39 ¤   ¤   mDriverIsOpen¤  ¤   = TRUE;
9aef28 ¤   ¤   mSleep.installed¤   = false;
527abb ¤   ¤   mDCE¤   ¤   ¤   ¤   = dce;
721b52 ¤   ¤
a1fd73 ¤   ¤   err¤= InitCipherProc();
39d798 ¤   ¤   if ( IsntErr( err ) )
b9f776 ¤   ¤   ¤   {
5f0953 ¤   ¤   ¤   err¤= CDriveList::sCreateList();
e16108 ¤   ¤   ¤   if( IsntErr( err ) )
5d72c3 ¤   ¤   ¤   ¤   {
5bb0f9 ¤   ¤   ¤   ¤   err = GetPGPDiskGloblalsPtr( &mPGPDiskGlobals );
7a10fd ¤   ¤   ¤   ¤   pgpAssertAddrValid( mPGPDiskGlobals, PGPDiskGlobals );
e12613 ¤   ¤   ¤   ¤   }
dea3a6 ¤   ¤   ¤   }
4f0fe4 ¤   ¤   }
ab1b52 ¤   ¤
34deb7 ¤   return( err );
779371 ¤   }
52af5a
0aaf5a
24af5a
2feacd ¤   OSErr
b9b528 CDriver::Prime(
--b3b8 0006d7a19e540120036 Page 23 of CDriver.cp
879177 ¤   ParamBlockRec *¤pb,
204e15 ¤   DCtlEntry *¤¤   dce)
5ec7a1 ¤   {
824461 ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
9767c5 ¤
b4cca1 ¤   if ( mCipherProcDamaged )
905b34 ¤   ¤   {
69efa7 ¤   ¤   pgpDebugPStr( "\pCDriver::Prime: cipherProc is damaged" );
61bf15 ¤   ¤   err¤¤   ¤   ¤   ¤   ¤   = kCipherProcDamagedError;
6d7a94 ¤   ¤   pb->ioParam.ioResult¤   = kCipherProcDamagedError;
030fe4 ¤   ¤   }
f7d2f4 ¤   else if ( DriverIsOpen() )
db5b34 ¤   ¤   {
b5efd7 ¤   ¤   CDrive *¤   ¤   ¤   drive;
7f0ef3 ¤   ¤   CDriveList *¤   ¤   driveList;
756f22 ¤   ¤   Boolean¤¤   ¤   ¤   isRead;
3113d6 ¤   ¤   const ushort¤   ¤   kIOTrapMask¤= 0xA1FF;
fc4185 ¤   ¤   const ushort¤   ¤   trapWordMasked¤ = pb->ioParam.ioTrap &
116c27 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kIOTrapMask;
9f1b52 ¤   ¤
7e5872 ¤   ¤   pb->ioParam.ioResult¤   = kAsyncIOInProgress;
e567c5 ¤
ad8670 ¤   ¤   pgpAssert( trapWordMasked == (ushort)_Read ||
82586d ¤   ¤   ¤   ¤   ¤   ¤   trapWordMasked == (ushort)_Write );
74c21d ¤   ¤   isRead¤ = (trapWordMasked == (ushort)_Read);
871b52 ¤   ¤
19af0c ¤   ¤   driveList¤  = CDriveList::sGetList();
dc6566 ¤   ¤   drive¤  ¤   = driveList->GetDriveForDriveNumber(
0b7fbc ¤   ¤   ¤   ¤   ¤   ¤   ¤   pb->ioParam.ioVRefNum );
7355ba ¤   ¤   CDrive::sAssertValid( drive );
681b52 ¤   ¤
92168b ¤   ¤   #if USE_LOG
3c0787 ¤   ¤   LogMsg( isRead ? "read" : "write");
34841a ¤   ¤   LogMsg( ( pb->ioParam.ioTrap & kAsyncMask ) != 0 ?
196083 ¤   ¤   ¤   ¤   ¤   ", async: " : ", sync: ");
189b21 ¤   ¤   Str255¤ str;
73d9ba ¤   ¤   pgpFormatPStr( str, sizeof( str ), TRUE,
858969 ¤   ¤   ¤   ¤   "startBlock = %lu, numBlocks = %lu [+" /*]*/,
856abb ¤   ¤   ¤   GetPBStartBlock( pb ), GetPBNumBlocks( pb ));
197489 ¤   ¤   LogMsg( str );
c1d656 ¤   ¤   #endif
071b52 ¤   ¤
b9347f ¤   ¤   if ( isRead )
faf776 ¤   ¤   ¤   {
16187a ¤   ¤   ¤   drive->Read( pb, dce );
c2a3a6 ¤   ¤   ¤   }
a40e1d ¤   ¤   else
43f776 ¤   ¤   ¤   {
d3d3f3 ¤   ¤   ¤   drive->Write( pb, dce );
e1a3a6 ¤   ¤   ¤   }
fe1b52 ¤   ¤
579119 ¤   ¤   LogMsg( "+" );
531b52 ¤   ¤
cb4608 ¤   ¤   // we ALWAYS return this error in ALL cases
18d767 ¤   ¤   err¤= kAsyncIOInProgress;
3d0fe4 ¤   ¤   }
e30e24 ¤   else
c75b34 ¤   ¤   {
b644c3 ¤   ¤   LogMsg( "CDriver::Prime: not open" );
66c105 ¤   ¤   err = notOpenErr;
de719a ¤   ¤   pb->ioParam.ioResult¤   = err;
f80fe4 ¤   ¤   }
2867c5 ¤
1be1e8 ¤   // do *not* set pb->ioParam.ioResult here!
1167c5 ¤
d0deb7 ¤   return( err );
839371 ¤   }
8daf5a
b7af5a
9aaf5a
6aeacd ¤   OSErr
6d85e6 CDriver::Close(
--3e69 0000e1c503340120036 Page 24 of CDriver.cp
879177 ¤   ParamBlockRec *¤pb,
204e15 ¤   DCtlEntry *¤¤   dce)
cfbb36 {
bf8e70 ¤   OSErr¤  err¤= noErr;
af67c5 ¤
06844f ¤   pb¤ = pb;
4667c5 ¤
85e745 ¤   if ( DriverIsOpen() )
a65b34 ¤   ¤   {
1c712e ¤   ¤   DriveHousekeeping( TRUE );
ae1b52 ¤   ¤
28dcce ¤   ¤   if ( CDriveList::sGetList()->GetNumDrives() == 0 )
63f776 ¤   ¤   ¤   {
b3502b ¤   ¤   ¤   dce->dCtlStorage = nil;¤
9e87c7 ¤   ¤   ¤
86927d ¤   ¤   ¤   mDriverIsOpen¤  ¤   = false;
bf87c7 ¤   ¤   ¤
d50737 ¤   ¤   ¤   CDriveList::sDisposeList();
1d87c7 ¤   ¤   ¤
84546e ¤   ¤   ¤   DisposeCipherProc();
c487c7 ¤   ¤   ¤
226c7f ¤   ¤   ¤   #if USE_LOG
d8d04a ¤   ¤   ¤   if ( IsntNull( gLog ) )
e272c3 ¤   ¤   ¤   ¤   {
13659a ¤   ¤   ¤   ¤   delete gLog;
b708e7 ¤   ¤   ¤   ¤   gLog¤   = nil;
222613 ¤   ¤   ¤   ¤   }
6234f5 ¤   ¤   ¤   #endif
c287c7 ¤   ¤   ¤
d579e5 ¤   ¤   ¤   CDrive::sCleanup();
26a3a6 ¤   ¤   ¤   }
c20e1d ¤   ¤   else
06f776 ¤   ¤   ¤   {
eab26a ¤   ¤   ¤   // drives still exist!
2ab9b2 ¤   ¤   ¤   err¤= -1;
aa09bf ¤   ¤   ¤   pgpDebugPStr( "\pdrives still exist!");
25a3a6 ¤   ¤   ¤   }
460fe4 ¤   ¤   }
3d0e24 ¤   else
3b5b34 ¤   ¤   {
5bd6c9 ¤   ¤   err¤= notOpenErr;
500fe4 ¤   ¤   }
2767c5 ¤
3b67c5 ¤
953069 ¤   pb->ioParam.ioResult¤   = err;
9667c5 ¤
dbdeb7 ¤   return( err );
96efe6 }
4baf5a
b1af5a
dfaf5a
a2eacd ¤   OSErr
2647e1 CDriver::ExtractFromCSParam(
e4b05e ¤   const ParamBlockRec *¤  pb,
5ed523 ¤   void *¤ ¤   ¤   ¤   ¤   bytes,
c58b90 ¤   ulong¤  ¤   ¤   ¤   ¤   numBytes)
5cc7a1 ¤   {
5e0e86 ¤   OSErr¤  err¤= paramErr;
ae67c5 ¤
d92ea1 ¤   const DriverAPIStruct *¤api¤=
cd7623 ¤   ¤   ¤   ¤   (const DriverAPIStruct *)&pb->cntrlParam.csParam[ 0 ];
7967c5 ¤
ca9268 ¤   if ( api->magic == DriverAPIStruct::kMagicIn )
c35b34 ¤   ¤   {
ef7610 ¤   ¤   err¤= noErr;
48fbed ¤   ¤   BlockMoveData( &api->data, bytes, numBytes );
cb0fe4 ¤   ¤   }
5967c5 ¤
2c3bac ¤   AssertNoErr( err, "ExtractFromCSParam" );
d7deb7 ¤   return( err );
c79371 ¤   }
0eaf5a
--1c04 000513ce63c40120036 Page 25 of CDriver.cp
e0af5a
2c6d52 ¤   void
918f20 CDriver::MarkCSParamUnderstood(
8befcf ¤   ParamBlockRec *¤pb)
1ac7a1 ¤   {
0c269b ¤   DriverAPIStruct *¤  api¤= (DriverAPIStruct *)&pb->cntrlParam.csParam[ 0 ];
fc67c5 ¤
bf438b ¤   api->magic¤ = DriverAPIStruct::kMagicOut;
b09371 ¤   }
5d67c5 ¤
02af5a
f8eacd ¤   OSErr
82330f CDriver::Control(
639177 ¤   ParamBlockRec *¤pb,
b603f2 ¤   DCtlEntry *¤¤   /*dce*/)
5bc7a1 ¤   {
fd1a21 ¤   OSErr ¤ ¤   ¤   ¤   err¤= controlErr;
49d8eb ¤   const short¤¤   ¤   csCode¤ = pb->cntrlParam.csCode;
c467c5 ¤
0ae745 ¤   if ( DriverIsOpen() )
d15b34 ¤   ¤   {
1a30a3 ¤   ¤   err¤= HandleOtherCC( pb );
960fe4 ¤   ¤   }
470e24 ¤   else
4e5b34 ¤   ¤   {
ead6c9 ¤   ¤   err¤= notOpenErr;
1d0fe4 ¤   ¤   }
b367c5 ¤
94132c ¤   pb->cntrlParam.ioResult¤= err;
c2deb7 ¤   return( err );
beefe6 }
bbaf5a
7eaf5a
a5af5a
d8af5a
ddaf5a
92eacd ¤   OSErr
771514 CDriver::HandleGetDriverInfoSC( PGPDriverInfoStruct * info)
38c7a1 ¤   {
f68e70 ¤   OSErr¤  err¤= noErr;
1867c5 ¤
439935 ¤   info->versionOut¤   ¤   ¤   = kPGPDiskDriverVersion;
bccbc7 ¤   info->writeBufferSizeOut¤   = mScratchBufferSize;
088463 ¤   info->numDrivesOut¤ ¤   ¤   = 0;
5e67c5 ¤
1b3ca0 ¤   CDriveList *¤   driveList¤  = CDriveList::sGetList();
be7c06 ¤   if ( IsntNull( driveList ) )
115b34 ¤   ¤   {
985d16 ¤   ¤   info->numDrivesOut¤ = driveList->GetNumDrives();
6a0fe4 ¤   ¤   }
1d67c5 ¤
3bd552 ¤   pgpClearMemory( info->reserved, sizeof( info->reserved ) );
3567c5 ¤
dfdeb7 ¤   return( err );
e79371 ¤   }
1867c5 ¤
8aaf5a
91af5a
38eacd ¤   OSErr
9aebec CDriver::HandleGetDriveInfoSC( PGPDriveInfoStruct * info)
0ac7a1 ¤   {
5414d3 ¤   OSErr¤  ¤   err¤= noErr;
831f5c ¤   CDrive *¤   drive¤  = nil;
1867c5 ¤
1ed552 ¤   pgpClearMemory( info->reserved, sizeof( info->reserved ) );
d267c5 ¤
6d59e8 ¤   drive¤  = CDriveList::sGetList()->GetDriveForDriveNumber(
a87ed4 ¤   ¤   ¤   ¤   ¤   ¤   info->driveNumberIn );
f17f42 ¤   if ( IsntNull( drive ) )
265b34 ¤   ¤   {
afc1f8 ¤   ¤   info->baseDriveNumberOut¤   = drive->GetBaseDriveNumber();
51ee2b ¤   ¤   info->fileRefNum¤   ¤   ¤   = drive->GetFileRefNum();
--17ad 0001ffafa9440120036 Page 26 of CDriver.cp
449edf ¤   ¤   info->breaksUpRequests¤ ¤   = drive->GetBreaksUpRequests();
bdf049 ¤   ¤   drive->GetReadTuner( &info->readTuneOut );
c32360 ¤   ¤   drive->GetWriteTuner( &info->writeTuneOut );
f60fe4 ¤   ¤   }
a30e24 ¤   else
005b34 ¤   ¤   {
e30ccf ¤   ¤   err¤= nsDrvErr;
000fe4 ¤   ¤   }
f367c5 ¤
76deb7 ¤   return( err );
879371 ¤   }
ac67c5 ¤
8a67c5 ¤
7f67c5 ¤
dbeacd ¤   OSErr
65cd16 CDriver::HandleDriveStatusSC(
f40e09 ¤   short¤  ¤   driveNumber,
90f043 ¤   DrvSts *¤   driveStatus )
28c7a1 ¤   {
8529f4 ¤   OSErr¤  ¤   ¤   err¤= paramErr;
763f83 ¤   CDrive *¤   ¤   drive;
e087c7 ¤   ¤   ¤
f3ffcd ¤   drive¤  = CDriveList::sGetList()->GetDriveForDriveNumber( driveNumber );
a21449 ¤   CDrive::sAssertValid( drive );
d27f42 ¤   if ( IsntNull( drive ) )
e35b34 ¤   ¤   {
344eda ¤   ¤   const DrvQEl *¤ ¤   driveQEl;
c21b52 ¤   ¤
a47610 ¤   ¤   err¤= noErr;
fc1b52 ¤   ¤
4d4264 ¤   ¤   // Drive Stats...
fa0921 ¤   ¤   // See IM-II, p.215 for documentation
ff1b52 ¤   ¤
0ceb7e ¤   ¤   driveStatus->track¤ ¤   ¤   = 0;¤   ¤   ¤   ¤   /* not applicable */
ee22c9 ¤   ¤   driveStatus->writeProt¤ ¤   = drive->IsWriteProtected() ? 0x80 : 0;
87e59e ¤   ¤   driveStatus->diskInPlace¤   = 1;¤   ¤   ¤   ¤   /* disk is in drive */
7add61 ¤   ¤   driveStatus->installed¤ ¤   = 1;¤   ¤   ¤   ¤   /* drive installed */
9f008a ¤   ¤   driveStatus->sides¤ ¤   ¤   = 0;¤   ¤   ¤   ¤   /* not applicable */
7b4904 ¤   ¤   driveStatus->twoSideFmt¤¤   = 0;¤   ¤   ¤   ¤   /* not applicable */
4232b5 ¤   ¤   driveStatus->needsFlush¤¤   = 0;¤   ¤   ¤   ¤   /* not applicable */
4a8ad9 ¤   ¤   driveStatus->diskErrs¤  ¤   = 0;¤   ¤   ¤   ¤   /* not applicable */
d31b52 ¤   ¤
2904e4 ¤   ¤   /* Copy qLink through dQFSID from our DrvQEl */
96687a ¤   ¤   driveQEl = (DrvQElPtr)(GetDrvQHdr()->qHead);
451e70 ¤   ¤   while( IsntNull( driveQEl ) )
6ff776 ¤   ¤   ¤   {
235d52 ¤   ¤   ¤   if( driveQEl->dQDrive == driveNumber )
8472c3 ¤   ¤   ¤   ¤   {
5b7769 ¤   ¤   ¤   ¤   driveStatus->qLink¤ ¤   = driveQEl->qLink;
b1c837 ¤   ¤   ¤   ¤   driveStatus->qType¤ ¤   = driveQEl->qType;
99eb5f ¤   ¤   ¤   ¤   driveStatus->dQDrive¤   = driveQEl->dQDrive;
2fd82c ¤   ¤   ¤   ¤   driveStatus->dQRefNum¤  = driveQEl->dQRefNum;
44db7f ¤   ¤   ¤   ¤   driveStatus->dQFSID¤¤   = driveQEl->dQFSID;
4ff622 ¤   ¤   ¤   ¤   break;
652613 ¤   ¤   ¤   ¤   }
042b85 ¤   ¤   ¤   ¤
3fb41b ¤   ¤   ¤   driveQEl = (const DrvQEl *)(driveQEl->qLink);
80a3a6 ¤   ¤   ¤   }
640fe4 ¤   ¤   }
f167c5 ¤
e3deb7 ¤   return( err );
819371 ¤   }
cbaf5a
5caf5a
d967c5 ¤
57eacd ¤   OSErr
0c6da3 CDriver::Status(
509177 ¤   ParamBlockRec *¤pb,
5103f2 ¤   DCtlEntry *¤¤   /*dce*/)
efc7a1 ¤   {
16d850 ¤   OSErr¤  ¤   ¤   ¤   err¤= statusErr;
1f67c5 ¤
--6dbb 0006259b0cb40120036 Page 27 of CDriver.cp
3f5d1c ¤   pgpAssert( DriverIsOpen() );
9d67c5 ¤
3ee745 ¤   if ( DriverIsOpen() )
b45b34 ¤   ¤   {
44fe5e ¤   ¤   const short¤¤   ¤   csCode¤ = pb->cntrlParam.csCode;
dd67c5 ¤
8a217b ¤   ¤   if ( csCode == kGetDriverInfoSC ) /* "Driver" */
e3f776 ¤   ¤   ¤   {
e1da6b ¤   ¤   ¤   PGPDriverInfoStruct¤*info;
7a87c7 ¤   ¤   ¤
7a854d ¤   ¤   ¤   err¤= ExtractFromCSParam( pb, &info, sizeof( info ) );
c7e090 ¤   ¤   ¤   if ( IsntErr( err ) )
5f72c3 ¤   ¤   ¤   ¤   {
74f30d ¤   ¤   ¤   ¤   err¤= HandleGetDriverInfoSC( info );
d493f0 ¤   ¤   ¤   ¤   MarkCSParamUnderstood( pb );
7d2613 ¤   ¤   ¤   ¤   }
90a3a6 ¤   ¤   ¤   }
c0433d ¤   ¤   else if ( csCode == kGetDriveInfoSC ) /* "Drive" */
c7f776 ¤   ¤   ¤   {
fc56b3 ¤   ¤   ¤   PGPDriveInfoStruct¤ *info;
2e87c7 ¤   ¤   ¤
55854d ¤   ¤   ¤   err¤= ExtractFromCSParam( pb, &info, sizeof( info ) );
89e090 ¤   ¤   ¤   if ( IsntErr( err ) )
e372c3 ¤   ¤   ¤   ¤   {
60e734 ¤   ¤   ¤   ¤   err¤= HandleGetDriveInfoSC( info );
6493f0 ¤   ¤   ¤   ¤   MarkCSParamUnderstood( pb );
912613 ¤   ¤   ¤   ¤   }
fda3a6 ¤   ¤   ¤   }
100e1d ¤   ¤   else
5ef776 ¤   ¤   ¤   {
29187a ¤   ¤   ¤   short¤  driveNumber;
1787c7 ¤   ¤   ¤
78e341 ¤   ¤   ¤   driveNumber¤= pb->cntrlParam.ioVRefNum;
7e67c5 ¤
7f63a5 ¤   ¤   ¤   switch( csCode )
ab72c3 ¤   ¤   ¤   ¤   {
bc6ab9 ¤   ¤   ¤   ¤   default:
73cf8b ¤   ¤   ¤   ¤   ¤   pgpDebugFmtMsg( (pgpaFmtPrefix,
a8c56f ¤   ¤   ¤   ¤   ¤   ¤   ¤   "DRVRStatus: unknown csCode %ld", (long)csCode) );
dc14c3 ¤   ¤   ¤   ¤   ¤   break;
acae30 ¤   ¤   ¤   ¤   ¤
9dbcde ¤   ¤   ¤   ¤   case returnFormatListSC:
e4c98e ¤   ¤   ¤   ¤   ¤   // fill in FormatListRec
aedd3f ¤   ¤   ¤   ¤   ¤   // we do not need to respond to this.
4e6a79 ¤   ¤   ¤   ¤   ¤   // See FSM.h for comment.
6ea512 ¤   ¤   ¤   ¤   ¤   err¤= controlErr;
6714c3 ¤   ¤   ¤   ¤   ¤   break;
2bae30 ¤   ¤   ¤   ¤   ¤
af5564 ¤   ¤   ¤   ¤   case driveStatusSC:
044859 ¤   ¤   ¤   ¤   ¤   {
a9134b ¤   ¤   ¤   ¤   ¤   // Drive Stats...
82eb69 ¤   ¤   ¤   ¤   ¤   // See IM-II, p.215 for documentation
711796 ¤   ¤   ¤   ¤   ¤   err¤= HandleDriveStatusSC( driveNumber,
4a0735 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (DrvSts *)pb->cntrlParam.csParam );
c914c3 ¤   ¤   ¤   ¤   ¤   break;
121c89 ¤   ¤   ¤   ¤   ¤   }
fbae30 ¤   ¤   ¤   ¤   ¤
2cf84c ¤   ¤   ¤   ¤   case kDriverGestaltCode:¤   // see DriverGestalt.h
2b4859 ¤   ¤   ¤   ¤   ¤   {
d9bbe2 ¤   ¤   ¤   ¤   ¤   err¤= HandleDriverGestalt( (DriverGestaltParam *)pb );
ec14c3 ¤   ¤   ¤   ¤   ¤   break;
1a1c89 ¤   ¤   ¤   ¤   ¤   }
7587c7 ¤   ¤   ¤
ef2613 ¤   ¤   ¤   ¤   }
a8a3a6 ¤   ¤   ¤   }
070fe4 ¤   ¤   }
840e24 ¤   else
ab5b34 ¤   ¤   {
7ac105 ¤   ¤   err = notOpenErr;
b60fe4 ¤   ¤   }
6faf5a
623069 ¤   pb->ioParam.ioResult¤   = err;
--f5bd 000743e37d040120036 Page 28 of CDriver.cp
2a67c5 ¤
299337 ¤   return (err);
4a9371 ¤   }
5aaf5a
6ddacc #pragma mark -
29af5a
13af5a
69eacd ¤   OSErr
bbb90a CDriver::CreateDriver(
0abde8 ¤   CDriver **¤ driver)
2cc7a1 ¤   {
8e8e70 ¤   OSErr¤  err¤= noErr;
6167c5 ¤
28a0ce ¤   *driver¤= new CDriver;
4e8585 ¤   if ( IsNull( driver ) )
a25b34 ¤   ¤   {
18d918 ¤   ¤   err¤¤   = memFullErr;
9a60a9 ¤   ¤   *driver¤= nil;
920fe4 ¤   ¤   }
9967c5 ¤
2edeb7 ¤   return( err );
c19371 ¤   }
0daf5a
32af5a
26a3ea ¤   inline CDriver *
ff0fc7 GetDriverObject( const DCtlEntry * dce )
b4c7a1 ¤   {
6d0414 ¤   return( (CDriver *)dce->dCtlStorage );
f09371 ¤   }
edaf5a
e4af5a
4c48f4 ¤   pascal OSErr
9f8f41 DRVROpen(
1a9177 ¤   ParamBlockRec *¤pb,
b04e15 ¤   DCtlEntry *¤¤   dce)
6ec7a1 ¤   {
4e98b7 ¤   CDriver *¤  driver¤ = GetDriverObject( dce );
2514d3 ¤   OSErr¤  ¤   err¤= noErr;
f767c5 ¤
a28585 ¤   if ( IsNull( driver ) )
da5b34 ¤   ¤   {
cc150d ¤   ¤   CSystemZoneSetter¤  setter;
8167c5 ¤
d28a87 ¤   ¤   pgpLeaksBeginSession( "DRVROpen" );
101b52 ¤   ¤
ee81f8 ¤   #if USE_LOG
ef1060 ¤   ¤   gLog¤   = new CLogToFile( "\pPGPDisk DRVR Log" );
fa275b ¤   ¤   pgpAssert( IsntNull( gLog ) );
3d3720 ¤   ¤   gLog->Append( "\r\r BEGIN LOG\r\r" );
1eb7ec ¤   #endif
fe67c5 ¤
6a2ea7 ¤   ¤   err¤= CDriver::CreateDriver( &driver );
afd798 ¤   ¤   if ( IsntErr( err ) )
55f776 ¤   ¤   ¤   {
5dbe30 ¤   ¤   ¤   err¤= driver->Open( dce );
8087c7 ¤   ¤   ¤
6821aa ¤   ¤   ¤   if ( IsErr( err ) )
7972c3 ¤   ¤   ¤   ¤   {
4e6ddd ¤   ¤   ¤   ¤   delete driver;
912613 ¤   ¤   ¤   ¤   }
17a3a6 ¤   ¤   ¤   }
8c1b52 ¤   ¤
4ed798 ¤   ¤   if ( IsntErr( err ) )
84f776 ¤   ¤   ¤   {
3ed743 ¤   ¤   ¤   dce->dCtlStorage¤   = (Handle)driver;
f91b52 ¤   ¤
29a3a6 ¤   ¤   ¤   }
520fe4 ¤   ¤   }
250e24 ¤   else
cb5b34 ¤   ¤   {
177610 ¤   ¤   err¤= noErr;
740fe4 ¤   ¤   }
--ddd2 000e6cdbb9c40120036 Page 29 of CDriver.cp
2a67c5 ¤
353069 ¤   pb->ioParam.ioResult¤   = err;
acdeb7 ¤   return( err );
639371 ¤   }
7baf5a
a2af5a
43af5a
7d48f4 ¤   pascal OSErr
6fe344 DRVRPrime(
269177 ¤   ParamBlockRec *¤pb,
804e15 ¤   DCtlEntry *¤¤   dce)
efc7a1 ¤   {
bd98b7 ¤   CDriver *¤  driver¤ = GetDriverObject( dce );
b067c5 ¤
21bb46 ¤   if ( IsntNull( driver ) )
035b34 ¤   ¤   {
177368 ¤   ¤   return( driver->Prime( pb, dce ) );
0b0fe4 ¤   ¤   }
291b52 ¤   ¤
6a03c2 ¤   pb->ioParam.ioResult¤   = kNoDriverErr;
32b437 ¤   return( kNoDriverErr );
e49371 ¤   }
9aaf5a
fdaf5a
fe48f4 ¤   pascal OSErr
9bc49f DRVRStatus(
809177 ¤   ParamBlockRec *¤pb,
364e15 ¤   DCtlEntry *¤¤   dce)
11c7a1 ¤   {
9498b7 ¤   CDriver *¤  driver¤ = GetDriverObject( dce );
9bda4c ¤   OSErr¤  ¤   err¤= -1;
5567c5 ¤
dfbb46 ¤   if ( IsntNull( driver ) )
185b34 ¤   ¤   {
bc939a ¤   ¤   err¤= driver->Status( pb, dce );
100fe4 ¤   ¤   }
2a0e24 ¤   else
9f5b34 ¤   ¤   {
84f421 ¤   ¤   err¤= kNoDriverErr;
4f0fe4 ¤   ¤   }
a21b52 ¤   ¤
dc2009 ¤   pgpAssert( err != kAsyncIOInProgress );
7e132c ¤   pb->cntrlParam.ioResult¤= err;
b4deb7 ¤   return( err );
f89371 ¤   }
b967c5 ¤
5867c5 ¤
9848f4 ¤   pascal OSErr
1ec849 DRVRControl(
7a9177 ¤   ParamBlockRec *¤pb,
504e15 ¤   DCtlEntry *¤¤   dce)
cfc7a1 ¤   {
bc98b7 ¤   CDriver *¤  driver¤ = GetDriverObject( dce );
62da4c ¤   OSErr¤  ¤   err¤= -1;
3667c5 ¤
69bb46 ¤   if ( IsntNull( driver ) )
fc5b34 ¤   ¤   {
b8a69d ¤   ¤   err¤= driver->Control( pb, dce );
220fe4 ¤   ¤   }
640e24 ¤   else
e05b34 ¤   ¤   {
42f421 ¤   ¤   err¤= kNoDriverErr;
9b0fe4 ¤   ¤   }
ba67c5 ¤
132009 ¤   pgpAssert( err != kAsyncIOInProgress );
41132c ¤   pb->cntrlParam.ioResult¤= err;
83deb7 ¤   return( err );
d79371 ¤   }
a667c5 ¤
ca67c5 ¤
6148f4 ¤   pascal OSErr
e6d38a DRVRClose(
--0a99 001a64af60640120036 Page 30 of CDriver.cp
879177 ¤   ParamBlockRec *¤pb,
204e15 ¤   DCtlEntry *¤¤   dce)
5ec7a1 ¤   {
1c98b7 ¤   CDriver *¤  driver¤ = GetDriverObject( dce );
ed92b3 ¤   OSErr¤  ¤   err¤= kNoDriverErr;
0f67c5 ¤
ffbb46 ¤   if ( IsntNull( driver ) )
875b34 ¤   ¤   {
0ad2ea ¤   ¤   err¤= driver->Close( pb, dce );
bfd798 ¤   ¤   if ( IsntErr( err ) )
6cf776 ¤   ¤   ¤   {
5679f5 ¤   ¤   ¤   delete driver;
a41e87 ¤   ¤   ¤   pgpLeaksEndSession( );
45a3a6 ¤   ¤   ¤   }
ae0fe4 ¤   ¤   }
8d1b52 ¤   ¤
fddeb7 ¤   return( err );
a99371 ¤   }
1367c5 ¤
7067c5 ¤
94af5a
07af5a
e6af5a
11af5a
24af5a
02af5a
71af5a
bbaf5a
ebaf5a
ecaf5a
4daf5a
3e67c5 ¤
a6bd73 ¤   ¶
--3da5 000db6ddfcb40120037 Page 1 of CDriver.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
098659 ¤   $Id: CDriver.h,v 1.5.8.1 1998/11/12 03:05:40 heller Exp $
cdf7f7 ____________________________________________________________________________*/
d7af5a
fcc7ff #include <Power.h>
cdaf5a
e858cd #include "DriverPrefs.h"
1eaf5a
63b6e5 struct PGPDiskDriverPrefs;
2c6cb4 struct SetCipherProcStruct;
00ea04 struct AddDriveStruct;
786f00 struct PGPDriverInfoStruct;
a91f93 struct PGPDiskGlobals;
fdaf5a
74af5a
40d106 #include "CipherProcGlue.h"
0faf5a
3a4623 class CDriver
5fc7a1 ¤   {
14a2d3 protected:
0a4e5b ¤   static CDriver *¤   sSelf;
2767c5 ¤
8bf5e2 ¤   typedef struct
5b5b34 ¤   ¤   {
2238f3 ¤   ¤   SleepQRec¤  ¤   sleepQRec;
35e220 ¤   ¤   CDrive *¤   ¤   thisObject;
bcc6c5 ¤   ¤   Boolean¤¤   ¤   installed;
ca1586 ¤   ¤   } MySleepQRec;
501b52 ¤   ¤
719438 ¤   MySleepQRec¤¤   ¤   ¤   mSleep;
a85ab7 ¤   ulong¤  ¤   ¤   ¤   ¤   mAlertDisplayTime;
b8f779 ¤   Boolean¤¤   ¤   ¤   ¤   mHaveShownSleepAlert;
bc67c5 ¤
f00470 ¤   static pascal Boolean¤  sAlertHook(DialogPtr theDialog,
e8d7db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord *theEvent, short *itemHit);
5a70d8 ¤   Boolean¤¤   ¤   ¤   ¤   TellUserSleepingWithMountedDrives(
f86977 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param volumeName,
0f20ec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean canCancelSleep );
70ebf3 ¤   Boolean¤¤   ¤   ¤   ¤   SleepDismount( short selector );
a4b899 ¤   static pascal void¤ ¤   sSleepDismount( void );
861b52 ¤   ¤
9675b2 ¤   Boolean¤¤   ¤   ¤   ¤   mDriverIsOpen;
e46b2e ¤   PGPDiskDriverPrefs¤ ¤   mPrefs;
984c50 ¤   DCtlEntry *¤¤   ¤   ¤   mDCE;
8e66b5 ¤   const PGPDiskGlobals *¤ mPGPDiskGlobals;
59ef7c ¤   FSSpec¤ ¤   ¤   ¤   ¤   mPrefsSpec;
0c67c5 ¤
393278 ¤   void *¤ ¤   mScratchBuffer;
0702dc ¤   ulong¤  ¤   mScratchBufferSize;
8167c5 ¤
79591b ¤   void *¤ ¤   mPBArray;
6b01a4 ¤   ushort¤ ¤   mNumPBs;
4767c5 ¤
9585eb ¤   CipherProcRef¤  mCipherProcRef;
2f0945 ¤   Boolean¤¤   ¤   mCipherProcDamaged;
5c67c5 ¤
8994d9 ¤   Str255¤ ¤   ¤   mEjectStringTemplate;
3a67c5 ¤
91751b ¤   void¤   InstallSleepProc( void );
bdd417 ¤   void¤   RemoveSleepProc( void );
c4ba16 ¤   void¤   InstallOrRemoveSleepProcAsAppropriate( void );
1267c5 ¤
da5b96 ¤   OSErr¤  HandleDriverGestalt( DriverGestaltParam *pb );
5d160b ¤   OSErr¤  HandleDriverConfigure( ParamBlockRec *pb );
4267c5 ¤
9495d3 ¤   OSErr¤  HandleEjectDiskCC( CDrive *theDrive );
9220b4 ¤   OSErr¤  HandleRemoveDriveCC( short¤ driveNumber );
f559b3 ¤   OSErr¤  HandleDriveStatusSC( short driveNumber, DrvSts * driveStatus );
dbf8d1 ¤   OSErr¤  HandleGetDriveInfoSC( PGPDriveInfoStruct * info);
--5491 001240b867340120037 Page 2 of CDriver.h
e1e9b4 ¤   OSErr¤  HandleGetDriverInfoSC( PGPDriverInfoStruct * info);
913f0f ¤   OSErr¤  HandleChangeIOOptionsCC( const IOOptionsStruct¤ *options);
70a2a4 ¤   OSErr¤  HandleAddDriveCC( AddDriveStruct *¤ addInfo );
226ad7 ¤   OSErr¤  HandleOtherCC( ParamBlockRec *¤ pb);
3fc770 ¤   void¤   HandleToggleKeyBitsCC( void );
7ba79f ¤   OSErr¤  HandleDriveUnmountedCC(const PGPDriveUnmountedStruct *info);
dd67c5 ¤
dfef93 ¤   void¤   NoDrivesLeft( void );
9e48a3 ¤   void¤   DrivePeriodic( void );
42a363 ¤   void¤   UnmountAnyIdleDrives( void );
e48db0 ¤   void¤   AccRun( void );
9367c5 ¤
ed56de ¤   OSErr¤  InitCipherProc( void );
3c2637 ¤   void¤   HandleSetPrefsCC( const PGPDiskDriverPrefs *¤   newPrefs);
6541ab ¤   Boolean¤DriverIsOpen( void )¤   { return( mDriverIsOpen ); }
9474ed ¤   void¤   DisposeCipherProc( void );
ef67c5 ¤
bfc880 ¤   ulong¤  CalcScratchBufferSize( void );
a5bb7e ¤   void¤   DisposeScratchBuffer( void );
442805 ¤   OSErr¤  ChangeScratchBufferSize( ulong¤ preferredSize );
5267c5 ¤
1b1db2 ¤   void *¤ AllocatePBs( const ushort minRequired, ushort * numAllocated);
b27eb7 ¤   OSErr¤  SetNumPBs( const ushort numExtra );
6b757f ¤   void¤   DisposePBs( void );
5367c5 ¤
d0fe43 ¤   OSErr¤  ExtractFromCSParam( const ParamBlockRec *pb, void *bytes,
82a0ab ¤   ¤   ¤   ¤   ¤   ulong numBytes);
2ac022 ¤   void¤   MarkCSParamUnderstood( ParamBlockRec *¤ pb);
9267c5 ¤
a5d97e ¤   void¤   DriveHousekeeping( ·Boolean deleteUnmountedDrives = false );
3867c5 ¤
b13dc1 ¤   ¤   ¤   ¤   ¤   CDriver( void );
775ed4 public:
6d1703 ¤   virtual¤¤   ¤   ~CDriver( void );
d967c5 ¤
f4f8ac ¤   static OSErr¤   ¤   CreateDriver( CDriver **driver );
5067c5 ¤
397e0f ¤   OSErr¤  Open( DCtlEntry * dce );
e3f62d ¤   OSErr¤  Prime( ParamBlockRec * pb, DCtlEntry * dce );
3885d4 ¤   OSErr¤  Control( ParamBlockRec * pb, DCtlEntry * dce );
6a1147 ¤   OSErr¤  Status( ParamBlockRec * pb, DCtlEntry * dce );
2074b3 ¤   OSErr¤  Close( ParamBlockRec * pb, DCtlEntry * dce );
4662bd ¤   };
20af5a
bbaf5a
f5af5a
bfaf5a
24af5a
--502a 000a139d21e40120038 Page 1 of CPBQueue.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
299071 ¤   $Id: CPBQueue.cp,v 1.3.8.1 1998/11/12 03:05:41 heller Exp $
57f7f7 ____________________________________________________________________________*/
38af5a
067b7d #pragma once
93af5a
0e7cab #include <stddef.h>
08af5a
100a24 #include "CPBQueue.h"
a0af5a
69b488 #include "A4Stuff.h"
ac547d #include "SetupA4.h"
c6af5a
16af5a
d9c0a1 CPBQueue::CPBQueue()
37c7a1 ¤   {
2446cc ¤   PrepareCallback();
5b9371 ¤   }
b667c5 ¤
d5af5a
d57bbe /*_________________________________________________________________________
d75db0 ¤   This routine must be called at a time when memory may be moved
928ac7 _________________________________________________________________________*/
82ae6f CPBQueue::~CPBQueue()
48c7a1 ¤   {
9f56b0 ¤   while( ! mInProgressQueue.IsEmpty() )
8f5b34 ¤   ¤   {
2cad34 ¤   ¤   // wait till all of them are done
790fe4 ¤   ¤   }
931b52 ¤   ¤
4131d7 ¤   // items in our queue were all dynamically allocated
f9c927 ¤   // get rid of them
2918ad ¤   while ( ! mAvailableQueue.IsEmpty() )
775b34 ¤   ¤   {
30bdd3 ¤   ¤   QElem *¤pb;
ac1b52 ¤   ¤
5f2344 ¤   ¤   pb¤ = mAvailableQueue.PeekHead();
b81799 ¤   ¤   mAvailableQueue.Dequeue( pb );
90a3c4 ¤   ¤   DisposePtr( (Ptr)AvailableElemToQueuePB( pb ) );
be0fe4 ¤   ¤   }
bf9371 ¤   }
82af5a
9daf5a
cb6685 ¤   pascal void
31f836 CPBQueue::sCompletionHook( void )
22c7a1 ¤   {
d027dc ¤   CommonPBHeader *¤   pb¤ = (CommonPBHeader *)GetA0();
7167c5 ¤
9c953d ¤   EnterCodeResource();
6f67c5 ¤
279481 ¤   AssertNoErr( pb->ioResult, "CPBQueue::sCompletionHook" );
ec34af ¤   QueuePB *¤  ¤   qpb¤= PBToQueuePB( pb );
c567c5 ¤
1ad441 ¤   qpb->thisObject->Completion( qpb );
fd67c5 ¤
7c1487 ¤   ExitCodeResource();
d59371 ¤   }
82af5a
d4af5a
aa7bbe /*_________________________________________________________________________
e15db0 ¤   This routine must be called at a time when memory may be moved
c88ac7 _________________________________________________________________________*/
0c7a6a ¤   CPBQueue::QueuePB *
36d589 CPBQueue::GetPB( ·)
e7c7a1 ¤   {
828385 ¤   QElem *¤¤   elem;
0ace54 ¤   QueuePB *¤  pb¤ = nil;
f914d3 ¤   OSErr¤  ¤   err¤= noErr;
a167c5 ¤
--c297 001177c488240120038 Page 2 of CPBQueue.cp
c7ba79 ¤   elem¤   = mAvailableQueue.PeekHead();
9e1bbb ¤   if ( IsntNull( elem ) )
7c5b34 ¤   ¤   {
029af9 ¤   ¤   err¤= mAvailableQueue.Dequeue( elem );
9ab563 ¤   ¤   AssertNoErr( err, "CPBQueue::GetPB" );
5f1b52 ¤   ¤
1206ab ¤   ¤   pb¤ = AvailableElemToQueuePB( elem );
1d0fe4 ¤   ¤   }
030e24 ¤   else
575b34 ¤   ¤   {
009f87 ¤   ¤   pb¤ = (QueuePB *)NewPtrSys( sizeof( *pb ) + GetPBSize() );
b10fe4 ¤   ¤   }
1d1b52 ¤   ¤
d6dee5 ¤   if ( IsntNull( pb ) )
785b34 ¤   ¤   {
4f3b7e ¤   ¤   CommonPBHeader *¤   hdr¤= nil;
401b52 ¤   ¤
6261dd ¤   ¤   mInProgressQueue.Enqueue( &pb->inProgressElem );
4967c5 ¤
3948bd ¤   ¤   pb->thisObject¤ ¤   ¤   ¤   = this;
961b52 ¤   ¤
543d96 ¤   ¤   hdr¤= (CommonPBHeader *)&pb->pbBytes[ 0 ];
ae9f86 ¤   ¤   hdr->ioCompletion¤  = sCompletionHook;
880fe4 ¤   ¤   }
5c0e24 ¤   else
0c5b34 ¤   ¤   {
0e3b07 ¤   ¤   pgpDebugPStr( "\pcan't create pb" );
360fe4 ¤   ¤   }
1467c5 ¤
49f348 ¤   // caller should call ReleasePB when done with it
7767c5 ¤
666e70 ¤   return( pb );
8c9371 ¤   }
01af5a
cfaf5a
8aaf5a
0beacd ¤   OSErr
614663 CPBQueue::ReleasePB( QueuePB *qpb )
6cc7a1 ¤   {
1c8e70 ¤   OSErr¤  err¤= noErr;
3467c5 ¤
c3f9d9 ¤   mAvailableQueue.Enqueue( &qpb->availableElem );
fd67c5 ¤
249a27 ¤   err¤= mInProgressQueue.Dequeue( &qpb->inProgressElem );
4324fb ¤   AssertNoErr( err, "CPBQueue::GetPB" );
a967c5 ¤
1c8c17 ¤   MacDebug_FillWithGarbage( &qpb->pbBytes, GetPBSize() );
3d67c5 ¤
11deb7 ¤   return( err );
d29371 ¤   }
3daf5a
2967c5 ¤
cfaf5a
6167c5 ¤
2e67c5 ¤
8daf5a
17bd73 ¤   ¶
--5447 001c438664940120039 Page 1 of CPBQueue.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
8222c8 ¤   $Id: CPBQueue.h,v 1.2.8.1 1998/11/12 03:05:42 heller Exp $
01f7f7 ____________________________________________________________________________*/
3faf5a
f17b7d #pragma once
a3af5a
6d7cab #include <stddef.h>
b7af5a
1e4a30 #include "CMacQueue.h"
40af5a
75af5a
c0b6b5 class CPBQueue
d3c7a1 ¤   {
23a2d3 protected:
56ca29 ¤   CMacQueue¤  ¤   mAvailableQueue;
0ca1b9 ¤   CMacQueue¤  ¤   mInProgressQueue;
2d67c5 ¤
21f5e2 ¤   typedef struct
4c5b34 ¤   ¤   {
06c22e ¤   ¤   CPBQueue *¤ thisObject;
11f3ce ¤   ¤   QElem¤  ¤   inProgressElem;
05a5de ¤   ¤   QElem¤  ¤   availableElem;
469de0 ¤   ¤   uchar¤  ¤   pbBytes[ ];
3014d5 ¤   ¤   } QueuePB;
071b52 ¤   ¤
e9af5a
5bca31 ¤   typedef struct CommonPBHeader
1e5b34 ¤   ¤   {
e66338 ¤   ¤   QElemPtr¤   ¤   ¤   ¤   ¤   ¤   qLink;
8d2a42 ¤   ¤   short¤  ¤   ¤   ¤   ¤   ¤   ¤   qType;
e74c1b ¤   ¤   short¤  ¤   ¤   ¤   ¤   ¤   ¤   ioTrap;
aaf0d6 ¤   ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   ¤   ioCmdAddr;
b76ed0 ¤   ¤   IOCompletionUPP¤¤   ¤   ¤   ¤   ioCompletion;
a4e3f6 ¤   ¤   OSErr¤  ¤   ¤   ¤   ¤   ¤   ¤   ioResult;
b51fe3 ¤   ¤   StringPtr¤  ¤   ¤   ¤   ¤   ¤   ioNamePtr;
b0966f ¤   ¤   } CommonPBHeader;
2267c5 ¤
2a5071 ¤   static CommonPBHeader *¤QueuePBToCommonPBHeader( QueuePB *pb )
b3cf02 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( (CommonPBHeader *)
da12d1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &pb->pbBytes[ 0 ] ); }
2caf5a
77a39c ¤   static QueuePB *¤   PBToQueuePB( const void *pb )
d60587 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( (QueuePB *)((Ptr)pb -
722623 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   offsetof( QueuePB, pbBytes )) ); }
74af5a
492490 ¤   static QueuePB *¤   AvailableElemToQueuePB( const QElem *elem )
939bb2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {¤  return( (QueuePB *)((Ptr)elem -
e68625 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   offsetof( QueuePB, availableElem )) );¤ }
0eaf5a
feaf5a
3caf5a
8c921f ¤   static pascal void¤ ¤   sCompletionHook( void );
5e67c5 ¤
887551 ¤   virtual ulong¤  ¤   ¤   GetPBSize( void ) = 0;
089ed5 ¤   virtual QueuePB *¤  ¤   GetPB( void );
0db639 ¤   virtual OSErr¤  ¤   ¤   ReleasePB( QueuePB *pb );
3a67c5 ¤
935305 ¤   virtual void¤   ¤   ¤   Completion( QueuePB *pb )
74eec1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { ReleasePB( pb ); }
f767c5 ¤
5f5ed4 public:
31e774 ¤   ¤   ¤   ¤   ¤   ¤   CPBQueue( void );
4f1b41 ¤   virtual¤¤   ¤   ¤   ~CPBQueue( void );
c45298 ¤   };¶
--f64e 001c1db36224012003a Page 1 of PGPDiskDRVR.prefix
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
176a39 ¤   $Id: PGPDiskDRVR.prefix,v 1.6.8.1 1998/11/12 03:05:42 heller Exp $
5bf7f7 ____________________________________________________________________________*/
b8af5a
c7e1a1 // because we're in a driver we don't want to patch any traps
816940 #define USE_MAC_DEBUG_PATCHES¤  ¤   ¤   0 ¤
2ca26e #define MEMORY_ALLOC_MUST_BE_SYS¤   ¤   1
bcaf5a
a9b18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
1b6068 #define UNFINISHED_CODE_ALLOWED¤¤   0
26af5a
8901d8 #include <MacHeaders68K>
c5af5a
d5af5a
34f692 #include "PGPDiskShared.prefix"
c6af5a
7faf5a
132d64 #define BLIND_WRITES¤   ¤   0
f3af5a
ce2c89 #define USE_LOG¤¤   0
89af5a
ab9b48 #if USE_LOG
b6ee83 #include "CLog.h"
a1277e extern CLog *¤  gLog;
dbaf5a
51af5a
5d04a4 inline void¤LogMsg( const char *msg)
d96cf4 ¤   ¤   { if ( IsntNull( gLog ) ) { gLog->Append( msg ); } };
73c9d3 inline void¤LogMsg( const uchar *msg)
306cf4 ¤   ¤   { if ( IsntNull( gLog ) ) { gLog->Append( msg ); } };
fcaf5a
c7db21 #else
a3af5a
816874 #define LogMsg( x )
82af5a
f27454 #endif
a3af5a
2eaf5a
caaf39 #define ALLOW_VM_PAGING¤¤   0
7caf5a
a4af5a
4daf5a
c1c221 #define INSTRUMENT¤ ¤   1¶
--dbb4 001a5bc16894012003b Page 1 of PGPDiskDRVRDebug.prefix
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
e8ea2b ¤   $Id: PGPDiskDRVRDebug.prefix,v 1.4.8.1 1998/11/12 03:05:43 heller Exp $
1ef7f7 ____________________________________________________________________________*/
96af5a
ace1a1 // because we're in a driver we don't want to patch any traps
906940 #define USE_MAC_DEBUG_PATCHES¤  ¤   ¤   0 ¤
9ca26e #define MEMORY_ALLOC_MUST_BE_SYS¤   ¤   1
a7af5a
cda853 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1
f879b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
c8af5a
0901d8 #include <MacHeaders68K>
45af5a
17af5a
26f692 #include "PGPDiskShared.prefix"
50af5a
55af5a
372d64 #define BLIND_WRITES¤   ¤   0
acaf5a
772c89 #define USE_LOG¤¤   0
57af5a
3d9b48 #if USE_LOG
64ee83 #include "CLog.h"
1d277e extern CLog *¤  gLog;
7daf5a
6daf5a
be04a4 inline void¤LogMsg( const char *msg)
166cf4 ¤   ¤   { if ( IsntNull( gLog ) ) { gLog->Append( msg ); } };
89c9d3 inline void¤LogMsg( const uchar *msg)
c46cf4 ¤   ¤   { if ( IsntNull( gLog ) ) { gLog->Append( msg ); } };
fdaf5a
4fdb21 #else
9eaf5a
2a6874 #define LogMsg( x )
b5af5a
d07454 #endif
bfaf5a
e4af5a
6daf39 #define ALLOW_VM_PAGING¤¤   0
10af5a
48af5a
aeaf5a
a5c221 #define INSTRUMENT¤ ¤   1¶
--ef7e 0008ea3b0994012003c Page 1 of PGPDiskDRVRHeader.c
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
c8ef0b ¤   $Id: PGPDiskDRVRHeader.c,v 1.5.8.1 1998/11/12 03:05:43 heller Exp $
e7f7f7 ____________________________________________________________________________*/
9ad83c ·
f58c9b #include <DriverGestalt.h>
34af5a
ce50c5 #include "PGPDiskDRVRMain.h"
08af5a
0faf5a
ba9040 #include <A4Stuff.h>
c6fb9f #pragma near_code¤  ¤   ¤   // IMPORTANT
b5af5a
d4af5a
887bbe /*_________________________________________________________________________
6bf308 ¤   IMPORTANT NOTE:
8567c5 ¤
4a71ad ¤   This driver uses the library MyCustomCRStartup.Lib. ·This library is
8fa7b9 ¤   exactly the same as 'MSL CustomCRStartup.Lib'. ·However, the CW 11 MSL
43256b ¤   2.1.1 update screwed up this library so that the project options are all
860e05 ¤   wrong, creating a library that crashes.
7067c5 ¤
b82855 ¤   (1) ·"Use Unsigned Chars" option was on. ·It must be off or the wrong code
fa40db ¤   is generated; the code assumes that the type 'char' sign extends.
13851a ¤   (2) A5 relative globals were set up (they should be A4)
a22034 ¤   (3) The flags should be defined as follows:
e66135 ¤   ¤   #define STARTUP¤¤   LIBCODE
1fe549 ¤   ¤   #define DRIVER¤ ¤   0
5c67c5 ¤
58734b ¤   Hopefully they'll have fixed this in CW 12.
1b8ac7 _________________________________________________________________________*/
9caf5a
52a677 void __Startup__(void);
f6af5a
7eaf5a
8e1e3c static pascal OSErr¤DRVROpen__( ParamBlockRec * pb, DCtlEntry * dce );
baaf5a
eaaf5a
9c326f //long¤ __codereftype__ ·= '000c';
c2fe20 //short¤__maincodexnum__ = 12345;¤  // resource id used for main code
ce4398 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // resource segment
4caf5a
d1af5a
d2e05c asm void __Startup__()
f4bb36 {
9e5eba ¤   DC.w¤   ¤   dCtlEnableMask | ¤  \
fd8414 ¤   ¤   ¤   ¤   dStatEnableMask |¤  \
dfc8b9 ¤   ¤   ¤   ¤   dWritEnableMask | ¤ \
1e071c ¤   ¤   ¤   ¤   dReadEnableMask |¤  \
2839af ¤   ¤   ¤   ¤   dNeedLockMask |¤¤   \
7a0b70 ¤   ¤   ¤   ¤   kmDriverGestaltEnableMask
8438e5 /*
3efd50 ;
eb8512 ; Next is the the drvrDelay (IM II-188), set only if dNeedTime flag set above
8ffd50 ;
e17fe0 */
fd0b4a ¤   DC.W¤   ¤   5*60¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // 5 sec periodic update
c538e5 /*
c4fd50 ;
3948ab ; Next is the the drvrEMask (IM I-444), which events DA can respond to...
0979be ; Must be NIL for drivers, for DA's choose from
7c4b4e ;¤  mouseDown¤  ¤   mouse button down is event 1
a9e6aa ;¤  keyDown¤¤   ¤   key down is event 3
4145d0 ;¤  keyUp¤  ¤   ¤   key up is event 4
7a6a47 ;¤  autoKey¤¤   ¤   auto-repeated key is event 5
062b1d ;¤  updateEvt¤  ¤   update event
166355 ;¤  activateEvt¤¤   activate/deactive event
f0fd50 ;
c8af5a
8e7fe0 */
--8ebf 0007dc7f3394012003c Page 2 of PGPDiskDRVRHeader.c
a87f7b ¤   DC.W¤   ¤   0¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // BIL for drivers
1738e5 /*
09fd50 ;
d04511 ; Next is the the drvrMenu (IM I-444), Menu ID of DA's menu, or NIL
17fd50 ;
f17fe0 */
82a38e ¤   DC.W¤   ¤   0¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // No associated menu
e938e5 /*
3bfd50 ;
54dce2 ; Next are the offsets to the main routines of the driver/DA
b0fd50 ;
647fe0 */
ccbdb8 //Note the addition necessary to get the proper address--the number of bytes·
6d26c2 //from the beginning
a8cb66 ¤   DC.W¤   ¤   daOpen¤ ¤   + 8¤¤   ¤   ¤   ¤   // Open routine
8c8652 ¤   DC.W¤   ¤   daPrime¤ ¤  + 10¤   ¤   ¤   ¤   // Prime - unused for DA's
505805 ¤   DC.W¤   ¤   daControl¤  + 12¤   ¤   ¤   ¤   // Control
6f3f7b ¤   DC.W¤   ¤   daStatus¤   + 14¤   ¤   ¤   ¤   // Status - unused for DA's
66868f ¤   DC.W¤   ¤   daClose¤¤   + 16¤   ¤   ¤   ¤   // Close·
33af5a
0fd921 ¤   DC.B¤   ¤   "\p.PGPDisk000" ¤   ¤   ¤   ¤   ¤   // DRVR Name
fcbd16 Padding:
a9e46f ¤   ds.l ¤  ¤   5¤  ¤   ¤   //DAName+32 Pad string out to 32 bytes total
37af5a
e9d249 daOpen:
83c151 ¤   pea ¤   ¤   DRVROpen__
1ef05f ¤   bra.s ····¤ start
59f95d daPrime:
303aa6 ¤   pea ¤   ¤   DRVRPrime
8ef05f ¤   bra.s ····¤ start
6969ed daControl:
0b1df2 ¤   pea ¤   ¤   DRVRControl
6cf05f ¤   bra.s ····¤ start
25dfc9 daStatus:
4c1d63 ¤   pea ¤   ¤   DRVRStatus
26f05f ¤   bra.s ····¤ start
6ac993 daClose:
9f7f87 ¤   pea ¤   ¤   DRVRClose
1b87c7 ¤   ¤   ¤
fca27a start:
43aedc ¤   move.l¤ ··a4,-(sp)¤ // save data segment pointer·
9f6b0b ¤   movem.l ··a0/a1,-(sp)
970066 ¤   clr.w ····-(sp)
6541b2 ¤   move.l ···a0,-(sp)
73c00d ¤   move.l ···a1,-(sp)
dd25eb ¤   jsr¤¤   ··SetCurrentA4¤ // Setup A4 so we can address regular data
00bc61 ¤   movea.l ··0x0016(sp),a0
1de7eb ¤   jsr ······(a0)
6ecdea ¤   move.w ···(sp)+,d0
e751ec ¤   movem.l ··(sp)+,a0/a1
903c4b ¤   move.l¤ ··(sp)+,a4¤ // restore data segment pointer
6beb01 ¤   addq.w ···#0x4,sp¤  // get rid of address of function we pushed
31668a ¤   cmp.w¤  ··#1,d0¤¤   // main returns 1 if async request cannot be completed
37ee97 ¤   beq.s¤  ··uncomp
9cc569 ¤   btst¤   ··#1,struct(IOParam.ioTrap)(a0)¤// test if this was an immed TRAP
5c529e ¤   bne.s¤  ··end
72f609 ¤   move.l¤ ··0x08FC,-(sp)¤ // JIODone
0d2a24 end:¤
9d18c2 ¤   rts
41dc9a uncomp:¤
f6bedb ¤   moveq¤  ··#0,d0
6718c2 ¤   rts
1567c5 ¤
92efe6 }
c9af5a
ecaf5a
b77bbe /*_________________________________________________________________________
3accaa ¤   Special stub:
01196c ¤   __SetupMainRsrc__ should be called once and only once and must be·
0f503a ¤   #pragma near code, so it should remain in this file
c08ac7 _________________________________________________________________________*/
7daf5a
--61ca 0017edd26a94012003c Page 3 of PGPDiskDRVRHeader.c
830a53 ¤   static pascal OSErr
14d6d2 DRVROpen__(
cd9177 ¤   ParamBlockRec *¤pb,
aa4e15 ¤   DCtlEntry *¤¤   dce)
3bc7a1 ¤   {
686c30 // IMPORTANT: #pragma near_code¤ must be on
97370f // near_data must be off (but can't be set via pragma)
7c1e9c #pragma near_code
3a894d ¤   static Boolean¤ sCodeIsSetup¤   = false;
3867c5 ¤
bc7adf ¤   if ( ! sCodeIsSetup )
9d5b34 ¤   ¤   {
2e7985 ¤   ¤   __SetupMainRsrc__( &__Startup__ );
e93c34 ¤   ¤   sCodeIsSetup¤   = TRUE;
1a0fe4 ¤   ¤   }
981b52 ¤   ¤
89f7bd ¤   return( DRVROpen( pb, dce ) );
ec9371 ¤   }
3e67c5 ¤
82af5a
9daf5a
b81b52 ¤   ¤
0367c5 ¤
7467c5 ¤
5e67c5 ¤
58af5a
32af5a
5caf5a
6caf5a
7eaf5a
--e8c7 001af59c2ee4012003d Page 1 of PGPDiskDRVRMain.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
db407d ¤   $Id: PGPDiskDRVRMain.h,v 1.2.8.1 1998/11/12 03:05:44 heller Exp $
29f7f7 ____________________________________________________________________________*/
beaf5a
b07b7d #pragma once
86af5a
343379 #ifdef __cplusplus
ac6dad extern "C" {
7b7454 #endif
f6af5a
054592 pascal OSErr¤   DRVROpen( ParamBlockRec * pb, DCtlEntry * dce );
e5e456 pascal OSErr¤   DRVRPrime( ParamBlockRec * pb, DCtlEntry * dce );
e3a22b pascal OSErr¤   DRVRControl( ParamBlockRec * pb, DCtlEntry * dce );
e5dc01 pascal OSErr¤   DRVRStatus( ParamBlockRec * pb, DCtlEntry * dce );
7466c8 pascal OSErr¤   DRVRClose( ParamBlockRec * pb, DCtlEntry * dce );
5967c5 ¤
2f67c5 ¤
0e527b #pragma parameter __SetupMainRsrc__(__D0)
548b60 void¤   ¤   ¤   __SetupMainRsrc__( void *codeStart );
9054d9 extern void¤¤   __Startup__( void );
83af5a
2b3379 #ifdef __cplusplus
01efe6 }
af2841 #endif¶
--cf64 00044916f824012003e Page 1 of PGPDiskCastCFB.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
ee1e69 ¤   $Id: PGPDiskCastCFB.cp,v 1.3.8.1 1998/11/12 03:05:46 heller Exp $
78f7f7 ____________________________________________________________________________*/
a1af5a
90324c #include <string.h>
800d08 #include "pgpMem.h"
bbd1a5 #include "PGPDiskCASTCFB.h"
0baf5a
75af5a
dfaf5a
ab6d52 ¤   void
fec51b CASTCFB_Init(
bfcf1d ¤   CASTCFBContext *¤   context,
e51830 ¤   const byte *¤   ¤   keyToExpand)
9bbb36 {
dab436 ¤   pgpAssertAddrValid( context, CASTCFBContext );
e6ad81 ¤   pgpAssertAddrValid( keyToExpand, byte );
4067c5 ¤
827460 ¤   CAST5schedule( context->expandedKey.keyWords, keyToExpand);
82efe6 }
a0af5a
11af5a
b4af5a
afafcb void CASTCFB_Destroy(CASTCFBContext *context)
33bb36 {
0bb436 ¤   pgpAssertAddrValid( context, CASTCFBContext );
ca67c5 ¤
7c8e85 ¤   pgpClearMemory( context, sizeof( *context ) );
8cefe6 }
d6af5a
12af5a
bababf // Note this version of CFB for CAST is optimized for
53c484 // blocks that are multiples of 8 bytes only. ·It does not
d03056 // work on unevenly sized blocks.
e1af5a
146d52 ¤   void
99f07e CASTCFB_Encrypt(
278f57 ¤   const CASTCFBContext¤   *context,
a9bc85 ¤   const UInt32 *¤ ¤   ¤   iv,
fecd15 ¤   const UInt32 *¤ ¤   ¤   src,
835ff0 ¤   UInt32 *¤   ¤   ¤   ¤   dest,
c8e831 ¤   UInt32¤ ¤   ¤   ¤   ¤   byteCount)
5ebb36 {
5f1784 ¤   const UInt32 *¤ src32¤  = (const UInt32 *)src;
608792 ¤   UInt32 *¤   ¤   dest32¤ = (UInt32 *)dest;
7ecc19 ¤   UInt32¤ ¤   ¤   num8ByteChunks;
d79dea ¤   UInt32¤ ¤   ¤   tempIV[ 2 ];
3167c5 ¤
6c3d92 ¤   // note: these UInt32 ptrs may actually be misaligned
7d8663 ¤   pgpAssert( IsntNull( src ) );
ceaa72 ¤   pgpAssert( IsntNull( dest ) );
c867c5 ¤
85b436 ¤   pgpAssertAddrValid( context, CASTCFBContext );
e7ad03 ¤   pgpAssert( ( byteCount % 8 ) == 0 );
d7558a ¤   pgpAssert( sizeof( iv[ 0 ] ·) == sizeof( UInt32 ) );
0a67c5 ¤
552205 ¤   tempIV[ 0 ]¤= iv[ 0 ];
fa616b ¤   tempIV[ 1 ]¤= iv[ 1 ];
14af5a
4262fc ¤   num8ByteChunks¤ = byteCount / 8;
ebe2c8 ¤   while ( num8ByteChunks-- != 0 )
b5c7a1 ¤   {
2dd8d4 ¤   ¤   CAST5encrypt( (const byte *)tempIV, (byte *)tempIV,
15c29d ¤   ¤   ¤   ¤   context->expandedKey.keyWords );
181b52 ¤   ¤
f83bae ¤   ¤   tempIV[ 0 ]¤¤   ^=¤ *src32++;
7892f3 ¤   ¤   tempIV[ 1 ]¤¤   ^=¤ *src32++;
12e7d0 ¤   ¤   *dest32++¤  ¤   =¤  tempIV[ 0 ];
44ec94 ¤   ¤   *dest32++¤  ¤   =¤  tempIV[ 1 ];
--55e3 00157e54a894012003e Page 2 of PGPDiskCastCFB.cp
a19371 ¤   }
c9efe6 }
a0af5a
67af5a
20af5a
986d52 ¤   void
8d1aef CASTCFB_Decrypt(
d103e9 ¤   const CASTCFBContext *¤ context,
e9bc85 ¤   const UInt32 *¤ ¤   ¤   iv,
14cd15 ¤   const UInt32 *¤ ¤   ¤   src,
3d5ff0 ¤   UInt32 *¤   ¤   ¤   ¤   dest,
01e831 ¤   UInt32¤ ¤   ¤   ¤   ¤   byteCount)
9cbb36 {
7bb05a ¤   const UInt32 *¤ src32;
71b972 ¤   UInt32 *¤   ¤   dest32;
c2a980 ¤   UInt32¤ ¤   ¤   blocks;
449dea ¤   UInt32¤ ¤   ¤   tempIV[ 2 ];
8c67c5 ¤
ba3d92 ¤   // note: these UInt32 ptrs may actually be misaligned
788663 ¤   pgpAssert( IsntNull( src ) );
bcaa72 ¤   pgpAssert( IsntNull( dest ) );
9567c5 ¤
59b436 ¤   pgpAssertAddrValid( context, CASTCFBContext );
9ead03 ¤   pgpAssert( ( byteCount % 8 ) == 0 );
8a558a ¤   pgpAssert( sizeof( iv[ 0 ] ·) == sizeof( UInt32 ) );
cd67c5 ¤
6824ea ¤   src32¤  = src;
f30f3c ¤   dest32¤ = (UInt32 *)dest;
3067c5 ¤
102205 ¤   tempIV[ 0 ]¤= iv[ 0 ];
01616b ¤   tempIV[ 1 ]¤= iv[ 1 ];
eeaf5a
a8d620 ¤   for( blocks = byteCount / 8 ; blocks; blocks--)
48c7a1 ¤   {
29de62 ¤   ¤   UInt32¤ niv32_1;¤   // these variables are required to
7def67 ¤   ¤   UInt32¤ niv32_2;¤   // allow src & dest to overlap
e51b52 ¤   ¤
2b08fc ¤   ¤   // yes, call CAST5encrypt, not CAST5decrypt
d2d8d4 ¤   ¤   CAST5encrypt( (const byte *)tempIV, (byte *)tempIV,
59abbb ¤   ¤   ¤   ¤   context->expandedKey.keyWords);
281b52 ¤   ¤
26d870 ¤   ¤   niv32_1¤¤   ¤   = *src32++;
5e2b86 ¤   ¤   niv32_2¤¤   ¤   = *src32++;
8d11fa ¤   ¤   *dest32++¤  ¤   = tempIV[ 0 ] ^ niv32_1;
67b6b4 ¤   ¤   *dest32++¤  ¤   = tempIV[ 1 ] ^ niv32_2;
49f3ce ¤   ¤   tempIV[ 0 ]¤¤   = niv32_1;
b48fe3 ¤   ¤   tempIV[ 1 ]¤¤   = niv32_2;
7d9371 ¤   }
93efe6 }
7aaf5a
e8af5a
95af5a
a6af5a
d0af5a
c3af5a
f7af5a
8daf5a
57af5a
--b46e 00183daceb34012003f Page 1 of PGPDiskCastCFB.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
fb3adc ¤   $Id: PGPDiskCastCFB.h,v 1.2.8.1 1998/11/12 03:05:46 heller Exp $
aff7f7 ____________________________________________________________________________*/
b5af5a
ca7b7d #pragma once
32af5a
369ed3 #include "cast5.h"
dbaf5a
9eaf5a
7683ea typedef struct ExpandedCASTKey
dec7a1 ¤   {
e72c11 ¤   word32¤ keyWords[32];
235da3 ¤   } ExpandedCASTKey;
0967c5 ¤
2667c5 ¤
c3debc typedef struct CASTCFBContext
f7bb36 {
488fd4 ¤   ExpandedCASTKey¤¤   expandedKey;
18b8c6 } CASTCFBContext;
ffaf5a
a62df1 void CASTCFB_InitIV(const UInt32 *iv, UInt32 *initMe);
afbf12 void CASTCFB_Init(CASTCFBContext *context, const byte *keyToExpand);
ae7850 void CASTCFB_Destroy(CASTCFBContext *context);
3696d7 void CASTCFB_Encrypt( const CASTCFBContext *context, const UInt32 *iv,
f6ac62 ¤   ¤   ¤   const UInt32 *src, UInt32 *dest, UInt32 byteCount);
4a8b0c void CASTCFB_Decrypt( const CASTCFBContext *context, const UInt32 *iv,
fdac62 ¤   ¤   ¤   const UInt32 *src, UInt32 *dest, UInt32 byteCount);
09af5a
83af5a
--37ce 0002972ed3b40120040 Page 1 of SHA.cpp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
0c7a67 ¤   $Id: SHA.cpp,v 1.4.8.1 1998/11/12 03:05:47 heller Exp $
a5f7f7 ____________________________________________________________________________*/
2daf5a
25c110 #include "pgpMacMemory.h"
35af5a
20324c #include <string.h>
18af5a
504818 #include "SHA.h"
1aaf5a
87e889 #define f1(x,y,z)¤  ( z ^ (x & (y ^ z) ) )¤ ¤   ¤   // Rounds ·0-19
b0a967 #define f2(x,y,z)¤  ( x ^ y ^ z )¤  ¤   ¤   ¤   ¤   // Rounds 20-39
183fbd #define f3(x,y,z)¤  ( (x & y) | (z & (x | y) ) )¤   // Rounds 40-59
b7a772 #define f4(x,y,z)¤  ( x ^ y ^ z )¤  ¤   ¤   ¤   ¤   // Rounds 60-79
7baf5a
db5a1b // The SHS Mysterious Constants
2eaf5a
7584d8 #define K1¤ 0x5A827999L¤¤   // Rounds ·0-19
663b98 #define K2¤ 0x6ED9EBA1L¤¤   // Rounds 20-39
a54215 #define K3¤ 0x8F1BBCDCL¤¤   // Rounds 40-59
9fed52 #define K4¤ 0xCA62C1D6L¤¤   // Rounds 60-79
9caf5a
0fe030 // SHS initial values
7baf5a
749992 #define h0init¤ 0x67452301L
759c22 #define h1init¤ 0xEFCDAB89L
e85d79 #define h2init¤ 0x98BADCFEL
47a570 #define h3init¤ 0x10325476L
3e836c #define h4init¤ 0xC3D2E1F0L
c9af5a
744bb5 // 32-bit rotate left - kludged with shifts
50af5a
7b65a8 #define ROTL(n,X) ·( (X << n) | (X >> (32-n)) )
1caf5a
800d72 // The hash function is defined over an 80-word expanded input array W,
ab2170 // ·where the first 16 are copies of the input data, and the remaining 64
280dd1 // ·are defined by W[i] = W[i-16] ^ W[i-14] ^ W[i-8] ^ W[i-3]. ·This
aedd27 // ·implementation generates these values on the fly in a circular buffer.
e0af5a
d7420d // The new (corrected) SHA
5fcc06 #define expand(W,i) (W[i&15] ^= W[(i-14)&15] ^ W[(i-8)&15] ^ W[(i-3)&15], \
c72f62 ·····················W[i&15] = ROTL(1, W[i&15]))
b0af5a
08548f // The fundamental sub-round is
5dc79d // a' = e + ROTL(5,a) + f(b, c, d) + k + data;
737434 // b' = a;
665399 // c' = ROTL(30,b);
0edc3d // d' = c;
e8d187 // e' = d;
55240b // ... but this is implemented by unrolling the loop 5 times and renaming
fecfe4 // the variables (e,a,b,c,d) = (a',b',c',d',e') each iteration.
5faf5a
de0d73 #define subRound(a, b, c, d, e, f, k, data) \
6e3801 ¤   ( e += ROTL(5,a) + f(b, c, d) + k + data, b = ROTL(30, b) )
49af5a
da2978 static void
bb8c0e byteReverse(ulong *buf, ulong byteCount)
81bb36 {
e2ba65 ¤   static uchar¤   bytes[4];
3007cb ¤   ulong¤  value;
6eaf5a
7c0f69 ¤   byteCount /= sizeof(ulong);
242f4a ¤   while ( byteCount-- )
e5c7a1 ¤   {
2ed744 ¤   ¤   value = *buf;
7b93b3 ¤   ¤   bytes[0] = (uchar)(value >> 24);
ffe541 ¤   ¤   bytes[1] = (uchar)(value >> 16);
33b033 ¤   ¤   bytes[2] = (uchar)(value >> 8);
29dbb6 ¤   ¤   bytes[3] = (uchar)(value);
--c62e 0003ed0bc2040120040 Page 2 of SHA.cpp
c97925 ¤   ¤   *buf++ = *(ulong*)bytes;
be1b52 ¤   ¤
63c547 /*¤ ¤   value = ( value & 0xFF00FF00L ) >> 8 ·| \
e8512c ¤   ¤   ¤   ( value & 0x00FF00FFL ) << 8;
771f9b ¤   ¤   *buf++ = value << 16 ·| ·value >> 16 ; */
579371 ¤   }
b7efe6 }
e3af5a
7cbc5f /* The above code is replicated 20 times for each of the 4 functions,
1055dc ···using the next 20 values from the W[] array each time. */
39af5a
e4e506 SHA::SHA(void)
87bb36 {
184089 ¤   Init();
05efe6 }
43af5a
41314a void
e5b653 SHA::Init(void)
b1bb36 {
af5150 ¤   // Set the h-vars to their initial values
adab0e ¤   mDigest.longs[0] = h0init;
4c3176 ¤   mDigest.longs[1] = h1init;
fb97ef ¤   mDigest.longs[2] = h2init;
230d97 ¤   mDigest.longs[3] = h3init;
90d2cc ¤   mDigest.longs[4] = h4init;
b0af5a
dd92ae ¤   // Initialise bit count
1e7c85 ¤   mCountLo = mCountHi = 0;
65efe6 }
3eaf5a
20314a void
c8e428 SHA::Transform(void)
31bb36 {
4083bf ¤   register ulong A, B, C, D, E;
0daf5a
d525de ¤   // Set up first buffer
1c3e16 ¤   A = mDigest.longs[0];
8bd15b ¤   B = mDigest.longs[1];
5b5dcb ¤   C = mDigest.longs[2];
f007d0 ¤   D = mDigest.longs[3];
f0f9ac ¤   E = mDigest.longs[4];
65af5a
42780b ¤   // Heavy mangling, in 4 sub-rounds of 20 interations each.
635d60 ¤   subRound( A, B, C, D, E, f1, K1, mData[ 0] );
91f4ae ¤   subRound( E, A, B, C, D, f1, K1, mData[ 1] );
cee691 ¤   subRound( D, E, A, B, C, f1, K1, mData[ 2] );
56d157 ¤   subRound( C, D, E, A, B, f1, K1, mData[ 3] );
b824ff ¤   subRound( B, C, D, E, A, f1, K1, mData[ 4] );
1549e7 ¤   subRound( A, B, C, D, E, f1, K1, mData[ 5] );
9ee87f ¤   subRound( E, A, B, C, D, f1, K1, mData[ 6] );
53f216 ¤   subRound( D, E, A, B, C, f1, K1, mData[ 7] );
9efc72 ¤   subRound( C, D, E, A, B, f1, K1, mData[ 8] );
001120 ¤   subRound( B, C, D, E, A, f1, K1, mData[ 9] );
4a777c ¤   subRound( A, B, C, D, E, f1, K1, mData[10] );
9fdeb2 ¤   subRound( E, A, B, C, D, f1, K1, mData[11] );
becc8d ¤   subRound( D, E, A, B, C, f1, K1, mData[12] );
08fb4b ¤   subRound( C, D, E, A, B, f1, K1, mData[13] );
150ee3 ¤   subRound( B, C, D, E, A, f1, K1, mData[14] );
5163fb ¤   subRound( A, B, C, D, E, f1, K1, mData[15] );
a38b1e ¤   subRound( E, A, B, C, D, f1, K1, expand(mData, 16) );
70d243 ¤   subRound( D, E, A, B, C, f1, K1, expand(mData, 17) );
2b33d0 ¤   subRound( C, D, E, A, B, f1, K1, expand(mData, 18) );
b17020 ¤   subRound( B, C, D, E, A, f1, K1, expand(mData, 19) );
2eaf5a
65c826 ¤   subRound( A, B, C, D, E, f2, K2, expand(mData, 20) );
de885e ¤   subRound( E, A, B, C, D, f2, K2, expand(mData, 21) );
2bd955 ¤   subRound( D, E, A, B, C, f2, K2, expand(mData, 22) );
d40164 ¤   subRound( C, D, E, A, B, f2, K2, expand(mData, 23) );
225a6e ¤   subRound( B, C, D, E, A, f2, K2, expand(mData, 24) );
5ddca1 ¤   subRound( A, B, C, D, E, f2, K2, expand(mData, 25) );
20948f ¤   subRound( E, A, B, C, D, f2, K2, expand(mData, 26) );
3ecdd2 ¤   subRound( D, E, A, B, C, f2, K2, expand(mData, 27) );
--c49a 0003155933c40120040 Page 3 of SHA.cpp
342c41 ¤   subRound( C, D, E, A, B, f2, K2, expand(mData, 28) );
9b6fb1 ¤   subRound( B, C, D, E, A, f2, K2, expand(mData, 29) );
2b57f3 ¤   subRound( A, B, C, D, E, f2, K2, expand(mData, 30) );
47178b ¤   subRound( E, A, B, C, D, f2, K2, expand(mData, 31) );
394680 ¤   subRound( D, E, A, B, C, f2, K2, expand(mData, 32) );
d09eb1 ¤   subRound( C, D, E, A, B, f2, K2, expand(mData, 33) );
50c5bb ¤   subRound( B, C, D, E, A, f2, K2, expand(mData, 34) );
d44374 ¤   subRound( A, B, C, D, E, f2, K2, expand(mData, 35) );
2d0b5a ¤   subRound( E, A, B, C, D, f2, K2, expand(mData, 36) );
625207 ¤   subRound( D, E, A, B, C, f2, K2, expand(mData, 37) );
b5b394 ¤   subRound( C, D, E, A, B, f2, K2, expand(mData, 38) );
4af064 ¤   subRound( B, C, D, E, A, f2, K2, expand(mData, 39) );
1daf5a
7f05b1 ¤   subRound( A, B, C, D, E, f3, K3, expand(mData, 40) );
1a45c9 ¤   subRound( E, A, B, C, D, f3, K3, expand(mData, 41) );
0014c2 ¤   subRound( D, E, A, B, C, f3, K3, expand(mData, 42) );
4cccf3 ¤   subRound( C, D, E, A, B, f3, K3, expand(mData, 43) );
7c97f9 ¤   subRound( B, C, D, E, A, f3, K3, expand(mData, 44) );
921136 ¤   subRound( A, B, C, D, E, f3, K3, expand(mData, 45) );
255918 ¤   subRound( E, A, B, C, D, f3, K3, expand(mData, 46) );
630045 ¤   subRound( D, E, A, B, C, f3, K3, expand(mData, 47) );
aae1d6 ¤   subRound( C, D, E, A, B, f3, K3, expand(mData, 48) );
2ba226 ¤   subRound( B, C, D, E, A, f3, K3, expand(mData, 49) );
cc9a64 ¤   subRound( A, B, C, D, E, f3, K3, expand(mData, 50) );
d8da1c ¤   subRound( E, A, B, C, D, f3, K3, expand(mData, 51) );
918b17 ¤   subRound( D, E, A, B, C, f3, K3, expand(mData, 52) );
255326 ¤   subRound( C, D, E, A, B, f3, K3, expand(mData, 53) );
f6082c ¤   subRound( B, C, D, E, A, f3, K3, expand(mData, 54) );
8e8ee3 ¤   subRound( A, B, C, D, E, f3, K3, expand(mData, 55) );
4dc6cd ¤   subRound( E, A, B, C, D, f3, K3, expand(mData, 56) );
829f90 ¤   subRound( D, E, A, B, C, f3, K3, expand(mData, 57) );
cc7e03 ¤   subRound( C, D, E, A, B, f3, K3, expand(mData, 58) );
053df3 ¤   subRound( B, C, D, E, A, f3, K3, expand(mData, 59) );
4faf5a
56c0bf ¤   subRound( A, B, C, D, E, f4, K4, expand(mData, 60) );
ef80c7 ¤   subRound( E, A, B, C, D, f4, K4, expand(mData, 61) );
07d1cc ¤   subRound( D, E, A, B, C, f4, K4, expand(mData, 62) );
5809fd ¤   subRound( C, D, E, A, B, f4, K4, expand(mData, 63) );
1b52f7 ¤   subRound( B, C, D, E, A, f4, K4, expand(mData, 64) );
7dd438 ¤   subRound( A, B, C, D, E, f4, K4, expand(mData, 65) );
229c16 ¤   subRound( E, A, B, C, D, f4, K4, expand(mData, 66) );
69c54b ¤   subRound( D, E, A, B, C, f4, K4, expand(mData, 67) );
3224d8 ¤   subRound( C, D, E, A, B, f4, K4, expand(mData, 68) );
e16728 ¤   subRound( B, C, D, E, A, f4, K4, expand(mData, 69) );
5d5f6a ¤   subRound( A, B, C, D, E, f4, K4, expand(mData, 70) );
0c1f12 ¤   subRound( E, A, B, C, D, f4, K4, expand(mData, 71) );
f94e19 ¤   subRound( D, E, A, B, C, f4, K4, expand(mData, 72) );
5a9628 ¤   subRound( C, D, E, A, B, f4, K4, expand(mData, 73) );
2bcd22 ¤   subRound( B, C, D, E, A, f4, K4, expand(mData, 74) );
734bed ¤   subRound( A, B, C, D, E, f4, K4, expand(mData, 75) );
2e03c3 ¤   subRound( E, A, B, C, D, f4, K4, expand(mData, 76) );
e55a9e ¤   subRound( D, E, A, B, C, f4, K4, expand(mData, 77) );
5bbb0d ¤   subRound( C, D, E, A, B, f4, K4, expand(mData, 78) );
43f8fd ¤   subRound( B, C, D, E, A, f4, K4, expand(mData, 79) );
a2af5a
15cfd5 ¤   // Build message digest
5b939c ¤   mDigest.longs[0] += A;
893105 ¤   mDigest.longs[1] += B;
44bdde ¤   mDigest.longs[2] += C;
247c26 ¤   mDigest.longs[3] += D;
29cf18 ¤   mDigest.longs[4] += E;
f9efe6 }
50af5a
ca314a void
ec4a89 SHA::Update(const uchar *buf, short len)
d3bb36 {
5d773b ¤   ulong t;
f3af5a
6c7d4d ¤   // Update bitcount
d9ab4b ¤   t = mCountLo;
f64427 ¤   if ( ( mCountLo = t + len ) < t )
31bd9c ¤   ¤   mCountHi++;¤¤   // Carry from low to high
--4c1d 000370e27fb40120040 Page 4 of SHA.cpp
e0af5a
1d6205 ¤   t &= 0x3f;¤ ¤   ¤   // Bytes already in mData
feaf5a
062275 ¤   // Handle any leading odd-sized chunks
c00b9d ¤   if (t)
2bc7a1 ¤   {
7b60f1 ¤   ¤   uchar *p = (uchar *)mData + t;
e0af5a
b749c6 ¤   ¤   t = 64-t;
75708e ¤   ¤   if (len < t)
045b34 ¤   ¤   {
46d9d6 ¤   ¤   ¤   pgpCopyMemory( buf, p, len );
460ecc ¤   ¤   ¤   return;
b10fe4 ¤   ¤   }
158c3f ¤   ¤   pgpCopyMemory( buf, p, t );
1c7c61 ¤   ¤   byteReverse(mData, kSHS_BLOCKSIZE);
cee5d1 ¤   ¤   Transform();
4c2cc8 ¤   ¤   buf += t;
f267e1 ¤   ¤   len -= t;
889371 ¤   }
8faf5a
d81181 ¤   // Process data in kSHS_BLOCKSIZE chunks
d273fb ¤   while (len >= kSHS_BLOCKSIZE)
08c7a1 ¤   {
53c9d0 ¤   ¤   pgpCopyMemory( buf, mData, kSHS_BLOCKSIZE );
eb7c61 ¤   ¤   byteReverse(mData, kSHS_BLOCKSIZE);
85e5d1 ¤   ¤   Transform();
e5fcd8 ¤   ¤   buf += kSHS_BLOCKSIZE;
2abbdf ¤   ¤   len -= kSHS_BLOCKSIZE;
a89371 ¤   }
87af5a
2f26d2 ¤   // Handle any remaining bytes of data.
bf179a ¤   pgpCopyMemory( buf, mData, len );
6aefe6 }
09af5a
146d52 ¤   void
7635cd SHA::Final(Digest *¤hash)
4fbb36 {
6f113a ¤   int¤¤   len;
01a3ca ¤   uchar *¤p;
76af5a
396ea3 ¤   pgpAssert( sizeof( mDigest ) == kSHS_DIGESTSIZE );
9867c5 ¤
44ef10 ¤   // Compute number of bytes mod 64
a06b79 ¤   len = (int)mCountLo & 0x3F;
60af5a
1640e2 ¤   // Set the first char of padding to 0x80.
ee4739 ¤   // This is safe since there is always at least one byte free
4a83c2 ¤   p = (uchar*)mData + len;
d9c755 ¤   *p++ = 0x80;
33af5a
60d739 ¤   // Bytes of padding needed to make 64 bytes
6bde73 ¤   len = kSHS_BLOCKSIZE - 1 - len;
6caf5a
fd1ad5 ¤   // Pad out to 56 mod 64
2992d0 ¤   if (len < 8)
1bc7a1 ¤   {
da9b63 ¤   ¤   // Two lots of padding: ·Pad the first block to 64 bytes
0e3667 ¤   ¤   pgpClearMemory( p, len );
fc7c61 ¤   ¤   byteReverse(mData, kSHS_BLOCKSIZE);
1be5d1 ¤   ¤   Transform();
64af5a
d08d8b ¤   ¤   // Now fill the next block with 56 bytes
1cce18 ¤   ¤   pgpClearMemory( mData, kSHS_BLOCKSIZE-8 );
a09371 ¤   }
e50e24 ¤   else
72c7a1 ¤   {
51378c ¤   ¤   // Pad block to 56 bytes
79e488 ¤   ¤   pgpClearMemory( p, len-8 );
bd9371 ¤   }
d6e571 ¤   byteReverse(mData, kSHS_BLOCKSIZE-8);
37af5a
--743f 001a66fa5fd40120040 Page 5 of SHA.cpp
3b4115 ¤   // Append length in *bits* and transform
4c8459 ¤   mData[14] = mCountHi << 3 | mCountLo >> 29;
1143ed ¤   mData[15] = mCountLo << 3;
36af5a
68a45a ¤   Transform();
2eaf5a
477df2 ¤   // Store output hash in buffer
f9a34a ¤   byteReverse( &mDigest.longs[ 0 ], sizeof( mDigest ));
82fde0 ¤   *hash¤  = mDigest;
9167c5 ¤
8f4a7f ¤   pgpClearMemory( mData, sizeof( mData ) );
a7a81b ¤   pgpClearMemory( &mDigest, sizeof( mDigest ) );
fbaf5a
6d7c85 ¤   mCountLo = mCountHi = 0;
59efe6 }
40af5a
ec33a5 ¤   SHA *
4db845 SHA::Clone()
fcbb36 {
e86f38 ¤   SHA *¤  clone;
3e2555 ¤   short¤  inx;
ac67c5 ¤
93b2de ¤   clone = new SHA();
1967c5 ¤
78e7d2 ¤   for(inx=0;inx<16;inx++)
8ec7a1 ¤   {
18b6e0 ¤   ¤   clone->mData[inx] = mData[inx];
819371 ¤   }
0a67c5 ¤
4c1b5b ¤   clone->mDigest¤ = mDigest;
c567c5 ¤
932920 ¤   clone->mCountHi = mCountHi;
29abc1 ¤   clone->mCountLo = mCountLo;
da38b4 ¤   return clone;
d3efe6 }
a6af5a
--2639 001c947952640120041 Page 1 of SHA.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
374bcd ¤   $Id: SHA.h,v 1.2.8.1 1998/11/12 03:05:47 heller Exp $
7bf7f7 ____________________________________________________________________________*/
c8af5a
668fc4 #ifndef SHS_H
f45c7e #define SHS_H
6baf5a
e4af5a
d2575e /* NIST proposed Secure Hash Standard.
64af5a
3ef203 ···Written 2 September 1992, Peter C. Gutmann.
b44445 ···This implementation placed in the public domain.
3faf5a
1d12a6 ···Modified 1 June 1993, Colin Plumb.
e14863 ···These modifications placed in the public domain.
99af5a
545cd4 ···Comments to pgut1@cs.aukuni.ac.nz */
4eaf5a
eb879b // The SHS block size and message digest sizes, in bytes
54af5a
2b5a28 class SHA
00bb36 {
3c5ed4 public:
aaaf5a
d1d31e ¤   enum { kSHS_BLOCKSIZE = 64 };
eb8838 ¤   enum { kSHS_DIGESTSIZE = 20 };
4967c5 ¤
9f1441 ¤   typedef union Digest
075b34 ¤   ¤   {
6aebc9 ¤   ¤   uchar¤  bytes[ kSHS_DIGESTSIZE ];
cb9c2f ¤   ¤   ulong¤  longs[ kSHS_DIGESTSIZE / sizeof( ulong ) ];
33efb5 ¤   ¤   } Digest;
ad67c5 ¤
e09a71 ¤   ¤   ¤   ¤   SHA(void);
1590a0 ¤   virtual¤¤   ~SHA(void)¤ { }
a4af5a
7dd9e9 ¤   virtual void¤   Init(void);
9e79ed ¤   virtual void¤   Update(const uchar *buf, short len);
5dd073 ¤   virtual void¤   Final(Digest *¤ digest);
dc6cca ¤   virtual SHA¤¤   *Clone();
d6a2d3 protected:
0b8fe1 ¤   void¤   Transform(void);
4eaf5a
089320 ¤   ulong¤  mData[16];¤ ¤   ¤   ¤   // SHS data buffer
edf7ef ¤   Digest¤ mDigest;
e14237 ¤   ulong¤  mCountHi;¤  ¤   // 64-bit byte count
b58cfe ¤   ulong¤  mCountLo;¤  ¤   // 64-bit byte count
c582f7 };
19af5a
c9bbaa #endif¤ // SHS_H
--bf74 000dda108ee40120042 Page 1 of cast5.cpp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
f30c03 ¤   $Id: cast5.cpp,v 1.10.8.1 1998/11/12 03:05:48 heller Exp $
dcf7f7 ____________________________________________________________________________*/
50af5a
a9bb5f #include <assert.h>
2a324c #include <string.h>
0f9ed3 #include "cast5.h"
17f6f0 #include "cast5box.c"¤  /* S-box contents are defined in this file */
b1af5a
420ccc #if PGP_MACINTOSH
44b529 ¤   #if TARGET_CPU_PPC
50886b ¤   ¤   #define MAC_68K ¤   ¤   ¤   0
6347b4 ¤   #else
6691b3 ¤   ¤   #define MAC_68K ¤   ¤   ¤   1
ecaf5a
6f9aa6 ¤   ¤   #if A4_GLOBALS
88afac ¤   ¤   #define MAC68K_ALIGN_HACK¤  0¤  // change, depending on alignment in
506139 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // code resource
6debf6 ¤   ¤   #else
69317b ¤   ¤   #define MAC68K_ALIGN_HACK¤  1¤  // change, depending on alignment in
e127cf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // app
d6d656 ¤   ¤   #endif
771b52 ¤   ¤
b69f62 ¤   ¤   #if MAC68K_ALIGN_HACK
a49644 ¤   ¤   ¤   static short ·___AlignHack[ 1 ] = {0xABCD};
8ad656 ¤   ¤   #endif
87b7ec ¤   #endif
227454 #endif
0eaf5a
4d6f00 /* CAST is uniformly big-endian - byte access macros */
04a4bc #if MAC_68K¤/* [ */
33af5a
99ab99 // casting to uchar will do results in better code
25a499 #define B0(x) ((uchar)((x) >> 24))
4a4d73 #define B1(x) ((uchar)((x) >> 16))
c0cbcd #define B2(x) ((uchar)((x) >> 8 ))
309487 #define B3(x) ((uchar)((x)))
24af5a
da68d8 #else¤  /* ][ */
feaf5a
514b22 #define B0(x) ((x) >> 24 & 255)
ac2d78 #define B1(x) ((x) >> 16 & 255)
700798 #define B2(x) ((x) >> 8 & 255)
db4e6f #define B3(x) ((x) & 255)
8caf5a
973167 #endif¤ /* ] */
eeaf5a
a3af5a
271566 /* Some macros used in the key scheduling code */
8a28db #define x0 B0(x0123)
1ce073 #define x1 B1(x0123)
c2b19a #define x2 B2(x0123)
e67932 #define x3 B3(x0123)
53019c #define x4 B0(x4567)
d9c934 #define x5 B1(x4567)
6098dd #define x6 B2(x4567)
9b5075 #define x7 B3(x4567)
5afcc3 #define x8 B0(x89AB)
82346b #define x9 B1(x89AB)
1e8188 #define xA B2(x89AB)
f34b9b #define xB B3(x89AB)
0d88e7 #define xC B0(xCDEF)
164782 #define xD B1(xCDEF)
a114d0 #define xE B2(xCDEF)
12dec3 #define xF B3(xCDEF)
3f143a #define z0 B0(z0123)
08dc92 #define z1 B1(z0123)
078d7b #define z2 B2(z0123)
dd45d3 #define z3 B3(z0123)
--9b90 0003b225b6a40120042 Page 2 of cast5.cpp
e73d7d #define z4 B0(z4567)
b0f5d5 #define z5 B1(z4567)
79a43c #define z6 B2(z4567)
e36c94 #define z7 B3(z4567)
a5c022 #define z8 B0(z89AB)
98088a #define z9 B1(z89AB)
c7bd69 #define zA B2(z89AB)
39777a #define zB B3(z89AB)
3eb406 #define zC B0(zCDEF)
c37b63 #define zD B1(zCDEF)
712831 #define zE B2(zCDEF)
5ce222 #define zF B3(zCDEF)
2baf5a
cd38e5 /*
19d23a ·* This expands a 128-bit key to a 32-word scheduled key, where each round
53b913 ·* uses two words: a 32-bit XOR mask and a 5-bit rotate amount. ·Shorter keys
5402ee ·* are just padded with zeros, and if they are 80 bits or less, the cipher
e7730f ·* is reduced to 12 rounds (not implemented here).
92775e ·*
cd3127 ·* The feed-forward used with x0123 through yCDEF prevent any weak keys,
5d0686 ·* and the substitution to set up the xkey tables ensure that the subround
aed42b ·* keys are not easily derivable from each other, so linear cryptanalysis
df3505 ·* won't do very well against CAST.
b1495d ·*/
67314a void
bd99be CAST5schedule( word32 xkey[32], byte const *k)
dabb36 {
003a74 ¤   word32 x0123, x4567, x89AB, xCDEF;
930aee ¤   word32 z0123, z4567, z89AB, zCDEF;
6f4ba4 ¤   int i;
1caf5a
90f6c3 ¤   /* Initialize x0123456789ABCDEF with input key */
01df78 #if __POWERPC__ || __MC68K__
aa6648 ¤   x0123 = ((word32 *)k)[0];¤  /* Big-endian and unaligned access okay */
fcb9b9 ¤   x4567 = ((word32 *)k)[1];
6df62a ¤   x89AB = ((word32 *)k)[2];
e8a18a ¤   xCDEF = ((word32 *)k)[3];
86db21 #else
cf04aa ¤   x0123= (word32)k[ 0]<<24 | (word32)k[ 1]<<16 | (word32)k[ 2]<<8 | k[ 3];
3520bd ¤   x4567= (word32)k[ 4]<<24 | (word32)k[ 5]<<16 | (word32)k[ 6]<<8 | k[ 7];
7b7f62 ¤   x89AB= (word32)k[ 8]<<24 | (word32)k[ 9]<<16 | (word32)k[10]<<8 | k[11];
e6f57e ¤   xCDEF= (word32)k[12]<<24 | (word32)k[13]<<16 | (word32)k[14]<<8 | k[15];
9d7454 #endif
73ac80 ¤   /* Now set up the key table */
f8af5a
2ecbf3 ¤   for (i = 0; i < 4; i++) {
f73718 ¤   ¤   z0123 = x0123 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8];
303b20 ¤   ¤   z4567 = x89AB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA];
697fad ¤   ¤   z89AB = xCDEF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9];
850950 ¤   ¤   zCDEF = x4567 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB];
0aaf5a
a1707b ¤   ¤   x0123 = z89AB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0];
d083c9 ¤   ¤   x4567 = z0123 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2];
56d457 ¤   ¤   x89AB = z4567 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1];
5f018c ¤   ¤   xCDEF = zCDEF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3];
33af5a
330459 ¤   ¤   switch (i) {
41d5e4 ¤   ¤   ··case 0:
68e7ae ¤   ¤   ¤   /* Masking keys, rounds 0..7 */
d1262e ¤   ¤   ¤   xkey[ 0] = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2];
551deb ¤   ¤   ¤   xkey[ 2] = S5[zA] ^ S6[zB] ^ S7[z5] ^ S8[z4] ^ S6[z6];
828b78 ¤   ¤   ¤   xkey[ 4] = S5[zC] ^ S6[zD] ^ S7[z3] ^ S8[z2] ^ S7[z9];
635242 ¤   ¤   ¤   xkey[ 6] = S5[zE] ^ S6[zF] ^ S7[z1] ^ S8[z0] ^ S8[zC];
9387c7 ¤   ¤   ¤
3e40be ¤   ¤   ¤   xkey[ 8] = S5[x3] ^ S6[x2] ^ S7[xC] ^ S8[xD] ^ S5[x8];
0f1271 ¤   ¤   ¤   xkey[10] = S5[x1] ^ S6[x0] ^ S7[xE] ^ S8[xF] ^ S6[xD];
e2160f ¤   ¤   ¤   xkey[12] = S5[x7] ^ S6[x6] ^ S7[x8] ^ S8[x9] ^ S7[x3];
731642 ¤   ¤   ¤   xkey[14] = S5[x5] ^ S6[x4] ^ S7[xA] ^ S8[xB] ^ S8[x7];
04cdcb ¤   ¤   ¤   break;
4e8f38 ¤   ¤   ··case 1:
91ae75 ¤   ¤   ¤   /* Masking keys, rounds 8..15 */
3be199 ¤   ¤   ¤   xkey[16] = S5[z3] ^ S6[z2] ^ S7[zC] ^ S8[zD] ^ S5[z9];
--1674 00070ed71a440120042 Page 3 of cast5.cpp
f8ba12 ¤   ¤   ¤   xkey[18] = S5[z1] ^ S6[z0] ^ S7[zE] ^ S8[zF] ^ S6[zC];
a324cf ¤   ¤   ¤   xkey[20] = S5[z7] ^ S6[z6] ^ S7[z8] ^ S8[z9] ^ S7[z2];
5f4ef1 ¤   ¤   ¤   xkey[22] = S5[z5] ^ S6[z4] ^ S7[zA] ^ S8[zB] ^ S8[z6];
6087c7 ¤   ¤   ¤
835630 ¤   ¤   ¤   xkey[24] = S5[x8] ^ S6[x9] ^ S7[x7] ^ S8[x6] ^ S5[x3];
746df5 ¤   ¤   ¤   xkey[26] = S5[xA] ^ S6[xB] ^ S7[x5] ^ S8[x4] ^ S6[x7];
bf2f80 ¤   ¤   ¤   xkey[28] = S5[xC] ^ S6[xD] ^ S7[x3] ^ S8[x2] ^ S7[x8];
0e4ca2 ¤   ¤   ¤   xkey[30] = S5[xE] ^ S6[xF] ^ S7[x1] ^ S8[x0] ^ S8[xD];
f9cdcb ¤   ¤   ¤   break;
21605c ¤   ¤   ··case 2:
386fd3 ¤   ¤   ¤   /* Rotation keys, rounds 0..7 */
c56a01 ¤   ¤   ¤   xkey[ 1] = (S5[z8]^S6[z9]^S7[z7]^S8[z6]^S5[z2]) & 31;
e02c0e ¤   ¤   ¤   xkey[ 3] = (S5[zA]^S6[zB]^S7[z5]^S8[z4]^S6[z6]) & 31;
9543c2 ¤   ¤   ¤   xkey[ 5] = (S5[zC]^S6[zD]^S7[z3]^S8[z2]^S7[z9]) & 31;
d5008a ¤   ¤   ¤   xkey[ 7] = (S5[zE]^S6[zF]^S7[z1]^S8[z0]^S8[zC]) & 31;
3787c7 ¤   ¤   ¤
4e65b0 ¤   ¤   ¤   xkey[ 9] = (S5[x3]^S6[x2]^S7[xC]^S8[xD]^S5[x8]) & 31;
59b7be ¤   ¤   ¤   xkey[11] = (S5[x1]^S6[x0]^S7[xE]^S8[xF]^S6[xD]) & 31;
e5597a ¤   ¤   ¤   xkey[13] = (S5[x7]^S6[x6]^S7[x8]^S8[x9]^S7[x3]) & 31;
2073e8 ¤   ¤   ¤   xkey[15] = (S5[x5]^S6[x4]^S7[xA]^S8[xB]^S8[x7]) & 31;
e0cdcb ¤   ¤   ¤   break;
2c3a80 ¤   ¤   ··case 3:
0a069f ¤   ¤   ¤   /* Rotation keys, rounds 8..15 */
78c936 ¤   ¤   ¤   xkey[17] = (S5[z3]^S6[z2]^S7[zC]^S8[zD]^S5[z9]) & 31;
0c29aa ¤   ¤   ¤   xkey[19] = (S5[z1]^S6[z0]^S7[zE]^S8[zF]^S6[zC]) & 31;
08a31b ¤   ¤   ¤   xkey[21] = (S5[z7]^S6[z6]^S7[z8]^S8[z9]^S7[z2]) & 31;
efb470 ¤   ¤   ¤   xkey[23] = (S5[z5]^S6[z4]^S7[zA]^S8[zB]^S8[z6]) & 31;
e11b52 ¤   ¤
4e4a20 ¤   ¤   ¤   xkey[25] = (S5[x8]^S6[x9]^S7[x7]^S8[x6]^S5[x3]) & 31;
950c2f ¤   ¤   ¤   xkey[27] = (S5[xA]^S6[xB]^S7[x5]^S8[x4]^S6[x7]) & 31;
441811 ¤   ¤   ¤   xkey[29] = (S5[xC]^S6[xD]^S7[x3]^S8[x2]^S7[x8]) & 31;
758e1d ¤   ¤   ¤   xkey[31] = (S5[xE]^S6[xF]^S7[x1]^S8[x0]^S8[xD]) & 31;
d9cdcb ¤   ¤   ¤   break;
9c0fe4 ¤   ¤   }
789371 ¤   }
7b8751 ¤   x0123 = x4567 = x89AB = xCDEF = 0;
fdbc12 ¤   z0123 = z4567 = z89AB = zCDEF = 0;
a8efe6 }
35af5a
31b559 #undef x0
fbac81 #undef x1
3e86e9 #undef x2
f79f31 #undef x3
51d239 #undef x4
1bcbe1 #undef x5
b8e189 #undef x6
b9f851 #undef x7
247b99 #undef x8
726241 #undef x9
c25c45 #undef xA
4e762d #undef xB
5a6ff5 #undef xC
4b22fd #undef xD
163b25 #undef xE
9d114d #undef xF
b300e1 #undef z0
d01939 #undef z1
9c3351 #undef z2
b52a89 #undef z3
b56781 #undef z4
e07e59 #undef z5
0d5431 #undef z6
8d4de9 #undef z7
44ce21 #undef z8
11d7f9 #undef z9
30e9fd #undef zA
35c395 #undef zB
1fda4d #undef zC
a49745 #undef zD
938e9d #undef zE
87a4f5 #undef zF
70af5a
--77ab 000757858d940120042 Page 4 of cast5.cpp
6eba65 /* Some macros used in the encryption/decryption code */
f244d8 #define ROL(x,r) ((x)<<(r) | (x)>>(32-(r)))
24af5a
28af5a
c6a4bc #if MAC_68K¤/* [ */
62af5a
a71aa2 #pragma parameter ROLMac(__D0, __D1)
a39ee0 extern pascal UInt32 ROLMac(ulong x, ulong r) = 0xE3B8;
69af5a
eaebff #undef ROL
eeefcd #define ROL(x, r)¤  ROLMac( x, r )
c767c5 ¤
73b0d1 #endif¤ /* ] MAC_68K */
3baf5a
56d1d1 #ifdef __GNUC__
abaf5e #if __i386__
a3cf87 /* Redefine using GCC inline assembler */
79ebff #undef ROL
846e4a #define ROL(x,r) ({unsigned _y; \
1c26a9 ¤   ¤   __asm__("rol %%cl,%0" : "=g" (_y) : "0" (x), "c" (r)); _y;})
15e3bd #endif /* __i386__ */
7aa5dc #endif /* __GNUC__ */
5daf5a
95c62a #define F1(x,xkey,i) (ROL((xkey)[2*(i)] + (x), (xkey)[2*(i)+1]))
81c599 #define F2(x,xkey,i) (ROL((xkey)[2*(i)] ^ (x), (xkey)[2*(i)+1]))
2d50f6 #define F3(x,xkey,i) (ROL((xkey)[2*(i)] - (x), (xkey)[2*(i)+1]))
5faf5a
3eaf5a
965492 #if MAC_68K
f6af5a
f7d35c // small 's' uses local register variable inited to point at global
656378 #define G1(x) (((s1[B0(x)] ^ s2[B1(x)]) - s3[B2(x)]) + s4[B3(x)])
a35b98 #define G2(x) (((s1[B0(x)] - s2[B1(x)]) + s3[B2(x)]) ^ s4[B3(x)])
bc4b9d #define G3(x) (((s1[B0(x)] + s2[B1(x)]) ^ s3[B2(x)]) - s4[B3(x)])
8daf5a
e7db21 #else
75af5a
0108e5 #define G1(x) (((S1[B0(x)] ^ S2[B1(x)]) - S3[B2(x)]) + S4[B3(x)])
cf3005 #define G2(x) (((S1[B0(x)] - S2[B1(x)]) + S3[B2(x)]) ^ S4[B3(x)])
c52000 #define G3(x) (((S1[B0(x)] + S2[B1(x)]) ^ S3[B2(x)]) - S4[B3(x)])
5eaf5a
787454 #endif
b9af5a
14af5a
790526 #if __POWERPC__ // {
0e38e5 /*
c57ea6 ·* PowerPC assembly version
a47e21 ·* This is 604-tuned. For our purposes, the 604 can dispatch
031882 ·* and execute two ALU and one load/store instruction per cycle.
9b48e5 ·* Loads from cache are available cycle after next.
4f775e ·*
43628f ·* Let's figure out the critical path through a round.
720496 ·* - Add/subf/xor in key word
a51262 ·* - Rotate
abe986 ·* - Extract fields
57975c ·* - Load B0
268e84 ·* - Load B1
25f699 ·* - (stall)
6652be ·* - Merge B0 & B1
ad3b75 ·* - Merge in B2
b322ad ·* - Merge in B3
c61dd6 ·* - XOR with other half
33775e ·*
e21533 ·* Thus, a round should be doable in 10 cycles. ·We have 16
6d5156 ·* instructions (6 loads and 10 ALU ops), so that should be
1e390e ·* easy. ·Perhaps it's worth interleaving and doing two at once?
b1fe57 ·* That would give us 30 ops, 10 load/store and 20 ALU, which
59df95 ·* might allow an optimal schedule.
05775e ·*
147161 ·* Okay... the only tricky part is the load & merge...
77824b ·* Merge with key
75a8e3 ·* Rotate
--08dc 000489dee9040120042 Page 5 of cast5.cpp
29003f ·* Extract 1
66ad7c ·* Load 1 / Extract 2
f4e3cb ·* Load 2 / Extract 3 / L1
629df2 ·* Load 3 / Extract 4 / L2
6e7e1f ·* Load 4 / L3 / Merge 1 and 2
fe32fc ·* L4 / Merge 3
1296fb ·* Merge 4
e24626 ·* XOR with other half
3a495d ·*/
5467b0 // 4567890123456789012345678901234567890123456789012345678901234567890
132352 // Register conventions:
030750 // r0 - volatile
5edf51 // r1 - stack pointer, preserved
ea9630 // r2 - TOC pointer, preserved
814df1 // r3 - First argument (and return value)
c30a65 // r4-r10 - More arguments, volatile
c45f19 // r11-r12 - volatile
01a968 // r13-r31 - preserved
50d7c2 // LR - return address, volatile
5b3a1b // CTR, XER and MQ are all volatile
63465d //
c49263 // The calling stack has some slots reserved for us to use, but
0144aa // the interesting part is that there are a few hundred bytes
e7c627 // *below* the current stack pointer (the so-called "red zone")
5c56f6 // that interrupt handlers won't use and we can use to save out
8c73d9 // registers.
19af5a
e2a2be #define t1¤ r3
8a2302 #define left¤   r6
9817cc #define right¤  r7
f14a6b #define t2¤ r8
8798d6 #define s1¤ r9
013907 #define s2¤ r10
e5bf0a #define s3¤ r11
56527a #define s4¤ r12
952b26 #define t3¤ r13¤// Needs to be saved somewhere
45ae55 #define t4¤ r14¤// Needs to be saved somewhere
afaf5a
2b57eb // The CAST round. ·op1/op2/op3 are add/xor/subf in rotating order.
377d3e // These do round n from x into y.
6c725a #define ROUND(x,y,op1,op2,op3,n) \
1403cc ¤   op3¤¤   r0,x,r0¤¤   ¤   ;\
786809 ¤   rlwnm¤  r0,r0,t1,0,31¤  ;\
7a8844 ¤   rlwinm¤ t1,r0,10,22,29¤ ;\
88ccaa ¤   lwzx¤   t2,s1,t1¤   ¤   ;\
9d82a8 ¤   rlwinm¤ t1,r0,18,22,29¤ ;\
4eec33 ¤   lwzx¤   t3,s2,t1¤   ¤   ;\
b0817e ¤   rlwinm¤ t1,r0,26,22,29¤ ;\
085e8e ¤   lwzx¤   t4,s3,t1¤   ¤   ;\
1e4857 ¤   rlwinm¤ t1,r0,2,22,29¤  ;\
f24711 ¤   op1¤¤   t2,t3,t2¤   ¤   ;\
da54de ¤   lwzx¤   t3,s4,t1¤   ¤   ;\
debb5b ¤   op2¤¤   t2,t4,t2¤   ¤   ;\
38e0aa ¤   lwz¤¤   r0,8*n+8(xkey)¤ ;\
464fe7 ¤   op3¤¤   t2,t3,t2¤   ¤   ;\
32f59a ¤   lwz¤¤   t1,8*n+12(xkey)¤;\
edfd37 ¤   xor¤¤   y,t2,y
b067c5 ¤
ac60ee asm void
9e9d82 CAST5encrypt(
fe0ac3 ¤   register byte const ¤   *in,
31ccc4 ¤   register byte ¤ ¤   ¤   *out,
5f9f52 ¤   register word32 const ¤ *xkey)
0abb36 {
36e59e ¤   lwz¤¤   left,0(in)¤ // PPC is big-endian, as is CAST,
7893cf ¤   lwz¤¤   right,4(in) // and unaligned loads are okay
52ddad ¤   stw¤¤   t3,-8(SP)
c005bb ¤   stw¤¤   t4,-4(SP)
e88237 ¤   lwz¤¤   s1,S1(RTOC)
68f654 ¤   lwz¤¤   s2,S2(RTOC)
4d227a ¤   lwz¤¤   s3,S3(RTOC)
481e92 ¤   lwz¤¤   s4,S4(RTOC)
--08a1 000cbdfa53540120042 Page 6 of cast5.cpp
e0af5a
6e952d ¤   lwz¤¤   r0,0(xkey)
705aa3 ¤   lwz¤¤   t1,4(xkey)
14af5a
2133f5 ¤   add¤¤   r0,right,r0
f8edc7 ¤   rlwnm¤  r0,r0,t1,0,31
6fee49 ¤   rlwinm¤ t1,r0,10,22,29
6b1f77 ¤   lwzx¤   t2,s1,t1
22c3f5 ¤   rlwinm¤ t1,r0,18,22,29
e78304 ¤   lwzx¤   t3,s2,t1
1625ff ¤   rlwinm¤ t1,r0,26,22,29
fd144e ¤   lwzx¤   t4,s3,t1
78e53f ¤   rlwinm¤ t1,r0,2,22,29
3bd819 ¤   xor¤¤   t2,t3,t2
44b89c ¤   lwzx¤   t3,s4,t1
0f2750 ¤   subf¤   t2,t4,t2
22fc10 ¤   lwz¤¤   r0,8*0+8(xkey)
6b9063 ¤   add¤¤   t2,t3,t2
490755 ¤   lwz¤¤   t1,8*0+12(xkey)
0106b8 ¤   xor¤¤   left,t2,left
5167c5 ¤
a48868 //¤ ROUND(right, left, xor, subf, add, 0)
cbab52 ¤   ROUND(left, right, subf, add, xor, 1)
e7387c ¤   ROUND(right, left, add, xor, subf, 2)
eb6750 ¤   ROUND(left, right, xor, subf, add, 3)
a68075 ¤   ROUND(right, left, subf, add, xor, 4)
bea6e3 ¤   ROUND(left, right, add, xor, subf, 5)
934c77 ¤   ROUND(right, left, xor, subf, add, 6)
b67d8b ¤   ROUND(left, right, subf, add, xor, 7)
164b06 ¤   ROUND(right, left, add, xor, subf, 8)
89142a ¤   ROUND(left, right, xor, subf, add, 9)
d8f577 ¤   ROUND(right, left, subf, add, xor, 10)
9d4289 ¤   ROUND(left, right, add, xor, subf, 11)
735a67 ¤   ROUND(right, left, xor, subf, add, 12)
2521d2 ¤   ROUND(left, right, subf, add, xor, 13)
e240f5 ¤   ROUND(right, left, add, xor, subf, 14)
da4e8b //¤ ROUND(left, right, xor, subf, add, 15)
04af5a
f36406 // Last round: omit loading of keys for next round
163395 ¤   add¤¤   r0,left,r0
82995c ¤   stw¤¤   left,4(out)
4bedc7 ¤   rlwnm¤  r0,r0,t1,0,31
b4304b ¤   lwz¤¤   t4,-4(SP)
83ee49 ¤   rlwinm¤ t1,r0,10,22,29
e41f77 ¤   lwzx¤   t2,s1,t1
f7c3f5 ¤   rlwinm¤ t1,r0,18,22,29
848304 ¤   lwzx¤   t3,s2,t1
e325ff ¤   rlwinm¤ t1,r0,26,22,29
918e89 ¤   lwzx¤   left,s3,t1
81e53f ¤   rlwinm¤ t1,r0,2,22,29
bfd819 ¤   xor¤¤   t2,t3,t2
40b89c ¤   lwzx¤   t3,s4,t1
c3e123 ¤   subf¤   t2,left,t2
699063 ¤   add¤¤   t2,t3,t2
31e85d ¤   lwz¤¤   t3,-8(SP)
1a87c9 ¤   xor¤¤   right,t2,right
a267c5 ¤
11f8d8 ¤   stw¤¤   right,0(out)
bf81ec ¤   blr
55efe6 }
65af5a
56af5a
79a780 // Get rid of those #defines...
9e7794 #undef ROUND
6f5cc8 #undef left
9ebf39 #undef right
1e8527 #undef s1
82af4f #undef s2
1eb697 #undef s3
7cfb9f #undef s4
080922 #undef t1
cb234a #undef t2
--5694 000ae89f84840120042 Page 7 of cast5.cpp
0d3a92 #undef t3
5a779a #undef t4
09af5a
1d7a71 #if !CAST5_INTERLEAVED_ENCRYPT // {
72be6b /*********** Version for assembly calling ************/
2338e5 /*
c63086 ·* DO NOT CALL THIS FROM C!
a90e03 ·* Its calling convention is incompatible!
343086 ·* DO NOT CALL THIS FROM C!
38775e ·*
10ca53 ·* The arguments are declared for ease of reference.
03859c ·* Input comes in from "lin" and "right". ·The encrypted result is
f5e9d9 ·* returned in "left" and "rout". ·The other registers are for
4a01bf ·* necessary pointers and ARE NOT MODIFIED, so the caller doesn't
591045 ·* have to set them up again. ·src and dest are not used at all.
12775e ·*
ba79e0 ·* Most rounds operate on "left" and "right". ·Input is in r4 and r5, while
d59fe7 ·* output is in r8 and r9 (left and right are swapped, as the
08cf12 ·* algorithm requires). ·The first and last rounds are slightly
add3aa ·* different to accomodate this.
27495d ·*/
c757eb // The CAST round. ·op1/op2/op3 are add/xor/subf in rotating order.
11aeb2 // These do round n from x into y
c0725a #define ROUND(x,y,op1,op2,op3,n) \
e7080c ¤   op3¤¤   r0,x,t1¤¤   ¤   ;\
80efe7 ¤   rlwnm¤  r0,r0,t2,0,31¤  ;\
4d8844 ¤   rlwinm¤ t1,r0,10,22,29¤ ;\
06cd92 ¤   lwzx¤   t1,s1,t1¤   ¤   ;\
7b8390 ¤   rlwinm¤ t2,r0,18,22,29¤ ;\
64933a ¤   lwzx¤   t2,s2,t2¤   ¤   ;\
5d78a1 ¤   rlwinm¤ t3,r0,26,22,29¤ ;\
a4a6a2 ¤   lwzx¤   t3,s3,t3¤   ¤   ;\
03c335 ¤   rlwinm¤ r0,r0,2,22,29¤  ;\
8b88d5 ¤   op1¤¤   t2,t2,t1¤   ¤   ;\
d3bed8 ¤   lwzx¤   r0,s4,r0¤   ¤   ;\
9cb37b ¤   op2¤¤   t3,t3,t2¤   ¤   ;\
166bc8 ¤   lwz¤¤   t1,8*n+8(xkey)¤ ;\
20a4c5 ¤   op3¤¤   r0,r0,t3¤   ¤   ;\
9ff4a2 ¤   lwz¤¤   t2,8*n+12(xkey)¤;\
2eee26 ¤   xor¤¤   y,y,r0
f6af5a
b6edf9 #define s1 r10
65f85c #define s2 r11
24d61f #define s3 r12
2cd316 #define s4 r13
4faf5a
e3e7da asm static void
a699df CAST5asm(
8adf57 ¤   register word32 const *xkey,¤   ¤   ¤   ¤   ¤   // r3
3c4ecf ¤   register word32 lin, register word32 right,¤¤   // r4 and r5
72192b ¤   register word32 const *src,¤¤   ¤   ¤   ¤   ¤   // r6 (unused)
94ce11 ¤   register word32 *dest,¤ ¤   ¤   ¤   ¤   ¤   ¤   // r7 (unused)
2e6fc9 ¤   register word32 rout, register word32 left,¤¤   // r8 and r9
a41e1e ¤   ·········word32 const *s1,¤ ¤   ¤   ¤   ¤   ¤   // r10
6d408b ¤   ·········word32 const *s2,¤ ¤   ¤   ¤   ¤   ¤   // r11
45afd7 ¤   ·········word32 const *s3,¤ ¤   ¤   ¤   ¤   ¤   // r12
715e9e ¤   ·········word32 const *s4)¤ ¤   ¤   ¤   ¤   ¤   // r13
b7bb36 {
364d81 #define t1 r14
47dfd2 #define t2 rout
1023a0 #define t3 left
8daf5a
65f5ad // First round: fetch of first key is not overlapped, use "lin".
5c4c7d ¤   lwz¤¤   t1,0(xkey)
8b2eca ¤   lwz¤¤   t2,4(xkey)
07af5a
64fcf4 ¤   add¤¤   r0,right,t1
6545a9 ¤   rlwnm¤  r0,r0,t2,0,31
35ee49 ¤   rlwinm¤ t1,r0,10,22,29
3f95a7 ¤   lwzx¤   t1,s1,t1
d940cb ¤   rlwinm¤ t2,r0,18,22,29
ae28d3 ¤   lwzx¤   t2,s2,t2
--2cae 000802ad8d940120042 Page 8 of cast5.cpp
7ed82b ¤   rlwinm¤ t3,r0,26,22,29
38bbf0 ¤   lwzx¤   t3,s3,t3
94eeff ¤   rlwinm¤ r0,r0,2,22,29
f0f935 ¤   xor¤¤   t2,t2,t1
855952 ¤   lwzx¤   r0,s4,r0
159633 ¤   subf¤   t3,t3,t2
8d61c1 ¤   lwz¤¤   t1,8(xkey)
1523fd ¤   add¤¤   r0,r0,t3
2c4a06 ¤   lwz¤¤   t2,12(xkey)
0fbc8e ¤   xor¤¤   left,r0,lin¤// A little dance here...
e7af5a
973a92 #undef t3
744392 #define t3 lin
52af5a
ea8868 //¤ ROUND(right, left, xor, subf, add, 0)
bdab52 ¤   ROUND(left, right, subf, add, xor, 1)
e1387c ¤   ROUND(right, left, add, xor, subf, 2)
e36750 ¤   ROUND(left, right, xor, subf, add, 3)
498075 ¤   ROUND(right, left, subf, add, xor, 4)
a6a6e3 ¤   ROUND(left, right, add, xor, subf, 5)
824c77 ¤   ROUND(right, left, xor, subf, add, 6)
977d8b ¤   ROUND(left, right, subf, add, xor, 7)
c24b06 ¤   ROUND(right, left, add, xor, subf, 8)
96142a ¤   ROUND(left, right, xor, subf, add, 9)
2cf577 ¤   ROUND(right, left, subf, add, xor, 10)
a14289 ¤   ROUND(left, right, add, xor, subf, 11)
275a67 ¤   ROUND(right, left, xor, subf, add, 12)
cc21d2 ¤   ROUND(left, right, subf, add, xor, 13)
0a40f5 ¤   ROUND(right, left, add, xor, subf, 14)
ea4e8b //¤ ROUND(left, right, xor, subf, add, 15)
f5af5a
363157 // Last round: do not fetch next round's keys, leave result in "rout"
ebfc94 ¤   add¤¤   r0,left,t1
ef45a9 ¤   rlwnm¤  r0,r0,t2,0,31
39ee49 ¤   rlwinm¤ t1,r0,10,22,29
e595a7 ¤   lwzx¤   t1,s1,t1
0140cb ¤   rlwinm¤ t2,r0,18,22,29
4528d3 ¤   lwzx¤   t2,s2,t2
02d82b ¤   rlwinm¤ t3,r0,26,22,29
9bbbf0 ¤   lwzx¤   t3,s3,t3
5ceeff ¤   rlwinm¤ r0,r0,2,22,29
c7f935 ¤   xor¤¤   t2,t2,t1
e15952 ¤   lwzx¤   r0,s4,r0
5b9633 ¤   subf¤   t3,t3,t2
dd23fd ¤   add¤¤   r0,r0,t3
ce4590 ¤   xor¤¤   rout,r0,right¤
9481ec ¤   blr
0fefe6 }
fb0922 #undef t1
ca234a #undef t2
ef3a92 #undef t3
8d779a #undef t4
c07794 #undef ROUND
d4af5a
106332 #define out0 r8
8971ae #define out1 r9
f0af5a
5360ee asm void
ab86ca CAST5encryptCFB(
345bcd ¤   register word32 const *xkey,¤   // r3
346917 ¤   register word32 iv0,¤   ¤   ¤   // r4
faaf99 ¤   register word32 iv1,¤   ¤   ¤   // r5
a21ae3 ¤   register word32 const *src,¤¤   // r6
74566f ¤   register word32 *dest,¤ ¤   ¤   // r7
d2c7df ¤   register word32 len)¤   ¤   ¤   // r8
eabb36 {
58f2f6 ¤   mflr¤   r0
eb457c ¤   stw¤¤   r13,-16(SP)
8c3a8c ¤   mtctr¤  len
d018be ¤   stw¤¤   r0,-12(SP)
601825 ¤   stw¤¤   r14,-8(SP)
8067c5 ¤
--b7c7 00095d678fa40120042 Page 9 of cast5.cpp
d48237 ¤   lwz¤¤   s1,S1(RTOC)
17f654 ¤   lwz¤¤   s2,S2(RTOC)
8f227a ¤   lwz¤¤   s3,S3(RTOC)
181e92 ¤   lwz¤¤   s4,S4(RTOC)
4faf5a
ecf541 @loop:
70af5a
8f35b2 ¤   bl¤ ¤   CAST5asm
62af5a
7c2adf ¤   lwz¤¤   iv0,0(src);¤¤   addi¤   dest,dest,8
fdc009 ¤   lwz¤¤   iv1,4(src);¤¤   xor¤¤   iv0,out0,iv0
a13a2a ¤   stw¤¤   iv0,-8(dest);¤  xor¤¤   iv1,out1,iv1
a488c8 ¤   stw¤¤   iv1,-4(dest);¤  addi¤   src,src,8
27af5a
ff08f4 ¤   bdnz¤   @loop¤  ¤
8667c5 ¤
3c5f5a ¤   lwz¤¤   r13,-16(SP)
38ef04 ¤   lwz¤¤   r0,-12(SP)
abef9f ¤   lwz¤¤   r14,-8(SP)
7978ea ¤   mtlr¤   r0
51b756 ¤   blr¤
68efe6 }
95af5a
201c90 #if !DOUBLE_DECRYPT // {
4060ee asm void
454186 CAST5decryptCFB(
155bcd ¤   register word32 const *xkey,¤   // r3
386917 ¤   register word32 iv0,¤   ¤   ¤   // r4
5faf99 ¤   register word32 iv1,¤   ¤   ¤   // r5
8e1ae3 ¤   register word32 const *src,¤¤   // r6
3d566f ¤   register word32 *dest,¤ ¤   ¤   // r7
80c7df ¤   register word32 len)¤   ¤   ¤   // r8
23bb36 {
aff2f6 ¤   mflr¤   r0
1c457c ¤   stw¤¤   r13,-16(SP)
7c3a8c ¤   mtctr¤  len
6118be ¤   stw¤¤   r0,-12(SP)
981825 ¤   stw¤¤   r14,-8(SP)
7e642c ¤   stw¤¤   r15,-4(SP)
ec67c5 ¤
3d8237 ¤   lwz¤¤   s1,S1(RTOC)
0df654 ¤   lwz¤¤   s2,S2(RTOC)
bb227a ¤   lwz¤¤   s3,S3(RTOC)
aa1e92 ¤   lwz¤¤   s4,S4(RTOC)
56af5a
7af541 @loop:
3235b2 ¤   bl¤ ¤   CAST5asm
83af5a
ae2adf ¤   lwz¤¤   iv0,0(src);¤¤   addi¤   dest,dest,8
189a03 ¤   lwz¤¤   iv1,4(src);¤¤   xor¤¤   out0,out0,iv0
0dab91 ¤   stw¤¤   out0,-8(dest);¤ xor¤¤   out1,out1,iv1
d17839 ¤   stw¤¤   out1,-4(dest);¤ addi¤   src,src,8
00af5a
c108f4 ¤   bdnz¤   @loop¤  ¤
dd67c5 ¤
975f5a ¤   lwz¤¤   r13,-16(SP)
70ef04 ¤   lwz¤¤   r0,-12(SP)
8eef9f ¤   lwz¤¤   r14,-8(SP)
6f78ea ¤   mtlr¤   r0
9e9396 ¤   lwz¤¤   r15,-4(SP)
71b756 ¤   blr¤
53efe6 }
90e950 #endif // } !DOUBLE_DECRYPT
7faf5a
b9938e #undef out0
ce8a56 #undef out1
6baf5a
b18527 #undef s1
f9af4f #undef s2
b2b697 #undef s3
69fb9f #undef s4
95af5a
--ad29 0009b5f8f7d40120042 Page 10 of cast5.cpp
e0af5a
7f9d8b #if DOUBLE_DECRYPT // {
f9e7b8 /*******************************************************************
0caf5a
f4cc50 ¤   ¤   ¤   The Tricky Part
da87c7 ¤   ¤   ¤
47fc56 ¤   This interleaves two CAST cipher block operations to make
98e8fd ¤   optimal use of the PPC 604's pipeline. ·(Other PPC models
331860 ¤   are also sped up, to a lesser degree.)
22af5a
5c85b6 ·*******************************************************************/
9738e5 /*
1631da ·* Here is how it's pipelined. ·Repeat the middle block as often as necessary.
4dfd81 ·* Each line in the overlapping part has 2 simple ALU operations and one load.
a3cb53 ·* load resuts are accessed 2 cycles later. ·(Key fetches are done earlier.)
4ec1e9 ·* Code on a PowerPC 604 just doesn't run any faster than this.
4e775e ·*
bc0de1 ·* Key a
2f4925 ·* Rotate a
a9e7d3 ·* Extract 1a
4d548b ·* Load 1a / Extract 2a¤
e3b2b5 ·* Load 2a / Extract 3a
a1b0a0 ·* Load 3a / Extract 4a
3acc61 ·* Merge 1/2a / Load 4a¤¤   Key b
f5417a ·* Merge 2/3a¤  ¤   ¤   ¤   Rotate b¤   ¤   ¤   ¤   Load key c/d
b932d8 ·* Merge 3/4a¤  ¤   ¤   ¤   Extract 1b¤ ¤   ¤   ¤   Load rotate c/d
5fb402 ·* XOR a¤   ¤   ¤   ¤   ¤   Load 1b / Extract 2b
931708 ·* Key c¤   ¤   ¤   ¤   ¤   Load 2b / Extract 3b
29d0c6 ·* Rotate c¤¤   ¤   ¤   ¤   Load 3b / Extract 4b
9aca39 ·* Extract 1c¤  ¤   ¤   ¤   Merge 1/2b / Load 4b
0c9b37 ·* Load 1c / Extract 2c¤¤   Merge 2/3b
44a3dc ·* Load 2c / Extract 3c¤¤   Merge 3/4b
12b1ae ·* Load 3c / Extract 4c¤¤   XOR b
2cc0a1 ·* Merge 1/2c / Load 4c¤¤   Key d
067bad ·* Merge 2/3c¤  ¤   ¤   ¤   Rotate d¤   ¤   ¤   ¤   Load key e/f
0e4bae ·* Merge 3/4c¤  ¤   ¤   ¤   Extract 1d¤ ¤   ¤   ¤   Load rotate e/f
461576 ·* XOR c¤   ¤   ¤   ¤   ¤   Load 1d / Extract 2d
74c275 ·* ¤¤   ¤   ¤   ¤   ¤   ¤   Load 2d / Extract 3d
64c060 ·* ¤¤   ¤   ¤   ¤   ¤   ¤   Load 3d / Extract 4d
0c5123 ·* ¤¤   ¤   ¤   ¤   ¤   ¤   Merge 1/2d / Load 4d
451908 ·* ¤¤   ¤   ¤   ¤   ¤   ¤   Merge 2/3d
059e49 ·* ¤¤   ¤   ¤   ¤   ¤   ¤   Merge 3/4d
25b24e ·* ¤¤   ¤   ¤   ¤   ¤   ¤   XOR d
8e495d ·*/
c357eb // The CAST round. ·op1/op2/op3 are add/xor/subf in rotating order.
aafafa // These do the "a" half round n from x1 into y1 and from x2 into y2,
8807d5 // and the corresponding parts of the "b" half: part of round n-1 and
2983dc // part of round n.
cdbf1f // Note: Current op1 is previous round's op2, and so on.
d21f42 // ·B half¤ ¤   ¤   ¤   B half¤ ¤   A half¤ ¤   ¤   A half
c52f7a #define ROUND(x,y1,y2,b1,b2,op1,op2,op3,n) \
d7b0fb ¤   lwzx ··t2,s2,t2;¤   rlwinm t3,tb,26,22,29;¤ ¤   op3 ···ta,x,key;¤   ¤   \
a9aef4 ¤   lwzx ··t3,s3,t3;¤   rlwinm tb,tb,2,22,29;¤  ¤   rlwnm ·ta,ta,rot,0,31;¤ \
9b4f60 ¤   op3 ···t2,t2,t1;¤   lwzx ··tb,s4,tb;¤   ¤   ¤   rlwinm t1,ta,10,22,29;¤ \
77b13d ¤   op1 ···t3,t3,t2;¤   ¤   ¤   ¤   lwzx t1,s1,t1;¤ rlwinm t2,ta,18,22,29;¤ \
4a9d0e ¤   op2 ···tb,tb,t3;¤   ¤   ¤   ¤   lwzx t2,s2,t2;¤ rlwinm t3,ta,26,22,29;¤ \
98aafa ¤   xor ···b2,b1,tb;¤   ¤   ¤   ¤   lwzx t3,s3,t3;¤ rlwinm ta,ta,2,22,29;¤  \
8ddfa9 ¤   op3 ···tb,b2,key;¤  ¤   ¤   ¤   op1 ·t2,t2,t1;¤ lwzx ··ta,s4,ta;¤   ¤   \
1a634f ¤   rlwnm ·tb,tb,rot,0,31;¤ ¤   ¤   op2 ·t3,t3,t2;¤ lwz key,8*n+8(xkey);¤   \
d6ad04 ¤   rlwinm t1,tb,10,22,29;¤ ¤   ¤   op3 ·ta,ta,t3;¤ lwz rot,8*n+12(xkey);¤  \
d0e178 ¤   lwzx ··t1,s1,t1;¤   rlwinm t2,tb,18,22,29;¤ ¤   xor¤ ··y2,y1,ta;¤   ¤   \
1caf5a
3a6a64 #define out0 r10
947797 #define out1 r11
455182 #define out2 r12
dd4c71 #define out3 r13
fdf609 #define s1¤ r14
9b47bf #define s2¤ r15
f0f202 #define s3¤ r16
cd2cc2 #define s4¤ r17
55af5a
9bb168 #define ta¤ r18
--3c9e 000f2cf6cb940120042 Page 11 of cast5.cpp
2f00de #define tb¤ r19
671931 #define¤t1¤ r20
8ea887 #define¤t2¤ r21
5d1d3a #define¤t3¤ r22
1caf5a
8c1373 #define¤key¤r23
157588 #define¤rot¤r24
d6af5a
4f60ee asm void
d34186 CAST5decryptCFB(
7d5bcd ¤   register word32 const *xkey,¤   // r3
47b495 ¤   register word32 in0,¤   ¤   ¤   // r4
27721b ¤   register word32 in1,¤   ¤   ¤   // r5
841ae3 ¤   register word32 const *src,¤¤   // r6
c8566f ¤   register word32 *dest,¤ ¤   ¤   // r7
f8c7df ¤   register word32 len)¤   ¤   ¤   // r8
00fa77 #define in2¤r8
1ce8eb #define in3¤r9
26bb36 {
2d6d0b ¤   rlwinm¤ len,len,31,1,31¤¤   // Divide by 2
490015 ¤   stw¤¤   r13,-48(sp)
8af514 ¤   stw¤¤   r14,-44(sp)
76c99f ¤   stw¤¤   r15,-40(sp)
926214 ¤   stw¤¤   r16,-36(sp)
305e9f ¤   stw¤¤   r17,-32(sp)
864598 ¤   stw¤¤   r18,-28(sp)
a1584b ¤   stw¤¤   r19,-24(sp)
a2f35a ¤   stw¤¤   r20,-20(sp)
216fe9 ¤   stw¤¤   r21,-16(sp)
010b2c ¤   stw¤¤   r22,-12(sp)
4c09c6 ¤   stw¤¤   r23,-8(sp)
c0d1d0 ¤   stw¤¤   r24,-4(sp)
e7af5a
00e336 ¤   mtctr¤  len¤¤   ¤   ¤   // Repeat len/2 times....
22af5a
2347b3 ¤   lwz¤¤   in2,0(src)
4c6538 ¤   lwz¤¤   in3,4(src)
f967c5 ¤
2e2db7 ¤   lwz¤¤   key,0(xkey)
a94312 ¤   lwz¤¤   rot,4(xkey)
83af5a
9b8237 ¤   lwz¤¤   s1,S1(RTOC)
afc9e6 // The core CAST function
a1e4de ¤   lwz¤¤   s2,S2(RTOC);¤   ¤   ¤   ¤   ¤   ¤   ¤   add ···ta,in1,key;
aed333 ¤   lwz¤¤   s3,S3(RTOC);¤   ¤   ¤   ¤   ¤   ¤   ¤   rlwnm ·ta,ta,rot,0,31;
c1e44e ¤   lwz¤¤   s4,S4(RTOC);¤   ¤   ¤   ¤   ¤   ¤   ¤   rlwinm t1,ta,10,22,29;
b34b17 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lwzx t1,s1,t1;¤ rlwinm t2,ta,18,22,29;
4efbe9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lwzx t2,s2,t2;¤ rlwinm t3,ta,26,22,29;
282898 ¤   b¤  ¤   @entry
32f541 @loop:
80e4d8 ¤   subf ··t3,t3,t2;¤   ·xor out3,out3,in1;¤¤   ¤   lwz key,0(xkey);
3bad12 ¤   add ···tb,tb,t3;¤   ¤   /**/¤   ¤   ¤   ¤   ¤   lwz rot,4(xkey);
56b424 ¤   xor ···out2,out2,tb;¤   /**/¤   ¤   ¤   ¤   ¤   ·lwz in2,16(src);
78b855 ¤   ·xor out2,out2,in0;¤¤   /**/¤   ¤   ¤   ¤   ¤   ·lwz in3,20(src);
f97580 ¤   ·stw out0,0(dest);¤ ¤   /**/¤   ¤   ¤   ¤   ¤   /**/
1f6f9a ¤   ·stw out1,4(dest);¤ ¤   /**/¤   ¤   ¤   ¤   ¤   add ···ta,in1,key;
9ec620 ¤   ·stw out2,8(dest);¤ ¤   /**/¤   ¤   ¤   ¤   ¤   rlwnm ·ta,ta,rot,0,31;
f8fdde ¤   ·stw out3,12(dest);¤¤   /**/¤   ¤   ¤   ¤   ¤   rlwinm t1,ta,10,22,29;
aa9228 ¤   ·addi src,src,16;¤  ¤   ¤   ¤   lwzx t1,s1,t1;¤ rlwinm t2,ta,18,22,29;
80ce09 ¤   ·addi dest,dest,16;¤¤   ¤   ¤   lwzx t2,s2,t2;¤ rlwinm t3,ta,26,22,29;
a82c5a @entry:
cae11d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lwzx t3,s3,t3;¤ rlwinm ta,ta,2,22,29;
60acb0 ¤   add ···tb,in3,key;¤ ¤   ¤   ¤   xor ·t2,t2,t1;¤ lwzx ··ta,s4,ta;
c5257d ¤   rlwnm ·tb,tb,rot,0,31;¤ ¤   ¤   subf t3,t3,t2;¤ lwz key,8(xkey);
203359 ¤   rlwinm t1,tb,10,22,29;¤ ¤   ¤   add ·ta,ta,t3;¤ lwz rot,12(xkey);
a064cb ¤   lwzx ··t1,s1,t1;¤   rlwinm t2,tb,18,22,29;¤ ¤   xor ···out1,in0,ta;
e3af5a
9b57b6 //¤ ROUND(in1, ·in0, ·out1, XXX, ·in3, ·xor, subf, add, 0)
b65885 ¤   ROUND(out1, in1, ·out0, in2, ·out3, subf, add, xor, 1)
aa4ce5 ¤   ROUND(out0, out1, out1, in3, ·out2, add, xor, subf, 2)
2df65b ¤   ROUND(out1, out0, out0, out3, out3, xor, subf, add, 3)
f2b426 ¤   ROUND(out0, out1, out1, out2, out2, subf, add, xor, 4)
--6b1f 000e186da4040120042 Page 12 of cast5.cpp
3b37e8 ¤   ROUND(out1, out0, out0, out3, out3, add, xor, subf, 5)
a77824 ¤   ROUND(out0, out1, out1, out2, out2, xor, subf, add, 6)
e8ec80 ¤   ROUND(out1, out0, out0, out3, out3, subf, add, xor, 7)
957f55 ¤   ROUND(out0, out1, out1, out2, out2, add, xor, subf, 8)
798521 ¤   ROUND(out1, out0, out0, out3, out3, xor, subf, add, 9)
94955d ¤   ROUND(out0, out1, out1, out2, out2, subf, add, xor, 10)
99fccb ¤   ROUND(out1, out0, out0, out3, out3, add, xor, subf, 11)
1e3a4d ¤   ROUND(out0, out1, out1, out2, out2, xor, subf, add, 12)
c89f90 ¤   ROUND(out1, out0, out0, out3, out3, subf, add, xor, 13)
9320df ¤   ROUND(out0, out1, out1, out2, out2, add, xor, subf, 14)
90376e //¤ ROUND(out1, out0, out0, out3, out3, xor, subf, add, 15)
b5e7d3 // Final wrapup. ·Steps that are part of the CFB (as opposed to CAST)
ad0ff4 // are indented one space. ·/**/ marks an instruction slot.
ce080b ¤   lwzx ··t2,s2,t2;¤   rlwinm t3,tb,26,22,29;¤ ¤   add ···ta,out1,key;
299b67 ¤   lwzx ··t3,s3,t3;¤   rlwinm tb,tb,2,22,29;¤  ¤   rlwnm ·ta,ta,rot,0,31;
630b7e ¤   add ···t2,t2,t1;¤   lwzx ··tb,s4,tb;¤   ¤   ¤   rlwinm t1,ta,10,22,29;
58438e ¤   xor ···t3,t3,t2;¤   ¤   ¤   ¤   lwzx t1,s1,t1;¤ rlwinm t2,ta,18,22,29;
b1e49e ¤   subf ··tb,tb,t3;¤   ¤   ¤   ¤   lwzx t2,s2,t2;¤ rlwinm t3,ta,26,22,29;
c0d5a6 ¤   xor ···out3,out3,tb; ¤  ¤   ¤   lwzx t3,s3,t3;¤ rlwinm ta,ta,2,22,29;
9bbfbf ¤   add ···tb,out3,key;¤¤   ¤   ·¤  xor ·t2,t2,t1;¤ lwzx¤   ta,s4,ta;
2aa057 ¤   rlwnm ·tb,tb,rot,0,31;¤ ¤   ¤   subf t3,t3,t2;¤ ·lwz in0,8(src);
8d6b11 ¤   rlwinm t1,tb,10,22,29;¤ ¤   ¤   add ·ta,ta,t3;¤ ·lwz in1,12(src);
72d080 ¤   lwzx ··t1,s1,t1;¤   rlwinm t2,tb,18,22,29;¤ ¤   ·xor¤   out0,out0,ta;
56ecf3 ¤   lwzx ··t2,s2,t2;¤   rlwinm t3,tb,26,22,29;¤ ·¤  ·xor out0,out0,in2;
608ee1 ¤   lwzx ··t3,s3,t3;¤   rlwinm tb,tb,2,22,29;¤  ¤   ·xor out1,out1,in3;
5d64f3 ¤   xor ···t2,t2,t1;¤   lwzx ··tb,s4,tb;¤   ¤   ·¤  /**/
fcaf5a
6f1589 ¤   bdnz¤   @loop
dfaf5a
8a0ca4 ¤   subf ··t3,t3,t2;¤   ·xor out3,out3,in1;¤¤   ·lwz in2,16(src)
6a0c3a ¤   add ···tb,tb,t3;¤   ¤   ¤   ¤   ¤   ¤   ¤   ·lwz in3,20(src)
4c7568 ¤   xor ···out2,out2,tb;¤   ¤   ¤   ¤   ¤   ¤   ·stw out0,0(dest)
5d52ee ¤   ·xor out2,out2,in0;¤¤   ¤   ¤   ¤   ¤   ¤   ·stw out1,4(dest)
813efa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·stw out2,8(dest)
643235 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·stw out3,12(dest)
5eaf5a
e73a4e // Done. ·Now reload all the saved registers. ·Since we've been
52ea87 // memory-bound for a long time, there's no advantage to scheduling this.
71af5a
801a33 ¤   lwz¤¤   r13,-48(sp)
eeef32 ¤   lwz¤¤   r14,-44(sp)
cad3b9 ¤   lwz¤¤   r15,-40(sp)
617832 ¤   lwz¤¤   r16,-36(sp)
1c44b9 ¤   lwz¤¤   r17,-32(sp)
2b5fbe ¤   lwz¤¤   r18,-28(sp)
40426d ¤   lwz¤¤   r19,-24(sp)
ade97c ¤   lwz¤¤   r20,-20(sp)
be75cf ¤   lwz¤¤   r21,-16(sp)
85110a ¤   lwz¤¤   r22,-12(sp)
9cfe7c ¤   lwz¤¤   r23,-8(sp)
3d266a ¤   lwz¤¤   r24,-4(sp)
01af5a
2a81ec ¤   blr
07efe6 }
e2542b #undef in2
774df3 #undef in3
cbaf5a
5c4cdb #endif // } DOUBLE_DECRYPT
76af5a
de220d #else // } CAST5_INTERLEAVED_ENCRYPT {
17af5a
142d5c // Same round function as above
b42f7a #define ROUND(x,y1,y2,b1,b2,op1,op2,op3,n) \
1eb0fb ¤   lwzx ··t2,s2,t2;¤   rlwinm t3,tb,26,22,29;¤ ¤   op3 ···ta,x,key;¤   ¤   \
c9aef4 ¤   lwzx ··t3,s3,t3;¤   rlwinm tb,tb,2,22,29;¤  ¤   rlwnm ·ta,ta,rot,0,31;¤ \
9e4f60 ¤   op3 ···t2,t2,t1;¤   lwzx ··tb,s4,tb;¤   ¤   ¤   rlwinm t1,ta,10,22,29;¤ \
b8b13d ¤   op1 ···t3,t3,t2;¤   ¤   ¤   ¤   lwzx t1,s1,t1;¤ rlwinm t2,ta,18,22,29;¤ \
8b9d0e ¤   op2 ···tb,tb,t3;¤   ¤   ¤   ¤   lwzx t2,s2,t2;¤ rlwinm t3,ta,26,22,29;¤ \
7caafa ¤   xor ···b2,b1,tb;¤   ¤   ¤   ¤   lwzx t3,s3,t3;¤ rlwinm ta,ta,2,22,29;¤  \
73dfa9 ¤   op3 ···tb,b2,key;¤  ¤   ¤   ¤   op1 ·t2,t2,t1;¤ lwzx ··ta,s4,ta;¤   ¤   \
f3634f ¤   rlwnm ·tb,tb,rot,0,31;¤ ¤   ¤   op2 ·t3,t3,t2;¤ lwz key,8*n+8(xkey);¤   \
e1ad04 ¤   rlwinm t1,tb,10,22,29;¤ ¤   ¤   op3 ·ta,ta,t3;¤ lwz rot,8*n+12(xkey);¤  \
--12f1 000ae62c52940120042 Page 13 of cast5.cpp
c6e178 ¤   lwzx ··t1,s1,t1;¤   rlwinm t2,tb,18,22,29;¤ ¤   xor¤ ··y2,y1,ta;¤   ¤   \
75af5a
e46a64 #define out0 r10
0d7797 #define out1 r11
ac5182 #define out2 r12
de4c71 #define out3 r13
7df609 #define s1¤ r14
f047bf #define s2¤ r15
b3f202 #define s3¤ r16
322cc2 #define s4¤ r17
2caf5a
7db168 #define ta¤ r18
0c00de #define tb¤ r19
cc1931 #define¤t1¤ r20
cca887 #define¤t2¤ r21
e81d3a #define¤t3¤ r22
02af5a
621373 #define¤key¤r23
597588 #define¤rot¤r24
e5af5a
a260ee asm void
b48995 CAST5encryptCFBdbl(
9f5bcd ¤   register word32 const *xkey,¤   // r3
3cb495 ¤   register word32 in0,¤   ¤   ¤   // r4
9a721b ¤   register word32 in1,¤   ¤   ¤   // r5
1d3198 ¤   register word32 in2,¤   ¤   ¤   // r6
c2f716 ¤   register word32 in3,¤   ¤   ¤   // r7
6480f3 ¤   register word32 const *src,¤¤   // r8
a7cc7f ¤   register word32 *dest,¤ ¤   ¤   // r9
d5562b ¤   register word32 len)¤   ¤   ¤   // r10
cfbb36 {
5f8947 ¤   mtctr¤  len¤¤   ¤   ¤   ¤   // Repeat len times....
660015 ¤   stw¤¤   r13,-48(sp)
1bf514 ¤   stw¤¤   r14,-44(sp)
b6c99f ¤   stw¤¤   r15,-40(sp)
686214 ¤   stw¤¤   r16,-36(sp)
9e5e9f ¤   stw¤¤   r17,-32(sp)
664598 ¤   stw¤¤   r18,-28(sp)
6e584b ¤   stw¤¤   r19,-24(sp)
3bf35a ¤   stw¤¤   r20,-20(sp)
f56fe9 ¤   stw¤¤   r21,-16(sp)
450b2c ¤   stw¤¤   r22,-12(sp)
8109c6 ¤   stw¤¤   r23,-8(sp)
e7d1d0 ¤   stw¤¤   r24,-4(sp)
94af5a
c42db7 ¤   lwz¤¤   key,0(xkey)
284312 ¤   lwz¤¤   rot,4(xkey)
c9af5a
ff8237 ¤   lwz¤¤   s1,S1(RTOC)
c695dc // The core CAST function starts here
b0e4de ¤   lwz¤¤   s2,S2(RTOC);¤   ¤   ¤   ¤   ¤   ¤   ¤   add ···ta,in1,key;
93d333 ¤   lwz¤¤   s3,S3(RTOC);¤   ¤   ¤   ¤   ¤   ¤   ¤   rlwnm ·ta,ta,rot,0,31;
f1e44e ¤   lwz¤¤   s4,S4(RTOC);¤   ¤   ¤   ¤   ¤   ¤   ¤   rlwinm t1,ta,10,22,29;
274b17 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lwzx t1,s1,t1;¤ rlwinm t2,ta,18,22,29;
6ffbe9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lwzx t2,s2,t2;¤ rlwinm t3,ta,26,22,29;
1f2898 ¤   b¤  ¤   @entry
35af5a
b1f541 @loop:
250571 ¤   subf ··t3,t3,t2;¤   ·¤  /**/¤   ¤   ¤   ¤   ¤   ·lwz key,0(xkey);
576f52 ¤   add ···tb,tb,t3;¤   ¤   /**/¤   ¤   ¤   ¤   ¤   ·lwz rot,4(xkey);
a1727d ¤   xor ···out2,out2,tb;¤   /**/¤   ¤   ¤   ¤   ¤   ·lwz in2,8(src);
111f33 ¤   ·xor in2,out2,in2;¤ ¤   /**/¤   ¤   ¤   ¤   ¤   ·lwz in3,12(src);
a9e12e ¤   ·stw in0,0(dest);¤  ¤   /**/¤   ¤   ¤   ¤   ¤   ·xor in3,out3,in3;
11cd1d ¤   ·stw in1,4(dest);¤  ¤   /**/¤   ¤   ¤   ¤   ¤   add ···ta,in1,key;
136cbd ¤   ·stw in2,8(dest);¤  ¤   /**/¤   ¤   ¤   ¤   ¤   rlwnm ·ta,ta,rot,0,31;
9abcb0 ¤   ·stw in3,12(dest);¤ ¤   /**/¤   ¤   ¤   ¤   ¤   rlwinm t1,ta,10,22,29;
f89228 ¤   ·addi src,src,16;¤  ¤   ¤   ¤   lwzx t1,s1,t1;¤ rlwinm t2,ta,18,22,29;
06ce09 ¤   ·addi dest,dest,16;¤¤   ¤   ¤   lwzx t2,s2,t2;¤ rlwinm t3,ta,26,22,29;
9f2c5a @entry:
94e11d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lwzx t3,s3,t3;¤ rlwinm ta,ta,2,22,29;
d8acb0 ¤   add ···tb,in3,key;¤ ¤   ¤   ¤   xor ·t2,t2,t1;¤ lwzx ··ta,s4,ta;
ae257d ¤   rlwnm ·tb,tb,rot,0,31;¤ ¤   ¤   subf t3,t3,t2;¤ lwz key,8(xkey);
--c461 0000126a1fa40120042 Page 14 of cast5.cpp
b33359 ¤   rlwinm t1,tb,10,22,29;¤ ¤   ¤   add ·ta,ta,t3;¤ lwz rot,12(xkey);
7c64cb ¤   lwzx ··t1,s1,t1;¤   rlwinm t2,tb,18,22,29;¤ ¤   xor ···out1,in0,ta;
f3af5a
b257b6 //¤ ROUND(in1, ·in0, ·out1, XXX, ·in3, ·xor, subf, add, 0)
4a5885 ¤   ROUND(out1, in1, ·out0, in2, ·out3, subf, add, xor, 1)
884ce5 ¤   ROUND(out0, out1, out1, in3, ·out2, add, xor, subf, 2)
e7f65b ¤   ROUND(out1, out0, out0, out3, out3, xor, subf, add, 3)
45b426 ¤   ROUND(out0, out1, out1, out2, out2, subf, add, xor, 4)
df37e8 ¤   ROUND(out1, out0, out0, out3, out3, add, xor, subf, 5)
bc7824 ¤   ROUND(out0, out1, out1, out2, out2, xor, subf, add, 6)
98ec80 ¤   ROUND(out1, out0, out0, out3, out3, subf, add, xor, 7)
f97f55 ¤   ROUND(out0, out1, out1, out2, out2, add, xor, subf, 8)
ac8521 ¤   ROUND(out1, out0, out0, out3, out3, xor, subf, add, 9)
7d955d ¤   ROUND(out0, out1, out1, out2, out2, subf, add, xor, 10)
16fccb ¤   ROUND(out1, out0, out0, out3, out3, add, xor, subf, 11)
793a4d ¤   ROUND(out0, out1, out1, out2, out2, xor, subf, add, 12)
e09f90 ¤   ROUND(out1, out0, out0, out3, out3, subf, add, xor, 13)
0320df ¤   ROUND(out0, out1, out1, out2, out2, add, xor, subf, 14)
d4376e //¤ ROUND(out1, out0, out0, out3, out3, xor, subf, add, 15)
0de7d3 // Final wrapup. ·Steps that are part of the CFB (as opposed to CAST)
a90ff4 // are indented one space. ·/**/ marks an instruction slot.
47080b ¤   lwzx ··t2,s2,t2;¤   rlwinm t3,tb,26,22,29;¤ ¤   add ···ta,out1,key;
b09b67 ¤   lwzx ··t3,s3,t3;¤   rlwinm tb,tb,2,22,29;¤  ¤   rlwnm ·ta,ta,rot,0,31;
090b7e ¤   add ···t2,t2,t1;¤   lwzx ··tb,s4,tb;¤   ¤   ¤   rlwinm t1,ta,10,22,29;
fd438e ¤   xor ···t3,t3,t2;¤   ¤   ¤   ¤   lwzx t1,s1,t1;¤ rlwinm t2,ta,18,22,29;
7de49e ¤   subf ··tb,tb,t3;¤   ¤   ¤   ¤   lwzx t2,s2,t2;¤ rlwinm t3,ta,26,22,29;
19d5a6 ¤   xor ···out3,out3,tb; ¤  ¤   ¤   lwzx t3,s3,t3;¤ rlwinm ta,ta,2,22,29;
f1bfbf ¤   add ···tb,out3,key;¤¤   ¤   ·¤  xor ·t2,t2,t1;¤ lwzx¤   ta,s4,ta;
698deb ¤   rlwnm ·tb,tb,rot,0,31;¤ ¤   ¤   subf t3,t3,t2;¤ ·lwz in0,0(src);
4cd620 ¤   rlwinm t1,tb,10,22,29;¤ ¤   ¤   add ·ta,ta,t3;¤ ·lwz in1,4(src);
c7d080 ¤   lwzx ··t1,s1,t1;¤   rlwinm t2,tb,18,22,29;¤ ¤   ·xor¤   out0,out0,ta;
e543ed ¤   lwzx ··t2,s2,t2;¤   rlwinm t3,tb,26,22,29;¤ ¤   ·xor in0,out0,in0;
33b710 ¤   lwzx ··t3,s3,t3;¤   rlwinm tb,tb,2,22,29;¤  ¤   ·xor in1,out1,in1;
90130b ¤   xor ···t2,t2,t1;¤   lwzx ··tb,s4,tb;¤   ¤   ¤   ·/**/
76af5a
f51589 ¤   bdnz¤   @loop
59af5a
df22d5 ¤   subf ··t3,t3,t2;¤   ·¤  ¤   ¤   ¤   ¤   ¤   ·lwz in2,8(src)
ffb151 ¤   add ···tb,tb,t3;¤   ¤   ¤   ¤   ¤   ¤   ¤   ·lwz in3,12(src)
63f2a7 ¤   xor ···out2,out2,tb;¤   ¤   ¤   ¤   ¤   ¤   ·stw in0,0(dest)
8d1995 ¤   ·xor in2,out2,in2;¤ ¤   ¤   ¤   ¤   ¤   ¤   ·stw in1,4(dest)
99ed6c ¤   ·xor in3,out3,in3;¤ ¤   ¤   ¤   ¤   ¤   ¤   ·stw in2,8(dest)
c55111 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·stw in3,12(dest)
2aaf5a
cd3a4e // Done. ·Now reload all the saved registers. ·Since we've been
3bea87 // memory-bound for a long time, there's no advantage to scheduling this.
15af5a
e81a33 ¤   lwz¤¤   r13,-48(sp)
bbef32 ¤   lwz¤¤   r14,-44(sp)
70d3b9 ¤   lwz¤¤   r15,-40(sp)
697832 ¤   lwz¤¤   r16,-36(sp)
c144b9 ¤   lwz¤¤   r17,-32(sp)
255fbe ¤   lwz¤¤   r18,-28(sp)
c4426d ¤   lwz¤¤   r19,-24(sp)
c7e97c ¤   lwz¤¤   r20,-20(sp)
9075cf ¤   lwz¤¤   r21,-16(sp)
06110a ¤   lwz¤¤   r22,-12(sp)
fffe7c ¤   lwz¤¤   r23,-8(sp)
ab266a ¤   lwz¤¤   r24,-4(sp)
3eaf5a
d681ec ¤   blr
17efe6 }
19af5a
f360ee asm void
40ade2 CAST5decryptCFBdbl(
c25bcd ¤   register word32 const *xkey,¤   // r3
76b495 ¤   register word32 in0,¤   ¤   ¤   // r4
44721b ¤   register word32 in1,¤   ¤   ¤   // r5
513198 ¤   register word32 in2,¤   ¤   ¤   // r6
04f716 ¤   register word32 in3,¤   ¤   ¤   // r7
0780f3 ¤   register word32 const *src,¤¤   // r8
01cc7f ¤   register word32 *dest,¤ ¤   ¤   // r9
--b579 00041a845c240120042 Page 15 of cast5.cpp
a9562b ¤   register word32 len)¤   ¤   ¤   // r10
dabb36 {
738947 ¤   mtctr¤  len¤¤   ¤   ¤   ¤   // Repeat len times....
ea0015 ¤   stw¤¤   r13,-48(sp)
15f514 ¤   stw¤¤   r14,-44(sp)
7dc99f ¤   stw¤¤   r15,-40(sp)
e86214 ¤   stw¤¤   r16,-36(sp)
235e9f ¤   stw¤¤   r17,-32(sp)
a34598 ¤   stw¤¤   r18,-28(sp)
6e584b ¤   stw¤¤   r19,-24(sp)
71f35a ¤   stw¤¤   r20,-20(sp)
ff6fe9 ¤   stw¤¤   r21,-16(sp)
210b2c ¤   stw¤¤   r22,-12(sp)
5309c6 ¤   stw¤¤   r23,-8(sp)
67d1d0 ¤   stw¤¤   r24,-4(sp)
f1af5a
2a2db7 ¤   lwz¤¤   key,0(xkey)
0e4312 ¤   lwz¤¤   rot,4(xkey)
8faf5a
748237 ¤   lwz¤¤   s1,S1(RTOC)
e595dc // The core CAST function starts here
06e4de ¤   lwz¤¤   s2,S2(RTOC);¤   ¤   ¤   ¤   ¤   ¤   ¤   add ···ta,in1,key;
14d333 ¤   lwz¤¤   s3,S3(RTOC);¤   ¤   ¤   ¤   ¤   ¤   ¤   rlwnm ·ta,ta,rot,0,31;
bfe44e ¤   lwz¤¤   s4,S4(RTOC);¤   ¤   ¤   ¤   ¤   ¤   ¤   rlwinm t1,ta,10,22,29;
dc4b17 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lwzx t1,s1,t1;¤ rlwinm t2,ta,18,22,29;
24fbe9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lwzx t2,s2,t2;¤ rlwinm t3,ta,26,22,29;
a92898 ¤   b¤  ¤   @entry
89f541 @loop:
c60571 ¤   subf ··t3,t3,t2;¤   ·¤  /**/¤   ¤   ¤   ¤   ¤   ·lwz key,0(xkey);
c56f52 ¤   add ···tb,tb,t3;¤   ¤   /**/¤   ¤   ¤   ¤   ¤   ·lwz rot,4(xkey);
a5727d ¤   xor ···out2,out2,tb;¤   /**/¤   ¤   ¤   ¤   ¤   ·lwz in2,8(src);
6ad40c ¤   ·xor out2,out2,in2;¤¤   /**/¤   ¤   ¤   ¤   ¤   ·lwz in3,12(src);
68a510 ¤   ·stw out0,0(dest);¤ ¤   /**/¤   ¤   ¤   ¤   ¤   ·xor out3,out3,in3;
706f9a ¤   ·stw out1,4(dest);¤ ¤   /**/¤   ¤   ¤   ¤   ¤   add ···ta,in1,key;
c9c620 ¤   ·stw out2,8(dest);¤ ¤   /**/¤   ¤   ¤   ¤   ¤   rlwnm ·ta,ta,rot,0,31;
49fdde ¤   ·stw out3,12(dest);¤¤   /**/¤   ¤   ¤   ¤   ¤   rlwinm t1,ta,10,22,29;
9d9228 ¤   ·addi src,src,16;¤  ¤   ¤   ¤   lwzx t1,s1,t1;¤ rlwinm t2,ta,18,22,29;
e8ce09 ¤   ·addi dest,dest,16;¤¤   ¤   ¤   lwzx t2,s2,t2;¤ rlwinm t3,ta,26,22,29;
902c5a @entry:
20e11d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lwzx t3,s3,t3;¤ rlwinm ta,ta,2,22,29;
1dacb0 ¤   add ···tb,in3,key;¤ ¤   ¤   ¤   xor ·t2,t2,t1;¤ lwzx ··ta,s4,ta;
ea257d ¤   rlwnm ·tb,tb,rot,0,31;¤ ¤   ¤   subf t3,t3,t2;¤ lwz key,8(xkey);
273359 ¤   rlwinm t1,tb,10,22,29;¤ ¤   ¤   add ·ta,ta,t3;¤ lwz rot,12(xkey);
c064cb ¤   lwzx ··t1,s1,t1;¤   rlwinm t2,tb,18,22,29;¤ ¤   xor ···out1,in0,ta;
caaf5a
bc57b6 //¤ ROUND(in1, ·in0, ·out1, XXX, ·in3, ·xor, subf, add, 0)
065885 ¤   ROUND(out1, in1, ·out0, in2, ·out3, subf, add, xor, 1)
5a4ce5 ¤   ROUND(out0, out1, out1, in3, ·out2, add, xor, subf, 2)
8ef65b ¤   ROUND(out1, out0, out0, out3, out3, xor, subf, add, 3)
08b426 ¤   ROUND(out0, out1, out1, out2, out2, subf, add, xor, 4)
0937e8 ¤   ROUND(out1, out0, out0, out3, out3, add, xor, subf, 5)
ab7824 ¤   ROUND(out0, out1, out1, out2, out2, xor, subf, add, 6)
36ec80 ¤   ROUND(out1, out0, out0, out3, out3, subf, add, xor, 7)
ec7f55 ¤   ROUND(out0, out1, out1, out2, out2, add, xor, subf, 8)
718521 ¤   ROUND(out1, out0, out0, out3, out3, xor, subf, add, 9)
08955d ¤   ROUND(out0, out1, out1, out2, out2, subf, add, xor, 10)
65fccb ¤   ROUND(out1, out0, out0, out3, out3, add, xor, subf, 11)
863a4d ¤   ROUND(out0, out1, out1, out2, out2, xor, subf, add, 12)
4e9f90 ¤   ROUND(out1, out0, out0, out3, out3, subf, add, xor, 13)
4720df ¤   ROUND(out0, out1, out1, out2, out2, add, xor, subf, 14)
f1376e //¤ ROUND(out1, out0, out0, out3, out3, xor, subf, add, 15)
b5080b ¤   lwzx ··t2,s2,t2;¤   rlwinm t3,tb,26,22,29;¤ ¤   add ···ta,out1,key;
d49b67 ¤   lwzx ··t3,s3,t3;¤   rlwinm tb,tb,2,22,29;¤  ¤   rlwnm ·ta,ta,rot,0,31;
e50b7e ¤   add ···t2,t2,t1;¤   lwzx ··tb,s4,tb;¤   ¤   ¤   rlwinm t1,ta,10,22,29;
7b438e ¤   xor ···t3,t3,t2;¤   ¤   ¤   ¤   lwzx t1,s1,t1;¤ rlwinm t2,ta,18,22,29;
3fe49e ¤   subf ··tb,tb,t3;¤   ¤   ¤   ¤   lwzx t2,s2,t2;¤ rlwinm t3,ta,26,22,29;
28d5a6 ¤   xor ···out3,out3,tb; ¤  ¤   ¤   lwzx t3,s3,t3;¤ rlwinm ta,ta,2,22,29;
dcbfbf ¤   add ···tb,out3,key;¤¤   ¤   ·¤  xor ·t2,t2,t1;¤ lwzx¤   ta,s4,ta;
f68deb ¤   rlwnm ·tb,tb,rot,0,31;¤ ¤   ¤   subf t3,t3,t2;¤ ·lwz in0,0(src);
0ad620 ¤   rlwinm t1,tb,10,22,29;¤ ¤   ¤   add ·ta,ta,t3;¤ ·lwz in1,4(src);
acd080 ¤   lwzx ··t1,s1,t1;¤   rlwinm t2,tb,18,22,29;¤ ¤   ·xor¤   out0,out0,ta;
41af5a
--9033 00018657ca940120042 Page 16 of cast5.cpp
a3e7d3 // Final wrapup. ·Steps that are part of the CFB (as opposed to CAST)
350ff4 // are indented one space. ·/**/ marks an instruction slot.
d845c1 // Note the "bdz" buried in there, just before the cycle that starts
ab0efe // loading keys to restart. ·Since all PPCs have a separate branch unit,
081772 // having two branches takes no time, and it simplifies it considerably.
cfcf32 ¤   lwzx ··t2,s2,t2;¤   rlwinm t3,tb,26,22,29;¤ ¤   ·xor out0,out0,in0;
493b59 ¤   lwzx ··t3,s3,t3;¤   rlwinm tb,tb,2,22,29;¤  ¤   ·xor out1,out1,in1;
eb130b ¤   xor ···t2,t2,t1;¤   lwzx ··tb,s4,tb;¤   ¤   ¤   ·/**/
e0af5a
be2534 ¤   bdnz¤   @loop¤  // Should take 0 cycles
55af5a
8b7c55 @exit:
6622d5 ¤   subf ··t3,t3,t2;¤   ·¤  ¤   ¤   ¤   ¤   ¤   ·lwz in2,8(src)
9ab151 ¤   add ···tb,tb,t3;¤   ¤   ¤   ¤   ¤   ¤   ¤   ·lwz in3,12(src)
ac7568 ¤   xor ···out2,out2,tb;¤   ¤   ¤   ¤   ¤   ¤   ·stw out0,0(dest)
553e98 ¤   ·xor out2,out2,in2;¤¤   ¤   ¤   ¤   ¤   ¤   ·stw out1,4(dest)
47ca61 ¤   ·xor out3,out3,in3;¤¤   ¤   ¤   ¤   ¤   ¤   ·stw out2,8(dest)
c83235 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·stw out3,12(dest)
12af5a
003a4e // Done. ·Now reload all the saved registers. ·Since we've been
8cea87 // memory-bound for a long time, there's no advantage to scheduling this.
65af5a
971a33 ¤   lwz¤¤   r13,-48(sp)
8bef32 ¤   lwz¤¤   r14,-44(sp)
cfd3b9 ¤   lwz¤¤   r15,-40(sp)
027832 ¤   lwz¤¤   r16,-36(sp)
b644b9 ¤   lwz¤¤   r17,-32(sp)
b55fbe ¤   lwz¤¤   r18,-28(sp)
3b426d ¤   lwz¤¤   r19,-24(sp)
b4e97c ¤   lwz¤¤   r20,-20(sp)
6a75cf ¤   lwz¤¤   r21,-16(sp)
9a110a ¤   lwz¤¤   r22,-12(sp)
c9fe7c ¤   lwz¤¤   r23,-8(sp)
e0266a ¤   lwz¤¤   r24,-4(sp)
13af5a
8181ec ¤   blr
0befe6 }
ddaf5a
8656d3 #endif // } CAST5_INTERLEAVED_ENCRYPT
75af5a
47938e #undef out0
2c8a56 #undef out1
dda03e #undef out2
97b9e6 #undef out3
568527 #undef s1
3daf4f #undef s2
acb697 #undef s3
d5fb9f #undef s4
50af5a
87dad5 #undef ta
20f0bd #undef tb
080922 #undef t1
ec234a #undef t2
433a92 #undef t3
a9af5a
74fb1d #else // } !__POWERPC__ { ··Portable C code version of above
e2af5a
49a41a #if __MC68K__ && ! __CFM68K__ // {
18af5a
65d6ee // Bloody annoying Metrowerks compiler doesn't support
bb7db4 // '020 addressing modes like (a0,d0.w*4). ·So we have to
224e56 // define them with opword... ·Sigh.
c237fb // Note if you care: accessing "xkey" with offsets rather
f297fe // than postincrement has been tried. ·It's the same speed
c38579 // or slower, and takes more space.
685bd2 #define ROUND1(x,y,n) \
624818 ¤   move.l¤ (xkey)+,k1;¤\
719a76 ¤   add.l¤  x,k1;¤  ¤   ¤   \
3955d4 ¤   move.l¤ (xkey)+,k2;¤\
7d4669 ¤   rol.l¤  k2,k1;¤ ¤   ¤   \
a70214 ¤   swap¤   k1;¤¤   ¤   ¤   \
188cc4 ¤   move.l¤ k1,k2;¤ ¤   ¤   \
--d21f 000b12ec66a40120042 Page 17 of cast5.cpp
ca79cd ¤   lsr.l¤  %8,k1;¤ ¤   ¤   \
b62b35 ¤   and.l¤  mask,k1;¤   ¤   \
46acdb ¤   and.l¤  mask,k2;¤   ¤   \
d24723 /*¤ move.l¤ (s1,k1.w*4),t;¤ */¤ opword¤ 0x2A31, 0x3400;¤\
5e0214 ¤   swap¤   k1;¤¤   ¤   ¤   \
6c0266 /*¤ move.l¤ (s2,k2.w*4),e;¤ */¤ opword¤ 0x2C32, 0x4400;¤\
ef4096 ¤   eor.l¤  e,t;¤   ¤   ¤   \
fe3205 ¤   swap¤   k2;¤¤   ¤   ¤   \
dc8094 /*¤ sub.l¤  (s3,k1.w*4),t;¤ */¤ opword¤ 0x9AB3, 0x3400;¤\
a35e63 /*¤ add.l¤  (s4,k2.w),t;¤   */¤ opword¤ 0xDAB4, 0x4400;¤\
df0f73 ¤   eor.l¤  t,y
daaf5a
d4a561 #define ROUND2(x,y,n) \
cb4818 ¤   move.l¤ (xkey)+,k1;¤\
49d7cc ¤   eor.l¤  x,k1;¤  ¤   ¤   \
b855d4 ¤   move.l¤ (xkey)+,k2;¤\
184669 ¤   rol.l¤  k2,k1;¤ ¤   ¤   \
be0214 ¤   swap¤   k1;¤¤   ¤   ¤   \
d88cc4 ¤   move.l¤ k1,k2;¤ ¤   ¤   \
b579cd ¤   lsr.l¤  %8,k1;¤ ¤   ¤   \
3f2b35 ¤   and.l¤  mask,k1;¤   ¤   \
67acdb ¤   and.l¤  mask,k2;¤   ¤   \
f73847 /*¤ move.l¤ (s1,k1.w*4),t;¤ */¤ opword 0x2A31, 0x3400;¤ \
ac0214 ¤   swap¤   k1;¤¤   ¤   ¤   \
3bbd9d /*¤ sub.l¤  (s2,k2.w*4),t;¤ */¤ opword 0x9AB2, 0x4400;¤ \
db3205 ¤   swap¤   k2;¤¤   ¤   ¤   \
419ee3 /*¤ add.l¤  (s3,k1.w*4),t;¤ */¤ opword 0xDAB3, 0x3400;¤ \
44168e /*¤ move.l¤ (s4,k2.w*4),e;¤ */¤ opword 0x2C34, 0x4400;¤ \
d74096 ¤   eor.l¤  e,t;¤   ¤   ¤   \
340f73 ¤   eor.l¤  t,y
b0af5a
f0f0f0 #define ROUND3(x,y,n) \
a44818 ¤   move.l¤ (xkey)+,k1;¤\
922d49 ¤   sub.l¤  x,k1;¤  ¤   ¤   \
e055d4 ¤   move.l¤ (xkey)+,k2;¤\
6d4669 ¤   rol.l¤  k2,k1;¤ ¤   ¤   \
930214 ¤   swap¤   k1;¤¤   ¤   ¤   \
c38cc4 ¤   move.l¤ k1,k2;¤ ¤   ¤   \
db79cd ¤   lsr.l¤  %8,k1;¤ ¤   ¤   \
e52b35 ¤   and.l¤  mask,k1;¤   ¤   \
0cacdb ¤   and.l¤  mask,k2;¤   ¤   \
9e3847 /*¤ move.l¤ (s1,k1.w*4),t;¤ */¤ opword 0x2A31, 0x3400;¤ \
4a0214 ¤   swap¤   k1;¤¤   ¤   ¤   \
5622c4 /*¤ add.l¤  (s2,k2.w*4),t;¤ */¤ opword 0xDAB2, 0x4400;¤ \
d53205 ¤   swap¤   k2;¤¤   ¤   ¤   \
09bd65 /*¤ move.l¤ (s3,k1.w*4),e;¤ */¤ opword 0x2C33, 0x3400;¤ \
924096 ¤   eor.l¤  e,t;¤   ¤   ¤   \
b0aa51 /*¤ sub.l¤  (s4,k2.w*4),t;¤ */¤ opword 0x9AB4, 0x4400;¤ \
250f73 ¤   eor.l¤  t,y
f0af5a
468aac // *** DANGER WILL ROBINSON ***
c17b54 // If you touch these register assignments, you'll have to fix
5cf609 // all the opwords above!
ff249e #define left¤   d0
741050 #define right¤  d1
019565 #define mask¤   d2
8e0cbc #define k1¤ ¤   d3
b035dd #define k2¤ ¤   d4
0b2248 #define t¤  ¤   d5
27dc45 // The 680x0 can't EOR mem->reg, arrgh!
312cf4 #define e¤  ¤   d6
e6af5a
a9df12 #define xkey¤   a0
32cb5e #define s1¤ ¤   a1
63955f #define s2¤ ¤   a2
baa0a0 #define s3¤ ¤   a3
3b295d #define s4¤ ¤   a4
70af5a
0f60ee asm void
82e366 CAST5encrypt( byte const *in, byte *out, word32 const *xkey)
4bbb36 {
b19b07 ¤   move.l¤ 12(sp),xkey
--0483 0004b452e5740120042 Page 18 of cast5.cpp
4cfda5 ¤   move.l¤ 4(sp),a1¤   /* in pointer */
3d5a87 ¤   movem.l¤d2-d6/a2-a4,-(sp)
efe74e ¤   move.l¤ (a1)+,left
4156ac ¤   move.l¤ (a1),right
f815f1 ¤   lea¤¤   S1,s1
a72255 ¤   lea¤¤   S2,s2
6b30c9 ¤   lea¤¤   S3,s3
9e4d1d ¤   lea¤¤   S4,s4
c84150 ¤   move.l¤ #0xFF00FF,mask
19af5a
3a8001 ¤   ROUND1(right, left, 0)
c8fe4d ¤   ROUND2(left, right, 1)
4fcc66 ¤   ROUND3(right, left, 2)
964acd ¤   ROUND1(left, right, 3)
eae258 ¤   ROUND2(right, left, 4)
5465cb ¤   ROUND3(left, right, 5)
0956d8 ¤   ROUND1(right, left, 6)
202894 ¤   ROUND2(left, right, 7)
45bf1c ¤   ROUND3(right, left, 8)
5c39b7 ¤   ROUND1(left, right, 9)
dd0ff2 ¤   ROUND2(right, left, 10)
beef00 ¤   ROUND3(left, right, 11)
9f0780 ¤   ROUND1(right, left, 12)
5dc9f1 ¤   ROUND2(left, right, 13)
45ffda ¤   ROUND3(right, left, 14)
e1a2e2 ¤   ROUND1(left, right, 15)
1faf5a
bd4711 ¤   move.l¤ 8+4*8(sp),a1
b1659f ¤   movem.l¤(sp)+,d2-d6/a2-a4
a846f1 ¤   move.l¤ right,(a1)+
b76574 ¤   move.l¤ left,(a1)
fc18c2 ¤   rts
6defe6 }
b72f8a #undef ROUND1
ad05e2 #undef ROUND2
8a1c3a #undef ROUND3
5f5cc8 #undef left
13bf39 #undef right
768f11 #undef mask
4cc670 #undef k1
54ec18 #undef k2
00e5c3 #undef t
0434c6 #undef xkey
6e8527 #undef s1
2aaf4f #undef s2
7ab697 #undef s3
5efb9f #undef s4
6eaf5a
646095 #else // } !__MC68K__ && ! __CFM68K__ {
48af5a
68314a void
81e366 CAST5encrypt( byte const *in, byte *out, word32 const *xkey)
9dbb36 {
cafa05 ¤   word32 l, r, t;
fcaf5a
da5492 #if MAC_68K
1efff5 ¤   /* substituting these generates significantly better code */
f71b9a ¤   register const word32 *¤s1 = S1;
9b7e2e ¤   register const word32 *¤s2 = S2;
aaa54d ¤   register const word32 *¤s3 = S3;
ecb546 ¤   register const word32 *¤s4 = S4;
c17454 #endif
58af5a
6edf78 #if __POWERPC__ || __MC68K__
005693 ¤   l = ((word32 *)in)[0];¤ // Big-endian and unaligned access okay.
760360 ¤   r = ((word32 *)in)[1];
cedb21 #else
6ce5fd ¤   l = (word32)in[0]<<24 | (word32)in[1]<<16 | (word32)in[2]<<8 | in[3];
b5cc39 ¤   r = (word32)in[4]<<24 | (word32)in[5]<<16 | (word32)in[6]<<8 | in[7];
ba7454 #endif
fbaf5a
4bfe6a ¤   t = F1(r, xkey, ·0); l ^= G1(t);
--eaae 0006831d87740120042 Page 19 of cast5.cpp
3b6e25 ¤   t = F2(l, xkey, ·1); r ^= G2(t);
e27620 ¤   t = F3(r, xkey, ·2); l ^= G3(t);
522c5a ¤   t = F1(l, xkey, ·3); r ^= G1(t);
7a8046 ¤   t = F2(r, xkey, ·4); l ^= G2(t);
c48c72 ¤   t = F3(l, xkey, ·5); r ^= G3(t);
b8c239 ¤   t = F1(r, xkey, ·6); l ^= G1(t);
5b5276 ¤   t = F2(l, xkey, ·7); r ^= G2(t);
6532d5 ¤   t = F3(r, xkey, ·8); l ^= G3(t);
1468af ¤   t = F1(l, xkey, ·9); r ^= G1(t);
768f0e ¤   t = F2(r, xkey, 10); l ^= G2(t);
dc833a ¤   t = F3(l, xkey, 11); r ^= G3(t);
d3bb5b ¤   /* Stop here if only doing 12 rounds */
80cd71 ¤   t = F1(r, xkey, 12); l ^= G1(t);
a35d3e ¤   t = F2(l, xkey, 13); r ^= G2(t);
9e6d59 ¤   t = F3(r, xkey, 14); l ^= G3(t);
d33723 ¤   t = F1(l, xkey, 15); r ^= G1(t);
92af5a
57df78 #if __POWERPC__ || __MC68K__
e2f44b ¤   ((word32 *)out)[0] = r;
2ce07a ¤   ((word32 *)out)[1] = l;
eedb21 #else
5443ad ¤   out[0] = B0(r);
23c2d3 ¤   out[1] = B1(r);
214940 ¤   out[2] = B2(r);
d5c83e ¤   out[3] = B3(r);
b32b38 ¤   out[4] = B0(l);
e5aa46 ¤   out[5] = B1(l);
e021d5 ¤   out[6] = B2(l);
42a0ab ¤   out[7] = B3(l);
ba7454 #endif
91efe6 }
54af5a
4d9c82 #endif // } !__MC68K__
75af5a
847a71 #if !CAST5_INTERLEAVED_ENCRYPT // {
b7314a void
c86ead CAST5encryptCFB(word32 const *xkey, word32 iv0, word32 iv1,
5d0c8a ¤   word32 const *src, word32 *dest, word32 len)
8bbb36 {
8f1d05 ¤   word32 iv[2] = {iv0, iv1};
f9af5a
2ecae5 ¤   while (len--) {
0c030f ¤   ¤   CAST5encrypt((byte const *)iv, (byte *)iv, xkey);
b6f660 ¤   ¤   *dest++ = iv[0] ^= *src++;
f7888a ¤   ¤   *dest++ = iv[1] ^= *src++;
dd9371 ¤   }
daefe6 }
feaf5a
ab314a void
95c8b9 CAST5decryptCFB(word32 const *xkey, word32 iv0, word32 iv1,
3d0c8a ¤   word32 const *src, word32 *dest, word32 len)
17bb36 {
b01d05 ¤   word32 iv[2] = {iv0, iv1};
e7cdd9 ¤   word32 out[2];
acaf5a
8ecae5 ¤   while (len--) {
12bafe ¤   ¤   CAST5encrypt((byte const *)iv, (byte *)out, xkey);
6952b5 ¤   ¤   *dest++ = out[0] ^ (iv[0] = *src++);
2ba596 ¤   ¤   *dest++ = out[1] ^ (iv[1] = *src++);
a99371 ¤   }
39efe6 }
dfaf5a
23220d #else // } CAST5_INTERLEAVED_ENCRYPT {
11af5a
00314a void
62e372 CAST5encryptCFBdbl(word32 const *xkey,
615e6a ¤   word32 iv0, word32 iv1, word32 iv2, word32 iv3,
bc0c8a ¤   word32 const *src, word32 *dest, word32 len)
f4bb36 {
ce23ff ¤   word32 iv[4] = {iv0, iv1, iv2, iv3};
40af5a
68cae5 ¤   while (len--) {
--6584 0001497c8a140120042 Page 20 of cast5.cpp
3a030f ¤   ¤   CAST5encrypt((byte const *)iv, (byte *)iv, xkey);
7bf660 ¤   ¤   *dest++ = iv[0] ^= *src++;
e5888a ¤   ¤   *dest++ = iv[1] ^= *src++;
04b833 ¤   ¤   CAST5encrypt((byte const *)(iv+2), (byte *)(iv+2), xkey);
530bb4 ¤   ¤   *dest++ = iv[2] ^= *src++;
97755e ¤   ¤   *dest++ = iv[3] ^= *src++;
6a9371 ¤   }
77efe6 }
d5af5a
ce314a void
406130 CAST5decryptCFBdbl(word32 const *xkey,
f25e6a ¤   word32 iv0, word32 iv1, word32 iv2, word32 iv3,
8e0c8a ¤   word32 const *src, word32 *dest, word32 len)
5ebb36 {
f223ff ¤   word32 iv[4] = {iv0, iv1, iv2, iv3};
308643 ¤   word32 out[4];
c7af5a
20cae5 ¤   while (len--) {
1dbafe ¤   ¤   CAST5encrypt((byte const *)iv, (byte *)out, xkey);
9252b5 ¤   ¤   *dest++ = out[0] ^ (iv[0] = *src++);
1ea596 ¤   ¤   *dest++ = out[1] ^ (iv[1] = *src++);
58502b ¤   ¤   CAST5encrypt((byte const *)(iv+2), (byte *)(out+2), xkey);
31b4e2 ¤   ¤   *dest++ = out[2] ^ (iv[2] = *src++);
af43c1 ¤   ¤   *dest++ = out[3] ^ (iv[3] = *src++);
bd9371 ¤   }
cbefe6 }
b0af5a
9156d3 #endif // } CAST5_INTERLEAVED_ENCRYPT
d4af5a
40f75a #endif // } !__POWERPC__
edaf5a
90af5a
385af5 #if 1¤  // [
1aaf5a
ba314a void
3f80cd CAST5decrypt(byte const *in, byte *out, word32 const *xkey)
fabb36 {
c2fa05 ¤   word32 l, r, t;
54af5a
785492 #if MAC_68K
cadab7 ¤   // substituting these generates significantly better code
f81b9a ¤   register const word32 *¤s1 = S1;
117e2e ¤   register const word32 *¤s2 = S2;
d3a54d ¤   register const word32 *¤s3 = S3;
ceb546 ¤   register const word32 *¤s4 = S4;
817454 #endif
50af5a
b39129 #if __POWERPC__ || __M68K__
85bcf5 ¤   r = ((word32 const *)in)[0];¤   /* Big-endian, unaligned okay */
6f8ed6 ¤   l = ((word32 const *)in)[1];
b0db21 #else
6386ef ¤   r = (word32)in[0]<<24 | (word32)in[1]<<16 | (word32)in[2]<<8 | in[3];
feaf2b ¤   l = (word32)in[4]<<24 | (word32)in[5]<<16 | (word32)in[6]<<8 | in[7];
7c7454 #endif
88af5a
6a3723 ¤   t = F1(l, xkey, 15); r ^= G1(t);
4a6d59 ¤   t = F3(r, xkey, 14); l ^= G3(t);
e45d3e ¤   t = F2(l, xkey, 13); r ^= G2(t);
10cd71 ¤   t = F1(r, xkey, 12); l ^= G1(t);
350f8f ¤   /* Start here if only doing 12 rounds */
80833a ¤   t = F3(l, xkey, 11); r ^= G3(t);
cb8f0e ¤   t = F2(r, xkey, 10); l ^= G2(t);
2f68af ¤   t = F1(l, xkey, ·9); r ^= G1(t);
0432d5 ¤   t = F3(r, xkey, ·8); l ^= G3(t);
1c5276 ¤   t = F2(l, xkey, ·7); r ^= G2(t);
e7c239 ¤   t = F1(r, xkey, ·6); l ^= G1(t);
fd8c72 ¤   t = F3(l, xkey, ·5); r ^= G3(t);
7c8046 ¤   t = F2(r, xkey, ·4); l ^= G2(t);
ed2c5a ¤   t = F1(l, xkey, ·3); r ^= G1(t);
097620 ¤   t = F3(r, xkey, ·2); l ^= G3(t);
e16e25 ¤   t = F2(l, xkey, ·1); r ^= G2(t);
14fe6a ¤   t = F1(r, xkey, ·0); l ^= G1(t);
--e252 000d9b1792d40120042 Page 21 of cast5.cpp
e0af5a
919129 #if __POWERPC__ || __M68K__
114069 ¤   ((word32 *)out)[0] = l;¤¤   /* Big-endian, unaligned okay */
c475f4 ¤   ((word32 *)out)[1] = r;
39db21 #else
b32e4e ¤   out[0] = B0(l);
8baf30 ¤   out[1] = B1(l);
e324a3 ¤   out[2] = B2(l);
6fa5dd ¤   out[3] = B3(l);
d146db ¤   out[4] = B0(r);
fec7a5 ¤   out[5] = B1(r);
854c36 ¤   out[6] = B2(r);
78cd48 ¤   out[7] = B3(r);
637454 #endif
01efe6 }
afaf5a
566d00 #endif // ] USE_CAST_DECRYPT_CODE
43af5a
3faf5a
d8af5a
1d5bf3 ¤   static word32
6631f7 ContinueCRC32(
985a35 ¤   const word32 *¤ words,
77f0c4 ¤   size_t¤ ¤   ¤   numWords,
ee5207 ¤   word32¤ ¤   ¤   startCRC)
42bb36 {
9f1037 ¤   word32¤ ¤   ¤   k4C11DB7¤   = 0x04C11DB7;
eac64f ¤   word32 ¤¤   ¤   crc¤¤   ¤   = startCRC;
90f366 ¤   word32 const *¤ curWord ¤   ¤   = words;
8ecc28 ¤   word32 const *¤ lastWord¤   ¤   = words + (numWords - 1);
adaf5a
06ea8f ¤   while( curWord <= lastWord )
5fc7a1 ¤   {
07f39a ¤   ¤   int¤¤   ¤   ¤   remaining;
a3906a ¤   ¤   word32¤ ¤   ¤   theWord;
059f6e ¤   ¤   unsigned char¤  bytes[ 4 ];
05ce91 ¤   ¤   const unsigned char *¤  curByte;
3a1b52 ¤   ¤
89da60 ¤   ¤   /* we want an endian-independent CRC */
43b754 ¤   ¤   /* place the bytes in big-endian order */
fb2665 ¤   ¤   theWord¤= *curWord++;
b42527 ¤   ¤   bytes[ 0 ]¤ = (theWord >> 24) & 0xFF;
40ccdf ¤   ¤   bytes[ 1 ]¤ = (theWord >> 16) & 0xFF;
53583f ¤   ¤   bytes[ 2 ]¤ = (theWord >> 8) & 0xFF;
4aa179 ¤   ¤   bytes[ 3 ]¤ = theWord & 0xFF;
061b52 ¤   ¤
469198 ¤   ¤   remaining¤  = 4;
02ac1c ¤   ¤   curByte¤¤   = bytes;
fa6fe6 ¤   ¤   while ( remaining-- != 0 )
0c5b34 ¤   ¤   {
d735c9 ¤   ¤   ¤   SInt32¤ ¤   ¤   check;
6faf5a
65480c ¤   ¤   ¤   crc ^= ((SInt32 ) *curByte) << 8;
f6f03d ¤   ¤   ¤   ++curByte;
d5af5a
f8520e ¤   ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
ea520e ¤   ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
dd520e ¤   ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
b2520e ¤   ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
7e520e ¤   ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
eb520e ¤   ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
ea520e ¤   ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
32520e ¤   ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
9e0fe4 ¤   ¤   }
d89371 ¤   }
89af5a
86397e ¤   return( crc );
84efe6 }
6faf5a
feaf5a
67af5a
d9af5a
--5485 00098c181ed40120042 Page 22 of cast5.cpp
dd7e69 ¤   Boolean
d321f3 VerifyCastSBoxesValid()
1cc7a1 ¤   {
785a0d ¤   Boolean¤¤   ¤   valid¤  = TRUE;
ec909c ¤   unsigned long¤  crc¤= 0;
a4af5a
3edf8a ¤   // Force reference to our static so linker does not remove it.
821636 ¤   #if MAC68K_ALIGN_HACK
efc7a1 ¤   {
e3af91 ¤   ¤   crc¤= ContinueCRC32( (word32 *)___AlignHack, sizeof( ___AlignHack ),
4a094c ¤   ¤   ¤   ¤   ¤   crc );
f02460 ¤   ¤   crc = 0;
529371 ¤   }
5db7ec ¤   #endif
0daf5a
28eecc ¤   pgpAssert( ( (long)&S1[ 0 ] & 0x3 ) == 0 );
f07c86 ¤   pgpAssert( ( (long)&S2[ 0 ] & 0x3 ) == 0 );
1df54f ¤   pgpAssert( ( (long)&S3[ 0 ] & 0x3 ) == 0 );
885003 ¤   pgpAssert( ( (long)&S4[ 0 ] & 0x3 ) == 0 );
bfd9ca ¤   pgpAssert( ( (long)&S5[ 0 ] & 0x3 ) == 0 );
654b80 ¤   pgpAssert( ( (long)&S6[ 0 ] & 0x3 ) == 0 );
a2c249 ¤   pgpAssert( ( (long)&S7[ 0 ] & 0x3 ) == 0 );
170909 ¤   pgpAssert( ( (long)&S8[ 0 ] & 0x3 ) == 0 );
48af5a
565117 ¤   crc¤= ContinueCRC32( S1, sizeof( S1 ) / sizeof( S1[ 0 ] ), crc );
d97078 ¤   crc¤= ContinueCRC32( S2, sizeof( S2 ) / sizeof( S2[ 0 ] ), crc );
559752 ¤   crc¤= ContinueCRC32( S3, sizeof( S3 ) / sizeof( S3[ 0 ] ), crc );
3432a6 ¤   crc¤= ContinueCRC32( S4, sizeof( S4 ) / sizeof( S4[ 0 ] ), crc );
eed58c ¤   crc¤= ContinueCRC32( S5, sizeof( S5 ) / sizeof( S5[ 0 ] ), crc );
aff4e3 ¤   crc¤= ContinueCRC32( S6, sizeof( S6 ) / sizeof( S6[ 0 ] ), crc );
a313c9 ¤   crc¤= ContinueCRC32( S7, sizeof( S7 ) / sizeof( S7[ 0 ] ), crc );
72b71a ¤   crc¤= ContinueCRC32( S8, sizeof( S8 ) / sizeof( S8[ 0 ] ), crc );
8caf5a
783f49 ¤   valid¤  = ( crc == 0xD8D4C8D7 );
9caf5a
b60b09 ¤   return( valid );
a49371 ¤   }
4267c5 ¤
1caf5a
99ed6f #if 0¤  // KEEP [
0d38e5 /*
1357d0 ·* Appendix C.
c27288 ·* This appendix provides test vectors for the CAST-128 cipher described
ae805e ·* in Section 5 and in Appendices A and B.
02e225 ·* C.1. Single Key-Plaintext-Ciphertext Set
5d7567 ·* 128-bit key ······= 01 23 45 67 12 34 56 78 23 45 67 89 34 56 78 9A (hex)
b535d5 ·* 64-bit plaintext ·= 01 23 45 67 89 AB CD EF (hex)
841d41 ·* 64-bit ciphertext = 23 8B 4F E5 84 7E 44 B2 (hex)
fc0c84 ·* C.2. Full Maintenance Test
fe0835 ·* A maintenance test for CAST-128 has been defined to verify the correctness
cfe4ac ·* of implementations. ·It is defined in pseudo-code as follows, where a and
8042ac ·* b are 128-bit vectors, aL and aR are the leftmost and rightmost halves of
21ac57 ·* a, bL and bR are the leftmost and rightmost halves of b, and encrypt(d,
13d4c6 ·* k) is the encryption in ECB mode of block d under key k.
ff9ec0 ·*·
6028e7 ·* .
a84194 ·* Initial·
204f73 ·* a = 01 23 45 67 12 34 56 78 23 45 67 89 34 56 78 9A (hex)
404194 ·* Initial·
7c58bc ·* b = 01 23 45 67 12 34 56 78 23 45 67 89 34 56 78 9A (hex)
1b334e ·* do 1,000,000 times
2385a8 ·* {
7bac69 ·* ····aL = encrypt( aL , b)
dcf16b ·* ····aR = encrypt( aR , b)
a43a2b ·* ····bL = encrypt( bL , a)
9d6729 ·* ····bR = encrypt( bR , a)
80d178 ·* }
5197c3 ·* Verify·
cee5a5 ·* a == EE A9 D0 A2 49 FD 3B A6 B3 43 6F B8 9D 6D CA 92 (hex)
9197c3 ·* Verify·
b123df ·* b == B2 C9 5E B0 0C 31 AD 71 80 AC 05 B8 E8 3D 69 6E (hex)
98595b ·* ¤
--72f8 001d70ad96040120042 Page 23 of cast5.cpp
fe9ec0 ·*·
bd495d ·*/
0fa091 ¤   int
d97f68 main(void)
08bb36 {
a9aa8a ¤   byte a[16] =·
c5c7a1 ¤   {
2b20b9 ¤   ¤   0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
0a4bf2 ¤   ¤   0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A
6562bd ¤   };
387c8d ¤   byte b[16] =·
2bc7a1 ¤   {
9520b9 ¤   ¤   0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
bb4bf2 ¤   ¤   0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A
0162bd ¤   };
3e16b8 ¤   byte test[8] =
0fc7a1 ¤   {
7b9ced ¤   ¤   0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
5962bd ¤   };
f7ae98 ¤   static byte const expect1[8] =
b9c7a1 ¤   {
8f7379 ¤   ¤   ·0x23, 0x8B, 0x4F, 0xE5, 0x84, 0x7E, 0x44, 0xB2
8d62bd ¤   };
391a1a ¤   static byte const expecta[16] =
7ac7a1 ¤   {
54052e ¤   ¤   0xEE, 0xA9, 0xD0, 0xA2, 0x49, 0xFD, 0x3B, 0xA6,
42b14f ¤   ¤   0xB3, 0x43, 0x6F, 0xB8, 0x9D, 0x6D, 0xCA, 0x92
4562bd ¤   };
7a90ca ¤   static byte const expectb[16] =
cec7a1 ¤   {
7930f0 ¤   ¤   0xB2, 0xC9, 0x5E, 0xB0, 0x0C, 0x31, 0xAD, 0x71,
18ee3a ¤   ¤   0x80, 0xAC, 0x05, 0xB8, 0xE8, 0x3D, 0x69, 0x6E
fd62bd ¤   };
56892f ¤   word32¤ xkey[32];
51438b ¤   long¤   count;
48af5a
240049 ¤   printf("Simple sanity check...\n");
2367c5 ¤
3bd2a5 ¤   printhex(" ······Key =", a, sizeof(a));
3e4e94 ¤   CAST5schedule(xkey, a);
2a868e ¤   printhex(" Plaintext =", test, sizeof(test));
1f44ea ¤   CAST5encrypt(test, test, xkey);
18e491 ¤   printhex("Ciphertext =", test, sizeof(test));
dbd369 ¤   printhex(" ···Expect =", expect1, sizeof(expect1));
3202c3 ¤   if (memcmp(test, expect1, sizeof(test)) != 0)
e507df ¤   ¤   printf("¤   ¤   ***** ERROR *****\n");
f567c5 ¤
e64371 ¤   printf("Full maintenance test (4,000,000 encryptions)...\n");
56af5a
74a36b ¤   for (count = 0 ;count < 1000000; count++) {
efc607 ¤   ¤   CAST5schedule(xkey, b);
028656 ¤   ¤   CAST5encrypt(a, a, xkey);
8499d0 ¤   ¤   CAST5encrypt(a+8, a+8, xkey);
7be3ca ¤   ¤   CAST5schedule(xkey, a);
6afcc8 ¤   ¤   CAST5encrypt(b, b, xkey);
042e2f ¤   ¤   CAST5encrypt(b+8, b+8, xkey);
0f9371 ¤   }
f1fcd7 ¤   printhex(" ····a =", a, sizeof(a));
16d8c3 ¤   printhex("Expect =", expecta, sizeof(expecta));
b6318e ¤   if (memcmp(a, expecta, sizeof(a)) != 0)
8d07df ¤   ¤   printf("¤   ¤   ***** ERROR *****\n");
5760d1 ¤   printhex(" ····b =", b, sizeof(b));
a39cbb ¤   printhex("Expect =", expectb, sizeof(expectb));
4b2f4e ¤   if (memcmp(b, expectb, sizeof(b)) != 0)
d907df ¤   ¤   printf("¤   ¤   ***** ERROR *****\n");
e5af5a
0e3e6b ¤   return 0;
f1efe6 }
07a5ee #endif¤ // ] KEEP
d7af5a
--30e7 00018267e4740120043 Page 1 of cast5.h
0ea2ad /*******************************************************************************
b5a890 ·*¤ ¤   ¤   ¤   ¤   C A S T 5 ··S Y M M E T R I C ··C I P H E R
7349e9 ·*¤ ¤   Copyright (c) 1996 Northern Telecom Ltd. All rights reserved.
aa419b ·*******************************************************************************
47775e ·*
54327e ·* FILE:¤   ¤   cast5.h
39775e ·*
8187ff ·* AUTHOR(S):¤  R.T.Lockhart, Dept. 9C40, Nortel Ltd.
497851 ·*¤ ¤   ¤   ¤   C. Adams, Dept 9C21, Nortel Ltd.
58775e ·*
bcb6f4 ·* DESCRIPTION: CAST5 header file. This file defines the interface for
a832d9 ·* the CAST5 symmetric-key encryption/decryption/MACing code. The code
7c4ab5 ·* supports key lengths from 8 through 128 bits, in multiples of 8.
dd775e ·*
d1775e ·*
cfe121 ·* Error handling:
3af55c ·* Most functions return an int that indicates the success or failure of the
c15864 ·* operation. See the C5E_xxx #defines for a list of error conditions.
3c2139 ·*¤
be175e ·* Data size assumptions: ¤ BYTE¤   - unsigned 8 bits
1acbce ·*¤ ¤   ¤   ¤   UINT32¤ - unsigned 32 bits
23775e ·*
cc3f23 ·******************************************************************************/
56d83c ·
3dc0f0 #ifndef CAST5_H
61e3f8 #define CAST5_H
11af5a
b9a4a9 typedef unsigned long word32;
2b8fc6 typedef unsigned char byte;·
87af5a
12ee3a void CAST5schedule( word32 xkey[32], byte const *k);
371a11 void CAST5encrypt( byte const *in, byte *out, word32 const *xkey);
0e28dc void CAST5decrypt( byte const *in, byte *out, word32 const *xkey);
61af5a
f81bf5 // stuff we've added
2511d5 #ifndef CAST5_INTERLEAVED_ENCRYPT
41dfe4 #define CAST5_INTERLEAVED_ENCRYPT 1
1a7454 #endif
e677e6 #ifndef DOUBLE_DECRYPT
6f89fa #define DOUBLE_DECRYPT 1
b47454 #endif
f9af5a
eedb0e #if !CAST5_INTERLEAVED_ENCRYPT
4daa9e void CAST5encryptCFB(word32 const *xkey, word32 iv0, word32 iv1,
728608 ¤   ¤   ¤   word32 const *src, word32 *dest, word32 len);
7f0c8a void CAST5decryptCFB(word32 const *xkey, word32 iv0, word32 iv1,
6d8608 ¤   ¤   ¤   word32 const *src, word32 *dest, word32 len);
4ddb21 #else
85673c void CAST5encryptCFBdbl(word32 const *xkey, word32 iv0, word32 iv1,
5147e2 ¤   ¤   ¤   word32 iv2, word32 iv3, word32 const *src, word32 *dest,
6da208 ¤   ¤   ¤   word32 len);
5e7ae7 void CAST5decryptCFBdbl(word32 const *xkey, word32 iv0, word32 iv1,
2947e2 ¤   ¤   ¤   word32 iv2, word32 iv3, word32 const *src, word32 *dest,
5ea208 ¤   ¤   ¤   word32 len);
337454 #endif
35af5a
d12239 Boolean¤¤   VerifyCastSBoxesValid( void );
80af5a
5b314a void
6a67d5 CAST5asm2(
c42477 ¤   word32 const *xkey,
f1c66c ¤   word32 in0, word32 in1,
241ff3 ¤   word32 const *src,
733079 ¤   word32 *dest,
c1bd76 ¤   word32 in2, word32 in3);
daaf5a
3c314a void
0ba849 CAST5decryptCFB2(
fe2477 ¤   word32 const *xkey,
782ad7 ¤   word32 in0, word32 in1,¤// IV
771ff3 ¤   word32 const *src,
183079 ¤   word32 *dest,
--bbfb 001cf8e33e440120043 Page 2 of cast5.h
575252 ¤   word32 len);
60af5a
346bef #endif /* CAST5_H */
cfaf5a
--1422 0004cfd277e40120044 Page 1 of cast5box.c
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
ae2bda ¤   $Id: cast5box.c,v 1.3.8.1 1998/11/12 03:05:49 heller Exp $
5bf7f7 ____________________________________________________________________________*/
5baf5a
5438e5 /*
c1e02f ·* The new CAST5 S-boxes, each mapping 8 input bits to 32 output bits.
ac5ae6 ·* These boxes are at the heart of CAST's security. ·Random boxes
4ca12c ·* would not do nearly as well!
63495d ·*/
87af5a
d3af5a
633f82 static word32 const S1[256] = {
04b948 ¤   0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3,
527ff0 ¤   0x6003e540, 0xcf9fc949, 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675,
8d0ab9 ¤   0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, 0x28683b6f, 0xc07fd059,
aaee18 ¤   0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d,
52332d ¤   0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b,
e61642 ¤   0x22568e3a, 0xa2d341d0, 0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de,
1d5626 ¤   0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7, 0xb82cbaef, 0xd751d159,
924ca1 ¤   0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935,
e9515b ¤   0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f,
839a21 ¤   0xb48ee411, 0x4bff345d, 0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165,
1520b9 ¤   0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50, 0x882240f2, 0x0c6e4f38,
76ac40 ¤   0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe,
dacec4 ¤   0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493,
af5661 ¤   0xe63d37e0, 0x2a54f6b3, 0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a,
1516d0 ¤   0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167, 0x38901091, 0xc6b505eb,
d24468 ¤   0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291,
2c080d ¤   0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14,
753cd7 ¤   0xa0bebc3c, 0x54623779, 0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6,
f19cd7 ¤   0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2, 0x81383f05, 0x6963c5c8,
4dd886 ¤   0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511,
0b576b ¤   0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495,
310054 ¤   0xaa573b04, 0x4a805d8d, 0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e,
5ed435 ¤   0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5, 0x6b54bfab, 0x2b0b1426,
4f1fc4 ¤   0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324,
bfbf73 ¤   0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98,
48b500 ¤   0xe31231b2, 0x2ad5ad6c, 0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f,
71418f ¤   0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc, 0x7b5a41f0, 0xd37cfbad,
fd3694 ¤   0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d,
5f5d2b ¤   0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464,
ac7a9e ¤   0x5ad328d8, 0xb347cc96, 0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a,
5778cf ¤   0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a, 0x3f04442f, 0x6188b153,
99bfda ¤   0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d,
d927cc ¤   0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274,
9ee131 ¤   0xdd24cb9e, 0x7e1c54bd, 0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755,
6ca13d ¤   0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6, 0x580304f0, 0xca042cf1,
d62f6f ¤   0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9,
97c87c ¤   0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1,
da41e0 ¤   0xd5ea50f1, 0x85a92872, 0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79,
c9714c ¤   0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c, 0x474d6ad7, 0x7c0c5e5c,
9b4230 ¤   0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e,
11ad7b ¤   0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff,
9dcdc5 ¤   0xb141ab08, 0x7cca89b9, 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d,
778280 ¤   0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf };
47af5a
b5c131 static word32 const S2[256] = {
2a7c67 ¤   0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a,
746e56 ¤   0x55889c94, 0x72fc0651, 0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba,
fe5544 ¤   0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3, 0xa0b52f7b, 0x59e83605,
1ac2ec ¤   0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb,
d3401b ¤   0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b,
2c382b ¤   0x25a1ff41, 0xe180f806, 0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4,
de3748 ¤   0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b, 0xe113c85b, 0xacc40083,
9746ce ¤   0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359,
c3d1ce ¤   0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f,
d4f855 ¤   0x361e3084, 0xe4eb573b, 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d,
0a359b ¤   0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c, 0x10843094, 0x2537a95e,
4c8e5c ¤   0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34,
--1d33 000e20bc70340120044 Page 2 of cast5box.c
87270f ¤   0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366,
e5e413 ¤   0x721d9bfd, 0xa58684bb, 0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4,
748372 ¤   0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd, 0xc5d655dd, 0xeb667064,
4043f0 ¤   0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860,
3cdb95 ¤   0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6,
43637d ¤   0x83ca6b94, 0x2d6ed23b, 0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709,
0c1cdd ¤   0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304, 0x81ed6f61, 0x20e74364,
42a1b1 ¤   0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b,
810729 ¤   0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b,
eada80 ¤   0xa4b09f6b, 0x1ca815cf, 0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9,
716f3f ¤   0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c, 0xee41e729, 0x6e1d2d7c,
5a6715 ¤   0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13,
4ead2d ¤   0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741,
190219 ¤   0x7cbad9a2, 0x2180036f, 0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab,
e4788d ¤   0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6, 0xcdf0b680, 0x17844d3b,
8de52a ¤   0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6,
0eea29 ¤   0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa,
b81cc8 ¤   0xef8579cc, 0xd152de58, 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8,
b7a873 ¤   0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, 0xb8da230c, 0x80823028,
7b5857 ¤   0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d,
debe7e ¤   0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6,
5331e1 ¤   0x273be979, 0xb0ffeaa6, 0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b,
ea2e6d ¤   0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4, 0xdc8637a0, 0x16a7d3b1,
72525b ¤   0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6,
955bdf ¤   0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb,
ca53c0 ¤   0x145892f5, 0x91584f7f, 0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea,
a39754 ¤   0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249, 0xb284600c, 0xd835731d,
908440 ¤   0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa,
275ef9 ¤   0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e,
c3bf12 ¤   0x5c038323, 0x3e5d3bb9, 0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef,
bad004 ¤   0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1 };
98af5a
5894a0 static word32 const S3[256] = {
c3ea5b ¤   0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b,
b1a650 ¤   0x8c1fc644, 0xaececa90, 0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae,
3f3f35 ¤   0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5, 0x11107d9f, 0x07647db9,
c1e748 ¤   0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e,
7e69f6 ¤   0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd,
1e7f5b ¤   0x9255c5ed, 0x1257a240, 0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e,
9b2404 ¤   0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5, 0xa8c01db7, 0x579fc264,
df5628 ¤   0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b,
bd54ce ¤   0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e,
d9e9ec ¤   0xc5884a28, 0xccc36f71, 0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f,
8f79cb ¤   0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04, 0xa747d2d0, 0x1651192e,
c74d5c ¤   0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82,
5b1643 ¤   0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790,
826a71 ¤   0x796fb449, 0x8252dc15, 0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504,
cd000b ¤   0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2, 0x23efe941, 0xa903f12e,
38f5d8 ¤   0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176,
573b89 ¤   0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8,
4f6491 ¤   0x96bbb682, 0x93b4b148, 0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d,
80c2a2 ¤   0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc, 0x8b907cee, 0xb51fd240,
be23e6 ¤   0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341,
89b251 ¤   0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c,
e06d45 ¤   0x127dadaa, 0x438a074e, 0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15,
83de09 ¤   0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51, 0x68cc7bfb, 0xd90f2788,
ece698 ¤   0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f,
55af4a ¤   0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa,
484955 ¤   0x27627545, 0x825cf47a, 0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392,
374c67 ¤   0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b, 0x285ba1c8, 0x3c62f44f,
9cc4ad ¤   0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b,
1d710a ¤   0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae,
ba55ec ¤   0x12deca4d, 0x2c3f8cc5, 0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67,
764990 ¤   0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45, 0x3a609437, 0xec00c9a9,
29530e ¤   0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536,
5117d1 ¤   0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888,
6cd4c6 ¤   0xa2e53f55, 0xb9e6d4bc, 0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d,
2f3174 ¤   0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0, 0x947b0001, 0x570075d2,
2f681c ¤   0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69,
a0c1c1 ¤   0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2,
3d7711 ¤   0xf1ac2571, 0xcc8239c2, 0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce,
e20aaf ¤   0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49, 0x5727c148, 0x2be98a1d,
--eac9 0008f306a1f40120044 Page 3 of cast5box.c
ab3cb6 ¤   0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d,
6230c6 ¤   0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00,
f715d9 ¤   0x52bce688, 0x1b03588a, 0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5,
5e725d ¤   0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783 };
e1af5a
e93446 static word32 const S4[256] = {
b67851 ¤   0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57,
c6847f ¤   0x85510443, 0xfa020ed1, 0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120,
2f8355 ¤   0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf, 0x28147f5f, 0x4fa2b8cd,
e71ee7 ¤   0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15,
3f4cfb ¤   0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe,
bd1ad7 ¤   0x081b08ca, 0x05170121, 0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701,
d6602d ¤   0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25, 0xce84ffdf, 0xf5718801,
e9ea2a ¤   0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5,
5898ce ¤   0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1,
bc964a ¤   0x72500e03, 0xf80eb2bb, 0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746,
3d2361 ¤   0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5, 0x4d351805, 0x7f3d5ce3,
61f21b ¤   0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d,
5a4ccb ¤   0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c,
06e947 ¤   0x18f8931e, 0x281658e6, 0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c,
cc84a0 ¤   0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23, 0x69dead38, 0x1574ca16,
a1d494 ¤   0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003,
a7baa3 ¤   0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7,
8c0a1b ¤   0x0ce5c2ec, 0x4db4bba6, 0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327,
576854 ¤   0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119, 0x6e85cb75, 0xbe07c002,
2d243e ¤   0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24,
43fd3e ¤   0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7,
71a991 ¤   0x041afa32, 0x1d16625a, 0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031,
de3778 ¤   0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79, 0x026a4ceb, 0x52437eff,
26053c ¤   0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df,
64f504 ¤   0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035,
732fb9 ¤   0x213d42f6, 0x2c1c7c26, 0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69,
be43f4 ¤   0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab, 0x63315c21, 0x5e0a72ec,
455f3b ¤   0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7,
62adeb ¤   0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e,
90c2a2 ¤   0xcfcbd12f, 0xc1de8417, 0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3,
3b0b03 ¤   0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2, 0x6f7de532, 0x58fd7eb6,
280a1f ¤   0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2,
7cba2c ¤   0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f,
b53dd5 ¤   0xaf9eb3db, 0x29c9ed2a, 0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091,
c51fd0 ¤   0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919, 0x77079103, 0xdea03af6,
b376fd ¤   0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef,
880127 ¤   0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2,
2bcf57 ¤   0xf3e0eb5b, 0xd6cc9876, 0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367,
ab8dc0 ¤   0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab, 0xb5676e69, 0x9bd3ddda,
d7ef9f ¤   0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04,
4c16c7 ¤   0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6,
e41560 ¤   0xb657c34d, 0x4edfd282, 0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e,
6520df ¤   0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2 };
c7af5a
8e61d7 static word32 const S5[256] = {
7dbe7a ¤   0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5,
e425a4 ¤   0x44dd9d44, 0x1731167f, 0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00,
49520b ¤   0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a, 0xe6a2e77f, 0xf0c720cd,
5a93da ¤   0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff,
971c6a ¤   0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb,
df3f6c ¤   0x8dba1cfe, 0x41a99b02, 0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725,
d5671e ¤   0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a, 0xf2f3f763, 0x68af8040,
b653ed ¤   0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7,
632ebc ¤   0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2,
cee4a9 ¤   0x2261be02, 0xd642a0c9, 0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec,
ed05ba ¤   0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981, 0x5c1ff900, 0xfe38d399,
5f3039 ¤   0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774,
d77dfd ¤   0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966,
be089b ¤   0xdfdd55bc, 0x29de0655, 0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468,
ee8ae6 ¤   0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2, 0xbcf3f0aa, 0x87ac36e9,
42bddb ¤   0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910,
59ff3d ¤   0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616,
88eec9 ¤   0xf24766e3, 0x8eca36c1, 0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4,
c160a0 ¤   0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da, 0x26e46695, 0xb7566419,
854a4b ¤   0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049,
8f3ec3 ¤   0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9,
--ca14 00047071a8a40120044 Page 4 of cast5box.c
97e0b7 ¤   0x68cb3e47, 0x086c010f, 0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6,
2ca11a ¤   0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba, 0x0ab378d5, 0xd951fb0c,
aa3080 ¤   0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be,
32b558 ¤   0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715,
29242b ¤   0x646c6bd7, 0x44904db3, 0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6,
d199f0 ¤   0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840, 0x76f0ae02, 0x083be84d,
b5490c ¤   0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4,
847ee9 ¤   0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba,
00f6e8 ¤   0x9cad9010, 0xaf462ba2, 0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487,
bb3ef4 ¤   0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7, 0x445f7382, 0x175683f4,
5246ef ¤   0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5,
564a55 ¤   0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c,
8d288d ¤   0x1ad2fff3, 0x8c25404e, 0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78,
c73915 ¤   0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e, 0x44094f85, 0x3f481d87,
607efe ¤   0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801,
2c6cf5 ¤   0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110,
753103 ¤   0x1b5ad7a8, 0xf61ed5ad, 0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58,
5b6be6 ¤   0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0, 0x5ce96c28, 0xe176eda3,
2a4ce6 ¤   0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20,
2b518f ¤   0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d,
3ab1b8 ¤   0x34010718, 0xbb30cab8, 0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55,
c12738 ¤   0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4 };
c8af5a
2b9f64 static word32 const S6[256] = {
5643df ¤   0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4,
4f9ff7 ¤   0xeced5cbc, 0x325553ac, 0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9,
6cbab3 ¤   0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138, 0x33f14961, 0xc01937bd,
926c26 ¤   0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367,
d1494b ¤   0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f,
a1d958 ¤   0xa888614a, 0x2900af98, 0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c,
4b8b9d ¤   0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072, 0xfd41197e, 0x9305a6b0,
e32633 ¤   0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3,
c19a8b ¤   0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941,
692aba ¤   0x2c0e636a, 0xba7dd9cd, 0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d,
51ee62 ¤   0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8, 0x284caf89, 0xaa928223,
578ae0 ¤   0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9,
59e1f2 ¤   0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6,
55f1b2 ¤   0x9a69a02f, 0x68818a54, 0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a,
0cf8dc ¤   0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387, 0x53bddb65, 0xe76ffbe7,
d50e51 ¤   0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc,
55bae6 ¤   0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89,
bcf9f3 ¤   0xfd339fed, 0xb87834bf, 0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be,
51b0b1 ¤   0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf, 0x4ec75b95, 0x24f2c3c0,
f118e8 ¤   0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f,
63896c ¤   0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4,
32b185 ¤   0xe9a9d848, 0xf3160289, 0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853,
5f844d ¤   0x20951063, 0x4576698d, 0xb6fad407, 0x592af950, 0x36f73523, 0x4cfb6e87,
e7e85c ¤   0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f,
e1c506 ¤   0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585,
b58ca8 ¤   0xdc049441, 0xc8098f9b, 0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751,
2c57d0 ¤   0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be, 0xbf32679d, 0xd45b5b75,
3d7273 ¤   0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13,
62ae39 ¤   0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283,
93b360 ¤   0x3cc2acfb, 0x3fc06976, 0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459,
a3a6ec ¤   0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0, 0x3007cd3e, 0x74719eef,
219879 ¤   0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891,
e1c4bf ¤   0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0,
4921d0 ¤   0xbc60b42a, 0x953498da, 0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb,
3731d8 ¤   0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc, 0xe8816f4a, 0x3814f200,
e7ca87 ¤   0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084,
0ed2ae ¤   0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf,
986821 ¤   0x3a479c3a, 0x5302da25, 0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b,
cd5fd1 ¤   0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121, 0xb81a928a, 0x60ed5869,
732f9d ¤   0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5,
c3109f ¤   0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb,
459fbb ¤   0xb0e93524, 0xbebb8fbd, 0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454,
f7f24e ¤   0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f };
a9af5a
52caf5 static word32 const S7[256] = {
eb8806 ¤   0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912,
79653e ¤   0xde6008a1, 0x2028da1f, 0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82,
4727fe ¤   0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de, 0xa05fbcf6, 0xcd4181e9,
--237d 000e6fcdddf40120044 Page 5 of cast5box.c
8fda17 ¤   0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43,
591260 ¤   0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4,
aa7566 ¤   0x1286becf, 0xb6eacb19, 0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9,
2a4b1c ¤   0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2, 0x107789be, 0xb3b2e9ce,
aef80f ¤   0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516,
33e288 ¤   0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7,
5cc67e ¤   0xd0d854c0, 0xcb3a6c88, 0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e,
1466f0 ¤   0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816, 0x0a961288, 0xe1a5c06e,
710cad ¤   0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756,
85bac2 ¤   0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9,
caddad ¤   0xc6e6fa14, 0xbae8584a, 0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b,
d70198 ¤   0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264, 0x92544a8b, 0x009b4fc3,
beb8bb ¤   0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688,
c25c22 ¤   0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c,
06ecdb ¤   0x16746233, 0x3c034c28, 0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802,
815359 ¤   0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3, 0x0c4fb99a, 0xbb325778,
11a3c3 ¤   0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7,
2ea723 ¤   0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be,
205a96 ¤   0xbe8b9d2d, 0x7979fb06, 0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858,
7e9ed6 ¤   0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033, 0xf28ebfb0, 0xf5b9c310,
4f0c09 ¤   0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a,
c402cc ¤   0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476,
03439b ¤   0x488dcf25, 0x36c9d566, 0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df,
6bd400 ¤   0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509, 0xf22b017d, 0xa4173f70,
3b0aa5 ¤   0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962,
150ed8 ¤   0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a,
dee7de ¤   0x058745b9, 0x3453dc1e, 0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07,
fc7664 ¤   0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c, 0x66626c1c, 0x7154c24c,
2da14f ¤   0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c,
d1c40c ¤   0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e,
0c59e9 ¤   0xe4f2dfa6, 0x693ed285, 0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378,
747254 ¤   0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301, 0xc79f022f, 0x3c997e7e,
2604c4 ¤   0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be,
995d9a ¤   0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301,
e3ceaa ¤   0xcfd2a87f, 0x60aeb767, 0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2,
e1bddf ¤   0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647, 0x97fd61a9, 0xea7759f4,
f8ebc7 ¤   0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914,
e7b38b ¤   0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021,
0c8685 ¤   0xc3c0bdae, 0x4958c24c, 0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada,
79c059 ¤   0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3 };
5daf5a
3fd6b9 static word32 const S8[256] = {
87ce51 ¤   0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b,
a323a5 ¤   0x0e241600, 0x052ce8b5, 0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174,
c95ce8 ¤   0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc, 0xde9adeb1, 0x0a0cc32c,
c4b7c0 ¤   0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd,
b6d74d ¤   0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7,
ca30ba ¤   0x72df191b, 0x7580330d, 0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164,
7ebea3 ¤   0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2, 0x12a8ddec, 0xfdaa335d,
3e692d ¤   0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862,
3987cd ¤   0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8,
c7efeb ¤   0x57e8726e, 0x647a78fc, 0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6,
d03822 ¤   0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c, 0xbbd35049, 0x2998df04,
d74010 ¤   0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e,
1f1e7f ¤   0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38,
43be70 ¤   0x424f7618, 0x35856039, 0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8,
5a64a7 ¤   0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8, 0x7170c608, 0x2d5e3354,
4f6482 ¤   0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42,
ca180c ¤   0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160,
7f060a ¤   0x7895cda5, 0x859c15a5, 0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab,
304b9d ¤   0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472, 0x835ffcb8, 0x6df4c1f2,
c844ac ¤   0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225,
2fb20a ¤   0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98,
9736ae ¤   0x7cd16efc, 0x1436876c, 0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441,
2fdd09 ¤   0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb, 0xa842eedf, 0xfdba60b4,
8482cc ¤   0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054,
2e39ba ¤   0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5,
e69702 ¤   0xbae7dfdc, 0x42cbda70, 0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c,
416bc6 ¤   0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc, 0x77853b53, 0x37effcb5,
e64212 ¤   0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c,
9e8107 ¤   0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b,
e6321c ¤   0xc4248289, 0xacf3ebc3, 0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4,
--0a70 0010706b69040120044 Page 6 of cast5box.c
0ba5cb ¤   0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4, 0xe87b40e4, 0xe98ea084,
939c70 ¤   0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101,
8ea23b ¤   0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a,
1ea7bb ¤   0xe0779695, 0xf9c17a8f, 0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf,
152608 ¤   0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e, 0x11403092, 0x00da6d77,
ad756f ¤   0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a,
66f3b6 ¤   0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f,
421e8b ¤   0xdf09822b, 0xbd691a6c, 0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819,
56bc82 ¤   0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384, 0x5938fa0f, 0x42399ef3,
a216f6 ¤   0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c,
a7c113 ¤   0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1,
4e49ee ¤   0xa466bb1e, 0xf8da0a82, 0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d,
19be53 ¤   0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e };
6baf5a
07af5a
--ca20 000e4a6151340120045 Page 1 of randpool.c
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
5714e4 ¤   $Id: randpool.c,v 1.4.2.1.2.1 1998/11/12 03:05:50 heller Exp $
b0f7f7 ____________________________________________________________________________*/
55af5a
1abea3 #include <stdlib.h>
3a324c #include <string.h>
6eb935 #include <Timer.h>
21af5a
293c1e #include "randpool.h"
3a4818 #include "SHA.h"
a9af5a
3aaf5a
66de42 #define RANDKEYWORDS 16¤/* This is a parameter of the the SHA1 algorithm */
bfaf5a
f839e0 /* The pool must be a multiple of the 16-byte (128-bit) SHA1 block size */
8932e1 #define RANDPOOLWORDS ((RANDPOOLBITS+127 & ~127) >> 5)
dfaf5a
045546 #if RANDPOOLWORDS <= RANDKEYWORDS
687fdc #error Random pool too small - please increase RANDPOOLBITS in randpool.h
b67454 #endif
40af5a
9342cb /* Must be word-aligned, so make it words. ·Cast to bytes as needed. */
7978db static word32 randPool[RANDPOOLWORDS];¤ /* Random pool */
207fbe static word32 randKey[RANDKEYWORDS];¤   /* Next stirring key */
3d5c9f static unsigned randPoolGetPos = sizeof(randPool); /* Position to get from */
7a8cc0 static unsigned randKeyAddPos = 0;¤ /* Position to add to */
98af5a
a4fbc6 //¤ Adds random stuff to the pool. Data from the mouse position and the
10def3 //¤ system clock is used.
f8af5a
07a00d Boolean AddRandomEntropy()
9dbb36 {
404b97 ¤   static Point ¤  oldMousePos = {0,0};
62197e ¤   Point ¤ ¤   ¤   mousePos;
979fe9 ¤   UnsignedWide ¤  curms;
7f0cb8 ¤   Boolean¤¤   ¤   added = FALSE;
fd67c5 ¤
e81ba3 ¤   //¤ Add any new mouse position to the random pool.
8e89fc ¤   GetMouse(&mousePos);
e4cdfe ¤   LocalToGlobal(&mousePos);
dba680 ¤   if(!EqualPt(mousePos, oldMousePos))
f9c7a1 ¤   {
5cedc0 ¤   ¤   oldMousePos = mousePos;
83ebb8 ¤   ¤   randPoolAddBytes((uchar *)&mousePos, sizeof(Point));
3a1b52 ¤   ¤
347efd ¤   ¤   added = TRUE;
559371 ¤   }
9267c5 ¤
9aac35 ¤   //¤ Add current Microseconds since startup time
ad53dc ¤   //¤ This is a 64 bit value
8c087a ¤   Microseconds(&curms);
02b56d ¤   randPoolAddBytes((uchar *)&curms, 8);
c967c5 ¤
ec6506 ¤   return( added );
c6efe6 }
3baf5a
cdaf5a
dd38e5 /*
6b4eed ·* "Stir in" any random seed material before removing any random bytes.
add9e6 ·* This also ensures that no sensitive data remains in memory that can
6dbb6a ·* be recovered later.
64775e ·*
bb4d69 ·* The transformation is carried out by "encrypting" the data in CFB
042194 ·* mode with MD5 as the block cipher. ·Then, to make certain the stirring
3d17e0 ·* operation is strictly one-way, we destroy the key, reinitializing it
d877a1 ·* with 64 bytes from the beginning of the pool. ·These bytes are not
9b59cb ·* returned by randPoolGetBytes().
02775e ·*
e4f944 ·* To make this useful for pseudo-random (that is, repeatable) operations,
--988e 0007facb31640120045 Page 2 of randpool.c
0034f0 ·* the MD5 transformation is always done with a consistent byte order.
a2e702 ·* MD5Transform itself works with 32-bit words, not bytes, so the pool,
8793e9 ·* usually an array of bytes, is transformed into an array of 32-bit words,
e18a32 ·* taking each group of 4 bytes in little-endian order. ·At the end of the
7ac0f8 ·* stirring, the transformation is reversed.
3f495d ·*/
72314a void
46f14c randPoolStir(void)
cdbb36 {
f74ba4 ¤   int i;
bfa6b4 ¤   word32 iv[4];
6baf5a
eb25a4 ¤   /* Start IV from last block of randPool */
c6b833 ¤   BlockMoveData(randPool+RANDPOOLWORDS-4, iv, sizeof(iv));
60af5a
c9984e ¤   /* CFB pass */
23aa55 ¤   for (i = 0; i < RANDPOOLWORDS; i += 4)
6fc7a1 ¤   {
0ca44b ¤   ¤   SHA¤¤   ¤   sha;
bfe91d ¤   ¤   SHA::Digest¤digest;
de1b52 ¤   ¤
f4abc3 ¤   ¤   sha.Update( (const uchar *) iv, sizeof( iv ) );
1063f5 ¤   ¤   sha.Update( (const uchar *) &randKey[ 0 ], sizeof( randKey ) );
d6ebd2 ¤   ¤   sha.Final( &digest );
9ae823 ¤   ¤   BlockMoveData( &digest, iv, sizeof( iv ) );
a9af5a
8eca09 ¤   ¤   iv[0] = randPool[i ·] ^= iv[0];
bf9892 ¤   ¤   iv[1] = randPool[i+1] ^= iv[1];
2fb0ea ¤   ¤   iv[2] = randPool[i+2] ^= iv[2];
b150cd ¤   ¤   iv[3] = randPool[i+3] ^= iv[3];
329371 ¤   }
6caf5a
15b7a9 ¤   /* Wipe iv from memory */
f350a4 ¤   for(i=0;i<4;i++)
541017 ¤   ¤   iv[i]=0;
2baf5a
1dd2d5 ¤   /* Get new key */
02681c ¤   BlockMoveData(randPool, randKey, sizeof(randKey));
52af5a
38ec2d ¤   /* Set up pointers for future addition or removal of random bytes */
3cb9b4 ¤   randKeyAddPos = 0;
a58226 ¤   randPoolGetPos = sizeof(randKey);
6befe6 }
79af5a
4638e5 /*
191304 ·* Make a deposit of information (entropy) into the pool. ·This is done
883f37 ·* by XORing the data into the key which used to encrypt the pool.
5f6e88 ·* Before any bytes are retrieved from the pool, the altered key will be
90af54 ·* used to encrypt the whole pool, causing all bits in the pool to
2dbcaf ·* depend on the new information.
b8775e ·*
0b17f7 ·* The bits deposited need not have any particular distribution;
104fde ·* the stirring operation transforms them into uniformly-distributed bits.
11495d ·*/
71314a void
409e9f randPoolAddBytes(byte const *buf, unsigned len)
c2bb36 {
05a860 ¤   byte *p = (byte *)randKey+randKeyAddPos;
c74e94 ¤   unsigned t = sizeof(randKey) - randKeyAddPos;
c8af5a
5c031b ¤   while (len > t) {
b067e1 ¤   ¤   len -= t;
9e0412 ¤   ¤   while (t--)
1a4d1e ¤   ¤   ¤   *p++ ^= *buf++;
91554e ¤   ¤   randPoolStir();¤¤   /* sets randKeyAddPos to 0 */
8da5a0 ¤   ¤   p = (byte *)randKey;
1205ae ¤   ¤   t = sizeof(randKey);
c39371 ¤   }
9eaf5a
2c5678 ¤   if (len) {
7a945b ¤   ¤   randKeyAddPos += len;
7f0c19 ¤   ¤   do
--2182 0016778fabc40120045 Page 3 of randpool.c
7c4d1e ¤   ¤   ¤   *p++ ^= *buf++;
7efc52 ¤   ¤   while (--len);
3e92c2 ¤   ¤   randPoolGetPos = sizeof(randPool); /* Force stir on get */
499371 ¤   }
71efe6 }
82af5a
8c38e5 /*
b39f83 ·* Withdraw some bits from the pool. ·Regardless of the distribution of the
7bb6d7 ·* input bits, the bits returned are uniformly distributed, although they
7a9f47 ·* cannot, of course, contain more Shannon entropy than the input bits.
25495d ·*/
73314a void
fe262c randPoolGetBytes(byte *buf, unsigned len)
64bb36 {
d90ed5 ¤   unsigned t;
d5af5a
71b38a ¤   while (len > (t = sizeof(randPool) - randPoolGetPos)) {
52805f ¤   ¤   BlockMoveData((byte const *)randPool+randPoolGetPos, buf, t);
b22cc8 ¤   ¤   buf += t;
ed67e1 ¤   ¤   len -= t;
83cfdf ¤   ¤   randPoolStir();
da9371 ¤   }
14af5a
20e5f4 ¤   BlockMoveData((byte const *)randPool+randPoolGetPos, buf, len);
b1a6d6 ¤   randPoolGetPos += len;
34efe6 }
7aaf5a
29f2c0 /* Get a single byte */
624313 byte
d9cb12 randPoolGetByte(void)
89bb36 {
6daebc ¤   if (randPoolGetPos == sizeof(randPool))
43cfdf ¤   ¤   randPoolStir();
12af5a
ba7f62 ¤   return ((byte const *)randPool)[randPoolGetPos++];
67efe6 }
--a7c3 001eb64a99740120046 Page 1 of randpool.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
fc304b ¤   $Id: randpool.h,v 1.3.8.1 1998/11/12 03:05:50 heller Exp $
f1f7f7 ____________________________________________________________________________*/
a3af5a
f27b7d #pragma once
71af5a
b7e431 #include "usuals.h"
37af5a
5c03a0 /* Set this to whatever you need (must be > 512) */
5be3dc #define RANDPOOLBITS 1024
e5af5a
efdb65 Boolean AddRandomEntropy();
b43f94 void ¤  randPoolStir(void);
289f0f void ¤  randPoolAddBytes(byte const *buf, unsigned len);
449103 void ¤  randPoolGetBytes(byte *buf, unsigned len);
6a8bc5 byte ¤  randPoolGetByte(void);
ebaf5a
--02e5 00067e28b1740120047 Page 1 of GestaltProc.c
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
f7e91c ¤   $Id: GestaltProc.c,v 1.5.8.1 1998/11/12 03:05:52 heller Exp $
c6f7f7 ____________________________________________________________________________*/
d8af5a
e09040 #include <A4Stuff.h>
64c645 #include <SetUpA4.h>
97af5a
5e0d08 #include "pgpMem.h"
4e6915 #include "MacResources.h"
0faf5a
6349af #include "PGPDiskGlobals.h"
ddc50f #include "PGPDiskGestalt.h"
86de32 #include "PGPDiskPatches.h"
d2af5a
21de46 static Boolean¤ ¤   ¤   sPatchesInstalled = FALSE;
bff40a static Handle¤  ¤   ¤   sPatchesCode¤   ¤   = nil;
20fc43 static UInt32¤  ¤   ¤   sPatchesCodeSize¤   = 0;
52faed static PGPDiskGlobals¤  sGlobals;
30af5a
850a53 ¤   static pascal OSErr
bd4e97 GestaltProc(OSType selector, long *response)
5bbb36 {
4f9c1a ¤   OSErr¤  err = noErr;
5b67c5 ¤
106aab ¤   EnterCallback();
efaf5a
b89aba ¤   pgpAssert( selector == gestaltPGPDisk );
4ae2d9 ¤   pgpAssertAddrValid( response, long );
b667c5 ¤
67dec4 ¤   if( selector == gestaltPGPDisk )
3dc7a1 ¤   {
3e97d3 ¤   ¤   *response = (long) &sGlobals;
399371 ¤   }
160e24 ¤   else
40c7a1 ¤   {
2268df ¤   ¤   err = gestaltUndefSelectorErr;
2c9371 ¤   }
9e67c5 ¤
5036ff ¤   ExitCallback();
c9af5a
04deb7 ¤   return( err );
11efe6 }
86af5a
d1cd8d ¤   static Boolean
b2f94f PatchesInstalled(void)
d6bb36 {
145098 ¤   // The patch proc is given the address of sPatchesInstalled when the
3a6d4f ¤   // patches are installed. Calling our semaphore routine TickCount() will
3276fa ¤   // set sPatchesInstalled to TRUE if the patches are installed in this
14745a ¤   // context.
e967c5 ¤
7e5327 ¤   sPatchesInstalled = FALSE;
9c67c5 ¤
54d88c ¤   (void) TickCount();
be67c5 ¤
54a0ef ¤   return( sPatchesInstalled );
34efe6 }
44af5a
5533c8 ¤   static void
af656d IdleProc(void)
f6bb36 {
bf323e ¤   OSStatus¤   status = noErr;
47af5a
8c6aab ¤   EnterCallback();
8baf5a
011e8d #if INSTALL_PATCHES¤// [
7d4f5c ¤   if( ( ! PatchesInstalled() ) && IsntNull( sPatchesCode ) )
4dc7a1 ¤   {
677e96 ¤   ¤   THz¤¤   applicationZone;
--0fa3 0009cd0bf4440120047 Page 2 of GestaltProc.c
b3ad91 ¤   ¤   UInt32¤ heapSize;
2c1b52 ¤   ¤
e7cb69 ¤   ¤   AssertHandleIsValid( sPatchesCode, "IdleProc" );
061b52 ¤   ¤
2c3799 ¤   ¤   // Install the patches using a copy of the patches code residing in
41a620 ¤   ¤   // the application heap. This copy will get it's own global state
cbd388 ¤   ¤   // and will be nuked automatically when the application quits.
7a64bf ¤   ¤   // The patch is installed only if the heap is at least 64K in size
e167c5 ¤
022362 ¤   ¤   applicationZone¤= ApplicationZone();
9b1b52 ¤   ¤
159f8b ¤   ¤   heapSize = (UInt32) StripAddress( applicationZone->bkLim ) -·
7ebb68 ¤   ¤   ¤   ¤   ¤   (UInt32) StripAddress( &applicationZone->heapData );
71e77e ¤   ¤   if( heapSize > 64 * 1024L )
a55b34 ¤   ¤   {
22441b ¤   ¤   ¤   THz¤¤   saveZone;
672a72 ¤   ¤   ¤   Ptr¤¤   patchesCopy;
d087c7 ¤   ¤   ¤
a1ad4f ¤   ¤   ¤   saveZone = GetZone();
36f0ea ¤   ¤   ¤   SetZone( applicationZone );
2d87c7 ¤   ¤   ¤
f141c7 ¤   ¤   ¤   patchesCopy = NewPtr( sPatchesCodeSize );
2b2d62 ¤   ¤   ¤   if( IsntNull( patchesCopy ) )
a3f776 ¤   ¤   ¤   {
e11116 ¤   ¤   ¤   ¤   PGPDiskPatchesProcPtr¤  patchesProc;
562b85 ¤   ¤   ¤   ¤
6fb38d ¤   ¤   ¤   ¤   BlockMove( *sPatchesCode, patchesCopy, sPatchesCodeSize );
b32b85 ¤   ¤   ¤   ¤
f13268 ¤   ¤   ¤   ¤   patchesProc = (PGPDiskPatchesProcPtr) patchesCopy;
b62b85 ¤   ¤   ¤   ¤
269a02 ¤   ¤   ¤   ¤   status = (*patchesProc)( &sPatchesInstalled );
9aa3a6 ¤   ¤   ¤   }
2bbb8c ¤   ¤   ¤   else
a3f776 ¤   ¤   ¤   {
ce43b7 ¤   ¤   ¤   ¤   status = memFullErr;
28a3a6 ¤   ¤   ¤   }
abaf5a
133df6 ¤   ¤   ¤   SetZone( saveZone );
860fe4 ¤   ¤   }
f5af5a
d99371 ¤   }
b376d8 #endif¤ // ]
bbaf5a
585907 ¤   AssertNoErr( status, "IdleProc" );
d536ff ¤   ExitCallback();
93efe6 }
50af5a
082473 ¤   static OSStatus
e3ff75 RealMain(void)
edbb36 {
20f1e2 ¤   OSStatus¤   ¤   status ¤¤   ¤   ¤   ¤   = noErr;
f9cb23 ¤   static Boolean¤ sGestaltProcInstalled ¤ = FALSE;
03af5a
8c84dd ¤   if( ! sGestaltProcInstalled )
acc7a1 ¤   {
facd4f ¤   ¤   THz¤¤   saveZone;
c51b52 ¤   ¤
2a08a1 ¤   ¤   // This is the first invocation of this proc by the application.
a2e00a ¤   ¤   // Install the Gestalt proc and fetch the patch code. The application
5c09a2 ¤   ¤   // resource file is the current resource file.
6d1b52 ¤   ¤
9d9a47 ¤   ¤   saveZone = GetZone();
57d812 ¤   ¤   SetZone( SystemZone() );
8d1b52 ¤   ¤
691e8d #if INSTALL_PATCHES¤// [
f05a2c ¤   ¤   sPatchesCode = Get1Resource( kPatchesProcResType, kPatchesProcResID );
c36f4b ¤   ¤   if( IsntNull( sPatchesCode ) )
835b34 ¤   ¤   {
c63d27 ¤   ¤   ¤   DetachResource( sPatchesCode );
5187c7 ¤   ¤   ¤
1be392 ¤   ¤   ¤   sPatchesCodeSize = GetHandleSize( sPatchesCode );
9c0fe4 ¤   ¤   }
--d373 0019e8dd76f40120047 Page 3 of GestaltProc.c
040e1d ¤   ¤   else
5c5b34 ¤   ¤   {
fe1b52 ¤   ¤
4a0adf ¤   ¤   ¤   // It is OK to fail here. If the patches code resource is not
ded8fe ¤   ¤   ¤   // present, then we assume no patches are needed. This "feature"
14b80a ¤   ¤   ¤   // allows for external modification of the app if necessary
860fe4 ¤   ¤   }
fe76d8 #endif¤ // ]
081b52 ¤   ¤
7ca42d ¤   ¤   PrepareCallback();
cc1b52 ¤   ¤
99ac85 ¤   ¤   pgpClearMemory( &sGlobals, sizeof( sGlobals ) );
5a1b52 ¤   ¤
0e1211 ¤   ¤   sGlobals.magic¤ ¤   ¤   = kPGPDiskGlobalsMagic;
9f8e55 ¤   ¤   sGlobals.globalsVersion¤= kPGPDiskGlobalsVersion;
b57449 ¤   ¤   sGlobals.idleProc ¤ ¤   = IdleProc;
341b52 ¤   ¤
c311a6 ¤   ¤   status = NewGestalt( gestaltPGPDisk, GestaltProc );
19f5ea ¤   ¤   AssertNoErr( status, "GestaltProcMain" );
941b52 ¤   ¤
4b706e ¤   ¤   if( IsntErr( status ) )
2e5b34 ¤   ¤   {
ce1eb3 ¤   ¤   ¤   sGestaltProcInstalled = TRUE;
e80fe4 ¤   ¤   }
f3af5a
ab86a0 ¤   ¤   SetZone( saveZone );
5f9371 ¤   }
5267c5 ¤
eae24d ¤   IdleProc();
ec67c5 ¤
cc4afd ¤   return( status );
c1efe6 }
b8af5a
9a85ea ¤   OSStatus
0f7f68 main(void)
7abb36 {
53c412 ¤   OSStatus¤   status;
73af5a
085c98 #if PGP_DEBUG
b4cc8e ¤   PGPDiskGestaltInstallProcPtr¤   testProcPtr = main;
157454 #endif
a7af5a
ce953d ¤   EnterCodeResource();
c467c5 ¤
94c755 ¤   ¤   status = RealMain();
b91b52 ¤   ¤
f81487 ¤   ExitCodeResource();
6667c5 ¤
dd4afd ¤   return( status );
9ebe43 }¶
--7cd7 001f46b107740120048 Page 1 of GestaltProc.prefix
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
0e1656 ¤   $Id: GestaltProc.prefix,v 1.3.8.1 1998/11/12 03:05:52 heller Exp $
41f7f7 ____________________________________________________________________________*/
71af5a
eb7b7d #pragma once
7aaf5a
c8e7eb #define USE_MAC_DEBUG_LEAKS¤¤   0
c9bea9 #define USE_PGP_LEAKS¤  ¤   ¤   0
59a8b1 #define USE_MAC_DEBUG_PATCHES¤  0
1c7f25 #define USE_MAC_DEBUG_TRAPS¤¤   0
d1af5a
00b18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
b86068 #define UNFINISHED_CODE_ALLOWED¤¤   0
04af5a
532aa1 #ifdef __MWERKS__
7f6a19 ¤   #if powerc
2aae06 ¤   ¤   #include <MacHeadersPPC>
c747b4 ¤   #else
d28ed3 ¤   ¤   #include <MacHeaders68K>
6bb7ec ¤   #endif
0edb21 #else
da5399 ¤   #include <MacHeaders.c>
e07454 #endif
69af5a
2df692 #include "PGPDiskShared.prefix"
75af5a
bfaf5a
f4af5a
--aaa5 00172bcb4f140120049 Page 1 of GestaltProcDebug.prefix
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
b07265 ¤   $Id: GestaltProcDebug.prefix,v 1.2.8.1 1998/11/12 03:05:53 heller Exp $
59f7f7 ____________________________________________________________________________*/
73af5a
567b7d #pragma once
94af5a
a0e7eb #define USE_MAC_DEBUG_LEAKS¤¤   0
55bea9 #define USE_PGP_LEAKS¤  ¤   ¤   0
dea8b1 #define USE_MAC_DEBUG_PATCHES¤  0
9f7f25 #define USE_MAC_DEBUG_TRAPS¤¤   0
c7af5a
dda853 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1
e679b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
fdaf5a
df2aa1 #ifdef __MWERKS__
2a6a19 ¤   #if powerc
6aae06 ¤   ¤   #include <MacHeadersPPC>
3747b4 ¤   #else
798ed3 ¤   ¤   #include <MacHeaders68K>
d6b7ec ¤   #endif
fddb21 #else
bb5399 ¤   #include <MacHeaders.c>
1a7454 #endif
5baf5a
bbf692 #include "PGPDiskShared.prefix"
72af5a
--67fb 00001d45eb74012004a Page 1 of PatchesProc.c
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
6076ab ¤   $Id: PatchesProc.c,v 1.7.8.1 1998/11/12 03:05:54 heller Exp $
2bf7f7 ____________________________________________________________________________*/
a0af5a
9f1e8d #if INSTALL_PATCHES¤// [
b8af5a
109040 #include <A4Stuff.h>
f7c645 #include <SetUpA4.h>
0caf5a
3175a9 #include "MacDriverUtils.h"
e30d08 #include "pgpMem.h"
3285c2 #include "MacStrings.h"
055bf6 #include "MacTraps.h"
0eaf5a
12de32 #include "PGPDiskPatches.h"
aa37d9 #include "DriverAPI.h"
f0af5a
3b1b50 static Boolean¤ ¤   ¤   *sPatchesInstalledPtr = nil;
e1ccf4 static UniversalProcPtr¤sOldTickCountAddress;
e31be1 static UniversalProcPtr¤sOldUnmountVolAddress;
72af5a
33c14e ¤   static asm void
f9e938 TickCountPatch(void)
acbb36 {
da2f3f ¤   clr.l¤  -(sp)¤  ¤   // Jump to address
9b04a4 ¤   movem.l¤d0-d2/a0/a1/a4, -(sp)
582d82 ¤   jsr¤¤   SetUpA4
2167c5 ¤
3c2488 ¤   move.l¤ sPatchesInstalledPtr, a0
ae3a9e ¤   move.b¤ #1, (a0)
8567c5 ¤
e8581e ¤   move.l¤ sOldTickCountAddress, 0x18(sp)
f842cc ¤   movem.l¤(sp)+, d0-d2/a0/a1/a4
1a67c5 ¤
1318c2 ¤   rts
c5efe6 }
daaf5a
aa7e75 #pragma parameter CallUnmountVol(__A1, __A0, __D1)
46af5a
4ec14e ¤   static asm void
0ac113 CallUnmountVol(
e70438 ¤   UniversalProcPtr ¤  oldAddress,
30f804 ¤   const ParamBlockRec *callerPB,
4ed577 ¤   ushort ¤¤   ¤   ¤   trapword)
cebb36 {
1fcfa6 ¤   // a0 and d1 are set correctly at this point by the #pragma parameter
faec60 ¤   // directive for this function.
d767c5 ¤
ad7e66 ¤   move.l¤ a4, -(sp)¤  // Preserve A4 in case routine we're calling whacks it
ff8476 ¤   jsr¤¤   (a1)
ab5896 ¤   move.l¤ (sp)+, a4
ba18c2 ¤   rts
bcefe6 }
d8af5a
64cd8d ¤   static Boolean
338335 DriverIsPGPDiskDriver(short driverRefNum)
3dbb36 {
630199 ¤   Boolean¤isPGPDiskDriver¤= false;
da8e70 ¤   OSErr¤  err¤= noErr;
20209b ¤   Str255¤ driverName;
fa67c5 ¤
1f9e89 ¤   pgpAssert( driverRefNum < 0 );
9167c5 ¤
d7ae21 ¤   err¤= GetDriverNameUsingRefNum( driverRefNum, driverName );
0217a2 ¤   if ( IsntErr( err ) && DriverNameIsPGPDisk( driverName ) )
02c7a1 ¤   {
fba46a ¤   ¤   isPGPDiskDriver = TRUE;
c89371 ¤   }
011b52 ¤   ¤
--75a9 000215344a14012004a Page 2 of PatchesProc.c
fc72be ¤   return( isPGPDiskDriver );
51efe6 }
eaaf5a
0333c8 ¤   static void
a8ce17 DoUnmountVolPatch(const ParamBlockRec *callerPB, ushort trapword)
80bb36 {
099816 ¤   HParamBlockRec¤ pb;
8d5e05 ¤   Str255¤ ¤   ¤   volumePath;
997cbf ¤   OSErr¤  ¤   ¤   err;
cb67c5 ¤
99ef4e ¤   // Capture the information about the volume we're unmounting
3367c5 ¤
44de75 ¤   pgpClearMemory( &pb, sizeof( pb ) );
8467c5 ¤
0069de ¤   pb.volumeParam.ioVRefNum = callerPB->volumeParam.ioVRefNum;
b467c5 ¤
71d869 ¤   if( IsntNull( callerPB->volumeParam.ioNamePtr ) )
0ac7a1 ¤   {
f0ed41 ¤   ¤   CopyPString( callerPB->volumeParam.ioNamePtr, volumePath );
586a98 ¤   ¤   pb.volumeParam.ioNamePtr = volumePath;
529371 ¤   }
ab67c5 ¤
54c0f5 ¤   err = PBHGetVInfoSync( &pb );
6567c5 ¤
d4a7f9 ¤   // Call through to unmount the volume
441d10 ¤   CallUnmountVol( sOldUnmountVolAddress, callerPB, trapword );
1667c5 ¤
dbcc1a ¤   // Send the unmounted volume information to the driver
e55d7b ¤   if( IsntErr( err ) &&
7d9f19 ¤   ¤   IsntErr( callerPB->volumeParam.ioResult ) &&
1bc077 ¤   ¤   DriverIsPGPDiskDriver( pb.volumeParam.ioVDRefNum ) )
42c7a1 ¤   {
4c5692 ¤   ¤   ProcessSerialNumber¤curAppPSN;
c91b52 ¤   ¤
0b29af ¤   ¤   GetCurrentProcess( &curAppPSN );
591b52 ¤   ¤
9bf5ab ¤   ¤   (void) PGPDiskDriveUnmountedInProcess( pb.volumeParam.ioVDRefNum,
0a57eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   pb.volumeParam.ioVDrvInfo, curAppPSN );
df9371 ¤   }
e3efe6 }
6caf5a
2cc14e ¤   static asm void
ceecee UnmountVolPatch(void)
87bb36 {
24b1c1 ¤   movem.l¤a0/a4, -(sp)
452d82 ¤   jsr¤¤   SetUpA4
ea67c5 ¤
3a0fda ¤   move.w¤ d1, -(sp)¤  ¤   // Trapword
49ba8f ¤   move.l¤ a0, -(sp)¤  ¤   // Parameter block
7267c5 ¤
19e4be ¤   jsr¤¤   DoUnmountVolPatch
4ecc53 ¤   addq.l¤ #6, sp
8967c5 ¤
bb41ab ¤   movem.l¤(sp)+, a0/a4¤   ¤   ¤   ¤   // Restore A4 and paramater block
0e67c5 ¤
c0abe1 ¤   move.w¤ struct(ParamBlockRec.ioParam.ioResult)(a0), d0¤ // Set result code
7118c2 ¤   rts
a8efe6 }
c267c5 ¤
aa85ea ¤   OSStatus
4f5d94 main(Boolean *patchesInstalledResultPtr)
51bb36 {
f7323e ¤   OSStatus¤   status = noErr;
59af5a
4c5c98 #if PGP_DEBUG
cdae91 ¤   PGPDiskPatchesProcPtr¤  testProcPtr = main;
ad7454 #endif
f7af5a
ff953d ¤   EnterCodeResource();
1846cc ¤   PrepareCallback();
2e67c5 ¤
21bc27 ¤   pgpAssertAddrValid( patchesInstalledResultPtr, Boolean );
--197d 001d7f1982a4012004a Page 3 of PatchesProc.c
2a67c5 ¤
70ad28 ¤   sPatchesInstalledPtr = patchesInstalledResultPtr;
d3af5a
0eb1e5 ¤   (void) PFLPatchTrap( _TickCount, (UniversalProcPtr) TickCountPatch,
2e7758 ¤   ¤   ¤   ¤   &sOldTickCountAddress);
c6f887 ¤   (void) PFLPatchTrap( _UnmountVol, (UniversalProcPtr) UnmountVolPatch,
915b03 ¤   ¤   ¤   ¤   &sOldUnmountVolAddress );
d767c5 ¤
8a1487 ¤   ExitCodeResource();
a067c5 ¤
194afd ¤   return( status );
d3efe6 }
5daf5a
d76627 #endif¤ // ]¶
--e75c 001b77640044012004b Page 1 of PatchesProc.prefix
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
0c479c ¤   $Id: PatchesProc.prefix,v 1.3.8.1 1998/11/12 03:05:54 heller Exp $
49f7f7 ____________________________________________________________________________*/
28af5a
407b7d #pragma once
00af5a
f2e7eb #define USE_MAC_DEBUG_LEAKS¤¤   0
aabea9 #define USE_PGP_LEAKS¤  ¤   ¤   0
69a8b1 #define USE_MAC_DEBUG_PATCHES¤  0
e97f25 #define USE_MAC_DEBUG_TRAPS¤¤   0
22af5a
7db18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
896068 #define UNFINISHED_CODE_ALLOWED¤¤   0
f0af5a
f72aa1 #ifdef __MWERKS__
676a19 ¤   #if powerc
4bae06 ¤   ¤   #include <MacHeadersPPC>
b747b4 ¤   #else
958ed3 ¤   ¤   #include <MacHeaders68K>
a2b7ec ¤   #endif
3adb21 #else
725399 ¤   #include <MacHeaders.c>
a47454 #endif
8caf5a
8bf692 #include "PGPDiskShared.prefix"
7daf5a
cbaf5a
b7af5a
--75a0 0014eb250624012004c Page 1 of PatchesProcDebug.prefix
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
66d72c ¤   $Id: PatchesProcDebug.prefix,v 1.2.8.1 1998/11/12 03:05:55 heller Exp $
50f7f7 ____________________________________________________________________________*/
cbaf5a
407b7d #pragma once
e6af5a
2ce7eb #define USE_MAC_DEBUG_LEAKS¤¤   0
c2bea9 #define USE_PGP_LEAKS¤  ¤   ¤   0
2fa8b1 #define USE_MAC_DEBUG_PATCHES¤  0
707f25 #define USE_MAC_DEBUG_TRAPS¤¤   0
03af5a
0aa853 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1
3279b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
17af5a
6d2aa1 #ifdef __MWERKS__
076a19 ¤   #if powerc
35ae06 ¤   ¤   #include <MacHeadersPPC>
b947b4 ¤   #else
a58ed3 ¤   ¤   #include <MacHeaders68K>
76b7ec ¤   #endif
92db21 #else
745399 ¤   #include <MacHeaders.c>
c07454 #endif
c9af5a
cbf692 #include "PGPDiskShared.prefix"
b5af5a
b6af5a
4eaf5a
--a62a 0014cf816e54012004d Page 1 of AddDriveStruct.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
48b62c ¤   $Id: AddDriveStruct.h,v 1.4.8.1 1998/11/12 03:06:02 heller Exp $
e7f7f7 ____________________________________________________________________________*/
70af5a
4f7b7d #pragma once
56af5a
d68f22 #include <CodeFragments.h>
70af5a
30bbf4 #include "MacFiles.h"
25af5a
6873a3 #if PRAGMA_STRUCT_ALIGN
89af46 #pragma options align=mac68k
8d7454 #endif
ccaf5a
088c21 #include "CipherContext.h"
3d24f1 #include "CipherProc.h"
31af5a
08af5a
b1af5a
76af5a
ba0966 typedef struct BWIcon
dac7a1 ¤   {
2f128c ¤   long¤   bytes[ ( kLargeIconSize / 2) / sizeof( long ) ];
87db90 ¤   long¤   mask[ ( kLargeIconSize / 2) / sizeof( long ) ];
4f02fa ¤   } BWIcon;
5eaf5a
0dd9ee struct FlagsDrvQEl;
8caf5a
7b87b5 typedef struct AddDriveStruct
e3c7a1 ¤   {
04c2c2 ¤   short¤  ¤   ¤   ¤   resultDriveNumber;
7d9a40 ¤   short¤  ¤   ¤   ¤   fileRefNum;
161ca2 ¤   const DiskExtent *¤ extents;
a67162 ¤   PGPUInt32¤  ¤   ¤   numExtents;
b2b051 ¤   ulong¤  ¤   ¤   ¤   numBlocks;
bbaf5a
ac13ad ¤   CASTKey¤¤   ¤   ¤   decryptionKey;
96c735 ¤   PassphraseSalt¤ ¤   salt;
3f67c5 ¤
e4a304 ¤   Boolean¤¤   ¤   ¤   mountReadOnly;
a3da6a ¤   Boolean¤¤   ¤   ¤   minimizeWriteBufferSize;
7332c9 ¤   Boolean¤¤   ¤   ¤   shouldBreakUpRequests;
b1c192 ¤   Boolean¤¤   ¤   ¤   unused1;
5f67c5 ¤
5e148c ¤   BWIcon¤ ¤   ¤   ¤   mediaIcon;
ab5895 ¤   BWIcon¤ ¤   ¤   ¤   physicalIcon;
3f67c5 ¤
d473ba ¤   FSSpec¤ ¤   ¤   ¤   prefsSpec;
fe1fc4 ¤   } AddDriveStruct;
55af5a
3baf5a
5baf5a
d173a3 #if PRAGMA_STRUCT_ALIGN
297c46 #pragma options align=reset
e47454 #endif
a1af5a
0aaf5a
62af5a
91af5a
4caf5a
--b37f 000fa1260834012004e Page 1 of CTuner.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
80ac78 ¤   $Id: CTuner.cp,v 1.4.8.2 1998/11/13 02:49:39 heller Exp $
14f7f7 ____________________________________________________________________________*/
11af5a
e9b935 #include <Timer.h>
1fc110 #include "pgpMacMemory.h"
d485c2 #include "MacStrings.h"
2cbbf4 #include "MacFiles.h"
7d85f6 #include "UInt64.h"
a44293 #include <FSM.h>
20af5a
6c5b1c #include "CTuner.h"
b237d9 #include "DriverAPI.h"
d5de36 #include "PGPDisk.h"
c6af5a
ffaf5a
0faf5a
b006df static const ushort¤kNumIOsForTest¤ = 10;
7baf5a
51af5a
3119d7 #define MIN(a, b)¤  ( (a) <= (b) ? (a) : (b) )
3cd518 ¤   inline long
db55cb ABS( long a )
06c7a1 ¤   {
34aa99 ¤   return( ( a >= 0 ) ? a : -a );
789371 ¤   }
72af5a
54af5a
e967c5 ¤
ba33c8 ¤   static void
6f698f InitTuner(
ab811b ¤   TunerStruct *¤  tuner,
1be8e3 ¤   ulong¤  ¤   ¤   maxBlocks)
51c7a1 ¤   {
5ba720 ¤   pgpAssert( maxBlocks != 0 );
4667c5 ¤
a2ae3b ¤   for( ushort index = 0; index < TunerStruct::kNumTune; ++index )
935b34 ¤   ¤   {
28438d ¤   ¤   tuner->maxBlocks[ index ]¤  = maxBlocks;
620fe4 ¤   ¤   }
389371 ¤   }
b267c5 ¤
6b67c5 ¤
09d140 ¤   static OSErr
72e068 ChangeDriverMaxReadBlocks(
63d772 ¤   short¤  vRefNum,
18efd8 ¤   short¤  maxBlocks )
32c7a1 ¤   {
47ac78 ¤   TunerStruct¤tuner;
9b14d3 ¤   OSErr¤  ¤   err¤= noErr;
aa67c5 ¤
3593c5 ¤   InitTuner( &tuner, maxBlocks );
dfaf25 ¤   err¤= ChangeDriveTuner( vRefNum, &tuner, IOOptionsStruct::kReadTuner );
81deb7 ¤   return( err );
909371 ¤   }
9767c5 ¤
1c1b52 ¤   ¤
23d140 ¤   static OSErr
e26d76 ChangeDriverMaxWriteBlocks(
81d772 ¤   short¤  vRefNum,
baefd8 ¤   short¤  maxBlocks )
f2c7a1 ¤   {
6bac78 ¤   TunerStruct¤tuner;
e614d3 ¤   OSErr¤  ¤   err¤= noErr;
ef67c5 ¤
e793c5 ¤   InitTuner( &tuner, maxBlocks );
0d541e ¤   err¤= ChangeDriveTuner( vRefNum, &tuner, IOOptionsStruct::kWriteTuner );
46deb7 ¤   return( err );
fa9371 ¤   }
--d3f8 00036fdb2194012004e Page 2 of CTuner.cp
2a67c5 ¤
7b1b52 ¤   ¤
cf4c3a CTuner::CTuner(void)
37c7a1 ¤   {
9d1829 ¤   mVRefNum¤   ¤   = 0;
78ad73 ¤   mDirection¤ ¤   = kReadDirection;
a6f92f ¤   mBuffer¤¤   ¤   = nil;
3cba9c ¤   mFileRefNum¤¤   = 0;
0b89ff ¤   mTestFileSize¤  = 0;
58b9f3 ¤   mCallback¤  ¤   = nil;
93a36f ¤   mNumTests¤  ¤   = 0;
a406c5 ¤   mCurTestIndex¤  = 0;
ec9371 ¤   }
1d67c5 ¤
c167c5 ¤
485ea1 CTuner::~CTuner( )
bdc7a1 ¤   {
ad9371 ¤   }
9d67c5 ¤
46af5a
8cd140 ¤   static OSErr
d51c63 AllocateSpaceToFile(
0c08de ¤   short¤  fileRefNum,
a8f761 ¤   ulong¤  fileSize)
0fc7a1 ¤   {
528e70 ¤   OSErr¤  err¤= noErr;
c667c5 ¤
652ca6 ¤   long¤   count¤  = fileSize;
44a4af ¤   err¤= AllocContig( fileRefNum, &count);
cf5ecc ¤   if ( IsntErr( err ) )
375b34 ¤   ¤   {
c82f3d ¤   ¤   err¤= SetEOF( fileRefNum, fileSize );
ba0fe4 ¤   ¤   }
551b52 ¤   ¤
65deb7 ¤   return( err );
239371 ¤   }
6167c5 ¤
cc67c5 ¤
bc2811 /*___________________________________________________________________________
1870b1 ¤   Determine the kilobytes per second that can be transferred using the given
c6d6b7 ¤   ioSize and using a file of the specified size.
0fc988 ___________________________________________________________________________*/
0085ea ¤   OSStatus
9666e2 CTuner::TestKPerSecond(
ad463d ¤   const short¤¤   ¤   fileRefNum,
234984 ¤   void *¤ ¤   ¤   ¤   buffer,
0679c3 ¤   const ulong¤¤   ¤   ioSize,
752c33 ¤   const ulong¤¤   ¤   testFileSize,
cd85ba ¤   ulong *¤¤   ¤   ¤   kPerSec)
29c7a1 ¤   {
25d905 ¤   OSStatus¤   status¤ = noErr;
08f644 ¤   UnsignedWide¤   startMS;
364741 ¤   UnsignedWide¤   stopMS;
4967c5 ¤
adaa91 ¤   AssertFileRefNumIsValid( fileRefNum, "TestKPerSecond" );
982954 ¤   pgpAssertAddrValid( buffer, VoidAlign );
00de45 ¤   pgpAssert( testFileSize != 0 );
8842a2 ¤   pgpAssert( ioSize != 0 );
d5bdfb ¤   pgpAssert( ( ioSize % kDiskBlockSize ) == 0 );
0367c5 ¤
db300f ¤   (void)SetEOF( fileRefNum, 0UL );
98303f ¤   (void)SetFPos( fileRefNum, fsFromStart, 0 );
417390 ¤   status¤ = AllocateSpaceToFile( fileRefNum, testFileSize );
a4a703 ¤   if ( IsntErr( status ) )
be5b34 ¤   ¤   {
8bc38a ¤   ¤   AssertNoErr( status, "CTuner::TestKPerSecond" );
101b52 ¤   ¤
286cf0 ¤   ¤   ulong¤  bytesDone¤  = 0;
3722de ¤   ¤   ulong¤  bytesToDo¤  = ( testFileSize / ioSize ) * ioSize;
6a7094 ¤   ¤   pgpAssert( bytesToDo >= ioSize );
681b52 ¤   ¤
3629e2 ¤   ¤   Microseconds( &startMS );
--259a 0002f6f99704012004e Page 3 of CTuner.cp
576f15 ¤   ¤   while ( bytesDone < bytesToDo )
8df776 ¤   ¤   ¤   {
b175f5 ¤   ¤   ¤   ParamBlockRec¤  pb;
a287c7 ¤   ¤   ¤
7a29c8 ¤   ¤   ¤   pgpAssert( ( bytesDone % kDiskBlockSize ) == 0 );
a287c7 ¤   ¤   ¤
b57794 ¤   ¤   ¤   pb.ioParam.ioVRefNum¤   = 0;
553954 ¤   ¤   ¤   pb.ioParam.ioRefNum¤¤   = fileRefNum;
d329f5 ¤   ¤   ¤   pb.ioParam.ioBuffer¤¤   = (Ptr)buffer;
06e1b1 ¤   ¤   ¤   pb.ioParam.ioReqCount¤  = ioSize;
e659d7 ¤   ¤   ¤   pb.ioParam.ioPosMode¤   = fsFromStart | (1UL << noCacheBit);
52fa4c ¤   ¤   ¤   pb.ioParam.ioPosOffset¤ = bytesDone;
5187c7 ¤   ¤   ¤
3465d5 ¤   ¤   ¤   if ( mDirection == kReadDirection )
f872c3 ¤   ¤   ¤   ¤   {
2af8b0 ¤   ¤   ¤   ¤   status¤ = PBReadSync( &pb );
d02613 ¤   ¤   ¤   ¤   }
a6bb8c ¤   ¤   ¤   else
c572c3 ¤   ¤   ¤   ¤   {
6aa20e ¤   ¤   ¤   ¤   status¤ = PBWriteSync( &pb );
482613 ¤   ¤   ¤   ¤   }
3387c7 ¤   ¤   ¤
f4079b ¤   ¤   ¤   if ( IsErr( status ) )
e7f622 ¤   ¤   ¤   ¤   break;
ab87c7 ¤   ¤   ¤
da02d5 ¤   ¤   ¤   pgpAssert( pb.ioParam.ioActCount == ioSize );
eb9cc4 ¤   ¤   ¤   bytesDone¤  += ioSize;
73a3a6 ¤   ¤   ¤   }
f01b52 ¤   ¤
b6f5f2 ¤   ¤   Microseconds( &stopMS );
871b52 ¤   ¤
7bd544 ¤   ¤   UInt64¤ elapsedMS¤  ¤   ¤   = (UInt64)stopMS - startMS;
516202 ¤   ¤   pgpAssert( elapsedMS.hi == 0 );
9024e1 ¤   ¤   float¤  elapsedMilliSecs¤   = elapsedMS.lo / (float)1000;
38d5c1 ¤   ¤   float¤  elapsedSecs¤¤   ¤   = elapsedMilliSecs / (float)1000;
b41b52 ¤   ¤
fd9c9e ¤   ¤   *kPerSec¤   = (float)( bytesDone / 1024UL ) / elapsedSecs;
310fe4 ¤   ¤   }
1e1b52 ¤   ¤
32acb9 ¤   AssertNoErr( status, "CTuner::TestKPerSecond" );
4a4afd ¤   return( status );
e09371 ¤   }
00af5a
66af5a
beaf5a
ecaf5a
5c85ea ¤   OSStatus
8ac155 CTuner::CallCallback( )
a7c7a1 ¤   {
2175f8 ¤   OSStatus¤   err¤= noErr;
2267c5 ¤
99e5dd ¤   if ( IsntNull( mCallback ) )
085b34 ¤   ¤   {
19dd40 ¤   ¤   ushort¤ percentDone¤= ((ulong)mCurTestIndex * 100 ) / mNumTests;
db1b52 ¤   ¤
563556 ¤   ¤   err¤= (*mCallback)( mCallbackData, percentDone );
5b0fe4 ¤   ¤   }
bf87c7 ¤   ¤   ¤
c3deb7 ¤   return( err );
8d9371 ¤   }
5667c5 ¤
a067c5 ¤
952811 /*___________________________________________________________________________
03155d ¤   Determine the optimal number of chunks to use for a I/O request of size
2d90e8 ¤   'ioSize' by steadily inceasing the block limit for the driver.
2867c5 ¤
3842e2 ¤   Don't change this routine casually; other algorithms were tried and
7bacca ¤   may not work well.
bac988 ___________________________________________________________________________*/
ac85ea ¤   OSStatus
5a2ce4 CTuner::FindOptimalBlocks(
2f79c3 ¤   const ulong¤¤   ¤   ioSize,
--a40e 000d706734e4012004e Page 4 of CTuner.cp
e7bae9 ¤   const ulong¤¤   ¤   bestBlocksIn,
c8c73b ¤   const ulong¤¤   ¤   bestKPerSecIn,
571224 ¤   ulong *¤¤   ¤   ¤   optimalBlocks)
77c7a1 ¤   {
9075f8 ¤   OSStatus¤   err¤= noErr;
a2db86 ¤   ulong¤  ¤   bestBlocks¤ ¤   = bestBlocksIn;
59074e ¤   ulong¤  ¤   bestKPerSecond¤ = bestKPerSecIn;
6567c5 ¤
f14361 ¤   pgpAssert( bestBlocks != 0 );
9967c5 ¤
f6ad39 ¤   *optimalBlocks¤ = bestBlocks;
c667c5 ¤
97fde0 ¤   ulong¤  testBlocks¤ = bestBlocks;
1b67c5 ¤
240017 ¤   // loop until an error or until our block limit reaches our ioSize
f98e03 ¤   while ( IsntErr( err ) )
c05b34 ¤   ¤   {
6da838 ¤   ¤   ulong¤  testKPerSecond;
bf1b52 ¤   ¤
bab2db ¤   ¤   err¤= CallCallback();
3a8cf4 ¤   ¤   if ( IsErr( err ) )
03cdcb ¤   ¤   ¤   break;
e0af5a
237d85 ¤   ¤   if ( mDirection == kReadDirection )
41a3c3 ¤   ¤   ¤   err¤= ChangeDriverMaxReadBlocks( mVRefNum, testBlocks );
990e1d ¤   ¤   else
f87331 ¤   ¤   ¤   err¤= ChangeDriverMaxWriteBlocks( mVRefNum, testBlocks );
ed8cf4 ¤   ¤   if ( IsErr( err ) )
d0cdcb ¤   ¤   ¤   break;
af1b52 ¤   ¤
cf1b33 ¤   ¤   err¤= TestKPerSecond( mFileRefNum, mBuffer, ioSize, mTestFileSize,
8dc96e ¤   ¤   ¤   ¤   ¤   &testKPerSecond );
208cf4 ¤   ¤   if ( IsErr( err ) )
cccdcb ¤   ¤   ¤   break;
af87c7 ¤   ¤   ¤
6606ab ¤   ¤   if ( testKPerSecond >= bestKPerSecond )
94f776 ¤   ¤   ¤   {
2eff11 ¤   ¤   ¤   bestBlocks¤ ¤   = testBlocks;
cd2eb2 ¤   ¤   ¤   bestKPerSecond¤ = testKPerSecond;
cea3a6 ¤   ¤   ¤   }
eb0e1d ¤   ¤   else
4ff776 ¤   ¤   ¤   {
1ccdcb ¤   ¤   ¤   break;
8687c7 ¤   ¤   ¤
cb6216 ¤   ¤   ¤   // if the numbers are with 3% of each other, keep going because
e112bb ¤   ¤   ¤   // it could just be timing variation.
2c50e9 ¤   ¤   ¤   ulong¤  difference¤ = ABS( testKPerSecond - bestKPerSecond );
a587c7 ¤   ¤   ¤
73697f ¤   ¤   ¤   if ( ( ( difference * 100 ) / bestKPerSecond ) >= 3 )
6972c3 ¤   ¤   ¤   ¤   {
24b698 ¤   ¤   ¤   ¤   break;¤ // it got significantly slower
f92613 ¤   ¤   ¤   ¤   }
a6a3a6 ¤   ¤   ¤   }
531b52 ¤   ¤
31878a ¤   ¤   // no point in testing a limit with more blocks than our ioSize
6aa2b3 ¤   ¤   pgpAssert( testBlocks <= ioSize / kDiskBlockSize );
9f1c85 ¤   ¤   if ( testBlocks == ioSize / kDiskBlockSize )
9dcdcb ¤   ¤   ¤   break;
e787c7 ¤   ¤   ¤
8e1d74 ¤   ¤   // now increase the number of test blocks·
59e2e4 ¤   ¤   if ( testBlocks >= 16 )
76f776 ¤   ¤   ¤   {
074c8d ¤   ¤   ¤   // keep size leaps smaller for more accurate results
620490 ¤   ¤   ¤   testBlocks¤ += testBlocks / 4;
f6a3a6 ¤   ¤   ¤   }
570e1d ¤   ¤   else
1ff776 ¤   ¤   ¤   {
1f4530 ¤   ¤   ¤   // IMPORTANT: timing variations with smaller sizes make it
6d9d27 ¤   ¤   ¤   // important to scale by 2 or algorithm won't work well
17656a ¤   ¤   ¤   testBlocks¤ *= 2;
29a3a6 ¤   ¤   ¤   }
d71b52 ¤   ¤
--6bd7 000eb3c40844012004e Page 5 of CTuner.cp
ce330d ¤   ¤   // limit the limit to the size of the I/O
cb3a3e ¤   ¤   if ( testBlocks > ioSize / kDiskBlockSize )
fd35e9 ¤   ¤   ¤   testBlocks¤ = ioSize / kDiskBlockSize;
5c0fe4 ¤   ¤   }
3b67c5 ¤
d6ad39 ¤   *optimalBlocks¤ = bestBlocks;
48ae30 ¤   ¤   ¤   ¤   ¤
eedeb7 ¤   return( err );
309371 ¤   }
2667c5 ¤
8a67c5 ¤
ed67c5 ¤
3785ea ¤   OSStatus
dc87ac CTuner::OpenTestFile(
69e369 ¤   FSSpec *¤   testSpec,
b53650 ¤   short *¤¤   fileRefNum )
a6c7a1 ¤   {
75c412 ¤   OSStatus¤   status;
ce67c5 ¤
697c7d ¤   testSpec->vRefNum¤  = mVRefNum;
926156 ¤   testSpec->parID¤¤   = fsRtDirID;
7f5b5d ¤   CopyPString( "\pPerformanceTestFile\r", testSpec->name );
3967c5 ¤
8ed806 ¤   (void)FSpDelete(testSpec );
6b70fa ¤   (void)FSpCreate( testSpec, 'TeSt', 'xxxX', smSystemScript );
e338cb ¤   status¤ = FSpOpenDF( testSpec, fsRdWrPerm, fileRefNum );
3b67c5 ¤
254afd ¤   return( status );
1f9371 ¤   }
2767c5 ¤
da67c5 ¤
86af5a
192811 /*___________________________________________________________________________
a26948 ¤   Determine a test file that satisfies the following:
9967e6 ¤   ¤   - fits in the available disk space
a3c988 ___________________________________________________________________________*/
97eacd ¤   OSErr
567195 CTuner::DetermineTestFileSize(
7d1703 ¤   ulong¤  ioSize,
1fc1fe ¤   ulong *¤testFileSize)
a0c7a1 ¤   {
d68e70 ¤   OSErr¤  err¤= noErr;
0b67c5 ¤
812cca ¤   const ulong¤kMegabyte¤  = 1024UL * 1024UL;
58a560 ¤   *testFileSize¤  = 50 * kMegabyte;
0767c5 ¤
bdb177 #if 0
5edb9a ¤   if ( *testFileSize > 10 * ioSize )
b802aa ¤   ¤   *testFileSize¤  = 10 * ioSize;
1c7454 #endif
db1b52 ¤   ¤
4da8af ¤   if ( *testFileSize < ioSize )
4c7102 ¤   ¤   *testFileSize¤  = ioSize;
1f67c5 ¤
200bd4 ¤   ulong¤  blocksOnDisk= GetVolumeFreeAllocBlocks( mVRefNum ) *
d0a3d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (GetVolumeAllocBlockSize( mVRefNum ) / 512);
934d93 ¤   if ( blocksOnDisk > kMaximumBlocksIn4GB )
7e30af ¤   ¤   blocksOnDisk¤   = kMaximumBlocksIn4GB;
861b52 ¤   ¤
8d8821 ¤   if ( *testFileSize > blocksOnDisk * kDiskBlockSize )
9a5b34 ¤   ¤   {
622f55 ¤   ¤   *testFileSize¤  = blocksOnDisk * kDiskBlockSize;
610fe4 ¤   ¤   }
061b52 ¤   ¤
7edeb7 ¤   return( err );
c89371 ¤   }
4faf5a
96af5a
2baf5a
a5af5a
552811 /*___________________________________________________________________________
ebd030 ¤   Determine the optimal number of blocks to use when making a request to
--4293 000fbed38d14012004e Page 6 of CTuner.cp
0a80da ¤   our driver.
8067c5 ¤
055d6f ¤   testing starts assuming 'minBlocks' is the minimum number of blocks to
923abe ¤   use.
3dc988 ___________________________________________________________________________*/
b485ea ¤   OSStatus
7a4fd3 CTuner::TuneSize(
0c8507 ¤   const ulong¤¤   ioBlocks,
3e0708 ¤   const ulong¤¤   minBlocks,
bd72e6 ¤   ulong *¤¤   ¤   optimalBlocks )
6bc7a1 ¤   {
d8dc42 ¤   OSStatus¤   err;
f7f6a1 ¤   FSSpec¤ ¤   testSpec;
5867c5 ¤
4a2468 ¤   *optimalBlocks¤ = minBlocks;
c52b85 ¤   ¤   ¤   ¤
c3f20e ¤   err¤= OpenTestFile( &testSpec, &mFileRefNum );
d05ecc ¤   if ( IsntErr( err ) )
035b34 ¤   ¤   {
175e9b ¤   ¤   ulong¤  ioSize¤ = ioBlocks * kDiskBlockSize;
34cbd3 ¤   ¤   void *¤ buffer¤ = nil;
8f1b52 ¤   ¤
89fc1d ¤   ¤   buffer¤ = pgpAllocMac( ioSize, kMacMemory_PreferTempMem |
f5cb1e ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap);
73709c ¤   ¤   if ( IsntNull( buffer ) )
29f776 ¤   ¤   ¤   {
650f95 ¤   ¤   ¤   mBuffer¤= buffer;
4187c7 ¤   ¤   ¤
61e4cf ¤   ¤   ¤   err¤= DetermineTestFileSize( ioSize, &mTestFileSize );
7a1b52 ¤   ¤
b6e8c8 ¤   ¤   ¤   if ( IsntErr( err ) && mTestFileSize >= ioSize )
bc72c3 ¤   ¤   ¤   ¤   {
f0fab2 ¤   ¤   ¤   ¤   err¤= FindOptimalBlocks( ioSize, minBlocks, 0UL,
e8f66d ¤   ¤   ¤   ¤   ¤   ¤   ¤   optimalBlocks);
482613 ¤   ¤   ¤   ¤   }
8e67c5 ¤
76f40a ¤   ¤   ¤   pgpFreeMac( buffer );
13a3a6 ¤   ¤   ¤   }
7a0e1d ¤   ¤   else
8df776 ¤   ¤   ¤   {
3ab49e ¤   ¤   ¤   err¤= memFullErr;
52a3a6 ¤   ¤   ¤   }
fa1b52 ¤   ¤
8f4986 ¤   ¤   FSClose( mFileRefNum );
4d5d81 ¤   ¤   mFileRefNum¤= 0;
cebb24 ¤   ¤   (void)FSpDelete( &testSpec );
a10fe4 ¤   ¤   }
4e67c5 ¤
f5d12f ¤   AssertNoErr( err, "CTuner::TuneSize" );
cddeb7 ¤   return( err );
9a9371 ¤   }
6d67c5 ¤
52af5a
e6af5a
3f2811 /*___________________________________________________________________________
1d46c5 ¤   Find optimal tuning for all I/O sizes in our tuning table
26c988 ___________________________________________________________________________*/
b885ea ¤   OSStatus
a3aa8f CTuner::Tune(
856e0b ¤   short¤  ¤   ¤   vRefNum,
bafd09 ¤   IODirection¤¤   direction,
8eafbd ¤   TunerStruct *¤  optimalTune,
532934 ¤   TunerCallback¤  callback)
c1c7a1 ¤   {
bec052 ¤   pgpAssert( vRefNum < 0 );
8d6920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
e1b475 ¤   const ushort¤   kSkipTune¤  = 7;
3967c5 ¤
0352d7 ¤   mVRefNum¤   = vRefNum;
036ce5 ¤   mDirection¤ = direction;
77ecc4 ¤   mCallback¤  = callback;
fb67c5 ¤
--a06f 0009a37ff8d4012004e Page 7 of CTuner.cp
2d8657 ¤   // in case our tests can't be performed, we want some reasonable tuning
331678 ¤   if ( direction == kReadDirection )
aeaade ¤   ¤   *optimalTune¤   = kDefaultReadTunerStruct;
ee0e24 ¤   else
7f6992 ¤   ¤   *optimalTune¤   = kDefaultWriteTunerStruct128;
c867c5 ¤
519e9a ¤   // start at index 2 ( 8 blocks) because 1, 2 blocks rarely improve
f04f30 ¤   for( ushort tuneIndex = kSkipTune; tuneIndex < TunerStruct::kNumTune;
e3946f ¤   ¤   ¤   ¤   ++tuneIndex )
1d5b34 ¤   ¤   {
7463ee ¤   ¤   ushort¤ startBlocks;
2b2c4c ¤   ¤   ulong¤  numBlocks;
dea94e ¤   ¤   ulong¤  optimalBlocks;
0c1b52 ¤   ¤
8ade3d ¤   ¤   ++mCurTestIndex;
3f1b52 ¤   ¤
0532e1 ¤   ¤   // assume that larger sizes need at least as many chunks as the next
dc683a ¤   ¤   // smaller one does
cb19bd ¤   ¤   pgpAssert( tuneIndex >= 1 );
cadd53 ¤   ¤   startBlocks¤= optimalTune->maxBlocks[ tuneIndex - 1];
bbce76 ¤   ¤   numBlocks¤  = 1UL << tuneIndex;
d11b52 ¤   ¤
93e078 ¤   ¤   pgpAssert( startBlocks <= numBlocks );
016423 ¤   ¤   err¤= TuneSize( numBlocks, startBlocks, &optimalBlocks );
548cf4 ¤   ¤   if ( IsErr( err ) )
86f776 ¤   ¤   ¤   {
292b3c ¤   ¤   ¤   // propogate last optimal size upward
75e5f4 ¤   ¤   ¤   while ( tuneIndex < TunerStruct::kNumTune )
3f72c3 ¤   ¤   ¤   ¤   {
6d7438 ¤   ¤   ¤   ¤   ulong¤  lastOptimal;
e42b85 ¤   ¤   ¤   ¤
2bd3c3 ¤   ¤   ¤   ¤   lastOptimal¤= optimalTune->maxBlocks[ tuneIndex - 1 ];
1f2b85 ¤   ¤   ¤   ¤
af6c3c ¤   ¤   ¤   ¤   if ( optimalTune->maxBlocks[ tuneIndex ] >= lastOptimal )
334859 ¤   ¤   ¤   ¤   ¤   {
c57cf7 ¤   ¤   ¤   ¤   ¤   // presumably larger items have larger maxes already
8914c3 ¤   ¤   ¤   ¤   ¤   break;
751c89 ¤   ¤   ¤   ¤   ¤   }
f7ae30 ¤   ¤   ¤   ¤   ¤
aec53a ¤   ¤   ¤   ¤   optimalTune->maxBlocks[ tuneIndex ] ¤   = lastOptimal;
d12613 ¤   ¤   ¤   ¤   }
0ccdcb ¤   ¤   ¤   break;
91a3a6 ¤   ¤   ¤   }
430e1d ¤   ¤   else
8ff776 ¤   ¤   ¤   {
c6e57e ¤   ¤   ¤   optimalTune->maxBlocks[ tuneIndex ]¤= optimalBlocks;
9ca3a6 ¤   ¤   ¤   }
cf0fe4 ¤   ¤   }
81af5a
34d1ee ¤   AssertNoErr( err, "CTuner::Tune" );
3f79ad ¤   return( noErr );
179371 ¤   }
4caf5a
ceaf5a
6caf5a
c985ea ¤   OSStatus
4daa8f CTuner::Tune(
376e0b ¤   short¤  ¤   ¤   vRefNum,
7e578c ¤   TunerCallback¤  callback,
8d7e37 ¤   long¤   ¤   ¤   callbackData)
2ec7a1 ¤   {
a8aba1 ¤   TunerStruct¤¤   optimalTune;
7867c5 ¤
fbec01 ¤   mNumTests¤  ¤   = TunerStruct::kNumTune;
e206c5 ¤   mCurTestIndex¤  = 0;
074c0b ¤   mCallbackData¤  = callbackData;
18af5a
dfb177 #if 0
734bf3 ¤   (void)Tune( vRefNum, kReadDirection, &optimalTune, callback );
474f99 ¤   (void)ChangeDriveTuner( vRefNum, &optimalTune,
04a9ea ¤   ¤   ¤   IOOptionsStruct::kReadTuner );
9ae0d4 ¤   SetA0( &optimalTune );
--b3a7 00140beb8164012004e Page 8 of CTuner.cp
e41a49 ¤   pgpDebugPStr( "\p optimal read tune;dm A0 #32;g" );
397454 #endif
22af5a
707aad ¤   (void)Tune( vRefNum, kWriteDirection, &optimalTune, callback );
b84f99 ¤   (void)ChangeDriveTuner( vRefNum, &optimalTune,
d26ae3 ¤   ¤   ¤   IOOptionsStruct::kWriteTuner );
80e0d4 ¤   SetA0( &optimalTune );
36b4e8 ¤   pgpDebugPStr( "\p optimal write tune;dm A0 #32;g" );
98af5a
ecaf5a
4faa35 ¤   // make sure callback sees that we're done
fbf479 ¤   mCurTestIndex¤  = mNumTests;
c3fe72 ¤   (void)CallCallback( );
4067c5 ¤
0879ad ¤   return( noErr );
e49371 ¤   }
d5af5a
deaf5a
c4af5a
d8af5a
baaf5a
67af5a
5faf5a
76af5a
20af5a
10af5a
82af5a
d8af5a
61af5a
40af5a
--db5b 00160a60cc44012004f Page 1 of CTuner.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
a26da9 ¤   $Id: CTuner.h,v 1.2.8.1 1998/11/12 03:06:03 heller Exp $
05f7f7 ____________________________________________________________________________*/
16af5a
777b7d #pragma once
99af5a
1b08a4 #include "TunerStruct.h"
6baf5a
d16fe4 class CTuner
d5c7a1 ¤   {
865ed4 public:
278a53 ¤   enum IODirection { kReadDirection, kWriteDirection };
cf685e ¤   typedef OSErr¤  ¤   (*TunerCallback)( long callbackData,
bf516b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ushort percentDone );
b667c5 ¤
4aa2d3 protected:
2dda54 ¤   short¤  ¤   ¤   mVRefNum;
8612c7 ¤   IODirection¤¤   mDirection;
fcd22f ¤   void *¤ ¤   ¤   mBuffer;
5e3141 ¤   short¤  ¤   ¤   mFileRefNum;
52d9d6 ¤   ulong¤  ¤   ¤   mTestFileSize;
f10d98 ¤   TunerCallback¤  mCallback;
7755d3 ¤   long¤   ¤   ¤   mCallbackData;
3467c5 ¤
b279cd ¤   ushort¤ ¤   ¤   mNumTests;
84b405 ¤   ushort¤ ¤   ¤   mCurTestIndex;
ab67c5 ¤
07e719 ¤   virtual OSStatus¤   TestKPerSecond( short fileRefNum, void * buffer,
55582b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ulong ioSize, ulong testFileSize,
1072e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ulong * kPerSecond);
f8ae30 ¤   ¤   ¤   ¤   ¤
3acd37 ¤   virtual OSStatus¤   FindOptimalBlocks( ulong ioSize, ulong bestBlocks,
0a056d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ulong bestKPerSec, ulong * optimalBlocks);
00ae30 ¤   ¤   ¤   ¤   ¤
8d70df ¤   virtual OSErr¤  ¤   DetermineTestFileSize( ulong ioSize, ulong *testSize);
d867c5 ¤
24d502 ¤   virtual OSStatus¤   OpenTestFile( FSSpec *spec, short *¤fileRefNum );
b467c5 ¤
71f0ac ¤   virtual OSStatus¤   TuneSize( ulong ioBlocks, ulong minBlocks,
efb5d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ulong * optimalChunks );
8c67c5 ¤
35fdc4 ¤   virtual OSStatus¤   Tune( short vRefNum, IODirection direction,
543f31 ¤   ¤   ¤   ¤   ¤   ¤   ¤   TunerStruct *optimalTune,
5fa76f ¤   ¤   ¤   ¤   ¤   ¤   ¤   TunerCallback callback = nil);
5167c5 ¤
fd1b31 ¤   virtual OSStatus¤   CallCallback( void );
1c5ed4 public:
4b6eba ¤   ¤   ¤   ¤   ¤   ¤   CTuner( void );
f8030f ¤   virtual¤¤   ¤   ¤   ~CTuner( void );
8267c5 ¤
d767c5 ¤
a5b126 ¤   virtual OSStatus¤   Tune( short vRefNum, TunerCallback callback = nil,
9ef879 ¤   ¤   ¤   ¤   ¤   ¤   ¤   long callbackData = 0);
1662bd ¤   };
60af5a
--69ce 00091d89c9240120050 Page 1 of DriverAPI.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
c7cef2 ¤   $Id: DriverAPI.cp,v 1.4.8.1 1998/11/12 03:06:04 heller Exp $
ebf7f7 ____________________________________________________________________________*/
faaf5a
08bbf4 #include "MacFiles.h"
73af8a #include "MacMemory.h"
640d08 #include "pgpMem.h"
f185c2 #include "MacStrings.h"
6375a9 #include "MacDriverUtils.h"
4caf5a
6daf5a
d837d9 #include "DriverAPI.h"
e4af5a
d4af5a
53af5a
7d33c8 ¤   static void
d2b907 PGPDiskInitCSParam(
439177 ¤   ParamBlockRec *¤pb,
8b14d9 ¤   const void *¤   bytes,
547acd ¤   ushort¤ ¤   ¤   numBytes )
5dc7a1 ¤   {
94269b ¤   DriverAPIStruct *¤  api¤= (DriverAPIStruct *)&pb->cntrlParam.csParam[ 0 ];
b367c5 ¤
90321c ¤   if ( numBytes <= sizeof( api->data ) + sizeof( api->extra ) )
555b34 ¤   ¤   {
85d7cb ¤   ¤   api->magic¤ = DriverAPIStruct::kMagicIn;
5787c7 ¤   ¤   ¤
352020 ¤   ¤   if ( numBytes != 0 )
3bf776 ¤   ¤   ¤   {
0fec08 ¤   ¤   ¤   pgpAssert( sizeof( *api ) <= sizeof( pb->cntrlParam.csParam ) );
e62d1f ¤   ¤   ¤   BlockMoveData( bytes, &api->data, numBytes );
01a3a6 ¤   ¤   ¤   }
860fe4 ¤   ¤   }
bc0e24 ¤   else
015b34 ¤   ¤   {
03c7e9 ¤   ¤   pgpDebugPStr( "\pPGPDiskInitCSParam: illegal length" );
a50fe4 ¤   ¤   }
839371 ¤   }
a2af5a
4daf5a
8faf5a
4a8163 enum CallType¤  { kStatus, kControl };
2aaf5a
3fd140 ¤   static OSErr
2265c6 PGPDiskStatusOrControl(
289177 ¤   ParamBlockRec *¤pb,
dea752 ¤   const short¤¤   csCode,
b3de9d ¤   const long¤ ¤   data,
c7d24d ¤   const short¤¤   optionalDriverRefNum,
30ee5f ¤   CallType¤   ¤   status)
a3c7a1 ¤   {
9e0e86 ¤   OSErr¤  err¤= paramErr;
687ada ¤   short¤  driverRefNum¤   = optionalDriverRefNum;
0f67c5 ¤
7436d5 ¤   if ( driverRefNum == 0 )
d15b34 ¤   ¤   {
b6685d ¤   ¤   if ( ! DriverIsInstalled( kPGPDiskDriverName, &driverRefNum ) )
8bf776 ¤   ¤   ¤   {
2a0d23 ¤   ¤   ¤   driverRefNum¤   = 0;
05a3a6 ¤   ¤   ¤   }
a90fe4 ¤   ¤   }
b867c5 ¤
643286 ¤   if ( driverRefNum != 0 )
dc5b34 ¤   ¤   {
787437 ¤   ¤   pb->cntrlParam.ioCRefNum¤   = driverRefNum;
a9e355 ¤   ¤   pb->cntrlParam.csCode¤  ¤   = csCode;
e37f76 ¤   ¤   PGPDiskInitCSParam( pb, &data, sizeof( data ) );
281b52 ¤   ¤
910527 ¤   ¤   if ( status == kStatus )
--cae8 000c45d095b40120050 Page 2 of DriverAPI.cp
a0f6bb ¤   ¤   ¤   err¤= PBStatusSync( pb );
5f0e1d ¤   ¤   else
f22cb2 ¤   ¤   ¤   err¤= PBControlSync( pb );
821b52 ¤   ¤
ddd798 ¤   ¤   if ( IsntErr( err ) )
35f776 ¤   ¤   ¤   {
9281f6 ¤   ¤   ¤   // verify that driver understood our request
e5fd3c ¤   ¤   ¤   const DriverAPIStruct *¤api¤=
19a688 ¤   ¤   ¤   ¤   ¤   (const DriverAPIStruct *)&pb->cntrlParam.csParam[ 0 ];
5f67c5 ¤
b77b79 ¤   ¤   ¤   if ( api->magic != DriverAPIStruct::kMagicOut )
6072c3 ¤   ¤   ¤   ¤   {
40e238 ¤   ¤   ¤   ¤   err¤= paramErr;
792613 ¤   ¤   ¤   ¤   }
2ca3a6 ¤   ¤   ¤   }
660fe4 ¤   ¤   }
7867c5 ¤
ddc597 ¤   AssertNoErr( err, "PGPDiskStatusOrControl" );
1be4a6 ¤   return( err );·
ec9371 ¤   }
8caf5a
1e67c5 ¤
5867c5 ¤
e3eacd ¤   OSErr
962ce2 PGPDiskStatus(
3f9177 ¤   ParamBlockRec *¤pb,
caa752 ¤   const short¤¤   csCode,
64de9d ¤   const long¤ ¤   data,
a1acf5 ¤   const short¤¤   optionalDriverRefNum)
7ec7a1 ¤   {
4520a2 ¤   return( PGPDiskStatusOrControl( pb, csCode, data, optionalDriverRefNum,
f4052c ¤   ¤   ¤   ¤   ¤   kStatus ) );
089371 ¤   }
0367c5 ¤
4867c5 ¤
01eacd ¤   OSErr
3560c3 PGPDiskControl(
029177 ¤   ParamBlockRec *¤pb,
bba752 ¤   const short¤¤   csCode,
9dde9d ¤   const long¤ ¤   data,
ebacf5 ¤   const short¤¤   optionalDriverRefNum)
43c7a1 ¤   {
4420a2 ¤   return( PGPDiskStatusOrControl( pb, csCode, data, optionalDriverRefNum,
977730 ¤   ¤   ¤   ¤   ¤   kControl ) );
c79371 ¤   }
f1af5a
6ddacc #pragma mark -
4467c5 ¤
1267c5 ¤
f67e69 ¤   Boolean
c1ce5b DriverNameIsPGPDisk( ConstStr255Param¤  driverName )
adc7a1 ¤   {
f874ef ¤   Boolean¤isPGPDiskDriverName¤= false;
e567c5 ¤
875511 ¤   pgpAssert( pgpMemoryEqual( &kPGPDiskDriverNamePrefix[ 1 ],
c07687 ¤   ¤   ¤   ¤   &kPGPDiskDriverName[ 1 ], kPGPDiskDriverNamePrefix[ 0 ] ) );
4967c5 ¤
ce0cb9 ¤   // check the the driver name has the prefix 'kPGPDiskDriverNamePrefix'
d5eafa ¤   if ( StrLength( driverName ) >= StrLength( kPGPDiskDriverNamePrefix ) &&
8e653a ¤   ¤   pgpMemoryEqual( &kPGPDiskDriverNamePrefix[ 1 ], &driverName[ 1 ],
2c6753 ¤   ¤   ¤   ¤   StrLength( kPGPDiskDriverNamePrefix ) ) )
855b34 ¤   ¤   {
75623f ¤   ¤   isPGPDiskDriverName¤= TRUE;
ce0fe4 ¤   ¤   }
e21b52 ¤   ¤
717aae ¤   return( isPGPDiskDriverName ·);
6b47d1 ¤   }·
0967c5 ¤
8567c5 ¤
2067c5 ¤
1b7e69 ¤   Boolean
c4f090 IsPGPDiskDriver( short driverRefNum )
--31cb 0001ddea47c40120050 Page 3 of DriverAPI.cp
f7c7a1 ¤   {
ea0199 ¤   Boolean¤isPGPDiskDriver¤= false;
128e70 ¤   OSErr¤  err¤= noErr;
64209b ¤   Str255¤ driverName;
bc67c5 ¤
d0ae21 ¤   err¤= GetDriverNameUsingRefNum( driverRefNum, driverName );
8867c5 ¤
d417a2 ¤   if ( IsntErr( err ) && DriverNameIsPGPDisk( driverName ) )
705b34 ¤   ¤   {
50b4a8 ¤   ¤   PGPDriverInfoStruct ¤   info;
69af5a
dd498e ¤   ¤   err¤= GetPGPDiskDriverInfo( driverRefNum, &info );
8513a9 ¤   ¤   isPGPDiskDriver¤= ( err == noErr );
a30fe4 ¤   ¤   }
a51b52 ¤   ¤
7372be ¤   return( isPGPDiskDriver );
ad9371 ¤   }
25af5a
40af5a
2eaf5a
066d52 ¤   void
ce8d21 GetUniquePGPDiskDriverName( StringPtr newName )
f1c7a1 ¤   {
028fb4 ¤   ushort¤ suffixNumber¤   = 0;
e267c5 ¤
a3db55 ¤   CopyPString( kPGPDiskDriverName, newName );
6967c5 ¤
79cfa1 ¤   do
b95b34 ¤   ¤   {
af4744 ¤   ¤   Str255¤ tempStr;
4bb0dc ¤   ¤   short¤  refNum;
de1b52 ¤   ¤
e9d2bb ¤   ¤   if ( ! DriverIsInstalled( newName, &refNum ) )
cff776 ¤   ¤   ¤   {
e0cdcb ¤   ¤   ¤   break;
b1a3a6 ¤   ¤   ¤   }
af1b52 ¤   ¤
0e7dc3 ¤   ¤   CopyPString( kPGPDiskDriverNamePrefix, newName );
598253 ¤   ¤   ++suffixNumber;
f9bc34 ¤   ¤   NumToString( suffixNumber, tempStr );
4bf282 ¤   ¤   AppendPString( tempStr, newName );
c51b52 ¤   ¤
8e0d89 ¤   ¤   } while ( TRUE );
e99371 ¤   }
3baf5a
5caf5a
d6af5a
767e69 ¤   Boolean
86b105 DriveIsPGPDisk( short¤  driveNumber )
40c7a1 ¤   {
976c9b ¤   pgpAssert( driveNumber > 0 );
5b67c5 ¤
4d1d25 ¤   short¤  ¤   driverRefNum;
401b52 ¤   ¤
519631 ¤   GetDriverRefNumForDrive( driveNumber, &driverRefNum );
861b52 ¤   ¤
65223b ¤   return( IsPGPDiskDriver( driverRefNum ) );
759371 ¤   }
fdaf5a
beaf5a
ef7e69 ¤   Boolean
cead7b VolumeIsPGPDisk( short¤ vRefNum )
47c7a1 ¤   {
b2d690 ¤   short¤  ¤   driveNumber;
7a1d25 ¤   short¤  ¤   driverRefNum;
2875f8 ¤   OSStatus¤   err¤= noErr;
8467c5 ¤
53dd44 ¤   err¤= GetVolumeDriveNumberAndRefNum( vRefNum, &driveNumber,
892653 ¤   ¤   ¤   ¤   &driverRefNum );
2c67c5 ¤
e7f966 ¤   return( IsntErr( err ) && IsPGPDiskDriver( driverRefNum ) );
1d9371 ¤   }
--6d07 0000aa4705d40120050 Page 4 of DriverAPI.cp
e0af5a
1aaf5a
17af5a
78af5a
e4d140 ¤   static OSErr
0007b2 SendIOOptionsToDriverForVolume(
7d9a90 ¤   short¤  ¤   ¤   ¤   vRefNum,
d007e9 ¤   IOOptionsStruct¤*¤  options)
6bc7a1 ¤   {
9bc052 ¤   pgpAssert( vRefNum < 0 );
be8e70 ¤   OSErr¤  err¤= noErr;
0667c5 ¤
f187f2 ¤   if ( VolumeIsPGPDisk( vRefNum ) )
db5b34 ¤   ¤   {
75d8f8 ¤   ¤   short¤  ¤   ¤   driverRefNum;
e35448 ¤   ¤   OSErr¤  ¤   ¤   err¤= noErr;
d6d8ab ¤   ¤   ParamBlockRec¤  pb;
4d1b52 ¤   ¤
5891ac ¤   ¤   GetVolumeDriveNumberAndRefNum( vRefNum, &options->driveNumber,
482653 ¤   ¤   ¤   ¤   &driverRefNum );
7f1b52 ¤   ¤
3757f5 ¤   ¤   err¤= PGPDiskControl( &pb, kSetIOOptionsCC, (long)options,
92117a ¤   ¤   ¤   ¤   ¤   driverRefNum);
d94b9a ¤   ¤   AssertNoErr( err, "ChangeDriverMaxReadMaxBlocks" );
b60fe4 ¤   ¤   }
921b52 ¤   ¤
46deb7 ¤   return( err );
329371 ¤   }
2767c5 ¤
c2af5a
64eacd ¤   OSErr
abd390 ChangeDriveTuner(
7e94ce ¤   short¤  ¤   ¤   ¤   ¤   ¤   vRefNum,
4f5e77 ¤   const TunerStruct *¤¤   ¤   tuner,
fe8c11 ¤   IOOptionsStruct::TunerType¤ tunerType)
0bc7a1 ¤   {
8d8214 ¤   IOOptionsStruct¤options;
536920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
3667c5 ¤
afed7a ¤   pgpClearMemory( &options, sizeof( options ) );
5b67c5 ¤
ba6a5d ¤   options.tunerType¤  ¤   = tunerType;
d2b3ba ¤   options.tuner¤  ¤   ¤   = *tuner;
7667c5 ¤
cd1a68 ¤   err¤= SendIOOptionsToDriverForVolume( vRefNum, &options );
0967c5 ¤
a8deb7 ¤   return( err );
239371 ¤   }
f467c5 ¤
7aaf5a
40af5a
36eacd ¤   OSErr
c1cdbe GetPGPDiskDriverInfo(
bc54e7 ¤   short¤  ¤   ¤   ¤   ¤   driverRefNum,
0bab9b ¤   PGPDriverInfoStruct *¤  info )
66c7a1 ¤   {
cd7cbf ¤   OSErr¤  ¤   ¤   err;
de2ece ¤   ParamBlockRec¤  pb;
1167c5 ¤
2edbb8 ¤   err¤= PGPDiskStatus( &pb, kGetDriverInfoSC, (long)info, driverRefNum);
0d67c5 ¤
5ddeb7 ¤   return( err );
1d9371 ¤   }
3967c5 ¤
6567c5 ¤
5a67c5 ¤
dbeacd ¤   OSErr
c1e609 GetPGPDriveInfo(
a5a847 ¤   short¤  ¤   ¤   ¤   ¤   driveNumberOrVRefNum,
f29779 ¤   PGPDriveInfoStruct *¤   driveInfo )
d3c7a1 ¤   {
0a6920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
--f572 0002436774140120050 Page 5 of DriverAPI.cp
1b2ece ¤   ParamBlockRec¤  pb;
dc378b ¤   short¤  ¤   ¤   driverRefNum;
ee220b ¤   short¤  ¤   ¤   driveNumber;
6d67c5 ¤
83443d ¤   pgpAssert( driveNumberOrVRefNum != 0 );
a167c5 ¤
506435 ¤   if ( driveNumberOrVRefNum < 0 )
6a5b34 ¤   ¤   {
6b9efa ¤   ¤   // it's a vRefNum
09a402 ¤   ¤   GetVolumeDriveNumberAndRefNum( driveNumberOrVRefNum, &driveNumber,
5e2653 ¤   ¤   ¤   ¤   &driverRefNum );
010fe4 ¤   ¤   }
0b0e24 ¤   else
ed5b34 ¤   ¤   {
285365 ¤   ¤   // it's a drive number
87e887 ¤   ¤   driveNumber¤= driveNumberOrVRefNum;
566a66 ¤   ¤   err¤= GetDriverRefNumForDrive( driveNumber, &driverRefNum );
980fe4 ¤   ¤   }
0aaf5a
f067c5 ¤
ac5ecc ¤   if ( IsntErr( err ) )
ec5b34 ¤   ¤   {
74037b ¤   ¤   driveInfo->driveNumberIn¤   = driveNumber;
831b52 ¤   ¤
a6e1d6 ¤   ¤   err¤= PGPDiskStatus( &pb, kGetDriveInfoSC, (long)driveInfo,
dd117a ¤   ¤   ¤   ¤   ¤   driverRefNum);
220fe4 ¤   ¤   }
7f67c5 ¤
5cdeb7 ¤   return( err );
749371 ¤   }
0aaf5a
09af5a
a8af5a
d3af5a
8367c5 ¤
ab85ea ¤   OSStatus
01ba26 ChangeWriteBufferSize(
d6337a ¤   short¤  driverRefNum,
485997 ¤   ulong¤  bufferSize )
99c7a1 ¤   {
9979f7 ¤   OSStatus¤   ¤   err¤= noErr;
932ece ¤   ParamBlockRec¤  pb;
2167c5 ¤
5f8578 ¤   err¤= PGPDiskControl( &pb, kChangeWriteBufferSizeCC, (long)bufferSize,
a39d05 ¤   ¤   ¤   ¤   driverRefNum);
ff67c5 ¤
66deb7 ¤   return( err );
809371 ¤   }
1167c5 ¤
5867c5 ¤
a467c5 ¤
db67c5 ¤
dd85ea ¤   OSStatus
6ee2ae PGPDriverRemoveDrive(
57337a ¤   short¤  driverRefNum,
6568ab ¤   short¤  driveNumber )
71c7a1 ¤   {
2b79f7 ¤   OSStatus¤   ¤   err¤= noErr;
4f2ece ¤   ParamBlockRec¤  pb;
a967c5 ¤
e5850f ¤   err¤= PGPDiskControl( &pb, kRemoveDriveCC, (long)driveNumber,
889d05 ¤   ¤   ¤   ¤   driverRefNum);
d567c5 ¤
b6deb7 ¤   return( err );
c69371 ¤   }
0467c5 ¤
ba67c5 ¤
a067c5 ¤
0785ea ¤   OSStatus
300955 SendPreferencesToDriver(
5229b4 ¤   short¤  ¤   ¤   ¤   ¤   ¤   driverRefNum,
24d68f ¤   const PGPDiskDriverPrefs ¤  *driverPrefs)
--5baa 001902de42640120050 Page 6 of DriverAPI.cp
f7c7a1 ¤   {
ec79f7 ¤   OSStatus¤   ¤   err¤= noErr;
dc2ece ¤   ParamBlockRec¤  pb;
b667c5 ¤
baa2bc ¤   pgpAssertAddrValid( driverPrefs, PGPDiskDriverPrefs );
5567c5 ¤
246079 ¤   err¤= PGPDiskControl( &pb, kSetPrefsCC, (long) driverPrefs,
739e5e ¤   ¤   ¤   ¤   driverRefNum );
2b67c5 ¤
73deb7 ¤   return( err );
4f9371 ¤   }
55af5a
6aaf5a
a385ea ¤   OSStatus
b97aa2 PGPDiskDriveUnmountedInProcess(
ef932c ¤   short¤  ¤   ¤   ¤   driverRefNum,
0e3b1d ¤   short¤  ¤   ¤   ¤   driveNumber,
d3a893 ¤   ProcessSerialNumber¤unmountingAppPSN)
4bc7a1 ¤   {
0e79f7 ¤   OSStatus¤   ¤   err¤= noErr;
b72ece ¤   ParamBlockRec¤  pb;
fd4109 ¤   PGPDriveUnmountedStruct¤info;
f267c5 ¤
431aba ¤   info.driveNumber¤   ¤   = driveNumber;
6c7564 ¤   info.unmountingProcess¤ = unmountingAppPSN;
2c67c5 ¤
3d290a ¤   err¤= PGPDiskControl( &pb, kDriveUnmountedCC, (long) &info,
399e5e ¤   ¤   ¤   ¤   driverRefNum );
ba67c5 ¤
41deb7 ¤   return( err );
509371 ¤   }
0c67c5 ¤
e3af5a
6baf5a
20af5a
73af5a
eaaf5a
4caf5a
30af5a
1baf5a
7eaf5a
37af5a
55af5a
ccaf5a
8daf5a
2baf5a
92af5a
90af5a
--4de7 00079ea642340120051 Page 1 of DriverAPI.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
aff20c ¤   $Id: DriverAPI.h,v 1.4.8.1 1998/11/12 03:06:05 heller Exp $
c3f7f7 ____________________________________________________________________________*/
d6af5a
b57b7d #pragma once
d9af5a
fa58cd #include "DriverPrefs.h"
75af5a
13e9d6 const ushort¤   kPGPDiskDriverVersion¤  = 0x0101;
c0af5a
5ca486 const ulong¤¤   kPGPDiskBlockSize¤  = 512;
0341e1 const OSType¤   kPGPDiskDriverType¤ = 'Drvr';
5535e3 const uchar¤¤   kPGPDiskDriverNamePrefix[]¤ = "\p.PGPDisk";
10db52 const uchar¤¤   kPGPDiskDriverName[]¤   ¤   = "\p.PGPDisk000";
50af5a
48af5a
1f73a3 #if PRAGMA_STRUCT_ALIGN
3bea9a #pragma options align=mac68k¤   ¤   // [
dd7454 #endif
fdaf5a
5108a4 #include "TunerStruct.h"
ddaf5a
6caf5a
6b2811 /*___________________________________________________________________________
9c3bce ¤   Used to tell the driver how to tune itself for a particular drive.
14c988 ___________________________________________________________________________*/
4301a2 typedef struct IOOptionsStruct
10c7a1 ¤   {
3e0ec4 ¤   enum TunerType { kReadTuner, kWriteTuner };
fc220b ¤   short¤  ¤   ¤   driveNumber;
7267c5 ¤
308bfd ¤   TunerType¤  ¤   tunerType;
0b3b98 ¤   TunerStruct¤¤   tuner;
be936d ¤   } IOOptionsStruct;
96af5a
b3af5a
02972c // used in 'kGetDriverInfoSC' call
3ec357 typedef struct PGPDriverInfoStruct
87c7a1 ¤   {
ba180d ¤   ushort¤ ¤   versionOut;
0b3288 ¤   ulong¤  ¤   writeBufferSizeOut;
0828ec ¤   ushort¤ ¤   numDrivesOut;
ef67c5 ¤
92591a ¤   ulong¤  ¤   reserved[ 128 ];
f13d0b ¤   } PGPDriverInfoStruct;
f2af5a
e8af5a
759989 // used for 'kGetDriveInfoSC' call
219a34 typedef struct PGPDriveInfoStruct
22c7a1 ¤   {
d81ef7 ¤   short¤  ¤   ¤   driveNumberIn;
5767c5 ¤
bf7c14 ¤   short¤  ¤   ¤   baseDriveNumberOut;
071210 ¤   TunerStruct¤¤   readTuneOut;
0da255 ¤   TunerStruct¤¤   writeTuneOut;
8cf61c ¤   Boolean¤¤   ¤   breaksUpRequests;
6c21f7 ¤   short¤  ¤   ¤   fileRefNum;
4c1006 ¤   ulong¤  ¤   ¤   reserved[ 128 ];
ea67c5 ¤
9d7cb6 ¤   } PGPDriveInfoStruct;
beaf5a
72af5a
5b02ad typedef struct PGPDriveUnmountedStruct
1dc7a1 ¤   {
e62c55 ¤   short¤  ¤   ¤   ¤   ¤   driveNumber;
f0ee32 ¤   ProcessSerialNumber¤¤   unmountingProcess;
2167c5 ¤
3613f0 ¤   } PGPDriveUnmountedStruct;
79af5a
--0e93 000141515ed40120051 Page 2 of DriverAPI.h
e0af5a
f02811 /*___________________________________________________________________________
5cc949 ¤   Used for all API calls. ·'data' is typically a pointer to a struct or
8ea510 ¤   other data.
96c988 ___________________________________________________________________________*/
ca0948 typedef struct DriverAPIStruct
2cc7a1 ¤   {
a58f8d ¤   enum { kMagicIn = 'pgpI', kMagicOut = 'pgpO' };
0d0120 ¤   ulong¤  magic;
8049ea ¤   long¤   data;
1067c5 ¤
ea6752 ¤   // CAUTION: this entire struct must be no larger than short csParam[11]
a9889e ¤   #define kCSParamSize¤   ( sizeof( short ) * 11 )
b8b102 ¤   char¤   ¤   extra[ kCSParamSize ·- sizeof( long ) - sizeof( ulong ) ];·
bcdb31 ¤   } DriverAPIStruct;
51af5a
3baf5a
13af5a
faaf5a
4373a3 #if PRAGMA_STRUCT_ALIGN
437682 #pragma options align=reset¤// ]
357454 #endif
7eaf5a
d1af5a
caaf5a
e0bdd8 #include "AddDriveStruct.h"
f2af5a
5eaf5a
9daf5a
61af5a
03af5a
9da770 // control and status codes for our driver
6e7353 enum
bac7a1 ¤   {
522ad4 ¤   // control codes
7d87c8 ¤   kSetPrefsCC¤= 10000,
88b4d3 ¤   kAddDriveCC,
028e69 ¤   kRemoveDriveCC,
3e67c5 ¤
96a3aa ¤   kChangeWriteBufferSizeCC,
302bc9 ¤   kSetIOOptionsCC,
ea8d94 ¤   kToggleKeyBitsCC,
dec969 ¤   kDriveUnmountedCC,
e567c5 ¤
fcd641 ¤   // Status codes
c43d55 ¤   kFirstSC = 11100,
fb6f69 ¤   kGetDriverInfoSC,
bb2db0 ¤   kGetDriveInfoSC
a562bd ¤   };
48af5a
ddaf5a
1d3a35 Boolean¤¤   IsPGPDiskDriver( short driverRefNum );
efaf5a
a4e0d8 OSErr¤  ¤   PGPDiskStatus( ParamBlockRec *pb, short csCode, long data,
f61648 ¤   ¤   ¤   ¤   ¤   short driverRefNum = 0);
394c64 OSErr¤  ¤   PGPDiskControl( ParamBlockRec *pb, short csCode, long data,
2e1648 ¤   ¤   ¤   ¤   ¤   short driverRefNum = 0);
32af5a
62f8e4 Boolean¤¤   DriveIsPGPDisk( short vRefNum );
f8c9cc Boolean ¤   DriverNameIsPGPDisk( ConstStr255Param driverName );
08af5a
66666a Boolean¤¤   VolumeIsPGPDisk( short vRefNum );
cc736e OSErr¤  ¤   GetPGPDiskDriverInfo( short driverRefNum,
b57e9e ¤   ¤   ¤   ¤   ¤   PGPDriverInfoStruct *driverInfo );
6a3efb OSErr¤  ¤   GetPGPDriveInfo( short driveNumber,
622846 ¤   ¤   ¤   ¤   ¤   PGPDriveInfoStruct *driveInfo );
b3be6b OSStatus¤   ChangeWriteBufferSize( short driverRefNum, ulong bufferSize );
1057d5 OSStatus¤   PGPDriverRemoveDrive( short driverRefnum, ·short driveNumber );
28af5a
ca29b7 OSErr¤  ¤   ChangeDriveTuner( short vRefNum, const TunerStruct * tuner,
14554e ¤   ¤   ¤   ¤   ¤   IOOptionsStruct::TunerType¤ tunerType);
14af5a
--2641 001d24ebeb340120051 Page 3 of DriverAPI.h
e0af5a
e895d0 void¤   ¤   GetUniquePGPDiskDriverName( StringPtr newName );
8eaf5a
ddaf5a
b02492 OSStatus¤   SendPreferencesToDriver(short driverRefNum,
85da0e ¤   ¤   ¤   ¤   ¤   const PGPDiskDriverPrefs *driverPrefs);
35368c OSStatus¤   PGPDiskDriveUnmountedInProcess(short driverRefNum,
438c02 ¤   ¤   ¤   ¤   ¤   short driveNumber, ProcessSerialNumber unmountingAppPSN);
d2af5a
--9d89 0010a415cda40120052 Page 1 of DriverPrefs.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
d6b0a8 ¤   $Id: DriverPrefs.h,v 1.3.8.1 1998/11/12 03:06:05 heller Exp $
b6f7f7 ____________________________________________________________________________*/
1baf5a
727b7d #pragma once
2daf5a
5290fb #pragma options align=mac68k¤   // [
36af5a
23ad12 typedef struct PGPDiskDriverPrefs
57bb36 {
3efc97 ¤   enum { kDefaultIdleSeconds = 15 * 60UL };¤  // 15 minutes
77538e ¤   Boolean¤¤   unmountDrivesOnPBSleep;
4467c5 ¤
624681 ¤   Boolean¤¤   unmountAfterIdleTime;
6833ce ¤   ulong¤  ¤   unmountIdleTimeSeconds;
fa67c5 ¤
d46902 ¤   ulong¤  ¤   reserved[ 2 ];
b6ff00 } PGPDiskDriverPrefs;
d9af5a
e6af5a
a732b7 const PGPDiskDriverPrefs kDefaultPGPDiskDriverPrefs =
aec7a1 ¤   {
f2f751 ¤   TRUE,¤  ¤   ¤   ¤   ¤   // unmountDrivesOnPBSleep
e7371d ¤   TRUE,¤  ¤   ¤   ¤   ¤   // unmountAfterIdleTime
c613ba ¤   PGPDiskDriverPrefs::kDefaultIdleSeconds,¤   // unmountIdleTimeSeconds
1f0b8b ¤   {0,}
aa62bd ¤   };
8aaf5a
417682 #pragma options align=reset¤// ]
0aaf5a
--e15f 001e2d225f340120053 Page 1 of PGPDisk.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
59ea4e ¤   $Id: PGPDisk.h,v 1.7.8.1 1998/11/12 03:06:06 heller Exp $
f6f7f7 ____________________________________________________________________________*/
57af5a
7e7b7d #pragma once
dcaf5a
d2c7ff #include <Power.h>
3547af #include <Disks.h>
67af5a
0faf5a
77ba14 #include "PGPMountUtils.h"
6caf5a
d6af5a
601ab5 #define¤kPGPDiskFileCreator ¤   'pgpD'
5fa33a #define kPGPDiskFileType¤   ¤   'Dsk1'
36af5a
79301a #define¤kMaxPassPhraseLength¤   130
1bcb30 #define¤kMinPassPhraseLength¤   8
24af5a
08af5a
7837d9 #include "DriverAPI.h"
b5af5a
52af5a
db26fd // PGPDisk error numbers
190fb3 // CAUTION: if you add an error, you probably want to add an error string
780aae // to the list in PGPDiskResources.h
887353 enum
9ebb36 {
b6d1ee ¤   kPGPDiskInvalidFileHeaderError ¤= 1000,
798d28 ¤   kPGPDiskUnknownFileVersionError,
ae5b2c ¤   kPGPDiskNewerFileVersionError,
54b382 ¤   kPGPDiskUnknownFileKindError,¤  ¤   ¤   // Invalid type and/or creator
547756 ¤   kPGPDiskUnknownAlgorithmError,
d667c5 ¤
db2ef5 ¤   kPGPDiskRemoteVolumeTypeError,
fdc9f4 ¤   kPGPDiskForeignVolumeTypeError,
b567c5 ¤
7059c0 ¤   kPGPDiskIncorrectPassphraseError,
fbaaaf ¤   kPGPDiskMasterPassphraseError,
4567c5 ¤
afea4b #if PGPDISK_PUBLIC_KEY
8722eb ¤   kPGPDiskIncorrectPassphraseNoKeyringsError,
7966a1 ¤   kPGPDiskIncorrectPassphraseKeyNotFoundError,
48af5a
8dda02 ¤   kPGPdiskADKNotFoundError,
f37454 #endif
b467c5 ¤
0d2ea8 ¤   kPGPDiskFileInUseByDriverError,
216f88 ¤   kPGPDiskFileAlreadyOpenError,
6c30ce ¤   kPGPDiskFileLockedError,
13a343 ¤   kPGPDiskFileOnLockedVolumeError,
5167c5 ¤
f8117d ¤   kCastSBoxesInvalidError,
60b72f ¤   kCipherProcDamagedError,
baca16 ¤   kPGPDiskInvalidGlobalsMagicError,
09c919 ¤   kNoMorePassphrasesAvailableError,
baf52e ¤   kEndOfKeyIterationError
9682f7 };
12af5a
efaf5a
6aaf5a
e2af5a
--cf49 000ba0b3a7a40120054 Page 1 of PGPDiskEncryptDecrypt.c
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
5e85d5 ¤   $Id: PGPDiskEncryptDecrypt.c,v 1.3.8.1 1998/11/12 03:06:07 heller Exp $
4ef7f7 ____________________________________________________________________________*/
fcaf5a
403175 #include "PGPDiskEncryptDecrypt.h"
244818 #include "SHA.h"
51af5a
2b8c21 #include "CipherContext.h"
d43cd9 #include "PGPDiskCastCFB.h"
daaf5a
ceaf8a #include "MacMemory.h"
6eaf5a
aedc08 const UInt32¤   kBlockSize¤ ¤   ¤   = 512;
da2c69 const UInt32¤   kBlockSizeInUInt32¤ = kBlockSize / sizeof( UInt32 );
84af5a
e3e7a0 #define Move512(src, dest)¤ BlockMoveData( src, dest, kBlockSize )
b5af5a
4faf5a
59c7fc #if CAST5_INTERLEAVED_ENCRYPT // {
e2af5a
3c33c8 ¤   static void
278369 EncryptBlock512(
f20540 ¤   const CipherContext *¤  context,
277fb6 ¤   ItemCount¤  ¤   ¤   ¤   blockNumber,
0ecd15 ¤   const UInt32 *¤ ¤   ¤   src,
872148 ¤   UInt32 *¤   ¤   ¤   ¤   dest)
59bb36 {
92772c ¤   int¤¤   ¤   i;
250c31 ¤   UInt32¤ ¤   sum0, sum1;
584ce8 ¤   UInt32¤ ¤   iv0, iv1;
b567c5 ¤
61ed96 ¤   pgpAssert( sizeof(context->salt.saltLongs[0]) == sizeof(UInt32) );
881b52 ¤   ¤
2f3c64 ¤   sum0¤   = context->salt.saltLongs[ 0 ] + blockNumber;
ecaa91 ¤   sum1¤   = context->salt.saltLongs[ 1 ] + blockNumber;
ddaf5a
21bc52 ¤   for (i = 0; i < kBlockSizeInUInt32 - 2; ++i)·
3ec7a1 ¤   {
ac8d8d ¤   ¤   sum1¤   += src[i];
547a2f ¤   ¤   sum0¤   += sum1;¤   ¤   // Simple Fletcher checksum of block
499371 ¤   }
1667c5 ¤
785a13 ¤   iv0 = sum0 ^ src[ kBlockSizeInUInt32 - 2 ];
c2e84a ¤   iv1 = sum1 ^ src[ kBlockSizeInUInt32 - 1 ];
c967c5 ¤
e0dc1d ¤   CAST5encryptCFBdbl(context->castCFB.expandedKey.keyWords, iv0, iv1, ~iv0,
1dfd76 ¤   ¤   ¤   ~iv1, src, dest, kBlockSize / ( 8 + 8) );
afaf5a
431bf7 ¤   dest[ kBlockSizeInUInt32 - 2 ] ^= sum0;
c34fdc ¤   dest[ kBlockSizeInUInt32 - 1 ] ^= sum1;
35efe6 }
a7af5a
2caf5a
0633c8 ¤   static void
355983 DecryptBlock512(
150540 ¤   const CipherContext *¤  context,
677fb6 ¤   ItemCount¤  ¤   ¤   ¤   blockNumber,
f9cd15 ¤   const UInt32 *¤ ¤   ¤   src,
852148 ¤   UInt32 *¤   ¤   ¤   ¤   dest)
7cbb36 {
9960d5 ¤   const int kSplitPointInUInt32 = kBlockSizeInUInt32/2;
2ddc0a ¤   const size_t kBytesBeforeSplit = kSplitPointInUInt32 * sizeof(UInt32);
096c77 ¤   const size_t kBytesAfterSplit = (kBlockSizeInUInt32 - kSplitPointInUInt32) *
1f93b9 ¤   ¤   ¤   ¤   ¤   sizeof(UInt32);
1b1426 ¤   int¤i;
35ad39 ¤   UInt32¤ iv0, iv1;
8baf5a
3fc743 ¤   /* This must be done in two halves to recover the IV */¤
bae1ba ¤   CAST5decryptCFBdbl(context->castCFB.expandedKey.keyWords,
--53f0 0006b5aadc740120054 Page 2 of PGPDiskEncryptDecrypt.c
e522ac ¤   ¤   src[ kSplitPointInUInt32 - 4 ], src[ kSplitPointInUInt32 - 3 ],
96b1d5 ¤   ¤   src[ kSplitPointInUInt32 - 2 ], src[ kSplitPointInUInt32 - 1 ],
05f846 ¤   ¤   src + kSplitPointInUInt32, dest + kSplitPointInUInt32,
da0f84 ¤   ¤   ¤   ¤   kBytesAfterSplit/(8 + 8));
e3081a ¤   iv0 = dest[ kBlockSizeInUInt32 - 2 ];
29b999 ¤   iv1 = dest[ kBlockSizeInUInt32 - 1 ];
0e979f ¤   CAST5decryptCFBdbl(context->castCFB.expandedKey.keyWords, iv0, iv1, ~iv0,
38a8e3 ¤   ¤   ¤   ~iv1, src, dest, kBytesBeforeSplit/(8 + 8) );
a3af5a
9f24f3 ¤   /* Undo the checksum */
e7a183 ¤   iv0¤= context->salt.saltLongs[ 0 ] + blockNumber;
e97fb0 ¤   iv1¤= context->salt.saltLongs[ 1 ] + blockNumber;
25ff4d ¤   for (i = 0; i < kBlockSizeInUInt32 - 2; ++i)
3ec7a1 ¤   {
64ea32 ¤   ¤   iv1¤¤   += dest[ i ];
4aa13f ¤   ¤   iv0¤¤   += iv1;
199371 ¤   }
1aaf5a
377209 ¤   dest[ kBlockSizeInUInt32 - 2 ]¤ ^= iv0;
4d2622 ¤   dest[ kBlockSizeInUInt32 - 1 ]¤ ^= iv1;
3aefe6 }
77af5a
945281 #else // } !CAST5_INTERLEAVED_ENCRYPT {
3baf5a
fc33c8 ¤   static void
948369 EncryptBlock512(
980540 ¤   const CipherContext *¤  context,
8453ae ¤   ItemCount¤  ¤   ¤   ¤   seedValue,
80cd15 ¤   const UInt32 *¤ ¤   ¤   src,
ee2148 ¤   UInt32 *¤   ¤   ¤   ¤   dest)
e5bb36 {
18dde4 ¤   short¤  ¤   ¤   i;
49fb56 ¤   UInt32¤ ¤   ¤   iv0, iv1;
f867c5 ¤
622105 ¤   pgpAssert( sizeof( context->salt.saltLongs[ 0 ] ) == sizeof( UInt32 ) );
151b52 ¤   ¤
05b9be ¤   iv0 = 0;
ba3365 ¤   iv1¤= 0;
8fa701 ¤   for ( i = 0; i < kBlockSizeInUInt32 - 2; ++i )
4dc7a1 ¤   {
bcad1b ¤   ¤   iv1¤+= src[ i ];
72ac9f ¤   ¤   iv0¤+= iv1;¤¤   // Simple Fletcher checksum of block
229371 ¤   }
8e67c5 ¤
a500e7 ¤   iv0¤^= context->salt.saltLongs[ 0 ];
93069a ¤   iv1¤^= context->salt.saltLongs[ 1 ];
a867c5 ¤
282e40 ¤   iv0¤+= seedValue;
60a050 ¤   iv1¤+= seedValue;
06af5a
5c440b ¤   CAST5encryptCFB(context->castCFB.expandedKey.keyWords,
cd6ec0 ¤   ¤   iv0 ^ src[kBlockSizeInUInt32 - 2],
a70b6e ¤   ¤   iv1 ^ src[kBlockSizeInUInt32 - 1],
320e10 ¤   ¤   src, dest, kBlockSize/8);
13f7d7 ¤   dest[kBlockSizeInUInt32 - 2] ^= iv0;
0953b8 ¤   dest[kBlockSizeInUInt32 - 1] ^= iv1;
c1efe6 }
47af5a
1c33c8 ¤   static void
705983 DecryptBlock512(
1d0540 ¤   const CipherContext *¤  context,
2a53ae ¤   ItemCount¤  ¤   ¤   ¤   seedValue,
d6cd15 ¤   const UInt32 *¤ ¤   ¤   src,
512148 ¤   UInt32 *¤   ¤   ¤   ¤   dest)
19bb36 {
c860d5 ¤   const int kSplitPointInUInt32 = kBlockSizeInUInt32/2;
f4dc0a ¤   const size_t kBytesBeforeSplit = kSplitPointInUInt32 * sizeof(UInt32);
4f1c32 ¤   const size_t kBytesAfterSplit = (kBlockSizeInUInt32 -
99bd9d ¤   ¤   ¤   ¤   kSplitPointInUInt32) * sizeof(UInt32);
d61426 ¤   int¤i;
31ad39 ¤   UInt32¤ iv0, iv1;
6baf5a
--0cc8 0002d768e1940120054 Page 3 of PGPDiskEncryptDecrypt.c
17c743 ¤   /* This must be done in two halves to recover the IV */¤
2c58a8 ¤   CAST5decryptCFB( context->castCFB.expandedKey.keyWords,
72b1d5 ¤   ¤   src[ kSplitPointInUInt32 - 2 ], src[ kSplitPointInUInt32 - 1 ],
7554a7 ¤   ¤   &src[ kSplitPointInUInt32 ], &dest[ kSplitPointInUInt32 ],
57a2aa ¤   ¤   kBytesAfterSplit/8 );
0858a8 ¤   CAST5decryptCFB( context->castCFB.expandedKey.keyWords,
7ad2b9 ¤   ¤   dest[ kBlockSizeInUInt32 - 2 ], dest[ kBlockSizeInUInt32 - 1 ],
a3c0c9 ¤   ¤   src, dest, kBytesAfterSplit/8 );
57af5a
0d24f3 ¤   /* Undo the checksum */
8aacb0 ¤   iv0¤= 0;
963365 ¤   iv1¤= 0;
0eff4d ¤   for (i = 0; i < kBlockSizeInUInt32 - 2; ++i)
a6c7a1 ¤   {
c6ea32 ¤   ¤   iv1¤¤   += dest[ i ];
dea13f ¤   ¤   iv0¤¤   += iv1;
ba9371 ¤   }
9f824e ¤   iv0¤¤   ^= context->salt.saltLongs[ 0 ];
0dc3e4 ¤   iv1¤¤   ^= context->salt.saltLongs[ 1 ];
0f98ac ¤   iv0¤¤   += seedValue;
8f47fa ¤   iv1¤¤   += seedValue;
3baf5a
c67209 ¤   dest[ kBlockSizeInUInt32 - 2 ]¤ ^= iv0;
bc2622 ¤   dest[ kBlockSizeInUInt32 - 1 ]¤ ^= iv1;
1befe6 }
a1af5a
aa1429 #endif // } !CAST5_INTERLEAVED_ENCRYPT
b1af5a
86af5a
3d6d52 ¤   void
a6d92b CipherBlocks(
960540 ¤   const CipherContext *¤  context,
746b9c ¤   ItemCount¤  ¤   ¤   ¤   startBlockIndex,
99c1b0 ¤   ItemCount¤  ¤   ¤   ¤   numBlocks,
fb07d1 ¤   const void *¤   ¤   ¤   src,
5ef100 ¤   void *¤ ¤   ¤   ¤   ¤   dest,
bc4333 ¤   CipherOp¤   ¤   ¤   ¤   op)
40bb36 {
e2cc26 ¤   UInt32¤ ¤   ¤   ¤   blockIndex;
2cfa79 ¤   const uchar *¤  ¤   curSrc¤ ¤   = (const uchar *)src;
a7be9f ¤   uchar *¤¤   ¤   ¤   curDest¤¤   = (uchar *)dest;
03af5a
515e68 ¤   pgpa((
0b8c48 ¤   ¤   pgpaAddrValid( context, CipherContext),
5ff1e0 ¤   ¤   pgpaAddrValid( src, VoidAlign ),
e16e11 ¤   ¤   pgpaAddrValid( dest, VoidAlign ),
cef135 ¤   ¤   pgpaAssert( numBlocks != 0 )
a3c0fb ¤   ¤   ));
ecaf5a
36b864 ¤   for( blockIndex = 0; blockIndex < numBlocks; blockIndex++)
e7c7a1 ¤   {
90be52 ¤   ¤   ulong¤  seedValue;
5baf5a
a83411 ¤   ¤   seedValue¤  = startBlockIndex + blockIndex;
07af5a
8d3649 ¤   ¤   if ( op == kCipherOp_Decrypt )
12f776 ¤   ¤   ¤   {
1ad2d2 ¤   ¤   ¤   DecryptBlock512( context, seedValue, (const UInt32 *)curSrc,
b8e930 ¤   ¤   ¤   ¤   ¤   (UInt32 *)curDest );
8ca3a6 ¤   ¤   ¤   }
570e1d ¤   ¤   else
76f776 ¤   ¤   ¤   {
bf5192 ¤   ¤   ¤   EncryptBlock512( context, seedValue, (const UInt32 *)curSrc,
dee930 ¤   ¤   ¤   ¤   ¤   (UInt32 *)curDest );
21a3a6 ¤   ¤   ¤   }
92af5a
1d1bcb ¤   ¤   curSrc¤ += kBlockSize;
f780a6 ¤   ¤   curDest¤+= kBlockSize;
a09371 ¤   }
d0efe6 }
74af5a
2daf5a
--2dd5 001eb4b496140120054 Page 4 of PGPDiskEncryptDecrypt.c
3b6d52 ¤   void
756f32 HashBuf( const uchar *buf, ushort length, EncryptedCASTKey *key)
6fbb36 {
d39347 ¤   SHA¤¤   ¤   hash;
19fd0f ¤   SHA::Digest¤hashResult;
dd1b52 ¤   ¤
a73fb4 ¤   pgpAssertAddrValid( buf, uchar );
4062c5 ¤   pgpAssertAddrValid( key, EncryptedCASTKey );
c767c5 ¤
27cb43 ¤   hash.Update(buf, length);
212b67 ¤   hash.Final( &hashResult );
dc67c5 ¤
a1d0ca ¤   BlockMoveData( hashResult.bytes, key->keyBytes, sizeof( key->keyBytes ) );
5befe6 }
4eaf5a
746d52 ¤   void
459c8e SaltPassphrase(
89fe3e ¤   const EncryptedCASTKey¤ *keyin,
194bf4 ¤   EncryptedCASTKey ¤  ¤   *keyout,
8541bc ¤   const PassphraseSalt ¤  *salt,
f40522 ¤   short ¤ ¤   ¤   ¤   ¤   *hashReps)
a2bb36 {
8cf09e ¤   uchar¤  ¤   j;
1a9b60 ¤   short¤  ¤   i, k;
55e5b3 ¤   long¤   ¤   endTicks;
b59347 ¤   SHA¤¤   ¤   hash;
29fd0f ¤   SHA::Digest¤hashResult;
0267c5 ¤
9c7e3a ¤   pgpAssertAddrValid( keyin, EncryptedCASTKey );
a84474 ¤   pgpAssertAddrValid( keyout, EncryptedCASTKey );
9af6ac ¤   pgpAssertAddrValid( salt, uchar );
59aae4 ¤   pgpAssertAddrValid( hashReps, short );
5e67c5 ¤
1b46e9 ¤   hash.Update(salt->saltBytes, sizeof( salt->saltBytes ));
fc2445 ¤   if( *hashReps != 0)
f1c7a1 ¤   {
d61ba1 ¤   ¤   // Hash the passphrase and a rotating byte counter the specified
2ca08b ¤   ¤   // number of times into the hash field with the 8 bytes of salt from
374d0b ¤   ¤   // above in order to form the session key to decrypt the master key.
28af5a
e69bd8 ¤   ¤   k = *hashReps;
6baf5a
0a383b ¤   ¤   for( i = 0, j = 0; i < k; i++, j++ )
255b34 ¤   ¤   {
2cd4ba ¤   ¤   ¤   hash.Update(keyin->keyBytes, sizeof( keyin->keyBytes ) );
a7d164 ¤   ¤   ¤   hash.Update(&j, 1);
540fe4 ¤   ¤   }
469371 ¤   }
ac0e24 ¤   else
00c7a1 ¤   {
4ef817 ¤   ¤   // This is a new disk or we are changing the passphrase. ·We hash the
e128a7 ¤   ¤   // passphrase in with a rotating counter byte an arbitrary number of
ac1171 ¤   ¤   // times based on the processing power of the computer we're running
975343 ¤   ¤   // on up to a maximum of 16000.
d8af5a
7cd190 ¤   ¤   endTicks = LMGetTicks() + 30;
4aadbe ¤   ¤   for( i = 0, j = 0; ( LMGetTicks() < endTicks ) && ( i < 16000 );
691753 ¤   ¤   ¤   ¤   ¤   i++, j++ )
3a5b34 ¤   ¤   {
7cd4ba ¤   ¤   ¤   hash.Update(keyin->keyBytes, sizeof( keyin->keyBytes ) );
19d164 ¤   ¤   ¤   hash.Update(&j, 1);
060fe4 ¤   ¤   }
8e1b52 ¤   ¤
f8bd72 ¤   ¤   *hashReps = i;
579371 ¤   }
b22b67 ¤   hash.Final( &hashResult );
9767c5 ¤
d6dfba ¤   BlockMoveData( hashResult.bytes, keyout->keyBytes,
a052e0 ¤   ¤   ¤   sizeof( keyout->keyBytes ) );
ebefe6 }
--abd3 00179a1670e40120055 Page 1 of PGPDiskEncryptDecrypt.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
7d6651 ¤   $Id: PGPDiskEncryptDecrypt.h,v 1.3.8.1 1998/11/12 03:06:07 heller Exp $
c4f7f7 ____________________________________________________________________________*/
7caf5a
1d7b7d #pragma once
5aaf5a
7a8c21 #include "CipherContext.h"
4d24f1 #include "CipherProc.h"
8eaf5a
da3379 #ifdef __cplusplus
f26dad extern "C" {
7a7454 #endif
a6af5a
a3af5a
6e68b6 void¤   CipherBlocks( const CipherContext *context,
7991b9 ¤   ¤   ¤   ¤   ItemCount startingBlockNumber, ItemCount numBlocks,
e85ad3 ¤   ¤   ¤   ¤   const void *src, void *dest, CipherOp op);
b8af5a
b0fcf9 void¤   HashBuf( const uchar *buf, ushort length, EncryptedCASTKey *key);
871971 void¤   SaltPassphrase(const EncryptedCASTKey *keyin,
2db4e1 ¤   ¤   ¤   ¤   EncryptedCASTKey *keyout,
8396d9 ¤   ¤   ¤   ¤   const PassphraseSalt *salt, short *hashReps );
a5af5a
dfaf5a
563379 #ifdef __cplusplus
37efe6 }
797454 #endif
--15d0 0005813512240120056 Page 1 of PGPDiskFileFormat.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
b25dac ¤   $Id: PGPDiskFileFormat.h,v 1.6.8.1 1998/11/12 03:06:08 heller Exp $
bcf7f7 ____________________________________________________________________________*/
8baf5a
4c7b7d #pragma once
38af5a
80a7a0 #include <limits.h>
b8af5a
c0bbf4 #include "MacFiles.h"
b3d7a9 #include "MacNumerics.h"
33af5a
8eea4b #if PGPDISK_PUBLIC_KEY
e7e82c #include "pgpPubTypes.h"
d07454 #endif
4daf5a
a88c21 #include "CipherContext.h"
eeaf5a
f790fb #pragma options align=mac68k¤   // [
66af5a
e70167 const OSType¤   kPGPDiskHeaderMagic¤¤   ¤   ¤   ¤   = 'PGPD';
daaf5a
6dbb2c const OSType¤   kPGPDiskPrimaryHeaderType¤  ¤   ¤   = 'MAIN';
bf916e const UInt16¤   kPGPDiskPrimaryHeaderMajorVersion ¤ = 2;
3f3fa9 const UInt16¤   kPGPDiskPrimaryHeaderMinorVersion ¤ = 1;
26af5a
61d266 const UInt32¤   kPGPDiskReservedHeaderBlocks¤   = 12;
7897a4 const UInt32¤   kPGPDiskAlternateHeaderBlocks¤  = 1;
4d1f29 const UInt32¤   kPGPDiskAlternateHeaderSize¤¤   =
808ea6 ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskAlternateHeaderBlocks * kDiskBlockSize;
e8af5a
e0233f typedef enum
d9bb36 {
9a45d6 ¤   kInvalidEncryptionAlgorithm¤¤   = 0,
20ddb1 ¤   kCopyDataEncryptionAlgorithm¤   = 1,
36ba84 ¤   kCASTEncryptionAlgorithm¤   ¤   = 2,
4caf5a
69c955 ¤   kDefaultEncryptionAlgorithm¤¤   = kCASTEncryptionAlgorithm,
5380fb ¤   // force size of enum to be 4 bytes
eb373f ¤   kDummyEncryptionAlgorithm ¤ ¤   = ULONG_MAX
3aaf5a
520dcb } PGPDiskEncryptionAlgorithm;
e3af5a
317fbf typedef struct PGPDiskFileHeaderInfo
55bb36 {
66513d ¤   OSType¤ ¤   ¤   headerMagic;¤   ¤   // Always kPGPDiskHeaderMagic
77834c ¤   OSType¤ ¤   ¤   headerType;¤¤   ¤   // kPGPDiskPrimaryHeaderType + ???
cb1b90 ¤   UInt32¤ ¤   ¤   headerSize;¤¤   ¤   // Total size of this header, in bytes.
9a49ad ¤   CRC32¤  ¤   ¤   headerCRC;¤ ¤   ¤   // CRC of this header
fbc12f ¤   UnsignedWide¤   nextHeaderOffset;¤  // Offset to next header from
202e6a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // beginning of file, in bytes
4b804a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // 0 = no additional headers
628660 ¤   ulong¤  ¤   ¤   reserved[ 2 ];
0767c5 ¤
b4bba7 } PGPDiskFileHeaderInfo;
ecaf5a
45cdae typedef struct CheckBytes
12bb36 {
31b34d ¤   uchar¤  theBytes[8];
e7af5a
f03b0a } CheckBytes;
12af5a
782e97 typedef struct PassphraseKey
edbb36 {
8984d4 ¤   // session key encrypted with salted passphrase
ba6cb1 ¤   EncryptedCASTKey¤   encryptedKey;
cd1b52 ¤   ¤
d11aef ¤   // first 8 bytes of encrypted hashed salted user key
acb03b ¤   CheckBytes¤ ¤   ¤   checkBytes;
5867c5 ¤
--ff1e 000b61eafc040120056 Page 2 of PGPDiskFileFormat.h
a2908b ¤   // introduced in v1.1, # of hashes on passphrase
9b9fd6 ¤   short¤  ¤   ¤   ¤   hashReps;
d067c5 ¤
b6b1e0 ¤   UInt16¤ ¤   ¤   ¤   inUse ¤ ¤   : 1;
c24e19 ¤   UInt16¤ ¤   ¤   ¤   readOnly¤   : 1;
c1c72e ¤   UInt16¤ ¤   ¤   ¤   unused : 14;
b254b9 ¤   UInt32¤ ¤   ¤   ¤   unusedLong;
273be9 } PassphraseKey;
82af5a
96191d const ushort¤   kNumPassphrases¤¤   ¤   = 8; // master + 1 thru 7
995948 const ushort¤   kMasterPassphraseIndex¤ = 0;
ceaf5a
abaf5a
d3af5a
0ec716 typedef struct PGPDiskFileHeader
7fbb36 {
1ebc25 ¤   PGPDiskFileHeaderInfo¤  headerInfo;
a8af5a
5c8740 ¤   UInt8¤  ¤   ¤   majorVersion;
28af5e ¤   UInt8¤  ¤   ¤   minorVersion;
48396b ¤   UInt16¤ ¤   ¤   reserved;
16af5a
629a56 ¤   // Total size of the file, in blocks (eof == numFileBlocks * 512)
f66c8a ¤   UInt32¤ ¤   ¤   numFileBlocks;¤ ¤
1aaf5a
160fc8 ¤   // Size of the header data at the beginning of the file, in blocks
cc23b9 ¤   UInt32¤ ¤   ¤   numHeaderBlocks;¤
5eaf5a
6c2ba2 ¤   // Total size of the encrypted data, in blocks
ae6173 ¤   UInt32¤ ¤   ¤   numDataBlocks;¤ ¤
5aa4ab ¤   ·
77ae7a ¤   // encryption method (4 bytes)
023636 ¤   PGPDiskEncryptionAlgorithm ¤algorithm;¤ ¤
f5af5a
e7bc47 ¤   UInt32¤ ¤   ¤   numPassphrases;
5b2a12 ¤   ulong¤  ¤   ¤   reservedLongs[ 15 ];
3f67c5 ¤
e80a46 ¤   // random data used to salt passphrase and IVs
46e432 ¤   PassphraseSalt¤ salt;
8ada4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
29efc4 ¤   // All of the individual passphrase info for one user
529156 ¤   PassphraseKey¤  passphrases[kNumPassphrases];¤
eeaf5a
63373a } PGPDiskFileHeader;
8aaf5a
a8029c #if PGPDISK_PUBLIC_KEY¤ // [
dcaf5a
8cb480 const OSType¤   kPGPDiskPublicKeyHeaderType¤¤   ¤   = 'PKEY';
b3d3eb const OSType¤   kPGPDiskPublicKeyHeaderMajorVersion¤= 1;
69212d const OSType¤   kPGPDiskPublicKeyHeaderMinorVersion¤= 0;
2caf5a
9113bc typedef struct PGPDiskPublicKeyHeader
c8bb36 {
f1bc25 ¤   PGPDiskFileHeaderInfo¤  headerInfo;
d467c5 ¤
f3a601 ¤   UInt8¤  ¤   ¤   ¤   ¤   majorVersion;
5f8e1f ¤   UInt8¤  ¤   ¤   ¤   ¤   minorVersion;
5d4bd0 ¤   UInt16¤ ¤   ¤   ¤   ¤   reserved;
46af5a
7d81ae ¤   UInt32¤ ¤   ¤   ¤   ¤   readOnly ¤  : 1;
6c642c ¤   UInt32¤ ¤   ¤   ¤   ¤   locked ¤¤   : 1;
021367 ¤   UInt32¤ ¤   ¤   ¤   ¤   unused¤ ¤   : 30;
3067c5 ¤
3befd5 ¤   CheckBytes¤ ¤   ¤   ¤   checkBytes;
dc67c5 ¤
308bf4 ¤   UInt32¤ ¤   ¤   ¤   ¤   keyIDOffset;
a4b0c4 ¤   UInt32¤ ¤   ¤   ¤   ¤   keyIDSize;
e167c5 ¤
3c2f7d ¤   UInt32¤ ¤   ¤   ¤   ¤   encryptedKeyOffset;
4671bb ¤   UInt32¤ ¤   ¤   ¤   ¤   encryptedKeySize;
1467c5 ¤
b6ea37 ¤   PGPPublicKeyAlgorithm¤  algorithm;
--7223 00115ee367540120056 Page 3 of PGPDiskFileFormat.h
2a67c5 ¤
af6b5a ¤   UInt32¤ ¤   ¤   ¤   ¤   reserved2[10];
25af5a
2e0172 ¤   // Exported key ID here
bb2c71 ¤   // Encrypted key here.
5e67c5 ¤
6cbd0e } PGPDiskPublicKeyHeader;
d0af5a
4d3872 #endif¤ // ] PGPDISK_PUBLIC_KEY
bbaf5a
6d7682 #pragma options align=reset¤// ]
8faf5a
75af5a
34af5a
15af5a
--d7e9 001ab5ec35640120057 Page 1 of PGPDiskGestalt.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
7ee59d ¤   $Id: PGPDiskGestalt.h,v 1.4.8.1 1998/11/12 03:06:08 heller Exp $
f7f7f7 ____________________________________________________________________________*/
ddaf5a
9f7b7d #pragma once
13af5a
34267f #define¤gestaltPGPDisk¤ ¤   ¤   'pgpD'
7caf5a
f26d4e const OSType¤   kGestaltProcResType¤¤   = 'GEST';
265d56 const short¤¤   kGestaltProcResID¤  ¤   = 1000;
e5af5a
297353 enum
cdbb36 {
1cb270 ¤   uppGestaltInstallProcInfo = kCStackBased
99a6f3 ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(OSStatus)))
bf82f7 };
0daf5a
1fb717 typedef OSStatus¤   (*PGPDiskGestaltInstallProcPtr)(void);
3fea10 typedef void¤   ¤   (*PGPDiskGestaltIdleProcPtr)(void);
7baf5a
f4af5a
36fdb7 #if TARGET_RT_MAC_CFM
b3af5a
aa0885 typedef UniversalProcPtr InstallGestaltUPP;
bbaf5a
f4b12a #define CallGestaltInstallProc(userRoutine)¤¤   \
b8c2a1 ¤   ¤   CallUniversalProc((UniversalProcPtr)(userRoutine), uppCipherProcInfo)
1cdb21 #else
f9af5a
54928c typedef PGPDiskGestaltInstallProcPtr InstallGestaltUPP;
0daf5a
c4bd08 #define CallGestaltInstallProc(userRoutine )¤   ¤   \
f675d2 ¤   ¤   (*(userRoutine))()
2c1b52 ¤   ¤
8f7454 #endif
abaf5a
--7ecb 00152a8b12e40120058 Page 1 of PGPDiskGlobals.c
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
207d6e ¤   $Id: PGPDiskGlobals.c,v 1.2.8.1 1998/11/12 03:06:09 heller Exp $
d4f7f7 ____________________________________________________________________________*/
f5af5a
ad7b7d #pragma once
a5af5a
6ade36 #include "PGPDisk.h"
8349af #include "PGPDiskGlobals.h"
1faf5a
c585ea ¤   OSStatus
a28640 GetPGPDiskGloblalsPtr(PGPDiskGlobals * const *globalsPtr)
88bb36 {
32c412 ¤   OSStatus¤   status;
d367c5 ¤
aad9ab ¤   pgpAssertAddrValid( globalsPtr, PGPDiskGlobals * );
6767c5 ¤
90af30 ¤   status = Gestalt( gestaltPGPDisk, (long *) globalsPtr );
f6dd30 ¤   if( IsntErr( status ) )
2bc7a1 ¤   {
5b7848 ¤   ¤   if( (*globalsPtr)->magic != kPGPDiskGlobalsMagic )
545b34 ¤   ¤   {
f52940 ¤   ¤   ¤   status = kPGPDiskInvalidGlobalsMagicError;
4b0fe4 ¤   ¤   }
9c9371 ¤   }
6c67c5 ¤
bc165b ¤   AssertNoErr( status, "GetPGPDiskGloblalsPtr" );
65af5a
174afd ¤   return( status );
52be43 }¶
--cda5 0010685d56940120059 Page 1 of PGPDiskGlobals.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
db09a2 ¤   $Id: PGPDiskGlobals.h,v 1.2.8.1 1998/11/12 03:06:10 heller Exp $
cbf7f7 ____________________________________________________________________________*/
49af5a
bf7b7d #pragma once
6baf5a
6ec50f #include "PGPDiskGestalt.h"
ebaf5a
5b0838 const OSType¤   kPGPDiskGlobalsMagic¤   = 'PGPG';
9aec9b const UInt32¤   kPGPDiskGlobalsVersion¤ = 1;
04af5a
f1af46 #pragma options align=mac68k
a2af5a
5a8f67 typedef struct PGPDiskGlobals
5cbb36 {
588e3c ¤   OSType¤ ¤   ¤   ¤   ¤   ¤   magic;
0c4184 ¤   UInt32¤ ¤   ¤   ¤   ¤   ¤   globalsVersion;
69b0be ¤   PGPDiskGestaltIdleProcPtr¤  idleProc;
f1af5a
dfd0c9 } PGPDiskGlobals;
37af5a
337c46 #pragma options align=reset
3caf5a
9c03cc // Function takes a pointer to a const PGPDiskGlobals *
06c374 OSStatus¤   GetPGPDiskGloblalsPtr(PGPDiskGlobals * const *globalsPtr);¶
--ba92 0010f5c54bf4012005a Page 1 of PGPDiskPatches.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
c3df42 ¤   $Id: PGPDiskPatches.h,v 1.2.8.1 1998/11/12 03:06:10 heller Exp $
85f7f7 ____________________________________________________________________________*/
81af5a
807b7d #pragma once
43af5a
b352f9 const OSType¤   kPatchesProcResType¤¤   = 'PACH';
16f8a4 const short¤¤   kPatchesProcResID¤  ¤   = 1000;
c3af5a
0f93c9 typedef OSStatus (*PGPDiskPatchesProcPtr)(Boolean *patchesInstalledResultPtr);
--b9d4 000629de6fa4012005b Page 1 of PGPDiskResources.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
70a31f ¤   $Id: PGPDiskResources.h,v 1.8.8.1 1998/11/12 03:06:11 heller Exp $
0cf7f7 ____________________________________________________________________________*/
8caf5a
ed7b7d #pragma once
62af5a
027b01 const short¤¤   kPGPDiskVolumeIconResID¤¤   = 1000;
4caf5a
29c723 const short¤¤   kMountPGPDiskDialogResID¤   = 4000;
3faf5a
daf857 const short¤¤   kDialogStringListResID¤ ¤   = 1000;
aeb2a4 const short¤¤   kErrorStringListResID¤  ¤   = 1001;
a8ce26 const short¤¤   kMiscStringsListResID¤  ¤   = 1002;
07af5a
e2a396 enum¤   // kDialogStringListResID
73bb36 {
862fb4 ¤   kNewPGPDiskPromptStrIndex¤  = 1,
213553 ¤   kNewPGPDiskFileNameStrIndex,
dacf99 ¤   kAvailableFreeSpaceMegabytesFormatStrIndex,
a10886 ¤   kAvailableFreeSpaceKilobytesFormatStrIndex,
82b73b ¤   kMegabytesSizeStrIndex,
8cbf90 ¤   kKilobytesSizeStrIndex,
df0e2c ¤   kGetPassphraseDialogPromptStrIndex,
cbe958 ¤   kSetPassphraseDialogPromptStrIndex,
b38e87 ¤   kOldPassphraseDialogPromptStrIndex,
fee18a ¤   kRemovePassphraseDialogPromptStrIndex,
8b7cfb ¤   kMasterPassphraseDialogPromptStrIndex,
29aa78 ¤   kNewPassphraseDialogPromptStrIndex,
585713 ¤   kAddPassphraseDialogPromptStrIndex,
fbc6ff ¤   kPassphraseAddedSuccessfullyStrIndex,
b424a4 ¤   kPassphraseChangedSuccessfullyStrIndex,
7dd571 ¤   kPassphraseRemovedSuccessfullyStrIndex,
47d543 ¤   kAltPassphrasesRemovedSuccessfullyStrIndex,
d12aef ¤   kReadOnlyCheckboxTitleStrIndex,
1fd5db ¤   kReadOnlyCheckboxDescStrIndex
2f82f7 };
e3af5a
824f18 enum¤   // kErrorStringListResID
a8bb36 {
529686 ¤   kPassphraseToShortStrIndex¤ ¤   = 1,
51c5b0 ¤   kPassphrasesMustMatchStrIndex,
810487 ¤   kPGPDiskMustBeLargerThanXStrIndex,
cfbd24 ¤   kPGPDiskMustBeSmallerThanXStrIndex,
760927 ¤   kSizeExceedsFreeSpaceStrIndex,
2f1508 ¤   kPGPDisksMustBeOnLocalVolumeStrIndex,
06ce2c ¤   kAnErrorOccurredStrIndex,
3008d8 ¤   kCouldNotCreateDiskBecauseStrIndex,
f49769 ¤   kCouldNotMountDiskBecauseStrIndex,
0790c5 ¤   kCouldNotAddPassphraseBecauseStrIndex,
991d1a ¤   kCouldNotChangePassphraseBecauseStrIndex,
365ddd ¤   kCouldNotRemovePassphraseBecauseStrIndex,
792453 ¤   kCouldNotRemoveAltPassphrasesBecauseStrIndex,
000dee ¤   kCouldNotAddPublicKeysBecauseStrIndex,
63c0f6 ¤   kCouldNotRemovePublicKeysBecauseStrIndex,
1ea867 ¤   kNotAValidPGPDiskFileStrIndex,
48b47b ¤   kPGPDiskFileCreatedByNewerVersionStrIndex,
b117a1 ¤   kVolumeRemoteOrForeignStrIndex,
726d57 ¤   kIncorrectPassphraseStrIndex,
eabb31 ¤   kIncorrectPassphraseNoKeyringStrIndex,
d16818 ¤   kIncorrectPassphraseKeyNotFoundStrIndex,
a05d8a ¤   kMasterPassphraseStrIndex,
06c25f ¤   kPGPDiskFileMountedStrIndex,
1e5ded ¤   kPGPDiskFileBusyStrIndex,
89a97a ¤   kPGPDiskFileLockedStrIndex,
a0b5e1 ¤   kPGPDiskFileIsOnLockedVolumeStrIndex,
0432a3 ¤   kPGPDiskMaxPassphrasesAddedStrIndex,
ddc396 ¤   kCastSBoxesDamagedStrIndex,
c3ae3d ¤   kVersionObsoleteStrIndex,
625d1d ¤   kCantReplaceLockedOrBusyFileStrIndex,
--9f42 0011f0715034012005b Page 2 of PGPDiskResources.h
c1c11a ¤   kConfirmReplacePGPDiskFileStrIndex,
4fd1e9 ¤   kQueryAllowUnmountedVolumeStrIndex,
d3e7cd ¤   kConfirmAllowUnmountedVolumeStrIndex,
e66d94 ¤   kDiskSizeMustBeIntegralStrIndex,
297f0c ¤   kPGPdiskADKNotFoundStrIndex
a782f7 };
e6af5a
2b1742 enum¤   // kMiscStringsListResID
70bb36 {
060777 ¤   kPreferencesFilenameStrIndex = 1,
66c25f ¤   kRemovePassphraseMenuItemStrIndex,
8ebdf0 ¤   kRemoveAltPassphrasesMenuItemStrIndex,
54ab41 ¤   kPGPWebSiteURLStrIndex,
786c20 ¤   kAboutCreditsButtonTitleStrIndex,
dc4670 ¤   kAboutInfoButtonTitleStrIndex,
b8ae45 ¤   kDoneButtonTitleStrIndex
dd82f7 };
1faf5a
--ba97 0013bca9e984012005c Page 1 of PGPDiskShared.prefix
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
b56156 ¤   $Id: PGPDiskShared.prefix,v 1.11.2.1.2.1 1998/11/12 03:06:12 heller Exp $
13f7f7 ____________________________________________________________________________*/
60af5a
0e3b40 // unfortunate, but needed
7acc17 #ifndef __ansi_prefix__
a8824c ¤   #define MSL_USE_PRECOMPILED_HEADERS¤0
028a5f ¤   #include <ansi_prefix.mac.h>
0a7454 #endif
c6af5a
bc3fe2 #define PGPDISK_PUBLIC_KEY¤ 1
0baf5a
54bfb2 #if __MC68K__ && ! __CFM68K__ && PGPDISK_PUBLIC_KEY
a1331a ¤   // Straight 68K builds cannot use the SDK.
89c7d3 ¤   #undef PGPDISK_PUBLIC_KEY
fb1132 ¤   #define PGPDISK_PUBLIC_KEY¤ 0
107454 #endif
38af5a
c9c518 #define USE_PGP_OPERATOR_NEW¤   1
1a849a #define PGP_MACINTOSH¤  ¤   ¤   1
ecfc11 #define PGPDISK_STANDALONE¤ ¤   (! PGPDISK_PUBLIC_KEY)
a9af5a
62c3d4 #if PGPDISK_PUBLIC_KEY¤ /* [ */
9daf5a
9796be #include "PGPBuildFlags.h"
85e2ff #include "pgpConfig.h"
41af5a
218784 #else¤  /* ] PGPDISK_PUBLIC_KEY [ */
7caf5a
e1ab39 #define BETA¤   ¤   ¤   ¤   ¤   1
f7af5a
f6813c #endif¤ /* ] PGPDISK_PUBLIC_KEY */
a9af5a
c794a0 #include "pgpLeaks.h"
d046ad #include "MacDebug.h"
5caf5a
30a5b9 #define¤INSTALL_PATCHES¤¤   1
91af5a
64af5a
c49ea8 #if ! powerc
eeaf5a
3eed8c #if ! __option(fourbyteints)
01372c ints are not 4 bytes
28372c ints are not 4 bytes
757454 #endif
daaf5a
397454 #endif
46af5a
b98fd3 #if ! PGPDISK_PUBLIC_KEY
134cd0 ¤   #undef PGP_FREEWARE
6462d9 ¤   #undef PGP_BUSINESS_SECURITY
7876b3 ¤   #undef PGP_PERSONAL_PRIVACY
3b2841 #endif¶
--a251 000c025ff014012005d Page 1 of PGPDiskUtils.c
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
ca60a9 ¤   $Id: PGPDiskUtils.c,v 1.28.8.1 1998/11/12 03:06:12 heller Exp $
59f7f7 ____________________________________________________________________________*/
9faf5a
74d332 #include <Finder.h>
0184be #include <Sound.h>
b7b935 #include <Timer.h>
334293 #include <FSM.h>
d07c7a #include <Icons.h>
94cb2f #include <Math64.h>
fdd92d #include <stdarg.h>
46feb2 #include <stdio.h>
814d37 #include <LowMem.h>
113c1e #include "randpool.h"
5c24f1 #include "CipherProc.h"
f2fca8 #include "fp.h"
b4af5a
e1dd56 #include <PP_Messages.h>
87afac #include <UModalDialogs.h>
8959c5 #include "CPGPStDialogHandler.h"
5caf5a
1e76b7 #include "MacErrors.h"
6f090b #include "MacEvents.h"
3bbbf4 #include "MacFiles.h"
6585f6 #include "UInt64.h"
4e6915 #include "MacResources.h"
1485c2 #include "MacStrings.h"
0fbf4a #include "MacSecureMemory.h"
1275a9 #include "MacDriverUtils.h"
d8c110 #include "pgpMacMemory.h"
52af5a
0cbdd3 #include "PGPDiskBeta.h"
723175 #include "PGPDiskEncryptDecrypt.h"
35546f #include "PGPDiskFile.h"
75c50f #include "PGPDiskGestalt.h"
518ec6 #include "PGPDiskPreferences.h"
5a0927 #include "PGPDiskResources.h"
09e5dd #include "PGPDiskUtils.h"
99af5a
3d9dc2 #include "CWarningAlert.h"
d6bdd8 #include "AddDriveStruct.h"
dd5b1c #include "CTuner.h"
6075a9 #include "MacDriverUtils.h"
c7af5a
30ea4b #if PGPDISK_PUBLIC_KEY
21e8b2 #include "pflPrefs.h"
524720 #include "pflPrefTypes.h"
e63991 #include "pgpAdminPrefs.h"
16628e #include "pgpClientErrors.h"
d02f8d #include "pgpErrors.h"
f24919 #include "pgpUtilities.h"
31b397 #include "PGPOpenPrefs.h"
d37454 #endif
47af5a
d3ce33 #define MIN(a,b)¤   ¤   ( (a) <= (b) ? (a) : (b) )
a3af5a
f2af5a
127f04 short¤  ¤   ¤   gApplicationResFile;
4daf5a
65af5a
2085ea ¤   OSStatus
987aa1 CheckForLocalPGPDiskVolume(short vRefNum)
8cbb36 {
ba156f ¤   OSStatus¤   ¤   err;
709816 ¤   HParamBlockRec¤ pb;
e9e0aa ¤   Str255¤ ¤   ¤   volumeName;
9367c5 ¤
2cde75 ¤   pgpClearMemory( &pb, sizeof( pb ) );
c067c5 ¤
--24b8 000ccb057c34012005d Page 2 of PGPDiskUtils.c
7245af ¤   pb.volumeParam.ioNamePtr = volumeName;
ec33df ¤   pb.volumeParam.ioVRefNum = vRefNum;
8f67c5 ¤
a7c0f5 ¤   err = PBHGetVInfoSync( &pb );
bdee03 ¤   if( IsntErr( err ) )
3c2ef1 ¤   {¤
a887be ¤   ¤   if( pb.volumeParam.ioVFSID != 0 )
075b34 ¤   ¤   {
e60b37 ¤   ¤   ¤   GetVolParmsInfoBuffer¤  volParms;
9b87c7 ¤   ¤   ¤
0e8a50 ¤   ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
f1474c ¤   ¤   ¤   pgpClearMemory( &volParms, sizeof( volParms ) );
051b52 ¤   ¤
b241f3 ¤   ¤   ¤   pb.volumeParam.ioNamePtr ¤  = volumeName;
6ab1c5 ¤   ¤   ¤   pb.volumeParam.ioVRefNum ¤  = vRefNum;
e1ceb4 ¤   ¤   ¤   pb.ioParam.ioBuffer ¤   ¤   = (Ptr) &volParms;
975746 ¤   ¤   ¤   pb.ioParam.ioReqCount ¤ ¤   = sizeof( volParms );
cb87c7 ¤   ¤   ¤
62f93e ¤   ¤   ¤   err = PBHGetVolParmsSync( &pb );
756108 ¤   ¤   ¤   if( IsntErr( err ) )
49f776 ¤   ¤   ¤   {
c00727 ¤   ¤   ¤   ¤   if( volParms.vMServerAdr != 0 )
5872c3 ¤   ¤   ¤   ¤   {
a2190c ¤   ¤   ¤   ¤   ¤   err = kPGPDiskRemoteVolumeTypeError;
3e2613 ¤   ¤   ¤   ¤   }
bdfa07 ¤   ¤   ¤   ¤   else
f172c3 ¤   ¤   ¤   ¤   {
187284 ¤   ¤   ¤   ¤   ¤   err = kPGPDiskForeignVolumeTypeError;
882613 ¤   ¤   ¤   ¤   }
e4a3a6 ¤   ¤   ¤   }
230fe4 ¤   ¤   }
640e1d ¤   ¤   else
1f5b34 ¤   ¤   {
915deb ¤   ¤   ¤   long¤   ¤   ¤   result;
56992e ¤   ¤   ¤   const OSType¤   kMAEGestaltSelector¤= 'cith';
f387c7 ¤   ¤   ¤
1c7aad ¤   ¤   ¤   /*
ef2bbc ¤   ¤   ¤   ¤   From (Byron Han):
f37f6a ¤   ¤   ¤   ¤   check the fsID of the disk you are saving the PGPdisk on.
3576eb ¤   ¤   ¤   ¤   if it is zero (for standard MacOS HFS disk), you need to
947908 ¤   ¤   ¤   ¤   check for MAE. to check for MAE, see if gestalt selector
c00756 ¤   ¤   ¤   ¤   'cith' is implemented. if it is, the fsID (returned from
b439f0 ¤   ¤   ¤   ¤   PBHGetVInfo) may be a lie! ·you need to check if the fsID
29226a ¤   ¤   ¤   ¤   is 0x0017 in the VCB. ·0x0017 is the file system ID used for
8e6d79 ¤   ¤   ¤   ¤   MAE's boot disk. ·If you detect that this is the case, you
f393b8 ¤   ¤   ¤   ¤   cannot mount a disk image on this type of volume.
363da8 ¤   ¤   ¤   */
719aed ¤   ¤   ¤   if ( Gestalt( kMAEGestaltSelector, &result ) == noErr )
caf776 ¤   ¤   ¤   {
f14098 ¤   ¤   ¤   ¤   if ( GetVCBForVolume( vRefNum )->vcbFSID == 0x0017 )
8272c3 ¤   ¤   ¤   ¤   {
c77284 ¤   ¤   ¤   ¤   ¤   err = kPGPDiskForeignVolumeTypeError;
5e2613 ¤   ¤   ¤   ¤   }
2fa3a6 ¤   ¤   ¤   }
4987c7 ¤   ¤   ¤
d16108 ¤   ¤   ¤   if( IsntErr( err ) )
f9f776 ¤   ¤   ¤   {
951924 ¤   ¤   ¤   ¤   const VCB¤  *vcb;
5b2b85 ¤   ¤   ¤   ¤
088f22 ¤   ¤   ¤   ¤   /* Check for HFS/HFS Plus. */
092b85 ¤   ¤   ¤   ¤
ed9d53 ¤   ¤   ¤   ¤   vcb¤= GetVCBForVolume( vRefNum );
e5c5e2 ¤   ¤   ¤   ¤   if( IsntNull( vcb ) )
3172c3 ¤   ¤   ¤   ¤   {
9659a1 ¤   ¤   ¤   ¤   ¤   if( vcb->vcbSigWord != kHFSVolumeSignature &&
279634 ¤   ¤   ¤   ¤   ¤   ¤   vcb->vcbSigWord != kHFSPlusVolumeSignature )
144859 ¤   ¤   ¤   ¤   ¤   {
6c9084 ¤   ¤   ¤   ¤   ¤   ¤   err = kPGPDiskForeignVolumeTypeError;
ac1c89 ¤   ¤   ¤   ¤   ¤   }
712613 ¤   ¤   ¤   ¤   }
5ea3a6 ¤   ¤   ¤   }
cc0fe4 ¤   ¤   }
--42fa 000d60d9d2a4012005d Page 3 of PGPDiskUtils.c
a19371 ¤   }
9967c5 ¤
c7deb7 ¤   return( err );
6aefe6 }
baaf5a
d37e69 ¤   Boolean
1c0a1b IsPGPDiskFileType(OSType fileCreator, OSType fileType)
29bb36 {
7d2546 ¤   return( fileCreator == kPGPDiskFileCreator &&·
d36008 ¤   ¤   ¤   fileType == kPGPDiskFileType );
60efe6 }
52af5a
d42811 /*___________________________________________________________________________
cc83d6 ¤   Checks to see if the the passed in file spec is a mounted PGP Disk file.
dbc988 ___________________________________________________________________________*/
a9af5a
b1cd8d ¤   static Boolean
38c50a IsPGPDiskFileInUseByDriver(const FSSpec *fileSpec, short *driveNumber)
c2bb36 {
f46b9d ¤   OSStatus¤   ¤   err = noErr;
7b8d80 ¤   ushort¤ ¤   ¤   numDrives;
351b2e ¤   const ushort¤   kMaxDrives¤ = 200;
a27d56 ¤   short¤  ¤   ¤   driveNumbers[ kMaxDrives ];
5a090a ¤   Boolean¤¤   ¤   inUse;
8767c5 ¤
50a9c5 ¤   AssertSpecIsValid( fileSpec, "IsPGPDiskFileMounted" );
43158c ¤   pgpAssertAddrValid( driveNumber, short );
e6af5a
93feac ¤   *driveNumber ¤  = 0;
6c69ad ¤   inUse¤  ¤   ¤   = FALSE;
f167c5 ¤
d12863 ¤   GetAllPGPDrives( driveNumbers, kMaxDrives, &numDrives );
20af5a
2eae64 ¤   for( ushort driveIndex = 0; driveIndex < numDrives; ++driveIndex )
e0c7a1 ¤   {
582a46 ¤   ¤   PGPDriveInfoStruct¤ info;
501b52 ¤   ¤
89441f ¤   ¤   err = GetPGPDriveInfo( driveNumbers[driveIndex], &info );
ddda5e ¤   ¤   if( IsntErr( err ) )
dc5b34 ¤   ¤   {
9c3748 ¤   ¤   ¤   FSSpec¤ checkFileSpec;
af87c7 ¤   ¤   ¤
44135e ¤   ¤   ¤   err = GetSpecFromRefNum( info.fileRefNum, &checkFileSpec );
9f6108 ¤   ¤   ¤   if( IsntErr( err ) )
17f776 ¤   ¤   ¤   {
435724 ¤   ¤   ¤   ¤   if( FSpEqual( fileSpec, &checkFileSpec ) )
d172c3 ¤   ¤   ¤   ¤   {
ff82b6 ¤   ¤   ¤   ¤   ¤   inUse ¤ ¤   ¤   = TRUE;
cb12a6 ¤   ¤   ¤   ¤   ¤   *driveNumber¤   = driveNumbers[driveIndex];
fdaf5a
5414c3 ¤   ¤   ¤   ¤   ¤   break;
462613 ¤   ¤   ¤   ¤   }
e3a3a6 ¤   ¤   ¤   }
f60fe4 ¤   ¤   }
f00e1d ¤   ¤   else
fb5b34 ¤   ¤   {
a26924 ¤   ¤   ¤   pgpAssert( "IsPGPDiskFileMounted: Error getting drive info" );
b60fe4 ¤   ¤   }
469371 ¤   }
1867c5 ¤
5f248e ¤   return( inUse );
b5efe6 }
7faf5a
8b85ea ¤   OSStatus
c96b8b GetPGPDiskFileInfo(
7a1694 ¤   const FSSpec ¤  ¤   *fileSpec,
a3f05a ¤   PGPDiskFileInfo¤¤   *fileInfo)
2abb36 {
f0dc42 ¤   OSStatus¤   err;
614f27 ¤   CInfoPBRec¤ cpb;
f967c5 ¤
d6a8bb ¤   AssertSpecIsValid( fileSpec, "GetPGPDiskFileInfo" );
--7502 00086710b874012005d Page 4 of PGPDiskUtils.c
45f1b6 ¤   pgpAssertAddrValid( fileInfo, PGPDiskFileInfo );
3767c5 ¤
0e64d7 ¤   pgpClearMemory( fileInfo, sizeof( *fileInfo ) );
bf67c5 ¤
939172 ¤   err = FSpGetCatInfo( fileSpec, &cpb );
8eee03 ¤   if( IsntErr( err ) )
eec7a1 ¤   {
bbf57d ¤   ¤   if( cpbIsFile( &cpb ) )
885b34 ¤   ¤   {
2d3a40 ¤   ¤   ¤   err = CheckForLocalPGPDiskVolume( fileSpec->vRefNum );
2f6108 ¤   ¤   ¤   if( IsntErr( err ) )
09f776 ¤   ¤   ¤   {
ff493d ¤   ¤   ¤   ¤   if( IsPGPDiskFileType( cpbFileCreator( &cpb ),
f62ac4 ¤   ¤   ¤   ¤   ¤   ¤   cpbFileType( &cpb ) ) )
5f72c3 ¤   ¤   ¤   ¤   {
6b8d84 ¤   ¤   ¤   ¤   ¤   HParamBlockRec¤ pb;
9c3e35 ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   ¤   volumeName;
0eae30 ¤   ¤   ¤   ¤   ¤
13045f ¤   ¤   ¤   ¤   ¤   if( ( cpbAttributes( &cpb ) &
80c5af ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kFileAttributeFileOpenMask ) != 0 )
8f4859 ¤   ¤   ¤   ¤   ¤   {
17c626 ¤   ¤   ¤   ¤   ¤   ¤   fileInfo->fileIsOpen = TRUE;
c29c7e ¤   ¤   ¤   ¤   ¤   ¤   fileInfo->fileIsInUseByDriver =
6b81b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   IsPGPDiskFileInUseByDriver( fileSpec,
7901b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fileInfo->fileDriveNumber );
5194aa ¤   ¤   ¤   ¤   ¤   ¤
9b8355 ¤   ¤   ¤   ¤   ¤   ¤   if( fileInfo->fileIsInUseByDriver )
718fec ¤   ¤   ¤   ¤   ¤   ¤   {
647998 ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileInfo->fileIsMounted =
42b694 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   IsntNull( GetVCBForDrive(
b88370 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileInfo->fileDriveNumber ) );
3bdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
bd1c89 ¤   ¤   ¤   ¤   ¤   }
cbae30 ¤   ¤   ¤   ¤   ¤
4c045f ¤   ¤   ¤   ¤   ¤   if( ( cpbAttributes( &cpb ) &
ddfc30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kFileAttributeFileLockedMask ) != 0 )
244859 ¤   ¤   ¤   ¤   ¤   {
0487ba ¤   ¤   ¤   ¤   ¤   ¤   fileInfo->fileIsLocked = TRUE;
7e1c89 ¤   ¤   ¤   ¤   ¤   }
85ae30 ¤   ¤   ¤   ¤   ¤
dcb678 ¤   ¤   ¤   ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
1eae30 ¤   ¤   ¤   ¤   ¤
141a99 ¤   ¤   ¤   ¤   ¤   pb.volumeParam.ioNamePtr = volumeName;
2edbc4 ¤   ¤   ¤   ¤   ¤   pb.volumeParam.ioVRefNum = fileSpec->vRefNum;
dcae30 ¤   ¤   ¤   ¤   ¤
356593 ¤   ¤   ¤   ¤   ¤   err = PBHGetVInfoSync( &pb );
f0598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
8655b9 ¤   ¤   ¤   ¤   ¤   {¤
e57672 ¤   ¤   ¤   ¤   ¤   ¤   if( ( pb.volumeParam.ioVAtrb &
119ec0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kVolumeAttributeLockMask ) != 0 )
158fec ¤   ¤   ¤   ¤   ¤   ¤   {
4682da ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileInfo->fileIsOnLockedVolume = TRUE;
a9db3c ¤   ¤   ¤   ¤   ¤   ¤   }
f31c89 ¤   ¤   ¤   ¤   ¤   }
9b2613 ¤   ¤   ¤   ¤   }
22fa07 ¤   ¤   ¤   ¤   else
7c72c3 ¤   ¤   ¤   ¤   {
4652d8 ¤   ¤   ¤   ¤   ¤   err = kPGPDiskUnknownFileKindError;
172613 ¤   ¤   ¤   ¤   }
77a3a6 ¤   ¤   ¤   }
be0fe4 ¤   ¤   }
bc0e1d ¤   ¤   else
435b34 ¤   ¤   {
c0cdd9 ¤   ¤   ¤   pgpDebugMsg( "GetPGPDiskFileInfo: Spec is not a file" );
e899f1 ¤   ¤   ¤   err = notAFileErr;
700fe4 ¤   ¤   }
879371 ¤   }
1367c5 ¤
8bdeb7 ¤   return( err );
d2efe6 }
27af5a
862811 /*___________________________________________________________________________
--c6ac 00082a16edc4012005d Page 5 of PGPDiskUtils.c
83f162 ¤   Change a passphrase, providing that it matches
adc988 ___________________________________________________________________________*/
a5af5a
7c85ea ¤   OSStatus
8681aa ChangePassphrase(
583a92 ·¤  const FSSpec ¤  *fileSpec,
49026d ·¤  const uchar ¤   *oldPassphrase,
c7f151 ·¤  const uchar ¤   *newPassphrase)
93bb36 {
89156f ¤   OSStatus¤   ¤   err;
7f1827 ¤   PGPDiskFileRef¤ diskFileRef;
2467c5 ¤
943dc7 ¤   AssertSpecIsValid( fileSpec, "ChangePassphrase" );
6b67b9 ¤   pgpAssertAddrValid( oldPassphrase, uchar );
57edb4 ¤   pgpAssertAddrValid( newPassphrase, uchar );
5e67c5 ¤
7bcca6 ¤   err = OpenPGPDiskFile( fileSpec, &diskFileRef );
adee03 ¤   if( IsntErr( err ) )
bac7a1 ¤   {
6bc81b ¤   ¤   PGPDiskKeyRef¤  keyRef;
e91b52 ¤   ¤
e6ffd6 ¤   ¤   err = FindPassphrasePGPDiskKey( diskFileRef, oldPassphrase, &keyRef );
beda5e ¤   ¤   if( IsntErr( err ) )
be5b34 ¤   ¤   {
febbcd ¤   ¤   ¤   err = ChangePGPDiskKeyPassphrase( keyRef, oldPassphrase,
133ec5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newPassphrase );
c96108 ¤   ¤   ¤   if( IsntErr( err ) )
40f776 ¤   ¤   ¤   {
40299f ¤   ¤   ¤   ¤   err = SavePGPDiskFile( diskFileRef );
daa3a6 ¤   ¤   ¤   }
e787c7 ¤   ¤   ¤
55fd53 ¤   ¤   ¤   DisposePGPDiskKey( keyRef );
7e0fe4 ¤   ¤   }
ef67c5 ¤
f3aa8b ¤   ¤   ClosePGPDiskFile( diskFileRef );
379371 ¤   }
0e67c5 ¤
97deb7 ¤   return( err );
bbefe6 }
4baf5a
a32811 /*___________________________________________________________________________
1f3b76 ¤   Verify a passphrase is valid
68c988 ___________________________________________________________________________*/
7b85ea ¤   OSStatus
f070ae VerifyPassphrase(
0bc449 ¤   const FSSpec¤   ¤   *fileSpec,
4a7e2c ¤   ConstStr255Param¤   passphrase )
8cbb36 {
aa156f ¤   OSStatus¤   ¤   err;
0e1827 ¤   PGPDiskFileRef¤ diskFileRef;
b767c5 ¤
14cca6 ¤   err = OpenPGPDiskFile( fileSpec, &diskFileRef );
2bee03 ¤   if( IsntErr( err ) )
d0c7a1 ¤   {
cec81b ¤   ¤   PGPDiskKeyRef¤  keyRef;
ae1b52 ¤   ¤
ab8489 ¤   ¤   err = FindPassphrasePGPDiskKey( diskFileRef, passphrase, &keyRef );
fada5e ¤   ¤   if( IsntErr( err ) )
4a5b34 ¤   ¤   {
9b035f ¤   ¤   ¤   // Finding it is sufficient to verify the passphrase
4cfd53 ¤   ¤   ¤   DisposePGPDiskKey( keyRef );
540fe4 ¤   ¤   }
9667c5 ¤
b9aa8b ¤   ¤   ClosePGPDiskFile( diskFileRef );
f99371 ¤   }
1467c5 ¤
bddeb7 ¤   return( err );
97efe6 }
9daf5a
f3af5a
3aaf5a
822811 /*___________________________________________________________________________
--481c 0001d043eb94012005d Page 6 of PGPDiskUtils.c
74c678 ¤   Verify that a passphrase is the master passphrase
eec988 ___________________________________________________________________________*/
c4af5a
c185ea ¤   OSStatus
4fe540 VerifyMasterPassphrase(
91c449 ¤   const FSSpec¤   ¤   *fileSpec,
507e2c ¤   ConstStr255Param¤   passphrase )
cdbb36 {
52156f ¤   OSStatus¤   ¤   err;
a31827 ¤   PGPDiskFileRef¤ diskFileRef;
7c67c5 ¤
34cca6 ¤   err = OpenPGPDiskFile( fileSpec, &diskFileRef );
99ee03 ¤   if( IsntErr( err ) )
dcc7a1 ¤   {
68c81b ¤   ¤   PGPDiskKeyRef¤  keyRef;
fb1b52 ¤   ¤
ca357f ¤   ¤   err = GetMasterPGPDiskKey( diskFileRef, &keyRef );
2ada5e ¤   ¤   if( IsntErr( err ) )
8b5b34 ¤   ¤   {
05cbd7 ¤   ¤   ¤   err = VerifyPGPDiskKeyPassphrase( keyRef, passphrase );
2887c7 ¤   ¤   ¤
78fd53 ¤   ¤   ¤   DisposePGPDiskKey( keyRef );
ab0fe4 ¤   ¤   }
3d67c5 ¤
00aa8b ¤   ¤   ClosePGPDiskFile( diskFileRef );
a49371 ¤   }
e267c5 ¤
4cdeb7 ¤   return( err );
54efe6 }
46af5a
e82811 /*___________________________________________________________________________
838319 ¤   Copy the custom icons to the drive if not already there.
c1c988 ___________________________________________________________________________*/
302473 ¤   static OSStatus
90a8a2 CopyCustomVolumeIconToDrive(short driveNumber)
7dbb36 {
02156f ¤   OSStatus¤   ¤   err;
859816 ¤   HParamBlockRec¤ pb;
39e0aa ¤   Str255¤ ¤   ¤   volumeName;
4a67c5 ¤
dede75 ¤   pgpClearMemory( &pb, sizeof( pb ) );
47af5a
7627b9 ¤   // Call PBHGetVInfo to turn our drive number into a vRefNum.
f267c5 ¤
8d3771 ¤   pb.volumeParam.ioVRefNum¤   = driveNumber;
84d058 ¤   pb.volumeParam.ioNamePtr¤   = volumeName;
2d67c5 ¤
e7c0f5 ¤   err = PBHGetVInfoSync( &pb );
f4162f ¤   AssertNoErr( err, nil );
2c67c5 ¤
3cee03 ¤   if( IsntErr( err ) )
ccc7a1 ¤   {
2d6e19 ¤   ¤   FSSpec¤ ¤   iconFileSpec;
71617b ¤   ¤   short¤  ¤   iconFileRef;
ddc115 ¤   ¤   short¤  ¤   saveResFile;
77fef6 ¤   ¤   CInfoPBRec¤ cpb;
551b52 ¤   ¤
8f31ea ¤   ¤   saveResFile = CurResFile();
d41b52 ¤   ¤
e171bc ¤   ¤   iconFileSpec.vRefNum¤   = pb.volumeParam.ioVRefNum;
bb930f ¤   ¤   iconFileSpec.parID¤ ¤   = fsRtDirID;
1e1b52 ¤   ¤
c086c7 ¤   ¤   CopyPString( "\pIcon\r", iconFileSpec.name );
551b52 ¤   ¤
e20d8f ¤   ¤   err¤= FSpGetCatInfo( &iconFileSpec, &cpb );
36da5e ¤   ¤   if( IsntErr( err ) )
a65b34 ¤   ¤   {
6495b0 ¤   ¤   ¤   // The custom icon file may be empty. Blow it away if the length
864048 ¤   ¤   ¤   // of the resource fork iz zero. Mac OS 8.1 appears to leave empty
11bedc ¤   ¤   ¤   // files instead of deleting them
d287c7 ¤   ¤   ¤
1de8f3 ¤   ¤   ¤   if( cpbResForkSize( &cpb ) == 0 )
--8348 000c464a8974012005d Page 7 of PGPDiskUtils.c
0b7aba ¤   ¤   ¤   ¤   (void) FSpDelete( &iconFileSpec );
f02b85 ¤   ¤   ¤   ¤
dd3440 ¤   ¤   ¤   err = FSpGetCatInfo( &iconFileSpec, &cpb );
2f0fe4 ¤   ¤   }
871b52 ¤   ¤
368cf4 ¤   ¤   if ( IsErr( err ) )
535b34 ¤   ¤   {
0324cd ¤   ¤   ¤   // icon file does not yet exist, so create one
cd87c7 ¤   ¤   ¤
dc2be1 ¤   ¤   ¤   // The system creates custom icon files with no type and creator.
d2a8c7 ¤   ¤   ¤   // So shall we
c27d29 ¤   ¤   ¤   FSpCreateResFile( &iconFileSpec, 0, 0, smSystemScript );
9a87c7 ¤   ¤   ¤
c14c05 ¤   ¤   ¤   iconFileRef = FSpOpenResFile( &iconFileSpec, fsRdWrPerm );
46b83e ¤   ¤   ¤   if( iconFileRef > 0 )
dcf776 ¤   ¤   ¤   {
e5f92c ¤   ¤   ¤   ¤   UseResFile( iconFileRef );
782b85 ¤   ¤   ¤   ¤
e75112 ¤   ¤   ¤   ¤   err = CopyResource( gApplicationResFile, kLarge1BitMask,
6e4a18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskVolumeIconResID,
a89b75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   iconFileRef, kLarge1BitMask,
20a389 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCustomIconResource );
2695fc ¤   ¤   ¤   ¤   AssertNoErr( err, nil );
582b85 ¤   ¤   ¤   ¤
4a5c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
0e72c3 ¤   ¤   ¤   ¤   {
250d80 ¤   ¤   ¤   ¤   ¤   // The black and white icon must succeed. The rest are
6e4e9f ¤   ¤   ¤   ¤   ¤   // optional
41ae30 ¤   ¤   ¤   ¤   ¤
eb2485 ¤   ¤   ¤   ¤   ¤   (void) CopyResource( gApplicationResFile, kLarge4BitData,
8d0c28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskVolumeIconResID, iconFileRef,
892aa7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kLarge4BitData, kCustomIconResource );
b9fd30 ¤   ¤   ¤   ¤   ¤   (void) CopyResource( gApplicationResFile, kLarge8BitData,
0d0c28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskVolumeIconResID, iconFileRef,
b63000 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kLarge8BitData, kCustomIconResource );
b79683 ¤   ¤   ¤   ¤   ¤   (void) CopyResource( gApplicationResFile, kSmall1BitMask,
c90c28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskVolumeIconResID, iconFileRef,
ab00a0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSmall1BitMask, kCustomIconResource );
aa0b10 ¤   ¤   ¤   ¤   ¤   (void) CopyResource( gApplicationResFile, kSmall4BitData,
120c28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskVolumeIconResID, iconFileRef,
853e2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSmall4BitData, kCustomIconResource );
bbd2a5 ¤   ¤   ¤   ¤   ¤   (void) CopyResource( gApplicationResFile, kSmall8BitData,
600c28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskVolumeIconResID, iconFileRef,
3e2489 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSmall8BitData, kCustomIconResource );
0e2613 ¤   ¤   ¤   ¤   }
211b52 ¤   ¤
af52e9 ¤   ¤   ¤   ¤   CloseResFile( iconFileRef );
a8a363 ¤   ¤   ¤   ¤   UseResFile( saveResFile );
88a3a6 ¤   ¤   ¤   }
90bb8c ¤   ¤   ¤   else
16f776 ¤   ¤   ¤   {
f1d402 ¤   ¤   ¤   ¤   err = ForceResError( fnfErr );
d5a3a6 ¤   ¤   ¤   }
c90fe4 ¤   ¤   }
3c1b52 ¤   ¤
09da5e ¤   ¤   if( IsntErr( err ) )
f05b34 ¤   ¤   {
150c8f ¤   ¤   ¤   // Make the custom icon file invisible
3b67c5 ¤
f33440 ¤   ¤   ¤   err = FSpGetCatInfo( &iconFileSpec, &cpb );
289011 ¤   ¤   ¤   AssertNoErr( err, nil );
ba87c7 ¤   ¤   ¤
606108 ¤   ¤   ¤   if( IsntErr( err ) )
a5f776 ¤   ¤   ¤   {
4e4ae9 ¤   ¤   ¤   ¤   cpb.hFileInfo.ioFlFndrInfo.fdFlags |= kIsInvisible;
112b85 ¤   ¤   ¤   ¤
c45c63 ¤   ¤   ¤   ¤   err = FSpSetCatInfo( &iconFileSpec, &cpb );
3595fc ¤   ¤   ¤   ¤   AssertNoErr( err, nil );
79a3a6 ¤   ¤   ¤   }
d10fe4 ¤   ¤   }
7e1b52 ¤   ¤
c4da5e ¤   ¤   if( IsntErr( err ) )
--c895 000f7e43d634012005d Page 8 of PGPDiskUtils.c
e35b34 ¤   ¤   {
80caab ¤   ¤   ¤   CInfoPBRec¤ cpb;
05d462 ¤   ¤   ¤   FSSpec¤ ¤   volumeSpec;
7987c7 ¤   ¤   ¤
4488ea ¤   ¤   ¤   // Set the custom icon bit of the root directoy catalog entry.
2a87c7 ¤   ¤   ¤
d6f2f8 ¤   ¤   ¤   volumeSpec.vRefNum¤ = iconFileSpec.vRefNum;
bbe12b ¤   ¤   ¤   volumeSpec.parID¤   = fsRtParID;
b087c7 ¤   ¤   ¤
31d89b ¤   ¤   ¤   CopyPString( volumeName, volumeSpec.name );
9287c7 ¤   ¤   ¤
98496c ¤   ¤   ¤   err = FSpGetCatInfo( &volumeSpec, &cpb );
859011 ¤   ¤   ¤   AssertNoErr( err, nil );
4787c7 ¤   ¤   ¤
f86108 ¤   ¤   ¤   if( IsntErr( err ) )
9ff776 ¤   ¤   ¤   {
d1679a ¤   ¤   ¤   ¤   cpb.dirInfo.ioDrUsrWds.frFlags |= kHasCustomIcon;
6b2b85 ¤   ¤   ¤   ¤
b065f2 ¤   ¤   ¤   ¤   err = FSpSetCatInfo( &volumeSpec, &cpb );
9e95fc ¤   ¤   ¤   ¤   AssertNoErr( err, nil );
6da3a6 ¤   ¤   ¤   }
2d0fe4 ¤   ¤   }
bf1b52 ¤   ¤
4203ef ¤   ¤   if( IsErr( err ) )
525b34 ¤   ¤   {
7a62f0 ¤   ¤   ¤   pgpDebugMsg( "CopyCustomVolumeIconToDrive: Error!" );
d287c7 ¤   ¤   ¤
80a208 ¤   ¤   ¤   (void) FSpDelete( &iconFileSpec );
820fe4 ¤   ¤   }
649371 ¤   }
1d67c5 ¤
92deb7 ¤   return( err );
08efe6 }
e5af5a
6daf5a
9daf5a
581951 ¤   static ulong
ce7bb4 DetermineGoodWipeSize(
030e09 ¤   short¤  ¤   driveNumber,
ee7c80 ¤   short¤  ¤   driverRefNum )
4abb36 {
eea4b2 ¤   const UInt32¤   ¤   kMaxWipeSize¤   = 1024UL * 1024UL;
c789a0 ¤   const UInt32¤   ¤   kMinWipeSize¤   = 4UL * 1024UL;
43a0a0 ¤   const UInt32¤   ¤   kDefaultSize¤   = 64UL * 1024UL;
b5f19a ¤   void *¤ ¤   ¤   buffer;
b7ec0f ¤   UInt32¤ ¤   ¤   goodSize¤   = kDefaultSize;
cc8280 ¤   UInt32¤ ¤   bufferSize;
8279f7 ¤   OSStatus¤   ¤   err¤= noErr;
eb1b52 ¤   ¤
ee8302 ¤   buffer¤ = pgpNewPtrMost( goodSize, kMinWipeSize,
a86690 ¤   ¤   ¤   ¤   kMacMemory_UseCurrentHeap | kMacMemory_PreferTempMem,
c9f5d2 ¤   ¤   ¤   ¤   &bufferSize);
da714d ¤   pgpAssert( IsntNull( buffer ) );
814794 ¤   if ( IsntNull( buffer ) )
6ec7a1 ¤   {
d8d8ab ¤   ¤   ParamBlockRec¤  pb;
0f4d12 ¤   ¤   UnsignedWide¤   startMS;
b3ea1f ¤   ¤   UnsignedWide¤   stopMS;
6567c5 ¤
f7afde ¤   ¤   pb.ioParam.ioCompletion¤¤   = nil;
761580 ¤   ¤   pb.ioParam.ioVRefNum¤   ¤   = driveNumber;
4b19c9 ¤   ¤   pb.ioParam.ioRefNum¤¤   ¤   = driverRefNum;
f495fe ¤   ¤   pb.ioParam.ioBuffer¤¤   ¤   = (Ptr)buffer;
2d2782 ¤   ¤   pb.ioParam.ioReqCount¤  ¤   = bufferSize;
0e73a4 ¤   ¤   pb.ioParam.ioPosMode¤   ¤   = fsFromStart;
b77e52 ¤   ¤   pb.ioParam.ioPosOffset¤ ¤   = 0;
401b52 ¤   ¤
3129e2 ¤   ¤   Microseconds( &startMS );
598cff ¤   ¤   err¤= PBWriteSync( &pb );
41f5f2 ¤   ¤   Microseconds( &stopMS );
291b52 ¤   ¤
f7d798 ¤   ¤   if ( IsntErr( err ) )
--ee39 000529f4b6f4012005d Page 9 of PGPDiskUtils.c
e35b34 ¤   ¤   {
4c2555 ¤   ¤   ¤   pgpAssert( UnsignedWideToUInt64(stopMS) >=
3c5b7b ¤   ¤   ¤   ¤   UnsignedWideToUInt64(startMS) );
588bcd ¤   ¤   ¤   UInt32¤ elapsedMilli¤   = (stopMS - startMS).lo / 1000;
c487c7 ¤   ¤   ¤
5a0253 ¤   ¤   ¤   if ( elapsedMilli != 0 )
2ff776 ¤   ¤   ¤   {
400f22 ¤   ¤   ¤   ¤   float¤  elapsedSeconds¤ = (float)elapsedMilli / (float)1000;
7cd4b7 ¤   ¤   ¤   ¤   UInt32¤ bytesPerSecond¤ = pb.ioParam.ioActCount /
6aabba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   elapsedSeconds;
f12b85 ¤   ¤   ¤   ¤
044b8c ¤   ¤   ¤   ¤   // we'd like to be able to cancel after a delay of no more
f59ec4 ¤   ¤   ¤   ¤   // than a second
0c3dfa ¤   ¤   ¤   ¤   goodSize¤   = bytesPerSecond;
412b85 ¤   ¤   ¤   ¤
d01505 ¤   ¤   ¤   ¤   if ( goodSize > kMaxWipeSize )
1e9dbb ¤   ¤   ¤   ¤   ¤   goodSize¤   = kMaxWipeSize;
c6ae30 ¤   ¤   ¤   ¤   ¤
e32cf7 ¤   ¤   ¤   ¤   goodSize¤   = ( goodSize / kDiskBlockSize ) * kDiskBlockSize;
6b2b85 ¤   ¤   ¤   ¤
420a66 ¤   ¤   ¤   ¤   if ( goodSize < kMinWipeSize )
541365 ¤   ¤   ¤   ¤   ¤   goodSize¤   = kMinWipeSize;
9ba3a6 ¤   ¤   ¤   }
6a0fe4 ¤   ¤   }
d91b52 ¤   ¤
8bc302 ¤   ¤   pgpFreeMac( buffer );
189371 ¤   }
c967c5 ¤
d746aa ¤   return( goodSize );
abefe6 }
0e67c5 ¤
3367c5 ¤
f12473 ¤   static OSStatus
5dffa3 WipeDiskUsingDrive(
b35052 ¤   short¤  ¤   ¤   ¤   ¤   ¤   driveNumber,
0a29b4 ¤   short¤  ¤   ¤   ¤   ¤   ¤   driverRefNum,
f84cd3 ¤   UInt32¤ ¤   ¤   ¤   ¤   ¤   numBlocksToWipe,
4eb4f9 ¤   MountDiskProgressProcPtr¤   progressProc,
949368 ¤   void¤   ¤   ¤   ¤   ¤   ¤   *progressUserValue)
7fbb36 {
c379f7 ¤   OSStatus¤   ¤   err¤= noErr;
89f19a ¤   void *¤ ¤   ¤   buffer;
70e3ca ¤   UInt32¤ ¤   ¤   bufferSize;
203edd ¤   const UInt32¤   kMinWipeSize¤   ¤   = kPGPDiskBlockSize;
7e67c5 ¤
d9d6ab ¤   bufferSize = DetermineGoodWipeSize( driveNumber, driverRefNum );
d667c5 ¤
17c0e5 ¤   // We have a memory problem here. If we ask for a lot of memory and it
1bc906 ¤   // comes out of the application heap, then we may trigger the
5042d9 ¤   // GrowZoneProc for the app and a low memory warning to the user.
a34509 ¤   // To alleviate this, we explicitly try for Temp Mem first
98aa38 ¤   // and then the App heap, leaving a sizeable amount free.
18af5a
f9cab1 ¤   buffer = pgpNewPtrMost( bufferSize, kMinWipeSize, kMacMemory_UseTempMem,
a3c2da ¤   ¤   ¤   ¤   ¤   &bufferSize);
5885be ¤   if( IsNull( buffer ) )
dcc7a1 ¤   {
f75f05 ¤   ¤   #define¤kMinAppFreeSpace¤   (64 * 1024L)
561b52 ¤   ¤
133f12 ¤   ¤   bufferSize = MaxBlock();
38d1dc ¤   ¤   if( bufferSize >= 2 * kMinAppFreeSpace )
0e5b34 ¤   ¤   {
9c4184 ¤   ¤   ¤   bufferSize -= kMinAppFreeSpace;
c60fe4 ¤   ¤   }
3e8e83 ¤   ¤   else if( bufferSize >= kMinAppFreeSpace )
385b34 ¤   ¤   {
fb03f5 ¤   ¤   ¤   bufferSize = bufferSize / 2;
840fe4 ¤   ¤   }
590e1d ¤   ¤   else
c95b34 ¤   ¤   {
21557e ¤   ¤   ¤   bufferSize = 2 * kMinWipeSize;
520fe4 ¤   ¤   }
--6be7 0006cce16604012005d Page 10 of PGPDiskUtils.c
e0af5a
6c0ce5 ¤   ¤   buffer = pgpNewPtrMost( bufferSize, kMinWipeSize,
4aee6c ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseCurrentHeap, &bufferSize);
1e9371 ¤   }
f4af5a
bf714d ¤   pgpAssert( IsntNull( buffer ) );
c61b52 ¤   ¤
ce4794 ¤   if ( IsntNull( buffer ) )
eac7a1 ¤   {
ce70d1 ¤   ¤   UInt32¤ remainingBlocks;
318b86 ¤   ¤   UInt32¤ bufferSizeInBlocks;
0b01b3 ¤   ¤   UInt32¤ percentComplete ¤   = 0;
3632d4 ¤   ¤   UInt32¤ blocksWrittenSoFar¤ = 0;
aa1b52 ¤   ¤
1c8774 ¤   ¤   // make sure buffer size is an integral number of blocks
b8fdb4 ¤   ¤   bufferSizeInBlocks¤ = bufferSize / kPGPDiskBlockSize;
57aa8f ¤   ¤   bufferSize¤ ¤   ¤   = bufferSizeInBlocks * kPGPDiskBlockSize;
2d90b0 ¤   ¤   pgpAssert( bufferSize != 0 &&
397e9e ¤   ¤   ¤   ¤   ¤   ¤   ( bufferSize % kPGPDiskBlockSize ) == 0 );
bcaf5a
11e88f ¤   ¤   remainingBlocks¤= numBlocksToWipe;
391b52 ¤   ¤
741b52 ¤   ¤
fb1035 ¤   ¤   while( remainingBlocks != 0 && IsntErr( err ) )
e65b34 ¤   ¤   {
bf7356 ¤   ¤   ¤   volatile ParamBlockRec¤ pb;¤// IMPORTANT: must be volatile
712e92 ¤   ¤   ¤   UInt32¤ ¤   ¤   ¤   ¤   blocksThisWrite;
4087c7 ¤   ¤   ¤
c74559 ¤   ¤   ¤   blocksThisWrite¤= MIN( remainingBlocks, bufferSizeInBlocks );
b51b52 ¤   ¤
853e46 ¤   ¤   ¤   pb.ioParam.ioCompletion¤¤   = nil;
5a04a7 ¤   ¤   ¤   pb.ioParam.ioVRefNum¤   ¤   = driveNumber;
384c65 ¤   ¤   ¤   pb.ioParam.ioRefNum¤¤   ¤   = driverRefNum;
7684d9 ¤   ¤   ¤   pb.ioParam.ioBuffer¤¤   ¤   = (Ptr)buffer;
06140a ¤   ¤   ¤   pb.ioParam.ioReqCount¤  ¤   = blocksThisWrite * kPGPDiskBlockSize;
8f6283 ¤   ¤   ¤   pb.ioParam.ioPosMode¤   ¤   = fsFromStart;
d44a00 ¤   ¤   ¤   pb.ioParam.ioPosOffset¤ ¤   = blocksWrittenSoFar *
1089a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskBlockSize;
1187c7 ¤   ¤   ¤
178829 ¤   ¤   ¤   (void)PBWriteAsync( (ParamBlockRec *) &pb );
2f87c7 ¤   ¤   ¤
baa446 ¤   ¤   ¤   // yield time while/after write completes
f06da3 ¤   ¤   ¤   do
51f776 ¤   ¤   ¤   {
4d615a ¤   ¤   ¤   ¤   err = (*progressProc)( percentComplete, progressUserValue );
fd9bb8 ¤   ¤   ¤   ¤   if( IsErr( err ) )
8f72c3 ¤   ¤   ¤   ¤   {
6078fc ¤   ¤   ¤   ¤   ¤   while ( pb.ioParam.ioResult == 1 )
804859 ¤   ¤   ¤   ¤   ¤   {
de7433 ¤   ¤   ¤   ¤   ¤   ¤   // wait till done
da1c89 ¤   ¤   ¤   ¤   ¤   }
f2af5a
3d14c3 ¤   ¤   ¤   ¤   ¤   break;
1b2613 ¤   ¤   ¤   ¤   }
972b85 ¤   ¤   ¤   ¤
e61a7f ¤   ¤   ¤   } while ( ( err = pb.ioParam.ioResult ) == 1 );
9a87c7 ¤   ¤   ¤
fd6666 ¤   ¤   ¤   remainingBlocks¤¤   -= blocksThisWrite;
a13833 ¤   ¤   ¤   blocksWrittenSoFar¤ += blocksThisWrite;
8c1b52 ¤   ¤
796108 ¤   ¤   ¤   if( IsntErr( err ) )
d7f776 ¤   ¤   ¤   {
795862 ¤   ¤   ¤   ¤   percentComplete = (double) blocksWrittenSoFar * 100.0 /
b61c75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (double) numBlocksToWipe;
3987c7 ¤   ¤   ¤
98615a ¤   ¤   ¤   ¤   err = (*progressProc)( percentComplete, progressUserValue );
53a3a6 ¤   ¤   ¤   }
820fe4 ¤   ¤   }
5e1b52 ¤   ¤
c5c302 ¤   ¤   pgpFreeMac( buffer );
899371 ¤   }
6c0e24 ¤   else
--2301 00081536a504012005d Page 11 of PGPDiskUtils.c
f7c7a1 ¤   {
952a06 ¤   ¤   err = memFullErr;
be9371 ¤   }
6467c5 ¤
1ddeb7 ¤   return( err );
a6efe6 }
f2af5a
7eaf5a
1a33c8 ¤   static void
c29b28 GetMediaAndPhysicalIcons(
2af8d4 ¤   BWIcon *¤   mediaIcon,
f20be3 ¤   BWIcon *¤   physicalIcon )
9bc7a1 ¤   {
2c336e ¤   Handle¤ iconHandle¤ = nil;
8aec8c ¤   short¤  physicalID¤ = kPGPDiskVolumeIconResID;
c28f63 ¤   short¤  mediaID¤¤   = physicalID;
6589c6 ¤   short¤  saveResFile¤= CurResFile();
cf67c5 ¤
f86f56 ¤   UseResFile(gApplicationResFile);
0a67c5 ¤
afd5b7 ¤   iconHandle¤ = Get1Resource('ICN#', physicalID);
9a7c86 ¤   if( IsntNull( iconHandle ) )
ca5b34 ¤   ¤   {
7d2d1e ¤   ¤   pgpAssert( HomeResFile( iconHandle ) == gApplicationResFile );
bc0070 ¤   ¤   *mediaIcon¤ = *(BWIcon *)*iconHandle;
3b2fb6 ¤   ¤   ReleaseResource( iconHandle );
100fe4 ¤   ¤   }
f40e24 ¤   else
955b34 ¤   ¤   {
13247b ¤   ¤   pgpDebugPStr( "\pGetMediaAndPhysicalIcons: can't get icon");
bf0fe4 ¤   ¤   }
0667c5 ¤
2ae5a6 ¤   // get the icon for the physical media
c7ab14 ¤   iconHandle¤ = Get1Resource('ICN#', mediaID);
187c86 ¤   if( IsntNull( iconHandle ) )
225b34 ¤   ¤   {
c72d1e ¤   ¤   pgpAssert( HomeResFile( iconHandle ) == gApplicationResFile );
cf848d ¤   ¤   *physicalIcon¤  = *(BWIcon *)*iconHandle;
1e2fb6 ¤   ¤   ReleaseResource( iconHandle );
fb0fe4 ¤   ¤   }
850e24 ¤   else
4d5b34 ¤   ¤   {
03247b ¤   ¤   pgpDebugPStr( "\pGetMediaAndPhysicalIcons: can't get icon");
ea0fe4 ¤   ¤   }
3567c5 ¤
9c60a3 ¤   UseResFile( saveResFile );
539371 ¤   }
e3af5a
0b1a06 // Removes the header and trailer blocks from the extent list.
24af5a
78d140 ¤   static OSErr
c4df31 PGPDiskFileExtentsToPGPDiskDataExtents(
634fb3 ¤   DiskExtent ¤*extentsList,
723b1a ¤   PGPUInt32¤  numFileExtents,
06b14c ¤   PGPUInt32¤  firstDataBlock,
be17fa ¤   PGPUInt32¤  numDataBlocks,
c140d0 ¤   PGPUInt32 ¤ *numDataExtents)
25bb36 {
3814d3 ¤   OSErr¤  ¤   err¤= noErr;
cb5952 ¤   DiskExtent¤ *curExtent;
750bfb ¤   DiskExtent¤ *lastExtent;
d4f6f8 ¤   UInt32¤ ¤   remainingHeaderBlocks;
9e6824 ¤   UInt32¤ ¤   remainingDataBlocks;
96af5a
cf07ca ¤   pgpAssertAddrValid( extentsList, DiskExtent );
0a9393 ¤   pgpAssertAddrValid( numDataExtents, UInt32 );
3b6093 ¤   pgpAssert( firstDataBlock != 0 );
e667c5 ¤
cccad9 ¤   curExtent ¤ ¤   ¤   ¤   = extentsList;
a9b3e3 ¤   lastExtent¤ ¤   ¤   ¤   = curExtent + numFileExtents - 1;
ef2fcf ¤   remainingHeaderBlocks¤  = firstDataBlock;
81db28 ¤   remainingDataBlocks¤¤   = numDataBlocks;
--da9a 000a25145a74012005d Page 12 of PGPDiskUtils.c
2a67c5 ¤
10b3dd ¤   pgpAssert( remainingHeaderBlocks < remainingDataBlocks );
4967c5 ¤
1bb58c ¤   while( remainingDataBlocks != 0 && curExtent <= lastExtent )
dbc7a1 ¤   {
e22168 ¤   ¤   if( remainingHeaderBlocks != 0 )
aa5b34 ¤   ¤   {
deae72 ¤   ¤   ¤   if( remainingHeaderBlocks >= curExtent->numBlocks )
98f776 ¤   ¤   ¤   {
7dbf0c ¤   ¤   ¤   ¤   // Entire extent is header data.
9f96d1 ¤   ¤   ¤   ¤   remainingHeaderBlocks ¤ -= curExtent->numBlocks;
5bbb03 ¤   ¤   ¤   ¤   curExtent->numBlocks ¤  = 0;
f0a3a6 ¤   ¤   ¤   }
17bb8c ¤   ¤   ¤   else
d4f776 ¤   ¤   ¤   {
221250 ¤   ¤   ¤   ¤   // Extent is partially header data.
ce1d51 ¤   ¤   ¤   ¤   curExtent->numBlocks ¤  ¤   -= remainingHeaderBlocks;
cc055c ¤   ¤   ¤   ¤   curExtent->diskBlockIndex ¤ += remainingHeaderBlocks;
9164b7 ¤   ¤   ¤   ¤   remainingHeaderBlocks¤  ¤   = 0;
95a3a6 ¤   ¤   ¤   }
b50fe4 ¤   ¤   }
5baf5a
8248cb ¤   ¤   // Check to see if this is the last data block extent.
69949b ¤   ¤   if( curExtent->numBlocks > remainingDataBlocks )
885b34 ¤   ¤   {
54a774 ¤   ¤   ¤   curExtent->numBlocks ¤  = remainingDataBlocks;
dc03f2 ¤   ¤   ¤   remainingDataBlocks¤¤   = 0;
2e0fe4 ¤   ¤   }
7b0e1d ¤   ¤   else
da5b34 ¤   ¤   {
01aefb ¤   ¤   ¤   remainingDataBlocks¤-= curExtent->numBlocks;
810fe4 ¤   ¤   }
031b52 ¤   ¤
79958d ¤   ¤   ++curExtent;
5f9371 ¤   }
981b52 ¤   ¤
7626d6 ¤   // At this point, the extent list may have zero-length entries.
7cb830 ¤   // Shift the list data to remove these entries.
38af5a
afac28 ¤   *numDataExtents = numFileExtents;
c067c5 ¤
863496 ¤   for( UInt32 index = 0; index < numFileExtents; ++index )
6dc7a1 ¤   {
44922d ¤   ¤   if( extentsList[index].numBlocks != 0 )
ed5b34 ¤   ¤   {
057ef9 ¤   ¤   ¤   if( index > 0 )
5bf776 ¤   ¤   ¤   {
f75799 ¤   ¤   ¤   ¤   UInt32¤ bytesToMove;
d52b85 ¤   ¤   ¤   ¤
228a20 ¤   ¤   ¤   ¤   // This is the first non-empty block which is not the first
e340d9 ¤   ¤   ¤   ¤   // block. Shift the entries from this point.
c82b85 ¤   ¤   ¤   ¤
d14735 ¤   ¤   ¤   ¤   bytesToMove = ( *numDataExtents - index ) *
d64ecf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( DiskExtent );
2d2b85 ¤   ¤   ¤   ¤
1363b8 ¤   ¤   ¤   ¤   BlockMoveData( &extentsList[index], &extentsList[0],
5dac4d ¤   ¤   ¤   ¤   ¤   ¤   ¤   bytesToMove );
1e39ec ¤   ¤   ¤   ¤   *numDataExtents -= index;
0ba3a6 ¤   ¤   ¤   }
2d87c7 ¤   ¤   ¤
27cdcb ¤   ¤   ¤   break;
880fe4 ¤   ¤   }
e09371 ¤   }
7faf5a
2cdeb7 ¤   return( err );
64efe6 }
04af5a
b4af5a
a926f7 ¤   static CComboError
04df6b AddInfoForFile(
a5eee1 ¤   PGPDiskFileRef¤ ¤   ¤   ¤   diskFileRef,
a22cb2 ¤   PGPDiskKeyRef¤  ¤   ¤   ¤   keyRef,
--dc2f 0009287a9d84012005d Page 13 of PGPDiskUtils.c
694b31 ¤   short¤  ¤   ¤   ¤   ¤   ¤   fileRefNum,
43d3c1 ¤   AddDriveStruct *¤   ¤   ¤   info,
224440 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mountReadOnly,
cbbf5d ¤   ConstStr255Param¤   ¤   ¤   passphrase)
26bb36 {
3cbfe7 ¤   CComboError¤¤   ¤   ¤   ¤   err;
ea6878 ¤   const PGPDiskFileHeader¤¤   *fileHeader;
ba67c5 ¤
800537 ¤   AssertFileRefNumIsValid( fileRefNum, "AddInfoForFile" );
fd28c3 ¤   pgpAssertAddrValid( info, AddDriveStruct );
e58da6 ¤   pgpAssertAddrValid( passphrase, uchar );
fe67c5 ¤
bdfb25 ¤   fileHeader = PeekPGPDiskFileHeader( diskFileRef );
1c67c5 ¤
5991e8 ¤   info->fileRefNum¤   ¤   = fileRefNum;
f1486e ¤   info->numBlocks¤¤   ¤   = fileHeader->numDataBlocks;
b04551 ¤   info->mountReadOnly¤¤   = mountReadOnly;
8e67c5 ¤
50a7f0 ¤   err.err = GetDiskExtentsForFork( fileRefNum, &info->extents,
d7d4e2 ¤   ¤   ¤   ¤   ¤   &info->numExtents );
11d3cb ¤   if( err.IsntError() )
9bc7a1 ¤   {
95730f ¤   ¤   err.err = PGPDiskFileExtentsToPGPDiskDataExtents(
39c441 ¤   ¤   ¤   ¤   ¤   ¤   (DiskExtent *) info->extents,
b93334 ¤   ¤   ¤   ¤   ¤   ¤   info->numExtents, fileHeader->numHeaderBlocks,
1c4ec0 ¤   ¤   ¤   ¤   ¤   ¤   fileHeader->numDataBlocks, &info->numExtents );
b25a9f ¤   ¤   if( err.IsntError() )
475b34 ¤   ¤   {
2adac0 ¤   ¤   ¤   info->salt = fileHeader->salt;
a2af5a
e99f23 ¤   ¤   ¤   err = DecryptPGPDiskKey( keyRef, passphrase,
a6278a ¤   ¤   ¤   ¤   ¤   ¤   &info->decryptionKey );
590fe4 ¤   ¤   }
8a9371 ¤   }
5667c5 ¤
06deb7 ¤   return( err );
c9efe6 }
2267c5 ¤
332811 /*___________________________________________________________________________
dabc5d ¤   On some machines, breaking up PBs into smaller ones just gives us slower
e1ecbb ¤   I/O due to the smaller requests we make, with payback. ·On modern machines
d3957a ¤   with DMA, we get ample time back (at least with SCSI).
d067c5 ¤
601271 ¤   By testing a particular driver, we can optimize our behavior for the
563613 ¤   particular drive, driver and machine in use.
7667c5 ¤
010508 ¤   *Important note*:
807b36 ¤   ¤   This used to be done inside a sync control call inside the driver and
eb20df ¤   the driver would wait for the IO to complete. ·This caused a problem where
aed0f3 ¤   the sync call got queued and then executed with interrupts off. ·So we must
f0d709 ¤   make this determination here, in the app, and wait for IO to complete at
3bf08c ¤   ·a "nice" time.
39c988 ___________________________________________________________________________*/
edcd8d ¤   static Boolean
469c65 ShouldBreakUpRequestsToDriver(
6e4fe8 ¤   short¤  driveNumber,
72df4c ¤   short¤  driverRefNum )
56bb36 {
a45cea ¤   pgpAssert( driverRefNum != 0 );
926c9b ¤   pgpAssert( driveNumber > 0 );
b6af5a
d8b582 ¤   Boolean¤¤   ¤   shouldBreakUp¤  = TRUE;
f4b15a ¤   LogicalAddress¤ buffer;
25e3ca ¤   UInt32¤ ¤   ¤   bufferSize;
7c21b0 ¤   UInt32¤ ¤   ¤   numBlocks;
97bb6d ¤   const UInt32¤   ¤   kDefaultIOBufferSize¤   = 128UL * 1024UL;
2656b4 ¤   const UInt32¤   ¤   kMinIOBufferSize¤   ¤   = 8UL * 1024UL;
6267c5 ¤
a4548c ¤   buffer = pgpNewPtrMost( kDefaultIOBufferSize, kMinIOBufferSize,
ec9253 ¤   ¤   ¤   ¤   ¤   kMacMemory_PreferTempMem | kMacMemory_UseApplicationHeap,
70b07b ¤   ¤   ¤   ¤   ¤   &bufferSize );
927335 ¤   pgpDebugMsgIf( IsNull( buffer ),
--980d 00050d318ad4012005d Page 14 of PGPDiskUtils.c
49003b ¤   ¤   ¤   ¤   "ShouldBreakUpPBs: Unable to allocate buffer" );
fd67c5 ¤
014794 ¤   if ( IsntNull( buffer ) )
ecc7a1 ¤   {
d56bd7 ¤   ¤   volatile ParamBlockRec¤ pb;
2c67c5 ¤
1682ac ¤   ¤   numBlocks = bufferSize / kPGPDiskBlockSize;
3eaf5a
a9d6fe ¤   ¤   Str255¤ driverName;
39f104 ¤   ¤   GetDriverNameUsingRefNum( driverRefNum, driverName );
8e8604 ¤   ¤   if ( PStringsAreEqual( driverName, "\p.Sony" ) )
7a5b34 ¤   ¤   {
61ecf4 ¤   ¤   ¤   // reduce the test size so it doesn't take too long
534cc4 ¤   ¤   ¤   const UInt32¤   kMaxFloppyBlocks¤   = 16;
bf87c7 ¤   ¤   ¤
b4f63c ¤   ¤   ¤   numBlocks¤  = MIN( numBlocks, kMaxFloppyBlocks );
4c0fe4 ¤   ¤   }
10af5a
17afde ¤   ¤   pb.ioParam.ioCompletion¤¤   = nil;
e91580 ¤   ¤   pb.ioParam.ioVRefNum¤   ¤   = driveNumber;
9c19c9 ¤   ¤   pb.ioParam.ioRefNum¤¤   ¤   = driverRefNum;
f395fe ¤   ¤   pb.ioParam.ioBuffer¤¤   ¤   = (Ptr)buffer;
7e2782 ¤   ¤   pb.ioParam.ioReqCount¤  ¤   = bufferSize;
e773a4 ¤   ¤   pb.ioParam.ioPosMode¤   ¤   = fsFromStart;
907e52 ¤   ¤   pb.ioParam.ioPosOffset¤ ¤   = 0;
6a1b52 ¤   ¤
c0179d ¤   ¤   (void)PBReadAsync( (ParamBlockRec *) &pb );
9e1b52 ¤   ¤
9a2e7a ¤   ¤   // see how high we can count while we wait for I/O
fc70c5 ¤   ¤   UInt32¤ counter¤= 0;
970420 ¤   ¤   while ( pb.ioParam.ioResult == kAsyncIOInProgress )
d25b34 ¤   ¤   {
0054e4 ¤   ¤   ¤   ++counter;
040fe4 ¤   ¤   }
a81b52 ¤   ¤
b45b77 ¤   ¤   // unclear where the cutoff should be...do we get dribs and drabs of
3c01f3 ¤   ¤   // time back on some machines that we should ignore?
bd276e ¤   ¤   shouldBreakUp¤  = counter > 200;
421b52 ¤   ¤
bac302 ¤   ¤   pgpFreeMac( buffer );
27fb16 ¤   ¤   buffer¤ = nil;
a29371 ¤   }
e067c5 ¤
99eb70 ¤   return( shouldBreakUp );
fcefe6 }
44af5a
2baf5a
31d140 ¤   static OSErr
9bdb85 InstallNewPGPDiskDriver(
4ec6e3 ¤   ConstStr255Param¤   name,
c8f2b6 ¤   short¤  ¤   ¤   ¤   refNum)
a5bb36 {
3874c6 ¤   THz¤¤   saveZone¤   ¤   = GetZone();
5ed6ad ¤   Handle¤ driverHandle¤   = nil;
7cd5ff ¤   OSErr¤  err¤¤   ¤   ¤   = noErr;
1467c5 ¤
2e6344 ¤   SetZone( SystemZone() );
e967c5 ¤
01aacd ¤   driverHandle = Get1NamedResource( kPGPDiskDriverType, kPGPDiskDriverName);
143a6a ¤   err = ResError();
d39aaa ¤   if( IsNull( driverHandle ) )
41c7a1 ¤   {
d0b1b6 ¤   ¤   err¤= resNotFound;
2350a8 ¤   ¤   pgpDebugPStr("\pGet1NamedResource failed!");
039371 ¤   }
120e24 ¤   else
39c7a1 ¤   {
da2d64 ¤   ¤   HLock( driverHandle );
449880 ¤   ¤   DetachResource( driverHandle );
00b41a ¤   ¤   MacLeaks_IgnoreItem( driverHandle );
a6af5a
50318d ¤   ¤   SetZone( ApplicationZone() );
--e323 00043e83d3b4012005d Page 15 of PGPDiskUtils.c
f11b52 ¤   ¤
92cdd3 ¤   ¤   SetDriverName( (DRVRHeader *) *driverHandle, name );
991b52 ¤   ¤
350142 ¤   ¤   err = MyDRVRInstall( *driverHandle, refNum);
bbd94a ¤   ¤   if ( IsntErr( err ))
f95b34 ¤   ¤   {
4523d6 ¤   ¤   ¤   short¤  dummy¤  = refNum;
8287c7 ¤   ¤   ¤
d4d512 ¤   ¤   ¤   err = OpenDriver( name, &dummy);
4b68c1 ¤   ¤   ¤   AssertNoErr( err, "InstallNewPGPDiskDriver" );
71ecba ¤   ¤   ¤   pgpAssert( dummy == refNum );
386108 ¤   ¤   ¤   if( IsntErr( err ) )
1ff776 ¤   ¤   ¤   {
0db82f ¤   ¤   ¤   ¤   err = SendPreferencesToDriver( refNum,
ff580a ¤   ¤   ¤   ¤   ¤   ¤   ¤   &gPGPDiskPrefs.driverPrefs );
6ea3a6 ¤   ¤   ¤   }
a60fe4 ¤   ¤   }
781b52 ¤   ¤
fa8cf4 ¤   ¤   if ( IsErr( err ) )
c65b34 ¤   ¤   {
0fbfd7 ¤   ¤   ¤   short¤  ¤   ¤   unitNum¤= -1 * ( refNum + 1 );
5e842c ¤   ¤   ¤   AuxDCEHandle¤   *unitTable¤ = (AuxDCEHandle *)LMGetUTableBase();
2cd82d ¤   ¤   ¤   AuxDCEHandle¤   dce;
781b52 ¤   ¤
e29fb1 ¤   ¤   ¤   pgpDebugPStr( "\perror installing driver" );
5a4136 ¤   ¤   ¤   dce¤= unitTable[ unitNum ];
26cccc ¤   ¤   ¤   unitTable[ unitNum ] = nil;
a97e17 ¤   ¤   ¤   if ( IsntNull( dce ) )
65f776 ¤   ¤   ¤   {
84e22c ¤   ¤   ¤   ¤   DisposeHandle( (Handle)dce );
c7a3a6 ¤   ¤   ¤   }
8c87c7 ¤   ¤   ¤
6cb593 ¤   ¤   ¤   DisposeHandle( driverHandle );
170fe4 ¤   ¤   }
6a9371 ¤   }
d467c5 ¤
23b2fd ¤   SetZone( saveZone );
fa67c5 ¤
d2406f ¤   AssertNoErr( err, "GetInstallAndOpenDriver" );
90deb7 ¤   return( err );
f3efe6 }
ffaf5a
feaf5a
69af5a
df6d52 ¤   void
047c43 GetAllPGPDiskDrivers(
471495 ¤   short¤  ¤   driverRefNums[],
f44086 ¤   ushort¤ ¤   maxRefNums,
aaa976 ¤   ushort *¤   numDrivers)
67bb36 {
7075f8 ¤   OSStatus¤   err¤= noErr;
c18b23 ¤   ushort¤ ¤   numDCtlEntries;
2267c5 ¤
9c5bfb ¤   *numDrivers¤= 0;
cd67c5 ¤
65e924 ¤   numDCtlEntries¤ = GetNumDCtlEntries();
e2eb42 ¤   for( ushort dCtlIndex = 0;
a1ff13 ¤   ¤   ¤   dCtlIndex < numDCtlEntries && *numDrivers < maxRefNums;
f7360d ¤   ¤   ¤   ¤   ++dCtlIndex )
f8c7a1 ¤   {
37f913 ¤   ¤   DCtlHandle¤ ¤   dCtl;
251b52 ¤   ¤
19d985 ¤   ¤   dCtl¤   = GetIndDCtlEntry( dCtlIndex );
56d26d ¤   ¤   if ( IsntNull( dCtl ) )
635b34 ¤   ¤   {
8876bb ¤   ¤   ¤   pgpAssert( IsntNull( *dCtl ) );
3287c7 ¤   ¤   ¤
54d1d2 ¤   ¤   ¤   if ( IsPGPDiskDriver( (**dCtl).dCtlRefNum ) )
05f776 ¤   ¤   ¤   {
abfeaa ¤   ¤   ¤   ¤   driverRefNums[ *numDrivers ]¤   = (**dCtl).dCtlRefNum;
59126b ¤   ¤   ¤   ¤   *numDrivers¤+= 1;
43a3a6 ¤   ¤   ¤   }
--8342 00018cd0c964012005d Page 16 of PGPDiskUtils.c
b50fe4 ¤   ¤   }
6b9371 ¤   }
6cefe6 }
99af5a
f06d52 ¤   void
05e4e2 GetAllPGPDrives(
de8968 ¤   short¤  ¤   driveNumbers[],
64572c ¤   ushort¤ ¤   maxDrives,
20fe86 ¤   ushort *¤   numDriveNumbers)
c5bb36 {
dc0aa3 ¤   OSStatus¤   ¤   err¤= nsDrvErr;
71bac1 ¤   const DrvQEl¤   *driveQEl = nil;
ca67c5 ¤
84fffc ¤   *numDriveNumbers¤   = 0;
3967c5 ¤
099d9c ¤   driveQEl = (const DrvQEl *)(GetDrvQHdr()->qHead);
e1a3f2 ¤   while( IsntNull( driveQEl ) && *numDriveNumbers < maxDrives)
21c7a1 ¤   {
86cfa1 ¤   ¤   if( IsPGPDiskDriver( driveQEl->dQRefNum ) )
495b34 ¤   ¤   {
e4cb2a ¤   ¤   ¤   driveNumbers[ *numDriveNumbers ]¤   = driveQEl->dQDrive;
7ec7e2 ¤   ¤   ¤   *numDriveNumbers¤   += 1;
9e0fe4 ¤   ¤   }
ac87c7 ¤   ¤   ¤
16a545 ¤   ¤   driveQEl¤   = (const DrvQEl *)(driveQEl->qLink);
0f9371 ¤   }
aeefe6 }
c267c5 ¤
2f67c5 ¤
b967c5 ¤
032811 /*___________________________________________________________________________
cd9515 ¤   Determine if there is a PGPDisk driver which already controls a PGPDisk
513d03 ¤   on a base volume.
5dc988 ___________________________________________________________________________*/
7dcd8d ¤   static Boolean
11cb89 FindPGPDiskDriverWhichUsesDriver(
7563dc ¤   short¤  ¤   baseDriverRefNum,
15a70e ¤   short *¤¤   driverRefNum )
d3bb36 {
b22670 ¤   pgpAssert( baseDriverRefNum < 0 );
ba67c5 ¤
ac0aa3 ¤   OSStatus¤   ¤   err¤= nsDrvErr;
068d80 ¤   ushort¤ ¤   ¤   numDrives;
ee1b2e ¤   const ushort¤   kMaxDrives¤ = 200;
6e7d56 ¤   short¤  ¤   ¤   driveNumbers[ kMaxDrives ];
327e91 ¤   Boolean¤¤   ¤   foundDriver¤= false;
f167c5 ¤
3f1aab ¤   *driverRefNum¤  = 0;
27af5a
832863 ¤   GetAllPGPDrives( driveNumbers, kMaxDrives, &numDrives );
65af5a
03ae64 ¤   for( ushort driveIndex = 0; driveIndex < numDrives; ++driveIndex )
f8c7a1 ¤   {
292a46 ¤   ¤   PGPDriveInfoStruct¤ info;
ab1b52 ¤   ¤
5d2865 ¤   ¤   err¤= GetPGPDriveInfo( driveNumbers[ driveIndex ], &info);
ebd798 ¤   ¤   if ( IsntErr( err ) )
f55b34 ¤   ¤   {
cdf23b ¤   ¤   ¤   short¤  tempDriverRefNum;
0c87c7 ¤   ¤   ¤
81e60d ¤   ¤   ¤   GetDriverRefNumForDrive( info.baseDriveNumberOut,
9a8f29 ¤   ¤   ¤   ¤   ¤   ¤   &tempDriverRefNum );
84f73f ¤   ¤   ¤   if ( tempDriverRefNum == baseDriverRefNum )
8bf776 ¤   ¤   ¤   {
316d37 ¤   ¤   ¤   ¤   // a match--same base drive driver as one we're looking for
eaf591 ¤   ¤   ¤   ¤   GetDriverRefNumForDrive( driveNumbers[ driveIndex ],
a35891 ¤   ¤   ¤   ¤   ¤   ¤   ¤   driverRefNum );
9cbbe3 ¤   ¤   ¤   ¤   foundDriver¤¤   = TRUE;
21f622 ¤   ¤   ¤   ¤   break;
26a3a6 ¤   ¤   ¤   }
ed0fe4 ¤   ¤   }
189371 ¤   }
--c431 000683653bd4012005d Page 17 of PGPDiskUtils.c
2a67c5 ¤
54c4cb ¤   return( foundDriver );
4aefe6 }
5267c5 ¤
e767c5 ¤
21af5a
432811 /*___________________________________________________________________________
e07343 ¤   Find a PGPDisk driver which isn't currently handling any drives
5fc988 ___________________________________________________________________________*/
9acd8d ¤   static Boolean
9ac060 FindDriverWithNoDrives( short *¤driverRefNum)
57bb36 {
fadef7 ¤   const ushort¤   kMaxDrivers¤= 200;
2dbf57 ¤   short¤  ¤   ¤   driverRefNums[ kMaxDrivers ];
8758aa ¤   ushort¤ ¤   ¤   numDrivers;
cd79f7 ¤   OSStatus¤   ¤   err¤= noErr;
7b7e91 ¤   Boolean¤¤   ¤   foundDriver¤= false;
8867c5 ¤
b61aab ¤   *driverRefNum¤  = 0;
9467c5 ¤
71e1c3 ¤   GetAllPGPDiskDrivers( driverRefNums, kMaxDrivers, &numDrivers );
3f422e ¤   for( ushort driverIndex = 0; driverIndex < numDrivers; ++driverIndex )
22c7a1 ¤   {
bcba4e ¤   ¤   PGPDriverInfoStruct¤info;
1d1b52 ¤   ¤
818dfd ¤   ¤   err¤= GetPGPDiskDriverInfo( driverRefNums[ driverIndex ], &info );
7271c4 ¤   ¤   if ( IsntErr( err ) && info.numDrivesOut == 0 )
a15b34 ¤   ¤   {
b7c128 ¤   ¤   ¤   *driverRefNum¤  = driverRefNums[ driverIndex ];
1087c7 ¤   ¤   ¤
29c769 ¤   ¤   ¤   foundDriver¤= TRUE;
f2cdcb ¤   ¤   ¤   break;
a20fe4 ¤   ¤   }
0e9371 ¤   }
6e67c5 ¤
0fc4cb ¤   return( foundDriver );
fcefe6 }
22af5a
9aaf5a
b45e9b /*__________________________________________________________________________
008dc8 ¤   Return TRUE if the driver is for a hardware device such as SCSI, IDE,
b12278 ¤   RAM disk, etc. ·Rather than have something algorithmic, just
fc415a ¤   "know about" common drivers.
c167c5 ¤
b34d1d ¤   We want to know this so we can reuse the same driver for multiple
239d98 ¤   PGPDisks without fear of our driver calling something which calls our
63d0c3 ¤   driver. ·If a driver is missing from the list, it's not a big deal;
822c69 ¤   it just means we may install another driver in some cases.
e7c988 ___________________________________________________________________________*/
b1cd8d ¤   static Boolean
67865f IsHardwareDriver( short driverRefNum )
10bb36 {
93d36c ¤   Boolean¤¤   isHardwareDriver¤   = false;
8b75f8 ¤   OSStatus¤   err¤= noErr;
fa8061 ¤   Str255¤ ¤   driverName;
c467c5 ¤
ffae21 ¤   err¤= GetDriverNameUsingRefNum( driverRefNum, driverName );
145ecc ¤   if ( IsntErr( err ) )
b5c7a1 ¤   {
814a77 ¤   ¤   static ConstStr255Param¤sKnownHardwareDrivers[] =
975b34 ¤   ¤   {
b85334 ¤   ¤   ¤   // abbreviated to the non-changing prefix of the driver name
8c9181 ¤   ¤   ¤   "\p.ASYC",¤ ¤   ¤   ¤   ¤   // Apple Drive Setup
a56911 ¤   ¤   ¤   "\p.PTAD!",¤¤   ¤   ¤   ¤   // FWB Hard Disk Toolkit
2cea04 ¤   ¤   ¤   "\p.#CharisMacSCSIBus",¤¤   // APS
3f853c ¤   ¤   ¤   "\p.SC/IOMEGA",¤¤   ¤   ¤   // zip drive and Jaz drive
8be128 ¤   ¤   ¤   "\p.EDisk",¤¤   ¤   ¤   ¤   // Apple RAM Disk
e909a8 ¤   ¤   ¤   "\p.Sony",¤ ¤   ¤   ¤   ¤   // floppy drive
6fa201 ¤   ¤   ¤   "\p.LaCie",¤¤   ¤   ¤   ¤   // SilverLining
031e6d ¤   ¤   ¤   "\p.CONLEY SCSI Driver",¤   // Apple RAID
9905cf ¤   ¤   ¤   "\p.CONLEY PCI",¤   ¤   ¤   // Conley raid 1.5
68e040 ¤   ¤   ¤   "\p.Conley PCI Driver",¤¤   // Conley raid 2.0
--6759 00040fbf79b4012005d Page 18 of PGPDiskUtils.c
5f37d1 ¤   ¤   ¤   "\p.ATADisk",¤  ¤   ¤   ¤   // Apple IDE driver
d6a105 ¤   ¤   };
ffeeb0 ¤   ¤   static const ushort¤kNumDriverNames¤=
a79313 ¤   ¤   ¤   ¤   sizeof( sKnownHardwareDrivers ) /
1d02ae ¤   ¤   ¤   ¤   ¤   sizeof(sKnownHardwareDrivers[ 0 ]);
5e1b52 ¤   ¤
ca3375 ¤   ¤   for( ushort nameIndex = 0; nameIndex < kNumDriverNames; ++nameIndex )
2d5b34 ¤   ¤   {
70fa3b ¤   ¤   ¤   ConstStr255Param¤   prefix¤ = sKnownHardwareDrivers[ nameIndex ];
f187c7 ¤   ¤   ¤
d56a02 ¤   ¤   ¤   if ( pgpMemoryEqual( &driverName[ 1 ], &prefix[ 1 ], prefix[ 0 ] ) )
20f776 ¤   ¤   ¤   {
b81cb2 ¤   ¤   ¤   ¤   isHardwareDriver¤   = TRUE;
f1f622 ¤   ¤   ¤   ¤   break;
69a3a6 ¤   ¤   ¤   }
640fe4 ¤   ¤   }
439371 ¤   }
7667c5 ¤
5cbe83 ¤   return( isHardwareDriver );
c9efe6 }
bd67c5 ¤
8a67c5 ¤
d267c5 ¤
322811 /*___________________________________________________________________________
9a9873 ¤   Find a PGPDisk driver which uses a base device whose driver is a hardware
9d822b ¤   driver.
e1c988 ___________________________________________________________________________*/
34cd8d ¤   static Boolean
c14de6 FindPGPDiskDriverWhichUsesHardwareDriver(
160df9 ¤   short *¤pgpDriverRefNumPtr)
01bb36 {
3c7e91 ¤   Boolean¤¤   ¤   foundDriver¤= false;
0f0aa3 ¤   OSStatus¤   ¤   err¤= nsDrvErr;
978d80 ¤   ushort¤ ¤   ¤   numDrives;
ac1b2e ¤   const ushort¤   kMaxDrives¤ = 200;
9a7d56 ¤   short¤  ¤   ¤   driveNumbers[ kMaxDrives ];
9967c5 ¤
f3e8ff ¤   *pgpDriverRefNumPtr¤= 0;
a5af5a
2d2863 ¤   GetAllPGPDrives( driveNumbers, kMaxDrives, &numDrives );
c0af5a
97ae64 ¤   for( ushort driveIndex = 0; driveIndex < numDrives; ++driveIndex )
06c7a1 ¤   {
672a46 ¤   ¤   PGPDriveInfoStruct¤ info;
579130 ¤   ¤   const short¤¤   ¤   pgpDriveNumber¤ = driveNumbers[ driveIndex ];
1d1b52 ¤   ¤
216924 ¤   ¤   err¤= GetPGPDriveInfo( pgpDriveNumber, &info);
13d798 ¤   ¤   if ( IsntErr( err ) )
645b34 ¤   ¤   {
dff23b ¤   ¤   ¤   short¤  tempDriverRefNum;
a887c7 ¤   ¤   ¤
4fe60d ¤   ¤   ¤   GetDriverRefNumForDrive( info.baseDriveNumberOut,
828991 ¤   ¤   ¤   ¤   ¤   &tempDriverRefNum );
5e5649 ¤   ¤   ¤   if ( IsHardwareDriver( tempDriverRefNum ) )
5af776 ¤   ¤   ¤   {
9b1db2 ¤   ¤   ¤   ¤   GetDriverRefNumForDrive( pgpDriveNumber, pgpDriverRefNumPtr );
9fbbe3 ¤   ¤   ¤   ¤   foundDriver¤¤   = TRUE;
0bf622 ¤   ¤   ¤   ¤   break;
85a3a6 ¤   ¤   ¤   }
0e0fe4 ¤   ¤   }
d09371 ¤   }
c667c5 ¤
e7c4cb ¤   return( foundDriver );
e6efe6 }
10af5a
a9af5a
b8af5a
f22811 /*___________________________________________________________________________
50c24f ¤   Is there already a PGPDisk driver installed which can handle a PGPDisk
84af15 ¤   file on the volume baseVRefNum.
24c988 ___________________________________________________________________________*/
40af5a
--3026 0006c1042fe4012005d Page 19 of PGPDiskUtils.c
5fcd8d ¤   static Boolean
54786e HaveAppropriateDriver(
5b7c29 ¤   short¤  ¤   baseVRefNum,
74d92c ¤   short *¤¤   driverRefNumPtr )
1bc7a1 ¤   {
51dd3b ¤   pgpAssert( baseVRefNum < 0 );
c767c5 ¤
c8d44d ¤   Boolean¤¤   haveDriver¤ = false;
4f75f8 ¤   OSStatus¤   err¤= noErr;
9ca403 ¤   short¤  ¤   baseDriveNumber;
d3bb45 ¤   short¤  ¤   baseDriverRefNum;
8767c5 ¤
5eac83 ¤   *driverRefNumPtr¤   = 0;
5d67c5 ¤
e8a512 ¤   // first, see if we can find a driver which controls an existing PGP disk on
ec5c19 ¤   // the same baseVRefNum
395d9a ¤   GetVolumeDriveNumberAndRefNum( baseVRefNum, &baseDriveNumber,
edcc73 ¤   ¤   ¤   ¤   &baseDriverRefNum );
fccd62 ¤   if ( FindPGPDiskDriverWhichUsesDriver( baseDriverRefNum, driverRefNumPtr) )
175b34 ¤   ¤   {
5bcc32 ¤   ¤   pgpAssert( *driverRefNumPtr < 0 );
d8b3e5 ¤   ¤   haveDriver¤ = TRUE;
370fe4 ¤   ¤   }
40207c ¤   else if ( FindDriverWithNoDrives( driverRefNumPtr ) )
f55b34 ¤   ¤   {
862974 ¤   ¤   // a driver could be installed which is not currently handling any
3051d5 ¤   ¤   // drives
5acc32 ¤   ¤   pgpAssert( *driverRefNumPtr < 0 );
dcb3e5 ¤   ¤   haveDriver¤ = TRUE;
990fe4 ¤   ¤   }
bfc222 ¤   else if ( VolumeIsPGPDisk( baseVRefNum ) )
915b34 ¤   ¤   {
f20e12 ¤   ¤   // we must create a new driver because the underlying drive is
62f65c ¤   ¤   // already a PGPDisk and there is not yet a driver loaded which is
746ebb ¤   ¤   // handling this situation
298b49 ¤   ¤   haveDriver¤ = false;
7c0fe4 ¤   ¤   }
e70e24 ¤   else
1a5b34 ¤   ¤   {
cea92a ¤   ¤   // volume is not a PGPDisk. ·It could still be a shrink-wrap volume
b723a1 ¤   ¤   // or some other volume which could reside on a PGPDisk. To prevent
b8b29c ¤   ¤   // this potential problem install a new driver unless we can reuse
99219a ¤   ¤   // a PGPDiskDriver which is based on a hardware driver.
c5fb52 ¤   ¤   if ( IsHardwareDriver( baseDriverRefNum ) )
4cf776 ¤   ¤   ¤   {
7e4c3a ¤   ¤   ¤   haveDriver¤ = FindPGPDiskDriverWhichUsesHardwareDriver(
55d31c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   driverRefNumPtr );
cba3a6 ¤   ¤   ¤   }
990fe4 ¤   ¤   }
de67c5 ¤
e7afbd ¤   return( haveDriver );
969371 ¤   }
2667c5 ¤
48af5a
28af5a
da2811 /*___________________________________________________________________________
ac7e82 ¤   Return a driver ref num which is open and available for adding drives.
33c988 ___________________________________________________________________________*/
272473 ¤   static OSStatus
37be1f SmartInstallPGPDiskDriver(
b17c29 ¤   short¤  ¤   baseVRefNum,
11d009 ¤   short *¤¤   driverRefNum)
34bb36 {
6a75f8 ¤   OSStatus¤   err¤= noErr;
1567c5 ¤
941aab ¤   *driverRefNum¤  = 0;
e867c5 ¤
2f82d6 ¤   if ( HaveAppropriateDriver( baseVRefNum, driverRefNum ) )
2bc7a1 ¤   {
e87610 ¤   ¤   err¤= noErr;
219371 ¤   }
6c0e24 ¤   else
--0dd5 000e3eaa3994012005d Page 20 of PGPDiskUtils.c
f7c7a1 ¤   {
970f07 ¤   ¤   Str255¤ newName;
10e889 ¤   ¤   // assume default driver name
24c6f0 ¤   ¤   GetUniquePGPDiskDriverName( newName );
9e1b52 ¤   ¤
e4142d ¤   ¤   err¤= GetUnusedDriverRefNum( driverRefNum );
cfd798 ¤   ¤   if ( IsntErr( err ) )
975b34 ¤   ¤   {
9fe3cc ¤   ¤   ¤   err¤= InstallNewPGPDiskDriver( newName, *driverRefNum );
a10fe4 ¤   ¤   }
0f9371 ¤   }
fcaf5a
34deb7 ¤   return( err );
8befe6 }
2daf5a
11af5a
7867c5 ¤
fb2473 ¤   static OSStatus
b98716 InstallPGPGestalt(void)
17bb36 {
4a6792 ¤   OSStatus¤   err = noErr;
fec42d ¤   long¤   ¤   dummyResult;
7367c5 ¤
f72da1 ¤   // Install our gestalt selector and globals if they are not already
5f86b0 ¤   // present
1b67c5 ¤
d3fd83 ¤   if( IsErr( Gestalt( gestaltPGPDisk, &dummyResult ) ) )
c6c7a1 ¤   {
66bfec ¤   ¤   Handle¤ gestaltCodeHandle;
d4cd4f ¤   ¤   THz¤¤   saveZone;
7587c7 ¤   ¤   ¤
cb9a47 ¤   ¤   saveZone = GetZone();
cfd812 ¤   ¤   SetZone( SystemZone() );
411b52 ¤   ¤
37cba0 ¤   ¤   gestaltCodeHandle = Get1Resource( kGestaltProcResType,
330211 ¤   ¤   ¤   ¤   ¤   kGestaltProcResID );
9a5ebf ¤   ¤   if( IsntNull( gestaltCodeHandle ) )
265b34 ¤   ¤   {
9430d0 ¤   ¤   ¤   DetachResource( gestaltCodeHandle );
e42340 ¤   ¤   ¤   MacLeaks_ForgetHandle( gestaltCodeHandle,
ab91be ¤   ¤   ¤   ¤   ¤   ¤   kMacLeaks_DisposeHandleDeallocType );
9f87c7 ¤   ¤   ¤
85ae25 ¤   ¤   ¤   HLock( gestaltCodeHandle );
5987c7 ¤   ¤   ¤
a25cfb ¤   ¤   ¤   err = CallGestaltInstallProc(
b2e9c7 ¤   ¤   ¤   ¤   ¤   ¤   (InstallGestaltUPP) *gestaltCodeHandle );
1b6108 ¤   ¤   ¤   if( IsntErr( err ) )
4af776 ¤   ¤   ¤   {
23cf19 ¤   ¤   ¤   ¤   err = Gestalt( gestaltPGPDisk, &dummyResult );
16a3a6 ¤   ¤   ¤   }
f70fe4 ¤   ¤   }
a80e1d ¤   ¤   else
e95b34 ¤   ¤   {
817cd5 ¤   ¤   ¤   err = ForceResError( resNotFound );
8c0fe4 ¤   ¤   }
f01b52 ¤   ¤
5e86a0 ¤   ¤   SetZone( saveZone );
979371 ¤   }
bfaf5a
ebdeb7 ¤   return( err );
b0efe6 }
92af5a
6f2473 ¤   static OSStatus
dec09f DoMountFailedDialog(ConstStr255Param diskFileName)
a6bb36 {
b52e6d ¤   Str255¤ ¤   msg;
ab4d7b ¤   MessageT¤   result;
746792 ¤   OSStatus¤   err = noErr;
2567c5 ¤
631462 ¤   GetIndString( msg, kErrorStringListResID,
920945 ¤   ¤   ¤   kQueryAllowUnmountedVolumeStrIndex );
e39eaa ¤   PrintPString( msg, msg, diskFileName );
--4ddc 000e271d9484012005d Page 21 of PGPDiskUtils.c
90a4ab ¤   ·
993fe4 ¤   SysBeep( 1 );
a367c5 ¤
88367c ¤   result = CWarningAlert::Display( kWACautionAlertType, kWACancelOKStyle,
9ca656 ¤   ¤   ¤   ¤   ¤   msg );
c186ac ¤   if( result == msg_OK )
15c7a1 ¤   {
d75b5c ¤   ¤   GetIndString( msg, kErrorStringListResID,
d1b4e5 ¤   ¤   ¤   ¤   kConfirmAllowUnmountedVolumeStrIndex );
dd86fa ¤   ¤   PrintPString( msg, msg, diskFileName );
85a4ab ¤   ·
a3057e ¤   ¤   SysBeep( 1 );
ac1b52 ¤   ¤
8962ec ¤   ¤   result = CWarningAlert::Display( kWACautionAlertType,
7bde9e ¤   ¤   ¤   ¤   ¤   ¤   kWACancelOKStyle, msg );
559371 ¤   }
5e67c5 ¤
4d86ac ¤   if( result == msg_OK )
c7c7a1 ¤   {
c0647a ¤   ¤   err = noErr;
b49371 ¤   }
770e24 ¤   else
33c7a1 ¤   {
3e401b ¤   ¤   err = userCanceledErr;
bb9371 ¤   }
bc67c5 ¤
d3deb7 ¤   return( err );
1eefe6 }
d7af5a
2385b7 ¤   CComboError
cdb35b MountPGPDisk(
876242 ¤   const FSSpec *¤ ¤   ¤   ¤   fileSpec,
d1baa0 ¤   Boolean ¤   ¤   ¤   ¤   ¤   firstTime,
c64440 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mountReadOnly,
e5c1e5 ¤   ConstStr255Param¤   ¤   ¤   passphrase,
5101e7 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   allowRecoveryUI,
d7c675 ¤   ConstStr255Param¤   ¤   ¤   newVolumeName,
44b4f9 ¤   MountDiskProgressProcPtr¤   progressProc,
849368 ¤   void¤   ¤   ¤   ¤   ¤   ¤   *progressUserValue)
07bb36 {
3a22ec ¤   short¤  ¤   ¤   ¤   driveNum = 0;
dc5f2e ¤   short¤  ¤   ¤   ¤   driverRefNum = 0;
022905 ¤   short¤  ¤   ¤   ¤   fileRefNum¤ = 0;
84add8 ¤   CComboError¤¤   ¤   err;
411f22 ¤   PGPDiskFileInfo¤¤   fileInfo;
8b67c5 ¤
750021 ¤   AssertSpecIsValid( fileSpec, "MountPGPDisk" );
dd8da6 ¤   pgpAssertAddrValid( passphrase, uchar );
e667c5 ¤
0aff84 ¤   (void)FlushVol( nil, fileSpec->vRefNum );
3b67c5 ¤
c376e2 ¤   // Validate mount request
cecb01 ¤   err.err = GetPGPDiskFileInfo( fileSpec, &fileInfo );
29d3cb ¤   if( err.IsntError() )
36c7a1 ¤   {
fa8dbd ¤   ¤   if( fileInfo.fileIsOpen )
975b34 ¤   ¤   {
bc7e87 ¤   ¤   ¤   if( fileInfo.fileIsInUseByDriver )
49f776 ¤   ¤   ¤   {
06a965 ¤   ¤   ¤   ¤   if( fileInfo.fileIsMounted )
dd72c3 ¤   ¤   ¤   ¤   {
fe703e ¤   ¤   ¤   ¤   ¤   err.err = kPGPDiskFileInUseByDriverError;
a42613 ¤   ¤   ¤   ¤   }
6bfa07 ¤   ¤   ¤   ¤   else
3a72c3 ¤   ¤   ¤   ¤   {
22f895 ¤   ¤   ¤   ¤   ¤   // This is the window case where the volume had been
7fe4f2 ¤   ¤   ¤   ¤   ¤   // unmounted, but the drive queue element has not been
de4972 ¤   ¤   ¤   ¤   ¤   // deleted yet. If the user is attempting to open the file
8f1abe ¤   ¤   ¤   ¤   ¤   // again, then just try to mount the disk.
65ae30 ¤   ¤   ¤   ¤   ¤
883b5c ¤   ¤   ¤   ¤   ¤   ParamBlockRec¤  pb;
e2ae30 ¤   ¤   ¤   ¤   ¤
--3b19 0000b9411834012005d Page 22 of PGPDiskUtils.c
80b678 ¤   ¤   ¤   ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
35ae30 ¤   ¤   ¤   ¤   ¤
570df0 ¤   ¤   ¤   ¤   ¤   pb.volumeParam.ioVRefNum = fileInfo.fileDriveNumber;
8fae30 ¤   ¤   ¤   ¤   ¤
ee35f9 ¤   ¤   ¤   ¤   ¤   err.err = PBMountVol( &pb );
d6e31f ¤   ¤   ¤   ¤   ¤   if( err.IsError() && allowRecoveryUI )
764859 ¤   ¤   ¤   ¤   ¤   {
84e80d ¤   ¤   ¤   ¤   ¤   ¤   err.err = DoMountFailedDialog( fileSpec->name );
c71c89 ¤   ¤   ¤   ¤   ¤   }
2dae30 ¤   ¤   ¤   ¤   ¤
ca66b2 ¤   ¤   ¤   ¤   ¤   goto Exit;
a82613 ¤   ¤   ¤   ¤   }
6ba3a6 ¤   ¤   ¤   }
a1bb8c ¤   ¤   ¤   else
eff776 ¤   ¤   ¤   {
c42321 ¤   ¤   ¤   ¤   err.err = kPGPDiskFileAlreadyOpenError;
a0a3a6 ¤   ¤   ¤   }
e40fe4 ¤   ¤   }
251b52 ¤   ¤
217072 ¤   ¤   if( fileInfo.fileIsOnLockedVolume || fileInfo.fileIsLocked )
cd5b34 ¤   ¤   {
1bb2c5 ¤   ¤   ¤   mountReadOnly = TRUE;
320fe4 ¤   ¤   }
f89371 ¤   }
d8af5a
97a18e ¤   // Validate the headers¤and passphrase¤
7bed80 ¤   if ( err.IsntError() )
c4c7a1 ¤   {
3f254f ¤   ¤   PGPDiskFileRef¤ diskFileRef;
ad0f47 ¤   ¤   AddDriveStruct¤ addInfo;
97126a ¤   ¤   CMemoryWiper¤   addInfoWiper( &addInfo, sizeof( addInfo ) );
8a1b52 ¤   ¤
95fa34 ¤   ¤   pgpClearMemory( &addInfo, sizeof( addInfo ) );
261b52 ¤   ¤
b50936 ¤   ¤   err.err = OpenPGPDiskFile( fileSpec, &diskFileRef );
2b5a9f ¤   ¤   if( err.IsntError() )
a45b34 ¤   ¤   {
6443e7 ¤   ¤   ¤   PGPDiskKeyRef¤  keyRef;
d587c7 ¤   ¤   ¤
f83656 ¤   ¤   ¤   err = FindPGPDiskKey( diskFileRef, passphrase, &keyRef );
b06d97 ¤   ¤   ¤   if( err.IsntError() )
13f776 ¤   ¤   ¤   {
48cbc5 ¤   ¤   ¤   ¤   if( ! mountReadOnly )
5972c3 ¤   ¤   ¤   ¤   {
df1ae1 ¤   ¤   ¤   ¤   ¤   err.err = GetPGPDiskKeyBoolean( keyRef,
b4607f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskKeyProperty_MountReadOnly,
fe89b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mountReadOnly );
30535f ¤   ¤   ¤   ¤   }¤  ¤
dfaf5a
713424 ¤   ¤   ¤   ¤   if ( err.IsntError() )
f972c3 ¤   ¤   ¤   ¤   {
5b7537 ¤   ¤   ¤   ¤   ¤   volatile HParamBlockRec¤pb;
f8ae30 ¤   ¤   ¤   ¤   ¤
76096d ¤   ¤   ¤   ¤   ¤   pgpClearMemory( (void *) &pb, sizeof( pb ) );
19ae30 ¤   ¤   ¤   ¤   ¤
f9a469 ¤   ¤   ¤   ¤   ¤   pb.ioParam.ioVRefNum¤   = fileSpec->vRefNum;
ec4ed7 ¤   ¤   ¤   ¤   ¤   pb.fileParam.ioDirID¤   = fileSpec->parID;
0704d4 ¤   ¤   ¤   ¤   ¤   pb.ioParam.ioNamePtr¤   = (uchar *)fileSpec->name;
856995 ¤   ¤   ¤   ¤   ¤   pb.ioParam.ioPermssn¤   = fsRdPerm;
39ae30 ¤   ¤   ¤   ¤   ¤
64d413 ¤   ¤   ¤   ¤   ¤   // open async so it's not tracked to this application;
a66d57 ¤   ¤   ¤   ¤   ¤   // it must remain open
bccb0b ¤   ¤   ¤   ¤   ¤   (void)PBHOpenDFAsync( (HParamBlockRec *) &pb );
15ae30 ¤   ¤   ¤   ¤   ¤
fa02f8 ¤   ¤   ¤   ¤   ¤   while ( pb.ioParam.ioResult == 1 ·)
254859 ¤   ¤   ¤   ¤   ¤   {
ee7433 ¤   ¤   ¤   ¤   ¤   ¤   // wait till done
a41c89 ¤   ¤   ¤   ¤   ¤   }
a1af5a
a319fe ¤   ¤   ¤   ¤   ¤   err.err ¤   ¤   = pb.ioParam.ioResult;
d8770e ¤   ¤   ¤   ¤   ¤   fileRefNum ¤= pb.ioParam.ioRefNum;¤
0b2613 ¤   ¤   ¤   ¤   }
--0c2a 00005a1c7ba4012005d Page 23 of PGPDiskUtils.c
d6ae30 ¤   ¤   ¤   ¤   ¤
986c1b ¤   ¤   ¤   #if BETA
3ed572 ¤   ¤   ¤   ¤   if ( BetaExpired() )
ce72c3 ¤   ¤   ¤   ¤   {
c16158 ¤   ¤   ¤   ¤   ¤   mountReadOnly = TRUE;
402613 ¤   ¤   ¤   ¤   }
0734f5 ¤   ¤   ¤   #endif
aaaf5a
f33424 ¤   ¤   ¤   ¤   if ( err.IsntError() )
d772c3 ¤   ¤   ¤   ¤   {
6952e3 ¤   ¤   ¤   ¤   ¤   GetMediaAndPhysicalIcons( &addInfo.mediaIcon,
b20b4f ¤   ¤   ¤   ¤   ¤   ¤   ¤   &addInfo.physicalIcon );
55ae30 ¤   ¤   ¤   ¤   ¤
aa737c ¤   ¤   ¤   ¤   ¤   err = AddInfoForFile( diskFileRef, keyRef, fileRefNum,
908448 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &addInfo, mountReadOnly, passphrase );
702613 ¤   ¤   ¤   ¤   }
862b85 ¤   ¤   ¤   ¤
fdfbeb ¤   ¤   ¤   ¤   DisposePGPDiskKey( keyRef );
23a3a6 ¤   ¤   ¤   }
9487c7 ¤   ¤   ¤
66ac33 ¤   ¤   ¤   ClosePGPDiskFile( diskFileRef );
940fe4 ¤   ¤   }
2087c7 ¤   ¤   ¤
8ef9a8 ¤   ¤   if ( err.IsntError() )
695b34 ¤   ¤   {
3c5967 ¤   ¤   ¤   err.err = InstallPGPGestalt();
bc0fe4 ¤   ¤   }
92af5a
25f9a8 ¤   ¤   if ( err.IsntError() )
cb5b34 ¤   ¤   {
d035c0 ¤   ¤   ¤   err.err = SmartInstallPGPDiskDriver( fileSpec->vRefNum,
d0b5a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &driverRefNum);
650fe4 ¤   ¤   }
492b85 ¤   ¤   ¤   ¤
cef9a8 ¤   ¤   if ( err.IsntError() )
b25b34 ¤   ¤   {
1f75f5 ¤   ¤   ¤   ParamBlockRec¤  pb;
0ddb96 ¤   ¤   ¤   Boolean¤¤   ¤   fileIsOnPGPDisk;
ea87c7 ¤   ¤   ¤
316f58 ¤   ¤   ¤   // if this driver sits on top of another PGPDisk,
8a017d ¤   ¤   ¤   // then reduce its memory requirements
47dc24 ¤   ¤   ¤   fileIsOnPGPDisk = VolumeIsPGPDisk( fileSpec->vRefNum );
0e8193 ¤   ¤   ¤   addInfo.minimizeWriteBufferSize¤= fileIsOnPGPDisk;
1a87c7 ¤   ¤   ¤
5735f6 ¤   ¤   ¤   if ( fileIsOnPGPDisk )
07f776 ¤   ¤   ¤   {
a115df ¤   ¤   ¤   ¤   addInfo.shouldBreakUpRequests¤  = false;
74a3a6 ¤   ¤   ¤   }
f1bb8c ¤   ¤   ¤   else
1ef776 ¤   ¤   ¤   {
243444 ¤   ¤   ¤   ¤   short¤  ¤   ¤   baseDriveNumber;
e08d6e ¤   ¤   ¤   ¤   short¤  ¤   ¤   baseDriverRefNum;
e92b85 ¤   ¤   ¤   ¤
322a44 ¤   ¤   ¤   ¤   GetVolumeDriveNumberAndRefNum( fileSpec->vRefNum,
565392 ¤   ¤   ¤   ¤   ¤   ¤   &baseDriveNumber, &baseDriverRefNum );
200503 ¤   ¤   ¤   ¤   addInfo.shouldBreakUpRequests =
252be5 ¤   ¤   ¤   ¤   ¤   ¤   ShouldBreakUpRequestsToDriver( baseDriveNumber,
d55e1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   baseDriverRefNum );
e0a3a6 ¤   ¤   ¤   }
b487c7 ¤   ¤   ¤
c01ff4 ¤   ¤   ¤   GetPrefsFileSpec( &addInfo.prefsSpec );
b787c7 ¤   ¤   ¤
a3dcee ¤   ¤   ¤   err.err = PGPDiskControl( &pb, kAddDriveCC, (long)&addInfo,
bb5ec5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   driverRefNum);
466d97 ¤   ¤   ¤   if( err.IsntError() )
c1f776 ¤   ¤   ¤   {
7c0fd9 ¤   ¤   ¤   ¤   driveNum = addInfo.resultDriveNumber;
64a3a6 ¤   ¤   ¤   }
8e0fe4 ¤   ¤   }
031b52 ¤   ¤
9df9a8 ¤   ¤   if ( err.IsntError() )
055b34 ¤   ¤   {
--680f 000d6e57bfb4012005d Page 24 of PGPDiskUtils.c
015bef ¤   ¤   ¤   if(firstTime)
1ef776 ¤   ¤   ¤   {
2f610b ¤   ¤   ¤   ¤   err.err = WipeDiskUsingDrive( driveNum, driverRefNum,
9e5233 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   addInfo.numBlocks, progressProc,
70508d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   progressUserValue );
e43424 ¤   ¤   ¤   ¤   if ( err.IsntError() )
b572c3 ¤   ¤   ¤   ¤   {
c12c8e ¤   ¤   ¤   ¤   ¤   err.err = DIZero( driveNum, newVolumeName );
ad86ed ¤   ¤   ¤   ¤   ¤   AssertNoErr( err.err, "MountPGPDisk: DIZero" );
4b2613 ¤   ¤   ¤   ¤   }
e3a3a6 ¤   ¤   ¤   }
3ebb8c ¤   ¤   ¤   else
f2f776 ¤   ¤   ¤   {
60fe09 ¤   ¤   ¤   ¤   ParamBlockRec¤  pb;
f92b85 ¤   ¤   ¤   ¤
d3febe ¤   ¤   ¤   ¤   // Mount the disk. ·This is where the OS takes over.
3b4efe ¤   ¤   ¤   ¤   pb.volumeParam.ioCompletion¤= nil;
996492 ¤   ¤   ¤   ¤   pb.volumeParam.ioVRefNum¤   = driveNum;
0dc984 ¤   ¤   ¤   ¤   err.err¤= PBMountVol( &pb );
046234 ¤   ¤   ¤   ¤   AssertNoErr( err.err, "error from PBMountVol" );
b487c7 ¤   ¤   ¤
12e424 ¤   ¤   ¤   ¤   if( err.IsError() && allowRecoveryUI )
a472c3 ¤   ¤   ¤   ¤   {
91ef7b ¤   ¤   ¤   ¤   ¤   err.err = DoMountFailedDialog( fileSpec->name );
fc2613 ¤   ¤   ¤   ¤   }
22a3a6 ¤   ¤   ¤   }
052b85 ¤   ¤   ¤   ¤
4275d7 ¤   ¤   ¤   if ( err.IsntError() )
55f776 ¤   ¤   ¤   {
25d10c ¤   ¤   ¤   ¤   (void)CopyCustomVolumeIconToDrive( driveNum );
f3a3a6 ¤   ¤   ¤   }
c50fe4 ¤   ¤   }
a467c5 ¤
2928d1 ¤   ¤   FreeDiskExtentList( (DiskExtent *) addInfo.extents );
239371 ¤   }
ed67c5 ¤
933e33 Exit:
8b1b52 ¤   ¤
9f08e8 ¤   // Remove all traces of an error if we encountered a problem
a9b219 ¤   if( err.IsError() )
7ec7a1 ¤   {
524448 ¤   ¤   if( driveNum > 0 )
d75b34 ¤   ¤   {
c8002c ¤   ¤   ¤   (void)PGPDriverRemoveDrive( driverRefNum, driveNum );
ce0fe4 ¤   ¤   }
31af5a
2303c2 ¤   ¤   if( fileRefNum > 0 )
035b34 ¤   ¤   {
693c3a ¤   ¤   ¤   FSClose( fileRefNum );
5a0fe4 ¤   ¤   }
c81b52 ¤   ¤
73a0ce ¤   ¤   if ( firstTime )
a75b34 ¤   ¤   {
a60938 ¤   ¤   ¤   FSpDelete( fileSpec );
df0fe4 ¤   ¤   }
169371 ¤   }
08af5a
ad048b ¤   pgpAssertMsg( err.IsntError() || err.IsCancelError(), "MountPGPDisk" );
4567c5 ¤
c4d4f2 ¤   FlushVol( nil, fileSpec->vRefNum );
f467c5 ¤
c15ea8 ¤   return err;
5befe6 }
74af5a
f0af5a
0e2811 /*___________________________________________________________________________
12e20a ¤   Remove one of the alternate passphrases. ·The master passphrase cannot be
bea812 ¤   removed.
42c988 ___________________________________________________________________________*/
d7af5a
8685ea ¤   OSStatus
d6c738 RemovePassphrase(
--3edd 00056059c1f4012005d Page 25 of PGPDiskUtils.c
081e25 ¤   const FSSpec *¤ ¤   fileSpec,
1d0726 ¤   ConstStr255Param¤   passphrase)
30bb36 {
05156f ¤   OSStatus¤   ¤   err;
7e1827 ¤   PGPDiskFileRef¤ diskFileRef;
d767c5 ¤
1e13b0 ¤   AssertSpecIsValid( fileSpec, "RemovePassphrase" );
ac8da6 ¤   pgpAssertAddrValid( passphrase, uchar );
d067c5 ¤
31cca6 ¤   err = OpenPGPDiskFile( fileSpec, &diskFileRef );
59ee03 ¤   if( IsntErr( err ) )
abc7a1 ¤   {
55c81b ¤   ¤   PGPDiskKeyRef¤  keyRef;
611b52 ¤   ¤
eb8489 ¤   ¤   err = FindPassphrasePGPDiskKey( diskFileRef, passphrase, &keyRef );
27da5e ¤   ¤   if( IsntErr( err ) )
3a5b34 ¤   ¤   {
68c3dd ¤   ¤   ¤   Boolean¤isMasterKey;
9687c7 ¤   ¤   ¤
0fec03 ¤   ¤   ¤   err = GetPGPDiskKeyBoolean( keyRef,
ab5b12 ¤   ¤   ¤   ¤   ¤   ¤   kPGPDiskKeyProperty_IsMasterKey, &isMasterKey );
ea6108 ¤   ¤   ¤   if( IsntErr( err ) )
37f776 ¤   ¤   ¤   {
d2f3ee ¤   ¤   ¤   ¤   if( ! isMasterKey )
8e72c3 ¤   ¤   ¤   ¤   {
7b9f6c ¤   ¤   ¤   ¤   ¤   err = RemovePGPDiskKey( keyRef );
58598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
f74859 ¤   ¤   ¤   ¤   ¤   {
95c8e8 ¤   ¤   ¤   ¤   ¤   ¤   err = SavePGPDiskFile( diskFileRef );
331c89 ¤   ¤   ¤   ¤   ¤   }
ad2613 ¤   ¤   ¤   ¤   }
bcfa07 ¤   ¤   ¤   ¤   else
d872c3 ¤   ¤   ¤   ¤   {
5f9d56 ¤   ¤   ¤   ¤   ¤   err = kPGPDiskMasterPassphraseError;
d42613 ¤   ¤   ¤   ¤   }
5ea3a6 ¤   ¤   ¤   }
6b87c7 ¤   ¤   ¤
12fd53 ¤   ¤   ¤   DisposePGPDiskKey( keyRef );
d90fe4 ¤   ¤   }
2a67c5 ¤
b6aa8b ¤   ¤   ClosePGPDiskFile( diskFileRef );
c99371 ¤   }
0f67c5 ¤
63deb7 ¤   return( err );
e6efe6 }
81af5a
ca2811 /*___________________________________________________________________________
59d8fa ¤   Remove all of the alternate passphrases. ·The master passphrase cannot be
b0a812 ¤   removed.
c3c988 ___________________________________________________________________________*/
3b85ea ¤   OSStatus
4882b7 RemoveAlternatePassphrases(const FSSpec *fileSpec)
66bb36 {
d2156f ¤   OSStatus¤   ¤   err;
c91827 ¤   PGPDiskFileRef¤ diskFileRef;
e367c5 ¤
1bcca6 ¤   err = OpenPGPDiskFile( fileSpec, &diskFileRef );
f0ee03 ¤   if( IsntErr( err ) )
97c7a1 ¤   {
d131eb ¤   ¤   while( IsntErr( err ) )
7a5b34 ¤   ¤   {
4243e7 ¤   ¤   ¤   PGPDiskKeyRef¤  keyRef;
1787c7 ¤   ¤   ¤
033919 ¤   ¤   ¤   // Always fetch index 1 (first non-master passphrase) as we're
1656c4 ¤   ¤   ¤   // deleting entries.
f787c7 ¤   ¤   ¤
0681d2 ¤   ¤   ¤   err = GetIndPassphrasePGPDiskKey( diskFileRef, 1, &keyRef );
e96108 ¤   ¤   ¤   if( IsntErr( err ) )
16f776 ¤   ¤   ¤   {
d1316d ¤   ¤   ¤   ¤   err = RemovePGPDiskKey( keyRef );
ef2b85 ¤   ¤   ¤   ¤
56fbeb ¤   ¤   ¤   ¤   DisposePGPDiskKey( keyRef );
--b569 0006b6b66ae4012005d Page 26 of PGPDiskUtils.c
cfa3a6 ¤   ¤   ¤   }
290fe4 ¤   ¤   }
c51b52 ¤   ¤
34918d ¤   ¤   if( err == kEndOfKeyIterationError )
eb5b34 ¤   ¤   {
3d879e ¤   ¤   ¤   err = SavePGPDiskFile( diskFileRef );
920fe4 ¤   ¤   }
0c1b52 ¤   ¤
a7aa8b ¤   ¤   ClosePGPDiskFile( diskFileRef );
8e9371 ¤   }
2067c5 ¤
a8deb7 ¤   return( err );
c2efe6 }
72af5a
f085ea ¤   OSStatus
14c94f AddPassphrase(
831e25 ¤   const FSSpec *¤ ¤   fileSpec,
5a024a ¤   ConstStr255Param¤   masterPassphrase,
5b5a09 ¤   ConstStr255Param¤   newPassphrase,
d5e9f4 ¤   Boolean¤¤   ¤   ¤   readOnly )
84bb36 {
14156f ¤   OSStatus¤   ¤   err;
ee1827 ¤   PGPDiskFileRef¤ diskFileRef;
0067c5 ¤
3acca6 ¤   err = OpenPGPDiskFile( fileSpec, &diskFileRef );
31ee03 ¤   if( IsntErr( err ) )
28c7a1 ¤   {
79acf4 ¤   ¤   err = AddPassphrasePGPDiskKey(diskFileRef, masterPassphrase,
5fbc9b ¤   ¤   ¤   ¤   ¤   newPassphrase, readOnly );
fdda5e ¤   ¤   if( IsntErr( err ) )
3b5b34 ¤   ¤   {
33879e ¤   ¤   ¤   err = SavePGPDiskFile( diskFileRef );
b90fe4 ¤   ¤   }
ad1b52 ¤   ¤
dcaa8b ¤   ¤   ClosePGPDiskFile( diskFileRef );
759371 ¤   }
e467c5 ¤
f4deb7 ¤   return( err );
37efe6 }
71af5a
23af5a
04d140 ¤   static OSErr
9de8d5 FSWipeBytesUsingDriver(
d10631 ¤   short¤  fileRef,
858228 ¤   UInt32¤ startOffset,
173926 ¤   UInt32¤ numBytes,
f850c3 ¤   uchar¤  wipeChar )
d5bb36 {
3375f8 ¤   OSStatus¤   err¤= noErr;
4467c5 ¤
194287 ¤   err¤= SetFPos( fileRef, fsFromStart, startOffset );
505ecc ¤   if ( IsntErr( err ) )
a4c7a1 ¤   {
24cad7 ¤   ¤   void *¤ ¤   buffer¤ = nil;
d92fde ¤   ¤   UInt32¤ ¤   bufferSize;
4504ec ¤   ¤   uchar¤  ¤   emergencyBuffer[ 512 ];
fbc921 ¤   ¤   Boolean¤¤   disposeBuffer¤  = false;
3c2491 ¤   ¤   UInt32¤ ¤   remaining;
9f331d ¤   ¤   UInt32¤ ¤   writeOffset;
ae1b52 ¤   ¤
951b12 ¤   ¤   buffer¤ = pgpNewPtrMost( numBytes, MIN( 512, numBytes ),
029253 ¤   ¤   ¤   ¤   ¤   kMacMemory_PreferTempMem | kMacMemory_UseApplicationHeap,
edb07b ¤   ¤   ¤   ¤   ¤   &bufferSize );
62709c ¤   ¤   if ( IsntNull( buffer ) )
815b34 ¤   ¤   {
e3ef61 ¤   ¤   ¤   disposeBuffer¤  = TRUE;
9b0fe4 ¤   ¤   }
610e1d ¤   ¤   else
635b34 ¤   ¤   {
6d37db ¤   ¤   ¤   buffer¤ ¤   = &emergencyBuffer[ 0 ];
b40470 ¤   ¤   ¤   bufferSize¤ = sizeof( emergencyBuffer );
6b0fe4 ¤   ¤   }
--cc08 000e3f7fa0f4012005d Page 27 of PGPDiskUtils.c
f11b52 ¤   ¤
4b1b52 ¤   ¤
5265b9 ¤   ¤   pgpFillMemory( buffer, bufferSize, wipeChar );
be1b52 ¤   ¤
8c4e33 ¤   ¤   writeOffset¤= startOffset;
de2385 ¤   ¤   remaining¤  = numBytes;
ebba61 ¤   ¤   while( remaining != 0 )
af5b34 ¤   ¤   {
539a83 ¤   ¤   ¤   long¤   count;
1587c7 ¤   ¤   ¤
bdc291 ¤   ¤   ¤   count¤  = MIN( remaining, bufferSize );
463004 ¤   ¤   ¤   err¤= FSWriteFileUsingDriver( fileRef, writeOffset, count, buffer,
f33642 ¤   ¤   ¤   ¤   ¤   ¤   nil );
1221aa ¤   ¤   ¤   if ( IsErr( err ) )
76f622 ¤   ¤   ¤   ¤   break;
8e2b85 ¤   ¤   ¤   ¤
6ae906 ¤   ¤   ¤   remaining¤  -= count;
1f986d ¤   ¤   ¤   writeOffset¤+= count;
ae0fe4 ¤   ¤   }
e11b52 ¤   ¤
4597af ¤   ¤   if ( disposeBuffer )
425b34 ¤   ¤   {
b7f40a ¤   ¤   ¤   pgpFreeMac( buffer );
ea0fe4 ¤   ¤   }
509371 ¤   }
aa67c5 ¤
dedeb7 ¤   return( err );
0defe6 }
f2af5a
24af5a
dc85ea ¤   OSStatus
bd8a40 VerifyPGPDiskFileIsModifiable(const FSSpec *fileSpec)
2dbb36 {
9f1f22 ¤   PGPDiskFileInfo¤¤   fileInfo;
238737 ¤   OSStatus¤   ¤   ¤   err;
be67c5 ¤
7e2824 ¤   err = GetPGPDiskFileInfo( fileSpec, &fileInfo );
03ee03 ¤   if( IsntErr( err ) )
7cc7a1 ¤   {
fd8dbd ¤   ¤   if( fileInfo.fileIsOpen )
195b34 ¤   ¤   {
237e87 ¤   ¤   ¤   if( fileInfo.fileIsInUseByDriver )
d6f776 ¤   ¤   ¤   {
c916f8 ¤   ¤   ¤   ¤   ·err = kPGPDiskFileInUseByDriverError;
8aa3a6 ¤   ¤   ¤   }
02bb8c ¤   ¤   ¤   else
0df776 ¤   ¤   ¤   {
bfccd5 ¤   ¤   ¤   ¤   err = kPGPDiskFileAlreadyOpenError;
4aa3a6 ¤   ¤   ¤   }
d10fe4 ¤   ¤   }
2d4ecf ¤   ¤   else if( fileInfo.fileIsLocked )
065b34 ¤   ¤   {
3bf7d5 ¤   ¤   ¤   err = kPGPDiskFileLockedError;
be0fe4 ¤   ¤   }
f1852c ¤   ¤   else if( fileInfo.fileIsOnLockedVolume )
bc5b34 ¤   ¤   {
e2176a ¤   ¤   ¤   err = kPGPDiskFileOnLockedVolumeError;
010fe4 ¤   ¤   }
489371 ¤   }
9b67c5 ¤
1fdeb7 ¤   return( err );
3cefe6 }
e4af5a
f7d849 //¤ Gets the error string for the error err assuming a phrasing such as
7d8caa // ¤Couldn't do X because Y, where Y is the error string.
5aaf5a
076d52 ¤   void
26570d GetErrorString(OSStatus err, StringPtr errorStr)
bfbb36 {
09995f ¤   pgpAssertAddrValid( errorStr, uchar );
95ab0d ¤   pgpAssert( err != noErr && err != userCanceledErr );
e367c5 ¤
--402d 00058a8d8324012005d Page 28 of PGPDiskUtils.c
613b91 ¤   errorStr[0] = 0;
f367c5 ¤
b984aa ¤   if( err > 0 )
c5c7a1 ¤   {
7eb752 ¤   ¤   short¤  strIndex = 0;
881b52 ¤   ¤
2123e0 ¤   ¤   // Application specific errors
6f67c5 ¤
0cdf4e ¤   ¤   switch( err )
235b34 ¤   ¤   {
bc73b7 ¤   ¤   ¤   case kPGPDiskInvalidFileHeaderError:
92d564 ¤   ¤   ¤   case kPGPDiskUnknownFileKindError:
907ccb ¤   ¤   ¤   case kPGPDiskUnknownAlgorithmError:
afa2d2 ¤   ¤   ¤   ¤   strIndex = kNotAValidPGPDiskFileStrIndex;
58f622 ¤   ¤   ¤   ¤   break;
b0af5a
7450b1 ¤   ¤   ¤   case kPGPDiskNewerFileVersionError:
e9cdb1 ¤   ¤   ¤   ¤   strIndex = kPGPDiskFileCreatedByNewerVersionStrIndex;
adf622 ¤   ¤   ¤   ¤   break;
f4af5a
1c2568 ¤   ¤   ¤   case kPGPDiskRemoteVolumeTypeError:
9d149e ¤   ¤   ¤   case kPGPDiskForeignVolumeTypeError:
942484 ¤   ¤   ¤   ¤   strIndex = kVolumeRemoteOrForeignStrIndex;
d6f622 ¤   ¤   ¤   ¤   break;
0c87c7 ¤   ¤   ¤
b485f7 ¤   ¤   ¤   case kPGPDiskIncorrectPassphraseError:
55345a ¤   ¤   ¤   ¤   strIndex = kIncorrectPassphraseStrIndex;
a0f622 ¤   ¤   ¤   ¤   break;
9aaf5a
cda132 ¤   ¤   ¤   case kPGPDiskMasterPassphraseError:
ae8107 ¤   ¤   ¤   ¤   strIndex = kMasterPassphraseStrIndex;
91f622 ¤   ¤   ¤   ¤   break;
8f87c7 ¤   ¤   ¤
2ef3c2 ¤   ¤   ¤   case kPGPDiskFileInUseByDriverError:
01ae13 ¤   ¤   ¤   ¤   strIndex = kPGPDiskFileMountedStrIndex;
7cf622 ¤   ¤   ¤   ¤   break;
fe2b85 ¤   ¤   ¤   ¤
461ec5 ¤   ¤   ¤   case kPGPDiskFileAlreadyOpenError:
4ab130 ¤   ¤   ¤   ¤   strIndex = kPGPDiskFileBusyStrIndex;
89f622 ¤   ¤   ¤   ¤   break;
3187c7 ¤   ¤   ¤
3b0c85 ¤   ¤   ¤   case kPGPDiskFileLockedError:
d52742 ¤   ¤   ¤   ¤   strIndex = kPGPDiskFileLockedStrIndex;
60f622 ¤   ¤   ¤   ¤   break;
d02b85 ¤   ¤   ¤   ¤
29fdcf ¤   ¤   ¤   case kPGPDiskFileOnLockedVolumeError:
9ff2f4 ¤   ¤   ¤   ¤   strIndex = kPGPDiskFileIsOnLockedVolumeStrIndex;
7ef622 ¤   ¤   ¤   ¤   break;
0e87c7 ¤   ¤   ¤
692d36 ¤   ¤   ¤   case kCastSBoxesInvalidError:
f24dae ¤   ¤   ¤   ¤   strIndex = kCastSBoxesDamagedStrIndex;
b8f622 ¤   ¤   ¤   ¤   break;
722b85 ¤   ¤   ¤   ¤
917948 ¤   ¤   ¤   case kPGPDiskUnknownFileVersionError:¤
6542e0 ¤   ¤   ¤   ¤   strIndex = kVersionObsoleteStrIndex;
24f622 ¤   ¤   ¤   ¤   break;
a187c7 ¤   ¤   ¤
f2152e ¤   ¤   ¤   case kNoMorePassphrasesAvailableError:
dab711 ¤   ¤   ¤   ¤   strIndex = kPGPDiskMaxPassphrasesAddedStrIndex;
22f622 ¤   ¤   ¤   ¤   break;
1587c7 ¤   ¤   ¤
391c82 ¤   ¤   #if PGPDISK_PUBLIC_KEY
0ab4e4 ¤   ¤   ¤   case kPGPdiskADKNotFoundError:
d17ee6 ¤   ¤   ¤   ¤   strIndex = kPGPdiskADKNotFoundStrIndex;
4bf622 ¤   ¤   ¤   ¤   break;
e81b52 ¤   ¤
5fd6a2 ¤   ¤   ¤   case kPGPDiskIncorrectPassphraseNoKeyringsError:
852d53 ¤   ¤   ¤   ¤   strIndex = kIncorrectPassphraseNoKeyringStrIndex;
bbf622 ¤   ¤   ¤   ¤   break;
602b85 ¤   ¤   ¤   ¤
ef2b9d ¤   ¤   ¤   case kPGPDiskIncorrectPassphraseKeyNotFoundError:
58835b ¤   ¤   ¤   ¤   strIndex = kIncorrectPassphraseKeyNotFoundStrIndex;
--cf51 00062232e604012005d Page 29 of PGPDiskUtils.c
72f622 ¤   ¤   ¤   ¤   break;
3dd656 ¤   ¤   #endif
861b52 ¤   ¤
75db68 ¤   ¤   ¤   default:
0736f2 ¤   ¤   ¤   ¤   pgpDebugMsg( "GetErrorString: Unhandled application error" );
d9f622 ¤   ¤   ¤   ¤   break;
830fe4 ¤   ¤   }
f61b52 ¤   ¤
07b48d ¤   ¤   if( strIndex != 0 )
5f5b34 ¤   ¤   {
7cd2d8 ¤   ¤   ¤   GetIndString( errorStr, kErrorStringListResID, strIndex );
40f280 ¤   ¤   ¤   pgpAssert( errorStr[0] != 0 );
720fe4 ¤   ¤   }
529371 ¤   }
16af5a
197c5f ¤   if( errorStr[0] == 0 )
ccc7a1 ¤   {
f63cdd ¤   ¤   Str255¤ osErrStr;
7e1b52 ¤   ¤
f37998 ¤   ¤   GetIndString( errorStr, kErrorStringListResID,
b4fd45 ¤   ¤   ¤   ¤   ¤   kAnErrorOccurredStrIndex );
e56565 ¤   ¤   GetOSErrorString( err, osErrStr );
79d3f9 ¤   ¤   PrintPString( errorStr, errorStr, osErrStr );
139371 ¤   }
bcefe6 }
eaaf5a
956d52 ¤   void
bd2c7a GetComboErrorString(
b8607c ¤   CComboError¤err,
c55635 ¤   StringPtr ¤ errorStr)
c8bb36 {
07995f ¤   pgpAssertAddrValid( errorStr, uchar );
f4859f ¤   pgpAssert( err.IsError() && ! err.IsCancelError() );
3a67c5 ¤
bdea4b #if PGPDISK_PUBLIC_KEY
d2bdbc ¤   if( err.HavePGPError() )
adc7a1 ¤   {
1362b4 ¤   ¤   char¤   cErrorStr[256];
268c75 ¤   ¤   Str255¤ pErrorStr;
731b52 ¤   ¤
967998 ¤   ¤   GetIndString( errorStr, kErrorStringListResID,
bffd45 ¤   ¤   ¤   ¤   ¤   kAnErrorOccurredStrIndex );
35c46b ¤   ¤   PGPGetClientErrorString( err.pgpErr, sizeof( cErrorStr ), cErrorStr );
e3f3ef ¤   ¤   CToPString( cErrorStr, pErrorStr );
1cdc06 ¤   ¤   PrintPString( errorStr, errorStr, pErrorStr );
c99371 ¤   }
540e24 ¤   else
e87454 #endif
55c7a1 ¤   {
5f4d3b ¤   ¤   GetErrorString( err.err, errorStr );
049371 ¤   }
87efe6 }
2baf5a
c7561f #if PGP_BUSINESS_SECURITY¤  /* [ */
c3af5a
8ec744 ¤   PGPError
7a3f72 GetADKInfo(
5ac2a3 ¤   PGPBoolean¤ ¤   ¤   ¤   *haveADK,
7bf2be ¤   PGPKeyID¤   ¤   ¤   ¤   *keyID,
5141cd ¤   PGPPublicKeyAlgorithm¤  *algorithm)
68bb36 {
313bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
5367c5 ¤
ed5d4f ¤   *haveADK ¤  = FALSE;
37ea73 ¤   *algorithm¤ = kPGPPublicKeyAlgorithm_Invalid;
d467c5 ¤
5f891b ¤   pgpClearMemory( keyID, sizeof( *keyID ) );
1567c5 ¤
b2c7a1 ¤   {
8b31c1 ¤   ¤   PGPContextRef¤  context;
f5af5a
6253d8 ¤   ¤   err = PGPNewContext( kPGPsdkAPIVersion, &context );
--a305 00116dbbdf84012005d Page 30 of PGPDiskUtils.c
2e86f8 ¤   ¤   if( IsntPGPError( err ) )
d75b34 ¤   ¤   {
37167c ¤   ¤   ¤   PGPPrefRef¤ ¤   adminPrefsRef;
7587c7 ¤   ¤   ¤
6f7bd0 ¤   ¤   ¤   err = PGPOpenAdminPrefs( PGPGetContextMemoryMgr( context ),
546060 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &adminPrefsRef );
18698b ¤   ¤   ¤   if( IsntPGPError( err ) )
20f776 ¤   ¤   ¤   {
0a0a79 ¤   ¤   ¤   ¤   err = PGPGetPrefBoolean( adminPrefsRef,
c58333 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefUsePGPdiskADK, haveADK );
39e9d3 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) && *haveADK )
e272c3 ¤   ¤   ¤   ¤   {
73ece9 ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  tempAlg;
d9ae30 ¤   ¤   ¤   ¤   ¤
0d00de ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefNumber( adminPrefsRef,
9a7d02 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefPGPdiskADKPublicKeyAlgorithm,
3daf6b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &tempAlg );
696ca0 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
194859 ¤   ¤   ¤   ¤   ¤   {
1d608d ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤dataLength;
f32e25 ¤   ¤   ¤   ¤   ¤   ¤   void¤   *data;
5c94aa ¤   ¤   ¤   ¤   ¤   ¤
08718e ¤   ¤   ¤   ¤   ¤   ¤   *algorithm = (PGPPublicKeyAlgorithm) tempAlg;
4194aa ¤   ¤   ¤   ¤   ¤   ¤
3def4d ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefData( adminPrefsRef,
305fdf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefPGPdiskADKKeyID,
d7cbf9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &dataLength, &data );
ad239e ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
b78fec ¤   ¤   ¤   ¤   ¤   ¤   {
59aa42 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPImportKeyID( data, keyID );
7aaf5a
105dcd ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeData( data );
8cdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
19bfba ¤   ¤   ¤   ¤   ¤   }¤  ¤   ¤   ¤
692613 ¤   ¤   ¤   ¤   }
5b2b85 ¤   ¤   ¤   ¤
e10691 ¤   ¤   ¤   ¤   PGPClosePrefFile( adminPrefsRef );
e7a3a6 ¤   ¤   ¤   }
d387c7 ¤   ¤   ¤
16d288 ¤   ¤   ¤   PGPFreeContext( context );
c40fe4 ¤   ¤   }
0a9371 ¤   }
eaaf5a
3edeb7 ¤   return( err );
beefe6 }
5daf5a
551d9c #endif¤ /* ] PGP_BUSINESS_SECURITY */
0faf5a
b2af5a
c9af5a
68af5a
4daf5a
fbaf5a
fdaf5a
49af5a
a5af5a
5baf5a
cfaf5a
b7af5a
16af5a
--d75d 000427ef26b4012005e Page 1 of PGPDiskUtils.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
d03ea3 ¤   $Id: PGPDiskUtils.h,v 1.8.8.1 1998/11/12 03:06:13 heller Exp $
8ff7f7 ____________________________________________________________________________*/
f9af5a
457b7d #pragma once
c8af5a
da76f0 #include "CComboError.h"
3cde36 #include "PGPDisk.h"
ab2465 #include "PGPDiskFileFormat.h"
edaf5a
88ea4b #if PGPDISK_PUBLIC_KEY
6fa076 #include "pgpKeys.h"
df7454 #endif
dbaf5a
43724d typedef struct PGPDiskFileInfo
a4bb36 {
b89f1a ¤   Boolean¤¤   fileIsOnLockedVolume;
75398a ¤   Boolean¤¤   fileIsLocked;
a28db9 ¤   Boolean¤¤   fileIsOpen;
6487e5 ¤   Boolean¤¤   fileIsInUseByDriver;
aff5ae ¤   Boolean¤¤   fileIsMounted;
f9f871 ¤   short¤  ¤   fileDriveNumber;¤   // Valid if fileIsInUseByDriver == TRUE
20af5a
84b70e } PGPDiskFileInfo;
a3af5a
a5e891 typedef OSStatus¤   (*MountDiskProgressProcPtr)(UInt32 percentComplete,
0c26b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *userValue);
2aaf5a
d7543b CComboError¤MountPGPDisk(const FSSpec *file, Boolean firstTime,
18df71 ¤   ¤   ¤   ¤   ¤   Boolean mountReadOnly, const uchar *passphrase,
f56539 ¤   ¤   ¤   ¤   ¤   Boolean allowRecoveryUI, ConstStr255Param newVolumeName,
beb419 ¤   ¤   ¤   ¤   ¤   MountDiskProgressProcPtr progressProc,
199a10 ¤   ¤   ¤   ¤   ¤   void *progressUserValue);
0a9261 OSStatus¤   GetPGPDiskFileInfo(const FSSpec *fileSpec,
34c242 ¤   ¤   ¤   ¤   ¤   PGPDiskFileInfo *fileInfo);
11af5a
294cff OSStatus¤   CheckForLocalPGPDiskVolume(short vRefNum);
7eaf5a
afd039 OSStatus¤   VerifyPassphrase(const FSSpec *file, const uchar *passphrase);
6278a6 OSStatus¤   VerifyMasterPassphrase(const FSSpec *file,
91f416 ¤   ¤   ¤   ¤   ¤   const uchar *passphrase);
71af5a
164596 OSStatus¤   ChangePassphrase(const FSSpec *fileSpec,
1745cd ¤   ¤   ¤   ¤   ¤   const uchar *oldPassphrase, const uchar *newPassphrase);
a16414 OSStatus¤   AddPassphrase( const FSSpec * spec,
b879c6 ¤   ¤   ¤   ¤   ¤   ConstStr255Param masterPassphrase,
d860fb ¤   ¤   ¤   ¤   ¤   ConstStr255Param newPassphrase, Boolean readOnly );
114db2 OSStatus¤   RemovePassphrase( const FSSpec * spec,
f18fe8 ¤   ¤   ¤   ¤   ¤   ConstStr255Param passphrase );
57fc97 OSStatus¤   RemoveAlternatePassphrases(const FSSpec *fileSpec);
d1af5a
f43d9c void¤   ¤   GetAllPGPDiskDrivers( short driverRefNums[], ushort maxRefNums,
58e81c ¤   ¤   ¤   ¤   ¤   ushort * numDrivers);
84d77a void¤   ¤   GetAllPGPDrives( short driveNumbers[], ushort maxDrives,
4a7508 ¤   ¤   ¤   ¤   ¤   ushort * numDriveNumbers);
15af5a
265ff9 Boolean¤¤   IsPGPDiskFileType(OSType fileCreator, OSType fileType);
4e1ea8 OSStatus¤   VerifyPGPDiskFileIsModifiable(const FSSpec *fileSpec);
73af5a
5b498e void¤   ¤   GetErrorString(OSStatus err, StringPtr errorStr);
04f2d4 void¤   ¤   GetComboErrorString(CComboError¤err, StringPtr errorStr);
1baf5a
ee561f #if PGP_BUSINESS_SECURITY¤  /* [ */
4eaf5a
3623da PGPError¤   GetADKInfo(PGPBoolean *haveADK, PGPKeyID *keyID,
7936d3 ¤   ¤   ¤   ¤   ¤   ¤   PGPPublicKeyAlgorithm *algorithm );
f6af5a
cc1d9c #endif¤ /* ] PGP_BUSINESS_SECURITY */
42af5a
--8e43 001fa7f70764012005e Page 2 of PGPDiskUtils.h
70141c extern short¤   gApplicationResFile;
faaf5a
--f0e3 0008ca81de54012005f Page 1 of PGPMountUtils.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
8c9fb2 ¤   $Id: PGPMountUtils.cp,v 1.7.8.1 1998/11/12 03:06:14 heller Exp $
f5f7f7 ____________________________________________________________________________*/
b1af5a
2e4293 #include <FSM.h>
83af5a
e8ba14 #include "PGPMountUtils.h"
57af5a
f2bbf4 #include "MacFiles.h"
de75a9 #include "MacDriverUtils.h"
ee8bd8 #include "MacEnvirons.h"
fac110 #include "pgpMacMemory.h"
396915 #include "MacResources.h"
1585c2 #include "MacStrings.h"
2eaf5a
3baf5a
67af5a
e8af5a
bfaf5a
d138e5 /*
a6312a **¤ Allocate a device control entry low in memory, initialize its dCtlDriver,
9cd5c2 **¤ dCtlFlags, and dCtlRefNum fields, and then add it to the unit table.
ee7fe0 */
91af5a
a4eacd ¤   OSErr
bab1dc MyDRVRInstall(
e46e20 ¤   Ptr¤¤   drvrPtr,
f04dc2 ¤   short¤  driverRefNum)
66bb36 {
0c7b4a ¤   OSErr¤  ¤   ¤   err = noErr;
a84d03 ¤   short¤  ¤   ¤   unitNum;
8278dc ¤   AuxDCEHandle¤   *unitTable;
c2f54a ¤   AuxDCEHandle¤   dceHandle;
e667c5 ¤
9a2314 ¤   unitNum¤= -1 * ( driverRefNum + 1 );
c967c5 ¤
213882 ¤   unitTable = (AuxDCEHandle *)LMGetUTableBase();
d867c5 ¤
a5a60a ¤   /* Make room as low as possible because the device control entry will */
ec5137 ¤   /* be locked while the driver is open */
f5b01a ¤   ReserveMem( sizeof(AuxDCE) );
b567c5 ¤
1337e4 ¤   dceHandle¤  = (AuxDCEHandle)NewHandleSysClear(sizeof(AuxDCE));
547ad7 ¤   if ( IsntNull( dceHandle ) )
b8c7a1 ¤   {
b6dc75 ¤   ¤   MacLeaks_IgnoreItem( dceHandle );
3a1b52 ¤   ¤
28cab4 ¤   ¤   // We clear the dRAMBased bit below to make sure that our driver is
ffa930 ¤   ¤   // accessed more quickly by a pointer rather than by a handle. ·Also
7fb6e1 ¤   ¤   // using a pointer for this makes it interrupt safe to call this
c6c652 ¤   ¤   // driver.·
71c149 ¤   ¤   HLock((Handle)dceHandle);
744977 ¤   ¤   (**dceHandle).dCtlDriver¤   = drvrPtr;
00046e ¤   ¤   (**dceHandle).dCtlFlags¤¤   &= ~dRAMBasedMask;
946f0c ¤   ¤   (**dceHandle).dCtlRefNum¤   = driverRefNum;¤¤
71af5a
56d638 ¤   ¤   /* Put dceHandle in the unit table */
916645 ¤   ¤   unitTable[ unitNum ]¤   ¤   ¤   = dceHandle;¤   ¤
e69371 ¤   }
6f0e24 ¤   else
51c7a1 ¤   {
6e2a06 ¤   ¤   err = memFullErr;
e99371 ¤   }
8667c5 ¤
8b9337 ¤   return (err);
c9efe6 }
e7af5a
b0af5a
8cd140 ¤   static OSErr
--9b90 000b3533d164012005f Page 2 of PGPMountUtils.cp
a5dd01 GetVRefNumForDrive(
493ade ¤   short¤  driveNum,
de47ef ¤   short *¤vRefNum )
c0c7a1 ¤   {
d923a1 ¤   const VCB *¤vcb;
ea55b9 ¤   OSErr¤  ¤   err¤= nsvErr;
2c67c5 ¤
e78f32 ¤   vcb¤= (const VCB *)GetVCBQHdr()->qHead;
9a94ad ¤   while ( IsntNull( vcb ) )
625b34 ¤   ¤   {
a5a408 ¤   ¤   if ( vcb->vcbDrvNum == driveNum )
cdf776 ¤   ¤   ¤   {
b8d64c ¤   ¤   ¤   err¤¤   ¤   = noErr;
c5d3f4 ¤   ¤   ¤   *vRefNum¤   = vcb->vcbVRefNum;
c8cdcb ¤   ¤   ¤   break;
cba3a6 ¤   ¤   ¤   }
ff1b52 ¤   ¤
76d6c0 ¤   ¤   vcb¤= (const VCB *)vcb->qLink;
190fe4 ¤   ¤   }
8967c5 ¤
1cdeb7 ¤   return( err );
1a9371 ¤   }
1a67c5 ¤
47af5a
22d140 ¤   static OSErr
462b2e UnmountAllDrivesForDriver( short¤   driverRefNum )
0dc7a1 ¤   {
754124 ¤   const DrvQEl *¤ drvQElem¤   = (const DrvQEl *)GetDrvQHdr()->qHead;
066920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
4c67c5 ¤
414bce ¤   while ( IsntNull( drvQElem ) )
b35b34 ¤   ¤   {
b0b061 ¤   ¤   const DrvQEl *¤ next;
bc1b52 ¤   ¤
e2f402 ¤   ¤   next¤   = (const DrvQEl *)drvQElem->qLink;
2e1b52 ¤   ¤
046ae4 ¤   ¤   if ( drvQElem->dQRefNum == driverRefNum )
bef776 ¤   ¤   ¤   {
288a67 ¤   ¤   ¤   short¤  vRefNum;
d887c7 ¤   ¤   ¤
95bca9 ¤   ¤   ¤   err¤= GetVRefNumForDrive( drvQElem->dQDrive, &vRefNum);
65d2c0 ¤   ¤   ¤   if ( err == noErr )
7572c3 ¤   ¤   ¤   ¤   {
9c8080 ¤   ¤   ¤   ¤   err¤= UnmountVol( nil, vRefNum );
f1cfa2 ¤   ¤   ¤   ¤   AssertNoErr( err, "UnmountAllDrivesForDriver (UnmountVol)" );
eaaa56 ¤   ¤   ¤   ¤   if ( IsErr( err ) )
3114c3 ¤   ¤   ¤   ¤   ¤   break;
592613 ¤   ¤   ¤   ¤   }
5cbb8c ¤   ¤   ¤   else
ce72c3 ¤   ¤   ¤   ¤   {
b1164d ¤   ¤   ¤   ¤   // ignore
c9f39c ¤   ¤   ¤   ¤   err¤= noErr;
622613 ¤   ¤   ¤   ¤   }
e4a3a6 ¤   ¤   ¤   }
2687c7 ¤   ¤   ¤
f48ffa ¤   ¤   drvQElem¤   = next;
090fe4 ¤   ¤   }
9667c5 ¤
69deb7 ¤   return( err );
059371 ¤   }
e167c5 ¤
0367c5 ¤
49d140 ¤   static OSErr
d57b27 DRVRClose( short¤   driverRefNum )
2fc7a1 ¤   {
d72ece ¤   ParamBlockRec¤  pb;
316920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
4f67c5 ¤
6eaa5b ¤   pb.ioParam.ioRefNum¤= driverRefNum;
6592f8 ¤   err¤= PBCloseSync( &pb );
3867c5 ¤
b3deb7 ¤   return( err );
--0b22 0008a097f984012005f Page 3 of PGPMountUtils.cp
a19371 ¤   }
9967c5 ¤
971b52 ¤   ¤
55d140 ¤   static OSErr
b912b2 DRVRAccRun( short¤  driverRefNum )
a8c7a1 ¤   {
0b2ece ¤   ParamBlockRec¤  pb;
226920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
7767c5 ¤
bd439a ¤   pb.cntrlParam.ioCRefNum¤= driverRefNum;
4b272d ¤   pb.cntrlParam.csCode¤   = accRun;
dfa63c ¤   err¤= PBControlSync( &pb );
6e67c5 ¤
9fdeb7 ¤   return( err );
059371 ¤   }
01af5a
8baf5a
fc38e5 /*
b79b22 **¤ Unmount all drives using the driver, close the driver, and remove it
2f7fe0 */
6eeacd ¤   OSErr
e2eed7 UnmountAllCloseAndRemove( short¤driverRefNum )
84c7a1 ¤   {
9d6920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
8467c5 ¤
41873c ¤   err¤= UnmountAllDrivesForDriver( driverRefNum );
b35ecc ¤   if ( IsntErr( err ) )
625b34 ¤   ¤   {
e0f14c ¤   ¤   short¤  ¤   ¤   ·unitNum;
06cb23 ¤   ¤   AuxDCEHandle *¤ unitTable;
bfaf5a
563881 ¤   ¤   unitNum¤¤   = -1 * (driverRefNum + 1);
1d2aff ¤   ¤   unitTable¤  = (AuxDCEHandle *)LMGetUTableBase();
b6af5a
a65f71 ¤   ¤   if (unitNum > 0 && (unitNum <= kMaxUnitTableEntries))
45f776 ¤   ¤   ¤   {
aa5a6d ¤   ¤   ¤   AuxDCEHandle ¤  dceHandle;
671b52 ¤   ¤
75877f ¤   ¤   ¤   dceHandle¤  = unitTable[ unitNum ];
174252 ¤   ¤   ¤   if ( IsntNull( dceHandle ) )
7b72c3 ¤   ¤   ¤   ¤   {
994d18 ¤   ¤   ¤   ¤   err¤= DRVRClose( driverRefNum );
3d0fe3 ¤   ¤   ¤   ¤   if ( IsntErr( err ) )
f34859 ¤   ¤   ¤   ¤   ¤   {
2796b9 ¤   ¤   ¤   ¤   ¤   Handle¤ driverHandle;
10ae30 ¤   ¤   ¤   ¤   ¤
80b5e6 ¤   ¤   ¤   ¤   ¤   pgpAssert( ((**dceHandle).dCtlFlags & dOpenedMask) == 0 );
aaae30 ¤   ¤   ¤   ¤   ¤
87c8f0 ¤   ¤   ¤   ¤   ¤   driverHandle = RecoverHandle( (**dceHandle).dCtlDriver );
50a819 ¤   ¤   ¤   ¤   ¤   if ( IsntNull( driverHandle ) )
278fec ¤   ¤   ¤   ¤   ¤   ¤   {
1ced9e ¤   ¤   ¤   ¤   ¤   ¤   DisposeHandle( driverHandle );
73c481 ¤   ¤   ¤   ¤   ¤   ¤   driverHandle¤   = nil;
8149d7 ¤   ¤   ¤   ¤   ¤   ¤   err¤= MemError();
b8db3c ¤   ¤   ¤   ¤   ¤   ¤   }
beae30 ¤   ¤   ¤   ¤   ¤
855cfa ¤   ¤   ¤   ¤   ¤   unitTable[ unitNum ] = nil;
f44cbe ¤   ¤   ¤   ¤   ¤   DisposeHandle( (Handle)dceHandle );¤
aaae9c ¤   ¤   ¤   ¤   ¤   dceHandle¤  = nil;
e71c89 ¤   ¤   ¤   ¤   ¤   }
762613 ¤   ¤   ¤   ¤   }
d8a3a6 ¤   ¤   ¤   }
cd0fe4 ¤   ¤   }
44deb7 ¤   return( err );
af9371 ¤   }
0baf5a
9aaf5a
87af5a
8daf5a
1a15ab ¤   static FlagsDrvQEl *
21fea4 NewDriveQElem(
8a6e16 ¤   const short¤driverRefNum,
--6f62 000497f485a4012005f Page 4 of PGPMountUtils.cp
fede47 ¤   const short¤driveNumber,
fb2096 ¤   const ulong¤numBlocks)
92c7a1 ¤   {
736cf2 ¤   FlagsDrvQEl¤*myEl;
e067c5 ¤
c7bf35 ¤   myEl¤   = (FlagsDrvQEl *)NewPtrSysClear( sizeof( FlagsDrvQEl ) );
d2cfc0 ¤   if ( IsntNull( myEl ) )
355b34 ¤   ¤   {
b0be2a ¤   ¤   myEl->flags¤¤   ¤   ¤   = 0;
351b52 ¤   ¤
c8c454 ¤   ¤   // qType of 1 indicates both dQDrvSz and dQDrvSz2 are used
e7cd95 ¤   ¤   // see IM IV pg 181
281a76 ¤   ¤   myEl->el.qType¤ ¤   ¤   = 1;¤
d53aa0 ¤   ¤   myEl->el.dQDrvSz¤   ¤   = numBlocks;
b91a84 ¤   ¤   myEl->el.dQDrvSz2¤  ¤   = numBlocks >> 16;
2e1b52 ¤   ¤
1f53ab ¤   ¤   myEl->el.dQDrive¤   ¤   = driveNumber;
b1ac2b ¤   ¤   myEl->el.dQRefNum¤  ¤   = driverRefNum;
60c082 ¤   ¤   myEl->el.dQFSID¤¤   ¤   = 0;
680fe4 ¤   ¤   }
8167c5 ¤
023ea9 ¤   return( myEl );
629371 ¤   }
5767c5 ¤
bc67c5 ¤
e438e5 /*
098d5a **¤ Find the first unused drive number greater than 4, allocate and
9671c2 ** ¤initialize a drive queue element (including the drive flags), and add
a4f970 **¤ the drive queue element to the drive queue.
2e7fe0 */
baeacd ¤   OSErr
ac83a5 AddDriveToQueue(
18daff ¤   long¤   ¤   size,
eec5bc ¤   short¤  ¤   driverRefNum,
42ecfb ¤   Boolean¤¤   writeProtect,
2415db ¤   FlagsDrvQEl¤**driveQEl)
8abb36 {
a67b4a ¤   OSErr¤  ¤   ¤   err = noErr;
f723cb ¤   const QHdr *¤   driveQHdr;
a01dcd ¤   const DrvQEl*¤  drivePtr;
4006ad ¤   Boolean¤¤   ¤   driveNumFound = false;
f90cb8 ¤   short¤  ¤   ¤   driveNum;
2f67c5 ¤
046c0a ¤   *driveQEl¤  = nil;
ff67c5 ¤
aad1e4 ¤   driveQHdr = GetDrvQHdr();
e167c5 ¤
e03d5c ¤   /* find first free drive number */
40b8c5 ¤   driveNum = 5;¤  ¤   ¤   ¤   ¤   /* drive numbers 1-4 are reserved */
a7c424 ¤   while( ! driveNumFound )
08c7a1 ¤   {
e2d878 ¤   ¤   drivePtr = (const DrvQEl *)driveQHdr->qHead;¤   /* get first drive */
7c7b82 ¤   ¤   while ( IsntNull( drivePtr ) )
14f776 ¤   ¤   ¤   {
e898cb ¤   ¤   ¤   if ( driveNum == drivePtr->dQDrive )
88f622 ¤   ¤   ¤   ¤   break;
992b85 ¤   ¤   ¤   ¤
b2fb9d ¤   ¤   ¤   drivePtr = (const DrvQEl *)drivePtr->qLink;¤/* get next drive */
26a3a6 ¤   ¤   ¤   }
081b52 ¤   ¤
95f08b ¤   ¤   if ( IsNull( drivePtr ) )
be5d03 ¤   ¤   ¤   driveNumFound = TRUE;
a00e1d ¤   ¤   else
490642 ¤   ¤   ¤   driveNum¤   += 1;
a89371 ¤   }
fc67c5 ¤
f33521 ¤   if (driveNum > 0)¤  /* must be a positive short */
a7c7a1 ¤   {
b4e02d ¤   ¤   FlagsDrvQEl *¤  newDrivePtr;
3367c5 ¤
ae7d81 ¤   ¤   newDrivePtr¤= NewDriveQElem( driverRefNum, driveNum, size );
49f473 ¤   ¤   if( IsntNull( newDrivePtr ) )
--bd62 0007044397f4012005f Page 5 of PGPMountUtils.cp
e35b34 ¤   ¤   {
8ccee9 ¤   ¤   ¤   MacLeaks_IgnoreItem( newDrivePtr );
0c87c7 ¤   ¤   ¤
58e18c ¤   ¤   ¤   *driveQEl¤  = newDrivePtr;
1f87c7 ¤   ¤   ¤
232f2b ¤   ¤   ¤   // to avoid problems caused by this, we also have to set
2113b5 ¤   ¤   ¤   // 'kDriveWantsEjectCallMask' in order to get an eject call
ad30da ¤   ¤   ¤   // to fix up the mess when the Finder occassionally
82a064 ¤   ¤   ¤   // "ejects" us.
1a2e46 ¤   ¤   ¤   newDrivePtr->flags¤ = 0;
5c1b52 ¤   ¤
7bfe45 ¤   ¤   #if ALLOW_VM_PAGING¤// [
797040 ¤   ¤   ¤   This is non-shipping test code
56dacc ¤   ¤   ¤   if ( VirtualMemoryIsOn() )
1e72c3 ¤   ¤   ¤   ¤   {
1bd33e ¤   ¤   ¤   ¤   // VM is one, we have to mark the drive as ejectable (don't
ed10f6 ¤   ¤   ¤   ¤   // set the not-ejectable flag) in order to keep the system
f8a362 ¤   ¤   ¤   ¤   // from trying to page off our drive
b4fe0c ¤   ¤   ¤   ¤   newDrivePtr->flags¤ = kDriveIsNotEjectableMask;
b02613 ¤   ¤   ¤   ¤   }
b2bb8c ¤   ¤   ¤   else
3272c3 ¤   ¤   ¤   ¤   {
7808ba ¤   ¤   ¤   ¤   // we'd like to mark it as non-ejectable, but the
3cc65d ¤   ¤   ¤   ¤   // unfortunate side-effect of this is the:
d47a31 ¤   ¤   ¤   ¤   //¤ "...disk will reappear when the computer is restarted"
e99dc2 ¤   ¤   ¤   ¤   // message. which implies a security leak
f9fe0c ¤   ¤   ¤   ¤   newDrivePtr->flags¤ = kDriveIsNotEjectableMask;
a62613 ¤   ¤   ¤   ¤   }
ad1b52 ¤   ¤
86c43a ¤   ¤   #else¤  // ] ALLOW_VM_PAGING [
461b52 ¤   ¤
31dacc ¤   ¤   ¤   if ( VirtualMemoryIsOn() )
0c72c3 ¤   ¤   ¤   ¤   {
c9d33e ¤   ¤   ¤   ¤   // VM is one, we have to mark the drive as ejectable (don't
3910f6 ¤   ¤   ¤   ¤   // set the not-ejectable flag) in order to keep the system
7aa362 ¤   ¤   ¤   ¤   // from trying to page off our drive
036615 ¤   ¤   ¤   ¤   newDrivePtr->flags¤ = kDiskInDriveMask |
6bd324 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDriveWantsEjectCallMask;
ab2613 ¤   ¤   ¤   ¤   }
a7bb8c ¤   ¤   ¤   else
7e72c3 ¤   ¤   ¤   ¤   {
b708ba ¤   ¤   ¤   ¤   // we'd like to mark it as non-ejectable, but the
b0c65d ¤   ¤   ¤   ¤   // unfortunate side-effect of this is the:
737a31 ¤   ¤   ¤   ¤   //¤ "...disk will reappear when the computer is restarted"
249dc2 ¤   ¤   ¤   ¤   // message. which implies a security leak
6f6615 ¤   ¤   ¤   ¤   newDrivePtr->flags¤ = kDiskInDriveMask |
45d324 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDriveWantsEjectCallMask;
a42613 ¤   ¤   ¤   ¤   }
122b85 ¤   ¤   ¤   ¤
52fc1c ¤   ¤   #endif¤ // ] ALLOW_VM_PAGING
fb87c7 ¤   ¤   ¤
47512d ¤   ¤   ¤   if( writeProtect )
7d72c3 ¤   ¤   ¤   ¤   {
51185c ¤   ¤   ¤   ¤   newDrivePtr->flags |= kDriveLockedMask;¤
052613 ¤   ¤   ¤   ¤   }
3f2b85 ¤   ¤   ¤   ¤
be9dcc ¤   ¤   ¤   Enqueue( (QElem *)&newDrivePtr->el.qLink, GetDrvQHdr() );
7887c7 ¤   ¤   ¤
c089a0 ¤   ¤   ¤   // AddDrive is buggy when run from native code, it also
0aecba ¤   ¤   ¤   // seems pointless in general since a simple Enqueue as
986cd5 ¤   ¤   ¤   // above does the same thing as far as I know. ·If anyone
90382c ¤   ¤   ¤   // knows any other weird things that AddDrive does that a simple
cff403 ¤   ¤   ¤   // Enqueue does not here, please let me know.
1a939b ¤   ¤   ¤   // Doing AddDrive instead of Enqueue does work in 68K code.
24b21a ¤   ¤   ¤   // It was used that way until CD 1.2
160fe4 ¤   ¤   }
8a0e1d ¤   ¤   else
e95b34 ¤   ¤   {
84a352 ¤   ¤   ¤   err = memFullErr;
7f0fe4 ¤   ¤   }
ce9371 ¤   }
700e24 ¤   else
--ec88 0015833ae074012005f Page 6 of PGPMountUtils.cp
f7c7a1 ¤   {
f24b9e ¤   ¤   /* more than 32768 drives!?! */
1cdcd9 ¤   ¤   err = nsDrvErr;
bf9371 ¤   }
2d67c5 ¤
4dfdcc ¤   return ( err );
f6efe6 }
beaf5a
05af5a
b2af5a
e3af5a
a8af5a
a9af5a
f5af5a
ceaf5a
c567c5 ¤
3c67c5 ¤
5867c5 ¤
--8d48 001fcd921c040120060 Page 1 of PGPMountUtils.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
22aaad ¤   $Id: PGPMountUtils.h,v 1.3.8.1 1998/11/12 03:06:14 heller Exp $
9bf7f7 ____________________________________________________________________________*/
85d83c ·
fe7b7d #pragma once
7daf5a
4775a9 #include "MacDriverUtils.h"
7eaf5a
d9af5a
e4d9ee struct FlagsDrvQEl;
2eaf5a
db1335 OSErr¤  MyDRVRInstall(Ptr drvrPtr, short drvrRefNum);
9620e3 OSErr¤  UnmountAllCloseAndRemove(short drvrRefNum);
c2fdb8 OSErr¤  AddDriveToQueue(long size, short drvrRef, Boolean writeProt,
fe5876 ¤   ¤   ¤   ¤   FlagsDrvQEl **);
19b356 OSErr¤  RemoveDriveQEl(short driveNum, DrvQElPtr *drivePtr);
60af5a
fcaf5a
--728f 000a2a2238e40120061 Page 1 of SleepAlert.cp
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
06a1c1 ¤   $Id: SleepAlert.cp,v 1.3.8.1 1998/11/12 03:06:15 heller Exp $
d2f7f7 ____________________________________________________________________________*/
8daf5a
806915 #include "MacResources.h"
36bbf4 #include "MacFiles.h"
33af5a
280421 #include "SleepAlert.h"
ca8ec6 #include "PGPDiskPreferences.h"
90de36 #include "PGPDisk.h"
a9af5a
ecaf5a
e9af5a
4a67c5 ¤
d4d140 ¤   static OSErr
3499ca CreateAndOpenPrefsResFork( short *fileRef )
ebbb36 {
058e70 ¤   OSErr¤  err¤= noErr;
bef67f ¤   FSSpec¤ spec;
4d67c5 ¤
f8856f ¤   err¤= GetPrefsFileSpec( &spec );
9d5ecc ¤   if ( IsntErr( err ) )
2bc7a1 ¤   {
648140 ¤   ¤   err¤= FSpDeleteResourceFork( &spec );
969371 ¤   }
3c67c5 ¤
dc5ecc ¤   if ( IsntErr( err ) )
f5c7a1 ¤   {
728c1f ¤   ¤   FSpCreateResFile( &spec, kPGPDiskFileCreator, kPrefsFileType,
ae550b ¤   ¤   ¤   ¤   ¤   smSystemScript );
a8ea13 ¤   ¤   err¤= ResError();
141b52 ¤   ¤
43d798 ¤   ¤   if ( IsntErr( err ) )
5d5b34 ¤   ¤   {
d1ff35 ¤   ¤   ¤   *fileRef¤   = FSpOpenResFile( &spec, fsRdWrPerm );
ff6347 ¤   ¤   ¤   err¤= ResError();
970fe4 ¤   ¤   }
3b9371 ¤   }
2367c5 ¤
1aaf5a
cedeb7 ¤   return( err );
a4efe6 }
94af5a
28af5a
ad2811 /*___________________________________________________________________________
d9c044 ¤   We do this so the driver has a known resource file where it can get an
ab5fb9 ¤   alert.
2dc988 ___________________________________________________________________________*/
636d52 ¤   void
eabddc CopySleepAlertToPrefs( void )
57bb36 {
f28e70 ¤   OSErr¤  err¤= noErr;
e2dea8 ¤   short¤  fileRef;
4f89c6 ¤   short¤  saveResFile¤= CurResFile();
1b67c5 ¤
91dbfd ¤   err¤= CreateAndOpenPrefsResFork( &fileRef );
c75ecc ¤   if ( IsntErr( err ) )
fec7a1 ¤   {
f1c8e9 ¤   ¤   err¤= CopyResource( saveResFile, 'ALRT', kSleepRequestAlertResID,
c1da31 ¤   ¤   ¤   ¤   ¤   fileRef, 'ALRT', kSleepRequestAlertResID);
1bd798 ¤   ¤   if ( IsntErr( err ) )
055b34 ¤   ¤   {
b902b5 ¤   ¤   ¤   err¤= CopyResource( saveResFile, 'DITL', kSleepRequestAlertResID,
e622c9 ¤   ¤   ¤   ¤   ¤   ¤   fileRef, 'DITL', kSleepRequestAlertResID);
f20fe4 ¤   ¤   }
9d1b52 ¤   ¤
bfd798 ¤   ¤   if ( IsntErr( err ) )
7b5b34 ¤   ¤   {
a2cbcf ¤   ¤   ¤   err¤= CopyResource( saveResFile, 'ALRT', kSleepDemandAlertResID,
--9541 001be8454f540120061 Page 2 of SleepAlert.cp
f088b3 ¤   ¤   ¤   ¤   ¤   ¤   fileRef, 'ALRT', kSleepDemandAlertResID);
ace090 ¤   ¤   ¤   if ( IsntErr( err ) )
d8f776 ¤   ¤   ¤   {
667b1b ¤   ¤   ¤   ¤   err¤= CopyResource( saveResFile, 'DITL',
499b01 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSleepDemandAlertResID, fileRef, 'DITL',
f6fa79 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSleepDemandAlertResID);
c7a3a6 ¤   ¤   ¤   }
d60fe4 ¤   ¤   }
8c1b52 ¤   ¤
2ef63f ¤   ¤   CloseResFile( fileRef );
03d798 ¤   ¤   if ( IsntErr( err ) )
825b34 ¤   ¤   {
df6347 ¤   ¤   ¤   err¤= ResError();
f20fe4 ¤   ¤   }
d61b52 ¤   ¤
ca8cf4 ¤   ¤   if ( IsErr( err ) )
f45b34 ¤   ¤   {
600b50 ¤   ¤   ¤   FSSpec¤ spec;
fa87c7 ¤   ¤   ¤
6667e0 ¤   ¤   ¤   GetPrefsFileSpec( &spec );
e2d5d0 ¤   ¤   ¤   FSpDeleteResourceFork( &spec );
8e0fe4 ¤   ¤   }
639371 ¤   }
5867c5 ¤
373a91 ¤   AssertNoErr( err, "CopySleepAlertToPrefs" );
5a67c5 ¤
0360a3 ¤   UseResFile( saveResFile );
8fefe6 }
88af5a
faaf5a
c9af5a
cfaf5a
21af5a
8faf5a
beaf5a
--3b65 0016e2515fa40120062 Page 1 of SleepAlert.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
c777de ¤   $Id: SleepAlert.h,v 1.3.8.1 1998/11/12 03:06:16 heller Exp $
fef7f7 ____________________________________________________________________________*/
5daf5a
b17b7d #pragma once
bdaf5a
9df419 const short¤kSleepRequestAlertResID¤= 2998;
a9484c const short¤kSleepDemandAlertResID¤ = 2999;
bfaf5a
29af5a
6e3ea6 void¤   CopySleepAlertToPrefs( void );¶
--a26f 00143db889040120063 Page 1 of TunerStruct.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
5d04b3 ¤   $Id: TunerStruct.h,v 1.2.8.1 1998/11/12 03:06:16 heller Exp $
e8f7f7 ____________________________________________________________________________*/
c3af5a
d87b7d #pragma once
e2af5a
02f417 typedef struct TunerStruct
53c7a1 ¤   {
0110da ¤   // requests correspond to 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,
297a2b ¤   // 2048, 4096 blocks as in 2^0, 2^1, 2^2, etc blocks
bb2311 ¤   enum { kNumTune = 13 };
74fdba ¤   ushort¤ maxBlocks[ kNumTune ];¤ // for 2^0 thru 2^12 blocks
c3202c ¤   } TunerStruct;
c5af5a
d6af5a
a495af const TunerStruct¤  kDefaultReadTunerStruct =·
c9c7a1 ¤   {
146be7 //¤ ¤   1¤  2¤  4¤  8¤  16¤ 32¤ 64¤ 128¤256¤512¤¤   1024¤   2048¤   4096
1b3992 ¤   {¤  1,¤ 2,¤ 4,¤ 8,¤ 16,¤16,¤32,¤32,¤32,¤64,¤¤   128,¤   200,¤   200 }
6e62bd ¤   };
5baf5a
3bb818 // assuming scratch buffer size is 128K
bb0049 const TunerStruct¤  kDefaultWriteTunerStruct128 =·
92c7a1 ¤   {
c36be7 //¤ ¤   1¤  2¤  4¤  8¤  16¤ 32¤ 64¤ 128¤256¤512¤¤   1024¤   2048¤   4096
bad3f5 ¤   {¤  1,¤ 2,¤ 4,¤ 8,¤ 16,¤16,¤32,¤32,¤64,¤64,¤¤   64,¤¤   64,¤¤   64 }
b262bd ¤   };
43af5a
--bf27 001e96906bf40120064 Page 1 of usuals.h
a70335 /*____________________________________________________________________________
5a2ce9 ¤   Copyright (C) 1994-1998 Network Associates, Inc. and its affiliates.
2f4b0f ¤   All rights reserved.
ed67c5 ¤
65cd02 ¤   $Id: usuals.h,v 1.2.8.1 1998/11/12 03:06:17 heller Exp $
c3f7f7 ____________________________________________________________________________*/
dfaf5a
3e7b7d #pragma once
a0af5a
4b45a9 typedef unsigned char boolean;¤ /* values are TRUE or FALSE */
ea0e9e typedef unsigned char byte;¤/* values are 0-255 */
8bb64a typedef byte *byteptr;¤ /* pointer to byte */
ecae52 typedef unsigned short word16;¤ /* values are 0-65535 */
c8bb4b typedef unsigned long word32;¤  /* values are 0-4294967295 */
ecaf5a
0864cc #ifndef TRUE
279522 #define FALSE 0
96626d #define TRUE (!FALSE)
987391 #endif¤ /* if TRUE not already defined */
a3af5a
0aaf5a
e9af5a
--6afc 0005b9cfd1740120065 Page 1 of CInterruptLevelDRVRTester.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
88a5de ¤   $Id: CInterruptLevelDRVRTester.cp,v 1.6.8.1 1998/11/12 03:06:19 heller Exp $
8af7f7 ____________________________________________________________________________*/
d3af5a
bdb935 #include <Timer.h>
6a7cab #include <stddef.h>
42c110 #include "pgpMacMemory.h"
71bbf4 #include "MacFiles.h"
2475a9 #include "MacDriverUtils.h"
d185f6 #include "UInt64.h"
bfaf5a
365f39 #include "SetupA5.h"
e0af5a
40af5a
7cfdb7 #if TARGET_RT_MAC_CFM
018120 assumes 68K non-CFM
d47454 #endif
b1af5a
c5cbc3 #include "CInterruptLevelDRVRTester.h"
6faf5a
2caf5a
9caf5a
78af5a
2dc85f CInterruptLevelDRVRTester::CInterruptLevelDRVRTester()
3f9a51 ¤   : CInterruptLevelTester()
19c7a1 ¤   {
db8e70 ¤   OSErr¤  err¤= noErr;
4e67c5 ¤
d8e015 ¤   mTestInProgress¤¤   = false;
376cc4 ¤   mDriverRefNum¤  ¤   = 0;
842a85 ¤   mDriveNumber¤   ¤   = 0;
49140d ¤   mAcknowledgeDone¤   = false;
76ca9f ¤   mCurBlock¤  ¤   ¤   = 0;
1554de ¤   mIODirection¤   ¤   = kNoDirection;
f867c5 ¤
30e68f ¤   RememberA5();
c69371 ¤   }
67af5a
10af5a
9ae9c2 CInterruptLevelDRVRTester::~CInterruptLevelDRVRTester( )
05c7a1 ¤   {
28660a ¤   if ( mTestInProgress )
9f5b34 ¤   ¤   {
614ee6 ¤   ¤   Stop();
980fe4 ¤   ¤   }
fc9371 ¤   }
61af5a
7eaf5a
512811 /*___________________________________________________________________________
37a8e2 ¤   What range of disk blocks (512 bytes) do we want to test for the file?
5a67c5 ¤
1bd800 ¤   We'll test just the range for the largest extent (which is the whole
f30d55 ¤   file if it is not fragmented).
fbc988 ___________________________________________________________________________*/
55eacd ¤   OSErr
70db11 CInterruptLevelDRVRTester::GetTestBlockRange(
a7f5ad ¤   short¤  ¤   fileRefNum,
e4df38 ¤   ulong *¤¤   firstBlockToTest,
97c552 ¤   ulong *¤¤   numBlocksToTest)
d7c7a1 ¤   {
4c645a ¤   OSErr¤  ¤   ¤   err¤= fnfErr;
1d0951 ¤   DiskExtent *¤   extents;
41d52b ¤   PGPUInt32¤  ¤   numExtents;
a767c5 ¤
965a3f ¤   *firstBlockToTest¤  = 0;
4f29d3 ¤   *numBlocksToTest¤   = 0;
4567c5 ¤
60037b ¤   err¤= GetDiskExtentsForFork( fileRefNum, &extents, &numExtents );
5b5ecc ¤   if ( IsntErr( err ) )
--1f10 000539bd8dc40120065 Page 2 of CInterruptLevelDRVRTester.cp
e35b34 ¤   ¤   {
490781 ¤   ¤   // we'll use just the largest extent
b39916 ¤   ¤   DiskExtent¤ largestExtent¤  = extents[ 0 ];
931b52 ¤   ¤
f6afb9 ¤   ¤   for( ulong index = 1; index < numExtents; ++index )
09f776 ¤   ¤   ¤   {
ccc1fb ¤   ¤   ¤   if ( extents[ index ].numBlocks > largestExtent.numBlocks )
de72c3 ¤   ¤   ¤   ¤   {
cc68c5 ¤   ¤   ¤   ¤   largestExtent¤  = extents[ index ];
062613 ¤   ¤   ¤   ¤   }
99a3a6 ¤   ¤   ¤   }
7a1b52 ¤   ¤
c61e67 ¤   ¤   FreeDiskExtentList( extents );
bbfcb0 ¤   ¤   extents¤= nil;
f31b52 ¤   ¤
64f1b3 ¤   ¤   *firstBlockToTest¤  = largestExtent.diskBlockIndex;
217128 ¤   ¤   *numBlocksToTest¤   = largestExtent.numBlocks;
d30fe4 ¤   ¤   }
5e67c5 ¤
a9deb7 ¤   return( err );
7e9371 ¤   }
c367c5 ¤
cf67c5 ¤
dc67c5 ¤
6eeacd ¤   OSErr
34e585 CInterruptLevelDRVRTester::Setup( short¤fileRefNum )
dcc7a1 ¤   {
ed8e70 ¤   OSErr¤  err¤= noErr;
6667c5 ¤
5ebd43 ¤   err¤= inherited::Setup( fileRefNum );
a65ecc ¤   if ( IsntErr( err ) )
f05b34 ¤   ¤   {
c36477 ¤   ¤   err¤= GetTestBlockRange( fileRefNum, &mFirstBlockToTest,
7f434c ¤   ¤   ¤   ¤   ¤   ¤   &mNumBlocksToTest );
dbd798 ¤   ¤   if ( IsntErr( err ) )
d0f776 ¤   ¤   ¤   {
1d6211 ¤   ¤   ¤   mCurBlock¤  = mFirstBlockToTest;
ad87c7 ¤   ¤   ¤
59ffde ¤   ¤   ¤   GetDriveNumberAndRefNumForVCB( GetVCBForFile( fileRefNum ),
a3e4f8 ¤   ¤   ¤   ¤   ¤   ¤   &mDriveNumber, &mDriverRefNum );
22a3a6 ¤   ¤   ¤   }
ff0fe4 ¤   ¤   }
e167c5 ¤
7edeb7 ¤   return( err );
8a9371 ¤   }
a9af5a
39af5a
b7af5a
ccaf5a
6b6d52 ¤   void
54e62f CInterruptLevelDRVRTester::HandleIOCompletion( MyPB *myPB )
f7c7a1 ¤   {
bb96cb ¤   ParamBlockRec *¤pb¤ = &myPB->pb;
9b67c5 ¤
185ff8 ¤   mCurBlock¤  += pb->ioParam.ioActCount / kDiskBlockSize;
61fdc7 ¤   ulong¤  ¤   lastLegitimateBlock¤= mFirstBlockToTest +
d9dbc2 ¤   ¤   ¤   ¤   ¤   ¤   (mNumBlocksToTest - 1);
31f762 ¤   if ( mCurBlock > lastLegitimateBlock )
8464a9 ¤   ¤   mCurBlock¤  = mFirstBlockToTest;
c167c5 ¤
5d300c ¤   inherited::HandleIOCompletion( myPB );
059371 ¤   }
ac67c5 ¤
8067c5 ¤
8667c5 ¤
ba67c5 ¤
f96d52 ¤   void
5e7e85 CInterruptLevelDRVRTester::GetNextIOInfo(
d6e085 ¤   ulong *¤startBlockPtr,
528856 ¤   ulong *¤numBlocksPtr)
54c7a1 ¤   {
539e08 ¤   ulong¤  ¤   startBlock;
--2446 000db63d54940120065 Page 3 of CInterruptLevelDRVRTester.cp
1624be ¤   ulong¤  ¤   endBlock;
d4682e ¤   ulong¤  ¤   lastReadableBlock;
5cdedd ¤   const ulong¤kMaxBufferBlocks¤   = sizeof( mBuffer ) / kDiskBlockSize;
4167c5 ¤
2ba9eb ¤   startBlock¤ ¤   ¤   = mCurBlock;
5a9234 ¤   endBlock¤   ¤   ¤   = startBlock + (kMaxBufferBlocks - 1);
85b220 ¤   lastReadableBlock¤  = mFirstBlockToTest + (mNumBlocksToTest - 1);
25aeb5 ¤   if ( endBlock > lastReadableBlock )
4d5b34 ¤   ¤   {
85793e ¤   ¤   endBlock¤   = lastReadableBlock;
ff0fe4 ¤   ¤   }
3e67c5 ¤
8fda3b ¤   pgpAssert( startBlock <= endBlock );
2267c5 ¤
885fd1 ¤   *startBlockPtr¤ = startBlock;
9eebeb ¤   *numBlocksPtr¤  = ( endBlock - startBlock ) + 1;
489371 ¤   }
0667c5 ¤
e467c5 ¤
476d52 ¤   void
10a50d CInterruptLevelDRVRTester::DoIOFromTimeMgrTask()
3ac7a1 ¤   {
a049ee ¤   ParamBlockRec *¤pb;
fd6920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
d23355 ¤   ulong¤  ¤   ¤   numBlocksToRead;
fa67c5 ¤
740804 ¤   mPB.thisObject¤ = this;
531f41 ¤   pb¤ = &mPB.pb;
0d67c5 ¤
3e74ae ¤   pgpAssert( mDriveNumber > 0 );
ed2517 ¤   pgpAssert( mDriverRefNum >= mFirstBlockToTest ·);
7acd7a ¤   pgpAssert( mCurBlock != 0 );
71af5a
5839e9 ¤   GetNextIOInfo( &mCurBlock, &numBlocksToRead );
7baf5a
9eaf5a
cea07a ¤   pgpAssert( numBlocksToRead != 0 );
f24f94 ¤   pgpAssert( numBlocksToRead * kDiskBlockSize <= sizeof( mBuffer ) );
d0090e ¤   pgpAssert( mCurBlock + numBlocksToRead <=
7bb7ff ¤   ¤   ¤   ¤   ¤   mFirstBlockToTest + mNumBlocksToTest );
14af5a
97af5a
f077a8 ¤   MacDebug_FillWithGarbage( pb, sizeof( *pb ) );
4974b4 ¤   pb->ioParam.ioCompletion¤   = sIOCompletion;
7ad0c1 ¤   pb->ioParam.ioVRefNum¤  ¤   = mDriveNumber;
bdef6c ¤   pb->ioParam.ioRefNum¤   ¤   = mDriverRefNum;
c5968e ¤   pb->ioParam.ioBuffer¤   ¤   = mBuffer;
0055b8 ¤   pb->ioParam.ioReqCount¤ ¤   = numBlocksToRead * kDiskBlockSize;
e0cadb ¤   pb->ioParam.ioPosMode¤  ¤   = fsFromStart;
6c67c5 ¤
aaac6f ¤   if ( NeedWidePositioning( mCurBlock, numBlocksToRead) )
325b34 ¤   ¤   {
f60ad7 ¤   ¤   pb->ioParam.ioPosMode¤  |= kWidePosOffsetMask;
a9f659 ¤   ¤   mPB.xpb.ioWPosOffset¤   = CUInt64( 0UL, mCurBlock ) << 9;
df0fe4 ¤   ¤   }
330e24 ¤   else
7f5b34 ¤   ¤   {
f10fe5 ¤   ¤   pb->ioParam.ioPosOffset¤¤   = mCurBlock * kDiskBlockSize;
8b0fe4 ¤   ¤   }
501b52 ¤   ¤
451b52 ¤   ¤
61a0da ¤   if ( mIODirection == kReadDirection )
ef5b34 ¤   ¤   {
2c345c ¤   ¤   err¤= PBReadAsync( pb );
000fe4 ¤   ¤   }
610e24 ¤   else
9d5b34 ¤   ¤   {
67cbcc ¤   ¤   err¤= PBWriteAsync( pb );
950fe4 ¤   ¤   }
0b2462 ¤   AssertNoErr( err, "CInterruptLevelDRVRTester::DoIOFromTimeMgrTask" );
119371 ¤   }
db67c5 ¤
--0880 001d5a40a1040120065 Page 4 of CInterruptLevelDRVRTester.cp
2a67c5 ¤
c4af5a
d5af5a
--3d51 00135707baa40120066 Page 1 of CInterruptLevelDRVRTester.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
d2e43f ¤   $Id: CInterruptLevelDRVRTester.h,v 1.3.8.1 1998/11/12 03:06:19 heller Exp $
e0f7f7 ____________________________________________________________________________*/
dbaf5a
0d7b7d #pragma once
22af5a
ffaf5a
502dab #include "CInterruptLevelTester.h"
c2af5a
92af5a
2796cf class CInterruptLevelDRVRTester : public CInterruptLevelTester
bac7a1 ¤   {
2dc369 ¤   protected:
040eb9 ¤   ¤   typedef CInterruptLevelTester¤  inherited;
9b1b52 ¤   ¤
c11dd5 ¤   ¤   short¤  ¤   ¤   mDriveNumber;
980847 ¤   ¤   short¤  ¤   ¤   mDriverRefNum;
0a1b52 ¤   ¤
f48ad6 ¤   ¤   ulong¤  ¤   ¤   mFirstBlockToTest;
07546a ¤   ¤   ulong¤  ¤   ¤   mNumBlocksToTest;
71ee7c ¤   ¤   ulong¤  ¤   ¤   mCurBlock;
811b52 ¤   ¤
751b52 ¤   ¤
5c937d ¤   ¤   virtual OSErr¤  GetTestBlockRange( short fileRefNum,
17a62b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ulong * firstBlockToTest,
a00861 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ulong * numBlocksToTest);
851b52 ¤   ¤
1b1f82 ¤   ¤   virtual void¤   GetNextIOInfo( ulong * startBlockPtr,
78a5ae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ulong * numBlocksPtr);
002806 ¤   ¤   virtual void¤   HandleIOCompletion( MyPB *myPB );
3e6f02 ¤   ¤   virtual void¤   DoIOFromTimeMgrTask( void );
921b52 ¤   ¤
a42378 ¤   ¤   virtual OSErr¤  Setup( short fileRefNum );
5067d4 ¤   public:
c11b52 ¤   ¤
db6a68 ¤   ¤   ¤   ¤   ¤   ¤   CInterruptLevelDRVRTester( void );
52e47f ¤   ¤   virtual¤¤   ¤   ~CInterruptLevelDRVRTester( void );
3562bd ¤   };
--a197 00021b9941440120067 Page 1 of CInterruptLevelFileTester.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
c489dc ¤   $Id: CInterruptLevelFileTester.cp,v 1.4.8.1 1998/11/12 03:06:20 heller Exp $
f6f7f7 ____________________________________________________________________________*/
c9af5a
d5b935 #include <Timer.h>
2f7cab #include <stddef.h>
74c110 #include "pgpMacMemory.h"
68af5a
765f39 #include "SetupA5.h"
3faf5a
19af5a
76fdb7 #if TARGET_RT_MAC_CFM
108120 assumes 68K non-CFM
a77454 #endif
d7af5a
66ffee #include "CInterruptLevelFileTester.h"
d4af5a
98af5a
d3d70f CInterruptLevelFileTester::CInterruptLevelFileTester( )
789a51 ¤   : CInterruptLevelTester()
8fc7a1 ¤   {
858e70 ¤   OSErr¤  err¤= noErr;
aa67c5 ¤
cae2aa ¤   mCurMark¤   ¤   ¤   = 0;
9467c5 ¤
53e68f ¤   RememberA5();
dc9371 ¤   }
baaf5a
5daf5a
8a2d2b CInterruptLevelFileTester::~CInterruptLevelFileTester( )
5cc7a1 ¤   {
56660a ¤   if ( mTestInProgress )
125b34 ¤   ¤   {
464ee6 ¤   ¤   Stop();
300fe4 ¤   ¤   }
699371 ¤   }
3267c5 ¤
5767c5 ¤
9a6d52 ¤   void
8ef3dc CInterruptLevelFileTester::HandleIOCompletion( MyPB *myPB )
a2c7a1 ¤   {
2696cb ¤   ParamBlockRec *¤pb¤ = &myPB->pb;
3967c5 ¤
990075 ¤   mCurMark¤   += pb->ioParam.ioActCount;
1e9852 ¤   if ( mCurMark > mEOF )
117668 ¤   ¤   mCurMark¤   = 0;
bc67c5 ¤
d0300c ¤   inherited::HandleIOCompletion( myPB );
569371 ¤   }
0c67c5 ¤
d267c5 ¤
1167c5 ¤
dd6d52 ¤   void
b93f90 CInterruptLevelFileTester::DoIOFromTimeMgrTask()
41c7a1 ¤   {
5949ee ¤   ParamBlockRec *¤pb;
bf6920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
64cddf ¤   ulong¤  ¤   ¤   reqCount;
c167c5 ¤
780804 ¤   mPB.thisObject¤ = this;
7a1f41 ¤   pb¤ = &mPB.pb;
af67c5 ¤
f563f2 ¤   reqCount¤   = sizeof( mBuffer );
2d7180 ¤   if ( mCurMark + reqCount > mEOF )
8b5b34 ¤   ¤   {
a67668 ¤   ¤   mCurMark¤   = 0;
dc0fe4 ¤   ¤   }
b867c5 ¤
2177a8 ¤   MacDebug_FillWithGarbage( pb, sizeof( *pb ) );
--0a77 001ebd755d740120067 Page 2 of CInterruptLevelFileTester.cp
fb74b4 ¤   pb->ioParam.ioCompletion¤   = sIOCompletion;
b2ce4d ¤   pb->ioParam.ioRefNum¤   ¤   = mFileRefNum;
af968e ¤   pb->ioParam.ioBuffer¤   ¤   = mBuffer;
bd2daf ¤   pb->ioParam.ioReqCount¤ ¤   = reqCount;
54cadb ¤   pb->ioParam.ioPosMode¤  ¤   = fsFromStart;
f2c6f0 ¤   pb->ioParam.ioPosOffset¤¤   = mCurMark;
0f67c5 ¤
85a0da ¤   if ( mIODirection == kReadDirection )
395b34 ¤   ¤   {
e3345c ¤   ¤   err¤= PBReadAsync( pb );
ff0fe4 ¤   ¤   }
b70e24 ¤   else
865b34 ¤   ¤   {
81cbcc ¤   ¤   err¤= PBWriteAsync( pb );
430fe4 ¤   ¤   }
f69371 ¤   }
6867c5 ¤
6467c5 ¤
2d67c5 ¤
85eacd ¤   OSErr
b67ac6 CInterruptLevelFileTester::Setup( short¤fileRefNum )
8bc7a1 ¤   {
4b8e70 ¤   OSErr¤  err¤= noErr;
0f67c5 ¤
d1bd43 ¤   err¤= inherited::Setup( fileRefNum );
0b5ecc ¤   if ( IsntErr( err ) )
b35b34 ¤   ¤   {
f37bdd ¤   ¤   err¤= GetEOF( fileRefNum, &mEOF );
b3c934 ¤   ¤   AssertNoErr( err, "CInterruptLevelFileTester::Setup" );
090fe4 ¤   ¤   }
781b52 ¤   ¤
76deb7 ¤   return( err );
b69371 ¤   }
14af5a
6267c5 ¤
d967c5 ¤
ebaf5a
--6aa9 0016c90b73740120068 Page 1 of CInterruptLevelFileTester.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
151bcd ¤   $Id: CInterruptLevelFileTester.h,v 1.3.8.1 1998/11/12 03:06:20 heller Exp $
b8f7f7 ____________________________________________________________________________*/
c3af5a
097b7d #pragma once
39af5a
2daf5a
232dab #include "CInterruptLevelTester.h"
bfaf5a
79660b class CInterruptLevelFileTester : public CInterruptLevelTester
bdc7a1 ¤   {
6a5ed4 public:
0d6853 ¤   ¤   enum IODirection { kReadDirection, kWriteDirection };
8d1b52 ¤   ¤
32a2d3 protected:
2f0eb9 ¤   ¤   typedef CInterruptLevelTester¤  inherited;
971b52 ¤   ¤
adc369 ¤   ¤   long¤   ¤   ¤   mCurMark;
6c8ae7 ¤   ¤   long¤   ¤   ¤   mEOF;
bf1b52 ¤   ¤
a51b52 ¤   ¤
8f714e ¤   ¤   virtual void¤   ¤   HandleIOCompletion( MyPB *myPB );
46fd3a ¤   ¤   virtual void¤   ¤   DoIOFromTimeMgrTask( void );
eaa223 ¤   ¤   virtual OSErr¤  ¤   Setup( short¤   fileRefNum );
8e5ed4 public:
b8242d ¤   ¤   ¤   ¤   ¤   CInterruptLevelFileTester( void );
0ae003 ¤   ¤   virtual¤¤   ~CInterruptLevelFileTester( ·);
6c62bd ¤   };
--6195 0001206aef740120069 Page 1 of CInterruptLevelTestMgr.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
dd3b83 ¤   $Id: CInterruptLevelTestMgr.cp,v 1.6.8.1 1998/11/12 03:06:21 heller Exp $
dff7f7 ____________________________________________________________________________*/
05af5a
09b935 #include <Timer.h>
177cab #include <stddef.h>
61c110 #include "pgpMacMemory.h"
c2bbf4 #include "MacFiles.h"
52af5a
579876 #include "CInterruptLevelTestMgr.h"
fdffee #include "CInterruptLevelFileTester.h"
2bcbc3 #include "CInterruptLevelDRVRTester.h"
e3af5a
6caf5a
09af5a
029d05 CInterruptLevelTestMgr::CInterruptLevelTestMgr( short fileRefNum )
d0c7a1 ¤   {
2351b0 ¤   mInProgress¤¤   = false;
e232fd ¤   mFileRefNum¤¤   = fileRefNum;
ef67c5 ¤
d9b040 ¤   mNumTesters¤= 0;
dc7d03 ¤   pgpClearMemory( mTesters, sizeof( mTesters ) );
2c9371 ¤   }
6967c5 ¤
9367c5 ¤
0767c5 ¤
3db04a CInterruptLevelTestMgr::~CInterruptLevelTestMgr( )
34c7a1 ¤   {
8d5456 ¤   Stop();
a79371 ¤   }
abaf5a
8faf5a
81af5a
4a67c5 ¤
0edacc #pragma mark -
12af5a
8467c5 ¤
836d52 ¤   void
34bda0 CInterruptLevelTestMgr::AddTester( CInterruptLevelTester *tester)
d4c7a1 ¤   {
f91b66 ¤   pgpAssert( mNumTesters < kMaxTesters );
bf67c5 ¤
e0346f ¤   mTesters[ mNumTesters ]¤= tester;
596031 ¤   mNumTesters¤+= 1;
9f9371 ¤   }
4a67c5 ¤
6e67c5 ¤
036d52 ¤   void
21fe90 CInterruptLevelTestMgr::CreateTesters( )
e7c7a1 ¤   {
e1c028 ¤   // create half of them as file testers
442aa5 ¤   for( ushort index = 0; index < kMaxTesters / 2; ++index )
0c5b34 ¤   ¤   {
25992b ¤   ¤   AddTester( new CInterruptLevelFileTester( ) );
440fe4 ¤   ¤   }
611b52 ¤   ¤
599244 ¤   // and the other half as disk testers
ef2aa5 ¤   for( ushort index = 0; index < kMaxTesters / 2; ++index )
cc5b34 ¤   ¤   {
7ab4ad ¤   ¤   AddTester( new CInterruptLevelDRVRTester( ) );
c30fe4 ¤   ¤   }
cc9371 ¤   }
8d67c5 ¤
8567c5 ¤
dd6d52 ¤   void
3f6512 CInterruptLevelTestMgr::RunTesters( )
16c7a1 ¤   {
426f87 ¤   for( ushort index = 0; index < mNumTesters; ++index )
125b34 ¤   ¤   {
--03bf 0013bbae47540120069 Page 2 of CInterruptLevelTestMgr.cp
ee3356 ¤   ¤   CInterruptLevelTester::IODirection¤ ioDirection;
0b1b52 ¤   ¤
66bd90 ¤   ¤   if ( (index & 1) != 0 )
dfb3c0 ¤   ¤   ¤   ioDirection¤= CInterruptLevelTester::kReadDirection;
730e1d ¤   ¤   else
0d206a ¤   ¤   ¤   ioDirection¤= CInterruptLevelTester::kWriteDirection;
de1b52 ¤   ¤
2eff1e ¤   ¤   pgpAssert( IsntNull( mTesters[ index ] ) );
871b52 ¤   ¤
3f74a4 ¤   ¤   mTesters[ index ]->Run( mFileRefNum, ioDirection);
150fe4 ¤   ¤   }
349371 ¤   }
10af5a
60af5a
df67c5 ¤
0b6d52 ¤   void
b47797 CInterruptLevelTestMgr::DeleteTesters( )
a8c7a1 ¤   {
d36f87 ¤   for( ushort index = 0; index < mNumTesters; ++index )
ba5b34 ¤   ¤   {
a4ac98 ¤   ¤   if ( IsntNull( mTesters[ index ] ) )
2ff776 ¤   ¤   ¤   {
846f34 ¤   ¤   ¤   delete mTesters[ index ];
0be16b ¤   ¤   ¤   mTesters[ index ]¤  = nil;
dfa3a6 ¤   ¤   ¤   }
d80fe4 ¤   ¤   }
b967c5 ¤
b5b040 ¤   mNumTesters¤= 0;
d19371 ¤   }
2267c5 ¤
3f67c5 ¤
ceaf5a
8bdacc #pragma mark -
7a67c5 ¤
696d52 ¤   void
4f9010 CInterruptLevelTestMgr::Run( )
2bc7a1 ¤   {
ad049f ¤   mInProgress¤= TRUE;
2867c5 ¤
cbcebe ¤   CreateTesters();
9ebfae ¤   RunTesters();
739371 ¤   }
a6af5a
bfaf5a
3f6d52 ¤   void
dafad5 CInterruptLevelTestMgr::Stop( )
b8c7a1 ¤   {
a2abdd ¤   pgpAssert( mInProgress );
4b67c5 ¤
255773 ¤   if ( mInProgress )
bb5b34 ¤   ¤   {
10ba2d ¤   ¤   OSErr¤  err¤= noErr;
1c1b52 ¤   ¤
bcf668 ¤   ¤   DeleteTesters();
a9637e ¤   ¤   mInProgress¤= false;
8e0fe4 ¤   ¤   }
a29371 ¤   }
a6af5a
bdaf5a
f8af5a
7daf5a
e7af5a
7faf5a
d4af5a
3baf5a
--5960 00197d1250a4012006a Page 1 of CInterruptLevelTestMgr.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
2c0edb ¤   $Id: CInterruptLevelTestMgr.h,v 1.2.8.1 1998/11/12 03:06:22 heller Exp $
07f7f7 ____________________________________________________________________________*/
4caf5a
c67b7d #pragma once
1eaf5a
3baf5a
3d223f class CInterruptLevelTester;
baaf5a
e465e2 class CInterruptLevelTestMgr
7bc7a1 ¤   {
d6a2d3 protected:
bbcac6 ¤   enum { kMaxTesters = 4 };¤  // one disk reader, one disk writer, one file
90a577 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // reader, one file writer
508ca1 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mInProgress;
0567c5 ¤
908827 ¤   CInterruptLevelTester *¤¤   mTesters[ kMaxTesters ];
a5a3f0 ¤   ushort¤ ¤   ¤   ¤   ¤   ¤   mNumTesters;
e167c5 ¤
d49b81 ¤   short¤  ¤   ¤   ¤   ¤   ¤   mFileRefNum;
9167c5 ¤
244f4b ¤   void¤   ¤   ¤   ¤   CreateTesters( void );
149ffa ¤   void¤   ¤   ¤   ¤   RunTesters( void );
8e88ab ¤   void¤   ¤   ¤   ¤   DeleteTesters( void );
5367c5 ¤
6b9fb2 ¤   void¤   ¤   ¤   ¤   AddTester( CInterruptLevelTester *tester );
4e67c5 ¤
b55ed4 public:
df7412 ¤   ¤   ¤   ¤   ¤   ¤   CInterruptLevelTestMgr( short fileRefNum );
f67a72 ¤   virtual¤¤   ¤   ¤   ~CInterruptLevelTestMgr( ·);
9eaf5a
af649f ¤   virtual void¤   ¤   Run( void );
aff916 ¤   virtual void¤   ¤   Stop( void );
4a82f7 };
03af5a
97af5a
--2caa 000361cc65a4012006b Page 1 of CInterruptLevelTester.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
cbf92f ¤   $Id: CInterruptLevelTester.cp,v 1.5.8.1 1998/11/12 03:06:22 heller Exp $
3ef7f7 ____________________________________________________________________________*/
04af5a
6db935 #include <Timer.h>
327cab #include <stddef.h>
38c110 #include "pgpMacMemory.h"
2bbbf4 #include "MacFiles.h"
0485f6 #include "UInt64.h"
2eaf5a
c85f39 #include "SetupA5.h"
35af5a
80af5a
22fdb7 #if TARGET_RT_MAC_CFM
618120 assumes 68K non-CFM
a37454 #endif
bdaf5a
2f2dab #include "CInterruptLevelTester.h"
5baf5a
4faf5a
99af5a
6b7286 CInterruptLevelTester::CInterruptLevelTester()
b87f54 ¤   : mMagic( kMagicValue )
d9c7a1 ¤   {
558e70 ¤   OSErr¤  err¤= noErr;
f167c5 ¤
44e015 ¤   mTestInProgress¤¤   = false;
9e140d ¤   mAcknowledgeDone¤   = false;
9f54de ¤   mIODirection¤   ¤   = kNoDirection;
b967c5 ¤
cde68f ¤   RememberA5();
329371 ¤   }
e7af5a
03af5a
dc5b89 CInterruptLevelTester::~CInterruptLevelTester( )
fbc7a1 ¤   {
dd660a ¤   if ( mTestInProgress )
c75b34 ¤   ¤   {
514ee6 ¤   ¤   Stop();
950fe4 ¤   ¤   }
b29371 ¤   }
09af5a
dbaf5a
69af5a
63eacd ¤   OSErr
4f912a CInterruptLevelTester::Setup( short fileRefNum )
19c7a1 ¤   {
a88e70 ¤   OSErr¤  err¤= noErr;
7167c5 ¤
8e735e ¤   mFileRefNum¤= fileRefNum;
b767c5 ¤
e02222 ¤   mMicrosecondsDelay¤ = DetermineMicrosecondsDelay( fileRefNum );
96deb7 ¤   return( err );
a39371 ¤   }
cc67c5 ¤
1c67c5 ¤
4e22dc ¤   ulong
7b345e CInterruptLevelTester::DetermineMicrosecondsDelay( short fileRefNum )
01c7a1 ¤   {
5c6920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
4edf3f ¤   ulong¤  ¤   ¤   delay¤  = 500;
ac3e96 ¤   const ulong¤¤   kTestSize¤  = 4UL * 104UL;
84f6d9 ¤   const ulong¤¤   kIterations¤= 20;
6baf5a
ecf644 ¤   UnsignedWide¤   startMS;
1f4741 ¤   UnsignedWide¤   stopMS;
bf1eea ¤   Microseconds( &startMS );
f567c5 ¤
366ded ¤   for ( ulong writeCount = 0; writeCount < kIterations; ++writeCount )
--95b1 0009464159e4012006b Page 2 of CInterruptLevelTester.cp
e35b34 ¤   ¤   {
72ea71 ¤   ¤   char¤   buffer[ kTestSize ];
feb4d4 ¤   ¤   long¤   count¤  = kTestSize;
f71b52 ¤   ¤
facb03 ¤   ¤   err¤= FSWrite( fileRefNum, &count, buffer );
a98cf4 ¤   ¤   if ( IsErr( err ) )
8bcdcb ¤   ¤   ¤   break;
da0fe4 ¤   ¤   }
300633 ¤   FlushFile( fileRefNum );
9967c5 ¤
234ea4 ¤   Microseconds( &stopMS );
5067c5 ¤
575ecc ¤   if ( IsntErr( err ) )
b45b34 ¤   ¤   {
160ee7 ¤   ¤   CUInt64¤elapsedMS¤  ¤   = CUInt64( stopMS ) - CUInt64( startMS );
3a196e ¤   ¤   ulong¤  msPerRequest¤   = elapsedMS.lo / kIterations;
9eaf5a
e25a61 ¤   ¤   // give ample CPU time to system; we can always create multiple
107c1f ¤   ¤   // requests
daa219 ¤   ¤   delay¤  = msPerRequest * 10;
ae0fe4 ¤   ¤   }
581b52 ¤   ¤
074adc ¤   AssertNoErr( err, "CInterruptLevelTester::DetermineMicrosecondsDelay" );
ca67c5 ¤
7290d5 ¤   return( delay );
869371 ¤   }
3967c5 ¤
83af5a
3f2811 /*___________________________________________________________________________
559782 ¤   IO is done strictly within the specified file. The test is destructive of
eb5061 ¤   all data within the file.
2cc988 ___________________________________________________________________________*/
8e6d52 ¤   void
943420 CInterruptLevelTester::Run(
def96e ¤   short¤  ¤   ¤   fileRefNum,
259e9e ¤   IODirection¤¤   direction )
d4c7a1 ¤   {
72091c ¤   AssertFileRefNumIsValid( fileRefNum, "CInterruptLevelTester::Run" );
0a67c5 ¤
b4e9a7 ¤   mFileRefNum¤¤   ¤   = fileRefNum;
879e28 ¤   mIODirection¤   ¤   = direction;
0fa90d ¤   mTestInProgress¤¤   = TRUE;
60140d ¤   mAcknowledgeDone¤   = false;
2267c5 ¤
92fb8a ¤   if ( Setup( fileRefNum ) == noErr )
cc5b34 ¤   ¤   {
0e9e00 ¤   ¤   InstallTimeMgrTask();
fc0fe4 ¤   ¤   }
280e24 ¤   else
fd5b34 ¤   ¤   {
1278ee ¤   ¤   mTestInProgress = false;
7b0fe4 ¤   ¤   }
429371 ¤   }
5867c5 ¤
8967c5 ¤
0067c5 ¤
986d52 ¤   void
a60995 CInterruptLevelTester::Stop( )
13c7a1 ¤   {
01ffc1 ¤   pgpAssert( mTestInProgress );
5667c5 ¤
5dd1d2 ¤   mTestInProgress¤= false;
a067c5 ¤
e6b27b ¤   // time mgr, io tasks should set this once they've agreed to stop
50c16a ¤   while( ! mAcknowledgeDone )
6f5b34 ¤   ¤   {
d10fe4 ¤   ¤   }
c49371 ¤   }
cfaf5a
0aaf5a
336d52 ¤   void
947df3 CInterruptLevelTester::HandleIOCompletion( MyPB *myPB )
--52b6 00025c1ffd14012006b Page 3 of CInterruptLevelTester.cp
f7c7a1 ¤   {
1e96cb ¤   ParamBlockRec *¤pb¤ = &myPB->pb;
8999e9 ¤   OSErr¤  ¤   resultErr;
d667c5 ¤
0142d1 ¤   resultErr¤  = pb->ioParam.ioResult;
1367c5 ¤
e3ada2 ¤   if ( resultErr == eofErr )
4ca902 ¤   ¤   resultErr¤  = noErr;
ca1b52 ¤   ¤
5c615b ¤   pgpAssert( resultErr == noErr );
dcaf5a
f99bdc ¤   if ( mTestInProgress && IsntErr( resultErr ) )
695b34 ¤   ¤   {
d8c19f ¤   ¤   // do it again soon...
f29e00 ¤   ¤   InstallTimeMgrTask();
870fe4 ¤   ¤   }
a00e24 ¤   else
b55b34 ¤   ¤   {
9fad32 ¤   ¤   mAcknowledgeDone¤   = TRUE;
480fe4 ¤   ¤   }
bd9371 ¤   }
6b67c5 ¤
df67c5 ¤
3b6685 ¤   pascal void
46b12f CInterruptLevelTester::sIOCompletion()
c4c7a1 ¤   {
f3f37f ¤   long¤   saveD0¤ = GetD0();
3567c5 ¤
a611da ¤   EnterCallbackA5();
7e67c5 ¤
2f49ee ¤   ParamBlockRec *¤pb;
d367c5 ¤
194a16 ¤   pb¤ = (ParamBlockRec *)GetA0();
bc67c5 ¤
b7fe13 ¤   MyPB *¤ myPB;
633b81 ¤   myPB¤   = (MyPB *)(((char *)pb) - offsetof( MyPB, pb ));
5067c5 ¤
6b1ed6 ¤   pgpAssert( myPB->thisObject->mMagic == kMagicValue );
50c50e ¤   myPB->thisObject->HandleIOCompletion( myPB );
e667c5 ¤
6c3da4 ¤   ExitCallbackA5();
c067c5 ¤
b40cfe ¤   SetD0( saveD0 );
bc9371 ¤   }
ea67c5 ¤
5eaf5a
0267c5 ¤
ee6685 ¤   pascal void
ae37ba CInterruptLevelTester::sTimeMgrTask()
4bc7a1 ¤   {
942620 ¤   MyTMTask *myTask¤   = (MyTMTask *)GetA1();
1767c5 ¤
7211da ¤   EnterCallbackA5();
65af5a
1767c5 ¤
977df9 ¤   pgpAssert( offsetof( MyTMTask, tmTask ) == 0 );
c367c5 ¤
c96dba ¤   RmvTime( (QElemPtr)&myTask->tmTask );
a567c5 ¤
20b371 ¤   pgpAssert( myTask->thisObject->mMagic == kMagicValue );
8467c5 ¤
8cbafa ¤   myTask->thisObject->DoIOFromTimeMgrTask();
ea67c5 ¤
813da4 ¤   ExitCallbackA5();
319371 ¤   }
4a67c5 ¤
a867c5 ¤
976d52 ¤   void
5a4270 CInterruptLevelTester::InstallTimeMgrTask()
0fc7a1 ¤   {
fceb3d ¤   TMTask *tmTask;
2567c5 ¤
--23b5 0012b1ecc2f4012006b Page 4 of CInterruptLevelTester.cp
086600 ¤   mMyTMTask.thisObject¤   = this;
3e57d7 ¤   tmTask¤ ¤   ¤   ¤   ¤   = &mMyTMTask.tmTask;
1667c5 ¤
9d40e7 ¤   pgpClearMemory( tmTask, sizeof( *tmTask ) );
23c211 ¤   tmTask->tmAddr¤ ¤   ¤   = (TimerUPP)sTimeMgrTask;
ee67c5 ¤
a03983 ¤   // put it into the queue
d45caa ¤   InsTime( (QElemPtr)tmTask );
8567c5 ¤
ce3133 ¤   // add some variation in, but no more than twice
a6a4d3 ¤   // so that we end up with a delay of [delay, delay * 2]
382b13 ¤   UnsignedWide¤   dummy;
308be7 ¤   Microseconds( &dummy );
458817 ¤   ulong¤  delay¤  = mMicrosecondsDelay + ( dummy.lo % mMicrosecondsDelay );
ffd5f4 ¤   delay¤  = -delay;¤  // indicate that it's microseconds
52a4ab ¤   ·
75178d ¤   pgpAssert( (long)delay < 0 );¤  // microseconds is negative vs positive
8dfdc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // milliseconds
e067c5 ¤
329537 ¤   PrimeTime( (QElemPtr)tmTask, delay );
f89371 ¤   }
9caf5a
aaaf5a
2baf5a
--9a5a 0011d69fdf64012006c Page 1 of CInterruptLevelTester.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
efb202 ¤   $Id: CInterruptLevelTester.h,v 1.2.8.1 1998/11/12 03:06:23 heller Exp $
94f7f7 ____________________________________________________________________________*/
31af5a
907b7d #pragma once
6baf5a
07af5a
d40513 class CInterruptLevelTester
33c7a1 ¤   {
115ed4 public:
0c639b ¤   ¤   enum IODirection { kNoDirection, kReadDirection, kWriteDirection };
231b52 ¤   ¤
0fa2d3 protected:
e2d140 ¤   const OSType¤   mMagic;
f23fa3 ¤   enum { kMagicValue = 'CDTT' };
9367c5 ¤
def5e2 ¤   typedef struct
1f5b34 ¤   ¤   {
2abcef ¤   ¤   TMTask¤ ¤   ¤   ¤   ¤   tmTask;¤// must be first
48bde5 ¤   ¤   CInterruptLevelTester *¤thisObject;
386189 ¤   ¤   } MyTMTask;
ab67c5 ¤
8fcf63 ¤   typedef struct MyPB
fa5b34 ¤   ¤   {
4a5e48 ¤   ¤   union
3df776 ¤   ¤   ¤   {
c975f5 ¤   ¤   ¤   ParamBlockRec¤  pb;
a5e1e6 ¤   ¤   ¤   XIOParam¤   ¤   xpb;
fbc0bf ¤   ¤   ¤   };
a787c7 ¤   ¤   ¤
40557c ¤   ¤   CInterruptLevelTester *¤¤   thisObject;
339a86 ¤   ¤   } MyPB;
9a1b52 ¤   ¤
fb0c29 ¤   ¤   short¤  ¤   ¤   mFileRefNum;
001233 ¤   ¤   Boolean¤¤   ¤   mTestInProgress;
624714 ¤   ¤   Boolean¤¤   ¤   mAcknowledgeDone;
951475 ¤   ¤   IODirection¤¤   mIODirection;
2975b6 ¤   ¤   long¤   ¤   ¤   mMicrosecondsDelay;
341b52 ¤   ¤
592a88 ¤   ¤   enum { kBufferSize¤ = 4096 };
004cc4 ¤   ¤   char¤   ¤   ¤   mBuffer[ kBufferSize ];
cf1b52 ¤   ¤
85a26f ¤   ¤   MyPB¤   ¤   ¤   mPB;
ef9468 ¤   ¤   MyTMTask¤   ¤   mMyTMTask;
6f1b52 ¤   ¤
a5714e ¤   ¤   virtual void¤   ¤   HandleIOCompletion( MyPB *myPB );
cceddf ¤   ¤   static pascal void¤ sIOCompletion( void );
6c892c ¤   ¤   virtual void¤   ¤   DoIOFromTimeMgrTask( void )¤= 0;
661b52 ¤   ¤
572400 ¤   ¤   static pascal void¤ sTimeMgrTask( void );
c8385f ¤   ¤   virtual void¤   ¤   InstallTimeMgrTask( void );
981b52 ¤   ¤
5527c6 ¤   ¤   virtual ulong¤  ¤   DetermineMicrosecondsDelay( short fileRefNum );
9ffada ¤   ¤   virtual OSErr¤  ¤   Setup( short fileRefNum );
731b52 ¤   ¤
1167d4 ¤   public:
811b52 ¤   ¤
acae50 ¤   ¤   ¤   ¤   ¤   CInterruptLevelTester( void );
28f1d2 ¤   ¤   virtual¤¤   ~CInterruptLevelTester( void );
2cae30 ¤   ¤   ¤   ¤   ¤
02893a ¤   ¤   virtual void¤   Run( short fileRefNum, IODirection direction );
e3b1f7 ¤   ¤   virtual void¤   Stop();
1d62bd ¤   };
--a206 00031d3bd6a4012006d Page 1 of CSyncFileTester.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
2c095c ¤   $Id: CSyncFileTester.cp,v 1.5.8.1 1998/11/12 03:06:24 heller Exp $
1cf7f7 ____________________________________________________________________________*/
56af5a
62b935 #include <Timer.h>
0f7cab #include <stddef.h>
83c110 #include "pgpMacMemory.h"
27af5a
10af5a
91e73f #include "CSyncFileTester.h"
d4af5a
43af5a
db6dc0 CSyncFileTester::CSyncFileTester( short testFileRefNum )
7bc7a1 ¤   {
348e70 ¤   OSErr¤  err¤= noErr;
4a67c5 ¤
8bc7b9 ¤   mCurMark¤   = 0;
89e4da ¤   mEOF¤   ¤   = 0;
9367c5 ¤
273d7b ¤   mTestRefNum¤= testFileRefNum;
039371 ¤   }
7aaf5a
39af5a
c9f9db CSyncFileTester::~CSyncFileTester( )
81c7a1 ¤   {
d8366c ¤   mTestRefNum¤= 0;
589371 ¤   }
0c67c5 ¤
2daf5a
af6d52 ¤   void
dda82e CSyncFileTester::Run( ·)
ccc7a1 ¤   {
392e65 ¤   const ulong¤kTestSize¤  = 2 * 128UL * 1024UL;
d367c5 ¤
06835f ¤   void *¤ buffer;
e68c4f ¤   ulong¤  bufferSize¤ = kTestSize;
1e67c5 ¤
622ffe ¤   buffer¤ = pgpAllocMac( bufferSize, kMacMemory_PreferTempMem);
b74794 ¤   if ( IsntNull( buffer ) )
8d5b34 ¤   ¤   {
6048e2 ¤   ¤   OSErr¤  ¤   ¤   err;
e1d8ab ¤   ¤   ParamBlockRec¤  pb;
ca1b52 ¤   ¤
fbfd38 ¤   ¤   // do two reads: the first one async, followed by a second sync
5e4370 ¤   ¤   // this tests a difficult case for the driver
56a5ef ¤   ¤   ulong¤  ¤   ¤   readSize¤   = bufferSize / 2;
c71b52 ¤   ¤
efafde ¤   ¤   pb.ioParam.ioCompletion¤¤   = nil;
4255ce ¤   ¤   pb.ioParam.ioVRefNum¤   ¤   = 0;
3b31e5 ¤   ¤   pb.ioParam.ioRefNum¤¤   ¤   = mTestRefNum;
eb95fe ¤   ¤   pb.ioParam.ioBuffer¤¤   ¤   = (Ptr)buffer;
fa52f7 ¤   ¤   pb.ioParam.ioReqCount¤  ¤   = readSize;
61d498 ¤   ¤   pb.ioParam.ioPosMode¤   ¤   = fsAtMark;
9a0dfe ¤   ¤   (void)PBReadAsync( &pb );
0e1b52 ¤   ¤
7aa0b3 ¤   ¤   long¤   count¤  = readSize;
39240c ¤   ¤   err¤= FSRead( mTestRefNum, &count, (Ptr)buffer + readSize );
4b12d6 ¤   ¤   if ( err == eofErr )
a3f776 ¤   ¤   ¤   {
ff2853 ¤   ¤   ¤   SetFPos( mTestRefNum, fsFromStart, 0 );
2dc7c1 ¤   ¤   ¤   err¤= noErr;
09a3a6 ¤   ¤   ¤   }
b236ed ¤   ¤   AssertNoErr( err, "CSyncFileTester::Run" );
521b52 ¤   ¤
927c5c ¤   ¤   // the async case *must* have finished prior to the sync case.
9e1314 ¤   ¤   pgpAssert( pb.ioParam.ioResult != 1 );
771b52 ¤   ¤
eec302 ¤   ¤   pgpFreeMac( buffer );
310fe4 ¤   ¤   }
--4700 001770b95784012006d Page 2 of CSyncFileTester.cp
a19371 ¤   }
9967c5 ¤
0c67c5 ¤
77af5a
--754e 001b895112e4012006e Page 1 of CSyncFileTester.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
ab882f ¤   $Id: CSyncFileTester.h,v 1.2.8.1 1998/11/12 03:06:24 heller Exp $
1bf7f7 ____________________________________________________________________________*/
78af5a
857b7d #pragma once
59af5a
5eaf5a
75cce4 class CSyncFileTester
d4c7a1 ¤   {
9a5ed4 public:
1a6853 ¤   ¤   enum IODirection { kReadDirection, kWriteDirection };
4f1b52 ¤   ¤
13a2d3 protected:
5ef461 ¤   long¤   ¤   ¤   mCurMark;
c303b3 ¤   long¤   ¤   ¤   mEOF;
1d67c5 ¤
91093a ¤   short¤  ¤   ¤   mTestRefNum;
ccb60c ¤   FSSpec¤ ¤   ¤   mTestSpec;
5667c5 ¤
6f67c5 ¤
e95ed4 public:
5c918c ¤   ¤   ¤   ¤   CSyncFileTester( short testFileRefNum );
ff0d12 ¤   virtual¤¤   ~CSyncFileTester( ·);
a867c5 ¤
a7d75d ¤   virtual void¤   Run( void );
b862bd ¤   };
--cab8 000ccf235034012006f Page 1 of CTestDrive.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
4bcb0b ¤   $Id: CTestDrive.cp,v 1.7.8.1 1998/11/12 03:06:25 heller Exp $
04f7f7 ____________________________________________________________________________*/
f1af5a
65b935 #include <Timer.h>
967cab #include <stddef.h>
cec110 #include "pgpMacMemory.h"
3fbbf4 #include "MacFiles.h"
e8af5a
5237d9 #include "DriverAPI.h"
f8231f #include "CTestDrive.h"
ea231f #include "CTestDrive.h"
dae73f #include "CSyncFileTester.h"
c09876 #include "CInterruptLevelTestMgr.h"
01af5a
efaf5a
849ba8 #if PGP_DEBUG¤  // [
5daf5a
9aaf5a
4dcaa7 CTestDrive::CTestDrive(void)
7ac7a1 ¤   {
aa9f94 ¤   mInterruptTestMgr¤  = nil;
115aaf ¤   mSyncTester¤¤   ¤   = nil;
669371 ¤   }
d267c5 ¤
6067c5 ¤
a1c88a CTestDrive::~CTestDrive( )
9fc7a1 ¤   {
6e5456 ¤   Stop();
a49371 ¤   }
6767c5 ¤
8f67c5 ¤
d285ea ¤   OSStatus
a2dd0a CTestDrive::Run( const TestDriveConfiguration *config )
b8c7a1 ¤   {
4175f8 ¤   OSStatus¤   err¤= noErr;
c767c5 ¤
54d128 ¤   pgpAssertAddrValid( config, TestDriveConfiguration );
791b47 ¤   pgpAssert( config->vRefNum < 0 );
d667c5 ¤
630184 ¤   mTestConfiguration¤ = *config;
8567c5 ¤
f31832 ¤   err¤= CreateAndOpenTestFile( mTestConfiguration.vRefNum, &mTestSpec,
ec1bce ¤   ¤   ¤   ¤   &mTestFileRefNum );
625ecc ¤   if ( IsntErr( err ) )
705b34 ¤   ¤   {
92bd87 ¤   ¤   StartInterruptDrivenTest( );
831b52 ¤   ¤
559777 ¤   ¤   mSyncTester¤= new CSyncFileTester( mTestFileRefNum );
cf6247 ¤   ¤   pgpAssert( IsntNull( mSyncTester ) );
420fe4 ¤   ¤   }
3c67c5 ¤
addeb7 ¤   return( err );
179371 ¤   }
e2af5a
56af5a
4367c5 ¤
9eeacd ¤   OSErr
f32a15 CTestDrive::AllocateSpaceToTestFile( short fileRefNum )
b1c7a1 ¤   {
1014d3 ¤   OSErr¤  ¤   err¤= noErr;
38e0a9 ¤   const ulong¤kGigabyte¤  = 1024UL* 1024UL * 1024UL;
bc67c5 ¤
29b1ec ¤   short¤  vRefNum¤= GetVolumeForFile( fileRefNum );
a9ab83 ¤   ulong¤  freeBlocks¤ = GetVolumeFreeAllocBlocks( vRefNum ) *
ca9eb4 ¤   ¤   ¤   ( GetVolumeAllocBlockSize( vRefNum ) / kDiskBlockSize );
860188 ¤   ulong¤  testSizeInBlocks;
0067c5 ¤
ccf989 ¤   if ( freeBlocks > kMaximumBlocksIn4GB )
--09ad 000a230763b4012006f Page 2 of CTestDrive.cp
61ce05 ¤   ¤   freeBlocks¤ = kMaximumBlocksIn4GB;
f067c5 ¤
3899c7 ¤   testSizeInBlocks¤   = freeBlocks / 4;
bf1b52 ¤   ¤
5b57a5 ¤   err¤= SetEOF( fileRefNum, testSizeInBlocks * kDiskBlockSize );
71888d ¤   AssertNoErr( err, "CTestDrive::AllocateAllSpaceOnDiskToFile" );
b767c5 ¤
11deb7 ¤   return( err );
169371 ¤   }
07af5a
baaf5a
3c67c5 ¤
e9eacd ¤   OSErr
1bde71 CTestDrive::CreateAndOpenTestFile(
a52fea ¤   short¤  ¤   vRefNum,
002dcb ¤   FSSpec *¤   spec,
aa2fcc ¤   short *¤¤   fileRefNum)
5fc7a1 ¤   {
ad8e70 ¤   OSErr¤  err¤= noErr;
cc67c5 ¤
1ef4f8 ¤   *fileRefNum¤= 0;
1067c5 ¤
341f9e ¤   // create a test file with a random name
2444b9 ¤   spec->vRefNum¤  = vRefNum;
23ce35 ¤   spec->parID¤¤   = fsRtDirID;
409a29 ¤   NumToString( TickCount(), spec->name );
fa67c5 ¤
07023f ¤   err¤= FSpCreate( spec, 'Temp', 'Temp', smSystemScript );
e1c14c ¤   AssertNoErr( err, "CTestDrive::StartInterruptDrivenTest" );
9f5ecc ¤   if ( IsntErr( err ) )
b65b34 ¤   ¤   {
5e6a62 ¤   ¤   err¤= FSpOpenDF( spec, fsRdWrPerm, fileRefNum );
15fc22 ¤   ¤   AssertNoErr( err, "CTestDrive::StartInterruptDrivenTest" );
621b52 ¤   ¤
7dd798 ¤   ¤   if ( IsntErr( err ) )
d9f776 ¤   ¤   ¤   {
cdf5e3 ¤   ¤   ¤   const ulong¤kTestFileSize¤  = 10 * 1024UL * 1024UL;
4987c7 ¤   ¤   ¤
520c93 ¤   ¤   ¤   err¤= AllocateSpaceToTestFile( *fileRefNum );
39285d ¤   ¤   ¤   AssertNoErr( err, "CTestDrive::CreateAndOpenTestFile" );
a2a3a6 ¤   ¤   ¤   }
dc0fe4 ¤   ¤   }
6267c5 ¤
c4deb7 ¤   return( err );
c69371 ¤   }
1daf5a
42af5a
ee6d52 ¤   void
fe57b9 CTestDrive::Stop( void )
b8c7a1 ¤   {
6175f8 ¤   OSStatus¤   err¤= noErr;
b867c5 ¤
c74452 ¤   StopInterruptDrivenTest();
ec67c5 ¤
821153 ¤   delete mSyncTester;
0edd2e ¤   mSyncTester¤= nil;
8e67c5 ¤
743c47 ¤   if ( mTestFileRefNum != 0 )
115b34 ¤   ¤   {
c5e2f4 ¤   ¤   err¤= FSClose( mTestFileRefNum );
ac38b6 ¤   ¤   AssertNoErr( err, "CTestDrive::Stop" );
481b52 ¤   ¤
310788 ¤   ¤   mTestFileRefNum¤= 0;
4f8499 ¤   ¤   (void)FSpDelete( &mTestSpec );
140fe4 ¤   ¤   }
e667c5 ¤
9c9371 ¤   }
59af5a
5caf5a
16af5a
f76d52 ¤   void
a29d4c CTestDrive::IdleConsumeStack( void )
--e4b8 000006873184012006f Page 3 of CTestDrive.cp
f7c7a1 ¤   {
3aa075 ¤   char¤   eatStackSpace[ 8192 ];
4967c5 ¤
8a38ab ¤   pgpClearMemory( eatStackSpace, sizeof( eatStackSpace ) );
2067c5 ¤
d367c5 ¤
536aa1 ¤   // waste some time while our stack is small to
968db8 ¤   // cause a crash if the driver is using too much stack space
18b625 ¤   ulong¤  counter¤= 0;
324c03 ¤   while ( counter < 8 * 1024UL )
f95b34 ¤   ¤   {
306f0d ¤   ¤   ++counter;
440fe4 ¤   ¤   }
8d9371 ¤   }
a3af5a
f8af5a
85af5a
332811 /*___________________________________________________________________________
0c93e2 ¤   Test the ugly case of a synchronous read which executes out of IODone
b1ecbe ¤   by first making an async drive call followed by a sync driver call.
8ac988 ___________________________________________________________________________*/
186d52 ¤   void
d250d1 CTestDrive::SpecialDriverTest( void )
12c7a1 ¤   {
7d9771 ¤   short¤  driveNumber;
23ebe3 ¤   short¤  driverRefNum;
1667c5 ¤
c7fa49 ¤   GetVolumeDriveNumberAndRefNum( mTestSpec.vRefNum, &driveNumber,
cd2653 ¤   ¤   ¤   ¤   &driverRefNum );
f067c5 ¤
1e2e65 ¤   const ulong¤kTestSize¤  = 2 * 128UL * 1024UL;
62835f ¤   void *¤ buffer;
f18c4f ¤   ulong¤  bufferSize¤ = kTestSize;
e267c5 ¤
b62ffe ¤   buffer¤ = pgpAllocMac( bufferSize, kMacMemory_PreferTempMem);
794794 ¤   if ( IsntNull( buffer ) )
f45b34 ¤   ¤   {
bf48e2 ¤   ¤   OSErr¤  ¤   ¤   err;
3e685b ¤   ¤   ParamBlockRec¤  pb1;
171b52 ¤   ¤
bbfd38 ¤   ¤   // do two reads: the first one async, followed by a second sync
bb4370 ¤   ¤   // this tests a difficult case for the driver
68a5ef ¤   ¤   ulong¤  ¤   ¤   readSize¤   = bufferSize / 2;
8f1b52 ¤   ¤
f755be ¤   ¤   pb1.ioParam.ioCompletion¤   = nil;
f97c61 ¤   ¤   pb1.ioParam.ioVRefNum¤  ¤   = driveNumber;
1e137d ¤   ¤   pb1.ioParam.ioRefNum¤   ¤   = driverRefNum;
961862 ¤   ¤   pb1.ioParam.ioBuffer¤   ¤   = (Ptr)buffer;
4b553a ¤   ¤   pb1.ioParam.ioReqCount¤ ¤   = readSize;
5be9a2 ¤   ¤   pb1.ioParam.ioPosMode¤  ¤   = fsFromStart;
34c586 ¤   ¤   pb1.ioParam.ioPosOffset¤¤   = 0;
666896 ¤   ¤   (void)PBReadAsync( &pb1 );
5c1b52 ¤   ¤
39873f ¤   ¤   ParamBlockRec¤  pb2;
2bf873 ¤   ¤   pb2¤¤   = pb1;
e9e9a2 ¤   ¤   pb1.ioParam.ioPosMode¤  ¤   = fsFromStart;
3dc586 ¤   ¤   pb1.ioParam.ioPosOffset¤¤   = 0;
ccfc8d ¤   ¤   pb2.ioParam.ioBuffer¤   ¤   = (Ptr)buffer + readSize;
8ef024 ¤   ¤   err¤= PBReadSync( &pb2 );
f37c5c ¤   ¤   // the async case *must* have finished prior to the sync case.
de5f6a ¤   ¤   pgpAssert( pb1.ioParam.ioResult != 1 );
341b52 ¤   ¤
94c302 ¤   ¤   pgpFreeMac( buffer );
4c0fe4 ¤   ¤   }
7267c5 ¤
969371 ¤   }
23af5a
3daf5a
6f67c5 ¤
796d52 ¤   void
db8ed9 CTestDrive::Idle( void )
00c7a1 ¤   {
--05be 0019d1705f84012006f Page 4 of CTestDrive.cp
235b82 ¤   pgpAssert( IsntNull( mSyncTester ) );
9b67c5 ¤
269979 ¤   mSyncTester->Run();
3867c5 ¤
49f436 ¤   IdleConsumeStack();
2067c5 ¤
43b5b1 ¤   SpecialDriverTest();
609371 ¤   }
e0af5a
42af5a
e46d52 ¤   void
4d4cf3 CTestDrive::StartInterruptDrivenTest( ·)
9fc7a1 ¤   {
82f59d ¤   pgpAssert( IsNull( mInterruptTestMgr ) );
2267c5 ¤
70fdb7 #if TARGET_RT_MAC_CFM
b91108 ¤   pgpDebugMsg( "Interrupt driven tests are not supported on CFM builds" );
23db21 #else
e98ecc ¤   mInterruptTestMgr¤  = new CInterruptLevelTestMgr( mTestFileRefNum );
44c3e1 ¤   pgpAssert( IsntNull( mInterruptTestMgr ) );
0467c5 ¤
d5667f ¤   if ( IsntNull( mInterruptTestMgr ) )
2e5b34 ¤   ¤   {
5aaff6 ¤   ¤   mInterruptTestMgr->Run();
b30fe4 ¤   ¤   }
b57454 #endif
e19371 ¤   }
f0af5a
dfaf5a
576d52 ¤   void
dd7dea CTestDrive::StopInterruptDrivenTest( )
34c7a1 ¤   {
6e939e ¤   if( mInterruptTestMgr != nil )
ce5b34 ¤   ¤   {
443c26 ¤   ¤   delete mInterruptTestMgr;
8a13eb ¤   ¤   mInterruptTestMgr¤  = nil;
7a0fe4 ¤   ¤   }
5c9371 ¤   }
4967c5 ¤
c576d8 #endif¤ // ]
9daf5a
--7724 0012d348cde40120070 Page 1 of CTestDrive.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
a0d204 ¤   $Id: CTestDrive.h,v 1.3.8.1 1998/11/12 03:06:25 heller Exp $
b8f7f7 ____________________________________________________________________________*/
6caf5a
a57b7d #pragma once
abaf5a
969ba8 #if PGP_DEBUG¤  // [
87af5a
18af5a
9e2692 typedef struct TestDriveConfiguration
4bbb36 {
bfc02a ¤   Str255¤ testName;
9f0feb ¤   short¤  vRefNum;
7c67c5 ¤
052e90 ¤   ushort¤ numDriverReadTasks;
a7ada5 ¤   ulong¤  minDriverReadBlocks;
2668ff ¤   ulong¤  maxDriverReadBlocks;
3067c5 ¤
6e5b2f ¤   ushort¤ numDriverWriteTasks;
8aa5da ¤   ulong¤  minDriverWriteBlocks;
6b58c0 ¤   ulong¤  maxDriverWriteBlocks;
09af5a
94ca7b ¤   ushort¤ numFMReadTasks;
0252ca ¤   ulong¤  minFMReadBytes;
cfdb02 ¤   ulong¤  maxFMReadBytes;
84af5a
4b0216 ¤   ushort¤ numFMWriteTasks;
6fe67b ¤   ulong¤  minFMWriteBytes;
d6acb6 ¤   ulong¤  maxFMWriteBytes;
5e67c5 ¤
397547 } TestDriveConfiguration;
96af5a
38af5a
05c459 class CInterruptLevelTestMgr;
90a1c6 class CSyncFileTester;
3767c5 ¤
94af09 class CTestDrive
bfc7a1 ¤   {
e9a2d3 protected:
56addb ¤   CInterruptLevelTestMgr *¤   mInterruptTestMgr;
848950 ¤   CSyncFileTester *¤  ¤   ¤   mSyncTester;
2867c5 ¤
6d20e4 ¤   TestDriveConfiguration¤ ¤   mTestConfiguration;
a267c5 ¤
1e00bf ¤   short¤  ¤   ¤   ¤   mTestFileRefNum;
34faf7 ¤   FSSpec¤ ¤   ¤   ¤   mTestSpec;
7467c5 ¤
419ea0 ¤   virtual void¤   StartInterruptDrivenTest( void );
42b911 ¤   virtual void¤   StopInterruptDrivenTest( void );
1d67c5 ¤
66e1a9 ¤   OSErr¤  ¤   ¤   AllocateSpaceToTestFile( short fileRefNum );
0f2a38 ¤   OSErr¤  ¤   ¤   CreateAndOpenTestFile( short vRefNum, FSSpec *testSpec,
847a01 ¤   ¤   ¤   ¤   ¤   ¤   short * fileRefNum);
9daf5a
6134f5 ¤   void¤   ¤   ¤   SpecialDriverTest( void );
31a661 ¤   void¤   ¤   ¤   IdleConsumeStack( void );
b75ed4 public:
fe0aa2 ¤   ¤   ¤   ¤   ¤   ¤   CTestDrive( );
78c92c ¤   virtual¤¤   ¤   ¤   ~CTestDrive( );
3f67c5 ¤
1c9ac9 ¤   virtual void¤   ¤   Idle( void );
9d4372 ¤   virtual OSStatus¤   Run( const TestDriveConfiguration *config );
43f916 ¤   virtual void¤   ¤   Stop( void );
9a62bd ¤   };
f2af5a
b8af5a
2d6627 #endif¤ // ]¶
--d85c 0013c9cc18d40120071 Page 1 of TestDrive.prefix
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
d18617 ¤   $Id: TestDrive.prefix,v 1.2.8.1 1998/11/12 03:06:26 heller Exp $
a1f7f7 ____________________________________________________________________________*/
8faf5a
a386c8 #include "PGPDiskDebugFlag.h"
61af5a
7001d8 #include <MacHeaders68K>
40af5a
7aaf5a
3cf692 #include "PGPDiskShared.prefix"
--c894 000ff0e3b8040120072 Page 1 of TestDriveMain.cp
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
7a67c5 ¤
96ed2e ¤   $Id: TestDriveMain.cp,v 1.4.8.1 1998/11/12 03:06:27 heller Exp $
3cf7f7 ____________________________________________________________________________*/
50af5a
cfbbf4 #include "MacFiles.h"
41af5a
ce231f #include "CTestDrive.h"
b4af5a
0a33c8 ¤   static void
f1609a InitMac()
60bb36 {
5cbc3c ¤   UnloadScrap();
1e67c5 ¤
282363 ¤   InitGraf( &qd.thePort);
e50147 ¤   InitFonts();
0e3a8b ¤   InitWindows();
338a72 ¤   InitMenus();
3a7205 ¤   TEInit();
433b83 ¤   InitDialogs( nil );
38709f ¤   InitCursor();
f017b4 ¤   MaxApplZone();
cdefe6 }
4aaf5a
e0af5a
dc33c8 ¤   static void
c2f68c TestForever( short fileRef )
9fc7a1 ¤   {
1dd3f6 ¤   ulong¤  bufferSize¤ = 64UL * 1024UL;
6eb5fa ¤   void *¤ buffer¤ = NewPtrSys( bufferSize );
f18e70 ¤   OSErr¤  err¤= noErr;
80e1bc ¤   ulong¤  eof;
d567c5 ¤
21714d ¤   pgpAssert( IsntNull( buffer ) );
4d67c5 ¤
ac1ba6 ¤   GetEOF( fileRef, (long *)&eof );
5e246a ¤   pgpAssert( eof >= bufferSize );
d367c5 ¤
1672c9 ¤   while ( TRUE )
235b34 ¤   ¤   {
d227f4 ¤   ¤   ulong¤  ¤   ¤   count;
7a7e5d ¤   ¤   EventRecord¤¤   theEvent;
4b1b52 ¤   ¤
4cec87 ¤   ¤   if ( WaitNextEvent( everyEvent, &theEvent, 1, nil) )
aaf776 ¤   ¤   ¤   {
576aed ¤   ¤   ¤   if ( theEvent.what == keyDown &&
d5019b ¤   ¤   ¤   ¤   ¤   ( theEvent.message & charCodeMask ) == '.' )
bc72c3 ¤   ¤   ¤   ¤   {
40c8cb ¤   ¤   ¤   ¤   pgpDebugPStr( "\ptest halted" );
41f622 ¤   ¤   ¤   ¤   break;
5f2613 ¤   ¤   ¤   ¤   }
48a3a6 ¤   ¤   ¤   }
091b52 ¤   ¤
226c48 ¤   ¤   ulong¤  offset;
1f1b52 ¤   ¤
78256d ¤   ¤   offset¤ = ( ( ( (ulong)Random()) << 16) | Random() ) % eof;
2c65da ¤   ¤   if ( offset > eof - bufferSize )
086136 ¤   ¤   ¤   offset¤ = eof - bufferSize;
6a1b52 ¤   ¤
399ade ¤   ¤   err¤= FSWriteAtOffset( fileRef, offset, bufferSize, buffer, &count);
e3e7e5 ¤   ¤   AssertNoErr( err, "TestForever" );
2d1b52 ¤   ¤
0f5c29 ¤   ¤   count¤  = bufferSize;
d1af50 ¤   ¤   err¤= FSRead( fileRef, (long *)&count, buffer );
e912d6 ¤   ¤   if ( err == eofErr )
9bf776 ¤   ¤   ¤   {
6f2a41 ¤   ¤   ¤   SetFPos( fileRef, fsFromStart, 0 );
9ac7c1 ¤   ¤   ¤   err¤= noErr;
01a3a6 ¤   ¤   ¤   }
ff0fe4 ¤   ¤   }
--9bfd 0013663d6f540120072 Page 2 of TestDriveMain.cp
2a67c5 ¤
fc483a ¤   DisposePtr( (Ptr)buffer );
4f9371 ¤   }
b3af5a
2f33c8 ¤   static void
1d0ba4 SyncTest( short vRefNum )
d8c7a1 ¤   {
5e4bee ¤   FSSpec¤ spec = { vRefNum, fsRtDirID, "\ptest file\r" };
cf8e70 ¤   OSErr¤  err¤= noErr;
25dea8 ¤   short¤  fileRef;
e80bfe ¤   const ulong¤kTestFileSize¤  = 50 * 1024UL * 1024UL;
c167c5 ¤
47ae4a ¤   (void)FSpDelete( &spec );
021486 ¤   (void)FSpCreate( &spec, 'fooB', 'FoOb', 0 );
c1e90c ¤   err¤= FSpOpenDF( &spec, fsRdWrPerm, &fileRef );
3d5ecc ¤   if ( IsntErr( err ) )
0f5b34 ¤   ¤   {
9f7a89 ¤   ¤   err¤= SetEOF( fileRef, kTestFileSize );
7b26e3 ¤   ¤   FlushFile( fileRef );
ded798 ¤   ¤   if ( IsntErr( err ) )
eef776 ¤   ¤   ¤   {
ecb0f9 ¤   ¤   ¤   TestForever( fileRef );
74a3a6 ¤   ¤   ¤   }
3687c7 ¤   ¤   ¤
ecacbe ¤   ¤   FSClose( fileRef );
220fe4 ¤   ¤   }
02d584 ¤   AssertNoErr( err, "SyncTest" );
7b9371 ¤   }
4a67c5 ¤
d067c5 ¤
1567c5 ¤
f56d52 ¤   void
487f68 main(void)
2fc7a1 ¤   {
1e5a29 ¤   InitMac();
7267c5 ¤
1a2681 ¤   DebugPatches_PatchDisposeTraps();
a467c5 ¤
015100 ¤   pgpLeaksBeginSession( "main" );
5467c5 ¤
4f5463 ¤   short¤  vRefNum¤= 0;
d0515b ¤   SetD0( 0 );
17c494 ¤   pgpDebugPStr( "\penter vRefNum in D0" );
c4ae5a ¤   vRefNum¤= GetD0();
eb8bd3 ¤   if ( vRefNum != 0 )
d45b34 ¤   ¤   {
86dc17 ¤   ¤   //CTestDrive¤   test( vRefNum );
551dee ¤   ¤   //test.Run();
441b52 ¤   ¤
3e8277 ¤   ¤   SyncTest( vRefNum );
1b0fe4 ¤   ¤   }
7c67c5 ¤
1e86d0 ¤   pgpLeaksEndSession( );
219371 ¤   }
8c67c5 ¤
fc67c5 ¤
5467c5 ¤
6067c5 ¤
36af5a
--87eb 000b180e62640120073 Page 1 of copycat.c
b114b9 /* ======================================================================
a7af5a
8ea814 ···Yet another attempt to make sense of Mac string and buffer manipulation
20e8c6 ···
cec2c0 ···Last Edited: Apr 18, 1996
dce8c6 ···
6a1073 ···Filename: copycat.c
c0af5a
8e2ddf ···Laurence Lundblade <lgl@qualcomm.com>
33b66e ···Myra Callen <t_callen@qualcomm.com>·
6daf5a
ed826f ···Copyright 1995, 1996 QUALCOMM Inc.
89e8c6 ···
fb990d ···This supports:
68a97c ······Pascal Strings - one length byte plus string
0e5a1b ······C Strings ·····- Null terminated string in buffer
5e36cc ······Buffers ·······- String data and a length
e0cf72 ······
18498a ···These mostly return the length of the result
5a7fe0 */
c8af5a
deb1cb #include <ctype.h>
43abb7 #include "copycat.h"
97af5a
2f6389 /* Copy a pascal string into a buffer, return length */
a28649 long copyPB(ConstStringPtr source, char *dest)
98bb36 {
90110c ····BlockMoveData(source+1, dest, *source);
db245d ····return(*source);
c5efe6 }
bbaf5a
4d63cd /* Copy a buffer to a Pascal string, return length */
62a2b4 long copyBP(const char *source, long sourceLen, StringPtr dest)
aebb36 {
dbbef2 ····BlockMoveData(source, dest + 1, sourceLen);
523aa3 ····return(*dest = sourceLen);
8cefe6 }
75af5a
61754c /* Append a pascal string into a buffer, return length */
abfb91 long catPB(ConstStringPtr addition, long destLen, char *dest)
25bb36 {
b01340 ····BlockMoveData(addition + 1, dest + destLen, *addition);
b8c489 ····return(destLen += *addition);
24efe6 }
83af5a
e4aaca /* Append a buffer to a Pascal string, return length */
f4dffe long catBP(const char *addition, long additionLen, StringPtr dest)
58bb36 {
faafc9 ····BlockMoveData(addition, dest + 1 + *dest, additionLen);
4a9d4c ····return(*dest += additionLen);
0eefe6 }
48af5a
e2d4b7 /* Make a copy of a Pascal string, return length */
0b4388 long copyPP(ConstStringPtr source, StringPtr dest)
bcbb36 {
9316c0 ····BlockMoveData(source+1, dest + 1, *source);
7f8bef ····return(*dest = *source);
1cefe6 }
adaf5a
4ee1e3 /* Append a Pascal string to another, return length */
4fbf3d long catPP(ConstStringPtr addition, StringPtr dest)
11bb36 {
744cef ····BlockMoveData(addition + 1, ·dest + 1 + *dest, *addition);
315ded ····return(*dest += *addition);
aeefe6 }
b4af5a
44f172 /* Copy a Pascal string into a C string, return length */
ab3c16 long copyPC(ConstStringPtr source, char *dest)
32bb36 {
c6110c ····BlockMoveData(source+1, dest, *source);
74d8ae ····*(dest + *source) = '\0';
b1245d ····return(*source);
--7e1b 000c157b51540120073 Page 2 of copycat.c
7aefe6 }
46af5a
acfe18 /* Copy C string into a Pascal string, return length */
160392 long copyCP(const char *source, StringPtr dest)
56bb36 {
4cd05a ····const char *¤   s;
3aab10 ····uchar *¤¤   ¤   d;
49869e ····
a30533 ····for(s = source, d = dest +1; *s; *d++ = *s++)
60d7f6 ····¤   {
8a8326 ····¤   }
938c26 ····*dest = s - source;
d7dca0 ····return(*dest);
cbefe6 }
98af5a
07af5a
970975 /* ----------------------------------------------------------------------
656173 ·····A case insensitive strncmp() like thing ····
2dde7b ··
f9436c ···Args: o - First string to compare (NULL terminated)
4996b5 ·········r - Second buffer (string) to compare·
43fac6 ·········n - Length of second string
705fa9 ·········caseignore·
05af5a
b3339c ·Result: integer indicating which is greater
88e8c6 ···
140556 ··----*/
721178 short cmpCB(const char *o, const char *r, long n, short caseignore)
b9bb36 {
1572f1 ····if(r == NULL && o == NULL)
c102ba ······return(0);
3f35e9 ····if(o == NULL)
391e01 ······return(1);
bdf3c2 ····if(r == NULL)
f9c493 ······return(-1);
74af5a
c113d3 ····n--;
226c1e ····while(n && *o &&
960e8e ···········(caseignore ?·
3ae909 ··············((isupper(*o) ?
1ad03c ··············¤ tolower(*o): *o) == (isupper(*r)? tolower(*r): *r)) ·:
f0e7bd ··············(*o == *r))
de49b4 ···········)
c63b37 ····{
fd3e45 ········o++; r++; n--;
fa6fe7 ····}
336913 ····return(caseignore ?·
cfd276 ·············((isupper(*o) ?
efd111 ·············¤  tolower(*o): *o) - (isupper(*r)? tolower(*r): *r)) :
bfb0cf ·············(*o - *r));
f6efe6 }
c367c5 ¤
6d0975 /* ----------------------------------------------------------------------
706173 ·····A case insensitive strncmp() like thing ····
04de7b ··
6fef5e ···Args: o - First string to compare - a PASCAL string
8496b5 ·········r - Second buffer (string) to compare·
fbcafd ·········n - length of second string
a55fa9 ·········caseignore·
8aaf5a
53339c ·Result: integer indicating which is greater
d7e8c6 ···
bf0556 ··----*/
2cd78d short cmpPB(ConstStringPtr o, const char *r, long n, short caseignore)
2ebb36 {
ad49fe ····const uchar *o_end;;
87869e ····
c272f1 ····if(r == NULL && o == NULL)
c602ba ······return(0);
1b35e9 ····if(o == NULL)
2c1e01 ······return(1);
c1f3c2 ····if(r == NULL)
--72b5 001458620ab40120073 Page 3 of copycat.c
a9c493 ······return(-1);
e3cf72 ······
ec4fea ·¤  o_end = o + (*o + 1);
3713d3 ····n--;
0085d4 ····o++;
6fc8bb ····while(n && o < o_end &&
9d0e8e ···········(caseignore ?·
d4e909 ··············((isupper(*o) ?
4d2b68 ··············tolower(*o): *o) == (isupper(*r)? tolower(*r): *r)) ·:
89e7bd ··············(*o == *r))
a449b4 ···········)
0d3b37 ····{
0e3e45 ········o++; r++; n--;
126fe7 ····}
7a6913 ····return(caseignore ?·
62d276 ·············((isupper(*o) ?
7b2d1f ·············tolower(*o): *o) - (isupper(*r)? tolower(*r): *r)) :
41b0cf ·············(*o - *r));
7befe6 }
161b52 ¤   ¤
59af5a
cfaf5a
59af5a
45af5a
--5bae 001d71ecf4440120074 Page 1 of copycat.h
b114b9 /* ======================================================================
a7af5a
8ea814 ···Yet another attempt to make sense of Mac string and buffer manipulation
20e8c6 ···
91f4db ···Filename: copycat.h
d7af5a
5593e0 ···Last Edited: July 17, 1996
90af5a
5e0b1b ···Laurence Lundblade <lgl@qualcomm.com>·
5bb66e ···Myra Callen <t_callen@qualcomm.com>·
41af5a
3085cc ···Copyright 1996 QUALCOMM Inc.
8e7fe0 */
093668 long ·copyPB(ConstStringPtr source, char *dest);
beea1b long ¤  copyBP(const char *source, long sourceLen, StringPtr dest);
daaf5a
fac3a3 long ¤  catPB(ConstStringPtr addition, long destLen, char *dest);
4b0ded long ·catBP(const char *source, long sourceLen, StringPtr dest);
e1af5a
015d89 long ·copyPP(ConstStringPtr source, StringPtr dest);
f32b4a long ·catPP(ConstStringPtr source, StringPtr addition);
77af5a
e39ca0 long ·copyPC(ConstStringPtr source, char *dest);
2f0982 long ·copyCP(const char *source, StringPtr dest);
a9af5a
52fffe short cmpCB(const char *o, const char *r, long n, short caseignore);
d78310 short cmpPB(ConstStringPtr o, const char *r, long n, short caseignore);¶
--bf2c 0006475ffb640120075 Page 1 of ctencode.c
a70335 /*____________________________________________________________________________
92f7f7 ____________________________________________________________________________*/
93af5a
9214b9 /* ======================================================================
1daf5a
b784da ···Eudora Extended Message Services API SDK 1.0b3 (July 11 1996)
60493c ···This SDK supports EMSAPI version 1
a7826f ···Copyright 1995, 1996 QUALCOMM Inc.
b8856d ···Send comments and questions to <emsapi-info@qualcomm.com>
1caf5a
25aea8 ···Function to encode and decode binary data to quoted-printable data.
dc0209 ¤   ·Code extracted from Eudora. Based on Steve Dorner's code.
535886 ·················
825339 ···Last Edited: July 23, 1996
30e8c6 ···
347bba ···Filename: ctencode.c
16af5a
6f93e7 ···Myra Callen <t_callen@qualcomm.com>
102ddf ···Laurence Lundblade <lgl@qualcomm.com>
3baf5a
a8e8c6 ···
fc7fe0 */
32af5a
29abb7 #include "copycat.h"
d26bd2 #include "rfc822.h"
30828b #include "ctencode.h"
7faf5a
b6a833 #define SKIP -1
156465 #define FAIL -2
cd61c6 #define PAD ·-3
cfd595 #define kNewLine¤   ¤   ¤   "\p\015\012"
2caf5a
4c8863 static UPtr gEncode = (UPtr)
0d39ad ¤   ¤   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
d1af5a
3fdea0 static short gDecode[] =·
2cbb36 {
6ad95b ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,
9b654e ¤   FAIL,SKIP,SKIP,FAIL,FAIL,SKIP,FAIL,FAIL,¤   /* 0 */
57d95b ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,
ff8c0f ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,¤   /* 1 */
2ddd82 ¤   SKIP,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,
003570 ¤   FAIL,FAIL,FAIL,0x3e,FAIL,FAIL,FAIL,0x3f,¤   /* 2 */
eb0fc2 ¤   0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,
f73150 ¤   0x3c,0x3d,FAIL,FAIL,FAIL,PAD ,FAIL,FAIL,¤   /* 3 */
09ced9 ¤   FAIL,0x00,0x01,0x02,0x03,0x04,0x05,0x06,
e35d76 ¤   0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,¤   /* 4 */
0982c0 ¤   0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
805384 ¤   0x17,0x18,0x19,FAIL,FAIL,FAIL,FAIL,FAIL,¤   /* 5 */
ea392a ¤   FAIL,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,
531f47 ¤   0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,¤   /* 6 */
df61ec ¤   0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,
4a369a ¤   0x31,0x32,0x33,FAIL,FAIL,FAIL,FAIL,FAIL,¤   /* 7 */
57d95b ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,
b7dd6b ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,¤   /* 8 */
6ed95b ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,
cbd62f ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,¤   /* 9 */
d6d95b ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,
d899fc ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,¤   /* A */
8ad95b ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,
ea8430 ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,¤   /* B */
c6d95b ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,
a98f74 ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,¤   /* C */
4dd95b ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,
45bfa8 ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,¤   /* D */
73d95b ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,
f5b4ec ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,¤   /* E */
52d95b ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,
b8a920 ¤   FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,¤   /* F */
aefcdb /* 0 ···1 ···2 ···3 ···4 ···5 ···6 ···7 ···8
37a996 ¤   9 ···A ···B ···C ···D ···E ···F ·*/
6482f7 };
--87ad 0007c25b9b640120075 Page 2 of ctencode.c
e0af5a
d338e5 /*
227cd2 ·* the encoding is like this:
99775e ·*
0dada7 ·* Binary:<111111><222222><333333>
3b92e1 ·*¤ ¤   ¤   ¤   765432107654321076543210
0c96ba ·* Encode:<1111><2222><3333><4444>
3e495d ·*/
b7d83c ·
6738e5 /*
53f6e2 ·* Bit extracting macros
dc495d ·*/
b863c5 #define Bot2(b) ((b)&0x3)
ec6176 #define Bot4(b) ((b)&0xf)
c85310 #define Bot6(b) ((b)&0x3f)
a7b929 #define Top2(b) Bot2((b)>>6)
b4e633 #define Top4(b) Bot4((b)>>4)
e3917b #define Top6(b) Bot6((b)>>2)
67af5a
1aaf5a
f81cf3 /************************************************************************
8133d6 ·* Encode64 - convert binary data to base64
c9ed4c ·* ·binPtr -> the binary data (or nil to close encoder)
1a77c2 ·*¤ binLen -> the length of the binary data
bc5e2f ·* ·sixFourPtr -> pointer to buffer for the base64 data
0116e7 ·*¤ sixFourLen <- the length of the base64 data
3c5c45 ·* ·e64 <-> state; caller must preserve
7345aa ·* ·returns kCTEDoneOK or kCTEFailed
7753c2 ·************************************************************************/
90f2ec short Encode64(UPtr binPtr, long binLen, UPtr sixFourPtr,·
3ec87b ¤   ¤   ¤   ¤   long *sixFourBufSize, Enc64Ptr e64)
cdbb36 {
4847b2 ¤   UPtr ¤  ¤   binSpot;¤   ¤   ¤   /* the byte currently being decoded */
13c78d ¤   UPtr ¤  ¤   sixFourSpot = sixFourPtr;
d021f3 ¤   ¤   ¤   ¤   /* the spot to which to copy the encoded chars */
e8ddf9 ¤   short ¤ bpl;
16a29f ¤   UPtr¤   ¤   end;¤   ¤   ¤   ¤   ¤   ¤   /* end of integral decoding */
fee130 ¤   PStr¤   ¤   newLine = kNewLine;
ffaf5a
2826cf ¤   bpl = e64->bytesOnLine;¤/* in inner loop; want local copy */
0daf5a
b49b20 ¤   if (binLen)
c2c7a1 ¤   {
8267c5 ¤
c41b17 ¤   ¤   /*
bb8768 ¤   ¤   ·* do we have any stuff left from last time?
759de3 ¤   ¤   ·*/
225d9e ¤   ¤   if (e64->partialCount)
d85b34 ¤   ¤   {
c5f4d1 ¤   ¤   ¤   short needMore = 3 - e64->partialCount;
c6fa22 ¤   ¤   ¤   if (binLen >= needMore)
2af776 ¤   ¤   ¤   {
91980e ¤   ¤   ¤   ¤   /*
493f46 ¤   ¤   ¤   ¤   ·* we can encode some bytes
811020 ¤   ¤   ¤   ¤   ·*/
3fc83f ¤   ¤   ¤   ¤   BlockMoveData(binPtr,e64->partial+e64->partialCount,needMore);
1bab5e ¤   ¤   ¤   ¤   binLen -= needMore;
e18aa2 ¤   ¤   ¤   ¤   binPtr += needMore;
4e87c7 ¤   ¤   ¤
5fc6de ¤   ¤   ¤   ··do¤
ed6e50 ¤   ¤   ¤   ¤   {¤
9a39d0 ¤   ¤   ¤   ¤   ¤   if ((bpl)==68)¤ ¤   ¤   ¤   ¤   ¤   ¤
554859 ¤   ¤   ¤   ¤   ¤   {
192207 ¤   ¤   ¤   ¤   ¤   ¤   int m_nl;
44ddbf ¤   ¤   ¤   ¤   ¤   ¤   for (m_nl=0;m_nl<*(newLine);)¤
396fd7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   *(sixFourSpot)++ = (newLine)[++m_nl];
51c499 ¤   ¤   ¤   ¤   ¤   ¤   (bpl) = 0;
d01c89 ¤   ¤   ¤   ¤   ¤   }
a49948 ¤   ¤   ¤   ¤   ¤   (bpl) += 4;
bb835c ¤   ¤   ¤   ¤   ¤   *(sixFourSpot)++ = gEncode[Top6((e64->partial)[0])];
44a53e ¤   ¤   ¤   ¤   ¤   *(sixFourSpot)++ = gEncode[Bot2((e64->partial)[0])<<4 |
7c5aa6 ¤   ¤   ¤   ¤   ¤   ¤   Top4((e64->partial)[1])];¤
--93ce 0004ebf58ef40120075 Page 3 of ctencode.c
401c9b ¤   ¤   ¤   ¤   ¤   *(sixFourSpot)++ = gEncode[Bot4((e64->partial)[1])<<2 |
3da15f ¤   ¤   ¤   ¤   ¤   ¤   ¤   Top2((e64->partial)[2])];
fbe405 ¤   ¤   ¤   ¤   ¤   *(sixFourSpot)++ = gEncode[Bot6((e64->partial)[2])];
c0b889 ¤   ¤   ¤   ¤   }¤
c83ea4 ¤   ¤   ¤   ¤   while (0);
f5af5a
84eb92 ¤   ¤   ¤   ¤   if ( *sixFourBufSize < ·sixFourSpot - sixFourPtr )
66af67 ¤   ¤   ¤   ¤   ¤   ¤   return( kCTEFailed );
d2af5a
c03e04 ¤   ¤   ¤   ¤   e64->partialCount = 0;
79a3a6 ¤   ¤   ¤   }
5b7aad ¤   ¤   ¤   /*
a14cef ¤   ¤   ¤   ·* if we don't have enough bytes to complete the leftovers, we
e50ce1 ¤   ¤   ¤   ·* obviously don't have 3 bytes. ·So the encoding code will fall
f0cac3 ¤   ¤   ¤   ·* through to the point where we copy the leftovers to the partial
2810a2 ¤   ¤   ¤   ·* buffer. ·As long as we're careful to append and not copy blindly,
ba6491 ¤   ¤   ¤   ·* we'll be fine.
aa8753 ¤   ¤   ¤   ·*/
e00fe4 ¤   ¤   }
f667c5 ¤
681b17 ¤   ¤   /*
2c4dbf ¤   ¤   ·* we encode the integral multiples of three
269de3 ¤   ¤   ·*/
e7006b ¤   ¤   end = binPtr + 3*(binLen/3);
f8bf33 ¤   ¤   for (binSpot = binPtr; binSpot < end; binSpot += 3)
72ae86 ¤   ¤   { do
a58cf3 ¤   ¤   ¤   {¤
903aa7 ¤   ¤   ¤   ¤   if ((bpl)==68)¤ ¤   ¤   ¤   ¤   ¤   ¤
1472c3 ¤   ¤   ¤   ¤   {
7c150f ¤   ¤   ¤   ¤   ¤   int m_nl;
cfcc98 ¤   ¤   ¤   ¤   ¤   for (m_nl=0;m_nl<*(newLine);)¤
85d3ce ¤   ¤   ¤   ¤   ¤   ¤   *(sixFourSpot)++ = (newLine)[++m_nl];
5348e6 ¤   ¤   ¤   ¤   ¤   (bpl) = 0;
192613 ¤   ¤   ¤   ¤   }
503416 ¤   ¤   ¤   ¤   (bpl) += 4;
08245e ¤   ¤   ¤   ¤   *(sixFourSpot)++ = gEncode[Top6((binSpot)[0])];
2c5422 ¤   ¤   ¤   ¤   *(sixFourSpot)++ = gEncode[Bot2((binSpot)[0])<<4 |
188a57 Top4((binSpot)[1])];¤
93e12d ¤   ¤   ¤   ¤   *(sixFourSpot)++ = gEncode[Bot4((binSpot)[1])<<2 |
cc51bc Top2((binSpot)[2])];¤
fdac95 ¤   ¤   ¤   ¤   *(sixFourSpot)++ = gEncode[Bot6((binSpot)[2])];
275a2a ¤   ¤   ¤   }¤
28dc45 ¤   ¤   ¤   while (0);
6aaf5a
a9666e ¤   ¤   ¤   if ( *sixFourBufSize < ·sixFourSpot - sixFourPtr )
3e96a2 ¤   ¤   ¤   ¤   ¤   return( kCTEFailed );
770fe4 ¤   ¤   }
cf67c5 ¤
7d1b17 ¤   ¤   /*
f1451c ¤   ¤   ·* now, copy the leftovers to the partial buffer
689de3 ¤   ¤   ·*/
5a2cdd ¤   ¤   binLen = binLen % 3;
f90c53 ¤   ¤   if (binLen)
c65b34 ¤   ¤   {
c34afe ¤   ¤   ¤   BlockMoveData(binSpot,e64->partial+e64->partialCount,binLen);
8576ce ¤   ¤   ¤   e64->partialCount += binLen;
b50fe4 ¤   ¤   }
7ddf1c ··}
c00e24 ¤   else
2ac7a1 ¤   {
ba1b17 ¤   ¤   /*
7b0e92 ¤   ¤   ·* we've been called to cleanup the leftovers
7c9de3 ¤   ¤   ·*/
535d9e ¤   ¤   if (e64->partialCount)
3e5b34 ¤   ¤   {
a59bb3 ¤   ¤   ¤   if (e64->partialCount<2) e64->partial[1] = 0;
2f35e4 ¤   ¤   ¤   e64->partial[2] = 0;
53af5a
cc6da3 ¤   ¤   ¤   do
5c8cf3 ¤   ¤   ¤   {¤
ae3aa7 ¤   ¤   ¤   ¤   if ((bpl)==68)¤ ¤   ¤   ¤   ¤   ¤   ¤
4e72c3 ¤   ¤   ¤   ¤   {
--53e8 000479f480240120075 Page 4 of ctencode.c
d3150f ¤   ¤   ¤   ¤   ¤   int m_nl;
18cc98 ¤   ¤   ¤   ¤   ¤   for (m_nl=0;m_nl<*(newLine);)¤
39d3ce ¤   ¤   ¤   ¤   ¤   ¤   *(sixFourSpot)++ = (newLine)[++m_nl];
ef48e6 ¤   ¤   ¤   ¤   ¤   (bpl) = 0;
ed2613 ¤   ¤   ¤   ¤   }
b73416 ¤   ¤   ¤   ¤   (bpl) += 4;
32842a ¤   ¤   ¤   ¤   *(sixFourSpot)++ = gEncode[Top6((e64->partial)[0])];
b4be37 ¤   ¤   ¤   ¤   *(sixFourSpot)++ = gEncode[Bot2((e64->partial)[0])<<4 |
904c58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Top4((e64->partial)[1])];¤
f80792 ¤   ¤   ¤   ¤   *(sixFourSpot)++ = gEncode[Bot4((e64->partial)[1])<<2 |
be37bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Top2((e64->partial)[2])];¤
efe373 ¤   ¤   ¤   ¤   *(sixFourSpot)++ = gEncode[Bot6((e64->partial)[2])];
ce5a2a ¤   ¤   ¤   }¤
cfdc45 ¤   ¤   ¤   while (0);
d1af5a
a9666e ¤   ¤   ¤   if ( *sixFourBufSize < ·sixFourSpot - sixFourPtr )
9996a2 ¤   ¤   ¤   ¤   ¤   return( kCTEFailed );
871b52 ¤   ¤
b77aad ¤   ¤   ¤   /*
2a6440 ¤   ¤   ¤   ·* now, replace the unneeded bytes with ='s
428753 ¤   ¤   ¤   ·*/
b8f49d ¤   ¤   ¤   sixFourSpot[-1] = '=';
a4ed18 ¤   ¤   ¤   if (e64->partialCount==1) sixFourSpot[-2] = '=';
7d0fe4 ¤   ¤   }
f99371 ¤   }
9e7d89 ¤   e64->bytesOnLine = bpl;¤/* copy back to state buffer */
1d1d41 ¤   *sixFourBufSize = sixFourSpot - sixFourPtr; ·/* return actual buffer size */
65af5a
2403cc ¤   return( kCTEDoneOK );
46efe6 }
8eaf5a
b5af5a
7faf5a
c01cf3 /************************************************************************
af0f58 ·* Decode64 - convert base64 data to binary
1464d9 ·* ·sixFourPtr -> the base64 data (or nil to close decoder)
9528a7 ·* ·sixFourLen -> the length of the base64 data
b37c07 ·* ·binPtr -> pointer to buffer to hold binary data
eb6973 ·* ·binLen <- length of binary data
9b66eb ·* ·d64 <-> pointer to decoder state
1e0a45 ·*¤ decErrCnt <- the number of decoding errors found
7245aa ·* ·returns kCTEDoneOK or kCTEFailed
6d53c2 ·************************************************************************/
651d8a short Decode64(UPtr sixFourPtr, long sixFourLen, UPtr binPtr, long *binBufSize,·
d562ca ¤   ¤   ¤   ¤   Dec64Ptr d64, long *decErrCnt)
c6bb36 {
782d83 ¤   short ¤ decode;¤¤   ¤   ¤   ¤   ¤   ¤   ¤   /* the decoded short */
ac66f3 ¤   Byte ¤  ¤   c;¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* the decoded byte */
f3e591 ¤   /* separate short & the byte so the compiler can worry about byteorder */
844b8a ¤   UPtr ¤  ¤   end = sixFourPtr + sixFourLen;¤ /* stop decoding here */
6143d6 ¤   UPtr ¤  ¤   binSpot = binPtr;¤  ¤   ¤   /* current output character */
4e8df9 ¤   short ¤ decoderState;¤  ¤   /* which of 4 bytes are we seeing now? */
c9a617 ¤   long ¤  ¤   invalCount;¤/* how many bad chars found this time around? */
daa8d3 ¤   long ¤  ¤   padCount;¤  ¤   /* how many pad chars found so far? */
59a9a9 ¤   Byte ¤  ¤   partial;/* partially decoded byte from/for last/next time */
602cbc ¤   Boolean wasCR;
56ef1b ¤   UPtr¤   ¤   sixFourStartPtr;
faaf5a
37d8af ¤   /*
601817 ¤   ·* fetch state from caller's buffer
d5a4e3 ¤   ·*/
9c4201 ¤   decoderState = d64->decoderState;
6e3dd3 ¤   invalCount = 0;¤/* we'll add the invalCount to the buffer later */
7df97a ¤   padCount = d64->padCount;
f6078b ¤   partial = d64->partial;
f87729 ¤   wasCR = d64->wasCR;
12af5a
a2aa43 ¤   if (sixFourLen)
a9c7a1 ¤   {
9d5799 ¤   ¤   sixFourStartPtr = sixFourPtr;
edf0bd ¤   ¤   for (;sixFourPtr<end;sixFourPtr++)
475b34 ¤   ¤   {
--64dc 000d84101cd40120075 Page 5 of ctencode.c
cd7742 ¤   ¤   ¤   switch(decode=gDecode[*sixFourPtr])
67f776 ¤   ¤   ¤   {
6c5987 ¤   ¤   ¤   ¤   case SKIP: break;¤  ¤   ¤   ¤   /* skip whitespace */
e46096 ¤   ¤   ¤   ¤   case FAIL: invalCount++; break;¤/* count invalid characters */
03fe30 ¤   ¤   ¤   ¤   case PAD: padCount++; break;¤   /* count pad characters */
a36ab9 ¤   ¤   ¤   ¤   default:
8ba3e7 ¤   ¤   ¤   ¤   ¤   /*
1dc7c4 ¤   ¤   ¤   ¤   ¤   ·* found a non-pad character,
52f7e5 ¤   ¤   ¤   ¤   ¤   ·* so if we had previously found a pad,
408621 ¤   ¤   ¤   ¤   ¤   ·* that pad was an error
a3ec4b ¤   ¤   ¤   ¤   ·¤  */
f47185 ¤   ¤   ¤   ¤   ¤   if (padCount) {invalCount+=padCount;padCount=0;}
152b85 ¤   ¤   ¤   ¤
35a3e7 ¤   ¤   ¤   ¤   ¤   /*
3fc187 ¤   ¤   ¤   ¤   ¤   ·* extract the right bits
8e6ad4 ¤   ¤   ¤   ¤   ¤   ·*/
593226 ¤   ¤   ¤   ¤   ¤   c = decode;
196a1a ¤   ¤   ¤   ¤   ¤   switch (decoderState)
6f4859 ¤   ¤   ¤   ¤   ¤   {
815463 ¤   ¤   ¤   ¤   ¤   ¤   case 0:
3d96b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   partial = c<<2;
a63f27 ¤   ¤   ¤   ¤   ¤   ¤   ¤   decoderState++;
1a8c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
400ebf ¤   ¤   ¤   ¤   ¤   ¤   case 1:
22c42a ¤   ¤   ¤   ¤   ¤   ¤   ¤   *binSpot++ = partial|Top4(c);
4d4730 ¤   ¤   ¤   ¤   ¤   ¤   ¤   partial = Bot4(c)<<4;
d03f27 ¤   ¤   ¤   ¤   ¤   ¤   ¤   decoderState++;
4b8c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
abe1db ¤   ¤   ¤   ¤   ¤   ¤   case 2:
78cc7c ¤   ¤   ¤   ¤   ¤   ¤   ¤   *binSpot++ = partial|Top6(c);
005697 ¤   ¤   ¤   ¤   ¤   ¤   ¤   partial = Bot2(c)<<6;
863f27 ¤   ¤   ¤   ¤   ¤   ¤   ¤   decoderState++;
f78c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
35bb07 ¤   ¤   ¤   ¤   ¤   ¤   case 3:
941496 ¤   ¤   ¤   ¤   ¤   ¤   ¤   *binSpot++ = partial|c;
991b2f ¤   ¤   ¤   ¤   ¤   ¤   ¤   decoderState=0;
8e8c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
cd0a52 ¤   ¤   ¤   ¤   ¤   } /* switch decoderState */
e942e8 ¤   ¤   ¤   } /* switch decode */
801b52 ¤   ¤
9c02c3 ¤   ¤   ¤   /* make sure we're not writing past the end of the buffer */
e1bae9 ¤   ¤   ¤   if ( *binBufSize < ·binSpot - binPtr )
09af67 ¤   ¤   ¤   ¤   ¤   ¤   return( kCTEFailed );
c6af5a
1b1b52 ¤   ¤
1c32e7 ¤   ¤   } /* for sixFourPtr */
42d0ed ¤   } /* if sixFourLen */
700e24 ¤   else
01c7a1 ¤   {
e51b17 ¤   ¤   /*
e0e193 ¤   ¤   ·* all done. ·Did all end up evenly?
2d9de3 ¤   ¤   ·*/
b28e8f ¤   ¤   switch (decoderState)
125b34 ¤   ¤   {
1a75ac ¤   ¤   ¤   case 0:
8fb46c ¤   ¤   ¤   ¤   invalCount += padCount;
37ad69 ¤   ¤   ¤   ¤   /* came out evenly, so should be no pads */
d0f622 ¤   ¤   ¤   ¤   break;
dd2f70 ¤   ¤   ¤   case 1:
7cc0dc ¤   ¤   ¤   ¤   invalCount++;¤  ¤   ¤   ¤   /* data missing */
fcb46c ¤   ¤   ¤   ¤   invalCount += padCount;
e34123 ¤   ¤   ¤   ¤   /* since data missing; should be no pads */
a2f622 ¤   ¤   ¤   ¤   break;
d6c014 ¤   ¤   ¤   case 2:
40c4ab ¤   ¤   ¤   ¤   invalCount += ABS(padCount-2);¤ /* need exactly 2 pads */
5cf622 ¤   ¤   ¤   ¤   break;
379ac8 ¤   ¤   ¤   case 3:
448b4c ¤   ¤   ¤   ¤   invalCount += ABS(padCount-1);¤ /* need exactly 1 pad */
26f622 ¤   ¤   ¤   ¤   break;
f40fe4 ¤   ¤   }
4c9371 ¤   }
d8af5a
--b059 0008bcd34b040120075 Page 6 of ctencode.c
7e1232 ¤   *binBufSize = binSpot - binPtr; ··¤ /* return actual buffer size */
0daf5a
8bd8af ¤   /*
1134d3 ¤   ·* save state in caller's buffer
94a4e3 ¤   ·*/
b6bf77 ¤   d64->decoderState = decoderState;
e23bca ¤   d64->invalCount += invalCount;
aed820 ¤   d64->padCount = padCount;
23d1c4 ¤   d64->partial = partial;
f1f1f6 ¤   d64->wasCR = wasCR;
e2af5a
db4fd1 ¤   *decErrCnt = invalCount;
7903cc ¤   return( kCTEDoneOK );
adefe6 }
8faf5a
09af5a
6baf5a
241cf3 /************************************************************************
f03e17 ·* EncodeQP - convert binary data to quoted-printable
e97fb4 ·* ·binPtr -> the binary data
976001 ·*¤ binLen -> the length of the binary data (or nil to close encoder)
9e16d5 ·* ·qpPtr -> pointer to buffer for the quoted-printable data
1028e8 ·*¤ qpBufSize <-> length of the quoted-printable buffer, returns actual length
dc72f1 ·* ·eQP <-> encoder state for bytes per line; caller must preserve
2f45aa ·* ·returns kCTEDoneOK or kCTEFailed
5453c2 ·************************************************************************/
fa0347 long EncodeQP(UPtr binPtr, long binLen, UPtr qpPtr, long *qpBufSize, long *eQP)
14bb36 {
6de027 ¤   UPtr ¤  ¤   ¤   ¤   ¤   binSpot = binPtr;
642089 ¤   ¤   /* the byte currently being decoded */
910122 ¤   UPtr ¤  ¤   ¤   ¤   ¤   qpSpot = qpPtr;
bb7fea ¤   ¤   /* the spot to which to copy the encoded chars */
d983f4 ¤   UPtr¤   ¤   ¤   ¤   ¤   binEndPtr;
8c8846 ¤   ¤   /* stop decoding line here */
f87040 ¤   short ¤ ¤   ¤   ¤   bpl;
4f7250 ¤   short ¤ ¤   ¤   ¤   c;
295b0d ¤   static char ¤   *hex="0123456789ABCDEF";
ce4df9 ¤   Boolean ¤   ¤   ¤   encode;
9b8450 ¤   UPtr ¤  ¤   ¤   ¤   ¤   nextSpace;
8659a0 ¤   PStr¤   ¤   ¤   ¤   ¤   newLine = kNewLine;
98af5a
67b948 #define ROOMFOR(x)¤ ¤   ¤   \
5c33e7 ¤   do {\
833b78 ¤   ¤   if (bpl + x > 76)¤  ¤   \
a95f81 ¤   ¤   {\
10e214 ¤   ¤   ¤   *qpSpot++ = '=';¤   \
81271b ¤   ¤   ¤   do {¤   ¤   ¤   ¤   ¤   ¤   ¤   \
47d225 ¤   ¤   ¤   ¤   BlockMoveData(newLine+1,qpSpot,*newLine);¤  ¤   \
629bfe ¤   ¤   ¤   ¤   qpSpot += *newLine;\
ab1fb9 ¤   ¤   ¤   ¤   bpl = 0;¤   ¤   ¤   ¤   \
91bd4a ¤   ¤   ¤   } while (0);¤   ¤   ¤   \
8e8958 ¤   ¤   }\
03be70 ¤   } while(0)
9daf5a
1b761f ¤   bpl = *eQP;¤/* in inner loop; want local copy */
18af5a
977a00 ¤   if ( binLen && binPtr ) {
e0bfdd ¤   ¤   binEndPtr = binPtr + binLen;
a6af5a
9db962 ¤   ¤   for (binSpot = binPtr; binSpot < binEndPtr; binSpot++) {
c60b7c ¤   ¤   ¤   /* fail if we try to write beyond the output buffer size */
d884b1 ¤   ¤   ¤   if ( *qpBufSize + 4 < ·qpSpot - qpPtr )
f396a2 ¤   ¤   ¤   ¤   ¤   return( kCTEFailed );
5aaf5a
497aad ¤   ¤   ¤   /*
5e2b39 ¤   ¤   ¤   ·* make copy of char
448753 ¤   ¤   ¤   ·*/
6ed836 ¤   ¤   ¤   c = *binSpot;
f8af5a
427aad ¤   ¤   ¤   /*
0cecf1 ¤   ¤   ¤   ·* handle newlines
8b8753 ¤   ¤   ¤   ·*/
--cbbc 00010391a7140120075 Page 7 of ctencode.c
1d1092 ¤   ¤   ¤   if (c == newLine[1])
29b788 ¤   ¤   ¤   ¤   do {
44fd1f ¤   ¤   ¤   ¤   ¤   BlockMoveData(newLine+1,qpSpot,*newLine);
96fd83 ¤   ¤   ¤   ¤   ¤   qpSpot += *newLine;
a7bf01 ¤   ¤   ¤   ¤   ¤   bpl = 0;
ad8cc3 ¤   ¤   ¤   ¤   } while (0);
4267c5 ¤
89b53f ¤   ¤   ¤   else if ( (c == '\012') || (c == '\015') ) ;
3ef148 ¤   ¤   ¤   ¤   /* skip other newline characters */
0de543 ¤   ¤   ¤   else {
5d222b ¤   ¤   ¤   ¤   if ( (c == ' ') || (c == '\t') ) {
004682 ¤   ¤   ¤   ¤   ¤   encode = ( (binSpot == binEndPtr - 1) ||
b9b22a ¤   ¤   ¤   ¤   ¤   ¤   (binSpot[1] == '\015') );¤  /* trailing white space */
683608 ¤   ¤   ¤   ¤   ¤   if (!encode) {
50c7e7 ¤   ¤   ¤   ¤   ¤   ¤   for(nextSpace = binSpot + 1;
c10286 ¤   ¤   ¤   ¤   ¤   ¤   nextSpace < binEndPtr; nextSpace++)
568e9e ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( (*nextSpace == ' ') ||
c556b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*nextSpace == '\015') ) {
9c00ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( (nextSpace - binSpot) < 20)
9a234f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ROOMFOR(nextSpace - binSpot);
22cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
995268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
0d1c89 ¤   ¤   ¤   ¤   ¤   }
1c2613 ¤   ¤   ¤   ¤   }
57fa07 ¤   ¤   ¤   ¤   else
a3c42e ¤   ¤   ¤   ¤   ¤   encode = ·(c == '=') || (c < 33) || (c > 126);
2ddac8 ¤   ¤   ¤   ¤   ¤   /* weird characters */
612b85 ¤   ¤   ¤   ¤
a3d93d ¤   ¤   ¤   ¤   if (encode)·
42d0ad ¤   ¤   ¤   ¤   ¤   ¤   ROOMFOR(3);·
4d5109 ¤   ¤   ¤   ¤   else·
5847a4 ¤   ¤   ¤   ¤   ¤   ¤   ROOMFOR(1);
672b85 ¤   ¤   ¤   ¤
49e0ab ¤   ¤   ¤   ¤   encode = encode || !bpl && ( (c == 'F') || (c == '.') );
a61b52 ¤   ¤
d8a985 ¤   ¤   ¤   ¤   if (encode) {
12dadf ¤   ¤   ¤   ¤   ¤   *qpSpot++ = '=';
043afd ¤   ¤   ¤   ¤   ¤   *qpSpot++ = hex[(c>>4)&0xf];
fffe47 ¤   ¤   ¤   ¤   ¤   *qpSpot++ = hex[c&0xf];
83860b ¤   ¤   ¤   ¤   ¤   bpl += 3;
d62613 ¤   ¤   ¤   ¤   }
1bdeaa ¤   ¤   ¤   ¤   else {
944618 ¤   ¤   ¤   ¤   ¤   *qpSpot++ = c;
06819e ¤   ¤   ¤   ¤   ¤   bpl++;
982613 ¤   ¤   ¤   ¤   }
b1a751 ¤   ¤   ¤   } /* else */
e887c7 ¤   ¤   ¤
6250bc ¤   ¤   }¤  /* for */
fc3c2b ¤   }¤  /* if binLen */
03af5a
e7a8a2 ¤   *eQP = bpl;¤¤   ¤   ¤   ¤   ¤   ¤   ¤   /* copy back to state buffer */
633162 ¤   *qpBufSize = qpSpot - qpPtr; ·¤ ¤   ¤   /* return actual buffer size */
32af5a
3803cc ¤   return( kCTEDoneOK );
7befe6 }
66af5a
9eaf5a
29b240 #define HEX(c)¤ \
f6dd3a ¤   ((c)>='0' && (c)<='9' ? (c)-'0' : \
a3e8f5 ¤   ((c)>='A' && (c)<='F' ? (c)-'A'+10 : \
71f034 ¤   ((c)>='a' && (c)<='f' ·? (c)-'a'+10 : -1)))
daaf5a
ab1cf3 /************************************************************************
f1068e ·* DecodeQP - convert quoted printable data to binary
17295b ·* ·qpStartPtr -> the quoted printable data
b47c67 ·* ·qpLen -> the length of the quoted printable data (or nil to close decoder)
3c7c07 ·* ·binPtr -> pointer to buffer to hold binary data
2ca963 ·* ·binBufSize ·<-> the length of the binary buffer, returns actual length
85c379 ·* ·dQP <-> pointer to decoder state; caller must preserve
b60a45 ·*¤ decErrCnt <- the number of decoding errors found
6e45aa ·* ·returns kCTEDoneOK or kCTEFailed
105290 ·* Note: this does not do conversion to local newline convention as the·
--b3fa 00065ebc8d140120075 Page 8 of ctencode.c
0883ea ·* ······Eudora internal version does (Maybe a flag to select would be good?)
b553c2 ·************************************************************************/
3ccc19 long DecodeQP(UPtr qpPtr, long qpLen, UPtr binPtr, long *binBufSize,
6b26d7 ¤   ¤   ¤   DecQPPtr dQP, long *decErrCnt)
d9bb36 {
deabc4 ¤   Byte¤   ¤   ¤   ¤   c;¤ ¤   ¤   ¤   ¤   ¤   /* the decoded byte */
78907e ¤   UPtr¤   ¤   ¤   ¤   binSpot = binPtr;¤  ¤   /* current output character */
337f08 ¤   UPtr¤   ¤   ¤   ¤   qpSpot = qpPtr;¤¤   ¤   /* current input character */
941efd ¤   UPtr¤   ¤   ¤   ¤   qpEndPtr;¤  ¤   ¤   ¤   /* stop decoding line here */
e18ed1 ¤   QPStates¤   ¤   state;
246f3b ¤   Byte¤   ¤   ¤   ¤   lastChar;
cfdf32 ¤   short¤  ¤   ¤   ¤   errs = 0;
83e101 ¤   short¤  ¤   ¤   ¤   upperNib, lowerNib;
ded9e1 ¤   long¤   ¤   ¤   ¤   spaceCnt, cnt;
3caf5a
19d8af ¤   /*
0f1817 ¤   ·* fetch state from caller's buffer
a7a4e3 ¤   ·*/
06d65a ¤   state = dQP->state;
d0a25c ¤   lastChar = dQP->lastChar;
7318e2 ¤   spaceCnt = dQP->spaceCount;
c9af5a
578816 ¤   if ( qpLen && qpPtr ) {
b20d4f ¤   ¤   qpEndPtr = qpPtr + qpLen;
a82b85 ¤   ¤   ¤   ¤
4938f3 ¤   ¤   for (qpSpot = qpPtr; qpSpot < qpEndPtr; qpSpot++) {
3959f1 ¤   ¤   ¤   c = *qpSpot;
648491 ¤   ¤   ¤   switch (state) {
c2f152 ¤   ¤   ¤   ¤   case qpNormal:
88f3a3 ¤   ¤   ¤   ¤   ¤   if (c == ' ') {
fdb41b ¤   ¤   ¤   ¤   ¤   ¤   spaceCnt++;
2a1c89 ¤   ¤   ¤   ¤   ¤   }
e6355a ¤   ¤   ¤   ¤   ¤   else if (c == '=') {
46dc5f ¤   ¤   ¤   ¤   ¤   ¤   for ( cnt = 0; cnt < spaceCnt; cnt++ )
11cc89 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *binSpot++ = ' ';
a714bb ¤   ¤   ¤   ¤   ¤   ¤   state = qpEqual;
2e2b5b ¤   ¤   ¤   ¤   ¤   ¤   spaceCnt = 0;
a61c89 ¤   ¤   ¤   ¤   ¤   }
1a9e8c ¤   ¤   ¤   ¤   ¤   else if (c == '\015' || c == '\012') {
d78b27 ¤   ¤   ¤   ¤   ¤   ¤   *binSpot++ = c;
c04bf9 ¤   ¤   ¤   ¤   ¤   ¤   spaceCnt = 0;¤  ¤   // Ignore spaces before CR
6d1c89 ¤   ¤   ¤   ¤   ¤   }
cb4ea5 ¤   ¤   ¤   ¤   ¤   else { ¤
84dc5f ¤   ¤   ¤   ¤   ¤   ¤   for ( cnt = 0; cnt < spaceCnt; cnt++ )
09cc89 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *binSpot++ = ' ';
258b27 ¤   ¤   ¤   ¤   ¤   ¤   *binSpot++ = c;
952b5b ¤   ¤   ¤   ¤   ¤   ¤   spaceCnt = 0;
5d1c89 ¤   ¤   ¤   ¤   ¤   }
9a14c3 ¤   ¤   ¤   ¤   ¤   break;
1f2b85 ¤   ¤   ¤   ¤
630e3f ¤   ¤   ¤   ¤   case qpEqual:
56f3a3 ¤   ¤   ¤   ¤   ¤   if (c == ' ') {
f6b41b ¤   ¤   ¤   ¤   ¤   ¤   spaceCnt++;
791c89 ¤   ¤   ¤   ¤   ¤   }
f39e8c ¤   ¤   ¤   ¤   ¤   else if (c == '\015' || c == '\012') {
637060 ¤   ¤   ¤   ¤   ¤   ¤   state = qpNormal;
459d1e ¤   ¤   ¤   ¤   ¤   ¤   spaceCnt = 0;¤  // Ignore spaces between Equal and CR
3e1c89 ¤   ¤   ¤   ¤   ¤   }
7b4bd6 ¤   ¤   ¤   ¤   ¤   else
a0f7cf ¤   ¤   ¤   ¤   ¤   ¤   state = qpByte1;
9114c3 ¤   ¤   ¤   ¤   ¤   break;
c587c7 ¤   ¤   ¤
0bed4b ¤   ¤   ¤   ¤   case qpByte1:
3b92ce ¤   ¤   ¤   ¤   ¤   upperNib = HEX(lastChar);
cd56bd ¤   ¤   ¤   ¤   ¤   lowerNib = HEX(c);
0cdd8f ¤   ¤   ¤   ¤   ¤   if ( (upperNib < 0) || (lowerNib < 0) )·
e62184 ¤   ¤   ¤   ¤   ¤   ¤   ¤   errs++;
7d4bd6 ¤   ¤   ¤   ¤   ¤   else
101769 ¤   ¤   ¤   ¤   ¤   ¤   ¤   *binSpot++ = (upperNib<<4) | lowerNib;
174c8e ¤   ¤   ¤   ¤   ¤   state = qpNormal;
2814c3 ¤   ¤   ¤   ¤   ¤   break;
651d10 ¤   ¤   ¤   }¤  /* switch */
--06f1 0008c04817c40120075 Page 9 of ctencode.c
373591 ¤   ¤   ¤   lastChar = c;
6e87c7 ¤   ¤   ¤
d150bc ¤   ¤   }¤  /* for */
e76e50 ¤   }¤  /* if qpLen */
6254e5 ¤   else if (state != qpNormal)·
7b24e1 ¤   ¤   ¤   errs++; /* when closing decoder */
d9af5a
14d8af ¤   /*
3d34d3 ¤   ·* save state in caller's buffer
dda4e3 ¤   ·*/
4fea2d ¤   dQP->state = state;
e5f07f ¤   dQP->lastChar = lastChar;
03bebd ¤   dQP->spaceCount = spaceCnt;
4561dc ¤   *binBufSize = binSpot - binPtr;
1eaf5a
3d94a4 ¤   *decErrCnt = errs;
f103cc ¤   return( kCTEDoneOK );
b4efe6 }
7caf5a
b4af5a
b8af5a
448b19 /* ---------------------------------------------------------------------------
dc3b03 ····Parse a MIME Content-Transfer-Encoding: Header
ff869e ····
f3e63a args: Handle with 822 header. Must end in \015\012.
f9af5a
e47e67 returns: enum of CTE type, or kCTEUnknown for parse errors
13af5a
2c495d ·*/
b4cc6f CTEType ParseCTEHeader(Handle headerH)
febb36 {
702837 ¤   char ·····*h, *hEnd, *tokenEnd;
088059 ··CTEType ···CType = kCTEUnknown;
0eaf5a
c6ed89 ¤   /* Check for valid handle */
a46739 ¤   if ( headerH == NULL )
ce1531 ¤   ¤   return (CType);¤
64af5a
c5a019 ··/* Find the CTE header line */
8a0ede ··HLock(headerH);
ffa3ed ¤   hEnd = *headerH + GetHandleSize(headerH);
fc0fab ··for(h = *headerH; h < hEnd; ) {
789f18 ¤   ¤   if(cmpCB(h, kCTEncodeHdrCStr, kCTEncodeHdrLen, 1) ==0) {
f18adf ¤   ¤   ¤   break; /* Matched */
2132a2 ¤   ··}
38de67 ¤   ··while(h < hEnd && *h++ != '\012') {} /* Next Line */
1b9371 ¤   }
1e8bf5 ¤   if(h >= hEnd)
33aa5b ¤   ··goto done; /* Couldn't find CTE line */
6559a8 ¤   h += kCTEncodeHdrLen; /* Go Past field identifier */
943e31 ¤   ··
0d674d ¤   /* Parse out the token */
229002 ¤   rfc822_skipws(&h);
f2bc00 ¤   if (!(tokenEnd = rfc822_parse_word (h," ()<>@,;:\\\"[]/?=\012\015")))
e2695b ¤   ··goto done; /* Bogus 822 Syntax */
b1b37e ¤   if(cmpPB(kCTEbase64TypeStr, h, tokenEnd - h, 1) ==0) ··
b35ee0 ¤   ¤   ¤   CType = kCTEbase64;
313df0 ¤   else if(cmpPB(kCTEQPTypeStr, h, tokenEnd - h, 1) ==0)·
838b4a ¤   ····CType = kCTEQP;
baeaad ¤   else if(cmpPB(kCTE7bitTypeStr, h, tokenEnd - h, 1) ==0)·
e55d2c ¤   ····CType = kCTE7bit;
b15164 ¤   else if(cmpPB(kCTE8bitTypeStr, h, tokenEnd - h, 1) ==0)·
c060a5 ¤   ····CType = kCTE8bit;
40d029 ¤   else if(cmpPB(kCTEbinaryTypeStr, h, tokenEnd - h, 1) ==0)·
972f64 ¤   ····CType = kCTEbinary;
6224c3 ·done:
0503c7 ¤   HUnlock(headerH);
68aa9e ¤   return(CType); ·
c6efe6 }
1aaf5a
dfaf5a
8c8b19 /* ---------------------------------------------------------------------------
--534a 001bf6765b040120075 Page 10 of ctencode.c
7dcfcf ····Generate a CTE header line
b7869e ····
37e63a args: Handle with 822 header. Must end in \015\012.
55af5a
a9e8f5 returns: Handle to Pascal string with CTE header line
99af5a
48495d ·*/
82a78a ·Handle GenCTEHeader(CTEType encType)
0bbb36 {
d5c62e ¤   Handle CTEHeader;
34af5a
3d947b ¤   CTEHeader = NewHandle(kCTEncodeHdrLen+100); /* CTE token > 100 unlikely */
6dcfb0 ¤   HLock(CTEHeader);
9c4985 ¤   copyPP(kCTEncodeHdrPStr, (StringPtr)*CTEHeader);
c6e4c6 ¤   catPP("\p ", (StringPtr)*CTEHeader);
f6af5a
212bb7 ¤   switch(encType) {
889ea0 ¤   ¤   case kCTE7bit:·
ac6236 ¤   ¤   ¤   catPP(kCTE7bitTypeStr, (StringPtr)*CTEHeader);
3bcdcb ¤   ¤   ¤   break;
f28754 ¤   ¤   case kCTE8bit:·
f1a735 ¤   ¤   ¤   catPP(kCTE8bitTypeStr, (StringPtr)*CTEHeader);
59316f ¤   ¤   ¤   break;¤ ¤
9f0833 ¤   ¤   case kCTEbase64:·
1038b1 ¤   ¤   ¤   catPP(kCTEbase64TypeStr, (StringPtr)*CTEHeader);
aa316f ¤   ¤   ¤   break;¤ ¤
9ab504 ¤   ¤   case kCTEQP:·
30ab9b ¤   ¤   ¤   catPP(kCTEQPTypeStr, (StringPtr)*CTEHeader);
b8316f ¤   ¤   ¤   break;¤ ¤
d0dfaf ¤   ¤   case kCTEbinary:·
8697ac ¤   ¤   ¤   catPP(kCTEbinaryTypeStr, (StringPtr)*CTEHeader);
69cdcb ¤   ¤   ¤   break;
689371 ¤   }
612034 ¤   catPP("\p\r\n", (StringPtr)*CTEHeader);
329f10 ¤   HUnlock(CTEHeader);
9c9edd ¤   return(CTEHeader);
b7efe6 }
bfaf5a
--0d40 000aa4ac9c040120076 Page 1 of ctencode.h
b114b9 /* ======================================================================
a7af5a
1384da ···Eudora Extended Message Services API SDK 1.0b3 (July 11 1996)
19493c ···This SDK supports EMSAPI version 1
c1826f ···Copyright 1995, 1996 QUALCOMM Inc.
5d856d ···Send comments and questions to <emsapi-info@qualcomm.com>
8daf5a
6e0eb1 ···Content Transfer Encoding functions
bc0209 ¤   ·Code extracted from Eudora. Based on Steve Dorner's code.
c85886 ·················
ef5339 ···Last Edited: July 23, 1996
83e8c6 ···
c09f12 ···Filename: ctencode.h
74af5a
8793e7 ···Myra Callen <t_callen@qualcomm.com>
60e8c6 ···
b07fe0 */
2baf5a
91af5a
bc18c0 #ifndef CTENCODE_H
14d759 #define CTENCODE_H
85af5a
0d38e5 /*
02859a ·* Return values for encoders and decoders
2c495d ·*/
093853 #define kCTEDoneOK 0
e17984 #define kCTEFailed 1
d8af5a
b8af5a
dc5dc5 typedef unsigned char *UPtr, *PStr;
07af5a
586a88 /* ----------------- Quoted Printable ------------------*/
a638e5 /*
d85108 ·* state buffer for quoted-printable decoding
e3495d ·*/
62233f typedef enum
72bb36 {
09b952 ¤   qpNormal,
25ee23 ¤   qpEqual,
147be3 ¤   qpByte1
ce5c07 }¤  QPStates;
69af5a
a21741 typedef struct
73bb36 {
e5cdb9 ¤   QPStates¤   state;
fd5938 ¤   Byte ¤  ¤   ¤   lastChar;
ead335 ¤   long¤   ¤   ¤   spaceCount;
720b66 } DecQP, *DecQPPtr, **DecQPHandle;
d4af5a
a838e5 /*
73231e ·* to do the quoted-printable encoding/decoding
0b495d ·*/
d4fea9 long EncodeQP(UPtr binPtr,long binLen,UPtr qpPtr,long *qpBufSize,long *eQP);
940bae long DecodeQP(UPtr qpPtr,long qpLen,UPtr binPtr,long *binLen,
198db5 ¤   ¤   ¤   DecQPPtr dQP,long *decErrCnt);
21af5a
4438e5 /*
83d886 ·* encoder/decoder call types
e2495d ·*/
d8233f typedef enum
38bb36 {
3fe8d0 ¤   kDecodeInit,
a243f5 ¤   kDecodeData,
a35e23 ¤   kDecodeDone,
4f941d ¤   kDecodeDispose
250a3b } CallType;
6caf5a
c64133 #ifdef JUNK
d106e9 typedef struct DecoderPB DecoderPB, *DecoderPBPtr, **DecoderPBHandle;
58af5a
e838e5 /*
aa7e39 ·* for decoders and file savers
--3764 000675bc7d040120076 Page 2 of ctencode.h
47495d ·*/
bc1d81 struct DecoderPB
babb36 {
675c08 ¤   UPtr input;
72fadd ¤   long inlen;
5a343c ¤   UPtr output;
a29b8f ¤   long outlen;
1b53c6 ¤   long refCon;
a3af63 ¤   Boolean text;
3a82f7 };
9eaf5a
c47454 #endif
34af5a
d3af5a
82af5a
0777ec /* ---------------- Base 64 CTE ----------------*/
dbaf5a
d8b85b #define ABS(x)¤ ¤   ¤   ¤   ¤   ((x)<0 ? -(x) : (x))
58af5a
a4af5a
5d38e5 /*
52ae41 ·* state buffer for encoding
78495d ·*/
731741 typedef struct
e7bb36 {
1ea8ff ¤   Byte partial[4];
b20bae ¤   short partialCount;
f3d048 ¤   short bytesOnLine;
2a8309 } Enc64, *Enc64Ptr, **Enc64Handle;
32af5a
3c38e5 /*
2f44d0 ·* state buffer for decoding
ce495d ·*/
801741 typedef struct
b9bb36 {
5b6fe1 ¤   short decoderState;¤/* which of 4 bytes are we seeing now? */
b16b4a ¤   long invalCount;¤   ¤   /* how many bad chars found so far? */
a28cce ¤   long padCount;¤ ¤   ¤   /* how many pad chars found so far? */
375be3 ¤   Byte partial;¤  /* partially decoded byte from/for last/next time */
4fb8a5 ¤   Boolean wasCR;¤ ¤   ¤   /* was the last character a carriage return? */
a652f5 } Dec64, *Dec64Ptr, **Dec64Handle;
74af5a
edaf5a
3b38e5 /*
00e538 ·* to do the base 64 encoding/decoding
a9495d ·*/
439e6c short Encode64(UPtr bin, long len,
a77f18 ¤   ¤   UPtr sixFour, long *sixFourLen, Enc64Ptr e64 );
5d6234 short Decode64(UPtr sixFour,
c69889 ¤   ¤   long sixFourLen, UPtr bin, long *binLen,
6bff55 ¤   ¤   ¤   ¤   ¤   Dec64Ptr d64, long *decErrCnt);
60ae30 ¤   ¤   ¤   ¤   ¤
f8ae30 ¤   ¤   ¤   ¤   ¤
4b7368 /* ----------------- Identify the CTE ------------------- */
25d111 #define kCTEncodeHdrPStr¤   "\pContent-Transfer-Encoding:"
7da71c #define kCTEncodeHdrCStr¤   "Content-Transfer-Encoding:"
ef4a27 #define kCTEncodeHdrLen ··26
819c0e #define kCTEbase64TypeStr "\pbase64"
ff65c3 #define kCTEQPTypeStr¤  ··¤ "\pquoted-printable"
6d2095 #define kCTE7bitTypeStr¤¤   "\p7bit"
7923a5 #define kCTE8bitTypeStr¤¤   "\p8bit"
56b84c #define kCTEbinaryTypeStr¤  "\pbinary"
f6af5a
8caf5a
ca233f typedef enum
7d7142 {·
69b6d7 ··kCTE7bit,
ed8b5e ··kCTE8bit,
dba200 ··kCTEbinary,
53bbc1 ··kCTEbase64,
d5fe45 ··kCTEQP,
674706 ··kCTEUnknown
--246a 0010c3b13f640120076 Page 3 of ctencode.h
c0e538 } CTEType;
3baf5a
369b1d CTEType ParseCTEHeader(Handle headerH);
c219d7 Handle GenCTEHeader(CTEType encType);
64af5a
0c95b1 #endif /* ENCODING_H */
--1832 000b7081a3c40120077 Page 1 of emsapi-component.c
a70335 /*____________________________________________________________________________
92f7f7 ____________________________________________________________________________*/
ac22e5 ·/* ======================================================================
bdaf5a
0fcc99 ····Eudora Extended Message Services API SDK Macintosh 1.0b3 (July 11 1996)
9a7b3e ····This SDK supports EMSAPI version 1
09b06d ····Copyright 1995, 1996 QUALCOMM Inc.
f383da ····Send comments and questions to <emsapi-info@qualcomm.com>
92af5a
9543d6 ····Generated: Mon Jul 15 15:41:27 PDT 1996
78147f ····Filename: emsapi-component.c
7e18bc ¤   ¤   Last Edited: July 24, 1996
38869e ····
080a41 ····THIS FILE SHOULD BE COMPILED ALONG WITH THE COMPONENT
efda23 ····BE SURE YOU SUPPLY A usertrans.h WHEN YOU COMPILE IT
75af5a
be81b0 ····Note: this file is generated automatically by scripts and must be
22d57d ····kept in synch with other translation API definitions, so it should
65c9b0 ····probably not ever be changed.
85af5a
a67fe0 */
78af5a
187b7d #pragma once
0eaf5a
6afeb2 #include <stdio.h>
cb48c9 #include "emsapi-mac.h"
dcbdd3 #include "usertrans.h"
f6af5a
2cb2bf #include <Errors.h>
3eadac #ifndef __powerc
488f06 ····#include <A4Stuff.h>
b07454 #endif
4baf5a
d8f406 #include "MacDebugTrapsOff.h"
02af5a
2baf5a
9daf5a
9373f4 enum {
fb751b ····kems_plugin_versionRtn = 256,
b6cc9a ····kems_plugin_initRtn = 257,
10eae3 ····kems_translator_infoRtn = 258,
c0e8a0 ····kems_can_translate_fileRtn = 259,
c7df8c ····kems_can_translate_bufRtn = 260,
9525c0 ····kems_translate_fileRtn = 261,
987feb ····kems_translate_bufRtn = 262,
a7ccfa ····kems_plugin_finishRtn = 263
e982f7 };
4eaf5a
c4af5a
a1af5a
210975 /* ----------------------------------------------------------------------
981530 ····Declarations of real functions that handle the standard·
044dd8 ····housekeeping calls of any component.
1f495d ·*/
bf3136 pascal ComponentResult ·FatOpen(ComponentInstance self);
8260cb pascal ComponentResult ·FatClose(Handle storage, ComponentInstance self);
71fa91 pascal ComponentResult ·FatCanDo(short selector);
d87118 pascal ComponentResult ·FatVersion(void);
9e2024 pascal ComponentResult ·main (ComponentParameters *params, Handle storage);
5baf5a
73af5a
7c0975 /* ----------------------------------------------------------------------
70c407 ·····These are a bunch of macros to twist the code below into
09e134 ·····what's needed to accept component manager calls for both
ecade6 ·····the 68K and Power PC
fc495d ·*/
fc105e #ifdef __powerc
e89057 #define CallComponentFunctionWithStorageUniv(storage, params, funcName) \
1d60c6 ···CallComponentFunctionWithStorage(storage, params, &funcName##RD)
9ed8de #define CallComponentFunctionUniv(params, funcName) \
d85459 ···CallComponentFunction(params, &funcName##RD)
b781a5 #define INSTANTIATE_ROUTINE_DESCRIPTOR(funcName) \
--cf54 0008012420540120077 Page 2 of emsapi-component.c
6dc1f2 ¤   RoutineDescriptor funcName##RD = \
8cd270 ···BUILD_ROUTINE_DESCRIPTOR (upp##funcName##ProcInfo, funcName)
f3db21 #else
849057 #define CallComponentFunctionWithStorageUniv(storage, params, funcName) \
34b0bd ···CallComponentFunctionWithStorage(storage, params, \
1b056e ···(ComponentFunctionUPP)funcName)
01d8de #define CallComponentFunctionUniv(params, funcName) \
bbe050 ···CallComponentFunction(params, (ComponentFunctionUPP)funcName)
f47454 #endif
14af5a
3caf5a
ca105e #ifdef __powerc
650975 /* ----------------------------------------------------------------------
e27f7c ··These are Power pc specific descriptions of stack frames. These must be
a9b8a5 ··in synch with the fake declarations above and the ones in emsapi.h.
99495d ·*/
8273f4 enum {
93c91d ····uppFatOpenProcInfo = kPascalStackBased
0383c1 ·········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
a7a1f9 ·········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ComponentInstance)))
4d82f7 };
36af5a
2f73f4 enum {
156cec ····uppFatCloseProcInfo = kPascalStackBased
3c83c1 ·········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
e43053 ·········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
c30a91 ·········| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ComponentInstance)))
6382f7 };
8aaf5a
d973f4 enum {
4d101f ····uppFatCanDoProcInfo = kPascalStackBased
2b83c1 ·········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
496cad ·········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
b282f7 };
eaaf5a
7f73f4 enum {
e6f0df ····uppFatVersionProcInfo = kPascalStackBased
8e83c1 ·········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
d782f7 };
f8af5a
0473f4 enum {
b8619b ····uppFatTargetProcInfo = kPascalStackBased
9183c1 ·········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
283053 ·········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
350a91 ·········| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ComponentInstance)))
3082f7 };
1eaf5a
0f73f4 enum {
14cf48 ····uppems_plugin_versionProcInfo = kPascalStackBased
4c9fe4 ········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
fad918 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short *)))
9f82f7 };
7faf5a
3d73f4 enum {
3ff3a0 ····uppems_plugin_initProcInfo = kPascalStackBased
599fe4 ········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
6962c4 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
c6ab17 ········| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(short ···*)))
0a5b21 ········| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(StringPtr **)))
3710cf ········| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(short *)))
44b7d6 ········| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(Handle *)))
aa82f7 };
00af5a
2173f4 enum {
6922d7 ····uppems_translator_infoProcInfo = kPascalStackBased
7d9fe4 ········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
f062c4 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
677dbf ········| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(short)))
14d44b ········| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(long *)))
7d3692 ········| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(long *)))
93bd80 ········| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(unsigned long *)))
805670 ········| STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(StringPtr **)))
--0da4 000bed1658b40120077 Page 3 of emsapi-component.c
2d5912 ········| STACK_ROUTINE_PARAMETER(7, SIZE_CODE(sizeof(Handle *)))
8082f7 };
68af5a
3773f4 enum {
1b6afe ····uppems_can_translate_fileProcInfo = kPascalStackBased
e39fe4 ········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
0362c4 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
b8be79 ········| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
19848e ········| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(short)))
391704 ········| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(emsMIMEtypeP)))
413dd0 ········| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(FSSpec *)))
12c81c ········| STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(StringPtr ***)))
9e5787 ········| STACK_ROUTINE_PARAMETER(7, SIZE_CODE(sizeof(long *)))
cdedcc ········| STACK_ROUTINE_PARAMETER(8, SIZE_CODE(sizeof(StringPtr **)))
9f9a24 ········| STACK_ROUTINE_PARAMETER(9, SIZE_CODE(sizeof(long *)))
9082f7 };
d1af5a
c573f4 enum {
985c75 ····uppems_can_translate_bufProcInfo = kPascalStackBased
2f9fe4 ········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
8762c4 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
16be79 ········| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
92848e ········| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(short)))
3d1704 ········| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(emsMIMEtypeP)))
7ebdf0 ········| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(unsigned char **)))
449e32 ········| STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(long)))
637243 ········| STACK_ROUTINE_PARAMETER(7, SIZE_CODE(sizeof(StringPtr ***)))
07bad7 ········| STACK_ROUTINE_PARAMETER(8, SIZE_CODE(sizeof(long *)))
ec4183 ········| STACK_ROUTINE_PARAMETER(9, SIZE_CODE(sizeof(StringPtr **)))
61c1d2 ········| STACK_ROUTINE_PARAMETER(10, SIZE_CODE(sizeof(long *)))
5c82f7 };
f1af5a
8773f4 enum {
67d527 ····uppems_translate_fileProcInfo = kPascalStackBased
6f9fe4 ········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
2962c4 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
63be79 ········| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
29848e ········| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(short)))
6b1704 ········| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(emsMIMEtypeP)))
793dd0 ········| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(FSSpec *)))
bec81c ········| STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(StringPtr ***)))
645627 ········| STACK_ROUTINE_PARAMETER(7, SIZE_CODE(sizeof(emsProgress)))
6949d8 ········| STACK_ROUTINE_PARAMETER(8, SIZE_CODE(sizeof(emsMIMEtypeP *)))
894b6a ········| STACK_ROUTINE_PARAMETER(9, SIZE_CODE(sizeof(FSSpec *)))
dd05e2 ········| STACK_ROUTINE_PARAMETER(10, SIZE_CODE(sizeof(Handle *)))
0c071b ········| STACK_ROUTINE_PARAMETER(11, SIZE_CODE(sizeof(StringPtr **)))
32fbdb ········| STACK_ROUTINE_PARAMETER(12, SIZE_CODE(sizeof(StringPtr **)))
fba0c7 ········| STACK_ROUTINE_PARAMETER(13, SIZE_CODE(sizeof(long *)))
7a82f7 };
e2af5a
b973f4 enum {
e35e6f ····uppems_translate_bufProcInfo = kPascalStackBased
df9fe4 ········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
bf62c4 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
8bbe79 ········| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
80848e ········| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(short)))
931704 ········| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(emsMIMEtypeP)))
dbbdf0 ········| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(unsigned char **)))
6d9e32 ········| STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(long)))
fa5787 ········| STACK_ROUTINE_PARAMETER(7, SIZE_CODE(sizeof(long *)))
d1b740 ········| STACK_ROUTINE_PARAMETER(8, SIZE_CODE(sizeof(StringPtr ***)))
5d1179 ········| STACK_ROUTINE_PARAMETER(9, SIZE_CODE(sizeof(emsProgress)))
dbb977 ········| STACK_ROUTINE_PARAMETER(10, SIZE_CODE(sizeof(emsMIMEtypeP *)))
d02f70 ········| STACK_ROUTINE_PARAMETER(11, SIZE_CODE(sizeof(unsigned char **)))
9beb26 ········| STACK_ROUTINE_PARAMETER(12, SIZE_CODE(sizeof(Handle *)))
055794 ········| STACK_ROUTINE_PARAMETER(13, SIZE_CODE(sizeof(StringPtr **)))
350a4a ········| STACK_ROUTINE_PARAMETER(14, SIZE_CODE(sizeof(StringPtr **)))
0762ed ········| STACK_ROUTINE_PARAMETER(15, SIZE_CODE(sizeof(long *)))
fa82f7 };
1aaf5a
9a73f4 enum {
bed881 ····uppems_plugin_finishProcInfo = kPascalStackBased
--0765 00067c68e9140120077 Page 4 of emsapi-component.c
6d9fe4 ········| RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
8562c4 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
8a82f7 };
b3af5a
4aaf5a
679f64 INSTANTIATE_ROUTINE_DESCRIPTOR(FatCanDo);
e800b5 INSTANTIATE_ROUTINE_DESCRIPTOR(FatOpen);
168da3 INSTANTIATE_ROUTINE_DESCRIPTOR(FatClose);
6f2601 INSTANTIATE_ROUTINE_DESCRIPTOR(FatVersion);
2caf5a
5129f6 INSTANTIATE_ROUTINE_DESCRIPTOR(ems_plugin_version);
3c2a5f INSTANTIATE_ROUTINE_DESCRIPTOR(ems_plugin_init);
a9c9b9 INSTANTIATE_ROUTINE_DESCRIPTOR(ems_translator_info);
10fee5 INSTANTIATE_ROUTINE_DESCRIPTOR(ems_can_translate_file);
d9d79a INSTANTIATE_ROUTINE_DESCRIPTOR(ems_translate_file);
fe94fa #ifdef EMS_VERSION_2
503547 INSTANTIATE_ROUTINE_DESCRIPTOR(ems_translate_buf);
3c86f4 #endif //EMS_VERSION_2
0cbc28 INSTANTIATE_ROUTINE_DESCRIPTOR(ems_plugin_finish);
2baf5a
d63c62 RoutineDescriptor MainRD =
4f6498 ¤   BUILD_ROUTINE_DESCRIPTOR(uppComponentRoutineProcInfo, main);
87791d ProcInfoType __procinfo = uppComponentRoutineProcInfo;
c7896c #endif __powerc
2faf5a
aeaf5a
7724c5 static Component self_save;
55af5a
130975 /* ----------------------------------------------------------------------
6f0e6d ····This is the main entry point for the component. The calls for the
db5e2e ····component functions below are really gigantic horrible macros that
223dec ····do weird things
06869e ····
34de25 ····The return values that Eudora actually sees are the translation API return
b0b79b ····values (EMSR_XXXX) in the case of an API call, and Macintosh system error
3b3ce2 ····in the case of one of the four Component Manager-specific calls.
3b495d ·*/
5788f3 pascal ComponentResult main (ComponentParameters *params, Handle storage)
8bbb36 {
50df8e ····ComponentResult result = noErr;
f1af5a
31adac #ifndef __powerc
e50f00 ····long oldA4;
28f1d4 ····oldA4 = SetCurrentA4();
5b7454 #endif
2eaf5a
8567c5 ¤
1e7229 ····/* Did we get a Component Manager request code (< 0)? */
2a6ac3 ····if (params->what < 0)
303b37 ····{
72b2f9 ········switch (params->what)
c22b60 ········{
9a55fa ············case kComponentOpenSelect:
51ff42 ················result = CallComponentFunctionUniv(params, FatOpen);
5fb228 ················break;
92caf9 ············
70d11a ············case kComponentCloseSelect:
d20be9 ················result = CallComponentFunctionWithStorageUniv(storage,
6329eb ················¤   ¤   params, FatClose);
76d317 ················break; ·
4ccaf9 ············
f05066 ············case kComponentCanDoSelect:
6c1cab ················result = CallComponentFunctionUniv(params, FatCanDo);
0fd317 ················break; ·
a6caf9 ············
5ff253 ············case kComponentVersionSelect:
ddd9f0 ················result = CallComponentFunctionUniv(params, FatVersion);
3ed317 ················break; ·
efcaf9 ············
f44e45 ············case kComponentRegisterSelect: ·// not supported
833dce ············default: ·······················// unknown
67c607 ················result = paramErr;
--7d4e 0003dadbb0540120077 Page 5 of emsapi-component.c
dcb228 ················break;
717fb0 ········}
e16fe7 ····}
93842c ····else
a51e0b ····{ ·······························// one of ours
cf2f65 ········long resRefNum = OpenComponentResFile(self_save);
fb5ff2 ········if(resRefNum < 0)
7c2b60 ········{
49de93 ············return(EMSR_TRANS_FAILED);
3a7fb0 ········}
09f6fe ········switch (params->what) {
6daf5a
e739f7 ············case kems_plugin_versionRtn:
eeed48 ················result = CallComponentFunctionWithStorageUniv(
baf331 ······································storage, params, ems_plugin_version);
c8b228 ················break;
69af5a
e82648 ············case kems_plugin_initRtn:
8aed48 ················result = CallComponentFunctionWithStorageUniv(
d7955b ······································storage, params, ems_plugin_init);
66b228 ················break;
7eaf5a
024fd7 ············case kems_translator_infoRtn:
2fed48 ················result = CallComponentFunctionWithStorageUniv(
317bd0 ······································storage, params, ems_translator_info);
49b228 ················break;
b8af5a
a1d4f6 ············case kems_can_translate_fileRtn:
e6ed48 ················result = CallComponentFunctionWithStorageUniv(
186e68 ······································storage, params, ems_can_translate_file);
b5b228 ················break;
eaaf5a
04ebf3 ············case kems_translate_fileRtn:
77ed48 ················result = CallComponentFunctionWithStorageUniv(
4e0d5d ······································storage, params, ems_translate_file);
ffb228 ················break;
fcaf5a
5694fa #ifdef EMS_VERSION_2
9ff59a ············case kems_translate_bufRtn:
f4ed48 ················result = CallComponentFunctionWithStorageUniv(
471f5b ······································storage, params, ems_translate_buf);
e5b228 ················break;
7986f4 #endif //EMS_VERSION_2
c2af5a
cc0ace ············case kems_plugin_finishRtn:
f6ed48 ················result = CallComponentFunctionWithStorageUniv(
829634 ······································storage, params, ems_plugin_finish);
95b228 ················break;
80af5a
a1af5a
743dce ············default: ·······················// unknown
b4c607 ················result = paramErr;
f0b228 ················break;
b47fb0 ········}
110e94 ¤   CloseComponentResFile(resRefNum);
be6fe7 ····}
4faf5a
daadac #ifndef __powerc
bc00fe ····SetA4(oldA4);
9e7454 #endif
5aaf5a
2614bd ····return result;
1fefe6 }
57af5a
f2af5a
cd0975 /* ----------------------------------------------------------------------
2c6ca1 ····Standard component function to open a component
66495d ·*/
83a71a pascal ComponentResult FatOpen(ComponentInstance self)
e4bb36 {
7bb905 ····ComponentResult ····result = noErr;
3db02f ····emsUserGlobals** globals;
--bb64 0005dd113cc40120077 Page 6 of emsapi-component.c
e0af5a
6dcdfb ····globals = (emsUserGlobals**)NewHandleClear(sizeof(emsUserGlobals));
174b45 ····if (globals != nil) {
51508e ········
706795 ········// remember ourselves
d7cfe3 ········(*globals)->self = (Component)self;
707ac3 ········self_save = (Component)self;
7b508e ········
dc214d ········// tell the component manager that we have global storage
4e0510 ········SetComponentInstanceStorage(self, (Handle)globals);
33275a ····} else result = MemError() ? MemError() : memFullErr;·
7af6b0 ····¤   ·// NewHandleClear failed
9faf5a
9414bd ····return result;
64efe6 }
00af5a
f2af5a
3d0975 /* ----------------------------------------------------------------------
dd597d ····Standard component function to close a component
0d495d ·*/
c1ba4f pascal ComponentResult FatClose(Handle storage, ComponentInstance self)
b6bb36 {
a2a056 #pragma unused(self)
1bb905 ····ComponentResult ····result = noErr;
968290 ····emsUserGlobals** globals = (emsUserGlobals**) storage;
96af5a
054b45 ····if (globals != nil) {
b88ba9 ········DisposeHandle((Handle)globals);
108e6b ········globals = nil;
516fe7 ····}
e714bd ····return result;
4defe6 }
2daf5a
09af5a
cb0975 /* ----------------------------------------------------------------------
a8a6ab ····Standard component function to test availability of a function
0b45b4 ····The EMS_HAS_xxx constants are supplied by the translator writer
e59812 ····in the file usertrans.h
8c495d ·*/
80528a pascal ComponentResult FatCanDo(short selector)
4abb36 {
496a51 ····switch(selector) {
99508e ········
d75690 ········// component Manager request codes
047703 ········case kComponentOpenSelect:
70bb76 ········case kComponentCloseSelect:
1a3a0a ········case kComponentCanDoSelect:
b4f2fa ········case kComponentVersionSelect:
54383a ············return true;
648632 ············break;
04508e ········
ccaf5a
fb90f7 ········case kems_plugin_versionRtn:
9332b7 ············return EMS_HAS_PLUGIN_VERSION;
238632 ············break;
e8af5a
8ec55b ········case kems_plugin_initRtn:
aca197 ············return EMS_HAS_PLUGIN_INIT;
9b8632 ············break;
1daf5a
2d4f7e ········case kems_translator_infoRtn:
bc11d1 ············return EMS_HAS_TRANSLATOR_INFO;
d58632 ············break;
84af5a
f7473f ········case kems_can_translate_fileRtn:
75f89f ············return EMS_HAS_CAN_TRANSLATE_FILE;
b98632 ············break;
3baf5a
4d7ba3 ········case kems_can_translate_bufRtn:
f02824 ············return EMS_HAS_CAN_TRANSLATE_BUF;
b98632 ············break;
5daf5a
--69f2 000f517840440120077 Page 7 of emsapi-component.c
f142f3 ········case kems_translate_fileRtn:
f356e8 ············return EMS_HAS_TRANSLATE_FILE;
a28632 ············break;
94af5a
889ff6 ········case kems_translate_bufRtn:
8f0d3f ············return EMS_HAS_TRANSLATE_BUF;
3f8632 ············break;
9daf5a
9860a2 ········case kems_plugin_finishRtn:
b7703b ············return EMS_HAS_PLUGIN_FINISH;
728632 ············break;
3aaf5a
20af5a
786769 ········case kComponentRegisterSelect: ·// not supported
01c60e ········default: ·······················// unknown request
05ac99 ············return false;
468632 ············break;
a16fe7 ····}
37efe6 }
19af5a
5faf5a
520975 /* ----------------------------------------------------------------------
94c9d8 ····Standard component function to return the components version
2183d3 ····The version number here is maintained in parallel with the·
3aa649 ····API version number. ·The high 16 bits are the API version,
9f693b ····and the low 16 are the component implementation version (unused).
00495d ·*/
6db173 pascal ComponentResult FatVersion(void)
750337 { ··
f3fbad ····return EMS_VERSION << 16;
0cefe6 }
08af5a
92af5a
42af5a
94af5a
d014b9 /* ======================================================================
246b27 ···This junk is for the call backs that Eudora passes to a translator
7caf5a
6c254a Pete thinks this should be done with a #define instead of a function
c5e2f4 call, but #define is ugly and it would have to be in emsapi-mac.h which
378850 the translator writer looks at. ·Having it here where they don't look
b9c083 at it hides it.
adaf5a
6f28f6 Pete sez the #define is more efficient and anyone who writes code
1d64c2 for the Power PC will not flinch at this macro. So, it's here if
2c367c you want to use it instead of calling callProgress below. ·Pete sez
3bceb7 the compiler even does type checking on this. ·This is not obvious to
3fd1ca us ex-UNIX-heads that expect compilers to be OS neutral, but it may
09f709 be to you!
ccaf5a
6d9b22 #if GENERATINGCFM
554cba #define CallemsProgressProc(userRoutine, percent)¤  ·
673ac0 ¤   CallUniversalProc((UniversalProcPtr)(userRoutine),
e24bf2 ¤   ¤   uppemsProgressProcInfo,(percent))
5adb21 #else
681309 #define CallemsProgressProc(userRoutine, percent)
174dd1 ¤   ¤   ·(*(userRoutine))((percent))
187454 #endif
35af5a
11495d ·*/
81af5a
7e0975 /* ----------------------------------------------------------------------
4a4e70 ···Call the progress function
eeaf5a
75bfbf args: glop ···- The function or ProcPointer passed into Eudora
a6c83a ······percent - A value between 0 and 100 indicating progress
38af5a
77e7cc returns: 0 if translation should continue or 1 if it shoul abort
d4af5a
13974e The enum describes the arguments which are on the stack
7a495d ·*/
f573f4 enum {
--a0ee 001b7b9ecab40120077 Page 8 of emsapi-component.c
dc4d1e ····uppemsProgressProcInfo = kPascalStackBased·
64b766 ········| RESULT_SIZE(SIZE_CODE(sizeof(short)))
587efd ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
2182f7 };
b1af5a
789df3 short callProgress(emsProgress glop, short percent)
a5bb36 {
1f9b22 #if GENERATINGCFM
37c221 ····return(CallUniversalProc((UniversalProcPtr)(glop),
0952e1 ····¤   uppemsProgressProcInfo,(percent)));
fddb21 #else
a778c8 ····return((*glop)(percent));
dd7454 #endif
04efe6 }
b7af5a
--4751 0003ce41bd040120078 Page 1 of emsapi-mac.h
a70335 /*____________________________________________________________________________
92f7f7 ____________________________________________________________________________*/
93af5a
9922e5 ·/* ======================================================================
e6af5a
43cc99 ····Eudora Extended Message Services API SDK Macintosh 1.0b3 (July 11 1996)
fb7b3e ····This SDK supports EMSAPI version 1
9cb06d ····Copyright 1995, 1996 QUALCOMM Inc.
6e83da ····Send comments and questions to <emsapi-info@qualcomm.com>
6faf5a
73bd65 ····Generated: Mon Jul 15 15:41:24 PDT 1996
793c1b ····Filename: emsapi-mac.h
5494c3 ¤   Last Edited: July 24, 1996
85af5a
c23096 ····USE THIS FILE TO BUILD YOUR MACINTOSH TRANSLATOR COMPONENT.·
d7af5a
9281b0 ····Note: this file is generated automatically by scripts and must be
edd57d ····kept in synch with other translation API definitions, so it should
bfc9b0 ····probably not ever be changed.
f0af5a
9d7fe0 */
b78acf #ifndef EMSAPI_MAC_H_INCLUDED
53defb #define EMSAPI_MAC_H_INCLUDED
baaf5a
c2e251 /* ========== CONSTANTS AND RETURN VALUES ================================ */
45af5a
b55815 /* ----- Translator return codes --- store as a long --------------------- */·
52ae46 #define EMSR_OK ·············(0L) ····/* The translation operation succeeded */
128023 #define EMSR_UNKNOWN_FAIL ···(1L) ····/* Failed for unspecified reason */
c33bf8 #define EMSR_CANT_TRANS ·····(2L) ····/* Don't know how to translate this */
176e8c #define EMSR_INVALID_TRANS ··(3L) ····/* The translator ID given was invalid */
57feb8 #define EMSR_NO_ENTRY ·······(4L) ····/* The value requested doesn't exist */
88c5d6 #define EMSR_NO_INPUT_FILE ··(5L) ····/* Couldn't find input file */
23a9bb #define EMSR_CANT_CREATE ····(6L) ····/* Couldn't create the output file */
b5b7be #define EMSR_TRANS_FAILED ···(7L) ····/* The translation failed. */
726520 #define EMSR_INVALID ········(8L) ····/* Invalid argument(s) given */
3cce60 #define EMSR_NOT_NOW ········(9L) ····/* Translation can be done not
5cbbae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   in current ·context */
14dd25 #define EMSR_NOW ···········(10L) ····/* Indicates translation
28a770 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·can be performed right away */
7b2249 #define EMSR_ABORTED ·······(11L) ····/* Translation was aborted by user */
6ad83c ·
e3d83c ·
d27a73 /* ----- Translator types --- store as a long ---------------------------- */·
bced98 #define EMST_NO_TYPE ·········(-1L)
7ae4cc #define EMST_LANGUAGE ········(0x10L)
4cce6b #define EMST_TEXT_FORMAT ·····(0x20L)
1b8235 #define EMST_GRAPHIC_FORMAT ··(0x30L)
0f18e2 #define EMST_COMPRESSION ·····(0x40L)
3ee9b4 #define EMST_COALESCED ·······(0x50L)
8cd4c4 #define EMST_SIGNATURE ·······(0x60L)
98d203 #define EMST_PREPROCESS ······(0x70L)
5359a1 #define EMST_CERT_MANAGEMENT ·(0x80L)
47af5a
13af5a
0cb4b5 /* ----- Translator info flags and contexts --- store as a long ---------- */
354e9b /* Used both as bit flags and as constants */
43887d #define EMSF_ON_ARRIVAL ·····(0x0001L) /* Call on message arrivial */
7bacb3 #define EMSF_ON_DISPLAY ·····(0x0002L) /* Call when user views message */
75b246 #define EMSF_ON_REQUEST ·····(0x0004L) /* Call when selected from menu */
dab093 #define EMSF_Q4_COMPLETION ··(0x0008L) /* Queue and call on complete·
a76715 ·········································composition of a message */
23d7eb #define EMSF_Q4_TRANSMISSION (0x0010L) /* Queue and call on transmission
44f0e3 ·········································of a message */
c445e1 #define EMSF_WHOLE_MESSAGE ··(0x0200L) /* Works on the whole message even if
09963d ·········································it has sub-parts. (e.g. signature) */
66e729 #define EMSF_REQUIRES_MIME ··(0x0400L) /* Items presented for translation
bd9c4e ·········································should be MIME entities with
482f55 ·········································canonical end of line representation,
486f6d ·········································proper transfer encoding
9d2ca0 ·········································and headers */
3c8e65 #define EMSF_GENERATES_MIME ·(0x0800L) /* Data produced will be MIME format */
--be82 000f9217cf640120078 Page 2 of emsapi-mac.h
1597a8 /* all other flag bits in the long are RESERVED and may not be used */
8eaf5a
41af5a
4d5137 /* ----- The version of the API defined by this include file ------------- */
afad19 #define EMS_VERSION ·········(1) ······/* Used in plugin init */
9e34bc #define EMS_COMPONENT ·······'EuTL' ···/* Macintosh component type */
49af5a
f0af5a
890f81 /* ----- Translator and translator type specific return codes ------------ */
43e08a #define EMSC_SIGOK ··········(1L) ·····/* A signature verification succeeded */
ce6abc #define EMSC_SIGBAD ·········(2L) ·····/* A signature verification failed */
2e2491 #define EMSC_SIGUNKNOWN ·····(3L) ·····/* Result of verification unknown */
3daf5a
1caf5a
98af5a
4caf5a
d66a92 /* ========== POWER PC/68K GLUE FOR CALL BACKS ====================== */
87af5a
a5282a /* These can be treated as magic type declarations and just passed on
1f2383 ···to the functins below. They are the thing that Eudora passes to
58ff34 ···the component to indicate where the call back function is.
96495d ·*/
5d9b22 #if GENERATINGCFM
e2959c typedef UniversalProcPtr emsProgress; ······/* Power PC */
17db21 #else
f56d88 typedef pascal short (*emsProgress)(short); /* 68K */
7b7454 #endif
73f289 typedef emsProgress emsProgressUPP;
1caf5a
9daf5a
07915c /* These typedefs can also be ignored in favor of the two calls below
5bfa98 ···unless your not using emsapi-component.c and are doing your own component
1f8344 ···manager interface. ·These are what the functions would look like
07599e ···if we didn't have to worry about differences in architecture between
52a6e8 ···the Component and Eudora.·
99495d ·*/
0faf19 typedef pascal short ·(*emsProgress_t)(short); ····/* The progress function */
cbaf5a
c781a7 /* Use these to call the prorgress and allocator functions! ·They are
df2d76 ···supplied in emsapi-component.c. The first argument is the cookie
8e047f ···idenitifying the function passed by Eudora, and the second is the
8053aa ···arguments function.
88495d ·*/
d5c5a9 short callProgress(emsProgress glop, short percent);
e8af5a
81af5a
83af5a
22af5a
4daf5a
c1839d /* ========== DATA STRUCTURES ============================================ */
d82aeb /* True Mac-style declarations aren't used yet but are included in comments.·
d13c23 ···All strings on the Mac are PASCAL strings and all are allocated as Handles.·
7a495d ·*/
c86d86 /* ----- Macintosh: MIME type data passed across the API ----------------- */
59f4c7 /* typedef struct emsMIMEparamS **emsMIMEparamHandle; /*Mac style declaration */
80ea38 typedef struct emsMIMEparamS **emsMIMEParamP;
196a09 typedef struct emsMIMEparamS {
dea0dc ····Str63 ················name; ·····/* MIME parameter name */
0773e4 ····Handle ···············value; ····/* handle size determines string length */
ed601b ····struct emsMIMEparamS **next; ····/* Handle for next param in list */
da7ca2 /* ·emsMIMEparamHandle ····next; ····/* Mac style declaration for above */·
ecceae } emsMIMEparam;
cfc21b /* typedef struct emsMIMEtypeS **emsMIMEtypeHandle; /* Mac style declaration */
84e81c typedef struct emsMIMEtypeS **emsMIMEtypeP;·
d3c713 typedef struct emsMIMEtypeS {
093249 ····Str63 ·············mime_version; /* MIME-Version: header */
553c2e ····Str63 ·············mime_type; ···/* Top-level MIME type: text,message...*/
80a91f ····Str63 ·············sub_type; ····/* sub-type */
77afe3 ····emsMIMEparam ·····**params; ·····/* Handle to first parameter in list */
e7b290 /* ·emsMIMEparamHandle ·params; ·····/* Mac style declaration of above */
98e1b4 } emsMIMEtype;
f9af5a
--1b83 0006de64d2b40120078 Page 3 of emsapi-mac.h
8ff31b /* ========== FUNCTION PROTOTYPES ======================================== */
3faf5a
98233b /* ----- Get the API Version number this plugin implements ----------------- */
b753cb pascal long ems_plugin_version(
e93cc3 ····short *api_version ··········/* Place to return api version */
1c6275 );
dcaf5a
2cb780 /* ----- Initialize plugin and get its basic info -------------------------- */
0196b3 pascal long ems_plugin_init(
0a789a ····Handle globals, ·············/* Handle to translator instance structure */
475ab1 ····short ···*num_trans, ········/* Place to return num of translators */
58fd20 ····StringPtr **plugin_desc, ····/* Return for string description of plugin */
f306c1 ····short *plugin_id, ···········/* Place to return unique plugin id */
6f20d4 ····Handle *plugin_icon ·········/* Return for plugin icon suite */
796275 );
7aaf5a
59cf66 /* ----- Get details about a translator in a plugin ------------------------ */
82ff61 pascal long ems_translator_info(
64789a ····Handle globals, ·············/* Handle to translator instance structure */
b8c05f ····short trans_id, ·············/* ID of translator to get info for */
d4cee3 ····long *trans_type, ·········/* Return for translator type, e.g., EMST_xxx */
7447f8 ····long *trans_sub_type, ·······/* Return for translator subtype */
0509f3 ····unsigned long *trans_flags, ·/* Return for translator flags */
f3b896 ····StringPtr **trans_desc, ·····/* Return for translator string description */
30c59f ····Handle *trans_icon ··········/* Return for translator icon suite */
ac6275 );
32af5a
c90a25 /* ----- Check and see if a translation can be performed (file version) ---- */
0d252c pascal long ems_can_translate_file(
81789a ····Handle globals, ·············/* Handle to translator instance structure */
c80c1f ····long context, ···············/* Context for check; e.g. EMSF_ON_xxx */
24fe5f ····short trans_id, ·············/* ID of translator to call */
f0d9b9 ····emsMIMEtypeP in_mime, ·······/* MIME type of data to check */
6990e6 ····FSSpec *in_file, ············/* The input file FSSpec */
a6de15 ····StringPtr ***addresses, ·····/* List of addresses (sender and recipients) */
a06fbc ····long *out_len, ··············/* Place to return estimated length (unused) */
f74c2f ····StringPtr **out_error, ······/* Place to return string with error message */
c7938a ····long *out_code ············/* Return for translator-specific result code */
5e6275 );
feaf5a
1f6f40 /* ----- Actually perform a translation on a file -------------------------- */
4ff8a2 pascal long ems_translate_file(
2c789a ····Handle globals, ·············/* Handle to translator instance structure */
50e6da ····long context, ···············/* Context for translation; e.g. EMSF_ON_xxx */
6efe5f ····short trans_id, ·············/* ID of translator to call */
3ec9ff ····emsMIMEtypeP in_mime, ·······/* MIME type of input data */
99e42b ····FSSpec *in_file, ············/* The input file name */
2ade15 ····StringPtr ***addresses, ·····/* List of addresses (sender and recipients) */
758beb ····emsProgress progress, ·······/* Func to report progress / check for abort */
515b7a ····emsMIMEtypeP *out_mime, ·····/* Place to return MIME type of result */
133850 ····FSSpec *out_file, ···········/* The output file (specified by Eudora) */
d0c799 ····Handle *out_icon, ···········/* Returned icon suite representing
3d5212 ····¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   the result */
36ea8c ····StringPtr **out_desc, ·······/* Returned string for display with·
665212 ····¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   the result */
324c2f ····StringPtr **out_error, ······/* Place to return string with error message */
1582ab ····long *out_code ··············/* Return for translator-specific
a63907 ····¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   result code */
636275 );
88af5a
03c800 /* ----- Actually perform a translation on a buffer ------------------------ */
4894fa #ifdef EMS_VERSION_2
44abf4 pascal long ems_translate_buf(
36789a ····Handle globals, ·············/* Handle to translator instance structure */
cae6da ····long context, ···············/* Context for translation; e.g. EMSF_ON_xxx */
50fe5f ····short trans_id, ·············/* ID of translator to call */
3ec9ff ····emsMIMEtypeP in_mime, ·······/* MIME type of input data */
7b1f8b ····unsigned char **in_buffer, ··/* Handle to buffer of data to translate */
e4cbac ····long in_offset, ·············/* Offset to start of input data in buffer */
ff0955 ····long *in_buffer_len, ········/* Amount of input & returns input consumed */
dfde15 ····StringPtr ***addresses, ·····/* List of addresses (sender and recipients) */
6d7cd0 ····emsProgress progress, ·······/* Func to report progress/check for abort */
--d350 001c561f8f840120078 Page 4 of emsapi-mac.h
195b7a ····emsMIMEtypeP *out_mime, ·····/* Place to return MIME type of result */
47875f ····unsigned char **out_buffer, ·/* Hd be placed in */
ade29b ····Handle *out_icon, ···········/* Returned icon suite representing the
346b84 ····¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   result */
173050 ····StringPtr **out_desc, ·······/* Returned string for display with the
14d80e ····¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   result */
0312e4 ····StringPtr **out_error, ······/* Place to return string with
10a6bf ····¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·error message */
9882ab ····long *out_code ··············/* Return for translator-specific
753907 ····¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   result code */
6b6275 );
5086f4 #endif //EMS_VERSION_2
d6af5a
c714a0 /* ----- End use of a plugin and clean up ---------------------------------- */
25a4a9 pascal long ems_plugin_finish(
0503a8 ····Handle globals ··············/* Handle to translator instance structure */
a66275 );
55af5a
c5e25b #endif /* EMSAPI_MAC_H_INCLUDED */
--4605 000909e350340120079 Page 1 of emsdrive.c
b114b9 /* ======================================================================
fbe8c6 ···
fbcc99 ····Eudora Extended Message Services API SDK Macintosh 1.0b3 (July 11 1996)
af7b3e ····This SDK supports EMSAPI version 1
abb06d ····Copyright 1995, 1996 QUALCOMM Inc.
8e83da ····Send comments and questions to <emsapi-info@qualcomm.com>
12af5a
b70cf4 ····Filename: emsdrive.c
6ee8c6 ···
82c26f ···Test driver for Eudora Translator API
1daf5a
7f5339 ···Last Edited: July 23, 1996
52af5a
782ddf ···Laurence Lundblade <lgl@qualcomm.com>
84ab90 ···Scott Gruby <sgruby@qualcomm.com>
7593e7 ···Myra Callen <t_callen@qualcomm.com>
68af5a
e6495d ·*/
117b7d #pragma once
0daf5a
f827cb #include "Quickdraw.h"
55324c #include <string.h>
93bea3 #include <stdlib.h>
d27c7a #include <Icons.h>
6b728f #include <Types.h>
a6af5a
3448c9 #include "emsapi-mac.h"
5aabb7 #include "copycat.h"
72f10b #include "mimetype.h"
b6bdd3 #include "usertrans.h"
94af5a
97af5a
34e950 /*****************************************************************/
e665a4 /* ·G L O B A L S ·and ·C O N S T A N T S
e0e950 /*****************************************************************/
cfaf5a
5e6583 Str255¤ ¤   quitString = "\pClick in window to quit";
77af5a
9ad713 #define kBaseResID¤ ¤   ¤   128
cd1bfd #define kErrorALRTid¤   ¤   128
ee5554 #define kAboutALRTid¤   ¤   129
abc35f #define kProgressALRTid¤¤   130
49af5a
36aedf #define kVisible¤   ¤   ¤   true
64c41e #define kMoveToFront¤   ¤   (WindowPtr)-1L
76abc5 #define kSleep¤ ¤   ¤   ¤   60L
b5d0f5 #define kNullPtr¤   ¤   ¤   0L
33af5a
1a924d #define mApple¤ ¤   ¤   ¤   kBaseResID
812d3b #define iAbout¤ ¤   ¤   ¤   1
aeaf5a
a6f4ab #define mFile¤  ¤   ¤   ¤   kBaseResID+1
2a398d #define iQuit¤  ¤   ¤   ¤   1
e9af5a
6ffe04 #define¤kHeaderOffset¤  ¤   42
b6cc10 #define kDummyHOffset¤  ¤   233
0a986a #define kTransHeightOffset ¤60
edcf87 #define kNumberofButtons¤   2
2318c8 #define kTransTopOffset¤¤   4
2d1c7c #define kSecondButtonOffset¤30
b99c9a #define kButHeight¤ ¤   ¤   18
da5349 #define kTransButWidth¤ ¤   120
cfe430 #define kTestButWidth¤  ¤   90
c879d9 #define¤kIconHOffset¤   ¤   4
5412cd #define kButHOffset¤¤   ¤   42
191400 #define¤kTextHOffset¤   ¤   168
24b8ec #define kWindowWidth¤   ¤   528
87af5a
d071ac #define kOK¤¤   ¤   ¤   ¤   1
54d08c #define kCancel¤¤   ¤   ¤   2
210a52 #define kFactorySettings¤   3
90af5a
--5a41 0006ce22db240120079 Page 2 of emsdrive.c
93bd43 #define kProgressDlogID¤¤   500
d9924a #define kPercentItem¤   ¤   3
4caf5a
5c5ab3 #define kMimeDlogID¤¤   ¤   600
9a5eb4 #define kMimeStrBaseID¤ ¤   401
df8998 #define KMimeDefStrBaseID¤  501
fa4f3f #define kBaseMimeItem¤  ¤   22
07ad65 #define kTypeItem¤  ¤   ¤   22
6cd0c1 #define kSubtypeItem¤   ¤   23
481c38 #define kBaseParamItem¤ ¤   24
2baf5a
5581de #define kAddressDlogID¤ ¤   700
09753f #define kAddressStrBaseID¤  701
9cfd63 #define KAddDefStrBaseID¤   801
46fa03 #define kBaseAddressItem¤   16
e7af5a
5f39ca #define kContextDlogID¤ ¤   800
2840d1 #define kOnArrival¤ ¤   ¤   6
0adae6 #define kOnDisplay¤ ¤   ¤   7
96d804 #define kOnRequest¤ ¤   ¤   8
9ff52d #define kQ4Completion¤  ¤   9
84c3ef #define kQ4Transmission¤¤   10
dfaf5a
eb27e0 #define kDefModuleIcon¤ ¤   10128
b2c47d #define kDefTransIcon¤  ¤   10129
0faf5a
222736 Boolean gDone;
aeaf5a
90b280 char *translatorErrors[] = {
286c90 ¤   "EMSR_OK",
e36731 ¤   "EMSR_UNKNOWN_FAIL",
85fef6 ¤   "EMSR_CANT_TRANS",
bf02a2 ¤   "EMSR_INVALID_TRANS",
00ccea ¤   "EMSR_NO_ENTRY",
c44b6f ¤   "EMSR_NO_INPUT_FILE",
a3e075 ¤   "EMSR_CANT_CREATE",
5693cb ¤   "EMSR_TRANS_FAILED",
6ec31e ¤   "EMSR_INVALID",
5ea733 ¤   "EMSR_NOT_NOW",
9daf75 ¤   "EMSR_NOW",·
ae03e6 ¤   "EMSR_ABORTED"};
ed67c5 ¤
4caf5a
5e5b1f /* Keep track of translatorButtons on translator modules window */
df33b9 struct translatorButtonstructure {
1793d9 ····ControlHandle ·handle;
89429d ····void¤   ¤   ¤   ¤   ··(*proc)();
ce5aac ····void¤   ¤   ¤   ¤   ···*arg;
b4e9e9 } translatorButtons[100];
84af5a
f408c6 typedef struct moduleInfoS {
4c637b ····Handle ¤¤   ¤   ¤   ¤   globalsH;
829bfe ····short ¤ ¤   ¤   ¤   ¤   transCount;
0db9ec ····StringHandle¤   ¤   ¤   moduleDesc;
07b55e ····short¤  ¤   ¤   ¤   ¤   moduleID;
963ee2 ····Handle¤ ¤   ¤   ¤   ¤   iconH;
b4c887 } moduleInfo;
7caf5a
dc6990 typedef struct translatorInfo {
36f576 ····short¤  ¤   ¤   ¤   ¤   translatorNumber;
17353b ····long¤   ¤   ¤   ¤   ¤   type;
92e19a ····long¤   ¤   ¤   ¤   ¤   subtype;
7db284 ····unsigned long¤  ¤   ¤   flags;
ce1228 } translatorInfo;
9aaf5a
6c5818 /* Module Info from init call */
5fb0dd static short¤   ¤   ¤   ¤   gTranslatorCount, gModuleID;
e0d71e long¤   ¤   ¤   ¤   ¤   ¤   gContext;
d4f405 static Handle¤  ¤   ¤   ¤   gModuleIconH, gModuleGlobalsH;
f7f92a static StringHandle¤¤   ¤   gModuleNameH;
130588 static ControlHandle¤   ¤   gMimeButH, gAddressButH, gContextButH;
6cbe75 static emsMIMEtype¤ ¤   ··**gMimeTypeH;
--1caf 00053769ec340120079 Page 3 of emsdrive.c
cc3d4d static emsMIMEparam¤¤   ··**gMimeParamsH[6];
bd8668 static short¤   ¤   ¤   ¤   gOurResRefNum;
11a56a static Handle¤  ¤   ¤   ··**gAddressesH;
054598 static WindowPtr¤   ¤   ¤   gTranslatorWindow = nil, wPtr;
2daf5a
2caf5a
38e950 /*****************************************************************/
bf5de9 /* ·P R O T O T Y P E S
7ae950 /*****************************************************************/
11af5a
ef9046 void ·¤ ToolboxInit( void );
833b91 void ·¤ main( void );
9ad704 void¤   MenuBarInit( void );
b6e508 void ¤  DoInitialize();
bbca49 short¤  DrawWindow(WindowPtr window);
525ada void¤   EventLoop( void );
f67719 void¤   DoEvent( EventRecord eventPtr );
c9a061 void ···CleanUp( void );
17af5a
60af5a
da5223 void¤   DoMimeDlog( void );
5e8fd8 void¤   RestoreMimeDefaults( DialogPtr dlog );
b914fb void¤   SaveMimeSettingsToFile( DialogPtr dlog );
bc5e52 void¤   SetupMimeDialog( DialogPtr dlog );
89b70e void¤   BuildNewMimeData( void );
f8af5a
50e5de void¤   DoAddressDlog( void );
4ef072 void¤   RestoreAddressDefaults( DialogPtr dlog );
bd3c48 void¤   SaveAddressSettingsToFile( DialogPtr dlog );
e48081 void¤   SetupAddressDialog( DialogPtr dlog );
cbaede void¤   GetAddressChanges( DialogPtr dlog );
ad4557 void¤   InitAddressData( void );
f8af5a
b484e6 void¤   DoContextDlog( void );
df792c void¤   TurnOffAllRadials( DialogPtr dlog );
47af5a
4548ad void¤   HandleMouseDown( EventRecord *eventPtr );
17af5a
df2fb7 void¤   HandleMenuChoice( long menuChoice );
42af5a
65945f void¤   HandleAppleChoice( short item );
434efa void¤   HandleFileChoice( short item );
15af5a
dd27cd void¤   DoError( Str255 errorString );
a818d8 void ···DoTranslation(ControlHandle theControl, void *);
60e7f1 void ···CanTranslation(ControlHandle theControl, void *);
b5af5a
53265a void ¤  DoUpdate();
acce26 void¤   DoMessage( Str255 errorString );
2e4a01 void ¤  SetWindowFont(DialogPtr dlog, short fontNum, short fontSize,
252104 ¤   ¤   ¤   Style fontStyle, short fontMode);
dcaf5a
a36d5f void ¤  DoDisposeHandle(Handle);
00dd14 Handle ¤DoNewHandle(size_t);
31af5a
c45edd // borrowed from emsapi-MacGlue.h
521db3 /* ========== set up for call backs ======================================*/
b1b177 #if 0
faaf5a
fda1b0 typedef pascal short (*emsProgress_t)(short percent);
5aaf5a
209b22 #if GENERATINGCFM
c14e49 typedef UniversalProcPtr emsProgressUPP;
7edb21 #else
7d7323 typedef emsProgress_t emsProgressUPP;
3d7454 #endif
057454 #endif
cbaf5a
df73f4 enum {
f50cdb ····uppemsProgressProcInfo = kPascalStackBased
64b766 ········| RESULT_SIZE(SIZE_CODE(sizeof(short)))
537efd ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
--ceb8 000df178c1b40120079 Page 4 of emsdrive.c
8082f7 };
abaf5a
31af5a
999b22 #if GENERATINGCFM
c190c9 #define NewemsProgressProc(userRoutine)¤ (emsProgressUPP) \
a577e8 NewRoutineDescriptor((ProcPtr)(userRoutine), \
2df1f9 uppemsProgressProcInfo, GetCurrentArchitecture())
80db21 #else
28da09 #define NewemsProgressProc(userRoutine)¤ \
8df07b ((emsProgressUPP) (userRoutine))
a07454 #endif
40af5a
e0af5a
78af5a
15e950 /*****************************************************************/
b496b6 /* ·M A I N ·P R O G R A M
69e950 /*****************************************************************/
c6af5a
726cfd void main( void )
55bb36 {
446f14 ····ToolboxInit();
6e975c ¤   MenuBarInit();
7c1304 ¤   DoInitialize();
70669e ¤   EventLoop();
f42cc4 ¤   CleanUp();
0aefe6 }
6eaf5a
33af5a
470975 /* ----------------------------------------------------------------------
da1985 ·* Put up window with module/translator info
b6495d ·*/
36af5a
650762 void DoInitialize()
2cbb36 {
1e1d4a ¤   Boolean¤¤   done = false;
7bd962 ¤   Rect¤   ¤   theRect;
72e173 ¤   short¤  ¤   cnt;
ff7224 ····long ·······theResult = EMSR_OK;
5960cc ¤   Str255 ·¤   message;
a830bd ¤   OSErr¤  ¤   err;
6a67c5 ¤
30c35e ¤   /* get our resource ref num */
18985c ¤   gOurResRefNum = CurResFile();¤
ccaf5a
dfb193 ····/* Pretend we're like the component manager handle the globals storage */
ab6763 ····gModuleGlobalsH = NewHandle(sizeof(emsUserGlobals));
a5af5a
051dc4 ¤   /* Initialize this module and get the module information.*/
9b831a ¤   theResult = ems_plugin_init(
8330f2 ¤   ¤   ¤   ¤   ¤   gModuleGlobalsH,
41cb17 ¤   ¤   ¤   ¤   ¤   &gTranslatorCount,
71b347 ¤   ¤   ¤   ¤   ¤   &gModuleNameH,
97961b ¤   ¤   ¤   ¤   ¤   &gModuleID,
95eb9a ¤   ¤   ¤   ¤   ¤   &gModuleIconH);
a0d422 ¤   if(theResult != EMSR_OK) {
4c913c ¤   ····gTranslatorCount = 0;
283b91 ¤   ····// Report how it all went
d6ad29 ¤   ¤   strcpy((char *)message, "plugin_init failed: ");
e95240 ¤   ¤   if ( (theResult >= EMSR_OK) && (theResult <= EMSR_ABORTED) )
9d1d59 ¤   ¤   ¤   strcat((char *)message, translatorErrors[theResult]);
020e1d ¤   ¤   else
55d097 ¤   ¤   ¤   strcat((char *)message, "bad result");
581bf0 ¤   ¤   CtoPstr((char *)message);
b36010 ¤   ¤   DoMessage(message);
5d9371 ¤   }
4267c5 ¤
343cb2 ¤   /* Substitute our dummy icon if translator doesn't have one. */
8fbd01 ¤   if ( gModuleIconH == NULL )
01e3fc ····¤   err = GetIconSuite(&gModuleIconH,kDefModuleIcon,svAllAvailableData);
f2af5a
33c378 ¤   /* initialize mime data */
dffd27 ¤   BuildNewMimeData();
--6b04 00039c8ff6240120079 Page 5 of emsdrive.c
2a67c5 ¤
bad3d5 ¤   InitAddressData();
ea3a10 ¤   gContext = EMSF_ON_REQUEST;
9867c5 ¤
56f86e ¤   SetRect(&theRect, 10, 50,
66cde0 ¤   ¤   ¤   kWindowWidth,
22d399 ¤   ¤   ¤   (gTranslatorCount+1)*kTransHeightOffset + kHeaderOffset);¤
842096 ¤   gTranslatorWindow = NewCWindow (0L,
c4a30b ¤   ¤   &theRect, "\pTranslator Debugger",
a399ad ¤   ¤   ·TRUE, 0, (WindowPtr)-1L, FALSE, 0L);
57a24d ¤   SetPort(gTranslatorWindow);
3867c5 ¤
5c7b45 ¤   OffsetRect(&theRect, 100, 0);
efa24d ¤   SetPort(gTranslatorWindow);
e367c5 ¤
e5ea3f ¤   /* Buttons for dummy testing information */
7e10c6 ····SetRect(&theRect,
9f7a47 ····¤   ¤   kDummyHOffset, 20,
20f168 ····¤   ¤   kDummyHOffset+kTestButWidth, 20 + kButHeight );
1c9f95 ¤   gMimeButH = NewControl(gTranslatorWindow,
edf3ed ¤   ¤   ¤   ¤   &theRect, "\pMime Types", TRUE,
853ff2 ·····························0, 0, 0, pushButProc, 0L);¤
c710c6 ····SetRect(&theRect,
89507f ····¤   ¤   kDummyHOffset+95, 20,
fb32fc ····¤   ¤   kDummyHOffset+kTestButWidth+95, 20 + kButHeight);
8dc001 ¤   gAddressButH = NewControl(gTranslatorWindow,
e52e0e ¤   ¤   ¤   ¤   &theRect, "\pAddresses", TRUE,
ad4da0 ·····························0, 0, 0, pushButProc, 0L);
4b10c6 ····SetRect(&theRect,
e7991e ····¤   ¤   kDummyHOffset+190, 20,
51e045 ····¤   ¤   kDummyHOffset+kTestButWidth+190, 20 + kButHeight);
9be457 ¤   gContextButH = NewControl(gTranslatorWindow,
73f419 ¤   ¤   ¤   ¤   ¤   &theRect, "\pContext", TRUE,
ac4da0 ·····························0, 0, 0, pushButProc, 0L);
591b52 ¤   ¤
1ecf6d ¤   /* create buttons for all the translators */
03d422 ¤   if(theResult != EMSR_OK) {
f5a993 ¤   ¤   DoMessage("\pSorry, ems_plugin_init failed.");
649371 ¤   }
91665a ¤   else {
e967c5 ¤
2a8b85 ¤   ¤   for (cnt = 0; cnt < gTranslatorCount; cnt++ ) {
a6af5a
d7997f // create two buttons for every translator, save the handle in the array
02a1a3 SetRect(&theRect,
56c83f ¤   kButHOffset,
8b1a28 ¤   (cnt) * kTransHeightOffset + kHeaderOffset + kTransTopOffset,
48c791 ¤   kButHOffset+kTransButWidth,
753e47 ¤   (cnt) * kTransHeightOffset +
8ed288 ¤   kButHeight+kHeaderOffset+kTransTopOffset);
457456 translatorButtons[(cnt*2)+1].handle =
b900dc ¤   NewControl(gTranslatorWindow,&theRect,"\pCanTrans on File",TRUE,
1af81d ····0, 0, 0, pushButProc, cnt+1);
4ba1a3 SetRect(&theRect,
f6c83f ¤   kButHOffset,
affa8f ¤   (cnt)*kTransHeightOffset+kHeaderOffset+kSecondButtonOffset,
43c791 ¤   kButHOffset+kTransButWidth,
b4910e ¤   (cnt)*kTransHeightOffset+kSecondButtonOffset+kButHeight+kHeaderOffset);
fb7f35 translatorButtons[(cnt*2)].handle =
11c54d ¤   NewControl(gTranslatorWindow, &theRect, "\pTranslate File", TRUE,
5cf81d ····0, 0, 0, pushButProc, cnt+1);
e80fe4 ¤   ¤   }
4e9371 ¤   }
7467c5 ¤
582e02 ¤   DoUpdate();
6fefe6 }
49af5a
b292cf void DoUpdate()
c5e765 {¤  short ······returnError;
3c67c5 ¤
cb661d ¤   BeginUpdate(gTranslatorWindow);
39af5a
--84c6 0000856e54c40120079 Page 6 of emsdrive.c
9f76e4 ····returnError = DrawWindow(gTranslatorWindow);
f61f76 ¤   UpdateControls(gTranslatorWindow, gTranslatorWindow->visRgn);
7781c8 ¤   ·¤
033153 ¤   EndUpdate(gTranslatorWindow);
35af5a
84efe6 }
5daf5a
1daf5a
b7c3b8 void CleanUp()·
1fbb36 {
9ca429 ¤   if ( gModuleGlobalsH != NULL ) {
50d3cc ¤   ····ems_plugin_finish(gModuleGlobalsH);
4e6eda ¤   ····DisposeHandle(gModuleGlobalsH);
29740f ¤   ····gModuleGlobalsH = NULL;
9b6fe7 ····}
8cefe6 }
77af5a
fdaf5a
15af5a
6d256c /* --------------------------------------------------------------------
ebb703 ····Avoid taking address of an inline functions. At least that's what the
b21906 ····error messages say....
45495d ·*/
88bbab void DoDisposeHandle(Handle h)
5abb36 {
edb207 ····DisposeHandle(h);
43efe6 }
0caf5a
78d486 Handle DoNewHandle(size_t size)
06bb36 {
80cdf8 ····return(NewHandle(size));
dfefe6 }
ccaf5a
98af5a
d9af5a
580975 /* ----------------------------------------------------------------------
e712fa ····Display the translators in a particular module with translatorButtons for
a34bfd ····invoking operatations
9b495d ·*/
3c146c short
001aa9 DrawWindow(WindowPtr window)
c0bb36 {
bcdde6 ····char ·······¤   buffer[4000];
0c34bb ····short ······¤   cnt, buttonCount;
232c9f ····Handle¤ ¤   ¤   transIconSuiteH = NULL;
9fb465 ····Rect¤   ¤   ¤   theIconRect, textBox;
82ba93 ····Str63 ······¤   theNumString;
bdc8cb ····short ······¤   api_version = 0;
35374d ····translatorInfo ¤tInfo;
05fc14 ····long ·······¤   theResult = EMSR_OK;
d86af4 ····StringHandle ··¤descriptionStrH = NULL;
e3d228 ····OSErr¤  ¤   ¤   err;
9567c5 ¤
f3cca3 ¤   SetPort(window);
703eac ¤   TextSize(10);
3eaf5a
a809c2 ····MoveTo(kDummyHOffset, 14);
e17a90 ····DrawString("\pSet Dummy Testing Information: ");
b267c5 ¤
61b403 ¤   // Module Icon
f2b492 ····SetRect(&theIconRect,
a5941c ····¤   ¤   kIconHOffset, 5,
9280dd ····¤   ¤   kIconHOffset+32, 5 + 32);
2a8330 ¤   if ( gModuleIconH && *gModuleIconH )
80becd ¤   ¤   PlotIconSuite(&theIconRect,atAbsoluteCenter,ttNone,gModuleIconH);
6967c5 ¤
d1a577 ····// Module Name
27f46e ····MoveTo(kButHOffset, 12);
a02e46 ····DrawString("\pModule: ");
ed794b ····TextFace(bold);
60a238 ····MoveTo(kButHOffset, 24);
087e89 ····if ( gModuleNameH != NULL ) {
--63ff 0006b43ad5d40120079 Page 7 of emsdrive.c
f88309 ¤   ····HLock( (Handle)gModuleNameH );
c70570 ¤   ····DrawString( *gModuleNameH );
e4aa0b ¤   ····HUnlock( (Handle)gModuleNameH );
5d6fe7 ····}
60842c ····else
c34be8 ¤   ····DrawString( "\pNULL value" ); ···¤
441944 ····TextFace( 0 ); //plain
2baf5a
4f3e57 ····// API version
618cb1 ····MoveTo(kButHOffset, 37);
76fe0c ····DrawString("\pAPI Version: ");
0c4af0 ¤   ems_plugin_version(&api_version);
288e43 ¤   if ( api_version != 0 ) {
006278 ¤   ¤   NumToString(api_version, theNumString);
3c3695 ¤   ····DrawString(theNumString);
8c6fe7 ····}
55842c ····else
a257ec ¤   ····DrawString( "\pNULL value" );
cbaf5a
28f6e8 ¤   // Draw line
1c01e6 ····MoveTo(0,kHeaderOffset);
73be10 ····LineTo(600,kHeaderOffset);
0caf5a
bbbea9 ····// Go through the translators in the module
e15657 ····for(cnt = 1; cnt <= gTranslatorCount; cnt++) {
88af5a
9e0458 ········tInfo.type = 0;
4183e8 ········tInfo.subtype = 0;
ec7c9c ········tInfo.flags = 0;
4d508e ········
fb8719 ········/* Get the description of the translator */
bfb1db ········theResult = ems_translator_info(
025f15 ········¤   ¤   ¤   gModuleGlobalsH,
0975ab ········¤   ¤   ¤   cnt,
457fe0 ········¤   ¤   ¤   &tInfo.type,
d5a020 ········¤   ¤   ¤   &tInfo.subtype,
e3a4db ········¤   ¤   ¤   &tInfo.flags,
433ca6 ········¤   ¤   ¤   &descriptionStrH,
20014b ········¤   ¤   ¤   nil);
2af574 ········tInfo.translatorNumber = cnt;
4e508e ········
faa73d ········/* Get the icon separately */
5e5b52 ········transIconSuiteH = NULL;
50b1db ········theResult = ems_translator_info(
325f15 ········¤   ¤   ¤   gModuleGlobalsH,
3b3ee0 ········¤   ¤   ¤   cnt,·
991da9 ········¤   ¤   ¤   nil,
581da9 ········¤   ¤   ¤   nil,
b61da9 ········¤   ¤   ¤   nil,
471da9 ········¤   ¤   ¤   nil,
685244 ········¤   ¤   ¤   &transIconSuiteH);
e9af5a
3a72c5 ¤   ¤   /* Substitute our dummy icon if translator doesn't have one. */
f60879 ¤   ¤   if ( transIconSuiteH == NULL )
d1e43c ····¤   ¤   err = GetIconSuite(&transIconSuiteH,
82921f ····¤   ¤   ¤   kDefTransIcon,svAllAvailableData);
02af5a
2b022b ¤   ····MoveTo(kTextHOffset,
1e908c ¤   ····¤   (cnt-1)*kTransHeightOffset+kHeaderOffset+kTransTopOffset+9);
01a61a ¤   ····NumToString(cnt, theNumString);
2837dd ¤   ····PtoCstr(theNumString);
854103 ¤   ····strcpy(buffer, "Translator #");
283da7 ¤   ····strcat(buffer, (char *)theNumString);
c1a06b ¤   ····strcat(buffer, ": ");
6244a0 ¤   ····DrawString(CtoPstr(buffer));
ad849f ¤   ····if ( descriptionStrH != NULL ) {
ea6312 ¤   ········HLock((Handle)descriptionStrH);
9c2b66 ¤   ¤   ····DrawString(*descriptionStrH);
1462f4 ¤   ········HUnlock((Handle)descriptionStrH);
35f328 ¤   ········DisposHandle((Handle)descriptionStrH);
491d36 ¤   ········descriptionStrH = NULL;
6b7fb0 ········}
--18d6 00067af97c840120079 Page 8 of emsdrive.c
5c1e5b ········else
dde1ab ¤   ····¤   DrawString( "\pNULL value" ); ·······
4caf5a
a21a56 ········/* Draw the icon - icon is 32x32 */
c03f70 ········SetRect(&theIconRect,
2bc120 ···········kIconHOffset,
bfb013 ···········(cnt-1) * kTransHeightOffset +
75fe58 ···········¤¤   kHeaderOffset + kTransTopOffset,
2843db ···········kIconHOffset+32,
1eb013 ···········(cnt-1) * kTransHeightOffset +
df7e2e ···········¤32 + kHeaderOffset + kTransTopOffset);
0b8dfa ¤   ¤   if ( transIconSuiteH && *transIconSuiteH ) {
a5fa61 ¤   ¤   ¤   PlotIconSuite(&theIconRect,
979eaf ¤   ¤   ¤   ¤   atAbsoluteCenter,ttNone,transIconSuiteH);
04ab7d ¤   ¤   ¤   DisposeIconSuite(transIconSuiteH, TRUE);
d7ad91 ¤   ¤   ¤   transIconSuiteH = NULL;
803b90 ¤   ¤   }¤
6daf5a
b04207 ¤   ····/* The translator info details */
837d60 ¤   ····strcpy(buffer,"Type: ");
d4ea97 ········NumToString(tInfo.type, theNumString);
42e762 ········PtoCstr(theNumString);
734f8d ········strcat(buffer, (char *) theNumString);
b03a06 ¤   ····strcat(buffer, " ····Subtype: ");
4af7c0 ¤   ····NumToString(tInfo.subtype, theNumString);
0237dd ¤   ····PtoCstr(theNumString);
fb3da7 ¤   ····strcat(buffer, (char *)theNumString);
86dc78 ¤   ····strcat(buffer, " ····");
0b7c56 ¤   ¤   strcat(buffer,
932438 ¤   ¤   ¤   tInfo.flags &EMSF_REQUIRES_MIME ? "wants MIME, " : "");
ff7c56 ¤   ¤   strcat(buffer,
c91f34 ¤   ¤   ¤   tInfo.flags & EMSF_GENERATES_MIME ? "makes MIME, " : "");
081b52 ¤   ¤
ee022b ¤   ····MoveTo(kTextHOffset,
22d09e ¤   ····¤   (cnt-1) * kTransHeightOffset +
9c627e ¤   ····¤   ¤   23 + kHeaderOffset + kTransTopOffset);
0444a0 ¤   ····DrawString(CtoPstr(buffer));
b067c5 ¤
9007bc ¤   ····/* Some of the options */
cf022b ¤   ····MoveTo(kTextHOffset,
e0148b ¤   ····¤   ¤   (cnt-1) * kTransHeightOffset +
7f9392 ¤   ····¤   ¤   37 + kHeaderOffset + kTransTopOffset);
7be9c0 ¤   ····strcpy(buffer, "Options:");
9d44a0 ¤   ····DrawString(CtoPstr(buffer));
7167c5 ¤
a156ce ¤   ····strcpy(buffer, "");
ac0eb3 ¤   ····if ( tInfo.flags & EMSF_ON_ARRIVAL ) {
193db6 ¤   ····¤   strcpy(buffer, "On Arrival");
ecf372 ¤   ····}
f977d4 ¤   ····if ( tInfo.flags & EMSF_ON_DISPLAY ) {
46b54d ¤   ····¤   if ( strlen(buffer) != 0 ) strcat(buffer, ", ");
82c3bf ¤   ····¤   strcat(buffer, "On Display");
b7f372 ¤   ····}
38348d ¤   ····if ( tInfo.flags & EMSF_WHOLE_MESSAGE ) {
8db54d ¤   ····¤   if ( strlen(buffer) != 0 ) strcat(buffer, ", ");
82fb3e ¤   ····¤   strcat(buffer, "Whole-Message");
a3f372 ¤   ····}
adb6c6 ¤   ····if ( tInfo.flags & EMSF_ON_REQUEST ) {
9fb54d ¤   ····¤   if ( strlen(buffer) != 0 ) strcat(buffer, ", ");
71e508 ¤   ····¤   strcat(buffer, "On Request");
51f372 ¤   ····}
c0ef7a ¤   ····if ( tInfo.flags & EMSF_Q4_TRANSMISSION ) {
f0b54d ¤   ····¤   if ( strlen(buffer) != 0 ) strcat(buffer, ", ");
1b4581 ¤   ····¤   strcat(buffer, "Q4 Transmission");
d3f372 ¤   ····}
8af425 ¤   ····if ( tInfo.flags & EMSF_Q4_COMPLETION ) {
66b54d ¤   ····¤   if ( strlen(buffer) != 0 ) strcat(buffer, ", ");
0cbb4c ¤   ····¤   strcat(buffer, "Q4 Completion");
3ef372 ¤   ····}
7fa747 ¤   ····¤   ¤
46620f ····¤   SetRect(&textBox,
67deb6 ····¤   ¤   ¤   kTextHOffset+42,
--fad8 000005ab74340120079 Page 9 of emsdrive.c
350834 ····¤   ¤   ¤   (cnt-1) * kTransHeightOffset +
9b695b ····¤   ¤   ¤   ¤   kHeaderOffset + kTransTopOffset + 27,
ee4f11 ····¤   ¤   ¤   kTextHOffset+350,
bd0834 ····¤   ¤   ¤   (cnt-1) * kTransHeightOffset +
23f9c5 ····¤   ¤   ¤   ¤   kHeaderOffset + kTransTopOffset + 56);
b1fb86 ¤   ¤   CtoPstr(buffer);
156591 ········TETextBox (&(buffer[1]), buffer[0], &textBox, teFlushLeft);
5daf5a
005111 ········// The test translation button
c85ef0 ¤   ¤   buttonCount = (cnt*2) - 2;
173a92 ········translatorButtons[buttonCount].proc = (void (*)())DoTranslation;
49dec8 ········translatorButtons[buttonCount].arg =
404652 ········¤   (void *)NewPtr(sizeof (struct translatorInfo));
ea4eb9 ········*((struct translatorInfo *)
ab0ce1 ········¤   translatorButtons[buttonCount].arg) = tInfo;
94af5a
c270b7 ········// The can translate button
c8b194 ¤   ¤   buttonCount = (cnt*2) - 1;
7127c6 ········translatorButtons[buttonCount].proc =
998371 ········¤   (void (*)())CanTranslation;
81dec8 ········translatorButtons[buttonCount].arg =
954652 ········¤   (void *)NewPtr(sizeof (struct translatorInfo));
af4eb9 ········*((struct translatorInfo *)
d80ce1 ········¤   translatorButtons[buttonCount].arg) = tInfo;
3caf5a
27b763 ¤   ¤   // Draw line
c51e16 ····¤   MoveTo(kButHOffset,
1dabef ····¤   ¤   ¤   (cnt) * kTransHeightOffset + kHeaderOffset );
4f1203 ····¤   LineTo(600,
5aabef ····¤   ¤   ¤   (cnt) * kTransHeightOffset + kHeaderOffset );
5baf5a
b06fe7 ····}
59af5a
24c21d ····return(gTranslatorCount);
931862 }¤
4baf5a
39af5a
000975 /* ----------------------------------------------------------------------
b7170d ····Actually do a translation
e4495d ·*/
d92210 void DoTranslation(ControlHandle theControl, void *arg)
b7bb36 {
3fd2f4 ····StringPtr ·····¤¤   *errorMessage = NULL;
cc2ee7 ····Str255 ··············buffer, theNumString;
d6f910 ····StringPtr¤  ¤   ····*returnedMessage = NULL;
13d7f5 ····struct ·¤   ¤   ¤   ·translatorInfo *trans = arg;
511b03 ····short ··¤   ¤   ¤   ·theResult = EMSR_OK;
be7b5b ····long ················resultCode = 0;
426baf ···¤StandardFileReply¤  ·theGetReply, thePutReply;
31128d ····emsMIMEtype ·······**transMimeType; // These are handles to structures
805aa1 ····emsProgress¤¤   ¤   ·progressUPP;
9aaf5a
de3bc3 ¤   transMimeType = NULL;
eaa5d1 ¤   errorMessage = NULL;
ba9ab9 ¤   returnedMessage = NULL;
f57970 ¤   HiliteControl(theControl, 255); // Make control gray
a3af5a
eac469 ····/* Get the input file */
5cc425 ¤   StandardGetFile(nil, -1, nil, &theGetReply);
a365f1 ¤   if (!theGetReply.sfGood) {
f497ed ¤   ····HiliteControl(theControl, 0);
a16bff ····¤   return;
059371 ¤   }
f867c5 ¤
cfda7d ····/* Get the output file */
5f95ac ¤   StandardPutFile("\pPick the Output File", "\pOutputFile", &thePutReply);
1f962f ····/* Make sure the file exists, as required by API */
2507b6 ····FSpDelete(&thePutReply.sfFile);
866f0a ····FSpCreate(&thePutReply.sfFile, 'ttxt', 'TEXT', smSystemScript);
09af5a
a70620 ····/* create callback function pointer for progress function */
006ff9 ¤   progressUPP = NewemsProgressProc(callProgress);
--5fb3 0005da14f6f40120079 Page 10 of emsdrive.c
e0af5a
e2df04 ····if (!thePutReply.sfGood) {
8697ed ¤   ····HiliteControl(theControl, 0);
926bff ····¤   return;
789371 ¤   }
5eaf5a
a1789e ····HiliteControl(theControl, 0);
11e9ff ····DoUpdate();¤ ·/* redraw window before calling translator */
b767c5 ¤
a8ce25 ¤   /* Eudora will call ems_can_translate before calling ems_translate.
d0771f ¤   ¤   Here we are
dd78c4 ¤   ·* assuming you can translate for the purposes of testing your code.
07a4e3 ¤   ·*/
fc67c5 ¤
b19b59 ····/* Call the translator in the module */
d88042 ¤   theResult = ems_translate_file(
3a5b6a ·······gModuleGlobalsH,
055ed4 ·······gContext,¤   ¤   ¤   ¤   /* Allow module to interact w/ user */
e6361c ·······trans->translatorNumber,/* Particular translator out of module */
e17144 ·······gMimeTypeH,¤ ¤   ¤   ¤   /* No MIME type (don't care) */
152460 ·······&theGetReply.sfFile,¤¤   ¤   /* The input file */
a6c661 ······(StringHandle **) gAddressesH,
cb7d20 ·······progressUPP,¤¤   ¤   /* No progress/abort just yet */
3adea9 ·······&transMimeType,¤ /* Don't worry about returned MIME type yet */
1694f7 ·······&thePutReply.sfFile,¤/* The outut file */
36168e ·······(Handle *) NULL,¤¤   ¤   /* No icon is returned */
9fe2b3 ·······&returnedMessage,¤   ¤   ¤   /* Message returned to user */
375546 ·······&errorMessage,¤  ¤   ¤   ¤   /* Place to put error message */
5ba4a6 ·······&resultCode);¤   ¤   ¤   ¤   /* Place to put error code */
14af5a
3852a1 ¤   InvalRgn(gTranslatorWindow->visRgn);
b0a508 ····DoUpdate();¤ ·/* redraw window after calling translator */
bdaf5a
dd0e2f ¤   // Report how it all went
20acfd ¤   /* Basic status */
c8d7b4 ¤   strcpy((char *)buffer, "Result: ");
66d805 ¤   if ( (theResult >= EMSR_OK) && (theResult <= EMSR_ABORTED) )
ba341e ¤   ¤   strcat((char *)buffer, translatorErrors[theResult]);
7e0e24 ¤   else
d00e8b ¤   ¤   strcat((char *)buffer, "bad result");
4080f1 ¤   strcat((char *)buffer, "\rCode: ");
77e9e2 ¤   CtoPstr((char *)buffer);
c0aca3 ¤   NumToString(resultCode, theNumString);
3bea4f ¤   catPP(theNumString, buffer);
993266 ¤   catPP("\p\rMessage: ", buffer);
55b378 ¤   catPP(errorMessage != NULL ? (StringPtr)*errorMessage : "\p", buffer);
1b97ad ¤   DoMessage(buffer);
bf67c5 ¤
e04a6e ¤   /* The MIME type */
1e8643 ¤   if(transMimeType ·&& (theResult == EMSR_OK) ) {
f551f8 ¤   ····Str255 msg;
9f4e33 ¤   ····Handle h;
e967c5 ¤
052c4c ¤   ····h = string_mime_type(transMimeType);
11fc3d ¤   ····HLock(h);
622cfc ¤   ····BlockMove(*h, msg+1, GetHandleSize(h) > 255 ? 255 : GetHandleSize(h));
c858ff ¤   ····HUnlock(h);
32f668 ¤   ····*msg = GetHandleSize(h) > 255 ? 255 : GetHandleSize(h);
da48ae ¤   ¤   DoMessage(msg);
169371 ¤   }
6867c5 ¤
aee191 ¤   /* Extra messages */
e51f75 ¤   if(returnedMessage && *returnedMessage){
16b1d6 ¤   ···HLock((Handle)returnedMessage);
36639a ¤   ···DoMessage(*returnedMessage);
80ddfe ¤   ···HUnlock((Handle)returnedMessage);
849371 ¤   }
7aefe6 }
76af5a
d2af5a
1a0975 /* ----------------------------------------------------------------------
5dd0d5 ····Test if we can translate
--b1ae 000afef30a440120079 Page 11 of emsdrive.c
47495d ·*/
b96e3a void CanTranslation( ControlHandle theControl, void *arg)
6ebb36 {
e38714 ····StringPtr ¤ ¤   ¤   ···*errorMessage = NULL;
570bb1 ····Str255 ···············¤ buffer;
0b6eee ····translatorInfo ·¤   ¤   *trans = arg;
1b683d ····short ··¤   ¤   ¤   ··¤ theResult = EMSR_OK;
0fdf02 ····long ·················¤ resultSize = 0;
100041 ···¤StandardFileReply¤  ··¤ theGetReply;
12af5a
cb761b ¤   {¤  errorMessage = NULL;
ba67c5 ¤
ae505c ····¤   HiliteControl(theControl, 255); // Make control gray
1daf5a
a03977 ¤   ····// Get the input file
aa8605 ¤   ····// This is removed for now since it might
143bb0 ¤   ····// get removed in the next version
c131d9 ¤   ····theGetReply.sfFile.vRefNum = 0;
0926bc ¤   ¤   //StandardGetFile(nil, -1, nil, &theGetReply);
4316c5 ¤   ¤   //if (!theGetReply.sfGood) {
6aa10f ········//¤ HiliteControl(theControl, 0);
77f6eb ··¤ ····// ·return;
ccf870 ····¤   //}
911f55 ····¤   ¤   ¤   ¤   ¤
20e32c ¤   ···¤HiliteControl(theControl, 0);
ce0d5a ····¤   DoUpdate();¤ ·/* redraw window before calling translator */
bc1b52 ¤   ¤
a0c56e ·····¤  // Call the translator in the module
b95fda ¤   ¤   theResult = ems_can_translate_file(
7833c7 ¤   ¤   ···············gModuleGlobalsH,
9180ab ·······················gContext,
fd174d ·······················trans->translatorNumber,
783c0d ·······················¤/* Particular translators out of module */
917be7 ·······················gMimeTypeH,
b2f138 ·······················&theGetReply.sfFile,
bc82dc ·······················¤/* The input file, may get removed in next version */
8ba971 ·······················(StringHandle **)gAddressesH,
662aeb ·······················&resultSize,
1ef524 ·······················&errorMessage,
907f47 ·······················(long *)NULL);
8baf5a
0e5419 ¤   ¤   InvalRgn(gTranslatorWindow->visRgn);
7b16db ····¤   DoUpdate();¤ ·/* redraw window after calling translator */
47e7c4 ····¤
9b3927 ¤   ¤   // Report how it all went
345fd2 ¤   ¤   strcpy((char *)buffer, "Result: ");
3f5240 ¤   ¤   if ( (theResult >= EMSR_OK) && (theResult <= EMSR_ABORTED) )
b8ee37 ¤   ¤   ¤   strcat((char *)buffer, translatorErrors[theResult]);
c60e1d ¤   ¤   else
7841b5 ¤   ¤   ¤   strcat((char *)buffer, "bad result");
df52b4 ¤   ¤   CtoPstr((char *)buffer);
30f733 ¤   ¤   catPP("\p\rMessage: ", buffer);
965e5f ¤   ¤   catPP(errorMessage != NULL ? (StringPtr)*errorMessage : "\p", buffer);
c72b85 ¤   ¤   ¤   ¤
b8754c ¤   ¤   DoMessage(buffer);
099371 ¤   }
67efe6 }
f7af5a
27af5a
9a2285 /* ============================================================================
0df4d5 ·····Basic Interface and Event management
6baf5a
1082de ============================================================================
8a7fe0 */
b5af5a
f5af5a
6b36f6 /************************************* DoEvent¤ ·*/
50af5a
3df64e void¤   DoEvent(EventRecord theEventRecord)
90bb36 {
fed443 ¤   char¤   ¤   theChar;
af67c5 ¤
--d7ee 000a7f832d440120079 Page 12 of emsdrive.c
2a67c5 ¤
acd2d7 ¤   switch (theEventRecord.what)
23c7a1 ¤   {
a067c5 ¤
1f4ea7 ¤   ¤   case mouseDown:
a094d8 ¤   ¤   ¤   HandleMouseDown(&theEventRecord);
67cdcb ¤   ¤   ¤   break;
fde68f ¤   ¤   case keyDown:
98610b ¤   ¤   case autoKey:
b80763 ¤   ¤   ¤   theChar = theEventRecord.message & charCodeMask;
70a0f7 ¤   ¤   ¤   if ( (theEventRecord.modifiers & cmdKey) != 0 )
90c4f3 ¤   ¤   ¤   ¤   HandleMenuChoice( MenuKey( theChar ) );
accdcb ¤   ¤   ¤   break;
eb7382 ¤   ¤   case updateEvt:
40c385 ¤   ¤   ¤   DoUpdate();
a12859 ¤   ¤   ····break;
861b52 ¤   ¤
799875 ¤   ¤   case activateEvt:
f947f1 ········case keyUp:¤¤   ¤   ¤   /* don't care */
d0acd8 ········case mouseUp:¤  ¤   ¤   /* don't care */
a2cd44 ········case networkEvt:¤   ¤   /* don't care */
9b4d28 ········case driverEvt:¤¤   ¤   /* don't care */
944af3 ········case kHighLevelEvent:¤  /*¤ AppleEvents¤*/
d358c8 ¤   ¤   case nullEvent:
659ae3 ¤   ¤   default:
b5cdcb ¤   ¤   ¤   break;
529371 ¤   }
34af5a
ddefe6 }
1daf5a
feaf5a
eab2d8 /************************************* HandleMouseDown */
6eaf5a
edd9ea void¤   HandleMouseDown( EventRecord *eventPtr )
19bb36 {
884fc0 ¤   WindowPtr¤  ¤   window;
be7dde ¤   short¤  ¤   ¤   thePart;
976eec ¤   long¤   ¤   ¤   menuChoice;
96375c ¤   ControlHandle ··whichControl;
a701e3 ¤   short ··········i;
7167c5 ¤
e86467 ¤   thePart = FindWindow( eventPtr->where, &window );
106120 ¤   switch ( thePart )
73c7a1 ¤   {
d40cea ¤   ¤   case inMenuBar:
ee05b8 ¤   ¤   ¤   menuChoice = MenuSelect( eventPtr->where );
aba51e ¤   ¤   ¤   HandleMenuChoice( menuChoice );
e4cdcb ¤   ¤   ¤   break;
bf2456 ¤   ¤   case inSysWindow :
f8cff8 ¤   ¤   ¤   SystemClick( eventPtr, window );
10cdcb ¤   ¤   ¤   break;
aec1aa ¤   ¤   case inContent:
ac186c ¤   ¤   ¤   // SelectWindow( window );
5b166a ¤   ¤   ¤   GlobalToLocal(&(eventPtr->where));
b6381c ¤   ¤   ¤   FindControl(eventPtr->where, window, &whichControl);
4ed529 ¤   ¤   ¤   if ( ( gMimeButH != NULL ) && (gMimeButH == whichControl) ) {
b0f067 ¤   ¤   ¤   ¤   HiliteControl(whichControl, 255);
80975e ¤   ¤   ¤   ¤   DoMimeDlog();
f4a044 ¤   ¤   ¤   ¤   HiliteControl(whichControl, 0);
61a3a6 ¤   ¤   ¤   }
5df4c9 ¤   ¤   ¤   else if ( ( gAddressButH != NULL ) &&
ee3f1d ¤   ¤   ¤   ¤   ¤   (gAddressButH == whichControl) ) {
77f067 ¤   ¤   ¤   ¤   HiliteControl(whichControl, 255);
624c84 ¤   ¤   ¤   ¤   DoAddressDlog();
70a044 ¤   ¤   ¤   ¤   HiliteControl(whichControl, 0);
720b49 ¤   ¤   ¤   }¤  ¤   ¤
450272 ¤   ¤   ¤   else if ( ( gContextButH != NULL ) &&
9c7187 ¤   ¤   ¤   ¤   ¤   (gContextButH == whichControl) ) {
c5f067 ¤   ¤   ¤   ¤   HiliteControl(whichControl, 255);
b065d0 ¤   ¤   ¤   ¤   DoContextDlog();
6da044 ¤   ¤   ¤   ¤   HiliteControl(whichControl, 0);
a70b49 ¤   ¤   ¤   }¤  ¤   ¤
--1327 000cf2bb76640120079 Page 13 of emsdrive.c
6ee543 ¤   ¤   ¤   else {
0e91dd ¤   ¤   ¤   ¤   /* loop for the two buttons for each translator */
f83d01 ¤   ¤   ¤   ¤   for(i = 0; i < (gTranslatorCount*kNumberofButtons); i++)
2872c3 ¤   ¤   ¤   ¤   {
d13838 ¤   ¤   ¤   ¤   ¤   if ((translatorButtons[i].handle != NULL)
9d1dae ¤   ¤   ¤   ¤   ¤   ¤   && (translatorButtons[i].handle == whichControl)
88ae95 ¤   ¤   ¤   ¤   ¤   ¤   && (translatorButtons[i].proc != NULL)) {
df9a3e ·¤  ¤   ¤   ········¤   (*(translatorButtons[i].proc))(whichControl,
e84502 ·¤  ¤   ¤   ········¤   ¤   translatorButtons[i].arg);
77904b ¤   ¤   ¤   ····¤   }
41da85 ¤   ¤   ¤   ····}
6fa3a6 ¤   ¤   ¤   }
1acdcb ¤   ¤   ¤   break;
4b4942 ¤   ¤   case inDrag :
5c71cd ¤   ¤   ¤   DragWindow( window, eventPtr->where, &qd.screenBits.bounds );
04cdcb ¤   ¤   ¤   break;
979371 ¤   }
08efe6 }
6aaf5a
93af5a
be1c5d /****************** HandleMenuChoice ***********************/
a0af5a
25e5ce void¤   HandleMenuChoice( long menuChoice )
7ebb36 {
70cc3b ¤   short¤  menu;
b2e0d1 ¤   short¤  item;
e667c5 ¤
fd529b ¤   if ( menuChoice != 0 )
64c7a1 ¤   {
885da5 ¤   ¤   menu = HiWord( menuChoice );
6473ce ¤   ¤   item = LoWord( menuChoice );
251b52 ¤   ¤
6f2dab ¤   ¤   switch ( menu )
f85b34 ¤   ¤   {
e26528 ¤   ¤   ¤   case mApple:
b8b968 ¤   ¤   ¤   ¤   HandleAppleChoice( item );
2af622 ¤   ¤   ¤   ¤   break;
af4ece ¤   ¤   ¤   case mFile:
43898d ¤   ¤   ¤   ¤   HandleFileChoice( item );
8cf622 ¤   ¤   ¤   ¤   break;
230fe4 ¤   ¤   }
b7219f ¤   ¤   HiliteMenu( 0 );
e99371 ¤   }
47efe6 }
afaf5a
25af5a
750b38 /****************** HandleAppleChoice ***********************/
1faf5a
bbf690 void¤   HandleAppleChoice( short item )
47bb36 {
2b21ae ¤   MenuHandle¤ appleMenu;
ca9178 ¤   Str255¤ ¤   accName;
538c6e ¤   short¤  ¤   accNumber;
c667c5 ¤
a51f27 ¤   switch ( item )
3fc7a1 ¤   {
dbb3f6 ¤   ¤   case iAbout:
7b502c ¤   ¤   ¤   NoteAlert( kAboutALRTid, kNullPtr );
00cdcb ¤   ¤   ¤   break;
cb9ae3 ¤   ¤   default:
2e87ed ¤   ¤   ¤   appleMenu = GetMHandle( mApple );
138612 ¤   ¤   ¤   GetItem( appleMenu, item, accName );
839b17 ¤   ¤   ¤   accNumber = OpenDeskAcc( accName );
b1cdcb ¤   ¤   ¤   break;
4f9371 ¤   }
f2efe6 }
5daf5a
caaf5a
6d7252 /****************** HandleFileChoice ***********************/
3aaf5a
46be8c void¤   HandleFileChoice( short item )
cfbb36 {
--7eea 00024a9482140120079 Page 14 of emsdrive.c
e91f27 ¤   switch ( item )
f7c7a1 ¤   {
397743 ¤   ¤   case iQuit:
c68820 ¤   ¤   ¤   gDone = true;
a8cdcb ¤   ¤   ¤   break;
cf87c7 ¤   ¤   ¤
539371 ¤   }
e0efe6 }
fcaf5a
1daf5a
76af5a
b63353 /******************************** EventLoop *********/
23af5a
c13fd8 void¤   EventLoop( void )
5ec45d {¤  ¤
578e3d ¤   EventRecord¤¤   event;
f067c5 ¤
39cafa ¤   gDone = false;
cdc450 ¤   while ( gDone == false )
6bc7a1 ¤   {
70398f ¤   ¤   WaitNextEvent( everyEvent, &event, 30, NULL );
3ad14d ¤   ¤   DoEvent(event );
329371 ¤   }
c9efe6 }
4baf5a
c8af5a
ce315f /***************** DoMimeDlog ********************/
50af5a
908650 void¤   DoMimeDlog( void )
0abb36 {
3d1086 ¤   DialogPtr¤  ¤   dlog;
333a69 ¤   GrafPtr¤¤   ¤   savePort;
c0787e ¤   Boolean¤¤   ¤   done = FALSE;
402fcc ¤   short¤  ¤   ¤   itemHit;
dd67c5 ¤
dd9b69 ¤   dlog = GetNewDialog( kMimeDlogID, kNullPtr, kMoveToFront );¤
a6bfe2 ¤   SetupMimeDialog( dlog );
16c418 ¤   if ( dlog != NULL )
c9c7a1 ¤   {
687e66 ¤   ¤   GetPort( &savePort );
69f533 ¤   ¤   SetPort( dlog );
0fca29 ¤   ¤   SetWindowFont(dlog, geneva, 9, 0, srcCopy);
2e6f95 ¤   ¤   ShowWindow( dlog );
3c1b52 ¤   ¤
42062b ¤   ¤   while ( !done ) {
3d8592 ¤   ¤   ¤   ModalDialog( kNullPtr, &itemHit );
e55c82 ¤   ¤   ¤   switch (itemHit) {
6e5b7e ¤   ¤   ¤   ¤   case kOK:
217014 ¤   ¤   ¤   ¤   ¤   done = TRUE;
03418e ¤   ¤   ¤   ¤   ¤   SaveMimeSettingsToFile( dlog );
77cd27 ¤   ¤   ¤   ¤   ¤   free_mime_type( gMimeTypeH );
a5e8b5 ¤   ¤   ¤   ¤   ¤   BuildNewMimeData();
b414c3 ¤   ¤   ¤   ¤   ¤   break;
ddfc3b ¤   ¤   ¤   ¤   case kCancel:
3d7014 ¤   ¤   ¤   ¤   ¤   done = TRUE;
2e14c3 ¤   ¤   ¤   ¤   ¤   break;
e271a6 ¤   ¤   ¤   ¤   case kFactorySettings:
b73802 ¤   ¤   ¤   ¤   ¤   RestoreMimeDefaults( dlog );
9e14c3 ¤   ¤   ¤   ¤   ¤   break;
3c6ab9 ¤   ¤   ¤   ¤   default:
0114c3 ¤   ¤   ¤   ¤   ¤   break;
c6a3a6 ¤   ¤   ¤   }
fb0fe4 ¤   ¤   }
7c67c5 ¤
3f2d55 ¤   ¤   // clean up
087a4e ¤   ¤   DisposeDialog(dlog);
677612 ¤   ¤   SetPort(savePort);
cd9371 ¤   }
e3efe6 }
9aaf5a
1d31cf /***************** RestoreMimeDefaults ********************/
24af5a
--37f8 00030416b7440120079 Page 15 of emsdrive.c
fba83b void¤   RestoreMimeDefaults( DialogPtr dlog )
b3ef43 {¤  short¤  ¤   ¤   itemType, cnt;
c138c0 ¤   Handle¤ ¤   ¤   itemH;
fbb2cc ¤   Rect¤   ¤   ¤   itemRect;
f6e301 ¤   StringHandle¤   textStrH;
f3af5a
3d6fc9 ¤   UseResFile(gOurResRefNum);
5cae4a ¤   for( cnt = 0; cnt < 4; cnt++) {
a82d50 ¤   ¤   textStrH = (StringHandle)GetString(KMimeDefStrBaseID+cnt);
7b3f8c ¤   ¤   GetDialogItem(dlog, kBaseMimeItem+cnt, &itemType, &itemH, &itemRect);
53f32a ¤   ¤   if ( itemH != NULL ) {
0f6ff5 ¤   ¤   ¤   HLock( (Handle)textStrH );
7fa109 ¤   ¤   ¤   SetDialogItemText( itemH, *textStrH );
8b979b ¤   ¤   ¤   HUnlock( (Handle)textStrH );
060fe4 ¤   ¤   }
cf9371 ¤   }
36cd2f ¤   for( cnt = 4; cnt < 14; cnt++) {
dd3f8c ¤   ¤   GetDialogItem(dlog, kBaseMimeItem+cnt, &itemType, &itemH, &itemRect);
f9f32a ¤   ¤   if ( itemH != NULL ) {
8c6ff5 ¤   ¤   ¤   HLock( (Handle)textStrH );
bde22a ¤   ¤   ¤   SetDialogItemText( itemH, "\p" );
ef979b ¤   ¤   ¤   HUnlock( (Handle)textStrH );
2b0fe4 ¤   ¤   }
c89371 ¤   }
f4efe6 }
f1af5a
1baf5a
55c77e /***************** SaveMimeSettingsToFile ********************/
79af5a
667a54 void¤   SaveMimeSettingsToFile( DialogPtr dlog )
61ef43 {¤  short¤  ¤   ¤   itemType, cnt;
ffccfc ¤   Handle¤ ¤   ¤   itemH, resH;
40b2cc ¤   Rect¤   ¤   ¤   itemRect;
2c85ae ¤   Str255¤ ¤   ¤   textStr;
7eaf5a
926fc9 ¤   UseResFile(gOurResRefNum);
6b7879 ¤   for( cnt = 0; cnt < 14; cnt++) {
b33f8c ¤   ¤   GetDialogItem(dlog, kBaseMimeItem+cnt, &itemType, &itemH, &itemRect);
9dbf9e ¤   ¤   GetDialogItemText( itemH, textStr );
341b52 ¤   ¤
01a762 ¤   ¤   resH = Get1Resource ('STR ', kMimeStrBaseID+cnt);
23ce39 ¤   ¤   if ( resH != NULL ) {
2b9bf0 ¤   ¤   ¤   LoadResource(resH);
f3e825 ¤   ¤   ¤   SetString((StringHandle)resH, textStr);
244a31 ¤   ¤   ¤   ChangedResource(resH);
e7fc54 ¤   ¤   ¤   WriteResource(resH);
9d0cb3 ¤   ¤   ¤   ReleaseResource(resH);
050fe4 ¤   ¤   }
e39371 ¤   }
da176f ¤   UpdateResFile(gOurResRefNum);
3befe6 }
4caf5a
72af5a
dfb72b /***************** SetupMimeDialog ********************/
46af5a
2f979c void¤   SetupMimeDialog( DialogPtr dlog )
4aef43 {¤  short¤  ¤   ¤   itemType, cnt;
6938c0 ¤   Handle¤ ¤   ¤   itemH;
20b2cc ¤   Rect¤   ¤   ¤   itemRect;
26e301 ¤   StringHandle¤   textStrH;
bfaf5a
fa6fc9 ¤   UseResFile(gOurResRefNum);
4c7879 ¤   for( cnt = 0; cnt < 14; cnt++) {
17c9d6 ¤   ¤   textStrH = GetString(kMimeStrBaseID+cnt);
c05483 ¤   ¤   if ( textStrH != NULL ) {
007caa ¤   ¤   ¤   GetDialogItem(dlog,
899f1c ¤   ¤   ¤   ¤   kBaseMimeItem+cnt, &itemType, &itemH, &itemRect);
d67f55 ¤   ¤   ¤   if ( itemH != NULL ) {
fb61b9 ¤   ¤   ¤   ¤   HLock( (Handle)textStrH );
beb02e ¤   ¤   ¤   ¤   SetDialogItemText( itemH, *textStrH );
a49123 ¤   ¤   ¤   ¤   HUnlock( (Handle)textStrH );
30a3a6 ¤   ¤   ¤   }
--38a1 0007fa5aaea40120079 Page 16 of emsdrive.c
794387 ¤   ¤   ¤   ReleaseResource( (Handle)textStrH);
370fe4 ¤   ¤   }
599371 ¤   }
d3efe6 }
06af5a
4aaf5a
971d2d /***************** BuildNewMimeData ********************/
22af5a
d21c61 void¤   BuildNewMimeData()
30fe7c {¤  short¤  ¤   ¤   cnt;
4ddbae ¤   StringHandle¤   typeStrH, subtypeStrH, nameStrH, valueStrH;
d967c5 ¤
036fc9 ¤   UseResFile(gOurResRefNum);
a8af5a
e2c6e3 ¤   /* Read Mime strings from resource fork. */
631dd2 ¤   typeStrH = GetString(kMimeStrBaseID);
160767 ¤   subtypeStrH = GetString(kMimeStrBaseID+1);
f9cde3 ¤   if ( (typeStrH != NULL ) && (subtypeStrH != NULL ) ) {
e14d05 ¤   ¤   HLock( (Handle)typeStrH ·);
3d2ca6 ¤   ¤   HLock( (Handle)subtypeStrH ·);
203c60 ¤   ¤   gMimeTypeH = make_mime_type(*typeStrH, *subtypeStrH, NULL);
ea5902 ¤   ¤   HUnlock( (Handle)subtypeStrH ·);
0c3e3e ¤   ¤   HUnlock( (Handle)typeStrH ·);
d79371 ¤   }
2caf5a
53ed89 ¤   if ( gMimeTypeH != NULL ) {
9d099d ¤   ¤   /* Loop for six parameters in dialog. */
9fee4a ¤   ¤   for( cnt = 0; cnt < 5; cnt++) {
0d80fb ¤   ¤   ¤   nameStrH = GetString(kMimeStrBaseID+2+(cnt*2));
0ea049 ¤   ¤   ¤   valueStrH = GetString(kMimeStrBaseID+3+(cnt*2));
16cdcf ¤   ¤   ¤   if ( (nameStrH != NULL)¤&& (valueStrH != NULL) ) {
7c968c ¤   ¤   ¤   ¤   HLock( (Handle) nameStrH);
52e306 ¤   ¤   ¤   ¤   HLock( (Handle) valueStrH);
bd8bb8 ¤   ¤   ¤   ¤   if ( ((*nameStrH)[0] != 0) || ((*valueStrH)[0] != 0) )
f044c1 ¤   ¤   ¤   ¤   ¤   add_mime_parameter(gMimeTypeH,
1cf449 ¤   ¤   ¤   ¤   ¤   ¤   *nameStrH, *valueStrH);¤¤   ¤   ¤
296616 ¤   ¤   ¤   ¤   HUnlock( (Handle) nameStrH);
04d825 ¤   ¤   ¤   ¤   HUnlock( (Handle) valueStrH);
e154dc ¤   ¤   ¤   ¤   ReleaseResource( (Handle)nameStrH);
05b141 ¤   ¤   ¤   ¤   ReleaseResource( (Handle)valueStrH);
76a3a6 ¤   ¤   ¤   }
b20fe4 ¤   ¤   }
4f9371 ¤   }
deefe6 }
43af5a
61af5a
d9303f /***************** DoAddressDlog ********************/
17af5a
f8e0c2 void¤   DoAddressDlog( void )
7abb36 {
e81086 ¤   DialogPtr¤  ¤   dlog;
7c3a69 ¤   GrafPtr¤¤   ¤   savePort;
6d787e ¤   Boolean¤¤   ¤   done = FALSE;
b02fcc ¤   short¤  ¤   ¤   itemHit;
4267c5 ¤
b98983 ¤   dlog = GetNewDialog( kAddressDlogID, kNullPtr, kMoveToFront );¤
b3398e ¤   SetupAddressDialog( dlog );
16c418 ¤   if ( dlog != NULL )
04c7a1 ¤   {
487e66 ¤   ¤   GetPort( &savePort );
95f533 ¤   ¤   SetPort( dlog );
d0ca29 ¤   ¤   SetWindowFont(dlog, geneva, 9, 0, srcCopy);
e26f95 ¤   ¤   ShowWindow( dlog );
ae1b52 ¤   ¤
ab062b ¤   ¤   while ( !done ) {
d48592 ¤   ¤   ¤   ModalDialog( kNullPtr, &itemHit );
c05c82 ¤   ¤   ¤   switch (itemHit) {
695b7e ¤   ¤   ¤   ¤   case kOK:
2f7014 ¤   ¤   ¤   ¤   ¤   done = TRUE;
064f7d ¤   ¤   ¤   ¤   ¤   SaveAddressSettingsToFile( dlog );
358694 ¤   ¤   ¤   ¤   ¤   GetAddressChanges( dlog );
7f14c3 ¤   ¤   ¤   ¤   ¤   break;
--5cf0 000df33a36640120079 Page 17 of emsdrive.c
91fc3b ¤   ¤   ¤   ¤   case kCancel:
647014 ¤   ¤   ¤   ¤   ¤   done = TRUE;
8614c3 ¤   ¤   ¤   ¤   ¤   break;
ea71a6 ¤   ¤   ¤   ¤   case kFactorySettings:
bdb8c1 ¤   ¤   ¤   ¤   ¤   RestoreAddressDefaults( dlog );
6714c3 ¤   ¤   ¤   ¤   ¤   break;
916ab9 ¤   ¤   ¤   ¤   default:
8b14c3 ¤   ¤   ¤   ¤   ¤   break;
32a3a6 ¤   ¤   ¤   }
b90fe4 ¤   ¤   }
b967c5 ¤
552d55 ¤   ¤   // clean up
d57a4e ¤   ¤   DisposeDialog(dlog);
bf7612 ¤   ¤   SetPort(savePort);
979371 ¤   }
76efe6 }
26af5a
ceaf5a
32d975 /***************** RestoreAddressDefaults ********************/
12af5a
c6e587 void¤   RestoreAddressDefaults( DialogPtr dlog )
c5ef43 {¤  short¤  ¤   ¤   itemType, cnt;
5a38c0 ¤   Handle¤ ¤   ¤   itemH;
a0b2cc ¤   Rect¤   ¤   ¤   itemRect;
82e301 ¤   StringHandle¤   textStrH;
edaf5a
246fc9 ¤   UseResFile(gOurResRefNum);
a62cd2 ¤   for( cnt = 0; cnt < 3; cnt++) {
f4b93c ¤   ¤   textStrH = (StringHandle)GetString(KAddDefStrBaseID+cnt);
f3c3d7 ¤   ¤   GetDialogItem(dlog, kBaseAddressItem+cnt, &itemType, &itemH, &itemRect);
baf32a ¤   ¤   if ( itemH != NULL ) {
246ff5 ¤   ¤   ¤   HLock( (Handle)textStrH );
eea109 ¤   ¤   ¤   SetDialogItemText( itemH, *textStrH );
65979b ¤   ¤   ¤   HUnlock( (Handle)textStrH );
dc0fe4 ¤   ¤   }
619371 ¤   }
047d31 ¤   for( cnt = 3; cnt < 9; cnt++) {
a3c3d7 ¤   ¤   GetDialogItem(dlog, kBaseAddressItem+cnt, &itemType, &itemH, &itemRect);
53f32a ¤   ¤   if ( itemH != NULL ) {
cc6ff5 ¤   ¤   ¤   HLock( (Handle)textStrH );
60e22a ¤   ¤   ¤   SetDialogItemText( itemH, "\p" );
d9979b ¤   ¤   ¤   HUnlock( (Handle)textStrH );
8a0fe4 ¤   ¤   }
b69371 ¤   }
82efe6 }
5caf5a
67af5a
294709 /***************** SaveAddressSettingsToFile ********************/
45af5a
8783ed void¤   SaveAddressSettingsToFile( DialogPtr dlog )
a9ef43 {¤  short¤  ¤   ¤   itemType, cnt;
d8ccfc ¤   Handle¤ ¤   ¤   itemH, resH;
d9b2cc ¤   Rect¤   ¤   ¤   itemRect;
b085ae ¤   Str255¤ ¤   ¤   textStr;
22af5a
9a6fc9 ¤   UseResFile(gOurResRefNum);
052485 ¤   for( cnt = 0; cnt < 9; cnt++) {
95c3d7 ¤   ¤   GetDialogItem(dlog, kBaseAddressItem+cnt, &itemType, &itemH, &itemRect);
4fbf9e ¤   ¤   GetDialogItemText( itemH, textStr );
ff1b52 ¤   ¤
e48701 ¤   ¤   resH = Get1Resource ('STR ', kAddressStrBaseID+cnt);
a6ce39 ¤   ¤   if ( resH != NULL ) {
919bf0 ¤   ¤   ¤   LoadResource(resH);
7ce825 ¤   ¤   ¤   SetString((StringHandle)resH, textStr);
1b4a31 ¤   ¤   ¤   ChangedResource(resH);
8efc54 ¤   ¤   ¤   WriteResource(resH);
bf0cb3 ¤   ¤   ¤   ReleaseResource(resH);
cd0fe4 ¤   ¤   }
7e9371 ¤   }
39176f ¤   UpdateResFile(gOurResRefNum);
53efe6 }
dfaf5a
--fcd1 00016586dbe40120079 Page 18 of emsdrive.c
e0af5a
5c20e2 /***************** SetupAddressDialog ********************/
4caf5a
8389c4 void¤   SetupAddressDialog( DialogPtr dlog )
b3ef43 {¤  short¤  ¤   ¤   itemType, cnt;
8b38c0 ¤   Handle¤ ¤   ¤   itemH;
0db2cc ¤   Rect¤   ¤   ¤   itemRect;
35e301 ¤   StringHandle¤   textStrH;
d1af5a
ef6fc9 ¤   UseResFile(gOurResRefNum);
18af5a
3e2485 ¤   for( cnt = 0; cnt < 9; cnt++) {
c09167 ¤   ¤   textStrH = GetString(kAddressStrBaseID+cnt);
655483 ¤   ¤   if ( textStrH != NULL ) {
427caa ¤   ¤   ¤   GetDialogItem(dlog,
f8e551 ¤   ¤   ¤   ¤   kBaseAddressItem+cnt, &itemType, &itemH, &itemRect);
e47f55 ¤   ¤   ¤   if ( itemH != NULL ) {
dd61b9 ¤   ¤   ¤   ¤   HLock( (Handle)textStrH );
5fb02e ¤   ¤   ¤   ¤   SetDialogItemText( itemH, *textStrH );
f69123 ¤   ¤   ¤   ¤   HUnlock( (Handle)textStrH );
1ba3a6 ¤   ¤   ¤   }
f44387 ¤   ¤   ¤   ReleaseResource( (Handle)textStrH);
150fe4 ¤   ¤   }
bb9371 ¤   }
b5efe6 }
66af5a
3daf5a
0f08fc /***************** GetAddressChanges ********************/
1daf5a
2cac1b void¤   GetAddressChanges( DialogPtr dlog )
40ef43 {¤  short¤  ¤   ¤   itemType, cnt;
7938c0 ¤   Handle¤ ¤   ¤   itemH;
4ab2cc ¤   Rect¤   ¤   ¤   itemRect;
bb85ae ¤   Str255¤ ¤   ¤   textStr;
0a67c5 ¤
476fc9 ¤   UseResFile(gOurResRefNum);
a42485 ¤   for( cnt = 0; cnt < 9; cnt++) {
98d1f4 ¤   ¤   GetDialogItem(dlog,
ac6f14 ¤   ¤   ¤   kBaseAddressItem+cnt, &itemType, &itemH, &itemRect);
f0f32a ¤   ¤   if ( itemH != NULL ) {
06ed03 ¤   ¤   ¤   GetDialogItemText( itemH, textStr );
da2256 ¤   ¤   ¤   HLock( (Handle)gAddressesH );
98da55 ¤   ¤   ¤   HLock( (Handle)(*gAddressesH)[cnt] );
338435 ¤   ¤   ¤   if ( (*gAddressesH)[cnt] != NULL )
75a35b ¤   ¤   ¤   ¤   SetString( (StringHandle)(*gAddressesH)[cnt], textStr );
745844 ¤   ¤   ¤   HUnlock( (Handle)(*gAddressesH)[cnt] );
b285c8 ¤   ¤   ¤   HUnlock( (Handle)gAddressesH );
5f0fe4 ¤   ¤   }
73f828 ¤   }¤
71efe6 }
a1af5a
28af5a
366f70 /***************** InitAddressData ********************/
c7af5a
337767 void¤   InitAddressData()
32fe7c {¤  short¤  ¤   ¤   cnt;
679329 ¤   Handle¤ ¤   ¤   resH;
68af5a
bace08 ¤   gAddressesH = (Handle**)NewHandle(10 * sizeof(Handle));
1a67c5 ¤
68f1cb ¤   HLock( (Handle)gAddressesH );
786fc9 ¤   UseResFile(gOurResRefNum);
972485 ¤   for( cnt = 0; cnt < 9; cnt++) {
a28701 ¤   ¤   resH = Get1Resource ('STR ', kAddressStrBaseID+cnt);
f3ce39 ¤   ¤   if ( resH != NULL ) {
4b8161 ¤   ¤   ¤   HLock( resH );
6e7768 ¤   ¤   ¤   (*gAddressesH)[cnt] = (Handle)NewString( (const uchar *)*resH );
3e1c42 ¤   ¤   ¤   HUnlock( resH );
6a0cb3 ¤   ¤   ¤   ReleaseResource(resH);
990fe4 ¤   ¤   }
5d9371 ¤   }
16396e ¤   (*gAddressesH)[cnt] = kNullPtr;
--ab33 000597b53fc40120079 Page 19 of emsdrive.c
bac8fb ¤   HUnlock( (Handle)gAddressesH );
bbefe6 }
77af5a
cbaf5a
9b0ba2 /***************** DoContextDlog ********************/
b1af5a
28ce80 void¤   DoContextDlog( void )
99bb36 {
011086 ¤   DialogPtr¤  ¤   dlog;
023a69 ¤   GrafPtr¤¤   ¤   savePort;
fd787e ¤   Boolean¤¤   ¤   done = FALSE;
012fcc ¤   short¤  ¤   ¤   itemHit;
06cf5d ¤   Handle¤ ¤   ¤   theControlH;
38b2cc ¤   Rect¤   ¤   ¤   itemRect;
e52a7f ¤   short¤  ¤   ¤   itemType;
b91b52 ¤   ¤
d3030c ¤   dlog = GetNewDialog( kContextDlogID, kNullPtr, kMoveToFront );¤
08c418 ¤   if ( dlog != NULL )
51c7a1 ¤   {
467e66 ¤   ¤   GetPort( &savePort );
92f533 ¤   ¤   SetPort( dlog );
62b518 //¤ ¤   SetWindowFont(dlog, geneva, 9, 0, srcCopy);
1baf5a
491ef4 ¤   ¤   TurnOffAllRadials( dlog );
181b52 ¤   ¤
78bae6 ¤   ¤   /* Set radial for current value. */
ff8ded ¤   switch ( gContext ) {
8f5119 ¤   case EMSF_ON_ARRIVAL:
2cd1f4 ¤   ¤   GetDialogItem(dlog,
d8eeb1 ¤   ¤   ¤   kOnArrival, &itemType, &theControlH, &itemRect);¤
42cab1 ¤   ¤   SetControlValue((ControlHandle)theControlH, true);
4d2f68 ¤   ¤   break;
1d63c3 ¤   case EMSF_ON_DISPLAY:
46d1f4 ¤   ¤   GetDialogItem(dlog,
8e73d0 ¤   ¤   ¤   kOnDisplay, &itemType, &theControlH, &itemRect);¤
ebcab1 ¤   ¤   SetControlValue((ControlHandle)theControlH, true);
1e2f68 ¤   ¤   break;
7c74da ¤   case EMSF_ON_REQUEST:
63d1f4 ¤   ¤   GetDialogItem(dlog,
e499c2 ¤   ¤   ¤   kOnRequest, &itemType, &theControlH, &itemRect);¤
10cab1 ¤   ¤   SetControlValue((ControlHandle)theControlH, true);
022f68 ¤   ¤   break;
a33fdd ¤   case EMSF_Q4_COMPLETION:
43d1f4 ¤   ¤   GetDialogItem(dlog,
44e439 ¤   ¤   ¤   kQ4Completion, &itemType, &theControlH, &itemRect);¤
2bcab1 ¤   ¤   SetControlValue((ControlHandle)theControlH, true);
da2f68 ¤   ¤   break;
0498ae ¤   case EMSF_Q4_TRANSMISSION:
67d1f4 ¤   ¤   GetDialogItem(dlog,
1d61f1 ¤   ¤   ¤   kQ4Transmission, &itemType, &theControlH, &itemRect);¤
2acab1 ¤   ¤   SetControlValue((ControlHandle)theControlH, true);
722f68 ¤   ¤   break;
2e2f72 ¤   default:
df2f68 ¤   ¤   break;
760fe4 ¤   ¤   }
c0af5a
246f95 ¤   ¤   ShowWindow( dlog );
18062b ¤   ¤   while ( !done ) {
d51a46 ¤   ModalDialog( kNullPtr, &itemHit );
3eaa4b ¤   switch (itemHit) {
1423e4 ¤   case kOK:
6c4ece ¤   ¤   done = TRUE;
fb2f68 ¤   ¤   break;
cd8840 ¤   case kCancel:
d94ece ¤   ¤   done = TRUE;
972f68 ¤   ¤   break;
297d5c ¤   case kOnArrival:
091ef4 ¤   ¤   TurnOffAllRadials( dlog );
a3d1f4 ¤   ¤   GetDialogItem(dlog,
e2eeb1 ¤   ¤   ¤   kOnArrival, &itemType, &theControlH, &itemRect);¤
b1cab1 ¤   ¤   SetControlValue((ControlHandle)theControlH, true);
59942f ¤   ¤   gContext = EMSF_ON_ARRIVAL;
--c1cb 0008207f85840120079 Page 20 of emsdrive.c
4f2f68 ¤   ¤   break;
f34f86 ¤   case kOnDisplay:
ee1ef4 ¤   ¤   TurnOffAllRadials( dlog );
fad1f4 ¤   ¤   GetDialogItem(dlog,
2573d0 ¤   ¤   ¤   kOnDisplay, &itemType, &theControlH, &itemRect);¤
17cab1 ¤   ¤   SetControlValue((ControlHandle)theControlH, true);
35a6f5 ¤   ¤   gContext = EMSF_ON_DISPLAY;
2d2f68 ¤   ¤   break;
dc589f ¤   case kOnRequest:
9b1ef4 ¤   ¤   TurnOffAllRadials( dlog );
17d1f4 ¤   ¤   GetDialogItem(dlog,
4899c2 ¤   ¤   ¤   kOnRequest, &itemType, &theControlH, &itemRect);¤
e3cab1 ¤   ¤   SetControlValue((ControlHandle)theControlH, true);
13b1ec ¤   ¤   gContext = EMSF_ON_REQUEST;
632f68 ¤   ¤   break;
d427dd ¤   case kQ4Completion:
1e1ef4 ¤   ¤   TurnOffAllRadials( dlog );
94d1f4 ¤   ¤   GetDialogItem(dlog,
6ee439 ¤   ¤   ¤   kQ4Completion, &itemType, &theControlH, &itemRect);¤
80cab1 ¤   ¤   SetControlValue((ControlHandle)theControlH, true);
20c924 ¤   ¤   gContext = EMSF_Q4_COMPLETION;
aa2f68 ¤   ¤   break;
e8880f ¤   case kQ4Transmission:
871ef4 ¤   ¤   TurnOffAllRadials( dlog );
0cd1f4 ¤   ¤   GetDialogItem(dlog,
d061f1 ¤   ¤   ¤   kQ4Transmission, &itemType, &theControlH, &itemRect);¤
c2cab1 ¤   ¤   SetControlValue((ControlHandle)theControlH, true);
38a464 ¤   ¤   gContext = EMSF_Q4_TRANSMISSION;
0b2f68 ¤   ¤   break;
062f72 ¤   default:
042f68 ¤   ¤   break;
a20fe4 ¤   ¤   }
840fe4 ¤   ¤   }
8a67c5 ¤
622d55 ¤   ¤   // clean up
987a4e ¤   ¤   DisposeDialog(dlog);
8b7612 ¤   ¤   SetPort(savePort);
ad9371 ¤   }
ddefe6 }
43af5a
b2af5a
f92343 /***************** TurnOffAllRadials ********************/
50af5a
60dbda void¤   TurnOffAllRadials( DialogPtr dlog )
a9b697 {¤  Handle¤ ¤   theControlH;
bfe835 Rect¤   ¤   itemRect;
1f1b0c short¤  ¤   itemType;
1caf5a
589dc4 GetDialogItem(dlog, kOnArrival, &itemType, &theControlH, &itemRect);¤
056a16 SetControlValue((ControlHandle)theControlH, false);
75af5a
2300a5 GetDialogItem(dlog, kOnDisplay, &itemType, &theControlH, &itemRect);¤
f86a16 SetControlValue((ControlHandle)theControlH, false);
74af5a
e4eab7 GetDialogItem(dlog, kOnRequest, &itemType, &theControlH, &itemRect);¤
0f6a16 SetControlValue((ControlHandle)theControlH, false);
4daf5a
0c87f0 GetDialogItem(dlog, kQ4Completion, &itemType, &theControlH, &itemRect);¤
c26a16 SetControlValue((ControlHandle)theControlH, false);
87af5a
532dde GetDialogItem(dlog, kQ4Transmission, &itemType, &theControlH, &itemRect);¤
5d6a16 SetControlValue((ControlHandle)theControlH, false);
27efe6 }
dcaf5a
52af5a
5b60f1 /***************** DoMessage ********************/
8eaf5a
5f4a48 void¤   DoMessage( Str255 errorString )
9cbb36 {
eb4fb4 ¤   ParamText( errorString, "\p", "\p", "\p" );
2e67c5 ¤
827efe ¤   NoteAlert( kErrorALRTid, nil );
--be38 00034acd3e640120079 Page 21 of emsdrive.c
7aefe6 }
46af5a
8eaf5a
44432a /***************** DoError ********************/
9eaf5a
57df46 void¤   DoError( Str255 errorString )
c7bb36 {
3f4fb4 ¤   ParamText( errorString, "\p", "\p", "\p" );
e067c5 ¤
31c3d1 ¤   StopAlert( kErrorALRTid, nil );
2167c5 ¤
b9ebf8 ¤   ExitToShell();
27efe6 }
aaaf5a
75af5a
ffc6b8 /****************** MenuBarInit ***********************/
ecaf5a
03a1c1 void¤   MenuBarInit( void )
4fbb36 {
cd7973 ¤   Handle¤ ¤   ¤   menuBar;
1a194d ¤   MenuHandle¤ ¤   menu;
fe67c5 ¤
6767cd ¤   menuBar = GetNewMBar( kBaseResID );
cf67c5 ¤
83db18 ¤   if ( menuBar == NULL )
d6f4a7 ¤   ¤   DoError( "\pCouldn't load the MBAR resource..." );
9e67c5 ¤
9c31f3 ¤   SetMenuBar( menuBar );
6caf5a
31a849 ¤   menu = GetMHandle( mApple );
6daeeb ¤   AddResMenu( menu, 'DRVR' );
4967c5 ¤
e6129c ¤   DrawMenuBar();
d1efe6 }
aaaf5a
4daf5a
f1ee30 /****************** SetWindowFont ***********************/
8faf5a
caaf68 void SetWindowFont(DialogPtr dlog, short fontNum, short fontSize, Style
5cbe81 fontStyle, short fontMode)
84bb36 {
a51606 ¤   FontInfo¤   fInfo;
84fb29 ¤   GrafPtr¤¤   savePort;
7e67c5 ¤
d08daa ¤   GetPort(&savePort);
2ea41a ¤   SetPort(dlog);
3b67c5 ¤
b7d17d ¤   TextFont(fontNum);
9c757c ····TextSize(fontSize);
1b7d25 ····TextFace(fontStyle);
b6c9bd ····TextMode(fontMode);
1d3967 ···¤
c4f05f ···¤GetFontInfo(&fInfo);
3caf5a
36d268 ····(*((DialogPeek)dlog)->textH)->fontAscent = fInfo.ascent;
7c8148 ····(*((DialogPeek)dlog)->textH)->lineHeight =
347751 ····¤   fInfo.ascent + fInfo.descent + fInfo.leading;
0cdb33 ····(*((DialogPeek)dlog)->textH)->txFont = fontNum;
233ea6 ····(*((DialogPeek)dlog)->textH)->txFace = fontStyle;
55449f ····(*((DialogPeek)dlog)->textH)->txMode = fontMode;
17f665 ····(*((DialogPeek)dlog)->textH)->txSize = fontSize;
9caf5a
cb9b00 ····SetPort(savePort);
76efe6 }
d3af5a
e2af5a
efd921 /****************** ToolboxInit ***********************/
4aaf5a
957218 void ToolboxInit()
96bb36 {
c2aa6d ¤   MaxApplZone();¤ ¤   ¤   ¤   /* grow the heap to its maximum size */
34af5a
--e3c6 0013ec79adb40120079 Page 22 of emsdrive.c
595220 ¤   InitGraf(&qd.thePort);¤ ··¤ /* init Quickdraw and global variables¤ ¤   */
7edf70 ¤   InitFonts();¤   ¤   ···¤¤   /* initialize font manager¤ ¤   ¤   ¤   ¤   */
d394f3 ¤   InitWindows();¤ ¤   ···¤¤   /* init window manager, setup WMgr GrafPort¤*/
e5fb32 ¤   InitMenus();¤   ¤   ¤   ¤   ··¤ ¤   ¤   ¤   /* initialize menu Manager¤ */
858295 ¤   TEInit();¤  ¤   ······¤ ¤   /* inititalize TextEdit¤¤   ¤   ¤   ¤   ¤   */
3f8ac6 ¤   InitDialogs(0L);¤   ¤   ¤   /* initialize Dialog manager¤   ¤   ¤   ¤   */
f5af5a
10a1c4 ¤   FlushEvents(everyEvent, 0);¤/* clear the Event queue of all events ¤¤   */
66b561 ¤   InitCursor();¤  ¤   ······¤ /* set the Cursor to arrow instead of clock¤*/
4eaf5a
34abaa } /* end of ToolboxInit */
35af5a
ee9df3 short callProgress(emsProgress glop, short percent)
1069f4 { ¤ DialogPtr¤  ¤   dlog;
323a69 ¤   GrafPtr¤¤   ¤   savePort;
5c787e ¤   Boolean¤¤   ¤   done = FALSE;
090c61 ¤   short¤  ¤   ¤   itemHit, returnValue;
36bc26 ¤   Str255¤ ¤   ¤   percentStr;
752a7f ¤   short¤  ¤   ¤   itemType;
ad38c0 ¤   Handle¤ ¤   ¤   itemH;
75b2cc ¤   Rect¤   ¤   ¤   itemRect;
95d5af #pragma unused(glop)
59e452 ¤   /* The translator should call this function periodically
3d3ccd ¤   ·* with the argument (0)
16395f ¤   ·* (just begun) and 100 (complete).
5acbf7 ¤   ·* The translator should check the return
19135c ¤   ·* value.
d7b7b8 ¤   ·* ¤¤   0 - continue translation
5fbc68 ¤   ·*¤ ¤   1 - abort translation
929714 ¤   ·*
25c577 ¤   ·* If you are supplying your own progress function, call this with -1
f1acd9 ¤   ·* to check for abort.
9ca4e3 ¤   ·*/
21af5a
8ed469 ··returnValue = 0;
73cc3e ¤   dlog = GetNewDialog( kProgressDlogID, kNullPtr, kMoveToFront );¤
ab100e ¤   if ( dlog != NULL ) {
2a7e66 ¤   ¤   GetPort( &savePort );
a0f533 ¤   ¤   SetPort( dlog );
a31b52 ¤   ¤
a6a9dc ¤   ¤   NumToString( percent, percentStr );
e9012a ¤   ¤   GetDialogItem(dlog, kPercentItem, &itemType, &itemH, &itemRect);
a130b2 ¤   ¤   if ( itemH != NULL )
7dbaf2 ¤   ¤   ¤   SetDialogItemText( itemH, percentStr );
d4af5a
376f95 ¤   ¤   ShowWindow( dlog );
6b062b ¤   ¤   while ( !done ) {
158592 ¤   ¤   ¤   ModalDialog( kNullPtr, &itemHit );
745c82 ¤   ¤   ¤   switch (itemHit) {
ac5b7e ¤   ¤   ¤   ¤   case kOK:
a87014 ¤   ¤   ¤   ¤   ¤   done = TRUE;
0a6fe4 ¤   ¤   ¤   ¤   ¤   returnValue = 0;
4114c3 ¤   ¤   ¤   ¤   ¤   break;
f8fc3b ¤   ¤   ¤   ¤   case kCancel:
567014 ¤   ¤   ¤   ¤   ¤   done = TRUE;
cd3538 ¤   ¤   ¤   ¤   ¤   returnValue = 1;
7714c3 ¤   ¤   ¤   ¤   ¤   break;
166ab9 ¤   ¤   ¤   ¤   default:
2d14c3 ¤   ¤   ¤   ¤   ¤   break;
c6a3a6 ¤   ¤   ¤   }
ec0fe4 ¤   ¤   }
aa2d55 ¤   ¤   // clean up
5c2718 ··¤ DisposeDialog(dlog);¤   ¤
8f298b ¤   ··SetPort(savePort);
5a9371 ¤   }
d4a764 ¤   return( returnValue );
51efe6 }
a9af5a
3eaf5a
--4ddf 0007194027d4012007a Page 1 of lglio.c
b114b9 /* ======================================================================
a7af5a
5829b3 ··LGL's little I/O functions for reading a file a line at a time
ffe8c6 ···
7cf2cd ···Last Edited: Apr 16, 1996
faaf5a
cc0b1b ···Laurence Lundblade <lgl@qualcomm.com>·
b4af5a
9f826f ···Copyright 1995, 1996 QUALCOMM Inc.
757fe0 */
98af5a
16f7d2 #include "lglio.h"
4daf5a
d91bff /* This mostly for reading text files with \r\n EOL,
c53b50 Hmm, what about binary MIME? */
42d6ed /* To do: distinguish read error from EOF */
5daf5a
885589 static long findEol(char *, long);
8aaf5a
4f592f /* ---------------------------------------------------
f5fe62 ··Args: io ·-- lglIO structure to fill in
1fdb20 ········Fsp -- Name of file to open
d5495d ·*/
9be576 OSErr lglOpen(lglIOHandle *io, FSSpec Fsp)
6fbb36 {
ebdfad ¤   OSErr err;
3c7ff1 ¤   short refNum;
e667c5 ¤
1b0d65 ¤   *io = (lglIOHandle)NewHandle(sizeof(struct lglIO));
aee22b ¤   err = FSpOpenDF(&Fsp, fsRdPerm, &refNum);
856ebc ¤   if(err) {
06dca3 ¤   ····DisposeHandle((Handle)*io);
c4be6e ¤   ····*io = NULL;
8a8676 ¤   ¤   return(err);
1f9371 ¤   }
2ce507 ····(**io)->refNum ····= refNum;
15ec27 ¤   (**io)->line ······= (**io)->buffer;
26af85 ¤   (**io)->eof ·······= 0; ·
7e6815 ¤   (**io)->bytesInBuf = 0;
27557d ¤   return(noErr);
e0efe6 }
5aaf5a
81af5a
b5592f /* ---------------------------------------------------
1e33e4 ··Args: io -- where to read from
53ad0b ········line -- place where pointer to read data is returned
384591 ········leng -- place where pointer to length is returned
0f508e ········
8b4dd8 ··Warning - io MUST BE LOCKED before calling
82495d ·*/
d12fd0 OSErr lglRead(lglIOHandle ioHandle, char **line, long *leng)
e3bb36 {
dbd1d4 ¤   long ·numRead, eol, numLeft;
0c86fe ¤   short err;
aff1e1 ¤   struct lglIO *io;
6167c5 ¤
963e2a ¤   io = *ioHandle; // This is locked before we got called
aa67c5 ¤
0fc0bf ¤   if(io->bytesInBuf != 0)
549c39 ¤   ¤   // Check to see if there's a line in the buffer
d84246 ¤   ¤   eol = findEol(io->line, io->bytesInBuf - (io->line - io->buffer));
a10e24 ¤   else
674f6c ¤   ¤   // No data in buffer, force a read
e6f370 ¤   ¤   eol = -1;
051b52 ¤   ¤
a070fe ¤   while(eol < 0 &&
893b24 ¤   ¤   io->bytesInBuf - (io->line - io->buffer) < kLglBSize && !io->eof)
85c7a1 ¤   {
efc7ac ¤   ¤   // Try to fill up the buffer
957dd0 ¤   ¤   numLeft = io->bytesInBuf == 0 ?
49c3eb ¤   ¤   ¤   ¤   0 ·: io->bytesInBuf - (io->line - io->buffer);
7101c0 ¤   ¤   BlockMove(io->line, io->buffer, numLeft);
--8f68 001d4bd8cfd4012007a Page 2 of lglio.c
0ebb4b ¤   ¤   numRead = kLglBSize - numLeft;
22f5f3 ¤   ¤   err = FSRead(io->refNum, &numRead, io->buffer + numLeft);
4d6b5a ¤   ····io->bytesInBuf = numRead + numLeft;
848e07 ¤   ¤   if(err)
bf5d56 ¤   ¤   ¤   io->eof =1;
d29f9e ¤   ¤   io->line = io->buffer;
c1923d ¤   ¤   // see if we can find a line in the buffer again
cf88e3 ··¤ ¤   eol = findEol(io->line, io->bytesInBuf - (io->line - io->buffer));
ff9371 ¤   }
0267c5 ¤
26c5b7 ¤   // Check for end of file
156bba ¤   if(io->eof && io->buffer + io->bytesInBuf <= io->line) {
69eabe ¤   ¤   return(-1);
6c6fe7 ····}
6b1b52 ¤   ¤
ef4c4a ¤   *line = io->line;
824494 ¤   if(eol > 0) {
0430eb ¤   ¤   // Return the full line of the buffer
9fd7dc ¤   ¤   *leng ···= eol;
b09ddf ¤   ¤   io->line = io->line + eol; // 2 skips \r\n
cff037 ¤   } else {
fd02f3 ¤   ¤   // No full line could be found, return what we've got
224c26 ¤   ¤   *leng ·········= io->bytesInBuf;
4ace84 ¤   ¤   io->line ······= io->buffer;
bf25c5 ¤   ¤   io->bytesInBuf = 0;
ec9371 ¤   }
d3557d ¤   return(noErr);
2befe6 }
5baf5a
60af5a
00d59c void lglClose(lglIOHandle ioHandle)
b5bb36 {
29bd76 ¤   if ( ioHandle != NULL ) {
d85e36 ¤   ¤   FSClose((*ioHandle)->refNum);
67141a ¤   ¤   HUnlock((Handle)ioHandle); // Be sure it's unlocked·
2f6a40 ¤   ¤   DisposeHandle((Handle)ioHandle);
32786d ¤   ¤   ioHandle = NULL;
b79371 ¤   }
27efe6 }
18af5a
1867c5 ¤
e5af5a
812e47 static long findEol(char *buffer, long length)
30bb36 {
e1d5fb ¤   char *p, *p_end;·
076d10 ¤   for(p = buffer, p_end = buffer + length; p < p_end; p++) ·
bdf298 ¤   ¤   if(*p == '\015' && p < p_end -1 && *(p+1) == '\012')
0b7b48 ¤   ¤   ¤   return(p - buffer + 2);
9d7dcd ¤   return(-1);
48efe6 }
d421e6 ¤   ¤   ¶
--e7d6 001f959e0184012007b Page 1 of lglio.h
ad2f7e /* ·======================================================================
ba5ce9 ··LGL's little IO package for reading files one line at a time
900b7b ··This one expects lines to end in \r\n. (Internet canonical)
cdde7b ··
27583d ·····
07f2cd ···Last Edited: Apr 16, 1996
6baf5a
310b1b ···Laurence Lundblade <lgl@qualcomm.com>·
10af5a
47826f ···Copyright 1995, 1996 QUALCOMM Inc.
40d83c ·
61de7b ··
df68a6 ··Usage:
afffa2 ····Open the file with lglOpen and get the Handle back
939365 ····Lock the handle you get back until you're done reading
4ed9ea ····Each call to lglRead returns a line. A pointer to the next line
3459b9 ······and its length is returned. ·The data is stored in the IO packages
821895 ······own buffer so you should copy it out. The lines are never null
0e6b78 ······null terminated. If the lines in the files longer than the
f579c7 ······the buffer then chunks of the file are returned a buffer at a
b24b2c ······time. ·You can tell if you got a line or not by checking to see
dc1ce5 ······if the last two characters fetched are \r\n.
5ec977 ····Close the file. This unlocks and Disposes of the Handle
467fe0 */
f9af5a
dc742a #define kLglBSize (8192)
c7af5a
a6af5a
5e3428 typedef struct lglIO {
2e20df ¤   short refNum, eof;
293802 ¤   char ·buffer[kLglBSize], *line;
c31a5e ¤   long ·bytesInBuf;
74aeec } **lglIOHandle;
ca67c5 ¤
e3ab8b OSErr lglOpen(lglIOHandle *, FSSpec);
32a053 OSErr lglRead(lglIOHandle, char **, long *);
f9184a void ·lglClose(lglIOHandle);¶
--90c8 0002581dcec4012007c Page 1 of mimetype.c
b114b9 /* ======================================================================
a7af5a
ba4ca5 ···Functions to manage MIME type data structures for use
8e2139 ·················with Eudora translation API on the Mac.
965886 ·················
215339 ···Last Edited: July 23, 1996
4ee8c6 ···
667cca ···Filename: mimetype.c
b1af5a
992ddf ···Laurence Lundblade <lgl@qualcomm.com>
fc93e7 ···Myra Callen <t_callen@qualcomm.com>
d1af5a
7c826f ···Copyright 1995, 1996 QUALCOMM Inc.
a5e8c6 ···
ad6529 ···Some of this code is from the "c-client" and is·
53618d ······Copyright University of Washington·
237fe0 */
efaf5a
314b15 #include <TextUtils.h>
b4af5a
7ffeb2 #include <stdio.h>
d7b1cb #include <ctype.h>
cd324c #include <string.h>
e748c9 #include "emsapi-mac.h"
46f10b #include "mimetype.h"
26abb7 #include "copycat.h"
106bd2 #include "rfc822.h"
afaf5a
6aaf5a
98af5a
0c0975 /* ----------------------------------------------------------------------
d8d82c ···Create a data structure to hold a MIME type. Add parameters later on with
b18819 ···calls to add_mime_parameter.
7de8c6 ···
dc5fcc ···Args: type -- the main MIME type: e.g., text, application, image
84db58 ·········sub_type -- the sub type: e.g., plain, octet-stream, jpeg
59f0e6 ·········mime_v -- the MIME verion number
4d486a ·········
b1a64d ···Returns: Handle for the emsMIMEtype data structure·
877fe0 */
485588 emsMIMEtype **make_mime_type(
a09e53 ConstStringPtr mime_type, ConstStringPtr sub_type, ConstStringPtr mime_v)
83bb36 {
d5cf25 ¤   emsMIMEtype *mType;
6cf565 ¤   Handle ·····mTypeHandle;
4daf5a
e95473 ····mTypeHandle = NewHandle(sizeof(emsMIMEtype));
08463f ····mType ······= (emsMIMEtype *)*mTypeHandle;
e76822 ····HLock(mTypeHandle);
17e480 ¤   BlockMoveData(mime_type, mType->mime_type, *mime_type + 1);
56d92c ¤   BlockMoveData(sub_type, ·mType->sub_type, ·*sub_type + 1);
74e849 ¤   if(mime_v != NULL)·
a79e15 ······BlockMoveData(mime_v, ·mType->mime_version, ·*mime_v + 1);
8bcea6 ····else·
7860ae ······BlockMoveData("\p1.0", mType->mime_version, 4);
81af5a
961ba5 ¤   mType->params = (emsMIMEparam **)NULL;·
b0b763 ¤   HUnlock(mTypeHandle); ··
b0e497 ····return((emsMIMEtype **)mTypeHandle);
eeefe6 }
5daf5a
44af5a
82af5a
f20975 /* ----------------------------------------------------------------------
37db81 ····Free a data structure holding a MIME type
be869e ····
53c417 ····Args: Handle for the emsMIMEtype to be freed
317fe0 */
1e859e void free_mime_type(emsMIMEtype **MIMEtypeHandle)
bdbb36 {
eed164 ····emsMIMEparam **paramHandle, **nextHandle;
25af5a
--fc89 000428299414012007c Page 2 of mimetype.c
3817b1 ¤   for(paramHandle = (*MIMEtypeHandle)->params;
106792 ¤   ····paramHandle != NULL; paramHandle = nextHandle) {
1ac9ab ¤   ¤   ·nextHandle = (*paramHandle)->next;
3c2873 ¤   ¤   ·if((*paramHandle)->value != NULL)
a53551 ¤   ¤   ·····DisposeHandle((*paramHandle)->value);
69eb8a ¤   ·····DisposeHandle((Handle)paramHandle);
0c9371 ¤   }
8873f5 ····DisposeHandle((Handle)MIMEtypeHandle);
9311ab ····MIMEtypeHandle = NULL;
5aefe6 }
61af5a
0faf5a
b5af5a
500975 /* ----------------------------------------------------------------------
2dedde ····Convert a MIME type structure to a string in the format it is usually
0d76b1 ····presented in in a Content-Type: header. ·This includes quoting the parameter
58543d ····values and so on.·
33869e ····
c45cbd ····Args: Handle for the emsMIMEtype·
f3869e ····
9e2bf8 ····Returns: Handle to a block of ASCII formatted for use
1ba808 ····¤   ¤   in a Content-Type: header
797abf ·············(note: it is not a Pascal string, nor a C string)
b47fe0 */
07582a Handle string_mime_type(emsMIMEtype **MIMEtypeHandle)·
3abb36 {
a96159 ····emsMIMEparam ··**paramHandle;
9f42c8 ····StringPtr ·····*srcStrHandle;
cfe104 ····emsMIMEtype ····*MIMEtype;
3c7b89 ····short ··········resultLen, resultPos;
6c7b6e ····Handle ·········theResult;
62af5a
440081 ¤   if(MIMEtypeHandle == NULL || *MIMEtypeHandle == NULL)·
ce7aab ¤   ····return(NULL);
d4af5a
06236c ····HLock((Handle)MIMEtypeHandle);
bf7e44 ····MIMEtype = *MIMEtypeHandle;
31869e ····
9ed82d ····/* --- Figure exactly how big the thing to return will be --- */
61af1b ····resultLen = *MIMEtype->mime_type + 1 + *MIMEtype->sub_type;
7b524a ····for(paramHandle = (*MIMEtypeHandle)->params; paramHandle != NULL;) {
7ece0f ········emsMIMEparam ·**tmpHandle = paramHandle;
b34ead ········HLock((Handle)tmpHandle);
2d3efe ¤   ····resultLen += *(*tmpHandle)->name +
3462d4 ¤   ···················GetHandleSize((*tmpHandle)->value) + 5;
21cfe8 ¤   ····paramHandle = (*tmpHandle)->next;
862d20 ¤   ····HUnlock((Handle)tmpHandle);
6647d1 ¤   }·
b3af5a
9cd124 ¤   ···················
f4c5d0 ¤   /* --- Allocate the Handle with the result --- */ ·················
8be5c8 ¤   theResult = NewHandle(resultLen);
c26b76 ¤   HLock(theResult);
674f78 ¤   resultPos = 0;
b650b7 ¤   ········
2de8c6 ¤   /* --- Add the type and sub type --- */
2521f4 ····BlockMoveData(MIMEtype->mime_type+1,
46321a ····¤   *theResult + resultPos, *MIMEtype->mime_type);
ce2a2d ····resultPos += *MIMEtype->mime_type;
09869e ····
20d30c ····*(*theResult + resultPos++) = '/';
39869e ····
119b5b ····BlockMoveData(MIMEtype->sub_type+1,
0916b7 ····¤   *theResult + resultPos, *MIMEtype->sub_type);
5dedbb ····resultPos += *MIMEtype->sub_type;
ad869e ····
5fc055 ·····/* ---- The parameters ---- */
ad03e0 ¤   for(paramHandle = (*MIMEtypeHandle)->params; paramHandle != NULL;) { ··
e29b8b ¤   ····emsMIMEparam **tmpHandle = paramHandle;
764ead ········HLock((Handle)tmpHandle);
a95a8a ········*(*theResult + resultPos++) = ';';
426fb9 ¤   ····*(*theResult + resultPos++) = ' ';
--814b 00080b206384012007c Page 3 of mimetype.c
e0af5a
227bf5 ¤   ·¤  BlockMoveData((*tmpHandle)->name+1, *theResult + resultPos,
25d762 ¤   ·¤  ···········*(*tmpHandle)->name);
fbb03a ········resultPos += *(*tmpHandle)->name;
11a7e2 ····¤   ·¤
a92797 ¤   ····*(*theResult + resultPos++) = '=';
2b56cf ¤   ····*(*theResult + resultPos++) = '"';
e1ba81 ¤   ··¤
dde799 ¤   ·¤  srcStrHandle = (StringHandle)(*tmpHandle)->value;
453aeb ¤   ·¤  HLock( (Handle)srcStrHandle);
522edf ¤   ·¤  BlockMoveData(*srcStrHandle,
e216e2 ¤   ·¤  ¤   *theResult + resultPos, GetHandleSize( (Handle)srcStrHandle));
0f0c36 ¤   ·¤  resultPos += GetHandleSize( (Handle)srcStrHandle);
adb784 ········HUnlock((Handle)srcStrHandle);
1e508e ········
dd35c5 ¤   ¤   *(*theResult + resultPos++) = '"';
10f3af ········paramHandle = (*tmpHandle)->next;
11e120 ········HUnlock((Handle)tmpHandle);
e16fe7 ····}
cc67c5 ¤
a83bd6 ¤   HUnlock(theResult);
284ebc ¤   HUnlock((Handle)MIMEtypeHandle);
431b52 ¤   ¤
743a1b ¤   return(theResult);
2038af } ··
b467c5 ¤
99af5a
2daf5a
6c0975 /* ----------------------------------------------------------------------
c1adda ·····Add a parameter to a MIME type
94583d ·····
e9edcf ·····Bug: might have to make the value parameter a Handle
df927e ·····instead of a StringPtr to
969c5d ·····accomodate items longer than 255 characters
34583d ·····
4bb9d5 ····Args: MIMEtypeHandle -- Handle for the MIME type to add too
4b7edd ··········name ·-- ·Name of the parameter (Pascal string)
7ebe69 ··········value -- ·Value of the parameter (currently a Pascal string)
197fe0 */
2ebb7b void add_mime_parameter(
ca4d0d ¤   emsMIMEtype **MIMEtypeHandle, ConstStringPtr name, ConstStringPtr value)
86bb36 {
962e84 ····emsMIMEparam **paramHandle, **paramsEndHandle;
10af5a
0f236c ····HLock((Handle)MIMEtypeHandle);
c6dc5a ¤   // Find pointer to last pointer in the param list
133534 ¤   paramsEndHandle = NULL;
e73db2 ¤   for(paramHandle = (*MIMEtypeHandle)->params; paramHandle != NULL;){
bc05c9 ¤   ····paramsEndHandle = paramHandle;
48cb28 ¤   ····HLock((Handle)paramsEndHandle);
b0e403 ¤   ····paramHandle = (*paramsEndHandle)->next;
2de813 ¤   ····HUnlock((Handle)paramsEndHandle);
4d9371 ¤   }
9667c5 ¤
b44f50 ¤   // The new parameter block (includes Str63 for name)·
58ef9c ····paramHandle = (emsMIMEparam **)NewHandle(sizeof(struct emsMIMEparamS));
85dc8d ¤   HLock((Handle)paramHandle);
005b03 ¤   BlockMoveData(name, (*paramHandle)->name, *name + 1);
3d67c5 ¤
9de02a ¤   // Allocate Handle for value and copy data in·
bac68a ¤   (*paramHandle)->value = NewHandle(*value);
250ee3 ¤   BlockMoveData(value + 1, *((*paramHandle)->value), *value );
a4dfc0 ¤   (*paramHandle)->next = NULL;
43cb39 ¤   HUnlock((Handle)paramHandle);
0e67c5 ¤
1f1840 ¤   // Put it at the end of the list
c495ef ¤   if(paramsEndHandle == NULL) {
7714c6 ¤   ¤   // It's an emtpy list
0ec173 ¤   ¤   (*MIMEtypeHandle)->params = paramHandle;
4cf037 ¤   } else {
1c64c8 ¤   ¤   // Put at end of list
800728 ¤   ¤   HLock((Handle)paramsEndHandle);
--b400 000698bb1454012007c Page 4 of mimetype.c
1131bf ¤   ¤   (*paramsEndHandle)->next = paramHandle;
c5e473 ¤   ¤   HUnlock((Handle)paramsEndHandle);
586fe7 ····}
754e70 ····HUnlock((Handle)MIMEtypeHandle);
8defe6 }
fdaf5a
a4af5a
d8af5a
fb765a /* -------------------------------------------------------------------------
dbeeb9 ···Pick out a specific parameter from a MIME type
49e8c6 ···
8f7fcb ···Args: mtype_h ·Handle to a struct ems_MIME_type
a803fc ·········paramName ·string with name of parameter to look for
f5cf72 ······
8ddd54 ···Returns handle to string which is the value or NULL
6f0f5f ···¤(It is not a pascal string)
33495d ·*/
ab81a2 Handle get_mime_parameter(
87f094 ¤   emsMIMEtype **MIMEtypeHandle, ConstStringPtr paramName)
25bb36 {
38399a ¤   long result;
4267c5 ¤
92860f ¤   emsMIMEparam **paramHandle;
d617b1 ¤   for(paramHandle = (*MIMEtypeHandle)->params;
e09386 ¤   ····paramHandle != NULL;
dc21fe ¤   ····paramHandle = (*paramHandle)->next) {
921add ¤   ····HLock((Handle)paramHandle);
ab180b ¤   ····result = EqualString((*paramHandle)->name, paramName, FALSE, TRUE);
e0bbf4 ¤   ····HUnlock((Handle)paramHandle);
d6daa8 ¤   ····if(result) {
238ac6 ¤   ········return((*paramHandle)->value);
25f372 ¤   ····}
109371 ¤   }
c34031 ····return(NULL);
e1797c }¤  ¤   ¤   ¤
58af5a
acaf5a
52af5a
c6765a /* -------------------------------------------------------------------------
326bda ··Convenient MIME type matcher - saves locking some handles
c2de7b ··
189d4b ··If either type or subtype is NULL, then it won't be checked.
a5de7b ··
22cb94 ··Args: MIMEtypeHandle -- The mime type to check
c9c48d ········mType ·-- The major MIME type to check
9a70c1 ········subtype -- The MIME subtype to check
adde7b ··
15649c ··Returns 1 if the MIME type matches, 0 if not
35495d ·*/
cc633f ·short match_mime_type(
24d0cd ·const emsMIMEtype **MIMEtypeHandle,
c3e87b ·ConstStringPtr mType, ConstStringPtr subtype)
9cbd71 ·{
af0b49 ····short result;
6f7516 ·······
d4236c ····HLock((Handle)MIMEtypeHandle);
4975c6 ····result = 1;
09869e ····
f4192b ·¤  if(mType != NULL)·
334fda ·¤  ····result = EqualString((*MIMEtypeHandle)->mime_type,
1dc508 ·¤  ····¤   ¤   ¤   mType, FALSE, TRUE);
c5d83c ·
58ce87 ····if(result && subtype != NULL)·
69f1bf ········result = EqualString((*MIMEtypeHandle)->sub_type,
7a7470 ········¤   ¤   ¤   subtype, FALSE, TRUE);
de508e ········
6d4e70 ····HUnlock((Handle)MIMEtypeHandle);
10375e ····return(result);
07efe6 }
7baf5a
8daf5a
69af5a
--0474 000f3bb13bb4012007c Page 5 of mimetype.c
c68b19 /* ---------------------------------------------------------------------------
6dcca0 ····Parse a MIME "Content-Type:" header
5fd83c ·
953e2b ·args: headerH - Handle containing header to be parsed;
568350 ·¤  ¤   ¤   length is length of Handle
f57fa7 ·················String should have CRLF line endings
dc82c6 ·······MIMEtypeHandlePtr - place where MIME type is returned. Set to NULL
a9c69c ·······························if no valid Content-type is found.
a6fb68 ···········
0d495d ·*/
b2fdd9 void parse_mime_ct( Handle headerH, emsMIMEtype ***MIMEtypeHandlePtr)
ccbb36 {
b214d1 ¤   char ········*s, *hEnd, *sEnd;
62ece2 ¤   Handle ·······tmp;·
83e97f ¤   emsMIMEparam **paramHandle, *param;
a315fd ¤   emsMIMEtype ·**mTypeHandle, *mType;
4919da ¤   char ········*name, c;
a5f0e6 ¤   int ··········txxxx;
a0af5a
c4a69c ····*MIMEtypeHandlePtr = NULL;
5aaf5a
c8ed89 ¤   /* Check for valid handle */
930e7e ¤   if ( !headerH )
28c8e7 ¤   ¤   return;¤¤
cb869e ····
150132 ¤   /* Find the Content-Type: header */
969168 ¤   HLock( (Handle)headerH);
ae695c ····hEnd = *headerH + GetHandleSize( (Handle) headerH);
39a5ea ··¤ for(s = *headerH; s < hEnd; ) {
b4d12d ¤   ¤   if(cmpCB(s, kContentTypeHdrCStr, kContentTypeHdrLen, 1) ==0) {
238adf ¤   ¤   ¤   break; /* Matched */
2b32a2 ¤   ··}
3ad286 ¤   ··while(s < hEnd && *s++ != '\012') {} /* Next Line */
979371 ¤   }
13b8a9 ¤   if(s >= hEnd)
a3fc1f ¤   ¤   return; /* Couldn't find CTE line */
4a1710 ¤   s += kContentTypeHdrLen; /* Go Past field identifier */ ·
3a67c5 ¤
685e64 ¤   /* Make value of CT header into a C string with no CRLF*/
00082b ····for(sEnd = s; sEnd < hEnd && *sEnd!='\012' && *sEnd!='\015';sEnd++)
6bd7f6 ····¤   {
e48326 ····¤   }
5ee7c4 ····¤
527209 ····tmp = NewHandle(sEnd - s + 1);
d6f491 ····HLock(tmp);
9a98c7 ····BlockMoveData(s, *tmp, sEnd - s); /* Don't copy EOL character */
7f4c81 ····(*tmp)[sEnd - s] = '\0';
1d64d6 ····s = *tmp;
b29285 ····HUnlock( (Handle) headerH); ··
3eaf5a
216062 ¤   /* Begin the old Pine/c-client parser (some what hacked up now) */
967721 ¤   /* Allocate the MIME type structure we're gonna return */
ffb20f ····mTypeHandle = (emsMIMEtype **)NewHandle(sizeof(emsMIMEtype));
3e7101 ····*MIMEtypeHandlePtr = mTypeHandle;
061950 ····HLock((Handle)mTypeHandle);
537e4d ····mType = *mTypeHandle;
7031b9 ····mType->params = NULL;
57a01f ····mType->mime_type[0] ·= 0;
3cea5e ····mType->sub_type[0] = 0;
5faf5a
6f869e ····
db5e9b ¤   /* First get the major type */
da93b6 ¤   rfc822_skipws(&s);
081312 ¤   if (!(name = rfc822_parse_word (s,ptspecials))) goto done;
b265ed ····c = *name;¤ ¤   /* remember delimiter */
0bb0c3 ····*name = '\0';¤  /* tie off type */
e64ee6 ····BlockMoveData(s, mType->mime_type, strlen(s)+1);
8c7525 ····c2pstr( (char *)mType->mime_type);
e874c9 ····*name = c;¤ ¤   ········/* restore delimiter */
f64ea5 ····/* Now get the sub-type */
d639b4 ····rfc822_skipws (&name);¤ /* skip whitespace */
f3e75f ····if ((*name == '/') &&¤  /* subtype? */
--0fa1 0001562956b4012007c Page 6 of mimetype.c
6e6954 ¤   ····( name = rfc822_parse_word ((s = ++name),ptspecials) ) != 0 )
d05d3b ¤   ·{
51ca71 ¤   ··c = *name;¤   ¤   /* save delimiter */
ff7750 ¤   ··*name = '\0';¤¤   /* tie off subtype */
3cbe89 ¤   ··rfc822_skipws (&s);¤  /* copy subtype */
08e5cd ¤   ··BlockMoveData(s, mType->sub_type, strlen(s)+1);
41bbb9 ¤   ··c2pstr( (char *)mType->sub_type);
1a27e7 ¤   ··*name = c;¤   ¤   /* restore delimiter */
9080f8 ¤   ··rfc822_skipws (&name);¤   /* skip whitespace */
db6a79 ····} else {
f3e505 ······/* There was no subtype */
e47ff4 ······BlockMoveData("\p", mType->sub_type, ·2);
93f972 ¤   ··if (!name) {¤ ¤   /* did the fool have a subtype delimiter? */
53d81a ¤   ····name = s;¤  ¤   /* barf, restore pointer */
b88635 ¤   ····rfc822_skipws (&name);/* skip leading whitespace */
d742cc ······}
696fe7 ····}
5667c5 ¤
9c075e ¤   /* parameter list? */
c515b4 ¤   paramHandle = NULL;
edb2fc ····while (name && (*name == ';') &&
fa76d0 ¤   ·····(name = rfc822_parse_word ((s = ++name),ptspecials)) != 0 ) {
8241de ¤   ··c = *name;¤   ¤   /* remember delimiter */
24b0dc ¤   ··*name = '\0';¤¤   /* tie off attribute name */
4bdd77 ¤   ··rfc822_skipws (&s);¤  /* skip leading attribute whitespace */
cb7a79 ¤   ··if (!*s) *name = c;¤  /* must have an attribute name */
c23c39 ¤   ··else {¤   ¤   ¤   /* instantiate a new parameter */
c604a5 ¤   ····if (mType->params) {
108b7a ¤   ········HUnlock((Handle)paramHandle);
dee03f ¤   ········paramHandle = (*paramHandle)->next =
837ac1 ¤   ········¤   (emsMIMEparam **)NewHandle(sizeof(emsMIMEparam));
97dfe8 ¤   ····} else {
c7f1df ¤   ········paramHandle = mType->params =
897ac1 ¤   ········¤   (emsMIMEparam **)NewHandle(sizeof(emsMIMEparam));
e5f372 ¤   ····}
7d1add ¤   ····HLock((Handle)paramHandle);
65bf62 ¤   ····param = *paramHandle;
c8ce5e ¤   ····param->next = NULL;
8b1d55 ¤   ····BlockMoveData(s, param->name, strlen(s) + 1);
42c8ee ¤   ····c2pstr( (char *)param->name);
0fc9f3 ¤   ····*name = c;¤ ¤   /* restore delimiter */
240ae6 ¤   ····rfc822_skipws (&name);/* skip whitespace before equal sign */
e8c0c2 ¤   ····if ((*name != '=') ||¤  /* missing value is a no-no too */
e37ec8 ¤   ······!(name = rfc822_parse_word ((s = ++name),ptspecials)))
c06d68 ¤   ······param->value = NULL;
e0862e ¤   ····else {¤ ¤   /* good, have equals sign */
5ae4ff ¤   ······c = *name;¤   ¤   /* remember delimiter */
53e3f4 ¤   ······*name = '\0';¤/* tie off value */
4b58f1 ¤   ······rfc822_skipws (&s);¤  /* skip leading value whitespace */
c9810c ¤   ······param->value = NewHandle(strlen(s)+1); // trailing NULL too
29ff09 ¤   ······HLock(param->value);
2919fe ¤   ······BlockMoveData(s, *(param->value), ·strlen(s)+1);
3d9506 ¤   ······rfc822_quote(*(param->value));
82a89e ¤   ······HUnlock(param->value);
510cca ¤   ······
d463d5 ¤   ······SetHandleSize(param->value,
e4e61d ¤   ······¤ strlen(*(param->value))); // whack trailng null
8fd603 ··········txxxx = ·strlen(*(param->value));
da9159 ··········txxxx = GetHandleSize(param->value);
f30c47 ¤   ······*name = c;¤   ¤   /* restore delimiter */
aaed03 ¤   ······rfc822_skipws (&name);
09f372 ¤   ····}
8232a2 ¤   ··}
986fe7 ····}
a0869e ····
c7fa14 ····if(paramHandle)
6dccda ······HUnlock((Handle)paramHandle);
18cf72 ······
8e1dec ····/* At end of it all */
f2afda ····if (!name) {¤
2c6f57 ······/* Missing parameter or parameter value */
15d576 ¤   } else if (*name) {¤¤
--1a26 0013d58954a4012007c Page 7 of mimetype.c
adf12c ¤   ··/* Junk at end of parameters - oh well */
d36fe7 ····}
fe869e ····
d9f467 ··done:·
51dcf6 ····HUnlock((Handle)mTypeHandle);
b3434c ····HUnlock(tmp);
65a5f8 ····DisposeHandle(tmp); ·
3defe6 }
--c705 00119578df84012007d Page 1 of mimetype.h
b114b9 /* ======================================================================
a7af5a
ba4ca5 ···Functions to manage MIME type data structures for use
8e2139 ·················with Eudora translation API on the Mac.
965886 ·················
452252 ···Last Edited: July 18, 1996
4daf5a
0a2ddf ···Laurence Lundblade <lgl@qualcomm.com>
9393e7 ···Myra Callen <t_callen@qualcomm.com>
8caf5a
0a826f ···Copyright 1995, 1996 QUALCOMM Inc.
0be8c6 ···
c89c4c ···Some of this code is from the c-client and is·
fb618d ······Copyright University of Washington·
4d7fe0 */
dbaf5a
7d2c68 void ·········init_mime_type_maker(Handle ((*)(size_t)), void (*)(Handle));
ce2197 emsMIMEtype **make_mime_type(ConstStringPtr, ConstStringPtr, ConstStringPtr);
786463 void ¤  ······free_mime_type(emsMIMEtype **);
680921 Handle ·¤   ··string_mime_type(emsMIMEtype **);
e26574 void ·········add_mime_parameter(emsMIMEtype **,
959e68 ¤   ¤   ¤   ¤   ¤   ConstStringPtr name, ConstStringPtr value);
c30386 Handle ·······get_mime_parameter(emsMIMEtype **, ConstStringPtr);
6414a8 short ¤ ¤   ··transfer_encodings(char *, long);
6b0435 short ········match_mime_type(const emsMIMEtype **,
7268ef ¤   ¤   ¤   ¤   ConstStringPtr, ConstStringPtr);
717fa5 void ·········parse_mime_ct( Handle headherH, emsMIMEtype ***);¤¤
c7af5a
0a796e #define kContentTypeHdrPStr¤¤   "\pContent-Type:"
3db0d5 #define kContentTypeHdrCStr¤¤   "Content-Type:"
193504 #define kContentTypeHdrLen¤ ¤   13
--f7da 000102c0d034012007e Page 1 of rfc1847.c
a70335 /*____________________________________________________________________________
92f7f7 ____________________________________________________________________________*/
93af5a
9214b9 /* ======================================================================
1daf5a
cc79cf ···Basic RFC-1847 Security-Multipart implementation
da5886 ·················
38c2c0 ···Last Edited: Apr 18, 1996
4de8c6 ···
6d197b ···Filename: rfc1847.c
30af5a
af2ddf ···Laurence Lundblade <lgl@qualcomm.com>
c2af5a
06826f ···Copyright 1995, 1996 QUALCOMM Inc.
26e8c6 ···
127fe0 */
a4af5a
664b15 #include <TextUtils.h>
bdaf5a
09b1cb #include <ctype.h>
b3abb7 #include "copycat.h"
7127f6 #include "rfc1847.h"
44f7d2 #include "lglio.h"
24af5a
591d17 #include "Types.h"
e0af5a
d6864f static OSErr FSWriteBuffer(short refNum, long size, Ptr buffer);
e37d2e static void ·canonLineDelim(char *buffer, long *buf_size);
d46025 static short match_MIME_boundary(char *line,
2dc34e ¤   ¤   ¤   ¤   long len, Str255 boundary, short *final);
db22ae static short transfer_encodings(char *string, long len);
48af5a
1baf5a
d61506 #define kCTEnone 0
de5dd1 #define kCTEQP ··1
8cd5eb #define kCTEB64 ·2
3aaf5a
ddaf5a
23682e /* ---------------------------------------------------------------------
6ca2f2 ····Create a multipart/signed message
02af5a
6c7836 args: signatureType ···- Mime type of the signature format being used
a3a074 ······micalg ··········- Name of message integrity check algorithm
bca837 ······signatureData ···- File with signed data -
5fc129 ······¤ ¤   ¤   ¤   ¤   must have full canonical MIME with headers
c9d276 ······signature ·······- File containing signature -
950d56 ······¤ ¤   ¤   ¤   ¤   ¤   must be 7bit text with local EOL (\r)
f1139b ······mimeOutput ······- Existing file where result is written·
feccf0 ······MimeBoundary ····- Returns the mime boundary generated ·
c6cf72 ······
dc03a6 To do: Do B64 encoding for the signature (OK for PGP/MIME)
bd7b9a ·······Maybe should be more concerned about boundary uniqueness
bfaf5a
989372 returns: OSErr
8f7fe0 */
b73b15 short createMultipartSigned(
e32725 ·····Str255 ·signatureType,
5bc3d2 ·····Str255 ·micalg,·
c23952 ·····FSSpec *signedData,
d1e8ee ·····FSSpec *signature,
52db79 ·····FSSpec *mimeOutput,
3a44e5 ·····Str255 ·MimeBoundary)
1ebb36 {
7eae92 ····short ··········OutRefNum, InRefNum;
1f5f41 ····short ··········err;
93d8e9 ····char ¤  ·······*Buf, **BufHandle;
43555b ····short ··········BufLen;
c6a700 ¤   unsigned long¤  secs;
358413 ¤   Str63 ··········NumStringBuf;
987629 ¤   long ···········numRead;
de0cca ¤   ······
101d6b ¤   BufHandle = NewHandle(sizeof(char) * 4096);
--0d46 00030ce25db4012007e Page 2 of rfc1847.c
9eefec ¤   HLock(BufHandle);
aeaed0 ¤   Buf = *BufHandle;
2c67c5 ¤
300210 ¤   /* Get the output file open */
369279 ··¤ err = FSpOpenDF(mimeOutput, fsWrPerm, &OutRefNum);
f64505 ··¤ if(err)·
2c67a4 ··¤ ····goto writeErr;
2e4f74 ····SetEOF(OutRefNum, 0L);
2bd83c ·
ac0fad ·¤  /* Generate the boundary parameter */
50bb03 ····GetDateTime(&secs);
285380 ····copyPP("\phe-loved-the-", MimeBoundary);
bed3fc ····NumToString((long)secs < 0 ? -(long)secs : (long)secs, NumStringBuf);
367b84 ····catPP(NumStringBuf, MimeBoundary);
6c1d09 ····catPP("\p-flying-e's", MimeBoundary);·
2767c5 ¤
e20b38 ····/* ==== Begin writing the output ==== */¤
758de5 ····/* The m/e MIME headers */
10e4d9 ····BufLen = 0;
c237bc ····BufLen = catPB("\pContent-type: multipart/signed; boundary=", BufLen, Buf);
80edf7 ····BufLen = catPB(MimeBoundary, BufLen, Buf);
67618d ····BufLen = catPB("\p;\015\012 ··micalg=\"", BufLen, Buf);
94c738 ····BufLen = catPB(micalg, BufLen, Buf);
610c2c ····BufLen = catPB("\p\";\015\012 ··protocol=\"", BufLen, Buf);
86b682 ····BufLen = catPB(signatureType, BufLen, Buf);
585db0 ····BufLen = catPB("\p\"\015\012\015\012", BufLen, Buf);
4b73d3 ····/* The boundary to start first part */
5d1501 ····BufLen = catPB("\p--", BufLen, Buf);
2eedf7 ····BufLen = catPB(MimeBoundary, BufLen, Buf);
813085 ····BufLen = catPB("\p\015\012", BufLen, Buf);
f4e418 ····err = FSWriteBuffer(OutRefNum, BufLen, (Ptr)Buf);
2e23c9 ····if(err)
fc8057 ¤   ··goto writeErr;
36ba81 ¤   ··¤
3b8e1c ··¤ /* The PGP signed data (already has canon encoding) */
f780e7 ····err = FSpOpenDF(signedData, fsRdPerm, &InRefNum);
af23c9 ····if(err)
f18057 ¤   ··goto writeErr;
453bad ····numRead = sizeof(Buf);
68810e ··¤ err = FSRead(InRefNum, &numRead, (Ptr)Buf);
da3480 ··¤ while((err == noErr || err == -39) && numRead > 0)
043b37 ····{
b31b79 ········err = FSWriteBuffer(OutRefNum, numRead, (Ptr)Buf);
91151c ·¤  ····if(err)
78ff2d ¤   ··¤ ··goto writeErr;
893a03 ¤   ······/* Read the next chunk in */
ab37a4 ¤   ¤   numRead = sizeof(Buf);
3fb8f4 ¤   ¤   err = FSRead(InRefNum, &numRead, (Ptr)Buf);
a99371 ¤   }
0e0966 ¤   FSClose(InRefNum);
d7af5a
edc7d3 ¤   /* Tie off first part and add headers for the second part */
db1699 ¤   BufLen = 0;
841abd ¤   BufLen = catPB("\p\015\012", BufLen, Buf);
9d5767 ¤   BufLen = catPB("\p--", ·BufLen, Buf);
68edf7 ····BufLen = catPB(MimeBoundary, BufLen, Buf);
6a3085 ····BufLen = catPB("\p\015\012", BufLen, Buf);
76b5c6 ¤   BufLen = catPB("\pContent-Type: ", BufLen, Buf);
3b0b63 ¤   BufLen = catPB(signatureType, BufLen, Buf);
6f7529 ¤   BufLen = catPB("\p\015\012\015\012", BufLen, Buf);
4940d0 ¤   err = FSWriteBuffer(OutRefNum, BufLen, (Ptr)Buf);
af94b7 ¤   if(err)
e98057 ¤   ··goto writeErr;
3e67c5 ¤
8ec22d ··¤ /* The signature (assume 7bit local text, e.g., ASCII armour) */
ab64cd ····err = FSpOpenDF(signature, fsRdPerm, &InRefNum);
a423c9 ····if(err)
fe8057 ¤   ··goto writeErr;
245244 ····numRead = sizeof(Buf)/2; /* half-fill makes room for canonLineDelim() */
872eb5 ¤   err = FSRead(InRefNum, &numRead, (Ptr)Buf);
5aaf1e ¤   while((err == noErr || err == -39) && numRead > 0)
30c7a1 ¤   {
--9b51 0006d5037064012007e Page 3 of rfc1847.c
edbc2a ········canonLineDelim(Buf, &numRead);
1fda69 ¤   ¤   err = FSWrite(OutRefNum, &numRead, (Ptr)Buf);
138e07 ¤   ¤   if(err)
d83186 ¤   ¤   ··goto writeErr;
6c9def ¤   ¤   /* Read the next chunk in */
b827f0 ¤   ····numRead = sizeof(Buf)/2;
6b0515 ¤   ····err = FSRead(InRefNum, &numRead, (Ptr)Buf);
936fe7 ····}
af6d43 ··¤ FSClose(InRefNum);
7daf5a
43a562 ¤   /* Tie off the multipart message */
99e4d9 ····BufLen = 0;
5f90fb ¤   BufLen = catPB("\p\015\012--", BufLen, Buf);
e6c7cf ¤   BufLen = catPB(MimeBoundary, BufLen, Buf);
0287ef ¤   BufLen = catPB("\p--\015\012", BufLen, Buf);
ac40d0 ¤   err = FSWriteBuffer(OutRefNum, BufLen, (Ptr)Buf);
cf94b7 ¤   if(err)
478057 ¤   ··goto writeErr;
1b6685 ·¤  FSClose(OutRefNum);
437a57 ····HUnlock(BufHandle);
d129da ····DisposeHandle(BufHandle);
26869e ····
5b557d ¤   return(noErr);
a9af5a
6bf8cc ·writeErr:
ca7a57 ····HUnlock(BufHandle);
8c29da ····DisposeHandle(BufHandle);
46af5a
5235e7 ····FSClose(OutRefNum);
a60695 ····FSClose(InRefNum);
17850b ····return(err);
49efe6 }
0baf5a
b0af5a
edaf5a
5b765a /* -------------------------------------------------------------------------
720ec3 ·····Minimal MIME security/multiparts parser + transfer decoder ·
83af5a
6f6722 The file on the inFsp must be a full MIME body in canonical form. It should
4ec778 be of type multipart/signed with the boundary the same as the
eb5649 one passed in (from
425baf a previous partial MIME parse). ··
05de7b ··
0134ab args: inFsp: ····The file with the security multipart in it
656f24 ······p1Fsp: ····The first part of the security multipart (encoding stays on,
ff2795 ·······must exist)
dd6308 ······p2Fsp: ····The second part (encoding always removed, must exist)
af15a6 ······boundaryHandle: The boundary string (not parsed here,
9cb362 ······must be given to us)
ccfb68 ···········
7a7df4 returns: standard Mac error code or -2000 for some MIME parsing sort of error
bce8c6 ···
0eca3c to do: test with werid input, transfer decoding
23c23d */·
834e42 OSErr ParseMultipart(
c1454d ·····FSSpec ···*inFsp,
83cc55 ·····FSSpec ···*p1Fsp,
abc028 ·····FSSpec ···*p2Fsp,
4d9acc ·····StringPtr *boundaryHandle)
77bb36 {
3aee51 ¤   char ¤  ¤   *line;
456b13 ¤   long¤   ¤   ·len;
dc3883 ¤   short ¤ ¤   ·theOutRefNum, transferEncoding;
46eb33 ¤   lglIOHandle ·inIOHandle;
fee773 ¤   const¤  ¤   ·kCTElen = 26; // Length of "Content-Transfer-Encoding:"
1f3d1f ¤   OSErr¤  ¤   ·err;
f2fd24 ¤   Str255 ······boundary;
2a2f7a ¤   Boolean ·····thisLineHasEOL, lastLineHasEOL;
7867c5 ¤
9f2e58 ¤   /* Convert boundary to a Pascal string */
a03855 ¤   HLock( (Handle) boundaryHandle);
6dbfad ¤   copyBP( (const char *)*boundaryHandle,
--0beb 00040bb55574012007e Page 4 of rfc1847.c
2e8051 ¤   ¤   GetHandleSize( (Handle) boundaryHandle), boundary);
7f2953 ¤   HUnlock( (Handle) ·boundaryHandle);
0067c5 ¤
383404 ¤   /* Open the input file using lgl's mini r/o stream i/o functions */
e1bfe7 ¤   err = lglOpen(&inIOHandle, *inFsp);
bb6ebc ¤   if(err) {
518676 ¤   ¤   return(err);
339371 ¤   }
187f1c ¤   HLock((Handle)inIOHandle);
f467c5 ¤
e3613d ¤   /* ---- Get first out of the multipart - leave transfer encoding on ---- */¤
78f93d ¤   if(p1Fsp) {
4ea306 ¤   ····err = FSpOpenDF(p1Fsp, fsWrPerm, &theOutRefNum);
a072c3 ¤   ····if(err) goto err1;
719371 ¤   }
cc869e ····
fb6313 ¤   /* Get first instance of boundary */
81bcc9 ¤   while((err = lglRead(inIOHandle, &line, &len)) == noErr)
521a09 ¤   ··if(match_MIME_boundary(line, len, boundary, NULL))
47cdcb ¤   ¤   ¤   break;
13c55c ····if(err) {
857c6d ········err = -2000; /* Hit end of file: some MIME parsing error */
05f04e ········goto err1;
146fe7 ····}
b6869e ····
673675 ····/* Copy out the first part - this should handle binary MIME too! */
691344 ····/* The flags deal with MIME's \r\n convention before a boundary */
680ca7 ····lastLineHasEOL = 0;
f2b0a1 ····while(lglRead(inIOHandle, &line, &len) == noErr) {
61957e ········if(lastLineHasEOL && match_MIME_boundary(line, len, boundary, NULL))
b4a73e ¤   ¤   ··break;
7fe6a4 ¤   ····thisLineHasEOL = len > 1 &&
203283 ¤   ····¤   line[len-1] == '\012' && line[len-2] == '\015';
a0cef4 ¤   ¤   if(lastLineHasEOL)·
e92d5b ¤   ¤   ··if(p1Fsp && (err = FSWriteBuffer(theOutRefNum, 2,
6e8aa1 ¤   ¤   ··¤ ¤   "\015\012")) != noErr )
eb8269 ¤   ¤   ····goto err1;
383c78 ¤   ¤   ···
26e83a ¤   ¤   if(p1Fsp &&·
b0c881 ¤   ¤   ···(err = FSWriteBuffer(theOutRefNum,
83b8ab ¤   ¤   ···¤thisLineHasEOL ? len-2 : len, (Ptr)line)) != noErr)
cb0a87 ¤   ¤   ··goto err1;
f5ff6f ¤   ¤   lastLineHasEOL = thisLineHasEOL;
bf6fe7 ····}
96af5a
e9b971 ¤   FSClose(theOutRefNum);
58c55c ····if(err) {
689001 ········err = -2000;/* Hit end of file: some MIME parsing error */
04f04e ········goto err1;
6c68de ····} ···
c4af5a
833a9a ¤   /* ---- do the second part, this time remove transfer encoding ---- */
879f22 ¤   err = FSpOpenDF(p2Fsp, fsWrPerm, &theOutRefNum);
6594b7 ¤   if(err)
4c42cf ¤   ¤   ·goto err1;
52c162 ¤   /* Read until a blank line checking for transfer encoding */
182c8f ¤   transferEncoding = kCTEnone;
4597ae ¤   while(lglRead(inIOHandle, &line, &len) == noErr && len > 2)
18cf1a ¤   ¤   if(cmpCB(line, "Content-Transfer-Encoding:",
154dbd ¤   ¤   ¤   len>kCTElen ? kCTElen : len, 1) == 0)
d511ed ¤   ¤   ¤   transferEncoding = transfer_encodings(line + kCTElen,
82c471 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   len - kCTElen);¤
1967c5 ¤
eac7a6 ¤   if(len != 2) {
b4d965 ¤   ¤   err = -2000; /* Some MIME parse error */
995e25 ¤   ¤   goto err1;
5d4032 ¤   }¤  ¤
b0af5a
4c79c3 ····/* Copy out the second part - this should handle binary MIME too! */
1d0ca7 ····lastLineHasEOL = 0;
5fb0a1 ····while(lglRead(inIOHandle, &line, &len) == noErr) {
40957e ········if(lastLineHasEOL && match_MIME_boundary(line, len, boundary, NULL))
--817b 0009d9d8d034012007e Page 5 of rfc1847.c
57a73e ¤   ¤   ··break;
2b1d09 ¤   ¤   switch(transferEncoding) {
84fd99 ¤   ¤   ··case kCTEnone:
9a3c75 ¤   ¤   ····thisLineHasEOL = len > 1 && line[len-1] == '\012' &&
3e7264 ¤   ¤   ····line[len-2] == '\015';
27a6b1 ¤   ¤   ····if(lastLineHasEOL)·
5944ce ¤   ¤   ······if( (err = FSWriteBuffer(theOutRefNum, 2, "\015\012")) != noErr)
a32946 ¤   ¤   ········goto err1;
bbdabf ¤   ¤   ····
224835 ¤   ¤   ····if( (err = FSWriteBuffer(theOutRefNum,
a9e136 ¤   ¤   ····¤   thisLineHasEOL ? len-2 : len, (Ptr)line)) != noErr)
4af9a0 ¤   ¤   ······goto err1;
def91b ¤   ¤   ····lastLineHasEOL = thisLineHasEOL;
0b2859 ¤   ¤   ····break;
752b85 ¤   ¤   ¤   ¤
5d2128 ¤   ¤   ···case kCTEQP:
95df7a ¤   ¤   ···case kCTEB64:
9a34b3 ¤   ¤   ·····break;
1595b1 ¤   ¤   ·····/* Not handling any other transfer-encoding's yet */
a20fe4 ¤   ¤   }
536fe7 ····}
caaf5a
e75474 ····/* All worked OK! */
6e25f1 ¤   err = noErr;
9167c5 ¤
10cb84 err1:
4ab971 ¤   FSClose(theOutRefNum);
e913d8 ¤   lglClose(inIOHandle); /* This unlocks and disposes */¤
71850b ····return(err);
5cefe6 }
9baf5a
fdaf5a
16af5a
d0e206 /* ======================= ·Private functions ========================== */
88af5a
3a765a /* -------------------------------------------------------------------------
8e4125 ··See if an input string matches the given MIME boundary
7fde7b ··
aa6675 args: line ····- the input line, not necessarilly NULL terminated
c63c9b ······len ·····- the length of the input line
e9501f ······boundary - Pascal string with MIME boundary string
905d5e ······final ···- The flag final will be set if it is the final MIME boundary
b02c06 returns: 1 if it matches, 0 if not
667fe0 */
e11215 static short match_MIME_boundary(
c2c485 char *line, long len, Str255 boundary, short *final)
78bb36 {
1caec6 ··short bLen = *boundary;
52dcc9 ¤   /* Get the length correct: the leading "--",
982bff ¤   trailing "\015\012" and sometimes
2ef44e ¤   ····trailing "--" */
136739 ¤   if((len != bLen + 4 && len != bLen + 6) ||
d22073 ¤   ····line[0] != '-' || line[1] != '-' ||
b58bac ¤   ····line[len-1] != '\n' || line[len-2] != '\r')
695565 ¤   ¤   return(0);
887603 ¤   /* Match the actual boundary string¤*/·
1fc1e1 ¤   if(cmpCB(line+2, (const char *)boundary+1, bLen, 0))
d95565 ¤   ¤   return(0);
6010ee ¤   /* If it's final match the "--" before the "\015\012" */
144275 ¤   if(len != bLen + 4 && (line[len-3] != '-' || line[len-4] != '-'))
e05565 ¤   ¤   return(0);
0cc168 ¤   /* Have got a match -- Set flag if requested */
1bab0b ¤   if(final != NULL)
dfee98 ¤   ¤   *final = len == bLen ? 0 :1;
bb8d85 ¤   return(1);·
74efe6 }
c667c5 ¤
b5af5a
f0af5a
2e765a /* -------------------------------------------------------------------------
610497 ····Write out the buffer -- however many FSWrite calls it takes
9d495d ·*/
--b56e 001e765d9974012007e Page 6 of rfc1847.c
c677a2 static OSErr FSWriteBuffer(short refNum, long size, Ptr buffer)
2abb36 {
5586fe ¤   short err;
819522 ¤   long ·numWrite, leftToWrite;
0267c5 ¤
1d25f1 ¤   err = noErr;
a23489 ¤   leftToWrite = size;
d1223a ¤   while(!err && leftToWrite)
0fc7a1 ¤   {
985ecb ¤   ¤   numWrite = leftToWrite;
a82996 ¤   ····err = FSWrite(refNum, &numWrite, buffer + (size - leftToWrite));
ee4eb4 ¤   ¤   leftToWrite -= numWrite;
1c9371 ¤   }
39c7fd ¤   return(err);
991862 }¤
60af5a
ccaf5a
caaf5a
28765a /* -------------------------------------------------------------------------
d2bd97 ···Turn the local newline convention (\r) into Internet canonical (\r\n)
ab142b ···Buffer must be twice the size of the data actually in it to handle·
43a8b7 ···worst case of a string of newlines as input
107fe0 */
992978 static void
37d5ee canonLineDelim(char *buffer, long *buf_size)
e7bb36 {
2b6b8b ¤   char *b, *b_end, *n_b;
dc1278 ¤   long ·newline_count;
dd67c5 ¤
7c7527 ¤   /* First count the newlines */
39a74f ¤   newline_count = 0;
ba12e5 ¤   for(b = buffer, b_end = buffer + *buf_size; b < b_end; b++)
e470c5 ¤   ¤   if(*b == '\r')
c7cc29 ¤   ¤   ¤   newline_count++;
8d36b6 ¤   for(b = b_end - 1, n_b = b_end -1 + newline_count;
5f0cbe ¤   ¤   b >= buffer; *n_b-- = *b--)
9070c5 ¤   ¤   if(*b == '\r')
f4d34c ¤   ¤   ¤   *n_b-- = '\n';
6bfa31 ¤   *buf_size += newline_count;
be1862 }¤
7faf5a
97af5a
0f765a /* -------------------------------------------------------------------------
c5da6c ···Match the transfer encoding value string
9fe8c6 ···
6a495d ·*/
2006e5 static short
62d1be transfer_encodings(char *string, long len)
86bb36 {
969e8a ¤   char *s_end;
32f7d2 ¤   short token_len;
6267c5 ¤
97d0b6 ¤   for(s_end = string + len; isspace(*string) && len;¤ string++, len--)\
225b34 ¤   ¤   {
600fe4 ¤   ¤   }
701b52 ¤   ¤
e8bb97 ¤   for(token_len = 0; !isspace(string[token_len]) && len; len--, token_len++)
f05b34 ¤   ¤   {
3e0fe4 ¤   ¤   }
6367c5 ¤
3b4255 ¤   if((int)cmpCB(string, "base64", token_len, 1) == 0)
4faee7 ¤   ¤   return(kCTEB64);
e77ffd ¤   if(cmpCB(string, "quoted-printable", token_len, 1) == 0)
ded802 ········return(kCTEQP);
f9fa93 ···return(kCTEnone);
e7efe6 }
--9965 001915a4eab4012007f Page 1 of rfc1847.h
b114b9 /* ======================================================================
a7af5a
6179cf ···Basic RFC-1847 Security-Multipart implementation
6b5886 ·················
f6c2c0 ···Last Edited: Apr 18, 1996
84af5a
702ddf ···Laurence Lundblade <lgl@qualcomm.com>
50af5a
7ea1c5 ···QUALCOMM Inc. proprietary and confidential
df826f ···Copyright 1995, 1996 QUALCOMM Inc.
7de8c6 ···
1d7fe0 */
c3af5a
061340 OSErr ···createMultipartSigned(Str255 ·sigType,
e4e8cc ·······························Str255 ·micalg,·
506b47 ·······························FSSpec *signedData,
d578be ·······························FSSpec *signature,
ce896c ·······························FSSpec *mimeOutput,
6beca8 ·······························Str255 ·MimeBoundary);
fdf030 ······················
bb0756 OSErr ··········ParseMultipart(FSSpec ···*inFsp,
b63581 ·······························FSSpec ···*p1Fsp,
5739fc ·······························FSSpec ···*p2Fsp,
81b3b3 ·······························StringPtr *boundaryHandle); ·····················
91e9e8 ·····················¶
--30a3 0009d3eeebc40120080 Page 1 of rfc822.c
e0af5a
62b2bf #include <Errors.h>
bfaf5a
846bd2 #include "rfc822.h"
45f7d2 #include "lglio.h"
0aaf5a
08af5a
4f7fd5 /* ============== yes, it's all the rest of this file... ================== */
d85145 /* ============== not needed for most translator ========================== */
fd395e static char *strpbrk(const char *string, const char *check_chars);
0caf5a
445ceb /* All these special characters will confuse CodeWarrior so you may not get
01d77b ·* the colorized comments and key words you are use to.
cc1c64 ·*/¤¤   ¤   ¤
a6e24d extern const char *hspecials =
36d1ac ¤   " ()<>@,;:\\\"";¤   ¤   ¤   /* parse-host specials */ ···············
467fe1 extern const char *wspecials =
798433 ¤   " ()<>@,;:\\\"[]";¤ ¤   /* parse-word specials */¤  ¤   ¤   ¤
cdb5fb extern const char *ptspecials =
18178c ¤   " ()<>@,;:\\\"[]/?=";¤  /* parse-token specials for parsing */
0caf5a
7caf5a
a6d978 /* Stolen from Pine and the c-client */
e46f6f /* Parse RFC822 word
193ec5 ·* Accepts: string pointer
91fbd0 ·* Returns: pointer to end of word
f7495d ·*/
abaf5a
8e9fb8 char *rfc822_parse_word (char *s, const char *delimiters)
7bbb36 {
85a277 ··char *st,*str;
01a0cb ··if (!s) return NULL;¤ ¤   /* no-op if no string */
4edd8b ··rfc822_skipws (&s);¤  ¤   /* flush leading whitespace */
a7a972 ··if (*s == '\0') return NULL;¤ /* end of string */
3cf769 ¤   ¤   ¤   ¤   /* default delimiters to standard */
ce91a5 ··if (!delimiters) delimiters = wspecials;
c0fae1 ··str = s;¤ ¤   ¤   /* hunt pointer for strpbrk */
d10e5c ··while (1) {¤  ¤   ¤   /* look for delimiter */
1adbf7 ····if (!(st = strpbrk (str,delimiters))) {
420910 ······while (*s != '\0') ++s;¤  /* no delimiter, hunt for end */
cb23a5 ······return s;¤¤   ¤   /* return it */
406fe7 ····}
7d4591 ····switch (*st) {¤ ¤   /* dispatch based on delimiter */
cdb03e ····case '"':¤  ¤   ¤   /* quoted string */
71fd01 ¤   ¤   ¤   ¤   /* look for close quote */
2ebc70 ······while (*++st != '"') switch (*st) {
7ecafe ········case '\0':¤ ¤   /* unbalanced quoted string */
e84b7d ¤   ······return NULL;¤ ¤   /* sick sick sick */
a6da8b ········case '\\':¤ ¤   /* quoted character */
174428 ¤   ······if (!*++st) return NULL;¤ /* skip the next character */
fd6ab3 ········default:¤   ¤   ¤   /* ordinary character */
ba43b0 ¤   ······break;¤   ¤   ¤   /* no special action */
d042cc ······}
4ced36 ······str = ++st;¤  ¤   /* continue parse */
f988e1 ······break;
41a766 ····case '\\':¤ ¤   ¤   /* quoted character */
a9aa83 ······/* This is wrong; a quoted-pair can not be part of a word. ·However,
42ac05 ·······* domain-literal is parsed as a word and quoted-pairs can be used
8d874f ·······* *there*. ·Either way, it's pretty pathological.
ace9f1 ·······*/
f547cd ······if (st[1]) {¤ ¤   /* not on NUL though... */
898260 ¤   ····str = st + 2;¤  ¤   /* skip quoted character and go on */
6bcafa ¤   ····break;
3542cc ······}
ea1b0e ····default:¤   ¤   ¤   /* found a word delimiter */
185563 ······return (st == s) ? NULL : st;
df6fe7 ····}
64df1c ··}
ffefe6 }
ecaf5a
baaf5a
9dd931 /* Skips RFC822 whitespace
--5289 000ca962d9840120080 Page 2 of rfc822.c
956e66 ·* Accepts: pointer to string pointer
b0495d ·*/
5c8f29 void rfc822_skipws (char **s)
edbb36 {
e55bb4 ··char *t;
7655cf ··long ·n = 0;
bd8210 ¤   ¤   ¤   ¤   /* while whitespace or start of comment */
be8345 ··while ((**s == ' ') || (n = (**s == '(')) != 0 ) {
5b660e ····t = *s;¤¤   ¤   /* note comment pointer */
ab09a5 ····if (**s == '(') while (n) {¤/* while comment in effect */
8e3e79 ······switch (*++*s) {¤ ¤   /* get character of comment */
65b669 ········case '(':¤  ¤   ¤   /* nested comment? */
2f57ee ¤   ······n++;¤ ¤   ¤   /* increment nest count */
613d70 ¤   ······break;
f7b841 ········case ')':¤  ¤   ¤   /* end of comment? */
25cd06 ¤   ······n--;¤ ¤   ¤   /* decrement nest count */
133d70 ¤   ······break;
4cb594 ········case '"':¤  ¤   ¤   /* quoted string? */
b27dd9 ¤   ······while (*++*s != '\"') if (!**s || (**s == '\\' && !*++*s)) {
eaff2c ¤   ········/* Unterminated quoted string within comment */
f61f77 ¤   ········*t = '\0';¤ ¤   /* nuke duplicate messages in case reparse */
974bf2 ¤   ········return;
527bcc ¤   ······}
bd3d70 ¤   ······break;
4ff959 ········case '\\':¤ ¤   /* quote next character? */
65485c ¤   ······if (*++*s) break;
a535f0 ········case '\0':¤ ¤   /* end of string */
752c66 ¤   ·····/* "Unterminated comment */
f650b3 ¤   ······*t = '\0';¤   ¤   /* nuke duplicate messages in case reparse */
084b9e ¤   ······return;¤  ¤   ¤   /* this is wierd if it happens */
f80331 ········default:¤   ¤   ¤   /* random character */
d43d70 ¤   ······break;
8542cc ······}
696fe7 ····}
c8401f ····++*s;¤  ¤   ¤   /* skip past whitespace character */
08df1c ··}
72efe6 }
ecaf5a
89af5a
868aea /* Unquote an RFC822 format string
ec2ddd ·* Accepts: string
75366f ·* Returns: string
fd495d ·*/
56af5a
b8face char *rfc822_quote (char *src)
76bb36 {
5041a7 ··char *ret = src;
cfde7b ··
1a6188 ··if (strpbrk (src,"\\\"")) {¤  /* any quoting in string? */
b65e01 ····char *dst = ret;
40d139 ····while (*src) {¤ ¤   /* copy string */
82bcbe ······if (*src == '\"') src++;¤ /* skip double quote entirely */
9ba069 ······else {
bc85e0 ¤   ····/* skip over single quote, copy next always */
d31268 ¤   ····if (*src == '\\') src++;
c285bb ¤   ····*dst++ = *src++;¤   /* copy character */
f042cc ······}
9c6fe7 ····}
7371a0 ····*dst = '\0';¤   ¤   /* tie off string */
81df1c ··}
e12ec4 ··return ret;¤  ¤   ¤   /* return our string */
77efe6 }
eeaf5a
08af5a
63bdb8 static char *strpbrk(const char *string, const char *check_chars)
c6bb36 {
181a28 ····char *s, *c;
d0869e ····
b69f78 ····for(s = (char *)string; *s; s++)
af3b37 ····{
19ae4b ····¤   for(c = (char *)check_chars; *c ; c++) {
cac89e ¤   ········if(*s == *c)
--c6ba 000a46a85fe40120080 Page 3 of rfc822.c
561e8f ¤   ············return(s);
bcf372 ¤   ····}
589371 ¤   }
65d2ca ¤   return(NULL);
3fefe6 }
70af5a
8895d7 /*·
1b75b0 ··Read file and extract RFC-822 header - does line folding too
99d83c ·
34f2df ·args: Fsp ···- File name with a canonical 822 object in it
647902 ·······Header - pointer to place to put handle with the headers which will be
24ac82 ················NULL terminated have a Handle size one greater than headers
b43d9e ················
88efad ·returns: OSErr
a0d83c ·
ed6d40 ··The call allocates memory for *HeaderH, caller must free this memory.
9a495d ·*/
2eaf5a
dccd63 OSErr ReadHeader(FSSpec *Fsp, Handle *HeaderH)
f7bb36 {
cfa299 ··OSErr ·······¤ err = noErr;
ca7aeb ··lglIOHandle ·¤ inIOH;
92c2ef ··char ·······¤ *line;
40e034 ··long ········¤ len, headerLen, oldSize;
f025fb ··Boolean¤  ¤   ·¤  ¤   ·gotLine = true, notBlank = true;
2c869e ····
4b583c ··*HeaderH = NewHandle(4096); /* Start out with this size for header,
6b890a ··¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   disposed by caller */
cbbf63 ··if ( *HeaderH == NULL )
52a467 ···¤¤   return(nilHandleErr);
cae0ef ¤   oldSize = GetHandleSize(*HeaderH);
05af5a
667419 ¤   /* Open the file to parse */
5b0529 ··/* allocates memory, disposed in lglClose() */
224772 ··if( (err = lglOpen(&inIOH, *Fsp)) != noErr)·
45df1f ··¤ return(err);
81f908 ··if ( !inIOH )
55ed3b ··¤ return(nilHandleErr);
ce340c ··HLock((Handle)inIOH); ·/* unlocked in lglClose() */
afaf5a
daeeba ¤   headerLen = 0;
cd1d14 ¤   gotLine = (lglRead(inIOH, &line, &len) == noErr);
dbaf5a
808fbe ¤   while ( gotLine && notBlank ) {
cd75a0 ¤   ¤   if ( headerLen + len + 1 > oldSize ) {
2afd55 ··¤ ¤   ¤   /* Need to make handle bigger */
febd9e ··¤ ¤   ¤   SetHandleSize(*HeaderH, 2 * oldSize);
3c9407 ¤   ¤   ¤   ··if( MemError() != noErr ) {
de81d2 ¤   ¤   ¤   ··¤ /* try again */
02ec12 ¤   ¤   ¤   ··¤ Handle tempH;
850764 ¤   ¤   ¤   ··¤ tempH = NewHandle(2 * oldSize);
50726b ¤   ¤   ¤   ··¤ if ( tempH == NULL ) {
c60787 ¤   ¤   ¤   ··¤ ¤   lglClose(inIOH); /* Closes and HUnlocks() */
f87607 ¤   ¤   ¤   ··¤ ¤   return(err);
aa3995 ¤   ¤   ¤   ··¤ }
f81e3f ¤   ¤   ¤   ··¤ else {
4f87c2 ¤   ¤   ¤   ··¤ ¤   HLock(*HeaderH);
5c98b3 ¤   ¤   ¤   ··¤ ¤   HLock(tempH);
880257 ¤   ¤   ¤   ··¤ ¤   BlockMoveData(**HeaderH, *tempH, oldSize);¤ ¤
938f98 ¤   ¤   ¤   ··¤ ¤   HUnlock(tempH);
a475c6 ¤   ¤   ¤   ··¤ ¤   HUnlock(*HeaderH);
f0563b ¤   ¤   ¤   ··¤ ¤   DisposeHandle(*HeaderH);¤   ¤   // free old handle
d51b19 ¤   ¤   ¤   ··¤ ¤   *HeaderH = tempH;¤  ¤   // point our handle to new data
8a62d9 ¤   ¤   ¤   ··¤ ¤   oldSize = GetHandleSize(*HeaderH);
913995 ¤   ¤   ¤   ··¤ }
f11112 ¤   ¤   ¤   ··}
d80fe4 ¤   ¤   }
ad2e78 ¤   ¤   if ( (*line == ' ') && (headerLen != 0) ) ··
7d986d ¤   ······headerLen -=2; /* Had a continuation line,
d251e3 ¤   ······¤ ¤   ¤   ¤   ¤   overwrite CRLF at end of prev. line */
fa3e31 ¤   ··
a43272 ··¤ HLock(*HeaderH);
--a3cc 001e7c9385140120080 Page 4 of rfc822.c
312aa9 ¤   ··BlockMove(line, **HeaderH + headerLen, len);
7aad8e ··¤ HUnlock(*HeaderH);
43545e ¤   ¤   headerLen += len;
7f1e63 ¤   ¤   gotLine = (lglRead(inIOH, &line, &len) == noErr);
d1cedc ¤   ¤   notBlank = (len > 2);
b8df1c ··}
d61e07 ··SetHandleSize(*HeaderH, headerLen+1);
633da3 ··err = MemError();
d12956 ··if( err != noErr ) {
edc568 ··¤ lglClose(inIOH); /* Closes and HUnlocks() */
6bdf1f ··¤ return(err);
74df1c ··}
8b44e6 ··HLock(*HeaderH);
66cdc7 ··(**HeaderH)[headerLen] = '\0';
2ac502 ··HUnlock(*HeaderH);
dbce9f ¤   lglClose(inIOH); /* Closes and HUnlocks() */
7367c5 ¤
1e557d ¤   return(noErr);
e77889 } ···
--50f7 001a94e193d40120081 Page 1 of rfc822.h
b114b9 /* ======================================================================
a7af5a
b46494 ···Functions for very basic RFC-822 header manipulation
4c5886 ·················
702252 ···Last Edited: July 18, 1996
26af5a
572ddf ···Laurence Lundblade <lgl@qualcomm.com>
e3af5a
29826f ···Copyright 1995, 1996 QUALCOMM Inc.
d9e8c6 ···
a89c4c ···Some of this code is from the c-client and is·
57618d ······Copyright University of Washington·
997fe0 */
cfaf5a
5eaf5a
9c5170 OSErr ReadHeader(FSSpec *Fsp, Handle *HeaderH);
2854a5 void ·rfc822_skipws (char **s);
01397c char *rfc822_parse_word (char *s, const char *delimiters);
012fa8 char *rfc822_quote (char *src);
05af5a
a91d92 extern const char *hspecials, *wspecials, *ptspecials;¶
--4930 0015ef00ecf40120082 Page 1 of usertrans.h_sample
6ec77f /* =====================================================
7bde7b ··
ba44d8 ···Eudora Extended Message Services API SDK 1.0b3 (July 12, 1996)
bd493c ···This SDK supports EMSAPI version 1
81826f ···Copyright 1995, 1996 QUALCOMM Inc.
e3856d ···Send comments and questions to <emsapi-info@qualcomm.com>
00e8c6 ···
401821 ···Template for definitions supplied by translator to component manager.
35e8c6 ···
9681f3 ···This file should be modified by the translator writer
add5c1 ···to tell the component manager a couple of things it needs
a24105 ···to know about the translator itself. In general the component
c6b6dd ···manager interface is indepedent of the translator characteristics,
c4e7f1 ···but these details are needed:
d7e8c6 ···
b39323 ···* The sizeof the globals structure - because the component manager
60ecf9 ·····manages this block of storage
f0e8c6 ···
8cf100 ···* Which entry points are implemented - because we use the component
8ea628 ·····manager to determine which translation API functions are implemented.
02e8c6 ···
652dab ···This requires emsapi-mac.h (include it before you include this file)
c07fe0 */
4eaf5a
500975 /* ----------------------------------------------------------------------
77ca3e ····Declaration of structure for global storage that is shared
5efe4a ····between all translator functions. ·A handle to this is passed
82cb9a ····in as the first argument for all entry points. Allocation of this
768f7f ····is taken care of by the component manager.
33869e ····
04495d ·*/
ff69fc typedef¤struct¤ emsUserGlobalsS
76bb36 {
591d98 ¤   Component¤  ¤   ¤   self;¤  ¤   ¤   ¤   ¤   ¤   // Required!
e467c5 ¤
0faec9 ¤   ·**** ADD GLOBALS NEEDED FOR YOUR TRANSLATOR HERE AND DELETE THIS LINE·
b867d0 } emsUserGlobals;
93af5a
2daf5a
8b0975 /* ----------------------------------------------------------------------
259127 ···Defines indicating whether or not a translator supplies a
48ab63 ···function or not. ·The Eudora uses these via the component manager
d625d3 ···to determine whether these functions should be called or not.
f8495d ·*/
969004 **** SET FLAGS FOR FUNCTIONS SUPPLIED BY
424c24 YOUR TRANSLATOR HERE AND DELETE THIS LINE
63ec7e #define EMS_HAS_PLUGIN_VERSION ·····true /* Required */
85e25a #define EMS_HAS_PLUGIN_INIT ········true /* Required */
908951 #define EMS_HAS_TRANSLATOR_INFO ····true /* Required */
331fd4 #define EMS_HAS_CAN_TRANSLATE_FILE ·true·
1f31c6 #define EMS_HAS_CAN_TRANSLATE_BUF ··false
4bf4c7 #define EMS_HAS_TRANSLATE_FILE ·····true
e629cf #define EMS_HAS_TRANSLATE_BUF ······false ·
435d29 #define EMS_HAS_PLUGIN_FINISH ······true /* Required */
2eaf5a
5eaf5a
--27db 000bf95f47a40120083 Page 1 of CDecryptTranslator.cp
a70335 /*____________________________________________________________________________
b5d2e9 ¤   CDecryptTranslator.cp
2f67c5 ¤
f3c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
454b0f ¤   All rights reserved.
f767c5 ¤
d967c5 ¤
dcaf5a
3489fe ¤   $Id: CDecryptTranslator.cp,v 1.24.8.1 1998/11/12 03:06:30 heller Exp $
cef7f7 ____________________________________________________________________________*/
d2af5a
6d5a11 #include <Script.h>
0c4b15 #include <TextUtils.h>
04324c #include <string.h>
49af5a
2b2f8d #include "pgpErrors.h"
3dc110 #include "pgpMacMemory.h"
76bbf4 #include "MacFiles.h"
519da1 #include "CDecryptTranslator.h"
b7e6f3 #include "TranslatorIDs.h"
a12bcf #include "MyMIMEUtils.h"
47034d #include "PluginLibUtils.h"
88bbc6 #include "TranslatorUtils.h"
9376fd #include "TranslatorStrings.h"
37e001 #include "PassphraseCache.h"
fd1ef8 #include "SignatureStatusMessage.h"
e4f8d2 #include "PGPSharedEncryptDecrypt.h"
90af5a
3faf5a
ded6fb ¤   PluginError
0a3382 CDecryptTranslator::CanTranslate(
7c711e ¤   long¤   ¤   ¤   ¤   transContext,
562b93 ¤   emsMIMETypeHandle¤  inMimeTypeHandle,
08ab24 ¤   const FSSpec *¤ ¤   inFSp,
3aceaf ¤   StringHandle**¤ ¤   addressesHandle,
4b0ca5 ¤   long *¤ ¤   ¤   ¤   aprox_len,
fb1d18 ¤   StringHandle *¤ ¤   errorMessage,
2637b0 ¤   long *¤ ¤   ¤   ¤   result_code)
0bbb36 {
d17a11 ¤   PluginError¤err¤= EMSR_CANT_TRANS;
9a67c5 ¤
0bd095 ¤   (void)inFSp;
6e87bf ¤   (void)addressesHandle;
87cd59 ¤   (void)aprox_len;
08073c ¤   (void)result_code;
d3cd0c ¤   InitPtrToNil( errorMessage );
3867c5 ¤
b93148 ¤   err¤= CanTranslateMIMEType( transContext, inMimeTypeHandle,
71f2d5 ¤   ¤   ¤   "\pmultipart", "\pencrypted", "\papplication/pgp-encrypted");
2d67c5 ¤
fbaf5a
b5deb7 ¤   return( err );
d5efe6 }
d2af5a
aaaf5a
0ad6fb ¤   PluginError
51a6dd CDecryptTranslator::TranslateFile(
7d711e ¤   long¤   ¤   ¤   ¤   transContext,
774bc2 ¤   ConstemsMIMETypeHandle¤ inMIMETypeHandle,
cd7519 ¤   const FSSpec *¤ ¤   inSpec,
e5ceaf ¤   StringHandle**¤ ¤   addressesHandle,
4c8bae ¤   emsMIMETypeHandle*¤ outMIMETypeHandlePtr,
6bb53e ¤   const FSSpec *¤ ¤   outSpec,
d42d73 ¤   StringHandle*¤  ¤   returnedMessage,
dce27b ¤   StringHandle*¤  ¤   errorMessage,
e361be ¤   long *¤ ¤   ¤   ¤   resultCode)
0fbb36 {
3e865f ¤   CComboError¤¤   err;
c9c389 ¤   FInfo¤  ¤   ¤   fInfo;
a1af5a
47ae41 ¤   (void)transContext;
bff7f6 ¤   (void)inMIMETypeHandle;
--f932 0008117a03940120083 Page 2 of CDecryptTranslator.cp
af87bf ¤   (void)addressesHandle;
8167c5 ¤
020b6b ¤   DecryptVerifyEventHandlerData¤  eventData(this);
df67c5 ¤
84a93f ¤   InitPtrToNil( outMIMETypeHandlePtr );
1cd1f6 ¤   InitPtrToNil( returnedMessage );
03cd0c ¤   InitPtrToNil( errorMessage );
4d9e7e ¤   if ( IsntNull( resultCode ) )
b9fe61 ¤   ¤   *resultCode¤= EMSR_OK;
3967c5 ¤
22466d ¤   FSpGetFInfo( outSpec, &fInfo );
bc6092 ¤   (void)FSpDelete( outSpec );
1567c5 ¤
042bab ¤   err.pgpErr¤ = LoadDefaultKeySet( FALSE );
a8ed80 ¤   if ( err.IsntError() )
5ec7a1 ¤   {
cd66b6 ¤   ¤   PGPContextRef¤  c¤  = mContext;
238844 ¤   ¤   PGPKeySetRef¤   newKeysSet;
ee1b52 ¤   ¤
a5c734 ¤   ¤   err.pgpErr = PGPNewKeySet( c, &newKeysSet );
e65a9f ¤   ¤   if( err.IsntError() )
66ed49 ¤   ¤   {¤
b62220 ¤   ¤   ¤   err.pgpErr¤ = PGPDecode( c,
78465d ¤   ¤   ¤   ¤   PGPOInputFileFSSpec( c, inSpec ),
038c04 ¤   ¤   ¤   ¤   PGPOOutputFileFSSpec( c, outSpec ),
2fa77a ¤   ¤   ¤   ¤   PGPOEventHandler( c, sPGPDecodeEventHandler, &eventData ),
010cc2 ¤   ¤   ¤   ¤   PGPOSendNullEvents( c, TRUE ),
475c7a ¤   ¤   ¤   ¤   PGPOKeySetRef( c, mKeySet ),
4e7400 ¤   ¤   ¤   ¤   PGPOImportKeysTo( c, newKeysSet ),
4a83d5 ¤   ¤   ¤   ¤   PGPOLastOption(c)
5fc29e ¤   ¤   ¤   ¤   );
ea51f7 ¤   ¤   ¤   if ( err.IsError() )
36f776 ¤   ¤   ¤   {
eef0b5 ¤   ¤   ¤   ¤   gDecryptionPassphraseCache->Forget();
d2a3a6 ¤   ¤   ¤   }
7787c7 ¤   ¤   ¤
0b8f55 ¤   ¤   ¤   if( err.IsntError() &&
02d61b ¤   ¤   ¤   ¤   PGPKeySetRefIsValid( eventData.mClientHandlerData.newKeySet ) )
4ff776 ¤   ¤   ¤   {
fc2f86 ¤   ¤   ¤   ¤   err.pgpErr = PGPAddKeys(eventData.mClientHandlerData.newKeySet,
91e66d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeysSet );
c982e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
7c72c3 ¤   ¤   ¤   ¤   {
97699e ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPCommitKeyRingChanges( newKeysSet );
532613 ¤   ¤   ¤   ¤   }
d4a3a6 ¤   ¤   ¤   }
a9af5a
d16d97 ¤   ¤   ¤   if( err.IsntError() )
9df776 ¤   ¤   ¤   {
d5cc1d ¤   ¤   ¤   ¤   PGPUInt32¤  numNewKeys;
00af73 ¤   ¤   ¤   ¤   PGPError¤   tempErr;
7a2b85 ¤   ¤   ¤   ¤
9cea08 ¤   ¤   ¤   ¤   tempErr = PGPCountKeys( newKeysSet, &numNewKeys );
073ff4 ¤   ¤   ¤   ¤   if( IsntPGPError( tempErr ) && numNewKeys > 0 )
6a72c3 ¤   ¤   ¤   ¤   {
21f9fc ¤   ¤   ¤   ¤   ¤   // Offer to import the keys
bd6878 ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   importSet;
994fac ¤   ¤   ¤   ¤   ¤   char¤   ¤   ¤   prompt[256];
5aae30 ¤   ¤   ¤   ¤   ¤
e43ac3 ¤   ¤   ¤   ¤   ¤   GetIndCString( prompt, kTranslatorStringsRID,
c0a42d ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSelectiveImportAfterSendPromptStrIndex );
d6ae30 ¤   ¤   ¤   ¤   ¤
88c69f ¤   ¤   ¤   ¤   ¤   tempErr = PGPSelectKeysDialog( c,
4249b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation, prompt,
7a79b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeysSet, mKeySet, &importSet );
a8ae30 ¤   ¤   ¤   ¤   ¤
12e794 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( tempErr ) )
6b4859 ¤   ¤   ¤   ¤   ¤   {
ac9fa8 ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPSharedAddKeysToDefaultKeyring( importSet );
4d6449 ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( importSet );
8d1c89 ¤   ¤   ¤   ¤   ¤   }
812613 ¤   ¤   ¤   ¤   }
--8463 000bc3768d440120083 Page 3 of CDecryptTranslator.cp
cfa3a6 ¤   ¤   ¤   }
ccaf5a
ac5949 ¤   ¤   ¤   PGPFreeKeySet( newKeysSet );
fe0fe4 ¤   ¤   }
3e9371 ¤   }
2067c5 ¤
064bfd ¤   // we deleted the resource fork.
1679a0 ¤   // This makes Eudora unhappy. ·Recreate one.
0b5bab ¤   (void)FSpCreateResFile( outSpec,
988a9d ¤   ¤   fInfo.fdCreator, fInfo.fdType, smSystemScript );
9faf5a
c0fff4 ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), inSpec,
c2b72e ¤   ¤   ¤   ¤   "\pDecryptIn" );
88895f ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), outSpec,
3f914c ¤   ¤   ¤   ¤   "\pDecryptOut" );
2267c5 ¤
f2ed80 ¤   if ( err.IsntError() )
08c7a1 ¤   {
160603 ¤   ¤   pgpAssert( IsntNull( resultCode ) );
e935dc ¤   ¤   pgpAssert( IsntNull( returnedMessage ) );
ff1b52 ¤   ¤
3dcf7d ¤   ¤   if ( ! eventData.mHaveSignatureData )
805b34 ¤   ¤   {
6d721e ¤   ¤   ¤   *resultCode¤= EMSR_OK;
720fe4 ¤   ¤   }
840e1d ¤   ¤   else
2c5b34 ¤   ¤   {
65113f ¤   ¤   ¤   PGPEventSignatureData const *¤  sigData;
b387c7 ¤   ¤   ¤
b0b78b ¤   ¤   ¤   sigData¤= &eventData.mSignatureData.sigData;
874cfe ¤   ¤   ¤   *resultCode¤= SignatureDataToEudoraResult( sigData );
c2af5a
398821 ¤   ¤   ¤   if ( IsntNull( returnedMessage ) )
dff776 ¤   ¤   ¤   {
137d18 ¤   ¤   ¤   ¤   Str255¤ ¤   statusMessage;
082b85 ¤   ¤   ¤   ¤
1439f2 ¤   ¤   ¤   ¤   GetSignatureStatusMessage( &eventData.mSignatureData,
22dbc8 ¤   ¤   ¤   ¤   ¤   statusMessage );
41bba6 ¤   ¤   ¤   ¤   *returnedMessage¤   = NewString( statusMessage );
a0a3a6 ¤   ¤   ¤   }
350fe4 ¤   ¤   }
779371 ¤   }
fc67c5 ¤
ecd745 ¤   // parse the output to figure out what the MIME type is
c2ad7a ¤   pgpAssertAddrValid( outMIMETypeHandlePtr, emsMIMETypeHandle );
69e2a3 ¤   ParseFileForMIMEType( outSpec, outMIMETypeHandlePtr );
3267c5 ¤
b767c5 ¤
57ed80 ¤   if ( err.IsntError() )
e1c7a1 ¤   {
bcefba ¤   ¤   RememberDecryptionPassBuffer( eventData.mClientHandlerData.passBuffer,
9ef912 ¤   ¤   ¤   ¤   eventData.mClientHandlerData.decryptionKey );
329371 ¤   }
9b0e24 ¤   else
23c7a1 ¤   {
14118a ¤   ¤   gDecryptionPassphraseCache->Forget();
2f07f5 ¤   ¤   ReportError( err );
689371 ¤   }
ca1b52 ¤   ¤
5167c5 ¤
75d3ba ¤   return( CComboErrorToEudoraError( err ) );
9eefe6 }
15af5a
5eaf5a
0faf5a
74af5a
38af5a
98af5a
7baf5a
35af5a
51af5a
bcaf5a
--cea6 001e0d5e91e40120083 Page 4 of CDecryptTranslator.cp
e0af5a
--209a 00134a3791740120084 Page 1 of CDecryptTranslator.h
a70335 /*____________________________________________________________________________
c79843 ¤   CDecryptTranslator.c
ec67c5 ¤
7cc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
7a4b0f ¤   All rights reserved.
6267c5 ¤
1967c5 ¤
aeaf5a
d5952e ¤   $Id: CDecryptTranslator.h,v 1.6.8.1 1998/11/12 03:06:30 heller Exp $
3ff7f7 ____________________________________________________________________________*/
137b7d #pragma once
36af5a
86af5a
691ee8 #include "CTranslator.h"
f6af5a
5aaf5a
502be2 class CCachePassphrase;
5c1d63 struct PGPKeySpec;
12af5a
05d30e class CDecryptTranslator : public CTranslator
c8bb36 {
1e5ed4 public:
d867c5 ¤
feb041 ¤   ¤   ¤   ¤   ¤   ¤   CDecryptTranslator( PGPContextRef context,
7731d1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
97dbf5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsProgress progressHook)
f1abfe ¤   ¤   ¤   ¤   ¤   ¤   ¤   : CTranslator( context, tlsContext, progressHook)
4f3f7b ¤   ¤   ¤   ¤   ¤   ¤   {}
4494aa ¤   ¤   ¤   ¤   ¤   ¤
fab306 ¤   virtual PluginError¤CanTranslate( long ransContext,
a4ed9c ¤   ¤   ¤   ¤   ¤   ¤   emsMIMETypeHandle inMimeTypeHandle,
69cc74 ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec *¤ inFSp, StringHandle** addressesHandle,
2c5b31 ¤   ¤   ¤   ¤   ¤   ¤   long * aprox_len, StringHandle* errorMessage,
2bb22e ¤   ¤   ¤   ¤   ¤   ¤   long * result_code);
6094aa ¤   ¤   ¤   ¤   ¤   ¤
f394aa ¤   ¤   ¤   ¤   ¤   ¤
7be4f8 ¤   virtual PluginError¤TranslateFile( long transContext,·
c1916e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstemsMIMETypeHandle InMIMEtypeHandle,
fe4e30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * inFSp,
26357e ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle** addressesHandle,
847aec ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsMIMETypeHandle *¤outMIMEtypeHandlePtr,
abe6c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * outFSp,
03cfc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* returnedMessage,
c58f0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* errorMessage, long * resultCode);
ea67c5 ¤
3482f7 };
--1651 000fe47d93440120085 Page 1 of CEncryptTranslator.cp
a70335 /*____________________________________________________________________________
1846b8 ¤   CEncryptTranslator.cp
3467c5 ¤
b8c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
f44b0f ¤   All rights reserved.
9b67c5 ¤
1567c5 ¤
0baf5a
64c25e ¤   $Id: CEncryptTranslator.cp,v 1.25.2.1.2.1 1998/11/12 03:06:31 heller Exp $
8af7f7 ____________________________________________________________________________*/
5c324c #include <string.h>
7daf5a
4e2f8d #include "pgpErrors.h"
8aa076 #include "pgpKeys.h"
af85c2 #include "MacStrings.h"
83c110 #include "pgpMacMemory.h"
85bbf4 #include "MacFiles.h"
172bcf #include "MyMIMEUtils.h"
8ae6f3 #include "TranslatorIDs.h"
20bbc6 #include "TranslatorUtils.h"
c88c5b #include "CPGPFree.h"
dc9413 #include "TranslatorFactory.h"
c78e25 #include "pgpVersionHeader.h"
1eaf5a
0709f0 #include "CEncryptTranslator.h"
4daf5a
70af5a
dcc91b CEncryptTranslator::CEncryptTranslator(
72a1bc ¤   PGPContextRef¤  ¤   context,
fc6c35 ¤   PGPtlsContextRef¤   tlsContext,
342e50 ¤   emsProgress¤¤   ¤   progressHook,
db6b4e ¤   CipherOutputType¤   outputType,·
3f11fa ¤   Boolean¤¤   ¤   ¤   doSign )
a48c4f ¤   : CTranslator( context, tlsContext, progressHook)
0abb36 {
0bfdf7 ¤   mOutputType¤= outputType;
0867c5 ¤
a149a7 ¤   mDoSign¤¤   = doSign;
2fefe6 }
4baf5a
acaf5a
3baf5a
1daf5a
a19221 #pragma global_optimizer on
e5af5a
38af5a
7dd6fb ¤   PluginError
21249f CEncryptTranslator::TranslateFile(
7126f7 ¤   long¤   ¤   ¤   ¤   ¤   transContext,
c56072 ¤   ConstemsMIMETypeHandle¤ inMIMEtypeHandle,
00babf ¤   const FSSpec *¤ ¤   ¤   inSpec,
e6c782 ¤   StringHandle**¤ ¤   ¤   addressesHandle,
50402a ¤   emsMIMETypeHandle *¤¤   outMIMEtypeHandlePtr,
f775cd ¤   const FSSpec *¤ ¤   ¤   outSpec,
8ee0d4 ¤   StringHandle*¤  ¤   ¤   returnedMessage,
e5cb89 ¤   StringHandle*¤  ¤   ¤   errorMessage,
4b83a3 ¤   long *¤ ¤   ¤   ¤   ¤   resultCode)
58bb36 {
96fd0a ¤   CComboError¤¤   ¤   ¤   err;
42d545 ¤   Boolean¤¤   ¤   ¤   ¤   usePGPMime¤ = ( mOutputType == kUsePGPMIME );
4aaa99 ¤   char¤   ¤   ¤   ¤   ¤   mimeDelimiter[ kPGPMimeSeparatorSize ];
909dbb ¤   PGPOptionListRef¤   ¤   options¤= kInvalidPGPOptionListRef;
655b24 ¤   PGPContextRef¤  ¤   ¤   c¤  = mContext;
5daf5a
84b8fd ¤   InitPtrToNil( outMIMEtypeHandlePtr );
f4d1f6 ¤   InitPtrToNil( returnedMessage );
3ecd0c ¤   InitPtrToNil( errorMessage );
5667c5 ¤
74ae41 ¤   (void)transContext;
7df32d ¤   (void)resultCode;
0b67c5 ¤
fefff4 ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), inSpec,
--b53c 000e06e0e6740120085 Page 2 of CEncryptTranslator.cp
a0ea5b ¤   ¤   ¤   ¤   "\pEncryptIn" );
8887c7 ¤   ¤   ¤
ed0892 ¤   if ( ! usePGPMime )
97c7a1 ¤   {
aee277 ¤   ¤   // use PGPMIME if we're processing anything other than text
39cf59 ¤   ¤   if ( ! MatchMIMEType( inMIMEtypeHandle, "\ptext", "\pplain" ) )
e85b34 ¤   ¤   {
cdd347 ¤   ¤   ¤   usePGPMime¤ = true;
d10fe4 ¤   ¤   }
3e9371 ¤   }
3767c5 ¤
0067c5 ¤
ef93e5 ¤   if ( (! usePGPMime ) &&
7a5b22 ¤   ¤   MatchMIMEType( inMIMEtypeHandle, "\ptext", "\pplain" ) )
c5c7a1 ¤   {
069ac3 ¤   ¤   // only eliminate it for plain text, not text/enriched
ab3604 ¤   ¤   err.err¤= EliminateMIMEHeader( inSpec );
509371 ¤   }
c167c5 ¤
c467c5 ¤
4eedc1 ¤   err.pgpErr¤ = PGPBuildOptionList( c, &options,
503565 ¤   ¤   PGPOOutputLineEndType( c, kPGPLineEnd_CRLF),
c43d89 ¤   ¤   PGPOLastOption(c)
5a4187 ¤   ¤   );
b61b52 ¤   ¤
a305d7 ¤   if ( err.IsntError() && usePGPMime )
d2c7a1 ¤   {
dbc7de ¤   ¤   PGPSize¤¤   mimeBodyOffset;
a61b52 ¤   ¤
2ed4ee ¤   ¤   err.pgpErr¤ = PGPAppendOptionList( options,·
c5a1f3 ¤   ¤   ¤   ¤   PGPOPGPMIMEEncoding( c, TRUE,
fc7a24 ¤   ¤   ¤   ¤   ¤   &mimeBodyOffset, mimeDelimiter ),
39f422 ¤   ¤   ¤   ¤   PGPOOmitMIMEVersion( c, TRUE),
a9219e ¤   ¤   ¤   ¤   PGPOLastOption(c) );
d39371 ¤   }
cf67c5 ¤
efed80 ¤   if ( err.IsntError() )
f8c7a1 ¤   {
938563 ¤   ¤   err¤= HandleEncryptSign( inSpec, outSpec, addressesHandle,
297ee1 ¤   ¤   ¤   ¤   mDoSign, options, true );
c59371 ¤   }
1887c7 ¤   ¤   ¤
5a6431 ¤   if ( PGPOptionListRefIsValid( options ) )
504d7f ¤   ¤   PGPFreeOptionList( options );
b767c5 ¤
1d8fb7 ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), outSpec,·
02a3e9 ¤   ¤   ¤   ¤   "\pEncryptFinalOut" );
4c1b52 ¤   ¤
a25f1f ¤   // finish up by creating appropriate MIME types and parameters
8f9dc6 ¤   // and by putting output data into appropriate format
5ded80 ¤   if ( err.IsntError() )
dbc7a1 ¤   {
8683ad ¤   ¤   ConstStringPtr¤ mimeParamValueString¤   = nil;
f91b52 ¤   ¤
df185a ¤   ¤   // put output data into appropriate format
ada3f7 ¤   ¤   if ( usePGPMime )
745b34 ¤   ¤   {
f18f9a ¤   ¤   ¤   err.err¤= BuildEncryptedPGPMIMEType( outMIMEtypeHandlePtr,
93b397 ¤   ¤   ¤   ¤   ¤   mimeDelimiter );
e60fe4 ¤   ¤   }
b70e1d ¤   ¤   else
555b34 ¤   ¤   {
bfc7a6 ¤   ¤   ¤   err.err¤= CreateMIMEType( "\ptext", "\pplain",
311988 ¤   ¤   ¤   ¤   ¤   outMIMEtypeHandlePtr );
cb0fe4 ¤   ¤   }
5f9371 ¤   }
88af5a
fdaf5a
5ef190 ¤   ReportError( err );
3467c5 ¤
ecd3ba ¤   return( CComboErrorToEudoraError( err ) );
e0efe6 }
--61e6 001933b5fe140120085 Page 3 of CEncryptTranslator.cp
e0af5a
1aaf5a
17af5a
78af5a
32af5a
93af5a
--b2a9 001a724a60940120086 Page 1 of CEncryptTranslator.h
a70335 /*____________________________________________________________________________
0840d3 ¤   CEncryptTranslator.c
a567c5 ¤
a4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
fd4b0f ¤   All rights reserved.
c267c5 ¤
6d67c5 ¤
62af5a
d66053 ¤   $Id: CEncryptTranslator.h,v 1.4.8.1 1998/11/12 03:06:32 heller Exp $
f1f7f7 ____________________________________________________________________________*/
387b7d #pragma once
f1af5a
00af5a
5a1ee8 #include "CTranslator.h"
1aaf5a
c51d63 struct PGPKeySpec;
d8af5a
df10bc class CEncryptTranslator : public CTranslator
f4bb36 {
75a2d3 protected:
41d02b ¤   CipherOutputType¤   mOutputType;
f793c8 ¤   Boolean¤¤   ¤   ¤   mDoSign;
ce67c5 ¤
ed5ed4 public:
7dbdb8 ¤   ¤   ¤   ¤   CEncryptTranslator(
ff0120 ¤   ¤   ¤   ¤   ¤   PGPContextRef¤  context, PGPtlsContextRef tlsContext,
7c53be ¤   ¤   ¤   ¤   ¤   emsProgress¤progressHook,
932da5 ¤   ¤   ¤   ¤   ¤   CipherOutputType outputType = kUseOldPGPFormat,
a8b561 ¤   ¤   ¤   ¤   ¤   Boolean doSign = false );
4f67c5 ¤
59e4f8 ¤   virtual PluginError¤TranslateFile( long transContext,·
4d916e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstemsMIMETypeHandle InMIMEtypeHandle,
114e30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * inFSp,
17357e ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle** addressesHandle,
4cf809 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsMIMETypeHandle *¤OutMIMEtypeHandlePtr,
81e6c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * outFSp,
7acfc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* returnedMessage,
0c547c ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* errorMessage,
e2ce93 ¤   ¤   ¤   ¤   ¤   ¤   ¤   long * resultCode);
a782f7 };
--5c5a 00044990a2840120087 Page 1 of CManualTranslator.cp
a70335 /*____________________________________________________________________________
c1e7bf ¤   CManualTranslator.cp
9567c5 ¤
57c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
f44b0f ¤   All rights reserved.
1967c5 ¤
2767c5 ¤
b6af5a
004694 ¤   $Id: CManualTranslator.cp,v 1.49.2.1.2.1 1998/11/12 03:06:32 heller Exp $
bbf7f7 ____________________________________________________________________________*/
f5324c #include <string.h>
6d4b15 #include <TextUtils.h>
68af5a
450d08 #include "pgpMem.h"
23c110 #include "pgpMacMemory.h"
29bbf4 #include "MacFiles.h"
ef2f8d #include "pgpErrors.h"
28af5a
e49ffc #include "CManualTranslator.h"
6dbbc6 #include "TranslatorUtils.h"
da034d #include "PluginLibUtils.h"
7de001 #include "PassphraseCache.h"
d93a2c #include "WarningAlert.h"
6b76fd #include "TranslatorStrings.h"
9b3eab #include "CWrappers.h"
68d73a #include "CSecureMemory.h"
7b1ef8 #include "SignatureStatusMessage.h"
a3771f #include "PGPSharedParse.h"
a04cfb #include "TranslatorPrefs.h"
3e6aa0 #include "pgpWordWrap.h"
ad8e25 #include "pgpVersionHeader.h"
96f8d2 #include "PGPSharedEncryptDecrypt.h"
0ea02f #include "pgpClientLib.h"
05628e #include "pgpClientErrors.h"
baaf5a
5faf5a
18b177 #if 0
41ebbb ¤   ¤   ¤   ¤   ¤   ¤   PluginError
57f5c8 ¤   ¤   ¤   ¤   ¤   CManualDecryptVerifyTranslator::TranslateFile(
9140d9 ¤   ¤   ¤   ¤   ¤   ¤   long¤   ¤   ¤   transContext,
d9dc23 ¤   ¤   ¤   ¤   ¤   ¤   ConstemsMIMETypeHandle¤ inMIMEtypeHandle,
fc3f88 ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec *¤ inSpec,
952962 ¤   ¤   ¤   ¤   ¤   ¤   StringHandle**¤ addressesHandle,¤   ¤   // nil for manu¶
f2945f al translators
bec190 ¤   ¤   ¤   ¤   ¤   ¤   emsMIMETypeHandle*¤ outMIMETypeHandlePtr,// nil for man¶
4b4ea6 ual translators
e73074 ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec *¤ outSpec,
94ccff ¤   ¤   ¤   ¤   ¤   ¤   StringHandle*¤  returnedMessage,¤   ¤   // nil for manu¶
78945f al translators
e69924 ¤   ¤   ¤   ¤   ¤   ¤   StringHandle*¤  errorMessage,
8e03b8 ¤   ¤   ¤   ¤   ¤   ¤   long *¤ ¤   ¤   resultCode
2e6fab ¤   ¤   ¤   ¤   ¤   ¤   )
a14859 ¤   ¤   ¤   ¤   ¤   {
063769 ¤   ¤   ¤   ¤   ¤   ¤   CComboError¤¤   err;
a0f0f3 ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   reportedError¤  = false;
feef3e ¤   ¤   ¤   ¤   ¤   ¤   DecryptVerifyEventHandlerData¤  eventData( this );
7794aa ¤   ¤   ¤   ¤   ¤   ¤
9c33b5 ¤   ¤   ¤   ¤   ¤   ¤   (void)transContext;
84af87 ¤   ¤   ¤   ¤   ¤   ¤   (void)inMIMEtypeHandle;
e5c1cf ¤   ¤   ¤   ¤   ¤   ¤   (void)addressesHandle;
8b94aa ¤   ¤   ¤   ¤   ¤   ¤
5b90b2 ¤   ¤   ¤   ¤   ¤   ¤   InitPtrToNil( outMIMETypeHandlePtr );
b9bc16 ¤   ¤   ¤   ¤   ¤   ¤   InitPtrToNil( returnedMessage );
07c66b ¤   ¤   ¤   ¤   ¤   ¤   InitPtrToNil( errorMessage );
a294aa ¤   ¤   ¤   ¤   ¤   ¤
f99519 ¤   ¤   ¤   ¤   ¤   ¤   if ( IsntNull( resultCode ) )
61748b ¤   ¤   ¤   ¤   ¤   ¤   ¤   *resultCode¤= EMSR_OK;
dfaf5a
927737 ¤   ¤   ¤   ¤   ¤   ¤   void *¤ ¤   ¤   inBuffer¤   = NULL;
073cc9 ¤   ¤   ¤   ¤   ¤   ¤   ulong¤  ¤   ¤   inBufferSize;
7e87ca ¤   ¤   ¤   ¤   ¤   ¤   ulong¤  ¤   ¤   blockStart;
44fd0d ¤   ¤   ¤   ¤   ¤   ¤   ulong¤  ¤   ¤   blockSize;
--2448 0003d8dfd8f40120087 Page 2 of CManualTranslator.cp
123fce ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   newKeysSet = kInvalidPGPKeySetRef;
9e94aa ¤   ¤   ¤   ¤   ¤   ¤
da568a ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   isEncrypted¤= false;
f66d98 ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   isSigned¤   = false;
ab94aa ¤   ¤   ¤   ¤   ¤   ¤
6fa052 ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPNewKeySet( mContext, &newKeysSet );
4c87cf ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
bf8fec ¤   ¤   ¤   ¤   ¤   ¤   {
a2b392 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.err¤= FSpReadFileIntoBuffer( inSpec, &inBuffer,¶
ac6bd7 ·&inBufferSize );
7f7342 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
9a06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
cc9f89 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( FindEncryptedBlock( inBuffer,
029eea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inBufferSize, &blockStart, &blockSize )¶
625d36 ·)
bf31b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
e33eb7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isEncrypted¤= true;
c06560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
a36368 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else if ( FindSignedBlock( inBuffer,
e69c31 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inBufferSize, &blockStart, &blockSi¶
3925c6 ze ) )
fa31b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
d6ff2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isSigned¤   = true;
916560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
d6da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
5463b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( ! ( isSigned || isEncrypted ) )
a531b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
9269a6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   WarningAlert( kWANoteAlertType, kWAOKStyle,
766785 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kTranslatorErrorStringsResID,
cc8006 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMessageIsNotEncryptedStrIndex);
728a79 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr¤ = kPGPError_UnknownError;
313c35 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   reportedError¤  = true;
eb6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
535268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
7adb3c ¤   ¤   ¤   ¤   ¤   ¤   }
daabf0 ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
298fec ¤   ¤   ¤   ¤   ¤   ¤   {
9f82d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr¤ = LoadDefaultKeySet( FALSE );
a8db3c ¤   ¤   ¤   ¤   ¤   ¤   }
0194aa ¤   ¤   ¤   ¤   ¤   ¤
a0e6de ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() && isEncrypted )
de8fec ¤   ¤   ¤   ¤   ¤   ¤   {
baba1c ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *¤ ¤   ¤   outputData¤ = NULL;
83b0c6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤¤   ¤   outputDataSize;
39531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
814220 ¤   ¤   ¤   ¤   ¤   ¤   ¤   do
7d06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
f37e26 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPContextRef¤  c¤  = mContext;
1894aa ¤   ¤   ¤   ¤   ¤   ¤
7df52d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr¤ = PGPDecode( c,¤
ab4ecc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOInputBuffer( c,
f77a3b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &((const char *)inBuffer)[ blockSta¶
8721e6 rt ], blockSize),
7cc072 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOAllocatedOutputBuffer( c,
22d63b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &outputData, MAX_PGPSize, &outputDa¶
3ecc15 taSize ),
126560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOOutputLineEndType( c, kPGPLineEnd_C¶
02568c R),
51cd0e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEventHandler( c, sPGPEventHandler, ¶
528b30 &eventData ),
67e65f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOSendNullEvents( c, 10 ),
7d4416 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeySetRef( c, mKeySet ),
2d2c25 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOImportKeysTo( c, newKeysSet ),
7cb30e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c )
5bcc7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   );
f6139d ¤   ¤   ¤   ¤   ¤   ¤   ¤   } while ( err.pgpErr == kPGPError_BadPassphrase );
c1531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
fc7342 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
7806b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
f68cd2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short¤  fileRef;
f8da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
3da0e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // write out:
--33be 000c02585c040120087 Page 3 of CManualTranslator.cp
e86689 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   //¤ - data preceeding encrypted block
579007 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   //¤ - signing information (if any)
a570e4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   //¤ - decrypted data
d3e6ff ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   //¤ - data following encrypted block
7635bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.err¤= FSpOpenDF( outSpec, fsRdWrPerm, &file¶
26a14f Ref );
856265 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
a731b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
ff0441 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   long¤   count;
e0af5a
57f902 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   count¤  = blockStart;
b7ace3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.err¤= FSWrite( fileRef, &count, inBuffe¶
ffee5d r );
2b43e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() ·&&
4e832b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   eventData.mHaveSignatureData )
b1dec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
ec8098 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ signatureStatusString;
531566 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   long¤   count;
970230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
febf66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetSignatureStatusMessage( &eventData.m¶
e26db1 SignatureData,
84f11e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signatureStatusString );
064758 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   AppendPString( "\p\r", signatureStatusS¶
ae75db tring );
1f0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
6ce987 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   count¤  = StrLength( signatureStatusStr¶
7727e6 ing );
7bdd7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.err¤= FSWrite( fileRef,
919746 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &count, &signatureStatusString[¶
6092ab ·1 ] );
ec8a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
dc655e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
e3dec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
4c1796 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   count¤  = outputDataSize;
6e6e2a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.err¤= FSWrite( fileRef, &count, out¶
a4e6c5 putData );
a28a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
38655e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
c7dec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
6000bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const char *¤   data¤   =
987a3b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &((const char *)inBuffer)[ blockSta¶
74e020 rt + blockSize ];
9a3ede ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
2349d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   count¤  = inBufferSize - ( blockStart +¶
82fe08 ·blockSize );
ebba0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.err¤¤   = FSWrite( fileRef, &count,¶
b9496b ·data );
668a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
12ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
de1c92 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FSClose( fileRef );
ec6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
94da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
2498e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() &&
6740a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRefIsValid( eventData.mClientHandl¶
636d4f erData.newKeySet ) )
1931b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
b734c1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPAddKeys(eventData.mClientHa¶
8cbed5 ndlerData.newKeySet,
f70021 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeysSet );
016587 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
52dec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
001033 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPCommitKeyRingChanges( n¶
4d8213 ewKeysSet );
9f8a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
eb6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
99da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
1b4a6b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeData( outputData );
cb614a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outputData¤ = NULL;
745268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
9e94aa ¤   ¤   ¤   ¤   ¤   ¤
da7342 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
c006b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
--c849 0005c21acf940120087 Page 4 of CManualTranslator.cp
080e3c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   RememberDecryptionPassBuffer(
ceeaa1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   eventData.mClientHandlerData.passBuffer,
45b91d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   eventData.mClientHandlerData.decryption¶
068b03 Key );
2e5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
15c4dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
3a06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
a2b211 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   gDecryptionPassphraseCache->Forget( );
075268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
d9db3c ¤   ¤   ¤   ¤   ¤   ¤   }
4cf16c ¤   ¤   ¤   ¤   ¤   ¤   else if ( err.IsntError() ·&& isSigned )
e08fec ¤   ¤   ¤   ¤   ¤   ¤   {
fbba3a ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPContextRef¤  c¤  = mContext;
9894aa ¤   ¤   ¤   ¤   ¤   ¤
6fd398 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr¤ = PGPDecode( c,¤
21c19b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOInputBuffer( c,
aee0d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &((const char *)inBuffer)[ blockStart ]¶
92309b , blockSize),
b2348b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPODiscardOutput( c, TRUE ),
1d70a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOOutputLineEndType( c, kPGPLineEnd_CR),
dff512 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEventHandler( c, sPGPEventHandler, &eve¶
edaf84 ntData ),
416c1a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOSendNullEvents( c, 10 ),
37ce53 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeySetRef( c, mKeySet ),
23fc8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOImportKeysTo( c, newKeysSet ),
1b3c59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c )
33c232 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   );
a5531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
bf7342 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
aa06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
5a8cd2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short¤  fileRef;
6dda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
be65cf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssert( eventData.mHaveSignatureData );
2fda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
cda0e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // write out:
ef7205 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   //¤ - our verification info
dd46ae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   //¤ - original data
e935bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.err¤= FSpOpenDF( outSpec, fsRdWrPerm, &file¶
27a14f Ref );
9a6265 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
8231b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
71b999 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   signingMessage;
b0207d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   long¤   ¤   count;
28ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
97ec44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetSignatureStatusMessage( &eventData.mSign¶
3e4483 atureData,
7eb3a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signingMessage );
40b09e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   AppendPString( "\p\r", signingMessage );
27ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
11b54c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   count¤  = StrLength( signingMessage );
16a395 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.err¤= FSWrite( fileRef, &count, &signin¶
5e9c54 gMessage[ 1 ] );
312986 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError( ) )
16dec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
bd8022 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   long¤   count¤  = inBufferSize;
c40230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
3a0671 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.err¤= FSWrite( fileRef, &count, inB¶
a1d345 uffer );
9e8a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
a21c92 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FSClose( fileRef );
816560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
17af5a
8f98e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() &&
5640a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRefIsValid( eventData.mClientHandl¶
046d4f erData.newKeySet ) )
8731b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
4334c1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPAddKeys(eventData.mClientHa¶
0abed5 ndlerData.newKeySet,
7e0021 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeysSet );
ef6587 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
88dec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
5c1033 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPCommitKeyRingChanges( n¶
--20b4 000535d253140120087 Page 5 of CManualTranslator.cp
f28213 ewKeysSet );
228a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
af6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
515268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
6ddb3c ¤   ¤   ¤   ¤   ¤   ¤   }
8194aa ¤   ¤   ¤   ¤   ¤   ¤
2e4b89 ¤   ¤   ¤   ¤   ¤   ¤   if ( IsntNull( inBuffer ) )
5c8fec ¤   ¤   ¤   ¤   ¤   ¤   {
dc6211 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpFreeMac( inBuffer );
f7dec9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   inBuffer¤   = nil;
3adb3c ¤   ¤   ¤   ¤   ¤   ¤   }
fb531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
73121d ¤   ¤   ¤   ¤   ¤   ¤   // important: if we got an error, we must make sure tha¶
057f25 t the output
d39435 ¤   ¤   ¤   ¤   ¤   ¤   // is the same as the input or Eudora will grab whateve¶
da7cd4 r crap
9bb83d ¤   ¤   ¤   ¤   ¤   ¤   // we put into it.
1f4c75 ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsError() )·
6b8fec ¤   ¤   ¤   ¤   ¤   ¤   {
3f42dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void)FSpCopyFiles( PGPGetContextMemoryMgr( mContex¶
e10d5c t ),
b8851b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inSpec, outSpec );
80db3c ¤   ¤   ¤   ¤   ¤   ¤   }
aeaf5a
0a87cf ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
9a8fec ¤   ¤   ¤   ¤   ¤   ¤   {
a6ca6a ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  numNewKeys;
f0febb ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPError¤   tempErr;
39531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
17c408 ¤   ¤   ¤   ¤   ¤   ¤   ¤   tempErr = PGPCountKeys( newKeysSet, &numNewKeys );
1157e4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( tempErr ) && numNewKeys > 0 )
b806b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
4ab546 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Offer to import the keys
cea6d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   importSet;
1f5531 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   char¤   ¤   ¤   prompt[256];
e4da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
ba401c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetIndCString( prompt, kTranslatorStringsRID,
db5f9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSelectiveImportAfterSendPromptStrIndex¶
c354c8 ·);
36da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
492959 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tempErr = PGPSelectKeysDialog( mContext,
f3a490 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation, prompt,
e2a91c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeysSet, mKeySet, &importSet );
67da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
37a8e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( tempErr ) )
3831b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
95155e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPSharedAddKeysToDefaultKeyring( im¶
e67919 portSet );
d4fadb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( importSet );
586560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
c35268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
69db3c ¤   ¤   ¤   ¤   ¤   ¤   }
dfaf5a
e0ebf9 ¤   ¤   ¤   ¤   ¤   ¤   if ( ! reportedError )
398fec ¤   ¤   ¤   ¤   ¤   ¤   {
327434 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ReportError( err );
7adb3c ¤   ¤   ¤   ¤   ¤   ¤   }
ed94aa ¤   ¤   ¤   ¤   ¤   ¤
0adfc9 ¤   ¤   ¤   ¤   ¤   ¤   if( PGPKeySetRefIsValid( newKeysSet ) )
923144 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( newKeysSet );
2f531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
fc900a ¤   ¤   ¤   ¤   ¤   ¤   return( CComboErrorToEudoraError( err ) );
a11c89 ¤   ¤   ¤   ¤   ¤   }
b1db21 #else
b5af5a
afc744 ¤   PGPError
81f6ac CManualDecryptVerifyTranslator::PGPDecodeEventHandler(
24284d ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   context,
28b33b ¤   PGPEvent *¤ ¤   ¤   ¤   ¤   ¤   event,
656306 ¤   DecryptVerifyEventHandlerData *¤data)
0fcebb {¤
53b8e5 ¤   CComboError¤err;
--85cf 0002a2c945440120087 Page 6 of CManualTranslator.cp
2a67c5 ¤
0ea505 ¤   switch( event->type )
edc7a1 ¤   {
866773 ¤   ¤   case kPGPEvent_OutputEvent:
505b34 ¤   ¤   {
dbd533 ¤   ¤   ¤   if( event->data.outputData.forYourEyesOnly && ( data->mFYEOData == ¶
3ffe1e nil ) )
1af776 ¤   ¤   ¤   {
26d290 ¤   ¤   ¤   ¤   SInt32¤ eof;
162b85 ¤   ¤   ¤   ¤
3152d3 ¤   ¤   ¤   ¤   err.err = ::SetFPos( data->mOutputFileRef, fsFromStart, 0 );
3e3424 ¤   ¤   ¤   ¤   if ( err.IsntError() )
aa72c3 ¤   ¤   ¤   ¤   {
b3d1af ¤   ¤   ¤   ¤   ¤   err.err = ::GetEOF( data->mOutputFileRef, &eof );
d92613 ¤   ¤   ¤   ¤   }
dc2b85 ¤   ¤   ¤   ¤
da3424 ¤   ¤   ¤   ¤   if ( err.IsntError() )
4572c3 ¤   ¤   ¤   ¤   {
2101a1 ¤   ¤   ¤   ¤   ¤   data->mFYEOData = (char *) PGPNewSecureData( PGPGetContextM¶
2e2940 emoryMgr( context ),
0e0eb0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·eof + 1,
67ea13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·kPGPMemoryMgrF¶
4273b4 lags_None );
9d6350 ¤   ¤   ¤   ¤   ¤   if ( IsNull( data->mFYEOData ) )
5c4859 ¤   ¤   ¤   ¤   ¤   {
340133 ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = kPGPError_OutOfMemory;
e61c89 ¤   ¤   ¤   ¤   ¤   }
ab2613 ¤   ¤   ¤   ¤   }
e02b85 ¤   ¤   ¤   ¤
c83424 ¤   ¤   ¤   ¤   if ( err.IsntError() )
f372c3 ¤   ¤   ¤   ¤   {
cb7640 ¤   ¤   ¤   ¤   ¤   data->mFYEOData[eof] = 0;
3c766c ¤   ¤   ¤   ¤   ¤   err.err = ::FSRead( data->mOutputFileRef, &eof, data->mFYEO¶
68da03 Data );
042613 ¤   ¤   ¤   ¤   }
5ea3a6 ¤   ¤   ¤   }
cd0fe4 ¤   ¤   }
d52f68 ¤   ¤   break;
8a1b52 ¤   ¤
151b52 ¤   ¤
a2cb7a ¤   ¤   case kPGPEvent_EndLexEvent:
a95b34 ¤   ¤   {
b2465f ¤   ¤   ¤   if( data->mClientHandlerData.outputBufferSize != 0 )
bdf776 ¤   ¤   ¤   {
638eab ¤   ¤   ¤   ¤   long¤   count;
c41ead ¤   ¤   ¤   ¤   Str255¤ str;
fb6429 ¤   ¤   ¤   ¤   short¤  strIndex;
e0af5a
53a544 ¤   ¤   ¤   ¤   if( data->mClientHandlerData.signatureDataValid )
0e72c3 ¤   ¤   ¤   ¤   {
01243c ¤   ¤   ¤   ¤   ¤   GetSignatureStatusMessage(&data->mSignatureData,
eec2df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   str );
feae30 ¤   ¤   ¤   ¤   ¤
8bfabe ¤   ¤   ¤   ¤   ¤   count = StrLength( str );
121ef4 ¤   ¤   ¤   ¤   ¤   if ( IsntNull( data->mFYEOData ) )
524859 ¤   ¤   ¤   ¤   ¤   {
8fc317 ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤newSize = strlen( data->mFYEOData ) + count + 1;
3a94aa ¤   ¤   ¤   ¤   ¤   ¤
cd148c ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPReallocData( PGPGetContextMemoryMgr( co¶
5ee90b ntext ),
3a25fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·&data->mFYEOData,
91e3d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·newSize,
d988e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·kPGPMemoryMgrFlags_None );
fdabf0 ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
158fec ¤   ¤   ¤   ¤   ¤   ¤   {
8a3930 ¤   ¤   ¤   ¤   ¤   ¤   ¤   strncat( data->mFYEOData, (char * ) &str[1], count ¶
306275 );
dc9ab5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->mFYEOData[newSize - 1] = 0;
34db3c ¤   ¤   ¤   ¤   ¤   ¤   }
101c89 ¤   ¤   ¤   ¤   ¤   }
774bd6 ¤   ¤   ¤   ¤   ¤   else
2a4859 ¤   ¤   ¤   ¤   ¤   {
--7965 000aad280bc40120087 Page 7 of CManualTranslator.cp
c15abd ¤   ¤   ¤   ¤   ¤   ¤   err.err = FSWrite( data->mOutputFileRef,
b096ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &count, &str[1] );
ef1c89 ¤   ¤   ¤   ¤   ¤   }
f1be0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
b14859 ¤   ¤   ¤   ¤   ¤   {
6ab9ff ¤   ¤   ¤   ¤   ¤   ¤   if( data->mClientHandlerData.sectionType ==
48282b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPAnalyze_Encrypted )
408fec ¤   ¤   ¤   ¤   ¤   ¤   {
83a72a ¤   ¤   ¤   ¤   ¤   ¤   ¤   strIndex = kBeginDecryptedVerifiedMsgStrIndex;
74db3c ¤   ¤   ¤   ¤   ¤   ¤   }
437f8b ¤   ¤   ¤   ¤   ¤   ¤   else
d68fec ¤   ¤   ¤   ¤   ¤   ¤   {
a74f9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   strIndex = kBeginVerifiedMsgStrIndex;
b9db3c ¤   ¤   ¤   ¤   ¤   ¤   }
6094aa ¤   ¤   ¤   ¤   ¤   ¤
a85f26 ¤   ¤   ¤   ¤   ¤   ¤   GetIndString( str, kTranslatorStringsRID,
313e00 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   strIndex );
8f94aa ¤   ¤   ¤   ¤   ¤   ¤
98b580 ¤   ¤   ¤   ¤   ¤   ¤   count = StrLength( str );
fd19cf ¤   ¤   ¤   ¤   ¤   ¤   if ( IsntNull( data->mFYEOData ) )
298fec ¤   ¤   ¤   ¤   ¤   ¤   {
1f8e0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤newSize = strlen( data->mFYEOData ) + count¶
ab57af ·+ 1;
c4531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
dd7652 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPReallocData( PGPGetContextMemoryMgr¶
58db5d ( context ),
49f550 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·&data->mFYEOData,
7c5fcb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·newSize,
491884 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·kPGPMemoryMgrFlags_Non¶
8e6ac1 e );
457342 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
1c06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
bf7614 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   strncat( data->mFYEOData, (char *) &str[1], cou¶
6a6bd6 nt );
b326ac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->mFYEOData[newSize - 1] = 0;
245268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
49db3c ¤   ¤   ¤   ¤   ¤   ¤   }
a27f8b ¤   ¤   ¤   ¤   ¤   ¤   else
0b8fec ¤   ¤   ¤   ¤   ¤   ¤   {
2cd0f8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.err = FSWrite( data->mOutputFileRef,
3e879d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &count, &str[1] );
80db3c ¤   ¤   ¤   ¤   ¤   ¤   }
cc1c89 ¤   ¤   ¤   ¤   ¤   }
f02613 ¤   ¤   ¤   ¤   }
3c2b85 ¤   ¤   ¤   ¤
8882e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
7d72c3 ¤   ¤   ¤   ¤   {
869b66 ¤   ¤   ¤   ¤   ¤   count = data->mClientHandlerData.outputBufferSize;
cb2b85 ¤   ¤   ¤   ¤
de1ef4 ¤   ¤   ¤   ¤   ¤   if ( IsntNull( data->mFYEOData ) )
984859 ¤   ¤   ¤   ¤   ¤   {
7cc317 ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤newSize = strlen( data->mFYEOData ) + count + 1;
d394aa ¤   ¤   ¤   ¤   ¤   ¤
4f148c ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPReallocData( PGPGetContextMemoryMgr( co¶
c5e90b ntext ),
5725fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·&data->mFYEOData,
69e3d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·newSize,
b788e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·kPGPMemoryMgrFlags_None );
11abf0 ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
438fec ¤   ¤   ¤   ¤   ¤   ¤   {
b94634 ¤   ¤   ¤   ¤   ¤   ¤   ¤   strncat( data->mFYEOData, (char *) data->mClientHan¶
6f615e dlerData.outputBuffer,
98ddab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   count );
cc9ab5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->mFYEOData[newSize - 1] = 0;
90db3c ¤   ¤   ¤   ¤   ¤   ¤   }
8a1c89 ¤   ¤   ¤   ¤   ¤   }
2b4bd6 ¤   ¤   ¤   ¤   ¤   else
654859 ¤   ¤   ¤   ¤   ¤   {
e6cbc5 ¤   ¤   ¤   ¤   ¤   ¤   err.err = FSWrite( data->mOutputFileRef, &count,
c6632c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->mClientHandlerData.outputBuffer );
521c89 ¤   ¤   ¤   ¤   ¤   }
aa2613 ¤   ¤   ¤   ¤   }
--661b 000fabed4b340120087 Page 8 of CManualTranslator.cp
e0af5a
1aaf5a
4bcea6 ¤   ¤   ¤   ¤   if( err.IsntError() &&
0e9c01 ¤   ¤   ¤   ¤   ¤   data->mClientHandlerData.signatureDataValid )
7172c3 ¤   ¤   ¤   ¤   {
528491 ¤   ¤   ¤   ¤   ¤   if( data->mClientHandlerData.sectionType ==
39a77c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPAnalyze_Encrypted )
cb4859 ¤   ¤   ¤   ¤   ¤   {
c17dbf ¤   ¤   ¤   ¤   ¤   ¤   strIndex = kEndDecryptedVerifiedMsgStrIndex;
fa1c89 ¤   ¤   ¤   ¤   ¤   }
024bd6 ¤   ¤   ¤   ¤   ¤   else
b24859 ¤   ¤   ¤   ¤   ¤   {
c129c2 ¤   ¤   ¤   ¤   ¤   ¤   strIndex = kEndVerifiedMsgStrIndex;
ba1c89 ¤   ¤   ¤   ¤   ¤   }
7294aa ¤   ¤   ¤   ¤   ¤   ¤
1ce33f ¤   ¤   ¤   ¤   ¤   GetIndString( str, kTranslatorStringsRID,
deb666 ¤   ¤   ¤   ¤   ¤   ¤   ¤   strIndex );
ffae30 ¤   ¤   ¤   ¤   ¤
54fabe ¤   ¤   ¤   ¤   ¤   count = StrLength( str );
431ef4 ¤   ¤   ¤   ¤   ¤   if ( IsntNull( data->mFYEOData ) )
b74859 ¤   ¤   ¤   ¤   ¤   {
6ac317 ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤newSize = strlen( data->mFYEOData ) + count + 1;
0494aa ¤   ¤   ¤   ¤   ¤   ¤
66148c ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPReallocData( PGPGetContextMemoryMgr( co¶
89e90b ntext ),
9e25fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·&data->mFYEOData,
62e3d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·newSize,
ef88e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·kPGPMemoryMgrFlags_None );
0aabf0 ¤   ¤   ¤   ¤   ¤   ¤   if ( err.IsntError() )
288fec ¤   ¤   ¤   ¤   ¤   ¤   {
1ad499 ¤   ¤   ¤   ¤   ¤   ¤   ¤   strncat( data->mFYEOData, (char *) &str[1], count );
089ab5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->mFYEOData[newSize - 1] = 0;
90db3c ¤   ¤   ¤   ¤   ¤   ¤   }
6b1c89 ¤   ¤   ¤   ¤   ¤   }
e64bd6 ¤   ¤   ¤   ¤   ¤   else
494859 ¤   ¤   ¤   ¤   ¤   {
135abd ¤   ¤   ¤   ¤   ¤   ¤   err.err = FSWrite( data->mOutputFileRef,
d696ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &count, &str[1] );
381c89 ¤   ¤   ¤   ¤   ¤   }
032613 ¤   ¤   ¤   ¤   }
23a3a6 ¤   ¤   ¤   }
cc87c7 ¤   ¤   ¤
40cdcb ¤   ¤   ¤   break;
5a0fe4 ¤   ¤   }
8a9371 ¤   }
7567c5 ¤
24d3cb ¤   if( err.IsntError() )
5dc7a1 ¤   {
d0ced8 ¤   ¤   err.pgpErr = CManualTranslator::PGPDecodeEventHandler( context,
f57122 ¤   ¤   ¤   ¤   ¤   event, data );
fe9371 ¤   }
8867c5 ¤
3b1be7 ¤   return( err.ConvertToPGPError() );
24efe6 }
a8af5a
57af5a
a3d6fb ¤   PluginError
4cb678 CManualDecryptVerifyTranslator::TranslateFile(
fe4bbe ¤   long¤   ¤   ¤   transContext,
b36072 ¤   ConstemsMIMETypeHandle¤ inMIMEtypeHandle,
014c49 ¤   const FSSpec *¤ inSpec,
787ccb ¤   StringHandle**¤ addressesHandle,¤   ¤   // nil for manual translators
9dead5 ¤   emsMIMETypeHandle*¤ outMIMETypeHandlePtr,// nil for manual translators
54e782 ¤   const FSSpec *¤ outSpec,
2e8cfb ¤   StringHandle*¤  returnedMessage,¤   ¤   // nil for manual translators
bd9243 ¤   StringHandle*¤  errorMessage,
a58952 ¤   long *¤ ¤   ¤   resultCode
f327e6 ¤   )
31bb36 {
0a865f ¤   CComboError¤¤   err;
f862da ¤   Boolean¤¤   ¤   reportedError¤  = false;
faa63c ¤   DecryptVerifyEventHandlerData¤  eventData( this );
--da74 000e091c1d340120087 Page 9 of CManualTranslator.cp
2a67c5 ¤
aeae41 ¤   (void)transContext;
34dc46 ¤   (void)inMIMEtypeHandle;
5087bf ¤   (void)addressesHandle;
9c67c5 ¤
57a93f ¤   InitPtrToNil( outMIMETypeHandlePtr );
e7d1f6 ¤   InitPtrToNil( returnedMessage );
1dcd0c ¤   InitPtrToNil( errorMessage );
1767c5 ¤
2c9e7e ¤   if ( IsntNull( resultCode ) )
15fe61 ¤   ¤   *resultCode¤= EMSR_OK;
48af5a
7f76cc ¤   PGPKeySetRef¤   newKeysSet = kInvalidPGPKeySetRef;
8a67c5 ¤
aad13c ¤   pgpFixBeforeShip( "Show error for non-PGP data" );
5d67c5 ¤
668309 ¤   err.pgpErr = PGPNewKeySet( mContext, &newKeysSet );
17ed80 ¤   if ( err.IsntError() )
89c7a1 ¤   {
77c960 ¤   ¤   err.pgpErr = LoadDefaultKeySet( FALSE );
a99371 ¤   }
e167c5 ¤
c0ed80 ¤   if ( err.IsntError() )
dfc7a1 ¤   {
b466b6 ¤   ¤   PGPContextRef¤  c¤  = mContext;
d3af5a
465569 ¤   ¤   err.err¤= FSpOpenDF( outSpec, fsRdWrPerm, &eventData.mOutputFileRef );
9ef9a8 ¤   ¤   if ( err.IsntError() )
b55b34 ¤   ¤   {
fdbb95 ¤   ¤   ¤   err.pgpErr¤ = PGPDecode( c,¤
51e85c ¤   ¤   ¤   ¤   ¤   PGPOInputFileFSSpec( c, inSpec ),
18d35e ¤   ¤   ¤   ¤   ¤   PGPOOutputLineEndType( c, kPGPLineEnd_CR),
c64a5d ¤   ¤   ¤   ¤   ¤   PGPOEventHandler( c, sPGPDecodeEventHandler, &eventData ),
3aacae ¤   ¤   ¤   ¤   ¤   PGPOSendNullEvents( c, 10 ),
820ee7 ¤   ¤   ¤   ¤   ¤   PGPOKeySetRef( c, mKeySet ),
e76527 ¤   ¤   ¤   ¤   ¤   PGPOImportKeysTo( c, newKeysSet ),
1ffad7 ¤   ¤   ¤   ¤   ¤   PGPOPassThroughIfUnrecognized( c, TRUE ),
0c6f82 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c )
1bf977 ¤   ¤   ¤   ¤   ¤   );
801b52 ¤   ¤
19ddd2 ¤   ¤   ¤   FSClose( eventData.mOutputFileRef );
cfa94e ¤   ¤   ¤   eventData.mOutputFileRef = -1;
880fe4 ¤   ¤   }
591b52 ¤   ¤
9df9a8 ¤   ¤   if ( err.IsntError() )
375b34 ¤   ¤   {
0b8f55 ¤   ¤   ¤   if( err.IsntError() &&
a7d61b ¤   ¤   ¤   ¤   PGPKeySetRefIsValid( eventData.mClientHandlerData.newKeySet ) )
f5f776 ¤   ¤   ¤   {
4d2f86 ¤   ¤   ¤   ¤   err.pgpErr = PGPAddKeys(eventData.mClientHandlerData.newKeySet,
32e66d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeysSet );
1882e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
d272c3 ¤   ¤   ¤   ¤   {
bd699e ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPCommitKeyRingChanges( newKeysSet );
9d2613 ¤   ¤   ¤   ¤   }
0ea3a6 ¤   ¤   ¤   }
3b0fe4 ¤   ¤   }
7467c5 ¤
bdf9a8 ¤   ¤   if ( err.IsntError() )
725b34 ¤   ¤   {
c937b1 ¤   ¤   ¤   RememberDecryptionPassBuffer(
1472b1 ¤   ¤   ¤   ¤   ¤   eventData.mClientHandlerData.passBuffer,
ca450b ¤   ¤   ¤   ¤   ¤   eventData.mClientHandlerData.decryptionKey );
160fe4 ¤   ¤   }
f40e1d ¤   ¤   else
635b34 ¤   ¤   {
bd3a9f ¤   ¤   ¤   gDecryptionPassphraseCache->Forget( );
bd0fe4 ¤   ¤   }
f81b52 ¤   ¤
b25815 ¤   ¤   // FYEO
b70b76 ¤   ¤   if ( err.IsntError() && ( eventData.mFYEOData != nil ) )
e05b34 ¤   ¤   {
--c571 00072850f0340120087 Page 10 of CManualTranslator.cp
d50eb5 ¤   ¤   ¤   err.pgpErr = PGPForYourEyesOnlyDialog( c , eventData.mFYEOData );
1c0fe4 ¤   ¤   }
5942ee ¤   ¤   if ( eventData.mFYEOData != nil )
ca5b34 ¤   ¤   {
5c417f ¤   ¤   ¤   pgpClearMemory( eventData.mFYEOData, strlen( eventData.mFYEOData ) ¶
0a6275 );
acb6de ¤   ¤   ¤   PGPFreeData( eventData.mFYEOData );
0f0fe4 ¤   ¤   }
279371 ¤   }
edaf5a
8a67b1 ¤   // important: if we got an error, we must make sure that the output
f78cb1 ¤   // is the same as the input or Eudora will grab whatever crap
cf4612 ¤   // we put into it. We also do this if the message was FYEO
ceaf5a
850d1d ¤   if ( err.IsError() || ( eventData.mFYEOData != nil ) )·
35c7a1 ¤   {
26b99c ¤   ¤   (void)FSpCopyFiles( PGPGetContextMemoryMgr( mContext ),
22d461 ¤   ¤   ¤   ¤   ¤   inSpec, outSpec );
049371 ¤   }
c0af5a
9ad3cb ¤   if( err.IsntError() )
80c7a1 ¤   {
e082b4 ¤   ¤   PGPUInt32¤  numNewKeys;
b2294d ¤   ¤   PGPError¤   tempErr;
db1b52 ¤   ¤
d26716 ¤   ¤   tempErr = PGPCountKeys( newKeysSet, &numNewKeys );
9174bf ¤   ¤   if( IsntPGPError( tempErr ) && numNewKeys > 0 )
875b34 ¤   ¤   {
4569ca ¤   ¤   ¤   // Offer to import the keys
65f7ac ¤   ¤   ¤   PGPKeySetRef¤   importSet;
bf1b89 ¤   ¤   ¤   char¤   ¤   ¤   prompt[256];
c587c7 ¤   ¤   ¤
0d64da ¤   ¤   ¤   GetIndCString( prompt, kTranslatorStringsRID,
093a5d ¤   ¤   ¤   ¤   ¤   kSelectiveImportAfterSendPromptStrIndex );
ff87c7 ¤   ¤   ¤
dd37c5 ¤   ¤   ¤   tempErr = PGPSelectKeysDialog( mContext,
16078e ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation, prompt,
86e01e ¤   ¤   ¤   ¤   ¤   newKeysSet, mKeySet, &importSet );
9c87c7 ¤   ¤   ¤
20916f ¤   ¤   ¤   if( IsntPGPError( tempErr ) )
b7f776 ¤   ¤   ¤   {
48f054 ¤   ¤   ¤   ¤   (void) PGPSharedAddKeysToDefaultKeyring( importSet );
467255 ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( importSet );
1ca3a6 ¤   ¤   ¤   }
2c0fe4 ¤   ¤   }
3f9371 ¤   }
f0af5a
cdad89 ¤   if ( ! reportedError )
c8c7a1 ¤   {
a607f5 ¤   ¤   ReportError( err );
019371 ¤   }
e867c5 ¤
b04f3f ¤   if( PGPKeySetRefIsValid( newKeysSet ) )
5a5ca4 ¤   ¤   PGPFreeKeySet( newKeysSet );
8e1b52 ¤   ¤
ccd3ba ¤   return( CComboErrorToEudoraError( err ) );
f6efe6 }
3d7454 #endif
95af5a
8caf5a
aedacc #pragma mark -
e6af5a
f5af5a
efaf5a
d4d6fb ¤   PluginError
7dd854 CManualAddKeyTranslator::TranslateFile(
fe711e ¤   long¤   ¤   ¤   ¤   transContext,
b56072 ¤   ConstemsMIMETypeHandle¤ inMIMEtypeHandle,
d67519 ¤   const FSSpec *¤ ¤   inSpec,
c2bea6 ¤   StringHandle**¤ ¤   addressesHandle,¤   ¤   // nil for manual translators
d062be ¤   emsMIMETypeHandle*¤ outMIMETypeHandlePtr,¤  // nil for manual translators
72b53e ¤   const FSSpec *¤ ¤   outSpec,
--3a3a 000a211d5d340120087 Page 11 of CManualTranslator.cp
b56095 ¤   StringHandle*¤  ¤   returnedMessage,¤   ¤   // nil for manual translators
20e27b ¤   StringHandle*¤  ¤   errorMessage,
67bbd1 ¤   long *¤ ¤   ¤   ¤   resultCode
2a27e6 ¤   )
84bb36 {
8d865f ¤   CComboError¤¤   err;
4bb8bc ¤   PluginError¤¤   emsrErr¤= EMSR_OK;
0c62da ¤   Boolean¤¤   ¤   reportedError¤  = false;
5567c5 ¤
56ae41 ¤   (void)transContext;
ecdc46 ¤   (void)inMIMEtypeHandle;
fa87bf ¤   (void)addressesHandle;
816e1b ¤   (void)outMIMETypeHandlePtr;
5e5aa4 ¤   (void)returnedMessage;
2814ac ¤   (void)errorMessage;
14f32d ¤   (void)resultCode;
4867c5 ¤
2b6063 ¤   // preserve the data; we aren't going to change anything
0f132b ¤   err.err¤= FSpCopyFiles( PGPGetContextMemoryMgr( mContext ), inSpec,
a9f4f3 ¤   ¤   ¤   ¤   ¤   ¤   outSpec );
caed80 ¤   if ( err.IsntError() )
1dc7a1 ¤   {
2ff37e ¤   ¤   PGPUInt32¤  ¤   numKeysAdded = 0;
565bdd ¤   ¤   PGPUInt32¤  ¤   numKeysFound = 0;
7666b6 ¤   ¤   PGPContextRef¤  c¤  = mContext;
b0f1a9 ¤   ¤   PGPBoolean¤ ¤   cantOpenMutable¤= FALSE;
d8ee59 ¤   ¤   PGPKeySetRef¤   keysFound;
9c1b52 ¤   ¤
19cb57 ¤   ¤   err.pgpErr¤ = PGPImportKeySet( c,
f030d5 ¤   ¤   ¤   ¤   ¤   &keysFound,
83b83c ¤   ¤   ¤   ¤   ¤   PGPOInputFileFSSpec(c, inSpec),
f86f82 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c )
26f977 ¤   ¤   ¤   ¤   ¤   );
50f9a8 ¤   ¤   if ( err.IsntError() )
1d5b34 ¤   ¤   {
995fb8 ¤   ¤   ¤   err.pgpErr¤ = PGPCountKeys( keysFound, &numKeysFound );
a80fe4 ¤   ¤   }
f41b52 ¤   ¤
65000e ¤   ¤   if ( err.IsntError() && numKeysFound != 0 )
a65b34 ¤   ¤   {
28d302 ¤   ¤   ¤   PGPKeySetRef¤   keysToImport¤   = kInvalidPGPKeySetRef;
eed102 ¤   ¤   ¤   Str255¤ ¤   ¤   pPrompt;
769cec ¤   ¤   ¤   char¤   ¤   ¤   cPrompt[ sizeof( pPrompt ) ];
1187c7 ¤   ¤   ¤
9a8ee6 ¤   ¤   ¤   GetIndString( pPrompt, kTranslatorStringsRID,
ffc383 ¤   ¤   ¤   ¤   kSelectiveImportPromptStrIndex );
a08ff5 ¤   ¤   ¤   PToCString( pPrompt, cPrompt );
e987c7 ¤   ¤   ¤
328bac ¤   ¤   ¤   err.pgpErr¤ = PGPSelectKeysDialog( c,
d5e42d ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation,
0e5546 ¤   ¤   ¤   ¤   ¤   cPrompt,
61fe9d ¤   ¤   ¤   ¤   ¤   keysFound,
344283 ¤   ¤   ¤   ¤   ¤   mKeySet,
26e0f5 ¤   ¤   ¤   ¤   ¤   &keysToImport );
a475d7 ¤   ¤   ¤   if ( err.IsntError() )
31f776 ¤   ¤   ¤   {
8e56f4 ¤   ¤   ¤   ¤   err.pgpErr¤ = PGPCountKeys( keysToImport, &numKeysAdded );
6bf9a4 ¤   ¤   ¤   ¤   if ( numKeysAdded != 0 )
3d72c3 ¤   ¤   ¤   ¤   {
499f00 ¤   ¤   ¤   ¤   ¤   /* we're about to change it, so get rid of it */
3a8f3c ¤   ¤   ¤   ¤   ¤   if ( IsntNull( mKeySet ) )
994859 ¤   ¤   ¤   ¤   ¤   {
e5b427 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( mKeySet );
80fffa ¤   ¤   ¤   ¤   ¤   ¤   mKeySet¤= NULL;
d21c89 ¤   ¤   ¤   ¤   ¤   }
4bae30 ¤   ¤   ¤   ¤   ¤
503664 ¤   ¤   ¤   ¤   ¤   err.pgpErr¤ =
57916b ¤   ¤   ¤   ¤   ¤   ¤   PGPSharedAddKeysToDefaultKeyring( keysToImport );
642613 ¤   ¤   ¤   ¤   }
96b5f9 ¤   ¤   ¤   ¤   PGPFreeKeySet( keysToImport );
f1a3a6 ¤   ¤   ¤   }
a2a255 ¤   ¤   ¤   PGPFreeKeySet( keysFound );
--a549 0005146fb1440120087 Page 12 of CManualTranslator.cp
b50fe4 ¤   ¤   }
3b1b52 ¤   ¤
6d62f3 ¤   ¤   reportedError¤  = true;¤// most cases do, see below
dac121 ¤   ¤   if ( numKeysAdded != 0 )
445b34 ¤   ¤   {
44e4a1 ¤   ¤   ¤   if ( numKeysAdded == 1 )
5cf776 ¤   ¤   ¤   {
f490fa ¤   ¤   ¤   ¤   WarningAlert( kWANoteAlertType, kWAOKStyle,
4781c9 ¤   ¤   ¤   ¤   ¤   kTranslatorErrorStringsResID,
0eef15 ¤   ¤   ¤   ¤   ¤   kKeyAddedSuccessfullyStrIndex );
01a3a6 ¤   ¤   ¤   }
29bb8c ¤   ¤   ¤   else
40f776 ¤   ¤   ¤   {
e09888 ¤   ¤   ¤   ¤   Str255¤ numKeysStr;
969e02 ¤   ¤   ¤   ¤   NumToString( numKeysAdded, numKeysStr );
2b2b85 ¤   ¤   ¤   ¤
8a90fa ¤   ¤   ¤   ¤   WarningAlert( kWANoteAlertType, kWAOKStyle,
9f81c9 ¤   ¤   ¤   ¤   ¤   kTranslatorErrorStringsResID,
e5b9dc ¤   ¤   ¤   ¤   ¤   kKeysAddedSuccessfullyStrIndex, numKeysStr );
04a3a6 ¤   ¤   ¤   }
450fe4 ¤   ¤   }
2631ee ¤   ¤   else if ( err.pgpErr == kPGPError_FilePermissions ||
b95f58 ¤   ¤   ¤   ¤   ¤   cantOpenMutable)
285b34 ¤   ¤   {
96f81d ¤   ¤   ¤   WarningAlert( kWAStopAlertType, kWAOKStyle,
54cef7 ¤   ¤   ¤   ¤   kTranslatorErrorStringsResID,
9df4d0 ¤   ¤   ¤   ¤   kCantAddKeyAddItInPGPkeysInsteadStrIndex );
220fe4 ¤   ¤   }
39dcc9 ¤   ¤   else if ( err.IsCancelError() )
a85b34 ¤   ¤   {
1825ec ¤   ¤   ¤   reportedError¤  = true;
560fe4 ¤   ¤   }
0fb21e ¤   ¤   else if ( err.HavePGPError() ·)
815b34 ¤   ¤   {
549f50 ¤   ¤   ¤   Str255¤ errorString;
cb87c7 ¤   ¤   ¤
d3a5b6 ¤   ¤   ¤   PGPGetClientErrorString( err.pgpErr,
62dd03 ¤   ¤   ¤   ¤   sizeof( errorString ), (char *)errorString);
438aeb ¤   ¤   ¤   CToPString( (char *)errorString, errorString );
83af5a
c41fad ¤   ¤   ¤   WarningAlert( kWANoteAlertType, kWAOKStyle,
58cef7 ¤   ¤   ¤   ¤   kTranslatorErrorStringsResID,
926f6b ¤   ¤   ¤   ¤   kErrorWhileAddingKeyStrIndex, errorString );
620fe4 ¤   ¤   }
7b89d3 ¤   ¤   else if ( numKeysAdded == 0 )
cb5b34 ¤   ¤   {
07f81d ¤   ¤   ¤   WarningAlert( kWAStopAlertType, kWAOKStyle,
051a79 ¤   ¤   ¤   ¤   kTranslatorErrorStringsResID, kNoKeysPresentStrIndex );
190fe4 ¤   ¤   }
220e1d ¤   ¤   else
ce5b34 ¤   ¤   {
1b1f3f ¤   ¤   ¤   reportedError¤  = false;
e70fe4 ¤   ¤   }
632b85 ¤   ¤   ¤   ¤
6a47b6 ¤   ¤   // we handle all our own error reporting
bb6cd8 ¤   ¤   err.err¤¤   = noErr;
0ad3c0 ¤   ¤   err.pgpErr¤ = noErr;
169371 ¤   }
3167c5 ¤
2fad89 ¤   if ( ! reportedError )
93c7a1 ¤   {
3f07f5 ¤   ¤   ReportError( err );
df9371 ¤   }
a167c5 ¤
a70ab9 ¤   emsrErr¤= CComboErrorToEudoraError( err );
b067c5 ¤
1f3e74 ¤   return( emsrErr );
43efe6 }
d7af5a
29af5a
98af5a
51af5a
--b624 000a28b446040120087 Page 13 of CManualTranslator.cp
e0af5a
1aaf5a
17af5a
78af5a
3fd51c CManualEncryptSignTranslator::CManualEncryptSignTranslator(
57a1bc ¤   PGPContextRef¤  ¤   context,
856c35 ¤   PGPtlsContextRef¤   tlsContext,
952e50 ¤   emsProgress¤¤   ¤   progressHook,
8411fa ¤   Boolean¤¤   ¤   ¤   doSign )
d9e2fc ¤   : CManualTranslator( context, tlsContext, progressHook)
9fbb36 {
8fe8f3 ¤   mDoSign = doSign;
dcefe6 }
0daf5a
25af5a
8a9221 #pragma global_optimizer on
dbaf5a
fbaf5a
ced6fb ¤   PluginError
b038cb CManualEncryptSignTranslator::TranslateFile(
e44bbe ¤   long¤   ¤   ¤   transContext,
516072 ¤   ConstemsMIMETypeHandle¤ inMIMEtypeHandle,
9b4c49 ¤   const FSSpec *¤ inSpec,
ab559c ¤   StringHandle**¤ addressesHandle,¤   ¤   ¤   // nil for manual translators
aa62be ¤   emsMIMETypeHandle*¤ outMIMETypeHandlePtr,¤  // nil for manual translators
7de782 ¤   const FSSpec *¤ outSpec,
c8955a ¤   StringHandle*¤  returnedMessage,¤   ¤   ¤   // nil for manual translators
989243 ¤   StringHandle*¤  errorMessage,
5f8952 ¤   long *¤ ¤   ¤   resultCode
5327e6 ¤   )
9dbb36 {
86add8 ¤   CComboError¤¤   ¤   err;
4c43e4 ¤   PGPOptionListRef¤   options¤= kInvalidPGPOptionListRef;
4f08d1 ¤   PGPContextRef¤  ¤   c¤  = mContext;
adaf5a
0fae41 ¤   (void)transContext;
10dc46 ¤   (void)inMIMEtypeHandle;
4187bf ¤   (void)addressesHandle;
096e1b ¤   (void)outMIMETypeHandlePtr;
dd5aa4 ¤   (void)returnedMessage;
c714ac ¤   (void)errorMessage;
3df32d ¤   (void)resultCode;
b61b52 ¤   ¤
6a4af7 ¤   pgpAssert( IsNull( addressesHandle ) );
80a93f ¤   InitPtrToNil( outMIMETypeHandlePtr );
06d1f6 ¤   InitPtrToNil( returnedMessage );
a4cd0c ¤   InitPtrToNil( errorMessage );
bbaf5a
3bfff4 ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), inSpec,
c5d95b ¤   ¤   ¤   ¤   "\pManualEncryptIn" );
c367c5 ¤
e867c5 ¤
2fedc1 ¤   err.pgpErr¤ = PGPBuildOptionList( c, &options,
0fd3bc ¤   ¤   ¤   ¤   PGPOOutputLineEndType( c, kPGPLineEnd_CR),
02600d ¤   ¤   ¤   ¤   PGPOLastOption( c ) );
e667c5 ¤
2ced80 ¤   if ( err.IsntError() )
05c7a1 ¤   {
63cfa0 ¤   ¤   err¤= HandleEncryptSign( inSpec, outSpec,
39a055 ¤   ¤   ¤   ¤   addressesHandle, mDoSign, options, false );
7f9371 ¤   }
7b67c5 ¤
dfa20c ¤   PGPFreeOptionList( options );
49af5a
cb67b1 ¤   // important: if we got an error, we must make sure that the output
8e95da ¤   // is the same as the input or Eudora will grab whatever crap we put
bb1ab2 ¤   // into it.
1c1871 ¤   if ( err.IsError() )·
c6c7a1 ¤   {
b54f27 ¤   ¤   (void)FSpCopyFiles( PGPGetContextMemoryMgr( mContext ), inSpec, outSpec¶
3754c8 ·);
a29371 ¤   }
--c68d 000b673ea8340120087 Page 14 of CManualTranslator.cp
2a67c5 ¤
1ff190 ¤   ReportError( err );
fa67c5 ¤
dcd3ba ¤   return( CComboErrorToEudoraError( err ) );
dbefe6 }
9baf5a
faaf5a
daaf5a
65af5a
97d6fb ¤   PluginError
12ca18 CManualSignTranslator::TranslateFile(
fb4bbe ¤   long¤   ¤   ¤   transContext,
6d6072 ¤   ConstemsMIMETypeHandle¤ inMIMEtypeHandle,
c64c49 ¤   const FSSpec *¤ inSpec,
6c7ccb ¤   StringHandle**¤ addressesHandle,¤   ¤   // nil for manual translators
90ead5 ¤   emsMIMETypeHandle*¤ outMIMETypeHandlePtr,// nil for manual translators
2fe782 ¤   const FSSpec *¤ outSpec,
bc8cfb ¤   StringHandle*¤  returnedMessage,¤   ¤   // nil for manual translators
e89243 ¤   StringHandle*¤  errorMessage,
5e8952 ¤   long *¤ ¤   ¤   resultCode
ef27e6 ¤   )
5bbb36 {
32865f ¤   CComboError¤¤   err;
09e052 ¤   PGPKeyRef¤  ¤   signingKey¤ = kInvalidPGPKeyRef;
c567c5 ¤
4faceb ¤   Boolean¤¤   ¤   ¤   ¤   reportedError¤  = false;
4eaf5a
67af5a
85ae41 ¤   (void)transContext;
7edc46 ¤   (void)inMIMEtypeHandle;
1087bf ¤   (void)addressesHandle;
446e1b ¤   (void)outMIMETypeHandlePtr;
f45aa4 ¤   (void)returnedMessage;
e414ac ¤   (void)errorMessage;
f1f32d ¤   (void)resultCode;
1f67c5 ¤
3b4af7 ¤   pgpAssert( IsNull( addressesHandle ) );
52a93f ¤   InitPtrToNil( outMIMETypeHandlePtr );
64d1f6 ¤   InitPtrToNil( returnedMessage );
1acd0c ¤   InitPtrToNil( errorMessage );
0e67c5 ¤
9bfff4 ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), inSpec,
2c5da2 ¤   ¤   ¤   ¤   "\pManualSignIn" );
e167c5 ¤
563d4e ¤   ulong¤  wordWrapLength;
83ea22 ¤   Boolean¤shouldWordWrap¤ = PrefShouldBreakLines( &wordWrapLength );
32d44b ¤   FSSpec¤ tempSpec;
a71b52 ¤   ¤
1b3f15 ¤   if ( shouldWordWrap )
33c7a1 ¤   {
24635c ¤   ¤   err.err¤= FSpGetUniqueSpec( outSpec, &tempSpec );
f4f9a8 ¤   ¤   if ( err.IsntError() )
fd5b34 ¤   ¤   {
9c6089 ¤   ¤   ¤   PGPMemoryMgrRef¤memoryMgr¤  = NULL;
2087c7 ¤   ¤   ¤
010237 ¤   ¤   ¤   err.pgpErr¤ = PGPNewMemoryMgr( 0, &memoryMgr );
6d75d7 ¤   ¤   ¤   if ( err.IsntError() )
2ef776 ¤   ¤   ¤   {
4bb611 ¤   ¤   ¤   ¤   err.pgpErr¤ = pgpWordWrapFileFSSpec( memoryMgr, inSpec,
406207 ¤   ¤   ¤   ¤   ¤   &tempSpec, wordWrapLength, "\r");
674a2f ¤   ¤   ¤   ¤   PGPFreeMemoryMgr( memoryMgr );
cfa3a6 ¤   ¤   ¤   }
480fe4 ¤   ¤   }
e29371 ¤   }
140e24 ¤   else
78c7a1 ¤   {
807a0c ¤   ¤   tempSpec¤   = *inSpec;
4c9371 ¤   }
0267c5 ¤
fced80 ¤   if ( err.IsntError() )
a9c7a1 ¤   {
b64458 ¤   ¤   PGPPassBufferRef¤   passBuffer;
--37fe 0002304c00840120087 Page 15 of CManualTranslator.cp
f11b52 ¤   ¤
557fad ¤   ¤   // prompt for passphrase if none was entered
adb0ea ¤   ¤   err = GetSigningPassBuffer( &passBuffer, &signingKey );
a3f9a8 ¤   ¤   if ( err.IsntError() )
8e5b34 ¤   ¤   {
8835b2 ¤   ¤   ¤   err.pgpErr = PGPGuaranteeMinimumEntropy( mContext );
4d0fe4 ¤   ¤   }
801b52 ¤   ¤
e7f9a8 ¤   ¤   if ( err.IsntError() )
6a5b34 ¤   ¤   {
50e581 ¤   ¤   ¤   PGPContextRef¤  ¤   ¤   ¤   c = mContext;
7888c1 ¤   ¤   ¤   char¤   ¤   ¤   ¤   ¤   ¤   comment[ 256 ];
872b85 ¤   ¤   ¤   ¤
8f7a6a ¤   ¤   ¤   PrefGetComment( comment );
ae0b94 ¤   ¤   ¤   EncryptSignEventHandlerData¤data(this);
5c87c7 ¤   ¤   ¤
cd6af1 ¤   ¤   ¤   err.pgpErr¤ = PGPEncode( c,
770786 ¤   ¤   ¤   ¤   PGPOInputFileFSSpec( c, &tempSpec ),
b68c04 ¤   ¤   ¤   ¤   PGPOOutputFileFSSpec( c, outSpec ),
52877b ¤   ¤   ¤   ¤   PGPOSignWithKey( c, signingKey,
4330b1 ¤   ¤   ¤   ¤   ¤   PGPOPassBuffer(c, passBuffer),
f6fcea ¤   ¤   ¤   ¤   ¤   PGPOLastOption(c) ),
dcdb19 ¤   ¤   ¤   ¤   PGPOLocalEncoding( c, kPGPLocalEncoding_None ),
805222 ¤   ¤   ¤   ¤   PGPOArmorOutput(c, TRUE),
37d3bc ¤   ¤   ¤   ¤   PGPOOutputLineEndType( c, kPGPLineEnd_CR),
5c036b ¤   ¤   ¤   ¤   PGPOClearSign(c, TRUE ),
5e16dd ¤   ¤   ¤   ¤   PGPODataIsASCII( c, TRUE ),
011dda ¤   ¤   ¤   ¤   PGPOEventHandler( c, sPGPEncodeEventHandler, &data ),
d30cc2 ¤   ¤   ¤   ¤   PGPOSendNullEvents( c, TRUE ),
2c4ba5 ¤   ¤   ¤   ¤   PGPOVersionString( c, pgpVersionHeaderString ),
03ad94 ¤   ¤   ¤   ¤   PGPOCommentString( c, comment ),
aa83d5 ¤   ¤   ¤   ¤   PGPOLastOption(c)
fac29e ¤   ¤   ¤   ¤   );
be1b52 ¤   ¤
b98149 ¤   ¤   ¤   if ( shouldWordWrap )
19f776 ¤   ¤   ¤   {
8e44a5 ¤   ¤   ¤   ¤   // delete our intermediate file
5fd243 ¤   ¤   ¤   ¤   (void)FSpDelete( &tempSpec );
59a3a6 ¤   ¤   ¤   }
2587c7 ¤   ¤   ¤
536d97 ¤   ¤   ¤   if( err.IsntError() )
acf776 ¤   ¤   ¤   {
fecc0e ¤   ¤   ¤   ¤   RememberSigningPassBuffer( passBuffer, signingKey );
a32b85 ¤   ¤   ¤   ¤
443034 ¤   ¤   ¤   ¤   // remember it for encryption as well (but not vice versa)
aa69e1 ¤   ¤   ¤   ¤   RememberDecryptionPassBuffer( passBuffer, signingKey );
45a3a6 ¤   ¤   ¤   }
8bbb8c ¤   ¤   ¤   else
59f776 ¤   ¤   ¤   {
83cbfb ¤   ¤   ¤   ¤   gSigningPassphraseCache->Forget();
11a3a6 ¤   ¤   ¤   }
4387c7 ¤   ¤   ¤
4300b4 ¤   ¤   ¤   PGPFreePassBuffer( passBuffer );
aa0fe4 ¤   ¤   }
791b52 ¤   ¤
118e29 ¤   ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), outSpec,
918ed1 ¤   ¤   ¤   ¤   ¤   "\pManualEncryptSignOut" );
d09371 ¤   }
49af5a
5067b1 ¤   // important: if we got an error, we must make sure that the output
f695da ¤   // is the same as the input or Eudora will grab whatever crap we put
f81ab2 ¤   // into it.
e91871 ¤   if ( err.IsError() )·
c7c7a1 ¤   {
1c4f27 ¤   ¤   (void)FSpCopyFiles( PGPGetContextMemoryMgr( mContext ), inSpec, outSpec¶
0c54c8 ·);
ad9371 ¤   }
1867c5 ¤
e2ad89 ¤   if ( ! reportedError )
d7c7a1 ¤   {
d007f5 ¤   ¤   ReportError( err );
239371 ¤   }
--8073 0014db036ae40120087 Page 16 of CManualTranslator.cp
2a67c5 ¤
51d3ba ¤   return( CComboErrorToEudoraError( err ) );
3aefe6 }
02af5a
4daf5a
--6f90 000953e578140120088 Page 1 of CManualTranslator.h
a70335 /*____________________________________________________________________________
3e899f ¤   CManualTranslator.h
ac67c5 ¤
fac97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
494b0f ¤   All rights reserved.
0967c5 ¤
0e67c5 ¤
e7af5a
b8fcb2 ¤   $Id: CManualTranslator.h,v 1.6.8.1 1998/11/12 03:06:33 heller Exp $
ccf7f7 ____________________________________________________________________________*/
68af5a
827b7d #pragma once
7baf5a
2c1ee8 #include "CTranslator.h"
ffaf5a
31c0a9 class CManualTranslator : public CTranslator
7cbb36 {
a55ed4 public:
5367c5 ¤
10a2d3 protected:
5567c5 ¤
f95ed4 public:
416863 ¤   ¤   ¤   CManualTranslator( PGPContextRef context,
bdb7a6 ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext, emsProgress progressHook)
a4d121 ¤   ¤   ¤   ¤   : CTranslator( context, tlsContext, progressHook)
a172c3 ¤   ¤   ¤   ¤   {
472613 ¤   ¤   ¤   ¤   }
7082f7 };
4daf5a
b7af5a
7daf5a
a36211 class CManualDecryptVerifyTranslator : public CManualTranslator
efbb36 {
5da2d3 protected:
58af5a
8c3659 ¤   virtual PGPError¤   PGPDecodeEventHandler(PGPContextRef context,
59b5ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event,
d227c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   DecryptVerifyEventHandlerData *data );
25531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
d85ed4 public:
33b7f6 ¤   ¤   ¤   CManualDecryptVerifyTranslator( PGPContextRef context,
7eb7a6 ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext, emsProgress progressHook)
0455f9 ¤   ¤   ¤   ¤   : CManualTranslator( context, tlsContext, progressHook)
1c72c3 ¤   ¤   ¤   ¤   {
4c2613 ¤   ¤   ¤   ¤   }
2d2b85 ¤   ¤   ¤   ¤
78e4f8 ¤   virtual PluginError¤TranslateFile( long transContext,·
79916e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstemsMIMETypeHandle InMIMEtypeHandle,
c04e30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * inFSp,
06357e ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle** addressesHandle,
e5c760 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsMIMEtype ***¤OutMIMEtypeHandlePtr,
7fe6c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * outFSp,
e1cfc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* returnedMessage,
2b8f0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* errorMessage, long * resultCode);
6582f7 };
afaf5a
28af5a
4caf5a
9c056b class CManualAddKeyTranslator : public CManualTranslator
70bb36 {
285ed4 public:
e6de5f ¤   ¤   ¤   CManualAddKeyTranslator( PGPContextRef context,
39b7a6 ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext, emsProgress progressHook)
6855f9 ¤   ¤   ¤   ¤   : CManualTranslator( context, tlsContext, progressHook)
5d72c3 ¤   ¤   ¤   ¤   {
cd2613 ¤   ¤   ¤   ¤   }
992b85 ¤   ¤   ¤   ¤
f5e4f8 ¤   virtual PluginError¤TranslateFile( long transContext,·
b3916e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstemsMIMETypeHandle InMIMEtypeHandle,
484e30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * inFSp,
8f357e ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle** addressesHandle,
95c760 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsMIMEtype ***¤OutMIMEtypeHandlePtr,
--aea1 001fadf796240120088 Page 2 of CManualTranslator.h
d6e6c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * outFSp,
e8cfc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* returnedMessage,
618f0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* errorMessage, long * resultCode);
8382f7 };
caaf5a
b3af5a
96efba class CManualEncryptSignTranslator : public CManualTranslator
d9bb36 {
62a2d3 protected:
ccdb64 ¤   Boolean¤¤   ¤   mDoSign;
d567c5 ¤
495ed4 public:
57d8d3 ¤   ¤   CManualEncryptSignTranslator( PGPContextRef context,
1dda92 ¤   ¤   ¤   PGPtlsContextRef tlsContext, emsProgress progressHook,
7426af ¤   ¤   ¤   Boolean sign );
5fae30 ¤   ¤   ¤   ¤   ¤
a2e4f8 ¤   virtual PluginError¤TranslateFile( long transContext,·
36916e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstemsMIMETypeHandle InMIMEtypeHandle,
234e30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * inFSp,
af357e ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle** addressesHandle,
bcc760 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsMIMEtype ***¤OutMIMEtypeHandlePtr,
43e6c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * outFSp,
f5cfc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* returnedMessage,
298f0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* errorMessage, long * resultCode);
ce82f7 };
5faf5a
a3af5a
a76fd2 class CManualSignTranslator : public CManualTranslator
babb36 {
cb5ed4 public:
4cac4c ¤   ¤   ¤   CManualSignTranslator( PGPContextRef context,
2cb7a6 ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext, emsProgress progressHook)
6f55f9 ¤   ¤   ¤   ¤   : CManualTranslator( context, tlsContext, progressHook)
2672c3 ¤   ¤   ¤   ¤   {
a12613 ¤   ¤   ¤   ¤   }
8c2b85 ¤   ¤   ¤   ¤
a2e4f8 ¤   virtual PluginError¤TranslateFile( long transContext,·
69916e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstemsMIMETypeHandle InMIMEtypeHandle,
3f4e30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * inFSp,
81357e ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle** addressesHandle,
fdc760 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsMIMEtype ***¤OutMIMEtypeHandlePtr,
63e6c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * outFSp,
0bcfc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* returnedMessage,
f08f0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* errorMessage, long * resultCode);
2482f7 };
d0af5a
faaf5a
--d7f8 0003367c67840120089 Page 1 of CSignTranslator.cp
a70335 /*____________________________________________________________________________
9ecc67 ¤   CSignTranslator.cp
a267c5 ¤
5bc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
c34b0f ¤   All rights reserved.
2c67c5 ¤
3867c5 ¤
acaf5a
1112b1 ¤   $Id: CSignTranslator.cp,v 1.37.8.1 1998/11/12 03:06:34 heller Exp $
bef7f7 ____________________________________________________________________________*/
94af5a
14324c #include <string.h>
684b15 #include <TextUtils.h>
6aaf5a
ca0d08 #include "pgpMem.h"
5aaf5a
54af5a
072f8d #include "pgpErrors.h"
36af5a
e6c110 #include "pgpMacMemory.h"
8785c2 #include "MacStrings.h"
ecbbf4 #include "MacFiles.h"
42af5a
7bc8f2 #include "PGPUserInterface.h"
c42bcf #include "MyMIMEUtils.h"
fae6f3 #include "TranslatorIDs.h"
4d034d #include "PluginLibUtils.h"
a48c5b #include "CPGPFree.h"
600096 #include "CFSCloser.h"
fdbbc6 #include "TranslatorUtils.h"
c0e001 #include "PassphraseCache.h"
2576fd #include "TranslatorStrings.h"
6c1970 #include "PGPKeys.h"
769f72 #include "pgpHash.h"
5a9f63 #include "pgpEncode.h"
e88e25 #include "pgpVersionHeader.h"
7b4cfb #include "TranslatorPrefs.h"
3cd73a #include "CSecureMemory.h"
c7af5a
08b91f #include "CSignTranslator.h"
8eaf5a
bcaf5a
0faf5a
97af5a
69af5a
db24b7 CSignTranslator::CSignTranslator(
44a1bc ¤   PGPContextRef¤  ¤   context,
886c35 ¤   PGPtlsContextRef¤   tlsContext,
456811 ¤   emsProgress¤¤   ¤   progress,
834da0 ¤   CipherOutputType¤   outputType )
b3a8d8 ¤   : CTranslator( context, tlsContext, progress)
fdbb36 {
34fdf7 ¤   mOutputType¤= outputType;
40efe6 }
36af5a
2eaf5a
80af5a
709221 #pragma global_optimizer on
83af5a
3caf5a
11af5a
c9d6fb ¤   PluginError
77820f CSignTranslator::TranslateFile(
7f26f7 ¤   long¤   ¤   ¤   ¤   ¤   transContext,
ae4bc2 ¤   ConstemsMIMETypeHandle¤ inMIMETypeHandle,
7ababf ¤   const FSSpec *¤ ¤   ¤   inSpec,
63c782 ¤   StringHandle**¤ ¤   ¤   addressesHandle,
96402a ¤   emsMIMETypeHandle *¤¤   outMIMEtypeHandlePtr,
1775cd ¤   const FSSpec *¤ ¤   ¤   outSpec,
bbe0d4 ¤   StringHandle*¤  ¤   ¤   returnedMessage,
f6cb89 ¤   StringHandle*¤  ¤   ¤   errorMessage,
3383a3 ¤   long *¤ ¤   ¤   ¤   ¤   resultCode)
--5421 000064092d640120089 Page 2 of CSignTranslator.cp
2cbb36 {
3d865f ¤   CComboError¤¤   err;
dab8bc ¤   PluginError¤¤   emsrErr¤= EMSR_OK;
96e346 ¤   Boolean¤¤   ¤   usePGPMime¤ = ( mOutputType == kUsePGPMIME );
6467c5 ¤
1aae41 ¤   (void)transContext;
f687bf ¤   (void)addressesHandle;
d3f32d ¤   (void)resultCode;
4567c5 ¤
2cb8fd ¤   InitPtrToNil( outMIMEtypeHandlePtr );
7fd1f6 ¤   InitPtrToNil( returnedMessage );
15cd0c ¤   InitPtrToNil( errorMessage );
d367c5 ¤
e50892 ¤   if ( ! usePGPMime )
abc7a1 ¤   {
c2e277 ¤   ¤   // use PGPMIME if we're processing anything other than text
ceeffc ¤   ¤   if ( ! MatchMIMEType( inMIMETypeHandle, "\ptext", "\pplain" ) )
625b34 ¤   ¤   {
bdd347 ¤   ¤   ¤   usePGPMime¤ = true;
a60fe4 ¤   ¤   }
469371 ¤   }
a167c5 ¤
322fb3 ¤   const Boolean¤  ¤   useTextOutput¤  = true;
9bf130 ¤   FSSpec¤ ¤   ¤   ¤   signatureSpec;
f167c5 ¤
43ed80 ¤   if ( err.IsntError() )
92c7a1 ¤   {
81cfd8 ¤   ¤   PGPKeyRef¤  ¤   ¤   signingKey¤ = kInvalidPGPKeyRef;
3980b7 ¤   ¤   PGPContextRef¤  ¤   c¤  = mContext;
a25082 ¤   ¤   char¤   ¤   ¤   ¤   mimeDelimiter[ kPGPMimeSeparatorSize ];
ac4458 ¤   ¤   PGPPassBufferRef¤   passBuffer;
bb67c5 ¤
8eb183 ¤   ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), inSpec,
8f65a7 ¤   ¤   ¤   ¤   ¤   "\pSignClearText" );
8b1b52 ¤   ¤
ed3ebb ¤   ¤   if ( (! usePGPMime ) &&
00f1c2 ¤   ¤   ¤   MatchMIMEType( inMIMETypeHandle, "\ptext", "\pplain" ) )
725b34 ¤   ¤   {
eb0dff ¤   ¤   ¤   // only eliminate it for plain text, not text/enriched or other
d8651f ¤   ¤   ¤   err.err¤= EliminateMIMEHeader( inSpec );
1d0fe4 ¤   ¤   }
101b52 ¤   ¤
a816d8 ¤   ¤   if ( err.IsntError() ·)
795b34 ¤   ¤   {
96c3ab ¤   ¤   ¤   err.err¤= FSpGetUniqueSpec( outSpec, &signatureSpec );
5b0fe4 ¤   ¤   }
1367c5 ¤
b51b52 ¤   ¤
f686a4 ¤   ¤   err¤= GetSigningPassBuffer( &passBuffer, &signingKey );
f116d8 ¤   ¤   if ( err.IsntError() ·)
ea5b34 ¤   ¤   {
f1be0e ¤   ¤   ¤   PGPOptionListRef¤   optionList¤ = kInvalidPGPOptionListRef;
9f0b94 ¤   ¤   ¤   EncryptSignEventHandlerData¤data(this);
45ab18 ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   mimeBodyOffset;
e4fdb4 ¤   ¤   ¤   char¤   ¤   ¤   ¤   comment[ 256 ];
2345ab ¤   ¤   ¤   Boolean¤signatureOnly¤  = usePGPMime;
1f1b52 ¤   ¤
0b7a6a ¤   ¤   ¤   PrefGetComment( comment );
991b52 ¤   ¤
2af903 ¤   ¤   ¤   // all these options are the same, regardless of whether it's
a73d38 ¤   ¤   ¤   // PGP/MIME or clear signed
b290a9 ¤   ¤   ¤   err.pgpErr¤ = PGPBuildOptionList( c, &optionList,
3fe85c ¤   ¤   ¤   ¤   ¤   PGPOInputFileFSSpec( c, inSpec ),
31d9a8 ¤   ¤   ¤   ¤   ¤   PGPOOutputFileFSSpec( c, outSpec ),
dd113a ¤   ¤   ¤   ¤   ¤   PGPOSignWithKey( c, signingKey,
a02196 ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassBuffer(c, passBuffer),
76fa52 ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(c) ),
99e677 ¤   ¤   ¤   ¤   ¤   PGPOLocalEncoding( c, kPGPLocalEncoding_None ),
606be7 ¤   ¤   ¤   ¤   ¤   PGPOArmorOutput(c, TRUE),
79a6ca ¤   ¤   ¤   ¤   ¤   PGPOOutputLineEndType( c, kPGPLineEnd_CRLF),
b00b6c ¤   ¤   ¤   ¤   ¤   PGPOEventHandler( c, sPGPEncodeEventHandler, &data ),
06d470 ¤   ¤   ¤   ¤   ¤   PGPOSendNullEvents( c, TRUE ),
--bad1 0004760216040120089 Page 3 of CSignTranslator.cp
f95dcd ¤   ¤   ¤   ¤   ¤   PGPOClearSign(c, TRUE),
6276cb ¤   ¤   ¤   ¤   ¤   PGPOVersionString( c, pgpVersionHeaderString ),
96fe8f ¤   ¤   ¤   ¤   ¤   PGPOCommentString( c, comment ),
616ca6 ¤   ¤   ¤   ¤   ¤   PGPOLastOption(c)
1ff977 ¤   ¤   ¤   ¤   ¤   );
4187c7 ¤   ¤   ¤
d475d7 ¤   ¤   ¤   if ( err.IsntError() )
d4f776 ¤   ¤   ¤   {
c6a5f4 ¤   ¤   ¤   ¤   err.pgpErr = PGPGuaranteeMinimumEntropy( c );
c4a3a6 ¤   ¤   ¤   }
67af5a
0075d7 ¤   ¤   ¤   if ( err.IsntError() )
cbf776 ¤   ¤   ¤   {
f11dab ¤   ¤   ¤   ¤   if ( usePGPMime )
b172c3 ¤   ¤   ¤   ¤   {
0062a7 ¤   ¤   ¤   ¤   ¤   err.err¤= PGPEncode( c,
12cebb ¤   ¤   ¤   ¤   ¤   ¤   ¤   optionList,
6343bb ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPGPMIMEEncoding( c, TRUE,
98274a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mimeBodyOffset, mimeDelimiter ),
403a8c ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOOmitMIMEVersion( c, TRUE),
637056 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(c) );
0a2613 ¤   ¤   ¤   ¤   }
40fa07 ¤   ¤   ¤   ¤   else
3272c3 ¤   ¤   ¤   ¤   {
3b238b ¤   ¤   ¤   ¤   ¤   /* clear sign */
62c1df ¤   ¤   ¤   ¤   ¤   err.err¤= PGPEncode( c, optionList, PGPOLastOption(c) );
022613 ¤   ¤   ¤   ¤   }
b6a3a6 ¤   ¤   ¤   }
2787c7 ¤   ¤   ¤
be6d97 ¤   ¤   ¤   if( err.IsntError() )
03f776 ¤   ¤   ¤   {
06cc0e ¤   ¤   ¤   ¤   RememberSigningPassBuffer( passBuffer, signingKey );
722b85 ¤   ¤   ¤   ¤
623034 ¤   ¤   ¤   ¤   // remember it for encryption as well (but not vice versa)
4b69e1 ¤   ¤   ¤   ¤   RememberDecryptionPassBuffer( passBuffer, signingKey );
56a3a6 ¤   ¤   ¤   }
bd2b85 ¤   ¤   ¤   ¤
3200b4 ¤   ¤   ¤   PGPFreePassBuffer( passBuffer );
58af5a
798480 ¤   ¤   ¤   if ( optionList != kInvalidPGPOptionListRef )
054118 ¤   ¤   ¤   ¤   PGPFreeOptionList( optionList );
0b0fe4 ¤   ¤   }
bf1b52 ¤   ¤
3b8e29 ¤   ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), outSpec,
a70c1a ¤   ¤   ¤   ¤   ¤   "\pSignedOut" );
641b52 ¤   ¤
1a4c93 ¤   ¤   // finish up by creating appropriate MIME types and parameters
1e7fc6 ¤   ¤   // and by putting output data into appropriate format
aff9a8 ¤   ¤   if ( err.IsntError() )
a85b34 ¤   ¤   {
bd53a9 ¤   ¤   ¤   if ( ! usePGPMime )
e5f776 ¤   ¤   ¤   {
36a668 ¤   ¤   ¤   ¤   // signatureSpec contains the original data + the signature
443f70 ¤   ¤   ¤   ¤   err.err¤= FSpExists( outSpec ) ? kPGPError_NoErr :
0c45c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPError_FileNotFound;
b9a3a6 ¤   ¤   ¤   }
c787c7 ¤   ¤   ¤
597c40 ¤   ¤   ¤   // this information already in output, but Eudora forces us to
aea659 ¤   ¤   ¤   // put it in a Eudora-defined data structure
0775d7 ¤   ¤   ¤   if ( err.IsntError() )
43f776 ¤   ¤   ¤   {
2cd6cf ¤   ¤   ¤   ¤   // create appropriate MIME types for Eudora
e627b8 ¤   ¤   ¤   ¤   pgpAssert( IsntNull( outMIMEtypeHandlePtr ) );
2baf5a
ad1dab ¤   ¤   ¤   ¤   if ( usePGPMime )
b372c3 ¤   ¤   ¤   ¤   {
ceb21f ¤   ¤   ¤   ¤   ¤   err.err¤= BuildSignedPGPMIMEType( outMIMEtypeHandlePtr,
33b0c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mimeDelimiter );
7f2613 ¤   ¤   ¤   ¤   }
7dfa07 ¤   ¤   ¤   ¤   else
4072c3 ¤   ¤   ¤   ¤   {
474ab8 ¤   ¤   ¤   ¤   ¤   err.err¤= CreateMIMEType( "\ptext", "\pplain",
--43ab 0015b69814a40120089 Page 4 of CSignTranslator.cp
6f9799 ¤   ¤   ¤   ¤   ¤   ¤   ¤   outMIMEtypeHandlePtr );
072613 ¤   ¤   ¤   ¤   }
a4af5a
663424 ¤   ¤   ¤   ¤   if ( err.IsntError() )
3d72c3 ¤   ¤   ¤   ¤   {
e3acc1 ¤   ¤   ¤   ¤   ¤   err.err¤= AddMIMEParam( *outMIMEtypeHandlePtr,
0f3be1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPAlreadyProcessedParamName,
aa4765 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPAlreadyProcessedParamValue);
3f2613 ¤   ¤   ¤   ¤   }
88a3a6 ¤   ¤   ¤   }
850fe4 ¤   ¤   }
5a1b52 ¤   ¤
068e29 ¤   ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), outSpec,
6a71fe ¤   ¤   ¤   ¤   ¤   "\pSignFinalOut" );
491b52 ¤   ¤
41eaa1 ¤   ¤   if ( err.IsError() )
595b34 ¤   ¤   {
fa1349 ¤   ¤   ¤   gSigningPassphraseCache->Forget();
1687c7 ¤   ¤   ¤
9eaaab ¤   ¤   ¤   ReportError( err );
a40fe4 ¤   ¤   }
e39371 ¤   }
6267c5 ¤
88ae30 ¤   ¤   ¤   ¤   ¤
55d3ba ¤   return( CComboErrorToEudoraError( err ) );
58efe6 }
36af5a
7daf5a
d9af5a
c66d52 ¤   void
2faf19 CSignTranslator::GetErrorString(
c8607c ¤   CComboError¤err,
48db0f ¤   StringPtr¤  msg )
4abb36 {
f6bede ¤   if ( err.HavePGPError() )
c8c7a1 ¤   {
4ec592 ¤   ¤   switch( err.pgpErr )
5f5b34 ¤   ¤   {
c6db68 ¤   ¤   ¤   default:
3397df ¤   ¤   ¤   ¤   CTranslator::GetErrorString( err, msg );
82f622 ¤   ¤   ¤   ¤   break;
e887c7 ¤   ¤   ¤
bd1038 ¤   ¤   ¤   case kPGPError_SecretKeyNotFound:
f613ba ¤   ¤   ¤   case kPGPError_AdditionalRecipientRequestKeyNotFound:
35c05f ¤   ¤   ¤   ¤   GetIndString( msg,
b80f64 ¤   ¤   ¤   ¤   ¤   kTranslatorErrorStringsResID, kNoDefaultKeyStrIndex );
25f622 ¤   ¤   ¤   ¤   break;
3e0fe4 ¤   ¤   }
479371 ¤   }
650e24 ¤   else
b8c7a1 ¤   {
b6abf7 ¤   ¤   CTranslator::GetErrorString( err, msg );
3c9371 ¤   }
57efe6 }
afaf5a
b7af5a
bfaf5a
63af5a
d6af5a
d9af5a
92af5a
b7af5a
5baf5a
--4cf4 001a85cb57f4012008a Page 1 of CSignTranslator.h
a70335 /*____________________________________________________________________________
f80315 ¤   CSignTranslator.h
6967c5 ¤
fdc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
794b0f ¤   All rights reserved.
e067c5 ¤
5b67c5 ¤
f8af5a
6bc21d ¤   $Id: CSignTranslator.h,v 1.8.8.1 1998/11/12 03:06:35 heller Exp $
18f7f7 ____________________________________________________________________________*/
367b7d #pragma once
33af5a
7fbbc6 #include "TranslatorUtils.h"
3a1ee8 #include "CTranslator.h"
eaaf5a
9f43e5 class CSignTranslator : public CTranslator
7abb36 {
bca2d3 protected:
f767c5 ¤
a3d02b ¤   CipherOutputType¤   mOutputType;
6d67c5 ¤
bb67c5 ¤
cc61cb ¤   virtual void¤   ¤   GetErrorString( CComboError err, StringPtr msg);
1467c5 ¤
a5af5a
665ed4 public:
ae7825 ¤   CSignTranslator( PGPContextRef context, PGPtlsContextRef tlsContext,
684472 ¤   ¤   ¤   ¤   ¤   emsProgress progressHook,
19ad9b ¤   ¤   ¤   ¤   ¤   CipherOutputType outputType = kUseOldPGPFormat );
0d67c5 ¤
0de4f8 ¤   virtual PluginError¤TranslateFile( long transContext,·
c2916e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstemsMIMETypeHandle InMIMEtypeHandle,
de4e30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * inFSp,
83357e ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle** addressesHandle,
acf809 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsMIMETypeHandle *¤OutMIMEtypeHandlePtr,
c9e6c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * outFSp,
a8cfc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* returnedMessage,
d18f0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* errorMessage, long * resultCode);
a882f7 };
--d710 00083a5a8654012008b Page 1 of CTranslator.cp
a70335 /*____________________________________________________________________________
2cd423 ¤   CTranslator.cp
cd67c5 ¤
b7c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
224b0f ¤   All rights reserved.
f467c5 ¤
9a926c ¤   $ld$
72f7f7 ____________________________________________________________________________*/
f9324c #include <string.h>
547c7a #include <Icons.h>
0e4b15 #include <TextUtils.h>
50af5a
3d85c2 #include "MacStrings.h"
aec110 #include "pgpMacMemory.h"
928e44 #include "MacIcons.h"
3dbbf4 #include "MacFiles.h"
be090b #include "MacEvents.h"
8b3a2c #include "WarningAlert.h"
3a76b7 #include "MacErrors.h"
bcaf5a
5f4919 #include "pgpUtilities.h"
32a076 #include "pgpKeys.h"
4e2f8d #include "pgpErrors.h"
b2e684 #include "pgpUserInterface.h"
b21b42 #include "pgpStrings.h"
90af5a
7a1ee8 #include "CTranslator.h"
ade001 #include "PassphraseCache.h"
10c8f2 #include "PGPUserInterface.h"
57e6f3 #include "TranslatorIDs.h"
902bcf #include "MyMIMEUtils.h"
bc76fd #include "TranslatorStrings.h"
82bbc6 #include "TranslatorUtils.h"
5d4cfb #include "TranslatorPrefs.h"
728e25 #include "pgpVersionHeader.h"
b95c50 #include "MacMenus.h"
6ed73a #include "CSecureMemory.h"
300d91 #include "pgpSharedEncryptDecrypt.h"
44a02f #include "pgpClientLib.h"
81e684 #include "pgpUserInterface.h"
1c628e #include "pgpClientErrors.h"
07a6f2 #include "PlugInLibUtils.h"
ddaf5a
8b8fb6 static void¤¤   AddCommandKeys( void );
c7af5a
110f3a typedef struct TranslatorInfo
0cbb36 {
0da2ec ¤   ConstStringPtr¤ description;
d4bd95 ¤   SInt32¤ ¤   ¤   type;
f05efd ¤   SInt32¤ ¤   ¤   id;¤// aka subtype
707dbf ¤   UInt32¤ ¤   ¤   flags;
f38937 ¤   short¤  ¤   ¤   iconSuiteID;¤   // 0 if none
435929 } TranslatorInfo;
e1af5a
74116f const ResID¤¤   kDoesntHaveIconSuite¤   = 0;
f6af5a
49b783 static TranslatorInfo¤  sTranslatorInfo[] =
cbbb36 {
7ec7a1 ¤   {
27fb09 ¤   ¤   "\pPGP Plugin Encrypt",
25526c ¤   ¤   EMST_PREPROCESS,
ad1418 ¤   ¤   kEncryptTranslatorID,
8c55b3 ¤   ¤   ( EMSF_Q4_TRANSMISSION | EMSF_WHOLE_MESSAGE |
e514fe ¤   ¤   ¤   EMSF_REQUIRES_MIME | EMSF_GENERATES_MIME ),
678494 ¤   ¤   kEncryptIconSuiteID
98ba24 ¤   },
3b67c5 ¤
17c7a1 ¤   {
fd94b8 ¤   ¤   "\pPGP Plugin Sign",
15256a ¤   ¤   EMST_SIGNATURE,
735734 ¤   ¤   kSignTranslatorID,
8355b3 ¤   ¤   ( EMSF_Q4_TRANSMISSION | EMSF_WHOLE_MESSAGE |
--c3df 000c7bf2ac94012008b Page 2 of CTranslator.cp
4314fe ¤   ¤   ¤   EMSF_REQUIRES_MIME | EMSF_GENERATES_MIME ),
60dfa5 ¤   ¤   kSignIconSuiteID
58ba24 ¤   },
fc67c5 ¤
4767c5 ¤
ebc7a1 ¤   {
cccd02 ¤   ¤   "\pPGP Plugin Encrypt & Sign",
2121ae ¤   ¤   EMST_COALESCED,
af3c22 ¤   ¤   kEncryptAndSignTranslatorID,
0b55b3 ¤   ¤   ( EMSF_Q4_TRANSMISSION | EMSF_WHOLE_MESSAGE |
9614fe ¤   ¤   ¤   EMSF_REQUIRES_MIME | EMSF_GENERATES_MIME ),
8d75a7 ¤   ¤   kDoesntHaveIconSuite
22ba24 ¤   },
a367c5 ¤
bec7a1 ¤   {
cb8181 ¤   ¤   "\pPGP Plugin Verify",
86256a ¤   ¤   EMST_SIGNATURE,
c3afa1 ¤   ¤   kVerifyTranslatorID,
da19e1 ¤   ¤   ( EMSF_ON_ARRIVAL | EMSF_ON_DISPLAY | EMSF_REQUIRES_MIME |
eb316e ¤   ¤   ¤   EMSF_GENERATES_MIME ),
34dfa5 ¤   ¤   kSignIconSuiteID
85ba24 ¤   },
4367c5 ¤
87c7a1 ¤   {
7b7ee3 ¤   ¤   "\pPGP Plugin Decrypt",
73526c ¤   ¤   EMST_PREPROCESS,
998049 ¤   ¤   kDecryptTranslatorID,
bc2492 ¤   ¤   ( EMSF_ON_ARRIVAL | EMSF_ON_DISPLAY | EMSF_WHOLE_MESSAGE |
e214fe ¤   ¤   ¤   EMSF_REQUIRES_MIME | EMSF_GENERATES_MIME ),
798494 ¤   ¤   kEncryptIconSuiteID
1fba24 ¤   },
e067c5 ¤
0dc7a1 ¤   {
ed6c29 ¤   ¤   "\pPGP Decrypt/Verify",
a6526c ¤   ¤   EMST_PREPROCESS,
de3788 ¤   ¤   kManualDecryptVerifyTranslatorID,
a7694c ¤   ¤   ( EMSF_ON_REQUEST | EMSF_WHOLE_MESSAGE ·),
3b75a7 ¤   ¤   kDoesntHaveIconSuite
b4ba24 ¤   },
ee67c5 ¤
87c7a1 ¤   {
28a9b4 ¤   ¤   "\pPGP Add Keys",
d6526c ¤   ¤   EMST_PREPROCESS,
f20051 ¤   ¤   kManualAddKeyTranslatorID,
cb694c ¤   ¤   ( EMSF_ON_REQUEST | EMSF_WHOLE_MESSAGE ·),
1275a7 ¤   ¤   kDoesntHaveIconSuite
dfba24 ¤   },
fa67c5 ¤
72c7a1 ¤   {
637d2e ¤   ¤   "\pPGP Encrypt/Sign",
00526c ¤   ¤   EMST_PREPROCESS,
ad1427 ¤   ¤   kManualEncryptSignTranslatorID,
1c694c ¤   ¤   ( EMSF_ON_REQUEST | EMSF_WHOLE_MESSAGE ·),
5875a7 ¤   ¤   kDoesntHaveIconSuite
16ba24 ¤   },
cb67c5 ¤
fdc7a1 ¤   {
e14738 ¤   ¤   "\pPGP Sign",
45526c ¤   ¤   EMST_PREPROCESS,
03f014 ¤   ¤   kManualSignTranslatorID,
37694c ¤   ¤   ( EMSF_ON_REQUEST | EMSF_WHOLE_MESSAGE ·),
8975a7 ¤   ¤   kDoesntHaveIconSuite
f3ba24 ¤   },
0b67c5 ¤
acc7a1 ¤   {
b882b6 ¤   ¤   "\pPGP Encrypt",
fd526c ¤   ¤   EMST_PREPROCESS,
3df5d4 ¤   ¤   kManualEncryptTranslatorID,
1e694c ¤   ¤   ( EMSF_ON_REQUEST | EMSF_WHOLE_MESSAGE ·),
6275a7 ¤   ¤   kDoesntHaveIconSuite
cbba24 ¤   },
c782f7 };
--4c3f 000ea03329a4012008b Page 3 of CTranslator.cp
e0af5a
1aaf5a
a13ac9 CTranslator::CTranslator(
92a1bc ¤   PGPContextRef¤  ¤   context,
036c35 ¤   PGPtlsContextRef¤   tlsContext,
e75109 ¤   emsProgress¤¤   ¤   progressHook )
23bb36 {
b61802 ¤   mContext¤   ¤   = context;
080971 ¤   mTLSContext¤¤   = tlsContext;
5dc7e9 ¤   mKeySet¤¤   ¤   = kInvalidPGPKeySetRef;
0267c5 ¤
cc60f9 ¤   /* may be NULL */
c5d297 ¤   mEudoraProgress¤= progressHook;
04efe6 }
92af5a
0baf5a
b6ff24 CTranslator::~CTranslator( )
7dbb36 {
58dd64 ¤   if ( IsntNull( mKeySet ) )
5bc7a1 ¤   {
351141 ¤   ¤   PGPFreeKeySet( mKeySet );
50ea68 ¤   ¤   mKeySet¤= NULL;
e69371 ¤   }
75efe6 }
81af5a
3eaf5a
a5af5a
acd6fb ¤   PluginError
e07532 CTranslator::GetInfo(
44f264 ¤   TranslatorID¤   id,
f27b58 ¤   long *¤ ¤   ¤   typePtr,
2fa4d6 ¤   long *¤ ¤   ¤   subtypePtr,
738568 ¤   ulong *¤¤   ¤   flagsPtr,
ee5318 ¤   StringHandle *¤ transDesc,
540d20 ¤   Handle *¤   ¤   iconHandlePtr)
01bb36 {
72fd0a ¤   CComboError¤¤   ¤   ¤   err;
11d630 ¤   const TranslatorInfo *¤ info¤   = nil;
5567c5 ¤
9377bc ¤   if ( id == kManualAddKeyTranslatorID )
40c7a1 ¤   {
973a27 ¤   ¤   AddCommandKeys();
119371 ¤   }
2967c5 ¤
523272 ¤   // find info for the specified translator
5f4b43 ¤   for(¤   ulong index = ·kFirstTranslatorID;
761bd9 ¤   ¤   ¤   index < kFirstTranslatorID + kPGPNumTranslators;
9ef424 ¤   ¤   ¤   ++ index )
32c7a1 ¤   {
e5d722 ¤   ¤   info¤   = &sTranslatorInfo[ index - 1 ];
50eae3 ¤   ¤   if ( info->id == id )
63cdcb ¤   ¤   ¤   break;
626df3 ¤   ¤   info¤   = nil;
629371 ¤   }
7bf97f ¤   pgpAssert( IsntNull( info ) );
a967c5 ¤
fe368c ¤   if ( IsntNull( typePtr ) )
984247 ¤   ¤   *typePtr¤   = info->type;
7e1b52 ¤   ¤
c7f402 ¤   if ( IsntNull( subtypePtr ) )
d2f6ab ¤   ¤   *subtypePtr¤= info->id;
e21b52 ¤   ¤
f8f54b ¤   if ( IsntNull( flagsPtr ) )
1cd723 ¤   ¤   *flagsPtr¤  = info->flags;
a31b52 ¤   ¤
24236c ¤   if ( IsntNull( iconHandlePtr ) )
637a87 ¤   ¤   *iconHandlePtr¤ = nil;
6a67c5 ¤
d10be3 ¤   // The description
cfd706 ¤   if( IsntNull( transDesc ) )
6cc7a1 ¤   {
ea42de ¤   ¤   *transDesc = (StringHandle) NewHandle( StrSize( info->description ) );
--c48b 0008c03a6aa4012008b Page 4 of CTranslator.cp
d5b9e2 ¤   ¤   MacLeaks_ForgetHandle( *transDesc,kMacLeaks_DisposeHandleDeallocType);
de1b52 ¤   ¤
126eda ¤   ¤   if ( IsntNull( *transDesc ) )
275b34 ¤   ¤   {
038fd5 ¤   ¤   ¤   CopyPString( info->description, **transDesc);
dc0fe4 ¤   ¤   }
9c0e1d ¤   ¤   else
4f5b34 ¤   ¤   {
6e0b0f ¤   ¤   ¤   err.err¤= memFullErr;
120fe4 ¤   ¤   }
0c9371 ¤   }
d067c5 ¤
29b185 ¤   // The icon
1fb647 ¤   if( IsntNull( iconHandlePtr ) &&
5e3e89 ¤   ¤   ¤   info->iconSuiteID != kDoesntHaveIconSuite )
f1c7a1 ¤   {
c5b315 ¤   ¤   Handle¤ theSuiteH = nil;
7f67c5 ¤
41c491 ¤   ¤   MacLeaks_Suspend();
961b52 ¤   ¤
d94890 ¤   ¤   err.err = GetIconSuite( &theSuiteH, info->iconSuiteID,
c301f7 ¤   ¤   ¤   ¤   ¤   svAllAvailableData);
9c3964 ¤   ¤   if( err.IsntError() && IsntNull( theSuiteH ) )
e95b34 ¤   ¤   {
a40c83 ¤   ¤   ¤   err.err = DuplicateIconSuite(theSuiteH, iconHandlePtr);
beb5a4 ¤   ¤   ¤   DisposeIconSuite( theSuiteH, true);
a80fe4 ¤   ¤   }
041b52 ¤   ¤
969538 ¤   ¤   MacLeaks_Resume();
2f9371 ¤   }
b467c5 ¤
22d3ba ¤   return( CComboErrorToEudoraError( err ) );
d7efe6 }
5aaf5a
49af5a
deaf5a
acc744 ¤   PGPError
aa244c CTranslator::LoadDefaultKeySet( PGPBoolean¤ writeable )
4abb36 {
6e9479 ¤   PGPError¤   ¤   ¤   ¤   err¤= kPGPError_NoErr;
1c0454 ¤   PGPKeyRingOpenFlags¤¤   openFlags¤  = 0;
4567c5 ¤
e04e71 ¤   if ( writeable )
67719f ¤   ¤   openFlags¤  |= kPGPKeyRingOpenFlags_Mutable;
191b52 ¤   ¤
fe29cd ¤   if ( IsNull( mKeySet ) )
c5c7a1 ¤   {
6ebbc2 ¤   ¤   err¤= PGPOpenDefaultKeyRings( mContext, openFlags, &mKeySet );
f19371 ¤   }
1067c5 ¤
9bdeb7 ¤   return( err );
3cefe6 }
bcaf5a
27de7b ··
110335 /*____________________________________________________________________________
f8a333 ¤   Caller must call PGPFreeKey() on *signingKeyOut
abf7f7 ____________________________________________________________________________*/
8785b7 ¤   CComboError
18d8bd CTranslator::GetSigningPassBuffer(
158b95 ¤   PGPPassBufferRef¤   *passBufferOut,
c25e4d ¤   PGPKeyRef *¤¤   ¤   signingKeyOut )
f5bb36 {
2eadd8 ¤   CComboError¤¤   ¤   err;
cf810d ¤   PGPPassBufferRef¤   passBuffer;
48b698 ¤   PGPKeyRef¤  ¤   ¤   signingKey;
e767c5 ¤
537355 ¤   if ( IsNull( passBufferOut ) || IsNull( signingKeyOut ) )
afc7a1 ¤   {
20cf43 ¤   ¤   err.pgpErr¤ = kPGPError_BadParams;
0be55e ¤   ¤   return( err );
d09371 ¤   }
8caf5a
--a288 0008977be404012008b Page 5 of CTranslator.cp
1475bc ¤   passBuffer = kInvalidPGPPassBufferRef;
4910fe ¤   signingKey = kInvalidPGPKeyRef;
3667c5 ¤
9f29cd ¤   if ( IsNull( mKeySet ) )
8ec960 ¤   ¤   err.pgpErr = LoadDefaultKeySet( FALSE );
071b52 ¤   ¤
14ed80 ¤   if ( err.IsntError() )
5bc7a1 ¤   {
550729 ¤   ¤   err.pgpErr = PGPNewPassBuffer( PGPGetContextMemoryMgr( mContext ),
4d6ec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passBuffer );
445a9f ¤   ¤   if( err.IsntError() )
075b34 ¤   ¤   {
b55ff1 ¤   ¤   ¤   CSecureCString256¤  data;
b23128 ¤   ¤   ¤   PGPBoolean¤ ¤   ¤   isPassphrase;
f563b8 ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   dataLength;
e7af5a
9dc4f9 ¤   ¤   ¤   if ( gSigningPassphraseCache->GetPassphraseOrPasskey( mKeySet,
85cebb ¤   ¤   ¤   ¤   ¤   data, &isPassphrase, &dataLength, &signingKey ) )
2ff776 ¤   ¤   ¤   {
76c806 ¤   ¤   ¤   ¤   /* already in cache */
5edf0e ¤   ¤   ¤   ¤   pgpAssert( ! err.IsError() );
9a2b85 ¤   ¤   ¤   ¤
86c2ac ¤   ¤   ¤   ¤   if( isPassphrase )
e672c3 ¤   ¤   ¤   ¤   {
b4f54c ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPPassBufferSetPassphrase( passBuffer,
bd2760 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   data );
902613 ¤   ¤   ¤   ¤   }
07fa07 ¤   ¤   ¤   ¤   else
4572c3 ¤   ¤   ¤   ¤   {
5187e7 ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPPassBufferSetPassKey( passBuffer,
d1614e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPByte *) (char *) data, dataLength);
192613 ¤   ¤   ¤   ¤   }
77a3a6 ¤   ¤   ¤   }
d2bb8c ¤   ¤   ¤   else
acf776 ¤   ¤   ¤   {
d82b46 ¤   ¤   ¤   ¤   char¤   ¤   ¤   ¤   ¤   ¤   ¤   msg[ 256 ];
861288 ¤   ¤   ¤   ¤   PGPGetPassphraseSettings¤   ¤   userSettings;
e65f15 ¤   ¤   ¤   ¤   PGPGetPassphraseSettings¤   ¤   settings¤   = 0;
212128 ¤   ¤   ¤   ¤   const PGPGetPassphraseOptions¤  options¤¤   =·
fda3a4 ¤   ¤   ¤   ¤   ¤   kPGPGetPassphraseOptionsHideFileOptions;
d82b85 ¤   ¤   ¤   ¤
d8812b ¤   ¤   ¤   ¤   GetIndCString( msg, kTranslatorErrorStringsResID,
ab85ce ¤   ¤   ¤   ¤   ¤   kPleaseEnterSigningPassphraseStrIndex );
30af5a
225a7f ¤   ¤   ¤   ¤   LoadDefaultKeySet( FALSE );
a12b85 ¤   ¤   ¤   ¤
65fd13 ¤   ¤   ¤   ¤   err.pgpErr¤ = PGPClientSigningPassphraseDialog( mContext,
4ff1a0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mKeySet, msg, options, settings, NULL,
252587 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   data, &userSettings, &signingKey );
f182e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
2e72c3 ¤   ¤   ¤   ¤   {
d9f54c ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPPassBufferSetPassphrase( passBuffer,
7a2760 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   data );
682613 ¤   ¤   ¤   ¤   }
03f8c8 ¤   ¤   ¤   ¤   else if( err.pgpErr == kPGPError_KeyUnusableForSignature )
bc72c3 ¤   ¤   ¤   ¤   {
771c38 ¤   ¤   ¤   ¤   ¤   PGPByte¤*passKey = NULL;
d4d2df ¤   ¤   ¤   ¤   ¤   PGPSize¤passKeySize;
28ae30 ¤   ¤   ¤   ¤   ¤
15e194 ¤   ¤   ¤   ¤   ¤   // User has chosen split key. Show reconstitution dialog
d07787 ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPReconstitutionDialog( signingKey, mKeySet,
463147 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPtlsContextRef,
71e223 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passKey, &passKeySize);
c5be0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
a84859 ¤   ¤   ¤   ¤   ¤   {
b79151 ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPPassBufferSetPassKey( passBuffer,
4c6f5c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passKey, passKeySize );
da94aa ¤   ¤   ¤   ¤   ¤   ¤
1191ce ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeData( passKey );
731c89 ¤   ¤   ¤   ¤   ¤   }
792613 ¤   ¤   ¤   ¤   }
89a3a6 ¤   ¤   ¤   }
--fc87 000692cc0044012008b Page 6 of CTranslator.cp
e587c7 ¤   ¤   ¤
40e922 ¤   ¤   ¤   if( err.IsError() )
bef776 ¤   ¤   ¤   {
fc5229 ¤   ¤   ¤   ¤   PGPFreePassBuffer( passBuffer );
792b85 ¤   ¤   ¤   ¤
f52db1 ¤   ¤   ¤   ¤   passBuffer = kInvalidPGPPassBufferRef;
32459d ¤   ¤   ¤   ¤   signingKey = kInvalidPGPKeyRef;
f4a3a6 ¤   ¤   ¤   }
d30fe4 ¤   ¤   }
6f9371 ¤   }
9d67c5 ¤
5d697e ¤   *passBufferOut¤ = passBuffer;
90f6c6 ¤   *signingKeyOut ¤= signingKey;
4167c5 ¤
d4deb7 ¤   return( err );
6aefe6 }
e4af5a
b3af5a
94af5a
f0af5a
ead6fb ¤   PluginError
c2ebd5 CTranslator::CanTranslateMIMEType(
1026f7 ¤   long¤   ¤   ¤   ¤   ¤   transContext,
04421f ¤   ConstemsMIMETypeHandle¤ mimeType,
7de683 ¤   ConstStr255Param¤   ¤   type,
43012c ¤   ConstStr255Param¤   ¤   subType,
52c898 ¤   ConstStr255Param¤   ¤   protocol )
47bb36 {
427a11 ¤   PluginError¤err¤= EMSR_CANT_TRANS;
a367c5 ¤
97d979 ¤   if ( IsntNull( mimeType ) )
36c7a1 ¤   {
aa8ca6 ¤   ¤   Boolean¤¤   haveValidContext;
08d6e6 ¤   ¤   const long¤ kValidContextMask¤  = EMSF_ON_DISPLAY | EMSF_ON_ARRIVAL;
c41b52 ¤   ¤
24a335 ¤   ¤   haveValidContext¤   = ( transContext & kValidContextMask ) != 0;
041b52 ¤   ¤
bb10a9 ¤   ¤   if ( haveValidContext )
4a5b34 ¤   ¤   {
be78ef ¤   ¤   ¤   Boolean¤¤   haveMatch;
cc87c7 ¤   ¤   ¤
ac8ff4 ¤   ¤   ¤   haveMatch¤  = MatchMIMEType( mimeType, type, subType );
4a87c7 ¤   ¤   ¤
7f44c7 ¤   ¤   ¤   if ( haveMatch && IsntNull( protocol ) )
03f776 ¤   ¤   ¤   {
eb676d ¤   ¤   ¤   ¤   Str255¤ ¤   ¤   paramValue;
752b85 ¤   ¤   ¤   ¤
6c77a2 ¤   ¤   ¤   ¤   haveMatch¤  = false;
a0712c ¤   ¤   ¤   ¤   if ( GetMIMEParameter( mimeType, "\pprotocol", paramValue ) )
8172c3 ¤   ¤   ¤   ¤   {
4dd9a5 ¤   ¤   ¤   ¤   ¤   haveMatch¤  = PStringsAreEqual( paramValue, protocol );
f62613 ¤   ¤   ¤   ¤   }
3a2b85 ¤   ¤   ¤   ¤
40d89f ¤   ¤   ¤   ¤   pgpAssertMsg( haveMatch,
eae213 ¤   ¤   ¤   ¤   ¤   "CTranslator::CanTranslateMIMEType: missing param" );
6ba3a6 ¤   ¤   ¤   }
7d87c7 ¤   ¤   ¤
883435 ¤   ¤   ¤   if ( haveMatch )
00f776 ¤   ¤   ¤   {
f1d9ab ¤   ·¤  ¤   ····if( transContext == EMSF_ON_ARRIVAL )
380baa ¤   ·¤  ¤   ····{
7e28dd ¤   ¤   ···¤ ·······err = EMSR_NOT_NOW;
3a1023 ¤   ¤   ···¤ ···}
689edb ¤   ¤   ···¤ ···else
2b44f3 ¤   ¤   ···¤ ···{
ec84f7 ¤   ¤   ···¤¤   ····err = EMSR_NOW;
c2b776 ¤   ¤   ···¤¤   }
25a3a6 ¤   ¤   ¤   }
b30fe4 ¤   ¤   }
b49371 ¤   }
6967c5 ¤
69deb7 ¤   return( err );
--423c 0000d02dc334012008b Page 7 of CTranslator.cp
7aefe6 }
d2ae30 ¤   ¤   ¤   ¤   ¤
88ae30 ¤   ¤   ¤   ¤   ¤
ebd6fb ¤   PluginError
33cc59 CTranslator::CanTranslate(
394bbe ¤   long¤   ¤   ¤   transContext,
6e8316 ¤   emsMIMEtype **¤ inMimeTypeHandle,
f4389c ¤   const FSSpec *¤ inFSp,
7f3111 ¤   StringHandle**¤ addressesHandle,
6c3e26 ¤   long *¤ ¤   ¤   aprox_len,
663ff6 ¤   StringHandle *¤ errorMessage,
d38385 ¤   long *¤ ¤   ¤   result_code)
90bb36 {
a2a711 ¤   PluginError¤err¤= EMSR_NOW;
13a1a2 ¤   Str255¤ ¤   ¤   paramValue;
ce67c5 ¤
f2d095 ¤   (void)inFSp;
fb87bf ¤   (void)addressesHandle;
c8cd59 ¤   (void)aprox_len;
42073c ¤   (void)result_code;
baae41 ¤   (void)transContext;
499004 ¤   pgpDebugMsgIf( (transContext & EMSF_Q4_COMPLETION ),"EMSF_Q4_COMPLETION");
1267c5 ¤
ddcd0c ¤   InitPtrToNil( errorMessage );
cd67c5 ¤
06fdc6 ¤   if ( GetMIMEParameter( inMimeTypeHandle,
2505de ¤   ¤   ¤   kPGPAlreadyProcessedParamName, paramValue ) )
c6c7a1 ¤   {
5a0109 ¤   ¤   // it has already been translated
5971e4 ¤   ¤   err¤= EMSR_CANT_TRANS;
b69371 ¤   }
43af5a
df7a51 ¤   err = EMSR_NOW;
6467c5 ¤
71deb7 ¤   return( err );
00efe6 }
87af5a
31af5a
1c85b7 ¤   CComboError
b0bc3f CTranslator::PrepareToTranslate( void )
2dbb36 {
4ab8e5 ¤   CComboError¤err;
a867c5 ¤
3d2bab ¤   err.pgpErr¤ = LoadDefaultKeySet( FALSE );
1cdefc ¤   if ( err.IsError() )
9fc7a1 ¤   {
f4d6bf ¤   ¤   if ( err.pgpErr == kPGPError_FileNotFound ||
79427c ¤   ¤   ¤   err.pgpErr == kPGPError_CantOpenFile )
545b34 ¤   ¤   {
b61fad ¤   ¤   ¤   WarningAlert( kWANoteAlertType, kWAOKStyle,
aac0e6 ¤   ¤   ¤   ¤   kTranslatorErrorStringsResID, kKeyringsNotFoundStrIndex);
140fe4 ¤   ¤   }
f90e1d ¤   ¤   else
c25b34 ¤   ¤   {
dfaaab ¤   ¤   ¤   ReportError( err );
b20fe4 ¤   ¤   }
5f9371 ¤   }
da67c5 ¤
8ddeb7 ¤   return( err );
0aefe6 }
51af5a
faaf5a
5fd6fb ¤   PluginError
98ce7c CTranslator::TranslateFile(
474bbe ¤   long¤   ¤   ¤   transContext,
5c6072 ¤   ConstemsMIMETypeHandle¤ inMIMEtypeHandle,
02389c ¤   const FSSpec *¤ inFSp,
ed3111 ¤   StringHandle**¤ addressesHandle,
d7c677 ¤   emsMIMETypeHandle*¤ outMIMEtypeHandlePtr,
a989d2 ¤   const FSSpec *¤ outFSp,
009ddb ¤   StringHandle*¤  returnedMessage,
0d9243 ¤   StringHandle*¤  errorMessage,
--6fac 000c286461d4012008b Page 8 of CTranslator.cp
28d71f ¤   long *¤ ¤   ¤   resultCode)
4dbb36 {
fee576 ¤   PluginError¤err = EMSR_INVALID_TRANS;
19af5a
a2ae41 ¤   (void)transContext;
e2dc46 ¤   (void)inMIMEtypeHandle;
18d095 ¤   (void)inFSp;
0887bf ¤   (void)addressesHandle;
d923c2 ¤   (void)outMIMEtypeHandlePtr;
c4c5f2 ¤   (void)outFSp;
c55aa4 ¤   (void)returnedMessage;
7ef32d ¤   (void)resultCode;
56d1f6 ¤   InitPtrToNil( returnedMessage );
f4cd0c ¤   InitPtrToNil( errorMessage );
6daf5a
a8deb7 ¤   return( err );
f7efe6 }
96af5a
1e0335 /*____________________________________________________________________________
a62eaa ¤   Caller should pass any desired options in 'optionsIn'. Examples:
214bc8 ¤   ¤   PGPOOutputLineEndType
06cc96 ¤   ¤   PGPOPGPMIMEEncoding
0f67c5 ¤
493a86 ¤   All relavant options are set in this routine.
4df7f7 ____________________________________________________________________________*/
d085b7 ¤   CComboError
446058 CTranslator::HandleEncryptSign(
7f7519 ¤   const FSSpec *¤ ¤   inSpec,
36b53e ¤   const FSSpec *¤ ¤   outSpec,
09ceaf ¤   StringHandle**¤ ¤   addressesHandle,
b6c932 ¤   Boolean¤¤   ¤   ¤   doSign,
41485f ¤   PGPOptionListRef¤   optionsIn,
e8305b ¤   Boolean¤¤   ¤   ¤   isPGPMime )
8ebb36 {
0badd8 ¤   CComboError¤¤   ¤   err;
aa5380 ¤   PGPKeySetRef¤   ¤   recipientSet¤   = kInvalidPGPKeySetRef;
3ea88f ¤   Boolean¤¤   ¤   ¤   gotRecipients¤  = false;
f6531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
5367f0 ¤   Boolean¤¤   ¤   doConventionalEncrypt¤  = FALSE;
b6851a ¤   Boolean¤¤   ¤   reportedError¤  ¤   ¤   = false;
beffb0 ¤   Boolean¤¤   ¤   fyeo¤   ¤   ¤   ¤   ¤   = false;
c9df90 ¤   char¤   ¤   ¤   *conventionalPassphrase¤= NULL;
fde12f ¤   PGPKeySetRef¤   newKeysToAdd¤   ¤   ¤   = kInvalidPGPKeySetRef;
79af5a
1afff4 ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), inSpec,
d3ea5b ¤   ¤   ¤   ¤   "\pEncryptIn" );
61af5a
982bab ¤   err.pgpErr¤ = LoadDefaultKeySet( FALSE );
5aed80 ¤   if ( err.IsntError() )
a6c7a1 ¤   {
94a91f ¤   ¤   PGPRecipientSettings¤   settings¤   = 0;
c067c5 ¤
265824 ¤   ¤   err¤= GetRecipientList( mContext, mTLSContext, addressesHandle,
34e3bf ¤   ¤   ¤   ¤   ¤   mKeySet, isPGPMime, &recipientSet, &settings, &newKeysToAdd¶
9c54c8 ·);
3bae30 ¤   ¤   ¤   ¤   ¤
012b97 ¤   ¤   doConventionalEncrypt¤  =
e76746 ¤   ¤   ¤   ( settings & kPGPRecipientSettingsConvEncrypt ) != 0;
53e025 ¤   ¤   fyeo = ( settings & kPGPRecipientSettingsFYEO ) != 0;
129371 ¤   }
6967c5 ¤
031e8b ¤   if ( err.IsntError() && doConventionalEncrypt )
a5c7a1 ¤   {
f85deb ¤   ¤   err.pgpErr¤ = PGPConventionalEncryptionPassphraseDialog( mContext,
43f880 ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( mContext, &conventionalPassphra¶
967b24 se ),
83b5ba ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) );
c99371 ¤   }
8767c5 ¤
218c0d ¤   /* enter this block if we are doing either kind of encrypt */
beebeb ¤   if ( err.IsntError() &&
c202c3 ¤   ¤   ( recipientSet != kInvalidPGPKeySetRef || doConventionalEncrypt ) )
--2232 00003de56b14012008b Page 9 of CTranslator.cp
f7c7a1 ¤   {
10cfd8 ¤   ¤   PGPKeyRef¤  ¤   ¤   signingKey¤ = kInvalidPGPKeyRef;
3280b7 ¤   ¤   PGPContextRef¤  ¤   c¤  = mContext;
2e7cc3 ¤   ¤   PGPPassBufferRef¤   passBuffer = kInvalidPGPPassBufferRef;
041b52 ¤   ¤
4010a0 ¤   ¤   if ( doSign )
a75b34 ¤   ¤   {
768d84 ¤   ¤   ¤   err = GetSigningPassBuffer( &passBuffer, &signingKey );
8d0fe4 ¤   ¤   }
1f1b52 ¤   ¤
77f9a8 ¤   ¤   if ( err.IsntError() )
e55b34 ¤   ¤   {
0359fc ¤   ¤   ¤   EncryptSignEventHandlerData¤data( this );
cafdb4 ¤   ¤   ¤   char¤   ¤   ¤   ¤   comment[ 256 ];
e7be0e ¤   ¤   ¤   PGPOptionListRef¤   optionList¤ = kInvalidPGPOptionListRef;
3587c7 ¤   ¤   ¤
b27a6a ¤   ¤   ¤   PrefGetComment( comment );
5287c7 ¤   ¤   ¤
1ff903 ¤   ¤   ¤   // all these options are the same, regardless of whether it's
7cf8bd ¤   ¤   ¤   // PGP/MIME or not
a590a9 ¤   ¤   ¤   err.pgpErr¤ = PGPBuildOptionList( c, &optionList,
26465d ¤   ¤   ¤   ¤   PGPOInputFileFSSpec( c, inSpec ),
348c04 ¤   ¤   ¤   ¤   PGPOOutputFileFSSpec( c, outSpec ),
7bdb19 ¤   ¤   ¤   ¤   PGPOLocalEncoding( c, kPGPLocalEncoding_None ),
da5222 ¤   ¤   ¤   ¤   PGPOArmorOutput(c, TRUE),
d016dd ¤   ¤   ¤   ¤   PGPODataIsASCII( c, TRUE ),
5d1dda ¤   ¤   ¤   ¤   PGPOEventHandler( c, sPGPEncodeEventHandler, &data ),
9d0cc2 ¤   ¤   ¤   ¤   PGPOSendNullEvents( c, TRUE ),
f6ad94 ¤   ¤   ¤   ¤   PGPOCommentString( c, comment ),
ee4ba5 ¤   ¤   ¤   ¤   PGPOVersionString( c, pgpVersionHeaderString ),
41e9a2 ¤   ¤   ¤   ¤   PGPOForYourEyesOnly( c, fyeo ),
e783d5 ¤   ¤   ¤   ¤   PGPOLastOption(c)
4fc29e ¤   ¤   ¤   ¤   );
9275d7 ¤   ¤   ¤   if ( err.IsntError() )
01f776 ¤   ¤   ¤   {
12aedb ¤   ¤   ¤   ¤   if ( doConventionalEncrypt ·)
eb72c3 ¤   ¤   ¤   ¤   {
928815 ¤   ¤   ¤   ¤   ¤   err.pgpErr¤ = PGPAppendOptionList( optionList,
f86bf0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOConventionalEncrypt( c,·
126b2a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( c, conventionalPassphrase ),
eb35e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c )),
04d1ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOCipherAlgorithm( c,
f8d43e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PrefGetConventionalCipher() ),
f6276b ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ) );
2b2613 ¤   ¤   ¤   ¤   }
94fa07 ¤   ¤   ¤   ¤   else
4572c3 ¤   ¤   ¤   ¤   {
55aa4a ¤   ¤   ¤   ¤   ¤   PreferredAlgorithmsStruct¤  algs;
32ae30 ¤   ¤   ¤   ¤   ¤
017f1e ¤   ¤   ¤   ¤   ¤   PrefGetPreferredAlgorithms( &algs );
45b1ca ¤   ¤   ¤   ¤   ¤   if ( algs.numAlgs !=0 )
364859 ¤   ¤   ¤   ¤   ¤   {
ab9b99 ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr¤ = PGPAppendOptionList( optionList,
a093c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPreferredAlgorithms( c,
6e0261 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   algs.algs, algs.numAlgs),
4b364c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ) );
781c89 ¤   ¤   ¤   ¤   ¤   }
8cae30 ¤   ¤   ¤   ¤   ¤
968815 ¤   ¤   ¤   ¤   ¤   err.pgpErr¤ = PGPAppendOptionList( optionList,
6a7aa6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEncryptToKeySet( c, recipientSet ),
12276b ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ) );
de2613 ¤   ¤   ¤   ¤   }
daa3a6 ¤   ¤   ¤   }
0287c7 ¤   ¤   ¤
ae97a4 ¤   ¤   ¤   if ( err.IsntError() && doSign )
66f776 ¤   ¤   ¤   {
eb5f86 ¤   ¤   ¤   ¤   err.pgpErr¤ = PGPAppendOptionList( optionList,·
02113a ¤   ¤   ¤   ¤   ¤   PGPOSignWithKey( c, signingKey,
9d2196 ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassBuffer(c, passBuffer),
06fa52 ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(c) ),
726e41 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ) );
03a3a6 ¤   ¤   ¤   }
--d7d6 0008c8f02324012008b Page 10 of CTranslator.cp
e587c7 ¤   ¤   ¤
1475d7 ¤   ¤   ¤   if ( err.IsntError() )
77f776 ¤   ¤   ¤   {
3fa5f4 ¤   ¤   ¤   ¤   err.pgpErr = PGPGuaranteeMinimumEntropy( c );
21a3a6 ¤   ¤   ¤   }
ef87c7 ¤   ¤   ¤
7575d7 ¤   ¤   ¤   if ( err.IsntError() )
c1f776 ¤   ¤   ¤   {
4b90ba ¤   ¤   ¤   ¤   err.pgpErr¤ = PGPEncode( c, optionList,
3aa42f ¤   ¤   ¤   ¤   ¤   optionsIn, PGPOLastOption( c ) );
46a3a6 ¤   ¤   ¤   }
7587c7 ¤   ¤   ¤
908480 ¤   ¤   ¤   if ( optionList != kInvalidPGPOptionListRef )
c04118 ¤   ¤   ¤   ¤   PGPFreeOptionList( optionList );
e60fe4 ¤   ¤   }
cc1b52 ¤   ¤
111b52 ¤   ¤
1387f7 ¤   ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ),
8b064a ¤   ¤   ¤   ¤   outSpec, "\pEncryptFinalOut" );
cc67c5 ¤
2f911c ¤   ¤   if ( err.IsntError() && doSign )
825b34 ¤   ¤   {
23464b ¤   ¤   ¤   RememberSigningPassBuffer( passBuffer, signingKey );
1387c7 ¤   ¤   ¤
22e09f ¤   ¤   ¤   // remember it for encryption as well (but not vice versa)
5b2796 ¤   ¤   ¤   RememberDecryptionPassBuffer( passBuffer, signingKey );
230fe4 ¤   ¤   }
f61b52 ¤   ¤
8c3a18 ¤   ¤   if( PGPPassBufferRefIsValid( passBuffer ) )
5d00b4 ¤   ¤   ¤   PGPFreePassBuffer( passBuffer );
729371 ¤   }
acaf5a
db8c47 ¤   if ( recipientSet != kInvalidPGPKeySetRef )
dbc7a1 ¤   {
74ba2a ¤   ¤   PGPFreeKeySet( recipientSet );
1e38cc ¤   ¤   recipientSet¤   = NULL;
fc9371 ¤   }
f267c5 ¤
db4492 ¤   /* allow user to add any new keys we fetched while sending */
70e982 ¤   if ( PGPKeySetRefIsValid( newKeysToAdd ) )
3ec7a1 ¤   {
59f9a8 ¤   ¤   if ( err.IsntError() )
645b34 ¤   ¤   {
2b2c01 ¤   ¤   ¤   PGPKeySetRef¤   importSet¤  = kInvalidPGPKeySetRef;
610e1a ¤   ¤   ¤   char¤   ¤   ¤   prompt[ sizeof( Str255 ) ];
c7ef65 ¤   ¤   ¤   PGPError¤   ¤   tempErr;
ef87c7 ¤   ¤   ¤
4364da ¤   ¤   ¤   GetIndCString( prompt, kTranslatorStringsRID,
4a3abf ¤   ¤   ¤   ¤   kSelectiveImportAfterSendPromptStrIndex );
2287c7 ¤   ¤   ¤
d937c5 ¤   ¤   ¤   tempErr = PGPSelectKeysDialog( mContext,
2ef50a ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation,
905995 ¤   ¤   ¤   ¤   ¤   ¤   prompt, newKeysToAdd,
610460 ¤   ¤   ¤   ¤   ¤   ¤   mKeySet, &importSet);
c19fbb ¤   ¤   ¤   if ( IsntPGPError( tempErr ) )
a7f776 ¤   ¤   ¤   {
84caec ¤   ¤   ¤   ¤   PGPSharedAddKeysToDefaultKeyring( importSet );
bca02e ¤   ¤   ¤   ¤   PGPFreeKeySet( importSet );
2aa3a6 ¤   ¤   ¤   }
190fe4 ¤   ¤   }
0a043e ¤   ¤   PGPFreeKeySet( newKeysToAdd );
af9371 ¤   }
e11b52 ¤   ¤
06ad89 ¤   if ( ! reportedError )
afc7a1 ¤   {
7d07f5 ¤   ¤   ReportError( err );
419371 ¤   }
6caf5a
b1cae2 ¤   if( IsntNull( conventionalPassphrase ) )
26be9d ¤   ¤   PGPFreeData( conventionalPassphrase );
911b52 ¤   ¤
8cdeb7 ¤   return( err );
--9f48 000605a21924012008b Page 11 of CTranslator.cp
7aefe6 }
46af5a
746d52 ¤   void
8cee49 CTranslator::GetErrorString(
705ec6 ¤   CComboError¤¤   err,
74684e ¤   StringPtr¤  ¤   resultString )
c4bb36 {
93bede ¤   if ( err.HavePGPError() )
eac7a1 ¤   {
e16204 ¤   ¤   /* pgp error */
04c592 ¤   ¤   switch( err.pgpErr )
425b34 ¤   ¤   {
62960a ¤   ¤   ¤   case memFullErr:
0047cf ¤   ¤   ¤   case kPGPError_OutOfMemory:
cdc2e7 ¤   ¤   ¤   ¤   GetIndString( resultString,
d6562a ¤   ¤   ¤   ¤   ¤   kTranslatorErrorStringsResID, kOutOfMemoryStrIndex );
37f622 ¤   ¤   ¤   ¤   break;
3d87c7 ¤   ¤   ¤
9adb68 ¤   ¤   ¤   default:
01f776 ¤   ¤   ¤   {
3c1beb ¤   ¤   ¤   ¤   Str255¤ errString;
3eaf5a
7af6ad ¤   ¤   ¤   ¤   PGPGetClientErrorString( err.pgpErr,
1c76d5 ¤   ¤   ¤   ¤   ¤   sizeof( errString ), (char *)errString);
03920f ¤   ¤   ¤   ¤   CToPString( (char *)errString, errString );
bfae30 ¤   ¤   ¤   ¤   ¤
be9dd6 ¤   ¤   ¤   ¤   GetIndString( resultString, kTranslatorErrorStringsResID,
f8a53a ¤   ¤   ¤   ¤   ¤   kGenericErrorTemplateString );
412b85 ¤   ¤   ¤   ¤
e78eab ¤   ¤   ¤   ¤   PrintPString( resultString, resultString, errString );
52f622 ¤   ¤   ¤   ¤   break;
26a3a6 ¤   ¤   ¤   }
180fe4 ¤   ¤   }
6d9371 ¤   }
d00e24 ¤   else
aac7a1 ¤   {
82de92 ¤   ¤   /* regular mac error */
13bc93 ¤   ¤   switch( err.err )
bb5b34 ¤   ¤   {
49960a ¤   ¤   ¤   case memFullErr:
21c2e7 ¤   ¤   ¤   ¤   GetIndString( resultString,
db562a ¤   ¤   ¤   ¤   ¤   kTranslatorErrorStringsResID, kOutOfMemoryStrIndex );
88f622 ¤   ¤   ¤   ¤   break;
c62b85 ¤   ¤   ¤   ¤
14db68 ¤   ¤   ¤   default:
c0f776 ¤   ¤   ¤   {
01f319 ¤   ¤   ¤   ¤   Str255¤ errorNumberString;
342b85 ¤   ¤   ¤   ¤
228576 ¤   ¤   ¤   ¤   GetOSErrorString( err.err, errorNumberString);
3b892c ¤   ¤   ¤   ¤   NumToString( err.err, errorNumberString );
832b85 ¤   ¤   ¤   ¤
dc9dd6 ¤   ¤   ¤   ¤   GetIndString( resultString, kTranslatorErrorStringsResID,
44a53a ¤   ¤   ¤   ¤   ¤   kGenericErrorTemplateString );
0d2b85 ¤   ¤   ¤   ¤
325831 ¤   ¤   ¤   ¤   PrintPString( resultString, resultString, errorNumberString );
ddf622 ¤   ¤   ¤   ¤   break;
05a3a6 ¤   ¤   ¤   }
220fe4 ¤   ¤   }
fc9371 ¤   }
07efe6 }
aaaf5a
18af5a
996d52 ¤   void
efa40d CTranslator::ReportError( CComboError¤  err )
4fbb36 {
c7cf1e ¤   if ( err.IsError() && ! err.IsCancelError() )
63c7a1 ¤   {
7296db ¤   ¤   Str255¤ errorMessage;
301b52 ¤   ¤
39ed94 ¤   ¤   GetErrorString( err, errorMessage );
2e1b52 ¤   ¤
6054bf ¤   ¤   WarningAlert( kWANoteAlertType, kWAOKStyle, errorMessage );
--0864 00050208ef54012008b Page 12 of CTranslator.cp
a19371 ¤   }
c9efe6 }
a0af5a
67af5a
b5c744 ¤   PGPError
035789 CTranslator::sPGPDecodeEventHandler(
75520e ¤   PGPContextRef¤  context,
1d3981 ¤   PGPEvent *¤ ¤   event,
304c20 ¤   PGPUserValue¤   userValue)
5bbb36 {
25dc13 ¤   PGPError¤   ¤   ¤   ¤   ¤   ¤   err;
cec527 ¤   DecryptVerifyEventHandlerData *¤data;
7167c5 ¤
d9f3db ¤   data = (DecryptVerifyEventHandlerData *) userValue;
0667c5 ¤
013320 ¤   pgpAssert( data->mMagic == EventHandlerData::kMagic );
efbd0c ¤   err¤= data->mTranslator->PGPDecodeEventHandler( context, event, data);
ba67c5 ¤
71deb7 ¤   return( err );
8fefe6 }
69af5a
d5c744 ¤   PGPError
0a2fd2 CTranslator::PGPDecodeEventHandler(
c6284d ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   context,
aeb33b ¤   PGPEvent *¤ ¤   ¤   ¤   ¤   ¤   event,
126306 ¤   DecryptVerifyEventHandlerData *¤data)
dbbb36 {
fd8e12 ¤   PGPError¤   err = kPGPError_NoErr;
ee67c5 ¤
d0d021 ¤   pgpAssert( context == mContext );
1467c5 ¤
13a505 ¤   switch( event->type )
dfc7a1 ¤   {
8ca537 ¤   ¤   case kPGPEvent_PassphraseEvent:
645b34 ¤   ¤   {
03ba28 ¤   ¤   ¤   PGPBoolean¤ havePassphrase = FALSE;
0287c7 ¤   ¤   ¤
db2941 ¤   ¤   ¤   if( event->data.passphraseData.fConventional )
eaf776 ¤   ¤   ¤   {
febc69 ¤   ¤   ¤   ¤   err = PGPClientDecodeEventHandler( context, event,
b1672a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &data->mClientHandlerData );
d1ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
0c0b63 ¤   ¤   ¤   ¤   havePassphrase = TRUE;
03a3a6 ¤   ¤   ¤   }
b5e583 ¤   ¤   ¤   else if( ! data->mTriedCachedPassphrase )
b2f776 ¤   ¤   ¤   {
2568be ¤   ¤   ¤   ¤   PGPOptionListRef¤   optionList;
1a2b85 ¤   ¤   ¤   ¤
0b9836 ¤   ¤   ¤   ¤   havePassphrase = gDecryptionPassphraseCache->GetPGPOptionList(
ec7252 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   context, &optionList );
03a772 ¤   ¤   ¤   ¤   if( havePassphrase )
1372c3 ¤   ¤   ¤   ¤   {
4d900e ¤   ¤   ¤   ¤   ¤   err = PGPAddJobOptions( event->job, optionList,
cf8af1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
cdae30 ¤   ¤   ¤   ¤   ¤
e6d653 ¤   ¤   ¤   ¤   ¤   data->mTriedCachedPassphrase = TRUE;
e92613 ¤   ¤   ¤   ¤   }
c9a3a6 ¤   ¤   ¤   }
fa87c7 ¤   ¤   ¤
ab026a ¤   ¤   ¤   if( IsntPGPError( err ) && ! havePassphrase )
cef776 ¤   ¤   ¤   {
141415 ¤   ¤   ¤   ¤   GetIndCString( data->mClientHandlerData.prompt,
5f2fc8 ¤   ¤   ¤   ¤   ¤   ¤   kTranslatorErrorStringsResID,
b0f6f4 ¤   ¤   ¤   ¤   ¤   ¤   kPleaseEnterDecryptionPassphraseStrIndex );
2faf5a
6ebc69 ¤   ¤   ¤   ¤   err = PGPClientDecodeEventHandler( context, event,
0eea19 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &data->mClientHandlerData );
baa3a6 ¤   ¤   ¤   }
be67c5 ¤
c1cdcb ¤   ¤   ¤   break;
e20fe4 ¤   ¤   }
501b52 ¤   ¤
--38a8 000d31937114012008b Page 13 of CTranslator.cp
4ec503 ¤   ¤   case kPGPEvent_SignatureEvent:
2c5b34 ¤   ¤   {
773195 ¤   ¤   ¤   err = PGPClientDecodeEventHandler( context, event,
fdea19 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &data->mClientHandlerData );
f3698b ¤   ¤   ¤   if( IsntPGPError( err ) )
a2f776 ¤   ¤   ¤   {
c057db ¤   ¤   ¤   ¤   data->mSignatureData.sigData =
afd484 ¤   ¤   ¤   ¤   ¤   ¤   data->mClientHandlerData.signatureData;
04577b ¤   ¤   ¤   ¤   data->mHaveSignatureData =
5220f7 ¤   ¤   ¤   ¤   ¤   ¤   data->mClientHandlerData.signatureDataValid;
ed2b85 ¤   ¤   ¤   ¤
da4957 ¤   ¤   ¤   ¤   data->mSignatureData.keyIDString[0] = 0;
452b85 ¤   ¤   ¤   ¤
9af1df ¤   ¤   ¤   ¤   if( data->mHaveSignatureData )
3172c3 ¤   ¤   ¤   ¤   {
b148f1 ¤   ¤   ¤   ¤   ¤   (void)PGPGetKeyIDString(·
bfaed9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &data->mSignatureData.sigData.signingKeyID,
f45dd7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyIDString_Abbreviated,
2ae457 ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->mSignatureData.keyIDString );
d82613 ¤   ¤   ¤   ¤   }
dba3a6 ¤   ¤   ¤   }
5f87c7 ¤   ¤   ¤
38cdcb ¤   ¤   ¤   break;
830fe4 ¤   ¤   }
11af5a
374f1b ¤   ¤   case kPGPEvent_NullEvent:
885b34 ¤   ¤   {
f03195 ¤   ¤   ¤   err = PGPClientDecodeEventHandler( context, event,
0eea19 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &data->mClientHandlerData );
8e698b ¤   ¤   ¤   if( IsntPGPError( err ) )
93f776 ¤   ¤   ¤   {
1d9e85 ¤   ¤   ¤   ¤   err = HandleProgressEvent( event );
bda3a6 ¤   ¤   ¤   }
dc87c7 ¤   ¤   ¤
b2cdcb ¤   ¤   ¤   break;
590fe4 ¤   ¤   }
701b52 ¤   ¤
209ae3 ¤   ¤   default:
435b34 ¤   ¤   {
0d3195 ¤   ¤   ¤   err = PGPClientDecodeEventHandler( context, event,
97ea19 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &data->mClientHandlerData );
9ecdcb ¤   ¤   ¤   break;
860fe4 ¤   ¤   }
fd9371 ¤   }
3967c5 ¤
c7deb7 ¤   return( err );
80efe6 }
a3af5a
96c744 ¤   PGPError
da8f19 CTranslator::sPGPEncodeEventHandler(
7e520e ¤   PGPContextRef¤  context,
363981 ¤   PGPEvent *¤ ¤   event,
404c20 ¤   PGPUserValue¤   userValue)
a5bb36 {
a0dc13 ¤   PGPError¤   ¤   ¤   ¤   ¤   ¤   err;
db0f15 ¤   EncryptSignEventHandlerData *¤  data;
bb67c5 ¤
432c55 ¤   data = (EncryptSignEventHandlerData *) userValue;
7567c5 ¤
ea3320 ¤   pgpAssert( data->mMagic == EventHandlerData::kMagic );
2e0018 ¤   err¤= data->mTranslator->PGPEncodeEventHandler( context, event, data);
8467c5 ¤
b3deb7 ¤   return( err );
1fefe6 }
e9af5a
3fc744 ¤   PGPError
3df742 CTranslator::PGPEncodeEventHandler(
f3284d ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   context,
b9b33b ¤   PGPEvent *¤ ¤   ¤   ¤   ¤   ¤   event,
94a934 ¤   EncryptSignEventHandlerData *¤  data)
63bb36 {
d38e12 ¤   PGPError¤   err = kPGPError_NoErr;
--f84e 00020b776914012008b Page 14 of CTranslator.cp
2a67c5 ¤
ed6d02 ¤   (void) context;
4028d2 ¤   (void) data;
db67c5 ¤
90a505 ¤   switch( event->type )
a0c7a1 ¤   {
714f1b ¤   ¤   case kPGPEvent_NullEvent:
905b34 ¤   ¤   {
8308c4 ¤   ¤   ¤   err = HandleProgressEvent( event );
0bcdcb ¤   ¤   ¤   break;
130fe4 ¤   ¤   }
201b52 ¤   ¤
989ae3 ¤   ¤   default:
e3cdcb ¤   ¤   ¤   break;
409371 ¤   }
5f67c5 ¤
6adeb7 ¤   return( err );
41efe6 }
5baf5a
c6c744 ¤   PGPError
5601bb CTranslator::HandleProgressEvent(PGPEvent *event)
22bb36 {
408e12 ¤   PGPError¤   err = kPGPError_NoErr;
1567c5 ¤
991020 ¤   pgpAssert( event->type == kPGPEvent_NullEvent );
6167c5 ¤
8700b0 ¤   /* progress event */
40cae5 ¤   if ( IsntNull( mEudoraProgress ) )
25c7a1 ¤   {
3f335d ¤   ¤   PGPUInt32¤  ¤   percentDone¤= 0;
1ac59a ¤   ¤   PGPFileOffset¤  bytesWritten;
3d3440 ¤   ¤   PGPFileOffset¤  bytesTotal;
981b52 ¤   ¤
5e7219 ¤   ¤   bytesWritten¤   = event->data.nullData.bytesWritten;
29ab0c ¤   ¤   bytesTotal¤ ¤   = event->data.nullData.bytesTotal;
d0c7c1 ¤   ¤   if ( bytesTotal != 0 )
5b5b34 ¤   ¤   {
cb8bd3 ¤   ¤   ¤   percentDone¤= 100 * ((float)bytesWritten / (float)bytesTotal);
da0fe4 ¤   ¤   }
e11b52 ¤   ¤
4efe6a ¤   ¤   if ( callProgress( mEudoraProgress, percentDone ) != 0 )
5d5b34 ¤   ¤   {
ffebc6 ¤   ¤   ¤   err¤= kPGPError_UserAbort;
500fe4 ¤   ¤   }
f39371 ¤   }
5767c5 ¤
49deb7 ¤   return( err );
f4efe6 }
e7af5a
5b70df ¤   static MenuHandle
d5e099 GetMessagePluginsMenu()
45bb36 {
1b94d3 ¤   MenuHandle¤ pluginsMenu¤= NULL;
d943dd ¤   MenuHandle¤ editMenu¤   = NULL;
2cdb95 ¤   Str255¤ ¤   itemText;
3067c5 ¤
2e94f6 ¤   /* get edit menu */
b5be24 ¤   editMenu¤   = GetIndMenuInMenuBar( 2 );
2f67c5 ¤
ac021f ¤   if ( IsntNull( editMenu ) )
34c7a1 ¤   {
35cdcb ¤   ¤   short¤  ¤   numItems¤   = CountMItems( editMenu );
b925c4 ¤   ¤   Boolean¤¤   foundIt¤= FALSE;
9a39bc ¤   ¤   short¤  ¤   cmdChar;
a0d595 ¤   ¤   short¤  ¤   cmdIndex;
cb1b52 ¤   ¤
19b08e ¤   ¤   /* search for command containing "Message Plug\320ins" */
3bbd51 ¤   ¤   for( cmdIndex = 1; cmdIndex <= numItems; ++cmdIndex )
ae5b34 ¤   ¤   {
0d9b6a ¤   ¤   ¤   char¤   cText[ 256 ];
6d87c7 ¤   ¤   ¤
20de47 ¤   ¤   ¤   GetMenuItemText( editMenu, cmdIndex, itemText);
--972c 000d9685ada4012008b Page 15 of CTranslator.cp
4fc1f0 ¤   ¤   ¤   PToCString( itemText, cText );
3987c7 ¤   ¤   ¤
13abf9 ¤   ¤   ¤   if ( FindSubStringNoCase( cText, "Message Plug\320ins" ))
28f776 ¤   ¤   ¤   {
dbcba9 ¤   ¤   ¤   ¤   foundIt¤= TRUE;
8af622 ¤   ¤   ¤   ¤   break;
1fa3a6 ¤   ¤   ¤   }
9f0fe4 ¤   ¤   }
b8959b ¤   ¤   if ( ! foundIt )
e65b34 ¤   ¤   {
69ea7e ¤   ¤   ¤   /* not found; assume hard-coded location */
f1eda8 ¤   ¤   ¤   cmdIndex¤   = 16;
e30fe4 ¤   ¤   }
ec1b52 ¤   ¤
c2615a ¤   ¤   GetItemCmd( editMenu, cmdIndex, &cmdChar );
0ef64d ¤   ¤   if ( cmdChar == 0x1B )
d75b34 ¤   ¤   {
c6e88b ¤   ¤   ¤   /* it's a submenu */
3f840f ¤   ¤   ¤   short¤  subMenuID;
1287c7 ¤   ¤   ¤
b30a46 ¤   ¤   ¤   GetItemMark( editMenu, cmdIndex, &subMenuID );
db8c6e ¤   ¤   ¤   if ( subMenuID != noMark )
35f776 ¤   ¤   ¤   {
996be8 ¤   ¤   ¤   ¤   pluginsMenu¤= GetMenuHandle( subMenuID );
f1a3a6 ¤   ¤   ¤   }
2f0fe4 ¤   ¤   }
0c9371 ¤   }
d267c5 ¤
3867c5 ¤
4f1574 ¤   return( pluginsMenu );
3fefe6 }
b1af5a
2caf5a
b233c8 ¤   static void
a2a731 AddKeyForCommand(
aca45e ¤   ConstStringPtr¤ cmd,
6fb854 ¤   char¤   ¤   ¤   cmdKey )
23bb36 {
89a470 ¤   MenuHandle¤ ¤   ¤   pluginsMenu¤= NULL;
3267c5 ¤
b92af7 ¤   pluginsMenu¤= GetMessagePluginsMenu();
360de0 ¤   if ( IsntNull( pluginsMenu ) )
e0c7a1 ¤   {
0ba0de ¤   ¤   short¤  ¤   numItems;
4452c1 ¤   ¤   Str255¤ ¤   itemText;
f41b52 ¤   ¤
024725 ¤   ¤   numItems¤   = CountMItems( pluginsMenu );
215636 ¤   ¤   for( short index¤   = 1; index <= numItems; ++index )
b45b34 ¤   ¤   {
db4551 ¤   ¤   ¤   GetMenuItemText( pluginsMenu, index, itemText );
44902a ¤   ¤   ¤   if ( PStringsAreEqual( itemText, cmd ) )
d4f776 ¤   ¤   ¤   {
99c438 ¤   ¤   ¤   ¤   SetItemCmd( pluginsMenu, index, cmdKey);
14f622 ¤   ¤   ¤   ¤   break;
39a3a6 ¤   ¤   ¤   }
460fe4 ¤   ¤   }
739371 ¤   }
7defe6 }
42af5a
b1af5a
5933c8 ¤   static void
932cd1 AddCommandKeys()
54bb36 {
fc1291 ¤   static Boolean¤ ¤   sAddedKeys¤ = FALSE;
a167c5 ¤
4b3152 ¤   if ( sAddedKeys )
ba99bf ¤   ¤   return;
aa00ca ¤   sAddedKeys¤ = TRUE;
e367c5 ¤
419327 ¤   /* commands must match those in translator info */
a217fe ¤   AddKeyForCommand( "\pPGP Sign", '2' );
d9b301 ¤   AddKeyForCommand( "\pPGP Encrypt", '3' );
--8005 001437c33264012008b Page 16 of CTranslator.cp
18f110 ¤   AddKeyForCommand( "\pPGP Encrypt/Sign", '4' );
583468 ¤   AddKeyForCommand( "\pPGP Decrypt/Verify", '5' );
e3efe6 }
5aaf5a
cdaf5a
c8af5a
adaf5a
f0af5a
8faf5a
e2af5a
d5af5a
77af5a
40af5a
61af5a
00af5a
15af5a
43af5a
--8948 00019097f7f4012008c Page 1 of CTranslator.h
a70335 /*____________________________________________________________________________
63868d ¤   CTranslator.h
e667c5 ¤
3cc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
ba4b0f ¤   All rights reserved.
9b67c5 ¤
7467c5 ¤
4caf5a
ecf9ef ¤   $Id: CTranslator.h,v 1.19.2.1.2.1 1998/11/12 03:06:36 heller Exp $
f3f7f7 ____________________________________________________________________________*/
e57b7d #pragma once
9daf5a
42af5a
d76276 #include "EudoraTypes.h"
7d85c2 #include "MacStrings.h"
1e23fb #include "PGPPlugTypes.h"
4ae6f3 #include "TranslatorIDs.h"
1076f0 #include "CComboError.h"
a3a076 #include "pgpKeys.h"
ada02f #include "pgpClientLib.h"
febf4a #include "MacSecureMemory.h"
39af5a
58e441 #define InitPtrToNil( p )¤  { if ( IsntNull( p ) )¤ *(p) = nil; }
2caf5a
8c87c7 ¤   ¤   ¤
a0233f typedef enum
a4bb36 {
3f59ab ¤   kUsePGPMIME = 3,¤   // arbitrary
712069 ¤   kUseOldPGPFormat
fa23dc } CipherOutputType;
5867c5 ¤
ce1d63 struct PGPKeySpec;
a1af5a
fde001 #include "PassphraseCache.h"
3d9f63 #include "pgpEncode.h"
d91ef8 #include "SignatureStatusMessage.h"
9faf5a
02793e class CTranslator
91bb36 {
b15ed4 public:
54af5a
14c810 ¤   PGPContextRef¤  ¤   mContext;
4b4baf ¤   PGPtlsContextRef¤   mTLSContext;
a135ef ¤   PGPKeySetRef¤   ¤   mKeySet;
e9af5a
a1698e ¤   class EventHandlerData
1fc7a1 ¤   {
e167d4 ¤   public:
397fcd ¤   ¤   enum { kMagic = 'EHND' };
09dbee ¤   ¤   ulong¤  ¤   ¤   mMagic;
69a02d ¤   ¤   CTranslator *¤  mTranslator;
66531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
89c369 ¤   protected:
38e6f3 ¤   ¤   EventHandlerData( CTranslator *translator )
6b5b34 ¤   ¤   {
8f4ffe ¤   ¤   ¤   pgpAssert( IsntNull( translator ) );
f0a4a3 ¤   ¤   ¤   mMagic¤ ¤   ¤   = kMagic;
30fd37 ¤   ¤   ¤   mTranslator¤ ¤  = translator;
170fe4 ¤   ¤   }
6662bd ¤   };
9067c5 ¤
23a50c ¤   class EncryptSignEventHandlerData : public EventHandlerData
c3c7a1 ¤   {
a867d4 ¤   public:
2ba2cc ¤   ¤   PGPKeyRef¤  ¤   mLastKey;
dd1b52 ¤   ¤
8832c3 ¤   ¤   EncryptSignEventHandlerData( CTranslator *translator )
2ff4d0 ¤   ¤   ¤   : EventHandlerData( translator )
4c5b34 ¤   ¤   {
022389 ¤   ¤   ¤   mLastKey¤   ¤   = kInvalidPGPKeyRef;
5e0fe4 ¤   ¤   }
191b52 ¤   ¤
--2948 000ea26bf964012008c Page 2 of CTranslator.h
5562bd ¤   };
8967c5 ¤
c98198 ¤   class DecryptVerifyEventHandlerData : public EventHandlerData
5fc7a1 ¤   {
d267d4 ¤   public:
fea5d3 ¤   ¤   Boolean¤¤   ¤   ¤   ¤   mHaveSignatureData;
b3b853 ¤   ¤   SignatureStatusInfo¤¤   mSignatureData;
4f7f13 ¤   ¤   Boolean¤¤   ¤   ¤   ¤   mTriedCachedPassphrase;
be9206 ¤   ¤   short¤  ¤   ¤   ¤   ¤   mOutputFileRef;
4a0d7d ¤   ¤   char *¤ ¤   ¤   ¤   ¤   mFYEOData;
bc1b52 ¤   ¤
42cbfa ¤   ¤   PGPClientDecodeEventHandlerData¤¤   mClientHandlerData;
d01b52 ¤   ¤
3210b9 ¤   ¤   DecryptVerifyEventHandlerData( CTranslator *translator )
75f4d0 ¤   ¤   ¤   : EventHandlerData( translator )
cd5b34 ¤   ¤   {
bee46c ¤   ¤   ¤   PGPError¤   err;
2387c7 ¤   ¤   ¤
8e10db ¤   ¤   ¤   mHaveSignatureData¤ ¤   = FALSE;
f71dd1 ¤   ¤   ¤   mTriedCachedPassphrase¤ = FALSE;
e46853 ¤   ¤   ¤   mOutputFileRef¤ ¤   ¤   = -1;
05211a ¤   ¤   ¤   mFYEOData¤  ¤   ¤   ¤   = nil;
e187c7 ¤   ¤   ¤
172dde ¤   ¤   ¤   err = PGPInitClientDecodeEventHandlerData(
38bacc ¤   ¤   ¤   ¤   ¤   ¤   translator->mContext,
8e77b6 ¤   ¤   ¤   ¤   ¤   ¤   translator->mTLSContext,
720922 ¤   ¤   ¤   ¤   ¤   ¤   translator->mKeySet,
869c12 ¤   ¤   ¤   ¤   ¤   ¤   &mClientHandlerData );
44144d ¤   ¤   ¤   pgpAssertNoErr( err );
da0fe4 ¤   ¤   }
311b52 ¤   ¤
e5be12 ¤   ¤   virtual ~DecryptVerifyEventHandlerData( void )
625b34 ¤   ¤   {
871aed ¤   ¤   ¤   PGPCleanupClientDecodeEventHandlerData( &mClientHandlerData );
240fe4 ¤   ¤   }
de62bd ¤   };
fa67c5 ¤
60a2d3 protected:
631b52 ¤   ¤
fed7ba ¤   emsProgress¤¤   mEudoraProgress;
de67c5 ¤
7082dd ¤   PGPError¤   ¤   LoadDefaultKeySet( PGPBoolean¤  writeable );
3767c5 ¤
88e440 ¤   CComboError¤¤   GetSigningPassBuffer(PGPPassBufferRef *passBufferOut,
394078 ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef *signingKeyOut );
b52b85 ¤   ¤   ¤   ¤
d1c9c8 ¤   CComboError¤¤   HandleEncryptSign( const FSSpec *in,
42ec7e ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec *out,·
87ba29 ¤   ¤   ¤   ¤   ¤   ¤   StringHandle** addressesHandle,
7a7afc ¤   ¤   ¤   ¤   ¤   ¤   Boolean doSign, PGPOptionListRef options,
a25ef7 ¤   ¤   ¤   ¤   ¤   ¤   Boolean isPGPMime );
e7af5a
023a6a ¤   static PGPError (sPGPEncodeEventHandler)(PGPContextRef context,
b93130 ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event, PGPUserValue userValue);
a5af5a
74877e ¤   static PGPError (sPGPDecodeEventHandler)(PGPContextRef context,
363130 ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event, PGPUserValue userValue);
d967c5 ¤
3ce961 ¤   virtual PGPError¤   PGPEncodeEventHandler(PGPContextRef context,
56b5ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event,
4a0120 ¤   ¤   ¤   ¤   ¤   ¤   ¤   EncryptSignEventHandlerData *data );
edaf5a
9b3659 ¤   virtual PGPError¤   PGPDecodeEventHandler(PGPContextRef context,
e2b5ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event,
7b27c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   DecryptVerifyEventHandlerData *data );
3f67c5 ¤
fb742a ¤   PGPError¤   ¤   ¤   HandleProgressEvent(PGPEvent *event);
e467c5 ¤
b367c5 ¤
0e67c5 ¤
5d582c ¤   virtual PluginError¤CanTranslateMIMEType( long transContext,
ea8070 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstemsMIMETypeHandle mimeType,
--0660 00112cea8dd4012008c Page 3 of CTranslator.h
ebd6de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param type, ConstStr255Param subType,
172570 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param protocol );
1067c5 ¤
0061cb ¤   virtual void¤   ¤   GetErrorString( CComboError err, StringPtr msg);
da5a8c ¤   virtual void¤   ¤   ReportError( CComboError err );
df67c5 ¤
085ed4 public:
a3f2bc ¤   ¤   ¤   ¤   CTranslator(PGPContextRef context, PGPtlsContextRef tlsContext,
8d694c ¤   ¤   ¤   ¤   ¤   emsProgress progressHook);
c80158 ¤   virtual¤¤   ~CTranslator( void );
7267c5 ¤
e674ef ¤   static¤ PluginError¤GetInfo( ·TranslatorID id,
3d7c50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   long * type, long * subtype, unsigned long * flags,
7066eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* trans_desc, Handle * iconHandlePtr);
3867c5 ¤
8bb306 ¤   virtual PluginError¤CanTranslate( long ransContext,
126475 ¤   ¤   ¤   ¤   ¤   ¤   emsMIMEtype **¤ inMimeTypeHandle,
88cc74 ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec *¤ inFSp, StringHandle** addressesHandle,
3c5b31 ¤   ¤   ¤   ¤   ¤   ¤   long * aprox_len, StringHandle* errorMessage,
bcb22e ¤   ¤   ¤   ¤   ¤   ¤   long * result_code);
8b67c5 ¤
72f353 ¤   /* return TRUE if successful; report any errors */
c2189a ¤   virtual CComboError¤¤   PrepareToTranslate( void );
8594aa ¤   ¤   ¤   ¤   ¤   ¤
8ce4f8 ¤   virtual PluginError¤TranslateFile( long transContext,·
c2916e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstemsMIMETypeHandle InMIMEtypeHandle,
604e30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * inFSp,
0f357e ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle** addressesHandle,
06c760 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsMIMEtype ***¤OutMIMEtypeHandlePtr,
27e6c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * outFSp,
f4cfc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* returnedMessage,
e78f0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* errorMessage, long * resultCode);
1282f7 };
--5c34 0002b680eef4012008d Page 1 of CVerifyTranslator.cp
a70335 /*____________________________________________________________________________
c0cec7 ¤   CVerifyTranslator.cp
6c67c5 ¤
d3c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
f34b0f ¤   All rights reserved.
e667c5 ¤
3167c5 ¤
7daf5a
fd9686 ¤   $Id: CVerifyTranslator.cp,v 1.23.8.1 1998/11/12 03:06:37 heller Exp $
36f7f7 ____________________________________________________________________________*/
61af5a
a04b15 #include <TextUtils.h>
81af5a
a985c2 #include "MacStrings.h"
42bbf4 #include "MacFiles.h"
0f8e44 #include "MacIcons.h"
35c110 #include "pgpMacMemory.h"
cfc8f2 #include "PGPUserInterface.h"
582bcf #include "MyMIMEUtils.h"
5ae6f3 #include "TranslatorIDs.h"
88034d #include "PluginLibUtils.h"
32bbc6 #include "TranslatorUtils.h"
6876fd #include "TranslatorStrings.h"
901ef8 #include "SignatureStatusMessage.h"
93771f #include "PGPSharedParse.h"
47f8d2 #include "PGPSharedEncryptDecrypt.h"
22af5a
b2b684 #include "CVerifyTranslator.h"
efaf5a
0baf5a
f8af5a
a5d6fb ¤   PluginError
c454b2 CVerifyTranslator::CanTranslate(
954bbe ¤   long¤   ¤   ¤   transContext,
658316 ¤   emsMIMEtype **¤ inMimeTypeHandle,
88389c ¤   const FSSpec *¤ inFSp,
483111 ¤   StringHandle**¤ addressesHandle,
423e26 ¤   long *¤ ¤   ¤   aprox_len,
013ff6 ¤   StringHandle *¤ errorMessage,
cd8385 ¤   long *¤ ¤   ¤   result_code)
a7bb36 {
6e7a11 ¤   PluginError¤err¤= EMSR_CANT_TRANS;
7967c5 ¤
d4d095 ¤   (void)inFSp;
ea87bf ¤   (void)addressesHandle;
2acd59 ¤   (void)aprox_len;
40073c ¤   (void)result_code;
4dcd0c ¤   InitPtrToNil( errorMessage );
7467c5 ¤
243148 ¤   err¤= CanTranslateMIMEType( transContext, inMimeTypeHandle,
27c8aa ¤   ¤   ¤   "\pmultipart", "\psigned", "\papplication/pgp-signature");
19af5a
00deb7 ¤   return( err );
b0efe6 }
c6af5a
89af5a
6daf5a
b9af5a
53af5a
2baf5a
d4d6fb ¤   PluginError
df9739 CVerifyTranslator::TranslateFile(
8426f7 ¤   long¤   ¤   ¤   ¤   ¤   transContext,
c36072 ¤   ConstemsMIMETypeHandle¤ inMIMEtypeHandle,
fcbabf ¤   const FSSpec *¤ ¤   ¤   inSpec,
10c782 ¤   StringHandle**¤ ¤   ¤   addressesHandle,
060df3 ¤   emsMIMETypeHandle *¤¤   outMIMETypeHandlePtr,
3a75cd ¤   const FSSpec *¤ ¤   ¤   outSpec,
bde0d4 ¤   StringHandle*¤  ¤   ¤   returnedMessage,
15cb89 ¤   StringHandle*¤  ¤   ¤   errorMessage,
8283a3 ¤   long *¤ ¤   ¤   ¤   ¤   resultCode)
2bbb36 {
--ed8a 000cb1fb48c4012008d Page 2 of CVerifyTranslator.cp
4c865f ¤   CComboError¤¤   err;
f767c5 ¤
0aae41 ¤   (void)transContext;
b8dc46 ¤   (void)inMIMEtypeHandle;
6387bf ¤   (void)addressesHandle;
cb67c5 ¤
3c9e7e ¤   if ( IsntNull( resultCode ) )
8ec7a1 ¤   {
d03eba ¤   ¤   *resultCode¤= EMSC_SIGUNKNOWN;
cd9371 ¤   }
cc67c5 ¤
56a93f ¤   InitPtrToNil( outMIMETypeHandlePtr );
d0d1f6 ¤   InitPtrToNil( returnedMessage );
21cd0c ¤   InitPtrToNil( errorMessage );
b4af5a
6efff4 ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), inSpec,
4626dd ¤   ¤   ¤   ¤   "\pVerifyInput" );
781b52 ¤   ¤
932bab ¤   err.pgpErr¤ = LoadDefaultKeySet( FALSE );
2b67c5 ¤
3e39e0 ¤   FInfo¤  fInfo;
0f466d ¤   FSpGetFInfo( outSpec, &fInfo );
2a4cc0 ¤   FSpDeleteResourceFork( outSpec );
b32898 ¤   FSpChangeFileType( outSpec, 'TEXT' );
241b52 ¤   ¤
8116fd ¤   if ( err.IsntError( ) )
31c7a1 ¤   {
110d42 ¤   ¤   PGPContextRef¤  c = mContext;
048844 ¤   ¤   PGPKeySetRef¤   newKeysSet;
911b52 ¤   ¤
04c734 ¤   ¤   err.pgpErr = PGPNewKeySet( c, &newKeysSet );
1c5a9f ¤   ¤   if( err.IsntError() )
905b34 ¤   ¤   {
4a42ed ¤   ¤   ¤   DecryptVerifyEventHandlerData¤  eventData(this);
3aaf5a
b22220 ¤   ¤   ¤   err.pgpErr¤ = PGPDecode( c,
bd465d ¤   ¤   ¤   ¤   PGPOInputFileFSSpec( c, inSpec ),
e58c04 ¤   ¤   ¤   ¤   PGPOOutputFileFSSpec( c, outSpec ),
0dd3bc ¤   ¤   ¤   ¤   PGPOOutputLineEndType( c, kPGPLineEnd_CR),
01a77a ¤   ¤   ¤   ¤   PGPOEventHandler( c, sPGPDecodeEventHandler, &eventData ),
ca0cc2 ¤   ¤   ¤   ¤   PGPOSendNullEvents( c, TRUE ),
e15c7a ¤   ¤   ¤   ¤   PGPOKeySetRef( c, mKeySet ),
dc7400 ¤   ¤   ¤   ¤   PGPOImportKeysTo( c, newKeysSet ),
e9219e ¤   ¤   ¤   ¤   PGPOLastOption(c) );
5387c7 ¤   ¤   ¤
0a549e ¤   ¤   ¤   pgpAssert( IsntNull( resultCode ) );
538043 ¤   ¤   ¤   if ( ! eventData.mHaveSignatureData )
f8f776 ¤   ¤   ¤   {
a202a7 ¤   ¤   ¤   ¤   *resultCode¤= EMSC_SIGBAD;
b3a3a6 ¤   ¤   ¤   }
24bb8c ¤   ¤   ¤   else
64f776 ¤   ¤   ¤   {
d50756 ¤   ¤   ¤   ¤   *resultCode¤¤   =
392a52 ¤   ¤   ¤   ¤   ¤   SignatureDataToEudoraResult(
072262 ¤   ¤   ¤   ¤   ¤   ¤   &eventData.mSignatureData.sigData );
84a3a6 ¤   ¤   ¤   }
81af5a
298821 ¤   ¤   ¤   if ( IsntNull( returnedMessage ) )
22f776 ¤   ¤   ¤   {
d2ba42 ¤   ¤   ¤   ¤   if ( eventData.mHaveSignatureData )
b772c3 ¤   ¤   ¤   ¤   {
36ec80 ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   statusMessage;
81ae30 ¤   ¤   ¤   ¤   ¤
3a2f44 ¤   ¤   ¤   ¤   ¤   GetSignatureStatusMessage( &eventData.mSignatureData,
38de25 ¤   ¤   ¤   ¤   ¤   ¤   statusMessage );
cbae85 ¤   ¤   ¤   ¤   ¤   *returnedMessage¤   = NewString( statusMessage );
662613 ¤   ¤   ¤   ¤   }
62fa07 ¤   ¤   ¤   ¤   else
af72c3 ¤   ¤   ¤   ¤   {
cacc2f ¤   ¤   ¤   ¤   ¤   *returnedMessage¤   = NULL;
c72613 ¤   ¤   ¤   ¤   }
cba3a6 ¤   ¤   ¤   }
--3e23 0018167b1c14012008d Page 3 of CVerifyTranslator.cp
e587c7 ¤   ¤   ¤
268f55 ¤   ¤   ¤   if( err.IsntError() &&
add61b ¤   ¤   ¤   ¤   PGPKeySetRefIsValid( eventData.mClientHandlerData.newKeySet ) )
aaf776 ¤   ¤   ¤   {
c52f86 ¤   ¤   ¤   ¤   err.pgpErr = PGPAddKeys(eventData.mClientHandlerData.newKeySet,
63e66d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeysSet );
2682e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
7172c3 ¤   ¤   ¤   ¤   {
e0699e ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPCommitKeyRingChanges( newKeysSet );
c32613 ¤   ¤   ¤   ¤   }
9ba3a6 ¤   ¤   ¤   }
11af5a
c86d97 ¤   ¤   ¤   if( err.IsntError() )
baf776 ¤   ¤   ¤   {
6acc1d ¤   ¤   ¤   ¤   PGPUInt32¤  numNewKeys;
68af73 ¤   ¤   ¤   ¤   PGPError¤   tempErr;
e12b85 ¤   ¤   ¤   ¤
0cea08 ¤   ¤   ¤   ¤   tempErr = PGPCountKeys( newKeysSet, &numNewKeys );
c23ff4 ¤   ¤   ¤   ¤   if( IsntPGPError( tempErr ) && numNewKeys > 0 )
9472c3 ¤   ¤   ¤   ¤   {
b6f9fc ¤   ¤   ¤   ¤   ¤   // Offer to import the keys
cc6878 ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   importSet;
224fac ¤   ¤   ¤   ¤   ¤   char¤   ¤   ¤   prompt[256];
a1ae30 ¤   ¤   ¤   ¤   ¤
c63ac3 ¤   ¤   ¤   ¤   ¤   GetIndCString( prompt, kTranslatorStringsRID,
47a42d ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSelectiveImportAfterSendPromptStrIndex );
3dae30 ¤   ¤   ¤   ¤   ¤
b3c69f ¤   ¤   ¤   ¤   ¤   tempErr = PGPSelectKeysDialog( c,
138a90 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation, prompt,
57e7c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeysSet, mKeySet, &importSet );
b5ae30 ¤   ¤   ¤   ¤   ¤
e2e794 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( tempErr ) )
234859 ¤   ¤   ¤   ¤   ¤   {
a69fa8 ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPSharedAddKeysToDefaultKeyring( importSet );
f76449 ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( importSet );
a51c89 ¤   ¤   ¤   ¤   ¤   }
0b2613 ¤   ¤   ¤   ¤   }
a5a3a6 ¤   ¤   ¤   }
cdaf5a
135949 ¤   ¤   ¤   PGPFreeKeySet( newKeysSet );
250fe4 ¤   ¤   }
2c9371 ¤   }
bf67c5 ¤
b7895f ¤   DebugCopyToRAMDisk( PGPGetContextMemoryMgr( mContext ), outSpec,
3d8707 ¤   ¤   ¤   ¤   "\pVerifyOutput" );
1467c5 ¤
f24bfd ¤   // we deleted the resource fork.
5979a0 ¤   // This makes Eudora unhappy. ·Recreate one.
e65bab ¤   (void)FSpCreateResFile( outSpec,
dd8a9d ¤   ¤   fInfo.fdCreator, fInfo.fdType, smSystemScript );
701b52 ¤   ¤
091b52 ¤   ¤
d7f190 ¤   ReportError( err );
7167c5 ¤
7bd3ba ¤   return( CComboErrorToEudoraError( err ) );
dbefe6 }
2daf5a
f2af5a
3faf5a
e7af5a
71af5a
d9af5a
81af5a
--c9ec 0018ab4adf14012008e Page 1 of CVerifyTranslator.h
a70335 /*____________________________________________________________________________
36b337 ¤   CVerifyTranslator.h
8a67c5 ¤
b5c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
3f4b0f ¤   All rights reserved.
7067c5 ¤
1167c5 ¤
f1af5a
d5f356 ¤   $Id: CVerifyTranslator.h,v 1.5.8.1 1998/11/12 03:06:38 heller Exp $
03f7f7 ____________________________________________________________________________*/
cf7b7d #pragma once
79af5a
48af5a
df1ee8 #include "CTranslator.h"
90af5a
5e6fdc class CVerifyTranslator : public CTranslator
fcbb36 {
0ba2d3 protected:
3267c5 ¤
c467c5 ¤
105ed4 public:
d2a05f ¤   ¤   ¤   ¤   ¤   ¤   CVerifyTranslator( PGPContextRef context,
1731d1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
7cdbf5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsProgress progressHook)
ceabfe ¤   ¤   ¤   ¤   ¤   ¤   ¤   : CTranslator( context, tlsContext, progressHook)
5c06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
615268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
c6531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
e0b306 ¤   virtual PluginError¤CanTranslate( long ransContext,
1ced9c ¤   ¤   ¤   ¤   ¤   ¤   emsMIMETypeHandle inMimeTypeHandle,
652505 ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * inFSp, StringHandle** addressesHandle,
a85b31 ¤   ¤   ¤   ¤   ¤   ¤   long * aprox_len, StringHandle* errorMessage,
0cb22e ¤   ¤   ¤   ¤   ¤   ¤   long * result_code);
cb94aa ¤   ¤   ¤   ¤   ¤   ¤
7494aa ¤   ¤   ¤   ¤   ¤   ¤
00e4f8 ¤   virtual PluginError¤TranslateFile( long transContext,·
14916e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstemsMIMETypeHandle InMIMEtypeHandle,
974e30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * inFSp,
d1357e ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle** addressesHandle,
a8f809 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsMIMETypeHandle *¤OutMIMEtypeHandlePtr,
8be6c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * outFSp,
41cfc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* returnedMessage,
1a8f0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* errorMessage, long * resultCode);
8a82f7 };
--e184 001057b1d254012008f Page 1 of EudoraTypes.h
a70335 /*____________________________________________________________________________
90e702 ¤   EudoraTypes.h
9867c5 ¤
26c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
4e4b0f ¤   All rights reserved.
b267c5 ¤
9367c5 ¤
c9af5a
ef47b5 ¤   $Id: EudoraTypes.h,v 1.1.18.1 1998/11/12 03:06:38 heller Exp $
87f7f7 ____________________________________________________________________________*/
cfaf5a
293379 #ifdef __cplusplus
5e6dad extern "C" {
327454 #endif
e2af5a
4948c9 #include "emsapi-mac.h"
d3bdd3 #include "usertrans.h"
7daf5a
003379 #ifdef __cplusplus
89efe6 }
8c7454 #endif
bcaf5a
6da183 typedef emsMIMEparam¤   ¤   ¤   emsMIMEParam;
dbce9d typedef emsMIMEParam **¤¤   ¤   emsMIMEParamHandle;
525563 typedef const emsMIMEParam **¤  ConstemsMIMEParamHandle;
8daf5a
f79b0f typedef emsMIMEtype ¤   ¤   ¤   emsMIMEType;
139f01 typedef emsMIMEType **¤ ¤   ¤   emsMIMETypeHandle;
0573c9 typedef const emsMIMEType **¤   ConstemsMIMETypeHandle;
--4518 0008b81f72140120090 Page 1 of MyMIMEUtils.c
a70335 /*____________________________________________________________________________
f3e651 ¤   MyMIMEUtils.c
b167c5 ¤
b4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
974b0f ¤   All rights reserved.
c067c5 ¤
a567c5 ¤
48af5a
d67da5 ¤   $Id: MyMIMEUtils.c,v 1.2.8.1 1998/11/12 03:06:39 heller Exp $
97f7f7 ____________________________________________________________________________*/
c7af5a
b14b15 #include <TextUtils.h>
92af5a
bd85c2 #include "MacStrings.h"
5d2bcf #include "MyMIMEUtils.h"
c8f10b #include "mimetype.h"
16af5a
08af5a
9bd140 ¤   static OSErr
e38b5e CreateMIMEParam(
26e600 ¤   ConstStr255Param¤   ¤   nameString,
917f5f ¤   ConstStr255Param¤   ¤   valueString,
330520 ¤   emsMIMEParamHandle *¤   paramHandle )
6fbb36 {
4d515a ¤   emsMIMEParamHandle¤ param;
2ce4e2 ¤   Handle¤ ¤   ¤   ¤   valueHandle;
0e4461 ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
aa67c5 ¤
6a2bbc ¤   param¤  = (emsMIMEParamHandle) NewHandleClear( sizeof( **param ) );
629b82 ¤   if ( IsntNull( param ) )
54c7a1 ¤   {
b1109d ¤   ¤   CopyPString( nameString, (**param).name );
eea5e2 ¤   ¤   (**param).next¤ = nil;
e21b52 ¤   ¤
2c491f ¤   ¤   err¤= PtrToHand( &valueString[ 1 ], &valueHandle, valueString[ 0 ] );
7a8e44 ¤   ¤   if ( IsErr( err ) ·)
355b34 ¤   ¤   {
92e909 ¤   ¤   ¤   DisposeHandle( (Handle) param );
564e40 ¤   ¤   ¤   param¤  = nil;
650fe4 ¤   ¤   }
f30e1d ¤   ¤   else
845b34 ¤   ¤   {
79b573 ¤   ¤   ¤   (**param).value¤= valueHandle;
860fe4 ¤   ¤   }
4b9371 ¤   }
0d0e24 ¤   else
16c7a1 ¤   {
e73dca ¤   ¤   err¤= memFullErr;
299371 ¤   }
9467c5 ¤
c3bfb8 ¤   *paramHandle¤   = param;
f4deb7 ¤   return( err );
d4efe6 }
62af5a
59af5a
7e87c7 ¤   ¤   ¤
69eacd ¤   OSErr
8f3cb3 AddMIMEParam(
408a82 ¤   emsMIMETypeHandle¤  typeHandle,
6ff680 ¤   ConstStr255Param¤   nameString,
30ec02 ¤   ConstStr255Param¤   valueString
8427e6 ¤   )
3cbb36 {
e34461 ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
c53a27 ¤   emsMIMEParamHandle¤ paramHandle;
ec67c5 ¤
762fd7 ¤   AssertHandleIsValid( typeHandle, "AddMIMEParam" );
66d3b7 ¤   pgpAssertAddrValid( nameString, uchar );
028401 ¤   pgpAssertAddrValid( valueString, uchar );
1067c5 ¤
be974c ¤   err¤= CreateMIMEParam( nameString, valueString, &paramHandle );
8b5ecc ¤   if ( IsntErr( err ) )
--dc49 000b962ecd740120090 Page 2 of MyMIMEUtils.c
f7c7a1 ¤   {
7aa0ce ¤   ¤   if ( IsNull( (**typeHandle).params ) )
c75b34 ¤   ¤   {
e51fec ¤   ¤   ¤   (**typeHandle).params¤  = paramHandle;
190fe4 ¤   ¤   }
470e1d ¤   ¤   else
7a5b34 ¤   ¤   {
34d091 ¤   ¤   ¤   emsMIMEParamHandle¤ curParamHandle;
5b67c5 ¤
fbb267 ¤   ¤   ¤   // now find the last param, and add the new param to it
a3c203 ¤   ¤   ¤   curParamHandle¤ = (**typeHandle).params;
c51438 ¤   ¤   ¤   while ( IsntNull( curParamHandle ) )
4ef776 ¤   ¤   ¤   {
7ccb4e ¤   ¤   ¤   ¤   if ( IsNull( (**curParamHandle).next ) )
b572c3 ¤   ¤   ¤   ¤   {
cb4308 ¤   ¤   ¤   ¤   ¤   (**curParamHandle).next¤= paramHandle;
a214c3 ¤   ¤   ¤   ¤   ¤   break;
ec2613 ¤   ¤   ¤   ¤   }
1d2b85 ¤   ¤   ¤   ¤
5e19a9 ¤   ¤   ¤   ¤   curParamHandle¤ = (**curParamHandle).next;
c6a3a6 ¤   ¤   ¤   }
580fe4 ¤   ¤   }
ce9371 ¤   }
ef67c5 ¤
86deb7 ¤   return( err );
c4efe6 }
15af5a
f5af5a
6deacd ¤   OSErr
dab060 CreateMIMEType(
4c11a0 ¤   ConstStr255Param¤   ¤   typeString,
559c61 ¤   ConstStr255Param¤   ¤   subtypeString,
3401b9 ¤   emsMIMETypeHandle *¤¤   typeHandlePtr )
e0bb36 {
ab30ae ¤   emsMIMEType¤¤   type;
4a6920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
8a67c5 ¤
2643f2 ¤   CopyPString( "\p1.0", type.mime_version );
cac531 ¤   CopyPString( typeString, type.mime_type );
683ddb ¤   CopyPString( subtypeString, type.sub_type );
fb008e ¤   type.params¤= nil;
da67c5 ¤
747026 ¤   err¤= PtrToHand( &type, (Handle *)typeHandlePtr, sizeof( type ) );
1d67c5 ¤
b2deb7 ¤   return( err );
b5efe6 }
aaaf5a
3e67c5 ¤
456d52 ¤   void
c08c67 DisposeMIMEType( emsMIMETypeHandle¤ mimeTypeHandle)
d8bb36 {
aa3d1a ¤   emsMIMEParamHandle¤ params;
bf67c5 ¤
4953b2 ¤   params¤ = (**mimeTypeHandle).params;
4e67c5 ¤
177faa ¤   while ( IsntNull( params ) )
65c7a1 ¤   {
a861c8 ¤   ¤   emsMIMEParamHandle¤ next;
b71b52 ¤   ¤
e75cef ¤   ¤   next¤   = (**params).next;
b4052d ¤   ¤   DisposeHandle( (Handle) params );
dda214 ¤   ¤   params¤ = next;
b49371 ¤   }
c967c5 ¤
02ec7e ¤   DisposeHandle( (Handle) mimeTypeHandle );
d4efe6 }
79af5a
feaf5a
470335 /*____________________________________________________________________________
a88710 ¤   Build a Eudora data structure representing:
534947 ¤   multipart/encrypted; boundary=foo; protocol="application/pgp-encrypted"
b9f7f7 ____________________________________________________________________________*/
--118c 000a737d91d40120090 Page 3 of MyMIMEUtils.c
93eacd ¤   OSErr
b83a22 BuildEncryptedPGPMIMEType(
2469e8 ¤   emsMIMETypeHandle *¤mimeTypeHandlePtr,
c277aa ¤   const char *¤   ¤   boundaryCString )
93bb36 {
2d4461 ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
c2aa06 ¤   emsMIMETypeHandle¤  mimeTypeHandle = nil;
14af5a
a8337f ¤   err¤= CreateMIMEType( "\pmultipart", "\pencrypted", &mimeTypeHandle );
195ecc ¤   if ( IsntErr( err ) )
90c7a1 ¤   {
da9283 ¤   ¤   Str255¤ tempString;
ca1b52 ¤   ¤
04d776 ¤   ¤   CToPString( boundaryCString, tempString );
321b52 ¤   ¤
6fb173 ¤   ¤   err¤= AddMIMEParam( mimeTypeHandle, "\pboundary", tempString );
b91b52 ¤   ¤
abd798 ¤   ¤   if ( IsntErr( err ) )
425b34 ¤   ¤   {
74d465 ¤   ¤   ¤   err¤= AddMIMEParam( mimeTypeHandle,
c11894 ¤   ¤   ¤   ¤   ¤   "\pprotocol", "\papplication/pgp-encrypted" );
770fe4 ¤   ¤   }
7a1b52 ¤   ¤
ff1b52 ¤   ¤
3c8cf4 ¤   ¤   if ( IsErr( err ) )
525b34 ¤   ¤   {
60dd65 ¤   ¤   ¤   DisposeMIMEType( mimeTypeHandle );
e4fb86 ¤   ¤   ¤   mimeTypeHandle¤ = nil;
060fe4 ¤   ¤   }
1e9371 ¤   }
a267c5 ¤
5486a1 ¤   *mimeTypeHandlePtr¤ = mimeTypeHandle;
aa67c5 ¤
df940f ¤   AssertNoErr( err, "BuildEncryptedMIMEType" );
02deb7 ¤   return( err );
e2efe6 }
57af5a
56af5a
030335 /*____________________________________________________________________________
9e8710 ¤   Build a Eudora data structure representing:
f8cdda ¤   multipart/signed; boundary=foo; protocol="application/pgp-signature"
b1f7f7 ____________________________________________________________________________*/
69eacd ¤   OSErr
0da9d2 BuildSignedPGPMIMEType(
4d69e8 ¤   emsMIMETypeHandle *¤mimeTypeHandlePtr,
c177aa ¤   const char *¤   ¤   boundaryCString )
d7bb36 {
4b4461 ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
3daa06 ¤   emsMIMETypeHandle¤  mimeTypeHandle = nil;
acaf5a
00b909 ¤   err¤= CreateMIMEType( "\pmultipart", "\psigned", &mimeTypeHandle );
4a5ecc ¤   if ( IsntErr( err ) )
a7c7a1 ¤   {
ee9283 ¤   ¤   Str255¤ tempString;
6e1b52 ¤   ¤
fbd776 ¤   ¤   CToPString( boundaryCString, tempString );
c71b52 ¤   ¤
5fb173 ¤   ¤   err¤= AddMIMEParam( mimeTypeHandle, "\pboundary", tempString );
731b52 ¤   ¤
76d798 ¤   ¤   if ( IsntErr( err ) )
6f5b34 ¤   ¤   {
5ed465 ¤   ¤   ¤   err¤= AddMIMEParam( mimeTypeHandle,
d43d7a ¤   ¤   ¤   ¤   ¤   "\pprotocol", "\papplication/pgp-signature" );
c80fe4 ¤   ¤   }
6b1b52 ¤   ¤
d6d798 ¤   ¤   if ( IsntErr( err ) )
155b34 ¤   ¤   {
f77b9c ¤   ¤   ¤   err¤= AddMIMEParam( mimeTypeHandle, "\pmicalg", "\ppgp-md5" );
240fe4 ¤   ¤   }
991b52 ¤   ¤
1c1b52 ¤   ¤
a78cf4 ¤   ¤   if ( IsErr( err ) )
--e214 000624902d640120090 Page 4 of MyMIMEUtils.c
e35b34 ¤   ¤   {
eadd65 ¤   ¤   ¤   DisposeMIMEType( mimeTypeHandle );
83fb86 ¤   ¤   ¤   mimeTypeHandle¤ = nil;
dc0fe4 ¤   ¤   }
f99371 ¤   }
2167c5 ¤
c686a1 ¤   *mimeTypeHandlePtr¤ = mimeTypeHandle;
f367c5 ¤
57940f ¤   AssertNoErr( err, "BuildEncryptedMIMEType" );
dcdeb7 ¤   return( err );
08efe6 }
a1af5a
17af5a
800335 /*____________________________________________________________________________
c49a3f ¤   *typePtr is set to NULL if no valid Content-type is found.
0cf7f7 ____________________________________________________________________________*/
b96d52 ¤   void
d444c8 ParseMIMEType(
c4e1ab ¤   Handle¤ ¤   ¤   ¤   canonicalizedText,
0f1e22 ¤   emsMIMETypeHandle * typePtr)
2bbb36 {
bf3a86 ¤   *typePtr¤   = nil;
5d67c5 ¤
50aacb ¤   parse_mime_ct( canonicalizedText, typePtr);
ed3231 ¤   if ( IsntNull( *typePtr ) )
11c7a1 ¤   {
5219e4 ¤   ¤   // parse_mime_ct doesn't fill in mime_version
858d7a ¤   ¤   CopyPString( "\p1.0", (**(*typePtr)).mime_version );
d59371 ¤   }
68efe6 }
6faf5a
58af5a
81af5a
230335 /*____________________________________________________________________________
1397be ¤   Convert a mime type data structure and its parameters to a Handle of data
fff7f7 ____________________________________________________________________________*/
926692 ¤   Handle
b5508f MIMETypeToHandle( ConstemsMIMETypeHandle typeHandle )
0abb36 {
93815f ¤   Handle¤ ¤   ¤   ¤   ¤   theResult¤  = nil;
0ae24b ¤   ConstemsMIMEParamHandle¤curParamHandle;
47b229 ¤   OSErr¤  ¤   ¤   ¤   ¤   err¤= noErr;
69af5a
9734fe ¤   AssertHandleIsValid( typeHandle, "MIMETypeToString" );
fdaf5a
acdfa4 ¤   theResult¤  = NewHandle( 0 );
f737d4 ¤   if ( IsntNull( theResult ) )
36c7a1 ¤   {
9f8d08 ¤   ¤   emsMIMEType¤type;
261b52 ¤   ¤
a724ed ¤   ¤   type¤   = **typeHandle;
2e1b52 ¤   ¤
014ba8 ¤   ¤   err¤= AppendStringToHandle( theResult, type.mime_type );
00d798 ¤   ¤   if ( IsntErr( err ) )
5b0778 ¤   ¤   ¤   err¤= AppendStringToHandle( theResult, "\p/" );
29d798 ¤   ¤   if ( IsntErr( err ) )
9df9de ¤   ¤   ¤   err¤= AppendStringToHandle( theResult, type.sub_type );
cf9371 ¤   }
76869e ····
14b976 ····// now append all the parameters
cd56f4 ····curParamHandle¤ = (**typeHandle).params;
484045 ····while ( IsntNull( curParamHandle ) && IsntErr( err ) )
623b37 ····{
cce9d3 ····¤   Str255¤ tempStr;
b5e7c4 ····¤
fbd472 ¤   ¤   err¤= AppendStringToHandle( theResult, "\p; " );
941b52 ¤   ¤
85d798 ¤   ¤   if ( IsntErr( err ) )
765b34 ¤   ¤   {
a7253b ¤   ¤   ¤   CopyPString( (**curParamHandle).name, tempStr );
b7bb79 ¤   ¤   ¤   err¤= AppendStringToHandle( theResult, tempStr );
620fe4 ¤   ¤   }
--8c27 000d082f36140120090 Page 5 of MyMIMEUtils.c
f11b52 ¤   ¤
45d798 ¤   ¤   if ( IsntErr( err ) )
c65b34 ¤   ¤   {
c38819 ¤   ¤   ¤   CopyPString( "\p=\"", tempStr );
dd6acb ¤   ¤   ¤   AppendPString( *(StringHandle)((**curParamHandle).value), tempStr );
859c41 ¤   ¤   ¤   AppendPString( "\p\"", ·tempStr);
3e9861 ¤   ¤   ¤   err¤= AppendStringToHandle( theResult, tempStr);
890fe4 ¤   ¤   }
081b52 ¤   ¤
f42069 ········curParamHandle¤ = (*curParamHandle)->next;
776fe7 ····}
591b52 ¤   ¤
243a1b ¤   return(theResult);
66efe6 }
e7af5a
27af5a
33af5a
717e69 ¤   Boolean
396895 MatchMIMEType(
7c1952 ¤   ConstemsMIMETypeHandle¤ typeH,
7d77a9 ¤   ConstStringPtr¤ ¤   ¤   typeString,
2711b2 ¤   ConstStringPtr¤ ¤   ¤   subString )
3ebb36 {
a491c0 ····Boolean¤matchFound¤ = false;
89869e ····
ba5fdc ····AssertHandleIsValid( typeH, "MatchMIMEType");
b7d560 ····pgpAssertAddrValid( typeString, uchar);
14b0c4 ····pgpAssertAddrValid( subString, uchar);
86869e ····
5a5e6c ····if ( IsntNull( typeString ) )
393b37 ····{
c00972 ·¤  ····matchFound¤ = EqualString( (**typeH).mime_type,
5eb6a0 ·¤  ····¤   ¤   ¤   ¤   typeString, false, true );
8c7af9 ·¤  }
276182 ·¤
f180c4 ·¤  // nil substring means wildcard match; anything matches
14948f ····if( matchFound && IsntNull( subString ) )
ae3b37 ····{
98a008 ········matchFound = EqualString( (**typeH).sub_type, subString, false, true );
858cf7 ··¤ }
89e8c6 ···
5d60d0 ····return( matchFound );
84efe6 }
a7af5a
a6af5a
a3af5a
7baf5a
5baf5a
2a7e69 ¤   Boolean
4d1794 GetMIMEParameter(
97b4df ¤   ConstemsMIMETypeHandle¤ mimeStuff,
b8eb88 ¤   ConstStr255Param¤   ¤   paramName,
ac4df3 ¤   StringPtr¤  ¤   ¤   ¤   outValue )
cebb36 {
89a0dc ¤   ConstemsMIMEParamHandle¤param;
5867c5 ¤
7dbedf ¤   outValue[ 0 ]¤  = 0;
8967c5 ¤
2dec82 ¤   param¤  = (**mimeStuff).params;
6d84e4 ¤   while ( IsntNull( param ) )
32c7a1 ¤   {
51ca73 ¤   ¤   if ( EqualString( (**param).name, paramName, FALSE, TRUE) )
d05b34 ¤   ¤   {
1449d4 ¤   ¤   ¤   ulong¤  length¤ = GetHandleSize( (**param).value );
2887c7 ¤   ¤   ¤
566b53 ¤   ¤   ¤   if ( length > 255 )
8d02c6 ¤   ¤   ¤   ¤   length¤ = 255;
e587c7 ¤   ¤   ¤
a5636f ¤   ¤   ¤   outValue[ 0 ]¤  = length;
4d7734 ¤   ¤   ¤   BlockMoveData( *(**param).value, &outValue[ 1 ], length );
5acdcb ¤   ¤   ¤   break;
d00fe4 ¤   ¤   }
--6953 00141287f4540120090 Page 6 of MyMIMEUtils.c
acb82d ¤   ¤   param¤  = (**param).next;
af9371 ¤   }
c2af5a
e7d5a9 ····return( StrLength( outValue ) != 0 );
89797c }¤  ¤   ¤   ¤
d0af5a
62af5a
62af5a
4caf5a
71af5a
32af5a
d3af5a
4daf5a
90af5a
faaf5a
6daf5a
dcaf5a
2caf5a
41af5a
--04f8 00127d59b3b40120091 Page 1 of MyMIMEUtils.h
a70335 /*____________________________________________________________________________
1002f9 ¤   MyMIMEUtils.h
6667c5 ¤
edc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
124b0f ¤   All rights reserved.
c267c5 ¤
4067c5 ¤
ffaf5a
c8de5e ¤   $Id: MyMIMEUtils.h,v 1.1.18.1 1998/11/12 03:06:40 heller Exp $
b1f7f7 ____________________________________________________________________________*/
9caf5a
0e7b7d #pragma once
c4d83c ·
ea6276 #include "EudoraTypes.h"
6eaf5a
d13379 #ifdef __cplusplus
516dad extern "C" {
ae7454 #endif
c8af5a
0787c7 ¤   ¤   ¤
a88a26 OSErr¤  AddMIMEParam( emsMIMETypeHandle,
4d794a ¤   ¤   ¤   ConstStr255Param nameString, ConstStr255Param valueString);
4caf5a
e3af5a
02a928 OSErr¤  CreateMIMEType( ConstStr255Param typeString,
0fedd1 ¤   ¤   ¤   ConstStr255Param subtypeString, emsMIMETypeHandle * typeHandlePtr );
c887c7 ¤   ¤   ¤
6887c7 ¤   ¤   ¤
e3e1f8 void¤   DisposeMIMEType( emsMIMETypeHandle¤ mimeTypeHandle);
21af5a
67af5a
685500 void¤   ParseMIMEType( Handle canonicalizedText, emsMIMETypeHandle * type);
b1af5a
e36b6d Handle¤ MIMETypeToHandle( ConstemsMIMETypeHandle type );
03af5a
46af5a
b202a6 Boolean¤MatchMIMEType( ConstemsMIMETypeHandle¤  MIMEtypeHandle,
bb7e2f ¤   ¤   ¤   ConstStringPtr mType, ConstStringPtr subtype);
f5af5a
1aaf5a
25af5a
7baf5a
9e4e79 OSErr¤  BuildEncryptedPGPMIMEType( emsMIMETypeHandle *¤ mimeTypeHandle,
008069 ¤   ¤   ¤   const char *¤   delimiter);
a687c7 ¤   ¤   ¤
b0b7cf OSErr¤  BuildSignedPGPMIMEType( emsMIMETypeHandle *¤mimeTypeHandle,
ec8069 ¤   ¤   ¤   const char *¤   delimiter);
f7af5a
e2af5a
5cad75 Boolean¤GetMIMEParameter(
c39053 ¤   ¤   ¤   ConstemsMIMETypeHandle MIMEtypeHandle, ConstStr255Param¤paramName,
24d4ae ¤   ¤   ¤   StringPtr value );
9aaf5a
5caf5a
383379 #ifdef __cplusplus
c6efe6 }
272841 #endif¶
--aea2 0006d2ce89a40120092 Page 1 of PGPPlug.cp
a70335 /*____________________________________________________________________________
ceae5a ¤   PGPPlug.cp
6067c5 ¤
5ac97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
1c4b0f ¤   All rights reserved.
8d67c5 ¤
9467c5 ¤
cfaf5a
00501d ¤   $Id: PGPPlug.cp,v 1.16.8.1 1998/11/12 03:06:40 heller Exp $
52f7f7 ____________________________________________________________________________*/
497c7a #include <Icons.h>
294b15 #include <TextUtils.h>
86af5a
a985c2 #include "MacStrings.h"
828e44 #include "MacIcons.h"
fdbbf4 #include "MacFiles.h"
74af5a
8b0cf9 #include "PGPPlug.h"
a61ee8 #include "CTranslator.h"
ea9da1 #include "CDecryptTranslator.h"
799413 #include "TranslatorFactory.h"
cae001 #include "PassphraseCache.h"
4f4cfb #include "TranslatorPrefs.h"
ea0940 #include "PluginProcInfo.h"
2776fd #include "TranslatorStrings.h"
18bbc6 #include "TranslatorUtils.h"
1e3a2c #include "WarningAlert.h"
b5f5d2 #include "pgpMacCustomContextAlloc.h"
45af5a
e7d673 #if PGP_DEMO
3639ae #include "PGPDemo.h"
197454 #endif
27af5a
832f94 // same as used in the BNDL resource
91d23f const SInt16¤   kAboutPGPPluginIconID¤  ¤   ¤   ¤   =¤  128;
1aaf5a
e16d7d // obtained 3/17/97, also obtained 881 thru 884
e1b619 const short¤¤   kModuleID¤  ·= 880;
b7af5a
03af5a
c3af5a
45edb8 #pragma export on
fbaf5a
bee138 // these routines are called by the plugin code resource
c3b7d1 RoutineDescriptor¤  PlugInInitRD¤   ¤   =
0f7696 ¤   BUILD_ROUTINE_DESCRIPTOR( uppPlugInInitProcInfo, PlugInInit );
81891c RoutineDescriptor¤  PlugInFinishRD¤ ¤   =
35110f ¤   BUILD_ROUTINE_DESCRIPTOR( uppPluginFinishProcInfo, PlugInFinish );
028b72 RoutineDescriptor¤  GetTranslatorInfoRD =
41c9a1 ¤   BUILD_ROUTINE_DESCRIPTOR( uppGetTranslatorInfoProcInfo, GetTranslatorInfo );
4b46d4 RoutineDescriptor¤  CanTranslateFileRD¤ =
38a51c ¤   BUILD_ROUTINE_DESCRIPTOR( uppCanTranslateFileProcInfo, CanTranslateFile );
ca6367 RoutineDescriptor¤  TranslateFileRD¤¤   =
355144 ¤   BUILD_ROUTINE_DESCRIPTOR( uppTranslateFileProcInfo, TranslateFile );
b5af5a
8a9c43 #pragma export off
4daf5a
dcaf5a
84af5a
d7af5a
393ecc static Boolean¤ ¤   ¤   sInited¤¤   ¤   = false;
f8fa9d static PGPContextRef¤   sContext¤   ¤   = kInvalidPGPContextRef;
a3ba84 static PGPtlsContextRef¤sTLSContext¤¤   = kInvalidPGPtlsContextRef;
1baf5a
8726f7 ¤   static CComboError
fd8ef3 InitMyWorld( void )
88bb36 {
e3b8e5 ¤   CComboError¤err;
9467c5 ¤
ad9439 ¤   if ( ! sInited )
3ac7a1 ¤   {
6db0c0 ¤   ¤   err.pgpErr = pgpNewContextCustomMacAllocators( &sContext );
--63ea 0001e4e1c8d40120092 Page 2 of PGPPlug.cp
11f9a8 ¤   ¤   if ( err.IsntError() )
855b34 ¤   ¤   {
2fc8e6 ¤   ¤   ¤   err.pgpErr = PGPNewTLSContext( sContext, &sTLSContext );
8a75d7 ¤   ¤   ¤   if ( err.IsntError() )
81f776 ¤   ¤   ¤   {
22dabc ¤   ¤   ¤   ¤   InitPassphraseCaches( sContext );
352b85 ¤   ¤   ¤   ¤
010075 ¤   ¤   #if PGP_BUSINESS_SECURITY
85f032 ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPCheckAutoUpdateKeysFromServer(·
e05065 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( sContext ), TRU¶
bc1a02 E,
5b0fe0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NULL, NULL );
a1d656 ¤   ¤   #endif
96a3a6 ¤   ¤   ¤   }
7a0fe4 ¤   ¤   }
ed1b52 ¤   ¤
525fcf ¤   ¤   sInited¤= true;¤
8f9371 ¤   }
1d67c5 ¤
46deb7 ¤   return( err );
bfefe6 }
82af5a
4233c8 ¤   static void
590cea DisposeMyWorld( void )
81bb36 {
e0db42 ¤   if ( sInited )
06c7a1 ¤   {
e4d72a ¤   ¤   if( PGPtlsContextRefIsValid( sTLSContext ) )
425b34 ¤   ¤   {
b9e970 ¤   ¤   ¤   PGPFreeTLSContext( sTLSContext );
ab4c3a ¤   ¤   ¤   sTLSContext = kInvalidPGPtlsContextRef;
de0fe4 ¤   ¤   }
ff1b52 ¤   ¤
401784 ¤   ¤   if( PGPContextRefIsValid( sContext ) )
aa5b34 ¤   ¤   {
d6cb15 ¤   ¤   ¤   PGPFreeContext( sContext );
befa81 ¤   ¤   ¤   sContext = kInvalidPGPContextRef;
da0fe4 ¤   ¤   }
041b52 ¤   ¤
960800 ¤   ¤   // nothing yet
56f702 ¤   ¤   sInited¤= false;
b59371 ¤   }
8467c5 ¤
0d319d ¤   DisposePassphraseCaches();
f4efe6 }
4caf5a
2ddacc #pragma mark -
bcaf5a
76af5a
55af5a
c0c814 ¤   pascal PluginError
1f093f PlugInInit(
122454 ¤   emsUserGlobals **/*globalsHandle*/,
68c1d2 ¤   short*¤ ¤   ¤   module_count,
bb9c02 ¤   StringHandle*¤  descriptionHandlePtr,
01f2ef ¤   short*¤ ¤   ¤   module_id,
ecff69 ¤   Handle*¤¤   ¤   iconHandlePtr)
6cbb36 {
3236b5 ¤   const uchar *¤  ¤   ¤   sModuleDescription = "\pEudora PGP Plugin";
487967 ¤   CComboError¤¤   ¤   ¤   err; ·
b324b8 ¤   PluginError¤¤   ¤   ¤   eudoraErr¤  = EMSR_OK;
7967c5 ¤
3d5100 ¤   pgpLeaksBeginSession( "main" );
4b67c5 ¤
2e019a ¤   err¤= InitMyWorld( );
86ed80 ¤   if ( err.IsntError() )
4ac7a1 ¤   {
231b52 ¤   ¤
5a57f2 ¤   ¤   // Set the number of translators in this module
1a0b8a ¤   ¤   if ( IsntNull( module_count ) )
d75b34 ¤   ¤   {
1e7314 ¤   ¤   ¤   *module_count = kPGPNumTranslators;
--21fe 000b123e35b40120092 Page 3 of PGPPlug.cp
b50fe4 ¤   ¤   }
3b1b52 ¤   ¤
b060be ¤   ¤   MacLeaks_Suspend();¤// Eudora keeps the stuff we're about to allocate
531b52 ¤   ¤
2e10fa ¤   ¤   // Set the module's description
02bfd0 ¤   ¤   if ( IsntNull( descriptionHandlePtr ) )
fc5b34 ¤   ¤   {
b29b85 ¤   ¤   ¤   Handle¤ stringHandle;
411b52 ¤   ¤
3fa29a ¤   ¤   ¤   err.err¤= PtrToHand( &sModuleDescription[ 0 ], &stringHandle,
ab2100 ¤   ¤   ¤   ¤   ¤   ¤   StrSize( sModuleDescription ));
ab87c7 ¤   ¤   ¤
409341 ¤   ¤   ¤   *descriptionHandlePtr = (StringHandle)stringHandle;
410fe4 ¤   ¤   }
ad1b52 ¤   ¤
3af104 ¤   ¤   // Set the module's icon
5a2681 ¤   ¤   if ( IsntNull( iconHandlePtr ) )
875b34 ¤   ¤   {
bf4ff1 ¤   ¤   ¤   Handle tempSuite = nil;
fd87c7 ¤   ¤   ¤
5d4db0 ¤   ¤   ¤   err.err = GetIconSuite(¤&tempSuite, kAboutPGPPluginIconID,
d001f7 ¤   ¤   ¤   ¤   ¤   svAllAvailableData);
2dae5b ¤   ¤   ¤   if ( err.IsntError() && IsntNull( tempSuite ))
5af776 ¤   ¤   ¤   {
6aa22d ¤   ¤   ¤   ¤   err.err = DuplicateIconSuite( tempSuite, iconHandlePtr);
7b1ef7 ¤   ¤   ¤   ¤   DisposeIconSuite( tempSuite, true);
4aa3a6 ¤   ¤   ¤   }
860fe4 ¤   ¤   }
ed1b52 ¤   ¤
df501f ¤   ¤   MacLeaks_Resume();¤ // Eudora keeps the stuff we just allocated
80af5a
f20b48 ¤   ¤   // Set the module ID
478224 ¤   ¤   if( IsntNull( module_id ) )
1a5b34 ¤   ¤   {
e06800 ¤   ¤   ¤   *module_id = kModuleID;
680fe4 ¤   ¤   }
209371 ¤   }
5b67c5 ¤
ecaf25 ¤   if ( err.IsError( ) )
69c7a1 ¤   {
78ff74 ¤   ¤   pgpDebugPStr( "\pfailure in PlugInInit" );
77a3ae ¤   ¤   eudoraErr¤  = EMSR_UNKNOWN_FAIL;
549371 ¤   }
eb0e24 ¤   else
b2c7a1 ¤   {
8fe28a ¤   ¤   eudoraErr¤  = EMSR_OK;
f89371 ¤   }
d867c5 ¤
23af5a
699838 #if BETA
595b06 ¤   static Boolean¤ sNotified¤  = false;
fe626d ¤   if ( BetaExpired() && ! sNotified )
f6c7a1 ¤   {
fc765c ¤   sNotified¤  = true;
3adc40 ¤   WarningAlert( kWANoteAlertType, kWAOKStyle,
3118ba ¤   ¤   "\pThis BETA version of PGP Eudora Plugin has expired."
80bc8c ¤   ¤   "You may decrypt and verify, but not encrypt or sign. ·"
56e6ff ¤   ¤   "Please obtain the latest version from the PGP web site." );
2d9371 ¤   }
617454 #endif
c9af5a
77d673 #if PGP_DEMO
c2d3cb ¤   if( err.IsntError() )
97c7a1 ¤   {
fb70b2 ¤   ¤   if( ShowDemoDialog( FALSE ) == kDemoStateExpired )
175b34 ¤   ¤   {
fbd574 ¤   ¤   ¤   eudoraErr = EMSR_UNKNOWN_FAIL;
cd0fe4 ¤   ¤   }
089371 ¤   }
d37454 #endif
15af5a
b1efb9 ¤   return( eudoraErr );
--75c3 000448f4f3d40120092 Page 4 of PGPPlug.cp
7aefe6 }
46af5a
8eaf5a
79af5a
eec814 ¤   pascal PluginError
45dd79 PlugInFinish( emsUserGlobals **¤/*globalsHandle*/)
a7bb36 {
00b533 ¤   DisposeMyWorld( );
2e67c5 ¤
805279 ¤   // pgpLeaksEndSession();
2567c5 ¤
e81aa6 ¤   return( EMSR_OK );
31efe6 }
8caf5a
acaf5a
c9af5a
6eaf5a
f5c814 ¤   pascal PluginError
279cb0 GetTranslatorInfo(
6d2454 ¤   emsUserGlobals **/*globalsHandle*/,
0c6f32 ¤   short¤  ¤   ¤   translatorID,
e2d6ed ¤   long *¤ ¤   ¤   type,
9027b8 ¤   long *¤ ¤   ¤   subtype,
6cf410 ¤   unsigned long *¤flags,
a4838b ¤   StringHandle *¤ trans_desc,
ca0d20 ¤   Handle *¤   ¤   iconHandlePtr)
3cbb36 {
98865f ¤   CComboError¤¤   err;
cb5e2f ¤   PluginError¤¤   eudoraErr¤  = EMSR_OK;
8467c5 ¤
8d019a ¤   err¤= InitMyWorld( );
76ed80 ¤   if ( err.IsntError() )
aac7a1 ¤   {
db96eb ¤   ¤   // Make sure that we are given a valid ID
3d60eb ¤   ¤   if( (translatorID >= kFirstTranslatorID ) &&
0edd8b ¤   ¤   ¤   (translatorID <= kLastTranslatorIDPlusOne - 1) )
2a5b34 ¤   ¤   {
4fcdfc ¤   ¤   ¤   eudoraErr¤  = CTranslator::GetInfo( (TranslatorID)translatorID,
ea109d ¤   ¤   ¤   ¤   ¤   type, subtype, flags, trans_desc, iconHandlePtr );
6e0fe4 ¤   ¤   }
580e1d ¤   ¤   else
cb5b34 ¤   ¤   {
c53de6 ¤   ¤   pgpDebugPStr( "\pillegal translator ID" );
850fe4 ¤   ¤   }
3a9371 ¤   }
be67c5 ¤
25defc ¤   if ( err.IsError() )
6bb3f8 ¤   ¤   eudoraErr¤  = CComboErrorToEudoraError( err );
771b52 ¤   ¤
09efb9 ¤   return( eudoraErr );
52efe6 }
1faf5a
f5af5a
7aaf5a
b0c814 ¤   pascal PluginError
89a62a CanTranslateFile(
4d2454 ¤   emsUserGlobals **/*globalsHandle*/,
864bbe ¤   long¤   ¤   ¤   transContext,
7f6f32 ¤   short¤  ¤   ¤   translatorID,
428316 ¤   emsMIMEtype **¤ inMimeTypeHandle,
f32b98 ¤   const FSSpec *¤ inFSp,¤ // may get removed in next version
693111 ¤   StringHandle**¤ addressesHandle,
543e26 ¤   long *¤ ¤   ¤   aprox_len,
1b9243 ¤   StringHandle*¤  errorMessage,
848385 ¤   long *¤ ¤   ¤   result_code)
d6bb36 {
31b8e5 ¤   CComboError¤err;
37e97f ¤   PluginError¤eudoraErr¤  = EMSR_OK;
0167c5 ¤
4e019a ¤   err¤= InitMyWorld( );
6ced80 ¤   if ( err.IsntError() )
44c7a1 ¤   {
--aa36 00003946dc740120092 Page 5 of PGPPlug.cp
eabb34 ¤   ¤   CTranslator *¤  translator¤ = nil;
421b52 ¤   ¤
bf227f ¤   ¤   InitPtrToNil( errorMessage );
e01b52 ¤   ¤
078110 ¤   ¤   translator¤ =
4e9051 ¤   ¤   ¤   CreateTranslator( NULL, NULL, NULL, (TranslatorID)translatorID );
831b52 ¤   ¤
d7c8a6 ¤   ¤   if ( IsntNull( translator ) )
135b34 ¤   ¤   {
46dcf3 ¤   ¤   ¤   eudoraErr¤  = translator->CanTranslate( transContext,
ddb5ed ¤   ¤   ¤   ¤   inMimeTypeHandle,
b67a6f ¤   ¤   ¤   ¤   inFSp, addressesHandle,
8df40b ¤   ¤   ¤   ¤   aprox_len, errorMessage, result_code);
3a1b52 ¤   ¤
6b723d ¤   ¤   ¤   delete translator;
970fe4 ¤   ¤   }
110e1d ¤   ¤   else
c35b34 ¤   ¤   {
5a27e0 ¤   ¤   ¤   eudoraErr = EMSR_INVALID_TRANS;
760fe4 ¤   ¤   }
da9371 ¤   }
7667c5 ¤
0ddefc ¤   if ( err.IsError() )
a2b3f8 ¤   ¤   eudoraErr¤  = CComboErrorToEudoraError( err );
da1b52 ¤   ¤
44efb9 ¤   return( eudoraErr );
f1efe6 }
4aaf5a
74af5a
c7c814 ¤   pascal PluginError
c6f6c0 TranslateFile(
802454 ¤   emsUserGlobals **/*globalsHandle*/,
ff4bbe ¤   long¤   ¤   ¤   transContext,
4e6f32 ¤   short¤  ¤   ¤   translatorID,
8bded0 ¤   emsMIMEtype **¤ inMIMETypeHandle,
8d4c49 ¤   const FSSpec *¤ inSpec,
293111 ¤   StringHandle**¤ addressesHandle,
b5af34 ¤   emsProgress¤¤   progress,
678dc8 ¤   emsMIMEtype ***¤outMIMETypeHandlePtr,
20e782 ¤   const FSSpec *¤ outSpec,
24c214 ¤   Handle *¤   ¤   returnedIcon,
939ddb ¤   StringHandle*¤  returnedMessage,
bf9243 ¤   StringHandle*¤  errorMessage,
57d71f ¤   long *¤ ¤   ¤   resultCode)
f3bb36 {
231903 ¤   CInfoPBRec¤ ¤   cpb;
675675 ¤   ulong¤  ¤   ¤   secs;
93865f ¤   CComboError¤¤   err;
735e2f ¤   PluginError¤¤   eudoraErr¤  = EMSR_OK;
c7af5a
39e0be ¤   (void)FSpGetCatInfo( outSpec, &cpb );¤  // info needed below
afaf5a
4be26e ¤   // convenient to do this here, globally
961f52 ¤   secs¤   = PrefGetSigningPassphraseCacheSeconds( );
55be74 ¤   gSigningPassphraseCache->SetCacheSeconds( secs );
3167c5 ¤
af2d4c ¤   secs¤   = PrefGetEncryptionPassphraseCacheSeconds( );
68f8db ¤   gDecryptionPassphraseCache->SetCacheSeconds( secs );
8067c5 ¤
0f6e70 ¤   InitPtrToNil( returnedIcon );
f0d1f6 ¤   InitPtrToNil( returnedMessage );
31cd0c ¤   InitPtrToNil( errorMessage );
c4af5a
94c274 ¤   // note: 'returnedIcon' is not implemented by Eudora, so we won't both
b4304f ¤   // passing it to our translators
6067c5 ¤
21019a ¤   err¤= InitMyWorld( );
2ded80 ¤   if ( err.IsntError() )
f1c7a1 ¤   {
a65fd4 ¤   ¤   const ulong¤¤   kMinHeapSpace¤  = 300 * 1024UL;
671b52 ¤   ¤
03a14b ¤   ¤   if ( FreeMem() < kMinHeapSpace )
--b622 001340ff8e740120092 Page 6 of PGPPlug.cp
e35b34 ¤   ¤   {
721401 ¤   ¤   ¤   Str255¤ msg;
b687c7 ¤   ¤   ¤
694c20 ¤   ¤   ¤   GetIndString( msg,
ad409c ¤   ¤   ¤   ¤   kTranslatorErrorStringsResID, kOutOfMemoryStrIndex );
d31b34 ¤   ¤   ¤   WarningAlert( kWANoteAlertType, kWAOKStyle, msg );
53b4c3 ¤   ¤   ¤   eudoraErr¤  = CComboErrorToEudoraError( err );
6c3516 ¤   ¤   ¤   *resultCode¤= EMSR_TRANS_FAILED;
e70fe4 ¤   ¤   }
b59371 ¤   }
3e67c5 ¤
1467c5 ¤
0fed80 ¤   if ( err.IsntError() )
d4c7a1 ¤   {
1fbb34 ¤   ¤   CTranslator *¤  translator¤ = nil;
641b52 ¤   ¤
9355d3 ¤   ¤   translator¤ = CreateTranslator( sContext, sTLSContext,
b1089a ¤   ¤   ¤   ¤   ¤   progress, (TranslatorID)translatorID );
e3c8a6 ¤   ¤   if ( IsntNull( translator ) )
975b34 ¤   ¤   {
a86f44 ¤   ¤   ¤   err¤= translator->PrepareToTranslate();
e775d7 ¤   ¤   ¤   if ( err.IsntError() )
baf776 ¤   ¤   ¤   {
9acd72 ¤   ¤   ¤   ¤   eudoraErr¤  = translator->TranslateFile( transContext,
650758 ¤   ¤   ¤   ¤   ¤   inMIMETypeHandle,
526bf0 ¤   ¤   ¤   ¤   ¤   inSpec, addressesHandle, outMIMETypeHandlePtr,
0ec00d ¤   ¤   ¤   ¤   ¤   outSpec, returnedMessage, errorMessage, resultCode);
dfa3a6 ¤   ¤   ¤   }
7287c7 ¤   ¤   ¤
35723d ¤   ¤   ¤   delete translator;
8e0fe4 ¤   ¤   }
420e1d ¤   ¤   else
aa5b34 ¤   ¤   {
9f27e0 ¤   ¤   ¤   eudoraErr = EMSR_INVALID_TRANS;
350fe4 ¤   ¤   }
829371 ¤   }
3767c5 ¤
662f28 ¤   // Eudora doesn't like it if there is no output file, even if
6b50aa ¤   // we're returning an error.
4ddd2a ¤   if ( ! FSpExists( outSpec ) )
f6c7a1 ¤   {
0ebcd5 ¤   ¤   (void)FSpCreate( outSpec, cpbFileCreator( &cpb ), cpbFileType( &cpb ),
c0ba78 ¤   ¤   ¤   ¤   smSystemScript );
9b9371 ¤   }
36af5a
d3defc ¤   if ( err.IsError() )
29c7a1 ¤   {
12b3f8 ¤   ¤   eudoraErr¤  = CComboErrorToEudoraError( err );
159371 ¤   }
c367c5 ¤
110226 ¤   return eudoraErr;
04efe6 }
7baf5a
3baf5a
4aaf5a
61af5a
34af5a
--54c3 001a3f210f640120093 Page 1 of PGPPlug.h
a70335 /*____________________________________________________________________________
c63064 ¤   PGPPlug.h
3c67c5 ¤
a7c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
804b0f ¤   All rights reserved.
0667c5 ¤
0767c5 ¤
54af5a
0229f9 ¤   $Id: PGPPlug.h,v 1.2.8.1 1998/11/12 03:06:41 heller Exp $
b6f7f7 ____________________________________________________________________________*/
e47b7d #pragma once
67af5a
e1bdd3 #include "usertrans.h"
8048c9 #include "emsapi-mac.h"
13af5a
8623fb #include "PGPPlugTypes.h"
64af5a
556dad extern "C" {
efaf5a
a2f99a pascal PluginError¤ PlugInFinish( emsUserGlobals **¤globalsHandle );
ebaf5a
f668df pascal PluginError¤ PlugInInit( emsUserGlobals ** globalsHandle,
e4295e ¤   ¤   ¤   ¤   ¤   ¤   ¤   short* module_count,
ddd0eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle *descriptionHandlePtr,
6344d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   short* module_id, Handle* iconHandlePtr);
7587c7 ¤   ¤   ¤
dd2fe4 pascal PluginError¤ GetTranslatorInfo( emsUserGlobals ** globalsHandle,
d11502 ¤   ¤   ¤   ¤   ¤   ¤   ¤   short trans_id,long * type, long * subtype,
602053 ¤   ¤   ¤   ¤   ¤   ¤   ¤   unsigned long * flags,StringHandle* trans_desc,
d3e90e ¤   ¤   ¤   ¤   ¤   ¤   ¤   Handle * iconHandlePtr);
5587c7 ¤   ¤   ¤
81426b pascal PluginError¤ CanTranslateFile( emsUserGlobals ** globalsHandle,
e7d3cb ¤   ¤   ¤   ¤   ¤   ¤   ¤   long transContext, short trans_id,
16c2af ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsMIMEtype ** inMimeTypeHandle,
1444d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * inFSp, StringHandle** addressesHandl¶
831939 e,
874d87 ¤   ¤   ¤   ¤   ¤   ¤   ¤   long * aprox_len, StringHandle* errorMessage,
c4e0b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   long * result_code);
4b2b85 ¤   ¤   ¤   ¤
d12a9d pascal PluginError¤ TranslateFile( emsUserGlobals ** globalsHandle,
a8d3cb ¤   ¤   ¤   ¤   ¤   ¤   ¤   long transContext, short trans_id,
2051d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsMIMEtype ** InMIMEtypeHandle,
ea44d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * inFSp, StringHandle** addressesHandl¶
441939 e,
59fdd1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsProgress progress,
81cde9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   emsMIMEtype ***OutMIMEtypeHandlePtr,
1df92a ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * outFSp, Handle * returnedIcon,
c8cfc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* returnedMessage,
008f0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringHandle* errorMessage, long * resultCode);
a3be43 }¶
--eed3 000e60f08df40120094 Page 1 of PGPPlugGlue.cp
a70335 /*____________________________________________________________________________
f33bec ¤   PGPPlugGlue.cp
e667c5 ¤
efc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
044b0f ¤   All rights reserved.
0867c5 ¤
5467c5 ¤
09af5a
2f0359 ¤   $Id: PGPPlugGlue.cp,v 1.8.8.1 1998/11/12 03:06:42 heller Exp $
79f7f7 ____________________________________________________________________________*/
f3af5a
138f22 #include <CodeFragments.h>
e73a79 #include <MixedMode.h>
f0af5a
1d6276 #include "EudoraTypes.h"
b1af5a
ac0cf9 #include "PGPPlug.h"
a1bbf4 #include "MacFiles.h"
098bd8 #include "MacEnvirons.h"
5b85c2 #include "MacStrings.h"
76af5a
a80940 #include "PluginProcInfo.h"
20af5a
a0af5a
f6af5a
57af5a
316b23 #if GENERATING68K
26d780 ¤   #define¤CALL_TO_CFM¤¤   1
45db21 #else
a6ce58 ¤   #define¤CALL_TO_CFM¤¤   0
247454 #endif
59af5a
8ecdab #if CALL_TO_CFM¤// [
1baf5a
a7e21c typedef pascal long¤(*EMSInitProcPtr)(Handle globalsHandle,
1fce62 ¤   ¤   ¤   ¤   ¤   ¤   short *module_count, StringPtr **descriptionHandlePtr,
c56c0f ¤   ¤   ¤   ¤   ¤   ¤   short *module_id, Handle *iconHandlePtr );
64af5a
4dd48e typedef pascal long (*EMSFinishProcPtr)(Handle globalsHandle);
90af5a
580912 typedef pascal long¤(*EMSTranslatorInfoProcPtr)(Handle globalsHandle,
b9632a ¤   ¤   ¤   ¤   ¤   ¤   short trans_id, long *type, long *subtype,
332146 ¤   ¤   ¤   ¤   ¤   ¤   unsigned long *flags, StringPtr **trans_desc,
538d45 ¤   ¤   ¤   ¤   ¤   ¤   Handle *iconHandlePtr);
cdaf5a
97e519 typedef pascal long (*EMSCanTranslateFileProcPtr)(Handle globalsHandle,
43d329 ¤   ¤   ¤   ¤   ¤   ¤   long transContext, short trans_id,
8dfec5 ¤   ¤   ¤   ¤   ¤   ¤   emsMIMEtype **inMimeTypeHandle, FSSpec *inFSp,
6dbf81 ¤   ¤   ¤   ¤   ¤   ¤   StringPtr ***addressesHandle, long *aprox_len,
f1046e ¤   ¤   ¤   ¤   ¤   ¤   StringPtr **errorMessage, long *result_code);
57af5a
5f3a1c typedef pascal long (*EMSTranslateFileProcPtr)(Handle globalsHandle,
81d329 ¤   ¤   ¤   ¤   ¤   ¤   long transContext, short trans_id,
074025 ¤   ¤   ¤   ¤   ¤   ¤   emsMIMEtype **InMIMEtypeHandle, FSSpec *inFSp,
d30749 ¤   ¤   ¤   ¤   ¤   ¤   StringPtr ***addressesHandle, emsProgress progress,·
c0ebbc ¤   ¤   ¤   ¤   ¤   ¤   emsMIMEtype ***OutMIMEtypeHandlePtr, FSSpec *outFSp,
125e8b ¤   ¤   ¤   ¤   ¤   ¤   Handle *returnedIcon, StringPtr **returnedMessage,
450540 ¤   ¤   ¤   ¤   ¤   ¤   StringPtr **errorMessage, long *resultCode);
76e553 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
4d39a6 typedef struct MyRoutineDescriptors
83bb36 {
180994 ¤   EMSInitProcPtr¤ ¤   ¤   ¤   init;
2169ce ¤   EMSFinishProcPtr¤   ¤   ¤   finish;
486a54 ¤   EMSTranslatorInfoProcPtr¤   getTranslatorInfo;
de88f8 ¤   EMSCanTranslateFileProcPtr¤ canTranslateFile;
4c45da ¤   EMSTranslateFileProcPtr¤¤   translateFile;
448a5c } ·MyRoutineDescriptors;
d4af5a
66f47e static CFragConnectionID sMyConnectionID¤   =
5a3ab0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kUnresolvedCFragSymbolAddress;
a5531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
e681a4 static MyRoutineDescriptors¤¤   sMyRoutines¤= { nil, };
--a5fc 000375cda1740120094 Page 2 of PGPPlugGlue.cp
e0af5a
16a2ad ¤   static CFragConnectionID
f218c2 GetMyConnectionID()
70bb36 {
9c97db ¤   return( sMyConnectionID );
99efe6 }
88af5a
d0d140 ¤   static OSErr
69f59e GetSymbol(
7a5489 ¤   ConstStringPtr¤ ¤   symbolName,
fe61ca ¤   Ptr¤*¤  ¤   ¤   ¤   symbol )
a2bb36 {
5d4461 ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
2b6212 ¤   CFragSymbolClass¤   theSymClass;
0c1b52 ¤   ¤
238b5b ¤   err = FindSymbol( GetMyConnectionID(), symbolName, symbol, &theSymClass);
08d32f ¤   AssertNoErr( err, "GetSymbol" );
351b52 ¤   ¤
5edeb7 ¤   return( err );
a3efe6 }
0caf5a
4daf5a
a92473 ¤   static OSStatus
00b5e7 sFind68KLib(
b1be45 ¤   const short¤¤   vRefNum,
5f24cf ¤   const long¤ ¤   dirID,
8e4551 ¤   FSSpec *¤   ¤   outSpec )
febb36 {
4875f8 ¤   OSStatus¤   err¤= noErr;
eb7136 ¤   long¤   ¤   dirIndex¤   = 1;
6367c5 ¤
04f799 ¤   const OSType¤   kMySearchType¤  ¤   = 'shlb';
6cc8b5 ¤   const OSType¤   kMySearchCreator¤   = 'pgpE';
9a67c5 ¤
941eaa ¤   outSpec->vRefNum¤   = vRefNum;
667cdd ¤   outSpec->parID¤ ¤   = dirID;
fd67c5 ¤
60a1f8 ¤   dirIndex¤   = 1;
bccfa1 ¤   do
84c7a1 ¤   {
81fef6 ¤   ¤   CInfoPBRec¤ cpb;
db67c5 ¤
796d68 ¤   ¤   cpb.dirInfo.ioVRefNum ¤ = vRefNum;
bc2c2f ¤   ¤   cpb.dirInfo.ioDrDirID ¤ = dirID;
bdb524 ¤   ¤   cpb.dirInfo.ioNamePtr¤  = outSpec->name;
e761c3 ¤   ¤   cpb.dirInfo.ioFDirIndex¤= dirIndex;
b81b52 ¤   ¤
ce63f9 ¤   ¤   err = PBGetCatInfoSync( &cpb );
a203ef ¤   ¤   if( IsErr( err ) )
67cdcb ¤   ¤   ¤   break;
071b52 ¤   ¤
459946 ¤   ¤   if ( cpbIsFile( &cpb ) )
c95b34 ¤   ¤   {
68377f ¤   ¤   ¤   if ( cpbFileType( &cpb ) == kMySearchType &&
bed457 ¤   ¤   ¤   ¤   cpbFileCreator( &cpb ) == kMySearchCreator )
e1f776 ¤   ¤   ¤   {
a8f622 ¤   ¤   ¤   ¤   break;
0ca3a6 ¤   ¤   ¤   }
d20fe4 ¤   ¤   }
dd9ebd ¤   ¤   ++dirIndex;
551b52 ¤   ¤
64c598 ¤   } while( TRUE );
9767c5 ¤
f37a91 ¤   if ( IsErr( err ) )
61c7a1 ¤   {
8137fa ¤   ¤   pgpClearMemory( outSpec, sizeof( *outSpec ) );
e19371 ¤   }
1667c5 ¤
0bdeb7 ¤   return( err );
5fefe6 }
84af5a
37af5a
--c37c 0001ae4908d40120094 Page 3 of PGPPlugGlue.cp
1dd140 ¤   static OSErr
96f220 LoadMyLibrary( )
50bb36 {
0c6a07 ¤   Ptr¤¤   ¤   ¤   ¤   mainAddr;
cfa58b ¤   Str255¤ ¤   ¤   ¤   errorName;
f26ead ¤   OSStatus¤   ¤   ¤   err¤= noErr;
f06c34 ¤   CFragConnectionID¤  connectionID;
75897e ¤   short¤  ¤   ¤   ¤   curResFile = CurResFile();
6cf78e ¤   FSSpec¤ ¤   ¤   ¤   spec;
c4af5a
6e044a ¤   GetSpecFromRefNum( curResFile, &spec);
b81d6a ¤   if( ! RunningOnPowerPC() )
28c7a1 ¤   {
b02dbe ¤   ¤   err¤= sFind68KLib( spec.vRefNum, spec.parID, &spec );
6e9371 ¤   }
e167c5 ¤
865ecc ¤   if ( IsntErr( err ) )
a5c7a1 ¤   {
02fe90 ¤   ¤   err¤= GetDiskFragment( &spec,
bee011 ¤   ¤   ¤   ¤   0UL, kCFragGoesToEOF, nil, kPrivateCFragCopy,
206f26 ¤   ¤   ¤   ¤   &connectionID, &mainAddr, errorName);
74a724 ¤   ¤   AssertNoErr( err, "LoadMyLibrary" );
90af5a
43d798 ¤   ¤   if ( IsntErr( err ) )
1e5b34 ¤   ¤   {
4ff1a0 ¤   ¤   ¤   sMyConnectionID¤= connectionID;
dc87c7 ¤   ¤   ¤
87f425 ¤   ¤   ¤   err = GetSymbol( "\pPlugInInitRD", (Ptr *)&sMyRoutines.init);
612714 ¤   ¤   ¤   AssertNoErr( err, "LoadMyLibrary: can't find symbol" );
2887c7 ¤   ¤   ¤
a08455 ¤   ¤   ¤   err = GetSymbol( "\pPlugInFinishRD", (Ptr *)&sMyRoutines.finish);
1f2714 ¤   ¤   ¤   AssertNoErr( err, "LoadMyLibrary: can't find symbol" );
0287c7 ¤   ¤   ¤
2ed2da ¤   ¤   ¤   err = GetSymbol( "\pGetTranslatorInfoRD",
fd2ed2 ¤   ¤   ¤   ¤   ¤   (Ptr *)&sMyRoutines.getTranslatorInfo);
082714 ¤   ¤   ¤   AssertNoErr( err, "LoadMyLibrary: can't find symbol" );
9887c7 ¤   ¤   ¤
8781f4 ¤   ¤   ¤   err = GetSymbol( "\pCanTranslateFileRD",
76d9b5 ¤   ¤   ¤   ¤   ¤   (Ptr *)&sMyRoutines.canTranslateFile);
152714 ¤   ¤   ¤   AssertNoErr( err, "LoadMyLibrary: can't find symbol" );
e687c7 ¤   ¤   ¤
2f8a20 ¤   ¤   ¤   err = GetSymbol( "\pTranslateFileRD",
e4149e ¤   ¤   ¤   ¤   ¤   (Ptr *)&sMyRoutines.translateFile);
4f2714 ¤   ¤   ¤   AssertNoErr( err, "LoadMyLibrary: can't find symbol" );
d80fe4 ¤   ¤   }
689371 ¤   }
01a19c ¤   AssertNoErr( err, "LoadMyLibrary" );
5367c5 ¤
91deb7 ¤   return( err );
a8efe6 }
d1af5a
8faf5a
5233c8 ¤   static void
f67364 UnloadMyLibrary( ·)
7dbb36 {
f68e70 ¤   OSErr¤  err¤= noErr;
e467c5 ¤
3cea52 ¤   if ( sMyConnectionID != 0 )
3cc7a1 ¤   {
98bcdb ¤   ¤   err¤= CloseConnection( &sMyConnectionID );
79495e ¤   ¤   pgpAssert( sMyConnectionID == 0 );
45138e ¤   ¤   AssertNoErr( err, "UnloadMyLibrary" );
3d9371 ¤   }
3aefe6 }
8567c5 ¤
d176d8 #endif¤ // ]
2caf5a
333800 ¤   pascal long
27e66f ems_plugin_version(
e8a976 ¤   short*¤ api_version)
3ebb36 {
1aaf5a
--9998 0001ae2971a40120094 Page 4 of PGPPlugGlue.cp
66887c ¤   if( IsntNull( api_version ) )
a8c7a1 ¤   {
10542e ¤   ¤   *api_version = EMS_VERSION;
169371 ¤   }
9467c5 ¤
6edc36 ¤   return(EMSR_OK);
27efe6 }
eeaf5a
1e67c5 ¤
733800 ¤   pascal long
487437 ems_plugin_init(
be876d ¤   Handle¤ ¤   globalsHandle,
7a9e84 ¤   short*¤ ¤   module_count,
482382 ¤   StringPtr**¤descriptionHandlePtr,
2203ca ¤   short*¤ ¤   module_id,
ac13f4 ¤   Handle*¤¤   iconHandlePtr)
43bb36 {
2f0162 ¤   long¤   err¤= noErr;
6867c5 ¤
23a3e2 ¤   pgpAssert( sizeof( int ) == 4 );
824153 ¤   if ( sizeof( int ) != 4 )
9fc7a1 ¤   {
93c7c1 ¤   ¤   SysError( 444 );
839371 ¤   }
0767c5 ¤
272d43 #if CALL_TO_CFM
bdbc47 ¤   err¤= LoadMyLibrary();
785ecc ¤   if ( IsntErr( err ) )
2bc7a1 ¤   {
f39807 ¤   ¤   err¤= (*sMyRoutines.init)( ·globalsHandle, module_count,
9637dc ¤   ¤   ¤   ¤   descriptionHandlePtr, module_id, iconHandlePtr );
429371 ¤   }
e3db21 #else
1019e7 ¤   err¤= PlugInInit( (emsUserGlobals **)globalsHandle, module_count,
7589f5 ¤   ¤   descriptionHandlePtr, module_id, iconHandlePtr);
617454 #endif
af67c5 ¤
fe62b6 ¤   AssertNoErr( err, "ems_plugin_init" );
f9deb7 ¤   return( err );
aaefe6 }
5daf5a
cbaf5a
d43800 ¤   pascal long
158b19 ems_plugin_finish(
050dfc ¤   Handle¤ globalsHandle)
40bb36 {
390162 ¤   long¤   err¤= noErr;
aaaf5a
802d43 #if CALL_TO_CFM
773856 ¤   err¤= (*sMyRoutines.finish)( ·globalsHandle );
377278 ¤   UnloadMyLibrary();
d1db21 #else
edf911 ¤   err¤= PlugInFinish( (emsUserGlobals **)globalsHandle );
2f7454 #endif
8fdeb7 ¤   return( err );
baefe6 }
95af5a
cfaf5a
27af5a
553800 ¤   pascal long
2c1cfa ems_translator_info(
c81e08 ¤   Handle¤ ¤   ¤   globalsHandle,
166d2f ¤   short¤  ¤   ¤   trans_id,
51d6ed ¤   long *¤ ¤   ¤   type,
da27b8 ¤   long *¤ ¤   ¤   subtype,
09f410 ¤   unsigned long *¤flags,
6d9cc8 ¤   StringPtr **¤   trans_desc,
e90d20 ¤   Handle *¤   ¤   iconHandlePtr)
88bb36 {
290162 ¤   long¤   err¤= noErr;
8daf5a
1a2d43 #if CALL_TO_CFM
--c1e5 000647036ee40120094 Page 5 of PGPPlugGlue.cp
013f09 ¤   err¤= (*sMyRoutines.getTranslatorInfo)( ·globalsHandle, trans_id,
c38eed ¤   ¤   ¤   type, subtype, flags, trans_desc, iconHandlePtr );
f6db21 #else
598c3a ¤   err¤= GetTranslatorInfo( (emsUserGlobals **)globalsHandle,
7d5f4c ¤   ¤   ¤   trans_id, type, subtype, flags, trans_desc, iconHandlePtr);
987454 #endif
6adeb7 ¤   return( err );
0aefe6 }
20af5a
5eaf5a
f1af5a
4c22b0 pascal long
a44602 ems_can_translate_file(
1d1e08 ¤   Handle¤ ¤   ¤   globalsHandle,
a94bbe ¤   long¤   ¤   ¤   transContext,
116d2f ¤   short¤  ¤   ¤   trans_id,
128316 ¤   emsMIMEtype **¤ inMimeTypeHandle,
1670b6 ¤   FSSpec *¤   ¤   inFSp,¤ ¤   ¤   ¤   // may get removed in next version
fa867b ¤   StringPtr ***¤  addressesHandle,
483e26 ¤   long *¤ ¤   ¤   aprox_len,
bfbb8e ¤   StringPtr **¤   errorMessage,
cd8385 ¤   long *¤ ¤   ¤   result_code)
6cbb36 {
2b838d ¤   long¤   err;
c067c5 ¤
862d43 #if CALL_TO_CFM
6c2f37 ¤   err¤= (*sMyRoutines.canTranslateFile)( globalsHandle,
e34879 ¤   ¤   ¤   transContext, trans_id, inMimeTypeHandle, inFSp,
f7980c ¤   ¤   ¤   addressesHandle, aprox_len, errorMessage, result_code);
15db21 #else
927916 ¤   err¤= CanTranslateFile( (emsUserGlobals **)globalsHandle, transContext,
6edba0 ¤   ¤   ¤   trans_id, inMimeTypeHandle, inFSp, addressesHandle, aprox_len,
7e2832 ¤   ¤   ¤   errorMessage, result_code);
ff7454 #endif
7a1b52 ¤   ¤
79deb7 ¤   return( err );
7befe6 }
99af5a
2faf5a
b48e44 #include "MacIcons.h"
d2af5a
b33800 ¤   pascal long
4f4d06 ems_translate_file(
4e1e08 ¤   Handle¤ ¤   ¤   globalsHandle,
f94bbe ¤   long¤   ¤   ¤   transContext,
776d2f ¤   short¤  ¤   ¤   trans_id,
5a106f ¤   emsMIMEtype **¤ InMIMEtypeHandle,
2f7141 ¤   FSSpec *¤   ¤   inFSp,
06867b ¤   StringPtr ***¤  addressesHandle,
2aaf34 ¤   emsProgress¤¤   progress,
9142f4 ¤   emsMIMEtype ***¤OutMIMEtypeHandlePtr,
0884f3 ¤   FSSpec *¤   ¤   outFSp,
cac214 ¤   Handle *¤   ¤   returnedIcon,
e39c15 ¤   StringPtr **¤   returnedMessage,
ddbb8e ¤   StringPtr **¤   errorMessage,
5cd71f ¤   long *¤ ¤   ¤   resultCode)
62bb36 {
41838d ¤   long¤   err;
6867c5 ¤
e92d43 #if CALL_TO_CFM
ec2d62 ¤   err¤= (*sMyRoutines.translateFile)( globalsHandle,
8d2cc5 ¤   ¤   ¤   transContext, trans_id, InMIMEtypeHandle, inFSp, addressesHandle,
3043e0 ¤   ¤   ¤   progress, OutMIMEtypeHandlePtr, outFSp, returnedIcon,
d2e72f ¤   ¤   ¤   returnedMessage, errorMessage, resultCode);
8edb21 #else
db6f7c ¤   err¤= TranslateFile( (emsUserGlobals **)globalsHandle, transContext,
9327ac ¤   ¤   ¤   trans_id, InMIMEtypeHandle, inFSp, addressesHandle, progress,
16d63a ¤   ¤   ¤   OutMIMEtypeHandlePtr, outFSp, returnedIcon, returnedMessage,
6933bd ¤   ¤   ¤   errorMessage, resultCode);
b47454 #endif
bb67c5 ¤
64deb7 ¤   return( err );
--644a 001301298d140120094 Page 6 of PGPPlugGlue.cp
7aefe6 }
46af5a
8eaf5a
79af5a
85af5a
1eaf5a
00af5a
a7af5a
30af5a
--fbe4 00199d2854140120095 Page 1 of PGPPlugTypes.h
a70335 /*____________________________________________________________________________
a74768 ¤   PGPPlugTypes.h
0167c5 ¤
f8c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
c64b0f ¤   All rights reserved.
5567c5 ¤
a167c5 ¤
21af5a
bde52a ¤   $Id: PGPPlugTypes.h,v 1.1.18.1 1998/11/12 03:06:42 heller Exp $
8df7f7 ____________________________________________________________________________*/
6aaf5a
1e7b7d #pragma once
35af5a
995ec8 typedef long¤   PluginError;¶
--5ed7 0010c3d742f40120096 Page 1 of PGPPlugin.inc
a70335 /*____________________________________________________________________________
a7ad75 ¤   PGPPlugin.inc
2467c5 ¤
bac97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
254b0f ¤   All rights reserved.
2367c5 ¤
8a67c5 ¤
7aaf5a
01e561 ¤   $Id: PGPPlugin.inc,v 1.5.16.1 1998/11/12 03:06:43 heller Exp $
f2f7f7 ____________________________________________________________________________*/
68af5a
6faf5a
1b77e0 #if __POWERPC__
081550 ¤   #include <MacHeadersPPC>
1ffc58 #elif __CFM68K__
64ee58 ¤   #include <MacHeadersCFM68K>
5fdb21 #else
cd3585 ¤   #include <MacHeaders68K>
0a7454 #endif
afaf5a
206eab #define PGP_MACINTOSH¤  ¤   1
9caf5a
c9cc0e #ifndef PGP_DEBUG
30e39f PGP_DEBUG must be defined·
16e39f PGP_DEBUG must be defined·
e07454 #endif
12af5a
58af5a
c2af5a
5081a4 #include "pgpBuildFlags.h"
b1af5a
d691ae #define USE_PGP_OPERATOR_NEW¤   ¤   ¤   1
887328 #define HAVE_CONFIG_H¤  ¤   ¤   ¤   ¤   1
696940 #define USE_MAC_DEBUG_PATCHES¤  ¤   ¤   0 ¤
5c8ebe #define UNFINISHED_CODE_ALLOWED¤¤   ¤   1
210fbc #define USE_PGP_LEAKS¤  ¤   ¤   ¤   ¤   PGP_DEBUG
2eaf5a
d5af5a
ac8590 #include¤   "pgpMem.h"
1a9970 #include¤   "MacDebug.h"
e8af5a
3b1024 typedef const uchar *¤  ConstStringPtr;
06af5a
31afd0 #if RELEASE
85af5a
729801 ¤   #if BETA
87810a ¤   BETA must be off if RELEASE is on
45b7ec ¤   #endif
afaf5a
58d92d ¤   #if PGP_DEBUG
a55d11 ¤   PGP_DEBUG must be off if RELEASE is on
36b7ec ¤   #endif
3667c5 ¤
807454 #endif
95af5a
8a9838 #if BETA
6e2311 ¤   #include "Beta.h"
147454 #endif
d1af5a
8baf5a
0caf5a
--6323 0016b4dc9a240120097 Page 1 of PGPPlugin.prefix
a70335 /*____________________________________________________________________________
421c13 ¤   PGPPlugin.prefix
4167c5 ¤
5fc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
574b0f ¤   All rights reserved.
c167c5 ¤
b767c5 ¤
d3af5a
99a741 ¤   $Id: PGPPlugin.prefix,v 1.1.18.1 1998/11/12 03:06:44 heller Exp $
4ff7f7 ____________________________________________________________________________*/
b2d0bc #define PGP_DEBUG¤  ¤   0
f4af5a
266504 #include "PGPPlugin.inc"
6baf5a
--d641 001f444106040120098 Page 1 of PGPPluginDebug.prefix
a70335 /*____________________________________________________________________________
bdcfc2 ¤   Copyright (C) 1996 Network Associates, Inc. and its affiliates.
994b0f ¤   All rights reserved.
dc67c5 ¤
a5a949 ¤   $Id: PGPPluginDebug.prefix,v 1.1.20.1 1998/11/12 03:06:44 heller Exp $
0ff7f7 ____________________________________________________________________________*/
8167c5 ¤
2ac964 #define PGP_DEBUG¤  ¤   1
cfaf5a
906504 #include "PGPPlugin.inc"
f4af5a
--4324 00183a2767540120099 Page 1 of PGPPluginGlobals.h
bc38e5 /*
34bd54 ·* Copyright (C) 1996 Network Associates, Inc. and its affiliates.
de599a ·* All rights reserved.
c6775e ·*
75495d ·*/
a87b7d #pragma once
95af5a
838fa1 not used¶
--2ba6 00158c5af484012009a Page 1 of PGPPluginMain.cp
bc38e5 /*
34bd54 ·* Copyright (C) 1996 Network Associates, Inc. and its affiliates.
de599a ·* All rights reserved.
c6775e ·*
75495d ·*/
588fa1 not used¶
--cabe 000a1bb22084012009b Page 1 of PlugInLibUtils.cp
a70335 /*____________________________________________________________________________
db9085 ¤   PluginLibUtils.cp
ab67c5 ¤
1ac97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
8b4b0f ¤   All rights reserved.
fe67c5 ¤
5a67c5 ¤
ccaf5a
edbb8f ¤   $Id: PlugInLibUtils.cp,v 1.7.8.1 1998/11/12 03:06:46 heller Exp $
75f7f7 ____________________________________________________________________________*/
07af5a
6f85c2 #include "MacStrings.h"
dd034d #include "PluginLibUtils.h"
f8a076 #include "pgpKeys.h"
a2e001 #include "PassphraseCache.h"
171b42 #include "pgpStrings.h"
58af5a
35af5a
8eaf5a
af54e9 CIterateUserIDs::CIterateUserIDs( PGPContextRef context )
66bb36 {
3d7702 ¤   mContext¤   = context;
816008 ¤   mKeySet¤¤   = nil;
7c8bb8 ¤   mKeyList¤   = nil;
3a1f3f ¤   mKeyIter¤   = nil;
d3efe6 }
2567c5 ¤
e867c5 ¤
fb92f7 CIterateUserIDs::~CIterateUserIDs( )
3abb36 {
79dd64 ¤   if ( IsntNull( mKeySet ) )
7f1141 ¤   ¤   PGPFreeKeySet( mKeySet );
491b52 ¤   ¤
6372ec ¤   if ( IsntNull( mKeyList ) )
376438 ¤   ¤   PGPFreeKeyList( mKeyList );
431b52 ¤   ¤
6914af ¤   if ( IsntNull( mKeyIter ) )
12f7d9 ¤   ¤   PGPFreeKeyIter( mKeyIter );
d2efe6 }
92af5a
86af5a
e2c744 ¤   PGPError
711529 CIterateUserIDs::Init( )
2fbb36 {
b44a50 ¤   PGPError¤   err¤= kPGPError_LazyProgrammer;
b067c5 ¤
e929cd ¤   if ( IsNull( mKeySet ) )
d4c7a1 ¤   {
9dd6f7 ¤   ¤   err¤= PGPOpenDefaultKeyRings( mContext, FALSE, &mKeySet );
0b511b ¤   ¤   if ( IsntNull( mKeySet ) )
665403 ¤   ¤   ¤   err¤= kPGPError_NoErr;
009371 ¤   }
061b52 ¤   ¤
1ce4b3 ¤   if ( IsntNull( mKeySet ) && IsNull( mKeyList ) )
0612d3 ¤   ¤   err¤= PGPOrderKeySet( mKeySet, kPGPAnyOrdering, &mKeyList);
951b52 ¤   ¤
a5d997 ¤   if ( IsntPGPError( err ) && IsNull( mKeyIter ) )
c7a3c6 ¤   ¤   err¤= PGPNewKeyIter( mKeyList, &mKeyIter);
1d67c5 ¤
4cdeb7 ¤   return( err );
d3efe6 }
b5af5a
93af5a
e3c744 ¤   PGPError
724428 CIterateUserIDs::Iterate( )
c3bb36 {
f49372 ¤   PGPError¤   ¤   err¤= kPGPError_NoErr;
a667c5 ¤
35c63f ¤   err¤= Init( );
e71b52 ¤   ¤
caa159 ¤   if ( err == kPGPError_NoErr )
a1c7a1 ¤   {
--cdfa 000e35d73f64012009b Page 2 of PlugInLibUtils.cp
8dc9e8 ¤   ¤   PGPKey *¤   ¤   key¤= nil;
6536fc ¤   ¤   Boolean¤¤   ¤   keepIterating¤  = true;
7767c5 ¤
154d13 ¤   ¤   while ( IsntPGPError( err = PGPKeyIterNext( mKeyIter, &key) ) )
825b34 ¤   ¤   {
af3b3f ¤   ¤   ¤   PGPUserID *¤userID;
4287c7 ¤   ¤   ¤
e716b3 ¤   ¤   ¤   while ( IsntPGPError( err = PGPKeyIterNextUserID( mKeyIter,
7d0fd0 ¤   ¤   ¤   ¤   ¤   &userID) ·) )
10f776 ¤   ¤   ¤   {
dbc7c7 ¤   ¤   ¤   ¤   keepIterating¤  = ExamineUserID( userID );
29e62b ¤   ¤   ¤   ¤   if ( ! keepIterating )
ec14c3 ¤   ¤   ¤   ¤   ¤   break;
eea3a6 ¤   ¤   ¤   }
13a7d8 ¤   ¤   ¤   if ( ! keepIterating )
19f622 ¤   ¤   ¤   ¤   break;
730fe4 ¤   ¤   }
fc9371 ¤   }
d767c5 ¤
515af6 ¤   // destroy the iterator, but keep the other stuff, in case caller wants
5f5dc2 ¤   // to iterate again
e514af ¤   if ( IsntNull( mKeyIter ) )
38c7a1 ¤   {
6ef7d9 ¤   ¤   PGPFreeKeyIter( mKeyIter );
3efdde ¤   ¤   mKeyIter¤   = nil;
3b9371 ¤   }
c667c5 ¤
dedeb7 ¤   return( err );
8defe6 }
d3af5a
b4af5a
4edacc #pragma mark -
aaaf5a
a6af5a
f9af5a
c10335 /*____________________________________________________________________________
e88d9d ¤   user ID will probably be in the form "lloyd <lloyd@pgp.com>"
5f67c5 ¤
b9c70c ¤   So we have to look for our desired name
5ef7f7 ____________________________________________________________________________*/
4d7e69 ¤   Boolean
319281 CFindUserID::ExamineUserID( PGPUserID *¤userID )
bbbb36 {
7c1d18 ¤   Boolean¤¤   keepGoing¤  = true;
5c67c5 ¤
6c14fb ¤   char¤   ¤   ¤   ¤   name[ 256 ];
857461 ¤   size_t¤ ¤   ¤   ¤   totalSize;
498f52 ¤   PGPError¤   ¤   ¤   err;
4467c5 ¤
e332ca ¤   // use size -1 so we can append a null
50031a ¤   err¤¤   = PGPGetUserIDStringBuffer( userID, kPGPUserIDPropName,
2493eb ¤   ¤   ¤   ¤   sizeof( name ), name, &totalSize);
c467c5 ¤
7df1e7 ¤   if ( IsntPGPError( err ) )
46c7a1 ¤   {
cd618d ¤   ¤   if ( FindSubStringNoCase( (const char *)name, mSearchName ) != nil )
355b34 ¤   ¤   {
daeee2 ¤   ¤   ¤   mFoundIt¤   = true;
824afe ¤   ¤   ¤   keepGoing¤  = false;
eb0fe4 ¤   ¤   }
ee9371 ¤   }
2e67c5 ¤
7c9909 ¤   return( keepGoing );
f2efe6 }
11af5a
17af5a
377e69 ¤   Boolean
d87fdb CFindUserID::UserIDExists(
66e333 ¤   const char *¤   userID,
633d9b ¤   PGPError *¤ ¤   pgpErrPtr)
19bb36 {
e39462 ¤   pgpAssertAddrValid( userID, char );
--4a3d 000933d0e6b4012009b Page 3 of PlugInLibUtils.cp
2a67c5 ¤
1a8481 ¤   mSearchName¤= userID;
bc7981 ¤   mFoundIt¤   = false;
1967c5 ¤
ebf103 ¤   *pgpErrPtr¤ = Init();
df26c8 ¤   if ( *pgpErrPtr == kPGPError_NoErr )
11c7a1 ¤   {
7fbc42 ¤   ¤   *pgpErrPtr¤ = Iterate();
f89371 ¤   }
0a67c5 ¤
78fa96 ¤   return( mFoundIt );
d3efe6 }
f9af5a
af6d52 ¤   void
a3842e RememberSigningPassBuffer(
35422f ¤   PGPPassBufferRef ¤  passBuffer,
6e2106 ¤   PGPKeyRef¤  ¤   ¤   theKey)
a6bb36 {
79514f ¤   if( PGPPassBufferRefIsValid( passBuffer) &&
cbdc22 ¤   ¤   PGPKeyRefIsValid( theKey ) )
cdc7a1 ¤   {
20b81c ¤   ¤   PGPPassBufferType¤  type;
4faf5a
e8d07b ¤   ¤   type = PGPGetPassBufferType( passBuffer );
31c539 ¤   ¤   if( type == kPGPPassBufferType_Passphrase )
4c5b34 ¤   ¤   {
29e641 ¤   ¤   ¤   char¤   *passPhrase;
2287c7 ¤   ¤   ¤
6c3c60 ¤   ¤   ¤   if( IsntPGPError( PGPPassBufferGetPassphrasePtr( passBuffer,
6e9b83 ¤   ¤   ¤   ¤   ¤   ¤   &passPhrase ) ) )
55f776 ¤   ¤   ¤   {
ce05f5 ¤   ¤   ¤   ¤   gSigningPassphraseCache->RememberPassphrase( passPhrase,
8b5477 ¤   ¤   ¤   ¤   ¤   ¤   theKey );
72a3a6 ¤   ¤   ¤   }
e60fe4 ¤   ¤   }
36887a ¤   ¤   else if( type == kPGPPassBufferType_PassKey )
0f5b34 ¤   ¤   {
dc0705 ¤   ¤   ¤   PGPByte¤*passKey;
75ea5a ¤   ¤   ¤   PGPSize¤passKeySize;
5587c7 ¤   ¤   ¤
2c2138 ¤   ¤   ¤   if( IsntPGPError( PGPPassBufferGetPassKeyPtr( passBuffer,
140187 ¤   ¤   ¤   ¤   ¤   ¤   &passKey, &passKeySize ) ) )
b6f776 ¤   ¤   ¤   {
dd2d87 ¤   ¤   ¤   ¤   gSigningPassphraseCache->RememberPasskey( passKey,
e272f7 ¤   ¤   ¤   ¤   ¤   ¤   passKeySize, theKey );
24a3a6 ¤   ¤   ¤   }
ba0fe4 ¤   ¤   }
af9371 ¤   }
9eefe6 }
bdaf5a
826d52 ¤   void
0ed324 RememberDecryptionPassBuffer(
07422f ¤   PGPPassBufferRef ¤  passBuffer,
c52106 ¤   PGPKeyRef¤  ¤   ¤   theKey)
f4bb36 {
76514f ¤   if( PGPPassBufferRefIsValid( passBuffer) &&
c0dc22 ¤   ¤   PGPKeyRefIsValid( theKey ) )
0bc7a1 ¤   {
fdb81c ¤   ¤   PGPPassBufferType¤  type;
a6af5a
b3d07b ¤   ¤   type = PGPGetPassBufferType( passBuffer );
ecc539 ¤   ¤   if( type == kPGPPassBufferType_Passphrase )
f05b34 ¤   ¤   {
2ae641 ¤   ¤   ¤   char¤   *passPhrase;
dc87c7 ¤   ¤   ¤
bf3c60 ¤   ¤   ¤   if( IsntPGPError( PGPPassBufferGetPassphrasePtr( passBuffer,
699b83 ¤   ¤   ¤   ¤   ¤   ¤   &passPhrase ) ) )
85f776 ¤   ¤   ¤   {
c2dcbe ¤   ¤   ¤   ¤   gDecryptionPassphraseCache->RememberPassphrase( passPhrase,
1c5477 ¤   ¤   ¤   ¤   ¤   ¤   theKey );
e5a3a6 ¤   ¤   ¤   }
930fe4 ¤   ¤   }
--79ef 0012ef75b434012009b Page 4 of PlugInLibUtils.cp
b2887a ¤   ¤   else if( type == kPGPPassBufferType_PassKey )
d25b34 ¤   ¤   {
840705 ¤   ¤   ¤   PGPByte¤*passKey;
5cea5a ¤   ¤   ¤   PGPSize¤passKeySize;
f487c7 ¤   ¤   ¤
a32138 ¤   ¤   ¤   if( IsntPGPError( PGPPassBufferGetPassKeyPtr( passBuffer,
270187 ¤   ¤   ¤   ¤   ¤   ¤   &passKey, &passKeySize ) ) )
98f776 ¤   ¤   ¤   {
f2b123 ¤   ¤   ¤   ¤   gDecryptionPassphraseCache->RememberPasskey( passKey,
2c72f7 ¤   ¤   ¤   ¤   ¤   ¤   passKeySize, theKey );
35a3a6 ¤   ¤   ¤   }
570fe4 ¤   ¤   }
a49371 ¤   }
f2efe6 }
e3af5a
40dacc #pragma mark -
7faf5a
9eaf5a
3faf5a
43af5a
2eaf5a
--bf5d 0000cab7fed4012009c Page 1 of PlugInLibUtils.h
a70335 /*____________________________________________________________________________
6014ab ¤   PluginLibUtils.h
7d67c5 ¤
55c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
a94b0f ¤   All rights reserved.
9d67c5 ¤
2c67c5 ¤
9aaf5a
475e93 ¤   $Id: PlugInLibUtils.h,v 1.3.8.1 1998/11/12 03:06:47 heller Exp $
e1f7f7 ____________________________________________________________________________*/
0f7b7d #pragma once
c7af5a
7aaf5a
140d08 #include "pgpMem.h"
d3a076 #include "pgpKeys.h"
144919 #include "pgpUtilities.h"
c7ee51 #include "pgpPassBuffer.h"
07ef38 #include "CFree.h"
9eaf5a
45af5a
a0ec8a class CIterateUserIDs
52bb36 {
3ca2d3 protected:
255e7a ¤   PGPContextRef¤  mContext;
5b0d6c ¤   PGPKeySetRef¤   mKeySet;
cde58f ¤   PGPKeyListRef¤  mKeyList;
ee4174 ¤   PGPKeyIterRef¤  mKeyIter;
1067c5 ¤
16e488 ¤   virtual Boolean¤¤   ExamineUserID( ·PGPUserID *¤userID ) = 0;
d667c5 ¤
5e5ed4 public:
df7ba4 ¤   ¤   ¤   ¤   ¤   ¤   CIterateUserIDs( PGPContextRef context );
2818cc ¤   virtual¤¤   ¤   ¤   ~CIterateUserIDs( void );
2d67c5 ¤
abe95c ¤   virtual PGPError¤   Init( void );
3bea4e ¤   virtual PGPError¤   Iterate( void );
402fa1 } ;
82af5a
95af5a
75afd7 class CFindUserID : public CIterateUserIDs
59bb36 {
03a2d3 protected:
3feac6 ¤   const char *¤   mSearchName;
0810b3 ¤   Boolean¤¤   ¤   mFoundIt;
c467c5 ¤
0027aa ¤   virtual Boolean¤ExamineUserID( PGPUserID *¤ userID );
c067c5 ¤
1e5ed4 public:
85e2a0 ¤   ¤   ¤   ¤   ¤   ¤   CFindUserID( PGPContextRef context )
d83d56 ¤   ¤   ¤   ¤   ¤   ¤   ¤   : CIterateUserIDs( context )
693f7b ¤   ¤   ¤   ¤   ¤   ¤   {}
fe94aa ¤   ¤   ¤   ¤   ¤   ¤
2ba6ce ¤   void¤   ¤   ¤   ¤   CIterateUserIDs( PGPContextRef context );
6aa46e ¤   Boolean¤¤   ¤   ¤   UserIDExists( const char *userID, PGPError *err);
052fa1 } ;
14af5a
1eaf5a
caaf5a
c54076 class CFreePGPFileRef : public CFree
e4bb36 {
1b3958 public:¤¤   ¤
bc76c5 ¤   ¤   ¤   ¤   CFreePGPFileRef( PGPFileSpecRef ref ) : CFree( ref ) {}
6faf5a
697fe5 ¤   virtual¤¤   ~CFreePGPFileRef( ·)
f2f424 ¤   ¤   ¤   ¤   ¤   { if ( mMemory != NULL )
150b94 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeFileSpec( (PGPFileSpecRef) mMemory ); }
a282f7 };
c9af5a
b4af5a
e0ef7c void¤   RememberSigningPassBuffer(PGPPassBufferRef passBuffer,
95379a ¤   ¤   ¤   ¤   PGPKeyRef theKey);
0c13d4 void¤   RememberDecryptionPassBuffer(PGPPassBufferRef passBuffer,
--fa3b 001a72530614012009c Page 2 of PlugInLibUtils.h
2f379a ¤   ¤   ¤   ¤   PGPKeyRef theKey);
49af5a
a4af5a
42af5a
a7af5a
--09e1 00089b5ccfd4012009d Page 1 of PluginProcInfo.h
a70335 /*____________________________________________________________________________
2d4901 ¤   PluginProcInfo.h
8567c5 ¤
87c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
134b0f ¤   All rights reserved.
7567c5 ¤
c467c5 ¤
59af5a
de4edd ¤   $Id: PluginProcInfo.h,v 1.2.8.1 1998/11/12 03:06:47 heller Exp $
32f7f7 ____________________________________________________________________________*/
61af5a
1baf5a
a78f29 // PlugInInit()
4c73f4 enum {
a979b1 ····uppPlugInInitProcInfo = kPascalStackBased
0421a6 ········| RESULT_SIZE(SIZE_CODE(sizeof(PluginError)))
5e62c4 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
1bab17 ········| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(short ···*)))
cc484a ········| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(StringHandle *)))
ed10cf ········| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(short *)))
ecb7d6 ········| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(Handle *)))
9b82f7 };
81af5a
ebe7f5 // PlugInFinish()
4873f4 enum {
768d1d ····uppPluginFinishProcInfo = kPascalStackBased
b621a6 ········| RESULT_SIZE(SIZE_CODE(sizeof(PluginError)))
8e62c4 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
2f82f7 };
77af5a
4faf5a
e81369 // GetTranslatorInfo()
6d73f4 enum {
94b0f7 ····uppGetTranslatorInfoProcInfo = kPascalStackBased
5c21a6 ········| RESULT_SIZE(SIZE_CODE(sizeof(PluginError)))
4062c4 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
ae7dbf ········| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(short)))
5cd44b ········| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(long *)))
f93692 ········| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(long *)))
edbd80 ········| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(unsigned long *)))
515980 ········| STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(StringHandle *)))
4b5912 ········| STACK_ROUTINE_PARAMETER(7, SIZE_CODE(sizeof(Handle *)))
3c82f7 };
36af5a
8aaf5a
a157ff // CanTranslateFile()
4b73f4 enum {
1c9366 ····uppCanTranslateFileProcInfo = kPascalStackBased
7221a6 ········| RESULT_SIZE(SIZE_CODE(sizeof(PluginError)))
d762c4 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
99be79 ········| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
b4848e ········| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(short)))
0fb48d ········| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(emsMIMEtype **)))
418a59 ········| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(const FSSpec *)))
013f9c ········| STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(StringHandle **)))
8f5787 ········| STACK_ROUTINE_PARAMETER(7, SIZE_CODE(sizeof(long *)))
11c116 ········| STACK_ROUTINE_PARAMETER(8, SIZE_CODE(sizeof(StringHandle *)))
359a24 ········| STACK_ROUTINE_PARAMETER(9, SIZE_CODE(sizeof(long *)))
1282f7 };
cfaf5a
8aaf5a
42333c // TranslateFile()
4f73f4 enum {
04e6e7 ····uppTranslateFileProcInfo = kPascalStackBased
5921a6 ········| RESULT_SIZE(SIZE_CODE(sizeof(PluginError)))
ec62c4 ········| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
77be79 ········| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
fe848e ········| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(short)))
aeb48d ········| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(emsMIMEtype **)))
ba8a59 ········| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(const FSSpec *)))
df3f9c ········| STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(StringHandle **)))
895627 ········| STACK_ROUTINE_PARAMETER(7, SIZE_CODE(sizeof(emsProgress)))
--76f0 001d3b762d54012009d Page 2 of PluginProcInfo.h
9b806f ········| STACK_ROUTINE_PARAMETER(8, SIZE_CODE(sizeof(emsMIMEtype ***)))
ab4f4e ········| STACK_ROUTINE_PARAMETER(9, SIZE_CODE(sizeof(const FSSpec *)))
ce05e2 ········| STACK_ROUTINE_PARAMETER(10, SIZE_CODE(sizeof(Handle *)))
489b71 ········| STACK_ROUTINE_PARAMETER(11, SIZE_CODE(sizeof(StringHandle *)))
d96c38 ········| STACK_ROUTINE_PARAMETER(12, SIZE_CODE(sizeof(StringHandle *)))
60a0c7 ········| STACK_ROUTINE_PARAMETER(13, SIZE_CODE(sizeof(long *)))
fd82f7 };
61af5a
d3af5a
--53d9 001f7e49fe64012009e Page 1 of PluginResources.h
bc38e5 /*
34bd54 ·* Copyright (C) 1996 Network Associates, Inc. and its affiliates.
de599a ·* All rights reserved.
c6775e ·*
75495d ·*/
fcfe4c ·#pragma once
5ad83c ·
f7d83c ·
260e7c ·const ResID¤   kPluginIconID¤  = 127;
ab22f0 ·const ResID¤   kEncryptIconID¤ = 128;
70b99e ·const ResID¤   kSignIconID¤¤   = 129;
76d83c ·
68d83c ·
f7c7a3 ·¶
--1eac 00078665a964012009f Page 1 of TranslatorFactory.cp
a70335 /*____________________________________________________________________________
2bec50 ¤   TranslatorFactory.cp
4667c5 ¤
2dc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
634b0f ¤   All rights reserved.
b567c5 ¤
4e67c5 ¤
08af5a
a089b8 ¤   $Id: TranslatorFactory.cp,v 1.4.8.1 1998/11/12 03:06:48 heller Exp $
28f7f7 ____________________________________________________________________________*/
e3af5a
e29413 #include "TranslatorFactory.h"
2c09f0 #include "CEncryptTranslator.h"
f79da1 #include "CDecryptTranslator.h"
16b91f #include "CSignTranslator.h"
05b684 #include "CVerifyTranslator.h"
359ffc #include "CManualTranslator.h"
cb4cfb #include "TranslatorPrefs.h"
48af5a
72d673 #if PGP_DEMO
ff887f ¤   #include "PGPDemo.h"
d57454 #endif
4faf5a
309838 #if BETA
24b378 ¤   #include "WarningAlert.h"
477454 #endif
3caf5a
b8af5a
dbe340 ¤   CTranslator *
d163b3 CreateTranslator(
87a1bc ¤   PGPContextRef¤  ¤   context,
f8778e ¤   PGPtlsContextRef ¤  tlsContext,
752e50 ¤   emsProgress¤¤   ¤   progressHook,
0bc0d6 ¤   TranslatorID¤   ¤   id )
5cbb36 {
16e257 ¤   CTranslator *¤  ¤   translator¤ = nil;
5329b4 ¤   Boolean¤¤   ¤   ¤   betaExpired¤= FALSE;
5932af ¤   Boolean¤¤   ¤   ¤   demoExpired¤= FALSE;
88af5a
6c9838 #if BETA
f40a14 ¤   betaExpired = BetaExpired();
667454 #endif
70af5a
c2d673 #if PGP_DEMO
f0bf73 ¤   demoExpired = (GetDemoState() != kDemoStateActive);
8b7454 #endif
41af5a
d6138e ¤   if( betaExpired || demoExpired )
97c7a1 ¤   {
a1a29c ¤   ¤   Boolean¤¤   dontAllow¤  = false;
ed41df ¤   ¤   switch ( id )
ec5b34 ¤   ¤   {
8dfb54 ¤   ¤   ¤   case kEncryptTranslatorID:
b26fee ¤   ¤   ¤   case kEncryptAndSignTranslatorID:
477dbe ¤   ¤   ¤   case kSignTranslatorID:
cc9c75 ¤   ¤   ¤   case kManualAddKeyTranslatorID:
e10063 ¤   ¤   ¤   case kManualEncryptTranslatorID:
437709 ¤   ¤   ¤   case kManualSignTranslatorID:
560c18 ¤   ¤   ¤   case kManualEncryptSignTranslatorID:
b047ae ¤   ¤   ¤   ¤   dontAllow¤  = true;
06f622 ¤   ¤   ¤   ¤   break;
ce0fe4 ¤   ¤   }
ad3f90 ¤   ¤   if ( dontAllow )
b75b34 ¤   ¤   {
be29b1 ¤   ¤   return( nil );
b20fe4 ¤   ¤   }
4e9371 ¤   }
01af5a
837b45 ¤   switch ( id )
acc7a1 ¤   {
559ae3 ¤   ¤   default:
78a20e ¤   ¤   ¤   pgpDebugMsg( "unknown TranslatorID" );
--0982 000f5347b034012009f Page 2 of TranslatorFactory.cp
1ac0e1 ¤   ¤   ¤   translator¤ = nil;
6ecdcb ¤   ¤   ¤   break;
ee87c7 ¤   ¤   ¤
6bbaa7 ¤   ¤   case kEncryptTranslatorID:
915b34 ¤   ¤   {
b3f326 ¤   ¤   ¤   CipherOutputType¤   outputType;
8e87c7 ¤   ¤   ¤
4a8e48 ¤   ¤   ¤   outputType¤ = PrefShouldUsePGPMimeEncrypt( ) ?
c148e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kUsePGPMIME : kUseOldPGPFormat;
1487c7 ¤   ¤   ¤
ab3917 ¤   ¤   ¤   translator¤ = new CEncryptTranslator( context, tlsContext,
ed9cc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   progressHook, outputType, false);
38cdcb ¤   ¤   ¤   break;
1d0fe4 ¤   ¤   }
c387c7 ¤   ¤   ¤
82562b ¤   ¤   case kEncryptAndSignTranslatorID:
d95b34 ¤   ¤   {
6ef326 ¤   ¤   ¤   CipherOutputType¤   outputType;
d187c7 ¤   ¤   ¤
258e48 ¤   ¤   ¤   outputType¤ = PrefShouldUsePGPMimeEncrypt( ) ?
6c48e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kUsePGPMIME : kUseOldPGPFormat;
c13917 ¤   ¤   ¤   translator¤ = new CEncryptTranslator( context, tlsContext,
13d520 ¤   ¤   ¤   ¤   ¤   ¤   ¤   progressHook, outputType, true);
e9cdcb ¤   ¤   ¤   break;
ab0fe4 ¤   ¤   }
6487c7 ¤   ¤   ¤
08f642 ¤   ¤   case kSignTranslatorID:
cd5b34 ¤   ¤   {
13f326 ¤   ¤   ¤   CipherOutputType¤   outputType;
b087c7 ¤   ¤   ¤
246898 ¤   ¤   ¤   outputType¤ = PrefShouldUsePGPMimeSign( ) ?
b548e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kUsePGPMIME : kUseOldPGPFormat;
e27c38 ¤   ¤   ¤   translator¤ = new CSignTranslator( context, tlsContext,
e19f93 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   progressHook, outputType );
14cdcb ¤   ¤   ¤   break;
de0fe4 ¤   ¤   }
32af5a
9787c7 ¤   ¤   ¤
ad2ef6 ¤   ¤   case kDecryptTranslatorID:
0baf4d ¤   ¤   ¤   translator¤ = new CDecryptTranslator( context, tlsContext,
fbb90d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   progressHook );
3fcdcb ¤   ¤   ¤   break;
e987c7 ¤   ¤   ¤
dff64c ¤   ¤   case kVerifyTranslatorID:
c05070 ¤   ¤   ¤   translator¤ = new CVerifyTranslator( context, tlsContext,
0afc43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   progressHook);
27cdcb ¤   ¤   ¤   break;
ef87c7 ¤   ¤   ¤
0b0fe3 ¤   ¤   case kManualDecryptVerifyTranslatorID:
cd2735 ¤   ¤   ¤   translator¤ = new CManualDecryptVerifyTranslator( context,
4d6f05 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tlsContext, progressHook);
f0cdcb ¤   ¤   ¤   break;
bc87c7 ¤   ¤   ¤
fd1413 ¤   ¤   case kManualAddKeyTranslatorID:
7ba619 ¤   ¤   ¤   translator¤ = new CManualAddKeyTranslator( context, tlsContext,
fafc43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   progressHook);
bbcdcb ¤   ¤   ¤   break;
0587c7 ¤   ¤   ¤
b05e85 ¤   ¤   case kManualEncryptSignTranslatorID:
144857 ¤   ¤   ¤   translator¤ = new CManualEncryptSignTranslator( context,
0ea5bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tlsContext, progressHook, true );
7acdcb ¤   ¤   ¤   break;
9e87c7 ¤   ¤   ¤
9006db ¤   ¤   case kManualEncryptTranslatorID:
234857 ¤   ¤   ¤   translator¤ = new CManualEncryptSignTranslator( context,
d35baf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tlsContext, progressHook, false );
6ccdcb ¤   ¤   ¤   break;
d987c7 ¤   ¤   ¤
c14be7 ¤   ¤   case kManualSignTranslatorID:
c340f8 ¤   ¤   ¤   translator¤ = new CManualSignTranslator( context, tlsContext,
f2fc43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   progressHook);
f5cdcb ¤   ¤   ¤   break;
--035d 001b0c323c04012009f Page 3 of TranslatorFactory.cp
a19371 ¤   }
9967c5 ¤
d44994 ¤   return( translator );
dcefe6 }
e6af5a
66af5a
75af5a
f3af5a
77af5a
d7af5a
13af5a
b0af5a
--77bd 00101b5b434401200a0 Page 1 of TranslatorFactory.h
a70335 /*____________________________________________________________________________
533e24 ¤   TranslatorFactory.h
0767c5 ¤
e9c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
c94b0f ¤   All rights reserved.
0f67c5 ¤
4667c5 ¤
8eaf5a
1a0d48 ¤   $Id: TranslatorFactory.h,v 1.3.8.1 1998/11/12 03:06:49 heller Exp $
08f7f7 ____________________________________________________________________________*/
68af5a
2c7b7d #pragma once
d3af5a
acec82 #include "pgpTLS.h"
8eaf5a
3dd8a4 class CTranslator;
39af5a
67ea7e #include "PGPUtilities.h"
fae6f3 #include "TranslatorIDs.h"
6caf5a
2c48c9 #include "emsapi-mac.h"
ceaf5a
4d9ec5 CTranslator *¤  CreateTranslator( PGPContextRef context,
01f492 ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext, emsProgress progressHook,
011d50 ¤   ¤   ¤   ¤   ¤   ¤   TranslatorID id );¶
--a7fe 001fc157568401200a1 Page 1 of TranslatorIDs.h
a70335 /*____________________________________________________________________________
93d6ea ¤   TranslatorIDs.h
7867c5 ¤
72c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
174b0f ¤   All rights reserved.
5267c5 ¤
e467c5 ¤
efaf5a
2e0861 ¤   $Id: TranslatorIDs.h,v 1.3.18.1 1998/11/12 03:06:50 heller Exp $
28f7f7 ____________________________________________________________________________*/
f8af5a
0a7b7d #pragma once
deaf5a
48af5a
4001bf typedef enum TranslatorID
b3bb36 {
be183c ¤   kInvalidTranslatorID = 0,
5a67c5 ¤
9c1d57 ¤   // note: ids must start at 1 and be sequential
bc6ecb ¤   kFirstTranslatorID = 1,
c567c5 ¤
68cb68 ¤   kEncryptTranslatorID = kFirstTranslatorID,
03b5d5 ¤   kSignTranslatorID,
9d014a ¤   kEncryptAndSignTranslatorID,
e567c5 ¤
2f091d ¤   kDecryptTranslatorID,
7f9bfc ¤   kVerifyTranslatorID,
9e67c5 ¤
9f4b42 ¤   kManualSignTranslatorID,
f57e28 ¤   kManualEncryptTranslatorID,
b7d172 ¤   kManualEncryptSignTranslatorID,
c50b66 ¤   kManualDecryptVerifyTranslatorID,
048c2e ¤   kManualAddKeyTranslatorID,
0f67c5 ¤
11ebce #if PGPMIME_KEYS
932ec5 ¤   kAddKeysTranslatorID,
1a7454 #endif
ba67c5 ¤
4bba7e ¤   kLastTranslatorIDPlusOne,
3d67c5 ¤
9d0234 ¤   kPGPNumTranslators¤ = kLastTranslatorIDPlusOne - kFirstTranslatorID
e3519d } TranslatorID;
baaf5a
70af5a
f00263 const SInt16¤   kEncryptIconSuiteID¤¤   ¤   =¤  500;
11317d const SInt16¤   kSignIconSuiteID¤   ¤   ¤   =¤  501;
fca68a const SInt16¤   kAddKeysIconSuiteID¤¤   ¤   =¤  502;¶
--8699 000da110cbf401200a2 Page 1 of TranslatorPrefs.c
a70335 /*____________________________________________________________________________
519c6f ¤   TranslatorPrefs.c
3467c5 ¤
10c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
ba4b0f ¤   All rights reserved.
0767c5 ¤
f967c5 ¤
6caf5a
850280 ¤   $Id: TranslatorPrefs.c,v 1.19.8.1 1998/11/12 03:06:50 heller Exp $
e1f7f7 ____________________________________________________________________________*/
c0324c #include <string.h>
8daf5a
7cb397 #include "PGPOpenPrefs.h"
9d4720 #include "pflPrefTypes.h"
c2c97b #include "pgpClientPrefs.h"
403991 #include "pgpAdminPrefs.h"
7faf5a
f14cfb #include "TranslatorPrefs.h"
2aaf5a
846034 typedef enum ·{ kDummy¤ = 0 } Dummy;
4eaf5a
641b7f typedef struct PrefsStruct
42bb36 {
f302cf ¤   Boolean¤¤   usePGPMimeEncrypt;
8dbd79 ¤   Boolean¤¤   usePGPMimeSign;
8fd835 ¤   Boolean¤¤   doBreakLines;
c73318 ¤   ulong¤  ¤   lineLength;
bd67c5 ¤
a45585 #define kMaxCommentLength¤  69
faa3b1 ¤   char¤   ¤   comment[ kMaxCommentLength + 1];
6e67c5 ¤
bc03be ¤   ulong¤  ¤   encryptionPassphraseCacheSeconds;¤  // 0 means none
45d3e5 ¤   ulong¤  ¤   signingPassphraseCacheSeconds;¤ ¤   // 0 means none
4c67c5 ¤
b79e42 ¤   PGPCipherAlgorithm¤ ¤   ¤   conventionalCipher;
5b67c5 ¤
ec11b7 ¤   PreferredAlgorithmsStruct¤  preferredAlgs;
8a67c5 ¤
c4d25c ¤   // used to ensure we initialize right number of members
ff8ecb ¤   Dummy¤  dummy;
c42d2e } PrefsStruct;
f6d354 static PrefsStruct¤ sPrefs¤ =
19bb36 {
336768 ¤   true,
720c58 ¤   false,
b26768 ¤   true,
e493c8 ¤   78,
14c8d1 ¤   "",
fcd494 ¤   2 * 60,
e8432d ¤   0,
788e4e ¤   kPGPCipherAlgorithm_CAST5,
7b67c5 ¤
d450ba ¤   kDummy
0482f7 };
12af5a
4766dd ¤   static PGPError
20be92 GetAdminComment(
580185 ¤   PGPMemoryMgrRef¤memoryMgr,
906610 ¤   PGPSize¤¤   ¤   commentMax,
888bf7 ¤   char ¤  ¤   ¤   comment[ kMaxCommentLength ] )
cabb36 {
d4cd10 ¤   PGPError¤   err¤= kPGPError_UnknownError;
2c67c5 ¤
7da710 ¤   comment[ 0 ]¤   = '\0';
12de6f #if PGP_BUSINESS_SECURITY¤  // [
1dc7a1 ¤   {
afc5c6 ¤   ¤   PGPPrefRef¤ prefRef;
981b52 ¤   ¤
0c98dd ¤   ¤   err = PGPOpenAdminPrefs( memoryMgr, &prefRef );
9886f8 ¤   ¤   if( IsntPGPError( err ) )
835b34 ¤   ¤   {
dad312 ¤   ¤   ¤   // Comments are not always present. Don't check for errors.
--09bc 000b3ded024401200a2 Page 2 of TranslatorPrefs.c
b2d23e ¤   ¤   ¤   (void) PGPGetPrefStringBuffer( prefRef, kPGPPrefComments,
89e7c9 ¤   ¤   ¤   ¤   ¤   commentMax, comment );
68af5a
b4ad42 ¤   ¤   ¤   (void) PGPClosePrefFile( prefRef );
280fe4 ¤   ¤   }
5e9371 ¤   }
86db21 #else
500eab ¤   (void)memoryMgr;
2beee7 ¤   (void)commentMax;
30c812 #endif¤ // ] PGP_BUSINESS_SECURITY
6faf5a
51deb7 ¤   return( err );
7aefe6 }
aeaf5a
42af5a
0f6d52 ¤   void
cde550 RefreshPrefs( void )
64bb36 {
1603e8 ¤   PGPError¤   ¤   pgpErr;
596efa ¤   PrefsStruct¤¤   prefs¤  = sPrefs;
21ae9e ¤   PGPPrefRef¤ ¤   prefRef;
92f0bf ¤   PGPMemoryMgrRef¤memoryMgr¤  = NULL;
b067c5 ¤
42e4b8 ¤   pgpErr¤ = PGPNewMemoryMgr( 0, &memoryMgr );
6967c5 ¤
99abba ¤   if( IsntPGPError( pgpErr ) )
641fb3 ¤   ¤   pgpErr = PGPOpenClientPrefs( memoryMgr, &prefRef );
a9abba ¤   if( IsntPGPError( pgpErr ) )
31c7a1 ¤   {
c4070d ¤   ¤   PGPBoolean¤ ¤   useCache;
53a9e1 ¤   ¤   PGPBoolean¤ ¤   usePGPMimeEncrypt;
de6445 ¤   ¤   PGPBoolean¤ ¤   usePGPMimeSign;
a9830a ¤   ¤   PGPBoolean¤ ¤   doBreakLines;
ad4466 ¤   ¤   void *¤ ¤   ¤   prefData¤   = NULL;
bb06f7 ¤   ¤   PGPSize¤¤   ¤   prefSize;
239979 ¤   ¤   PGPUInt32¤  ¤   number;
491b52 ¤   ¤
6184d4 ¤   ¤   pgpErr¤ = PGPGetPrefBoolean( prefRef,
120e7b ¤   ¤   ¤   ¤   ¤   kPGPPrefMailEncryptPGPMIME, &usePGPMimeEncrypt );
90ddc4 ¤   ¤   AssertNoErr( pgpErr, "RefreshPrefs" );
b2c342 ¤   ¤   prefs.usePGPMimeEncrypt = usePGPMimeEncrypt;
dc1b52 ¤   ¤
7c84d4 ¤   ¤   pgpErr¤ = PGPGetPrefBoolean( prefRef,
6dcccb ¤   ¤   ¤   ¤   ¤   kPGPPrefMailSignPGPMIME, &usePGPMimeSign );
a1ddc4 ¤   ¤   AssertNoErr( pgpErr, "RefreshPrefs" );
e99e54 ¤   ¤   prefs.usePGPMimeSign = usePGPMimeSign;
d91b52 ¤   ¤
aab561 ¤   ¤   pgpErr¤ = PGPGetPrefBoolean( prefRef,·
0c85a6 ¤   ¤   ¤   ¤   ¤   kPGPPrefDecryptCacheEnable, &useCache );
64ddc4 ¤   ¤   AssertNoErr( pgpErr, "RefreshPrefs" );
2cf07f ¤   ¤   if ( useCache )
2a5b34 ¤   ¤   {
372304 ¤   ¤   ¤   PGPUInt32¤  cacheSeconds;
f487c7 ¤   ¤   ¤
ed8779 ¤   ¤   ¤   pgpErr¤ = PGPGetPrefNumber( prefRef,
cf29b0 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDecryptCacheSeconds, &cacheSeconds );
890576 ¤   ¤   ¤   AssertNoErr( pgpErr, "RefreshPrefs" );
a668fc ¤   ¤   ¤   prefs.encryptionPassphraseCacheSeconds¤ = cacheSeconds;
950fe4 ¤   ¤   }
740e1d ¤   ¤   else
ec5b34 ¤   ¤   {
85d17d ¤   ¤   ¤   prefs.encryptionPassphraseCacheSeconds¤ = 0;
540fe4 ¤   ¤   }
011b52 ¤   ¤
091b52 ¤   ¤
e984d4 ¤   ¤   pgpErr¤ = PGPGetPrefBoolean( prefRef,
26f37c ¤   ¤   ¤   ¤   ¤   kPGPPrefSignCacheEnable, &useCache );
12ddc4 ¤   ¤   AssertNoErr( pgpErr, "RefreshPrefs" );
43f07f ¤   ¤   if ( useCache )
695b34 ¤   ¤   {
ca2304 ¤   ¤   ¤   PGPUInt32¤  cacheSeconds;
b387c7 ¤   ¤   ¤
--336d 00079caa0fa401200a2 Page 3 of TranslatorPrefs.c
3a9e8f ¤   ¤   ¤   pgpErr¤ = PGPGetPrefNumber( prefRef, kPGPPrefSignCacheSeconds,
ae5b1b ¤   ¤   ¤   ¤   ¤   ¤   &cacheSeconds );
0b0576 ¤   ¤   ¤   AssertNoErr( pgpErr, "RefreshPrefs" );
484318 ¤   ¤   ¤   prefs.signingPassphraseCacheSeconds¤= cacheSeconds;
9f0fe4 ¤   ¤   }
b10e1d ¤   ¤   else
625b34 ¤   ¤   {
958bd4 ¤   ¤   ¤   prefs.signingPassphraseCacheSeconds¤= 0;
6a0fe4 ¤   ¤   }
af1b52 ¤   ¤
771b52 ¤   ¤
119605 ¤   ¤   pgpErr¤ = PGPGetPrefBoolean( prefRef, kPGPPrefWordWrapEnable,
2b66ed ¤   ¤   ¤   ¤   ¤   ¤   &doBreakLines );
0fddc4 ¤   ¤   AssertNoErr( pgpErr, "RefreshPrefs" );
6e2184 ¤   ¤   prefs.doBreakLines = doBreakLines;
c11b52 ¤   ¤
3ab516 ¤   ¤   if ( prefs.doBreakLines )
825b34 ¤   ¤   {
318a86 ¤   ¤   ¤   PGPUInt32¤  lineLength;
af87c7 ¤   ¤   ¤
b259ed ¤   ¤   ¤   pgpErr¤ = PGPGetPrefNumber( prefRef, kPGPPrefWordWrapWidth,
00eeba ¤   ¤   ¤   ¤   ¤   ¤   &lineLength );
8e0576 ¤   ¤   ¤   AssertNoErr( pgpErr, "RefreshPrefs" );
058ac5 ¤   ¤   ¤   prefs.lineLength¤   = lineLength;
e30fe4 ¤   ¤   }
180e1d ¤   ¤   else
005b34 ¤   ¤   {
05681a ¤   ¤   ¤   prefs.doBreakLines¤ = true;
19c59a ¤   ¤   ¤   prefs.lineLength¤   = 78;
590fe4 ¤   ¤   }
b2af5a
507bd3 ¤   ¤   pgpErr¤ = GetAdminComment( memoryMgr, sizeof(prefs.comment),
d121ac ¤   ¤   ¤   ¤   ¤   prefs.comment );
6f7a21 ¤   ¤   /* if we couldn't get an admin comment, use our own */
f15e71 ¤   ¤   if( IsPGPError( pgpErr ) || strlen( prefs.comment ) == 0 )
165b34 ¤   ¤   {
0fd312 ¤   ¤   ¤   // Comments are not always present. Don't check for errors.
898795 ¤   ¤   ¤   (void) PGPGetPrefStringBuffer( prefRef, kPGPPrefComment,
52852c ¤   ¤   ¤   ¤   ¤   sizeof( prefs.comment ), prefs.comment );
fc0fe4 ¤   ¤   }
7107d5 ¤   ¤   /* not an error if we don't have a comment */
c2168c ¤   ¤   pgpErr¤ = kPGPError_NoErr;
861b52 ¤   ¤
04d5e4 ¤   ¤   pgpErr¤ = PGPGetPrefNumber( prefRef,
dc2522 ¤   ¤   ¤   ¤   ¤   kPGPPrefPreferredAlgorithm, &number );
500b3f ¤   ¤   if ( IsntPGPError( pgpErr ) )
4a5b34 ¤   ¤   {
037c3e ¤   ¤   ¤   prefs.conventionalCipher¤   = (PGPCipherAlgorithm)number;
0b0fe4 ¤   ¤   }
f40e1d ¤   ¤   else
a15b34 ¤   ¤   {
0b8be7 ¤   ¤   ¤   prefs.conventionalCipher¤   = kPGPCipherAlgorithm_CAST5;
190fe4 ¤   ¤   }
811b52 ¤   ¤
030bc1 ¤   ¤   pgpErr¤ = PGPGetPrefData( prefRef, kPGPPrefAllowedAlgorithmsList,
24c93d ¤   ¤   ¤   ¤   ¤   ¤   &prefSize, &prefData);
bc0b3f ¤   ¤   if ( IsntPGPError( pgpErr ) )
7d5b34 ¤   ¤   {
d56817 ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   numAlgs¤= 0;
f787c7 ¤   ¤   ¤
991191 ¤   ¤   ¤   #define kAlgSize¤   sizeof( prefs.preferredAlgs.algs[ 0 ] )
558a76 ¤   ¤   ¤   #define kMaxAlgs¤   sizeof( prefs.preferredAlgs.algs ) /\
fd82ff ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( prefs.preferredAlgs.algs[ 0 ] )
2f87c7 ¤   ¤   ¤
aa9f85 ¤   ¤   ¤   numAlgs¤= prefSize / kAlgSize;
aed4a5 ¤   ¤   ¤   if ( numAlgs > kMaxAlgs )
c2f776 ¤   ¤   ¤   {
eca5b9 ¤   ¤   ¤   ¤   numAlgs¤= kMaxAlgs;
dba3a6 ¤   ¤   ¤   }
161031 ¤   ¤   ¤   prefs.preferredAlgs.numAlgs¤= numAlgs;
e487c7 ¤   ¤   ¤
79288c ¤   ¤   ¤   pgpCopyMemory( prefData,
--38c2 000a4c7fbb7401200a2 Page 4 of TranslatorPrefs.c
31178a ¤   ¤   ¤   ¤   prefs.preferredAlgs.algs, numAlgs * kAlgSize );
3c87c7 ¤   ¤   ¤
4d004b ¤   ¤   ¤   PGPDisposePrefData( prefRef, prefData );
5c4718 ¤   ¤   ¤   prefData¤   = NULL;
320fe4 ¤   ¤   }
6d0e1d ¤   ¤   else
cc5b34 ¤   ¤   {
3f9015 ¤   ¤   ¤   prefs.preferredAlgs.numAlgs¤= 0;
a40fe4 ¤   ¤   }
20af5a
6df5d0 ¤   ¤   PGPClosePrefFile( prefRef );
449371 ¤   }
f567c5 ¤
0b3c6d ¤   if ( IsntNull( memoryMgr ) )
8fd5fb ¤   ¤   PGPFreeMemoryMgr( memoryMgr );
6067c5 ¤
fefc86 ¤   sPrefs¤ = prefs;
9d1b52 ¤   ¤
044c5c ¤   AssertNoErr( pgpErr, "RefreshPrefs" );
34efe6 }
b7af5a
40af5a
3a33c8 ¤   static void
052e17 RefreshPeriodic( ·)
47bb36 {
c68adc ¤   ulong¤  ¤   ¤   now;
a585ef ¤   static ulong¤   sLastTime¤  = 0;
e571ad ¤   const ulong¤¤   kRefreshSeconds¤= 1;
6167c5 ¤
873248 ¤   GetDateTime( &now );
a947d1 ¤   if ( now - sLastTime >= kRefreshSeconds )
19c7a1 ¤   {
e0cbf0 ¤   ¤   RefreshPrefs( );
9074f0 ¤   ¤   GetDateTime( &sLastTime );
949371 ¤   }
ccefe6 }
51af5a
1faf5a
1e7e69 ¤   Boolean
6786d7 PrefShouldUsePGPMimeEncrypt( ·)
16bb36 {
fc6ba0 ¤   RefreshPeriodic( );
6867c5 ¤
7b4d5d ¤   return( sPrefs.usePGPMimeEncrypt );
d0efe6 }
b7af5a
697e69 ¤   Boolean
0f2415 PrefShouldUsePGPMimeSign( ·)
73bb36 {
886ba0 ¤   RefreshPeriodic( );
5f67c5 ¤
10aac8 ¤   return( sPrefs.usePGPMimeSign );
21efe6 }
e8af5a
4222dc ¤   ulong
0a7b9b PrefGetSigningPassphraseCacheSeconds( ·)
3abb36 {
ffd5e1 ¤   RefreshPeriodic( ·);
1e67c5 ¤
b03f00 ¤   return( sPrefs.signingPassphraseCacheSeconds );
42efe6 }
24af5a
5e22dc ¤   ulong
6e5ac6 PrefGetEncryptionPassphraseCacheSeconds( ·)
3abb36 {
e3d5e1 ¤   RefreshPeriodic( ·);
e267c5 ¤
039634 ¤   return( sPrefs.encryptionPassphraseCacheSeconds );
fbefe6 }
31af5a
ebaf5a
a47e69 ¤   Boolean
--8707 001fe309380401200a2 Page 5 of TranslatorPrefs.c
ba8bbd PrefShouldBreakLines(
fdeab7 ¤   ulong *¤¤   ¤   lineLength )
7bbb36 {
e86ba0 ¤   RefreshPeriodic( );
d067c5 ¤
7f99e3 ¤   *lineLength¤= sPrefs.lineLength;
23f9c9 ¤   return( sPrefs.doBreakLines );
82efe6 }
b5af5a
56af5a
5c7e69 ¤   Boolean
0f6175 PrefGetComment( char comment[ 256 ] )
c5bb36 {
2d1420 ¤   strcpy( comment, sPrefs.comment );
7f67c5 ¤
aac46b ¤   return( comment[ 0 ] != '\0' );
e9efe6 }
16af5a
e6af5a
85af5a
e7df3b ¤   PGPCipherAlgorithm
b3ec57 PrefGetConventionalCipher( void )
2abb36 {
236ba0 ¤   RefreshPeriodic( );
e7af5a
07d0bc ¤   return( sPrefs.conventionalCipher );
37efe6 }
8faf5a
d6af5a
b16d52 ¤   void
cc2b9d PrefGetPreferredAlgorithms( PreferredAlgorithmsStruct *algs )
b9bb36 {
706efd ¤   *algs¤  = sPrefs.preferredAlgs;
9eefe6 }
46af5a
7faf5a
c7af5a
71af5a
9eaf5a
eaaf5a
86af5a
e4af5a
feaf5a
--c806 001f08bc31a401200a3 Page 1 of TranslatorPrefs.h
a70335 /*____________________________________________________________________________
b278c7 ¤   TranslatorPrefs.h
e367c5 ¤
49c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
3f4b0f ¤   All rights reserved.
0567c5 ¤
1c67c5 ¤
dbaf5a
a8739a ¤   $Id: TranslatorPrefs.h,v 1.5.16.1 1998/11/12 03:06:51 heller Exp $
0df7f7 ____________________________________________________________________________*/
aaaf5a
837b7d #pragma once
a6d83c ·
d83379 #ifdef __cplusplus
ac6dad extern "C" {
637454 #endif
0daf5a
211741 typedef struct
73bb36 {
99e6c8 ¤   PGPUInt32¤  ¤   ¤   numAlgs;
e80585 ¤   PGPCipherAlgorithm¤ algs[ 20 ];
03deb7 } PreferredAlgorithmsStruct;
55af5a
edabb6 void¤   ¤   RefreshPrefs( void );
9613fe Boolean¤¤   PrefShouldUsePGPMimeEncrypt( void );
0d755e Boolean¤¤   PrefShouldUsePGPMimeSign( void );
0bacb5 Boolean¤¤   PrefShouldBreakLines( ulong *lineLength );
3eaf5a
98a63d ulong¤  ¤   PrefGetSigningPassphraseCacheSeconds( void );
a5cc18 ulong¤  ¤   PrefGetEncryptionPassphraseCacheSeconds( void );
84af5a
168a07 Boolean¤¤   PrefGetComment( char comment[ 256 ] );
6eaf5a
7f3fec PGPCipherAlgorithm¤ PrefGetConventionalCipher( void );
1caf5a
a997c8 void¤   ¤   PrefGetPreferredAlgorithms( PreferredAlgorithmsStruct *algs );
53af5a
68af5a
0daf5a
8c3379 #ifdef __cplusplus
92efe6 }
f02841 #endif¶
--d5ee 001a80641ae401200a4 Page 1 of TranslatorStrings.h
a70335 /*____________________________________________________________________________
cef691 ¤   TranslatorStrings.h
8167c5 ¤
b3c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
1a4b0f ¤   All rights reserved.
2167c5 ¤
c667c5 ¤
4caf5a
44ebfa ¤   $Id: TranslatorStrings.h,v 1.7.8.1 1998/11/12 03:06:52 heller Exp $
29f7f7 ____________________________________________________________________________*/
ebaf5a
18d83c ·
4faf5a
baaf5a
510ad2 #define kTranslatorStringsRID¤  128¤// STR#
e57353 enum
9cbb36 {
0c4461 ¤   kSelectiveImportPromptStrIndex = 1,
d46ba0 ¤   kSelectiveImportAfterSendPromptStrIndex,
5f67c5 ¤
c3e7c7 ¤   kBeginDecryptedVerifiedMsgStrIndex,
0d3f59 ¤   kEndDecryptedVerifiedMsgStrIndex,
4fce7c ¤   kBeginVerifiedMsgStrIndex,
e99ddc ¤   kEndVerifiedMsgStrIndex
ed82f7 };
09af5a
36af5a
8caf5a
1e7f6b #define kTranslatorErrorStringsResID¤   129¤// STR#
587353 enum
66bb36 {
bc260a ¤   kKeysAddedSuccessfullyStrIndex = 1,
98135e ¤   kKeyAddedSuccessfullyStrIndex,
adf23f ¤   kErrorWhileAddingKeyStrIndex,
873e92 ¤   kMessageIsNotSignedStrIndex,
4edea0 ¤   kMessageIsNotEncryptedStrIndex,
02bd5f ¤   kCantAddKeyAddItInPGPkeysInsteadStrIndex,
f34451 ¤   kNoKeysPresentStrIndex,
67327c ¤   kPleaseEnterSigningPassphraseStrIndex,
536a23 ¤   kPleaseEnterDecryptionPassphraseStrIndex,
9218f7 ¤   kPassphraseInvalidPleaseReenterError,
8af783 ¤   kGenericErrorTemplateString,
85ed55 ¤   kNoDefaultKeyStrIndex,
e07368 ¤   kOutOfMemoryStrIndex,
f76107 ¤   kNoRSAStrIndex,
c667c5 ¤
0b00f3 ¤   kKeyringsNotFoundStrIndex
a882f7 };
--5f8d 0005176686a401200a5 Page 1 of TranslatorUtils.cp
a70335 /*____________________________________________________________________________
d6cebe ¤   TranslatorUtils.cp
9f67c5 ¤
5bc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
824b0f ¤   All rights reserved.
0d67c5 ¤
3267c5 ¤
3baf5a
05aa56 ¤   $Id: TranslatorUtils.cp,v 1.21.2.3.2.1 1998/11/12 03:06:52 heller Exp $
6df7f7 ____________________________________________________________________________*/
704b15 #include <TextUtils.h>
2eb935 #include <Timer.h>
fafeb2 #include <stdio.h>
ac324c #include <string.h>
6e156c #include <FSp_fopen.h>
21af5a
3048c9 #include "emsapi-mac.h"
fd0d08 #include "pgpMem.h"
9385c2 #include "MacStrings.h"
30c110 #include "pgpMacMemory.h"
4a090b #include "MacEvents.h"
81bbf4 #include "MacFiles.h"
212bcf #include "MyMIMEUtils.h"
13034d #include "PluginLibUtils.h"
b7a076 #include "pgpKeys.h"
b476fd #include "TranslatorStrings.h"
bbf8d2 #include "PGPSharedEncryptDecrypt.h"
48af5a
66771f #include "PGPSharedParse.h"
69bbc6 #include "TranslatorUtils.h"
daaf5a
44af5a
7dcd1d #define MIN(a, b )¤ ¤   ( (a) <= (b) ? (a) : (b) )
5faf5a
2eaf5a
3a33d7 ¤   long
e31e40 SignatureDataToEudoraResult( PGPEventSignatureData const *sigData )
29bb36 {
a81293 ¤   long¤   sigResult¤  = EMSC_SIGUNKNOWN;
8867c5 ¤
05c584 ¤   if ( sigData->checked )
80c7a1 ¤   {
e18cb2 ¤   ¤   if ( sigData->verified )
dc8868 ¤   ¤   ¤   sigResult¤  = EMSC_SIGOK;
b90e1d ¤   ¤   else
a68523 ¤   ¤   ¤   sigResult¤  = EMSC_SIGBAD;
3c9371 ¤   }
1d0e24 ¤   else
61c7a1 ¤   {
00c4d0 ¤   ¤   sigResult¤  = EMSC_SIGBAD;
ec9371 ¤   }
5867c5 ¤
1117a2 ¤   return( sigResult );
05efe6 }
54af5a
9eaf5a
09af5a
ddaf5a
5baf5a
e7d140 ¤   static OSErr
60a20e ReadDataForParsing(
d9fbb6 ¤   const FSSpec *¤ spec,
13f253 ¤   Handle *¤   ¤   dataHandlePtr )
4bbb36 {
8e6920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
539f4c ¤   Handle¤ ¤   ¤   dataHandle¤ = nil;
caf3b0 ¤   const ulong¤¤   kMaxData¤   = 1024;
ffaf5a
116690 ¤   dataHandle¤ = pgpNewHandle( kMaxData,
f95911 ¤   ¤   ¤   ¤   ¤   kMacMemory_PreferTempMem | kMacMemory_UseApplicationHeap);
970e7e ¤   if ( IsntNull( dataHandle ) )
51c7a1 ¤   {
--943d 000e476eed8401200a5 Page 2 of TranslatorUtils.cp
f35b41 ¤   ¤   ulong¤  actualSize;
031b52 ¤   ¤
a3a47c ¤   ¤   HLock( dataHandle );
5c14b0 ¤   ¤   err¤= FSpReadBytes( spec, *dataHandle,
51f778 ¤   ¤   ¤   ¤   GetHandleSize( dataHandle ), &actualSize );
c25829 ¤   ¤   HUnlock( dataHandle );
e91b52 ¤   ¤
f91451 ¤   ¤   AssertNoErr( err, "ReadDataForParsing" );
2ed798 ¤   ¤   if ( IsntErr( err ) )
bf5b34 ¤   ¤   {
ffc3dd ¤   ¤   ¤   SetHandleSize( dataHandle, actualSize );
530fe4 ¤   ¤   }
410e1d ¤   ¤   else
3c5b34 ¤   ¤   {
520982 ¤   ¤   ¤   DisposeHandle( dataHandle );
393dec ¤   ¤   ¤   dataHandle¤ = nil;
730fe4 ¤   ¤   }
eb9371 ¤   }
2f0e24 ¤   else
0dc7a1 ¤   {
e73dca ¤   ¤   err¤= memFullErr;
979371 ¤   }
0b67c5 ¤
ea2839 ¤   *dataHandlePtr¤ = dataHandle;
6a67c5 ¤
a5deb7 ¤   return( err );
80efe6 }
25af5a
5baf5a
a3af5a
b6af5a
baeacd ¤   OSErr
725934 ParseFileForMIMEType(
5ef251 ¤   const FSSpec *¤ ¤   spec,
bc7490 ¤   emsMIMETypeHandle *¤typeHandlePtr )
26bb36 {
31bbd6 ¤   Handle¤ text¤   = nil;
317adb ¤   OSErr¤  err¤¤   = noErr;
83af5a
992f51 ¤   err¤= ReadDataForParsing( spec, &text );
f867c5 ¤
685ecc ¤   if ( IsntErr( err ) )
d1c7a1 ¤   {
b20828 ¤   ¤   ParseMIMEType( text, typeHandlePtr);
6c95be ¤   ¤   DisposeHandle( text );
641b52 ¤   ¤
e12020 ¤   ¤   if ( IsNull( *typeHandlePtr ) )
4a4f66 ¤   ¤   ¤   err¤= paramErr;
cb9371 ¤   }
0667c5 ¤
aedeb7 ¤   return( err );
10efe6 }
cbaf5a
73af5a
00eacd ¤   OSErr
67b633 CopyFileToFileRef(
fe0185 ¤   PGPMemoryMgrRef¤memoryMgr,
54b91c ¤   const FSSpec *¤ fileToCopy,
b6c1a4 ¤   short¤  ¤   ¤   destFileRef)
4fc7a1 ¤   {
4a8e70 ¤   OSErr¤  err¤= noErr;
96d4d5 ¤   short¤  srcFileRef;
a567c5 ¤
30153f ¤   err¤= FSpOpenDF( fileToCopy, fsRdPerm, &srcFileRef );
465ecc ¤   if ( IsntErr( err ) )
9ec7a1 ¤   {
f36cdc ¤   ¤   long¤   eof;
56766a ¤   ¤   long¤   curPos;
9e87c7 ¤   ¤   ¤
64654d ¤   ¤   err¤= GetEOF( srcFileRef, &eof );
78d798 ¤   ¤   if ( IsntErr( err ) )
e45b34 ¤   ¤   {
--0bc9 000c2cabc86401200a5 Page 3 of TranslatorUtils.cp
e885a4 ¤   ¤   ¤   err¤= GetFPos( destFileRef, &curPos );
800fe4 ¤   ¤   }
e91b52 ¤   ¤
c0d798 ¤   ¤   if ( IsntErr( err ) )
835b34 ¤   ¤   {
f30627 ¤   ¤   ¤   err¤= FSCopyBytes( memoryMgr, srcFileRef, 0, destFileRef,·
99644e ¤   ¤   ¤   ¤   ¤   ¤   curPos, eof );
dc0fe4 ¤   ¤   }
0d67c5 ¤
59dc8c ¤   ¤   FSClose( srcFileRef );
4c9371 ¤   }
2e67c5 ¤
c7deb7 ¤   return( err );
899371 ¤   }
5baf5a
97af5a
4caf5a
66af5a
12af5a
60af5a
025c98 #if PGP_DEBUG
0b6d52 ¤   void
7488db DebugCopyToRAMDisk(
452f6d ¤   PGPMemoryMgrRef¤¤   memoryMgr,
047519 ¤   const FSSpec *¤ ¤   inSpec,
00d6f1 ¤   ConstStr255Param¤   name )
1ebb36 {
6b8640 ¤   FSSpec¤ copySpec;
df4351 ¤   OSErr¤  err;
6364e6 ¤   Str255¤ tempString;
a867c5 ¤
067bc5 ¤   CopyPString( "\pRAM Disk:", tempString );
116520 ¤   AppendPString( name, tempString );
8567c5 ¤
35bb1b ¤   err¤= FSMakeFSSpec( 0, 0, tempString, &copySpec );
9628a4 ¤   if ( IsntErr( err ) || err == fnfErr )
b9c7a1 ¤   {
3b4257 ¤   ¤   (void)FSpDelete( &copySpec );
e6e6b5 ¤   ¤   err¤= FSpCopyFiles( memoryMgr, inSpec, &copySpec );
011b40 ¤   ¤   FSpChangeFileType( &copySpec, 'TEXT' );
499371 ¤   }
1eefe6 }
f97454 #endif
5caf5a
e6af5a
28af5a
03af5a
9aaf5a
2baf5a
c30335 /*____________________________________________________________________________
d8dac2 ¤   'addresses' as supplied by Eudora consists of an array of StringHandles
66d9f1 ¤   that come in groups of three. ·Each group consists of
b5728a ¤   ¤   { "user@host.domain", "user", "full user name" }
8a1b52 ¤   ¤
7f6c9c ¤   The last two entries may be null and the list terminates when a
6dbcf4 ¤   first item is null.
71f7f7 ____________________________________________________________________________*/
f12473 ¤   static OSStatus
9f684b CreateRecipientList(
f85515 ¤   const StringHandle **¤  addresses,
1773ce ¤   PGPRecipientSpec **¤¤   recipientsOut,
0f0b4d ¤   PGPUInt32 *¤¤   ¤   ¤   numFound )
77bb36 {
6f9739 ¤   PGPRecipientSpec *¤ recipients¤ ¤   = nil;
b2f421 ¤   PGPError¤   ¤   ¤   err¤= noErr;
cb59f0 ¤   const ushort¤   ¤   kClumpSize = 3;
fbd527 ¤   ulong¤  ¤   ¤   ¤   curGroupIndex¤  = kClumpSize;¤  // skip from:
2867c5 ¤
cbff96 ¤   *recipientsOut¤ = nil;
01f5c9 ¤   *numFound¤  ¤   = 0;
8d67c5 ¤
c27be8 ¤   while ( true )
--01b5 000ccddda5c401200a5 Page 4 of TranslatorUtils.cp
f7c7a1 ¤   {
3487d9 ¤   ¤   StringHandle¤   userNameHandle;
0d829b ¤   ¤   char¤   ¤   ¤   userName[ sizeof( Str255 ) ];
d59404 ¤   ¤   char¤   ¤   ¤   userNameRevised[ 256 ];
921b52 ¤   ¤
ca7cb5 ¤   ¤   userNameHandle¤ = (*addresses)[ curGroupIndex ];
ce0cda ¤   ¤   if ( IsNull( userNameHandle ) )
4d519f ¤   ¤   ¤   break;¤ // all done
dd1b52 ¤   ¤
ce574f ¤   ¤   PToCString( *userNameHandle, userName );
6dcae4 ¤   ¤   if ( userName[ 0 ] == '\0' )
fd519f ¤   ¤   ¤   break;¤ // all done
121b52 ¤   ¤
736245 ¤   ¤   // add <> around the user name
8b537c ¤   ¤   pgpFormatStr( userNameRevised, sizeof( userNameRevised ),
29ad04 ¤   ¤   ¤   false, "<%s>", userName );
2687c7 ¤   ¤   ¤
80f0e9 ¤   ¤   *numFound¤  ¤   += 1;
c81b52 ¤   ¤
2a54d1 ¤   ¤   if ( IsNull( recipients ) )
0c5b34 ¤   ¤   {
7a5142 ¤   ¤   ¤   recipients¤ = (PGPRecipientSpec *)pgpAlloc( sizeof( recipients[ 0 ]¶
920270 ·) );
749184 ¤   ¤   ¤   if ( IsNull( recipients ) )
c58396 ¤   ¤   ¤   ¤   err¤= memFullErr;
890fe4 ¤   ¤   }
880e1d ¤   ¤   else
545b34 ¤   ¤   {
9b55ed ¤   ¤   ¤   err¤= pgpRealloc( &recipients,
622848 ¤   ¤   ¤   ¤   ¤   *numFound * sizeof( recipients[ 0 ] ) );
130fe4 ¤   ¤   }
e08cf4 ¤   ¤   if ( IsErr( err ) )
6acdcb ¤   ¤   ¤   break;
971b52 ¤   ¤
bb86f4 ¤   ¤   pgpClearMemory( &recipients[ *numFound - 1 ], sizeof( recipients[ 0 ] )¶
7454c8 ·);
6e1b52 ¤   ¤
73a4a4 ¤   ¤   recipients[ *numFound - 1 ].type = kPGPRecipientSpecType_UserID;
e91b52 ¤   ¤
22cb7a ¤   ¤   CopyCString( userNameRevised, recipients[ *numFound - 1 ].u.userIDStr );
881b52 ¤   ¤
fc855d ¤   ¤   curGroupIndex¤  += kClumpSize;
649371 ¤   }
8c67c5 ¤
071946 ¤   if ( IsErr( err ) && IsntNull( recipients ) )
dfc7a1 ¤   {
a7a349 ¤   ¤   pgpFree( recipients );
2e7864 ¤   ¤   recipients¤ = nil;
6b9371 ¤   }
4667c5 ¤
b867c5 ¤
13e331 ¤   *recipientsOut¤ = recipients;
1667c5 ¤
dfdeb7 ¤   return( err );
efefe6 }
adaf5a
d7af5a
810335 /*____________________________________________________________________________
2e1935 ¤   Get a list of recipients, interacting with the user if necessary.
3a67c5 ¤
b50190 ¤   'addresses' is as passed from Eudora. ·
dcfd20 ¤   Don't prompt the user if we can find all the keys for the addresses.
9df7f7 ____________________________________________________________________________*/
d1af5a
8e85b7 ¤   CComboError
14e2fe GetRecipientList(
459a06 ¤   PGPContextRef¤  ¤   ¤   context,
1f5175 ¤   PGPtlsContextRef¤   ¤   tlsContext,
835515 ¤   const StringHandle **¤  addresses,
18760e ¤   PGPKeySetRef¤   ¤   ¤   allKeys,
944026 ¤   Boolean¤¤   ¤   ¤   ¤   isPGPMime,
cca911 ¤   PGPKeySetRef *¤ ¤   ¤   recipientsOut,
--e7ec 000b41aa0c2401200a5 Page 5 of TranslatorUtils.cp
c85a18 ¤   PGPRecipientSettings *¤ settingsPtr,¤   // may be pre-set to something)
f55c65 ¤   PGPKeySetRef *¤ ¤   ¤   keysToAdd
2818aa ¤   )¤
f3bb36 {
11add8 ¤   CComboError¤¤   ¤   err;
b6ffd8 ¤   PGPRecipientSpec *¤ recipientSpecs¤ = nil;
b44d01 ¤   PGPKeySetRef¤   ¤   keysOut¤= kInvalidPGPKeySetRef;
e403df ¤   Boolean¤¤   ¤   ¤   haveRecipients¤ = false;
5c245e ¤   PGPUInt32¤  ¤   ¤   numFound = 0;
6867c5 ¤
8c522e ¤   pgpAssert( IsntNull( recipientsOut ) );
1d59cc ¤   pgpAssert( IsntNull( keysToAdd ) );
a1a949 ¤   *recipientsOut¤ = kInvalidPGPKeySetRef;
9540d9 ¤   *keysToAdd¤ = kInvalidPGPKeySetRef;
7aff7b ¤   // signing flag may be set already
5467c5 ¤
d9700a ¤   if ( IsntNull( addresses ) )
f1c7a1 ¤   {
ee8eb0 ¤   ¤   err.err¤= CreateRecipientList( addresses, &recipientSpecs, &numFound );
8c9371 ¤   }
9667c5 ¤
2bed80 ¤   if ( err.IsntError() )
dac7a1 ¤   {
742250 ¤   ¤   PGPKeySetRef¤   ¤   newKeys;
418cb4 ¤   ¤   PGPRecipientOptions¤dialogOptions = kPGPRecipientOptionsHideFileOptions;
f51b52 ¤   ¤
6324b5 ¤   ¤   if ( ! isPGPMime )
265b34 ¤   ¤   {
c99035 ¤   ¤   ¤   dialogOptions |= kPGPRecipientOptionsShowFYEO;
800fe4 ¤   ¤   }
e21b52 ¤   ¤
14bae6 ¤   ¤   if( ( GetModifiers() & shiftKey ) != 0 )
f05b34 ¤   ¤   {
668e55 ¤   ¤   ¤   dialogOptions |= kPGPRecipientOptionsAlwaysShowDialog;
780fe4 ¤   ¤   }
071b52 ¤   ¤
92e24f ¤   ¤   err.pgpErr¤ = PGPClientRecipientDialog( context, tlsContext,
cfd116 ¤   ¤   ¤   ¤   ¤   allKeys, numFound, recipientSpecs,
ff3d74 ¤   ¤   ¤   ¤   ¤   dialogOptions, *settingsPtr, settingsPtr,
73cfb3 ¤   ¤   ¤   ¤   ¤   &keysOut, &newKeys );
df1b52 ¤   ¤
8266c7 ¤   ¤   if ( IsntNull( recipientSpecs ) )
2f5b34 ¤   ¤   {
6e3930 ¤   ¤   ¤   pgpFree( recipientSpecs );
899c68 ¤   ¤   ¤   recipientSpecs¤ = NULL;
f20fe4 ¤   ¤   }
1e1b52 ¤   ¤
c5f9a8 ¤   ¤   if ( err.IsntError() )
1b5b34 ¤   ¤   {
c64000 ¤   ¤   ¤   if( PGPKeySetRefIsValid( newKeys ) )
e3f776 ¤   ¤   ¤   {
ed81f8 ¤   ¤   ¤   ¤   *keysToAdd¤ = newKeys;
c9a3a6 ¤   ¤   ¤   }
6487c7 ¤   ¤   ¤
d24c3e ¤   ¤   ¤   *recipientsOut¤ = keysOut;
c40fe4 ¤   ¤   }
8e9371 ¤   }
e367c5 ¤
5bdeb7 ¤   return( err );
f8efe6 }
54af5a
66af5a
a533d7 ¤   long
489719 CComboErrorToEudoraError( CComboError & err )
debb36 {
d04f19 ¤   long¤   emsrErr¤= EMSR_OK;
e767c5 ¤
19ed80 ¤   if ( err.IsntError() )
f2f847 ¤   ¤   return( EMSR_OK );
1a1b52 ¤   ¤
f2ab09 ¤   if ( err.err != noErr )
b4c7a1 ¤   {
--5ef7 000ca612bc4401200a5 Page 6 of TranslatorUtils.cp
a6bc93 ¤   ¤   switch( err.err )
b15b34 ¤   ¤   {
b2ea7e ¤   ¤   ¤   default:¤   ¤   ¤   ¤   emsrErr¤= EMSR_UNKNOWN_FAIL;¤   break;
a0a0e9 ¤   ¤   ¤   case userCanceledErr:¤  emsrErr¤= EMSR_ABORTED;¤¤   ¤   break;
0e0fe4 ¤   ¤   }
309371 ¤   }
ed3b93 ¤   else if ( err.pgpErr != noErr )
cec7a1 ¤   {
0ac592 ¤   ¤   switch( err.pgpErr )
ae5b34 ¤   ¤   {
b3a01f ¤   ¤   ¤   default:¤   ¤   ¤   ¤   ¤   emsrErr¤= EMSR_UNKNOWN_FAIL;¤   break;
849ac6 ¤   ¤   ¤   case kPGPError_UserAbort:¤  emsrErr¤= EMSR_ABORTED;¤¤   ¤   break;
cb0fe4 ¤   ¤   }
809371 ¤   }
a767c5 ¤
b63e74 ¤   return( emsrErr );
90efe6 }
97af5a
3baf5a
58af5a
29af5a
a5af5a
2aaf5a
36af5a
d6eacd ¤   OSErr
9aa778 FSpReadFileIntoBuffer(
17f251 ¤   const FSSpec *¤ ¤   spec,
a6decd ¤   void **¤¤   ¤   ¤   bufferOut,
7e4420 ¤   ulong *¤¤   ¤   ¤   bufferSizeOut )
4ebb36 {
1375f8 ¤   OSStatus¤   err¤= noErr;
3646a8 ¤   void *¤ ¤   buffer¤ = nil;
bb5de2 ¤   ulong¤  ¤   bufferSize = 0;
3867c5 ¤
5c7313 ¤   err¤= FSpGetForkSizes( spec, &bufferSize, nil );
495ecc ¤   if ( IsntErr( err ) )
aec7a1 ¤   {
239eca ¤   ¤   buffer¤ = pgpAllocMac( bufferSize,
7490fc ¤   ¤   ¤   ¤   ¤   kMacMemory_PreferTempMem |
23aeb3 ¤   ¤   ¤   ¤   ¤   kMacMemory_UseCurrentHeap);
57709c ¤   ¤   if ( IsntNull( buffer ) )
485b34 ¤   ¤   {
da4f03 ¤   ¤   ¤   err¤= FSpReadBytes( spec, buffer, bufferSize, &bufferSize );
3f21aa ¤   ¤   ¤   if ( IsErr( err ) )
7af776 ¤   ¤   ¤   {
4f1b79 ¤   ¤   ¤   ¤   pgpFreeMac( buffer );
d20ddf ¤   ¤   ¤   ¤   buffer¤ = nil;
a5a3a6 ¤   ¤   ¤   }
cf0fe4 ¤   ¤   }
1e0e1d ¤   ¤   else
c85b34 ¤   ¤   {
dcb49e ¤   ¤   ¤   err¤= memFullErr;
f80fe4 ¤   ¤   }
ed9371 ¤   }
b167c5 ¤
4ffcd4 ¤   *bufferOut¤ ¤   = buffer;
8b60c9 ¤   *bufferSizeOut¤ = bufferSize;
2bb7d0 ¤   AssertNoErr( err, "ParsePGPMimeSignedMessage" );
8f67c5 ¤
d6deb7 ¤   return( err );
d4efe6 }
4aaf5a
4faf5a
48af5a
c5af5a
686d52 ¤   void
6703ea MyGetIndCString(
fc7c3e ¤   ushort¤ whichString,
028699 ¤   char *¤ theString )
04bb36 {
52d81e ¤   GetIndCString( theString, kTranslatorStringsRID, whichString );
caefe6 }
--3f6a 0005514872d401200a5 Page 7 of TranslatorUtils.cp
e0af5a
1aaf5a
0633c8 ¤   static void
457be9 GetIndPString(
8ca291 ¤   ushort¤ ¤   whichString,
2df35a ¤   StringPtr¤  theString )
4bbb36 {
d144cb ¤   GetIndString( theString, kTranslatorStringsRID, whichString );
f4efe6 }
88af5a
a9af5a
6f831b ¤   StringHandle
e2e616 GetIndStringHandle(
ccdc29 ¤   ushort¤ ¤   whichString)
0dbb36 {
0eb0ca ¤   Str255¤ theString;
e867c5 ¤
67ffcc ¤   GetIndPString( whichString, theString );
db67c5 ¤
46e61c ¤   return( NewString( theString ) );
2aefe6 }
05af5a
14af5a
4baf5a
b1af5a
c30335 /*____________________________________________________________________________
1eaa62 ¤   Eliminate the stuff we dont want from the file. Typically:
0d8fdb ¤   ¤   MIME Version: 1.0
3c45af ¤   ¤   Content-Type: "text/plain"
526c11 ··____________________________________________________________________________*/
10eacd ¤   OSErr
837380 EliminateMIMEHeader( const FSSpec *spec )
4abb36 {
ac8e70 ¤   OSErr¤  err¤= noErr;
31835f ¤   void *¤ buffer;
812841 ¤   ulong¤  bufferSize;
6c67c5 ¤
212232 ¤   err¤= FSpReadFileIntoBuffer( spec, &buffer, &bufferSize );
f35ecc ¤   if ( IsntErr( err ) )
0bc7a1 ¤   {
54b0b9 ¤   ¤   const uchar¤¤   kContentType[]¤ = "\pContent-Type:";
242e63 ¤   ¤   const char *¤   start;
781b52 ¤   ¤
429c97 ¤   ¤   start¤  = FindMatchingBytes( (const char *)buffer, bufferSize,
1a0864 ¤   ¤   ¤   ¤   ¤   (const char *)&kContentType[ 1 ],
534977 ¤   ¤   ¤   ¤   ¤   StrLength( kContentType ) );
4372fd ¤   ¤   if ( IsntNull( start ) )
0e5b34 ¤   ¤   {
660988 ¤   ¤   ¤   const char *¤   last¤   =
a80a87 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ((const char *)buffer) + bufferSize - 1;
be6e69 ¤   ¤   ¤   const char *¤   cur;
02e1ef ¤   ¤   ¤   short¤  ¤   ¤   fileRef;
094b09 ¤   ¤   ¤   ulong¤  ¤   ¤   skipBytes;
1d7226 ¤   ¤   ¤   char¤   ¤   ¤   prevChar = 0;
55f5d6 ¤   ¤   ¤   Boolean¤¤   ¤   haveSeenBlankLine = FALSE;
6587c7 ¤   ¤   ¤
3b7679 ¤   ¤   ¤   // skip until we find a blank line
2237fc ¤   ¤   ¤   cur¤= start;
6ae5aa ¤   ¤   ¤   while ( cur <= last )
05f776 ¤   ¤   ¤   {
c5660a ¤   ¤   ¤   ¤   char¤   curChar = *cur;
d72b85 ¤   ¤   ¤   ¤
7be2c3 ¤   ¤   ¤   ¤   if ( curChar == '\r' )
3572c3 ¤   ¤   ¤   ¤   {
62824e ¤   ¤   ¤   ¤   ¤   if( prevChar == '\r' || prevChar == '\n' )
e04859 ¤   ¤   ¤   ¤   ¤   {
cd9216 ¤   ¤   ¤   ¤   ¤   ¤   haveSeenBlankLine = TRUE;
fa1c89 ¤   ¤   ¤   ¤   ¤   }
372613 ¤   ¤   ¤   ¤   }
6b302d ¤   ¤   ¤   ¤   else if( curChar == '\n' )
4c72c3 ¤   ¤   ¤   ¤   {
55fc8f ¤   ¤   ¤   ¤   ¤   if( prevChar == '\n' )
--03f1 001ef430f9b401200a5 Page 8 of TranslatorUtils.cp
e04859 ¤   ¤   ¤   ¤   ¤   {
839216 ¤   ¤   ¤   ¤   ¤   ¤   haveSeenBlankLine = TRUE;
c11c89 ¤   ¤   ¤   ¤   ¤   }
242613 ¤   ¤   ¤   ¤   }
80e2a6 ¤   ¤   ¤   ¤   else if( haveSeenBlankLine )
3372c3 ¤   ¤   ¤   ¤   {
5d14c3 ¤   ¤   ¤   ¤   ¤   break;
7e2613 ¤   ¤   ¤   ¤   }
332b85 ¤   ¤   ¤   ¤
b53f6e ¤   ¤   ¤   ¤   prevChar = curChar;
c48651 ¤   ¤   ¤   ¤   ++cur;
0fa3a6 ¤   ¤   ¤   }
ce87c7 ¤   ¤   ¤
a58170 ¤   ¤   ¤   // figure out how many bytes are left...
e33be3 ¤   ¤   ¤   skipBytes¤  = cur - (const char *)buffer;
e40d43 ¤   ¤   ¤   pgpAssert( skipBytes <= bufferSize );
5e87c7 ¤   ¤   ¤
dd9ed6 ¤   ¤   ¤   // and overwrite the file with only the desired bytes
e291b3 ¤   ¤   ¤   err¤= FSpOpenDF( spec, fsRdWrPerm, &fileRef );
c3e090 ¤   ¤   ¤   if ( IsntErr( err ) )
3cf776 ¤   ¤   ¤   {
de8eab ¤   ¤   ¤   ¤   long¤   count;
2c2b85 ¤   ¤   ¤   ¤
9139c5 ¤   ¤   ¤   ¤   SetEOF( fileRef, 0 );
e82b85 ¤   ¤   ¤   ¤
b41604 ¤   ¤   ¤   ¤   count¤  = bufferSize - skipBytes;
8b185d ¤   ¤   ¤   ¤   err¤¤   = FSWrite( fileRef, &count,
517a65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ((const char *)buffer) + skipBytes );
dd8a1c ¤   ¤   ¤   ¤   FSClose( fileRef );
18a3a6 ¤   ¤   ¤   }
160fe4 ¤   ¤   }
a7af5a
18c302 ¤   ¤   pgpFreeMac( buffer );
fe9371 ¤   }
6867c5 ¤
16deb7 ¤   return( err );
efefe6 }
--c7b2 000443716c1401200a6 Page 1 of TranslatorUtils.h
a70335 /*____________________________________________________________________________
a4ca37 ¤   TranslatorUtils.h
8567c5 ¤
4cc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
1e4b0f ¤   All rights reserved.
5867c5 ¤
9267c5 ¤
f2af5a
956109 ¤   $Id: TranslatorUtils.h,v 1.13.2.1.2.1 1998/11/12 03:06:53 heller Exp $
7df7f7 ____________________________________________________________________________*/
537b7d #pragma once
96af5a
cf6276 #include "EudoraTypes.h"
d5af5a
73675a #include "pgpTypes.h"
f2af5a
ba76f0 #include "CComboError.h"
0faf5a
769f63 #include "pgpEncode.h"
fcb6e8 #include "PGPclientLib.h"
95af5a
1e3379 #ifdef __cplusplus
3c6dad extern "C" {
087454 #endif
c1af5a
6caf5a
b2af5a
61af5a
ca92e2 /* we use this to see if we've already processed a message
384a81 when Eudora calls CanTranslate file */
222804 const uchar¤kPGPAlreadyProcessedParamName[]¤¤   = "\pPGPProcessed";
5dd889 const uchar¤kPGPAlreadyProcessedParamValue[]¤   = "\pyes";
b4af5a
9b87c7 ¤   ¤   ¤
a187c7 ¤   ¤   ¤
970773 long¤   SignatureDataToEudoraResult( PGPEventSignatureData const *sigData );
1caf5a
0eaf5a
611044 OSErr¤  ParseFileForMIMEType( const FSSpec *spec,
aab379 ¤   ¤   ¤   emsMIMETypeHandle *typeHandlePtr );
11af5a
b0af5a
14af5a
b9af5a
c35ced OSErr¤  CopyFileToFileRef( PGPMemoryMgrRef¤ memoryMgr,
8bff2e ¤   ¤   ¤   const FSSpec * fileToCopy, short destFileRef );
bdaf5a
9aae30 ¤   ¤   ¤   ¤   ¤
95ae30 ¤   ¤   ¤   ¤   ¤
9a5c98 #if PGP_DEBUG
4b7477 ¤   void¤   DebugCopyToRAMDisk( PGPMemoryMgrRef memoryMgr, const FSSpec *spec,
048e96 ¤   ¤   ¤   ¤   ¤   ConstStr255Param name );
f0db21 #else
ac87fc ¤   #define DebugCopyToRAMDisk( memoryMgr, spec, name )
ac7454 #endif
a9af5a
eeaf5a
62af5a
508916 OSErr¤  FSpReadFileIntoBuffer( const FSSpec * spec,
37b0aa ¤   ¤   ¤   void ** bufferOut, ulong *¤ ·bufferSizeOut );
70af5a
b4af5a
cec3f3 void¤   ¤   ¤   MyGetIndCString( ushort whichString, char *theString );
88a6ba StringHandle¤   GetIndStringHandle( ushort whichString );
dbaf5a
10af5a
cf5024 long¤   ¤   ¤   CComboErrorToEudoraError( CComboError &err );
6baf5a
e3af5a
90af5a
338b65 OSErr¤  EliminateMIMEHeader( const FSSpec *spec );
44af5a
--90bb 0014e0812eb401200a6 Page 2 of TranslatorUtils.h
e0af5a
1aaf5a
11c2e3 CComboError¤GetRecipientList( PGPContextRef context,
c55f64 ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
801ba8 ¤   ¤   ¤   ¤   const StringHandle ** addresses,
c363f1 ¤   ¤   ¤   ¤   PGPKeySetRef allKeys,
2df28f ¤   ¤   ¤   ¤   Boolean isPGPMime,
4a3f60 ¤   ¤   ¤   ¤   PGPKeySetRef * keySet,
cc874c ¤   ¤   ¤   ¤   PGPRecipientSettings *¤ settings,
075aae ¤   ¤   ¤   ¤   PGPKeySetRef *¤ keyToAdd);
34af5a
23af5a
eaaf5a
58af5a
ef3379 #ifdef __cplusplus
5eefe6 }
4e2841 #endif¶
--227a 0017d166159401200a7 Page 1 of usertrans.h
6ec77f /* =====================================================
7bde7b ··
ba44d8 ···Eudora Extended Message Services API SDK 1.0b3 (July 12, 1996)
bd493c ···This SDK supports EMSAPI version 1
81826f ···Copyright 1995, 1996 QUALCOMM Inc.
e3856d ···Send comments and questions to <emsapi-info@qualcomm.com>
00e8c6 ···
401821 ···Template for definitions supplied by translator to component manager.
35e8c6 ···
9681f3 ···This file should be modified by the translator writer
add5c1 ···to tell the component manager a couple of things it needs
a24105 ···to know about the translator itself. In general the component
c6b6dd ···manager interface is indepedent of the translator characteristics,
c4e7f1 ···but these details are needed:
d7e8c6 ···
b39323 ···* The sizeof the globals structure - because the component manager
60ecf9 ·····manages this block of storage
f0e8c6 ···
8cf100 ···* Which entry points are implemented - because we use the component
8ea628 ·····manager to determine which translation API functions are implemented.
02e8c6 ···
652dab ···This requires emsapi-mac.h (include it before you include this file)
c07fe0 */
507b7d #pragma once
1eaf5a
6b371e #include <Components.h>
b9af5a
fd0975 /* ----------------------------------------------------------------------
bcca3e ····Declaration of structure for global storage that is shared
08fe4a ····between all translator functions. ·A handle to this is passed
a6cb9a ····in as the first argument for all entry points. Allocation of this
678f7f ····is taken care of by the component manager.
69869e ····
71495d ·*/
4969fc typedef¤struct¤ emsUserGlobalsS
73bb36 {
f3cf97 ¤   Component¤  ¤   self;¤  ¤   ¤   ¤   ¤   ¤   // Required!
5167c5 ¤
f51482 ¤   void *¤ ¤   ¤   myGlobals;
b967d0 } emsUserGlobals;
1eaf5a
f4af5a
c40975 /* ----------------------------------------------------------------------
ad9127 ···Defines indicating whether or not a translator supplies a
d8ab63 ···function or not. ·The Eudora uses these via the component manager
1725d3 ···to determine whether these functions should be called or not.
cd495d ·*/
579a86 //**** SET FLAGS FOR FUNCTIONS SUPPLIED BY YOUR TRANSLATOR HERE
76b15a // AND DELETE THIS LINE
3bec7e #define EMS_HAS_PLUGIN_VERSION ·····true /* Required */
f1e25a #define EMS_HAS_PLUGIN_INIT ········true /* Required */
138951 #define EMS_HAS_TRANSLATOR_INFO ····true /* Required */
471fd4 #define EMS_HAS_CAN_TRANSLATE_FILE ·true·
ed31c6 #define EMS_HAS_CAN_TRANSLATE_BUF ··false
92f4c7 #define EMS_HAS_TRANSLATE_FILE ·····true
db29cf #define EMS_HAS_TRANSLATE_BUF ······false ·
fe5d29 #define EMS_HAS_PLUGIN_FINISH ······true /* Required */
11af5a
7daf5a
--b2c9 000cc7985b0401200a8 Page 1 of CAdminDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
149bfa ¤   $Id: CAdminDialog.cp,v 1.50.2.1.2.1 1998/11/12 03:06:57 heller Exp $
bff7f7 ____________________________________________________________________________*/
29af5a
757b32 #include <PP_KeyCodes.h>
58dd56 #include <PP_Messages.h>
e017f9 #include <UReanimator.h>
714119 #include <LMultiPanelView.h>
c77c09 #include <LEditText.h>
a18708 #include <LCheckBox.h>
a4775b #include <LTextEditView.h>
7a7304 #include <LScrollerView.h>
d6af5a
f18c8c #include "MacDesktop.h"
25bbf4 #include "MacFiles.h"
6e6915 #include "MacResources.h"
e685c2 #include "MacStrings.h"
79af5a
c5894b #include "pgpFileSpec.h"
d04720 #include "pflPrefTypes.h"
df3991 #include "pgpAdminPrefs.h"
914919 #include "pgpUtilities.h"
2db397 #include "PGPOpenPrefs.h"
69c97b #include "pgpClientPrefs.h"
329dc2 #include "CWarningAlert.h"
d2a02f #include "pgpClientLib.h"
60af5a
990bb4 #include "CString.h"
ae043a #include "CTempFile.h"
7efca7 #include "CPanel.h"
acaf5a
6778bc #include "PGPadminGlobals.h"
456ff8 #include "CKeyTable.h"
1e5d7a #include "CAdminDialog.h"
8aaf5a
860b95 const ResIDT¤   RidL_Dialog¤¤   ¤   ¤   ¤   ¤   =¤  128;
26af5a
0366af const ResIDT¤   ppob_CompanyName¤   ¤   ¤   ¤   =¤  2000;
9996d7 const ResIDT¤   ppob_AdminWizardDescription¤¤   =¤  2100;
8d8485 const ResIDT¤   ppob_ADKDescription¤¤   ¤   ¤   =¤  2200;
f268b2 const ResIDT¤   ppob_UseIncomingADK¤¤   ¤   ¤   =¤  2300;
8ad6a5 const ResIDT¤   ppob_ChooseIncomingADK¤ ¤   ¤   =¤  2400;
da1056 const ResIDT¤   ppob_UseOutgoingADK¤¤   ¤   ¤   =¤  2500;
10cf65 const ResIDT¤   ppob_ChooseOutgoingADK¤ ¤   ¤   =¤  2600;
cf4ae3 const ResIDT¤   ppob_UsePGPdiskADK¤ ¤   ¤   ¤   =¤  2650;
3e8a5f const ResIDT¤   ppob_ChoosePGPdiskADK¤  ¤   ¤   =¤  2655;
89b6a1 const ResIDT¤   ppob_EnforceADKs¤   ¤   ¤   ¤   =¤  2700;
90f9c0 const ResIDT¤   ppob_PassphraseMinimums¤¤   ¤   =¤  2800;
823720 const ResIDT¤   ppob_CorporateKeyOptions¤   ¤   =¤  2900;
d12b61 const ResIDT¤   ppob_ChooseCorporateKey¤¤   ¤   =¤  3000;
5b43a0 const ResIDT¤   ppob_UseDesignatedRevoker¤  ¤   =¤  3050;
cb9851 const ResIDT¤   ppob_ChooseDesignatedRevoker¤   =¤  3060;
433dbb const ResIDT¤   ppob_KeyGenerationOptions¤  ¤   =¤  3100;
9385f5 const ResIDT¤   ppob_ChooseDefaultKeys¤ ¤   ¤   =¤  3200;
0531a2 const ResIDT¤   ppob_AutoUpdating¤  ¤   ¤   ¤   =¤  3300;
abda05 const ResIDT¤   ppob_MiscOptions¤   ¤   ¤   ¤   =¤  3400;
bf9a28 const ResIDT¤   ppob_Summary¤   ¤   ¤   ¤   ¤   =¤  3500;
3c8e29 const ResIDT¤   ppob_CopyClientPrefs¤   ¤   ¤   =¤  3600;
a464e8 const ResIDT¤   ppob_ChooseInstaller¤   ¤   ¤   =¤  3700;
f83d70 const ResIDT¤   ppob_SaveInstaller¤ ¤   ¤   ¤   =¤  3800;
65e89e const ResIDT¤   ppob_Finished¤  ¤   ¤   ¤   ¤   =¤  3900;
49af5a
4d22af const PaneIDT¤  button_Next¤¤   ¤   ¤   ¤   ¤   =¤  1000;
7727e8 const PaneIDT¤  button_Previous¤¤   ¤   ¤   ¤   =¤  1001;
a85d72 const PaneIDT¤  button_Quit¤¤   ¤   ¤   ¤   ¤   =¤  1002;
753aab const PaneIDT¤  pane_MultiPanel¤¤   ¤   ¤   ¤   =¤  1003;
ccaf5a
--52cf 00054550331401200a8 Page 2 of CAdminDialog.cp
e1af0d const PaneIDT¤  pane_CompanyName¤   ¤   ¤   =¤  2000;
e5d1a0 const PaneIDT¤  edittext_CompanyName¤   ¤   =¤  2001;
3baf5a
b51cd9 const PaneIDT¤  pane_UseIncomingADK¤¤   ¤   ¤   =¤  2300;
690fe3 const PaneIDT¤  checkbox_UseIncomingADK¤¤   ¤   =¤  2301;
83af5a
d5a2ce const PaneIDT¤  pane_ChooseIncomingADK¤ ¤   ¤   =¤  2400;
f374c9 const PaneIDT¤  table_IncomingADK¤  ¤   ¤   ¤   =¤  2401;
f8af5a
26643d const PaneIDT¤  pane_UseOutgoingADK¤¤   ¤   ¤   =¤  2500;
d70484 const PaneIDT¤  checkbox_UseOutgoingADK¤¤   ¤   =¤  2501;
55af5a
0bbb0e const PaneIDT¤  pane_ChooseOutgoingADK¤ ¤   ¤   =¤  2600;
d04bba const PaneIDT¤  table_OutgoingADK¤  ¤   ¤   ¤   =¤  2601;
18af5a
1d3e88 const PaneIDT¤  pane_UsePGPdiskADK¤ ¤   ¤   ¤   =¤  2650;
c6362d const PaneIDT¤  checkbox_UsePGPdiskADK¤ ¤   ¤   =¤  2651;
35af5a
1efe34 const PaneIDT¤  pane_ChoosePGPdiskADK¤  ¤   ¤   =¤  2655;
a9ac08 const PaneIDT¤  table_PGPdiskADK¤   ¤   ¤   ¤   =¤  2656;
bcaf5a
3c350b const PaneIDT¤  pane_EnforceADKs¤   ¤   ¤   ¤   ¤   ¤   =¤  2700;
6bedfd const PaneIDT¤  checkbox_EnforceIncomingADK¤¤   ¤   ¤   =¤  2701;
e141e5 const PaneIDT¤  checkbox_EnforceOutgoingADK¤¤   ¤   ¤   =¤  2702;
37a6cc const PaneIDT¤  checkbox_EnforceRemoteADKStrictness¤¤   =¤  2703;
abaf5a
85c806 const PaneIDT¤  pane_PassphraseMinimums¤¤   ¤   ¤   ¤   ¤   =¤  2800;
63f84c const PaneIDT¤  checkbox_EnforceMinimumPassphraseCharacters¤=¤  2801;
d9e7dc const PaneIDT¤  edittext_MinimumPassphraseCharacters¤   ¤   =¤  2802;
9189f3 const PaneIDT¤  checkbox_EnforceMinimumPassphraseQuality¤   =¤  2803;
799662 const PaneIDT¤  edittext_MinimumPassphraseQuality¤  ¤   ¤   =¤  2804;
96af5a
5037a0 const PaneIDT¤  pane_CorporateKeyOptions¤   ¤   ¤   ¤   =¤  2900;
8d43fd const PaneIDT¤  checkbox_AutoSignCorporateKey¤  ¤   ¤   =¤  2901;
883e40 const PaneIDT¤  checkbox_CorporateKeyIsMetaIntroducer¤  =¤  2902;
eea568 const PaneIDT¤  checkbox_WarnIfNotSignedByCorporateKey¤ =¤  2903;
6faf5a
a25f0a const PaneIDT¤  pane_ChooseCorporateKey¤¤   ¤   =¤  3000;
5f223c const PaneIDT¤  table_CorporateKey¤ ¤   ¤   ¤   =¤  3001;
e7af5a
eb6f6c const PaneIDT¤  pane_UseDesignatedRevoker¤  ¤   ¤   ¤   =¤  3050;
5c058d const PaneIDT¤  checkbox_EnableADesignatedRevokerKey¤   =¤  3051;
2daf5a
978d3b const PaneIDT¤  pane_ChooseDesignatedRevoker¤   ¤   ¤   =¤  3060;
600373 const PaneIDT¤  table_DesignatedRevoker¤¤   ¤   ¤   ¤   =¤  3061;
68af5a
2149d0 const PaneIDT¤  pane_KeyGenerationOptions¤  ¤   =¤  3100;
535902 const PaneIDT¤  checkbox_AllowKeyGeneration¤¤   =¤  3101;
955c04 const PaneIDT¤  checkbox_AllowRSAKeyGeneration¤ =¤  3102;
1580ba const PaneIDT¤  edittext_MinimumKeySize¤¤   ¤   =¤  3103;
98af5a
98f19e const PaneIDT¤  pane_ChooseDefaultKeys¤ ¤   ¤   =¤  3200;
197380 const PaneIDT¤  table_DefaultKeys¤  ¤   ¤   ¤   =¤  3201;
5aaf5a
4fc2ed const PaneIDT¤  pane_AutoUpdating¤  ¤   ¤   ¤   ¤   =¤  3300;
0f7eff const PaneIDT¤  checkbox_UpdateAllKeys¤ ¤   ¤   ¤   =¤  3301;
606c33 const PaneIDT¤  edittext_UpdateAllKeys¤ ¤   ¤   ¤   =¤  3302;
a05f7c const PaneIDT¤  checkbox_UpdateTrustedIntroducers¤  =¤  3303;
a62ed1 const PaneIDT¤  edittext_UpdateTrustedIntroducers¤  =¤  3304;
ecaf5a
d72222 const PaneIDT¤  pane_MiscOptions¤   ¤   ¤   ¤   ¤   ¤   =¤  3400;
17ed0b const PaneIDT¤  checkbox_AllowConventionalEncryption¤   =¤  3401;
c1e5ee const PaneIDT¤  edittext_MessageHeaderComment¤  ¤   ¤   =¤  3402;
48af5a
a0ee43 const PaneIDT¤  pane_Summary¤   ¤   ¤   ¤   ¤   =¤  3500;
1e01d7 const PaneIDT¤  texteditview_Summary¤   ¤   ¤   =¤  3501;
eeaae8 const PaneIDT¤  scroller_Summary¤   ¤   ¤   ¤   =¤  3502;
e8af5a
9ffa42 const PaneIDT¤  pane_CopyClientPrefs¤   ¤   ¤   =¤  3600;
1e7a0f const PaneIDT¤  checkbox_CopyClientPrefs¤   ¤   =¤  3601;
38af5a
541083 const PaneIDT¤  pane_ChooseInstaller¤   ¤   ¤   =¤  3700;
--0889 000fd51c1eb401200a8 Page 3 of CAdminDialog.cp
5f7891 const PaneIDT¤  button_ChooseInstaller¤ ¤   ¤   =¤  3701;
2c4fbb const PaneIDT¤  statictext_Installer¤   ¤   ¤   =¤  3702;
38af5a
01491b const PaneIDT¤  pane_SaveInstaller¤ ¤   ¤   ¤   =¤  3800;
ccaf5a
919cf5 const PaneIDT¤  pane_Finished¤  ¤   ¤   ¤   ¤   =¤  3900;
d5af5a
7a73f4 enum {
a7dec3 ¤   panel_CompanyName¤  ¤   ¤   =¤  1,
b5ee5a ¤   panel_AdminWizardDescription,
14afc2 ¤   panel_ADKDescription,
d83d08 ¤   panel_UseIncomingADK,
79b728 ¤   panel_ChooseIncomingADK,
549b4c ¤   panel_UseOutgoingADK,
32116c ¤   panel_ChooseOutgoingADK,
27113e ¤   panel_EnforceADKs,
259452 ¤   panel_UsePGPdiskADK,
a1cc3c ¤   panel_ChoosePGPdiskADK,
7c5d6b ¤   panel_PassphraseMinimums,
b53584 ¤   panel_CorporateKeyOptions,
c159a7 ¤   panel_ChooseCorporateKey,
6a2e57 ¤   panel_UseDesignatedRevoker,
166dca ¤   panel_ChooseDesignatedRevoker,
b39f55 ¤   panel_KeyGenerationOptions,
07bbc1 ¤   panel_ChooseDefaultKeys,
80e818 ¤   panel_AutoUpdating,
f48170 ¤   panel_MiscOptions,
36ef90 ¤   panel_Summary,
28235e ¤   panel_CopyClientPrefs,
ed3b4b ¤   panel_ChooseInstaller,
7aa7dc ¤   panel_SaveInstaller,
ef7e04 ¤   panel_Finished,
43af5a
6dbef3 ¤   panel_First¤¤   ¤   ¤   ¤   ¤   =¤  panel_CompanyName,
375d31 ¤   panel_Last¤ ¤   ¤   ¤   ¤   ¤   =¤  panel_Finished
4f82f7 };
15af5a
f6af5a
80d149 const MessageT¤ msg_Next¤   ¤   ¤   ¤   ¤   =¤  button_Next;
2e143d const MessageT¤ msg_Previous¤   ¤   ¤   ¤   =¤  button_Previous;
2eb633 const MessageT¤ msg_IncomingADKTable¤   ¤   =¤  table_IncomingADK;
227704 const MessageT¤ msg_OutgoingADKTable¤   ¤   =¤  table_OutgoingADK;
3292e3 const MessageT¤ msg_PGPdiskADKTable¤¤   ¤   =¤  table_PGPdiskADK;
ea7bd6 const MessageT¤ msg_AutoSignCorporateKey¤   =¤  checkbox_AutoSignCorporateKey;
0ab002 const MessageT¤ msg_CorporateKeyTable¤  ¤   =¤  table_CorporateKey;
4a074d const MessageT¤ msg_DesignatedRevokerTable¤ =¤  table_DesignatedRevoker;
02a2ac const MessageT¤ msg_AllowKeyGeneration¤ ¤   =¤  checkbox_AllowKeyGeneration;
e2399a const MessageT¤ msg_ChooseInstaller¤¤   ¤   =¤  button_ChooseInstaller;
64271b const MessageT¤ msg_UpdateAllKeys¤  ¤   ¤   =¤  checkbox_UpdateAllKeys;
6ef26f const MessageT¤ msg_UpdateTrustedIntroducers
dfa81c ¤   ¤   ¤   ¤   ¤   ¤   ¤   =¤  checkbox_UpdateTrustedIntroducers;
3b28f6 const MessageT¤ msg_EnforceMinimumPassphraseCharacters¤
c9bff2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   =¤  checkbox_EnforceMinimumPassphraseCharacters;
c478e8 const MessageT¤ msg_EnforceMinimumPassphraseQuality
a66f0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   =¤  checkbox_EnforceMinimumPassphraseQuality;
15af5a
deaf5a
9faf5a
7a10c8 const SInt16¤   kMinimumPassphraseCharacters¤   ¤   ¤   =¤  3;
6d38a3 const SInt16¤   kMaximumPassphraseCharacters¤   ¤   ¤   =¤  255;
038681 const SInt16¤   kMinimumPassphraseQuality¤  ¤   ¤   ¤   =¤  20;
3d193a const SInt16¤   kMaximumPassphraseQuality¤  ¤   ¤   ¤   =¤  100;
c683c0 const SInt16¤   kMinimumKeySize¤¤   ¤   ¤   ¤   ¤   ¤   =¤  768;
4e150e const SInt16¤   kMaximumKeySize¤¤   ¤   ¤   ¤   ¤   ¤   =¤  4096;
b2e136 const SInt16¤   kMaximumRSAKeySize¤ ¤   ¤   ¤   ¤   ¤   =¤  2048;
a61a1d const SInt16¤   kMinimumDaysBeforeUpdate¤   ¤   ¤   ¤   =¤  1;
79d589 const SInt16¤   kMaximumDaysBeforeUpdate¤   ¤   ¤   ¤   =¤  999;
dcaf5a
35e2b4 const OSType¤   kPGPInstallerType¤  ¤   ¤   ¤   ¤   ¤   =¤  'APPL';
b9055a const OSType¤   kPGPInstallerCreator¤   ¤   ¤   ¤   ¤   =¤  'VIS3';
418603 const OSType¤   kPrefFileType¤  ¤   ¤   ¤   ¤   ¤   ¤   =¤  'pref';
fdf980 const OSType¤   kPGPKeysCreator¤¤   ¤   ¤   ¤   ¤   ¤   =¤  'pgpK';
--d6bc 000417e259a401200a8 Page 4 of CAdminDialog.cp
e0af5a
1ca754 const ResType¤  kAdminResType¤  ¤   ¤   ¤   ¤   ¤   ¤   =¤  'ADMN';
ad5838 const ResIDT¤   ADMN_AdminPrefs¤¤   ¤   ¤   ¤   ¤   ¤   =¤  5001;
cf7bfc const ResIDT¤   ADMN_ClientPrefs¤   ¤   ¤   ¤   ¤   ¤   =¤  5002;
20af5a
560869 const ResType¤  kTextResType¤   ¤   =¤  'TEXT';
0aa13b const ResIDT¤   TEXT_EasyInstall¤   =¤  1001;
f4af5a
2daf5a
27af5a
87af5a
02e3e7 extern PGPContextRef¤   gPGPContext;
baaf5a
63af5a
629b31 CAdminDialog::CAdminDialog(
06cbb0 ¤   LStream *¤  inStream)
fc83cc ¤   ¤   : LGADialog(inStream), mDirty(false)
9cbb36 {
9fefe6 }
d6af5a
6cd7d9 CAdminDialog::~CAdminDialog()
39bb36 {
f9efe6 }
feaf5a
916d52 ¤   void
3ef100 CAdminDialog::FinishCreateSelf()
f8bb36 {
02893a ¤   LGADialog::FinishCreateSelf();
6e67c5 ¤
49816a ¤   // Listen to controls
b0f2c7 ¤   UReanimator::LinkListenerToControls(this, this, RidL_Dialog);
c167c5 ¤
ea67ac ¤   // Add panels to view
58f5ec ¤   LMultiPanelView *¤  multiPanel = (LMultiPanelView *)
d264af ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(pane_MultiPanel);
1167c5 ¤
51c947 ¤   multiPanel->AddPanel(¤  ppob_CompanyName,
b8b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
701fcc ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_CompanyName);
acc102 ¤   multiPanel->AddPanel(¤  ppob_AdminWizardDescription,
d1b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
dad425 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_AdminWizardDescription);
66ad22 ¤   multiPanel->AddPanel(¤  ppob_ADKDescription,
07b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
e042ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_ADKDescription);
773fe8 ¤   multiPanel->AddPanel(¤  ppob_UseIncomingADK,
f2b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
b12b2a ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_UseIncomingADK);
d58d39 ¤   multiPanel->AddPanel(¤  ppob_ChooseIncomingADK,
cfb34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
b1a80f ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_ChooseIncomingADK);
1999ac ¤   multiPanel->AddPanel(¤  ppob_UseOutgoingADK,
11b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
142fac ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_UseOutgoingADK);
702b7d ¤   multiPanel->AddPanel(¤  ppob_ChooseOutgoingADK,
41b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
66ac89 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_ChooseOutgoingADK);
766470 ¤   multiPanel->AddPanel(¤  ppob_UsePGPdiskADK,
a4b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
7453a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_UsePGPdiskADK);
6d06b7 ¤   multiPanel->AddPanel(¤  ppob_ChoosePGPdiskADK,
edb34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
d24653 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_ChoosePGPdiskADK);
fa17bf ¤   multiPanel->AddPanel(¤  ppob_EnforceADKs,
8ab34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
fb64d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_EnforceADKs);
4c5c59 ¤   multiPanel->AddPanel(¤  ppob_PassphraseMinimums,
71b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
d77fd8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_PassphraseMinimums);
e62714 ¤   multiPanel->AddPanel(¤  ppob_CorporateKeyOptions,
e8b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
41e6f6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_CorporateKeyOptions);
--fe9b 0008bdaa8b8401200a8 Page 5 of CAdminDialog.cp
835895 ¤   multiPanel->AddPanel(¤  ppob_ChooseCorporateKey,
3cb34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
4573bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_ChooseCorporateKey);
cebacc ¤   multiPanel->AddPanel(¤  ppob_UseDesignatedRevoker,
37b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
fc4f01 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_UseDesignatedRevoker);
3ab328 ¤   multiPanel->AddPanel(¤  ppob_ChooseDesignatedRevoker,
1bb34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
b6497f ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_ChooseDesignatedRevoker);
360bce ¤   multiPanel->AddPanel(¤  ppob_KeyGenerationOptions,
d4b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
eb6ca2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_KeyGenerationOptions);
f781d0 ¤   multiPanel->AddPanel(¤  ppob_ChooseDefaultKeys,
c0b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
b3d2cc ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_ChooseDefaultKeys);
467d9f ¤   multiPanel->AddPanel(¤  ppob_AutoUpdating,
b4b34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
f24617 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_AutoUpdating);
6487f1 ¤   multiPanel->AddPanel(¤  ppob_MiscOptions,
ccb34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
92cf3f ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_MiscOptions);
d2b665 ¤   multiPanel->AddPanel(¤  ppob_Summary,
fdb34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
e04afb ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_Summary);
29c452 ¤   multiPanel->AddPanel(¤  ppob_CopyClientPrefs,
cdb34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
9967c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_CopyClientPrefs);
4fdc47 ¤   multiPanel->AddPanel(¤  ppob_ChooseInstaller,
8bb34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
0120f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_ChooseInstaller);
9f57fe ¤   multiPanel->AddPanel(¤  ppob_SaveInstaller,
6cb34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
d63ee1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_SaveInstaller);
86de7f ¤   multiPanel->AddPanel(¤  ppob_Finished,
0ab34a ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
e37f20 ¤   ¤   ¤   ¤   ¤   ¤   ¤   panel_Finished);
28ed9a ¤   multiPanel->CreateAllPanels();
bb67c5 ¤
308be2 ¤   // Listen to panel broadcasters
e86ec9 ¤   ((LCheckBox *) FindPaneByID(
5f1393 ¤   ¤   checkbox_EnforceMinimumPassphraseCharacters))->AddListener(this);
026ec9 ¤   ((LCheckBox *) FindPaneByID(
003c22 ¤   ¤   checkbox_EnforceMinimumPassphraseQuality))->AddListener(this);
696ec9 ¤   ((LCheckBox *) FindPaneByID(
add48e ¤   ¤   checkbox_AutoSignCorporateKey))->AddListener(this);
746ec9 ¤   ((LCheckBox *) FindPaneByID(
49694a ¤   ¤   checkbox_AllowKeyGeneration))->AddListener(this);
4a6ec9 ¤   ((LCheckBox *) FindPaneByID(
24c88a ¤   ¤   checkbox_UpdateAllKeys))->AddListener(this);
f96ec9 ¤   ((LCheckBox *) FindPaneByID(
25ed3e ¤   ¤   checkbox_UpdateTrustedIntroducers))->AddListener(this);
506ec9 ¤   ((LCheckBox *) FindPaneByID(
7d5175 ¤   ¤   button_ChooseInstaller))->AddListener(this);
4eaf5a
4a9948 ¤   // Hide RSA key generation on RSA only builds
98f7ef ¤   PGPError¤   pgpErr;
c1bb31 ¤   PGPBoolean¤ rsaSupported;
9867c5 ¤
5c335b ¤   pgpErr = PGPRSASupported(&rsaSupported);
f24c85 ¤   PGPThrowIfPGPErr_(pgpErr);
7d67c5 ¤
2c7beb ¤   if (! rsaSupported) {
3a470f ¤   ¤   FindPaneByID(checkbox_AllowRSAKeyGeneration)->Hide();
389371 ¤   }
f3af5a
7bff8d ¤   // Set up tables
b12245 ¤   PGPFilterRef¤   filter;
d51ab8 ¤   CKeyTable *¤¤   theTable;
c267c5 ¤
14eca2 ¤   pgpErr = PGPNewKeyEncryptAlgorithmFilter(
edbe71 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext,·
8b20e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPublicKeyAlgorithm_ElGamal,
--7272 000ff3cae83401200a8 Page 6 of CAdminDialog.cp
c507d1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &filter);
5e4c85 ¤   PGPThrowIfPGPErr_(pgpErr);
9767c5 ¤
4a5915 ¤   // Increase the ref count so that we can use the same filter for three
397787 ¤   // tables
4148f9 ¤   pgpErr = PGPIncFilterRefCount(filter);
264c85 ¤   PGPThrowIfPGPErr_(pgpErr);
3748f9 ¤   pgpErr = PGPIncFilterRefCount(filter);
234c85 ¤   PGPThrowIfPGPErr_(pgpErr);
f367c5 ¤
91012a ¤   theTable = (CKeyTable *) FindPaneByID(table_IncomingADK);
7afd54 ¤   theTable->SetTableInfo(filter, false);
ee4b71 ¤   theTable->AddListener(this);
ed67c5 ¤
ab05ac ¤   theTable = (CKeyTable *) FindPaneByID(table_OutgoingADK);
467ce9 ¤   theTable->SetTableInfo(kInvalidPGPFilterRef, false);
7a4b71 ¤   theTable->AddListener(this);
7c093f ¤   theTable = (CKeyTable *) FindPaneByID(table_PGPdiskADK);
47fd54 ¤   theTable->SetTableInfo(filter, false);
374b71 ¤   theTable->AddListener(this);
5105ba ¤   theTable = (CKeyTable *) FindPaneByID(table_CorporateKey);
a07ce9 ¤   theTable->SetTableInfo(kInvalidPGPFilterRef, false);
ce4b71 ¤   theTable->AddListener(this);
5d6338 ¤   theTable = (CKeyTable *) FindPaneByID(table_DesignatedRevoker);
99fd54 ¤   theTable->SetTableInfo(filter, false);
054b71 ¤   theTable->AddListener(this);
8c7be9 ¤   theTable = (CKeyTable *) FindPaneByID(table_DefaultKeys);
fa92db ¤   theTable->SetTableInfo(kInvalidPGPFilterRef, true);
7867c5 ¤
67e500 ¤   // Set panel targets
2d605d ¤   ((CPanel *) FindPaneByID(pane_CompanyName))->SetPanelTarget(
3eae36 ¤   ¤   (LEditText *) FindPaneByID(edittext_CompanyName));
ee8cdd ¤   ((CPanel *) FindPaneByID(pane_KeyGenerationOptions))->SetPanelTarget(
7b7018 ¤   ¤   (LEditText *) FindPaneByID(edittext_MinimumKeySize));
333e7c ¤   ((CPanel *) FindPaneByID(pane_MiscOptions))->SetPanelTarget(
ddaf89 ¤   ¤   (LEditText *) FindPaneByID(edittext_MessageHeaderComment));
42af5a
9d2067 ¤   multiPanel->SwitchToPanel(panel_First);
f7efe6 }
5faf5a
456d52 ¤   void
aacc0f CAdminDialog::ListenToMessage(
5c7b08 ¤   MessageT¤   inMessage,
d6121e ¤   void *¤ ¤   ioParam)
93bb36 {
d228bb ¤   (void) ioParam;
a667c5 ¤
39e0ab ¤   switch (inMessage) {
ec5686 ¤   ¤   case msg_Cancel:
555b34 ¤   ¤   {
20262a ¤   ¤   ¤   ObeyCommand(cmd_Quit, nil);
db0fe4 ¤   ¤   }
d52f68 ¤   ¤   break;
c3af5a
61c353 ¤   ¤   case msg_Next:
545b34 ¤   ¤   {
edd85c ¤   ¤   ¤   if (VerifyEditFieldValues()) {
9a43e1 ¤   ¤   ¤   ¤   LMultiPanelView *¤  multiPanel = (LMultiPanelView *)·
21fa3d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(pane_MultiPanel);
1a919f ¤   ¤   ¤   ¤   SInt16¤ ¤   ¤   ¤   currentPanel = multiPanel->
38687a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetCurrentIndex();
82531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
119c76 ¤   ¤   ¤   ¤   if (currentPanel != panel_SaveInstaller) {
5595a4 ¤   ¤   ¤   ¤   ¤   currentPanel++;
ebae30 ¤   ¤   ¤   ¤   ¤
32882e ¤   ¤   ¤   ¤   ¤   // Skip the unneeded panes
001da8 ¤   ¤   ¤   ¤   ¤   if (((currentPanel == panel_ChooseIncomingADK)
7c1ed3 ¤   ¤   ¤   ¤   ¤   && (! ((LCheckBox *)
adbb3b ¤   ¤   ¤   ¤   ¤   FindPaneByID(checkbox_UseIncomingADK))->
054704 ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On))
a222fd ¤   ¤   ¤   ¤   ¤   || ((currentPanel == panel_ChooseOutgoingADK)
ff1ed3 ¤   ¤   ¤   ¤   ¤   && (! ((LCheckBox *)
--a2d8 0003089d0f5401200a8 Page 7 of CAdminDialog.cp
cc2503 ¤   ¤   ¤   ¤   ¤   FindPaneByID(checkbox_UseOutgoingADK))->
254704 ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On))
f7e73b ¤   ¤   ¤   ¤   ¤   || ((currentPanel == panel_ChoosePGPdiskADK)
c31ed3 ¤   ¤   ¤   ¤   ¤   && (! ((LCheckBox *)
23964c ¤   ¤   ¤   ¤   ¤   FindPaneByID(checkbox_UsePGPdiskADK))->
df4704 ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On))
269b91 ¤   ¤   ¤   ¤   ¤   || ((currentPanel == panel_ChooseCorporateKey)
bd1ed3 ¤   ¤   ¤   ¤   ¤   && (! ((LCheckBox *)
5f5006 ¤   ¤   ¤   ¤   ¤   FindPaneByID(checkbox_AutoSignCorporateKey))->
1d4704 ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On))
930e37 ¤   ¤   ¤   ¤   ¤   || ((currentPanel == panel_ChooseDesignatedRevoker)
de1ed3 ¤   ¤   ¤   ¤   ¤   && (! ((LCheckBox *)
190941 ¤   ¤   ¤   ¤   ¤   FindPaneByID(checkbox_EnableADesignatedRevokerKey))->
057a9c ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On))) {
9950f1 ¤   ¤   ¤   ¤   ¤   ¤   currentPanel++;
9f1c89 ¤   ¤   ¤   ¤   ¤   }
580364 ¤   ¤   ¤   ¤   ¤   if (currentPanel == panel_EnforceADKs) {
6d36d4 ¤   ¤   ¤   ¤   ¤   ¤   if (((LCheckBox *)
2a6112 ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(checkbox_UseIncomingADK))->
8c4489 ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On) {
01d647 ¤   ¤   ¤   ¤   ¤   ··¤ ¤   FindPaneByID(checkbox_EnforceIncomingADK)->
885d9d ¤   ¤   ¤   ¤   ¤   ··¤ ¤   ¤   Enable();
8c9b1e ¤   ¤   ¤   ¤   ¤   ··¤ } else {
86d647 ¤   ¤   ¤   ¤   ¤   ··¤ ¤   FindPaneByID(checkbox_EnforceIncomingADK)->
160259 ¤   ¤   ¤   ¤   ¤   ··¤ ¤   ¤   Disable();
e4c4ba ¤   ¤   ¤   ¤   ¤   ··¤ }
3736d4 ¤   ¤   ¤   ¤   ¤   ¤   if (((LCheckBox *)
deff2a ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(checkbox_UseOutgoingADK))->
6f4489 ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On) {
7c377d ¤   ¤   ¤   ¤   ¤   ··¤ ¤   FindPaneByID(checkbox_EnforceOutgoingADK)->
775d9d ¤   ¤   ¤   ¤   ¤   ··¤ ¤   ¤   Enable();
fe9b1e ¤   ¤   ¤   ¤   ¤   ··¤ } else {
00377d ¤   ¤   ¤   ¤   ¤   ··¤ ¤   FindPaneByID(checkbox_EnforceOutgoingADK)->
a00259 ¤   ¤   ¤   ¤   ¤   ··¤ ¤   ¤   Disable();
90c4ba ¤   ¤   ¤   ¤   ¤   ··¤ }
411c89 ¤   ¤   ¤   ¤   ¤   }
cdae30 ¤   ¤   ¤   ¤   ¤
128157 ¤   ¤   ¤   ¤   ¤   // Update summary panel
b2241c ¤   ¤   ¤   ¤   ¤   if (currentPanel == panel_Summary) {
47db3c ¤   ¤   ¤   ¤   ¤   ¤   UpdateSummaryPane();
f61c89 ¤   ¤   ¤   ¤   ¤   }
290230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
1d3c1d ¤   ¤   ¤   ¤   ¤   // Show the new panel
440227 ¤   ¤   ¤   ¤   ¤   multiPanel->SwitchToPanel(currentPanel);
21ae30 ¤   ¤   ¤   ¤   ¤
ca06f4 ¤   ¤   ¤   ¤   ¤   // Adjust the buttons
aab7b1 ¤   ¤   ¤   ¤   ¤   LPane *¤¤   buttonNext = FindPaneByID(button_Next);
25a329 ¤   ¤   ¤   ¤   ¤   CKeyTable *¤theTable = nil;
c6ae30 ¤   ¤   ¤   ¤   ¤
36887a ¤   ¤   ¤   ¤   ¤   switch (currentPanel) {
df5399 ¤   ¤   ¤   ¤   ¤   ¤   case panel_ChooseIncomingADK:
1b8fec ¤   ¤   ¤   ¤   ¤   ¤   {
d806dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   theTable = (CKeyTable *)
da5de5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(table_IncomingADK);
6fdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
e400eb ¤   ¤   ¤   ¤   ¤   ¤   break;
cd94aa ¤   ¤   ¤   ¤   ¤   ¤
7494aa ¤   ¤   ¤   ¤   ¤   ¤
6bf5dd ¤   ¤   ¤   ¤   ¤   ¤   case panel_ChooseOutgoingADK:
e08fec ¤   ¤   ¤   ¤   ¤   ¤   {
3306dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   theTable = (CKeyTable *)
025963 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(table_OutgoingADK);
35db3c ¤   ¤   ¤   ¤   ¤   ¤   }
f100eb ¤   ¤   ¤   ¤   ¤   ¤   break;
4794aa ¤   ¤   ¤   ¤   ¤   ¤
1294aa ¤   ¤   ¤   ¤   ¤   ¤
8bdf19 ¤   ¤   ¤   ¤   ¤   ¤   case panel_ChoosePGPdiskADK:
c38fec ¤   ¤   ¤   ¤   ¤   ¤   {
2f06dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   theTable = (CKeyTable *)
ad3381 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(table_PGPdiskADK);
78db3c ¤   ¤   ¤   ¤   ¤   ¤   }
3000eb ¤   ¤   ¤   ¤   ¤   ¤   break;
--697d 000143687c7401200a8 Page 8 of CAdminDialog.cp
e0af5a
1aaf5a
b36f4c ¤   ¤   ¤   ¤   ¤   ¤   case panel_ChooseCorporateKey:
a08fec ¤   ¤   ¤   ¤   ¤   ¤   {
8206dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   theTable = (CKeyTable *)
213b1d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(table_CorporateKey);
0bdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
6200eb ¤   ¤   ¤   ¤   ¤   ¤   break;
d094aa ¤   ¤   ¤   ¤   ¤   ¤
e22aed ¤   ¤   ¤   ¤   ¤   ¤   case panel_ChooseDesignatedRevoker:
828fec ¤   ¤   ¤   ¤   ¤   ¤   {
d706dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   theTable = (CKeyTable *)
045b90 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(table_DesignatedRevoker);
2ddb3c ¤   ¤   ¤   ¤   ¤   ¤   }
e500eb ¤   ¤   ¤   ¤   ¤   ¤   break;
a194aa ¤   ¤   ¤   ¤   ¤   ¤
3d339e ¤   ¤   ¤   ¤   ¤   ¤   case panel_ChooseInstaller:
ac8fec ¤   ¤   ¤   ¤   ¤   ¤   {
008fe0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString¤descriptor;
4b531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
5b6a0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(statictext_Installer)->
6d163f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetDescriptor(descriptor);
be14d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (descriptor.GetLength() == 0) {
f60580 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   buttonNext->Disable();
d7079f ¤   ¤   ¤   ¤   ¤   ¤   ¤   } else {
8bbcea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   buttonNext->Enable();
eb5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
42db3c ¤   ¤   ¤   ¤   ¤   ¤   }
1e00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
f91c89 ¤   ¤   ¤   ¤   ¤   }
b61708 ¤   ¤   ¤   ¤   ¤   if (theTable != nil) {
87a425 ¤   ¤   ¤   ¤   ¤   ¤   if (theTable->GetFirstSelectedCell().IsNullCell()) {
fe14a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   buttonNext->Disable();
193af7 ¤   ¤   ¤   ¤   ¤   ¤   } else {
9412eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   buttonNext->Enable();
01db3c ¤   ¤   ¤   ¤   ¤   ¤   }
121c89 ¤   ¤   ¤   ¤   ¤   }
91449b ¤   ¤   ¤   ¤   ¤   FindPaneByID(button_Previous)->Enable();
4c5ecd ¤   ¤   ¤   ¤   ¤   if (currentPanel == panel_SaveInstaller) {
540595 ¤   ¤   ¤   ¤   ¤   ¤   buttonNext->SetDescriptor(CString(STRx_AdminStrings,
525241 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSaveButtonStringID));
b71c89 ¤   ¤   ¤   ¤   ¤   }
75b5fc ¤   ¤   ¤   ¤   } else {
17f38f ¤   ¤   ¤   ¤   ¤   // Save the options
74e5b9 ¤   ¤   ¤   ¤   ¤   Save();
c32613 ¤   ¤   ¤   ¤   }
e5a3a6 ¤   ¤   ¤   }
bf0fe4 ¤   ¤   }
4f2f68 ¤   ¤   break;
0daf5a
77af5a
06f239 ¤   ¤   case msg_Previous:
745b34 ¤   ¤   {
9bd85c ¤   ¤   ¤   if (VerifyEditFieldValues()) {
af43e1 ¤   ¤   ¤   ¤   LMultiPanelView *¤  multiPanel = (LMultiPanelView *)·
7dfa3d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(pane_MultiPanel);
55919f ¤   ¤   ¤   ¤   SInt16¤ ¤   ¤   ¤   currentPanel = multiPanel->
16d4cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetCurrentIndex() - 1;
ceaf5a
2519b6 ¤   ¤   ¤   ¤   // Skip the unneeded panes
a59054 ¤   ¤   ¤   ¤   if (((currentPanel == panel_ChooseIncomingADK)
fd1b3e ¤   ¤   ¤   ¤   && (! ((LCheckBox *)
4e9d8e ¤   ¤   ¤   ¤   FindPaneByID(checkbox_UseIncomingADK))->
cb7ec1 ¤   ¤   ¤   ¤   GetValue() == Button_On))
439ee4 ¤   ¤   ¤   ¤   || ((currentPanel == panel_ChooseOutgoingADK)
71013a ¤   ¤   ¤   ¤   && (! ((LCheckBox *) FindPaneByID(checkbox_UseOutgoingADK))->
017ec1 ¤   ¤   ¤   ¤   GetValue() == Button_On))
723d12 ¤   ¤   ¤   ¤   || ((currentPanel == panel_ChoosePGPdiskADK)
a58539 ¤   ¤   ¤   ¤   && (! ((LCheckBox *) FindPaneByID(checkbox_UsePGPdiskADK))->
fa7ec1 ¤   ¤   ¤   ¤   GetValue() == Button_On))
38166d ¤   ¤   ¤   ¤   || ((currentPanel == panel_ChooseCorporateKey)
141b3e ¤   ¤   ¤   ¤   && (! ((LCheckBox *)
--0f81 000023fd05e401200a8 Page 9 of CAdminDialog.cp
f0ddfa ¤   ¤   ¤   ¤   FindPaneByID(checkbox_AutoSignCorporateKey))->
627ec1 ¤   ¤   ¤   ¤   GetValue() == Button_On))
9b4040 ¤   ¤   ¤   ¤   || ((currentPanel == panel_ChooseDesignatedRevoker)
a11b3e ¤   ¤   ¤   ¤   && (! ((LCheckBox *)
1d1ff7 ¤   ¤   ¤   ¤   FindPaneByID(checkbox_EnableADesignatedRevokerKey))->
6a2801 ¤   ¤   ¤   ¤   GetValue() == Button_On))) {
7b08e7 ¤   ¤   ¤   ¤   ¤   currentPanel--;
732613 ¤   ¤   ¤   ¤   }
d32b85 ¤   ¤   ¤   ¤
2e0931 ¤   ¤   ¤   ¤   // Update summary panel
1b4b2f ¤   ¤   ¤   ¤   if (currentPanel == panel_Summary) {
d4dd84 ¤   ¤   ¤   ¤   ¤   UpdateSummaryPane();
942613 ¤   ¤   ¤   ¤   }
0eaf5a
7c00f3 ¤   ¤   ¤   ¤   // Show the new panel
742492 ¤   ¤   ¤   ¤   multiPanel->SwitchToPanel(currentPanel);
51af5a
2e3a1a ¤   ¤   ¤   ¤   // Adjust the buttons
509048 ¤   ¤   ¤   ¤   LPane *¤buttonNext = FindPaneByID(button_Next);
fb2b85 ¤   ¤   ¤   ¤
fe9c76 ¤   ¤   ¤   ¤   if (currentPanel != panel_SaveInstaller) {
374d63 ¤   ¤   ¤   ¤   ¤   buttonNext->SetDescriptor(CString(¤ STRx_AdminStrings,
62c27d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNextButtonStringID));
eb2613 ¤   ¤   ¤   ¤   }
4658fe ¤   ¤   ¤   ¤   buttonNext->Enable();
6e1957 ¤   ¤   ¤   ¤   if (currentPanel == panel_First) {
cc6776 ¤   ¤   ¤   ¤   ¤   FindPaneByID(button_Previous)->Disable();
592613 ¤   ¤   ¤   ¤   }
c19061 ¤   ¤   ¤   ¤   SetDefaultButton(button_Next);
c6a3a6 ¤   ¤   ¤   }
ce0fe4 ¤   ¤   }
6f2f68 ¤   ¤   break;
971b52 ¤   ¤
411b52 ¤   ¤
9144d4 ¤   ¤   case msg_EnforceMinimumPassphraseCharacters:
e35b34 ¤   ¤   {
8054df ¤   ¤   ¤   LCheckBox *¤theCheckbox = (LCheckBox *) FindPaneByID(
dea493 ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_EnforceMinimumPassphraseCharacters);
6b018c ¤   ¤   ¤   LEditText *¤theEditField = (LEditText *) FindPaneByID(
1b972b ¤   ¤   ¤   ¤   ¤   ¤   ¤   edittext_MinimumPassphraseCharacters);
8fed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
c344c0 ¤   ¤   ¤   if (theCheckbox->GetValue() == Button_On) {
2dbb2d ¤   ¤   ¤   ¤   theEditField->Enable();
03332a ¤   ¤   ¤   ¤   SwitchTarget(theEditField);
90042d ¤   ¤   ¤   } else {
80b734 ¤   ¤   ¤   ¤   theEditField->Disable();
eba3a6 ¤   ¤   ¤   }
4f0fe4 ¤   ¤   }
732f68 ¤   ¤   break;
8d1b52 ¤   ¤
e71b52 ¤   ¤
801c3f ¤   ¤   case msg_EnforceMinimumPassphraseQuality:
2c5b34 ¤   ¤   {
7c54df ¤   ¤   ¤   LCheckBox *¤theCheckbox = (LCheckBox *) FindPaneByID(
f29687 ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_EnforceMinimumPassphraseQuality);
4f018c ¤   ¤   ¤   LEditText *¤theEditField = (LEditText *) FindPaneByID(
5e08e5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   edittext_MinimumPassphraseQuality);
b4da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
e044c0 ¤   ¤   ¤   if (theCheckbox->GetValue() == Button_On) {
e7bb2d ¤   ¤   ¤   ¤   theEditField->Enable();
b6332a ¤   ¤   ¤   ¤   SwitchTarget(theEditField);
a1042d ¤   ¤   ¤   } else {
5ab734 ¤   ¤   ¤   ¤   theEditField->Disable();
caa3a6 ¤   ¤   ¤   }
d10fe4 ¤   ¤   }
112f68 ¤   ¤   break;
6c1b52 ¤   ¤
301b52 ¤   ¤
f06d81 ¤   ¤   case msg_UpdateAllKeys:
e15b34 ¤   ¤   {
7854df ¤   ¤   ¤   LCheckBox *¤theCheckbox = (LCheckBox *) FindPaneByID(
02b9ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_UpdateAllKeys);
--5279 00034c4b6bb401200a8 Page 10 of CAdminDialog.cp
8a018c ¤   ¤   ¤   LEditText *¤theEditField = (LEditText *) FindPaneByID(
4b1850 ¤   ¤   ¤   ¤   ¤   ¤   ¤   edittext_UpdateAllKeys);
23da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
e044c0 ¤   ¤   ¤   if (theCheckbox->GetValue() == Button_On) {
fcbb2d ¤   ¤   ¤   ¤   theEditField->Enable();
76332a ¤   ¤   ¤   ¤   SwitchTarget(theEditField);
45042d ¤   ¤   ¤   } else {
edb734 ¤   ¤   ¤   ¤   theEditField->Disable();
3fa3a6 ¤   ¤   ¤   }
b00fe4 ¤   ¤   }
d62f68 ¤   ¤   break;
f9af5a
3aaf5a
54af5a
f9ac1e ¤   ¤   case msg_UpdateTrustedIntroducers:
9e5b34 ¤   ¤   {
ea54df ¤   ¤   ¤   LCheckBox *¤theCheckbox = (LCheckBox *) FindPaneByID(
e418d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_UpdateTrustedIntroducers);
04018c ¤   ¤   ¤   LEditText *¤theEditField = (LEditText *) FindPaneByID(
6990ae ¤   ¤   ¤   ¤   ¤   ¤   ¤   edittext_UpdateTrustedIntroducers);
e1da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
cd44c0 ¤   ¤   ¤   if (theCheckbox->GetValue() == Button_On) {
43bb2d ¤   ¤   ¤   ¤   theEditField->Enable();
47332a ¤   ¤   ¤   ¤   SwitchTarget(theEditField);
3f042d ¤   ¤   ¤   } else {
dbb734 ¤   ¤   ¤   ¤   theEditField->Disable();
27a3a6 ¤   ¤   ¤   }
dc0fe4 ¤   ¤   }
3c2f68 ¤   ¤   break;
56af5a
b4af5a
8faf5a
a734d6 ¤   ¤   case msg_IncomingADKTable:
dd3143 ¤   ¤   case msg_OutgoingADKTable:
7d9d46 ¤   ¤   case msg_PGPdiskADKTable:
a25a94 ¤   ¤   case msg_CorporateKeyTable:
7d422c ¤   ¤   case msg_DesignatedRevokerTable:
bd5b34 ¤   ¤   {
226f5b ¤   ¤   ¤   CKeyTable *¤theTable;
2387c7 ¤   ¤   ¤
5b6fa0 ¤   ¤   ¤   switch (inMessage) {
607b69 ¤   ¤   ¤   ¤   case msg_IncomingADKTable:
bc72c3 ¤   ¤   ¤   ¤   {
bbc7ec ¤   ¤   ¤   ¤   ¤   theTable = (CKeyTable *) FindPaneByID(table_IncomingADK);
242613 ¤   ¤   ¤   ¤   }
9df622 ¤   ¤   ¤   ¤   break;
742b85 ¤   ¤   ¤   ¤
4d2b85 ¤   ¤   ¤   ¤
767efc ¤   ¤   ¤   ¤   case msg_OutgoingADKTable:
2f72c3 ¤   ¤   ¤   ¤   {
0bc36a ¤   ¤   ¤   ¤   ¤   theTable = (CKeyTable *) FindPaneByID(table_OutgoingADK);
962613 ¤   ¤   ¤   ¤   }
0ff622 ¤   ¤   ¤   ¤   break;
e8af5a
b2af5a
604edb ¤   ¤   ¤   ¤   case msg_PGPdiskADKTable:
8372c3 ¤   ¤   ¤   ¤   {
22c3ff ¤   ¤   ¤   ¤   ¤   theTable = (CKeyTable *) FindPaneByID(table_PGPdiskADK);
212613 ¤   ¤   ¤   ¤   }
d6f622 ¤   ¤   ¤   ¤   break;
a9af5a
8caf5a
e317a7 ¤   ¤   ¤   ¤   case msg_CorporateKeyTable:
4672c3 ¤   ¤   ¤   ¤   {
c5075a ¤   ¤   ¤   ¤   ¤   theTable = (CKeyTable *)
4d6504 ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(table_CorporateKey);
812613 ¤   ¤   ¤   ¤   }
1df622 ¤   ¤   ¤   ¤   break;
98af5a
091609 ¤   ¤   ¤   ¤   case msg_DesignatedRevokerTable:
5572c3 ¤   ¤   ¤   ¤   {
34075a ¤   ¤   ¤   ¤   ¤   theTable = (CKeyTable *)
--ff3f 000dd359559401200a8 Page 11 of CAdminDialog.cp
dac5e0 ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(table_DesignatedRevoker);
a12613 ¤   ¤   ¤   ¤   }
c3f622 ¤   ¤   ¤   ¤   break;
62a3a6 ¤   ¤   ¤   }
41b4cc ¤   ¤   ¤   if (theTable->GetFirstSelectedCell().IsNullCell()) {
9cc8d8 ¤   ¤   ¤   ¤   FindPaneByID(button_Next)->Disable();
f5042d ¤   ¤   ¤   } else {
b4b091 ¤   ¤   ¤   ¤   FindPaneByID(button_Next)->Enable();
03a3a6 ¤   ¤   ¤   }
f80fe4 ¤   ¤   }
0e2f68 ¤   ¤   break;
ba1b52 ¤   ¤
b91b52 ¤   ¤
d33249 ¤   ¤   case msg_AllowKeyGeneration:
485b34 ¤   ¤   {
cccead ¤   ¤   ¤   if (((LCheckBox *) FindPaneByID(checkbox_AllowKeyGeneration))->
5403ef ¤   ¤   ¤   GetValue() == Button_On) {
b608ac ¤   ¤   ¤   ¤   LEditText *¤editTextMinimumKeySize = (LEditText *)
b3f1b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(edittext_MinimumKeySize);
682b85 ¤   ¤   ¤   ¤
93d96f ¤   ¤   ¤   ¤   FindPaneByID(checkbox_AllowRSAKeyGeneration)->Enable();
16fbc0 ¤   ¤   ¤   ¤   editTextMinimumKeySize->Enable();
60cd89 ¤   ¤   ¤   ¤   SwitchTarget(editTextMinimumKeySize);
fe042d ¤   ¤   ¤   } else {
d3d640 ¤   ¤   ¤   ¤   FindPaneByID(checkbox_AllowRSAKeyGeneration)->Disable();
e06e4b ¤   ¤   ¤   ¤   FindPaneByID(edittext_MinimumKeySize)->Disable();
45a3a6 ¤   ¤   ¤   }
e90fe4 ¤   ¤   }
772f68 ¤   ¤   break;
bcaf5a
3d1b52 ¤   ¤
bc3890 ¤   ¤   case msg_AutoSignCorporateKey:
0d5b34 ¤   ¤   {
ee4107 ¤   ¤   ¤   if (((LCheckBox *) FindPaneByID(checkbox_AutoSignCorporateKey))->
0003ef ¤   ¤   ¤   GetValue() == Button_On) {
00133e ¤   ¤   ¤   ¤   FindPaneByID(checkbox_WarnIfNotSignedByCorporateKey)->
78a21f ¤   ¤   ¤   ¤   ¤   Enable();
7ef0f2 ¤   ¤   ¤   ¤   FindPaneByID(checkbox_CorporateKeyIsMetaIntroducer)->
41a21f ¤   ¤   ¤   ¤   ¤   Enable();
fc042d ¤   ¤   ¤   } else {
f7133e ¤   ¤   ¤   ¤   FindPaneByID(checkbox_WarnIfNotSignedByCorporateKey)->
97a5bc ¤   ¤   ¤   ¤   ¤   Disable();
71f0f2 ¤   ¤   ¤   ¤   FindPaneByID(checkbox_CorporateKeyIsMetaIntroducer)->
d7a5bc ¤   ¤   ¤   ¤   ¤   Disable();
47a3a6 ¤   ¤   ¤   }
ef0fe4 ¤   ¤   }
032f68 ¤   ¤   break;
411b52 ¤   ¤
d91b52 ¤   ¤
b837db ¤   ¤   case msg_ChooseInstaller:
8e5b34 ¤   ¤   {
397716 ¤   ¤   ¤   StandardFileReply¤  reply;
8665af ¤   ¤   ¤   UniversalProcPtr¤   fileFilterUPP;
ca0109 ¤   ¤   ¤   OSStatus¤   ¤   ¤   err;
3e1b52 ¤   ¤
55e4c0 ¤   ¤   ¤   // Find the installer
60e9e5 ¤   ¤   ¤   if (FindApplication(kPGPInstallerType, kPGPInstallerCreator,
92beb6 ¤   ¤   ¤   ¤   kFindAppOnAllVolumes, &mBaseInstallerSpec)) {
2d3eef ¤   ¤   ¤   ¤   ::LMSetSFSaveDisk(-mBaseInstallerSpec.vRefNum);
362799 ¤   ¤   ¤   ¤   ::LMSetCurDirStore(mBaseInstallerSpec.parID);
43a3a6 ¤   ¤   ¤   }
2a87c7 ¤   ¤   ¤
c7d2af ¤   ¤   ¤   fileFilterUPP = NewFileFilterProc(InstallerFileFilter);
db840c ¤   ¤   ¤   ::StandardGetFile(¤ fileFilterUPP,
65180f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   1,
7a8fd3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &kPGPInstallerType,
daa4bb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &reply);
f5047d ¤   ¤   ¤   DisposeRoutineDescriptor(fileFilterUPP);
857af3 ¤   ¤   ¤   if (reply.sfGood) {
8acfca ¤   ¤   ¤   ¤   CString¤¤   ¤   descriptor;
2027ad ¤   ¤   ¤   ¤   LPane *¤¤   ¤   baseInstallerCaption =
dd800c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(statictext_Installer);
--080f 000eda58be8401200a8 Page 12 of CAdminDialog.cp
9f2b85 ¤   ¤   ¤   ¤
fba5e1 ¤   ¤   ¤   ¤   mBaseInstallerSpec = reply.sfFile;
199169 ¤   ¤   ¤   ¤   err = FSpGetFullPath(&mBaseInstallerSpec, descriptor);
f187f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
6b1a1d ¤   ¤   ¤   ¤   baseInstallerCaption->SetDescriptor(descriptor);
14b091 ¤   ¤   ¤   ¤   FindPaneByID(button_Next)->Enable();
fea3a6 ¤   ¤   ¤   }
220fe4 ¤   ¤   }
212f68 ¤   ¤   break;
669371 ¤   }
b4efe6 }
76af5a
847e69 ¤   Boolean
29379b CAdminDialog::AttemptQuitSelf(
8088b8 ¤   SInt32¤ inSaveOption)
f0bb36 {
dabdad ¤   (void) inSaveOption;
5567c5 ¤
1c9b4b ¤   if (mDirty) {
dd8208 ¤   ¤   ::SysBeep(0);
629371 ¤   }
810ba0 ¤   return ! mDirty;
dfefe6 }
67af5a
6aaf5a
acaf5a
9d7e69 ¤   Boolean
aec0fe CAdminDialog::VerifyEditFieldValues()
b9bb36 {
c59efb ¤   Boolean¤¤   ¤   result = true;
01a12e ¤   LEditText *¤¤   theEditField;
6f741c ¤   SInt16¤ ¤   ¤   theValue;
00effc ¤   SInt16¤ ¤   ¤   stringID = 0;
2a0482 ¤   SInt16¤ ¤   ¤   minimum;
20c43a ¤   SInt16¤ ¤   ¤   maximum;
6007c6 ¤   SInt16¤ ¤   ¤   currentPanel = ((LMultiPanelView *) FindPaneByID(
511366 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pane_MultiPanel))->GetCurrentIndex();
8267c5 ¤
12468f ¤   // Test the fields
b0e3eb ¤   switch (currentPanel) {
c33dc1 ¤   ¤   case panel_PassphraseMinimums:
f35b34 ¤   ¤   {
2c09e0 ¤   ¤   ¤   theEditField = (LEditText *) FindPaneByID(
6c84a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   edittext_MinimumPassphraseCharacters);
3eb24d ¤   ¤   ¤   theValue = theEditField->GetValue();
24808c ¤   ¤   ¤   if (theEditField->IsEnabled() &&
0022c3 ¤   ¤   ¤   ((theValue < kMinimumPassphraseCharacters) ||
e0fed2 ¤   ¤   ¤   (theValue > kMaximumPassphraseCharacters))) {
153f69 ¤   ¤   ¤   ¤   result = false;
5bbdee ¤   ¤   ¤   ¤   stringID = kMinimumPassphraseCharactersStringID;
068cec ¤   ¤   ¤   ¤   minimum = kMinimumPassphraseCharacters;
3878f5 ¤   ¤   ¤   ¤   maximum = kMaximumPassphraseCharacters;
ee042d ¤   ¤   ¤   } else {
ea0edb ¤   ¤   ¤   ¤   theEditField = (LEditText *) FindPaneByID(
367bfc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   edittext_MinimumPassphraseQuality);
7de156 ¤   ¤   ¤   ¤   theValue = theEditField->GetValue();
add211 ¤   ¤   ¤   ¤   if (theEditField->IsEnabled() &&
39ae05 ¤   ¤   ¤   ¤   ((theValue < kMinimumPassphraseQuality) ||
8e3903 ¤   ¤   ¤   ¤   (theValue > kMaximumPassphraseQuality))) {
2cb495 ¤   ¤   ¤   ¤   ¤   result = false;
2ba7eb ¤   ¤   ¤   ¤   ¤   stringID = kMinimumPassphraseQualityStringID;
8c9c6e ¤   ¤   ¤   ¤   ¤   minimum = kMinimumPassphraseQuality;
ca4701 ¤   ¤   ¤   ¤   ¤   maximum = kMaximumPassphraseQuality;
722613 ¤   ¤   ¤   ¤   }
33a3a6 ¤   ¤   ¤   }
b68469 ¤   ¤   }·
8f2f68 ¤   ¤   break;
ff1b52 ¤   ¤
401b52 ¤   ¤
1ee7a6 ¤   ¤   case panel_KeyGenerationOptions:
b75b34 ¤   ¤   {
ed715c ¤   ¤   ¤   Boolean¤hasRSAGeneration = ((LCheckBox *) FindPaneByID(
--d3f0 00007994921401200a8 Page 13 of CAdminDialog.cp
d36ec9 ¤   ¤   ¤   ¤   ¤   ¤   checkbox_AllowRSAKeyGeneration))->
88cf3a ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On;
05bdb4 ¤   ¤   ¤   SInt16¤ maxKeySize = hasRSAGeneration ? kMaximumRSAKeySize :
d71616 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMaximumKeySize;
1387c7 ¤   ¤   ¤
6309e0 ¤   ¤   ¤   theEditField = (LEditText *) FindPaneByID(
d234a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   edittext_MinimumKeySize);
4cb24d ¤   ¤   ¤   theValue = theEditField->GetValue();
5d0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
1a808c ¤   ¤   ¤   if (theEditField->IsEnabled() &&
042147 ¤   ¤   ¤   ((theValue < kMinimumKeySize) ||
581dd9 ¤   ¤   ¤   (theValue > maxKeySize)))
aef776 ¤   ¤   ¤   {
5a3f69 ¤   ¤   ¤   ¤   result = false;
dc2b85 ¤   ¤   ¤   ¤
1476b6 ¤   ¤   ¤   ¤   if( hasRSAGeneration )
db72c3 ¤   ¤   ¤   ¤   {
553c0d ¤   ¤   ¤   ¤   ¤   stringID = kMinimumRSAKeySizeStringID;
1f2613 ¤   ¤   ¤   ¤   }
c1fa07 ¤   ¤   ¤   ¤   else
c272c3 ¤   ¤   ¤   ¤   {
8387b1 ¤   ¤   ¤   ¤   ¤   stringID = kMinimumKeySizeStringID;
8e2613 ¤   ¤   ¤   ¤   }
ff2b85 ¤   ¤   ¤   ¤
27ad38 ¤   ¤   ¤   ¤   minimum = kMinimumKeySize;
290c79 ¤   ¤   ¤   ¤   maximum = maxKeySize;
9fa3a6 ¤   ¤   ¤   }
fb0fe4 ¤   ¤   }
c42f68 ¤   ¤   break;
6eaf5a
43af5a
dd9a60 ¤   ¤   case panel_AutoUpdating:
005b34 ¤   ¤   {
8e09e0 ¤   ¤   ¤   theEditField = (LEditText *) FindPaneByID(
9e7763 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   edittext_UpdateAllKeys);
a1b24d ¤   ¤   ¤   theValue = theEditField->GetValue();
a7808c ¤   ¤   ¤   if (theEditField->IsEnabled() &&
7ab919 ¤   ¤   ¤   ((theValue < kMinimumDaysBeforeUpdate) ||
373645 ¤   ¤   ¤   (theValue > kMaximumDaysBeforeUpdate))) {
083f69 ¤   ¤   ¤   ¤   result = false;
aa042d ¤   ¤   ¤   } else {
a60edb ¤   ¤   ¤   ¤   theEditField = (LEditText *) FindPaneByID(
26e3b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   edittext_UpdateTrustedIntroducers);
abe156 ¤   ¤   ¤   ¤   theValue = theEditField->GetValue();
a2d211 ¤   ¤   ¤   ¤   if (theEditField->IsEnabled() &&
e4ba6e ¤   ¤   ¤   ¤   ((theValue < kMinimumDaysBeforeUpdate) ||
9d3532 ¤   ¤   ¤   ¤   (theValue > kMaximumDaysBeforeUpdate))) {
0fb495 ¤   ¤   ¤   ¤   ¤   result = false;
8a2613 ¤   ¤   ¤   ¤   }
99a3a6 ¤   ¤   ¤   }
d2307c ¤   ¤   ¤   if (result == false) {
096b90 ¤   ¤   ¤   ¤   stringID = kMinimumNumberOfDaysStringID;
b732c7 ¤   ¤   ¤   ¤   minimum = kMinimumDaysBeforeUpdate;
5db8ca ¤   ¤   ¤   ¤   maximum = kMaximumDaysBeforeUpdate;
04a3a6 ¤   ¤   ¤   }
328469 ¤   ¤   }·
ab2f68 ¤   ¤   break;
c49371 ¤   }
a367c5 ¤
6367c5 ¤
a58a3e ¤   // Handle bad compare
f0db7d ¤   if (result == false ) {
7e8208 ¤   ¤   ::SysBeep(0);
654814 ¤   ¤   CWarningAlert::Display(¤kWAStopAlertType,
dc144f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
5e9292 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_AdminStrings,
b606a9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   stringID),
96bbed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(minimum),
5f376f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(maximum));
3b7e19 ¤   ¤   SwitchTarget(theEditField);
21fa71 ¤   ¤   theEditField->SelectAll();
079371 ¤   }
--14cc 000ec4038aa401200a8 Page 14 of CAdminDialog.cp
f11b52 ¤   ¤
bd5d73 ¤   return result;
1defe6 }
63af5a
087e69 ¤   Boolean
f6917b CAdminDialog::Save()
36bb36 {
ba0c37 ¤   Boolean¤¤   ¤   ¤   result = false;
72ba9a ¤   StandardFileReply¤  reply;
4a8737 ¤   OSStatus¤   ¤   ¤   err;
0debba ¤   CString¤¤   ¤   ¤   savedName(mBaseInstallerSpec.name);
a067c5 ¤
d39bb0 ¤   strcat(savedName, CString(STRx_AdminStrings, kSavedNameSuffixStringID));
dc80cd ¤   // Choose where to save the copy
e587ff ¤   ::StandardPutFile(¤ CString(STRx_AdminStrings, kSavePromptStringID),
11ec42 ¤   ¤   ¤   ¤   ¤   ¤   savedName,
c19c3e ¤   ¤   ¤   ¤   ¤   ¤   &reply);
9f21c8 ¤   if (reply.sfGood) {
4867c5 ¤
54fe40 ¤   ¤   // Create a copy of the file
3cce54 ¤   ¤   if (! FSpEqual(&mBaseInstallerSpec, &reply.sfFile)) {
7a7d8a ¤   ¤   ¤   if (reply.sfReplacing) {
cc6a71 ¤   ¤   ¤   ¤   err = ::FSpDelete(&reply.sfFile);
9a87f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
55a3a6 ¤   ¤   ¤   }
7c7d17 ¤   ¤   ¤   err = FSpCopyFiles(PGPGetContextMemoryMgr(gPGPContext),
c8d937 ¤   ¤   ¤   ¤   ¤   ¤   &mBaseInstallerSpec, &reply.sfFile);
0bc60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
910fe4 ¤   ¤   }
caaf5a
8c4aef ¤   ¤   // Open temp pref file
9119cb ¤   ¤   PGPPrefRef¤ ¤   ¤   prefRef = kInvalidPGPPrefRef;
bd1bcf ¤   ¤   PFLFileSpecRef¤ ¤   tempSpecRef = kInvalidPFLFileSpecRef;
f1eaff ¤   ¤   PFLFileSpecRef¤ ¤   prefFileSpec = kInvalidPFLFileSpecRef;
da1b52 ¤   ¤
3dfd2a ¤   ¤   try {
8d3c0b ¤   ¤   ¤   CTempFile¤  ¤   ¤   tempFile(kPGPKeysCreator, kPrefFileType);
6cf535 ¤   ¤   ¤   PGPError¤   ¤   ¤   pgpErr;
9e369a ¤   ¤   ¤   FSSpec¤ ¤   ¤   ¤   tempSpec;
dcd8c9 ¤   ¤   ¤   StHandleBlock¤  ¤   handle((Size) 0);
10d2a7 ¤   ¤   ¤   StHandleBlock¤  ¤   keyHandle((Size) 0);
df751a ¤   ¤   ¤   CString¤¤   ¤   ¤   edittextString;
bd015b ¤   ¤   ¤   Boolean¤¤   ¤   ¤   isSelected;
772b3a ¤   ¤   ¤   CKeyTable *¤¤   ¤   keyTable;
01a48c ¤   ¤   ¤   PGPKeyID¤   ¤   ¤   keyID;
efc371 ¤   ¤   ¤   PGPByte¤¤   ¤   ¤   exportedID[kPGPMaxExportedKeyIDSize];
2012f1 ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   size;
1595d4 ¤   ¤   ¤   SInt32¤ ¤   ¤   ¤   algorithm;
cc87c7 ¤   ¤   ¤
a9f174 ¤   ¤   ¤   tempFile.GetSpecifier(tempSpec);
c70662 ¤   ¤   ¤   pgpErr = PFLNewFileSpecFromFSSpec(
9676e0 ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr(gPGPContext),
2a30d5 ¤   ¤   ¤   ¤   ¤   ¤   &tempSpec,
a69766 ¤   ¤   ¤   ¤   ¤   ¤   &tempSpecRef);
d68109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
5c278a ¤   ¤   ¤   pgpErr = PGPOpenPrefFile(¤  tempSpecRef,
de7393 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NULL,
ee8c2b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,·
852a50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··¤ ¤   ¤   &prefRef);
ee8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
7187c7 ¤   ¤   ¤
01c6ec ¤   ¤   ¤   // Write prefs to file
0b787e ¤   ¤   ¤   FindPaneByID(edittext_CompanyName)->
f1af02 ¤   ¤   ¤   ¤   GetDescriptor(edittextString);
7b04e9 ¤   ¤   ¤   if (edittextString.GetLength() != 0) {
aa6a7e ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefString(¤ prefRef,
bc9b55 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefAdminCompanyName,
a9302a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   edittextString);
218f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
7ba3a6 ¤   ¤   ¤   }
7187c7 ¤   ¤   ¤
ec91b9 ¤   ¤   ¤   isSelected = ((LCheckBox *) FindPaneByID(checkbox_UseIncomingADK))->
--b88b 0002789e6d8401200a8 Page 15 of CAdminDialog.cp
849c21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On;
acfbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
4f07c5 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefUseDHADK,
420635 ¤   ¤   ¤   ¤   ¤   ¤   isSelected);
378109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
f4f4f5 ¤   ¤   ¤   if (isSelected) {
d54205 ¤   ¤   ¤   ¤   try {
ebc1cc ¤   ¤   ¤   ¤   ¤   keyTable = (CKeyTable *) FindPaneByID(table_IncomingADK);
4c3563 ¤   ¤   ¤   ¤   ¤   keyTable->GetSelectedKeys(keyHandle);
ebd9de ¤   ¤   ¤   ¤   ¤   ::HandAndHand(keyHandle, handle);
301876 ¤   ¤   ¤   ¤   ¤   PGPThrowIfMemError_();
d1f177 ¤   ¤   ¤   ¤   ¤   keyTable->GetFirstSelectedKeyID(&keyID);
5bcd5b ¤   ¤   ¤   ¤   ¤   pgpErr = PGPExportKeyID(¤   &keyID,
bac5e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   exportedID,
43f442 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &size);
881edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
d80642 ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefData(¤   prefRef,·
765f8a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDHADKID,·
3a6b83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·¤  ¤   ¤   size,·
97aae9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   exportedID);
051edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
4e2613 ¤   ¤   ¤   ¤   }
d22b85 ¤   ¤   ¤   ¤
0394d8 ¤   ¤   ¤   ¤   catch (...) {
2c9891 ¤   ¤   ¤   ¤   ¤   throw;
3f2613 ¤   ¤   ¤   ¤   }
58a3a6 ¤   ¤   ¤   }
43af5a
460f81 ¤   ¤   ¤   isSelected = ((LCheckBox *) FindPaneByID(checkbox_UseOutgoingADK))->
1d9c21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On;
fafbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
cd3a3c ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefUseOutgoingADK,
0a0635 ¤   ¤   ¤   ¤   ¤   ¤   isSelected);
3e8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
13f4f5 ¤   ¤   ¤   if (isSelected) {
ce4205 ¤   ¤   ¤   ¤   try {
d8c54a ¤   ¤   ¤   ¤   ¤   keyTable = (CKeyTable *) FindPaneByID(table_OutgoingADK);
f63563 ¤   ¤   ¤   ¤   ¤   keyTable->GetSelectedKeys(keyHandle);
2ad9de ¤   ¤   ¤   ¤   ¤   ::HandAndHand(keyHandle, handle);
371876 ¤   ¤   ¤   ¤   ¤   PGPThrowIfMemError_();
d5962e ¤   ¤   ¤   ¤   ¤   keyTable->GetFirstSelectedKeyID(&keyID,
3f7cac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm);
47cd5b ¤   ¤   ¤   ¤   ¤   pgpErr = PGPExportKeyID(¤   &keyID,
bec5e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   exportedID,
87f442 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &size);
1f1edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
b90642 ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefData(¤   prefRef,·
34c617 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefOutgoingADKID,·
0f6b83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·¤  ¤   ¤   size,·
49aae9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   exportedID);
721edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
e4f05d ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefNumber(¤ prefRef,
e96b2b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefOutADKPublicKeyAlgorith¶
0cdffb m,
038c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   algorithm);
5c1edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
342613 ¤   ¤   ¤   ¤   }
522b85 ¤   ¤   ¤   ¤
1594d8 ¤   ¤   ¤   ¤   catch (...) {
9a9891 ¤   ¤   ¤   ¤   ¤   throw;
b52613 ¤   ¤   ¤   ¤   }
bfa3a6 ¤   ¤   ¤   }
0aaf5a
c14ed7 ¤   ¤   ¤   isSelected = ((LCheckBox *) FindPaneByID(checkbox_UsePGPdiskADK))->
6c9c21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On;
fdfbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
82ceb6 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefUsePGPdiskADK,
1c0635 ¤   ¤   ¤   ¤   ¤   ¤   isSelected);
928109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
22f4f5 ¤   ¤   ¤   if (isSelected) {
b74205 ¤   ¤   ¤   ¤   try {
27d399 ¤   ¤   ¤   ¤   ¤   keyTable = (CKeyTable *) FindPaneByID(table_PGPdiskADK);
--d482 0007365ca4c401200a8 Page 16 of CAdminDialog.cp
053563 ¤   ¤   ¤   ¤   ¤   keyTable->GetSelectedKeys(keyHandle);
06d9de ¤   ¤   ¤   ¤   ¤   ::HandAndHand(keyHandle, handle);
041876 ¤   ¤   ¤   ¤   ¤   PGPThrowIfMemError_();
07f177 ¤   ¤   ¤   ¤   ¤   keyTable->GetFirstSelectedKeyID(&keyID);
37cd5b ¤   ¤   ¤   ¤   ¤   pgpErr = PGPExportKeyID(¤   &keyID,
f4c5e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   exportedID,
72f442 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &size);
681edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
d70642 ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefData(¤   prefRef,·
5f1ddf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefPGPdiskADKKeyID,·
bc6b83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·¤  ¤   ¤   size,·
2daae9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   exportedID);
c41edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
4e2613 ¤   ¤   ¤   ¤   }
702b85 ¤   ¤   ¤   ¤
b594d8 ¤   ¤   ¤   ¤   catch (...) {
4c9891 ¤   ¤   ¤   ¤   ¤   throw;
e22613 ¤   ¤   ¤   ¤   }
1da3a6 ¤   ¤   ¤   }
bd87c7 ¤   ¤   ¤
6afbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
e28ed0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefEnforceIncomingADK,
c84898 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ((LCheckBox *) FindPaneByID(
fee770 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_EnforceIncomingADK))->
a34857 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On);
918109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
e7fbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
382894 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefEnforceOutgoingADK,
ad4898 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ((LCheckBox *) FindPaneByID(
0c7948 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_EnforceOutgoingADK))->
a24857 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On);
128109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
7afbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
b4ee0a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefEnforceRemoteADKClass,
4b4898 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ((LCheckBox *) FindPaneByID(
73ce7b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_EnforceRemoteADKStrictness¶
d2c454 ))
31eb69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ->GetValue() == Button_On);
428109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
5b87c7 ¤   ¤   ¤
4627e1 ¤   ¤   ¤   isSelected = ((LCheckBox *) FindPaneByID(
9f261a ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_EnforceMinimumPassphraseCharacters))->
fc9c21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On;
5ffbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
a6878a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefEnforceMinChars,
2104e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isSelected);
d88109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
87f4f5 ¤   ¤   ¤   if (isSelected) {
5c41f6 ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefNumber(
993320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   prefRef,
f25c5e ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefMinChars,
d5f0d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(edittext_MinimumPassphraseCharacters)->
39f091 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue());
e28f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
b5a3a6 ¤   ¤   ¤   }
65af5a
0a27e1 ¤   ¤   ¤   isSelected = ((LCheckBox *) FindPaneByID(
bec67a ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_EnforceMinimumPassphraseQuality))->
769c21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On;
1dfbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
b4fd81 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefEnforceMinQuality,
4504e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isSelected);
2f8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
10f4f5 ¤   ¤   ¤   if (isSelected) {
0141f6 ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefNumber(
b23320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   prefRef,
8fad84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefMinQuality,
7ce959 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(edittext_MinimumPassphraseQuality)->
33f091 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue());
308f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
b9a3a6 ¤   ¤   ¤   }
73af5a
--119d 0003299ebd9401200a8 Page 17 of CAdminDialog.cp
db27e1 ¤   ¤   ¤   isSelected = ((LCheckBox *) FindPaneByID(
57d8d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_AutoSignCorporateKey))->
5e9c21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On;
c0fbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
20db74 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefAutoSignTrustCorp,
1a04e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isSelected);
ad8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
cdaf5a
57a019 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(
a00e48 ¤   ¤   ¤   ¤   ¤   ¤   prefRef,
420d03 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefWarnNotCertByCorp,
f801dd ¤   ¤   ¤   ¤   ¤   ¤   isSelected && ((LCheckBox *) FindPaneByID(
fd3a03 ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_WarnIfNotSignedByCorporateKey))->
30001a ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On);
5c8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
51af5a
c8a019 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(
cf0e48 ¤   ¤   ¤   ¤   ¤   ¤   prefRef,
67e4fb ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefMetaIntroducerCorp,
9001dd ¤   ¤   ¤   ¤   ¤   ¤   isSelected && ((LCheckBox *) FindPaneByID(
afd268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_CorporateKeyIsMetaIntroducer))->
92001a ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On);
2c8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
d6af5a
7dae30 ¤   ¤   ¤   ¤   ¤
e7bace ¤   ¤   ¤   keyTable = (CKeyTable *) FindPaneByID(table_CorporateKey);
f99815 ¤   ¤   ¤   keyTable->GetSelectedKeys(keyHandle);
f8a47c ¤   ¤   ¤   if (::GetHandleSize(keyHandle) != 0) {
964205 ¤   ¤   ¤   ¤   try {
f1d9de ¤   ¤   ¤   ¤   ¤   ::HandAndHand(keyHandle, handle);
581876 ¤   ¤   ¤   ¤   ¤   PGPThrowIfMemError_();
3b962e ¤   ¤   ¤   ¤   ¤   keyTable->GetFirstSelectedKeyID(&keyID,
a47cac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm);
0fcd5b ¤   ¤   ¤   ¤   ¤   pgpErr = PGPExportKeyID(¤   &keyID,
92c5e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   exportedID,
40f442 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &size);
9e1edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
2c0642 ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefData(¤   prefRef,·
4fde35 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefCorpKeyID,·
376b83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·¤  ¤   ¤   size,·
3faae9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   exportedID);
0f1edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
27f05d ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefNumber(¤ prefRef,
f8622b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefCorpKeyPublicKeyAlgorit¶
13a3c7 hm,
658c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   algorithm);
571edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
9b2613 ¤   ¤   ¤   ¤   }
312b85 ¤   ¤   ¤   ¤
5194d8 ¤   ¤   ¤   ¤   catch (...) {
5f9891 ¤   ¤   ¤   ¤   ¤   throw;
cb2613 ¤   ¤   ¤   ¤   }
01a3a6 ¤   ¤   ¤   }
20af5a
1727e1 ¤   ¤   ¤   isSelected = ((LCheckBox *) FindPaneByID(
4d81a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_EnableADesignatedRevokerKey))->
d69c21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On;
41fbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
1df995 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefAutoAddRevoker,
580635 ¤   ¤   ¤   ¤   ¤   ¤   isSelected);
1c8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
e4f4f5 ¤   ¤   ¤   if (isSelected) {
6f4205 ¤   ¤   ¤   ¤   try {
58ea7a ¤   ¤   ¤   ¤   ¤   keyTable = (CKeyTable *) FindPaneByID(
e4d6ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   table_DesignatedRevoker);
e53563 ¤   ¤   ¤   ¤   ¤   keyTable->GetSelectedKeys(keyHandle);
f6d9de ¤   ¤   ¤   ¤   ¤   ::HandAndHand(keyHandle, handle);
851876 ¤   ¤   ¤   ¤   ¤   PGPThrowIfMemError_();
39962e ¤   ¤   ¤   ¤   ¤   keyTable->GetFirstSelectedKeyID(&keyID,
2e7cac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm);
08cd5b ¤   ¤   ¤   ¤   ¤   pgpErr = PGPExportKeyID(¤   &keyID,
32c5e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   exportedID,
--3130 00051b5fb39401200a8 Page 18 of CAdminDialog.cp
7df442 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &size);
cf1edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
a30642 ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefData(¤   prefRef,·
d8d98e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefRevokerKeyID,·
496b83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·¤  ¤   ¤   size,·
e3aae9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   exportedID);
c41edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
73d06e ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefNumber(
3036cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   prefRef,
a87e80 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefRevokerPublicKeyAlgorithm,
27d8f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   algorithm);
911edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
132613 ¤   ¤   ¤   ¤   }
ee2b85 ¤   ¤   ¤   ¤
7a94d8 ¤   ¤   ¤   ¤   catch (...) {
919891 ¤   ¤   ¤   ¤   ¤   throw;
af2613 ¤   ¤   ¤   ¤   }
26a3a6 ¤   ¤   ¤   }
83af5a
fa27e1 ¤   ¤   ¤   isSelected = ((LCheckBox *) FindPaneByID(
afc8b0 ¤   ¤   ¤   ¤   checkbox_AllowKeyGeneration))->GetValue() == Button_On;
cefbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
69c972 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefAllowKeyGen,
a704e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isSelected);
a48109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
2baf5a
9dfbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
0fc920 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefAllowRSAKeyGen,
bb6a97 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isSelected && ((LCheckBox *)
c99315 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(
4ecdd7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_AllowRSAKeyGeneration))->
ac4857 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On);
1f8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
c5f4f5 ¤   ¤   ¤   if (isSelected) {
dc9f6e ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefNumber(¤ prefRef,
663f99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefMinimumKeySize,
3f9315 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(
280fec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   edittext_MinimumKeySize)->
70b891 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue());
238f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
f1a3a6 ¤   ¤   ¤   }
b5af5a
c0e333 ¤   ¤   ¤   ((CKeyTable *) FindPaneByID(table_DefaultKeys))->
378508 ¤   ¤   ¤   ¤   GetSelectedKeys(keyHandle);
6942a8 ¤   ¤   ¤   ::HandAndHand(handle, keyHandle);
7f57c9 ¤   ¤   ¤   PGPThrowIfMemError_();
57a47c ¤   ¤   ¤   if (::GetHandleSize(keyHandle) != 0) {
5417ae ¤   ¤   ¤   ¤   ::HLock(keyHandle);
440535 ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefData(¤   prefRef,·
7556de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDefaultKeys,·
3c0024 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·¤  ¤   ¤   ::GetHandleSize(keyHandle),·
3a65ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·¤  ¤   ¤   *keyHandle);
18e8d5 ¤   ¤   ¤   ¤   ::HUnlock(keyHandle);
e38f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
bba3a6 ¤   ¤   ¤   }
1187c7 ¤   ¤   ¤
d627e1 ¤   ¤   ¤   isSelected = ((LCheckBox *) FindPaneByID(
9d1955 ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_UpdateAllKeys))->
6d9c21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On;
78fbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
5c43f9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefUpdateAllKeys,
c304e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isSelected);
358109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
60f4f5 ¤   ¤   ¤   if (isSelected) {
e041f6 ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefNumber(
ef3320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   prefRef,
0fe260 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDaysUpdateAllKeys,
37e19b ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(edittext_UpdateAllKeys)->
36f091 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue());
b98f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
6ba3a6 ¤   ¤   ¤   }
51af5a
--a42e 000fd1f9d23401200a8 Page 19 of CAdminDialog.cp
db27e1 ¤   ¤   ¤   isSelected = ((LCheckBox *) FindPaneByID(
526123 ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_UpdateTrustedIntroducers))->
3b9c21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On;
46fbb8 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
e0e54f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefUpdateTrustedIntroducers,
c604e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isSelected);
b68109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
56f4f5 ¤   ¤   ¤   if (isSelected) {
6f41f6 ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefNumber(
563320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   prefRef,
30cd4e ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDaysUpdateTrustedIntroducers,
891516 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(edittext_UpdateTrustedIntroducers)->
b7f091 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue());
bd8f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
37a3a6 ¤   ¤   ¤   }
c287c7 ¤   ¤   ¤
51af5a
7ba019 ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(
9d0e48 ¤   ¤   ¤   ¤   ¤   ¤   prefRef,
2f5d78 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefAllowConventionalEncryption,
145172 ¤   ¤   ¤   ¤   ¤   ¤   ((LCheckBox *) FindPaneByID(
2fcc7f ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkbox_AllowConventionalEncryption))->
09001a ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On);
038109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
6c87c7 ¤   ¤   ¤
88cd91 ¤   ¤   ¤   FindPaneByID(edittext_MessageHeaderComment)->
55af02 ¤   ¤   ¤   ¤   GetDescriptor(edittextString);
ac04e9 ¤   ¤   ¤   if (edittextString.GetLength() != 0) {
466a7e ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefString(¤ prefRef,
fa0239 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefComments,
ea302a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   edittextString);
3b8f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
56a3a6 ¤   ¤   ¤   }
5eaf5a
417e2b ¤   ¤   ¤   // Save the admin prefs file and copy it to the resource fork
38de20 ¤   ¤   ¤   // of the installer
060330 ¤   ¤   ¤   pgpErr = PGPSavePrefFile(prefRef);
918109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
34a0c0 ¤   ¤   ¤   pgpErr = PGPClosePrefFile(prefRef);
8fef03 ¤   ¤   ¤   prefRef = kInvalidPGPPrefRef;
0e8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
3bc93d ¤   ¤   ¤   err = CopyFileToResource(¤  &tempSpec,
6fa8b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &reply.sfFile,
5b721e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAdminResType,
8af39c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ADMN_AdminPrefs);
d3c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
ad87c7 ¤   ¤   ¤
96b037 ¤   ¤   ¤   // Replace the %adminstr% in the installer
fd787e ¤   ¤   ¤   FindPaneByID(edittext_CompanyName)->
46af02 ¤   ¤   ¤   ¤   GetDescriptor(edittextString);
8c729a ¤   ¤   ¤   err = AddCompanyNameToInstaller(&reply.sfFile, edittextString);
64c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
e287c7 ¤   ¤   ¤
66a9a9 ¤   ¤   ¤   // Copy admin prefs to current machine's admin prefs
9b8ab5 ¤   ¤   ¤   FSSpec¤ adminPrefs;
ec87c7 ¤   ¤   ¤
c3ffe5 ¤   ¤   ¤   pgpErr = PGPOpenAdminPrefs(¤PGPGetContextMemoryMgr(gPGPContext),
8b4e75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &prefRef);
438109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
41eb4b ¤   ¤   ¤   pgpErr = PGPGetPrefFileSpec(¤   prefRef,
0a87de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &prefFileSpec);
338109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
0da0c0 ¤   ¤   ¤   pgpErr = PGPClosePrefFile(prefRef);
beef03 ¤   ¤   ¤   prefRef = kInvalidPGPPrefRef;
d48109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
e20412 ¤   ¤   ¤   pgpErr = PFLGetFSSpecFromFileSpec(¤ prefFileSpec,
11cbce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &adminPrefs);
168109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
9c8753 ¤   ¤   ¤   PFLFreeFileSpec(prefFileSpec);
f143e9 ¤   ¤   ¤   prefFileSpec = kInvalidPFLFileSpecRef;
0e7d17 ¤   ¤   ¤   err = FSpCopyFiles(PGPGetContextMemoryMgr(gPGPContext),
fd1aa2 ¤   ¤   ¤   ¤   ¤   ¤   &tempSpec, &adminPrefs);
--3c9c 0003c7d580c401200a8 Page 20 of CAdminDialog.cp
b0c801 ¤   ¤   ¤   PGPThrowIfOSErr_(err);¤ ¤   ¤   ¤   ¤   ¤   ¤
3787c7 ¤   ¤   ¤
9792cc ¤   ¤   ¤   // Copy the current client prefs to the resource fork of the
a081c5 ¤   ¤   ¤   // installer
5d1f4f ¤   ¤   ¤   if (((LCheckBox *) FindPaneByID(checkbox_CopyClientPrefs))->
839c3b ¤   ¤   ¤   ¤   ¤   GetValue() == Button_On) {
701372 ¤   ¤   ¤   ¤   FSSpec¤ ¤   ¤   clientPrefs;
242b85 ¤   ¤   ¤   ¤
4c8d9e ¤   ¤   ¤   ¤   pgpErr = PGPOpenClientPrefs(PGPGetContextMemoryMgr(gPGPContext),
305f52 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &prefRef);
7a8f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
b88478 ¤   ¤   ¤   ¤   pgpErr = PGPGetPrefFileSpec(¤   prefRef,
d843c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &prefFileSpec);
818f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
2d3681 ¤   ¤   ¤   ¤   pgpErr = PGPClosePrefFile(prefRef);
cbd6c6 ¤   ¤   ¤   ¤   prefRef = kInvalidPGPPrefRef;
e28f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
95b80b ¤   ¤   ¤   ¤   pgpErr = PFLGetFSSpecFromFileSpec(¤ prefFileSpec,
9c353e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &clientPrefs);
ee3360 ¤   ¤   ¤   ¤   err = FSpCopyFiles(PGPGetContextMemoryMgr(gPGPContext),
c57cc9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &clientPrefs, &tempSpec);
e187f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
ae16cb ¤   ¤   ¤   ¤   PFLFreeFileSpec(prefFileSpec);
8a52ce ¤   ¤   ¤   ¤   prefFileSpec = kInvalidPFLFileSpecRef;
bf0d4e ¤   ¤   ¤   ¤   pgpErr = PGPOpenPrefFile(¤  tempSpecRef,·
2c3cad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NULL,
469cf4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
9d3b77 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··¤ ¤   ¤   &prefRef);
a08f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
209f6e ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefNumber(¤ prefRef,
9d748d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDateOfLastSplashScreen,
0f88aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0);
518f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
4c6a7e ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefString(¤ prefRef,
0144e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefOwnerName,
175808 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   "");
738f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
126a7e ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefString(¤ prefRef,
2287cf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefCompanyName,
cb5808 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   "");
6f8f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
146a7e ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefString(¤ prefRef,
c75123 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefLicenseNumber,
955808 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   "");
718f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
bda8a3 ¤   ¤   ¤   ¤   pgpErr = PGPSetPrefBoolean(¤prefRef,
10c7da ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefFirstKeyGenerated,
86038e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false);
cc8f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
2a3dfb ¤   ¤   ¤   ¤   PGPRemovePref(¤ prefRef,·
2d1dea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefPGPtoolsMacPrivateData);
3c3dfb ¤   ¤   ¤   ¤   PGPRemovePref(¤ prefRef,·
ac1ed4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefPGPkeysMacMainWinPos);
3b3dfb ¤   ¤   ¤   ¤   PGPRemovePref(¤ prefRef,·
49d762 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefPGPkeysMacColumnData);
9ddb82 ¤   ¤   ¤   ¤   pgpErr = PGPSavePrefFile(prefRef);
c08f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
483681 ¤   ¤   ¤   ¤   pgpErr = PGPClosePrefFile(prefRef);
c8d6c6 ¤   ¤   ¤   ¤   prefRef = kInvalidPGPPrefRef;
958f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
5bd81a ¤   ¤   ¤   ¤   err = CopyFileToResource(¤  &tempSpec,
3daf88 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &reply.sfFile,
667525 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAdminResType,
76c98f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ADMN_ClientPrefs);
eb87f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
caa3a6 ¤   ¤   ¤   }
c3af5a
d0609c ¤   ¤   ¤   // switch to next panel
66c9fe ¤   ¤   ¤   LMultiPanelView *¤  multiPanel = (LMultiPanelView *) FindPaneByID(
23237c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pane_MultiPanel);
0ded43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
3c8edd ¤   ¤   ¤   multiPanel->SwitchToPanel(multiPanel->GetCurrentIndex() + 1);
--9c39 0004d73aa7f401200a8 Page 21 of CAdminDialog.cp
ca66d9 ¤   ¤   ¤   FindPaneByID(button_Next)->Disable();
435070 ¤   ¤   ¤   SetDefaultButton(button_Quit);
6a87c7 ¤   ¤   ¤
2a4b1c ¤   ¤   ¤   PFLFreeFileSpec(tempSpecRef);
4f6df5 ¤   ¤   ¤   result = true;
550fe4 ¤   ¤   }
2b1b52 ¤   ¤
4dda39 ¤   ¤   catch (...) {
b079ec ¤   ¤   ¤   if (PFLFileSpecRefIsValid(prefFileSpec)) {
1116cb ¤   ¤   ¤   ¤   PFLFreeFileSpec(prefFileSpec);
d3a3a6 ¤   ¤   ¤   }
038935 ¤   ¤   ¤   if (PFLFileSpecRefIsValid(tempSpecRef)) {
5472d9 ¤   ¤   ¤   ¤   PFLFreeFileSpec(tempSpecRef);
55a3a6 ¤   ¤   ¤   }
abc218 ¤   ¤   ¤   if (PGPPrefRefIsValid(prefRef)) {
8eb47f ¤   ¤   ¤   ¤   PGPClosePrefFile(prefRef);
2ca3a6 ¤   ¤   ¤   }
a04199 ¤   ¤   ¤   throw;
060fe4 ¤   ¤   }
119371 ¤   }
da67c5 ¤
bb64b2 ¤   return result;¤ ¤
edefe6 }
a0af5a
4d85ea ¤   OSStatus
2d6b1c CAdminDialog::CopyFileToResource(
0a9674 ¤   FSSpec *¤   inFileSpec,
b13ecc ¤   FSSpec *¤   inResourceFileSpec,
7da9c1 ¤   ResType¤¤   inType,
4c2371 ¤   ResIDT¤ ¤   inID)
b9bb36 {
de98d4 ¤   OSStatus¤   result;
324416 ¤   SInt16¤ ¤   resourceForkRefNum = -1;
9358bd ¤   SInt16¤ ¤   fileRefNum = -1;
8b67c5 ¤
de5168 ¤   try {
a4b326 ¤   ¤   StHandleBlock¤  handle((Size) 0);
7467c5 ¤
a515c4 ¤   ¤   // Open the files
13b518 ¤   ¤   ::SetResLoad(false);
f2b90c ¤   ¤   resourceForkRefNum = ::FSpOpenResFile(inResourceFileSpec, fsRdWrPerm);
2a17e4 ¤   ¤   ::SetResLoad(true);
2a8cd5 ¤   ¤   PGPThrowIfResError_();
5dd602 ¤   ¤   result = ::FSpOpenDF(inFileSpec, fsRdPerm, &fileRefNum);
86b423 ¤   ¤   PGPThrowIfOSErr_(result);
d51b52 ¤   ¤
d424fd ¤   ¤   // Add the resource if it doesn't already exist
0fbcc4 ¤   ¤   if (! ResourceExists(inType, inID, true)) {
cc8f83 ¤   ¤   ¤   ::AddResource(¤ handle,
321470 ¤   ¤   ¤   ¤   ¤   ¤   ¤   inType,
483bd2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   inID,
42e5f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   "\p");
7800aa ¤   ¤   ¤   PGPThrowIfResError_();
16d24f ¤   ¤   ¤   ::UpdateResFile(resourceForkRefNum);
4f00aa ¤   ¤   ¤   PGPThrowIfResError_();
363b7b ¤   ¤   ¤   ::DetachResource(handle);
8200aa ¤   ¤   ¤   PGPThrowIfResError_();
640fe4 ¤   ¤   }
23f7d7 ¤   ¤   ::SetHandleSize(handle, 1024);
8ab518 ¤   ¤   ::SetResLoad(false);
171b52 ¤   ¤
a46181 ¤   ¤   Handle¤ ¤   ¤   theResource = ::GetResource(inType, inID);
3c8c43 ¤   ¤   StHandleLocker¤ theLock(handle);
76148d ¤   ¤   SInt32¤ ¤   ¤   count = 1024;
9c2ec0 ¤   ¤   SInt32¤ ¤   ¤   offset = 0;
943ddb ¤   ¤   SInt32¤ ¤   ¤   dataLength;
311b52 ¤   ¤
5717e4 ¤   ¤   ::SetResLoad(true);
72d5d2 ¤   ¤   result = ::GetEOF(fileRefNum, &dataLength);
1bb423 ¤   ¤   PGPThrowIfOSErr_(result);
97cec3 ¤   ¤   ::SetResourceSize(theResource, dataLength);
4d8cd5 ¤   ¤   PGPThrowIfResError_();
--7a90 0005419bcf5401200a8 Page 22 of CAdminDialog.cp
914392 ¤   ¤   do {
ffd9b3 ¤   ¤   ¤   result = ::FSRead(fileRefNum, &count, *handle);
e187c7 ¤   ¤   ¤
2d2ae0 ¤   ¤   ¤   if ((result == noErr) || (result == eofErr)) {
46d620 ¤   ¤   ¤   ¤   ::WritePartialResource(¤theResource,
8173df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   offset,
5f55e4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *handle,
9cf462 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   count);
164159 ¤   ¤   ¤   ¤   PGPThrowIfResError_();
0664f0 ¤   ¤   ¤   ¤   offset += count;
0c042d ¤   ¤   ¤   } else {
885e23 ¤   ¤   ¤   ¤   PGPThrowOSErr_(result);
e1a3a6 ¤   ¤   ¤   }
e06676 ¤   ¤   } while (result == noErr);
7880d2 ¤   ¤   ::UpdateResFile(resourceForkRefNum);
b08cd5 ¤   ¤   PGPThrowIfResError_();
79a7c2 ¤   ¤   result = noErr;
bd9371 ¤   }
b367c5 ¤
d76227 ¤   catch (CComboError & exception) {
1ed741 ¤   ¤   result = exception.err;
cd9371 ¤   }
7367c5 ¤
2ee0a3 ¤   catch (...) {
75a088 ¤   ¤   result = fnfErr;
4c9371 ¤   }
0a67c5 ¤
f3920b ¤   if (resourceForkRefNum != -1) {
a2985d ¤   ¤   ::CloseResFile(resourceForkRefNum);
ba47be ¤   ¤   ::FlushVol(nil, inResourceFileSpec->vRefNum);
1d9371 ¤   }
9b1d24 ¤   if (fileRefNum != -1) {
b26add ¤   ¤   ::FSClose(fileRefNum);
6b9371 ¤   }
4067c5 ¤
c25d73 ¤   return result;
8aefe6 }
44af5a
e699cb ¤   pascal Boolean
ac3353 CAdminDialog::InstallerFileFilter(
1bffc1 ¤   CInfoPBPtr¤ inPB,
e33a9b ¤   Ptr¤¤   ¤   inDataP)
16bb36 {
6431f2 ¤   (void) inDataP;
6467c5 ¤
2a4be7 ¤   Boolean¤result = true;
d867c5 ¤
d4ed1c ¤   if (cpbFileCreator(inPB) == kPGPInstallerCreator) {
d56452 ¤   ¤   result = false;
229371 ¤   }
b667c5 ¤
0e5d73 ¤   return result;
daefe6 }
42af5a
2caf5a
98af5a
3e6d52 ¤   void
cc6269 CAdminDialog::UpdateSummaryPane()
66bb36 {
a53325 ¤   CString¤¤   none(STRx_AdminStrings, kNoneStringID);
d39233 ¤   CString¤¤   tab(STRx_AdminStrings, kTabStringID);
9e385e ¤   CString¤¤   data;
3c15ab ¤   Boolean¤¤   temp;
25f7ef ¤   PGPError¤   pgpErr;
460ae3 ¤   Handle¤ ¤   theSummary = ::NewHandle(0);
7d67c5 ¤
a05fa6 ¤   // Add site license
04f4f1 ¤   AppendStringToHandle(¤  theSummary,
28f4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
6bdc42 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCompanyNameStringID));
eaa346 ¤   FindPaneByID(edittext_CompanyName)->GetDescriptor(data);
5459c5 ¤   if (data.GetLength() != 0) {
--9059 0009c94b7bb401200a8 Page 23 of CAdminDialog.cp
b80a20 ¤   ¤   AppendStringToHandle(theSummary, data);
f7f037 ¤   } else {
5d50d1 ¤   ¤   AppendStringToHandle(theSummary, none);
149371 ¤   }
1667c5 ¤
573688 ¤   // Add Incoming ADK
a2f4f1 ¤   AppendStringToHandle(¤  theSummary,
87f4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
69572f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kIncomingADKStringID));
786b61 ¤   if (FindPaneByID(checkbox_UseIncomingADK)->GetValue() == Button_On) {
963d2c ¤   ¤   ((CKeyTable *) FindPaneByID(table_IncomingADK))->
f28908 ¤   ¤   ¤   GetFirstSelectedUserID(data);
b10a20 ¤   ¤   AppendStringToHandle(theSummary, data);
3ca3e0 ¤   ¤   if (FindPaneByID(checkbox_EnforceIncomingADK)->GetValue()
8faa4f ¤   ¤   == Button_On) {
6164c7 ¤   ¤   ¤   AppendStringToHandle(¤  theSummary,
4f79ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
5b6d08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEnforcedStringID));
9e45a6 ¤   ¤   } else {
d864c7 ¤   ¤   ¤   AppendStringToHandle(¤  theSummary,
9d79ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
e0a464 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNotEnforcedStringID));
510fe4 ¤   ¤   }
0af037 ¤   } else {
d650d1 ¤   ¤   AppendStringToHandle(theSummary, none);
fd9371 ¤   }
3baf5a
2890cc ¤   // Add Outgoing ADK
f6f4f1 ¤   AppendStringToHandle(¤  theSummary,
95f4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
692139 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kOutgoingADKStringID));
46c51b ¤   if (FindPaneByID(checkbox_UseOutgoingADK)->GetValue() == Button_On) {
1ba314 ¤   ¤   ((CKeyTable *) FindPaneByID(table_OutgoingADK))->
c58908 ¤   ¤   ¤   GetFirstSelectedUserID(data);
610a20 ¤   ¤   AppendStringToHandle(theSummary, data);
e57410 ¤   ¤   if (FindPaneByID(checkbox_EnforceOutgoingADK)->GetValue()
7aaa4f ¤   ¤   == Button_On) {
fa64c7 ¤   ¤   ¤   AppendStringToHandle(¤  theSummary,
d379ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
a36d08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEnforcedStringID));
d545a6 ¤   ¤   } else {
e564c7 ¤   ¤   ¤   AppendStringToHandle(¤  theSummary,
c179ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
60a464 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNotEnforcedStringID));
7d0fe4 ¤   ¤   }
37f037 ¤   } else {
c350d1 ¤   ¤   AppendStringToHandle(theSummary, none);
3a9371 ¤   }
45af5a
f0c240 ¤   // Add PGPdisk ADK
02f4f1 ¤   AppendStringToHandle(¤  theSummary,
d3f4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
edc791 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPdiskADKStringID));
f66419 ¤   if (FindPaneByID(checkbox_UsePGPdiskADK)->GetValue() == Button_On) {
b699ee ¤   ¤   ((CKeyTable *) FindPaneByID(table_PGPdiskADK))->
ae8908 ¤   ¤   ¤   GetFirstSelectedUserID(data);
2c0a20 ¤   ¤   AppendStringToHandle(theSummary, data);
44f037 ¤   } else {
0050d1 ¤   ¤   AppendStringToHandle(theSummary, none);
4f9371 ¤   }
3667c5 ¤
86b143 ¤   // Enforce Remote ADK
30f4f1 ¤   AppendStringToHandle(¤  theSummary,
07f4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
43491e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEnforceRemoteADKStringID));
7f35d1 ¤   if (FindPaneByID(checkbox_EnforceRemoteADKStrictness)->GetValue() == Button¶
6d5a55 _On) {
a87c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
c1f446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
be3416 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kYesStringID));
6af037 ¤   } else {
9c7c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
--715a 000170943e8401200a8 Page 24 of CAdminDialog.cp
3ff446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
59639b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoStringID));
a89371 ¤   }
5567c5 ¤
16a923 ¤   // Enforce Minimum Passphrase Length
c7f4f1 ¤   AppendStringToHandle(¤  theSummary,
baf4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
0fa823 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEnforceMinimumPassphraseLengthStringID¶
2a1445 ));
568544 ¤   if (FindPaneByID(checkbox_EnforceMinimumPassphraseCharacters)->
cece63 ¤   GetValue() == Button_On) {
d67c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
b3f446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
bb3416 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kYesStringID));
59fcb4 ¤   ¤   AppendStringToHandle(theSummary, tab);
bd68c4 ¤   ¤   FindPaneByID(edittext_MinimumPassphraseCharacters)->
9e077b ¤   ¤   ¤   GetDescriptor(data);
cd0a20 ¤   ¤   AppendStringToHandle(theSummary, data);
a97c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
c4f446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
3786a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCharactersStringID));
36f037 ¤   } else {
8f7c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
89f446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
d6639b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoStringID));
c99371 ¤   }
9daf5a
9e20d7 ¤   // Enforce Minimum Passphrase Quality
b8f4f1 ¤   AppendStringToHandle(¤  theSummary,
3bf4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
dd2307 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEnforceMinimumPassphraseQualityStringI¶
3df877 D));
92852c ¤   if (FindPaneByID(checkbox_EnforceMinimumPassphraseQuality)->
6cce63 ¤   GetValue() == Button_On) {
857c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
6ff446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
853416 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kYesStringID));
38fcb4 ¤   ¤   AppendStringToHandle(theSummary, tab);
eccd9f ¤   ¤   FindPaneByID(edittext_MinimumPassphraseQuality)->
eb077b ¤   ¤   ¤   GetDescriptor(data);
cd0a20 ¤   ¤   AppendStringToHandle(theSummary, data);
0f7c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
15f446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
339918 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPercentStringID));
01f037 ¤   } else {
077c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
66f446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
44639b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoStringID));
409371 ¤   }
eeaf5a
d0ca60 ¤   // Corporate Key
92f4f1 ¤   AppendStringToHandle(¤  theSummary,
1ff4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
0117f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCorporateKeyStringID));
0a2375 ¤   temp = false;
721266 ¤   if (FindPaneByID(checkbox_AutoSignCorporateKey)->
9bce63 ¤   GetValue() == Button_On) {
4df507 ¤   ¤   ((CKeyTable *) FindPaneByID(table_CorporateKey))->
ce8908 ¤   ¤   ¤   GetFirstSelectedUserID(data);
870a20 ¤   ¤   AppendStringToHandle(theSummary, data);
2e1d7a ¤   ¤   AppendStringToHandle(theSummary, "\p\r");
6fc58a ¤   ¤   temp = true;
437c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
76f446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
5e2968 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAutoSignStringID));
76e7c6 ¤   ¤   if (FindPaneByID(checkbox_CorporateKeyIsMetaIntroducer)->
58421c ¤   ¤   GetValue() == Button_On) {
21b37b ¤   ¤   ¤   AppendStringToHandle(theSummary, "\p\r");
2264c7 ¤   ¤   ¤   AppendStringToHandle(¤  theSummary,
ee79ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
4060eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMetaIntroducerStringID));
170fe4 ¤   ¤   }
--939a 00077ae9ccf401200a8 Page 25 of CAdminDialog.cp
faf037 ¤   } else {
2950d1 ¤   ¤   AppendStringToHandle(theSummary, none);
a19371 ¤   }
3f67c5 ¤
679049 ¤   // Encrypt to Keys Not Signed by Corporate Key
ceb446 ¤   if (temp) {
c1fd83 ¤   ¤   AppendStringToHandle(
5a719e ¤   ¤   ¤   theSummary,
82ab92 ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
8e6947 ¤   ¤   ¤   kEncryptToKeysNotSignedByCorporateKeyStringID));
a9648e ¤   ¤   if (FindPaneByID(checkbox_WarnIfNotSignedByCorporateKey)->
11421c ¤   ¤   GetValue() == Button_On) {
3764c7 ¤   ¤   ¤   AppendStringToHandle(¤  theSummary,
2279ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
c0af74 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWarnStringID));
2e45a6 ¤   ¤   } else {
3c64c7 ¤   ¤   ¤   AppendStringToHandle(¤  theSummary,
7d79ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
294ed1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDoNotWarnStringID));
2c0fe4 ¤   ¤   }
699371 ¤   }
f7af5a
ff527f ¤   // Add DesignatedRevoker
20f4f1 ¤   AppendStringToHandle(¤  theSummary,
96f4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
33412f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDesignatedRevokerStringID));
9af294 ¤   if (FindPaneByID(checkbox_EnableADesignatedRevokerKey)->
59ce63 ¤   GetValue() == Button_On) {
c56c2c ¤   ¤   ((CKeyTable *) FindPaneByID(table_DesignatedRevoker))->
9c8908 ¤   ¤   ¤   GetFirstSelectedUserID(data);
030a20 ¤   ¤   AppendStringToHandle(theSummary, data);
77f037 ¤   } else {
8650d1 ¤   ¤   AppendStringToHandle(theSummary, none);
8c9371 ¤   }
091b52 ¤   ¤
21e657 ¤   // Key Generation
19f4f1 ¤   AppendStringToHandle(¤  theSummary,
06f4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
707011 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeyGenerationStringID));
fe0c4f ¤   if (FindPaneByID(checkbox_AllowKeyGeneration)->
c9ce63 ¤   GetValue() == Button_On) {
b57c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
2ff446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
dfe5d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAllowedStringID));
fc59e3 ¤   ¤   if (FindPaneByID(checkbox_AllowKeyGeneration)->
714549 ¤   ¤   GetValue() == Button_Off) {
91ca8b ¤   ¤   ¤   AppendStringToHandle(
b087fb ¤   ¤   ¤   ¤   theSummary,
db3a0a ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
b9038c ¤   ¤   ¤   ¤   ¤   ¤   ¤   kRSAAlgorithmDisabledStringID));
ec0fe4 ¤   ¤   }
107c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
a5f446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
62ee61 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMinimumKeyGenerationSize));
530627 ¤   ¤   FindPaneByID(edittext_MinimumKeySize)->
5a077b ¤   ¤   ¤   GetDescriptor(data);
c30a20 ¤   ¤   AppendStringToHandle(theSummary, data);
38f037 ¤   } else {
4c7c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
49f446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
044a46 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNotAllowedStirngID));
aa9371 ¤   }
ba67c5 ¤
9d422f ¤   // Automatic Updates
8df4f1 ¤   AppendStringToHandle(¤  theSummary,
73f4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
f36e1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAutomaticUpdatesStringID));
2b2375 ¤   temp = false;
016604 ¤   if (FindPaneByID(checkbox_UpdateTrustedIntroducers)->
0ece63 ¤   GetValue() == Button_On) {
83c58a ¤   ¤   temp = true;
777c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
--7c9c 00050ff89eb401200a8 Page 26 of CAdminDialog.cp
3ff446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
385286 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEveryStringID));
df31d0 ¤   ¤   FindPaneByID(edittext_UpdateTrustedIntroducers)->
27077b ¤   ¤   ¤   GetDescriptor(data);
7f0a20 ¤   ¤   AppendStringToHandle(theSummary, data);
c17c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
dff446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
1a2a25 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kTrustedIntroducersStringID));
c99371 ¤   }
2ffba6 ¤   if (FindPaneByID(checkbox_UpdateAllKeys)->GetValue() == Button_On) {
0f2335 ¤   ¤   if (temp) {
14b37b ¤   ¤   ¤   AppendStringToHandle(theSummary, "\p\r");
4d0fe4 ¤   ¤   }
37c58a ¤   ¤   temp = true;
8e7c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
2af446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
525286 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEveryStringID));
79a22b ¤   ¤   FindPaneByID(edittext_UpdateAllKeys)->
ef077b ¤   ¤   ¤   GetDescriptor(data);
6a0a20 ¤   ¤   AppendStringToHandle(theSummary, data);
7c7c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
3bf446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
a63c9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAllKeysStringID));
099371 ¤   }
6c98e9 ¤   if (! temp) {
d850d1 ¤   ¤   AppendStringToHandle(theSummary, none);
36f828 ¤   }¤
58af5a
6ef889 ¤   // Allow Conventional Encryption
2b74d7 ¤   AppendStringToHandle(
cb0b6a ¤   ¤   theSummary,
73a5de ¤   ¤   CString(¤   STRx_AdminStrings,
f69b4a ¤   ¤   ¤   ¤   ¤   kAllowConventionalEncryptionStringID));
9b552b ¤   if (FindPaneByID(checkbox_AllowConventionalEncryption)->
eace63 ¤   GetValue() == Button_On) {
bc7c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
67f446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
ec3416 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kYesStringID));
d0f037 ¤   } else {
887c97 ¤   ¤   AppendStringToHandle(¤  theSummary,
37f446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
b6639b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoStringID));
cd9371 ¤   }
d9af5a
19bf0f ¤   // Message Header Comment
b8f4f1 ¤   AppendStringToHandle(¤  theSummary,
53f4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
4d4390 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMessageHeaderCommentStringID));
da70be ¤   FindPaneByID(edittext_MessageHeaderComment)->GetDescriptor(data);
d159c5 ¤   if (data.GetLength() != 0) {
520a20 ¤   ¤   AppendStringToHandle(theSummary, data);
64f037 ¤   } else {
d450d1 ¤   ¤   AppendStringToHandle(theSummary, none);
cc9371 ¤   }
f367c5 ¤
8bddfc ¤   // Pre-Loaded Keys
db3116 ¤   PGPKeySetRef¤   keySet = kInvalidPGPKeySetRef;
d550c2 ¤   PGPKeyListRef¤  keyList = kInvalidPGPKeyListRef;
782293 ¤   PGPKeyIterRef¤  keyIter = kInvalidPGPKeyIterRef;
2467c5 ¤
09f4f1 ¤   AppendStringToHandle(¤  theSummary,
f4f4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_AdminStrings,
fe0136 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPreLoadedKeysStringID));
4a5168 ¤   try {
560133 ¤   ¤   ((CKeyTable *) FindPaneByID(table_DefaultKeys))->
669f9a ¤   ¤   ¤   GetSelectedKeys(&keySet);
976c1f ¤   ¤   pgpErr = PGPOrderKeySet(¤   keySet,
fc7949 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPUserIDOrdering,
d63a97 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyList);
3fc0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
ecfbdb ¤   ¤   pgpErr = PGPNewKeyIter(¤keyList,
50e881 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyIter);
--9023 000437f962e401200a8 Page 27 of CAdminDialog.cp
f2c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
3baf5a
f4215f ¤   ¤   PGPKeyRef¤  ¤   key;
a9ea08 ¤   ¤   PGPSize¤¤   ¤   len;
47af5a
37dec7 ¤   ¤   while ((PGPKeyIterNext(keyIter, &key) == kPGPError_NoErr)
98f0fa ¤   ¤   && PGPKeyRefIsValid(key)) {
5d2406 ¤   ¤   ¤   AppendStringToHandle(theSummary, tab);
709b24 ¤   ¤   ¤   pgpErr = PGPGetPrimaryUserIDNameBuffer(¤key,
0363dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   data.GetBufferSize(),
2a911a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   data,
0d4e48 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &len);
0a6db9 ¤   ¤   ¤   if (pgpErr != kPGPError_BufferTooSmall) {
4e8f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
e4a3a6 ¤   ¤   ¤   }
c49c61 ¤   ¤   ¤   AppendStringToHandle(theSummary, data);
fbb37b ¤   ¤   ¤   AppendStringToHandle(theSummary, "\p\r");
c00fe4 ¤   ¤   }
ecaf5a
6410bc ¤   ¤   PGPFreeKeyIter(keyIter);
8ec7b5 ¤   ¤   PGPFreeKeyList(keyList);
e11df5 ¤   ¤   PGPFreeKeySet(keySet);
659371 ¤   }
3667c5 ¤
73e0a3 ¤   catch (...) {
46dd88 ¤   ¤   if (PGPKeyIterRefIsValid(keyIter)) {
082dd4 ¤   ¤   ¤   PGPFreeKeyIter(keyIter);
5a0fe4 ¤   ¤   }
e82a98 ¤   ¤   if (PGPKeyListRefIsValid(keyList)) {
ddfadd ¤   ¤   ¤   PGPFreeKeyList(keyList);
d10fe4 ¤   ¤   }
56d4c9 ¤   ¤   if (PGPKeySetRefIsValid(keySet)) {
b6918a ¤   ¤   ¤   PGPFreeKeySet(keySet);
8c0fe4 ¤   ¤   }
b1a33a ¤   ¤   throw;
e79371 ¤   }
aa67c5 ¤
f70db2 ¤   // Set the edit field
26cf58 ¤   ((LTextEditView *) FindPaneByID(texteditview_Summary))->
101f7f ¤   ¤   SetTextHandle(theSummary);
3765a5 ¤   ::DisposeHandle(theSummary);
b3efe6 }
39af5a
9daf5a
b0af5a
df85ea ¤   OSStatus
4d47d9 CAdminDialog::AddCompanyNameToInstaller(
6d9674 ¤   FSSpec *¤   inFileSpec,
d0a26a ¤   StringPtr¤  inCompanyName)
5abb36 {
7d98d4 ¤   OSStatus¤   result;
384416 ¤   SInt16¤ ¤   resourceForkRefNum = -1;
7167c5 ¤
c95168 ¤   try {
a3d9b2 ¤   ¤   CString¤adminStr(STRx_AdminStrings, kInstallerAdminStringID);
a4ee1b ¤   ¤   CString¤configuredStr(STRx_AdminStrings, kConfiguredForStringID);
fe1b52 ¤   ¤
2daf38 ¤   ¤   if (inCompanyName[0] > 0) {
6b1dd0 ¤   ¤   ¤   AppendPString(inCompanyName, configuredStr);
5545a6 ¤   ¤   } else {
f78cff ¤   ¤   ¤   CString client(STRx_AdminStrings, kClientStringID);
4687c7 ¤   ¤   ¤
f7d437 ¤   ¤   ¤   AppendPString(client, configuredStr);
bd0fe4 ¤   ¤   }
5db518 ¤   ¤   ::SetResLoad(false);
005d58 ¤   ¤   resourceForkRefNum = ::FSpOpenResFile(inFileSpec, fsRdWrPerm);
6117e4 ¤   ¤   ::SetResLoad(true);
9c8cd5 ¤   ¤   PGPThrowIfResError_();
a91b52 ¤   ¤
74e4ad ¤   ¤   // Get the TEXT resource
15d86f ¤   ¤   StResource¤ theText(kTextResType, TEXT_EasyInstall, true, true);
432d37 ¤   ¤   SInt32¤ ¤   mungerResult;
--bd21 001408c1ebb401200a8 Page 28 of CAdminDialog.cp
f11b52 ¤   ¤
487b08 ¤   ¤   // Modify and update the resource
2696e5 ¤   ¤   mungerResult = ::Munger(theText, 0, adminStr.GetConstCString(),
9d2bcd ¤   ¤   ¤   ¤   ¤   ¤   adminStr.GetLength(), configuredStr.GetConstCString(),
ac6d4b ¤   ¤   ¤   ¤   ¤   ¤   configuredStr.GetLength());
cfdaa1 ¤   ¤   PGPThrowIf_(mungerResult < 0);
c2a299 ¤   ¤   ::ChangedResource(theText);
56fb5f ¤   ¤   PGPThrowIfResError_();¤ ¤
e980d2 ¤   ¤   ::UpdateResFile(resourceForkRefNum);
6c8cd5 ¤   ¤   PGPThrowIfResError_();
aaa7c2 ¤   ¤   result = noErr;
4a9371 ¤   }
c067c5 ¤
d26227 ¤   catch (CComboError & exception) {
11d741 ¤   ¤   result = exception.err;
9b9371 ¤   }
9167c5 ¤
2ae0a3 ¤   catch (...) {
1fa088 ¤   ¤   result = fnfErr;
d49371 ¤   }
9467c5 ¤
c7920b ¤   if (resourceForkRefNum != -1) {
58985d ¤   ¤   ::CloseResFile(resourceForkRefNum);
da76c6 ¤   ¤   ::FlushVol(nil, inFileSpec->vRefNum);
0a9371 ¤   }
1e67c5 ¤
e05d73 ¤   return result;
faefe6 }
6faf5a
03af5a
8baf5a
0f7e69 ¤   Boolean
a52c38 CAdminDialog::HandleKeyPress(
31d5cf ¤   const EventRecord &¤inKeyEvent)
d4bb36 {
0585e5 ¤   Boolean¤handled = false;
939ab2 ¤   SInt16¤ currentPanel = dynamic_cast<LMultiPanelView &>(
9c442b ¤   ¤   ¤   ¤   ¤   ¤   ¤   *FindPaneByID(pane_MultiPanel)).GetCurrentIndex();
88af5a
e6da76 ¤   // Skip the unneeded panes
d14c11 ¤   if (currentPanel == panel_Summary) {
c3bf6e ¤   ¤   Char16¤ theKey = (Char16(inKeyEvent.message) & charCodeMask);
691b52 ¤   ¤
81cefc ¤   ¤   switch (theKey) {
ab6f81 ¤   ¤   ¤   case char_PageUp:
e2895e ¤   ¤   ¤   case char_PageDown:
8ff776 ¤   ¤   ¤   {
acdd33 ¤   ¤   ¤   ¤   SInt16¤ ¤   ¤   thePart = (theKey == char_PageUp) ? kControlPag¶
bdbfd7 eUpPart :
d424f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kControlPageDownPart;
efed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
e7acaa ¤   ¤   ¤   ¤   dynamic_cast<LScrollerView &>(*FindPaneByID(scroller_Summary)).¶
97f5b7 VertScroll(thePart);
cb9879 ¤   ¤   ¤   ¤   handled = true;
9ca3a6 ¤   ¤   ¤   }
e8cdcb ¤   ¤   ¤   break;
ca0fe4 ¤   ¤   }
ea9371 ¤   }
8267c5 ¤
e41779 ¤   if (! handled) {
03714b ¤   ¤   handled = LGADialog::HandleKeyPress(inKeyEvent);
c99371 ¤   }
4c67c5 ¤
a68738 ¤   return handled;
40efe6 }
--44c7 0014be56286401200a9 Page 1 of CAdminDialog.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
1a20ef ¤   $Id: CAdminDialog.h,v 1.8.2.1.2.1 1998/11/12 03:07:00 heller Exp $
14f7f7 ____________________________________________________________________________*/
f6af5a
5e8d55 #pragma once·
b0af5a
33f0a0 #include <LGADialog.h>
0caf5a
c94a94 class CAdminDialog : public LGADialog {
825ed4 public:
7f8e15 ¤   enum¤   { class_ID = 'AdmD' };
c8af5a
dd6e72 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CAdminDialog(LStream * inStream);
1898b5 ¤   virtual¤¤   ¤   ¤   ¤   ~CAdminDialog();
bbaf5a
c89e8c ¤   virtual void¤   ¤   ¤   ListenToMessage(MessageT inMessage,
b2f103 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void * ioParam );
89af5a
a980fe ¤   virtual Boolean¤¤   ¤   HandleKeyPress(const EventRecord & inKeyEvent );
f1af5a
cba2d3 protected:
4f78f5 ¤   Boolean¤¤   ¤   ¤   ¤   mDirty;
30fc98 ¤   FSSpec¤ ¤   ¤   ¤   ¤   mBaseInstallerSpec;
c167c5 ¤
3e9cd6 ¤   virtual Boolean¤¤   ¤   AttemptQuitSelf(SInt32 inSaveOption);
5bf7c8 ¤   virtual¤void¤   ¤   ¤   FinishCreateSelf();
94af5a
6c5e74 ¤   Boolean¤¤   ¤   ¤   ¤   VerifyEditFieldValues();
a5465e ¤   void¤   ¤   ¤   ¤   ¤   UpdateSummaryPane();
7667c5 ¤
670c34 ¤   Boolean¤¤   ¤   ¤   ¤   Save();
415aa9 ¤   OSStatus¤   ¤   ¤   ¤   AddCompanyNameToInstaller(FSSpec * inFileSpec,
f118b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringPtr inCompanyName);
3a87ce ¤   OSStatus¤   ¤   ¤   ¤   CopyFileToResource(FSSpec * inFileSpec,
9e42f3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FSSpec * inResourceFileSpec,
bde40b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ResType inType, ResIDT inID);
c8af5a
9cd1f3 ¤   static pascal Boolean¤  InstallerFileFilter(CInfoPBPtr inPB, Ptr inDataP);
4bbf26 };¶
--42b1 00001e0b05e401200aa Page 1 of CKeyTable.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
0a4bb5 ¤   $Id: CKeyTable.cp,v 1.24.8.1 1998/11/12 03:07:01 heller Exp $
fbf7f7 ____________________________________________________________________________*/
26af5a
907b32 #include <PP_KeyCodes.h>
3edd56 #include <PP_Messages.h>
8da85e #include <LArrayIterator.h>
ad15dd #include <LComparator.h>
097c52 #include <LTableMonoGeometry.h>
7e2ab7 #include <LTableSingleSelector.h>
b48848 #include <LTableMultiSelector.h>
287b38 #include <LTableArrayStorage.h>
1de8ae #include <UDrawingUtils.h>
8a8f92 #include <UGAColorRamp.h>
aaffe3 #include <UGraphicUtils.h>
92f8a6 #include <UTextTraits.h>
68af5a
454919 #include "pgpUtilities.h"
3785c2 #include "MacStrings.h"
7aaf5a
a20bb4 #include "CString.h"
84af5a
1078bc #include "PGPadminGlobals.h"
fd6ff8 #include "CKeyTable.h"
fbaf5a
6faf5a
03c01c const SInt16¤   kUserIDColumnWidth¤ ¤   =¤  186;
c18321 const SInt16¤   kCreationColumnLeft¤¤   =¤  192;
9fda38 const SInt16¤   kCreationColumnWidth¤   =¤  65;
38a8e6 const SInt16¤   kSizeColumnLeft¤¤   ¤   =¤  266;
7834f6 const SInt16¤   kSizeColumnWidth¤   ¤   =¤  75;
9d0e6b const SInt16¤   kIconWidth¤ ¤   ¤   ¤   =¤  16;
be663a const SInt16¤   kIconHeight¤¤   ¤   ¤   =¤  16;
bb8915 const SInt16¤   kIconIndent¤¤   ¤   ¤   =¤  2;
981d42 const SInt16¤   kUserIDIndent¤  ¤   ¤   =¤  4;
33b9fd const SInt16¤   kVerticalIndent¤¤   ¤   =¤  3;
a8af5a
a581ea const ResIDT¤   Txtr_Geneva9¤   ¤   ¤   =¤  130;
69af5a
aa6080 const ResIDT¤   icmx_DHKey¤ ¤   ¤   ¤   =¤  1000;
f2b60d const ResIDT¤   icmx_RSAKey¤¤   ¤   ¤   =¤  1001;
c8af5a
d3af5a
d48e9b extern¤ PGPContextRef¤  gPGPContext;
55af5a
70af5a
a0af5a
8c177b class CKeyIDComparator¤ :¤  public LComparator {
51a7cb ¤   virtual Int32¤  ¤   Compare(
23d8e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const void*¤¤   ¤   inItemOne,
dcca35 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const void* ¤   ¤   inItemTwo,
1c9d47 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   inSizeOne,
54b692 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   inSizeTwo) const;
8a82f7 };
b1af5a
6caf5a
1f63f0 CKeyTable::CKeyTable(
ddcbb0 ¤   LStream *¤  inStream)
cdc454 ¤   ¤   : LTableView(inStream), mFilterRef(kInvalidPGPFilterRef),
d8885d ¤   ¤   ¤   mKeyIterRef(kInvalidPGPKeyIterRef),
222eba ¤   ¤   ¤   mKeyListRef(kInvalidPGPKeyListRef), mDisplayList(false),
3f3fea ¤   ¤   ¤   mSelectAllEnabled(false)
e9bb36 {
54b46a ¤   FontInfo¤   fontInfo;
bf96a1 ¤   SPoint32¤   scrollUnit;
df67c5 ¤
018508 ¤   UTextTraits::SetPortTextTraits(Txtr_Geneva9);
--0bc0 000faef74d2401200aa Page 2 of CKeyTable.cp
c4e1b1 ¤   ::GetFontInfo(&fontInfo);
755e59 ¤   scrollUnit.v = fontInfo.ascent + fontInfo.leading + fontInfo.descent
ad5f1c ¤   ¤   ¤   ¤   ¤   + (kVerticalIndent * 2);
1c523b ¤   scrollUnit.h = 1;
e79302 ¤   SetTableGeometry(new LTableMonoGeometry(¤   this,
21f454 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mFrameSize.width,
18cac0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   scrollUnit.v));
0ad9de ¤   SetTableStorage(new LTableArrayStorage(¤this,
643d37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(PGPKeyRef)));
bafd9b ¤   InsertCols(1, 0);
b94aa6 ¤   SetScrollUnit(scrollUnit);
578eb7 ¤   mCustomHilite = true;
5aefe6 }
7aaf5a
54af5a
90af5a
fb66a8 CKeyTable::~CKeyTable()
05bb36 {
d516c3 ¤   if (PGPFilterRefIsValid(mFilterRef)) {
e77e19 ¤   ¤   PGPFreeFilter(mFilterRef);
1a9371 ¤   }
bea8ea ¤   FreeAllStoredKeys();
2defe6 }
daaf5a
74af5a
a8af5a
e76d52 ¤   void
1a5d23 CKeyTable::SetTableInfo(
5d7339 ¤   PGPFilterRef¤   inFilter,
310622 ¤   Boolean¤¤   ¤   inMultiSelector)
84bb36 {
3816c3 ¤   if (PGPFilterRefIsValid(mFilterRef)) {
a37e19 ¤   ¤   PGPFreeFilter(mFilterRef);
ee9371 ¤   }
b9c76c ¤   mFilterRef = inFilter;
b267c5 ¤
0035f7 ¤   delete mTableSelector;
48273e ¤   if (inMultiSelector) {
b4db80 ¤   ¤   SetTableSelector(new LTableMultiSelector(this));
ee111c ¤   ¤   mSelectAllEnabled = true;
47f037 ¤   } else {
c29740 ¤   ¤   SetTableSelector(new LTableSingleSelector(this));
a79371 ¤   }
5eefe6 }
b6af5a
adaf5a
e4af5a
636d52 ¤   void
595d23 CKeyTable::SetTableInfo(
e868f9 ¤   PGPKeySetRef¤   inKeySet)
a9bb36 {
72f7ef ¤   PGPError¤   pgpErr;
6067c5 ¤
245c08 ¤   // Remove all current rows
2416c3 ¤   if (PGPFilterRefIsValid(mFilterRef)) {
627e19 ¤   ¤   PGPFreeFilter(mFilterRef);
49b16b ¤   ¤   mFilterRef = kInvalidPGPFilterRef;
639371 ¤   }
48a8ea ¤   FreeAllStoredKeys();
9b67d2 ¤   RemoveAllRows(false);
da67c5 ¤
3035f7 ¤   delete mTableSelector;
b69e4c ¤   SetTableSelector(nil);
0b67c5 ¤
ed66c2 ¤   pgpErr = PGPOrderKeySet(¤   inKeySet,
902ce5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPUserIDOrdering,
c8af28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mKeyListRef);
954c85 ¤   PGPThrowIfPGPErr_(pgpErr);
d2a1d9 ¤   pgpErr = PGPNewKeyIter(¤mKeyListRef,
ac4e49 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mKeyIterRef);
e04c85 ¤   PGPThrowIfPGPErr_(pgpErr);
faaf5a
--fa67 0001e0b4c0a401200aa Page 3 of CKeyTable.cp
ba1502 ¤   PGPKeyRef¤  ¤   key;
75af5a
0b9c35 ¤   while ((PGPKeyIterNext(mKeyIterRef, &key) == kPGPError_NoErr)
517b06 ¤   && PGPKeyRefIsValid(key)) {
d7c71f ¤   ¤   // Add the keyref to the table
12a4fe ¤   ¤   InsertRows(¤1,
3f3c3e ¤   ¤   ¤   ¤   ¤   LArray::index_Last,
ba93be ¤   ¤   ¤   ¤   ¤   &key);¤ ¤   ¤   ¤   ¤
3f9371 ¤   }
aeaf5a
37a8f4 ¤   mDisplayList = true;
29efe6 }
53af5a
f3af5a
61af5a
c8af5a
606d52 ¤   void
0e4259 CKeyTable::GetSelectedKeys(
0407b4 ¤   Handle outHandle)
04bb36 {
c1d564 ¤   STableCell¤ ¤   theCell(0, 0);
851502 ¤   PGPKeyRef¤  ¤   key;
e919db ¤   UInt32¤ ¤   ¤   len = sizeof(key);
c803e8 ¤   PGPError¤   ¤   pgpErr;
be6714 ¤   PGPKeySetRef¤   singleKeySetRef = kInvalidPGPKeySetRef;
fc21b0 ¤   UInt32¤ ¤   ¤   keyBufferLen;
ed2b2e ¤   void *¤ ¤   ¤   keyBuffer = nil;
d867c5 ¤
e25168 ¤   try {
c0a97b ¤   ¤   ::SetHandleSize(outHandle, 0);
c8c4a6 ¤   ¤   while (GetNextSelectedCell(theCell)) {
1161f8 ¤   ¤   ¤   GetCellData(¤   theCell,
1a4368 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &key,
8b9260 ¤   ¤   ¤   ¤   ¤   ¤   ¤   len);
6e4669 ¤   ¤   ¤   pgpErr = PGPNewSingletonKeySet(key, &singleKeySetRef);
9d8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
9d7046 ¤   ¤   ¤   pgpErr = PGPExportKeySet(singleKeySetRef,
2f2cfe ¤   ¤   ¤   ¤   ¤   ¤   PGPOAllocatedOutputBuffer(¤ gPGPContext,
606b59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyBuffer,
6a4c29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::MaxBlock(),
8bc12a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyBufferLen),
1cdc36 ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(gPGPContext));
938109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
7dcb81 ¤   ¤   ¤   ::PtrAndHand(keyBuffer, outHandle, keyBufferLen);
a257c9 ¤   ¤   ¤   PGPThrowIfMemError_();
b6b88f ¤   ¤   ¤   PGPFreeKeySet(singleKeySetRef);
99ac8a ¤   ¤   ¤   singleKeySetRef = kInvalidPGPKeySetRef;
cee975 ¤   ¤   ¤   PGPFreeData(keyBuffer);
27f20e ¤   ¤   ¤   keyBuffer = nil;
790fe4 ¤   ¤   }
1b9371 ¤   }
fd67c5 ¤
02e0a3 ¤   catch (...) {
1e7298 ¤   ¤   if (PGPKeySetRefIsValid(singleKeySetRef)) {
d7b88f ¤   ¤   ¤   PGPFreeKeySet(singleKeySetRef);
570fe4 ¤   ¤   }
e9d436 ¤   ¤   if (keyBuffer != nil) {
62e975 ¤   ¤   ¤   PGPFreeData(keyBuffer);
b10fe4 ¤   ¤   }
b8a33a ¤   ¤   throw;
939371 ¤   }
13efe6 }
33af5a
edaf5a
7baf5a
cb6d52 ¤   void
6c4259 CKeyTable::GetSelectedKeys(
9c2b7e ¤   PGPKeySetRef *¤ outKeys)
04bb36 {
06d564 ¤   STableCell¤ ¤   theCell(0, 0);
9f1502 ¤   PGPKeyRef¤  ¤   key;
1e19db ¤   UInt32¤ ¤   ¤   len = sizeof(key);
--b81c 000f75d9448401200aa Page 4 of CKeyTable.cp
9b03e8 ¤   PGPError¤   ¤   pgpErr;
efbacd ¤   PGPKeySetRef¤   singleKeySet = kInvalidPGPKeySetRef;
81af5a
505168 ¤   try {
2ab290 ¤   ¤   pgpErr = PGPNewKeySet(PGPGetKeyListContext(mKeyListRef), outKeys);
28c4a6 ¤   ¤   while (GetNextSelectedCell(theCell)) {
ec61f8 ¤   ¤   ¤   GetCellData(¤   theCell,
e94368 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &key,
bd9260 ¤   ¤   ¤   ¤   ¤   ¤   ¤   len);
fe42bb ¤   ¤   ¤   pgpErr = PGPNewSingletonKeySet(key, &singleKeySet);
918109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
48ee8d ¤   ¤   ¤   pgpErr = PGPAddKeys(¤   singleKeySet,
f1c0d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *outKeys);
798109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
912453 ¤   ¤   ¤   PGPFreeKeySet(singleKeySet);
6c70e0 ¤   ¤   ¤   singleKeySet = kInvalidPGPKeySetRef;
210fe4 ¤   ¤   }
7e9371 ¤   }
daaf5a
d0e0a3 ¤   catch (...) {
294159 ¤   ¤   if (PGPKeySetRefIsValid(singleKeySet)) {
cd2453 ¤   ¤   ¤   PGPFreeKeySet(singleKeySet);
f30fe4 ¤   ¤   }
60a33a ¤   ¤   throw;
969371 ¤   }
9defe6 }
d4af5a
5caf5a
d1af5a
9d6d52 ¤   void
a3f688 CKeyTable::GetFirstSelectedKeyID(
a930c3 ¤   PGPKeyID *¤ ¤   outKeyID,
dac930 ¤   SInt32 *¤   ¤   outAlgorithm)
6ebb36 {
65d564 ¤   STableCell¤ ¤   theCell(0, 0);
a61502 ¤   PGPKeyRef¤  ¤   key;
ae19db ¤   UInt32¤ ¤   ¤   len = sizeof(key);
9803e8 ¤   PGPError¤   ¤   pgpErr;
10af5a
cd5168 ¤   try {
00782e ¤   ¤   if (GetNextSelectedCell(theCell)) {
eb61f8 ¤   ¤   ¤   GetCellData(¤   theCell,
5d4368 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &key,
a69260 ¤   ¤   ¤   ¤   ¤   ¤   ¤   len);
7ca537 ¤   ¤   ¤   pgpErr = PGPGetKeyIDFromKey(key, outKeyID);
188109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
2bb4a2 ¤   ¤   ¤   if (outAlgorithm != nil) {
ea6865 ¤   ¤   ¤   ¤   pgpErr = PGPGetKeyNumber(¤  key,
d55e67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropAlgID,
a96772 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPInt32 *) outAlgorithm);
878f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
eea3a6 ¤   ¤   ¤   }
0b45a6 ¤   ¤   } else {
790fe4 ¤   ¤   }
f79371 ¤   }
3e67c5 ¤
00e0a3 ¤   catch (...) {
58a33a ¤   ¤   throw;
589371 ¤   }
f6efe6 }
56af5a
5faf5a
01af5a
0d6d52 ¤   void
b9fa06 CKeyTable::GetFirstSelectedUserID(
1bc15b ¤   CString &¤  outUserID)
15bb36 {
bdd564 ¤   STableCell¤ ¤   theCell(0, 0);
061502 ¤   PGPKeyRef¤  ¤   key;
7e19db ¤   UInt32¤ ¤   ¤   len = sizeof(key);
3f03e8 ¤   PGPError¤   ¤   pgpErr;
f7af5a
--9e68 0007a08bec8401200aa Page 5 of CKeyTable.cp
a6f048 ¤   if (GetNextSelectedCell(theCell)) {
fb5c90 ¤   ¤   GetCellData(¤   theCell,
f07460 ¤   ¤   ¤   ¤   ¤   ¤   &key,
73a568 ¤   ¤   ¤   ¤   ¤   ¤   len);
8bc64d ¤   ¤   pgpErr = PGPGetPrimaryUserIDNameBuffer(key,
e836c2 ¤   ¤   ¤   outUserID.GetBufferSize(), outUserID, &len);
8fc3b8 ¤   ¤   if (pgpErr != kPGPError_BufferTooSmall) {
e38109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
730fe4 ¤   ¤   }
b09371 ¤   }
d8efe6 }
f3af5a
f8af5a
fcaf5a
b2af5a
0f6d52 ¤   void
e79427 CKeyTable::ShowSelf()
48bb36 {
1663b3 ¤   if (! mDisplayList) {
ec9497 ¤   ¤   STableCell¤ ¤   theCell(0, 0);
39ce5f ¤   ¤   PGPKeyID¤   ¤   keyIDRef;
82215f ¤   ¤   PGPKeyRef¤  ¤   key;
672031 ¤   ¤   PGPKeySetRef¤   keySet = kInvalidPGPKeySetRef;
f1643c ¤   ¤   PGPKeySetRef¤   filteredSet = kInvalidPGPKeySetRef;
b8aeb6 ¤   ¤   PGPError¤   ¤   pgpErr;
115d23 ¤   ¤   LArray¤ ¤   ¤   selectedKeys(¤  sizeof(PGPKeyID),
db39d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   new CKeyIDComparator,
2ecad5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true);
6c1797 ¤   ¤   UInt32¤ ¤   ¤   len = sizeof(key);
c61b52 ¤   ¤
b0c4c1 ¤   ¤   // Save the currently selected keys
75c4a6 ¤   ¤   while (GetNextSelectedCell(theCell)) {
0961f8 ¤   ¤   ¤   GetCellData(¤   theCell,
e74368 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &key,
fe9260 ¤   ¤   ¤   ¤   ¤   ¤   ¤   len);
402d6e ¤   ¤   ¤   pgpErr = PGPGetKeyIDFromKey(key, &keyIDRef);
df8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
480949 ¤   ¤   ¤   selectedKeys.InsertItemsAt(¤1,
dae0b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LArray::index_Last,
ed06ec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyIDRef);
720fe4 ¤   ¤   }
771b52 ¤   ¤
c3d077 ¤   ¤   // Remove all current rows
509cb7 ¤   ¤   FreeAllStoredKeys();
e2ee86 ¤   ¤   RemoveAllRows(false);
e31b52 ¤   ¤
1dfd2a ¤   ¤   try {
b27a10 ¤   ¤   ¤   // Get new list of keys
a0e732 ¤   ¤   ¤   pgpErr = PGPOpenDefaultKeyRings(¤   gPGPContext,
504446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
730b56 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keySet);
7e8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
905fe9 ¤   ¤   ¤   if (PGPFilterRefIsValid(mFilterRef)) {
331b92 ¤   ¤   ¤   ¤   pgpErr = PGPFilterKeySet(¤  keySet,
68f374 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mFilterRef,
1b39e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &filteredSet);
118f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
83b39e ¤   ¤   ¤   ¤   pgpErr = PGPOrderKeySet(¤   filteredSet,
6a3202 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPUserIDOrdering,
676186 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mKeyListRef);
b5042d ¤   ¤   ¤   } else {
43e20e ¤   ¤   ¤   ¤   pgpErr = PGPOrderKeySet(¤   keySet,
d03202 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPUserIDOrdering,
0e6186 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mKeyListRef);
d769c5 ¤   ¤   ¤   }¤  ¤
a88109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
2cf5fc ¤   ¤   ¤   pgpErr = PGPNewKeyIter(¤mKeyListRef,
150763 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mKeyIterRef);
288109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
b29fa0 ¤   ¤   ¤   while ((PGPKeyIterNext(mKeyIterRef, &key) == kPGPError_NoErr)
1335af ¤   ¤   ¤   && PGPKeyRefIsValid(key)) {
7a58cb ¤   ¤   ¤   ¤   // Add the keyref to the table
--e4f8 0009083521a401200aa Page 6 of CKeyTable.cp
b75237 ¤   ¤   ¤   ¤   InsertRows(¤1,
41ac08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   LArray::index_Last,
86d690 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &key);
06531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
b92d2d ¤   ¤   ¤   ¤   // Check to see if we need to select the cell
340bdb ¤   ¤   ¤   ¤   pgpErr = PGPGetKeyIDFromKey(key, &keyIDRef);
ba8f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
27dc77 ¤   ¤   ¤   ¤   if (selectedKeys.FetchIndexOf(&keyIDRef)
9d21ad ¤   ¤   ¤   ¤   != LArray::index_Bad) {
d41b8e ¤   ¤   ¤   ¤   ¤   STableCell¤ selectedCell;
1dae30 ¤   ¤   ¤   ¤   ¤
bbc4f7 ¤   ¤   ¤   ¤   ¤   GetTableSize(selectedCell.row, selectedCell.col);
ddbe59 ¤   ¤   ¤   ¤   ¤   SelectCell(selectedCell);
7d2613 ¤   ¤   ¤   ¤   }
2fa3a6 ¤   ¤   ¤   }
d00fe4 ¤   ¤   }
331b52 ¤   ¤
8cda39 ¤   ¤   catch (...) {
200fe4 ¤   ¤   }
721b52 ¤   ¤
77c754 ¤   ¤   // Free the key ids
d9416a ¤   ¤   LArrayIterator¤ iterator(selectedKeys);
271b52 ¤   ¤
324dbf ¤   ¤   if (PGPKeySetRefIsValid(filteredSet)) {
9f836c ¤   ¤   ¤   PGPFreeKeySet(filteredSet);
c00fe4 ¤   ¤   }
20d4c9 ¤   ¤   if (PGPKeySetRefIsValid(keySet)) {
e3918a ¤   ¤   ¤   PGPFreeKeySet(keySet);
230fe4 ¤   ¤   }
fc9371 ¤   }
0767c5 ¤
f029bd ¤   LTableView::Show();
3067c5 ¤
d56229 ¤   SwitchTarget( this );
1fefe6 }
60af5a
12af5a
bcaf5a
0b6d52 ¤   void
64e9b4 CKeyTable::ClickSelf(
12e06f ¤   const SMouseDownEvent &¤inMouseDown)
fdbb36 {
4cc8c2 ¤   LTableView::ClickSelf(inMouseDown);
7cdbbb ¤   BroadcastMessage(GetPaneID());
e3efe6 }
c3af5a
52af5a
5aaf5a
876d52 ¤   void
0c7d64 CKeyTable::DrawSelf()
68bb36 {
881fc1 ¤   Rect¤   frame;
c267c5 ¤
a3a659 ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray1));
c5ccbb ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
4140bf ¤   CalcLocalFrameRect(frame);
65c7a1 ¤   {
86296f ¤   ¤   StDeviceLoop¤   devLoop(frame);¤¤
3e77ad ¤   ¤   SInt16¤ ¤   ¤   depth;
00af5a
3adf27 ¤   ¤   while(devLoop.NextDepth(depth)) {
21a129 ¤   ¤   ¤   if(depth >= 8) {
7e48b8 ¤   ¤   ¤   ¤   ::PaintRect(&frame);
7e042d ¤   ¤   ¤   } else {
7630c1 ¤   ¤   ¤   ¤   ::EraseRect(&frame);
5ca3a6 ¤   ¤   ¤   }
cf0fe4 ¤   ¤   }
ce9371 ¤   }
72de04 ¤   LTableView::DrawSelf();
4cefe6 }
3caf5a
90af5a
--865f 000d7c43ef0401200aa Page 7 of CKeyTable.cp
e0af5a
2c6d52 ¤   void
3bb1c7 CKeyTable::DrawCell(
6925d6 ¤   const STableCell &¤ inCell,
ea6c0b ¤   const Rect &¤   ¤   inLocalRect)
cfbb36 {
576951 ¤   Rect¤   ¤   ¤   theRect = inLocalRect;
d6dc7b ¤   StDeviceLoop¤   devLoop(inLocalRect);
8d6385 ¤   SInt16¤ ¤   ¤   depth;
5967c5 ¤
eab364 ¤   while (devLoop.NextDepth(depth)) {
4ee2ad ¤   ¤   if (depth >= 8) {
7c8e65 ¤   ¤   ¤   theRect.right = theRect.left + kUserIDColumnWidth;
7c12af ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
c30b02 ¤   ¤   ¤   ::PaintRect(&theRect);
b20f63 ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray1));
96d0fd ¤   ¤   ¤   theRect.left += kUserIDColumnWidth;
177244 ¤   ¤   ¤   theRect.right = inLocalRect.right;
330b02 ¤   ¤   ¤   ::PaintRect(&theRect);
ae3e1d ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_White));
76cba3 ¤   ¤   ¤   ::MoveTo(inLocalRect.left, inLocalRect.bottom - 1);
8563b0 ¤   ¤   ¤   ::LineTo(inLocalRect.right - 1, inLocalRect.bottom - 1);
b3447a ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
8c45a6 ¤   ¤   } else {
7a447a ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
d26581 ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
b0373a ¤   ¤   ¤   ::EraseRect(&inLocalRect);
dd0fe4 ¤   ¤   }
eb1b52 ¤   ¤
4b2373 ¤   ¤   // Draw the contents
1faeb6 ¤   ¤   PGPError¤   ¤   pgpErr;
28215f ¤   ¤   PGPKeyRef¤  ¤   key;
75a5db ¤   ¤   PGPInt32¤   ¤   algorithm;
803690 ¤   ¤   SInt16¤ ¤   ¤   iconTop = inLocalRect.top + (GetRowHeight(inCell.row)
df8b59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   - kIconHeight) / 2;
b293d5 ¤   ¤   SInt16¤ ¤   ¤   iconRight = inLocalRect.left + kIconIndent
7f0416 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   + kIconWidth;
967f3d ¤   ¤   Rect¤   ¤   ¤   drawRect = {iconTop, inLocalRect.left + kIconIndent,
a50827 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   iconTop + kIconHeight, iconRight};
ca7b84 ¤   ¤   SInt16¤ ¤   ¤   just;
0b4815 ¤   ¤   Str255¤ ¤   ¤   string;
f5b540 ¤   ¤   size_t¤ ¤   ¤   len;
ba358e ¤   ¤   PGPTime¤¤   ¤   creation;
4ec145 ¤   ¤   PGPInt32¤   ¤   bits;
c2da6a ¤   ¤   PGPSubKeyRef¤   subKey;¤¤
3367c5 ¤
3ab916 ¤   ¤   len = sizeof(key);
9de17e ¤   ¤   GetCellData(¤   inCell,
d07460 ¤   ¤   ¤   ¤   ¤   ¤   &key,
03a568 ¤   ¤   ¤   ¤   ¤   ¤   len);
316f76 ¤   ¤   just = UTextTraits::SetPortTextTraits(Txtr_Geneva9);
f5e2ad ¤   ¤   if (depth >= 8) {
314933 ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
840fe4 ¤   ¤   }
b51b52 ¤   ¤
f77832 ¤   ¤   // Plot the icon
fe3c40 ¤   ¤   pgpErr = PGPGetKeyNumber(¤  key,
aebf10 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropAlgID,
ecbc18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm);
8ec0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
a73d81 ¤   ¤   ::PlotIconID(¤  &drawRect,
b1672b ¤   ¤   ¤   ¤   ¤   ¤   atNone,
e1ab32 ¤   ¤   ¤   ¤   ¤   ¤   ttNone,
552287 ¤   ¤   ¤   ¤   ¤   ¤   (algorithm == kPGPPublicKeyAlgorithm_DSA) ?¤
505a2f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   icmx_DHKey : icmx_RSAKey);
35da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
e20da6 ¤   ¤   // Draw the UserID
f174d8 ¤   ¤   ::SetRect(¤ &drawRect,
431217 ¤   ¤   ¤   ¤   ¤   iconRight + kUserIDIndent,
5539cf ¤   ¤   ¤   ¤   ¤   inLocalRect.top + kVerticalIndent,
547659 ¤   ¤   ¤   ¤   ¤   kUserIDColumnWidth,
d77583 ¤   ¤   ¤   ¤   ¤   inLocalRect.bottom - kVerticalIndent);
--0a39 00087f920c8401200aa Page 8 of CKeyTable.cp
e2e92f ¤   ¤   len = sizeof(string) - 1;
dec64d ¤   ¤   pgpErr = PGPGetPrimaryUserIDNameBuffer(key,
a60c37 ¤   ¤   ¤   sizeof( string ) - 1, (char *)&string[1], &len);
b5c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
c4b380 ¤   ¤   string[0] = len;
da8166 ¤   ¤   ::TruncString(¤ drawRect.right - drawRect.left,
8c4f38 ¤   ¤   ¤   ¤   ¤   ¤   string,
91e0b6 ¤   ¤   ¤   ¤   ¤   ¤   truncMiddle);
ddd75a ¤   ¤   UTextDrawing::DrawWithJustification(¤   (Ptr) &string[1],
6f796d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   string[0],
356b91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   drawRect,
3dc8fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   just);
cdda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
e3501a ¤   ¤   // Adjust the background color for last two columns
e5e2ad ¤   ¤   if (depth >= 8) {
c654ff ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray1));
700fe4 ¤   ¤   }
cc071b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
1eb31a ¤   ¤   // Draw the creation date
9030a9 ¤   ¤   pgpErr = PGPGetKeyTime(¤key,
f17e85 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropCreation,
5093c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &creation);
0ec0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
42ea1b ¤   ¤   creation = PGPTimeToMacTime(creation);
914178 ¤   ¤   ::DateString(creation, shortDate, string, nil);
0d74d8 ¤   ¤   ::SetRect(¤ &drawRect,
826dfd ¤   ¤   ¤   ¤   ¤   kCreationColumnLeft,
4639cf ¤   ¤   ¤   ¤   ¤   inLocalRect.top + kVerticalIndent,
24c307 ¤   ¤   ¤   ¤   ¤   kCreationColumnLeft + kCreationColumnWidth,
397583 ¤   ¤   ¤   ¤   ¤   inLocalRect.bottom - kVerticalIndent);
5cd75a ¤   ¤   UTextDrawing::DrawWithJustification(¤   (Ptr) &string[1],
ff796d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   string[0],
e66b91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   drawRect,
46c8fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   just);
38af5a
bfb85e ¤   ¤   // Draw the size
183c40 ¤   ¤   pgpErr = PGPGetKeyNumber(¤  key,
fe1d20 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropBits,
fbec60 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &bits);
98c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
5ff355 ¤   ¤   ::NumToString(bits, string);
5ab532 ¤   ¤   if (algorithm == kPGPPublicKeyAlgorithm_DSA) {
888cc3 ¤   ¤   ¤   PGPKeyIterSeek(mKeyIterRef, key);
504063 ¤   ¤   ¤   pgpErr = PGPKeyIterNextSubKey(mKeyIterRef, &subKey);
ae0c9f ¤   ¤   ¤   if (IsntPGPError(pgpErr) && PGPRefIsValid(subKey)) {
1de276 ¤   ¤   ¤   ¤   Str31¤  string2;
f02b85 ¤   ¤   ¤   ¤
cbf9e2 ¤   ¤   ¤   ¤   pgpErr = PGPGetSubKeyNumber(¤   subKey,
bd8e8f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropBits,
8537dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &bits);
b18f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
fe3349 ¤   ¤   ¤   ¤   ::NumToString(bits, string2);
dd6977 ¤   ¤   ¤   ¤   AppendPString(¤ CString(¤   STRx_AdminStrings,
169cab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeySizeSeparatorStringID),
c06de0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   string2);
36cdc5 ¤   ¤   ¤   ¤   AppendPString(string, string2);
717d96 ¤   ¤   ¤   ¤   CopyPString(string2, string);
a8a3a6 ¤   ¤   ¤   }
840fe4 ¤   ¤   }
8d74d8 ¤   ¤   ::SetRect(¤ &drawRect,
f3f582 ¤   ¤   ¤   ¤   ¤   kSizeColumnLeft,
b839cf ¤   ¤   ¤   ¤   ¤   inLocalRect.top + kVerticalIndent,
d5a0a8 ¤   ¤   ¤   ¤   ¤   kSizeColumnLeft + kSizeColumnWidth,
b77583 ¤   ¤   ¤   ¤   ¤   inLocalRect.bottom - kVerticalIndent);
9dd75a ¤   ¤   UTextDrawing::DrawWithJustification(¤   (Ptr) &string[1],
e8796d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   string[0],
0c6b91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   drawRect,
82c8fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   just);
d39371 ¤   }
57efe6 }
f1af5a
87af5a
--631a 0008268f93d401200aa Page 9 of CKeyTable.cp
e0af5a
2c6d52 ¤   void
a27f32 CKeyTable::HiliteCellActively(
661bb3 ¤   const STableCell¤   &inCell,
488e9d ¤   Boolean¤¤   ¤   ¤   /*inHilite*/)
05bb36 {
b4a0e5 ¤   Rect¤   cellFrame;
1a67c5 ¤
51faaf ¤   if(GetLocalCellRect(inCell, cellFrame) && FocusExposed()) {
b12da9 ¤   ¤   StDeviceLoop¤   devLoop(cellFrame);¤¤
ca77ad ¤   ¤   SInt16¤ ¤   ¤   depth;
caaf5a
0bdf27 ¤   ¤   while(devLoop.NextDepth(depth)) {
49c87d ¤   ¤   ¤   StColorPenState saveColorPen; ··// Preserve color & pen state
d187c7 ¤   ¤   ¤
e9c514 ¤   ¤   ¤   StColorPenState::Normalize();
4ba129 ¤   ¤   ¤   if(depth >= 8) {
7c5f85 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
e552cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
8c042d ¤   ¤   ¤   } else {
557337 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
3f52cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
91a3a6 ¤   ¤   ¤   }
c435c0 ¤   ¤   ¤   cellFrame.right = cellFrame.left + kUserIDColumnWidth;
9901a6 ¤   ········UDrawingUtils::SetHiliteModeOn();
92d038 ¤   ¤   ¤   ::InvertRect(&cellFrame);
b80fe4 ¤   ¤   }
869371 ¤   }
91efe6 }
01af5a
eaaf5a
61af5a
ae6d52 ¤   void
45424c CKeyTable::HiliteCellInactively(
a91bb3 ¤   const STableCell¤   &inCell,
207e1e ¤   Boolean¤¤   ¤   ·¤  /*inHilite*/)
adbb36 {
f3a0e5 ¤   Rect¤   cellFrame;
ad67c5 ¤
b7faaf ¤   if(GetLocalCellRect(inCell, cellFrame) && FocusExposed()) {
9e2da9 ¤   ¤   StDeviceLoop¤   devLoop(cellFrame);¤¤
0877ad ¤   ¤   SInt16¤ ¤   ¤   depth;
61af5a
3ddf27 ¤   ¤   while(devLoop.NextDepth(depth)) {
5bad33 ¤   ········StColorPenState saveColorPen; ··// Preserve color & pen state
db50b7 ¤   ········
4956ca ¤   ········StColorPenState::Normalize();
6a80c1 ¤   ········if(depth >= 8) {
a15f85 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
bf52cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
97042d ¤   ¤   ¤   } else {
b57337 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
f052cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
2fa3a6 ¤   ¤   ¤   }
6de1b4 ¤   ¤   ¤   ::PenMode(srcXor);
9d35c0 ¤   ¤   ¤   cellFrame.right = cellFrame.left + kUserIDColumnWidth;
0d8cc2 ¤   ¤   ¤   cellFrame.bottom -= 1;
fd3181 ¤   ¤   ¤   UDrawingUtils::SetHiliteModeOn();
d30e92 ¤   ¤   ¤   ::FrameRect(&cellFrame);
fa0fe4 ¤   ¤   }
cd9371 ¤   }
cdefe6 }
a5af5a
02af5a
3caf5a
6c6d52 ¤   void
203b23 CKeyTable::FreeAllStoredKeys()
25bb36 {
c3d16f ¤   STableCell¤ theCell(0, 0);
68c595 ¤   PGPKeyRef¤  key;
bdb410 ¤   UInt32¤ ¤   len = sizeof(key);
8267c5 ¤
--0fcd 000d1adbf71401200aa Page 10 of CKeyTable.cp
362ac2 ¤   while (GetNextCell(theCell)) {
fa5c90 ¤   ¤   GetCellData(¤   theCell,
517460 ¤   ¤   ¤   ¤   ¤   ¤   &key,
8aa568 ¤   ¤   ¤   ¤   ¤   ¤   len);
309371 ¤   }
74bd62 ¤   if (PGPKeyIterRefIsValid(mKeyIterRef)) {
a4525a ¤   ¤   PGPFreeKeyIter(mKeyIterRef);
42df47 ¤   ¤   mKeyIterRef = kInvalidPGPKeyIterRef;
d29371 ¤   }
e1468b ¤   if (PGPKeyListRefIsValid(mKeyListRef)) {
deb2f4 ¤   ¤   PGPFreeKeyList(mKeyListRef);
93c049 ¤   ¤   mKeyListRef = kInvalidPGPKeyListRef;
e69371 ¤   }
b5efe6 }
c3af5a
ad6d52 ¤   void
413c85 CKeyTable::FindCommandStatus(
ff18df ¤   CommandT¤   ¤   ¤   inCommand,
8d1963 ¤   Boolean¤¤   ¤   ¤   &outEnabled,
0a3bf8 ¤   Boolean¤¤   ¤   ¤   &outUsesMark,
c1480e ¤   Char16¤ ¤   ¤   ¤   &outMark,
13f1d2 ¤   Str255¤ ¤   ¤   ¤   outName)
24bb36 {
7ff912 ¤   switch (inCommand) {
083513 ¤   ¤   case cmd_SelectAll:
4d5b34 ¤   ¤   {
03e3fd ¤   ¤   ¤   outEnabled = mSelectAllEnabled;
e70fe4 ¤   ¤   }
9d2f68 ¤   ¤   break;
b51b52 ¤   ¤
c79ae3 ¤   ¤   default:
455b34 ¤   ¤   {
ff6e98 ¤   ¤   ¤   LCommander::FindCommandStatus(inCommand, outEnabled, outUsesMark,
382a20 ¤   ¤   ¤   ¤   ¤   outMark, outName);
f90fe4 ¤   ¤   }
702f68 ¤   ¤   break;
b89371 ¤   }
56efe6 }
d7af5a
caaf5a
38af5a
ab7e69 ¤   Boolean
eaae26 CKeyTable::ObeyCommand(
96ea24 ¤   CommandT¤   inCommand,
4d0597 ¤   void¤   ¤   *ioParam)
3ebb36 {
475b52 ¤   Boolean¤¤   cmdHandled = true;
faaf5a
87f912 ¤   switch (inCommand) {
cc3513 ¤   ¤   case cmd_SelectAll:
185b34 ¤   ¤   {
512331 ¤   ¤   ¤   SelectAllCells();
1d0fe4 ¤   ¤   }
af2f68 ¤   ¤   break;
3d1b52 ¤   ¤
b89ae3 ¤   ¤   default:
475b34 ¤   ¤   {
024a71 ¤   ¤   ¤   cmdHandled = LCommander::ObeyCommand(inCommand, ioParam);
e30fe4 ¤   ¤   }
e32f68 ¤   ¤   break;
009371 ¤   }
bb67c5 ¤
6f51a4 ¤   return cmdHandled;
fdefe6 }
bfaf5a
26af5a
4daf5a
bb7e69 ¤   Boolean
1d9538 CKeyTable::HandleKeyPress(const EventRecord& inKeyEvent)
a0bb36 {
df0668 ¤   Boolean¤¤   keyHandled¤ = TRUE;
d1a501 ¤   if( inKeyEvent.modifiers & cmdKey )
--1890 0002775cf6e401200aa Page 11 of CKeyTable.cp
f7c7a1 ¤   {
87f1fc ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
949371 ¤   }
ca0e24 ¤   else
6cc7a1 ¤   {
917abc ¤   ¤   Int16¤  ¤   theKey = inKeyEvent.message & charCodeMask;
7c5fc1 ¤   ¤   STableCell¤ cell;
da347d ¤   ¤   TableIndexT¤rows, cols;
0657d5 ¤   ¤   Boolean¤¤   changedSelection = FALSE;
48af5a
c52b6b ¤   ¤   switch(theKey)
095b34 ¤   ¤   {
fe99fa ¤   ¤   ¤   case char_UpArrow:
e4f776 ¤   ¤   ¤   {
3e3692 ¤   ¤   ¤   ¤   cell = GetFirstSelectedCell();
f2f1f9 ¤   ¤   ¤   ¤   cell.col = 1;
c4ea63 ¤   ¤   ¤   ¤   if(cell.row > 1)
2c3ca2 ¤   ¤   ¤   ¤   ¤   cell.row--;
e1fceb ¤   ¤   ¤   ¤   if(cell.row < 1)
b6b7d3 ¤   ¤   ¤   ¤   ¤   cell.row = 1;
d8908e ¤   ¤   ¤   ¤   UnselectAllCells();
28a4e9 ¤   ¤   ¤   ¤   ScrollCellIntoFrame(cell);
1ec7e4 ¤   ¤   ¤   ¤   SelectCell(cell);
483dc0 ¤   ¤   ¤   ¤   changedSelection = TRUE;
eef622 ¤   ¤   ¤   ¤   break;
f2a3a6 ¤   ¤   ¤   }
9487c7 ¤   ¤   ¤
f310b3 ¤   ¤   ¤   case char_DownArrow:
a7f776 ¤   ¤   ¤   {
619505 ¤   ¤   ¤   ¤   GetTableSize(rows, cols);
243692 ¤   ¤   ¤   ¤   cell = GetFirstSelectedCell();
9cf1f9 ¤   ¤   ¤   ¤   cell.col = 1;
920cbf ¤   ¤   ¤   ¤   cell.row++;
50efd1 ¤   ¤   ¤   ¤   if(cell.row > rows)
3f02f5 ¤   ¤   ¤   ¤   ¤   cell.row = rows;
fe908e ¤   ¤   ¤   ¤   UnselectAllCells();
44a4e9 ¤   ¤   ¤   ¤   ScrollCellIntoFrame(cell);
46c7e4 ¤   ¤   ¤   ¤   SelectCell(cell);
063dc0 ¤   ¤   ¤   ¤   changedSelection = TRUE;
a6f622 ¤   ¤   ¤   ¤   break;
66a3a6 ¤   ¤   ¤   }
d92b85 ¤   ¤   ¤   ¤
2652bc ¤   ¤   ¤   case char_LeftArrow:
851c5e ¤   ¤   ¤   case char_RightArrow:
fcf772 ¤   ¤   ¤   ¤   changedSelection = FALSE;
12f622 ¤   ¤   ¤   ¤   break;
822b85 ¤   ¤   ¤   ¤
914c64 ¤   ¤   ¤   case char_Home:
d4f776 ¤   ¤   ¤   {
5607b9 ¤   ¤   ¤   ¤   cell.row = cell.col = 1;
f2a4e9 ¤   ¤   ¤   ¤   ScrollCellIntoFrame(cell);
45f622 ¤   ¤   ¤   ¤   break;
c4a3a6 ¤   ¤   ¤   }
b587c7 ¤   ¤   ¤
6d8dc9 ¤   ¤   ¤   case char_End:
2af776 ¤   ¤   ¤   {
8e9505 ¤   ¤   ¤   ¤   GetTableSize(rows, cols);
7df1f9 ¤   ¤   ¤   ¤   cell.col = 1;
e33f9d ¤   ¤   ¤   ¤   cell.row = rows;
61a4e9 ¤   ¤   ¤   ¤   ScrollCellIntoFrame(cell);
c6f622 ¤   ¤   ¤   ¤   break;
eba3a6 ¤   ¤   ¤   }
0787c7 ¤   ¤   ¤
a06f81 ¤   ¤   ¤   case char_PageUp:
aff776 ¤   ¤   ¤   {
8759cb ¤   ¤   ¤   ¤   Rect¤   frameRect;
012b85 ¤   ¤   ¤   ¤
3caf32 ¤   ¤   ¤   ¤   CalcLocalFrameRect(frameRect);
5582dd ¤   ¤   ¤   ¤   ScrollPinnedImageBy( 0,
9d05b9 ¤   ¤   ¤   ¤   ¤   -UGraphicUtils::RectHeight(frameRect), true );
b5f622 ¤   ¤   ¤   ¤   break;
27a3a6 ¤   ¤   ¤   }
--5bbb 001d0a4e4c4401200aa Page 12 of CKeyTable.cp
e587c7 ¤   ¤   ¤
3f895e ¤   ¤   ¤   case char_PageDown:
66f776 ¤   ¤   ¤   {
8959cb ¤   ¤   ¤   ¤   Rect¤   frameRect;
9e2b85 ¤   ¤   ¤   ¤
3aaf32 ¤   ¤   ¤   ¤   CalcLocalFrameRect(frameRect);
9582dd ¤   ¤   ¤   ¤   ScrollPinnedImageBy( 0,
790403 ¤   ¤   ¤   ¤   ¤   UGraphicUtils::RectHeight(frameRect), true );
73f622 ¤   ¤   ¤   ¤   break;
f1a3a6 ¤   ¤   ¤   }
1887c7 ¤   ¤   ¤
1cdb68 ¤   ¤   ¤   default:
86a190 ¤   ¤   ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
2df622 ¤   ¤   ¤   ¤   break;
aa0fe4 ¤   ¤   }
ab1b52 ¤   ¤
6d08fa ¤   ¤   if( changedSelection )
475b34 ¤   ¤   {
d1b85c ¤   ¤   ¤   BroadcastMessage( GetPaneID() );
690fe4 ¤   ¤   }
309371 ¤   }
b267c5 ¤
41c022 ¤   return keyHandled;
59efe6 }
feaf5a
c81017 ¤   Int32
f7c3f0 CKeyIDComparator::Compare(
b84efe ¤   const void *¤   inItemOne,
549641 ¤   const void * ¤  inItemTwo,
7cba89 ¤   UInt32¤ ¤   ¤   inSizeOne,
704f1f ¤   UInt32¤ ¤   ¤   inSizeTwo) const
0ebb36 {
1315d2 ¤   (void) inSizeOne;
46afc6 ¤   (void) inSizeTwo;
0d67c5 ¤
849f29 ¤   return PGPCompareKeyIDs(¤   (PGPKeyID const *) inItemOne,
93a9ab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPKeyID const *) inItemTwo);
d0efe6 }
--226b 001e7152fb5401200ab Page 1 of CKeyTable.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
bef6c4 ¤   $Id: CKeyTable.h,v 1.8.18.1 1998/11/12 03:07:01 heller Exp $
c0f7f7 ____________________________________________________________________________*/
30af5a
aa8d55 #pragma once·
74af5a
0ba076 #include "pgpKeys.h"
8ba787 #include <LTableView.h>
efea2f #include <LBroadcaster.h>
cc2f94 #include <LCommander.h>
38af5a
2de007 class CKeyTable :¤  public LTableView,
d435b8 ¤   ¤   ¤   ¤   ¤   public LBroadcaster,
4a856d ¤   ¤   ¤   ¤   ¤   public LCommander {
0a5ed4 public:
1a6f2a ¤   enum ¤  ¤   ¤   ¤   { class_ID = 'KeyT' };
3aaf5a
7a8a61 ¤   ¤   ¤   ¤   ¤   ¤   CKeyTable(LStream * inStream);
613724 ¤   virtual¤¤   ¤   ¤   ~CKeyTable();
0467c5 ¤
5877c0 ¤   virtual void¤   ¤   FindCommandStatus(
7808b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CommandT¤   ¤   ¤   inCommand,
d5881f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   &outEnabled,
568282 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   &outUsesMark,
caa21e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16¤ ¤   ¤   ¤   &outMark,
a11f5e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   ¤   ¤   outName);
4a368b ¤   virtual Boolean¤¤   ObeyCommand(
7408b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CommandT¤   ¤   ¤   inCommand,
1161a8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void¤   ¤   ¤   ¤   *ioParam = nil);
0cfcc0 ¤   virtual Boolean¤¤   HandleKeyPress(const EventRecord& inKeyEvent);
79af5a
a2061c ¤   void¤   ¤   ¤   ¤   SetTableInfo(PGPFilterRef inFilter,
f199e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inMultiSelector);
6e251a ¤   void¤   ¤   ¤   ¤   SetTableInfo(PGPKeySetRef inKeySet);
d9aaf2 ¤   void¤   ¤   ¤   ¤   GetSelectedKeys(Handle outHandle);
6e739f ¤   void¤   ¤   ¤   ¤   GetSelectedKeys(PGPKeySetRef * outKeys);
c16b61 ¤   void¤   ¤   ¤   ¤   GetFirstSelectedKeyID(PGPKeyID * outKeyID,
0a2c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * outAlgorithm = nil);
63e871 ¤   void¤   ¤   ¤   ¤   GetFirstSelectedUserID(CString & outUserID);
7867c5 ¤
aca2d3 protected:
07c350 ¤   Boolean¤¤   ¤   ¤   mSelectAllEnabled;
3acb11 ¤   Boolean¤¤   ¤   ¤   mDisplayList;
d7e6fb ¤   PGPFilterRef¤   ¤   mFilterRef;
e18229 ¤   PGPKeyIterRef¤  ¤   mKeyIterRef;
cc7539 ¤   PGPKeyListRef¤  ¤   mKeyListRef;
481b52 ¤   ¤
1e659f ¤   virtual void¤   ¤   HiliteCellActively(const STableCell & inCell,
9371c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inHilite);
c53135 ¤   virtual void¤   ¤   HiliteCellInactively(const STableCell & inCell,
0071c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inHilite);
d967c5 ¤
fc0e5d ¤   virtual void¤   ¤   ClickSelf(const SMouseDownEvent & inMouseDown);
c667c5 ¤
79d3d4 ¤   virtual void¤   ¤   DrawSelf();
3ade07 ¤   virtual void¤   ¤   DrawCell(const STableCell & inCell,
a0ec1e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect & inLocalRect);
6667c5 ¤
dfa3a2 ¤   virtual void¤   ¤   ShowSelf();
7667c5 ¤
feb043 ¤   void¤   ¤   ¤   ¤   FreeAllStoredKeys();
e7bf26 };¶
--59ce 00083c2254d401200ac Page 1 of PGPadmin.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
8b4e20 ¤   $Id: PGPadmin.cp,v 1.23.8.1 1998/11/12 03:07:02 heller Exp $
edf7f7 ____________________________________________________________________________*/
45af5a
21f841 #include <LGrowZone.h>
b5dd56 #include <PP_Messages.h>
722204 #include <PP_Resources.h>
dd7e6d #include <UDrawingState.h>
67ffe3 #include <UGraphicUtils.h>
68cc5c #include <UMemoryMgr.h>
037c99 #include <URegistrar.h>
cb4119 #include <LMultiPanelView.h>
ac2786 #include <LSeparatorLine.h>
db25ae #include <LCaption.h>
73d797 #include <LPushButton.h>
d305c6 #include <LStaticText.h>
ec7c09 #include <LEditText.h>
fd775b #include <LTextEditView.h>
3ee48b #include <LCheckbox.h>
78a94f #include <LTextGroupBox.h>
35f1ac #include <LWindowHeader.h>
bd76ae #include <LIconControl.h>
117e73 #include <LTabGroup.h>
667304 #include <LScrollerView.h>
5a62c6 #include <LScrollBar.h>
61af5a
9cef3e #include <LAMPushButtonImp.h>
1bfd90 #include <LAMControlImp.h>
375a8a #include <LAMStaticTextImp.h>
30f0f6 #include <LAMEditTextImp.h>
25d770 #include <LAMControlViewImp.h>
70e64c #include <LAMWindowHeaderImp.h>
3ea389 #include <LAMTrackActionImp.h>
0eaf5a
e610f0 #include <LStdScrollBarImp.h>
9eaf5a
d5aa66 #include "PowerPlantLeaks.h"
71af5a
79c97b #include "pgpClientPrefs.h"
644720 #include "pflPrefTypes.h"
7c10f0 #include "pgpOpenPrefs.h"
ae91b9 #include "pgpSDKPrefs.h"
c76773 #include "pgpMemoryMgr.h"
224919 #include "pgpUtilities.h"
85a02f #include "pgpClientLib.h"
52af5a
d18bd8 #include "MacEnvirons.h"
1f1e0f #include "MacInternet.h"
8859c5 #include "CPGPStDialogHandler.h"
7e0021 #include "CPicture.h"
fee7cd #include "CVersionCaption.h"
7a9dc2 #include "CWarningAlert.h"
55af5a
e1aa64 #include "StSaveCurResFile.h"
3a0bb4 #include "CString.h"
2f5b4e #include "CRestorePortColorsAttachment.h"
66fca7 #include "CPanel.h"
98af5a
026ff8 #include "CKeyTable.h"
56af5a
005d7a #include "CAdminDialog.h"
42fb83 #include "PGPadmin.h"
7baf5a
96af5a
600562 const ResIDT¤   ppob_Admin¤ ¤   =¤  128;
5caf5a
83c5fa const ResIDT¤   STRx_AdminApp¤  =¤  1001;
--bf32 00067c8e36c401200ac Page 2 of PGPadmin.cp
418741 const SInt16¤   kURLID¤ ¤   ¤   =¤  1;
3af0b0 const SInt16¤   kCreditsID¤ ¤   =¤  2;
cabc15 const SInt16¤   kInfoID¤¤   ¤   =¤  3;
1baf5a
105cc7 const ResID¤¤   ppob_About¤ =¤  131;
83af5a
da2cf1 PGPContextRef¤  gPGPContext = kInvalidPGPContextRef;
97af5a
acaf5a
066d52 ¤   void
cc7f68 main(void)
7dbb36 {
ef3587 ¤   // Set Debugging options
c59924 ¤   SetDebugThrow_(debugAction_Alert);
416ffb ¤   SetDebugSignal_(debugAction_Alert);
ceaf5a
65c718 ¤   // Init
adb567 ¤   InitializeHeap(3);
061fc2 ¤   UQDGlobals::InitializeToolbox(&qd);
ad78cd ¤   UGraphicUtils::InitGraphicsUtilities();
b1def4 ¤   new LGrowZone(20000);
0667c5 ¤
b2ac2f ¤   // Create our context
b7f7ef ¤   PGPError¤   pgpErr;
bc67c5 ¤
f3d7fe ¤   pgpErr = PGPNewContext( kPGPsdkAPIVersion, &gPGPContext);
311d65 ¤   if (IsntPGPError(pgpErr)) {
f85b34 ¤   ¤   {
c481e6 #if USE_MAC_DEBUG_LEAKS
15bf8b ¤   ¤   ¤   { CForceInitLPeriodical¤temp; }
be7454 #endif
72af5a
2ffb76 ¤   ¤   ¤   pgpLeaksBeginSession("PGPadmin");
8ff776 ¤   ¤   ¤   {
98fb44 ¤   ¤   ¤   ¤   CAdminApp¤  theApp;
0787c7 ¤   ¤   ¤
91b626 ¤   ¤   ¤   ¤   theApp.Run();
cb563c ¤   ¤   ¤   ¤   URegistrar::DisposeClassTable();
1ba3a6 ¤   ¤   ¤   }
316cc1 ¤   ¤   ¤   pgpLeaksEndSession();
d60fe4 ¤   ¤   }
a55e85 ¤   ¤   PGPFreeContext(gPGPContext);
789371 ¤   }
e4efe6 }
8eaf5a
b4af5a
b1af5a
403baf CAdminApp::CAdminApp()
c1bb36 {
b3368c ¤   // Register functions to create classes
c9b68e // Suspend for first call to URegistrar
c74800 MacLeaks_Suspend();
f00d99 ¤   RegisterClass_(CAdminDialog);
3d4c30 MacLeaks_Resume();
7273a1 ¤   RegisterClass_(CRestorePortColorsAttachment);
fa78f7 ¤   RegisterClass_(CPicture);
42577f ¤   RegisterClass_(CVersionCaption);
7cf6e3 ¤   RegisterClass_(CWarningAlert);
408580 ¤   RegisterClass_(LGADialog);
531787 ¤   RegisterClass_(LCaption);
33fe81 ¤   RegisterClass_(LMultiPanelView);
fe29b3 ¤   RegisterClass_(LView);
bd0eaa ¤   RegisterClass_(LTabGroup);
a03b88 ¤   RegisterClass_(LTextEditView);
ccbc10 ¤   RegisterClass_(CKeyTable);
25154c ¤   RegisterClass_(CPanel);
7944cc ¤   RegisterClass_(LScrollerView);
fbf6e3 ¤   RegisterClass_(CWarningAlert);
6732dd ¤   RegisterClass_(LPushButton);
398c6f ¤   RegisterClass_(LSeparatorLine);
f7ce49 ¤   RegisterClass_(LStaticText);
676488 ¤   RegisterClass_(LEditText);
--6334 0000fe2b39f401200ac Page 3 of PGPadmin.cp
1b8ab4 ¤   RegisterClass_(LCheckBox);
4be2d0 ¤   RegisterClass_(LTextGroupBox);
02d42a ¤   RegisterClass_(LWindowHeader);
2c9ce1 ¤   RegisterClass_(LIconControl);
35fb55 ¤   RegisterClass_(LScrollBar);
9baf5a
aa69c6 ¤   ::RegisterAppearanceClient();
0467c5 ¤
604048 ¤   RegisterClassID_(LAMPushButtonImp, LPushButton::imp_class_ID);
381c52 ¤   RegisterClassID_(LAMControlImp, LSeparatorLine::imp_class_ID);
321f41 ¤   RegisterClassID_(LAMStaticTextImp, LStaticText::imp_class_ID);
087125 ¤   RegisterClassID_(LAMEditTextImp, LEditText::imp_class_ID);
5cea9b ¤   RegisterClassID_(LAMControlImp, LCheckBox::imp_class_ID);
f9ba45 ¤   RegisterClassID_(LAMControlViewImp, LTextGroupBox::imp_class_ID);¤  ¤
6fcfc7 ¤   RegisterClassID_(LAMWindowHeaderImp, ·LWindowHeader::imp_class_ID);
ff3ccd ¤   RegisterClassID_(LAMControlImp, LIconControl::imp_class_ID);
a59145 ¤   RegisterClassID_(LAMTrackActionImp, LScrollBar::imp_class_ID);
03efe6 }
cfaf5a
68af5a
b5af5a
bff448 CAdminApp::~CAdminApp()
35bb36 {
37efe6 }
e8af5a
f5af5a
9aaf5a
b1314a void
810bd8 CAdminApp::StartUp()
79bb36 {
01aea4 ¤   PGPsdkLoadDefaultPrefs(gPGPContext);
6b387c ¤   ObeyCommand(cmd_New, nil);
8eefe6 }
faaf5a
1baf5a
6daf5a
1a7e69 ¤   Boolean
686e22 CAdminApp::ObeyCommand(
eeea24 ¤   CommandT¤   inCommand,
370597 ¤   void¤   ¤   *ioParam)
26bb36 {
5c5b52 ¤   Boolean¤¤   cmdHandled = true;
4aaf5a
d7f912 ¤   switch (inCommand) {
f1c863 ¤   ¤   case cmd_New:
ee5b34 ¤   ¤   {
0e8711 ¤   ¤   ¤   LWindow *¤  theWindow;
7887c7 ¤   ¤   ¤
edb458 ¤   ¤   ¤   theWindow = LWindow::CreateWindow(ppob_Admin, this);¤
da025d ¤   ¤   ¤   theWindow->Show();
150fe4 ¤   ¤   }
642f68 ¤   ¤   break;
13af5a
6faf5a
f39ae3 ¤   ¤   default:
d45b34 ¤   ¤   {
eae7f2 ¤   ¤   ¤   cmdHandled = LApplication::ObeyCommand(inCommand, ioParam);
5d0fe4 ¤   ¤   }
ee2f68 ¤   ¤   break;
369371 ¤   }
f567c5 ¤
9651a4 ¤   return cmdHandled;
f1efe6 }
07af5a
5caf5a
43af5a
aa6d52 ¤   void
40675e CAdminApp::FindCommandStatus(
17ea24 ¤   CommandT¤   inCommand,
7f8d84 ¤   Boolean &¤  outEnabled,
56a8dd ¤   Boolean &¤  outUsesMark,
0f5791 ¤   Char16 &¤   outMark,
--1aa8 00010b63388401200ac Page 4 of PGPadmin.cp
a5d894 ¤   Str255¤ ¤   outName)
8bbb36 {
85af5a
79f912 ¤   switch (inCommand) {
0d9ae3 ¤   ¤   default:
ce5b34 ¤   ¤   {
cd2eb0 ¤   ¤   ¤   LApplication::FindCommandStatus(¤   inCommand,
9aa196 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outEnabled,
149b62 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outUsesMark,
ea8bc9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outMark,
97ba4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outName);
650fe4 ¤   ¤   }
a72f68 ¤   ¤   break;
6e9371 ¤   }
73efe6 }
2aaf5a
28af5a
c8af5a
386d52 ¤   void
e57977 CAdminApp::MakeLicenseStr(
452d7a ¤   CString &¤  outLicenseStr)
e0bb36 {
a5b187 ¤   PGPPrefRef¤ ¤   prefRef = kInvalidPGPPrefRef;
5a03e8 ¤   PGPError¤   ¤   pgpErr;
4b67c5 ¤
1f5168 ¤   try {
337331 ¤   ¤   CString¤companyStr;
42af5a
f44294 ¤   ¤   pgpErr = PGPOpenClientPrefs(PGPGetContextMemoryMgr(gPGPContext),
cd96c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &prefRef);
50c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
735f4c ¤   ¤   pgpErr = PGPGetPrefStringBuffer(¤   prefRef,
f644e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefOwnerName,
58744d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outLicenseStr.GetBufferSize(),
dd3eab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outLicenseStr);
77c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
c35f4c ¤   ¤   pgpErr = PGPGetPrefStringBuffer(¤   prefRef,
9987cf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefCompanyName,
726a25 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   companyStr.GetBufferSize(),
259bf0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   companyStr);
6bc0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
39af5a
b288a3 ¤   ¤   strcat(outLicenseStr, "\r");
e1c904 ¤   ¤   strcat(outLicenseStr, companyStr);
ec9371 ¤   }
0267c5 ¤
dde0a3 ¤   catch (...) {
a59371 ¤   }
0dc733 ¤   if (PGPPrefRefIsValid(prefRef)) {
84fbc0 ¤   ¤   PGPClosePrefFile(prefRef);
5d9371 ¤   }
b0efe6 }
95af5a
01af5a
1baf5a
c66d52 ¤   void
794508 CAdminApp::ShowAboutBox()
36bb36 {
ef2b14 ¤   Boolean¤¤   ¤   ¤   didShowDialog = false;
1867c5 ¤
b15168 ¤   try {
8b1ff1 ¤   ¤   FSSpec¤ ¤   ¤   ¤   libraryFileSpec;
b13c61 ¤   ¤   OSStatus¤   ¤   ¤   err;
ff18a5 ¤   ¤   StSaveCurResFile¤   savedResfile;
d31c2a ¤   ¤   LFile¤  ¤   ¤   ¤   libraryFile;
bfaf5a
cdd1f7 ¤   ¤   // Open the libarary resource file at the top of the resource chain so
66fd63 ¤   ¤   // we get our pictures.
d124e9 ¤   ¤   err = PGPGetClientLibFSSpec(&libraryFileSpec);
7e4a74 ¤   ¤   PGPThrowIfOSErr_(err);
7c19a2 ¤   ¤   libraryFile.SetSpecifier(libraryFileSpec);
101811 ¤   ¤   libraryFile.OpenResourceFork(fsRdPerm);
--1194 0008a95b482401200ac Page 5 of PGPadmin.cp
e0af5a
6a627c ¤   ¤   // Handle the dialog
575b34 ¤   ¤   {
8d507f ¤   ¤   ¤   CPGPStDialogHandler¤aboutDialog(ppob_About, this);
7c8b6c ¤   ¤   ¤   LWindow¤¤   ¤   ¤   *theDialog;
9789a9 ¤   ¤   ¤   MessageT¤   ¤   ¤   message;
fb63b0 ¤   ¤   ¤   Boolean¤¤   ¤   ¤   credits = false;
2122f1 ¤   ¤   ¤   CString¤¤   ¤   ¤   licenseStr;
3187c7 ¤   ¤   ¤
5e0fe8 ¤   ¤   ¤   const MessageT¤ ¤   kPGPButtonMessage¤  ¤   = 'bPGP';
a1898a ¤   ¤   ¤   const MessageT¤ ¤   kCreditsButtonMessage¤  = 'bCre';
622c98 ¤   ¤   ¤   const MessageT¤ ¤   kOKButtonMessage¤   ¤   = 'bOK ';
ae87c7 ¤   ¤   ¤
84042f ¤   ¤   ¤   const PaneIDT¤  ¤   kCreditsButtonPaneID¤   = 'bCre';
84eea7 ¤   ¤   ¤   const PaneIDT¤  ¤   kAboutPicturePaneID¤¤   = 'APIC';
e85e69 ¤   ¤   ¤   const PaneIDT¤  ¤   kCreditsPicturePaneID¤  = 'CPIC';
d5eb48 ¤   ¤   ¤   const PaneIDT¤  ¤   kBSAFEPicturePaneID¤¤   = 'RPIC';
04cb08 ¤   ¤   ¤   const PaneIDT¤  ¤   kLicenseCaptionID¤  ¤   = 'cLic';
94af5a
6595bc ¤   ¤   ¤   theDialog = aboutDialog.GetDialog();
e187c7 ¤   ¤   ¤
fdfa24 ¤   ¤   ¤   didShowDialog = true;
1687c7 ¤   ¤   ¤
e00b78 ¤   ¤   ¤   MakeLicenseStr(licenseStr);
e82873 ¤   ¤   ¤   theDialog->FindPaneByID(kLicenseCaptionID)->SetDescriptor(licenseSt¶
780146 r);
2caf5a
0f5219 ¤   ¤   ¤   while ((message = aboutDialog.DoDialog()) != kOKButtonMessage) {
be7825 ¤   ¤   ¤   ¤   if (message == kPGPButtonMessage) {
744db0 ¤   ¤   ¤   ¤   ¤   err = OpenURL(CString(STRx_AdminApp, kURLID));
6c89b4 ¤   ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
e1c928 ¤   ¤   ¤   ¤   } else if (message == kCreditsButtonPaneID) {
346e42 ¤   ¤   ¤   ¤   ¤   SInt16¤ buttonTitleID;
07ae30 ¤   ¤   ¤   ¤   ¤
52e6ee ¤   ¤   ¤   ¤   ¤   if (credits) {
3600e1 ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID(kAboutPicturePaneID)->
bf0a1a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Show();
85fd82 ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID(kCreditsPicturePaneID)->
40e636 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Hide();
e337fe ¤   ¤   ¤   ¤   ¤   #if CREDIT_RSA_BSAFE
178fb3 ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID(kBSAFEPicturePaneID)->
a2e636 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Hide();
0aedfd ¤   ¤   ¤   ¤   ¤   #endif
d6606f ¤   ¤   ¤   ¤   ¤   ¤   buttonTitleID = kCreditsID;
7e81a1 ¤   ¤   ¤   ¤   ¤   } else {
eafd82 ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID(kCreditsPicturePaneID)->
c20a1a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Show();
4f37fe ¤   ¤   ¤   ¤   ¤   #if CREDIT_RSA_BSAFE
b98fb3 ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID(kBSAFEPicturePaneID)->
e50a1a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Show();
bfedfd ¤   ¤   ¤   ¤   ¤   #endif
e700e1 ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID(kAboutPicturePaneID)->
93e636 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Hide();
99bdd9 ¤   ¤   ¤   ¤   ¤   ¤   buttonTitleID = kInfoID;
6c1c89 ¤   ¤   ¤   ¤   ¤   }
beae30 ¤   ¤   ¤   ¤   ¤
aa4182 ¤   ¤   ¤   ¤   ¤   ((LControl *) theDialog->FindPaneByID(
52b8d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCreditsButtonPaneID))->SetDescriptor(
517c15 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_AdminApp, buttonTitleID));
84af5a
4a8ec1 ¤   ¤   ¤   ¤   ¤   credits = ! credits;
442613 ¤   ¤   ¤   ¤   }
eda3a6 ¤   ¤   ¤   }
0a0fe4 ¤   ¤   }
9f9371 ¤   }
5767c5 ¤
8de0a3 ¤   catch (...) {
3e9371 ¤   }
e867c5 ¤
681f33 ¤   if (! didShowDialog) {
188208 ¤   ¤   ::SysBeep(0);
8a9371 ¤   }
--b0b4 0017a44eea5401200ac Page 6 of PGPadmin.cp
7aefe6 }
--a6da 001d5a58445401200ad Page 1 of PGPadmin.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
8dbf8c ¤   $Id: PGPadmin.h,v 1.4.8.1 1998/11/12 03:07:03 heller Exp $
a9f7f7 ____________________________________________________________________________*/
1aaf5a
a48d55 #pragma once·
87af5a
b0af5a
edaf5a
107029 #include <LApplication.h>
e0af5a
cdaf5a
afa36f class CAdminApp : public LApplication {
fc5ed4 public:
d77103 ¤   ¤   ¤   ¤   ¤   ¤   CAdminApp();
3fb1c5 ¤   virtual ¤   ¤   ¤   ~CAdminApp();
7c67c5 ¤
0daf5a
3cc3bf ¤   virtual Boolean¤¤   ObeyCommand(CommandT inCommand, void* ioParam);¤
9a48a0 ¤   virtual void¤   ¤   FindCommandStatus(CommandT inCommand,
c59d62 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean & outEnabled, Boolean & outUsesMark,
d2af83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 & outMark, Str255 outName);
631d23 ¤   virtual void¤   ¤   ShowAboutBox();
c1af5a
7ea2d3 protected:
bafee2 ¤   void¤   ¤   ¤   ¤   MakeLicenseStr(CString & outLicenseStr);
0a1ba6 ¤   virtual void¤   ¤   StartUp();
beaf5a
3681e6 #if USE_MAC_DEBUG_LEAKS
261781 ¤   // we need to suspend leaks checking for the duration of these things
9fd3aa ¤   // because PowerPlant will never release certain items
01c7b9 ¤   virtual void¤   ¤   MakeMenuBar(void)
39f473 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { MacLeaks_Suspend(); LApplication::MakeMenuBar();
64de14 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··MacLeaks_Resume(); }
75d1c6 ¤   virtual void¤   ¤   MakeModelDirector(void)
512764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { MacLeaks_Suspend(); LApplication::
67fac5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   MakeModelDirector(); MacLeaks_Resume(); }
94ee12 #endif // USE_MAC_DEBUG_LEAKS
d5bf26 };¶
--85d8 00187ac9f7b401200ae Page 1 of PGPadmin.pch++
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
14f132 ¤   $Id: PGPadmin.pch++,v 1.3.8.1 1998/11/12 03:07:03 heller Exp $
2ef7f7 ____________________________________________________________________________*/
54af5a
b067c5 ¤
c177e0 #if __POWERPC__
5b9400 ¤   #pragma precompile_target "PGPadminPCHPPC"
7067c5 ¤
04fc58 #elif __CFM68K__
e507ee ¤   #pragma precompile_target "PGPadminPCHCFM68K"
7e67c5 ¤
60db21 #else
55b4d5 ¤   #pragma precompile_target "PGPadminPCH68K"
357454 #endif
3aaf5a
1f27a3 #pragma once on
b6af5a
874c2f #include <PP_MacHeaders.c>¤ ¤   ¤   // Toolbox headers
--8cfa 001936da077401200af Page 1 of PGPadmin.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
c78115 ¤   $Id: PGPadmin.prefix,v 1.5.18.1 1998/11/12 03:07:04 heller Exp $
c1f7f7 ____________________________________________________________________________*/
e7af5a
d5af5a
c977e0 #if __POWERPC__
a49db8 ¤   #include "PGPadminPCHPPC"
7a67c5 ¤
25fc58 #elif __CFM68K__
ee9c76 ¤   #include "PGPadminPCHCFM68K"
1d67c5 ¤
e1db21 #else
e3bd6d ¤   #include "PGPadminPCH68K"
ac7454 #endif
1caf5a
6bb18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
8eaf5a
3de6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
df79b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
87af5a
d2049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
9baf5a
630db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
ceaf5a
3ba662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
bda6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
8f5cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
60af5a
ee0438 #include "MacBasics.h"
1d96be #include "PGPBuildFlags.h"
5be2ff #include "pgpConfig.h"
2c94a0 #include "pgpLeaks.h"
ff46ad #include "MacDebug.h"
6faf5a
aaba1c #ifdef PGP_BUSINESS_SECURITY
3bd98f #undef PGP_BUSINESS_SECURITY
88119e #define PGP_BUSINESS_SECURITY¤  1
617454 #endif
18af5a
ab4e8d #ifdef PGP_PERSONAL_PRIVACY
60dbed #undef PGP_PERSONAL_PRIVACY
04b9b2 #define PGP_PERSONAL_PRIVACY¤   0
f87454 #endif
60af5a
075268 #ifdef PGP_FREEWARE
443624 #undef PGP_FREEWARE
ab4792 #define PGP_FREEWARE¤   ¤   ¤   0
fd7454 #endif
14af5a
b63379 #ifdef __cplusplus
ba0e06 #include "UPGPException.h"
937454 #endif
--7c0b 00191ca4366401200b0 Page 1 of PGPadminDebug.pch++
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
b3a49b ¤   $Id: PGPadminDebug.pch++,v 1.4.8.1 1998/11/12 03:07:05 heller Exp $
10f7f7 ____________________________________________________________________________*/
c3af5a
4567c5 ¤
2477e0 #if __POWERPC__
edceb9 ¤   #pragma precompile_target "PGPadminDebugPCHPPC"
7267c5 ¤
56fc58 #elif __CFM68K__
2d3f35 ¤   #pragma precompile_target "PGPadminDebugPCHCFM68K"
3167c5 ¤
e4db21 #else
f2ee6c ¤   #pragma precompile_target "PGPadminDebugPCH68K"
ea7454 #endif
41af5a
6327a3 #pragma once on
24af5a
1d4c2f #include <PP_MacHeaders.c>¤ ¤   ¤   // Toolbox headers
7baf5a
56af17 // Define all debugging symbols
2c6dc3 #define Debug_Throw
9174f5 #define Debug_Signal
--3001 001bcceafdd401200b1 Page 1 of PGPadminDebug.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
b514c4 ¤   $Id: PGPadminDebug.prefix,v 1.5.18.1 1998/11/12 03:07:05 heller Exp $
dbf7f7 ____________________________________________________________________________*/
79af5a
ccaf5a
a977e0 #if __POWERPC__
1f337e ¤   #include "PGPadminDebugPCHPPC"
4467c5 ¤
30fc58 #elif __CFM68K__
bb75da ¤   #include "PGPadminDebugPCHCFM68K"
8667c5 ¤
c8db21 #else
c013ab ¤   #include "PGPadminDebugPCH68K"
a97454 #endif
eeaf5a
21a853 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1
e8af5a
01e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
6979b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
19af5a
22049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
b1af5a
b30db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
d2af5a
24a662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
7ea6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
ae5cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
54e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
41af5a
85af5a
ed0438 #include "MacBasics.h"
d396be #include "PGPBuildFlags.h"
27e2ff #include "pgpConfig.h"
3d94a0 #include "pgpLeaks.h"
3346ad #include "MacDebug.h"
89af5a
c9ba1c #ifdef PGP_BUSINESS_SECURITY
15d98f #undef PGP_BUSINESS_SECURITY
f9119e #define PGP_BUSINESS_SECURITY¤  1
fa7454 #endif
18af5a
934e8d #ifdef PGP_PERSONAL_PRIVACY
ccdbed #undef PGP_PERSONAL_PRIVACY
5eb9b2 #define PGP_PERSONAL_PRIVACY¤   0
2a7454 #endif
86af5a
865268 #ifdef PGP_FREEWARE
2a3624 #undef PGP_FREEWARE
c84792 #define PGP_FREEWARE¤   ¤   ¤   0
017454 #endif
e7af5a
ee3379 #ifdef __cplusplus
810e06 #include "UPGPException.h"
bc7454 #endif
--1eaf 001502d7ab5401200b2 Page 1 of PGPadminGlobals.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
97b629 ¤   $Id: PGPadminGlobals.h,v 1.14.2.1.2.1 1998/11/12 03:07:06 heller Exp $
43f7f7 ____________________________________________________________________________*/
36af5a
d38d55 #pragma once·
d1af5a
44af5a
0675d5 const ResIDT¤   STRx_AdminStrings¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   =¤  1000;
f273f4 enum {
a31d26 ¤   ¤   ¤   ¤   kSaveButtonStringID¤¤   ¤   ¤   ¤   ¤   ¤   ¤   =¤  1,
81ffec ¤   ¤   ¤   ¤   kNextButtonStringID,
bb993a ¤   ¤   ¤   ¤   kKeySizeSeparatorStringID,
f3dced ¤   ¤   ¤   ¤   kSavePromptStringID,
428c88 ¤   ¤   ¤   ¤   kSavedNameSuffixStringID,
daa74e ¤   ¤   ¤   ¤   kMinimumPassphraseCharactersStringID,
99e487 ¤   ¤   ¤   ¤   kMinimumPassphraseQualityStringID,
59e6de ¤   ¤   ¤   ¤   kMinimumKeySizeStringID,
e2530f ¤   ¤   ¤   ¤   kMinimumRSAKeySizeStringID,
11a97d ¤   ¤   ¤   ¤   kMinimumNumberOfDaysStringID,
b3a452 ¤   ¤   ¤   ¤   kNoneStringID,
7be9e9 ¤   ¤   ¤   ¤   kTabStringID,
34c952 ¤   ¤   ¤   ¤   kCompanyNameStringID,
a35f9f ¤   ¤   ¤   ¤   kIncomingADKStringID,
dd9b20 ¤   ¤   ¤   ¤   kEnforcedStringID,
385476 ¤   ¤   ¤   ¤   kNotEnforcedStringID,
3a91e3 ¤   ¤   ¤   ¤   kOutgoingADKStringID,
507cce ¤   ¤   ¤   ¤   kPGPdiskADKStringID,
9d4a72 ¤   ¤   ¤   ¤   kEnforceRemoteADKStringID,
3df63a ¤   ¤   ¤   ¤   kYesStringID,
4f2dcd ¤   ¤   ¤   ¤   kNoStringID,
baf2ab ¤   ¤   ¤   ¤   kEnforceMinimumPassphraseLengthStringID,
ae67b0 ¤   ¤   ¤   ¤   kEnforceMinimumPassphraseQualityStringID,
73a729 ¤   ¤   ¤   ¤   kCharactersStringID,
4b3f14 ¤   ¤   ¤   ¤   kPercentStringID,
d82d3d ¤   ¤   ¤   ¤   kCorporateKeyStringID,
4d85ea ¤   ¤   ¤   ¤   kAutoSignStringID,
81b26a ¤   ¤   ¤   ¤   kMetaIntroducerStringID,
5f24f9 ¤   ¤   ¤   ¤   kEncryptToKeysNotSignedByCorporateKeyStringID,
a48bd1 ¤   ¤   ¤   ¤   kWarnStringID,
bf8001 ¤   ¤   ¤   ¤   kDoNotWarnStringID,
072a90 ¤   ¤   ¤   ¤   kDesignatedRevokerStringID,
969f60 ¤   ¤   ¤   ¤   kAutomaticUpdatesStringID,
2abd0c ¤   ¤   ¤   ¤   kEveryStringID,
9004bc ¤   ¤   ¤   ¤   kTrustedIntroducersStringID,
83cf2f ¤   ¤   ¤   ¤   kAllKeysStringID,
5364a0 ¤   ¤   ¤   ¤   kKeyGenerationStringID,
910342 ¤   ¤   ¤   ¤   kAllowedStringID,
732e44 ¤   ¤   ¤   ¤   kNotAllowedStirngID,
c11324 ¤   ¤   ¤   ¤   kRSAAlgorithmDisabledStringID,
a2edf8 ¤   ¤   ¤   ¤   kMinimumKeyGenerationSize,
09f033 ¤   ¤   ¤   ¤   kAllowConventionalEncryptionStringID,
28af3e ¤   ¤   ¤   ¤   kMessageHeaderCommentStringID,
929545 ¤   ¤   ¤   ¤   kPreLoadedKeysStringID,
ed317f ¤   ¤   ¤   ¤   kInstallerAdminStringID,
23316c ¤   ¤   ¤   ¤   kConfiguredForStringID,
a02c91 ¤   ¤   ¤   ¤   kClientStringID
50bf26 };¶
--20b2 0003fca3a4f401200b3 Page 1 of PGPclientLib.prj.exp
396c03 PGPGetClientLibFSSpec
fc916d PGPSelectKeysDialog
b31e4a PGPClientSigningPassphraseDialog
7a2fd7 PGPClientRecipientDialog
56bb2b PGPClientDecryptionPassphraseDialog
30f087 PGPPreferencesDialog
843d14 PGPInitClientDecodeEventHandlerData
a82e2e PGPCleanupClientDecodeEventHandlerData
3b4886 PGPClientDecodeEventHandler
46ecc0 PGPReconstitutionDialog
1fab46 PGPCheckAutoUpdateKeysFromServer
3d3f80 PGPSignerKeyLookup
3c5488 PGPRSASupported
7daf5a
a8d412 PGPNewPassBuffer
ffe94d PGPFreePassBuffer
376eb2 PGPCopyPassBuffer
9d1e91 PGPPassBufferSetPassphrase
311aab PGPPassBufferSetPassKey
978957 PGPClearPassBuffer
a012d6 PGPPassBufferGetPassphrasePtr
ccedd1 PGPPassBufferGetPassKeyPtr
058252 PGPOPassBuffer
2a08a3 PGPGetPassBufferType
a1af5a
32b6a5 PGPGetPGPFileName
8bdd40 PGPGetPGPFileDefaultFSSpec
86ef3f PGPSetPGPFileFSSpec
981a03 PGPSelectPGPFile
a1af5a
c40574 PGPGetKeyFromServer
d0bac9 PGPGetKeyIDFromServer
83a744 PGPGetGroupFromServer
051c6f PGPGroupListOperationOnServer
1d90fe PGPSendKeyToServer
fa0816 PGPConfirmRemoteKeyDialog
aaaf5a
e171a3 PGPOpenPrefFile
671294 PGPSavePrefFile
4ff14e PGPClosePrefFile
41f088 PGPGetPrefFileSpec
cc5503 PGPGetPrefData
7845ad PGPSetPrefData
4ecaf7 PGPRemovePref
b6e4ad PGPDisposePrefData
80eec9 PGPGetPrefBoolean
ce6494 PGPSetPrefBoolean
147746 PGPGetPrefNumber
a45228 PGPSetPrefNumber
605157 PGPGetPrefStringAlloc
8b1b8a PGPGetPrefStringBuffer
8a11a3 PGPSetPrefString
eaaf5a
45af5a
fe53be PGPOpenClientPrefs
c56899 PGPOpenAdminPrefs
6fc9fc PGPIsAdminConfigured
0b9752 PGPGetGroupsFileFSSpec
974cdb PGPGetKeyServerPrefs
8641fb PGPSetKeyServerPrefs
a2dab5 PGPCreateKeyServerPath
f9148c PGPDisposeKeyServerPath
5bdc9f PGPGetRootKeyServer
49ce54 PGPGetKeyServerURL
29e3e1 PGPFindEmailDomain
e86b97 PGPGuaranteeMinimumEntropy
d1af5a
805331 PGPCreateShares
dea86e PGPGetPasskeyFromShares
3acd98 PGPSplitShares
a3adee PGPCombineShares
3f381a PGPFreeShares
--cad5 0003afed0e8401200b3 Page 2 of PGPclientLib.prj.exp
4d4dae PGPGetKeyIDFromShares
a6d719 PGPGetShareThreshold
34753a PGPGetNumberOfShares
51270e PGPGetTotalNumberOfShares
456884 PGPNewShareFile
4dd478 PGPFreeShareFile
fe9417 PGPCopySharesFromFile
a92a8a PGPCopySharesToFile
c6a56e PGPGetShareFileUserID
2a8461 PGPSetShareFileUserID
980cb2 PGPOpenShareFile
3749ed PGPSaveShareFile
2076d0 PGPGetShareFileSpec
52583a PGPGetShareFileOwnerKeyID
b3b324 PGPSetShareFileOwnerKeyID
5be05d PGPGetShareFileOwnerFingerprint
f2f745 PGPSetShareFileOwnerFingerprint
6a5072 PGPGetShareFileSharedKeyID
4af737 PGPGetShareThresholdInFile
9bb375 PGPGetNumSharesInFile
2e0a63 PGPskepSendShares
235628 PGPskepReceiveShares
f2ca6d PGPskepSetEventHandler
f91559 PGPNewSKEP
ea5762 PGPFreeSKEP
37094a PGPGetSKEPContext
08af5a
5d5404 CountKeysInDefaultKeyring
00e601 PGPSharedForEachKeyDo
764fad PGPSharedGetKeyProperties
967e9e PGPSharedAddKeysToDefaultKeyring
b7e33d PGPSharedGetIndKeyFromKeySet
a7af5a
80f4d0 pgpNewContextCustomMacAllocators
2caf5a
b8b641 PGPGetClientErrorString
e6af5a
d85bb4 OpenURL
36af5a
b330af GetOSErrorString
b6b5ad MacErrorToPGPError
425489 PGPErrorToMacError
36af5a
e9af5a
b35280 GetAllModifiers
e55c3f GetModifiers
88a147 CapsLockIsDown
47af5a
6ab311 PFLCopyFileSpec
f84e79 PFLFreeFileSpec
0bfa81 PFLExportFileSpec
98d8ce PFLImportFileSpec
af2474 PFLGetFileSpecName
8348cb PFLGetFileSpecNameBuffer
c4ad9e PFLSetFileSpecName
6be042 PFLExtendFileSpecName
d541ad PFLGetMaxFileSpecNameLength
2ae5bb PFLSetFileSpecMetaInfo
1d7215 PFLFileSpecGetUniqueSpec
68414a PFLFileSpecExists
fe7c2f PFLFileSpecCreate
23c6de PFLFileSpecDelete
8e5635 PFLFileSpecRename
7ec714 PFLGetTempFileSpec
57bf17 PFLGetFileSpecMemoryMgr
fbaf5a
ab7438 pflFileSpecIsValid
74fb60 PGPOpenFileSpec
44b949 PGPSetFileSize
98420c PFLNewFileSpecFromFSSpec
66c069 PFLGetFSSpecFromFileSpec
3a6075 PGPFreeIO
--d128 0009b9532bc401200b3 Page 3 of PGPclientLib.prj.exp
9f6de1 PGPIORead
6a4f7b PGPIOWrite
bb327b PGPIOSetPos
95e8c4 PGPIOGetPos
548e13 PGPIOGetEOF
67b4f0 PGPIOFlush
b6f373 PGPIOIsAtEOF
9e8c57 PGPIOIsValid
cb2138 PGPCopyIO
b0c1b2 PGPCopyIOUsingBuffer
cd2138 PGPCopyIO
afc1b2 PGPCopyIOUsingBuffer
06cf7f PGPLineEndIOIsValid
81490f PGPNewLineEndIO
5769be PGPNewMemoryIO
08b71f PGPNewMemoryIOFixedBuffer
b7269b PGPMemoryIOIsValid
554f87 PGPProxyIOIsValid
45975e PGPNewStdFileIO
cb5e04 PGPStdFileIOIsValid
f10e2b PGPFileIOIsValid
30af5a
db134c pgpWordWrapIO
7bd791 pgpWordWrapFileFSSpec
b7af5a
3e8dad PGPGetFileNameExtension
967ad5 PGPNewNumberFileName
a0fd7c pgpCompareStringsIgnoreCase
b2374a pgpCompareStringsIgnoreCaseN
fdaf5a
63f5cd NumVersionToString
d5f4bb VersionToString
0bd000 CopyPString
7fd062 CopyPStringMax
516e45 AppendPString
bd4fd7 AppendPStringMax
f2740d InsertInPString
f66729 DeleteFromPString
eef9b0 PrintPString
bd3011 PStringsAreEqual
f63aa4 PStringHasSuffix
164759 CToPString
6c1907 PToCString
3efd4a GetIndCString
a07c91 FindSubStringNoCase
f301a8 CopyCString
30dbcc AppendStringToHandle
b3b4f5 InsertPStrings
47af5a
403753 FindProcess
80af5a
24af5a
75f2ae FSpGetCatInfo
3bddbe FSpSetCatInfo
5434cc FSpExists
49e53f FSpDeleteResourceFork
853e3e FSpGetFullPath
62b06a FindPGPPreferencesFolder
4bebf4 FSpReadBytes
94e0ec FSpGetForkSizes
907d43 FSpGetUniqueSpec
4dd522 FSpChangeFileType
193265 FSpCopyFiles
5ce5a5 FSpOpenFork
70f654 FSIsTrashFolder
9ec1b4 GetVolumeBlockCounts
22777d GetSpecFromRefNum
01666b FlushFile
10edf0 FSWriteUncached
ff12b8 GetVolumeAllocBlockSize
47f972 GetAllVRefNums
9be7a4 FSpEqual
--ec1e 0019861aaa2401200b3 Page 4 of PGPclientLib.prj.exp
d3ac04 FSpFindOpenForkRef
54478d FSCopyBytes
9dd8b9 FSSpecContainsFSSpec
d77489 DirContainsFSSpec
292984 FSGetUniqueName
094222 GetVCBForVolume
d5bb82 GetDiskExtentsForFork
c56e53 FreeDiskExtentList
7b5990 FSReadAtOffset
7d2e93 FSWriteAtOffset
90fb34 FileSharingIsActive
e55c8d pgpPBXGetVolInfo
77c7b9 GetVolumeForFile
dbb42a GetVolumeFreeAllocBlocks
6fbf8a GetVolumeName
5be8f2 FSWriteFileUsingDriver
7f994c FSReadFileUsingDriver
26ab1b GetVolumeDriveNumberAndRefNum
1621a7 FSpGetFileVersion
78af5a
bd3753 FindProcess
7ce76d FindApplication
45c705 FindApplicationOnVolume
92da8b BringAppToFront
67af5a
982d97 PGPForYourEyesOnlyDialog¶
--614c 000067684bc401200b4 Page 1 of pgpClientLib.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ce8833 ¤   $Id: pgpClientLib.h,v 1.42.2.3.2.1 1998/11/12 03:07:07 heller Exp $
19f7f7 ____________________________________________________________________________*/
f5af5a
8c3e69 #ifndef Included_pgpClientLib_h¤/* [ */
2b1900 #define Included_pgpClientLib_h
10af5a
47e82c #include "pgpPubTypes.h"
21af5a
bbe8b2 #include "pflPrefs.h"
bec2ae #include "pgpGroups.h"
d1ed82 #include "pgpKeyServerPrefs.h"
4ae684 #include "pgpUserInterface.h"
d8ee51 #include "pgpPassBuffer.h"
04ec82 #include "pgpTLS.h"
bdaf5a
1c99c6 PGP_BEGIN_C_DECLARATIONS
f4af5a
eacbcf #if PRAGMA_IMPORT_SUPPORTED
57b981 #pragma import on
707454 #endif
9aaf5a
5a7e52 typedef enum PGPFileSelector
24bb36 {
5b377e ¤   kPGPFileSelector_PublicKeys¤= 1,
99cb14 ¤   kPGPFileSelector_PrivateKeys,
d029de ¤   kPGPFileSelector_RandomSeed,
d565be ¤   kPGPFileSelector_Groups,
dfa699 ¤   kPGPFileSelector_KeyShares
74af5a
a34762 } PGPFileSelector;
6caf5a
a37353 enum
24bb36 {
33cc72 ¤   /* relevant signing and encryption */
e4388d ¤   kPGPUISettingsTextOutput¤   ¤   = (1UL << 0 ),
c778f7 ¤   kPGPUISettingsNoMacBinary¤  ¤   = (1UL << 1),
a8c000 ¤   kPGPUISettingsSmartMacBinary¤   = (1UL << 2),
ef9185 ¤   kPGPUISettingsForceMacBinary¤   = (1UL << 3),
c267c5 ¤
4be246 ¤   /* encryption only */
d78614 ¤   kPGPRecipientSettingsWipeOriginal¤  ¤   = (1UL << 8),
57ab9e ¤   kPGPRecipientSettingsConvEncrypt¤   ¤   = (1UL << 9),
9c2a31 ¤   kPGPRecipientSettingsFYEO¤  ¤   ¤   ¤   = (1UL << 10),
0967c5 ¤
b02b90 ¤   /* signing only */
0447bf ¤   kPGPGetPassphraseSettingsDetachedSig¤   = (1UL << 16)
d582f7 };
55af5a
077353 enum
4cbb36 {
12bddb ¤   kPGPSelectKeysImportVariation¤  = (1L << 0),
377d72 ¤   kPGPSelectKeysNoRSAKeys¤¤   ¤   = (1L << 1),
e2af5a
ba6606 ¤   kPGPSelectKeysDefault = 0
e682f7 };
67af5a
d87ced typedef PGPFlags¤   PGPUISettings;
5926c9 typedef PGPFlags¤   PGPRecipientSettings;
676550 typedef PGPFlags¤   PGPSelectKeysSettings;
8eaf5a
40af5a
f4af5a
6d0301 /* PGPRecipientOptions */
708250 typedef PGPFlags¤   PGPRecipientOptions;
517353 enum
cebb36 {
b70169 ¤   kPGPRecipientOptionsHideFileOptions¤¤   = (1L << 0),
06e7ba ¤   kPGPRecipientOptionsAlwaysShowDialog¤   = (1L << 1),
--50b0 000dede1f6c401200b4 Page 2 of pgpClientLib.h
ab76b2 ¤   kPGPRecipientOptionsShowFYEO¤   ¤   ¤   = (1L << 2),
fdaf5a
7c58bb ¤   kPGPRecipientOptionsDefault = 0
c582f7 };
6baf5a
fff1e4 #define kPGPRecipientSettingsDefault¤   ¤   0
0c5241 #define kPGPGetPassphraseSettingsDefault¤   0
cdaf5a
1e7353 enum
15bb36 {
1777c2 ¤   kPGPGetPassphraseOptionsHideFileOptions¤= (1L << 0),
d9af5a
c6fc62 ¤   kPGPGetPassphraseOptionsDefault = 0
6a82f7 };
00af5a
7f3a03 typedef PGPFlags¤   PGPGetPassphraseOptions;
bd466f typedef PGPFlags¤   PGPGetPassphraseSettings;
f3af5a
65e47c //¤ numDefaultRecipients containes the number of recipients already present
3ab002 //¤ in the recipients list. Specify 0 for no default recipients.
4cef59 //¤ defaultRecipients is the list of numDefaultRecipients recipients. Specify
594ab9 //¤ nil for no default recipients.
16aca3 //¤ dialogOptions contains programatic options for controlling dialog behavior.
7bc415 //¤ defaultSettings contains the initial states of the dialog checkboxes.
9d6998 //¤ userSettings contains the final states of the dialog checkboxes.
98e6be //¤ actualRecipients specifies the PGP encrypted
2d9266 // ·recipients chosen by the user. Use PGPFreeRecipientList() to delete the
39869a // ·recipient list.·
cdaf5a
fcc744 ¤   PGPError
a31dc4 PGPClientRecipientDialog(
6409ea ¤   PGPContextRef¤  ¤   ¤   context,¤   ¤   ¤   ¤   ¤
395175 ¤   PGPtlsContextRef¤   ¤   tlsContext,
f40822 ¤   PGPKeySetRef¤   ¤   ¤   allKeys,¤   ¤   ¤   ¤   ¤
404043 ¤   PGPUInt32¤  ¤   ¤   ¤   numDefaultRecipients,¤  ¤
5eb2b1 ¤   const PGPRecipientSpec¤ *defaultRecipients,¤¤   ¤
c58f18 ¤   PGPRecipientOptions¤¤   dialogOptions,¤ ¤   ¤   ¤
10cf38 ¤   PGPRecipientSettings¤   defaultSettings,
10085b ¤   PGPRecipientSettings¤   *userSettings,¤ ¤   ¤
c92c2c ¤   PGPKeySetRef¤   ¤   ¤   *actualRecipients,¤ ¤   ¤
befd1e ¤   PGPKeySetRef¤   ¤   ¤   *newKeys);¤ ¤   ¤
8265b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·
df87c7 ¤   ¤   ¤
8c0955 /* caller must call PGPFreeKey() on actualSigningKey */
55c744 ¤   PGPError
345299 PGPClientSigningPassphraseDialog(
dc49b2 ¤   PGPContextRef¤  ¤   ¤   ¤   context,¤   ¤   ¤   ¤
b6356e ¤   PGPKeySetRef¤   ¤   ¤   ¤   allKeys,¤   ¤   ¤   ¤
9e3e0c ¤   const char ¤¤   ¤   ¤   ¤   *prompt,¤   ¤   ¤   ¤
762d07 ¤   PGPGetPassphraseOptions¤¤   dialogOptions,¤ ¤   ¤
116f39 ¤   PGPGetPassphraseSettings¤   defaultSettings,¤   ¤
e2b3f9 ¤   PGPKeyRef¤  ¤   ¤   ¤   ¤   defaultSigningKey,¤ ¤
60a8a4 ¤   char¤   ¤   ¤   ¤   ¤   ¤   passphrase[256],
ea52ef ¤   PGPGetPassphraseSettings¤   *userSettings,¤ ¤   ¤
b4a3bd ¤   PGPKeyRef ¤ ¤   ¤   ¤   ¤   *actualSigningKey);¤¤
99af5a
96c744 ¤   PGPError
d220b3 PGPClientDecryptionPassphraseDialog(
00a1bc ¤   PGPContextRef¤  ¤   context,
606c35 ¤   PGPtlsContextRef¤   tlsContext,
33dccc ¤   const char¤ ¤   ¤   *prompt,¤   ¤   ¤   ¤   ¤   ¤
aa0ae9 ¤   PGPKeySetRef¤   ¤   recipientKeys,
46b570 ¤   const PGPKeyID¤ ¤   keyIDList[],¤   ¤
87f46c ¤   PGPUInt32¤  ¤   ¤   keyIDCount,
6df283 ¤   PGPOptionListRef¤   additionalOptions,
e7f22b ¤   char¤   ¤   ¤   ¤   **passphrase,
c08748 ¤   PGPKeyRef ¤ ¤   ¤   *decryptionKey,
d594ae ¤   PGPKeySetRef¤   ¤   *newKeys);
4867c5 ¤
7cc744 ¤   PGPError
5607ab PGPSelectKeysDialog(
de9a06 ¤   PGPContextRef¤  ¤   ¤   context,
--0e02 0008c5f2130401200b4 Page 3 of pgpClientLib.h
77741a ¤   PGPSelectKeysSettings¤  settings,
fb9d2d ¤   const char¤ ¤   ¤   ¤   *prompt,¤   ¤   ¤   ¤   ¤   ¤   ¤
83b0eb ¤   PGPKeySetRef¤   ¤   ¤   fromSet,¤   ¤   ¤   ¤   ¤   ¤   ¤
1b6d64 ¤   PGPKeySetRef¤   ¤   ¤   validitySet,¤   /* can be NULL */
db633b ¤   PGPKeySetRef¤   ¤   ¤   *selectedSet);¤ /* Caller is responsible for¤   */
2fd04c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* freeing selectedSet¤ ¤   ¤   */
eaaf5a
63c744 ¤   PGPError
178a7f PGPGetKeyFromServer(
d5a1bc ¤   PGPContextRef¤  ¤   context,
836c35 ¤   PGPtlsContextRef¤   tlsContext,
8afb7a ¤   PGPKeyRef¤  ¤   ¤   key,
679a9b ¤   PGPKeySetRef¤   ¤   *resultSet);
2daf5a
16c744 ¤   PGPError
11e4ae PGPGetKeyIDFromServer(
c3a1bc ¤   PGPContextRef¤  ¤   context,
dd6c35 ¤   PGPtlsContextRef¤   tlsContext,
9f6625 ¤   PGPKeyID const *¤   keyID,
f59a9b ¤   PGPKeySetRef¤   ¤   *resultSet);
82af5a
d1c744 ¤   PGPError
56bb5e PGPGetGroupFromServer(
e4a1bc ¤   PGPContextRef¤  ¤   context,
c76c35 ¤   PGPtlsContextRef¤   tlsContext,
1be468 ¤   PGPGroupSetRef¤ ¤   groupSet,
e6a35c ¤   PGPGroupID¤ ¤   ¤   groupID,
f68b6f ¤   const char¤ ¤   ¤   *domain,¤   /* if not-NULL, used for domain info */
a92595 ¤   PGPUInt32¤  ¤   ¤   dialogDelayTicks,
339a9b ¤   PGPKeySetRef¤   ¤   *resultSet);
ecaf5a
7ec744 ¤   PGPError
232434 PGPGroupListOperationOnServer(
97a1bc ¤   PGPContextRef¤  ¤   context,
9e6c35 ¤   PGPtlsContextRef¤   tlsContext,
1f3ec1 ¤   PGPKeySetRef¤   ¤   allKeys,
bf08e4 ¤   PGPBoolean¤ ¤   ¤   sendGroups,
12385d ¤   PGPGroupSetRef¤ ¤   *groupSet );
9eaf5a
d3c744 ¤   PGPError
cea1b8 PGPSendKeyToServer(
daa1bc ¤   PGPContextRef¤  ¤   context,
2a6c35 ¤   PGPtlsContextRef¤   tlsContext,
86fb7a ¤   PGPKeyRef¤  ¤   ¤   key,
d23879 ¤   PGPKeyServerEntry¤  *targetServer);¤/* if NULL, follows domain */
7067c5 ¤
3ec744 ¤   PGPError
2b5f84 PGPGuaranteeMinimumEntropy(
2946db ¤   PGPContextRef¤  ¤   context);
59af5a
dfc744 ¤   PGPError
6b7939 PGPReconstitutionDialog(
36612f ¤   PGPKeyRef¤  ¤   ¤   keyToCollect,
6f3ed7 ¤   PGPKeySetRef¤   ¤   keySet, ¤   /* used to find decryption key for key */
0b7949 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* share files and SKEP authentication */
f0daab ¤   PGPtlsContextRef¤   tlsContext,¤/* can be kInvalidPGPtlsContextRef */
ded103 ¤   PGPByte **¤ ¤   ¤   passKey,¤   /* should be freed with PGPFreeData */
1ea00c ¤   PGPSize *¤  ¤   ¤   passKeySize);
7567c5 ¤
30c744 ¤   PGPError
f8aeda PGPForYourEyesOnlyDialog(
133c55 ¤   PGPContextRef¤  inContext,
a61881 ¤   const char *¤   inString);
b5af5a
c6c744 ¤   PGPError
efca66 PGPConfirmRemoteKeyDialog(
99db13 ¤   const char *¤   ¤   ¤   prompt,
850a93 ¤   const char *¤   ¤   ¤   remoteHostName,
65e260 ¤   PGPKeyRef¤  ¤   ¤   ¤   keyToConfirm,
3a852f ¤   PGPtlsCipherSuiteNum¤   tlsCipher,
8c42a8 ¤   PGPBoolean¤ ¤   ¤   ¤   askConfirm );
8caf5a
--ad79 000d6984eb6401200b4 Page 4 of pgpClientLib.h
ddd8b3 /*¤ If addedKeySetToJob is true, you will get another kPGPEvent_SignatureEvent
29140a ¤   for the signature. If you pass a keyset into defaultKeySet,
1bf423 ¤   PGPSignerKeyLookup will attempt to selectively import the new keys into
c7a574 ¤   your default key ring. If you pass a pointer to a keysetref into·
90ded6 ¤   newKeySet, PGPSignerKeyLookup will return the new keys.
677fe0 */
e4c744 ¤   PGPError
403bee PGPSignerKeyLookup(
aa520e ¤   PGPContextRef¤  context,
dc7727 ¤   PGPEvent *¤ ¤   event,¤ ¤   ¤   ¤   /*¤ the kPGPEvent_SignatureEvent */
24a3db ¤   PGPKeySetRef¤   defaultKeySet,¤ ¤   /*¤ used for selective import validity
a69eaa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (optional) */
0515b1 ¤   PGPBoolean *¤   addedKeySetToJob,¤  /* ¤true if a keyset was added to the
7fb709 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   job */
03e292 ¤   PGPKeySetRef *¤ newKeySet);¤¤   ¤   /*¤ signer key (optional) */
c667c5 ¤
b37353 enum
74bb36 {
5fa7f7 ¤   kPGPPrefDialog_ChangedKeyFiles ¤¤   = (1L << 0),
f47904 ¤   kPGPPrefDialog_ChangedServerList¤   = (1L << 1)
6782f7 };
4baf5a
8dce2b typedef PGPFlags¤   PGPPrefDialogFlags;
8baf5a
d68065 PGPError¤   PGPPreferencesDialog(
6ed6a7 ¤   ¤   ¤   ¤   ¤   PGPContextRef ¤ ¤   context,
a70f9a ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   allKeys,¤   ¤   /* Optional */
859b45 ¤   ¤   ¤   ¤   ¤   PGPPrefRef ¤¤   ¤   clientPrefs,¤   /* Optional */
29f131 ¤   ¤   ¤   ¤   ¤   PGPPrefRef ¤¤   ¤   adminPrefs,¤¤   /* Optional */
83b56b ¤   ¤   ¤   ¤   ¤   PGPPrefDialogFlags ¤*flags);¤   ¤   /* Optional */
1baf5a
2b52f2 typedef struct PGPClientDecodeEventHandlerData
9cbb36 {
e6429f ¤   PGPContextRef¤  ¤   ¤   context;
f589ec ¤   PGPtlsContextRef¤   ¤   tlsContext;
cfae97 ¤   PGPKeySetRef¤   ¤   ¤   allKeys;
a151de ¤   PGPKeyRef¤  ¤   ¤   ¤   decryptionKey;
cff84c ¤   PGPBoolean¤ ¤   ¤   ¤   conventional;
abfea6 ¤   PGPBoolean¤ ¤   ¤   ¤   split;
f9b5d4 ¤   PGPPassBufferRef¤   ¤   passBuffer;
5e616c ¤   PGPKeySetRef¤   ¤   ¤   newKeySet;
e57546 ¤   PGPKeySetRef¤   ¤   ¤   recipientKeySet;
3a8eb1 ¤   PGPKeyID¤   ¤   ¤   ¤   *recipientKeyIDList;
3ed874 ¤   PGPUInt32¤  ¤   ¤   ¤   recipientKeyIDCount;
d1f153 ¤   char¤   ¤   ¤   ¤   ¤   prompt[256];
b191f7 ¤   PGPByte¤¤   ¤   ¤   ¤   *outputBuffer;
0e2ded ¤   PGPSize¤¤   ¤   ¤   ¤   outputBufferSize;
205a41 ¤   PGPEventSignatureData¤  signatureData;
04d349 ¤   PGPBoolean¤ ¤   ¤   ¤   signatureDataValid;
339d81 ¤   PGPAnalyzeType¤ ¤   ¤   sectionType;
cf67c5 ¤
624883 } PGPClientDecodeEventHandlerData;
68af5a
ebe225 PGPError¤   PGPInitClientDecodeEventHandlerData( PGPContextRef context,
90f37a ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext, PGPKeySetRef allKeys,
a67c6a ¤   ¤   ¤   ¤   ¤   PGPClientDecodeEventHandlerData *data );
c4c5a3 void¤   ¤   PGPCleanupClientDecodeEventHandlerData(
c17c6a ¤   ¤   ¤   ¤   ¤   PGPClientDecodeEventHandlerData *data );
a3e9f5 PGPError¤   PGPClientDecodeEventHandler( PGPContextRef context,
dc7950 ¤   ¤   ¤   ¤   ¤   struct PGPEvent *event,
427c6a ¤   ¤   ¤   ¤   ¤   PGPClientDecodeEventHandlerData *data );
f9ae30 ¤   ¤   ¤   ¤   ¤
f50ccb OSStatus¤   PGPGetClientLibFSSpec(FSSpec *fileSpec);
79aef3 PGPError¤   PGPGetPGPFileName(PGPContextRef context, PGPFileSelector whichFile,
fd4dfd ¤   ¤   ¤   ¤   ¤   ¤   StringPtr fileName);
63d19a PGPError¤   PGPGetPGPFileDefaultFSSpec(PGPContextRef context,
06188d ¤   ¤   ¤   ¤   ¤   ¤   PGPFileSelector whichFile, FSSpec *fileSpec);
70270f PGPError¤   PGPSetPGPFileFSSpec(PGPContextRef context,
c3b159 ¤   ¤   ¤   ¤   ¤   ¤   PGPFileSelector whichFile, const FSSpec *fileSpec );
98eff6 PGPError¤   PGPSelectPGPFile(PGPContextRef context, PGPFileSelector whichFile,
e2a370 ¤   ¤   ¤   ¤   ¤   ¤   FSSpec *fileSpec);
d694aa ¤   ¤   ¤   ¤   ¤   ¤
--d61f 001c93e5614401200b4 Page 5 of pgpClientLib.h
d3c744 ¤   PGPError
0b9840 PGPCheckAutoUpdateKeysFromServer(
d10185 ¤   PGPMemoryMgrRef¤memoryMgr,
1bc5ba ¤   PGPBoolean¤ ¤   launchKeys,
f15e57 ¤   PGPBoolean *¤   updateAllKeys,¤ ¤   ¤   ¤   /* can be NULL */
11895b ¤   PGPBoolean *¤   updateTrustedIntroducers);¤ /* can be NULL */
fb67c5 ¤
67c744 ¤   PGPError
aab7cd PGPRSASupported(
64c3a5 ¤   PGPBoolean *¤   hasRSA);
2067c5 ¤
ebc744 ¤   PGPError
f882f3 PGPIsAdminConfigured(
c39e1c ¤   PGPBoolean *¤   isConfigured);
601b52 ¤   ¤
61cbcf #if PRAGMA_IMPORT_SUPPORTED
272ced #pragma import reset
cb7454 #endif
2caf5a
ff1254 PGP_END_C_DECLARATIONS
f5af5a
4b327f /* Stack based class for saving and restoring thread storage */
9eaf5a
3609eb #ifdef __cplusplus¤ /* [ */
87c008 class StPGPPreserveKeyServerStorage {
415ed4 public:
69c230 ¤   ¤   ¤   StPGPPreserveKeyServerStorage() : mStorage(NULL)
c7d7a6 ¤   ¤   ¤   ¤   { PGPKeyServerCreateThreadStorage(&mStorage); }
2a844c ¤   ¤   ¤   ~StPGPPreserveKeyServerStorage()
c24925 ¤   ¤   ¤   ¤   { PGPKeyServerDisposeThreadStorage(mStorage); }
c3af5a
a8a2d3 protected:
e21be5 ¤   PGPKeyServerThreadStorageRef¤   mStorage;
e782f7 };
c779c3 #endif¤ /* ] __cplusplus */
71af5a
8b43c6 #endif /* ] Included_pgpClientLib_h */
74af5a
bfaf5a
247e4d /*__Editor_settings____
7aaf5a
544126 ¤   Local Variables:
497b17 ¤   tab-width: 4
8a0e6c ¤   End:
7b5f8c ¤   vi: ts=4 sw=4
439e9b ¤   vim: si
c9d062 _____________________*/
--72a1 00018f085bf401200b5 Page 1 of CConfirmRemoteKeyDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
315b2e ¤   $Id: CConfirmRemoteKeyDialog.cp,v 1.6.8.1 1998/11/12 03:07:08 heller Exp $
73f7f7 ____________________________________________________________________________*/
d7af5a
8d49f7 #include <LProgressBar.h>
06d797 #include <LPushButton.h>
a07c99 #include <URegistrar.h>
53af5a
ab0d08 #include "pgpMem.h"
5aaf5a
6d076e #include "PGPclientLibUtils.h"
34a02f #include "pgpClientLib.h"
d7af5a
893a2c #include "WarningAlert.h"
baaf5a
040e06 #include "UPGPException.h"
bf0bb4 #include "CString.h"
83af5a
011d9e #include "CConfirmRemoteKeyDialog.h"
adaf5a
56af5a
23fc7e static const PaneIDT¤   caption_Prompt¤ ¤   ¤   =¤  'cPro';
27474c static const PaneIDT¤   caption_RemoteAddress¤  =¤  'cRem';
cc5d0d static const PaneIDT¤   caption_Name¤   ¤   ¤   =¤  'cNam';
5d9b2c static const PaneIDT¤   caption_Fingerprint¤¤   =¤  'cFin';
dc4bd0 static const PaneIDT¤   progressBar_Validity¤   =¤  'pVal';
cd5b3d static const PaneIDT¤   caption_TLSCipherSuite¤ =¤  'cTLS';
464d2d static const PaneIDT¤   button_Cancel¤  ¤   ¤   =¤  'bCAN';
fd557e static const PaneIDT¤   button_Confirm¤ ¤   ¤   =¤  'bOK ';
07af5a
2e78ed static const ResIDT¤¤   kConfirmKeyDialogID¤¤   =¤  4754;
fb9077 static const ResIDT¤¤   kTLSCiphersStringListID¤=¤  8947;
a1af5a
7daf5a
10c744 ¤   PGPError
f8ca66 PGPConfirmRemoteKeyDialog(
e6db13 ¤   const char *¤   ¤   ¤   prompt,
310a93 ¤   const char *¤   ¤   ¤   remoteHostName,
17e260 ¤   PGPKeyRef¤  ¤   ¤   ¤   keyToConfirm,
bc852f ¤   PGPtlsCipherSuiteNum¤   tlsCipher,
f18c40 ¤   PGPBoolean¤ ¤   ¤   ¤   askConfirm )
37bb36 {
2de4de ¤   PGPError¤   ¤   ¤   result;
fe9a69 ¤   PGPclientLibState¤  state;
4367c5 ¤
6c622f ¤   PGPValidatePtr(prompt);
87cd59 ¤   PGPValidatePtr(remoteHostName);
5e9ee8 ¤   PGPValidateParam(PGPKeyRefIsValid(keyToConfirm));
4767c5 ¤
6c5168 ¤   try {
0a976a ¤   ¤   result = EnterPGPclientLib(PGPGetKeyContext(keyToConfirm), &state);
3f7568 ¤   ¤   if (IsntPGPError(result)) {
c67eeb ¤   ¤   ¤   DialogRef¤  theDialog;
93af5a
a42a9d ¤   ¤   ¤   RegisterClass_(CConfirmRemoteKeyDialog);
3f87c7 ¤   ¤   ¤
757fbd ¤   ¤   ¤   // Suspend leak checking since LGAProgressBarImp leaks its LGWorlds
0a69cf ¤   ¤   ¤   MacLeaks_Suspend();
722f11 ¤   ¤   ¤   theDialog = CConfirmRemoteKeyDialog::CreateDialog(
b7a91b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kConfirmKeyDialogID);
7d8110 ¤   ¤   ¤   MacLeaks_Resume();
839233 ¤   ¤   ¤   if (IsntNull(theDialog)) {
462c45 ¤   ¤   ¤   ¤   CConfirmRemoteKeyDialog *¤  dialog;
cd2b85 ¤   ¤   ¤   ¤
2f7dde ¤   ¤   ¤   ¤   dialog = (CConfirmRemoteKeyDialog *)·
9a0481 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::GetWRefCon(theDialog);
181a74 ¤   ¤   ¤   ¤   pgpAssertAddrValid(dialog, VoidAlign);
--6acf 00008789a9a401200b5 Page 2 of CConfirmRemoteKeyDialog.cp
9f2b85 ¤   ¤   ¤   ¤
19246c ¤   ¤   ¤   ¤   result = dialog->SetInfo(¤  CString(prompt),
d591fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(remoteHostName),
037622 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyToConfirm,
451acc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tlsCipher,
b3a6e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   askConfirm);
b4385b ¤   ¤   ¤   ¤   if (IsntPGPError(result)) {
86db46 ¤   ¤   ¤   ¤   ¤   result = dialog->DoDialog();
8c2613 ¤   ¤   ¤   ¤   }
2f2b85 ¤   ¤   ¤   ¤
4117a0 ¤   ¤   ¤   ¤   delete dialog;
efc2e6 ¤   ¤   ¤   ¤   ::DisposeDialog(theDialog);
1f042d ¤   ¤   ¤   } else {
8dce36 ¤   ¤   ¤   ¤   result = kPGPError_OutOfMemory;
70a3a6 ¤   ¤   ¤   }
910fe4 ¤   ¤   }
62c218 ¤   ¤   ExitPGPclientLib(&state);
6f9371 ¤   }
7d67c5 ¤
e1e0a3 ¤   catch (...) {
42414a ¤   ¤   result = kPGPError_UnknownError;
ad9371 ¤   }
d067c5 ¤
575d73 ¤   return result;
6defe6 }
0067c5 ¤
b367c5 ¤
3d67c5 ¤
0428db CConfirmRemoteKeyDialog::CConfirmRemoteKeyDialog(
b3cbb0 ¤   LStream *¤  inStream)
c6a3c8 ¤   : CPGPModalGrafPortView(inStream)
eebb36 {
4cac88 ¤   mWindowIsMoveable = true;
37efe6 }
d4af5a
c4af5a
39af5a
e89cb0 CConfirmRemoteKeyDialog::~CConfirmRemoteKeyDialog()
70bb36 {
bcefe6 }
7daf5a
60af5a
d0af5a
dcc744 ¤   PGPError
fa3375 CConfirmRemoteKeyDialog::SetInfo(
35a424 ¤   StringPtr¤  ¤   ¤   ¤   inPrompt,
5673ad ¤   StringPtr¤  ¤   ¤   ¤   inRemoteHostName,
6050ff ¤   PGPKeyRef¤  ¤   ¤   ¤   inKey,
e2852f ¤   PGPtlsCipherSuiteNum¤   tlsCipher,
63cc83 ¤   PGPBoolean¤ ¤   ¤   ¤   askConfirm)
c1bb36 {
6a5caa ¤   PGPError¤   ¤   result;
27e54b ¤   Str255¤ ¤   ¤   string;
2ea7c9 ¤   PGPSize¤¤   ¤   fullSize;
ae62f4 ¤   PGPByte¤¤   ¤   fingerprint[256];
ac4217 ¤   uchar *¤¤   ¤   p;
bd2058 ¤   PGPInt32¤   ¤   validity;
2559ad ¤   LProgressBar *¤ validityBar = (LProgressBar *) FindPaneByID(
c4524a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   progressBar_Validity);
55429c ¤   static char¤¤   sHexDigit[] = "0123456789ABCDEF";
e267c5 ¤
b276c5 ¤   FindPaneByID(caption_Prompt)->SetDescriptor(inPrompt);
ccd287 ¤   FindPaneByID(caption_RemoteAddress)->SetDescriptor(inRemoteHostName);
af67c5 ¤
85c38f ¤   if( !askConfirm )
f2c7a1 ¤   {
5f6e45 ¤   ¤   FindPaneByID(button_Cancel)->Hide();
bfc58c ¤   ¤   GetIndString( string, kTLSCiphersStringListID, 1 );
436f21 ¤   ¤   FindPaneByID(button_Confirm)->SetDescriptor( string );
439371 ¤   }
7f1eaf ¤   GetIndString( string, kTLSCiphersStringListID, ( (Int16)tlsCipher ) + 2 );
082305 ¤   FindPaneByID(caption_TLSCipherSuite)->SetDescriptor(string);
--3085 0014a4e7378401200b5 Page 3 of CConfirmRemoteKeyDialog.cp
2a67c5 ¤
359cf2 ¤   result = PGPGetPrimaryUserIDNameBuffer(¤inKey,
291409 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(Str255) - 1,
db6276 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (char *) &string[1],
7bf934 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fullSize);
b0fe94 ¤   if (IsntPGPError(result)) {
421625 ¤   ¤   string[0] = fullSize - 1;
4db96f ¤   ¤   FindPaneByID(caption_Name)->SetDescriptor(string);
0c1b52 ¤   ¤
91797b ¤   ¤   result = PGPGetKeyPropertyBuffer(¤  inKey,
1553a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropFingerprint,
f4dadc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(fingerprint),
adc019 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fingerprint,
98f934 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fullSize);
237568 ¤   ¤   if (IsntPGPError(result)) {
953120 ¤   ¤   ¤   if (fullSize == 20) {
2b7b89 ¤   ¤   ¤   ¤   string[0] = 50;
5f042d ¤   ¤   ¤   } else {
856732 ¤   ¤   ¤   ¤   string[0] = 40;
97dae8 ¤   ¤   ¤   ¤   fullSize = 16;
26a3a6 ¤   ¤   ¤   }
7eb873 ¤   ¤   ¤   p = string + 1;
e48835 ¤   ¤   ¤   for (SInt16 i = 0; i < fullSize; i++) {
298125 ¤   ¤   ¤   ¤   *p++ = sHexDigit[fingerprint[i] >> 4];
635b76 ¤   ¤   ¤   ¤   *p++ = sHexDigit[fingerprint[i] & 0x0F];
f36842 ¤   ¤   ¤   ¤   if (i & 0x0001) {
5558c5 ¤   ¤   ¤   ¤   ¤   *p++ = ' ';
472613 ¤   ¤   ¤   ¤   }
25b4e3 ¤   ¤   ¤   ¤   if (((fullSize == 20) && (i == 9))
a6ac0d ¤   ¤   ¤   ¤   || ((fullSize != 20) && (i == 7))) {
6d58c5 ¤   ¤   ¤   ¤   ¤   *p++ = ' ';
472613 ¤   ¤   ¤   ¤   }
0fa3a6 ¤   ¤   ¤   }
2d7d28 ¤   ¤   ¤   FindPaneByID(caption_Fingerprint)->SetDescriptor(string);
5d87c7 ¤   ¤   ¤
089c19 ¤   ¤   ¤   result = PGPGetKeyNumber(¤  inKey,
9f6a02 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropValidity,
810c0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &validity);
deb03d ¤   ¤   ¤   if (IsntPGPError(result)) {
105cec ¤   ¤   ¤   ¤   switch (validity) {
68aa0e ¤   ¤   ¤   ¤   ¤   case kPGPValidity_Marginal:
d74859 ¤   ¤   ¤   ¤   ¤   {
645224 ¤   ¤   ¤   ¤   ¤   ¤   validity = 1;
e73c99 ¤   ¤   ¤   ¤   ¤   }·
1114c3 ¤   ¤   ¤   ¤   ¤   break;
48ae30 ¤   ¤   ¤   ¤   ¤
94ae30 ¤   ¤   ¤   ¤   ¤
b30ab8 ¤   ¤   ¤   ¤   ¤   case kPGPValidity_Complete:
9c4859 ¤   ¤   ¤   ¤   ¤   {
93bd40 ¤   ¤   ¤   ¤   ¤   ¤   validity = 2;
511c89 ¤   ¤   ¤   ¤   ¤   }
1c14c3 ¤   ¤   ¤   ¤   ¤   break;
2cae30 ¤   ¤   ¤   ¤   ¤
abae30 ¤   ¤   ¤   ¤   ¤
5d5ee4 ¤   ¤   ¤   ¤   ¤   default:
4c4859 ¤   ¤   ¤   ¤   ¤   {
7f08f8 ¤   ¤   ¤   ¤   ¤   ¤   validity = 0;
9b1c89 ¤   ¤   ¤   ¤   ¤   }
e314c3 ¤   ¤   ¤   ¤   ¤   break;
db2613 ¤   ¤   ¤   ¤   }
330a27 ¤   ¤   ¤   ¤   validityBar->SetMaxValue(2);
34e1d4 ¤   ¤   ¤   ¤   validityBar->SetValue(validity);
c3a3a6 ¤   ¤   ¤   }
4c0fe4 ¤   ¤   }
fe9371 ¤   }
0567c5 ¤
e85d73 ¤   return result;
91efe6 }
4aaf5a
--4eeb 0019c1687ae401200b6 Page 1 of CConfirmRemoteKeyDialog.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
a57ff5 ¤   $Id: CConfirmRemoteKeyDialog.h,v 1.4.8.1 1998/11/12 03:07:09 heller Exp $
6bf7f7 ____________________________________________________________________________*/
2eaf5a
a98d55 #pragma once·
eaaf5a
bcfcb1 #include "CPGPModalGrafPortView.h"
298ac0 #include "CShareholderList.h"
d0ec82 #include "pgpTLS.h"
27af5a
b2af5a
11af5a
735415 class CConfirmRemoteKeyDialog :¤public CPGPModalGrafPortView {
805ed4 public:
fe47e0 ¤   enum¤   ¤   ¤   ¤   ¤   { class_ID = 'ConD' };
71af5a
5d4b1e ¤   ¤   ¤   ¤   ¤   ¤   ¤   CConfirmRemoteKeyDialog(LStream * inStream);
4b933e ¤   virtual¤¤   ¤   ¤   ¤   ~CConfirmRemoteKeyDialog();
d7af5a
71bb4c ¤   PGPError¤   ¤   ¤   ¤   SetInfo(
ed9eaa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringPtr¤  ¤   ¤   ¤   inPrompt,·
33cc69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringPtr¤  ¤   ¤   ¤   inRemoteHostName,
f64094 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef¤  ¤   ¤   ¤   inKey,
9e594b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsCipherSuiteNum¤   tlsCipher,
0ba8ab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   ¤   ¤   askConfirm);
1f82f7 };
9caf5a
--27c2 00055ed3f91401200b7 Page 1 of CFYEODialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
d27db7 ¤   $Id: CFYEODialog.cp,v 1.1.2.5.2.1 1998/11/12 03:07:10 heller Exp $
3df7f7 ____________________________________________________________________________*/
92af5a
43b1cb #include <ctype.h>
00af5a
4b7c99 #include <URegistrar.h>
6fd797 #include <LPushButton.h>
26e48b #include <LCheckbox.h>
33dd56 #include <PP_Messages.h>
c4fe40 #include <UCursor.h>
f57e6d #include <UDrawingState.h>
caf8a6 #include <UTextTraits.h>
52af5a
6bb6e8 #include "PGPclientLib.h"
c1bf61 #include "PGPclientLibDialogs.h"
5e076e #include "PGPclientLibUtils.h"
440d08 #include "pgpMem.h"
91af5a
5a0bb4 #include "CString.h"
940b32 #include "CFYEODialog.h"
f4af5a
77034f namespace {
5941a3 ¤   const ResIDT¤   DLOG_FYEO¤  ¤   ¤   ¤   =¤  4774;
198b6a ¤   const ResIDT¤   txtr_Courier10¤ ¤   ¤   =¤  4754;
d167c5 ¤
fa6674 ¤   const ResIDT¤   PICT_TempestFontBase¤   =¤  4000;
6967c5 ¤
c3b04c ¤   enum {
0254f3 ¤   ¤   STRx_FYEO¤  =¤  4774,
a9b385 ¤   ¤   kWarningID¤ =¤  1
d962bd ¤   };
bf67c5 ¤
fc9970 ¤   const PaneIDT¤  view_Tempest¤   ¤   ¤   ¤   =¤  1000;
ff32e7 ¤   const PaneIDT¤  button_OK¤  ¤   ¤   ¤   ¤   =¤  'bOK ';
927980 ¤   const PaneIDT¤  checkbox_UseTempestFont¤¤   =¤  1002;
ea67c5 ¤
ef37a0 ¤   const MessageT¤ msg_UseTempestFont¤ ¤   ¤   =¤  checkbox_UseTempestFont;
6267c5 ¤
25e43c ¤   const UInt8¤¤   kTabSize¤   =¤  4;
189f4f ¤   const UInt8¤¤   kIndent¤¤   =¤  2;
b967c5 ¤
45c243 ¤   const UInt16¤   kTempestFontHeight¤ =¤  14;
a13973 ¤   const UInt16¤   kTempestFontWidth¤  =¤  8;
c16b1b ¤   const UInt16¤   kTempestMod¤¤   ¤   =¤  16;
c46a14 ¤   const SInt16¤   kTempestPictHeight¤ =¤  168;
03dcd4 ¤   const SInt16¤   kTempestPictWidth¤  =¤  128;
efefe6 }
0faf5a
19af5a
3ac744 ¤   PGPError
f5aeda PGPForYourEyesOnlyDialog(
d03c55 ¤   PGPContextRef¤  inContext,
9c6098 ¤   const char *¤   inString)
f3bb36 {
84e4de ¤   PGPError¤   ¤   ¤   result;
a09a69 ¤   PGPclientLibState¤  state;
cf67c5 ¤
6c2e88 ¤   PGPValidatePtr(inString);
1b67c5 ¤
9b5168 ¤   try {
c7580e ¤   ¤   result = EnterPGPclientLib(inContext, &state);
027568 ¤   ¤   if (IsntPGPError(result)) {
703a94 ¤   ¤   ¤   MessageT¤   message;
ef87c7 ¤   ¤   ¤
6002db ¤   ¤   ¤   UCursor::SetArrow();
55b8be ¤   ¤   ¤   message = PGPUIWarningAlert(¤   kWACautionAlertType,
--35fc 00052d53aff401200b7 Page 2 of CFYEODialog.cp
718afe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKCancelStyle,
78c7f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_FYEO,
a938eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWarningID);
0cace1 ¤   ¤   ¤   if (message == msg_OK) {
a93f18 ¤   ¤   ¤   ¤   DialogRef¤  theDialog;
62af5a
17e50c ¤   ¤   ¤   ¤   RegisterClass_(CFYEODialog);
f4b6e0 ¤   ¤   ¤   ¤   RegisterClass_(CTempestView);
892b85 ¤   ¤   ¤   ¤
3e0769 ¤   ¤   ¤   ¤   theDialog = CFYEODialog::CreateDialog(DLOG_FYEO);
cd9c7f ¤   ¤   ¤   ¤   if (IsntNull(theDialog)) {
ad2799 ¤   ¤   ¤   ¤   ¤   CFYEODialog *¤  dialog = reinterpret_cast<CFYEODialog *>(
f5b33e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::GetWRefCon(theDialog));
7eae30 ¤   ¤   ¤   ¤   ¤
6f1d4f ¤   ¤   ¤   ¤   ¤   pgpAssertAddrValid(dialog, VoidAlign);
c6ae30 ¤   ¤   ¤   ¤   ¤
881c59 ¤   ¤   ¤   ¤   ¤   result = dialog->SetInfo(inContext, inString);
71200b ¤   ¤   ¤   ¤   ¤   if (IsntPGPError(result)) {
24885d ¤   ¤   ¤   ¤   ¤   ¤   result = dialog->DoDialog();
761c89 ¤   ¤   ¤   ¤   ¤   }
a6ae30 ¤   ¤   ¤   ¤   ¤
449bdf ¤   ¤   ¤   ¤   ¤   delete dialog;
f8dab6 ¤   ¤   ¤   ¤   ¤   ::DisposeDialog(theDialog);
37b5fc ¤   ¤   ¤   ¤   } else {
595877 ¤   ¤   ¤   ¤   ¤   result = kPGPError_OutOfMemory;
172613 ¤   ¤   ¤   ¤   }
56a3a6 ¤   ¤   ¤   }
380fe4 ¤   ¤   }
ffc218 ¤   ¤   ExitPGPclientLib(&state);
889371 ¤   }
e367c5 ¤
96e0a3 ¤   catch (...) {
05414a ¤   ¤   result = kPGPError_UnknownError;
4a9371 ¤   }
cb67c5 ¤
315d73 ¤   return result;
ffefe6 }
c967c5 ¤
ae67c5 ¤
3567c5 ¤
128f83 CFYEODialog::CFYEODialog(
66cbb0 ¤   LStream *¤  inStream)
89feda ¤   ¤   : CPGPModalGrafPortView(inStream), mTempestView(nil)
48bb36 {
70ac88 ¤   mWindowIsMoveable = true;
0eefe6 }
42af5a
10af5a
85af5a
fb105c CFYEODialog::~CFYEODialog()
dcbb36 {
a1efe6 }
bdaf5a
c1af5a
dbaf5a
28c744 ¤   PGPError
a8fef1 CFYEODialog::SetInfo(
a63c55 ¤   PGPContextRef¤  inContext,
346098 ¤   const char *¤   inString)
eebb36 {
a883e5 ¤   PGPError¤   ¤   result = kPGPError_NoErr;
50af5a
b3d8ff ¤   mContext = inContext;
2bf278 ¤   mTempestView->SetString(inString);
901b52 ¤   ¤
d65d73 ¤   return result;
69efe6 }
c8af5a
24af5a
24af5a
5d6d52 ¤   void
5217ba CFYEODialog::FinishCreateSelf()
--1718 000e7de0e12401200b7 Page 3 of CFYEODialog.cp
2cbb36 {
b35c9f ¤   CPGPModalGrafPortView::FinishCreateSelf();
02a287 ¤   dynamic_cast<LPushButton &>(*FindPaneByID(button_OK)).AddListener(this);
088df6 ¤   dynamic_cast<LCheckBox &>(*FindPaneByID(checkbox_UseTempestFont)).AddListen¶
3bbaf4 er(this);
e808ec ¤   mTempestView = &dynamic_cast<CTempestView &>(*FindPaneByID(view_Tempest));
39efe6 }
baaf5a
9aaf5a
44af5a
146d52 ¤   void
57fe26 CFYEODialog::ListenToMessage(
707b08 ¤   MessageT¤   inMessage,
fd121e ¤   void *¤ ¤   ioParam)
abbb36 {
c7e0ab ¤   switch (inMessage) {
aee7cb ¤   ¤   case msg_UseTempestFont:
9e5b34 ¤   ¤   {
5f63fd ¤   ¤   ¤   if (*reinterpret_cast<SInt32 *>(ioParam) != 0) {
534d72 ¤   ¤   ¤   ¤   mTempestView->UseTempest(true);
67042d ¤   ¤   ¤   } else {
c044fd ¤   ¤   ¤   ¤   mTempestView->UseTempest(false);
ffa3a6 ¤   ¤   ¤   }
6a9683 ¤   ¤   ¤   Refresh();
dc0fe4 ¤   ¤   }
022f68 ¤   ¤   break;
b187c7 ¤   ¤   ¤
e787c7 ¤   ¤   ¤
eb9ae3 ¤   ¤   default:
de5b34 ¤   ¤   {
c1c762 ¤   ¤   ¤   CPGPModalGrafPortView::ListenToMessage(inMessage, ioParam);
b70fe4 ¤   ¤   }
022f68 ¤   ¤   break;
d79371 ¤   }
c1efe6 }
4daf5a
7faf5a
06af5a
daaf5a
be50b2 CTempestView::CTempestView(
c4796d ¤   LStream * inStream)
8b757c ¤   ¤   : LView(inStream), mUseTempest(true), mResizeImage(true), mTempestFont(¶
ef5b13 nil)
c8bb36 {
2a73bb ¤   Rect¤   ¤   bounds = {0, 0, 168, 128};
63b890 ¤   SInt16¤ ¤   font = PICT_TempestFontBase + ((::TickCount() % 4) * 2) + 1;
6d9276 ¤   PicHandle¤  fontPict = ::GetPicture(font);
da67c5 ¤
cb8e7b ¤   PGPThrowIfNil_(fontPict);
fdf9b7 ¤   mTempestFont = new LGWorld(bounds, 0, useTempMem);
a74608 ¤   PGPThrowIfNil_(mTempestFont);
0ec81e ¤   mTempestFont->BeginDrawing();
9c0357 ¤   ::DrawPicture(fontPict, &bounds);
a28d48 ¤   mTempestFont->EndDrawing();
8749e9 ¤   ::ReleaseResource(reinterpret_cast<Handle>(fontPict));
33efe6 }
d4af5a
7baf5a
b0af5a
a36859 CTempestView::~CTempestView()
fcbb36 {
fc652d ¤   delete mTempestFont;
1cefe6 }
50af5a
83af5a
b9af5a
886d52 ¤   void
d82ea2 CTempestView::DrawSelf()
d7bb36 {
7ff9b9 ¤   StColorPenState¤¤   state;
6cc48f ¤   Rect¤   ¤   ¤   ¤   frame;
e73b41 ¤   UInt16¤ ¤   ¤   ¤   frameWidth;
--10bf 0005471e4e2401200b7 Page 4 of CFYEODialog.cp
e1c95e ¤   UInt16¤ ¤   ¤   ¤   charWidth;
7d56ef ¤   UInt16¤ ¤   ¤   ¤   lineHeight;
826aaa ¤   UInt16¤ ¤   ¤   ¤   imageHeight = 0;
bc1b52 ¤   ¤
713c6d ¤   state.Normalize();
d740bf ¤   CalcLocalFrameRect(frame);
e865dc ¤   frameWidth = (frame.right - kIndent) - (frame.left + kIndent);
1db256 ¤   ::MoveTo(kIndent, kIndent);
a567c5 ¤
89ebad ¤   // Get font info
d3c0ad ¤   if (mUseTempest) {
a10137 ¤   ¤   StColorState¤   colorState;
7d3293 ¤   ¤   RGBColor¤   ¤   color;
b91b52 ¤   ¤
ce276d ¤   ¤   mTempestFont->BeginDrawing();
020bd6 ¤   ¤   GetCPixel(0, 0, &color);
0d06b4 ¤   ¤   mTempestFont->EndDrawing();
650521 ¤   ¤   lineHeight = kTempestFontHeight;
93428c ¤   ¤   charWidth = kTempestFontWidth;
86f7fe ¤   ¤   ::RGBForeColor(&color);
f0ce86 ¤   ¤   ::PaintRect(&frame);
b0f037 ¤   } else {
a73d3e ¤   ¤   FontInfo¤   fontInfo;
011b52 ¤   ¤
2b07a3 ¤   ¤   UTextTraits::SetPortTextTraits(txtr_Courier10);
49d6b9 ¤   ¤   ::GetFontInfo(&fontInfo);
e61f9b ¤   ¤   lineHeight = fontInfo.ascent + fontInfo.descent + fontInfo.leading;
c78197 ¤   ¤   charWidth = ::CharWidth('m');
89b6ff ¤   ¤   ::EraseRect(&frame);
40ce0f ¤   ¤   ::Move(0, fontInfo.ascent);
009371 ¤   }
a167c5 ¤
791bcd ¤   // Adjust base image and draw chars
2b161c ¤   const char *¤   ¤   currChar = mString;
88070b ¤   UInt16¤ ¤   ¤   ¤   numCharsToDraw = 0;
8ff3d1 ¤   UInt16¤ ¤   ¤   ¤   numCharsDrawn = 0;
0cb44f ¤   SPoint32¤   ¤   ¤   scrollUnit;
6567c5 ¤
be0742 ¤   GetScrollUnit(scrollUnit);
e2e58f ¤   scrollUnit.v = lineHeight;
9ddcc2 ¤   // Hack to prevent PP from screwing up our font
b4c7a1 ¤   {
f959f1 ¤   ¤   StTextState¤textState;
dcaf5a
b9c6d9 ¤   ¤   SetScrollUnit(scrollUnit);
ff9371 ¤   }
7cf660 ¤   imageHeight += lineHeight;
cd5c12 ¤   while (*currChar != 0) {
5360f6 ¤   ¤   numCharsToDraw = GetNumCharsToDraw(currChar, numCharsDrawn, frameWidth,¶
c00bdb ·charWidth);
87d8b5 ¤   ¤   if (numCharsToDraw > 0) {
132707 ¤   ¤   ¤   for (UInt16 i = 0; i < numCharsToDraw; i++) {
2109c7 ¤   ¤   ¤   ¤   if (mResizeImage) {
6e7608 ¤   ¤   ¤   ¤   ¤   ::Move(charWidth, 0);
1d5339 ¤   ¤   ¤   ¤   } else if (mUseTempest) {
1b3d4c ¤   ¤   ¤   ¤   ¤   Rect ¤  glyph;
dc36e4 ¤   ¤   ¤   ¤   ¤   Rect ¤  location;
fb1d36 ¤   ¤   ¤   ¤   ¤   Point¤  penLoc;
a1ae30 ¤   ¤   ¤   ¤   ¤
67e41c ¤   ¤   ¤   ¤   ¤   ::GetPen(&penLoc);
4e131b ¤   ¤   ¤   ¤   ¤   ::SetRect(&location, penLoc.h, penLoc.v, penLoc.h + charWid¶
8dceef th,
9dbdc2 ¤   ¤   ¤   ¤   ¤   ¤   penLoc.v + lineHeight);
5e5ad5 ¤   ¤   ¤   ¤   ¤   if ((*currChar < ' ') || (*currChar > 126)) {
e74eb3 ¤   ¤   ¤   ¤   ¤   ¤   glyph.top = 6 * lineHeight;
99892d ¤   ¤   ¤   ¤   ¤   ¤   glyph.left = 4 * charWidth;
e181a1 ¤   ¤   ¤   ¤   ¤   } else {
ac016e ¤   ¤   ¤   ¤   ¤   ¤   glyph.top = ((*currChar - ' ') / kTempestMod) * lineHei¶
eef3ba ght;
604a9c ¤   ¤   ¤   ¤   ¤   ¤   glyph.left = ((*currChar - ' ') % kTempestMod) * charWi¶
9c9ad5 dth;
541c89 ¤   ¤   ¤   ¤   ¤   }
--7b8a 00052496e29401200b7 Page 5 of CFYEODialog.cp
5ed6b3 ¤   ¤   ¤   ¤   ¤   glyph.bottom = glyph.top + lineHeight;
aae29e ¤   ¤   ¤   ¤   ¤   glyph.right = glyph.left + charWidth;
b00728 ¤   ¤   ¤   ¤   ¤   state.Normalize();
9bf23b ¤   ¤   ¤   ¤   ¤   ::LockPixels(::GetGWorldPixMap(mTempestFont->GetMacGWorld()¶
eb1445 ));
d2e47d ¤   ¤   ¤   ¤   ¤   ::CopyBits(¤&((GrafPtr)mTempestFont->GetMacGWorld())->portB¶
7b920b its,
e0461e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &GetMacPort()->portBits,
c00c5d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &glyph, &location, srcCopy, nil);
cc7245 ¤   ¤   ¤   ¤   ¤   ::UnlockPixels(::GetGWorldPixMap(mTempestFont->GetMacGWorld¶
d38188 ()));
337608 ¤   ¤   ¤   ¤   ¤   ::Move(charWidth, 0);
dbb5fc ¤   ¤   ¤   ¤   } else {
947b76 ¤   ¤   ¤   ¤   ¤   ::DrawChar(*currChar);
be2613 ¤   ¤   ¤   ¤   }
f820a6 ¤   ¤   ¤   ¤   currChar++;
ffa3a6 ¤   ¤   ¤   }
dd5257 ¤   ¤   ¤   numCharsDrawn += numCharsToDraw;
1545a6 ¤   ¤   } else {
5e2cd2 ¤   ¤   ¤   if ((! isspace(*currChar)) || (*currChar == '\r')) {
ecc118 ¤   ¤   ¤   ¤   Point¤  location;
682b85 ¤   ¤   ¤   ¤
c78165 ¤   ¤   ¤   ¤   ::GetPen(&location);
aba9fa ¤   ¤   ¤   ¤   ::Move(-location.h + kIndent, lineHeight);
fb35a0 ¤   ¤   ¤   ¤   imageHeight += lineHeight;
879538 ¤   ¤   ¤   ¤   numCharsDrawn = 0;
d6042d ¤   ¤   ¤   } else {
1cf149 ¤   ¤   ¤   ¤   switch (*currChar) {
7f893a ¤   ¤   ¤   ¤   ¤   case '\t':
e34859 ¤   ¤   ¤   ¤   ¤   {
a3e2c4 ¤   ¤   ¤   ¤   ¤   ¤   UInt8¤  theTab = 4 - (numCharsDrawn % 4);
b394aa ¤   ¤   ¤   ¤   ¤   ¤
d0b249 ¤   ¤   ¤   ¤   ¤   ¤   numCharsDrawn += theTab;
136b03 ¤   ¤   ¤   ¤   ¤   ¤   ::Move(theTab * charWidth, 0);
5b1c89 ¤   ¤   ¤   ¤   ¤   }
1014c3 ¤   ¤   ¤   ¤   ¤   break;
01ae30 ¤   ¤   ¤   ¤   ¤
e3ae30 ¤   ¤   ¤   ¤   ¤
99efcb ¤   ¤   ¤   ¤   ¤   case ' ':
d94859 ¤   ¤   ¤   ¤   ¤   {
a34fcd ¤   ¤   ¤   ¤   ¤   ¤   ::Move(charWidth, 0);
1e247b ¤   ¤   ¤   ¤   ¤   ¤   numCharsDrawn++;
f01c89 ¤   ¤   ¤   ¤   ¤   }
8014c3 ¤   ¤   ¤   ¤   ¤   break;
76ae30 ¤   ¤   ¤   ¤   ¤
71ae30 ¤   ¤   ¤   ¤   ¤
015ee4 ¤   ¤   ¤   ¤   ¤   default:
354859 ¤   ¤   ¤   ¤   ¤   {
591c89 ¤   ¤   ¤   ¤   ¤   }
8014c3 ¤   ¤   ¤   ¤   ¤   break;
922613 ¤   ¤   ¤   ¤   }
b5a3a6 ¤   ¤   ¤   }
08b5bb ¤   ¤   ¤   if (isspace(*currChar)) {
e820a6 ¤   ¤   ¤   ¤   currChar++;
c5a3a6 ¤   ¤   ¤   }
b80fe4 ¤   ¤   }
c99371 ¤   }
5a67c5 ¤
85d900 ¤   if (mResizeImage) {
ca98fb ¤   ¤   SDimension32¤   imageSize;
001b52 ¤   ¤
a08a3c ¤   ¤   GetImageSize(imageSize);
55ca5b ¤   ¤   ResizeImageTo(imageSize.width, imageHeight + (2 * kIndent), false);
f7e4f5 ¤   ¤   mResizeImage = false;
e7814c ¤   ¤   ScrollImageTo(0, 0, false);
39ad6a ¤   ¤   Refresh();
6c9371 ¤   }
66efe6 }
83af5a
10af5a
1faf5a
521f8e ¤   UInt16
--f441 00101e18763401200b7 Page 6 of CFYEODialog.cp
02f0da CTempestView::GetNumCharsToDraw(
dca280 ¤   const char *¤   inCurrChar,
055866 ¤   UInt16¤ ¤   ¤   inHowManyAlreadyDrawn,
a77d29 ¤   UInt16¤ ¤   ¤   inFrameWidth,
c84745 ¤   UInt16¤ ¤   ¤   inCharWidth)
73bb36 {
b2dbad ¤   UInt16¤ result = 0;
4e367f ¤   UInt16¤ currentPoint = inHowManyAlreadyDrawn * inCharWidth;
c567c5 ¤
914775 ¤   while ((*inCurrChar != 0) && (! isspace(*inCurrChar))
b80692 ¤   && ((currentPoint + inCharWidth) <= inFrameWidth)) {
f2c8b3 ¤   ¤   currentPoint += inCharWidth;
56c80c ¤   ¤   result++;
2f2445 ¤   ¤   inCurrChar++;
179371 ¤   }
e567c5 ¤
dd5ac1 ¤   if ((*inCurrChar != 0) && (! isspace(*inCurrChar)) && (inHowManyAlreadyDraw¶
870d12 n > 0)) {
4d4a29 ¤   ¤   result = 0;
439371 ¤   }
9d67c5 ¤
04dbf4 ¤   return result;¤
43efe6 }
3aaf5a
01af5a
--9d4e 00135053e4f401200b8 Page 1 of CFYEODialog.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
f8cc1a ¤   $Id: CFYEODialog.h,v 1.1.2.3.2.1 1998/11/12 03:07:11 heller Exp $
10f7f7 ____________________________________________________________________________*/
49af5a
1c8d55 #pragma once·
43af5a
a0dfca #include <UGWorld.h>
b5af5a
50fcb1 #include "CPGPModalGrafPortView.h"
6caf5a
7baf5a
3baf5a
9b7364 class CTempestView: public LView {
ff5ed4 public:
7523f7 ¤   enum¤   ¤   ¤   ¤   ¤   { class_ID = 'TmpV' };
91af5a
c2c94e ¤   ¤   ¤   ¤   ¤   ¤   ¤   CTempestView(LStream * inStream);
6fa86f ¤   virtual¤¤   ¤   ¤   ¤   ~CTempestView();
6aaf5a
447c58 ¤   void¤   ¤   ¤   ¤   ¤   SetString(const char * inString) { mString = inStri¶
91f3a5 ng; Refresh(); }
45575e ¤   void¤   ¤   ¤   ¤   ¤   UseTempest(bool inUseTempest)
118fd3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { mResizeImage = true; mUseTempest = inUseTempe¶
7491a5 st; }
92af5a
29a2d3 protected:
9225ba ¤   bool¤   ¤   ¤   ¤   ¤   mUseTempest;
4e3ab2 ¤   bool¤   ¤   ¤   ¤   ¤   mResizeImage;
048e61 ¤   const char *¤   ¤   ¤   mString;
195b40 ¤   LGWorld *¤  ¤   ¤   ¤   mTempestFont;
c667c5 ¤
147cf0 ¤   virtual void¤   ¤   ¤   DrawSelf();
a2af5a
4fcd13 ¤   UInt16¤ ¤   ¤   ¤   ¤   GetNumCharsToDraw(const char * inCurrChar,
8d47a6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt16 inHowManyAlreadyDrawn, UInt16 inFrameWid¶
1bceef th,
26b4b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt16 inCharWidth);
f682f7 };
26af5a
8aaf5a
f27578 class CFYEODialog :¤public CPGPModalGrafPortView {
835ed4 public:
38fde5 ¤   enum¤   ¤   ¤   ¤   ¤   { class_ID = 'FYEO' };
a0af5a
52e868 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CFYEODialog(LStream * inStream);
c8815f ¤   virtual¤¤   ¤   ¤   ¤   ~CFYEODialog();
6baf5a
96dcb9 ¤   virtual void¤   ¤   ¤   FinishCreateSelf();
746b9a ¤   virtual void¤   ¤   ¤   ListenToMessage(MessageT inMessage, void * ioParam);
e3af5a
e7d784 ¤   PGPError¤   ¤   ¤   ¤   SetInfo(PGPContextRef inContext, const char * inStr¶
afce79 ing);
0967c5 ¤
85a2d3 protected:
c8d2fa ¤   PGPContextRef¤  ¤   ¤   mContext;
445b82 ¤   CTempestView *¤ ¤   ¤   mTempestView;
3582f7 };
--34f4 000536ab65a401200b9 Page 1 of CKeyserverTable.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
24e077 ¤   $Id: CKeyserverTable.cp,v 1.8.8.1 1998/11/12 03:07:11 heller Exp $
b2f7f7 ____________________________________________________________________________*/
1faf5a
05255b #include <Fonts.h>
91af5a
448f92 #include <UGAColorRamp.h>
76e8ae #include <UDrawingUtils.h>
b37c52 #include <LTableMonoGeometry.h>
c22ab7 #include <LTableSingleSelector.h>
a87b38 #include <LTableArrayStorage.h>
c9af5a
07c8ff #include "CKeyserverTable.h"
51ed82 #include "pgpKeyServerPrefs.h"
f5af5a
ec85c2 #include "MacStrings.h"
fbaf5a
b1af5a
a25fd9 const Int16 ¤   kColumnWidth¤   ¤   = 349;
116b75 const Int16¤¤   kRowHeight¤ ¤   ¤   = 18;
9df99f const Int16 ¤   kServerNameWidth¤   = 218;
ed990b const Int16¤¤   kDomainNameWidth¤   = 107;
f4dc03 const Int16¤¤   kLeftBorder¤¤   ¤   = 4;
84b32c const ResIDT¤   kValidKeyIconID¤¤   = 3014;
a68db2 const ResIDT¤   kKeyAttrOffIconID¤  = 3015;
78ea2d const ResIDT¤   kAnyDomainIconID¤   = 4763;
741ba4 const ResIDT¤   kKeyServerIconID¤   = 4764;
0dac56 const Int16¤¤   kLeftIndent¤¤   ¤   = 2;
233949 const Int16¤¤   kIconWidth¤ ¤   ¤   = 16;
5848d5 const Int16¤¤   kIconHeight¤¤   ¤   = 16;
2eaf5a
137670 CKeyserverTable::CKeyserverTable(
5b6689 ¤   LStream¤*inStream)
521c03 ¤   ¤   :¤  LTableView(inStream)
84bb36 {
b13d84 ¤   mTableGeometry¤ = new LTableMonoGeometry(this,¤ kColumnWidth,
c61949 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kRowHeight);
88ef4c ¤   mTableSelector¤ = new LTableSingleSelector(this);
7dd872 ¤   mTableStorage¤  = new LTableArrayStorage(this,
b421eb ¤   ¤   sizeof(PGPKeyServerEntry));
c3efe6 }
1faf5a
0b314a void
5487c3 CKeyserverTable::FinishCreateSelf()
cdbb36 {
6badec ¤   InsertCols(1, 1, NULL, 0, TRUE);
8befe6 }
4baf5a
619f51 CKeyserverTable::~CKeyserverTable()
82bb36 {
d7efe6 }
0baf5a
796d52 ¤   void
8b8da4 CKeyserverTable::DrawSelf()
54bb36 {
3cd8a7 ¤   Rect frame;
79af5a
c3e710 ¤   RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
54c6eb ¤   RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
7e40bf ¤   CalcLocalFrameRect(frame);
15b49b ¤   EraseRect(&frame);
7ade04 ¤   LTableView::DrawSelf();
20efe6 }
ebaf5a
1c6d52 ¤   void
12c640 CKeyserverTable::DrawCell(
531bb3 ¤   const STableCell¤   &inCell,
--0198 00045a517c4401200b9 Page 2 of CKeyserverTable.cp
f1c050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
80bb36 {
df7988 ¤   StDeviceLoop¤   ¤   devLoop(inLocalRect);¤  ¤
b28d1a ¤   SInt16¤ ¤   ¤   ¤   depth;
662c58 ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof(PGPKeyServerEntry);
b39a23 ¤   PGPKeyServerEntry¤  entry;
843661 ¤   Str255¤ ¤   ¤   ¤   str;
b3f791 ¤   char¤   ¤   ¤   ¤   url[kMaxServerNameLength + 1];
dbdd82 ¤   Rect¤   ¤   ¤   ¤   iconRect;
17af5a
d32ec3 ¤   while(devLoop.NextDepth(depth))
6bc7a1 ¤   {
6f5159 ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
dd70a2 ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
2276c9 ¤   ¤   ::EraseRect(&inLocalRect);
f4c0be ¤   ¤   GetCellData(inCell, &entry, dataSize);
2b1b52 ¤   ¤
bc6647 ¤   ¤   iconRect.left ¤ = ¤ inLocalRect.left + kLeftIndent;
d1ca5a ¤   ¤   iconRect.top¤   =¤  inLocalRect.top + 2;
0ced83 ¤   ¤   iconRect.right ¤= ¤ iconRect.left + kIconWidth;
d87190 ¤   ¤   iconRect.bottom = ¤ iconRect.top + kIconHeight;
ddec52 ¤   ¤   ::PlotIconID(&iconRect, atNone, ttNone, kKeyServerIconID );
151b52 ¤   ¤
bffaed ¤   ¤   PGPGetKeyServerURL( &entry, url );
66c9c0 ¤   ¤   CToPString( url, str );
1a0ea2 ¤   ¤   ::TextSize(9);
23de3c ¤   ¤   ::TextFont(kFontIDGeneva);
3725c8 ¤   ¤   if( IsKeyServerRoot( entry.flags ) )
caff94 ¤   ¤   ¤   ::TextFace( bold );
bf0e1d ¤   ¤   else
4d41e0 ¤   ¤   ¤   ::TextFace(0);
a38b20 ¤   ¤   ::TruncString(¤ kServerNameWidth - 28, str, truncMiddle);
e8829c ¤   ¤   ::MoveTo(inLocalRect.left + 22, inLocalRect.bottom - 5);
a2d759 ¤   ¤   ::DrawString(str);
a5a301 ¤   ¤   ::TextFace(0);
5f1b52 ¤   ¤
954873 ¤   ¤   if( entry.domain[0] )
575b34 ¤   ¤   {
5efad2 ¤   ¤   ¤   ::MoveTo(¤  inLocalRect.left + kServerNameWidth + 1,
548f80 ¤   ¤   ¤   ¤   ¤   ¤   inLocalRect.bottom - 5);
2ec0d0 ¤   ¤   ¤   CToPString( entry.domain, str );
33c1b9 ¤   ¤   ¤   ::TruncString(¤ kDomainNameWidth - 4, str, truncMiddle);
22c371 ¤   ¤   ¤   ::DrawString(str);
ec0fe4 ¤   ¤   }
4d0e1d ¤   ¤   else
0e5b34 ¤   ¤   {
a40f6d ¤   ¤   ¤   iconRect.left¤  =¤  inLocalRect.left + kServerNameWidth +
d2148d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kLeftBorder;
419941 ¤   ¤   ¤   iconRect.top¤   =¤  inLocalRect.top + 2;
ce62d4 ¤   ¤   ¤   iconRect.right ¤= ¤ iconRect.left + kIconWidth;
97fec7 ¤   ¤   ¤   iconRect.bottom = ¤ iconRect.top + kIconHeight;
87ea26 ¤   ¤   ¤   ::PlotIconID(&iconRect, atNone, ttNone, kAnyDomainIconID);
6b0fe4 ¤   ¤   }
88af5a
1c1a4e ¤   ¤   iconRect.left¤  =¤  inLocalRect.left + kServerNameWidth +
6a35d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDomainNameWidth + kLeftBorder;
f8ca5a ¤   ¤   iconRect.top¤   =¤  inLocalRect.top + 2;
6bed83 ¤   ¤   iconRect.right ¤= ¤ iconRect.left + kIconWidth;
ae7190 ¤   ¤   iconRect.bottom = ¤ iconRect.top + kIconHeight;
3e549e ¤   ¤   ::PlotIconID(&iconRect, atNone, ttNone,
df8ab6 ¤   ¤   ¤   IsKeyServerListed(entry.flags) ?
b6110f ¤   ¤   ¤   kValidKeyIconID : kKeyAttrOffIconID );
319371 ¤   }
cdefe6 }
c3af5a
076d52 ¤   void
d528be CKeyserverTable::ClickCell(
9fdf40 ¤   const STableCell&¤  ¤   inCell,
40067a ¤   const SMouseDownEvent&¤ inMouseDown)
17bb36 {
215be1 ¤   (void) inMouseDown;
4567c5 ¤
--fe62 001c39d48ff401200b9 Page 3 of CKeyserverTable.cp
4d16d5 ¤   if(GetClickCount() == 2)
438adc ¤   ¤   BroadcastMessage(kKSTCellDoubleClickedMessageID,
b5347d ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void *)inCell.row);
c1efe6 }
05af5a
716d52 ¤   void
048a77 CKeyserverTable::SelectionChanged()
87bb36 {
55ef49 ¤   BroadcastMessage(kKSTSelectionChangedMessageID, NULL);
91efe6 }
c3af5a
--8137 001d60bacd0401200ba Page 1 of CKeyserverTable.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
db2df7 ¤   $Id: CKeyserverTable.h,v 1.2.8.1 1998/11/12 03:07:12 heller Exp $
94f7f7 ____________________________________________________________________________*/
ea7b7d #pragma once
1caf5a
fea787 #include <LTableView.h>
28ea2f #include <LBroadcaster.h>
a3af5a
eaed82 #include "pgpKeyServerPrefs.h"
62af5a
13c6e3 const MessageT¤ kKSTCellDoubleClickedMessageID¤ = 'ksDC';
bb04a0 const MessageT¤ kKSTSelectionChangedMessageID¤  = 'ksSC';
9aaf5a
2b67f8 class¤  CKeyserverTable¤:¤  public LTableView,
e3cf7c ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster
25bb36 {
3b5ed4 public:
12efdd ¤   enum { class_ID = 'SPht' };
6e956e ¤   ¤   ¤   ¤   ¤   ¤   CKeyserverTable(LStream *inStream);
987204 ¤   virtual¤¤   ¤   ¤   ~CKeyserverTable();
186ed9 ¤   void¤   ¤   ¤   ¤   FinishCreateSelf();
da67c5 ¤
b99d7b ¤   void¤   ¤   ¤   ¤   SelectionChanged();
a6e572 ¤   void¤   ¤   ¤   ¤   DrawSelf();
453a3a ¤   virtual void¤   ¤   DrawCell(
3d0b7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   ¤   &inCell,
5b7ee5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect¤ ¤   ¤   ¤   &inLocalRect);
e4f49f ¤   virtual void¤   ¤   ClickCell(
4a0285 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell&¤  ¤   inCell,
294c4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent&¤ inMouseDown);
dd82f7 };
d6af5a
--545a 000582c8790401200bb Page 1 of CPGPPreferencesGrafPortView.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ebd3bc ¤   $Id: CPGPPreferencesGrafPortView.cp,v 1.23.8.1 1998/11/12 03:07:13 heller E¶
dcfda4 xp $
e2f7f7 ____________________________________________________________________________*/
79af5a
97b125 #include <LBevelButton.h>
63ea2f #include <LBroadcaster.h>
9e8708 #include <LCheckBox.h>
947c09 #include <LEditText.h>
a0ec08 #include <LLittleArrows.h>
d24119 #include <LMultiPanelView.h>
7f0aae #include <LPopupButton.h>
23d797 #include <LPushButton.h>
1d40db #include <LRadioButton.h>
5a05c6 #include <LStaticText.h>
85a787 #include <LTableView.h>
8a8848 #include <LTableMultiSelector.h>
9b7c99 #include <URegistrar.h>
18dd06 #include <UDesktop.h>
36dd56 #include <PP_Messages.h>
e5af5a
624720 #include "pflPrefTypes.h"
82af5a
7f3991 #include "pgpAdminPrefs.h"
2da02f #include "pgpClientLib.h"
1a6328 #include "pgpClientLibDialogs.h"
d3f4fe #include "pgpClientLibUtils.h"
76c97b #include "pgpClientPrefs.h"
17af5a
fe4d6a #include "CGADurationEditField.h"
bbc8ff #include "CKeyserverTable.h"
f50d28 #include "CWhiteList.h"
de9b2f #include "CPGPPreferencesGrafPortView.h"
ad59c5 #include "CPGPStDialogHandler.h"
614919 #include "pgpUtilities.h"
0a1b42 #include "pgpStrings.h"
362f8d #include "pgpErrors.h"
c36773 #include "pgpMemoryMgr.h"
7291b9 #include "pgpSDKPrefs.h"
71ed82 #include "pgpKeyServerPrefs.h"
02c110 #include "pgpMacMemory.h"
e8bbf4 #include "MacFiles.h"
ab5286 #include "MacDialogs.h"
d385c2 #include "MacStrings.h"
a2af5a
ef324c #include <string.h>
5faf5a
37c7c7 const PaneIDT¤  kPGPmenuAppListID¤  ¤   ¤   = 'pmAL';
03f5bc const PaneIDT¤  kPGPmenuAddButton¤  ¤   ¤   = 'bAdd';
238502 const PaneIDT¤  kPGPmenuRemoveButton¤   ¤   = 'bRmv';
b5b576 const PaneIDT¤  kServerNameEditField¤   ¤   = 'eSrv';
b24399 const PaneIDT¤  kServerPortEditField¤   ¤   = 'ePrt';
73af5a
4ba12e const ResIDT¤   kPGPPreferencesDialogID¤¤   = 4760;
b501f9 const ResIDT¤   kGeneralPanelViewResID¤ ¤   = 4761;
1619ff const ResIDT¤   kFilesPanelViewResID¤   ¤   = 4762;
3e5697 const ResIDT¤   kEmailPanelViewResID¤   ¤   = 4763;
5b2546 const ResIDT¤   kPGPmenuPanelViewResID¤ ¤   = 4764;
12bdf5 const ResIDT¤   kAdvancedPGPmenuDialogID¤   = 4765;
be861a const ResIDT¤   kServerPanelViewResID¤  ¤   = 4766;
1032c1 const ResIDT¤   kNewServerDialogID¤ ¤   ¤   = 4767;
5ab07d const ResIDT¤   kAdvancedPanelViewResID¤¤   = 4768;
12af5a
76a259 const ResIDT¤   kPreferencesStringListResID¤= 4750;
36af5a
9c7353 enum
97bb36 {
42b09e ¤   kNoDomainOrURLErrorStrIndex¤= 1,
58ac1b ¤   kNoAlgorithmsErrorStrIndex,
--35a6 000e390d3d8401200bb Page 2 of CPGPPreferencesGrafPortView.cp
83fc23 ¤   kNoServersErrorStrIndex
b882f7 };
98af5a
607353 enum
01bb36 {
70b6f1 ¤   kIDEAMenuItemIndex¤ ¤   = 1,
2ccc33 ¤   kTripleDESMenuItemIndex,
5d1a43 ¤   kCASTMenuItemIndex
c082f7 };
efaf5a
07fad8 enum¤
81bb36 {
bd9c4b ¤   kGeneralPanelViewIndex¤ ¤   = 1,
de6071 ¤   kFilesPanelViewIndex¤   ¤   = 2,
59b594 ¤   kEmailPanelViewIndex¤   ¤   = 3,
4ab330 ¤   kPGPmenuPanelViewIndex¤ ¤   = 4,
d01cc9 ¤   kServerPanelViewIndex¤  ¤   = 5,
5b54b0 ¤   kAdvancedPanelViewIndex¤¤   = 6
b082f7 };
45af5a
c6af5a
7a358c static PGPKeySetRef¤¤   ¤   gAllKeysRef;
32d66a static PGPPrefRef¤  ¤   ¤   gClientPrefsRef;
ba14e1 static PGPPrefRef¤  ¤   ¤   gAdminPrefsRef;
56877e static PGPContextRef¤   ¤   gContext;
04b1e8 static PGPPrefDialogFlags¤  gDialogFlags;
70af5a
c2c744 ¤   PGPError
814f9e PGPPreferencesDialog(
04a1bc ¤   PGPContextRef¤  ¤   context,
123ec1 ¤   PGPKeySetRef¤   ¤   allKeys,
c85837 ¤   PGPPrefRef ¤¤   ¤   clientPrefs,
cf24e3 ¤   PGPPrefRef ¤¤   ¤   adminPrefs,
02ae96 ¤   PGPPrefDialogFlags ¤*flags)
68bb36 {
078f52 ¤   PGPError¤   ¤   ¤   err;
5f9a69 ¤   PGPclientLibState¤  state;
7867c5 ¤
c12494 ¤   if( IsntNull( flags ) )
1d2345 ¤   ¤   *flags = 0;
de1b52 ¤   ¤
d42c8d ¤   PGPValidateParam( PGPContextRefIsValid( context ) );
56af5a
13e5fd ¤   err = EnterPGPclientLib( context, &state );
d7b1f0 ¤   if( IsntPGPError( err ) )
39c7a1 ¤   {
1ff294 ¤   ¤   DialogRef¤  theDialog;
2b1b52 ¤   ¤
b0b28f ¤   ¤   gContext¤   ¤   = context;
c4fc87 ¤   ¤   gDialogFlags¤   = 0;
6d1b52 ¤   ¤
c4d072 ¤   ¤   gAllKeysRef = allKeys;
5a1b52 ¤   ¤
21bbcd ¤   ¤   if( PGPPrefRefIsValid( clientPrefs ) )
ed5b34 ¤   ¤   {
aabe6b ¤   ¤   ¤   gClientPrefsRef = clientPrefs;
680fe4 ¤   ¤   }
f70e1d ¤   ¤   else
185b34 ¤   ¤   {
f48df9 ¤   ¤   ¤   gClientPrefsRef = state.clientPrefsRef;
da0fe4 ¤   ¤   }
21af5a
05d0da ¤   ¤   if( PGPPrefRefIsValid( adminPrefs ) )
cf5b34 ¤   ¤   {
40b4f7 ¤   ¤   ¤   gAdminPrefsRef = adminPrefs;
530fe4 ¤   ¤   }
2a0e1d ¤   ¤   else
eb5b34 ¤   ¤   {
85a279 ¤   ¤   ¤   gAdminPrefsRef = state.adminPrefsRef;
7d0fe4 ¤   ¤   }
4d1b52 ¤   ¤
e37e8f ¤   ¤   RegisterClass_( CGADurationEditField );
--fa07 000a30b73a2401200bb Page 3 of CPGPPreferencesGrafPortView.cp
68cbfa ¤   ¤   RegisterClass_( CPGPPreferencesGrafPortView );
ac1b00 ¤   ¤   RegisterClass_( CWhiteList );
ac017f ¤   ¤   RegisterClass_( CKeyserverTable );
451b52 ¤   ¤
50db6a ¤   ¤   // Create standard Macintosh window and overlay PowerPlant onto it
d90a63 ¤   ¤   theDialog = CPGPPreferencesGrafPortView::CreateDialog(
3613bb ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPreferencesDialogID );
1a0e84 ¤   ¤   if( IsntNull( theDialog ) )
4d5b34 ¤   ¤   {
773b8f ¤   ¤   ¤   CPGPPreferencesGrafPortView¤*prefsGrafPortView;
c91b52 ¤   ¤
f249b7 ¤   ¤   ¤   prefsGrafPortView = (CPGPPreferencesGrafPortView *)
04dc47 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetWRefCon( theDialog );
f87906 ¤   ¤   ¤   pgpAssertAddrValid( prefsGrafPortView, VoidAlign );
c7af5a
1928e6 ¤   ¤   ¤   err = prefsGrafPortView->DoDialog();
695c48 ¤   ¤   ¤   if( IsntPGPError( err ) && IsntNull( flags ) )
48f776 ¤   ¤   ¤   {
ba3dd2 ¤   ¤   ¤   ¤   *flags = gDialogFlags;
1ca3a6 ¤   ¤   ¤   }
aa87c7 ¤   ¤   ¤
66f18f ¤   ¤   ¤   delete( prefsGrafPortView );
96abfb ¤   ¤   ¤   DisposeDialog( theDialog );
1a0fe4 ¤   ¤   }
750e1d ¤   ¤   else
755b34 ¤   ¤   {
e2b90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
f50fe4 ¤   ¤   }
019371 ¤   }
4367c5 ¤
685df5 ¤   ExitPGPclientLib( &state );
7567c5 ¤
bedeb7 ¤   return( err );
e6efe6 }
a4af5a
fde028 #pragma mark --- CPreferencePanelView ---
90af5a
236076 class CPreferencePanelView : ¤  public LView,
1129b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LCommander
03bb36 {
d15ed4 public:
45af5a
017c84 ¤   enum { class_ID = 'vPrf' };
2167c5 ¤
8a88aa ¤   ¤   ¤   ¤   ¤   CPreferencePanelView(LStream *inStream);
58d2d2 ¤   virtual¤¤   ¤   ~CPreferencePanelView();
36af5a
670fc4 ¤   virtual void¤   Show(void);
81af5a
77a2d3 protected:
3aaf5a
600469 ¤   void¤   ¤   ¤   GetPrefCheckbox(PaneIDT paneID, PGPPrefIndex prefIndex);
b82419 ¤   void¤   ¤   ¤   SetPrefCheckbox(PGPPrefIndex prefIndex, PaneIDT paneID);
5082f7 };
f9af5a
f3490a CPreferencePanelView::CPreferencePanelView(LStream *inStream)
6180d6 ¤   : LView(inStream)
08bb36 {
83efe6 }
57af5a
3b13cc CPreferencePanelView::~CPreferencePanelView()
e7bb36 {
e3efe6 }
f1af5a
c35e8c ······void
853da1 CPreferencePanelView::Show(void)
cebb36 {
9e9d20 ¤   LView::Show();
2667c5 ¤
ebde5e ¤   RestoreTarget();
b7efe6 }
a3af5a
--d2cf 000977c9d05401200bb Page 4 of CPGPPreferencesGrafPortView.cp
9054b6 ¤   void·
bf1447 CPreferencePanelView::SetPrefCheckbox(
278f76 ¤   PGPPrefIndex¤   prefIndex,
00aa47 ¤   PaneIDT¤¤   ¤   paneID)
adbb36 {
f661e0 ¤   PGPError¤   err;
403574 ¤   PGPBoolean¤ boolPref;
c728fd ¤   LCheckBox¤  *checkBoxObj;
8aaf5a
937be8 ¤   err = PGPGetPrefBoolean( gClientPrefsRef, prefIndex, &boolPref );
6d8c1a ¤   pgpAssertNoErr( err );
1667c5 ¤
c8f9af ¤   checkBoxObj = (LCheckBox *) FindPaneByID( paneID );
e9e534 ¤   pgpAssertAddrValid( checkBoxObj, VoidAlign );
b667c5 ¤
ff1540 ¤   checkBoxObj->SetValue( boolPref ? 1 : 0 );¤
f8efe6 }
8daf5a
a26d52 ¤   void
ee5c9a CPreferencePanelView::GetPrefCheckbox(
8bd4ff ¤   PaneIDT¤¤   ¤   paneID,
ddf1ce ¤   PGPPrefIndex¤   prefIndex)
e1bb36 {
f5fb19 ¤   PGPError¤   ¤   err;
2e2e4c ¤   LCheckBox¤  ¤   *checkBoxObj;
b967c5 ¤
1cf9af ¤   checkBoxObj = (LCheckBox *) FindPaneByID( paneID );
bce534 ¤   pgpAssertAddrValid( checkBoxObj, VoidAlign );
5467c5 ¤
ca2be7 ¤   err = PGPSetPrefBoolean( gClientPrefsRef, prefIndex,
c6a9df ¤   ¤   ¤   ¤   ¤   (Boolean) checkBoxObj->GetValue() );
158c1a ¤   pgpAssertNoErr( err );
80efe6 }
efaf5a
9ecbf2 #pragma mark --- CPrefPanelGeneral ---
6baf5a
033b2c class CPrefPanelGeneral :¤  public CPreferencePanelView,
df2717 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener
ebbb36 {
0b5ed4 public:
8aaf5a
2a5610 ¤   enum { class_ID = 'vPGe' };
b767c5 ¤
f2377b ¤   ¤   ¤   ¤   ¤   CPrefPanelGeneral(LStream *inStream);
b5a0ec ¤   virtual¤¤   ¤   ~CPrefPanelGeneral();
a8a3aa ¤   virtual¤void¤   FinishCreateSelf();
99f559 ¤   virtual¤void¤   ListenToMessage(MessageT inMessage, void *ioParam);
0367c5 ¤
5f0c22 ¤   void¤   ¤   ¤   SavePanel();
b8af5a
cb0fb9 private:
d435ae ¤   Int32¤  ¤   ¤   mLastArrowDecrypt,
793683 ¤   ¤   ¤   ¤   ¤   mLastArrowSign;
f3a3eb ¤   LEditText¤  ¤   *mWipePasses;
abaf5a
06e23f ¤   enum¤   {¤
52e821 ¤   ¤   ¤   ¤   kEncryptToDefault¤  ¤   = 'xEnc',
09c1ed ¤   ¤   ¤   ¤   kUseMacBinary¤  ·¤  ¤   = 'xMBi',
e74ac8 ¤   ¤   ¤   ¤   kCacheDecrypt¤  ¤   ¤   = 'xDCa',
7e69d6 ¤   ¤   ¤   ¤   kCacheSign¤ ¤   ¤   ¤   = 'xSCa',
5b714f ¤   ¤   ¤   ¤   kCacheDecryptTime¤  ¤   = 'eDDu',
76e71c ¤   ¤   ¤   ¤   kCacheDecryptArrows¤¤   = 'lArD',
e9dca8 ¤   ¤   ¤   ¤   kCacheSignTime¤ ¤   ¤   = 'eSDu',
7024ed ¤   ¤   ¤   ¤   kCacheSignArrows¤   ¤   = 'lArS',
555563 ¤   ¤   ¤   ¤   kCommentLine¤   ¤   ¤   = 'eCom',
d53604 ¤   ¤   ¤   ¤   kFastKeyGen¤¤   ¤   ¤   = 'xFas',
c8fb51 ¤   ¤   ¤   ¤   kWarnWipe¤  ¤   ¤   ¤   = 'xWip',
87a0cc ¤   ¤   ¤   ¤   kWipePassesText¤¤   ¤   = 'cPas',
bd3f3f ¤   ¤   ¤   ¤   kWipePassesArrows¤  ¤   = 'aPas'
69c0bf ¤   ¤   ¤   };
ae82f7 };
97af5a
--cb0d 000b430eb8c401200bb Page 5 of CPGPPreferencesGrafPortView.cp
cb61a5 CPrefPanelGeneral::CPrefPanelGeneral(LStream *inStream)
a94fcf ¤   : CPreferencePanelView(inStream)
50bb36 {
87efe6 }
c7af5a
8cdf44 CPrefPanelGeneral::~CPrefPanelGeneral(void)
c4bb36 {
bbefe6 }
19af5a
e56d52 ¤   void
a9a2a2 CPrefPanelGeneral::ListenToMessage(MessageT inMessage, void *ioParam)
3fbb36 {
91fea8 ¤   Int32¤  ¤   ¤   ¤   ¤   newValue;
8ab9b5 ¤   CGADurationEditField¤   *durationObj;
4d67c5 ¤
c8769e ¤   switch( inMessage )
65c7a1 ¤   {
2a8a70 ¤   ¤   case kCacheDecryptArrows:
f7cdae ¤   ¤   ¤   durationObj = (CGADurationEditField *)
b0643f ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID( kCacheDecryptTime );
dc0e9f ¤   ¤   ¤   newValue = *(Int32 *)ioParam;
3d6e97 ¤   ¤   ¤   if(newValue < mLastArrowDecrypt)
cd4cb8 ¤   ¤   ¤   ¤   durationObj->AdjustValue(kDownAdjust);
1cbb8c ¤   ¤   ¤   else
8fa5c1 ¤   ¤   ¤   ¤   durationObj->AdjustValue(kUpAdjust);
e952b8 ¤   ¤   ¤   mLastArrowDecrypt = newValue;
eecdcb ¤   ¤   ¤   break;
363d64 ¤   ¤   case kCacheSignArrows:
66cdae ¤   ¤   ¤   durationObj = (CGADurationEditField *)
71f403 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID( kCacheSignTime );
830e9f ¤   ¤   ¤   newValue = *(Int32 *)ioParam;
00173f ¤   ¤   ¤   if(newValue < mLastArrowSign)
854cb8 ¤   ¤   ¤   ¤   durationObj->AdjustValue(kDownAdjust);
87bb8c ¤   ¤   ¤   else
81a5c1 ¤   ¤   ¤   ¤   durationObj->AdjustValue(kUpAdjust);
8bc3d5 ¤   ¤   ¤   mLastArrowSign = newValue;
9ecdcb ¤   ¤   ¤   break;
ee0bbd ¤   ¤   case kWipePassesArrows:
764ae3 ¤   ¤   ¤   mWipePasses->SetValue( *(Int32 *)ioParam );
7bcdcb ¤   ¤   ¤   break;
309371 ¤   }
46efe6 }
ebaf5a
f56d52 ¤   void
79db6c CPrefPanelGeneral::FinishCreateSelf()
6abb36 {
7da095 ¤   PGPError ¤  ¤   ¤   ¤   err;
705a31 ¤   PGPUInt32¤  ¤   ¤   ¤   longPref;
d63f46 ¤   char¤   ¤   ¤   ¤   ¤   commentStr[256];
c72312 ¤   Str255¤ ¤   ¤   ¤   ¤   commentPStr;
f7e361 ¤   PGPSize¤¤   ¤   ¤   ¤   commentLen;
8bf5b4 ¤   LEditText¤  ¤   ¤   ¤   *commentField;
a9b9b5 ¤   CGADurationEditField¤   *durationObj;
740df2 ¤   LLittleArrows¤  ¤   ¤   *arrowsObj;
6d67c5 ¤
e33f18 ¤   CPreferencePanelView::FinishCreateSelf();
eb67c5 ¤
b96f24 ¤   SetPrefCheckbox( kPGPPrefEncryptToSelf, kEncryptToDefault );
953b2f ¤   SetPrefCheckbox( kPGPPrefFastKeyGen, kFastKeyGen );
a029b3 ¤   SetPrefCheckbox( kPGPPrefDecryptCacheEnable, kCacheDecrypt );
aa8a51 ¤   SetPrefCheckbox( kPGPPrefSignCacheEnable, kCacheSign );
1100d8 ¤   SetPrefCheckbox( kPGPPrefWarnOnWipe, kWarnWipe );
b367c5 ¤
1181d3 ¤   mWipePasses = (LEditText *) FindPaneByID( kWipePassesText );
de7db3 ¤   err = PGPGetPrefNumber( gClientPrefsRef, kPGPPrefFileWipePasses, &longPref);
598c1a ¤   pgpAssertNoErr( err );
164b42 ¤   mWipePasses->SetValue( longPref );
d0a1c5 ¤   arrowsObj = (LLittleArrows *) FindPaneByID( kWipePassesArrows );
a3a061 ¤   arrowsObj->SetValue( longPref );
2d0197 ¤   arrowsObj->AddListener(this);
00af5a
b427b7 ¤   err = PGPGetPrefNumber( gClientPrefsRef, kPGPPrefMacBinaryDefault,
--44ed 0002eccd2c4401200bb Page 6 of CPGPPreferencesGrafPortView.cp
b9e199 ¤   ¤   ¤   ¤   &longPref );
7b8c1a ¤   pgpAssertNoErr( err );
3467c5 ¤
03c4eb ¤   ((LCheckBox *)FindPaneByID(kUseMacBinary))->
5dbb14 ¤   ¤   ¤   SetValue((longPref == kPGPPrefMacBinaryOn));
0daf5a
56f14a ¤   commentLen = 256;
43e522 ¤   err = PGPGetPrefStringBuffer( gClientPrefsRef,
0218e6 ¤   ¤   kPGPPrefComment, commentLen, commentStr);
268c1a ¤   pgpAssertNoErr( err );
485b4a ¤   CToPString(commentStr, commentPStr);
fb7618 ¤   commentField = (LEditText *)FindPaneByID(kCommentLine);
58c7c5 ¤   commentField->SetDescriptor(commentPStr);
de67c5 ¤
a3441f #if PGP_BUSINESS_SECURITY¤  ¤   ¤   ¤   ¤   ¤
287354 ¤   err = PGPGetPrefStringBuffer( gAdminPrefsRef,
db6b26 ¤   ¤   kPGPPrefComments, commentLen, commentStr);
14dbd4 ¤   if(IsntPGPError(err) && commentStr[0] != '\0')
f5c7a1 ¤   {
d75df2 ¤   ¤   CToPString(commentStr, commentPStr);
8a88fb ¤   ¤   commentField->SetDescriptor(commentPStr);
25e815 ¤   ¤   commentField->Disable();
3b9371 ¤   }
e07454 #endif
66af5a
83ad60 ¤   err = PGPGetPrefNumber( gClientPrefsRef,
fe3215 ¤   ¤   kPGPPrefDecryptCacheSeconds, &longPref);
5d8c1a ¤   pgpAssertNoErr( err );
f08484 ¤   durationObj = (CGADurationEditField *)
d0f274 ¤   ¤   FindPaneByID(kCacheDecryptTime);
dfe714 ¤   durationObj->SetDurationType(kLengthDurationType);
625588 ¤   durationObj->SetDurationValue(longPref);
ec14cf ¤   durationObj->Refresh();
cf67c5 ¤
a6ad60 ¤   err = PGPGetPrefNumber( gClientPrefsRef,
8abc1a ¤   ¤   kPGPPrefSignCacheSeconds, &longPref);
af8c1a ¤   pgpAssertNoErr( err );
ee8484 ¤   durationObj = (CGADurationEditField *)
683ca8 ¤   ¤   FindPaneByID(kCacheSignTime);
c4e714 ¤   durationObj->SetDurationType(kLengthDurationType);
bf5588 ¤   durationObj->SetDurationValue(longPref);
a914cf ¤   durationObj->Refresh();
9067c5 ¤
413c06 ¤   arrowsObj = (LLittleArrows *) FindPaneByID(kCacheDecryptArrows);
ad5143 ¤   mLastArrowDecrypt = ·arrowsObj->GetValue();
bf0197 ¤   arrowsObj->AddListener(this);
b4f129 ¤   arrowsObj = (LLittleArrows *) FindPaneByID(kCacheSignArrows);
498e17 ¤   mLastArrowSign = ·arrowsObj->GetValue();
120197 ¤   arrowsObj->AddListener(this);
2eefe6 }
4aaf5a
796d52 ¤   void
65f889 CPrefPanelGeneral::SavePanel()
dbbb36 {
cc6601 ¤   PGPUInt32¤  longPref;
a961e0 ¤   PGPError¤   err;
7533bc ¤   Boolean¤¤   boolPref;
6008db ¤   Str255¤ ¤   commentPStr;
b5da11 ¤   char¤   ¤   commentCStr[ sizeof( commentPStr ) ];
2f2b85 ¤   ¤   ¤   ¤
809003 ¤   GetPrefCheckbox(kEncryptToDefault, kPGPPrefEncryptToSelf);
3af065 ¤   GetPrefCheckbox(kFastKeyGen, kPGPPrefFastKeyGen);
0a07ec ¤   GetPrefCheckbox(kCacheDecrypt, kPGPPrefDecryptCacheEnable);
1bc687 ¤   GetPrefCheckbox(kCacheSign, kPGPPrefSignCacheEnable);
57fd7a ¤   GetPrefCheckbox(kWarnWipe, kPGPPrefWarnOnWipe);
c5af5a
aeb78f ¤   longPref = mWipePasses->GetValue();
89bcfb ¤   err = PGPSetPrefNumber( gClientPrefsRef, kPGPPrefFileWipePasses, longPref);
468c1a ¤   pgpAssertNoErr( err );
4a67c5 ¤
55ac86 ¤   boolPref = ((LCheckBox *)FindPaneByID(kUseMacBinary))->GetValue();
2ee09e ¤   err = PGPSetPrefNumber( gClientPrefsRef, kPGPPrefMacBinaryDefault,·
--93b7 00091d38494401200bb Page 7 of CPGPPreferencesGrafPortView.cp
0dbac1 ¤   ¤   boolPref ? kPGPPrefMacBinaryOn : kPGPPrefMacBinaryOff);
c58c1a ¤   pgpAssertNoErr( err );
b667c5 ¤
33ce65 ¤   ((LEditText *)FindPaneByID(kCommentLine))->GetDescriptor(commentPStr);
670b6c ¤   PToCString( commentPStr, commentCStr );
62b741 ¤   err = PGPSetPrefString( gClientPrefsRef, kPGPPrefComment, commentCStr);
248c1a ¤   pgpAssertNoErr( err );
aa67c5 ¤
942e11 ¤   longPref = ((CGADurationEditField *)
8e17d9 ¤   ¤   FindPaneByID(kCacheDecryptTime))->GetDurationValue();
e7c331 ¤   if(longPref < 0)
fbcf3a ¤   ¤   longPref = 0;
cc36ae ¤   err = PGPSetPrefNumber( gClientPrefsRef,
d936bc ¤   ¤   kPGPPrefDecryptCacheSeconds, longPref);
d68c1a ¤   pgpAssertNoErr( err );
2f67c5 ¤
322e11 ¤   longPref = ((CGADurationEditField *)
7379e7 ¤   ¤   FindPaneByID(kCacheSignTime))->GetDurationValue();
ddc331 ¤   if(longPref < 0)
a6cf3a ¤   ¤   longPref = 0;
1b36ae ¤   err = PGPSetPrefNumber( gClientPrefsRef,
866196 ¤   ¤   kPGPPrefSignCacheSeconds, longPref);
b58c1a ¤   pgpAssertNoErr( err );
72efe6 }
89af5a
8e877b #pragma mark --- CPrefPanelFiles ---
cfaf5a
275ecb class CPrefPanelFiles :¤¤   public CPreferencePanelView,
5e2717 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener
6dbb36 {
a55ed4 public:
46af5a
bef831 ¤   enum { class_ID = 'vPFi' };
8767c5 ¤
25adfc ¤   ¤   ¤   ¤   ¤   CPrefPanelFiles(LStream *inStream);
04856c ¤   virtual¤¤   ¤   ~CPrefPanelFiles();
74a3aa ¤   virtual¤void¤   FinishCreateSelf();
bff559 ¤   virtual¤void¤   ListenToMessage(MessageT inMessage, void *ioParam);
0b67c5 ¤
b70c22 ¤   void¤   ¤   ¤   SavePanel();
f20fb9 private:
af32b2 ¤   void¤   ¤   ¤   SetCaptionFromSpec(
743766 ¤   ¤   ¤   ¤   ¤   ¤   LStaticText¤¤   *inCaptionP,
782288 ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec¤   &inSpec);
ff67c5 ¤
eda6ea ¤   LStaticText¤¤   *mPublicCaption,
0b4d54 ¤   ¤   ¤   ¤   ¤   *mPrivateCaption,
5bd8a9 ¤   ¤   ¤   ¤   ¤   *mRandomCaption;
0a5400 ¤   FSSpec¤ ¤   ¤   mPrivateSpec,
95d356 ¤   ¤   ¤   ¤   ¤   mPublicSpec,
ff1b8b ¤   ¤   ¤   ¤   ¤   mRandomSpec;
7667c5 ¤
cce23f ¤   enum¤   {¤
70335e ¤   ¤   ¤   ¤   kSetPublicButton¤   ¤   = 'bPub',
a93624 ¤   ¤   ¤   ¤   kSetPrivateButton¤  ¤   = 'bPri',
a1b27f ¤   ¤   ¤   ¤   kSetRandomButton¤   ¤   = 'bRnd',
5e033a ¤   ¤   ¤   ¤   kPublicCaption¤ ¤   ¤   = 'cPub',
96374e ¤   ¤   ¤   ¤   kPrivateCaption¤¤   ¤   = 'cPri',
32da5c ¤   ¤   ¤   ¤   kRandomCaption¤ ¤   ¤   = 'cRnd'
63c0bf ¤   ¤   ¤   };
5082f7 };
1aaf5a
dd832b CPrefPanelFiles::CPrefPanelFiles(LStream *inStream)
804fcf ¤   : CPreferencePanelView(inStream)
b9bb36 {
ddefe6 }
dfaf5a
1b3075 CPrefPanelFiles::~CPrefPanelFiles(void)
c1bb36 {
70efe6 }
14af5a
916d52 ¤   void
--4a98 0006a4996f1401200bb Page 8 of CPGPPreferencesGrafPortView.cp
aae00c CPrefPanelFiles::ListenToMessage(
8e19a3 ¤   MessageT ¤  inMessage,
827503 ¤   void ¤  ¤   *ioParam)
90bb36 {
8cfb19 ¤   PGPError¤   ¤   err;
68644f ¤   FSSpec¤ ¤   ¤   fileSpec;
0967c5 ¤
6c28bb ¤   (void) ioParam;
9367c5 ¤
b8769e ¤   switch( inMessage )
7cc7a1 ¤   {
e04fc2 ¤   ¤   case kSetPublicButton:
625b34 ¤   ¤   {
f97bdf ¤   ¤   ¤   err = PGPSelectPGPFile( gContext, kPGPFileSelector_PublicKeys,
f2c20c ¤   ¤   ¤   ¤   ¤   ¤   &fileSpec );
78698b ¤   ¤   ¤   if( IsntPGPError( err ) )
29f776 ¤   ¤   ¤   {
e7f5ba ¤   ¤   ¤   ¤   mPublicSpec¤¤   = fileSpec;
cf35a1 ¤   ¤   ¤   ¤   gDialogFlags ¤  |= kPGPPrefDialog_ChangedKeyFiles;
60af5a
2b708c ¤   ¤   ¤   ¤   SetCaptionFromSpec( mPublicCaption, mPublicSpec );
3aa3a6 ¤   ¤   ¤   }
7ccdcb ¤   ¤   ¤   break;
ba3b90 ¤   ¤   }¤
8787c7 ¤   ¤   ¤
8de72e ¤   ¤   case kSetPrivateButton:
de5b34 ¤   ¤   {
69e22a ¤   ¤   ¤   err = PGPSelectPGPFile( gContext, kPGPFileSelector_PrivateKeys,
dac20c ¤   ¤   ¤   ¤   ¤   ¤   &fileSpec );
32698b ¤   ¤   ¤   if( IsntPGPError( err ) )
90f776 ¤   ¤   ¤   {
e040e5 ¤   ¤   ¤   ¤   mPrivateSpec ¤  = fileSpec;
2135a1 ¤   ¤   ¤   ¤   gDialogFlags ¤  |= kPGPPrefDialog_ChangedKeyFiles;
f4af5a
3f76f1 ¤   ¤   ¤   ¤   SetCaptionFromSpec( mPrivateCaption, mPrivateSpec );
39a3a6 ¤   ¤   ¤   }
fd87c7 ¤   ¤   ¤
dccdcb ¤   ¤   ¤   break;
473b90 ¤   ¤   }¤
6587c7 ¤   ¤   ¤
6e7e45 ¤   ¤   case kSetRandomButton:
595b34 ¤   ¤   {
025576 ¤   ¤   ¤   err = PGPSelectPGPFile( gContext, kPGPFileSelector_RandomSeed,
d6c20c ¤   ¤   ¤   ¤   ¤   ¤   &fileSpec );
ee698b ¤   ¤   ¤   if( IsntPGPError( err ) )
20f776 ¤   ¤   ¤   {
e98352 ¤   ¤   ¤   ¤   mRandomSpec = fileSpec;
f8af5a
bd704a ¤   ¤   ¤   ¤   SetCaptionFromSpec( mRandomCaption, mRandomSpec );
17a3a6 ¤   ¤   ¤   }
c387c7 ¤   ¤   ¤
21cdcb ¤   ¤   ¤   break;
393b90 ¤   ¤   }¤
289371 ¤   }
41efe6 }
29af5a
3d6d52 ¤   void
a6d616 CPrefPanelFiles::SetCaptionFromSpec(
4308dd ¤   LStaticText¤¤   *inCaptionP,
2765e5 ¤   const FSSpec¤   &inSpec)
20bb36 {
b65b21 ¤   if (inCaptionP)
8ec7a1 ¤   {
ae0dfa ¤   ¤   Str255¤ thePathStr;
621b52 ¤   ¤
44b9b7 ¤   ¤   thePathStr[0] = 0;
30a293 ¤   ¤   FSpGetFullPath(&inSpec, (uchar *)&thePathStr);
2e1b52 ¤   ¤
67afd3 ¤   ¤   inCaptionP->SetDescriptor(thePathStr);
dc9371 ¤   }
f9efe6 }
6aaf5a
--0ab0 000ccf98d25401200bb Page 9 of CPGPPreferencesGrafPortView.cp
3b6d52 ¤   void
2a27ac CPrefPanelFiles::SavePanel()
25bb36 {
5861e0 ¤   PGPError¤   err;
7767c5 ¤
91534c ¤   err = PGPSetPGPFileFSSpec( gContext, kPGPFileSelector_PublicKeys,
178718 ¤   ¤   ¤   ¤   &mPublicSpec );
af8c1a ¤   pgpAssertNoErr( err );
44af5a
704410 ¤   err = PGPSetPGPFileFSSpec( gContext, kPGPFileSelector_PrivateKeys,
bba056 ¤   ¤   ¤   ¤   &mPrivateSpec );
258c1a ¤   pgpAssertNoErr( err );
28af5a
777de5 ¤   err = PGPSetPGPFileFSSpec( gContext, kPGPFileSelector_RandomSeed,
0db69f ¤   ¤   ¤   ¤   &mRandomSpec );
e18c1a ¤   pgpAssertNoErr( err );
c5efe6 }
20af5a
f06d52 ¤   void
253006 CPrefPanelFiles::FinishCreateSelf()
75bb36 {
eafb19 ¤   PGPError¤   ¤   err;
52ddc4 ¤   PGPFileSpecRef¤ fileRef;
98af5a
153f18 ¤   CPreferencePanelView::FinishCreateSelf();
cdaf5a
8bd842 ¤   err = PGPsdkPrefGetFileSpec(¤   gContext,
18e9c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPsdkPref_PublicKeyring,
77fe73 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fileRef);
cc538a ¤   if(IsntPGPError(err) && fileRef)
3ac7a1 ¤   {
3f293a ¤   ¤   err = PGPGetFSSpecFromFileSpec(fileRef, &mPublicSpec);
af9832 ¤   ¤   pgpAssertNoErr( err );
b06252 ¤   ¤   PGPFreeFileSpec(fileRef);
d59371 ¤   }
220e24 ¤   else
a4b50d ¤   ¤   PGPGetPGPFileDefaultFSSpec( gContext,
0f7ebb ¤   ¤   ¤   ¤   ¤   kPGPFileSelector_PublicKeys, &mPublicSpec );
7dd842 ¤   err = PGPsdkPrefGetFileSpec(¤   gContext,
6b37e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPsdkPref_PrivateKeyring,
17fe73 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fileRef);
86538a ¤   if(IsntPGPError(err) && fileRef)
24c7a1 ¤   {
d7be4c ¤   ¤   err = PGPGetFSSpecFromFileSpec(fileRef, &mPrivateSpec);
789832 ¤   ¤   pgpAssertNoErr( err );
b46252 ¤   ¤   PGPFreeFileSpec(fileRef);
ae9371 ¤   }
160e24 ¤   else
30b50d ¤   ¤   PGPGetPGPFileDefaultFSSpec( gContext,
0997b5 ¤   ¤   ¤   ¤   ¤   kPGPFileSelector_PrivateKeys, &mPrivateSpec );
c9d842 ¤   err = PGPsdkPrefGetFileSpec(¤   gContext,
7297f7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPsdkPref_RandomSeedFile,
7dfe73 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fileRef);
6b538a ¤   if(IsntPGPError(err) && fileRef)
93c7a1 ¤   {
722d0a ¤   ¤   err = PGPGetFSSpecFromFileSpec(fileRef, &mRandomSpec);
7c9832 ¤   ¤   pgpAssertNoErr( err );
5b6252 ¤   ¤   PGPFreeFileSpec(fileRef);
159371 ¤   }
640e24 ¤   else
f1b50d ¤   ¤   PGPGetPGPFileDefaultFSSpec( gContext,
395aba ¤   ¤   ¤   ¤   ¤   kPGPFileSelector_RandomSeed, &mRandomSpec );
65af5a
b5cb95 ¤   ((LBevelButton *) FindPaneByID(kSetPublicButton))->
0fed6b ¤   ¤   ¤   ¤   ¤   AddListener(this);
381a77 ¤   ((LBevelButton *) FindPaneByID(kSetPrivateButton))->
54ed6b ¤   ¤   ¤   ¤   ¤   AddListener(this);
80e406 ¤   ((LBevelButton *) FindPaneByID(kSetRandomButton))->
dbed6b ¤   ¤   ¤   ¤   ¤   AddListener(this);
ea2f0a ¤   mPublicCaption =
1fa2c7 ¤   ¤   (LStaticText *)FindPaneByID(kPublicCaption);
cc5aea ¤   pgpAssertAddrValid(mPublicCaption, VoidAlign);
--6d01 0006aece3f6401200bb Page 10 of CPGPPreferencesGrafPortView.cp
12b314 ¤   mPrivateCaption =
844904 ¤   ¤   (LStaticText *)FindPaneByID(kPrivateCaption);
f4576c ¤   pgpAssertAddrValid(mPrivateCaption, VoidAlign);
4acec4 ¤   mRandomCaption =
324309 ¤   ¤   (LStaticText *)FindPaneByID(kRandomCaption);
c6576c ¤   pgpAssertAddrValid(mPrivateCaption, VoidAlign);
0767c5 ¤
61faa9 ¤   SetCaptionFromSpec( mPublicCaption, mPublicSpec );
730028 ¤   SetCaptionFromSpec( mPrivateCaption, mPrivateSpec );
ebfa6f ¤   SetCaptionFromSpec( mRandomCaption, mRandomSpec );
1aaf5a
0fefe6 }
79af5a
22b889 #pragma mark --- CPrefPanelEmail ---
7baf5a
10b4c0 class CPrefPanelEmail :¤¤   public CPreferencePanelView
1cbb36 {
e55ed4 public:
acaf5a
6540f3 ¤   enum { class_ID = 'vPEm' };
b167c5 ¤
98afdb ¤   ¤   ¤   ¤   ¤   CPrefPanelEmail(LStream *inStream);
4084b2 ¤   virtual¤¤   ¤   ~CPrefPanelEmail();
05a3aa ¤   virtual¤void¤   FinishCreateSelf();
a067c5 ¤
b10c22 ¤   void¤   ¤   ¤   SavePanel();
210fb9 private:
ac2f4b ¤   enum
995cb4 ¤   {¤  ¤   ¤
6d15ca ¤   ¤   kPGPMIME¤   ¤   ¤   ¤   = 'xMIM',
7e1e0d ¤   ¤   kWordWrapCheckBox¤  ¤   = 'xWrp',
ff0c0b ¤   ¤   kWordWrapEditField¤ ¤   = 'eWrp',
2d63a0 ¤   ¤   kEncryptDefault¤¤   ¤   = 'xEDe',
930407 ¤   ¤   kSignDefault¤   ¤   ¤   = 'xSDe',
5641b1 ¤   ¤   kAutoDecrypt¤   ¤   ¤   = 'xADe'
d562bd ¤   };
c6af5a
e682f7 };
b8af5a
b6dd1f CPrefPanelEmail::CPrefPanelEmail(LStream *inStream)
334fcf ¤   : CPreferencePanelView(inStream)
0fbb36 {
5cefe6 }
9daf5a
8fdb73 CPrefPanelEmail::~CPrefPanelEmail(void)
92bb36 {
eeefe6 }
39af5a
c56d52 ¤   void
37ca75 CPrefPanelEmail::SavePanel()
69bb36 {
8cfb19 ¤   PGPError¤   ¤   err;
25d5b8 ¤   PGPUInt32¤  ¤   longPref;
4e67c5 ¤
e2fbc6 ¤   GetPrefCheckbox(kPGPMIME, kPGPPrefMailEncryptPGPMIME);
eb46a3 ¤   GetPrefCheckbox(kPGPMIME, kPGPPrefMailSignPGPMIME);
3ab289 ¤   GetPrefCheckbox(kWordWrapCheckBox, kPGPPrefWordWrapEnable);
10bb67 ¤   GetPrefCheckbox(kEncryptDefault, kPGPPrefMailEncryptDefault);
a185fc ¤   GetPrefCheckbox(kSignDefault, kPGPPrefMailSignDefault);
1d31b9 ¤   GetPrefCheckbox(kAutoDecrypt, kPGPPrefAutoDecrypt);
34af5a
a87ef4 ¤   longPref = ((LCheckBox *)FindPaneByID(
ea1443 ¤   ¤   kWordWrapEditField))->GetValue();
17ba8e ¤   if(longPref < 30)
c22673 ¤   ¤   longPref = 78;
ddb097 ¤   else if(longPref > 240)
6fd9dc ¤   ¤   longPref = 240;
309448 ¤   err = PGPSetPrefNumber( gClientPrefsRef, kPGPPrefWordWrapWidth, longPref);
b38c1a ¤   pgpAssertNoErr( err );
03efe6 }
08af5a
6a6d52 ¤   void
--3c09 00096be889b401200bb Page 11 of CPGPPreferencesGrafPortView.cp
2e3221 CPrefPanelEmail::FinishCreateSelf()
e4bb36 {
4cfb19 ¤   PGPError¤   ¤   err;
07d5b8 ¤   PGPUInt32¤  ¤   longPref;
5067c5 ¤
213f18 ¤   CPreferencePanelView::FinishCreateSelf();
c1af5a
32c3dc ¤   SetPrefCheckbox(kPGPPrefMailEncryptPGPMIME, kPGPMIME);
b4282f ¤   SetPrefCheckbox(kPGPPrefWordWrapEnable, kWordWrapCheckBox);
89f94f ¤   SetPrefCheckbox(kPGPPrefMailEncryptDefault, kEncryptDefault);
d14f8d ¤   SetPrefCheckbox(kPGPPrefMailSignDefault, kSignDefault);
43d5ba ¤   SetPrefCheckbox(kPGPPrefAutoDecrypt, kAutoDecrypt);
dfc3c6 ¤   err = PGPGetPrefNumber( gClientPrefsRef, kPGPPrefWordWrapWidth, &longPref);
ec8c1a ¤   pgpAssertNoErr( err );
9dccdf ¤   ((LCheckBox *)FindPaneByID(kWordWrapEditField))->SetValue(longPref);
6aefe6 }
cbaf5a
5a2c8d #pragma mark --- CPrefPanelPGPmenu ---
d2af5a
1cfb4e class CPrefPanelPGPmenu :¤  public CPreferencePanelView,
2f2717 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener
32bb36 {
2b5ed4 public:
60af5a
41bf47 ¤   enum { class_ID = 'vPMe' };
e667c5 ¤
fbb0ae ¤   ¤   ¤   ¤   ¤   CPrefPanelPGPmenu(LStream *inStream);
4cd10c ¤   virtual¤¤   ¤   ~CPrefPanelPGPmenu();
58a3aa ¤   virtual¤void¤   FinishCreateSelf();
b6f559 ¤   virtual¤void¤   ListenToMessage(MessageT inMessage, void *ioParam);
0b67c5 ¤
720c22 ¤   void¤   ¤   ¤   SavePanel();
9867c5 ¤
6a0fb9 private:
c967c5 ¤
2a410c ¤   typedef struct PGPmenuAppInfo
5ec7a1 ¤   {
8b881b ¤   ¤   PGPBoolean¤ privateScrap;
5b6199 ¤   ¤   PGPBoolean¤ useOutputDialog;
426ac5 ¤   ¤   OSType¤ ¤   creator;
5ccdb0 ¤   ¤   Str31¤  ¤   appName;
a31b52 ¤   ¤
bbbb37 ¤   } PGPmenuAppInfo;
baaf5a
b88b56 ¤   LArray¤ ¤   ¤   *mAppInfoList;
128b91 ¤   CWhiteList¤ ¤   *mAppTable;
54af5a
7c2f4b ¤   enum
a75cb4 ¤   {¤  ¤   ¤
65b120 ¤   ¤   kPGPmenuAddButton¤  ¤   = 'bAdd',
06ee99 ¤   ¤   kPGPmenuRemoveButton¤   = 'bRmv',
747353 ¤   ¤   kPGPmenuAppListID¤  ¤   = 'pmAL'
d362bd ¤   };
be82f7 };
fcaf5a
6e28f4 CPrefPanelPGPmenu::CPrefPanelPGPmenu(LStream *inStream)
3e4fcf ¤   : CPreferencePanelView(inStream)
c8bb36 {
89a477 ¤   mAppInfoList = new LArray( sizeof( PGPmenuAppInfo ) );
72efe6 }
1baf5a
b7d434 CPrefPanelPGPmenu::~CPrefPanelPGPmenu(void)
1cbb36 {
deb8fa ¤   delete mAppInfoList;
c2efe6 }
ddaf5a
1f6d52 ¤   void
b30482 CPrefPanelPGPmenu::SavePanel()
06bb36 {
2f61e0 ¤   PGPError¤   err;
5a67c5 ¤
96c4bf ¤   mAppInfoList->Lock();
--e138 000b19bdc6b401200bb Page 12 of CPGPPreferencesGrafPortView.cp
2a67c5 ¤
b40e94 ¤   err = PGPSetPrefData( gClientPrefsRef, kPGPPrefPGPmenuMacAppSignatures,
601c75 ¤   ¤   ¤   ¤   mAppInfoList->GetCount() * sizeof( PGPmenuAppInfo ),
b504e7 ¤   ¤   ¤   ¤   (void *) *mAppInfoList->GetItemsHandle() );
408c1a ¤   pgpAssertNoErr( err );
fbaf5a
9532d6 ¤   mAppInfoList->Unlock();
86efe6 }
87af5a
926d52 ¤   void
234bbb CPrefPanelPGPmenu::ListenToMessage(
9319a3 ¤   MessageT ¤  inMessage,
167503 ¤   void ¤  ¤   *ioParam)
a9bb36 {
ba769e ¤   switch( inMessage )
69c7a1 ¤   {
d82ead ¤   ¤   case kPGPmenuAddButton:
605b34 ¤   ¤   {
9411c6 ¤   ¤   ¤   SFTypeList ¤¤   ¤   sfTypes;
719e4e ¤   ¤   ¤   StandardFileReply ¤ reply;
8e4e61 ¤   ¤   ¤   FInfo ¤ ¤   ¤   ¤   fndrInfo;
df87c7 ¤   ¤   ¤
22f710 ¤   ¤   ¤   sfTypes[0] = 'APPL';
54ba04 ¤   ¤   ¤   sfTypes[1] = 'FNDR';
bfe56a ¤   ¤   ¤   sfTypes[2] = 'adrp';
6f87c7 ¤   ¤   ¤
3d3e4c ¤   ¤   ¤   StandardGetFile( NULL, 3, sfTypes, &reply );
0187c7 ¤   ¤   ¤
52c303 ¤   ¤   ¤   if( reply.sfGood &&·
3c9065 ¤   ¤   ¤   ¤   FSpGetFInfo( &reply.sfFile, &fndrInfo ) == noErr )
5bf776 ¤   ¤   ¤   {
668339 ¤   ¤   ¤   ¤   PGPmenuAppInfo¤ info;
a32b85 ¤   ¤   ¤   ¤
d69989 ¤   ¤   ¤   ¤   info.privateScrap ¤ ¤   = TRUE;
70b2da ¤   ¤   ¤   ¤   info.useOutputDialog ¤  = TRUE;
e53c78 ¤   ¤   ¤   ¤   info.creator¤   ¤   ¤   = fndrInfo.fdCreator;
76af5a
0da5e1 ¤   ¤   ¤   ¤   CopyPString( reply.sfFile.name, info.appName );
d72b85 ¤   ¤   ¤   ¤
4eae70 ¤   ¤   ¤   ¤   if( mAppInfoList->AddItem( &info ) != LArray::index_Bad )
2572c3 ¤   ¤   ¤   ¤   {
4ec0a2 ¤   ¤   ¤   ¤   ¤   mAppTable->InsertRows(1, 32767, info.appName,
3e3a3e ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( info.appName ), TRUE );
972613 ¤   ¤   ¤   ¤   }
dba3a6 ¤   ¤   ¤   }
43af5a
25cdcb ¤   ¤   ¤   break;
6b0fe4 ¤   ¤   }
4a1b52 ¤   ¤
ca647c ¤   ¤   case kPGPmenuRemoveButton:
1f5b34 ¤   ¤   {
f2d695 ¤   ¤   ¤   STableCell¤ cell;
6587c7 ¤   ¤   ¤
b1e766 ¤   ¤   ¤   cell = mAppTable->GetFirstSelectedCell();
8bd521 ¤   ¤   ¤   if( cell.row > 0 && cell.col == 1 )
8bf776 ¤   ¤   ¤   {
480ee3 ¤   ¤   ¤   ¤   mAppTable->RemoveRows( 1, cell.row, TRUE );
e39ba5 ¤   ¤   ¤   ¤   mAppInfoList->RemoveItemsAt( 1, cell.row );
5ca3a6 ¤   ¤   ¤   }
de67c5 ¤
14cdcb ¤   ¤   ¤   break;
3d0fe4 ¤   ¤   }
551b52 ¤   ¤
b6ffc6 ¤   ¤   case kWLSelectionChangedMessageID:
e25b34 ¤   ¤   {
b36052 ¤   ¤   ¤   LPushButton¤*removePMButton;
4987c7 ¤   ¤   ¤
89b568 ¤   ¤   ¤   removePMButton = (LPushButton *)
9b755d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID( kPGPmenuRemoveButton );
cab259 ¤   ¤   ¤   pgpAssertAddrValid( removePMButton, VoidAlign );
c787c7 ¤   ¤   ¤
b1262c ¤   ¤   ¤   if( mAppTable->GetFirstSelectedCell().IsNullCell() )
--6db7 000147aae54401200bb Page 13 of CPGPPreferencesGrafPortView.cp
99f776 ¤   ¤   ¤   {
c2d540 ¤   ¤   ¤   ¤   removePMButton->Disable();
66a3a6 ¤   ¤   ¤   }
fdbb8c ¤   ¤   ¤   else
18f776 ¤   ¤   ¤   {
5fc15c ¤   ¤   ¤   ¤   removePMButton->Enable();
c4a3a6 ¤   ¤   ¤   }
b3af5a
0acdcb ¤   ¤   ¤   break;
810fe4 ¤   ¤   }
c887c7 ¤   ¤   ¤
ac8bae ¤   ¤   case kWLCellDoubleClickedMessageID:
515b34 ¤   ¤   {
9f7eeb ¤   ¤   ¤   DialogRef¤  theDialog;
284575 ¤   ¤   ¤   GrafPtr¤¤   savePort;
a387c7 ¤   ¤   ¤
17496e ¤   ¤   ¤   GetPort( &savePort );
9d87c7 ¤   ¤   ¤
f377fc ¤   ¤   ¤   theDialog = CPGPModalGrafPortView::CreateDialog(
07ec2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAdvancedPGPmenuDialogID );
c2cbd1 ¤   ¤   ¤   if( IsntNull( theDialog ) )
33f776 ¤   ¤   ¤   {
22692a ¤   ¤   ¤   ¤   CPGPModalGrafPortView¤  *grafPortView;
3e0325 ¤   ¤   ¤   ¤   PGPmenuAppInfo¤ ¤   ¤   info;
c236ba ¤   ¤   ¤   ¤   LCheckBox¤  ¤   ¤   ¤   *privateScrapCheckBox;
9a6020 ¤   ¤   ¤   ¤   LCheckBox¤  ¤   ¤   ¤   *outputDialogCheckBox;
5bc5e2 ¤   ¤   ¤   ¤   LStaticText¤¤   ¤   ¤   *textObj;
2b0b8c ¤   ¤   ¤   ¤   TableIndexT¤¤   ¤   ¤   row = (TableIndexT) ioParam;
8fa153 ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   ¤   kPrivateScrapCheckbox¤  = 'xScr';
cd8978 ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   ¤   kOutputDialogCheckbox¤  = 'xOut';
2be0fc ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   ¤   kAppNameCaption¤¤   ¤   = 'cNam';
2b87c7 ¤   ¤   ¤
a8e092 ¤   ¤   ¤   ¤   grafPortView = (CPGPModalGrafPortView *)
5f5602 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetWRefCon( theDialog );
fb87e4 ¤   ¤   ¤   ¤   pgpAssertAddrValid( grafPortView, VoidAlign );
4baf5a
36cf12 ¤   ¤   ¤   ¤   mAppInfoList->FetchItemAt( row, &info );
6f2b85 ¤   ¤   ¤   ¤
28de4d ¤   ¤   ¤   ¤   textObj = (LStaticText *) grafPortView->FindPaneByID(
cf2214 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAppNameCaption );
718239 ¤   ¤   ¤   ¤   pgpAssertAddrValid( textObj, VoidAlign );
d12b85 ¤   ¤   ¤   ¤
9c99d6 ¤   ¤   ¤   ¤   textObj->SetDescriptor( info.appName );
df2b85 ¤   ¤   ¤   ¤
e5ac48 ¤   ¤   ¤   ¤   privateScrapCheckBox = (LCheckBox *)
bdedc8 ¤   ¤   ¤   ¤   ¤   ¤   grafPortView->FindPaneByID( kPrivateScrapCheckbox );
ee030c ¤   ¤   ¤   ¤   pgpAssertAddrValid( privateScrapCheckBox, VoidAlign );
b9da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
968310 ¤   ¤   ¤   ¤   privateScrapCheckBox->SetValue( info.privateScrap ? 1 : 0 );
672b85 ¤   ¤   ¤   ¤
236b2a ¤   ¤   ¤   ¤   outputDialogCheckBox = (LCheckBox *)
b53e56 ¤   ¤   ¤   ¤   ¤   ¤   grafPortView->FindPaneByID( kOutputDialogCheckbox );
83fc39 ¤   ¤   ¤   ¤   pgpAssertAddrValid( outputDialogCheckBox, VoidAlign );
8faf5a
9d163c ¤   ¤   ¤   ¤   outputDialogCheckBox->SetValue( info.useOutputDialog ? 1 : 0 );
89af5a
76ecad ¤   ¤   ¤   ¤   if( IsntPGPError( grafPortView->DoDialog() ) )
3872c3 ¤   ¤   ¤   ¤   {
2ea61d ¤   ¤   ¤   ¤   ¤   info.privateScrap =
fe0433 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ( privateScrapCheckBox->GetValue() != 0 );
e39331 ¤   ¤   ¤   ¤   ¤   info.useOutputDialog =·
bf223e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ( outputDialogCheckBox->GetValue() != 0 );
df531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
b6a50c ¤   ¤   ¤   ¤   ¤   mAppInfoList->AssignItemsAt( 1, row, &info );
7d2613 ¤   ¤   ¤   ¤   }
f72b85 ¤   ¤   ¤   ¤
8a6057 ¤   ¤   ¤   ¤   delete( grafPortView );
fe239d ¤   ¤   ¤   ¤   DisposeDialog( theDialog );
58a3a6 ¤   ¤   ¤   }
d8af5a
bfe215 ¤   ¤   ¤   SetPort( savePort );
1487c7 ¤   ¤   ¤
--c1c3 0009fa422bc401200bb Page 14 of CPGPPreferencesGrafPortView.cp
7ecdcb ¤   ¤   ¤   break;
690fe4 ¤   ¤   }
209371 ¤   }
76efe6 }
bcaf5a
486d52 ¤   void
a45cb9 CPrefPanelPGPmenu::FinishCreateSelf()
fbbb36 {
9161e0 ¤   PGPError¤   err;
507dae ¤   PGPSize¤¤   appListSize;
c343dc ¤   void¤   ¤   *appListBuffer;
adfa1e ¤   LPushButton¤*buttonObj;
ec67c5 ¤
c13f18 ¤   CPreferencePanelView::FinishCreateSelf();
74af5a
2997cf ¤   buttonObj = (LPushButton *) FindPaneByID( kPGPmenuAddButton );
87f1ca ¤   pgpAssertAddrValid( buttonObj, VoidAlign );
9767c5 ¤
7f89ca ¤   buttonObj->AddListener( this );
ce67c5 ¤
454bff ¤   buttonObj = (LPushButton *) FindPaneByID( kPGPmenuRemoveButton );
ecf1ca ¤   pgpAssertAddrValid( buttonObj, VoidAlign );
6767c5 ¤
8689ca ¤   buttonObj->AddListener( this );
2d1173 ¤   buttonObj->Disable();
0967c5 ¤
c2a7f5 ¤   mAppTable = (CWhiteList *) FindPaneByID( kPGPmenuAppListID);
e8cc22 ¤   pgpAssertAddrValid( mAppTable, VoidAlign );
5eaf5a
13404e ¤   mAppTable->InsertCols( 1, 1, NULL, 0, TRUE );
27c605 ¤   mAppTable->AddListener(this);
bbaf5a
104a97 ¤   err = PGPGetPrefData( gClientPrefsRef, kPGPPrefPGPmenuMacAppSignatures,
b8b6f3 ¤   ¤   ¤   ¤   ¤   &appListSize, &appListBuffer );
bffec1 ¤   if( IsntNull( appListBuffer ) )
93c7a1 ¤   {
5a0c34 ¤   ¤   PGPUInt32¤  ¤   numApps;
00e0b3 ¤   ¤   PGPmenuAppInfo¤ *curAppInfo;
a71b52 ¤   ¤
0d5f62 ¤   ¤   numApps = appListSize / sizeof( PGPmenuAppInfo );
592a7d ¤   ¤   pgpAssert( ( appListSize % sizeof( PGPmenuAppInfo ) ) == 0 );
75af5a
b05f2d ¤   ¤   curAppInfo = (PGPmenuAppInfo *) appListBuffer;
cd1b52 ¤   ¤
8f9a06 ¤   ¤   for( PGPUInt32 appIndex = 0; appIndex < numApps; appIndex++ )
525b34 ¤   ¤   {
9f352a ¤   ¤   ¤   mAppInfoList->AddItem( curAppInfo );
372c77 ¤   ¤   ¤   mAppTable->InsertRows( 1, 32767, curAppInfo->appName,
a48631 ¤   ¤   ¤   ¤   ¤   sizeof( curAppInfo->appName ), TRUE );
fa2b85 ¤   ¤   ¤   ¤
984b03 ¤   ¤   ¤   ++curAppInfo;
f70fe4 ¤   ¤   }
bd87c7 ¤   ¤   ¤
47fd23 ¤   ¤   PGPDisposePrefData( gClientPrefsRef, appListBuffer );
cc9371 ¤   }
b6efe6 }
2aaf5a
ad7aca #pragma mark --- CEditKeyServerGrafPort ---
d1af5a
b04c6d class CEditKeyServerGrafPort : public CPGPModalGrafPortView
4ebb36 {
545ed4 public:
10af5a
c02b71 ¤   enum { class_ID = 'EKSE' };
1467c5 ¤
13930f ¤   ¤   ¤   ¤   ¤   CEditKeyServerGrafPort(LStream *inStream);
fad525 ¤   virtual¤¤   ¤   ~CEditKeyServerGrafPort();
2467c5 ¤
97aa37 ¤   void¤   ¤   ¤   SetupDialog(PGPKeyServerEntry¤  *tableEntry );
d22e22 ¤   virtual void¤   ListenToMessage(MessageT inMessage, void *ioParam);
2d67c5 ¤
9fa2d3 protected:
--7b2f 000d08813b1401200bb Page 15 of CPGPPreferencesGrafPortView.cp
e0af5a
a76736 ¤   virtual MessageT¤   HandleMessage(MessageT theMessage);
7667c5 ¤
7e0fb9 private:
d5af5a
552f4b ¤   enum
3fc7a1 ¤   {
94fe87 ¤   ¤   kDomainEditTextPaneID¤  = 'eDom',
59e9b6 ¤   ¤   kURLEditTextPaneID¤ ¤   = 'eURL',
2deb40 ¤   ¤   kListedCheckboxPaneID¤  = 'xLis',
e84af5 ¤   ¤   kPortEditTextPaneID¤¤   = 'ePrt',
6d6841 ¤   ¤   kProtocolPopupPaneID¤   = 'pPro',
cbeb1b ¤   ¤   kDomainRadioPaneID¤ ¤   = 'rDom',
9940f3 ¤   ¤   kAnyDomainRadioPaneID¤  = 'rNon',
d96e84 ¤   ¤   kAuthKeyTextPaneID¤ ¤   = 'cAut'
6c62bd ¤   };
f3af5a
a8bd8f ¤   PGPKeyServerEntry¤  *mTableEntry;
88f578 ¤   LEditText¤  ¤   ¤   *mDomainEditText;
73f392 ¤   LEditText¤  ¤   ¤   *mURLEditText;
03c121 ¤   LEditText¤  ¤   ¤   *mPortEditText;
e3fd85 ¤   LEditText¤  ¤   ¤   *mAuthKeyEditText;
782e2b ¤   LCheckBox¤  ¤   ¤   *mListedCheckBox;
e11c67 ¤   LPopupButton¤   ¤   *mProtoPopup;
bb76c0 ¤   LRadioButton¤   ¤   *mAnyDomainRadio,
6f7a28 ¤   ¤   ¤   ¤   ¤   ¤   *mDomainRadio;
dd82f7 };
02af5a
0bf0ae CEditKeyServerGrafPort::CEditKeyServerGrafPort(LStream *inStream)
8c39fd ¤   : CPGPModalGrafPortView( inStream )
12bb36 {
89f799 ¤   mTableEntry = NULL;
37efe6 }
6faf5a
10ef82 CEditKeyServerGrafPort::~CEditKeyServerGrafPort(void)
18bb36 {
a9efe6 }
8eaf5a
ac6d52 ¤   void
335ef4 CEditKeyServerGrafPort::SetupDialog(
8ab6b0 ¤   PGPKeyServerEntry¤  *tableEntry )
50bb36 {
bb460e ¤   Str255¤ ¤   tempPStr;
ec2c8c ¤   Int32¤  ¤   newValue;
2faf5a
7738ea ¤   mTableEntry = tableEntry;
bcaf5a
25711a ¤   mDomainEditText = (LEditText *) ¤   FindPaneByID( kDomainEditTextPaneID );
4e11a9 ¤   mURLEditText ¤  = (LEditText *) ¤   FindPaneByID( kURLEditTextPaneID );
817d45 ¤   mPortEditText ¤ = (LEditText *) ¤   FindPaneByID( kPortEditTextPaneID );
9cc021 ¤   mAuthKeyEditText= (LEditText *)¤¤   FindPaneByID( kAuthKeyTextPaneID );
c70edc ¤   mListedCheckBox = (LCheckBox *) ¤   FindPaneByID( kListedCheckboxPaneID );
b97d7d ¤   mProtoPopup¤¤   = (LPopupButton *)¤ FindPaneByID( kProtocolPopupPaneID );
283a3c ¤   mAnyDomainRadio¤= (LRadioButton *)¤ FindPaneByID( kAnyDomainRadioPaneID );
c25554 ¤   mDomainRadio¤   = (LRadioButton *)¤ FindPaneByID( kDomainRadioPaneID );
2baf5a
4fdff3 ¤   pgpAssertAddrValid( mDomainEditText, VoidAlign );
87315d ¤   pgpAssertAddrValid( mURLEditText, VoidAlign );
992f96 ¤   pgpAssertAddrValid( mListedCheckBox, VoidAlign );
d267c5 ¤
876b43 ¤   CToPString( tableEntry->domain, tempPStr );
b27b5a ¤   mDomainEditText->SetDescriptor( tempPStr );
389f6d ¤   mDomainEditText->AddListener(this);
2867c5 ¤
620dff ¤   if( !tempPStr[0] )
83e99c ¤   ¤   mAnyDomainRadio->SetValue(1);
68af5a
c64848 ¤   CToPString( tableEntry->serverDNS, tempPStr );
e93c73 ¤   mURLEditText->SetDescriptor( tempPStr );
f767c5 ¤
bd8c1b ¤   mPortEditText->SetValue( tableEntry->serverPort );
d067c5 ¤
--9224 000d6b7447e401200bb Page 16 of CPGPPreferencesGrafPortView.cp
748f85 ¤   switch( tableEntry->protocol )
05c7a1 ¤   {
e34166 ¤   ¤   case kPGPKeyServerType_LDAP:
3f501d ¤   ¤   ¤   newValue = 1;
bacdcb ¤   ¤   ¤   break;
5a86da ¤   ¤   case kPGPKeyServerType_LDAPS:
5bbf79 ¤   ¤   ¤   newValue = 2;
5fcdcb ¤   ¤   ¤   break;
1b3908 ¤   ¤   case kPGPKeyServerType_HTTPS:
62487c ¤   ¤   case kPGPKeyServerType_HTTP:
20e5a5 ¤   ¤   ¤   newValue = 3;
17cdcb ¤   ¤   ¤   break;
919371 ¤   }
b33cdb ¤   mProtoPopup->SetValue( newValue );
e667c5 ¤
712400 ¤   if( tableEntry->authAlg != kPGPPublicKeyAlgorithm_Invalid )
38c7a1 ¤   {
2dad57 ¤   ¤   PGPKeyID¤   keyID;
609ad8 ¤   ¤   char¤   ¤   keyString[kPGPMaxKeyIDStringSize];
ed6119 ¤   ¤   Str255¤ ¤   keyPString;
011b52 ¤   ¤
51d601 ¤   ¤   keyString[0] = '\0';
a497a7 ¤   ¤   if( PGPKeySetRefIsValid( gAllKeysRef ) )
3c5b34 ¤   ¤   {
bf3dec ¤   ¤   ¤   PGPKeyRef¤  authKey;
3be46c ¤   ¤   ¤   PGPError¤   err;
6a87c7 ¤   ¤   ¤
ee8ce0 ¤   ¤   ¤   err = PGPGetKeyIDFromString( tableEntry->authKeyIDString, &keyID );
37698b ¤   ¤   ¤   if( IsntPGPError( err ) )
5cf776 ¤   ¤   ¤   {
116d39 ¤   ¤   ¤   ¤   err = PGPGetKeyByKeyID( gAllKeysRef, &keyID,
f50c18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tableEntry->authAlg, &authKey );
825565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
6272c3 ¤   ¤   ¤   ¤   {
3062ee ¤   ¤   ¤   ¤   ¤   PGPSize¤keyStringLen;
5eae30 ¤   ¤   ¤   ¤   ¤
1ca74b ¤   ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer( authKey,
6a0cde ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMaxKeyIDStringSize, keyString, &keyStringLe¶
692d2d n );
bb6ca0 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
dfcc17 ¤   ¤   ¤   ¤   ¤   ¤   keyString[keyStringLen] = '\0';
0a2613 ¤   ¤   ¤   ¤   }
eda3a6 ¤   ¤   ¤   }
ad0fe4 ¤   ¤   }
2b4f3c ¤   ¤   if( !keyString[0] )
f25b34 ¤   ¤   {
6b05d5 ¤   ¤   ¤   CopyCString( tableEntry->authKeyIDString, keyString );
6ebf27 ¤   ¤   ¤   keyString[10] = '\0';
370fe4 ¤   ¤   }
74c8a8 ¤   ¤   CToPString( keyString, keyPString );
c2d5fb ¤   ¤   mAuthKeyEditText->SetDescriptor( keyPString );
f19371 ¤   }
1967c5 ¤
eaac0d ¤   mListedCheckBox->SetValue( IsKeyServerListed( tableEntry->flags ) );
7befe6 }
04af5a
fc6d52 ¤   void
9c4e7a CEditKeyServerGrafPort::ListenToMessage(MessageT inMessage, void *ioParam)
3ebb36 {
43769e ¤   switch( inMessage )
e6c7a1 ¤   {
6cec3f ¤   ¤   case kDomainEditTextPaneID:
b45b34 ¤   ¤   {
534496 ¤   ¤   ¤   Str255¤ domain;
0987c7 ¤   ¤   ¤
c5bd36 ¤   ¤   ¤   mDomainEditText->GetDescriptor( domain );
f5f94b ¤   ¤   ¤   if( domain[0] != '\0' )
878458 ¤   ¤   ¤   ¤   mDomainRadio->SetValue( 1 );
91bb8c ¤   ¤   ¤   else
91e044 ¤   ¤   ¤   ¤   mAnyDomainRadio->SetValue( 1 );
63cdcb ¤   ¤   ¤   break;
d60fe4 ¤   ¤   }
--d3ab 000f398aafd401200bb Page 17 of CPGPPreferencesGrafPortView.cp
d39ae3 ¤   ¤   default:
6a8a76 ¤   ¤   ¤   CPGPModalGrafPortView::ListenToMessage( inMessage, ioParam );
8dcdcb ¤   ¤   ¤   break;
149371 ¤   }
59efe6 }
f5af5a
0f9cb9 ¤   MessageT
bc217a CEditKeyServerGrafPort::HandleMessage(MessageT theMessage)
ebbb36 {
19fc25 ¤   pgpAssert( IsntNull( mTableEntry ) );
4d67c5 ¤
830176 ¤   theMessage = CPGPModalGrafPortView::HandleMessage( theMessage );
811025 ¤   switch( theMessage )
b1c7a1 ¤   {
f9d8ba ¤   ¤   case msg_OK:
3e5b34 ¤   ¤   {
c82c08 ¤   ¤   ¤   Str255¤ ¤   domain,
ab209d ¤   ¤   ¤   ¤   ¤   ¤   url;
86cf97 ¤   ¤   ¤   PGPBoolean¤ anyDomain = FALSE;
f487c7 ¤   ¤   ¤
69bd36 ¤   ¤   ¤   mDomainEditText->GetDescriptor( domain );
aa7a89 ¤   ¤   ¤   mURLEditText->GetDescriptor( url );
6caf5a
d078d1 ¤   ¤   ¤   anyDomain = (mAnyDomainRadio->GetValue() > 0 );
cd5aa2 ¤   ¤   ¤   if( ( !anyDomain && domain[0] == 0 ) || url[0] == 0 )
e2f776 ¤   ¤   ¤   {
e44b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
562b85 ¤   ¤   ¤   ¤
bfa260 ¤   ¤   ¤   ¤   PGPUIWarningAlert( kWACautionAlertType, kWAOKStyle,
1d8849 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPreferencesStringListResID,
fe5b46 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoDomainOrURLErrorStrIndex );
77d91d ¤   ¤   ¤   ¤   theMessage = msg_Nothing;
27a3a6 ¤   ¤   ¤   }
94bb8c ¤   ¤   ¤   else
daf776 ¤   ¤   ¤   {
c04025 ¤   ¤   ¤   ¤   gDialogFlags |= kPGPPrefDialog_ChangedServerList;
e2af5a
23fc8a ¤   ¤   ¤   ¤   if( anyDomain )
0b302b ¤   ¤   ¤   ¤   ¤   mTableEntry->domain[0] = '\0';
a3fa07 ¤   ¤   ¤   ¤   else
d54b22 ¤   ¤   ¤   ¤   ¤   PToCString( domain, mTableEntry->domain );
256cf2 ¤   ¤   ¤   ¤   PToCString( url, mTableEntry->serverDNS );
ad2b85 ¤   ¤   ¤   ¤
7425b0 ¤   ¤   ¤   ¤   mTableEntry->serverPort = mPortEditText->GetValue();
542b85 ¤   ¤   ¤   ¤
9ad528 ¤   ¤   ¤   ¤   switch( mProtoPopup->GetValue() )
be72c3 ¤   ¤   ¤   ¤   {
88a3e1 ¤   ¤   ¤   ¤   ¤   case 1:
5da021 ¤   ¤   ¤   ¤   ¤   ¤   mTableEntry->protocol = kPGPKeyServerType_LDAP;
3400eb ¤   ¤   ¤   ¤   ¤   ¤   break;
844c85 ¤   ¤   ¤   ¤   ¤   case 2:
ecf384 ¤   ¤   ¤   ¤   ¤   ¤   mTableEntry->protocol = kPGPKeyServerType_LDAPS;
4c00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
be1659 ¤   ¤   ¤   ¤   ¤   case 3:
63a93b ¤   ¤   ¤   ¤   ¤   ¤   mTableEntry->protocol = kPGPKeyServerType_HTTP;
cf00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
4b2613 ¤   ¤   ¤   ¤   }
942b85 ¤   ¤   ¤   ¤
25dd40 ¤   ¤   ¤   ¤   if( mListedCheckBox->GetValue() != 0 )
d92949 ¤   ¤   ¤   ¤   ¤   mTableEntry->flags |= kKeyServerListed;
9dfa07 ¤   ¤   ¤   ¤   else
95a7f7 ¤   ¤   ¤   ¤   ¤   mTableEntry->flags &= ~kKeyServerListed;
77a3a6 ¤   ¤   ¤   }
f0cdcb ¤   ¤   ¤   break;
710fe4 ¤   ¤   }
5e9371 ¤   }
bd67c5 ¤
01cfbc ¤   return( theMessage );
f6efe6 }
2caf5a
218328 #pragma mark --- CPrefPanelServer ---
f3af5a
--c65e 00023aece15401200bb Page 18 of CPGPPreferencesGrafPortView.cp
b98df5 class CPrefPanelServer :¤   public CPreferencePanelView,
022717 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener
16bb36 {
505ed4 public:
00af5a
3d8caf ¤   enum { class_ID = 'vPSe' };
e767c5 ¤
c13c5c ¤   ¤   ¤   ¤   ¤   CPrefPanelServer(LStream *inStream);
e99ecd ¤   virtual¤¤   ¤   ~CPrefPanelServer();
e867c5 ¤
90ee8d ¤   virtual void¤   Click(SMouseDownEvent &inMouseDown);
c2a3aa ¤   virtual¤void¤   FinishCreateSelf();
09f559 ¤   virtual¤void¤   ListenToMessage(MessageT inMessage, void *ioParam);
7867c5 ¤
f00c22 ¤   void¤   ¤   ¤   SavePanel();
2467c5 ¤
a80fb9 private:
690c43 ¤   virtual void¤   ConfirmUniqueRoot( TableIndexT¤ row );
71af5a
6d1522 ¤   CKeyserverTable¤*mServerTable;
b84d83 ¤   LPushButton¤¤   *mSetRootButton;
e767c5 ¤
db0f55 ¤   PGPError¤   ¤   ServerEntryDialog(PGPKeyServerEntry *tableEntry );
fd67c5 ¤
6f2f4b ¤   enum
7bc7a1 ¤   {
d0063c ¤   ¤   kKeyServerTable¤¤   ¤   = 'tKsv',
208fac ¤   ¤   kNewKeyServerButton¤¤   = 'bNSv',
8ff819 ¤   ¤   kRemoveKeyServerButton¤ = 'bRSv',
09d273 ¤   ¤   kEditKeyServerButton¤   = 'bESv',
6ea996 ¤   ¤   kKeyServerSyncGroup¤¤   = 'gSyn',
521dd9 ¤   ¤   kUnknownEncryptCheckbox = 'xUnk',
c086f8 ¤   ¤   kAddNamesCheckbox¤  ¤   = 'xAdd',
d310f7 ¤   ¤   kSignKeysCheckbox¤  ¤   = 'xSig',
12bbb1 ¤   ¤   kRevokeKeysCheckbox¤¤   = 'xRev',
ca6ae4 ¤   ¤   kVerifyCheckbox¤¤   ¤   = 'xVer',
b6d8f7 ¤   ¤   kSetRootButton¤ ¤   ¤   = 'bSRS',
d013a2 ¤   ¤   kServerHeaderPaneID¤¤   = 'SHdr',
b1b30e ¤   ¤   kDomainHeaderPaneID¤¤   = 'DHdr',
7b87be ¤   ¤   kListedHeaderPaneID¤¤   = 'LHdr'
b962bd ¤   };
c082f7 };
09af5a
ceb843 CPrefPanelServer::CPrefPanelServer(LStream *inStream)
6f4fcf ¤   : CPreferencePanelView(inStream)
2dbb36 {
7befe6 }
74af5a
43ac8c CPrefPanelServer::~CPrefPanelServer(void)
debb36 {
d8efe6 }
e3af5a
ec6d52 ¤   void
b6bdcb CPrefPanelServer::Click(SMouseDownEvent¤&inMouseDown)
1cbb36 {
3acf4b ¤   LPane¤  *clickedPane;
a367c5 ¤
12282b ¤   clickedPane = FindSubPaneHitBy(inMouseDown.wherePort.h,
eefbc1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inMouseDown.wherePort.v);
a7b8df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
268228 ¤   if( clickedPane != FindPaneByID( kServerHeaderPaneID ) &&
f1b9b2 ¤   ¤   clickedPane != FindPaneByID( kDomainHeaderPaneID ) &&
5f18d1 ¤   ¤   clickedPane != FindPaneByID( kListedHeaderPaneID ) )
ddc7a1 ¤   {
60cfe1 ¤   ¤   CPreferencePanelView::Click( inMouseDown );
409371 ¤   }
26efe6 }
19af5a
c86d52 ¤   void
5d955e CPrefPanelServer::SavePanel()
5ebb36 {
238f52 ¤   PGPError¤   ¤   ¤   err;
--515c 000f6b91eb2401200bb Page 19 of CPGPPreferencesGrafPortView.cp
34a8d9 ¤   TableIndexT¤¤   ¤   numRows,
a8cc7b ¤   ¤   ¤   ¤   ¤   ¤   numCols;
d485a6 ¤   STableCell¤ ¤   ¤   cell;
a5d603 ¤   PGPKeyServerEntry¤  *ksEntries;
de67c5 ¤
213630 ¤   GetPrefCheckbox(¤   kUnknownEncryptCheckbox,
8f68af ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefKeyServerSyncUnknownKeys);
2cca4c ¤   GetPrefCheckbox(¤   kAddNamesCheckbox,
989010 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefKeyServerSyncOnAdd);
66428d ¤   GetPrefCheckbox(¤   kSignKeysCheckbox,
d7efdf ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefKeyServerSyncOnKeySign);
7d759c ¤   GetPrefCheckbox(¤   kRevokeKeysCheckbox,
091053 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefKeyServerSyncOnRevocation);
abcaae ¤   GetPrefCheckbox(¤   kVerifyCheckbox,
d7f03f ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefKeyServerSyncOnVerify);
7067c5 ¤
86206d ¤   mServerTable->GetTableSize( numRows, numCols );
bbabac ¤   ksEntries = (PGPKeyServerEntry *) PGPNewData(
3602a7 ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( gContext ),
86bfb2 ¤   ¤   ¤   ¤   ¤   numRows * sizeof(PGPKeyServerEntry), 0 );
2db7b5 ¤   pgpAssertAddrValid( ksEntries, PGPKeyServerEntry );
f549cf ¤   if( IsntNull( ksEntries ) )
b6c7a1 ¤   {
9cb764 ¤   ¤   PGPUInt32¤  ksIndex = 0;
ecaf5a
33f8d5 ¤   ¤   cell.col¤   ¤   = 1;
7ef38c ¤   ¤   for( cell.row = 1; cell.row <= numRows; cell.row++ )
1a5b34 ¤   ¤   {
7a12b4 ¤   ¤   ¤   PGPKeyServerEntry¤  kstEntry;
ce846f ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof( kstEntry );
8baf5a
224189 ¤   ¤   ¤   mServerTable->GetCellData( cell, &kstEntry, dataSize );
4f0806 ¤   ¤   ¤   ksEntries[ksIndex++] = kstEntry;
450fe4 ¤   ¤   }
a78cb2 ¤   ¤   err = PGPSetKeyServerPrefs( gClientPrefsRef, ksEntries, ksIndex );
019832 ¤   ¤   pgpAssertNoErr( err );
751b52 ¤   ¤
4f8e95 ¤   ¤   PGPFreeData( ksEntries );
119371 ¤   }
fcaffe ¤   mServerTable->RemoveCols(1, 1, false);
acefe6 }
2daf5a
bfc744 ¤   PGPError
bc85c8 CPrefPanelServer::ServerEntryDialog(
deb6b0 ¤   PGPKeyServerEntry¤  *tableEntry )
79bb36 {
50e6bc ¤   DialogRef¤  theDialog;
1bfb29 ¤   GrafPtr¤¤   savePort;
ed8e12 ¤   PGPError¤   err = kPGPError_NoErr;
fa67c5 ¤
86f732 ¤   GetPort( &savePort );
af67c5 ¤
70f887 ¤   theDialog = CEditKeyServerGrafPort::CreateDialog( kNewServerDialogID );
068578 ¤   if( IsntNull( theDialog ) )
bfc7a1 ¤   {
258c70 ¤   ¤   CEditKeyServerGrafPort¤ *grafPortView;
111b52 ¤   ¤
29ef8c ¤   ¤   grafPortView = (CEditKeyServerGrafPort *) GetWRefCon( theDialog );
26803d ¤   ¤   pgpAssertAddrValid( grafPortView, VoidAlign );
72af5a
d73af6 ¤   ¤   grafPortView->SetupDialog( tableEntry );
851b52 ¤   ¤
79239b ¤   ¤   err = grafPortView->DoDialog();
371b52 ¤   ¤
9c2efe ¤   ¤   delete( grafPortView );
3a6eae ¤   ¤   DisposeDialog( theDialog );
739371 ¤   }
540e24 ¤   else
b6c7a1 ¤   {
64bce1 ¤   ¤   err = kPGPError_OutOfMemory;
009371 ¤   }
f6af5a
--1a82 00029450773401200bb Page 20 of CPGPPreferencesGrafPortView.cp
7d6d1e ¤   SetPort( savePort );
a167c5 ¤
7adeb7 ¤   return( err );
bdefe6 }
9aaf5a
ea6d52 ¤   void
12733d CPrefPanelServer::ConfirmUniqueRoot(
7553a6 ¤   TableIndexT¤¤   row )
50bb36 {
1220f6 ¤   TableIndexT¤¤   numRows, numCols;
511506 ¤   STableCell¤ ¤   cell;
8467c5 ¤
2f8582 ¤   cell.col = 1;
0367c5 ¤
98206d ¤   mServerTable->GetTableSize( numRows, numCols );
3767c5 ¤
52ca84 ¤   for( cell.row = numRows; cell.row >= 1; cell.row-- )
dec7a1 ¤   {
3c2058 ¤   ¤   if( cell.row != row )
f55b34 ¤   ¤   {
1612b4 ¤   ¤   ¤   PGPKeyServerEntry¤  kstEntry;
91846f ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof( kstEntry );
ab87c7 ¤   ¤   ¤
724189 ¤   ¤   ¤   mServerTable->GetCellData( cell, &kstEntry, dataSize );
a24efd ¤   ¤   ¤   if( IsKeyServerRoot( kstEntry.flags ) )
48f776 ¤   ¤   ¤   {
ae6673 ¤   ¤   ¤   ¤   kstEntry.flags &= ~kKeyServerIsRoot;
58ef06 ¤   ¤   ¤   ¤   mServerTable->SetCellData( cell, &kstEntry, dataSize );
773a99 ¤   ¤   ¤   ¤   mServerTable->RefreshCell( cell );
fca3a6 ¤   ¤   ¤   }
350fe4 ¤   ¤   }
a59371 ¤   }
6fefe6 }
8daf5a
d66d52 ¤   void
2031c8 CPrefPanelServer::ListenToMessage(
3e7b08 ¤   MessageT¤   inMessage,
de0597 ¤   void¤   ¤   *ioParam)
5abb36 {
a4769e ¤   switch( inMessage )
a1c7a1 ¤   {
9a39ee ¤   ¤   case kNewKeyServerButton:
2a5b34 ¤   ¤   {
8912b4 ¤   ¤   ¤   PGPKeyServerEntry¤  kstEntry;
595ddd ¤   ¤   ¤   STableCell¤ ¤   ¤   cell;
2087c7 ¤   ¤   ¤
520301 ¤   ¤   ¤   pgpClearMemory( &kstEntry, sizeof( kstEntry ) );
5587c7 ¤   ¤   ¤
402bac ¤   ¤   ¤   kstEntry.flags¤ ¤   |= kKeyServerListed;
68f983 ¤   ¤   ¤   kstEntry.protocol¤  = kPGPKeyServerType_LDAP;
e4bf67 ¤   ¤   ¤   kstEntry.authAlg¤   = kPGPPublicKeyAlgorithm_Invalid;
6f87c7 ¤   ¤   ¤
e72f41 ¤   ¤   ¤   cell = mServerTable->GetFirstSelectedCell();
e987c7 ¤   ¤   ¤
bb9781 ¤   ¤   ¤   if( IsntPGPError( ServerEntryDialog( &kstEntry ) ) )
56f776 ¤   ¤   ¤   {
bf3dd6 ¤   ¤   ¤   ¤   TableIndexT¤numRows;
ec78f9 ¤   ¤   ¤   ¤   TableIndexT¤numCols;
2faf5a
663e8a ¤   ¤   ¤   ¤   mServerTable->GetTableSize( numRows, numCols );
4317b9 ¤   ¤   ¤   ¤   mServerTable->InsertRows( 1, numRows, &kstEntry,
803151 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( kstEntry ), TRUE );
eaa3a6 ¤   ¤   ¤   }
0b87c7 ¤   ¤   ¤
f8cdcb ¤   ¤   ¤   break;
cb0fe4 ¤   ¤   }
e11b52 ¤   ¤
b1815b ¤   ¤   case kSetRootButton:
475b34 ¤   ¤   {
5525dd ¤   ¤   ¤   TableIndexT¤¤   numRows, numCols;
92ab5a ¤   ¤   ¤   STableCell¤ ¤   cell;
2987c7 ¤   ¤   ¤
--82b1 000ad1e8e41401200bb Page 21 of CPGPPreferencesGrafPortView.cp
2078ad ¤   ¤   ¤   cell.col = 1;
8387c7 ¤   ¤   ¤
b0fa96 ¤   ¤   ¤   mServerTable->GetTableSize( numRows, numCols );
2387c7 ¤   ¤   ¤
a33618 ¤   ¤   ¤   for( cell.row = numRows; cell.row >= 1; cell.row-- )
52f776 ¤   ¤   ¤   {
7b00e2 ¤   ¤   ¤   ¤   if( mServerTable->CellIsSelected( cell ) )
5672c3 ¤   ¤   ¤   ¤   {
41644f ¤   ¤   ¤   ¤   ¤   PGPKeyServerEntry¤  kstEntry;
881a1f ¤   ¤   ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof( kstEntry );
6cae30 ¤   ¤   ¤   ¤   ¤
2914f7 ¤   ¤   ¤   ¤   ¤   mServerTable->GetCellData( cell, &kstEntry, dataSize );
3639e6 ¤   ¤   ¤   ¤   ¤   kstEntry.flags |= kKeyServerIsRoot;
6df40f ¤   ¤   ¤   ¤   ¤   mServerTable->SetCellData( cell, &kstEntry, dataSize );
7a2bbe ¤   ¤   ¤   ¤   ¤   mServerTable->RefreshCell( cell );
8833d1 ¤   ¤   ¤   ¤   ¤   ConfirmUniqueRoot( cell.row );
d814c3 ¤   ¤   ¤   ¤   ¤   break;
2c2613 ¤   ¤   ¤   ¤   }
99a3a6 ¤   ¤   ¤   }
c8cdcb ¤   ¤   ¤   break;
760fe4 ¤   ¤   }
1f87c7 ¤   ¤   ¤
cbd8a4 ¤   ¤   case kRemoveKeyServerButton:
a25b34 ¤   ¤   {
d925dd ¤   ¤   ¤   TableIndexT¤¤   numRows, numCols;
1aab5a ¤   ¤   ¤   STableCell¤ ¤   cell;
d387c7 ¤   ¤   ¤
7d78ad ¤   ¤   ¤   cell.col = 1;
7387c7 ¤   ¤   ¤
d3fa96 ¤   ¤   ¤   mServerTable->GetTableSize( numRows, numCols );
3805a1 ¤   ¤   ¤   if( numRows == 1 )
9bf776 ¤   ¤   ¤   {
f14b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
f72b85 ¤   ¤   ¤   ¤
3da260 ¤   ¤   ¤   ¤   PGPUIWarningAlert( kWACautionAlertType, kWAOKStyle,
ce8849 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPreferencesStringListResID,
3493b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoServersErrorStrIndex );
36a3a6 ¤   ¤   ¤   }
32e466 ¤   ¤   ¤   else for( cell.row = numRows; cell.row >= 1; cell.row-- )
e2f776 ¤   ¤   ¤   {
a800e2 ¤   ¤   ¤   ¤   if( mServerTable->CellIsSelected( cell ) )
fa8891 ¤   ¤   ¤   ¤   ¤   mServerTable->RemoveRows( 1, cell.row, TRUE );
68a3a6 ¤   ¤   ¤   }
eafc3c ¤   ¤   ¤   gDialogFlags |= kPGPPrefDialog_ChangedServerList;
19cdcb ¤   ¤   ¤   break;
370fe4 ¤   ¤   }
bc1b52 ¤   ¤
996f69 ¤   ¤   case kEditKeyServerButton:
ec5b34 ¤   ¤   {
de25dd ¤   ¤   ¤   TableIndexT¤¤   numRows, numCols;
36ab5a ¤   ¤   ¤   STableCell¤ ¤   cell;
6787c7 ¤   ¤   ¤
1978ad ¤   ¤   ¤   cell.col = 1;
1387c7 ¤   ¤   ¤
34fa96 ¤   ¤   ¤   mServerTable->GetTableSize( numRows, numCols );
8187c7 ¤   ¤   ¤
a63618 ¤   ¤   ¤   for( cell.row = numRows; cell.row >= 1; cell.row-- )
edf776 ¤   ¤   ¤   {
ec00e2 ¤   ¤   ¤   ¤   if( mServerTable->CellIsSelected( cell ) )
1472c3 ¤   ¤   ¤   ¤   {
32644f ¤   ¤   ¤   ¤   ¤   PGPKeyServerEntry¤  kstEntry;
161a1f ¤   ¤   ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof( kstEntry );
f6ae30 ¤   ¤   ¤   ¤   ¤
c314f7 ¤   ¤   ¤   ¤   ¤   mServerTable->GetCellData( cell, &kstEntry, dataSize );
681ab2 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( ServerEntryDialog( &kstEntry ) ) )
6ea15f ¤   ¤   ¤   ¤   ¤   ¤   mServerTable->SetCellData( cell, &kstEntry, dataSize );
d414c3 ¤   ¤   ¤   ¤   ¤   break;
a22613 ¤   ¤   ¤   ¤   }
29a3a6 ¤   ¤   ¤   }
14cdcb ¤   ¤   ¤   break;
3d0fe4 ¤   ¤   }
ad1b52 ¤   ¤
--6ea3 00038fe4f94401200bb Page 22 of CPGPPreferencesGrafPortView.cp
6e4363 ¤   ¤   case kKSTSelectionChangedMessageID:
9c5b34 ¤   ¤   {
055398 ¤   ¤   ¤   LPushButton¤*removeKSButton,
67142f ¤   ¤   ¤   ¤   ¤   ¤   *editKSButton;
bb87c7 ¤   ¤   ¤
595bdb ¤   ¤   ¤   removeKSButton = (LPushButton *)FindPaneByID(
3585a8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kRemoveKeyServerButton);
a26ea1 ¤   ¤   ¤   editKSButton = (LPushButton *)FindPaneByID(
de1611 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEditKeyServerButton);
945483 ¤   ¤   ¤   if( mServerTable->GetTableSelector()->GetFirstSelectedRow() > 0 )
bef776 ¤   ¤   ¤   {
4e4a5c ¤   ¤   ¤   ¤   removeKSButton->Enable();
1cb373 ¤   ¤   ¤   ¤   editKSButton->Enable();
8248b6 ¤   ¤   ¤   ¤   mSetRootButton->Enable();
8da3a6 ¤   ¤   ¤   }
4abb8c ¤   ¤   ¤   else
eef776 ¤   ¤   ¤   {
67d5cb ¤   ¤   ¤   ¤   removeKSButton->Disable();
760cc7 ¤   ¤   ¤   ¤   editKSButton->Disable();
169d9d ¤   ¤   ¤   ¤   mSetRootButton->Disable();
29a3a6 ¤   ¤   ¤   }
e3cdcb ¤   ¤   ¤   break;
390fe4 ¤   ¤   }
f31b52 ¤   ¤
1579b5 ¤   ¤   case kKSTCellDoubleClickedMessageID:
0e5b34 ¤   ¤   {
5baf26 ¤   ¤   ¤   TableIndexT¤¤   ¤   row = (TableIndexT)ioParam;
6e12b4 ¤   ¤   ¤   PGPKeyServerEntry¤  kstEntry;
6e846f ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof( kstEntry );
7a2641 ¤   ¤   ¤   STableCell¤ ¤   ¤   cell( row, 1 );
eb87c7 ¤   ¤   ¤
234189 ¤   ¤   ¤   mServerTable->GetCellData( cell, &kstEntry, dataSize );
089781 ¤   ¤   ¤   if( IsntPGPError( ServerEntryDialog( &kstEntry ) ) )
f7ef06 ¤   ¤   ¤   ¤   mServerTable->SetCellData( cell, &kstEntry, dataSize );
02cdcb ¤   ¤   ¤   break;
0e0fe4 ¤   ¤   }
309371 ¤   }
08efe6 }
2faf5a
b36d52 ¤   void
fc5ac8 CPrefPanelServer::FinishCreateSelf()
07bb36 {
3b61e0 ¤   PGPError¤   err;
8a67c5 ¤
3e3f18 ¤   CPreferencePanelView::FinishCreateSelf();
92af5a
e257aa ¤   RegisterClass_( CEditKeyServerGrafPort );
b267c5 ¤
a218cc ¤   ((LPushButton *)FindPaneByID(
3487fa ¤   ¤   kNewKeyServerButton ))->AddListener(this);
6918cc ¤   ((LPushButton *)FindPaneByID(
2b7e57 ¤   ¤   kRemoveKeyServerButton ))->AddListener(this);
dc18cc ¤   ((LPushButton *)FindPaneByID(
639d52 ¤   ¤   kEditKeyServerButton ·))->AddListener(this);
51fe51 ¤   ( mSetRootButton = (LPushButton *)FindPaneByID( kSetRootButton ) )->
3f34cf ¤   ¤   AddListener(this);
1eaf5a
39cc72 ¤   SetPrefCheckbox(¤   kPGPPrefKeyServerSyncUnknownKeys,
bfe24a ¤   ¤   ¤   ¤   ¤   ¤   kUnknownEncryptCheckbox);
8733c0 ¤   SetPrefCheckbox(¤   kPGPPrefKeyServerSyncOnAdd,
4bc996 ¤   ¤   ¤   ¤   ¤   ¤   kAddNamesCheckbox);
2716b7 ¤   SetPrefCheckbox(¤   kPGPPrefKeyServerSyncOnKeySign,
661e9b ¤   ¤   ¤   ¤   ¤   ¤   kSignKeysCheckbox);
578dc3 ¤   SetPrefCheckbox(¤   kPGPPrefKeyServerSyncOnRevocation,
7be025 ¤   ¤   ¤   ¤   ¤   ¤   kRevokeKeysCheckbox);
b54410 ¤   SetPrefCheckbox(¤   kPGPPrefKeyServerSyncOnVerify,
6f1106 ¤   ¤   ¤   ¤   ¤   ¤   kVerifyCheckbox);
79fb25 ¤   mSetRootButton->Show();
261b52 ¤   ¤
23c7a1 ¤   {
677d2b ¤   ¤   PGPUInt32¤  ¤   ¤   ksCount;
381356 ¤   ¤   PGPKeyServerEntry¤  *ksEntries;
--4289 000a3781df2401200bb Page 23 of CPGPPreferencesGrafPortView.cp
f11b52 ¤   ¤
0a4fda ¤   ¤   err = PGPGetKeyServerPrefs( gClientPrefsRef, &ksEntries, &ksCount);
269832 ¤   ¤   pgpAssertNoErr( err );
2f669f ¤   ¤   mServerTable = (CKeyserverTable *) FindPaneByID(kKeyServerTable);
773209 ¤   ¤   mServerTable->AddListener(this);
ea7e33 ¤   ¤   mServerTable->InsertCols(1, 1, NULL, 0, TRUE);
399f43 ¤   ¤   for(short inx=0;inx<ksCount;inx++)
9a5b34 ¤   ¤   {
5d03df ¤   ¤   ¤   mServerTable->InsertRows( 1, inx + 1, &ksEntries[inx],
07c544 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( PGPKeyServerEntry ), TRUE );
fc0fe4 ¤   ¤   }
06a58e ¤   ¤   PGPDisposePrefData( gClientPrefsRef, ksEntries);
d69371 ¤   }
5fefe6 }
1eaf5a
696b1b #pragma mark --- CPrefPanelAdvanced ---
dcaf5a
c2d33d class CPrefPanelAdvanced :¤ public CPreferencePanelView,
002717 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener
99bb36 {
7f5ed4 public:
a7af5a
450af6 ¤   enum { class_ID = 'vPAd' };
2f67c5 ¤
283d6e ¤   ¤   ¤   ¤   ¤   CPrefPanelAdvanced(LStream *inStream);
fb1376 ¤   virtual¤¤   ¤   ~CPrefPanelAdvanced();
8aa3aa ¤   virtual¤void¤   FinishCreateSelf();
73f559 ¤   virtual¤void¤   ListenToMessage(MessageT inMessage, void *ioParam);
e967c5 ¤
ae0c22 ¤   void¤   ¤   ¤   SavePanel();
560fb9 private:
242f4b ¤   enum
37c7a1 ¤   {
308446 ¤   ¤   kPreferredAlgPopup¤ ¤   = 'pAlg',
f253a4 ¤   ¤   kAllowCASTCheckbox¤ ¤   = 'xCAS',
174b2e ¤   ¤   kAllowIDEACheckbox¤ ¤   = 'xIDE',
6b6196 ¤   ¤   kAllowTripleDESCheckbox¤= 'x3DE',
a3690c ¤   ¤   kMarginalInvalidCheckbox= 'xInv',
d3155f ¤   ¤   kShowMarginalCheckbox¤  = 'xMrg',
f89652 ¤   ¤   kWarnOnMRK¤ ¤   ¤   ¤   = 'xMRK',
f4195b ¤   ¤   kExportCompatible¤  ¤   = 'rEFc',
cf901c ¤   ¤   kExportComplete¤¤   ¤   = 'rEFo'
4462bd ¤   };
8c82f7 };
9faf5a
391404 CPrefPanelAdvanced::CPrefPanelAdvanced(LStream *inStream)
564fcf ¤   : CPreferencePanelView(inStream)
debb36 {
c5efe6 }
50af5a
442948 CPrefPanelAdvanced::~CPrefPanelAdvanced(void)
2cbb36 {
e1efe6 }
d0af5a
666d52 ¤   void
e101d8 CPrefPanelAdvanced::ListenToMessage(MessageT inMessage, void *ioParam)
11bb36 {
4a28bb ¤   (void) ioParam;
c067c5 ¤
7f769e ¤   switch( inMessage )
6bc7a1 ¤   {
fd28d8 ¤   ¤   case kAllowCASTCheckbox:
d241e2 ¤   ¤   case kAllowIDEACheckbox:
d0a083 ¤   ¤   case kAllowTripleDESCheckbox:
915b34 ¤   ¤   {
252c39 ¤   ¤   ¤   if(!(((LCheckBox *)
2048c8 ¤   ¤   ¤   ¤   FindPaneByID(kAllowCASTCheckbox))->GetValue() +
6111a2 ¤   ¤   ¤   ¤   ((LCheckBox *)
25118a ¤   ¤   ¤   ¤   FindPaneByID(kAllowIDEACheckbox))->GetValue() +
8d11a2 ¤   ¤   ¤   ¤   ((LCheckBox *)
0e3cf7 ¤   ¤   ¤   ¤   FindPaneByID(kAllowTripleDESCheckbox))->GetValue()))
a3f776 ¤   ¤   ¤   {
--2eab 00000e13fa7401200bb Page 24 of CPGPPreferencesGrafPortView.cp
a54b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
832b85 ¤   ¤   ¤   ¤
6ca260 ¤   ¤   ¤   ¤   PGPUIWarningAlert( kWACautionAlertType, kWAOKStyle,
668849 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPreferencesStringListResID,
cc9074 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoAlgorithmsErrorStrIndex );
7d11a2 ¤   ¤   ¤   ¤   ((LCheckBox *)
cd1634 ¤   ¤   ¤   ¤   ¤   FindPaneByID(kAllowCASTCheckbox))->SetValue(1);
7aa3a6 ¤   ¤   ¤   }
5987c7 ¤   ¤   ¤
25cdcb ¤   ¤   ¤   break;
330fe4 ¤   ¤   }
829371 ¤   }
97efe6 }
1baf5a
186d52 ¤   void
04496f CPrefPanelAdvanced::SavePanel()
d8bb36 {
df07fe ¤   PGPInt32¤   ¤   ¤   numAlgs = 0;
ac9c70 ¤   PGPCipherAlgorithm¤ prefCipher;
94e3eb ¤   PGPSize¤¤   ¤   ¤   dataSize;
e68954 ¤   PGPCipherAlgorithm¤ allowedCiphers[4];
6c8f52 ¤   PGPError¤   ¤   ¤   err;
42f434 ¤   LRadioButton¤   ¤   *radioButton;
9867c5 ¤
2c20f3 ¤   prefCipher = (PGPCipherAlgorithm)(((LPopupButton *)
de9dbe ¤   ¤   FindPaneByID(kPreferredAlgPopup))->GetValue());
8536ae ¤   err = PGPSetPrefNumber( gClientPrefsRef,
ebcfec ¤   ¤   ¤   ¤   kPGPPrefPreferredAlgorithm, prefCipher);
148c1a ¤   pgpAssertNoErr( err );
2867c5 ¤
7b2cec ¤   numAlgs¤¤   ¤   ¤   = 1;
377e06 ¤   allowedCiphers[0]¤  = prefCipher;
eb67c5 ¤
383d0c ¤   if(prefCipher != kPGPCipherAlgorithm_CAST5)
37c7a1 ¤   {
61df2a ¤   ¤   if(((LCheckBox *)FindPaneByID(kAllowCASTCheckbox))->GetValue())
1e8efa ¤   ¤   ¤   allowedCiphers[numAlgs++] = kPGPCipherAlgorithm_CAST5;
3b9371 ¤   }
192735 ¤   if(prefCipher != kPGPCipherAlgorithm_3DES)
70c7a1 ¤   {
5ffba9 ¤   ¤   if(((LCheckBox *)FindPaneByID(kAllowTripleDESCheckbox))->GetValue())
90ff51 ¤   ¤   ¤   allowedCiphers[numAlgs++] = kPGPCipherAlgorithm_3DES;
e69371 ¤   }
28fb17 ¤   if(prefCipher != kPGPCipherAlgorithm_IDEA)
86c7a1 ¤   {
c240c1 ¤   ¤   if(((LCheckBox *)FindPaneByID(kAllowIDEACheckbox))->GetValue())
5b2373 ¤   ¤   ¤   allowedCiphers[numAlgs++] = kPGPCipherAlgorithm_IDEA;
ea9371 ¤   }
f3acdc ¤   dataSize = numAlgs * sizeof(PGPCipherAlgorithm);
36ccff ¤   err = PGPSetPrefData( gClientPrefsRef, kPGPPrefAllowedAlgorithmsList,
86e6a3 ¤   ¤   ¤   ¤   dataSize, &allowedCiphers);
188c1a ¤   pgpAssertNoErr( err );
6a67c5 ¤
a42b1b ¤   GetPrefCheckbox(kMarginalInvalidCheckbox, kPGPPrefMarginalIsInvalid);
18a804 ¤   GetPrefCheckbox(kShowMarginalCheckbox, kPGPPrefDisplayMarginalValidity);
a20a8c ¤   GetPrefCheckbox(kWarnOnMRK, kPGPPrefWarnOnADK);
4567c5 ¤
01b21e ¤   radioButton = (LRadioButton *) FindPaneByID( kExportCompatible );
757000 ¤   PGPSetPrefBoolean( gClientPrefsRef, kPGPPrefExportKeysCompatible,
cc227a ¤   ¤   ¤   ¤   ¤   ¤   ( radioButton->GetValue() == 1 ) );
84efe6 }
84af5a
2b9482 ¤   static PGPCipherAlgorithm
300454 AlgorithmMenuIndexToPGPCipherAlgorithm(UInt32 menuIndex)
8cbb36 {
32eaaf ¤   PGPCipherAlgorithm¤ algorithm;
da67c5 ¤
830c45 ¤   switch( menuIndex )
9fc7a1 ¤   {
8722ba ¤   ¤   case kIDEAMenuItemIndex:
c837ff ¤   ¤   ¤   algorithm = kPGPCipherAlgorithm_IDEA;
00cdcb ¤   ¤   ¤   break;
--3e18 0001b96ac45401200bb Page 25 of CPGPPreferencesGrafPortView.cp
e0af5a
60cc96 ¤   ¤   case kTripleDESMenuItemIndex:
e1ebdd ¤   ¤   ¤   algorithm = kPGPCipherAlgorithm_3DES;
89cdcb ¤   ¤   ¤   break;
dbaf5a
19da44 ¤   ¤   case kCASTMenuItemIndex:
afc08a ¤   ¤   ¤   algorithm = kPGPCipherAlgorithm_CAST5;
efcdcb ¤   ¤   ¤   break;
2faf5a
d89ae3 ¤   ¤   default:
ed4013 ¤   ¤   ¤   pgpDebugMsg(
00eeda ¤   ¤   ¤   ¤   "AlgorithmMenuIndexToPGPCipherAlgorithm(): Bad index" );
56234f ¤   ¤   ¤   algorithm = kPGPCipherAlgorithm_None;
bacdcb ¤   ¤   ¤   break;
719371 ¤   }
8567c5 ¤
954cfe ¤   return( algorithm );
a6efe6 }
f8af5a
299280 ¤   static UInt32
8a872c PGPCipherAlgorithmToAlgorithmMenuIndex(PGPCipherAlgorithm algorithm)
bdbb36 {
a2b8ba ¤   UInt32 menuIndex;
4667c5 ¤
33aa80 ¤   switch( algorithm )
64c7a1 ¤   {
da4b7e ¤   ¤   case kPGPCipherAlgorithm_IDEA:
71715f ¤   ¤   ¤   menuIndex = kIDEAMenuItemIndex;
8fcdcb ¤   ¤   ¤   break;
ccaf5a
01975c ¤   ¤   case kPGPCipherAlgorithm_3DES:
1cb7f2 ¤   ¤   ¤   menuIndex = kTripleDESMenuItemIndex;
2ccdcb ¤   ¤   ¤   break;
1daf5a
341673 ¤   ¤   case kPGPCipherAlgorithm_CAST5:
1489a1 ¤   ¤   ¤   menuIndex = kCASTMenuItemIndex;
b5cdcb ¤   ¤   ¤   break;
c7af5a
bb9ae3 ¤   ¤   default:
f64013 ¤   ¤   ¤   pgpDebugMsg(
6e680c ¤   ¤   ¤   ¤   "PGPCipherAlgorithmToAlgorithmMenuIndex(): Bad index" );
56715f ¤   ¤   ¤   menuIndex = kIDEAMenuItemIndex;
2bcdcb ¤   ¤   ¤   break;
9e9371 ¤   }
6467c5 ¤
8cddf9 ¤   return( menuIndex );
52efe6 }
c3af5a
2d6d52 ¤   void
206760 CPrefPanelAdvanced::FinishCreateSelf()
93bb36 {
54f62a ¤   PGPInt32¤   ¤   ¤   algIndex;
49dc7f ¤   PGPUInt32¤  ¤   ¤   prefValue;
0ce3eb ¤   PGPSize¤¤   ¤   ¤   dataSize;
3d2639 ¤   PGPBoolean¤ ¤   ¤   compatibleExp;
560595 ¤   PGPCipherAlgorithm¤ *allowedCiphers;
f98f52 ¤   PGPError¤   ¤   ¤   err;
f2f169 ¤   LPopupButton¤   ¤   *algPopup;
77f434 ¤   LRadioButton¤   ¤   *radioButton;
1e67c5 ¤
aa3f18 ¤   CPreferencePanelView::FinishCreateSelf();
ffaf5a
6c961a ¤   ((LCheckBox *)FindPaneByID(kAllowIDEACheckbox))->AddListener(this);
5b8d56 ¤   ((LCheckBox *)FindPaneByID(kAllowTripleDESCheckbox))->AddListener(this);
9ab89b ¤   ((LCheckBox *)FindPaneByID(kAllowCASTCheckbox))->AddListener(this);
2baf5a
0a6e67 ¤   // kPGPPrefPreferredAlgorithm
a1c81f ¤   err = PGPGetPrefNumber( gClientPrefsRef, kPGPPrefPreferredAlgorithm, &prefV¶
892b74 alue);
588c1a ¤   pgpAssertNoErr( err );
2167c5 ¤
1b59b6 ¤   algPopup = (LPopupButton *) FindPaneByID (kPreferredAlgPopup );
--6c0e 00053e74475401200bb Page 26 of CPGPPreferencesGrafPortView.cp
1e2390 ¤   pgpAssertAddrValid( algPopup, VoidAlign );
4467c5 ¤
369de0 ¤   algPopup->SetValue( PGPCipherAlgorithmToAlgorithmMenuIndex(
a5c719 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPCipherAlgorithm) prefValue ) );
df67c5 ¤
45abc9 ¤   // kPGPPrefAllowedAlgorithmsList
789678 ¤   err = PGPGetPrefData( gClientPrefsRef,
077c72 ¤   ¤   ¤   ¤   kPGPPrefAllowedAlgorithmsList,
98daf7 ¤   ¤   ¤   ¤   &dataSize,
f195e0 ¤   ¤   ¤   ¤   &allowedCiphers);
81c8d0 ¤   if(IsntPGPError(err))
38c7a1 ¤   {
267691 ¤   ¤   PGPInt32¤   numAlgs = dataSize / sizeof(PGPCipherAlgorithm);
5f1b52 ¤   ¤
fbe66c ¤   ¤   for(algIndex = 0; algIndex < numAlgs; algIndex ++)
9f5b34 ¤   ¤   {
2a1026 ¤   ¤   ¤   switch(allowedCiphers[algIndex])
6ef776 ¤   ¤   ¤   {
8ed4aa ¤   ¤   ¤   ¤   case kPGPCipherAlgorithm_IDEA:
be11a5 ¤   ¤   ¤   ¤   ¤   ((LCheckBox *)FindPaneByID(kAllowIDEACheckbox))->
f599d9 ¤   ¤   ¤   ¤   ¤   ¤   SetValue(1);
bd14c3 ¤   ¤   ¤   ¤   ¤   break;
9c0888 ¤   ¤   ¤   ¤   case kPGPCipherAlgorithm_3DES:
439a51 ¤   ¤   ¤   ¤   ¤   ((LCheckBox *)FindPaneByID(kAllowTripleDESCheckbox))->
9c99d9 ¤   ¤   ¤   ¤   ¤   ¤   SetValue(1);
e614c3 ¤   ¤   ¤   ¤   ¤   break;
028645 ¤   ¤   ¤   ¤   case kPGPCipherAlgorithm_CAST5:
1c563c ¤   ¤   ¤   ¤   ¤   ((LCheckBox *)FindPaneByID(kAllowCASTCheckbox))->
8e99d9 ¤   ¤   ¤   ¤   ¤   ¤   SetValue(1);
8e14c3 ¤   ¤   ¤   ¤   ¤   break;
66a3a6 ¤   ¤   ¤   }
1a0fe4 ¤   ¤   }
ee730a ¤   ¤   PGPDisposePrefData( gClientPrefsRef, allowedCiphers);
429371 ¤   }
be67c5 ¤
c3c990 ¤   SetPrefCheckbox(kPGPPrefMarginalIsInvalid, kMarginalInvalidCheckbox);
8a2cc8 ¤   SetPrefCheckbox(kPGPPrefDisplayMarginalValidity, kShowMarginalCheckbox);
37a57a ¤   SetPrefCheckbox(kPGPPrefWarnOnADK, kWarnOnMRK);
8e67c5 ¤
df3403 ¤   PGPGetPrefBoolean( gClientPrefsRef, kPGPPrefExportKeysCompatible,
2d7fe5 ¤   ¤   ¤   ¤   ¤   ¤   &compatibleExp );
685661 ¤   if( compatibleExp )
1fc7a1 ¤   {
7ba4a8 ¤   ¤   radioButton = (LRadioButton *) FindPaneByID( kExportCompatible );
d79c95 ¤   ¤   pgpAssertAddrValid( radioButton, VoidAlign );
29af5a
af3b51 ¤   ¤   radioButton->SetValue( 1 );
aa9371 ¤   }
3f0e24 ¤   else
56c7a1 ¤   {
7d5ee0 ¤   ¤   radioButton = (LRadioButton *) FindPaneByID( kExportComplete );
be9c95 ¤   ¤   pgpAssertAddrValid( radioButton, VoidAlign );
afaf5a
e93b51 ¤   ¤   radioButton->SetValue( 1 );
619371 ¤   }
c1efe6 }
9eaf5a
05748c #pragma mark --- CPGPPreferencesGrafPortView ---
b7af5a
588603 CPGPPreferencesGrafPortView::CPGPPreferencesGrafPortView(LStream *inStream)
96a3c8 ¤   : CPGPModalGrafPortView(inStream)
e7bb36 {
1e2949 ¤   RegisterClass_( CPrefPanelGeneral );
51e787 ¤   RegisterClass_( CPrefPanelFiles );
e7e659 ¤   RegisterClass_( CPrefPanelEmail );
3d58a9 ¤   RegisterClass_( CPrefPanelPGPmenu );
0a788a ¤   RegisterClass_( CPrefPanelServer );
4c5ea0 ¤   RegisterClass_( CPrefPanelAdvanced );
e767c5 ¤
a4c511 ¤   mWindowIsMoveable = TRUE;
54efe6 }
53af5a
--2a0f 00063ed9e6c401200bb Page 27 of CPGPPreferencesGrafPortView.cp
9bd715 CPGPPreferencesGrafPortView::~CPGPPreferencesGrafPortView()
c0bb36 {
43efe6 }
74af5a
1a6d52 ¤   void
ac3a07 CPGPPreferencesGrafPortView::FinishCreateSelf()
27cebb {¤
c3cf30 ¤   UInt16¤ numPanels;
1eaf5a
f75c9f ¤   CPGPModalGrafPortView::FinishCreateSelf();
6267c5 ¤
47cb64 ¤   mMultiView = (LMultiPanelView *) FindPaneByID(kMultiPanelView);
44961e ¤   pgpAssertAddrValid( mMultiView, VoidAlign );
c367c5 ¤
0a1b59 ¤   mMultiView->AddPanel( kGeneralPanelViewResID, NULL, kGeneralPanelViewIndex ¶
8b6275 );
ffc040 ¤   mMultiView->AddPanel( kFilesPanelViewResID, NULL, kFilesPanelViewIndex );
1b130c ¤   mMultiView->AddPanel( kEmailPanelViewResID, NULL, kEmailPanelViewIndex );
1dc35c ¤   mMultiView->AddPanel( kPGPmenuPanelViewResID, NULL, kPGPmenuPanelViewIndex ¶
996275 );
be50bc ¤   mMultiView->AddPanel( kServerPanelViewResID, NULL, kServerPanelViewIndex );
29e76b ¤   mMultiView->AddPanel( kAdvancedPanelViewResID, NULL, kAdvancedPanelViewInde¶
e1a2f5 x );
46af5a
32d0d6 ¤   // Force creation of all panels so we can control the LCommander hierarchy
4467c5 ¤
264bb5 ¤   numPanels = mMultiView->GetPanelCount();
e91841 ¤   for( UInt16 panelIndex = 1; panelIndex <= numPanels; panelIndex++ )
a5c7a1 ¤   {
843bde ¤   ¤   CPreferencePanelView¤   *theView;
ff1b52 ¤   ¤
94bbb3 ¤   ¤   LCommander::SetDefaultCommander( mMultiView );
677864 ¤   ¤   LPane::SetDefaultView( mMultiView );
ec1b52 ¤   ¤
fd7f3e ¤   ¤   theView = (CPreferencePanelView *) mMultiView->CreatePanel( panelIndex ¶
506275 );
759371 ¤   }
abaf5a
f8e9ae ¤   mMultiView->SwitchToPanel( kGeneralPanelViewIndex, FALSE );
d8efe6 }
4baf5a
529cb9 ¤   MessageT
9f64b1 CPGPPreferencesGrafPortView::HandleMessage(MessageT theMessage)
8bbb36 {
fd787f ¤   Boolean¤save = FALSE;
ed67c5 ¤
f00176 ¤   theMessage = CPGPModalGrafPortView::HandleMessage( theMessage );
d467c5 ¤
b61025 ¤   switch( theMessage )
5cc7a1 ¤   {
26d8ba ¤   ¤   case msg_OK:
287d42 ¤   ¤   ¤   save = TRUE;
3c6778 ¤   ¤   ¤   /* Fall through */
0b1b52 ¤   ¤
925686 ¤   ¤   case msg_Cancel:
725b34 ¤   ¤   {
8a7ae8 ¤   ¤   ¤   CPrefPanelGeneral¤  *generalView;
79f171 ¤   ¤   ¤   CPrefPanelFiles¤¤   *filesView;
cf6f23 ¤   ¤   ¤   CPrefPanelEmail¤¤   *emailView;
4e68fe ¤   ¤   ¤   CPrefPanelPGPmenu¤  *pgpMenuView;
e56b45 ¤   ¤   ¤   CPrefPanelServer¤   *serverView;
f2bbdb ¤   ¤   ¤   CPrefPanelAdvanced¤ *advancedView;
3887c7 ¤   ¤   ¤
6f0136 ¤   ¤   ¤   Hide();
6e87c7 ¤   ¤   ¤
8c56f0 ¤   ¤   ¤   advancedView = (CPrefPanelAdvanced *)
fd11d5 ¤   ¤   ¤   ¤   mMultiView->RemovePanel(kAdvancedPanelViewIndex);
2e09c2 ¤   ¤   ¤   if(IsntNull(advancedView) && save)
d40dc9 ¤   ¤   ¤   ¤   advancedView->SavePanel();
a63baa ¤   ¤   ¤   delete advancedView;
93af5a
638d93 ¤   ¤   ¤   serverView = (CPrefPanelServer *)
--c0f9 001c1346ec7401200bb Page 28 of CPGPPreferencesGrafPortView.cp
4a5e28 ¤   ¤   ¤   ¤   mMultiView->RemovePanel(kServerPanelViewIndex);
18b5d2 ¤   ¤   ¤   if(IsntNull(serverView) && save)
b5fe6f ¤   ¤   ¤   ¤   serverView->SavePanel();
428464 ¤   ¤   ¤   delete serverView;
4faf5a
4ee03c ¤   ¤   ¤   pgpMenuView = (CPrefPanelPGPmenu *)
9a0bbb ¤   ¤   ¤   ¤   mMultiView->RemovePanel(kPGPmenuPanelViewIndex);
18e39b ¤   ¤   ¤   if(IsntNull(pgpMenuView) && save)
e8b6cb ¤   ¤   ¤   ¤   pgpMenuView->SavePanel();
459ed3 ¤   ¤   ¤   delete pgpMenuView;
94af5a
501fd5 ¤   ¤   ¤   emailView = (CPrefPanelEmail *)
807936 ¤   ¤   ¤   ¤   mMultiView->RemovePanel(kEmailPanelViewIndex);
a379e2 ¤   ¤   ¤   if(IsntNull(emailView) && save)
66f001 ¤   ¤   ¤   ¤   emailView->SavePanel();
3040c5 ¤   ¤   ¤   delete emailView;
82af5a
d79132 ¤   ¤   ¤   filesView = (CPrefPanelFiles *)
0c33c6 ¤   ¤   ¤   ¤   mMultiView->RemovePanel(kFilesPanelViewIndex);
ae3243 ¤   ¤   ¤   if(IsntNull(filesView) && save)
d56157 ¤   ¤   ¤   ¤   filesView->SavePanel();
d69467 ¤   ¤   ¤   delete filesView;
9eaf5a
9d3a00 ¤   ¤   ¤   generalView = (CPrefPanelGeneral *)
94f7b5 ¤   ¤   ¤   ¤   mMultiView->RemovePanel(kGeneralPanelViewIndex);
274b2b ¤   ¤   ¤   if(IsntNull(generalView) && save)
d61e42 ¤   ¤   ¤   ¤   generalView->SavePanel();
1c70cb ¤   ¤   ¤   delete generalView;
7e87c7 ¤   ¤   ¤
3787c7 ¤   ¤   ¤
40ee71 ¤   ¤   ¤   if( save )
1ef776 ¤   ¤   ¤   {
0b1dbb ¤   ¤   ¤   ¤   PGPSavePrefFile( gClientPrefsRef );
14b5f0 ¤   ¤   ¤   ¤   PGPsdkSavePrefs( gContext );
fba3a6 ¤   ¤   ¤   }
c787c7 ¤   ¤   ¤
36cdcb ¤   ¤   ¤   break;
1e0fe4 ¤   ¤   }
2e9371 ¤   }
17af5a
76cfbc ¤   return( theMessage );
c1efe6 }
--8f5b 0018756b7b6401200bc Page 1 of CPGPPreferencesGrafPortView.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
e88488 ¤   $Id: CPGPPreferencesGrafPortView.h,v 1.4.8.1 1998/11/12 03:07:14 heller Exp¶
f6ed4e ·$
bff7f7 ____________________________________________________________________________*/
c57b7d #pragma once
90af5a
a3fcb1 #include "CPGPModalGrafPortView.h"
70af5a
cf920f class LMultiPanelView;
42af5a
687ebd class CPGPPreferencesGrafPortView¤  : public CPGPModalGrafPortView
5dbb36 {
3f5ed4 public:
92af5a
fd8f52 ¤   enum { class_ID = 'PrfV' };
7367c5 ¤
3fcacc ¤   ¤   ¤   ¤   ¤   ¤   CPGPPreferencesGrafPortView(LStream *inStream);
d4f3db ¤   ¤   ¤   ¤   ¤   ¤   ~CPGPPreferencesGrafPortView();
5daf5a
cbfebc ¤   virtual void¤   ¤   FinishCreateSelf(void);
356736 ¤   virtual MessageT¤   HandleMessage(MessageT theMessage);
73af5a
a80fb9 private:
c3af5a
125769 ¤   LMultiPanelView¤¤   *mMultiView;
83af5a
4c2f4b ¤   enum
a62ef1 ¤   {¤
7fdb4c ¤   ¤   kPrefPanel¤ ¤   ·¤  ¤   = 'pPnl',
582fbd ¤   ¤   kPanelMessage¤  ·¤  ¤   = 'pref',
a5d1be ¤   ¤   kMultiPanelView¤¤   ¤   = 'pMPV'
d462bd ¤   };
5587c7 ¤   ¤   ¤
5e82f7 };
87af5a
--3dbc 00082a47556401200bd Page 1 of CReconstitutionDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
bb1be6 ¤   $Id: CReconstitutionDialog.cp,v 1.29.8.1 1998/11/12 03:07:15 heller Exp $
8df7f7 ____________________________________________________________________________*/
1baf5a
24bce5 #include <LIconPane.h>
5cd797 #include <LPushButton.h>
9f6f28 #include <UTableHelpers.h>
ce7c99 #include <URegistrar.h>
87dd56 #include <PP_Messages.h>
41af5a
af894b #include "pgpFileSpec.h"
400d08 #include "pgpMem.h"
99a076 #include "pgpKeys.h"
25afda #include "pgpShare.h"
21add5 #include "pgpShareFile.h"
834919 #include "pgpUtilities.h"
2ee684 #include "pgpUserInterface.h"
1f10f0 #include "pgpOpenPrefs.h"
184720 #include "pflPrefTypes.h"
766328 #include "pgpClientLibDialogs.h"
54af5a
ca076e #include "PGPclientLibUtils.h"
78a02f #include "pgpClientLib.h"
c7af5a
d00e06 #include "UPGPException.h"
d40bb4 #include "CString.h"
e075fe #include "CReconstitutionDialog.h"
00af5a
14af5a
2c0b99 static const PaneIDT¤   caption_SplitKey¤   ¤   =¤  'cKey';
594eed static const PaneIDT¤   icon_SplitKey¤  ¤   ¤   =¤  'iKey';
757564 static const PaneIDT¤   table_KeyShares¤¤   ¤   =¤  'tSha';
31653b static const PaneIDT¤   caption_CollectedShares¤=¤  'cCol';
29b204 static const PaneIDT¤   caption_SharesNeeded¤   =¤  'cNee';
0d60c5 static const PaneIDT¤   caption_Network¤¤   ¤   =¤  'cNet';
91d9dc static const PaneIDT¤   view_Network¤   ¤   ¤   =¤  'vNet';
67c475 static const PaneIDT¤   caption_Status¤ ¤   ¤   =¤  'cSta';
ebeedf static const PaneIDT¤   caption_Authenticated¤  =¤  'cAut';
8cb020 static const PaneIDT¤   button_Network¤ ¤   ¤   =¤  'bNet';
d7390c static const PaneIDT¤   button_File¤¤   ¤   ¤   =¤  'bFil';
e74d2d static const PaneIDT¤   button_Cancel¤  ¤   ¤   =¤  'bCAN';
24fe2a static const PaneIDT¤   button_Continue¤¤   ¤   =¤  'bOK ';
20af5a
98346b static const MessageT¤  msg_Network¤¤   ¤   ¤   =¤  button_Network;
812d70 static const MessageT¤  msg_File¤   ¤   ¤   ¤   =¤  button_File;
afb0d0 static const MessageT¤  msg_Yield¤  ¤   ¤   ¤   =¤  'Yld ';
dfaf5a
b7f4f1 static const ResIDT¤¤   kReconstitutionDialogID¤=¤  4769;
e37ad6 static const ResIDT¤¤   kDHUserIDIconID¤¤   ¤   =¤  3020;
de7847 static const ResIDT¤¤   kRSAUserIDIconID¤   ¤   =¤  3002;
78af5a
2073f4 enum {
8d3104 ¤   STRx_Reconstitution¤¤   ¤   =¤  4752,
48e879 ¤   kErrorStringID¤ ¤   ¤   ¤   =¤  1,
074cf0 ¤   kWrongShareFileStringID,
3577db ¤   kSharePassphraseStringID,
6c9189 ¤   kListenStringID,
4f0928 ¤   kConnectStringID,
90827c ¤   kReceiveStringID,
7ed093 ¤   kCloseStringID,
1b53cd ¤   kStartNetworkStringID,
87fa08 ¤   kStopNetworkStringID,
0f6d52 ¤   kAuthorizationStringID,
2dcae5 ¤   kInvalidKeyStringID,
ef42b5 ¤   kBadPassphraseStringID
ac82f7 };
82af5a
--38a8 0000db55214401200bd Page 2 of CReconstitutionDialog.cp
e0af5a
aa47fd struct DecryptSharesData {
feb6c9 ¤   PGPKeySetRef¤   ¤   ¤   recipientSet;
e5acfd ¤   PGPKeyID¤   ¤   ¤   ¤   *keyIDList;
46af97 ¤   PGPUInt32¤  ¤   ¤   ¤   keyIDCount;
abc7ff ¤   CReconstitutionDialog *¤dialog;
d782f7 };
4daf5a
b8af5a
d2af5a
b3fff6 class CWhackWindowKind
f3bb36 {
69a2d3 protected:
83a8fb ¤   short¤  ¤   ¤   mSaveWindowKind;
29cc54 ¤   WindowRecord¤   *mFrontWindow;
af67c5 ¤
c75ed4 public:
86cf70 ¤   ¤   ¤   CWhackWindowKind( void )
94f776 ¤   ¤   ¤   {
742a6c ¤   ¤   ¤   ¤   mFrontWindow = (WindowRecord *) FrontWindow();
e20a0e ¤   ¤   ¤   ¤   mSaveWindowKind¤= mFrontWindow->windowKind;
e64e7f ¤   ¤   ¤   ¤   mFrontWindow->windowKind = kApplicationWindowKind;
96a3a6 ¤   ¤   ¤   }
3487c7 ¤   ¤   ¤
74e5bb ¤   virtual ~CWhackWindowKind()
0cf776 ¤   ¤   ¤   {
3bf6fd ¤   ¤   ¤   ¤   mFrontWindow->windowKind = mSaveWindowKind;
62a3a6 ¤   ¤   ¤   }
7a82f7 };
17af5a
53c744 ¤   PGPError
7a7939 PGPReconstitutionDialog(
8b612f ¤   PGPKeyRef¤  ¤   ¤   keyToCollect,
f90e0c ¤   PGPKeySetRef¤   ¤   keySet,
ca6c35 ¤   PGPtlsContextRef¤   tlsContext,
1e9186 ¤   PGPByte **¤ ¤   ¤   passKey,
6d0ef5 ¤   PGPSize *¤  ¤   ¤   passKeySize)
9fbb36 {
30e4de ¤   PGPError¤   ¤   ¤   result;
2c9a69 ¤   PGPclientLibState¤  state;
8b67c5 ¤
38131c ¤   PGPValidatePtr(passKey);
64c31d ¤   *passKey = NULL;
b731e4 ¤   PGPValidateParam(PGPKeyRefIsValid(keyToCollect));
6b5b6c ¤   PGPValidateParam(PGPKeySetRefIsValid(keySet));
a30e7d ¤   PGPValidatePtr(passKeySize);
6367c5 ¤
ca4b6b ¤   result = EnterPGPclientLib(PGPGetKeyContext(keyToCollect), &state);
dbfe94 ¤   if (IsntPGPError(result)) {
4df294 ¤   ¤   DialogRef¤  theDialog;
81af5a
39a010 ¤   ¤   RegisterClass_(CReconstitutionDialog);
074392 ¤   ¤   do {
51d3c8 ¤   ¤   ¤   theDialog = CReconstitutionDialog::CreateDialog(
b41dd0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kReconstitutionDialogID);
ac9233 ¤   ¤   ¤   if (IsntNull(theDialog)) {
0fae3e ¤   ¤   ¤   ¤   CReconstitutionDialog *¤reconstitutionDialog;
a42b85 ¤   ¤   ¤   ¤
49eda9 ¤   ¤   ¤   ¤   reconstitutionDialog = (CReconstitutionDialog *)·
0b0481 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::GetWRefCon(theDialog);
6eeff8 ¤   ¤   ¤   ¤   pgpAssertAddrValid(reconstitutionDialog, VoidAlign);
702b85 ¤   ¤   ¤   ¤
a64dc0 ¤   ¤   ¤   ¤   result = reconstitutionDialog->SetInfo(¤keyToCollect,
265a61 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keySet,
456674 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tlsContext,
b9e2b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passKey,
5397d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passKeySize);
73385b ¤   ¤   ¤   ¤   if (IsntPGPError(result)) {
736291 ¤   ¤   ¤   ¤   ¤   result = reconstitutionDialog->DoDialog();
36f85b ¤   ¤   ¤   ¤   ¤   if (result == kPGPError_BadPassphrase) {
ae6272 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeData(*passKey);
0dc542 ¤   ¤   ¤   ¤   ¤   ¤   *passKey = NULL;
--c2bb 0004b6dad21401200bd Page 3 of CReconstitutionDialog.cp
d47ca1 ¤   ¤   ¤   ¤   ¤   ¤   PGPUIWarningAlert(¤ kWACautionAlertType,
4a9a5e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
cb3210 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Reconstitution,
c0238d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kBadPassphraseStringID);
6c1c89 ¤   ¤   ¤   ¤   ¤   }
8b2613 ¤   ¤   ¤   ¤   }
b22b85 ¤   ¤   ¤   ¤
041437 ¤   ¤   ¤   ¤   delete reconstitutionDialog;
90c2e6 ¤   ¤   ¤   ¤   ::DisposeDialog(theDialog);
e0042d ¤   ¤   ¤   } else {
92ce36 ¤   ¤   ¤   ¤   result = kPGPError_OutOfMemory;
f9a3a6 ¤   ¤   ¤   }
1ee805 ¤   ¤   } while (result == kPGPError_BadPassphrase);
409371 ¤   }
92f510 ¤   ExitPGPclientLib(&state);
5567c5 ¤
315d73 ¤   return result;
87efe6 }
0867c5 ¤
e467c5 ¤
7e67c5 ¤
edce79 CReconstitutionDialog::CReconstitutionDialog(
44cbb0 ¤   LStream *¤  inStream)
87af27 ¤   : CPGPModalGrafPortView(inStream), mShares(kInvalidPGPShareRef),
3c5c8b ¤   ··mSharesCollected(0), mSharesNeeded(1), mSKEPActive(false),
9377bb ¤   ··mSKEPPassphrase(nil), mPrefRef(kInvalidPGPPrefRef),
ba1d1f ¤   ··mTLSContext(kInvalidPGPtlsContextRef),
0adfca ¤   ··mDeferredDismissMessage(msg_Nothing)
40bb36 {
8ec511 ¤   mWindowIsMoveable = TRUE;
beefe6 }
69af5a
2caf5a
22af5a
10a020 CReconstitutionDialog::~CReconstitutionDialog()
cfbb36 {
ae4a36 ¤   if (PGPShareRefIsValid(mShares)) {
7ad3cd ¤   ¤   PGPFreeShares(mShares);
b79371 ¤   }
4f0511 ¤   if (mSKEPPassphrase != nil) {
c25c41 ¤   ¤   PGPFreeData(mSKEPPassphrase);
a59371 ¤   }
982f27 ¤   if (PGPPrefRefIsValid(mPrefRef)) {
528333 ¤   ¤   PGPClosePrefFile(mPrefRef);
739371 ¤   }
e9efe6 }
29af5a
87af5a
8eaf5a
846d52 ¤   void
835a6b CReconstitutionDialog::FinishCreateSelf()
6fbb36 {
105c9f ¤   CPGPModalGrafPortView::FinishCreateSelf();
5c67c5 ¤
ee0e5e ¤   mShareholderList = (CShareholderList *) FindPaneByID(table_KeyShares);
c21407 ¤   delete mShareholderList->GetTableSelector();
50cd62 ¤   mShareholderList->SetTableSelector(nil);
83d280 ¤   mShareholderList->InsertCols(1, 1, nil, 0, TRUE);
e99a29 ¤   ((LPushButton *) FindPaneByID(button_Network))->AddListener(this);
324e8c ¤   ((LPushButton *) FindPaneByID(button_File))->AddListener(this);
127b0d ¤   ((LPushButton *) FindPaneByID(button_Cancel))->AddListener(this);
2c67d6 ¤   ((LPushButton *) FindPaneByID(button_Continue))->AddListener(this);
b067c5 ¤
07f066 ¤   StartRepeating();
69efe6 }
6067c5 ¤
6d9cb9 ¤   MessageT
39177f CReconstitutionDialog::HandleMessage(MessageT theMessage)
28bb36 {
1b8e12 ¤   PGPError¤   err = kPGPError_NoErr;
7b67c5 ¤
4ba290 ¤   switch (theMessage)
--80e7 000a8092fd3401200bd Page 4 of CReconstitutionDialog.cp
f7c7a1 ¤   {
09156a ¤   ¤   case msg_Network:
cf0ce8 ¤   ¤   ¤   err = CollectNetworkShares();
c5e5f3 ¤   ¤   ¤   theMessage = msg_Nothing;
d3cdcb ¤   ¤   ¤   break;
201b52 ¤   ¤
59fb3f ¤   ¤   case msg_File:
23e561 ¤   ¤   ¤   err = CollectFileShares();
bce5f3 ¤   ¤   ¤   theMessage = msg_Nothing;
4acdcb ¤   ¤   ¤   break;
e91b52 ¤   ¤
63d8ba ¤   ¤   case msg_OK:
d45686 ¤   ¤   case msg_Cancel:
355b34 ¤   ¤   {
0fd392 ¤   ¤   ¤   if( mSKEPActive )
63f776 ¤   ¤   ¤   {
731be7 ¤   ¤   ¤   ¤   // Cause SKEPReceiveShares() to exit with kPGPError_UserAbort
d02077 ¤   ¤   ¤   ¤   mDeferredDismissMessage = theMessage;
652501 ¤   ¤   ¤   ¤   theMessage¤ ¤   ¤   ¤   = msg_Cancel;
efce85 ¤   ¤   ¤   ¤   mExitSKEP¤  ¤   ¤   ¤   = TRUE;
5da3a6 ¤   ¤   ¤   }
c6b961 ¤   ¤   ¤   else if( theMessage == msg_OK )
3cf776 ¤   ¤   ¤   {
0810f8 ¤   ¤   ¤   ¤   mDialogError = PGPGetPasskeyFromShares(¤mShares, mPassKey,
e890ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPassKeySize );
10779e ¤   ¤   ¤   ¤   if( IsntPGPError( mDialogError ) &&·
fd4a1f ¤   ¤   ¤   ¤   ¤   ! PGPPassphraseIsValid( mKeyToCollect,
465caf ¤   ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( mContext, *mPassKey,
722b03 ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mPassKeySize ),
cb8dae ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext )))
bf72c3 ¤   ¤   ¤   ¤   {
80914e ¤   ¤   ¤   ¤   ¤   mDialogError = kPGPError_BadPassphrase;
402613 ¤   ¤   ¤   ¤   }
02a3a6 ¤   ¤   ¤   }
5387c7 ¤   ¤   ¤
3fcdcb ¤   ¤   ¤   break;
c93b90 ¤   ¤   }¤
e787c7 ¤   ¤   ¤
119ae3 ¤   ¤   default:
129bda ¤   ¤   ¤   theMessage = CPGPModalGrafPortView::HandleMessage( theMessage );
f2cdcb ¤   ¤   ¤   break;
fa9371 ¤   }
56af5a
467f7d ¤   if( IsPGPError( err ) )
dcc7a1 ¤   {
f7eeaf ¤   ¤   ShowError( err );
6d9371 ¤   }
2e67c5 ¤
2ecfbc ¤   return( theMessage );
24efe6 }
51af5a
7dc744 ¤   PGPError
a713b6 CReconstitutionDialog::SetInfo(
ebd1af ¤   PGPKeyRef¤  ¤   ¤   inKeyToCollect,
22a0ea ¤   PGPKeySetRef¤   ¤   inKeySet,
6c2086 ¤   PGPtlsContextRef¤   inTLSContext,
375a93 ¤   PGPByte **¤ ¤   ¤   outPassKey,
538b37 ¤   PGPSize *¤  ¤   ¤   outPassKeySize)
e9bb36 {
01e4de ¤   PGPError¤   ¤   ¤   result;
d00250 ¤   Str255¤ ¤   ¤   ¤   userID;
432097 ¤   PGPSize¤¤   ¤   ¤   len;
41da4f ¤   LIconPane *¤¤   ¤   splitKeyIcon;
083ddc ¤   PGPInt32¤   ¤   ¤   algorithm;
3a67c5 ¤
2090db ¤   mKeySet = inKeySet;
c36f60 ¤   mKeyToCollect = inKeyToCollect;
f101a2 ¤   mTLSContext = inTLSContext;
64b164 ¤   result = PGPGetKeyIDFromKey(mKeyToCollect, &mKeyToCollectKeyID);
36fe94 ¤   if (IsntPGPError(result)) {
70f6bf ¤   ¤   mContext = PGPGetKeyContext(mKeyToCollect);
a88fa4 ¤   ¤   mPassKey = outPassKey;
--ba61 0007c11f3e7401200bd Page 5 of CReconstitutionDialog.cp
5c6578 ¤   ¤   mPassKeySize = outPassKeySize;
d31b52 ¤   ¤
3dcd9c ¤   ¤   result = PGPGetPrimaryUserIDNameBuffer(¤mKeyToCollect,
19244e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(userID) - 1,
341e55 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (char *) &userID[1],
454973 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &len);
447568 ¤   ¤   if (IsntPGPError(result)) {
e8f9ad ¤   ¤   ¤   userID[0] = len - 1;
256e1d ¤   ¤   ¤   FindPaneByID(caption_SplitKey)->SetDescriptor(userID);
8772f1 ¤   ¤   ¤   result = PGPGetKeyNumber(¤  mKeyToCollect,
48bc67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropAlgID,
8cef03 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm);
24b03d ¤   ¤   ¤   if (IsntPGPError(result)) {
098b66 ¤   ¤   ¤   ¤   mAlgorithm = (PGPPublicKeyAlgorithm) algorithm;
47f89f ¤   ¤   ¤   ¤   splitKeyIcon = (LIconPane *) FindPaneByID(icon_SplitKey);
1d95cf ¤   ¤   ¤   ¤   if (mAlgorithm == kPGPPublicKeyAlgorithm_DSA) {
d4b3b1 ¤   ¤   ¤   ¤   ¤   splitKeyIcon->SetIconID(kDHUserIDIconID);
8cb5fc ¤   ¤   ¤   ¤   } else {
c98fba ¤   ¤   ¤   ¤   ¤   splitKeyIcon->SetIconID(kRSAUserIDIconID);
392613 ¤   ¤   ¤   ¤   }
4e2b85 ¤   ¤   ¤   ¤
8298f3 ¤   ¤   ¤   ¤   result = PGPOpenClientPrefs(
368182 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr(mContext),
1867d7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mPrefRef);
05a3a6 ¤   ¤   ¤   }
260fe4 ¤   ¤   }
929371 ¤   }
2a67c5 ¤
db5d73 ¤   return result;
5eefe6 }
50af5a
05af5a
56af5a
546d52 ¤   void
6f0b0e CReconstitutionDialog::ListenToMessage(
f87b08 ¤   MessageT¤   inMessage,
3f121e ¤   void *¤ ¤   ioParam)
84bb36 {
f0d22a ¤   switch (inMessage)
63c7a1 ¤   {
bc156a ¤   ¤   case msg_Network:
34fb3f ¤   ¤   case msg_File:
f52e38 ¤   ¤   ¤   SetDismissMessage( inMessage );
37cdcb ¤   ¤   ¤   break;
8f87c7 ¤   ¤   ¤
c59ae3 ¤   ¤   default:
d3c762 ¤   ¤   ¤   CPGPModalGrafPortView::ListenToMessage(inMessage, ioParam);
51cdcb ¤   ¤   ¤   break;
549371 ¤   }
afefe6 }
73af5a
9baf5a
9baf5a
e9c744 ¤   PGPError
0e77a4 CReconstitutionDialog::AddShares(
7f867e ¤   CReconstitutionDialog *¤inDialog,
cbdda5 ¤   char *¤ ¤   ¤   ¤   ¤   inUserID,
99e0e4 ¤   PGPShareRef *¤  ¤   ¤   inShares)
53bb36 {
24e74b ¤   PGPError¤   ¤   ¤   ¤   result = kPGPError_NoErr;
434baf ¤   ShareholderListEntry¤   cell;
dd67c5 ¤
ad0516 ¤   pgpClearMemory(&cell, sizeof(cell));
df893d ¤   cell.algorithm = inDialog->mAlgorithm;
ce29d2 ¤   strcpy(cell.name, inUserID);
fb7b2c ¤   cell.numShares = PGPGetNumberOfShares(*inShares);
dad6d4 ¤   if (PGPShareRefIsValid(inDialog->mShares)) {
d16f9f ¤   ¤   PGPShareRef¤combinedShares;
5b1b52 ¤   ¤
14a109 ¤   ¤   result = PGPCombineShares(¤ inDialog->mShares,
62683b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *inShares,
7cd5ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &combinedShares);
--e55a 000907fd45c401200bd Page 6 of CReconstitutionDialog.cp
597568 ¤   ¤   if (IsntPGPError(result)) {
57f1f1 ¤   ¤   ¤   PGPFreeShares(inDialog->mShares);
fa1909 ¤   ¤   ¤   PGPFreeShares(*inShares);
03d325 ¤   ¤   ¤   *inShares = kInvalidPGPShareRef;
10d8ab ¤   ¤   ¤   inDialog->mShares = combinedShares;
260fe4 ¤   ¤   }
dff037 ¤   } else {
21ad57 ¤   ¤   PGPKeyID¤   keyID;
bdaf5a
43bb0e ¤   ¤   result = PGPGetKeyIDFromShares(¤*inShares,·
d1a32e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID);
9b7568 ¤   ¤   if (IsntPGPError(result)) {
01877c ¤   ¤   ¤   if (PGPCompareKeyIDs(&inDialog->mKeyToCollectKeyID, &keyID) != 0) {
00bf2b ¤   ¤   ¤   ¤   inDialog->UpdatePort();
b7803d ¤   ¤   ¤   ¤   PGPUIWarningAlert(¤ kWACautionAlertType,
2f144f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
bb7b96 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Reconstitution,
aff146 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWrongShareFileStringID);
a5042d ¤   ¤   ¤   } else {
0dc6a2 ¤   ¤   ¤   ¤   inDialog->mSharesNeeded = PGPGetShareThreshold(*inShares);
85e5d7 ¤   ¤   ¤   ¤   inDialog->FindPaneByID(caption_SharesNeeded)->
1f31b7 ¤   ¤   ¤   ¤   ¤   SetValue(inDialog->mSharesNeeded);¤
5ff345 ¤   ¤   ¤   ¤   inDialog->mShares = *inShares;
4081b8 ¤   ¤   ¤   ¤   *inShares = kInvalidPGPShareRef;
88a3a6 ¤   ¤   ¤   }
330fe4 ¤   ¤   }
0f9371 ¤   }
65fe94 ¤   if (IsntPGPError(result)) {
20d59d ¤   ¤   *inShares = kInvalidPGPShareRef;
ba17bb ¤   ¤   inDialog->mSharesCollected += cell.numShares;
6dc27c ¤   ¤   if (inDialog->mSharesCollected ==·
c4c6aa ¤   ¤   PGPGetNumberOfShares(inDialog->mShares)) {
3196fd ¤   ¤   ¤   inDialog->FindPaneByID(caption_CollectedShares)->
c97f32 ¤   ¤   ¤   ¤   SetValue(inDialog->mSharesCollected);
9df3ca ¤   ¤   ¤   inDialog->mShareholderList->InsertRows(¤1,
f257b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LArray::index_Last,
baade5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &cell,
d61baf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(cell),
a20d5a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TRUE);
4045a6 ¤   ¤   } else {
636749 ¤   ¤   ¤   inDialog->mSharesCollected -= cell.numShares;
a10fe4 ¤   ¤   }
769371 ¤   }
d61b52 ¤   ¤
5b3ab6 ¤   if (inDialog->mSharesCollected >= inDialog->mSharesNeeded) {
12775c ¤   ¤   inDialog->FindPaneByID(button_Continue)->Enable();
019371 ¤   }
9467c5 ¤
9b5d73 ¤   return result;
8befe6 }
e8af5a
86c744 ¤   PGPError
17abd0 CReconstitutionDialog::CollectFileShares(void)
f4bb36 {
078e12 ¤   PGPError¤   err = kPGPError_NoErr;
a21eb6 ¤   FSSpec¤ ¤   fsSpec;
9caf5a
a19037 ¤   UpdatePort();
1ba6d9 ¤   err = PGPSelectPGPFile( mContext, kPGPFileSelector_KeyShares,
91df14 ¤   ¤   ¤   ¤   ¤   ¤   &fsSpec);
f1b1f0 ¤   if( IsntPGPError( err ) )
77c7a1 ¤   {
371cc1 ¤   ¤   PFLFileSpecRef¤ ¤   fsRef;
76af5a
65156b ¤   ¤   err = PFLNewFileSpecFromFSSpec( PGPGetContextMemoryMgr( mContext ),
b80ba0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fsSpec, &fsRef );
8586f8 ¤   ¤   if( IsntPGPError( err ) )
f35b34 ¤   ¤   {
1ef659 ¤   ¤   ¤   PGPShareFileRef¤¤   sfRef;
d8af5a
472fdc ¤   ¤   ¤   err = PGPOpenShareFile( fsRef, &sfRef );
90698b ¤   ¤   ¤   if( IsntPGPError( err ) )
--67d4 000a5fa6ca4401200bd Page 7 of CReconstitutionDialog.cp
99f776 ¤   ¤   ¤   {
f33e5d ¤   ¤   ¤   ¤   DecryptSharesData¤  dsd;
fb8825 ¤   ¤   ¤   ¤   char¤   ¤   ¤   ¤   userID[kMaxShareholderUserIDLength + 1];
bda0d9 ¤   ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   nameSize;
55af5a
f01a54 ¤   ¤   ¤   ¤   dsd.recipientSet ¤  = kInvalidPGPKeySetRef;
91eea3 ¤   ¤   ¤   ¤   dsd.keyIDList ¤ ¤   = NULL;
c87679 ¤   ¤   ¤   ¤   dsd.keyIDCount ¤¤   = 0;
59de10 ¤   ¤   ¤   ¤   dsd.dialog ¤¤   ¤   = this;
222b85 ¤   ¤   ¤   ¤
8324a3 ¤   ¤   ¤   ¤   err = PGPGetShareFileUserID( sfRef,
aae79c ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMaxShareholderUserIDLength, userID, &nameSize);
b75565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
9372c3 ¤   ¤   ¤   ¤   {
7c2a5c ¤   ¤   ¤   ¤   ¤   PGPOptionListRef¤   decodeOpt;
c5ae30 ¤   ¤   ¤   ¤   ¤
83ac59 ¤   ¤   ¤   ¤   ¤   err = PGPBuildOptionList( mContext, &decodeOpt,
94afdb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeySetRef( mContext, mKeySet ),
a53bcb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEventHandler( mContext,
37aee6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DecryptSharesHandler, &dsd),
3154cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) );
436ca0 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
6955b9 ¤   ¤   ¤   ¤   ¤   {¤
bad0fa ¤   ¤   ¤   ¤   ¤   ¤   PGPShareRef¤shares;
ab94aa ¤   ¤   ¤   ¤   ¤   ¤
13d5be ¤   ¤   ¤   ¤   ¤   ¤   err = PGPCopySharesFromFile( mContext, sfRef,
a5519b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   decodeOpt, &shares );
c1239e ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
0a8fec ¤   ¤   ¤   ¤   ¤   ¤   {
b06676 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = AddShares(this, userID, &shares );
31531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
2525b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( PGPShareRefIsValid( shares ) )
fb5202 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeShares( shares );
87db3c ¤   ¤   ¤   ¤   ¤   ¤   }
e994aa ¤   ¤   ¤   ¤   ¤   ¤
c48845 ¤   ¤   ¤   ¤   ¤   ¤   if( PGPKeySetRefIsValid( dsd.recipientSet ) )
9acc6b ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( dsd.recipientSet );
2a2b85 ¤   ¤   ¤   ¤
abe37a ¤   ¤   ¤   ¤   ¤   ¤   if( IsntNull( dsd.keyIDList ) )
3c45f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeData( dsd.keyIDList );
61af5a
8a049e ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeOptionList( decodeOpt );
101c89 ¤   ¤   ¤   ¤   ¤   }
9b2613 ¤   ¤   ¤   ¤   }
d1af5a
7f6416 ¤   ¤   ¤   ¤   PGPFreeShareFile(sfRef);
b4a3a6 ¤   ¤   ¤   }
a387c7 ¤   ¤   ¤
e1d110 ¤   ¤   ¤   PFLFreeFileSpec(fsRef);
1a0fe4 ¤   ¤   }
029371 ¤   }
b167c5 ¤
2edeb7 ¤   return( err );
63efe6 }
6aaf5a
e7af5a
70af5a
09c744 ¤   PGPError
15221d CReconstitutionDialog::CollectNetworkShares()
d7bb36 {
a68e12 ¤   PGPError¤   err = kPGPError_NoErr;
0a67c5 ¤
be9d73 ¤   if( mSKEPActive )
d22ef1 ¤   {¤
6dbbbe ¤   ¤   // Stopping network collection
6854b3 ¤   ¤   mExitSKEP = TRUE;
479371 ¤   }
ad0e24 ¤   else
52c7a1 ¤   {
0e7145 ¤   ¤   if( IsntNull( mSKEPPassphrase ) )
a35b34 ¤   ¤   {
a555a3 ¤   ¤   ¤   PGPFreeData( mSKEPPassphrase );
--1077 00074a25713401200bd Page 8 of CReconstitutionDialog.cp
816d93 ¤   ¤   ¤   mSKEPPassphrase = NULL;
f20fe4 ¤   ¤   }
801b52 ¤   ¤
0daaad ¤   ¤   UpdatePort();
e01b52 ¤   ¤
bd7937 ¤   ¤   err = CheckForNonSplitPrivateKey();
66af5a
9e22f6 ¤   ¤   if (IsntPGPError( err ) )
ae5b34 ¤   ¤   {
44495f ¤   ¤   ¤   CWhackWindowKind¤   whackWindowKind;
a71b52 ¤   ¤
219ce0 ¤   ¤   ¤   err = PGPSigningPassphraseDialog( mContext, mKeySet, &mSKEPKey,
02e38d ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt(¤mContext, CString(
937d65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Reconstitution, kAuthorizationStringID) ),
beaa05 ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase(¤mContext, &mSKEPPassphrase ),
89b5ba ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) );
bf0fe4 ¤   ¤   }
e71b52 ¤   ¤
5586f8 ¤   ¤   if( IsntPGPError( err ) )
055b34 ¤   ¤   {
cec041 ¤   ¤   ¤   PGPskepRef¤ skep;
61af5a
e310dc ¤   ¤   ¤   FindPaneByID(caption_Network)->Hide();
d2e910 ¤   ¤   ¤   FindPaneByID(view_Network)->Show();
a4b648 ¤   ¤   ¤   FindPaneByID(button_Network)->SetDescriptor(
416427 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Reconstitution,
52d48b ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStopNetworkStringID) );
7087c7 ¤   ¤   ¤
350633 ¤   ¤   ¤   mExitSKEP ¤ = FALSE;
f02248 ¤   ¤   ¤   mSKEPActive¤= TRUE;
1d87c7 ¤   ¤   ¤
a6eb80 ¤   ¤   ¤   err = PGPNewSKEP( mContext, ·mTLSContext, &skep);
5a698b ¤   ¤   ¤   if( IsntPGPError( err ) )
56f776 ¤   ¤   ¤   {
10d465 ¤   ¤   ¤   ¤   err = PGPskepSetEventHandler( skep, SKEPEventHandler, this );
8d5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
a272c3 ¤   ¤   ¤   ¤   {
9915fc ¤   ¤   ¤   ¤   ¤   err = PGPskepReceiveShares(¤skep, mSKEPKey,
500777 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mSKEPPassphrase);
862613 ¤   ¤   ¤   ¤   }
6e2b85 ¤   ¤   ¤   ¤
49931a ¤   ¤   ¤   ¤   PGPFreeSKEP( skep );
98a3a6 ¤   ¤   ¤   }
ce87c7 ¤   ¤   ¤
20ed47 ¤   ¤   ¤   mSKEPActive = FALSE;
f187c7 ¤   ¤   ¤
63053c ¤   ¤   ¤   FindPaneByID(view_Network)->Hide();
16fcf0 ¤   ¤   ¤   FindPaneByID(caption_Network)->Show();
25b648 ¤   ¤   ¤   FindPaneByID(button_Network)->SetDescriptor(
a28b85 ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Reconstitution, kStartNetworkStringID));
a10fe4 ¤   ¤   }
529371 ¤   }
3767c5 ¤
2cdeb7 ¤   return( err );
68efe6 }
80af5a
eac744 ¤   PGPError
c73107 CReconstitutionDialog::DecryptSharesHandler(
dd3c55 ¤   PGPContextRef¤  inContext,
e42a19 ¤   PGPEvent *¤ ¤   inEvent,
f524b3 ¤   void *¤ ¤   ¤   inUserValue)
d9bb36 {
db7796 ¤   PGPError¤   ¤   ¤   result = kPGPError_NoErr;
f74085 ¤   DecryptSharesData *¤dsd = (DecryptSharesData *) inUserValue;
d567c5 ¤
ff8269 ¤   switch (inEvent->type) {
77a537 ¤   ¤   case kPGPEvent_PassphraseEvent:
0f5b34 ¤   ¤   {
7d0250 ¤   ¤   ¤   CString¤¤   ¤   ¤   prompt(STRx_Reconstitution, kSharePassphraseStr¶
2150ae ingID);
53871c ¤   ¤   ¤   char *¤ ¤   ¤   ¤   passphrase;
74a5dd ¤   ¤   ¤   PGPKeyRef¤  ¤   ¤   key;
--3910 000725989a4401200bd Page 9 of CReconstitutionDialog.cp
0b495f ¤   ¤   ¤   CWhackWindowKind¤   whackWindowKind;
8187c7 ¤   ¤   ¤
55ede0 ¤   ¤   ¤   dsd->dialog->UpdatePort();
4dc816 ¤   ¤   ¤   if ( inEvent->data.passphraseData.fConventional) {
14a4ed ¤   ¤   ¤   ¤   result = PGPConventionalDecryptionPassphraseDialog(
856cac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inContext,
5c3532 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt(¤inContext,
3c59b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   prompt),
4a10b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase(¤inContext,
565068 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passphrase),
2eb449 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
4b042d ¤   ¤   ¤   } else {
351191 ¤   ¤   ¤   ¤   result = PGPClientDecryptionPassphraseDialog(
496cac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inContext,
f47a7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPtlsContextRef,
218ee1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   prompt,
5cd077 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dsd->recipientSet,
8b57d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dsd->keyIDList,
146edb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dsd->keyIDCount,
ffd762 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPOptionListRef,
45df98 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passphrase,
36ac1b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &key,
6a6424 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NULL );
dfa3a6 ¤   ¤   ¤   }
3eb03d ¤   ¤   ¤   if (IsntPGPError(result)) {
90c285 ¤   ¤   ¤   ¤   result = PGPAddJobOptions(¤ inEvent->job,
67fdbe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( inContext,
6295b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passphrase),
ec034c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
342a93 ¤   ¤   ¤   ¤   PGPFreeData(passphrase);
c1a3a6 ¤   ¤   ¤   }
990fe4 ¤   ¤   }
a22f68 ¤   ¤   break;
af1b52 ¤   ¤
cd1b52 ¤   ¤
339dce ¤   ¤   case kPGPEvent_RecipientsEvent:
735b34 ¤   ¤   {
1a0c5d ¤   ¤   ¤   dsd->recipientSet = inEvent->data.recipientsData.recipientSet;
5bd28b ¤   ¤   ¤   if (PGPKeySetRefIsValid(dsd->recipientSet)) {
6aea1a ¤   ¤   ¤   ¤   result = PGPIncKeySetRefCount(dsd->recipientSet);
3ea3a6 ¤   ¤   ¤   }
4587c7 ¤   ¤   ¤
31400c ¤   ¤   ¤   if( IsntPGPError( result ) &&
51bbd3 ¤   ¤   ¤   ¤   IsntNull( inEvent->data.recipientsData.keyIDArray ) )
31f776 ¤   ¤   ¤   {
37b207 ¤   ¤   ¤   ¤   PGPSize¤dataSize;
412b85 ¤   ¤   ¤   ¤
1f5b68 ¤   ¤   ¤   ¤   dsd->keyIDCount ¤   = inEvent->data.recipientsData.keyCount;
4f217a ¤   ¤   ¤   ¤   dataSize¤   ¤   ¤   = dsd->keyIDCount * sizeof( PGPKeyID );
cc2b85 ¤   ¤   ¤   ¤
4f9caf ¤   ¤   ¤   ¤   dsd->keyIDList = (PGPKeyID *) PGPNewData(
b836b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( inContext ),
7e7ab2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dataSize, 0 );
32be98 ¤   ¤   ¤   ¤   if( IsntNull( dsd->keyIDList ) )
a372c3 ¤   ¤   ¤   ¤   {
7bf56c ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( inEvent->data.recipientsData.keyIDArray,
11fb2f ¤   ¤   ¤   ¤   ¤   ¤   ¤   dsd->keyIDList, dataSize );
5c2613 ¤   ¤   ¤   ¤   }
44fa07 ¤   ¤   ¤   ¤   else
9772c3 ¤   ¤   ¤   ¤   {
455877 ¤   ¤   ¤   ¤   ¤   result = kPGPError_OutOfMemory;
a92613 ¤   ¤   ¤   ¤   }
43a3a6 ¤   ¤   ¤   }
2b0fe4 ¤   ¤   }
732f68 ¤   ¤   break;
fd9371 ¤   }
3d67c5 ¤
aa5d73 ¤   return result;
6defe6 }
30af5a
5eaf5a
72af5a
--c2ff 000d81e968c401200bd Page 10 of CReconstitutionDialog.cp
d3c744 ¤   PGPError
aab257 CReconstitutionDialog::SKEPEventHandler(
a34fcd ¤   PGPskepRef¤ ¤   skep,
3fc3ef ¤   PGPskepEvent *¤ inEvent,
448f16 ¤   PGPUserValue¤   inUserValue)
dcbb36 {
596bc1 #pragma unused(skep)
90af5a
1b3cbe ¤   PGPError¤   ¤   ¤   ¤   err = kPGPError_NoErr;
e0986e ¤   CReconstitutionDialog *¤dialog = (CReconstitutionDialog *) inUserValue;
8667c5 ¤
fd9ff9 ¤   if( dialog->mExitSKEP )
03c7a1 ¤   {
7c0fd8 ¤   ¤   err = kPGPError_UserAbort;
2a9371 ¤   }
670e24 ¤   else
5fc7a1 ¤   {
4beb68 ¤   ¤   switch (inEvent->type)
915b34 ¤   ¤   {
41f33a ¤   ¤   ¤   case kPGPskepEvent_ListenEvent:
5cf776 ¤   ¤   ¤   {
41dfb7 ¤   ¤   ¤   ¤   dialog->FindPaneByID(caption_Status)->SetDescriptor(
291114 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Reconstitution, kListenStringID));
e7a3a6 ¤   ¤   ¤   }
4bcdcb ¤   ¤   ¤   break;
db87c7 ¤   ¤   ¤
4b87c7 ¤   ¤   ¤
30e380 ¤   ¤   ¤   case kPGPskepEvent_ConnectEvent:
09f776 ¤   ¤   ¤   {
64dfb7 ¤   ¤   ¤   ¤   dialog->FindPaneByID(caption_Status)->SetDescriptor(
d48ac1 ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Reconstitution, kConnectStringID));
84a3a6 ¤   ¤   ¤   }
51cdcb ¤   ¤   ¤   break;
1187c7 ¤   ¤   ¤
1b87c7 ¤   ¤   ¤
b15703 ¤   ¤   ¤   case kPGPskepEvent_AuthenticateEvent:
13f776 ¤   ¤   ¤   {
34d63f ¤   ¤   ¤   ¤   Str255¤ ¤   userID;
4d1306 ¤   ¤   ¤   ¤   PGPSize¤¤   fullSize;
da2b85 ¤   ¤   ¤   ¤
1d8bda ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer(
e9047d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inEvent->data.ad.remoteKey,
0c0aee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(Str255) - 1,
f707bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (char *) &userID[1],
d32289 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fullSize);
0d5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
7072c3 ¤   ¤   ¤   ¤   {
7e44f3 ¤   ¤   ¤   ¤   ¤   PGPInt32¤   validity;
d1af5a
9d2a4f ¤   ¤   ¤   ¤   ¤   userID[0] = fullSize - 1;
b3caf1 ¤   ¤   ¤   ¤   ¤   dialog->FindPaneByID(caption_Authenticated)->
7542d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SetDescriptor(userID);
37d8c1 ¤   ¤   ¤   ¤   ¤   dialog->FindPaneByID(caption_Status)->SetDescriptor(
049957 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Reconstitution, kReceiveStringID));
ff531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
961794 ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyNumber( inEvent->data.ad.remoteKey,
6a3a6e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropValidity,
d2d6f6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &validity);
a5ca68 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) &&
42e753 ¤   ¤   ¤   ¤   ¤   ¤   validity != kPGPValidity_Complete )
d74859 ¤   ¤   ¤   ¤   ¤   {
915765 ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ isMarginalInvalid;
fc94aa ¤   ¤   ¤   ¤   ¤   ¤
a83957 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefBoolean( dialog->mPrefRef,
e06f5b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefMarginalIsInvalid,
81b8ab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &isMarginalInvalid);
1e12da ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) &&
8802b9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ( isMarginalInvalid ||
1283c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··validity != kPGPValidity_Marginal ) )
408fec ¤   ¤   ¤   ¤   ¤   ¤   {
e8c144 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPConfirmRemoteKeyDialog(
d865bb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString( STRx_Reconstitution,
--8fb6 000c1fcce61401200bd Page 11 of CReconstitutionDialog.cp
fdb938 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidKeyStringID),
95ba49 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inEvent->data.ad.remoteHostname,
88fd0f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inEvent->data.ad.remoteKey,
4db6ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inEvent->data.ad.tlsCipher, TRUE );
63db3c ¤   ¤   ¤   ¤   ¤   ¤   }
a31c89 ¤   ¤   ¤   ¤   ¤   }
c12613 ¤   ¤   ¤   ¤   }
cea3a6 ¤   ¤   ¤   }
02cdcb ¤   ¤   ¤   break;
1387c7 ¤   ¤   ¤
265824 ¤   ¤   ¤   case kPGPskepEvent_CloseEvent:
72f776 ¤   ¤   ¤   {
31dfb7 ¤   ¤   ¤   ¤   dialog->FindPaneByID(caption_Status)->SetDescriptor(
8971ae ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Reconstitution, kCloseStringID));
8ca3a6 ¤   ¤   ¤   }
59cdcb ¤   ¤   ¤   break;
2e87c7 ¤   ¤   ¤
14dfaf ¤   ¤   ¤   case kPGPskepEvent_ShareEvent:
4bf776 ¤   ¤   ¤   {
55409a ¤   ¤   ¤   ¤   Str255¤ userID;
86ae30 ¤   ¤   ¤   ¤   ¤
e876e8 ¤   ¤   ¤   ¤   dialog->FindPaneByID(caption_Authenticated)->
f6ae17 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetDescriptor(userID);
5d9f0a ¤   ¤   ¤   ¤   p2cstr(userID);
56e44f ¤   ¤   ¤   ¤   dialog->FindPaneByID(caption_Authenticated)->SetDescriptor("\p"¶
036275 );
1c4631 ¤   ¤   ¤   ¤   dialog->FindPaneByID(caption_Status)->SetDescriptor("\p");
c8af5a
5fd834 ¤   ¤   ¤   ¤   err = AddShares(dialog, (char *) userID, &inEvent->data.sd.shar¶
d1762f es );
80af5a
cdd1c4 ¤   ¤   ¤   ¤   if( PGPShareRefIsValid( inEvent->data.sd.shares ) )
ae72c3 ¤   ¤   ¤   ¤   {
f0d37c ¤   ¤   ¤   ¤   ¤   PGPFreeShares( inEvent->data.sd.shares );
872613 ¤   ¤   ¤   ¤   }
d3a3a6 ¤   ¤   ¤   }
3ecdcb ¤   ¤   ¤   break;
dc87c7 ¤   ¤   ¤
3737a2 ¤   ¤   ¤   case kPGPskepEvent_NullEvent:
45f776 ¤   ¤   ¤   {
4423e7 ¤   ¤   ¤   ¤   err = dialog->DoDialog();
36a3a6 ¤   ¤   ¤   }
11cdcb ¤   ¤   ¤   break;
220fe4 ¤   ¤   }
499371 ¤   }
0f67c5 ¤
ef5ea8 ¤   return err;
70efe6 }
6daf5a
0faf5a
39af5a
756d52 ¤   void
c6f250 CReconstitutionDialog::SpendTime(
c17f53 ¤   const EventRecord &¤inMacEvent)
d0bb36 {
ddcc1b #pragma unused(inMacEvent)
8eaf5a
639d73 ¤   if( mSKEPActive )
60c7a1 ¤   {
5fc208 ¤   ¤   // Force ModalDialog() to always exit if we're in the SKEP event
ecf7ca ¤   ¤   // handler.
711b52 ¤   ¤
36b2ca ¤   ¤   SetDismissMessage( msg_Yield );
4f9371 ¤   }
bd4264 ¤   else·
11c7a1 ¤   {
911515 ¤   ¤   SetDismissMessage( mDeferredDismissMessage );
d19371 ¤   }
66efe6 }
01af5a
9daf5a
c1af5a
--8ad3 000cc9e6be2401200bd Page 12 of CReconstitutionDialog.cp
3b6d52 ¤   void
3cf8e6 CReconstitutionDialog::ShowError(
a24f7a ¤   PGPError¤   inErr)
11bb36 {
23a5fc ¤   if (inErr != kPGPError_UserAbort) {
1ee672 ¤   ¤   CString¤¤   theErrorString;
d71b52 ¤   ¤
02c618 ¤   ¤   PGPGetClientErrorString(¤   inErr,
07ac45 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theErrorString.GetBufferSize() + 1,
d7de72 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theErrorString);
92aaad ¤   ¤   UpdatePort();
0abc15 ¤   ¤   PGPUIWarningAlert(¤ kWACautionAlertType,
cf597c ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
be7a10 ¤   ¤   ¤   ¤   ¤   ¤   STRx_Reconstitution,
7b9f81 ¤   ¤   ¤   ¤   ¤   ¤   kErrorStringID,
33e47c ¤   ¤   ¤   ¤   ¤   ¤   CString(inErr),
ddd94c ¤   ¤   ¤   ¤   ¤   ¤   theErrorString);
319371 ¤   }
37efe6 }
93af5a
3baf5a
f5af5a
0ec744 ¤   PGPError
047c34 CReconstitutionDialog::CheckForNonSplitPrivateKey(void)
adbb36 {
4d5caa ¤   PGPError¤   ¤   result;
d95445 ¤   PGPKeyListRef¤  keyList;
1720b3 ¤   PGPBoolean¤ ¤   foundKey = false;
2f67c5 ¤
5c2e12 ¤   foundKey = false;
199879 ¤   result = PGPOrderKeySet( mKeySet, kPGPAnyOrdering, &keyList );
76484b ¤   if( IsntPGPError( result ) )
6ec7a1 ¤   {
6a20b4 ¤   ¤   PGPKeyIterRef¤  keyIterator;
0d1b52 ¤   ¤
bdce86 ¤   ¤   result = PGPNewKeyIter( keyList, &keyIterator );
707523 ¤   ¤   if( IsntPGPError( result ) )
965b34 ¤   ¤   {
a43754 ¤   ¤   ¤   PGPKeyRef¤  theKey;
c787c7 ¤   ¤   ¤
cf0dec ¤   ¤   ¤   result = PGPKeyIterNext( keyIterator, &theKey );
601854 ¤   ¤   ¤   while( IsntPGPError( result ) )
8ff776 ¤   ¤   ¤   {
363f01 ¤   ¤   ¤   ¤   PGPBoolean¤ canSign;
e32b85 ¤   ¤   ¤   ¤
2c7a8c ¤   ¤   ¤   ¤   result = PGPGetKeyBoolean( theKey, kPGPKeyPropCanSign,
61e32a ¤   ¤   ¤   ¤   ¤   ¤   ¤   &canSign );
965ddd ¤   ¤   ¤   ¤   if( IsntPGPError( result ) && ( canSign ) )
5872c3 ¤   ¤   ¤   ¤   {
daf34f ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ isSecretShared;
a0ae30 ¤   ¤   ¤   ¤   ¤
ea4a4f ¤   ¤   ¤   ¤   ¤   result = PGPGetKeyBoolean( theKey,
6a0b68 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropIsSecretShared, &isSecretShared );
baec85 ¤   ¤   ¤   ¤   ¤   if ( IsntPGPError( result ) && ( !isSecretShared ) )
b44859 ¤   ¤   ¤   ¤   ¤   {
7c8d83 ¤   ¤   ¤   ¤   ¤   ¤   foundKey = true;
5b00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
781c89 ¤   ¤   ¤   ¤   ¤   }
2e2613 ¤   ¤   ¤   ¤   }
f22b85 ¤   ¤   ¤   ¤
a3d7c5 ¤   ¤   ¤   ¤   result = PGPKeyIterNext( keyIterator, &theKey );
81a3a6 ¤   ¤   ¤   }
1287c7 ¤   ¤   ¤
d69ad1 ¤   ¤   ¤   if( result == kPGPError_EndOfIteration )
54e2ad ¤   ¤   ¤   ¤   result = kPGPError_NoErr;
272b85 ¤   ¤   ¤   ¤
c93433 ¤   ¤   ¤   PGPFreeKeyIter( keyIterator );
380fe4 ¤   ¤   }
cc1b52 ¤   ¤
b06efb ¤   ¤   PGPFreeKeyList( keyList );
ce9371 ¤   }
cc67c5 ¤
--52f9 00146e14aa0401200bd Page 13 of CReconstitutionDialog.cp
2d36fd ¤   if (IsntPGPError( result ) && ( !foundKey ) )
30c7a1 ¤   {
a51673 ¤   ¤   result = kPGPClientError_UnsplitPrivateKeyNotFound;
3d9371 ¤   }
0a67c5 ¤
fc4c6e ¤   return( result );
46efe6 }
--161b 000f4596f6f401200be Page 1 of CReconstitutionDialog.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
893a3b ¤   $Id: CReconstitutionDialog.h,v 1.16.8.1 1998/11/12 03:07:15 heller Exp $
ecf7f7 ____________________________________________________________________________*/
3daf5a
ef8d55 #pragma once·
57af5a
810a93 #include <LPeriodical.h>
27af5a
0dfcb1 #include "CPGPModalGrafPortView.h"
bc8ac0 #include "CShareholderList.h"
3db869 #include "pgpSKEP.h"
a8c97b #include "pgpClientPrefs.h"
0aaf5a
02af5a
51af5a
7f04db class CReconstitutionDialog :¤  public CPGPModalGrafPortView,
283102 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LPeriodical {
605ed4 public:
47c90d ¤   enum¤   ¤   ¤   ¤   ¤   { class_ID = 'RstD' };
2baf5a
f198b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CReconstitutionDialog(LStream * inStream);
17fa0c ¤   virtual¤¤   ¤   ¤   ¤   ~CReconstitutionDialog();
7baf5a
b2bca7 ¤   virtual void¤   ¤   ¤   FinishCreateSelf(void);
d709e3 ¤   virtual MessageT¤   ¤   HandleMessage(MessageT theMessage);
9e11c4 ¤   virtual void¤   ¤   ¤   SpendTime(const EventRecord & inMacEvent);
e367c5 ¤
e09836 ¤   PGPError¤   ¤   ¤   ¤   SetInfo(PGPKeyRef inKeyToCollect,
a6c775 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef inKeySet,
d527fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef inTLSContext,
ae0ad6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPByte ** outPassKey,
e1c2b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize * outPassKeySize);
e9531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
a89e8c ¤   virtual void¤   ¤   ¤   ListenToMessage(MessageT inMessage,
3b1b5e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *ioParam);
3baf5a
5aa2d3 protected:
4e5fbb ¤   PGPKeyRef¤  ¤   ¤   ¤   mKeyToCollect;
4f7d20 ¤   PGPKeySetRef¤   ¤   ¤   mKeySet;
b10996 ¤   PGPtlsContextRef¤   ¤   mTLSContext;
f6118b ¤   PGPByte **¤ ¤   ¤   ¤   mPassKey;
4987b9 ¤   PGPSize *¤  ¤   ¤   ¤   mPassKeySize;
778fda ¤   PGPPrefRef¤ ¤   ¤   ¤   mPrefRef;
ff8775 ¤   CShareholderList *¤ ¤   mShareholderList;
e5d2fa ¤   PGPContextRef¤  ¤   ¤   mContext;
f8d00a ¤   PGPKeyID¤   ¤   ¤   ¤   mKeyToCollectKeyID;
6ca37c ¤   PGPShareRef¤¤   ¤   ¤   mShares;
90d09e ¤   PGPPublicKeyAlgorithm¤  mAlgorithm;
df259d ¤   PGPInt32¤   ¤   ¤   ¤   mSharesCollected;
375457 ¤   PGPInt32¤   ¤   ¤   ¤   mSharesNeeded;
5c05e1 ¤   PGPBoolean¤ ¤   ¤   ¤   mExitSKEP;
90e18d ¤   PGPBoolean¤ ¤   ¤   ¤   mSKEPActive;
6e3893 ¤   PGPKeyRef¤  ¤   ¤   ¤   mSKEPKey;
54bc98 ¤   char *¤ ¤   ¤   ¤   ¤   mSKEPPassphrase;
4597ba ¤   MessageT¤   ¤   ¤   ¤   mDeferredDismissMessage;
0367c5 ¤
dae9b3 ¤   PGPError¤   ¤   ¤   ¤   CollectFileShares(void);
0b7923 ¤   PGPError¤   ¤   ¤   ¤   CollectNetworkShares(void);
384104 ¤   static PGPError¤¤   ¤   AddShares(CReconstitutionDialog * inDialog,
25da23 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   char * inUserID, PGPShareRef * inShares);
14da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
7995a3 ¤   PGPError¤   ¤   ¤   ¤   CheckForNonSplitPrivateKey(void);
df67c5 ¤
d31afb ¤   void¤   ¤   ¤   ¤   ¤   ShowError(PGPError inErr);
fcaf5a
4d85f7 ¤   static PGPError¤¤   ¤   SKEPEventHandler(PGPskepRef inSKEP,
f4395a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPskepEvent * inEvent,
--e4f2 0012a148d21401200be Page 2 of CReconstitutionDialog.h
cfd153 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue inUserValue);
4d3a3d ¤   static PGPError¤¤   ¤   DecryptSharesHandler(PGPContextRef inContext,
ab88d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent * inEvent,
3868c9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void * inUserValue);
2abf26 };¶
--d775 001802f42c2401200bf Page 1 of CServerStatusDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
96dd39 ¤   $Id: CServerStatusDialog.cp,v 1.4.8.1 1998/11/12 03:07:16 heller Exp $
5ef7f7 ____________________________________________________________________________*/
3caf5a
d17e6d #include <UDrawingState.h>
fedd56 #include <PP_Messages.h>
efaf5a
5c99b9 #include "CServerStatusDialog.h"
45af5a
30af5a
f1bf23 const PaneIDT¤  caption_Server¤ = 1000;
0011cb const PaneIDT¤  caption_Status¤ = 1001;
e0af5a
0aaf5a
21415f CServerStatusDialog::CServerStatusDialog(
cbcbb0 ¤   LStream *¤  inStream)
896045 ¤   ¤   : CClientKSGrafPortView(inStream)
debb36 {
86efe6 }
a8af5a
017f84 CServerStatusDialog::~CServerStatusDialog()
36bb36 {
d0efe6 }
d5af5a
506d52 ¤   void
73b34f CServerStatusDialog::SetServerCaption(
e88742 ¤   ConstStringPtr¤ inServer)
61bb36 {
a61d8e ¤   StColorPortState¤   theSavedPort(UQDGlobals::GetCurrentPort());
c167c5 ¤
ace8b9 ¤   OutOfFocus(nil);
30cf23 ¤   FindPaneByID(caption_Server)->SetDescriptor(inServer);
7aefe6 }
40af5a
fb6d52 ¤   void
06108c CServerStatusDialog::SetStatusCaption(
0a6c66 ¤   ConstStringPtr¤ inStatus)
12bb36 {
041d8e ¤   StColorPortState¤   theSavedPort(UQDGlobals::GetCurrentPort());
3567c5 ¤
d5e8b9 ¤   OutOfFocus(nil);
d37d52 ¤   FindPaneByID(caption_Status)->SetDescriptor(inStatus);
aaefe6 }
73af5a
f8a30d CClientKSGrafPortView::CClientKSGrafPortView(LStream *inStream)
d3a3c8 ¤   : CPGPModalGrafPortView(inStream)
67bb36 {
1cefe6 }
d9af5a
c61e70 CClientKSGrafPortView::~CClientKSGrafPortView()
cebb36 {
56efe6 }
37af5a
a06d52 ¤   void
f3735b CClientKSGrafPortView::DoIdle(const EventRecord &inMacEvent)
35bb36 {
1664da ¤   (void) inMacEvent;
d767c5 ¤
bba95e ¤   // Force ModalDialog to exit.
a3b8e4 ¤   SetDismissMessage( msg_OK );
4aefe6 }
80af5a
--bbc7 001e44df3e2401200c0 Page 1 of CServerStatusDialog.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
57e37d ¤   $Id: CServerStatusDialog.h,v 1.4.8.1 1998/11/12 03:07:17 heller Exp $
94f7f7 ____________________________________________________________________________*/
c1af5a
3f8d55 #pragma once·
d2af5a
580a93 #include <LPeriodical.h>
a8fcb1 #include "CPGPModalGrafPortView.h"
3daf5a
c6af5a
ff161a class CClientKSGrafPortView : public CPGPModalGrafPortView
21bb36 {
d15ed4 public:
3496aa ¤   enum¤   ¤   ¤   ¤   ¤   { class_ID = 'KGRP' };
59af5a
3ddd2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   CClientKSGrafPortView(LStream *inStream);
e905a3 ¤   virtual¤¤   ¤   ¤   ¤   ~CClientKSGrafPortView();
a89e17 ¤   virtual void¤   ¤   ¤   DoIdle(const EventRecord &inMacEvent);
1e82f7 };
82af5a
f37238 class CServerStatusDialog : public CClientKSGrafPortView
d6bb36 {
d35ed4 public:
bb8abc ¤   enum¤   ¤   ¤   ¤   { class_ID = 'StsD' };
9a67c5 ¤
e15846 ¤   ¤   ¤   ¤   ¤   ¤   CServerStatusDialog(LStream * inStream);
b1a0a7 ¤   virtual¤¤   ¤   ¤   ~CServerStatusDialog();
7e67c5 ¤
fa834d ¤   void¤   ¤   ¤   ¤   SetServerCaption(ConstStringPtr inServer);
6ece65 ¤   void¤   ¤   ¤   ¤   SetStatusCaption(ConstStringPtr inStatus);
7567c5 ¤
caa2d3 protected:
4382f7 };
e4af5a
--5a32 00032a95151401200c1 Page 1 of CWhiteList.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
25cae0 ¤   $Id: CWhiteList.cp,v 1.1.8.1 1998/11/12 03:07:17 heller Exp $
63f7f7 ____________________________________________________________________________*/
0f8f92 #include <UGAColorRamp.h>
ad7c52 #include <LTableMonoGeometry.h>
8e2ab7 #include <LTableSingleSelector.h>
f67b38 #include <LTableArrayStorage.h>
3faf5a
b50d28 #include "CWhiteList.h"
e3af5a
1daf5a
d29ff9 CWhiteList*
749212 CWhiteList::CreateFromStream(
a86689 ¤   LStream¤*inStream)
66bb36 {
134450 ¤   return (new CWhiteList(inStream));
24efe6 }
3eaf5a
4aaf5a
4d228d CWhiteList::CWhiteList(
b56689 ¤   LStream¤*inStream)
71ba7e ¤   ¤   : LTableView(inStream)
adbb36 {
d8a98a ¤   mTableGeometry = new LTableMonoGeometry(this, mFrameSize.width, 12);
aaf97f ¤   mTableSelector = new LTableSingleSelector(this);
a5169a ¤   mTableStorage = new LTableArrayStorage(this, sizeof(Str31));
39efe6 }
dbaf5a
026d52 ¤   void
0fe39a CWhiteList::DrawSelf()
cebb36 {
27d8a7 ¤   Rect frame;
45af5a
2d40bf ¤   CalcLocalFrameRect(frame);
d7ccbb ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
4b82a2 ¤   ::EraseRect(&frame);
c1de04 ¤   LTableView::DrawSelf();
caefe6 }
97af5a
c76d52 ¤   void
5a532c CWhiteList::DeactivateSelf()
babb36 {
b83895 ¤   Draw( NULL );
05af5a
522ee1 ¤   pgpFixBeforeShip( "This is a workaround for an LTabsControl bug. Is there a¶
297c65 ·fix?" );
c5b4b3 ¤   LTableView::DeactivateSelf();
8cefe6 }
42af5a
fc6d52 ¤   void
899c50 CWhiteList::ActivateSelf()
a6bb36 {
80d368 ¤   LTableView::ActivateSelf();
30af5a
6b2ee1 ¤   pgpFixBeforeShip( "This is a workaround for an LTabsControl bug. Is there a¶
a67c65 ·fix?" );
954fc9 ¤   Refresh();
e7efe6 }
6baf5a
386d52 ¤   void
fa96fd CWhiteList::DrawCell(
9e1bb3 ¤   const STableCell¤   &inCell,
3dc050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
93bb36 {
3cedac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(Str31);
8c6a47 ¤   Str31¤  ¤   ¤   name;
3267c5 ¤
--0a82 001c77e59fc401200c1 Page 2 of CWhiteList.cp
054b22 ¤   GetCellData(inCell, name, dataSize);
70a617 ¤   ::ForeColor(blackColor);
f661a9 ¤   ::BackColor(whiteColor);
dc354b ¤   ::TextSize(9);
dadc8a ¤   ::TextFont(1);
2198e8 ¤   ::TextFace(0);
7129ea ¤   ::MoveTo(inLocalRect.left + 4, inLocalRect.bottom - 2);
889b75 ¤   ::DrawString(name);
b9efe6 }
a3af5a
8e6d52 ¤   void
b54680 CWhiteList::ClickCell(
e1df40 ¤   const STableCell&¤  ¤   inCell,
82067a ¤   const SMouseDownEvent&¤ inMouseDown)
f9bb36 {
fa5be1 ¤   (void) inMouseDown;
dc67c5 ¤
f516d5 ¤   if(GetClickCount() == 2)
31f9ec ¤   ¤   BroadcastMessage(kWLCellDoubleClickedMessageID,
ab347d ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void *)inCell.row);
7cefe6 }
d7af5a
e36d52 ¤   void
197556 CWhiteList::SelectionChanged()
efbb36 {
54c244 ¤   BroadcastMessage(kWLSelectionChangedMessageID, NULL);
a9efe6 }
c7af5a
--cabf 0015efcdc06401200c2 Page 1 of CWhiteList.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
5d24c8 ¤   $Id: CWhiteList.h,v 1.1.8.1 1998/11/12 03:07:18 heller Exp $
90f7f7 ____________________________________________________________________________*/
ce7b7d #pragma once
8baf5a
74a787 #include <LTableView.h>
83ea2f #include <LBroadcaster.h>
12af5a
b46910 const MessageT¤ kWLCellDoubleClickedMessageID¤  = 'cdWL';
08ee34 const MessageT¤ kWLSelectionChangedMessageID¤   = 'scWL';
27af5a
33af5a
31ff51 class CWhiteList¤   :¤  public LTableView,
0ed72c ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster
6bbb36 {
625ed4 public:
fd0dd3 ¤   enum { class_ID = 'whTV' };
e00fdf ¤   static CWhiteList*¤ CreateFromStream(LStream *inStream);
ad67c5 ¤
67ef60 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CWhiteList(LStream *inStream);
67700d ¤   void¤   ¤   ¤   ¤   ¤   DrawCell(
7d6d8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &inCell,
778e01 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect¤ ¤   ¤   &inLocalRect);
ccb1e9 ¤   void¤   ¤   ¤   ¤   ¤   ClickCell(
8b0285 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell&¤  ¤   inCell,
f44c4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent&¤ inMouseDown);
9dcb1e ¤   void¤   ¤   ¤   ¤   ¤   SelectionChanged();
e567c5 ¤
19a2d3 protected:
91af5a
b96cc0 ¤   virtual void¤   ¤   ¤   ActivateSelf();
bc98f0 ¤   virtual void¤   ¤   ¤   DeactivateSelf();
147cf0 ¤   virtual void¤   ¤   ¤   DrawSelf();
e6af5a
2282f7 };
5eaf5a
--88ba 000d41ea6d0401200c3 Page 1 of PGPKeyServerDialogs.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
189d0b ¤   $Id: PGPKeyServerDialogs.cp,v 1.27.8.1 1998/11/12 03:07:18 heller Exp $
58f7f7 ____________________________________________________________________________*/
25af5a
404d37 #include <LowMem.h>
f931f3 #include <OpenTptInternet.h>
f3324c #include <string.h>
f2af5a
65dd56 #include <PP_Messages.h>
2a4b3b #include <UEnvironment.h>
c3af5a
ee99b9 #include "CServerStatusDialog.h"
c8b6e8 #include "PGPclientLib.h"
f3076e #include "PGPclientLibUtils.h"
54bf61 #include "PGPclientLibDialogs.h"
fd3a2c #include "WarningAlert.h"
b285c2 #include "MacStrings.h"
f6af5a
130d08 #include "pgpMem.h"
32b397 #include "PGPOpenPrefs.h"
acc97b #include "pgpClientPrefs.h"
28c2ae #include "pgpGroups.h"
c0eb5b #include "pgpKeyServer.h"
a8ed82 #include "pgpKeyServerPrefs.h"
252f8d #include "pgpErrors.h"
bcaf5a
f0a076 #include "pgpKeys.h"
5daf5a
e29812 const ResIDT¤   kPGPServerStatusDialogID¤   ¤   = 4757;
2053b2 const PGPInt16¤ kMaxUserIDLength¤   ¤   ¤   ¤   = 256;
e11fe8 const ResIDT¤   kKSStringListID¤¤   ¤   ¤   ¤   = 8945;
008385 enum¤   {¤
df7882 ¤   ¤   ¤   kKSAuthenticatePhraseStringID¤  ·¤  = 8
05a105 ¤   ¤   };
e6af5a
0340fe typedef struct KSCallbackInfo
ecbb36 {
39a130 ¤   CServerStatusDialog¤*dialog;
392439 ¤   PGPUInt32¤  ¤   ¤   lastState;
c966d7 ¤   ModalFilterUPP¤ ¤   filterUPP;
5a7420 ¤   Boolean¤¤   ¤   ¤   cancelled; /* KS lib not very good at reporting this */
f060b5 ¤   Boolean¤¤   ¤   ¤   dialogVisible;
9a58a1 ¤   UInt32¤ ¤   ¤   ¤   displayTicks;
5f661a ¤   DialogRef¤  ¤   ¤   dialogRef;
1ee658 ¤   PGPKeySetRef¤   ¤   allKeys;
3667c5 ¤
1bd94e } KSCallbackInfo;
c9af5a
380502 static PGPError KSCallback(¤PGPContextRef¤  context,
6d8a5c ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent¤   ¤   *event,
513c1c ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue¤   userValue);
7aaf5a
08c744 ¤   PGPError
23eb23 KSCallback(
3a520e ¤   PGPContextRef¤  context,
9e6fdc ¤   PGPEvent¤   ¤   *event,
824c20 ¤   PGPUserValue¤   userValue)
0abb36 {
393bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
7c8858 ¤   KSCallbackInfo¤ *callbackInfo;
4280f1 ¤   SInt16¤ ¤   ¤   saveWindowKind;
03e011 ¤   Str255¤ ¤   ¤   caption;
ee0e87 ¤   char¤   ¤   ¤   cstr[256];
de67c5 ¤
83d184 ¤   callbackInfo = (KSCallbackInfo *)userValue;
a567c5 ¤
d4d8af ¤   /*
--ded1 000963a0e89401200c3 Page 2 of PGPKeyServerDialogs.cp
7f7cea ¤   ** If the window kind is not a dialog, set it to dialogKind
91de0f ¤   ** during the callback
029faa ¤   */
3267c5 ¤
bca3e3 ¤   saveWindowKind = GetWindowKind( callbackInfo->dialogRef );
f6a4ec ¤   if( saveWindowKind != kDialogWindowKind )
21f9dd ¤   ¤   SetWindowKind( callbackInfo->dialogRef, kDialogWindowKind );
861b52 ¤   ¤
6d4e74 ¤   if( ! callbackInfo->dialogVisible )
aac7a1 ¤   {
3fdf8c ¤   ¤   if( TickCount() >= callbackInfo->displayTicks )
a45b34 ¤   ¤   {
812dae ¤   ¤   ¤   SetPort( callbackInfo->dialogRef );
6de2b0 ¤   ¤   ¤   ShowWindow( callbackInfo->dialogRef );
45f407 ¤   ¤   ¤   SelectWindow( callbackInfo->dialogRef );
9f748b ¤   ¤   ¤   UpdateDialog( callbackInfo->dialogRef,
3034f2 ¤   ¤   ¤   ¤   ¤   callbackInfo->dialogRef->visRgn );
7687c7 ¤   ¤   ¤
9387bc ¤   ¤   ¤   callbackInfo->dialogVisible = TRUE;
200fe4 ¤   ¤   }
0d9371 ¤   }
c267c5 ¤
0d7708 ¤   if( callbackInfo->dialogVisible )
4ac7a1 ¤   {
3158b2 ¤   ¤   MessageT¤   dismissMessage;
6d5a70 ¤   ¤   short¤  ¤   itemHit;
f6af5a
08019a ¤   ¤   ModalDialog( callbackInfo->filterUPP, &itemHit );
fcce78 ¤   ¤   dismissMessage = callbackInfo->dialog->GetDismissMessage();
9849d6 ¤   ¤   if( dismissMessage == msg_Cancel )
915b34 ¤   ¤   {
077862 ¤   ¤   ¤   callbackInfo->cancelled = TRUE;
ab4e2b ¤   ¤   ¤   err = kPGPError_UserAbort;
df0fe4 ¤   ¤   }
d89371 ¤   }
8a67c5 ¤
39b1f0 ¤   if( IsntPGPError( err ) )
4d2c51 ¤   ¤   switch( event->type )
a55b34 ¤   ¤   {
6f4f73 ¤   ¤   ¤   case kPGPEvent_KeyServerIdleEvent:
19f622 ¤   ¤   ¤   ¤   break;
3df078 ¤   ¤   ¤   case kPGPEvent_KeyServerEvent:
9a5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
0872c3 ¤   ¤   ¤   ¤   {
590fea ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   caption;
7eae30 ¤   ¤   ¤   ¤   ¤
4d7aed ¤   ¤   ¤   ¤   ¤   if( callbackInfo->lastState !=
a7de5b ¤   ¤   ¤   ¤   ¤   ¤   ¤   event->data.keyServerData.state )
814859 ¤   ¤   ¤   ¤   ¤   {
1e6fad ¤   ¤   ¤   ¤   ¤   ¤   GetIndString(caption, kKSStringListID,
665be8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   event->data.keyServerData.state);
c02180 ¤   ¤   ¤   ¤   ¤   ¤   callbackInfo->dialog->SetStatusCaption(caption);
cc821d ¤   ¤   ¤   ¤   ¤   ¤   callbackInfo->lastState =
c2f4f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   event->data.keyServerData.state;
8c1c89 ¤   ¤   ¤   ¤   ¤   }
882613 ¤   ¤   ¤   ¤   }
a1f622 ¤   ¤   ¤   ¤   break;
7dd28d ¤   ¤   ¤   case kPGPEvent_KeyServerSignEvent:
67f776 ¤   ¤   ¤   {
8a734b ¤   ¤   ¤   ¤   PGPKeyRef¤  ¤   authKey = kInvalidPGPKeyRef;
45c6b6 ¤   ¤   ¤   ¤   char¤   ¤   ¤   *passphrase = NULL;
c72b85 ¤   ¤   ¤   ¤
58c933 ¤   ¤   ¤   ¤   GetIndString( caption, kKSStringListID,
86d004 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKSAuthenticatePhraseStringID );
c90779 ¤   ¤   ¤   ¤   PToCString( caption, cstr );
af9e14 ¤   ¤   ¤   ¤   err = PGPSigningPassphraseDialog( context,
c6fe9c ¤   ¤   ¤   ¤   ¤   ¤   ¤   callbackInfo->allKeys,
8d128e ¤   ¤   ¤   ¤   ¤   ¤   ¤   &authKey,
a6520b ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt( context, cstr ),
a80709 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( context, &passphrase ),
f7fc28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
96208d ¤   ¤   ¤   ¤   if( IsntPGPError( err ) && IsntNull( passphrase ) )
--d29c 000d6048773401200c3 Page 3 of PGPKeyServerDialogs.cp
d072c3 ¤   ¤   ¤   ¤   {
05f2f9 ¤   ¤   ¤   ¤   ¤   err = PGPAddJobOptions( event->job,
e6890c ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOSignWithKey( context, authKey,
38b169 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphraseBuffer( context, passphrase,
669f8b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   strlen( passphrase ) ),
240204 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) ),
1edbe3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOClearSign( context, TRUE ),
80fc28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
8c1f41 ¤   ¤   ¤   ¤   ¤   PGPFreeData( passphrase );
c02613 ¤   ¤   ¤   ¤   }
caf622 ¤   ¤   ¤   ¤   break;
44a3a6 ¤   ¤   ¤   }
693633 ¤   ¤   ¤   case kPGPEvent_KeyServerTLSEvent:
68765f ¤   ¤   ¤   ¤   // use authentication confirmation dialog
2df622 ¤   ¤   ¤   ¤   break;
f00fe4 ¤   ¤   }
df87dd ¤   SetWindowKind( callbackInfo->dialogRef, kApplicationWindowKind );
a967c5 ¤
8e5ea8 ¤   return err;
3cefe6 }
b7af5a
5766dd ¤   static PGPError
d8b657 MyPGPQueryKeyServer(
42f988 ¤   PGPKeyServerRef ¤   ¤   keyServer,·
f56552 ¤   PGPFilterRef ¤  ¤   ¤   filter,·
df7093 ¤   PGPKeySetRef ¤  ¤   ¤   *resultSet )
e3bb36 {
3061e0 ¤   PGPError¤   err;
4d66e2 ¤   WindowRef¤  frontWindow;
0aced0 ¤   SInt16¤ ¤   saveWindowKind;
8967c5 ¤
49d8af ¤   /*
947841 ¤   **¤ OT/PPP has a bug which will cause any dialog in the foreground
280eb2 ¤   **¤ to be disposed within OT/PPP if the user cancels the connection.
778476 ¤   **¤ Our fix is to whack the windowKind of the foreground window if
c2605f ¤   **¤ it is dialogKind.
209faa ¤   */
f8af5a
2c0847 ¤   frontWindow = LMGetWindowList();
4694c7 ¤   if( IsntNull( frontWindow ) )
a5c7a1 ¤   {
fb086e ¤   ¤   saveWindowKind = GetWindowKind( frontWindow );
c66ec0 ¤   ¤   if( saveWindowKind == kDialogWindowKind )
262900 ¤   ¤   ¤   SetWindowKind( frontWindow, kApplicationWindowKind );
349371 ¤   }
8867c5 ¤
2973be ¤   err = PGPQueryKeyServer( keyServer, filter,
1b4ac0 ¤   ¤   ¤   ¤   resultSet );
0c2b85 ¤   ¤   ¤   ¤
9e94c7 ¤   if( IsntNull( frontWindow ) )
bfc7a1 ¤   {
b7bf4b ¤   ¤   SetWindowKind( frontWindow, saveWindowKind );
f59371 ¤   }
dc67c5 ¤
28deb7 ¤   return( err );
c8efe6 }
5caf5a
7e66dd ¤   static PGPError
33d95e QueryServer(
b49a06 ¤   PGPContextRef¤  ¤   ¤   context,
a75175 ¤   PGPtlsContextRef¤   ¤   tlsContext,
b44350 ¤   PGPPrefRef¤ ¤   ¤   ¤   clientPrefsRef,
80a702 ¤   const PGPKeyID¤ ¤   ¤   *keyID,
d1a06e ¤   PGPKeyRef¤  ¤   ¤   ¤   keyRef,
4bda24 ¤   const char¤ ¤   ¤   ¤   *domain,
348a85 ¤   PGPKeySetRef¤   ¤   ¤   *resultSet)
43bb36 {
2f9479 ¤   PGPError¤   ¤   ¤   ¤   err¤= kPGPError_NoErr;
6665e4 ¤   PGPKeyServerEntry¤  ¤   *ksEntries = NULL;
3fe8c7 ¤   PGPUInt32¤  ¤   ¤   ¤   numKSEntries;
b867c5 ¤
d682ad ¤   PGPValidatePtr( resultSet );
--ec3c 000dd489bbd401200c3 Page 4 of PGPKeyServerDialogs.cp
214dac ¤   PGPValidatePtr( context );
94d819 ¤   PGPValidatePtr( domain );
cd67c5 ¤
ccb407 ¤   *resultSet = kInvalidPGPKeySetRef;
7267c5 ¤
e693c6 ¤   err = PGPCreateKeyServerPath( clientPrefsRef, domain,
850af2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &ksEntries, &numKSEntries);
0e81b7 ¤   if( IsntPGPError( err ) && IsntNull(ksEntries) && numKSEntries > 0)
f1c7a1 ¤   {
c0ee34 ¤   ¤   PGPKeyServerSpec¤   *serverList;
221b52 ¤   ¤
1e2deb ¤   ¤   serverList = (PGPKeyServerSpec *) PGPNewData(
bd80d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( context ),
304b4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   numKSEntries * sizeof( *serverList ),
97915c ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMemoryMgrFlags_Clear );
2098b3 ¤   ¤   if( IsntNull( serverList ) )
b75b34 ¤   ¤   {
8ebd69 ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   serverIndex;
b587c7 ¤   ¤   ¤
43bb5e ¤   ¤   ¤   for( serverIndex = 0; serverIndex < numKSEntries; serverIndex++ )
f0f776 ¤   ¤   ¤   {
1ca2c6 ¤   ¤   ¤   ¤   err = PGPNewKeyServerFromHostName( context,
a17258 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].serverDNS,
3be906 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].serverPort,
933b9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].protocol,
cce59f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyServerAccessType_Normal,
4541a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyServerKeySpace_Normal,
da207e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &serverList[serverIndex].server );
a29c8a ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
7d14c3 ¤   ¤   ¤   ¤   ¤   break;
482b85 ¤   ¤   ¤   ¤
4aaa31 ¤   ¤   ¤   ¤   serverList[serverIndex].serverName =
0ff74d ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].serverDNS;
63a3a6 ¤   ¤   ¤   }
5987c7 ¤   ¤   ¤
a0698b ¤   ¤   ¤   if( IsntPGPError( err ) )
1af776 ¤   ¤   ¤   {
306e31 ¤   ¤   ¤   ¤   PGPOptionListRef¤   searchObject;
c0af5a
7248a1 ¤   ¤   ¤   ¤   if( IsntNull( keyID ) )
6572c3 ¤   ¤   ¤   ¤   {
3387be ¤   ¤   ¤   ¤   ¤   pgpAssert( ! PGPKeyRefIsValid( keyRef ) );
cfae30 ¤   ¤   ¤   ¤   ¤
e39230 ¤   ¤   ¤   ¤   ¤   searchObject = PGPOUIKeyServerSearchKeyIDList( context,
a5f70a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   1, keyID );
2a2613 ¤   ¤   ¤   ¤   }
1dfa07 ¤   ¤   ¤   ¤   else
a772c3 ¤   ¤   ¤   ¤   {
58ff22 ¤   ¤   ¤   ¤   ¤   pgpAssert( IsNull( keyID ) );
36ae30 ¤   ¤   ¤   ¤   ¤
dc7e8f ¤   ¤   ¤   ¤   ¤   searchObject = PGPOUIKeyServerSearchKey( context, keyRef );
b72613 ¤   ¤   ¤   ¤   }
642b85 ¤   ¤   ¤   ¤
1a1cfb ¤   ¤   ¤   ¤   err = PGPSearchKeyServerDialog( context, numKSEntries,
bc5aa2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   serverList, tlsContext, FALSE, resultSet,
d51aa0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   searchObject, PGPOLastOption( context ) );
d5a3a6 ¤   ¤   ¤   }
74af5a
babb5e ¤   ¤   ¤   for( serverIndex = 0; serverIndex < numKSEntries; serverIndex++ )
eef776 ¤   ¤   ¤   {
9acfb8 ¤   ¤   ¤   ¤   if( PGPKeyServerRefIsValid( serverList[serverIndex].server ) )
21bc15 ¤   ¤   ¤   ¤   ¤   PGPFreeKeyServer( serverList[serverIndex].server );
c3a3a6 ¤   ¤   ¤   }
e6af5a
f772ae ¤   ¤   ¤   PGPFreeData( serverList );
2a0fe4 ¤   ¤   }
41f828 ¤   }¤
3aaf5a
be49cf ¤   if( IsntNull( ksEntries ) )
b7cbab ¤   ¤   PGPDisposeKeyServerPath( ksEntries );
7d67c5 ¤
dd5ea8 ¤   return err;
--cec4 00038f2c196401200c3 Page 5 of PGPKeyServerDialogs.cp
7aefe6 }
46af5a
5266dd ¤   static PGPError
509ce0 pgpGetKeyFromServer(
10a1bc ¤   PGPContextRef¤  ¤   context,
2a6c35 ¤   PGPtlsContextRef¤   tlsContext,
f6299f ¤   PGPPrefRef¤ ¤   ¤   clientPrefsRef,
d76625 ¤   PGPKeyID const *¤   keyID,
6cfb7a ¤   PGPKeyRef¤  ¤   ¤   key,
b6427e ¤   PGPKeySetRef¤   ¤   *resultSet)
6dbb36 {
4e26d5 ¤   PGPError¤   err¤= kPGPError_NoErr;
5b67c5 ¤
4682f1 ¤   if( ! CFM_AddressIsResolved_( PGPKeyServerInit ) )
05b21f ¤   ¤   return( kPGPError_FeatureNotAvailable );
3667c5 ¤
e719d4 ¤   err = PGPKeyServerInit();
e5b1f0 ¤   if( IsntPGPError( err ) )
82c7a1 ¤   {
465b34 ¤   ¤   {
dcbbf6 ¤   ¤   ¤   StPGPPreserveKeyServerStorage¤  keyserverStorage;
cf82d5 ¤   ¤   ¤   char¤   ¤   ¤   ¤   ¤   ¤   ¤   domainStr[kMaxUserIDLength];
c5af5a
8e4f2f ¤   ¤   ¤   domainStr[0] = '\0';
0387c7 ¤   ¤   ¤
adfc6c ¤   ¤   ¤   if( IsntNull( key ) )
d8f776 ¤   ¤   ¤   {
48ed66 ¤   ¤   ¤   ¤   char¤   userID[kMaxUserIDLength];
4d5656 ¤   ¤   ¤   ¤   PGPSize¤len;
a22b85 ¤   ¤   ¤   ¤
57f7b7 ¤   ¤   ¤   ¤   // If we know the domain, let's see if we have a keyserver
655513 ¤   ¤   ¤   ¤   // for that domain
152b85 ¤   ¤   ¤   ¤
0b44ea ¤   ¤   ¤   ¤   len = kMaxUserIDLength;
38d65b ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer(key, sizeof( userID ),
a3ac15 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   userID, &len);
e3499b ¤   ¤   ¤   ¤   PGPFindEmailDomain( userID, domainStr );
82a3a6 ¤   ¤   ¤   }
2787c7 ¤   ¤   ¤
05698b ¤   ¤   ¤   if( IsntPGPError( err ) )
6cf776 ¤   ¤   ¤   {
2b4b2a ¤   ¤   ¤   ¤   err = QueryServer( context, tlsContext, clientPrefsRef, keyID,
c86680 ¤   ¤   ¤   ¤   ¤   ¤   ¤   key, domainStr, resultSet );
d2a3a6 ¤   ¤   ¤   }
3e0fe4 ¤   ¤   }
1e1b52 ¤   ¤
66d582 ¤   ¤   PGPKeyServerCleanup();
1f9371 ¤   }
4267c5 ¤
2f5ea8 ¤   return err;
8befe6 }
64af5a
c9c744 ¤   PGPError
878a7f PGPGetKeyFromServer(
45a1bc ¤   PGPContextRef¤  ¤   context,
df6c35 ¤   PGPtlsContextRef¤   tlsContext,
6d379a ¤   PGPKeyRef¤  ¤   ¤   key,¤   ¤   /* if not-NULL, used for domain info */
96427e ¤   PGPKeySetRef¤   ¤   *resultSet)
23bb36 {
cb9a69 ¤   PGPclientLibState¤  state;
92fb19 ¤   PGPError¤   ¤   err;
0067c5 ¤
d6b407 ¤   *resultSet = kInvalidPGPKeySetRef;
0767c5 ¤
e8e5fd ¤   err = EnterPGPclientLib( context, &state );
48b1f0 ¤   if( IsntPGPError( err ) )
e9c7a1 ¤   {
5a2e48 ¤   ¤   err = pgpGetKeyFromServer( context, tlsContext,
02d91f ¤   ¤   ¤   ¤   ¤   state.clientPrefsRef, NULL, key, resultSet );
279371 ¤   }
cb67c5 ¤
385df5 ¤   ExitPGPclientLib( &state );
--5a13 000845ae0e1401200c3 Page 6 of PGPKeyServerDialogs.cp
2a67c5 ¤
265ea8 ¤   return err;
68efe6 }
00af5a
dcc744 ¤   PGPError
6fe4ae PGPGetKeyIDFromServer(
fba1bc ¤   PGPContextRef¤  ¤   context,
b06c35 ¤   PGPtlsContextRef¤   tlsContext,
ac70df ¤   PGPKeyID const¤ ¤   *keyID,
e0427e ¤   PGPKeySetRef¤   ¤   *resultSet)
57bb36 {
e59a69 ¤   PGPclientLibState¤  state;
9afb19 ¤   PGPError¤   ¤   err;
3367c5 ¤
dab407 ¤   *resultSet = kInvalidPGPKeySetRef;
bf67c5 ¤
d9e5fd ¤   err = EnterPGPclientLib( context, &state );
58b1f0 ¤   if( IsntPGPError( err ) )
7ec7a1 ¤   {
d1a3fe ¤   ¤   err = pgpGetKeyFromServer( context, tlsContext, state.clientPrefsRef,
8d9d23 ¤   ¤   ¤   ¤   ¤   ¤   keyID, kInvalidPGPKeyRef, resultSet );
349371 ¤   }
5d67c5 ¤
2d5df5 ¤   ExitPGPclientLib( &state );
f967c5 ¤
c25ea8 ¤   return err;
96efe6 }
79af5a
fec744 ¤   PGPError
0277c2 PGPGetGroupFromServerInternal(
01a1bc ¤   PGPContextRef¤  ¤   context,
856c35 ¤   PGPtlsContextRef¤   tlsContext,
af299f ¤   PGPPrefRef¤ ¤   ¤   clientPrefsRef,
ffe468 ¤   PGPGroupSetRef¤ ¤   groupSet,
f4a35c ¤   PGPGroupID¤ ¤   ¤   groupID,
5d8b6f ¤   const char¤ ¤   ¤   *domain,¤   /* if not-NULL, used for domain info */
cf2595 ¤   PGPUInt32¤  ¤   ¤   dialogDelayTicks,
7f427e ¤   PGPKeySetRef¤   ¤   *resultSet)
5ebb36 {
b78f52 ¤   PGPError¤   ¤   ¤   err;
97161b ¤   char¤   ¤   ¤   ¤   domainStr[kMaxUserIDLength];
89176b ¤   PGPGroupSetRef¤ ¤   flattenedGroupSet;
401ed2 ¤   PGPGroupID¤ ¤   ¤   flattenedGroupID;
d8d4b6 ¤   PGPGroupItemIterRef¤iterator;
22443a ¤   PGPKeySetRef¤   ¤   foundSet;
be67c5 ¤
f982f1 ¤   if( ! CFM_AddressIsResolved_( PGPKeyServerInit ) )
87b21f ¤   ¤   return( kPGPError_FeatureNotAvailable );
5c1b52 ¤   ¤
2a454c ¤   flattenedGroupSet¤  = kInvalidPGPGroupSetRef;
79d6e5 ¤   *resultSet ¤¤   ¤   = kInvalidPGPKeySetRef;
f68c70 ¤   iterator¤   ¤   ¤   = kInvalidPGPGroupItemIterRef;
91caaf ¤   foundSet¤   ¤   ¤   = kInvalidPGPKeySetRef;
f767c5 ¤
cfc024 ¤   domainStr[0] = '\0';
dcaf5a
a50256 ¤   if( IsntNull( domain) )
ae4da1 ¤   ¤   PGPFindEmailDomain( domain, domainStr );
5e67c5 ¤
e74dc2 ¤   /* Create a flattened group with unique key ID's and other setup*/
3339ef ¤   err = PGPNewGroupSet( PGPGetGroupSetContext( groupSet ),
9de7cb ¤   ¤   ¤   &flattenedGroupSet );
61b1f0 ¤   if( IsntPGPError( err ) )
47c7a1 ¤   {
5e9947 ¤   ¤   err = PGPNewFlattenedGroupFromGroup( groupSet, groupID,
026165 ¤   ¤   ¤   ¤   ¤   flattenedGroupSet, &flattenedGroupID );
8286f8 ¤   ¤   if( IsntPGPError( err ) )
385b34 ¤   ¤   {
a76b33 ¤   ¤   ¤   err = PGPNewGroupItemIter( flattenedGroupSet,
b9df03 ¤   ¤   ¤   ¤   flattenedGroupID,
6c2910 ¤   ¤   ¤   ¤   kPGPGroupIterFlags_Recursive | kPGPGroupIterFlags_Keys,
84468e ¤   ¤   ¤   ¤   &iterator );
--ea7c 000a4fe5776401200c3 Page 7 of PGPKeyServerDialogs.cp
2a698b ¤   ¤   ¤   if( IsntPGPError( err ) )
48f776 ¤   ¤   ¤   {
a5ab27 ¤   ¤   ¤   ¤   err = PGPNewKeySet( context, &foundSet );
93a3a6 ¤   ¤   ¤   }
170fe4 ¤   ¤   }
f49371 ¤   }
8a67c5 ¤
37b1f0 ¤   if( IsntPGPError( err ) )
46c7a1 ¤   {
cec533 ¤   ¤   CServerStatusDialog¤¤   *statusDialog;
fb77d7 ¤   ¤   DialogRef¤  ¤   ¤   ¤   statusDialogRef;
5f95d2 ¤   ¤   ModalFilterUPP¤ ¤   ¤   filterUPP;
1547f7 ¤   ¤   PGPKeyServerEntry¤  ¤   *ksEntries;
5fd102 ¤   ¤   PGPUInt32¤  ¤   ¤   ¤   numKSEntries;
7bfb49 ¤   ¤   GrafPtr¤¤   ¤   ¤   ¤   savePort;
f480bf ¤   ¤   KSCallbackInfo ¤¤   ¤   callbackInfo;
631b52 ¤   ¤
247e66 ¤   ¤   GetPort( &savePort );
7167c5 ¤
5d910a ¤   ¤   statusDialogRef =·
352fef ¤   ¤   ¤   CClientKSGrafPortView::CreateDialog( kPGPServerStatusDialogID );
a3c730 ¤   ¤   pgpAssert( IsntNull( statusDialogRef ) );
3e1b52 ¤   ¤
8bdc8e ¤   ¤   statusDialog = (CServerStatusDialog *) GetWRefCon( statusDialogRef );
205365 ¤   ¤   pgpAssert( IsntNull( statusDialog ) );
231b52 ¤   ¤
5f19e9 ¤   ¤   filterUPP = NewModalFilterProc(
5c2099 ¤   ¤   ¤   ¤   ¤   ¤   CClientKSGrafPortView::ModalFilterProcHandler );
7467c5 ¤
864a05 ¤   ¤   InitCursor();
6999f2 ¤   ¤   SetPort( statusDialogRef );
92af5a
808213 ¤   ¤   pgpClearMemory( &callbackInfo, sizeof( callbackInfo ) );
dd1b52 ¤   ¤
dfd0c6 ¤   ¤   callbackInfo.filterUPP¤ ¤   = filterUPP;
ed1167 ¤   ¤   callbackInfo.dialog¤¤   ¤   = statusDialog;
8cb357 ¤   ¤   callbackInfo.displayTicks¤  = TickCount() + dialogDelayTicks;
52b190 ¤   ¤   callbackInfo.dialogRef¤ ¤   = statusDialogRef;
e5af5a
e72b45 ¤   ¤   err = PGPSetKeyServerIdleEventHandler( KSCallback, &callbackInfo );
4e9832 ¤   ¤   pgpAssertNoErr( err );
c7af5a
57aefe ¤   ¤   err = PGPCreateKeyServerPath( clientPrefsRef, domainStr,
9e379c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &ksEntries, &numKSEntries);
85144f ¤   ¤   if( IsntPGPError( err ) &&
142043 ¤   ¤   ¤   IsntNull( ksEntries) &&
a708a5 ¤   ¤   ¤   numKSEntries > 0 )
545b34 ¤   ¤   {
753186 ¤   ¤   ¤   PGPGroupItem¤   groupItem;
a187c7 ¤   ¤   ¤
9ae3f5 ¤   ¤   ¤   err = PGPGroupItemIterNext( iterator, &groupItem );
278f5a ¤   ¤   ¤   while( IsntPGPError( err ) )
56f776 ¤   ¤   ¤   {
7de9eb ¤   ¤   ¤   ¤   PGPFilterRef¤   searchFilter;
722b85 ¤   ¤   ¤   ¤
c529ff ¤   ¤   ¤   ¤   err = PGPNewKeyIDFilter( context, &groupItem.u.key.keyID,
446672 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &searchFilter );
3c5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
6a72c3 ¤   ¤   ¤   ¤   {
0d40a9 ¤   ¤   ¤   ¤   ¤   Boolean¤found = FALSE;
1cc55e ¤   ¤   ¤   ¤   ¤   Str255¤ caption;
f2af5a
254664 ¤   ¤   ¤   ¤   ¤   GetIndString( caption, kKSStringListID,
7c6f3f ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyServerState_Opening );
2f2be3 ¤   ¤   ¤   ¤   ¤   statusDialog->SetStatusCaption( caption );
2987c7 ¤   ¤   ¤
c9db0c ¤   ¤   ¤   ¤   ¤   for(Int16 serverIndex = 0; serverIndex < numKSEntries;
491e6a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   serverIndex++)
4c4859 ¤   ¤   ¤   ¤   ¤   {
787708 ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyServerRef¤server;
3caf5a
a45bb4 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPNewKeyServerFromHostName( context,
--b0c9 000b138b0fb401200c3 Page 8 of PGPKeyServerDialogs.cp
887258 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].serverDNS,
c8e906 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].serverPort,
d13b9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].protocol,
95e59f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyServerAccessType_Normal,
ff41a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyServerKeySpace_Normal,
205c65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &server );
07ca6a ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
48239e ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
c28fec ¤   ¤   ¤   ¤   ¤   ¤   {
ffc9eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   resultKeys =
7587fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPKeySetRef;
349334 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsSessionRef¤   tls = kInvalidPGPtlsSessionRef;
f353b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   char¤   ¤   ¤   ¤   url[kMaxServerNameLength + 1];
8c531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
e813d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetKeyServerURL( &ksEntries[serverIndex], url );
57419c ¤   ¤   ¤   ¤   ¤   ¤   ¤   CToPString( url, caption );
b36e14 ¤   ¤   ¤   ¤   ¤   ¤   ¤   statusDialog->SetServerCaption( caption );
11af5a
9da6a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPSetKeyServerEventHandler( server,
25056f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   KSCallback,
441b39 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &callbackInfo );
3f12d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
53743b ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( ksEntries[serverIndex].protocol ==
18b74c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyServerType_LDAPS )
b606b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
f175cc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPNewTLSSession( tlsContext, &tls );
2e5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
537a99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPKeyServerOpen( server, tls );
1a8d9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
3806b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
575017 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = MyPGPQueryKeyServer(server, searchFilter,
391e0c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &resultKeys );
520e25 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyServerClose( server );
1e5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
858d82 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( PGPtlsSessionRefIsValid( tls ) )
4a8df8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeTLSSession( tls );
e803fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) &&
6e3922 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRefIsValid( resultKeys ) &&
21709b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ! callbackInfo.cancelled )
d506b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
34477d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  numKeys;
56af5a
58a3fa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPCountKeys(resultKeys, &numKeys);
5f5a33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) && numKeys >= 1 )
b731b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
2d23fe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   found = TRUE;
cfed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
954ba3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPAddKeys( resultKeys, foundSet );
e16ce8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
92dec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
fe9e91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPCommitKeyRingChanges(
7992ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   foundSet );
7f8a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
dd6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
975268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
6f531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
589f00 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( PGPKeySetRefIsValid( resultKeys ) )
21e160 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( resultKeys );
c8531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
a8e3e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeyServer( server );
e1531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
0503fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) &&
6a0fad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   callbackInfo.cancelled )
e506b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
191f51 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kPGPError_UserAbort;
be5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
0bdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
42ae30 ¤   ¤   ¤   ¤   ¤
be1aa4 ¤   ¤   ¤   ¤   ¤   ¤   if( found || IsPGPError( err ) )
5f8c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
dc1c89 ¤   ¤   ¤   ¤   ¤   }
b1ae30 ¤   ¤   ¤   ¤   ¤
--2e84 000cc2bf667401200c3 Page 9 of PGPKeyServerDialogs.cp
9ca8f2 ¤   ¤   ¤   ¤   ¤   (void) PGPFreeFilter( searchFilter );
a22613 ¤   ¤   ¤   ¤   }
1d2b85 ¤   ¤   ¤   ¤
ea9c8a ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
4714c3 ¤   ¤   ¤   ¤   ¤   break;
f1ae30 ¤   ¤   ¤   ¤   ¤
77de9b ¤   ¤   ¤   ¤   err = PGPGroupItemIterNext( iterator, &groupItem );
e0a3a6 ¤   ¤   ¤   }
2187c7 ¤   ¤   ¤
416ae1 ¤   ¤   ¤   if( err == kPGPError_EndOfIteration )
e8bd37 ¤   ¤   ¤   ¤   err = kPGPError_NoErr;
232b85 ¤   ¤   ¤   ¤
848495 ¤   ¤   ¤   PGPDisposeKeyServerPath( ksEntries );
433b90 ¤   ¤   }¤
cb1b52 ¤   ¤
5f944c ¤   ¤   DisposeRoutineDescriptor( filterUPP );
059106 ¤   ¤   delete statusDialog;
7a67c5 ¤
45dc62 ¤   ¤   DisposeDialog( statusDialogRef );
c25943 ¤   ¤   SetPort( savePort );
30e5c2 ¤   ¤   PGPSetKeyServerIdleEventHandler( NULL, NULL );
339371 ¤   }
ea67c5 ¤
10b1f0 ¤   if( IsntPGPError( err ) )
c5c7a1 ¤   {
356fc5 ¤   ¤   *resultSet = foundSet;
079371 ¤   }
23f585 ¤   else if( PGPKeySetRefIsValid( foundSet ) )
43c7a1 ¤   {
5d8ee3 ¤   ¤   PGPFreeKeySet( foundSet );
df9371 ¤   }
f61b52 ¤   ¤
99775d ¤   if( PGPGroupItemIterRefIsValid( iterator ) )
0a03b3 ¤   ¤   (void) PGPFreeGroupItemIter( iterator );
851b52 ¤   ¤
6f44a5 ¤   if( PGPGroupSetRefIsValid( flattenedGroupSet ) )
4f05a9 ¤   ¤   (void) PGPFreeGroupSet( flattenedGroupSet );
3c67c5 ¤
3067c5 ¤
b6deb7 ¤   return( err );
c9efe6 }
4faf5a
e1c744 ¤   PGPError
e8a830 PGPGroupListOperationOnServerInternal(
b1a1bc ¤   PGPContextRef¤  ¤   context,
da6c35 ¤   PGPtlsContextRef¤   tlsContext,
753ec1 ¤   PGPKeySetRef¤   ¤   allKeys,
a8299f ¤   PGPPrefRef¤ ¤   ¤   clientPrefsRef,
6d08e4 ¤   PGPBoolean¤ ¤   ¤   sendGroups,
09b6a9 ¤   PGPGroupSetRef¤ ¤   *groupSet )
96bb36 {
9c7d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
b7e28f ¤   PGPKeyRef¤  ¤   ¤   authKey = kInvalidPGPKeyRef;
aa8b9d ¤   char¤   ¤   ¤   ¤   *passphrase = NULL;
9f1b52 ¤   ¤
5b82f1 ¤   if( ! CFM_AddressIsResolved_( PGPKeyServerInit ) )
34b21f ¤   ¤   return( kPGPError_FeatureNotAvailable );
881b52 ¤   ¤
be3c8a ¤   if( sendGroups )
e8c7a1 ¤   {
b5ac4a ¤   ¤   Str255¤ ¤   ¤   ¤   caption;
cdc9a8 ¤   ¤   char¤   ¤   ¤   ¤   cstr[256];
0a1b52 ¤   ¤
b20ade ¤   ¤   GetIndString( caption, kKSStringListID,
662c98 ¤   ¤   ¤   ¤   ¤   ¤   kKSAuthenticatePhraseStringID );
35042c ¤   ¤   PToCString( caption, cstr );
938808 ¤   ¤   err = PGPSigningPassphraseDialog( context,
629134 ¤   ¤   ¤   ¤   ¤   allKeys,
85caf5 ¤   ¤   ¤   ¤   ¤   &authKey,
95ae97 ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt( context, cstr ),
bc5277 ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( context, &passphrase ),
ccc000 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
--1282 000f813765a401200c3 Page 10 of PGPKeyServerDialogs.cp
a19371 ¤   }
ae87af ¤   if( IsntPGPError( err ) && ( !sendGroups || IsntNull( passphrase ) ) )
5ec7a1 ¤   {
87c533 ¤   ¤   CServerStatusDialog¤¤   *statusDialog;
3277d7 ¤   ¤   DialogRef¤  ¤   ¤   ¤   statusDialogRef;
e595d2 ¤   ¤   ModalFilterUPP¤ ¤   ¤   filterUPP;
1be668 ¤   ¤   PGPKeyServerEntry¤  ¤   rootServer;
f2fb49 ¤   ¤   GrafPtr¤¤   ¤   ¤   ¤   savePort;
d980bf ¤   ¤   KSCallbackInfo ¤¤   ¤   callbackInfo;
e21b52 ¤   ¤
6d7e66 ¤   ¤   GetPort( &savePort );
f567c5 ¤
19910a ¤   ¤   statusDialogRef =·
242fef ¤   ¤   ¤   CClientKSGrafPortView::CreateDialog( kPGPServerStatusDialogID );
11c730 ¤   ¤   pgpAssert( IsntNull( statusDialogRef ) );
b41b52 ¤   ¤
c2dc8e ¤   ¤   statusDialog = (CServerStatusDialog *) GetWRefCon( statusDialogRef );
d85365 ¤   ¤   pgpAssert( IsntNull( statusDialog ) );
651b52 ¤   ¤
e819e9 ¤   ¤   filterUPP = NewModalFilterProc(
4b7783 ¤   ¤   ¤   CClientKSGrafPortView::ModalFilterProcHandler );
0967c5 ¤
d64a05 ¤   ¤   InitCursor();
dc99f2 ¤   ¤   SetPort( statusDialogRef );
39af5a
108213 ¤   ¤   pgpClearMemory( &callbackInfo, sizeof( callbackInfo ) );
731b52 ¤   ¤
4ed0c6 ¤   ¤   callbackInfo.filterUPP¤ ¤   = filterUPP;
311167 ¤   ¤   callbackInfo.dialog¤¤   ¤   = statusDialog;
3a6fe2 ¤   ¤   callbackInfo.displayTicks¤  = TickCount();
a8b190 ¤   ¤   callbackInfo.dialogRef¤ ¤   = statusDialogRef;
1d5320 ¤   ¤   callbackInfo.allKeys¤   ¤   = allKeys;
beaf5a
442b45 ¤   ¤   err = PGPSetKeyServerIdleEventHandler( KSCallback, &callbackInfo );
4e9832 ¤   ¤   pgpAssertNoErr( err );
c61b52 ¤   ¤
3675e1 ¤   ¤   err = PGPGetRootKeyServer( clientPrefsRef, &rootServer );
2986f8 ¤   ¤   if( IsntPGPError( err ) )
115b34 ¤   ¤   {
37226b ¤   ¤   ¤   PGPKeyServerRef¤server;
85662f ¤   ¤   ¤   Str255¤ ¤   ¤   caption;
2eaf5a
629c9f ¤   ¤   ¤   GetIndString( caption, kKSStringListID,
3bc249 ¤   ¤   ¤   ¤   ¤   kPGPKeyServerState_Opening );
5f2c3a ¤   ¤   ¤   statusDialog->SetStatusCaption( caption );
beaf5a
fa2d91 ¤   ¤   ¤   err = PGPNewKeyServerFromHostName( context,
febb99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   rootServer.serverDNS,
f03e4a ¤   ¤   ¤   ¤   ¤   ¤   ¤   rootServer.serverPort,
db8ea2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   rootServer.protocol,
86529a ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyServerAccessType_Normal,
100a9e ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyServerKeySpace_Normal,
6f1b03 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &server );
cd144d ¤   ¤   ¤   pgpAssertNoErr( err );
e8698b ¤   ¤   ¤   if( IsntPGPError( err ) )
aff776 ¤   ¤   ¤   {
59931a ¤   ¤   ¤   ¤   PGPtlsSessionRef¤   tls = kInvalidPGPtlsSessionRef;
d77db4 ¤   ¤   ¤   ¤   char¤   ¤   ¤   ¤   url[kMaxServerNameLength + 1];
ed2b85 ¤   ¤   ¤   ¤
c4c4d2 ¤   ¤   ¤   ¤   PGPGetKeyServerURL( &rootServer, url );
809a21 ¤   ¤   ¤   ¤   CToPString( url, caption );
0af086 ¤   ¤   ¤   ¤   statusDialog->SetServerCaption( caption );
2aaf5a
ab3833 ¤   ¤   ¤   ¤   err = PGPSetKeyServerEventHandler( server,
25b26a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   KSCallback,
0c0bd0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &callbackInfo );
d355be ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
2f082a ¤   ¤   ¤   ¤   if( rootServer.protocol == kPGPKeyServerType_LDAPS )
fe72c3 ¤   ¤   ¤   ¤   {
211ddc ¤   ¤   ¤   ¤   ¤   err = PGPNewTLSSession( tlsContext, &tls );
c43a12 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) && sendGroups )
f84859 ¤   ¤   ¤   ¤   ¤   {
--eb37 000a12500b6401200c3 Page 11 of PGPKeyServerDialogs.cp
2662d9 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPtlsSetLocalPrivateKey( tls, authKey,
1c363d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( context, passphrase ),
99da9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
fa1c89 ¤   ¤   ¤   ¤   ¤   }
a42613 ¤   ¤   ¤   ¤   }
cf5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
67f787 ¤   ¤   ¤   ¤   ¤   err = PGPKeyServerOpen( server, tls );
845565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
6972c3 ¤   ¤   ¤   ¤   {
17e389 ¤   ¤   ¤   ¤   ¤   WindowRef¤  frontWindow;
56104f ¤   ¤   ¤   ¤   ¤   SInt16¤ ¤   saveWindowKind;
4cae30 ¤   ¤   ¤   ¤   ¤
6a0a94 ¤   ¤   ¤   ¤   ¤   frontWindow = LMGetWindowList();
6931a1 ¤   ¤   ¤   ¤   ¤   if( IsntNull( frontWindow ) )
524859 ¤   ¤   ¤   ¤   ¤   {
4191c7 ¤   ¤   ¤   ¤   ¤   ¤   saveWindowKind = GetWindowKind( frontWindow );
8e9daf ¤   ¤   ¤   ¤   ¤   ¤   if( saveWindowKind == kDialogWindowKind )
acba04 ¤   ¤   ¤   ¤   ¤   ¤   ¤   SetWindowKind( frontWindow, kApplicationWindowKind ¶
d76275 );
7a1c89 ¤   ¤   ¤   ¤   ¤   }
51ae30 ¤   ¤   ¤   ¤   ¤
6a3f38 ¤   ¤   ¤   ¤   ¤   if( sendGroups )
44a275 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPSendGroupsToServer( server, *groupSet );
094bd6 ¤   ¤   ¤   ¤   ¤   else
23264c ¤   ¤   ¤   ¤   ¤   ¤   err = PGPRetrieveGroupsFromServer( server, groupSet );
85ae30 ¤   ¤   ¤   ¤   ¤
cd31a1 ¤   ¤   ¤   ¤   ¤   if( IsntNull( frontWindow ) )
434859 ¤   ¤   ¤   ¤   ¤   {
9ff706 ¤   ¤   ¤   ¤   ¤   ¤   SetWindowKind( frontWindow, saveWindowKind );
0d1c89 ¤   ¤   ¤   ¤   ¤   }
ae14b8 ¤   ¤   ¤   ¤   ¤   PGPKeyServerClose( server );
ae2613 ¤   ¤   ¤   ¤   }
60385c ¤   ¤   ¤   ¤   PGPFreeKeyServer( server );
6f1e2d ¤   ¤   ¤   ¤   if( PGPtlsSessionRefIsValid( tls ) )
406fb0 ¤   ¤   ¤   ¤   ¤   PGPFreeTLSSession( tls );
9e2b85 ¤   ¤   ¤   ¤
e15bf0 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) &&
106118 ¤   ¤   ¤   ¤   ¤   callbackInfo.cancelled )
fe72c3 ¤   ¤   ¤   ¤   {
8ed1ff ¤   ¤   ¤   ¤   ¤   err = kPGPError_UserAbort;
06d4f1 ¤   ¤   ¤   ¤   ¤   if( !sendGroups )
f64859 ¤   ¤   ¤   ¤   ¤   {
8c45cc ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeGroupSet( *groupSet );
f562a0 ¤   ¤   ¤   ¤   ¤   ¤   *groupSet = kInvalidPGPGroupSetRef;
1a1c89 ¤   ¤   ¤   ¤   ¤   }
962613 ¤   ¤   ¤   ¤   }
f2a3a6 ¤   ¤   ¤   }
503b90 ¤   ¤   }¤
741b52 ¤   ¤
e6944c ¤   ¤   DisposeRoutineDescriptor( filterUPP );
909106 ¤   ¤   delete statusDialog;
a167c5 ¤
30dc62 ¤   ¤   DisposeDialog( statusDialogRef );
2d5943 ¤   ¤   SetPort( savePort );
b1e5c2 ¤   ¤   PGPSetKeyServerIdleEventHandler( NULL, NULL );
6d9371 ¤   }
5367c5 ¤
9e2a79 ¤   if( IsntNull( passphrase ) )
6dc166 ¤   ¤   PGPFreeData( passphrase );
9167c5 ¤
58deb7 ¤   return( err );
a8efe6 }
ceaf5a
55c744 ¤   PGPError
3a2434 PGPGroupListOperationOnServer(
d7a1bc ¤   PGPContextRef¤  ¤   context,
2c6c35 ¤   PGPtlsContextRef¤   tlsContext,
d73ec1 ¤   PGPKeySetRef¤   ¤   allKeys,
8808e4 ¤   PGPBoolean¤ ¤   ¤   sendGroups,
e6b6a9 ¤   PGPGroupSetRef¤ ¤   *groupSet )
ddbb36 {
a19a69 ¤   PGPclientLibState¤  state;
--3433 000c3dec0d6401200c3 Page 12 of PGPKeyServerDialogs.cp
118f52 ¤   PGPError¤   ¤   ¤   err;
9867c5 ¤
4ec333 ¤   PGPValidatePtr( groupSet );
26426b ¤   if( !sendGroups )
d8364a ¤   ¤   *groupSet = kInvalidPGPGroupSetRef;
630e24 ¤   else
2cc44e ¤   ¤   PGPValidatePtr( *groupSet );
6567c5 ¤
abe5fd ¤   err = EnterPGPclientLib( context, &state );
75b1f0 ¤   if( IsntPGPError( err ) )
73c7a1 ¤   {
5ed874 ¤   ¤   err = PGPGroupListOperationOnServerInternal( context, tlsContext,
41d784 ¤   ¤   ¤   ¤   ¤   allKeys, state.clientPrefsRef, sendGroups, groupSet );
6f1b52 ¤   ¤
c29371 ¤   }
9367c5 ¤
295df5 ¤   ExitPGPclientLib( &state );
cb67c5 ¤
f05ea8 ¤   return err;
21efe6 }
66af5a
48c744 ¤   PGPError
fcbb5e PGPGetGroupFromServer(
39a1bc ¤   PGPContextRef¤  ¤   context,
166c35 ¤   PGPtlsContextRef¤   tlsContext,
9ae468 ¤   PGPGroupSetRef¤ ¤   groupSet,
bba35c ¤   PGPGroupID¤ ¤   ¤   groupID,
fc8b6f ¤   const char¤ ¤   ¤   *domain,¤   /* if not-NULL, used for domain info */
db2595 ¤   PGPUInt32¤  ¤   ¤   dialogDelayTicks,
f8427e ¤   PGPKeySetRef¤   ¤   *resultSet)
63bb36 {
af9a69 ¤   PGPclientLibState¤  state;
ec8f52 ¤   PGPError¤   ¤   ¤   err;
9167c5 ¤
8bb407 ¤   *resultSet = kInvalidPGPKeySetRef;
2767c5 ¤
0ee5fd ¤   err = EnterPGPclientLib( context, &state );
43b1f0 ¤   if( IsntPGPError( err ) )
30c7a1 ¤   {
842bde ¤   ¤   err = PGPGetGroupFromServerInternal( context, tlsContext,
c7faea ¤   ¤   ¤   ¤   ¤   state.clientPrefsRef, groupSet, groupID, domain,
b571e3 ¤   ¤   ¤   ¤   ¤   dialogDelayTicks, resultSet );
5e1b52 ¤   ¤
419371 ¤   }
9167c5 ¤
df5df5 ¤   ExitPGPclientLib( &state );
e467c5 ¤
295ea8 ¤   return err;
42efe6 }
33af5a
bf66dd ¤   static PGPError
4b2e0e PGPSendKeyToServerInternal(
22a1bc ¤   PGPContextRef¤  ¤   context,
b16c35 ¤   PGPtlsContextRef¤   tlsContext,
25299f ¤   PGPPrefRef¤ ¤   ¤   clientPrefsRef,
69fb7a ¤   PGPKeyRef¤  ¤   ¤   key,
99c4bd ¤   PGPKeyServerEntry¤  *targetServer)
76bb36 {
11661c ¤   PGPKeySetRef¤   ¤   ¤   singleKeySet,
a51c59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   failedKeys;
1f4313 ¤   char¤   ¤   ¤   ¤   ¤   userID[kMaxUserIDLength],
7034aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   domain[kMaxUserIDLength];
70be17 ¤   PGPSize¤¤   ¤   ¤   ¤   len;
d9cf91 ¤   PGPKeyServerEntry¤  ¤   *ksEntries;
2de8c7 ¤   PGPUInt32¤  ¤   ¤   ¤   numKSEntries;
bb99b3 ¤   PGPKeyServerEntry¤  ¤   serverInfo;
dc82b0 ¤   PGPBoolean¤ ¤   ¤   ¤   foundServer = FALSE;
fc3cbe ¤   PGPError¤   ¤   ¤   ¤   err = kPGPError_NoErr;
d2af5a
7874fd ¤   PGPValidatePtr( key );
434dac ¤   PGPValidatePtr( context );
c367c5 ¤
--1f15 000e03e5541401200c3 Page 13 of PGPKeyServerDialogs.cp
3a23e7 ¤   /* Check for weak link failure */
0a67c5 ¤
1c82f1 ¤   if( ! CFM_AddressIsResolved_( PGPKeyServerInit ) )
20b21f ¤   ¤   return( kPGPError_FeatureNotAvailable );
cf1b52 ¤   ¤
efb0f3 ¤   if(IsntNull(targetServer))
01c7a1 ¤   {
ca437a ¤   ¤   pgpCopyMemory( targetServer, &serverInfo, sizeof( PGPKeyServerEntry ) );
aa1c39 ¤   ¤   foundServer = TRUE;
969371 ¤   }
690e24 ¤   else
53c7a1 ¤   {
768b17 ¤   ¤   domain[0] = '\0';
ee0a43 ¤   ¤   len = kMaxUserIDLength;
81157c ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer(key, sizeof( userID ),
87210b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   userID, &len);
32e919 ¤   ¤   pgpAssertNoErr(err);
2ef59a ¤   ¤   PGPFindEmailDomain(userID, domain);
6f6117 ¤   ¤   err = PGPCreateKeyServerPath(clientPrefsRef, domain,
e80af2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &ksEntries, &numKSEntries);
14e919 ¤   ¤   pgpAssertNoErr(err);
6686f8 ¤   ¤   if( IsntPGPError( err ) )
295b34 ¤   ¤   {
c42e93 ¤   ¤   ¤   if( IsntNull(ksEntries) && numKSEntries > 0 )
3ef776 ¤   ¤   ¤   {
f9dfdb ¤   ¤   ¤   ¤   pgpCopyMemory( &ksEntries[0], &serverInfo,
c9c6b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( PGPKeyServerEntry ) );
6f3a9b ¤   ¤   ¤   ¤   foundServer = TRUE;
dda3a6 ¤   ¤   ¤   }
c4b3bf ¤   ¤   ¤   PGPDisposeKeyServerPath(ksEntries);
9f0fe4 ¤   ¤   }
4f9371 ¤   }
0567c5 ¤
f7e504 ¤   if( IsntPGPError(err) && foundServer )
78c7a1 ¤   {
d464d4 ¤   ¤   PGPKeyServerSpec¤   serverSpec;
a3af5a
36138b ¤   ¤   pgpClearMemory( &serverSpec, sizeof( serverSpec ) );
b11b52 ¤   ¤
71ad63 ¤   ¤   serverSpec.serverName = serverInfo.serverDNS;
3e1b52 ¤   ¤
32bec5 ¤   ¤   err = PGPNewSingletonKeySet( key, &singleKeySet );
53e919 ¤   ¤   pgpAssertNoErr(err);
851b52 ¤   ¤
c8783d ¤   ¤   err = PGPNewKeyServerFromHostName( context,
89271a ¤   ¤   ¤   ¤   ¤   serverInfo.serverDNS,
7e8845 ¤   ¤   ¤   ¤   ¤   serverInfo.serverPort,
0cc4ba ¤   ¤   ¤   ¤   ¤   serverInfo.protocol,
438861 ¤   ¤   ¤   ¤   ¤   kPGPKeyServerAccessType_Normal,
f1a7e8 ¤   ¤   ¤   ¤   ¤   kPGPKeyServerKeySpace_Normal,
eb31e8 ¤   ¤   ¤   ¤   ¤   &serverSpec.server );
c4e919 ¤   ¤   pgpAssertNoErr(err);
fc1b52 ¤   ¤
6486f8 ¤   ¤   if( IsntPGPError( err ) )
365b34 ¤   ¤   {
109628 ¤   ¤   ¤   err = PGPSendToKeyServerDialog(context, &serverSpec,
89e963 ¤   ¤   ¤   ¤   ¤   ¤   ¤   tlsContext, singleKeySet, &failedKeys,·
ecfc28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
e3531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
6d1887 ¤   ¤   ¤   if( PGPKeySetRefIsValid( failedKeys ) )
4603de ¤   ¤   ¤   ¤   PGPFreeKeySet( failedKeys );
be2b85 ¤   ¤   ¤   ¤
332ee4 ¤   ¤   ¤   PGPFreeKeyServer( serverSpec.server );
2a0fe4 ¤   ¤   }
a91b52 ¤   ¤
b0d9a4 ¤   ¤   PGPFreeKeySet( singleKeySet );
e29371 ¤   }
641b52 ¤   ¤
b15ea8 ¤   return err;
9aefe6 }
2baf5a
e0c744 ¤   PGPError
--ae83 00145f7f83d401200c3 Page 14 of PGPKeyServerDialogs.cp
aea1b8 PGPSendKeyToServer(
40a1bc ¤   PGPContextRef¤  ¤   context,
206c35 ¤   PGPtlsContextRef¤   tlsContext,
c6fb7a ¤   PGPKeyRef¤  ¤   ¤   key,
26c4bd ¤   PGPKeyServerEntry¤  *targetServer)
36bb36 {
21794f ¤   PGPclientLibState¤  ¤   state;
dbba49 ¤   PGPError¤   ¤   ¤   ¤   err;
d5af5a
8b74fd ¤   PGPValidatePtr( key );
b04dac ¤   PGPValidatePtr( context );
8267c5 ¤
64e5fd ¤   err = EnterPGPclientLib( context, &state );
deb1f0 ¤   if( IsntPGPError( err ) )
70c7a1 ¤   {
b8d756 ¤   ¤   err = PGPSendKeyToServerInternal( context, tlsContext,
3cbb7f ¤   ¤   ¤   ¤   ¤   ¤   state.clientPrefsRef, key, targetServer );
b39371 ¤   }
b067c5 ¤
1f67c5 ¤
ca5df5 ¤   ExitPGPclientLib( &state );
65af5a
4c5ea8 ¤   return err;
28efe6 }
45af5a
--fb6a 000c99c0d4a401200c4 Page 1 of PGPSelectKeysDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
4d1a5a ¤   $Id: PGPSelectKeysDialog.cp,v 1.7.2.1.2.1 1998/11/12 03:07:19 heller Exp $
70f7f7 ____________________________________________________________________________*/
b6af5a
96d797 #include <LPushButton.h>
197c52 #include <LTableMonoGeometry.h>
6b7b38 #include <LTableArrayStorage.h>
e08848 #include <LTableMultiSelector.h>
d2dd56 #include <PP_Messages.h>
53e8ae #include <UDrawingUtils.h>
1a8f92 #include <UGAColorRamp.h>
d37c99 #include <URegistrar.h>
41f8a6 #include <UTextTraits.h>
a3af5a
860d08 #include "pgpMem.h"
f12f8d #include "pgpErrors.h"
37a076 #include "pgpKeys.h"
854919 #include "pgpUtilities.h"
51a02f #include "pgpClientLib.h"
0dc97b #include "pgpClientPrefs.h"
11af5a
b44720 #include "pflPrefTypes.h"
abaf5a
7276b7 #include "MacErrors.h"
7b6ce9 #include "MacCursors.h"
58b86a #include "MacQuickdraw.h"
ce85c2 #include "MacStrings.h"
aaaf5a
a26080 #include "StSaveHeapZone.h"
41aa64 #include "StSaveCurResFile.h"
e50bb4 #include "CString.h"
05af5a
e9076e #include "PGPclientLibUtils.h"
4abf61 #include "PGPclientLibDialogs.h"
74af5a
cba1f2 #include "PGPSelectKeysDialog.h"
49af5a
fbaf5a
484d77 const ResIDT¤   Txtr_Geneva9¤   ¤   ¤   ¤   =¤  4748;
f4af5a
2a64e2 const ResIDT¤   ppob_SelectKeysID¤  ¤   ¤   =¤  4753;
ccaf5a
6720dd const PaneIDT¤  caption_Prompt¤ ¤   ¤   ¤   =¤  1003;
c4302f const PaneIDT¤  table_UserIDs¤  ¤   ¤   ¤   =¤  1004;
5463d5 const PaneIDT¤  button_SelectAll¤   ¤   ¤   =¤  1005;
f2496c const PaneIDT¤  button_SelectNone¤  ¤   ¤   =¤  1006;
b9bdb0 const PaneIDT¤  button_OK¤  ¤   ¤   ¤   ¤   =¤  'bOK ';
26af5a
17483b const MessageT¤ msg_UserIDs¤¤   ¤   ¤   ¤   =¤  table_UserIDs;
ceb301 const MessageT¤ msg_SelectAll¤  ¤   ¤   ¤   =¤  button_SelectAll;
ecbaac const MessageT¤ msg_SelectNone¤ ¤   ¤   ¤   =¤  button_SelectNone;
60af5a
5701c0 const SInt16¤   kUserIDColumnWidth¤ ¤   ¤   =¤  232;
4dd35d const SInt16¤   kValidityColumnLeft¤¤   ¤   =¤  241;
edb075 const SInt16¤   kValidityColumnWidth¤   ¤   =¤  50;
13bd59 const SInt16¤   kValidityColumnIconIndent¤  =¤  14;
b046ec const SInt16¤   kCreationColumnLeft¤¤   ¤   =¤  310;
53a05a const SInt16¤   kCreationColumnWidth¤   ¤   =¤  65;
f49248 const SInt16¤   kSizeColumnLeft¤¤   ¤   ¤   =¤  384;
67b17f const SInt16¤   kSizeColumnWidth¤   ¤   ¤   =¤  75;
6130ca const SInt16¤   kIconWidth¤ ¤   ¤   ¤   ¤   =¤  16;
4a3ae8 const SInt16¤   kIconHeight¤¤   ¤   ¤   ¤   =¤  16;
c72b48 const SInt16¤   kIconIndent¤¤   ¤   ¤   ¤   =¤  2;
02cd73 const SInt16¤   kUserIDIndent¤  ¤   ¤   ¤   =¤  4;
4139bd const SInt16¤   kVerticalIndent¤¤   ¤   ¤   =¤  3;
acaf5a
2f7153 const ResIDT¤   icmx_ValidKey¤  ·¤  ¤   ¤   =¤  3014;
7530c2 const ResIDT¤   icmx_InvalidKey ¤   ¤   ¤   =¤  3015;
c9c1dd const ResIDT¤   icmx_AxiomaticKey¤  ¤   ¤   =¤  3017;
--a39b 0002af9734b401200c4 Page 2 of PGPSelectKeysDialog.cp
e0af5a
89c534 const ResIDT¤   acur_BeachBall¤ ¤   ¤   ¤   =¤  4747;
55af5a
38e9ab const ResIDT¤   ppat_BarberPattern¤ ·¤  ¤   =¤  4747;
03af5a
2e1bb1 const SInt16¤   kBarHeight¤ ¤   ¤   ¤   ¤   =¤  10;
a57c02 const SInt16¤   kMaxValidity¤   ¤   ¤   ¤   =¤  3;
61af5a
81083f const ResIDT¤   icmx_DHKey¤ ¤   ¤   ¤   ¤   =¤  3007;
0be4d8 const ResIDT¤   icmx_RSAKey¤¤   ¤   ¤   ¤   =¤  3000;
ffaf5a
b563b9 const ResIDT¤   icmx_RevokedDHKey¤  ¤   ¤   =¤  3012;
32146c const ResIDT¤   icmx_RevokedRSAKey¤ ¤   ¤   =¤  3004;
8caf5a
126c07 const ResIDT¤   icmx_SecretDHKey¤   ¤   ¤   =¤  3008;
1e3190 const ResIDT¤   icmx_SecretRSAKey¤  ¤   ¤   =¤  3001;
e6af5a
e63637 const ResIDT¤   icmx_ExpiredDHKey¤  ¤   ¤   =¤  3013;
f441e2 const ResIDT¤   icmx_ExpiredRSAKey¤ ¤   ¤   =¤  3005;
35af5a
3e4a6e static const ResID¤ icsx_DSASplitKeyPair¤   =¤  3018;
a1fdd9 static const ResID¤ icsx_RSASplitKeyPair¤   =¤  3019;
95af5a
0966dd ¤   static PGPError
41395a RealPGPSelectKeysDialog(
789a06 ¤   PGPContextRef¤  ¤   ¤   context,
5e741a ¤   PGPSelectKeysSettings¤  settings,
964350 ¤   PGPPrefRef¤ ¤   ¤   ¤   clientPrefsRef,
22db13 ¤   const char *¤   ¤   ¤   prompt,
a2b0eb ¤   PGPKeySetRef¤   ¤   ¤   fromSet,¤   ¤   ¤   ¤   ¤   ¤   ¤
09545a ¤   PGPKeySetRef¤   ¤   ¤   validitySet,
0436f0 ¤   PGPKeySetRef¤   ¤   ¤   *selectedSet)¤  ¤   ¤   ¤   ¤
03bb36 {
5bb8e5 ¤   CComboError¤err;
2836f4 ¤   DialogRef¤  skDialog;
d267c5 ¤
2a67c5 ¤
981b84 ¤   RegisterClass_( CSelectKeysDialog );
6530ec ¤   RegisterClass_( CSelectKeysTable );
a167c5 ¤
800bc1 ¤   // Create standard Macintosh window and overlay PowerPlant onto it
fa1902 ¤   skDialog =·
9054a4 ¤   ¤   ¤   CPGPModalGrafPortView::CreateDialog( ppob_SelectKeysID );
151529 ¤   if( IsntNull( skDialog ) )
2dc7a1 ¤   {
e490c1 ¤   ¤   CSelectKeysDialog *skGrafPortView = nil;
7aaf5a
704cd4 ¤   ¤   skGrafPortView =
32d16b ¤   ¤   ¤   ¤   (CSelectKeysDialog *) GetWRefCon( skDialog );
f6025a ¤   ¤   pgpAssert( IsntNull( skGrafPortView ) );
7b1b52 ¤   ¤
ab739e ¤   ¤   err = skGrafPortView->Init( context, settings, clientPrefsRef, prompt,
a39a79 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fromSet, validitySet, selectedSet);
285a9f ¤   ¤   if( err.IsntError() )
8a5b34 ¤   ¤   {
53a7e9 ¤   ¤   ¤   ModalFilterUPP¤ filterUPP;
149d50 ¤   ¤   ¤   MessageT¤   ¤   dismissMessage;
50a2a1 ¤   ¤   ¤   short¤  ¤   ¤   itemHit = 0;
f91b52 ¤   ¤
c78db0 ¤   ¤   ¤   InitCursor();
ea87c7 ¤   ¤   ¤
3789a1 ¤   ¤   ¤   SetPort( skDialog );
7daaaf ¤   ¤   ¤   ShowWindow( skDialog );
8b3a23 ¤   ¤   ¤   SelectWindow( skDialog );
ad67c5 ¤
a9f698 ¤   ¤   ¤   skGrafPortView->Refresh();
7f87c7 ¤   ¤   ¤
ff918f ¤   ¤   ¤   filterUPP = NewModalFilterProc(
4a98d7 ¤   ¤   ¤   ¤   ¤   ¤   CPGPModalGrafPortView::ModalFilterProcHandler );
ed87c7 ¤   ¤   ¤
960d3d ¤   ¤   ¤   skGrafPortView->SetDismissMessage( msg_Nothing );
2aaf5a
--a4e5 000d3ef9e55401200c4 Page 3 of PGPSelectKeysDialog.cp
5f1e49 ¤   ¤   ¤   while( itemHit == 0 )
44f776 ¤   ¤   ¤   {
0b4c70 ¤   ¤   ¤   ¤   ModalDialog( filterUPP, &itemHit );
21a3a6 ¤   ¤   ¤   }
9d1b52 ¤   ¤
e4bd0f ¤   ¤   ¤   dismissMessage = skGrafPortView->GetDismissMessage();
975321 ¤   ¤   ¤   if( dismissMessage == msg_OK )
40f776 ¤   ¤   ¤   {
c4bb45 ¤   ¤   ¤   ¤   err = skGrafPortView->GetKeys();
d4a3a6 ¤   ¤   ¤   }
58bb8c ¤   ¤   ¤   else
ebf776 ¤   ¤   ¤   {
9a5327 ¤   ¤   ¤   ¤   err.pgpErr = kPGPError_UserAbort;
b2a3a6 ¤   ¤   ¤   }
ce1b52 ¤   ¤
9b4cfe ¤   ¤   ¤   DisposeRoutineDescriptor( filterUPP );
2e0fe4 ¤   ¤   }
7d1b52 ¤   ¤
f80876 ¤   ¤   delete skGrafPortView;
6ac8e8 ¤   ¤   DisposeDialog( skDialog );
c19371 ¤   }
320e24 ¤   else
52c7a1 ¤   {
bd55d9 ¤   ¤   err.pgpErr = kPGPError_OutOfMemory;
559371 ¤   }
3b67c5 ¤
6ae1d8 ¤   return err.ConvertToPGPError();
86efe6 }
7faf5a
00c744 ¤   PGPError
ad07ab PGPSelectKeysDialog(
379a06 ¤   PGPContextRef¤  ¤   ¤   context,
87741a ¤   PGPSelectKeysSettings¤  settings,
66db13 ¤   const char *¤   ¤   ¤   prompt,
aeb0eb ¤   PGPKeySetRef¤   ¤   ¤   fromSet,¤   ¤   ¤   ¤   ¤   ¤   ¤
c9545a ¤   PGPKeySetRef¤   ¤   ¤   validitySet,
8d36f0 ¤   PGPKeySetRef¤   ¤   ¤   *selectedSet)¤  ¤   ¤   ¤   ¤
91bb36 {
e98f52 ¤   PGPError¤   ¤   ¤   err;
b09a69 ¤   PGPclientLibState¤  state;
5367c5 ¤
2812b5 ¤   PGPValidatePtr( selectedSet );
7e613d ¤   *selectedSet¤   = kInvalidPGPKeySetRef;
97827d ¤   PGPValidateParam( IsntNull( context ) );
f081a9 ¤   PGPValidateParam( IsntNull( fromSet ) );
2f67c5 ¤
41e5fd ¤   err = EnterPGPclientLib( context, &state );
45b1f0 ¤   if( IsntPGPError( err ) )
fac7a1 ¤   {
9d8845 ¤   ¤   err = RealPGPSelectKeysDialog( context, settings, state.clientPrefsRef,
09b605 ¤   ¤   ¤   ¤   ¤   prompt, fromSet, validitySet, selectedSet );
149371 ¤   }
e61b52 ¤   ¤
fd5df5 ¤   ExitPGPclientLib( &state );
e467c5 ¤
6cdeb7 ¤   return( err );
4defe6 }
1baf5a
ceaf5a
cfaf5a
9c8a8c CSelectKeysDialog::CSelectKeysDialog(
adcbb0 ¤   LStream *¤  inStream)
1d9f26 ¤   ¤   : CPGPModalGrafPortView(inStream)
23bb36 {
a0efe6 }
a8af5a
3caf5a
ecaf5a
b44f81 CSelectKeysDialog::~CSelectKeysDialog()
1bbb36 {
39efe6 }
d3af5a
--93b8 000f0cbb60f401200c4 Page 4 of PGPSelectKeysDialog.cp
e0af5a
1aaf5a
8085b7 ¤   CComboError
abfc64 CSelectKeysDialog::Init(
4bb8d1 ¤   PGPContextRef¤  ¤   ¤   inContext,
e1741a ¤   PGPSelectKeysSettings¤  settings,
656e2e ¤   PGPPrefRef¤ ¤   ¤   ¤   inClientPrefsRef,
a26272 ¤   const char *¤   ¤   ¤   inPrompt,
65bbc3 ¤   PGPKeySetRef¤   ¤   ¤   inFromSet,
66a037 ¤   PGPKeySetRef¤   ¤   ¤   inValiditySet,
812af6 ¤   PGPKeySetRef *¤ ¤   ¤   outSelectedSet)
dcbb36 {
46b8e5 ¤   CComboError¤err;
adebe7 ¤   PGPBoolean¤ inShowRSA;
4767c5 ¤
3f58aa ¤   if (IsntNull( inPrompt ) )
abc7a1 ¤   {
994c8b ¤   ¤   FindPaneByID(caption_Prompt)->SetDescriptor(CString(inPrompt));
3a9371 ¤   }
1c67c5 ¤
d8dab4 ¤   inShowRSA = ( settings & kPGPSelectKeysNoRSAKeys ) == 0;
5a67c5 ¤
4522d0 ¤   err = mUserIDTable->SetTableInfo( inContext, inClientPrefsRef,
a60ee2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   inFromSet, inValiditySet, inShowRSA,
935a08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   outSelectedSet );
ebd3cb ¤   if( err.IsntError() )
d92ef1 ¤   {¤
9bf760 ¤   ¤   if( settings & kPGPSelectKeysImportVariation )
a15b34 ¤   ¤   {
124231 ¤   ¤   ¤   Str255¤ buttonName;
3a87c7 ¤   ¤   ¤
ae42f0 ¤   ¤   ¤   GetIndString(¤  buttonName, kDialogStringListResID,
092940 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kImportButtonNameIndex );
e43af0 ¤   ¤   ¤   FindPaneByID(button_OK)->SetDescriptor( buttonName );
3600a8 ¤   ¤   ¤   mUserIDTable->SelectAllCells();
ab0fe4 ¤   ¤   }
8beb2e ¤   ¤   AdjustButtons();
ce9371 ¤   }
9667c5 ¤
bedeb7 ¤   return( err );
51efe6 }
84af5a
6685b7 ¤   CComboError
b45999 CSelectKeysDialog::GetKeys(void)
c2bb36 {
b06c2d ¤   pgpAssert( IsntNull( mUserIDTable ) );
9767c5 ¤
5f010b ¤   return( mUserIDTable->GetKeys() );
daefe6 }
4aaf5a
4faf5a
a3af5a
c96d52 ¤   void
de9113 CSelectKeysDialog::FinishCreateSelf()
6dbb36 {
98b3db ¤   LPushButton *¤  button;
3167c5 ¤
685c9f ¤   CPGPModalGrafPortView::FinishCreateSelf();
ef67c5 ¤
1439e7 ¤   button = (LPushButton *) FindPaneByID(button_SelectAll);
97c290 ¤   button->AddListener(this);
88af5a
e02107 ¤   button = (LPushButton *) FindPaneByID(button_SelectNone);
3ac290 ¤   button->AddListener(this);
0e67c5 ¤
c98941 ¤   mUserIDTable = (CSelectKeysTable *) FindPaneByID(table_UserIDs);
2a6c2d ¤   pgpAssert( IsntNull( mUserIDTable ) );
3e67c5 ¤
e92ad9 ¤   mUserIDTable->AddListener(this);
d6efe6 }
a8af5a
f06d52 ¤   void
--03b6 00081400187401200c4 Page 5 of PGPSelectKeysDialog.cp
f46870 CSelectKeysDialog::AdjustButtons(void)
04bb36 {
928fb5 ¤   TableIndexT¤numRows;
27e23d ¤   TableIndexT¤numColumns;
fcd16f ¤   STableCell¤ theCell(0, 0);
dcd444 ¤   TableIndexT¤numSelectedRows = 0;
1c67c5 ¤
34ae5e ¤   mUserIDTable->GetTableSize( numRows, numColumns );
7167c5 ¤
fc3974 ¤   while( mUserIDTable->GetNextSelectedCell( theCell ) )
4c9d4b ¤   ¤   ++numSelectedRows;
ec1b52 ¤   ¤
4d3366 ¤   if ( numSelectedRows == 0 )
f1c7a1 ¤   {
57f734 ¤   ¤   mOKButton->Disable();
9757e6 ¤   ¤   FindPaneByID(button_SelectNone)->Disable();
789371 ¤   }
c60e24 ¤   else
c9c7a1 ¤   {
f1af4f ¤   ¤   mOKButton->Enable();
575fba ¤   ¤   FindPaneByID(button_SelectNone)->Enable();
689371 ¤   }
ac67c5 ¤
d258b2 ¤   if ( numSelectedRows == numRows )
19c7a1 ¤   {
54b0a9 ¤   ¤   FindPaneByID(button_SelectAll)->Disable();
039371 ¤   }
8c0e24 ¤   else
03c7a1 ¤   {
531e5a ¤   ¤   FindPaneByID(button_SelectAll)->Enable();
289371 ¤   }
06efe6 }
cdaf5a
ac6d52 ¤   void
63f7d2 CSelectKeysDialog::ListenToMessage(
7f7b08 ¤   MessageT¤   inMessage,
08121e ¤   void *¤ ¤   ioParam)
00bb36 {
3ad22a ¤   switch (inMessage)
ffc7a1 ¤   {
ff2457 ¤   ¤   case msg_UserIDs:
bbdf73 ¤   ¤   ¤   AdjustButtons();
23cdcb ¤   ¤   ¤   break;
341b52 ¤   ¤
f4e5a2 ¤   ¤   case msg_SelectAll:
ff00a8 ¤   ¤   ¤   mUserIDTable->SelectAllCells();
fedf73 ¤   ¤   ¤   AdjustButtons();
abcdcb ¤   ¤   ¤   break;
dcaf5a
084f12 ¤   ¤   case msg_SelectNone:
f2c6ae ¤   ¤   ¤   mUserIDTable->UnselectAllCells();
31df73 ¤   ¤   ¤   AdjustButtons();
7fcdcb ¤   ¤   ¤   break;
1b1b52 ¤   ¤
039ae3 ¤   ¤   default:
ed8a76 ¤   ¤   ¤   CPGPModalGrafPortView::ListenToMessage( inMessage, ioParam );
69cdcb ¤   ¤   ¤   break;
ab9371 ¤   }
73efe6 }
f2af5a
f55d70 CSelectKeysTable::CSelectKeysTable(
accbb0 ¤   LStream *¤  inStream)
3342fa ¤   ¤   : LTableView(inStream),
a055ce ¤   ¤   mFromSet(kInvalidPGPKeySetRef),
5d2600 ¤   ¤   mBarberPixPat(nil),
e40cb1 ¤   ¤   mKeyIter(kInvalidPGPKeyIterRef),
3655ee ¤   ¤   mSelectedSet(nil)
7abb36 {
a7b46a ¤   FontInfo¤   fontInfo;
f396a1 ¤   SPoint32¤   scrollUnit;
cd67c5 ¤
818508 ¤   UTextTraits::SetPortTextTraits(Txtr_Geneva9);
--6a1b 000ea5541b8401200c4 Page 6 of PGPSelectKeysDialog.cp
c4e1b1 ¤   ::GetFontInfo(&fontInfo);
755e59 ¤   scrollUnit.v = fontInfo.ascent + fontInfo.leading + fontInfo.descent
ad5f1c ¤   ¤   ¤   ¤   ¤   + (kVerticalIndent * 2);
1c523b ¤   scrollUnit.h = 1;
e79302 ¤   SetTableGeometry(new LTableMonoGeometry(¤   this,
21f454 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mFrameSize.width,
18cac0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   scrollUnit.v));
0ad9de ¤   SetTableStorage(new LTableArrayStorage(¤this,
643d37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(PGPKeyRef)));
61b4b3 ¤   SetTableSelector(new LTableMultiSelector(this));
3efd9b ¤   InsertCols(1, 0);
154aa6 ¤   SetScrollUnit(scrollUnit);
fe8eb7 ¤   mCustomHilite = true;
78efe6 }
eeaf5a
beaf5a
10af5a
641039 CSelectKeysTable::~CSelectKeysTable()
17bb36 {
a30bbc ¤   if (mKeyIter != kInvalidPGPKeyIterRef) {
8beaf1 ¤   ¤   PGPFreeKeyIter(mKeyIter);
be9371 ¤   }
f6c968 ¤   if (mBarberPixPat != nil) {
e5d95e ¤   ¤   ::DisposePixPat(mBarberPixPat);
5e9371 ¤   }
7cefe6 }
eb67c5 ¤
88af5a
1d85b7 ¤   CComboError
9c85ba CSelectKeysTable::AddKeysToTable(
e02782 ¤   PGPKeySetRef¤   inFromSet,
991d6d ¤   PGPBoolean¤ ¤   inShowRSA )
25bb36 {
03594b ¤   PGPKeyListRef¤  ¤   keyList;
abadd8 ¤   CComboError¤¤   ¤   err;
b93ddc ¤   PGPInt32¤   ¤   ¤   algorithm;
2267c5 ¤
291949 ¤   err.pgpErr = PGPOrderKeySet( inFromSet, kPGPUserIDOrdering, &keyList);
68d3cb ¤   if( err.IsntError() )
75c7a1 ¤   {
d21f3b ¤   ¤   err.pgpErr = PGPNewKeyIter(¤keyList, &mKeyIter);
285a9f ¤   ¤   if( err.IsntError() )
c85b34 ¤   ¤   {
454019 ¤   ¤   ¤   PGPKeyRef¤  key;
85af5a
d4bab3 ¤   ¤   ¤   while ( ( PGPKeyIterNext( mKeyIter, &key ) == kPGPError_NoErr )
ed9d5c ¤   ¤   ¤   ¤   ¤   && ( key != kInvalidPGPKeyRef ) )
1ff776 ¤   ¤   ¤   {
eee2de ¤   ¤   ¤   ¤   PGPGetKeyNumber( key, kPGPKeyPropAlgID, &algorithm );
21d0e8 ¤   ¤   ¤   ¤   if( inShowRSA ||
3351c0 ¤   ¤   ¤   ¤   ¤   (algorithm != kPGPPublicKeyAlgorithm_RSA ) )
8727f1 ¤   ¤   ¤   ¤   ¤   InsertRows(¤1, LArray::index_Last, &key );
0ca3a6 ¤   ¤   ¤   }
f70fe4 ¤   ¤   }
0e1b52 ¤   ¤
326efb ¤   ¤   PGPFreeKeyList( keyList );
bb9371 ¤   }
3367c5 ¤
3adeb7 ¤   return( err );
f9efe6 }
f7af5a
77af5a
5b85b7 ¤   CComboError
226cc2 CSelectKeysTable::SetTableInfo(
7f3c55 ¤   PGPContextRef¤  inContext,
7432c5 ¤   PGPPrefRef¤ ¤   inClientPrefsRef,
7c2782 ¤   PGPKeySetRef¤   inFromSet,
8a86e1 ¤   PGPKeySetRef¤   inValiditySet,
5d3efe ¤   PGPBoolean¤ ¤   inShowRSA,
055658 ¤   PGPKeySetRef *¤ outSelectedSet)
93bb36 {
eaadd8 ¤   CComboError¤¤   ¤   err;
--c518 000372ed709401200c4 Page 7 of PGPSelectKeysDialog.cp
bef341 ¤   PGPUInt32¤  ¤   ¤   numKeys;
baaf5a
b4f458 ¤   // Make sure that there are some keys to show
0f64be ¤   err.pgpErr = PGPCountKeys( inFromSet, &numKeys );
63d3cb ¤   if( err.IsntError() )
b0c7a1 ¤   {
fd6ee7 ¤   ¤   if( numKeys > 0 )
765b34 ¤   ¤   {
ed21bc ¤   ¤   ¤   // Save off our sets
43d29d ¤   ¤   ¤   mSelectedSet ¤  = outSelectedSet;
917783 ¤   ¤   ¤   mFromSet ¤  ¤   = inFromSet;
0687c7 ¤   ¤   ¤
b597a0 ¤   ¤   ¤   mBarberPixPat = GetPixPat(ppat_BarberPattern);
f90edc ¤   ¤   ¤   pgpAssert( IsntNull( mBarberPixPat ) );
311b52 ¤   ¤
994302 ¤   ¤   ¤   err.pgpErr = PGPGetPrefBoolean(¤inClientPrefsRef,
60b207 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDisplayMarginalValidity,
f7f5b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mShowMarginalValidity);
c46d97 ¤   ¤   ¤   if( err.IsntError() )
6bf776 ¤   ¤   ¤   {
17ff1b ¤   ¤   ¤   ¤   err.pgpErr = PGPGetPrefBoolean(¤inClientPrefsRef,
18415b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefMarginalIsInvalid,
f9a806 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mMarginalIsInvalid);
eaa3a6 ¤   ¤   ¤   }
8b87c7 ¤   ¤   ¤
c06d97 ¤   ¤   ¤   if( err.IsntError() )
79f776 ¤   ¤   ¤   {
5660c7 ¤   ¤   ¤   ¤   err = AddKeysToTable( inFromSet, inShowRSA );
a1a3a6 ¤   ¤   ¤   }
5faf5a
47037e ¤   ¤   ¤   // Propagate validity
72208d ¤   ¤   ¤   if( IsntNull( inValiditySet ) && err.IsntError() )
3cf776 ¤   ¤   ¤   {
1d1068 ¤   ¤   ¤   ¤   PGPKeySetRef¤   combinedSet = kInvalidPGPKeySetRef;
3887c7 ¤   ¤   ¤
c22e8b ¤   ¤   ¤   ¤   // Create combined set
60ecdc ¤   ¤   ¤   ¤   err.pgpErr = PGPNewKeySet( inContext, &combinedSet );
c182e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
c772c3 ¤   ¤   ¤   ¤   {
bc19f5 ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPAddKeys( inFromSet, combinedSet);
10be0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
204859 ¤   ¤   ¤   ¤   ¤   {
e7dbd1 ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPAddKeys( inValiditySet, combinedSet);
721c89 ¤   ¤   ¤   ¤   ¤   }
502613 ¤   ¤   ¤   ¤   }
07af5a
f382e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
4372c3 ¤   ¤   ¤   ¤   {
140370 ¤   ¤   ¤   ¤   ¤   AnimatedCursorRef¤  cursorRef = nil;
23af5a
3a1a4c ¤   ¤   ¤   ¤   ¤   err.err = Get1AnimatedCursor( acur_BeachBall, &cursorRef );
f6717e ¤   ¤   ¤   ¤   ¤   pgpAssert( err.IsntError() );
51af5a
154779 ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPCheckKeyRingSigs( inFromSet, combinedSet,
15ef24 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TRUE, EventHandler, cursorRef );
adaf5a
96072d ¤   ¤   ¤   ¤   ¤   DisposeAnimatedCursor( cursorRef );
792613 ¤   ¤   ¤   ¤   }
58af5a
7e82e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
ae72c3 ¤   ¤   ¤   ¤   {
106aa9 ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPPropagateTrust( combinedSet );
db2613 ¤   ¤   ¤   ¤   }
3c2b85 ¤   ¤   ¤   ¤
4d9ab1 ¤   ¤   ¤   ¤   PGPFreeKeySet( combinedSet );
f0a3a6 ¤   ¤   ¤   }
b30fe4 ¤   ¤   }
3a0e1d ¤   ¤   else
c65b34 ¤   ¤   {
030a12 ¤   ¤   ¤   err.pgpErr = kPGPError_BadParams;
1c0fe4 ¤   ¤   }
379371 ¤   }
--ea95 00054b24a63401200c4 Page 8 of PGPSelectKeysDialog.cp
e0af5a
f8deb7 ¤   return( err );
20efe6 }
d8af5a
a6af5a
31af5a
2085b7 ¤   CComboError
3a9c02 CSelectKeysTable::GetKeys()
50bb36 {
0c865f ¤   CComboError¤¤   err;
72af5a
c81f33 ¤   err.pgpErr = PGPNewEmptyKeySet( mFromSet, mSelectedSet );
2ed3cb ¤   if( err.IsntError() )
95c7a1 ¤   {
2f9497 ¤   ¤   STableCell¤ ¤   theCell(0, 0);
0daf5a
cdbcb4 ¤   ¤   while( GetNextSelectedCell( theCell ) )
755b34 ¤   ¤   {
7e3b93 ¤   ¤   ¤   PGPKeySetRef¤   tempSet;
5a9a09 ¤   ¤   ¤   PGPKeyRef¤  ¤   key;
d932d7 ¤   ¤   ¤   UInt32¤ ¤   ¤   len = sizeof( key );
f04651 ¤   ¤   ¤   PGPKeySetRef¤   singleKeySet = kInvalidPGPKeySetRef;
bdaf5a
0c088d ¤   ¤   ¤   tempSet = *mSelectedSet;
8c87c7 ¤   ¤   ¤
b2e1a2 ¤   ¤   ¤   GetCellData( theCell, &key, len );
b987c7 ¤   ¤   ¤
180b49 ¤   ¤   ¤   err.pgpErr = PGPNewSingletonKeySet( key, &singleKeySet );
616d97 ¤   ¤   ¤   if( err.IsntError() )
15f776 ¤   ¤   ¤   {
a76f6b ¤   ¤   ¤   ¤   err.pgpErr = PGPUnionKeySets( tempSet, singleKeySet,
128193 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mSelectedSet);
5b2b85 ¤   ¤   ¤   ¤
bd4670 ¤   ¤   ¤   ¤   PGPFreeKeySet( singleKeySet );
99a3a6 ¤   ¤   ¤   }
7287c7 ¤   ¤   ¤
5098cb ¤   ¤   ¤   PGPFreeKeySet( tempSet );
c687c7 ¤   ¤   ¤
28e922 ¤   ¤   ¤   if( err.IsError() )
caf622 ¤   ¤   ¤   ¤   break;
a30fe4 ¤   ¤   }
439371 ¤   }
75af5a
40deb7 ¤   return( err );
eeefe6 }
9faf5a
1baf5a
60af5a
9f6d52 ¤   void
ea637b CSelectKeysTable::ClickSelf(
55e06f ¤   const SMouseDownEvent &¤inMouseDown)
d3bb36 {
1bc8c2 ¤   LTableView::ClickSelf(inMouseDown);
afdbbb ¤   BroadcastMessage(GetPaneID());
02efe6 }
f7af5a
88af5a
7daf5a
0a6d52 ¤   void
0df7ab CSelectKeysTable::DrawSelf()
9ebb36 {
cd0981 ¤   Rect¤   ¤   frame;
10739b ¤   RGBColor¤   tempColor;
b667c5 ¤
6fd7fd ¤   tempColor = UGAColorRamp::GetColor( colorRamp_Gray1 );
4975f0 ¤   RGBForeColor( &tempColor );
2d67c5 ¤
c8a622 ¤   tempColor = UGAColorRamp::GetWhiteColor();
e4a506 ¤   RGBBackColor( &tempColor );
c4af5a
f340bf ¤   CalcLocalFrameRect(frame);
54c7a1 ¤   {
--3108 000a5180b3b401200c4 Page 9 of PGPSelectKeysDialog.cp
4b44fe ¤   ¤   StDeviceLoop¤   devLoop( frame );¤  ¤
bc77ad ¤   ¤   SInt16¤ ¤   ¤   depth;
46af5a
363977 ¤   ¤   while( devLoop.NextDepth( depth ) )
6b5b34 ¤   ¤   {
6128fb ¤   ¤   ¤   if( depth >= 8 )
c4b654 ¤   ¤   ¤   ¤   PaintRect(&frame);
b1bb8c ¤   ¤   ¤   else
6ece2d ¤   ¤   ¤   ¤   EraseRect(&frame);
9c0fe4 ¤   ¤   }
f39371 ¤   }
0b67c5 ¤
4ade04 ¤   LTableView::DrawSelf();
c1efe6 }
69af5a
05af5a
dcaf5a
3d6d52 ¤   void
a3269f CSelectKeysTable::HiliteCellActively(
7e1bb3 ¤   const STableCell¤   &inCell,
5b8e9d ¤   Boolean¤¤   ¤   ¤   /*inHilite*/)
32bb36 {
28a0e5 ¤   Rect¤   cellFrame;
fb67c5 ¤
60faaf ¤   if(GetLocalCellRect(inCell, cellFrame) && FocusExposed()) {
d12da9 ¤   ¤   StDeviceLoop¤   devLoop(cellFrame);¤¤
8977ad ¤   ¤   SInt16¤ ¤   ¤   depth;
a2af5a
a5df27 ¤   ¤   while(devLoop.NextDepth(depth)) {
04c87d ¤   ¤   ¤   StColorPenState saveColorPen; ··// Preserve color & pen state
b487c7 ¤   ¤   ¤
05c514 ¤   ¤   ¤   StColorPenState::Normalize();
6ba129 ¤   ¤   ¤   if(depth >= 8) {
0e5f85 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
0852cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
51042d ¤   ¤   ¤   } else {
267337 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
2052cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
32a3a6 ¤   ¤   ¤   }
7d35c0 ¤   ¤   ¤   cellFrame.right = cellFrame.left + kUserIDColumnWidth;
fc01a6 ¤   ········UDrawingUtils::SetHiliteModeOn();
54d038 ¤   ¤   ¤   ::InvertRect(&cellFrame);
110fe4 ¤   ¤   }
7b9371 ¤   }
f7efe6 }
18af5a
b8af5a
89af5a
876d52 ¤   void
dc928f CSelectKeysTable::HiliteCellInactively(
d11bb3 ¤   const STableCell¤   &inCell,
f67e1e ¤   Boolean¤¤   ¤   ·¤  /*inHilite*/)
91bb36 {
26a0e5 ¤   Rect¤   cellFrame;
b067c5 ¤
57faaf ¤   if(GetLocalCellRect(inCell, cellFrame) && FocusExposed()) {
d92da9 ¤   ¤   StDeviceLoop¤   devLoop(cellFrame);¤¤
7377ad ¤   ¤   SInt16¤ ¤   ¤   depth;
e3af5a
c5df27 ¤   ¤   while(devLoop.NextDepth(depth)) {
e1ad33 ¤   ········StColorPenState saveColorPen; ··// Preserve color & pen state
3850b7 ¤   ········
2e56ca ¤   ········StColorPenState::Normalize();
e680c1 ¤   ········if(depth >= 8) {
a35f85 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
f252cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
11042d ¤   ¤   ¤   } else {
1d7337 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
8452cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
90a3a6 ¤   ¤   ¤   }
68e1b4 ¤   ¤   ¤   ::PenMode(srcXor);
a535c0 ¤   ¤   ¤   cellFrame.right = cellFrame.left + kUserIDColumnWidth;
--449b 000beee04b0401200c4 Page 10 of PGPSelectKeysDialog.cp
fb8cc2 ¤   ¤   ¤   cellFrame.bottom -= 1;
3e3181 ¤   ¤   ¤   UDrawingUtils::SetHiliteModeOn();
2e0e92 ¤   ¤   ¤   ::FrameRect(&cellFrame);
370fe4 ¤   ¤   }
c09371 ¤   }
a2efe6 }
27af5a
b0af5a
adaf5a
bd6d52 ¤   void
6c06a9 CSelectKeysTable::DrawCell(
6925d6 ¤   const STableCell &¤ inCell,
de6c0b ¤   const Rect &¤   ¤   inLocalRect)
e9bb36 {
216951 ¤   Rect¤   ¤   ¤   theRect = inLocalRect;
e6dc7b ¤   StDeviceLoop¤   devLoop(inLocalRect);
e96385 ¤   SInt16¤ ¤   ¤   depth;
8267c5 ¤
54b364 ¤   while (devLoop.NextDepth(depth)) {
c6e2ad ¤   ¤   if (depth >= 8) {
e38e65 ¤   ¤   ¤   theRect.right = theRect.left + kUserIDColumnWidth;
c612af ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
310b02 ¤   ¤   ¤   ::PaintRect(&theRect);
360f63 ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray1));
06d0fd ¤   ¤   ¤   theRect.left += kUserIDColumnWidth;
407244 ¤   ¤   ¤   theRect.right = inLocalRect.right;
240b02 ¤   ¤   ¤   ::PaintRect(&theRect);
3c3e1d ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_White));
d7cba3 ¤   ¤   ¤   ::MoveTo(inLocalRect.left, inLocalRect.bottom - 1);
2f63b0 ¤   ¤   ¤   ::LineTo(inLocalRect.right - 1, inLocalRect.bottom - 1);
aa447a ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
c345a6 ¤   ¤   } else {
da447a ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
766581 ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
73373a ¤   ¤   ¤   ::EraseRect(&inLocalRect);
460fe4 ¤   ¤   }
d51b52 ¤   ¤
682373 ¤   ¤   // Draw the contents
89aeb6 ¤   ¤   PGPError¤   ¤   pgpErr;
c4215f ¤   ¤   PGPKeyRef¤  ¤   key;
e3a5db ¤   ¤   PGPInt32¤   ¤   algorithm;
4d3690 ¤   ¤   SInt16¤ ¤   ¤   iconTop = inLocalRect.top + (GetRowHeight(inCell.row)
308b59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   - kIconHeight) / 2;
ea93d5 ¤   ¤   SInt16¤ ¤   ¤   iconRight = inLocalRect.left + kIconIndent
4faa17 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   + kIconWidth;
e97f3d ¤   ¤   Rect¤   ¤   ¤   drawRect = {iconTop, inLocalRect.left + kIconIndent,
ef0827 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   iconTop + kIconHeight, iconRight};
257b84 ¤   ¤   SInt16¤ ¤   ¤   just;
a84815 ¤   ¤   Str255¤ ¤   ¤   string;
8cb540 ¤   ¤   size_t¤ ¤   ¤   len;
8a358e ¤   ¤   PGPTime¤¤   ¤   creation;
e4c145 ¤   ¤   PGPInt32¤   ¤   bits;
b4da6a ¤   ¤   PGPSubKeyRef¤   subKey;¤¤
cb0ef9 ¤   ¤   ResID¤  ¤   ¤   iconID;
312399 ¤   ¤   PGPBoolean¤ ¤   secretKey;
789ee6 ¤   ¤   PGPBoolean¤ ¤   expiredKey;
9a743b ¤   ¤   PGPBoolean¤ ¤   revokedKey;
5b93f1 ¤   ¤   PGPBoolean¤ ¤   secShared;
f81b52 ¤   ¤
7cb916 ¤   ¤   len = sizeof(key);
88e17e ¤   ¤   GetCellData(¤   inCell,
247460 ¤   ¤   ¤   ¤   ¤   ¤   &key,
7fa568 ¤   ¤   ¤   ¤   ¤   ¤   len);
406f76 ¤   ¤   just = UTextTraits::SetPortTextTraits(Txtr_Geneva9);
d0e2ad ¤   ¤   if (depth >= 8) {
264933 ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
0a0fe4 ¤   ¤   }
451b52 ¤   ¤
927832 ¤   ¤   // Plot the icon
a43c40 ¤   ¤   pgpErr = PGPGetKeyNumber(¤  key,
89bf10 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropAlgID,
bebc18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm);
--8fa5 00013953841401200c4 Page 11 of PGPSelectKeysDialog.cp
f2c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
3baf5a
447a3c ¤   ¤   pgpErr = PGPGetKeyBoolean(¤ key,
d875ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropIsSecret,
ef6b0a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &secretKey);
c3c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
3eaf5a
3a7a3c ¤   ¤   pgpErr = PGPGetKeyBoolean(¤ key,
45c6db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropIsRevoked,
e71611 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &revokedKey);
c3c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
e8af5a
7b7a3c ¤   ¤   pgpErr = PGPGetKeyBoolean(¤ key,
c7941b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropIsExpired,
f41b93 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &expiredKey);
c2c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
401b52 ¤   ¤
a1d4dd ¤   ¤   if( algorithm == kPGPPublicKeyAlgorithm_DSA )
6b5b34 ¤   ¤   {
d3da2e ¤   ¤   ¤   if( revokedKey )
5e0953 ¤   ¤   ¤   ¤   iconID = icmx_RevokedDHKey;
237301 ¤   ¤   ¤   else if( expiredKey )
f8ae44 ¤   ¤   ¤   ¤   iconID = icmx_ExpiredDHKey;
8b7965 ¤   ¤   ¤   else if( secretKey )
0cf776 ¤   ¤   ¤   {
0a1f90 ¤   ¤   ¤   ¤   PGPGetKeyBoolean(¤  key,
5a127f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropIsSecretShared,
787841 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &secShared );
23c6bf ¤   ¤   ¤   ¤   iconID = (secShared) ? icsx_DSASplitKeyPair : icmx_SecretDHKey;
f1a3a6 ¤   ¤   ¤   }
90bb8c ¤   ¤   ¤   else
a09e8c ¤   ¤   ¤   ¤   iconID = icmx_DHKey;
b80fe4 ¤   ¤   }
4e0e1d ¤   ¤   else
7d5b34 ¤   ¤   {
beda2e ¤   ¤   ¤   if( revokedKey )
fb2ac9 ¤   ¤   ¤   ¤   iconID = icmx_RevokedRSAKey;
b97301 ¤   ¤   ¤   else if( expiredKey )
074e50 ¤   ¤   ¤   ¤   iconID = icmx_ExpiredRSAKey;
247965 ¤   ¤   ¤   else if( secretKey )
85f776 ¤   ¤   ¤   {
051f90 ¤   ¤   ¤   ¤   PGPGetKeyBoolean(¤  key,
7f127f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropIsSecretShared,
ac7841 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &secShared );
ef7fde ¤   ¤   ¤   ¤   iconID = (secShared) ? icsx_RSASplitKeyPair : icmx_SecretRSAKey;
e4a3a6 ¤   ¤   ¤   }
46bb8c ¤   ¤   ¤   else
3b0424 ¤   ¤   ¤   ¤   iconID = icmx_RSAKey;
f30fe4 ¤   ¤   }
771b52 ¤   ¤
e83d81 ¤   ¤   ::PlotIconID(¤  &drawRect,
9f672b ¤   ¤   ¤   ¤   ¤   ¤   atNone,
76ab32 ¤   ¤   ¤   ¤   ¤   ¤   ttNone,
17254f ¤   ¤   ¤   ¤   ¤   ¤   iconID);
4bda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
ec0da6 ¤   ¤   // Draw the UserID
8174d8 ¤   ¤   ::SetRect(¤ &drawRect,
d31217 ¤   ¤   ¤   ¤   ¤   iconRight + kUserIDIndent,
3139cf ¤   ¤   ¤   ¤   ¤   inLocalRect.top + kVerticalIndent,
bc7659 ¤   ¤   ¤   ¤   ¤   kUserIDColumnWidth,
a07583 ¤   ¤   ¤   ¤   ¤   inLocalRect.bottom - kVerticalIndent);
c2e92f ¤   ¤   len = sizeof(string) - 1;
d7c64d ¤   ¤   pgpErr = PGPGetPrimaryUserIDNameBuffer(key,
ba0c37 ¤   ¤   ¤   sizeof( string ) - 1, (char *)&string[1], &len);
804400 ¤   ¤   if(pgpErr != kPGPError_BufferTooSmall)
515b34 ¤   ¤   {
388109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
d00fe4 ¤   ¤   }
5db380 ¤   ¤   string[0] = len;
558166 ¤   ¤   ::TruncString(¤ drawRect.right - drawRect.left,
494f38 ¤   ¤   ¤   ¤   ¤   ¤   string,
13e0b6 ¤   ¤   ¤   ¤   ¤   ¤   truncMiddle);
--42e5 00011987a0b401200c4 Page 12 of PGPSelectKeysDialog.cp
90d75a ¤   ¤   UTextDrawing::DrawWithJustification(¤   (Ptr) &string[1],
3c796d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   string[0],
076b91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   drawRect,
aac8fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   just);
24da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
ae5de0 ¤   ¤   // Adjust the background color for last columns
5fe2ad ¤   ¤   if (depth >= 8) {
9654ff ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray1));
210fe4 ¤   ¤   }
121b52 ¤   ¤
d27f33 ¤   ¤   // Draw the validity
5967b3 ¤   ¤   RGBColor¤   tempColor;
da161b ¤   ¤   RGBColor¤   saveBackColor;
f12c75 ¤   ¤   Rect¤   ¤   validityBarRect;
25793d ¤   ¤   PGPBoolean¤ isAxiomatic;
6da066 ¤   ¤   PGPInt32¤   validity;
352b85 ¤   ¤   ¤   ¤
a27a3c ¤   ¤   pgpErr = PGPGetKeyBoolean(¤ key,
a2e178 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropIsAxiomatic,
01039f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &isAxiomatic);
46c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
313c40 ¤   ¤   pgpErr = PGPGetKeyNumber(¤  key,
0e4cb7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropValidity,
fb9a4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &validity);
07c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
1674d8 ¤   ¤   ::SetRect(¤ &drawRect,
0a55ff ¤   ¤   ¤   ¤   ¤   kValidityColumnLeft,
b039cf ¤   ¤   ¤   ¤   ¤   inLocalRect.top + kVerticalIndent,
82de8c ¤   ¤   ¤   ¤   ¤   kValidityColumnLeft + kValidityColumnWidth,
f77583 ¤   ¤   ¤   ¤   ¤   inLocalRect.bottom - kVerticalIndent);
f00621 ¤   ¤   ::GetBackColor(&saveBackColor);
0d6914 ¤   ¤   tempColor = UGAColorRamp::GetBlackColor();
9135e6 ¤   ¤   ::RGBForeColor(&tempColor);
b4af5a
31aa4d ¤   ¤   if (mShowMarginalValidity) {
8d6e87 ¤   ¤   ¤   RGBColor¤   trustColor = { 52223, 52223, 65535 };
1c87c7 ¤   ¤   ¤
a522ba ¤   ¤   ¤   ::SetRect(¤ &validityBarRect,
7f0621 ¤   ¤   ¤   ¤   ¤   ¤   drawRect.left,
bc29ed ¤   ¤   ¤   ¤   ¤   ¤   drawRect.top,
61f0d8 ¤   ¤   ¤   ¤   ¤   ¤   drawRect.right,
c9f892 ¤   ¤   ¤   ¤   ¤   ¤   drawRect.top + kBarHeight);
3f1750 ¤   ¤   ¤   AlignRect(¤ &drawRect,
244386 ¤   ¤   ¤   ¤   ¤   ¤   &validityBarRect,
b20595 ¤   ¤   ¤   ¤   ¤   ¤   kAlignAtVerticalCenter);
3791f6 ¤   ¤   ¤   ::FrameRect(&validityBarRect);
1d91fd ¤   ¤   ¤   ::InsetRect(¤   &validityBarRect,
c49470 ¤   ¤   ¤   ¤   ¤   ¤   ¤   1,
ca4a8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   1);
0baf5a
662fa9 ¤   ¤   ¤   if (isAxiomatic && (mBarberPixPat != nil)) {
583bb0 ¤   ¤   ¤   ¤   ::PenPixPat(mBarberPixPat);
a3a852 ¤   ¤   ¤   ¤   ::PaintRect(&validityBarRect);
f3c0ae ¤   ¤   ¤   ¤   ::PenNormal();
db042d ¤   ¤   ¤   } else {
a2f9b4 ¤   ¤   ¤   ¤   SInt16 ¤¤   width;
af66cd ¤   ¤   ¤   ¤   SInt16¤ ¤   barPercent;
d85cec ¤   ¤   ¤   ¤   switch (validity) {
865ee4 ¤   ¤   ¤   ¤   ¤   default:
666103 ¤   ¤   ¤   ¤   ¤   case kPGPValidity_Unknown:
887be2 ¤   ¤   ¤   ¤   ¤   case kPGPValidity_Invalid:
a94859 ¤   ¤   ¤   ¤   ¤   {
fefc94 ¤   ¤   ¤   ¤   ¤   ¤   barPercent = 0;
481c89 ¤   ¤   ¤   ¤   ¤   }
bb14c3 ¤   ¤   ¤   ¤   ¤   break;
f4ae30 ¤   ¤   ¤   ¤   ¤
3e94aa ¤   ¤   ¤   ¤   ¤   ¤
5eaa0e ¤   ¤   ¤   ¤   ¤   case kPGPValidity_Marginal:
864859 ¤   ¤   ¤   ¤   ¤   {
2b9580 ¤   ¤   ¤   ¤   ¤   ¤   barPercent = 50;
331c89 ¤   ¤   ¤   ¤   ¤   }
1114c3 ¤   ¤   ¤   ¤   ¤   break;
--a8b7 00075d495c3401200c4 Page 13 of PGPSelectKeysDialog.cp
d6ae30 ¤   ¤   ¤   ¤   ¤
e894aa ¤   ¤   ¤   ¤   ¤   ¤
650ab8 ¤   ¤   ¤   ¤   ¤   case kPGPValidity_Complete:
c94859 ¤   ¤   ¤   ¤   ¤   {
4a800b ¤   ¤   ¤   ¤   ¤   ¤   barPercent = 100;
bf1c89 ¤   ¤   ¤   ¤   ¤   }
b714c3 ¤   ¤   ¤   ¤   ¤   break;
652613 ¤   ¤   ¤   ¤   }
832b85 ¤   ¤   ¤   ¤
e55cf1 ¤   ¤   ¤   ¤   if (depth >= 8) {
8cd8f7 ¤   ¤   ¤   ¤   ¤   ::RGBForeColor(&trustColor);
6170e0 ¤   ¤   ¤   ¤   ¤   ::PaintRect(&validityBarRect);
c12613 ¤   ¤   ¤   ¤   }
d4dd78 ¤   ¤   ¤   ¤   width = validityBarRect.right - validityBarRect.left;
359f58 ¤   ¤   ¤   ¤   validityBarRect.right -= (width * (100 - barPercent)) / 100;
faf82a ¤   ¤   ¤   ¤   tempColor = UGAColorRamp::GetColor(colorRamp_Gray9);
ad78d5 ¤   ¤   ¤   ¤   ::RGBForeColor(&tempColor);
1ea852 ¤   ¤   ¤   ¤   ::PaintRect(&validityBarRect);
f1a3a6 ¤   ¤   ¤   }
07af5a
fc45a6 ¤   ¤   } else {
981838 ¤   ¤   ¤   ResIDT¤ iconResID;
1f87c7 ¤   ¤   ¤
06ef22 ¤   ¤   ¤   if (isAxiomatic)
3ff776 ¤   ¤   ¤   {
af41f6 ¤   ¤   ¤   ¤   iconResID = icmx_AxiomaticKey;
50a3a6 ¤   ¤   ¤   }
cad0c0 ¤   ¤   ¤   else if (validity == kPGPValidity_Complete)
74f776 ¤   ¤   ¤   {
4050ca ¤   ¤   ¤   ¤   iconResID = icmx_ValidKey;
39a3a6 ¤   ¤   ¤   }
6e7076 ¤   ¤   ¤   else if (validity == kPGPValidity_Marginal)
c3f776 ¤   ¤   ¤   {
a2ba48 ¤   ¤   ¤   ¤   if( mMarginalIsInvalid )
5e72c3 ¤   ¤   ¤   ¤   {
067c93 ¤   ¤   ¤   ¤   ¤   iconResID = icmx_InvalidKey;
412613 ¤   ¤   ¤   ¤   }
37fa07 ¤   ¤   ¤   ¤   else
7b72c3 ¤   ¤   ¤   ¤   {
8bc152 ¤   ¤   ¤   ¤   ¤   iconResID = icmx_ValidKey;
f62613 ¤   ¤   ¤   ¤   }
9aa3a6 ¤   ¤   ¤   }
78bb8c ¤   ¤   ¤   else
2bf776 ¤   ¤   ¤   {
3a2e0e ¤   ¤   ¤   ¤   iconResID = icmx_InvalidKey;
fba3a6 ¤   ¤   ¤   }
7987c7 ¤   ¤   ¤
7e22ba ¤   ¤   ¤   ::SetRect(¤ &validityBarRect,
e02c29 ¤   ¤   ¤   ¤   ¤   ¤   drawRect.left + kValidityColumnIconIndent,
9329ed ¤   ¤   ¤   ¤   ¤   ¤   drawRect.top,
5b8245 ¤   ¤   ¤   ¤   ¤   ¤   drawRect.left + kIconWidth
9c477d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   + kValidityColumnIconIndent,
25c3ce ¤   ¤   ¤   ¤   ¤   ¤   drawRect.top + kIconHeight);
291750 ¤   ¤   ¤   AlignRect(¤ &drawRect,
164386 ¤   ¤   ¤   ¤   ¤   ¤   &validityBarRect,
900595 ¤   ¤   ¤   ¤   ¤   ¤   kAlignAtVerticalCenter);
b56fb7 ¤   ¤   ¤   tempColor = UGAColorRamp::GetWhiteColor();
1f0a6a ¤   ¤   ¤   ::RGBBackColor(&tempColor);
9a33c5 ¤   ¤   ¤   ::PlotIconID(¤  &validityBarRect,
173ffd ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAlignNone,
a0f330 ¤   ¤   ¤   ¤   ¤   ¤   ¤   IsEnabled() ? kTransformNone : kTransformDisabled,
fb64b9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   iconResID);
f10fe4 ¤   ¤   }
b76914 ¤   ¤   tempColor = UGAColorRamp::GetBlackColor();
3735e6 ¤   ¤   ::RGBForeColor(&tempColor);
90a0b3 ¤   ¤   ::RGBBackColor(&saveBackColor);
3baf5a
08b31a ¤   ¤   // Draw the creation date
b930a9 ¤   ¤   pgpErr = PGPGetKeyTime(¤key,
347e85 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropCreation,
1993c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &creation);
75c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
--7bbf 0002acc6359401200c4 Page 14 of PGPSelectKeysDialog.cp
14ea1b ¤   ¤   creation = PGPTimeToMacTime(creation);
304178 ¤   ¤   ::DateString(creation, shortDate, string, nil);
1574d8 ¤   ¤   ::SetRect(¤ &drawRect,
816dfd ¤   ¤   ¤   ¤   ¤   kCreationColumnLeft,
3539cf ¤   ¤   ¤   ¤   ¤   inLocalRect.top + kVerticalIndent,
adc307 ¤   ¤   ¤   ¤   ¤   kCreationColumnLeft + kCreationColumnWidth,
a27583 ¤   ¤   ¤   ¤   ¤   inLocalRect.bottom - kVerticalIndent);
62d75a ¤   ¤   UTextDrawing::DrawWithJustification(¤   (Ptr) &string[1],
e8796d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   string[0],
db6b91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   drawRect,
29c8fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   just);
8faf5a
03b85e ¤   ¤   // Draw the size
f43c40 ¤   ¤   pgpErr = PGPGetKeyNumber(¤  key,
8c1d20 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropBits,
a0ec60 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &bits);
dcc0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
65df5f ¤   ¤   if (algorithm == kPGPPublicKeyAlgorithm_DSA)
b25b34 ¤   ¤   {
e94840 ¤   ¤   ¤   PGPInt32¤   bits2;
6013e8 ¤   ¤   ¤   Str31¤  ¤   string2;
e587c7 ¤   ¤   ¤
53ce19 ¤   ¤   ¤   GetIndString( string, kDialogStringListResID,
d11222 ¤   ¤   ¤   ¤   ¤   kDSSDHKeySizeFormatStrIndex );
ef87c7 ¤   ¤   ¤
337640 ¤   ¤   ¤   PGPKeyIterSeek(mKeyIter, key);
9adfd6 ¤   ¤   ¤   pgpErr = PGPKeyIterNextSubKey(mKeyIter, &subKey);
0016bd ¤   ¤   ¤   if (IsntPGPError(pgpErr) && PGPSubKeyRefIsValid(subKey)) {
402b85 ¤   ¤   ¤   ¤
c0f9e2 ¤   ¤   ¤   ¤   pgpErr = PGPGetSubKeyNumber(¤   subKey,
2a8e8f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropBits,
ba3ee6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &bits2);
4d8f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
01a3a6 ¤   ¤   ¤   }
1187c7 ¤   ¤   ¤
c1774b ¤   ¤   ¤   ::NumToString(bits2, string2);
5a6f10 ¤   ¤   ¤   PrintPString( string, string, string2 );
4aaf5a
9d0a8c ¤   ¤   ¤   ::NumToString(bits, string2);
666f10 ¤   ¤   ¤   PrintPString( string, string, string2 );
1a0fe4 ¤   ¤   }
d80e1d ¤   ¤   else
9c5b34 ¤   ¤   {
bef6b8 ¤   ¤   ¤   ::NumToString(bits, string);
9a0fe4 ¤   ¤   }
c074d8 ¤   ¤   ::SetRect(¤ &drawRect,
baf582 ¤   ¤   ¤   ¤   ¤   kSizeColumnLeft,
5639cf ¤   ¤   ¤   ¤   ¤   inLocalRect.top + kVerticalIndent,
b4a0a8 ¤   ¤   ¤   ¤   ¤   kSizeColumnLeft + kSizeColumnWidth,
2f7583 ¤   ¤   ¤   ¤   ¤   inLocalRect.bottom - kVerticalIndent);
f2d75a ¤   ¤   UTextDrawing::DrawWithJustification(¤   (Ptr) &string[1],
fc796d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   string[0],
416b91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   drawRect,
47c8fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   just);
c99371 ¤   }
96efe6 }
6faf5a
73af5a
abaf5a
2bc744 ¤   PGPError
209c3a CSelectKeysTable::EventHandler(
bd520e ¤   PGPContextRef¤  context,
d03981 ¤   PGPEvent *¤ ¤   event,
e54c20 ¤   PGPUserValue¤   userValue)
4bbb36 {
606d02 ¤   (void) context;
08756f ¤   (void) event;
8567c5 ¤
af81e7 ¤   if( userValue != 0 )
fa40bc ¤   ¤   AnimateCursor((AnimatedCursorRef) userValue);
9767c5 ¤
2a151e ¤   return kPGPError_NoErr;
--522d 0014613fa97401200c4 Page 15 of PGPSelectKeysDialog.cp
7aefe6 }
46af5a
--395e 000484ec2f5401200c5 Page 1 of PGPSelectKeysDialog.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
328a24 ¤   $Id: PGPSelectKeysDialog.h,v 1.4.8.1 1998/11/12 03:07:20 heller Exp $
42f7f7 ____________________________________________________________________________*/
4faf5a
f48d55 #pragma once·
6aaf5a
62fcb1 #include "CPGPModalGrafPortView.h"
229f63 #include "pgpEncode.h"
abaf5a
d21f27 class CSelectKeysTable;
41af5a
5ad7a7 class CSelectKeysDialog : public CPGPModalGrafPortView
dfbb36 {
665ed4 public:
6faf5a
86ce0d ¤   enum¤   ¤   ¤   ¤   { class_ID = 'ImpD' };
7367c5 ¤
caf780 ¤   ¤   ¤   ¤   ¤   ¤   CSelectKeysDialog(LStream * inStream);
c08ccc ¤   virtual¤¤   ¤   ¤   ~CSelectKeysDialog();
8367c5 ¤
8b9a58 ¤   CComboError¤¤   ¤   Init(¤  PGPContextRef¤  ¤   ¤   inContext,
d8cd60 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSelectKeysSettings¤  settings,
884421 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPPrefRef¤ ¤   ¤   ¤   inClientPrefs,
03db08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const char *¤   ¤   ¤   inPrompt,
7367a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   ¤   inFromSet,
4f6193 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   ¤   inValiditySet,
378da9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef *¤ ¤   ¤   outSelectedSet);
6967c5 ¤
8edc80 ¤   CComboError¤¤   ¤   GetKeys();
4bf277 ¤   virtual void¤   ¤   ListenToMessage(MessageT inMessage, void * ioParam);
591b52 ¤   ¤
91a2d3 protected:
62af5a
5580fd ¤   virtual void¤   ¤   FinishCreateSelf();
8e67c5 ¤
a40fb9 private:
4caf5a
f4c7df ¤   CSelectKeysTable¤   *mUserIDTable;
f267c5 ¤
882316 ¤   void¤   ¤   ¤   ¤   AdjustButtons(void);
4682f7 };
0caf5a
04af5a
ea2649 class CSelectKeysTable :¤   public LTableView,
d0cf7c ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster
6ebb36 {
735ed4 public:
119855 ¤   enum ¤  ¤   ¤   ¤   { class_ID = 'ImpT' };
88af5a
f54d62 ¤   ¤   ¤   ¤   ¤   ¤   CSelectKeysTable(LStream * inStream);
c5ca55 ¤   virtual¤¤   ¤   ¤   ~CSelectKeysTable();
fc67c5 ¤
95d0cd ¤   CComboError¤¤   ¤   SetTableInfo(PGPContextRef¤ inContext,
6bd818 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPPrefRef¤ ¤   ¤   inClientPrefs,
2a2c86 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   inFromSet,
26ddab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   inValiditySet,
21fc84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   ¤   inShowRSA,
e84592 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef *¤ ¤   outSelectedSet);
ccda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
2bdc80 ¤   CComboError¤¤   ¤   GetKeys();
b3af5a
f4a2d3 protected:
19af5a
22badc ¤   PGPKeySetRef¤   ¤   mFromSet;
9e4c2b ¤   PGPKeySetRef *¤ ¤   mSelectedSet;
6025dc ¤   PGPKeyIterRef¤  ¤   mKeyIter;
d875f6 ¤   PixPatHandle¤   ¤   mBarberPixPat;
713a88 ¤   PGPBoolean¤ ¤   ¤   mShowMarginalValidity;
48adf5 ¤   PGPBoolean¤ ¤   ¤   mMarginalIsInvalid;
--8203 0019ceddd8c401200c5 Page 2 of PGPSelectKeysDialog.h
2a67c5 ¤
928f69 ¤   CComboError¤¤   ¤   AddKeysToTable(¤PGPKeySetRef¤   inFromSet,
129e8f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   inShowRSA );
56659f ¤   virtual void¤   ¤   HiliteCellActively(const STableCell & inCell,
bf71c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inHilite);
aa3135 ¤   virtual void¤   ¤   HiliteCellInactively(const STableCell & inCell,
b671c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inHilite);
c967c5 ¤
5d0e5d ¤   virtual void¤   ¤   ClickSelf(const SMouseDownEvent & inMouseDown);
4e67c5 ¤
aed3d4 ¤   virtual void¤   ¤   DrawSelf();
11de07 ¤   virtual void¤   ¤   DrawCell(const STableCell & inCell,
dcec1e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect & inLocalRect);
63af5a
27ce00 ¤   static PGPError¤¤   EventHandler(PGPContextRef context,
e1ed0e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent * event, PGPUserValue userValue);¤
e482f7 };
9caf5a
--5204 001b1a179ec401200c6 Page 1 of PGPSplash.r
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
d9af5a
db7da8 ¤   $Id: PGPSplash.r,v 1.2.8.1 1998/11/12 03:07:21 heller Exp $
2af7f7 ____________________________________________________________________________*/
34af5a
ff96be #include "PGPBuildFlags.h"
97af5a
a22ff5 #if PGP_FREEWARE
6f5c90 ¤   Include "PGPSplashFree.rsrc";
7c38b2 #elif PGP_BUSINESS_SECURITY
dbbda8 ¤   Include "PGPSplashBS.rsrc";
8bd86b #elif PGP_PERSONAL_PRIVACY
2ce1b3 ¤   Include "PGPSplashPP.rsrc";
46db21 #else
56c1c2 ¤   #error Cannot include correct splash screen
c17454 #endif
7faf5a
8831a1 #if CREDIT_RSA_BSAFE
4e3ef2 ¤   Include "BSAFELogos.rsrc";
aa7454 #endif
b1af5a
--6594 001b9ecac0d401200c7 Page 1 of PGPclientLib.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
d9af5a
dbe216 ¤   $Id: PGPclientLib.prefix,v 1.1.10.1 1998/11/12 03:07:22 heller Exp $
47f7f7 ____________________________________________________________________________*/
d2af5a
e867a5 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0¤  /* 1 is on, 0 off */
11af5a
3f38e5 /*
7c069c ** Note: Do NOT define the PP symbols Debug_Throw or Debug_Signal here as
3b636b ** PP does #ifdef checking of the symbol, not #if
7a7fe0 */
e5af5a
b9b743 #include "PGPclientLibCommon.h"
--d3a4 001f161fd6b401200c8 Page 1 of PGPclientLibCommon.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
d9af5a
61290d ¤   $Id: PGPclientLibCommon.h,v 1.3.8.1 1998/11/12 03:07:22 heller Exp $
eef7f7 ____________________________________________________________________________*/
20af5a
ea7b7d #pragma once
d8af5a
c93379 #ifdef __cplusplus
b53c47 ¤   #if __POWERPC__¤
af58dc ¤   ¤   #include "MacHeadersPPC++"
aabdd3 ¤   #elif __CFM68K__
0fd916 ¤   ¤   #include "MacHeadersCFM68K++"
cbb7ec ¤   #endif
e7db21 #else
c83c47 ¤   #if __POWERPC__¤
f65f28 ¤   ¤   #include "MacHeadersPPC"
b9bdd3 ¤   #elif __CFM68K__
36ec15 ¤   ¤   #include "MacHeadersCFM68K"
c2b7ec ¤   #endif
cc7454 #endif
1baf5a
20e399 #include <Sound.h>¤ /* Needed for LTextEditView.cp */
7caf5a
609789 /* Common flags: */
ca79b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
60af5a
92049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
cbaf5a
130db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
c6a6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
aa5a25 #define USE_MAC_DEBUG_PATCHES¤  ¤   0
ddaf5a
85a662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
e35cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
87af5a
8ae6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
4faf5a
70ae08 #define PGP_MACINTOSH¤  ¤   ¤   ¤   1
f9af5a
c6bea2 #define MSL_USE_PRECOMPILED_HEADERS¤0
7daf5a
0390e3 /* Common headers: */
3eaf5a
048985 #include "ansi_prefix.mac.h"
3faf5a
d6e2ff #include "pgpConfig.h"
b596be #include "PGPBuildFlags.h"
af46ad #include "MacDebug.h"
1caf5a
be24ea #define CreateRootControl¤  PGPCreateRootControl
f15286 #include "MacDialogs.h"
--3883 0018f5dda5c401200c9 Page 1 of PGPclientLibDebug.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
d9af5a
e6836f ¤   $Id: PGPclientLibDebug.prefix,v 1.1.10.1 1998/11/12 03:07:23 heller Exp $
5ef7f7 ____________________________________________________________________________*/
3daf5a
f763de #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1¤  /* 1 is on, 0 off */
51af5a
1d093f #define Debug_Throw¤¤   ¤   ¤   ¤   1¤  /* PowerPlant debugging */
52a696 #define Debug_Signal¤   ¤   ¤   ¤   1¤  /* PowerPlant debugging */
c8af5a
8fb743 #include "PGPclientLibCommon.h"
--ed2c 00037c0d74a401200ca Page 1 of PGPclientLibDialogs.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
5189f1 ¤   $Id: PGPclientLibDialogs.cp,v 1.28.2.2.2.1 1998/11/12 03:07:23 heller Exp $
81f7f7 ____________________________________________________________________________*/
baaf5a
c9324c #include <string.h>
e8af5a
796c79 #include <Gestalt.h>
784d37 #include <LowMem.h>
2e84be #include <Sound.h>
4caf5a
0205c6 #include <LStaticText.h>
99dd56 #include <PP_Messages.h>
d0af5a
f485c2 #include "MacStrings.h"
ab4720 #include "pflPrefTypes.h"
68a076 #include "pgpKeys.h"
410d08 #include "pgpMem.h"
0dfb31 #include "pgpOptionList.h"
42e684 #include "pgpUserInterface.h"
6baf5a
37fcb1 #include "CPGPModalGrafPortView.h"
593991 #include "pgpAdminPrefs.h"
dfc97b #include "pgpClientPrefs.h"
36b6e8 #include "PGPclientLib.h"
2fbf61 #include "PGPclientLibDialogs.h"
b1076e #include "PGPclientLibUtils.h"
32b397 #include "PGPOpenPrefs.h"
8eaf5a
ea7353 enum
23bb36 {
4058ec ¤   kMacBinaryPopupNoneMenuItem¤= 1,
747abe ¤   kMacBinaryPopupSmartMenuItem,
880182 ¤   kMacBinaryPopupYesMenuItem
4482f7 };
d1af5a
f3af5a
713d20 ¤   static MessageT
ad9208 PGPUIWarningAlertInternal(
acc44d ¤   WarningAlertType ¤  alertType,
0c3cf3 ¤   WarningAlertStyle ¤ alertStyle,
c9428f ¤   ConstStr255Param¤   string)
febb36 {
0d8343 ¤   MessageT¤   ¤   ¤   ¤   dismissMessage = msg_Cancel;
53c7a7 ¤   GrafPtr¤¤   ¤   ¤   ¤   savePort;
fe1fad ¤   AlertStdAlertParamRec¤  alertParams;
b70eb7 ¤   AlertType¤  ¤   ¤   ¤   dialogType;
ee1317 ¤   SInt16¤ ¤   ¤   ¤   ¤   itemHit;
afb63a ¤   WindowPtr¤  ¤   ¤   ¤   frontWindow;
900e80 ¤   short¤  ¤   ¤   ¤   ¤   saveWindowKind;
c767c5 ¤
5cf732 ¤   GetPort( &savePort );
3767c5 ¤
e10705 ¤   pgpClearMemory( &alertParams, sizeof( alertParams ) );
3b67c5 ¤
8c28b5 ¤   alertParams.position ¤  = kWindowDefaultPosition;
7c276a ¤   alertParams.filterProc¤ = NewModalFilterProc(·
dc57dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPModalGrafPortView::ModalFilterProcHandler );
2267c5 ¤
cd6824 ¤   switch( alertStyle )
9cc7a1 ¤   {
846c01 ¤   ¤   case kWAOKStyle:
f44a16 ¤   ¤   ¤   alertParams.defaultText¤¤   = (StringPtr) kAlertDefaultOKText;
f0ac6d ¤   ¤   ¤   alertParams.defaultButton¤  = kAlertStdAlertOKButton;
94cdcb ¤   ¤   ¤   break;
2787c7 ¤   ¤   ¤
b536a0 ¤   ¤   case kWAOKCancelStyle:
644a16 ¤   ¤   ¤   alertParams.defaultText¤¤   = (StringPtr) kAlertDefaultOKText;
976cf5 ¤   ¤   ¤   alertParams.cancelText¤ ¤   = (StringPtr) kAlertDefaultCancelText;
37ac6d ¤   ¤   ¤   alertParams.defaultButton¤  = kAlertStdAlertOKButton;
--f9a3 000aa00e9f0401200ca Page 2 of PGPclientLibDialogs.cp
9ed245 ¤   ¤   ¤   alertParams.cancelButton¤   = kAlertStdAlertCancelButton;
facdcb ¤   ¤   ¤   break;
3887c7 ¤   ¤   ¤
c19ae3 ¤   ¤   default:
a5ffc2 ¤   ¤   ¤   pgpDebugMsg("PGPUIWarningAlertInternal(): Unsupported alert style");
d3cdcb ¤   ¤   ¤   break;
5a9371 ¤   }
5967c5 ¤
98db5b ¤   switch( alertType )
d1c7a1 ¤   {
8e97c8 ¤   ¤   case kWANoteAlertType:
03068f ¤   ¤   ¤   dialogType = kAlertNoteAlert;
4fcdcb ¤   ¤   ¤   break;
d2af5a
64336c ¤   ¤   case kWACautionAlertType:
79fd59 ¤   ¤   ¤   dialogType = kAlertCautionAlert;
25cdcb ¤   ¤   ¤   break;
ebaf5a
8552f3 ¤   ¤   case kWAStopAlertType:
1795f6 ¤   ¤   ¤   dialogType = kAlertStopAlert;
cbcdcb ¤   ¤   ¤   break;
67af5a
2c9ae3 ¤   ¤   default:
23253f ¤   ¤   ¤   pgpDebugMsg("PGPUIWarningAlertInternal(): Unsupported alert type");
a1781f ¤   ¤   ¤   dialogType = kAlertPlainAlert;
a8cdcb ¤   ¤   ¤   break;
f99371 ¤   }
8f67c5 ¤
1f7a73 ¤   frontWindow = FrontWindow();
ac94c7 ¤   if( IsntNull( frontWindow ) )
44c7a1 ¤   {
17086e ¤   ¤   saveWindowKind = GetWindowKind( frontWindow );
269519 ¤   ¤   SetWindowKind( frontWindow, kApplicationWindowKind );
889371 ¤   }
4067c5 ¤
410015 ¤   if( StandardAlert( dialogType, (StringPtr) string, NULL, &alertParams,
e66e13 ¤   ¤   ¤   ¤   &itemHit ) == noErr )
59c7a1 ¤   {
b228ab ¤   ¤   if( itemHit == kAlertStdAlertOKButton )
ee5b34 ¤   ¤   {
8816e1 ¤   ¤   ¤   dismissMessage = msg_OK;
2a0fe4 ¤   ¤   }
729371 ¤   }
7467c5 ¤
a094c7 ¤   if( IsntNull( frontWindow ) )
79c7a1 ¤   {
76bf4b ¤   ¤   SetWindowKind( frontWindow, saveWindowKind );
d49371 ¤   }
3f67c5 ¤
194852 ¤   DisposeRoutineDescriptor( alertParams.filterProc );
4e6d1e ¤   SetPort( savePort );
c7af5a
ea6552 ¤   return( dismissMessage );
4defe6 }
05af5a
d09cb9 ¤   MessageT
1a2943 PGPUIWarningAlert(
11c44d ¤   WarningAlertType ¤  alertType,
fd3cf3 ¤   WarningAlertStyle ¤ alertStyle,
e4aab3 ¤   ConstStr255Param¤   baseString,
6fb242 ¤   ConstStr255Param¤   str1,
4b5d26 ¤   ConstStr255Param¤   str2,
4c5b70 ¤   ConstStr255Param¤   str3 )
8cbb36 {
ba2e6d ¤   Str255¤ ¤   msg;
e267c5 ¤
f0e2fd ¤   InsertPStrings( baseString, str1, str2, str3, msg );
b667c5 ¤
2d3f1e ¤   return( PGPUIWarningAlertInternal( alertType, alertStyle, msg ) );
a5efe6 }
0aaf5a
aaaf5a
--9f04 000f9fbeeaf401200ca Page 3 of PGPclientLibDialogs.cp
2a67c5 ¤
099cb9 ¤   MessageT
fd2943 PGPUIWarningAlert(
57c44d ¤   WarningAlertType ¤  alertType,
3c3cf3 ¤   WarningAlertStyle ¤ alertStyle,
769228 ¤   ResID¤  ¤   ¤   ¤   stringListResID,
f31a16 ¤   short¤  ¤   ¤   ¤   stringListIndex,
43b242 ¤   ConstStr255Param¤   str1,
2a3973 ¤   ConstStr255Param¤   str2 ,
4b5b70 ¤   ConstStr255Param¤   str3 )
ffbb36 {
8d5679 ¤   Str255¤ ¤   baseString;
a02e6d ¤   Str255¤ ¤   msg;
6567c5 ¤
d5ef9b ¤   GetIndString( baseString, stringListResID, stringListIndex );
d0e2fd ¤   InsertPStrings( baseString, str1, str2, str3, msg );
dc67c5 ¤
a23f1e ¤   return( PGPUIWarningAlertInternal( alertType, alertStyle, msg ) );
f7efe6 }
cfaf5a
c55529 ¤   static PGPOptionListRef
dd4f3f NewCheckboxOption(
66520e ¤   PGPContextRef¤  context,
66ecd1 ¤   PGPUInt32¤  ¤   itemID,
643ace ¤   ResID¤  ¤   ¤   strListResID,
031c18 ¤   short¤  ¤   ¤   titleStrListIndex,
0fdd98 ¤   short¤  ¤   ¤   descStrListIndex,
e3e5c2 ¤   Boolean¤¤   ¤   initialValue,
21fb17 ¤   PGPUInt32¤  ¤   *resultPtr )
4dbb36 {
3ebc52 ¤   char¤   title[256];
88bb5f ¤   char¤   desc[256];
5daf5a
723685 ¤   GetIndCString( title, strListResID, titleStrListIndex );
8367c5 ¤
77fa7f ¤   if( descStrListIndex != 0 )
7ec7a1 ¤   {
2fbee3 ¤   ¤   GetIndCString( desc, strListResID, descStrListIndex );
319371 ¤   }
090e24 ¤   else
33c7a1 ¤   {
4e8f21 ¤   ¤   *desc = 0;
f89371 ¤   }
ba67c5 ¤
a3d523 ¤   return( PGPOUICheckbox( context, itemID, title, desc, initialValue,
29ed3d ¤   ¤   ¤   ¤   ¤   resultPtr ) );
46efe6 }
eeaf5a
ad8d8a ¤   static char *
409ad2 GetIndCStringAlloc(
5a237e ¤   ResID ¤ stringListResID,
2093d1 ¤   short ¤ stringListIndex)
8cbb36 {
1321a4 ¤   char¤   ¤   str[256];
037087 ¤   char¤   ¤   *ptr;
55c886 ¤   PGPUInt32¤  strLength;
ef67c5 ¤
1dec6c ¤   GetIndCString( str, stringListResID, stringListIndex );
5b6076 ¤   strLength = strlen( str );
ef67c5 ¤
c4be6b ¤   ptr = (char *) pgpAlloc( strLength + 1 );
01b91d ¤   if( IsntNull( ptr ) )
f4c7a1 ¤   {
bb92d6 ¤   ¤   pgpCopyMemory( str, ptr, strLength + 1 );
2d9371 ¤   }
bb67c5 ¤
bc8327 ¤   return( ptr );
04efe6 }
15af5a
265529 ¤   static PGPOptionListRef
3343ba NewPopupListOption(
f9520e ¤   PGPContextRef¤  context,
--8733 000b0572748401200ca Page 4 of PGPclientLibDialogs.cp
5aecd1 ¤   PGPUInt32¤  ¤   itemID,
9c3ace ¤   ResID¤  ¤   ¤   strListResID,
781c18 ¤   short¤  ¤   ¤   titleStrListIndex,
9add98 ¤   short¤  ¤   ¤   descStrListIndex,
894a92 ¤   short¤  ¤   ¤   firstItemStrListIndex,
81d42a ¤   short¤  ¤   ¤   lastItemStrListIndex,
19e5c2 ¤   Boolean¤¤   ¤   initialValue,
63fb17 ¤   PGPUInt32¤  ¤   *resultPtr )
36bb36 {
e48a73 ¤   char¤   ¤   ¤   ¤   title[256];
972118 ¤   char¤   ¤   ¤   ¤   desc[256];
478033 ¤   char¤   ¤   ¤   ¤   *listItems[32];
3a44d9 ¤   PGPUInt32¤  ¤   ¤   numListItems;
25e56f ¤   PGPUInt32 ¤ ¤   ¤   listIndex;
b03ddd ¤   PGPOptionListRef¤   optionList;
3867c5 ¤
7f8d7d ¤   numListItems = lastItemStrListIndex - firstItemStrListIndex + 1;
a2d947 ¤   pgpAssert( numListItems <= 32 );
ab67c5 ¤
003685 ¤   GetIndCString( title, strListResID, titleStrListIndex );
b767c5 ¤
59fa7f ¤   if( descStrListIndex != 0 )
00c7a1 ¤   {
e9bee3 ¤   ¤   GetIndCString( desc, strListResID, descStrListIndex );
849371 ¤   }
f50e24 ¤   else
87c7a1 ¤   {
068f21 ¤   ¤   *desc = 0;
469371 ¤   }
2567c5 ¤
7ca0ff ¤   pgpClearMemory( listItems, sizeof( listItems ) );
a967c5 ¤
fde538 ¤   for( listIndex = 0; listIndex < numListItems; listIndex++ )
cfc7a1 ¤   {
448410 ¤   ¤   listItems[listIndex] = GetIndCStringAlloc( strListResID,
da17b0 ¤   ¤   ¤   ¤   ¤   firstItemStrListIndex + listIndex );
816e3d ¤   ¤   pgpAssert( IsntNull( listItems[listIndex] ) );
739371 ¤   }
1467c5 ¤
bc0c1c ¤   optionList = PGPOUIPopupList( context, itemID, title, desc, numListItems,
4040db ¤   ¤   ¤   ¤   ¤   listItems, initialValue, resultPtr );
50ae30 ¤   ¤   ¤   ¤   ¤
dce538 ¤   for( listIndex = 0; listIndex < numListItems; listIndex++ )
f1c7a1 ¤   {
875652 ¤   ¤   /* PGPOUIPopupList() copied our strings. Free our copies */
9285a8 ¤   ¤   if( IsntNull( listItems[listIndex] ) )
bbcd64 ¤   ¤   ¤   pgpFree( listItems[listIndex] );
569371 ¤   }
d8af5a
328233 ¤   return( optionList );
eeefe6 }
41af5a
465529 ¤   static PGPOptionListRef
e34dfc TextOutputCheckboxOptionList(
b435f6 ¤   PGPContextRef ¤ context,
0eecd1 ¤   PGPUInt32¤  ¤   itemID,
00bf31 ¤   PGPBoolean¤ ¤   checked,
a33cb7 ¤   PGPUInt32¤  ¤   *resultPtr)
52bb36 {
6303e4 ¤   return( NewCheckboxOption( context, itemID, kOptionDialogStringListResID,
8619d2 ¤   ¤   ¤   ¤   ¤   kTextOutputTitleStrIndex, kTextOutputDescStrIndex,
0f02b0 ¤   ¤   ¤   ¤   ¤   checked, resultPtr ) );
27efe6 }
7eaf5a
185529 ¤   static PGPOptionListRef
9c438c DetachedSignatureCheckboxOptionList(
ad35f6 ¤   PGPContextRef ¤ context,
23ecd1 ¤   PGPUInt32¤  ¤   itemID,
0ebf31 ¤   PGPBoolean¤ ¤   checked,
e93cb7 ¤   PGPUInt32¤  ¤   *resultPtr)
ecbb36 {
b003e4 ¤   return( NewCheckboxOption( context, itemID, kOptionDialogStringListResID,
--b468 0008d4f1ae4401200ca Page 5 of PGPclientLibDialogs.cp
216dbd ¤   ¤   ¤   ¤   ¤   kDetachedSignatureTitleStrIndex,
fc7980 ¤   ¤   ¤   ¤   ¤   kDetachedSignatureDescStrIndex, checked, resultPtr ) );
8cefe6 }
36af5a
ad5529 ¤   static PGPOptionListRef
2c1265 ConvEncryptCheckboxOptionList(
2535f6 ¤   PGPContextRef ¤ context,
1eecd1 ¤   PGPUInt32¤  ¤   itemID,
63bf31 ¤   PGPBoolean¤ ¤   checked,
593cb7 ¤   PGPUInt32¤  ¤   *resultPtr)
72bb36 {
9b03e4 ¤   return( NewCheckboxOption( context, itemID, kOptionDialogStringListResID,
873acd ¤   ¤   ¤   ¤   ¤   kConvEncryptTitleStrIndex, kConvEncryptDescStrIndex,
7e02b0 ¤   ¤   ¤   ¤   ¤   checked, resultPtr ) );
0befe6 }
69af5a
d45529 ¤   static PGPOptionListRef
730f6a FYEOCheckboxOptionList(
6035f6 ¤   PGPContextRef ¤ context,
d2ecd1 ¤   PGPUInt32¤  ¤   itemID,
21bf31 ¤   PGPBoolean¤ ¤   checked,
b13cb7 ¤   PGPUInt32¤  ¤   *resultPtr)
cabb36 {
af03e4 ¤   return( NewCheckboxOption( context, itemID, kOptionDialogStringListResID,
566a9d ¤   ¤   ¤   ¤   ¤   kFYEOTitleStrIndex, kFYEODescStrIndex,
5e02b0 ¤   ¤   ¤   ¤   ¤   checked, resultPtr ) );
09efe6 }
43af5a
6c5529 ¤   static PGPOptionListRef
fe6a37 WipeOriginalCheckboxOptionList(
5635f6 ¤   PGPContextRef ¤ context,
7becd1 ¤   PGPUInt32¤  ¤   itemID,
0dbf31 ¤   PGPBoolean¤ ¤   checked,
f13cb7 ¤   PGPUInt32¤  ¤   *resultPtr)
50bb36 {
a703e4 ¤   return( NewCheckboxOption( context, itemID, kOptionDialogStringListResID,
08719b ¤   ¤   ¤   ¤   ¤   kWipeOriginalTitleStrIndex, kWipeOriginalDescStrIndex,
ae02b0 ¤   ¤   ¤   ¤   ¤   checked, resultPtr ) );
d4efe6 }
a2af5a
2d5529 ¤   static PGPOptionListRef
8b3b04 MacBinaryPopupOptionList(
8135f6 ¤   PGPContextRef ¤ context,
97ecd1 ¤   PGPUInt32¤  ¤   itemID,
c5013a ¤   PGPUInt32¤  ¤   initialValue,
623cb7 ¤   PGPUInt32¤  ¤   *resultPtr)
1dbb36 {
ebe324 ¤   return( NewPopupListOption( context, itemID, kOptionDialogStringListResID,
76a717 ¤   ¤   ¤   ¤   ¤   kMacBinaryTitleStrIndex, kMacBinaryDescStrIndex,
84f217 ¤   ¤   ¤   ¤   ¤   kFirstMacBinaryMenuItemStrIndex,
e2ce6b ¤   ¤   ¤   ¤   ¤   kLastMacBinaryMenuItemStrIndex,
1569a4 ¤   ¤   ¤   ¤   ¤   initialValue, resultPtr ) );
efefe6 }
55af5a
061964 ¤   static PGPUInt32
b53e2a GetMacBinaryPopupInitialValue(
c92e0d ¤   PGPGetPassphraseSettings¤   defaultSettings,
dfc2ff ¤   PGPPrefRef¤ ¤   ¤   ¤   ¤   clientPrefsRef)
33bb36 {
eb97e9 ¤   PGPUInt32¤  macBinaryMenuItem;
9967c5 ¤
b751b5 ¤   /* MacBinary always on by default */
31b95b ¤   macBinaryMenuItem = kMacBinaryPopupYesMenuItem;
3faf5a
c60627 ¤   if ( ( defaultSettings & kPGPUISettingsNoMacBinary ) != 0 )
75c7a1 ¤   {
e8c8d5 ¤   ¤   macBinaryMenuItem = kMacBinaryPopupNoneMenuItem;
199371 ¤   }
57c3be ¤   else if ( ( defaultSettings & kPGPUISettingsSmartMacBinary ) != 0 )
10c7a1 ¤   {
f13dfa ¤   ¤   macBinaryMenuItem = kMacBinaryPopupSmartMenuItem;
8d9371 ¤   }
--9687 00035875427401200ca Page 6 of PGPclientLibDialogs.cp
245795 ¤   else if ( ( defaultSettings & kPGPUISettingsForceMacBinary ) != 0 )
55c7a1 ¤   {
07ecf7 ¤   ¤   macBinaryMenuItem = kMacBinaryPopupYesMenuItem;
069371 ¤   }
940e24 ¤   else
aec7a1 ¤   {
69290d ¤   ¤   PGPUInt32¤  macBinaryPref;
e71b52 ¤   ¤
9d61b6 ¤   ¤   if( IsntPGPError( PGPGetPrefNumber( clientPrefsRef,
e0b5a0 ¤   ¤   ¤   ¤   kPGPPrefMacBinaryDefault, &macBinaryPref ) ) )
b05b34 ¤   ¤   {
de5bea ¤   ¤   ¤   switch( macBinaryPref )
3bf776 ¤   ¤   ¤   {
7abf8d ¤   ¤   ¤   ¤   case kPGPPrefMacBinaryOff:
c2be0c ¤   ¤   ¤   ¤   ¤   macBinaryMenuItem = kMacBinaryPopupNoneMenuItem;
4c14c3 ¤   ¤   ¤   ¤   ¤   break;
e12b85 ¤   ¤   ¤   ¤
45ef46 ¤   ¤   ¤   ¤   case kPGPPrefMacBinarySmart:
3a76c0 ¤   ¤   ¤   ¤   ¤   macBinaryMenuItem = kMacBinaryPopupSmartMenuItem;
be14c3 ¤   ¤   ¤   ¤   ¤   break;
94a3a6 ¤   ¤   ¤   }
3e0fe4 ¤   ¤   }
4d9371 ¤   }
1a67c5 ¤
e1b518 ¤   return( macBinaryMenuItem );
a1efe6 }
6f67c5 ¤
e366dd ¤   static PGPError
8de9d5 pgpClientSigningPassphraseDialog(
4f883c ¤   PGPContextRef¤  ¤   ¤   ¤   context,
7aa750 ¤   PGPPrefRef¤ ¤   ¤   ¤   ¤   clientPrefsRef,¤¤   ¤   ¤
90356e ¤   PGPKeySetRef¤   ¤   ¤   ¤   allKeys,¤   ¤   ¤   ¤
e53e0c ¤   const char ¤¤   ¤   ¤   ¤   *prompt,¤   ¤   ¤   ¤
c02d07 ¤   PGPGetPassphraseOptions¤¤   dialogOptions,¤ ¤   ¤
d46f39 ¤   PGPGetPassphraseSettings¤   defaultSettings,¤   ¤
eab3f9 ¤   PGPKeyRef¤  ¤   ¤   ¤   ¤   defaultSigningKey,¤ ¤
36a8a4 ¤   char¤   ¤   ¤   ¤   ¤   ¤   passphrase[256],
ab52ef ¤   PGPGetPassphraseSettings¤   *userSettings,¤ ¤   ¤
29ead4 ¤   PGPKeyRef ¤ ¤   ¤   ¤   ¤   *actualSigningKey)
d7bb36 {
188f52 ¤   PGPError¤   ¤   ¤   err;
33ece0 ¤   PGPOptionListRef¤   optionList = kInvalidPGPOptionListRef;
f97bcd ¤   char¤   ¤   ¤   ¤   *allocatedPassphrase = NULL;
d667c5 ¤
f17db5 ¤   *passphrase = 0;
6a67c5 ¤
e49b1f ¤   err = PGPBuildOptionList( context, &optionList,
4af2d4 ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( context, &allocatedPassphrase ),
0e929d ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
a5b1f0 ¤   if( IsntPGPError( err ) )
d1c7a1 ¤   {
a1b64a ¤   ¤   PGPUInt32¤  detachedSignature¤  = 0;
121a24 ¤   ¤   PGPUInt32¤  textOutput¤ ¤   ¤   = 0;
40488a ¤   ¤   PGPUInt32¤  macBinary¤  ¤   ¤   = 0;
d222b7 ¤   ¤   Boolean¤¤   haveFileOptions ¤   = FALSE;
e9af5a
0429f9 ¤   ¤   if( IsntNull( prompt ) )
1e5b34 ¤   ¤   {
34bab6 ¤   ¤   ¤   err = PGPAppendOptionList( optionList,
a7b4f9 ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt( context, prompt ),
9d931b ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
930fe4 ¤   ¤   }
b71b52 ¤   ¤
a9144f ¤   ¤   if( IsntPGPError( err ) &&
f46a94 ¤   ¤   ¤   ( dialogOptions & kPGPGetPassphraseOptionsHideFileOptions ) == 0 )
e75b34 ¤   ¤   {
4661cd ¤   ¤   ¤   /* Setup options dialog */
d587c7 ¤   ¤   ¤
6f9a0b ¤   ¤   ¤   haveFileOptions = TRUE;
dcaf5a
9f0881 ¤   ¤   ¤   if( (defaultSettings & kPGPGetPassphraseSettingsDetachedSig) != 0 )
35e65f ¤   ¤   ¤   ¤   detachedSignature = 1;
--9016 0001e449af2401200ca Page 7 of PGPclientLibDialogs.cp
e0af5a
39949e ¤   ¤   ¤   if( (defaultSettings & kPGPUISettingsTextOutput) != 0 )
c7081e ¤   ¤   ¤   ¤   textOutput = 1;
7a87c7 ¤   ¤   ¤
f7a419 ¤   ¤   ¤   macBinary = GetMacBinaryPopupInitialValue( defaultSettings,
1adacd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   clientPrefsRef );
57da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
f6bab6 ¤   ¤   ¤   err = PGPAppendOptionList( optionList,
1401cf ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogOptions( context,
e48be4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   DetachedSignatureCheckboxOptionList( context, 1,
30e1c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   detachedSignature, &detachedSignature ),
b304bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   TextOutputCheckboxOptionList( context, 2,
afbe47 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   textOutput, &textOutput ),
3ea514 ¤   ¤   ¤   ¤   ¤   ¤   ¤   MacBinaryPopupOptionList( context, 3, macBinary,
d8090e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &macBinary ),
6024b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) ),
ee931b ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
a20fe4 ¤   ¤   }
d2af5a
2e86f8 ¤   ¤   if( IsntPGPError( err ) )
075b34 ¤   ¤   {
6520c1 ¤   ¤   ¤   err = PGPSigningPassphraseDialog( context, allKeys,
46065e ¤   ¤   ¤   ¤   ¤   ¤   actualSigningKey,
e70bee ¤   ¤   ¤   ¤   ¤   ¤   optionList,
ff701c ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDefaultKey( context, defaultSigningKey ),
e7931b ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
f50fe4 ¤   ¤   }
0eaf5a
fba4b5 ¤   ¤   if( haveFileOptions && ( IsntPGPError( err ) ||
3c5c13 ¤   ¤   ¤   ¤   err == kPGPError_KeyUnusableForSignature ) )
7d5b34 ¤   ¤   {
4004e3 ¤   ¤   ¤   *userSettings = 0;
d187c7 ¤   ¤   ¤
3cf335 ¤   ¤   ¤   if( detachedSignature != 0 )
0233f6 ¤   ¤   ¤   ¤   *userSettings |= kPGPGetPassphraseSettingsDetachedSig;
c82b85 ¤   ¤   ¤   ¤
fb066c ¤   ¤   ¤   if( textOutput != 0 )
67983c ¤   ¤   ¤   ¤   *userSettings |= kPGPUISettingsTextOutput;
b92b85 ¤   ¤   ¤   ¤
97bb6d ¤   ¤   ¤   if( macBinary == kMacBinaryPopupNoneMenuItem )
118cf3 ¤   ¤   ¤   {¤
a71e00 ¤   ¤   ¤   ¤   *userSettings |= kPGPUISettingsNoMacBinary;
77a3a6 ¤   ¤   ¤   }
86f5de ¤   ¤   ¤   else if( macBinary == kMacBinaryPopupSmartMenuItem )
e6f776 ¤   ¤   ¤   {
050c95 ¤   ¤   ¤   ¤   *userSettings |= kPGPUISettingsSmartMacBinary;
7ca3a6 ¤   ¤   ¤   }
cdbb8c ¤   ¤   ¤   else
05f776 ¤   ¤   ¤   {
810122 ¤   ¤   ¤   ¤   *userSettings |= kPGPUISettingsForceMacBinary;
34a3a6 ¤   ¤   ¤   }
350fe4 ¤   ¤   }
6b1b52 ¤   ¤
95ecfe ¤   ¤   CopyCString( allocatedPassphrase, passphrase );
321b52 ¤   ¤
20153d ¤   ¤   PGPFreeOptionList( optionList );
6f9371 ¤   }
fb67c5 ¤
33edc9 ¤   if( IsntNull( allocatedPassphrase ) )
ecce17 ¤   ¤   PGPFreeData( allocatedPassphrase );
e01b52 ¤   ¤
dcdeb7 ¤   return( err );
b9efe6 }
36af5a
b5c744 ¤   PGPError
a75299 PGPClientSigningPassphraseDialog(
7149b2 ¤   PGPContextRef¤  ¤   ¤   ¤   context,¤   ¤   ¤   ¤
fc356e ¤   PGPKeySetRef¤   ¤   ¤   ¤   allKeys,¤   ¤   ¤   ¤
ec3e0c ¤   const char ¤¤   ¤   ¤   ¤   *prompt,¤   ¤   ¤   ¤
5c2d07 ¤   PGPGetPassphraseOptions¤¤   dialogOptions,¤ ¤   ¤
f96f39 ¤   PGPGetPassphraseSettings¤   defaultSettings,¤   ¤
1eb3f9 ¤   PGPKeyRef¤  ¤   ¤   ¤   ¤   defaultSigningKey,¤ ¤
--4db3 000b2c117db401200ca Page 8 of PGPclientLibDialogs.cp
87a8a4 ¤   char¤   ¤   ¤   ¤   ¤   ¤   passphrase[256],
4a52ef ¤   PGPGetPassphraseSettings¤   *userSettings,¤ ¤   ¤
e8ead4 ¤   PGPKeyRef ¤ ¤   ¤   ¤   ¤   *actualSigningKey)
6cbb36 {
e58f52 ¤   PGPError¤   ¤   ¤   err;
7b9a69 ¤   PGPclientLibState¤  state;
551b52 ¤   ¤
e2658f ¤   if ( IsntNull( passphrase ) )
14d96a ¤   ¤   *passphrase¤= 0;
9bdc9f ¤   if ( IsntNull( actualSigningKey ) )
e2ff54 ¤   ¤   *actualSigningKey = NULL;
80ce49 ¤   if ( IsntNull( userSettings ) )
d04dbc ¤   ¤   pgpClearMemory( userSettings, sizeof( *userSettings ) );
c21b52 ¤   ¤
f9bed6 ¤   PGPValidatePtr( passphrase );
8dd361 ¤   pgpClearMemory( passphrase, 256 );
b65efd ¤   PGPValidatePtr( userSettings );
784b38 ¤   PGPValidatePtr( actualSigningKey );
f367c5 ¤
38b927 ¤   AssertAddrNullOrValid( prompt, uchar, "PGPClientSigningPassphraseDialog" );
0daf07 ¤   AssertAddrNullOrValid( defaultSigningKey, VoidAlign,
53c1d0 ¤   ¤   ¤   ¤   "PGPClientSigningPassphraseDialog" );
8067c5 ¤
8be5fd ¤   err = EnterPGPclientLib( context, &state );
53b1f0 ¤   if( IsntPGPError( err ) )
f8c7a1 ¤   {
ed6b87 ¤   ¤   err = pgpClientSigningPassphraseDialog( context, state.clientPrefsRef,
e326f7 ¤   ¤   ¤   ¤   ¤   ¤   allKeys, prompt, dialogOptions, defaultSettings,
16e1d7 ¤   ¤   ¤   ¤   ¤   ¤   defaultSigningKey, passphrase, userSettings,
b2aaea ¤   ¤   ¤   ¤   ¤   ¤   actualSigningKey );
d19371 ¤   }
3c67c5 ¤
955df5 ¤   ExitPGPclientLib( &state );
b267c5 ¤
69deb7 ¤   return( err );
fbefe6 }
31af5a
08be29 #if PGP_BUSINESS_SECURITY
cbaf5a
9e66dd ¤   static PGPError
ec233a SetupOutgoingADK(
dda1bc ¤   PGPContextRef¤  ¤   context,
9fe88c ¤   PGPOptionListRef¤   recipientOptions,
9d923e ¤   PGPPrefRef¤ ¤   ¤   adminPrefsRef,
d54079 ¤   PGPKeySetRef¤   ¤   allKeys)
efbb36 {
d88e12 ¤   PGPError¤   err = kPGPError_NoErr;
ae1483 ¤   PGPBoolean¤ haveOutgoingADK;
2067c5 ¤
9b3369 ¤   err = PGPGetPrefBoolean( adminPrefsRef, kPGPPrefUseOutgoingADK,
518fce ¤   ¤   ¤   ¤   ¤   ¤   &haveOutgoingADK );
838bc0 ¤   if( IsntPGPError( err ) && haveOutgoingADK )
7cc7a1 ¤   {
a3a8c2 ¤   ¤   PGPByte¤¤   *adKeyID;
790cbe ¤   ¤   PGPSize¤¤   adKeyIDSize;
0ce96f ¤   ¤   PGPBoolean¤ enforceOutgoingADK;
11da2e ¤   ¤   PGPKeyRef¤  outgoingADK = kInvalidPGPKeyRef;
dd1b52 ¤   ¤
829bfa ¤   ¤   if( IsPGPError( PGPGetPrefBoolean( adminPrefsRef,
c4f1bd ¤   ¤   ¤   ¤   ¤   kPGPPrefEnforceOutgoingADK, &enforceOutgoingADK ) ) )
445b34 ¤   ¤   {
38134e ¤   ¤   ¤   enforceOutgoingADK = TRUE;
990fe4 ¤   ¤   }
1b1b52 ¤   ¤
49aadb ¤   ¤   err = PGPGetPrefData( adminPrefsRef, kPGPPrefOutgoingADKID,
734991 ¤   ¤   ¤   ¤   ¤   ¤   &adKeyIDSize, &adKeyID );
a586f8 ¤   ¤   if( IsntPGPError( err ) )
c85b34 ¤   ¤   {
9cb97f ¤   ¤   ¤   PGPKeyID¤   keyID;
fc4235 ¤   ¤   ¤   PGPUInt32¤  outADKKeyAlgorithm;
e787c7 ¤   ¤   ¤
b216c2 ¤   ¤   ¤   err = PGPGetPrefNumber( adminPrefsRef,
--69c5 0008c1249ae401200ca Page 9 of PGPclientLibDialogs.cp
7613b3 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefOutADKPublicKeyAlgorithm,
657600 ¤   ¤   ¤   ¤   ¤   ¤   &outADKKeyAlgorithm );
5c698b ¤   ¤   ¤   if( IsntPGPError( err ) )
eff776 ¤   ¤   ¤   {
f43ba4 ¤   ¤   ¤   ¤   err = PGPImportKeyID( adKeyID, &keyID );
e92b85 ¤   ¤   ¤   ¤
a15565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
bc72c3 ¤   ¤   ¤   ¤   {
45d2e4 ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyByKeyID( allKeys, &keyID,
d577f3 ¤   ¤   ¤   ¤   ¤   ¤   (PGPPublicKeyAlgorithm) outADKKeyAlgorithm,
640ed5 ¤   ¤   ¤   ¤   ¤   ¤   &outgoingADK );
f52613 ¤   ¤   ¤   ¤   }
15a3a6 ¤   ¤   ¤   }
8087c7 ¤   ¤   ¤
e7bf79 ¤   ¤   ¤   (void) PGPDisposePrefData( adminPrefsRef, adKeyID);
400fe4 ¤   ¤   }
bb1b52 ¤   ¤
52144f ¤   ¤   if( IsntPGPError( err ) &&
e0faf8 ¤   ¤   ¤   PGPKeyRefIsValid( outgoingADK ) )
845b34 ¤   ¤   {
885b84 ¤   ¤   ¤   PGPRecipientSpec¤   spec;
111b52 ¤   ¤
edc42b ¤   ¤   ¤   pgpClearMemory( &spec, sizeof( spec ) );
ed87c7 ¤   ¤   ¤
92df63 ¤   ¤   ¤   spec.type¤  = kPGPRecipientSpecType_Key;
a5306c ¤   ¤   ¤   spec.locked¤= enforceOutgoingADK;
4296b8 ¤   ¤   ¤   spec.u.key¤ = outgoingADK;
d187c7 ¤   ¤   ¤
ab3fe7 ¤   ¤   ¤   err = PGPAppendOptionList( recipientOptions,
658c96 ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDefaultRecipients( context, 1, &spec ),
68931b ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
c40fe4 ¤   ¤   }
f00e1d ¤   ¤   else
6b5b34 ¤   ¤   {
149654 ¤   ¤   ¤   if( enforceOutgoingADK )
9ff776 ¤   ¤   ¤   {
2a4b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
162b85 ¤   ¤   ¤   ¤
bad435 ·¤  ¤   ¤   ¤   PGPUIWarningAlert( kWACautionAlertType,
5ba9e4 ·¤  ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
9474e7 ¤   ¤   ¤   ¤   ¤   ¤   kRecipientDialogStringListResID,
be79ca ¤   ¤   ¤   ¤   ¤   ¤   kCorporateADKDisabledOrMissingStrIndex );
282b85 ¤   ¤   ¤   ¤
c34067 ¤   ¤   ¤   ¤   err = kPGPError_UserAbort;
c9a3a6 ¤   ¤   ¤   }
36bb8c ¤   ¤   ¤   else
10f776 ¤   ¤   ¤   {
b2bd37 ¤   ¤   ¤   ¤   err = kPGPError_NoErr;
73a3a6 ¤   ¤   ¤   }
b90fe4 ¤   ¤   }
ee9371 ¤   }
b567c5 ¤
12deb7 ¤   return( err );
5cefe6 }
b5af5a
9866dd ¤   static PGPError
678fcc SetupAdminParams(
52a1bc ¤   PGPContextRef¤  ¤   context,
eee88c ¤   PGPOptionListRef¤   recipientOptions,
97923e ¤   PGPPrefRef¤ ¤   ¤   adminPrefsRef,
5c4079 ¤   PGPKeySetRef¤   ¤   allKeys)
45bb36 {
c27d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
7667c5 ¤
c7517e ¤   pgpAssert( PGPPrefRefIsValid( adminPrefsRef ) );
8967c5 ¤
7f35ab ¤   err = SetupOutgoingADK( context, recipientOptions, adminPrefsRef,
c9c6d1 ¤   ¤   ¤   ¤   allKeys );
687f7d ¤   if( IsPGPError( err ) )
4cc7a1 ¤   {
bb67c5 ¤
8c9371 ¤   }
--eb2e 000d4543523401200ca Page 10 of PGPclientLibDialogs.cp
2a67c5 ¤
4fdeb7 ¤   return( err );
29efe6 }
02af5a
7b66dd ¤   static PGPError
8f149a HaveUnsignedRecipient(
ce0642 ¤   PGPKeySetRef¤   allKeys,
5b174e ¤   PGPKeySetRef¤   recipients,
397f2d ¤   PGPKeyRef¤  ¤   corporateKey,
4270e9 ¤   PGPBoolean¤ ¤   *haveUnsignedKeyPtr )
5ebb36 {
2ffb19 ¤   PGPError¤   ¤   err;
505445 ¤   PGPKeyListRef¤  keyList;
0abef6 ¤   PGPBoolean¤ ¤   haveUnsignedKey = FALSE;
c11b52 ¤   ¤
fa1ba4 ¤   err = PGPOrderKeySet( recipients, kPGPAnyOrdering, &keyList );
6eb1f0 ¤   if( IsntPGPError( err ) )
73c7a1 ¤   {
aece0f ¤   ¤   PGPKeyIterRef¤  iter;
65af5a
31aaa0 ¤   ¤   err = PGPNewKeyIter( keyList, &iter );
f986f8 ¤   ¤   if( IsntPGPError( err ) )
635b34 ¤   ¤   {
4b9a09 ¤   ¤   ¤   PGPKeyRef¤  ¤   key;
a587c7 ¤   ¤   ¤
973708 ¤   ¤   ¤   err = PGPKeyIterNext( iter, &key );
8aa94a ¤   ¤   ¤   while( IsntPGPError( err ) && ! haveUnsignedKey )
cdf776 ¤   ¤   ¤   {
30e087 ¤   ¤   ¤   ¤   PGPUserIDRef¤   userID;
bf4deb ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   signedByCorporateKey = FALSE;
bf2b85 ¤   ¤   ¤   ¤
e93ab9 ¤   ¤   ¤   ¤   /* check all user ids for a corporate sig */
fc6985 ¤   ¤   ¤   ¤   /* only one need be signed to qualify */
7e2b85 ¤   ¤   ¤   ¤
9a84ab ¤   ¤   ¤   ¤   err = PGPKeyIterNextUserID( iter, &userID );
e6101d ¤   ¤   ¤   ¤   while( IsntPGPError( err ) && ! signedByCorporateKey )
5472c3 ¤   ¤   ¤   ¤   {
e0306c ¤   ¤   ¤   ¤   ¤   PGPSigRef¤  sig;
5fae30 ¤   ¤   ¤   ¤   ¤
9ba048 ¤   ¤   ¤   ¤   ¤   err = PGPKeyIterNextUIDSig( iter, &sig );
09c0b6 ¤   ¤   ¤   ¤   ¤   while( IsntPGPError( err ) && ! signedByCorporateKey )
6b4859 ¤   ¤   ¤   ¤   ¤   {
561b15 ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef¤  certifierKey;
93ae30 ¤   ¤   ¤   ¤   ¤
2442bc ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( PGPGetSigCertifierKey( sig,
39a7c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   allKeys, &certifierKey ) ) )
508fec ¤   ¤   ¤   ¤   ¤   ¤   {
b15ec9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( PGPCompareKeys( certifierKey, corporateKey,
adf405 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyIDOrdering ) == 0 )
3e06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
3a9fd4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signedByCorporateKey = TRUE;
1fcd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
a75268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
9fdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
63ae30 ¤   ¤   ¤   ¤   ¤
4c239e ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
170972 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPKeyIterNextUIDSig( iter, &sig );
041c89 ¤   ¤   ¤   ¤   ¤   }
64ae30 ¤   ¤   ¤   ¤   ¤
3b1969 ¤   ¤   ¤   ¤   ¤   if ( err == kPGPError_EndOfIteration )
5d8a24 ¤   ¤   ¤   ¤   ¤   ¤   err¤= kPGPError_NoErr;
b6af5a
716ca0 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
27d4c7 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPKeyIterNextUserID( iter, &userID );
892613 ¤   ¤   ¤   ¤   }
8baf5a
781e52 ¤   ¤   ¤   ¤   if ( err == kPGPError_EndOfIteration )
d41bbc ¤   ¤   ¤   ¤   ¤   err¤= kPGPError_NoErr;
7d2b85 ¤   ¤   ¤   ¤
579e84 ¤   ¤   ¤   ¤   if( ! signedByCorporateKey )
176bfb ¤   ¤   ¤   ¤   ¤   haveUnsignedKey = TRUE;
d4ae30 ¤   ¤   ¤   ¤   ¤
--43c3 0007dd261fa401200ca Page 11 of PGPclientLibDialogs.cp
9c5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
f7f4e5 ¤   ¤   ¤   ¤   ¤   err = PGPKeyIterNext( iter, &key );
82a3a6 ¤   ¤   ¤   }
0f87c7 ¤   ¤   ¤
850f75 ¤   ¤   ¤   if ( err == kPGPError_EndOfIteration )
0815f0 ¤   ¤   ¤   ¤   err¤= kPGPError_NoErr;
b72b85 ¤   ¤   ¤   ¤
2e37e7 ¤   ¤   ¤   PGPFreeKeyIter( iter );
a90fe4 ¤   ¤   }
041b52 ¤   ¤
426efb ¤   ¤   PGPFreeKeyList( keyList );
2a9371 ¤   }
d267c5 ¤
458a7b ¤   *haveUnsignedKeyPtr = haveUnsignedKey;
0e67c5 ¤
44deb7 ¤   return( err );
f2efe6 }
7daf5a
a297b2 #endif¤ // PGP_BUSINESS_SECURITY
c6af5a
4066dd ¤   static PGPError
a1c116 pgpClientRecipientDialog(
4c09ea ¤   PGPContextRef¤  ¤   ¤   context,¤   ¤   ¤   ¤   ¤
bf0dc6 ¤   PGPPrefRef¤ ¤   ¤   ¤   clientPrefsRef,¤¤   ¤   ¤
59b4df ¤   PGPPrefRef¤ ¤   ¤   ¤   adminPrefsRef,¤ ¤   ¤   ¤
1c5175 ¤   PGPtlsContextRef¤   ¤   tlsContext,
af0822 ¤   PGPKeySetRef¤   ¤   ¤   allKeys,¤   ¤   ¤   ¤   ¤
514043 ¤   PGPUInt32¤  ¤   ¤   ¤   numDefaultRecipients,¤  ¤
02b2b1 ¤   const PGPRecipientSpec¤ *defaultRecipients,¤¤   ¤
728f18 ¤   PGPRecipientOptions¤¤   dialogOptions,¤ ¤   ¤   ¤
b2cf38 ¤   PGPRecipientSettings¤   defaultSettings,
61085b ¤   PGPRecipientSettings¤   *userSettings,¤ ¤   ¤
4c2c2c ¤   PGPKeySetRef¤   ¤   ¤   *actualRecipients,¤ ¤   ¤
1a3923 ¤   PGPKeySetRef¤   ¤   ¤   *newKeys)
86bb36 {
e15cca ¤   PGPError¤   ¤   ¤   ¤   ¤   ¤   err = kPGPError_NoErr;
17f1f9 ¤   PGPOptionListRef¤   ¤   ¤   ¤   recipientOptions;
ae4a67 ¤   PGPBoolean¤ ¤   ¤   ¤   ¤   ¤   showMarginalValidity;
73338f ¤   PGPBoolean¤ ¤   ¤   ¤   ¤   ¤   marginalIsInvalid;
fb2d4e ¤   PGPBoolean¤ ¤   ¤   ¤   ¤   ¤   forceShowDialog;
415a81 ¤   StPGPPreserveKeyServerStorage¤  keyserverStorage;
64af5a
7067c5 ¤
b5f398 ¤   (void) adminPrefsRef;
7c67c5 ¤
00403a ¤   if( IsntNull( newKeys ) )
a6ccf9 ¤   ¤   *newKeys = kInvalidPGPKeySetRef;
891b52 ¤   ¤
0abb32 ¤   if( ( dialogOptions & kPGPRecipientOptionsAlwaysShowDialog ) != 0 )
1dc7a1 ¤   {
f409e1 ¤   ¤   forceShowDialog = TRUE;
369371 ¤   }
0f0e24 ¤   else
edc7a1 ¤   {
b75090 ¤   ¤   forceShowDialog = ( numDefaultRecipients == 0 );;
a09371 ¤   }
2e67c5 ¤
9c4be9 ¤   (void) PGPGetPrefBoolean( clientPrefsRef, kPGPPrefDisplayMarginalValidity,
8078f6 ¤   ¤   ¤   ¤   &showMarginalValidity);
f76e27 ¤   (void) PGPGetPrefBoolean( clientPrefsRef, kPGPPrefMarginalIsInvalid,
4a3f26 ¤   ¤   ¤   ¤   &marginalIsInvalid);
33af5a
c9f183 ¤   err = PGPBuildOptionList( context, &recipientOptions,
55167b ¤   ¤   ¤   ¤   PGPOUIDisplayMarginalValidity( context, showMarginalValidity ),
fa75e7 ¤   ¤   ¤   ¤   PGPOUIIgnoreMarginalValidity( context, marginalIsInvalid ),
c0929d ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
fdb1f0 ¤   if( IsntPGPError( err ) )
0dc7a1 ¤   {
285208 ¤   ¤   PGPBoolean¤ ¤   ¤   allowConvEncrypt ¤  = TRUE;
346f0e ¤   ¤   PGPKeyServerEntry¤  *ksEntries ¤¤   ¤   = NULL;
ce1adc ¤   ¤   PGPKeyServerSpec¤   *serverList ¤   ¤   = NULL;
7dd146 ¤   ¤   PGPUInt32¤  ¤   ¤   numKSEntries ¤  ¤   = 0;
--61c8 000308efc69401200ca Page 12 of PGPclientLibDialogs.cp
ffbbd1 ¤   ¤   PGPUInt32¤  ¤   ¤   serverIndex;
041b52 ¤   ¤
04377d ¤   #if PGP_BUSINESS_SECURITY
cd7e5b ¤   ¤   PGPKeyRef¤  ¤   ¤   corporateKeyRef ¤   ¤   = kInvalidPGPKeyRef;
f64d1c ¤   ¤   PGPBoolean¤ ¤   ¤   warnNotSignedByCorpKey¤ = FALSE;
e7b7ec ¤   #endif
2867c5 ¤
8853db ¤   ¤   PGPAdditionalRecipientRequestEnforcement¤   arrEnforcement;
dc1b52 ¤   ¤
70d5d8 ¤   ¤   arrEnforcement = kPGPARREnforcement_Warn;
4d1b52 ¤   ¤
33f15e ¤   ¤   err = PGPCreateKeyServerPath( clientPrefsRef, "", &ksEntries,
8d3f64 ¤   ¤   ¤   ¤   ¤   &numKSEntries);
500ace ¤   ¤   if( IsntPGPError( err ) && IsntNull( ksEntries ) && numKSEntries > 0 )
405b34 ¤   ¤   {
852e9c ¤   ¤   ¤   serverList = (PGPKeyServerSpec *) PGPNewData(
1d0d25 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( context ),
f45e68 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numKSEntries * sizeof( *serverList ),
aa1e0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMemoryMgrFlags_Clear );
039d5e ¤   ¤   ¤   if( IsntNull( serverList ) )
9ef776 ¤   ¤   ¤   {
10998f ¤   ¤   ¤   ¤   for( serverIndex = 0; serverIndex < numKSEntries;
57ee0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   serverIndex++ )
7d72c3 ¤   ¤   ¤   ¤   {
8266da ¤   ¤   ¤   ¤   ¤   err = PGPNewKeyServerFromHostName( context,
e90b12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].serverDNS,
fa0421 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].serverPort,
03a647 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].protocol,
3cfe96 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyServerAccessType_Normal,
b65712 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyServerKeySpace_Normal,
edcd59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &serverList[serverIndex].server );
7414ec ¤   ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
7900eb ¤   ¤   ¤   ¤   ¤   ¤   break;
a6ae30 ¤   ¤   ¤   ¤   ¤
f2c502 ¤   ¤   ¤   ¤   ¤   serverList[serverIndex].serverName =
79154d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].serverDNS;
b82613 ¤   ¤   ¤   ¤   }
462b85 ¤   ¤   ¤   ¤
fa5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
dd72c3 ¤   ¤   ¤   ¤   {
379323 ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ searchForKeys = FALSE;
f9ae30 ¤   ¤   ¤   ¤   ¤
6e6cb6 ¤   ¤   ¤   ¤   ¤   (void) PGPGetPrefBoolean( clientPrefsRef,
c0bee8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefKeyServerSyncUnknownKeys, &searchForKey¶
27e519 s );
19c37b ¤   ¤   ¤   ¤   ¤   err = PGPAppendOptionList( recipientOptions,
fbd8f3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIKeyServerUpdateParams( context,
551ae0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numKSEntries, serverList, tlsContext,
60b35f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   searchForKeys, newKeys, PGPOLastOption( con¶
13a697 text ) ),
94da9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
732613 ¤   ¤   ¤   ¤   }
79a3a6 ¤   ¤   ¤   }
7fbb8c ¤   ¤   ¤   else
a4f776 ¤   ¤   ¤   {
01bfb4 ¤   ¤   ¤   ¤   err = kPGPError_OutOfMemory;
10a3a6 ¤   ¤   ¤   }
b00fe4 ¤   ¤   }
76af5a
dbe481 ¤   ¤   if( IsntPGPError( err ) && numDefaultRecipients != 0 )
0f5b34 ¤   ¤   {
8c3fe7 ¤   ¤   ¤   err = PGPAppendOptionList( recipientOptions,
2293de ¤   ¤   ¤   ¤   ¤   PGPOUIDefaultRecipients( context, numDefaultRecipients,
2b71b8 ¤   ¤   ¤   ¤   ¤   ¤   defaultRecipients ),
6ec000 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
a30fe4 ¤   ¤   }
c3af5a
7f86f8 ¤   ¤   if( IsntPGPError( err ) )
5c5b34 ¤   ¤   {
fc944c ¤   ¤   ¤   FSSpec¤ fileSpec;
6587c7 ¤   ¤   ¤
30e7e0 ¤   ¤   ¤   if( IsntPGPError( PGPGetGroupsFileFSSpec( &fileSpec ) ) )
--4770 00001286bb3401200ca Page 13 of PGPclientLibDialogs.cp
99f776 ¤   ¤   ¤   {
e981f1 ¤   ¤   ¤   ¤   PGPGroupSetRef¤ groupSet;
c12b85 ¤   ¤   ¤   ¤
2314e7 ¤   ¤   ¤   ¤   if ( IsntPGPError( PGPNewGroupSetFromFSSpec( context,
1a75ac ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fileSpec, &groupSet) ) )
7072c3 ¤   ¤   ¤   ¤   {
b5c37b ¤   ¤   ¤   ¤   ¤   err = PGPAppendOptionList( recipientOptions,
994e21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIRecipientGroups( context, groupSet ),
d6da9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
f7da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
7973b6 ¤   ¤   ¤   ¤   ¤   (void) PGPFreeGroupSet( groupSet );
5c2613 ¤   ¤   ¤   ¤   }
b6a3a6 ¤   ¤   ¤   }
470fe4 ¤   ¤   }
dc1b52 ¤   ¤
d80727 ¤   ¤   // Add default key, if set to do so.
8086f8 ¤   ¤   if( IsntPGPError( err ) )
fa5b34 ¤   ¤   {
5ea2eb ¤   ¤   ¤   PGPBoolean¤ encryptToSelf;
2487c7 ¤   ¤   ¤
a0b221 ¤   ¤   ¤   err = PGPGetPrefBoolean( clientPrefsRef, kPGPPrefEncryptToSelf,
e63f35 ¤   ¤   ¤   ¤   ¤   ¤   &encryptToSelf );
ba8eb1 ¤   ¤   ¤   if( IsntPGPError( err ) && encryptToSelf )
a3f776 ¤   ¤   ¤   {
c050db ¤   ¤   ¤   ¤   PGPKeyRef¤  defaultKey;
422b85 ¤   ¤   ¤   ¤
5e81d7 ¤   ¤   ¤   ¤   if( IsntPGPError( PGPGetDefaultPrivateKey( allKeys,
103a49 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &defaultKey ) ) )
7b72c3 ¤   ¤   ¤   ¤   {
385eaf ¤   ¤   ¤   ¤   ¤   PGPRecipientSpec¤   spec;
c12b85 ¤   ¤   ¤   ¤
8a8dad ¤   ¤   ¤   ¤   ¤   pgpClearMemory( &spec, sizeof( spec ) );
9aae30 ¤   ¤   ¤   ¤   ¤
b296e5 ¤   ¤   ¤   ¤   ¤   spec.type¤  = kPGPRecipientSpecType_Key;
0b5360 ¤   ¤   ¤   ¤   ¤   spec.u.key¤ = defaultKey;
7fae30 ¤   ¤   ¤   ¤   ¤
d4c37b ¤   ¤   ¤   ¤   ¤   err = PGPAppendOptionList( recipientOptions,
01e36a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDefaultRecipients( context, 1, &spec ),
31da9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
162613 ¤   ¤   ¤   ¤   }
14fa07 ¤   ¤   ¤   ¤   else
3872c3 ¤   ¤   ¤   ¤   {
627c97 ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
b6ae30 ¤   ¤   ¤   ¤   ¤
19ec17 ¤   ¤   ¤   ¤   ¤   PGPUIWarningAlert( kWACautionAlertType, kWAOKStyle,
0174e7 ¤   ¤   ¤   ¤   ¤   ¤   kRecipientDialogStringListResID,
77c07b ¤   ¤   ¤   ¤   ¤   ¤   kNoDefaultPrivateKeyFoundStrIndex );
ec2613 ¤   ¤   ¤   ¤   }
9ca3a6 ¤   ¤   ¤   }
5a0fe4 ¤   ¤   }
5887c7 ¤   ¤   ¤
73377d ¤   #if PGP_BUSINESS_SECURITY
7926ad ¤   ¤   if( IsntPGPError( err ) && PGPPrefRefIsValid( adminPrefsRef ) )
a25b34 ¤   ¤   {
795577 ¤   ¤   ¤   PGPBoolean¤ enforceRemoteADKClass;
c187c7 ¤   ¤   ¤
9379fa ¤   ¤   ¤   if( IsPGPError( PGPGetPrefBoolean( adminPrefsRef,
270d14 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefAllowConventionalEncryption,
666ea9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &allowConvEncrypt ) ) )
82f776 ¤   ¤   ¤   {
45e20b ¤   ¤   ¤   ¤   allowConvEncrypt = FALSE;
95a3a6 ¤   ¤   ¤   }
07af5a
caee87 ¤   ¤   ¤   if( IsntPGPError( PGPGetPrefBoolean( adminPrefsRef,
2e707a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefEnforceRemoteADKClass,
26e8fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &enforceRemoteADKClass ) ) &&
28d7a2 ¤   ¤   ¤   ¤   enforceRemoteADKClass )
c4f776 ¤   ¤   ¤   {
83f415 ¤   ¤   ¤   ¤   arrEnforcement = kPGPARREnforcement_Strict;
84a3a6 ¤   ¤   ¤   }
1087c7 ¤   ¤   ¤
01d0b4 ¤   ¤   ¤   err = SetupAdminParams( context, recipientOptions, adminPrefsRef,
--76e6 0001953d597401200ca Page 14 of PGPclientLibDialogs.cp
931f75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   allKeys );
4b698b ¤   ¤   ¤   if( IsntPGPError( err ) )
91f776 ¤   ¤   ¤   {
b30a79 ¤   ¤   ¤   ¤   err = PGPGetPrefBoolean( adminPrefsRef,
801c24 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefWarnNotCertByCorp,
52cb14 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &warnNotSignedByCorpKey );
26babd ¤   ¤   ¤   ¤   if( IsntPGPError( err ) && warnNotSignedByCorpKey )
5272c3 ¤   ¤   ¤   ¤   {
d323b8 ¤   ¤   ¤   ¤   ¤   PGPByte¤¤   *corpKeyID;
c10d72 ¤   ¤   ¤   ¤   ¤   PGPSize¤¤   corpKeyIDSize;
08ae30 ¤   ¤   ¤   ¤   ¤
82c9f8 ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefData( adminPrefsRef,
c39850 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefCorpKeyID, &corpKeyIDSize,
040c97 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &corpKeyID );
356ca0 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
ec4859 ¤   ¤   ¤   ¤   ¤   {
b6a61d ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  corpKeyAlgorithm;
2d94aa ¤   ¤   ¤   ¤   ¤   ¤
98003c ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefNumber( adminPrefsRef,
396e14 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefCorpKeyPublicKeyAlgorithm,
3917c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &corpKeyAlgorithm );
12239e ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
b88fec ¤   ¤   ¤   ¤   ¤   ¤   {
c2eb27 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyID¤   keyID;
55531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
9cedbf ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPImportKeyID( corpKeyID, &keyID );
ec531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
b48d9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
4106b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
8aa77e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyByKeyID ( allKeys, &keyID,
3fcb78 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPPublicKeyAlgorithm)
c564e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   corpKeyAlgorithm,
f2e564 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &corporateKeyRef );
535268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
67db3c ¤   ¤   ¤   ¤   ¤   ¤   }
b8af5a
6461bf ¤   ¤   ¤   ¤   ¤   ¤   PGPDisposePrefData( adminPrefsRef, corpKeyID );
491c89 ¤   ¤   ¤   ¤   ¤   }
6aae30 ¤   ¤   ¤   ¤   ¤
869c66 ¤   ¤   ¤   ¤   ¤   if( IsPGPError( err ) ||
002709 ¤   ¤   ¤   ¤   ¤   ¤   ! PGPKeyRefIsValid( corporateKeyRef ) )
fc4859 ¤   ¤   ¤   ¤   ¤   {
5d4106 ¤   ¤   ¤   ¤   ¤   ¤   /*
8d5aa9 ¤   ¤   ¤   ¤   ¤   ¤   ** Tell the user that we don't have the
6a6700 ¤   ¤   ¤   ¤   ¤   ¤   ** corporate key and abort the dialog.
750603 ¤   ¤   ¤   ¤   ¤   ¤   */
6f94aa ¤   ¤   ¤   ¤   ¤   ¤
8e93e4 ¤   ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
9594aa ¤   ¤   ¤   ¤   ¤   ¤
cf0f00 ¤   ¤   ¤   ¤   ¤   ¤   PGPUIWarningAlert( kWAStopAlertType, kWAOKStyle,
a7887b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kRecipientDialogStringListResID,
d40721 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCorporateSigningKeyMissingStrIndex );
b194aa ¤   ¤   ¤   ¤   ¤   ¤
0a094d ¤   ¤   ¤   ¤   ¤   ¤   err = kPGPError_UserAbort;
7e1c89 ¤   ¤   ¤   ¤   ¤   }
b52613 ¤   ¤   ¤   ¤   }
85a3a6 ¤   ¤   ¤   }
210fe4 ¤   ¤   }
96b54c ¤   #endif // PGP_BUSINESS_SECURITY
cc1b52 ¤   ¤
8686f8 ¤   ¤   if( IsntPGPError( err ) )
9b5b34 ¤   ¤   {
199c85 ¤   ¤   ¤   PGPUInt32¤  conventionalEncrypt¤= 0;
c348b9 ¤   ¤   ¤   PGPUInt32¤  textOutput¤ ¤   ¤   = 0;
dc1a17 ¤   ¤   ¤   PGPUInt32¤  macBinary¤  ¤   ¤   = 0;
d857f7 ¤   ¤   ¤   PGPUInt32¤  wipeOriginal¤   ¤   = 0;
8e46ba ¤   ¤   ¤   PGPUInt32¤  showFYEO¤   ¤   ¤   = 0;
a347df ¤   ¤   ¤   PGPUInt32¤  fYEO ¤  ¤   ¤   ¤   = 0;
c771ac ¤   ¤   ¤   Boolean¤¤   haveFileOptions ¤   = FALSE;
4987c7 ¤   ¤   ¤
0c85b2 ¤   ¤   ¤   if( allowConvEncrypt )
19f776 ¤   ¤   ¤   {
--19c1 00077f328f6401200ca Page 15 of PGPclientLibDialogs.cp
46fa63 ¤   ¤   ¤   ¤   if( (defaultSettings & kPGPRecipientSettingsConvEncrypt) != 0 )
9cd985 ¤   ¤   ¤   ¤   ¤   conventionalEncrypt = 1;
60a3a6 ¤   ¤   ¤   }
f187c7 ¤   ¤   ¤
2bdf12 ¤   ¤   ¤   if( ( dialogOptions & kPGPRecipientOptionsShowFYEO ) != 0 )
46f776 ¤   ¤   ¤   {
8a8e59 ¤   ¤   ¤   ¤   showFYEO = 1;
9857c8 ¤   ¤   ¤   ¤   if( (defaultSettings & kPGPRecipientSettingsFYEO) != 0 )
16cc86 ¤   ¤   ¤   ¤   ¤   fYEO = 1;
3ba3a6 ¤   ¤   ¤   }
0daf5a
aa1592 ¤   ¤   ¤   if( ( dialogOptions & kPGPRecipientOptionsHideFileOptions ) == 0 )
61f776 ¤   ¤   ¤   {
ece999 ¤   ¤   ¤   ¤   /* Setup file options */
812b85 ¤   ¤   ¤   ¤
805f5e ¤   ¤   ¤   ¤   haveFileOptions = TRUE;
b5af5a
48dae9 ¤   ¤   ¤   ¤   if( (defaultSettings & kPGPUISettingsTextOutput) != 0 )
d283e2 ¤   ¤   ¤   ¤   ¤   textOutput = 1;
ad2b85 ¤   ¤   ¤   ¤
20e80d ¤   ¤   ¤   ¤   if( (defaultSettings & kPGPRecipientSettingsWipeOriginal) != 0 )
be7ef0 ¤   ¤   ¤   ¤   ¤   wipeOriginal = 1;
5eaf5a
9fbf10 ¤   ¤   ¤   ¤   macBinary = GetMacBinaryPopupInitialValue( defaultSettings,
b574cc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   clientPrefsRef );
74ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
9a1952 ¤   ¤   ¤   ¤   err = PGPAppendOptionList( recipientOptions,
dd02b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogOptions( context,
04605e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   allowConvEncrypt ? ConvEncryptCheckboxOptionLis¶
c2a110 t(
ecd534 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   context, 1, conventionalEncrypt, &conventio¶
5616e8 nalEncrypt ) :
1e56e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( context ),
ea1209 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TextOutputCheckboxOptionList( context, 2,
18bea5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   textOutput, &textOutput ),
baf7c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   MacBinaryPopupOptionList( context, 3, macBinary,
7f4630 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &macBinary ),
2e8cf9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   WipeOriginalCheckboxOptionList( context, 4,
978b87 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wipeOriginal, &wipeOriginal ),
d61971 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (showFYEO) ? FYEOCheckboxOptionList( context, 5¶
9ef5d2 , fYEO, &fYEO ) :
e356e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( context ),
d60204 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) ),
17fc28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
eba3a6 ¤   ¤   ¤   }
b0bb8c ¤   ¤   ¤   else
d1f776 ¤   ¤   ¤   {
b3af5a
e01952 ¤   ¤   ¤   ¤   err = PGPAppendOptionList( recipientOptions,
cf02b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogOptions( context,
79605e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   allowConvEncrypt ? ConvEncryptCheckboxOptionLis¶
a4a110 t(
afd534 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   context, 1, conventionalEncrypt, &conventio¶
ac16e8 nalEncrypt ) :
1b56e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( context ),
149574 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (showFYEO) ? FYEOCheckboxOptionList( context, 2¶
b9f5d2 , fYEO, &fYEO ) :
bc56e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( context ),
d00204 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) ),
9cfc28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
f2a3a6 ¤   ¤   ¤   }
e887c7 ¤   ¤   ¤
e7698b ¤   ¤   ¤   if( IsntPGPError( err ) )
d5f776 ¤   ¤   ¤   {
59c4fe ¤   ¤   ¤   ¤   PGPBoolean¤ warnOnADKs;
f72b85 ¤   ¤   ¤   ¤
f7a5bd ¤   ¤   ¤   ¤   err = PGPGetPrefBoolean( clientPrefsRef, kPGPPrefWarnOnADK,
e537b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &warnOnADKs );
1a5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
fc242e ¤   ¤   ¤   ¤   {¤  ¤   ¤
f10e3b ¤   ¤   ¤   ¤   ¤   err = PGPRecipientDialog( context, allKeys,
775c8c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   forceShowDialog, actualRecipients,
--9176 000fa7012e3401200ca Page 16 of PGPclientLibDialogs.cp
677de5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   recipientOptions,
d2daa9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIEnforceAdditionalRecipientRequests(
ee8739 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   context, arrEnforcement, warnOnADKs ),
e6da9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
f72613 ¤   ¤   ¤   ¤   }
d12b85 ¤   ¤   ¤   ¤
9f980e ¤   ¤   ¤   ¤   /*
88389f ¤   ¤   ¤   ¤   ** Tell the user if there are no keys selected and no
fd64b4 ¤   ¤   ¤   ¤   ** conventional encryption.
a4df0b ¤   ¤   ¤   ¤   */
0f2b85 ¤   ¤   ¤   ¤
7635ae ¤   ¤   ¤   ¤   if( IsntPGPError( err ) && conventionalEncrypt == 0 )
1a72c3 ¤   ¤   ¤   ¤   {
6e4043 ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  numKeys;
7cae30 ¤   ¤   ¤   ¤   ¤
3473ae ¤   ¤   ¤   ¤   ¤   err = PGPCountKeys( *actualRecipients, &numKeys );
c0516a ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) && numKeys == 0 )
554859 ¤   ¤   ¤   ¤   ¤   {
1993e4 ¤   ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
8a94aa ¤   ¤   ¤   ¤   ¤   ¤
e02284 ¤   ¤   ¤   ¤   ¤   ¤   PGPUIWarningAlert( kWAStopAlertType,
cf713a ·¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
57023e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kRecipientDialogStringListResID,
0d1a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMustSelectKeyOrConvEncryptStrIndex );
5baf5a
79094d ¤   ¤   ¤   ¤   ¤   ¤   err = kPGPError_UserAbort;
061c89 ¤   ¤   ¤   ¤   ¤   }
6f2613 ¤   ¤   ¤   ¤   }
692b85 ¤   ¤   ¤   ¤
74ef06 ¤   ¤   ¤   #if PGP_BUSINESS_SECURITY
a9babd ¤   ¤   ¤   ¤   if( IsntPGPError( err ) && warnNotSignedByCorpKey )
2072c3 ¤   ¤   ¤   ¤   {
7d6e54 ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ haveUnsignedKey = FALSE;
a0ae30 ¤   ¤   ¤   ¤   ¤
edc7e0 ¤   ¤   ¤   ¤   ¤   pgpAssert( PGPKeyRefIsValid( corporateKeyRef ) );
e7af5a
460789 ¤   ¤   ¤   ¤   ¤   err = HaveUnsignedRecipient( allKeys,
25cf29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *actualRecipients, corporateKeyRef,
183cf2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &haveUnsignedKey );
608588 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) && haveUnsignedKey )
5d4859 ¤   ¤   ¤   ¤   ¤   {
48b234 ¤   ¤   ¤   ¤   ¤   ¤   MessageT¤   dialogMessage;
1894aa ¤   ¤   ¤   ¤   ¤   ¤
6e93e4 ¤   ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
d694aa ¤   ¤   ¤   ¤   ¤   ¤
f6c62e ¤   ¤   ¤   ¤   ¤   ¤   dialogMessage = PGPUIWarningAlert(
9ba7ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWACautionAlertType,
b068fe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKCancelStyle,
320548 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kRecipientDialogStringListResID,
84d2f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeysNotSignedByCorporateKeyStrIndex );
be7937 ¤   ¤   ¤   ¤   ¤   ¤   if( dialogMessage == msg_Cancel )
db186a ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kPGPError_UserAbort;
f51c89 ¤   ¤   ¤   ¤   ¤   }
982613 ¤   ¤   ¤   ¤   }
b434f5 ¤   ¤   ¤   #endif
ed87c7 ¤   ¤   ¤
285565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
ff72c3 ¤   ¤   ¤   ¤   {
0cc96f ¤   ¤   ¤   ¤   ¤   *userSettings = 0;
8aae30 ¤   ¤   ¤   ¤   ¤
64835a ¤   ¤   ¤   ¤   ¤   if( conventionalEncrypt != 0 )
574859 ¤   ¤   ¤   ¤   ¤   {
623178 ¤   ¤   ¤   ¤   ¤   ¤   *userSettings |= kPGPRecipientSettingsConvEncrypt;
3e94aa ¤   ¤   ¤   ¤   ¤   ¤
d60f11 ¤   ¤   ¤   ¤   ¤   ¤   if( PGPKeySetRefIsValid( *actualRecipients ) )
778fec ¤   ¤   ¤   ¤   ¤   ¤   {
3f543b ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( *actualRecipients );
bb88ff ¤   ¤   ¤   ¤   ¤   ¤   ¤   *actualRecipients = kInvalidPGPKeySetRef;
cedb3c ¤   ¤   ¤   ¤   ¤   ¤   }
b61c89 ¤   ¤   ¤   ¤   ¤   }
ba94aa ¤   ¤   ¤   ¤   ¤   ¤
fad5f1 ¤   ¤   ¤   ¤   ¤   if( textOutput != 0 )
--213a 000a1ff56af401200ca Page 17 of PGPclientLibDialogs.cp
e41522 ¤   ¤   ¤   ¤   ¤   ¤   *userSettings |= kPGPUISettingsTextOutput;
beaf5a
9c3b3c ¤   ¤   ¤   ¤   ¤   if( wipeOriginal != 0 )
74886c ¤   ¤   ¤   ¤   ¤   ¤   *userSettings |= kPGPRecipientSettingsWipeOriginal;
d094aa ¤   ¤   ¤   ¤   ¤   ¤
ecf000 ¤   ¤   ¤   ¤   ¤   if( fYEO != 0 )
cf4fff ¤   ¤   ¤   ¤   ¤   ¤   *userSettings |= kPGPRecipientSettingsFYEO;
09af5a
473673 ¤   ¤   ¤   ¤   ¤   if( macBinary == kMacBinaryPopupNoneMenuItem )
df55b9 ¤   ¤   ¤   ¤   ¤   {¤
37e772 ¤   ¤   ¤   ¤   ¤   ¤   *userSettings |= kPGPUISettingsNoMacBinary;
291c89 ¤   ¤   ¤   ¤   ¤   }
c178ed ¤   ¤   ¤   ¤   ¤   else if( macBinary == kMacBinaryPopupSmartMenuItem )
854859 ¤   ¤   ¤   ¤   ¤   {
d292e5 ¤   ¤   ¤   ¤   ¤   ¤   *userSettings |= kPGPUISettingsSmartMacBinary;
8d1c89 ¤   ¤   ¤   ¤   ¤   }
0c4bd6 ¤   ¤   ¤   ¤   ¤   else
064859 ¤   ¤   ¤   ¤   ¤   {
9a9f52 ¤   ¤   ¤   ¤   ¤   ¤   *userSettings |= kPGPUISettingsForceMacBinary;
4c1c89 ¤   ¤   ¤   ¤   ¤   }
ce2613 ¤   ¤   ¤   ¤   }
a6af5a
519c8a ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
7372c3 ¤   ¤   ¤   ¤   {
611c9d ¤   ¤   ¤   ¤   ¤   if( PGPKeySetRefIsValid( *actualRecipients ) )
e24859 ¤   ¤   ¤   ¤   ¤   {
cb9027 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( *actualRecipients );
2b9ddc ¤   ¤   ¤   ¤   ¤   ¤   *actualRecipients = kInvalidPGPKeySetRef;
801c89 ¤   ¤   ¤   ¤   ¤   }
a3ae30 ¤   ¤   ¤   ¤   ¤
111d63 ¤   ¤   ¤   ¤   ¤   if( IsntNull( newKeys ) && PGPKeySetRefIsValid( *newKeys ) )
2a4859 ¤   ¤   ¤   ¤   ¤   {
4250b1 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( *newKeys );
54a4f4 ¤   ¤   ¤   ¤   ¤   ¤   *newKeys = kInvalidPGPKeySetRef;
fe1c89 ¤   ¤   ¤   ¤   ¤   }
242613 ¤   ¤   ¤   ¤   }
50a3a6 ¤   ¤   ¤   }
3f0fe4 ¤   ¤   }
1f1b52 ¤   ¤
41c233 ¤   ¤   if( IsntNull( ksEntries ) )
528495 ¤   ¤   ¤   PGPDisposeKeyServerPath( ksEntries );
0daf5a
2098b3 ¤   ¤   if( IsntNull( serverList ) )
e35b34 ¤   ¤   {
90bb5e ¤   ¤   ¤   for( serverIndex = 0; serverIndex < numKSEntries; serverIndex++ )
8cf776 ¤   ¤   ¤   {
c7cfb8 ¤   ¤   ¤   ¤   if( PGPKeyServerRefIsValid( serverList[serverIndex].server ) )
90bc15 ¤   ¤   ¤   ¤   ¤   PGPFreeKeyServer( serverList[serverIndex].server );
54a3a6 ¤   ¤   ¤   }
0aaf5a
5772ae ¤   ¤   ¤   PGPFreeData( serverList );
540fe4 ¤   ¤   }
a21b52 ¤   ¤
015226 ¤   ¤   PGPFreeOptionList( recipientOptions );
de9371 ¤   }
541b52 ¤   ¤
bddeb7 ¤   return( err );
47efe6 }
1faf5a
dec744 ¤   PGPError
371dc4 PGPClientRecipientDialog(
4909ea ¤   PGPContextRef¤  ¤   ¤   context,¤   ¤   ¤   ¤   ¤
765175 ¤   PGPtlsContextRef¤   ¤   tlsContext,
720822 ¤   PGPKeySetRef¤   ¤   ¤   allKeys,¤   ¤   ¤   ¤   ¤
404043 ¤   PGPUInt32¤  ¤   ¤   ¤   numDefaultRecipients,¤  ¤
b6b2b1 ¤   const PGPRecipientSpec¤ *defaultRecipients,¤¤   ¤
9a8f18 ¤   PGPRecipientOptions¤¤   dialogOptions,¤ ¤   ¤   ¤
3acf38 ¤   PGPRecipientSettings¤   defaultSettings,
39085b ¤   PGPRecipientSettings¤   *userSettings,¤ ¤   ¤
fe2c2c ¤   PGPKeySetRef¤   ¤   ¤   *actualRecipients,¤ ¤   ¤
713923 ¤   PGPKeySetRef¤   ¤   ¤   *newKeys)
a1bb36 {
--fd25 000b24321b8401200ca Page 18 of PGPclientLibDialogs.cp
118f52 ¤   PGPError¤   ¤   ¤   err;
4b9a69 ¤   PGPclientLibState¤  state;
6e1b52 ¤   ¤
56ce49 ¤   if ( IsntNull( userSettings ) )
6c10cb ¤   ¤   *userSettings = 0;
1af9b1 ¤   if ( IsntNull( actualRecipients ) )
c76eb3 ¤   ¤   *actualRecipients = kInvalidPGPKeySetRef;
99002d ¤   if ( IsntNull( newKeys ) )
51ccf9 ¤   ¤   *newKeys = kInvalidPGPKeySetRef;
b02b85 ¤   ¤   ¤   ¤
bf4dac ¤   PGPValidatePtr( context );
9161d0 ¤   PGPValidatePtr( allKeys );
775efd ¤   PGPValidatePtr( userSettings );
ee475c ¤   PGPValidatePtr( actualRecipients );
2967c5 ¤
d868d4 ¤   if( numDefaultRecipients != 0 )
0ac7a1 ¤   {
e85ae7 ¤   ¤   PGPValidatePtr( defaultRecipients );
649371 ¤   }
7cdd61 ¤   else if( IsntNull( defaultRecipients ) )
32c7a1 ¤   {
6f1ea7 ¤   ¤   PGPValidateParam( numDefaultRecipients != 0 )
329371 ¤   }
9b67c5 ¤
6fe5fd ¤   err = EnterPGPclientLib( context, &state );
7ab1f0 ¤   if( IsntPGPError( err ) )
75c7a1 ¤   {
6b2edc ¤   ¤   err = PGPKeyServerInit();
3486f8 ¤   ¤   if( IsntPGPError( err ) )
1f5b34 ¤   ¤   {
9f24ae ¤   ¤   ¤   err = pgpClientRecipientDialog( context, state.clientPrefsRef,
fd5299 ¤   ¤   ¤   ¤   ¤   ¤   state.adminPrefsRef, tlsContext, allKeys,
57609b ¤   ¤   ¤   ¤   ¤   ¤   numDefaultRecipients, defaultRecipients,
4c9054 ¤   ¤   ¤   ¤   ¤   ¤   dialogOptions, defaultSettings, userSettings,
b9b8ae ¤   ¤   ¤   ¤   ¤   ¤   actualRecipients, newKeys );
e687c7 ¤   ¤   ¤
5f59fd ¤   ¤   ¤   PGPKeyServerCleanup();
8f0fe4 ¤   ¤   }
fc9371 ¤   }
2f67c5 ¤
885df5 ¤   ExitPGPclientLib( &state );
1a67c5 ¤
39deb7 ¤   return( err );
a31862 }¤
d9af5a
5daf5a
d066dd ¤   static PGPError
e15da0 pgpClientDecryptionPassphraseDialog(
ada1bc ¤   PGPContextRef¤  ¤   context,
8aa6fd ¤   PGPPrefRef¤ ¤   ¤   clientPrefsRef,¤¤   ¤   ¤
446c35 ¤   PGPtlsContextRef¤   tlsContext,
99dccc ¤   const char¤ ¤   ¤   *prompt,¤   ¤   ¤   ¤   ¤   ¤
bd0ae9 ¤   PGPKeySetRef¤   ¤   recipientKeys,
77b570 ¤   const PGPKeyID¤ ¤   keyIDList[],¤   ¤
68f46c ¤   PGPUInt32¤  ¤   ¤   keyIDCount,
f2f283 ¤   PGPOptionListRef¤   additionalOptions,
b4f22b ¤   char¤   ¤   ¤   ¤   **passphrase,
4f8748 ¤   PGPKeyRef ¤ ¤   ¤   *decryptionKey,
a80790 ¤   PGPKeySetRef¤   ¤   *newKeys)
07bb36 {
a0dc13 ¤   PGPError¤   ¤   ¤   ¤   ¤   ¤   err;
7085ca ¤   PGPOptionListRef¤   ¤   ¤   ¤   optionList ¤= kInvalidPGPOptionListRef;
25e6da ¤   PGPKeyServerSpec¤   ¤   ¤   ¤   *serverList = NULL;
cd8aa1 ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   ¤   serverIndex;
e5b8af ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   ¤   numKSEntries = 0;
905a81 ¤   StPGPPreserveKeyServerStorage¤  keyserverStorage;
4587c7 ¤   ¤   ¤
5e9b1f ¤   err = PGPBuildOptionList( context, &optionList,
7e231a ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( context, passphrase ),
4604f1 ¤   ¤   ¤   ¤   IsntNull( prompt ) ? PGPOUIDialogPrompt( context, prompt ) :·
e998ad ¤   ¤   ¤   ¤   ¤   PGPONullOption( context ),
b2588b ¤   ¤   ¤   ¤   PGPOptionListRefIsValid( additionalOptions ) ?
--6033 0006f85c516401200ca Page 19 of PGPclientLibDialogs.cp
faf326 ¤   ¤   ¤   ¤   ¤   additionalOptions : PGPONullOption( context ),
53929d ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
e200e8 ¤   if( IsntPGPError( err ) && IsntNull( newKeys ) )
98c7a1 ¤   {
739a23 ¤   ¤   PGPKeyServerEntry¤  *ksEntries ¤= NULL;
68af5a
27f15e ¤   ¤   err = PGPCreateKeyServerPath( clientPrefsRef, "", &ksEntries,
163f64 ¤   ¤   ¤   ¤   ¤   &numKSEntries);
f30ace ¤   ¤   if( IsntPGPError( err ) && IsntNull( ksEntries ) && numKSEntries > 0 )
065b34 ¤   ¤   {
9b2e9c ¤   ¤   ¤   serverList = (PGPKeyServerSpec *) PGPNewData(
4d0d25 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( context ),
835e68 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numKSEntries * sizeof( *serverList ),
d91e0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMemoryMgrFlags_Clear );
669d5e ¤   ¤   ¤   if( IsntNull( serverList ) )
99f776 ¤   ¤   ¤   {
49998f ¤   ¤   ¤   ¤   for( serverIndex = 0; serverIndex < numKSEntries;
f3ee0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   serverIndex++ )
bb72c3 ¤   ¤   ¤   ¤   {
d666da ¤   ¤   ¤   ¤   ¤   err = PGPNewKeyServerFromHostName( context,
6f0b12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].serverDNS,
450421 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].serverPort,
2aa647 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].protocol,
29fe96 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyServerAccessType_Normal,
785712 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyServerKeySpace_Normal,
33cd59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &serverList[serverIndex].server );
9a14ec ¤   ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
f700eb ¤   ¤   ¤   ¤   ¤   ¤   break;
27ae30 ¤   ¤   ¤   ¤   ¤
9cc502 ¤   ¤   ¤   ¤   ¤   serverList[serverIndex].serverName =
9b154d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ksEntries[serverIndex].serverDNS;
a02613 ¤   ¤   ¤   ¤   }
552b85 ¤   ¤   ¤   ¤
db5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
5672c3 ¤   ¤   ¤   ¤   {
63acaa ¤   ¤   ¤   ¤   ¤   err = PGPAppendOptionList( optionList,
97d8f3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIKeyServerUpdateParams( context,
081ae0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numKSEntries, serverList, tlsContext,
7ed32c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FALSE, newKeys, PGPOLastOption( context ) ),
afda9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
272613 ¤   ¤   ¤   ¤   }
09a3a6 ¤   ¤   ¤   }
0cbb8c ¤   ¤   ¤   else
81f776 ¤   ¤   ¤   {
31bfb4 ¤   ¤   ¤   ¤   err = kPGPError_OutOfMemory;
c3a3a6 ¤   ¤   ¤   }
ac0fe4 ¤   ¤   }
d2af5a
82c233 ¤   ¤   if( IsntNull( ksEntries ) )
258495 ¤   ¤   ¤   PGPDisposeKeyServerPath( ksEntries );
5c9371 ¤   }
9a67c5 ¤
50b1f0 ¤   if( IsntPGPError( err ) )
5ac7a1 ¤   {
57fdab ¤   ¤   err = PGPDecryptionPassphraseDialog( context, recipientKeys,
f5dfa3 ¤   ¤   ¤   ¤   ¤   keyIDCount, keyIDList, decryptionKey, optionList,
7ac000 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
209371 ¤   }
0967c5 ¤
12ce49 ¤   if( PGPOptionListRefIsValid( optionList ) )
31153d ¤   ¤   PGPFreeOptionList( optionList );
e167c5 ¤
8da5db ¤   if( IsntNull( serverList ) )
e9c7a1 ¤   {
5cc214 ¤   ¤   for( serverIndex = 0; serverIndex < numKSEntries; serverIndex++ )
af5b34 ¤   ¤   {
b1229f ¤   ¤   ¤   if( PGPKeyServerRefIsValid( serverList[serverIndex].server ) )
bff262 ¤   ¤   ¤   ¤   PGPFreeKeyServer( serverList[serverIndex].server );
580fe4 ¤   ¤   }
97af5a
29335d ¤   ¤   PGPFreeData( serverList );
6f9371 ¤   }
--6913 00102fdd0d0401200ca Page 20 of PGPclientLibDialogs.cp
2a67c5 ¤
4fdeb7 ¤   return( err );
29efe6 }
02af5a
ccc744 ¤   PGPError
d620b3 PGPClientDecryptionPassphraseDialog(
d9a1bc ¤   PGPContextRef¤  ¤   context,
116c35 ¤   PGPtlsContextRef¤   tlsContext,
b5c3e8 ¤   const char¤ ¤   ¤   *prompt,
6a0ae9 ¤   PGPKeySetRef¤   ¤   recipientKeys,
89b570 ¤   const PGPKeyID¤ ¤   keyIDList[],¤   ¤
23f46c ¤   PGPUInt32¤  ¤   ¤   keyIDCount,
1af283 ¤   PGPOptionListRef¤   additionalOptions,
caf22b ¤   char¤   ¤   ¤   ¤   **passphrase,
518748 ¤   PGPKeyRef ¤ ¤   ¤   *decryptionKey,
320790 ¤   PGPKeySetRef¤   ¤   *newKeys)
47bb36 {
458f52 ¤   PGPError¤   ¤   ¤   err;
389a69 ¤   PGPclientLibState¤  state;
8eaf5a
1b658f ¤   if ( IsntNull( passphrase ) )
ed3a26 ¤   ¤   *passphrase = NULL;
03c257 ¤   if ( IsntNull( decryptionKey ) )
b70b13 ¤   ¤   *decryptionKey = kInvalidPGPKeyRef;
8a002d ¤   if ( IsntNull( newKeys ) )
b6ccf9 ¤   ¤   *newKeys = kInvalidPGPKeySetRef;
d52b85 ¤   ¤   ¤   ¤
624dac ¤   PGPValidatePtr( context );
c7dc2b ¤   PGPValidatePtr( recipientKeys );
dcbed6 ¤   PGPValidatePtr( passphrase );
08f161 ¤   PGPValidatePtr( decryptionKey );
70af5a
91e5fd ¤   err = EnterPGPclientLib( context, &state );
6eb1f0 ¤   if( IsntPGPError( err ) )
83c7a1 ¤   {
e12edc ¤   ¤   err = PGPKeyServerInit();
d686f8 ¤   ¤   if( IsntPGPError( err ) )
035b34 ¤   ¤   {
ce9323 ¤   ¤   ¤   err = pgpClientDecryptionPassphraseDialog( context,
fc4778 ¤   ¤   ¤   ¤   ¤   ¤   state.clientPrefsRef,
9ee278 ¤   ¤   ¤   ¤   ¤   ¤   tlsContext, prompt, recipientKeys, keyIDList,
13d1c6 ¤   ¤   ¤   ¤   ¤   ¤   keyIDCount, additionalOptions, passphrase,
fb34bb ¤   ¤   ¤   ¤   ¤   ¤   decryptionKey, newKeys );
5f2b85 ¤   ¤   ¤   ¤
4459fd ¤   ¤   ¤   PGPKeyServerCleanup();
720fe4 ¤   ¤   }
dd9371 ¤   }
6f67c5 ¤
935df5 ¤   ExitPGPclientLib( &state );
ba2b85 ¤   ¤   ¤   ¤
d5deb7 ¤   return( err );
6eefe6 }
61af5a
7eaf5a
fcaf5a
90af5a
02af5a
--7837 0000e5f24fa401200cb Page 1 of PGPclientLibDialogs.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
29ad92 ¤   $Id: PGPclientLibDialogs.h,v 1.15.2.1.2.1 1998/11/12 03:07:24 heller Exp $
f5f7f7 ____________________________________________________________________________*/
85af5a
7d7b7d #pragma once
8baf5a
16c20d #include <Dialogs.h>
42af5a
8e28cd #include <PP_Types.h>
62af5a
4d0438 #include "MacBasics.h"
fae82c #include "pgpPubTypes.h"
81c2ae #include "pgpGroups.h"
feec82 #include "pgpTLS.h"
a4e8b2 #include "pflPrefs.h"
fffdf0 #include "WarningAlertTypes.h"
daaf5a
eaa371 const ResID¤¤   kDialogStringListResID¤ ¤   ¤   = 4747;
f9851e const ResID¤¤   kOptionDialogStringListResID¤   = 4748;
b3d39f const ResID¤¤   kRecipientDialogStringListResID¤= 4751;
48af5a
ed187f enum¤   /* kDialogStringListResID */
dcbb36 {
eeb171 ¤   kDSSDHKeySizeFormatStrIndex¤¤   = 1,
0bba74 ¤   kImportButtonNameIndex
9382f7 };
67af5a
d2af5a
72f022 enum¤   /* kOptionDialogStringListResID */
b9bb36 {
2df3c7 ¤   kDetachedSignatureTitleStrIndex¤¤   = 1,
080d05 ¤   kDetachedSignatureDescStrIndex,
5a85c6 ¤   kTextOutputTitleStrIndex,
38c338 ¤   kTextOutputDescStrIndex,
e9936e ¤   kConvEncryptTitleStrIndex,
ccda4e ¤   kConvEncryptDescStrIndex,
b4f88a ¤   kWipeOriginalTitleStrIndex,
3978a6 ¤   kWipeOriginalDescStrIndex,
161d6e ¤   kFYEOTitleStrIndex,
2b8264 ¤   kFYEODescStrIndex,
5e26dc ¤   kMacBinaryTitleStrIndex,
8867c5 ¤
00f0c4 ¤   kFirstMacBinaryMenuItemStrIndex,
36af5a
4183ff ¤   kMacBinaryNoStrIndex¤   ¤   ¤   ¤   = kFirstMacBinaryMenuItemStrIndex,
7f5046 ¤   kMacBinarySmartStrIndex,
b42aa1 ¤   kMacBinaryYesStrIndex,
c967c5 ¤
02dec7 ¤   kLastMacBinaryMenuItemStrIndex¤ ¤   = kMacBinaryYesStrIndex,
4d67c5 ¤
74949a ¤   kMacBinaryDescStrIndex
8d82f7 };
8aaf5a
3ee1b7 enum¤   /* kRecipientDialogStringListResID */
dbbb36 {
f5490b ¤   kCorporateADKDisabledOrMissingStrIndex¤ = 1,
fa6b6d ¤   kNoDefaultPrivateKeyFoundStrIndex,
b43f24 ¤   kMustSelectKeyOrConvEncryptStrIndex,
a0105f ¤   kCorporateSigningKeyMissingStrIndex,
fb3b79 ¤   kKeysNotSignedByCorporateKeyStrIndex
b282f7 };
aa67c5 ¤
efaf5a
eae375 PGPError¤   ¤   PGPGetGroupFromServerInternal(
7dea8f ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPContextRef ¤ ¤   context,
a675ec ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef¤   tlsContext,
14310f ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPPrefRef¤ ¤   ¤   clientPrefsRef,
13ec78 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGroupSetRef¤ ¤   groupSet,
0ef3d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGroupID¤ ¤   ¤   groupID,
--1cbf 0018b68ee88401200cb Page 2 of PGPclientLibDialogs.h
43f60b ¤   ¤   ¤   ¤   ¤   ¤   ¤   const char¤ ¤   ¤   *domain,
68a001 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   dialogDelayTicks,
0ed1ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   *resultSet);
e4af5a
634ef6 PGPError¤   ¤   PGPGroupListOperationOnServerInternal(
edf134 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPContextRef¤  ¤   context,
7a75ec ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef¤   tlsContext,
116e49 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   allKeys,
ef310f ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPPrefRef¤ ¤   ¤   clientPrefsRef,
45113d ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   ¤   sendGroups,
db7308 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGroupSetRef¤ ¤   *groupSet );
3baf5a
e108aa MessageT¤   ¤   PGPUIWarningAlert(
762ba7 ¤   ¤   ¤   ¤   ¤   WarningAlertType alertType, WarningAlertStyle alertStyle,
48f6cd ¤   ¤   ¤   ¤   ¤   ConstStr255Param message, ConstStr255Param str1 = NULL,
8b4dab ¤   ¤   ¤   ¤   ¤   ConstStr255Param str2=NULL, ConstStr255Param str3 = NULL);
3267c5 ¤
9508aa MessageT¤   ¤   PGPUIWarningAlert(
af2ba7 ¤   ¤   ¤   ¤   ¤   WarningAlertType alertType, WarningAlertStyle alertStyle,
508cfb ¤   ¤   ¤   ¤   ¤   ResID stringListResID, short stringListIndex,
4ae17e ¤   ¤   ¤   ¤   ¤   ConstStr255Param str1 = NULL,
709517 ¤   ¤   ¤   ¤   ¤   ConstStr255Param str2 = NULL,
8b08a7 ¤   ¤   ¤   ¤   ¤   ConstStr255Param str3 = NULL);
--dd13 00198d8f2d3401200cc Page 1 of PGPclientLibHeaders.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
d9af5a
fcd556 ¤   $Id: PGPclientLibHeaders.prefix,v 1.1.10.1 1998/11/12 03:07:25 heller Exp $
04f7f7 ____________________________________________________________________________*/
beaf5a
b667a5 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0¤  /* 1 is on, 0 off */
fbaf5a
7438e5 /*
00069c ** Note: Do NOT define the PP symbols Debug_Throw or Debug_Signal here as
81636b ** PP does #ifdef checking of the symbol, not #if
567fe0 */
eeaf5a
98375e #include "PGPUILibCommonHeaders.h"
--9254 000c019b8aa401200cd Page 1 of PGPclientLibInitAndTerm.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
d9af5a
a733a3 ¤   $Id: PGPclientLibInitAndTerm.cp,v 1.1.10.1 1998/11/12 03:07:26 heller Exp $
d9f7f7 ____________________________________________________________________________*/
93af5a
e0e2ff #include "pgpConfig.h"
07af5a
098f22 #include <CodeFragments.h>
a36c79 #include <Gestalt.h>
1eaf5a
480438 #include "MacBasics.h"
f0076e #include "PGPclientLibUtils.h"
83a146 #include "pgpDebug.h"
940d08 #include "pgpMem.h"
b6af5a
1b99c6 PGP_BEGIN_C_DECLARATIONS
67af5a
8be11b pascal OSErr ¤  INIT_PGPclientLib(CFragInitBlock *initBlock);
ee8b5a pascal void¤¤   TERM_PGPclientLib(void);
58af5a
ad13d1 pascal OSErr __initialize(const CFragInitBlock *theInitBlock);
6ab65c pascal OSErr __terminate(void);
bdaf5a
711254 PGP_END_C_DECLARATIONS
3aaf5a
00d5a4 /* Disable 68020 code generation for the 68020 check itself */
486b23 #if GENERATING68K
ad8d08 ¤   #pragma code68020 off
567454 #endif
09af5a
6848f4 ¤   pascal OSErr
8ae19c INIT_PGPclientLib(CFragInitBlock *initBlock)
c6bb36 {
babaed ¤   long¤   gestaltResult;
8e9c1a ¤   OSErr¤  err = noErr;
8867c5 ¤
ded8af ¤   /*
92896a ¤   ** Check for a 68020 or later processor and bail immediately if
66dcce ¤   ** none is available. It is assumed that all clients of this
b4540a ¤   ** library are doing a similar chack and refusing to run.
699faa ¤   */
f467c5 ¤
abc3ca ¤   if( Gestalt( gestaltProcessorType, &gestaltResult ) == noErr &&
f48237 ¤   ¤   gestaltResult >= gestalt68020 )
d1c7a1 ¤   {
82a3e8 ¤   ¤   err = __initialize( initBlock );
d4da5e ¤   ¤   if( IsntErr( err ) )
f65b34 ¤   ¤   {
347aad ¤   ¤   ¤   /*
9711a2 ¤   ¤   ¤   ** Remember the FSSpec of the library file se we can open it's
65202e ¤   ¤   ¤   ** resource fork later.
da3da8 ¤   ¤   ¤   */
4a87c7 ¤   ¤   ¤
c44814 ¤   ¤   ¤   if( IsntNull( initBlock ) )
75f776 ¤   ¤   ¤   {
68da41 ¤   ¤   ¤   ¤   err = SetLibraryFSSpec(
fbd5bb ¤   ¤   ¤   ¤   ¤   initBlock->fragLocator.u.onDisk.fileSpec );
dda3a6 ¤   ¤   ¤   }
d9bb8c ¤   ¤   ¤   else
2cf776 ¤   ¤   ¤   {
c97177 ¤   ¤   ¤   ¤   /* Actual error is not important here */
102b85 ¤   ¤   ¤   ¤
2ab7e4 ¤   ¤   ¤   ¤   pgpDebugMsg( "INIT_PGPclientLib: No initBlock" );
ba976c ¤   ¤   ¤   ¤   err = -1;
2ca3a6 ¤   ¤   ¤   }
8d0fe4 ¤   ¤   }
80af5a
f4feaf ¤   ¤   pgpLeaksBeginSession( "PGPclientLib" );
689371 ¤   }
c067c5 ¤
--91f0 0012639640a401200cd Page 2 of PGPclientLibInitAndTerm.cp
ce99a2 ¤   pgpAssert( err == noErr );
95af5a
6ddeb7 ¤   return( err );
d0efe6 }
36af5a
6c6685 ¤   pascal void
f133e9 TERM_PGPclientLib(void)
bdbb36 {
fcbaed ¤   long¤   gestaltResult;
a1af5a
2cc3ca ¤   if( Gestalt( gestaltProcessorType, &gestaltResult ) == noErr &&
c88237 ¤   ¤   gestaltResult >= gestalt68020 )
c9c7a1 ¤   {
f55bc9 ¤   ¤   pgpLeaksEndSession();
069371 ¤   }
7267c5 ¤
114a4b ¤   __terminate();
e5efe6 }
8baf5a
de6b23 #if GENERATING68K
e9210c ¤   #pragma code68020 reset
3d7454 #endif
20af5a
1eaf5a
beaf5a
2baf5a
afaf5a
957e4d /*__Editor_settings____
80af5a
774126 ¤   Local Variables:
d77b17 ¤   tab-width: 4
df0e6c ¤   End:
c85f8c ¤   vi: ts=4 sw=4
a69e9b ¤   vim: si
26d062 _____________________*/
--e7be 0006ed0f83b401200ce Page 1 of PGPclientLibUtils.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
d43d79 ¤   $Id: PGPclientLibUtils.cp,v 1.42.2.1.2.1 1998/11/12 03:07:26 heller Exp $
37f7f7 ____________________________________________________________________________*/
afaf5a
fc1ef3 #include <Folders.h>
f04d37 #include <LowMem.h>
94f371 #include <fp.h>
21324c #include <string.h>
58af5a
88ac98 #include <LActiveScroller.h>
4425ae #include <LCaption.h>
ed10f5 #include <LGrafPortView.h>
42bce5 #include <LIconPane.h>
7ddfe2 #include <LRadioGroupView.h>
f262c6 #include <LScrollBar.h>
aa7e73 #include <LTabGroup.h>
3edd56 #include <PP_Messages.h>
7c902e #include <UAttachments.h>
e77e6d #include <UDrawingState.h>
be8f92 #include <UGAColorRamp.h>
d34b3b #include <UEnvironment.h>
20ffe3 #include <UGraphicUtils.h>
ac7c99 #include <URegistrar.h>
60af5a
c6c38f // Appearance classes
eab125 #include <LBevelButton.h>
a38708 #include <LCheckBox.h>
f67c09 #include <LEditText.h>
5276ae #include <LIconControl.h>
c2ec08 #include <LLittleArrows.h>
954119 #include <LMultiPanelView.h>
860aae #include <LPopupButton.h>
a149f7 #include <LProgressBar.h>
f3d797 #include <LPushButton.h>
fb40db #include <LRadioButton.h>
1405c6 #include <LStaticText.h>
54b919 #include <LTabsControl.h>
baa94f #include <LTextGroupBox.h>
40f1ac #include <LWindowHeader.h>
16af5a
0ea055 // Appearance Manager Implementations
68fd90 #include <LAMControlImp.h>
4a34b5 #include <LAMPopupButtonImp.h>
48ef3e #include <LAMPushButtonImp.h>
065a8a #include <LAMStaticTextImp.h>
9b22f4 #include <LAMTabsControlImp.h>
52a389 #include <LAMTrackActionImp.h>
70af5a
afd386 // Grayscale Implementations
85fbe5 #include <LGABevelButtonImp.h>
ae2a0e #include <LGACheckBoxImp.h>
66e872 #include <LGAEditTextImp.h>
8d590d #include <LGAIconControlImp.h>
c0b3c6 #include <LGALittleArrowsImp.h>
e80069 #include <LGAPopupButtonImp.h>
5d739a #include <LGAProgressBarImp.h>
59985b #include <LGAPushButtonImp.h>
93021a #include <LGARadioButtonImp.h>
492def #include <LGAStaticTextImp.h>
e51628 #include <LGATabsControlImp.h>
2c016b #include <LGATextGroupBoxImp.h>
e0fa99 #include <LGAWindowHeaderImp.h>
b8af5a
d60438 #include "MacBasics.h"
1a46ad #include "MacDebug.h"
0f5286 #include "MacDialogs.h"
aa8bd8 #include "MacEnvirons.h"
6b76b7 #include "MacErrors.h"
6ebbf4 #include "MacFiles.h"
--11e4 0004c47f8b5401200ce Page 2 of PGPclientLibUtils.cp
7b8c8c #include "MacDesktop.h"
3c6915 #include "MacResources.h"
74af5a
a6e8b2 #include "pflPrefs.h"
b5c5d5 #include "pgpBase.h"
81a146 #include "pgpDebug.h"
e70d08 #include "pgpMem.h"
3191b9 #include "pgpSDKPrefs.h"
e604f5 #include "pgpFeatures.h"
24af5a
d7002e #include "CPGPActiveScroller.h"
2ee213 #include "CPGPAMEditTextImp.h"
ba4b88 #include "CPGPAMTabsControlImp.h"
0cfcb1 #include "CPGPModalGrafPortView.h"
bc99b9 #include "CServerStatusDialog.h"
d38ac0 #include "CShareholderList.h"
e7b397 #include "PGPOpenPrefs.h"
bc3991 #include "pgpAdminPrefs.h"
e7c97b #include "pgpClientPrefs.h"
b24720 #include "pflPrefTypes.h"
78076e #include "PGPclientLibUtils.h"
00a02f #include "pgpClientLib.h"
316328 #include "pgpClientLibDialogs.h"
b9a076 #include "pgpKeys.h"
c4c9be #include "pgpRandomPool.h"
c276f0 #include "CComboError.h"
9aaa66 #include "PowerPlantLeaks.h"
68aa64 #include "StSaveCurResFile.h"
110bb4 #include "CString.h"
d4f8d2 #include "PGPSharedEncryptDecrypt.h"
b0af5a
1c7669 static const ResType¤   kAdminConfiguredType¤   =¤  'PGPa';
88ee82 static const SInt16¤¤   PGPa_Configured¤¤   ¤   =¤  0;
5baf5a
869059 const ResID¤kSelectPublicKeySFDialogResID ¤ = 4770;
d69140 const ResID¤kSelectPrivateKeySFDialogResID ¤= 4771;
93dab7 const ResID¤kSelectRandomSeedSFDialogResID ¤= 4772;
c038a3 const ResID¤kSelectKeySharesSFDialogResID¤  = 4773;
f1af5a
fba2d9 const ResID¤kFileNameStringResID ¤  ¤   ¤   = 4749;
1caf5a
c27353 enum
70bb36 {
15e06b ¤   kPGPPrivateKeyFileNameStrIndex¤ = 1,
e5929a ¤   kPGPPublicKeyFileNameStrIndex,
e0d3da ¤   kPGPRandomSeedFileNameStrIndex,
b79440 ¤   kPGPGroupsFileNameStrIndex
e382f7 };
62af5a
ad7353 enum
eabb36 {
5e0b20 ¤   kShowAllFilesCheckboxItem¤  = 10
fb82f7 };
8aaf5a
af26a9 const ResID¤STRx_UtilStrings¤   ¤   ¤   ¤   = 8946;
507353 enum
c1bb36 {
2751a9 ¤   kSignerKeyImportStringID¤   = 1
5582f7 };
33af5a
9af660 static FSSpec¤  ¤   sLibraryFileSpec¤   ¤   = {0, };
621ce3 static long¤¤   ¤   sLibraryFileID¤ ¤   ¤   = 0;
3a87d8 static short¤   ¤   sLibraryFileRefNum¤ ¤   = -1;
8639d9 static PGPUInt32¤   sLibraryFileRefCount¤   = 0;
39c6a8 static PGPPrefRef¤  sClientPrefsRef¤¤   ¤   = kInvalidPGPPrefRef;
29af5a
91be29 #if PGP_BUSINESS_SECURITY
a1a403 static PGPPrefRef¤  sAdminPrefsRef¤ ¤   ¤   = kInvalidPGPPrefRef;
337454 #endif
7baf5a
2233c8 ¤   static void
4cc8cc RegisterPowerPlantClasses(void)
--2abf 000df854d8a401200ce Page 3 of PGPclientLibUtils.cp
2cbb36 {
24d3d8 ¤   RegisterClass_( LActiveScroller );
02169d ¤   RegisterClass_( LCaption );
92f3bf ¤   RegisterClass_( LGrafPortView );
106197 ¤   RegisterClass_( LIconPane );
eda0a2 ¤   RegisterClass_( LRadioGroupView );
2ca301 ¤   RegisterClass_( LTabGroup );
67323d ¤   RegisterClass_( LView );
bd67c5 ¤
458725 ¤   // Appearance classes:
e667c5 ¤
ac41d9 ¤   RegisterClass_( LBevelButton );
905a7a ¤   RegisterClass_( LCheckBox );
2fa17b ¤   RegisterClass_( LEditText );
198652 ¤   RegisterClass_( LIconControl );
ee0f42 ¤   RegisterClass_( LLittleArrows );
c53e59 ¤   RegisterClass_( LMultiPanelView );
37fa52 ¤   RegisterClass_( LPopupButton );
abb90b ¤   RegisterClass_( LProgressBar );
b30848 ¤   RegisterClass_( LPushButton );
6cb027 ¤   RegisterClass_( LRadioButton );
89da19 ¤   RegisterClass_( LStaticText );
ba49e5 ¤   RegisterClass_( LTabsControl );
2b4a05 ¤   RegisterClass_( LTextGroupBox );
7012e6 ¤   RegisterClass_( LWindowHeader );
42af5a
863ebd ¤   // Register Appearance Manager implementations
b449fe ¤   // Note: Do NOT call RegisterAppearanceClient here. That is the
aad57d ¤   // client library responsibility.
3d67c5 ¤
5c270b ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LBevelButton::imp_class_ID );
0b971b ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LCheckBox::imp_class_ID );
e37038 ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LIconControl::imp_class_ID );
30ae52 ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LProgressBar::imp_class_ID );
edb4d4 ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LTextGroupBox::imp_class_ID );¤ ¤
372aeb ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LWindowHeader::imp_class_ID );
6b05f3 ¤   RegisterClassID_( CPGPAMEditTextImp,¤   LEditText::imp_class_ID );
d10415 ¤   RegisterClassID_( LAMPopupButtonImp,¤   LPopupButton::imp_class_ID );
e7b779 ¤   RegisterClassID_( LAMPushButtonImp,¤¤   LPushButton::imp_class_ID );
323ff2 ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LRadioButton::imp_class_ID );
841ecd ¤   RegisterClassID_( LAMStaticTextImp,¤¤   LStaticText::imp_class_ID );
df61b7 ¤   RegisterClassID_( CPGPAMTabsControlImp, LTabsControl::imp_class_ID );
7c7392 ¤   RegisterClassID_( LAMTrackActionImp, ¤  LLittleArrows::imp_class_ID );
771b52 ¤   ¤
cefd2b ¤   RegisterClass_( CPGPActiveScroller );
66dce2 ¤   RegisterClass_( CPGPModalGrafPortView );
340cb7 ¤   RegisterClass_( CServerStatusDialog );
ce4439 ¤   RegisterClass_( CShareholderList );
4eefe6 }
2faf5a
2185ea ¤   OSStatus
d919de SetLibraryFSSpec(const FSSpec *fileSpec)
9cbb36 {
d7c412 ¤   OSStatus¤   status;
974f27 ¤   CInfoPBRec¤ cpb;
b867c5 ¤
bb23bd ¤   // This routine should be called once ONLY from the library INIT routine.
65293a ¤   pgpAssert( sLibraryFileSpec.name[0] == 0 );
d8e929 ¤   pgpAssert( sLibraryFileID == 0 );
f567c5 ¤
3c494d ¤   status = FSpGetCatInfo( fileSpec, &cpb );
d2dd30 ¤   if( IsntErr( status ) )
7cc7a1 ¤   {
366e73 ¤   ¤   HParamBlockRec¤ pb;
131b52 ¤   ¤
d718f7 ¤   ¤   sLibraryFileSpec = *fileSpec;
ff1b52 ¤   ¤
f60680 ¤   ¤   // Create a file ID so we can track this file later.
691b52 ¤   ¤
7fd8cd ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
b61b52 ¤   ¤
df980e ¤   ¤   pb.fidParam.ioVRefNum¤  = sLibraryFileSpec.vRefNum;
--dc56 000c928e783401200ce Page 4 of PGPclientLibUtils.cp
345678 ¤   ¤   pb.fidParam.ioNamePtr¤  = sLibraryFileSpec.name;
b0685e ¤   ¤   pb.fidParam.ioSrcDirID¤ = sLibraryFileSpec.parID;
f31b52 ¤   ¤
9c3cf2 ¤   ¤   if( IsntErr( PBCreateFileIDRefSync( &pb ) ) )
415b34 ¤   ¤   {
2d6b03 ¤   ¤   ¤   sLibraryFileID = pb.fidParam.ioFileID;
cb0fe4 ¤   ¤   }
7b9371 ¤   }
d367c5 ¤
0b4afd ¤   return( status );
07efe6 }
04af5a
9885ea ¤   OSStatus
cfdf83 PGPGetClientLibFSSpec(FSSpec *fileSpec)
d7bb36 {
e9c412 ¤   OSStatus¤   status;
d54f27 ¤   CInfoPBRec¤ cpb;
ac67c5 ¤
ff9dd5 ¤   pgpAssertAddrValid( fileSpec, FSSpec );
1b706c ¤   AssertSpecIsValid( &sLibraryFileSpec, "PGPGetClientLibFSSpec" );
4367c5 ¤
321736 ¤   status = FSpGetCatInfo( &sLibraryFileSpec, &cpb );
1ab443 ¤   if( IsErr( status ) && sLibraryFileID != 0 )
77c7a1 ¤   {
b3fe52 ¤   ¤   // Find the library using the file ID.
d81b52 ¤   ¤
5a6e73 ¤   ¤   HParamBlockRec¤ pb;
c8e3d6 ¤   ¤   FSSpec¤ ¤   ¤   specCopy;
b01b52 ¤   ¤
fbd8cd ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
d01b52 ¤   ¤
8406f6 ¤   ¤   specCopy = sLibraryFileSpec;
331b52 ¤   ¤
233b1f ¤   ¤   pb.fidParam.ioVRefNum¤  = specCopy.vRefNum;
950f0f ¤   ¤   pb.fidParam.ioNamePtr¤  = specCopy.name;
4eb9ea ¤   ¤   pb.fidParam.ioFileID¤   = sLibraryFileID;
6a1b52 ¤   ¤
da5a56 ¤   ¤   status = PBResolveFileIDRefSync( &pb );
e9706e ¤   ¤   if( IsntErr( status ) )
e85b34 ¤   ¤   {
9b8ea7 ¤   ¤   ¤   specCopy.parID = pb.fidParam.ioSrcDirID;
5287c7 ¤   ¤   ¤
db4ae6 ¤   ¤   ¤   status = FSpGetCatInfo( &specCopy, &cpb );
fefb92 ¤   ¤   ¤   if( IsntErr( status ) )
64f776 ¤   ¤   ¤   {
faa98d ¤   ¤   ¤   ¤   sLibraryFileSpec = specCopy;
65a3a6 ¤   ¤   ¤   }
a70fe4 ¤   ¤   }
739371 ¤   }
79af5a
537bf6 ¤   AssertNoErr( status, "GetPGPclientLibFileSpec" );
2167c5 ¤
1f4f3f ¤   *fileSpec = sLibraryFileSpec;
1c67c5 ¤
764afd ¤   return( status );
4eefe6 }
b4af5a
9233c8 ¤   static void
5ea029 InitializePowerPlant(void)
89bb36 {
1d0d84 ¤   static Boolean¤ firstTime = TRUE;
0b67c5 ¤
5ba40e ¤   if( firstTime )
c9c7a1 ¤   {
cc5c98 #if PGP_DEBUG
17d222 ¤   ¤   gDebugThrow ¤   = debugAction_LowLevelDebugger;
16e9d3 ¤   ¤   gDebugSignal ¤  = debugAction_LowLevelDebugger;
467454 #endif
49af5a
866e86 ¤   ¤   UEnvironment::InitEnvironment();
24609d ¤   ¤   UGraphicUtils::InitGraphicsUtilities();
c9af5a
--14d2 000a42568d7401200ce Page 5 of PGPclientLibUtils.cp
c77424 ¤   ¤   UQDGlobals::SetQDGlobals((QDGlobals*)(*((long*)::LMGetCurrentA5()) -·
692087 ¤   ¤   ¤   ¤   (sizeof(QDGlobals) - sizeof(GrafPtr))));
1c1b52 ¤   ¤
46c491 ¤   ¤   MacLeaks_Suspend();
3aaf5a
d3dadd ¤   ¤   #if USE_MAC_DEBUG_LEAKS
bd37ed ¤   ¤   { CForceInitLPeriodical¤temp; }
45d656 ¤   ¤   #endif
58af5a
ee76c7 ¤   ¤   RegisterPowerPlantClasses();
98af5a
db9538 ¤   ¤   MacLeaks_Resume();
ec1b52 ¤   ¤
c7fbe2 ¤   ¤   LCommander::SetDefaultCommander( NULL );
e51647 ¤   ¤   LPane::SetDefaultView( NULL );
78af5a
d5621f ¤   ¤   firstTime = FALSE;
209371 ¤   }
e8efe6 }
3caf5a
44c744 ¤   PGPError
bde4ec EnterPGPclientLib(
6cba07 ¤   PGPContextRef ¤ ¤   context,
045b2b ¤   PGPclientLibState ¤ *state)
debb36 {
c2865f ¤   CComboError¤¤   err;
9c67c5 ¤
d893d6 ¤   pgpAssertAddrValid( state, PGPclientLibState );
0a67c5 ¤
d152ad ¤   InitializePowerPlant();
4aaf5a
5c621e ¤   pgpClearMemory( state, sizeof( *state ) );
d867c5 ¤
2c31fb ¤   GetPort( &state->savedPort );
cd67c5 ¤
fc6435 ¤   state->savedResLoad ¤   = LMGetResLoad();
2b9448 ¤   state->savedZone¤   ¤   = GetZone();
a7f146 ¤   state->savedResFile¤¤   = CurResFile();
ead985 ¤   state->savedView ¤  ¤   = LPane::GetDefaultView();
a51636 ¤   state->savedCommander ¤ = LCommander::GetDefaultCommander();
3267c5 ¤
93e5c7 ¤   SetResLoad( TRUE );
4aa97f ¤   LCommander::SetDefaultCommander( NULL );
6857b4 ¤   LPane::SetDefaultView( NULL );
ab67c5 ¤
971abe ¤   if( sLibraryFileRefCount == 0 )
56c7a1 ¤   {
851778 ¤   ¤   FSSpec¤ libraryFileSpec;
24af5a
c16ed2 ¤   ¤   pgpAssert( sLibraryFileRefNum == -1 );
f49554 ¤   ¤   pgpAssert( ! PGPPrefRefIsValid( sClientPrefsRef ) );
10377d ¤   #if PGP_BUSINESS_SECURITY
ab380e ¤   ¤   pgpAssert( ! PGPPrefRefIsValid( sAdminPrefsRef ) );
4cb7ec ¤   #endif
7867c5 ¤
4198af ¤   ¤   err.err¤= PGPGetClientLibFSSpec( &libraryFileSpec );
145a9f ¤   ¤   if( err.IsntError() )
405b34 ¤   ¤   {
fe3dd6 ¤   ¤   ¤   sLibraryFileRefNum = FSpOpenResFile( &libraryFileSpec, fsRdPerm );
4d7adb ¤   ¤   ¤   if( sLibraryFileRefNum > 0 )
a9f776 ¤   ¤   ¤   {
7df5f2 ¤   ¤   ¤   ¤   PGPMemoryMgrRef¤memMgr;
7a2b85 ¤   ¤   ¤   ¤
81d814 ¤   ¤   ¤   ¤   memMgr = PGPGetContextMemoryMgr( context );
ec935b ¤   ¤   ¤   ¤   pgpAssert( PGPMemoryMgrRefIsValid( memMgr ) );
432b85 ¤   ¤   ¤   ¤
a3bbdd ¤   ¤   ¤   ¤   err.pgpErr = PGPOpenClientPrefs( memMgr, &sClientPrefsRef );
aeaf5a
cce052 ¤   ¤   ¤   #if PGP_BUSINESS_SECURITY¤  // [
0684e4 ¤   ¤   ¤   ¤   if( err.IsntError() )·
5072c3 ¤   ¤   ¤   ¤   {
a401e9 ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPOpenAdminPrefs( memMgr, &sAdminPrefsRef );
--b959 000fdfc0889401200ce Page 6 of PGPclientLibUtils.cp
862613 ¤   ¤   ¤   ¤   }
cc1635 ¤   ¤   ¤   #endif¤ // ] PGP_BUSINESS_SECURITY
3487c7 ¤   ¤   ¤
4d84e4 ¤   ¤   ¤   ¤   if( err.IsntError() )·
0a72c3 ¤   ¤   ¤   ¤   {
9a9e3f ¤   ¤   ¤   ¤   ¤   ++sLibraryFileRefCount;
34ac75 ¤   ¤   ¤   ¤   ¤   UseResFile( sLibraryFileRefNum );
8a2613 ¤   ¤   ¤   ¤   }
dafa07 ¤   ¤   ¤   ¤   else
2572c3 ¤   ¤   ¤   ¤   {
0e4b87 ¤   ¤   ¤   ¤   ¤   CloseResFile( sLibraryFileRefNum );
2ed64c ¤   ¤   ¤   ¤   ¤   UseResFile( state->savedResFile );
bc4777 ¤   ¤   ¤   ¤   ¤   sLibraryFileRefNum = -1;
9aae30 ¤   ¤   ¤   ¤   ¤
b475b5 ¤   ¤   ¤   ¤   ¤   if( PGPPrefRefIsValid( sClientPrefsRef ) )
604859 ¤   ¤   ¤   ¤   ¤   {
e0b20a ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPClosePrefFile( sClientPrefsRef );
ec1685 ¤   ¤   ¤   ¤   ¤   ¤   sClientPrefsRef = kInvalidPGPPrefRef;
031c89 ¤   ¤   ¤   ¤   ¤   }
c3af5a
f1b2cf ¤   ¤   ¤   ¤   #if PGP_BUSINESS_SECURITY¤  // [
7af96d ¤   ¤   ¤   ¤   ¤   if( PGPPrefRefIsValid( sAdminPrefsRef ) )
f44859 ¤   ¤   ¤   ¤   ¤   {
58eb20 ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPClosePrefFile( sAdminPrefsRef );
03274c ¤   ¤   ¤   ¤   ¤   ¤   sAdminPrefsRef = kInvalidPGPPrefRef;
c91c89 ¤   ¤   ¤   ¤   ¤   }
50ce87 ¤   ¤   ¤   ¤   #endif¤ // ] PGP_BUSINESS_SECURITY
af2613 ¤   ¤   ¤   ¤   }
ada3a6 ¤   ¤   ¤   }
e5bb8c ¤   ¤   ¤   else
11f776 ¤   ¤   ¤   {
475bed ¤   ¤   ¤   ¤   err.pgpErr = kPGPError_FileNotFound;
c6a3a6 ¤   ¤   ¤   }
2f0fe4 ¤   ¤   }
3d9371 ¤   }
cd0e24 ¤   else
99c7a1 ¤   {
cdc165 ¤   ¤   /* Library already open. Just increment the count */
371b52 ¤   ¤
01b52b ¤   ¤   pgpAssert( sLibraryFileRefNum > 0 );
eb1b52 ¤   ¤
5558f0 ¤   ¤   ++sLibraryFileRefCount;
f6748f ¤   ¤   UseResFile( sLibraryFileRefNum );
d59371 ¤   }
baaf5a
3e81c8 ¤   state->clientPrefsRef ¤ = sClientPrefsRef;
cebe29 #if PGP_BUSINESS_SECURITY
26e504 ¤   state->adminPrefsRef ¤  = sAdminPrefsRef;
39db21 #else
a9d225 ¤   state->adminPrefsRef ¤  = kInvalidPGPPrefRef;
4e7454 #endif
ceaf5a
d61be7 ¤   return( err.ConvertToPGPError() );
c6efe6 }
e6af5a
456d52 ¤   void
ad55cf ExitPGPclientLib(const PGPclientLibState *state)
42bb36 {
fd93d6 ¤   pgpAssertAddrValid( state, PGPclientLibState );
65af5a
ca0aa2 ¤   --sLibraryFileRefCount;
1f1abe ¤   if( sLibraryFileRefCount == 0 )
eec7a1 ¤   {
16b52b ¤   ¤   pgpAssert( sLibraryFileRefNum > 0 );
b35231 ¤   ¤   pgpAssert( PGPPrefRefIsValid( sClientPrefsRef ) );
38377d ¤   #if PGP_BUSINESS_SECURITY
d859df ¤   ¤   pgpAssert( PGPPrefRefIsValid( sAdminPrefsRef ) );
28b7ec ¤   #endif
4967c5 ¤
d4903a ¤   ¤   CloseResFile( sLibraryFileRefNum );
9e794a ¤   ¤   sLibraryFileRefNum = -1;
fdaf5a
--3d12 0009b34e2cd401200ce Page 7 of PGPclientLibUtils.cp
fa634b ¤   ¤   if( PGPPrefRefIsValid( sClientPrefsRef ) )
805b34 ¤   ¤   {
b4c42f ¤   ¤   ¤   (void) PGPClosePrefFile( sClientPrefsRef );
a959f3 ¤   ¤   ¤   sClientPrefsRef = kInvalidPGPPrefRef;
010fe4 ¤   ¤   }
ec87c7 ¤   ¤   ¤
53377d ¤   #if PGP_BUSINESS_SECURITY
2eb61b ¤   ¤   if( PGPPrefRefIsValid( sAdminPrefsRef ) )
d15b34 ¤   ¤   {
5e6105 ¤   ¤   ¤   (void) PGPClosePrefFile( sAdminPrefsRef );
e83dd1 ¤   ¤   ¤   sAdminPrefsRef = kInvalidPGPPrefRef;
1e0fe4 ¤   ¤   }
71b7ec ¤   #endif
139371 ¤   }
3baf5a
994e9c ¤   LCommander::SetDefaultCommander( state->savedCommander );
e80d7a ¤   LPane::SetDefaultView( state->savedView );
33af5a
4366ea ¤   SetPort( state->savedPort );
aab2f2 ¤   SetResLoad( state->savedResLoad );
6322e9 ¤   SetZone( state->savedZone );
82800d ¤   UseResFile( state->savedResFile );
54efe6 }
1e67c5 ¤
62c744 ¤   PGPError
254dc8 PGPGetPGPFileName(
3e520e ¤   PGPContextRef¤  context,
5edbaf ¤   PGPFileSelector whichFile,
f1edc6 ¤   StringPtr ¤ ¤   fileName)
c7bb36 {
de8f52 ¤   PGPError¤   ¤   ¤   err;
6c9a69 ¤   PGPclientLibState¤  state;
e767c5 ¤
f75cef ¤   PGPValidatePtr( fileName );
765f87 ¤   fileName[0] = 0;
ee67c5 ¤
dbe5fd ¤   err = EnterPGPclientLib( context, &state );
85b1f0 ¤   if( IsntPGPError( err ) )
6bc7a1 ¤   {
3d8cad ¤   ¤   short¤  ¤   strIndex;
5e1b52 ¤   ¤
51690a ¤   ¤   switch( whichFile )
cb5b34 ¤   ¤   {
8369d3 ¤   ¤   ¤   case kPGPFileSelector_PublicKeys:
07982f ¤   ¤   ¤   ¤   strIndex = kPGPPublicKeyFileNameStrIndex;
80f622 ¤   ¤   ¤   ¤   break;
ba2b85 ¤   ¤   ¤   ¤
e3ba59 ¤   ¤   ¤   case kPGPFileSelector_PrivateKeys:
2fec8a ¤   ¤   ¤   ¤   strIndex = kPGPPrivateKeyFileNameStrIndex;
95f622 ¤   ¤   ¤   ¤   break;
bf2b85 ¤   ¤   ¤   ¤
1d477a ¤   ¤   ¤   case kPGPFileSelector_RandomSeed:
bae0ff ¤   ¤   ¤   ¤   strIndex = kPGPRandomSeedFileNameStrIndex;
21f622 ¤   ¤   ¤   ¤   break;
af87c7 ¤   ¤   ¤
fe59f5 ¤   ¤   ¤   case kPGPFileSelector_Groups:
9e1411 ¤   ¤   ¤   ¤   strIndex = kPGPGroupsFileNameStrIndex;
51f622 ¤   ¤   ¤   ¤   break;
972b85 ¤   ¤   ¤   ¤
0adb68 ¤   ¤   ¤   default:
15bd18 ¤   ¤   ¤   ¤   pgpDebugMsg( "PGPGetPGPFileName(): Invalid selector" );
95566c ¤   ¤   ¤   ¤   err = kPGPError_BadParams;
cc0fe4 ¤   ¤   }
13af5a
2e86f8 ¤   ¤   if( IsntPGPError( err ) )
625b34 ¤   ¤   {
7f5b7f ¤   ¤   ¤   GetIndString( fileName, kFileNameStringResID, strIndex );
bc0fe4 ¤   ¤   }
649371 ¤   }
0367c5 ¤
255df5 ¤   ExitPGPclientLib( &state );
9b67c5 ¤
--314a 00086c28e5f401200ce Page 8 of PGPclientLibUtils.cp
afdeb7 ¤   return( err );
b7efe6 }
35af5a
adaf5a
8cc744 ¤   PGPError
aefd00 PGPGetPGPFileDefaultFSSpec(
9d520e ¤   PGPContextRef¤  context,
99dbaf ¤   PGPFileSelector whichFile,
c6db9e ¤   FSSpec¤ ¤   ¤   *fileSpec)
aebb36 {
2fb8e5 ¤   CComboError¤err;
21c2f1 ¤   Str255¤ ¤   fileName;
7867c5 ¤
6fff1b ¤   PGPValidateParam( IsntNull( fileSpec ) );
b267c5 ¤
381573 ¤   err.pgpErr = PGPGetPGPFileName( context, whichFile, fileName );
c6d3cb ¤   if( err.IsntError() )
88c7a1 ¤   {
50be3a ¤   ¤   short¤  vRefNum;
8bc980 ¤   ¤   long¤   dirID;
b11b52 ¤   ¤
67fe92 ¤   ¤   err.err = FindPGPPreferencesFolder( kOnSystemDisk, &vRefNum, &dirID );
005a9f ¤   ¤   if( err.IsntError() )
195b34 ¤   ¤   {
a10beb ¤   ¤   ¤   err.err = FSMakeFSSpec( vRefNum, dirID, fileName, fileSpec );
e70fe4 ¤   ¤   }
0c9371 ¤   }
4b67c5 ¤
8b1be7 ¤   return( err.ConvertToPGPError() );
2aefe6 }
f1af5a
5cc744 ¤   PGPError
9c7642 PGPSetPGPFileFSSpec(
5a520e ¤   PGPContextRef¤  context,
b4dbaf ¤   PGPFileSelector whichFile,
35291c ¤   const FSSpec¤   *fileSpec)
4cbb36 {
d37d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
e61b10 ¤   PGPsdkPrefSelector¤ prefSelector;
9c67c5 ¤
5c2c8d ¤   PGPValidateParam( PGPContextRefIsValid( context ) );
afff1b ¤   PGPValidateParam( IsntNull( fileSpec ) );
73af5a
f29f6f ¤   switch( whichFile )
99c7a1 ¤   {
c55016 ¤   ¤   case kPGPFileSelector_PublicKeys:
7752f1 ¤   ¤   ¤   prefSelector = kPGPsdkPref_PublicKeyring;
63cdcb ¤   ¤   ¤   break;
2587c7 ¤   ¤   ¤
e32bc1 ¤   ¤   case kPGPFileSelector_PrivateKeys:
bb4a13 ¤   ¤   ¤   prefSelector = kPGPsdkPref_PrivateKeyring;
bfcdcb ¤   ¤   ¤   break;
8087c7 ¤   ¤   ¤
a67ebf ¤   ¤   case kPGPFileSelector_RandomSeed:
ebea07 ¤   ¤   ¤   prefSelector = kPGPsdkPref_RandomSeedFile;
e9cdcb ¤   ¤   ¤   break;
1aaf5a
e9651b ¤   ¤   case kPGPFileSelector_Groups:
e24c6c ¤   ¤   ¤   prefSelector = kPGPsdkPref_GroupsFile;
fecdcb ¤   ¤   ¤   break;
cc1b52 ¤   ¤
549ae3 ¤   ¤   default:
b178a0 ¤   ¤   ¤   pgpDebugMsg( "PGPSetPGPFileFSSpec(): Invalid selector" );
b85820 ¤   ¤   ¤   err = kPGPError_BadParams;
7c9371 ¤   }
d067c5 ¤
25b1f0 ¤   if( IsntPGPError( err ) )
16c7a1 ¤   {
026692 ¤   ¤   PGPFileSpecRef¤ fileRef;
f51b52 ¤   ¤
79bd32 ¤   ¤   err = PGPNewFileSpecFromFSSpec(¤context, fileSpec, &fileRef );
8686f8 ¤   ¤   if( IsntPGPError( err ) )
--bf37 000f7b8d0f3401200ce Page 9 of PGPclientLibUtils.cp
e35b34 ¤   ¤   {
61860f ¤   ¤   ¤   err = PGPsdkPrefSetFileSpec( context, prefSelector, fileRef );
04698b ¤   ¤   ¤   if( IsntPGPError( err ) )
dcf776 ¤   ¤   ¤   {
6fd1c9 ¤   ¤   ¤   ¤   err = PGPsdkSavePrefs( context );
72a3a6 ¤   ¤   ¤   }
7d87c7 ¤   ¤   ¤
0ad008 ¤   ¤   ¤   (void) PGPFreeFileSpec( fileRef );
500fe4 ¤   ¤   }
a39371 ¤   }
8167c5 ¤
c6deb7 ¤   return( err );
8cefe6 }
1baf5a
d61a2a ¤   static pascal Boolean
fa4547 VisibleItemFileFilterProc(CInfoPBRec *cpb)
20bb36 {
b57c56 ¤   Boolean¤shouldFilter = FALSE;
b567c5 ¤
a0a0bd ¤   pgpAssertAddrValid( cpb, CInfoPBRec);
adaf5a
e82577 ¤   if( cpbIsFile( cpb ) )
0bc7a1 ¤   {
cdda16 ¤   ¤   if( ( cpb->hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible ) != 0 )
565b34 ¤   ¤   {
2f7850 ¤   ¤   ¤   shouldFilter = TRUE;
060fe4 ¤   ¤   }
d49371 ¤   }
870e24 ¤   else
a2c7a1 ¤   {
588b69 ¤   ¤   if( ( cpb->dirInfo.ioDrUsrWds.frFlags & kIsInvisible ) != 0 )
125b34 ¤   ¤   {
7c7850 ¤   ¤   ¤   shouldFilter = TRUE;
5e0fe4 ¤   ¤   }
6e9371 ¤   }
6467c5 ¤
50b746 ¤   return( shouldFilter );
c6efe6 }
79af5a
5a6ba8 typedef struct SFInfo
5fbb36 {
770925 ¤   StandardFileReply¤  sfReply;
25bf02 ¤   Boolean¤¤   ¤   ¤   showAllFiles;
3fa0c8 ¤   PGPFileSelector¤¤   fileSelector;
beaf5a
ce81a8 } SFInfo;
8caf5a
cf1a2a ¤   static pascal Boolean
9487ac KeyFileFilterHook(
40e6c7 ¤   CInfoPBRec ¤¤   *cpb,
0225b8 ¤   const SFInfo ¤  *sfInfo)
e3bb36 {
d97c56 ¤   Boolean¤shouldFilter = FALSE;
5a67c5 ¤
af4e12 ¤   shouldFilter = VisibleItemFileFilterProc( cpb );
965e82 ¤   if( ! shouldFilter )
a8c7a1 ¤   {
9cfec2 ¤   ¤   if( cpbIsFile( cpb ) && ! sfInfo->showAllFiles )
495b34 ¤   ¤   {
ff16a2 ¤   ¤   ¤   // Show only the files possibly created by PGP.
e9e750 ¤   ¤   ¤   switch( cpbFileType( cpb ) )
2bf776 ¤   ¤   ¤   {
fd521a ¤   ¤   ¤   ¤   case 'PKey':¤   // ancient MacPGP 2.6.2 filetype
6ec5ca ¤   ¤   ¤   ¤   case kPGPMacFileType_PubRing:
df8d3f ¤   ¤   ¤   ¤   ¤   if( sfInfo->fileSelector != kPGPFileSelector_PublicKeys )
61466d ¤   ¤   ¤   ¤   ¤   ¤   shouldFilter = TRUE;
4a14c3 ¤   ¤   ¤   ¤   ¤   break;
02ae30 ¤   ¤   ¤   ¤   ¤
6fe256 ¤   ¤   ¤   ¤   case 'SKey':¤   // ancient MacPGP 2.6.2 filetype
bc6dc6 ¤   ¤   ¤   ¤   case kPGPMacFileType_PrivRing:
bdd35d ¤   ¤   ¤   ¤   ¤   if( sfInfo->fileSelector != kPGPFileSelector_PrivateKeys )
f7466d ¤   ¤   ¤   ¤   ¤   ¤   shouldFilter = TRUE;
--faee 00070aaca79401200ce Page 10 of PGPclientLibUtils.cp
f014c3 ¤   ¤   ¤   ¤   ¤   break;
59ae30 ¤   ¤   ¤   ¤   ¤
5141da ¤   ¤   ¤   ¤   case kPGPMacFileType_RandomSeed:
b9b5da ¤   ¤   ¤   ¤   ¤   if( sfInfo->fileSelector != kPGPFileSelector_RandomSeed )
a0466d ¤   ¤   ¤   ¤   ¤   ¤   shouldFilter = TRUE;
3814c3 ¤   ¤   ¤   ¤   ¤   break;
2baf5a
153f7a ¤   ¤   ¤   ¤   case kPGPMacFileType_KeyShares:
0be714 ¤   ¤   ¤   ¤   ¤   if( sfInfo->fileSelector != kPGPFileSelector_KeyShares )
50466d ¤   ¤   ¤   ¤   ¤   ¤   shouldFilter = TRUE;
0c14c3 ¤   ¤   ¤   ¤   ¤   break;
26ae30 ¤   ¤   ¤   ¤   ¤
8d6ab9 ¤   ¤   ¤   ¤   default:
0840d5 ¤   ¤   ¤   ¤   ¤   shouldFilter = TRUE;
9d14c3 ¤   ¤   ¤   ¤   ¤   break;
05a3a6 ¤   ¤   ¤   }
2e0fe4 ¤   ¤   }
809371 ¤   }
261b52 ¤   ¤
27b746 ¤   return( shouldFilter );
1fefe6 }
f5af5a
fb6867 ¤   static pascal short
1c2bca KeyFileDialogHook(short item, DialogPtr dialog, SFInfo *sfInfo)
cabb36 {
2063e1 ¤   pgpAssertAddrValid( dialog, DialogRecord );
eca538 ¤   pgpAssertAddrValid( sfInfo, SFInfo );
88af5a
de1a97 ¤   switch( item )
0ac7a1 ¤   {
21c076 ¤   ¤   case kShowAllFilesCheckboxItem:
ab5b34 ¤   ¤   {
e693fb ¤   ¤   ¤   sfInfo->showAllFiles = ToggleDialogCheckbox( dialog,
a1dc69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kShowAllFilesCheckboxItem );
124e13 ¤   ¤   ¤   item = sfHookRebuildList;
95cdcb ¤   ¤   ¤   break;
9d0fe4 ¤   ¤   }
459371 ¤   }
a6e2ea ¤   return item;
efefe6 }
3caf5a
00c744 ¤   PGPError
048d58 PGPSelectPGPFile(
67520e ¤   PGPContextRef¤  context,
2fdbaf ¤   PGPFileSelector whichFile,
d0db9e ¤   FSSpec¤ ¤   ¤   *fileSpec)
54bb36 {
048f52 ¤   PGPError¤   ¤   ¤   err;
cd7331 ¤   PGPclientLibState ¤ state;
2d67c5 ¤
08ff1b ¤   PGPValidateParam( IsntNull( fileSpec ) );
7c67c5 ¤
22e5fd ¤   err = EnterPGPclientLib( context, &state );
0bb1f0 ¤   if( IsntPGPError( err ) )
aec7a1 ¤   {
c21dcb ¤   ¤   ResID¤  dialogResID;
451b52 ¤   ¤
6e690a ¤   ¤   switch( whichFile )
845b34 ¤   ¤   {
e069d3 ¤   ¤   ¤   case kPGPFileSelector_PublicKeys:
200767 ¤   ¤   ¤   ¤   dialogResID = kSelectPublicKeySFDialogResID;
0ef622 ¤   ¤   ¤   ¤   break;
a02b85 ¤   ¤   ¤   ¤
96ba59 ¤   ¤   ¤   case kPGPFileSelector_PrivateKeys:
96b884 ¤   ¤   ¤   ¤   dialogResID = kSelectPrivateKeySFDialogResID;
e3f622 ¤   ¤   ¤   ¤   break;
152b85 ¤   ¤   ¤   ¤
ce477a ¤   ¤   ¤   case kPGPFileSelector_RandomSeed:
82cb82 ¤   ¤   ¤   ¤   dialogResID = kSelectRandomSeedSFDialogResID;
c7f622 ¤   ¤   ¤   ¤   break;
9c2b85 ¤   ¤   ¤   ¤
70af1c ¤   ¤   ¤   case kPGPFileSelector_KeyShares:
--438b 000053b6911401200ce Page 11 of PGPclientLibUtils.cp
bf11fd ¤   ¤   ¤   ¤   dialogResID = kSelectKeySharesSFDialogResID;
e7f622 ¤   ¤   ¤   ¤   break;
b1af5a
9cdb68 ¤   ¤   ¤   default:
f7e4e8 ¤   ¤   ¤   ¤   pgpDebugMsg( "PGPSelectPGPFileFSSpec(): Invalid selector" );
38566c ¤   ¤   ¤   ¤   err = kPGPError_BadParams;
4a0fe4 ¤   ¤   }
db1b52 ¤   ¤
3586f8 ¤   ¤   if( IsntPGPError( err ) )
115b34 ¤   ¤   {
9ca562 ¤   ¤   ¤   SFInfo¤ ¤   ¤   ¤   sfInfo;
9c6a20 ¤   ¤   ¤   SFTypeList¤ ¤   ¤   typeList;
773661 ¤   ¤   ¤   DlgHookYDUPP¤   ¤   cbHook;
c50f30 ¤   ¤   ¤   FileFilterYDUPP¤¤   filterUPP;
63cddf ¤   ¤   ¤   static Point¤   ¤   where={0,0};
bd87c7 ¤   ¤   ¤
04cfda ¤   ¤   ¤   pgpClearMemory( &sfInfo, sizeof( sfInfo ) );
a687c7 ¤   ¤   ¤
552fed ¤   ¤   ¤   cbHook ¤¤   = NewDlgHookYDProc( KeyFileDialogHook );
bf741c ¤   ¤   ¤   filterUPP¤  = NewFileFilterYDProc( KeyFileFilterHook );
c84f08 ¤   ¤   ¤   typeList[0] = 0;
ba87c7 ¤   ¤   ¤
3d8a85 ¤   ¤   ¤   sfInfo.showAllFiles = FALSE;
ae6798 ¤   ¤   ¤   sfInfo.fileSelector¤= whichFile;
dd87c7 ¤   ¤   ¤
1b5063 ¤   ¤   ¤   CustomGetFile( filterUPP, -1, typeList, &sfInfo.sfReply,
bab3bc ¤   ¤   ¤   ¤   ¤   dialogResID, where, cbHook, NULL, NULL, NULL,
8ae500 ¤   ¤   ¤   ¤   ¤   &sfInfo );
20da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
1e351b ¤   ¤   ¤   DisposeRoutineDescriptor( cbHook );
4c4cfe ¤   ¤   ¤   DisposeRoutineDescriptor( filterUPP );
9c87c7 ¤   ¤   ¤
b6cbd3 ¤   ¤   ¤   if( sfInfo.sfReply.sfGood )
fdf776 ¤   ¤   ¤   {
b587c2 ¤   ¤   ¤   ¤   *fileSpec = sfInfo.sfReply.sfFile;
f2a3a6 ¤   ¤   ¤   }
04bb8c ¤   ¤   ¤   else
d6f776 ¤   ¤   ¤   {
414067 ¤   ¤   ¤   ¤   err = kPGPError_UserAbort;
51a3a6 ¤   ¤   ¤   }
480fe4 ¤   ¤   }
239371 ¤   }
fe67c5 ¤
1b5df5 ¤   ExitPGPclientLib( &state );
c967c5 ¤
61deb7 ¤   return( err );
7befe6 }
0baf5a
eac744 ¤   PGPError
1ce941 PGPInitClientDecodeEventHandlerData(
2a06bb ¤   PGPContextRef ¤ ¤   ¤   ¤   ¤   context,
b1a3e7 ¤   PGPtlsContextRef¤   ¤   ¤   ¤   tlsContext,
1aab46 ¤   PGPKeySetRef ¤  ¤   ¤   ¤   ¤   allKeys,
de9f0d ¤   PGPClientDecodeEventHandlerData *data)
9ebb36 {
778e12 ¤   PGPError¤   err = kPGPError_NoErr;
5b67c5 ¤
e92c8d ¤   PGPValidateParam( PGPContextRefIsValid( context ) );
57c40d ¤   PGPValidatePtr( data );
0b67c5 ¤
64bdea ¤   pgpClearMemory( data, sizeof( *data ) );
e067c5 ¤
483f0a ¤   data->context ¤ ¤   = context;
5509d9 ¤   data->tlsContext¤   = tlsContext;
b9a149 ¤   data->allKeys¤  ¤   = allKeys;
4867c5 ¤
8a921f ¤   err = PGPNewPassBuffer( PGPGetContextMemoryMgr( context ),
0dc5b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &data->passBuffer);
fedeb7 ¤   return( err );
aaefe6 }
4caf5a
056d52 ¤   void
--74d8 0000b250d73401200ce Page 12 of PGPclientLibUtils.cp
96778b PGPCleanupClientDecodeEventHandlerData(
299f0d ¤   PGPClientDecodeEventHandlerData *data)
f5bb36 {
5d0b9a ¤   if( IsntNull( data ) )
d7c7a1 ¤   {
761bfd ¤   ¤   if( PGPKeySetRefIsValid( data->recipientKeySet ) )
e3f2bb ¤   ¤   ¤   (void) PGPFreeKeySet( data->recipientKeySet );
0caf5a
40b9e9 ¤   ¤   if( PGPKeySetRefIsValid( data->newKeySet ) )
a7df76 ¤   ¤   ¤   (void) PGPFreeKeySet( data->newKeySet );
4daf5a
ceefb3 ¤   ¤   if( IsntNull( data->recipientKeyIDList ) )
a5a07a ¤   ¤   ¤   PGPFreeData( data->recipientKeyIDList );
3caf5a
29e79c ¤   ¤   if( PGPPassBufferRefIsValid( data->passBuffer ) )
00425f ¤   ¤   ¤   PGPFreePassBuffer( data->passBuffer );
4caf5a
9cef77 ¤   ¤   pgpClearMemory( data, sizeof( *data ) );
089371 ¤   }
3aefe6 }
02af5a
a5c744 ¤   PGPError
265eaf PGPClientDecodeEventHandler(
6d06bb ¤   PGPContextRef ¤ ¤   ¤   ¤   ¤   context,
de8801 ¤   struct PGPEvent ¤   ¤   ¤   ¤   *event,
41e165 ¤   PGPClientDecodeEventHandlerData *data )
e5bb36 {
e68e12 ¤   PGPError¤   err = kPGPError_NoErr;
c367c5 ¤
3fc40d ¤   PGPValidatePtr( data );
217a19 ¤   PGPValidateParam( data->context == context );
6867c5 ¤
8fa505 ¤   switch( event->type )
a3c7a1 ¤   {
a66b1d ¤   ¤   case kPGPEvent_BeginLexEvent:
8a5b34 ¤   ¤   {
a0a0bf ¤   ¤   ¤   pgpAssert( IsNull( data->outputBuffer ) );
387a51 ¤   ¤   ¤   pgpAssert( data->outputBufferSize == 0 );
bc87c7 ¤   ¤   ¤
55562c ¤   ¤   ¤   pgpClearMemory( &data->signatureData,·
b1b533 ¤   ¤   ¤   ¤   ¤   ¤   sizeof( data->signatureData ) );
ed94aa ¤   ¤   ¤   ¤   ¤   ¤
7f044a ¤   ¤   ¤   data->signatureDataValid = FALSE;
6d87c7 ¤   ¤   ¤
4ccdcb ¤   ¤   ¤   break;
4a0fe4 ¤   ¤   }
551b52 ¤   ¤
a6cb7a ¤   ¤   case kPGPEvent_EndLexEvent:
565b34 ¤   ¤   {
dcf69c ¤   ¤   ¤   if( IsntNull( data->outputBuffer ) )
7984cd ¤   ¤   ¤   ¤   PGPFreeData( data->outputBuffer );
301b52 ¤   ¤
4eda09 ¤   ¤   ¤   data->outputBuffer ¤¤   = NULL;
631b90 ¤   ¤   ¤   data->outputBufferSize¤ = 0;
6587c7 ¤   ¤   ¤
7acdcb ¤   ¤   ¤   break;
490fe4 ¤   ¤   }
ca1b52 ¤   ¤
900c74 ¤   ¤   case kPGPEvent_AnalyzeEvent:
435b34 ¤   ¤   {
e97251 ¤   ¤   ¤   data->sectionType = event->data.analyzeData.sectionType;
bbcdcb ¤   ¤   ¤   break;
580fe4 ¤   ¤   }
5b87c7 ¤   ¤   ¤
fb6773 ¤   ¤   case kPGPEvent_OutputEvent:
815b34 ¤   ¤   {
443114 ¤   ¤   ¤   err = PGPAddJobOptions( event->job,
bdcf63 ¤   ¤   ¤   ¤   ¤   ¤   PGPOAllocatedOutputBuffer( context, &data->outputBuffer,
546b6c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   MAX_PGPSize, &data->outputBufferSize ),
0a931b ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
aecdcb ¤   ¤   ¤   break;
0b0fe4 ¤   ¤   }
--a9d1 000418630ff401200ce Page 13 of PGPclientLibUtils.cp
f11b52 ¤   ¤
bca537 ¤   ¤   case kPGPEvent_PassphraseEvent:
655b34 ¤   ¤   {
2c7cfc ¤   ¤   ¤   char¤   *passphrase = NULL;
cb87c7 ¤   ¤   ¤
c01ea1 ¤   ¤   ¤   data->conventional ¤= FALSE;
27863a ¤   ¤   ¤   data->split ¤   ¤   = FALSE;
214982 ¤   ¤   ¤   data->decryptionKey¤= kInvalidPGPKeyRef;
ab87c7 ¤   ¤   ¤
a76d34 ¤   ¤   ¤   /* Clear previous passphrase attempt(s) */
7bd194 ¤   ¤   ¤   (void) PGPClearPassBuffer( data->passBuffer );
aeaf5a
be2941 ¤   ¤   ¤   if( event->data.passphraseData.fConventional )
e0f776 ¤   ¤   ¤   {
384e39 ¤   ¤   ¤   ¤   err = PGPConventionalDecryptionPassphraseDialog( context,
12586f ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->prompt[0] != 0 ?
2f1f7a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt( context, data->prompt ) :
425603 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( context ),
530709 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( context, &passphrase ),
98fc28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
d0a3a6 ¤   ¤   ¤   }
afbb8c ¤   ¤   ¤   else
34f776 ¤   ¤   ¤   {
2e4561 ¤   ¤   ¤   ¤   PGPKeySetRef¤   newKeySet = kInvalidPGPKeySetRef;
662b85 ¤   ¤   ¤   ¤
f4b57a ¤   ¤   ¤   ¤   err = PGPClientDecryptionPassphraseDialog( context,
3b2433 ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->tlsContext,
080f50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->prompt[0] != 0 ? data->prompt : NULL,
c34174 ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->recipientKeySet,
41e6a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->recipientKeyIDList, data->recipientKeyIDCount,
333caa ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPOptionListRef, &passphrase,
4ced24 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &data->decryptionKey, &newKeySet );
ed0d33 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) && PGPKeySetRefIsValid( newKeySet ) )
1372c3 ¤   ¤   ¤   ¤   {
a02a46 ¤   ¤   ¤   ¤   ¤   if( PGPKeySetRefIsValid( data->newKeySet ) )
8f4859 ¤   ¤   ¤   ¤   ¤   {
32a09e ¤   ¤   ¤   ¤   ¤   ¤   err = PGPAddKeys( data->newKeySet, newKeySet );
ba239e ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
7e8fec ¤   ¤   ¤   ¤   ¤   ¤   {
a1ca06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPCommitKeyRingChanges( newKeySet );
1d531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
84fea8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( data->newKeySet );
0bdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
dc1c89 ¤   ¤   ¤   ¤   ¤   }
2b2b85 ¤   ¤   ¤   ¤
2a5572 ¤   ¤   ¤   ¤   ¤   data->newKeySet = newKeySet;
7f2613 ¤   ¤   ¤   ¤   }
caa3a6 ¤   ¤   ¤   }
ab87c7 ¤   ¤   ¤
83698b ¤   ¤   ¤   if( IsntPGPError( err ) )
24f776 ¤   ¤   ¤   {
1ecc5b ¤   ¤   ¤   ¤   data->conventional = event->data.passphraseData.fConventional;
912b85 ¤   ¤   ¤   ¤
564b56 ¤   ¤   ¤   ¤   err = PGPPassBufferSetPassphrase( data->passBuffer, passphrase ¶
f36275 );
5a5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
f372c3 ¤   ¤   ¤   ¤   {
c1f2f9 ¤   ¤   ¤   ¤   ¤   err = PGPAddJobOptions( event->job,
4f363d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( context, passphrase ),
0fda9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
662613 ¤   ¤   ¤   ¤   }
262b85 ¤   ¤   ¤   ¤
608ed9 ¤   ¤   ¤   ¤   PGPFreeData( passphrase );
04a3a6 ¤   ¤   ¤   }
65f2af ¤   ¤   ¤   else if( err == kPGPError_KeyUnusableForDecryption )
13f776 ¤   ¤   ¤   {
97a4b2 ¤   ¤   ¤   ¤   PGPByte¤¤   *passKey;
271840 ¤   ¤   ¤   ¤   PGPSize¤¤   passKeySize;
d52b85 ¤   ¤   ¤   ¤
bddd31 ¤   ¤   ¤   ¤   data->split¤= TRUE;
ae2b85 ¤   ¤   ¤   ¤
41a33b ¤   ¤   ¤   ¤   err = PGPReconstitutionDialog( data->decryptionKey,
--a765 0001343b04d401200ce Page 14 of PGPclientLibUtils.cp
1bf32b ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->allKeys, kInvalidPGPtlsContextRef,
bffbc9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passKey, &passKeySize);
b12b85 ¤   ¤   ¤   ¤
955565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
7f72c3 ¤   ¤   ¤   ¤   {
db2451 ¤   ¤   ¤   ¤   ¤   pgpAssert( passKey != NULL );
e32d8b ¤   ¤   ¤   ¤   ¤   pgpAssert( passKeySize != 0 );
eaae30 ¤   ¤   ¤   ¤   ¤
8977f8 ¤   ¤   ¤   ¤   ¤   err = PGPPassBufferSetPassKey( data->passBuffer, passKey,
82d170 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passKeySize );
016ca0 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
a34859 ¤   ¤   ¤   ¤   ¤   {
267dae ¤   ¤   ¤   ¤   ¤   ¤   err = PGPAddJobOptions( event->job,
22ea48 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( context, passKey,
fd09e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passKeySize ),
3a00b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
8f1c89 ¤   ¤   ¤   ¤   ¤   }
24da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
95899e ¤   ¤   ¤   ¤   ¤   PGPFreeData( passKey );
992613 ¤   ¤   ¤   ¤   }
8ea3a6 ¤   ¤   ¤   }
3e87c7 ¤   ¤   ¤
a7cdcb ¤   ¤   ¤   break;
c00fe4 ¤   ¤   }
dc67c5 ¤
839dce ¤   ¤   case kPGPEvent_RecipientsEvent:
335b34 ¤   ¤   {
c86088 ¤   ¤   ¤   pgpAssert( ! PGPKeySetRefIsValid( data->recipientKeySet ) );
ce183b ¤   ¤   ¤   pgpAssert( IsNull( data->recipientKeyIDList ) );
a18eee ¤   ¤   ¤   pgpAssert( data->recipientKeyIDCount == 0 );
26af5a
24cabd ¤   ¤   ¤   data->recipientKeySet = event->data.recipientsData.recipientSet;
931b1f ¤   ¤   ¤   if( PGPKeySetRefIsValid( data->recipientKeySet ) )
f3f776 ¤   ¤   ¤   {
e2b4bf ¤   ¤   ¤   ¤   err = PGPIncKeySetRefCount( data->recipientKeySet );
0aa3a6 ¤   ¤   ¤   }
cf87c7 ¤   ¤   ¤
0f55bc ¤   ¤   ¤   if( IsntPGPError( err ) &&
5c790f ¤   ¤   ¤   ¤   IsntNull( event->data.recipientsData.keyIDArray ) )
80f776 ¤   ¤   ¤   {
54b207 ¤   ¤   ¤   ¤   PGPSize¤dataSize;
a42b85 ¤   ¤   ¤   ¤
3b14dc ¤   ¤   ¤   ¤   data->recipientKeyIDCount =
780b8d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   event->data.recipientsData.keyCount;
93aebb ¤   ¤   ¤   ¤   dataSize = data->recipientKeyIDCount * sizeof( PGPKeyID );
492b85 ¤   ¤   ¤   ¤
49ef4b ¤   ¤   ¤   ¤   data->recipientKeyIDList = (PGPKeyID *) PGPNewData(
cf2fe5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( data->context ),
a27ab2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dataSize, 0 );
f6f9af ¤   ¤   ¤   ¤   if( IsntNull( data->recipientKeyIDList ) )
8b72c3 ¤   ¤   ¤   ¤   {
7eaf63 ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( event->data.recipientsData.keyIDArray,
fa91de ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->recipientKeyIDList, dataSize );
1e2613 ¤   ¤   ¤   ¤   }
97fa07 ¤   ¤   ¤   ¤   else
8172c3 ¤   ¤   ¤   ¤   {
d6ed29 ¤   ¤   ¤   ¤   ¤   err = kPGPError_OutOfMemory;
972613 ¤   ¤   ¤   ¤   }
ffa3a6 ¤   ¤   ¤   }
5687c7 ¤   ¤   ¤
46cdcb ¤   ¤   ¤   break;
bd0fe4 ¤   ¤   }
d01b52 ¤   ¤
07c503 ¤   ¤   case kPGPEvent_SignatureEvent:
725b34 ¤   ¤   {
3e87a7 ¤   ¤   ¤   PGPBoolean¤ ¤   addedKeySetToJob;
2a30a1 ¤   ¤   ¤   PGPKeySetRef¤   newKeySet;
cfaf5a
9d3054 ¤   ¤   ¤   err = PGPSignerKeyLookup( context, event, kInvalidPGPKeySetRef,
aa7e14 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &addedKeySetToJob, &newKeySet);
08698b ¤   ¤   ¤   if( IsntPGPError( err ) )
13f776 ¤   ¤   ¤   {
--520e 000c35f12df401200ce Page 15 of PGPclientLibUtils.cp
04f27d ¤   ¤   ¤   ¤   if( addedKeySetToJob )
5472c3 ¤   ¤   ¤   ¤   {
592a46 ¤   ¤   ¤   ¤   ¤   if( PGPKeySetRefIsValid( data->newKeySet ) )
9f4859 ¤   ¤   ¤   ¤   ¤   {
27a09e ¤   ¤   ¤   ¤   ¤   ¤   err = PGPAddKeys( data->newKeySet, newKeySet );
2d239e ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
2e8fec ¤   ¤   ¤   ¤   ¤   ¤   {
beca06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPCommitKeyRingChanges( newKeySet );
d2af5a
c8fea8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( data->newKeySet );
afdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
2e1c89 ¤   ¤   ¤   ¤   ¤   }
eaaf5a
6a5572 ¤   ¤   ¤   ¤   ¤   data->newKeySet = newKeySet;
372613 ¤   ¤   ¤   ¤   }
66fa07 ¤   ¤   ¤   ¤   else
f272c3 ¤   ¤   ¤   ¤   {
956fbe ¤   ¤   ¤   ¤   ¤   data->signatureData ¤   ¤   = event->data.signatureData;
8339f1 ¤   ¤   ¤   ¤   ¤   data->signatureDataValid ¤  = TRUE;
6b2613 ¤   ¤   ¤   ¤   }
aca3a6 ¤   ¤   ¤   }
d2af5a
c3cdcb ¤   ¤   ¤   break;
d00fe4 ¤   ¤   }
571b52 ¤   ¤
509ae3 ¤   ¤   default:
8acdcb ¤   ¤   ¤   break;
749371 ¤   }
9067c5 ¤
35deb7 ¤   return( err );
78efe6 }
0daf5a
41af5a
37af5a
30c744 ¤   PGPError
989840 PGPCheckAutoUpdateKeysFromServer(
3d0185 ¤   PGPMemoryMgrRef¤memoryMgr,
dac5ba ¤   PGPBoolean¤ ¤   launchKeys,
8f2d89 ¤   PGPBoolean *¤   updateAllKeys,
5fb908 ¤   PGPBoolean *¤   updateTrustedIntroducers)
e8bb36 {
9fbe29 #if PGP_BUSINESS_SECURITY
96f418 ¤   static const OSType¤kPGPkeysType = 'APPL';
85e80f ¤   static const OSType¤kPGPkeysCreator = 'pgpK';
d7e4de ¤   PGPError¤   ¤   ¤   result;
8114f0 ¤   PGPUInt32¤  ¤   ¤   lastUpdate;
946d3f ¤   PGPUInt32¤  ¤   ¤   updateInterval;
8a3b90 ¤   UInt32¤ ¤   ¤   ¤   timeNow;
5ce081 ¤   PGPPrefRef¤ ¤   ¤   adminPrefs;
4712c1 ¤   PGPBoolean¤ ¤   ¤   shouldUpdateAllKeys = false;
34e46c ¤   PGPBoolean¤ ¤   ¤   shouldUpdateTrustedIntroducers = false;
4c1949 ¤   FSSpec¤ ¤   ¤   ¤   libraryFileSpec;
3a67c5 ¤
145168 ¤   try {
f46211 ¤   ¤   PGPValidateParam(PGPMemoryMgrRefIsValid(memoryMgr));
f01b52 ¤   ¤
332251 ¤   ¤   result = PGPGetClientLibFSSpec(&libraryFileSpec);
397568 ¤   ¤   if (IsntPGPError(result)) {
cc1792 ¤   ¤   ¤   StSaveCurResFile¤   savedFile(libraryFileSpec);
c587c7 ¤   ¤   ¤
2e6325 ¤   ¤   ¤   ::GetDateTime(&timeNow);
df960f ¤   ¤   ¤   result = PGPOpenAdminPrefs(¤memoryMgr,
292ab9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &adminPrefs);
d4b03d ¤   ¤   ¤   if (IsntPGPError(result)) {
6dd126 ¤   ¤   ¤   ¤   // Check trusted introducers
d72c45 ¤   ¤   ¤   ¤   result = PGPGetPrefNumber(
e102b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   adminPrefs,
cccd4e ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDaysUpdateTrustedIntroducers,
89a8db ¤   ¤   ¤   ¤   ¤   ¤   ¤   &updateInterval);
131b12 ¤   ¤   ¤   ¤   if (IsntPGPError(result) && (updateInterval > 0)) {
4bbddd ¤   ¤   ¤   ¤   ¤   result = PGPGetPrefNumber(
c38ad5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   adminPrefs,
--24da 000d6dda834401200ce Page 16 of PGPclientLibUtils.cp
afa9fe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefLastTrustedIntroducersUpdate,
88aa47 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &lastUpdate);
056c3e ¤   ¤   ¤   ¤   ¤   if (IsntPGPError(result) &&
0b01bc ¤   ¤   ¤   ¤   ¤   (((timeNow - lastUpdate) / 86400) >= updateInterval)) {
6ae8ae ¤   ¤   ¤   ¤   ¤   ¤   shouldUpdateTrustedIntroducers = true;
991c89 ¤   ¤   ¤   ¤   ¤   }
ee2613 ¤   ¤   ¤   ¤   }
a62b85 ¤   ¤   ¤   ¤
7be0df ¤   ¤   ¤   ¤   // Check all keys
c5385b ¤   ¤   ¤   ¤   if (IsntPGPError(result)) {
764cec ¤   ¤   ¤   ¤   ¤   result = PGPGetPrefNumber(¤ adminPrefs,
55ab62 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDaysUpdateAllKeys,
33148a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &updateInterval);
ea5565 ¤   ¤   ¤   ¤   ¤   if (IsntPGPError(result) && (updateInterval > 0)) {
9c88f0 ¤   ¤   ¤   ¤   ¤   ¤   result = PGPGetPrefNumber(¤ adminPrefs,
541435 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefLastAllKeysUpdate,
881616 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &lastUpdate);
4bfa7f ¤   ¤   ¤   ¤   ¤   ¤   if (IsntPGPError(result) &&
c554ec ¤   ¤   ¤   ¤   ¤   ¤   (((timeNow - lastUpdate) / 86400) >= updateInterval)) {
ba48b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   shouldUpdateAllKeys = true;
6bdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
6e1c89 ¤   ¤   ¤   ¤   ¤   }
7c2613 ¤   ¤   ¤   ¤   }
9cd8bb ¤   ¤   ¤   ¤   PGPClosePrefFile(adminPrefs);
052b85 ¤   ¤   ¤   ¤
dbb079 ¤   ¤   ¤   ¤   // Set booleans
0f385b ¤   ¤   ¤   ¤   if (IsntPGPError(result)) {
fece85 ¤   ¤   ¤   ¤   ¤   if (updateAllKeys != NULL) {
2f2c62 ¤   ¤   ¤   ¤   ¤   ¤   *updateAllKeys = shouldUpdateAllKeys;
181c89 ¤   ¤   ¤   ¤   ¤   }
19d5b7 ¤   ¤   ¤   ¤   ¤   if (updateTrustedIntroducers != NULL) {
169392 ¤   ¤   ¤   ¤   ¤   ¤   *updateTrustedIntroducers = shouldUpdateTrustedIntroduc¶
5b7638 ers;
141c89 ¤   ¤   ¤   ¤   ¤   }
e92613 ¤   ¤   ¤   ¤   }
a32b85 ¤   ¤   ¤   ¤
fc4f95 ¤   ¤   ¤   ¤   // Launch keys if necessary
caac52 ¤   ¤   ¤   ¤   if (IsntPGPError(result) && launchKeys &&
34651b ¤   ¤   ¤   ¤   (shouldUpdateAllKeys || shouldUpdateTrustedIntroducers)) {
37c487 ¤   ¤   ¤   ¤   ¤   result = BringAppToFront(¤  kPGPkeysType,
671a2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPkeysCreator,
f230b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kFindAppOnAllVolumes,
45068b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true,
248cf1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
77df17 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil);
a9ae30 ¤   ¤   ¤   ¤   ¤
cdcf5e ¤   ¤   ¤   ¤   ¤   // BringAppToFront returns an OSStatus,
594534 ¤   ¤   ¤   ¤   ¤   // so convert to PGPError
67884b ¤   ¤   ¤   ¤   ¤   if (result != noErr) {
6960ab ¤   ¤   ¤   ¤   ¤   ¤   result = MacErrorToPGPError(result);
b41c89 ¤   ¤   ¤   ¤   ¤   }
582613 ¤   ¤   ¤   ¤   }
daa3a6 ¤   ¤   ¤   }
0f0fe4 ¤   ¤   }
e99371 ¤   }
8c67c5 ¤
e4e0a3 ¤   catch (...) {
04414a ¤   ¤   result = kPGPError_UnknownError;
a29371 ¤   }
1d67c5 ¤
a35d73 ¤   return result;
eddb21 #else
49d3dd ¤   (void) memoryMgr;
88de15 ¤   (void) launchKeys;
378bd5 ¤   (void) updateAllKeys;
f2e594 ¤   (void) updateTrustedIntroducers;
c0af5a
e94a1f ¤   pgpAssert("PGP_BUSINESS_SECURITY not defined");
aee63f ¤   return kPGPError_FeatureNotAvailable;
637454 #endif
0befe6 }
d6af5a
--5e0b 000e2c34a8f401200ce Page 17 of PGPclientLibUtils.cp
e0af5a
1aaf5a
66c744 ¤   PGPError
4a3bee PGPSignerKeyLookup(
0a520e ¤   PGPContextRef¤  context,
883981 ¤   PGPEvent *¤ ¤   event,
2458ff ¤   PGPKeySetRef¤   defaultKeySet,
ba8a77 ¤   PGPBoolean *¤   addedKeySetToJob,
4c8e61 ¤   PGPKeySetRef *¤ newKeySet)
5dbb36 {
9183e5 ¤   PGPError¤   ¤   result = kPGPError_NoErr;
a1b187 ¤   PGPPrefRef¤ ¤   prefRef = kInvalidPGPPrefRef;
be401a ¤   PGPKeySetRef¤   signerKeySet = kInvalidPGPKeySetRef;
e4def7 ¤   PGPUInt32¤  ¤   count;
8bcbe6 ¤   PGPBoolean¤ ¤   sync;
2caf5a
03ade4 ¤   // Validation
923e8d ¤   PGPValidatePtr(event);
f1e8d4 ¤   PGPValidateParam(event->type == kPGPEvent_SignatureEvent);
fd4928 ¤   PGPValidatePtr(addedKeySetToJob);
ab165a ¤   *addedKeySetToJob = false;
abd4a3 ¤   if (newKeySet != NULL) {
6c3e90 ¤   ¤   PGPValidatePtr(newKeySet);
799373 ¤   ¤   *newKeySet = kInvalidPGPKeySetRef;
099371 ¤   }
7267c5 ¤
0859fd ¤   // Lookup key if necessary
a647e4 ¤   if (! PGPKeyRefIsValid(event->data.signatureData.signingKey)) {
59899a ¤   ¤   result = PGPOpenClientPrefs(¤   PGPGetContextMemoryMgr(context),
8b4e75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &prefRef);
f97568 ¤   ¤   if (IsntPGPError(result)) {
854f48 ¤   ¤   ¤   result = PGPGetPrefBoolean(¤prefRef,
da4f96 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefKeyServerSyncOnVerify,
c4a7d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &sync);
10ba33 ¤   ¤   ¤   PGPClosePrefFile(prefRef);
4d0fe4 ¤   ¤   }
ae1b52 ¤   ¤
819ea3 ¤   ¤   if (IsntPGPError(result) && sync) {
4241dd ¤   ¤   ¤   result = PGPGetKeyIDFromServer(
656614 ¤   ¤   ¤   ¤   ¤   ¤   context,
e5d70b ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPtlsContextRef,
eba6a6 ¤   ¤   ¤   ¤   ¤   ¤   &event->data.signatureData.signingKeyID,
d862a9 ¤   ¤   ¤   ¤   ¤   ¤   &signerKeySet);
38fd5f ¤   ¤   ¤   if (IsntPGPError(result) && PGPKeySetRefIsValid(signerKeySet)) {
402bef ¤   ¤   ¤   ¤   result = PGPCountKeys(signerKeySet, &count);
cca3a6 ¤   ¤   ¤   }
e90f44 ¤   ¤   ¤   if (IsntPGPError(result) && (count > 0)) {
9ee97f ¤   ¤   ¤   ¤   result = PGPAddJobOptions(¤ event->job,
386b84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeySetRef(¤ context,
efc83b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signerKeySet),
d049a6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(context));
8c385b ¤   ¤   ¤   ¤   if (IsntPGPError(result)) {
66d525 ¤   ¤   ¤   ¤   ¤   *addedKeySetToJob = true;
84ae30 ¤   ¤   ¤   ¤   ¤
27d785 ¤   ¤   ¤   ¤   ¤   // Do a selective import
1974c3 ¤   ¤   ¤   ¤   ¤   if (PGPKeySetRefIsValid(defaultKeySet)) {
380ce4 ¤   ¤   ¤   ¤   ¤   ¤   try {
3428c3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FSSpec¤ libraryFileSpec;
97531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
390697 ¤   ¤   ¤   ¤   ¤   ¤   ¤   result = PGPGetClientLibFSSpec(&libraryFileSpec);
87e3e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (IsntPGPError(result)) {
d0a7a8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   StSaveCurResFile¤   savedResFile(
9d909b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   libraryFileSpec);
37eee1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   selectedKeySet;
28da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
e949fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   result = PGPSelectKeysDialog(
1459af ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   context,
109bac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation,¤ ¶
f094aa ¤   ¤   ¤   ¤   ¤   ¤
ecce82 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(
507271 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_UtilStrings,
e21071 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSignerKeyImportStringID),¤ ¶
--dea0 00029abf1b7401200ce Page 18 of PGPclientLibUtils.cp
e694aa ¤   ¤   ¤   ¤   ¤   ¤
90df2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signerKeySet,¤  ¤   ¤   ¤   ¤   ¶
231b52 ¤   ¤
ff9b44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeySet,
8bfc05 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &selectedKeySet);
066cb1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (IsntPGPError(result)) {
8154f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   result = PGPSharedAddKeysToDefaultKeyring(
3a615c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectedKeySet);
a986be ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet(selectedKeySet);
486560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
555268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
2bdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
ff94aa ¤   ¤   ¤   ¤   ¤   ¤
f04ca3 ¤   ¤   ¤   ¤   ¤   ¤   catch (...) {
dc0ff2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   result = kPGPError_UnknownError;
92db3c ¤   ¤   ¤   ¤   ¤   ¤   }
a61c89 ¤   ¤   ¤   ¤   ¤   }
7aae30 ¤   ¤   ¤   ¤   ¤
8d31c2 ¤   ¤   ¤   ¤   ¤   // Return the keyset
e45e92 ¤   ¤   ¤   ¤   ¤   if (IsntNull(newKeySet)) {
06abe4 ¤   ¤   ¤   ¤   ¤   ¤   *newKeySet = signerKeySet;
9690aa ¤   ¤   ¤   ¤   ¤   ¤   signerKeySet = kInvalidPGPKeySetRef;
201c89 ¤   ¤   ¤   ¤   ¤   }
3b2613 ¤   ¤   ¤   ¤   }
0aa3a6 ¤   ¤   ¤   }
972516 ¤   ¤   ¤   if (PGPKeySetRefIsValid(signerKeySet)) {
1b7a0b ¤   ¤   ¤   ¤   PGPFreeKeySet(signerKeySet);
11a3a6 ¤   ¤   ¤   }
d20fe4 ¤   ¤   }
8c9371 ¤   }
2a67c5 ¤
c85d73 ¤   return result;
a5efe6 }
cc67c5 ¤
8aaf5a
a7af5a
35c744 ¤   PGPError
815f84 PGPGuaranteeMinimumEntropy(
42df04 ¤   PGPContextRef¤  ¤   context)
01bb36 {
fb8e12 ¤   PGPError¤   err = kPGPError_NoErr;
2267c5 ¤
2a4d81 ¤   if( ! PGPGlobalRandomPoolHasMinimumEntropy() )
16c7a1 ¤   {
061f1b ¤   ¤   PGPUInt32¤  haveBits;
8d4dba ¤   ¤   PGPUInt32¤  neededBits;
c31b52 ¤   ¤
7c7c3a ¤   ¤   haveBits ¤  = PGPGlobalRandomPoolGetEntropy();
6b38eb ¤   ¤   neededBits ¤= PGPGlobalRandomPoolGetMinimumEntropy();
7c1b52 ¤   ¤
f158a0 ¤   ¤   pgpAssert( haveBits < neededBits );
511b52 ¤   ¤
ad1c82 ¤   ¤   if( haveBits < neededBits )
915b34 ¤   ¤   {
d91b04 ¤   ¤   ¤   neededBits = neededBits - haveBits + 100;
b30fe4 ¤   ¤   }
940e1d ¤   ¤   else
a15b34 ¤   ¤   {
b0641d ¤   ¤   ¤   neededBits = 300;¤  /* Token amount */
700fe4 ¤   ¤   }
4c1b52 ¤   ¤
bd0cb7 ¤   ¤   err = PGPCollectRandomDataDialog( context, neededBits,
49931b ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
989371 ¤   }
0867c5 ¤
fadeb7 ¤   return( err );
73efe6 }
c6af5a
d9af5a
daaf5a
c6c744 ¤   PGPError
29b7cd PGPRSASupported(
--ef13 001b4830dd1401200ce Page 19 of PGPclientLibUtils.cp
96a195 ¤   PGPBoolean *¤   hasRSA)
7bbb36 {
431dc5 ¤   PGPError¤   ¤   ¤   ¤   ¤   result = kPGPError_NoErr;
09793e ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   numAlgs;
5f500c ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   index = 0;
0a6818 ¤   PGPPublicKeyAlgorithmInfo¤  info;
8567c5 ¤
b7922b ¤   PGPValidatePtr(hasRSA);
ff37ca ¤   *hasRSA = false;
2467c5 ¤
1ca0da ¤   result = PGPCountPublicKeyAlgorithms(&numAlgs);
30a6a4 ¤   while (IsntPGPError(result) && (index < numAlgs)) {
a2d6aa ¤   ¤   result = PGPGetIndexedPublicKeyAlgorithmInfo(¤  index,
9ae098 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &info);
0a7568 ¤   ¤   if (IsntPGPError(result)) {
f78c20 ¤   ¤   ¤   if ((info.algID == kPGPPublicKeyAlgorithm_RSA)
abd30c ¤   ¤   ¤   || (info.algID == kPGPPublicKeyAlgorithm_RSAEncryptOnly)
d04674 ¤   ¤   ¤   || (info.algID == kPGPPublicKeyAlgorithm_RSASignOnly)) {
42bb9a ¤   ¤   ¤   ¤   *hasRSA = true;
68f622 ¤   ¤   ¤   ¤   break;
54a3a6 ¤   ¤   ¤   }
a90fe4 ¤   ¤   }
c5fa54 ¤   ¤   index++;
aa9371 ¤   }
a667c5 ¤
9f5d73 ¤   return result;
e1efe6 }
f6af5a
b1af5a
77af5a
70c744 ¤   PGPError
fe82f3 PGPIsAdminConfigured(
17e53a ¤   PGPBoolean *¤   isConfigured)
57bb36 {
9844e1 ¤   PGPError¤   result = kPGPError_NoErr;
205215 ¤   FSSpec¤ ¤   libraryFileSpec;
7d67c5 ¤
b3dc3a ¤   PGPValidatePtr(isConfigured);
017d52 ¤   *isConfigured = false;
c967c5 ¤
c35168 ¤   try {
692251 ¤   ¤   result = PGPGetClientLibFSSpec(&libraryFileSpec);
e77568 ¤   ¤   if (IsntPGPError(result)) {
c91792 ¤   ¤   ¤   StSaveCurResFile¤   savedFile(libraryFileSpec);
5a67c5 ¤
454954 ¤   ¤   ¤   if (ResourceExists(kAdminConfiguredType,·
a52765 ¤   ¤   ¤   PGPa_Configured, true)) {
7c17b2 ¤   ¤   ¤   ¤   *isConfigured = true;
32a3a6 ¤   ¤   ¤   }
3f0fe4 ¤   ¤   }
2d9371 ¤   }
6caf5a
2ae0a3 ¤   catch (...) {
2c414a ¤   ¤   result = kPGPError_UnknownError;
3d9371 ¤   }
9467c5 ¤
bb5d73 ¤   return result;
b4efe6 }
--8396 001d2e139b7401200cf Page 1 of PGPclientLibUtils.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
c7db93 ¤   $Id: PGPclientLibUtils.h,v 1.8.8.1 1998/11/12 03:07:27 heller Exp $
7cf7f7 ____________________________________________________________________________*/
fbaf5a
d57b7d #pragma once
aeaf5a
6b49ca #include <Files.h>
e86b82 #include <Memory.h>
bc2c23 #include <Quickdraw.h>
a1af5a
982f94 #include <LCommander.h>
aa2c73 #include <LView.h>
31af5a
94e8b2 #include "pflPrefs.h"
3ac5d5 #include "pgpBase.h"
8ee82c #include "pgpPubTypes.h"
19a02f #include "pgpClientLib.h"
0176f0 #include "CComboError.h"
a7af5a
f19d4e typedef struct PGPclientLibState
20bb36 {
6d72a7 ¤   GrafPtr¤¤   ¤   savedPort;
56cf91 ¤   THz¤¤   ¤   ¤   savedZone;
cbb917 ¤   short¤  ¤   ¤   savedResFile;
4144a9 ¤   LView¤  ¤   ¤   *savedView;
c982e6 ¤   LCommander¤ ¤   *savedCommander;
adfcf3 ¤   PGPBoolean¤ ¤   savedResLoad;
0567c5 ¤
35d437 ¤   PGPPrefRef¤ ¤   clientPrefsRef;
4e59c3 ¤   PGPPrefRef¤ ¤   adminPrefsRef;
26af5a
a3e9ad } PGPclientLibState;
e8af5a
6299c6 PGP_BEGIN_C_DECLARATIONS
ddaf5a
7eeec5 OSStatus¤   SetLibraryFSSpec(const FSSpec *fileSpec);
fcaf5a
f7a51c PGPError¤   EnterPGPclientLib(PGPContextRef context, PGPclientLibState *state);
b9ac92 void¤   ¤   ExitPGPclientLib(const PGPclientLibState *state);
26af5a
ec1254 PGP_END_C_DECLARATIONS
d2af5a
--e6ed 000657bf203401200d0 Page 1 of PGPCMPlugin.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
eea4ea ¤   $Id: PGPCMPlugin.cp,v 1.11.8.1 1998/11/12 03:07:31 heller Exp $
fdf7f7 ____________________________________________________________________________*/
58af5a
98af5a
225b0b #include <AERegistry.h>
e38f22 #include <CodeFragments.h>
056b34 #include "ContextualMenuPlugins.h"
dfaf5a
4c740c #include <UAppleEventsMgr.h>
81af5a
a374e2 #include "MacProcesses.h"
2fbbf4 #include "MacFiles.h"
5a8c8c #include "MacDesktop.h"
d8af5a
060e06 #include "UPGPException.h"
a40bb4 #include "CString.h"
40aa64 #include "StSaveCurResFile.h"
4de904 #include "PGPCMPlugin.h"
38af5a
56e738 // Constants
e1f28c const ResIDT¤   ¤   STRx_MenuItems¤ ¤   ¤   ¤   =¤  1000;
095cb2 const SInt16¤   ¤   kEncryptID¤ ¤   ¤   ¤   ¤   =¤  1;
156d14 const SInt16¤   ¤   kSignID¤¤   ¤   ¤   ¤   ¤   =¤  2;
d98519 const SInt16¤   ¤   kEncryptAndSignID¤  ¤   ¤   =¤  3;
7b9ee4 const SInt16¤   ¤   kDecryptVerifyID¤   ¤   ¤   =¤  4;
6cf297 const SInt16¤   ¤   kWipeID¤¤   ¤   ¤   ¤   ¤   =¤  5;
d3327d const SInt16¤   ¤   kPGPID¤ ¤   ¤   ¤   ¤   ¤   =¤  6;
7aaf5a
6eae87 const OSType¤   ¤   kPGPtoolsType¤  ¤   ¤   ¤   =¤  'APPL';
447737 const OSType¤   ¤   kPGPtoolsCreator¤   ¤   ¤   =¤  'pgpM';
b8af5a
5e694c const AEEventClass¤ kAEPGPMenuClass¤¤   ¤   ¤   =¤  'Menu';
1d0104 const AEEventID¤¤   kAEMenuOpenApp¤ ¤   ¤   ¤   =¤  'OApp';
47252f const AEEventID¤¤   kAESignID¤  ¤   ¤   ¤   ¤   =¤  'Sign';
92a545 const AEEventID¤¤   kAEEncryptID¤   ¤   ¤   ¤   =¤  'Encr';
69746f const AEEventID¤¤   kAEEncryptAndSignID¤¤   ¤   =¤  'EnSi';
02695c const AEEventID¤¤   kAEDecryptVerifyID¤ ¤   ¤   =¤  'DeVe';
0f6b1c const AEEventID¤¤   kAEWipeID¤  ¤   ¤   ¤   ¤   =¤  'Wipe';
3caf5a
4bde3c // Menu items
183459 const SInt16¤   ¤   kEncrypt¤   ¤   ¤   ¤   ¤   =¤  1;
50e686 const SInt16¤   ¤   kSign¤  ¤   ¤   ¤   ¤   ¤   =¤  2;
d2e21f const SInt16¤   ¤   kEncryptAndSign¤¤   ¤   ¤   =¤  3;
edf60f const SInt16¤   ¤   kDecryptVerify¤ ¤   ¤   ¤   =¤  4;
957905 const SInt16¤   ¤   kWipe¤  ¤   ¤   ¤   ¤   ¤   =¤  5;
51af5a
34fc0d const DescType¤ ¤   cFolder¤¤   ¤   ¤   ¤   ¤   =¤  'cfol';
98ad59 const DescType¤ ¤   pTrash¤ ¤   ¤   ¤   ¤   ¤   =¤  'trsh';
2caf5a
50c95f static FSSpec¤  ¤   sFileSpec;
deaf5a
7ee467 // Function declarations
e312bd extern pascal OSErr __initialize(CFragInitBlockPtr);
9232d5 pascal OSErr ContextTypeCMPluginInitialize(CFragInitBlockPtr init);
ecfd40 OSStatus AddCommandToAEDescList(ConstStr255Param inCommandString,
d51db4 ¤   SInt32 inCommandID, AEDescList* ioCommandList);
348f2f OSErr BringToolsToFront();
c46bc5 void SendToolsEvent(SInt16¤ inSelection);
deaf5a
cdaf5a
2a48f4 ¤   pascal OSErr
cf1aca ContextTypeCMPluginInitialize(CFragInitBlockPtr init)
58bb36 {
448bed ¤   OSErr¤  theError = __initialize(init);
b66257 ¤   if (theError == noErr){
65e25f ¤   ¤   PGPCMPlugin* thePlugin = new PGPCMPlugin;
--e5c8 00004256a45401200d0 Page 2 of PGPCMPlugin.cp
83b95b ¤   ¤   if (thePlugin != NULL) {
03e0de ¤   ¤   ¤   delete thePlugin;
a645a6 ¤   ¤   } else {
c5ad63 ¤   ¤   ¤   theError = memFullErr;
b30fe4 ¤   ¤   }
0c1b52 ¤   ¤
ef9620 ¤   ¤   UAppleEventsMgr::Initialize();
7f9371 ¤   }
47af5a
a37a75 ¤   return theError;
8befe6 }
abaf5a
e1af5a
48af5a
74af5a
576d9d ¤   OSStatus·
c52c8a PGPCMPlugin::Initialize(
a3b2f5 ¤   Environment*,
2de78e ¤   FSSpec*¤¤   ¤   inFileSpec)
b0bb36 {
d2759d ¤   // Set debug info
3d6525 ¤   SetDebugThrow_(debugAction_Nothing);
1a2b6f ¤   SetDebugSignal_(debugAction_Nothing);
b3af5a
2f3ca5 ¤   ::BlockMoveData(inFileSpec, &sFileSpec, sizeof(FSSpec));
efaf5a
eaf941 ····return noErr;
2defe6 }
c4af5a
d4af5a
fcaf5a
416d9d ¤   OSStatus·
29fc06 PGPCMPlugin::ExamineContext(
efb2f5 ¤   Environment*,
d9a264 ¤   AEDesc *inContextDescriptor,
86a615 ¤   SInt32 inTimeOutInTicks,
40847d ¤   AEDescList* ioCommands,
35686f ¤   Boolean* outNeedMoreTime)
ecbb36 {
9d3496 ¤   (void) inTimeOutInTicks;
6967c5 ¤
b3156f ¤   OSStatus¤   ¤   err;
c1af5a
7e5168 ¤   try {
6ba55d ¤   ¤   *outNeedMoreTime = false;
0fc018 ¤   ¤   if (inContextDescriptor != nil) {
d5f3fd ¤   ¤   ¤   StAEDescriptor¤ theSubMenu;
9e9b3a ¤   ¤   ¤   StAEDescriptor¤ theSubMenuList;
91f3bc ¤   ¤   ¤   StAEDescriptor¤ list;
e4c9e8 ¤   ¤   ¤   SInt32¤ ¤   ¤   numItems;
4dd559 ¤   ¤   ¤   AEKeyword¤  ¤   keyWord;
6d9a91 ¤   ¤   ¤   Boolean¤¤   ¤   addMenuItems = false;
eca62d ¤   ¤   ¤   Boolean¤¤   ¤   isTrash = false;
5687c7 ¤   ¤   ¤
df0d41 ¤   ¤   ¤   // Walk the list of items making sure that they are folders or
9bd9b9 ¤   ¤   ¤   // files
5d9661 ¤   ¤   ¤   err = ::AECoerceDesc(inContextDescriptor, typeAEList, list);
30c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
4687c7 ¤   ¤   ¤
9b7beb ¤   ¤   ¤   err = ::AECountItems(list, &numItems);
5bc60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
ec87c7 ¤   ¤   ¤
18125a ¤   ¤   ¤   for (SInt32 i = 1; i <= numItems; i++) {
7a51cc ¤   ¤   ¤   ¤   StAEDescriptor¤ item;
f6321e ¤   ¤   ¤   ¤   StAEDescriptor¤ itemRecord;
a15c30 ¤   ¤   ¤   ¤   StAEDescriptor¤ itemType;
8b2b85 ¤   ¤   ¤   ¤
2a59f8 ¤   ¤   ¤   ¤   addMenuItems = true;
e92b85 ¤   ¤   ¤   ¤
13461f ¤   ¤   ¤   ¤   // We coerce the spec into a record to get its type
f7b780 ¤   ¤   ¤   ¤   err = ::AEGetNthDesc(¤  list,
041291 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   i,
--1e25 000a8eede76401200d0 Page 3 of PGPCMPlugin.cp
17f8ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeObjectSpecifier,
dc902e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyWord,
7c1831 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   item);
ec87f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
18fe42 ¤   ¤   ¤   ¤   err = ::AECoerceDesc(¤  item,
c10f0a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeAERecord,
a5b19e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   itemRecord);
5787f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
2f34f6 ¤   ¤   ¤   ¤   err = ::AEGetKeyDesc(¤  itemRecord,
43f198 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyAEDesiredClass,
740762 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeType,
a1ea07 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   itemType);
0c87f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
bd2b85 ¤   ¤   ¤   ¤
3e20e7 ¤   ¤   ¤   ¤   // Bail if it is not a file or folder or trash
f2c1c1 ¤   ¤   ¤   ¤   if (*((DescType *) *itemType.mDesc.dataHandle) == cProperty) {
df3787 ¤   ¤   ¤   ¤   ¤   StAEDescriptor¤ form;
8ddb4b ¤   ¤   ¤   ¤   ¤   StAEDescriptor¤ propertyID;
60ae30 ¤   ¤   ¤   ¤   ¤
ea615a ¤   ¤   ¤   ¤   ¤   err = ::AEGetKeyDesc(¤  itemRecord,
cd0441 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyAEKeyForm,
41a963 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeType,
28327e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   form);
2f89b4 ¤   ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
2143c9 ¤   ¤   ¤   ¤   ¤   if (*((DescType *) *form.mDesc.dataHandle)
dfc53a ¤   ¤   ¤   ¤   ¤   != formPropertyID) {
5f4ccd ¤   ¤   ¤   ¤   ¤   ¤   addMenuItems = false;
7300eb ¤   ¤   ¤   ¤   ¤   ¤   break;
4b1c89 ¤   ¤   ¤   ¤   ¤   }
42615a ¤   ¤   ¤   ¤   ¤   err = ::AEGetKeyDesc(¤  itemRecord,
878396 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyAEKeyData,
8fa963 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeType,
4689f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   propertyID);
2189b4 ¤   ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
62feb0 ¤   ¤   ¤   ¤   ¤   if (*((DescType *) *propertyID.mDesc.dataHandle)
d161fa ¤   ¤   ¤   ¤   ¤   != pTrash) {
2b4ccd ¤   ¤   ¤   ¤   ¤   ¤   addMenuItems = false;
4000eb ¤   ¤   ¤   ¤   ¤   ¤   break;
7a81a1 ¤   ¤   ¤   ¤   ¤   } else {
349bd9 ¤   ¤   ¤   ¤   ¤   ¤   isTrash = true;
551c89 ¤   ¤   ¤   ¤   ¤   }
eeb5fc ¤   ¤   ¤   ¤   } else {
785242 ¤   ¤   ¤   ¤   ¤   if ((*((DescType *) *itemType.mDesc.dataHandle) != cFile)
9fcd2c ¤   ¤   ¤   ¤   ¤   && (*((DescType *) *itemType.mDesc.dataHandle)
9863ba ¤   ¤   ¤   ¤   ¤   != cFolder)) {
114ccd ¤   ¤   ¤   ¤   ¤   ¤   addMenuItems = false;
6a00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
a51c89 ¤   ¤   ¤   ¤   ¤   }
252613 ¤   ¤   ¤   ¤   }
80a3a6 ¤   ¤   ¤   }
e52b85 ¤   ¤   ¤   ¤
6474d0 ¤   ¤   ¤   SetDebugThrow_(debugAction_LowLevelDebugger);
1f9815 ¤   ¤   ¤   SetDebugSignal_(debugAction_LowLevelDebugger);
33c052 ¤   ¤   ¤   if (addMenuItems) {
1e284b ¤   ¤   ¤   ¤   // Save current resource info and then get our menu string
8ff940 ¤   ¤   ¤   ¤   StSaveCurResFile¤   savedResFile(sFileSpec);
ad2b85 ¤   ¤   ¤   ¤
0e3999 ¤   ¤   ¤   ¤   // Get our submenu list
e32d52 ¤   ¤   ¤   ¤   err = ::AECreateList(¤  nil,
270d6c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
7f1039 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
fac19c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSubMenuList);
6f87f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
c95f4f ¤   ¤   ¤   ¤   if (! isTrash) {
827fa5 ¤   ¤   ¤   ¤   ¤   AddCommandToAEDescList(¤CString(¤   STRx_MenuItems,
c6fa17 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEncryptID),
87ef04 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEncrypt,
94e729 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSubMenuList);
5f7fa5 ¤   ¤   ¤   ¤   ¤   AddCommandToAEDescList(¤CString(¤   STRx_MenuItems,
69ff8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSignID),
1797fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSign,
a8e729 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSubMenuList);
--12ed 00055e1830c401200d0 Page 4 of PGPCMPlugin.cp
9f7fa5 ¤   ¤   ¤   ¤   ¤   AddCommandToAEDescList(¤CString(¤   STRx_MenuItems,
297233 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEncryptAndSignID),
1a80d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEncryptAndSign,
b5e729 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSubMenuList);
7f7fa5 ¤   ¤   ¤   ¤   ¤   AddCommandToAEDescList(¤CString(¤   STRx_MenuItems,
add14c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDecryptVerifyID),
73b0eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDecryptVerify,
84e729 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSubMenuList);
742613 ¤   ¤   ¤   ¤   }
9c31d2 ¤   ¤   ¤   ¤   AddCommandToAEDescList(¤CString(¤   STRx_MenuItems,
cb2386 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWipeID),
fee2c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWipe,
5cc19c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSubMenuList);
f387c7 ¤   ¤   ¤
0e7640 ¤   ¤   ¤   ¤   // Add PGP with submenu to ioCommands
ca1f6d ¤   ¤   ¤   ¤   CString¤¤   ¤   ¤   menuItem(STRx_MenuItems, kPGPID);
c5af5a
a12d52 ¤   ¤   ¤   ¤   err = ::AECreateList(¤  nil,
380d6c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
2ee7b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true,
846272 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSubMenu);
5f87f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
93ca7e ¤   ¤   ¤   ¤   err = ::AEPutKeyPtr(¤   theSubMenu,
c05df4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyAEName,
3c308d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeChar,
701e5c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (char *) menuItem,
395cc6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   menuItem.GetLength());
4587f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
f6fd9d ¤   ¤   ¤   ¤   err = ::AEPutKeyDesc(¤  theSubMenu,
7b87f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyContextualMenuSubmenu,
dec19c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSubMenuList);
767f91 ¤   ¤   ¤   ¤   err = ::AEPutDesc(¤ ioCommands,
230320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
153169 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSubMenu);
0187f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
61a3a6 ¤   ¤   ¤   }
8c0fe4 ¤   ¤   }
fe9371 ¤   }
cf67c5 ¤
11e0a3 ¤   catch (...) {
849371 ¤   }
da67c5 ¤
426bba ¤   return noErr;
c8efe6 }
32af5a
5aaf5a
d7af5a
fe85ea ¤   OSStatus
27d0c2 PGPCMPlugin::HandleSelection(
38b2f5 ¤   Environment*,
7ea264 ¤   AEDesc *inContextDescriptor,
4872b9 ¤   SInt32 inCommandID)
cebb36 {
a9d06b ¤   (void) inContextDescriptor;
1eaf5a
b55168 ¤   try {
7fd75d ¤   ¤   SendToolsEvent(inCommandID);
019371 ¤   }
7367c5 ¤
27e0a3 ¤   catch (...) {
6f9371 ¤   }
8667c5 ¤
a1f941 ····return noErr;
9eefe6 }
35af5a
faaf5a
cbaf5a
0585ea ¤   OSStatus
674e55 PGPCMPlugin::PostMenuCleanup(
4dcc4d ¤   Environment*)
2dbb36 {
55f941 ····return noErr;
--1bf4 000fdddd4ca401200d0 Page 5 of PGPCMPlugin.cp
7aefe6 }
46af5a
8eaf5a
9b85ea ¤   OSStatus
455562 AddCommandToAEDescList(
2b0f2b ¤   ConstStr255Param inCommandString,
370c01 ¤   SInt32 inCommandID,
f292ca ¤   AEDescList* ioCommandList)
a5bb36 {
b03fea ¤   OSStatus err = noErr;
0367c5 ¤
9b307c ¤   AERecord theCommandRecord = { typeNull, nil };
7767c5 ¤
71b38b ¤   // create an apple event record for our command
95136f ¤   err = ::AECreateList(¤  nil,
aaceac ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
680dec ¤   ¤   ¤   ¤   ¤   ¤   ¤   true,
53bb5f ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theCommandRecord);
3d793c ¤   if (err == noErr) {
9a0a26 ¤   ¤   // stick the command text into the aerecord
0b1650 ¤   ¤   err = ::AEPutKeyPtr(¤   &theCommandRecord,
9c14de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyAEName,
354676 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeChar,
e5791f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &inCommandString[1],
7dc421 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inCommandString[0]);
b88f59 ¤   ¤   if (err == noErr) {
5a44ef ¤   ¤   ¤   // stick the command ID into the AERecord
ee0777 ¤   ¤   ¤   err = ::AEPutKeyPtr(¤   &theCommandRecord,
95a1ec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyContextualMenuCommandID,
f0d843 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeLongInteger,
b1f7ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &inCommandID,
cc59c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(inCommandID));
c22207 ¤   ¤   ¤   if (err == noErr) {
275187 ¤   ¤   ¤   ¤   // stick this record into the list of commands that
c1ff6b ¤   ¤   ¤   ¤   // we are passing back to CMM
e3d8d0 ¤   ¤   ¤   ¤   err = ::AEPutDesc(¤ ioCommandList,
b40320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
6278b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theCommandRecord);
7aa3a6 ¤   ¤   ¤   }
4e0fe4 ¤   ¤   }
299371 ¤   }
9e1b52 ¤   ¤
3e7e35 ¤   // clean up after ourself; dispose of the AERecord
700405 ¤   ::AEDisposeDesc(&theCommandRecord);
64af5a
73ace8 ····return err;
8d869e ····
2aefe6 }
a4af5a
48af5a
f2af5a
ed6d52 ¤   void
b45004 SendToolsEvent(
437032 ¤   SInt16¤ inSelection)
12bb36 {
2a615d ¤   StAEDescriptor¤ theEvent;
290183 ¤   AEEventID¤  ¤   theEventID;
b77cbf ¤   OSErr¤  ¤   ¤   err;
6367c5 ¤
66f7e8 ¤   switch (inSelection) {
4fd373 ¤   ¤   case kSign:
fa5b34 ¤   ¤   {
972db1 ¤   ¤   ¤   theEventID = kAESignID;
900fe4 ¤   ¤   }
e72f68 ¤   ¤   break;
0a1b52 ¤   ¤
8e1b52 ¤   ¤
0c9c6c ¤   ¤   case kEncrypt:
9b5b34 ¤   ¤   {
645d38 ¤   ¤   ¤   theEventID = kAEEncryptID;
150fe4 ¤   ¤   }
fd2f68 ¤   ¤   break;
--130a 0004410e49e401200d0 Page 6 of PGPCMPlugin.cp
f11b52 ¤   ¤
4b1b52 ¤   ¤
0da906 ¤   ¤   case kEncryptAndSign:
735b34 ¤   ¤   {
468871 ¤   ¤   ¤   theEventID = kAEEncryptAndSignID;
c40fe4 ¤   ¤   }
052f68 ¤   ¤   break;
911b52 ¤   ¤
491b52 ¤   ¤
9899b5 ¤   ¤   case kDecryptVerify:
b75b34 ¤   ¤   {
2e9968 ¤   ¤   ¤   theEventID = kAEDecryptVerifyID;
c80fe4 ¤   ¤   }
b32f68 ¤   ¤   break;
e01b52 ¤   ¤
f51b52 ¤   ¤
117ef9 ¤   ¤   case kWipe:
315b34 ¤   ¤   {
5c22e2 ¤   ¤   ¤   theEventID = kAEWipeID;
d60fe4 ¤   ¤   }
942f68 ¤   ¤   break;
ba1b52 ¤   ¤
a81b52 ¤   ¤
819ae3 ¤   ¤   default:
975b34 ¤   ¤   {
770ecc ¤   ¤   ¤   return;
ee0fe4 ¤   ¤   }
072f68 ¤   ¤   break;
d69371 ¤   }
6a67c5 ¤
1daf5a
bbff7e ¤   // Bring tools to the front
bcbfe4 ¤   AppParameters¤  params;
cc67c5 ¤
f33144 ¤   params.theMsgEvent.what = kHighLevelEvent;
d267cd ¤   params.theMsgEvent.message = kAEPGPMenuClass;
25fb18 ¤   params.theMsgEvent.where = *(Point *) & kAEMenuOpenApp;
97c528 ¤   params.theMsgEvent.when = params.theMsgEvent.modifiers = 0;
ca0fed ¤   params.eventRefCon = 0;
8f1869 ¤   params.messageLength = 0;
c5db33 ¤   err = BringAppToFront(¤ kPGPtoolsType,
3a63f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPtoolsCreator,
90d6fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   kFindAppOnAllVolumes,
2e0dec ¤   ¤   ¤   ¤   ¤   ¤   ¤   true,
462820 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &params,
60d470 ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil);
c55e5c ¤   PGPThrowIfOSErr_(err);
3faf5a
0e361e ¤   // Send the event
2ce4ba ¤   ProcessSerialNumber¤toolsPSN;
a8d5a9 ¤   StAEDescriptor¤ ¤   theAddress;
beaf5a
69cf15 ¤   PGPThrowIfNot_(FindProcess(¤kPGPtoolsType,
4d2ccc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPtoolsCreator,
298abb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &toolsPSN,
6e8e22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
aa8e22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
e802ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil));
e9fba3 ¤   err = ::AECreateDesc(¤  typeProcessSerialNumber,
fdc72e ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr) &toolsPSN,
e76a34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(toolsPSN),
7d0c98 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theAddress);
095e5c ¤   PGPThrowIfOSErr_(err);
7b1bf7 ¤   err = ::AECreateAppleEvent(¤kAEPGPMenuClass,
c48882 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theEventID,
8b2e12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theAddress,
f79e2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAutoGenerateReturnID,
c86cfe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAnyTransactionID,
d1d833 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theEvent);
8d5e5c ¤   PGPThrowIfOSErr_(err);
1567c5 ¤
443c8a ¤   UAppleEventsMgr::SendAppleEvent(theEvent);¤
--57a8 0010e631b23401200d0 Page 7 of PGPCMPlugin.cp
0ebe43 }¶
--384e 00143a0b440401200d1 Page 1 of PGPCMPlugin.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
570b4b ¤   $Id: PGPCMPlugin.h,v 1.2.20.1 1998/11/12 03:07:31 heller Exp $
54f7f7 ____________________________________________________________________________*/
e8af5a
078d55 #pragma once·
6eaf5a
46e9a0 // Parent Class Include
197c3a #include "AbstractCMPlugin.h"
ebaf5a
ceaf5a
084c70 class PGPCMPlugin : virtual AbstractCMPlugin {
adaf5a
e01f8d #pragma SOMReleaseOrder(¤   Initialize,¤¤   ¤   ¤   \
34842d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ExamineContext,¤¤   ¤   \
7119e4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   HandleSelection,¤   ¤   \
016016 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PostMenuCleanup)¤   ¤   \
8caf5a
595ed4 public:
4faf5a
dc319a ¤   virtual¤OSStatus Initialize(
4b221b ¤   ¤   ¤   ¤   ¤   ¤   ¤   Environment*,
71abc9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FSSpec *inFileSpec);
92454d ¤   virtual¤OSStatus ExamineContext(
57221b ¤   ¤   ¤   ¤   ¤   ¤   ¤   Environment*,
f9f2ec ¤   ¤   ¤   ¤   ¤   ¤   ¤   AEDesc *inContextDescriptor,
7022f8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inTimeOutInTicks,
1061fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   AEDescList* ioCommands,
960074 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean* outNeedMoreTime);
e42cac ¤   virtual¤OSStatus HandleSelection(
bc221b ¤   ¤   ¤   ¤   ¤   ¤   ¤   Environment*,
3ef2ec ¤   ¤   ¤   ¤   ¤   ¤   ¤   AEDesc *inContextDescriptor,
02cbb3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inCommandID);
58b23b ¤   virtual¤OSStatus PostMenuCleanup(
5f97ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   Environment*);
c982f7 };
43af5a
--5ded 001111bc641401200d2 Page 1 of PGPcontextmenu.pch++
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
9e8427 ¤   $Id: PGPcontextmenu.pch++,v 1.4.8.1 1998/11/12 03:07:32 heller Exp $
16f7f7 ____________________________________________________________________________*/
b1af5a
d567c5 ¤
9777e0 #if __POWERPC__
2b2014 ¤   #pragma precompile_target "PGPcontextmenuPCHPPC"
a067c5 ¤
ccfc58 #elif __CFM68K__
03bc14 ¤   #pragma precompile_target "PGPcontextmenuPCHCFM68K"
6b67c5 ¤
bedb21 #else
f000c1 ¤   #pragma precompile_target "PGPcontextmenuPCH68K"
887454 #endif
8faf5a
2627a3 #pragma once on
114c2f #include <PP_MacHeaders.c>¤ ¤   ¤   // Toolbox headers
--e897 001fded6be7401200d3 Page 1 of PGPcontextmenu.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
17d293 ¤   $Id: PGPcontextmenu.prefix,v 1.2.20.1 1998/11/12 03:07:33 heller Exp $
b8f7f7 ____________________________________________________________________________*/
90af5a
ce67c5 ¤
0d77e0 #if __POWERPC__
2a925a ¤   #include "PGPcontextmenuPCHPPC"
0b67c5 ¤
3afc58 #elif __CFM68K__
e8a3a7 ¤   #include "PGPcontextmenuPCHCFM68K"
e867c5 ¤
d0db21 #else
87b28f ¤   #include "PGPcontextmenuPCH68K"
417454 #endif
a8af5a
afb18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
e3af5a
d7e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
6679b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
42af5a
20049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
16af5a
910db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
92af5a
70a662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
f3a6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
e8d424 #define PGP_DEBUG_FIND_LEAKS¤   ¤   ¤   PGP_DEBUG
dbaf5a
210438 #include "MacBasics.h"
2a96be #include "PGPBuildFlags.h"
46e2ff #include "pgpConfig.h"
ca94a0 #include "pgpLeaks.h"
fd46ad #include "MacDebug.h"
--561e 0013bc2de02401200d4 Page 1 of PGPcontextmenuDebug.pch++
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
2f3f55 ¤   $Id: PGPcontextmenuDebug.pch++,v 1.4.8.1 1998/11/12 03:07:33 heller Exp $
0bf7f7 ____________________________________________________________________________*/
40af5a
2c67c5 ¤
4077e0 #if __POWERPC__
404499 ¤   #pragma precompile_target "PGPcontextmenuDebugPCHPPC"
a467c5 ¤
2cfc58 #elif __CFM68K__
644db2 ¤   #pragma precompile_target "PGPcontextmenuDebugPCHCFM68K"
0567c5 ¤
fedb21 #else
bd644c ¤   #pragma precompile_target "PGPcontextmenuDebugPCH68K"
c27454 #endif
54af5a
4f27a3 #pragma once on
c2af5a
cdaf17 // Define all debugging symbols
f76dc3 #define Debug_Throw
2a74f5 #define Debug_Signal
2eaf5a
3b4c2f #include <PP_MacHeaders.c>¤ ¤   ¤   // Toolbox headers
--d1fa 001f37686cf401200d5 Page 1 of PGPcontextmenuDebug.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
63fa77 ¤   $Id: PGPcontextmenuDebug.prefix,v 1.2.20.1 1998/11/12 03:07:34 heller Exp $
4ff7f7 ____________________________________________________________________________*/
f4af5a
ab67c5 ¤
0e77e0 #if __POWERPC__
cdbce9 ¤   #include "PGPcontextmenuDebugPCHPPC"
dd67c5 ¤
35fc58 #elif __CFM68K__
547fa2 ¤   #include "PGPcontextmenuDebugPCHCFM68K"
4567c5 ¤
e9db21 #else
139c3c ¤   #include "PGPcontextmenuDebugPCH68K"
ec7454 #endif
2eaf5a
4ba853 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1
13af5a
ece6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
c379b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
d3af5a
4c049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
75af5a
e80db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
4faf5a
fca662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
7fa6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
1ad424 #define PGP_DEBUG_FIND_LEAKS¤   ¤   ¤   PGP_DEBUG
aaaf5a
7c0438 #include "MacBasics.h"
f796be #include "PGPBuildFlags.h"
0be2ff #include "pgpConfig.h"
b694a0 #include "pgpLeaks.h"
f346ad #include "MacDebug.h"
--a673 001844cbe53401200d6 Page 1 of cfrg.r
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
5f00a5 ¤   $Id: cfrg.r,v 1.2.20.1 1998/11/12 03:07:35 heller Exp $
7ff7f7 ____________________________________________________________________________*/
9daf5a
69af5a
51af5a
70b228 #define UseExtendedCFRGTemplate 1
abaf5a
9bed36 #include "CodeFragmentTypes.r"
0daf5a
deaf5a
2a07f9 resource 'cfrg' (0) {
371f97 ¤   {¤  /* array memberArray: 4 elements */
a4e775 ¤   ¤   extendedEntry {
d3d773 ¤   ¤   ¤   kPowerPC,
ba4e74 ¤   ¤   ¤   kFullLib,
b43c41 ¤   ¤   ¤   kNoVersionNum,
b03c41 ¤   ¤   ¤   kNoVersionNum,
a0fb99 ¤   ¤   ¤   kDefaultStackSize,
e57076 ¤   ¤   ¤   kNoAppSubFolder,
6bcc44 ¤   ¤   ¤   kIsLib,
379440 ¤   ¤   ¤   kOnDiskFlat,
56a01d ¤   ¤   ¤   kZeroOffset,
e25ba1 ¤   ¤   ¤   kSegIDZero,
ce024b ¤   ¤   ¤   "PGPCMPlugin",
96ca56 ¤   ¤   ¤   kFragSOMClassLibrary,
2ccf03 ¤   ¤   ¤   "AbstractCMPlugin",
c1eb61 ¤   ¤   ¤   "",
2deb61 ¤   ¤   ¤   "",
88020f ¤   ¤   ¤   "A Contextual Menu Plugin which adds PGP support to the Finder."
c50fe4 ¤   ¤   }
5f9371 ¤   }
8482f7 };
--9b79 000dce8c559401200d7 Page 1 of CPGPemailerView.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
401325 ¤   $Id: CPGPemailerView.cp,v 1.32.2.3.2.1 1998/11/12 03:07:36 heller Exp $
c3f7f7 ____________________________________________________________________________*/
96af5a
e0feb2 #include <stdio.h>
77af5a
ca740c #include <UAppleEventsMgr.h>
411cb2 #include <UExtractFromAEDesc.h>
0eaf5a
cc74e2 #include "MacProcesses.h"
1d8c8c #include "MacDesktop.h"
3685c2 #include "MacStrings.h"
3e76b7 #include "MacErrors.h"
4d771f #include "PGPSharedParse.h"
e81ef8 #include "SignatureStatusMessage.h"
660d08 #include "pgpMem.h"
b43a2c #include "WarningAlert.h"
85e3f9 #include "PGPEncode.h"
1c1970 #include "PGPKeys.h"
f7ea7e #include "PGPUtilities.h"
444720 #include "pflPrefTypes.h"
a210f0 #include "pgpOpenPrefs.h"
d13991 #include "pgpAdminPrefs.h"
6f628e #include "pgpClientErrors.h"
9eaf5a
bef8d2 #include "PGPSharedEncryptDecrypt.h"
c7af5a
5e45d2 #include "CPGPEncoderDecoder.h"
badcba #include "CWaitNextEventDispatcher.h"
b3af5a
100bb4 #include "CString.h"
ae74ea #include "CPGPemailerView.h"
94af5a
caaf5a
0baf5a
b2e738 // Constants
c99974 const PaneIDT¤  ¤   pane_EncryptButton¤ ¤   ¤   ¤   ¤   =¤  1002;
d62e53 const PaneIDT¤  ¤   pane_KeysButton¤¤   ¤   ¤   ¤   ¤   =¤  1003;
04740d const PaneIDT¤  ¤   pane_SignButton¤¤   ¤   ¤   ¤   ¤   =¤  1004;
2e02bc const PaneIDT¤  ¤   pane_EncryptAndSignButton¤  ¤   ¤   =¤  1005;
496840 const PaneIDT¤  ¤   pane_DecryptButton¤ ¤   ¤   ¤   ¤   =¤  2002;
1daf5a
41906f const ResIDT¤   ¤   STRx_Strings¤   ¤   ¤   ¤   ¤   ¤   =¤  10000;
5be0bd const SInt16¤   ¤   kSignatureBadID¤¤   ¤   ¤   ¤   ¤   =¤  1;
2f56dd const SInt16¤   ¤   kSignatureNotVerifiedID¤¤   ¤   ¤   =¤  2;
5c148d const SInt16¤   ¤   kBadPassphraseID¤   ¤   ¤   ¤   ¤   =¤  3;
82f3b3 const SInt16¤   ¤   kAttachmentsWarningID¤  ¤   ¤   ¤   =¤  4;
b488e4 const SInt16¤   ¤   kZeroRecipientsID¤  ¤   ¤   ¤   ¤   =¤  5;
d8a2d5 const SInt16¤   ¤   kNothingToEncodeID¤ ¤   ¤   ¤   ¤   =¤  6;
269101 const SInt16¤   ¤   kBadSelectionID¤¤   ¤   ¤   ¤   ¤   =¤  7;
1406ec const SInt16¤   ¤   kKeysNotFoundID¤¤   ¤   ¤   ¤   ¤   =¤  8;
2123c2 const SInt16¤   ¤   kBeginPGPSignedMessageID¤   ¤   ¤   =¤  9;
beb241 const SInt16¤   ¤   kEndPGPSignedMessageID¤ ¤   ¤   ¤   =¤  10;
fccff0 const SInt16¤   ¤   kBeginPGPEncryptedSignedMessageID¤  =¤  11;
db1bc7 const SInt16¤   ¤   kEndPGPEncryptedSignedMessageID¤¤   =¤  12;
0ad5a1 const SInt16¤   ¤   kAddKeysID¤ ¤   ¤   ¤   ¤   ¤   ¤   =¤  13;
f6af5a
12b8c4 const ResIDT¤   ¤   STRx_Errors¤¤   ¤   ¤   ¤   ¤   ¤   =¤  10001;
84c1ca const SInt16¤   ¤   kErrorStringID¤ ¤   ¤   ¤   ¤   ¤   =¤  1;
cdaf5a
1baf5a
d26254 const OSType¤   ¤   kPGPkeysCreator¤¤   ¤   ¤   ¤   ¤   =¤  'pgpK';
67bb35 const OSType¤   ¤   kPGPkeysType¤   ¤   ¤   ¤   ¤   ¤   =¤  'APPL';
0caf5a
1cf73f const DescType¤ ¤   cMessageWindow¤ ¤   ¤   ¤   ¤   ¤   =¤  'cMsW';
3e08f2 const DescType¤ ¤   cRecipient¤ ¤   ¤   ¤   ¤   ¤   ¤   =¤  'rcpt';
dcaf5a
--7fa3 000acd99357401200d7 Page 2 of CPGPemailerView.cp
5d5223 const DescType¤ ¤   pDisplayedMessage¤  ¤   ¤   ¤   ¤   =¤  'pMsg';
3d6848 const DescType¤ ¤   pContent¤   ¤   ¤   ¤   ¤   ¤   ¤   =¤  'ctnt';
86a6a9 const DescType¤ ¤   pAddress¤   ¤   ¤   ¤   ¤   ¤   ¤   =¤  'addr';
5caf5a
928c12 ¤   CPGPemailerView *¤  ¤   ¤   ¤   ¤   ¤   ¤
50f74a CPGPemailerView::CreateCPGPemailerViewStream(
e8cd3f ¤   LStream *inStream)
1dbb36 {
c4b771 ¤   return (new CPGPemailerView(inStream));
47efe6 }
cdaf5a
a5af5a
40af5a
f7f9bb CPGPemailerView::CPGPemailerView(
b2b7a6 ¤   LStream* inStream)¤ ¤   ¤   ¤   // Stream to construct it from
6720fb ¤   ¤   : LGrafPortView(inStream), mCursorRef(nil)
b4bb36 {
b1c1c0 ¤   PGPThrowIfOSErr_(Get1AnimatedCursor(acur_BeachBall, &mCursorRef));
a5efe6 }
5faf5a
eeaf5a
30af5a
cda790 CPGPemailerView::~CPGPemailerView()
f9bb36 {
b9b557 ¤   if (mCursorRef != nil) {
7d21d5 ¤   ¤   DisposeAnimatedCursor(mCursorRef);
599371 ¤   }
b0efe6 }
12af5a
f7af5a
17af5a
9b6d52 ¤   void
dbb6b0 CPGPemailerView::SetGlobals(
1ee3e1 ¤   SGlobalsPtr¤inGlobalsP)
debb36 {
facefb ¤   LPane *¤thePane;
f967c5 ¤
bded17 ¤   mGlobalsP = inGlobalsP;
2d67c5 ¤
ea92a4 ¤   // Now that we have the globals, check to see what we can do
bbf8e1 ¤   if (mGlobalsP->disableEncrypt || mGlobalsP->disableSign) {
90093c ¤   ¤   if (mGlobalsP->disableEncrypt) {
073dc4 ¤   ¤   ¤   thePane = FindPaneByID(pane_EncryptButton);
7080d9 ¤   ¤   ¤   if (thePane != nil) {
8fe627 ¤   ¤   ¤   ¤   thePane->Disable();
46a3a6 ¤   ¤   ¤   }
660fe4 ¤   ¤   }
a58274 ¤   ¤   if (mGlobalsP->disableSign) {
a6123a ¤   ¤   ¤   thePane = FindPaneByID(pane_SignButton);
fb80d9 ¤   ¤   ¤   if (thePane != nil) {
0ce627 ¤   ¤   ¤   ¤   thePane->Disable();
fba3a6 ¤   ¤   ¤   }
990fe4 ¤   ¤   }
0bbd3c ¤   ¤   thePane = FindPaneByID(pane_EncryptAndSignButton);
20b7d1 ¤   ¤   if (thePane != nil) {
146ddb ¤   ¤   ¤   thePane->Disable();
320fe4 ¤   ¤   }
1ef828 ¤   }¤
bc67c5 ¤
dbe8de ¤   if (mGlobalsP->disableDecrypt && mGlobalsP->disableVerify) {
896f74 ¤   ¤   thePane = FindPaneByID(pane_DecryptButton);
43b7d1 ¤   ¤   if (thePane != nil) {
356ddb ¤   ¤   ¤   thePane->Disable();
f80fe4 ¤   ¤   }
bf9371 ¤   }
ceefe6 }
83af5a
60af5a
38af5a
e56d52 ¤   void
5389f0 CPGPemailerView::ClickSelf(
acf43f ¤   const SMouseDownEvent& inMouseDown)¤// The mousedown event
--4b13 000544cd3a9401200d7 Page 3 of CPGPemailerView.cp
2cbb36 {
515be1 ¤   (void) inMouseDown;
e167c5 ¤
07eb8d ¤   // Switch target to the view
b1a1f2 ¤   SwitchTarget(this);
95efe6 }
f2af5a
34af5a
80af5a
30af5a
eb5de9 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   ¤   ¤   // Was it handled?
c8377b CPGPemailerView::HandleKeyPress(
0f6949 ¤   const EventRecord¤  &inKeyEvent)¤   // The key event
67bb36 {
576405 ¤   // Let the superclass handle it
e168d8 ¤   return LCommander::HandleKeyPress(inKeyEvent);
20efe6 }
14af5a
45af5a
7daf5a
1c6d52 ¤   void
43eb2f CPGPemailerView::FindCommandStatus(
5eea24 ¤   CommandT¤   inCommand,
c3a472 ¤   Boolean¤¤   &outEnabled,
c93a4d ¤   Boolean¤¤   &outUsesMark,
0f5dc0 ¤   Char16¤ ¤   &outMark,
88d894 ¤   Str255¤ ¤   outName)
6fbb36 {
4bff8b ¤   (void) inCommand;
6653ae ¤   (void) outEnabled;
0bf752 ¤   (void) outUsesMark;
f1d057 ¤   (void) outMark;
13bd69 ¤   (void) outName;
1c67c5 ¤
573de6 ¤   // Do nothing to prevent LCommander from setting enabled to false
33efe6 }
17af5a
0eaf5a
c1af5a
a8af5a
c20e4d ¤   Boolean¤¤   ¤   ¤   ¤   ¤   // Was the command handled?
40ec26 CPGPemailerView::ObeyCommand(
00b61a ¤   CommandT¤   inCommand,¤ ¤   // The command to handle
61aacd ¤   void¤   ¤   *ioParam)¤  ¤   // Extra data
11bb36 {
cb9341 ¤   Boolean¤cmdHandled = true;
39af5a
e7f912 ¤   switch (inCommand) {
249ae3 ¤   ¤   default:
c44a71 ¤   ¤   ¤   cmdHandled = LCommander::ObeyCommand(inCommand, ioParam);
f3cdcb ¤   ¤   ¤   break;
749371 ¤   }
2867c5 ¤
c251a4 ¤   return cmdHandled;
7fefe6 }
2caf5a
9faf5a
6faf5a
216d52 ¤   void
2a1d20 CPGPemailerView::DrawSelf()
82bb36 {
040fd2 ¤   // Do nothing to avoid having LGrafPortView erase the window
feefe6 }
96af5a
35af5a
16af5a
b56d52 ¤   void
bd692b CPGPemailerView::FinishCreateSelf()
1ebb36 {
56efe6 }
92af5a
54af5a
--7472 000ae8f7c32401200d7 Page 4 of CPGPemailerView.cp
3b6d52 ¤   void
8cbc8b CPGPemailerView::ListenToMessage(
e99db4 ¤   MessageT inMessage,¤¤   ¤   // Message sent
c5f4e2 ¤   void* ioParam)¤ ¤   ¤   ¤   // Extra data
77bb36 {
6228bb ¤   (void) ioParam;
6c67c5 ¤
9ee0ab ¤   switch (inMessage) {
104114 ¤   ¤   case pane_EncryptButton:
725b34 ¤   ¤   {
3685f5 ¤   ¤   ¤   EncodeMessage(encodeOptions_Encrypt);
350fe4 ¤   ¤   }
372f68 ¤   ¤   break;
891b52 ¤   ¤
2a1b52 ¤   ¤
889831 ¤   ¤   case pane_SignButton:
1d5b34 ¤   ¤   {
8efae9 ¤   ¤   ¤   EncodeMessage(encodeOptions_Sign);
320fe4 ¤   ¤   }
5e2f68 ¤   ¤   break;
4d1b52 ¤   ¤
871b52 ¤   ¤
6a450d ¤   ¤   case pane_EncryptAndSignButton:
b45b34 ¤   ¤   {
86444c ¤   ¤   ¤   EncodeMessage(encodeOptions_Sign
4edb9f ¤   ¤   ¤   ¤   | encodeOptions_Encrypt);
970fe4 ¤   ¤   }
832f68 ¤   ¤   break;
6b1b52 ¤   ¤
d41b52 ¤   ¤
296563 ¤   ¤   case pane_DecryptButton:
e45b34 ¤   ¤   {
67990e ¤   ¤   ¤   DecodeMessage();
e90fe4 ¤   ¤   }
c52f68 ¤   ¤   break;
821b52 ¤   ¤
eb1b52 ¤   ¤
5ac415 ¤   ¤   case pane_KeysButton:
1b5b34 ¤   ¤   {
3759ce ¤   ¤   ¤   OSStatus¤   err;
3e87c7 ¤   ¤   ¤
91c4e3 ¤   ¤   ¤   err = BringAppToFront(¤ kPGPkeysType,
2d8982 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPkeysCreator,
b37b8b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kFindAppOnAllVolumes,
a9de71 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true,
b08bcf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
2607ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil);
543845 ¤   ¤   ¤   if (err != noErr) {
48bfbe ¤   ¤   ¤   ¤   WarningAlert(¤  kWAStopAlertType,
0b144f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
890862 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
61acee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeysNotFoundID);
9ca3a6 ¤   ¤   ¤   }
cd0fe4 ¤   ¤   }
1a2f68 ¤   ¤   break;
729371 ¤   }
72efe6 }
86af5a
7caf5a
b66d52 ¤   void
d78a2e CPGPemailerView::AdjustCursorSelf(
086989 ¤   Point¤  ¤   ¤   ¤   inPortPt,¤  // Where the cursor is
92b22c ¤   const EventRecord&¤ inMacEvent)¤// Current event
28bb36 {
b8d954 ¤   (void) inPortPt;
1064da ¤   (void) inMacEvent;
b667c5 ¤
ed172c ¤   // Do nothing to avoid having LGrafPortView set the cursor to an arrow
56efe6 }
c8af5a
5eaf5a
aeaf5a
--4f5d 000a0ce6636401200d7 Page 5 of CPGPemailerView.cp
3b6d52 ¤   void
7f8f0d CPGPemailerView::ClickInContent(
ddf4af const EventRecord &¤inMacEvent)
cdbb36 {
c16ab6 ¤   if (IsActive()) {
4b397d ¤   ¤   LGrafPortView::ClickInContent(inMacEvent);
849371 ¤   }
90efe6 }
21af5a
42af5a
68af5a
bc6d52 ¤   void
1d5b2c CPGPemailerView::EncodeMessage(
ee5fe4 ¤   EEncodeOptions¤ inOptions)
91bb36 {
a7b8e8 ¤   PGPKeySetRef¤   defaultKeySet = kInvalidPGPKeySetRef;
52af5a
0b5168 ¤   try {
034622 ¤   ¤   OSErr¤  ¤   ¤   err = noErr;
99ec63 ¤   ¤   StHandleBlock¤  theContent(0, true, true);
e9f0eb ¤   ¤   Boolean¤¤   ¤   setSelection;
c1b831 ¤   ¤   SInt32¤ ¤   ¤   numDefaultRecipients;
ca7d0d ¤   ¤   StHandleBlock¤  defaultRecipientsH((Size) 0);
fb0fd5 ¤   ¤   Boolean¤¤   ¤   useCache;
45aeb6 ¤   ¤   PGPError¤   ¤   pgpErr;
e037f3 ¤   ¤   void *¤ ¤   ¤   outputBuffer = nil;
082b85 ¤   ¤   ¤   ¤
761fe4 ¤   ¤   mEncoding = true;
c61b52 ¤   ¤
532ff4 ¤   ¤   // Attempt to get selection if it is empty get entire content
239791 ¤   ¤   GetFrontWindowSelection(theContent);
6e1792 ¤   ¤   if (::GetHandleSize(theContent) != 0) {
1d4ef1 ¤   ¤   ¤   setSelection = true;
2245a6 ¤   ¤   } else {
60d430 ¤   ¤   ¤   setSelection = false;
4fec04 ¤   ¤   ¤   GetFrontWindowContent(theContent);
050fe4 ¤   ¤   }
11af5a
d01394 ¤   ¤   // If there is no content, just return
792380 ¤   ¤   Size¤   theMessageSize = ::GetHandleSize(theContent);
35af5a
48612e ¤   ¤   if (theMessageSize == 0) {
f4f080 ¤   ¤   ¤   WarningAlert(¤  kWAStopAlertType,
9b9c29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
9631a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
84cbf9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNothingToEncodeID);
d20ecc ¤   ¤   ¤   return;
f30fe4 ¤   ¤   }
0caf5a
b6badb ¤   ¤   // Check to see if the data is already encrypted if so, decrypt it
9722fb ¤   ¤   // instead
44d728 ¤   ¤   pgpErr = PGPOpenDefaultKeyRings(¤   mGlobalsP->pgpContext,
8c9cf4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
7c6133 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &defaultKeySet);
1fc0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
c96d40 ¤   ¤   mEncrypted = false;
c5c384 ¤   ¤   ::HLock(theContent);
38e4ed ¤   ¤   PGPDecode(¤ mGlobalsP->pgpContext,
faabed ¤   ¤   ¤   ¤   ¤   PGPOInputBuffer(¤   mGlobalsP->pgpContext,
562b28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *theContent,
32c503 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theMessageSize),
84451d ¤   ¤   ¤   ¤   ¤   PGPODiscardOutput(¤ mGlobalsP->pgpContext,
771b6d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TRUE),
07968f ¤   ¤   ¤   ¤   ¤   PGPOEventHandler(¤  mGlobalsP->pgpContext,
6e0cce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEventHandler,
c132b9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   this),
1d081a ¤   ¤   ¤   ¤   ¤   PGPOSendNullEvents(¤mGlobalsP->pgpContext,
d1edd1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   500),
c2c16d ¤   ¤   ¤   ¤   ¤   PGPOKeySetRef(¤ mGlobalsP->pgpContext,
953f44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeySet),
044b8e ¤   ¤   ¤   ¤   ¤   PGPOLastOption(mGlobalsP->pgpContext));
a0459d ¤   ¤   ::HUnlock(theContent);
--c216 00067a5e71d401200d7 Page 6 of CPGPemailerView.cp
6400ec ¤   ¤   if (mEncrypted) {
45990e ¤   ¤   ¤   DecodeMessage();
0f45a6 ¤   ¤   } else {
5229e1 ¤   ¤   ¤   // Grab the default recipients
1b9b84 ¤   ¤   ¤   GetFrontWindowRecipients(¤  &numDefaultRecipients,
3f9d1d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultRecipientsH);
2aaf5a
66bcf6 ¤   ¤   ¤   StHandleLocker¤ theLock(defaultRecipientsH);
abaf5a
2842d5 ¤   ¤   ¤   // Do we use the cache and show recipients
069225 ¤   ¤   ¤   if (CWaitNextEventDispatcher::GetEventParamsPtr()->theEvent->modifi¶
e3b725 ers
ae95cb ¤   ¤   ¤   & optionKey) {
04b9b7 ¤   ¤   ¤   ¤   useCache = false;
e1042d ¤   ¤   ¤   } else {
92bf7f ¤   ¤   ¤   ¤   useCache = true;
c7a3a6 ¤   ¤   ¤   }
deaf5a
651cb9 ¤   ¤   ¤   // Do the encryption
0b06b1 ¤   ¤   ¤   inOptions |= encodeOptions_TreatInputAsText;
b64982 ¤   ¤   ¤   if (inOptions & encodeOptions_Encrypt) {
4f09b0 ¤   ¤   ¤   ¤   inOptions |= encodeOptions_TextOutput;
b4042d ¤   ¤   ¤   } else {
9c22dd ¤   ¤   ¤   ¤   inOptions |= encodeOptions_ClearSign;
2fa3a6 ¤   ¤   ¤   }
fd088d ¤   ¤   ¤   if (CPGPEncoderDecoder::EncodeHandle(mGlobalsP->pgpContext,
487fc3 ¤   ¤   ¤   theContent, inOptions, numDefaultRecipients,
0afb61 ¤   ¤   ¤   (PGPRecipientSpec *) *defaultRecipientsH, useCache)) {
9c5759 ¤   ¤   ¤   ¤   // Warn about attachments
7d5191 ¤   ¤   ¤   ¤   if (CountFrontWindowAttachments() > 0) {
66b22e ¤   ¤   ¤   ¤   ¤   WarningAlert(¤  kWACautionAlertType,
b40c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
9a475c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
072209 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAttachmentsWarningID);
a52613 ¤   ¤   ¤   ¤   }
512b85 ¤   ¤   ¤   ¤
b0d7f2 ¤   ¤   ¤   ¤   // Set the window content
88113d ¤   ¤   ¤   ¤   if (setSelection) {
4385b0 ¤   ¤   ¤   ¤   ¤   try {
30db84 ¤   ¤   ¤   ¤   ¤   ¤   SetFrontWindowSelection(theContent);
831c89 ¤   ¤   ¤   ¤   ¤   }
b5a3d0 ¤   ¤   ¤   ¤   ¤   catch (...) {
ba12c8 ¤   ¤   ¤   ¤   ¤   ¤   WarningAlert(¤  kWAStopAlertType,
429a5e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
3fe95d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
ca0aa4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kBadSelectionID);
6945a8 ¤   ¤   ¤   ¤   ¤   }¤  ¤   ¤
17b5fc ¤   ¤   ¤   ¤   } else {
a1c2e5 ¤   ¤   ¤   ¤   ¤   SetFrontWindowContent(theContent);
852613 ¤   ¤   ¤   ¤   }
4fa3a6 ¤   ¤   ¤   }
130fe4 ¤   ¤   }
8b9371 ¤   }
6767c5 ¤
4eca6f ¤   catch (CComboError & comboError) {
ddc2ea ¤   ¤   if (comboError.HavePGPError()) {
9d85c9 ¤   ¤   ¤   ShowError(comboError.pgpErr);
1745a6 ¤   ¤   } else {
0cc9ed ¤   ¤   ¤   ShowError(MacErrorToPGPError(comboError.err));
5a0fe4 ¤   ¤   }
339371 ¤   }
59af5a
a97e82 ¤   catch(...) {
4e6fec ¤   ¤   ShowError(kPGPError_UnknownError);
3b9371 ¤   }
b367c5 ¤
9b748b ¤   if (PGPKeySetRefIsValid(defaultKeySet)) {
a6aca0 ¤   ¤   PGPFreeKeySet(defaultKeySet);
c89371 ¤   }
aaefe6 }
78af5a
67af5a
--a347 0005a9833f6401200d7 Page 7 of CPGPemailerView.cp
e0af5a
2c6d52 ¤   void
634a28 CPGPemailerView::DecodeMessage()
08bb36 {
1f9d98 ¤   PGPKeySetRef¤   ¤   ¤   defaultKeySet = kInvalidPGPKeySetRef;
3470bc ¤   PGPKeySetRef¤   ¤   ¤   importSet = kInvalidPGPKeySetRef;
a31dcc ¤   PGPKeySetRef¤   ¤   ¤   selectedSet = kInvalidPGPKeySetRef;
582c87 ¤   SDecodeSectionHandle¤   theSectionsH = nil;
b493bf ¤   char *¤ ¤   ¤   ¤   ¤   secureString = nil;
2a67c5 ¤
3a5168 ¤   try {
63a6fb ¤   ¤   OSErr¤  ¤   ¤   ¤   ¤   err = noErr;
c208d8 ¤   ¤   StHandleBlock¤  ¤   ¤   theContent(0, true, true);
730586 ¤   ¤   Boolean¤¤   ¤   ¤   ¤   useCache;
55983f ¤   ¤   Boolean¤¤   ¤   ¤   ¤   fyeo;
a41ae0 ¤   ¤   PGPError¤   ¤   ¤   ¤   pgpErr;
2c67c5 ¤
20bf34 ¤   ¤   // Get the content
637d9c ¤   ¤   GetFrontWindowContent(theContent);
411b52 ¤   ¤
a836f6 ¤   ¤   // Do we use the cache?
d42ae5 ¤   ¤   if (CWaitNextEventDispatcher::GetEventParamsPtr()->theEvent->modifiers
87772a ¤   ¤   & optionKey) {
e88ebf ¤   ¤   ¤   useCache = false;
0a45a6 ¤   ¤   } else {
9d0429 ¤   ¤   ¤   useCache = true;
370fe4 ¤   ¤   }
20af5a
b1b546 ¤   ¤   // Open the default keyrings
92d728 ¤   ¤   pgpErr = PGPOpenDefaultKeyRings(¤   mGlobalsP->pgpContext,
449cf4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
0e6133 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &defaultKeySet);
5fc0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
5e87c7 ¤   ¤   ¤
fd7670 ¤   ¤   // Decrypt the content
229436 ¤   ¤   if (CPGPEncoderDecoder::DecodeHandle(mGlobalsP->pgpContext,
acd59a ¤   ¤   theContent, defaultKeySet, theSectionsH, &fyeo, useCache)) {
461f35 ¤   ¤   ¤   CString¤¤   ¤   sigString;
de0aad ¤   ¤   ¤   CString¤¤   ¤   beginSignedMessage(¤STRx_Strings,
459652 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kBeginPGPSignedMessageID);
8e9404 ¤   ¤   ¤   CString¤¤   ¤   endSignedMessage(STRx_Strings, kEndPGPSignedMessage¶
ae9668 ID);
ef93f4 ¤   ¤   ¤   CString¤¤   ¤   beginEncryptedSignedMessage(
d8e95d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
72e26a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kBeginPGPEncryptedSignedMessageID);
008dc3 ¤   ¤   ¤   CString ¤   ¤   endEncryptedSignedMessage(
b4e95d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
63f09b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEndPGPEncryptedSignedMessageID);
1c8258 ¤   ¤   ¤   PGPMemoryMgrRef¤memoryMgr = PGPGetContextMemoryMgr(mGlobalsP->pgpCo¶
460b0f ntext);
69b4a2 ¤   ¤   ¤   Boolean¤¤   ¤   checked = true;
ed9bc4 ¤   ¤   ¤   Boolean¤¤   ¤   verified = true;
7a87c7 ¤   ¤   ¤
9df261 ¤   ¤   ¤   if (fyeo) {
e4e52b ¤   ¤   ¤   ¤   secureString = (char *) PGPNewSecureData(memoryMgr,
1c1e9a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   1,
6a914d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMemoryMgrFlags_None);
b7cffe ¤   ¤   ¤   ¤   PGPThrowIfNULL_(secureString);
3b0c8a ¤   ¤   ¤   ¤   *secureString = 0;
13042d ¤   ¤   ¤   } else {
c74771 ¤   ¤   ¤   ¤   ::SetHandleSize(theContent, 0);
9ba3a6 ¤   ¤   ¤   }
be87c7 ¤   ¤   ¤
1a3fed ¤   ¤   ¤   // Create the import set
a2a04a ¤   ¤   ¤   pgpErr = PGPNewKeySet(mGlobalsP->pgpContext, &importSet);
118109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
a987c7 ¤   ¤   ¤
15c64b ¤   ¤   ¤   // Walk through the sections reassembling them
6e383c ¤   ¤   ¤   for (UInt32 i = 0,
7d32be ¤   ¤   ¤   x = ::GetHandleSize((Handle) theSectionsH)/sizeof(SDecodeSection);
339c87 ¤   ¤   ¤   i < x; i++) {
5a4611 ¤   ¤   ¤   ¤   // If it is a signed section, add sig info
--f14b 0008ed4e415401200d7 Page 8 of CPGPemailerView.cp
5687aa ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].sigDataValid) {
bbfaba ¤   ¤   ¤   ¤   ¤   SignatureStatusInfo¤theStatus;
d67126 ¤   ¤   ¤   ¤   ¤   char¤   keyIDString[ kPGPMaxKeyIDStringSize ];
fcae30 ¤   ¤   ¤   ¤   ¤
70d6cd ¤   ¤   ¤   ¤   ¤   // Set an alert flag if we were unable to verify a section
aca01b ¤   ¤   ¤   ¤   ¤   if (! (*theSectionsH)[i].sigData.checked) {
406b56 ¤   ¤   ¤   ¤   ¤   ¤   checked = false;
f11c89 ¤   ¤   ¤   ¤   ¤   }
a1d9aa ¤   ¤   ¤   ¤   ¤   if (! (*theSectionsH)[i].sigData.verified) {
b6150e ¤   ¤   ¤   ¤   ¤   ¤   verified = false;
ca1c89 ¤   ¤   ¤   ¤   ¤   }
89ae30 ¤   ¤   ¤   ¤   ¤
67366a ¤   ¤   ¤   ¤   ¤   // Add status message
ccadc3 ¤   ¤   ¤   ¤   ¤   theStatus.sigData = (*theSectionsH)[i].sigData;
4d6ed1 ¤   ¤   ¤   ¤   ¤   pgpErr = PGPGetKeyIDString(¤&theStatus.sigData.signingKeyID,
89b1a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyIDString_Abbreviated,
27f902 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyIDString);
961edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
4c18c5 ¤   ¤   ¤   ¤   ¤   CopyCString(keyIDString, theStatus.keyIDString);
b81a0a ¤   ¤   ¤   ¤   ¤   GetSignatureStatusMessage(¤ &theStatus,
309699 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sigString);
9fa95a ¤   ¤   ¤   ¤   ¤   if (fyeo) {
15fb26 ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤newSize = 1 + strlen(secureString) +
eff294 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sigString.GetLength() +
69cbe8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (((*theSectionsH)[i].encrypted) ?
bc704e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginEncryptedSignedMessage.GetLength() :
3bdf2b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginSignedMessage.GetLength());
6ded43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
612728 ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPReallocData(¤   memoryMgr,
c66bea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &secureString,
a7c766 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newSize,
b6e807 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMemoryMgrFlags_None);
0ec66f ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
c1c583 ¤   ¤   ¤   ¤   ¤   ¤   strcat(secureString, sigString.GetConstCString());
9c7e8e ¤   ¤   ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].encrypted) {
9f0266 ¤   ¤   ¤   ¤   ¤   ¤   ¤   strcat(secureString,·
9154ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginEncryptedSignedMessage.GetConstCString());
423af7 ¤   ¤   ¤   ¤   ¤   ¤   } else {
6e0266 ¤   ¤   ¤   ¤   ¤   ¤   ¤   strcat(secureString,·
764b8a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginSignedMessage.GetConstCString());
ecdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
e481a1 ¤   ¤   ¤   ¤   ¤   } else {
931de2 ¤   ¤   ¤   ¤   ¤   ¤   ::PtrAndHand(¤  sigString.GetConstCString(),
73a913 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theContent,
863f07 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sigString.GetLength());
237e8e ¤   ¤   ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].encrypted) {
58910f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::PtrAndHand(
69de33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginEncryptedSignedMessage.GetConstCString¶
e6d067 (),
c73f52 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theContent,
a8f588 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginEncryptedSignedMessage.GetLength());
923af7 ¤   ¤   ¤   ¤   ¤   ¤   } else {
5d23b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::PtrAndHand(¤  beginSignedMessage.GetConstCString(¶
64baec ),
55fcbf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theContent,
904587 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginSignedMessage.GetLength());
8cdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
241c89 ¤   ¤   ¤   ¤   ¤   }
9b2613 ¤   ¤   ¤   ¤   }
ad2b85 ¤   ¤   ¤   ¤
ca0854 ¤   ¤   ¤   ¤   // If it is a key section add it to our import list
1d3e13 ¤   ¤   ¤   ¤   if (PGPKeySetRefIsValid((*theSectionsH)[i].addKeysSet)) {
c6c37d ¤   ¤   ¤   ¤   ¤   pgpErr = PGPAddKeys(¤   (*theSectionsH)[i].addKeysSet,
520e13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   importSet);
5d1edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
89aa6c ¤   ¤   ¤   ¤   ¤   pgpErr = PGPCommitKeyRingChanges(importSet);
e91edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
4f2613 ¤   ¤   ¤   ¤   }
afae30 ¤   ¤   ¤   ¤   ¤
d07e27 ¤   ¤   ¤   ¤   // Append the section
b622aa ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].buf != nil) {
8ea95a ¤   ¤   ¤   ¤   ¤   if (fyeo) {
--d9cf 000fd5ddf62401200d7 Page 9 of CPGPemailerView.cp
18fb26 ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤newSize = 1 + strlen(secureString) +
504652 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*theSectionsH)[i].size;
bded43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
bd53b1 ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPReallocData(memoryMgr,
49e616 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &secureString,
08e1d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newSize,
81914d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMemoryMgrFlags_None);
77c66f ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
fdacee ¤   ¤   ¤   ¤   ¤   ¤   strncat(secureString,
363d8a ¤   ¤   ¤   ¤   ¤   ¤   ¤   (char *) (*theSectionsH)[i].buf,
d7a0ab ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*theSectionsH)[i].size);
1e73eb ¤   ¤   ¤   ¤   ¤   ¤   secureString[newSize - 1] = 0;
4781a1 ¤   ¤   ¤   ¤   ¤   } else {
374a98 ¤   ¤   ¤   ¤   ¤   ¤   ::PtrAndHand(¤  (*theSectionsH)[i].buf,
41a913 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theContent,
3afdc5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*theSectionsH)[i].size);
7b1c89 ¤   ¤   ¤   ¤   ¤   }
9c2613 ¤   ¤   ¤   ¤   }
192b85 ¤   ¤   ¤   ¤
f73543 ¤   ¤   ¤   ¤   // Close out signed section
d887aa ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].sigDataValid) {
f4a95a ¤   ¤   ¤   ¤   ¤   if (fyeo) {
0bfb26 ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤newSize = 1 + strlen(secureString) +
56cbe8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (((*theSectionsH)[i].encrypted) ?
ab5536 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endEncryptedSignedMessage.GetLength() :
f0d958 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endSignedMessage.GetLength());
38ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
572728 ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPReallocData(¤   memoryMgr,
2f6bea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &secureString,
3ec766 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newSize,
b8e807 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMemoryMgrFlags_None);
1ac66f ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
e77e8e ¤   ¤   ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].encrypted) {
7c0266 ¤   ¤   ¤   ¤   ¤   ¤   ¤   strcat(secureString,·
a14fe4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endEncryptedSignedMessage.GetConstCString());
d83af7 ¤   ¤   ¤   ¤   ¤   ¤   } else {
480266 ¤   ¤   ¤   ¤   ¤   ¤   ¤   strcat(secureString,·
c16eb3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endSignedMessage.GetConstCString());
06db3c ¤   ¤   ¤   ¤   ¤   ¤   }
8e81a1 ¤   ¤   ¤   ¤   ¤   } else {
b17e8e ¤   ¤   ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].encrypted) {
01910f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::PtrAndHand(
cd84f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endEncryptedSignedMessage.GetConstCString(),
c23f52 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theContent,
30d0f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endEncryptedSignedMessage.GetLength());
633af7 ¤   ¤   ¤   ¤   ¤   ¤   } else {
5d7713 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::PtrAndHand(¤  endSignedMessage.GetConstCString(),
34fcbf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theContent,
501a7f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endSignedMessage.GetLength());
72db3c ¤   ¤   ¤   ¤   ¤   ¤   }
411c89 ¤   ¤   ¤   ¤   ¤   }
b02613 ¤   ¤   ¤   ¤   }
92a6ce ¤   ¤   ¤   ¤   // Free the data associated with the section
e7f342 ¤   ¤   ¤   ¤   ::HLock((Handle) theSectionsH);
548259 ¤   ¤   ¤   ¤   CPGPEncoderDecoder::FreeDecodeSection(&(*theSectionsH)[i]);
42c7d5 ¤   ¤   ¤   ¤   ::HUnlock((Handle) theSectionsH);
faa3a6 ¤   ¤   ¤   }
6187c7 ¤   ¤   ¤
cc740a ¤   ¤   ¤   // Free up the sections handle
92f2f1 ¤   ¤   ¤   if (theSectionsH != nil) {
578278 ¤   ¤   ¤   ¤   ::DisposeHandle((Handle) theSectionsH);
64acac ¤   ¤   ¤   ¤   theSectionsH = nil;
d1a3a6 ¤   ¤   ¤   }
7987c7 ¤   ¤   ¤
2da3f3 ¤   ¤   ¤   // Import the keys
bf06fe ¤   ¤   ¤   PGPUInt32¤  count;
fa87c7 ¤   ¤   ¤
e9c1c5 ¤   ¤   ¤   pgpErr = PGPCountKeys(importSet, &count);
b28109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
042050 ¤   ¤   ¤   if (count > 0) {¤   ¤   ¤   ¤
15f49f ¤   ¤   ¤   ¤   pgpErr = PGPSelectKeysDialog(
fdfa15 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mGlobalsP->pgpContext,
--4685 000135e1550401200d7 Page 10 of CPGPemailerView.cp
43a4c9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation,¤ ¤   ¤   ¤   ¤   ¶
2d1b52 ¤   ¤
de5602 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_Strings,
99d13e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAddKeysID),¤   ¤   ¤   ¤   ¤   ¤   ¤
48aaf6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   importSet,¤ ¤   ¤   ¤   ¤   ¤   ¤
28c472 ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeySet,
a36e9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   &selectedSet);
155cfc ¤   ¤   ¤   ¤   if (pgpErr != kPGPError_UserAbort) {
b91edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
4b7b50 ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSharedAddKeysToDefaultKeyring(
025b76 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectedSet);
561edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
932613 ¤   ¤   ¤   ¤   }
93a3a6 ¤   ¤   ¤   }
c6af5a
19ae30 ¤   ¤   ¤   ¤   ¤
a222f6 ¤   ¤   ¤   // Set the content
1dfdba ¤   ¤   ¤   if (secureString == nil) {
45d3c2 ¤   ¤   ¤   ¤   SetFrontWindowContent(theContent);
1ba3a6 ¤   ¤   ¤   }
c0af5a
34258c ¤   ¤   ¤   // Show alert if flag is set
cc9060 ¤   ¤   ¤   if ((! checked) || (! verified)) {
91bfbe ¤   ¤   ¤   ¤   WarningAlert(¤  kWAStopAlertType,
f3144f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
e60862 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
cce789 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (checked) ? kSignatureBadID :
6df760 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSignatureNotVerifiedID);
6e01e6 ¤   ¤   ¤   }¤  ¤   ¤   ¤
adaf5a
2a834c ¤   ¤   ¤   // If FYEO
b5f65d ¤   ¤   ¤   if (secureString != nil) {
ae1c46 ¤   ¤   ¤   ¤   PGPForYourEyesOnlyDialog(¤  mGlobalsP->pgpContext,
a6686e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   secureString);
6ea3a6 ¤   ¤   ¤   }
1c0fe4 ¤   ¤   }
629371 ¤   }
0367c5 ¤
b1ca6f ¤   catch (CComboError & comboError) {
76c2ea ¤   ¤   if (comboError.HavePGPError()) {
5785c9 ¤   ¤   ¤   ShowError(comboError.pgpErr);
8045a6 ¤   ¤   } else {
3fc9ed ¤   ¤   ¤   ShowError(MacErrorToPGPError(comboError.err));
d90fe4 ¤   ¤   }
f99371 ¤   }
97af5a
897e82 ¤   catch(...) {
e26fec ¤   ¤   ShowError(kPGPError_UnknownError);
489371 ¤   }
3b67c5 ¤
a53bd1 ¤   if (secureString != nil) {
0c08fb ¤   ¤   pgpClearMemory(secureString, strlen(secureString));
07a097 ¤   ¤   PGPFreeData(secureString);
1e9371 ¤   }
2a3f7d ¤   if (theSectionsH != nil) {
7a4195 ¤   ¤   ::DisposeHandle((Handle) theSectionsH);
609371 ¤   }
f08619 ¤   if (PGPKeySetRefIsValid(selectedSet)) {
444e78 ¤   ¤   PGPFreeKeySet(selectedSet);
799371 ¤   }
67560a ¤   if (PGPKeySetRefIsValid(importSet)) {
1a8a2c ¤   ¤   PGPFreeKeySet(importSet);
ae9371 ¤   }
29748b ¤   if (PGPKeySetRefIsValid(defaultKeySet)) {
b6aca0 ¤   ¤   PGPFreeKeySet(defaultKeySet);
ab9371 ¤   }
2cefe6 }
6eaf5a
16af5a
4eaf5a
936d52 ¤   void
13b25b CPGPemailerView::GetFrontWindowContent(
--5f21 000481075b0401200d7 Page 11 of CPGPemailerView.cp
8e8d27 ¤   Handle¤ outContentH)
d8bb36 {
cd06b9 ¤   OSErr¤  ¤   err = noErr;
362ac2 ¤   AppleEvent¤ theGetContentEvent = {typeNull, nil};
6767c5 ¤
e014ae ¤   // Create the AppleEvent
077110 ¤   UAppleEventsMgr::MakeAppleEvent(¤   kAECoreSuite,
549ff4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAEGetData,
9651cc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theGetContentEvent);
2e0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
33f8a9 ¤   // Create the window specifier
79736e ¤   StAEDescriptor¤ nullDescriptor;
d5d1ba ¤   StAEDescriptor¤ windowSpec;
25cbb1 ¤   DescType¤   ¤   first = kAEFirst;
fb1900 ¤   StAEDescriptor¤ windowPositionDesc(¤typeAbsoluteOrdinal,
5b04db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &first,
2587a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(first));
9f67c5 ¤
960c08 ¤   err = ::CreateObjSpecifier(¤cWindow,
809085 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nullDescriptor,
9408af ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formAbsolutePosition,
af10c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowPositionDesc,
368fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
516de8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec);
c15e5c ¤   PGPThrowIfOSErr_(err);
d067c5 ¤
981b52 ¤   ¤
649bb4 ¤   // Create message property
e3be8f ¤   StAEDescriptor¤ displayedMessageProperty(pDisplayedMessage);
c6a24c ¤   StAEDescriptor¤ messageSpec;
8267c5 ¤
94b8e1 ¤   err = ::CreateObjSpecifier(¤cProperty,
3dc036 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec,
428ed5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
e0f0ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   displayedMessageProperty,
3d8fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
0e0823 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   messageSpec);
9f5e5c ¤   PGPThrowIfOSErr_(err);
4f67c5 ¤
58c740 ¤   // Create the content property
d0eda1 ¤   StAEDescriptor¤ contentProperty(pContent);
cd21b9 ¤   StAEDescriptor¤ contentSpec;
c467c5 ¤
a3b8e1 ¤   err = ::CreateObjSpecifier(¤cProperty,
c53d30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   messageSpec,
728ed5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
0062e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   contentProperty,
f98fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
bfa882 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   contentSpec);
7a5e5c ¤   PGPThrowIfOSErr_(err);
b1af5a
0caf5a
b94199 ¤   // Add the spec to the appleevent and send it
03f5bd ¤   err = ::AEPutParamDesc(&theGetContentEvent, keyDirectObject, contentSpec);
645e5c ¤   PGPThrowIfOSErr_(err);
a1113d ¤   AppleEvent¤ theReply = {typeNull, nil};
8767c5 ¤
95c43b ¤   UAppleEventsMgr::SendAppleEventWithReply(¤  theGetContentEvent,
40230a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theReply,
353047 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false);¤¤   ¤   ¤   ¤   ¤
4ccb47 ¤   ::AEDisposeDesc(&theGetContentEvent);
2767c5 ¤
48dabd ¤   // Retrieve the data
45eebf ¤   StAEDescriptor¤ errorCode(theReply, keyErrorNumber);
c367c5 ¤
53b229 ¤   if (errorCode.mDesc.descriptorType != typeNull) {
57e246 ¤   ¤   UExtractFromAEDesc::TheInt16(errorCode, err);
881b52 ¤   ¤
844a74 ¤   ¤   PGPThrowIfOSErr_(err);
899371 ¤   }
8067c5 ¤
48e48a ¤   StAEDescriptor¤ theContent(theReply, keyDirectObject);
--b21c 0003875e2d6401200d7 Page 12 of CPGPemailerView.cp
e0af5a
a55688 ¤   PGPThrowIf_(theContent.mDesc.descriptorType == typeNull);
e667c5 ¤
875a18 ¤   Size¤   theDataSize = ::GetHandleSize(theContent.mDesc.dataHandle);
c8af5a
9c8d66 ¤   ::SetHandleSize(outContentH, theDataSize);
87f716 ¤   ::BlockMoveData(¤   *theContent.mDesc.dataHandle,
c2356c ¤   ¤   ¤   ¤   ¤   ¤   *outContentH,
1e98b3 ¤   ¤   ¤   ¤   ¤   ¤   theDataSize);
1f67c5 ¤
f316e4 ¤   // Check for missing parms and dispose of the reply
5f7fcd ¤   UAppleEventsMgr::CheckForMissedParams(theReply);
491cbc ¤   ::AEDisposeDesc(&theReply);
4eefe6 }
60af5a
0baf5a
bcaf5a
466d52 ¤   void
a65945 CPGPemailerView::SetFrontWindowContent(
3fab32 Handle¤ inContentH)
01bb36 {
b006b9 ¤   OSErr¤  ¤   err = noErr;
64cdb6 ¤   AppleEvent¤ theSetContentEvent = {typeNull, nil};
8867c5 ¤
dd14ae ¤   // Create the AppleEvent
197110 ¤   UAppleEventsMgr::MakeAppleEvent(¤   kAECoreSuite,
6c5f85 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAESetData,
855cec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSetContentEvent);
0c0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
9ff8a9 ¤   // Create the window specifier
db736e ¤   StAEDescriptor¤ nullDescriptor;
18d1ba ¤   StAEDescriptor¤ windowSpec;
f4cbb1 ¤   DescType¤   ¤   first = kAEFirst;
781900 ¤   StAEDescriptor¤ windowPositionDesc(¤typeAbsoluteOrdinal,
8804db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &first,
7787a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(first));
8f67c5 ¤
460c08 ¤   err = ::CreateObjSpecifier(¤cWindow,
4c9085 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nullDescriptor,
fc08af ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formAbsolutePosition,
5c10c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowPositionDesc,
dd8fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
956de8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec);
dc5e5c ¤   PGPThrowIfOSErr_(err);
3d1b52 ¤   ¤
589bb4 ¤   // Create message property
54be8f ¤   StAEDescriptor¤ displayedMessageProperty(pDisplayedMessage);
8ca24c ¤   StAEDescriptor¤ messageSpec;
5167c5 ¤
b5b8e1 ¤   err = ::CreateObjSpecifier(¤cProperty,
ecc036 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec,
888ed5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
80f0ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   displayedMessageProperty,
b68fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
7b0823 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   messageSpec);
ac5e5c ¤   PGPThrowIfOSErr_(err);
9267c5 ¤
26c740 ¤   // Create the content property
58eda1 ¤   StAEDescriptor¤ contentProperty(pContent);
d021b9 ¤   StAEDescriptor¤ contentSpec;
5367c5 ¤
ddb8e1 ¤   err = ::CreateObjSpecifier(¤cProperty,
d83d30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   messageSpec,
568ed5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
0462e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   contentProperty,
518fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
5fa882 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   contentSpec);
9f5e5c ¤   PGPThrowIfOSErr_(err);
dc67c5 ¤
be2dac ¤   // Create the data spec
d7dfe6 ¤   StHandleLocker¤ theLock(inContentH);
38129a ¤   StAEDescriptor¤ dataSpec(¤  typeChar,
--76e8 0006439ace7401200d7 Page 13 of CPGPemailerView.cp
f253eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *inContentH,
67905b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::GetHandleSize(inContentH));
c6af5a
5daf5a
b21cb1 ¤   // Add the specs to the appleevent and send it
9f3fa0 ¤   err = ::AEPutParamDesc(&theSetContentEvent, keyDirectObject, contentSpec);
0b5e5c ¤   PGPThrowIfOSErr_(err);
0daf36 ¤   err = ::AEPutParamDesc(&theSetContentEvent, keyAEData, dataSpec);
d85e5c ¤   PGPThrowIfOSErr_(err);
2667c5 ¤
facd16 ¤   UAppleEventsMgr::SendAppleEvent(theSetContentEvent);¤   ¤   ¤   ¤   ¤   ¤
a6c667 ¤   ::AEDisposeDesc(&theSetContentEvent);
e8efe6 }
87af5a
0baf5a
cbaf5a
446d52 ¤   void
a33e8d CPGPemailerView::GetFrontWindowSelection(
b88d27 ¤   Handle¤ outContentH)
37bb36 {
8406b9 ¤   OSErr¤  ¤   err = noErr;
823c4b ¤   AppleEvent¤ theGetSelectionEvent = {typeNull, nil};
6667c5 ¤
6e14ae ¤   // Create the AppleEvent
c47110 ¤   UAppleEventsMgr::MakeAppleEvent(¤   kAECoreSuite,
da9ff4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAEGetData,
9c504c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theGetSelectionEvent);
200230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
6ff8a9 ¤   // Create the window specifier
2c736e ¤   StAEDescriptor¤ nullDescriptor;
86d1ba ¤   StAEDescriptor¤ windowSpec;
27cbb1 ¤   DescType¤   ¤   first = kAEFirst;
501900 ¤   StAEDescriptor¤ windowPositionDesc(¤typeAbsoluteOrdinal,
5d04db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &first,
9587a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(first));
7b67c5 ¤
c80c08 ¤   err = ::CreateObjSpecifier(¤cWindow,
cd9085 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nullDescriptor,
fd08af ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formAbsolutePosition,
9210c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowPositionDesc,
488fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
746de8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec);
ea5e5c ¤   PGPThrowIfOSErr_(err);
b667c5 ¤
d31b52 ¤   ¤
7c9bb4 ¤   // Create message property
33383b ¤   StAEDescriptor¤ selectionProperty((DescType) pUserSelection);
549e8e ¤   StAEDescriptor¤ selectionSpec;
4667c5 ¤
f1b8e1 ¤   err = ::CreateObjSpecifier(¤cProperty,
d2c036 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec,
038ed5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
958e75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionProperty,
868fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
be6697 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionSpec);
dd5e5c ¤   PGPThrowIfOSErr_(err);
79af5a
264199 ¤   // Add the spec to the appleevent and send it
f7d09c ¤   err = ::AEPutParamDesc(¤&theGetSelectionEvent,
a7980f ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyDirectObject,
767ec7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionSpec);
605e5c ¤   PGPThrowIfOSErr_(err);
9067c5 ¤
a9113d ¤   AppleEvent¤ theReply = {typeNull, nil};
a067c5 ¤
74168c ¤   UAppleEventsMgr::SendAppleEventWithReply(¤  theGetSelectionEvent,
2e230a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theReply,
433047 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false);¤¤   ¤   ¤   ¤   ¤
7c03fb ¤   ::AEDisposeDesc(&theGetSelectionEvent);
2467c5 ¤
70dabd ¤   // Retrieve the data
64eebf ¤   StAEDescriptor¤ errorCode(theReply, keyErrorNumber);
--3787 0000b963634401200d7 Page 14 of CPGPemailerView.cp
2a67c5 ¤
b8b229 ¤   if (errorCode.mDesc.descriptorType != typeNull) {
d2e246 ¤   ¤   UExtractFromAEDesc::TheInt16(errorCode, err);
cc1b52 ¤   ¤
0a4a74 ¤   ¤   PGPThrowIfOSErr_(err);
5c9371 ¤   }
cd67c5 ¤
73e31e ¤   StAEDescriptor¤ theSelection(theReply, keyDirectObject);
58af5a
63f042 ¤   PGPThrowIf_(theSelection.mDesc.descriptorType == typeNull);
8367c5 ¤
f02650 ¤   Size¤   ¤   ¤   theDataSize =
7864d3 ¤   ¤   ¤   ¤   ¤   ¤   ::GetHandleSize(theSelection.mDesc.dataHandle);
2daf5a
368d66 ¤   ::SetHandleSize(outContentH, theDataSize);
b09e23 ¤   ::BlockMoveData(¤   *theSelection.mDesc.dataHandle,
e8356c ¤   ¤   ¤   ¤   ¤   ¤   *outContentH,
5598b3 ¤   ¤   ¤   ¤   ¤   ¤   theDataSize);
cd67c5 ¤
3016e4 ¤   // Check for missing parms and dispose of the reply
3f7fcd ¤   UAppleEventsMgr::CheckForMissedParams(theReply);
fc1cbc ¤   ::AEDisposeDesc(&theReply);
8defe6 }
1aaf5a
39af5a
87af5a
2c6d52 ¤   void
4468d1 CPGPemailerView::SetFrontWindowSelection(
5ebaf5 ¤   Handle inContentH)
fbbb36 {
f806b9 ¤   OSErr¤  ¤   err = noErr;
22385e ¤   AppleEvent¤ theSetSelectionEvent = {typeNull, nil};
c667c5 ¤
0e14ae ¤   // Create the AppleEvent
707110 ¤   UAppleEventsMgr::MakeAppleEvent(¤   kAECoreSuite,
af5f85 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAESetData,
27a89a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSetSelectionEvent);
e70230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
79f8a9 ¤   // Create the window specifier
4c736e ¤   StAEDescriptor¤ nullDescriptor;
b9d1ba ¤   StAEDescriptor¤ windowSpec;
accbb1 ¤   DescType¤   ¤   first = kAEFirst;
011900 ¤   StAEDescriptor¤ windowPositionDesc(¤typeAbsoluteOrdinal,
8804db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &first,
d287a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(first));
9b67c5 ¤
df0c08 ¤   err = ::CreateObjSpecifier(¤cWindow,
7b9085 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nullDescriptor,
6e08af ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formAbsolutePosition,
de10c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowPositionDesc,
ab8fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
f36de8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec);
185e5c ¤   PGPThrowIfOSErr_(err);
5e67c5 ¤
331b52 ¤   ¤
649bb4 ¤   // Create message property
ec383b ¤   StAEDescriptor¤ selectionProperty((DescType) pUserSelection);
569e8e ¤   StAEDescriptor¤ selectionSpec;
6267c5 ¤
04b8e1 ¤   err = ::CreateObjSpecifier(¤cProperty,
23c036 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec,
9c8ed5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
f88e75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionProperty,
db8fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
a16697 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionSpec);
7a5e5c ¤   PGPThrowIfOSErr_(err);
0eaf5a
9e38b2 ¤   // Add the spec to the appleevent
6af193 ¤   err = ::AEPutParamDesc(¤&theSetSelectionEvent,
bb980f ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyDirectObject,
347ec7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionSpec);
0b5e5c ¤   PGPThrowIfOSErr_(err);
--a118 0008c58ab58401200d7 Page 15 of CPGPemailerView.cp
e0af5a
de2dac ¤   // Create the data spec
65dfe6 ¤   StHandleLocker¤ theLock(inContentH);
76129a ¤   StAEDescriptor¤ dataSpec(¤  typeChar,
5553eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *inContentH,
b2905b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::GetHandleSize(inContentH));
3faf5a
ef4199 ¤   // Add the spec to the appleevent and send it
3ca6c9 ¤   err = ::AEPutParamDesc(&theSetSelectionEvent, keyAEData, dataSpec);
a15e5c ¤   PGPThrowIfOSErr_(err);
1667c5 ¤
066d7a ¤   UAppleEventsMgr::SendAppleEvent(theSetSelectionEvent);¤ ¤   ¤   ¤   ¤   ¤
e0fb2d ¤   ::AEDisposeDesc(&theSetSelectionEvent);
1defe6 }
bfaf5a
d0af5a
b5af5a
a26d52 ¤   void
504d78 CPGPemailerView::GetFrontWindowRecipients(
ee2840 ¤   SInt32 *¤   outNumRecipients,
055fc8 ¤   Handle¤ ¤   outRecipientsH)
1ebb36 {
f806b9 ¤   OSErr¤  ¤   err = noErr;
63d140 ¤   AppleEvent¤ theGetRecipientsEvent = {typeNull, nil};
9567c5 ¤
4014ae ¤   // Create the AppleEvent
107110 ¤   UAppleEventsMgr::MakeAppleEvent(¤   kAECoreSuite,
8c9ff4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAEGetData,
580ef1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theGetRecipientsEvent);
dc0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
2cf8a9 ¤   // Create the window specifier
bc736e ¤   StAEDescriptor¤ nullDescriptor;
3ad1ba ¤   StAEDescriptor¤ windowSpec;
ebcbb1 ¤   DescType¤   ¤   first = kAEFirst;
681900 ¤   StAEDescriptor¤ windowPositionDesc(¤typeAbsoluteOrdinal,
1f04db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &first,
5787a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(first));
5f67c5 ¤
190c08 ¤   err = ::CreateObjSpecifier(¤cWindow,
0e9085 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nullDescriptor,
2e08af ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formAbsolutePosition,
1210c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowPositionDesc,
178fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
a16de8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec);
535e5c ¤   PGPThrowIfOSErr_(err);
26af5a
119bb4 ¤   // Create message property
c0be8f ¤   StAEDescriptor¤ displayedMessageProperty(pDisplayedMessage);
aba24c ¤   StAEDescriptor¤ messageSpec;
1c67c5 ¤
30b8e1 ¤   err = ::CreateObjSpecifier(¤cProperty,
d3c036 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec,
e18ed5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
edf0ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   displayedMessageProperty,
cd8fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
ed0823 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   messageSpec);
565e5c ¤   PGPThrowIfOSErr_(err);
7baf5a
5203e3 ¤   // Create recipient element
86d92d ¤   StAEDescriptor¤ recipientSpec;
033456 ¤   DescType¤   ¤   all = kAEAll;
7943df ¤   StAEDescriptor¤ allDesc(typeAbsoluteOrdinal, &all, sizeof(all));
e467c5 ¤
60600d ¤   err = ::CreateObjSpecifier(¤cRecipient,
103d30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   messageSpec,
db08af ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formAbsolutePosition,
d57655 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   allDesc,
2b8fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
4df141 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   recipientSpec);
775e5c ¤   PGPThrowIfOSErr_(err);
e367c5 ¤
8c7b01 ¤   // Create address property
--897d 000eee9623f401200d7 Page 16 of CPGPemailerView.cp
9d7e06 ¤   StAEDescriptor¤ addressSpec;
f79bd1 ¤   StAEDescriptor¤ addressProperty(pAddress);
7d67c5 ¤
56b8e1 ¤   err = ::CreateObjSpecifier(¤cProperty,
39a02e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   recipientSpec,
0d8ed5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
4878a6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   addressProperty,
388fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
41e5a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   addressSpec);
26af5a
5e4199 ¤   // Add the spec to the appleevent and send it
85e8b2 ¤   err = ::AEPutParamDesc(¤&theGetRecipientsEvent,
b7980f ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyDirectObject,
3ddc64 ¤   ¤   ¤   ¤   ¤   ¤   ¤   addressSpec);
565e5c ¤   PGPThrowIfOSErr_(err);
0d67c5 ¤
2d113d ¤   AppleEvent¤ theReply = {typeNull, nil};
ad67c5 ¤
1ff8f5 ¤   UAppleEventsMgr::SendAppleEventWithReply(¤  theGetRecipientsEvent,
1c230a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theReply,
4d3047 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false);¤¤   ¤   ¤   ¤   ¤
19cf96 ¤   ::AEDisposeDesc(&theGetRecipientsEvent);
e767c5 ¤
f4e321 ¤   // Check for errors
feeebf ¤   StAEDescriptor¤ errorCode(theReply, keyErrorNumber);
6b67c5 ¤
8eb229 ¤   if (errorCode.mDesc.descriptorType != typeNull) {
fce246 ¤   ¤   UExtractFromAEDesc::TheInt16(errorCode, err);
911b52 ¤   ¤
b24a74 ¤   ¤   PGPThrowIfOSErr_(err);
9d9371 ¤   }
a867c5 ¤
4f56cc ¤   // Turn the reply into a desc
dc5f67 ¤   StAEDescriptor¤ theRecipientList(theReply, keyDirectObject);
b9af5a
d5f221 ¤   // Count the items
bb3358 ¤   err = ::AECountItems(theRecipientList, outNumRecipients);
3a5e5c ¤   PGPThrowIfOSErr_(err);
9d67c5 ¤
617717 ¤   ::SetHandleSize(¤   outRecipientsH,
d9f816 ¤   ¤   ¤   ¤   ¤   ¤   *outNumRecipients * sizeof(PGPRecipientSpec));
07cf9e ¤   PGPThrowIfMemError_();
fb67c5 ¤
1467c5 ¤
aad8ae ¤   // Get the address out of each one and add it to the recipients
be7470 ¤   StHandleLocker¤ ¤   theLock(outRecipientsH);
54f133 ¤   AEKeyword¤  ¤   ¤   keyWord;
dfac94 ¤   SInt32¤ ¤   ¤   ¤   dataLength;
765091 ¤   PGPRecipientSpec *¤ keySpec = (PGPRecipientSpec *) *outRecipientsH;
0f67c5 ¤
c4374e ¤   pgpClearMemory(*outRecipientsH, ::GetHandleSize(outRecipientsH));
4a4964 ¤   for (SInt32 i = 1; i <= *outNumRecipients; i++) {
54515d ¤   ¤   StAEDescriptor¤ recipient;
6c1b52 ¤   ¤
d86e6b ¤   ¤   err = ::AEGetNthDesc(¤  theRecipientList,
775d2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   i,
7fc52b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeWildCard,
0be6d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyWord,
c7fbd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   recipient);
364a74 ¤   ¤   PGPThrowIfOSErr_(err);
6a1b52 ¤   ¤
c5bcdd ¤   ¤   StAEDescriptor¤ address;
2a3309 ¤   ¤   err = ::AEGetKeyDesc(¤  recipient,
094c7a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pAddress,
59c52b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeWildCard,
1b2393 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   address);
ad4a74 ¤   ¤   PGPThrowIfOSErr_(err);
1faf5a
9db8c8 ¤   ¤   dataLength = ::GetHandleSize(address.mDesc.dataHandle);
3dbbb4 ¤   ¤   if (dataLength > 253) {
5d6a93 ¤   ¤   ¤   dataLength = 253;
ee0fe4 ¤   ¤   }
--fafd 0006b9d02e1401200d7 Page 17 of CPGPemailerView.cp
a4977f ¤   ¤   keySpec[i - 1].type = kPGPRecipientSpecType_UserID;
04503c ¤   ¤   keySpec[i - 1].locked = false;
5107da ¤   ¤   keySpec[i - 1].u.userIDStr[0] = '<';
5d37c8 ¤   ¤   ::BlockMoveData(¤   *(address.mDesc.dataHandle),
1bd684 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keySpec[i - 1].u.userIDStr[1],
a567b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   dataLength);
63c004 ¤   ¤   keySpec[i - 1].u.userIDStr[dataLength + 1] = '>';
78608d ¤   ¤   keySpec[i - 1].u.userIDStr[dataLength + 2] = 0;
f29371 ¤   }
c2af5a
7b16e4 ¤   // Check for missing parms and dispose of the reply
5e7fcd ¤   UAppleEventsMgr::CheckForMissedParams(theReply);
211cbc ¤   ::AEDisposeDesc(&theReply);
c0efe6 }
edaf5a
52af5a
2aaf5a
f4959b ¤   SInt32
295923 CPGPemailerView::CountFrontWindowAttachments()
dbbb36 {
8506b9 ¤   OSErr¤  ¤   err = noErr;
670916 ¤   AppleEvent¤ theCountAttachmentsEvent = {typeNull, nil};
d267c5 ¤
db14ae ¤   // Create the AppleEvent
417110 ¤   UAppleEventsMgr::MakeAppleEvent(¤   kAECoreSuite,
d926bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAECountElements,
e30365 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theCountAttachmentsEvent);
f10230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
72f8a9 ¤   // Create the window specifier
b9736e ¤   StAEDescriptor¤ nullDescriptor;
59d1ba ¤   StAEDescriptor¤ windowSpec;
54cbb1 ¤   DescType¤   ¤   first = kAEFirst;
401900 ¤   StAEDescriptor¤ windowPositionDesc(¤typeAbsoluteOrdinal,
d304db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &first,
6787a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(first));
6667c5 ¤
2c0c08 ¤   err = ::CreateObjSpecifier(¤cWindow,
939085 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nullDescriptor,
c608af ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formAbsolutePosition,
2b10c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowPositionDesc,
918fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
d66de8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec);
175e5c ¤   PGPThrowIfOSErr_(err);
5aaf5a
d39bb4 ¤   // Create message property
72be8f ¤   StAEDescriptor¤ displayedMessageProperty(pDisplayedMessage);
0aa24c ¤   StAEDescriptor¤ messageSpec;
1567c5 ¤
5bb8e1 ¤   err = ::CreateObjSpecifier(¤cProperty,
74c036 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec,
848ed5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
57f0ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   displayedMessageProperty,
d08fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
3b0823 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   messageSpec);
3a5e5c ¤   PGPThrowIfOSErr_(err);
85af5a
b038b2 ¤   // Add the spec to the appleevent
2cb2e1 ¤   err = ::AEPutParamDesc(¤&theCountAttachmentsEvent,
c2980f ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyDirectObject,
6131e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   messageSpec);
f95e5c ¤   PGPThrowIfOSErr_(err);
8467c5 ¤
2c8ecb ¤   // Add enclosure type to the appleevent
948c94 ¤   StAEDescriptor¤ enclosureType((DescType) cFile);
4167c5 ¤
c7b2e1 ¤   err = ::AEPutParamDesc(¤&theCountAttachmentsEvent,
16c36c ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyAEObjectClass,
e31765 ¤   ¤   ¤   ¤   ¤   ¤   ¤   enclosureType);
655e5c ¤   PGPThrowIfOSErr_(err);
0767c5 ¤
ea113d ¤   AppleEvent¤ theReply = {typeNull, nil};
6b67c5 ¤
--ee34 0001b8b89b3401200d7 Page 18 of CPGPemailerView.cp
27ad03 ¤   UAppleEventsMgr::SendAppleEventWithReply(¤  theCountAttachmentsEvent,
f9230a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theReply,
fb3047 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false);¤¤   ¤   ¤   ¤   ¤
77595f ¤   ::AEDisposeDesc(&theCountAttachmentsEvent);
bd67c5 ¤
c8e321 ¤   // Check for errors
23eebf ¤   StAEDescriptor¤ errorCode(theReply, keyErrorNumber);
be67c5 ¤
78b229 ¤   if (errorCode.mDesc.descriptorType != typeNull) {
a1e246 ¤   ¤   UExtractFromAEDesc::TheInt16(errorCode, err);
a01b52 ¤   ¤
8b4a74 ¤   ¤   PGPThrowIfOSErr_(err);
5f9371 ¤   }
b467c5 ¤
50dc45 ¤   // Extract the count
5e8b33 ¤   StAEDescriptor¤ theCountDesc(theReply, keyDirectObject);
7b5dcb ¤   SInt32¤ theCount;
ae67c5 ¤
4b67ae ¤   UExtractFromAEDesc::TheInt32(theCountDesc, theCount);
50af5a
2e16e4 ¤   // Check for missing parms and dispose of the reply
637fcd ¤   UAppleEventsMgr::CheckForMissedParams(theReply);
ee1cbc ¤   ::AEDisposeDesc(&theReply);
c467c5 ¤
c1af69 ¤   return theCount;
14efe6 }
6daf5a
7baf5a
98af5a
0a6d52 ¤   void
096212 CPGPemailerView::GetFrontWindowAttachments(
b0b103 ¤   LArray &¤   outAttachments)
64bb36 {
2a5168 ¤   try {
d2bdef ¤   ¤   OSErr¤  ¤   err = noErr;
8522aa ¤   ¤   AppleEvent¤ theGetAttachmentsEvent = {typeNull, nil};
5b1b52 ¤   ¤
d1aff8 ¤   ¤   // Create the AppleEvent
a37267 ¤   ¤   UAppleEventsMgr::MakeAppleEvent(¤   kAECoreSuite,
4aca58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAEGetData,
74e0d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theGetAttachmentsEvent);
183ede ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
54b95a ¤   ¤   // Create the window specifier
b6b63b ¤   ¤   StAEDescriptor¤ nullDescriptor;
6c5a46 ¤   ¤   StAEDescriptor¤ windowSpec;
a3f75f ¤   ¤   DescType¤   ¤   first = kAEFirst;
e8c329 ¤   ¤   StAEDescriptor¤ windowPositionDesc(¤typeAbsoluteOrdinal,
9c929a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &first,
e608f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(first));
2d1b52 ¤   ¤
b90ab0 ¤   ¤   err = ::CreateObjSpecifier(¤cWindow,
d406c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nullDescriptor,
9a0bd8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formAbsolutePosition,
da456e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowPositionDesc,
2d81a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
d93f75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec);
414a74 ¤   ¤   PGPThrowIfOSErr_(err);
ebaf5a
f717cb ¤   ¤   // Create message property
a934ca ¤   ¤   StAEDescriptor¤ displayedMessageProperty(pDisplayedMessage);
8f9f24 ¤   ¤   StAEDescriptor¤ messageSpec;
711b52 ¤   ¤
d72979 ¤   ¤   err = ::CreateObjSpecifier(¤cProperty,
aed866 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   windowSpec,
261894 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
d812ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   displayedMessageProperty,
eb81a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
90471d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   messageSpec);
a64a74 ¤   ¤   PGPThrowIfOSErr_(err);
5b1b52 ¤   ¤
284c56 ¤   ¤   // Create file element
1b9442 ¤   ¤   StAEDescriptor¤ fileSpec;
--619b 000eaeced4a401200d7 Page 19 of CPGPemailerView.cp
b8db25 ¤   ¤   DescType¤   ¤   all = kAEAll;
7c44a9 ¤   ¤   StAEDescriptor¤ allDesc(typeAbsoluteOrdinal, &all, sizeof(all));
e21b52 ¤   ¤
6a77e6 ¤   ¤   err = ::CreateObjSpecifier(¤cFile,
e86fad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   messageSpec,
a90bd8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formAbsolutePosition,
6970ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   allDesc,
b081a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
442d57 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileSpec);
7f4a74 ¤   ¤   PGPThrowIfOSErr_(err);
761b52 ¤   ¤
002903 ¤   ¤   // Create name property
850326 ¤   ¤   StAEDescriptor¤ nameProperty((DescType) pName);
d1031e ¤   ¤   StAEDescriptor¤ nameSpec;
efaf5a
942979 ¤   ¤   err = ::CreateObjSpecifier(¤cProperty,
286b54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileSpec,
481894 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
b2617f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nameProperty,
b781a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
bab529 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nameSpec);
f64a74 ¤   ¤   PGPThrowIfOSErr_(err);
8eaf5a
31045c ¤   ¤   // Add the spec to the appleevent
86436f ¤   ¤   err = ::AEPutParamDesc(¤&theGetAttachmentsEvent,
a4ca92 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyDirectObject,
8c24b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nameSpec);
904a74 ¤   ¤   PGPThrowIfOSErr_(err);
5e1b52 ¤   ¤
76096d ¤   ¤   AppleEvent¤ theReply = {typeNull, nil};
ba1b52 ¤   ¤
6e01fe ¤   ¤   UAppleEventsMgr::SendAppleEventWithReply(¤  theGetAttachmentsEvent,
36c10a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theReply,
1f490d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false);¤¤   ¤   ¤   ¤   ¤
5d32db ¤   ¤   ::AEDisposeDesc(&theGetAttachmentsEvent);
ac1b52 ¤   ¤
fe1544 ¤   ¤   // Check for errors
20c80a ¤   ¤   StAEDescriptor¤ errorCode(theReply, keyErrorNumber);
2e1b52 ¤   ¤
38b15e ¤   ¤   if (errorCode.mDesc.descriptorType != typeNull) {
a9e131 ¤   ¤   ¤   UExtractFromAEDesc::TheInt16(errorCode, err);
2f87c7 ¤   ¤   ¤
5cc60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
620fe4 ¤   ¤   }
8b1b52 ¤   ¤
f7b9bf ¤   ¤   // Turn the reply into a desc
3c1437 ¤   ¤   StAEDescriptor¤ theAttachmentsList(theReply, keyDirectObject);
e6201f ¤   ¤   SInt32¤ ¤   ¤   numAttachments;
601b52 ¤   ¤
2310c0 ¤   ¤   // Count the items
94ae06 ¤   ¤   err = ::AECountItems(theAttachmentsList, &numAttachments);
4caf5c ¤   ¤   PGPThrowIfOSErr_(err);¤
741b52 ¤   ¤
f9eade ¤   ¤   // Get each of the specs and check to see if it is a detached sig
7e1536 ¤   ¤   AEKeyword¤  keyWord;
aa1b52 ¤   ¤
15d516 ¤   ¤   for (SInt32 i = 1; i <= numAttachments; i++) {
85e8bc ¤   ¤   ¤   StAEDescriptor¤ attachment;
2687c7 ¤   ¤   ¤
00e31f ¤   ¤   ¤   err = ::AEGetNthDesc(¤  theAttachmentsList,
041cdd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   i,
4b7fb3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeChar,
37df10 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyWord,
f562ff ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   attachment);
99c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
7c87c7 ¤   ¤   ¤
56c5cb ¤   ¤   ¤   StHandleLocker¤ theLock(attachment.mDesc.dataHandle);
8e249b ¤   ¤   ¤   Size¤   ¤   ¤   fullPathSize =
8806d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::GetHandleSize(attachment.mDesc.dataHandle);
48504c ¤   ¤   ¤   CString¤¤   ¤   fullPath(¤  *attachment.mDesc.dataHandle,
201c47 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fullPathSize,
ea0f3a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fullPathSize);
--80ac 001dc486af9401200d7 Page 20 of CPGPemailerView.cp
76d1d9 ¤   ¤   ¤   FSSpec¤ ¤   ¤   spec;
0887c7 ¤   ¤   ¤
88d2eb ¤   ¤   ¤   err = ::FSMakeFSSpec(0, 0, fullPath, &spec);
49c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
0487c7 ¤   ¤   ¤
45bbd3 ¤   ¤   ¤   outAttachments.InsertItemsAt(¤  1,
7c24ae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LArray::index_Last,
39530b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &spec);
0a0fe4 ¤   ¤   }
07af5a
9099b3 ¤   ¤   // Check for missing parms and dispose of the reply
ab10fe ¤   ¤   UAppleEventsMgr::CheckForMissedParams(theReply);
769740 ¤   ¤   ::AEDisposeDesc(&theReply);
d59371 ¤   }
a767c5 ¤
1be0a3 ¤   catch (...) {
a79371 ¤   }
ebaf5a
dcefe6 }
59af5a
1eaf5a
ebaf5a
2f6d52 ¤   void
8e82dc CPGPemailerView::ShowError(
2b4f7a ¤   PGPError¤   inErr)
63bb36 {
a76d8e ¤   CString¤¤   theErrorString;
bc67c5 ¤
9ac854 ¤   PGPGetClientErrorString(¤   inErr,
681b40 ¤   ¤   ¤   ¤   ¤   ¤   theErrorString.GetBufferSize() + 1,
9ed94c ¤   ¤   ¤   ¤   ¤   ¤   theErrorString);
1bf5ab ¤   WarningAlert(¤  kWAStopAlertType,
3dd280 ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
aa9f49 ¤   ¤   ¤   ¤   ¤   STRx_Errors,
215ad4 ¤   ¤   ¤   ¤   ¤   kErrorStringID,
f62129 ¤   ¤   ¤   ¤   ¤   CString(inErr),
f8dca1 ¤   ¤   ¤   ¤   ¤   theErrorString);
52efe6 }
05af5a
43af5a
51af5a
c7c744 ¤   PGPError
4cb45e CPGPemailerView::PGPEventHandler(
a4520e ¤   PGPContextRef¤  context,
303981 ¤   PGPEvent *¤ ¤   event,
864c20 ¤   PGPUserValue¤   userValue)
b1bb36 {
076d02 ¤   (void) context;
6767c5 ¤
29f4d6 ¤   CPGPemailerView *¤  theView = (CPGPemailerView *) userValue;
aa7796 ¤   PGPError¤   ¤   ¤   result = kPGPError_NoErr;
2367c5 ¤
15a48f ¤   switch (event->type) {
150c74 ¤   ¤   case kPGPEvent_AnalyzeEvent:
3d5b34 ¤   ¤   {
5ec2f3 ¤   ¤   ¤   if (theView->mEncoding) {
070602 ¤   ¤   ¤   ¤   result = kPGPError_SkipSection;
d7e46e ¤   ¤   ¤   ¤   if (event->data.analyzeData.sectionType
08ec2e ¤   ¤   ¤   ¤   == kPGPAnalyze_Encrypted) {
35fc68 ¤   ¤   ¤   ¤   ¤   theView->mEncrypted = true;
7a2613 ¤   ¤   ¤   ¤   }
f4a3a6 ¤   ¤   ¤   }
a60fe4 ¤   ¤   }
4f2f68 ¤   ¤   break;
319371 ¤   }
4367c5 ¤
d18d15 ¤   AnimateCursor(theView->mCursorRef);
1367c5 ¤
035d73 ¤   return result;
dcefe6 }
--bb61 0007bc4cc78401200d8 Page 1 of CPGPemailerView.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
ae953a ¤   $Id: CPGPemailerView.h,v 1.8.8.1 1998/11/12 03:07:37 heller Exp $
45f7f7 ____________________________________________________________________________*/
f5af5a
0e8d55 #pragma once·
85af5a
bd10f5 #include <LGrafPortView.h>
50f1a9 #include <LListener.h>
46af5a
1cf3ea #include "PGPemailerGlobals.h"
d86ce9 #include "MacCursors.h"
5145d2 #include "CPGPEncoderDecoder.h"
61af5a
aa3ef4 class CPGPemailerView : public LGrafPortView, public LListener {
0d5ed4 public:
a31f25 ¤   enum { class_ID = 'PeVw' };
f0cf86 ¤   static CPGPemailerView *¤   CreateCPGPemailerViewStream(
450087 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LStream *inStream);
2eaf5a
05ac91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPemailerView(LStream* inStream);
e40c3b ¤   virtual¤¤   ¤   ¤   ¤   ¤   ~CPGPemailerView();
4c67c5 ¤
8699b9 ¤   void¤   ¤   ¤   ¤   ¤   ¤   SetGlobals(SGlobalsPtr inGlobalsP);
3d67c5 ¤
d1706b ¤   virtual void¤   ¤   ¤   ¤   ClickInContent(const EventRecord &inMacEvent);
17d55f ¤   virtual void¤   ¤   ¤   ¤   ClickSelf(const SMouseDownEvent &inMouseDown);
049143 ¤   virtual void¤   ¤   ¤   ¤   FindCommandStatus(CommandT inCommand,
77c567 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled,
3fc04f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outUsesMark, Char16 &outMark,
571d67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Str255 outName);
673fcc ¤   virtual Boolean¤¤   ¤   ¤   ObeyCommand(CommandT inCommand,
22a8dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void* ioParam = nil);
ffc66a ¤   virtual Boolean¤¤   ¤   ¤   HandleKeyPress(const EventRecord &inKeyEvent);
e3fe07 ¤   virtual void¤   ¤   ¤   ¤   ListenToMessage(MessageT inMessage,
715c2b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void* ioParam);¤
237026 ¤   virtual void¤   ¤   ¤   ¤   AdjustCursorSelf(Point inPortPt,
e76dd7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord &inMacEvent);
4daf5a
14a2d3 protected:
39fbe1 ¤   SGlobalsPtr¤¤   ¤   ¤   ¤   mGlobalsP;
e07886 ¤   AnimatedCursorRef¤  ¤   ¤   mCursorRef;
befc96 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mEncrypted;
5f920e ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mEncoding;
36af5a
369ea2 ¤   virtual void¤   ¤   ¤   ¤   FinishCreateSelf();
b6c45f ¤   virtual void¤   ¤   ¤   ¤   DrawSelf();
2567c5 ¤
9d6085 ¤   void¤   ¤   ¤   ¤   ¤   ¤   EncodeMessage(EEncodeOptions inOptions);
eb8107 ¤   void¤   ¤   ¤   ¤   ¤   ¤   DecodeMessage();
ba67c5 ¤
8ade8d ¤   void¤   ¤   ¤   ¤   ¤   ¤   GetFrontWindowContent(Handle outContentH);
b1ae4c ¤   void¤   ¤   ¤   ¤   ¤   ¤   SetFrontWindowContent(Handle inContentH);
b4226a ¤   void¤   ¤   ¤   ¤   ¤   ¤   GetFrontWindowSelection(Handle outContentH);
b02b39 ¤   void¤   ¤   ¤   ¤   ¤   ¤   SetFrontWindowSelection(Handle inContentH);
cade31 ¤   void¤   ¤   ¤   ¤   ¤   ¤   GetFrontWindowRecipients(
3e3ba2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * outNumRecipients,
7ba02c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Handle outRecipientsH);
0fae3d ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   CountFrontWindowAttachments();
8ebd44 ¤   void¤   ¤   ¤   ¤   ¤   ¤   GetFrontWindowAttachments(
85d871 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LArray & outAttachments);
1e67c5 ¤
56554b ¤   void¤   ¤   ¤   ¤   ¤   ¤   ShowError(PGPError inErr);
5c67c5 ¤
4e1abf ¤   static PGPError ¤   ¤   ¤   ShowProgress(void * inCursorRef, size_t soFar,
3da0b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   size_t total)
a8ccaa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { (void) soFar; (void) total;
7bdf70 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··AnimateCursor(
--8e1d 001173f20da401200d8 Page 2 of CPGPemailerView.h
3a3dc6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (AnimatedCursorRef) inCursorRef);
fd1115 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··return noErr; }
4fed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
e3fa41 ¤   static OSStatus¤¤   ¤   ¤   SharedShowProgress(UInt32 bytesProcessed,
29b056 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 totalBytesToProcess,
f5594c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void * inCursorRef)
338e1d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { (void) bytesProcessed;
6689f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··(void) totalBytesToProcess;
83b043 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··AnimateCursor(
7a3dc6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (AnimatedCursorRef) inCursorRef);
8a1262 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··return noErr; }
0b0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
74e681 ¤   static PGPError¤¤   ¤   ¤   PGPEventHandler(PGPContextRef context,
dfdb0f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event,
ca3009 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue userValue);
1782f7 };
--819f 0016a208059401200d9 Page 1 of CemailerCloseWindowPatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
6ab5ea ¤   $Id: CemailerCloseWindowPatch.cp,v 1.3.8.1 1998/11/12 03:07:38 heller Exp $
55f7f7 ____________________________________________________________________________*/
f7af5a
af7e6d #include <UDrawingState.h>
0610f5 #include <LGrafPortView.h>
67af5a
fdaa64 #include "StSaveCurResFile.h"
b9aa11 #include "CemailerCloseWindowPatch.h"
c8af5a
c2af5a
89af5a
69a069 CemailerCloseWindowPatch::CemailerCloseWindowPatch(
5bae73 ¤   SGlobals &¤ inGlobals)
c1c13e ¤   ¤   : mGlobals(inGlobals)
e7bb36 {
b0efe6 }
5baf5a
86af5a
08af5a
61a5c1 CemailerCloseWindowPatch::~CemailerCloseWindowPatch()
8fbb36 {
0befe6 }
66af5a
e8af5a
6aaf5a
686d52 ¤   void
9335ab CemailerCloseWindowPatch::NewCloseWindow(
f6f699 ¤   WindowRef¤  ¤   ¤   theWindow)
efbb36 {
955168 ¤   try {
866eb1 ¤   ¤   ArrayIndexT¤theIndex = mGlobals.windowRefArray.FetchIndexOfWindowRef(
48c785 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theWindow);
aeaf5a
85a75d ¤   ¤   // Remove the SwindowRef
a039ae ¤   ¤   if (theIndex != LArray::index_Bad) {
4ddde9 ¤   ¤   ¤   StSaveCurResFile¤   saveResFile;¤
7cb40c ¤   ¤   ¤   StColorPortState¤   savePortState(theWindow);
52bacb ¤   ¤   ¤   SWindowRef¤ ¤   ¤   theItem;
caaf5a
71ea15 ¤   ¤   ¤   if (mGlobals.windowRefArray.FetchSWindowRefAt(
9c5210 ¤   ¤   ¤   theIndex, theItem)) {
3fe3d9 ¤   ¤   ¤   ¤   delete theItem.grafPortView;
eb2b85 ¤   ¤   ¤   ¤
42de27 ¤   ¤   ¤   ¤   mGlobals.windowRefArray.RemoveSWindowRefAt(theIndex);
e1a3a6 ¤   ¤   ¤   }
f80fe4 ¤   ¤   }
f9af5a
e59371 ¤   }
c967c5 ¤
38e0a3 ¤   catch (...) {
569371 ¤   }
6467c5 ¤
fe94d4 ¤   OldCloseWindow(theWindow);
6cefe6 }
1faf5a
90af5a
6aaf5a
--e858 001f058b887401200da Page 1 of CemailerCloseWindowPatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
e99826 ¤   $Id: CemailerCloseWindowPatch.h,v 1.2.20.1 1998/11/12 03:07:39 heller Exp $
e9f7f7 ____________________________________________________________________________*/
eaaf5a
dd8d55 #pragma once·
2baf5a
b5805d #include "CCloseWindowPatcher.h"
c1f3ea #include "PGPemailerGlobals.h"
03af5a
be5c80 class CemailerCloseWindowPatch¤ :¤  public¤ CCloseWindowPatcher {
685ed4 public:
501bf5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CemailerCloseWindowPatch(
a147a3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SGlobals & inGlobals);
fa1aba ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CemailerCloseWindowPatch();
a7af5a
95a2d3 protected:
287bc9 ¤   SGlobals &¤ ¤   ¤   ¤   ¤   mGlobals;
2a67c5 ¤
1fe848 ¤   virtual void¤   ¤   ¤   ¤   NewCloseWindow(WindowRef theWindow);
f082f7 };
--0571 001b32bb94f401200db Page 1 of CemailerEndUpdatePatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
2ac229 ¤   $Id: CemailerEndUpdatePatch.cp,v 1.3.8.1 1998/11/12 03:07:39 heller Exp $
29f7f7 ____________________________________________________________________________*/
cfaf5a
7b7e6d #include <UDrawingState.h>
df10f5 #include <LGrafPortView.h>
e3af5a
2eaa64 #include "StSaveCurResFile.h"
d9dfeb #include "CemailerEndUpdatePatch.h"
d9af5a
bcaf5a
71af5a
922051 CemailerEndUpdatePatch::CemailerEndUpdatePatch(
bfae73 ¤   SGlobals &¤ inGlobals)
f5c13e ¤   ¤   : mGlobals(inGlobals)
cdbb36 {
ddefe6 }
7caf5a
79af5a
64af5a
c0f9da CemailerEndUpdatePatch::~CemailerEndUpdatePatch()
83bb36 {
d5efe6 }
9daf5a
88af5a
3aaf5a
5a6d52 ¤   void
def2ee CemailerEndUpdatePatch::NewEndUpdate(
8bf699 ¤   WindowRef¤  ¤   ¤   theWindow)
01bb36 {
5f5168 ¤   try {
476eb1 ¤   ¤   ArrayIndexT¤theIndex = mGlobals.windowRefArray.FetchIndexOfWindowRef(
1cc785 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theWindow);
5eaf5a
0ce87e ¤   ¤   // Redraw the GrafPortView
3139ae ¤   ¤   if (theIndex != LArray::index_Bad) {
b1dde9 ¤   ¤   ¤   StSaveCurResFile¤   saveResFile;¤
41b40c ¤   ¤   ¤   StColorPortState¤   savePortState(theWindow);
9cbacb ¤   ¤   ¤   SWindowRef¤ ¤   ¤   theItem;
c1af5a
7aea15 ¤   ¤   ¤   if (mGlobals.windowRefArray.FetchSWindowRefAt(
255210 ¤   ¤   ¤   theIndex, theItem)) {
669236 ¤   ¤   ¤   ¤   LFile¤  thePlugFile(mGlobals.plugSpec);
6a2b85 ¤   ¤   ¤   ¤
6ee242 ¤   ¤   ¤   ¤   thePlugFile.OpenResourceFork(fsRdPerm);
59d5fe ¤   ¤   ¤   ¤   theItem.grafPortView->Draw(nil);
f16f70 ¤   ¤   ¤   ¤   thePlugFile.CloseResourceFork();
0ea3a6 ¤   ¤   ¤   }
df0fe4 ¤   ¤   }
64af5a
e79371 ¤   }
d567c5 ¤
43e0a3 ¤   catch (...) {
ff9371 ¤   }
6667c5 ¤
be561d ¤   OldEndUpdate(theWindow);
b1efe6 }
71af5a
4daf5a
b3af5a
--2dc6 00140bc50d2401200dc Page 1 of CemailerEndUpdatePatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
9b0cd4 ¤   $Id: CemailerEndUpdatePatch.h,v 1.2.20.1 1998/11/12 03:07:40 heller Exp $
eaf7f7 ____________________________________________________________________________*/
27af5a
808d55 #pragma once·
55af5a
257693 #include "CEndUpdatePatcher.h"
64f3ea #include "PGPemailerGlobals.h"
5eaf5a
195487 class CemailerEndUpdatePatch¤   :¤  public¤ CEndUpdatePatcher {
785ed4 public:
b08b9b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CemailerEndUpdatePatch(
4147a3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SGlobals & inGlobals);
7a289e ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CemailerEndUpdatePatch();
b0af5a
a7a2d3 protected:
3e7bc9 ¤   SGlobals &¤ ¤   ¤   ¤   ¤   mGlobals;
4467c5 ¤
b04590 ¤   virtual void¤   ¤   ¤   ¤   NewEndUpdate(WindowRef theWindow);
4082f7 };
--1942 0009b6edd7a401200dd Page 1 of CemailerSetWTitlePatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
67d760 ¤   $Id: CemailerSetWTitlePatch.cp,v 1.5.8.1 1998/11/12 03:07:41 heller Exp $
abf7f7 ____________________________________________________________________________*/
ddaf5a
c7324c #include <string.h>
47af5a
8917f9 #include <UReanimator.h>
507e6d #include <UDrawingState.h>
91af5a
a8aa64 #include "StSaveCurResFile.h"
5274ea #include "CPGPemailerView.h"
fd9ac2 #include "CemailerSetWTitlePatch.h"
66af5a
8caf5a
8caf5a
6ee738 // Constants
8641e5 const ResIDT¤   STRx_OutgoingMessage¤   =¤  1025;
c9cfdd const SInt16¤   kOutgoingMessageID¤ ¤   =¤  12;
12af5a
892ffa const ResIDT¤   STRx_IncomingMessage¤   =¤  2200;
6a5ebe const SInt16¤   kIncomingMessageID¤ ¤   =¤  1;
8eaf5a
842f80 const SInt16¤   PPob_OutgoingMessages¤  =¤  1000;
4f57dc const SInt16¤   PPob_IncomingMessages¤  =¤  2000;
1baf5a
7caf5a
93ae10 CemailerSetWTitlePatch::CemailerSetWTitlePatch(
90ae73 ¤   SGlobals &¤ inGlobals)
dbc13e ¤   ¤   : mGlobals(inGlobals)
e6bb36 {
a2215c ¤   StSaveCurResFile¤   switchToApp(mGlobals.appResForkRef);
9b67c5 ¤
500f5d ¤   ::GetIndString(¤mOutgoingMessageString,
e80506 ¤   ¤   ¤   ¤   ¤   STRx_OutgoingMessage,
1f6f75 ¤   ¤   ¤   ¤   ¤   kOutgoingMessageID);
90794b ¤   ::GetIndString(¤mIncomingMessageString,
51b853 ¤   ¤   ¤   ¤   ¤   STRx_IncomingMessage,
0d5f3d ¤   ¤   ¤   ¤   ¤   kIncomingMessageID);
61efe6 }
23af5a
10af5a
c1af5a
0f9b0c CemailerSetWTitlePatch::~CemailerSetWTitlePatch()
50bb36 {
2cefe6 }
9467c5 ¤
69af5a
65af5a
766d52 ¤   void
1770e8 CemailerSetWTitlePatch::NewSetWTitle(
8a8821 ¤   WindowRef¤  ¤   ¤   theWindow,
7588bb ¤   ConstStr255Param¤   title)
b8bb36 {
e05168 ¤   try {
80ad53 ¤   ¤   SInt16¤ thePPob¤=¤  0;
2367c5 ¤
9f013f ¤   ¤   // Check to see if the window needs to be captured
2be39a ¤   ¤   if (mGlobals.windowRefArray.FetchIndexOfWindowRef(theWindow)
3e5c12 ¤   ¤   == LArray::index_Bad) {
77b165 ¤   ¤   ¤   if (memcmp(&title[1], &mOutgoingMessageString[1],
7893bf ¤   ¤   ¤   mOutgoingMessageString[0]) == 0) {
cf754e ¤   ¤   ¤   ¤   thePPob = PPob_OutgoingMessages;
128db5 ¤   ¤   ¤   } else if (memcmp(&title[1], &mIncomingMessageString[1],
ebd0c3 ¤   ¤   ¤   mIncomingMessageString[0]) == 0) {
f970db ¤   ¤   ¤   ¤   thePPob = PPob_IncomingMessages;
47a3a6 ¤   ¤   ¤   }
9b0fe4 ¤   ¤   }
--0881 0011c066f10401200dd Page 2 of CemailerSetWTitlePatch.cp
f11b52 ¤   ¤
eab163 ¤   ¤   // Capture the window
1d394d ¤   ¤   if (thePPob != 0) {
7cb40c ¤   ¤   ¤   StColorPortState¤   savePortState(theWindow);
9f49f6 ¤   ¤   ¤   StSaveCurResFile¤   saveCurResFile();
c84e55 ¤   ¤   ¤   SWindowRef¤ ¤   ¤   theItem = {theWindow, nil};
3c8cb6 ¤   ¤   ¤   LFile¤  ¤   ¤   ¤   thePlug(mGlobals.plugSpec);
b887c7 ¤   ¤   ¤
9fb41a ¤   ¤   ¤   // Create the view
b2218b ¤   ¤   ¤   LPane::SetDefaultView(nil);
862f73 ¤   ¤   ¤   LView::OutOfFocus(nil);
b65aad ¤   ¤   ¤   thePlug.OpenResourceFork(fsRdPerm);
0c4ea0 ¤   ¤   ¤   theItem.grafPortView = dynamic_cast<LGrafPortView *>
edbc22 ¤   ¤   ¤   ¤   ¤   (LGrafPortView::CreateGrafPortView(¤thePPob,
d95335 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil));
e9876a ¤   ¤   ¤   PGPThrowIfNil_(theItem.grafPortView);
2558a5 ¤   ¤   ¤   UReanimator::LinkListenerToControls(
61da68 ¤   ¤   ¤   ¤   ¤   ¤   dynamic_cast<CPGPemailerView *>(theItem.grafPortView),
c9f572 ¤   ¤   ¤   ¤   ¤   ¤   theItem.grafPortView,
ffe472 ¤   ¤   ¤   ¤   ¤   ¤   thePPob);
624825 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
8641cd ¤   ¤   ¤   dynamic_cast<CPGPemailerView *>(theItem.grafPortView)->SetGlobals(
5fc85c ¤   ¤   ¤   ¤   &mGlobals);
dcef91 ¤   ¤   ¤   thePlug.CloseResourceFork();
6587c7 ¤   ¤   ¤
1e8f0d ¤   ¤   ¤   // Deactivate view if we are not the front app
c0897a ¤   ¤   ¤   ProcessSerialNumber¤theFrontProcess = {0, 0};
e14d32 ¤   ¤   ¤   ProcessSerialNumber¤theCurrentProcess = {0, 0};
6869df ¤   ¤   ¤   Boolean¤¤   ¤   ¤   sameProcess;
d587c7 ¤   ¤   ¤
2714d7 ¤   ¤   ¤   ::GetFrontProcess(&theFrontProcess);
81e1e8 ¤   ¤   ¤   ::GetCurrentProcess(&theCurrentProcess);
e9444c ¤   ¤   ¤   ::SameProcess(¤ &theFrontProcess,
3bcd8f ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theCurrentProcess,
6eb5f7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &sameProcess);
56cd25 ¤   ¤   ¤   if (!sameProcess) {
ea12e0 ¤   ¤   ¤   ¤   theItem.grafPortView->Deactivate();
2fa3a6 ¤   ¤   ¤   }
2caf5a
ecaf5a
8324e5 ¤   ¤   ¤   // Add the window to the windowrefarray
3595cb ¤   ¤   ¤   mGlobals.windowRefArray.InsertSWindowRef(theItem);
080fe4 ¤   ¤   }
c79371 ¤   }
7667c5 ¤
cae0a3 ¤   catch (...) {
e39371 ¤   }
0567c5 ¤
be04ae ¤   OldSetWTitle(theWindow, title);
1cefe6 }
--59e3 0013e278f77401200de Page 1 of CemailerSetWTitlePatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
2104f3 ¤   $Id: CemailerSetWTitlePatch.h,v 1.2.20.1 1998/11/12 03:07:41 heller Exp $
def7f7 ____________________________________________________________________________*/
02af5a
fa8d55 #pragma once·
f7af5a
929711 #include "CSetWTitlePatcher.h"
60f3ea #include "PGPemailerGlobals.h"
d5af5a
c2a709 class CemailerSetWTitlePatch¤   :¤  public¤ CSetWTitlePatcher {
705ed4 public:
1db656 ¤   ¤   ¤   ¤   ¤   ¤   CemailerSetWTitlePatch(SGlobals & inGlobals);
49805c ¤   virtual¤¤   ¤   ¤   ~CemailerSetWTitlePatch();
6967c5 ¤
dea2d3 protected:
319341 ¤   SGlobals &¤ ¤   ¤   mGlobals;
448ee8 ¤   Str255¤ ¤   ¤   ¤   mOutgoingMessageString;
c0f8fe ¤   Str255¤ ¤   ¤   ¤   mIncomingMessageString;
c967c5 ¤
51d8a3 ¤   virtual void¤   ¤   NewSetWTitle(WindowRef theWindow,
8f6210 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param title);
3e82f7 };
--ad1d 00140f2595d401200df Page 1 of CemailerSizeWindowPatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
f17d17 ¤   $Id: CemailerSizeWindowPatch.cp,v 1.3.8.1 1998/11/12 03:07:42 heller Exp $
c7f7f7 ____________________________________________________________________________*/
beaf5a
bd7e6d #include <UDrawingState.h>
8610f5 #include <LGrafPortView.h>
19af5a
adaa64 #include "StSaveCurResFile.h"
8e68b1 #include "CemailerSizeWindowPatch.h"
e8af5a
41af5a
7daf5a
58faa9 CemailerSizeWindowPatch::CemailerSizeWindowPatch(
7eae73 ¤   SGlobals &¤ inGlobals)
90c13e ¤   ¤   : mGlobals(inGlobals)
44bb36 {
e9efe6 }
e8af5a
b5af5a
79af5a
b34762 CemailerSizeWindowPatch::~CemailerSizeWindowPatch()
7dbb36 {
f3efe6 }
8faf5a
23af5a
29af5a
dd6d52 ¤   void
e1dc8e CemailerSizeWindowPatch::NewSizeWindow(
2448cf ¤   WindowRef¤  theWindow,
a5f95f ¤   short¤  ¤   w,
5b360d ¤   short¤  ¤   h,
5b2768 ¤   Boolean¤¤   fUpdate)
08bb36 {
76b818 ¤   OldSizeWindow(theWindow, w, h, fUpdate);
67af5a
335168 ¤   try {
a56eb1 ¤   ¤   ArrayIndexT¤theIndex = mGlobals.windowRefArray.FetchIndexOfWindowRef(
6dc785 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theWindow);
76af5a
8ca75d ¤   ¤   // Remove the SwindowRef
4939ae ¤   ¤   if (theIndex != LArray::index_Bad) {
64dde9 ¤   ¤   ¤   StSaveCurResFile¤   saveResFile;¤
6eb40c ¤   ¤   ¤   StColorPortState¤   savePortState(theWindow);
aabacb ¤   ¤   ¤   SWindowRef¤ ¤   ¤   theItem;
e4af5a
61ea15 ¤   ¤   ¤   if (mGlobals.windowRefArray.FetchSWindowRefAt(
1b5210 ¤   ¤   ¤   theIndex, theItem)) {
407244 ¤   ¤   ¤   ¤   theItem.grafPortView->ResizeFrameTo(¤   w,
84177b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   h,
f20499 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true);
dbaf5a
5e9295 ¤   ¤   ¤   ¤   theItem.grafPortView->ResizeImageTo(¤   w,
96177b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   h,
701d69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false);
3ba3a6 ¤   ¤   ¤   }
250fe4 ¤   ¤   }
02af5a
d29371 ¤   }
9d67c5 ¤
88e0a3 ¤   catch (...) {
c99371 ¤   }
d1efe6 }
50af5a
2daf5a
40af5a
--e60d 001f0d86e0a401200e0 Page 1 of CemailerSizeWindowPatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
7250db ¤   $Id: CemailerSizeWindowPatch.h,v 1.2.20.1 1998/11/12 03:07:43 heller Exp $
7bf7f7 ____________________________________________________________________________*/
a3af5a
7d8d55 #pragma once·
67af5a
1b9f07 #include "CSizeWindowPatcher.h"
a9f3ea #include "PGPemailerGlobals.h"
05af5a
6be80f class CemailerSizeWindowPatch¤  :¤  public¤ CSizeWindowPatcher {
935ed4 public:
31e593 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CemailerSizeWindowPatch(SGlobals & inGlobals);
7c8e79 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ~CemailerSizeWindowPatch();
2aaf5a
6ca2d3 protected:
fa7bc9 ¤   SGlobals &¤ ¤   ¤   ¤   ¤   mGlobals;
fb67c5 ¤
bbd126 ¤   virtual void¤   ¤   ¤   ¤   NewSizeWindow(WindowRef theWindow, short w,
9322e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short h, Boolean fUpdate);
f082f7 };
--36be 0002d271f8f401200e1 Page 1 of CemailerWaitNextEventPatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
305198 ¤   $Id: CemailerWaitNextEventPatch.cp,v 1.3.8.1 1998/11/12 03:07:43 heller Exp¶
e3ed4e ·$
0bf7f7 ____________________________________________________________________________*/
28af5a
35a85e #include <LArrayIterator.h>
1510f5 #include <LGrafPortView.h>
d6740c #include <UAppleEventsMgr.h>
087e6d #include <UDrawingState.h>
43af5a
abaa64 #include "StSaveCurResFile.h"
7eb0b3 #include "CemailerWaitNextEventPatch.h"
d6af5a
e4af5a
f9af5a
7b96f5 CemailerWaitNextEventPatch::CemailerWaitNextEventPatch(
83ae73 ¤   SGlobals &¤ inGlobals)
dacace ¤   ¤   : mGlobals(inGlobals), mInitialized(false)
6abb36 {
e4efe6 }
29af5a
93af5a
f0af5a
3a9975 CemailerWaitNextEventPatch::~CemailerWaitNextEventPatch()
7fbb36 {
35efe6 }
3867c5 ¤
d7af5a
64af5a
326d52 ¤   void
e25f5c CemailerWaitNextEventPatch::DispatchEvent()
13bb36 {
cdced4 ¤   // Do initialization that depends upon the app being set up
3b0f35 ¤   if (! mInitialized) {
debab6 ¤   ¤   InitializePlug();
cd9371 ¤   }
7b67c5 ¤
78adbc ¤   // Iterate through the window list activating and deactivating
9b6202 ¤   // GrafPortViews appropriately
4cb99d ¤   SWindowRef¤ ¤   theItem;
843029 ¤   LArrayIterator¤ iterator(mGlobals.windowRefArray);
9567c5 ¤
e02730 ¤   while (iterator.Next(&theItem)) {
728980 ¤   ¤   if (IsWindowHilited(theItem.windowRef)) {
d08288 ¤   ¤   ¤   theItem.grafPortView->Activate();
7245a6 ¤   ¤   } else {
7d84a1 ¤   ¤   ¤   theItem.grafPortView->Deactivate();
920fe4 ¤   ¤   }
5d9371 ¤   }
2aaf5a
d48ba2 ¤   // Call inherited
ef727a ¤   CWaitNextEventDispatcher::DispatchEvent();
9eefe6 }
78af5a
52af5a
8baf5a
2f6d52 ¤   void
18d078 CemailerWaitNextEventPatch::InitializePlug()
edbb36 {
fa9f12 ¤   // Initialize AppleEvents
763060 ¤   UAppleEventsMgr::Initialize();¤ ¤   ¤
64af5a
b117e9 ¤   mInitialized = true;
6fefe6 }
9faf5a
25af5a
2daf5a
--1209 001ff5caf05401200e1 Page 2 of CemailerWaitNextEventPatch.cp
3b6d52 ¤   void
b968a0 CemailerWaitNextEventPatch::HandleMouseDown()
49bb36 {
0d9056 ¤   WindowRef¤  theWindow;
a42424 ¤   ArrayIndexT¤theIndex;
de67c5 ¤
01a224 ¤   // Find the window
ebd4be ¤   ::FindWindow(¤  sEventParams.theEvent->where,
9b6250 ¤   ¤   ¤   ¤   ¤   &theWindow);
59ec70 ¤   theIndex = mGlobals.windowRefArray.FetchIndexOfWindowRef(theWindow);
e13f16 ¤   if (theIndex != LArray::index_Bad) {
e676ad ¤   ¤   StSaveCurResFile¤   saveResFile;
22b77b ¤   ¤   StColorPortState¤   savePortState(theWindow);
a4bf26 ¤   ¤   SWindowRef¤ ¤   ¤   theItem;
b61b52 ¤   ¤
5026ea ¤   ¤   if (mGlobals.windowRefArray.FetchSWindowRefAt(theIndex, theItem)) {
18c79a ¤   ¤   ¤   LFile¤  thePlugFile(mGlobals.plugSpec);
f687c7 ¤   ¤   ¤
dab7ee ¤   ¤   ¤   thePlugFile.OpenResourceFork(fsRdPerm);
5ef02b ¤   ¤   ¤   theItem.grafPortView->ClickInContent(*sEventParams.theEvent);
903ded ¤   ¤   ¤   thePlugFile.CloseResourceFork();
e70fe4 ¤   ¤   }
769371 ¤   }
ffefe6 }
--d75d 001532c81df401200e2 Page 1 of CemailerWaitNextEventPatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
f3f119 ¤   $Id: CemailerWaitNextEventPatch.h,v 1.2.20.1 1998/11/12 03:07:44 heller Exp¶
13ed4e ·$
29f7f7 ____________________________________________________________________________*/
0baf5a
228d55 #pragma once·
bdaf5a
b6dcba #include "CWaitNextEventDispatcher.h"
e4f3ea #include "PGPemailerGlobals.h"
08af5a
983fc2 class CemailerWaitNextEventPatch : public CWaitNextEventDispatcher {
9a5ed4 public:
08d0c2 ¤   ¤   ¤   ¤   ¤   CemailerWaitNextEventPatch(SGlobals & inGlobals);
aec2e3 ¤   virtual¤¤   ¤   ~CemailerWaitNextEventPatch();
7167c5 ¤
f7a2d3 protected:
2bcd85 ¤   Boolean¤¤   ¤   mInitialized;
192d60 ¤   SGlobals &¤ ¤   mGlobals;
7567c5 ¤
0d6b86 ¤   void¤   ¤   ¤   InitializePlug();
7167c5 ¤
f0680c ¤   virtual void¤   DispatchEvent();
2faf5a
6cb6e0 ¤   virtual void¤   HandleMouseDown();
5382f7 };
--0493 0009b3a51ce401200e3 Page 1 of CPGPemailer.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
52243b ¤   $Id: CPGPemailer.cp,v 1.17.8.1 1998/11/12 03:07:45 heller Exp $
22f7f7 ____________________________________________________________________________*/
67af5a
94324c #include <string.h>
cdaf5a
629548 #include "plugin.h"
45af5a
09cc5c #include <UMemoryMgr.h>
c87e6d #include <UDrawingState.h>
5f4b3b #include <UEnvironment.h>
817c99 #include <URegistrar.h>
8e53c0 #include <LButton.h>
e52c73 #include <LView.h>
74af5a
9a9ff9 #include "BETA.h"
e994a0 #include "pgpLeaks.h"
d20d08 #include "pgpMem.h"
2cea7e #include "PGPUtilities.h"
1f10f0 #include "pgpOpenPrefs.h"
1ef5d2 #include "pgpMacCustomContextAlloc.h"
3e91b9 #include "pgpSDKPrefs.h"
ed04f5 #include "pgpFeatures.h"
e9af5a
d8bbf4 #include "MacFiles.h"
67af5a
5f0e06 #include "UPGPException.h"
e3aa64 #include "StSaveCurResFile.h"
8268b1 #include "CemailerSizeWindowPatch.h"
54aa11 #include "CemailerCloseWindowPatch.h"
86b0b3 #include "CemailerWaitNextEventPatch.h"
88dfeb #include "CemailerEndUpdatePatch.h"
9b9ac2 #include "CemailerSetWTitlePatch.h"
b674ea #include "CPGPemailerView.h"
7bd9f0 #include "CPGPemailer.h"
6caf5a
621c5d #ifdef powerc
de40d3 // Define our entry point
0d505e ProcInfoType __procinfo = uppPlugInMainProcInfo;
087454 #endif
b7af5a
4ed8b3 // Define the beta string
239838 #if BETA
77b0b6 ConstStringPtr¤ ¤   kBetaHasExpired¤=¤  "\pThis beta version of PGPemailer"
01eceb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " has expired and will now only"
aa90c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " decrypt and verify. Please contact"
ca116d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " the beta site or beta test"
5d6f1d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " coordinator for the latest"
d12829 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " version.";
3d7454 #endif
bfaf5a
5f93f7 // Define the demo string
abd673 #if PGP_DEMO
164584 ConstStringPtr¤ ¤   kDemoHasExpired = ¤ "\pThank you for evaluating PGP. Your"
fd3ad3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " 30 day evaluation copy has expired."
99ae11 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " You may continue to decrypt and"
ed6ce4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " verify messages for another 30"
86b020 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " days.";
d77454 #endif
5caf5a
91b932 // Globals
c97348 static UniversalProcPtr¤¤   sOldExitToShell =¤  nil;
e23a5d static CPGPemailerPlug *¤   sPlugin¤¤   ¤   =¤  nil;
0d4f6b static PGPContextRef¤   ¤   sPGPContext¤¤   =¤  kInvalidPGPContextRef;
59af5a
fdaf5a
9baa1a // Termination routine declarations
--151c 000b4df6b6f401200e3 Page 2 of CPGPemailer.cp
f03379 #ifdef __cplusplus
ebd83c ¤   extern "C" {
db7454 #endif
f9a80b ¤   void __terminate(void);
1b3379 #ifdef __cplusplus
879371 ¤   }
be7454 #endif
3caf5a
99af5a
676685 ¤   pascal void
933efa MyExitToShell()
29bb36 {
67d4bf ¤   delete sPlugin;
914a4b ¤   __terminate();
2fa3a3 ¤   if (PGPContextRefIsValid(sPGPContext)) {
057beb ¤   ¤   PGPFreeContext(sPGPContext);
719371 ¤   }
699ca1 ¤   ::CallUniversalProc(¤   sOldExitToShell,
3ff731 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kUPPExitToShellProcInfo);
7aefe6 }
33af5a
0daf5a
0faf5a
6a959b ¤   SInt32
038fb3 main (
095f6b ¤   ProcessInfoRec *¤   inProcInfoPtr,
24194f ¤   FSSpec *¤   ¤   ¤   inFSSpecPtr)
9abb36 {
3c759d ¤   // Set debug info
9fd9a6 ¤   SetDebugThrow_(debugAction_LowLevelDebugger);
828e09 ¤   SetDebugSignal_(debugAction_LowLevelDebugger);
8d67c5 ¤
789fe4 ¤   // Leaks stuff init
ff2885 //¤ pgpLeaksBeginSession("main");
99af5a
525168 ¤   try {
e7018a ¤   ¤   PGPError¤   pgpErr;
b01b52 ¤   ¤
e0d314 ¤   ¤   pgpErr = pgpNewContextCustomMacAllocators( &sPGPContext );
8cc0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
998d72 ¤   ¤   PGPsdkLoadDefaultPrefs(sPGPContext);
4baf5a
b2af5a
f1740e ¤   ¤   // Create our plug object
ded48d ¤   ¤   sPlugin = new CPGPemailerPlug(inProcInfoPtr, inFSSpecPtr);
37af5a
9e5a8a ¤   ¤   // Patch ExitToShell so that we properly unload our fragment
70849e ¤   ¤   UniversalProcPtr¤   newExitToShellUPP;
8caf5a
6c1e0f ¤   ¤   sOldExitToShell = ::GetToolTrapAddress(_ExitToShell);
2225e7 ¤   ¤   newExitToShellUPP = (UniversalProcPtr) :: NewRoutineDescriptor(
acadf3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (ProcPtr) MyExitToShell,
73630e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kUPPExitToShellProcInfo,
0757f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetCurrentArchitecture());
acb18a ¤   ¤   if ((newExitToShellUPP == nil)
793960 ¤   ¤   || (newExitToShellUPP == (UniversalProcPtr) MyExitToShell)) {
3cb08a ¤   ¤   ¤   PGPThrowOSErr_(kUnknownErr);
c50fe4 ¤   ¤   }
d2dd72 ¤   ¤   ::SetToolTrapAddress(¤  (UniversalProcPtr) newExitToShellUPP,
212a5c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   _ExitToShell);
4967c5 ¤
8f9371 ¤   }
fa67c5 ¤
a4ca6f ¤   catch (CComboError & comboError) {
3e330a ¤   ¤   return kUnloadPlug;
959371 ¤   }
8167c5 ¤
ade0a3 ¤   catch (...) {
6eb326 ¤   ¤   return kUnknownErr;
cb9371 ¤   }
5467c5 ¤
b4a3a6 ¤   return kNoErr;
--8cea 000a5f50be4401200e3 Page 3 of CPGPemailer.cp
7aefe6 }
46af5a
8eaf5a
79af5a
9942e1 CPGPemailerPlug::CPGPemailerPlug(
cfd09f ¤   ProcessInfoRec *¤   inProcInfoPtr,¤ // Proc info for captured browser
4dc5b4 ¤   FSSpec *¤   ¤   ¤   inFSSpecPtr)¤   // FSSpec for this plugin
1ebb36 {
56f61b ¤   OSStatus¤   ¤   err = kNoErr;
c56904 ¤   PGPFlags¤   ¤   featureFlags;
1aaf5a
b3b788 ¤   if (IsntPGPError(PGPGetFeatureFlags(kPGPFeatures_GeneralSelector,
ccd7da ¤   &featureFlags))) {
26a3dd ¤   ¤   mGlobals.disableEncrypt = ! PGPFeatureExists(
8b9c54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   featureFlags,
806b19 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPFeatureMask_CanEncrypt);
87b28e ¤   ¤   mGlobals.disableSign = ! PGPFeatureExists(
243255 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   featureFlags,
2d414b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPFeatureMask_CanSign);
947193 ¤   ¤   mGlobals.disableDecrypt = ! PGPFeatureExists(
4d9c54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   featureFlags,
a7eef3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPFeatureMask_CanDecrypt);
e0ccad ¤   ¤   mGlobals.disableVerify = ! PGPFeatureExists(
aa9c54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   featureFlags,
e549fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPFeatureMask_CanVerify);
b3f037 ¤   } else {
d887db ¤   ¤   mGlobals.disableEncrypt = false;
364698 ¤   ¤   mGlobals.disableSign = false;
595d31 ¤   ¤   mGlobals.disableDecrypt = false;
fe4838 ¤   ¤   mGlobals.disableVerify = false;
5b4032 ¤   }¤  ¤
ab67c5 ¤
0f386a // Handle beta code
6166f0 #if BETA || PGP_DEMO
2b9838 #if BETA
efd7d8 ¤   if (BetaExpired()) {
5c282a ¤   ¤   ConstStringPtr¤ theString = kBetaHasExpired;
207454 #endif
f1af5a
c9d673 #if PGP_DEMO
29a902 ¤   PGPDemoState¤   theState = GetDemoState();
1867c5 ¤
33da99 ¤   if (theState == kDemoStateExpired) {
245e89 ¤   ¤   PGPThrowOSErr_(kUnloadPlug);
d8632b ¤   } else if (theState == kDemoStateEncryptionSigningDisabled) {
27521a ¤   ¤   ConstStringPtr theString = kDemoHasExpired;
ba7454 #endif
83af5a
ad02eb ¤   ¤   StringPtr¤  noteString = (StringPtr) ::NewPtr(theString[0] + 1);
bf961f ¤   ¤   NMRecPtr¤   theNotificationRecP =
e2df24 ¤   ¤   ¤   ¤   ¤   ¤   (NMRecPtr) ::NewPtrClear(sizeof(NMRec));
821b52 ¤   ¤
a2bb6f ¤   ¤   if ((noteString != nil) && (theNotificationRecP != nil)) {
00ddc5 ¤   ¤   ¤   ::BlockMoveData(¤   theString,
e7b877 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   noteString,
df6bc1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theString[0] + 1);
339b6c ¤   ¤   ¤   theNotificationRecP->qType = nmType;
b04296 ¤   ¤   ¤   theNotificationRecP->nmSound = (Handle) -1;
4d9ea1 ¤   ¤   ¤   theNotificationRecP->nmStr = noteString;
83a5ae ¤   ¤   ¤   theNotificationRecP->nmResp = (NMUPP) -1;
2687c7 ¤   ¤   ¤
96d4fc ¤   ¤   ¤   ::NMInstall(theNotificationRecP);
dd0fe4 ¤   ¤   }
3328b0 ¤   ¤   mGlobals.disableEncrypt = true;
905f07 ¤   ¤   mGlobals.disableSign = true;
1c9371 ¤   }
af7454 #endif
a1af5a
1614e0 ¤   // Save the PGPContextRef
de55ed ¤   mGlobals.pgpContext = sPGPContext;
5767c5 ¤
a5e936 ¤   // Set the curresfile back to app
--7c5e 0018e6f730d401200e3 Page 4 of CPGPemailer.cp
4c738f ¤   err = FSpFindOpenForkRef(¤  inProcInfoPtr->processAppSpec,
64e29f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true,
7622c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mGlobals.appResForkRef);
a05e5c ¤   PGPThrowIfOSErr_(err);
a467c5 ¤
7db7fb ¤   StSaveCurResFile¤   setToAppRes(mGlobals.appResForkRef);
f767c5 ¤
ea6a77 ¤   // Test 'vers' info
fdf91b ¤   StResource¤ theVers('vers', 1);
f7af5a
fe709f ¤   mGlobals.versInfo = (**((VersRecHndl) theVers.mResourceH)).numericVersion;
add24f ¤   PGPThrowIf_(mGlobals.versInfo.majorRev != 2);
07af5a
6c7569 ¤   // Save away our FSSpec and ProcInfo
92c6f1 ¤   mGlobals.processProcInfo = *inProcInfoPtr;
666625 ¤   mGlobals.processSpec = *inProcInfoPtr->processAppSpec;
725b9e ¤   ::BlockMoveData(¤   inProcInfoPtr->processName,
bc5b9d ¤   ¤   ¤   ¤   ¤   ¤   mGlobals.processName,
b90ac0 ¤   ¤   ¤   ¤   ¤   ¤   inProcInfoPtr->processName[0] + 1);
edcfed ¤   mGlobals.processProcInfo.processAppSpec = &mGlobals.processSpec;
629097 ¤   mGlobals.processProcInfo.processName = mGlobals.processName;
5a54b0 ¤   mGlobals.plugSpec = *inFSSpecPtr;
5667c5 ¤
3c9eaa ¤   // Find QDGlobals
065195 ¤   UQDGlobals::SetQDGlobals((QDGlobals*)(*((long*)::LMGetCurrentA5())
10cd01 ¤   ¤   ¤   ¤   ¤   - (sizeof(QDGlobals) - sizeof(GrafPtr))));
cd67c5 ¤
fe9d87 ¤   // Set the ColorQD environment variable
8c7bef ¤   Int32¤  ¤   qdVersion = gestaltOriginalQD;
5167c5 ¤
88466b ¤   ::Gestalt(gestaltQuickdrawVersion, &qdVersion);
9ce5a4 ¤   UEnvironment::SetFeature(¤  env_SupportsColor,
53b447 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·¤  (qdVersion > gestaltOriginalQD));
e6af5a
512279 ¤   // Register panes
c6c198 ¤   RegisterClass_(CPGPemailerView);
237a3b ¤   RegisterClass_(LButton);
6d29b3 ¤   RegisterClass_(LView);
3867c5 ¤
85e3f7 ¤   // Initialize PGPEncoderDecoder
ff273f ¤   CPGPEncoderDecoder::Init(sPGPContext);
6c67c5 ¤
6ab1b4 ¤   // We've got all of the info we need from the browser, so we now open our
0af8ce ¤   // resources
99498b ¤   LFile¤  thePlugFile(mGlobals.plugSpec);
7f67c5 ¤
bab57b ¤   thePlugFile.OpenResourceFork(fsRdWrPerm);
0267c5 ¤
e17771 ¤   // Add patches
8c7b1c ¤   new CemailerSetWTitlePatch(mGlobals);
55e51c ¤   new CemailerWaitNextEventPatch(mGlobals);
e4564a ¤   new CemailerEndUpdatePatch(mGlobals);
8293f3 ¤   new CemailerCloseWindowPatch(mGlobals);
e83b99 ¤   new CemailerSizeWindowPatch(mGlobals);
20af5a
8d3eb8 ¤   thePlugFile.CloseResourceFork();
dc82f7 };
cdaf5a
85af5a
4caf5a
38a206 CPGPemailerPlug::~CPGPemailerPlug()
49bb36 {
f65dc3 ¤   // Cleanup after ourselves
27df76 ¤   CPGPEncoderDecoder::Cleanup();
8eefe6 }
--6595 001166edfaa401200e4 Page 1 of CPGPemailer.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
f655f6 ¤   $Id: CPGPemailer.h,v 1.2.20.1 1998/11/12 03:07:46 heller Exp $
35f7f7 ____________________________________________________________________________*/
a1af5a
ad8d55 #pragma once·
f7af5a
4df3ea #include "PGPemailerGlobals.h"
40af5a
e0dc5d class¤  CPGPemailerPlug {
7f5ed4 public:
5194f6 ¤   ¤   ¤   ¤   ¤   CPGPemailerPlug(ProcessInfoRec * inProcInfoPtr,
5d8784 ¤   ¤   ¤   ¤   ¤   ¤   FSSpec * inFSSpecPtr);
fdca2f ¤   virtual¤¤   ¤   ~CPGPemailerPlug();
93af5a
4fa2d3 protected:
4b3695 ¤   SGlobals¤   ¤   mGlobals;
5182f7 };
c6af5a
40af5a
20af5a
95fb1c // UPP proc infos for patches
0573f4 enum {
cf07ab ¤   kUPPExitToShellProcInfo¤=¤  kPascalStackBased¤  ¤
3e82f7 };
a2af5a
7dac96 pascal¤ void¤   MyExitToShell();
02af5a
16af5a
--a939 001e045196f401200e5 Page 1 of PGPEmailerGlobals.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
35a1b6 ¤   $Id: PGPEmailerGlobals.h,v 1.4.8.1 1998/11/12 03:07:47 heller Exp $
b4f7f7 ____________________________________________________________________________*/
13af5a
b68d55 #pragma once·
56af5a
27e9d8 #include "CWindowRefArray.h"
88e684 #include "pgpUserInterface.h"
04af5a
c776ac typedef struct GlobalsS {
34ccc6 ¤   Boolean¤¤   ¤   disableEncrypt;
01357e ¤   Boolean¤¤   ¤   disableSign;
212657 ¤   Boolean¤¤   ¤   disableDecrypt;
a8809f ¤   Boolean¤¤   ¤   disableVerify;
e73a3f ¤   SInt16¤ ¤   ¤   appResForkRef;
f86680 ¤   NumVersion¤ ¤   versInfo;
354a6d ¤   PGPContextRef¤  pgpContext;
d50489 ¤   Str32¤  ¤   ¤   processName;
8a0adc ¤   ProcessInfoRec¤ processProcInfo;
ce311d ¤   FSSpec¤ ¤   ¤   processSpec;
40ec17 ¤   FSSpec¤ ¤   ¤   plugSpec;
6249bf ¤   CWindowRefArray¤windowRefArray;
e0ab8a } SGlobals, * SGlobalsPtr;
--7eb6 001491be65a401200e6 Page 1 of PGPemailer.pch++
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
225512 ¤   $Id: PGPemailer.pch++,v 1.3.8.1 1998/11/12 03:07:47 heller Exp $
35f7f7 ____________________________________________________________________________*/
62af5a
ad77e0 #if __POWERPC__
febbea ¤   #pragma precompile_target "PGPemailerPCHPPC"
0567c5 ¤
76fc58 #elif __CFM68K__
3bddce ¤   #pragma precompile_target "PGPemailerPCHCFM68K"
dc67c5 ¤
90db21 #else
cf9b3f ¤   #pragma precompile_target "PGPemailerPCH68K"
247454 #endif
e4af5a
2627a3 #pragma once on
49329f #include <PP_MacHeaders.c>¶
--1dd6 0017a0c8765401200e7 Page 1 of PGPemailer.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
90824a ¤   $Id: PGPemailer.prefix,v 1.3.20.1 1998/11/12 03:07:48 heller Exp $
eff7f7 ____________________________________________________________________________*/
73af5a
fb77e0 #if __POWERPC__
59d285 ¤   #include "PGPemailerPCHPPC"
2367c5 ¤
82fc58 #elif __CFM68K__
bc2009 ¤   #include "PGPemailerPCHCFM68K"
0767c5 ¤
f4db21 #else
7ff250 ¤   #include "PGPemailerPCH68K"
cc7454 #endif
bbaf5a
fab18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
44af5a
e0e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
cd79b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
55af5a
3f049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
1faf5a
f60db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
d3af5a
56a662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
cda6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
5d5cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
3eaf5a
7a0438 #include "MacBasics.h"
be96be #include "PGPBuildFlags.h"
56e2ff #include "pgpConfig.h"
2a94a0 #include "pgpLeaks.h"
ad46ad #include "MacDebug.h"
afaf5a
b73379 #ifdef __cplusplus
280e06 #include "UPGPException.h"
7a7454 #endif
--22d6 001ce12d062401200e8 Page 1 of PGPemailerDebug.pch++
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
f2fda9 ¤   $Id: PGPemailerDebug.pch++,v 1.4.8.1 1998/11/12 03:07:49 heller Exp $
eef7f7 ____________________________________________________________________________*/
09af5a
3477e0 #if __POWERPC__
2e945d ¤   #pragma precompile_target "PGPemailerDebugPCHPPC"
8a67c5 ¤
7cfc58 #elif __CFM68K__
7c7b72 ¤   #pragma precompile_target "PGPemailerDebugPCHCFM68K"
8767c5 ¤
eedb21 #else
88b488 ¤   #pragma precompile_target "PGPemailerDebugPCH68K"
7a7454 #endif
97af5a
5627a3 #pragma once on
ecaf5a
d47bee #include <PP_MacHeaders.c>
acaf5a
0eaf17 // Define all debugging symbols
5a6dc3 #define Debug_Throw
ce74f5 #define Debug_Signal
--007c 0012491ef83401200e9 Page 1 of PGPemailerDebug.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
fb1da8 ¤   $Id: PGPemailerDebug.prefix,v 1.3.20.1 1998/11/12 03:07:49 heller Exp $
73f7f7 ____________________________________________________________________________*/
4baf5a
ed77e0 #if __POWERPC__
1f3f95 ¤   #include "PGPemailerDebugPCHPPC"
ef67c5 ¤
a7fc58 #elif __CFM68K__
6dfc7d ¤   #include "PGPemailerDebugPCHCFM68K"
fd67c5 ¤
96db21 #else
fe1f40 ¤   #include "PGPemailerDebugPCH68K"
9d7454 #endif
96af5a
70a853 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1
feaf5a
8be6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
1d79b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
03af5a
87049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
55af5a
280db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
e0af5a
dfa662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
2ea6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
995cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
8daf5a
aa0438 #include "MacBasics.h"
f196be #include "PGPBuildFlags.h"
3be2ff #include "pgpConfig.h"
7b94a0 #include "pgpLeaks.h"
1646ad #include "MacDebug.h"
c7af5a
e33379 #ifdef __cplusplus
8f0e06 #include "UPGPException.h"
257454 #endif
24af5a
--1925 0006aced8c4401200ea Page 1 of CDragTextEdit.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
1ae587 ¤   $Id: CDragTextEdit.cp,v 1.4.8.1 1998/11/12 03:08:58 heller Exp $
aaf7f7 ____________________________________________________________________________*/
50af5a
ca1d80 #include <LDragAndDrop.h>
21a13b #include <LDragTask.h>
8faf5a
660d08 #include "pgpMem.h"
b5af5a
70b8eb #include "CDragTextEdit.h"
96af5a
083c2a CDragTextEdit::CDragTextEdit(LStream *inStream)
27b264 ¤   ¤   : LTextEditView( inStream )
59bb36 {
197007 ¤   if( IsntNull( GetMacTEH() ) && LDragAndDrop::DragAndDropIsPresent() )
f6c7a1 ¤   {
6462c8 ¤   ¤   TEFeatureFlag( teFOutlineHilite, teBitSet, GetMacTEH() );
519371 ¤   }
24efe6 }
06af5a
d23d6f CDragTextEdit::~CDragTextEdit(void)
c9bb36 {
a5efe6 }
68af5a
837e69 ¤   Boolean
c52b6c CDragTextEdit::PortPtInTextSelection(Point inPortPt)
c8bb36 {
e1be53 ¤   Boolean¤inSelection = FALSE;
ae67c5 ¤
349ecb ¤   FocusDraw();
e967c5 ¤
397007 ¤   if( IsntNull( GetMacTEH() ) && LDragAndDrop::DragAndDropIsPresent() )
9ec7a1 ¤   {
f299b4 ¤   ¤   RgnHandle¤  hiliteRgn;
da1b52 ¤   ¤
d88263 ¤   ¤   hiliteRgn = NewRgn();
902546 ¤   ¤   if( IsntNull( hiliteRgn ) )
c35b34 ¤   ¤   {
b2c7e5 ¤   ¤   ¤   if( IsntErr( TEGetHiliteRgn( hiliteRgn, GetMacTEH() ) ) )
a4f776 ¤   ¤   ¤   {
b15be0 ¤   ¤   ¤   ¤   if( ! EmptyRgn( hiliteRgn ) )
8c72c3 ¤   ¤   ¤   ¤   {
df9f56 ¤   ¤   ¤   ¤   ¤   if( PtInRgn( inPortPt, hiliteRgn ) )
744859 ¤   ¤   ¤   ¤   ¤   {
4be0f5 ¤   ¤   ¤   ¤   ¤   ¤   inSelection = TRUE;
741c89 ¤   ¤   ¤   ¤   ¤   }
e42613 ¤   ¤   ¤   ¤   }
2fa3a6 ¤   ¤   ¤   }
e187c7 ¤   ¤   ¤
3a027a ¤   ¤   ¤   DisposeRgn( hiliteRgn );
0d0fe4 ¤   ¤   }
dc9371 ¤   }
da67c5 ¤
c4176f ¤   return( inSelection );
a6efe6 }
a8af5a
8d6d52 ¤   void
5384ed CDragTextEdit::AdjustCursorSelf(
c2e42e ¤   Point¤  ¤   ¤   ¤   inPortPt,
f26ca2 ¤   const EventRecord&¤ inMacEvent)
51bb36 {
60fc70 ¤   if( PortPtInTextSelection( inPortPt ) )
a7c7a1 ¤   {
784a05 ¤   ¤   InitCursor();
d39371 ¤   }
a30e24 ¤   else
bec7a1 ¤   {
b37eb2 ¤   ¤   LTextEditView::AdjustCursorSelf( inPortPt, inMacEvent );
6a9371 ¤   }
--100c 000c3f80ff3401200ea Page 2 of CDragTextEdit.cp
7aefe6 }
46af5a
746d52 ¤   void
1e3092 CDragTextEdit::Click(SMouseDownEvent &inMouseDown)
efbb36 {
768fff ¤   Boolean¤handled = FALSE;
7d67c5 ¤
9d6ddd ¤   if( PortPtInTextSelection( inMouseDown.whereLocal ) )
5ec7a1 ¤   {
4b66a9 ¤   ¤   if( WaitMouseMoved( inMouseDown.macEvent.where ) )
565b34 ¤   ¤   {
f9f49b ¤   ¤   ¤   RgnHandle¤  dragRgn;
2087c7 ¤   ¤   ¤
128e28 ¤   ¤   ¤   dragRgn = NewRgn();
16f922 ¤   ¤   ¤   if( IsntNull( dragRgn ) )
e3f776 ¤   ¤   ¤   {
a11eea ¤   ¤   ¤   ¤   RgnHandle¤  tempRgn;
e42b85 ¤   ¤   ¤   ¤
b97880 ¤   ¤   ¤   ¤   tempRgn = NewRgn();
e8ce74 ¤   ¤   ¤   ¤   if( IsntNull( tempRgn ) )
6372c3 ¤   ¤   ¤   ¤   {
98038a ¤   ¤   ¤   ¤   ¤   Point¤  ¤   localTopLeft;¤  ¤   ¤
5ee217 ¤   ¤   ¤   ¤   ¤   Handle¤ ¤   theText;
c86e7f ¤   ¤   ¤   ¤   ¤   SInt8¤  ¤   saveTextState;
aa1090 ¤   ¤   ¤   ¤   ¤   char¤   ¤   *selectedDataStart;
076f6a ¤   ¤   ¤   ¤   ¤   Size¤   ¤   selectedDataLength;
ae8b6f ¤   ¤   ¤   ¤   ¤   TERec¤  ¤   **textRec;
89ae30 ¤   ¤   ¤   ¤   ¤
c6647b ¤   ¤   ¤   ¤   ¤   // Get outline drag rgn
79c1f3 ¤   ¤   ¤   ¤   ¤   TEGetHiliteRgn( dragRgn, GetMacTEH() );
3c9f46 ¤   ¤   ¤   ¤   ¤   CopyRgn( dragRgn, tempRgn );
e70fa2 ¤   ¤   ¤   ¤   ¤   InsetRgn( tempRgn, 1, 1 );
d0e49f ¤   ¤   ¤   ¤   ¤   DiffRgn( dragRgn, tempRgn, dragRgn );
4fe048 ¤   ¤   ¤   ¤   ¤   DisposeRgn( tempRgn );
93af5a
486247 ¤   ¤   ¤   ¤   ¤   // Convert the region to global coordinates.
dc243d ¤   ¤   ¤   ¤   ¤   localTopLeft.v = 0;
7c17d5 ¤   ¤   ¤   ¤   ¤   localTopLeft.h = 0;
5eae30 ¤   ¤   ¤   ¤   ¤
4c86b6 ¤   ¤   ¤   ¤   ¤   LocalToGlobal( &localTopLeft );
8b9dbe ¤   ¤   ¤   ¤   ¤   OffsetRgn( dragRgn, localTopLeft.h, localTopLeft.v );
b1ae30 ¤   ¤   ¤   ¤   ¤
acbe79 ¤   ¤   ¤   ¤   ¤   theText = GetTextHandle();
6489b2 ¤   ¤   ¤   ¤   ¤   textRec = GetMacTEH();
30ae30 ¤   ¤   ¤   ¤   ¤
b12e25 ¤   ¤   ¤   ¤   ¤   saveTextState = HGetState( theText );
70c033 ¤   ¤   ¤   ¤   ¤   HLock( theText );
22ae30 ¤   ¤   ¤   ¤   ¤
75d877 ¤   ¤   ¤   ¤   ¤   selectedDataStart ¤ = *theText + (**textRec).selStart;
8ca6b6 ¤   ¤   ¤   ¤   ¤   selectedDataLength¤ = (**textRec).selEnd -
742be3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (**textRec).selStart;
09ae30 ¤   ¤   ¤   ¤   ¤
40c072 ¤   ¤   ¤   ¤   ¤   LDragTask¤  dragTask( inMouseDown.macEvent,
1d656b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dragRgn,
f17078 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   1L,
00de8c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   'TEXT',
e28d9a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectedDataStart,
7be9bb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectedDataLength,
65cf93 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0L );
48af5a
6708e3 ¤   ¤   ¤   ¤   ¤   HSetState( theText, saveTextState );
0c87c7 ¤   ¤   ¤
317a1c ¤   ¤   ¤   ¤   ¤   handled = TRUE;
df2613 ¤   ¤   ¤   ¤   }
a32b85 ¤   ¤   ¤   ¤
a30ebf ¤   ¤   ¤   ¤   DisposeRgn( dragRgn );
02a3a6 ¤   ¤   ¤   }
0b0fe4 ¤   ¤   }
6a9371 ¤   }
e767c5 ¤
942b6e ¤   if( ! handled )
c3c7a1 ¤   {
--5a7e 001dc4baa79401200ea Page 3 of CDragTextEdit.cp
6b32e5 ¤   ¤   LTextEditView::Click( inMouseDown );
ab9371 ¤   }
9defe6 }
dcaf5a
--2ded 001c18ab019401200eb Page 1 of CDragTextEdit.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
689788 ¤   $Id: CDragTextEdit.h,v 1.3.8.1 1998/11/12 03:08:59 heller Exp $
1cf7f7 ____________________________________________________________________________*/
cbaf5a
d77b7d #pragma once
a3af5a
ee775b #include <LTextEditView.h>
20af5a
d8bbbb class CDragTextEdit : public LTextEditView
b8bb36 {
475ed4 public:
7a5abc ¤   enum { class_ID = 'DTxt' };
17af5a
639ed6 ¤   ¤   ¤   ¤   ¤   ¤   CDragTextEdit(LStream *inStream);
637e65 ¤   virtual¤¤   ¤   ¤   ~CDragTextEdit(void);
ceaf5a
45d64a ¤   virtual void¤   ¤   Click(SMouseDownEvent &inMouseDown);
83af5a
23a2d3 protected:
0faf5a
de6475 ¤   virtual void¤   ¤   AdjustCursorSelf(Point inPortPt,
3d6dd7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord &inMacEvent);
d3072f ¤   Boolean¤¤   ¤   ¤   PortPtInTextSelection(Point inPortPt);
c1bf26 };¶
--5511 0000e17fc07401200ec Page 1 of CDropReceiver.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
2a45dc ¤   $Id: CDropReceiver.cp,v 1.22.8.1 1998/11/12 03:09:00 heller Exp $
f8f7f7 ____________________________________________________________________________*/
cdaf5a
af9c60 #include <Aliases.h>
94af5a
697e6d #include <UDrawingState.h>
d9af5a
92bbf4 #include "MacFiles.h"
27af5a
e02aad #include "PGPtoolsUtils.h"
d8af5a
fa644c #include "CDropReceiver.h"
6d3192 #include "CPGPtools.h"
84c756 #include "CPGPtoolsFileTask.h"
c9be50 #include "CPGPtoolsTaskList.h"
1ee26d #include "CPGPtoolsTextTask.h"
9c5c3c #include "CPGPtoolsWipeTask.h"
30af5a
45e4fb CDropReceiver *CDropReceiver::CreateFromStream(LStream *inStream)
ccbb36 {
4ceb09 ¤   CDropReceiver¤  *receiver;
ca67c5 ¤
7fa604 ¤   // LDropArea leaks like a sieve. Need to suspend leaks when we create one.
fa67c5 ¤
7032f4 ¤   MacLeaks_Suspend();
18c9d3 ¤   receiver = new CDropReceiver(inStream);
2477d9 ¤   MacLeaks_Resume();
ff67c5 ¤
aecc52 ¤   return( receiver );
89efe6 }
3eaf5a
7531dd CDropReceiver::CDropReceiver(LStream *inStream)
ffc871 ¤   ¤   :¤  LView(inStream),
980019 ¤   ¤   ¤   LDragAndDrop(UQDGlobals::GetCurrentPort(), this)
c8bb36 {
a7f5f8 ¤   mTaskList ¤ ¤   ¤   = NULL;
8ccc18 ¤   mDroppedFileList¤   = NULL;
9367c5 ¤
84b874 ¤   // The operation for this particular drop pane is stored in the
bd186d ¤   // user constant field of the PPob.
40255a ¤   mDropOperation = (PGPtoolsOperation) GetUserCon();
eaefe6 }
56af5a
515bf5 CDropReceiver::~CDropReceiver()
5fbb36 {
804bc3 ¤   pgpAssert( IsNull( mTaskList ) );
72efe6 }
d4af5a
6b6d52 ¤   void
c277ca CDropReceiver::FocusDropArea()
61bb36 {
2ce8b9 ¤   OutOfFocus(nil);
a09ecb ¤   FocusDraw();
4fefe6 }
63af5a
8f6d52 ¤   void
8a1190 CDropReceiver::HiliteDropArea(
87e9b9 ¤   DragReference¤  inDragRef)
8fbb36 {
0dc358 ¤   Rect¤   ¤   dropRect;
bfa3d0 ¤   RgnHandle¤  dropRgn;
a967c5 ¤
41c94e ¤   ApplyForeAndBackColors();
75343f ¤   mPane->CalcLocalFrameRect(dropRect);
66ab26 ¤   ::InsetRect(&dropRect, 1, 1);
08a8a5 ¤   dropRgn = ::NewRgn();
8075ed ¤   ::RectRgn(dropRgn, &dropRect);
0eb2ab ¤   ::ShowDragHilite(inDragRef, dropRgn, true);
--80d6 0002097e0dc401200ec Page 2 of CDropReceiver.cp
3a66b9 ¤   ::DisposeRgn(dropRgn);
dcefe6 }
54af5a
cdba47 // ItemIsAcceptable will be called whenever the Drag Manager wants to know if
e2c713 // the item the user is currently dragging contains any information that we
ea9440 // can accept.
0c465d //
2af4f4 // In our case, the only thing we'll accept are flavorTypeHFS items.
1baf5a
a27e69 ¤   Boolean
05383f CDropReceiver::ItemIsAcceptable(
c02da6 ¤   DragReference inDragRef,
baefd3 ¤   ItemReference inItemRef)
f7bb36 {
56656c ¤   Boolean¤¤   isAcceptable = FALSE;
6dba5a ¤   ushort¤ ¤   numFlavors;
77c412 ¤   OSStatus¤   status;
44ae30 ¤   ¤   ¤   ¤   ¤
bc274e ¤   status = CountDragItemFlavors( inDragRef, inItemRef, &numFlavors );
f1dd30 ¤   if( IsntErr( status ) )
edc7a1 ¤   {
d04d30 ¤   ¤   ushort flavorIndex;
151b52 ¤   ¤
e9e59d ¤   ¤   for( flavorIndex = 1; flavorIndex <= numFlavors; flavorIndex++ )
e85b34 ¤   ¤   {
3e9a9f ¤   ¤   ¤   FlavorType¤ flavorType;
4087c7 ¤   ¤   ¤
ab99d4 ¤   ¤   ¤   status = GetFlavorType( inDragRef, inItemRef, flavorIndex,
9fb257 ¤   ¤   ¤   ¤   ¤   ¤   &flavorType );
b6fb92 ¤   ¤   ¤   if( IsntErr( status ) )
d6f776 ¤   ¤   ¤   {
a1cbdd ¤   ¤   ¤   ¤   if( flavorType == 'TEXT' &&
1f5fb1 ¤   ¤   ¤   ¤   ¤   mDropOperation != kPGPtoolsWipeOperation &&
70ae5e ¤   ¤   ¤   ¤   ¤   mDropOperation != kPGPtoolsWipeFreeSpaceOperation )
2672c3 ¤   ¤   ¤   ¤   {
d446e1 ¤   ¤   ¤   ¤   ¤   isAcceptable = TRUE;
d02613 ¤   ¤   ¤   ¤   }
4b6dce ¤   ¤   ¤   ¤   else if( flavorType == flavorTypeHFS )
f672c3 ¤   ¤   ¤   ¤   {
898a41 ¤   ¤   ¤   ¤   ¤   HFSFlavor¤  hfsFlavor;
c56773 ¤   ¤   ¤   ¤   ¤   Size¤   ¤   dataSize;
85ae30 ¤   ¤   ¤   ¤   ¤
86b5a4 ¤   ¤   ¤   ¤   ¤   dataSize = sizeof( hfsFlavor );
a3e964 ¤   ¤   ¤   ¤   ¤   status = GetFlavorData( inDragRef, inItemRef,
9ea24a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorTypeHFS, &hfsFlavor, &dataSize, 0 );
e1b6a1 ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
a04859 ¤   ¤   ¤   ¤   ¤   {
7282db ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤targetIsFolder;
227e13 ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤targetWasAlias;
1294aa ¤   ¤   ¤   ¤   ¤   ¤
f6bbb9 ¤   ¤   ¤   ¤   ¤   ¤   status = ResolveAliasFile( &hfsFlavor.fileSpec, TRUE,
5187a0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &targetIsFolder, &targetWasAlias );
b3aef1 ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
ec8fec ¤   ¤   ¤   ¤   ¤   ¤   {
8d3e3d ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( hfsFlavor.fileSpec.parID == fsRtParID )
8506b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
4f337c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // It's a disk
f8da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
ab1316 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( mDropOperation ==
72e86d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPtoolsWipeFreeSpaceOperation )
3831b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
890d7a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt16¤ numDraggedItems;
47ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
f0fa41 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( CountDragItems( inDragRef,
2ab952 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &numDraggedItems ) ) &&
ab76ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numDraggedItems == 1 )
40dec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
150859 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isAcceptable = TRUE;
1b8a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
116560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
0b0f6a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else if( mDropOperation ==
20dc58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPtoolsWipeOperation )
--c0cd 000ec873c6b401200ec Page 3 of CDropReceiver.cp
5c31b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
7c2eec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isAcceptable = TRUE;
eb6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
675268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
1c2867 ¤   ¤   ¤   ¤   ¤   ¤   ¤   else if( mDropOperation !=
b59127 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPtoolsWipeFreeSpaceOperation )
2606b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
46d67d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // It's a file or folder.
c1da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
ea41df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isAcceptable = TRUE;
8f5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
70db3c ¤   ¤   ¤   ¤   ¤   ¤   }
2d1c89 ¤   ¤   ¤   ¤   ¤   }
cf2613 ¤   ¤   ¤   ¤   }
f12b85 ¤   ¤   ¤   ¤
f77bd3 ¤   ¤   ¤   ¤   if( isAcceptable )
bd14c3 ¤   ¤   ¤   ¤   ¤   break;
4da3a6 ¤   ¤   ¤   }
3d0fe4 ¤   ¤   }
969371 ¤   }
2367c5 ¤
91547d ¤   AssertNoErr( status, "CDropReceiver::ItemIsAcceptable()" );
2367c5 ¤
f535fc ¤   return( isAcceptable );
efefe6 }
c5af5a
ee6d52 ¤   void
be9aaf CDropReceiver::ReceiveDragItem(
9c9701 ¤   DragReference¤  inDragRef,
45c31d ¤   DragAttributes¤ inDragAttrs,
8a82a5 ¤   ItemReference¤  inItemRef,
101ed3 ¤   Rect¤   ¤   ¤   &inItemBounds)¤ // In Local coordinates
16bb36 {
9a7748 ¤   FlavorFlags¤¤   ¤   flags;
33560b ¤   OSErr¤  ¤   ¤   ¤   err = noErr;
dbe5ae ¤   CPGPtoolsTextTask¤  *textTask = nil;
33af5a
07e3bc ¤   #pragma unused( inDragAttrs, inItemBounds )
0867c5 ¤
d83608 ¤   pgpAssert( IsntNull( mTaskList ) );
2b67c5 ¤
833fe4 ¤   // Try for our drag flavors in required order. Check 'TEXT' before
13ed8e ¤   // flavorTypeHFS because text clipping files come in as both.
b3e1f4 ¤   if( mDropOperation != kPGPtoolsWipeOperation &&
268341 ¤   ¤   mDropOperation != kPGPtoolsWipeFreeSpaceOperation &&
410c81 ¤   ¤   IsntErr( GetFlavorFlags( inDragRef, inItemRef, 'TEXT', &flags) ) )
b4c7a1 ¤   {
3b83e6 ¤   ¤   Size¤   ¤   dataSize;
a51b52 ¤   ¤
655e58 ¤   ¤   err = GetFlavorDataSize( inDragRef, inItemRef, 'TEXT', &dataSize );
9dda5e ¤   ¤   if( IsntErr( err ) )
9c5b34 ¤   ¤   {
824066 ¤   ¤   ¤   PGPByte¤*data;
d687c7 ¤   ¤   ¤
b156e1 ¤   ¤   ¤   data = (PGPByte *) pgpAlloc( dataSize );
3093cd ¤   ¤   ¤   if( IsntNull( data ) )
36f776 ¤   ¤   ¤   {
42b0d7 ¤   ¤   ¤   ¤   err = GetFlavorData( inDragRef, inItemRef, 'TEXT', data,
35157d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &dataSize, 0L );
b55c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
8c72c3 ¤   ¤   ¤   ¤   {
eec70e ¤   ¤   ¤   ¤   ¤   textTask = new( CPGPtoolsTextTask )( mDropOperation );
96f12c ¤   ¤   ¤   ¤   ¤   if( IsntNull( textTask ) )
b34859 ¤   ¤   ¤   ¤   ¤   {
cf12ed ¤   ¤   ¤   ¤   ¤   ¤   err = textTask->SetText( data, dataSize );
ca5f35 ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
d18fec ¤   ¤   ¤   ¤   ¤   ¤   {
dc5138 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTaskList->AppendTask( textTask );
91db3c ¤   ¤   ¤   ¤   ¤   ¤   }
5b7f8b ¤   ¤   ¤   ¤   ¤   ¤   else
328fec ¤   ¤   ¤   ¤   ¤   ¤   {
ec53bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   delete( textTask );
--25aa 000e152fd3a401200ec Page 4 of CDropReceiver.cp
d53f86 ¤   ¤   ¤   ¤   ¤   ¤   ¤   textTask = nil;
d7db3c ¤   ¤   ¤   ¤   ¤   ¤   }
4c1c89 ¤   ¤   ¤   ¤   ¤   }
a82613 ¤   ¤   ¤   ¤   }
e92b85 ¤   ¤   ¤   ¤
f312ae ¤   ¤   ¤   ¤   pgpFree( data );
2ca3a6 ¤   ¤   ¤   }
ebbb8c ¤   ¤   ¤   else
91f776 ¤   ¤   ¤   {
32945a ¤   ¤   ¤   ¤   err = memFullErr;
2ba3a6 ¤   ¤   ¤   }
880fe4 ¤   ¤   }
b09371 ¤   }
2f67c5 ¤
49ee03 ¤   if( IsntErr( err ) )
31c7a1 ¤   {
fff697 ¤   ¤   if( IsntErr( GetFlavorFlags( inDragRef, inItemRef, flavorTypeHFS,
aa3a80 ¤   ¤   ¤   ¤   ¤   &flags) ) )
aa5b34 ¤   ¤   {
03b4ee ¤   ¤   ¤   Size¤   ¤   dataSize;
fdc5fe ¤   ¤   ¤   HFSFlavor¤  hfsFlavor;
d387c7 ¤   ¤   ¤
1b3bb5 ¤   ¤   ¤   dataSize = sizeof( hfsFlavor );
7487c7 ¤   ¤   ¤
a710ce ¤   ¤   ¤   err = GetFlavorData( inDragRef, inItemRef, flavorTypeHFS,
c60440 ¤   ¤   ¤   ¤   ¤   ¤   &hfsFlavor, &dataSize, 0 );
4e6108 ¤   ¤   ¤   if( IsntErr( err ) )
4bf776 ¤   ¤   ¤   {
6912ed ¤   ¤   ¤   ¤   Boolean¤targetIsFolder;
87ee25 ¤   ¤   ¤   ¤   Boolean¤targetWasAlias;
4e2b85 ¤   ¤   ¤   ¤
3f07c1 ¤   ¤   ¤   ¤   pgpAssert( dataSize <= sizeof( hfsFlavor ) );
c02b85 ¤   ¤   ¤   ¤
5231b7 ¤   ¤   ¤   ¤   err = ResolveAliasFile( &hfsFlavor.fileSpec, TRUE,
ad87a0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &targetIsFolder, &targetWasAlias );
f05c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
7972c3 ¤   ¤   ¤   ¤   {
3af12c ¤   ¤   ¤   ¤   ¤   if( IsntNull( textTask ) )
a34859 ¤   ¤   ¤   ¤   ¤   {
02a73d ¤   ¤   ¤   ¤   ¤   ¤   // The dragged text has assocaited file data. Set the
2f0dd0 ¤   ¤   ¤   ¤   ¤   ¤   // file name in the text task object for error
de5aa5 ¤   ¤   ¤   ¤   ¤   ¤   // reporting and window title purposes.
d294aa ¤   ¤   ¤   ¤   ¤   ¤
770779 ¤   ¤   ¤   ¤   ¤   ¤   textTask->SetSourceFileName( hfsFlavor.fileSpec.name );
371c89 ¤   ¤   ¤   ¤   ¤   }
8fbe30 ¤   ¤   ¤   ¤   ¤   else if( mDropOperation == kPGPtoolsWipeFreeSpaceOperation )
544859 ¤   ¤   ¤   ¤   ¤   {
4ce4bc ¤   ¤   ¤   ¤   ¤   ¤   CPGPtools::WipeFreeSpace( hfsFlavor.fileSpec.vRefNum );
601c89 ¤   ¤   ¤   ¤   ¤   }
3b4bd6 ¤   ¤   ¤   ¤   ¤   else
924859 ¤   ¤   ¤   ¤   ¤   {
8005ff ¤   ¤   ¤   ¤   ¤   ¤   // Add the spec to our list of specs to process. We will
059e6e ¤   ¤   ¤   ¤   ¤   ¤   // then process this list to remove child specs of
333a1d ¤   ¤   ¤   ¤   ¤   ¤   // other parent specs in the list
e494aa ¤   ¤   ¤   ¤   ¤   ¤
62d523 ¤   ¤   ¤   ¤   ¤   ¤   mDroppedFileList->InsertItemsAt( 1, 32000,
eb8bb5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   hfsFlavor.fileSpec );
321c89 ¤   ¤   ¤   ¤   ¤   }
942613 ¤   ¤   ¤   ¤   }
0b55de ¤   ¤   ¤   ¤   else if( targetWasAlias )
7f72c3 ¤   ¤   ¤   ¤   {
eeda53 ¤   ¤   ¤   ¤   ¤   // The alias could not be resolved. Skip without failure.
7e5aa0 ¤   ¤   ¤   ¤   ¤   err = noErr;
ab2613 ¤   ¤   ¤   ¤   }
89a3a6 ¤   ¤   ¤   }
4e0fe4 ¤   ¤   }
ce9371 ¤   }
6267c5 ¤
cc8bab ¤   AssertNoErr( err, "ReceiveDragItem" );
7d67c5 ¤
dfad64 ¤   // Powerplant requires this if we want to return the error correctly.
e1e457 ¤   ThrowIfOSErr_(err);
--1b00 00038b3c0a8401200ec Page 5 of CDropReceiver.cp
7aefe6 }
46af5a
270a33 // Override this method to handle creating and queueing of tasks.
19c383 // Drag items are processed individually, however all file objects
98213f // are appended to a single list so we can eliminate duplicates.
4aaf5a
156d52 ¤   void
0e6c6a CDropReceiver::DoDragReceive(DragReference inDragRef)
a2bb36 {
fb4bc3 ¤   pgpAssert( IsNull( mTaskList ) );
ecaf5a
269ef3 ¤   mTaskList = new CPGPtoolsTaskList( mDropOperation);
6b5f8f ¤   if( IsntNull( mTaskList ) )
8ec7a1 ¤   {
c41eeb ¤   ¤   // By default, we assume the dragged items are TEXT clippings and
ab9653 ¤   ¤   // the options should not be shown. If a file is encountered,
17e35f ¤   ¤   // the options will be changed to show the options pane in the
785df9 ¤   ¤   // recipient dialog.
211b52 ¤   ¤
a7a316 ¤   ¤   mTaskList->SetTaskListHasFileTasks( FALSE );
16af5a
734912 ¤   ¤   mDroppedFileList = new TArray<FSSpec>;
d21b52 ¤   ¤
8d9d6d ¤   ¤   LDragAndDrop::DoDragReceive( inDragRef );
4467c5 ¤
4b1ad4 ¤   ¤   // If there were any files dragged, remove child specs, create
89800f ¤   ¤   // the tasks here and add them to the task list
bc1b52 ¤   ¤
c31121 ¤   ¤   if( mDroppedFileList->GetCount() > 0 )
2b5b34 ¤   ¤   {
026629 ¤   ¤   ¤   if( IsntErr( RemoveChildAndDuplicateSpecsFromList(
4b3981 ¤   ¤   ¤   ¤   ¤   ¤   mDroppedFileList ) ) &&
9d6ce5 ¤   ¤   ¤   ¤   mDroppedFileList->GetCount() > 0 )
38f776 ¤   ¤   ¤   {
6d25d0 ¤   ¤   ¤   ¤   PGPUInt32¤  specIndex;
c5b166 ¤   ¤   ¤   ¤   PGPUInt32¤  numSpecs;
092b85 ¤   ¤   ¤   ¤
fabe1a ¤   ¤   ¤   ¤   mTaskList->SetTaskListHasFileTasks( TRUE );
362b85 ¤   ¤   ¤   ¤
09ee5b ¤   ¤   ¤   ¤   numSpecs = mDroppedFileList->GetCount();
7188a6 ¤   ¤   ¤   ¤   for( specIndex = 1; specIndex <= numSpecs; specIndex++ )
6272c3 ¤   ¤   ¤   ¤   {
e09132 ¤   ¤   ¤   ¤   ¤   CPGPtoolsTask¤  *task;
f1b4fb ¤   ¤   ¤   ¤   ¤   FSSpec¤ ¤   ¤   theSpec;
5cae30 ¤   ¤   ¤   ¤   ¤
6329a9 ¤   ¤   ¤   ¤   ¤   mDroppedFileList->FetchItemAt( specIndex, theSpec );
66ae30 ¤   ¤   ¤   ¤   ¤
8bec73 ¤   ¤   ¤   ¤   ¤   if ( mDropOperation == kPGPtoolsWipeOperation )
ec4859 ¤   ¤   ¤   ¤   ¤   {
719f61 ¤   ¤   ¤   ¤   ¤   ¤   task = new CPGPtoolsWipeTask( &theSpec );
521c89 ¤   ¤   ¤   ¤   ¤   }
bc4bd6 ¤   ¤   ¤   ¤   ¤   else
e84859 ¤   ¤   ¤   ¤   ¤   {
851666 ¤   ¤   ¤   ¤   ¤   ¤   task = new( CPGPtoolsFileTask )( mDropOperation,
9bd6fe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theSpec );
391c89 ¤   ¤   ¤   ¤   ¤   }
a1ae30 ¤   ¤   ¤   ¤   ¤
b1cdf0 ¤   ¤   ¤   ¤   ¤   if( IsntNull( task ) )
084859 ¤   ¤   ¤   ¤   ¤   {
2801c9 ¤   ¤   ¤   ¤   ¤   ¤   mTaskList->AppendTask( task );
211c89 ¤   ¤   ¤   ¤   ¤   }
502613 ¤   ¤   ¤   ¤   }
f7a3a6 ¤   ¤   ¤   }
af0fe4 ¤   ¤   }
df1b52 ¤   ¤
d74d6a ¤   ¤   if( mTaskList->GetCount() != 0 )
7a5b34 ¤   ¤   {
bb3111 ¤   ¤   ¤   gApplication->EnqueueTaskList( mTaskList );
330fe4 ¤   ¤   }
490e1d ¤   ¤   else
7d5b34 ¤   ¤   {
3871d4 ¤   ¤   ¤   delete mTaskList;
--0e06 0010edc6839401200ec Page 6 of CDropReceiver.cp
b50fe4 ¤   ¤   }
3b1b52 ¤   ¤
3ba33f ¤   ¤   delete mDroppedFileList;
281b52 ¤   ¤
02201c ¤   ¤   mDroppedFileList ¤  = NULL;
c57e04 ¤   ¤   mTaskList ¤ ¤   ¤   = NULL;
c79371 ¤   }
0ebe43 }¶
--bc87 001fafdb65a401200ed Page 1 of CDropReceiver.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
7e6b32 ¤   $Id: CDropReceiver.h,v 1.6.8.1 1998/11/12 03:09:00 heller Exp $
0bf7f7 ____________________________________________________________________________*/
20af5a
d57b7d #pragma once
3baf5a
53ea2f #include <LBroadcaster.h>
721d80 #include <LDragAndDrop.h>
d32c73 #include <LView.h>
bcaf5a
acbe50 #include "CPGPtoolsTaskList.h"
acaf5a
b09a53 class CPGPtoolsFileTask;
a3af5a
5e732a class CDropReceiver¤:¤  public LView,
2bc931 ¤   ¤   ¤   ¤   ¤   ¤   public LDragAndDrop,
52d72c ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster
3fbb36 {
355ed4 public:
9bd535 ¤   enum { class_ID = 'Fdrp' };
cf4541 ¤   static CDropReceiver *CreateFromStream(LStream *inStream);
24d308 ¤   ¤   ¤   ¤   ¤   ¤   CDropReceiver(LStream *inStream);
b520f8 ¤   ¤   ¤   ¤   ¤   ¤   ~CDropReceiver();
d0a35b ¤   void¤   ¤   ¤   ¤   FocusDropArea();
1b2625 ¤   virtual Boolean¤¤   ItemIsAcceptable(
1d86e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragReference¤  inDragRef,
49a0ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ItemReference¤  inItemRef);
b586c1 ¤   virtual void¤   ¤   ReceiveDragItem(
f686e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragReference¤  inDragRef,
32e54c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragAttributes¤ inDragAttrs,
d0934d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ItemReference¤  inItemRef,
cef608 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   ¤   &inItemBounds);
48acf0 ¤   void¤   ¤   ¤   ¤   HiliteDropArea(¤DragReference¤  inDragRef);
54af5a
34a2d3 protected:
23af5a
52cd8c ¤   CPGPtoolsTaskList¤  ¤   *mTaskList;
d58bb9 ¤   PGPtoolsOperation¤  ¤   mDropOperation;
9f1e3b ¤   TArray<FSSpec>¤ ¤   ¤   *mDroppedFileList;
1e67c5 ¤
fa447a ¤   virtual void¤   ¤   DoDragReceive(DragReference inDragRef);
f282f7 };
faaf5a
--81ad 0005857cae2401200ee Page 1 of CPGPtools.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
bec71f ¤   $Id: CPGPtools.cp,v 1.133.8.1 1998/11/12 03:09:01 heller Exp $
aaf7f7 ____________________________________________________________________________*/
0caf5a
02ee38 #include <AEObjects.h>
61c746 #include <AEPackObject.h>
1d1ef3 #include <Folders.h>
b36c79 #include <Gestalt.h>
5edc1d #include <Scrap.h>
2784be #include <Sound.h>
1a324c #include <string.h>
c8af5a
94ac98 #include <LActiveScroller.h>
3625ae #include <LCaption.h>
f9f0a0 #include <LGADialog.h>
aaf841 #include <LGrowZone.h>
cbbce5 #include <LIconPane.h>
945a50 #include <LMenu.h>
c096c2 #include <LMenuBar.h>
49dd56 #include <PP_Messages.h>
18af5a
69740c #include <UAppleEventsMgr.h>
1edd06 #include <UDesktop.h>
787e6d #include <UDrawingState.h>
844b3b #include <UEnvironment.h>
c21cb2 #include <UExtractFromAEDesc.h>
ffffe3 #include <UGraphicUtils.h>
c3cc5c #include <UMemoryMgr.h>
23afac #include <UModalDialogs.h>
ba7c99 #include <URegistrar.h>
b575de #include <UWindows.h>
ffaf5a
32c38f // Appearance classes
95b125 #include <LBevelButton.h>
f27c09 #include <LEditText.h>
c166bb #include <LCmdBevelButton.h>
6276ae #include <LIconControl.h>
610aae #include <LPopupButton.h>
3049f7 #include <LProgressBar.h>
ccd797 #include <LPushButton.h>
762786 #include <LSeparatorLine.h>
0a05c6 #include <LStaticText.h>
05a94f #include <LTextGroupBox.h>
65af5a
51a055 // Appearance Manager Implementations
1bfd90 #include <LAMControlImp.h>
abf0f6 #include <LAMEditTextImp.h>
1334b5 #include <LAMPopupButtonImp.h>
05ef3e #include <LAMPushButtonImp.h>
585a8a #include <LAMStaticTextImp.h>
54af5a
c7e7cd #include "CVersionCaption.h"
a09dc2 #include "CWarningAlert.h"
b58c8c #include "MacDesktop.h"
74fd2e #include "MacDebugPatches.h"
a376b7 #include "MacErrors.h"
bf090b #include "MacEvents.h"
2d8bd8 #include "MacEnvirons.h"
4fbbf4 #include "MacFiles.h"
401e0f #include "MacInternet.h"
2a74e2 #include "MacProcesses.h"
b585c2 #include "MacStrings.h"
760d08 #include "pgpMem.h"
10aa66 #include "PowerPlantLeaks.h"
523eab #include "CWrappers.h"
90af5a
f59ff9 #include "BETA.h"
9339ae #include "PGPDemo.h"
58b397 #include "PGPOpenPrefs.h"
--0302 0007ddfa2e4401200ee Page 2 of CPGPtools.cp
5c3a6b #include "PGPtools.h"
b2c01a #include "PGPtoolsEncryptDecrypt.h"
c16a4c #include "PGPtoolsPreferences.h"
29133f #include "PGPtoolsResources.h"
7d2aad #include "PGPtoolsUtils.h"
28f8d2 #include "PGPSharedEncryptDecrypt.h"
d204f5 #include "pgpFeatures.h"
b9e684 #include "pgpUserInterface.h"
a0a02f #include "pgpClientLib.h"
074919 #include "pgpUtilities.h"
0faf5a
e1b8eb #include "CDragTextEdit.h"
eb644c #include "CDropReceiver.h"
2ae213 #include "CPGPAMEditTextImp.h"
cf59c5 #include "CPGPStDialogHandler.h"
c13192 #include "CPGPtools.h"
f7bd6b #include "CPGPtoolsClipboardTask.h"
5f0537 #include "CPGPtoolsMainWindow.h"
97c756 #include "CPGPtoolsFileTask.h"
ce5c3c #include "CPGPtoolsWipeTask.h"
c0be50 #include "CPGPtoolsTaskList.h"
9c49e1 #include "CPGPtoolsTaskProgressDialog.h"
1aa29d #include "CPGPtoolsTextWindow.h"
9f0021 #include "CPicture.h"
97a4d3 #include "CResultsTable.h"
ae6d1f #include "CResultsWindow.h"
5a3def #include "CWipeFreeSpaceWizardDialog.h"
28af5a
f3c97b #include "pgpClientPrefs.h"
0c3991 #include "pgpAdminPrefs.h"
4094a0 #include "pgpLeaks.h"
a5a076 #include "pgpKeys.h"
9a4919 #include "pgpUtilities.h"
19c9be #include "pgpRandomPool.h"
c9e8b2 #include "pflPrefs.h"
de4720 #include "pflPrefTypes.h"
d5f5d2 #include "pgpMacCustomContextAlloc.h"
71628e #include "pgpClientErrors.h"
2caf5a
f2fa7b CPGPtools¤  ¤   *gApplication;
d9af5a
8c70ba Boolean CPGPtools::mAppCanEncrypt¤  ¤   ¤   = TRUE;
c864f3 Boolean CPGPtools::mAppCanSign¤ ¤   ¤   ¤   = TRUE;
8d418c Boolean CPGPtools::mAppCanDecryptVerify¤¤   = TRUE;
4e43cc short ¤ CPGPtools::mWipeFreeSpaceVRefNum¤   = 0;
e4af5a
f52ab9 // Note: Changing these definitions requires changing the command values
67010c // in the PPob resource for the buttons of the main window.
cfaf5a
e2105f const CommandT¤ cmd_PGPEncrypt¤ ¤   ¤   = 'Encr';
0f5b25 const CommandT¤ cmd_PGPSign¤¤   ¤   ¤   = 'Sign';
2fdb7a const CommandT¤ cmd_PGPEncryptSign¤ ¤   = 'EncS';
14f3d8 const CommandT¤ cmd_PGPDecryptVerify¤   = 'Decr';
b47020 const CommandT¤ cmd_PGPKeys¤¤   ¤   ¤   = 'Keys';
164cf4 const CommandT¤ cmd_PGPWipe¤¤   ¤   ¤   = 'Wipe';
c80a70 const CommandT¤ cmd_PGPWipeFreeSpace¤   = 'WipF';
30af5a
b5b041 const CommandT¤ cmd_ShowHideResults¤¤   = 'Resu';
1faf5a
003c2f //¤ Validate that that application can run on this machine. Return TRUE if we
5ba75f //¤ can run.
bcaf5a
50aee8 const ushort¤   kMinSystemVersion = 0x0710;
71af5a
fe2116 const ResIDT¤   kMinSystemVersionAlertResID¤= 2100;
982be4 const ResIDT¤   kNeed68020AlertResID¤   ¤   = 2101;
eb61bd const ResIDT¤   kBetaExpiredAlertResID¤ ¤   = 2102;
a6e66e const ResIDT¤   kNoAppearanceAlertResID¤¤   = 2103;
36af5a
81af5a
bd1d76 /* these are found in the "aedt" resource in PGPtools.rsrc */
7d2885 const long¤ ¤   ae_Sign¤¤   ¤   ¤   ¤   ¤   = 10000;
--69bd 000d489d339401200ee Page 3 of CPGPtools.cp
18f383 const long¤ ¤   ae_Encrypt¤ ¤   ¤   ¤   ¤   = 10001;
5416ec const long¤ ¤   ae_EncryptAndSign¤  ¤   ¤   = 10002;
33d425 const long¤ ¤   ae_DecryptVerify¤   ¤   ¤   = 10003;
4f517e const long¤ ¤   ae_OptionSign¤  ¤   ¤   ¤   = 10004;
40d082 const long¤ ¤   ae_OptionEncrypt¤   ¤   ¤   = 10005;
a34934 const long¤ ¤   ae_OptionEncryptAndSign¤¤   = 10006;
08d7d6 const long¤ ¤   ae_OptionDecryptVerify¤ ¤   = 10007;
47d2e5 const long¤ ¤   ae_SecureWipe¤  ¤   ¤   ¤   = 10008;
cea2ca const long¤ ¤   ae_OpenedFromMenu¤  ¤   ¤   = 10009;
f0af5a
fea45e const OSType¤   kFinderType¤¤   ¤   ¤   ¤   = 'FNDR';
8bfa9d const OSType¤   kFinderCreator¤ ¤   ¤   ¤   = 'MACS';
a7af5a
195c98 #if PGP_DEBUG
5824f8 const CommandT¤ cmd_DebugTest¤  ¤   ¤   ¤   = 10001;
647454 #endif
feaf5a
d8cd8d ¤   static Boolean
b5f86b VerifyEnvironment(void)
f9bb36 {
826022 ¤   ushort¤ systemVersion;
5267c5 ¤
9249fe ¤   systemVersion = GetSystemVersion();
5caf5a
26ec9e ¤   if( systemVersion < kMinSystemVersion )
4bc7a1 ¤   {
e078c2 ¤   ¤   Str255¤ versionString;
791b52 ¤   ¤
3cfb7d ¤   ¤   VersionToString( kMinSystemVersion, versionString );
e06740 ¤   ¤   ParamText( versionString, "\p", "\p", "\p" );
0ed13a ¤   ¤   StopAlert( kMinSystemVersionAlertResID, nil );
b2e20d ¤   ¤   return( FALSE );
fa9371 ¤   }
4faf5a
c49838 #if BETA
2e6711 ¤   if ( BetaExpired() )
c0c7a1 ¤   {
feb202 ¤   ¤   NoteAlert( kBetaExpiredAlertResID, nil );
3108ed ¤   ¤   // keep going
869371 ¤   }
1c7454 #endif
19af5a
93d673 #if PGP_DEMO
0ac47d ¤   if( ShowDemoDialog( TRUE ) == kDemoStateExpired )
57c7a1 ¤   {
41e20d ¤   ¤   return( FALSE );
fa9371 ¤   }
147454 #endif
8faf5a
29b9ee ¤   if( ! HaveAppearanceMgr() )
70c7a1 ¤   {
5cc41d ¤   ¤   Alert( kNoAppearanceAlertResID, NULL );
99e20d ¤   ¤   return( FALSE );
369371 ¤   }
1aaf5a
251966 ¤   return( TRUE );
0befe6 }
0faf5a
8633c8 ¤   static void
dcd2b9 RealMain( void ·)
b4bb36 {
2e3ea8 ¤   LGrowZone¤  ¤   *myGrowZoneObj;
8a67c5 ¤
642b2c ¤   MacLeaks_Suspend();¤
2867c5 ¤
72f81b ¤   myGrowZoneObj = new LGrowZone(20000);
0b67c5 ¤
3877d9 ¤   MacLeaks_Resume();
b667c5 ¤
99e0f0 ¤   CPGPtools theApp;
3bc25d ¤   theApp.Run();
d467c5 ¤
--b334 0000c291f6b401200ee Page 4 of CPGPtools.cp
0212b7 ¤   if( myGrowZoneObj != nil )
d92459 ¤   ¤   delete( myGrowZoneObj );
dcefe6 }
5daf5a
5b9cbf // Disable 68020 code generation for the 68020 check itself
3e6b23 #if GENERATING68K
868d08 ¤   #pragma code68020 off
e07454 #endif
d8af5a
4a6d52 ¤   void
1b7f68 main(void)
fbbb36 {
0fbaed ¤   long¤   gestaltResult;
2967c5 ¤
020462 ¤   // Check for a 68020 or later processor and bail immediately if none is
218fc7 ¤   // available.
fbc3ca ¤   if( Gestalt( gestaltProcessorType, &gestaltResult ) == noErr &&
f68237 ¤   ¤   gestaltResult >= gestalt68020 )
d7c7a1 ¤   {
fe4c25 ¤   ¤   // OK
9c9371 ¤   }
970e24 ¤   else
a2c7a1 ¤   {
e2f674 ¤   ¤   // Need to initialize the toolbox here. Cannot call
fcf863 ¤   ¤   // UQDGlobals::InitializeToolbox() because
99ac82 ¤   ¤   // we cannot control the code generation there.
fb1b52 ¤   ¤
2a2c5d ¤   ¤   MaxApplZone();
97ad43 ¤   ¤   InitGraf( (Ptr) &qd.thePort );
ad40cc ¤   ¤   InitFonts();
d30162 ¤   ¤   InitWindows();
0bcbf9 ¤   ¤   InitMenus();
80f7b0 ¤   ¤   TEInit();
4dcde6 ¤   ¤   InitDialogs( nil );
171b52 ¤   ¤
75a65e ¤   ¤   StopAlert( kNeed68020AlertResID, nil );
2099bf ¤   ¤   return;
1e9371 ¤   }
30af5a
7cb0df ¤   //The following calls determine the Debug state for PowerPlant,
924de0 ¤   //and should be set appropriately.
a067c5 ¤
2285ad ¤   //debugAction_Nothing
6ad834 ¤   //debugAction_Alert
558625 ¤   //debugAction_LowLevelDebugger
17555a ¤   //debugAction_SourceDebugger
0faf5a
625c98 #if PGP_DEBUG
a135b2 ¤   gDebugThrow = debugAction_LowLevelDebugger;
f982d0 ¤   gDebugSignal = debugAction_LowLevelDebugger;
5f7454 #endif
7daf5a
77992b ¤   InitializeHeap(3);¤ ¤   // Number of Master Pointer blocks to allocate
0b1fc2 ¤   UQDGlobals::InitializeToolbox(&qd);
88bc3c ¤   UnloadScrap();
3267c5 ¤
672681 ¤   DebugPatches_PatchDisposeTraps();
30af5a
6b5bbb ¤   if( VerifyEnvironment() )
81c7a1 ¤   {
74dadd ¤   ¤   #if USE_MAC_DEBUG_LEAKS
d437ed ¤   ¤   { CForceInitLPeriodical¤temp; }
edd656 ¤   ¤   #endif
b81b52 ¤   ¤
f86263 ¤   ¤   pgpLeaksBeginSession("main");
fc9da8 ¤   ¤   ¤   RealMain();
fc04a1 ¤   ¤   ¤   URegistrar::DisposeClassTable();
fd5bc9 ¤   ¤   pgpLeaksEndSession();
329371 ¤   }
02efe6 }
2caf5a
0c6b23 #if GENERATING68K
--c8b3 0007ca78b76401200ee Page 5 of CPGPtools.cp
04210c ¤   #pragma code68020 reset
ca7454 #endif
09af5a
b5c33c CPGPtools::CPGPtools() :
62bd55 ¤   ¤   LApplication()
8ebb36 {
83dd0d ¤   PGPFlags¤   featureFlags;
4b67c5 ¤
a3709f ¤   mAutoQuit¤  ¤   ¤   ¤   = FALSE;
778933 ¤   mUserLaunchedAppOnly¤   = FALSE;
f309c0 ¤   mMainWindow ¤   ¤   ¤   = NULL;
5f99b6 ¤   mResultsWindow¤ ¤   ¤   = NULL;
58b1a0 ¤   mWipeFreeDialog¤¤   ¤   = NULL;
fd5238 ¤   gApplication¤   ¤   ¤   = this;
9093a3 ¤   mApplicationResFile¤¤   = CurResFile();
f726e6 ¤   mAppCanEncrypt¤ ¤   ¤   = TRUE;
02c308 ¤   mAppCanSign¤¤   ¤   ¤   = TRUE;
0423db ¤   mAppCanDecryptVerify¤   = TRUE;
3467c5 ¤
78d924 ¤   mContext¤   = kInvalidPGPContextRef;
b8ef3f ¤   mTLSContext¤= kInvalidPGPtlsContextRef;
f767c5 ¤
c89838 #if BETA
600bf4 ¤   if( BetaExpired() )
f2c7a1 ¤   {
78212b ¤   ¤   mAppCanEncrypt¤ = FALSE;
3145f5 ¤   ¤   mAppCanSign¤¤   = FALSE;
259371 ¤   }
377454 #endif
e8af5a
99d673 #if PGP_DEMO
7dc057 ¤   if( mAppCanEncrypt || mAppCanSign )
24c7a1 ¤   {
059d71 ¤   ¤   if( GetDemoState() ==
fb76fd ¤   ¤   ¤   kDemoStateEncryptionSigningDisabled )
815b34 ¤   ¤   {
11c267 ¤   ¤   ¤   mAppCanEncrypt ¤= FALSE;
7f0dfa ¤   ¤   ¤   mAppCanSign ¤   = FALSE;
bf0fe4 ¤   ¤   }
639371 ¤   }
c37454 #endif
feaf5a
6eef03 ¤   // Check the SDK to see if we can encrypt/sign
8767c5 ¤
1d949e ¤   if( IsntPGPError( PGPGetFeatureFlags( kPGPFeatures_GeneralSelector,
14c741 ¤   ¤   ¤   &featureFlags ) ) )
3fc7a1 ¤   {
1c283d ¤   ¤   if( ! PGPFeatureExists( featureFlags, kPGPFeatureMask_CanEncrypt ) )
c45b34 ¤   ¤   {
165778 ¤   ¤   ¤   mAppCanEncrypt = FALSE;
e50fe4 ¤   ¤   }
f9af5a
784bb3 ¤   ¤   if( ! PGPFeatureExists( featureFlags, kPGPFeatureMask_CanSign ) )
905b34 ¤   ¤   {
b310ee ¤   ¤   ¤   mAppCanSign = FALSE;
400fe4 ¤   ¤   }
4eaf5a
c72caa ¤   ¤   if( ( ! PGPFeatureExists( featureFlags, kPGPFeatureMask_CanDecrypt)) ||
29f39a ¤   ¤   ¤   ( ! PGPFeatureExists( featureFlags, kPGPFeatureMask_CanVerify)) )
955b34 ¤   ¤   {
378a8c ¤   ¤   ¤   mAppCanDecryptVerify = FALSE;
b90fe4 ¤   ¤   }
ec9371 ¤   }
6267c5 ¤
7c6b6b ¤   UEnvironment::InitEnvironment();
4778cd ¤   UGraphicUtils::InitGraphicsUtilities();
ceaf5a
7b15f6 ¤   // PP 1.8 has a new memory leak inside URegistrar. Suspend leaks for the
b74483 ¤   // first call to RegisterClass_ to ignore this leak.
9d4800 MacLeaks_Suspend();
567e8d ¤   RegisterClass_( LPane );
7cab7a MacLeaks_Resume();¤
--b4b1 000e1f3c27a401200ee Page 6 of CPGPtools.cp
2a67c5 ¤
612e39 ¤   // Standard PowerPlant classes
bfd3d8 ¤   RegisterClass_( LActiveScroller );
bb169d ¤   RegisterClass_( LCaption );
1b2dd2 ¤   RegisterClass_( LGADialog );
e4ed01 ¤   RegisterClass_( LPicture );
149411 ¤   RegisterClass_( LTextEditView );
3d323d ¤   RegisterClass_( LView );
70bb9e ¤   RegisterClass_( LWindow );
d8af5a
e941d9 ¤   RegisterClass_( LBevelButton );
a819fb ¤   RegisterClass_( LCmdBevelButton );
f4a17b ¤   RegisterClass_( LEditText );
5b8652 ¤   RegisterClass_( LIconControl );
30fa52 ¤   RegisterClass_( LPopupButton );
2cb90b ¤   RegisterClass_( LProgressBar );
7b0848 ¤   RegisterClass_( LPushButton );
a81462 ¤   RegisterClass_( LSeparatorLine );
21da19 ¤   RegisterClass_( LStaticText );
984a05 ¤   RegisterClass_( LTextGroupBox );
8967c5 ¤
7d3ebd ¤   // Register Appearance Manager implementations
36af5a
f2f0b7 ¤   (void) RegisterAppearanceClient();
9c67c5 ¤
5b270b ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LBevelButton::imp_class_ID );
9e7038 ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LIconControl::imp_class_ID );
2eae52 ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LProgressBar::imp_class_ID );
26963d ¤   RegisterClassID_( LAMControlImp,¤   ¤   LSeparatorLine::imp_class_ID );
2fb4d4 ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LTextGroupBox::imp_class_ID );¤ ¤
90dd65 ¤   RegisterClassID_( LAMPopupButtonImp, ¤  LPopupButton::imp_class_ID );
b2b779 ¤   RegisterClassID_( LAMPushButtonImp,¤¤   LPushButton::imp_class_ID );
ea1ecd ¤   RegisterClassID_( LAMStaticTextImp,¤¤   LStaticText::imp_class_ID );
a605f3 ¤   RegisterClassID_( CPGPAMEditTextImp,¤   LEditText::imp_class_ID );
3a67c5 ¤
c0bdea ¤   // Custom class declarations
da6c20 ¤   RegisterClass_( CDragTextEdit );
c89039 ¤   RegisterClass_( CPGPtoolsMainWindow );
650813 ¤   RegisterClass_( CPGPtoolsTaskProgressDialog );
0f3793 ¤   RegisterClass_( CPGPtoolsTextWindow );
4a6575 ¤   RegisterClass_( CPicture );
d07018 ¤   RegisterClass_( CResultsTable );
b6d74a ¤   RegisterClass_( CResultsWindow );
7d2001 ¤   RegisterClass_( CVersionCaption );
254909 ¤   RegisterClass_( CWarningAlert );
a467c5 ¤
2423a9 ¤   // We do not want the default behavior of RegisterClass__ for this class
c7f747 ¤   URegistrar::RegisterClass( CDropReceiver::class_ID,
02ccdd ¤   ¤   ¤   ¤   (ClassCreatorFunc) CDropReceiver::CreateFromStream );
3defe6 }
afaf5a
52af5a
8cd3e1 CPGPtools::~CPGPtools()
47bb36 {
83efe6 }
47af5a
a27e69 ¤   Boolean
81225b CPGPtools::AppCanDoOperation(PGPtoolsOperation operation)
ebbb36 {
480e6d ¤   Boolean¤canDo = FALSE;
8667c5 ¤
7cb643 ¤   switch( operation )
acc7a1 ¤   {
be022a ¤   ¤   case kPGPtoolsInvalidOperation:
b6287f ¤   ¤   ¤   canDo = FALSE;
68cdcb ¤   ¤   ¤   break;
7987c7 ¤   ¤   ¤
b747e3 ¤   ¤   case kPGPtoolsEncryptOperation:
65e10c ¤   ¤   ¤   canDo = mAppCanEncrypt;
37cdcb ¤   ¤   ¤   break;
01af5a
e141e9 ¤   ¤   case kPGPtoolsSignOperation:
--4a08 000ecca3e36401200ee Page 7 of CPGPtools.cp
431054 ¤   ¤   ¤   canDo = mAppCanSign;
dacdcb ¤   ¤   ¤   break;
51af5a
986827 ¤   ¤   case kPGPtoolsEncryptSignOperation:
6d6efc ¤   ¤   ¤   canDo = (mAppCanEncrypt && mAppCanSign);
30cdcb ¤   ¤   ¤   break;
56af5a
949996 ¤   ¤   case kPGPtoolsDecryptVerifyOperation:
d4efe4 ¤   ¤   ¤   canDo = mAppCanDecryptVerify;
59cdcb ¤   ¤   ¤   break;
1187c7 ¤   ¤   ¤
43a6c1 ¤   ¤   case kPGPtoolsWipeOperation:
48acd1 ¤   ¤   case kPGPtoolsWipeFreeSpaceOperation:
97f589 ¤   ¤   ¤   canDo = TRUE;
14cdcb ¤   ¤   ¤   break;
dcaf5a
459ae3 ¤   ¤   default:
f90af6 ¤   ¤   ¤   pgpDebugMsg( "CPGPtools::AppCanDoOperation: Unknown op" );
a2287f ¤   ¤   ¤   canDo = FALSE;
4dcdcb ¤   ¤   ¤   break;
fd9371 ¤   }
c067c5 ¤
012210 ¤   return( canDo );¤
34efe6 }
52af5a
bac744 ¤   PGPError
03dabf CPGPtools::UpdateContext(Boolean verifyKeyRings)
f5bb36 {
e38e12 ¤   PGPError¤   err = kPGPError_NoErr;
e9af5a
95a33f ¤   pgpAssert( PGPContextRefIsValid( mContext ) );
2c67c5 ¤
60dd64 ¤   err = LoadPreferences( mContext );
1a5a49 ¤   if( IsntPGPError( err ) && verifyKeyRings )
51c7a1 ¤   {
60f03a ¤   ¤   UInt32¤ ¤   numPublicKeys = 0;
064b82 ¤   ¤   UInt32¤ ¤   numPrivateKeys = 0;
dcaf5a
ca897f ¤   ¤   err = CountKeysInDefaultKeyring( mContext, &numPublicKeys,
1161dd ¤   ¤   ¤   ¤   ¤   &numPrivateKeys );
3b4422 ¤   ¤   if( IsntPGPError( err ) ·)
0b5b34 ¤   ¤   {
26805a ¤   ¤   ¤   short¤  strIndex = 0;
1b87c7 ¤   ¤   ¤
db487e ¤   ¤   ¤   if( numPublicKeys == 0 )
29f776 ¤   ¤   ¤   {
37eb50 ¤   ¤   ¤   ¤   if( numPrivateKeys == 0 )
9172c3 ¤   ¤   ¤   ¤   {
d6f4cd ¤   ¤   ¤   ¤   ¤   strIndex = kNoKeysFoundStrIndex;
e62613 ¤   ¤   ¤   ¤   }
a5fa07 ¤   ¤   ¤   ¤   else
7f72c3 ¤   ¤   ¤   ¤   {
41c158 ¤   ¤   ¤   ¤   ¤   strIndex = kNoPublicKeysFoundStrIndex;
072613 ¤   ¤   ¤   ¤   }
93a3a6 ¤   ¤   ¤   }
0a824e ¤   ¤   ¤   else if( numPrivateKeys == 0 )
f9f776 ¤   ¤   ¤   {
dd3c8d ¤   ¤   ¤   ¤   strIndex = kNoPrivateKeysFoundStrIndex;
7869c5 ¤   ¤   ¤   }¤  ¤
bb1b52 ¤   ¤
ad19d3 ¤   ¤   ¤   if( strIndex != 0 )
248cf3 ¤   ¤   ¤   {¤
244b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
99f887 ¤   ¤   ¤   ¤   CWarningAlert::Display( kWACautionAlertType, kWAOKStyle,
564a37 ¤   ¤   ¤   ¤   ¤   ¤   kErrorStringListResID, strIndex );
d2a3a6 ¤   ¤   ¤   }
d60fe4 ¤   ¤   }
050e1d ¤   ¤   else
115b34 ¤   ¤   {
fb5321 ¤   ¤   ¤   short¤  strIndex;
929f50 ¤   ¤   ¤   Str255¤ errorString;
eca50e ¤   ¤   ¤   char¤   cError[ 256 ];
--f4af 000a3a93423401200ee Page 8 of CPGPtools.cp
9f2b85 ¤   ¤   ¤   ¤
635a48 ¤   ¤   ¤   if( err == kPGPError_FileNotFound )
aaf776 ¤   ¤   ¤   {
8010ba ¤   ¤   ¤   ¤   strIndex = kNoKeyringsFoundStrIndex;
e2bd37 ¤   ¤   ¤   ¤   err = kPGPError_NoErr;
dfa3a6 ¤   ¤   ¤   }
d3bb8c ¤   ¤   ¤   else
5df776 ¤   ¤   ¤   {
f03c6b ¤   ¤   ¤   ¤   strIndex = kLibraryInitErrorStrIndex;
5ca3a6 ¤   ¤   ¤   }
3b87c7 ¤   ¤   ¤
cf6e4c ¤   ¤   ¤   PGPGetClientErrorString( err, sizeof( cError ), cError );
2d1542 ¤   ¤   ¤   CToPString( cError, errorString );
3087c7 ¤   ¤   ¤
27c2cb ¤   ¤   ¤   SysBeep( 1 );
3fa894 ¤   ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
bece8c ¤   ¤   ¤   ¤   kErrorStringListResID, strIndex, errorString );
410fe4 ¤   ¤   }
bc9371 ¤   }
6d67c5 ¤
74deb7 ¤   return( err );
9cefe6 }
a5af5a
946d52 ¤   void
12e468 CPGPtools::Initialize(void)
77bb36 {
4968d2 ¤   StartIdling();
9a67c5 ¤
851dd8 ¤   mMainWindow = (CPGPtoolsMainWindow *) LWindow::CreateWindow(window_Main,
cd3407 ¤   ¤   ¤   ¤   ¤   ¤   ¤   this);
93521a ¤   pgpAssertAddrValid( mMainWindow, VoidAlign );
a0af5a
7ff468 ¤   if( IsntNull( mMainWindow ) )
e1c7a1 ¤   {
5640fb ¤   ¤   if( gPreferences.mainWindowLocation.v != 0 ||
0b61bc ¤   ¤   ¤   gPreferences.mainWindowLocation.h != 0 )
e65b34 ¤   ¤   {
dad68b ¤   ¤   ¤   mMainWindow->DoSetPosition( gPreferences.mainWindowLocation );
2e0fe4 ¤   ¤   }
861b52 ¤   ¤
ca9371 ¤   }
5367c5 ¤
a7f8df ¤   mResultsWindow = (CResultsWindow *) LWindow::CreateWindow(
6ace08 ¤   ¤   ¤   window_Results, this);
bda815 ¤   pgpAssertAddrValid( mResultsWindow, VoidAlign );
1467c5 ¤
f91a73 ¤   if( IsntNull( mResultsWindow ) )
1cc7a1 ¤   {
e4b850 ¤   ¤   if( ! EmptyRect( &gPreferences.resultsWindowBounds ) )
765b34 ¤   ¤   {
65f8c7 ¤   ¤   ¤   mResultsWindow->DoSetBounds( gPreferences.resultsWindowBounds );
2b0fe4 ¤   ¤   }
eb9371 ¤   }
22af5a
875c98 #if PGP_DEBUG
d524fd ¤   InstallDebugMenu();
637454 #endif
6befe6 }
fcaf5a
93577b // Allow for more environment checking after the app is fully initialized.
ab3ffc // If the function returns FALSE, the app will quit.
ffaf5a
647e69 ¤   Boolean
18fe85 CPGPtools::SecondaryVerifyEnvironment(void)
76bb36 {
21b8e5 ¤   CComboError¤err;
6390c4 ¤   Boolean¤¤   canRun = TRUE;
b767c5 ¤
26be29 #if PGP_BUSINESS_SECURITY
2c29a8 ¤   PGPBoolean¤ adminConfig;
1b67c5 ¤
a34fb1 ¤   err.pgpErr = PGPIsAdminConfigured( &adminConfig );
--c57e 000b6d7eacf401200ee Page 9 of CPGPtools.cp
df83cb ¤   if( adminConfig )
64c7a1 ¤   {
909fc8 ¤   ¤   PGPPrefRef¤ prefsRef;
b6af5a
1da6ab ¤   ¤   // Check for the presence of an Admin Prefs file. If not found,
5d6a7e ¤   ¤   // disable encryption/signing.
4a1b52 ¤   ¤
e91d78 ¤   ¤   if( IsntPGPError( PGPOpenAdminPrefs( PGPGetContextMemoryMgr( mContext ),
2ed379 ¤   ¤   ¤   ¤   ¤   ¤   &prefsRef ) ) )
d85b34 ¤   ¤   {
89f322 ¤   ¤   ¤   PGPClosePrefFile( prefsRef );
a2af5a
0a66fd ¤   ¤   ¤   err.pgpErr = PGPCheckAutoUpdateKeysFromServer(
947cd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( mContext ),
a2fe9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TRUE, NULL, NULL);
2f0fe4 ¤   ¤   }
080e1d ¤   ¤   else
285b34 ¤   ¤   {
b8c2cb ¤   ¤   ¤   SysBeep( 1 );
3ffff1 ¤   ¤   ¤   CWarningAlert::Display( kWACautionAlertType, kWAOKStyle,
20afde ¤   ¤   ¤   ¤   ¤   ¤   ¤   kErrorStringListResID,
242501 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoAdminPrefsFileFoundStrIndex );
93531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
2e7aa4 ¤   ¤   ¤   canRun = FALSE;
4a0fe4 ¤   ¤   }
7e9371 ¤   }
6467c5 ¤
a17454 #endif
6daf5a
386116 ¤   if( canRun )
91c7a1 ¤   {
9d41a7 ¤   ¤   // Display no keyring found dialog if needed.
3ef5dc ¤   ¤   canRun = IsntPGPError( UpdateContext( TRUE ) );
f09371 ¤   }
86af5a
0357eb ¤   return( canRun );
28efe6 }
40af5a
cf7e69 ¤   Boolean
e694f3 CPGPtools::ObeyCommand(
e9ea24 ¤   CommandT¤   inCommand,
1b0597 ¤   void¤   ¤   *ioParam)
5dbb36 {
625b52 ¤   Boolean¤¤   cmdHandled = true;
11af5a
95c469 ¤   switch (inCommand)
b7c7a1 ¤   {
a876b7 ¤   ¤   case cmd_PGPEncrypt:
2b922a ¤   ¤   ¤   CreateAndEnqueueTaskPrompt( kPGPtoolsEncryptOperation );
b8cdcb ¤   ¤   ¤   break;
6a87c7 ¤   ¤   ¤
1f6c92 ¤   ¤   case cmd_PGPSign:
c8b35e ¤   ¤   ¤   CreateAndEnqueueTaskPrompt( kPGPtoolsSignOperation );
afcdcb ¤   ¤   ¤   break;
7d87c7 ¤   ¤   ¤
41411a ¤   ¤   case cmd_PGPEncryptSign:
8e8fc2 ¤   ¤   ¤   CreateAndEnqueueTaskPrompt( kPGPtoolsEncryptSignOperation );
f7cdcb ¤   ¤   ¤   break;
b2af5a
c2961d ¤   ¤   case cmd_PGPDecryptVerify:
6d3da3 ¤   ¤   ¤   CreateAndEnqueueTaskPrompt( kPGPtoolsDecryptVerifyOperation );
6fcdcb ¤   ¤   ¤   break;
90af5a
33c118 ¤   ¤   case cmd_PGPWipe:
e2cd1c ¤   ¤   ¤   CreateAndEnqueueTaskPrompt( kPGPtoolsWipeOperation );
1ccdcb ¤   ¤   ¤   break;
eb1b52 ¤   ¤
27a356 ¤   ¤   case cmd_PGPWipeFreeSpace:
d5abaa ¤   ¤   ¤   WipeFreeSpace();
c9cdcb ¤   ¤   ¤   break;
d087c7 ¤   ¤   ¤
b66f43 ¤   ¤   case cmd_PGPKeys:
--834f 000c3c81abb401200ee Page 10 of CPGPtools.cp
a339ed ¤   ¤   ¤   LaunchPGPkeys();
facdcb ¤   ¤   ¤   break;
2aaf5a
139562 ¤   ¤   case cmd_Preferences:
985b34 ¤   ¤   {
b3e46c ¤   ¤   ¤   PGPError¤   err;
8587c7 ¤   ¤   ¤
48dd8b ¤   ¤   ¤   UDesktop::Deactivate();
0187c7 ¤   ¤   ¤
c8991e ¤   ¤   ¤   err = PGPPreferencesDialog( mContext, kInvalidPGPKeySetRef,
46bbad ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPPrefRef, kInvalidPGPPrefRef, NULL );
2494aa ¤   ¤   ¤   ¤   ¤   ¤
dae678 ¤   ¤   ¤   UDesktop::Activate();
15af5a
a3698b ¤   ¤   ¤   if( IsntPGPError( err ) )
aff776 ¤   ¤   ¤   {
cafda7 ¤   ¤   ¤   ¤   UpdateContext( FALSE );
41a3a6 ¤   ¤   ¤   }
a487c7 ¤   ¤   ¤
85cdcb ¤   ¤   ¤   break;
020fe4 ¤   ¤   }
0887c7 ¤   ¤   ¤
9db445 ¤   ¤   case cmd_ShowHideResults:
1a5b34 ¤   ¤   {
4fd682 ¤   ¤   ¤   if( mResultsWindow->IsVisible() )
54f776 ¤   ¤   ¤   {
8cd9dc ¤   ¤   ¤   ¤   mResultsWindow->Hide();
c5a3a6 ¤   ¤   ¤   }
1bbb8c ¤   ¤   ¤   else
c6f776 ¤   ¤   ¤   {
e4ced7 ¤   ¤   ¤   ¤   mResultsWindow->Select();
c235f0 ¤   ¤   ¤   ¤   mResultsWindow->Show();
a7a3a6 ¤   ¤   ¤   }
5d87c7 ¤   ¤   ¤
cfcdcb ¤   ¤   ¤   break;
070fe4 ¤   ¤   }
b2af5a
eb5c98 #if PGP_DEBUG
f0f185 ¤   ¤   case cmd_DebugTest:
ff86ff ¤   ¤   ¤   DebugTest();
84cdcb ¤   ¤   ¤   break;
ea7454 #endif
691b52 ¤   ¤
3a9ae3 ¤   ¤   default:
cae7f2 ¤   ¤   ¤   cmdHandled = LApplication::ObeyCommand(inCommand, ioParam);
b7cdcb ¤   ¤   ¤   break;
9d9371 ¤   }
7d67c5 ¤
6751a4 ¤   return cmdHandled;
67efe6 }
80af5a
916d52 ¤   void
32f5b8 CPGPtools::FindCommandStatus(
01ea24 ¤   CommandT¤   inCommand,
94a472 ¤   Boolean¤¤   &outEnabled,
0d3a4d ¤   Boolean¤¤   &outUsesMark,
1f5dc0 ¤   Char16¤ ¤   &outMark,
abd894 ¤   Str255¤ ¤   outName)
93bb36 {
f7c469 ¤   switch (inCommand)
d0c7a1 ¤   {
7176b7 ¤   ¤   case cmd_PGPEncrypt:
28e4fa ¤   ¤   ¤   outEnabled = AppCanDoOperation( kPGPtoolsEncryptOperation );
8acdcb ¤   ¤   ¤   break;
d8af5a
9f6c92 ¤   ¤   case cmd_PGPSign:
ff23da ¤   ¤   ¤   outEnabled = AppCanDoOperation( kPGPtoolsSignOperation );
7ecdcb ¤   ¤   ¤   break;
d4af5a
9c411a ¤   ¤   case cmd_PGPEncryptSign:
e621bb ¤   ¤   ¤   outEnabled = AppCanDoOperation( kPGPtoolsEncryptSignOperation );
c3cdcb ¤   ¤   ¤   break;
--a196 000258a319d401200ee Page 11 of CPGPtools.cp
e587c7 ¤   ¤   ¤
6b961d ¤   ¤   case cmd_PGPDecryptVerify:
d3560b ¤   ¤   ¤   outEnabled = AppCanDoOperation( kPGPtoolsDecryptVerifyOperation );
e7cdcb ¤   ¤   ¤   break;
e787c7 ¤   ¤   ¤
49c118 ¤   ¤   case cmd_PGPWipe:
d95d98 ¤   ¤   ¤   outEnabled = AppCanDoOperation( kPGPtoolsWipeOperation );
d9cdcb ¤   ¤   ¤   break;
3faf5a
d3a356 ¤   ¤   case cmd_PGPWipeFreeSpace:
033b4b ¤   ¤   ¤   outEnabled = AppCanDoOperation( kPGPtoolsWipeFreeSpaceOperation );
4dcdcb ¤   ¤   ¤   break;
cc1b52 ¤   ¤
286f43 ¤   ¤   case cmd_PGPKeys:
fe9562 ¤   ¤   case cmd_Preferences:
97e6cf ¤   ¤   ¤   outEnabled = TRUE;
c6cdcb ¤   ¤   ¤   break;
a2af5a
1db445 ¤   ¤   case cmd_ShowHideResults:
425b34 ¤   ¤   {
ad5321 ¤   ¤   ¤   short¤  strIndex;
8b87c7 ¤   ¤   ¤
71d682 ¤   ¤   ¤   if( mResultsWindow->IsVisible() )
63f776 ¤   ¤   ¤   {
a0ac3d ¤   ¤   ¤   ¤   strIndex = kHideResultsStrIndex;
aca3a6 ¤   ¤   ¤   }
88bb8c ¤   ¤   ¤   else
93f776 ¤   ¤   ¤   {
03ffcb ¤   ¤   ¤   ¤   strIndex = kShowResultsStrIndex;
fca3a6 ¤   ¤   ¤   }
d9af5a
22e6cf ¤   ¤   ¤   outEnabled = TRUE;
ec762b ¤   ¤   ¤   GetIndString( outName, kPGPtoolsMiscStringsResID, strIndex );
e52b85 ¤   ¤   ¤   ¤
fecdcb ¤   ¤   ¤   break;
b50fe4 ¤   ¤   }
6a87c7 ¤   ¤   ¤
db5c98 #if PGP_DEBUG
ecf185 ¤   ¤   case cmd_DebugTest:
3de6cf ¤   ¤   ¤   outEnabled = TRUE;
aacdcb ¤   ¤   ¤   break;
1b7454 #endif
dbaf5a
659ae3 ¤   ¤   default:
e1131d ¤   ¤   ¤   LApplication::FindCommandStatus(inCommand, outEnabled,
a59a8f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outUsesMark, outMark, outName);
37cdcb ¤   ¤   ¤   break;
729371 ¤   }
a6efe6 }
54af5a
c133c8 ¤   static void
ab3bed MakeLicenseStr(
8435f6 ¤   PGPContextRef ¤ context,
48823c ¤   StringPtr ¤ ¤   outLicenseStr)
d8bb36 {
5361e0 ¤   PGPError¤   err;
71f19b ¤   PGPPrefRef¤ prefRef;
9daf5a
6d4e3c ¤   outLicenseStr[0] = 0;
8c67c5 ¤
e1c067 ¤   err = PGPOpenClientPrefs( PGPGetContextMemoryMgr( context ), &prefRef );
7fb1f0 ¤   if( IsntPGPError( err ) )
81c7a1 ¤   {
adf7d1 ¤   ¤   char¤   companyStr[128];
513c32 ¤   ¤   char¤   nameStr[128];
b2c481 ¤   ¤   char¤   str[256];
04af5a
7f4852 ¤   ¤   err = PGPGetPrefStringBuffer( prefRef, kPGPPrefOwnerName,
bb70de ¤   ¤   ¤   ¤   ¤   sizeof( nameStr ) - 1, nameStr );
5e9832 ¤   ¤   pgpAssertNoErr( err );
33af5a
257408 ¤   ¤   companyStr[0] = '\0';
--0487 00026ae77a6401200ee Page 12 of CPGPtools.cp
7b5989 #if¤PGP_BUSINESS_SECURITY
94d4ca ¤   ¤   PGPPrefRef¤ adminPref;
3a1b52 ¤   ¤
a935a7 ¤   ¤   err = PGPOpenAdminPrefs( PGPGetContextMemoryMgr( context ),
137463 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &adminPref );
c986f8 ¤   ¤   if( IsntPGPError( err ) )
ae5b34 ¤   ¤   {
2ae6e0 ¤   ¤   ¤   err = PGPGetPrefStringBuffer( adminPref,
df3227 ¤   ¤   ¤   ¤   ¤   kPGPPrefAdminCompanyName,
87912e ¤   ¤   ¤   ¤   ¤   sizeof( companyStr ) - 1, companyStr );
32144d ¤   ¤   ¤   pgpAssertNoErr( err );
2387c7 ¤   ¤   ¤
8910c0 ¤   ¤   ¤   (void) PGPClosePrefFile( adminPref );
940fe4 ¤   ¤   }
657454 #endif
cc2b03 ¤   ¤   if( companyStr[0] == '\0' )
475b34 ¤   ¤   {
f0c4ca ¤   ¤   ¤   err = PGPGetPrefStringBuffer( prefRef, kPGPPrefCompanyName,
295532 ¤   ¤   ¤   ¤   ¤   ¤   sizeof( companyStr ) - 1, companyStr );
44144d ¤   ¤   ¤   pgpAssertNoErr( err );
9e0fe4 ¤   ¤   }
65af5a
f98c7c ¤   ¤   CopyCString( nameStr, str );
38bcc7 ¤   ¤   strcat( str, "\r");
9d930c ¤   ¤   strcat( str, companyStr );
27c67f ¤   ¤   CToPString( str, outLicenseStr );
46af5a
fdb512 ¤   ¤   (void) PGPClosePrefFile( prefRef );
cd9371 ¤   }
b6efe6 }
62af5a
626d52 ¤   void
8a8c06 CPGPtools::WipeFreeSpaceWizard(short defaultVRefNum)
3cbb36 {
1edbae ¤   if( IsNull( mWipeFreeDialog ) )
50c7a1 ¤   {
960f19 ¤   ¤   RegisterClass_( CWipeFreeSpaceWizardDialog );
dbaf5a
3192e6 ¤   ¤   mWipeFreeDialog = (CWipeFreeSpaceWizardDialog *)
97fd93 ¤   ¤   ¤   ¤   ¤   ¤   ¤   LWindow::CreateWindow(
cc6ca9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   window_WipeFreeSpace, this );
df1b52 ¤   ¤
114803 ¤   ¤   mWipeFreeDialog->AddListener( this );
425674 ¤   ¤   mWipeFreeDialog->SetParams( mContext, defaultVRefNum );
049371 ¤   }
fdefe6 }
4daf5a
7b6d52 ¤   void
dc5b3e CPGPtools::ShowAboutBox()
5dbb36 {
ba1ed3 ¤   Boolean¤¤   didShowDialog = FALSE;
aa5215 ¤   FSSpec¤ ¤   libraryFileSpec;
ff7c3e ¤   CToolsError¤err;
6a67c5 ¤
013cd0 ¤   // Open the libarary resource file at the top of the resource chain so
e7503d ¤   // we get our pictures.
01f7ee ¤   if( IsntErr( PGPGetClientLibFSSpec( &libraryFileSpec ) ) )
61c7a1 ¤   {
fb0fff ¤   ¤   short¤  saveResFile;
7aface ¤   ¤   short¤  libFileRefNum;
021b52 ¤   ¤
1d31ea ¤   ¤   saveResFile = CurResFile();
851b52 ¤   ¤
bdf446 ¤   ¤   libFileRefNum = FSpOpenResFile( &libraryFileSpec, fsRdPerm );
730214 ¤   ¤   if( libFileRefNum > 0 )
4a5b34 ¤   ¤   {
63a680 ¤   ¤   ¤   UseResFile( libFileRefNum );
7687c7 ¤   ¤   ¤
e9f776 ¤   ¤   ¤   {
dd26fe ¤   ¤   ¤   ¤   CPGPStDialogHandler¤aboutDialog(window_About, this);
f3933c ¤   ¤   ¤   ¤   LWindow¤¤   ¤   ¤   *theDialog;
268f11 ¤   ¤   ¤   ¤   MessageT¤   ¤   ¤   message;
--2160 00096791df0401200ee Page 13 of CPGPtools.cp
533ab1 ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   credits = FALSE;
50b135 ¤   ¤   ¤   ¤   Str255¤ ¤   ¤   ¤   licenseStr;
e02b85 ¤   ¤   ¤   ¤
1a1acb ¤   ¤   ¤   ¤   const MessageT¤ ¤   kPGPButtonMessage¤  ¤   = 'bPGP';
b69ca9 ¤   ¤   ¤   ¤   const MessageT¤ ¤   kCreditsButtonMessage¤  = 'bCre';
e639bb ¤   ¤   ¤   ¤   const MessageT¤ ¤   kOKButtonMessage¤   ¤   = 'bOK ';
c22b85 ¤   ¤   ¤   ¤
ce110c ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   kCreditsButtonPaneID¤   = 'bCre';
93fb84 ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   kAboutPicturePaneID¤¤   = 'APIC';
db4b4a ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   kCreditsPicturePaneID¤  = 'CPIC';
80fe6b ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   kBSAFEPicturePaneID¤¤   = 'RPIC';
9ede2b ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   kLicenseCaptionID¤  ¤   = 'cLic';
44af5a
f1c6a7 ¤   ¤   ¤   ¤   theDialog = aboutDialog.GetDialog();
082b85 ¤   ¤   ¤   ¤
1f1557 ¤   ¤   ¤   ¤   didShowDialog = true;
e22b85 ¤   ¤   ¤   ¤
c6ebbe ¤   ¤   ¤   ¤   MakeLicenseStr( mContext, licenseStr );
80a747 ¤   ¤   ¤   ¤   ((LCaption *)theDialog->FindPaneByID(kLicenseCaptionID))->
4f06aa ¤   ¤   ¤   ¤   ¤   ¤   SetDescriptor( licenseStr );
43af5a
73fccd ¤   ¤   ¤   ¤   while( (message = aboutDialog.DoDialog()) != kOKButtonMessage)
2b72c3 ¤   ¤   ¤   ¤   {
7670cb ¤   ¤   ¤   ¤   ¤   if(message == kPGPButtonMessage )
7b4859 ¤   ¤   ¤   ¤   ¤   {
f1f34f ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   url;
4694aa ¤   ¤   ¤   ¤   ¤   ¤
73f954 ¤   ¤   ¤   ¤   ¤   ¤   GetIndString( url, kPGPtoolsMiscStringsResID,
851f44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPWebSiteURLStrIndex );
df94aa ¤   ¤   ¤   ¤   ¤   ¤
577d15 ¤   ¤   ¤   ¤   ¤   ¤   err.err = OpenURL( url );
232fed ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsError() )
c98fec ¤   ¤   ¤   ¤   ¤   ¤   {
a5fe43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ errorStr;
28531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
6bc8c9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetErrorString( err, errorStr );
66531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
f6af0a ¤   ¤   ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
1d20cc ¤   ¤   ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display( kWACautionAlertType,
f4144f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
a2bef9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kErrorStringListResID,
2ed00c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCantLaunchWebBrowserBecauseStrIndex,
79f13f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   errorStr );
82db3c ¤   ¤   ¤   ¤   ¤   ¤   }
e61c89 ¤   ¤   ¤   ¤   ¤   }
f07fbb ¤   ¤   ¤   ¤   ¤   else if(message == kCreditsButtonPaneID)
974859 ¤   ¤   ¤   ¤   ¤   {
1eec2c ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ buttonTitle;
2594aa ¤   ¤   ¤   ¤   ¤   ¤
4e98c6 ¤   ¤   ¤   ¤   ¤   ¤   if( credits )
4e8fec ¤   ¤   ¤   ¤   ¤   ¤   {
a0d945 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kAboutPicturePaneID )->
7e124a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Show();
800594 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kCreditsPicturePaneID )->
eafe66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Hide();
ee37fe ¤   ¤   ¤   ¤   ¤   #if CREDIT_RSA_BSAFE
c5a85d ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kBSAFEPicturePaneID )->
8a6e50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Hide();
eaedfd ¤   ¤   ¤   ¤   ¤   #endif
bd531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
6cd102 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetIndString( buttonTitle,
a886ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPtoolsMiscStringsResID,
917ce2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAboutCreditsButtonTitleStrIndex );
9fdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
787f8b ¤   ¤   ¤   ¤   ¤   ¤   else
818fec ¤   ¤   ¤   ¤   ¤   ¤   {
cb0594 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kCreditsPicturePaneID )->
a8124a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Show();
7037fe ¤   ¤   ¤   ¤   ¤   #if CREDIT_RSA_BSAFE
32a85d ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kBSAFEPicturePaneID )->
9a827c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Show();
96edfd ¤   ¤   ¤   ¤   ¤   #endif
--1de0 000a8db229d401200ee Page 14 of CPGPtools.cp
a9d945 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kAboutPicturePaneID )->
1efe66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Hide();
23531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
d2d102 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetIndString( buttonTitle,
d086ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPtoolsMiscStringsResID,
ca4d82 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAboutInfoButtonTitleStrIndex );
98db3c ¤   ¤   ¤   ¤   ¤   ¤   }
4a94aa ¤   ¤   ¤   ¤   ¤   ¤
00c9b2 ¤   ¤   ¤   ¤   ¤   ¤   ((LPushButton *)theDialog->FindPaneByID(
d16879 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCreditsButtonPaneID))->SetDescriptor(
261cb1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   buttonTitle );
6faf5a
098879 ¤   ¤   ¤   ¤   ¤   ¤   credits = ! credits;
161c89 ¤   ¤   ¤   ¤   ¤   }
c82613 ¤   ¤   ¤   ¤   }
a1a3a6 ¤   ¤   ¤   }
f387c7 ¤   ¤   ¤
ab9e6b ¤   ¤   ¤   CloseResFile( libFileRefNum );
81ad2f ¤   ¤   ¤   UseResFile( saveResFile );
e60fe4 ¤   ¤   }
1b9371 ¤   }
6167c5 ¤
f99337 ¤   if( ! didShowDialog )
c8057e ¤   ¤   SysBeep( 1 );
44efe6 }
8caf5a
02af5a
670335 /*____________________________________________________________________________
f1aa63 ¤   Create and enqueue a file task for the specified operation.
d1f7f7 ____________________________________________________________________________*/
7efbb0 ¤   CToolsError
19ed2f CPGPtools::CreateAndEnqueueFileTaskList(
61aa6c ¤   PGPtoolsOperation¤  operation,
ef23a0 ¤   ushort¤ ¤   ¤   ¤   taskModifiers,
e26968 ¤   const FSSpec *¤ ¤   inputSpecs,
b037d1 ¤   PGPUInt16¤  ¤   ¤   numSpecs )
5dbb36 {
dbd1b2 ¤   CToolsError¤¤   ¤   err;
61c46c ¤   CPGPtoolsTaskList *¤taskList¤   = NULL;
5f67c5 ¤
59a657 ¤   taskList = new CPGPtoolsTaskList( operation );
ab494e ¤   if( IsntNull( taskList ) )
cdc7a1 ¤   {
2b1283 ¤   ¤   taskList->SetTaskListHasFileTasks( TRUE );
76af5a
b9c4b9 ¤   ¤   for( PGPUInt16 specIndex = 0; specIndex < numSpecs; ++specIndex )
035b34 ¤   ¤   {
220446 ¤   ¤   ¤   const FSSpec *¤ ¤   srcSpec;
802d29 ¤   ¤   ¤   CPGPtoolsTask *¤¤   task;
9687c7 ¤   ¤   ¤
d87318 ¤   ¤   ¤   srcSpec¤= &inputSpecs[ specIndex ];
19b974 ¤   ¤   ¤   AssertSpecIsValid( srcSpec, "CPGPtools::CreateAndEnqueueTask" );
4a87c7 ¤   ¤   ¤
a72303 ¤   ¤   ¤   if ( operation == kPGPtoolsWipeOperation )
34f776 ¤   ¤   ¤   {
cec512 ¤   ¤   ¤   ¤   task = new CPGPtoolsWipeTask( srcSpec );
26a3a6 ¤   ¤   ¤   }
abbb8c ¤   ¤   ¤   else
a3f776 ¤   ¤   ¤   {
009693 ¤   ¤   ¤   ¤   task = new CPGPtoolsFileTask( operation, srcSpec );
d3a3a6 ¤   ¤   ¤   }
0a87c7 ¤   ¤   ¤
a9824f ¤   ¤   ¤   if( IsntNull( task ) )
60f776 ¤   ¤   ¤   {
562971 ¤   ¤   ¤   ¤   task->SetTaskModifiers( taskModifiers );
fe0049 ¤   ¤   ¤   ¤   taskList->AppendTask( task );
75a3a6 ¤   ¤   ¤   }
afbb8c ¤   ¤   ¤   else
c9f776 ¤   ¤   ¤   {
b1e47c ¤   ¤   ¤   ¤   err.err¤= memFullErr;
4df622 ¤   ¤   ¤   ¤   break;
a8a3a6 ¤   ¤   ¤   }
--346c 000c4ea15d3401200ee Page 15 of CPGPtools.cp
b50fe4 ¤   ¤   }
cebba3 ¤   ¤   if ( err.IsntError( ) )
945b34 ¤   ¤   {
c8b720 ¤   ¤   ¤   EnqueueTaskList( taskList );
0f0fe4 ¤   ¤   }
2c0e1d ¤   ¤   else
975b34 ¤   ¤   {
590cbc ¤   ¤   ¤   delete¤ taskList;
58fffc ¤   ¤   ¤   taskList¤   = NULL;
550fe4 ¤   ¤   }
239371 ¤   }
a90e24 ¤   else
17c7a1 ¤   {
5c3c07 ¤   ¤   err.err¤= memFullErr;
8b9371 ¤   }
b2deb7 ¤   return( err );
08efe6 }
94af5a
79af5a
270335 /*____________________________________________________________________________
9a2ce0 ¤   Create and enqueue a clipboard task for the specified operation.
53f7f7 ____________________________________________________________________________*/
d1fbb0 ¤   CToolsError
712a2e CPGPtools::CreateAndEnqueueClipboardTask(
2caa6c ¤   PGPtoolsOperation¤  operation,
5fa68b ¤   ushort¤ ¤   ¤   ¤   taskModifiers )
98bb36 {
84eae3 ¤   CToolsError¤¤   ¤   ¤   ¤   err;
118107 ¤   CPGPtoolsTaskList *¤¤   ¤   taskList¤   = NULL;
773962 ¤   CPGPtoolsClipboardTask *¤   task¤   = NULL;
8e67c5 ¤
aa7a31 ¤   taskList¤   = new CPGPtoolsTaskList( operation );
74ec72 ¤   task¤   ¤   = new CPGPtoolsClipboardTask( operation );
0cf086 ¤   if( IsntNull( taskList ) && IsntNull( task ) )
8ec7a1 ¤   {
bbe374 ¤   ¤   taskList->SetTaskListHasFileTasks( FALSE );
4b1559 ¤   ¤   task->SetTaskModifiers( taskModifiers );
a20562 ¤   ¤   taskList->AppendTask( task );
a2af5a
b3b2cd ¤   ¤   EnqueueTaskList( taskList );
4e9371 ¤   }
f00e24 ¤   else
ddc7a1 ¤   {
500804 ¤   ¤   delete taskList;
3f4308 ¤   ¤   delete task;
793c07 ¤   ¤   err.err¤= memFullErr;
b19371 ¤   }
8c67c5 ¤
e2deb7 ¤   return( err );
08efe6 }
cd67c5 ¤
420335 /*____________________________________________________________________________
f8d7fb ¤   Prompt the user for items to operate on, then create and enqueue a task
707240 ¤   for it.
32f7f7 ____________________________________________________________________________*/
e76d52 ¤   void
810d52 CPGPtools::CreateAndEnqueueTaskPrompt(PGPtoolsOperation operation)
54bb36 {
9b54c1 ¤   FSSpec¤ ¤   srcFileSpec;
e87c3e ¤   CToolsError¤err;
95b216 ¤   Boolean¤¤   useClipboard;
1e7bd3 ¤   Str255¤ ¤   openButtonTitle;
1d7d97 ¤   ushort¤ ¤   taskModifiers;
6c67c5 ¤
24a69c ¤   taskModifiers¤  = GetAllModifiers();
0a67c5 ¤
8f8a2f ¤   GetIndString(openButtonTitle, kPGPtoolsMiscStringsResID, kSelectStrIndex );
8667c5 ¤
d89a8d ¤   err.err = GetFileOrClipboard( operation, openButtonTitle,
259998 ¤   ¤   ¤   ¤   ¤   ¤   &srcFileSpec, &useClipboard );
e067c5 ¤
c4ed80 ¤   if ( err.IsntError() )
--bc70 0009e65f3a3401200ee Page 16 of CPGPtools.cp
f7c7a1 ¤   {
1dff3b ¤   ¤   if ( useClipboard )
975b34 ¤   ¤   {
e2431b ¤   ¤   ¤   err¤= CreateAndEnqueueClipboardTask( operation, taskModifiers);
840fe4 ¤   ¤   }
f20e1d ¤   ¤   else
a65b34 ¤   ¤   {
7a1e0e ¤   ¤   ¤   err¤= CreateAndEnqueueFileTaskList( operation,
b66eb6 ¤   ¤   ¤   ¤   taskModifiers, &srcFileSpec, 1 );¤
f00fe4 ¤   ¤   }
bc9371 ¤   }
3d67c5 ¤
71edcd ¤   ReportTaskError( err );
4cefe6 }
12af5a
47af5a
896d52 ¤   void
d25b2f CPGPtools::ReportTaskError( CToolsError¤err)
83bb36 {
a1ab20 ¤   if( ShouldReportError( err ) )
eac7a1 ¤   {
8faa47 ¤   ¤   Str255¤ errorStr;
ad1b52 ¤   ¤
248671 ¤   ¤   GetErrorString( err, errorStr );
be1b52 ¤   ¤
3a057e ¤   ¤   SysBeep( 1 );
fe148d ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
5ec329 ¤   ¤   ¤   kErrorStringListResID, kOperationCouldNotBeCompletedStrIndex,
186ccb ¤   ¤   ¤   errorStr );
309371 ¤   }
d6efe6 }
02af5a
d5af5a
8a6d52 ¤   void
2979bd CPGPtools::ProcessNextTask()
acbb36 {
33c8f7 ¤   CPGPtoolsTaskList¤  *taskList;
49af5a
0cc821 ¤   if( IsntPGPError( UpdateContext( TRUE ) ) )
a0c7a1 ¤   {
e47138 ¤   ¤   pgpAssert( IsntNull( mContext ) );
50af5a
a85473 ¤   ¤   taskList = (CPGPtoolsTaskList *) mTaskListQueue.NextGet();
8dc531 ¤   ¤   if( IsntNull( taskList ) )
765b34 ¤   ¤   {
7c34a0 ¤   ¤   ¤   taskList->ProcessTasks( mContext, mTLSContext );
2bd11d ¤   ¤   ¤   delete( taskList );
010fe4 ¤   ¤   }
0567c5 ¤
df6e88 ¤   ¤   /* If we were launched by PGPmenu, we may want to·
0ca68b ¤   ¤   quit now */
267c07 ¤   ¤   if ( mAutoQuit && mTaskListQueue.IsEmpty())
dd52b0 ¤   ¤   {·
cde114 ¤   ¤   ¤   Boolean¤verifiedSigs;
ac87c7 ¤   ¤   ¤
b0b7f2 ¤   ¤   ¤   /* quit now, unless we have signatures the user
f7c03d ¤   ¤   ¤   ¤   will want to look at */
a5d5d0 ¤   ¤   ¤   verifiedSigs¤   = IsntNull( mResultsWindow ) &&
0678fa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mResultsWindow->HaveSignatures();
0ce74a ¤   ¤   ¤   if ( ! verifiedSigs )
30f776 ¤   ¤   ¤   {
5862ae ¤   ¤   ¤   ¤   ObeyCommand(cmd_Quit, NULL );
5aa3a6 ¤   ¤   ¤   }
c4bb8c ¤   ¤   ¤   else
f0f776 ¤   ¤   ¤   {
9e17ac ¤   ¤   ¤   ¤   mMainWindow->Show();
6adbef ¤   ¤   ¤   ¤   /* we have to stay around, so show toolbar */
5cf769 ¤   ¤   ¤   ¤   mAutoQuit¤  = FALSE;
95a3a6 ¤   ¤   ¤   }
4f0fe4 ¤   ¤   }
399371 ¤   }
9e0e24 ¤   else
--f004 000a4f82766401200ee Page 17 of CPGPtools.cp
f7c7a1 ¤   {
e728f7 ¤   ¤   /* Clear out the task queue */
425473 ¤   ¤   taskList = (CPGPtoolsTaskList *) mTaskListQueue.NextGet();
627fce ¤   ¤   while( IsntNull( taskList ) )
115b34 ¤   ¤   {
0ed11d ¤   ¤   ¤   delete( taskList );
7c87c7 ¤   ¤   ¤
5447ff ¤   ¤   ¤   taskList = (CPGPtoolsTaskList *) mTaskListQueue.NextGet();
d90fe4 ¤   ¤   }
c59371 ¤   }
48efe6 }
feaf5a
94af5a
91af5a
9e6d52 ¤   void
2867ac CPGPtools::SpendTime(const EventRecord &inMacEvent)
4fbb36 {
206c28 ¤   static Boolean¤ sBusy = FALSE;
1d67c5 ¤
0472b6 ¤   (void)inMacEvent;
97af5a
1cd594 ¤   // A reentrancy check is needed because displaying a dialog
f6a573 ¤   // from this function can cause this LPeriodical to execute again.
795d4f ¤   if( ! sBusy )
03c7a1 ¤   {
574ebc ¤   ¤   static Boolean¤ sFirstTime = TRUE;
41af5a
bacecf ¤   ¤   sBusy = TRUE;
2c1b52 ¤   ¤
2e0219 ¤   ¤   if( sFirstTime )
905b34 ¤   ¤   {
21c321 ¤   ¤   ¤   sFirstTime = FALSE;
3287c7 ¤   ¤   ¤
8e5c8e ¤   ¤   ¤   if( ! SecondaryVerifyEnvironment() )
e47e4b ¤   ¤   ¤   ¤   DoQuit();
330fe4 ¤   ¤   }
d71b52 ¤   ¤
18bcf7 ¤   ¤   // Process items in our deferred processing queue.
531b52 ¤   ¤
2004c9 ¤   ¤   if( ! mTaskListQueue.IsEmpty() )
555b34 ¤   ¤   {
350e39 ¤   ¤   ¤   // We have tasks to process. If we aren't the front process, set
23ad02 ¤   ¤   ¤   // ourselves to be so and try again later. It is necessary to
6fba76 ¤   ¤   ¤   // wait a few iterations of the main event loop so that
45b66b ¤   ¤   ¤   // PowerPlant has settled down a bit after the context switch
e487c7 ¤   ¤   ¤
a9dc3f ¤   ¤   ¤   ProcessSerialNumber¤appPSN;
306417 ¤   ¤   ¤   ProcessSerialNumber¤frontPSN;
9d3782 ¤   ¤   ¤   Boolean¤¤   ¤   ¤   appIsInFront;
98e437 ¤   ¤   ¤   static ushort¤  ¤   sWaitCount = 0;
8c87c7 ¤   ¤   ¤
cb2994 ¤   ¤   ¤   // Bring application to the front
69041e ¤   ¤   ¤   GetCurrentProcess( &appPSN );
a48896 ¤   ¤   ¤   GetFrontProcess( &frontPSN );
9387c7 ¤   ¤   ¤
cc250d ¤   ¤   ¤   appIsInFront = TRUE;
189268 ¤   ¤   ¤   (void) SameProcess( &appPSN, &frontPSN, &appIsInFront );
265feb ¤   ¤   ¤   if( appIsInFront && sWaitCount == 0 )
23f776 ¤   ¤   ¤   {
ffb56f ¤   ¤   ¤   ¤   (void)ProcessNextTask();
9fa3a6 ¤   ¤   ¤   }
82da0a ¤   ¤   ¤   else if( sWaitCount == 0 )
93f776 ¤   ¤   ¤   {
141846 ¤   ¤   ¤   ¤   // Wait three iterations of the main event loop after
76130f ¤   ¤   ¤   ¤   // calling ·SetFrontProcess before processing the task list
23de08 ¤   ¤   ¤   ¤   // items.
bcc7bf ¤   ¤   ¤   ¤   sWaitCount = 3;
0e95d4 ¤   ¤   ¤   ¤   SetFrontProcess( &appPSN );
c3a3a6 ¤   ¤   ¤   }
25bb8c ¤   ¤   ¤   else
48f776 ¤   ¤   ¤   {
a4ec4b ¤   ¤   ¤   ¤   --sWaitCount;
--69ea 000315a0523401200ee Page 18 of CPGPtools.cp
cfa3a6 ¤   ¤   ¤   }
290fe4 ¤   ¤   }
42b5f5 ¤   ¤   else if( mWipeFreeSpaceVRefNum != 0 )
6d5b34 ¤   ¤   {
e07ba3 ¤   ¤   ¤   WipeFreeSpaceWizard( mWipeFreeSpaceVRefNum );
fbc689 ¤   ¤   ¤   mWipeFreeSpaceVRefNum = 0;
e20fe4 ¤   ¤   }
c00e1d ¤   ¤   else
d75b34 ¤   ¤   {
b511dd ¤   ¤   ¤   GrafPtr¤savePort;
6cbe41 ¤   ¤   ¤   GrafPtr¤wMgrPort;
16e1ad ¤   ¤   ¤   Point¤  mouseLoc;
bb87c7 ¤   ¤   ¤
c4496e ¤   ¤   ¤   GetPort( &savePort );
e4a46e ¤   ¤   ¤   GetPort( &wMgrPort );
930f15 ¤   ¤   ¤   SetPort( wMgrPort );
8687c7 ¤   ¤   ¤
2790cb ¤   ¤   ¤   GetMouse( &mouseLoc );
3987c7 ¤   ¤   ¤
9d46b0 ¤   ¤   ¤   if( mouseLoc.h != mLastMouseLocation.h ||
06617c ¤   ¤   ¤   ¤   mouseLoc.v != mLastMouseLocation.v )
52f776 ¤   ¤   ¤   {
e10373 ¤   ¤   ¤   ¤   (void) PGPGlobalRandomPoolAddMouse( mouseLoc.h, mouseLoc.v );
7e337c ¤   ¤   ¤   ¤   mLastMouseLocation = mouseLoc;
6da3a6 ¤   ¤   ¤   }
7687c7 ¤   ¤   ¤
67e215 ¤   ¤   ¤   SetPort( savePort );
610fe4 ¤   ¤   }
ce1b52 ¤   ¤
a10f76 ¤   ¤   sBusy = FALSE;
e09371 ¤   }
c6efe6 }
2caf5a
906d52 ¤   void
bca072 CPGPtools::EnqueueTaskList(CPGPtoolsTaskList *taskList)
1bbb36 {
0cf28c ¤   pgpAssert( IsntNull( taskList ) );¤
68a845 ¤   mTaskListQueue.NextPut( taskList );
acefe6 }
72af5a
746d52 ¤   void
bcbd6a CPGPtools::Run()
a0bb36 {
d861e0 ¤   PGPError¤   err;
c567c5 ¤
0507b1 ¤   err = pgpNewContextCustomMacAllocators( &mContext );
6eb1f0 ¤   if( IsntPGPError( err ) )
b5c7a1 ¤   {
685951 ¤   ¤   err = UpdateContext( FALSE );
3a86f8 ¤   ¤   if( IsntPGPError( err ) )
115b34 ¤   ¤   {
4536c5 ¤   ¤   ¤   err = PGPNewTLSContext( mContext, &mTLSContext );
18698b ¤   ¤   ¤   if( IsntPGPError( err ) )
bbf776 ¤   ¤   ¤   {
90f0be ¤   ¤   ¤   ¤   LApplication::Run();
412b85 ¤   ¤   ¤   ¤
451e30 ¤   ¤   ¤   ¤   if( IsntNull( mMainWindow ) )
0a72c3 ¤   ¤   ¤   ¤   {
c23ee1 ¤   ¤   ¤   ¤   ¤   Rect¤   contentRect;
5bae30 ¤   ¤   ¤   ¤   ¤
321a4e ¤   ¤   ¤   ¤   ¤   contentRect = UWindows::GetWindowContentRect(
23b33d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mMainWindow->GetMacPort() );
10ae30 ¤   ¤   ¤   ¤   ¤
090b8d ¤   ¤   ¤   ¤   ¤   gPreferences.mainWindowLocation.v = contentRect.top;
33fc36 ¤   ¤   ¤   ¤   ¤   gPreferences.mainWindowLocation.h = contentRect.left;
f52613 ¤   ¤   ¤   ¤   }
6aaf5a
9b4bbb ¤   ¤   ¤   ¤   if( IsntNull( mResultsWindow ) )
4872c3 ¤   ¤   ¤   ¤   {
7a2c14 ¤   ¤   ¤   ¤   ¤   gPreferences.resultsWindowBounds =
52ec18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UWindows::GetWindowContentRect(
312248 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mResultsWindow->GetMacPort() );
--2a1f 000352b4491401200ee Page 19 of CPGPtools.cp
862613 ¤   ¤   ¤   ¤   }
7b2b85 ¤   ¤   ¤   ¤
91c0fe ¤   ¤   ¤   ¤   SavePreferences( mContext );
912b85 ¤   ¤   ¤   ¤
14ed35 ¤   ¤   ¤   ¤   PGPFreeTLSContext( mTLSContext );
84af7a ¤   ¤   ¤   ¤   mTLSContext = kInvalidPGPtlsContextRef;
8ba3a6 ¤   ¤   ¤   }
010fe4 ¤   ¤   }
671b52 ¤   ¤
e716b9 ¤   ¤   PGPFreeContext( mContext );
1684d4 ¤   ¤   mContext = kInvalidPGPContextRef;
d29371 ¤   }
ed0e24 ¤   else
07c7a1 ¤   {
4709fb ¤   ¤   /* couldn't create context */
93aa47 ¤   ¤   Str255¤ errorStr;
cf1b52 ¤   ¤
e04607 ¤   ¤   pgpAssert( IsNull( mContext ) );
381b52 ¤   ¤
0085ae ¤   ¤   /* can't use the context to get an error string because
a2b937 ¤   ¤   we couldn't initialize it */
c734e0 ¤   ¤   PGPGetClientErrorString( err, sizeof( errorStr ),
1df392 ¤   ¤   ¤   ¤   (char *) errorStr );
8bbac2 ¤   ¤   CToPString( (char *) errorStr, errorStr );
09148d ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
561fd8 ¤   ¤   ¤   kErrorStringListResID, kLibraryInitErrorStrIndex,
da6ccb ¤   ¤   ¤   errorStr );
d99371 ¤   }
7fefe6 }
99af5a
fd6d52 ¤   void
316cbe CPGPtools::ListenToMessage(
d819a3 ¤   MessageT ¤  inMessage,
377503 ¤   void ¤  ¤   *ioParam)
cdbb36 {
40769e ¤   switch( inMessage )
bfc7a1 ¤   {
0fe0bb ¤   ¤   case msg_BroadcasterDied:
605b34 ¤   ¤   {
b89508 ¤   ¤   ¤   if( ioParam == (LBroadcaster *) mWipeFreeDialog )
92f776 ¤   ¤   ¤   {
ccabfd ¤   ¤   ¤   ¤   mWipeFreeDialog = NULL;
0ea3a6 ¤   ¤   ¤   }
7387c7 ¤   ¤   ¤
55cdcb ¤   ¤   ¤   break;
ff0fe4 ¤   ¤   }
899371 ¤   }
baefe6 }
66af5a
6f35fa //¤ Respond to 'odoc' AppleEvent events
8aaf5a
6c6d52 ¤   void
aff819 CPGPtools::HandleAppleEvent(
448e4e ¤   const AppleEvent¤   &inAppleEvent,
d75341 ¤   AppleEvent¤ ¤   ¤   &outAEReply,
fcdf45 ¤   AEDesc¤ ¤   ¤   ¤   &outResult,
4be675 ¤   long¤   ¤   ¤   ¤   inAENumber)
53bb36 {
b54351 ¤   OSErr¤  err;
c9af5a
90b177 #if 0
2e35d9 /* simulate opening from PGPmenu */
565cfc if ( inAENumber == ae_OpenApp &&
5c09b1 ¤   (GetAllModifiers() & alphaLock) != 0 )
61bb36 {
d0cdd8 ¤   pgpDebugPStr( "\psimulating ae_OpenedFromMenu" );
eb9760 ¤   inAENumber¤ = ae_OpenedFromMenu;
21efe6 }
d07454 #endif
18af5a
d55867 ¤   switch( inAENumber )
35c7a1 ¤   {
--e61c 000528c98dd401200ee Page 20 of CPGPtools.cp
82fb7e ¤   ¤   case ae_OpenDoc:
f75b34 ¤   ¤   {
aed235 ¤   ¤   ¤   if ( ! mUserLaunchedAppOnly )
e9e366 ¤   ¤   ¤   ¤   mAutoQuit¤  = TRUE;·
c82b85 ¤   ¤   ¤   ¤
97529a ¤   ¤   ¤   err = DoOpenDocAppleEvent( inAppleEvent );
29bf6c ¤   ¤   ¤   ThrowIfOSErr_(err);
0ccdcb ¤   ¤   ¤   break;
d00fe4 ¤   ¤   }
871b52 ¤   ¤
d42bb8 ¤   ¤   case ae_OpenedFromMenu:
bdb6db ¤   ¤   ¤   /* special event sent by PGPmenu to tell us it
974b37 ¤   ¤   ¤   launched us */
7bad3c ¤   ¤   ¤   mAutoQuit¤  = TRUE;
626082 ¤   ¤   ¤   /* don't show main window */
d1cdcb ¤   ¤   ¤   break;
2287c7 ¤   ¤   ¤
49c683 ¤   ¤   case ae_OpenApp:
f0de5e ¤   ¤   ¤   mUserLaunchedAppOnly¤   = TRUE;
8a552a ¤   ¤   ¤   LApplication::HandleAppleEvent(inAppleEvent, outAEReply,
d0c961 ¤   ¤   ¤   ¤   ¤   outResult, inAENumber);
e42ac4 ¤   ¤   ¤   mMainWindow->Show();
37cdcb ¤   ¤   ¤   break;
7a87c7 ¤   ¤   ¤
fb9fa9 ¤   ¤   case ae_Sign:
6b8fdf ¤   ¤   case ae_Encrypt:
ea1ff2 ¤   ¤   case ae_EncryptAndSign:
cbfe36 ¤   ¤   case ae_DecryptVerify:
a1dd76 ¤   ¤   case ae_OptionSign:
983fc1 ¤   ¤   case ae_OptionEncrypt:
bbee68 ¤   ¤   case ae_OptionEncryptAndSign:
e4dba0 ¤   ¤   case ae_OptionDecryptVerify:
322e04 ¤   ¤   case ae_SecureWipe:
555b34 ¤   ¤   {
080a93 ¤   ¤   ¤   TArray<FSSpec>¤ theSpecsArray;
7787c7 ¤   ¤   ¤
9f0c88 ¤   ¤   ¤   GetFinderSelection( &theSpecsArray );
f5b38d ¤   ¤   ¤   RemoveChildAndDuplicateSpecsFromList( &theSpecsArray );
0159fa ¤   ¤   ¤   ProcessFinderSelection( inAENumber, theSpecsArray );
64cdcb ¤   ¤   ¤   break;
8f0fe4 ¤   ¤   }
ca1b52 ¤   ¤
ff87c7 ¤   ¤   ¤
fe9ae3 ¤   ¤   default:
6b552a ¤   ¤   ¤   LApplication::HandleAppleEvent(inAppleEvent, outAEReply,
5512dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outResult, inAENumber);
98cdcb ¤   ¤   ¤   break;
339371 ¤   }
c367c5 ¤
a1efe6 }
86af5a
cd6d52 ¤   void
352a4c CPGPtools::GetFinderSelection(
7211db ¤   TArray<FSSpec> *¤   outSpecsArray)
50bb36 {
f82b85 ¤   ¤   ¤   ¤
7778f1 ¤   try
72c7a1 ¤   {
a1464c ¤   ¤   StAEDescriptor¤ ¤   theReply;
be53e6 ¤   ¤   OSErr¤  ¤   ¤   ¤   err = noErr;
66af5a
599288 ¤   ¤   // Send the appleevent
e35b34 ¤   ¤   {
c18ade ¤   ¤   ¤   StAEDescriptor¤ ¤   theGetSelectionEvent;
eb8beb ¤   ¤   ¤   ProcessSerialNumber¤finderPSN;
e3989a ¤   ¤   ¤   StAEDescriptor¤ ¤   theAddress;
57af5a
ed9290 ¤   ¤   ¤   // Create the AppleEvent
4d6430 ¤   ¤   ¤   ThrowIfNot_( FindProcess( kFinderType, kFinderCreator, &finderPSN,
56ba97 ¤   ¤   ¤   ¤   ¤   nil, nil, nil ) );
60b225 ¤   ¤   ¤   err = ::AECreateDesc(¤  typeProcessSerialNumber,
5226ec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr) &finderPSN,
--c6b1 000f373b695401200ee Page 21 of CPGPtools.cp
1b7979 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( finderPSN ),
fc58bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theAddress);
4721fd ¤   ¤   ¤   ThrowIfOSErr_( err );
f2f753 ¤   ¤   ¤   err = ::AECreateAppleEvent(¤kAECoreSuite,
3d9ff4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAEGetData,
62a003 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theAddress,
e299f7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAutoGenerateReturnID,
857ae2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAnyTransactionID,
d5504c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theGetSelectionEvent);
d021fd ¤   ¤   ¤   ThrowIfOSErr_( err );
64af5a
814181 ¤   ¤   ¤   // Create the specifier
d73e5d ¤   ¤   ¤   StAEDescriptor¤ nullDescriptor;
b09cfc ¤   ¤   ¤   StAEDescriptor¤ selectionProperty( (DescType) pUserSelection );
d3d131 ¤   ¤   ¤   StAEDescriptor¤ selectionSpec;
9687c7 ¤   ¤   ¤
95f1cb ¤   ¤   ¤   err = ::CreateObjSpecifier(¤cProperty,
9a5368 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nullDescriptor,
fa4d38 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
149869 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionProperty,
fc1039 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
13a57a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionSpec);
23bf6c ¤   ¤   ¤   ThrowIfOSErr_(err);
08af5a
f6f132 ¤   ¤   ¤   // Add the direct object to the appleevent
1b67bf ¤   ¤   ¤   err = ::AEPutParamDesc(¤theGetSelectionEvent,
a69989 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyDirectObject,
f3f0d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionSpec);
75bf6c ¤   ¤   ¤   ThrowIfOSErr_(err);
d087c7 ¤   ¤   ¤
8bb580 ¤   ¤   ¤   StAEDescriptor¤ asFSSType((DescType) typeFSS);
6487c7 ¤   ¤   ¤
8167bf ¤   ¤   ¤   err = ::AEPutParamDesc(¤theGetSelectionEvent,
fc058f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyAERequestedType,
519491 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   asFSSType);
4dbf6c ¤   ¤   ¤   ThrowIfOSErr_(err);
2887c7 ¤   ¤   ¤
0d7970 ¤   ¤   ¤   UAppleEventsMgr::SendAppleEventWithReply(¤  theGetSelectionEvent,
f97d13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theReply,
a81d69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false);
21c653 ¤   ¤   }¤  ¤   ¤   ¤
6e1b52 ¤   ¤
1e1544 ¤   ¤   // Check for errors
92c80a ¤   ¤   StAEDescriptor¤ errorCode(theReply, keyErrorNumber);
031b52 ¤   ¤
01eff1 ¤   ¤   if (errorCode.mDesc.descriptorType != typeNull)
c25b34 ¤   ¤   {
0ee131 ¤   ¤   ¤   UExtractFromAEDesc::TheInt16(errorCode, err);
6e87c7 ¤   ¤   ¤
d1bf6c ¤   ¤   ¤   ThrowIfOSErr_(err);
d10fe4 ¤   ¤   }
3e1b52 ¤   ¤
fc7765 ¤   ¤   // Walk the list adding all of the FSSpecs to the outFileSpecsH handle
9ee831 ¤   ¤   AEKeyword¤  ¤   keyWord;
04840d ¤   ¤   SInt32¤ ¤   ¤   numItems = 0;
8ae978 ¤   ¤   StAEDescriptor¤ theSelectionList(theReply, keyDirectObject);
7e8ac6 ¤   ¤   FSSpec¤ ¤   ¤   theSpec;
691b52 ¤   ¤
2f8537 ¤   ¤   ThrowIf_(theSelectionList.mDesc.descriptorType == typeNull);
1c1b52 ¤   ¤
efd56f ¤   ¤   if (theSelectionList.mDesc.descriptorType == typeFSS)
b25b34 ¤   ¤   {
15d7b8 ¤   ¤   ¤   Boolean¤targetIsFolder;
b72b70 ¤   ¤   ¤   Boolean¤targetWasAlias;
2f2b85 ¤   ¤   ¤   ¤
a38b90 ¤   ¤   ¤   pgpCopyMemory(¤ *theSelectionList.mDesc.dataHandle,
3614a9 ¤   ¤   ¤   ¤   &theSpec, sizeof(FSSpec));
1f2b85 ¤   ¤   ¤   ¤
a9f7c4 ¤   ¤   ¤   if( IsntErr( ResolveAliasFile( &theSpec, TRUE,
074297 ¤   ¤   ¤   ¤   ¤   ¤   &targetIsFolder, &targetWasAlias ) ) )
b9f776 ¤   ¤   ¤   {
f337e1 ¤   ¤   ¤   ¤   outSpecsArray->InsertItemsAt( 1, LArray::index_Last,
--e28f 0000da65f86401200ee Page 22 of CPGPtools.cp
b1761c ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSpec);
d8a3a6 ¤   ¤   ¤   }
d60fe4 ¤   ¤   }
680e1d ¤   ¤   else
755b34 ¤   ¤   {
a1ee28 ¤   ¤   ¤   err = ::AECountItems(theSelectionList, & numItems);
f3bf6c ¤   ¤   ¤   ThrowIfOSErr_(err);
19d23e ¤   ¤   ¤   for (SInt32 i = 1; i <= numItems; i++)
abf776 ¤   ¤   ¤   {
317fbe ¤   ¤   ¤   ¤   // Grab the item
9551cc ¤   ¤   ¤   ¤   StAEDescriptor¤ item;
a67e41 ¤   ¤   ¤   ¤   Boolean¤¤   ¤   targetIsFolder;
ba8289 ¤   ¤   ¤   ¤   Boolean¤¤   ¤   targetWasAlias;
672b85 ¤   ¤   ¤   ¤
2f84be ¤   ¤   ¤   ¤   err = ::AEGetNthDesc(¤  theSelectionList,
8e1291 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   i,
38925d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeFSS,
f4902e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyWord,
501831 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   item);
0a3490 ¤   ¤   ¤   ¤   ThrowIfOSErr_(err);
152b85 ¤   ¤   ¤   ¤
d8e584 ¤   ¤   ¤   ¤   // Insert it into the array
d23262 ¤   ¤   ¤   ¤   pgpCopyMemory(¤ *item.mDesc.dataHandle, &theSpec,
86af7f ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(theSpec));
9baf5a
2ff726 ¤   ¤   ¤   ¤   if( IsntErr( ResolveAliasFile( &theSpec, TRUE,
26cf6b ¤   ¤   ¤   ¤   ¤   ¤   ¤   &targetIsFolder, &targetWasAlias ) ) )
3a72c3 ¤   ¤   ¤   ¤   {
2f3097 ¤   ¤   ¤   ¤   ¤   outSpecsArray->InsertItemsAt( 1, LArray::index_Last,
ad4af2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSpec);
612613 ¤   ¤   ¤   ¤   }
9ba3a6 ¤   ¤   ¤   }
540fe4 ¤   ¤   }
711b52 ¤   ¤
6899b3 ¤   ¤   // Check for missing parms and dispose of the reply
ca10fe ¤   ¤   UAppleEventsMgr::CheckForMissedParams(theReply);
539371 ¤   }
6367c5 ¤
c792a2 ¤   catch (...)
41c7a1 ¤   {
a89371 ¤   }
cbefe6 }
06af5a
90af5a
6f0335 /*____________________________________________________________________________
e967c5 ¤
9af7f7 ____________________________________________________________________________*/
7533c8 ¤   static void
30c646 AddAllTrashFolders( TArray<FSSpec> *array )
8cbb36 {
8d3c64 ¤   PGPUInt32¤  ¤   volIndex;
6c1dc6 ¤   short¤  ¤   ¤   vRefNums[ 100 ];
e4be3d ¤   unsigned short¤ numVRefNums;
1579f7 ¤   OSStatus¤   ¤   err¤= noErr;
1e67c5 ¤
e535a3 ¤   numVRefNums¤= sizeof( vRefNums ) / sizeof( vRefNums[ 0 ] );
e9108a ¤   GetAllVRefNums( vRefNums, numVRefNums, &numVRefNums );
125818 ¤   for( volIndex = 0; volIndex < numVRefNums; ++volIndex )
efc7a1 ¤   {
544bd2 ¤   ¤   short¤  vRefNum¤= vRefNums[ volIndex ];
8c8806 ¤   ¤   short¤  trashVRefNum;
8c5ec3 ¤   ¤   long¤   trashDirID;
f31b52 ¤   ¤
0e48d8 ¤   ¤   err¤= FindFolder( vRefNum, kTrashFolderType, kDontCreateFolder,
3cef4c ¤   ¤   ¤   ¤   &trashVRefNum, &trashDirID);
1cd798 ¤   ¤   if ( IsntErr( err ) )
d15b34 ¤   ¤   {
3e0b50 ¤   ¤   ¤   FSSpec¤ spec;
c987c7 ¤   ¤   ¤
53307b ¤   ¤   ¤   err¤= FSMakeFSSpec( vRefNum, trashDirID, "\p", &spec );
25d26c ¤   ¤   ¤   AssertNoErr( err, "AddAllTrashFolders" );
0de090 ¤   ¤   ¤   if ( IsntErr( err ) )
--ba29 00063a8e1ad401200ee Page 23 of CPGPtools.cp
99f776 ¤   ¤   ¤   {
419d20 ¤   ¤   ¤   ¤   array->InsertItemsAt( 1, LArray::index_Last, spec);
a7a3a6 ¤   ¤   ¤   }
bb0fe4 ¤   ¤   }
3c9371 ¤   }
40efe6 }
22af5a
526d52 ¤   void
dca791 CPGPtools::ProcessFinderSelection(
706338 ¤   long¤   ¤   ¤   inEventCode,
d5e526 ¤   TArray<FSSpec> &inSpecsArray)
f9bb36 {
b6030a ¤   PGPtoolsOperation¤  op = kPGPtoolsInvalidOperation;
d2351b ¤   ushort¤ ¤   ¤   ¤   modifiers¤  = 0;
b08737 ¤   OSStatus¤   ¤   ¤   err;
9a67c5 ¤
057743 ¤   switch( inEventCode )
8ac7a1 ¤   {
9b9ae3 ¤   ¤   default:
7ed8c6 ¤   ¤   ¤   pgpDebugMsg( "\punknown operation" );
808feb ¤   ¤   ¤   op¤ = kPGPtoolsInvalidOperation;
f3cdcb ¤   ¤   ¤   break;
9d87c7 ¤   ¤   ¤
40dd76 ¤   ¤   case ae_OptionSign:
46e240 ¤   ¤   ¤   modifiers¤  |= optionKey;
3c9fa9 ¤   ¤   case ae_Sign:
cf4f89 ¤   ¤   ¤   op¤ = kPGPtoolsSignOperation;
aacdcb ¤   ¤   ¤   break;
f81b52 ¤   ¤
b73fc1 ¤   ¤   case ae_OptionEncrypt:
97e240 ¤   ¤   ¤   modifiers¤  |= optionKey;
a98fdf ¤   ¤   case ae_Encrypt:
b3f98f ¤   ¤   ¤   op = kPGPtoolsEncryptOperation;
65cdcb ¤   ¤   ¤   break;
d81b52 ¤   ¤
48ee68 ¤   ¤   case ae_OptionEncryptAndSign:
80e240 ¤   ¤   ¤   modifiers¤  |= optionKey;
621ff2 ¤   ¤   case ae_EncryptAndSign:
a6a125 ¤   ¤   ¤   op¤ = kPGPtoolsEncryptSignOperation;
9acdcb ¤   ¤   ¤   break;
9f1b52 ¤   ¤
62fe36 ¤   ¤   case ae_DecryptVerify:
dde240 ¤   ¤   ¤   modifiers¤  |= optionKey;
a4dba0 ¤   ¤   case ae_OptionDecryptVerify:
6cf488 ¤   ¤   ¤   op¤ = kPGPtoolsDecryptVerifyOperation;
bfcdcb ¤   ¤   ¤   break;
ee1b52 ¤   ¤
382e04 ¤   ¤   case ae_SecureWipe:
03a8a1 ¤   ¤   ¤   op¤ = kPGPtoolsWipeOperation;
25cdcb ¤   ¤   ¤   break;
529371 ¤   }
e567c5 ¤
02d232 ¤   if ( AppCanDoOperation( op ) )
e8c7a1 ¤   {
a364f8 ¤   ¤   PGPUInt32¤  ¤   numSpecs;
40b8e5 ¤   ¤   Boolean¤¤   ¤   isTrash¤= FALSE;
e21b52 ¤   ¤
ee7dbf ¤   ¤   numSpecs¤   = inSpecsArray.GetCount();
c567c5 ¤
9ae301 ¤   ¤   /* check to see if it's the trash folder */
e7240a ¤   ¤   if ( numSpecs == 1 )
a35b34 ¤   ¤   {
34d1d9 ¤   ¤   ¤   FSSpec¤ ¤   ¤   spec;
079608 ¤   ¤   ¤   CInfoPBRec¤ ¤   cpb;
5887c7 ¤   ¤   ¤
a78057 ¤   ¤   ¤   /* LArray starts with index 1 */
ed9001 ¤   ¤   ¤   inSpecsArray.FetchItemAt( 1, spec);
fa173d ¤   ¤   ¤   err¤= FSpGetCatInfo( &spec, &cpb );
739bce ¤   ¤   ¤   if ( IsntErr( err ) && cpbIsFolder( &cpb ) &&
c2d856 ¤   ¤   ¤   ¤   FSIsTrashFolder( spec.vRefNum, cpb.dirInfo.ioDrDirID ) )
5bf776 ¤   ¤   ¤   {
6347db ¤   ¤   ¤   ¤   isTrash¤= TRUE;
--ec1f 00077944303401200ee Page 24 of CPGPtools.cp
cfa3a6 ¤   ¤   ¤   }
290fe4 ¤   ¤   }
c51b52 ¤   ¤
09a9c8 ¤   ¤   if ( isTrash )
cf5b34 ¤   ¤   {
75ef1d ¤   ¤   ¤   /* create specs for all trash folders */
bc3809 ¤   ¤   ¤   AddAllTrashFolders( &inSpecsArray );
aba50d ¤   ¤   ¤   numSpecs¤   = inSpecsArray.GetCount();
ca0fe4 ¤   ¤   }
8daf5a
fcd88d ¤   ¤   Handle¤ ¤   ¤   itemsHandle¤= inSpecsArray.GetItemsHandle();
d5178f ¤   ¤   StHandleLocker¤ locker( itemsHandle );
fa1b52 ¤   ¤
6f3978 ¤   ¤   CreateAndEnqueueFileTaskList( op,
e8d195 ¤   ¤   ¤   modifiers,
de4fd0 ¤   ¤   ¤   (const FSSpec *)*itemsHandle, numSpecs );
179371 ¤   }
aeefe6 }
c8af5a
d2af5a
59eacd ¤   OSErr
e2c88d CPGPtools::ProcessDragAndDrop(
63593d ¤   const FSSpec ¤  *specList,
c9ea00 ¤   UInt32¤ ¤   ¤   numSpecs)
a7bb36 {
7a9c1a ¤   OSErr¤  err = noErr;
c567c5 ¤
7ae86f ¤   UInt32¤ numEncrypted¤   ¤   = 0;
8e5a5e ¤   UInt32¤ numSigned¤  ¤   ¤   = 0;
071f38 ¤   UInt32¤ numDetachedSigned¤  = 0;
5b4154 ¤   UInt32¤ numUnknown¤ ¤   ¤   = 0;
0867c5 ¤
219681 ¤   for( UInt32 specIndex = 0; specIndex < numSpecs; specIndex++ )
c5c7a1 ¤   {
b16240 ¤   ¤   PGPAnalyzeType¤ dataKind = kPGPAnalyze_Encrypted;
461b52 ¤   ¤
e103ef ¤   ¤   if( IsErr( err ) )
25cdcb ¤   ¤   ¤   break;
3b67c5 ¤
83325b ¤   ¤   switch( dataKind )
925b34 ¤   ¤   {
be5df6 ¤   ¤   ¤   case kPGPAnalyze_Encrypted:
f5a293 ¤   ¤   ¤   ¤   ++numEncrypted;
36f622 ¤   ¤   ¤   ¤   break;
9c87c7 ¤   ¤   ¤
36f9d5 ¤   ¤   ¤   case kPGPAnalyze_Signed:
8beea7 ¤   ¤   ¤   ¤   ++numSigned;
bdf622 ¤   ¤   ¤   ¤   break;
c5af5a
70f153 ¤   ¤   ¤   case kPGPAnalyze_DetachedSignature:
7a0449 ¤   ¤   ¤   ¤   ++numDetachedSigned;
8ef622 ¤   ¤   ¤   ¤   break;
6a87c7 ¤   ¤   ¤
59db68 ¤   ¤   ¤   default:
a8486a ¤   ¤   ¤   ¤   ++numUnknown;
08f622 ¤   ¤   ¤   ¤   break;
e20fe4 ¤   ¤   }
9e9371 ¤   }
6867c5 ¤
68ee03 ¤   if( IsntErr( err ) )
12c7a1 ¤   {
0a3306 ¤   ¤   PGPtoolsOperation¤  operation;
e787c7 ¤   ¤   ¤
fe4daf ¤   ¤   if( numUnknown == 0 )
575b34 ¤   ¤   {
9d820c ¤   ¤   ¤   // All of the files are deterministic. Go for decryption
5187c7 ¤   ¤   ¤
807aa7 ¤   ¤   ¤   operation = kPGPtoolsDecryptVerifyOperation;
770fe4 ¤   ¤   }
ce0e1d ¤   ¤   else
085b34 ¤   ¤   {
77ff8a ¤   ¤   ¤   // We have unknown/unencrypted files. If we have none of our files,
--b6e9 000e219ad6d401200ee Page 25 of CPGPtools.cp
1a0de6 ¤   ¤   ¤   // then go for encryption, otherwise prompt for the operation
0f1b52 ¤   ¤
37a8bc ¤   ¤   ¤   if( numEncrypted == 0 &&
4e1396 ¤   ¤   ¤   ¤   numSigned == 0 &&
f70a2a ¤   ¤   ¤   ¤   numDetachedSigned == 0 )
99f776 ¤   ¤   ¤   {
7ae140 ¤   ¤   ¤   ¤   operation = kPGPtoolsEncryptOperation;
1da3a6 ¤   ¤   ¤   }
39bb8c ¤   ¤   ¤   else
04f776 ¤   ¤   ¤   {
e1e140 ¤   ¤   ¤   ¤   operation = kPGPtoolsEncryptOperation;
225a2a ¤   ¤   ¤   }¤
410fe4 ¤   ¤   }
0f1b52 ¤   ¤
a61704 ¤   ¤   if( IsntErr( err ) && AppCanDoOperation( operation ) )
2e5b34 ¤   ¤   {
798748 ¤   ¤   ¤   CPGPtoolsTaskList¤  *taskList;
de87c7 ¤   ¤   ¤
72b04b ¤   ¤   ¤   taskList = new CPGPtoolsTaskList( operation );
1884c2 ¤   ¤   ¤   if( IsntNull( taskList ) )
5af776 ¤   ¤   ¤   {
7425d0 ¤   ¤   ¤   ¤   PGPUInt32¤  specIndex;
f72b85 ¤   ¤   ¤   ¤
f1049f ¤   ¤   ¤   ¤   taskList->SetTaskListHasFileTasks( TRUE );
81af5a
0b0752 ¤   ¤   ¤   ¤   for( specIndex = 0; specIndex < numSpecs; specIndex++ )
f172c3 ¤   ¤   ¤   ¤   {
d9341f ¤   ¤   ¤   ¤   ¤   CPGPtoolsFileTask¤  ¤   *fileTask;
87ae30 ¤   ¤   ¤   ¤   ¤
e5e14a ¤   ¤   ¤   ¤   ¤   fileTask = new CPGPtoolsFileTask( operation,
86c256 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &specList[specIndex] );
797e59 ¤   ¤   ¤   ¤   ¤   if( IsntNull( fileTask ) )
764859 ¤   ¤   ¤   ¤   ¤   {
18ae25 ¤   ¤   ¤   ¤   ¤   ¤   taskList->AppendTask( fileTask );
9b1c89 ¤   ¤   ¤   ¤   ¤   }
9e2613 ¤   ¤   ¤   ¤   }
9d2b85 ¤   ¤   ¤   ¤
acb198 ¤   ¤   ¤   ¤   EnqueueTaskList( taskList );
dea3a6 ¤   ¤   ¤   }
00bb8c ¤   ¤   ¤   else
acf776 ¤   ¤   ¤   {
aa945a ¤   ¤   ¤   ¤   err = memFullErr;
6fa3a6 ¤   ¤   ¤   }
a20fe4 ¤   ¤   }
1d9371 ¤   }
1caf5a
653e33 Exit:
2aaf5a
3ddeb7 ¤   return( err );
8befe6 }
c1af5a
18eacd ¤   OSErr
c2ffdc CPGPtools::DoOpenDocAppleEvent(const AppleEvent &inAppleEvent)
63bb36 {
e83ee9 ¤   AEDescList¤ docList;
3530bd ¤   OSErr¤  ¤   err;
7767c5 ¤
e80ce7 ¤   err = AEGetParamDesc( &inAppleEvent, keyDirectObject, typeAEList,
f86c2c ¤   ¤   ¤   ¤   &docList );
beee03 ¤   if( IsntErr( err ) )
1dc7a1 ¤   {
66f3df ¤   ¤   Int32¤  ¤   numDocs;
84af5a
e7fd21 ¤   ¤   err = AECountItems( &docList, &numDocs );
cdda5e ¤   ¤   if( IsntErr( err ) )
fa5b34 ¤   ¤   {
6623e6 ¤   ¤   ¤   FSSpec¤ *specList;
4c87c7 ¤   ¤   ¤
547cf9 ¤   ¤   ¤   // Loop through all items in the list, extract descriptor for
218b8e ¤   ¤   ¤   // the document, and coerce descriptor data into a FSSpec
8587c7 ¤   ¤   ¤
e22a6f ¤   ¤   ¤   specList = (FSSpec *) pgpAlloc( numDocs * sizeof( *specList ) );
--ca6e 00038393e3d401200ee Page 26 of CPGPtools.cp
4fe117 ¤   ¤   ¤   if( IsntNull( specList ) )
91f776 ¤   ¤   ¤   {
007e38 ¤   ¤   ¤   ¤   UInt32¤ ¤   numSpecs¤   = 0;
b6085b ¤   ¤   ¤   ¤   CPGPFree¤   freeSpecs( specList );
91af5a
cac99e ¤   ¤   ¤   ¤   for (Int32 i = 1; i <= numDocs; i++)
4972c3 ¤   ¤   ¤   ¤   {
568d34 ¤   ¤   ¤   ¤   ¤   AEKeyword¤  theKey;
304252 ¤   ¤   ¤   ¤   ¤   DescType¤   theType;
743b89 ¤   ¤   ¤   ¤   ¤   Size¤   ¤   theSize;
c42b85 ¤   ¤   ¤   ¤
33f866 ¤   ¤   ¤   ¤   ¤   err = AEGetNthPtr( &docList, i, typeFSS, &theKey,
58df6e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theType, &specList[ numSpecs ],
ab5853 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(FSSpec), &theSize );
31da4b ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
e500eb ¤   ¤   ¤   ¤   ¤   ¤   break;
be9590 ¤   ¤   ¤   ¤   ¤   ++numSpecs;
872613 ¤   ¤   ¤   ¤   }
6c2b85 ¤   ¤   ¤   ¤
01f134 ¤   ¤   ¤   ¤   if( IsntErr( err ) && numSpecs != 0 )
5172c3 ¤   ¤   ¤   ¤   {
2c06f1 ¤   ¤   ¤   ¤   ¤   err = ProcessDragAndDrop( specList, numSpecs );
972613 ¤   ¤   ¤   ¤   }
bea3a6 ¤   ¤   ¤   }
6abb8c ¤   ¤   ¤   else
1ff776 ¤   ¤   ¤   {
e0945a ¤   ¤   ¤   ¤   err = memFullErr;
bba3a6 ¤   ¤   ¤   }
cd0fe4 ¤   ¤   }
a01b52 ¤   ¤
b2d38d ¤   ¤   AEDisposeDesc( &docList );
789371 ¤   }
1667c5 ¤
b5deb7 ¤   return( err );
b0efe6 }
c9af5a
0c3b9d const OSType¤   kPGPkeysCreator¤= 'pgpK';
5d67c5 ¤
176d52 ¤   void
691140 CPGPtools::LaunchPGPkeys(void)
34bb36 {
f7fd87 ¤   ProcessSerialNumber¤keysPSN;
6bd1b2 ¤   CToolsError¤¤   ¤   err;
b667c5 ¤
b38e24 ¤   // Check for already running app
9067c5 ¤
77a9e9 ¤   if( FindProcess( 'APPL', kPGPkeysCreator, &keysPSN, nil, nil, nil ) )
9cc7a1 ¤   {
a4127b ¤   ¤   SetFrontProcess( &keysPSN );
c39371 ¤   }
620e24 ¤   else
77c7a1 ¤   {
1fa274 ¤   ¤   FSSpec¤ toolsSpec;
ab89b8 ¤   ¤   FSSpec¤ keysSpec;
afbe93 ¤   ¤   Boolean¤foundKeys = false;
0e1b52 ¤   ¤
edb697 ¤   ¤   if( IsntErr( GetSpecFromRefNum( mApplicationResFile, &toolsSpec ) ) )
ba5b34 ¤   ¤   {
00852f ¤   ¤   ¤   foundKeys = FindApplicationOnVolume( toolsSpec.vRefNum, 'APPL',
e9af66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPkeysCreator, &keysSpec );
1b0fe4 ¤   ¤   }
1b1b52 ¤   ¤
700244 ¤   ¤   if( ! foundKeys )
185b34 ¤   ¤   {
685369 ¤   ¤   ¤   foundKeys = FindApplication( 'APPL', kPGPkeysCreator,
0f6760 ¤   ¤   ¤   ¤   ¤   kFindAppOnAllVolumes, &keysSpec );
080fe4 ¤   ¤   }
f21b52 ¤   ¤
6ccae4 ¤   ¤   if( foundKeys )
d05b34 ¤   ¤   {
e1c09a ¤   ¤   ¤   LaunchParamBlockRec¤launchPB;
38af5a
--6bad 000b991bf37401200ee Page 27 of CPGPtools.cp
b0d707 ¤   ¤   ¤   pgpClearMemory( &launchPB, sizeof( launchPB ) );
b01b52 ¤   ¤
7aa507 ¤   ¤   ¤   launchPB.launchBlockID¤ ¤   ¤   = extendedBlock;
28dbed ¤   ¤   ¤   launchPB.launchEPBLength¤   ¤   = extendedBlockLen;
a5380e ¤   ¤   ¤   launchPB.launchFileFlags¤   ¤   = 0;
95066d ¤   ¤   ¤   launchPB.launchControlFlags¤¤   = launchContinue |
a1d520 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   launchNoFileFlags;
09652c ¤   ¤   ¤   launchPB.launchAppSpec¤ ¤   ¤   = &keysSpec;
5c81a9 ¤   ¤   ¤   launchPB.launchAppParameters¤   = nil;
8c87c7 ¤   ¤   ¤
53604c ¤   ¤   ¤   err.err = LaunchApplication( &launchPB );
230fe4 ¤   ¤   }
5a0e1d ¤   ¤   else
8d5b34 ¤   ¤   {
12a0d1 ¤   ¤   ¤   err.err = fnfErr;
7e0fe4 ¤   ¤   }
c09371 ¤   }
9a67c5 ¤
3bb219 ¤   if( err.IsError() )
f8c7a1 ¤   {
45aa47 ¤   ¤   Str255¤ errorStr;
a21b52 ¤   ¤
2c8671 ¤   ¤   GetErrorString( err, errorStr );
e9af5a
0d057e ¤   ¤   SysBeep( 1 );
0575b4 ¤   ¤   CWarningAlert::Display( kWACautionAlertType, kWAOKStyle,
0fb2ac ¤   ¤   ¤   kErrorStringListResID, kCantLaunchPGPkeysBecauseStrIndex,
876ccb ¤   ¤   ¤   errorStr );
729371 ¤   }
85efe6 }
33af5a
84af5a
637e69 ¤   Boolean
c0972a CPGPtools::AttemptQuitSelf(
850e42 ¤   Int32¤  inSaveOption)
62bb36 {
791ab9 ¤   Boolean¤doQuit¤ = TRUE;
a767c5 ¤
7d04ef ¤   (void)inSaveOption;
7467c5 ¤
ca118c ¤   return doQuit;
85efe6 }
02af5a
bdaf5a
989ba8 #if PGP_DEBUG¤  // [
d1af5a
6bc852 #define¤kDebugMenuID¤   10001¤  // Must not conflict with regular menus
6faf5a
fe6d52 ¤   void
1c62c2 CPGPtools::InstallDebugMenu(void)
09bb36 {
a45f59 ¤   LMenu¤  *debugMenu;
e067c5 ¤
076cb0 ¤   // Need to suspend leaking because PowerPlant menu objects leak like crazy
db32f4 ¤   MacLeaks_Suspend();
7167c5 ¤
fae341 ¤   debugMenu = new( LMenu )( kDebugMenuID, "\pDEBUG" );
708dbc ¤   if( debugMenu != nil )
2bc7a1 ¤   {
4667fc ¤   ¤   debugMenu->InsertCommand( "\pTest du jour", cmd_DebugTest, 9999 );
981b52 ¤   ¤
59c377 ¤   ¤   LMenuBar::GetCurrentMenuBar()->InstallMenu( debugMenu, 0 );
809371 ¤   }
180e24 ¤   else
e8c7a1 ¤   {
95ad1a ¤   ¤   pgpDebugMsg( "InstallDebugMenu: Failed to create menu" );
9b9371 ¤   }
8caf5a
0d77d9 ¤   MacLeaks_Resume();
09efe6 }
f7af5a
b9af5a
--9aab 000fbd41b09401200ee Page 28 of CPGPtools.cp
78ed6f #if 0¤  // KEEP [
14b274 #include "pgpLineEndIO.h"
e6ebac #include "pgpIOUtilities.h"
9f3427 #include "pgpFileUtilities.h"
31af5a
16af5a
7333c8 ¤   static void
e169c8 TestLineEndIO(
fd0164 ¤   const FSSpec *¤ ¤   ·fsSpec,
edd070 ¤   ConvertLineEndType¤ lineEndType
bb27e6 ¤   )
4abb36 {
4dfb19 ¤   PGPError¤   ¤   err;
896aa9 ¤   FSSpec¤ ¤   ¤   tempSpec;
7ff2b5 ¤   PFLFileSpecRef¤ inSpec¤ = kInvalidPGPKeySetRef;
f621bc ¤   PFLFileSpecRef¤ outSpec¤= kInvalidPGPKeySetRef;
0e1c16 ¤   PGPIORef¤   ¤   inRef;
cb8bb7 ¤   PGPIORef¤   ¤   outRef;
d497be ¤   PGPLineEndIORef¤convertRef;
660df2 ¤   PGPMemoryMgrRef¤memMgrRef;
2267c5 ¤
eb2aa6 ¤   err¤= PGPNewMemoryMgr( 0, &memMgrRef );
9067c5 ¤
274410 ¤   tempSpec¤   = *fsSpec;
0267c5 ¤
c5563c ¤   PFLNewFileSpecFromFSSpec( context, &tempSpec, &inSpec );
658d11 ¤   switch( lineEndType )
c6c7a1 ¤   {
ee147e ¤   ¤   case kCRLFLineEndType:
25d693 ¤   ¤   ¤   AppendPString( "\p.CRLF", tempSpec.name );¤ break;
e276e0 ¤   ¤   case kCRLineEndType:
b8be57 ¤   ¤   ¤   AppendPString( "\p.CR", tempSpec.name );¤   break;
0bf23b ¤   ¤   case kLFLineEndType:
206e24 ¤   ¤   ¤   AppendPString( "\p.LF", tempSpec.name );¤   break;
369371 ¤   }
b567c5 ¤
3167c5 ¤
d0381b ¤   (void)FSpDelete( &tempSpec );
598255 ¤   (void)FSpCreate( &tempSpec, 'CWIE', 'TEXT', smSystemScript);
dfab37 ¤   PFLNewFileSpecFromFSSpec( context, &tempSpec, &outSpec );
49bed9 ¤   err¤= PGPOpenFileSpec( inSpec, kPFLFileOpenFlags_ReadOnly,
418a8e ¤   ¤   ¤   (PGPFileIORef *)&inRef );
ec0085 ¤   err¤= PGPOpenFileSpec( outSpec, kPFLFileOpenFlags_ReadWrite,
6956cd ¤   ¤   ¤   (PGPFileIORef *)&outRef );
1567c5 ¤
c8b136 ¤   err¤= PGPNewLineEndIO( outRef, FALSE, lineEndType, &convertRef );
ed15fe ¤   if (IsntPGPError( err ) )
a1c7a1 ¤   {
7d32ea ¤   ¤   PGPFileOffset¤  byteCount;
351b52 ¤   ¤
938e5e ¤   ¤   PGPIOGetEOF( inRef, &byteCount );
1c24a0 ¤   ¤   err¤= PGPCopyIO( inRef, byteCount, (PGPIORef)convertRef );
339371 ¤   }
3767c5 ¤
ddaded ¤   PFLFreeFileSpec( inSpec );
3e6cc8 ¤   PFLFreeFileSpec( outSpec );
d35cba ¤   PGPFreeIO( inRef );
fbc0de ¤   PGPFreeIO( (PGPIORef)convertRef );
5821bc ¤   PGPFreeIO( outRef );
2960e1 ¤   PGPDisposeMemoryMgr( memMgrRef );
33efe6 }
2eaf5a
34a5ee #endif¤ // ] KEEP
96af5a
60af5a
9fc2ae #include "pgpGroups.h"
41c88f #include "pgpMacVolumeWiping.h"
c5af5a
5a2473 ¤   static OSStatus
3951dc WipeVolumeEventHandler(
2e0315 ¤   const VolumeWipeEvent ¤ *event,
fb944c ¤   PGPUserValue ¤  ¤   ¤   userValue)
--f782 00155920173401200ee Page 29 of CPGPtools.cp
2cbb36 {
776792 ¤   OSStatus¤   err = noErr;
1c67c5 ¤
604d52 ¤   (void) userValue;
e2756f ¤   (void) event;
fe67c5 ¤
d4deb7 ¤   return( err );
d2efe6 }
21af5a
126d52 ¤   void
b1b7d2 CPGPtools::DebugTest(void)
3cbb36 {
18b177 #if 0
e9cf44 ¤   ¤   PGPError¤   ¤   err;
fc549a ¤   ¤   PGPKeySetRef ¤  keySet;
c61b52 ¤   ¤
81542b ¤   ¤   err = PGPOpenDefaultKeyRings( mContext, 0, &keySet );
7286f8 ¤   ¤   if( IsntPGPError( err ) )
fc5b34 ¤   ¤   {
402621 ¤   ¤   ¤   PGPKeySetRef¤   ¤   ¤   ¤   recipients = kInvalidPGPKeySetRef;
66583c ¤   ¤   ¤   PGPRecipientSettings¤   ¤   settings;
7c249a ¤   ¤   ¤   PGPRecipientOptions¤¤   ¤   options;
e89d61 ¤   ¤   ¤   PGPRecipientSpec¤   ¤   ¤   keySpecs[10];
e826b2 ¤   ¤   ¤   PGPKeySetRef¤   ¤   ¤   ¤   newKeys = kInvalidPGPKeySetRef;
9b87c7 ¤   ¤   ¤
fa0041 ¤   ¤   ¤   settings ¤  = kPGPRecipientSettingsDefault;
b61309 ¤   ¤   ¤   options¤¤   = kPGPRecipientOptionsAlwaysShowDialog;
e887c7 ¤   ¤   ¤
ff6f69 ¤   ¤   ¤   pgpClearMemory( keySpecs, sizeof( keySpecs ) );
2287c7 ¤   ¤   ¤
37b3e5 ¤   ¤   ¤   keySpecs[0].type = kPGPRecipientSpecType_UserID;
a6b50b ¤   ¤   ¤   strcpy( keySpecs[0].u.userIDStr, "ANDREdA" );
4baf5a
c6dd8b ¤   ¤   ¤   UDesktop::Deactivate();
30943f ¤   ¤   ¤   err = PGPClientRecipientDialog( mContext,
47ad18 ¤   ¤   ¤   ¤   ¤   mTLSContext, keySet, 1,
0329fc ¤   ¤   ¤   ¤   ¤   keySpecs, options, settings, &settings,
6af182 ¤   ¤   ¤   ¤   ¤   &recipients, &newKeys );
f7e678 ¤   ¤   ¤   UDesktop::Activate();
e6af5a
85144d ¤   ¤   ¤   pgpAssertNoErr( err );
ff87c7 ¤   ¤   ¤
064e30 ¤   ¤   ¤   if( PGPKeySetRefIsValid( keySet ) )
e6039f ¤   ¤   ¤   ¤   PGPFreeKeySet( keySet );
d7af5a
3aedae ¤   ¤   ¤   if( PGPKeySetRefIsValid( recipients ) )
03b50c ¤   ¤   ¤   ¤   PGPFreeKeySet( recipients );
5287c7 ¤   ¤   ¤
fb4000 ¤   ¤   ¤   if( PGPKeySetRefIsValid( newKeys ) )
fe5eb7 ¤   ¤   ¤   ¤   PGPFreeKeySet( newKeys );
7c0fe4 ¤   ¤   }
1c7454 #endif
21af5a
2db177 #if 0
8ccf44 ¤   ¤   PGPError¤   ¤   err;
43281b ¤   ¤   char¤   ¤   ¤   *passOut;
381b52 ¤   ¤
725677 ¤   ¤   UDesktop::Deactivate();
3d3782 ¤   ¤   err = PGPPassphraseDialog( mContext,·
08914e ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( mContext, &passOut ),
bf1bbb ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) );
d5d170 ¤   ¤   UDesktop::Activate();
fe1b52 ¤   ¤
e07454 #endif
63efe6 }
e8af5a
97ea9f #endif¤ // ] PGP_DEBUG
55af5a
--548f 00040458d7c401200ef Page 1 of CPGPtools.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
2716c1 ¤   $Id: CPGPtools.h,v 1.25.8.1 1998/11/12 03:09:02 heller Exp $
adf7f7 ____________________________________________________________________________*/
c4af5a
b47b7d #pragma once
72af5a
497029 #include <LApplication.h>
e9f1a9 #include <LListener.h>
420a93 #include <LPeriodical.h>
b130df #include <LQueue.h>
11af5a
69e82c #include "pgpPubTypes.h"
41af5a
663a6b #include "PGPtools.h"
16af5a
0baa30 class CPGPtoolsMainWindow;
ddf5f4 class CPGPtoolsTaskList;
f6e0db class CWipeFreeSpaceWizardDialog;
65cc3e class LWindow;
3896b5 class CResultsWindow;
ceaf5a
4b86a1 class CPGPtools : ¤ public LApplication,
114ce3 ¤   ¤   ¤   ¤   ¤   public LPeriodical,
f12442 ¤   ¤   ¤   ¤   ¤   public LListener
7cbb36 {
b75ed4 public:
bcd70c ¤   ¤   ¤   ¤   ¤   ¤   CPGPtools( void );
9c4ed7 ¤   virtual ¤   ¤   ¤   ~CPGPtools();
6667c5 ¤
38a4f3 ¤   void¤   ¤   ¤   ¤   ShowAboutBox();
2d67c5 ¤
8220f3 ¤   void¤   ¤   ¤   ¤   EnqueueTaskList(CPGPtoolsTaskList *taskList);
5e48a0 ¤   virtual void¤   ¤   FindCommandStatus(CommandT inCommand,
b63663 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
f1e9fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName);
10e629 ¤   virtual void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
be2d7b ¤   virtual void¤   ¤   HandleAppleEvent( const AppleEvent &inAppleEvent,
b9d393 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   AppleEvent &outAEReply, AEDesc &outResult,
2a7833 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32 inAENumber );
9fc3bf ¤   virtual Boolean¤¤   ObeyCommand(CommandT inCommand, void* ioParam);¤
f351a0 ¤   virtual void¤   ¤   Run(void);
a0cc99 ¤   virtual¤void¤   ¤   SpendTime(const EventRecord &inMacEvent);
84af5a
1c4a44 ¤   static Boolean¤ ¤   AppCanDoOperation(PGPtoolsOperation operation);
231b61 ¤   static void¤¤   ¤   WipeFreeSpace(short vRefNum = -1)
f4ddde ¤   ¤   ¤   ¤   ¤   ¤   ¤   { mWipeFreeSpaceVRefNum = vRefNum; };
b767c5 ¤
f2a2d3 protected:
3aaf5a
320807 ¤   CResultsWindow ¤¤   ¤   ¤   *mResultsWindow;
6b1a9b ¤   CPGPtoolsMainWindow¤¤   ¤   *mMainWindow;
ec92cd ¤   CWipeFreeSpaceWizardDialog¤ *mWipeFreeDialog;
7967c5 ¤
6637fe ¤   virtual¤void¤   ¤   Initialize(void);
fb1534 ¤   Boolean¤¤   ¤   ¤   SecondaryVerifyEnvironment(void);
cc67c5 ¤
9381e6 #if USE_MAC_DEBUG_LEAKS
741781 ¤   // we need to suspend leaks checking for the duration of these things
6dd3aa ¤   // because PowerPlant will never release certain items
735a8b ¤   virtual void¤   ¤   MakeMenuBar( void )
1df473 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { MacLeaks_Suspend(); LApplication::MakeMenuBar();
06de14 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··MacLeaks_Resume(); }
735c30 ¤   virtual void¤   ¤   MakeModelDirector( void )
832764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { MacLeaks_Suspend(); LApplication::
03fac5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   MakeModelDirector(); MacLeaks_Resume(); }
18ee12 #endif // USE_MAC_DEBUG_LEAKS
7eaf5a
9a0fb9 private:
40af5a
--be88 001b36bfb2f401200ef Page 2 of CPGPtools.h
d0fa21 ¤   Boolean¤¤   ¤   ¤   mAutoQuit;
43e161 ¤   Boolean¤¤   ¤   ¤   mUserLaunchedAppOnly;
8ce30f ¤   LQueue¤ ¤   ¤   ¤   mTaskListQueue;
70065a ¤   Point¤  ¤   ¤   ¤   mLastMouseLocation;
7303de ¤   short¤  ¤   ¤   ¤   mApplicationResFile;
5ec810 ¤   PGPContextRef¤  ¤   mContext;
954baf ¤   PGPtlsContextRef¤   mTLSContext;
3467c5 ¤
28974f ¤   static Boolean¤ ¤   mAppCanEncrypt;
52cc24 ¤   static Boolean¤ ¤   mAppCanSign;
68cf23 ¤   static Boolean¤ ¤   mAppCanDecryptVerify;
809dfa ¤   static short¤   ¤   mWipeFreeSpaceVRefNum;
a667c5 ¤
3a4ebd ¤   void¤   ¤   ¤   ¤   ProcessNextTask( void );
b967c5 ¤
91c718 ¤   virtual Boolean¤¤   AttemptQuitSelf(Int32 inSaveOption);
b56b2a ¤   void¤   ¤   ¤   ¤   GetFinderSelection(TArray<FSSpec> * outSpecsArray);
6fb874 ¤   void¤   ¤   ¤   ¤   ProcessFinderSelection(long inEventCode,
ac5478 ¤   ¤   ¤   ¤   ¤   ¤   ¤   TArray<FSSpec> &inSpecsArray);
bd67c5 ¤
9190e4 ¤   void¤   ¤   ¤   ¤   ReportTaskError( CToolsError err );
f7171b ¤   CToolsError¤¤   ¤   CreateAndEnqueueFileTaskList(
4109e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtoolsOperation operation,
03331d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ushort taskModifiers,
98f642 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec *inSpecs, PGPUInt16 numSpecs );
005d73 ¤   CToolsError¤¤   ¤   CreateAndEnqueueClipboardTask(
c5d68d ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtoolsOperation operation, ushort taskModifiers );
9f16c5 ¤   void¤   ¤   ¤   ¤   CreateAndEnqueueTaskPrompt(PGPtoolsOperation operation);
cee11b ¤   OSErr¤  ¤   ¤   ¤   DoOpenDocAppleEvent(const AppleEvent &inAppleEvent );
12bce3 ¤   void¤   ¤   ¤   ¤   LaunchPGPkeys(void);
4df798 ¤   OSErr¤  ¤   ¤   ¤   ProcessDragAndDrop(const FSSpec *specList,
92401d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 numSpecs);
abaf95 ¤   PGPError¤   ¤   ¤   UpdateContext( Boolean verifyKeyRings );
51360a ¤   void¤   ¤   ¤   ¤   WipeFreeSpaceWizard(short defaultVRefNum);
8c67c5 ¤
945c98 #if PGP_DEBUG
2195e6 ¤   virtual¤void¤   ¤   InstallDebugMenu(void);
b87c36 ¤   virtual¤void¤   ¤   DebugTest(void);
5a1e67 #endif¤ // PGP_DEBUG
e382f7 };
9daf5a
b3a971 extern CPGPtools¤   *gApplication;¶
--4e59 000515fb8cb401200f0 Page 1 of CPGPtoolsBufferTask.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
362b49 ¤   $Id: CPGPtoolsBufferTask.cp,v 1.35.2.1.2.1 1998/11/12 03:09:03 heller Exp $
b4f7f7 ____________________________________________________________________________*/
26af5a
8edd06 #include <UDesktop.h>
3aaf5a
319dc2 #include "CWarningAlert.h"
9fc110 #include "pgpMacMemory.h"
c285c2 #include "MacStrings.h"
20af5a
5d3192 #include "CPGPtools.h"
b51955 #include "CPGPtoolsBufferTask.h"
3d49e1 #include "CPGPtoolsTaskProgressDialog.h"
a66d1f #include "CResultsWindow.h"
4cc01a #include "PGPtoolsEncryptDecrypt.h"
dd133f #include "PGPtoolsResources.h"
302aad #include "PGPtoolsUtils.h"
5ea02f #include "pgpClientLib.h"
784919 #include "pgpUtilities.h"
b9f8d2 #include "PGPSharedEncryptDecrypt.h"
b0af5a
2e8883 CPGPtoolsBufferTask::CPGPtoolsBufferTask(PGPtoolsOperation operation) :
bf661a ¤   ¤   CPGPtoolsCryptoTask( operation )
42bb36 {
f6ded2 ¤   mText ¤ ¤   = NULL;
099ff3 ¤   mTextLength¤= 0;
a7efe6 }
2baf5a
7c544d CPGPtoolsBufferTask::~CPGPtoolsBufferTask(void)
fabb36 {
4fe881 ¤   if( IsntNull( mText ) )
42c7a1 ¤   {
9c1bc7 ¤   ¤   PGPFreeData( mText );
cfe1c5 ¤   ¤   mText = NULL;
969371 ¤   }
deefe6 }
70af5a
40af5a
f6fe82 // MW cannot seem to compile this function without this option
fc9221 #pragma global_optimizer on
68af5a
49fbb0 ¤   CToolsError
a95e8e CPGPtoolsBufferTask::EncryptSign(
5fa1bc ¤   PGPContextRef¤  ¤   context,
446c35 ¤   PGPtlsContextRef¤   tlsContext,
825479 ¤   CEncodeParams¤  ¤   *params)
e9bb36 {
1a7c3e ¤   CToolsError¤err;
9767c5 ¤
e1a76d ¤   pgpAssert( PGPContextRefIsValid( context ) );
7e045b ¤   pgpAssertAddrValid( params, CEncodeParams );
7567c5 ¤
697702 ¤   mContext¤   = context;
2cb920 ¤   mTLSContext¤= tlsContext;
2967c5 ¤
b2e881 ¤   if( IsntNull( mText ) )
eac7a1 ¤   {
10fcfe ¤   ¤   Str255¤ ¤   ¤   itemName;
ff970d ¤   ¤   Boolean¤¤   ¤   done = FALSE;
b98d3e ¤   ¤   PGPContextRef¤  c¤  = context;
2f1b52 ¤   ¤
ee59b0 ¤   ¤   GetTaskItemName( itemName );
5ef286 ¤   ¤   params->progressDialog->SetNewProgressItem( itemName );¤
53af5a
91ccde ¤   ¤   PGPOptionListRef¤   signingOptions¤ = kInvalidPGPOptionListRef;
ad2b97 ¤   ¤   void¤   ¤   ¤   ¤   *outputBuffer¤  = NULL;
6464b3 ¤   ¤   PGPSize¤¤   ¤   ¤   outputBufferSize;
9519f0 ¤   ¤   CEncodeEventHandlerData¤data( this, params );
511b52 ¤   ¤
--a317 0008a707e28401200f0 Page 2 of CPGPtoolsBufferTask.cp
b7b0d4 ¤   ¤   outputBuffer ¤  = NULL;
3e1b52 ¤   ¤
8b4fd0 ¤   ¤   if( params->signing )
2a5b34 ¤   ¤   {
a69897 ¤   ¤   ¤   err.pgpErr = PGPBuildOptionList( c, &signingOptions,
29cdd5 ¤   ¤   ¤   ¤   ¤   PGPOSignWithKey( c, params->signingKey,
a2069c ¤   ¤   ¤   ¤   ¤   ¤   params->signingWithSplitKey ?
b0507c ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( c, params->signingPasskey,
baca36 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·params->signingPasskeySize ) :
44d20c ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( c, params->signingPassphrase ),
392740 ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ) ),
2b90ae ¤   ¤   ¤   ¤   ¤   PGPOClearSign( c, ! params->encrypting ),
476e41 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ) );
f60fe4 ¤   ¤   }
5a0e1d ¤   ¤   else
455b34 ¤   ¤   {
ea7eb3 ¤   ¤   ¤   err.pgpErr¤ = PGPBuildOptionList( c, &signingOptions,
f9b8f8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( c ),
1c4379 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ));
660fe4 ¤   ¤   }
701b52 ¤   ¤
c75a9f ¤   ¤   if( err.IsntError() )
a65b34 ¤   ¤   {
df47f4 ¤   ¤   ¤   err.pgpErr = PGPGuaranteeMinimumEntropy( c );
180fe4 ¤   ¤   }
3567c5 ¤
33f9a8 ¤   ¤   if ( err.IsntError() )
745b34 ¤   ¤   {
092643 ¤   ¤   ¤   err.pgpErr = PGPEncode( c,
477a62 ¤   ¤   ¤   ¤   PGPOInputBuffer( c, mText, mTextLength ),
d95626 ¤   ¤   ¤   ¤   PGPOAllocatedOutputBuffer( c, &outputBuffer,
8602b2 ¤   ¤   ¤   ¤   ¤   ¤   MAX_PGPSize, &outputBufferSize ),
037875 ¤   ¤   ¤   ¤   PGPOArmorOutput( c, TRUE ),
c216dd ¤   ¤   ¤   ¤   PGPODataIsASCII( c, TRUE ),
b0d153 ¤   ¤   ¤   ¤   signingOptions,
8ec1d3 ¤   ¤   ¤   ¤   PGPOptionListRefIsValid( params->encodeOptions ) ?
b1d0ee ¤   ¤   ¤   ¤   ¤   params->encodeOptions : PGPONullOption( c ),
01936b ¤   ¤   ¤   ¤   PGPOEventHandler( c, sEncodeEventHandlerProc,
8010dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   &data ),
ce0cc2 ¤   ¤   ¤   ¤   PGPOSendNullEvents( c, TRUE ),
ac734c ¤   ¤   ¤   ¤   PGPOForYourEyesOnly( c, params->fyeo ),
aa3d3f ¤   ¤   ¤   ¤   PGPOLastOption( c ·) );
100fe4 ¤   ¤   }
c9b820 ¤   ¤   /* can't happen; we verifed earlier that it was good */
0fb1dc ¤   ¤   pgpAssert( err.pgpErr != kPGPError_BadPassphrase );
0caf5a
d13a6d ¤   ¤   if( PGPOptionListRefIsValid( signingOptions ) )
ece87a ¤   ¤   ¤   PGPFreeOptionList( signingOptions );
fd1b52 ¤   ¤
436407 ¤   ¤   if( IsntNull( outputBuffer ) )
7f5b34 ¤   ¤   {
fc2ccf ¤   ¤   ¤   PGPFreeData( mText );
7087c7 ¤   ¤   ¤
68b916 ¤   ¤   ¤   mText ¤ ¤   = outputBuffer;
019915 ¤   ¤   ¤   mTextLength¤= outputBufferSize;
c20fe4 ¤   ¤   }
511b52 ¤   ¤
21fe3c ¤   ¤   if( err.IsntError( ) )
4960a4 ¤   ¤   ¤   err = ProcessOutputData();
2a9371 ¤   }
e167c5 ¤
4eaf5a
2edeb7 ¤   return( err );
e8efe6 }
23af5a
ffe4a1 #pragma global_optimizer reset
8eaf5a
3dfbb0 ¤   CToolsError
3b5ca0 CPGPtoolsBufferTask::DecryptVerify(
1aa1bc ¤   PGPContextRef¤  ¤   context,
ae6c35 ¤   PGPtlsContextRef¤   tlsContext,
8aeedd ¤   CDecodeParams¤  ¤   *params)
--2d72 000f42aac34401200f0 Page 3 of CPGPtoolsBufferTask.cp
2cbb36 {
487c3e ¤   CToolsError¤err;
93af5a
8015a9 ¤   mContext ¤  = context;
3db920 ¤   mTLSContext¤= tlsContext;
5367c5 ¤
c9e881 ¤   if( IsntNull( mText ) )
b0c7a1 ¤   {
0dfcfe ¤   ¤   Str255¤ ¤   ¤   itemName;
ee71f7 ¤   ¤   PGPKeySetRef¤   newKeysSet = kInvalidPGPKeySetRef;
621b52 ¤   ¤
bcf1dc ¤   ¤   CDecodeEventHandlerData¤data( mContext, tlsContext,
c74195 ¤   ¤   ¤   ¤   ¤   this, params );
ee1b52 ¤   ¤
b6505c ¤   ¤   pgpAssertAddrValid( params, CDecodeParams );
3159b0 ¤   ¤   GetTaskItemName( itemName );
44af5a
4612f2 ¤   ¤   err.pgpErr = PGPNewKeySet( context, &newKeysSet );
1e5a9f ¤   ¤   if( err.IsntError() )
d75b34 ¤   ¤   {
24803a ¤   ¤   ¤   err.pgpErr = PGPDecode( context,
df0f0b ¤   ¤   ¤   ¤   ¤   ¤   PGPOInputBuffer( context, mText, mTextLength ),
3a6fd3 ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeySetRef( context, params->allKeys ),
83eb83 ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassThroughIfUnrecognized( context, TRUE ),
2709b4 ¤   ¤   ¤   ¤   ¤   ¤   PGPOEventHandler( context, sDecodeEventHandlerProc,
671388 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &data ),
871e7b ¤   ¤   ¤   ¤   ¤   ¤   PGPOSendNullEvents( context, TRUE ),
7fc43f ¤   ¤   ¤   ¤   ¤   ¤   PGPOImportKeysTo( context, newKeysSet ),
4a931b ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
040fe4 ¤   ¤   }
e41b52 ¤   ¤
79fe3c ¤   ¤   if( err.IsntError( ) )
d75b34 ¤   ¤   {
0a2ccf ¤   ¤   ¤   PGPFreeData( mText );
f187c7 ¤   ¤   ¤
0aa257 ¤   ¤   ¤   mText ¤ ¤   = data.outputData;
560e12 ¤   ¤   ¤   mTextLength¤= data.outputDataSize;
f287c7 ¤   ¤   ¤
edc390 ¤   ¤   ¤   if( data.isFYEO && ( mText != NULL ) )
45f776 ¤   ¤   ¤   {
55aa67 ¤   ¤   ¤   ¤   err.pgpErr = PGPForYourEyesOnlyDialog( context, (char *) mText ¶
1e6275 );
bc6337 ¤   ¤   ¤   ¤   pgpClearMemory( mText, mTextLength );
4fa3a6 ¤   ¤   ¤   }
56bb8c ¤   ¤   ¤   else
15f776 ¤   ¤   ¤   {
1d6ee8 ¤   ¤   ¤   ¤   err = ProcessOutputData();
75a3a6 ¤   ¤   ¤   }
5b87c7 ¤   ¤   ¤
5ecbda ¤   ¤   ¤   if( mSignatureDataValid )
15f776 ¤   ¤   ¤   {
943d94 ¤   ¤   ¤   ¤   CResultsWindow::NewResult( itemName, &mSignatureData );
1ca3a6 ¤   ¤   ¤   }
f387c7 ¤   ¤   ¤
3a8f55 ¤   ¤   ¤   if( err.IsntError() &&
737ffb ¤   ¤   ¤   ¤   PGPKeySetRefIsValid( data.clientHandlerData.newKeySet ) )
72f776 ¤   ¤   ¤   {
36edbb ¤   ¤   ¤   ¤   err.pgpErr = PGPAddKeys( data.clientHandlerData.newKeySet,
e3e66d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeysSet );
ff82e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
5972c3 ¤   ¤   ¤   ¤   {
76699e ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPCommitKeyRingChanges( newKeysSet );
3e2613 ¤   ¤   ¤   ¤   }
5fa3a6 ¤   ¤   ¤   }
bf87c7 ¤   ¤   ¤
a36d97 ¤   ¤   ¤   if( err.IsntError() )
99f776 ¤   ¤   ¤   {
25cc1d ¤   ¤   ¤   ¤   PGPUInt32¤  numNewKeys;
2c87c7 ¤   ¤   ¤
e8c2e1 ¤   ¤   ¤   ¤   err.pgpErr = PGPCountKeys( newKeysSet, &numNewKeys );
70b160 ¤   ¤   ¤   ¤   if( err.IsntError() && numNewKeys > 0 )
f472c3 ¤   ¤   ¤   ¤   {
--5464 00024b25e0c401200f0 Page 4 of CPGPtoolsBufferTask.cp
98f9fc ¤   ¤   ¤   ¤   ¤   // Offer to import the keys
066878 ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   importSet;
ba4fac ¤   ¤   ¤   ¤   ¤   char¤   ¤   ¤   prompt[256];
cfae30 ¤   ¤   ¤   ¤   ¤
de2aa7 ¤   ¤   ¤   ¤   ¤   GetIndCString( prompt, kDialogStringsListResID,
effd65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSelectiveImportFoundKeysPromptStrIndex );
40ae30 ¤   ¤   ¤   ¤   ¤
7490b8 ¤   ¤   ¤   ¤   ¤   UDesktop::Deactivate();
ccc10b ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPSelectKeysDialog( context,
708a90 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation, prompt,
5b7a19 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeysSet, params->allKeys, &importSet );
be35e5 ¤   ¤   ¤   ¤   ¤   UDesktop::Activate();
66ae30 ¤   ¤   ¤   ¤   ¤
14be0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
fd4859 ¤   ¤   ¤   ¤   ¤   {
66a27f ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPSharedAddKeysToDefaultKeyring(
abd752 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   importSet );
2694aa ¤   ¤   ¤   ¤   ¤   ¤
f36449 ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( importSet );
9e1c89 ¤   ¤   ¤   ¤   ¤   }
992613 ¤   ¤   ¤   ¤   }
99a3a6 ¤   ¤   ¤   }
980fe4 ¤   ¤   }
471b52 ¤   ¤
4d576f ¤   ¤   if( PGPKeySetRefIsValid( newKeysSet ) )
5e5949 ¤   ¤   ¤   PGPFreeKeySet( newKeysSet );
1d9371 ¤   }
7367c5 ¤
67deb7 ¤   return( err );
baefe6 }
4aaf5a
32c744 ¤   PGPError
695f0c CPGPtoolsBufferTask::SetText(
630ce1 ¤   PGPByte ¤   *text,
e04185 ¤   PGPSize¤¤   textLength)
7abb36 {
b63bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
aa67c5 ¤
177a32 ¤   pgpAssertAddrValid( text, PGPByte );
3167c5 ¤
26e881 ¤   if( IsntNull( mText ) )
18c7a1 ¤   {
2b3b2c ¤   ¤   mTextLength = 0;
801bc7 ¤   ¤   PGPFreeData( mText );
709371 ¤   }
9c67c5 ¤
806731 ¤   mText = PGPNewData( PGPGetDefaultMemoryMgr(), textLength, 0);
95e881 ¤   if( IsntNull( mText ) )
48c7a1 ¤   {
66533c ¤   ¤   BlockMoveData( text, mText, textLength );
c0cf3f ¤   ¤   mTextLength = textLength;
449371 ¤   }
ca0e24 ¤   else
6ac7a1 ¤   {
f2183c ¤   ¤   pgpDebugMsg( "CPGPtoolsBufferTask::SetData(): Out of memory" );
8bbce1 ¤   ¤   err = kPGPError_OutOfMemory;
739371 ¤   }
1967c5 ¤
8ddeb7 ¤   return( err );
1aefe6 }
b0af5a
fa85ea ¤   OSStatus
7a7122 CPGPtoolsBufferTask::CalcProgressBytes(
98a1bc ¤   PGPContextRef¤  ¤   context,
5ff894 ¤   ByteCount *¤¤   ¤   progressBytes)
5dbb36 {
d16d02 ¤   (void) context;
fc67c5 ¤
7d3c8d ¤   *progressBytes¤ = mTextLength;
4167c5 ¤
4b79ad ¤   return( noErr );
24efe6 }
--eb47 001374b00af401200f0 Page 5 of CPGPtoolsBufferTask.cp
e0af5a
1aaf5a
17af5a
78af5a
32af5a
93af5a
37af5a
--8193 0017fb044a1401200f1 Page 1 of CPGPtoolsBufferTask.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
f3fab3 ¤   $Id: CPGPtoolsBufferTask.h,v 1.10.8.1 1998/11/12 03:09:04 heller Exp $
a0f7f7 ____________________________________________________________________________*/
1aaf5a
6b7b7d #pragma once
2baf5a
a96a51 #include "CPGPtoolsCryptoTask.h"
a1af5a
a370f7 class CPGPtoolsBufferTask : public CPGPtoolsCryptoTask
47bb36 {
335ed4 public:
f68e7d ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsBufferTask(PGPtoolsOperation operation);
63db6d ¤   virtual¤¤   ¤   ¤   ~CPGPtoolsBufferTask(void);
a1531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
2a4b16 ¤   virtual¤OSStatus¤   CalcProgressBytes(PGPContextRef context,
bf32bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ByteCount *bytes);
f7a8f8 ¤   virtual CToolsError¤DecryptVerify(PGPContextRef¤context,
931764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
f77fae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeParams *state);
93acfe ¤   virtual¤CToolsError¤EncryptSign(PGPContextRef context,
181764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
df3c36 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CEncodeParams *state);
eb8d9b ¤   PGPError¤   ¤   ¤   SetText(PGPByte *text, PGPSize textLength);
d6af5a
96a2d3 protected:
41af5a
42804a ¤   void¤   ¤   ¤   ¤   *mText;
7bb028 ¤   PGPSize¤¤   ¤   ¤   mTextLength;
c6af5a
eeada7 ¤   virtual¤CToolsError¤ProcessOutputData(void) = 0;
7fbf26 };¶
--28e0 00064fba6d0401200f2 Page 1 of CPGPtoolsClipboardTask.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
7a529c ¤   $Id: CPGPtoolsClipboardTask.cp,v 1.24.8.1 1998/11/12 03:09:05 heller Exp $
cff7f7 ____________________________________________________________________________*/
deaf5a
27dc1d #include <Scrap.h>
c2af5a
dadd06 #include <UDesktop.h>
46af5a
1ec110 #include "pgpMacMemory.h"
5585c2 #include "MacStrings.h"
a5af5a
85bd6b #include "CPGPtoolsClipboardTask.h"
ff49e1 #include "CPGPtoolsTaskProgressDialog.h"
4c6d1f #include "CResultsWindow.h"
55c01a #include "PGPtoolsEncryptDecrypt.h"
72133f #include "PGPtoolsResources.h"
682aad #include "PGPtoolsUtils.h"
71e684 #include "pgpUserInterface.h"
874919 #include "pgpUtilities.h"
b8f8d2 #include "PGPSharedEncryptDecrypt.h"
34af5a
5a5824 CPGPtoolsClipboardTask::CPGPtoolsClipboardTask(PGPtoolsOperation operation) :
1bee4f ¤   ¤   CPGPtoolsBufferTask( operation )
98bb36 {
4aefe6 }
80af5a
f96e6a CPGPtoolsClipboardTask::~CPGPtoolsClipboardTask(void)
2cbb36 {
cfefe6 }
4caf5a
77eacd ¤   OSErr
f2026e CPGPtoolsClipboardTask::GetClipboardData(PGPContextRef context)
edbb36 {
358e12 ¤   PGPError¤   err = kPGPError_NoErr;
440c0d ¤   long¤   ¤   dataSize;
5acf27 ¤   long¤   ¤   scrapOffset;
e367c5 ¤
44e881 ¤   if( IsntNull( mText ) )
e5c7a1 ¤   {
da1bc7 ¤   ¤   PGPFreeData( mText );
3e1b52 ¤   ¤
bce1c5 ¤   ¤   mText = NULL;
b22e22 ¤   ¤   mTextLength¤= 0;
0f9371 ¤   }
8967c5 ¤
10b1df ¤   // WARNING: It appears that this may return a bogus result with CW11 when
33efd9 ¤   // running with the symbolic debugger. It appears that I always get -108
66fc51 ¤   // (memFullErr?) as dataSize.
4f67c5 ¤
30e609 ¤   dataSize = GetScrap( NULL, 'TEXT', &scrapOffset );
83b5cd ¤   if( dataSize > 0 )
9fc7a1 ¤   {
7da9b2 ¤   ¤   Handle data;
6faf5a
cbb390 ¤   ¤   data = NewHandle( dataSize );
e61fb2 ¤   ¤   if( IsntNull( data ) )
195b34 ¤   ¤   {
1c8fe9 ¤   ¤   ¤   dataSize = GetScrap( data, 'TEXT', (long *) &scrapOffset );
5d4304 ¤   ¤   ¤   if( dataSize > 0 )
1df776 ¤   ¤   ¤   {
adc19d ¤   ¤   ¤   ¤   mText = PGPNewData( PGPGetContextMemoryMgr( context ),
0928e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dataSize, 0);
7d0b76 ¤   ¤   ¤   ¤   if( IsntNull( mText ) )
3472c3 ¤   ¤   ¤   ¤   {
cdc5e8 ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( *data, mText, dataSize );
a348f5 ¤   ¤   ¤   ¤   ¤   mTextLength = dataSize;
ee2613 ¤   ¤   ¤   ¤   }
06fa07 ¤   ¤   ¤   ¤   else
6472c3 ¤   ¤   ¤   ¤   {
--2bc8 00096dc30af401200f2 Page 2 of CPGPtoolsClipboardTask.cp
b0ed29 ¤   ¤   ¤   ¤   ¤   err = kPGPError_OutOfMemory;
2e2613 ¤   ¤   ¤   ¤   }
65a3a6 ¤   ¤   ¤   }
9187c7 ¤   ¤   ¤
aa8e2f ¤   ¤   ¤   DisposeHandle( data );
c40fe4 ¤   ¤   }
4d0e1d ¤   ¤   else
925b34 ¤   ¤   {
ccb90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
733b90 ¤   ¤   }¤
e09371 ¤   }
5d0e24 ¤   else
94c7a1 ¤   {
60c3e7 ¤   ¤   err¤= dataSize;
ec9371 ¤   }
8e67c5 ¤
9ddeb7 ¤   return( err );
95efe6 }
59af5a
4ffbb0 ¤   CToolsError
c75e3f CPGPtoolsClipboardTask::EncryptSign(
9ea1bc ¤   PGPContextRef¤  ¤   context,
e26c35 ¤   PGPtlsContextRef¤   tlsContext,
a5cdc3 ¤   CEncodeParams¤  ¤   *state)
b8bb36 {
f77c3e ¤   CToolsError¤err;
fa67c5 ¤
5f0c23 ¤   err.err = GetClipboardData( context );
6ed3cb ¤   if( err.IsntError() )
d1c7a1 ¤   {
42167a ¤   ¤   err = CPGPtoolsBufferTask::EncryptSign( context, tlsContext, state );
129371 ¤   }
3767c5 ¤
8dab20 ¤   if( ShouldReportError( err ) )
f4c7a1 ¤   {
43afaa ¤   ¤   err = ReportError( err,
d57d08 ¤   ¤   ¤   state->encrypting ? kClipboardCannotBeEncryptedStrIndex :
a512e0 ¤   ¤   ¤   kClipboardCannotBeSignedStrIndex );
309371 ¤   }
faaf5a
d9deb7 ¤   return( err );
c2efe6 }
02af5a
59fbb0 ¤   CToolsError
5c7f16 CPGPtoolsClipboardTask::DecryptVerify(
c7a1bc ¤   PGPContextRef¤  ¤   context,
d36c35 ¤   PGPtlsContextRef¤   tlsContext,
859a8c ¤   CDecodeParams¤  ¤   *state)
31bb36 {
9d7c3e ¤   CToolsError¤err;
1a67c5 ¤
940c23 ¤   err.err = GetClipboardData( context );
93d3cb ¤   if( err.IsntError() )
cec7a1 ¤   {
c60aec ¤   ¤   err = CPGPtoolsBufferTask::DecryptVerify( context, tlsContext, state );
c49371 ¤   }
0267c5 ¤
ddab20 ¤   if( ShouldReportError( err ) )
44c7a1 ¤   {
819e7b ¤   ¤   err = ReportError( err, kClipboardCannotBeDecryptedVerifiedStrIndex );
b29371 ¤   }
001b52 ¤   ¤
35deb7 ¤   return( err );
3befe6 }
32af5a
1dfbb0 ¤   CToolsError
c85906 CPGPtoolsClipboardTask::ProcessOutputData(void)
a8bb36 {
274d51 ¤   Boolean¤processData = TRUE;
ec67c5 ¤
2a1a8c ¤   if( mOperation == kPGPtoolsDecryptVerifyOperation &&
961511 ¤   ¤   mDataType == kPGPAnalyze_Unknown )
--a906 0019c75e06f401200f2 Page 3 of CPGPtoolsClipboardTask.cp
f7c7a1 ¤   {
12d8bb ¤   ¤   processData = FALSE;
9b9371 ¤   }
1467c5 ¤
1419a7 ¤   if( processData )
43c7a1 ¤   {
1c9ce1 ¤   ¤   ZeroScrap();
4e1b52 ¤   ¤
4fc6f6 ¤   ¤   if( mTextLength > 0 )
facbcc ¤   ¤   ¤   PutScrap( mTextLength, 'TEXT', mText );
5b9371 ¤   }
cc1b52 ¤   ¤
9295e9 ¤   return( CToolsError() );
c4efe6 }
c1af5a
0885ea ¤   OSStatus
9fb77b CPGPtoolsClipboardTask::CalcProgressBytes(
c8a1bc ¤   PGPContextRef¤  ¤   context,
92f894 ¤   ByteCount *¤¤   ¤   progressBytes)
90bb36 {
5ef256 ¤   long¤   ¤   scrapSize;¤ // Intentionally signed
c9cf27 ¤   long¤   ¤   scrapOffset;
ea75f8 ¤   OSStatus¤   err¤= noErr;
9e67c5 ¤
986d02 ¤   (void) context;
5d67c5 ¤
9ab1df ¤   // WARNING: It appears that this may return a bogus result with CW11 when
c6efd9 ¤   // running with the symbolic debugger. It appears that I always get -108
6b4fa9 ¤   // (memFullErr?) as progressBytes.
e167c5 ¤
311908 ¤   scrapSize = GetScrap( nil, 'TEXT', &scrapOffset );
7588f2 ¤   if( scrapSize < 0 )
11c7a8 ¤   ¤   scrapSize = 0;
79af5a
5d4cb9 ¤   *progressBytes¤ = scrapSize;
7067c5 ¤
ccdeb7 ¤   return( err );
d5efe6 }
07af5a
6a6d52 ¤   void
83c0f6 CPGPtoolsClipboardTask::GetTaskItemName(StringPtr name)
bebb36 {
721486 ¤   GetIndString( name, kPGPtoolsMiscStringsResID,
759dfd ¤   ¤   ¤   ¤   ¤   kClipboardStrIndex );
b5efe6 }
caaf5a
dc6d52 ¤   void
c06fe3 CPGPtoolsClipboardTask::GetDecryptPassphrasePromptString(StringPtr prompt)
02bb36 {
0d7aac ¤   GetIndString( prompt, kDialogStringsListResID,
9c14bd ¤   ¤   ¤   ¤   kGetPassphraseForClipboardPromptStrIndex );
7cefe6 }
9caf5a
--91ac 001d0d083d5401200f3 Page 1 of CPGPtoolsClipboardTask.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
b2c107 ¤   $Id: CPGPtoolsClipboardTask.h,v 1.13.8.1 1998/11/12 03:09:05 heller Exp $
9af7f7 ____________________________________________________________________________*/
d6af5a
087b7d #pragma once
1caf5a
a61955 #include "CPGPtoolsBufferTask.h"
d2af5a
3b98ab class CPGPtoolsClipboardTask : public CPGPtoolsBufferTask
cbbb36 {
7f5ed4 public:
53bd4d ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsClipboardTask(PGPtoolsOperation operation);
58945a ¤   virtual¤¤   ¤   ¤   ~CPGPtoolsClipboardTask(void);
fc531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
554b16 ¤   virtual¤OSStatus¤   CalcProgressBytes(PGPContextRef context,
9a32bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ByteCount *bytes);
aca8f8 ¤   virtual CToolsError¤DecryptVerify(PGPContextRef¤context,
181764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
367fae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeParams *state);
d9acfe ¤   virtual¤CToolsError¤EncryptSign(PGPContextRef context,
0d1764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
b33c36 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CEncodeParams *state);
caaf5a
0ca2d3 protected:
0baf5a
317186 ¤   virtual¤void¤   ¤   GetDecryptPassphrasePromptString(StringPtr prompt);
da0bcd ¤   virtual¤void¤   ¤   GetTaskItemName(StringPtr name);
40d30f ¤   virtual¤CToolsError¤ProcessOutputData(void);
8e67c5 ¤
d40fb9 private:
a3af5a
21991c ¤   OSErr¤  ¤   ¤   GetClipboardData(PGPContextRef context);
d0bf26 };¶
--4276 0004902bb09401200f4 Page 1 of CPGPtoolsCryptoTask.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
83a2aa ¤   $Id: CPGPtoolsCryptoTask.cp,v 1.29.2.3.2.1 1998/11/12 03:09:06 heller Exp $
79f7f7 ____________________________________________________________________________*/
37af5a
c684be #include <Sound.h>
73af5a
2ca85e #include <LArrayIterator.h>
c9dd06 #include <UDesktop.h>
95afac #include <UModalDialogs.h>
f8af5a
ea59c5 #include "CPGPStDialogHandler.h"
e7d73a #include "CSecureMemory.h"
949dc2 #include "CWarningAlert.h"
83090b #include "MacEvents.h"
a185c2 #include "MacStrings.h"
dfbbf4 #include "MacFiles.h"
8476b7 #include "MacErrors.h"
27a076 #include "pgpKeys.h"
d9af5a
15133f #include "PGPtoolsResources.h"
2b2aad #include "PGPtoolsUtils.h"
b0f8d2 #include "PGPSharedEncryptDecrypt.h"
184919 #include "pgpUtilities.h"
c3c01a #include "PGPtoolsEncryptDecrypt.h"
51a02f #include "pgpClientLib.h"
93af5a
7c6a51 #include "CPGPtoolsCryptoTask.h"
a249e1 #include "CPGPtoolsTaskProgressDialog.h"
bedaf9 #include "CPGPtoolsPassphraseList.h"
aeaf5a
14c25d CPGPtoolsCryptoTask::CPGPtoolsCryptoTask(PGPtoolsOperation operation)
2e0bca ¤   : CPGPtoolsTask( operation )
e3bb36 {
ed4bb3 ¤   mContext ¤  = kInvalidPGPContextRef;
82ef3f ¤   mTLSContext¤= kInvalidPGPtlsContextRef;
8367c5 ¤
c52a7b ¤   mBadPassphraseCount¤¤   = 0;
dc2071 ¤   mDataType¤  ¤   ¤   ¤   = kPGPAnalyze_Unknown;
e7e2be ¤   mSignatureDataValid ¤   = FALSE;
8567c5 ¤
2ee6a5 ¤   pgpClearMemory( &mSignatureData, sizeof( mSignatureData ) );
54efe6 }
e3af5a
a9ddf8 CPGPtoolsCryptoTask::~CPGPtoolsCryptoTask(void)
82bb36 {
f6efe6 }
4daf5a
d5af5a
75af5a
15c744 ¤   PGPError
fb8919 CPGPtoolsCryptoTask::GenericEventHandler(
553981 ¤   PGPEvent *¤ ¤   event,
f53772 ¤   CEventHandlerData *data)
0fbb36 {
0426d5 ¤   PGPError¤   err¤= kPGPError_NoErr;
5c67c5 ¤
2eeefd ¤   if ( event->type == kPGPEvent_NullEvent )
56c7a1 ¤   {
480c42 ¤   ¤   err¤= NullEvent( event, data );
b99371 ¤   }
1b67c5 ¤
4cdeb7 ¤   return( err );
6befe6 }
44af5a
81af5a
5cc744 ¤   PGPError
13b0ed CPGPtoolsCryptoTask::sEncodeEventHandlerProc(
ec520e ¤   PGPContextRef¤  context,
497467 ¤   PGPEvent ¤  ¤   *event,
--597c 0008e1b1cb7401200f4 Page 2 of CPGPtoolsCryptoTask.cp
962e8b ¤   PGPUserValue ¤  userValue)
4cbb36 {
118c5c ¤   CEncodeEventHandlerData *¤  data = (CEncodeEventHandlerData *)userValue;
0467c5 ¤
d43cc4 ¤   (void)context;
b3b5d8 ¤   pgpAssert( IsntNull( data ) ·);
68ac49 ¤   pgpAssert( data->mMagic == CEncodeEventHandlerData::kMagic );
f167c5 ¤
5d81ee ¤   return( data->mTask->EncodeEventHandler( event, data) );
3cefe6 }
85af5a
1fc744 ¤   PGPError
00eddd CPGPtoolsCryptoTask::EncodeEventHandler(
05e33b ¤   PGPEvent *¤ ¤   ¤   ¤   ¤   event,
5882c7 ¤   CEncodeEventHandlerData *¤  data)
80bb36 {
6526d5 ¤   PGPError¤   err¤= kPGPError_NoErr;
e967c5 ¤
46b06f ¤   err¤= GenericEventHandler( event, data );
3d67c5 ¤
f4deb7 ¤   return( err );
66efe6 }
deaf5a
d4af5a
dbc744 ¤   PGPError
1d00ef CPGPtoolsCryptoTask::NullEvent(
04f27c ¤   PGPEvent *¤ ¤   ¤   event,
785c69 ¤   CEventHandlerData *¤data)
8cbb36 {
6f26d5 ¤   PGPError¤   err¤= kPGPError_NoErr;
5b67c5 ¤
7fb15e ¤   if ( IsntNull( data->mParams->progressDialog ) )
f2c7a1 ¤   {
bcc656 ¤   ¤   OSStatus¤   macErr;
7b6308 ¤   ¤   PGPSize¤¤   bytesProcessed;
f39fe4 ¤   ¤   PGPSize¤¤   totalBytes;
5e1b52 ¤   ¤
498380 ¤   ¤   bytesProcessed¤ = event->data.nullData.bytesWritten;
973433 ¤   ¤   totalBytes¤ ¤   = event->data.nullData.bytesTotal;
491b52 ¤   ¤
7c80c2 ¤   ¤   macErr¤ = DoProgress( data->mParams->progressDialog,
3f196e ¤   ¤   ¤   ¤   ¤   bytesProcessed, totalBytes );
1b1b52 ¤   ¤
7fa5a0 ¤   ¤   err¤= MacErrorToPGPError( macErr );
c69371 ¤   }
f267c5 ¤
24deb7 ¤   return( err );
81efe6 }
27da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
eec744 ¤   PGPError
aff5de CPGPtoolsCryptoTask::DecodePassphraseEvent(
04e33b ¤   PGPEvent *¤ ¤   ¤   ¤   ¤   event,
4a346f ¤   CDecodeEventHandlerData¤*¤  data)
9ebb36 {
b47d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
256629 ¤   Boolean¤¤   ¤   ¤   askForPassphrase;
c4ae3b ¤   CSecureCString256¤  passphrase;
3667c5 ¤
db95f9 ¤   askForPassphrase = TRUE;
b0af5a
83d9ac ¤   // Try cached passphrases first
26553f ¤   if( IsntNull( data->passphraseIterator ) )
8cc7a1 ¤   {
b7a378 ¤   ¤   PassphraseListItem¤ passphraseItem;
5b1b52 ¤   ¤
7f7015 ¤   ¤   if( data->passphraseIterator->Next( &passphraseItem ) )
ea5b34 ¤   ¤   {
d383e3 ¤   ¤   ¤   askForPassphrase = FALSE;
340df1 ¤   ¤   ¤   CopyCString( passphraseItem.passphrase, passphrase );
cc0fe4 ¤   ¤   }
790e1d ¤   ¤   else
8e5b34 ¤   ¤   {
--567a 0009e753461401200f4 Page 3 of CPGPtoolsCryptoTask.cp
c9d1d7 ¤   ¤   ¤   data->passphraseIterator->ResetTo( 0 );
1c0fe4 ¤   ¤   }
139371 ¤   }
fb67c5 ¤
191893 ¤   if( askForPassphrase )
5dc7a1 ¤   {
a7b5a4 ¤   ¤   uchar¤  *prompt = (uchar *) data->clientHandlerData.prompt;
a71b52 ¤   ¤
cb9320 ¤   ¤   if( mBadPassphraseCount > 0 )
fe5b34 ¤   ¤   {
240ad8 ¤   ¤   ¤   Str255¤ temp;
9187c7 ¤   ¤   ¤
24c2cb ¤   ¤   ¤   SysBeep( 1 );
2f87c7 ¤   ¤   ¤
d46cb0 ¤   ¤   ¤   GetIndString( prompt, kDialogStringsListResID,
ba8c26 ¤   ¤   ¤   ¤   ¤   kIncorrectPassphrasePrefixStrIndex );
f31aff ¤   ¤   ¤   GetDecryptPassphrasePromptString( temp );
d878bc ¤   ¤   ¤   PrintPString( prompt, prompt, temp );
0b0fe4 ¤   ¤   }
7d0e1d ¤   ¤   else
b55b34 ¤   ¤   {
c82dd4 ¤   ¤   ¤   GetDecryptPassphrasePromptString( prompt );
510fe4 ¤   ¤   }
9aaf5a
e0ea86 ¤   ¤   PToCString( prompt, data->clientHandlerData.prompt );
a31b52 ¤   ¤
305677 ¤   ¤   UDesktop::Deactivate();
af7099 ¤   ¤   ¤   err = PGPClientDecodeEventHandler( mContext, event,
6fbf3b ¤   ¤   ¤   ¤   ¤   ¤   &data->clientHandlerData );
cfd170 ¤   ¤   UDesktop::Activate();
f01b52 ¤   ¤
7586f8 ¤   ¤   if( IsntPGPError( err ) )
9e5b34 ¤   ¤   {
30c2eb ¤   ¤   ¤   if( PGPGetPassBufferType( data->clientHandlerData.passBuffer ) ==
d5240d ¤   ¤   ¤   ¤   ¤   ¤   kPGPPassBufferType_Passphrase )
30f776 ¤   ¤   ¤   {
38c9cd ¤   ¤   ¤   ¤   CDecodeParams ¤ *params = (CDecodeParams *)data->mParams;
c8c69f ¤   ¤   ¤   ¤   char¤   ¤   ¤   *passphrase;
232b85 ¤   ¤   ¤   ¤
1a9bdd ¤   ¤   ¤   ¤   (void) PGPPassBufferGetPassphrasePtr(
d0cad3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->clientHandlerData.passBuffer, &passphrase );
f6e178 ¤   ¤   ¤   ¤   pgpAssert( IsntNull( passphrase ) );
8a2b85 ¤   ¤   ¤   ¤
708c8e ¤   ¤   ¤   ¤   params->passphraseList->RememberPassphrase( mContext,
b0e268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   passphrase );
8da3a6 ¤   ¤   ¤   }
360fe4 ¤   ¤   }
101b52 ¤   ¤
500b8f ¤   ¤   ++mBadPassphraseCount;
b99371 ¤   }
730e24 ¤   else
86c7a1 ¤   {
ad2944 ¤   ¤   err = PGPAddJobOptions( event->job,
5e4204 ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( mContext, passphrase ),
b31bbb ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) );
879371 ¤   }
baaf5a
68deb7 ¤   return( err );
32efe6 }
8daf5a
71af5a
53c744 ¤   PGPError
30cd27 CPGPtoolsCryptoTask::DecodeRecipientsEvent(
7ee33b ¤   PGPEvent *¤ ¤   ¤   ¤   ¤   event,
02346f ¤   CDecodeEventHandlerData¤*¤  data)
ecbb36 {
558e12 ¤   PGPError¤   err = kPGPError_NoErr;
dd67c5 ¤
4d3bd2 ¤   err = PGPClientDecodeEventHandler( mContext, event,
ae312a ¤   ¤   ¤   ¤   &data->clientHandlerData );
ec67c5 ¤
9edeb7 ¤   return( err );
--3950 0007e67c334401200f4 Page 4 of CPGPtoolsCryptoTask.cp
7aefe6 }
46af5a
b0c744 ¤   PGPError
b42cc3 CPGPtoolsCryptoTask::DecodeSignatureEvent(
5267cc ¤   PGPEvent ¤  ¤   ¤   ¤   ¤   *event,
d85e9e ¤   CDecodeEventHandlerData¤¤   *data)
53bb36 {
3961e0 ¤   PGPError¤   err;
8e67c5 ¤
053bd2 ¤   err = PGPClientDecodeEventHandler( mContext, event,
0f312a ¤   ¤   ¤   ¤   &data->clientHandlerData );
71b1f0 ¤   if( IsntPGPError( err ) )
e7c7a1 ¤   {
5a249e ¤   ¤   mSignatureData.data = data->clientHandlerData.signatureData;
fffc48 ¤   ¤   mSignatureDataValid = data->clientHandlerData.signatureDataValid;
ea1b52 ¤   ¤
fa9b1a ¤   ¤   mSignatureData.signingKeyIDStr[0] = 0;
ae1b52 ¤   ¤
2324a9 ¤   ¤   if( mSignatureDataValid )
ee5b34 ¤   ¤   {
fe4dda ¤   ¤   ¤   (void)PGPGetKeyIDString(·
ab225e ¤   ¤   ¤   ¤   ¤   &mSignatureData.data.signingKeyID,
7861ff ¤   ¤   ¤   ¤   ¤   kPGPKeyIDString_Abbreviated,
1b5721 ¤   ¤   ¤   ¤   ¤   mSignatureData.signingKeyIDStr );
af0fe4 ¤   ¤   }
e89371 ¤   }
59af5a
7fdeb7 ¤   return( err );
1defe6 }
d1af5a
efaf5a
7ec744 ¤   PGPError
f2774c CPGPtoolsCryptoTask::DecodeAnalyzeEvent(
5667cc ¤   PGPEvent ¤  ¤   ¤   ¤   ¤   *event,
615e9e ¤   CDecodeEventHandlerData¤¤   *data)
dabb36 {
0628d2 ¤   (void) data;
0e67c5 ¤
6a7807 ¤   if( mDataType == kPGPAnalyze_Unknown &&
4e12c8 ¤   ¤   event->data.analyzeData.sectionType != kPGPAnalyze_Unknown &&
92d38d ¤   ¤   event->data.analyzeData.sectionType != kPGPAnalyze_Key )
94c7a1 ¤   {
3073ba ¤   ¤   mDataType = event->data.analyzeData.sectionType;
529371 ¤   }
9c67c5 ¤
742d68 ¤   return( kPGPError_NoErr );
75efe6 }
9caf5a
eac744 ¤   PGPError
22354d CPGPtoolsCryptoTask::DecodeEventHandler(
30e33b ¤   PGPEvent *¤ ¤   ¤   ¤   ¤   event,
79f821 ¤   CDecodeEventHandlerData *¤  data)
99bb36 {
823bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
6da19a ¤   CDecodeParams *¤params¤ = (CDecodeParams *)data->mParams;
cc67c5 ¤
02a505 ¤   switch( event->type )
90c7a1 ¤   {
b69ae3 ¤   ¤   default:
c85b34 ¤   ¤   {
ab7099 ¤   ¤   ¤   err = PGPClientDecodeEventHandler( mContext, event,
37bf3b ¤   ¤   ¤   ¤   ¤   ¤   &data->clientHandlerData );
91698b ¤   ¤   ¤   if( IsntPGPError( err ) )
d6f776 ¤   ¤   ¤   {
985227 ¤   ¤   ¤   ¤   err¤= GenericEventHandler( event, data );
7ea3a6 ¤   ¤   ¤   }
3b87c7 ¤   ¤   ¤
b1cdcb ¤   ¤   ¤   break;
2a0fe4 ¤   ¤   }
f71b52 ¤   ¤
f90c1c ¤   ¤   case kPGPEvent_InitialEvent:
7e5b34 ¤   ¤   {
--6714 00085e54a0e401200f4 Page 5 of CPGPtoolsCryptoTask.cp
9fe8ae ¤   ¤   ¤   mBadPassphraseCount = 0;
329822 ¤   ¤   ¤   mDataType¤  ¤   ¤   = kPGPAnalyze_Unknown;
aa87c7 ¤   ¤   ¤
b0fb08 ¤   ¤   ¤   if( IsntNull( params->passphraseList ) )
44f776 ¤   ¤   ¤   {
7122b1 ¤   ¤   ¤   ¤   data->passphraseIterator =
b836b5 ¤   ¤   ¤   ¤   ¤   new LArrayIterator( *(params->passphraseList) );
c5a3a6 ¤   ¤   ¤   }
eeaf5a
44cdcb ¤   ¤   ¤   break;
320fe4 ¤   ¤   }
241b52 ¤   ¤
710c74 ¤   ¤   case kPGPEvent_AnalyzeEvent:
e45b34 ¤   ¤   {
e086c7 ¤   ¤   ¤   err = DecodeAnalyzeEvent( event, data );
f4cdcb ¤   ¤   ¤   break;
810fe4 ¤   ¤   }
00af5a
02a537 ¤   ¤   case kPGPEvent_PassphraseEvent:
5d5b34 ¤   ¤   {
d944f8 ¤   ¤   ¤   err = DecodePassphraseEvent( event, data );
48cdcb ¤   ¤   ¤   break;
b50fe4 ¤   ¤   }
36af5a
d19dce ¤   ¤   case kPGPEvent_RecipientsEvent:
2a5b34 ¤   ¤   {
d18a51 ¤   ¤   ¤   err = DecodeRecipientsEvent( event, data );
63cdcb ¤   ¤   ¤   break;
0d0fe4 ¤   ¤   }
791b52 ¤   ¤
61c503 ¤   ¤   case kPGPEvent_SignatureEvent:
635b34 ¤   ¤   {
b78049 ¤   ¤   ¤   err = DecodeSignatureEvent( event, data );
d5cdcb ¤   ¤   ¤   break;
000fe4 ¤   ¤   }
2aaf5a
0c1b52 ¤   ¤
071fbb ¤   ¤   case kPGPEvent_FinalEvent:
e15b34 ¤   ¤   {
fcd47f ¤   ¤   ¤   delete data->passphraseIterator;
112eba ¤   ¤   ¤   data->passphraseIterator¤   = NULL;
d2cdcb ¤   ¤   ¤   break;
cd0fe4 ¤   ¤   }
0f1b52 ¤   ¤
421b52 ¤   ¤
8f6773 ¤   ¤   case kPGPEvent_OutputEvent:
965b34 ¤   ¤   {
933747 ¤   ¤   ¤   if( event->data.outputData.forYourEyesOnly )
7df776 ¤   ¤   ¤   {
ec96d3 ¤   ¤   ¤   ¤   data->isFYEO = true;
37a3a6 ¤   ¤   ¤   }
0a87c7 ¤   ¤   ¤
b77099 ¤   ¤   ¤   err = PGPClientDecodeEventHandler( mContext, event,
babf3b ¤   ¤   ¤   ¤   ¤   ¤   &data->clientHandlerData );
7caf5a
d6698b ¤   ¤   ¤   if( IsntPGPError( err ) )
56f776 ¤   ¤   ¤   {
145227 ¤   ¤   ¤   ¤   err¤= GenericEventHandler( event, data );
8fa3a6 ¤   ¤   ¤   }
eb87c7 ¤   ¤   ¤
dccdcb ¤   ¤   ¤   break;
000fe4 ¤   ¤   }
7a1b52 ¤   ¤
b01b52 ¤   ¤
82cb7a ¤   ¤   case kPGPEvent_EndLexEvent:
505b34 ¤   ¤   {
158a27 ¤   ¤   ¤   if( data->clientHandlerData.outputBufferSize != 0 )
48f776 ¤   ¤   ¤   {
83dd8c ¤   ¤   ¤   ¤   if( data->outputDataSize == 0 )
4672c3 ¤   ¤   ¤   ¤   {
06d98f ¤   ¤   ¤   ¤   ¤   data->outputDataSize = data->clientHandlerData.outputBuffer¶
85fb80 Size;
--273b 0007922826f401200f4 Page 6 of CPGPtoolsCryptoTask.cp
9b95da ¤   ¤   ¤   ¤   ¤   data->outputData = PGPNewSecureData(
0c7cfb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( mContext ),
3c6695 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->outputDataSize + 1,
3680b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMemoryMgrFlags_None );
8ff3a9 ¤   ¤   ¤   ¤   ¤   if( IsNull( data->outputData ) )
8b4859 ¤   ¤   ¤   ¤   ¤   {
6bbe32 ¤   ¤   ¤   ¤   ¤   ¤   err = kPGPError_OutOfMemory;
3b1c89 ¤   ¤   ¤   ¤   ¤   }
14e117 ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( data->clientHandlerData.outputBuffer,
1add87 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ···data->outputData,
9429de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ···data->outputDataSize );
2a5f8b ¤   ¤   ¤   ¤   ¤   ( (char *) data->outputData )[data->outputDataSize] = 0;
2e2613 ¤   ¤   ¤   ¤   }
fffa07 ¤   ¤   ¤   ¤   else
d172c3 ¤   ¤   ¤   ¤   {
d34c5e ¤   ¤   ¤   ¤   ¤   PGPSize¤newSize = data->outputDataSize +
a8107f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   data->clientHandlerData.outputBufferSize;
3eae30 ¤   ¤   ¤   ¤   ¤
88f9c0 ¤   ¤   ¤   ¤   ¤   err = PGPReallocData( PGPGetContextMemoryMgr( mContext ),
a8833a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··&data->outputData,
790f0c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··newSize + 1,
cf7f5d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··kPGPMemoryMgrFlags_None );
516ca0 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
db4859 ¤   ¤   ¤   ¤   ¤   {
ab7ccd ¤   ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( data->clientHandlerData.outputBuffer,
4451c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ···( (char *) data->outputData) + data->out¶
e15e3b putDataSize,
7cd9b9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ···data->clientHandlerData.outputBufferSize¶
ff54c8 ·);
aa84f6 ¤   ¤   ¤   ¤   ¤   ¤   ( (char *) data->outputData )[newSize] = 0;
28ec79 ¤   ¤   ¤   ¤   ¤   ¤   data->outputDataSize = newSize;
bd1c89 ¤   ¤   ¤   ¤   ¤   }
4b2613 ¤   ¤   ¤   ¤   }
36a3a6 ¤   ¤   ¤   }
e987c7 ¤   ¤   ¤
70aca7 ¤   ¤   ¤   PGPError¤   clientHandlerErr;
c987c7 ¤   ¤   ¤
6af03f ¤   ¤   ¤   clientHandlerErr = PGPClientDecodeEventHandler( mContext, event,
fd65c0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &data->clientHandlerData );
94d2bf ¤   ¤   ¤   if( IsntPGPError( clientHandlerErr ) )
15f776 ¤   ¤   ¤   {
c4c75c ¤   ¤   ¤   ¤   clientHandlerErr¤   = GenericEventHandler( event, data );
daa3a6 ¤   ¤   ¤   }
d787c7 ¤   ¤   ¤
c83c6b ¤   ¤   ¤   if ( IsntPGPError( err ) )
d6f776 ¤   ¤   ¤   {
913b74 ¤   ¤   ¤   ¤   err = clientHandlerErr;
2aa3a6 ¤   ¤   ¤   }
9687c7 ¤   ¤   ¤
ddcdcb ¤   ¤   ¤   break;
ee0fe4 ¤   ¤   }
1a9371 ¤   }
4767c5 ¤
a4deb7 ¤   return( err );
6eefe6 }
7baf5a
b8c744 ¤   PGPError
b817ef CPGPtoolsCryptoTask::sDecodeEventHandlerProc(
cb35f6 ¤   PGPContextRef ¤ context,
627467 ¤   PGPEvent ¤  ¤   *event,
012e8b ¤   PGPUserValue ¤  userValue)
0cbb36 {
4306ee ¤   PGPError¤   ¤   ¤   ¤   ¤   err;
e580f7 ¤   CDecodeEventHandlerData *¤  data¤   = (CDecodeEventHandlerData *)userValue;
2567c5 ¤
ef3cc4 ¤   (void)context;
0eb5d8 ¤   pgpAssert( IsntNull( data ) ·);
3f2e0b ¤   pgpAssert( data->mMagic == CDecodeEventHandlerData::kMagic );
ac67c5 ¤
1ce4ab ¤   err = data->mTask->DecodeEventHandler( event, data );
8d67c5 ¤
79deb7 ¤   return( err );
--09f6 001851c6298401200f4 Page 7 of CPGPtoolsCryptoTask.cp
7aefe6 }
46af5a
8eaf5a
79af5a
85af5a
--be0b 00007c7bdde401200f5 Page 1 of CPGPtoolsCryptoTask.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
086051 ¤   $Id: CPGPtoolsCryptoTask.h,v 1.15.2.1.2.1 1998/11/12 03:09:07 heller Exp $
e9f7f7 ____________________________________________________________________________*/
4eaf5a
3a7b7d #pragma once
b0af5a
57bf4a #include "MacSecureMemory.h"
49fdf0 #include "WarningAlertTypes.h"
6eaf5a
063a6b #include "PGPtools.h"
379f63 #include "pgpEncode.h"
2ae684 #include "pgpUserInterface.h"
c8f8d2 #include "PGPSharedEncryptDecrypt.h"
11a4d3 #include "CResultsTable.h"
37a02f #include "pgpClientLib.h"
d9af5a
da1d63 struct PGPKeySpec;
f91db2 class CPGPtoolsTaskProgressDialog;
62d156 class LArray;
aca440 class CPGPtoolsPassphraseList;
56af5a
9757a2 #include "CPGPtoolsTask.h"
aeaf5a
240335 /*____________________________________________________________________________
64d868 ¤   The encode/decode params should contain only information need by a
98811b ¤   task to set up and get started. ·It should not be used for callback info.
87f7f7 ____________________________________________________________________________*/
87782a class CEncodeDecodeParams
7fbb36 {
fa5ed4 public:
23aef7 ¤   CPGPtoolsTaskProgressDialog¤*progressDialog;
60e703 ¤   PGPKeySetRef¤   ¤   ¤   ¤   allKeys;
4867c5 ¤
3ffce8 ¤   CEncodeDecodeParams( void )
11c7a1 ¤   {
4c0e8d ¤   ¤   progressDialog¤ ¤   = NULL;
6837e2 ¤   ¤   allKeys¤¤   ¤   ¤   = kInvalidPGPKeySetRef;
759371 ¤   }
6ad564 ¤   virtual ~CEncodeDecodeParams( void )
60c7a1 ¤   {
ec9371 ¤   }
8482f7 };
77af5a
c1af5a
086818 class CDecodeParams : public CEncodeDecodeParams
96bb36 {
0a5ed4 public:
580cd7 ¤   CPGPtoolsPassphraseList¤¤   *passphraseList;
0267c5 ¤
0d4cbe ¤   CDecodeParams( void ) : CEncodeDecodeParams()
cfc7a1 ¤   {
17006b ¤   ¤   passphraseList¤ ¤   = NULL;
3f9371 ¤   }
792fa1 } ;
04af5a
d5b720 class CEncodeParams : public CEncodeDecodeParams
dbbb36 {
505ed4 public:
f103e5 ¤   PGPOptionListRef¤   ¤   ¤   encodeOptions;
6e00ae ¤   Boolean¤¤   ¤   ¤   ¤   ¤   encrypting;
c98c63 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   conventionalEncrypt;
74581d ¤   Boolean¤¤   ¤   ¤   ¤   ¤   signing;
4b84b4 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   detachedSignature;
2d35cc ¤   Boolean¤¤   ¤   ¤   ¤   ¤   textOutput;
9a45b8 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   wipeOriginal;
68641a ¤   Boolean¤¤   ¤   ¤   ¤   ¤   encryptingToSelf;
0113bd ¤   Boolean¤¤   ¤   ¤   ¤   ¤   signingWithSplitKey;
4819d7 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   fyeo;
071499 ¤   PGPKeyRef¤  ¤   ¤   ¤   ¤   signingKey;
--e79d 000756cd28b401200f5 Page 2 of CPGPtoolsCryptoTask.h
5364e7 ¤   PGPLocalEncodingFlags¤  ¤   encodingFlags;
e6a041 ¤   CSecureCString256¤  ¤   ¤   signingPassphrase;
6ca7c1 ¤   PGPByte¤¤   ¤   ¤   ¤   ¤   *signingPasskey;
d17b4b ¤   PGPSize¤¤   ¤   ¤   ¤   ¤   signingPasskeySize;
0967c5 ¤
6e28b3 ¤   CEncodeParams( void )
d97077 ¤   ¤   : CEncodeDecodeParams()
08c7a1 ¤   {
6b9254 ¤   ¤   encodeOptions¤  ¤   ¤   = kInvalidPGPOptionListRef;
dbd7da ¤   ¤   encrypting¤ ¤   ¤   ¤   = FALSE;
742be4 ¤   ¤   signing¤¤   ¤   ¤   ¤   = FALSE;
fe3a13 ¤   ¤   wipeOriginal¤   ¤   ¤   = FALSE;
c474da ¤   ¤   detachedSignature¤  ¤   = FALSE;
e7c3d2 ¤   ¤   textOutput¤ ¤   ¤   ¤   = FALSE;
2c90d7 ¤   ¤   signingWithSplitKey¤¤   = FALSE;
d84393 ¤   ¤   fyeo¤   ¤   ¤   ¤   ¤   = FALSE;
e1d86e ¤   ¤   signingKey¤ ¤   ¤   ¤   = kInvalidPGPKeyRef;
d31d2f ¤   ¤   signingPasskey¤ ¤   ¤   = NULL;
fe6a96 ¤   ¤   signingPasskeySize¤ ¤   = 0;
1d9371 ¤   }
4d67c5 ¤
195df5 ¤   virtual ~CEncodeParams( void )
c1c7a1 ¤   {
0cc3e8 ¤   ¤   if( PGPOptionListRefIsValid( encodeOptions ) )
831ed2 ¤   ¤   ¤   PGPFreeOptionList( encodeOptions );
3e87c7 ¤   ¤   ¤
7df8c7 ¤   ¤   if( IsntNull( signingPasskey ) )
091767 ¤   ¤   ¤   PGPFreeData( signingPasskey );
019371 ¤   }
8667c5 ¤
422fa1 } ;
15af5a
c7af5a
bbaf5a
5faf5a
f6dc77 class CPGPtoolsCryptoTask : public CPGPtoolsTask
04bb36 {
425ed4 public:
da81fa ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsCryptoTask(PGPtoolsOperation operation);
eac63d ¤   virtual¤¤   ¤   ¤   ~CPGPtoolsCryptoTask(void);
74af5a
2095ac ¤   virtual¤CToolsError¤DecryptVerify(PGPContextRef context,
7e1764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
85b955 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeParams *state) = 0;
c2acfe ¤   virtual¤CToolsError¤EncryptSign(PGPContextRef context,
b71764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
645b50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CEncodeParams *state) = 0;
7467c5 ¤
92a2d3 protected:
a6af5a
6ed2fa ¤   PGPContextRef¤  ¤   ¤   mContext;
640996 ¤   PGPtlsContextRef¤   ¤   mTLSContext;
8394cc ¤   UInt32¤ ¤   ¤   ¤   ¤   mBadPassphraseCount;
68609a ¤   PGPAnalyzeType¤ ¤   ¤   mDataType;
bbf527 ¤   PGPtoolsSignatureData¤  mSignatureData;
a0acef ¤   Boolean¤¤   ¤   ¤   ¤   mSignatureDataValid;
4c67c5 ¤
656a98 ¤   class CEventHandlerData
90c7a1 ¤   {
4467d4 ¤   public:
817fcd ¤   ¤   enum { kMagic = 'EHND' };
548b88 ¤   ¤   OSType¤ ¤   ¤   ¤   ¤   mMagic;
3c3e85 ¤   ¤   CPGPtoolsCryptoTask *¤  mTask;
bd1b17 ¤   ¤   CEncodeDecodeParams *¤  mParams;
011b52 ¤   ¤
219029 ¤   ¤   CEventHandlerData( CPGPtoolsCryptoTask *task,
83a12f ¤   ¤   ¤   ¤   CEncodeDecodeParams *params )
ef5b34 ¤   ¤   {
2260bc ¤   ¤   ¤   mMagic¤ = kMagic;
bc5a71 ¤   ¤   ¤   mTask¤  = task;
c9ab0b ¤   ¤   ¤   mParams¤= params;
750fe4 ¤   ¤   }
--dc7c 000b76887a4401200f5 Page 3 of CPGPtoolsCryptoTask.h
f11b52 ¤   ¤
1a9cc4 ¤   ¤   virtual ~CEventHandlerData(void) {}
13c21f ¤   } ;
bf67c5 ¤
d38ff0 ¤   class CDecodeEventHandlerData : public CEventHandlerData
4cc7a1 ¤   {
4d67d4 ¤   public:
15449a ¤   ¤   Boolean¤¤   ¤   ¤   ¤   ¤   ¤   retryingSigVerification;
89c0b1 ¤   ¤   LArrayIterator *¤   ¤   ¤   ¤   passphraseIterator;
ad2532 ¤   ¤   Boolean¤¤   ¤   ¤   ¤   ¤   ¤   isFYEO;
0a711b ¤   ¤   void *¤ ¤   ¤   ¤   ¤   ¤   ¤   outputData;
d896ec ¤   ¤   PGPSize¤¤   ¤   ¤   ¤   ¤   ¤   outputDataSize;
d9af5a
71b64d ¤   ¤   PGPClientDecodeEventHandlerData¤clientHandlerData;
c51b52 ¤   ¤
5a1f3a ¤   ¤   CDecodeEventHandlerData( PGPContextRef context,
2159dc ¤   ¤   ¤   PGPtlsContextRef tlsContext,
d2e1f2 ¤   ¤   ¤   CPGPtoolsCryptoTask *task, CDecodeParams *state)
da209e ¤   ¤   ¤   : CEventHandlerData( task, state )
e95b34 ¤   ¤   {
6de46c ¤   ¤   ¤   PGPError¤   err;
1287c7 ¤   ¤   ¤
f0bca6 ¤   ¤   ¤   retryingSigVerification¤= FALSE;
df9c2f ¤   ¤   ¤   passphraseIterator¤ ¤   = NULL;
5ae455 ¤   ¤   ¤   isFYEO¤ ¤   ¤   ¤   ¤   = FALSE;
94d51a ¤   ¤   ¤   outputData¤ ¤   ¤   ¤   = NULL;
d7a931 ¤   ¤   ¤   outputDataSize¤ ¤   ¤   = 0;
ed87c7 ¤   ¤   ¤
e72dde ¤   ¤   ¤   err = PGPInitClientDecodeEventHandlerData(
32f8eb ¤   ¤   ¤   ¤   ¤   ¤   context, tlsContext,
c5f6b6 ¤   ¤   ¤   ¤   ¤   ¤   state->allKeys,
ea76e0 ¤   ¤   ¤   ¤   ¤   ¤   &clientHandlerData );
fe144d ¤   ¤   ¤   pgpAssertNoErr( err );
7ea105 ¤   ¤   };
7baf5a
81866c ¤   ¤   virtual ~CDecodeEventHandlerData(void)
d35b34 ¤   ¤   {
2d71fc ¤   ¤   ¤   PGPCleanupClientDecodeEventHandlerData(
4973cb ¤   ¤   ¤   ¤   &clientHandlerData );
d6a105 ¤   ¤   };
0ac21f ¤   } ;
d067c5 ¤
98a2e2 ¤   class CEncodeEventHandlerData : public CEventHandlerData
09c7a1 ¤   {
d567d4 ¤   public:
85a5a6 ¤   ¤   CEncodeEventHandlerData( CPGPtoolsCryptoTask *task,
325deb ¤   ¤   ¤   CEncodeDecodeParams *state )
05209e ¤   ¤   ¤   : CEventHandlerData( task, state )
b15b34 ¤   ¤   {
2a0fe4 ¤   ¤   }
82c21f ¤   } ;
7167c5 ¤
0700af ¤   virtual¤PGPError¤   NullEvent( PGPEvent *event,
cf6ced ¤   ¤   ¤   ¤   ¤   ¤   ¤   CEventHandlerData *data);
d2da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
0b758d ¤   virtual PGPError¤   GenericEventHandler( PGPEvent *event,
59cb36 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CEventHandlerData *state);
af531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
883b7d ¤   virtual PGPError¤   DecodeEventHandler( PGPEvent *event,
4e6858 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeEventHandlerData *state);
dd531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
f837cf ¤   virtual PGPError¤   EncodeEventHandler( PGPEvent *event,
55579f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CEncodeEventHandlerData *data);
8ada4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
35c375 ¤   virtual¤PGPError¤   DecodeAnalyzeEvent(PGPEvent *event,
2cfc37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeEventHandlerData *data);
4fda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
b8c22c ¤   virtual¤PGPError¤   DecodePassphraseEvent(
ffe727 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event,
66fc37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeEventHandlerData *data);
68da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
b7fad5 ¤   virtual¤PGPError¤   DecodeRecipientsEvent(
--b7cb 0012b005ef3401200f5 Page 4 of CPGPtoolsCryptoTask.h
c0e727 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event,
6dfc37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeEventHandlerData *data);
aeaf5a
226d95 ¤   virtual¤PGPError¤   DecodeSignatureEvent(
37e727 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event,
defc37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeEventHandlerData *data);
84da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
0dc3c5 ¤   virtual¤void¤   ¤   GetDecryptPassphrasePromptString(StringPtr prompt) = 0;
f567c5 ¤
486959 ¤   static OSStatus¤¤   sProgressCallbackProc(UInt32 bytesProcessed,
5d0704 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 totalBytesToProcess, void *userData);
9bda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
3dd831 ¤   static PGPError¤¤   sEncodeEventHandlerProc(PGPContextRef context,
4e32a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event, PGPUserValue userValue);
e5b4d3 ¤   static PGPError¤¤   sDecodeEventHandlerProc(PGPContextRef context,
e332a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event, PGPUserValue userValue);
2c531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
0f82f7 };
b4af5a
2baf5a
--6d4b 000cfc0c36a401200f6 Page 1 of CPGPtoolsFileTask.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
ccd0d0 ¤   $Id: CPGPtoolsFileTask.cp,v 1.65.2.4.2.1 1998/11/12 03:09:08 heller Exp $
2af7f7 ____________________________________________________________________________*/
1aaf5a
04b0f8 #include <LArray.h>
7015dd #include <LComparator.h>
dadd56 #include <PP_Messages.h>
10dd06 #include <UDesktop.h>
1aaf5a
bd894b #include "pgpFileSpec.h"
f7add5 #include "pgpShareFile.h"
dfe684 #include "pgpUserInterface.h"
bd4919 #include "pgpUtilities.h"
3caf5a
4276b7 #include "MacErrors.h"
fbbbf4 #include "MacFiles.h"
8585c2 #include "MacStrings.h"
ce0d08 #include "pgpMem.h"
434919 #include "pgpUtilities.h"
73af5a
3f3ecd #include "CPGPtoolsProcessingList.h"
58af5a
99c756 #include "CPGPtoolsFileTask.h"
e649e1 #include "CPGPtoolsTaskProgressDialog.h"
7b6d1f #include "CResultsWindow.h"
aac01a #include "PGPtoolsEncryptDecrypt.h"
6c133f #include "PGPtoolsResources.h"
912aad #include "PGPtoolsUtils.h"
774dfe #include "CPGPToolsWipeTask.h"
159dc2 #include "CWarningAlert.h"
8baf5a
9fa2f7 CPGPtoolsFileTask::CPGPtoolsFileTask(
ae596a ¤   PGPtoolsOperation operation,
178b2e ¤   const FSSpec *fileSpec) : CPGPtoolsCryptoTask( operation )
a8bb36 {
b2dc42 ¤   OSStatus¤   err;
ad4f27 ¤   CInfoPBRec¤ cpb;
6a67c5 ¤
790687 ¤   mWorkingFileSpec¤   = *fileSpec;
e9c8c9 ¤   mSourceSpec ¤   ¤   = *fileSpec;
8867c5 ¤
8cb2f8 ¤   err¤= FSpGetCatInfo( fileSpec, &cpb );
2d8c1a ¤   pgpAssertNoErr( err );
790b1a ¤   mSourceIsFolder¤= cpbIsFolder( &cpb );
8267c5 ¤
7387b4 ¤   mProcessingList¤= new CPGPtoolsProcessingList();
b3b10c ¤   if ( IsntNull( mProcessingList ) )
f4c7a1 ¤   {
cf5af1 ¤   ¤   err¤= mProcessingList->BuildSourceTree( &mSourceSpec );
3ec816 ¤   ¤   pgpAssertMsg( IsntErr( err ), "error building source tree" );
308cf4 ¤   ¤   if ( IsErr( err ) )
325b34 ¤   ¤   {
fb4f76 ¤   ¤   ¤   delete mProcessingList;
00106f ¤   ¤   ¤   mProcessingList¤= NULL;
db0fe4 ¤   ¤   }
0e9371 ¤   }
f367c5 ¤
9a49cf ¤   pgpClearMemory( &mDetachedSigInputSpec, sizeof( mDetachedSigInputSpec ) );
9cefe6 }
40af5a
0c4eae CPGPtoolsFileTask::~CPGPtoolsFileTask(void)
10bb36 {
6a69d4 ¤   delete mProcessingList;
fe36cd ¤   mProcessingList¤= NULL;
bdefe6 }
02af5a
05fe82 // MW cannot seem to compile this function without this option
7a9221 #pragma global_optimizer on
cfaf5a
--3af8 000f954b680401200f6 Page 2 of CPGPtoolsFileTask.cp
bcfbb0 ¤   CToolsError
f7282b CPGPtoolsFileTask::EncryptSignFileInternal(
c3460d ¤   CEncodeParams ¤ ¤   ¤   *params,
461700 ¤   const ProcessingInfo¤   *srcInfo,
aac392 ¤   const FSSpec ¤  ¤   ¤   *destSpec )
31bb36 {
c59d3b ¤   CToolsError¤¤   ¤   ¤   err;
c17f61 ¤   PGPOptionListRef¤   ¤   signingOptions¤ = kInvalidPGPOptionListRef;
975b24 ¤   PGPContextRef¤  ¤   ¤   c¤  = mContext;
1e490d ¤   PGPBoolean¤ ¤   ¤   ¤   clearSign ¤ = FALSE;
513525 ¤   PGPBoolean¤ ¤   ¤   ¤   armorOutput = FALSE;
d9f958 ¤   PGPLocalEncodingFlags¤  encodingFlags;
9e1b52 ¤   ¤
46a33f ¤   pgpAssert( PGPContextRefIsValid( mContext ) );
75045b ¤   pgpAssertAddrValid( params, CEncodeParams );
e1af5a
d96007 ¤   params->progressDialog->SetNewProgressItem( srcInfo->srcSpec.name );
81af5a
f24b81 ¤   encodingFlags = params->encodingFlags;
0b6e2b ¤   if( encodingFlags == kPGPLocalEncoding_None &&
c6b8bf ¤   ¤   srcInfo->dataSize == 0 &&
8fcb4b ¤   ¤   srcInfo->resSize != 0 )
dac7a1 ¤   {
54fa3c ¤   ¤   // MacBinary is off, but the file is a resource fork-only
99675a ¤   ¤   // file. This case is illogical. Turn on MacBinary for this file.
2067c5 ¤
29e194 ¤   ¤   encodingFlags = kPGPLocalEncoding_Force;
989371 ¤   }
2167c5 ¤
6b34f9 ¤   if( params->textOutput )
e6c7a1 ¤   {
7d12ab ¤   ¤   armorOutput = TRUE;
eb1b52 ¤   ¤
63b68c ¤   ¤   if( srcInfo->fInfo.fdType == 'TEXT' &&
4280ad ¤   ¤   ¤   params->signing &&
054eec ¤   ¤   ¤   ! params->encrypting &&
6513a0 ¤   ¤   ¤   encodingFlags != kPGPLocalEncoding_Force &&
ed9d69 ¤   ¤   ¤   ! params->detachedSignature )
bf5b34 ¤   ¤   {
1eda9b ¤   ¤   ¤   // Clear sign TEXT files in the non-MacBinary,
e7d237 ¤   ¤   ¤   // non-detached sig case
9c87c7 ¤   ¤   ¤
68687a ¤   ¤   ¤   clearSign ¤ = TRUE;
3991de ¤   ¤   ¤   armorOutput = FALSE;
640fe4 ¤   ¤   }
969371 ¤   }
ff67c5 ¤
b4c684 ¤   if( params->signing )
75c7a1 ¤   {
b279fb ¤   ¤   err.pgpErr = PGPBuildOptionList( c, &signingOptions,·
e34282 ¤   ¤   ¤   ¤   PGPOSignWithKey( c, params->signingKey,
28a89d ¤   ¤   ¤   ¤   ¤   params->signingWithSplitKey ?
2a46ca ¤   ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( c, params->signingPasskey,
540e2a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·params->signingPasskeySize ) :
c6c905 ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( c, params->signingPassphrase ),
47b6d8 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ) ),
814529 ¤   ¤   ¤   ¤   PGPOClearSign( c, clearSign ),
2d600d ¤   ¤   ¤   ¤   PGPOLastOption( c ) );
d51b52 ¤   ¤
88448d ¤   ¤   if( err.IsntError() && params->detachedSignature )
1f5b34 ¤   ¤   {
822810 ¤   ¤   ¤   err.pgpErr = PGPAppendOptionList( signingOptions,
4e6cef ¤   ¤   ¤   ¤   ¤   ¤   PGPODetachedSig( c,
d5fff2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ) ),
fcffd9 ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ) );
391b52 ¤   ¤
90f03f ¤   ¤   ¤   /* text output should have alreday been set up */
340fe4 ¤   ¤   }
419371 ¤   }
8d0e24 ¤   else
aac7a1 ¤   {
f95ba2 ¤   ¤   /* no signing options; create dummy list */
--f222 000d73658ea401200f6 Page 3 of CPGPtoolsFileTask.cp
10e104 ¤   ¤   err.pgpErr¤ = PGPBuildOptionList( c,
13eeae ¤   ¤   ¤   ¤   ¤   ¤   &signingOptions, PGPOLastOption( c ) );
449371 ¤   }
5b67c5 ¤
c7d3cb ¤   if( err.IsntError() )
75c7a1 ¤   {
f04483 ¤   ¤   err.pgpErr = PGPGuaranteeMinimumEntropy( c );
2f9371 ¤   }
8567c5 ¤
9cd3cb ¤   if( err.IsntError() )
a3c7a1 ¤   {
c719f0 ¤   ¤   CEncodeEventHandlerData¤data( this, params );
621b52 ¤   ¤
1167b0 ¤   ¤   err.pgpErr = PGPEncode( c,
d54577 ¤   ¤   ¤   ¤   ¤   PGPOInputFileFSSpec( c, &srcInfo->srcSpec ),
dfaacb ¤   ¤   ¤   ¤   ¤   PGPOOutputFileFSSpec( c, destSpec ),
2a8c07 ¤   ¤   ¤   ¤   ¤   PGPODataIsASCII( c, srcInfo->fInfo.fdType == 'TEXT' ),
898323 ¤   ¤   ¤   ¤   ¤   PGPOArmorOutput( c, armorOutput ),
d75aaf ¤   ¤   ¤   ¤   ¤   signingOptions,
99d25f ¤   ¤   ¤   ¤   ¤   PGPOptionListRefIsValid( params->encodeOptions ) ?
e65aab ¤   ¤   ¤   ¤   ¤   ¤   params->encodeOptions : PGPONullOption( c ),
679418 ¤   ¤   ¤   ¤   ¤   PGPOEventHandler( c,
7d6364 ¤   ¤   ¤   ¤   ¤   ¤   sEncodeEventHandlerProc, &data ),
f8d470 ¤   ¤   ¤   ¤   ¤   PGPOSendNullEvents( c, TRUE ),
cbedcf ¤   ¤   ¤   ¤   ¤   PGPOLocalEncoding( c, encodingFlags ),
35fc1b ¤   ¤   ¤   ¤   ¤   PGPOForYourEyesOnly( c, params->fyeo ),
b8b559 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ·) );
5a9371 ¤   }
5baf5a
075fc6 ¤   if ( PGPOptionListRefIsValid( signingOptions ) )
fabae7 ¤   ¤   PGPFreeOptionList( signingOptions );
4667c5 ¤
94ab20 ¤   if( ShouldReportError( err ) )
b9c7a1 ¤   {
e9afaa ¤   ¤   err = ReportError( err,
46a445 ¤   ¤   ¤   params->encrypting ? kFileCannotBeEncryptedStrIndex :
0c00da ¤   ¤   ¤   kFileCannotBeSignedStrIndex );
8d9371 ¤   }
96af5a
c7deb7 ¤   return( err );
44efe6 }
fcaf5a
81e4a1 #pragma global_optimizer reset
cbaf5a
bc85ea ¤   OSStatus
e66aff CPGPtoolsFileTask::GetOutputFolderSpec(
b6a1f3 ¤   Boolean¤¤   ¤   encryptSign,
14b6e6 ¤   const FSSpec *¤ srcSpec,
55bf39 ¤   FSSpec *¤   ¤   destSpec )
31bb36 {
f575f8 ¤   OSStatus¤   err¤= noErr;
95fa88 ¤   const uchar¤kPGPSuffix[]¤   = "\p PGP";
7d67c5 ¤
107048 ¤   *destSpec¤  = *srcSpec;
3e67c5 ¤
4f6f1c ¤   if ( encryptSign )
aec7a1 ¤   {
5e3383 ¤   ¤   if ( StrLength( destSpec->name ) +
517e3a ¤   ¤   ¤   ¤   StrLength( kPGPSuffix ) > kMaxHFSFileNameLength )
3b5b34 ¤   ¤   {
e283de ¤   ¤   ¤   destSpec->name[ 0 ]¤=
26245c ¤   ¤   ¤   ¤   kMaxHFSFileNameLength - StrLength( kPGPSuffix );
360fe4 ¤   ¤   }
6b869c ¤   ¤   AppendPString( kPGPSuffix, destSpec->name );
e19371 ¤   }
bb0e24 ¤   else
ef9e9c ¤   {¤  /* decrypting/verifying */
6fee1e ¤   ¤   if ( PStringHasSuffix( srcSpec->name, kPGPSuffix, FALSE) )
ae5b34 ¤   ¤   {
21218f ¤   ¤   ¤   /* strip the ".pgp" off */
6724e1 ¤   ¤   ¤   destSpec->name[ 0 ]¤-= StrLength( kPGPSuffix );
d70fe4 ¤   ¤   }
--d124 000735cb880401200f6 Page 4 of CPGPtoolsFileTask.cp
a19371 ¤   }
9967c5 ¤
5a2597 ¤   err¤= FSpGetUniqueSpec( destSpec, destSpec );
6f67c5 ¤
9bdeb7 ¤   return( err );
73efe6 }
c0af5a
d5af5a
c40335 /*____________________________________________________________________________
ce48e7 ¤   Determine if the file should be processed.
b267c5 ¤
67acc3 ¤   While it might make sense to not encrypt already encrypted items or
481a92 ¤   encrypt detached sigs, there are also cases where you might want
009e47 ¤   to do this. so don't prevent it.
1467c5 ¤
ffccfc ¤   The same idea applies when signing already signed or encrypted items.
c5f7f7 ____________________________________________________________________________*/
577e69 ¤   Boolean
112bd5 CPGPtoolsFileTask::ShouldEncryptSignFile(
082754 ¤   Boolean¤¤   ¤   encrypting,
b4d3e4 ¤   const FSSpec *¤ spec )
0fbb36 {
8d156f ¤   OSStatus¤   ¤   err;
8ba0dd ¤   Boolean¤¤   ¤   shouldProcess¤  = TRUE;
2467c5 ¤
a36790 ¤   // FileKindInfo¤info;
0bce7c ¤   // err¤ = GetPGPFileKindInfo( spec, &info );
7d7648 ¤   if ( encrypting )
8cc7a1 ¤   {
3b68e1 ¤   ¤   /* without UI to ask the user, we can't reasonably forbid signing */
ff9371 ¤   }
250e24 ¤   else
25c7a1 ¤   {
8268e1 ¤   ¤   /* without UI to ask the user, we can't reasonably forbid signing */
389371 ¤   }
7267c5 ¤
538fad ¤   if ( shouldProcess )
35c7a1 ¤   {
d7fef6 ¤   ¤   CInfoPBRec¤ cpb;
301b52 ¤   ¤
272c08 ¤   ¤   err¤= FSpGetCatInfo( spec, &cpb );
8dd798 ¤   ¤   if ( IsntErr( err ) )
f25b34 ¤   ¤   {
8105ab ¤   ¤   ¤   /* don't do aliases or invisible files */
7847d7 ¤   ¤   ¤   if ( cpbFInfo( &cpb ).fdFlags & ( kIsInvisible | kIsAlias ) )
bc4483 ¤   ¤   ¤   ¤   shouldProcess¤  = FALSE;
0e0fe4 ¤   ¤   }
c69371 ¤   }
8d67c5 ¤
2fd83f ¤   return( shouldProcess );
39efe6 }
2767c5 ¤
cfaf5a
ddfbb0 ¤   CToolsError
58a127 CPGPtoolsFileTask::EncryptSignFolder(
525480 ¤   CEncodeParams *¤params )
4bbb36 {
d67c3e ¤   CToolsError¤err;
3a2a06 ¤   FSSpec¤ ¤   destTreeSpec;
0767c5 ¤
23b0e4 ¤   (void)params;
2e100a ¤   pgpAssert( IsntNull( mProcessingList ) );
eb67c5 ¤
94a91f ¤   err.err¤= mProcessingList->PrepareForIteration();
427e2a ¤   if ( err.IsntError() && ! mProcessInPlace)
06c7a1 ¤   {
590ccd ¤   ¤   err.err¤= GetOutputFolderSpec( TRUE,
1f5978 ¤   ¤   ¤   ¤   ¤   &mSourceSpec, &destTreeSpec );
8af9a8 ¤   ¤   if ( err.IsntError() )
b75b34 ¤   ¤   {
9c6164 ¤   ¤   ¤   err.err¤= mProcessingList->CreateDestTree( &destTreeSpec );
730fe4 ¤   ¤   }
--f772 000946b655f401200f6 Page 5 of CPGPtoolsFileTask.cp
a19371 ¤   }
9967c5 ¤
a8ed80 ¤   if ( err.IsntError() )
f6c7a1 ¤   {
341496 ¤   ¤   UInt32¤ numFiles¤   = mProcessingList->GetNumFiles();
1f1b52 ¤   ¤
f8cada ¤   ¤   for( UInt32 index = 0; index < numFiles; ++index )
235b34 ¤   ¤   {
e71992 ¤   ¤   ¤   ProcessingInfo¤ info;
076483 ¤   ¤   ¤   FSSpec¤ ¤   ¤   destSpec;
a287c7 ¤   ¤   ¤
13c0c6 ¤   ¤   ¤   mProcessingList->GetIndFile( index, &info );
ad87c7 ¤   ¤   ¤
254a2b ¤   ¤   ¤   mWorkingFileSpec¤   = info.srcSpec;
4487c7 ¤   ¤   ¤
389d64 ¤   ¤   ¤   if ( mProcessInPlace )
fcf776 ¤   ¤   ¤   {
62f400 ¤   ¤   ¤   ¤   destSpec.vRefNum¤   = info.srcSpec.vRefNum;
05786e ¤   ¤   ¤   ¤   destSpec.parID¤ ¤   = info.srcSpec.parID;
20a3a6 ¤   ¤   ¤   }
d6bb8c ¤   ¤   ¤   else
b1f776 ¤   ¤   ¤   {
758916 ¤   ¤   ¤   ¤   destSpec.vRefNum¤   = info.destVRefNum;
94b99b ¤   ¤   ¤   ¤   destSpec.parID¤ ¤   = info.destParID;
d7a3a6 ¤   ¤   ¤   }
072b2f ¤   ¤   ¤   if ( ShouldEncryptSignFile( params->encrypting,
5f8e6f ¤   ¤   ¤   ¤   ¤   &info.srcSpec ) )
93f776 ¤   ¤   ¤   {
5031ea ¤   ¤   ¤   ¤   GetDefaultEncryptSignName( info.srcSpec.name,
ee7917 ¤   ¤   ¤   ¤   ¤   params->textOutput,
ba39b5 ¤   ¤   ¤   ¤   ¤   params->detachedSignature, destSpec.name );
c6503c ¤   ¤   ¤   ¤   pgpAssert( ! FSpEqual( &info.srcSpec, &destSpec ) );
6f2b85 ¤   ¤   ¤   ¤
394d4f ¤   ¤   ¤   ¤   err¤= EncryptSignFileInternal( params, &info,
17d2c7 ¤   ¤   ¤   ¤   ¤   &destSpec );
c6a3a6 ¤   ¤   ¤   }
7f3fcd ¤   ¤   ¤   else if ( ! mProcessInPlace )
fcf776 ¤   ¤   ¤   {
bc3778 ¤   ¤   ¤   ¤   CopyPString( info.srcSpec.name, destSpec.name );
609439 ¤   ¤   ¤   ¤   err.err¤= FSpCopyFiles( PGPGetContextMemoryMgr( mContext ),
dbf5ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &info.srcSpec, &destSpec );
4fb646 ¤   ¤   ¤   ¤   pgpAssertNoErr( err.err );
2da3a6 ¤   ¤   ¤   }
9487c7 ¤   ¤   ¤
3551f7 ¤   ¤   ¤   if ( err.IsError() )
18f622 ¤   ¤   ¤   ¤   break;
be0fe4 ¤   ¤   }
329371 ¤   }
e267c5 ¤
e2deb7 ¤   return( err );
d3efe6 }
4aaf5a
04d83c ·
e0fbb0 ¤   CToolsError
2d22b6 CPGPtoolsFileTask::EncryptSign(
16a1bc ¤   PGPContextRef¤  ¤   context,
2c6c35 ¤   PGPtlsContextRef¤   tlsContext,
a2f3f2 ¤   CEncodeParams *¤¤   params)
d0bb36 {
777c3e ¤   CToolsError¤err;
c3af5a
f47702 ¤   mContext¤   = context;
15b920 ¤   mTLSContext¤= tlsContext;
4167c5 ¤
e770d4 ¤   pgpAssert( (! params->wipeOriginal) || params->encrypting );
4267c5 ¤
723fb9 ¤   /* send output to a duplicate folder hierarchy·
505016 ¤   ¤   unless we are doing detached sigs */
0675d9 ¤   mProcessInPlace¤= params->detachedSignature;
96af5a
a50289 ¤   if ( mSourceIsFolder )
94c7a1 ¤   {
--fbb8 000bd371d34401200f6 Page 6 of CPGPtoolsFileTask.cp
dcec6e ¤   ¤   err¤= EncryptSignFolder( params );
dc9371 ¤   }
0f0e24 ¤   else
45c7a1 ¤   {
b88bf0 ¤   ¤   FSSpec¤ ¤   ¤   destSpec;
e92e9a ¤   ¤   ProcessingInfo¤ info;
401b52 ¤   ¤
4b8ed2 ¤   ¤   mProcessingList->GetIndFile( 0, &info );
fd87c7 ¤   ¤   ¤
7a1032 ¤   ¤   GetDefaultEncryptSignFSSpec( &info.srcSpec,
5cbc42 ¤   ¤   ¤   ¤   params->textOutput,
2f6ab6 ¤   ¤   ¤   ¤   params->detachedSignature,
f86991 ¤   ¤   ¤   ¤   &destSpec );
bfaf5a
e47391 ¤   ¤   if( ( GetTaskModifiers() & optionKey ) != 0 )
0c5b34 ¤   ¤   {
2c80c0 ¤   ¤   ¤   Str255¤ ¤   ¤   ¤   prompt;
f30a0c ¤   ¤   ¤   short¤  ¤   ¤   ¤   strIndex;
1b31a0 ¤   ¤   ¤   StandardFileReply¤  sfReply;
b087c7 ¤   ¤   ¤
dca187 ¤   ¤   ¤   if( ( params->encrypting && params->signing ) ||
c3d375 ¤   ¤   ¤   ¤   params->detachedSignature )
74f776 ¤   ¤   ¤   {
8f0dc6 ¤   ¤   ¤   ¤   strIndex = kSaveAsPromptStrIndex;
94a3a6 ¤   ¤   ¤   }
dbbfc1 ¤   ¤   ¤   else if( params->encrypting )
31f776 ¤   ¤   ¤   {
74f4e4 ¤   ¤   ¤   ¤   strIndex = kSaveEncryptedFileAsPromptStrIndex;
d7a3a6 ¤   ¤   ¤   }
7cbb8c ¤   ¤   ¤   else
99f776 ¤   ¤   ¤   {
3a87a1 ¤   ¤   ¤   ¤   strIndex = kSaveSignedFileAsPromptStrIndex;
3fa3a6 ¤   ¤   ¤   }
5587c7 ¤   ¤   ¤
6a75aa ¤   ¤   ¤   GetIndString( prompt, kPGPtoolsMiscStringsResID, strIndex );
3487c7 ¤   ¤   ¤
4a9c4f ¤   ¤   ¤   LMSetSFSaveDisk( -destSpec.vRefNum );
bc511b ¤   ¤   ¤   LMSetCurDirStore( destSpec.parID );
9f87c7 ¤   ¤   ¤
7137b7 ¤   ¤   ¤   StandardPutFile( prompt, destSpec.name, &sfReply );
a78d67 ¤   ¤   ¤   if( sfReply.sfGood )
5ef776 ¤   ¤   ¤   {
544d2a ¤   ¤   ¤   ¤   destSpec = sfReply.sfFile;
a3a3a6 ¤   ¤   ¤   }
6abb8c ¤   ¤   ¤   else
b9f776 ¤   ¤   ¤   {
325327 ¤   ¤   ¤   ¤   err.pgpErr = kPGPError_UserAbort;
1ba3a6 ¤   ¤   ¤   }
e40fe4 ¤   ¤   }
db0e1d ¤   ¤   else
075b34 ¤   ¤   {
0e6ac3 ¤   ¤   ¤   (void)FSpGetUniqueSpec( &destSpec, &destSpec );
ab0fe4 ¤   ¤   }
781b52 ¤   ¤
225a9f ¤   ¤   if( err.IsntError() )
415b34 ¤   ¤   {
76af4f ¤   ¤   ¤   err¤= EncryptSignFileInternal( params, &info,
fc6991 ¤   ¤   ¤   ¤   &destSpec );
bc0fe4 ¤   ¤   }
ee9371 ¤   }
0a67c5 ¤
27ebeb ¤   if ( err.IsntError() &&
953d87 ¤   ¤   params->wipeOriginal )
a5c7a1 ¤   {
abd6fd ¤   ¤   CPGPtoolsWipeTask¤  task( &mSourceSpec );
8d471b ¤   ¤   CPGPtoolsTaskProgressDialog * progress =
2fd2f1 ¤   ¤   ¤   ¤   ¤   params->progressDialog;
6be323 ¤   ¤   ByteCount¤  ¤   progressBytes;
fa1b52 ¤   ¤
7edfe6 ¤   ¤   progress->SetProgressOperation( kPGPtoolsWipeOperation );
4295e7 ¤   ¤   err.err¤= task.CalcProgressBytes( context, &progressBytes);
bdf9a8 ¤   ¤   if ( err.IsntError() )
--424d 0002b3ef7eb401200f6 Page 7 of CPGPtoolsFileTask.cp
e35b34 ¤   ¤   {
be14eb ¤   ¤   ¤   progress->SetTotalOperations( progressBytes );
a41ec7 ¤   ¤   ¤   err¤= task.Wipe( context, progress );
290fe4 ¤   ¤   }
529371 ¤   }
4aaf5a
d2d924 ¤   mContext¤   = kInvalidPGPContextRef;
99deb7 ¤   return( err );
8eefe6 }
c8af5a
baaf5a
a6fbb0 ¤   CToolsError
d7b144 CPGPtoolsFileTask::DecryptVerifyEncryptedFile(
ca3714 ¤   CDecodeParams *¤¤   ¤   params,
fe0140 ¤   const ProcessingInfo *¤ srcSpecInfo,
497dfe ¤   const FSSpec *¤ ¤   ¤   destSpec)
74bb36 {
34558c ¤   CDecodeEventHandlerData¤data( mContext, mTLSContext, this, params );
905b24 ¤   PGPContextRef¤  ¤   ¤   c¤  = mContext;
329d3b ¤   CToolsError¤¤   ¤   ¤   err;
d150a9 ¤   PGPKeySetRef¤   ¤   ¤   newKeysSet;
d967c5 ¤
ccf0c9 ¤   mWorkingFileSpec = srcSpecInfo->srcSpec;
0267c5 ¤
8a7be1 ¤   // Assume both forks are verified
56c9dd ¤   mSignatureData.didNotVerifyResourceFork = FALSE;
4f67c5 ¤
f68309 ¤   err.pgpErr = PGPNewKeySet( mContext, &newKeysSet );
1bd3cb ¤   if( err.IsntError() )
b0c7a1 ¤   {
50a912 ¤   ¤   PGPOptionListRef¤   ¤   decodeOptions = kInvalidPGPOptionListRef;
5caf5a
71486e ¤   ¤   err.pgpErr = PGPBuildOptionList( c, &decodeOptions,
334f51 ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeySetRef( c, params->allKeys ),
eb621c ¤   ¤   ¤   ¤   ¤   ¤   PGPOImportKeysTo( c, newKeysSet ),
849d53 ¤   ¤   ¤   ¤   ¤   ¤   PGPOEventHandler( c, sDecodeEventHandlerProc,
ae10dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   &data ),
bfc557 ¤   ¤   ¤   ¤   ¤   ¤   PGPOSendNullEvents( c, TRUE ),
e6ffd9 ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ) );
665a9f ¤   ¤   if( err.IsntError() )
1f5b34 ¤   ¤   {
2d6e92 ¤   ¤   ¤   err.pgpErr = PGPDecode( c,
ad114b ¤   ¤   ¤   ¤   ¤   PGPOInputFileFSSpec( c, &srcSpecInfo->srcSpec ),
77d9aa ¤   ¤   ¤   ¤   ¤   IsntNull( destSpec ) ?
c1262e ¤   ¤   ¤   ¤   ¤   ¤   PGPOOutputFileFSSpec( c, destSpec ) :
74ea65 ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( c ),
9d98f6 ¤   ¤   ¤   ¤   ¤   decodeOptions,
716e41 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ) );
d387c7 ¤   ¤   ¤
76cd49 ¤   ¤   ¤   if ( err.IsntError() &&
a287b1 ¤   ¤   ¤   ¤   ¤   mSignatureDataValid &&
1cf71c ¤   ¤   ¤   ¤   ¤   ¤   mSignatureData.data.checked &&
f6a5f3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ( ! mSignatureData.data.verified ) )
aff776 ¤   ¤   ¤   {
8f980e ¤   ¤   ¤   ¤   /*
ba88e2 ¤   ¤   ¤   ¤   sig checked, but didn't verify. ·Output should have been
0d17e3 ¤   ¤   ¤   ¤   created. Try again with no output, existing passphrase,
41eb6b ¤   ¤   ¤   ¤   and local encoding off (controlled by·
9122ae ¤   ¤   ¤   ¤   data.retryingSigVerification ).
31df0b ¤   ¤   ¤   ¤   */
ab4e8c ¤   ¤   ¤   ¤   data.retryingSigVerification¤   ¤   ¤   = TRUE;
6c77e8 ¤   ¤   ¤   ¤   mSignatureData.didNotVerifyResourceFork = TRUE;
9cc22f ¤   ¤   ¤   ¤   mSignatureDataValid¤¤   ¤   ¤   ¤   ¤   = FALSE;
4e2b85 ¤   ¤   ¤   ¤
9060de ¤   ¤   ¤   ¤   err.pgpErr = PGPDecode( c,
62163d ¤   ¤   ¤   ¤   ¤   ¤   PGPOInputFileFSSpec( c, &srcSpecInfo->srcSpec ),
f469e5 ¤   ¤   ¤   ¤   ¤   ¤   PGPODiscardOutput( c, TRUE ),
1dd905 ¤   ¤   ¤   ¤   ¤   ¤   decodeOptions,
adffd9 ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( c ) );
6094aa ¤   ¤   ¤   ¤   ¤   ¤
b46acf ¤   ¤   ¤   ¤   pgpAssert( mSignatureDataValid );
2ba3a6 ¤   ¤   ¤   }
--08da 000db0b11d5401200f6 Page 8 of CPGPtoolsFileTask.cp
e587c7 ¤   ¤   ¤
d34523 ¤   ¤   ¤   if( err.IsntError() && ( data.outputData != NULL ) )
47f776 ¤   ¤   ¤   {
290ba5 ¤   ¤   ¤   ¤   err.pgpErr = PGPForYourEyesOnlyDialog( c, (char *) data.outputD¶
4ea92c ata );
e113ea ¤   ¤   ¤   ¤   pgpClearMemory( data.outputData, data.outputDataSize );
d3a7d7 ¤   ¤   ¤   ¤   PGPFreeData( data.outputData );
b88d63 ¤   ¤   ¤   ¤   data.outputData = NULL;
8aa3a6 ¤   ¤   ¤   }
4e87c7 ¤   ¤   ¤
c18f55 ¤   ¤   ¤   if( err.IsntError() &&
897ffb ¤   ¤   ¤   ¤   PGPKeySetRefIsValid( data.clientHandlerData.newKeySet ) )
94f776 ¤   ¤   ¤   {
c9edbb ¤   ¤   ¤   ¤   err.pgpErr = PGPAddKeys( data.clientHandlerData.newKeySet,
3ce66d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeysSet );
9b82e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
8e72c3 ¤   ¤   ¤   ¤   {
bc699e ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPCommitKeyRingChanges( newKeysSet );
092613 ¤   ¤   ¤   ¤   }
9da3a6 ¤   ¤   ¤   }
c487c7 ¤   ¤   ¤
ec6d97 ¤   ¤   ¤   if( err.IsntError() )
2bf776 ¤   ¤   ¤   {
5fcc1d ¤   ¤   ¤   ¤   PGPUInt32¤  numNewKeys;
ab87c7 ¤   ¤   ¤
edc2e1 ¤   ¤   ¤   ¤   err.pgpErr = PGPCountKeys( newKeysSet, &numNewKeys );
c9b160 ¤   ¤   ¤   ¤   if( err.IsntError() && numNewKeys > 0 )
e872c3 ¤   ¤   ¤   ¤   {
52f9fc ¤   ¤   ¤   ¤   ¤   // Offer to import the keys
4c6878 ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   importSet;
ca4fac ¤   ¤   ¤   ¤   ¤   char¤   ¤   ¤   prompt[256];
f7ae30 ¤   ¤   ¤   ¤   ¤
f12aa7 ¤   ¤   ¤   ¤   ¤   GetIndCString( prompt, kDialogStringsListResID,
2efd65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSelectiveImportFoundKeysPromptStrIndex );
0eae30 ¤   ¤   ¤   ¤   ¤
7c90b8 ¤   ¤   ¤   ¤   ¤   UDesktop::Deactivate();
5027ef ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPSelectKeysDialog( c,·
38bc08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation,
4e748f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   prompt, newKeysSet,
39002c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   params->allKeys, &importSet );
0f35e5 ¤   ¤   ¤   ¤   ¤   UDesktop::Activate();
87ae30 ¤   ¤   ¤   ¤   ¤
35be0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
464859 ¤   ¤   ¤   ¤   ¤   {
7ea27f ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPSharedAddKeysToDefaultKeyring(
7ccdcf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   importSet );
a694aa ¤   ¤   ¤   ¤   ¤   ¤
026449 ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( importSet );
141c89 ¤   ¤   ¤   ¤   ¤   }
752613 ¤   ¤   ¤   ¤   }
f3a3a6 ¤   ¤   ¤   }
ae1b52 ¤   ¤
c1c438 ¤   ¤   ¤   PGPFreeOptionList( decodeOptions );
ca0fe4 ¤   ¤   }
d81b52 ¤   ¤
b55ca4 ¤   ¤   PGPFreeKeySet( newKeysSet );
5d9371 ¤   }
7167c5 ¤
e3deb7 ¤   return( err );
95efe6 }
60af5a
18fbb0 ¤   CToolsError
14612b CPGPtoolsFileTask::DecryptKeyShareFile(
4f3714 ¤   CDecodeParams *¤¤   ¤   params,
180140 ¤   const ProcessingInfo *¤ srcSpecInfo,
4c7dfe ¤   const FSSpec *¤ ¤   ¤   destSpec)
e1bb36 {
96d7c9 ¤   CToolsError¤¤   err;
d467c5 ¤
07578e ¤   Str255¤ ¤   message;
b04c62 ¤   MessageT¤   dialogResult;
dbaf5a
--4df3 0002e6b55a6401200f6 Page 9 of CPGPtoolsFileTask.cp
934e0b ¤   GetIndString( message, kDialogStringsListResID,
8d967a ¤   ¤   ¤   ¤   kDecryptKeyShareFileMsgStrIndex );
a567c5 ¤
103cc2 ¤   if( mSourceIsFolder )
b4c7a1 ¤   {
e8c3d0 ¤   ¤   dialogResult = CWarningAlert::DisplayCustom(
ceae52 ¤   ¤   ¤   ¤   ¤   ¤   ¤   dialog_DecryptKeyShare, kWACustomAlertType,
2b9d84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWACustomAlertStyle, message,
af4737 ¤   ¤   ¤   ¤   ¤   ¤   ¤   srcSpecInfo->srcSpec.name );
ac9371 ¤   }
3e0e24 ¤   else
ecc7a1 ¤   {
8b6d1f ¤   ¤   dialogResult = CWarningAlert::Display( kWANoteAlertType,
9b4d3b ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKCancelStyle, message,
954737 ¤   ¤   ¤   ¤   ¤   ¤   ¤   srcSpecInfo->srcSpec.name );
799371 ¤   }
6967c5 ¤
bb57b8 ¤   if( dialogResult == msg_OK )
76c7a1 ¤   {
b6821e ¤   ¤   const FSSpec¤   *shareFileSpec;
0a87c7 ¤   ¤   ¤
0db596 ¤   ¤   if( mSourceIsFolder )
cf5b34 ¤   ¤   {
7d610f ¤   ¤   ¤   // Must copy the file first as the conversion is done in place.
a587c7 ¤   ¤   ¤
88d350 ¤   ¤   ¤   pgpAssert( IsntNull( destSpec ) );
338f30 ¤   ¤   ¤   err.err¤= FSpCopyFiles( PGPGetContextMemoryMgr( mContext ),
50a410 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &srcSpecInfo->srcSpec, destSpec );
90531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
321d0a ¤   ¤   ¤   shareFileSpec = destSpec;
720fe4 ¤   ¤   }
bb0e1d ¤   ¤   else
ae5b34 ¤   ¤   {
792cc3 ¤   ¤   ¤   shareFileSpec = &srcSpecInfo->srcSpec;
fc0fe4 ¤   ¤   }
b81b52 ¤   ¤
2b5a9f ¤   ¤   if( err.IsntError() )
7e5b34 ¤   ¤   {
933099 ¤   ¤   ¤   PFLFileSpecRef¤ shareFileSpecRef;
80af5a
be759f ¤   ¤   ¤   err.pgpErr = PFLNewFileSpecFromFSSpec(
537cd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( mContext ),
d0ab12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   shareFileSpec, &shareFileSpecRef );
32af5a
456d97 ¤   ¤   ¤   if( err.IsntError() )
01f776 ¤   ¤   ¤   {
f2d978 ¤   ¤   ¤   ¤   PGPShareFileRef¤shareFileRef;
562b85 ¤   ¤   ¤   ¤
18007f ¤   ¤   ¤   ¤   err.pgpErr = PGPOpenShareFile( shareFileSpecRef,
e287e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &shareFileRef );
8382e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
9272c3 ¤   ¤   ¤   ¤   {
b71035 ¤   ¤   ¤   ¤   ¤   PGPOptionListRef¤   ¤   optionsDecode;
aa4d87 ¤   ¤   ¤   ¤   ¤   CDecodeEventHandlerData¤data( mContext, mTLSContext, this,
cc1c9e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   params );
0dadcc ¤   ¤   ¤   ¤   ¤   PGPShareRef¤¤   ¤   ¤   shares;
92ae30 ¤   ¤   ¤   ¤   ¤
877e7d ¤   ¤   ¤   ¤   ¤   optionsDecode = kInvalidPGPOptionListRef;
25d990 ¤   ¤   ¤   ¤   ¤   shares = kInvalidPGPShareRef;
97ae30 ¤   ¤   ¤   ¤   ¤
892e26 ¤   ¤   ¤   ¤   ¤   // decrypt specified share file
c45990 ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPBuildOptionList( mContext, &optionsDecode,
a57e5f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeySetRef( mContext,
751325 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   params->allKeys ),
97c2b9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEventHandler( mContext,
b43d44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sDecodeEventHandlerProc, &data ),
1cfdf7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) );
3fbe0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
9d4859 ¤   ¤   ¤   ¤   ¤   {
b6b8c1 ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPCopySharesFromFile( mContext,
079335 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   shareFileRef, optionsDecode,
2ef50a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &shares );
--dd86 000947d88ee401200f6 Page 10 of CPGPtoolsFileTask.cp
b61c89 ¤   ¤   ¤   ¤   ¤   }
2cae30 ¤   ¤   ¤   ¤   ¤
02be0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
094859 ¤   ¤   ¤   ¤   ¤   {
6f892c ¤   ¤   ¤   ¤   ¤   ¤   PGPRecipientSettings¤   recipientSettings;
00404a ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   ¤   recipients;
613a17 ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   ¤   newKeys;
c2e7ea ¤   ¤   ¤   ¤   ¤   ¤   PGPOptionListRef¤   ¤   optionsEncode;
b1531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
06f87a ¤   ¤   ¤   ¤   ¤   ¤   recipients ¤¤   = kInvalidPGPKeySetRef;
07371b ¤   ¤   ¤   ¤   ¤   ¤   newKeys ¤   ¤   = kInvalidPGPKeySetRef;
9cf9f6 ¤   ¤   ¤   ¤   ¤   ¤   optionsEncode ¤ = kInvalidPGPOptionListRef;
ac94aa ¤   ¤   ¤   ¤   ¤   ¤
0688e8 ¤   ¤   ¤   ¤   ¤   ¤   UDesktop::Deactivate();
57d420 ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPClientRecipientDialog( mContext,
19f90f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTLSContext, params->allKeys, 0, nil,
4bc9c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPRecipientOptionsHideFileOptions,
b5aa2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPRecipientSettingsDefault,
89f313 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &recipientSettings, &recipients,
d75b74 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &newKeys );
680c20 ¤   ¤   ¤   ¤   ¤   ¤   UDesktop::Activate();
5baf5a
035ea7 ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() && PGPKeySetRefIsValid( newKeys ) )
ac8fec ¤   ¤   ¤   ¤   ¤   ¤   {
3ba1ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   importSet;
c17384 ¤   ¤   ¤   ¤   ¤   ¤   ¤   char¤   ¤   ¤   prompt[256];
b2531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
9f7fd9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetIndCString( prompt, kDialogStringsListResID,
0fc0e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSelectiveImportFoundKeysPromptStrIndex );
2a531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
bc9faa ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPSelectKeysDialog( mContext,
277f2f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation,
91dab0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   prompt, newKeys, params->allKeys,
3bb940 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &importSet );
41c8f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
a006b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
006d8b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( params->allKeys );
d3d1fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   params->allKeys = kInvalidPGPKeySetRef;
e4da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
df9ff3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPSharedAddKeysToDefaultKeyring(
91eb7a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   importSet );
5266f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
b631b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
247f88 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPOpenDefaultKeyRings(
32a5ff ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mContext, 0,
927eda ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &params->allKeys );
ac6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
65da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
f0e957 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( importSet );
685268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
6b6bf5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   else if( err.pgpErr == kPGPError_UserAbort )
5006b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
055fa8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = kPGPError_NoErr;
ec5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
75531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
0d5dfa ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( newKeys );
cedb3c ¤   ¤   ¤   ¤   ¤   ¤   }
eb94aa ¤   ¤   ¤   ¤   ¤   ¤
8d87cf ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
bc8fec ¤   ¤   ¤   ¤   ¤   ¤   {
bf1535 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( ( recipientSettings &
ed3b3f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPRecipientSettingsConvEncrypt ) != 0 )
4306b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
0ba070 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   char¤   *passphrase = NULL;
95b4a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   char¤   prompt[256];
a9da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
6fc097 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetIndCString( prompt,
8175a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDialogStringsListResID,
f76e54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kConventionalPassphrasePromptStrIndex );
200230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
574b05 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UDesktop::Deactivate();
94ee28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr =
--f73f 000ccd02635401200f6 Page 11 of CPGPtoolsFileTask.cp
09b0c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPConventionalEncryptionPassphraseDialog(
a1326b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mContext,
fedab8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt( mContext,
ee1818 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   prompt ),
20b98f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( mContext,
6a6909 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passphrase ),
29eb41 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) );
abed1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UDesktop::Activate();
b5da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
9066f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
9131b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
38d9a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPBuildOptionList(
47fa19 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mContext, &optionsEncode,
9549bb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOConventionalEncrypt(
526f05 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mContext,
61c35a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase(
de7a26 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mContext,
71bcf0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passphrase ),
b1380c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(
1d4e7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mContext ) ),
885ab3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) ¶
9e6275 );
286560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
3dda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
c15c44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntNull( passphrase ) )
17d10d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeData( passphrase );
975268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
1ac4dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
8f06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
ea86de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPBuildOptionList( mContext,
1fac4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &optionsEncode,
9f6ce1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEncryptToKeySet( mContext,
f02766 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   recipients ),
ff920b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) );
6e5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
7fdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
c267c5 ¤
c787cf ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
888fec ¤   ¤   ¤   ¤   ¤   ¤   {
5e778b ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPGuaranteeMinimumEntropy( mContext );
3ddb3c ¤   ¤   ¤   ¤   ¤   ¤   }
b594aa ¤   ¤   ¤   ¤   ¤   ¤
2f87cf ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
d48fec ¤   ¤   ¤   ¤   ¤   ¤   {
474389 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPCopySharesToFile( mContext,
3c6408 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   shareFileRef, optionsEncode,
4956e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   shares );
47af5a
66c8f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
2106b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
770b8b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPSaveShareFile( shareFileRef );
395268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
5bdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
ddaf5a
ecf349 ¤   ¤   ¤   ¤   ¤   ¤   if( PGPKeySetRefIsValid( recipients ) )
74dbb9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( recipients );
5d531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
964d6f ¤   ¤   ¤   ¤   ¤   ¤   if( PGPOptionListRefIsValid( optionsEncode ) )
e60113 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeOptionList( optionsEncode );
201c89 ¤   ¤   ¤   ¤   ¤   }
1faf5a
a41632 ¤   ¤   ¤   ¤   ¤   if( PGPOptionListRefIsValid( optionsDecode ) )
f640e5 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeOptionList( optionsDecode );
9894aa ¤   ¤   ¤   ¤   ¤   ¤
e62268 ¤   ¤   ¤   ¤   ¤   if( PGPShareRefIsValid( shares ) )
0a6e2a ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeShares( shares );
ebaf5a
c931be ¤   ¤   ¤   ¤   ¤   PGPFreeShareFile( shareFileRef );
272613 ¤   ¤   ¤   ¤   }
04a3a6 ¤   ¤   ¤   }
b387c7 ¤   ¤   ¤
ccb9e7 ¤   ¤   ¤   PFLFreeFileSpec( shareFileSpecRef );
--5d81 000bbf2dd83401200f6 Page 12 of CPGPtoolsFileTask.cp
e587c7 ¤   ¤   ¤
26c1b6 ¤   ¤   ¤   // Delete copied share file on error.
3d4ad2 ¤   ¤   ¤   if( err.IsError() && mSourceIsFolder )
37f80a ¤   ¤   ¤   ¤   (void) FSpDelete( destSpec );
b90fe4 ¤   ¤   }
a59371 ¤   }
d91a9a ¤   else if( dialogResult == msg_Cancel )
f8c7a1 ¤   {
dc25dc ¤   ¤   err.pgpErr = kPGPError_UserAbort;
b09371 ¤   }
190e24 ¤   else
c8c7a1 ¤   {
727559 ¤   ¤   /* Skip button. Copy to destination if we're processing a folder. */
9d1b52 ¤   ¤
f4b596 ¤   ¤   if( mSourceIsFolder )
6f5b34 ¤   ¤   {
3e8f30 ¤   ¤   ¤   err.err¤= FSpCopyFiles( PGPGetContextMemoryMgr( mContext ),
45a3c9 ¤   ¤   ¤   ¤   ¤   &srcSpecInfo->srcSpec, destSpec );
d40fe4 ¤   ¤   }
979371 ¤   }
3567c5 ¤
00deb7 ¤   return( err );
e5efe6 }
04af5a
44fbb0 ¤   CToolsError
9e06df CPGPtoolsFileTask::DecryptVerifyFileInternal(
9e3714 ¤   CDecodeParams *¤¤   ¤   params,
0d0140 ¤   const ProcessingInfo *¤ srcSpecInfo,
112493 ¤   const FSSpec *¤ ¤   ¤   destSpec )
54bb36 {
a0d1b2 ¤   CToolsError¤¤   ¤   err;
c01d4e ¤   Boolean¤¤   ¤   ¤   forcePrompt¤= FALSE;
5fa2fc ¤   PGPOptionListRef¤   signingOptions¤ = kInvalidPGPOptionListRef;¤
9802c0 ¤   FileKindInfo¤   ¤   info;
8667c5 ¤
ad5c98 #if PGP_DEBUG
83a33f ¤   pgpAssert( PGPContextRefIsValid( mContext ) );
9a045b ¤   pgpAssertAddrValid( params, CEncodeParams );
0020ba ¤   if ( IsntNull( destSpec ) )
efdd26 ¤   ¤   pgpAssert( ! FSpEqual( &srcSpecInfo->srcSpec, destSpec ) );
a87454 #endif
acaf5a
1198e9 ¤   params->progressDialog->SetNewProgressItem(
662982 ¤   ¤   ¤   ¤   srcSpecInfo->srcSpec.name );
d967c5 ¤
8f2df7 ¤   (void) GetPGPFileKindInfo( &srcSpecInfo->srcSpec, &info );
a267c5 ¤
0716c2 ¤   if( ( info.maybePGPFile || info.isPGPFile ) ||
db1e4d ¤   ¤   ! mSourceIsFolder )¤/* Always try to decrypt "top level" files */
60c7a1 ¤   {
d9c27d ¤   ¤   if( info.isKeyShareFile )
f15b34 ¤   ¤   {
e8f09f ¤   ¤   ¤   err = DecryptKeyShareFile( params, srcSpecInfo,
b497b9 ¤   ¤   ¤   ¤   ¤   ¤   destSpec );
930fe4 ¤   ¤   }
860e1d ¤   ¤   else
075b34 ¤   ¤   {
f099f1 ¤   ¤   ¤   err = DecryptVerifyEncryptedFile( params, srcSpecInfo,
5697b9 ¤   ¤   ¤   ¤   ¤   ¤   destSpec );
f88f55 ¤   ¤   ¤   if( err.IsntError() &&
892b1a ¤   ¤   ¤   ¤   mSourceIsFolder &&
5fbead ¤   ¤   ¤   ¤   IsntNull( destSpec ) &&
35c1a2 ¤   ¤   ¤   ¤   ! FSpExists( destSpec ) )
f0f776 ¤   ¤   ¤   {
56980e ¤   ¤   ¤   ¤   /*
04b9dc ¤   ¤   ¤   ¤   ** "Decrypting" the file did not really do so i.e. there was no
a0d79e ¤   ¤   ¤   ¤   ** data to decrypt. Copy the file instead
9cdf0b ¤   ¤   ¤   ¤   */
a42b85 ¤   ¤   ¤   ¤
6fa277 ¤   ¤   ¤   ¤   err.err = FSpCopyFiles( PGPGetContextMemoryMgr( mContext ),
87a410 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &srcSpecInfo->srcSpec, destSpec );
bba3a6 ¤   ¤   ¤   }
--1316 000daee89b3401200f6 Page 13 of CPGPtoolsFileTask.cp
b50fe4 ¤   ¤   }
6b9371 ¤   }
c80e24 ¤   else
3dc7a1 ¤   {
8e5929 ¤   ¤   /* if it's a file job, don't copy it */
c1795e ¤   ¤   /* but if it's a folder, copy non-relevant items */
d216a1 ¤   ¤   if ( mSourceIsFolder )
235b34 ¤   ¤   {
a3d350 ¤   ¤   ¤   pgpAssert( IsntNull( destSpec ) );
488f30 ¤   ¤   ¤   err.err¤= FSpCopyFiles( PGPGetContextMemoryMgr( mContext ),
25a410 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &srcSpecInfo->srcSpec, destSpec );
2c0fe4 ¤   ¤   }
499371 ¤   }
4967c5 ¤
c9ea14 ¤   if( err.IsntError( ) )
b2c7a1 ¤   {
3f24a9 ¤   ¤   if( mSignatureDataValid )
9a5b34 ¤   ¤   {
4f2a44 ¤   ¤   ¤   CResultsWindow::NewResult( mDetachedSigInputSpec.name[0] != 0 ?
3fa21f ¤   ¤   ¤   ¤   ¤   ¤   mDetachedSigInputSpec.name : srcSpecInfo->srcSpec.name,
22086e ¤   ¤   ¤   ¤   ¤   ¤   &mSignatureData);
de0fe4 ¤   ¤   }
e39371 ¤   }
d9af5a
2fab20 ¤   if( ShouldReportError( err ) )
36c7a1 ¤   {
c309e6 ¤   ¤   err = ReportError( err, kFileCannotBeDecryptedVerifiedStrIndex );
709371 ¤   }
c3af5a
7cdeb7 ¤   return( err );
19efe6 }
98af5a
96af5a
71fbb0 ¤   CToolsError
6eefc4 CPGPtoolsFileTask::DecryptVerifyFolder(
ade93f ¤   CDecodeParams *¤params)
50bb36 {
a47c3e ¤   CToolsError¤err;
d42a06 ¤   FSSpec¤ ¤   destTreeSpec;
6467c5 ¤
58b0e4 ¤   (void)params;
ad100a ¤   pgpAssert( IsntNull( mProcessingList ) );
3567c5 ¤
4aa91f ¤   err.err¤= mProcessingList->PrepareForIteration();
bd7e2a ¤   if ( err.IsntError() && ! mProcessInPlace)
36c7a1 ¤   {
61fdaf ¤   ¤   err.err¤= GetOutputFolderSpec( FALSE,
d35978 ¤   ¤   ¤   ¤   ¤   &mSourceSpec, &destTreeSpec );
84f9a8 ¤   ¤   if ( err.IsntError() )
c05b34 ¤   ¤   {
756164 ¤   ¤   ¤   err.err¤= mProcessingList->CreateDestTree( &destTreeSpec );
ed0fe4 ¤   ¤   }
799371 ¤   }
0967c5 ¤
82ed80 ¤   if ( err.IsntError() )
3fc7a1 ¤   {
961496 ¤   ¤   UInt32¤ numFiles¤   = mProcessingList->GetNumFiles();
f11b52 ¤   ¤
71cada ¤   ¤   for( UInt32 index = 0; index < numFiles; ++index )
8d5b34 ¤   ¤   {
381992 ¤   ¤   ¤   ProcessingInfo¤ info;
ba6483 ¤   ¤   ¤   FSSpec¤ ¤   ¤   destSpec;
74497a ¤   ¤   ¤   FileKindInfo¤   fileInfo;
1c87c7 ¤   ¤   ¤
c9c0c6 ¤   ¤   ¤   mProcessingList->GetIndFile( index, &info );
5f4a2b ¤   ¤   ¤   mWorkingFileSpec¤   = info.srcSpec;
8487c7 ¤   ¤   ¤
889d64 ¤   ¤   ¤   if ( mProcessInPlace )
83f776 ¤   ¤   ¤   {
d7f400 ¤   ¤   ¤   ¤   destSpec.vRefNum¤   = info.srcSpec.vRefNum;
74786e ¤   ¤   ¤   ¤   destSpec.parID¤ ¤   = info.srcSpec.parID;
daa3a6 ¤   ¤   ¤   }
--9dd9 00016401072401200f6 Page 14 of CPGPtoolsFileTask.cp
b1bb8c ¤   ¤   ¤   else
89f776 ¤   ¤   ¤   {
5f8916 ¤   ¤   ¤   ¤   destSpec.vRefNum¤   = info.destVRefNum;
80b99b ¤   ¤   ¤   ¤   destSpec.parID¤ ¤   = info.destParID;
10a3a6 ¤   ¤   ¤   }
9baf5a
8fff9c ¤   ¤   ¤   (void) GetPGPFileKindInfo( &info.srcSpec, &fileInfo );
cb67c5 ¤
2c2000 ¤   ¤   ¤   if ( fileInfo.maybePGPFile || fileInfo.isPGPFile )
adf776 ¤   ¤   ¤   {
e21b34 ¤   ¤   ¤   ¤   GetDefaultDecryptVerifyName( info.srcSpec.name,
56fbf0 ¤   ¤   ¤   ¤   ¤   destSpec.name );
6a503c ¤   ¤   ¤   ¤   pgpAssert( ! FSpEqual( &info.srcSpec, &destSpec ) );
d12b85 ¤   ¤   ¤   ¤
a94f2c ¤   ¤   ¤   ¤   err¤= DecryptVerifyFileInternal( params,
2010aa ¤   ¤   ¤   ¤   ¤   ¤   &info, &destSpec );
05a3a6 ¤   ¤   ¤   }
c33fcd ¤   ¤   ¤   else if ( ! mProcessInPlace )
5df776 ¤   ¤   ¤   {
c93778 ¤   ¤   ¤   ¤   CopyPString( info.srcSpec.name, destSpec.name );
fd9439 ¤   ¤   ¤   ¤   err.err¤= FSpCopyFiles( PGPGetContextMemoryMgr( mContext ),
b831d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &info.srcSpec, &destSpec );
efb646 ¤   ¤   ¤   ¤   pgpAssertNoErr( err.err );
a9a3a6 ¤   ¤   ¤   }
4087c7 ¤   ¤   ¤
1a51f7 ¤   ¤   ¤   if ( err.IsError() )
6ff622 ¤   ¤   ¤   ¤   break;
2e0fe4 ¤   ¤   }
309371 ¤   }
fc67c5 ¤
0fdeb7 ¤   return( err );
3fefe6 }
bdaf5a
2b531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
3dfbb0 ¤   CToolsError
1c9d29 CPGPtoolsFileTask::DecryptVerify(
63a1bc ¤   PGPContextRef¤  ¤   context,
356c35 ¤   PGPtlsContextRef¤   tlsContext,
7feedd ¤   CDecodeParams¤  ¤   *params)
bbbb36 {
6f9d3b ¤   CToolsError¤¤   ¤   ¤   err;
cc67c5 ¤
7a0347 ¤   pgpAssertAddrValid( params, CDecodeParams );
f367c5 ¤
cd1802 ¤   mContext¤   ¤   = context;
860971 ¤   mTLSContext¤¤   = tlsContext;
c9c777 ¤   mProcessInPlace¤= FALSE;
c167c5 ¤
1f0289 ¤   if ( mSourceIsFolder )
9ac7a1 ¤   {
3107b4 ¤   ¤   err¤= DecryptVerifyFolder( params );
241b52 ¤   ¤
ee9371 ¤   }
3c0e24 ¤   else
99c7a1 ¤   {
892e9a ¤   ¤   ProcessingInfo¤ info;
ba1b52 ¤   ¤
ce8ed2 ¤   ¤   mProcessingList->GetIndFile( 0, &info );
6faf5a
eb8508 ¤   ¤   err¤= DecryptVerifyFileInternal( params, &info, NULL );
409371 ¤   }
48af5a
2dd924 ¤   mContext¤   = kInvalidPGPContextRef;
7edeb7 ¤   return( err );
c7efe6 }
eeaf5a
7d6d52 ¤   void
db3107 CPGPtoolsFileTask::BuildErrorMessage(
f31d3a ¤   CToolsError ¤   err,
20904c ¤   short ¤ ¤   errorStrIndex,
062e86 ¤   StringPtr¤  msg)
16bb36 {
--0f96 00045a82257401200f6 Page 15 of CPGPtoolsFileTask.cp
e441be ¤   Str255¤ ¤   ¤   errorStr;
72af5a
ed1705 ¤   GetIndString( msg, kErrorStringListResID, errorStrIndex );
dcaf5a
aa8bd3 ¤   PrintPString( msg, msg, mWorkingFileSpec.name );
c667c5 ¤
ff839c ¤   GetErrorString( err, errorStr );
866ba6 ¤   PrintPString( msg, msg, errorStr );
aaefe6 }
2aaf5a
03af5a
3f85ea ¤   OSStatus
26f569 CPGPtoolsFileTask::CalcProgressBytes(
89520e ¤   PGPContextRef¤  context,
a6b1b0 ¤   ByteCount *¤¤   progressBytes )
99bb36 {
d275f8 ¤   OSStatus¤   err¤= noErr;
9b67c5 ¤
b63cc4 ¤   (void)context;
0a100a ¤   pgpAssert( IsntNull( mProcessingList ) );
57983a ¤   if ( IsNull( mProcessingList ) )
a691d2 ¤   ¤   return( paramErr );
27eb6c ¤   *progressBytes¤ = 0;
0967c5 ¤
30c554 ¤   err¤= mProcessingList->PrepareForIteration();
325ecc ¤   if ( IsntErr( err ) )
a6c7a1 ¤   {
611496 ¤   ¤   UInt32¤ numFiles¤   = mProcessingList->GetNumFiles();
571b52 ¤   ¤
2ed971 //¤ ¤   pgpFixBeforeShip( "get actual size from SDK call" );
00cada ¤   ¤   for( UInt32 index = 0; index < numFiles; ++index )
905b34 ¤   ¤   {
b91992 ¤   ¤   ¤   ProcessingInfo¤ info;
8487c7 ¤   ¤   ¤
40c0c6 ¤   ¤   ¤   mProcessingList->GetIndFile( index, &info );
5387c7 ¤   ¤   ¤
51c0a5 ¤   ¤   ¤   *progressBytes¤ += info.resSize + info.dataSize;
600fe4 ¤   ¤   }
529371 ¤   }
94af5a
8bdeb7 ¤   return( err );
04efe6 }
4faf5a
98af5a
03af5a
c3af5a
f8c744 ¤   PGPError
262fe4 CPGPtoolsFileTask::DecodeOutputEvent(
2fe33b ¤   PGPEvent *¤ ¤   ¤   ¤   ¤   event,
15346f ¤   CDecodeEventHandlerData¤*¤  data)
29bb36 {
788e12 ¤   PGPError¤   err = kPGPError_NoErr;
0b4e2c ¤   FSSpec¤ ¤   outSpec;
d1af5a
5db3c9 ¤   (void)data;
b21b52 ¤   ¤
3a89b9 ¤   GetDefaultDecryptVerifyFSSpec( &mWorkingFileSpec, &outSpec );
4f67c5 ¤
44fb5a ¤   if( ( GetTaskModifiers() & optionKey ) != 0 &&
70fbeb ¤   ¤   ! mSourceIsFolder )
a8c7a1 ¤   {
8d4595 ¤   ¤   Str255¤ ¤   ¤   ¤   prompt;
18344d ¤   ¤   StandardFileReply¤  sfReply;
621b52 ¤   ¤
d609bc ¤   ¤   GetIndString( prompt, kPGPtoolsMiscStringsResID, kSaveDecryptedFileAsPr¶
850def omptStrIndex );
521b52 ¤   ¤
cceb60 ¤   ¤   LMSetSFSaveDisk( -outSpec.vRefNum );
0c3e23 ¤   ¤   LMSetCurDirStore( outSpec.parID );
261b52 ¤   ¤
0ba995 ¤   ¤   StandardPutFile( prompt, outSpec.name, &sfReply );
453631 ¤   ¤   if( sfReply.sfGood )
--9f6a 0004decbe5a401200f6 Page 16 of CPGPtoolsFileTask.cp
e35b34 ¤   ¤   {
14716f ¤   ¤   ¤   outSpec = sfReply.sfFile;
ee0fe4 ¤   ¤   }
ab0e1d ¤   ¤   else
c85b34 ¤   ¤   {
c74e2b ¤   ¤   ¤   err = kPGPError_UserAbort;
000fe4 ¤   ¤   }
bc9371 ¤   }
840e24 ¤   else
b2c7a1 ¤   {
53c63d ¤   ¤   (void) FSpGetUniqueSpec( &outSpec, &outSpec );
389371 ¤   }
4b67c5 ¤
16b1f0 ¤   if( IsntPGPError( err ) )
5ec7a1 ¤   {
252944 ¤   ¤   err = PGPAddJobOptions( event->job,
5b87f6 ¤   ¤   ¤   ¤   ¤   PGPOOutputFileFSSpec( mContext, &outSpec ),
b91bbb ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) );
319371 ¤   }
9467c5 ¤
f1deb7 ¤   return( err );
b0efe6 }
8daf5a
baaf5a
abaf5a
0dc744 ¤   PGPError
90dd03 CPGPtoolsFileTask::DecodeDetachedSignatureEvent(
c6e33b ¤   PGPEvent *¤ ¤   ¤   ¤   ¤   event,
cb346f ¤   CDecodeEventHandlerData¤*¤  data)
cebb36 {
7da3e3 ¤   PGPContextRef¤  c¤  = mContext;
469372 ¤   PGPError¤   ¤   err¤= kPGPError_NoErr;
c667c5 ¤
cefcd5 ¤   /* see if there is an appropriately named source file */
cfc356 ¤   if( ! data->retryingSigVerification )
612f08 ¤   {¤  /* caution: use just macErr here */
d2c656 ¤   ¤   OSStatus¤   macErr;
75fef6 ¤   ¤   CInfoPBRec¤ cpb;
3c67c5 ¤
7f2efb ¤   ¤   if ( GetDetachedSigFileSourceSpec( &mWorkingFileSpec,
6982f8 ¤   ¤   ¤   &mDetachedSigInputSpec ) )
5e5b34 ¤   ¤   {
f3238e ¤   ¤   ¤   macErr¤ = FSpGetCatInfo( &mDetachedSigInputSpec, &cpb );
1063b2 ¤   ¤   ¤   if ( IsntErr( macErr ) )
ddf776 ¤   ¤   ¤   {
9d2d48 ¤   ¤   ¤   ¤   if ( cpbIsFolder( &cpb ) )
cd820f ¤   ¤   ¤   ¤   ¤   macErr¤ = fnfErr;
c9a3a6 ¤   ¤   ¤   }
6f0fe4 ¤   ¤   }
52c96b ¤   ¤   if ( IsErr( macErr ) )
5d5b34 ¤   ¤   {
7bafbc ¤   ¤   ¤   macErr = PromptForSignatureSourceFile( &mWorkingFileSpec,
334658 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mDetachedSigInputSpec );
2c0fe4 ¤   ¤   }
971b52 ¤   ¤
a6978c ¤   ¤   err = MacErrorToPGPError( macErr );
869371 ¤   }
4367c5 ¤
2167c5 ¤
68f1e7 ¤   if ( IsntPGPError( err ) )
54c7a1 ¤   {
4a06c2 ¤   ¤   CInfoPBRec¤ ¤   ¤   ¤   cpb;
3868c0 ¤   ¤   PGPLocalEncodingFlags¤  encodingFlags;
fa1b52 ¤   ¤
71c2d4 ¤   ¤   /* first we'll try MacBinary on (Force), then if we're doing
a1d8db ¤   ¤   ¤   a retry, we'll try it off */
dfc00c ¤   ¤   if ( data->retryingSigVerification )
2b5958 ¤   ¤   ¤   encodingFlags¤  = kPGPLocalEncoding_None;
ad0e1d ¤   ¤   else
221b4a ¤   ¤   ¤   encodingFlags¤  = kPGPLocalEncoding_Force;
8d87c7 ¤   ¤   ¤
4d0d5b ¤   ¤   (void)FSpGetCatInfo( &mWorkingFileSpec, &cpb );
--abc7 0008cc6eeb8401200f6 Page 17 of CPGPtoolsFileTask.cp
f11b52 ¤   ¤
f23e56 ¤   ¤   /* require CRC to be valid, unless it's not created by us */
64ee81 ¤   ¤   /* at least one brain-dead program doesn't set the CRC */
81ea22 ¤   ¤   if ( cpbFileCreator( &cpb ) != kPGPMacFileCreator_Tools )
188ee2 ¤   ¤   ¤   encodingFlags¤  |= kPGPLocalEncoding_NoMacBinCRCOkay;
2d1b52 ¤   ¤
809be4 ¤   ¤   (void)FSpGetCatInfo( &mDetachedSigInputSpec, &cpb );
a8af5a
2ab057 ¤   ¤   mSignatureData.haveResourceFork = ( cpbResForkSize( &cpb ) != 0 );
3587c7 ¤   ¤   ¤
c01b68 ¤   ¤   err¤= PGPAddJobOptions( event->job,
8a04e4 ¤   ¤   ¤   PGPODetachedSig( c,·
654b0d ¤   ¤   ¤   ¤   PGPOInputFileFSSpec( c, &mDetachedSigInputSpec ),
ad34a5 ¤   ¤   ¤   ¤   PGPOLocalEncoding( c, encodingFlags),
05b894 ¤   ¤   ¤   ¤   PGPOLastOption( c ) ),
e821fe ¤   ¤   ¤   PGPOLastOption( c ) );
2c9371 ¤   }
d867c5 ¤
4fdeb7 ¤   return( err );
f4efe6 }
6caf5a
14af5a
43c744 ¤   PGPError
2c3807 CPGPtoolsFileTask::DecodeEventHandler(
8be33b ¤   PGPEvent *¤ ¤   ¤   ¤   ¤   event,
56f821 ¤   CDecodeEventHandlerData *¤  data)
8abb36 {
ee8e12 ¤   PGPError¤   err = kPGPError_NoErr;
d667c5 ¤
36a505 ¤   switch( event->type )
abc7a1 ¤   {
dd9ae3 ¤   ¤   default:
005b34 ¤   ¤   {
f83665 ¤   ¤   ¤   err¤= CPGPtoolsCryptoTask::DecodeEventHandler( event, data );
3bcdcb ¤   ¤   ¤   break;
c60fe4 ¤   ¤   }
b71b52 ¤   ¤
c26773 ¤   ¤   case kPGPEvent_OutputEvent:
705b34 ¤   ¤   {
c63747 ¤   ¤   ¤   if( event->data.outputData.forYourEyesOnly )
f0f776 ¤   ¤   ¤   {
c99b15 ¤   ¤   ¤   ¤   err = CPGPtoolsCryptoTask::DecodeEventHandler( event, data );
01a3a6 ¤   ¤   ¤   }
b9bb8c ¤   ¤   ¤   else
61f776 ¤   ¤   ¤   {
81f7cd ¤   ¤   ¤   ¤   err = DecodeOutputEvent( event, data );
05a3a6 ¤   ¤   ¤   }
19cdcb ¤   ¤   ¤   break;
7d0fe4 ¤   ¤   }
ae1b52 ¤   ¤
114903 ¤   ¤   case ·kPGPEvent_DetachedSignatureEvent:
1a5b34 ¤   ¤   {
23c75a ¤   ¤   ¤   err = DecodeDetachedSignatureEvent( event, data );
4fcdcb ¤   ¤   ¤   break;
120fe4 ¤   ¤   }
731b52 ¤   ¤
dbcb7a ¤   ¤   case kPGPEvent_EndLexEvent:
e35b34 ¤   ¤   {
a8e25f ¤   ¤   ¤   err = CPGPtoolsCryptoTask::DecodeEventHandler( event, data );
60cdcb ¤   ¤   ¤   break;
7c0fe4 ¤   ¤   }
619371 ¤   }
3567c5 ¤
9adeb7 ¤   return( err );
efefe6 }
f6af5a
c2af5a
c4af5a
f16d52 ¤   void
938339 CPGPtoolsFileTask::GetDecryptPassphrasePromptString(StringPtr prompt)
2dbb36 {
8c7aac ¤   GetIndString( prompt, kDialogStringsListResID,
--1eec 001f628cbd1401200f6 Page 18 of CPGPtoolsFileTask.cp
c68d27 ¤   ¤   ¤   ¤   ¤   ¤   kGetPassphraseForFilePromptStrIndex );
66f1c6 ¤   PrintPString( prompt, prompt, mWorkingFileSpec.name );
faefe6 }
b7af5a
1e6d52 ¤   void
46c4a7 CPGPtoolsFileTask::GetTaskItemName(StringPtr name)
72bb36 {
12a0eb ¤   CopyPString( mWorkingFileSpec.name, name );
99efe6 }
15af5a
6faf5a
2885ea ¤   OSStatus
6c717e CPGPtoolsFileTask::CanUseFYEO(
c404f4 ¤   Boolean *¤  outCanUseFYEO)
42bb36 {
c042c9 ¤   OSStatus¤   result = noErr;
4967c5 ¤
c11db6 ¤   *outCanUseFYEO = false;
1f895d ¤   if( ! mSourceIsFolder )
fdc7a1 ¤   {
b3fef6 ¤   ¤   CInfoPBRec¤ cpb;
cf1b52 ¤   ¤
ca693a ¤   ¤   result = FSpGetCatInfo( &mSourceSpec, &cpb );
c62143 ¤   ¤   if( ( result == noErr ) && ( cpbFileType( &cpb ) == 'TEXT' ) )
f55b34 ¤   ¤   {
672499 ¤   ¤   ¤   *outCanUseFYEO = true;
d20fe4 ¤   ¤   }
929371 ¤   }
1067c5 ¤
895d73 ¤   return result;
f6efe6 }
--63be 0007d20f68b401200f7 Page 1 of CPGPtoolsFileTask.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
a1f742 ¤   $Id: CPGPtoolsFileTask.h,v 1.28.2.1.2.1 1998/11/12 03:09:09 heller Exp $
c1f7f7 ____________________________________________________________________________*/
46af5a
5f7b7d #pragma once
43af5a
896a51 #include "CPGPtoolsCryptoTask.h"
1faf5a
54d156 class LArray;
246d53 class CPGPtoolsProcessingList;
68a2fd struct ProcessingInfo;
94af5a
9a62ce class CPGPtoolsFileTask : public CPGPtoolsCryptoTask
1abb36 {
f85ed4 public:
3df4bb ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsFileTask(PGPtoolsOperation operation,
e857c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec *fileSpec);
0d7fdb ¤   virtual¤¤   ¤   ¤   ~CPGPtoolsFileTask(void);
81531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
be4b16 ¤   virtual¤OSStatus¤   CalcProgressBytes(PGPContextRef context,
8b32bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ByteCount *bytes);
b795ac ¤   virtual¤CToolsError¤DecryptVerify(PGPContextRef context,
3f1764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
ed7e10 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeParams *params);
b1acfe ¤   virtual¤CToolsError¤EncryptSign(PGPContextRef context,
581764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
be6692 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CEncodeParams *params);
4167c5 ¤
1af401 ¤   OSStatus¤   ¤   ¤   CanUseFYEO(Boolean * outCanUseFYEO);
5faf5a
90a2d3 protected:
f8af5a
e41ff8 ¤   FSSpec¤ ¤   ¤   ¤   mSourceSpec;¤   ¤   // Original target file or folder
0af553 ¤   Boolean¤¤   ¤   ¤   mSourceIsFolder;
8c7724 ¤   Boolean¤¤   ¤   ¤   mProcessInPlace;
8c1f69 ¤   FSSpec¤ ¤   ¤   ¤   mWorkingFileSpec;¤  // Current child target (if any)
cecf54 ¤   FSSpec¤ ¤   ¤   ¤   mDetachedSigInputSpec;
4d67c5 ¤
a8d38a ¤   CPGPtoolsProcessingList¤*mProcessingList;
0a531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
c40327 ¤   virtual¤CToolsError¤EncryptSignFileInternal(
dd0d58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CEncodeParams ¤ ¤   ¤   *params,
221263 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const ProcessingInfo¤   *srcInfo,
e6e13d ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec ¤  ¤   ¤   *destSpec);
06531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
617066 ¤   virtual¤CToolsError¤EncryptSignFolder( CEncodeParams *params);
2c531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
e167c5 ¤
50b5b0 ¤   virtual Boolean¤¤   ShouldEncryptSignFile( Boolean¤ encrypting,
90dd95 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec *spec );
b7531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
83531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
a1a233 ¤   virtual CToolsError¤DecryptKeyShareFile(CDecodeParams *params,
1fd5c9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const ProcessingInfo * srcSpecInfo,
1d0f91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * destSpec);
9a30ae ¤   virtual¤CToolsError¤DecryptVerifyFileInternal(
d12ecd ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeParams *¤¤   ¤   params,
9695d1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const ProcessingInfo *¤ srcSpecInfo,
e64f34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec *¤ ¤   ¤   destSpec);
6267c5 ¤
4087c7 ¤   virtual¤CToolsError¤DecryptVerifyFolder(CDecodeParams *params);
12b332 ¤   virtual CToolsError¤DecryptVerifyEncryptedFile(CDecodeParams *params,
5fd5c9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const ProcessingInfo * srcSpecInfo,
900f91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec * destSpec);
ea2d71 ¤   virtual PGPError¤   DecodeDetachedSignatureEvent(
4ac643 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent ¤  ¤   ¤   ¤   *event,
ed20f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeEventHandlerData¤*params);
52531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
7d30a9 ¤   virtual PGPError¤   DecodeEventHandler(
--5a48 0016b071ea6401200f7 Page 2 of CPGPtoolsFileTask.h
7c0530 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event, CDecodeEventHandlerData *params);
58da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
c9766f ¤   virtual¤PGPError¤   DecodeOutputEvent(
2bb5ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event,
6cecbe ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeEventHandlerData *params);
7a531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
e07186 ¤   virtual¤void¤   ¤   GetDecryptPassphrasePromptString(StringPtr prompt);
9867c5 ¤
e60bcd ¤   virtual¤void¤   ¤   GetTaskItemName(StringPtr name);
fada4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
a98c3a ¤   virtual¤void¤   ¤   BuildErrorMessage(CToolsError err,
3f24a9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   short errorStrIndex, StringPtr msg);
e2531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
b173af ¤   OSStatus¤   ¤   ¤   GetOutputFolderSpec( Boolean encryptSign,
173ef2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec *srcSpec,
2ef259 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FSSpec * destSpec );
50531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
3d24d0 ¤   OSStatus¤   ¤   ¤   GetDecryptSpec(Boolean verifying,
fda0f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const FSSpec *sourceSpec,
cd2bb6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FSSpec *destSpec);
4982f7 };
6caf5a
6baf5a
--16ac 00023cb8a4b401200f8 Page 1 of CPGPtoolsMainWindow.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
ff68d4 ¤   $Id: CPGPtoolsMainWindow.cp,v 1.9.8.1 1998/11/12 03:09:09 heller Exp $
48f7f7 ____________________________________________________________________________*/
3caf5a
95b980 #include <Appearance.h>
1eb4df #include <Windows.h>
5caf5a
cfe8ae #include <UDrawingUtils.h>
fa8f92 #include <UGAColorRamp.h>
bcaf5a
610e9a #include "MacQuickDraw.h"
7c3192 #include "CPGPtools.h"
d70537 #include "CPGPtoolsMainWindow.h"
746a4c #include "PGPtoolsPreferences.h"
0caf5a
f9e917 const PaneIDT¤  kSmallEncryptReceiverPaneID¤¤   ¤   = 'sEnc';
7552cf const PaneIDT¤  kSmallSignReceiverPaneID¤   ¤   ¤   = 'sSig';
964b0b const PaneIDT¤  kSmallEncryptSignReceiverPaneID¤¤   = 'sEnS';
67faa3 const PaneIDT¤  kSmallDecryptVerifyReceiverPaneID¤  = 'sDec';
b16237 const PaneIDT¤  kSmallWipeReceiverPaneID¤   ¤   ¤   = 'sWip';
132e2e const PaneIDT¤  kSmallWipeFreeSpaceReceiverPaneID¤  = 'sWFS';
7aaf5a
fd0efe const PaneIDT¤  kLargeEncryptReceiverPaneID¤¤   ¤   = 'dEnc';
90b526 const PaneIDT¤  kLargeSignReceiverPaneID¤   ¤   ¤   = 'dSig';
6eace2 const PaneIDT¤  kLargeEncryptSignReceiverPaneID¤¤   = 'dEnS';
8d1d4a const PaneIDT¤  kLargeDecryptVerifyReceiverPaneID¤  = 'dDec';
b385de const PaneIDT¤  kLargeWipeReceiverPaneID¤   ¤   ¤   = 'dWip';
dac9c7 const PaneIDT¤  kLargeWipeFreeSpaceReceiverPaneID¤  = 'dWFS';
eeaf5a
929cdc CPGPtoolsMainWindow::CPGPtoolsMainWindow(LStream *inStream)
fb8e8d ¤   : CPGPtoolsWindow(inStream)
8abb36 {
d2cf4e ¤   mIsSmallSize = false;
6aefe6 }
63af5a
387ad8 CPGPtoolsMainWindow::~CPGPtoolsMainWindow(void)
e3bb36 {
f8efe6 }
75af5a
796d52 ¤   void
ecda7a CPGPtoolsMainWindow::FinishCreateSelf(void)
b7bb36 {
603d3e ¤   RGBColor¤   foreColor;
3c60f4 ¤   RGBColor¤   backColor;
ff67c5 ¤
f16221 ¤   CPGPtoolsWindow::FinishCreateSelf();
2267c5 ¤
259d67 ¤   SetThemeWindowBackground( GetMacPort(), kThemeActiveDialogBackgroundBrush, ¶
9096e2 FALSE );
e6af5a
3cb409 ¤   GetForeColor( &foreColor );
fada45 ¤   GetBackColor( &backColor );
b967c5 ¤
f7a5cf ¤   SetForeAndBackColors( &foreColor, &backColor );
cc67c5 ¤
2a0927 ¤   if( gPreferences.smallMainWindow )
e0c7a1 ¤   {
275bf2 ¤   ¤   DoSetZoom( true );
a09371 ¤   }
1867c5 ¤
f7ce8e ¤   UpdateButtonsState();
85efe6 }
46af5a
bc6d52 ¤   void
279dfc CPGPtoolsMainWindow::ApplyForeAndBackColors(void) const
3cbb36 {
989d67 ¤   SetThemeWindowBackground( GetMacPort(), kThemeActiveDialogBackgroundBrush, ¶
5a96e2 FALSE );
23efe6 }
--b3ba 00093b21d15401200f8 Page 2 of CPGPtoolsMainWindow.cp
e0af5a
2c6d52 ¤   void
67bd29 CPGPtoolsMainWindow::DeactivateSelf(void)
78bb36 {
4fdf29 ¤   CPGPtoolsWindow::DeactivateSelf();
0a67c5 ¤
9a9037 ¤   UpdatePort();
6fefe6 }
20af5a
2e6d52 ¤   void
32e29b CPGPtoolsMainWindow::DoSetZoom(Boolean inZoomToStdState)
b3bb36 {
657ee8 ¤   Rect¤   minMaxSize;
9dd70d ¤   short¤  newHeight;
7f6abe ¤   short¤  newWidth;
b467c5 ¤
706ca7 ¤   #pragma unused (inZoomToStdState)
bc67c5 ¤
147dad ¤   GetMinMaxSize( minMaxSize );
3b67c5 ¤
ff4acc ¤   // Always toggle the zoom state
9b67c5 ¤
b9e173 ¤   if( mIsSmallSize )
31c7a1 ¤   {
bf8571 ¤   ¤   newHeight = minMaxSize.bottom;
ea02d6 ¤   ¤   newWidth = minMaxSize.right;
2caf5a
440a0f ¤   ¤   FindPaneByID( 'SBox' )->Hide();
a0af5a
16cdfb ¤   ¤   SizeWindow( mMacWindowP, newWidth, newHeight, false );
266589 ¤   ¤   ResizeFrameTo( newWidth, newHeight, true );
65af5a
fc1e97 ¤   ¤   FindPaneByID( 'LBox' )->Show();
ba9371 ¤   }
910e24 ¤   else
ecc7a1 ¤   {
1a141d ¤   ¤   newHeight = minMaxSize.top;
b91323 ¤   ¤   newWidth = minMaxSize.left;
9f1b52 ¤   ¤
a4f2bb ¤   ¤   FindPaneByID( 'LBox' )->Hide();
ce1b52 ¤   ¤
96cdfb ¤   ¤   SizeWindow( mMacWindowP, newWidth, newHeight, false );
f86589 ¤   ¤   ResizeFrameTo( newWidth, newHeight, true );
59af5a
ac8669 ¤   ¤   if( ! WindowOnVisibleDevice() )
e55b34 ¤   ¤   {
9771c7 ¤   ¤   ¤   Point¤  newPos;
9187c7 ¤   ¤   ¤
cbcfbe ¤   ¤   ¤   newPos.v = newPos.h = 100;
7f87c7 ¤   ¤   ¤
59fd3b ¤   ¤   ¤   DoSetPosition( newPos );
390fe4 ¤   ¤   }
361b52 ¤   ¤
dfe623 ¤   ¤   FindPaneByID( 'SBox' )->Show();
709371 ¤   }
1baf5a
2c8036 ¤   mIsSmallSize = ! mIsSmallSize;
4067c5 ¤
701c2d ¤   gPreferences.smallMainWindow = mIsSmallSize;
14efe6 }
c1af5a
3e6d52 ¤   void
b28d9b CPGPtoolsMainWindow::UpdateButtonsState(void)
11bb36 {
44e6ee ¤   if( CPGPtools::AppCanDoOperation( kPGPtoolsEncryptOperation ) )
28c7a1 ¤   {
516147 ¤   ¤   FindPaneByID( kSmallEncryptReceiverPaneID )->Enable();
476c36 ¤   ¤   FindPaneByID( kLargeEncryptReceiverPaneID )->Enable();
ef9371 ¤   }
d50e24 ¤   else
d3c7a1 ¤   {
937bb2 ¤   ¤   FindPaneByID( kSmallEncryptReceiverPaneID )->Disable();
--99ab 001cde32f09401200f8 Page 3 of CPGPtoolsMainWindow.cp
3419b1 ¤   ¤   FindPaneByID( kLargeEncryptReceiverPaneID )->Disable();
119371 ¤   }
13af5a
ff8a9f ¤   if( CPGPtools::AppCanDoOperation( kPGPtoolsSignOperation ) )
86c7a1 ¤   {
8f2416 ¤   ¤   FindPaneByID( kSmallSignReceiverPaneID )->Enable();
900c42 ¤   ¤   FindPaneByID( kLargeSignReceiverPaneID )->Enable();
c49371 ¤   }
ec0e24 ¤   else
6dc7a1 ¤   {
8238fb ¤   ¤   FindPaneByID( kSmallSignReceiverPaneID )->Disable();
592c72 ¤   ¤   FindPaneByID( kLargeSignReceiverPaneID )->Disable();
3c9371 ¤   }
feaf5a
61d76d ¤   if( CPGPtools::AppCanDoOperation( kPGPtoolsEncryptSignOperation ) )
97c7a1 ¤   {
902fe2 ¤   ¤   FindPaneByID( kSmallEncryptSignReceiverPaneID )->Enable();
489663 ¤   ¤   FindPaneByID( kLargeEncryptSignReceiverPaneID )->Enable();
879371 ¤   }
270e24 ¤   else
07c7a1 ¤   {
af895b ¤   ¤   FindPaneByID( kSmallEncryptSignReceiverPaneID )->Disable();
8c1c63 ¤   ¤   FindPaneByID( kLargeEncryptSignReceiverPaneID )->Disable();
859371 ¤   }
edaf5a
1d70ef ¤   if( CPGPtools::AppCanDoOperation( kPGPtoolsDecryptVerifyOperation ) )
e4c7a1 ¤   {
afa39a ¤   ¤   FindPaneByID( kSmallDecryptVerifyReceiverPaneID )->Enable();
9a1ec4 ¤   ¤   FindPaneByID( kLargeDecryptVerifyReceiverPaneID )->Enable();
619371 ¤   }
7e0e24 ¤   else
27c7a1 ¤   {
4a7618 ¤   ¤   FindPaneByID( kSmallDecryptVerifyReceiverPaneID )->Disable();
7acd5e ¤   ¤   FindPaneByID( kLargeDecryptVerifyReceiverPaneID )->Disable();
4f9371 ¤   }
a9af5a
36ebf7 ¤   if( CPGPtools::AppCanDoOperation( kPGPtoolsWipeOperation ) )
79c7a1 ¤   {
f3fef9 ¤   ¤   FindPaneByID( kSmallWipeReceiverPaneID )->Enable();
48d6ad ¤   ¤   FindPaneByID( kLargeWipeReceiverPaneID )->Enable();
579371 ¤   }
5b0e24 ¤   else
88c7a1 ¤   {
f427d8 ¤   ¤   FindPaneByID( kSmallWipeReceiverPaneID )->Disable();
6c3351 ¤   ¤   FindPaneByID( kLargeWipeReceiverPaneID )->Disable();
969371 ¤   }
8aaf5a
ceaf5a
d23286 ¤   if( CPGPtools::AppCanDoOperation( kPGPtoolsWipeFreeSpaceOperation ) )
40c7a1 ¤   {
a7bcc8 ¤   ¤   FindPaneByID( kSmallWipeFreeSpaceReceiverPaneID )->Enable();
930196 ¤   ¤   FindPaneByID( kLargeWipeFreeSpaceReceiverPaneID )->Enable();
9d9371 ¤   }
730e24 ¤   else
e2c7a1 ¤   {
870790 ¤   ¤   FindPaneByID( kSmallWipeFreeSpaceReceiverPaneID )->Disable();
bebcd6 ¤   ¤   FindPaneByID( kLargeWipeFreeSpaceReceiverPaneID )->Disable();
479371 ¤   }
cdefe6 }
--67bf 00131a12fea401200f9 Page 1 of CPGPtoolsMainWindow.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
86b485 ¤   $Id: CPGPtoolsMainWindow.h,v 1.8.8.1 1998/11/12 03:09:10 heller Exp $
91f7f7 ____________________________________________________________________________*/
b1af5a
237b7d #pragma once
68af5a
b609d9 #include "CPGPtoolsWindow.h"
7baf5a
cbf660 class CPGPtoolsMainWindow¤  : public CPGPtoolsWindow
54bb36 {
235ed4 public:
bea3f9 ¤   enum { class_ID = 'MWin' };
51af5a
425967 ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsMainWindow(LStream *inStream);
7149c0 ¤   ¤   ¤   ¤   ¤   ¤   ~CPGPtoolsMainWindow(void);
cfaf5a
95dbc4 ¤   virtual void¤   ¤   ApplyForeAndBackColors() const;
4cbc7e ¤   virtual void¤   ¤   DoSetZoom(Boolean inZoomToStdState);
330a80 ¤   void¤   ¤   ¤   ¤   UpdateButtonsState(void);
a067c5 ¤
70a2d3 protected:
07af5a
948d04 ¤   virtual void¤   ¤   DeactivateSelf();
adfebc ¤   virtual void¤   ¤   FinishCreateSelf(void);
a667c5 ¤
fc86d3 ¤   Boolean¤¤   ¤   ¤   mIsSmallSize;
cf82f7 };
31af5a
--3002 001d7628c7c401200fa Page 1 of CPGPtoolsPassphraseList.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
8e9ba1 ¤   $Id: CPGPtoolsPassphraseList.cp,v 1.7.8.1 1998/11/12 03:09:11 heller Exp $
87f7f7 ____________________________________________________________________________*/
2aaf5a
b2324c #include <string.h>
70af5a
e1a85e #include <LArrayIterator.h>
67af5a
b785c2 #include "MacStrings.h"
cd0d08 #include "pgpMem.h"
f74919 #include "pgpUtilities.h"
a4af5a
0fd73a #include "CSecureMemory.h"
9edaf9 #include "CPGPtoolsPassphraseList.h"
a3af5a
15e5f7 CPGPtoolsPassphraseList::CPGPtoolsPassphraseList(void) :
66be35 ¤   ¤   LArray( sizeof( PassphraseListItem ) )
88bb36 {
51efe6 }
42af5a
673442 CPGPtoolsPassphraseList::~CPGPtoolsPassphraseList(void)
51bb36 {
8e464b ¤   PassphraseListItem¤ listItem;
039e14 ¤   LArrayIterator¤ ¤   iterator( *this );
9c67c5 ¤
575b64 ¤   while( iterator.Next( &listItem ) )
57c7a1 ¤   {
e988cd ¤   ¤   pgpAssert( IsntNull( listItem.passphrase ) );
d11b52 ¤   ¤
e74b82 ¤   ¤   PGPFreeData( listItem.passphrase );
a19371 ¤   }
49efe6 }
e4af5a
646d52 ¤   void
b91171 CPGPtoolsPassphraseList::RememberPassphrase(
b635f6 ¤   PGPContextRef ¤ context,
a63940 ¤   const char ¤¤   *passphrase)
27bb36 {
c7464b ¤   PassphraseListItem¤ listItem;
a267c5 ¤
083b56 ¤   listItem.passphrase = (char *) PGPNewSecureData(
6980d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( context ),
e23bbd ¤   ¤   ¤   ¤   ¤   ¤   ¤   strlen( passphrase ) + 1, 0 );
e72e68 ¤   if( IsntNull( listItem.passphrase ) )
27c7a1 ¤   {
d0b087 ¤   ¤   CopyCString( passphrase, listItem.passphrase );
ed1976 ¤   ¤   InsertItemsAt( 1, 1, &listItem );
eb9371 ¤   }
d7be43 }¶
--810a 0012f7c3110401200fb Page 1 of CPGPtoolsPassphraseList.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
99a541 ¤   $Id: CPGPtoolsPassphraseList.h,v 1.4.8.1 1998/11/12 03:09:12 heller Exp $
11f7f7 ____________________________________________________________________________*/
35af5a
187b7d #pragma once
16af5a
5fb0f8 #include <LArray.h>
32af5a
fd16c4 typedef struct PassphraseListItem
6dbb36 {
86dfba ¤   char¤   *passphrase;
2267c5 ¤
d04c00 } PassphraseListItem;
b4af5a
aa46c2 class CPGPtoolsPassphraseList : public LArray
5ebb36 {
c45ed4 public:
2457c5 ¤   ¤   ¤   ¤   CPGPtoolsPassphraseList(void);
54a0c8 ¤   ¤   ¤   ¤   ~CPGPtoolsPassphraseList(void);
c72b85 ¤   ¤   ¤   ¤
309fe0 ¤   void¤   ¤   RememberPassphrase(PGPContextRef context,
9fda00 ¤   ¤   ¤   ¤   ¤   ¤   const char *passphrase);
2fbf26 };¶
--fa57 000465b8155401200fc Page 1 of CPGPtoolsProcessingList.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
4894da ¤   $Id: CPGPtoolsProcessingList.cp,v 1.3.16.1 1998/11/12 03:09:12 heller Exp $
38f7f7 ____________________________________________________________________________*/
820d08 #include "pgpMem.h"
2eaf5a
54bbf4 #include "MacFiles.h"
0685c2 #include "MacStrings.h"
19af5a
403ecd #include "CPGPtoolsProcessingList.h"
1faf5a
b7af5a
7faf5a
ceaf5a
db0335 /*____________________________________________________________________________
1eceb9 ¤   Later, we'll write a more efficient allocator
50f7f7 ____________________________________________________________________________*/
bc85ea ¤   OSStatus
c39537 CPGPtoolsProcessingList::AllocateSpace( PGPSize size, void **mem )
97bb36 {
7d75f8 ¤   OSStatus¤   err¤= noErr;
9067c5 ¤
c422e2 ¤   *mem¤   = pgpAlloc( size );
deeee6 ¤   if ( IsNull( *mem ) )
783dca ¤   ¤   err¤= memFullErr;
67deb7 ¤   return( err );
deefe6 }
25af5a
7285ea ¤   OSStatus
a11ec0 CPGPtoolsProcessingList::FreeSpace( void *mem )
53bb36 {
1d33d6 ¤   if ( IsntNull( mem ) )
3ec08b ¤   ¤   pgpFree( mem );
2379ad ¤   return( noErr );
85efe6 }
1aaf5a
aaaf5a
df6d52 ¤   void
141490 CPGPtoolsProcessingList::DeleteSubTree( CProcessingItem *item )
2fbb36 {
87c452 ¤   CProcessingItem *¤  cur;
2367c5 ¤
9c484f ¤   /* delete any children before deleting self */
7b2d88 ¤   cur¤= item->children;
a7f700 ¤   while ( IsntNull( cur ) )
acc7a1 ¤   {
9257fb ¤   ¤   CProcessingItem *¤  next;
0c1b52 ¤   ¤
4474e5 ¤   ¤   next¤   = cur->next;
04a08e ¤   ¤   DeleteSubTree( cur );
19f47c ¤   ¤   cur¤= next;
139371 ¤   }
4067c5 ¤
dfcc41 ¤   FreeSpace( item );
02efe6 }
37af5a
1d6d52 ¤   void
06ef0f CPGPtoolsProcessingList::DeleteTree( ·)
40bb36 {
996f4e ¤   if ( IsntNull( mTreeRoot ) )
32c7a1 ¤   {
ae67f2 ¤   ¤   DeleteSubTree( mTreeRoot );
76e8e6 ¤   ¤   mTreeRoot¤  = NULL;
2e9371 ¤   }
5aefe6 }
5eaf5a
c267c5 ¤
4685ea ¤   OSStatus
--d2d3 0000b9ae6fc401200fc Page 2 of CPGPtoolsProcessingList.cp
c6527c CPGPtoolsProcessingList::NewItem(
37a924 ¤   CProcessingItem *¤  parent,
61e45a ¤   const FSSpec *¤ ¤   srcSpec,
bb8c56 ¤   CProcessingItem **¤ itemPtr )
70bb36 {
a18737 ¤   OSStatus¤   ¤   ¤   err;
030a3b ¤   void *¤ ¤   ¤   ¤   mem;
1a6851 ¤   CProcessingItem *¤  item¤   = NULL;
ef67c5 ¤
bce25f ¤   err¤¤   = AllocateSpace( sizeof( *item ), &mem );
362938 ¤   item¤   = (CProcessingItem *)mem;
e95ecc ¤   if ( IsntErr( err ) )
eac7a1 ¤   {
67ea11 ¤   ¤   pgpClearMemory( item, sizeof( *item ) );
4e974b ¤   ¤   item->parent¤   = parent;
eff95c ¤   ¤   item->children¤ = NULL;
691433 ¤   ¤   item->next¤ ¤   = NULL;
d8795f ¤   ¤   item->srcSpec¤  = *srcSpec;
569371 ¤   }
5a67c5 ¤
0e65c3 ¤   *itemPtr¤   = item;
28deb7 ¤   return( err );
cdefe6 }
7caf5a
78af5a
3d85ea ¤   OSStatus
f91beb CPGPtoolsProcessingList::NewFolderItem(
aea924 ¤   CProcessingItem *¤  parent,
78e45a ¤   const FSSpec *¤ ¤   srcSpec,
4e8c56 ¤   CProcessingItem **¤ itemPtr )
3ebb36 {
988737 ¤   OSStatus¤   ¤   ¤   err;
a19283 ¤   CProcessingItem *¤  item;
c067c5 ¤
8e7051 ¤   err¤= NewItem( parent, srcSpec, &item );
015ecc ¤   if ( IsntErr( err ) )
7ec7a1 ¤   {
39361a ¤   ¤   item->fileCount¤= 0;
0ef0e5 ¤   ¤   item->isFolder¤ = TRUE;
c39371 ¤   }
9b67c5 ¤
dc65c3 ¤   *itemPtr¤   = item;
51deb7 ¤   return( err );
56efe6 }
edaf5a
99af5a
1385ea ¤   OSStatus
156ea6 CPGPtoolsProcessingList::NewFileItem(
14a924 ¤   CProcessingItem *¤  parent,
ffe45a ¤   const FSSpec *¤ ¤   srcSpec,
e7b1bb ¤   const CInfoPBRec *¤ cpb,
cb8c56 ¤   CProcessingItem **¤ itemPtr )
88bb36 {
4d8737 ¤   OSStatus¤   ¤   ¤   err;
ff9283 ¤   CProcessingItem *¤  item;
6367c5 ¤
5e7051 ¤   err¤= NewItem( parent, srcSpec, &item );
2f5ecc ¤   if ( IsntErr( err ) )
fec7a1 ¤   {
e46cc6 ¤   ¤   item->fileCount¤= 1;
df8110 ¤   ¤   item->isFolder¤ = FALSE;
dcc5a5 ¤   ¤   item->resSize¤  = cpbResForkSize( cpb );
c83034 ¤   ¤   item->dataSize¤ = cpbDataForkSize( cpb );
6ba8d3 ¤   ¤   item->fInfo¤¤   = cpbFInfo( cpb );
229371 ¤   }
a967c5 ¤
9b65c3 ¤   *itemPtr¤   = item;
41deb7 ¤   return( err );
c2efe6 }
12af5a
15af5a
0b85ea ¤   OSStatus
--037b 0006b338c0f401200fc Page 3 of CPGPtoolsProcessingList.cp
d546a8 CPGPtoolsProcessingList::BuildDownFromItem( CProcessingItem *parent )
d6bb36 {
e06ead ¤   OSStatus¤   ¤   ¤   err¤= noErr;
90b186 ¤   CInfoPBRec¤ ¤   ¤   cpb;
97f78e ¤   FSSpec¤ ¤   ¤   ¤   spec;
2ba30e ¤   CProcessingItem *¤  curChild¤   = NULL;
949414 ¤   long¤   ¤   ¤   ¤   parentDirID;
6e67c5 ¤
44a894 ¤   pgpAssert( IsNull( parent->children ) );
99967f ¤   pgpAssert( IsntNull( parent->parent ) || parent == mTreeRoot );
c767c5 ¤
f01cd4 ¤   /* get directory ID of 'parent' */
49d9a2 ¤   FSpGetCatInfo( &parent->srcSpec, &cpb );
0bf89a ¤   pgpAssert( cpbIsFolder( &cpb ) );
1d77a8 ¤   parentDirID¤= cpb.hFileInfo.ioDirID;
3aaf5a
b5196a ¤   spec.vRefNum¤   = parent->srcSpec.vRefNum;
3a94a4 ¤   spec.parID¤ ¤   = parentDirID;
7867c5 ¤
8a08a6 ¤   cpb.hFileInfo.ioVRefNum¤¤   = spec.vRefNum;
94b7d7 ¤   cpb.hFileInfo.ioDirID¤  ¤   = spec.parID;
f248ad ¤   cpb.hFileInfo.ioNamePtr¤¤   = spec.name;
b933a4 ¤   cpb.hFileInfo.ioFDirIndex¤  = 1;
4c72c9 ¤   while ( TRUE )
71c7a1 ¤   {
8a45cf ¤   ¤   CProcessingItem *¤  newItem¤= NULL;
a4da42 ¤   ¤   Boolean¤¤   ¤   ¤   isFolder;
8c1b52 ¤   ¤
fdf801 ¤   ¤   err¤= PBGetCatInfoSync( &cpb );
078cf4 ¤   ¤   if ( IsErr( err ) )
265b34 ¤   ¤   {
2bc7c1 ¤   ¤   ¤   err¤= noErr;
decdcb ¤   ¤   ¤   break;
660fe4 ¤   ¤   }
a31b52 ¤   ¤
6ec779 ¤   ¤   isFolder¤   = cpbIsFolder( &cpb );
a31503 ¤   ¤   if ( isFolder )
825b34 ¤   ¤   {
454e2a ¤   ¤   ¤   err¤= NewFolderItem( parent, &spec, &newItem );
e30fe4 ¤   ¤   }
9d0e1d ¤   ¤   else
d95b34 ¤   ¤   {
4ce074 ¤   ¤   ¤   err¤= NewFileItem( parent, &spec, &cpb, &newItem );
1cabf3 ¤   ¤   ¤   pgpAssert( IsntNull( newItem->parent ) || newItem == mTreeRoot );
c5c0cc ¤   ¤   ¤   parent->fileCount¤  += 1;
320fe4 ¤   ¤   }
cd8cf4 ¤   ¤   if ( IsErr( err ) )
e2cdcb ¤   ¤   ¤   break;
7d1b52 ¤   ¤
bdc666 ¤   ¤   if ( IsNull( curChild ) )
815b34 ¤   ¤   {
c680b2 ¤   ¤   ¤   parent->children¤   = newItem;
91662e ¤   ¤   ¤   curChild¤   ¤   ¤   = newItem;
fe0fe4 ¤   ¤   }
760e1d ¤   ¤   else
705b34 ¤   ¤   {
7d31ce ¤   ¤   ¤   curChild->next¤ = newItem;
65d111 ¤   ¤   ¤   curChild¤   ¤   = newItem;
d10fe4 ¤   ¤   }
c31b52 ¤   ¤
171503 ¤   ¤   if ( isFolder )
705b34 ¤   ¤   {
609811 ¤   ¤   ¤   err¤= BuildDownFromItem( newItem );
ab9ed0 ¤   ¤   ¤   parent->fileCount¤  += newItem->fileCount;
450fe4 ¤   ¤   }
ff8cf4 ¤   ¤   if ( IsErr( err ) )
e9cdcb ¤   ¤   ¤   break;
271b52 ¤   ¤
3cf8e9 ¤   ¤   cpb.hFileInfo.ioDirID¤  ¤   = spec.parID;
a8e1cd ¤   ¤   cpb.hFileInfo.ioFDirIndex¤  += 1;
589371 ¤   }
6baf5a
--0488 0004333720d401200fc Page 4 of CPGPtoolsProcessingList.cp
afdeb7 ¤   return( err );
b7efe6 }
35af5a
adaf5a
f385ea ¤   OSStatus
cb72a3 CPGPtoolsProcessingList::BuildTree( void )
afbb36 {
5f1903 ¤   CInfoPBRec¤ ¤   cpb;
6579f7 ¤   OSStatus¤   ¤   err¤= noErr;
5367c5 ¤
50d380 ¤   pgpAssert( IsNull( mTreeRoot ) );
0967c5 ¤
334079 ¤   err¤= FSpGetCatInfo( &mRootSpec, &cpb );
dea8cc ¤   mIsFolder¤  = cpbIsFolder( &cpb );
cc5ecc ¤   if ( IsntErr( err ) )
1ac7a1 ¤   {
18a58b ¤   ¤   CProcessingItem *¤  item;
121b52 ¤   ¤
ff9946 ¤   ¤   if ( cpbIsFile( &cpb ) )
485b34 ¤   ¤   {
455878 ¤   ¤   ¤   err¤= NewFileItem( NULL, &mRootSpec, &cpb, &item );
e20fe4 ¤   ¤   }
dc0e1d ¤   ¤   else
2c5b34 ¤   ¤   {
3add5e ¤   ¤   ¤   err¤= NewFolderItem( NULL, &mRootSpec, &item );
390fe4 ¤   ¤   }
393555 ¤   ¤   mTreeRoot¤  = item;
ea9371 ¤   }
3567c5 ¤
cceb41 ¤   if ( IsntErr( err ) && mIsFolder )
27c7a1 ¤   {
41c019 ¤   ¤   err¤= BuildDownFromItem( mTreeRoot );
ec9371 ¤   }
0c67c5 ¤
34deb7 ¤   return( err );
f4efe6 }
31af5a
09af5a
9485ea ¤   OSStatus
a545f1 CPGPtoolsProcessingList::BuildSourceTree( const FSSpec *srcRoot )
42bb36 {
2879f7 ¤   OSStatus¤   ¤   err¤= noErr;
c567c5 ¤
59efc2 ¤   mRootSpec¤  = *srcRoot;
e5af5a
f7a4a2 ¤   err¤= BuildTree();
c967c5 ¤
b38c1a ¤   pgpAssertNoErr( err );
3bdeb7 ¤   return( err );
e3efe6 }
7baf5a
c3af5a
36af5a
6b85ea ¤   OSStatus
b1aabe CPGPtoolsProcessingList::CreateFolderHierarchy( CProcessingItem *parent )
88bb36 {
b36ead ¤   OSStatus¤   ¤   ¤   err¤= noErr;
a0c452 ¤   CProcessingItem *¤  cur;
8e67c5 ¤
676527 ¤   cur¤= parent->children;
93f700 ¤   while ( IsntNull( cur ) )
2dc7a1 ¤   {
f7bf36 ¤   ¤   if ( cur->isFolder )
7d5b34 ¤   ¤   {
cda61c ¤   ¤   ¤   FSSpec¤ newSpec;
f487c7 ¤   ¤   ¤
09093b ¤   ¤   ¤   newSpec.vRefNum¤= mDestSpec.vRefNum;
45124e ¤   ¤   ¤   newSpec.parID¤  = parent->destDirID;
225c29 ¤   ¤   ¤   CopyPString( cur->srcSpec.name, newSpec.name );
45410c ¤   ¤   ¤   err¤= FSpDirCreate( &newSpec, smSystemScript, &cur->destDirID );
4b3c6b ¤   ¤   ¤   if ( IsntPGPError( err ) )
43f776 ¤   ¤   ¤   {
--ffa4 000657aef9b401200fc Page 5 of CPGPtoolsProcessingList.cp
33c4c5 ¤   ¤   ¤   ¤   err¤= CreateFolderHierarchy( cur );
f6a3a6 ¤   ¤   ¤   }
9c21aa ¤   ¤   ¤   if ( IsErr( err ) )
acf622 ¤   ¤   ¤   ¤   break;
a30fe4 ¤   ¤   }
c11b52 ¤   ¤
9335af ¤   ¤   cur¤= cur->next;
529371 ¤   }
2667c5 ¤
44deb7 ¤   return( err );
5cefe6 }
92af5a
68af5a
e685ea ¤   OSStatus
ff0a07 CPGPtoolsProcessingList::CreateDestTree( const FSSpec *destSpec )
cbbb36 {
d375f8 ¤   OSStatus¤   err¤= noErr;
1367c5 ¤
f4ae4b ¤   pgpAssert( IsntNull( mTreeRoot ) );
1167c5 ¤
081f17 ¤   mDestSpec¤  = *destSpec;
090fcf ¤   if ( FSpEqual( destSpec, &mTreeRoot->srcSpec ) )
bdc7a1 ¤   {
0d4953 ¤   ¤   pgpDebugMsg( "source and dest may not be the same" );
2091d2 ¤   ¤   return( paramErr );
b49371 ¤   }
9c67c5 ¤
c027c8 ¤   if ( mIsFolder )
b0c7a1 ¤   {
730239 ¤   ¤   /* create the destination root, which may have a different name */
eeea8a ¤   ¤   err¤= FSpDirCreate( destSpec, smSystemScript, &mTreeRoot->destDirID );
c77d98 ¤   ¤   if ( IsntPGPError( err ) )
795b34 ¤   ¤   {
02c7d2 ¤   ¤   ¤   err¤= CreateFolderHierarchy( mTreeRoot );
b40fe4 ¤   ¤   }
779371 ¤   }
3767c5 ¤
cc8c1a ¤   pgpAssertNoErr( err );
dbdeb7 ¤   return( err );
7aefe6 }
80af5a
19af5a
49cd56 ¤   UInt32
67f937 CPGPtoolsProcessingList::GetNumFiles( void )
44bb36 {
ddae4b ¤   pgpAssert( IsntNull( mTreeRoot ) );
9767c5 ¤
ffaed1 ¤   return( mTreeRoot->fileCount );
99efe6 }
eaaf5a
970335 /*____________________________________________________________________________
3e69c3 ¤   Flatten all files in the tree into an array of pointers to items in the
979779 ¤   tree.
3967c5 ¤
e3e481 ¤   Each invocation returns a pointer to the next available list item.
bef7f7 ____________________________________________________________________________*/
6afad2 ¤   CPGPtoolsProcessingList::CProcessingItem **
b0502c CPGPtoolsProcessingList::FlattenFiles(
e94a1a ¤   CProcessingItem *¤  item,
7d56da ¤   CProcessingItem **¤ list )
3fbb36 {
4d3508 ¤   if ( item->isFolder )
acc7a1 ¤   {
fc7f04 ¤   ¤   CProcessingItem *¤  cur;
5867c5 ¤
06a4dc ¤   ¤   cur¤= item->children;
c5c008 ¤   ¤   while ( IsntNull( cur ) )
cc5b34 ¤   ¤   {
a6d3d7 ¤   ¤   ¤   list¤   = FlattenFiles( cur, list);
2101f2 ¤   ¤   ¤   cur¤= cur->next;
9b0fe4 ¤   ¤   }
659371 ¤   }
--692e 000e771d93f401200fc Page 6 of CPGPtoolsProcessingList.cp
060e24 ¤   else
c2c7a1 ¤   {
ba9769 ¤   ¤   *list++¤= item;
df9371 ¤   }
0d3b95 ¤   return( list );
93efe6 }
84af5a
96af5a
9085ea ¤   OSStatus
592aaa CPGPtoolsProcessingList::PrepareForIteration( void )
38bb36 {
cf75f8 ¤   OSStatus¤   err¤= noErr;
9467c5 ¤
f1ae4b ¤   pgpAssert( IsntNull( mTreeRoot ) );
36ee6a ¤   if ( IsNull( mIterList ) )
3cc7a1 ¤   {
be6adf ¤   ¤   err¤= AllocateSpace( sizeof( mIterList[ 0 ] ) * GetNumFiles(),
5c5946 ¤   ¤   ¤   ¤   ¤   &mIterList);
6fd798 ¤   ¤   if ( IsntErr( err ) )
af5b34 ¤   ¤   {
1764e8 ¤   ¤   ¤   CProcessingItem **¤ doneList;
c687c7 ¤   ¤   ¤
430a3c ¤   ¤   ¤   doneList¤   = FlattenFiles( mTreeRoot, mIterList );
70e3bf ¤   ¤   ¤   pgpAssert( mIterList + GetNumFiles() == doneList );
6c0fe4 ¤   ¤   }
a89371 ¤   }
9267c5 ¤
acdeb7 ¤   return( err );
69efe6 }
1daf5a
90af5a
496d52 ¤   void
201296 CPGPtoolsProcessingList::GetIndFile(
a1de42 ¤   UInt32¤ ¤   ¤   ¤   index,
b79248 ¤   ProcessingInfo *¤   info )
98bb36 {
469283 ¤   CProcessingItem *¤  item;
cc67c5 ¤
52a533 ¤   pgpAssert( index < GetNumFiles() );
1d414d ¤   pgpAssert( IsntNull( mIterList ) );
95dbc2 ¤   MacDebug_FillWithGarbage( info, sizeof( *info ) );
3b67c5 ¤
116912 ¤   item¤   = mIterList[ index ];
507082 ¤   pgpAssert( ! item->isFolder );
ad67c5 ¤
4ef84f ¤   info->srcSpec¤  ¤   = item->srcSpec;
02c00c ¤   info->destVRefNum¤  = mDestSpec.vRefNum;
5e127b ¤   if ( item == mTreeRoot )
84be47 ¤   ¤   info->destParID¤¤   = mDestSpec.parID;
c00e24 ¤   else
1f322b ¤   ¤   info->destParID¤¤   = item->parent->destDirID;
f867c5 ¤
a37cf7 ¤   info->resSize¤  = item->resSize;
07a487 ¤   info->dataSize¤ = item->dataSize;
98b5bc ¤   info->fInfo¤¤   = item->fInfo;
d6efe6 }
01af5a
f2af5a
748b7e CPGPtoolsProcessingList::CPGPtoolsProcessingList( ·)
d2bb36 {
0e1e83 ¤   mTreeRoot¤  = NULL;
e2e1c3 ¤   mIsFolder¤  = FALSE;
d02368 ¤   mIterList¤  = NULL;
b0a0ae ¤   MacDebug_FillWithGarbage( &mRootSpec, sizeof( mRootSpec ) );
0e8005 ¤   MacDebug_FillWithGarbage( &mDestSpec, sizeof( mDestSpec ) );
5befe6 }
7baf5a
daaf5a
aa59df CPGPtoolsProcessingList::~CPGPtoolsProcessingList( void )
58bb36 {
ce2726 ¤   if ( IsntNull( mIterList ) )
e79295 ¤   ¤   FreeSpace( mIterList );
--efad 001c9011c1b401200fc Page 7 of CPGPtoolsProcessingList.cp
f11b52 ¤   ¤
4f4947 ¤   DeleteTree();
ebefe6 }
f5af5a
35af5a
b4af5a
27af5a
837e4d /*__Editor_settings____
9daf5a
4f4126 ¤   Local Variables:
aa7b17 ¤   tab-width: 4
6d0e6c ¤   End:
cc5f8c ¤   vi: ts=4 sw=4
509e9b ¤   vim: si
29d062 _____________________*/
51af5a
0daf5a
c9af5a
--a897 000e70556f8401200fd Page 1 of CPGPtoolsProcessingList.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
b7efb8 ¤   $Id: CPGPtoolsProcessingList.h,v 1.2.18.1 1998/11/12 03:09:13 heller Exp $
27f7f7 ____________________________________________________________________________*/
d3c888 #ifndef Included_CPGPtoolsProcessingList_h¤ /* [ */
689c69 #define Included_CPGPtoolsProcessingList_h
7baf5a
3baf5a
a5b0f8 #include <LArray.h>
f9af5a
b8af5a
9c2a5f typedef struct ProcessingInfo
06bb36 {
2acc1f ¤   FSSpec¤ srcSpec;
d803bc ¤   short¤  destVRefNum;
1e1186 ¤   long¤   destParID;
a867c5 ¤
67a292 ¤   UInt32¤ resSize;
756a71 ¤   UInt32¤ dataSize;
b139e0 ¤   FInfo¤  fInfo;
c66da7 } ProcessingInfo;
60af5a
0faf5a
2a058e class CPGPtoolsProcessingList
97bb36 {
170fb9 private:
138e6a ¤   struct CProcessingItem
61c7a1 ¤   {
1efa41 ¤   ¤   CProcessingItem *¤  parent;
76dcf4 ¤   ¤   CProcessingItem *¤  children;
2057fb ¤   ¤   CProcessingItem *¤  next;
462b5a ¤   ¤   PGPUInt32¤  ¤   ¤   fileCount;
e2da42 ¤   ¤   Boolean¤¤   ¤   ¤   isFolder;
a31b52 ¤   ¤
874642 ¤   ¤   FSSpec¤ ¤   ¤   srcSpec;
487c0a ¤   ¤   long¤   ¤   ¤   destDirID;¤ /* dir ID of this item itself (if folder) */
281b52 ¤   ¤
c9d3d0 ¤   ¤   UInt32¤ ¤   ¤   resSize;
e20b16 ¤   ¤   UInt32¤ ¤   ¤   dataSize;
d7d7a1 ¤   ¤   FInfo¤  ¤   ¤   fInfo;
8162bd ¤   };
8ea4fa ¤   /* a tree structure representing a directory */
57eb0f ¤   typedef struct CProcessingItem¤ ·CProcessingItem;
10af5a
59af5a
2fe266 ¤   CProcessingItem *¤  mTreeRoot;
87dd16 ¤   Boolean¤¤   ¤   ¤   mIsFolder;
5767c5 ¤
08960f ¤   FSSpec¤ ¤   ¤   ¤   mRootSpec;
dd28a5 ¤   FSSpec¤ ¤   ¤   ¤   mDestSpec;
fe67c5 ¤
0db255 ¤   /* pointer to array of CProcessingItem */
efb0b1 ¤   CProcessingItem **¤ mIterList;
9c67c5 ¤
3bf568 ¤   void¤   ¤   DeleteSubTree( CProcessingItem *item );
3c53ad ¤   void¤   ¤   DeleteTree( void );
34bbb7 ¤   OSStatus¤   AllocateSpace( PGPSize size, void **mem );
05c459 ¤   OSStatus¤   FreeSpace( void *mem );
a167c5 ¤
9c4346 ¤   OSStatus¤   NewItem( CProcessingItem *parent,
b20946 ¤   ¤   ¤   ¤   ¤   FSSpec const *srcSpec, CProcessingItem **item );
0339c3 ¤   OSStatus¤   NewFolderItem( CProcessingItem *parent,
c30946 ¤   ¤   ¤   ¤   ¤   FSSpec const *srcSpec, CProcessingItem **item );
fced25 ¤   OSStatus¤   NewFileItem( CProcessingItem *parent,
5830ae ¤   ¤   ¤   ¤   ¤   FSSpec const *srcSpec, CInfoPBRec const *cpb,
384dbd ¤   ¤   ¤   ¤   ¤   CProcessingItem **item );
b167c5 ¤
e74494 ¤   OSStatus¤   BuildDownFromItem( CProcessingItem *item );
--b396 001bc1529b5401200fd Page 2 of CPGPtoolsProcessingList.h
d27a21 ¤   OSStatus¤   BuildTree( void );
1567c5 ¤
64b0cc ¤   OSStatus¤   CreateFolderHierarchy( CProcessingItem *item );
9a67c5 ¤
a5afa1 ¤   /* qualifier needed due to compiler bug */
915306 ¤   CProcessingItem **
729e48 ¤   ¤   ¤   ¤   FlattenFiles( CProcessingItem *item, CProcessingItem ** list );
7767c5 ¤
265ed4 public:
3267c5 ¤
5bd573 ¤   OSStatus¤   PrepareForIteration( void );
13b123 ¤   UInt32¤ ¤   GetNumFiles( void );
afe003 ¤   void¤   ¤   GetIndFile( UInt32 index, ProcessingInfo *info );
7367c5 ¤
841f0a ¤   OSStatus¤   BuildSourceTree( const FSSpec *srcRoot );
8f8dfc ¤   OSStatus¤   CreateDestTree( const FSSpec *destSpec );
1a67c5 ¤
069a06 ¤   CPGPtoolsProcessingList( void );
91b293 ¤   ~CPGPtoolsProcessingList( void );
b267c5 ¤
c167c5 ¤
6882f7 };
36af5a
61af5a
8a4bf6 #endif /* ] Included_CPGPtoolsProcessingList_h */
c0af5a
d3af5a
e07e4d /*__Editor_settings____
4baf5a
904126 ¤   Local Variables:
4c7b17 ¤   tab-width: 4
2d0e6c ¤   End:
cc5f8c ¤   vi: ts=4 sw=4
ed9e9b ¤   vim: si
bcd062 _____________________*/
--f173 0009c15ad60401200fe Page 1 of CPGPtoolsTask.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
6b917c ¤   $Id: CPGPtoolsTask.cp,v 1.22.8.1 1998/11/12 03:09:14 heller Exp $
34f7f7 ____________________________________________________________________________*/
6daf5a
4c4d37 #include <LowMem.h>
8684be #include <Sound.h>
bdaf5a
a2dd56 #include <PP_Messages.h>
71afac #include <UModalDialogs.h>
6daf5a
0659c5 #include "CPGPStDialogHandler.h"
999dc2 #include "CWarningAlert.h"
45090b #include "MacEvents.h"
5385c2 #include "MacStrings.h"
f5bbf4 #include "MacFiles.h"
b976b7 #include "MacErrors.h"
fdaf5a
e7133f #include "PGPtoolsResources.h"
852aad #include "PGPtoolsUtils.h"
5baf5a
7057a2 #include "CPGPtoolsTask.h"
8249e1 #include "CPGPtoolsTaskProgressDialog.h"
0baf5a
dc3c9f CPGPtoolsTask::CPGPtoolsTask(PGPtoolsOperation operation)
40bb36 {
d0b767 ¤   mOperation ¤¤   ¤   = operation;
7edf65 ¤   mTaskModifiers¤ ¤   = GetModifiers();
9aefe6 }
e7af5a
f4b2f1 CPGPtoolsTask::~CPGPtoolsTask(void)
9dbb36 {
c3efe6 }
08af5a
562208 // Default error reporting behavior
e0c248 // errorStrIndex contains the formatting string for
6f3bb6 // the operation
92af5a
526d52 ¤   void
240169 CPGPtoolsTask::BuildErrorMessage(
161d3a ¤   CToolsError ¤   err,
19904c ¤   short ¤ ¤   errorStrIndex,
102e86 ¤   StringPtr¤  msg)
43bb36 {
c36df2 ¤   Str255¤ errorStr;
82af5a
fb1705 ¤   GetIndString( msg, kErrorStringListResID, errorStrIndex );
61839c ¤   GetErrorString( err, errorStr );
826ba6 ¤   PrintPString( msg, msg, errorStr );
90efe6 }
53af5a
72fe51 ¤   WarningAlertType
78e63c CPGPtoolsTask::GetAlertTypeForError(CToolsError err)
f2bb36 {
9e7e7f ¤   WarningAlertType¤   alertType;
be67c5 ¤
8f47a0 ¤   (void)err;
4f909c ¤   alertType = kWAStopAlertType;
0b67c5 ¤
6e24d1 ¤   return( alertType );
61efe6 }
9daf5a
0dfbb0 ¤   CToolsError
40ffef CPGPtoolsTask::ReportError(
231d3a ¤   CToolsError ¤   err,
eb2959 ¤   short ¤ ¤   ¤   errorStrIndex)
5ebb36 {
9c0890 ¤   Str255¤ ¤   ¤   ¤   msg;
--dc93 001003c6b63401200fe Page 2 of CPGPtoolsTask.cp
ba7e7f ¤   WarningAlertType¤   alertType;
0267c5 ¤
f8fede ¤   BuildErrorMessage( err, errorStrIndex, msg );
b567c5 ¤
21720a ¤   alertType = GetAlertTypeForError( err );
1267c5 ¤
823fe4 ¤   SysBeep( 1 );
90a54f ¤   CWarningAlert::Display( alertType, kWAOKStyle, msg );
d567c5 ¤
0d2de2 ¤   err.err ¤   = noErr;
ea4ea7 ¤   err.pgpErr ¤= kPGPError_UserAbort;
3d67c5 ¤
8edeb7 ¤   return( err );
c7efe6 }
7eaf5a
1585ea ¤   OSStatus
d4c899 CPGPtoolsTask::DoProgress(
27f507 ¤   CPGPtoolsTaskProgressDialog *¤  progress,
8c9eb0 ¤   UInt32¤ ¤   ¤   ¤   ¤   ¤   ¤   bytesProcessed,
a17120 ¤   UInt32¤ ¤   ¤   ¤   ¤   ¤   ¤   totalBytesToProcess )
05bb36 {
3181cf ¤   OSStatus¤   ¤   ¤   ¤   ¤   status = noErr;
601b21 ¤   static UInt32¤  ¤   ¤   ¤   sLastEventTicks;
c3af5a
e828d2 ¤   pgpAssertAddrValid( progress, VoidAlign );
10d0d5 ¤   (void)totalBytesToProcess;
d767c5 ¤
987d7a ¤   progress->SetTaskCompletedBytes( bytesProcessed );
9ff879 ¤   progress->SetCompletedOperations( bytesProcessed +
06dfeb ¤   ¤   ¤   ¤   progress->GetTotalCompletedBytes() );
6967c5 ¤
327e41 ¤   #define kYieldTicks¤¤   6
fe95aa ¤   if( LMGetTicks() - sLastEventTicks > kYieldTicks )
24c7a1 ¤   {
a1965a ¤   ¤   CPGPStDialogHandler ¤   ¤   *progressDialogHandler;
9b1b52 ¤   ¤
036ec1 ¤   ¤   progressDialogHandler = progress->GetDialogHandler();
20af5a
fc2816 ¤   ¤   if( IsntNull( progressDialogHandler ) )
fc5b34 ¤   ¤   {
9c73c2 ¤   ¤   ¤   if( progressDialogHandler->DoDialog() == msg_Cancel )
36f776 ¤   ¤   ¤   {
7d755c ¤   ¤   ¤   ¤   status = userCanceledErr;
00a3a6 ¤   ¤   ¤   }
050fe4 ¤   ¤   }
47af5a
476529 ¤   ¤   sLastEventTicks = LMGetTicks();
3c9371 ¤   }
0f67c5 ¤
5a4afd ¤   return( status );
3cefe6 }
00af5a
--5637 0010b5a8ef9401200ff Page 1 of CPGPtoolsTask.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
1b9a58 ¤   $Id: CPGPtoolsTask.h,v 1.17.18.1 1998/11/12 03:09:14 heller Exp $
c8f7f7 ____________________________________________________________________________*/
5f7b7d #pragma once
b0af5a
35fdf0 #include "WarningAlertTypes.h"
0caf5a
353a6b #include "PGPtools.h"
3ba4d3 #include "CResultsTable.h"
90af5a
ca1db2 class CPGPtoolsTaskProgressDialog;
0baf5a
eaaf5a
a10fa5 class CPGPtoolsTask
24c45d {¤  ¤
420fb9 private:
f495c7 ¤   ushort¤ ¤   ¤   ¤   ¤   mTaskModifiers;
bd67c5 ¤
53da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
46a2d3 protected:
e2fe4f ¤   PGPtoolsOperation¤  ¤   mOperation;
d567c5 ¤
682de0 ¤   ¤   ¤   ¤   ¤   CPGPtoolsTask(PGPtoolsOperation operation);
bcaf5a
22faab ¤   virtual¤void¤   BuildErrorMessage(CToolsError status, short errorStrIndex,
a8f0b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringPtr msg);
20c0a9 ¤   virtual¤WarningAlertType¤   GetAlertTypeForError(CToolsError err);
f248cd ¤   virtual¤CToolsError¤¤   ReportError(CToolsError err, short errorStrIndex);
d067c5 ¤
b5e6c5 ¤   virtual¤void¤   ¤   GetTaskItemName(StringPtr name) = 0;
dc67c5 ¤
e3585e ¤   virtual OSStatus¤   DoProgress( ·CPGPtoolsTaskProgressDialog *progress,
585fa8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 ·bytesProcessed,
720f7b ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 totalToProcess);
915ed4 public:
4eaf5a
9ecc3a ¤   virtual¤¤   ¤   ~CPGPtoolsTask(void);
ba67c5 ¤
e04b16 ¤   virtual¤OSStatus¤   CalcProgressBytes(PGPContextRef context,
7ba630 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ByteCount *bytes) = 0;
ce67c5 ¤
610c54 ¤   ushort¤ ¤   ¤   ¤   GetTaskModifiers(void)¤ ¤   ¤   ¤
05d827 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( mTaskModifiers ); };
19564b ¤   void¤   ¤   ¤   ¤   SetTaskModifiers(ushort modifiers)
dcf54a ¤   ¤   ¤   ¤   ¤   ¤   ¤   { mTaskModifiers = modifiers; };
1b82f7 };
efaf5a
81af5a
0baf5a
--37ac 000e319bae940120100 Page 1 of CPGPtoolsTaskList.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
49da03 ¤   $Id: CPGPtoolsTaskList.cp,v 1.81.2.2.2.1 1998/11/12 03:09:15 heller Exp $
cff7f7 ____________________________________________________________________________*/
e0af5a
9a84be #include <Sound.h>
82324c #include <string.h>
b4af5a
36a85e #include <LArrayIterator.h>
2cdd56 #include <PP_Messages.h>
0add06 #include <UDesktop.h>
16afac #include <UModalDialogs.h>
ebaf5a
ace8b2 #include "pflPrefs.h"
284720 #include "pflPrefTypes.h"
693991 #include "pgpAdminPrefs.h"
4fc97b #include "pgpClientPrefs.h"
d7a02f #include "pgpClientLib.h"
1a0d08 #include "pgpMem.h"
ad10f0 #include "pgpOpenPrefs.h"
63e684 #include "pgpUserInterface.h"
1e4919 #include "pgpUtilities.h"
f68e25 #include "pgpVersionHeader.h"
6dd73a #include "CSecureMemory.h"
ef3eab #include "CWrappers.h"
df9dc2 #include "CWarningAlert.h"
14af5a
9d1e0f #include "MacInternet.h"
ca85c2 #include "MacStrings.h"
63af5a
2459c5 #include "CPGPStDialogHandler.h"
abaf5a
803192 #include "CPGPtools.h"
80daf9 #include "CPGPtoolsPassphraseList.h"
96be50 #include "CPGPtoolsTaskList.h"
10c756 #include "CPGPtoolsFileTask.h"
326a51 #include "CPGPtoolsCryptoTask.h"
2d5c3c #include "CPGPtoolsWipeTask.h"
2149e1 #include "CPGPtoolsTaskProgressDialog.h"
206d1f #include "CResultsWindow.h"
fe133f #include "PGPtoolsResources.h"
f02aad #include "PGPtoolsUtils.h"
4caf5a
c9af5a
d00f66 ¤   static PGPLocalEncodingFlags
bec8e5 PGPUISettingsToLocalEncoding( PGPUISettings¤settings )
62bb36 {
cc2a90 ¤   PGPLocalEncodingFlags¤  encodingFlags = kPGPLocalEncoding_None;
5667c5 ¤
59981e ¤   if( ( settings & kPGPUISettingsSmartMacBinary ) != 0 )
42c7a1 ¤   {
4cc961 ¤   ¤   encodingFlags = kPGPLocalEncoding_Auto;
9d9371 ¤   }
496d79 ¤   else if( ( settings & kPGPUISettingsForceMacBinary ) != 0 )
f4c7a1 ¤   {
3be194 ¤   ¤   encodingFlags = kPGPLocalEncoding_Force;
5e9371 ¤   }
9f67c5 ¤
a34b8e ¤   return( encodingFlags );
8fefe6 }
4faf5a
cbaf5a
400f2d CPGPtoolsTaskList::CPGPtoolsTaskList(
d9d4d4 ¤   PGPtoolsOperation¤  operation)
9abb36 {
f0847b ¤   /* setup default prefs */
21bf8d ¤   pgpClearMemory( &mPrefs, sizeof( mPrefs ) );
1567c5 ¤
1f42c2 ¤   mPrefs.warnOnWipe¤  ¤   = TRUE;
e395c8 ¤   mPrefs.comment[ 0 ]¤¤   = 0;
--71ec 00052e36f8240120100 Page 2 of CPGPtoolsTaskList.cp
b8a298 ¤   mPrefs.convAlgorithm¤   = kPGPCipherAlgorithm_None;
c8e0f8 ¤   mTaskListHasFileTasks¤  = FALSE;
74ed4a ¤   mOperation ¤¤   ¤   ¤   = operation;
6567c5 ¤
d3fed4 ¤   mTaskList = new TArray<CPGPtoolsTask *>;
5856ec ¤   pgpAssertAddrValid( mTaskList, VoidAlign );
e6efe6 }
0daf5a
27128a CPGPtoolsTaskList::~CPGPtoolsTaskList(void)
24bb36 {
865f8f ¤   if( IsntNull( mTaskList ) )
38c7a1 ¤   {
e9162d ¤   ¤   DeleteTasks();
6faf5a
6633b8 ¤   ¤   delete( mTaskList );
a7f79e ¤   ¤   mTaskList = nil;
ea9371 ¤   }
7767c5 ¤
7fb1c9 ¤   if( IsntNull( mPrefs.allowedAlgorithms ) )
dcc7a1 ¤   {
1e946d ¤   ¤   (void) pgpFree( mPrefs.allowedAlgorithms );
1c9371 ¤   }
daefe6 }
9daf5a
efcd56 ¤   UInt32
b9eaa2 CPGPtoolsTaskList::GetCount(void)
4abb36 {
86c512 ¤   if ( IsntNull( mTaskList ) )
00c7a1 ¤   {
2e6c2d ¤   ¤   return( mTaskList->GetCount() );
959371 ¤   }
110e24 ¤   else
07c7a1 ¤   {
acabea ¤   ¤   return( 0 );
569371 ¤   }
97efe6 }
e2af5a
206d52 ¤   void
cb62ec CPGPtoolsTaskList::DeleteTasks(void)
86bb36 {
29c512 ¤   if ( IsntNull( mTaskList ) )
57c7a1 ¤   {
0d6fca ¤   ¤   LArrayIterator¤ iterator( *mTaskList );
bc52f2 ¤   ¤   CPGPtoolsTask¤  *task;
ffaf5a
4817b2 ¤   ¤   while( iterator.Next( &task ) )
db5b34 ¤   ¤   {
cd7afb ¤   ¤   ¤   delete( task );
b60fe4 ¤   ¤   }
f89371 ¤   }
d6efe6 }
e567c5 ¤
a76d52 ¤   void
bfb274 CPGPtoolsTaskList::AppendTask(CPGPtoolsTask *theTask)
2cbb36 {
6ca256 ¤   pgpAssertAddrValid( theTask, VoidAlign );
7767c5 ¤
c95f8f ¤   if( IsntNull( mTaskList ) )
dcc7a1 ¤   {
e721a6 ¤   ¤   mTaskList->InsertItemsAt( 1, LArray::index_Last, theTask );
8e9371 ¤   }
baefe6 }
abaf5a
22fbb0 ¤   CToolsError
793df0 CPGPtoolsTaskList::SetupEncryptionOptions(
b49a06 ¤   PGPContextRef¤  ¤   ¤   context,
56445f ¤   PGPKeySetRef¤   ¤   ¤   recipients,
0335ba ¤   PGPRecipientSettings¤   settings,
af7070 ¤   PGPRecipientOptions¤¤   options,
6b3afe ¤   PGPOptionListRef¤   ¤   encodeOptions)
b0bb36 {
527c3e ¤   CToolsError¤err;
--e28b 000fd6ca64340120100 Page 3 of CPGPtoolsTaskList.cp
5f436e ¤   Boolean¤¤   haveFileOptions;
d567c5 ¤
0fa2f5 ¤   haveFileOptions¤= ( options & kPGPRecipientOptionsHideFileOptions ) == 0;
d694aa ¤   ¤   ¤   ¤   ¤   ¤
94d774 ¤   // Check for conventional encryption first.
3267c5 ¤
23756b ¤   if( ( settings & kPGPRecipientSettingsConvEncrypt ) != 0 )
81c7a1 ¤   {
bfb9a9 ¤   ¤   char¤   *passphrase = NULL;
f53049 ¤   ¤   char¤   prompt[256];
851b52 ¤   ¤
3a5c82 ¤   ¤   GetIndCString( prompt, kDialogStringsListResID,
4ed0f1 ¤   ¤   ¤   ¤   kConventionalPassphrasePromptStrIndex );
b82b85 ¤   ¤   ¤   ¤
235677 ¤   ¤   UDesktop::Deactivate();
583db6 ¤   ¤   err.pgpErr = PGPConventionalEncryptionPassphraseDialog( context,
623905 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt( context, prompt ),
b90709 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( context, &passphrase ),
98fc28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
96d170 ¤   ¤   UDesktop::Activate();
771b52 ¤   ¤
9d5a9f ¤   ¤   if( err.IsntError() )
445b34 ¤   ¤   {
d48ce0 ¤   ¤   ¤   err.pgpErr = PGPAppendOptionList( encodeOptions,
5d7c34 ¤   ¤   ¤   ¤   ¤   ¤   PGPOConventionalEncrypt( context,
7725b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( context, passphrase ),
1f24b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) ),
4a97e4 ¤   ¤   ¤   ¤   ¤   ¤   mPrefs.convAlgorithm != kPGPCipherAlgorithm_None ?
a5501b ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOCipherAlgorithm( context,
24f59e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPrefs.convAlgorithm) :
6e5138 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( context ),
7f931b ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
240fe4 ¤   ¤   }
0c1b52 ¤   ¤
041711 ¤   ¤   if( IsntNull( passphrase ) )
d78095 ¤   ¤   ¤   PGPFreeData( passphrase );
109371 ¤   }
d90e24 ¤   else
bfc7a1 ¤   {
23610a ¤   ¤   PGPUInt32¤  numKeys¤= 0;
34af5a
4edaed ¤   ¤   // Verify that there is at least one recipient
ae1b52 ¤   ¤
ea9b4c ¤   ¤   err.pgpErr¤ = PGPCountKeys( recipients, &numKeys );
e7a194 ¤   ¤   if( err.IsntError( ) && numKeys == 0 )
9c5b34 ¤   ¤   {
aa1c19 ¤   ¤   ¤   err.pgpErr = kPGPError_UserAbort;
930fe4 ¤   ¤   }
1b0e1d ¤   ¤   else
b05b34 ¤   ¤   {
d58ce0 ¤   ¤   ¤   err.pgpErr = PGPAppendOptionList( encodeOptions,
3f224f ¤   ¤   ¤   ¤   ¤   PGPOEncryptToKeySet( context, recipients ),
7dc000 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
090fe4 ¤   ¤   }
c19371 ¤   }
a3af5a
a67961 ¤   // Setup preferred algorithms
818ee0 ¤   if( err.IsntError() && IsntNull( mPrefs.allowedAlgorithms ) )
52c7a1 ¤   {
e9aa55 ¤   ¤   err.pgpErr = PGPAppendOptionList( encodeOptions,
406141 ¤   ¤   ¤   ¤   ¤   ¤   PGPOPreferredAlgorithms( context,
a415ca ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPrefs.allowedAlgorithms,
606f54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPrefs.numAllowedAlgorithms ),
c0931b ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
db9371 ¤   }
4067c5 ¤
ffdeb7 ¤   return( err );
89efe6 }
2baf5a
25fbb0 ¤   CToolsError
d978f5 CPGPtoolsTaskList::SetupSigningOptions(
fd883c ¤   PGPContextRef¤  ¤   ¤   ¤   context,
--9d06 0001c372e5340120100 Page 4 of CPGPtoolsTaskList.cp
84525c ¤   PGPGetPassphraseSettings¤   settings,
cab054 ¤   PGPGetPassphraseOptions¤¤   options,
c7a5c4 ¤   PGPOptionListRef¤   ¤   ¤   encodeOptions)
48bb36 {
8b67c5 ¤
c37c3e ¤   CToolsError¤err;
9e67c5 ¤
596d02 ¤   (void) context;
93f062 ¤   (void) settings;
5ba480 ¤   (void) options;
d4ff3b ¤   (void) encodeOptions;
e467c5 ¤
81deb7 ¤   return( err );
66efe6 }
87af5a
e8fbb0 ¤   CToolsError
d276b5 CPGPtoolsTaskList::SetupCommonOptions(
a1a1bc ¤   PGPContextRef¤  ¤   context,
728cee ¤   PGPOptionListRef¤   encodeOptions)
eabb36 {
1ed7c9 ¤   CToolsError¤¤   err;
57af5a
b0d3cb ¤   if( err.IsntError() )
d6c7a1 ¤   {
12aa55 ¤   ¤   err.pgpErr = PGPAppendOptionList( encodeOptions,
c42bfb ¤   ¤   ¤   ¤   ¤   PGPOVersionString( context, pgpVersionHeaderString ),
3164f9 ¤   ¤   ¤   ¤   ¤   PGPOCommentString( context, mPrefs.comment ),
86c000 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( context ) );
b59371 ¤   }
d267c5 ¤
43deb7 ¤   return( err );
6fefe6 }
5baf5a
01af5a
c00335 /*____________________________________________________________________________
4d2b6d ¤   Return TRUE if at least one of the recipients has a corresponding private
bf474b ¤   key.
1bf7f7 ____________________________________________________________________________*/
0a7e69 ¤   Boolean
2dcc17 CPGPtoolsTaskList::RecipientsIncludeSelf(
7b69f6 ¤   PGPKeySetRef¤   recipients)
a5bb36 {
0afb19 ¤   PGPError¤   ¤   err;
0a7c9c ¤   Boolean¤¤   ¤   havePrivateKey¤ = FALSE;
407e52 ¤   PGPKeyListRef¤  keyListRef;
a067c5 ¤
7430c3 ¤   err = PGPOrderKeySet( recipients, kPGPAnyOrdering, &keyListRef );
80b1f0 ¤   if( IsntPGPError( err ) )
80c7a1 ¤   {
8220b4 ¤   ¤   PGPKeyIterRef¤  keyIterator;
e267c5 ¤
8f07aa ¤   ¤   err = PGPNewKeyIter( keyListRef, &keyIterator );
ec1b52 ¤   ¤
d686f8 ¤   ¤   if( IsntPGPError( err ) )
5a5b34 ¤   ¤   {
c63754 ¤   ¤   ¤   PGPKeyRef¤  theKey;
e787c7 ¤   ¤   ¤
6da048 ¤   ¤   ¤   err = PGPKeyIterNext( keyIterator, &theKey );
bfba17 ¤   ¤   ¤   while( IsntErr( err ) )
61f776 ¤   ¤   ¤   {
59aaf3 ¤   ¤   ¤   ¤   PGPBoolean¤ isSecret;
fc2b85 ¤   ¤   ¤   ¤
8e90d8 ¤   ¤   ¤   ¤   err¤= PGPGetKeyBoolean( theKey,
b966e8 ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropIsSecret, &isSecret );
bc869d ¤   ¤   ¤   ¤   if ( IsPGPError( err ) )
2214c3 ¤   ¤   ¤   ¤   ¤   break;
20ed43 ¤   ¤   ¤   ¤   if ( isSecret )
fd72c3 ¤   ¤   ¤   ¤   {
88fc12 ¤   ¤   ¤   ¤   ¤   havePrivateKey¤ = TRUE;
1014c3 ¤   ¤   ¤   ¤   ¤   break;
c02613 ¤   ¤   ¤   ¤   }
1cae30 ¤   ¤   ¤   ¤   ¤
--e005 0000ddc858040120100 Page 5 of CPGPtoolsTaskList.cp
894248 ¤   ¤   ¤   ¤   err = PGPKeyIterNext( keyIterator, &theKey );
cba3a6 ¤   ¤   ¤   }
f46ae1 ¤   ¤   ¤   if( err == kPGPError_EndOfIteration )
92bd37 ¤   ¤   ¤   ¤   err = kPGPError_NoErr;
d62b85 ¤   ¤   ¤   ¤
a63433 ¤   ¤   ¤   PGPFreeKeyIter( keyIterator );
a10fe4 ¤   ¤   }
351b52 ¤   ¤
90779b ¤   ¤   PGPFreeKeyList( keyListRef );
5e9371 ¤   }
8267c5 ¤
88639a ¤   return( havePrivateKey );
feefe6 }
d6af5a
6aaf5a
81fbb0 ¤   CToolsError
e3944a CPGPtoolsTaskList::ConfirmationDialogs(
b338e2 ¤   CEncodeParams const *¤  params )
2dbb36 {
3c7c3e ¤   CToolsError¤err;
fb67c5 ¤
39011a ¤   if ( ! mTaskListHasFileTasks )
ece55e ¤   ¤   return( err );
9a1b52 ¤   ¤
1bed80 ¤   if ( err.IsntError() )
ebc7a1 ¤   {
0f86b6 ¤   ¤   Boolean¤¤   macBinaryIsOff¤ =
7cebd8 ¤   ¤   ¤   ( params->encodingFlags & kPGPLocalEncoding_Force ) == 0;
981b52 ¤   ¤
e0acda ¤   ¤   if ( macBinaryIsOff && ! params->detachedSignature )
4f5b34 ¤   ¤   {
935b49 ¤   ¤   ¤   err.pgpErr¤ = ConfirmMacBinary( );
f40fe4 ¤   ¤   }
409371 ¤   }
5467c5 ¤
69bc29 ¤   if ( mPrefs.warnOnWipe )
71c7a1 ¤   {
c5f9a8 ¤   ¤   if ( err.IsntError() )
015b34 ¤   ¤   {
0a88bf ¤   ¤   ¤   if ( params->wipeOriginal )
2df776 ¤   ¤   ¤   {
0de776 ¤   ¤   ¤   ¤   err.pgpErr = ConfirmWipe( params->encrypting,
422c43 ¤   ¤   ¤   ¤   ¤   ¤   params->signing );
a9a3a6 ¤   ¤   ¤   }
c20fe4 ¤   ¤   }
7e1b52 ¤   ¤
8df9a8 ¤   ¤   if ( err.IsntError() )
915b34 ¤   ¤   {
d40fdf ¤   ¤   ¤   if ( (! params->encryptingToSelf) &&
f9594b ¤   ¤   ¤   ¤   ¤   params->wipeOriginal &&
2f92c9 ¤   ¤   ¤   ¤   ¤   (! params->conventionalEncrypt) )
adf776 ¤   ¤   ¤   {
53c4e3 ¤   ¤   ¤   ¤   err.pgpErr¤ = ConfirmNotEncryptingToSelf();
d2a3a6 ¤   ¤   ¤   }
6a0fe4 ¤   ¤   }
da9371 ¤   }
8767c5 ¤
95deb7 ¤   return( err );
fbefe6 }
4baf5a
f7af5a
936d52 ¤   void
6af73a CPGPtoolsTaskList::ProcessEncryptSignTasks(
3e883c ¤   PGPContextRef¤  ¤   ¤   ¤   context,
ef3e13 ¤   PGPtlsContextRef¤   ¤   ¤   tlsContext,
5fe3aa ¤   PGPKeySetRef¤   ¤   ¤   ¤   *allKeys,¤  ¤   /* I/O Parameter */
065c47 ¤   CPGPtoolsTaskProgressDialog¤*progressDialogObj)
44bb36 {
a0a14a ¤   PGPKeySetRef¤   ¤   ¤   ¤   recipients¤ = kInvalidPGPKeySetRef;
47eae3 ¤   CToolsError¤¤   ¤   ¤   ¤   err;
080437 ¤   PGPRecipientSettings¤   ¤   recipientSettings;
0d83f3 ¤   PGPRecipientOptions¤¤   ¤   recipientOptions;
--c1ad 0002ddd04db40120100 Page 6 of CPGPtoolsTaskList.cp
e0a2d9 ¤   PGPGetPassphraseSettings¤   getPassphraseSettings;
a87f60 ¤   PGPGetPassphraseOptions¤¤   getPassphraseOptions;
83884b ¤   CEncodeParams¤  ¤   ¤   ¤   state;
a610ad ¤   Boolean¤¤   ¤   ¤   ¤   ¤   haveEncodingFlags¤  = FALSE;
e667c5 ¤
ea92ff ¤   pgpAssert( ¤mOperation == kPGPtoolsEncryptOperation ||
aa30ca ¤   ¤   ¤   ¤   mOperation == kPGPtoolsSignOperation ||
f2caac ¤   ¤   ¤   ¤   mOperation == kPGPtoolsEncryptSignOperation );
3c67c5 ¤
777d5e ¤   recipientOptions ¤  ¤   = kPGPRecipientOptionsDefault;
b4b8b5 ¤   getPassphraseOptions¤   = kPGPGetPassphraseOptionsDefault;
862c1e ¤   getPassphraseSettings¤  = 0;
6567c5 ¤
2393ec ¤   if( ! mTaskListHasFileTasks )
92c7a1 ¤   {
ca6014 ¤   ¤   recipientOptions ¤  ¤   |= kPGPRecipientOptionsHideFileOptions;
6a4dc0 ¤   ¤   recipientOptions¤   ¤   |= kPGPRecipientOptionsShowFYEO;
0a7a2f ¤   ¤   getPassphraseOptions¤   |= kPGPGetPassphraseOptionsHideFileOptions;
2c9371 ¤   }
1713fa ¤   else if( ( mTaskList->GetCount() == 1 ) )
96c7a1 ¤   {
c4c1a6 ¤   ¤   CPGPtoolsFileTask¤  *task;
fba615 ¤   ¤   Boolean¤¤   ¤   ¤   canFYEO;
8f1b52 ¤   ¤
11fb1a ¤   ¤   mTaskList->FetchItemAt( 1, task );
076a9f ¤   ¤   err.err = task->CanUseFYEO( &canFYEO );
836970 ¤   ¤   if( err.IsntError() && canFYEO )
fd5b34 ¤   ¤   {
2a273b ¤   ¤   ¤   recipientOptions |= kPGPRecipientOptionsShowFYEO;
d80fe4 ¤   ¤   }
379371 ¤   }
ba67c5 ¤
afed80 ¤   if ( err.IsntError() )
c4c7a1 ¤   {
cf466c ¤   ¤   pgpClearMemory( &state, sizeof( state ) );
371b52 ¤   ¤
e78948 ¤   ¤   state.progressDialog¤   = progressDialogObj;
be6733 ¤   ¤   state.allKeys¤  ¤   ¤   = *allKeys;
a3a5f9 ¤   ¤   state.encrypting¤   ¤   = ( mOperation == kPGPtoolsEncryptOperation ||
e6fc99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mOperation == kPGPtoolsEncryptSignOperation¶
0754c8 ·);
16098f ¤   ¤   state.signing¤  ¤   ¤   = ( mOperation == kPGPtoolsSignOperation ||
83fc99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mOperation == kPGPtoolsEncryptSignOperation¶
3254c8 ·);
9e6ac2 ¤   ¤   state.encodingFlags¤¤   = kPGPLocalEncoding_Force;
adaf5a
56c1d1 ¤   ¤   err.pgpErr = PGPNewOptionList( context, &state.encodeOptions);
349371 ¤   }
8467c5 ¤
24ed80 ¤   if ( err.IsntError() )
89c7a1 ¤   {
f70e8e ¤   ¤   if( state.encrypting)
cc5b34 ¤   ¤   {
53a185 ¤   ¤   ¤   PGPKeySetRef¤   newKeys;
7787c7 ¤   ¤   ¤
4c2c07 ¤   ¤   ¤   // Hide the passphrase file options if we're encrypting
f1a6fb ¤   ¤   ¤   getPassphraseOptions |= kPGPGetPassphraseOptionsHideFileOptions;
88af5a
2dee6c ¤   ¤   ¤   // Show the PGPRecipientDialog
35dd8b ¤   ¤   ¤   UDesktop::Deactivate();
60682c ¤   ¤   ¤   ¤   err.pgpErr = PGPClientRecipientDialog( context, tlsContext,
0120b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   *allKeys, 0, nil, recipientOptions,
2fe117 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPRecipientSettingsDefault,
7d8d49 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &recipientSettings, &recipients, &newKeys );
10e678 ¤   ¤   ¤   UDesktop::Activate();
3f87c7 ¤   ¤   ¤
a05e89 ¤   ¤   ¤   if( err.IsntError() && PGPKeySetRefIsValid( newKeys ) )
89f776 ¤   ¤   ¤   {
75f9e0 ¤   ¤   ¤   ¤   PGPKeySetRef¤   importSet;
c41d31 ¤   ¤   ¤   ¤   char¤   ¤   ¤   prompt[256];
c82b85 ¤   ¤   ¤   ¤
2d17c9 ¤   ¤   ¤   ¤   GetIndCString( prompt, kDialogStringsListResID,
--e3ee 00027dc3c6040120100 Page 7 of CPGPtoolsTaskList.cp
f9eee9 ¤   ¤   ¤   ¤   ¤   ¤   kSelectiveImportFoundKeysPromptStrIndex );
812b85 ¤   ¤   ¤   ¤
cf4c15 ¤   ¤   ¤   ¤   err.pgpErr = PGPSelectKeysDialog( context,
1ef50a ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation,
b30d07 ¤   ¤   ¤   ¤   ¤   ¤   prompt, newKeys, *allKeys, &importSet );
6e82e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
2272c3 ¤   ¤   ¤   ¤   {
f16e15 ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( *allKeys );
0389a7 ¤   ¤   ¤   ¤   ¤   *allKeys = kInvalidPGPKeySetRef;
72ae30 ¤   ¤   ¤   ¤   ¤
d7b1f3 ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPSharedAddKeysToDefaultKeyring(
6e85cf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   importSet );
a3be0a ¤   ¤   ¤   ¤   ¤   if( err.IsntError() )
324859 ¤   ¤   ¤   ¤   ¤   {
820aca ¤   ¤   ¤   ¤   ¤   ¤   err.pgpErr = PGPOpenDefaultKeyRings( context,
9529c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0, allKeys );
0994aa ¤   ¤   ¤   ¤   ¤   ¤
4ad2c7 ¤   ¤   ¤   ¤   ¤   ¤   state.allKeys = *allKeys;
8c1c89 ¤   ¤   ¤   ¤   ¤   }
f6ae30 ¤   ¤   ¤   ¤   ¤
e86372 ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( importSet );
ff2613 ¤   ¤   ¤   ¤   }
013cef ¤   ¤   ¤   ¤   else if( err.pgpErr == kPGPError_UserAbort )
8d72c3 ¤   ¤   ¤   ¤   {
2d10de ¤   ¤   ¤   ¤   ¤   err.pgpErr = kPGPError_NoErr;
be2613 ¤   ¤   ¤   ¤   }
b72b85 ¤   ¤   ¤   ¤
e44767 ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( newKeys );
dca3a6 ¤   ¤   ¤   }
8c87c7 ¤   ¤   ¤
6887c7 ¤   ¤   ¤
306d97 ¤   ¤   ¤   if( err.IsntError() )
faf776 ¤   ¤   ¤   {
c2c7a3 ¤   ¤   ¤   ¤   if ( ( ( recipientSettings & kPGPRecipientSettingsFYEO ) != 0 )
3cc3b7 ¤   ¤   ¤   ¤   && ( ( recipientSettings & kPGPUISettingsNoMacBinary ) == 0 )
aa9bed ¤   ¤   ¤   ¤   && ( ( recipientOptions & kPGPRecipientOptionsHideFileOptions )¶
1ba076 ·== 0 ) )
9272c3 ¤   ¤   ¤   ¤   {
8d7c97 ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
47ab01 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
5cd7ce ¤   ¤   ¤   ¤   ¤   ¤   kErrorStringListResID, kUnableToMixMacBinaryAndFYEO);
5f0161 ¤   ¤   ¤   ¤   ¤   err.pgpErr = kPGPError_IllegalFileOp;
752613 ¤   ¤   ¤   ¤   }
40a3a6 ¤   ¤   ¤   }
f887c7 ¤   ¤   ¤
a26d97 ¤   ¤   ¤   if( err.IsntError() )
dbf776 ¤   ¤   ¤   {
65b079 ¤   ¤   ¤   ¤   state.encodingFlags¤=
0707b2 ¤   ¤   ¤   ¤   ¤   PGPUISettingsToLocalEncoding( recipientSettings );
dbb98b ¤   ¤   ¤   ¤   haveEncodingFlags¤  = TRUE;
e12b85 ¤   ¤   ¤   ¤
226056 ¤   ¤   ¤   ¤   state.conventionalEncrypt = ( recipientSettings &
66149c ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPRecipientSettingsConvEncrypt ) != 0;
c8ae30 ¤   ¤   ¤   ¤   ¤
a96006 ¤   ¤   ¤   ¤   state.wipeOriginal¤ =
8a35cc ¤   ¤   ¤   ¤   (recipientSettings & kPGPRecipientSettingsWipeOriginal) != 0;
a82b85 ¤   ¤   ¤   ¤
2df76a ¤   ¤   ¤   ¤   state.fyeo = ( recipientSettings & kPGPRecipientSettingsFYEO ) ¶
cadd43 != 0;
e3ae30 ¤   ¤   ¤   ¤   ¤
9b4d2b ¤   ¤   ¤   ¤   err = SetupEncryptionOptions( context, recipients,
8bd4dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   recipientSettings, recipientOptions,
d91984 ¤   ¤   ¤   ¤   ¤   ¤   ¤   state.encodeOptions );
6ca3a6 ¤   ¤   ¤   }
6d87c7 ¤   ¤   ¤
f98fcf ¤   ¤   ¤   if ( err.IsntError() && ! state.conventionalEncrypt )
8ff776 ¤   ¤   ¤   {
f737f6 ¤   ¤   ¤   ¤   state.encryptingToSelf¤ = RecipientsIncludeSelf( recipients );
7ca3a6 ¤   ¤   ¤   }
590fe4 ¤   ¤   }
c69371 ¤   }
2767c5 ¤
--62cb 00046a6faea40120100 Page 8 of CPGPtoolsTaskList.cp
84f954 ¤   if( err.IsntError() && state.signing )
e8c7a1 ¤   {
aa3049 ¤   ¤   char¤   prompt[256];
1f1b52 ¤   ¤
105c82 ¤   ¤   GetIndCString( prompt, kDialogStringsListResID,
07be05 ¤   ¤   ¤   ¤   kSigningPassphrasePromptStrIndex );
00af5a
745677 ¤   ¤   UDesktop::Deactivate();
51bf93 ¤   ¤   ¤   err.pgpErr = PGPClientSigningPassphraseDialog( context,
052052 ¤   ¤   ¤   ¤   ¤   ¤   *allKeys, prompt,
cb94fc ¤   ¤   ¤   ¤   ¤   ¤   getPassphraseOptions,
4fe6b9 ¤   ¤   ¤   ¤   ¤   ¤   kPGPGetPassphraseSettingsDetachedSig,
2faec3 ¤   ¤   ¤   ¤   ¤   ¤   NULL,
b6242c ¤   ¤   ¤   ¤   ¤   ¤   state.signingPassphrase,
b35a37 ¤   ¤   ¤   ¤   ¤   ¤   &getPassphraseSettings,
e1f7b5 ¤   ¤   ¤   ¤   ¤   ¤   &state.signingKey );
e1d170 ¤   ¤   UDesktop::Activate();
411b52 ¤   ¤
3f0e51 ¤   ¤   if( err.pgpErr == kPGPError_KeyUnusableForSignature )
b15b34 ¤   ¤   {
ae7b38 ¤   ¤   ¤   // User has chosen split key. Show reconstitution dialog
c4dd8b ¤   ¤   ¤   UDesktop::Deactivate();
792fa8 ¤   ¤   ¤   err.pgpErr = PGPReconstitutionDialog( state.signingKey, *allKeys,
e0e9f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tlsContext, &state.signingPasskey,
d5f9bb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &state.signingPasskeySize);
d5e678 ¤   ¤   ¤   UDesktop::Activate();
da87c7 ¤   ¤   ¤
e4ef1a ¤   ¤   ¤   state.signingWithSplitKey = TRUE;
9f0fe4 ¤   ¤   }
701b52 ¤   ¤
485a9f ¤   ¤   if( err.IsntError() )
9c5b34 ¤   ¤   {
705cc7 ¤   ¤   ¤   if ( ! haveEncodingFlags )
6bf776 ¤   ¤   ¤   {
12b079 ¤   ¤   ¤   ¤   state.encodingFlags¤=
00ef56 ¤   ¤   ¤   ¤   ¤   PGPUISettingsToLocalEncoding( getPassphraseSettings );
a0b98b ¤   ¤   ¤   ¤   haveEncodingFlags¤  = TRUE;
1fa3a6 ¤   ¤   ¤   }
efae30 ¤   ¤   ¤   ¤   ¤
ea58de ¤   ¤   ¤   err = SetupSigningOptions( context, getPassphraseSettings,
98cf4a ¤   ¤   ¤   ¤   ¤   ¤   getPassphraseOptions, state.encodeOptions );
a20fe4 ¤   ¤   }
169371 ¤   }
bf67c5 ¤
bed3cb ¤   if( err.IsntError() )
d6c7a1 ¤   {
dda291 ¤   ¤   if( ( recipientSettings & kPGPUISettingsTextOutput ) != 0 ||
803e51 ¤   ¤   ¤   ( getPassphraseSettings & kPGPUISettingsTextOutput ) != 0 )
ab5b34 ¤   ¤   {
ee1517 ¤   ¤   ¤   state.textOutput = TRUE;
660fe4 ¤   ¤   }
661b52 ¤   ¤
1aa829 ¤   ¤   if( (getPassphraseSettings &
0c6d0d ¤   ¤   ¤   ¤   kPGPGetPassphraseSettingsDetachedSig ) != 0 )
dc5b34 ¤   ¤   {
506633 ¤   ¤   ¤   pgpAssert( state.signing );
4d6683 ¤   ¤   ¤   state.detachedSignature = TRUE;
c90fe4 ¤   ¤   }
6e1b52 ¤   ¤
4c059f ¤   ¤   err = SetupCommonOptions( context, state.encodeOptions );
899371 ¤   }
5f67c5 ¤
afed80 ¤   if ( err.IsntError() )
c7c7a1 ¤   {
288e7e ¤   ¤   err¤= ConfirmationDialogs( &state );
2c9371 ¤   }
0b67c5 ¤
d9d3cb ¤   if( err.IsntError() )
9ec7a1 ¤   {
b83678 ¤   ¤   UInt32¤ numTasks;
ed1b52 ¤   ¤
46a411 ¤   ¤   progressDialogObj->SetProgressOperation( mOperation );
--a544 0007e94c68040120100 Page 9 of CPGPtoolsTaskList.cp
e0af5a
2c7f37 ¤   ¤   numTasks = mTaskList->GetCount();
9b6069 ¤   ¤   for( UInt32 taskIndex = 1; taskIndex <= numTasks; taskIndex++ )
aa5b34 ¤   ¤   {
bda239 ¤   ¤   ¤   CPGPtoolsCryptoTask¤*task;
4d87c7 ¤   ¤   ¤
5b1cff ¤   ¤   ¤   mTaskList->FetchItemAt( taskIndex, task );
0daf5a
8247c0 ¤   ¤   ¤   err = task->EncryptSign( context, tlsContext, &state );
d7af5a
10e922 ¤   ¤   ¤   if( err.IsError() )
11f622 ¤   ¤   ¤   ¤   break;
2d0fe4 ¤   ¤   }
9b9371 ¤   }
d1af5a
1cab20 ¤   if( ShouldReportError( err ) )
4dc7a1 ¤   {
14aa47 ¤   ¤   Str255¤ errorStr;
981b52 ¤   ¤
118671 ¤   ¤   GetErrorString( err, errorStr );
001b52 ¤   ¤
7d057e ¤   ¤   SysBeep( 1 );
02148d ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
9ec329 ¤   ¤   ¤   kErrorStringListResID, kOperationCouldNotBeCompletedStrIndex,
926ccb ¤   ¤   ¤   errorStr );
1a9371 ¤   }
b41b52 ¤   ¤
cd63bf ¤   if( PGPKeySetRefIsValid( recipients ) )
62b659 ¤   ¤   PGPFreeKeySet( recipients );
78efe6 }
c9af5a
5a6d52 ¤   void
c2b796 CPGPtoolsTaskList::ProcessDecryptVerifyTasks(
4b883c ¤   PGPContextRef¤  ¤   ¤   ¤   context,
cf3e13 ¤   PGPtlsContextRef¤   ¤   ¤   tlsContext,
0ba639 ¤   PGPKeySetRef ¤  ¤   ¤   ¤   allKeys,
f05c47 ¤   CPGPtoolsTaskProgressDialog¤*progressDialogObj)
c4bb36 {
0feae3 ¤   CToolsError¤¤   ¤   ¤   ¤   err;
5bd3a8 ¤   UInt32¤ ¤   ¤   ¤   ¤   ¤   numTasks;
8c0a09 ¤   CDecodeParams¤  ¤   ¤   ¤   state;
8fa8b8 ¤   CPGPtoolsPassphraseList¤¤   passphraseList;
9167c5 ¤
776290 ¤   pgpAssert( mOperation == kPGPtoolsDecryptVerifyOperation );
aa67c5 ¤
9ee6ca ¤   CResultsWindow::NewSummary();
3167c5 ¤
2c81ed ¤   state.passphraseList ¤  = &passphraseList;
a2da53 ¤   state.progressDialog¤   = progressDialogObj;
c3f9ca ¤   state.allKeys¤  ¤   ¤   = allKeys;
1e67c5 ¤
7143d9 ¤   numTasks = mTaskList->GetCount();
3d2e1e ¤   for( UInt32 taskIndex = 1; taskIndex <= numTasks; taskIndex++ )
f2c7a1 ¤   {
6ee3ca ¤   ¤   CPGPtoolsCryptoTask¤*task;
431b52 ¤   ¤
8b0dd8 ¤   ¤   mTaskList->FetchItemAt( taskIndex, task );
ed1b52 ¤   ¤
2d09cb ¤   ¤   err = task->DecryptVerify( context, tlsContext, &state );
53af5a
842bb7 ¤   ¤   if( err.IsError( ) )
4dcdcb ¤   ¤   ¤   break;
4e9371 ¤   }
5a67c5 ¤
16ab20 ¤   if( ShouldReportError( err ) )
01c7a1 ¤   {
1aaa47 ¤   ¤   Str255¤ errorStr;
921b52 ¤   ¤
7b8671 ¤   ¤   GetErrorString( err, errorStr );
b31b52 ¤   ¤
9d057e ¤   ¤   SysBeep( 1 );
7e148d ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
--fca1 000802a418b40120100 Page 10 of CPGPtoolsTaskList.cp
bdc329 ¤   ¤   ¤   kErrorStringListResID, kOperationCouldNotBeCompletedStrIndex,
d26ccb ¤   ¤   ¤   errorStr );
619371 ¤   }
b4efe6 }
a8af5a
7d33c8 ¤   static void
487df3 GetConfirmWipeStrIndex(
f1dfbe ¤   Boolean¤¤   encrypting,
55a9fe ¤   Boolean¤¤   signing,
47714a ¤   Boolean¤¤   multipleFiles,
e23d37 ¤   StringPtr¤  str )
69bb36 {
5bb1d7 ¤   short¤  strIndex¤   = 0;
d267c5 ¤
32a41f ¤   if ( encrypting && signing )
59c7a1 ¤   {
5f85ce ¤   ¤   strIndex¤   = multipleFiles ?
beca13 ¤   ¤   ¤   kConfirmWipingItemsAfterEncryptingSigningStrIndex :
d25303 ¤   ¤   ¤   kConfirmWipingItemAfterEncryptingSigningStrIndex;
659371 ¤   }
38deb5 ¤   else if ( encrypting )
37c7a1 ¤   {
6b85ce ¤   ¤   strIndex¤   = multipleFiles ?
2062af ¤   ¤   ¤   kConfirmWipingItemsAfterEncryptingStrIndex :
715303 ¤   ¤   ¤   kConfirmWipingItemAfterEncryptingSigningStrIndex;
539371 ¤   }
163b17 ¤   else if ( signing )
bec7a1 ¤   {
2785ce ¤   ¤   strIndex¤   = multipleFiles ?
7071cd ¤   ¤   ¤   kConfirmWipingItemsAfterSigningStrIndex :
4489ec ¤   ¤   ¤   kConfirmWipingItemAfterSigningStrIndex;
fa9371 ¤   }
200e24 ¤   else
75c7a1 ¤   {
db85ce ¤   ¤   strIndex¤   = multipleFiles ?
96addb ¤   ¤   ¤   kConfirmWipingItemsStrIndex :
2eddf6 ¤   ¤   ¤   kConfirmWipingItemStrIndex;
479371 ¤   }
2567c5 ¤
b9e452 ¤   GetIndString( str, kDialogStringsListResID, strIndex );
f0efe6 }
fb67c5 ¤
010335 /*____________________________________________________________________________
8f2a48 ¤   The user has requested a wipe operation either directly via the wipe
b4dda0 ¤   command or indirectly by encrypting or signing.
18f7f7 ____________________________________________________________________________*/
41c744 ¤   PGPError
d75dc9 CPGPtoolsTaskList::ConfirmWipe(
c44aa3 ¤   Boolean¤encrypting,
339bac ¤   Boolean¤signing)
d2bb36 {
3826d5 ¤   PGPError¤   err¤= kPGPError_NoErr;
ae4863 ¤   MessageT¤   alertResult;
71109c ¤   Str255¤ ¤   str;
5e87c7 ¤   ¤   ¤
e865a0 ¤   if ( mTaskList->GetCount() > 1 )
f7c7a1 ¤   {
4c3215 ¤   ¤   GetConfirmWipeStrIndex( encrypting, signing, TRUE, str );
dc83bf ¤   ¤   alertResult¤= CWarningAlert::Display( kWACautionAlertType,
b565dc ¤   ¤   ¤   ¤   ¤   ¤   kWAOKCancelStyle, str );
3e9371 ¤   }
110e24 ¤   else
41c7a1 ¤   {
4cc45c ¤   ¤   CPGPtoolsWipeTask *¤task;
fa27ec ¤   ¤   Str255¤ ¤   ¤   ¤   itemName;
f11b52 ¤   ¤
d2fb1a ¤   ¤   mTaskList->FetchItemAt( 1, task );
899dd7 ¤   ¤   task->GetTaskItemName( itemName );
b41b52 ¤   ¤
5c1fb9 ¤   ¤   GetConfirmWipeStrIndex( encrypting, signing, FALSE, str );
551b52 ¤   ¤
8083bf ¤   ¤   alertResult¤= CWarningAlert::Display( kWACautionAlertType,
--320d 000c470e93b40120100 Page 11 of CPGPtoolsTaskList.cp
2f33dd ¤   ¤   ¤   ¤   ¤   ¤   kWAOKCancelStyle, str, itemName );
b59371 ¤   }
7967c5 ¤
892ab6 ¤   err¤= (alertResult == msg_Cancel) ? kPGPError_UserAbort : kPGPError_NoErr;
bc67c5 ¤
fedeb7 ¤   return( err );
c0efe6 }
7faf5a
01af5a
77c744 ¤   PGPError
1f48ce CPGPtoolsTaskList::ConfirmMacBinary( ·)
e3bb36 {
199372 ¤   PGPError¤   ¤   err¤= kPGPError_NoErr;
1b95b7 ¤   MessageT¤   ¤   alertResult;
ae67c5 ¤
0f0e43 ¤   alertResult¤= CWarningAlert::Display( kWACautionAlertType,
4d8f9d ¤   ¤   ¤   ¤   ¤   kWAOKCancelStyle,
c0d634 ¤   ¤   ¤   ¤   ¤   kDialogStringsListResID, kConfirmMacBinaryOffStrIndex );
a067c5 ¤
372ab6 ¤   err¤= (alertResult == msg_Cancel) ? kPGPError_UserAbort : kPGPError_NoErr;
4767c5 ¤
2ddeb7 ¤   return( err );
57efe6 }
31af5a
610335 /*____________________________________________________________________________
d69cca ¤   Confirm that the user doesn't want to encrypt to himself.
2b67c5 ¤
93a901 ¤   Should be called if the originals are being wiped.
68f7f7 ____________________________________________________________________________*/
83c744 ¤   PGPError
80f1ce CPGPtoolsTaskList::ConfirmNotEncryptingToSelf( ·)
e4bb36 {
549372 ¤   PGPError¤   ¤   err¤= kPGPError_NoErr;
ab95b7 ¤   MessageT¤   ¤   alertResult;
5767c5 ¤
356c6d ¤   alertResult¤= CWarningAlert::Display( kWACautionAlertType, kWAOKCancelStyle,
8371ec ¤   ¤   kDialogStringsListResID, kConfirmNotEncryptingToSelf );
5e67c5 ¤
482ab6 ¤   err¤= (alertResult == msg_Cancel) ? kPGPError_UserAbort : kPGPError_NoErr;
f867c5 ¤
1ddeb7 ¤   return( err );
cdefe6 }
b3af5a
74af5a
8d6d52 ¤   void
82f203 CPGPtoolsTaskList::ProcessWipeTasks(
09ca71 ¤   PGPContextRef ¤ ¤   ¤   ¤   context,
f45c47 ¤   CPGPtoolsTaskProgressDialog¤*progressDialogObj)
64bb36 {
52d7c9 ¤   CToolsError¤¤   err;
cc67c5 ¤
1be18b ¤   pgpAssert( mOperation == kPGPtoolsWipeOperation );
a967c5 ¤
7fc61a ¤   if( mPrefs.warnOnWipe )
685248 ¤   ¤   err.pgpErr¤ = ConfirmWipe( FALSE, FALSE );
62ed80 ¤   if ( err.IsntError() )
9cc7a1 ¤   {
229729 ¤   ¤   UInt32¤ numTasks¤   = 0;
161b52 ¤   ¤
a57f37 ¤   ¤   numTasks = mTaskList->GetCount();
ee6069 ¤   ¤   for( UInt32 taskIndex = 1; taskIndex <= numTasks; taskIndex++ )
f75b34 ¤   ¤   {
af5713 ¤   ¤   ¤   CPGPtoolsWipeTask¤  *task;
d587c7 ¤   ¤   ¤
781cff ¤   ¤   ¤   mTaskList->FetchItemAt( taskIndex, task );
cd87c7 ¤   ¤   ¤
807eee ¤   ¤   ¤   err = task->Wipe( context, progressDialogObj );
ccaf5a
5290e1 ¤   ¤   ¤   if( err.IsError( ) )
fcf622 ¤   ¤   ¤   ¤   break;
2c0fe4 ¤   ¤   }
c49371 ¤   }
--1ffe 000c1d6d46740120100 Page 12 of CPGPtoolsTaskList.cp
7aefe6 }
46af5a
8eaf5a
9b85ea ¤   OSStatus
153714 CPGPtoolsTaskList::CalcProgressBytes(
b6a1bc ¤   PGPContextRef¤  ¤   context,
79f894 ¤   ByteCount *¤¤   ¤   progressBytes)
75bb36 {
39101c ¤   UInt32¤ ¤   numTasks;
0975f8 ¤   OSStatus¤   err¤= noErr;
f167c5 ¤
a6eb6c ¤   *progressBytes¤ = 0;
d967c5 ¤
0143d9 ¤   numTasks = mTaskList->GetCount();
6e2e1e ¤   for( UInt32 taskIndex = 1; taskIndex <= numTasks; taskIndex++ )
d3c7a1 ¤   {
0252f2 ¤   ¤   CPGPtoolsTask¤  *task;
f71b52 ¤   ¤
0b0dd8 ¤   ¤   mTaskList->FetchItemAt( taskIndex, task );
3f0e30 ¤   ¤   if( IsntNull( task ) )
3c5b34 ¤   ¤   {
464bd8 ¤   ¤   ¤   ByteCount¤  count;
8787c7 ¤   ¤   ¤
b3e106 ¤   ¤   ¤   err¤= task->CalcProgressBytes( context, &count );
2221aa ¤   ¤   ¤   if ( IsErr( err ) )
04f622 ¤   ¤   ¤   ¤   break;
f22b85 ¤   ¤   ¤   ¤
52a5cb ¤   ¤   ¤   *progressBytes += count;
ff0fe4 ¤   ¤   }
8b9371 ¤   }
b067c5 ¤
31deb7 ¤   return( err );
e7efe6 }
46af5a
cac744 ¤   PGPError
7a8c77 CPGPtoolsTaskList::BeginTasks(
314b4e ¤   PGPContextRef ¤ context)
dabb36 {
756d02 ¤   (void) context;
c8af5a
b62d68 ¤   return( kPGPError_NoErr );
f6efe6 }
9aaf5a
8eaf5a
4a6d52 ¤   void
7a380a CPGPtoolsTaskList::LoadCurrentPrefs(PGPContextRef context)
03bb36 {
efae9e ¤   PGPPrefRef¤ ¤   prefRef;
21d7c9 ¤   CToolsError¤¤   err;
930df2 ¤   PGPMemoryMgrRef¤memMgrRef;
7f67c5 ¤
5c2176 ¤   memMgrRef = PGPGetContextMemoryMgr( context );
9567c5 ¤
3a914e ¤   // Get comment string, if any
0fe307 ¤   #if PGP_BUSINESS_SECURITY¤  // [
46625a ¤   if( IsntPGPError( PGPOpenAdminPrefs( memMgrRef, &prefRef ) ) )
d5c7a1 ¤   {
c59d65 ¤   ¤   // Comments are not always present. Don't check for errors.
bec71d ¤   ¤   (void) PGPGetPrefStringBuffer( prefRef, kPGPPrefComments,
89c46d ¤   ¤   ¤   ¤   sizeof( mPrefs.comment ), mPrefs.comment );
54af5a
ddb512 ¤   ¤   (void) PGPClosePrefFile( prefRef );
459371 ¤   }
54c812 #endif¤ // ] PGP_BUSINESS_SECURITY
10af5a
c2c6ac ¤   err.pgpErr = PGPOpenClientPrefs( memMgrRef, &prefRef );
e0d3cb ¤   if( err.IsntError() )
7ec7a1 ¤   {
49d4c0 ¤   ¤   if ( strlen( mPrefs.comment ) == 0 )
515b34 ¤   ¤   {
04d312 ¤   ¤   ¤   // Comments are not always present. Don't check for errors.
c18795 ¤   ¤   ¤   (void) PGPGetPrefStringBuffer( prefRef, kPGPPrefComment,
--2627 000f84b5d0d40120100 Page 13 of CPGPtoolsTaskList.cp
be0071 ¤   ¤   ¤   ¤   ¤   sizeof( mPrefs.comment ), mPrefs.comment );
bd0fe4 ¤   ¤   }
dc1b52 ¤   ¤
a5cc0c ¤   ¤   err.pgpErr¤ = PGPGetPrefBoolean( prefRef,
7fc27f ¤   ¤   ¤   kPGPPrefWarnOnWipe, &mPrefs.warnOnWipe );
0eaf5a
2b5a9f ¤   ¤   if( err.IsntError() )
cc5b34 ¤   ¤   {
892ac5 ¤   ¤   ¤   PGPUInt32¤  algorithm;
af87c7 ¤   ¤   ¤
e57067 ¤   ¤   ¤   err.pgpErr = PGPGetPrefNumber( prefRef,
b2aa89 ¤   ¤   ¤   ¤   ¤   ¤   ···kPGPPrefPreferredAlgorithm, &algorithm );
dfaf5a
cc9812 ¤   ¤   ¤   mPrefs.convAlgorithm = (PGPCipherAlgorithm) algorithm;
d60fe4 ¤   ¤   }
50af5a
845a9f ¤   ¤   if( err.IsntError() )
425b34 ¤   ¤   {
227d8f ¤   ¤   ¤   PGPSize ¤   prefSize;
1d572e ¤   ¤   ¤   void ¤  ¤   *prefData;
9087c7 ¤   ¤   ¤
331c31 ¤   ¤   ¤   if( IsntPGPError( PGPGetPrefData( prefRef,
7005c7 ¤   ¤   ¤   ¤   ¤   ¤   ···kPGPPrefAllowedAlgorithmsList,
99391e ¤   ¤   ¤   ¤   ¤   ¤   ···&prefSize, &prefData ) ) &&
93755f ¤   ¤   ¤   ¤   prefSize > 0 )
99f776 ¤   ¤   ¤   {
9ec726 ¤   ¤   ¤   ¤   mPrefs.allowedAlgorithms =
7b4d7f ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPCipherAlgorithm *) pgpAlloc( prefSize );
e97f67 ¤   ¤   ¤   ¤   if( IsntNull( mPrefs.allowedAlgorithms ) )
c672c3 ¤   ¤   ¤   ¤   {
3ae950 ¤   ¤   ¤   ¤   ¤   mPrefs.numAllowedAlgorithms = prefSize /
7530ac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( PGPCipherAlgorithm );
4fae30 ¤   ¤   ¤   ¤   ¤
d85fb6 ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( prefData, mPrefs.allowedAlgorithms,
d87d5e ¤   ¤   ¤   ¤   ¤   ¤   ¤   prefSize );
3a2613 ¤   ¤   ¤   ¤   }
ccfa07 ¤   ¤   ¤   ¤   else
6272c3 ¤   ¤   ¤   ¤   {
da8e64 ¤   ¤   ¤   ¤   ¤   err.pgpErr = kPGPError_OutOfMemory;
212613 ¤   ¤   ¤   ¤   }
a62b85 ¤   ¤   ¤   ¤
992e05 ¤   ¤   ¤   ¤   (void) PGPDisposePrefData( prefRef, prefData );
e6a3a6 ¤   ¤   ¤   }
ab0fe4 ¤   ¤   }
26af5a
0bb512 ¤   ¤   (void) PGPClosePrefFile( prefRef );
309371 ¤   }
c6efe6 }
0daf5a
16af5a
806d52 ¤   void
243450 CPGPtoolsTaskList::ProcessTasks(
5dba07 ¤   PGPContextRef ¤ ¤   context,
fe128d ¤   PGPtlsContextRef¤   tlsContext)
0bbb36 {
897c3e ¤   CToolsError¤err;
b2fd7f ¤   ByteCount¤  progressBytes;
9767c5 ¤
1dab95 ¤   // Note: Since the error messages are context sensitive,
9729fc ¤   // all errors are reported inside the respective task object.
ee67c5 ¤
f23fd7 ¤   if( IsNull( mTaskList ) || mTaskList->GetCount() == 0 )
1b99bf ¤   ¤   return;
b61b52 ¤   ¤
b43e1b ¤   CPGPStDialogHandler¤¤   ¤   dialogHandler( kProgressDialogResID, nil );
810e60 ¤   CPGPtoolsTaskProgressDialog¤*dialogObj;
1e67c5 ¤
6551bc ¤   LoadCurrentPrefs( context );
a267c5 ¤
650e8a ¤   dialogObj = (CPGPtoolsTaskProgressDialog *)
2aa081 ¤   ¤   ¤   ¤   dialogHandler.GetDialog();
f85df1 ¤   dialogObj->SetDialogHandler( &dialogHandler );
--11b3 0012e55f2f740120100 Page 14 of CPGPtoolsTaskList.cp
0b40ab ¤   dialogObj->SetProgressOperation( mOperation );
2c3ef6 ¤   err.err¤= CalcProgressBytes( context, &progressBytes);
12696d ¤   dialogObj->SetTotalOperations( progressBytes );
8867c5 ¤
9c16fd ¤   if ( err.IsntError( ) )
c9c7a1 ¤   {
722026 ¤   ¤   if ( mOperation != kPGPtoolsWipeOperation )
ca5b34 ¤   ¤   {
eadf66 ¤   ¤   ¤   PGPKeySetRef ¤  keySet;
4c87c7 ¤   ¤   ¤
9ca667 ¤   ¤   ¤   err.pgpErr = PGPOpenDefaultKeyRings( context, 0, &keySet );
1c6d97 ¤   ¤   ¤   if( err.IsntError() )
67f776 ¤   ¤   ¤   {
a693df ¤   ¤   ¤   ¤   err.err¤= BeginTasks( context );
9882e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
1a72c3 ¤   ¤   ¤   ¤   {
1bf99f ¤   ¤   ¤   ¤   ¤   switch( mOperation )
634859 ¤   ¤   ¤   ¤   ¤   {
d91438 ¤   ¤   ¤   ¤   ¤   ¤   case kPGPtoolsEncryptOperation:
9f433a ¤   ¤   ¤   ¤   ¤   ¤   case kPGPtoolsSignOperation:
bd3ccd ¤   ¤   ¤   ¤   ¤   ¤   case kPGPtoolsEncryptSignOperation:
e335d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ProcessEncryptSignTasks( context, tlsContext,
934716 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keySet, dialogObj );
228c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
85531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
6199de ¤   ¤   ¤   ¤   ¤   ¤   case kPGPtoolsDecryptVerifyOperation:
f048aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ProcessDecryptVerifyTasks( context, tlsContext,
0d59e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keySet, dialogObj );
508c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
60531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
19e5b2 ¤   ¤   ¤   ¤   ¤   ¤   default:
726a6a ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDebugMsg( "ProcessTasks(): Invalid operation" );
568c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
2f1c89 ¤   ¤   ¤   ¤   ¤   }
c52613 ¤   ¤   ¤   ¤   }
632b85 ¤   ¤   ¤   ¤
b4fea9 ¤   ¤   ¤   ¤   /* Could be NULL after calling ProcessEncryptSignTasks() */
67d871 ¤   ¤   ¤   ¤   if( PGPKeySetRefIsValid( keySet ) )
9d0527 ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( keySet );
03a3a6 ¤   ¤   ¤   }
5387c7 ¤   ¤   ¤
6bf4cc ¤   ¤   ¤   DeleteTasks();
1387c7 ¤   ¤   ¤
6988ee ¤   ¤   ¤   delete( mTaskList );
92517b ¤   ¤   ¤   mTaskList = NULL;
3b0fe4 ¤   ¤   }
e70e1d ¤   ¤   else
125b34 ¤   ¤   {
9f8578 ¤   ¤   ¤   ProcessWipeTasks( context, dialogObj );
f30fe4 ¤   ¤   }
989371 ¤   }
f667c5 ¤
57778f ¤   dialogObj->SetPercentComplete( 100 );
2b0fb9 ¤   dialogObj->Hide();
68efe6 }
b5af5a
8aaf5a
f4af5a
dbaf5a
b2af5a
3867c5 ¤
3aaf5a
f1af5a
e1af5a
2eaf5a
--55d6 000d19745a140120101 Page 1 of CPGPtoolsTaskList.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
9fbe78 ¤   $Id: CPGPtoolsTaskList.h,v 1.31.8.1 1998/11/12 03:09:16 heller Exp $
99f7f7 ____________________________________________________________________________*/
90af5a
e97b7d #pragma once
70af5a
8eb0f8 #include <LArray.h>
9cbf8d #include <LLink.h>
faaf5a
1a3a6b #include "PGPtools.h"
5de684 #include "pgpUserInterface.h"
279f63 #include "pgpEncode.h"
85a02f #include "pgpClientLib.h"
bbaf5a
6ef288 class CPGPtoolsTask;
651db2 class CPGPtoolsTaskProgressDialog;
99a075 class CEncodeParams;
f0af5a
720e3c #pragma warn_hidevirtual off
09248a template class TArray<CPGPtoolsTask *>;
ea465d #pragma warn_hidevirtual reset
36af5a
bc3fb7 class CPGPtoolsTaskList : public LLink
77bb36 {
5c5ed4 public:
b3e33e ¤   ¤   ¤   ¤   CPGPtoolsTaskList(
64d7cf ¤   ¤   ¤   ¤   ¤   PGPtoolsOperation operation );
879ce1 ¤   virtual¤¤   ~CPGPtoolsTaskList(void);
bb67c5 ¤
a603e0 ¤   void¤   ¤   AppendTask(CPGPtoolsTask *theTask);
fabb80 ¤   void¤   ¤   ProcessTasks(PGPContextRef context,
12fddf ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext);
d3ca1b ¤   UInt32¤ ¤   GetCount(void);
5683c5 ¤   void¤   ¤   SetTaskListHasFileTasks(Boolean hasFiles)
c1664c ¤   ¤   ¤   ¤   ¤   ¤   { mTaskListHasFileTasks = hasFiles; };
7767c5 ¤
e10fb9 private:
b4af5a
d44a89 ¤   struct
fbc7a1 ¤   {
2dfe87 ¤   ¤   PGPBoolean¤ ¤   ¤   warnOnWipe;
b3b969 ¤   ¤   PGPCipherAlgorithm¤ convAlgorithm;¤ ¤
6ee5e4 ¤   ¤   char¤   ¤   ¤   ¤   comment[ 256 ];
240c7d ¤   ¤   PGPCipherAlgorithm¤ *allowedAlgorithms;
414928 ¤   ¤   PGPUInt32¤  ¤   ¤   numAllowedAlgorithms;
771b52 ¤   ¤
e19044 ¤   } mPrefs;
bb67c5 ¤
405c59 ¤   void¤   ¤   LoadCurrentPrefs(PGPContextRef context);
6467c5 ¤
fcfe4f ¤   PGPtoolsOperation¤  ¤   mOperation;
5f520b ¤   TArray<CPGPtoolsTask *>¤*mTaskList;
2fc753 ¤   Boolean¤¤   ¤   ¤   ¤   mTaskListHasFileTasks;
3b67c5 ¤
9d49e1 ¤   CToolsError¤ConfirmationDialogs( CEncodeParams const *params );
3324f9 ¤   PGPError¤   ConfirmWipe( Boolean encrypting, Boolean signing );
bc8b82 ¤   PGPError¤   ConfirmMacBinary( void );
d3bd0e ¤   PGPError¤   ConfirmNotEncryptingToSelf( void );
5067c5 ¤
d641da ¤   Boolean¤¤   RecipientsIncludeSelf( PGPKeySetRef recipients );
e967c5 ¤
fa3c76 ¤   PGPError¤   BeginTasks(PGPContextRef context);
554b16 ¤   virtual¤OSStatus¤   CalcProgressBytes(PGPContextRef context,
ec32bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ByteCount *bytes);
ab3007 ¤   void¤   ¤   DeleteTasks(void);
c667c5 ¤
c381f5 ¤   void¤   ¤   ProcessDecryptVerifyTasks(PGPContextRef context,
fb23d1 ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext, PGPKeySetRef allKeys,
d186bb ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsTaskProgressDialog *progressDialogObj);
--f02e 001bd870ea440120101 Page 2 of CPGPtoolsTaskList.h
e694aa ¤   ¤   ¤   ¤   ¤   ¤
e15244 ¤   void¤   ¤   ProcessEncryptSignTasks(PGPContextRef context,
515ee2 ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
2965d0 ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef *allKeys,¤ /* I/O Parameter */
a986bb ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsTaskProgressDialog *progressDialogObj);
cc94aa ¤   ¤   ¤   ¤   ¤   ¤
597863 ¤   void¤   ¤   ProcessWipeTasks( PGPContextRef context,
0881cd ¤   ¤   ¤   ¤   ¤   CPGPtoolsTaskProgressDialog *progressDialogObj);
0eae30 ¤   ¤   ¤   ¤   ¤
b69f02 ¤   CToolsError¤SetupCommonOptions(PGPContextRef context,
17a545 ¤   ¤   ¤   ¤   ¤   ¤   PGPOptionListRef encodeOptions);
cd94aa ¤   ¤   ¤   ¤   ¤   ¤
a98c43 ¤   CToolsError¤SetupEncryptionOptions(PGPContextRef context,
f166da ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef allKeys,
8286b1 ¤   ¤   ¤   ¤   ¤   ¤   PGPRecipientSettings recipientSettings,
33f1ff ¤   ¤   ¤   ¤   ¤   ¤   PGPRecipientOptions recipientOptions,
48a545 ¤   ¤   ¤   ¤   ¤   ¤   PGPOptionListRef encodeOptions);
e794aa ¤   ¤   ¤   ¤   ¤   ¤
125472 ¤   CToolsError¤SetupSigningOptions(PGPContextRef context,
df5c93 ¤   ¤   ¤   ¤   ¤   ¤   PGPGetPassphraseSettings settings,
501118 ¤   ¤   ¤   ¤   ¤   ¤   PGPGetPassphraseOptions options,
aea545 ¤   ¤   ¤   ¤   ¤   ¤   PGPOptionListRef encodeOptions);
e067c5 ¤
1682f7 };
80af5a
49af5a
3aaf5a
bdaf5a
--3f80 000de482ace40120102 Page 1 of CPGPtoolsTaskProgressDialog.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
801dc8 ¤   $Id: CPGPtoolsTaskProgressDialog.cp,v 1.7.8.1 1998/11/12 03:09:17 heller Ex¶
3db277 p $
64f7f7 ____________________________________________________________________________*/
34af5a
0d85c2 #include "MacStrings.h"
15af5a
64133f #include "PGPtoolsResources.h"
e7af5a
2a49e1 #include "CPGPtoolsTaskProgressDialog.h"
43af5a
b381e5 CPGPtoolsTaskProgressDialog::CPGPtoolsTaskProgressDialog(LStream *inStream)
29b708 ¤   : CGAProgressDialog(inStream)
80bb36 {
036e7f ¤   mTotalCompletedBytes ¤  = 0;
142612 ¤   mTaskCompletedBytes¤¤   = 0;
8172bb ¤   mDialogHandler¤ ¤   ¤   = nil;
32e012 ¤   mShowDelayStartTicks¤   = 0;
2cefe6 }
f4af5a
aebbcd CPGPtoolsTaskProgressDialog::~CPGPtoolsTaskProgressDialog()
8fbb36 {
0defe6 }
fbaf5a
b16d52 ¤   void
aa151a CPGPtoolsTaskProgressDialog::SetProgressOperation(PGPtoolsOperation operation)
8abb36 {
fcdd6a ¤   ResID¤  windowTitleStrIndex = 0;
00a8ad ¤   ResID¤  formatStrIndex ¤¤   = 0;
164d75 ¤   Str255¤ windowTitle;
4e67c5 ¤
e68767 ¤   mProgressOperation = operation;
5667c5 ¤
e5b643 ¤   switch( operation )
c4c7a1 ¤   {
5e47e3 ¤   ¤   case kPGPtoolsEncryptOperation:
1da514 ¤   ¤   ¤   windowTitleStrIndex = kEncryptStrIndex;
e3a0e7 ¤   ¤   ¤   formatStrIndex¤ ¤   = kEncryptingProgressFormatStrIndex;
f1cdcb ¤   ¤   ¤   break;
34af5a
6e41e9 ¤   ¤   case kPGPtoolsSignOperation:
dcd91f ¤   ¤   ¤   windowTitleStrIndex = kSignStrIndex;
23da5b ¤   ¤   ¤   formatStrIndex¤ ¤   = kSigningProgressFormatStrIndex;
a0cdcb ¤   ¤   ¤   break;
ffaf5a
dd6827 ¤   ¤   case kPGPtoolsEncryptSignOperation:
6f160d ¤   ¤   ¤   windowTitleStrIndex = kEncryptSignStrIndex;
9ea0e7 ¤   ¤   ¤   formatStrIndex¤ ¤   = kEncryptingProgressFormatStrIndex;
3fcdcb ¤   ¤   ¤   break;
a9af5a
fa9996 ¤   ¤   case kPGPtoolsDecryptVerifyOperation:
bbbd1c ¤   ¤   ¤   windowTitleStrIndex = kDecryptVerifyStrIndex;
afb071 ¤   ¤   ¤   formatStrIndex¤ ¤   = kDecryptingVerifyingProgressFormatStrIndex;
2acdcb ¤   ¤   ¤   break;
e3af5a
8da6c1 ¤   ¤   case kPGPtoolsWipeOperation:
78ffff ¤   ¤   ¤   windowTitleStrIndex = kWipeStrIndex;
b466c3 ¤   ¤   ¤   formatStrIndex¤ ¤   = kWipingProgressFormatStrIndex;
0fcdcb ¤   ¤   ¤   break;
e4af5a
eb9ae3 ¤   ¤   default:
676732 ¤   ¤   ¤   pgpDebugMsg( "SetProgressOperation: Unknown operation" );
34cdcb ¤   ¤   ¤   break;
7a9371 ¤   }
5767c5 ¤
1b9814 ¤   GetIndString( windowTitle, kPGPtoolsMiscStringsResID,
c6859f ¤   ¤   ¤   ¤   windowTitleStrIndex );
0daff1 ¤   SetDescriptor( windowTitle );
de67c5 ¤
--5d57 001310fad0e40120102 Page 2 of CPGPtoolsTaskProgressDialog.cp
a4111e ¤   GetIndString( mItemNameFormatStr, kDialogStringsListResID,
dd56fc ¤   ¤   ¤   ¤   formatStrIndex );
cdefe6 }
73af5a
696d52 ¤   void
2bdd77 CPGPtoolsTaskProgressDialog::SetNewProgressItem(ConstStr255Param itemName)
e5bb36 {
b7e45b ¤   Str255¤ msg;
32af5a
258449 ¤   PrintPString( msg, mItemNameFormatStr, itemName );
dcd95f ¤   SetCaption( msg );
d99037 ¤   UpdatePort();
aa67c5 ¤
7767e4 ¤   mTotalCompletedBytes ¤  += mTaskCompletedBytes;
602612 ¤   mTaskCompletedBytes¤¤   = 0;
6defe6 }
3daf5a
af6d52 ¤   void
b4a652 CPGPtoolsTaskProgressDialog::SetCompletedOperations(UInt32 completedOps)
a0bb36 {
c55709 ¤   CGAProgressDialog::SetCompletedOperations( completedOps );
4267c5 ¤
ac2bc4 ¤   if( ! IsVisible() )
fbc7a1 ¤   {
a1ba61 ¤   ¤   Select();
d67a69 ¤   ¤   Show();
50aaad ¤   ¤   UpdatePort();
489371 ¤   }
31efe6 }
--0d4e 001d382fd1940120103 Page 1 of CPGPtoolsTaskProgressDialog.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
62ef11 ¤   $Id: CPGPtoolsTaskProgressDialog.h,v 1.3.8.1 1998/11/12 03:09:17 heller Exp¶
0fed4e ·$
0ff7f7 ____________________________________________________________________________*/
3daf5a
f27b7d #pragma once
18af5a
c23a6b #include "PGPtools.h"
dc69be #include "CGAProgressDialog.h"
0aaf5a
cd2c47 class CPGPStDialogHandler;
9faf5a
546e65 class CPGPtoolsTaskProgressDialog : public CGAProgressDialog
39bb36 {
505ed4 public:
aaaf5a
0907bd ¤   enum { class_ID = 'TskP' };
57af5a
51e85b ¤   virtual¤¤   ¤   ¤   ~CPGPtoolsTaskProgressDialog();
de49b4 ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsTaskProgressDialog(LStream *inStream);
74af5a
649846 ¤   UInt32¤ ¤   ¤   ¤   GetTotalCompletedBytes(void)
8979c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( mTotalCompletedBytes ); };
e728ac ¤   void¤   ¤   ¤   ¤   SetTotalCompletedBytes(UInt32 totalBytes)
1830ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { mTotalCompletedBytes = totalBytes; };
a2af5a
cf827d ¤   void¤   ¤   ¤   ¤   SetTaskCompletedBytes(UInt32 taskBytes)
38c75c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { mTaskCompletedBytes = taskBytes; };
a6af5a
40c5e2 ¤   CPGPStDialogHandler¤*GetDialogHandler(void)
f5f8ff ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( mDialogHandler ); };
35849f ¤   void¤   ¤   ¤   ¤   SetDialogHandler(CPGPStDialogHandler *handler)
3242e5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { mDialogHandler = handler; };
92af5a
faf2b9 ¤   void¤   ¤   ¤   ¤   SetProgressOperation(PGPtoolsOperation operation);
c9af5a
a3d037 ¤   void¤   ¤   ¤   ¤   SetNewProgressItem(ConstStr255Param itemName);
9ba771 ¤   virtual¤void¤   ¤   SetCompletedOperations(UInt32 completedOps);
8394aa ¤   ¤   ¤   ¤   ¤   ¤
0b0fb9 private:
eaaf5a
84de01 ¤   UInt32¤ ¤   ¤   ¤   mTaskCompletedBytes;
6d7a61 ¤   // Does not include mTaskCompletedBytes:
cca89c ¤   UInt32¤ ¤   ¤   ¤   mTotalCompletedBytes;
cd7f55 ¤   CPGPStDialogHandler¤*mDialogHandler;
850474 ¤   PGPtoolsOperation¤  mProgressOperation;
22dd88 ¤   Str255¤ ¤   ¤   ¤   mItemNameFormatStr;
2bb1e4 ¤   UInt32¤ ¤   ¤   ¤   mShowDelayStartTicks;
d3bf26 };¶
--3035 000885ab73840120104 Page 1 of CPGPtoolsTextTask.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
e6728e ¤   $Id: CPGPtoolsTextTask.cp,v 1.23.8.1 1998/11/12 03:09:18 heller Exp $
31f7f7 ____________________________________________________________________________*/
5eaf5a
0bdc1d #include <Scrap.h>
be84be #include <Sound.h>
21af5a
a5dd56 #include <PP_Messages.h>
bddd06 #include <UDesktop.h>
bdaf5a
ea9dc2 #include "CWarningAlert.h"
57c110 #include "pgpMacMemory.h"
0585c2 #include "MacStrings.h"
bdaf5a
9b3192 #include "CPGPtools.h"
f7e26d #include "CPGPtoolsTextTask.h"
ac49e1 #include "CPGPtoolsTaskProgressDialog.h"
ada29d #include "CPGPtoolsTextWindow.h"
f46d1f #include "CResultsWindow.h"
7ac01a #include "PGPtoolsEncryptDecrypt.h"
54133f #include "PGPtoolsResources.h"
e12aad #include "PGPtoolsUtils.h"
d5e684 #include "pgpUserInterface.h"
ec4919 #include "pgpUtilities.h"
d9f8d2 #include "PGPSharedEncryptDecrypt.h"
faaf5a
90fda6 const ResIDT¤   kSaveOrClipboardWAResID¤¤   = 10000;
e1af5a
cb619c CPGPtoolsTextTask::CPGPtoolsTextTask(PGPtoolsOperation operation) :
efee4f ¤   ¤   CPGPtoolsBufferTask( operation )
d8bb36 {
cadd8f ¤   mSourceFileName[0] = 0;
99efe6 }
6faf5a
98b2bc CPGPtoolsTextTask::~CPGPtoolsTextTask(void)
04bb36 {
7befe6 }
adaf5a
c9fbb0 ¤   CToolsError
4ac36e CPGPtoolsTextTask::EncryptSign(
11a1bc ¤   PGPContextRef¤  ¤   context,
a86c35 ¤   PGPtlsContextRef¤   tlsContext,
edcdc3 ¤   CEncodeParams¤  ¤   *state)
60bb36 {
697c3e ¤   CToolsError¤err;
0967c5 ¤
cb6f30 ¤   err = CPGPtoolsBufferTask::EncryptSign( context, tlsContext, state );
7f67c5 ¤
22ab20 ¤   if( ShouldReportError( err ) )
3ec7a1 ¤   {
32afaa ¤   ¤   err = ReportError( err,
039c15 ¤   ¤   ¤   state->encrypting ?
7fa212 ¤   ¤   ¤   ¤   kTextCannotBeEncryptedStrIndex : kTextCannotBeSignedStrIndex );
cb9371 ¤   }
5eaf5a
8bdeb7 ¤   return( err );
21efe6 }
f3af5a
bafbb0 ¤   CToolsError
e9fa55 CPGPtoolsTextTask::DecryptVerify(
3aa1bc ¤   PGPContextRef¤  ¤   context,
aa6c35 ¤   PGPtlsContextRef¤   tlsContext,
869a8c ¤   CDecodeParams¤  ¤   *state)
61bb36 {
6e7c3e ¤   CToolsError¤err;
1c67c5 ¤
595fbc ¤   err = CPGPtoolsBufferTask::DecryptVerify( context, tlsContext, state );
17af5a
88ab20 ¤   if( ShouldReportError( err ) )
--d8bd 000a9c368b740120104 Page 2 of CPGPtoolsTextTask.cp
f7c7a1 ¤   {
542b67 ¤   ¤   err = ReportError( err, kTextCannotBeDecryptedVerifiedStrIndex );
179371 ¤   }
641b52 ¤   ¤
d2deb7 ¤   return( err );
88efe6 }
57af5a
fb6d52 ¤   void
e94752 CPGPtoolsTextTask::GetDecryptPassphrasePromptString(StringPtr prompt)
5ebb36 {
64c0ce ¤   if( mSourceFileName[0] != 0 )
c2c7a1 ¤   {
246b8b ¤   ¤   GetIndString( prompt, kDialogStringsListResID,
9c6f40 ¤   ¤   ¤   ¤   ¤   kGetPassphraseForNamedTextPromptStrIndex );
ffdf52 ¤   ¤   PrintPString( prompt, prompt, mSourceFileName );
e49371 ¤   }
f70e24 ¤   else
2bc7a1 ¤   {
736b8b ¤   ¤   GetIndString( prompt, kDialogStringsListResID,
d5c21d ¤   ¤   ¤   ¤   kGetPassphraseForSelectedTextPromptStrIndex );
4c9371 ¤   }
77efe6 }
b9af5a
0efbb0 ¤   CToolsError
6135e1 CPGPtoolsTextTask::ProcessOutputData(void)
65bb36 {
937c3e ¤   CToolsError¤err;
3b6f83 ¤   Boolean¤¤   processData = TRUE;
9f67c5 ¤
891a8c ¤   if( mOperation == kPGPtoolsDecryptVerifyOperation &&
6b1511 ¤   ¤   mDataType == kPGPAnalyze_Unknown )
b6c7a1 ¤   {
2dd8bb ¤   ¤   processData = FALSE;
209371 ¤   }
9167c5 ¤
d919a7 ¤   if( processData )
dec7a1 ¤   {
9b6db2 ¤   ¤   if( mTextLength > max_Int16 )
965b34 ¤   ¤   {
b21640 ¤   ¤   ¤   MessageT¤   result;
5587c7 ¤   ¤   ¤
28c2cb ¤   ¤   ¤   SysBeep( 1 );
5187c7 ¤   ¤   ¤
0cdef5 ¤   ¤   ¤   result = CWarningAlert::Display( kWACautionAlertType,
9fb373 ¤   ¤   ¤   ¤   ¤   ¤   kWAOKCancelStyle,
12b515 ¤   ¤   ¤   ¤   ¤   ¤   kDialogStringsListResID,
6fbdd8 ¤   ¤   ¤   ¤   ¤   ¤   kTextLargerThan32KOptionsStrIndex );
f91efb ¤   ¤   ¤   if( result == msg_OK )
01f776 ¤   ¤   ¤   {
d3196d ¤   ¤   ¤   ¤   ZeroScrap();
41af5a
f79e60 ¤   ¤   ¤   ¤   PutScrap( mTextLength, 'TEXT', mText );
4fa3a6 ¤   ¤   ¤   }
a00fe4 ¤   ¤   }
58f66c ¤   ¤   else if( mTextLength > 0 )
da5b34 ¤   ¤   {
0ab3b8 ¤   ¤   ¤   CPGPtoolsTextWindow¤*textWindow;¤
9a87c7 ¤   ¤   ¤
89b362 ¤   ¤   ¤   textWindow = (CPGPtoolsTextWindow *) LWindow::
c183db ¤   ¤   ¤   ¤   ¤   ¤   CreateWindow( window_Text, gApplication );
a160df ¤   ¤   ¤   if( IsntNull( textWindow ) )
aaf776 ¤   ¤   ¤   {
b72a96 ¤   ¤   ¤   ¤   if( mSourceFileName[0] != 0 )
5672c3 ¤   ¤   ¤   ¤   {
c8269a ¤   ¤   ¤   ¤   ¤   textWindow->SetDescriptor( mSourceFileName );
d12613 ¤   ¤   ¤   ¤   }
3e2b85 ¤   ¤   ¤   ¤
2e7490 ¤   ¤   ¤   ¤   err.err = textWindow->SetText( mText, mTextLength );
f982e4 ¤   ¤   ¤   ¤   if( err.IsntError() )
3772c3 ¤   ¤   ¤   ¤   {
510c51 ¤   ¤   ¤   ¤   ¤   textWindow->Show();
a92613 ¤   ¤   ¤   ¤   }
--a279 0002c1a30ef40120104 Page 3 of CPGPtoolsTextTask.cp
67fa07 ¤   ¤   ¤   ¤   else
d172c3 ¤   ¤   ¤   ¤   {
b56588 ¤   ¤   ¤   ¤   ¤   delete( textWindow );
b72613 ¤   ¤   ¤   ¤   }
f5a3a6 ¤   ¤   ¤   }
4ebb8c ¤   ¤   ¤   else
93f776 ¤   ¤   ¤   {
2f1781 ¤   ¤   ¤   ¤   err.pgpErr¤ = kPGPError_OutOfMemory;
46a3a6 ¤   ¤   ¤   }
420fe4 ¤   ¤   }
669371 ¤   }
b167c5 ¤
dedeb7 ¤   return( err );
96efe6 }
28af5a
ec6d52 ¤   void
e3753e CPGPtoolsTextTask::BuildErrorMessage(
231d3a ¤   CToolsError ¤   err,
5857e1 ¤   short ¤ ¤   ¤   errorStrIndex,
c8c8bd ¤   StringPtr¤  ¤   msg)
b7bb36 {
256df2 ¤   Str255¤ errorStr;
88cbb6 ¤   Boolean¤addFileName = FALSE;
3267c5 ¤
25c0ce ¤   if( mSourceFileName[0] != 0 )
b8c7a1 ¤   {
4cd972 ¤   ¤   addFileName = TRUE;
ad1b52 ¤   ¤
82a17c ¤   ¤   switch( errorStrIndex )
4b5b34 ¤   ¤   {
2b2489 ¤   ¤   ¤   case kTextCannotBeEncryptedStrIndex:·
cabede ¤   ¤   ¤   ¤   errorStrIndex = kNamedTextCannotBeEncryptedStrIndex;
8ef622 ¤   ¤   ¤   ¤   break;
b5af5a
3aa80a ¤   ¤   ¤   case kTextCannotBeSignedStrIndex:·
83deb4 ¤   ¤   ¤   ¤   errorStrIndex = kNamedTextCannotBeSignedStrIndex;
abf622 ¤   ¤   ¤   ¤   break;
acaf5a
daca1b ¤   ¤   ¤   case kTextCannotBeDecryptedVerifiedStrIndex:·
928a14 ¤   ¤   ¤   ¤   errorStrIndex = kNamedTextCannotBeDecryptedVerifiedStrIndex;
25f622 ¤   ¤   ¤   ¤   break;
aeaf5a
f5db68 ¤   ¤   ¤   default:
ff744e ¤   ¤   ¤   ¤   pgpDebugMsg(
3cce2a ¤   ¤   ¤   ¤   "CPGPtoolsTextTask::BuildErrorMessage(): Unknown string");
4ce731 ¤   ¤   ¤   ¤   addFileName = FALSE;
54f622 ¤   ¤   ¤   ¤   break;
d00fe4 ¤   ¤   }
da9371 ¤   }
7667c5 ¤
531705 ¤   GetIndString( msg, kErrorStringListResID, errorStrIndex );
3c839c ¤   GetErrorString( err, errorStr );
5e67c5 ¤
c51ab7 ¤   if( addFileName )
28c7a1 ¤   {
6bf941 ¤   ¤   PrintPString( msg, msg, mSourceFileName );
d09371 ¤   }
de1b52 ¤   ¤
d26ba6 ¤   PrintPString( msg, msg, errorStr );
86efe6 }
3eaf5a
706d52 ¤   void
a7865c CPGPtoolsTextTask::SetSourceFileName(ConstStringPtr name)
a3bb36 {
c857e4 ¤   CopyPString( name, mSourceFileName );
beefe6 }
e8af5a
fa6d52 ¤   void
c65104 CPGPtoolsTextTask::GetTaskItemName(StringPtr name)
4ebb36 {
6cc0ce ¤   if( mSourceFileName[0] != 0 )
2cc7a1 ¤   {
--b95f 001faea37e140120104 Page 4 of CPGPtoolsTextTask.cp
a290e9 ¤   ¤   CopyPString( mSourceFileName, name );
b79371 ¤   }
3f0e24 ¤   else
2bc7a1 ¤   {
6538f5 ¤   ¤   GetIndString( name, kResultsTableStringListResID,
7226b1 ¤   ¤   ¤   ¤   ¤   ¤   kSelectedTextStrIndex );
459371 ¤   }
dfefe6 }
e5af5a
faaf5a
--516a 0015c7731e040120105 Page 1 of CPGPtoolsTextTask.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
e148bc ¤   $Id: CPGPtoolsTextTask.h,v 1.13.8.1 1998/11/12 03:09:19 heller Exp $
20f7f7 ____________________________________________________________________________*/
71af5a
de7b7d #pragma once
a8af5a
211955 #include "CPGPtoolsBufferTask.h"
58af5a
1fc819 class CPGPtoolsTextTask : public CPGPtoolsBufferTask
76bb36 {
995ed4 public:
45d05e ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsTextTask(PGPtoolsOperation operation);
65c9ba ¤   virtual¤¤   ¤   ¤   ~CPGPtoolsTextTask(void);
20a8f8 ¤   virtual CToolsError¤DecryptVerify(PGPContextRef¤context,
9f1764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
167fae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDecodeParams *state);
94acfe ¤   virtual¤CToolsError¤EncryptSign(PGPContextRef context,
2e1764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtlsContextRef tlsContext,
023c36 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CEncodeParams *state);
844279 ¤   virtual¤void¤   ¤   SetSourceFileName(ConstStringPtr name);
19af5a
96a2d3 protected:
68af5a
0b7186 ¤   virtual¤void¤   ¤   GetDecryptPassphrasePromptString(StringPtr prompt);
710bcd ¤   virtual¤void¤   ¤   GetTaskItemName(StringPtr name);
47d30f ¤   virtual¤CToolsError¤ProcessOutputData(void);
7b67c5 ¤
790fb9 private:
70af5a
44fe8a ¤   Str32¤  ¤   ¤   ¤   mSourceFileName;
b867c5 ¤
688c3a ¤   virtual¤void¤   ¤   BuildErrorMessage(CToolsError err,
5924a9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   short errorStrIndex, StringPtr msg);
5cbf26 };¶
--41ea 0002d7fa9e840120106 Page 1 of CPGPtoolsTextWindow.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
28b06f ¤   $Id: CPGPtoolsTextWindow.cp,v 1.5.8.1 1998/11/12 03:09:19 heller Exp $
1cf7f7 ____________________________________________________________________________*/
eaaf5a
b6b980 #include <Appearance.h>
bc775b #include <LTextEditView.h>
5fdd56 #include <PP_Messages.h>
4baf5a
05a29d #include "CPGPtoolsTextWindow.h"
07af5a
9fc2ae const PaneIDT¤  kScrollPaneID¤  = 4001;
c66e63 const PaneIDT¤  kTextEditPaneID¤= 4002;
6aaf5a
416c13 CPGPtoolsTextWindow::CPGPtoolsTextWindow(LStream *inStream)
338e8d ¤   : CPGPtoolsWindow(inStream)
5bbb36 {
efefe6 }
57af5a
311574 CPGPtoolsTextWindow::~CPGPtoolsTextWindow(void)
19bb36 {
65efe6 }
d5af5a
376d52 ¤   void
6947d9 CPGPtoolsTextWindow::FinishCreateSelf(void)
f6bb36 {
f6d2c8 ¤   LTextEditView¤  *textEdit;
3b67c5 ¤
576221 ¤   CPGPtoolsWindow::FinishCreateSelf();
a1af5a
f3a29c ¤   SetThemeWindowBackground( GetMacPort(), kThemeDocumentWindowBackgroundBrush,
a5d310 ¤   ¤   ¤   ¤   FALSE );
c2af5a
ca486d ¤   textEdit = (LTextEditView *) FindPaneByID( kTextEditPaneID );
7797b2 ¤   pgpAssertAddrValid( textEdit, LTextEditView );
7f67c5 ¤
f9c3f1 ¤   TEAutoView( TRUE, textEdit->GetMacTEH() );
91efe6 }
92af5a
2f6d52 ¤   void
4bcb52 CPGPtoolsTextWindow::ApplyForeAndBackColors(void) const
bbbb36 {
52a29c ¤   SetThemeWindowBackground( GetMacPort(), kThemeDocumentWindowBackgroundBrush,
10d310 ¤   ¤   ¤   ¤   FALSE );
57efe6 }
a4af5a
b9af5a
8a85ea ¤   OSStatus
2a0ba2 CPGPtoolsTextWindow::SetText(LogicalAddress theText, UInt32 textLength)
d1bb36 {
43d2c8 ¤   LTextEditView¤  *textEdit;
6367c5 ¤
ee4416 ¤   pgpAssert( textLength <= max_Int16 );
9867c5 ¤
7ffd74 ¤   if( textLength > max_Int16 )
5fd861 ¤   ¤   textLength = max_Int16;
3e1b52 ¤   ¤
17486d ¤   textEdit = (LTextEditView *) FindPaneByID( kTextEditPaneID );
f597b2 ¤   pgpAssertAddrValid( textEdit, LTextEditView );
4767c5 ¤
4142fc ¤   textEdit->SetTextPtr( (char *) theText, textLength );
4567c5 ¤
3179ad ¤   return( noErr );
8eefe6 }
80af5a
4e6d52 ¤   void
e2e37c CPGPtoolsTextWindow::FindCommandStatus(
a1ea24 ¤   CommandT¤   inCommand,
77a472 ¤   Boolean¤¤   &outEnabled,
2d3a4d ¤   Boolean¤¤   &outUsesMark,
--827b 001f983353540120106 Page 2 of CPGPtoolsTextWindow.cp
515dc0 ¤   Char16¤ ¤   &outMark,
f5d894 ¤   Str255¤ ¤   outName)
ddbb36 {
30ad11 ¤   outUsesMark = false;
2baf5a
98c469 ¤   switch (inCommand)
19c7a1 ¤   {
ee3513 ¤   ¤   case cmd_SelectAll:
c8e6cf ¤   ¤   ¤   outEnabled = TRUE;
9acdcb ¤   ¤   ¤   break;
8787c7 ¤   ¤   ¤
849ae3 ¤   ¤   default:
a1a9a1 ¤   ¤   ¤   CPGPtoolsWindow::FindCommandStatus(inCommand, outEnabled,
7acff1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outUsesMark, outMark, outName);
37cdcb ¤   ¤   ¤   break;
689371 ¤   }
02efe6 }
66af5a
8f7e69 ¤   Boolean
736118 CPGPtoolsTextWindow::ObeyCommand(
95ea24 ¤   CommandT¤   inCommand,
b4ed36 ¤   void*¤  ¤   ioParam)
d3bb36 {
f25b52 ¤   Boolean¤¤   cmdHandled = true;
9f67c5 ¤
33c469 ¤   switch (inCommand)
4dc7a1 ¤   {
543513 ¤   ¤   case cmd_SelectAll:
c85b34 ¤   ¤   {
e91f44 ¤   ¤   ¤   LTextEditView¤  *textEdit;
ef87c7 ¤   ¤   ¤
fc4bf8 ¤   ¤   ¤   textEdit = (LTextEditView *) FindPaneByID( kTextEditPaneID );
1a81ae ¤   ¤   ¤   pgpAssertAddrValid( textEdit, LTextEditView );
56af5a
93c234 ¤   ¤   ¤   SwitchTarget( textEdit );
eb38ff ¤   ¤   ¤   textEdit->SelectAll();
e4cdcb ¤   ¤   ¤   break;
690fe4 ¤   ¤   }
e21b52 ¤   ¤
e99ae3 ¤   ¤   default:
4c6f97 ¤   ¤   ¤   cmdHandled = CPGPtoolsWindow::ObeyCommand( inCommand, ioParam );
2ccdcb ¤   ¤   ¤   break;
419371 ¤   }
ff67c5 ¤
5f51a4 ¤   return cmdHandled;
f9efe6 }
--2814 001b3acbbcf40120107 Page 1 of CPGPtoolsTextWindow.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
44cbb2 ¤   $Id: CPGPtoolsTextWindow.h,v 1.5.8.1 1998/11/12 03:09:20 heller Exp $
aaf7f7 ____________________________________________________________________________*/
41af5a
ec7b7d #pragma once
11af5a
2309d9 #include "CPGPtoolsWindow.h"
c1af5a
ccbff6 class CPGPtoolsTextWindow¤  : public CPGPtoolsWindow
6ebb36 {
3a5ed4 public:
196e5a ¤   enum { class_ID = 'TWin' };
a9af5a
df729c ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsTextWindow(LStream *inStream);
48b481 ¤   ¤   ¤   ¤   ¤   ¤   ~CPGPtoolsTextWindow(void);
0867c5 ¤
5fdbc4 ¤   virtual void¤   ¤   ApplyForeAndBackColors() const;
7448a0 ¤   virtual void¤   ¤   FindCommandStatus(CommandT inCommand,
1a0bef ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
5640c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName);
02c834 ¤   virtual Boolean¤¤   ObeyCommand(CommandT inCommand, void *ioParam);
22053b ¤   OSStatus¤   ¤   ¤   SetText(LogicalAddress theText, UInt32 textLength);
1367c5 ¤
0ea2d3 protected:
49af5a
81d5cd ¤   virtual¤void¤   ¤   FinishCreateSelf(void);
ca82f7 };
b3af5a
--342d 000f5d528ab40120108 Page 1 of CPGPtoolsWindow.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
156fab ¤   $Id: CPGPtoolsWindow.cp,v 1.3.8.1 1998/11/12 03:09:21 heller Exp $
64f7f7 ____________________________________________________________________________*/
beaf5a
54531e #include <MacWindows.h>
fcaf5a
ddffe3 #include <UGraphicUtils.h>
3875de #include <UWindows.h>
9aaf5a
5b09d9 #include "CPGPtoolsWindow.h"
b4af5a
8693ea CPGPtoolsWindow::CPGPtoolsWindow(LStream *inStream)
e6f573 ¤   : LWindow( inStream )
87bb36 {
2cefe6 }
82af5a
9eb1f4 CPGPtoolsWindow::~CPGPtoolsWindow(void)
71bb36 {
f4efe6 }
22af5a
2d7e69 ¤   Boolean
b546e4 CPGPtoolsWindow::PointIsOnVisibleDevice(Point globalPt)
74bb36 {
d364a7 ¤   RgnHandle¤  myGrayRgn = NewRgn();
94f832 ¤   Boolean¤¤   pointIsVisible;
d467c5 ¤
a263fa ¤   AssertHandleIsValid( myGrayRgn, "PointIsOnVisibleDevice" );
6d67c5 ¤
721cb2 ¤   CopyRgn( GetGrayRgn(), myGrayRgn );
657ce1 ¤   InsetRgn( myGrayRgn, 10, 10 );
3f67c5 ¤
49b551 ¤   pointIsVisible = PtInRgn( globalPt, myGrayRgn );
4767c5 ¤
a40092 ¤   DisposeRgn( myGrayRgn );
9067c5 ¤
445aff ¤   return( pointIsVisible );
0cefe6 }
00af5a
897e69 ¤   Boolean
915e9e CPGPtoolsWindow::WindowOnVisibleDevice(void)
f2bb36 {
fe5019 ¤   Rect¤   ¤   windowRect;
724194 ¤   Point¤  ¤   upperRight;
3b5d72 ¤   Point¤  ¤   upperLeft;
3167c5 ¤
81f680 ¤   windowRect ¤= UWindows::GetWindowContentRect( mMacWindowP );
75af5a
ea1402 ¤   upperLeft.v¤¤   = windowRect.top;
ee6c1e ¤   upperLeft.h¤¤   = windowRect.right;
9c67c5 ¤
f0cb1a ¤   upperRight.v¤   = windowRect.top;
5734af ¤   upperRight.h¤   = windowRect.right;
9a67c5 ¤
fa858b ¤   return( PointIsOnVisibleDevice( upperLeft ) ||
bf853e ¤   ¤   ¤   PointIsOnVisibleDevice( upperRight ) );
00efe6 }
eeaf5a
e449b6 //¤ Validates that the window will be visible and moveable before calling
3ffbc6 //¤ the real DoSetPosition().
6caf5a
c36d52 ¤   void
7e5ba5 CPGPtoolsWindow::DoSetPosition(Point inPosition) // Top left in global coords
4ebb36 {
105019 ¤   Rect¤   ¤   windowRect;
cf4194 ¤   Point¤  ¤   upperRight;
e567c5 ¤
e0f680 ¤   windowRect ¤= UWindows::GetWindowContentRect( mMacWindowP );
47af5a
f568ce ¤   upperRight¤ ¤   = inPosition;
--2c5c 0012f3da9ca40120108 Page 2 of CPGPtoolsWindow.cp
29e7f3 ¤   upperRight.h¤   = inPosition.h + UGraphicUtils::RectWidth(windowRect);
2067c5 ¤
293990 ¤   if( PointIsOnVisibleDevice( inPosition ) ||
06c623 ¤   ¤   PointIsOnVisibleDevice( upperRight ) )
b4c7a1 ¤   {
2d0be2 ¤   ¤   LWindow::DoSetPosition( inPosition );
f09371 ¤   }
9befe6 }
71af5a
34af5a
7c49b6 //¤ Validates that the window will be visible and moveable before calling
4a12c7 //¤ the real DoSetBounds().
54af5a
1f6d52 ¤   void
240dc5 CPGPtoolsWindow::DoSetBounds(const Rect &inBounds)¤ // Bounds in global coords
91bb36 {
5912c8 ¤   Point¤  upperLeft;
8d5b0a ¤   Point¤  upperRight;
9167c5 ¤
e54db5 ¤   upperLeft.v = inBounds.top;
82bc01 ¤   upperLeft.h = inBounds.left;
5a67c5 ¤
4d58d8 ¤   upperRight.v = inBounds.top;
c19268 ¤   upperRight.h = inBounds.right;
5867c5 ¤
63404e ¤   if( PointIsOnVisibleDevice( upperRight ) ||
6825f6 ¤   ¤   PointIsOnVisibleDevice( upperLeft ) )
2dc7a1 ¤   {
da8f5a ¤   ¤   LWindow::DoSetBounds( inBounds );
339371 ¤   }
37efe6 }
97af5a
8573d0 // PowerPlant "leaks" AEDesc's when sending AppleEvents to itself, so we
113fa7 // override this routine to call DoSetBounds directly since we dont care about
6a5354 // recording AppleEvents.
0caf5a
cc6d52 ¤   void
6598a8 CPGPtoolsWindow::SendAESetBounds(
10b7eb ¤   Rect¤   *inBounds,¤ ¤   ¤   ¤   ¤   // New bounds in global coords
3db043 ¤   Boolean¤inExecuteAE)
c5bb36 {
d4cb42 ¤   #pragma unused( inExecuteAE )
1567c5 ¤
fb801f ¤   DoSetBounds( *inBounds );
12efe6 }
19af5a
2e73d0 // PowerPlant "leaks" AEDesc's when sending AppleEvents to itself, so we
cdc867 // override this routine to call DoSetZoom directly since we dont care about
165354 // recording AppleEvents.
70af5a
4b6d52 ¤   void
9f5082 CPGPtoolsWindow::SendAESetZoom(void)
f0bb36 {
f4285a ¤   Rect¤   stdBounds;
442f81 ¤   Boolean¤zoomToStdState = ! CalcStandardBounds( stdBounds );
eeaf5a
bd8dff ¤   DoSetZoom( zoomToStdState );
2fefe6 }
--db52 001bbb2d70b40120109 Page 1 of CPGPtoolsWindow.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
c5afd4 ¤   $Id: CPGPtoolsWindow.h,v 1.2.8.1 1998/11/12 03:09:21 heller Exp $
55f7f7 ____________________________________________________________________________*/
01af5a
341ed2 // Base class for all application windows
73af5a
067b7d #pragma once
26af5a
228fd4 #include <LWindow.h>
64af5a
eb4027 class CPGPtoolsWindow : public LWindow
babb36 {
5f5ed4 public:
ac36ea ¤   enum ¤  ¤   ¤   ¤   { class_ID = 'AWin' };
16af5a
6ed889 ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsWindow(LStream *inStream);
d8ddf7 ¤   virtual¤¤   ¤   ¤   ~CPGPtoolsWindow(void);
95af5a
b2193a ¤   virtual void¤   ¤   DoSetBounds(const Rect &inBounds);
978aee ¤   virtual void¤   ¤   DoSetPosition(Point inPosition);
7c5bd9 ¤   virtual void¤   ¤   SendAESetBounds(Rect *inBounds, Boolean inExecuteAE);
038787 ¤   virtual void¤   ¤   SendAESetZoom(void);
d5af5a
12a2d3 protected:
6daf5a
823aea ¤   virtual¤Boolean¤¤   WindowOnVisibleDevice(void);
6667c5 ¤
030fb9 private:
5caf5a
20e5fe ¤   virtual¤Boolean¤¤   PointIsOnVisibleDevice(Point globalPt);
bbbf26 };¶
--8c58 00062f9c1914012010a Page 1 of CPGPtoolsWipeTask.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
0c09eb ¤   $Id: CPGPtoolsWipeTask.cp,v 1.24.8.1 1998/11/12 03:09:22 heller Exp $
57f7f7 ____________________________________________________________________________*/
2faf5a
e4dd06 #include <UDesktop.h>
e1af5a
7ac110 #include "pgpMacMemory.h"
4b85c2 #include "MacStrings.h"
bbbbf4 #include "MacFiles.h"
b5371b #include "CMacFSWiper.h"
12af5a
7d4919 #include "pgpUtilities.h"
99c97b #include "pgpClientPrefs.h"
87e8b2 #include "pflPrefs.h"
424720 #include "pflPrefTypes.h"
a2af5a
342aad #include "PGPtoolsUtils.h"
72133f #include "PGPtoolsResources.h"
ebb397 #include "PGPOpenPrefs.h"
51af5a
1e3192 #include "CPGPtools.h"
c549e1 #include "CPGPtoolsTaskProgressDialog.h"
ae5c3c #include "CPGPtoolsWipeTask.h"
55af5a
b5af5a
3b060c ¤   inline UInt32
184ad1 RoundUp(
d0a2a5 ¤   UInt32¤ num,
281fef ¤   UInt32¤ factor )
0dbb36 {
6577d6 ¤   return( ( (num + (factor -1)) / factor ) * factor );
cdefe6 }
78af5a
b0af5a
88badb /* scale byte counts to avoid overflow on really large wipes */
ae9e84 #define kProgressScaleFactor ¤  1024UL
66cd56 ¤   UInt32
e4fe99 CPGPtoolsWipeTask::GetScaledProgress( PGPUInt64 num )
b1bb36 {
f2c4df ¤   if ( num > mTotalBytesToWipe )
581fc5 ¤   ¤   num¤= mTotalBytesToWipe;
2a67c5 ¤
16c6e9 ¤   if ( mTotalBytesToWipe <= MAX_PGPUInt32 )
1bc7a1 ¤   {
d2f92a ¤   ¤   return( (UInt32)num );
639371 ¤   }
f967c5 ¤
933dd7 ¤   /* scale by factor of one million */
4e3865 ¤   return( (UInt32)(num / (1UL << 20)) );
4cefe6 }
05af5a
9467c5 ¤
7367c5 ¤
fcc149 CPGPtoolsWipeTask::CPGPtoolsWipeTask( const FSSpec *spec )·
120e26 ¤   ¤   : CPGPtoolsTask( kPGPtoolsWipeOperation )
94bb36 {
e644b3 ¤   AssertSpecIsValid( spec, "CPGPtoolsWipeTask::CPGPtoolsWipeTask" );
6b67c5 ¤
f57c9f ¤   mWipeSpec¤  ¤   = *spec;
919cde ¤   mProgress¤  ¤   = NULL;
46de87 ¤   mNumWipePasses¤ = 0;
7d36de ¤   mPatternList¤   = NULL;
f6efe6 }
abaf5a
562716 CPGPtoolsWipeTask::~CPGPtoolsWipeTask(void)
58bb36 {
ee47ef ¤   if( IsntNull( mPatternList ) )
1ac7a1 ¤   {
62bb48 ¤   ¤   PGPFreeData( mPatternList );
--9624 000aa2e03cc4012010a Page 2 of CPGPtoolsWipeTask.cp
cef2e1 ¤   ¤   mPatternList = NULL;
0f9371 ¤   }
32efe6 }
bfaf5a
64af5a
9baf5a
5685ea ¤   OSStatus
5f2831 CPGPtoolsWipeTask::CalcProgressBytes(
79a1bc ¤   PGPContextRef¤  ¤   context,
eef894 ¤   ByteCount *¤¤   ¤   progressBytes)
1fbb36 {
ceae9e ¤   PGPPrefRef¤ ¤   prefRef;
18156f ¤   OSStatus¤   ¤   err;
5703e8 ¤   PGPError¤   ¤   pgpErr;
de67c5 ¤
7a56cd ¤   pgpErr = PGPOpenClientPrefs( PGPGetContextMemoryMgr( context ), &prefRef );
50abba ¤   if( IsntPGPError( pgpErr ) )
68c7a1 ¤   {
a2314a ¤   ¤   pgpErr = PGPGetPrefNumber( prefRef, kPGPPrefFileWipePasses,
fc7527 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mNumWipePasses );
94af5a
56b512 ¤   ¤   (void) PGPClosePrefFile( prefRef );
e79371 ¤   }
5767c5 ¤
318325 ¤   pgpAssertNoErr( pgpErr );
fd67c5 ¤
590b9e ¤   if( mNumWipePasses == 0 )
6f8770 ¤   ¤   mNumWipePasses = 3;
a51b52 ¤   ¤
70680b ¤   err¤= Prescan();
a5ed17 ¤   if ( IsntErr( err ))
12c7a1 ¤   {
f3b1b1 ¤   ¤   mTotalBytesToWipe *= mNumWipePasses;
051b52 ¤   ¤
ec9f06 ¤   ¤   *progressBytes¤ = GetScaledProgress( mTotalBytesToWipe );
c19371 ¤   }
d867c5 ¤
ccdeb7 ¤   return( err );
37efe6 }
35af5a
97af5a
866d52 ¤   void
4fb6f9 CPGPtoolsWipeTask::GetTaskItemName(StringPtr name)
fdbb36 {
47b4d5 ¤   CopyPString( mWipeSpec.name, name );
3cefe6 }
5aaf5a
79af5a
9bfbb0 ¤   CToolsError
8ac339 CPGPtoolsWipeTask::Wipe(
a7883c ¤   PGPContextRef¤  ¤   ¤   ¤   context,
31a218 ¤   CPGPtoolsTaskProgressDialog *progressDialogObj )
86bb36 {
677c3e ¤   CToolsError¤err;
0e67c5 ¤
ef1e17 ¤   mProgress¤  = progressDialogObj;
142a4f ¤   mProgress->SetProgressOperation( kPGPtoolsWipeOperation );
6567c5 ¤
9e89ac ¤   pgpAssert( mNumWipePasses != 0 );
4867c5 ¤
f1185d ¤   err.pgpErr = GetWipingPatternList( context, mNumWipePasses,
3d7486 ¤   ¤   ¤   ¤   ¤   ¤   &mPatternList );
bed3cb ¤   if( err.IsntError() )
c5c7a1 ¤   {
84335e ¤   ¤   mWipeBufferSize = 512L * 1024L;
421b52 ¤   ¤
600b07 ¤   ¤   mWipeBuffer = pgpNewPtrMost( mWipeBufferSize,
688ef9 ¤   ¤   ¤   ¤   ¤   ¤   sizeof( PGPWipingPattern ),
a25c6e ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap |
530afe ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseTempMem |
ea6513 ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_PreferTempMem, &mWipeBufferSize );
aa90be ¤   ¤   if( IsntNull( mWipeBuffer ) )
--fabd 0009948469d4012010a Page 3 of CPGPtoolsWipeTask.cp
38f48a ¤   ¤   {¤  ¤
34df66 ¤   ¤   ¤   err¤= WipeSpec( &mWipeSpec );
1787c7 ¤   ¤   ¤
b25e21 ¤   ¤   ¤   pgpFreeMac( mWipeBuffer );
e12092 ¤   ¤   ¤   mWipeBuffer = NULL;
bd0fe4 ¤   ¤   }
a00e1d ¤   ¤   else
055b34 ¤   ¤   {
c04d89 ¤   ¤   ¤   err.pgpErr = kPGPError_OutOfMemory;
f70fe4 ¤   ¤   }
7b1b52 ¤   ¤
3dbb48 ¤   ¤   PGPFreeData( mPatternList );
adf2e1 ¤   ¤   mPatternList = NULL;
a69371 ¤   }
6faf5a
2dab20 ¤   if( ShouldReportError( err ) )
dbc7a1 ¤   {
eb2d70 ¤   ¤   err = ReportError( err, kErrorWhileWipingStrIndex );
ef9371 ¤   }
ef67c5 ¤
f0deb7 ¤   return( err );
34efe6 }
07af5a
9aaf5a
327de0 ¤   PGPUInt64
c9c102 CPGPtoolsWipeTask::CalcFileSize( const CInfoPBRec *cpb )
6abb36 {
bb920d ¤   PGPUInt64¤  resSize¤¤   = cpbResForkSize( cpb );
b145ff ¤   PGPUInt64¤  dataSize¤   = cpbDataForkSize( cpb );
f43e29 ¤   UInt32¤ allocBlockSize¤ = mAllocBlockSize;
8f67c5 ¤
0e392f ¤   resSize¤¤   = RoundUp( resSize, allocBlockSize );
fde3d0 ¤   dataSize¤   = RoundUp( dataSize, allocBlockSize );
d367c5 ¤
444dd7 ¤   return( resSize + dataSize );
16efe6 }
12af5a
3f0335 /*____________________________________________________________________________
7f1e8b ¤   Add a file's info to our prescan info.
99f7f7 ____________________________________________________________________________*/
576d52 ¤   void
d5c002 CPGPtoolsWipeTask::PrescanFile( const CInfoPBRec *¤ cpb)
e4bb36 {
ce0bd4 ¤   mTotalBytesToWipe¤  += CalcFileSize( cpb );
9367c5 ¤
3ce4e0 ¤   ++mTotalFilesToWipe;
a467c5 ¤
2577fc ¤   if ( cpbIsLocked( cpb ) )
820013 ¤   ¤   ++mNumLockedFiles;
e41b52 ¤   ¤
eef7a2 ¤   if ( cpbIsOpen( cpb ) )
f40c97 ¤   ¤   ++mNumOpenFiles;
3fefe6 }
61af5a
69af5a
e20335 /*____________________________________________________________________________
11d20e ¤   Recursively scan the spec and its subfolders, though spec could be a file.
fbf7f7 ____________________________________________________________________________*/
a185ea ¤   OSStatus
36da56 CPGPtoolsWipeTask::PrescanFolder(·
2a2fea ¤   short¤  ¤   vRefNum,
002094 ¤   long¤   ¤   dirID )
edbb36 {
fb4f27 ¤   CInfoPBRec¤ cpb;
974db3 ¤   Str63¤  ¤   name;
7bdc42 ¤   OSStatus¤   err;
f067c5 ¤
c1b663 ¤   cpb.hFileInfo.ioVRefNum¤¤   = vRefNum;
4ac4b7 ¤   cpb.hFileInfo.ioDirID¤  ¤   = dirID;
b68f05 ¤   cpb.hFileInfo.ioNamePtr¤¤   = name;
5533a4 ¤   cpb.hFileInfo.ioFDirIndex¤  = 1;
9972c9 ¤   while ( TRUE )
--b496 0005592c9cf4012010a Page 4 of CPGPtoolsWipeTask.cp
f7c7a1 ¤   {
1ff801 ¤   ¤   err¤= PBGetCatInfoSync( &cpb );
0a8cf4 ¤   ¤   if ( IsErr( err ) )
e05b34 ¤   ¤   {
68c7c1 ¤   ¤   ¤   err¤= noErr;
75cdcb ¤   ¤   ¤   break;
d80fe4 ¤   ¤   }
b51b52 ¤   ¤
2862f7 ¤   ¤   if ( cpbIsFolder( &cpb ) )
cd5b34 ¤   ¤   {
b6f005 ¤   ¤   ¤   err¤= PrescanFolder( vRefNum, cpb.dirInfo.ioDrDirID );
c00fe4 ¤   ¤   }
020e1d ¤   ¤   else
245b34 ¤   ¤   {
8e0302 ¤   ¤   ¤   PrescanFile( &cpb );
ac0fe4 ¤   ¤   }
c51b52 ¤   ¤
3a8cf4 ¤   ¤   if ( IsErr( err ) )
d1cdcb ¤   ¤   ¤   break;
241b52 ¤   ¤
742937 ¤   ¤   cpb.dirInfo.ioFDirIndex¤+= 1;
5dba82 ¤   ¤   cpb.hFileInfo.ioDirID¤  = dirID;
cf9371 ¤   }
ef67c5 ¤
c4deb7 ¤   return( err );
47efe6 }
d4af5a
c6af5a
df85ea ¤   OSStatus
b256e3 CPGPtoolsWipeTask::Prescan( ·)
26bb36 {
09dc42 ¤   OSStatus¤   err;
9f4f27 ¤   CInfoPBRec¤ cpb;
8d67c5 ¤
62fe8a ¤   mTotalBytesToWipe¤  = 0;
5cdd9a ¤   mTotalFilesToWipe¤  = 0;
a14f64 ¤   mNumLockedFiles¤¤   = 0;
3b3921 ¤   mNumOpenFiles¤  ¤   = 0;
89f70d ¤   mCurFileBytesWiped¤ = 0;
1f67c5 ¤
a8caaf ¤   mAllocBlockSize¤= GetVolumeAllocBlockSize( mWipeSpec.vRefNum );
8daf5a
9f8ad2 ¤   err¤= FSpGetCatInfo( &mWipeSpec, &cpb );
535ecc ¤   if ( IsntErr( err ) )
89c7a1 ¤   {
799946 ¤   ¤   if ( cpbIsFile( &cpb ) )
3a5b34 ¤   ¤   {
e50302 ¤   ¤   ¤   PrescanFile( &cpb );
640fe4 ¤   ¤   }
71653b ¤   ¤   else if( cpb.dirInfo.ioDrDirID != fsRtDirID )
255b34 ¤   ¤   {
82336f ¤   ¤   ¤   err¤= PrescanFolder( mWipeSpec.vRefNum,
035ad3 ¤   ¤   ¤   ¤   ¤   ¤   cpb.dirInfo.ioDrDirID );
d40fe4 ¤   ¤   }
8c9371 ¤   }
3f67c5 ¤
f9deb7 ¤   return( err );
edefe6 }
13af5a
9faf5a
8baf5a
7d85ea ¤   OSStatus
861566 CPGPtoolsWipeTask::WipeHook(
ed7f0e ¤   ConstStringPtr¤ fileName,
a29fec ¤   PGPUInt64¤  ¤   additionalDone)
2ebb36 {
35dc42 ¤   OSStatus¤   err;
e667c5 ¤
70d70e ¤   /* we have our own totals across multiple files */
11c1cd ¤   mCurFileBytesWiped¤ ¤   += additionalDone;
a267c5 ¤
557db8 ¤   (void)fileName;
--ca32 000dec168bb4012010a Page 5 of CPGPtoolsWipeTask.cp
1854a8 ¤   err¤= DoProgress( mProgress,
57ddd8 ¤   ¤   ¤   GetScaledProgress( mCurFileBytesWiped ),
ac2089 ¤   ¤   ¤   GetScaledProgress( mTotalBytesToWipe) );
7e67c5 ¤
9edeb7 ¤   return( err );
41efe6 }
10af5a
9eaf5a
0aaf5a
82c147 class CMyWiper : public CMacFSWiper
bdbb36 {
253487 ¤   CPGPtoolsWipeTask *¤mTask;
3667c5 ¤
735ed4 public:
a0b2f0 ¤   CMyWiper( CPGPtoolsWipeTask *task )
5fc7a1 ¤   {
68ac14 ¤   ¤   mTask¤  = task;
f09371 ¤   }
ca67c5 ¤
b70cc6 ¤   ¤   virtual OSStatus
75cc45 ¤   Progress( ·ConstStringPtr fileName,
b86efb ¤   ¤   ¤   ¤   PGPUInt64 additionalDone )
31c7a1 ¤   {
b86d93 ¤   ¤   OSStatus¤   err;
df1b52 ¤   ¤
0a9178 ¤   ¤   err¤= CMacFSWiper::Progress( fileName, additionalDone );
c1d798 ¤   ¤   if ( IsntErr( err ) )
b40b3e ¤   ¤   ¤   err¤= mTask->WipeHook( fileName, additionalDone );
b6e55e ¤   ¤   return( err );
129371 ¤   }
5082f7 };
4baf5a
8daf5a
d0af5a
5285ea ¤   OSStatus
55bf36 CPGPtoolsWipeTask::WipeFile( const FSSpec *spec )
58bb36 {
7d156f ¤   OSStatus¤   ¤   err;
a592ff ¤   CMyWiper¤   ¤   wiper( this );
f667c5 ¤
ae0ec8 ¤   /* this takes care of accumulating each files progress count */
a3e46a ¤   mProgress->SetNewProgressItem( spec->name );
4ffe5e ¤   mCurFileBytesWiped¤ = 0;·
ae67c5 ¤
2efddb ¤   /* wipe the data */
173582 ¤   err¤= wiper.FSpWipeAndDelete( spec, mNumWipePasses, mNumWipePasses,
002223 ¤   ¤   ¤   ¤   mPatternList, mWipeBuffer, mWipeBufferSize );
6867c5 ¤
2edeb7 ¤   return( err );
a1efe6 }
86af5a
16af5a
3d85ea ¤   OSStatus
a5b9ae CPGPtoolsWipeTask::WipeFolder(
a32fea ¤   short¤  ¤   vRefNum,
c92094 ¤   long¤   ¤   dirID )
0ebb36 {
ca4f27 ¤   CInfoPBRec¤ cpb;
cb496c ¤   FSSpec¤ ¤   spec;
1edc42 ¤   OSStatus¤   err;
d667c5 ¤
732ce1 ¤   spec.vRefNum¤   = vRefNum;
42c26b ¤   spec.parID¤ ¤   = dirID;
3667c5 ¤
bdb663 ¤   cpb.hFileInfo.ioVRefNum¤¤   = vRefNum;
ccc4b7 ¤   cpb.hFileInfo.ioDirID¤  ¤   = dirID;
b048ad ¤   cpb.hFileInfo.ioNamePtr¤¤   = spec.name;
0a33a4 ¤   cpb.hFileInfo.ioFDirIndex¤  = 1;
dc72c9 ¤   while ( TRUE )
1ac7a1 ¤   {
33f801 ¤   ¤   err¤= PBGetCatInfoSync( &cpb );
de8cf4 ¤   ¤   if ( IsErr( err ) )
--5edb 0006440da374012010a Page 6 of CPGPtoolsWipeTask.cp
e35b34 ¤   ¤   {
bcc7c1 ¤   ¤   ¤   err¤= noErr;
fbcdcb ¤   ¤   ¤   break;
d50fe4 ¤   ¤   }
301b52 ¤   ¤
8762f7 ¤   ¤   if ( cpbIsFolder( &cpb ) )
515b34 ¤   ¤   {
45f6ba ¤   ¤   ¤   err¤= WipeFolder( vRefNum, cpb.dirInfo.ioDrDirID );
800fe4 ¤   ¤   }
530e1d ¤   ¤   else
7a5b34 ¤   ¤   {
309ec5 ¤   ¤   ¤   err¤= WipeFile( &spec );
b60fe4 ¤   ¤   }
b01b52 ¤   ¤
ce8cf4 ¤   ¤   if ( IsErr( err ) )
9fcdcb ¤   ¤   ¤   break;
321b52 ¤   ¤
4bf994 ¤   ¤   /* leave ioFDirIndex at 1; we are continually deleting the first */
afba82 ¤   ¤   cpb.hFileInfo.ioDirID¤  = dirID;
8a9371 ¤   }
59af5a
6dc924 ¤   /* erase the folder itself */
695ecc ¤   if ( IsntErr( err ) )
9bc7a1 ¤   {
7c3632 ¤   ¤   Boolean¤¤   wipeTheFolder¤  = TRUE;
ea1b52 ¤   ¤
b70006 ¤   ¤   err¤= FSMakeFSSpec( vRefNum, dirID, "\p", &spec );
d3d798 ¤   ¤   if ( IsntErr( err ) )
265b34 ¤   ¤   {
5014ba ¤   ¤   ¤   /* if it's the trash folder itself, don't delete it */
dfc6fc ¤   ¤   ¤   wipeTheFolder¤  = ! FSIsTrashFolder( vRefNum, dirID );
510fe4 ¤   ¤   }
d81b52 ¤   ¤
ea9b79 ¤   ¤   if ( IsntErr( err ) && wipeTheFolder )
1e5b34 ¤   ¤   {
559675 ¤   ¤   ¤   /* Clear the catalog information on the folder */
90af5a
7e2511 ¤   ¤   ¤   err = FSpGetCatInfo( &spec, &cpb );
326108 ¤   ¤   ¤   if( IsntErr( err ) )
08f776 ¤   ¤   ¤   {
be6dc5 ¤   ¤   ¤   ¤   pgpClearMemory( &cpb, sizeof( cpb ) );
ab2b85 ¤   ¤   ¤   ¤
d0feb4 ¤   ¤   ¤   ¤   err = FSpSetCatInfo( &spec, &cpb );
5c2b85 ¤   ¤   ¤   ¤
eb1478 ¤   ¤   ¤   ¤   FlushVol( NULL, spec.vRefNum );
f8a3a6 ¤   ¤   ¤   }
4a87c7 ¤   ¤   ¤
456108 ¤   ¤   ¤   if( IsntErr( err ) )
5ff776 ¤   ¤   ¤   {
922976 ¤   ¤   ¤   ¤   uchar¤  bogusName[ kMaxHFSFileNameLength + 1 ];
f087c7 ¤   ¤   ¤
a12959 ¤   ¤   ¤   ¤   /* wipe the name (50/50 chance of this doing what we want) */
152cbb ¤   ¤   ¤   ¤   pgpFillMemory( bogusName, sizeof( bogusName ), 'x' );
99fed3 ¤   ¤   ¤   ¤   bogusName[0] = kMaxHFSFileNameLength;
1caf5a
a4df81 ¤   ¤   ¤   ¤   if ( IsntErr( FSpRename( &spec, bogusName ) ) )
8272c3 ¤   ¤   ¤   ¤   {
39d406 ¤   ¤   ¤   ¤   ¤   CopyPString( bogusName, spec.name );
c48239 ¤   ¤   ¤   ¤   ¤   FlushVol( NULL, spec.vRefNum );
b22613 ¤   ¤   ¤   ¤   }
b72b85 ¤   ¤   ¤   ¤
31a1dc ¤   ¤   ¤   ¤   err¤= FSpDelete( &spec );
e5a3a6 ¤   ¤   ¤   }
6e0fe4 ¤   ¤   }
b69371 ¤   }
1567c5 ¤
9fdeb7 ¤   return( err );
97efe6 }
62af5a
f9af5a
b5fbb0 ¤   CToolsError
6476ca CPGPtoolsWipeTask::WipeSpec( const FSSpec *spec )
--d4a6 0014804b1134012010a Page 7 of CPGPtoolsWipeTask.cp
2cbb36 {
487c3e ¤   CToolsError¤err;
dd4f27 ¤   CInfoPBRec¤ cpb;
e367c5 ¤
888747 ¤   err.err¤= FSpGetCatInfo( spec, &cpb );
a8ed80 ¤   if ( err.IsntError() )
91c7a1 ¤   {
d69946 ¤   ¤   if ( cpbIsFile( &cpb ) )
955b34 ¤   ¤   {
372e17 ¤   ¤   ¤   err.err¤= WipeFile( spec );
be0fe4 ¤   ¤   }
b0653b ¤   ¤   else if( cpb.dirInfo.ioDrDirID != fsRtDirID )
d55b34 ¤   ¤   {
809870 ¤   ¤   ¤   err.err¤= WipeFolder( spec->vRefNum,
ae5ad3 ¤   ¤   ¤   ¤   ¤   ¤   cpb.dirInfo.ioDrDirID );
b90fe4 ¤   ¤   }
c81b52 ¤   ¤
56041b ¤   ¤   FlushVol( NULL, spec->vRefNum );
2a9371 ¤   }
9c67c5 ¤
ffdeb7 ¤   return( err );
b3efe6 }
37af5a
c7af5a
a8af5a
f9af5a
8baf5a
60af5a
b9af5a
7baf5a
e1af5a
b6af5a
48af5a
--c466 0014acf198d4012010b Page 1 of CPGPtoolsWipeTask.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
d07d2f ¤   $Id: CPGPtoolsWipeTask.h,v 1.12.8.1 1998/11/12 03:09:23 heller Exp $
9af7f7 ____________________________________________________________________________*/
247b7d #pragma once
e5af5a
ae7dde #include "pgpMacWiping.h"
a6af5a
c657a2 #include "CPGPtoolsTask.h"
1c67c5 ¤
38af5a
bf6544 class CPGPtoolsWipeTask : public CPGPtoolsTask
49bb36 {
cd2e22 ¤   friend class CMyWiper;
bc67c5 ¤
410fb9 private:
001d82 ¤   CPGPtoolsTaskProgressDialog¤*mProgress;
1faf5a
c3af5a
cb5ed4 public:
7a860c ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsWipeTask( const FSSpec *spec );
5b9a4e ¤   virtual¤¤   ¤   ¤   ~CPGPtoolsWipeTask(void);
75531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
1b4b16 ¤   virtual¤OSStatus¤   CalcProgressBytes(PGPContextRef context,
fa32bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ByteCount *bytes);
f4b962 ¤   virtual void¤   ¤   GetTaskItemName(StringPtr name);
7f67c5 ¤
e70538 ¤   virtual CToolsError¤Wipe(PGPContextRef context,
f534be ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPtoolsTaskProgressDialog * progressDialogObj );
ceaf5a
86a2d3 protected:
e067c5 ¤
fe6e7d ¤   FSSpec¤ ¤   ¤   ¤   mWipeSpec;
ad852c ¤   PGPUInt32¤  ¤   ¤   mNumWipePasses;
0719f6 ¤   UInt32¤ ¤   ¤   ¤   mAllocBlockSize;
d1f6e0 ¤   /* careful, it should be able to hold more then 2^32 bytes */
c10525 ¤   PGPUInt64¤  ¤   ¤   mTotalBytesToWipe;
a980e5 ¤   UInt32¤ ¤   ¤   ¤   mTotalFilesToWipe;
402668 ¤   UInt32¤ ¤   ¤   ¤   mNumLockedFiles;
6f47e4 ¤   UInt32¤ ¤   ¤   ¤   mNumOpenFiles;
380d6c ¤   PGPWipingPattern¤   *mPatternList;
5709fa ¤   void¤   ¤   ¤   ¤   *mWipeBuffer;
947f5c ¤   UInt32¤ ¤   ¤   ¤   mWipeBufferSize;
0067c5 ¤
de449a ¤   PGPUInt64¤  ¤   ¤   mCurFileBytesWiped;
4467c5 ¤
71b2df ¤   PGPUInt64¤  ¤   ¤   CalcFileSize( const CInfoPBRec *cpb );
765029 ¤   void¤   ¤   ¤   ¤   PrescanFile( const CInfoPBRec *¤cpb);
e1da77 ¤   OSStatus¤   ¤   ¤   PrescanFolder( short vRefNum, long dirID );
5c818a ¤   OSStatus¤   ¤   ¤   Prescan( void );
2b67c5 ¤
5a67c5 ¤
005f75 ¤   UInt32¤ ¤   ¤   ¤   GetScaledProgress( PGPUInt64 num );
5db4a4 ¤   OSStatus¤   ¤   ¤   WipeHook( ConstStringPtr fileName,
5e92af ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt64 additionalDone );
e57747 ¤   OSStatus¤   ¤   ¤   WipeFile( const FSSpec *spec );
bf5314 ¤   OSStatus¤   ¤   ¤   WipeFolder( short vRefNum, long dirID );
dff2a0 ¤   CToolsError¤¤   ¤   WipeSpec( const FSSpec *spec );
4abf26 };¶
--2d7d 000d266286e4012010c Page 1 of CResultsTable.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
337708 ¤   $Id: CResultsTable.cp,v 1.22.2.2.2.1 1998/11/12 03:09:23 heller Exp $
7df7f7 ____________________________________________________________________________*/
beaf5a
1ab980 #include <Appearance.h>
c7af5a
d47b38 #include <LTableArrayStorage.h>
f8be77 #include <LTableMultiGeometry.h>
98e8ae #include <UDrawingUtils.h>
dc8f92 #include <UGAColorRamp.h>
51ffe3 #include <UGraphicUtils.h>
69f8a6 #include <UTextTraits.h>
fbaf5a
bbbbf4 #include "MacFiles.h"
2eb86a #include "MacQuickdraw.h"
d385c2 #include "MacStrings.h"
364720 #include "pflPrefTypes.h"
10c97b #include "pgpClientPrefs.h"
e40d08 #include "pgpMem.h"
f010f0 #include "pgpOpenPrefs.h"
d24919 #include "pgpUtilities.h"
a5af5a
bc133f #include "PGPtoolsResources.h"
70af5a
c3a4d3 #include "CResultsTable.h"
536d1f #include "CResultsWindow.h"
4baf5a
568291 const ResIDT¤   kSummaryItemTextTraitsResID¤¤   = 133;
41cde6 const ResIDT¤   kSingleItemTextTraitsResID¤ ¤   = 134;
33af5a
c534e3 const ResIDT¤   kSignatureBadIconResID¤ ¤   ¤   = 3000;
66a13a const ResIDT¤   kSignatureValidIconResID¤   ¤   = 3001;
4bf32b const ResID ¤   kValidKeyIconResID ¤¤   ¤   ¤   = 3100;
d3028f const ResID ¤   kInvalidKeyIconResID ¤  ¤   ¤   = 3101;
cdaf5a
e9f6b6 const short¤¤   kDropFlagMargin¤¤   ¤   = 20;
e6da90 const short¤¤   kValidityBarHeight¤ ¤   = 10;
b4af5a
1aff71 typedef enum ResultItemType
9fbb36 {
90a571 ¤   kResultTypeSummaryItem¤ = 1,
b5f73f ¤   kResultTypeSingleItem
c367c5 ¤
927296 } ResultItemType;
3aaf5a
bf76cb typedef struct ResultsSummaryItem
41bb36 {
6d19ef ¤   UInt32¤ ¤   numItems;
2cb3d3 ¤   UInt32¤ ¤   dateAndTime;
5267c5 ¤
aeb497 } ResultsSummaryItem;
efaf5a
abfaae typedef struct ResultsSingleItem
07bb36 {
ec8e91 ¤   uchar¤  ¤   ¤   itemName[64];
4e42d9 ¤   uchar¤  ¤   ¤   statusText[128];
4d99ea ¤   PGPValidity¤¤   validity;
bc3dd6 ¤   PGPTime¤¤   ¤   signingDate;
48cf20 ¤   Boolean¤¤   ¤   validSignature;
8df69e ¤   Boolean¤¤   ¤   badSignature;
97747a ¤   ResID¤  ¤   ¤   iconResID;
ba67c5 ¤
1a0ec4 } ResultsSingleItem;
91af5a
6c4c67 typedef struct ResultsTableItem
a3bb36 {
7ba218 ¤   ResultItemType¤ itemType;
2c67c5 ¤
d2f20a ¤   union
--e076 00087c6005c4012010c Page 2 of CResultsTable.cp
f7c7a1 ¤   {
6b455d ¤   ¤   ResultsSummaryItem¤ summary;
62b719 ¤   ¤   ResultsSingleItem¤  single;
0c62bd ¤   };
7b1b52 ¤   ¤
1e7995 } ResultsTableItem;
feaf5a
69834d CResultsTable::CResultsTable(LStream *inStream)
ef4afd ¤   : CPGPHierarchyTable( inStream )
1bbb36 {
58fb19 ¤   PGPError¤   ¤   err;
67ae9e ¤   PGPPrefRef¤ ¤   prefRef;
e767c5 ¤
80087a ¤   mTableGeometry¤ = new LTableMultiGeometry( this, 484, 18 );
255072 ¤   mTableSelector¤ = nil;¤ // Don't allow delections in this table.
573e40 ¤   mTableStorage¤  = new LTableArrayStorage(this, sizeof( ResultsTableItem));
3e67c5 ¤
0da028 ¤   mRightDropFlagControl ¤ = NULL;
c87126 ¤   mDownDropFlagControl¤   = NULL;
2c67c5 ¤
f7fa06 ¤   // Get marginal validity setting
901b52 ¤   ¤
efe661 ¤   err = PGPOpenClientPrefs( PGPGetDefaultMemoryMgr(), &prefRef );
9bb1f0 ¤   if( IsntPGPError( err ) )
cac7a1 ¤   {
dd69b7 ¤   ¤   (void) PGPGetPrefBoolean( prefRef,
29abed ¤   ¤   ¤   ¤   ¤   kPGPPrefDisplayMarginalValidity,
7f6dd1 ¤   ¤   ¤   ¤   ¤   &mShowMarginalValidity );
31af5a
dc69b7 ¤   ¤   (void) PGPGetPrefBoolean( prefRef,
2a02eb ¤   ¤   ¤   ¤   ¤   kPGPPrefMarginalIsInvalid,
c7f324 ¤   ¤   ¤   ¤   ¤   &mMarginalIsInvalid );
f5af5a
42b512 ¤   ¤   (void) PGPClosePrefFile( prefRef );
e79371 ¤   }
8eefe6 }
f4af5a
028d4a CResultsTable::~CResultsTable(void)
3abb36 {
47315e ¤   // LTableView will take care of mTableGeometry, mTableSelector,
67b96a ¤   // and mTableStorage
4667c5 ¤
4daf93 ¤   if( IsntNull( mRightDropFlagControl ) )
72472a ¤   ¤   DisposeControl( mRightDropFlagControl );
a5af5a
f5d610 ¤   if( IsntNull( mDownDropFlagControl ) )
742321 ¤   ¤   DisposeControl( mDownDropFlagControl );
acefe6 }
56af5a
116d52 ¤   void
21bb5d CResultsTable::FinishCreateSelf(void)
28bb36 {
c4158d ¤   WindowPtr¤  theWindow;
3f1b52 ¤   ¤
ba415b ¤   CPGPHierarchyTable::FinishCreateSelf();
5b67c5 ¤
647def ¤   InsertCols( 1, 1, nil, 0, FALSE );
4967c5 ¤
658e83 ¤   UTextTraits::SetPortTextTraits( kSummaryItemTextTraitsResID );
756a01 ¤   GetFontInfo( &mSummaryItemFontInfo );
62af5a
eef96a ¤   UTextTraits::SetPortTextTraits( kSingleItemTextTraitsResID );
e22067 ¤   GetFontInfo( &mSingleItemFontInfo );
ff67c5 ¤
abd3f4 ¤   theWindow = GetMacPort();
f667c5 ¤
f482f4 ¤   mRightDropFlagControl = NewControl( theWindow, &mFlagRect,
0e45e8 ¤   ¤   ¤   ¤   "\p", FALSE, 0, 0, 1, kControlTriangleAutoToggleProc, 0 );
853a61 ¤   pgpAssertAddrValid( mRightDropFlagControl, ControlRecord * );
e2af5a
974ef1 ¤   mDownDropFlagControl = NewControl( theWindow, &mFlagRect,
87ca8e ¤   ¤   ¤   ¤   "\p", FALSE, 1, 0, 1, kControlTriangleAutoToggleProc, 0 );
--3959 000132e24944012010c Page 3 of CResultsTable.cp
8c5465 ¤   pgpAssertAddrValid( mDownDropFlagControl, ControlRecord * );
3aefe6 }
4aaf5a
b1891e ¤   TableIndexT
3be56f CResultsTable::AddSummaryRow(void)
e2bb36 {
c47b3d ¤   TableIndexT¤¤   ¤   lastWideOpenRow;
7aaafd ¤   TableIndexT¤¤   ¤   parentRow;
d0cdbc ¤   ResultsTableItem¤   tableItem;
890273 ¤   TableIndexT¤¤   ¤   newRowIndex;
db67c5 ¤
5ca049 ¤   lastWideOpenRow = mCollapsableTree->CountNodes();
5467c5 ¤
de21bd ¤   parentRow = GetParentIndex( lastWideOpenRow );
409ee7 ¤   if( parentRow == 0 )
161841 ¤   ¤   parentRow = lastWideOpenRow;
fb1b52 ¤   ¤
5a5ed2 ¤   tableItem.itemType ¤¤   ¤   = kResultTypeSummaryItem;
86d055 ¤   tableItem.summary.numItems¤ = 0;
e267c5 ¤
187332 ¤   GetDateTime( &tableItem.summary.dateAndTime );
e467c5 ¤
15937e ¤   newRowIndex = InsertSiblingRows( 1, parentRow, &tableItem,
4da310 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( tableItem ), TRUE, Refresh_Yes );
6287c7 ¤   ¤   ¤
d60685 ¤   return( newRowIndex );
93efe6 }
46af5a
516d52 ¤   void
d69da5 CResultsTable::IncrementVerifiedCount(void)
b7bb36 {
a4cdbc ¤   ResultsTableItem¤   tableItem;
36c267 ¤   STableCell¤ ¤   ¤   wideOpenCell;
48f587 ¤   UInt32¤ ¤   ¤   ¤   dataSize;
5daafd ¤   TableIndexT¤¤   ¤   parentRow;
7b7040 ¤   TableIndexT¤¤   ¤   numRows;
53a874 ¤   TableIndexT¤¤   ¤   numColumns;
c867c5 ¤
341983 ¤   // Get the parent row
905826 ¤   GetWideOpenTableSize( numRows, numColumns );
8ec0e6 ¤   parentRow = GetParentIndex( numRows );
139ee7 ¤   if( parentRow == 0 )
c55be2 ¤   ¤   parentRow = numRows;
131b52 ¤   ¤
75e1ae ¤   // Update the parent item count
b267c5 ¤
aa47ae ¤   wideOpenCell.SetCell( parentRow, 1 );
374566 ¤   dataSize = sizeof( tableItem );
9fcb41 ¤   GetCellData( wideOpenCell, &tableItem, dataSize );
2167c5 ¤
b3f9bf ¤   pgpAssert( tableItem.itemType == kResultTypeSummaryItem );
054ec7 ¤   tableItem.summary.numItems += 1;
8ec390 ¤   SetCellData( wideOpenCell, &tableItem, sizeof( tableItem ) );
5f1b62 ¤   RefreshCell( wideOpenCell );
abefe6 }
8baf5a
8bb374 ¤   static short
7adc04 GetSignatureStatusStrIndex(
f110a5 ¤   PGPtoolsSignatureData¤  ¤   ¤   *signatureData,
4a4a11 ¤   const PGPSharedKeyProperties¤   *keyProperties)
2bbb36 {
b305f9 ¤   short¤  ¤   strIndex;
2067c5 ¤
7ff69c ¤   if ( signatureData->data.checked )
87c7a1 ¤   {
4e81fd ¤   ¤   strIndex = kVerifiedSignatureStrIndex;
57af5a
9c06a3 ¤   ¤   if ( keyProperties->isRevoked )
e65b34 ¤   ¤   {
365d6a ¤   ¤   ¤   strIndex = kVerifiedRevokedStrIndex;
f90fe4 ¤   ¤   }
138993 ¤   ¤   else if ( keyProperties->isExpired )
--9562 000aa7713274012010c Page 4 of CResultsTable.cp
e35b34 ¤   ¤   {
8ab60d ¤   ¤   ¤   strIndex = kVerifiedExpiredStrIndex;
580fe4 ¤   ¤   }
45337e ¤   ¤   else if ( keyProperties->isDisabled )
f75b34 ¤   ¤   {
d81911 ¤   ¤   ¤   strIndex = kVerifiedDisabledStrIndex;
1b0fe4 ¤   ¤   }
eaf277 ¤   ¤   else if ( keyProperties->isCorrupt )
665b34 ¤   ¤   {
7680fd ¤   ¤   ¤   strIndex = kVerifiedCorrputStrIndex;
5f0fe4 ¤   ¤   }
b89371 ¤   }
2134d2 ¤   else if( signatureData->signingKeyIDStr[0] != 0 )
e6c7a1 ¤   {
9205c3 ¤   ¤   strIndex = kCouldNotVerifyKeyIDStrIndex;
239371 ¤   }
290e24 ¤   else
b2c7a1 ¤   {
4b6df8 ¤   ¤   strIndex = kCouldNotVerifyStrIndex;
8d9371 ¤   }
a567c5 ¤
e567c5 ¤
fa7664 ¤   return( strIndex );
abefe6 }
adaf5a
6c6d52 ¤   void
097bee CResultsTable::AddProcessedItemRow(
d98dd6 ¤   ConstStr255Param¤   ¤   itemName,
233a9e ¤   PGPtoolsSignatureData¤  *signatureData)
4abb36 {
becdbc ¤   ResultsTableItem¤   tableItem;
12c267 ¤   STableCell¤ ¤   ¤   wideOpenCell;
0bc352 ¤   UInt32¤ ¤   ¤   ¤   numChildren;
5d0273 ¤   TableIndexT¤¤   ¤   newRowIndex;
34aafd ¤   TableIndexT¤¤   ¤   parentRow;
217040 ¤   TableIndexT¤¤   ¤   numRows;
40a874 ¤   TableIndexT¤¤   ¤   numColumns;
567d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
63c4bd ¤   Str255¤ ¤   ¤   ¤   statusText;
fc1df1 ¤   char¤   ¤   ¤   ¤   userID[256];
7347b4 ¤   short¤  ¤   ¤   ¤   statusTextStrIndex;
bd3805 ¤   PGPSharedKeyProperties¤ keyProperties;
b267c5 ¤
a6edc7 ¤   pgpAssertAddrValid( itemName, uchar );
9aa04a ¤   pgpAssertAddrValid( signatureData, PGPEventSignatureData );
c467c5 ¤
99bfab ¤   IncrementVerifiedCount();
511983 ¤   // Get the parent row
de5826 ¤   GetWideOpenTableSize( numRows, numColumns );
22c0e6 ¤   parentRow = GetParentIndex( numRows );
df9ee7 ¤   if( parentRow == 0 )
1c5be2 ¤   ¤   parentRow = numRows;
f81b52 ¤   ¤
d6d8c4 ¤   pgpClearMemory( &tableItem, sizeof( tableItem ) );
782ced ¤   pgpClearMemory( &keyProperties, sizeof( keyProperties ) );
5daf5a
1279c6 ¤   if( PGPKeyRefIsValid( signatureData->data.signingKey ) )
7fc7a1 ¤   {
e20300 ¤   ¤   // Get the primary user ID and key properties for the signing key:
a2cdb7 ¤   ¤   userID[0] = 0;
c31b52 ¤   ¤
126100 ¤   ¤   err¤= PGPGetPrimaryUserIDNameBuffer(
cfff96 ¤   ¤   ¤   ¤   ¤   signatureData->data.signingKey,
6baf44 ¤   ¤   ¤   ¤   ¤   sizeof( userID ), userID, NULL );
b59832 ¤   ¤   pgpAssertNoErr( err );
6a1b52 ¤   ¤
c26b9e ¤   ¤   err¤= PGPSharedGetKeyProperties( signatureData->data.signingKey,
fa18a1 ¤   ¤   ¤   ¤   ¤   userID, &keyProperties );
5a9832 ¤   ¤   pgpAssertNoErr( err );
539371 ¤   }
5767c5 ¤
aa034e ¤   statusTextStrIndex = GetSignatureStatusStrIndex( signatureData,
--c0de 00041f18b5e4012010c Page 5 of CResultsTable.cp
867b05 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyProperties );
a31b52 ¤   ¤
1c6cbb ¤   tableItem.itemType ¤¤   ¤   ¤   = kResultTypeSingleItem;
69640d ¤   tableItem.single.validity¤  ¤   = keyProperties.userValidity;
f6bb15 ¤   tableItem.single.signingDate¤   = signatureData->data.creationTime;
612c8b ¤   tableItem.single.validSignature¤= ( signatureData->data.checked &&
3500b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signatureData->data.verified );
dd0bc6 ¤   tableItem.single.badSignature¤  = ( signatureData->data.checked &&
520637 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ! signatureData->data.verified );
6967c5 ¤
32db96 ¤   if( tableItem.single.validSignature &&
4a0d06 ¤   ¤   signatureData->haveResourceFork &&
339b4a ¤   ¤   signatureData->didNotVerifyResourceFork )
3cc7a1 ¤   {
59e184 ¤   ¤   Str255¤ formatStr;
5c1b52 ¤   ¤
1047d4 ¤   ¤   GetIndString( formatStr, kResultsTableStringListResID,
524d85 ¤   ¤   ¤   ¤   ¤   kDataForkOnlyFormatStrIndex );
2e8c38 ¤   ¤   PrintPString( formatStr, formatStr, itemName );
f573d0 ¤   ¤   CopyPStringMax( formatStr, tableItem.single.itemName,
fe8d86 ¤   ¤   ¤   ¤   sizeof( tableItem.single.itemName ) - 1 );
9a9371 ¤   }
3c0e24 ¤   else
7cc7a1 ¤   {
8868aa ¤   ¤   CopyPStringMax( itemName, tableItem.single.itemName,
b18d86 ¤   ¤   ¤   ¤   sizeof( tableItem.single.itemName ) - 1 );
fb9371 ¤   }
fe1b52 ¤   ¤
8e5e82 ¤   GetIndString( statusText, kResultsTableStringListResID,
ee1270 ¤   ¤   ¤   ¤   statusTextStrIndex );
5267c5 ¤
ee1ba1 ¤   if( tableItem.single.validSignature )
e3c7a1 ¤   {
f1bfd2 ¤   ¤   tableItem.single.iconResID = kSignatureValidIconResID;
ef9371 ¤   }
c3b4e5 ¤   else if( tableItem.single.badSignature )
6cc7a1 ¤   {
af7c93 ¤   ¤   tableItem.single.iconResID = kSignatureBadIconResID;
399371 ¤   }
31af5a
266e4d ¤   if( statusTextStrIndex == kCouldNotVerifyKeyIDStrIndex )
bec7a1 ¤   {
b37ec2 ¤   ¤   Str255¤ keyIDStr;
031b52 ¤   ¤
8a9e6b ¤   ¤   CToPString( signatureData->signingKeyIDStr, keyIDStr );
4fff88 ¤   ¤   PrintPString( statusText, statusText, keyIDStr );
e59371 ¤   }
defeba ¤   else if( statusTextStrIndex != kCouldNotVerifyStrIndex )
61c7a1 ¤   {
6c11de ¤   ¤   Str255¤ pSignerID;
021b52 ¤   ¤
342cf5 ¤   ¤   CToPString( userID, pSignerID );
90009b ¤   ¤   PrintPString( statusText, statusText, pSignerID );
bb9371 ¤   }
da67c5 ¤
c56b27 ¤   CopyPStringMax( statusText, tableItem.single.statusText,
247134 ¤   ¤   ¤   ¤   sizeof( tableItem.single.statusText ) - 1 );
d267c5 ¤
57c306 ¤   // We do not call AddLastChildRow() because it does not return the index
d207ba ¤   // of the newly added row, which we need to set the row height.
2d67c5 ¤
cc646e ¤   numChildren = CountAllDescendents( parentRow );
dde724 ¤   if( numChildren == 0 )
37c7a1 ¤   {
c3f497 ¤   ¤   InsertChildRows( 1, parentRow, &tableItem,
0bdb37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( tableItem ), FALSE, Refresh_Yes );
c25ff5 ¤   ¤   newRowIndex = parentRow + 1;
c29371 ¤   }
f00e24 ¤   else
77c7a1 ¤   {
c98486 ¤   ¤   InsertSiblingRows( 1, parentRow + numChildren, &tableItem,
41db37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( tableItem ), FALSE, Refresh_Yes );
--55ea 000356cd7f64012010c Page 6 of CResultsTable.cp
d46736 ¤   ¤   newRowIndex = parentRow + numChildren + 1;
ab9371 ¤   }
7aaf5a
df39a3 ¤   STableCell¤ newCell( newRowIndex, 1 );
0667c5 ¤
aadb22 ¤   ScrollCellIntoFrame( newCell );
5d67c5 ¤
e94fc9 ¤   Refresh();
b2efe6 }
04af5a
946d52 ¤   void
bae111 CResultsTable::DrawSelf(void)
3abb36 {
c6c1e5 ¤   Rect ¤  frame;
3d67c5 ¤
cf67b9 ¤   CalcLocalFrameRect( frame );
a467c5 ¤
9cc7a1 ¤   {
4344fe ¤   ¤   StDeviceLoop¤   devLoop( frame );¤  ¤
f877ad ¤   ¤   SInt16¤ ¤   ¤   depth;
3eaf5a
993977 ¤   ¤   while( devLoop.NextDepth( depth ) )
2c5b34 ¤   ¤   {
3d9f36 ¤   ¤   ¤   SetThemeBackground( kThemeListViewBackgroundBrush, depth, depth > 1¶
4b54c8 ·);
6200ef ¤   ¤   ¤   EraseRect( &frame );
2a87c7 ¤   ¤   ¤
b71f85 ¤   ¤   ¤   CPGPHierarchyTable::DrawSelf();
120fe4 ¤   ¤   }
f59371 ¤   }
edefe6 }
d5af5a
1a6d52 ¤   void
8de839 CResultsTable::DrawCell(
9b1bb3 ¤   const STableCell¤   &inCell,
afc050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
99bb36 {
6b8a16 ¤   TableIndexT¤¤   ¤   wideOpenRow;
69f587 ¤   UInt32¤ ¤   ¤   ¤   dataSize;
d387b6 ¤   ResultsTableItem¤   item;
28c267 ¤   STableCell¤ ¤   ¤   wideOpenCell;
f98d1a ¤   SInt16¤ ¤   ¤   ¤   depth;
0431be ¤   StDeviceLoop¤   ¤   devLoop( inLocalRect );¤¤
c5af5a
bef481 ¤   wideOpenRow = mCollapsableTree->GetWideOpenIndex( inCell.row );
9467c5 ¤
eb6962 ¤   wideOpenCell.SetCell( wideOpenRow, inCell.col );
03f476 ¤   dataSize = sizeof( item );
c767c5 ¤
163693 ¤   GetCellData( wideOpenCell, &item, dataSize );
0167c5 ¤
55b111 ¤   while( devLoop.NextDepth( depth ) )
48c7a1 ¤   {
28cd31 ¤   ¤   // Draw divider line
4d8847 ¤   ¤   SetThemePen( kThemeListViewSeparatorBrush, depth, depth > 1 );
e7a925 ¤   ¤   MoveTo( inLocalRect.left, inLocalRect.bottom - 1 );
9425c3 ¤   ¤   LineTo( inLocalRect.right - 1, inLocalRect.bottom - 1 );
9c1b52 ¤   ¤
b02148 ¤   ¤   switch( item.itemType )
da5b34 ¤   ¤   {
f36f6b ¤   ¤   ¤   case kResultTypeSummaryItem:
981e1c ¤   ¤   ¤   ¤   DrawSummaryCell( inCell, &item.summary, &inLocalRect, depth );
86f622 ¤   ¤   ¤   ¤   break;
3b2b85 ¤   ¤   ¤   ¤
741f98 ¤   ¤   ¤   case kResultTypeSingleItem:
b9edbf ¤   ¤   ¤   ¤   DrawSingleItemCell( &item.single, &inLocalRect, depth );
22f622 ¤   ¤   ¤   ¤   break;
120fe4 ¤   ¤   }
be9371 ¤   }
45efe6 }
bd67c5 ¤
356d52 ¤   void
--a06e 000911e0aa24012010c Page 7 of CResultsTable.cp
2546be CResultsTable::DrawSummaryCell(
49b115 ¤   const STableCell¤   ¤   ¤   &inCell,
4efc46 ¤   const ResultsSummaryItem¤   *data,
779b48 ¤   const Rect¤ ¤   ¤   ¤   ¤   *cellRect,
1acd9a ¤   SInt16¤ ¤   ¤   ¤   ¤   ¤   bitDepth)
6cbb36 {
55af7c ¤   Rect¤   ¤   textRect;
5cd744 ¤   Str255¤ ¤   theText;
61881d ¤   Str255¤ ¤   tempStr;
b305f9 ¤   short¤  ¤   strIndex;
1a5599 ¤   TableIndexT¤wideOpenRow;
0767c5 ¤
e4f481 ¤   wideOpenRow = mCollapsableTree->GetWideOpenIndex( inCell.row );
71af5a
3f5c65 ¤   SetThemeBackground( kThemeListViewBackgroundBrush, bitDepth, bitDepth > 1 );
c75355 ¤   DrawDropFlag( inCell, wideOpenRow );
48af5a
128e83 ¤   UTextTraits::SetPortTextTraits( kSummaryItemTextTraitsResID );
7c062f ¤   SetThemeTextColor( kThemeListViewTextColor, bitDepth, bitDepth > 1 );
9367c5 ¤
6a0bb5 ¤   if( data->numItems == 1 )
f8c7a1 ¤   {
604a30 ¤   ¤   strIndex = kVerifiedOneItemStrIndex;
ca9371 ¤   }
f60e24 ¤   else
e1c7a1 ¤   {
1fdc2c ¤   ¤   strIndex = kVerifiedNItemsStrIndex;
6a9371 ¤   }
6767c5 ¤
35588f ¤   GetIndString( theText, kResultsTableStringListResID, strIndex );
7f67c5 ¤
8bbb9e ¤   NumToString( data->numItems, tempStr );
1c7d37 ¤   PrintPString( theText, theText, tempStr );
a367c5 ¤
42577d ¤   IUDateString( data->dateAndTime, shortDate, tempStr );
277d37 ¤   PrintPString( theText, theText, tempStr );
24af5a
4f4389 ¤   IUTimeString( data->dateAndTime, FALSE, tempStr );
0d7d37 ¤   PrintPString( theText, theText, tempStr );
cc67c5 ¤
38b5a4 ¤   textRect ¤  ¤   = *cellRect;
d507b4 ¤   textRect.left ¤ += kDropFlagMargin;
a75e97 ¤   textRect.bottom¤= textRect.top + mSummaryItemFontInfo.ascent +
775041 ¤   ¤   ¤   ¤   ¤   ¤   mSummaryItemFontInfo.descent +
216962 ¤   ¤   ¤   ¤   ¤   ¤   mSummaryItemFontInfo.leading;
8467c5 ¤
087dd1 ¤   AlignRect( cellRect, &textRect, kAlignAtVerticalCenter );
b067c5 ¤
2a4e92 ¤   MoveTo( textRect.left, textRect.bottom - mSummaryItemFontInfo.descent );
8f9a38 ¤   DrawString( theText );
81efe6 }
d4af5a
d06d52 ¤   void
8202c1 CResultsTable::DrawValidity(
f04173 ¤   PGPValidity¤¤   validity,
42c05f ¤   const Rect¤ ¤   *columnRect)
88bb36 {
77598a ¤   Rect¤   ¤   ¤   validityRect = *columnRect;
d555cb ¤   ColorPenState¤  saveState;
4067c5 ¤
5fc6a0 ¤   GetColorAndPenState( &saveState );
4d67c5 ¤
8de49f ¤   if( mShowMarginalValidity )
7ec7a1 ¤   {
636020 ¤   ¤   ushort¤ ¤   barPercent;
a33e35 ¤   ¤   RGBColor¤   validityColor = { 0xCCCC, 0xCCCC, 0xFFFF };
6f1b52 ¤   ¤
8b7f33 ¤   ¤   // Draw the validity
361b52 ¤   ¤
011dad ¤   ¤   RGBForeColor( &UGAColorRamp::GetBlackColor() );
95c5bd ¤   ¤   FrameRect( &validityRect );
9142ed ¤   ¤   InsetRect( &validityRect, 1, 1 );
--2aa2 000463aba8d4012010c Page 8 of CResultsTable.cp
e0af5a
9105dc ¤   ¤   RGBForeColor( &validityColor );
b49bc0 ¤   ¤   PaintRect( &validityRect );
191b52 ¤   ¤
038f6f ¤   ¤   switch( validity )
7c5b34 ¤   ¤   {
419a8e ¤   ¤   ¤   case kPGPValidity_Complete:
d05396 ¤   ¤   ¤   ¤   barPercent = 100;
0ef622 ¤   ¤   ¤   ¤   break;
0c2b85 ¤   ¤   ¤   ¤
1d3a38 ¤   ¤   ¤   case kPGPValidity_Marginal:
ddad05 ¤   ¤   ¤   ¤   barPercent = 50;
b9f622 ¤   ¤   ¤   ¤   break;
80af5a
1cdb68 ¤   ¤   ¤   default:
76b23d ¤   ¤   ¤   ¤   barPercent = 0;
05f622 ¤   ¤   ¤   ¤   break;
2e0fe4 ¤   ¤   }
d92b85 ¤   ¤   ¤   ¤
ee6abb ¤   ¤   validityRect.right = validityRect.left +
1dd7d0 ¤   ¤   ¤   ¤   ¤   (( UGraphicUtils::RectWidth( validityRect ) *·
1862ba ¤   ¤   ¤   ¤   ¤   barPercent ) / 100 );
eaae30 ¤   ¤   ¤   ¤   ¤
36ad3f ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Gray9 ) );
c39bc0 ¤   ¤   PaintRect( &validityRect );
289371 ¤   }
a30e24 ¤   else
05c7a1 ¤   {
6a6e78 ¤   ¤   ResID¤  ¤   iconResID;
1367b3 ¤   ¤   RGBColor¤   tempColor;
ff1b52 ¤   ¤
04727b ¤   ¤   if( validity == kPGPValidity_Complete )
585b34 ¤   ¤   {
12cafd ¤   ¤   ¤   iconResID = kValidKeyIconResID;
bd0fe4 ¤   ¤   }
71c755 ¤   ¤   else if( validity == kPGPValidity_Marginal )
525b34 ¤   ¤   {
32bfa5 ¤   ¤   ¤   if( mMarginalIsInvalid )
19f776 ¤   ¤   ¤   {
418c91 ¤   ¤   ¤   ¤   iconResID = kInvalidKeyIconResID;
5fa3a6 ¤   ¤   ¤   }
abbb8c ¤   ¤   ¤   else
a5f776 ¤   ¤   ¤   {
41d2ad ¤   ¤   ¤   ¤   iconResID = kValidKeyIconResID;
c6a3a6 ¤   ¤   ¤   }
c60fe4 ¤   ¤   }
8d0e1d ¤   ¤   else
cd5b34 ¤   ¤   {
a9c3af ¤   ¤   ¤   iconResID = kInvalidKeyIconResID;
530fe4 ¤   ¤   }
f21b52 ¤   ¤
b721ff ¤   ¤   validityRect.bottom = validityRect.top + 16;
a0b2f5 ¤   ¤   validityRect.right ¤= validityRect.left + 16;
c5d017 ¤   ¤   AlignRect( columnRect, &validityRect, kAlignAtAbsoluteCenter );
471b52 ¤   ¤
d47e90 ¤   ¤   tempColor = UGAColorRamp::GetWhiteColor();
e92efa ¤   ¤   RGBBackColor( &tempColor );
9caf5a
80a418 ¤   ¤   PlotIconID( &validityRect, kAlignNone,
7edd30 ¤   ¤   ¤   ¤   IsEnabled() ? kTransformNone : kTransformDisabled,
c66293 ¤   ¤   ¤   ¤   iconResID );
969371 ¤   }
bfaf5a
bf21d4 ¤   SetColorAndPenState( &saveState );
6befe6 }
2baf5a
236d52 ¤   void
ec985b CResultsTable::DrawSingleItemCell(
ff42c2 ¤   const ResultsSingleItem¤¤   *data,
359b48 ¤   const Rect¤ ¤   ¤   ¤   ¤   *cellRect,
b7cd9a ¤   SInt16¤ ¤   ¤   ¤   ¤   ¤   bitDepth)
46bb36 {
--1370 000ae76e2354012010c Page 9 of CResultsTable.cp
02af7c ¤   Rect¤   ¤   textRect;
91881d ¤   Str255¤ ¤   tempStr;
c1b74b ¤   Rect¤   ¤   iconRect;
b395a9 ¤   Rect¤   ¤   nameRect;
32d3d1 ¤   Rect¤   ¤   statusRect;
7341ea ¤   Rect¤   ¤   validityRect;
29cffd ¤   Rect¤   ¤   signingDateRect;
623d16 ¤   ushort¤ ¤   maxTextWidth;
715b89 ¤   ushort¤ ¤   textBaseLine;
8167c5 ¤
653621 ¤   (void) bitDepth;
5067c5 ¤
23f96a ¤   UTextTraits::SetPortTextTraits( kSingleItemTextTraitsResID );
712e4b ¤   SetThemeTextColor( kThemeListViewTextColor, bitDepth, ( bitDepth > 1 ) );
1baf5a
61f245 ¤   // Align the text vertically within the cell.
1db5a4 ¤   textRect ¤  ¤   = *cellRect;
9aa50e ¤   textRect.bottom¤= textRect.top + mSingleItemFontInfo.ascent +
579c31 ¤   ¤   ¤   ¤   ¤   ¤   mSingleItemFontInfo.descent +
3c4508 ¤   ¤   ¤   ¤   ¤   ¤   mSingleItemFontInfo.leading;
fd67c5 ¤
c47dd1 ¤   AlignRect( cellRect, &textRect, kAlignAtVerticalCenter );
dedd64 ¤   textBaseLine = textRect.bottom - mSingleItemFontInfo.descent;
2467c5 ¤
220ec7 ¤   CResultsWindow::CalcColumnBounds( &textRect, &iconRect, &nameRect,
8bb047 ¤   ¤   ¤   &statusRect, &validityRect, &signingDateRect );
1967c5 ¤
d36f7d ¤   if( data->iconResID != 0 )
edc7a1 ¤   {
01b712 ¤   ¤   // This code assumes that mini icons are 12x16.·
7fb648 ¤   ¤   iconRect.bottom = iconRect.top + 12;
a2af5a
b30177 ¤   ¤   AlignRect( cellRect, &iconRect, kAlignAtVerticalCenter );
65b2b6 ¤   ¤   PlotIconID( &iconRect, atNone, ttNone, data->iconResID );
219371 ¤   }
c367c5 ¤
479b20 ¤   // Draw the item name
5c6d07 ¤   CopyPString( data->itemName, tempStr );
8f67c5 ¤
df82e6 ¤   maxTextWidth = UGraphicUtils::RectWidth( nameRect );
829a63 ¤   if( StringWidth( tempStr ) > maxTextWidth )
c9c7a1 ¤   {
d5c61d ¤   ¤   TruncString( maxTextWidth, tempStr, smTruncMiddle );
b19371 ¤   }
5167c5 ¤
7cb211 ¤   MoveTo( nameRect.left, textBaseLine );
6234a5 ¤   DrawString( tempStr );
1367c5 ¤
9d81d4 ¤   // Draw the signer ID or status
a667c5 ¤
e227f3 ¤   CopyPString( data->statusText, tempStr );
00af5a
d5acd2 ¤   maxTextWidth = UGraphicUtils::RectWidth( statusRect );
639a63 ¤   if( StringWidth( tempStr ) > maxTextWidth )
89c7a1 ¤   {
c2c61d ¤   ¤   TruncString( maxTextWidth, tempStr, smTruncMiddle );
a99371 ¤   }
6d67c5 ¤
022da4 ¤   MoveTo( statusRect.left, textBaseLine );
0634a5 ¤   DrawString( tempStr );
0eaf5a
f8f96a ¤   UTextTraits::SetPortTextTraits( kSingleItemTextTraitsResID );
7167c5 ¤
e325b0 ¤   if( data->validSignature )
19c7a1 ¤   {
0d2128 ¤   ¤   validityRect.bottom = validityRect.top + kValidityBarHeight;
f1d148 ¤   ¤   AlignRect( cellRect, &validityRect, kAlignAtVerticalCenter );
f01b52 ¤   ¤
305c63 ¤   ¤   DrawValidity( data->validity, &validityRect );
399371 ¤   }
f2af5a
ae7c5c ¤   // Draw the signing date
--f3b4 00019d1f6624012010c Page 10 of CResultsTable.cp
f86aed ¤   if( data->badSignature )
3bc7a1 ¤   {
d8847e ¤   ¤   GetIndString( tempStr, kResultsTableStringListResID,
1b57c0 ¤   ¤   ¤   ¤   kBadSignatureStrIndex );
789371 ¤   }
e80e24 ¤   else
ebc7a1 ¤   {
6b20e0 ¤   ¤   IUDateString( PGPTimeToMacTime( data->signingDate ), shortDate,
825a73 ¤   ¤   ¤   ¤   ¤   tempStr );
f89371 ¤   }
6367c5 ¤
e5fd80 ¤   maxTextWidth = UGraphicUtils::RectWidth( signingDateRect );
b59a63 ¤   if( StringWidth( tempStr ) > maxTextWidth )
0ec7a1 ¤   {
1e686a ¤   ¤   TruncString( maxTextWidth, tempStr, smTruncEnd );
f59371 ¤   }
fbaf5a
f7f881 ¤   MoveTo( signingDateRect.left, textBaseLine );
7334a5 ¤   DrawString( tempStr );
95efe6 }
32af5a
046d52 ¤   void
a7def6 CResultsTable::AdaptToSuperFrameSize(
6f4ed6 ¤   Int32¤  inSurrWidthDelta,
08944a ¤   Int32¤  inSurrHeightDelta,
e7cde0 ¤   Boolean¤inRefresh)
b4bb36 {
14df7f ¤   // Resize the single column to fit to the width of the window.
e3af5a
f58dfd ¤   CPGPHierarchyTable::AdaptToSuperFrameSize( inSurrWidthDelta,
3f1b6c ¤   ¤   ¤   ¤   inSurrHeightDelta, inRefresh );
5a2b85 ¤   ¤   ¤   ¤
c935a5 ¤   SetColWidth( GetColWidth( 1 ) + inSurrWidthDelta, 1, 1 );
67efe6 }
87af5a
f86d52 ¤   void
c84c74 CResultsTable::DrawDropFlag(
bb1bb3 ¤   const STableCell¤   &inCell,
cb7964 ¤   TableIndexT¤¤   ¤   inWideOpenRow)
87bb36 {
7a3074 ¤   if( mCollapsableTree->IsCollapsable( inWideOpenRow ) )
41c7a1 ¤   {
8c57cf ¤   ¤   Rect¤   ¤   ¤   flagRect;
f2da04 ¤   ¤   ControlHandle¤  theControl;
28e912 ¤   ¤   Rect¤   ¤   ¤   clipRect = { 0, 0, 0, 0 };
944776 ¤   ¤   StClipRgnState¤ saveClip( clipRect );
dc1b52 ¤   ¤
e1c30c ¤   ¤   CalcCellFlagRect( inCell, flagRect );
981b52 ¤   ¤
0f22f6 ¤   ¤   theControl = mCollapsableTree->IsExpanded( inWideOpenRow ) ?
c3dbf4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mDownDropFlagControl : mRightDropFlagControl;
ef531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
391b49 ¤   ¤   MoveControl( theControl, flagRect.left, flagRect.top );
5a1b52 ¤   ¤
a3c88f ¤   ¤   SetControlVisibility( theControl, TRUE, TRUE );
9d1b52 ¤   ¤
e4af11 ¤   ¤   // We have to play clipping games because the control manager wants
a1ad75 ¤   ¤   // to animate the control when it is first shown.
7e1b52 ¤   ¤
8b5eb2 ¤   ¤   saveClip.Restore();
342f13 ¤   ¤   DrawOneControl( theControl );
791b52 ¤   ¤
dcc53f ¤   ¤   SetControlVisibility( theControl, FALSE, FALSE );
a39371 ¤   }
b5efe6 }
44af5a
2c6d52 ¤   void
b8f71c CResultsTable::ClickSelf(
563ba4 ¤   const SMouseDownEvent¤  &inMouseDown)
6abb36 {
faee5d ¤   STableCell¤ hitCell;
192dc5 ¤   SPoint32¤   imagePt;
--594c 000727330614012010c Page 11 of CResultsTable.cp
2a67c5 ¤
8327f5 ¤   LocalToImagePoint(inMouseDown.whereLocal, imagePt);
fc67c5 ¤
d8f810 ¤   if (GetCellHitBy(imagePt, hitCell))
f0c7a1 ¤   {
f68516 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Click is inside hitCell
301a25 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Check if click is inside DropFlag
55c847 ¤   ¤   TableIndexT¤woRow = mCollapsableTree->GetWideOpenIndex(hitCell.row);
1cfd09 ¤   ¤   Rect¤   flagRect;
431b52 ¤   ¤
6f6eb5 ¤   ¤   CalcCellFlagRect(hitCell, flagRect);
c41b52 ¤   ¤
ef7757 ¤   ¤   if (mCollapsableTree->IsCollapsable(woRow) &&
c5e04f ¤   ¤   ¤   ::PtInRect(inMouseDown.whereLocal, &flagRect))
3e5b34 ¤   ¤   {
af1f51 ¤   ¤   ¤   ControlHandle¤  theControl;
de94eb ¤   ¤   ¤   short¤  ¤   ¤   oldValue;
b1c026 ¤   ¤   ¤   Boolean¤¤   ¤   expanded = mCollapsableTree->IsExpanded(woRow);
fcfa73 ¤   ¤   ¤   short¤  ¤   ¤   bitDepth;
928348 ¤   ¤   ¤   Boolean¤¤   ¤   switched;
fdce83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Click is inside DropFlag
9f6e91 ¤   ¤   ¤   FocusDraw();
1bc96d ¤   ¤   ¤   StDeviceLoop¤   loop( flagRect );
3c87c7 ¤   ¤   ¤
026f61 ¤   ¤   ¤   while( loop.NextDepth( bitDepth ) )
dcf776 ¤   ¤   ¤   {
8880dd ¤   ¤   ¤   ¤   SetThemeBackground( kThemeListViewBackgroundBrush, bitDepth,
654aae ¤   ¤   ¤   ¤   ¤   ¤   bitDepth > 1 );
13a3a6 ¤   ¤   ¤   }
c387c7 ¤   ¤   ¤
76f0cf ¤   ¤   ¤   if( expanded )
aef776 ¤   ¤   ¤   {
c54b9c ¤   ¤   ¤   ¤   theControl ¤= mDownDropFlagControl;
cbb341 ¤   ¤   ¤   ¤   oldValue¤   = 1;
e5a3a6 ¤   ¤   ¤   }
12bb8c ¤   ¤   ¤   else
41f776 ¤   ¤   ¤   {
1b0a63 ¤   ¤   ¤   ¤   theControl ¤= mRightDropFlagControl;
dce99d ¤   ¤   ¤   ¤   oldValue¤   = 0;
9ea3a6 ¤   ¤   ¤   }
f894aa ¤   ¤   ¤   ¤   ¤   ¤
ce2627 ¤   ¤   ¤   MoveControl( theControl, flagRect.left, flagRect.top );
c40f77 ¤   ¤   ¤   SetControlVisibility( theControl, TRUE, FALSE );
cc87c7 ¤   ¤   ¤
1dd806 ¤   ¤   ¤   switched = ( TrackControl( theControl, inMouseDown.whereLocal,
89a88b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NULL ) != oldValue );
b587c7 ¤   ¤   ¤
84273f ¤   ¤   ¤   SetControlVisibility( theControl, FALSE, FALSE );
ef87c7 ¤   ¤   ¤
0af875 ¤   ¤   ¤   // Restore the control's value
e8a294 ¤   ¤   ¤   SetControlValue( theControl, oldValue );
3cf269 ¤   ¤   ¤   SetControlData( theControl, kControlNoPart,
78ef15 ¤   ¤   ¤   ¤   ¤   kControlTriangleLastValueTag,
5625fc ¤   ¤   ¤   ¤   ¤   sizeof( oldValue ), (Ptr) &oldValue );
6daf5a
86c0f5 ¤   ¤   ¤   if (switched) {
dc60c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Mouse released inside DropFlag
282880 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··so toggle the Row
3702c0 ¤   ¤   ¤   ¤   if (inMouseDown.macEvent.modifiers & optionKey) {
561fce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // OptionKey down means to do
8dbdb2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··a deep collapse/expand¤¤   ¤   ¶
0787c7 ¤   ¤   ¤
45f999 ¤   ¤   ¤   ¤   ¤   if (expanded) {
59f5d3 ¤   ¤   ¤   ¤   ¤   ¤   DeepCollapseRow(woRow);
f581a1 ¤   ¤   ¤   ¤   ¤   } else {
b93789 ¤   ¤   ¤   ¤   ¤   ¤   DeepExpandRow(woRow);
1b1c89 ¤   ¤   ¤   ¤   ¤   }
182b85 ¤   ¤   ¤   ¤
21ad6c ¤   ¤   ¤   ¤   } else {¤   ¤   ¤   ¤   // Shallow collapse/expand
97f999 ¤   ¤   ¤   ¤   ¤   if (expanded) {
696740 ¤   ¤   ¤   ¤   ¤   ¤   CollapseRow(woRow);
7281a1 ¤   ¤   ¤   ¤   ¤   } else {
--ca85 001c2f84ded4012010c Page 12 of CResultsTable.cp
ed9b12 ¤   ¤   ¤   ¤   ¤   ¤   ExpandRow(woRow);
421c89 ¤   ¤   ¤   ¤   ¤   }
8f2613 ¤   ¤   ¤   ¤   }
31a3a6 ¤   ¤   ¤   }
af67c5 ¤
497b4c ¤   ¤   } else if (ClickSelect(hitCell, inMouseDown)) {
2801d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Click outside of the DropFlag
c216b2 ¤   ¤   ¤   ClickCell(hitCell, inMouseDown);
2f0fe4 ¤   ¤   }
681b52 ¤   ¤
5ef8d7 ¤   } else {¤   ¤   ¤   ¤   ¤   ¤   ¤   // Click is outside of any Cell
a3b62c ¤   ¤   UnselectAllCells();
dd9371 ¤   }
c2efe6 }
--d153 0019ac404d54012010d Page 1 of CResultsTable.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
f449e3 ¤   $Id: CResultsTable.h,v 1.11.2.1.2.1 1998/11/12 03:09:24 heller Exp $
07f7f7 ____________________________________________________________________________*/
f0af5a
6a7b7d #pragma once
3caf5a
1c1a11 #include "CPGPHierarchyTable.h"
503a6b #include "PGPtools.h"
f1f8d2 #include "PGPSharedEncryptDecrypt.h"
2daf5a
1ab73f struct ResultsSingleItem;
b1fd72 struct ResultsSummaryItem;
caaf5a
2b80f6 class CResultsTable : public CPGPHierarchyTable
cdbb36 {
d55ed4 public:
f84bde ¤   enum ¤  ¤   ¤   ¤   { class_ID = 'ResT' };
76af5a
0ddea3 ¤   ¤   ¤   ¤   ¤   ¤   CResultsTable(LStream *inStream);
3ff779 ¤   virtual¤¤   ¤   ¤   ~CResultsTable(void);
5a67c5 ¤
7451ed ¤   virtual void¤   ¤   AdaptToSuperFrameSize(Int32 inSurrWidthDelta,
ccf1bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32 inSurrHeightDelta,
ea71bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inRefresh);
f7e705 ¤   TableIndexT¤¤   ¤   AddSummaryRow(void);
f143ba ¤   void¤   ¤   ¤   ¤   AddProcessedItemRow(ConstStr255Param itemName,
e5a7d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtoolsSignatureData *signatureData);
82e40b ¤   virtual void¤   ¤   DrawSelf(void);
9fdb44 ¤   void¤   ¤   ¤   ¤   IncrementVerifiedCount(void);
101b52 ¤   ¤
22a2d3 protected:
dfaf5a
ed1b52 ¤   ¤
1e83ca ¤   virtual void¤   ¤   ClickSelf(const SMouseDownEvent¤&inMouseDown);
3dd43f ¤   virtual void¤   ¤   DrawCell(const STableCell &inCell,
147391 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect &inLocalRect);
becc08 ¤   virtual void¤   ¤   DrawDropFlag(const STableCell &inCell,
d3eeae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TableIndexT inWideOpenRow);
d6febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
3667c5 ¤
410fb9 private:
7daf5a
dfc299 ¤   FontInfo¤   ¤   ¤   mSummaryItemFontInfo;
7143cb ¤   FontInfo¤   ¤   ¤   mSingleItemFontInfo;
d53a88 ¤   PGPBoolean¤ ¤   ¤   mShowMarginalValidity;
69adf5 ¤   PGPBoolean¤ ¤   ¤   mMarginalIsInvalid;
c9c657 ¤   ControlHandle¤  ¤   mRightDropFlagControl;
7123f6 ¤   ControlHandle¤  ¤   mDownDropFlagControl;
a567c5 ¤
37953d ¤   void¤   ¤   ¤   ¤   DrawSingleItemCell(const ResultsSingleItem *data,
c90e10 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect *cellRect, SInt16 bitDepth);
5fcf02 ¤   void¤   ¤   ¤   ¤   DrawSummaryCell(const STableCell &inCell,
9dfd23 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const ResultsSummaryItem *data,
470e10 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect *cellRect, SInt16 bitDepth);
642dbc ¤   void¤   ¤   ¤   ¤   DrawValidity(PGPValidity validity,
441cda ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect *columnRect);
9abf26 };¶
--7bb8 00019ff77614012010e Page 1 of CResultsWindow.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
cdf200 ¤   $Id: CResultsWindow.cp,v 1.12.8.1 1998/11/12 03:09:25 heller Exp $
62f7f7 ____________________________________________________________________________*/
a7af5a
ed531e #include <MacWindows.h>
c1af5a
e6b125 #include <LBevelButton.h>
4add56 #include <PP_Messages.h>
f2ffe3 #include <UGraphicUtils.h>
1ff8a6 #include <UTextTraits.h>
dcaf5a
2bb86a #include "MacQuickdraw.h"
abaf5a
d3133f #include "PGPtoolsResources.h"
c5af5a
0ca4d3 #include "CResultsTable.h"
fd6d1f #include "CResultsWindow.h"
5aaf5a
e0ad85 const PaneIDT¤  kResultsTablePaneID ¤   ¤   ¤   = 5002;
e7ed19 const ResIDT¤   kColumnTitlesTextTraitsResID¤   = 135;
e8af5a
a8cf2f const PaneIDT¤  kNameColumnButtonPaneID¤¤   ¤   = 'NBtn';
c8825e const PaneIDT¤  kSignerColumnButtonPaneID¤  ¤   = 'SBtn';
26f596 const PaneIDT¤  kValidityColumnButtonPaneID¤¤   = 'VBtn';
064623 const PaneIDT¤  kDateColumnButtonPaneID¤¤   ¤   = 'DBtn';
bbaf5a
ddbe8e const ushort¤   kIconColumnLeftMargin¤  ¤   = 20;
1d8bb5 const ushort¤   kNameColumnLeftMargin¤  ¤   = 42;
68f291 const ushort¤   kNameColumnRightMargin¤ ¤   = 5;
bc185e const ushort¤   kSignerColumnLeftMargin¤¤   = 5;
d438e9 const ushort¤   kSignerColumnRightMargin¤   = 5;
0e4673 const ushort¤   kValidityColumnLeftMargin¤  = 5;
2e5520 const ushort¤   kValidityColumnRightMargin¤ = 5;
811534 const ushort¤   kDateColumnLeftMargin¤  ¤   = 5;
bb8f1e const ushort¤   kDateColumnRightMargin¤ ¤   = 5;
5baf5a
886aac const ushort¤   kMaxNameColumnWidth¤¤   ¤   = 250;
25dd77 const ushort¤   kMinNameColumnWidth¤¤   ¤   = 80;
bcaf5a
adaf5a
4a31c7 static CResultsWindow¤  *gResultsWindow;
f0af5a
6d4240 LBevelButton¤   *CResultsWindow::mNameColumnButton;
964113 LBevelButton¤   *CResultsWindow::mSignerColumnButton;
8f61c4 LBevelButton¤   *CResultsWindow::mValidityColumnButton;
b93b8c LBevelButton¤   *CResultsWindow::mDateColumnButton;
25af5a
b6acc8 CResultsWindow::CResultsWindow(LStream *inStream)
adfbc4 ¤   : CPGPtoolsWindow( inStream )
d0bb36 {
ec28e8 ¤   pgpAssert( gResultsWindow == nil );
f167c5 ¤
dacd59 ¤   gResultsWindow ¤¤   = this;
636aba ¤   mHaveSignatures¤¤   = FALSE;
285642 ¤   mPendingNewSummary¤ = FALSE;
a6efe6 }
42af5a
26b4f7 CResultsWindow::~CResultsWindow(void)
27bb36 {
f0efe6 }
30af5a
9e6d52 ¤   void
416d11 CResultsWindow::FinishCreateSelf(void)
52bb36 {
936221 ¤   CPGPtoolsWindow::FinishCreateSelf();
4b67c5 ¤
f284a2 ¤   SetThemeWindowBackground( GetMacPort(), kThemeListViewBackgroundBrush, FALS¶
480a50 E );
1967c5 ¤
--6e4c 000065384f34012010e Page 2 of CResultsWindow.cp
2522c2 ¤   mResultsTable = (CResultsTable *) FindPaneByID( kResultsTablePaneID );
a15b2f ¤   pgpAssertAddrValid( mResultsTable, VoidAlign );
beaf5a
8f1914 ¤   mNameColumnButton = (LBevelButton *)
9c7def ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID( kNameColumnButtonPaneID );
d20b21 ¤   pgpAssertAddrValid( mNameColumnButton, VoidAlign );
dfaf5a
3be4cb ¤   mSignerColumnButton = (LBevelButton *)
1a0796 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID( kSignerColumnButtonPaneID );
ad382d ¤   pgpAssertAddrValid( mSignerColumnButton, VoidAlign );
02af5a
f768c2 ¤   mValidityColumnButton = (LBevelButton *)
6dd736 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID( kValidityColumnButtonPaneID );
da3c53 ¤   pgpAssertAddrValid( mValidityColumnButton, VoidAlign );
e3af5a
e1f924 ¤   mDateColumnButton = (LBevelButton *)
05b8eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID( kDateColumnButtonPaneID );
ef73bf ¤   pgpAssertAddrValid( mDateColumnButton, VoidAlign );
37af5a
6c6fc3 ¤   UTextTraits::SetPortTextTraits( kColumnTitlesTextTraitsResID );
1e88c6 ¤   GetFontInfo( &mTitlesFontInfo );
e667c5 ¤
b7c52c ¤   // Force synchronization of column buttons
82efa4 ¤   ResizeWindowBy( 1, 0 );
4af2d8 ¤   ResizeWindowBy( -1, 0 );¤
8cefe6 }
a7af5a
806d52 ¤   void
827f3c CResultsWindow::Click(SMouseDownEvent &inMouseDown)
8cbb36 {
aacf4b ¤   LPane¤  *clickedPane;
0367c5 ¤
dc34a5 ¤   // Our columnn titles are buttons which do not respond to clicks.
008f89 ¤   // Filter out clicks to these buttons here.
6f67c5 ¤
89e2e9 ¤   clickedPane = FindSubPaneHitBy( inMouseDown.wherePort.h,
a652fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inMouseDown.wherePort.v);
720d70 ¤   if( clickedPane != mNameColumnButton &&
5e5778 ¤   ¤   clickedPane != mSignerColumnButton &&
c0cfaf ¤   ¤   clickedPane != mValidityColumnButton &&
1ed91e ¤   ¤   clickedPane != mDateColumnButton )
81c7a1 ¤   {
4220e2 ¤   ¤   CPGPtoolsWindow::Click( inMouseDown );
1a9371 ¤   }
efefe6 }
7caf5a
296d52 ¤   void
cfcd1c CResultsWindow::ApplyForeAndBackColors(void) const
59bb36 {
64d4e7 ¤   SetThemeWindowBackground( GetMacPort(),
1b9592 ¤   ¤   ¤   ¤   kThemeListViewBackgroundBrush, FALSE );
7befe6 }
3baf5a
ef6d52 ¤   void
e28446 CResultsWindow::AttemptClose(void)
dbbb36 {
368cf5 ¤   Hide();
acefe6 }
35af5a
646d52 ¤   void
3cf77d CResultsWindow::DoClose(void)
6fbb36 {
2d8cf5 ¤   Hide();
d4efe6 }
a6af5a
416d52 ¤   void
cbcec3 CResultsWindow::GetColumnTitlesRect(Rect *titlesRect)
04bb36 {
ac0899 ¤   Rect¤   tableRect;
3b67c5 ¤
b75b53 ¤   CalcPortFrameRect( *titlesRect );
06fb54 ¤   mResultsTable->CalcPortFrameRect( tableRect );
--9416 000c671b02d4012010e Page 3 of CResultsWindow.cp
e0af5a
36cef6 ¤   titlesRect->bottom ¤= tableRect.top - 1;
7ef90c ¤   titlesRect->right¤  = tableRect.right;
67efe6 }
6aaf5a
e26d52 ¤   void
044359 CResultsWindow::ResizeFrameBy(
85f533 ¤   Int16¤  ¤   inWidthDelta,
532452 ¤   Int16¤  ¤   inHeightDelta,
cd5161 ¤   Boolean¤¤   inRefresh)
49bb36 {
cadf7f ¤   // Resize the single column to fit to the width of the window.
d4af5a
7f9d90 ¤   // Force redraw of the column titles.¤
3967c5 ¤
23ea35 ¤   CPGPtoolsWindow::ResizeFrameBy( inWidthDelta, inHeightDelta,
dbe147 ¤   ¤   ¤   ¤   inRefresh );¤
94af5a
a09ecb ¤   FocusDraw();
c867c5 ¤
e3f037 ¤   if( inWidthDelta != 0 )
4cc7a1 ¤   {
38d8da ¤   ¤   Rect¤   titleRect;
35ef65 ¤   ¤   Rect¤   windowRect;
80674d ¤   ¤   Rect¤   validityButtonRect;
344c8a ¤   ¤   Rect¤   nameButtonRect;
0bcb51 ¤   ¤   Rect¤   signerButtonRect;
d8d40c ¤   ¤   Rect¤   newSignerButtonRect;
ab3d94 ¤   ¤   ushort¤ nameWidth;
901b52 ¤   ¤
2cb54d ¤   ¤   GetColumnTitlesRect( &titleRect );
b6ec69 ¤   ¤   CalcPortFrameRect( windowRect );
ae1b52 ¤   ¤
0e7f5b ¤   ¤   windowRect.bottom = titleRect.bottom;
666968 ¤   ¤   InvalRect( &windowRect );
531b52 ¤   ¤
34331e ¤   ¤   mValidityColumnButton->CalcPortFrameRect( validityButtonRect );
d600b4 ¤   ¤   mNameColumnButton->CalcPortFrameRect( nameButtonRect );
be33c5 ¤   ¤   mSignerColumnButton->CalcPortFrameRect( signerButtonRect );
b2af5a
9bc9c9 ¤   ¤   nameWidth = ( validityButtonRect.left - nameButtonRect.left ) * 0.4;
d9ff25 ¤   ¤   if( nameWidth > kMaxNameColumnWidth )
0d5b34 ¤   ¤   {
f44517 ¤   ¤   ¤   nameWidth = kMaxNameColumnWidth;
780fe4 ¤   ¤   }
35a2a2 ¤   ¤   else if( nameWidth < kMinNameColumnWidth )
b45b34 ¤   ¤   {
a80be4 ¤   ¤   ¤   nameWidth = kMinNameColumnWidth;
b50fe4 ¤   ¤   }
36af5a
cc0d08 ¤   ¤   nameButtonRect.right = nameButtonRect.left + nameWidth;
4a1b52 ¤   ¤
3a7e0c ¤   ¤   newSignerButtonRect ¤   ¤   = signerButtonRect;
037868 ¤   ¤   newSignerButtonRect.left ¤  = nameButtonRect.right;
51fd28 ¤   ¤   newSignerButtonRect.right ¤ = validityButtonRect.left;
821b52 ¤   ¤
2b1672 ¤   ¤   mNameColumnButton->ResizeFrameTo(·
f4dd2e ¤   ¤   ¤   ¤   ¤   UGraphicUtils::RectWidth( nameButtonRect ),
6c9b07 ¤   ¤   ¤   ¤   ¤   UGraphicUtils::RectHeight( nameButtonRect ), TRUE );
321b52 ¤   ¤
9b53de ¤   ¤   mSignerColumnButton->MoveBy(
e48ac6 ¤   ¤   ¤   ¤   ¤   newSignerButtonRect.left - signerButtonRect.left,
5a566f ¤   ¤   ¤   ¤   ¤   newSignerButtonRect.top - signerButtonRect.top, TRUE );
aeaf5a
04dc42 ¤   ¤   mSignerColumnButton->ResizeFrameTo(
e04cf4 ¤   ¤   ¤   ¤   ¤   UGraphicUtils::RectWidth( newSignerButtonRect ),
7c38a4 ¤   ¤   ¤   ¤   ¤   UGraphicUtils::RectHeight( newSignerButtonRect ), TRUE );
009371 ¤   }
4cefe6 }
21af5a
226d52 ¤   void
c65d2f CResultsWindow::NewSummary(void)
--1c4a 0003264f1f44012010e Page 4 of CResultsWindow.cp
2cbb36 {
2d70a8 ¤   gResultsWindow->mPendingNewSummary = TRUE;
6befe6 }
f4af5a
966d52 ¤   void
547216 CResultsWindow::AddResult(
9f8dd6 ¤   ConstStr255Param¤   ¤   itemName,
d73a9e ¤   PGPtoolsSignatureData¤  *signatureData)
58bb36 {
6e6229 ¤   SwitchTarget( this );
a93fd4 ¤   Select();
ef67c5 ¤
bef7e2 ¤   if( mPendingNewSummary )
d3c7a1 ¤   {
bb994c ¤   ¤   mPendingNewSummary = FALSE;
f81b52 ¤   ¤
6597d4 ¤   ¤   mResultsTable->AddSummaryRow();
449371 ¤   }
6b67c5 ¤
bf9b0a ¤   mHaveSignatures = TRUE;
cb67c5 ¤
56d820 ¤   mResultsTable->AddProcessedItemRow( itemName, signatureData );
d2af5a
6c9037 ¤   UpdatePort();
14efe6 }
60af5a
7a6d52 ¤   void
e76bee CResultsWindow::NewResult(
6d8dd6 ¤   ConstStr255Param¤   ¤   itemName,
813a9e ¤   PGPtoolsSignatureData¤  *signatureData)
41bb36 {
35aa8d ¤   gResultsWindow->Show();
f3a78f ¤   gResultsWindow->AddResult( itemName, signatureData );
81efe6 }
7baf5a
2f6d52 ¤   void
44d3d5 CResultsWindow::IncrementCount(void)
9abb36 {
ac6229 ¤   SwitchTarget( this );
9c3fd4 ¤   Select();
9b60d9 ¤   Show();
3867c5 ¤
258695 ¤   mResultsTable->IncrementVerifiedCount();
97af5a
1b9037 ¤   UpdatePort();
f7efe6 }
35af5a
9c6d52 ¤   void
316a2f CResultsWindow::IncrementVerifiedCount(void)
72bb36 {
0ac07d ¤   gResultsWindow->IncrementCount();
fdefe6 }
0eaf5a
be6d52 ¤   void
844121 CResultsWindow::CalcColumnBounds(
2faca1 ¤   const Rect¤ *cellRect,
6fb8e0 ¤   Rect¤   ¤   *iconRect,
309a02 ¤   Rect¤   ¤   *nameRect,
27dd98 ¤   Rect¤   ¤   *signerRect,
51effd ¤   Rect¤   ¤   *validityRect,
86d13f ¤   Rect¤   ¤   *signingDateRect)
4cbb36 {
74dfdb ¤   pgpAssertAddrValid( cellRect, Rect );
1bb31c ¤   pgpAssertAddrValid( iconRect, Rect );
4cf4a8 ¤   pgpAssertAddrValid( nameRect, Rect );
9c3d16 ¤   pgpAssertAddrValid( signerRect, Rect );
3a2d76 ¤   pgpAssertAddrValid( validityRect, Rect );
f44b5e ¤   pgpAssertAddrValid( signingDateRect, Rect );
b567c5 ¤
eb42d2 ¤   // Assumes we're using a 16 pixel wide icon
c6caba ¤   *iconRect ¤ ¤   = *cellRect;
329015 ¤   iconRect->left ¤+= kIconColumnLeftMargin;
--00df 000bdef18354012010e Page 5 of CResultsWindow.cp
8cfbd1 ¤   iconRect->right¤= iconRect->left + 16;
8caf5a
cad8b0 ¤   mNameColumnButton->CalcPortFrameRect( *nameRect );
be67c5 ¤
1fae66 ¤   nameRect->top¤  ¤   = cellRect->top;
0580b3 ¤   nameRect->bottom¤   = cellRect->bottom;
36d9c9 ¤   nameRect->left ¤¤   += kNameColumnLeftMargin;
45747d ¤   nameRect->right ¤   -= kNameColumnRightMargin;
53af5a
29c727 ¤   mSignerColumnButton->CalcPortFrameRect( *signerRect );
0867c5 ¤
e8ecdd ¤   signerRect->top¤¤   = cellRect->top;
40c8fd ¤   signerRect->bottom¤ = cellRect->bottom;
09e682 ¤   signerRect->left ¤  += kSignerColumnLeftMargin;
5bf322 ¤   signerRect->right ¤ -= kSignerColumnRightMargin;
6c67c5 ¤
d0c18d ¤   mValidityColumnButton->CalcPortFrameRect( *validityRect );
f067c5 ¤
e1cdf1 ¤   validityRect->top¤  ¤   = cellRect->top;
d3caf2 ¤   validityRect->bottom¤   = cellRect->bottom;
dd2e8a ¤   validityRect->left ¤¤   += kValidityColumnLeftMargin;
dc339c ¤   validityRect->right ¤   -= kValidityColumnRightMargin;
a2af5a
c295e9 ¤   mDateColumnButton->CalcPortFrameRect( *signingDateRect );
c867c5 ¤
c9d1ef ¤   signingDateRect->top¤   = cellRect->top;
89ae9d ¤   signingDateRect->bottom¤= cellRect->bottom;
6c99c3 ¤   signingDateRect->left ¤ += kDateColumnLeftMargin;
272497 ¤   signingDateRect->right ¤-= kDateColumnRightMargin;
d7efe6 }
59af5a
2e6d52 ¤   void
b5a627 CResultsWindow::FindCommandStatus(
76ea24 ¤   CommandT¤   inCommand,
82a472 ¤   Boolean¤¤   &outEnabled,
da3a4d ¤   Boolean¤¤   &outUsesMark,
cf5dc0 ¤   Char16¤ ¤   &outMark,
e0d894 ¤   Str255¤ ¤   outName)
31bb36 {
19c469 ¤   switch (inCommand)
78c7a1 ¤   {
e71b1c ¤   ¤   case cmd_Clear:
235b34 ¤   ¤   {
c400be ¤   ¤   ¤   TableIndexT¤numRows;
48c49f ¤   ¤   ¤   TableIndexT¤numColumns;
1087c7 ¤   ¤   ¤
d21e12 ¤   ¤   ¤   mResultsTable->GetTableSize( numRows, numColumns );
ffa5ec ¤   ¤   ¤   outEnabled = ( numRows > 0 );
81cdcb ¤   ¤   ¤   break;
c50fe4 ¤   ¤   }
ec87c7 ¤   ¤   ¤
1c9ae3 ¤   ¤   default:
07a9a1 ¤   ¤   ¤   CPGPtoolsWindow::FindCommandStatus(inCommand, outEnabled,
dfcfdf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outUsesMark, outMark, outName);
ebcdcb ¤   ¤   ¤   break;
179371 ¤   }
35efe6 }
4daf5a
207e69 ¤   Boolean
63860f CResultsWindow::ObeyCommand(
70ea24 ¤   CommandT¤   inCommand,
870597 ¤   void¤   ¤   *ioParam)
debb36 {
a75b52 ¤   Boolean¤¤   cmdHandled = true;
72af5a
d0c469 ¤   switch (inCommand)
b2c7a1 ¤   {
cb1b1c ¤   ¤   case cmd_Clear:
285b34 ¤   ¤   {
cf00be ¤   ¤   ¤   TableIndexT¤numRows;
0ac49f ¤   ¤   ¤   TableIndexT¤numColumns;
bd87c7 ¤   ¤   ¤
--6089 001a3fd23824012010e Page 6 of CResultsWindow.cp
c76da3 ¤   ¤   ¤   do
64f776 ¤   ¤   ¤   {
0c237c ¤   ¤   ¤   ¤   mResultsTable->GetTableSize( numRows, numColumns );
83a277 ¤   ¤   ¤   ¤   if( numRows > 0 )
6572c3 ¤   ¤   ¤   ¤   {
ce8995 ¤   ¤   ¤   ¤   ¤   mResultsTable->RemoveRows( 1, 1, FALSE );
1c2613 ¤   ¤   ¤   ¤   }
413555 ¤   ¤   ¤   } while( numRows != 0 );
cf87c7 ¤   ¤   ¤
bfa268 ¤   ¤   ¤   mResultsTable->Refresh();
4f87c7 ¤   ¤   ¤
59cdcb ¤   ¤   ¤   break;
7b0fe4 ¤   ¤   }
7687c7 ¤   ¤   ¤
cf9ae3 ¤   ¤   default:
ebc22e ¤   ¤   ¤   cmdHandled = CPGPtoolsWindow::ObeyCommand(inCommand, ioParam);
9acdcb ¤   ¤   ¤   break;
029371 ¤   }
df67c5 ¤
8e51a4 ¤   return cmdHandled;
41efe6 }
a3af5a


--12fc 001ef7e318f4012010f Page 1 of CResultsWindow.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
c68f84 ¤   $Id: CResultsWindow.h,v 1.11.8.1 1998/11/12 03:09:26 heller Exp $
96f7f7 ____________________________________________________________________________*/
bfaf5a
437b7d #pragma once
15af5a
6c3a6b #include "PGPtools.h"
7df8d2 #include "PGPSharedEncryptDecrypt.h"
19af5a
6909d9 #include "CPGPtoolsWindow.h"
03af5a
538bd0 class CResultsTable;
60548d class LBevelButton;
6daf5a
ec8ea7 class CResultsWindow : public CPGPtoolsWindow
b2bb36 {
a05ed4 public:
831f79 ¤   enum ¤  ¤   ¤   ¤   { class_ID = 'RWin' };
3faf5a
cb3fde ¤   ¤   ¤   ¤   ¤   ¤   CResultsWindow(LStream *inStream);
1f7ea0 ¤   virtual¤¤   ¤   ¤   ~CResultsWindow(void);
dbaf5a
d5ca5e ¤   Boolean¤¤   ¤   ¤   HaveSignatures( void )
9d0716 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( mHaveSignatures ); }
4a67c5 ¤
ec42ec ¤   virtual void¤   ¤   ApplyForeAndBackColors(void) const;
50b4f6 ¤   virtual void¤   ¤   AttemptClose(void);
d1d64a ¤   virtual void¤   ¤   Click(SMouseDownEvent &inMouseDown);
4fff7d ¤   virtual void¤   ¤   DoClose(void);
6748a0 ¤   virtual void¤   ¤   FindCommandStatus(CommandT inCommand,
96c567 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled,
a4c04f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outUsesMark, Char16 &outMark,
dc1d67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Str255 outName);
11c834 ¤   virtual Boolean¤¤   ObeyCommand(CommandT inCommand, void *ioParam);
a65cda ¤   virtual void¤   ¤   ResizeFrameBy(Int16 inWidthDelta, Int16 inHeightDelta,
a271bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inRefresh);
c2af5a
8d74a5 ¤   static void¤¤   ¤   IncrementVerifiedCount(void);
6b2b76 ¤   static void¤¤   ¤   NewSummary(void);
eab363 ¤   static void¤¤   ¤   NewResult(ConstStr255Param itemName,
51a7d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtoolsSignatureData *signatureData);
8632d0 ¤   static void¤¤   ¤   CalcColumnBounds(const Rect *cellRect,
a7ccbc ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect *iconRect, Rect *nameRect, Rect *statusRect,
c207cb ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect *validityRect, Rect *signingDateRect);
ebed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
65a2d3 protected:
23af5a
f8d5cd ¤   virtual¤void¤   ¤   FinishCreateSelf(void);
9867c5 ¤
2b0fb9 private:
b4af5a
e09a8a ¤   CResultsTable¤  ¤   *mResultsTable;
03b54f ¤   FontInfo¤   ¤   ¤   mTitlesFontInfo;
39eee1 ¤   Boolean¤¤   ¤   ¤   mHaveSignatures;
1949d0 ¤   Boolean¤¤   ¤   ¤   mPendingNewSummary;
7c67c5 ¤
a82ade ¤   static LBevelButton¤¤   *mNameColumnButton;
3e2d10 ¤   static LBevelButton¤¤   *mSignerColumnButton;
05e2c6 ¤   static LBevelButton¤¤   *mValidityColumnButton;
ba5312 ¤   static LBevelButton¤¤   *mDateColumnButton;
4c67c5 ¤
041ef2 ¤   void¤   ¤   ¤   ¤   AddResult(ConstStr255Param itemName,
e5a7d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPtoolsSignatureData *signatureData);
5508b7 ¤   void¤   ¤   ¤   ¤   IncrementCount(void);
da7cc2 ¤   void¤   ¤   ¤   ¤   GetColumnTitlesRect(Rect *titlesRect);
51af5a
efbf26 };¶


--544e 000f0f2669240120110 Page 1 of CWipeFreeSpaceWizardDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
d396d7 ¤   $Id: CWipeFreeSpaceWizardDialog.cp,v 1.14.8.1 1998/11/12 03:09:26 heller Ex¶
62b277 p $
5cf7f7 ____________________________________________________________________________*/
29af5a
eccce5 #include <HFSVolumes.h>
ebaf5a
e27c09 #include <LEditText.h>
e80aae #include <LPopupButton.h>
5749f7 #include <LProgressBar.h>
2ed797 #include <LPushButton.h>
f405c6 #include <LStaticText.h>
93dd56 #include <PP_Messages.h>
ad17f9 #include <UReanimator.h>
c57c99 #include <URegistrar.h>
5daf5a
e46ce9 #include "MacCursors.h"
5076b7 #include "MacErrors.h"
d3bbf4 #include "MacFiles.h"
0385c2 #include "MacStrings.h"
8ce8b2 #include "pflPrefs.h"
c64720 #include "pflPrefTypes.h"
2dc97b #include "pgpClientPrefs.h"
bfc88f #include "pgpMacVolumeWiping.h"
5b0d08 #include "pgpMem.h"
876773 #include "pgpMemoryMgr.h"
26b397 #include "PGPOpenPrefs.h"
b2628e #include "pgpClientErrors.h"
14e622 #include "pgpDiskWiper.h"
409808 #include "pgpToolsUtils.h"
3faf5a
5b3def #include "CWipeFreeSpaceWizardDialog.h"
c4133f #include "PGPtoolsResources.h"
71af5a
b77b5a const ResIDT¤   ¤   view_Introduction¤  ¤   ¤   = 6100;
27766c const ResIDT¤   ¤   view_SelectVolume¤  ¤   ¤   = 6200;
2da251 const ResIDT¤   ¤   view_Wiping¤¤   ¤   ¤   ¤   = 6300;
3f80e6 const ResIDT¤   ¤   view_Conclusion¤¤   ¤   ¤   = 6400;
04b273 const ResIDT¤   ¤   view_UnmountHFSFailure¤ ¤   = 6500;
033e9f const ResIDT¤   ¤   view_UnmountHFSPlusFailure¤ = 6600;
73ec21 const ResIDT¤   ¤   view_Error¤ ¤   ¤   ¤   ¤   = 6700;
65efc2 const ResIDT¤   ¤   view_IntegrityFailure¤  ¤   = 6800;
4bacf7 const ResIDT¤   ¤   view_VersionFailure¤¤   ¤   = 6900;
2faf5a
3e3609 const ResIDT¤   ¤   kVolumeMenuResID¤   ¤   ¤   = 129;
3eaf5a
ee02f4 const MessageT¤ ¤   kNextViewMessage¤   ¤   ¤   = 'Next';
3dc5f3 const MessageT¤ ¤   kPreviousViewMessage¤   ¤   = 'Prev';
831c92 const MessageT¤ ¤   kAllowNextViewSwitchMessage¤= 'ANxt';
5cf582 const MessageT¤ ¤   kAllowPrevViewSwitchMessage¤= 'APrv';
ea6e96 const MessageT¤ ¤   kDenyNextViewSwitchMessage¤ = 'DNxt';
3c7c5c const MessageT¤ ¤   kDenyPrevViewSwitchMessage¤ = 'DPrv';
e6349b const MessageT¤ ¤   kDenyCancelMessage¤ ¤   ¤   = 'DCan';
e5af5a
ef43d2 const PaneIDT¤  ¤   kNextButtonPaneID¤  ¤   ¤   = 'bNxt';
52fe78 const PaneIDT¤  ¤   kPreviousButtonPaneID¤  ¤   = 'bPrv';
02243b const PaneIDT¤  ¤   kCancelButtonPaneID¤¤   ¤   = 'bCan';
04af5a
f0d690 WipeFreeSpaceView¤  CWipeFreeSpaceWizardDialog::mNewView =
d3225a ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWipeFreeSpaceView_Invalid;
d78f7e PGPError¤   ¤   ¤   CWipeFreeSpaceWizardDialog::mError =
d4f960 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPError_NoErr;
61af5a
81b298 #pragma mark --- CWipeFreeSpaceWizardView ---
f6af5a
7516e8 class CWipeFreeSpaceWizardView : ¤  public LView,
08f074 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LCommander,
ba5db5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster,
f02691 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener
--f555 000582fa61140120110 Page 2 of CWipeFreeSpaceWizardDialog.cp
2cbb36 {
595ed4 public:
33af5a
f08ae1 ¤   enum { class_ID = 'vWFS' };
5267c5 ¤
f1874b ¤   ¤   ¤   ¤   ¤   CWipeFreeSpaceWizardView(LStream *inStream);
787a32 ¤   virtual¤¤   ¤   ~CWipeFreeSpaceWizardView();
37af5a
b7f559 ¤   virtual¤void¤   ListenToMessage(MessageT inMessage, void *ioParam);
4d82f7 };
faaf5a
1f0fad CWipeFreeSpaceWizardView::CWipeFreeSpaceWizardView(LStream *inStream)
e380d6 ¤   : LView(inStream)
d4bb36 {
92efe6 }
95af5a
55df87 CWipeFreeSpaceWizardView::~CWipeFreeSpaceWizardView()
fbbb36 {
fdefe6 }
2caf5a
126d52 ¤   void
c971f5 CWipeFreeSpaceWizardView::ListenToMessage(
9619a3 ¤   MessageT ¤  inMessage,
dd7503 ¤   void ¤  ¤   *ioParam)
2dbb36 {
c3e9c8 ¤   (void) inMessage;
8828bb ¤   (void) ioParam;
d4efe6 }
a5af5a
964ccb #pragma mark --- CSelectVolumeParamsView ---
a8af5a
fb9f15 class CSelectVolumeParamsView : public CWipeFreeSpaceWizardView
c4bb36 {
f75ed4 public:
60af5a
742f4b ¤   enum
a0c7a1 ¤   {
68bc77 ¤   ¤   class_ID = 'vSVP',
631b52 ¤   ¤
ca2251 ¤   ¤   kVolumePopupMenuPaneID¤ ¤   = 'pVol',
908bf5 ¤   ¤   kWipePassesEditTextPaneID¤  = 'ePas'
3d62bd ¤   };
2067c5 ¤
fc7f3f ¤   ¤   ¤   ¤   ¤   CSelectVolumeParamsView(LStream *inStream);
271bb0 ¤   virtual¤¤   ¤   ~CSelectVolumeParamsView();
2baf5a
4b3306 ¤   void¤   ¤   ¤   GetParams(WipeVolumeInfo *wipeVolumeInfo,
5199f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32 *wipePasses);
13f559 ¤   virtual¤void¤   ListenToMessage(MessageT inMessage, void *ioParam);
18ad54 ¤   void¤   ¤   ¤   SetParams(short wipeVRefNum, PGPUInt32 wipePasses);
cbaf5a
bea2d3 protected:
d1af5a
96a2f8 ¤   virtual void¤   FinishCreateSelf(void);
fe67c5 ¤
ed0fb9 private:
41af5a
daefd0 ¤   LArray¤ ¤   ¤   *mVolumeInfoList;
4a5429 ¤   LPopupButton¤   *mVolumePopup;
2dd6ea ¤   LEditText¤  ¤   *mWipePassesEdit;
ed67c5 ¤
7130d2 ¤   void¤   ¤   ¤   GetCurrentWipeVolumeInfo(WipeVolumeInfo *wipeVolumeInfo);
1f82f7 };
b0af5a
5c2fe1 CSelectVolumeParamsView::CSelectVolumeParamsView(LStream *inStream)
840839 ¤   : CWipeFreeSpaceWizardView(inStream)
d1bb36 {
7bb68d ¤   mVolumeInfoList = NULL;
86efe6 }
6aaf5a
5893f1 CSelectVolumeParamsView::~CSelectVolumeParamsView()
58bb36 {
--28d0 00080c7564f40120110 Page 3 of CWipeFreeSpaceWizardDialog.cp
79d96e ¤   delete mVolumeInfoList;
44efe6 }
36af5a
3d6d52 ¤   void
ba2706 CSelectVolumeParamsView::FinishCreateSelf(void)
d5bb36 {
9f3ab7 ¤   CWipeFreeSpaceWizardView::FinishCreateSelf();
7867c5 ¤
c1624d ¤   mVolumePopup = (LPopupButton *) FindPaneByID( kVolumePopupMenuPaneID );
1db133 ¤   pgpAssertAddrValid( mVolumePopup, VoidAlign );
5367c5 ¤
22761f ¤   mWipePassesEdit = (LEditText *) FindPaneByID( kWipePassesEditTextPaneID );
473057 ¤   pgpAssertAddrValid( mWipePassesEdit, VoidAlign );
e967c5 ¤
a5f792 ¤   mVolumePopup->AddListener( this );
1b70e1 ¤   mWipePassesEdit->AddListener( this );
68efe6 }
14af5a
6a6d52 ¤   void
1f285b CSelectVolumeParamsView::ListenToMessage(
1f19a3 ¤   MessageT ¤  inMessage,
957503 ¤   void ¤  ¤   *ioParam)
a9bb36 {
db769e ¤   switch( inMessage )
2cc7a1 ¤   {
f45a2d ¤   ¤   case kVolumePopupMenuPaneID:
7e5dbf ¤   ¤   case kWipePassesEditTextPaneID:
fa5b34 ¤   ¤   {
8b3933 ¤   ¤   ¤   WipeVolumeInfo¤ info;
8187c7 ¤   ¤   ¤
f15910 ¤   ¤   ¤   GetCurrentWipeVolumeInfo( &info );
60696a ¤   ¤   ¤   if( info.canWipe && mWipePassesEdit->GetValue() != 0 )
2af776 ¤   ¤   ¤   {
3317f0 ¤   ¤   ¤   ¤   BroadcastMessage( kAllowNextViewSwitchMessage, NULL );
59a3a6 ¤   ¤   ¤   }
a6bb8c ¤   ¤   ¤   else
e6f776 ¤   ¤   ¤   {
315de5 ¤   ¤   ¤   ¤   BroadcastMessage( kDenyNextViewSwitchMessage, NULL );
9ca3a6 ¤   ¤   ¤   }
0987c7 ¤   ¤   ¤
0bcdcb ¤   ¤   ¤   break;
700fe4 ¤   ¤   }
051b52 ¤   ¤
8b9ae3 ¤   ¤   default:
657421 ¤   ¤   ¤   CWipeFreeSpaceWizardView::ListenToMessage( inMessage, ioParam );
66cdcb ¤   ¤   ¤   break;
4e9371 ¤   }
88efe6 }
18af5a
1b6d52 ¤   void
cf1821 CSelectVolumeParamsView::GetCurrentWipeVolumeInfo(WipeVolumeInfo *wipeVolumeInf¶
c714fb o)
27bb36 {
e28a88 ¤   mVolumeInfoList->FetchItemAt( mVolumePopup->GetValue(), wipeVolumeInfo );
23efe6 }
a2af5a
ec6d52 ¤   void
1ac805 CSelectVolumeParamsView::GetParams(
cc7caa ¤   WipeVolumeInfo¤ *wipeVolumeInfo,
bcc070 ¤   PGPUInt32¤  ¤   *wipePasses)
4dbb36 {
1ab8dc ¤   *wipePasses = mWipePassesEdit->GetValue();
3967c5 ¤
9998f8 ¤   GetCurrentWipeVolumeInfo( wipeVolumeInfo );
0fefe6 }
afaf5a
786d52 ¤   void
46e715 CSelectVolumeParamsView::SetParams(
b2c1bf ¤   short¤  ¤   wipeVRefNum,
69530c ¤   PGPUInt32¤  wipePasses)
16bb36 {
80e0aa ¤   Str255¤ ¤   ¤   volumeName;
--ff03 0008ae7c3d740120110 Page 4 of CWipeFreeSpaceWizardDialog.cp
518a84 ¤   short¤  ¤   ¤   defaultItem = 1;
5d5805 ¤   MenuHandle¤ ¤   volumeMenu;
c47b4a ¤   OSErr¤  ¤   ¤   err = noErr;
0767c5 ¤
5d782b ¤   mVolumeInfoList = new LArray( sizeof( WipeVolumeInfo ) );
4267c5 ¤
736f2d ¤   volumeMenu = GetMenu( kVolumeMenuResID );
b29e96 ¤   AssertHandleIsValid( volumeMenu, nil );
ee67c5 ¤
d6919e ¤   if( volumeMenu != nil )
c9c7a1 ¤   {
119f9c ¤   ¤   short¤  ¤   ¤   numMenuItems;
1c3317 ¤   ¤   short¤  ¤   ¤   menuItemIndex;
e2168e ¤   ¤   XVolumeParam¤   xpb;
5367c5 ¤
bdea36 ¤   ¤   // Remove existing menu items, if any.
c3593c ¤   ¤   numMenuItems = CountMItems( volumeMenu );
65b92d ¤   ¤   for( menuItemIndex = numMenuItems; menuItemIndex >= 1; menuItemIndex-- )
6f5b34 ¤   ¤   {
eb0a54 ¤   ¤   ¤   DeleteMenuItem( volumeMenu, menuItemIndex );
480fe4 ¤   ¤   }
c6af5a
6c9301 ¤   ¤   // Loop over all mounted volumes and add them to the menu.
a59976 ¤   ¤   // Volumes which cannot be wiped are dimmed.
7c1b52 ¤   ¤
168da2 ¤   ¤   menuItemIndex = 1;
471b52 ¤   ¤
f4a638 ¤   ¤   pgpClearMemory( &xpb, sizeof( xpb ) );
0367c5 ¤
00e935 ¤   ¤   xpb.ioNamePtr = volumeName;
b51b52 ¤   ¤
250c19 ¤   ¤   do
025b34 ¤   ¤   {
e8979a ¤   ¤   ¤   xpb.ioVolIndex = menuItemIndex;
4eaf5a
d51a80 ¤   ¤   ¤   err = pgpPBXGetVolInfo( &xpb );
b36108 ¤   ¤   ¤   if( IsntErr( err ) )
85f776 ¤   ¤   ¤   {
e8d640 ¤   ¤   ¤   ¤   WipeVolumeInfo¤ info;
27b099 ¤   ¤   ¤   ¤   const VCB¤  ¤   *vcb;
042b85 ¤   ¤   ¤   ¤
855366 ¤   ¤   ¤   ¤   CopyPString( volumeName, info.name );
d5af5a
dc2168 ¤   ¤   ¤   ¤   info.vRefNum¤   ¤   = xpb.ioVRefNum;
5532f2 ¤   ¤   ¤   ¤   info.driveNumber¤   = xpb.ioVDrvInfo;
69c1d7 ¤   ¤   ¤   ¤   info.driverRefNum¤  = xpb.ioVDRefNum;
362b85 ¤   ¤   ¤   ¤
1d6880 ¤   ¤   ¤   ¤   vcb = GetVCBForVolume( info.vRefNum );
692910 ¤   ¤   ¤   ¤   pgpAssertAddrValid( vcb, VCB );
172b85 ¤   ¤   ¤   ¤
b3131c ¤   ¤   ¤   ¤   info.signature = vcb->vcbSigWord;
722b85 ¤   ¤   ¤   ¤
fba913 ¤   ¤   ¤   ¤   if( IsntErr( pgpCanWipeVolumeFreeSpace( info.vRefNum ) ) )
026e50 ¤   ¤   ¤   ¤   {¤
c1ba9d ¤   ¤   ¤   ¤   ¤   info.canWipe = TRUE;
d52613 ¤   ¤   ¤   ¤   }
e5fa07 ¤   ¤   ¤   ¤   else
ad72c3 ¤   ¤   ¤   ¤   {
7e7e95 ¤   ¤   ¤   ¤   ¤   info.canWipe = FALSE;
842613 ¤   ¤   ¤   ¤   }
c82b85 ¤   ¤   ¤   ¤
eadfcb ¤   ¤   ¤   ¤   mVolumeInfoList->AddItem( &info );
3b87c7 ¤   ¤   ¤
aa8e39 ¤   ¤   ¤   ¤   AppendMenu( volumeMenu, "\px" );
aab4c8 ¤   ¤   ¤   ¤   SetMenuItemText( volumeMenu, menuItemIndex, volumeName );
142b85 ¤   ¤   ¤   ¤
4eb19f ¤   ¤   ¤   ¤   if( info.vRefNum == wipeVRefNum )
ae3fad ¤   ¤   ¤   ¤   ¤   defaultItem = menuItemIndex;
e02b85 ¤   ¤   ¤   ¤
4e4530 ¤   ¤   ¤   ¤   if( ! info.canWipe )
ea72c3 ¤   ¤   ¤   ¤   {
8acbe5 ¤   ¤   ¤   ¤   ¤   DisableItem( volumeMenu, menuItemIndex );
--c3b5 0009c55527840120110 Page 5 of CWipeFreeSpaceWizardDialog.cp
862613 ¤   ¤   ¤   ¤   }
7b2b85 ¤   ¤   ¤   ¤
84959d ¤   ¤   ¤   ¤   ++menuItemIndex;
98a3a6 ¤   ¤   ¤   }
bd1b52 ¤   ¤
dd9a29 ¤   ¤   } while( IsntErr( err ) );
281b52 ¤   ¤
a3c90c ¤   ¤   mVolumePopup->SetMacMenuH( volumeMenu, TRUE );
d73e0b ¤   ¤   mVolumePopup->SetValue( defaultItem );
f59371 ¤   }
6e67c5 ¤
bd958c ¤   mWipePassesEdit->SetValue( wipePasses );
b16308 ¤   SwitchTarget( mWipePassesEdit );
3defe6 }
95af5a
7fdcc9 #pragma mark --- CWipingProgressView ---
caaf5a
b92067 class CWipingProgressView : public CWipeFreeSpaceWizardView
dbbb36 {
d25ed4 public:
92af5a
b82f4b ¤   enum
e4c7a1 ¤   {
b3dcd9 ¤   ¤   class_ID = 'vWPV',
001b52 ¤   ¤
da33bf ¤   ¤   kVolumeNamePaneID¤  = 'sVol',
4d0de6 ¤   ¤   kProgressBarPaneID ¤= 'Prog',
a385da ¤   ¤   kPassBarPaneID¤ ¤   = 'Pass',
ba1b52 ¤   ¤
f63864 ¤   ¤   kVolumeCaptionPaneID¤   = 'sNam',
b5bac4 ¤   ¤   kProgressCaptionPaneID¤ = 'sPrg',
560d4d ¤   ¤   kPassCaptionPaneID¤ ¤   = 'sPas',
361b52 ¤   ¤
b2eade ¤   ¤   kStartStopButtonPaneID¤ = 'bWip'
4162bd ¤   };
fc67c5 ¤
eed744 ¤   ¤   ¤   ¤   ¤   CWipingProgressView(LStream *inStream);
acc16d ¤   virtual¤¤   ¤   ~CWipingProgressView();
29af5a
42f559 ¤   virtual¤void¤   ListenToMessage(MessageT inMessage, void *ioParam);
a0b51c ¤   void¤   ¤   ¤   SetParams(PGPContextRef context,
c00a70 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const WipeVolumeInfo *wipeVolumeInfo,
b5504c ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32 numPasses);
8faf5a
40a2d3 protected:
e0af5a
0da2f8 ¤   virtual void¤   FinishCreateSelf(void);
80af5a
f10fb9 private:
30af5a
b4c810 ¤   PGPContextRef¤  ¤   mContext;
85fe0e ¤   LProgressBar¤   ¤   *mProgressBar;
06e3b5 ¤   LProgressBar¤   ¤   *mPassBar;
5302f7 ¤   LPushButton¤¤   ¤   *mStartStopButton;
c23a6c ¤   WipeVolumeInfo¤ ¤   mWipeVolInfo;
c18790 ¤   PGPUInt32¤  ¤   ¤   mNumPasses;
fb09e0 ¤   AnimatedCursorRef¤  mCursorRef;
57f6cd ¤   Boolean¤¤   ¤   ¤   mWiping;
e667c5 ¤
8b4549 ¤   void¤   ¤   ¤   DoWipe(void);
a9f5eb ¤   void¤   ¤   ¤   ShowPane(PaneIDT paneID);
82053c ¤   OSStatus¤   ¤   WipeVolumeEventHandler(const VolumeWipeEvent *event);
94af5a
2a3503 ¤   static OSStatus¤WipeVolumeEventHandlerShell(const VolumeWipeEvent *event,
97a3a6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue userValue);
f382f7 };
a0af5a
20e32e CWipingProgressView::CWipingProgressView(LStream *inStream)
760839 ¤   : CWipeFreeSpaceWizardView(inStream)
19bb36 {
e05027 ¤   mCursorRef¤ = NULL;
9cc245 ¤   mWiping¤¤   = FALSE;
--c84b 000071912e240120110 Page 6 of CWipeFreeSpaceWizardDialog.cp
7aefe6 }
46af5a
98842a CWipingProgressView::~CWipingProgressView()
5ebb36 {
24c5cb ¤   if( IsntNull( mCursorRef ) )
ab3166 ¤   ¤   DisposeAnimatedCursor( mCursorRef );
a8efe6 }
b5af5a
0b6d52 ¤   void
81517d CWipingProgressView::FinishCreateSelf(void)
6abb36 {
6c3ab7 ¤   CWipeFreeSpaceWizardView::FinishCreateSelf();
5a67c5 ¤
b3b380 ¤   mProgressBar = (LProgressBar *) FindPaneByID( kProgressBarPaneID );
d4c30e ¤   pgpAssertAddrValid( mProgressBar, VoidAlign );
06af5a
b6b0ad ¤   mPassBar = (LProgressBar *) FindPaneByID( kPassBarPaneID );
be2eb6 ¤   pgpAssertAddrValid( mPassBar, VoidAlign );
ee1b52 ¤   ¤
987d83 ¤   mStartStopButton = (LPushButton *) FindPaneByID( kStartStopButtonPaneID );
5ed56c ¤   pgpAssertAddrValid( mStartStopButton, VoidAlign );
9b67c5 ¤
f497ee ¤   Get1AnimatedCursor( kAnimatedCursorResID, &mCursorRef );
ef67c5 ¤
d533e3 ¤   mStartStopButton->AddListener( this );
b0efe6 }
63af5a
c885ea ¤   OSStatus
563d17 CWipingProgressView::WipeVolumeEventHandlerShell(
810315 ¤   const VolumeWipeEvent ¤ *event,
f3944c ¤   PGPUserValue ¤  ¤   ¤   userValue)
6cbb36 {
a93504 ¤   CWipingProgressView¤*view = (CWipingProgressView *) userValue;
f267c5 ¤
617e80 ¤   return( view->WipeVolumeEventHandler( event ) );
7aefe6 }
bfaf5a
7585ea ¤   OSStatus
d97a05 CWipingProgressView::WipeVolumeEventHandler(const VolumeWipeEvent *event)
3ebb36 {
bd6792 ¤   OSStatus¤   err = noErr;
3567c5 ¤
3aa505 ¤   switch( event->type )
33c7a1 ¤   {
a8f795 ¤   ¤   case kVolumeWipeEvent_GatheringInfo:
195b34 ¤   ¤   {
9389b7 ¤   ¤   ¤   EventRecord¤dummyEvent;
8987c7 ¤   ¤   ¤
7bd2e3 ¤   ¤   ¤   mProgressBar->SpendTime( dummyEvent );
89cdcb ¤   ¤   ¤   break;
260fe4 ¤   ¤   }
c41b52 ¤   ¤
87ab46 ¤   ¤   case kVolumeWipeEvent_BeginPass:
635b34 ¤   ¤   {
215e2f ¤   ¤   ¤   if( event->beginPass.passIndex == 1 )
01f776 ¤   ¤   ¤   {
5b2f3e ¤   ¤   ¤   ¤   mProgressBar->SetIndeterminateFlag( FALSE );
016b84 ¤   ¤   ¤   ¤   mProgressBar->SetMinValue( 0 );
40564e ¤   ¤   ¤   ¤   mProgressBar->SetMaxValue( 100 );
e1af5a
7844e9 ¤   ¤   ¤   ¤   mPassBar->SetMaxValue( event->beginPass.totalPasses );
cea3a6 ¤   ¤   ¤   }
c887c7 ¤   ¤   ¤
180291 ¤   ¤   ¤   mProgressBar->SetValue( 0 );
6f87c7 ¤   ¤   ¤
a7cdcb ¤   ¤   ¤   break;
f10fe4 ¤   ¤   }
d71b52 ¤   ¤
3924e3 ¤   ¤   case kVolumeWipeEvent_EndPass:
b65b34 ¤   ¤   {
8b245b ¤   ¤   ¤   if( IsntErr( event->endPass.passError ) )
0763a7 ¤   ¤   ¤   ¤   mPassBar->SetValue( event->endPass.passIndex );
--9727 000d75d7eec40120110 Page 7 of CWipeFreeSpaceWizardDialog.cp
b50fe4 ¤   ¤   }
3b1b52 ¤   ¤
1ec4d5 ¤   ¤   case kVolumeWipeEvent_WipeProgress:
7d5b34 ¤   ¤   {
df3cd9 ¤   ¤   ¤   float¤  pctComplete;
0a87c7 ¤   ¤   ¤
fd2f60 ¤   ¤   ¤   pctComplete = ( (float) event->progress.numSectorsWiped * 100.0 ) /
68f61c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   event->progress.totalSectorsToWipe;
ca397e ¤   ¤   ¤   mProgressBar->SetValue( pctComplete );
6087c7 ¤   ¤   ¤
88fd4e ¤   ¤   ¤   if( IsntNull( mCursorRef ) )
13591c ¤   ¤   ¤   ¤   AnimateCursor( mCursorRef );
852b85 ¤   ¤   ¤   ¤
edcdcb ¤   ¤   ¤   break;
e20fe4 ¤   ¤   }
e49371 ¤   }
2a67c5 ¤
cfee03 ¤   if( IsntErr( err ) )
1fc7a1 ¤   {
bfc3f7 ¤   ¤   EventRecord¤event;
861b52 ¤   ¤
8d9afe ¤   ¤   if( GetOSEvent( mDownMask | mUpMask, &event ) &&
b4bcb9 ¤   ¤   ¤   event.what == mouseDown )
5a5b34 ¤   ¤   {
9b5270 ¤   ¤   ¤   Int16¤  ¤   windowPart;
1ace19 ¤   ¤   ¤   WindowPtr¤  macWindowP;
c987c7 ¤   ¤   ¤
7636fb ¤   ¤   ¤   windowPart = FindWindow( event.where, &macWindowP );
6bbf3c ¤   ¤   ¤   if( macWindowP == GetMacPort() &&
acbb13 ¤   ¤   ¤   ¤   windowPart == inContent )
5ff776 ¤   ¤   ¤   {
c6d7b5 ¤   ¤   ¤   ¤   LWindow¤¤   *theWindow;
2faf5a
2bdfde ¤   ¤   ¤   ¤   theWindow = LWindow::FetchWindowObject( macWindowP );
4b82be ¤   ¤   ¤   ¤   if (theWindow != nil)
3d72c3 ¤   ¤   ¤   ¤   {
8096ad ¤   ¤   ¤   ¤   ¤   theWindow->HandleClick( event, windowPart );
048143 ¤   ¤   ¤   ¤   ¤   if( ! mWiping )
f51243 ¤   ¤   ¤   ¤   ¤   ¤   err = userCanceledErr;
f92613 ¤   ¤   ¤   ¤   }
5fa3a6 ¤   ¤   ¤   }
e90fe4 ¤   ¤   }
589371 ¤   }
e5af5a
79deb7 ¤   return( err );
48efe6 }
35af5a
0b6d52 ¤   void
40423c CWipingProgressView::ListenToMessage(
9019a3 ¤   MessageT ¤  inMessage,
f17503 ¤   void ¤  ¤   *ioParam)
dfbb36 {
65769e ¤   switch( inMessage )
54c7a1 ¤   {
5e0f31 ¤   ¤   case kStartStopButtonPaneID:
895b34 ¤   ¤   {
ae654b ¤   ¤   ¤   if( mWiping )
74f776 ¤   ¤   ¤   {
bfe554 ¤   ¤   ¤   ¤   mWiping = FALSE;
c4a3a6 ¤   ¤   ¤   }
85bb8c ¤   ¤   ¤   else
91f776 ¤   ¤   ¤   {
038af2 ¤   ¤   ¤   ¤   mWiping = TRUE;
a5bf6e ¤   ¤   ¤   ¤   DoWipe();
f1e554 ¤   ¤   ¤   ¤   mWiping = FALSE;
d3a3a6 ¤   ¤   ¤   }
4687c7 ¤   ¤   ¤
d4cdcb ¤   ¤   ¤   break;
790fe4 ¤   ¤   }
361b52 ¤   ¤
239ae3 ¤   ¤   default:
d77421 ¤   ¤   ¤   CWipeFreeSpaceWizardView::ListenToMessage( inMessage, ioParam );
--3e1f 000790094a940120110 Page 8 of CWipeFreeSpaceWizardDialog.cp
7ecdcb ¤   ¤   ¤   break;
4b9371 ¤   }
41efe6 }
eaaf5a
406d52 ¤   void
fb74c6 CWipingProgressView::SetParams(
b39a06 ¤   PGPContextRef¤  ¤   ¤   context,
7d0716 ¤   const WipeVolumeInfo ¤  *wipeVolumeInfo,
fa4ed2 ¤   PGPUInt32¤  ¤   ¤   ¤   numPasses)
e8bb36 {
1b1802 ¤   mContext¤   ¤   = context;
196c2b ¤   mWipeVolInfo ¤  = *wipeVolumeInfo;
a823cf ¤   mNumPasses¤ ¤   = numPasses;
1befe6 }
24af5a
126d52 ¤   void
8c6acd CWipingProgressView::ShowPane(PaneIDT paneID)
1fbb36 {
606f19 ¤   LPane *pane;
ec67c5 ¤
ab65df ¤   pane = FindPaneByID( paneID );
2ff760 ¤   pgpAssertAddrValid( pane, VoidAlign );
b367c5 ¤
a6e0d2 ¤   pane->Show();
a1efe6 }
81af5a
d66d52 ¤   void
44dd23 CWipingProgressView::DoWipe(void)
79bb36 {
8d869c ¤   LStaticText¤¤   ¤   *nameObj;
5cc767 ¤   Str255¤ ¤   ¤   ¤   buttonTitle;
5abb9c ¤   PGPError¤   ¤   ¤   pgpErr;
036ddb ¤   PGPWipingPattern¤   *patternList;
4867c5 ¤
75c43f ¤   BroadcastMessage( kDenyPrevViewSwitchMessage, NULL );
08650c ¤   BroadcastMessage( kDenyCancelMessage, NULL );
a5af5a
738f18 ¤   ShowPane( kVolumeCaptionPaneID );
61f0f1 ¤   ShowPane( kVolumeNamePaneID );
f9af5a
d7daa4 ¤   nameObj = (LStaticText *) FindPaneByID( kVolumeNamePaneID );
fa886d ¤   pgpAssertAddrValid( nameObj, VoidAlign );
1f67c5 ¤
77dce9 ¤   nameObj->SetDescriptor( mWipeVolInfo.name );
9167c5 ¤
896fb2 ¤   ShowPane( kProgressCaptionPaneID );
d70ae3 ¤   ShowPane( kProgressBarPaneID );
b767c5 ¤
cb5de9 ¤   if( mNumPasses > 1 )
1bc7a1 ¤   {
732cd0 ¤   ¤   ShowPane( kPassCaptionPaneID );
99b06f ¤   ¤   ShowPane( kPassBarPaneID );
9e9371 ¤   }
e767c5 ¤
ba32ad ¤   GetIndString( buttonTitle, kPGPtoolsMiscStringsResID,
b650bf ¤   ¤   ¤   ¤   kStopButtonTitleStrIndex );
b10792 ¤   mStartStopButton->SetDescriptor( buttonTitle );
9467c5 ¤
4ca89c ¤   mSuperView->Draw( NULL );
5faf5a
8dbb58 ¤   pgpErr = GetWipingPatternList( mContext, mNumPasses, &patternList );
9eabba ¤   if( IsntPGPError( pgpErr ) )
51c7a1 ¤   {
c46d93 ¤   ¤   OSStatus¤   err;
7c1b52 ¤   ¤
c37e53 ¤   ¤   err = pgpWipeVolumeFreeSpace( mWipeVolInfo.vRefNum, mWipeVolInfo.name,
a4306a ¤   ¤   ¤   ¤   ¤   ¤   mNumPasses, mNumPasses, patternList,
5bf43e ¤   ¤   ¤   ¤   ¤   ¤   WipeVolumeEventHandlerShell, this );
317904 ¤   ¤   pgpAssert( IsntErr( err ) );
811b52 ¤   ¤
2d4a05 ¤   ¤   InitCursor();
7927d8 ¤   ¤   FlushEvents( mDownMask | mUpMask | keyDownMask, 0 );
--8364 0009c65d0a640120110 Page 9 of CWipeFreeSpaceWizardDialog.cp
f11b52 ¤   ¤
05f085 ¤   ¤   if( err == noErr )
c05b34 ¤   ¤   {
30e0e3 ¤   ¤   ¤   CWipeFreeSpaceWizardDialog::SetNewView( kWipeFreeSpaceView_Conclusi¶
e09715 on );
9d0fe4 ¤   ¤   }
cf6bae ¤   ¤   else if( err == userCanceledErr )
845b34 ¤   ¤   {
748180 ¤   ¤   ¤   CWipeFreeSpaceWizardDialog::SetNewView( kWipeFreeSpaceView_Exit );
120fe4 ¤   ¤   }
174830 ¤   ¤   else if( err == kWipingError_InvalidVolumeDataStructure )
465b34 ¤   ¤   {
46d92a ¤   ¤   ¤   CWipeFreeSpaceWizardDialog::SetNewView(
323461 ¤   ¤   ¤   ¤   ¤   ¤   kWipeFreeSpaceView_IntegrityFailure );
c40fe4 ¤   ¤   }
fc6b31 ¤   ¤   else if( err == kWipingError_UnsupportedVolumeFormat )
715b34 ¤   ¤   {
a7d92a ¤   ¤   ¤   CWipeFreeSpaceWizardDialog::SetNewView(
20df2a ¤   ¤   ¤   ¤   ¤   ¤   kWipeFreeSpaceView_VersionFailure );
5e0fe4 ¤   ¤   }
07ee26 ¤   ¤   else·
f55b34 ¤   ¤   {
4b13ef ¤   ¤   ¤   CWipeFreeSpaceWizardDialog::SetError( MacErrorToPGPError( err ) );
6aa400 ¤   ¤   ¤   CWipeFreeSpaceWizardDialog::SetNewView( kWipeFreeSpaceView_Error );
2a0fe4 ¤   ¤   }
8f67c5 ¤
2921c0 ¤   ¤   PGPFreeData( patternList );
3c9371 ¤   }
2d0e24 ¤   else
4dc7a1 ¤   {
655957 ¤   ¤   CWipeFreeSpaceWizardDialog::SetError( pgpErr );
daf150 ¤   ¤   CWipeFreeSpaceWizardDialog::SetNewView( kWipeFreeSpaceView_Error );
a99371 ¤   }
9eefe6 }
83af5a
6362e4 #pragma mark --- CWipeFreeSpaceWizardDialog ---
1faf5a
a8d129 CWipeFreeSpaceWizardDialog::CWipeFreeSpaceWizardDialog(LStream *inStream)
c61fb6 ¤   : LGADialog(inStream)
83bb36 {
57236d ¤   mCurrentView ¤  = kWipeFreeSpaceView_Invalid;
7fa3dd ¤   mCurrentViewObj¤= NULL;
ba67c5 ¤
1e0460 ¤   pgpClearMemory( &mWipeVolInfo, sizeof( mWipeVolInfo ) );
aeefe6 }
acaf5a
be87bc CWipeFreeSpaceWizardDialog::~CWipeFreeSpaceWizardDialog()
66bb36 {
14efe6 }
74af5a
6e6d52 ¤   void
381f45 CWipeFreeSpaceWizardDialog::SetParams(
dd35f6 ¤   PGPContextRef ¤ context,
361d09 ¤   short ¤ ¤   ¤   vRefNum)
8abb36 {
51f19b ¤   PGPPrefRef¤ prefRef;
0b61e0 ¤   PGPError¤   err;
e667c5 ¤
3eeaf9 ¤   mContext¤   ¤   ¤   ¤   = context;
9790e8 ¤   mWipeVolInfo.vRefNum ¤  = vRefNum;
9eaf5a
0ec067 ¤   err = PGPOpenClientPrefs( PGPGetContextMemoryMgr( context ), &prefRef );
3cb1f0 ¤   if( IsntPGPError( err ) )
fac7a1 ¤   {
92ba47 ¤   ¤   err = PGPGetPrefNumber( prefRef, kPGPPrefDiskWipePasses,
f6c109 ¤   ¤   ¤   ¤   ¤   &mWipingPasses );
6d7904 ¤   ¤   pgpAssert( IsntErr( err ) );
16af5a
6eb512 ¤   ¤   (void) PGPClosePrefFile( prefRef );
fa9371 ¤   }
6cefe6 }
9caf5a
--8519 000cddbe97440120110 Page 10 of CWipeFreeSpaceWizardDialog.cp
3b6d52 ¤   void
639389 CWipeFreeSpaceWizardDialog::FinishCreateSelf()
64bb36 {
c3893a ¤   LGADialog::FinishCreateSelf();
2e67c5 ¤
6c16ac ¤   RegisterClass_( CWipeFreeSpaceWizardView );
bad835 ¤   RegisterClass_( CSelectVolumeParamsView );
56cd63 ¤   RegisterClass_( CWipingProgressView );
ee67c5 ¤
acd4e7 ¤   SetThemeWindowBackground( GetMacPort(),
ed8188 ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
f8af5a
efeab8 ¤   mNextButton = (LPushButton *) FindPaneByID( kNextButtonPaneID );
2c4451 ¤   pgpAssertAddrValid( mNextButton, VoidAlign );
ffaf5a
be50ad ¤   mPreviousButton = (LPushButton *) FindPaneByID( kPreviousButtonPaneID );
c49521 ¤   pgpAssertAddrValid( mPreviousButton, VoidAlign );
d7af5a
6473a9 ¤   mCancelButton = (LPushButton *) FindPaneByID( kCancelButtonPaneID );
6782a9 ¤   pgpAssertAddrValid( mCancelButton, VoidAlign );
50af5a
6fb39b ¤   // mNextButton already added by the modal dialog handler.
1cf014 ¤   mPreviousButton->AddListener( this );
7baf5a
5ae226 ¤   mNewView ¤  = kWipeFreeSpaceView_Invalid;
63d103 ¤   mError¤ ¤   = kPGPError_NoErr;
6667c5 ¤
14f72e ¤   SwitchToView( kWipeFreeSpaceView_Introduction );
fb68d2 ¤   StartIdling();
a3efe6 }
d4af5a
d06d52 ¤   void
52c672 CWipeFreeSpaceWizardDialog::ApplyForeAndBackColors(void) const
60bb36 {
04d4e7 ¤   SetThemeWindowBackground( GetMacPort(),
818188 ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
ecefe6 }
abaf5a
556d52 ¤   void
27adbc CWipeFreeSpaceWizardDialog::ListenToMessage(
6a19a3 ¤   MessageT ¤  inMessage,
b07503 ¤   void ¤  ¤   *ioParam)
1cbb36 {
a928bb ¤   (void) ioParam;
c767c5 ¤
4b769e ¤   switch( inMessage )
dfc7a1 ¤   {
a02806 ¤   ¤   case kNextViewMessage:
477e20 ¤   ¤   ¤   SetNewView( GetNextView( mCurrentView ) );
f7cdcb ¤   ¤   ¤   break;
9887c7 ¤   ¤   ¤
7ac01f ¤   ¤   case kPreviousViewMessage:
6ce8c5 ¤   ¤   ¤   SetNewView( GetPreviousView( mCurrentView ) );
10cdcb ¤   ¤   ¤   break;
6387c7 ¤   ¤   ¤
ae5686 ¤   ¤   case msg_Cancel:
4a58a1 ¤   ¤   ¤   DoClose();
a1cdcb ¤   ¤   ¤   break;
841b52 ¤   ¤
fd7d54 ¤   ¤   case kAllowNextViewSwitchMessage:
c317a3 ¤   ¤   ¤   mNextButton->Enable();
b2cdcb ¤   ¤   ¤   break;
22ae30 ¤   ¤   ¤   ¤   ¤
96e1fc ¤   ¤   case kAllowPrevViewSwitchMessage:
256ce0 ¤   ¤   ¤   mPreviousButton->Enable();
2acdcb ¤   ¤   ¤   break;
9887c7 ¤   ¤   ¤
ee114f ¤   ¤   case kDenyNextViewSwitchMessage:
37daee ¤   ¤   ¤   mNextButton->Disable();
eccdcb ¤   ¤   ¤   break;
1187c7 ¤   ¤   ¤
cd8de7 ¤   ¤   case kDenyPrevViewSwitchMessage:
--bd58 000012ff7e540120110 Page 11 of CWipeFreeSpaceWizardDialog.cp
feaa0a ¤   ¤   ¤   mPreviousButton->Disable();
55cdcb ¤   ¤   ¤   break;
08af5a
a66b3f ¤   ¤   case kDenyCancelMessage:
cbcfee ¤   ¤   ¤   mCancelButton->Disable();
9acdcb ¤   ¤   ¤   break;
7987c7 ¤   ¤   ¤
3e9ae3 ¤   ¤   default:
041d75 ¤   ¤   ¤   LGADialog::ListenToMessage( inMessage, ioParam );
cbcdcb ¤   ¤   ¤   break;
209371 ¤   }
4cefe6 }
0eaf5a
4a6d52 ¤   void
5fa9e6 CWipeFreeSpaceWizardDialog::AdjustControlsForView(WipeFreeSpaceView theView)
fabb36 {
65845b ¤   short¤  titleIndex = kNextButtonTitleStrIndex;
8a5d1a ¤   Str255¤ buttonTitle;
3e67c5 ¤
bb8ff4 ¤   mNextButton->Enable();
78a16c ¤   mPreviousButton->Enable();
65af5a
9d4d1e ¤   switch( theView )
0dc7a1 ¤   {
3940ec ¤   ¤   case kWipeFreeSpaceView_Introduction:
b15b34 ¤   ¤   {
c0aa0a ¤   ¤   ¤   mPreviousButton->Disable();
1787c7 ¤   ¤   ¤
8cc91b ¤   ¤   ¤   if( FileSharingIsActive() )
ff1fbb ¤   ¤   ¤   ¤   mNextButton->Disable();
a02b85 ¤   ¤   ¤   ¤
bacdcb ¤   ¤   ¤   break;
8a0fe4 ¤   ¤   }
6a87c7 ¤   ¤   ¤
3360ed ¤   ¤   case kWipeFreeSpaceView_Conclusion:
693738 ¤   ¤   case kWipeFreeSpaceView_Error:
f5eb1e ¤   ¤   case kWipeFreeSpaceView_IntegrityFailure:
f1a7bc ¤   ¤   case kWipeFreeSpaceView_VersionFailure:
c02bd5 ¤   ¤   ¤   titleIndex = kDoneButtonTitleStrIndex;
a4aa0a ¤   ¤   ¤   mPreviousButton->Disable();
4bcfee ¤   ¤   ¤   mCancelButton->Disable();
c2cdcb ¤   ¤   ¤   break;
8287c7 ¤   ¤   ¤
712c9f ¤   ¤   case kWipeFreeSpaceView_Wiping:
9bdaee ¤   ¤   ¤   mNextButton->Disable();
34cdcb ¤   ¤   ¤   break;
2c9371 ¤   }
a567c5 ¤
5e191d ¤   GetIndString( buttonTitle, kPGPtoolsMiscStringsResID, titleIndex );
fc4bf6 ¤   mNextButton->SetDescriptor( buttonTitle );
b8efe6 }
a7af5a
485af8 ¤   WipeFreeSpaceView
e23d04 CWipeFreeSpaceWizardDialog::GetNextView(WipeFreeSpaceView theView)
3cbb36 {
3786a8 ¤   WipeFreeSpaceView¤  nextView;
7667c5 ¤
334d1e ¤   switch( theView )
d5c7a1 ¤   {
aa40ec ¤   ¤   case kWipeFreeSpaceView_Introduction:
681c0c ¤   ¤   ¤   nextView = kWipeFreeSpaceView_SelectVolume;
91cdcb ¤   ¤   ¤   break;
861b52 ¤   ¤
697257 ¤   ¤   case kWipeFreeSpaceView_SelectVolume:
d80277 ¤   ¤   case kWipeFreeSpaceView_UnmountHFSFailure:
75bb5e ¤   ¤   case kWipeFreeSpaceView_UnmountHFSPlusFailure:
20ec30 ¤   ¤   ¤   nextView = kWipeFreeSpaceView_Wiping;
e4cdcb ¤   ¤   ¤   break;
ccaf5a
232c9f ¤   ¤   case kWipeFreeSpaceView_Wiping:
286740 ¤   ¤   ¤   nextView = kWipeFreeSpaceView_Conclusion;
01cdcb ¤   ¤   ¤   break;
--78bc 000b2ee332340120110 Page 12 of CWipeFreeSpaceWizardDialog.cp
e0af5a
5c60ed ¤   ¤   case kWipeFreeSpaceView_Conclusion:
613738 ¤   ¤   case kWipeFreeSpaceView_Error:
24eb1e ¤   ¤   case kWipeFreeSpaceView_IntegrityFailure:
21a7bc ¤   ¤   case kWipeFreeSpaceView_VersionFailure:
d4df68 ¤   ¤   ¤   nextView = kWipeFreeSpaceView_Exit;
f0cdcb ¤   ¤   ¤   break;
41af5a
cc9ae3 ¤   ¤   default:
86a311 ¤   ¤   ¤   pgpDebugMsg( "Missing next view" );
7dba2c ¤   ¤   ¤   nextView = theView;
d6cdcb ¤   ¤   ¤   break;
ed9371 ¤   }
d367c5 ¤
d97d38 ¤   return( nextView );
9cefe6 }
4caf5a
925af8 ¤   WipeFreeSpaceView
0217a8 CWipeFreeSpaceWizardDialog::GetPreviousView(WipeFreeSpaceView theView)
07bb36 {
d497aa ¤   WipeFreeSpaceView¤  previousView;
d767c5 ¤
f94d1e ¤   switch( theView )
3ec7a1 ¤   {
7f7257 ¤   ¤   case kWipeFreeSpaceView_SelectVolume:
e34f6c ¤   ¤   ¤   previousView = kWipeFreeSpaceView_Introduction;
b0cdcb ¤   ¤   ¤   break;
95af5a
fd0277 ¤   ¤   case kWipeFreeSpaceView_UnmountHFSFailure:
c4bb5e ¤   ¤   case kWipeFreeSpaceView_UnmountHFSPlusFailure:
442c9f ¤   ¤   case kWipeFreeSpaceView_Wiping:
f57dd7 ¤   ¤   ¤   previousView = kWipeFreeSpaceView_SelectVolume;
dccdcb ¤   ¤   ¤   break;
7baf5a
039ae3 ¤   ¤   default:
ac8f2e ¤   ¤   ¤   pgpDebugMsg( "Missing previous view" );
4bac25 ¤   ¤   ¤   previousView = theView;
25cdcb ¤   ¤   ¤   break;
169371 ¤   }
1f67c5 ¤
6af77c ¤   return( previousView );
93efe6 }
48af5a
145af8 ¤   WipeFreeSpaceView
9697d9 CWipeFreeSpaceWizardDialog::LeaveCurrentView(WipeFreeSpaceView newView)
13bb36 {
b9c99d ¤   switch( mCurrentView )
fdc7a1 ¤   {
de7257 ¤   ¤   case kWipeFreeSpaceView_SelectVolume:
705b34 ¤   ¤   {
7e2856 ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   ¤   wipePasses;
7e2eab ¤   ¤   ¤   CSelectVolumeParamsView¤*viewObj;
ca87c7 ¤   ¤   ¤
13ec40 ¤   ¤   ¤   viewObj = (CSelectVolumeParamsView *) mCurrentViewObj;
152b85 ¤   ¤   ¤   ¤
f40ef8 ¤   ¤   ¤   viewObj->GetParams( &mWipeVolInfo, &wipePasses );
a287c7 ¤   ¤   ¤
e8ff0c ¤   ¤   ¤   if( wipePasses != mWipingPasses )
bef776 ¤   ¤   ¤   {
1f5f3a ¤   ¤   ¤   ¤   PGPError¤   err;
9043f8 ¤   ¤   ¤   ¤   PGPPrefRef¤ prefRef;
beaf5a
7ec7f4 ¤   ¤   ¤   ¤   mWipingPasses = wipePasses;
072b85 ¤   ¤   ¤   ¤
125a05 ¤   ¤   ¤   ¤   err = PGPOpenClientPrefs( PGPGetContextMemoryMgr( mContext ),
5aeb7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   &prefRef );
225565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
7672c3 ¤   ¤   ¤   ¤   {
f560b3 ¤   ¤   ¤   ¤   ¤   err = PGPSetPrefNumber( prefRef, kPGPPrefDiskWipePasses,
099987 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mWipingPasses );
5328cc ¤   ¤   ¤   ¤   ¤   pgpAssert( IsntErr( err ) );
b2af5a
--5799 00032bb02b440120110 Page 13 of CWipeFreeSpaceWizardDialog.cp
ca7c2b ¤   ¤   ¤   ¤   ¤   (void) PGPSavePrefFile( prefRef );
226eaf ¤   ¤   ¤   ¤   ¤   (void) PGPClosePrefFile( prefRef );
342613 ¤   ¤   ¤   ¤   }
8ba3a6 ¤   ¤   ¤   }
aa87c7 ¤   ¤   ¤
7d6778 ¤   ¤   ¤   /* Fall through */
720fe4 ¤   ¤   }
af1b52 ¤   ¤
d7bb5e ¤   ¤   case kWipeFreeSpaceView_UnmountHFSPlusFailure:
555b34 ¤   ¤   {
c82985 ¤   ¤   ¤   if( newView == kWipeFreeSpaceView_Wiping )
44f776 ¤   ¤   ¤   {
5c1b95 ¤   ¤   ¤   ¤   if( mWipeVolInfo.canWipe )
3072c3 ¤   ¤   ¤   ¤   {
093c00 ¤   ¤   ¤   ¤   ¤   OSErr¤  err;
96ae30 ¤   ¤   ¤   ¤   ¤
95a3e7 ¤   ¤   ¤   ¤   ¤   /*
701dbc ¤   ¤   ¤   ¤   ¤   ** Try to unmount volume. If we cannot, go to unmount
2ffaf4 ¤   ¤   ¤   ¤   ¤   ** warning page.
85e4e2 ¤   ¤   ¤   ¤   ¤   */
e2ae30 ¤   ¤   ¤   ¤   ¤
071b3c ¤   ¤   ¤   ¤   ¤   err = UnmountVol( NULL, mWipeVolInfo.vRefNum );
31da4b ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
9b4859 ¤   ¤   ¤   ¤   ¤   {
6baf72 ¤   ¤   ¤   ¤   ¤   ¤   if( mWipeVolInfo.signature == kHFSSigWord )
fb8fec ¤   ¤   ¤   ¤   ¤   ¤   {
87dfac ¤   ¤   ¤   ¤   ¤   ¤   ¤   newView = kWipeFreeSpaceView_UnmountHFSFailure;
04db3c ¤   ¤   ¤   ¤   ¤   ¤   }
039761 ¤   ¤   ¤   ¤   ¤   ¤   else if( mWipeVolInfo.signature == kHFSPlusSigWord )
c78fec ¤   ¤   ¤   ¤   ¤   ¤   {
25eeb0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newView = kWipeFreeSpaceView_UnmountHFSPlusFailure;
cedb3c ¤   ¤   ¤   ¤   ¤   ¤   }
fc7f8b ¤   ¤   ¤   ¤   ¤   ¤   else
8e8fec ¤   ¤   ¤   ¤   ¤   ¤   {
3ba186 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDebugMsg( "Unknown volume signature" );
b16904 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newView = mCurrentView;
e2db3c ¤   ¤   ¤   ¤   ¤   ¤   }
681c89 ¤   ¤   ¤   ¤   ¤   }
834bd6 ¤   ¤   ¤   ¤   ¤   else
a94859 ¤   ¤   ¤   ¤   ¤   {
ebb33a ¤   ¤   ¤   ¤   ¤   ¤   ParamBlockRec¤  pb;
af94aa ¤   ¤   ¤   ¤   ¤   ¤
6590cd ¤   ¤   ¤   ¤   ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
2594aa ¤   ¤   ¤   ¤   ¤   ¤
d53b09 ¤   ¤   ¤   ¤   ¤   ¤   pb.volumeParam.ioVRefNum = mWipeVolInfo.driveNumber;
8d94aa ¤   ¤   ¤   ¤   ¤   ¤
e063ee ¤   ¤   ¤   ¤   ¤   ¤   err = PBMountVol( &pb );
eb5f35 ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
9b8fec ¤   ¤   ¤   ¤   ¤   ¤   {
2ec78f ¤   ¤   ¤   ¤   ¤   ¤   ¤   mWipeVolInfo.vRefNum = pb.volumeParam.ioVRefNum;
6adb3c ¤   ¤   ¤   ¤   ¤   ¤   }
157f8b ¤   ¤   ¤   ¤   ¤   ¤   else
b38fec ¤   ¤   ¤   ¤   ¤   ¤   {
fe408c ¤   ¤   ¤   ¤   ¤   ¤   ¤   mError ¤= MacErrorToPGPError( err );
eb1cf1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newView¤= kWipeFreeSpaceView_Error;
55db3c ¤   ¤   ¤   ¤   ¤   ¤   }
761c89 ¤   ¤   ¤   ¤   ¤   }
d02613 ¤   ¤   ¤   ¤   }
17fa07 ¤   ¤   ¤   ¤   else
3172c3 ¤   ¤   ¤   ¤   {
5f33ef ¤   ¤   ¤   ¤   ¤   newView = kWipeFreeSpaceView_SelectVolume;
082613 ¤   ¤   ¤   ¤   }
15a3a6 ¤   ¤   ¤   }
9f87c7 ¤   ¤   ¤
38cdcb ¤   ¤   ¤   break;
ab0fe4 ¤   ¤   }
929371 ¤   }
72af5a
a05eeb ¤   if( newView != kWipeFreeSpaceView_Invalid &&
8885d2 ¤   ¤   IsntNull( mCurrentViewObj ) )
8dc7a1 ¤   {
32fe54 ¤   ¤   Rect¤   viewRect;
--03fb 0006920c1ac40120110 Page 14 of CWipeFreeSpaceWizardDialog.cp
f11b52 ¤   ¤
2c37e7 ¤   ¤   mCurrentViewObj->CalcPortFrameRect( viewRect );
1e4035 ¤   ¤   delete mCurrentViewObj;¤¤   ¤   ¤   // delete it
2bf5b1 ¤   ¤   mCurrentViewObj = NULL;
ab1b52 ¤   ¤
d9df40 ¤   ¤   FocusDraw();
49ccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
6c8188 ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
b0b28c ¤   ¤   EraseRect( &viewRect );
b19371 ¤   }
9267c5 ¤
b720a3 ¤   return( newView );
b6efe6 }
3faf5a
166d52 ¤   void
84276f CWipeFreeSpaceWizardDialog::EnterView(WipeFreeSpaceView newView)
a2bb36 {
51ff1f ¤   ResIDT¤ newViewResID;
e267c5 ¤
38f3ee ¤   switch( newView )
8dc7a1 ¤   {
013738 ¤   ¤   case kWipeFreeSpaceView_Error:
08f8e9 ¤   ¤   ¤   newViewResID = view_Error;
7ecdcb ¤   ¤   ¤   break;
ba1b52 ¤   ¤
08eb1e ¤   ¤   case kWipeFreeSpaceView_IntegrityFailure:
b2d2f0 ¤   ¤   ¤   newViewResID = view_IntegrityFailure;
82cdcb ¤   ¤   ¤   break;
851b52 ¤   ¤
64a7bc ¤   ¤   case kWipeFreeSpaceView_VersionFailure:
f16489 ¤   ¤   ¤   newViewResID = view_VersionFailure;
17cdcb ¤   ¤   ¤   break;
f087c7 ¤   ¤   ¤
1440ec ¤   ¤   case kWipeFreeSpaceView_Introduction:
da4534 ¤   ¤   ¤   newViewResID = view_Introduction;
50cdcb ¤   ¤   ¤   break;
20af5a
567257 ¤   ¤   case kWipeFreeSpaceView_SelectVolume:
f8778f ¤   ¤   ¤   newViewResID = view_SelectVolume;
37cdcb ¤   ¤   ¤   break;
86af5a
462c9f ¤   ¤   case kWipeFreeSpaceView_Wiping:
06a850 ¤   ¤   ¤   newViewResID = view_Wiping;
b3cdcb ¤   ¤   ¤   break;
35af5a
640277 ¤   ¤   case kWipeFreeSpaceView_UnmountHFSFailure:
1f4f3a ¤   ¤   ¤   newViewResID = view_UnmountHFSFailure;
f5cdcb ¤   ¤   ¤   break;
16af5a
cebb5e ¤   ¤   case kWipeFreeSpaceView_UnmountHFSPlusFailure:
abc29c ¤   ¤   ¤   newViewResID = view_UnmountHFSPlusFailure;
28cdcb ¤   ¤   ¤   break;
a787c7 ¤   ¤   ¤
7660ed ¤   ¤   case kWipeFreeSpaceView_Conclusion:
ef9bb3 ¤   ¤   ¤   newViewResID = view_Conclusion;
44cdcb ¤   ¤   ¤   break;
1287c7 ¤   ¤   ¤
df9ae3 ¤   ¤   default:
042c57 ¤   ¤   ¤   newViewResID = 0;
3bcdcb ¤   ¤   ¤   break;
cb9371 ¤   }
01af5a
128620 ¤   if( newViewResID != 0 )
87c7a1 ¤   {
5798ef ¤   ¤   AdjustControlsForView( newView );
31af5a
b1e776 ¤   ¤   LCommander::SetDefaultCommander( this );
ce0ad3 ¤   ¤   LPane::SetDefaultView( this );
381b52 ¤   ¤
737a8f ¤   ¤   mCurrentViewObj = (CWipeFreeSpaceWizardView *)
f8711e ¤   ¤   ¤   ¤   ¤   ¤   ¤   UReanimator::ReadObjects( 'PPob', newViewResID );
69cc83 ¤   ¤   mCurrentViewObj->FinishCreate();
--74c1 000d1ac543040120110 Page 15 of CWipeFreeSpaceWizardDialog.cp
95e4f1 ¤   ¤   mCurrentViewObj->SetSuperCommander( this );
c9ff8e ¤   ¤   mCurrentViewObj->AddListener( this );
941b52 ¤   ¤
db345b ¤   ¤   switch( newView )
265b34 ¤   ¤   {
970fd2 ¤   ¤   ¤   case kWipeFreeSpaceView_Introduction:
dcf776 ¤   ¤   ¤   {
90417d ¤   ¤   ¤   ¤   if( FileSharingIsActive() )
4372c3 ¤   ¤   ¤   ¤   {
d814f4 ¤   ¤   ¤   ¤   ¤   LPane¤  *fileSharingWarning;
7c87c7 ¤   ¤   ¤
2b99ae ¤   ¤   ¤   ¤   ¤   fileSharingWarning = mCurrentViewObj->FindPaneByID( 1 );
29b524 ¤   ¤   ¤   ¤   ¤   if( IsntNull( fileSharingWarning ) )
926913 ¤   ¤   ¤   ¤   ¤   ¤   fileSharingWarning->Show();
722613 ¤   ¤   ¤   ¤   }
152b85 ¤   ¤   ¤   ¤
69f622 ¤   ¤   ¤   ¤   break;
9ba3a6 ¤   ¤   ¤   }
a587c7 ¤   ¤   ¤
6e3d69 ¤   ¤   ¤   case kWipeFreeSpaceView_SelectVolume:
a1f776 ¤   ¤   ¤   {
9c3b86 ¤   ¤   ¤   ¤   CSelectVolumeParamsView¤*viewObj =
fab822 ¤   ¤   ¤   ¤   ¤   ¤   (CSelectVolumeParamsView *) mCurrentViewObj;
fa2b85 ¤   ¤   ¤   ¤
f18ff1 ¤   ¤   ¤   ¤   viewObj->SetParams( mWipeVolInfo.vRefNum, mWipingPasses );
29f622 ¤   ¤   ¤   ¤   break;
55a3a6 ¤   ¤   ¤   }
b487c7 ¤   ¤   ¤
c01350 ¤   ¤   ¤   case kWipeFreeSpaceView_UnmountHFSFailure:
a5bc65 ¤   ¤   ¤   case kWipeFreeSpaceView_UnmountHFSPlusFailure:
9ff776 ¤   ¤   ¤   {
bc3226 ¤   ¤   ¤   ¤   LStaticText¤*textObj;
9114f6 ¤   ¤   ¤   ¤   Str255¤ ¤   text;
ba2b85 ¤   ¤   ¤   ¤
804b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
ab2b85 ¤   ¤   ¤   ¤
d088e3 ¤   ¤   ¤   ¤   textObj = (LStaticText *) mCurrentViewObj->FindPaneByID( 1 );
93e8be ¤   ¤   ¤   ¤   pgpAssert( IsntNull( textObj ) );
6c2b85 ¤   ¤   ¤   ¤
b53c3e ¤   ¤   ¤   ¤   textObj->GetDescriptor( text );
045d14 ¤   ¤   ¤   ¤   PrintPString( text, text, mWipeVolInfo.name );
30d720 ¤   ¤   ¤   ¤   textObj->SetDescriptor( text );
192b85 ¤   ¤   ¤   ¤
78952f ¤   ¤   ¤   ¤   textObj = (LStaticText *) mCurrentViewObj->FindPaneByID( 2 );
afe8be ¤   ¤   ¤   ¤   pgpAssert( IsntNull( textObj ) );
3b2b85 ¤   ¤   ¤   ¤
693c3e ¤   ¤   ¤   ¤   textObj->GetDescriptor( text );
335d14 ¤   ¤   ¤   ¤   PrintPString( text, text, mWipeVolInfo.name );
41d720 ¤   ¤   ¤   ¤   textObj->SetDescriptor( text );
e82b85 ¤   ¤   ¤   ¤
91f622 ¤   ¤   ¤   ¤   break;
d6a3a6 ¤   ¤   ¤   }
4287c7 ¤   ¤   ¤
663974 ¤   ¤   ¤   case kWipeFreeSpaceView_Error:
24f776 ¤   ¤   ¤   {
ab3226 ¤   ¤   ¤   ¤   LStaticText¤*textObj;
d214f6 ¤   ¤   ¤   ¤   Str255¤ ¤   text;
9334e3 ¤   ¤   ¤   ¤   Str255¤ ¤   errorStr;
3f2b85 ¤   ¤   ¤   ¤
994b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
5f2b85 ¤   ¤   ¤   ¤
5a7121 ¤   ¤   ¤   ¤   PGPGetClientErrorString( mError, sizeof( errorStr ),
dda25a ¤   ¤   ¤   ¤   ¤   ¤   ¤   (char *) errorStr );
8cacde ¤   ¤   ¤   ¤   CToPString( (char *) errorStr, errorStr );
7d2b85 ¤   ¤   ¤   ¤
5b88e3 ¤   ¤   ¤   ¤   textObj = (LStaticText *) mCurrentViewObj->FindPaneByID( 1 );
eae8be ¤   ¤   ¤   ¤   pgpAssert( IsntNull( textObj ) );
4b2b85 ¤   ¤   ¤   ¤
563c3e ¤   ¤   ¤   ¤   textObj->GetDescriptor( text );
dd5d14 ¤   ¤   ¤   ¤   PrintPString( text, text, mWipeVolInfo.name );
121378 ¤   ¤   ¤   ¤   PrintPString( text, text, errorStr );
d12b85 ¤   ¤   ¤   ¤
--098c 000d547e79e40120110 Page 16 of CWipeFreeSpaceWizardDialog.cp
72d720 ¤   ¤   ¤   ¤   textObj->SetDescriptor( text );
a2f622 ¤   ¤   ¤   ¤   break;
d8a3a6 ¤   ¤   ¤   }
6faf5a
68451f ¤   ¤   ¤   case kWipeFreeSpaceView_IntegrityFailure:
a231fd ¤   ¤   ¤   case kWipeFreeSpaceView_VersionFailure:
a14b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
c94b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
114b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
7a2b85 ¤   ¤   ¤   ¤
65eb07 ¤   ¤   ¤   ¤   /* Fall through */
d32b85 ¤   ¤   ¤   ¤
4d78bd ¤   ¤   ¤   case kWipeFreeSpaceView_Conclusion:
89f776 ¤   ¤   ¤   {
983226 ¤   ¤   ¤   ¤   LStaticText¤*textObj;
be14f6 ¤   ¤   ¤   ¤   Str255¤ ¤   text;
872b85 ¤   ¤   ¤   ¤
cb2b85 ¤   ¤   ¤   ¤
4988e3 ¤   ¤   ¤   ¤   textObj = (LStaticText *) mCurrentViewObj->FindPaneByID( 1 );
58e8be ¤   ¤   ¤   ¤   pgpAssert( IsntNull( textObj ) );
7c2b85 ¤   ¤   ¤   ¤
1b3c3e ¤   ¤   ¤   ¤   textObj->GetDescriptor( text );
825d14 ¤   ¤   ¤   ¤   PrintPString( text, text, mWipeVolInfo.name );
10d720 ¤   ¤   ¤   ¤   textObj->SetDescriptor( text );
c52b85 ¤   ¤   ¤   ¤
81f622 ¤   ¤   ¤   ¤   break;
1fa3a6 ¤   ¤   ¤   }
4b87c7 ¤   ¤   ¤
cda4f9 ¤   ¤   ¤   case kWipeFreeSpaceView_Wiping:
98f776 ¤   ¤   ¤   {
750dac ¤   ¤   ¤   ¤   CWipingProgressView¤*viewObj =
c00b2e ¤   ¤   ¤   ¤   ¤   ¤   (CWipingProgressView *) mCurrentViewObj;
8e2b85 ¤   ¤   ¤   ¤
dcfe58 ¤   ¤   ¤   ¤   viewObj->SetParams( mContext, &mWipeVolInfo, mWipingPasses );
ecf622 ¤   ¤   ¤   ¤   break;
2aa3a6 ¤   ¤   ¤   }
e50fe4 ¤   ¤   }
ed1b52 ¤   ¤
191863 ¤   ¤   mCurrentViewObj->Show();
b89c3a ¤   ¤   mCurrentViewObj->Draw( NULL );
29d1bf ¤   ¤   mCurrentViewObj->DontRefresh();
7e9371 ¤   }
ea67c5 ¤
02ee3e ¤   mCurrentView = newView;
31efe6 }
d6af5a
a3af5a
2d6d52 ¤   void
2682b8 CWipeFreeSpaceWizardDialog::SwitchToView(WipeFreeSpaceView newView)
c3bb36 {
86d7c4 ¤   newView = LeaveCurrentView( newView );
cc6630 ¤   if( newView != kWipeFreeSpaceView_Invalid )
449108 ¤   {·
faea60 ¤   ¤   EnterView( newView );
299371 ¤   }
6eefe6 }
91af5a
176d52 ¤   void
1e3808 CWipeFreeSpaceWizardDialog::SetNewView(WipeFreeSpaceView newView)
79bb36 {
026eba ¤   mNewView = newView;
06efe6 }
9eaf5a
726d52 ¤   void
cf003c CWipeFreeSpaceWizardDialog::SetError(PGPError err)
6fbb36 {
2f2d11 ¤   mError = err;
44efe6 }
78af5a
ba6d52 ¤   void
48118d CWipeFreeSpaceWizardDialog::FindCommandStatus(
d5ea24 ¤   CommandT¤   inCommand,
--4b6a 001d8c8739840120110 Page 17 of CWipeFreeSpaceWizardDialog.cp
7fa472 ¤   Boolean¤¤   &outEnabled,
293a4d ¤   Boolean¤¤   &outUsesMark,
a65dc0 ¤   Char16¤ ¤   &outMark,
2dd894 ¤   Str255¤ ¤   outName)
d3bb36 {
2eff8b ¤   (void) inCommand;
00f752 ¤   (void) outUsesMark;
fdd057 ¤   (void) outMark;
11bd69 ¤   (void) outName;
0b67c5 ¤
ee5e7f ¤   outEnabled = false;
53efe6 }
e8af5a
406d52 ¤   void
e5e018 CWipeFreeSpaceWizardDialog::SpendTime(const EventRecord &inMacEvent)
0cbb36 {
d864da ¤   (void) inMacEvent;
9767c5 ¤
1fd8d3 ¤   if( mNewView == kWipeFreeSpaceView_Exit )
15c7a1 ¤   {
cc6348 ¤   ¤   DoClose();
279371 ¤   }
9517ca ¤   else if( mNewView != kWipeFreeSpaceView_Invalid )
bac7a1 ¤   {
9fcffa ¤   ¤   WipeFreeSpaceView¤  newView;
781b52 ¤   ¤
20e75c ¤   ¤   newView ¤   = mNewView;
307468 ¤   ¤   mNewView¤   = kWipeFreeSpaceView_Invalid;
601b52 ¤   ¤
7995f1 ¤   ¤   SwitchToView( newView );
2b9371 ¤   }
6667c5 ¤
06cbd3 ¤   if( mCurrentView == kWipeFreeSpaceView_Introduction )
3dc7a1 ¤   {
180c4e ¤   ¤   if( FileSharingIsActive() )
d85b34 ¤   ¤   {
c9cdeb ¤   ¤   ¤   if( mNextButton->IsEnabled() )
5c1fbb ¤   ¤   ¤   ¤   mNextButton->Disable();
1d0fe4 ¤   ¤   }
e811e8 ¤   ¤   else if( ! mNextButton->IsEnabled() )
ca5b34 ¤   ¤   {
1c17a3 ¤   ¤   ¤   mNextButton->Enable();
600fe4 ¤   ¤   }
9f9371 ¤   }
c187c7 ¤   ¤   ¤
d8be43 }¶
--27c9 000fc47db2840120111 Page 1 of CWipeFreeSpaceWizardDialog.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
f13db7 ¤   $Id: CWipeFreeSpaceWizardDialog.h,v 1.10.8.1 1998/11/12 03:09:27 heller Exp¶
cbed4e ·$
c4f7f7 ____________________________________________________________________________*/
527b7d #pragma once
fcaf5a
02ea2f #include <LBroadcaster.h>
4ff0a0 #include <LGADialog.h>
620a93 #include <LPeriodical.h>
e5af5a
b8c721 typedef struct WipeVolumeInfo
e6bb36 {
ad0feb ¤   short¤  vRefNum;
e71074 ¤   Str63¤  name;
bbc122 ¤   ushort¤ signature;
fe9771 ¤   short¤  driveNumber;
54ebe3 ¤   short¤  driverRefNum;
039464 ¤   Boolean¤canWipe;
bd67c5 ¤
cbf7b3 } WipeVolumeInfo;
edaf5a
a3b432 // It is assumed that this enum is kept in user presentation order.
703b74 typedef enum WipeFreeSpaceView
ddbb36 {
612794 ¤   kWipeFreeSpaceView_Invalid¤ ¤   ¤   = 1,
ef5792 ¤   kWipeFreeSpaceView_Error,
27f7b6 ¤   kWipeFreeSpaceView_IntegrityFailure,
30e610 ¤   kWipeFreeSpaceView_VersionFailure,
d4515e ¤   kWipeFreeSpaceView_Introduction,
c663e5 ¤   kWipeFreeSpaceView_SelectVolume,
35b924 ¤   kWipeFreeSpaceView_UnmountHFSFailure,
8c736a ¤   kWipeFreeSpaceView_UnmountHFSPlusFailure,
22b4a2 ¤   kWipeFreeSpaceView_Wiping,
297320 ¤   kWipeFreeSpaceView_Conclusion,
d62335 ¤   kWipeFreeSpaceView_Exit¤¤   ¤   // Not a real view
3367c5 ¤
1e2a5a } WipeFreeSpaceView;
54af5a
d25b3c class CWipeFreeSpaceWizardView;
7488da class LPushButton;
81af5a
efe81c class CWipeFreeSpaceWizardDialog : ¤public LGADialog,
3a1f38 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LPeriodical,
270c91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster
72bb36 {
295ed4 public:
9ebf24 ¤   enum { class_ID = 'WFSW' };
9b67c5 ¤
43c8c1 ¤   ¤   ¤   ¤   ¤   ¤   CWipeFreeSpaceWizardDialog(LStream *inStream);
35fc95 ¤   virtual¤¤   ¤   ¤   ~CWipeFreeSpaceWizardDialog();
feaf5a
bb42ec ¤   virtual void¤   ¤   ApplyForeAndBackColors(void) const;
4448a0 ¤   virtual void¤   ¤   FindCommandStatus(CommandT inCommand,
68db44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
2afcde ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName);
09dad0 ¤   virtual¤void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
f8ef34 ¤   void¤   ¤   ¤   ¤   SetParams(PGPContextRef context, short vRefNum);
ea445a ¤   virtual void¤   ¤   SpendTime(const EventRecord &inMacEvent);
8aaf5a
484e3b ¤   static void¤¤   ¤   SetNewView(WipeFreeSpaceView newView);
fb1b31 ¤   static void¤¤   ¤   SetError(PGPError err);
a1af5a
19a2d3 protected:
4faf5a
19d5cd ¤   virtual¤void¤   ¤   FinishCreateSelf(void);
69af5a
100fb9 private:
15af5a
fc4c31 ¤   PGPContextRef¤  ¤   ¤   ¤   mContext;
--78c1 001164efdf840120111 Page 2 of CWipeFreeSpaceWizardDialog.h
ef7216 ¤   WipeFreeSpaceView¤  ¤   ¤   mCurrentView;
35f43e ¤   CWipeFreeSpaceWizardView¤   *mCurrentViewObj;
714ad5 ¤   LPushButton¤¤   ¤   ¤   ¤   *mNextButton;
f38176 ¤   LPushButton¤¤   ¤   ¤   ¤   *mPreviousButton;
f31a1b ¤   LPushButton¤¤   ¤   ¤   ¤   *mCancelButton;
c7dcae ¤   WipeVolumeInfo¤ ¤   ¤   ¤   mWipeVolInfo;
411bb4 ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   mWipingPasses;
c467c5 ¤
010a50 ¤   static WipeFreeSpaceView¤   mNewView;
4c4061 ¤   static PGPError¤¤   ¤   ¤   mError;
d167c5 ¤
93590a ¤   void¤   ¤   ¤   ¤   AdjustControlsForView(WipeFreeSpaceView theView);
ccb944 ¤   void¤   ¤   ¤   ¤   EnterView(WipeFreeSpaceView newView);
ebc586 ¤   WipeFreeSpaceView¤  GetNextView(WipeFreeSpaceView theView);
3b1998 ¤   WipeFreeSpaceView¤  GetPreviousView(WipeFreeSpaceView theView);
257720 ¤   WipeFreeSpaceView¤  LeaveCurrentView(WipeFreeSpaceView newView);
c01618 ¤   void¤   ¤   ¤   ¤   SwitchToView(WipeFreeSpaceView newView);
92303e ¤   Boolean¤¤   ¤   ¤   ValidateCurrentView(void);
2282f7 };
16af5a
--44b7 00153d6514b40120112 Page 1 of PGPtools.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
699ec3 ¤   $Id: PGPtools.h,v 1.14.8.1 1998/11/12 03:09:28 heller Exp $
2af7f7 ____________________________________________________________________________*/
78af5a
ad7b7d #pragma once
49af5a
9828cd #include <PP_Types.h>
eaaf5a
b09f63 #include "pgpEncode.h"
f0e684 #include "pgpUserInterface.h"
e5a076 #include "pgpKeys.h"
a9af5a
81dd53 // Note: Changing these definitions requires changing the user constants
01bcbc // in the PPob resource for the drop receiver panes of the main window.
4caf5a
e5aacb typedef enum PGPtoolsOperation
75bb36 {
0541a7 ¤   kPGPtoolsInvalidOperation¤  = 0,
2667c5 ¤
53dfde ¤   kPGPtoolsEncryptOperation,
91501f ¤   kPGPtoolsSignOperation,
577bea ¤   kPGPtoolsEncryptSignOperation,
778824 ¤   kPGPtoolsDecryptVerifyOperation,
0a67c5 ¤
47b737 ¤   kPGPtoolsWipeOperation,
3dec06 ¤   kPGPtoolsWipeFreeSpaceOperation
b067c5 ¤
3b67b7 } PGPtoolsOperation;
6faf5a
8876f0 #include "CComboError.h"
bdaf5a
4bfe3c class CToolsError : public CComboError
c9bb36 {
14b415 /* leave as placeholder for now */
5e82f7 };
19af5a
47c4cb typedef struct PGPtoolsSignatureData
e6bb36 {
177331 ¤   PGPEventSignatureData¤  data;
3a5c67 ¤   char¤   ¤   ¤   ¤   ¤   signingKeyIDStr[ kPGPMaxKeyIDStringSize ];
89c851 ¤   Boolean¤¤   ¤   ¤   ¤   haveResourceFork;
ada798 ¤   Boolean¤¤   ¤   ¤   ¤   didNotVerifyResourceFork;
aaaf5a
538ebf } PGPtoolsSignatureData;
--f331 001165766ae40120113 Page 1 of PGPtoolsCommonHeaders.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
ea80fa ¤   $Id: PGPtoolsCommonHeaders.h,v 1.12.8.1 1998/11/12 03:09:29 heller Exp $
58f7f7 ____________________________________________________________________________*/
80af5a
5f7b7d #pragma once
26af5a
c377e0 #if __POWERPC__
60d4a3 ¤   #include "MacHeadersPPC++"
06fc58 #elif __CFM68K__
2e3665 ¤   #include "MacHeadersCFM68K++"
6ddb21 #else
c016c4 ¤   #error Cannot compile in this environment
307454 #endif
e4af5a
a6af2e #include <Sound.h>¤ // Needed for PP file LTextEditView.cp
6aaf5a
71ae08 #define PGP_MACINTOSH¤  ¤   ¤   ¤   1
e0e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
1279b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
8eaf5a
8a3b59 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   ¤   ¤   PGP_DEBUG
9792a8 #define USE_MAC_DEBUG_PATCHES¤  ¤   ¤   ¤   PGP_DEBUG
9040f2 #define MAC_DEBUG_PATCHES_WHACK_FREE_SPACE¤ PGP_DEBUG
8baf5a
b7a662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
6ca6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
555cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
6baf5a
6996be #include "PGPBuildFlags.h"
f2e2ff #include "pgpConfig.h"
c394a0 #include "pgpLeaks.h"
1646ad #include "MacDebug.h"
--a028 0017fefbddc40120114 Page 1 of PGPtoolsDebugHeaders.prefix
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
7a4e5a ¤   $Id: PGPtoolsDebugHeaders.prefix,v 1.5.8.1 1998/11/12 03:09:29 heller Exp $
f2f7f7 ____________________________________________________________________________*/
daaf5a
117b7d #pragma once
b9af5a
34c964 #define PGP_DEBUG¤  ¤   1
74af5a
af1e1e #define Debug_Throw¤¤   1¤  /* PowerPlant debugging */
996c50 #define Debug_Signal¤   1¤  /* PowerPlant debugging */
29af5a
85e8cf #include "PGPtoolsCommonHeaders.h"
7faf5a
--0ab0 00003d4c12b40120115 Page 1 of PGPtoolsEncryptDecrypt.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
ab90ad ¤   $Id: PGPtoolsEncryptDecrypt.cp,v 1.12.8.1 1998/11/12 03:09:30 heller Exp $
7cf7f7 ____________________________________________________________________________*/
d4af5a
654b15 #include <TextUtils.h>
85af5a
dd6ce9 #include "MacCursors.h"
39bbf4 #include "MacFiles.h"
7385c2 #include "MacStrings.h"
ca0d08 #include "pgpMem.h"
834919 #include "pgpUtilities.h"
ffaf5a
1dc01a #include "PGPtoolsEncryptDecrypt.h"
b3133f #include "PGPtoolsResources.h"
b1af5a
39af5a
4b6d52 ¤   void
d46220 GetDefaultEncryptSignName(
74a74e ¤   ConstStringPtr¤ srcName,
a11236 ¤   Boolean¤¤   ¤   textOutput,
e2adec ¤   Boolean¤¤   ¤   detachedSignature,
f03571 ¤   StringPtr ¤ ¤   destName)
4dbb36 {
8e1d5a ¤   Str255¤ suffix;
281dc0 ¤   short¤  strIndex;
0e67c5 ¤
947767 ¤   pgpAssertAddrValid( srcName, uchar );
018073 ¤   pgpAssertAddrValid( destName, uchar );
4d67c5 ¤
5689d6 ¤   if( textOutput && ! detachedSignature )
07c7a1 ¤   {
711e0d ¤   ¤   strIndex = kASCIIFileSuffixStrIndex;
259371 ¤   }
1a8743 ¤   else if( detachedSignature )
22c7a1 ¤   {
5d7516 ¤   ¤   strIndex = kDetachedSigFileSuffixStrIndex;
989371 ¤   }
8e0e24 ¤   else
36c7a1 ¤   {
6dc351 ¤   ¤   strIndex = kBinaryFileSuffixStrIndex;
6d9371 ¤   }
6567c5 ¤
1f0059 ¤   GetIndString( suffix, kPGPtoolsMiscStringsResID, strIndex );
64af5a
8b035c ¤   CopyPString( srcName, destName );
062d9f ¤   if( destName[0] > kMaxHFSFileNameLength - suffix[0] )
01c7a1 ¤   {
3107c7 ¤   ¤   destName[0] = kMaxHFSFileNameLength - suffix[0];
729371 ¤   }
b967c5 ¤
557ea6 ¤   AppendPString( suffix, destName );
00efe6 }
96af5a
22af5a
114fb9 // Given a source spec, determine the correct default encrypt output spec.
e96d52 ¤   void
1585ce GetDefaultEncryptSignFSSpec(
e4894a ¤   const FSSpec ¤  *sourceSpec,
201236 ¤   Boolean¤¤   ¤   textOutput,
24adec ¤   Boolean¤¤   ¤   detachedSignature,
5619f5 ¤   FSSpec ¤¤   ¤   *destSpec)
dcbb36 {
1635ac ¤   AssertSpecIsValid( sourceSpec, "GetDefaultEncryptSignFSSpec" );
d227db ¤   pgpAssertAddrValid( destSpec, FSSpec );
7f67c5 ¤
3cf5f3 ¤   destSpec->vRefNum¤  = sourceSpec->vRefNum;
087877 ¤   destSpec->parID¤¤   = sourceSpec->parID;
3d3b93 ¤   GetDefaultEncryptSignName( sourceSpec->name,
0357ef ¤   ¤   textOutput, detachedSignature, destSpec->name );
--0f59 0000d6b9b6840120115 Page 2 of PGPtoolsEncryptDecrypt.cp
7aefe6 }
46af5a
8eaf5a
79af5a
750335 /*____________________________________________________________________________
b313fa ¤   Given a source spec, determine the correct default decrypt output spec.
9267c5 ¤
6447f7 ¤   Examples:
9e8b99 ¤   "X.pgp"¤=>¤ "X"
214bbc ¤   "X.asc"¤=>¤ "X"
761fa6 ¤   "X"¤¤   =>¤ "X"
fb67c5 ¤
95f783 ¤   If no suffix is detected, then the name is not changed, and the caller
79cba9 ¤   has to figure out a name.
bef7f7 ____________________________________________________________________________*/
01af5a
2e7e69 ¤   Boolean
1bea69 GetDefaultDecryptVerifyName(
cda74e ¤   ConstStringPtr¤ srcName,
b428b0 ¤   StringPtr¤  ¤   destName )
6cbb36 {
0a7af7 ¤   Str255¤ ¤   suffix;
f1153b ¤   Boolean¤¤   foundSuffix¤= FALSE;
b9af5a
f87767 ¤   pgpAssertAddrValid( srcName, uchar );
318073 ¤   pgpAssertAddrValid( destName, uchar );
ed67c5 ¤
15ee57 ¤   GetIndString(suffix, kPGPtoolsMiscStringsResID, kBinaryFileSuffixStrIndex);
dbaf5a
0c035c ¤   CopyPString( srcName, destName );
e067c5 ¤
6b76df ¤   foundSuffix¤= PStringHasSuffix( destName, suffix, FALSE);
fbcb63 ¤   if ( ! foundSuffix )
4fc7a1 ¤   {
5801bf ¤   ¤   GetIndString( suffix, kPGPtoolsMiscStringsResID,
5e1a97 ¤   ¤   ¤   ¤   ¤   kASCIIFileSuffixStrIndex );
471b52 ¤   ¤
95cac6 ¤   ¤   foundSuffix¤= PStringHasSuffix( destName, suffix, FALSE);
919371 ¤   }
5267c5 ¤
641d82 ¤   if ( foundSuffix )
cdc7a1 ¤   {
fa78a5 ¤   ¤   destName[0]¤-= suffix[0];
379371 ¤   }
b267c5 ¤
8a42a9 ¤   return( foundSuffix );
27efe6 }
39af5a
ddaf5a
b07e69 ¤   Boolean
0b1cf0 GetDefaultDecryptVerifyFSSpec(
91b6e6 ¤   const FSSpec *¤ srcSpec,
442691 ¤   FSSpec *¤   ¤   destSpec)
07bb36 {
8d153b ¤   Boolean¤¤   foundSuffix¤= FALSE;
6867c5 ¤
617048 ¤   *destSpec¤  = *srcSpec;
7367c5 ¤
b3845b ¤   foundSuffix¤= GetDefaultDecryptVerifyName( srcSpec->name, destSpec->name );
ca67c5 ¤
3e42a9 ¤   return( foundSuffix );
a8efe6 }
08af5a
27af5a
deaf5a
e1af5a
0e0335 /*____________________________________________________________________________
8167c5 ¤
57f7f7 ____________________________________________________________________________*/
a07e69 ¤   Boolean
47f7cc GetDetachedSigFileSourceSpec(const FSSpec *sigSpec, FSSpec *sourceSpec)
0dbb36 {
--33f0 00177921b8040120115 Page 3 of PGPtoolsEncryptDecrypt.cp
081d5a ¤   Str255¤ suffix;
bd5456 ¤   Boolean¤matchedSuffix;
0267c5 ¤
45b9fb ¤   *sourceSpec¤¤   = *sigSpec;
f9d6da ¤   matchedSuffix¤  = FALSE;
3e67c5 ¤
336e8c ¤   GetIndString( suffix, kPGPtoolsMiscStringsResID,
e23e50 ¤   ¤   ¤   ¤   kDetachedSigFileSuffixStrIndex );
a767c5 ¤
c58763 ¤   if( PStringHasSuffix( sourceSpec->name, suffix, FALSE) )
53c7a1 ¤   {
f4273e ¤   ¤   sourceSpec->name[0] -= suffix[0];
33a2a4 ¤   ¤   matchedSuffix¤  ¤   = TRUE;
b69371 ¤   }
730e24 ¤   else
97c7a1 ¤   {
6a01bf ¤   ¤   GetIndString( suffix, kPGPtoolsMiscStringsResID,
6902c7 ¤   ¤   ¤   ¤   kASCIIFileSuffixStrIndex );
351b52 ¤   ¤
385d4a ¤   ¤   if( PStringHasSuffix( sourceSpec->name, suffix, FALSE) )
075b34 ¤   ¤   {
3d1efb ¤   ¤   ¤   sourceSpec->name[0] -= suffix[0];
1c67f1 ¤   ¤   ¤   matchedSuffix¤  ¤   = TRUE;
8a0fe4 ¤   ¤   }
7a0e1d ¤   ¤   else
755b34 ¤   ¤   {
50270a ¤   ¤   ¤   GetIndString( suffix, kPGPtoolsMiscStringsResID,
856480 ¤   ¤   ¤   ¤   ¤   ¤   kBinaryFileSuffixStrIndex );
0787c7 ¤   ¤   ¤
c9d70f ¤   ¤   ¤   if( PStringHasSuffix( sourceSpec->name, suffix, FALSE) )
68f776 ¤   ¤   ¤   {
f851c5 ¤   ¤   ¤   ¤   sourceSpec->name[0] -= suffix[0];
02ef97 ¤   ¤   ¤   ¤   matchedSuffix¤  ¤   = TRUE;
76a3a6 ¤   ¤   ¤   }
a80fe4 ¤   ¤   }
e89371 ¤   }
fa67c5 ¤
94cb12 ¤   return( matchedSuffix );
77efe6 }
--25b2 0016915408740120116 Page 1 of PGPtoolsEncryptDecrypt.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
3e959f ¤   $Id: PGPtoolsEncryptDecrypt.h,v 1.10.8.1 1998/11/12 03:09:30 heller Exp $
bef7f7 ____________________________________________________________________________*/
d3af5a
157b7d #pragma once
67af5a
fc28cd #include <PP_Types.h>
ddaf5a
5d6ce9 #include "MacCursors.h"
e0af5a
acf8d2 #include "PGPSharedEncryptDecrypt.h"
f5af5a
3cca12 const OSType¤   kPGPMacFileTypeMacPGPEncryptedData = 'Cryp';
d8af5a
149f61 typedef struct AnimatedCursorAnalyzeCallbackInfo
b0bb36 {
202128 ¤   AnimatedCursorRef¤  animatedCursor;
425b2f ¤   Boolean¤¤   ¤   ¤   userAborted;
54af5a
ece020 } AnimatedCursorAnalyzeCallbackInfo;
a2af5a
ed6198 void¤   ¤   GetDefaultEncryptSignName(ConstStringPtr srcName,
928650 ¤   ¤   ¤   ¤   ¤   ¤   Boolean textOutput, Boolean detachedSignature,
e5c8ea ¤   ¤   ¤   ¤   ¤   ¤   StringPtr destName );
8f49a6 void¤   ¤   GetDefaultEncryptSignFSSpec(const FSSpec *sourceSpec,
608650 ¤   ¤   ¤   ¤   ¤   ¤   Boolean textOutput, Boolean detachedSignature,
9d629c ¤   ¤   ¤   ¤   ¤   ¤   FSSpec *destSpec);
09efde Boolean¤¤   GetDefaultDecryptVerifyFSSpec(const FSSpec *sourceSpec,
55629c ¤   ¤   ¤   ¤   ¤   ¤   FSSpec *destSpec);
586065 Boolean¤¤   GetDefaultDecryptVerifyName(ConstStringPtr srcName,
007e1a ¤   ¤   ¤   ¤   ¤   ¤   StringPtr destname );
f2441c Boolean¤¤   GetDetachedSigFileSourceSpec(const FSSpec *sigSpec,
4734a5 ¤   ¤   ¤   ¤   ¤   ¤   FSSpec *sourceSpec);
82eaf7 PGPError¤   AnimatedCursorAnalyzeCallbackProc(void *arg, size_t soFar,
69975b ¤   ¤   ¤   ¤   ¤   ¤   size_t total);
--9041 0015f0a223540120117 Page 1 of PGPtoolsHeaders.prefix
4b6438 /*_____________________________________________________________________________
cec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
2d4b0f ¤   All rights reserved.
167cb9 _____________________________________________________________________________*/
8aaf5a
f77b7d #pragma once
b6af5a
efb18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
89af5a
0fe8cf #include "PGPtoolsCommonHeaders.h"
5faf5a
--e9fc 0005d786fd140120118 Page 1 of PGPtoolsPreferences.c
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
6018f1 ¤   $Id: PGPtoolsPreferences.c,v 1.18.8.1 1998/11/12 03:09:32 heller Exp $
94f7f7 ____________________________________________________________________________*/
cfaf5a
f70d08 #include "pgpMem.h"
49a076 #include "pgpKeys.h"
3491b9 #include "pgpSDKPrefs.h"
3ac97b #include "pgpClientPrefs.h"
6eb397 #include "PGPOpenPrefs.h"
2eaf5a
ba6a4c #include "PGPtoolsPreferences.h"
4aaf5a
7b0cb4 #define¤kPreferencesPadSize¤¤   512L
42af5a
bd032d typedef union PaddedPreferences
e0bb36 {
cb6748 ¤   PGPtoolsPreferences¤prefs;
8c6386 ¤   uchar¤  ¤   ¤   ¤   padding[kPreferencesPadSize];
ddaf5a
baa57b } PaddedPreferences;
32af5a
ed06bb PGPtoolsPreferences¤gPreferences;
1faf5a
0033c8 ¤   static void
39a7fb InitDefaultPreferences(PGPtoolsPreferences *prefs)
0fbb36 {
401469 ¤   pgpClearMemory( prefs, sizeof( prefs ) );
5baf5a
418b45 ¤   prefs->version¤ ¤   = kPGPtoolsPreferencesVersion;
98efe6 }
44af5a
0dc744 ¤   PGPError
96cec6 LoadPreferences(PGPContextRef context)
27bb36 {
d261e0 ¤   PGPError¤   err;
1d67c5 ¤
8a1f4b ¤   err = PGPsdkLoadDefaultPrefs( context );
0cb1f0 ¤   if( IsntPGPError( err ) )
98c7a1 ¤   {
6115c8 ¤   ¤   PGPPrefRef¤ ¤   prefRef;
dd1b52 ¤   ¤
8e92b7 ¤   ¤   err = PGPOpenClientPrefs( PGPGetContextMemoryMgr( context ), &prefRef );
b986f8 ¤   ¤   if( IsntPGPError( err ) )
805b34 ¤   ¤   {
bf779c ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   prefsSize;
2879d4 ¤   ¤   ¤   PaddedPreferences¤  *paddedPrefs;
9087c7 ¤   ¤   ¤
b09d4a ¤   ¤   ¤   pgpAssert( sizeof( PGPtoolsPreferences ) <=
ec8b07 ¤   ¤   ¤   ¤   ¤   kPreferencesPadSize );
0aaf5a
22788b ¤   ¤   ¤   prefsSize = sizeof( paddedPrefs );
7187c7 ¤   ¤   ¤
9515f5 ¤   ¤   ¤   err = PGPGetPrefData( prefRef,
2b1645 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefPGPtoolsMacPrivateData, &prefsSize,
d8079d ¤   ¤   ¤   ¤   ¤   ¤   &paddedPrefs );
8a698b ¤   ¤   ¤   if( IsntPGPError( err ) )
a7f776 ¤   ¤   ¤   {
a760f6 ¤   ¤   ¤   ¤   gPreferences = paddedPrefs->prefs;
462b85 ¤   ¤   ¤   ¤
3e62db ¤   ¤   ¤   ¤   PGPDisposePrefData( prefRef, paddedPrefs );
afa3a6 ¤   ¤   ¤   }
9f87c7 ¤   ¤   ¤
2fad42 ¤   ¤   ¤   (void) PGPClosePrefFile( prefRef );
990fe4 ¤   ¤   }
dd9371 ¤   }
a367c5 ¤
787f7d ¤   if( IsPGPError( err ) )
5bc7a1 ¤   {
5d0e3e ¤   ¤   InitDefaultPreferences( &gPreferences );
--a959 001236c486640120118 Page 2 of PGPtoolsPreferences.c
674db0 ¤   ¤   if( err == kPGPError_PrefNotFound )
0afcc4 ¤   ¤   ¤   err = kPGPError_NoErr;
6e9371 ¤   }
3ddeb7 ¤   return( err );
c7efe6 }
02af5a
87c744 ¤   PGPError
600d97 SavePreferences(PGPContextRef context)
2dbb36 {
f6fb19 ¤   PGPError¤   ¤   err;
c8f19b ¤   PGPPrefRef¤ prefRef;
ffaf5a
7cf79b ¤   err = PGPOpenClientPrefs( PGPGetContextMemoryMgr( context ),
2fa5d4 ¤   ¤   ¤   ¤   ¤   &prefRef );
d5b1f0 ¤   if( IsntPGPError( err ) )
20c7a1 ¤   {
5bcc0f ¤   ¤   PaddedPreferences¤  paddedPrefs;
071b52 ¤   ¤
512e2f ¤   ¤   pgpClearMemory( &paddedPrefs, sizeof( paddedPrefs ) );
a968b4 ¤   ¤   paddedPrefs.prefs = gPreferences;
f01b52 ¤   ¤
7da23e ¤   ¤   pgpAssert( sizeof( PGPtoolsPreferences ) <= kPreferencesPadSize );
67af5a
3b6b95 ¤   ¤   err = PGPSetPrefData( prefRef,
5bb0d1 ¤   ¤   ¤   ¤   ¤   kPGPPrefPGPtoolsMacPrivateData, sizeof( paddedPrefs ),
30c2c8 ¤   ¤   ¤   ¤   ¤   &paddedPrefs );
c5af5a
692426 ¤   ¤   (void) PGPSavePrefFile( prefRef );
47b512 ¤   ¤   (void) PGPClosePrefFile( prefRef );
4d9371 ¤   }
2a67c5 ¤
a9deb7 ¤   return( err );
4befe6 }
caaf5a
19af5a
ffaf5a
b5af5a
23af5a
--ec8e 001b2951d1240120119 Page 1 of PGPtoolsPreferences.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
93e451 ¤   $Id: PGPtoolsPreferences.h,v 1.7.8.1 1998/11/12 03:09:32 heller Exp $
0bf7f7 ____________________________________________________________________________*/
cfaf5a
177b7d #pragma once
4caf5a
efe82c #include "pgpPubTypes.h"
5faf5a
e27353 enum
15bb36 {
7ea0a6 ¤   kPGPtoolsPreferencesVersion¤= 1
6d82f7 };
d6af5a
d31fe0 typedef struct PGPtoolsPreferences
08bb36 {
83881a ¤   ushort¤ version;
bdaf5a
265e29 ¤   Point¤  mainWindowLocation;
bfd329 ¤   Rect¤   resultsWindowBounds;
91f492 ¤   Boolean¤smallMainWindow;
7d67c5 ¤
bd1e02 } PGPtoolsPreferences;
28af5a
813379 #ifdef __cplusplus
846dad extern "C" {
217454 #endif
83af5a
be0008 PGPError¤   ¤   LoadPreferences(PGPContextRef context);
ac43c7 PGPError¤   ¤   SavePreferences(PGPContextRef context);
bbaf5a
f03379 #ifdef __cplusplus
81efe6 }
0f7454 #endif
44af5a
b296df extern PGPtoolsPreferences¤ gPreferences;
--5077 000ddd834144012011a Page 1 of PGPtoolsResources.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
099e20 ¤   $Id: PGPtoolsResources.h,v 1.25.2.1.2.1 1998/11/12 03:09:33 heller Exp $
9ef7f7 ____________________________________________________________________________*/
8eaf5a
3d9861 const ResID¤¤   window_Main¤¤   ¤   ¤   = 2000;
a48983 const ResID¤¤   window_About¤   ¤   ¤   = 3000;
7d2d34 const ResID¤¤   window_Text¤¤   ¤   ¤   = 4000;
967288 const ResID¤¤   window_Results¤ ¤   ¤   = 5000;
36ab69 const ResID¤¤   window_WipeFreeSpace¤   = 6000;
5b1999 const ResID¤¤   dialog_DecryptKeyShare¤ = 7000;
b6af5a
3ee23d const ResID¤¤   kPGPtoolsMiscStringsResID¤  ¤   = 1000;
0e9b20 const ResID¤¤   kErrorStringListResID¤  ¤   ¤   = 1001;
3f98b2 const ResID¤¤   kResultsTableStringListResID¤   = 1002;
569b6f const ResID¤¤   kDialogStringsListResID¤¤   ¤   = 1003;
8daf5a
084403 const ResID¤¤   kAnimatedCursorResID¤   ¤   ¤   = 128;
0caf5a
26f2be enum¤   // kPGPtoolsMiscStringsResID
3fbb36 {
7b68e8 ¤   kSaveEncryptedFileAsPromptStrIndex¤ = 1,
a12034 ¤   kSaveSignedFileAsPromptStrIndex,
6b517a ¤   kSaveDecryptedFileAsPromptStrIndex,
77efd5 ¤   kSaveAsPromptStrIndex,
7eaf5a
defee3 ¤   kBinaryFileSuffixStrIndex,
3c502f ¤   kDetachedSigFileSuffixStrIndex,
6ff356 ¤   kASCIIFileSuffixStrIndex,
2baf5a
92aae9 ¤   kEncryptStrIndex,
de48fe ¤   kSignStrIndex,
0f2696 ¤   kEncryptSignStrIndex,
d27003 ¤   kDecryptStrIndex,
3d3d73 ¤   kDecryptVerifyStrIndex,
f86e1e ¤   kWipeStrIndex,
d667c5 ¤
549926 ¤   kSelectStrIndex,
4faf5a
b476d9 ¤   kShowResultsStrIndex,
f7252f ¤   kHideResultsStrIndex,
6267c5 ¤
fb477d ¤   kClipboardStrIndex,
5167c5 ¤
d7ab41 ¤   kPGPWebSiteURLStrIndex,
ed6c20 ¤   kAboutCreditsButtonTitleStrIndex,
154670 ¤   kAboutInfoButtonTitleStrIndex,
5d67c5 ¤
5406a0 ¤   kNextButtonTitleStrIndex,
22cdbe ¤   kDoneButtonTitleStrIndex,
efb7b1 ¤   kStopButtonTitleStrIndex
ea82f7 };
b4af5a
674f18 enum¤   // kErrorStringListResID
9ebb36 {
bb86a8 ¤   kLibraryInitErrorStrIndex¤  = 1,
34fc67 ¤   kNoKeyringsFoundStrIndex,
402ec4 ¤   kNoKeysFoundStrIndex,
98485b ¤   kNoPublicKeysFoundStrIndex,
e550c1 ¤   kNoPrivateKeysFoundStrIndex,
44dfd9 ¤   kNoAdminPrefsFileFoundStrIndex,
3467c5 ¤
6ece2c ¤   kAnErrorOccurredStrIndex,
9e20fd ¤   kOperationCouldNotBeCompletedStrIndex,
0467c5 ¤
2975e1 ¤   kFileCannotBeEncryptedStrIndex,
0f659b ¤   kFileCannotBeSignedStrIndex,
9e2f89 ¤   kFileCannotBeDecryptedVerifiedStrIndex,
dfaf5a
ddf23c ¤   kClipboardCannotBeEncryptedStrIndex,
--cf82 0007f0a26bb4012011a Page 2 of PGPtoolsResources.h
0c107b ¤   kClipboardCannotBeSignedStrIndex,
95213a ¤   kClipboardCannotBeDecryptedVerifiedStrIndex,
88af5a
2b107b ¤   kTextCannotBeEncryptedStrIndex,
a868bd ¤   kTextCannotBeSignedStrIndex,
c0cde6 ¤   kTextCannotBeDecryptedVerifiedStrIndex,
40af5a
62fd94 ¤   kNamedTextCannotBeEncryptedStrIndex,
15a23b ¤   kNamedTextCannotBeSignedStrIndex,
896860 ¤   kNamedTextCannotBeDecryptedVerifiedStrIndex,
6967c5 ¤
fce18c ¤   kCantLaunchPGPkeysBecauseStrIndex,
e940bb ¤   kCantLaunchWebBrowserBecauseStrIndex,
2267c5 ¤
e993d2 ¤   kErrorWhileWipingStrIndex,
7367c5 ¤
5adfa1 ¤   kUnableToMixMacBinaryAndFYEO
2282f7 };
beaf5a
bcf94f enum¤   // kResultsTableStringListResID
b6bb36 {
a27932 ¤   kVerifiedOneItemStrIndex = 1,
1165c1 ¤   kVerifiedNItemsStrIndex,
e367c5 ¤
c41be3 ¤   kNoSignatureStrIndex,
fbc650 ¤   kVerifiedSignatureStrIndex,
d009cb ¤   kVerifiedExpiredStrIndex,
a5e2ac ¤   kVerifiedRevokedStrIndex,
c76b9d ¤   kVerifiedDisabledStrIndex,
5d3f3b ¤   kVerifiedCorrputStrIndex,
51d415 ¤   kCouldNotVerifyStrIndex,
0960e6 ¤   kCouldNotVerifyKeyIDStrIndex,
781a28 ¤   kBadSignatureStrIndex,
3667c5 ¤
3fd10d ¤   kSelectedTextStrIndex,
853126 ¤   kDataForkOnlyFormatStrIndex
e582f7 };
22af5a
efbaa3 enum¤   // kDialogStringsListResID
0cbb36 {
f69bc1 ¤   kTextLargerThan32KOptionsStrIndex¤  = 1,
2e67c5 ¤
8750e5 ¤   kEncryptingProgressFormatStrIndex,
8dc50e ¤   kSigningProgressFormatStrIndex,
0195ef ¤   kEncryptingSigningProgressFormatStrIndex,
2e612a ¤   kDecryptingVerifyingProgressFormatStrIndex,
2e768b ¤   kWipingProgressFormatStrIndex,
4367c5 ¤
3fc19e ¤   kGetPassphraseForFilePromptStrIndex,
ffe796 ¤   kGetPassphraseForClipboardPromptStrIndex,
9f261d ¤   kGetPassphraseForNamedTextPromptStrIndex,
d1adaf ¤   kGetPassphraseForSelectedTextPromptStrIndex,
e08564 ¤   kIncorrectPassphrasePrefixStrIndex,
b079ee ¤   kSigningPassphraseIncorrectTryAgainStrIndex,
1267c5 ¤
fea9f1 ¤   kLocateDetachedSigSourceFilePromptStrIndex,
387cc7 ¤   kSigningPassphrasePromptStrIndex,
b82aa1 ¤   kConventionalPassphrasePromptStrIndex,
cf67c5 ¤
ef4732 ¤   kConfirmMacBinaryOffStrIndex,
d367c5 ¤
24c3fd ¤   kConfirmWipingItemsAfterSigningStrIndex,
90fab5 ¤   kConfirmWipingItemsAfterEncryptingStrIndex,
2be0fc ¤   kConfirmWipingItemsAfterEncryptingSigningStrIndex,
e9df64 ¤   kConfirmWipingItemAfterSigningStrIndex,
43d3e3 ¤   kConfirmWipingItemAfterEncryptingStrIndex,
be6aed ¤   kConfirmWipingItemAfterEncryptingSigningStrIndex,
c73184 ¤   kConfirmWipingItemsStrIndex,
cf4bc6 ¤   kConfirmWipingItemStrIndex,
3967c5 ¤
c340d2 ¤   kConfirmNotEncryptingToSelf,¤
7f0121 ¤   kSelectiveImportFoundKeysPromptStrIndex,
--66b9 001b5b6e6954012011a Page 3 of PGPtoolsResources.h
6b7d6e ¤   kDecryptKeyShareFileMsgStrIndex,
9967c5 ¤
442bbb ¤   kDummyLastDialogStringsStrIndex
0e82f7 };
f0af5a
2faf5a
66af5a
b5af5a
--6678 000e435200f4012011b Page 1 of PGPtoolsUtils.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
92265f ¤   $Id: PGPtoolsUtils.cp,v 1.28.8.1 1998/11/12 03:09:34 heller Exp $
3af7f7 ____________________________________________________________________________*/
cfaf5a
78d332 #include <Finder.h>
904d37 #include <LowMem.h>
c2dc1d #include <Scrap.h>
8be9be #include <StandardFile.h>
61af5a
880b83 #include <TArray.h>
63dd06 #include <UDesktop.h>
b4af5a
fa5286 #include "MacDialogs.h"
4276b7 #include "MacErrors.h"
06bbf4 #include "MacFiles.h"
d385c2 #include "MacStrings.h"
449f63 #include "pgpEncode.h"
210d08 #include "pgpMem.h"
3b4919 #include "pgpUtilities.h"
b6628e #include "pgpClientErrors.h"
bfe622 #include "pgpDiskWiper.h"
257dde #include "pgpMacWiping.h"
4aaf5a
65f8d2 #include "PGPSharedEncryptDecrypt.h"
a9c01a #include "PGPtoolsEncryptDecrypt.h"
fe133f #include "PGPtoolsResources.h"
f92aad #include "PGPtoolsUtils.h"
14af5a
a20c57 const ResID¤¤   kEncryptGetFileOrClipboardDialogResID ¤ = 1000;
d492fb const ResID¤¤   kDecryptGetFileOrClipboardDialogResID ¤ = 1001;
53f4c6 const ResID¤¤   kPromptStandardGetFileDialogResID ¤ ¤   = 1002;
67af5a
cb6ba8 typedef struct SFInfo
a2bb36 {
3e0925 ¤   StandardFileReply¤  sfReply;
a7b3a3 ¤   Boolean¤¤   ¤   ¤   useClipboard;
75e049 ¤   Boolean¤¤   ¤   ¤   haveClipboardButton;
7c4c76 ¤   Boolean¤¤   ¤   ¤   allowClipboard;
45bf02 ¤   Boolean¤¤   ¤   ¤   showAllFiles;
fdeec2 ¤   ConstStr255Param¤   openButtonTitle;
4e67c5 ¤
dc32b3 ¤   // Used by the callback procs:
5887f0 ¤   Boolean¤¤   ¤   ¤   lastSelectedWasFolder;
186588 ¤   Str255¤ ¤   ¤   ¤   folderButtonTitle;
6194aa ¤   ¤   ¤   ¤   ¤   ¤
9681a8 } SFInfo;
03af5a
277353 enum
1fbb36 {
15370f ¤   kClipborardButtonItem¤  = 10,
f4dac4 ¤   kShowAllFilesCheckboxItem
8a82f7 };
82af5a
6d7353 enum
eabb36 {
1fd426 ¤   kPromptStaticTextItem = 10
5482f7 };
8eaf5a
826867 ¤   static pascal short
ffe6a3 GetFileOrClipboardHook(short item, DialogPtr dialog, SFInfo *sfInfo)
d1bb36 {
0863e1 ¤   pgpAssertAddrValid( dialog, DialogRecord );
cea538 ¤   pgpAssertAddrValid( sfInfo, SFInfo );
c3af5a
77eeb5 ¤   if( GetWRefCon( dialog ) == sfMainDialogRefCon )
84c7a1 ¤   {
1b217e ¤   ¤   switch( item )
3b5b34 ¤   ¤   {
e4fb18 ¤   ¤   ¤   case sfHookFirstCall:
--e09d 0007bd417654012011b Page 2 of PGPtoolsUtils.cp
99f776 ¤   ¤   ¤   {
84053a ¤   ¤   ¤   ¤   if( sfInfo->haveClipboardButton && ! sfInfo->allowClipboard )
8472c3 ¤   ¤   ¤   ¤   {
0529ba ¤   ¤   ¤   ¤   ¤   short ¤ itemType;
178ebe ¤   ¤   ¤   ¤   ¤   Handle¤ itemHandle;
e531a0 ¤   ¤   ¤   ¤   ¤   Rect¤   box;
bf1b52 ¤   ¤
99a407 ¤   ¤   ¤   ¤   ¤   ::GetDialogItem(dialog,
b2528e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kClipborardButtonItem,
36fbfb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &itemType,
e5d661 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &itemHandle,
f80e94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &box¤   );
ba609c ¤   ¤   ¤   ¤   ¤   ::HiliteControl( (ControlHandle) itemHandle, 255 );
21ae30 ¤   ¤   ¤   ¤   ¤
ff2613 ¤   ¤   ¤   ¤   }
492b85 ¤   ¤   ¤   ¤
2b3df6 ¤   ¤   ¤   ¤   GetIndDialogItemText( dialog, sfItemOpenButton,
6dd0af ¤   ¤   ¤   ¤   ¤   ¤   ¤   sfInfo->folderButtonTitle );
fa2b85 ¤   ¤   ¤   ¤
71bc53 ¤   ¤   ¤   ¤   sfInfo->lastSelectedWasFolder = TRUE;
d22b85 ¤   ¤   ¤   ¤
faf622 ¤   ¤   ¤   ¤   break;
a5a3a6 ¤   ¤   ¤   }
e587c7 ¤   ¤   ¤
8fd4f2 ¤   ¤   ¤   case kClipborardButtonItem:
9ef776 ¤   ¤   ¤   {
6eaf7e ¤   ¤   ¤   ¤   sfInfo->useClipboard = true;
3b2b85 ¤   ¤   ¤   ¤
811391 ¤   ¤   ¤   ¤   // Switch the item to simulate the Cancel button
3abeb0 ¤   ¤   ¤   ¤   item = sfItemCancelButton;
39f622 ¤   ¤   ¤   ¤   break;
a0a3a6 ¤   ¤   ¤   }
3887c7 ¤   ¤   ¤
7f4810 ¤   ¤   ¤   case kShowAllFilesCheckboxItem:
55e39b ¤   ¤   ¤   {¤  ¤   ¤
192b85 ¤   ¤   ¤   ¤
ec19be ¤   ¤   ¤   ¤   sfInfo->showAllFiles = ToggleDialogCheckbox( dialog,
33aab0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kShowAllFilesCheckboxItem );
b772fd ¤   ¤   ¤   ¤   item = sfHookRebuildList;
3bf622 ¤   ¤   ¤   ¤   break;
caa3a6 ¤   ¤   ¤   }
5687c7 ¤   ¤   ¤
564f27 ¤   ¤   ¤   case sfHookNullEvent:
e2f776 ¤   ¤   ¤   {
ee0f9b ¤   ¤   ¤   ¤   if( IsntNull( sfInfo->openButtonTitle ) )
0772c3 ¤   ¤   ¤   ¤   {
48bdd0 ¤   ¤   ¤   ¤   ¤   if( sfInfo->sfReply.sfIsFolder ||
e03c10 ¤   ¤   ¤   ¤   ¤   ¤   sfInfo->sfReply.sfIsVolume )
9a4859 ¤   ¤   ¤   ¤   ¤   {
a477b8 ¤   ¤   ¤   ¤   ¤   ¤   if( ! sfInfo->lastSelectedWasFolder )
448fec ¤   ¤   ¤   ¤   ¤   ¤   {
8ee13d ¤   ¤   ¤   ¤   ¤   ¤   ¤   sfInfo->lastSelectedWasFolder = TRUE;
c19ffb ¤   ¤   ¤   ¤   ¤   ¤   ¤   SetIndDialogItemText( dialog, sfItemOpenButton,
4f2c33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sfInfo->folderButtonTitle );
78db3c ¤   ¤   ¤   ¤   ¤   ¤   }
3c1c89 ¤   ¤   ¤   ¤   ¤   }
814bd6 ¤   ¤   ¤   ¤   ¤   else
234859 ¤   ¤   ¤   ¤   ¤   {
f1679f ¤   ¤   ¤   ¤   ¤   ¤   if( sfInfo->lastSelectedWasFolder )
5c8fec ¤   ¤   ¤   ¤   ¤   ¤   {
c5dbc4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sfInfo->lastSelectedWasFolder = FALSE;
a99ffb ¤   ¤   ¤   ¤   ¤   ¤   ¤   SetIndDialogItemText( dialog, sfItemOpenButton,
9c761f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sfInfo->openButtonTitle );
54db3c ¤   ¤   ¤   ¤   ¤   ¤   }
901c89 ¤   ¤   ¤   ¤   ¤   }
fe2613 ¤   ¤   ¤   ¤   }
812b85 ¤   ¤   ¤   ¤
edf622 ¤   ¤   ¤   ¤   break;
dd5a2a ¤   ¤   ¤   }¤
d50fe4 ¤   ¤   }
8c9371 ¤   }
7b67c5 ¤
--ffa0 00036fe860f4012011b Page 3 of PGPtoolsUtils.cp
e6e2ea ¤   return item;
04efe6 }
d8af5a
261a2a ¤   static pascal Boolean
89e74c VisibleItemFileFilterProc(CInfoPBPtr cpb)
08bb36 {
607c56 ¤   Boolean¤shouldFilter = FALSE;
c867c5 ¤
35a0bd ¤   pgpAssertAddrValid( cpb, CInfoPBRec);
03af5a
432577 ¤   if( cpbIsFile( cpb ) )
54c7a1 ¤   {
21da16 ¤   ¤   if( ( cpb->hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible ) != 0 )
8a5b34 ¤   ¤   {
647850 ¤   ¤   ¤   shouldFilter = TRUE;
dc0fe4 ¤   ¤   }
b69371 ¤   }
270e24 ¤   else
f7c7a1 ¤   {
cb8b69 ¤   ¤   if( ( cpb->dirInfo.ioDrUsrWds.frFlags & kIsInvisible ) != 0 )
325b34 ¤   ¤   {
837850 ¤   ¤   ¤   shouldFilter = TRUE;
4c0fe4 ¤   ¤   }
689371 ¤   }
4267c5 ¤
f0b746 ¤   return( shouldFilter );
67efe6 }
9caf5a
121a2a ¤   static pascal Boolean
9f8fb3 GetFileOrClipboardFilter(CInfoPBPtr cpb, const SFInfo *sfInfo)
92bb36 {
df7c56 ¤   Boolean¤shouldFilter = FALSE;
bc67c5 ¤
ac4e12 ¤   shouldFilter = VisibleItemFileFilterProc( cpb );
6f5e82 ¤   if( ! shouldFilter )
11c7a1 ¤   {
21fec2 ¤   ¤   if( cpbIsFile( cpb ) && ! sfInfo->showAllFiles )
975b34 ¤   ¤   {
621764 ¤   ¤   ¤   // Show only the files possibly created by PGP or
3bfdce ¤   ¤   ¤   // compatible products
74fa48 ¤   ¤   ¤   if( cpbFileType( cpb ) != 'TEXT' &&
3c76e5 ¤   ¤   ¤   ¤   cpbFileType( cpb ) != kPGPMacFileType_EncryptedData &&
5f0a87 ¤   ¤   ¤   ¤   cpbFileType( cpb ) != kPGPMacFileType_SignedData &&
dd791e ¤   ¤   ¤   ¤   cpbFileType( cpb ) != kPGPMacFileType_DetachedSig &&
341f90 ¤   ¤   ¤   ¤   cpbFileType( cpb ) != kPGPMacFileType_KeyShares &&
0c9e2a ¤   ¤   ¤   ¤   cpbFileType( cpb ) != kPGPMacFileType_ExportedKeys &&
7955af ¤   ¤   ¤   ¤   cpbFileType( cpb ) != kPGPMacFileTypeMacPGPEncryptedData )
6bf776 ¤   ¤   ¤   {
7a4538 ¤   ¤   ¤   ¤   shouldFilter = TRUE;
77a3a6 ¤   ¤   ¤   }
850fe4 ¤   ¤   }
d29371 ¤   }
a91b52 ¤   ¤
91b746 ¤   return( shouldFilter );
92efe6 }
f2af5a
665060 // Display SFGetFile dialog to select a file or choose a "Use Clipboard"
50f46b // button.
b7af5a
5485ea ¤   OSStatus
c34f1b GetFileOrClipboard(
cdaa6c ¤   PGPtoolsOperation¤  operation,
48365b ¤   ConstStr255Param¤   openButtonTitle,
7f4159 ¤   FSSpec ¤¤   ¤   ¤   *fsSpec,
72c536 ¤   Boolean ¤   ¤   ¤   *useClipboard)
d9bb36 {
d1ebcb ¤   SFInfo¤ ¤   ¤   ¤   sfInfo;
b8b9bd ¤   SFTypeList¤ ¤   ¤   typeList;
4e78c8 ¤   DlgHookYDUPP¤   ¤   cbHook;
b3408f ¤   FileFilterYDUPP¤¤   filterUPP;
eece8a ¤   static Point¤   ¤   where={0,0};
36ba5d ¤   long¤   ¤   ¤   ¤   scrapOffset;
--408a 000c143dbbb4012011b Page 4 of PGPtoolsUtils.cp
5af959 ¤   OSStatus¤   ¤   ¤   status = noErr;
41a8d5 ¤   short¤  ¤   ¤   ¤   dialogResID;
09897e ¤   Boolean¤¤   ¤   ¤   isEncryptSign;
fd67c5 ¤
56e8a2 ¤   pgpAssertAddrValid( fsSpec, FSSpec );
8185ab ¤   pgpAssertAddrValid( useClipboard, Boolean );
4e67c5 ¤
d3f3f2 ¤   pgpClearMemory( &sfInfo, sizeof( sfInfo ) );
6267c5 ¤
4a67c5 ¤
f1c793 ¤   isEncryptSign¤  = ( operation == kPGPtoolsEncryptOperation ||
93430a ¤   ¤   ¤   ·¤  ¤   ¤   operation == kPGPtoolsSignOperation ||
af8209 ¤   ¤   ¤   ¤   ¤   ¤   ·operation == kPGPtoolsEncryptSignOperation );
2a947c ¤   ¤   ¤   ·
203980 ¤   sfInfo.allowClipboard¤  ¤   = GetScrap( NULL, 'TEXT', &scrapOffset ) > 0;
e9bae9 ¤   sfInfo.showAllFiles¤¤   ¤   = TRUE;
aabd0d ¤   sfInfo.haveClipboardButton¤ = TRUE;
67a459 ¤   sfInfo.useClipboard ¤   ¤   = FALSE;
4f40e3 ¤   sfInfo.openButtonTitle¤ ¤   = openButtonTitle;
3567c5 ¤
f067c5 ¤
29782e ¤   if ( operation == kPGPtoolsDecryptVerifyOperation )
8dc7a1 ¤   {
109d02 ¤   ¤   sfInfo.showAllFiles¤= FALSE;
129371 ¤   }
0115af ¤   else if ( operation == kPGPtoolsWipeOperation )
7fc7a1 ¤   {
f200ff ¤   ¤   sfInfo.haveClipboardButton = FALSE;
5c9371 ¤   }
6e1b52 ¤   ¤
9b2352 ¤   cbHook ¤¤   = NewDlgHookYDProc( GetFileOrClipboardHook );
2ea78d ¤   filterUPP¤  = NewFileFilterYDProc( GetFileOrClipboardFilter );
d067c5 ¤
1f62ef ¤   if( operation == kPGPtoolsWipeOperation )
b0c7a1 ¤   {
f898b5 ¤   ¤   dialogResID = sfGetDialogID;
da9371 ¤   }
e1b27b ¤   else if( isEncryptSign )
42c7a1 ¤   {
e1a608 ¤   ¤   dialogResID = kEncryptGetFileOrClipboardDialogResID;
619371 ¤   }
b60e24 ¤   else
efc7a1 ¤   {
db309d ¤   ¤   dialogResID = kDecryptGetFileOrClipboardDialogResID;
c99371 ¤   }
5087c7 ¤   ¤   ¤
befb29 ¤   UDesktop::Deactivate();
9867c5 ¤
7536fc ¤   ::CustomGetFile(¤   filterUPP,
e2288b ¤   ¤   ¤   ¤   ¤   ¤   -1,
0f8f28 ¤   ¤   ¤   ¤   ¤   ¤   typeList,
01ed0e ¤   ¤   ¤   ¤   ¤   ¤   &sfInfo.sfReply,
a123eb ¤   ¤   ¤   ¤   ¤   ¤   dialogResID,
8c00d1 ¤   ¤   ¤   ¤   ¤   ¤   where,
ae951a ¤   ¤   ¤   ¤   ¤   ¤   cbHook,
d7aec3 ¤   ¤   ¤   ¤   ¤   ¤   NULL,
3faec3 ¤   ¤   ¤   ¤   ¤   ¤   NULL,
37aec3 ¤   ¤   ¤   ¤   ¤   ¤   NULL,
8733f5 ¤   ¤   ¤   ¤   ¤   ¤   &sfInfo);
dc94aa ¤   ¤   ¤   ¤   ¤   ¤
405824 ¤   UDesktop::Activate();
5967c5 ¤
93a52d ¤   DisposeRoutineDescriptor( cbHook );
5c05d4 ¤   DisposeRoutineDescriptor( filterUPP );
2a67c5 ¤
1dfc33 ¤   if( sfInfo.sfReply.sfGood || sfInfo.useClipboard )
5bc7a1 ¤   {
637f20 ¤   ¤   *fsSpec ¤   ¤   = sfInfo.sfReply.sfFile;
481f9e ¤   ¤   *useClipboard ¤ = sfInfo.useClipboard;
6e9371 ¤   }
140e24 ¤   else
c1c7a1 ¤   {
--5aae 000ee18b6df4012011b Page 5 of PGPtoolsUtils.cp
c3a6c1 ¤   ¤   status = userCanceledErr;
b59371 ¤   }
69af5a
d34afd ¤   return( status );
e6efe6 }
28af5a
6fd849 //¤ Gets the error string for the error err assuming a phrasing such as
3d8caa // ¤Couldn't do X because Y, where Y is the error string.
4faf5a
1d6d52 ¤   void
37f35c GetErrorString(CToolsError err, StringPtr errorStr)
47bb36 {
c68768 ¤   Str255¤ pStr;
8d277c ¤   char¤   cStr[ sizeof( pStr ) ];
001b52 ¤   ¤
45995f ¤   pgpAssertAddrValid( errorStr, uchar );
54859f ¤   pgpAssert( err.IsError() && ! err.IsCancelError() );
9567c5 ¤
6d3b91 ¤   errorStr[0] = 0;
5267c5 ¤
d3fbca ¤   pgpAssert( err.IsError() && (! err.IsCancelError() ) );
5daf5a
f768bf ¤   GetIndString( errorStr, kErrorStringListResID,
f2e515 ¤   ¤   ¤   ¤   kAnErrorOccurredStrIndex );
a267c5 ¤
c0bede ¤   if ( err.HavePGPError() )
5ec7a1 ¤   {
e23911 ¤   ¤   PGPGetClientErrorString( err.pgpErr, sizeof( cStr ), cStr );
5a9f4c ¤   ¤   CToPString( cStr, pStr );
149371 ¤   }
79ee91 ¤   else if ( err.err != noErr )
5cc7a1 ¤   {
d913dd ¤   ¤   GetOSErrorString( err.err, pStr );
029371 ¤   }
9d0e24 ¤   else
8ec7a1 ¤   {
db7989 ¤   ¤   pgpDebugMsg( "impossible case" );
f79371 ¤   }
871b52 ¤   ¤
66a4c7 ¤   PrintPString( errorStr, errorStr, pStr );
baefe6 }
73af5a
a67e69 ¤   Boolean
33fcac ShouldReportError(CToolsError err)
a6bb36 {
05defc ¤   if ( err.IsError() )
1dc7a1 ¤   {
b766d2 ¤   ¤   if ( ! err.IsCancelError() )
c35b34 ¤   ¤   {
1c95f7 ¤   ¤   ¤   return( TRUE );
090fe4 ¤   ¤   }
499371 ¤   }
3253dc ¤   return( FALSE );
9aefe6 }
45af5a
6eaf5a
e8af5a
b0af5a
ac71ba typedef struct PromptInfo
69bb36 {
436bde ¤   ConstStr255Param¤   prompt;
abf70f ¤   FileFilterUPP¤  ¤   fileFilter;
bfaf5a
966d13 } PromptInfo;
c9af5a
996867 ¤   static pascal short
f372ce StandardGetFileWithPromptHook(
bb36a1 ¤   short ¤ ¤   ¤   ¤   item,
fa0fec ¤   DialogPtr ¤ ¤   ¤   dialog,
db594b ¤   const PromptInfo ¤  *promptInfo)
41bb36 {
ee63e1 ¤   pgpAssertAddrValid( dialog, DialogRecord );
--9ded 000a4ee646a4012011b Page 6 of PGPtoolsUtils.cp
093b54 ¤   pgpAssertAddrValid( promptInfo, PromptInfo );
6267c5 ¤
ddeeb5 ¤   if( GetWRefCon( dialog ) == sfMainDialogRefCon )
24c7a1 ¤   {
4b217e ¤   ¤   switch( item )
445b34 ¤   ¤   {
b4fb18 ¤   ¤   ¤   case sfHookFirstCall:
2f09f5 ¤   ¤   ¤   ¤   SetIndDialogItemText( dialog, kPromptStaticTextItem,
20117d ¤   ¤   ¤   ¤   ¤   ¤   ¤   promptInfo->prompt );
23f622 ¤   ¤   ¤   ¤   break;
780fe4 ¤   ¤   }
da9371 ¤   }
3a67c5 ¤
f0e2ea ¤   return item;
46efe6 }
38af5a
821a2a ¤   static pascal Boolean
243725 StandardGetFileWithPromptFilter(CInfoPBPtr cpb, const PromptInfo *promptInfo)
45bb36 {
ed7c56 ¤   Boolean¤shouldFilter = FALSE;
fe67c5 ¤
2fa7a0 ¤   pgpAssertAddrValid( cpb, CInfoPBRec );
373b54 ¤   pgpAssertAddrValid( promptInfo, PromptInfo );
3867c5 ¤
343ce3 ¤   if( IsntNull( promptInfo->fileFilter ) )
9cc7a1 ¤   {
1270d1 ¤   ¤   shouldFilter = CallFileFilterProc( promptInfo->fileFilter, cpb );
449371 ¤   }
8367c5 ¤
c3b746 ¤   return( shouldFilter );
ceefe6 }
dcaf5a
03af5a
c933c8 ¤   static void
80d9da StandardGetFileWithPrompt(
dcfd4b ¤   FileFilterUPP ¤ ¤   fileFilter,
4d6d4d ¤   short ¤ ¤   ¤   ¤   numTypes,
bfb592 ¤   ConstSFTypeListPtr ¤typeList,
42b347 ¤   ConstStr255Param¤   prompt,
18a9d7 ¤   StandardFileReply ¤ *reply)
15bb36 {
10d54e ¤   DlgHookYDUPP¤   ¤   hookUPP;
74408f ¤   FileFilterYDUPP¤¤   filterUPP;
749a63 ¤   static Point¤   ¤   where = {0,0};
f799a6 ¤   PromptInfo¤ ¤   ¤   promptInfo;
2c67c5 ¤
d3afbf ¤   pgpAssertAddrValid( typeList, OSType );
99b6fc ¤   pgpAssertAddrValid( prompt, uchar );
9b5475 ¤   pgpAssertAddrValid( reply, StandardFileReply );
87af5a
af730b ¤   hookUPP ¤   = NewDlgHookYDProc( StandardGetFileWithPromptHook );
ec2ed2 ¤   filterUPP¤  = NewFileFilterYDProc( StandardGetFileWithPromptFilter );
e1af5a
d93c2a ¤   promptInfo.prompt¤  ¤   = prompt;
4b382b ¤   promptInfo.fileFilter¤  = fileFilter;
3b67c5 ¤
d7fb29 ¤   UDesktop::Deactivate();
9467c5 ¤
196e5e ¤   CustomGetFile( filterUPP, numTypes, typeList, reply,
3bc6bc ¤   ¤   ¤   ¤   kPromptStandardGetFileDialogResID,
c5740b ¤   ¤   ¤   ¤   where, hookUPP, NULL,NULL, NULL, &promptInfo );
a894aa ¤   ¤   ¤   ¤   ¤   ¤
535824 ¤   UDesktop::Activate();
1567c5 ¤
334cb9 ¤   DisposeRoutineDescriptor( hookUPP );
9305d4 ¤   DisposeRoutineDescriptor( filterUPP );
42efe6 }
37af5a
2985ea ¤   OSStatus
e4d83e PromptForSignatureSourceFile(
a0fc29 ¤   const FSSpec ¤  *sigFileSpec,
a4d88e ¤   FSSpec ¤¤   ¤   *sourceFileSpec)
--91aa 000c5accbfd4012011b Page 7 of PGPtoolsUtils.cp
2cbb36 {
d28828 ¤   FileFilterUPP¤  ¤   filterUPP;
f7f959 ¤   OSStatus¤   ¤   ¤   status = noErr;
320925 ¤   StandardFileReply¤  sfReply;
70b9bd ¤   SFTypeList¤ ¤   ¤   typeList;
e5ce69 ¤   Str255¤ ¤   ¤   ¤   prompt;
1967c5 ¤
aa5b67 ¤   AssertSpecIsValid( sigFileSpec, "PromptForSignatureSourceFile" );
f91ceb ¤   pgpAssertAddrValid( sourceFileSpec, FSSpec );
1767c5 ¤
111b9e ¤   filterUPP = NewFileFilterProc( VisibleItemFileFilterProc );
5a67c5 ¤
f97aac ¤   GetIndString( prompt, kDialogStringsListResID,
cd9456 ¤   ¤   ¤   ¤   kLocateDetachedSigSourceFilePromptStrIndex );
4aa4cc ¤   PrintPString( prompt, prompt, sigFileSpec->name );
0aaf5a
7f1d87 ¤   // Set Standard File to point to the signature file location.
c79765 ¤   LMSetSFSaveDisk( -sigFileSpec->vRefNum );
dffa46 ¤   LMSetCurDirStore( sigFileSpec->parID );
90af5a
344ad8 ¤   StandardGetFileWithPrompt( filterUPP, -1, typeList, prompt, &sfReply );
b267c5 ¤
da026c ¤   if( sfReply.sfGood )
12c7a1 ¤   {
80cea3 ¤   ¤   *sourceFileSpec = sfReply.sfFile;
aa9371 ¤   }
d10e24 ¤   else
f8c7a1 ¤   {
a5a6c1 ¤   ¤   status = userCanceledErr;
759371 ¤   }
301b52 ¤   ¤
0b05d4 ¤   DisposeRoutineDescriptor( filterUPP );
be67c5 ¤
c34afd ¤   return( status );
d4efe6 }
58af5a
f87e69 ¤   Boolean
653f0a HaveDirWriteAccess(short vRefNum, long dirID)
0cbb36 {
2522d3 ¤   XVolumeParam¤   xpb;
1ad068 ¤   Str255¤ ¤   ¤   tempStr;
99cc6b ¤   Boolean¤¤   ¤   haveWriteAccess = TRUE;¤// Optimistic result
b067c5 ¤
daa32c ¤   // Check to see if the volume is locked first.
8367c5 ¤
5837a0 ¤   pgpClearMemory( &xpb, sizeof( xpb ) );
7867c5 ¤
e65a1c ¤   xpb.ioVRefNum¤  = vRefNum;
5eeb6a ¤   xpb.ioNamePtr¤  = tempStr;
87af5a
18ada8 ¤   if( IsntErr( pgpPBXGetVolInfo( &xpb ) ) )
d2c7a1 ¤   {
1e9603 ¤   ¤   haveWriteAccess = ((xpb.ioVAtrb & kVolumeAttributeLockMask) == 0);
139371 ¤   }
e767c5 ¤
5ae119 ¤   if( haveWriteAccess )
dec7a1 ¤   {
90fef6 ¤   ¤   CInfoPBRec¤ cpb;
1a1b52 ¤   ¤
cb52a6 ¤   ¤   // Check the folder access permissions
351b52 ¤   ¤
baa450 ¤   ¤   pgpClearMemory( &cpb, sizeof( cpb ) );
f21b52 ¤   ¤
4dc819 ¤   ¤   cpb.dirInfo.ioVRefNum¤  = vRefNum;
c34bd7 ¤   ¤   cpb.dirInfo.ioDrDirID¤  = dirID;
22796f ¤   ¤   cpb.dirInfo.ioNamePtr¤  = tempStr;
7530c6 ¤   ¤   cpb.dirInfo.ioFDirIndex¤= -1;
d31b52 ¤   ¤
844814 ¤   ¤   if( IsntErr( PBGetCatInfoSync( &cpb ) ) )
985b34 ¤   ¤   {
dc6b46 #define¤¤   kCannotSeeFilesMask¤¤   ¤   0x02
c5a029 #define¤¤   kCannotMakeChangesMask¤ ¤   0x04
--c294 0001b9843d74012011b Page 8 of PGPtoolsUtils.cp
458de6 #define¤¤   kNoWriteAccessMask¤ ¤   ¤   ( kCannotSeeFilesMask | ·\
2eb5a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCannotMakeChangesMask )
d687c7 ¤   ¤   ¤
5ced80 ¤   ¤   ¤   haveWriteAccess = (( cpb.dirInfo.ioACUser &
1cab4b ¤   ¤   ¤   ¤   ¤   ¤   kNoWriteAccessMask ) == 0);
0a0fe4 ¤   ¤   }
519371 ¤   }
03af5a
cec258 ¤   return( haveWriteAccess );
22efe6 }
3d85ea ¤   OSStatus
c02306 GetPGPFileKindInfo(
3afbb6 ¤   const FSSpec *¤ spec,
07384a ¤   FileKindInfo *¤ info )
aebb36 {
dcdc42 ¤   OSStatus¤   err;
394f27 ¤   CInfoPBRec¤ cpb;
b367c5 ¤
9c363d ¤   pgpClearMemory( info, sizeof( *info ) );
9c2244 ¤   err¤= FSpGetCatInfo( spec, &cpb );
e67a91 ¤   if ( IsErr( err ) )
b1e55e ¤   ¤   return( err );
5967c5 ¤
d0c56c ¤   if ( cpbFileCreator( &cpb ) == kPGPMacFileCreator_Tools )
cec7a1 ¤   {
f38e2f ¤   ¤   /* it's a PGP file */
ca87fe ¤   ¤   info->isPGPFile¤= TRUE;
431b52 ¤   ¤
be31b2 ¤   ¤   switch( cpbFileType( &cpb ) )
395b34 ¤   ¤   {
4cdb68 ¤   ¤   ¤   default:
53ac32 ¤   ¤   ¤   case kPGPMacFileType_ArmorFile:
d4f622 ¤   ¤   ¤   ¤   break;
192b85 ¤   ¤   ¤   ¤
aa0e25 ¤   ¤   ¤   case kPGPMacFileType_EncryptedData:
cfb297 ¤   ¤   ¤   ¤   info->isEncrypted = TRUE;
42f622 ¤   ¤   ¤   ¤   break;
b22b85 ¤   ¤   ¤   ¤
6a79ba ¤   ¤   ¤   case kPGPMacFileType_SignedData:
80a778 ¤   ¤   ¤   ¤   info->isSigned = TRUE;
37f622 ¤   ¤   ¤   ¤   break;
d82b85 ¤   ¤   ¤   ¤
abd2d6 ¤   ¤   ¤   case kPGPMacFileType_DetachedSig:
231b78 ¤   ¤   ¤   ¤   info->isDetachedSig¤= TRUE;
01f622 ¤   ¤   ¤   ¤   break;
bf0fe4 ¤   ¤   }
c39371 ¤   }
853605 ¤   else if ( cpbFileCreator( &cpb ) == kPGPMacFileCreator_Keys )
54c7a1 ¤   {
893f54 ¤   ¤   if( cpbFileType( &cpb ) == kPGPMacFileType_KeyShares )
175b34 ¤   ¤   {
ce619f ¤   ¤   ¤   info->isPGPFile¤¤   ¤   = TRUE;
8d488a ¤   ¤   ¤   info->isKeyShareFile ¤  = TRUE;
400fe4 ¤   ¤   }
849371 ¤   }
38bb9b ¤   else if( cpbFileType( &cpb ) == 'TEXT' )
fdc7a1 ¤   {
222e12 ¤   ¤   info->maybePGPFile = TRUE;
7d9371 ¤   }
9b0e24 ¤   else
46c7a1 ¤   {
146173 ¤   ¤   const uchar ¤   kPGPSuffix[]¤   = "\p.pgp";
e23df2 ¤   ¤   const uchar ¤   kSigSuffix[]¤   = "\p.sig";
b93922 ¤   ¤   const uchar ¤   kAscSuffix[]¤   = "\p.asc";
fd1b52 ¤   ¤
73229c ¤   ¤   /* look for file name extensions */
181ed2 ¤   ¤   if ( PStringHasSuffix( spec->name, kPGPSuffix, FALSE) )
595b34 ¤   ¤   {
a06fe1 ¤   ¤   ¤   info->maybePGPFile = TRUE;
180fe4 ¤   ¤   }
de69e5 ¤   ¤   else if ( PStringHasSuffix( spec->name, kSigSuffix, FALSE) )
1b5b34 ¤   ¤   {
--c5fc 000c60810704012011b Page 9 of PGPtoolsUtils.cp
c06fe1 ¤   ¤   ¤   info->maybePGPFile = TRUE;
bf0fe4 ¤   ¤   }
2c51cc ¤   ¤   else if ( PStringHasSuffix( spec->name, kAscSuffix, FALSE) )
8e5b34 ¤   ¤   {
c86fe1 ¤   ¤   ¤   info->maybePGPFile = TRUE;
e70fe4 ¤   ¤   }
3d9371 ¤   }
4467c5 ¤
88deb7 ¤   return( err );
2defe6 }
1eaf5a
6585ea ¤   OSStatus
09a59c RemoveChildAndDuplicateSpecsFromList(TArray<FSSpec>¤*specList)
34bb36 {
a91e31 ¤   OSStatus¤   ¤   macErr = noErr;
9aa419 ¤   PGPUInt32 ¤ ¤   specIndex;
6953f0 ¤   PGPUInt32¤  ¤   numSpecs;
4e67c5 ¤
5da3c0 ¤   pgpAssertAddrValid( specList, VoidAlign );
9367c5 ¤
883df7 ¤   // Walk the list backwards and see if the target spec
8cf85d ¤   // is contained within any other spec in the list. Slow, but simple.
0667c5 ¤
d6b038 ¤   numSpecs = specList->GetCount();
bba436 ¤   for( specIndex = numSpecs; specIndex >= 1; specIndex-- )
6fc7a1 ¤   {
21249f ¤   ¤   FSSpec¤ ¤   targetSpec;
6eda64 ¤   ¤   PGPUInt32¤  checkIndex;
6c1b52 ¤   ¤
583fe3 ¤   ¤   specList->FetchItemAt( specIndex, targetSpec );
2c1b52 ¤   ¤
d5d274 ¤   ¤   for( checkIndex = 1; checkIndex <= numSpecs; checkIndex++ )
d15b34 ¤   ¤   {
bd97da ¤   ¤   ¤   if( checkIndex != specIndex )
b8f776 ¤   ¤   ¤   {
2e11d2 ¤   ¤   ¤   ¤   FSSpec¤ checkSpec;
c53a0f ¤   ¤   ¤   ¤   Boolean¤remove = FALSE;
982b85 ¤   ¤   ¤   ¤
2c61a3 ¤   ¤   ¤   ¤   specList->FetchItemAt( checkIndex, checkSpec );
221b52 ¤   ¤
fe7e0e ¤   ¤   ¤   ¤   if( FSpEqual( &checkSpec, &targetSpec ) )
f072c3 ¤   ¤   ¤   ¤   {
fd735a ¤   ¤   ¤   ¤   ¤   remove = TRUE;
632613 ¤   ¤   ¤   ¤   }
eefa07 ¤   ¤   ¤   ¤   else
4072c3 ¤   ¤   ¤   ¤   {
5efdf4 ¤   ¤   ¤   ¤   ¤   Boolean¤isContained;
93ae30 ¤   ¤   ¤   ¤   ¤
6cfda3 ¤   ¤   ¤   ¤   ¤   macErr = FSSpecContainsFSSpec( &checkSpec, &targetSpec,
f6e8c9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &isContained );
f7e965 ¤   ¤   ¤   ¤   ¤   if( IsntErr( macErr ) && isContained )
ea4859 ¤   ¤   ¤   ¤   ¤   {
6e32a9 ¤   ¤   ¤   ¤   ¤   ¤   remove = TRUE;
e01c89 ¤   ¤   ¤   ¤   ¤   }
872613 ¤   ¤   ¤   ¤   }
f82b85 ¤   ¤   ¤   ¤
ed861e ¤   ¤   ¤   ¤   if( remove )
e372c3 ¤   ¤   ¤   ¤   {
495266 ¤   ¤   ¤   ¤   ¤   specList->RemoveItemsAt( 1, specIndex );
fb672a ¤   ¤   ¤   ¤   ¤   --numSpecs;
16ae30 ¤   ¤   ¤   ¤   ¤
b914c3 ¤   ¤   ¤   ¤   ¤   break;
4c2613 ¤   ¤   ¤   ¤   }
27a3a6 ¤   ¤   ¤   }
800fe4 ¤   ¤   }
dc1b52 ¤   ¤
d36a5c ¤   ¤   if( IsErr( macErr ) )
73cdcb ¤   ¤   ¤   break;
f59371 ¤   }
7967c5 ¤
12c1bd ¤   return( macErr );
c6efe6 }
--4c96 0000d04b47e4012011b Page 10 of PGPtoolsUtils.cp
e0af5a
9d5c98 #if PGP_DEBUG
5dd837 ¤   #define FIXED_PATTERN¤  0
63db21 #else
2394bf ¤   /* Never allow fixed pattern in release version */
92d837 ¤   #define FIXED_PATTERN¤  0
417454 #endif
23af5a
55c744 ¤   PGPError
ac367d GetWipingPatternList(
c1a1bc ¤   PGPContextRef¤  ¤   context,
e3629d ¤   PGPUInt32¤  ¤   ¤   numPasses,
d6559b ¤   PGPWipingPattern¤   **patterns)
39bb36 {
8e7f19 ¤   PGPDiskWipeRef¤ wipeRef;
86fb19 ¤   PGPError¤   ¤   err;
6367c5 ¤
a1c869 ¤   *patterns = NULL;
2d67c5 ¤
33e0fd ¤   err = PGPCreateDiskWiper( context, &wipeRef, numPasses );
d8b1f0 ¤   if( IsntPGPError( err ) )
21c7a1 ¤   {
a45135 ¤   ¤   PGPWipingPattern¤   *patternList;
351b52 ¤   ¤
128fd3 ¤   ¤   patternList = (PGPWipingPattern *) PGPNewData(
ac80d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( context ),
b22cd6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   numPasses * sizeof( *patternList ), 0 );
44399b ¤   ¤   if( IsntNull( patternList ) )
865b34 ¤   ¤   {
e898f5 ¤   ¤   ¤   PGPUInt32¤  patternIndex;
13af5a
eef0ea ¤   ¤   ¤   for( patternIndex = 0; patternIndex < numPasses; patternIndex++ )
c2f776 ¤   ¤   ¤   {
dadf7c ¤   ¤   ¤   #if FIXED_PATTERN¤  /* [ */
3887c7 ¤   ¤   ¤
1f6c64 ¤   ¤   ¤   ¤   PGPUInt32¤  *cur;
0e2b85 ¤   ¤   ¤   ¤
4c1995 ¤   ¤   ¤   ¤   cur = (PGPUInt32 *) &patternList[patternIndex].bytes[0];
c7a742 ¤   ¤   ¤   ¤   for( PGPUInt32 index = 0; index < 128; index++ )
16033b ¤   ¤   ¤   ¤   ¤   *cur++ = 'DAVE';
29ae30 ¤   ¤   ¤   ¤   ¤
47bc21 ¤   ¤   ¤   #else¤  /* ] FIXED_PATTERN [ */
2d2b85 ¤   ¤   ¤   ¤
2976eb ¤   ¤   ¤   ¤   PGPInt32 ¤  buffer[256];
f92b85 ¤   ¤   ¤   ¤
c4b583 ¤   ¤   ¤   ¤   err = PGPGetDiskWipeBuffer( wipeRef, buffer );
eb9c8a ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
7914c3 ¤   ¤   ¤   ¤   ¤   break;
1dae30 ¤   ¤   ¤   ¤   ¤
bc9292 ¤   ¤   ¤   ¤   pgpCopyMemory( buffer, &patternList[patternIndex],
c40bc0 ¤   ¤   ¤   ¤   ¤   ¤   sizeof( patternList[0] ) );
abb3b8 ¤   ¤   ¤   #endif¤ /* ] FIXED_PATTERN */
bfa3a6 ¤   ¤   ¤   }
1587c7 ¤   ¤   ¤
197e3a ¤   ¤   ¤   *patterns = patternList;
020fe4 ¤   ¤   }
880e1d ¤   ¤   else
b05b34 ¤   ¤   {
88b90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
a00fe4 ¤   ¤   }
3a1b52 ¤   ¤
d7c6de ¤   ¤   PGPDestroyDiskWiper( wipeRef );
a79371 ¤   }
b5af5a
73deb7 ¤   return( err );
7fefe6 }
68af5a
30af5a
8faf5a
d8af5a
69af5a
0daf5a
--b012 0011a3a01944012011b Page 11 of PGPtoolsUtils.cp
e0af5a
1aaf5a
--949f 001e68d8a154012011c Page 1 of PGPtoolsUtils.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
8df2d7 ¤   $Id: PGPtoolsUtils.h,v 1.15.8.1 1998/11/12 03:09:35 heller Exp $
f8f7f7 ____________________________________________________________________________*/
72af5a
e47b7d #pragma once
7daf5a
820b83 #include <TArray.h>
82af5a
edc110 #include "pgpMacMemory.h"
af7dde #include "pgpMacWiping.h"
a2af5a
02a076 #include "pgpKeys.h"
c5e82c #include "pgpPubTypes.h"
69af5a
510e3c #pragma warn_hidevirtual off
85c520 template class TArray<FSSpec>;
17465d #pragma warn_hidevirtual reset
15af5a
ef3379 #ifdef __cplusplus
c56dad extern "C" {
c37454 #endif
50af5a
e1a8dd #include "pgpTools.h"
85af5a
48ded6 OSStatus¤   ¤   GetFileOrClipboard(
f7bdde ¤   ¤   ¤   ¤   ¤   ¤   PGPtoolsOperation¤  operation,
9b7ed4 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param openButtonTitle,
230836 ¤   ¤   ¤   ¤   ¤   ¤   FSSpec *fsSpec, Boolean *useClipboard);
97bc1e void¤   ¤   ¤   GetErrorString(CToolsError err, StringPtr errorStr);
44032b Boolean¤¤   ¤   ShouldReportError(CToolsError err);
c1c3e3 OSStatus¤   ¤   PromptForSignatureSourceFile(const FSSpec *sigFileSpec,
d82902 ¤   ¤   ¤   ¤   ¤   ¤   FSSpec *sourceFileSpec);
953df1 Boolean¤¤   ¤   HaveDirWriteAccess(short vRefNum, long dirID);
e5b3f6 OSStatus¤   ¤   RemoveChildAndDuplicateSpecsFromList(
9d2047 ¤   ¤   ¤   ¤   ¤   ¤   TArray<FSSpec>¤ *specList);
d1af5a
ad1741 typedef struct
73bb36 {
95bcb6 ¤   Boolean¤¤   isEncrypted;
621ac7 ¤   Boolean¤¤   isSigned;
faa236 ¤   Boolean¤¤   isDetachedSig;
010bff ¤   Boolean¤¤   isKeyShareFile;
725609 ¤   Boolean¤¤   isPGPFile;
25559e ¤   Boolean¤¤   maybePGPFile;
84e377 } FileKindInfo;
66af5a
beaf5a
36c4da OSStatus¤   GetPGPFileKindInfo( const FSSpec *spec, FileKindInfo *info );
0dcac5 PGPError¤   GetWipingPatternList(PGPContextRef context, PGPUInt32 numPasses,
da8d8f ¤   ¤   ¤   ¤   ¤   ¤   PGPWipingPattern **patterns);
cfaf5a
973379 #ifdef __cplusplus
4befe6 }
ee7454 #endif
e6af5a
--d9a4 0007467053b4012011d Page 1 of PGPmenuMESP.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
562643 ¤   $Id: PGPmenuMESP.cp,v 1.7.8.1 1998/11/12 03:08:30 heller Exp $
50f7f7 ____________________________________________________________________________*/
c1af5a
af70b5 #include <SetupA4.h>
219040 #include <A4Stuff.h>
f2af5a
068f22 #include <CodeFragments.h>
bc3a79 #include <MixedMode.h>
d2468b #include <UDebugging.h>
eeaf5a
484720 #include "pflPrefTypes.h"
56c414 #include "PGPMemoryMgr.h"
b4c97b #include "pgpClientPrefs.h"
5510f0 #include "pgpOpenPrefs.h"
e4e82c #include "pgpPubTypes.h"
26af5a
f19548 #include "plugin.h"
80af5a
c9af5a
d573f4 enum {
c9030a ¤   kFinderSignature = 'MACS'
a582f7 };
4daf5a
b917f4 struct SMenuApps {
39bf13 ¤   PGPBoolean¤ privateScrap;
605cf1 ¤   PGPBoolean¤ useOutputDialog;
3b5e98 ¤   OSType¤ ¤   creator;
7ad0f4 ¤   Str31¤  ¤   name;
af82f7 };
3caf5a
26f341 // Main entry point declaration
873379 #ifdef __cplusplus
716dad extern "C" {
e07454 #endif
334748 typedef SInt32 (*PGPmenuMain)(ProcessInfoRec *, FSSpec *, Boolean, Boolean);
61af5a
2a3379 #ifdef __cplusplus
44efe6 }
ca7454 #endif
e7af5a
ec73f4 enum {
7e7c85 ¤   uppPGPmenuMainProcInfo = kThinkCStackBased
34e162 ¤   ¤   | RESULT_SIZE(SIZE_CODE(sizeof(SInt32)))
5b5fd4 ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ProcessInfoRec *)))
15a520 ¤   ¤   | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(FSSpec *)))
0ea099 ¤   ¤   | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(Boolean)))
f3eb37 ¤   ¤   | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(Boolean)))
cd82f7 };
05af5a
dafdb7 #if TARGET_RT_MAC_CFM
d39769 typedef UniversalProcPtr PGPmenuMainProcUPP;
83f629 #define CallPGPmenuMainProc(userRoutine, processInfoPtr, fsSpecPtr,¤\
e9e4b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   privateScrap, useOutputDialog)¤ ¤   ¤   \
1cad20 (SInt32) CallUniversalProc(¤(UniversalProcPtr)(userRoutine),¤   ¤   \
a3b032 ¤   ¤   ¤   ¤   ¤   ¤   ¤   uppPGPmenuMainProcInfo,¤¤   ¤   ¤   ¤   \
f079ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   (processInfoPtr),¤  ¤   ¤   ¤   ¤   ¤   \
54567e ¤   ¤   ¤   ¤   ¤   ¤   ¤   (fsSpecPtr),¤   ¤   ¤   ¤   ¤   ¤   ¤   \
afc517 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (privateScrap),¤¤   ¤   ¤   ¤   ¤   ¤   \
2d9835 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (useOutputDialog))¤ ¤   ¤   ¤   ¤   ¤   ¤
a6db21 #else
2e9f8e typedef PGPmenuMain PGPmenuMainProcUPP;
20f629 #define CallPGPmenuMainProc(userRoutine, processInfoPtr, fsSpecPtr,¤\
44e4b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   privateScrap, useOutputDialog)¤ ¤   ¤   \
ac63ba (SInt32)(*(userRoutine))((processInfoPtr), (fsSpecPtr),¤¤   ¤   ¤   \
233adb ¤   ¤   ¤   ¤   ¤   ¤   (privateScrap), (useOutputDialog))
747454 #endif
--98e3 00078ee73254012011d Page 2 of PGPmenuMESP.cp
e0af5a
5fcd99 Boolean¤CaptureThisApp(OSType inCreator, Boolean * outPrivateScrap,
11020c ¤   ¤   ¤   Boolean * outUseOutputDialog);
5baf5a
27af5a
5d134b ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Error code
718fb3 main (
665f18 ¤   ProcessInfoRec *¤   inProcInfo,¤// Proc info for captured browser
d7c150 ¤   FSSpec *¤   ¤   ¤   inFSSpec)¤  // FSSpec for this plugin
91bb36 {
2249ac ¤   // Remember A4
e1953d ¤   EnterCodeResource();
35af5a
f94155 ¤   SInt32¤ ¤   ¤   ¤   result;
01af5a
93c7a1 ¤   {
3a5d4a ¤   ¤   OSErr¤  ¤   ¤   ¤   err;
5c8a90 ¤   ¤   Boolean¤¤   ¤   ¤   privateScrap;
897763 ¤   ¤   Boolean¤¤   ¤   ¤   useOutputDialog;
3956a7 ¤   ¤   SInt16¤ ¤   ¤   ¤   fileRef;
beaf5a
6b552a ¤   ¤   fileRef = ::FSpOpenResFile(¤inFSSpec,
434822 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fsRdPerm);
95ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
d590b4 ¤   ¤   // Check for CFM
9f2358 ¤   ¤   SInt32¤ response;
561b52 ¤   ¤
b54547 ¤   ¤   err = ::Gestalt(gestaltCFMAttr, &response);
0a8d0d ¤   ¤   if ((::ResError() != noErr) || (err != noErr)
71e9e4 ¤   ¤   || (((response >> gestaltCFMPresent) & 1) != 1)) {
b0aa55 ¤   ¤   ¤   result = kUnknownErr;
bff862 ¤   ¤   } else if ((inProcInfo->processSignature == kFinderSignature)
803858 ¤   ¤   || (CaptureThisApp(inProcInfo->processSignature, &privateScrap,
704641 ¤   ¤   &useOutputDialog))) {
c7a10e ¤   ¤   ¤   // Load the library
bdae57 ¤   ¤   ¤   CFragConnectionID¤  connID;
98b99a ¤   ¤   ¤   Ptr¤¤   ¤   ¤   ¤   mainAddr;
a44f85 ¤   ¤   ¤   Str255¤ ¤   ¤   ¤   errName;
f1ff50 ¤   ¤   ¤   THz¤¤   ¤   ¤   ¤   savedZone = ::GetZone();
5cb2b6 ¤   ¤   ¤   CFragResource **¤   theCFragResourceH = nil;
4e87c7 ¤   ¤   ¤
e85b9d ¤   ¤   ¤   theCFragResourceH = (CFragResource **)
7ddc3e ¤   ¤   ¤   ¤   ¤   ::Get1Resource(kCFragResourceType, kCFragResourceID);
3eaf5a
17b15f ¤   ¤   ¤   if (theCFragResourceH == nil) {
e6b91b ¤   ¤   ¤   ¤   result = kOutOfMemoryErr;
97042d ¤   ¤   ¤   } else {
0a44c7 ¤   ¤   ¤   ¤   CFragResourceMemberPtr¤ memberPtr;
422b85 ¤   ¤   ¤   ¤
1b02cf ¤   ¤   ¤   ¤   ::HLock((Handle) theCFragResourceH);
8ff497 ¤   ¤   ¤   ¤   memberPtr = &(**theCFragResourceH).firstMember;
832b85 ¤   ¤   ¤   ¤
131b7c ¤   ¤   ¤   ¤   // If the app is the finder, we need to load in the system
05a09c ¤   ¤   ¤   ¤   // zone otherwise move to the next cfrg
30b83c ¤   ¤   ¤   ¤   if (inProcInfo->processSignature == kFinderSignature) {
e9cf39 ¤   ¤   ¤   ¤   ¤   ::SetZone(::SystemZone());
f2b5fc ¤   ¤   ¤   ¤   } else {
f27244 ¤   ¤   ¤   ¤   ¤   ((Ptr) memberPtr) += memberPtr->memberSize;
9a2613 ¤   ¤   ¤   ¤   }
be90ca ¤   ¤   ¤   ¤   err = ::GetDiskFragment(¤   inFSSpec,
334308 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   memberPtr->offset,
1c2692 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   memberPtr->length,
b6d741 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   memberPtr->name,
74f9da ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kLoadCFrag,
c093d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &connID,
b7667a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr*)&mainAddr,
e67c08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   errName);
ab0819 ¤   ¤   ¤   ¤   ::SetZone(savedZone);
190bf6 ¤   ¤   ¤   ¤   ::ReleaseResource((Handle) theCFragResourceH);
dbb3b9 ¤   ¤   ¤   ¤   if (err != noErr) {
5f805d //¤ ¤   ¤   ¤   ¤   if (result == kOutOfMemoryErr) {
7809c6 //¤ ¤   ¤   ¤   ¤   }
--5a0d 0009f3716604012011d Page 3 of PGPmenuMESP.cp
3f79c8 ¤   ¤   ¤   ¤   ¤   result = kUnknownErr;
a7a7e3 ¤   ¤   ¤   ¤   } else {¤
8b9186 ¤   ¤   ¤   ¤   ¤   // Create the UPP
310b4e ¤   ¤   ¤   ¤   ¤   PGPmenuMainProcUPP¤ mainUPP;
4baf5a
28a858 ¤   ¤   ¤   ¤   ¤   mainUPP = (PGPmenuMainProcUPP)·
490bda ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::NewRoutineDescriptorTrap(
bed9cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (ProcPtr) mainAddr,
bb4d7f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   uppPGPmenuMainProcInfo,
bb646b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CFM_MESPTarget_);
59a69b ¤   ¤   ¤   ¤   ¤   if (mainUPP == nil) {
9b27ef ¤   ¤   ¤   ¤   ¤   ¤   ::CloseConnection(& connID);
ebcfe0 ¤   ¤   ¤   ¤   ¤   ¤   result = kOutOfMemoryErr;
2381a1 ¤   ¤   ¤   ¤   ¤   } else {
5cd151 ¤   ¤   ¤   ¤   ¤   ¤   savedZone = ::GetZone();
52178b ¤   ¤   ¤   ¤   ¤   ¤   ::SetZone(::SystemZone());
3ee157 ¤   ¤   ¤   ¤   ¤   ¤   result = CallPGPmenuMainProc(¤  mainUPP,
a595b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inProcInfo,
4c8d9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inFSSpec,
735cbe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   privateScrap,
4f4741 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   useOutputDialog);
6b0d32 ¤   ¤   ¤   ¤   ¤   ¤   ::SetZone(savedZone);
0ab3be ¤   ¤   ¤   ¤   ¤   ¤   ::DisposeRoutineDescriptorTrap(
23c748 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (UniversalProcPtr) mainUPP);
5094aa ¤   ¤   ¤   ¤   ¤   ¤
7ee167 ¤   ¤   ¤   ¤   ¤   ¤   // Close the connection if we are not patching
5219d3 ¤   ¤   ¤   ¤   ¤   ¤   if (result != noErr) {
3c48dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::CloseConnection(& connID);
aedb3c ¤   ¤   ¤   ¤   ¤   ¤   }
741c89 ¤   ¤   ¤   ¤   ¤   }
032613 ¤   ¤   ¤   ¤   }
4aa3a6 ¤   ¤   ¤   }
8f0fe4 ¤   ¤   }
ddaf5a
fb8fc7 ¤   ¤   ::CloseResFile(fileRef);
569371 ¤   }
0b67c5 ¤
4c9e0c ¤   // Restore A4
c71487 ¤   ExitCodeResource();
10af5a
c80b72 ¤   return result | kUnloadPlug;
83efe6 }
08af5a
c5af5a
e5af5a
da7e69 ¤   Boolean
10e37b CaptureThisApp(
df1e88 ¤   OSType¤ ¤   inCreator,
f53f1a ¤   Boolean *¤  outPrivateScrap,
466e9e ¤   Boolean *¤  outUseOutputDialog)
f9bb36 {
f57bba ¤   Boolean¤¤   ¤   result = false;
024ec1 ¤   SMenuApps *¤¤   apps = nil;
15b187 ¤   PGPPrefRef¤ ¤   prefRef = kInvalidPGPPrefRef;
2a9aea ¤   PGPMemoryMgrRef¤memoryMgr = kInvalidPGPMemoryMgrRef;
dede55 ¤   PGPSize¤¤   ¤   len;
c89f8d ¤   UInt32¤ ¤   ¤   numApps;
ca03e8 ¤   PGPError¤   ¤   pgpErr;
e0af5a
5485d1 ¤   pgpErr = PGPNewMemoryMgr(0, &memoryMgr);
e9c02b ¤   if (pgpErr == kPGPError_NoErr) {
447e95 ¤   ¤   pgpErr = PGPOpenClientPrefs(memoryMgr, &prefRef);
ecc5c6 ¤   ¤   if (pgpErr == kPGPError_NoErr) {
83338b ¤   ¤   ¤   pgpErr = PGPGetPrefData(¤   prefRef,·
3dcee8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefPGPmenuMacAppSignatures,·
719c37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &len,·
87168d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &apps);
4fc37e ¤   ¤   ¤   if (pgpErr == kPGPError_NoErr) {
80d0d5 ¤   ¤   ¤   ¤   numApps = len / sizeof(SMenuApps);
29bda3 ¤   ¤   ¤   ¤   for (UInt32 x = 0; x < numApps; x++) {
2c0b03 ¤   ¤   ¤   ¤   ¤   if (apps[x].creator == inCreator) {
9f69e3 ¤   ¤   ¤   ¤   ¤   ¤   *outPrivateScrap = apps[x].privateScrap;
--980f 001d94e566f4012011d Page 4 of PGPmenuMESP.cp
6f5613 ¤   ¤   ¤   ¤   ¤   ¤   *outUseOutputDialog = apps[x].useOutputDialog;
91b451 ¤   ¤   ¤   ¤   ¤   ¤   result = true;
1100eb ¤   ¤   ¤   ¤   ¤   ¤   break;
6a1c89 ¤   ¤   ¤   ¤   ¤   }
a22613 ¤   ¤   ¤   ¤   }
4aa3a6 ¤   ¤   ¤   }
bc0fe4 ¤   ¤   }
589371 ¤   }
e567c5 ¤
56b832 ¤   if (apps != nil) {
ed7665 ¤   ¤   PGPDisposePrefData(¤prefRef,·
9ef7a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   apps);
d8af5a
9f9371 ¤   }
9faf5a
ddc733 ¤   if (PGPPrefRefIsValid(prefRef)) {
c8fbc0 ¤   ¤   PGPClosePrefFile(prefRef);
3a9371 ¤   }
4567c5 ¤
446536 ¤   if (PGPMemoryMgrRefIsValid(memoryMgr)) {
551d21 ¤   ¤   PGPFreeMemoryMgr(memoryMgr);
c49371 ¤   }
ec67c5 ¤
de5d73 ¤   return result;
d9efe6 }
--cf01 0015b7f25704012011e Page 1 of PGPmenuMESP68KPrefix.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
35210f ¤   $Id: PGPmenuMESP68KPrefix.h,v 1.3.18.1 1998/11/12 03:08:31 heller Exp $
8ff7f7 ____________________________________________________________________________*/
d1af5a
908c5a #include <MacHeaders.h>
5eaf5a
51b18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
f5af5a
07e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
d779b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
aeaf5a
1f049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
7aaf5a
1f0db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
a8af5a
1ba662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
11a6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
165cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
a4af5a
090438 #include "MacBasics.h"
d796be #include "PGPBuildFlags.h"
7be2ff #include "pgpConfig.h"
9194a0 #include "pgpLeaks.h"
b646ad #include "MacDebug.h"
a1af5a
5b3adc #define CFM_MESPTarget_¤(kM68kISA | kCFM68kRTA)¶
--c06a 001fd98d36f4012011f Page 1 of PGPmenuMESPPPCPrefix.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
c4db22 ¤   $Id: PGPmenuMESPPPCPrefix.h,v 1.3.18.1 1998/11/12 03:08:31 heller Exp $
acf7f7 ____________________________________________________________________________*/
21af5a
058c5a #include <MacHeaders.h>
10af5a
8eb18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
04af5a
cee6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
9f79b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
c0af5a
e1049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
94af5a
680db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
ccaf5a
29a662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
18a6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
f15cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
1faf5a
6a0438 #include "MacBasics.h"
7896be #include "PGPBuildFlags.h"
12e2ff #include "pgpConfig.h"
4294a0 #include "pgpLeaks.h"
f346ad #include "MacDebug.h"
0caf5a
fd893f #define CFM_MESPTarget_¤(kPowerPCISA | kPowerPCRTA)¶
--6c8c 000b1184f0d40120120 Page 1 of CmenuDrawMenuBarPatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
c6c97f ¤   $Id: CmenuDrawMenuBarPatch.cp,v 1.5.8.1 1998/11/12 03:08:33 heller Exp $
0ff7f7 ____________________________________________________________________________*/
f6af5a
b08e44 #include "MacIcons.h"
6daf5a
b2740c #include <UAppleEventsMgr.h>
c2af5a
de85a2 #include "CmenuDrawMenuBarPatch.h"
7caf5a
e6af5a
98af5a
f287a9 // types
f5af46 #pragma options align=mac68k
ad5f9e struct MenuRec {
a57072 ¤   MenuRef¤¤   menuRef;
148394 ¤   SInt16¤ ¤   menuLeft;
9082f7 };
82af5a
06800d struct MenuList {
670bd6 ¤   SInt16¤ lastMenu;
d67ba2 ¤   SInt16¤ lastRight;
9d597a ¤   SInt16¤ notUsed;
ffdd64 ¤   MenuRec¤menus[];
cd82f7 };
727c46 #pragma options align=reset
60af5a
1baf5a
959116 CmenuDrawMenuBarPatch::CmenuDrawMenuBarPatch(
454740 ¤   SGlobals & inGlobals)
26c13e ¤   ¤   : mGlobals(inGlobals)
92bb36 {
8c9c1a ¤   OSErr¤  err = noErr;
f3af5a
c6f4a1 ¤   mGlobals.menuH = ::GetMenu(MENU_PGPmenu);
8bf476 ¤   PGPThrowIfResFail_(mGlobals.menuH);
7f0ab3 ¤   ::DetachResource((Handle) mGlobals.menuH);
e967c5 ¤
9bbb80 ¤   Handle¤ tempHandle;
3f67c5 ¤
efc336 ¤   err = ::GetIconSuite(¤  &tempHandle,
39308b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ICNx_PGPmenu,
830ed6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   svAllSmallData);
065e5c ¤   PGPThrowIfOSErr_(err);
aa67c5 ¤
6cfe8f ¤   err = DuplicateIconSuite(¤  tempHandle,
d043d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mGlobals.menuIconH);
d75e5c ¤   PGPThrowIfOSErr_(err);
7e4986 ¤   ::DisposeIconSuite(tempHandle, true);
5e67c5 ¤
dd5a32 ¤   (**mGlobals.menuH).menuData[1] = 0x01;
fa08f6 ¤   *((Handle *) &(**mGlobals.menuH).menuData[2]) = mGlobals.menuIconH;
3567c5 ¤
287164 ¤   if (mGlobals.disableEncrypt || mGlobals.disableSign) {
f2fec0 ¤   ¤   if (mGlobals.disableEncrypt) {
fb98d1 ¤   ¤   ¤   ::DisableItem(¤ mGlobals.menuH,
b62917 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEncrypt);
1b0fe4 ¤   ¤   }
615540 ¤   ¤   if (mGlobals.disableSign) {
1198d1 ¤   ¤   ¤   ::DisableItem(¤ mGlobals.menuH,
86d642 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSign);
450fe4 ¤   ¤   }
ea10b7 ¤   ¤   ::DisableItem(¤ mGlobals.menuH,
3f4bdc ¤   ¤   ¤   ¤   ¤   ¤   kEncryptAndSign);
8af828 ¤   }¤
0867c5 ¤
b191bc ¤   if (mGlobals.disableDecrypt && mGlobals.disableVerify) {
--73fa 0015a43f9e740120120 Page 2 of CmenuDrawMenuBarPatch.cp
2710b7 ¤   ¤   ::DisableItem(¤ mGlobals.menuH,
e62e48 ¤   ¤   ¤   ¤   ¤   ¤   kDecryptVerify);
2d9371 ¤   }
eeefe6 }
7baf5a
6baf5a
cfaf5a
29f714 CmenuDrawMenuBarPatch::~CmenuDrawMenuBarPatch()
12bb36 {
8561dc ¤   if (mGlobals.menuH != nil) {
037ab5 ¤   ¤   ::DisposeHandle((Handle) mGlobals.menuH);
cc9371 ¤   }
1c057e ¤   if (mGlobals.menuIconH != nil) {
0c8d65 ¤   ¤   ::DisposeIconSuite(mGlobals.menuIconH, true);
e89371 ¤   }
f2efe6 }
ecaf5a
05af5a
bbaf5a
1e6d52 ¤   void
1f2588 CmenuDrawMenuBarPatch::NewDrawMenuBar()
fabb36 {
a15168 ¤   try {
b330ac ¤   ¤   Handle¤ ¤   ¤   menuList = ::LMGetMenuList();
fd02ad ¤   ¤   char¤   ¤   ¤   firstMenuChar = 0;
6c1b52 ¤   ¤
36f57b // Initialize the appleevents manager for the finder menu
3c4924 #if PGP_FINDERMENU
82e5f3 ¤   ¤   static Boolean¤ initialized = false;
371b52 ¤   ¤
2c0b61 ¤   ¤   if (! initialized) {
18986c ¤   ¤   ¤   UAppleEventsMgr::Initialize();
68830a ¤   ¤   ¤   initialized = true;
220fe4 ¤   ¤   }
607454 #endif
6d1b52 ¤   ¤
e75456 ¤   ¤   // Get the first character from the first menu
782dd6 ¤   ¤   if ((**(MenuList **) menuList).lastMenu != 0) {
30c262 ¤   ¤   ¤   MenuRef¤theMenu = (**(MenuList **) menuList).menus[0].menuRef;
0c87c7 ¤   ¤   ¤
67c6e2 ¤   ¤   ¤   firstMenuChar = (**theMenu).menuData[1];
200fe4 ¤   ¤   }
c71b52 ¤   ¤
199b96 ¤   ¤   // Only insert our menu if the apple menu exists
9215eb ¤   ¤   if (mGlobals.insertMenu && (firstMenuChar == appleMark)
cb24c2 ¤   ¤   && (::GetMenuHandle(MENU_PGPmenu) == nil)) {
9bfd0e ¤   ¤   ¤   ::InsertMenu(mGlobals.menuH, 0);
890fe4 ¤   ¤   }
eb9371 ¤   }
4367c5 ¤
6fe0a3 ¤   catch (...) {
929371 ¤   }
4f0a11 ¤   OldDrawMenuBar();
5aefe6 }
--b32b 001fbf7b56b40120121 Page 1 of CmenuDrawMenuBarPatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
aa08a2 ¤   $Id: CmenuDrawMenuBarPatch.h,v 1.1.20.1 1998/11/12 03:08:33 heller Exp $
c5f7f7 ____________________________________________________________________________*/
41af5a
ac8d55 #pragma once·
6aaf5a
0d7dac #include "PGPmenuGlobals.h"
d14db0 #include "CDrawMenuBarPatcher.h"
8daf5a
ce178e class CmenuDrawMenuBarPatch : public CDrawMenuBarPatcher {
a95ed4 public:
b80d61 ¤   ¤   ¤   ¤   ¤   CmenuDrawMenuBarPatch(SGlobals & inGlobals);
fe310d ¤   virtual¤¤   ¤   ~CmenuDrawMenuBarPatch();
b167c5 ¤
e6a2d3 protected:
092d60 ¤   SGlobals &¤ ¤   mGlobals;
cb67c5 ¤
06e037 ¤   virtual void¤   NewDrawMenuBar();
fb82f7 };
--3807 001cc90062d40120122 Page 1 of CmenuEventAvailPatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
7e1b1e ¤   $Id: CmenuEventAvailPatch.cp,v 1.1.2.1.2.1 1998/11/12 03:08:34 heller Exp $
fcf7f7 ____________________________________________________________________________*/
39af5a
e58562 #include "CCopyPasteHack.h"
14af5a
2ba0a4 #include "CmenuEventAvailPatch.h"
24af5a
42af5a
2caf5a
bc47d3 CmenuEventAvailPatch::CmenuEventAvailPatch()
bfbb36 {
73efe6 }
87af5a
20af5a
e3af5a
a8d37d CmenuEventAvailPatch::~CmenuEventAvailPatch()
18bb36 {
a4efe6 }
e8af5a
0aaf5a
9faf5a
d27e69 ¤   Boolean
4dcb40 CmenuEventAvailPatch::NewEventAvail(
78bfd8 ¤   EventMask¤  ¤   eventMask,
5a4f7e ¤   EventRecord *¤  theEvent)
6abb36 {
bd2db8 ¤   Boolean¤result = OldEventAvail(eventMask, theEvent);
5f67c5 ¤
5c5168 ¤   try {
7b589f ¤   ¤   if (CCopyPasteHack::GetCopyPasteHack() != nil) {
1909d4 ¤   ¤   ¤   CCopyPasteHack::GetCopyPasteHack()->EventAvail(theEvent);
0c0fe4 ¤   ¤   }
c29371 ¤   }
0867c5 ¤
dbe0a3 ¤   catch (...) {
cb9371 ¤   }
5467c5 ¤
785d73 ¤   return result;
ccefe6 }
--0cf9 0015e2110c640120123 Page 1 of CmenuEventAvailPatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
23cf19 ¤   $Id: CmenuEventAvailPatch.h,v 1.1.2.1.2.1 1998/11/12 03:08:35 heller Exp $
a1f7f7 ____________________________________________________________________________*/
93af5a
6b8d55 #pragma once·
baaf5a
9f002e #include "CEventAvailPatcher.h"
53af5a
9c3d83 class CmenuEventAvailPatch¤ :¤  public¤ CEventAvailPatcher {
cb5ed4 public:
5a53bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CmenuEventAvailPatch();
f5e574 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CmenuEventAvailPatch();
6caf5a
b2a2d3 protected:
5e0691 ¤   virtual Boolean¤¤   ¤   ¤   ¤   NewEventAvail(EventMask eventMask,
c13f99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord * theEvent);
5e82f7 };
--6968 001a625532a40120124 Page 1 of CmenuGetKeysPatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
05e6da ¤   $Id: CmenuGetKeysPatch.cp,v 1.2.20.1 1998/11/12 03:08:36 heller Exp $
b3f7f7 ____________________________________________________________________________*/
16af5a
e58562 #include "CCopyPasteHack.h"
5caf5a
a2a8da #include "CmenuGetKeysPatch.h"
b0af5a
2baf5a
5daf5a
20d002 CmenuGetKeysPatch::CmenuGetKeysPatch(
8aae73 ¤   SGlobals &¤ inGlobals)
0bc13e ¤   ¤   : mGlobals(inGlobals)
46bb36 {
52efe6 }
0aaf5a
f5af5a
ebaf5a
68e6a9 CmenuGetKeysPatch::~CmenuGetKeysPatch()
edbb36 {
34efe6 }
2eaf5a
adaf5a
ebaf5a
0e6d52 ¤   void
4fa8c7 CmenuGetKeysPatch::NewGetKeys(
b299f2 ¤   KeyMap¤ theKeys)
cdbb36 {
143f6b ¤   OldGetKeys(theKeys);
8167c5 ¤
4c5168 ¤   try {
64589f ¤   ¤   if (CCopyPasteHack::GetCopyPasteHack() != nil) {
60a6d1 ¤   ¤   ¤   CCopyPasteHack::GetCopyPasteHack()->GetKeys(theKeys);
900fe4 ¤   ¤   }
379371 ¤   }
8a67c5 ¤
b5e0a3 ¤   catch (...) {
0d9371 ¤   }
a6efe6 }
--868c 001469a628040120125 Page 1 of CmenuGetKeysPatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
40fd5b ¤   $Id: CmenuGetKeysPatch.h,v 1.1.20.1 1998/11/12 03:08:36 heller Exp $
04f7f7 ____________________________________________________________________________*/
deaf5a
7e8d55 #pragma once·
a3af5a
257dac #include "PGPmenuGlobals.h"
9cad84 #include "CGetKeysPatcher.h"
d4af5a
4ec8c2 class CmenuGetKeysPatch : public CGetKeysPatcher {
a85ed4 public:
320521 ¤   ¤   ¤   ¤   ¤   ¤   CmenuGetKeysPatch(SGlobals & inGlobals);
45974c ¤   virtual¤¤   ¤   ¤   ~CmenuGetKeysPatch();
2f67c5 ¤
64a2d3 protected:
5c9341 ¤   SGlobals &¤ ¤   ¤   mGlobals;
4967c5 ¤
ecaec3 ¤   virtual void¤   ¤   NewGetKeys(KeyMap theKeys);
46bf26 };¶
--2963 0001d955d8a40120126 Page 1 of CmenuGetResourcePatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
d82625 ¤   $Id: CmenuGetResourcePatch.cp,v 1.1.2.1.2.1 1998/11/12 03:08:37 heller Exp $
f8f7f7 ____________________________________________________________________________*/
caaf5a
0d3871 #include "CmenuGetResourcePatch.h"
dfaf5a
c7af5a
a9af5a
f9af5a
6f902e CmenuGetResourcePatch::CmenuGetResourcePatch(
aaae73 ¤   SGlobals &¤ inGlobals)
dec13e ¤   ¤   : mGlobals(inGlobals)
bfbb36 {
26efe6 }
4daf5a
81af5a
d9af5a
6a3b14 CmenuGetResourcePatch::~CmenuGetResourcePatch()
f4bb36 {
6cefe6 }
f5af5a
65af5a
10af5a
bf6692 ¤   Handle
dd58ec CmenuGetResourcePatch::NewGetResource(
70809f ¤   ResType¤theType,
c7be87 ¤   short¤  theID)
82bb36 {
2ed732 ¤   Handle¤ result = OldGetResource(theType, theID);
d367c5 ¤
d3ab47 ¤   if ((result != nil) && mGlobals.mungeDialogs) {
ebcc61 ¤   ¤   UInt16 *¤   thePosition = nil;
7f1b52 ¤   ¤
6355b5 ¤   ¤   switch (theType) {
b1bcd3 ¤   ¤   ¤   case 'ALRT':
81f776 ¤   ¤   ¤   {
1bcc7f ¤   ¤   ¤   ¤   thePosition = (UInt16 *) ((*result) + 12);
05a3a6 ¤   ¤   ¤   }
9dcdcb ¤   ¤   ¤   break;
2f87c7 ¤   ¤   ¤
af87c7 ¤   ¤   ¤
776228 ¤   ¤   ¤   case 'DLOG':
5ef776 ¤   ¤   ¤   {
a3c2ad ¤   ¤   ¤   ¤   Ptr¤tempPosition = (*result) + 20;
19c793 ¤   ¤   ¤   ¤   thePosition = (UInt16 *) (tempPosition + *tempPosition + 1
3ac205 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   + ((*tempPosition + 1) % 2));
eda3a6 ¤   ¤   ¤   }
fdcdcb ¤   ¤   ¤   break;
c70fe4 ¤   ¤   }
a1719a ¤   ¤   if (thePosition != nil) {
266274 ¤   ¤   ¤   switch (*thePosition) {
2658bf ¤   ¤   ¤   ¤   case kWindowCenterParentWindow:
2506da ¤   ¤   ¤   ¤   case kWindowCenterParentWindowScreen:
7c72c3 ¤   ¤   ¤   ¤   {
730961 ¤   ¤   ¤   ¤   ¤   *thePosition = kWindowCenterMainScreen;
ec2613 ¤   ¤   ¤   ¤   }
45f622 ¤   ¤   ¤   ¤   break;
542b85 ¤   ¤   ¤   ¤
f52b85 ¤   ¤   ¤   ¤
43b5b0 ¤   ¤   ¤   ¤   case kWindowAlertPositionParentWindow:
f26cc1 ¤   ¤   ¤   ¤   case kWindowAlertPositionParentWindowScreen:
2c72c3 ¤   ¤   ¤   ¤   {
e43c67 ¤   ¤   ¤   ¤   ¤   *thePosition = kWindowAlertPositionMainScreen;
212613 ¤   ¤   ¤   ¤   }
4ff622 ¤   ¤   ¤   ¤   break;
22af5a
1daf5a
--2602 001c962852c40120126 Page 2 of CmenuGetResourcePatch.cp
8dde13 ¤   ¤   ¤   ¤   case kWindowStaggerParentWindow:
9d0621 ¤   ¤   ¤   ¤   case kWindowStaggerParentWindowScreen:
e472c3 ¤   ¤   ¤   ¤   {
099dd0 ¤   ¤   ¤   ¤   ¤   *thePosition = kWindowStaggerMainScreen;
da2613 ¤   ¤   ¤   ¤   }
e8f622 ¤   ¤   ¤   ¤   break;
f7a3a6 ¤   ¤   ¤   }
203b90 ¤   ¤   }¤
0e9371 ¤   }
d967c5 ¤
ce5d73 ¤   return result;
c9efe6 }
--1763 00154c2d20940120127 Page 1 of CmenuGetResourcePatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
82a53a ¤   $Id: CmenuGetResourcePatch.h,v 1.1.2.1.2.1 1998/11/12 03:08:38 heller Exp $
6af7f7 ____________________________________________________________________________*/
9aaf5a
608d55 #pragma once·
0daf5a
b17dac #include "PGPmenuGlobals.h"
60568d #include "CGetResourcePatcher.h"
5baf5a
f33247 class CmenuGetResourcePatch¤:¤  public¤ CGetResourcePatcher {
365ed4 public:
551857 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CmenuGetResourcePatch(SGlobals & inGlobals);
c5931f ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CmenuGetResourcePatch();
7faf5a
93a2d3 protected:
2b9d25 ¤   SGlobals &¤ ¤   ¤   ¤   ¤   ¤   mGlobals;
ea67c5 ¤
38bb08 ¤   virtual Handle¤ ¤   ¤   ¤   ¤   NewGetResource(ResType theType,
220de4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short theID);
5482f7 };
--5108 00113c5628240120128 Page 1 of CmenuInsertMenuPatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
3855ff ¤   $Id: CmenuInsertMenuPatch.cp,v 1.2.20.1 1998/11/12 03:08:38 heller Exp $
52f7f7 ____________________________________________________________________________*/
bdaf5a
6b54bd #include "CmenuInsertMenuPatch.h"
efaf5a
1daf5a
b0af5a
2a26c2 CmenuInsertMenuPatch::CmenuInsertMenuPatch(
8bae73 ¤   SGlobals &¤ inGlobals)
4e486a ¤   : mGlobals(inGlobals)
d8bb36 {
62efe6 }
18af5a
90af5a
84af5a
f3e1f7 CmenuInsertMenuPatch::~CmenuInsertMenuPatch()
6bbb36 {
b3efe6 }
1067c5 ¤
15af5a
47af5a
a96d52 ¤   void
ae98c4 CmenuInsertMenuPatch::NewInsertMenu(
f281c9 ¤   MenuRef¤theMenu,
94c27f ¤   short¤  beforeID)
43bb36 {
175168 ¤   try {
51e78b ¤   ¤   // Keep us at the end
54b225 ¤   ¤   if ((::GetMenuHandle(MENU_PGPmenu) != nil) && (beforeID >= 0)
86bb04 ¤   ¤   && (::GetMenuHandle(beforeID) == nil)) {
e77d66 ¤   ¤   ¤   beforeID = MENU_PGPmenu;
970fe4 ¤   ¤   }
ebaf5a
c0c033 ¤   ¤   // Note that we have been called so that the next DrawMenuBar will
7c225d ¤   ¤   // insert our menu
d2cb6f ¤   ¤   mGlobals.insertMenu = true;
609371 ¤   }
d767c5 ¤
10e0a3 ¤   catch (...) {
ae9371 ¤   }
0567c5 ¤
6e148a ¤   OldInsertMenu(¤ theMenu,
465fbe ¤   ¤   ¤   ¤   ¤   beforeID);
13efe6 }
--2062 001ac04e19f40120129 Page 1 of CmenuInsertMenuPatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
3f2336 ¤   $Id: CmenuInsertMenuPatch.h,v 1.1.20.1 1998/11/12 03:08:39 heller Exp $
a7f7f7 ____________________________________________________________________________*/
46af5a
298d55 #pragma once·
26af5a
d73075 #include "PGPMenuGlobals.h"
69f30c #include "CInsertMenuPatcher.h"
80af5a
5a7a5d class CmenuInsertMenuPatch : public CInsertMenuPatcher {
2b5ed4 public:
370cef ¤   ¤   ¤   ¤   ¤   CmenuInsertMenuPatch(SGlobals & inGlobals);
2d2982 ¤   virtual¤¤   ¤   ~CmenuInsertMenuPatch();
8367c5 ¤
fda2d3 protected:
602d60 ¤   SGlobals &¤ ¤   mGlobals;
cd67c5 ¤
70a01c ¤   virtual void¤   NewInsertMenu(MenuRef theMenu, short beforeID);
ac82f7 };
--053e 0000d35cfa84012012a Page 1 of CmenuMenuSelectPatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
5f73b1 ¤   $Id: CmenuMenuSelectPatch.cp,v 1.13.2.1.2.1 1998/11/12 03:08:40 heller Exp $
77f7f7 ____________________________________________________________________________*/
a9af5a
77740c #include <UAppleEventsMgr.h>
1b1cb2 #include <UExtractFromAEDesc.h>
09af5a
1f3a2c #include "WarningAlert.h"
7d8c8c #include "MacDesktop.h"
8974e2 #include "MacProcesses.h"
f7bbf4 #include "MacFiles.h"
f11ef8 #include "SignatureStatusMessage.h"
b585c2 #include "MacStrings.h"
7876b7 #include "MacErrors.h"
cdaf5a
1daa64 #include "StSaveCurResFile.h"
646080 #include "StSaveHeapZone.h"
92464b #include "StSuspendAESpecialHandler.h"
fc45d2 #include "CPGPEncoderDecoder.h"
2c8562 #include "CCopyPasteHack.h"
c3af5a
327673 #include "CPGPmenu.h"
fb0bb4 #include "CString.h"
47b4ad #include "CmenuWaitNextEventPatch.h"
3f0864 #include "CmenuMenuSelectPatch.h"
b1af5a
e20942 const OSType¤   ¤   kPGPkeysType¤   ¤   ¤   ¤   =¤  'APPL';
38d631 const OSType¤   ¤   kPGPkeysCreator¤¤   ¤   ¤   =¤  'pgpK';
c0ae87 const OSType¤   ¤   kPGPtoolsType¤  ¤   ¤   ¤   =¤  'APPL';
2b7737 const OSType¤   ¤   kPGPtoolsCreator¤   ¤   ¤   =¤  'pgpM';
33af5a
d0694c const AEEventClass¤ kAEPGPMenuClass¤¤   ¤   ¤   =¤  'Menu';
670104 const AEEventID¤¤   kAEMenuOpenApp¤ ¤   ¤   ¤   =¤  'OApp';
0e252f const AEEventID¤¤   kAESignID¤  ¤   ¤   ¤   ¤   =¤  'Sign';
4aa545 const AEEventID¤¤   kAEEncryptID¤   ¤   ¤   ¤   =¤  'Encr';
91746f const AEEventID¤¤   kAEEncryptAndSignID¤¤   ¤   =¤  'EnSi';
8f695c const AEEventID¤¤   kAEDecryptVerifyID¤ ¤   ¤   =¤  'DeVe';
584ed6 const AEEventID¤¤   kAEOptionSignID¤¤   ¤   ¤   =¤  'OSig';
9fa39d const AEEventID¤¤   kAEOptionEncryptID¤ ¤   ¤   =¤  'OEnc';
711f61 const AEEventID¤¤   kAEOptionEncryptAndSignID¤  =¤  'OEnS';
8a6723 const AEEventID¤¤   kAEOptionDecryptVerifyID¤   =¤  'ODeV';
436b1c const AEEventID¤¤   kAEWipeID¤  ¤   ¤   ¤   ¤   =¤  'Wipe';
c8af5a
44fc0d const DescType¤ ¤   cFolder¤¤   ¤   ¤   ¤   ¤   =¤  'cfol';
69ad59 const DescType¤ ¤   pTrash¤ ¤   ¤   ¤   ¤   ¤   =¤  'trsh';
dfaf5a
a5af5a
6aaf5a
71af5a
a5b24e CmenuMenuSelectPatch::CmenuMenuSelectPatch(
92ae73 ¤   SGlobals &¤ inGlobals)
8af29f ¤   ¤   : mGlobals(inGlobals), mWorkingCount(0)
6fbb36 {
c8efe6 }
50af5a
c2af5a
abaf5a
fc6651 CmenuMenuSelectPatch::~CmenuMenuSelectPatch()
b0bb36 {
68efe6 }
67af5a
b7af5a
2eaf5a
d833d7 ¤   long
01d070 CmenuMenuSelectPatch::NewMenuSelect(
cdcc7f ¤   Point¤  startPt)
0dbb36 {
--de61 00051799b9c4012012a Page 2 of CmenuMenuSelectPatch.cp
5098de ¤   SInt32¤ ¤   ¤   ¤   result = 0;
c8af5a
ca5168 ¤   try {
224924 #if PGP_FINDERMENU
089241 ¤   ¤   if (mWorkingCount == 0) {
d827c8 ¤   ¤   ¤   StSaveHeapZone¤ ¤   savedZone(::SystemZone());
9e7015 ¤   ¤   ¤   StSaveCurResFile¤   saveResFile;
f28d34 ¤   ¤   ¤   LFile¤  ¤   ¤   ¤   thePlugFile(mGlobals.plugSpec);
08ae30 ¤   ¤   ¤   ¤   ¤
05b7ee ¤   ¤   ¤   thePlugFile.OpenResourceFork(fsRdPerm);
5585b9 ¤   ¤   ¤   AdjustMenuItems();
f63ded ¤   ¤   ¤   thePlugFile.CloseResourceFork();
430fe4 ¤   ¤   }
377454 #endif
ecaf5a
dd7186 ¤   ¤   if (mGlobals.disableEncrypt || mGlobals.disableSign) {
5ff08c ¤   ¤   ¤   if (mGlobals.disableEncrypt) {
d18081 ¤   ¤   ¤   ¤   ::DisableItem(¤ mGlobals.menuH,
55275b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEncrypt);
8ca3a6 ¤   ¤   ¤   }
d49015 ¤   ¤   ¤   if (mGlobals.disableSign) {
d78081 ¤   ¤   ¤   ¤   ::DisableItem(¤ mGlobals.menuH,
081317 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSign);
71a3a6 ¤   ¤   ¤   }
3b98d1 ¤   ¤   ¤   ::DisableItem(¤ mGlobals.menuH,
b77219 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEncryptAndSign);
163b90 ¤   ¤   }¤
231b52 ¤   ¤
0b4b95 ¤   ¤   if (mGlobals.disableDecrypt && mGlobals.disableVerify) {
0f98d1 ¤   ¤   ¤   ::DisableItem(¤ mGlobals.menuH,
a428f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDecryptVerify);
670fe4 ¤   ¤   }
679371 ¤   }
e467c5 ¤
6fe0a3 ¤   catch (...) {
919371 ¤   }
9e67c5 ¤
279f26 ¤   result = OldMenuSelect(startPt);
bd67c5 ¤
42236d ¤   if (HiWord(result) == MENU_PGPmenu) {
fc89df ¤   ¤   StMungeDialogs munge(&mGlobals);
5c1b52 ¤   ¤
c3aef9 ¤   ¤   // Semaphore to prevent finder from crashing
13d9be ¤   ¤   mWorkingCount++;
dd1b52 ¤   ¤
40fd2a ¤   ¤   try {
5827c8 ¤   ¤   ¤   StSaveHeapZone¤ ¤   savedZone(::SystemZone());
9b7015 ¤   ¤   ¤   StSaveCurResFile¤   saveResFile;
dc8d34 ¤   ¤   ¤   LFile¤  ¤   ¤   ¤   thePlugFile(mGlobals.plugSpec);
34af5a
beb7ee ¤   ¤   ¤   thePlugFile.OpenResourceFork(fsRdPerm);
3bd02d ¤   ¤   ¤   result = PGPmenuFilter(result);
0d3ded ¤   ¤   ¤   thePlugFile.CloseResourceFork();
1f0fe4 ¤   ¤   }
971b52 ¤   ¤
fbda39 ¤   ¤   catch (...) {
830fe4 ¤   ¤   }
45af5a
7b44fd ¤   ¤   mWorkingCount--;
969371 ¤   }
505d73 ¤   return result;
d7efe6 }
e9af5a
07af5a
e8af5a
97959b ¤   SInt32
571af7 CmenuMenuSelectPatch::PGPmenuFilter(
b7784e ¤   SInt32¤ inSelection)
63bb36 {
565168 ¤   try {
dc0b99 ¤   ¤   switch (LoWord(inSelection)) {
514924 #if PGP_FINDERMENU
--949e 0004b3ff0854012012a Page 3 of CmenuMenuSelectPatch.cp
4ea987 ¤   ¤   ¤   case kSign:
fa7e8d ¤   ¤   ¤   case kEncrypt:
6b9e0e ¤   ¤   ¤   case kEncryptAndSign:
b022e3 ¤   ¤   ¤   case kDecryptVerify:
ef040d ¤   ¤   ¤   case kWipe:
8cf776 ¤   ¤   ¤   {
9d0ede ¤   ¤   ¤   ¤   SendToolsEvent(LoWord(inSelection));
42a3a6 ¤   ¤   ¤   }
79cdcb ¤   ¤   ¤   break;
aadb21 #else
daa987 ¤   ¤   ¤   case kSign:
637e8d ¤   ¤   ¤   case kEncrypt:
dd9e0e ¤   ¤   ¤   case kEncryptAndSign:
b4f776 ¤   ¤   ¤   {
8a83b0 ¤   ¤   ¤   ¤   EEncodeOptions¤ options;
af2b85 ¤   ¤   ¤   ¤
04944d ¤   ¤   ¤   ¤   switch (LoWord(inSelection)) {
14f2bc ¤   ¤   ¤   ¤   ¤   case kSign:
694859 ¤   ¤   ¤   ¤   ¤   {
e91d89 ¤   ¤   ¤   ¤   ¤   ¤   options = encodeOptions_Sign;
981c89 ¤   ¤   ¤   ¤   ¤   }
ee14c3 ¤   ¤   ¤   ¤   ¤   break;
60ae30 ¤   ¤   ¤   ¤   ¤
28ae30 ¤   ¤   ¤   ¤   ¤
86e6da ¤   ¤   ¤   ¤   ¤   case kEncrypt:
9b4859 ¤   ¤   ¤   ¤   ¤   {
e42104 ¤   ¤   ¤   ¤   ¤   ¤   options = encodeOptions_Encrypt;
0f1c89 ¤   ¤   ¤   ¤   ¤   }
3e14c3 ¤   ¤   ¤   ¤   ¤   break;
a4ae30 ¤   ¤   ¤   ¤   ¤
39ae30 ¤   ¤   ¤   ¤   ¤
814d93 ¤   ¤   ¤   ¤   ¤   case kEncryptAndSign:
4d4859 ¤   ¤   ¤   ¤   ¤   {
ad40cd ¤   ¤   ¤   ¤   ¤   ¤   options = encodeOptions_Sign
219421 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   | encodeOptions_Encrypt;
951c89 ¤   ¤   ¤   ¤   ¤   }
1e14c3 ¤   ¤   ¤   ¤   ¤   break;
b82613 ¤   ¤   ¤   ¤   }
ab0acc ¤   ¤   ¤   ¤   Encode(options);
e1a3a6 ¤   ¤   ¤   }
12cdcb ¤   ¤   ¤   break;
b787c7 ¤   ¤   ¤
1987c7 ¤   ¤   ¤
5d5b77 ¤   ¤   ¤   // Check to see if it is the Finder and then decode a file or
7a9449 ¤   ¤   ¤   // text appropriately
bc22e3 ¤   ¤   ¤   case kDecryptVerify:
7ff776 ¤   ¤   ¤   {
54aad9 ¤   ¤   ¤   ¤   Decode();
50a3a6 ¤   ¤   ¤   }
c5cdcb ¤   ¤   ¤   break;
4f9009 #endif¤ ¤   ¤   ¤
5387c7 ¤   ¤   ¤
11a382 ¤   ¤   ¤   // Bring keys to the front
004603 ¤   ¤   ¤   case kPGPkeys:
01f776 ¤   ¤   ¤   {
1cc168 ¤   ¤   ¤   ¤   if (BringAppToFront(kPGPkeysType, kPGPkeysCreator,
ebcb83 ¤   ¤   ¤   ¤   kFindAppOnAllVolumes, true, nil, nil) != noErr) {
6611bf ¤   ¤   ¤   ¤   ¤   WarningAlert(¤  kWAStopAlertType,
ed0c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
9f475c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
a902ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeysNotFoundID);
c22613 ¤   ¤   ¤   ¤   }
d1a3a6 ¤   ¤   ¤   }
80cdcb ¤   ¤   ¤   break;
2caf5a
b9af5a
4fb1d7 ¤   ¤   ¤   // Bring tools to the front
e0cafe ¤   ¤   ¤   case kPGPtools:
22f776 ¤   ¤   ¤   {
0e0be5 ¤   ¤   ¤   ¤   if (BringAppToFront(kPGPtoolsType, kPGPtoolsCreator,
05cb83 ¤   ¤   ¤   ¤   kFindAppOnAllVolumes, true, nil, nil) != noErr) {
4b11bf ¤   ¤   ¤   ¤   ¤   WarningAlert(¤  kWAStopAlertType,
--e70c 000fe0e00934012012a Page 4 of CmenuMenuSelectPatch.cp
620c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
c1475c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
5b02ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeysNotFoundID);
352613 ¤   ¤   ¤   ¤   }
82a3a6 ¤   ¤   ¤   }
0acdcb ¤   ¤   ¤   break;
710fe4 ¤   ¤   }
e99371 ¤   }
2867c5 ¤
3aca6f ¤   catch (CComboError & comboError) {
8b2d3f #if ! PGP_FINDERMENU
3c5edb ¤   ¤   delete CCopyPasteHack::GetCopyPasteHack();
89adc1 ¤   ¤   if (! comboError.IsCancelError()) {
eac452 ¤   ¤   ¤   if (comboError.HavePGPError()) {
43360d ¤   ¤   ¤   ¤   CPGPmenuPlug::ShowError(comboError.pgpErr);
2a042d ¤   ¤   ¤   } else {
a2b9e0 ¤   ¤   ¤   ¤   CPGPmenuPlug::ShowError(MacErrorToPGPError(comboError.err));
71a3a6 ¤   ¤   ¤   }
510fe4 ¤   ¤   }
147454 #endif
909371 ¤   }
82af5a
907e82 ¤   catch(...) {
f82d3f #if ! PGP_FINDERMENU
bd5edb ¤   ¤   delete CCopyPasteHack::GetCopyPasteHack();
f420de ¤   ¤   CPGPmenuPlug::ShowError(kPGPError_UnknownError);
687454 #endif
d19371 ¤   }
a167c5 ¤
dd3e6b ¤   return 0;
bfefe6 }
10af5a
12af5a
ebaf5a
756d52 ¤   void
c9fafe CmenuMenuSelectPatch::SendToolsEvent(
2e7032 ¤   SInt16¤ inSelection)
1cbb36 {
59615d ¤   StAEDescriptor¤ theEvent;
820183 ¤   AEEventID¤  ¤   theEventID;
e87cbf ¤   OSErr¤  ¤   ¤   err;
ed67c5 ¤
98f7e8 ¤   switch (inSelection) {
a8d373 ¤   ¤   case kSign:
fc5b34 ¤   ¤   {
ad55fa ¤   ¤   ¤   if (mOptionDown) {
01e071 ¤   ¤   ¤   ¤   theEventID = kAEOptionSignID;
3f042d ¤   ¤   ¤   } else {
9fe8e4 ¤   ¤   ¤   ¤   theEventID = kAESignID;
90a3a6 ¤   ¤   ¤   }
6e0fe4 ¤   ¤   }
082f68 ¤   ¤   break;
c21b52 ¤   ¤
b41b52 ¤   ¤
ba9c6c ¤   ¤   case kEncrypt:
6e5b34 ¤   ¤   {
6455fa ¤   ¤   ¤   if (mOptionDown) {
532d70 ¤   ¤   ¤   ¤   theEventID = kAEOptionEncryptID;
4c042d ¤   ¤   ¤   } else {
445374 ¤   ¤   ¤   ¤   theEventID = kAEEncryptID;
a9a3a6 ¤   ¤   ¤   }
a50fe4 ¤   ¤   }
362f68 ¤   ¤   break;
d81b52 ¤   ¤
111b52 ¤   ¤
30a906 ¤   ¤   case kEncryptAndSign:
4e5b34 ¤   ¤   {
a555fa ¤   ¤   ¤   if (mOptionDown) {
7a549a ¤   ¤   ¤   ¤   theEventID = kAEOptionEncryptAndSignID;
e4042d ¤   ¤   ¤   } else {
88c74f ¤   ¤   ¤   ¤   theEventID = kAEEncryptAndSignID;
fea3a6 ¤   ¤   ¤   }
--6856 0009b9bbbd14012012a Page 5 of CmenuMenuSelectPatch.cp
b50fe4 ¤   ¤   }
892f68 ¤   ¤   break;
221b52 ¤   ¤
211b52 ¤   ¤
5299b5 ¤   ¤   case kDecryptVerify:
255b34 ¤   ¤   {
1355fa ¤   ¤   ¤   if (mOptionDown) {
57af12 ¤   ¤   ¤   ¤   theEventID = kAEOptionDecryptVerifyID;
8f042d ¤   ¤   ¤   } else {
88cbf5 ¤   ¤   ¤   ¤   theEventID = kAEDecryptVerifyID;
6aa3a6 ¤   ¤   ¤   }
360fe4 ¤   ¤   }
652f68 ¤   ¤   break;
fc1b52 ¤   ¤
e81b52 ¤   ¤
447ef9 ¤   ¤   case kWipe:
7f5b34 ¤   ¤   {
4522e2 ¤   ¤   ¤   theEventID = kAEWipeID;
a20fe4 ¤   ¤   }
982f68 ¤   ¤   break;
5d1b52 ¤   ¤
001b52 ¤   ¤
d89ae3 ¤   ¤   default:
c45b34 ¤   ¤   {
160ecc ¤   ¤   ¤   return;
7d0fe4 ¤   ¤   }
4a2f68 ¤   ¤   break;
a69371 ¤   }
ac67c5 ¤
1baf5a
dcaf5a
23ff7e ¤   // Bring tools to the front
49bfe4 ¤   AppParameters¤  params;
7c67c5 ¤
e03144 ¤   params.theMsgEvent.what = kHighLevelEvent;
d467cd ¤   params.theMsgEvent.message = kAEPGPMenuClass;
dffb18 ¤   params.theMsgEvent.where = *(Point *) & kAEMenuOpenApp;
38c528 ¤   params.theMsgEvent.when = params.theMsgEvent.modifiers = 0;
410fed ¤   params.eventRefCon = 0;
0e1869 ¤   params.messageLength = 0;
74db33 ¤   err = BringAppToFront(¤ kPGPtoolsType,
4063f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPtoolsCreator,
78d6fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   kFindAppOnAllVolumes,
900dec ¤   ¤   ¤   ¤   ¤   ¤   ¤   true,
222820 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &params,
a9d470 ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil);
b5637e ¤   if (err != noErr) {
abc945 ¤   ¤   WarningAlert(¤  kWAStopAlertType,
c0597c ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
510d49 ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
3c82de ¤   ¤   ¤   ¤   ¤   ¤   kToolsNotFoundID);
489371 ¤   }
dc5e5c ¤   PGPThrowIfOSErr_(err);
e0af5a
a8361e ¤   // Send the event
a5e4ba ¤   ProcessSerialNumber¤toolsPSN;
16d5a9 ¤   StAEDescriptor¤ ¤   theAddress;
b3af5a
4bcf15 ¤   PGPThrowIfNot_(FindProcess(¤kPGPtoolsType,
cc2ccc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPtoolsCreator,
a08abb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &toolsPSN,
408e22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
eb8e22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
7602ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil));
cdfba3 ¤   err = ::AECreateDesc(¤  typeProcessSerialNumber,
8ac72e ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr) &toolsPSN,
ce6a34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(toolsPSN),
9b0c98 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theAddress);
a15e5c ¤   PGPThrowIfOSErr_(err);
0a1bf7 ¤   err = ::AECreateAppleEvent(¤kAEPGPMenuClass,
5a8882 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theEventID,
9b2e12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theAddress,
--77ce 0002e87c5d64012012a Page 6 of CmenuMenuSelectPatch.cp
889e2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAutoGenerateReturnID,
066cfe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAnyTransactionID,
3bd833 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theEvent);
c55e5c ¤   PGPThrowIfOSErr_(err);
4667c5 ¤
4e2d93 ¤   UAppleEventsMgr::SendAppleEvent(theEvent);
82efe6 }
2aaf5a
dbaf5a
1aaf5a
806d52 ¤   void
424419 CmenuMenuSelectPatch::Encode(
945fe4 ¤   EEncodeOptions¤ inOptions)
52bb36 {
f23a99 ¤   inOptions |= encodeOptions_TreatInputAsText;
294804 ¤   if (inOptions & encodeOptions_Encrypt) {
6ac025 ¤   ¤   inOptions |= encodeOptions_TextOutput;
b4f037 ¤   } else {
d9c3e2 ¤   ¤   inOptions |= encodeOptions_ClearSign;
c69371 ¤   }
c7af5a
79f0fe ¤   new CCopyPasteHack(mGlobals, encodeDecode_Encode, inOptions);
23efe6 }
a2af5a
ddaf5a
23af5a
e56d52 ¤   void
a3c194 CmenuMenuSelectPatch::Decode()
60bb36 {
2b15c4 ¤   new CCopyPasteHack(mGlobals, encodeDecode_Decode);
47efe6 }
fa67c5 ¤
8baf5a
c3af5a
3b8fcc /*¤ SInt32
c6de46 CmenuMenuSelectPatch::CountFinderSelection(
359549 ¤   DescType¤   inObjectType)
9ebb36 {
667a75 ¤   StSuspendAESpecialHandler¤  theSuspendedHandler(keyPreDispatch);
252431 ¤   AppleEvent¤ ¤   ¤   ¤   ¤   theCountSelectionEvent = {typeNull, nil};
b447e6 ¤   AppleEvent¤ ¤   ¤   ¤   ¤   theReply = {typeNull, nil};
cbda44 ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   result = 0;
d62b85 ¤   ¤   ¤   ¤
795168 ¤   try {
6abdef ¤   ¤   OSErr¤  ¤   err = noErr;
d3af5a
cbaff8 ¤   ¤   // Create the AppleEvent
d47267 ¤   ¤   UAppleEventsMgr::MakeAppleEvent(¤   kAECoreSuite,
9cc4bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAECountElements,
024212 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theCountSelectionEvent);
3d3ede ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
7dca7d ¤   ¤   // Create the specifier
33b63b ¤   ¤   StAEDescriptor¤ nullDescriptor;
562d18 ¤   ¤   StAEDescriptor¤ selectionProperty((DescType) pUserSelection);
bcdf7d ¤   ¤   StAEDescriptor¤ selectionSpec;
b11b52 ¤   ¤
ef2979 ¤   ¤   err = ::CreateObjSpecifier(¤cProperty,
5d06c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nullDescriptor,
e91894 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
059f52 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionProperty,
9c81a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
5af0d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionSpec);
844a74 ¤   ¤   PGPThrowIfOSErr_(err);
26af5a
74e015 ¤   ¤   // Add the direct object to the appleevent
9cbbb8 ¤   ¤   err = ::AEPutParamDesc(¤&theCountSelectionEvent,
2bca92 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyDirectObject,
c46697 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionSpec);
a74a74 ¤   ¤   PGPThrowIfOSErr_(err);
551b52 ¤   ¤
42bc24 ¤   ¤   StAEDescriptor¤ objectType((DescType) inObjectType);
2e1b52 ¤   ¤
--ee4e 000f758f0474012012a Page 7 of CmenuMenuSelectPatch.cp
40bbb8 ¤   ¤   err = ::AEPutParamDesc(¤&theCountSelectionEvent,
fa8c52 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyAEObjectClass,
1f143a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   objectType);
9b4a74 ¤   ¤   PGPThrowIfOSErr_(err);
581b52 ¤   ¤
05f929 ¤   ¤   UAppleEventsMgr::SendAppleEventWithReply(¤  theCountSelectionEvent,
2cc10a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theReply,
d3490d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false);¤¤   ¤   ¤   ¤   ¤
b29011 ¤   ¤   ::AEDisposeDesc(&theCountSelectionEvent);
ddc938 ¤   ¤   theCountSelectionEvent.descriptorType = typeNull;
2e1b52 ¤   ¤
f91544 ¤   ¤   // Check for errors
63c80a ¤   ¤   StAEDescriptor¤ errorCode(theReply, keyErrorNumber);
351b52 ¤   ¤
7fb15e ¤   ¤   if (errorCode.mDesc.descriptorType != typeNull) {
c3e131 ¤   ¤   ¤   UExtractFromAEDesc::TheInt16(errorCode, err);
9a87c7 ¤   ¤   ¤
98c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
f10fe4 ¤   ¤   }
801b52 ¤   ¤
8dba27 ¤   ¤   StAEDescriptor¤ theCount(theReply, keyDirectObject);
875545 ¤   ¤   UExtractFromAEDesc::TheInt32(theCount, result);
571b52 ¤   ¤
2399b3 ¤   ¤   // Check for missing parms and dispose of the reply
3310fe ¤   ¤   UAppleEventsMgr::CheckForMissedParams(theReply);
df9740 ¤   ¤   ::AEDisposeDesc(&theReply);
889371 ¤   }
3767c5 ¤
ede0a3 ¤   catch (...) {
bf5af8 ¤   ¤   if (theCountSelectionEvent.descriptorType != typeNull) {
b73e10 ¤   ¤   ¤   ::AEDisposeDesc(&theCountSelectionEvent);
680fe4 ¤   ¤   }
8007eb ¤   ¤   if (theReply.descriptorType != typeNull) {
bc5215 ¤   ¤   ¤   ::AEDisposeDesc(&theReply);
650fe4 ¤   ¤   }
fa9371 ¤   }
1967c5 ¤
ee5d73 ¤   return result;
e2efe6 }
957fe0 */
e1af5a
e6af5a
d0af5a
476d52 ¤   void
ff66c2 CmenuMenuSelectPatch::AdjustMenuItems()
d9bb36 {
f2de0b ¤   if (CmenuWaitNextEventPatch::GetEventParamsPtr()->theEvent->modifiers
8a4cc3 ¤   & optionKey) {
833022 ¤   ¤   mOptionDown = true;
25c4b2 /*¤ ¤   ::SetMenuItemText(¤ mGlobals.menuH,
a49168 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSign,
00ff2b ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Strings, kSignAsID));
5eb19e ¤   ¤   ::SetMenuItemText(¤ mGlobals.menuH,
2f0b10 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEncrypt,
f6d1fa ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Strings, kEncryptAsID));
32b19e ¤   ¤   ::SetMenuItemText(¤ mGlobals.menuH,
5ec8d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEncryptAndSign,
824598 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Strings, kEncryptAndSignAsID));
4bb19e ¤   ¤   ::SetMenuItemText(¤ mGlobals.menuH,
c4e401 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDecryptVerify,
944a35 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Strings, kDecryptVerifyAsID));
054229 */¤ } else {
1f3058 ¤   ¤   mOptionDown = false;
edb19e ¤   ¤   ::SetMenuItemText(¤ mGlobals.menuH,
c19168 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSign,
0677d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Strings, kSignID));
d4b19e ¤   ¤   ::SetMenuItemText(¤ mGlobals.menuH,
790b10 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEncrypt,
13d29d ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Strings, kEncryptID));
50b19e ¤   ¤   ::SetMenuItemText(¤ mGlobals.menuH,
a8c8d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEncryptAndSign,
f72cb1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Strings, kEncryptAndSignID));
--2436 000a1a2287d4012012a Page 8 of CmenuMenuSelectPatch.cp
1bb19e ¤   ¤   ::SetMenuItemText(¤ mGlobals.menuH,
0ce401 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDecryptVerify,
484652 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Strings, kDecryptVerifyID));
849371 ¤   }
e367c5 ¤
0ad564 ¤   Boolean¤trashSelected;
b32b14 ¤   Boolean¤enableItems = CheckFinderSelection(&trashSelected);
b567c5 ¤
486f65 ¤   if ((enableItems) && (! trashSelected)) {
112a8c ¤   ¤   ::EnableItem(mGlobals.menuH, kSign);
06e63e ¤   ¤   ::EnableItem(mGlobals.menuH, kEncrypt);
ad6a59 ¤   ¤   ::EnableItem(mGlobals.menuH, kEncryptAndSign);
f5a968 ¤   ¤   ::EnableItem(mGlobals.menuH, kDecryptVerify);
0ef037 ¤   } else {
310aea ¤   ¤   ::DisableItem(mGlobals.menuH, kSign);
931699 ¤   ¤   ::DisableItem(mGlobals.menuH, kEncrypt);
40887c ¤   ¤   ::DisableItem(mGlobals.menuH, kEncryptAndSign);
7daadd ¤   ¤   ::DisableItem(mGlobals.menuH, kDecryptVerify);
129371 ¤   }
d21b52 ¤   ¤
aae751 ¤   if (enableItems) {
e10173 ¤   ¤   ::EnableItem(mGlobals.menuH, kWipe);
a0f037 ¤   } else {
e62115 ¤   ¤   ::DisableItem(mGlobals.menuH, kWipe);
479371 ¤   }
4defe6 }
e1af5a
85af5a
71af5a
7e4769 Boolean
c640eb CmenuMenuSelectPatch::CheckFinderSelection(
59a056 ¤   Boolean *¤  outTrashSelected)
72bb36 {
987a75 ¤   StSuspendAESpecialHandler¤  theSuspendedHandler(keyPreDispatch);
5a8b12 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   result = true;
2067c5 ¤
762ae4 ¤   *outTrashSelected = false;
3267c5 ¤
a65168 ¤   try {
57464c ¤   ¤   StAEDescriptor¤ ¤   theReply;
c053e6 ¤   ¤   OSErr¤  ¤   ¤   ¤   err = noErr;
20af5a
529288 ¤   ¤   // Send the appleevent
4f5b34 ¤   ¤   {
c68ade ¤   ¤   ¤   StAEDescriptor¤ ¤   theGetSelectionEvent;
d7989a ¤   ¤   ¤   StAEDescriptor¤ ¤   theAddress;
5aaf5a
949290 ¤   ¤   ¤   // Create the AppleEvent
2f9067 ¤   ¤   ¤   UAppleEventsMgr::MakeAppleEvent(¤   kAECoreSuite,
d2450f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAEGetData,
40ce3c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theGetSelectionEvent);
b9af5a
4e4181 ¤   ¤   ¤   // Create the specifier
ed3e5d ¤   ¤   ¤   StAEDescriptor¤ nullDescriptor;
c89cfc ¤   ¤   ¤   StAEDescriptor¤ selectionProperty( (DescType) pUserSelection );
92d131 ¤   ¤   ¤   StAEDescriptor¤ selectionSpec;
b387c7 ¤   ¤   ¤
05f1cb ¤   ¤   ¤   err = ::CreateObjSpecifier(¤cProperty,
ef5368 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nullDescriptor,
ed4d38 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formPropertyID,
059869 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionProperty,
d01039 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
54a57a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionSpec);
b3c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
6aaf5a
8f146a /*¤ ¤   ¤   UInt32¤ ¤   ¤   allOrdinal = kAEAll;
b92c71 ¤   ¤   ¤   StAEDescriptor¤ position(¤  typeAbsoluteOrdinal,
ff17a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &allOrdinal,
d83024 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(allOrdinal));
4ed457 ¤   ¤   ¤   StAEDescriptor¤ foldersSpec;
9eaf5a
a13762 ¤   ¤   ¤   err = ::CreateObjSpecifier(¤cFolder,
--3b5d 000c5116aa74012012a Page 9 of CmenuMenuSelectPatch.cp
a92e18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionSpec,
ede9d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   formAbsolutePosition,
6cbee1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   position,
851039 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
5a94a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   foldersSpec);
31c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
997fe0 */
b8f132 ¤   ¤   ¤   // Add the direct object to the appleevent
1e67bf ¤   ¤   ¤   err = ::AEPutParamDesc(¤theGetSelectionEvent,
279989 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyDirectObject,
3d0b74 //¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   foldersSpec);
95f0d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectionSpec);
b2c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
7387c7 ¤   ¤   ¤
15cc3e ¤   ¤   ¤   StAEDescriptor¤ asObjectSpecifierType(
3187d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (DescType) typeObjectSpecifier);
7e87c7 ¤   ¤   ¤
4567bf ¤   ¤   ¤   err = ::AEPutParamDesc(¤theGetSelectionEvent,
fd058f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyAERequestedType,
e6a055 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   asObjectSpecifierType);
f2c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
bd87c7 ¤   ¤   ¤
0d7970 ¤   ¤   ¤   UAppleEventsMgr::SendAppleEventWithReply(¤  theGetSelectionEvent,
987d13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theReply,
1f1d69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false);
b9c653 ¤   ¤   }¤  ¤   ¤   ¤
c01b52 ¤   ¤
101544 ¤   ¤   // Check for errors
fec80a ¤   ¤   StAEDescriptor¤ errorCode(theReply, keyErrorNumber);
051b52 ¤   ¤
3fb15e ¤   ¤   if (errorCode.mDesc.descriptorType != typeNull) {
88e131 ¤   ¤   ¤   UExtractFromAEDesc::TheInt16(errorCode, err);
0f87c7 ¤   ¤   ¤
8cc60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
8a0fe4 ¤   ¤   }
891b52 ¤   ¤
50075a ¤   ¤   // Walk the list making sure that only files and folders are selected
88e831 ¤   ¤   AEKeyword¤  ¤   keyWord;
8a840d ¤   ¤   SInt32¤ ¤   ¤   numItems = 0;
603937 ¤   ¤   StAEDescriptor¤ theSelection(theReply, keyDirectObject);
3d6110 ¤   ¤   StAEDescriptor¤ theSelectionList;
c51b52 ¤   ¤
81bfeb ¤   ¤   if ((theSelection.mDesc.descriptorType == typeObjectSpecifier)
531208 ¤   ¤   || (theSelection.mDesc.descriptorType == typeAEList)) {
220d41 ¤   ¤   ¤   // Walk the list of items making sure that they are folders or
69d9b9 ¤   ¤   ¤   // files
07ceb4 ¤   ¤   ¤   err = ::AECoerceDesc(theSelection, typeAEList, theSelectionList);
eec60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
8787c7 ¤   ¤   ¤
1bfa26 ¤   ¤   ¤   err = ::AECountItems(theSelectionList, &numItems);
e0c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
b22a48 ¤   ¤   ¤   PGPThrowIf_(numItems == 0);
c3125a ¤   ¤   ¤   for (SInt32 i = 1; i <= numItems; i++) {
e551cc ¤   ¤   ¤   ¤   StAEDescriptor¤ item;
25321e ¤   ¤   ¤   ¤   StAEDescriptor¤ itemRecord;
b25c30 ¤   ¤   ¤   ¤   StAEDescriptor¤ itemType;
7c2b85 ¤   ¤   ¤   ¤
8c461f ¤   ¤   ¤   ¤   // We coerce the spec into a record to get its type
c884be ¤   ¤   ¤   ¤   err = ::AEGetNthDesc(¤  theSelectionList,
b31291 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   i,
1df8ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeObjectSpecifier,
74902e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyWord,
371831 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   item);
2687f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
981d52 ¤   ¤   ¤   ¤   err = ::AECoerceDesc(item, typeAERecord, itemRecord);
cb87f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
e634f6 ¤   ¤   ¤   ¤   err = ::AEGetKeyDesc(¤  itemRecord,
82f198 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyAEDesiredClass,
9d0762 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeType,
98ea07 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   itemType);
8287f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
c52b85 ¤   ¤   ¤   ¤
--ee56 00123ab96064012012a Page 10 of CmenuMenuSelectPatch.cp
694aee ¤   ¤   ¤   ¤   // Determine whether the item is valid or not
32c1c1 ¤   ¤   ¤   ¤   if (*((DescType *) *itemType.mDesc.dataHandle) == cProperty) {
b63787 ¤   ¤   ¤   ¤   ¤   StAEDescriptor¤ form;
c8db4b ¤   ¤   ¤   ¤   ¤   StAEDescriptor¤ propertyID;
f1ae30 ¤   ¤   ¤   ¤   ¤
30615a ¤   ¤   ¤   ¤   ¤   err = ::AEGetKeyDesc(¤  itemRecord,
330441 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyAEKeyForm,
f0a963 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeType,
02327e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   form);
c489b4 ¤   ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
0d43c9 ¤   ¤   ¤   ¤   ¤   if (*((DescType *) *form.mDesc.dataHandle)
20c53a ¤   ¤   ¤   ¤   ¤   != formPropertyID) {
b771c0 ¤   ¤   ¤   ¤   ¤   ¤   result = false;
a500eb ¤   ¤   ¤   ¤   ¤   ¤   break;
381c89 ¤   ¤   ¤   ¤   ¤   }
f4615a ¤   ¤   ¤   ¤   ¤   err = ::AEGetKeyDesc(¤  itemRecord,
958396 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyAEKeyData,
99a963 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   typeType,
5b89f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   propertyID);
3089b4 ¤   ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
93feb0 ¤   ¤   ¤   ¤   ¤   if (*((DescType *) *propertyID.mDesc.dataHandle)
ae61fa ¤   ¤   ¤   ¤   ¤   != pTrash) {
c371c0 ¤   ¤   ¤   ¤   ¤   ¤   result = false;
9e00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
8881a1 ¤   ¤   ¤   ¤   ¤   } else {
20cff6 ¤   ¤   ¤   ¤   ¤   ¤   *outTrashSelected = true;
921c89 ¤   ¤   ¤   ¤   ¤   }
07b5fc ¤   ¤   ¤   ¤   } else {
235242 ¤   ¤   ¤   ¤   ¤   if ((*((DescType *) *itemType.mDesc.dataHandle) != cFile)
e9cd2c ¤   ¤   ¤   ¤   ¤   && (*((DescType *) *itemType.mDesc.dataHandle)
db63ba ¤   ¤   ¤   ¤   ¤   != cFolder)) {
7871c0 ¤   ¤   ¤   ¤   ¤   ¤   result = false;
5900eb ¤   ¤   ¤   ¤   ¤   ¤   break;
751c89 ¤   ¤   ¤   ¤   ¤   }
3a2613 ¤   ¤   ¤   ¤   }
aba3a6 ¤   ¤   ¤   }
f645a6 ¤   ¤   } else {
129237 ¤   ¤   ¤   result = false;
690fe4 ¤   ¤   }
821b52 ¤   ¤
cc99b3 ¤   ¤   // Check for missing parms and dispose of the reply
a510fe ¤   ¤   UAppleEventsMgr::CheckForMissedParams(theReply);
8c9371 ¤   }
de67c5 ¤
4ee0a3 ¤   catch (...) {
3f6452 ¤   ¤   result = false;
fe9371 ¤   }
6167c5 ¤
f65d73 ¤   return result;
23efe6 }


--64d5 00180d079c54012012b Page 1 of CmenuMenuSelectPatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
425231 ¤   $Id: CmenuMenuSelectPatch.h,v 1.2.20.1 1998/11/12 03:08:41 heller Exp $
c9f7f7 ____________________________________________________________________________*/
a5af5a
f98d55 #pragma once·
09af5a
a97dac #include "PGPmenuGlobals.h"
34e3c6 #include "CMenuSelectPatcher.h"
9245d2 #include "CPGPEncoderDecoder.h"
73af5a
07bd05 class CmenuMenuSelectPatch : public CMenuSelectPatcher {
485ed4 public:
df71f0 ¤   ¤   ¤   ¤   ¤   ¤   CmenuMenuSelectPatch(SGlobals & inGlobals);
648c04 ¤   virtual¤¤   ¤   ¤   ~CmenuMenuSelectPatch();
0567c5 ¤
b1a2d3 protected:
4f9341 ¤   SGlobals &¤ ¤   ¤   mGlobals;
e387e6 ¤   Boolean¤¤   ¤   ¤   mOptionDown;
4df723 ¤   Boolean¤¤   ¤   ¤   mWorkingCount;
3e67c5 ¤
7534ae ¤   virtual long¤   ¤   NewMenuSelect(Point startPt);
0d67c5 ¤
d35664 ¤   SInt32¤ ¤   ¤   ¤   PGPmenuFilter(SInt32 inSelection);
c667c5 ¤
e70139 ¤   void¤   ¤   ¤   ¤   SendToolsEvent(SInt16 inSelection);
5b780b ¤   void¤   ¤   ¤   ¤   Encode(EEncodeOptions inOptions);
ce9f13 ¤   void¤   ¤   ¤   ¤   Decode();
3687c7 ¤   ¤   ¤
09593b //¤ SInt32¤ ¤   ¤   ¤   CountFinderSelection(DescType inObjectType);
8ca597 ¤   Boolean¤¤   ¤   ¤   CheckFinderSelection(Boolean * outTrashSelected);
85af5a
6267c5 ¤
3db5ab ¤   void¤   ¤   ¤   ¤   AdjustMenuItems();
a01b52 ¤   ¤
8082f7 };
--5023 0018ddb210c4012012c Page 1 of CmenuPutScrapPatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
7ddba9 ¤   $Id: CmenuPutScrapPatch.cp,v 1.2.14.1.2.1 1998/11/12 03:08:41 heller Exp $
fdf7f7 ____________________________________________________________________________*/
e4af5a
268562 #include "CCopyPasteHack.h"
64aa64 #include "StSaveCurResFile.h"
7faf5a
57393e #include "CmenuPutScrapPatch.h"
64af5a
8daf5a
fcaf5a
e77e30 CmenuPutScrapPatch::CmenuPutScrapPatch(
89ae73 ¤   SGlobals &¤ inGlobals)
a1c13e ¤   ¤   : mGlobals(inGlobals)
c3bb36 {
16efe6 }
97af5a
5faf5a
d6af5a
3e0e27 CmenuPutScrapPatch::~CmenuPutScrapPatch()
bebb36 {
e7efe6 }
c2af5a
30af5a
e0af5a
4133d7 ¤   long
579ee9 CmenuPutScrapPatch::NewPutScrap(
99e8b2 ¤   long¤   length,
81809f ¤   ResType¤theType,
a536b0 ¤   void *¤ source)
9abb36 {
3947f0 ¤   SInt32¤ ¤   ¤   result;
d1c89d ¤   Boolean¤¤   ¤   callThrough = true;
a867c5 ¤
ac5168 ¤   try {
54589f ¤   ¤   if (CCopyPasteHack::GetCopyPasteHack() != nil) {
6b238b ¤   ¤   ¤   StMungeDialogs¤ ¤   munge(&mGlobals);
487015 ¤   ¤   ¤   StSaveCurResFile¤   saveResFile;
f2ed9f ¤   ¤   ¤   LFile¤  ¤   ¤   ¤   thePlugFile(mGlobals.plugSpec);¤
5687c7 ¤   ¤   ¤
ceb7ee ¤   ¤   ¤   thePlugFile.OpenResourceFork(fsRdPerm);
a3bfe2 ¤   ¤   ¤   if (CCopyPasteHack::GetCopyPasteHack()->PutScrap(length,
35eebf ¤   ¤   ¤   theType, source)) {
68fcf9 ¤   ¤   ¤   ¤   result = noErr;
eefb7c ¤   ¤   ¤   ¤   callThrough = false;
a1a3a6 ¤   ¤   ¤   }
593ded ¤   ¤   ¤   thePlugFile.CloseResourceFork();
900fe4 ¤   ¤   }
689371 ¤   }
ad67c5 ¤
1be0a3 ¤   catch (...) {
f29371 ¤   }
8467c5 ¤
a81be0 ¤   if (callThrough) {
a2a326 ¤   ¤   result = OldPutScrap(¤  length,
a8deea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theType,
7cad07 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   source);
5d9371 ¤   }
8667c5 ¤
fa5d73 ¤   return result;
8defe6 }
--4840 0011518b4d44012012d Page 1 of CmenuPutScrapPatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
21f91a ¤   $Id: CmenuPutScrapPatch.h,v 1.1.20.1 1998/11/12 03:08:42 heller Exp $
84f7f7 ____________________________________________________________________________*/
f2af5a
7a8d55 #pragma once·
b1af5a
f76ce9 #include "MacCursors.h"
807dac #include "PGPmenuGlobals.h"
e7d654 #include "CPutScrapPatcher.h"
6faf5a
c40a95 class CmenuPutScrapPatch : public CPutScrapPatcher {
3a5ed4 public:
3006f2 ¤   ¤   ¤   ¤   ¤   ¤   CmenuPutScrapPatch(SGlobals & inGlobals);
5ab518 ¤   virtual¤¤   ¤   ¤   ~CmenuPutScrapPatch();
7067c5 ¤
40a2d3 protected:
e39341 ¤   SGlobals &¤ ¤   ¤   mGlobals;
3567c5 ¤
9f5715 ¤   virtual long¤   ¤   NewPutScrap(long length, ResType theType,
66dd15 ¤   ¤   ¤   ¤   ¤   ¤   ¤   void * source);
1582f7 };
--1ebc 00160ec520a4012012e Page 1 of CmenuSetMenuBarPatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
e80c1d ¤   $Id: CmenuSetMenuBarPatch.cp,v 1.2.20.1 1998/11/12 03:08:43 heller Exp $
def7f7 ____________________________________________________________________________*/
09af5a
1b0c6e #include "CmenuSetMenuBarPatch.h"
aeaf5a
49af5a
cdaf5a
768db8 CmenuSetMenuBarPatch::CmenuSetMenuBarPatch(
35ae73 ¤   SGlobals &¤ inGlobals)
40c13e ¤   ¤   : mGlobals(inGlobals)
61bb36 {
b3efe6 }
90af5a
94af5a
a4af5a
f4a9b3 CmenuSetMenuBarPatch::~CmenuSetMenuBarPatch()
40bb36 {
7cefe6 }
e4af5a
92af5a
20af5a
606d52 ¤   void
af2105 CmenuSetMenuBarPatch::NewSetMenuBar(
035af4 ¤   Handle¤ menuList)
a0bb36 {
b8d454 ¤   // Set flag so that we will insert our menu on the next DrawMenuBar
2e4093 ¤   mGlobals.insertMenu = true;
d267c5 ¤
6f314a ¤   OldSetMenuBar(menuList);
60efe6 }
--a3b9 001f4ff18f14012012f Page 1 of CmenuSetMenuBarPatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
aff322 ¤   $Id: CmenuSetMenuBarPatch.h,v 1.1.20.1 1998/11/12 03:08:43 heller Exp $
4ff7f7 ____________________________________________________________________________*/
20af5a
e28d55 #pragma once·
20af5a
787dac #include "PGPmenuGlobals.h"
805892 #include "CSetMenuBarPatcher.h"
39af5a
3e19da class CmenuSetMenuBarPatch : public CSetMenuBarPatcher {
5b5ed4 public:
2f6df3 ¤   ¤   ¤   ¤   ¤   CmenuSetMenuBarPatch(SGlobals & inGlobals);
787151 ¤   virtual¤¤   ¤   ~CmenuSetMenuBarPatch();
0167c5 ¤
d1a2d3 protected:
212d60 ¤   SGlobals &¤ ¤   mGlobals;
8567c5 ¤
96b3b0 ¤   virtual void¤   NewSetMenuBar(Handle menuList);
f482f7 };
--6fb6 001705f5d6140120130 Page 1 of CmenuWaitNextEventPatch.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
a32a01 ¤   $Id: CmenuWaitNextEventPatch.cp,v 1.3.8.1 1998/11/12 03:08:44 heller Exp $
eaf7f7 ____________________________________________________________________________*/
9aaf5a
43aa64 #include "StSaveCurResFile.h"
2e8562 #include "CCopyPasteHack.h"
d4af5a
34b4ad #include "CmenuWaitNextEventPatch.h"
6eaf5a
06af5a
3eaf5a
f835f0 CmenuWaitNextEventPatch::CmenuWaitNextEventPatch(
f3ae73 ¤   SGlobals &¤ inGlobals)
b1c13e ¤   ¤   : mGlobals(inGlobals)
f6bb36 {
8fefe6 }
99af5a
70af5a
ffaf5a
0b6010 CmenuWaitNextEventPatch::~CmenuWaitNextEventPatch()
d9bb36 {
01efe6 }
3daf5a
b7af5a
ecaf5a
366d52 ¤   void
8a570f CmenuWaitNextEventPatch::PreWaitNextEvent()
16bb36 {
142d3f #if ! PGP_FINDERMENU
7e37ac ¤   if (CCopyPasteHack::GetCopyPasteHack() != nil) {
0376ad ¤   ¤   StSaveCurResFile¤   saveResFile;
b537b6 ¤   ¤   LFile¤  ¤   ¤   ¤   thePlugFile(mGlobals.plugSpec);¤
ec1b52 ¤   ¤
a621af ¤   ¤   thePlugFile.OpenResourceFork(fsRdPerm);
5ad913 ¤   ¤   CCopyPasteHack::GetCopyPasteHack()->PreWaitNextEvent();
e23b55 ¤   ¤   thePlugFile.CloseResourceFork();
639371 ¤   }
d67454 #endif
8aefe6 }
a6af5a
b7af5a
0baf5a
bf6d52 ¤   void
641ac6 CmenuWaitNextEventPatch::HandleKeyDown()
83bb36 {
4e2d3f #if ! PGP_FINDERMENU
8437ac ¤   if (CCopyPasteHack::GetCopyPasteHack() != nil) {
2a76ad ¤   ¤   StSaveCurResFile¤   saveResFile;
4837b6 ¤   ¤   LFile¤  ¤   ¤   ¤   thePlugFile(mGlobals.plugSpec);¤
491b52 ¤   ¤
6321af ¤   ¤   thePlugFile.OpenResourceFork(fsRdPerm);
1ce112 ¤   ¤   CCopyPasteHack::GetCopyPasteHack()->HandleKeyDown(sEventParams);
343b55 ¤   ¤   thePlugFile.CloseResourceFork();
2c9371 ¤   }
1c7454 #endif
70efe6 }
--23a8 001464bfea440120131 Page 1 of CmenuWaitNextEventPatch.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
0a1583 ¤   $Id: CmenuWaitNextEventPatch.h,v 1.1.20.1 1998/11/12 03:08:45 heller Exp $
e9f7f7 ____________________________________________________________________________*/
efaf5a
208d55 #pragma once·
21af5a
a7af5a
517dac #include "PGPmenuGlobals.h"
e2dcba #include "CWaitNextEventDispatcher.h"
ffaf5a
66e2a3 class CmenuWaitNextEventPatch : public CWaitNextEventDispatcher {
355ed4 public:
aa62de ¤   ¤   ¤   ¤   ¤   CmenuWaitNextEventPatch(SGlobals & inGlobals);
b7d6d2 ¤   virtual¤¤   ¤   ~CmenuWaitNextEventPatch();
a967c5 ¤
f1a2d3 protected:
252d60 ¤   SGlobals &¤ ¤   mGlobals;
4967c5 ¤
92c460 ¤   virtual void¤   PreWaitNextEvent();
7993b0 ¤   virtual void¤   HandleKeyDown();
4682f7 };
--37e1 0005b115bdd40120132 Page 1 of CCopyPasteHack.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
96f2f1 ¤   This is the algorithm
204e12 ¤   (P) means that the step is only done if on private scraps:
a4af5a
202049 ¤   Zero the scrap
391c82 ¤   Suspend (P)
27ee85 ¤   Save previous scrap
bfd076 ¤   ZeroScrap
37fb08 ¤   Resume (P)
1faf5a
3ba3b5 ¤   Copy
951c82 ¤   Suspend (P)
58af5a
dc4486 ¤   If PutScrap¤¤   ¤   ¤   ¤   If not PutScrap
58db54 ¤   Goto finish¤¤   ¤   ¤   ¤   ·Resume (P)
d43efa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·Select All
cb386c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·Copy
35c35e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·Suspend (P)
f8af5a
fc10b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   If PutScrap¤¤   ¤   If not PutScrap
86ed1c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·Goto finish¤   ¤   ·Restore previous scrap
eb72b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·Resume (P)
b1af5a
83354e ¤   Finish
d2e503 ¤   Encode/Decode scrap
28af5a
ff234b ¤   If Output Dialog¤   ¤   ¤   ¤   If Paste
6576f9 ¤   Restore previous scrap¤ ¤   ·Resume (P)
c164a4 ¤   Resume (P)¤ ¤   ¤   ¤   ¤   ·Paste
7f8418 ¤   Show Dialog¤¤   ¤   ¤   ¤   ·Suspend (P)
765e7b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·Restore previous scrap
5be241 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·Resume (P)
f167c5 ¤
8b67c5 ¤
4196c5 ¤   $Id: CCopyPasteHack.cp,v 1.24.2.6.2.1 1998/11/12 03:08:47 heller Exp $
a6f7f7 ____________________________________________________________________________*/
1aaf5a
8baf5a
c83a2c #include "WarningAlert.h"
241ef8 #include "SignatureStatusMessage.h"
df85c2 #include "MacStrings.h"
7b76b7 #include "MacErrors.h"
924720 #include "pflPrefTypes.h"
e010f0 #include "pgpOpenPrefs.h"
4c3991 #include "pgpAdminPrefs.h"
920d08 #include "pgpMem.h"
d2af5a
086080 #include "StSaveHeapZone.h"
2aaf5a
f07673 #include "CPGPmenu.h"
928b4f #include "COutputDialog.h"
6baf5a
f18562 #include "CCopyPasteHack.h"
b9af5a
9e86d4 // Statics
37e30c CCopyPasteHack *¤   CCopyPasteHack::sCopyPasteHack = nil;
19af5a
e6af5a
5baf5a
cce738 // Constants
fd6993 const SInt32¤   ¤   kSuspendKey¤¤   ¤   =¤  1;
d1bc38 const SInt32¤   ¤   kResumeKey¤ ¤   ¤   =¤  2;
3c0e56 const SInt32¤   ¤   kCopyKey¤   ¤   ¤   =¤  0x0863;
bc6c83 const SInt32¤   ¤   kSelectAllKey¤  ¤   =¤  0x0061;
5396df const SInt32¤   ¤   kPasteKey¤  ¤   ¤   =¤  0x0976;
52af5a
1957bb const KeyMap¤   ¤   kCopyKeyMap¤¤   ¤   =¤  {¤  0x00010000,
f37265 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0x00008000,
5b533d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0x00000000,
--b78f 00013f37e4d40120132 Page 2 of CCopyPasteHack.cp
a4332a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0x00000000};
7edd2c const KeyMap¤   ¤   kSelectAllKeyMap¤   =¤  {¤  0x01000000,
747265 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0x00008000,
3f533d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0x00000000,
a8332a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0x00000000};
90f7de const KeyMap¤   ¤   kPasteKeyMap¤   ¤   =¤  {¤  0x00020000,
777265 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0x00008000,
b0533d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0x00000000,
c3332a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0x00000000};
efaf5a
75af5a
70af5a
5d6e34 CCopyPasteHack::CCopyPasteHack(
7737f2 ¤   SGlobals &¤ ¤   inGlobals,
4dea9b ¤   EEncodeDecode¤  inEncodeDecode,
f35fe4 ¤   EEncodeOptions¤ inOptions)
7ece0b ¤   ¤   : mGlobals(inGlobals), mEncodeDecode(inEncodeDecode), mTextH(nil),
1b3fa8 ¤   ¤   ··mOptions(inOptions), mChecked(true), mVerified(true),
b92222 ¤   ¤   ··mSuspended(false), mSaveRestoreScrap(nil),
1afb48 ¤   ¤   ··mImportKeys(kInvalidPGPKeySetRef), mSecureString(nil)
80bb36 {
43580c ¤   if (sCopyPasteHack != nil) {
b4bc9f ¤   ¤   delete sCopyPasteHack;
e79371 ¤   }
2667c5 ¤
2d7e9f ¤   if (mGlobals.privateScrap) {
506e5c ¤   ¤   PostKeyDown(kSuspendKey, cmdKey);
3d46be ¤   ¤   mState = state_SuspendZeroScrap;
0ff037 ¤   } else {
0723ba ¤   ¤   mState = state_ZeroScrap;
ba9371 ¤   }
3610ab ¤   sCopyPasteHack = this;
1eefe6 }
adaf5a
62af5a
48af5a
5d3d88 CCopyPasteHack::~CCopyPasteHack()
b5bb36 {
d9b8e8 ¤   PGPKeySetRef¤   defaultKeySet = kInvalidPGPKeySetRef;
7ffc9c ¤   PGPKeySetRef¤   selectedSet = kInvalidPGPKeySetRef;
37504a ¤   StMungeDialogs¤ munge(&mGlobals);
38af5a
065168 ¤   try {
62d60c ¤   ¤   sCopyPasteHack = nil;
831b52 ¤   ¤
90e073 ¤   ¤   if (mEncodeDecode == encodeDecode_Decode) {
78a3f3 ¤   ¤   ¤   // Import the keys
054b14 ¤   ¤   ¤   if (PGPKeySetRefIsValid(mImportKeys)) {
b32728 ¤   ¤   ¤   ¤   PGPError¤   pgpErr;
078a81 ¤   ¤   ¤   ¤   PGPUInt32¤  count;
332b85 ¤   ¤   ¤   ¤
0b9d44 ¤   ¤   ¤   ¤   pgpErr = PGPCountKeys(mImportKeys, &count);
a28f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
8b9690 ¤   ¤   ¤   ¤   if (count > 0) {
29458d ¤   ¤   ¤   ¤   ¤   pgpErr = PGPOpenDefaultKeyRings(mGlobals.pgpContext,
330320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
4a28b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &defaultKeySet);
7e1edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
f3bba1 ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSelectKeysDialog(
c1bcba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mGlobals.pgpContext,
6f7f2f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation,
95213f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(STRx_Strings, kAddKeysID),
5a1a5a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mImportKeys,
408d58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeySet,
4527b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &selectedSet);
61ae30 ¤   ¤   ¤   ¤   ¤
b033cf ¤   ¤   ¤   ¤   ¤   if (pgpErr != kPGPError_UserAbort) {
18c66f ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
f1f6ac ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSharedAddKeysToDefaultKeyring(
9b1448 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectedSet);
f0c66f ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
131c89 ¤   ¤   ¤   ¤   ¤   }
--955f 00059bba3e440120132 Page 3 of CCopyPasteHack.cp
862613 ¤   ¤   ¤   ¤   }
2ba3a6 ¤   ¤   ¤   }
032b85 ¤   ¤   ¤   ¤
b6258c ¤   ¤   ¤   // Show alert if flag is set
3895f3 ¤   ¤   ¤   if ((! mChecked) || (! mVerified)) {
35bfbe ¤   ¤   ¤   ¤   WarningAlert(¤  kWAStopAlertType,
53144f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
560862 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
904b9c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (mChecked) ? kSignatureBadID
aab705 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   : kSignatureNotVerifiedID);
02a3a6 ¤   ¤   ¤   }
9987c7 ¤   ¤   ¤
7bd836 ¤   ¤   ¤   // Show Output dialog if necessary
83ed03 ¤   ¤   ¤   if ((mGlobals.useOutputDialog) && (mTextH != nil) && (mSecureString¶
4805e0 ·== nil)) {
557386 ¤   ¤   ¤   ¤   COutputDialog *¤theOutputDialog = (COutputDialog *)
d4f0f5 ¤   ¤   ¤   ¤   ¤   CModalDialogGrafPortView::CreateCModalDialogGrafPortView(
12c9b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kOutputDialogResID,
bbd470 ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil);
b6bb4a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
8b99e3 ¤   ¤   ¤   ¤   theOutputDialog->SetText(mTextH);
149255 ¤   ¤   ¤   ¤   theOutputDialog->Show();
42b41a ¤   ¤   ¤   ¤   theOutputDialog->Run();
bd26d8 ¤   ¤   ¤   ¤   if (theOutputDialog->GetCopyToClipboard()·
9cff7a ¤   ¤   ¤   ¤   && (mSaveRestoreScrap != nil)) {
c04c1f ¤   ¤   ¤   ¤   ¤   mSaveRestoreScrap->SetRestore(false);
e82613 ¤   ¤   ¤   ¤   }
dcd27d ¤   ¤   ¤   ¤   delete theOutputDialog;
8ea3a6 ¤   ¤   ¤   }
3c87c7 ¤   ¤   ¤
08834c ¤   ¤   ¤   // If FYEO
71dccc ¤   ¤   ¤   if (mSecureString != nil) {
a5ccb5 ¤   ¤   ¤   ¤   PGPForYourEyesOnlyDialog(¤  mGlobals.pgpContext,
ea99ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mSecureString);
b9a3a6 ¤   ¤   ¤   }
5c0fe4 ¤   ¤   }
de1b52 ¤   ¤
ea9371 ¤   }
3467c5 ¤
eeca6f ¤   catch (CComboError & comboError) {
01c2ea ¤   ¤   if (comboError.HavePGPError()) {
c6b95a ¤   ¤   ¤   CPGPmenuPlug::ShowError(comboError.pgpErr);
a145a6 ¤   ¤   } else {
5a243a ¤   ¤   ¤   CPGPmenuPlug::ShowError(MacErrorToPGPError(comboError.err));
f60fe4 ¤   ¤   }
ee9371 ¤   }
3caf5a
d27e82 ¤   catch(...) {
a920de ¤   ¤   CPGPmenuPlug::ShowError(kPGPError_UnknownError);
fd9371 ¤   }
d767c5 ¤
0f4038 ¤   delete mSaveRestoreScrap;
569265 ¤   if (mSecureString != nil) {
f8e10c ¤   ¤   pgpClearMemory(mSecureString, strlen(mSecureString));
e7f368 ¤   ¤   PGPFreeData(mSecureString);
e79371 ¤   }
1825e1 ¤   if (mTextH != nil) {
e2fe5b ¤   ¤   ::DisposeHandle(mTextH);
a99371 ¤   }
aa8619 ¤   if (PGPKeySetRefIsValid(selectedSet)) {
904e78 ¤   ¤   PGPFreeKeySet(selectedSet);
499371 ¤   }
aac505 ¤   if (PGPKeySetRefIsValid(mImportKeys)) {
2f9e68 ¤   ¤   PGPFreeKeySet(mImportKeys);
8e9371 ¤   }
47748b ¤   if (PGPKeySetRefIsValid(defaultKeySet)) {
d4aca0 ¤   ¤   PGPFreeKeySet(defaultKeySet);
3d9371 ¤   }
77efe6 }
f3af5a
08af5a
59af5a
--c65b 00040b1fd9f40120132 Page 4 of CCopyPasteHack.cp
3b6d52 ¤   void
588256 CCopyPasteHack::PreWaitNextEvent()
d2bb36 {
e17663 ¤   mCurrentKey = 0;
7967c5 ¤
7fea8d ¤   switch (mState) {
248355 ¤   ¤   case state_ZeroScrap:
575b34 ¤   ¤   {
9571ff ¤   ¤   ¤   mSaveRestoreScrap = new CSaveRestoreScrap;
ae1c94 ¤   ¤   ¤   ::ZeroScrap();
d3461a ¤   ¤   ¤   if (mGlobals.privateScrap) {
ea2ef5 ¤   ¤   ¤   ¤   PostKeyDown(kResumeKey, cmdKey);
d0cc99 ¤   ¤   ¤   ¤   mState = state_ResumeZeroScrap;
58042d ¤   ¤   ¤   } else {
66f343 ¤   ¤   ¤   ¤   PostKeyDown(kCopyKey, cmdKey);
d9dc68 ¤   ¤   ¤   ¤   mState = state_CopyKey;
7fa3a6 ¤   ¤   ¤   }
5d0fe4 ¤   ¤   }
092f68 ¤   ¤   break;
ea1b52 ¤   ¤
f41b52 ¤   ¤
1e1a0b ¤   ¤   case state_PutScrap:
a75b34 ¤   ¤   {
9f796f ¤   ¤   ¤   // No put scrap, so try select all first
f6461a ¤   ¤   ¤   if (mGlobals.privateScrap) {
d02ef5 ¤   ¤   ¤   ¤   PostKeyDown(kResumeKey, cmdKey);
f8b2c7 ¤   ¤   ¤   ¤   mState = state_ResumePutScrap;
31042d ¤   ¤   ¤   } else {
920096 ¤   ¤   ¤   ¤   PostKeyDown(kSelectAllKey, cmdKey);
58f343 ¤   ¤   ¤   ¤   PostKeyDown(kCopyKey, cmdKey);
24145a ¤   ¤   ¤   ¤   mState = state_AllCopyKey;
e4a3a6 ¤   ¤   ¤   }
fc0fe4 ¤   ¤   }
992f68 ¤   ¤   break;
bc1b52 ¤   ¤
921b52 ¤   ¤
3e32b7 ¤   ¤   case state_Finish:
335b34 ¤   ¤   {
976d70 ¤   ¤   ¤   StHandleLocker¤ theLock(mTextH);
0787c7 ¤   ¤   ¤
d45c19 ¤   ¤   ¤   // Set the scrap
401c94 ¤   ¤   ¤   ::ZeroScrap();
ebf274 ¤   ¤   ¤   ::PutScrap(::GetHandleSize(mTextH), 'TEXT', *mTextH);
ae87c7 ¤   ¤   ¤
6ea72b ¤   ¤   ¤   if ((mEncodeDecode == encodeDecode_Encode)
86b069 ¤   ¤   ¤   || (! mGlobals.useOutputDialog)) {
6e40a2 ¤   ¤   ¤   ¤   if (mGlobals.privateScrap) {
e47dee ¤   ¤   ¤   ¤   ¤   PostKeyDown(kResumeKey, cmdKey);
4056e8 ¤   ¤   ¤   ¤   ¤   mState = state_ResumeFinish;
d4b5fc ¤   ¤   ¤   ¤   } else {
c50ff3 ¤   ¤   ¤   ¤   ¤   PostKeyDown(kPasteKey, cmdKey);
e16ef8 ¤   ¤   ¤   ¤   ¤   mState = state_Paste;
3e2613 ¤   ¤   ¤   ¤   }
21042d ¤   ¤   ¤   } else {
4f6940 ¤   ¤   ¤   ¤   mState = state_Cleanup;
2ca3a6 ¤   ¤   ¤   }
130fe4 ¤   ¤   }
8d2f68 ¤   ¤   break;
6d1b52 ¤   ¤
d51b52 ¤   ¤
11a55e ¤   ¤   case state_AllPutScrap: // Never got data, so cleanup
789f4b ¤   ¤   case state_Cleanup:
2a5b34 ¤   ¤   {
ec1e50 ¤   ¤   ¤   if (mSuspended) {
102ef5 ¤   ¤   ¤   ¤   PostKeyDown(kResumeKey, cmdKey);
093967 ¤   ¤   ¤   ¤   mState = state_ResumeCleanup;
2cc5a2 ¤   ¤   ¤   } else if (mGlobals.privateScrap) {
ed18a7 ¤   ¤   ¤   ¤   PostKeyDown(kSuspendKey, cmdKey);
c72ef5 ¤   ¤   ¤   ¤   PostKeyDown(kResumeKey, cmdKey);
e4253e ¤   ¤   ¤   ¤   mState = state_SuspendCleanup;
19042d ¤   ¤   ¤   } else {
405e74 ¤   ¤   ¤   ¤   mState = state_Done;
--b42d 0006c83f54340120132 Page 5 of CCopyPasteHack.cp
cfa3a6 ¤   ¤   ¤   }
290fe4 ¤   ¤   }
d62f68 ¤   ¤   break;
4d1b52 ¤   ¤
951b52 ¤   ¤
5524c0 ¤   ¤   case state_Done:
285b34 ¤   ¤   {
39ffe5 ¤   ¤   ¤   delete this;
8f0fe4 ¤   ¤   }
412f68 ¤   ¤   break;
cd9371 ¤   }
ceefe6 }
01af5a
bdaf5a
d9af5a
6e6d52 ¤   void
f0b5dd CCopyPasteHack::HandleKeyDown(
2abdf2 ¤   SEventParams &¤ inParams)
e8bb36 {
2be418 ¤   if (inParams.theEvent->modifiers & cmdKey) {
d22d38 ¤   ¤   switch (mState) {
d9acd8 ¤   ¤   ¤   case state_SuspendZeroScrap:
79e5c5 ¤   ¤   ¤   case state_SuspendPutScrap:
939739 ¤   ¤   ¤   case state_SuspendAllPutScrap:
1b9e33 ¤   ¤   ¤   case state_SuspendCleanup:
d2f776 ¤   ¤   ¤   {
08880d ¤   ¤   ¤   ¤   if (inParams.theEvent->message == kSuspendKey) {
78af5a
4e1078 ¤   ¤   ¤   ¤   ¤   // Change the event into a suspend event
e920e4 ¤   ¤   ¤   ¤   ¤   inParams.theEvent->what = osEvt;
038d6e ¤   ¤   ¤   ¤   ¤   inParams.theEvent->message = (suspendResumeMessage << 24)
2f6908 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   | convertClipboardFlag;
a6c401 ¤   ¤   ¤   ¤   ¤   mSuspended = true;
5b7c17 ¤   ¤   ¤   ¤   ¤   switch (mState) {
f1abe6 ¤   ¤   ¤   ¤   ¤   ¤   case state_SuspendZeroScrap:
ec8fec ¤   ¤   ¤   ¤   ¤   ¤   {
fe28dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   mState = state_ZeroScrap;
5fdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
9100eb ¤   ¤   ¤   ¤   ¤   ¤   break;
fc94aa ¤   ¤   ¤   ¤   ¤   ¤
5694aa ¤   ¤   ¤   ¤   ¤   ¤
02e3b2 ¤   ¤   ¤   ¤   ¤   ¤   case state_SuspendPutScrap:
e78fec ¤   ¤   ¤   ¤   ¤   ¤   {
18e014 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mState = state_PutScrap;
71db3c ¤   ¤   ¤   ¤   ¤   ¤   }
0500eb ¤   ¤   ¤   ¤   ¤   ¤   break;
9a94aa ¤   ¤   ¤   ¤   ¤   ¤
e894aa ¤   ¤   ¤   ¤   ¤   ¤
dccf34 ¤   ¤   ¤   ¤   ¤   ¤   case state_SuspendAllPutScrap:
8f8fec ¤   ¤   ¤   ¤   ¤   ¤   {
712ece ¤   ¤   ¤   ¤   ¤   ¤   ¤   mState = state_AllPutScrap;
d7db3c ¤   ¤   ¤   ¤   ¤   ¤   }
6000eb ¤   ¤   ¤   ¤   ¤   ¤   break;
5994aa ¤   ¤   ¤   ¤   ¤   ¤
cc94aa ¤   ¤   ¤   ¤   ¤   ¤
64d955 ¤   ¤   ¤   ¤   ¤   ¤   case state_SuspendCleanup:
6d8fec ¤   ¤   ¤   ¤   ¤   ¤   {
f8db2f ¤   ¤   ¤   ¤   ¤   ¤   ¤   mState = state_ResumeCleanup;
05db3c ¤   ¤   ¤   ¤   ¤   ¤   }
fc00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
941c89 ¤   ¤   ¤   ¤   ¤   }
2d2613 ¤   ¤   ¤   ¤   }
cba3a6 ¤   ¤   ¤   }
a3cdcb ¤   ¤   ¤   break;
1faf5a
50af5a
8954c3 ¤   ¤   ¤   case state_ResumeZeroScrap:
b009ca ¤   ¤   ¤   case state_ResumePutScrap:
5dc768 ¤   ¤   ¤   case state_ResumeCleanup:
07c44d ¤   ¤   ¤   case state_ResumeFinish:
edf776 ¤   ¤   ¤   {
6c28b2 ¤   ¤   ¤   ¤   if (inParams.theEvent->message == kResumeKey) {
--d8e7 0004dcc61f840120132 Page 6 of CCopyPasteHack.cp
e0af5a
d0870a ¤   ¤   ¤   ¤   ¤   // Change the event into a resume event
b020e4 ¤   ¤   ¤   ¤   ¤   inParams.theEvent->what = osEvt;
998d6e ¤   ¤   ¤   ¤   ¤   inParams.theEvent->message = (suspendResumeMessage << 24)
0fdb12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   | resumeFlag | convertClipboardFlag;
0d2335 ¤   ¤   ¤   ¤   ¤   mSuspended = false;
847c17 ¤   ¤   ¤   ¤   ¤   switch (mState) {
fe52b4 ¤   ¤   ¤   ¤   ¤   ¤   case state_ResumeZeroScrap:
088fec ¤   ¤   ¤   ¤   ¤   ¤   {
2a3ded ¤   ¤   ¤   ¤   ¤   ¤   ¤   PostKeyDown(kCopyKey, cmdKey);
46da1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   mState = state_CopyKey;
32db3c ¤   ¤   ¤   ¤   ¤   ¤   }
ea00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
7894aa ¤   ¤   ¤   ¤   ¤   ¤
5894aa ¤   ¤   ¤   ¤   ¤   ¤
744eac ¤   ¤   ¤   ¤   ¤   ¤   case state_ResumePutScrap:
d78fec ¤   ¤   ¤   ¤   ¤   ¤   {
a11e71 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PostKeyDown(kSelectAllKey, cmdKey);
2f3ded ¤   ¤   ¤   ¤   ¤   ¤   ¤   PostKeyDown(kCopyKey, cmdKey);
494c57 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mState = state_AllCopyKey;
11db3c ¤   ¤   ¤   ¤   ¤   ¤   }
5b00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
3394aa ¤   ¤   ¤   ¤   ¤   ¤
c594aa ¤   ¤   ¤   ¤   ¤   ¤
929585 ¤   ¤   ¤   ¤   ¤   ¤   case state_ResumeFinish:
a88fec ¤   ¤   ¤   ¤   ¤   ¤   {
5fd508 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PostKeyDown(kPasteKey, cmdKey);
431803 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mState = state_Paste;
30db3c ¤   ¤   ¤   ¤   ¤   ¤   }
a300eb ¤   ¤   ¤   ¤   ¤   ¤   break;
d794aa ¤   ¤   ¤   ¤   ¤   ¤
c894aa ¤   ¤   ¤   ¤   ¤   ¤
988d7d ¤   ¤   ¤   ¤   ¤   ¤   case state_ResumeCleanup:
cb8fec ¤   ¤   ¤   ¤   ¤   ¤   {
df0fbc ¤   ¤   ¤   ¤   ¤   ¤   ¤   mState = state_Done;
6edb3c ¤   ¤   ¤   ¤   ¤   ¤   }
4000eb ¤   ¤   ¤   ¤   ¤   ¤   break;
8e531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
b41c89 ¤   ¤   ¤   ¤   ¤   }
3e2613 ¤   ¤   ¤   ¤   }
bda3a6 ¤   ¤   ¤   }
05cdcb ¤   ¤   ¤   break;
6687c7 ¤   ¤   ¤
0787c7 ¤   ¤   ¤
28873d ¤   ¤   ¤   case state_CopyKey:
05f776 ¤   ¤   ¤   {
a2b5d4 ¤   ¤   ¤   ¤   if (inParams.theEvent->message == kCopyKey) {
61123f ¤   ¤   ¤   ¤   ¤   if (mGlobals.privateScrap) {
c9b5d1 ¤   ¤   ¤   ¤   ¤   ¤   PostKeyDown(kSuspendKey, cmdKey);
3bbe72 ¤   ¤   ¤   ¤   ¤   ¤   mState = state_SuspendPutScrap;
6d81a1 ¤   ¤   ¤   ¤   ¤   } else {
77b30f ¤   ¤   ¤   ¤   ¤   ¤   mState = state_PutScrap;
781c89 ¤   ¤   ¤   ¤   ¤   }
182613 ¤   ¤   ¤   ¤   }
b0a3a6 ¤   ¤   ¤   }
bdcdcb ¤   ¤   ¤   break;
40af5a
28af5a
c78bc7 ¤   ¤   ¤   case state_AllCopyKey:
12f776 ¤   ¤   ¤   {
68b5d4 ¤   ¤   ¤   ¤   if (inParams.theEvent->message == kCopyKey) {
4c123f ¤   ¤   ¤   ¤   ¤   if (mGlobals.privateScrap) {
34b5d1 ¤   ¤   ¤   ¤   ¤   ¤   PostKeyDown(kSuspendKey, cmdKey);
e3b4bd ¤   ¤   ¤   ¤   ¤   ¤   mState = state_SuspendAllPutScrap;
0781a1 ¤   ¤   ¤   ¤   ¤   } else {
9b7b62 ¤   ¤   ¤   ¤   ¤   ¤   mState = state_AllPutScrap;
be1c89 ¤   ¤   ¤   ¤   ¤   }
0c2613 ¤   ¤   ¤   ¤   }
7ea3a6 ¤   ¤   ¤   }
decdcb ¤   ¤   ¤   break;
4587c7 ¤   ¤   ¤
4d87c7 ¤   ¤   ¤
--0cc0 000f5288bcb40120132 Page 7 of CCopyPasteHack.cp
a06b93 ¤   ¤   ¤   case state_Paste:
faf776 ¤   ¤   ¤   {
7a4255 ¤   ¤   ¤   ¤   if (inParams.theEvent->message == kPasteKey) {
54e126 ¤   ¤   ¤   ¤   ¤   mState = state_Cleanup;
1a2613 ¤   ¤   ¤   ¤   }
d7a3a6 ¤   ¤   ¤   }
6ecdcb ¤   ¤   ¤   break;
6f0fe4 ¤   ¤   }
eeaf5a
dcb7fa ¤   ¤   // Save off key if keyDown and cmdKey for use in generating a
bbe8bd ¤   ¤   // keymap
24d709 ¤   ¤   if (inParams.theEvent->what == keyDown) {
5a73fd ¤   ¤   ¤   mCurrentKey = inParams.theEvent->message;
1245a6 ¤   ¤   } else {
e8f3ef ¤   ¤   ¤   mCurrentKey = 0;
340fe4 ¤   ¤   }
419371 ¤   }
63efe6 }
24af5a
12af5a
75af5a
3e7e69 ¤   Boolean
a82588 CCopyPasteHack::PutScrap(
90beea ¤   SInt32¤ inLength,
5e41b9 ¤   ResType¤inType,
74f0e0 ¤   void *¤ inSource)
23bb36 {
45a182 ¤   Boolean¤result = false;
ab67c5 ¤
d4ea8d ¤   switch (mState) {
cc1a0b ¤   ¤   case state_PutScrap:
a82090 ¤   ¤   case state_SuspendPutScrap:
977278 ¤   ¤   case state_AllPutScrap:
e29975 ¤   ¤   case state_SuspendAllPutScrap:
2b5b34 ¤   ¤   {
8dd399 ¤   ¤   ¤   if (inType == 'TEXT') {
b2e747 ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   ¤   defaultKeySet = kInvalidPGPKeySetRef;
ef603d ¤   ¤   ¤   ¤   SDecodeSectionHandle¤   theSectionsH = nil;
80af5a
ab4205 ¤   ¤   ¤   ¤   try {
e5aad6 ¤   ¤   ¤   ¤   ¤   StSaveHeapZone¤ ¤   savedZone(::SystemZone());
796377 ¤   ¤   ¤   ¤   ¤   OSErr¤  ¤   ¤   ¤   err;
1f50cd ¤   ¤   ¤   ¤   ¤   EState¤ ¤   ¤   ¤   savedState = mState;
0e6503 ¤   ¤   ¤   ¤   ¤   PGPError¤   ¤   ¤   pgpErr;
f7ae30 ¤   ¤   ¤   ¤   ¤
c86c0a ¤   ¤   ¤   ¤   ¤   // Convert data to handle and call the encoder or
b72c03 ¤   ¤   ¤   ¤   ¤   // decoder
f8a992 ¤   ¤   ¤   ¤   ¤   mTextH = ::TempNewHandle(inLength, &err);
049988 ¤   ¤   ¤   ¤   ¤   if (mTextH == nil) {
075f19 ¤   ¤   ¤   ¤   ¤   ¤   mTextH = ::NewHandle(inLength);
091c89 ¤   ¤   ¤   ¤   ¤   }
47f336 ¤   ¤   ¤   ¤   ¤   PGPThrowIfMemFail_(mTextH);
c06575 ¤   ¤   ¤   ¤   ¤   ::BlockMoveData(¤   inSource,
93d004 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mTextH,
670310 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inLength);
28af5a
5f2ab6 ¤   ¤   ¤   ¤   ¤   mState = state_Processing;
678c60 ¤   ¤   ¤   ¤   ¤   pgpErr = PGPOpenDefaultKeyRings(
46bcba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mGlobals.pgpContext,
200320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
3e28b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &defaultKeySet);
3e1edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
bb7b7e ¤   ¤   ¤   ¤   ¤   if (mEncodeDecode == encodeDecode_Encode) {
ecb343 ¤   ¤   ¤   ¤   ¤   ¤   result = CPGPEncoderDecoder::EncodeHandle(
ff9a0f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mGlobals.pgpContext,
0e2ec7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTextH,
29528e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mOptions);
f781a1 ¤   ¤   ¤   ¤   ¤   } else {
29be83 ¤   ¤   ¤   ¤   ¤   ¤   CString¤sigString;
36aab9 ¤   ¤   ¤   ¤   ¤   ¤   CString¤beginSignedMessage(¤STRx_Strings,
acb852 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kBeginPGPSignedMessageID);
f50c74 ¤   ¤   ¤   ¤   ¤   ¤   CString¤endSignedMessage(¤  STRx_Strings,
--5732 0007b4af80540120132 Page 8 of CCopyPasteHack.cp
088aa8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEndPGPSignedMessageID);
4d48ce ¤   ¤   ¤   ¤   ¤   ¤   CString¤beginEncryptedSignedMessage(
69ea2a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
13b73a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kBeginPGPEncryptedSignedMessageID);
506f6f ¤   ¤   ¤   ¤   ¤   ¤   CString endEncryptedSignedMessage(
20ea2a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_Strings,
3e89d1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEndPGPEncryptedSignedMessageID);
3194aa ¤   ¤   ¤   ¤   ¤   ¤
180ce4 ¤   ¤   ¤   ¤   ¤   ¤   try {
24e595 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   fyeo;
4a6451 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPMemoryMgrRef¤memoryMgr = PGPGetContextMemoryMgr(¶
ce5209 mGlobals.pgpContext);
6faf5a
45fdba ¤   ¤   ¤   ¤   ¤   ¤   ¤   result = CPGPEncoderDecoder::DecodeHandle(
614026 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mGlobals.pgpContext,
e8b886 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTextH,
e09b44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeySet,
897504 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSectionsH,
7aa426 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fyeo);
e76bc0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (result) {
e46f95 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (fyeo) {
db7255 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mSecureString = (char *) PGPNewSecureData(m¶
4dbaf1 emoryMgr,
cd9614 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   1,
9f7a62 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMemoryM¶
5dbc8f grFlags_None);
85b808 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfNULL_(mSecureString);
b2c39e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mSecureString = 0;
5d0272 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   } else {
aae52c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::SetHandleSize(mTextH, 0);
0a6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
6cda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
6177c9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPNewKeySet(¤ mGlobals.pgpContext,
6f7f2b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mImportKeys);
67d073 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
9cda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
14d22f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Walk through the sections reassembling
bc21a8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // them
1eb2d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   for (UInt32 i = 0,
a7eace ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   x = ::GetHandleSize((Handle) theSectionsH)
d63b47 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   /sizeof(SDecodeSection);
a3c883 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   i < x; i++) {
cae50f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // If it is a signed section, add sig info
7dcea8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].sigDataValid) {
447234 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SignatureStatusInfo¤theStatus;
b91c9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   char¤   keyIDString[ kPGPMaxKeyIDString¶
f93492 Size ];
7aaf5a
0165a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Set an alert flag if we were unable
91b911 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // to verify a section
e4fbbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (!
77a6d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*theSectionsH)[i].sigData.checked) {
c34f24 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mChecked = false;
47b6fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
abfbbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (!
95e757 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*theSectionsH)[i].sigData.verified) {
6645bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mVerified = false;
bab6fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
cb0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
040fe7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Add status message
f84373 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theStatus.sigData =
9c2235 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*theSectionsH)[i].sigData;
bde3aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPGetKeyIDString(
a92c63 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theStatus.sigData.signingKeyID,
23b1a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyIDString_Abbreviated,
d3f902 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyIDString);
dc5d6d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
74bf10 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CopyCString(keyIDString,
0c8413 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theStatus.keyIDString);
93cdeb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetSignatureStatusMessage(
af6544 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theStatus,
7b19ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sigString);
--f2ec 000c4a116ec40120132 Page 9 of CCopyPasteHack.cp
5de184 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (fyeo) {
d1d78e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤newSize = strlen(mSecureStr¶
80c82e ing) + 1 +
c90bc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sigString.GetLength() +
4b0043 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (((*theSectionsH)[i].en¶
ff7cfa crypted) ?
308f4e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginEncryptedSignedMes¶
d8a1cf sage.GetLength() :
ae09a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginSignedMessage.GetL¶
ab12d2 ength());
23e624 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
4dbcaa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPReallocData(¤   memoryM¶
bfde6c gr,
dc2b50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mSecur¶
cd0f86 eString,
195f76 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newSize,
569386 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMem¶
af045c oryMgrFlags_None);
334ee1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
e630c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   strcat(mSecureString, sigString.Get¶
d4aa32 ConstCString());
c787d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].encrypted) {
08468b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   strcat(mSecureString,·
cef687 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginEncryptedSignedMessage¶
98f9d3 .GetConstCString());
2f054c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   } else {
e7468b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   strcat(mSecureString,·
2b3665 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginSignedMessage.GetConst¶
90907b CString());
cf8f38 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
385657 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   } else {
e64a82 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::PtrAndHand(
dab750 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sigString.GetConstCString(),
5aed2a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTextH,
2c4c1e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sigString.GetLength());
bd87d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].encrypted) {
d3a882 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::PtrAndHand(
3f211a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginEncryptedSignedMessage.
014722 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetConstCString(),
ff627d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTextH,
d4211a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginEncryptedSignedMessage.
5722ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetLength());
be054c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   } else {
b0a882 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::PtrAndHand(
8936aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginSignedMessage.
364722 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetConstCString(),
1b627d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTextH,
4136aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beginSignedMessage.
5d22ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetLength());
ff8f38 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
eab6fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
308a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
4d0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
7fdb62 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // If it is a key section add it to our
099c92 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // import list
a5d701 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (PGPKeySetRefIsValid(
c7bab1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*theSectionsH)[i].addKeysSet)) {
ef18b9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPAddKeys(
3a93e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*theSectionsH)[i].
b0c9fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   addKeysSet,
3d3737 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mImportKeys);
6f5d6d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
1ad95e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPCommitKeyRingChanges(
812214 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mImportKeys);
585d6d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
038a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
d7ae30 ¤   ¤   ¤   ¤   ¤
af9944 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Append the section
183c36 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].buf != nil) {
a2e184 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (fyeo) {
bfd78e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤newSize = strlen(mSecureStr¶
c4c82e ing) + 1 +
--79f5 000f972e23740120132 Page 10 of CCopyPasteHack.cp
b9de42 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*theSectionsH)[i].size;
39e624 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
7ef0af ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPReallocData(memoryMgr,
ea803d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mSecureStr¶
b36bf0 ing,
c00da6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newSize,
1c7a62 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMemoryM¶
cebc8f grFlags_None);
dd4ee1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
1d4d6a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   strncat(mSecureString,
04a59a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (char *) (*theSectionsH)[i].buf,
51fe50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*theSectionsH)[i].size);
aa1d2c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mSecureString[newSize - 1] = 0;
b75657 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   } else {
9e4a82 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::PtrAndHand(
11bbd8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*theSectionsH)[i].buf,
27ed2a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTextH,
64fe50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*theSectionsH)[i].size);
6db6fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
e38a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
18ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
bea5b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Close out signed section
67cea8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].sigDataValid) {
b3e184 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (fyeo) {
9ed78e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤newSize = strlen(mSecureStr¶
eac82e ing) + 1 +
7c0043 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (((*theSectionsH)[i].en¶
c87cfa crypted) ?
e74320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endEncryptedSignedMessa¶
56bfcc ge.GetLength() :
556dd3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endSignedMessage.GetLen¶
d7b928 gth());
5ae624 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
76bcaa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPReallocData(¤   memoryM¶
a9de6c gr,
312b50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mSecur¶
250f86 eString,
635f76 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newSize,
269386 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMem¶
04045c oryMgrFlags_None);
8d4ee1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
9787d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].encrypted) {
d9468b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   strcat(mSecureString,·
644843 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endEncryptedSignedMessage.G¶
b94e7a etConstCString());
7b054c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   } else {
43468b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   strcat(mSecureString,·
bea0f9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endSignedMessage.GetConstCS¶
5b0206 tring());
048f38 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
195657 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   } else {
c787d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if ((*theSectionsH)[i].encrypted) {
bba882 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::PtrAndHand(
714320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endEncryptedSignedMessa¶
b7e44c ge.
2caa05 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetConstCString(),
61a661 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTextH,
ee4320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endEncryptedSignedMessa¶
dee44c ge.
7c340c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetLength());
78054c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   } else {
27a882 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::PtrAndHand(
4dc4c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endSignedMessage.
8baa05 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetConstCString(),
d5a661 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTextH,
d5c4c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   endSignedMessage.
b0340c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetLength());
b98f38 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
5db6fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
4a8a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
e0f6fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Free the data associated with the
f98e45 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // section
--e5c0 0004cd6e2c340120132 Page 11 of CCopyPasteHack.cp
84468a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::HLock((Handle) theSectionsH);
8b1de1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPEncoderDecoder::FreeDecodeSection(
c42954 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &(*theSectionsH)[i]);
bf2199 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::HUnlock((Handle) theSectionsH);
776560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
285268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
40db3c ¤   ¤   ¤   ¤   ¤   ¤   }
0794aa ¤   ¤   ¤   ¤   ¤   ¤
ce4ca3 ¤   ¤   ¤   ¤   ¤   ¤   catch (...) {
f5f9a6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   result = false;
60db3c ¤   ¤   ¤   ¤   ¤   ¤   }
0eb597 ¤   ¤   ¤   ¤   ¤   ¤   if (theSectionsH != nil) {
3ff45d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::DisposeHandle((Handle) theSectionsH);
e3db3c ¤   ¤   ¤   ¤   ¤   ¤   }
8d1c89 ¤   ¤   ¤   ¤   ¤   }
33ae30 ¤   ¤   ¤   ¤   ¤
147585 ¤   ¤   ¤   ¤   ¤   if ((result == true) && (::GetHandleSize(mTextH) > 0)
c87314 ¤   ¤   ¤   ¤   ¤   && (mSecureString == nil)) {
8ff161 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mState = state_Finish;
0481a1 ¤   ¤   ¤   ¤   ¤   } else {
df94d7 ¤   ¤   ¤   ¤   ¤   ¤   if (mTextH != nil) {
bac1e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::DisposeHandle(mTextH);
7c9013 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTextH = nil;
cddb3c ¤   ¤   ¤   ¤   ¤   ¤   }
dff976 ¤   ¤   ¤   ¤   ¤   ¤   mState = state_Cleanup;
981c89 ¤   ¤   ¤   ¤   ¤   }
1a2613 ¤   ¤   ¤   ¤   }
402b85 ¤   ¤   ¤   ¤
d78d09 ¤   ¤   ¤   ¤   catch (CComboError & comboError) {
bec5d4 ¤   ¤   ¤   ¤   ¤   if (comboError.HavePGPError()) {
37cf7f ¤   ¤   ¤   ¤   ¤   ¤   CPGPmenuPlug::ShowError(comboError.pgpErr);
e381a1 ¤   ¤   ¤   ¤   ¤   } else {
86d0ef ¤   ¤   ¤   ¤   ¤   ¤   CPGPmenuPlug::ShowError(
14efe0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   MacErrorToPGPError(comboError.err));
7b1c89 ¤   ¤   ¤   ¤   ¤   }
6fe126 ¤   ¤   ¤   ¤   ¤   mState = state_Cleanup;
f92613 ¤   ¤   ¤   ¤   }
98af5a
91ba85 ¤   ¤   ¤   ¤   catch(...) {
e95607 ¤   ¤   ¤   ¤   ¤   CPGPmenuPlug::ShowError(kPGPError_UnknownError);
37e126 ¤   ¤   ¤   ¤   ¤   mState = state_Cleanup;
4a2613 ¤   ¤   ¤   ¤   }
b2af5a
f396c3 ¤   ¤   ¤   ¤   if (PGPKeySetRefIsValid(defaultKeySet)) {
4de6b5 ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet(defaultKeySet);
b82613 ¤   ¤   ¤   ¤   }
1aa3a6 ¤   ¤   ¤   }
6387c7 ¤   ¤   ¤
290fe4 ¤   ¤   }
2a2f68 ¤   ¤   break;
449371 ¤   }
e867c5 ¤
975d73 ¤   return result;
21efe6 }
0daf5a
37af5a
03af5a
6e6d52 ¤   void
7ec69b CCopyPasteHack::PostKeyDown(
f1b997 ¤   SInt32¤ inKey,
d1ff5d ¤   SInt16¤ inModifiers)
cbbb36 {
d130bd ¤   OSErr¤  ¤   err;
feba62 ¤   EvQElPtr¤   qEvent;
4267c5 ¤
a48dae ¤   // Post the event
40f701 ¤   err = ::PPostEvent(¤keyDown,
ea9e5c ¤   ¤   ¤   ¤   ¤   ¤   inKey,
e42f20 ¤   ¤   ¤   ¤   ¤   ¤   &qEvent);
e35e5c ¤   PGPThrowIfOSErr_(err);
22407a ¤   qEvent->evtQModifiers |= inModifiers;
4cefe6 }
--5079 000215d524f40120132 Page 12 of CCopyPasteHack.cp
e0af5a
1aaf5a
17af5a
246d52 ¤   void
b9500f CCopyPasteHack::GetKeys(
980412 ¤   KeyMap¤ outKeys)
01bb36 {
62e39c ¤   if ((mState == state_PutScrap)
32b463 ¤   || (mState == state_AllCopyKey)
dacf9d ¤   || (mState == state_AllPutScrap)
449727 ¤   || (mState == state_Done)
9a2892 ¤   || (mState == state_RestoreScrapSuspend)) {
44ff18 ¤   ¤   switch (mCurrentKey) {
77fb7f ¤   ¤   ¤   case kCopyKey:
74f776 ¤   ¤   ¤   {
762932 ¤   ¤   ¤   ¤   ::BlockMoveData(¤   kCopyKeyMap,
c653d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outKeys,
d9f164 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(kCopyKeyMap));
18a3a6 ¤   ¤   ¤   }
f5cdcb ¤   ¤   ¤   break;
0687c7 ¤   ¤   ¤
d687c7 ¤   ¤   ¤
c63a97 ¤   ¤   ¤   case kSelectAllKey:
7bf776 ¤   ¤   ¤   {
9bdb80 ¤   ¤   ¤   ¤   ::BlockMoveData(¤   kSelectAllKeyMap,
4753d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outKeys,
0ff164 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(kCopyKeyMap));
e7a3a6 ¤   ¤   ¤   }
13cdcb ¤   ¤   ¤   break;
cd87c7 ¤   ¤   ¤
b487c7 ¤   ¤   ¤
864b6e ¤   ¤   ¤   case kPasteKey:
58f776 ¤   ¤   ¤   {
a30fe3 ¤   ¤   ¤   ¤   ::BlockMoveData(¤   kPasteKeyMap,
7853d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outKeys,
79f164 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(kCopyKeyMap));
b5a3a6 ¤   ¤   ¤   }
f4cdcb ¤   ¤   ¤   break;
870fe4 ¤   ¤   }
989371 ¤   }
3e1862 }¤
74af5a
ffaf5a
2caf5a
b86d52 ¤   void
3567e7 CCopyPasteHack::EventAvail(
374f7e ¤   EventRecord *¤  theEvent)
bcbb36 {
2a345f ¤   if ((theEvent->what == keyDown) && (theEvent->modifiers & cmdKey)) {
452d38 ¤   ¤   switch (mState) {
e3acd8 ¤   ¤   ¤   case state_SuspendZeroScrap:
5fe5c5 ¤   ¤   ¤   case state_SuspendPutScrap:
0a9739 ¤   ¤   ¤   case state_SuspendAllPutScrap:
df9e33 ¤   ¤   ¤   case state_SuspendCleanup:
40f776 ¤   ¤   ¤   {
c21e18 ¤   ¤   ¤   ¤   if (theEvent->message == kSuspendKey) {
cfaf5a
131078 ¤   ¤   ¤   ¤   ¤   // Change the event into a suspend event
14479c ¤   ¤   ¤   ¤   ¤   theEvent->what = osEvt;
f9530b ¤   ¤   ¤   ¤   ¤   theEvent->message = (suspendResumeMessage << 24) | convertC¶
6f9024 lipboardFlag;
f82613 ¤   ¤   ¤   ¤   }
3da3a6 ¤   ¤   ¤   }
fdcdcb ¤   ¤   ¤   break;
d7af5a
82af5a
2d54c3 ¤   ¤   ¤   case state_ResumeZeroScrap:
e909ca ¤   ¤   ¤   case state_ResumePutScrap:
a9c768 ¤   ¤   ¤   case state_ResumeCleanup:
16c44d ¤   ¤   ¤   case state_ResumeFinish:
c8f776 ¤   ¤   ¤   {
21a400 ¤   ¤   ¤   ¤   if (theEvent->message == kResumeKey) {
--ddbf 001f3a52a1440120132 Page 13 of CCopyPasteHack.cp
e0af5a
d0870a ¤   ¤   ¤   ¤   ¤   // Change the event into a resume event
9e479c ¤   ¤   ¤   ¤   ¤   theEvent->what = osEvt;
28a837 ¤   ¤   ¤   ¤   ¤   theEvent->message = (suspendResumeMessage << 24)
a6db12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   | resumeFlag | convertClipboardFlag;
a12613 ¤   ¤   ¤   ¤   }
eaa3a6 ¤   ¤   ¤   }
1acdcb ¤   ¤   ¤   break;
9c0fe4 ¤   ¤   }
379371 ¤   }
f3efe6 }
--00b2 000982ac37640120133 Page 1 of CCopyPasteHack.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
2c0ebb ¤   $Id: CCopyPasteHack.h,v 1.9.2.2.2.1 1998/11/12 03:08:47 heller Exp $
bbf7f7 ____________________________________________________________________________*/
b5af5a
be8d55 #pragma once·
e4af5a
15f8d2 #include "PGPSharedEncryptDecrypt.h"
6b45d2 #include "CPGPEncoderDecoder.h"
ecaf5a
08dcba #include "CWaitNextEventDispatcher.h"
24fd50 #include "CSaveRestoreScrap.h"
337dac #include "PGPmenuGlobals.h"
91af5a
11af5a
e2af5a
b0a854 enum EEncodeDecode {
c1997b ¤   encodeDecode_Encode¤=¤  0,
964f04 ¤   encodeDecode_Decode¤=¤  1
6382f7 };
3baf5a
89af5a
9d03da class CCopyPasteHack {
c25ed4 public:
fb262b ¤   ¤   ¤   ¤   ¤   ¤   ¤   CCopyPasteHack(SGlobals & inGlobals,
168b00 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EEncodeDecode inEncodeDecode,
faacd6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EEncodeOptions inOptions = 0);
469ab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ~CCopyPasteHack();
6baf5a
dcc48e ¤   void¤   ¤   ¤   ¤   ¤   PreWaitNextEvent();
53a011 ¤   void¤   ¤   ¤   ¤   ¤   HandleKeyDown(SEventParams & inParams);
ed651e ¤   Boolean¤¤   ¤   ¤   ¤   PutScrap(SInt32 inLength, ResType inType,
a205a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void * inSource);
50a8c9 ¤   void¤   ¤   ¤   ¤   ¤   GetKeys(KeyMap outKeys);
f6a664 ¤   void¤   ¤   ¤   ¤   ¤   EventAvail(EventRecord * theEvent);
f6af5a
4eb024 ¤   static CCopyPasteHack *¤GetCopyPasteHack() { return sCopyPasteHack; }
d787c7 ¤   ¤   ¤
c1a2d3 protected:
477fe1 ¤   enum EState {
99159d ¤   ¤   state_SuspendZeroScrap,
5e53bc ¤   ¤   state_ZeroScrap,
0b4e49 ¤   ¤   state_ResumeZeroScrap,
c9e802 ¤   ¤   state_CopyKey,
fdff4f ¤   ¤   state_SuspendPutScrap,
40fa4b ¤   ¤   state_PutScrap,
51e686 ¤   ¤   state_ResumePutScrap,
bfefaa ¤   ¤   state_AllCopyKey,
65ced7 ¤   ¤   state_SuspendAllPutScrap,
2ed30e ¤   ¤   state_AllPutScrap,
8f40de ¤   ¤   state_Processing,
a4db2f ¤   ¤   state_Paste,
4acbc5 ¤   ¤   state_Finish,
8d7d38 ¤   ¤   state_ResumeFinish,
92717f ¤   ¤   state_SuspendCleanup,
155d2a ¤   ¤   state_Cleanup,
df71f6 ¤   ¤   state_ResumeCleanup,
0cce2f ¤   ¤   state_RestoreScrapSuspend,
8b3160 ¤   ¤   state_Done
2e62bd ¤   };
c9af5a
f7e684 ¤   static CCopyPasteHack *¤sCopyPasteHack;
c39804 ¤   EEncodeDecode¤  ¤   ¤   mEncodeDecode;
fbc7f5 ¤   EState¤ ¤   ¤   ¤   ¤   mState;
781d22 ¤   Handle¤ ¤   ¤   ¤   ¤   mTextH;
10be88 ¤   EEncodeOptions¤ ¤   ¤   mOptions;
688808 ¤   Boolean¤¤   ¤   ¤   ¤   mChecked;
98768a ¤   Boolean¤¤   ¤   ¤   ¤   mVerified;
--8ce5 001d6932ca340120133 Page 2 of CCopyPasteHack.h
e22270 ¤   Boolean¤¤   ¤   ¤   ¤   mSuspended;
7767db ¤   SInt32¤ ¤   ¤   ¤   ¤   mCurrentKey;
466d8a ¤   CSaveRestoreScrap *¤¤   mSaveRestoreScrap;
a19af0 ¤   SGlobals &¤ ¤   ¤   ¤   mGlobals;
63bb9b ¤   PGPKeySetRef¤   ¤   ¤   mImportKeys;
118618 ¤   char *¤ ¤   ¤   ¤   ¤   mSecureString;
0167c5 ¤
12f8dc ¤   void¤   ¤   ¤   ¤   ¤   PostKeyDown(SInt32 inKey, SInt16 inModifiers);
d682f7 };
--3b63 0008c8c471e40120134 Page 1 of CGAModalCPHResultDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
42de23 ¤   $Id: CGAModalCPHResultDialog.cp,v 1.2.20.1 1998/11/12 03:08:48 heller Exp $
73f7f7 ____________________________________________________________________________*/
13af5a
b70a47 #include <UGraphicsUtilities.h>
ba8f92 #include <UGAColorRamp.h>
b6ab82 #include <LGAPushButton.h>
04af5a
d4b86a #include "MacQuickdraw.h"
35af5a
b80bb4 #include "CString.h"
55af5a
4e3075 #include "PGPMenuGlobals.h"
967673 #include "CPGPmenu.h"
cf5ec9 #include "CGAModalCPHResultDialog.h"
eaaf5a
29e738 // Constants
54b040 const PaneIDT¤  kOKButtonPaneID¤¤   ¤   =¤  'bOK ';
424181 const PaneIDT¤  kStatusPaneID¤  ¤   ¤   =¤  'Stat';
553e1a const PaneIDT¤  kSignerPaneID¤  ¤   ¤   =¤  'Sign';
324338 const PaneIDT¤  kDatePaneID¤¤   ¤   ¤   =¤  'Date';
5eecf9 const PaneIDT¤  kValidityPaneID¤¤   ¤   =¤  'Vald';
d8af5a
e5af5a
a2af5a
535b38 CGAModalCPHResultDialog::CGAModalCPHResultDialog(
33cbb0 ¤   LStream *¤  inStream)
7e4914 ¤   ¤   : CModalDialogGrafPortView(inStream), mValidSignature(false)
56bb36 {
4ee23e ¤   ::InitCursor();
5eefe6 }
6caf5a
aeaf5a
d9af5a
d7065b CGAModalCPHResultDialog::~CGAModalCPHResultDialog()
41bb36 {
3cefe6 }
72af5a
24af5a
a7af5a
f36d52 ¤   void
907ddd CGAModalCPHResultDialog::FinishCreateSelf()
b0bb36 {
a6de6d ¤   LGAPushButton *¤okButton = (LGAPushButton *) FindPaneByID(kOKButtonPaneID);
0067c5 ¤
a67754 ¤   okButton->SetDefaultButton(true);
e61630 ¤   okButton->AddListener(this);
75efe6 }
c1af5a
85af5a
afaf5a
137e69 ¤   Boolean
f8cd65 CGAModalCPHResultDialog::HandleKeyPress(
5dd5cf ¤   const EventRecord &¤inKeyEvent)
88bb36 {
e52963 ¤   StColorPortState¤   theSavePort(UQDGlobals::GetCurrentPort());
4eaf5a
8fec8f ¤   Boolean¤¤   ¤   keyHandled = true;
324532 ¤   Int16¤  ¤   ¤   theKey = inKeyEvent.message & charCodeMask;
d7de6d ¤   LGAPushButton *¤okButton = (LGAPushButton *) FindPaneByID(kOKButtonPaneID);
a367c5 ¤
1fe8b9 ¤   OutOfFocus(nil);
32af5a
811b76 ¤   if((inKeyEvent.modifiers & cmdKey) == 0) {
efcefc ¤   ¤   switch (theKey) {
34bce9 ¤   ¤   ¤   case char_Return:
8c3362 ¤   ¤   ¤   case char_Enter:
--8147 000bec0fcd540120134 Page 2 of CGAModalCPHResultDialog.cp
99f776 ¤   ¤   ¤   {
5eddc6 ¤   ¤   ¤   ¤   okButton->SimulateHotSpotClick(kControlButtonPart);
83a3a6 ¤   ¤   ¤   }
91cdcb ¤   ¤   ¤   break;
6287c7 ¤   ¤   ¤
2387c7 ¤   ¤   ¤
c7db68 ¤   ¤   ¤   default:
54f776 ¤   ¤   ¤   {
bfa357 ¤   ¤   ¤   ¤   keyHandled = CModalDialogGrafPortView::HandleKeyPress(
d6eb58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inKeyEvent);
6aa3a6 ¤   ¤   ¤   }
3dcdcb ¤   ¤   ¤   break;
b50fe4 ¤   ¤   }
8cf037 ¤   } else {
52b41e ¤   ¤   keyHandled = CModalDialogGrafPortView::HandleKeyPress(inKeyEvent);
ac9371 ¤   }
8967c5 ¤
75c022 ¤   return keyHandled;
42efe6 }
a1af5a
45af5a
c0af5a
f46d52 ¤   void
a0458e CGAModalCPHResultDialog::ListenToMessage(
6f7b08 ¤   MessageT¤   inMessage,
16121e ¤   void *¤ ¤   ioParam)
17bb36 {
41e0ab ¤   switch (inMessage) {
44d8ba ¤   ¤   case msg_OK:
225b34 ¤   ¤   {
7364cc ¤   ¤   ¤   mExitDialog = true;
fe0fe4 ¤   ¤   }
0c2f68 ¤   ¤   break;
119371 ¤   }
07efe6 }
a6af5a
0eaf5a
f56d52 ¤   void
b2bee8 CGAModalCPHResultDialog::SetStatusMessage(
5b8523 ¤   SStatusMessage &¤   inStatusMessage)
42bb36 {
d62963 ¤   StColorPortState¤   theSavePort(UQDGlobals::GetCurrentPort());
f8e8b9 ¤   OutOfFocus(nil);
3daf5a
a6df77 ¤   PGPResultStatus¤resultStatus;
d2afec ¤   LCaption *¤ ¤   statusCaption¤  = (LCaption *) FindPaneByID(kStatusPaneID);
ad4c0c ¤   LCaption *¤ ¤   signerCaption¤  = (LCaption *) FindPaneByID(kSignerPaneID);
c64d2a ¤   LCaption *¤ ¤   dateCaption¤¤   = (LCaption *) FindPaneByID(kDatePaneID);
927bfe ¤   Str31¤  ¤   ¤   dateString;
9f446b ¤   Str255¤ ¤   ¤   statusText;
6267c5 ¤
0bc9e6 ¤   ThrowIfNil_(statusCaption);
dc6825 ¤   ThrowIfNil_(signerCaption);
83af25 ¤   ThrowIfNil_(dateCaption);
4d67c5 ¤
d0fbb9 ¤   CPGPmenuPlug::GetResultStatusAndValidity(¤  &inStatusMessage.sigInfo,
840f5d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &resultStatus,
5fc484 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mValidity);
d6d481 ¤   CPGPmenuPlug::GetResultStatusString(¤   resultStatus,
635389 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_ResultsStrings,
a4dd58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kVerifiedID),
be8401 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   statusText);
c519d9 ¤   statusCaption->SetDescriptor(statusText);
3b714a ¤   signerCaption->SetDescriptor(CString(inStatusMessage.sigInfo.userID));
e567c5 ¤
bca77f ¤   ::IUDateString(¤inStatusMessage.sigInfo.signingDate,
ca89e3 ¤   ¤   ¤   ¤   ¤   shortDate,
752b33 ¤   ¤   ¤   ¤   ¤   dateString);
71deb3 ¤   dateCaption->SetDescriptor(dateString);
cc67c5 ¤
e0a98b ¤   mValidSignature = true;
be578d ¤   switch(resultStatus) {
--bbf0 0016de6491b40120134 Page 3 of CGAModalCPHResultDialog.cp
a20992 ¤   ¤   case kPGPResultStatusInvalid:
4e3e5c ¤   ¤   case kPGPResultStatusNotEncryptedOrSigned:
555b34 ¤   ¤   {
ba8e34 ¤   ¤   ¤   mValidSignature = false;
1b0fe4 ¤   ¤   }
d62f68 ¤   ¤   break;
661b52 ¤   ¤
9b87c7 ¤   ¤   ¤
155568 ¤   ¤   case kPGPResultStatusNotSigned:
7a5b34 ¤   ¤   {
298e34 ¤   ¤   ¤   mValidSignature = false;
670fe4 ¤   ¤   }
142f68 ¤   ¤   break;
911b52 ¤   ¤
de9f10 ¤   ¤   case kPGPResultStatusNotVerified:
f45b34 ¤   ¤   {
548e34 ¤   ¤   ¤   mValidSignature = false;
770fe4 ¤   ¤   }
f82f68 ¤   ¤   break;
4087c7 ¤   ¤   ¤
eeb6b9 ¤   ¤   case kPGPResultStatusBadSignature:
e05b34 ¤   ¤   {
f78e34 ¤   ¤   ¤   mValidSignature = false;
c40fe4 ¤   ¤   }
a72f68 ¤   ¤   break;
549371 ¤   }
03efe6 }
03af5a
7eaf5a
6caf5a
b76d52 ¤   void
cbb9ee CGAModalCPHResultDialog::DrawSelf()
84bb36 {
0f16cd ¤   if (mValidSignature) {
e2d932 ¤   ¤   LPane *¤¤   ¤   validityPane¤   =¤  (LPane *) FindPaneByID(
473aa7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kValidityPaneID);
342d75 ¤   ¤   RGBColor¤   ¤   validityColor = { 0xCCCC, 0xCCCC, 0xFFFF };
52591c ¤   ¤   Rect¤   ¤   ¤   validityRect;
e5620c ¤   ¤   Rect¤   ¤   ¤   frameRect;
181b52 ¤   ¤
6e64a1 ¤   ¤   validityPane->CalcLocalFrameRect(frameRect);
f92fe3 ¤   ¤   validityRect = frameRect;
622128 ¤   ¤   validityRect.bottom = validityRect.top + kValidityBarHeight;
f7536c ¤   ¤   AlignRect(&frameRect, &validityRect, kAlignAtVerticalCenter );
ab1b52 ¤   ¤
76489b ¤   ¤   ::RGBForeColor( &UGAColorRamp::GetBlackColor() );
f86b91 ¤   ¤   ::FrameRect( &validityRect );
de7d05 ¤   ¤   ::InsetRect( &validityRect, 1, 1 );
01af5a
cb0277 ¤   ¤   ::RGBForeColor( &validityColor );
5d35ec ¤   ¤   ::PaintRect( &validityRect );
b61b52 ¤   ¤
9de2a1 ¤   ¤   validityRect.right = validityRect.left
4dde83 ¤   ¤   ¤   ¤   ¤   + (( UGraphicsUtilities::RectWidth( validityRect ) *·
8fc545 ¤   ¤   ¤   ¤   ¤   mValidity ) / kMaxValidity );
c8ae30 ¤   ¤   ¤   ¤   ¤
f6231e ¤   ¤   ::RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Gray9 ) );
be35ec ¤   ¤   ::PaintRect( &validityRect );
b3af5a
9b489b ¤   ¤   ::RGBForeColor( &UGAColorRamp::GetBlackColor() );
dc9371 ¤   }
6dbe43 }¶
--5062 001c511446440120135 Page 1 of CGAModalCPHResultDialog.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
2cdf83 ¤   $Id: CGAModalCPHResultDialog.h,v 1.2.20.1 1998/11/12 03:08:49 heller Exp $
53f7f7 ____________________________________________________________________________*/
97af5a
5b8d55 #pragma once·
9caf5a
9245d2 #include "CPGPEncoderDecoder.h"
feed36 #include "CModalDialogGrafPortView.h"
1aaf5a
50c48d class CGAModalCPHResultDialog¤  :¤  public¤ CModalDialogGrafPortView {
e85ed4 public:
4fb867 ¤   enum { class_ID = 'CPHG' };
e8af5a
8b91ea ¤   ¤   ¤   ¤   ¤   ¤   CGAModalCPHResultDialog(LStream * inStream);
5c5e82 ¤   virtual¤¤   ¤   ¤   ~CGAModalCPHResultDialog();
1a67c5 ¤
520aec ¤   virtual Boolean¤¤   HandleKeyPress(const EventRecord & inKeyEvent);
baf277 ¤   virtual void¤   ¤   ListenToMessage(MessageT inMessage, void * ioParam);
9767c5 ¤
75af38 ¤   void¤   ¤   ¤   ¤   SetStatusMessage(SStatusMessage & inStatusMessage);
b367c5 ¤
c5a2d3 protected:
4450da ¤   Boolean¤¤   ¤   ¤   mValidSignature;
2cd263 ¤   UInt16¤ ¤   ¤   ¤   mValidity;
8867c5 ¤
cf80fd ¤   virtual void¤   ¤   FinishCreateSelf();
5967c5 ¤
ced3d4 ¤   virtual void¤   ¤   DrawSelf();
7d82f7 };
f7af5a
ab5474 ¤   const ResIDT¤   ¤   kModalCPHResultsDialogResID¤=¤  1101;
c5af5a
--25f2 0003a19b51a40120136 Page 1 of COutputDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
3ca130 ¤   $Id: COutputDialog.cp,v 1.6.8.1 1998/11/12 03:08:49 heller Exp $
92f7f7 ____________________________________________________________________________*/
68af5a
7d7e6d #include <UDrawingState.h>
a27b32 #include <PP_KeyCodes.h>
d0dd56 #include <PP_Messages.h>
23775b #include <LTextEditView.h>
4ad797 #include <LPushButton.h>
83af5a
838b4f #include "COutputDialog.h"
f8af5a
f0e738 // Constants
c5183d const PaneIDT¤  pane_Text¤  ¤   ¤   ¤   ¤   =¤  1000;
396179 const PaneIDT¤  pane_OKButton¤  ¤   ¤   ¤   =¤  1001;
eb6f75 const PaneIDT¤  pane_CopyToClipboardButton¤ =¤  1002;
b6af5a
2cf24b const MessageT¤ msg_CopyToClipboard¤¤   ¤   =¤  'Copy';
ddaf5a
baaf5a
87af5a
139a9c COutputDialog::COutputDialog(
fccbb0 ¤   LStream *¤  inStream)
ad05f0 ¤   ¤   : CModalDialogGrafPortView(inStream), mCopyToClipboard(false)
4abb36 {
c5e23e ¤   ::InitCursor();
16efe6 }
a7af5a
adaf5a
25af5a
d23109 COutputDialog::~COutputDialog()
cabb36 {
56efe6 }
2faf5a
1caf5a
56af5a
7b6d52 ¤   void
49fbec COutputDialog::FinishCreateSelf()
78bb36 {
7c1822 ¤   LPushButton *¤  button = (LPushButton *) FindPaneByID(pane_OKButton);
d467c5 ¤
d4c290 ¤   button->AddListener(this);
c667c5 ¤
0a22b6 ¤   button = (LPushButton *) FindPaneByID(pane_CopyToClipboardButton);
a5c290 ¤   button->AddListener(this);
caefe6 }
2faf5a
47af5a
23af5a
167e69 ¤   Boolean
b253f2 COutputDialog::HandleKeyPress(
47d5cf ¤   const EventRecord &¤inKeyEvent)
d4bb36 {
b52963 ¤   StColorPortState¤   theSavePort(UQDGlobals::GetCurrentPort());
f9e8b9 ¤   OutOfFocus(nil);
5faf5a
1bec8f ¤   Boolean¤¤   ¤   keyHandled = true;
a54532 ¤   Int16¤  ¤   ¤   theKey = inKeyEvent.message & charCodeMask;
7c2d06 ¤   LPushButton *¤  okButton = (LPushButton *) FindPaneByID(pane_OKButton);
2967c5 ¤
0d1b76 ¤   if((inKeyEvent.modifiers & cmdKey) == 0) {
61cefc ¤   ¤   switch (theKey) {
aebce9 ¤   ¤   ¤   case char_Return:
823362 ¤   ¤   ¤   case char_Enter:
f0f776 ¤   ¤   ¤   {
43ddc6 ¤   ¤   ¤   ¤   okButton->SimulateHotSpotClick(kControlButtonPart);
3aa3a6 ¤   ¤   ¤   }
--7c9f 0014e569f0e40120136 Page 2 of COutputDialog.cp
7ecdcb ¤   ¤   ¤   break;
3987c7 ¤   ¤   ¤
c787c7 ¤   ¤   ¤
11db68 ¤   ¤   ¤   default:
98f776 ¤   ¤   ¤   {
3aa357 ¤   ¤   ¤   ¤   keyHandled = CModalDialogGrafPortView::HandleKeyPress(
caeb58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inKeyEvent);
a8a3a6 ¤   ¤   ¤   }
3fcdcb ¤   ¤   ¤   break;
9e0fe4 ¤   ¤   }
7ef037 ¤   } else {
abb41e ¤   ¤   keyHandled = CModalDialogGrafPortView::HandleKeyPress(inKeyEvent);
789371 ¤   }
1a67c5 ¤
3fc022 ¤   return keyHandled;
97efe6 }
11af5a
c5af5a
d0af5a
966d52 ¤   void
a2a526 COutputDialog::ListenToMessage(
167b08 ¤   MessageT¤   inMessage,
22121e ¤   void *¤ ¤   ioParam)
5fbb36 {
b128bb ¤   (void) ioParam;
3b67c5 ¤
86e0ab ¤   switch (inMessage) {
8ad8ba ¤   ¤   case msg_OK:
e25b34 ¤   ¤   {
4464cc ¤   ¤   ¤   mExitDialog = true;
cb0fe4 ¤   ¤   }
752f68 ¤   ¤   break;
ec1b52 ¤   ¤
df1b52 ¤   ¤
aaa6d0 ¤   ¤   case msg_CopyToClipboard:
ae5b34 ¤   ¤   {
a09664 ¤   ¤   ¤   mCopyToClipboard = true;
090fe4 ¤   ¤   }
6f2f68 ¤   ¤   break;
119371 ¤   }
36efe6 }
76af5a
d1af5a
da6d52 ¤   void
e31ba3 COutputDialog::SetText(
9cba07 ¤   Handle¤ inTextH)
97bb36 {
a12963 ¤   StColorPortState¤   theSavePort(UQDGlobals::GetCurrentPort());
3be8b9 ¤   OutOfFocus(nil);
8d67c5 ¤
b464a0 ¤   LTextEditView *¤theText = (LTextEditView *) FindPaneByID(pane_Text);
feaf5a
74eabd ¤   theText->SetTextHandle(inTextH);
4eefe6 }
--ee38 001d46f67e140120137 Page 1 of COutputDialog.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
de34e3 ¤   $Id: COutputDialog.h,v 1.3.20.1 1998/11/12 03:08:50 heller Exp $
4ef7f7 ____________________________________________________________________________*/
a5af5a
eb8d55 #pragma once·
2aaf5a
32ed36 #include "CModalDialogGrafPortView.h"
50af5a
adf44e class COutputDialog¤:¤  public¤ CModalDialogGrafPortView {
035ed4 public:
d5b274 ¤   enum { class_ID = 'OutD' };
19af5a
c7b983 ¤   ¤   ¤   ¤   ¤   ¤   COutputDialog(LStream * inStream);
c6d63a ¤   virtual¤¤   ¤   ¤   ~COutputDialog();
c867c5 ¤
d60aec ¤   virtual Boolean¤¤   HandleKeyPress(const EventRecord & inKeyEvent);
15f277 ¤   virtual void¤   ¤   ListenToMessage(MessageT inMessage, void * ioParam);
e167c5 ¤
1886ca ¤   void¤   ¤   ¤   ¤   SetText(Handle inTextH);
edc60a ¤   Boolean¤¤   ¤   ¤   GetCopyToClipboard() { return mCopyToClipboard; }
6567c5 ¤
f0a2d3 protected:
a1376d ¤   Boolean¤¤   ¤   ¤   mCopyToClipboard;
9367c5 ¤
8080fd ¤   virtual void¤   ¤   FinishCreateSelf();
bd82f7 };
41af5a
d400e3 ¤   const ResIDT¤   ¤   kOutputDialogResID¤ =¤  11302;
d4af5a
--63c3 0009c69f92040120138 Page 1 of CPGPmenu.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
3bdff9 ¤   $Id: CPGPmenu.cp,v 1.22.2.2.2.1 1998/11/12 03:08:50 heller Exp $
2bf7f7 ____________________________________________________________________________*/
94af5a
25af5a
1d324c #include <string.h>
4aaf5a
167e6d #include <UDrawingState.h>
df4b3b #include <UEnvironment.h>
917c99 #include <URegistrar.h>
d2af5a
46d797 #include <LPushButton.h>
cb62c6 #include <LScrollBar.h>
d77304 #include <LScrollerView.h>
0da94f #include <LTextGroupBox.h>
e8775b #include <LTextEditView.h>
6e985b #include <LGAPushButtonImp.h>
af10f0 #include <LStdScrollBarImp.h>
da016b #include <LGATextGroupBoxImp.h>
67af5a
b79548 #include "plugin.h"
a2af5a
869ff9 #include "BETA.h"
3294a0 #include "pgpLeaks.h"
650d08 #include "pgpMem.h"
1d3a2c #include "WarningAlert.h"
e985c2 #include "MacStrings.h"
e24720 #include "pflPrefTypes.h"
9ec97b #include "pgpClientPrefs.h"
5dea7e #include "PGPUtilities.h"
7310f0 #include "pgpOpenPrefs.h"
0c91b9 #include "pgpSDKPrefs.h"
40f8d2 #include "PGPSharedEncryptDecrypt.h"
eea076 #include "pgpKeys.h"
10f5d2 #include "pgpMacCustomContextAlloc.h"
42628e #include "pgpClientErrors.h"
f104f5 #include "pgpFeatures.h"
36af5a
510bb4 #include "CString.h"
ebaa64 #include "StSaveCurResFile.h"
716080 #include "StSaveHeapZone.h"
cd5b4e #include "CRestorePortColorsAttachment.h"
8baf5a
f1a8da #include "CmenuGetKeysPatch.h"
880864 #include "CmenuMenuSelectPatch.h"
610c6e #include "CmenuSetMenuBarPatch.h"
7385a2 #include "CmenuDrawMenuBarPatch.h"
6c54bd #include "CmenuInsertMenuPatch.h"
e9b4ad #include "CmenuWaitNextEventPatch.h"
4e393e #include "CmenuPutScrapPatch.h"
9aa0a4 #include "CmenuEventAvailPatch.h"
9b3871 #include "CmenuGetResourcePatch.h"
ba8b4f #include "COutputDialog.h"
2a7673 #include "CPGPmenu.h"
b8af5a
e9d8b3 // Define the beta string
5a9838 #if BETA
6241a4 ConstStringPtr¤ ¤   kBetaHasExpired¤=¤  "\pThis beta version of PGPmenu has"
3ff796 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " expired and will now only decrypt"
9848cf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " and verify. Please contact the beta"
62a613 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " site or beta test coordinator for"
1da7e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " the latest version.";
457454 #endif
f3af5a
a993f7 // Define the demo string
02d673 #if PGP_DEMO
9c4584 ConstStringPtr¤ ¤   kDemoHasExpired = ¤ "\pThank you for evaluating PGP. Your"
--be82 000cbdb7e1f40120138 Page 2 of CPGPmenu.cp
733ad3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " 30 day evaluation copy has expired."
e5ae11 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " You may continue to decrypt and"
f36ce4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " verify messages for another 30"
96b020 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   " days.";
cf7454 #endif
14af5a
fbb932 // Globals
b3d493 static SGlobals¤¤   ¤   ¤   sGlobals;
5f7348 static UniversalProcPtr¤¤   sOldExitToShell =¤  nil;
7b0de4 static CPGPmenuPlug *¤  ¤   sPlugin¤¤   ¤   =¤  nil;
9f2d3f #if ! PGP_FINDERMENU
634f6b static PGPContextRef¤   ¤   sPGPContext¤¤   =¤  kInvalidPGPContextRef;
8a7454 #endif
ccaf5a
8e17f4 struct SMenuApps {
11bf13 ¤   PGPBoolean¤ privateScrap;
b35cf1 ¤   PGPBoolean¤ useOutputDialog;
565e98 ¤   OSType¤ ¤   creator;
bbd0f4 ¤   Str31¤  ¤   name;
6482f7 };
26af5a
19af5a
a3e738 // Constants
340725 const SInt32¤   kSystem8 = 0x00000800;
adaf5a
e2aa1a // Termination routine declarations
5b3379 #ifdef __cplusplus
c7d83c ¤   extern "C" {
407454 #endif
55a80b ¤   void __terminate(void);
af3379 #ifdef __cplusplus
609371 ¤   }
db7454 #endif
50af5a
6caf5a
9aaf5a
036685 ¤   pascal void
643efa MyExitToShell()
3dbb36 {
42d4bf ¤   delete sPlugin;
844a4b ¤   __terminate();
5b2d3f #if ! PGP_FINDERMENU
a8af5a
54a3a3 ¤   if (PGPContextRefIsValid(sPGPContext)) {
447beb ¤   ¤   PGPFreeContext(sPGPContext);
599371 ¤   }
817454 #endif
489ca1 ¤   ::CallUniversalProc(¤   sOldExitToShell,
31f731 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kUPPExitToShellProcInfo);
ccefe6 }
a3af5a
8baf5a
13959b ¤   SInt32
fb8fb3 main (
755f6b ¤   ProcessInfoRec *¤   inProcInfoPtr,
7667f7 ¤   FSSpec *¤   ¤   ¤   inFSSpecPtr,
f5c52c ¤   Boolean¤¤   ¤   ¤   inPrivateScrap,
31bf91 ¤   Boolean¤¤   ¤   ¤   inUseOutputDialog)
65bb36 {
f94924 #if PGP_FINDERMENU
bcb615 ¤   (void) inPrivateScrap;
055d30 ¤   (void) inUseOutputDialog;
8f7454 #endif
c6af5a
5213d7 ¤   SInt32¤ result = noErr;
3c67c5 ¤
7f759d ¤   // Set debug info
1cd9a6 ¤   SetDebugThrow_(debugAction_LowLevelDebugger);
7e8e09 ¤   SetDebugSignal_(debugAction_LowLevelDebugger);
e567c5 ¤
a75168 ¤   try {
cb99cd ¤   ¤   // zero the globals
--f819 000c9c31e5240120138 Page 3 of CPGPmenu.cp
38ce06 ¤   ¤   pgpClearMemory(&sGlobals, sizeof(sGlobals));
b8af5a
2a2d3f #if ! PGP_FINDERMENU
7d018a ¤   ¤   PGPError¤   pgpErr;
001b52 ¤   ¤
d4b2d6 ¤   ¤   pgpErr = pgpNewContextCustomMacAllocators(&sPGPContext);
d7c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
6f1b52 ¤   ¤
79366a ¤   ¤   sGlobals.privateScrap = inPrivateScrap;
2d0d68 ¤   ¤   sGlobals.useOutputDialog = inUseOutputDialog;
a07454 #endif
999b7d ¤   ¤   ¤   // Create our plug object
67c6b9 ¤   ¤   ¤   sPlugin = new CPGPmenuPlug(inProcInfoPtr, inFSSpecPtr);
b4af5a
3e5dfc ¤   ¤   ¤   // Patch ExitToShell so that we properly unload our fragment
c15c2c ¤   ¤   ¤   UniversalProcPtr¤   newExitToShellUPP;
ddaf5a
bea216 ¤   ¤   ¤   sOldExitToShell = ::GetToolTrapAddress(_ExitToShell);
4feeb4 ¤   ¤   ¤   newExitToShellUPP = (UniversalProcPtr) ::NewRoutineDescriptor(
be6733 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (ProcPtr) MyExitToShell,
03a9ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kUPPExitToShellProcInfo,
14f40d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetCurrentArchitecture());
bfbfc6 ¤   ¤   ¤   if ((newExitToShellUPP == nil)
492fd6 ¤   ¤   ¤   || (newExitToShellUPP == (UniversalProcPtr) MyExitToShell)) {
0eb632 ¤   ¤   ¤   ¤   PGPThrowOSErr_(kUnknownErr);
09a3a6 ¤   ¤   ¤   }
d6cbc4 ¤   ¤   ¤   ::SetToolTrapAddress(¤  (UniversalProcPtr) newExitToShellUPP,
b6f2ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   _ExitToShell);
8b9371 ¤   }
3167c5 ¤
4fca6f ¤   catch (CComboError & comboError) {
1b1d71 ¤   ¤   result = kUnloadPlug;
109371 ¤   }
7967c5 ¤
c4e0a3 ¤   catch (...) {
dc9d5d ¤   ¤   result = kUnknownErr;
6e9371 ¤   }
5a67c5 ¤
0f5d73 ¤   return result;
4cefe6 }
f3af5a
b1af5a
7daf5a
202315 CPGPmenuPlug::CPGPmenuPlug(
9cd09f ¤   ProcessInfoRec *¤   inProcInfoPtr,¤ // Proc info for captured browser
fbc5b4 ¤   FSSpec *¤   ¤   ¤   inFSSpecPtr)¤   // FSSpec for this plugin
21c4a4 ¤   ¤   : mGlobals(sGlobals)
61bb36 {
c831d4 ¤   StSaveHeapZone¤ ¤   savedZone(::SystemZone());
3c0bd3 ¤   OSStatus¤   ¤   ¤   err = kNoErr;
f9af5a
722d3f #if ! PGP_FINDERMENU
057944 ¤   PGPFlags¤   ¤   ¤   featureFlags;
ffaf5a
81b788 ¤   if (IsntPGPError(PGPGetFeatureFlags(kPGPFeatures_GeneralSelector,
03d7da ¤   &featureFlags))) {
02a3dd ¤   ¤   mGlobals.disableEncrypt = ! PGPFeatureExists(
279c54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   featureFlags,
6f6b19 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPFeatureMask_CanEncrypt);
20b28e ¤   ¤   mGlobals.disableSign = ! PGPFeatureExists(
a23255 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   featureFlags,
79414b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPFeatureMask_CanSign);
a77193 ¤   ¤   mGlobals.disableDecrypt = ! PGPFeatureExists(
569c54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   featureFlags,
e1eef3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPFeatureMask_CanDecrypt);
8dccad ¤   ¤   mGlobals.disableVerify = ! PGPFeatureExists(
309c54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   featureFlags,
4a49fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPFeatureMask_CanVerify);
66f037 ¤   } else {
af7454 #endif
b887db ¤   ¤   mGlobals.disableEncrypt = false;
c94698 ¤   ¤   mGlobals.disableSign = false;
--2680 0009bf1990d40120138 Page 4 of CPGPmenu.cp
655d31 ¤   ¤   mGlobals.disableDecrypt = false;
834838 ¤   ¤   mGlobals.disableVerify = false;
8e1b52 ¤   ¤
7a2d3f #if ! PGP_FINDERMENU
e89371 ¤   }
b87454 #endif
77af5a
2000a5 // Handle beta and demo code
0266f0 #if BETA || PGP_DEMO
d69838 #if BETA
d1d7d8 ¤   if (BetaExpired()) {
1b282a ¤   ¤   ConstStringPtr¤ theString = kBetaHasExpired;
807454 #endif
9faf5a
74d673 #if PGP_DEMO
d8a902 ¤   PGPDemoState¤   theState = GetDemoState();
b567c5 ¤
8fda99 ¤   if (theState == kDemoStateExpired) {
295e89 ¤   ¤   PGPThrowOSErr_(kUnloadPlug);
6c632b ¤   } else if (theState == kDemoStateEncryptionSigningDisabled) {
36521a ¤   ¤   ConstStringPtr theString = kDemoHasExpired;
d07454 #endif
ffaf5a
3e02eb ¤   ¤   StringPtr¤  noteString = (StringPtr) ::NewPtr(theString[0] + 1);
55961f ¤   ¤   NMRecPtr¤   theNotificationRecP =
20df24 ¤   ¤   ¤   ¤   ¤   ¤   (NMRecPtr) ::NewPtrClear(sizeof(NMRec));
cf1b52 ¤   ¤
f1bb6f ¤   ¤   if ((noteString != nil) && (theNotificationRecP != nil)) {
6cddc5 ¤   ¤   ¤   ::BlockMoveData(¤   theString,
e2b877 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   noteString,
b36bc1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theString[0] + 1);
c09b6c ¤   ¤   ¤   theNotificationRecP->qType = nmType;
154296 ¤   ¤   ¤   theNotificationRecP->nmSound = (Handle) -1;
799ea1 ¤   ¤   ¤   theNotificationRecP->nmStr = noteString;
16a5ae ¤   ¤   ¤   theNotificationRecP->nmResp = (NMUPP) -1;
ee87c7 ¤   ¤   ¤
ded4fc ¤   ¤   ¤   ::NMInstall(theNotificationRecP);
ce0fe4 ¤   ¤   }
7e28b0 ¤   ¤   mGlobals.disableEncrypt = true;
995f07 ¤   ¤   mGlobals.disableSign = true;
8a9371 ¤   }
d17454 #endif
90af5a
912d3f #if ! PGP_FINDERMENU
5497b8 ¤   mGlobals.mungeDialogs = false;
3a67c5 ¤
1f14e0 ¤   // Save the PGPContextRef
3955ed ¤   mGlobals.pgpContext = sPGPContext;
228bca ¤   PGPsdkLoadDefaultPrefs(sPGPContext);
bc7454 #endif
0367c5 ¤
dd7569 ¤   // Save away our FSSpec and ProcInfo
15c6f1 ¤   mGlobals.processProcInfo = *inProcInfoPtr;
b46625 ¤   mGlobals.processSpec = *inProcInfoPtr->processAppSpec;
fb5b9e ¤   ::BlockMoveData(¤   inProcInfoPtr->processName,
0a5b9d ¤   ¤   ¤   ¤   ¤   ¤   mGlobals.processName,
c90ac0 ¤   ¤   ¤   ¤   ¤   ¤   inProcInfoPtr->processName[0] + 1);
d3cfed ¤   mGlobals.processProcInfo.processAppSpec = &mGlobals.processSpec;
5e9097 ¤   mGlobals.processProcInfo.processName = mGlobals.processName;
1a54b0 ¤   mGlobals.plugSpec = *inFSSpecPtr;
5367c5 ¤
f69eaa ¤   // Find QDGlobals
b068b9 ¤   UQDGlobals::SetQDGlobals((QDGlobals*)(*((long*)::LMGetCurrentA5()) -
2b565e ¤   ¤   ¤   ¤   ¤   ¤   ¤   (sizeof(QDGlobals) - sizeof(GrafPtr))));
5f67c5 ¤
f59d87 ¤   // Set the ColorQD environment variable
ce7bef ¤   Int32¤  ¤   qdVersion = gestaltOriginalQD;
9b67c5 ¤
3d466b ¤   ::Gestalt(gestaltQuickdrawVersion, &qdVersion);
a1e5a4 ¤   UEnvironment::SetFeature(¤  env_SupportsColor,
e4b447 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·¤  (qdVersion > gestaltOriginalQD));
9b67c5 ¤
--9ab9 0016614d7cc40120138 Page 5 of CPGPmenu.cp
222d3f #if ! PGP_FINDERMENU
815206 ¤   // Register classes
e232dd ¤   RegisterClass_(LPushButton);
9e44cc ¤   RegisterClass_(LScrollerView);
f43b88 ¤   RegisterClass_(LTextEditView);
faca95 ¤   RegisterClass_(COutputDialog);
5a73a1 ¤   RegisterClass_(CRestorePortColorsAttachment);
bee2d0 ¤   RegisterClass_(LTextGroupBox);
ccc790 ¤   RegisterClassID_(LGAPushButtonImp, LPushButton::imp_class_ID);
326d69 ¤   RegisterClassID_(LGATextGroupBoxImp, LTextGroupBox::imp_class_ID);
923f3a ¤   RegisterClassID_(LStdScrollBarImp, LScrollBar::imp_class_ID);
0e273f ¤   CPGPEncoderDecoder::Init(sPGPContext);
ce7454 #endif
ed67c5 ¤
78594f ¤   // We've got all of the info we need from the app, so we now open our
5af8ce ¤   // resources
47498b ¤   LFile¤  thePlugFile(mGlobals.plugSpec);
8867c5 ¤
41b57b ¤   thePlugFile.OpenResourceFork(fsRdWrPerm);
8e67c5 ¤
9c7771 ¤   // Add patches
f7e495 ¤   new CmenuDrawMenuBarPatch(mGlobals);
2be6cf ¤   new CmenuInsertMenuPatch(mGlobals);
ee3557 ¤   new CmenuSetMenuBarPatch(mGlobals);
377cf2 ¤   new CmenuMenuSelectPatch(mGlobals);
7b1ecb ¤   new CmenuWaitNextEventPatch(mGlobals);
58af5a
d92d3f #if ! PGP_FINDERMENU
d76742 ¤   new CmenuPutScrapPatch(mGlobals);
ff1934 ¤   new CmenuGetKeysPatch(mGlobals);
e108f6 ¤   new CmenuEventAvailPatch();
57e536 ¤   new CmenuGetResourcePatch(mGlobals);
aa7454 #endif
5867c5 ¤
a73eb8 ¤   thePlugFile.CloseResourceFork();
4582f7 };
35af5a
a7af5a
98af5a
66f334 CPGPmenuPlug::~CPGPmenuPlug()
4bbb36 {
152d3f #if ! PGP_FINDERMENU
8bdf76 ¤   CPGPEncoderDecoder::Cleanup();
bb7454 #endif
43efe6 }
53af5a
e7af5a
e1af5a
a06d52 ¤   void
e13344 CPGPmenuPlug::ShowError(
1c4f7a ¤   PGPError¤   inErr)
c5bb36 {
7c6d8e ¤   CString¤¤   theErrorString;
3667c5 ¤
16c854 ¤   PGPGetClientErrorString(¤   inErr,
1ce232 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theErrorString.GetBufferSize() + 1,
2f8d69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theErrorString);
bbf5ab ¤   WarningAlert(¤  kWAStopAlertType,
11d280 ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
ee9f49 ¤   ¤   ¤   ¤   ¤   STRx_Errors,
b85ad4 ¤   ¤   ¤   ¤   ¤   kErrorStringID,
d82129 ¤   ¤   ¤   ¤   ¤   CString(inErr),
5bdca1 ¤   ¤   ¤   ¤   ¤   theErrorString);
66efe6 }
--bdea 0018c93c29c40120139 Page 1 of CPGPmenu.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
2e8646 ¤   $Id: CPGPmenu.h,v 1.5.20.1 1998/11/12 03:08:51 heller Exp $
4df7f7 ____________________________________________________________________________*/
b2af5a
ce8d55 #pragma once·
07af5a
317dac #include "PGPmenuGlobals.h"
55f8d2 #include "PGPSharedEncryptDecrypt.h"
9daf5a
b4a1e1 class¤  CPGPmenuPlug {
2b5ed4 public:
f4a84c ¤   ¤   ¤   ¤   ¤   CPGPmenuPlug(ProcessInfoRec * inProcInfoPtr,
8b8784 ¤   ¤   ¤   ¤   ¤   ¤   FSSpec * inFSSpecPtr);
9dcbf1 ¤   virtual¤¤   ¤   ~CPGPmenuPlug();
d1af5a
52b1df ¤   static Boolean¤ CaptureThisApp(OSType inCreator,
67719b ¤   ¤   ¤   ¤   ¤   ¤   Boolean * outPrivateScrap,
065a01 ¤   ¤   ¤   ¤   ¤   ¤   Boolean * outUseOutputDialog);
caaf5a
4d3879 ¤   static void¤¤   ShowError(PGPError inErr);
e1ae30 ¤   ¤   ¤   ¤   ¤
28a2d3 protected:
412d60 ¤   SGlobals &¤ ¤   mGlobals;
6082f7 };
35af5a
f1af5a
f0af5a
e0fb1c // UPP proc infos for patches
b373f4 enum {
4c07ab ¤   kUPPExitToShellProcInfo¤=¤  kPascalStackBased¤  ¤
0482f7 };
f1af5a
40ac96 pascal¤ void¤   MyExitToShell();
8caf5a
--fd20 0011286f1054012013a Page 1 of PGPappmenu.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
d8a805 ¤   $Id: PGPappmenu.prefix,v 1.1.20.1 1998/11/12 03:08:52 heller Exp $
cdf7f7 ____________________________________________________________________________*/
d9af5a
80af5a
5c0352 #include "PGPmenu.prefix"
a5af5a
124f02 #define PGP_FINDERMENU¤ 0¶
--403d 001bde2ed8f4012013b Page 1 of PGPappmenuDebug.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
e1170a ¤   $Id: PGPappmenuDebug.prefix,v 1.1.20.1 1998/11/12 03:08:52 heller Exp $
14f7f7 ____________________________________________________________________________*/
55af5a
80af5a
f55a96 #include "PGPmenuDebug.prefix"
c7af5a
bd4f02 #define PGP_FINDERMENU¤ 0¶
--443b 0017e3c09564012013c Page 1 of PGPfindermenu.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
a7e41a ¤   $Id: PGPfindermenu.prefix,v 1.1.20.1 1998/11/12 03:08:53 heller Exp $
5ef7f7 ____________________________________________________________________________*/
40af5a
15af5a
b40352 #include "PGPmenu.prefix"
15af5a
7e15de #define PGP_FINDERMENU¤ 1¶
--ea2d 001e5981f494012013d Page 1 of PGPfindermenuDebug.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
e42f8e ¤   $Id: PGPfindermenuDebug.prefix,v 1.1.20.1 1998/11/12 03:08:54 heller Exp $
6df7f7 ____________________________________________________________________________*/
f9af5a
b6af5a
9c5a96 #include "PGPmenuDebug.prefix"
36af5a
e515de #define PGP_FINDERMENU¤ 1¶
--fed2 001502bc5b84012013e Page 1 of PGPmenu.pch++
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
dbef41 ¤   $Id: PGPmenu.pch++,v 1.2.8.1 1998/11/12 03:08:54 heller Exp $
6ff7f7 ____________________________________________________________________________*/
eeaf5a
9477e0 #if __POWERPC__
eaa012 ¤   #pragma precompile_target "PGPmenuPCHPPC"
b867c5 ¤
b3fc58 #elif __CFM68K__
c0e601 ¤   #pragma precompile_target "PGPmenuPCHCFM68K"
b867c5 ¤
eddb21 #else
df80c7 ¤   #pragma precompile_target "PGPmenuPCH68K"
0e7454 #endif
8faf5a
ef27a3 #pragma once on
50329f #include <PP_MacHeaders.c>¶
--d2ca 001dcf8a2414012013f Page 1 of PGPmenu.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
814560 ¤   $Id: PGPmenu.prefix,v 1.2.20.1 1998/11/12 03:08:55 heller Exp $
5af7f7 ____________________________________________________________________________*/
92af5a
8267c5 ¤
8d77e0 #if __POWERPC__
f2508b ¤   #include "PGPmenuPCHPPC"
1167c5 ¤
96fc58 #elif __CFM68K__
758f6e ¤   #include "PGPmenuPCHCFM68K"
7f67c5 ¤
a2db21 #else
f3705e ¤   #include "PGPmenuPCH68K"
9b7454 #endif
c6af5a
a7b18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
e6af5a
52e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
c779b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
abaf5a
51049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
50af5a
f00db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
b4af5a
f8a662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
4ba6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
ae5cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
c4af5a
c40438 #include "MacBasics.h"
0f96be #include "PGPBuildFlags.h"
04e2ff #include "pgpConfig.h"
ec94a0 #include "pgpLeaks.h"
5246ad #include "MacDebug.h"
4baf5a
ec3379 #ifdef __cplusplus
1c0e06 #include "UPGPException.h"
dc7454 #endif
--a60a 001f05670d840120140 Page 1 of PGPmenuDebug.pch++
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
a5cfb6 ¤   $Id: PGPmenuDebug.pch++,v 1.4.8.1 1998/11/12 03:08:55 heller Exp $
08f7f7 ____________________________________________________________________________*/
7aaf5a
e477e0 #if __POWERPC__
6b526f ¤   #pragma precompile_target "PGPmenuDebugPCHPPC"
a467c5 ¤
cffc58 #elif __CFM68K__
49d61e ¤   #pragma precompile_target "PGPmenuDebugPCHCFM68K"
f167c5 ¤
a2db21 #else
1872ba ¤   #pragma precompile_target "PGPmenuDebugPCH68K"
327454 #endif
6eaf5a
1227a3 #pragma once on
d07bee #include <PP_MacHeaders.c>
5faf5a
54af17 // Define all debugging symbols
dd6dc3 #define Debug_Throw
f074f5 #define Debug_Signal
--3ead 00111b2c8ee40120141 Page 1 of PGPmenuDebug.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
82c3d2 ¤   $Id: PGPmenuDebug.prefix,v 1.2.20.1 1998/11/12 03:08:56 heller Exp $
dcf7f7 ____________________________________________________________________________*/
7eaf5a
5d77e0 #if __POWERPC__
e84a35 ¤   #include "PGPmenuDebugPCHPPC"
1967c5 ¤
6ffc58 #elif __CFM68K__
217dd6 ¤   #include "PGPmenuDebugPCHCFM68K"
2a67c5 ¤
cfdb21 #else
036ae0 ¤   #include "PGPmenuDebugPCH68K"
9a7454 #endif
c9af5a
63a853 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1
9faf5a
11e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
db79b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
01af5a
e7049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
40af5a
3e0db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
a4af5a
bea662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
5ea6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
6e5cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
18af5a
750438 #include "MacBasics.h"
ea96be #include "PGPBuildFlags.h"
f9e2ff #include "pgpConfig.h"
e494a0 #include "pgpLeaks.h"
c446ad #include "MacDebug.h"
00af5a
223379 #ifdef __cplusplus
550e06 #include "UPGPException.h"
117454 #endif
--283c 0006ddc159740120142 Page 1 of PGPmenuGlobals.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
82b1a3 ¤   $Id: PGPmenuGlobals.h,v 1.12.2.1.2.1 1998/11/12 03:08:57 heller Exp $
b4f7f7 ____________________________________________________________________________*/
35af5a
a18d55 #pragma once·
f3af5a
1028cd #include <PP_Types.h>
4caf5a
f34919 #include "pgpUtilities.h"
e6af5a
0a76ac typedef struct GlobalsS {
e2bb4b ¤   Boolean¤¤   ¤   ¤   disableEncrypt;
06c0c3 ¤   Boolean¤¤   ¤   ¤   disableSign;
4f51da ¤   Boolean¤¤   ¤   ¤   disableDecrypt;
cbaaab ¤   Boolean¤¤   ¤   ¤   disableVerify;
ee2d3f #if ! PGP_FINDERMENU
2423f7 ¤   PGPContextRef¤  ¤   pgpContext;
f1b67e ¤   Boolean¤¤   ¤   ¤   privateScrap;
c371db ¤   Boolean¤¤   ¤   ¤   useOutputDialog;
3f8f77 ¤   Boolean¤¤   ¤   ¤   mungeDialogs;
c77454 #endif
cc1957 ¤   Str32¤  ¤   ¤   ¤   processName;
c79f16 ¤   ProcessInfoRec¤ ¤   processProcInfo;
fd21d5 ¤   FSSpec¤ ¤   ¤   ¤   processSpec;
8163b9 ¤   FSSpec¤ ¤   ¤   ¤   plugSpec;
e131e8 ¤   MenuHandle¤ ¤   ¤   menuH;
8eeeb0 ¤   Handle¤ ¤   ¤   ¤   menuIconH;
2c7b05 ¤   Boolean¤¤   ¤   ¤   insertMenu;
b8ab8a } SGlobals, * SGlobalsPtr;
40af5a
90af5a
6faf5a
87af5a
98c3ad class StMungeDialogs {
bf5ed4 public:
b84924 #if PGP_FINDERMENU
baacb6 ¤   ¤   ¤   ¤   StMungeDialogs(SGlobals * inGlobals) { (void) inGlobals; }
8d39dc ¤   virtual ¤   ~StMungeDialogs() { }
b6db21 #else
d92b71 ¤   ¤   ¤   ¤   StMungeDialogs(SGlobals * inGlobals) : mGlobals(inGlobals)
48a937 ¤   ¤   ¤   ¤   ¤   { mGlobals->mungeDialogs = true; }
f0f119 ¤   virtual¤¤   ~StMungeDialogs() { mGlobals->mungeDialogs = false; }
fbaf5a
0da2d3 protected:
eb215c ¤   SGlobals *¤ mGlobals;
317454 #endif
1582f7 };
6faf5a
5faf5a
f9af5a
84f26c const OSType¤   ¤   kFinderCreator¤ ¤   ¤   ¤   ¤   ¤   =¤  'MACS';
ebaf5a
20e738 // Constants
5ad660 const SInt16¤   ¤   MENU_PGPmenu¤   ¤   ¤   ¤   ¤   ¤   =¤  17359;
eecd0e const SInt16¤   ¤   ICNx_PGPmenu¤   ¤   ¤   ¤   ¤   ¤   =¤  17359;
d4af5a
b6906f const ResIDT¤   ¤   STRx_Strings¤   ¤   ¤   ¤   ¤   ¤   =¤  10000;
709af2 const SInt16¤   ¤   kKeysNotFoundID¤¤   ¤   ¤   ¤   ¤   =¤  1;
6003ef const SInt16¤   ¤   kSignID¤¤   ¤   ¤   ¤   ¤   ¤   ¤   =¤  2;
718ebc const SInt16¤   ¤   kEncryptID¤ ¤   ¤   ¤   ¤   ¤   ¤   =¤  3;
17c60e const SInt16¤   ¤   kEncryptAndSignID¤  ¤   ¤   ¤   ¤   =¤  4;
8d0639 const SInt16¤   ¤   kDecryptVerifyID¤   ¤   ¤   ¤   ¤   =¤  5;
623406 const SInt16¤   ¤   kSignAsID¤  ¤   ¤   ¤   ¤   ¤   ¤   =¤  6;
feabaf const SInt16¤   ¤   kEncryptAsID¤   ¤   ¤   ¤   ¤   ¤   =¤  7;
1c3476 const SInt16¤   ¤   kEncryptAndSignAsID¤¤   ¤   ¤   ¤   =¤  8;
d7cb93 const SInt16¤   ¤   kDecryptVerifyAsID¤ ¤   ¤   ¤   ¤   =¤  9;
6d4708 const SInt16¤   ¤   kSignatureBadID¤¤   ¤   ¤   ¤   ¤   =¤  10;
--f770 0016cbdb4b640120142 Page 2 of PGPmenuGlobals.h
dc5ba9 const SInt16¤   ¤   kSignatureNotVerifiedID¤¤   ¤   ¤   =¤  11;
5a9cdb const SInt16¤   ¤   kBeginPGPSignedMessageID¤   ¤   ¤   =¤  12;
a95d25 const SInt16¤   ¤   kEndPGPSignedMessageID¤ ¤   ¤   ¤   =¤  13;
99f64d const SInt16¤   ¤   kBeginPGPEncryptedSignedMessageID¤  =¤  14;
0097c2 const SInt16¤   ¤   kEndPGPEncryptedSignedMessageID¤¤   =¤  15;
59ec1c const SInt16¤   ¤   kAddKeysID¤ ¤   ¤   ¤   ¤   ¤   ¤   =¤  16;
0a4ab4 const SInt16¤   ¤   kToolsNotFoundID¤   ¤   ¤   ¤   ¤   =¤  17;
dfaf5a
53b8c4 const ResIDT¤   ¤   STRx_Errors¤¤   ¤   ¤   ¤   ¤   ¤   =¤  10001;
fcc1ca const SInt16¤   ¤   kErrorStringID¤ ¤   ¤   ¤   ¤   ¤   =¤  1;
6faf5a
95af5a
b2af5a
58de3c // Menu items
846338 const SInt16¤   kEncrypt¤   ¤   ¤   ¤   ¤   =¤  1;
61b1e7 const SInt16¤   kSign¤  ¤   ¤   ¤   ¤   ¤   =¤  2;
32b57e const SInt16¤   kEncryptAndSign¤¤   ¤   ¤   =¤  3;
19a16e const SInt16¤   kDecryptVerify¤ ¤   ¤   ¤   =¤  4;
e52e64 const SInt16¤   kWipe¤  ¤   ¤   ¤   ¤   ¤   =¤  5;
f5c4ad const SInt16¤   kPGPkeys¤   ¤   ¤   ¤   ¤   =¤  7;
bbb2ce const SInt16¤   kPGPtools¤  ¤   ¤   ¤   ¤   =¤  8;
6caf5a
--1307 000c5ab958f40120143 Page 1 of ABalloon.cp
5243c8 #include <Balloons.h>
7d8708 #include <LCheckBox.h>
3740db #include <LRadioButton.h>
890a93 #include <LPeriodical.h>
d18fd4 #include <LWindow.h>
90f38b #include <LStream.h>
3fa19e #include <TArrayIterator.h>
6a3d25 #include "ABalloon.h"
b6af5a
9f4a44 /*¤ ---------------------------------------------------------------------------¶
73a764 ------------------
d5d8db ¤   ABalloon¤   ¤   PowerPlant attachment class for balloon help
1a67c5 ¤
16da1a ¤   Author: James W. Walker <mailto:jwwalker@kagi.com>
c067c5 ¤
2c4301 ¤   Creation date: 2/26/98
d867c5 ¤
ca71e3 ¤   Last Modified: 4/11/98
0c67c5 ¤
8ff502 ¤   Purpose:¤   To assign help balloons to panes in a PowerPlant
6222e9 ¤   ¤   ¤   ¤   window. ·You can use different messages depending
5e0dac ¤   ¤   ¤   ¤   on whether the item is on or off, enabled or disabled.
912b85 ¤   ¤   ¤   ¤
bbe13c ¤   Usage:¤ ¤   Attach an ABalloon to each pane (usually a control)
2499f7 ¤   ¤   ¤   ¤   for which you want to provide balloon help.
3bb016 ¤   ¤   ¤   ¤   Specify a STR# ID and a string index for each state.
1102ae ¤   ¤   ¤   ¤   And remember to register ABalloon at startup.
794c14 ¤   ¤   ¤   ¤   You must compile with RTTI for proper function.
c767c5 ¤
c74667 ¤   Overriding:¤The most likely methods to override are ComputeTip
46b2f0 ¤   ¤   ¤   ¤   (to provide more appropriate placement of the
39ad23 ¤   ¤   ¤   ¤   balloon tip) and ComputeStringIndex (if you have
58f3b4 ¤   ¤   ¤   ¤   more than the 4 states I provided for.)
cf87c7 ¤   ¤   ¤
b9bcc1 ¤   Restrictions:¤  ABalloon is (C)1998 by James W. Walker.
de00cb ¤   ¤   ¤   ¤   Permission is granted for use of ABalloon
eee906 ¤   ¤   ¤   ¤   free of charge, other than acknowledgement of
db9094 ¤   ¤   ¤   ¤   James W. Walker in any program using ABalloon
f942fb ¤   ¤   ¤   ¤   (perhaps in an About box or in accompanying
ab8c6c ¤   ¤   ¤   ¤   documentation).·
e667c5 ¤
f7399d ¤   Change history:
7ca193 ¤   ¤   1.0 ·2/28/98¤   ¤   First release.
fb1a48 ¤   ¤   1.1 ·4/11/98
21243d ¤   ¤   ¤   ¤   - Don't show balloons for invisible panes
1a7e1f ¤   ¤   ¤   ¤   ··(Thanks, Daniel Chiaramello, for the correction)
883b43 ¤   ¤   ¤   ¤   - Rolled ABalloonHelper::CreateABalloonHelper into
c7cfc7 ¤   ¤   ¤   ¤   ··ABalloonHelper::AddABalloon.
3b5b0f ¤   ¤   ¤   ¤   - sBalloonAttachments is now a TArray<ABalloon*>
7ccdcd ¤   ¤   ¤   ¤   ··instead of TArray<LAttachment*>.
91a6c0 ¤   ¤   ¤   ¤   - In the HMShowBalloon call, use kHMRegularWindow
af5612 ¤   ¤   ¤   ¤   ··instead of kHMSaveBitsNoWindow, because IM says
17f43d ¤   ¤   ¤   ¤   ··that the former should normally be used.
f043d4 ¤   ---------------------------------------------------------------------------¶
e0a764 ------------------
677fe0 */
d0e4de LAttachable*¤   ABalloon::sLastBalloonedItem = nil;
645cf1 Int16¤  ¤   ¤   ABalloon::sLastIndex = 0;
9e58c8 ResIDT¤ ¤   ¤   ABalloon::sLastStringList = 0;
11af5a
688dc4 #if !__option(RTTI)
7403e4 ¤   #error you must compile with RTTI for this to work right
007454 #endif
95af5a
e641c5 #pragma mark --------- ABalloonHelper declaration
dfaf5a
694a44 /*¤ ---------------------------------------------------------------------------¶
6ea764 ------------------
a41cdd ¤   class ABalloonHelper
da67c5 ¤
86ffd9 ¤   This periodical is in charge of sending DoBalloon messages to
c52151 ¤   appropriate ABalloon attachments.


--05a4 000dce8d5fd40120143 Page 2 of ABalloon.cp
2a67c5 ¤
75f4eb ¤   This is a singleton, created the first time an ABalloon is created.
e643d4 ¤   ---------------------------------------------------------------------------¶
c3a764 ------------------
f77fe0 */
896dc7 class ABalloonHelper ·: public LPeriodical
83bb36 {
825ed4 public:
7f76de ¤   static void¤¤   AddABalloon( ABalloon* inABalloon );
3d960f ¤   static void¤¤   RemoveABalloon( ABalloon* inABalloon );
d367c5 ¤
94a2d3 protected:
b567c5 ¤
4bd86b ¤   ¤   ¤   ¤   ¤   ABalloonHelper();
96ae30 ¤   ¤   ¤   ¤   ¤
cbc160 ¤   ¤   ¤   ¤   ¤   ~ABalloonHelper();
92ae30 ¤   ¤   ¤   ¤   ¤
666dd2 ¤   virtual¤void¤   SpendTime(
751069 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord¤  ¤   &inMacEvent);
acaf5a
e72a4b ¤   static ¤ABalloonHelper*¤sTheHelper;¤¤   // the single object of this class
6567c5 ¤
12cbb7 ¤   static¤ TArray<ABalloon*>*¤ sBalloonAttachments;
3e82f7 };
39af5a
2529e4 ABalloonHelper*¤¤   ¤   ABalloonHelper::sTheHelper = nil;
992a67 TArray<ABalloon*>*¤ ¤   ABalloonHelper::sBalloonAttachments = nil;
a3af5a
4ed52e #pragma mark --------- ABalloonHelper code
9aaf5a
c87473 void¤   ABalloonHelper::AddABalloon( ABalloon* inABalloon )
97bb36 {
0faeaf ¤   if (sTheHelper == nil)
29c7a1 ¤   {
b398e8 ¤   ¤   sTheHelper = new ABalloonHelper;
d5f0e0 ¤   ¤   sBalloonAttachments = new TArray<ABalloon*>;
8e9371 ¤   }
fc4a7d ¤   sBalloonAttachments->InsertItemsAt( 1, LArray::index_Last, inABalloon );
d5efe6 }
e0af5a
babe03 void¤   ABalloonHelper::RemoveABalloon( ABalloon* inABalloon )
80bb36 {
281143 ¤   sBalloonAttachments->Remove( inABalloon );
dbefe6 }
67af5a
49205c ABalloonHelper::ABalloonHelper()
b0bb36 {
7df066 ¤   StartRepeating();
aeefe6 }
78af5a
013435 ABalloonHelper::~ABalloonHelper()
eabb36 {
13dcc9 ¤   sTheHelper = nil;
c5bdd9 ¤   delete sBalloonAttachments;
024069 ¤   sBalloonAttachments = nil;
1cefe6 }
a7af5a
884a44 /*¤ ---------------------------------------------------------------------------¶
9fa764 ------------------
100226 ¤   ABalloonHelper::SpendTime
3c67c5 ¤
c6e613 ¤   This function determines which ABalloon attachment, if any, should
cf40df ¤   show its balloon.
1643d4 ¤   ---------------------------------------------------------------------------¶
1ea764 ------------------
137fe0 */
6ce3a3 void¤   ABalloonHelper::SpendTime( const EventRecord¤   &inMacEvent )
f2bb36 {
62589b ¤   if (::HMGetBalloons())
4bc7a1 ¤   {
72801e ¤   ¤   Point¤  globalPt = inMacEvent.where;
dc45e5 ¤   ¤   WindowPtr¤  macWindowP;







--dc48 00030bcfab640120143 Page 3 of ABalloon.cp
6a13e4 ¤   ¤   ::FindWindow(globalPt, &macWindowP);
2d1b52 ¤   ¤
38c6f2 ¤   ¤   if (macWindowP != nil)
af5b34 ¤   ¤   {
1f303b ¤   ¤   ¤   LWindow¤*theWindow = LWindow::FetchWindowObject(macWindowP);
644d45 ¤   ¤   ¤   if ((theWindow != nil) &&
531b12 ¤   ¤   ¤   ¤   theWindow->IsActive() &&
594809 ¤   ¤   ¤   ¤   theWindow->IsEnabled())
d4f776 ¤   ¤   ¤   {
4d43d9 ¤   ¤   ¤   ¤   Point¤  portMouse = globalPt;
c36208 ¤   ¤   ¤   ¤   theWindow->GlobalToPortPoint(portMouse);
332b85 ¤   ¤   ¤   ¤
f34b47 ¤   ¤   ¤   ¤   // We have an array of all active ABalloons. Of those
0225ec ¤   ¤   ¤   ¤   // attached to subpanes of this window, we want to find
6379bb ¤   ¤   ¤   ¤   // the deepest one containing the point.
da9484 ¤   ¤   ¤   ¤   ABalloon*¤  theBestSoFar = nil;
3dbc05 ¤   ¤   ¤   ¤   Rect¤   ¤   theBestFrameSoFar;
9dd42d ¤   ¤   ¤   ¤   TArrayIterator<ABalloon*>¤  iterator(*sBalloonAttachments);
32a494 ¤   ¤   ¤   ¤   ABalloon*¤  theAttachment;
0d2b85 ¤   ¤   ¤   ¤
dff1da ¤   ¤   ¤   ¤   while (iterator.Next(theAttachment))
df72c3 ¤   ¤   ¤   ¤   {
30179d ¤   ¤   ¤   ¤   ¤   LPane* ownerPane = dynamic_cast<LPane*>(
1d5288 ¤   ¤   ¤   ¤   ¤   ¤   theAttachment->GetOwnerHost() );
ba1782 ¤   ¤   ¤   ¤   ¤   Rect¤   ownerFrame;
79605e ¤   ¤   ¤   ¤   ¤   if ( (ownerPane != nil) &&
ce7535 ¤   ¤   ¤   ¤   ¤   ¤   ownerPane->IsVisible() &&¤  ¤   // 4/10/98
8b4f22 ¤   ¤   ¤   ¤   ¤   ¤   (ownerPane->GetMacPort() == macWindowP) &&
8cf54e ¤   ¤   ¤   ¤   ¤   ¤   ownerPane->CalcPortFrameRect(ownerFrame) &&
547f85 ¤   ¤   ¤   ¤   ¤   ¤   ::PtInRect( portMouse, &ownerFrame ) )
c64859 ¤   ¤   ¤   ¤   ¤   {
7a222f ¤   ¤   ¤   ¤   ¤   ¤   // The current frame is completely enclosed in
de991e ¤   ¤   ¤   ¤   ¤   ¤   // theBestFrameSoFar just in case their union
10e597 ¤   ¤   ¤   ¤   ¤   ¤   // equals theBestFrameSoFar.
f332d1 ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   theUnion;
95f09a ¤   ¤   ¤   ¤   ¤   ¤   ::UnionRect( &theBestFrameSoFar, &ownerFrame, &theUnion¶
6354c8 ·);
8394aa ¤   ¤   ¤   ¤   ¤   ¤
7282fb ¤   ¤   ¤   ¤   ¤   ¤   if ( (theBestSoFar == nil) ||
b8e563 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::EqualRect( &theBestFrameSoFar, &theUnion )
156fab ¤   ¤   ¤   ¤   ¤   ¤   )
d88fec ¤   ¤   ¤   ¤   ¤   ¤   {
9eac9b ¤   ¤   ¤   ¤   ¤   ¤   ¤   theBestSoFar = theAttachment;
5de35c ¤   ¤   ¤   ¤   ¤   ¤   ¤   theBestFrameSoFar = ownerFrame;
98db3c ¤   ¤   ¤   ¤   ¤   ¤   }
611c89 ¤   ¤   ¤   ¤   ¤   }
40ba35 ¤   ¤   ¤   ¤   } // end of loop over ABalloons
9d2b85 ¤   ¤   ¤   ¤
3cfb5e ¤   ¤   ¤   ¤   if (theBestSoFar != nil)
8972c3 ¤   ¤   ¤   ¤   {
5f6b28 ¤   ¤   ¤   ¤   ¤   theBestSoFar->DoBalloon();
c32613 ¤   ¤   ¤   ¤   }
95a3a6 ¤   ¤   ¤   }
0b0fe4 ¤   ¤   }
7e9371 ¤   }
30efe6 }
e0af5a
cdaf5a
1daf5a
51661d #pragma mark --------- ABalloon code
c3af5a
d2e42f // ABalloon::ABalloon¤  stream constructor.
affb1f ABalloon::ABalloon(
9ebc2d ¤   ¤   LStream¤¤   ¤   *inStream)
0a9365 ¤   : LAttachment( inStream )
ddbb36 {
c200ab ¤   // I don't want to have to bother filling this out in
4b5462 ¤   // Constructor every time.
b20ef6 ¤   mMessage = msg_Nothing;
9367c5 ¤
a7174a ¤   *inStream >> mStringListID;
3004df ¤   *inStream >> mOffDisabledIndex;
--1a8a 00058f24e2d40120143 Page 4 of ABalloon.cp
e3f0c4 ¤   *inStream >> mOffEnabledIndex;
2ba049 ¤   *inStream >> mOnDisabledIndex;
336475 ¤   *inStream >> mOnEnabledIndex;
6e67c5 ¤
42ca91 ¤   ABalloonHelper::AddABalloon( this );
a0efe6 }
76af5a
6ce954 // ABalloon::~ABalloon¤ destructor.
7dd151 ABalloon::~ABalloon()
f1bb36 {
d8573d ¤   ABalloonHelper::RemoveABalloon( this );
12efe6 }
d3af5a
4e4a44 /*¤ ---------------------------------------------------------------------------¶
e8a764 ------------------
a99a23 ¤   ABalloon::ShowBalloon
5167c5 ¤
6a9b37 ¤   Show a balloon, given a string index and pane frame.
fb813d ¤   We must be sure not to display the same balloon that is already
fba56f ¤   showing, to avoid flicker.
1143d4 ¤   ---------------------------------------------------------------------------¶
f5a764 ------------------
f87fe0 */
872bfd void¤   ABalloon::ShowBalloon( Int16 inStringIndex, Rect& inAltRect )
adbb36 {
34b950 ¤   if (::HMIsBalloon() && (sLastBalloonedItem == mOwnerHost) &&
3a3f26 ¤   ¤   (sLastIndex == inStringIndex) && (sLastStringList == mStringListID) )
8bc7a1 ¤   {
730fbb ¤   ¤   // already showing it, nothing to do
2e9371 ¤   }
100e24 ¤   else
7bc7a1 ¤   {
a3f4a8 ¤   ¤   HMMessageRecord¤¤   theMessageRec;
291b52 ¤   ¤
89b017 ¤   ¤   theMessageRec.hmmHelpType = khmmString;
79f2ca ¤   ¤   ::GetIndString( theMessageRec.u.hmmString, mStringListID,
c11327 ¤   ¤   ¤   inStringIndex );
1d1b52 ¤   ¤
e4e2f8 ¤   ¤   sLastBalloonedItem = mOwnerHost;
31d2e3 ¤   ¤   sLastIndex = inStringIndex;
386aac ¤   ¤   sLastStringList = mStringListID;
951b52 ¤   ¤
c55f80 ¤   ¤   ::HMShowBalloon( &theMessageRec, ComputeTip( inAltRect ),
995dfa ¤   ¤   ¤   &inAltRect, nil, 0, 0, kHMRegularWindow );
929371 ¤   }
e4efe6 }
e2af5a
c3af5a
a74a44 /*¤ ---------------------------------------------------------------------------¶
cda764 ------------------
ad32b9 ¤   ABalloon::ComputeTip
7667c5 ¤
913226 ¤   Compute the location for the balloon's tip, given the pane's frame.
3043d4 ¤   ---------------------------------------------------------------------------¶
f0a764 ------------------
b17fe0 */
7936ef Point¤  ABalloon::ComputeTip( const Rect& inAltRect )
09bb36 {
af6dba ¤   Point¤  theTip;
d09959 ¤   theTip.v = (inAltRect.top + inAltRect.bottom) / 2;
9a2b08 ¤   theTip.h = inAltRect.right - 4;
f467c5 ¤
64857a ¤   if ( (nil != dynamic_cast<LRadioButton*>(mOwnerHost)) ||
af21d0 ¤   ¤   (nil != dynamic_cast<LCheckBox*>(mOwnerHost))
cf27e6 ¤   )
76c7a1 ¤   {
de5481 ¤   ¤   theTip.h = inAltRect.left + 4;
9c9371 ¤   }
ab5224 ¤   return theTip;
bdefe6 }
9aaf5a
58af5a
--cf72 001b839f25940120143 Page 5 of ABalloon.cp
7c4a44 /*¤ ---------------------------------------------------------------------------¶
0ca764 ------------------
9aa072 ¤   ABalloon::DoBalloon
da67c5 ¤
5f89c1 ¤   Compute the pane's local frame and call ShowBalloon.
f743d4 ¤   ---------------------------------------------------------------------------¶
82a764 ------------------
e97fe0 */
15894e void¤   ABalloon::DoBalloon()
7cbb36 {
9dbd90 ¤   LPane*¤ thePane = dynamic_cast<LPane*>( mOwnerHost );
e2a48e ¤   if (thePane != nil)
36c7a1 ¤   {
897b03 ¤   ¤   Rect¤   theFrame;
5a1b52 ¤   ¤
48e8ff ¤   ¤   thePane->CalcPortFrameRect( theFrame );
f75389 ¤   ¤   thePane->PortToGlobalPoint( topLeft(theFrame) );
45b97b ¤   ¤   thePane->PortToGlobalPoint( botRight(theFrame) );
f11b52 ¤   ¤
37c189 ¤   ¤   ShowBalloon( ComputeStringIndex(thePane), theFrame );
e99371 ¤   }
e8efe6 }
a5af5a
234a44 /*¤ ---------------------------------------------------------------------------¶
53a764 ------------------
d291a6 ¤   ABalloon::ComputeStringIndex
ea67c5 ¤
323897 ¤   Examine the state of the pane and return the appropriate string index.
0a43d4 ¤   ---------------------------------------------------------------------------¶
42a764 ------------------
d47fe0 */
2840e5 Int16¤  ABalloon::ComputeStringIndex( LPane* inPane )
61bb36 {
92a172 ¤   Int16¤  whichString;
5455e3 ¤   if (inPane->GetValue() == 0)
78c7a1 ¤   {
7667cd ¤   ¤   if (inPane->IsEnabled())
885b34 ¤   ¤   {
10632d ¤   ¤   ¤   whichString = mOffEnabledIndex;
4f0fe4 ¤   ¤   }
d10e1d ¤   ¤   else
385b34 ¤   ¤   {
7b7e83 ¤   ¤   ¤   whichString = mOffDisabledIndex;
890fe4 ¤   ¤   }
499371 ¤   }
d80e24 ¤   else
8ac7a1 ¤   {
0967cd ¤   ¤   if (inPane->IsEnabled())
fe5b34 ¤   ¤   {
3d3c92 ¤   ¤   ¤   whichString = mOnEnabledIndex;
420fe4 ¤   ¤   }
510e1d ¤   ¤   else
2f5b34 ¤   ¤   {
8533a0 ¤   ¤   ¤   whichString = mOnDisabledIndex;
e20fe4 ¤   ¤   }
389371 ¤   }
e90fe4 ¤   return whichString;
b8efe6 }
--aeac 00046fe0dc740120144 Page 1 of ABalloon.h
997b7d #pragma once
bdaf5a
4542d4 #include <LAttachment.h>
0c09fc #include <LAttachable.h>
e1af5a
a64a44 /*¤ ---------------------------------------------------------------------------¶
86a764 ------------------
6cd8db ¤   ABalloon¤   ¤   PowerPlant attachment class for balloon help
8067c5 ¤
8ada1a ¤   Author: James W. Walker <mailto:jwwalker@kagi.com>
7467c5 ¤
564301 ¤   Creation date: 2/26/98
c267c5 ¤
3b71e3 ¤   Last Modified: 4/11/98
aa67c5 ¤
2cf502 ¤   Purpose:¤   To assign help balloons to panes in a PowerPlant
3822e9 ¤   ¤   ¤   ¤   window. ·You can use different messages depending
d10dac ¤   ¤   ¤   ¤   on whether the item is on or off, enabled or disabled.
e92b85 ¤   ¤   ¤   ¤
28e13c ¤   Usage:¤ ¤   Attach an ABalloon to each pane (usually a control)
1f99f7 ¤   ¤   ¤   ¤   for which you want to provide balloon help.
54b016 ¤   ¤   ¤   ¤   Specify a STR# ID and a string index for each state.
2902ae ¤   ¤   ¤   ¤   And remember to register ABalloon at startup.
044c14 ¤   ¤   ¤   ¤   You must compile with RTTI for proper function.
fb67c5 ¤
684667 ¤   Overriding:¤The most likely methods to override are ComputeTip
70b2f0 ¤   ¤   ¤   ¤   (to provide more appropriate placement of the
1dad23 ¤   ¤   ¤   ¤   balloon tip) and ComputeStringIndex (if you have
f9f3b4 ¤   ¤   ¤   ¤   more than the 4 states I provided for.)
0587c7 ¤   ¤   ¤
7dbcc1 ¤   Restrictions:¤  ABalloon is (C)1998 by James W. Walker.
d600cb ¤   ¤   ¤   ¤   Permission is granted for use of ABalloon
02e906 ¤   ¤   ¤   ¤   free of charge, other than acknowledgement of
939094 ¤   ¤   ¤   ¤   James W. Walker in any program using ABalloon
a642fb ¤   ¤   ¤   ¤   (perhaps in an About box or in accompanying
1f4a6c ¤   ¤   ¤   ¤   documentation).
3467c5 ¤
93399d ¤   Change history:
efa193 ¤   ¤   1.0 ·2/28/98¤   ¤   First release.
e71a48 ¤   ¤   1.1 ·4/11/98
a1243d ¤   ¤   ¤   ¤   - Don't show balloons for invisible panes
2f7e1f ¤   ¤   ¤   ¤   ··(Thanks, Daniel Chiaramello, for the correction)
363b43 ¤   ¤   ¤   ¤   - Rolled ABalloonHelper::CreateABalloonHelper into
7bcfc7 ¤   ¤   ¤   ¤   ··ABalloonHelper::AddABalloon.
3a5b0f ¤   ¤   ¤   ¤   - sBalloonAttachments is now a TArray<ABalloon*>
9acdcd ¤   ¤   ¤   ¤   ··instead of TArray<LAttachment*>.
56a6c0 ¤   ¤   ¤   ¤   - In the HMShowBalloon call, use kHMRegularWindow
105612 ¤   ¤   ¤   ¤   ··instead of kHMSaveBitsNoWindow, because IM says
17f43d ¤   ¤   ¤   ¤   ··that the former should normally be used.
b343d4 ¤   ---------------------------------------------------------------------------¶
3da764 ------------------
cb7fe0 */
cb874f class ABalloon : public LAttachment
d6bb36 {
4a8cdb ¤   friend class ABalloonHelper;
1f67c5 ¤
195ed4 public:
d2f975 ¤   enum { class_ID = 'ABal' };
8d67c5 ¤
541b00 ¤   ¤   ¤   ¤   ¤   ABalloon(
fb6cf5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   LStream¤¤   ¤   *inStream);
50ae30 ¤   ¤   ¤   ¤   ¤
416536 ¤   ¤   ¤   ¤   ¤   ~ABalloon();
09ae30 ¤   ¤   ¤   ¤   ¤
45a2d3 protected:
13af5a
e1f381 ¤   virtual void¤   DoBalloon();
1667c5 ¤
3b94de ¤   virtual Int16¤  ComputeStringIndex( LPane* inPane );
7567c5 ¤
61a642 ¤   virtual void¤   ShowBalloon( Int16 inStringIndex, Rect& inAltRect );
4667c5 ¤
--38e3 00159364fe940120144 Page 2 of ABalloon.h
2bd811 ¤   virtual Point¤  ComputeTip( const Rect& inAltRect );
e267c5 ¤
1467c5 ¤
3abced ¤   ResIDT¤ mStringListID;
244de1 ¤   Int16¤  mOffDisabledIndex;
ab923f ¤   Int16¤  mOffEnabledIndex;
52c2b2 ¤   Int16¤  mOnDisabledIndex;
689104 ¤   Int16¤  mOnEnabledIndex;
2367c5 ¤
11b83a ¤   static¤ LAttachable*¤   sLastBalloonedItem;
9e5ad7 ¤   static¤ Int16¤  ¤   ¤   sLastIndex;
79f71e ¤   static¤ ResIDT¤ ¤   ¤   sLastStringList;
5982f7 };
--eaf3 001045f1ac140120145 Page 1 of BETA.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
76afd7 ¤   $Id: BETA.c,v 1.26.2.1.2.1 1998/11/12 03:09:41 heller Exp $
6af7f7 ____________________________________________________________________________*/
bf198b #include "Beta.h"
29af5a
c339dd #if BETA¤   // [
3baf5a
597e69 ¤   Boolean
fc4151 BetaExpired( void )
0bc7a1 ¤   {
3e8359 ¤   DateTimeRec¤dt;
3cb8b2 ¤   ulong¤  ¤   now;
e87157 ¤   ulong¤  ¤   expirationDate;
6667c5 ¤
a58ebc ¤   dt.month¤   ¤   = 11;
a59834 ¤   dt.day¤ ¤   ¤   = 15;
c360f8 ¤   dt.year¤¤   ¤   = 1998;
916a25 ¤   dt.hour¤¤   ¤   = 0;
818a6b ¤   dt.minute¤  ¤   = 0;
341526 ¤   dt.second¤  ¤   = 0;
ee094d ¤   dt.dayOfWeek¤   = 0;
4e175f ¤   DateToSeconds( &dt, &expirationDate );
6967c5 ¤
3d3248 ¤   GetDateTime( &now );
0b67c5 ¤
f7a613 ¤   return( expirationDate < now );
8d9371 ¤   }
91af5a
3aaf5a
046627 #endif¤ // ]¶
--71ef 001063e6fa640120146 Page 1 of BETA.h
a70335 /*____________________________________________________________________________
bdcfc2 ¤   Copyright (C) 1996 Network Associates, Inc. and its affiliates.
994b0f ¤   All rights reserved.
dc67c5 ¤
3e84c6 ¤   $Id: BETA.h,v 1.2.18.1 1998/11/12 03:09:42 heller Exp $
eaf7f7 ____________________________________________________________________________*/
577b7d #pragma once
59af5a
a5af5a
f84228 #ifndef BETA
efc806 BETA is defined in PGPmailCompileFlags.h
200ad9 be sure to #include that file in your prefix
ad7454 #endif
46af5a
ae9838 #if BETA
ecaf5a
4c3379 #ifdef __cplusplus
7a6dad extern "C" {
cd7454 #endif
39af5a
0aa48d Boolean¤¤   BetaExpired( void );
d6af5a
c13379 #ifdef __cplusplus
12efe6 }
867454 #endif
81af5a
062841 #endif¶
--1623 0004eb1b70a40120147 Page 1 of CGADurationEditField.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
ea8abd ¤   $Id: CGADurationEditField.cp,v 1.2.8.1 1998/11/12 03:09:42 heller Exp $
5cf7f7 ____________________________________________________________________________*/
fe8f92 #include <UGAColorRamp.h>
71ffe3 #include <UGraphicUtils.h>
f6e8ae #include <UDrawingUtils.h>
547e6d #include <UDrawingState.h>
b6f8a6 #include <UTextTraits.h>
be05c6 #include <LStaticText.h>
207b32 #include <PP_KeyCodes.h>
19af5a
6d4d6a #include "CGADurationEditField.h"
36af5a
eeaf5a
9085c2 #include "MacStrings.h"
43af5a
9cdc49 const Int16¤kMaxYear¤   ¤   ¤   = 38;
a74c17 const Int16 kMinYear¤   ¤   ¤   = 50;
9203c2 const Int16 kMaxFullYear¤   ¤   = 2038;
b9d7cf const Int16 kMinFullYear¤   ¤   = 1950;
41af5a
4bf042 CGADurationEditField::CGADurationEditField(LStream * inStream)
695f28 ¤   : LCaption(inStream)
99bb36 {
48756c ¤   SetDurationType(kLengthDurationType);
5b54c6 ¤   mSelectedSection = 0;
0aefe6 }
6faf5a
a08027 CGADurationEditField::~CGADurationEditField()
bfbb36 {
59efe6 }
60af5a
806d52 ¤   void
6fca65 CGADurationEditField::SetDurationType(DurationType type)
68bb36 {
ec3e5e ¤   mType = type;
ff8e37 ¤   switch(mType)
63c7a1 ¤   {
5f1378 ¤   ¤   case kDateDurationType:
b1572a ¤   ¤   ¤   // Should initialize with today's date
71d0e8 ¤   ¤   ¤   mValues[0] = 1;
505157 ¤   ¤   ¤   mValues[1] = 1;
28f9f1 ¤   ¤   ¤   mValues[2] = 1998;
f300e4 ¤   ¤   ¤   mValues[3] = 0;
7fcdcb ¤   ¤   ¤   break;
1a8127 ¤   ¤   case kLengthDurationType:
8a0be7 ¤   ¤   ¤   // Initialize to 10 minutes
de8a34 ¤   ¤   ¤   mValues[0] = 0;
390fed ¤   ¤   ¤   mValues[1] = 10;
b6815b ¤   ¤   ¤   mValues[2] = 0;
2100e4 ¤   ¤   ¤   mValues[3] = 0;
13cdcb ¤   ¤   ¤   break;
131ad3 ¤   ¤   case kTimeDurationType:
d98a54 ¤   ¤   ¤   // Initialize to 12:00:00 PM
9df7a8 ¤   ¤   ¤   mValues[0] = 12;
b40b8b ¤   ¤   ¤   mValues[1] = 0;
e6815b ¤   ¤   ¤   mValues[2] = 0;
925a38 ¤   ¤   ¤   mValues[3] = 1;
b7cdcb ¤   ¤   ¤   break;
3d9371 ¤   }
80efe6 }
9daf5a
746d52 ¤   void
69679e CGADurationEditField::SetDurationValue(UInt32 duration)
2bbb36 {
783172 ¤   // duration is either a GetDateTime-style value
4e59ce ¤   // or a number of seconds duration (either way it
--e576 000bed8b30e40120147 Page 2 of CGADurationEditField.cp
b24ae7 ¤   // is a number of seconds actually, but for time
4c7cef ¤   // and date styles it has a base of midnight,
d6866d ¤   // Jan 1, 1904
154081 ¤   DateTimeRec dtr;
cd67c5 ¤
778c75 ¤   mValues[3] = 0;
c78e37 ¤   switch(mType)
afc7a1 ¤   {
821378 ¤   ¤   case kDateDurationType:
9cb5bd ¤   ¤   ¤   SecondsToDate(duration, &dtr);
f07bd8 ¤   ¤   ¤   mValues[0] = dtr.month;
9e0632 ¤   ¤   ¤   mValues[1] = dtr.day;
042ca7 ¤   ¤   ¤   mValues[2] = dtr.year;
c6cdcb ¤   ¤   ¤   break;
898127 ¤   ¤   case kLengthDurationType:
4361c7 ¤   ¤   ¤   mValues[0] = duration / 60 / 60;
24f1df ¤   ¤   ¤   mValues[1] = duration / 60 - (mValues[0] * 60);
66d130 ¤   ¤   ¤   mValues[2] = duration % 60;
f1cdcb ¤   ¤   ¤   break;
811ad3 ¤   ¤   case kTimeDurationType:
17b5bd ¤   ¤   ¤   SecondsToDate(duration, &dtr);
9ef733 ¤   ¤   ¤   mValues[0] = (dtr.hour > 12) ? dtr.hour - 12 : dtr.hour;
17de75 ¤   ¤   ¤   mValues[1] = dtr.minute;
debc6f ¤   ¤   ¤   mValues[2] = dtr.second;
9a6c53 ¤   ¤   ¤   mValues[3] = (dtr.hour > 12) ? 1 : 0;
4acdcb ¤   ¤   ¤   break;
1e9371 ¤   }
06efe6 }
2aaf5a
02cd56 ¤   UInt32
d64bd4 CGADurationEditField::GetDurationValue()
0ebb36 {
dcfb8d ¤   UInt32¤ value;
dd79f5 ¤   Int16¤  hour24;
c967c5 ¤
6a8e37 ¤   switch(mType)
c7c7a1 ¤   {
af1378 ¤   ¤   case kDateDurationType:
5af776 ¤   ¤   ¤   {
8a7e5b ¤   ¤   ¤   ¤   DateTimeRec dtr;
cb2b85 ¤   ¤   ¤   ¤
dc68db ¤   ¤   ¤   ¤   dtr.year¤   ¤   = mValues[2];
90ffeb ¤   ¤   ¤   ¤   dtr.month¤  ¤   = mValues[0];
b64d8c ¤   ¤   ¤   ¤   dtr.day¤¤   ¤   = mValues[1];
c20393 ¤   ¤   ¤   ¤   dtr.hour¤   ¤   = 0;
28d0b2 ¤   ¤   ¤   ¤   dtr.minute¤ ¤   = 0;
f04c99 ¤   ¤   ¤   ¤   dtr.second¤ ¤   = 0;
f1e04b ¤   ¤   ¤   ¤   dtr.dayOfWeek¤  = 0;
e32a78 ¤   ¤   ¤   ¤   DateToSeconds(&dtr, &value);
89a3a6 ¤   ¤   ¤   }
52cdcb ¤   ¤   ¤   break;
648127 ¤   ¤   case kLengthDurationType:
b5e89a ¤   ¤   ¤   value = (mValues[0] * 60 * 60) +
19c31d ¤   ¤   ¤   ¤   ¤   (mValues[1] * 60) +
e9d73c ¤   ¤   ¤   ¤   ¤   mValues[2];
1acdcb ¤   ¤   ¤   break;
5e1ad3 ¤   ¤   case kTimeDurationType:
a7bafb ¤   ¤   ¤   hour24 = mValues[0];
fb3e48 ¤   ¤   ¤   if(mValues[3] && mValues[0] < 12)
5ae508 ¤   ¤   ¤   ¤   hour24 = mValues[0] + 12;
bce140 ¤   ¤   ¤   else if(!mValues[3] && mValues[0] == 12)
7f040d ¤   ¤   ¤   ¤   hour24 = 0;
8601d5 ¤   ¤   ¤   value = (hour24 * 60 * 60) +
90c31d ¤   ¤   ¤   ¤   ¤   (mValues[1] * 60) +
a0d73c ¤   ¤   ¤   ¤   ¤   mValues[2];
e5cdcb ¤   ¤   ¤   break;
a69371 ¤   }
3e5679 ¤   return value;
a3efe6 }
c8af5a
bbaf5a
be6d52 ¤   void
--64bf 00071e8ed5240120147 Page 3 of CGADurationEditField.cp
801764 CGADurationEditField::FinishCreateSelf()
3dbb36 {
6649c0 ¤   LPane::FinishCreateSelf();
1fefe6 }
78af5a
786d52 ¤   void
375b68 CGADurationEditField::ClickSelf(
679508 ¤   const SMouseDownEvent & inMouseDown)
99bb36 {
3e6a4c ¤   Int16¤  oldSection;
aa6fb0 ¤   Int16¤  valueIndex;
c7e913 ¤   Rect¤   localFrame;
fa67c5 ¤
71c22d ¤   LPane::ClickSelf(inMouseDown);
1907e8 ¤   oldSection = mSelectedSection;
d51e02 ¤   for(valueIndex = 0;valueIndex < 4;valueIndex++)
55c7a1 ¤   {
2ba53b ¤   ¤   if(inMouseDown.whereLocal.h <= mHorizontalCutoffs[valueIndex])
705b34 ¤   ¤   {
372ffa ¤   ¤   ¤   mSelectedSection = valueIndex;
75cdcb ¤   ¤   ¤   break;
f70fe4 ¤   ¤   }
fa9371 ¤   }
d00adf ¤   if(valueIndex >= 3 && mType != kTimeDurationType)
4a244a ¤   ¤   mSelectedSection = oldSection;
ae47d1 ¤   if (!IsTarget())
785797 ¤   ¤   SwitchTarget(this);
8a0e24 ¤   else
f8c7a1 ¤   {
fcdf40 ¤   ¤   FocusDraw();
cbf4f5 ¤   ¤   CalcLocalFrameRect (localFrame);
4dc48f ¤   ¤   DrawText(localFrame);
ea9371 ¤   }
d1efe6 }
91af5a
046d52 ¤   void
ef2a83 CGADurationEditField::AdjustCursorSelf(
94e42e ¤   Point¤  ¤   ¤   ¤   inPortPt,
e67f53 ¤   const EventRecord &¤inMacEvent)
51bb36 {
f7521d ¤   LPane::AdjustCursorSelf(inPortPt, inMacEvent);
c8efe6 }
4eaf5a
2d6d52 ¤   void
264fa7 CGADurationEditField::BeTarget()
bebb36 {
282bd4 ¤   LCommander::BeTarget();
5dc137 ¤   Refresh();¤
75efe6 }
1caf5a
0a6d52 ¤   void
47d003 CGADurationEditField::DontBeTarget()
d8bb36 {
526367 ¤   LCommander::DontBeTarget();
7b4fc9 ¤   Refresh();
34efe6 }
e5af5a
386d52 ¤   void
28cfb8 CGADurationEditField::DrawSelf()
23bb36 {
723d18 ¤   StColorPenState¤theColorPenState;
811fc0 ¤   Rect localFrame;
c667c5 ¤
98f118 ¤   CalcLocalFrameRect (localFrame);
96eb77 ¤   ::RGBBackColor (&(UGAColorRamp::GetWhiteColor()));
5455a7 ¤   DrawBackground(localFrame);
32974d ¤   DrawBox(localFrame);
ff4ddb ¤   DrawText(localFrame);
a0efe6 }
c7af5a
586d52 ¤   void
7180ee CGADurationEditField::DrawBackground(
--7e1e 0007ac4f05440120147 Page 4 of CGADurationEditField.cp
860530 ¤   const Rect & localFrame)
3fbb36 {
9ba045 ¤   Rect frameCopy = localFrame;
f067c5 ¤
fb3ec4 ¤   ::InsetRect(&frameCopy, 1, 1);
eda708 ¤   ::EraseRect(&frameCopy);
41efe6 }
aaaf5a
2a6d52 ¤   void
38df5a CGADurationEditField::DrawBox(
9a0530 ¤   const Rect & localFrame)
c7bb36 {
c13d18 ¤   StColorPenState¤theColorPenState;
2695c4 ¤   StDeviceLoop¤   theLoop (localFrame);
207410 ¤   Rect¤   ¤   ¤   innerFrame;
5b0541 ¤   Int16¤  ¤   ¤   depth;
8867c5 ¤
930d8e ¤   ::PenNormal();
baba0a ¤   innerFrame = localFrame;
2301fb ¤   ::InsetRect(&innerFrame, 1, 1);
9bd5be ¤   while (theLoop.NextDepth (depth))·
e6c7a1 ¤   {
1e415c ¤   ¤   if (depth >= 8)
405b34 ¤   ¤   {
6c10c6 ¤   ¤   ¤   DrawGrayBox(localFrame);
c72029 ¤   ¤   ¤   ::ForeColor(blackColor);
c4f96a ¤   ¤   ¤   ::FrameRect(&innerFrame);
c50fe4 ¤   ¤   }
350e1d ¤   ¤   else
ca4c95 ¤   ¤   ¤   ::FrameRect(&localFrame);
d79371 ¤   }
66efe6 }
8f67c5 ¤
a56d52 ¤   void
855bdb CGADurationEditField::DrawGrayBox(
320530 ¤   const Rect & localFrame)
6fbb36 {
f5a045 ¤   Rect frameCopy = localFrame;
4567c5 ¤
a72aec ¤   ::RGBForeColor (&(UGAColorRamp::GetColor(7)));
5f86df ¤   UGraphicUtils::TopLeftSide (frameCopy, 0, 0, 1, 1);
07af5a
cf01bb ¤   ::RGBForeColor (&(UGAColorRamp::GetWhiteColor()));
a4fcc1 ¤   UGraphicUtils::BottomRightSide (frameCopy, 1, 1, 0, 0);
0fefe6 }
30af5a
a86d52 ¤   void
96727b CGADurationEditField::DrawText(
f20530 ¤   const Rect & localFrame)
f3bb36 {
305fc2 ¤   Rect¤   ¤   frame = localFrame,
db8cf2 ¤   ¤   ¤   ¤   valFrame;
78b424 ¤   Str255¤ ¤   valString;
a36fba ¤   Int16¤  ¤   just;
03e02e ¤   Int16¤  ¤   valueIndex,
d6950b ¤   ¤   ¤   ¤   width;
6eb7cf ¤   char¤   ¤   divChar;
ec1606 ¤   FontInfo¤   fInfo;
a867c5 ¤
0dbc7b ¤   ::InsetRect(&frame, 4, 2);
03209e ¤   just = UTextTraits::SetPortTextTraits(mTxtrID);
c8a617 ¤   ::ForeColor(blackColor);
ee61a9 ¤   ::BackColor(whiteColor);
c65d4b ¤   ::GetFontInfo(&fInfo);
03d614 ¤   valFrame = frame;
f0db97 ¤   valFrame.top = valFrame.bottom - fInfo.descent - fInfo.ascent;
339112 ¤   for(valueIndex = 0 ; valueIndex < 4 ; valueIndex++)
4cc7a1 ¤   {
05ca5b ¤   ¤   if(valueIndex == 3)
1b5b34 ¤   ¤   {
e3ace2 ¤   ¤   ¤   if(mType == kTimeDurationType)
7af776 ¤   ¤   ¤   {
--0d01 0000966bf7440120147 Page 5 of CGADurationEditField.cp
4a516f ¤   ¤   ¤   ¤   if(mValues[3])
1fa328 ¤   ¤   ¤   ¤   ¤   CopyPString("\pPM", valString);
32fa07 ¤   ¤   ¤   ¤   else
0bbbc6 ¤   ¤   ¤   ¤   ¤   CopyPString("\pAM", valString);
70a3a6 ¤   ¤   ¤   }
22bb8c ¤   ¤   ¤   else
d0f622 ¤   ¤   ¤   ¤   break;
190fe4 ¤   ¤   }
7065e5 ¤   ¤   if(valueIndex < 3)
055b34 ¤   ¤   {
fec985 ¤   ¤   ¤   ::NumToString(mValues[valueIndex], valString);
0d249c ¤   ¤   ¤   if(valString[0] == 1)
a7f776 ¤   ¤   ¤   {
c94c2f ¤   ¤   ¤   ¤   valString[0]++; valString[2] = valString[1];
97d8b3 ¤   ¤   ¤   ¤   valString[1] = '0';
f5a3a6 ¤   ¤   ¤   }
cf0fe4 ¤   ¤   }
5d2728 ¤   ¤   width = StringWidth(valString);
07c354 ¤   ¤   ::MoveTo(valFrame.left, valFrame.bottom - fInfo.descent);
71dc96 ¤   ¤   ::DrawString(valString);
2e9002 ¤   ¤   valFrame.right = mHorizontalCutoffs[valueIndex] =
c5ded1 ¤   ¤   ¤   ¤   valFrame.left + width;
03fc78 ¤   ¤   if(IsTarget() && mSelectedSection == valueIndex)
5e5b34 ¤   ¤   {
fe3181 ¤   ¤   ¤   UDrawingUtils::SetHiliteModeOn();
929f65 ¤   ¤   ¤   ::InvertRect(&valFrame);
480fe4 ¤   ¤   }
5253f7 ¤   ¤   valFrame.left += width;
1078b8 ¤   ¤   // Draw dividing character
de2685 ¤   ¤   divChar = 0xCA;
d7b4ad ¤   ¤   switch(mType)
4b5b34 ¤   ¤   {
3b9884 ¤   ¤   ¤   case kDateDurationType:
9ea76e ¤   ¤   ¤   ¤   if(valueIndex < 2)
4e88d2 ¤   ¤   ¤   ¤   ¤   divChar = '/';
07f622 ¤   ¤   ¤   ¤   break;
056e54 ¤   ¤   ¤   case kLengthDurationType:
73a76e ¤   ¤   ¤   ¤   if(valueIndex < 2)
2572c3 ¤   ¤   ¤   ¤   {
b12524 ¤   ¤   ¤   ¤   ¤   divChar = ':';
f22613 ¤   ¤   ¤   ¤   }
73fa07 ¤   ¤   ¤   ¤   else
c372c3 ¤   ¤   ¤   ¤   {
dfb4f2 ¤   ¤   ¤   ¤   ¤   divChar = 0;
4e2613 ¤   ¤   ¤   ¤   }
27f622 ¤   ¤   ¤   ¤   break;
13912f ¤   ¤   ¤   case kTimeDurationType:
e6a76e ¤   ¤   ¤   ¤   if(valueIndex < 2)
722524 ¤   ¤   ¤   ¤   ¤   divChar = ':';
fcf622 ¤   ¤   ¤   ¤   break;
dd0fe4 ¤   ¤   }
501b52 ¤   ¤
563c13 ¤   ¤   if( divChar != 0 )
1b5b34 ¤   ¤   {
b89cb4 ¤   ¤   ¤   valString[0] = 1; valString[1] = divChar;
2eaf4e ¤   ¤   ¤   width = StringWidth(valString);
bdd677 ¤   ¤   ¤   ::MoveTo(valFrame.left, valFrame.bottom - fInfo.descent);
09e1fe ¤   ¤   ¤   ::DrawString(valString);
6bd80b ¤   ¤   ¤   valFrame.left += width;
970fe4 ¤   ¤   }
719371 ¤   }
eaefe6 }
06af5a
7b7e69 ¤   Boolean
e45fe9 CGADurationEditField::ValidDay(Int16 month, Int16 day, Int16 year)
e3bb36 {
de4426 ¤   Int16 maxDay;
ff67c5 ¤
6d6dcd ¤   switch(month)
5ec7a1 ¤   {
02b803 ¤   ¤   case 1:
090dbb ¤   ¤   case 3:
--bd7b 00024935e7640120147 Page 6 of CGADurationEditField.cp
b1db62 ¤   ¤   case 5:
286eda ¤   ¤   case 7:
13241d ¤   ¤   case 8:
9558a1 ¤   ¤   case 10:
aaed19 ¤   ¤   case 12:
239694 ¤   ¤   ¤   maxDay = 31;
dbcdcb ¤   ¤   ¤   break;
da81be ¤   ¤   case 4:
233406 ¤   ¤   case 6:
007ec1 ¤   ¤   case 9:
c8027d ¤   ¤   case 11:
9ecc48 ¤   ¤   ¤   maxDay = 30;
08cdcb ¤   ¤   ¤   break;
f05767 ¤   ¤   case 2:
a6b120 ¤   ¤   ¤   if(!(year % 4) && ((year % 100) || !(year % 400)))
c1b176 ¤   ¤   ¤   ¤   maxDay = 29;¤   // its a leap year
a3bb8c ¤   ¤   ¤   else
05226c ¤   ¤   ¤   ¤   maxDay = 28;
6bcdcb ¤   ¤   ¤   break;
ef9371 ¤   }
c3f8a0 ¤   if(day > maxDay || day < 1)
a398aa ¤   ¤   return FALSE;
cb0e24 ¤   else
5d836c ¤   ¤   return TRUE;
0eefe6 }
1aaf5a
797e69 ¤   Boolean
cd680b CGADurationEditField::HandleKeyPress(const EventRecord&¤inKeyEvent)
a0bb36 {
626ff1 ¤   Boolean¤¤   keyHandled¤ = true;
d2cea0 ¤   Int16¤  ¤   theKey¤ ¤   = inKeyEvent.message & charCodeMask;
4ea00a ¤   Rect¤   ¤   localFrame;
9767c5 ¤
cb8a8f ¤   if((inKeyEvent.modifiers & cmdKey) ||
3b792f ¤   ¤   (theKey == char_Return) || (theKey == char_Enter))
81f1fc ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
1c0e24 ¤   else
14c7a1 ¤   {
69d4c4 ¤   ¤   SetUpdateCommandStatus(TRUE);
3e8bc5 ¤   ¤   if(theKey == char_Tab)
ef5b34 ¤   ¤   {
a81ab3 ¤   ¤   ¤   if(mSelectedSection < ((mType == kTimeDurationType) ? 3 : 2))
fc1735 ¤   ¤   ¤   ¤   mSelectedSection++;
aebb8c ¤   ¤   ¤   else
93f776 ¤   ¤   ¤   {
bca403 ¤   ¤   ¤   ¤   // switch to next target....
33a190 ¤   ¤   ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
94a3a6 ¤   ¤   ¤   }
aa0fe4 ¤   ¤   }
d80898 ¤   ¤   else if((theKey >= '0') && (theKey <= '9'))
e25b34 ¤   ¤   {
016656 ¤   ¤   ¤   Int16¤  val = theKey - '0',
dd182a ¤   ¤   ¤   ¤   ¤   newVal,
a92c13 ¤   ¤   ¤   ¤   ¤   newVal1,
5cc377 ¤   ¤   ¤   ¤   ¤   newVal2,
17db20 ¤   ¤   ¤   ¤   ¤   curVal;
a287c7 ¤   ¤   ¤
b7ac52 ¤   ¤   ¤   if(mSelectedSection == 3 && mType == kTimeDurationType)
9e4f5e ¤   ¤   ¤   ¤   mValues[3] = !mValues[3];
8ebb8c ¤   ¤   ¤   else
9ff776 ¤   ¤   ¤   {
f6d04b ¤   ¤   ¤   ¤   curVal = mValues[mSelectedSection];
60a3e5 ¤   ¤   ¤   ¤   if(mType == kDateDurationType && mSelectedSection == 2)
b972c3 ¤   ¤   ¤   ¤   {
dfd212 ¤   ¤   ¤   ¤   ¤   if(curVal >= 2000)
6638b1 ¤   ¤   ¤   ¤   ¤   ¤   curVal -= 2000;
2e4bd6 ¤   ¤   ¤   ¤   ¤   else
8a65a8 ¤   ¤   ¤   ¤   ¤   ¤   curVal -= 1900;
1d2613 ¤   ¤   ¤   ¤   }
ab8ef8 ¤   ¤   ¤   ¤   newVal1 = curVal * 10 + val;
2feac1 ¤   ¤   ¤   ¤   newVal2 = (curVal - ((curVal / 10) * 10)) * 10 + val;
24fa4c ¤   ¤   ¤   ¤   switch(mType)
--54a2 0007b2cb6e040120147 Page 7 of CGADurationEditField.cp
d072c3 ¤   ¤   ¤   ¤   {
a2d5b7 ¤   ¤   ¤   ¤   ¤   case kDateDurationType:
343a96 ¤   ¤   ¤   ¤   ¤   ¤   switch(mSelectedSection)
e68fec ¤   ¤   ¤   ¤   ¤   ¤   {
10df9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 0:
7ee995 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= 1 && newVal1 <= 12)
cfecbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
65c637 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else if(newVal2 >= 1 && newVal2 <= 12)
7503df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal2;
e2f9b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
24beb2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = val;
d5a8d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal < 1)
0ab5bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = 1;
b02b59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(!ValidDay(newVal, mValues[1],
811b29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mValues[2]))
24b4d7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mValues[1] = 1;
bacd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
da8543 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 1:
588ff2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= 1 && newVal1 <= 31 &&
de6ed6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ValidDay(mValues[0], newVal1,
e01b29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mValues[2]))
52ecbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
e2ca48 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else if(newVal2 >= 1 && newVal2 <= 31 &&
f781b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ValidDay(mValues[0], newVal2,
721b29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mValues[2]))
5703df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal2;
4cf9b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
18beb2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = val;
aba8d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal < 1)
e3b5bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = 1;
4fcd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
526a27 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 2:
0c2002 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 <= kMaxYear)
ea7a9e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal1 += 2000;
9ff9b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
9f2787 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal1 += 1900;
a7e4c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= kMinFullYear &&
47ac65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal1 <= kMaxFullYear)
97ecbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
92f9b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
6f31b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
da772b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal2 <= kMaxYear)
a0eb1e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal2 += 2000;
39fc58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
e2b607 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal2 += 1900;
b2016f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal2 >= kMinFullYear &&
ac9bea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal2 <= kMaxFullYear)
ef00a8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal2;
2ba895 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else if(val == 0)
6480ff ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = 2000;
88fc58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
5f2ce8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = mValues[mSelectedSection];
146560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
ec62cb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(!ValidDay(mValues[0], mValues[1],
14fa22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal))
9eb4d7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mValues[1] = 1;
fecd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
5cdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
1800eb ¤   ¤   ¤   ¤   ¤   ¤   break;
cc6b7f ¤   ¤   ¤   ¤   ¤   case kLengthDurationType:
573a96 ¤   ¤   ¤   ¤   ¤   ¤   switch(mSelectedSection)
8b8fec ¤   ¤   ¤   ¤   ¤   ¤   {
73df9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 0:
a3fabd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= 0 && newVal1 <= 99)
8aecbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
26d51f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else if(newVal2 >= 0 && newVal2 <= 99)
e903df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal2;
bcf9b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
babeb2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = val;
accd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
728543 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 1:
7b6a27 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 2:
--92c3 000ff0a03f940120147 Page 8 of CGADurationEditField.cp
376d89 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= 0 && newVal1 <= 59)
23ecbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
b6422b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else if(newVal2 >= 0 && newVal2 <= 59)
1b03df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal2;
d6f9b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
1bbeb2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = val;
81cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
65db3c ¤   ¤   ¤   ¤   ¤   ¤   }
6f00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
74dc1c ¤   ¤   ¤   ¤   ¤   case kTimeDurationType:
583a96 ¤   ¤   ¤   ¤   ¤   ¤   switch(mSelectedSection)
df8fec ¤   ¤   ¤   ¤   ¤   ¤   {
96df9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 0:
2ae995 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= 1 && newVal1 <= 12)
4decbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
55c637 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else if(newVal2 >= 1 && newVal2 <= 12)
0203df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal2;
70f9b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
c1beb2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = val;
f3a8d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal < 1)
1eb5bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = 1;
43cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
6a8543 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 1:
006a27 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 2:
006d89 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= 0 && newVal1 <= 59)
ececbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
c5422b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else if(newVal2 >= 0 && newVal2 <= 59)
bd03df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal2;
8cf9b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
9cbeb2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = val;
a6cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
85db3c ¤   ¤   ¤   ¤   ¤   ¤   }
1300eb ¤   ¤   ¤   ¤   ¤   ¤   break;
082613 ¤   ¤   ¤   ¤   }
9a92d1 ¤   ¤   ¤   ¤   mValues[mSelectedSection] = newVal;
38a3a6 ¤   ¤   ¤   }
530fe4 ¤   ¤   }
f6df40 ¤   ¤   FocusDraw();
7ff4f5 ¤   ¤   CalcLocalFrameRect (localFrame);
40c48f ¤   ¤   DrawText(localFrame);
8f9371 ¤   }
b9c022 ¤   return keyHandled;
7fefe6 }
f2af5a
fe6d52 ¤   void
7d71bd CGADurationEditField::AdjustValue(Int16 direction)
b0bb36 {
5a7343 ¤   Int16¤  newVal1,
4d4c22 ¤   ¤   ¤   newVal;
dee913 ¤   Rect¤   localFrame;
15b53f ¤   Int16¤  oldVals[4];
f867c5 ¤
c65a56 ¤   for( Int16 valIndex = 0; valIndex < 4; valIndex++ )
c00b77 ¤   ¤   oldVals[valIndex] = mValues[valIndex];
27af5a
fc5520 ¤   if(mSelectedSection == 3 && mType == kTimeDurationType)
1fc7a1 ¤   {
289cc3 ¤   ¤   mValues[3] = !mValues[3];
c59371 ¤   }
b80e24 ¤   else
d0c7a1 ¤   {
34d40e ¤   ¤   newVal = mValues[mSelectedSection];
e3a56f ¤   ¤   newVal1 = mValues[mSelectedSection] + direction;
52b4ad ¤   ¤   switch(mType)
035b34 ¤   ¤   {
a19884 ¤   ¤   ¤   case kDateDurationType:
436eb3 ¤   ¤   ¤   ¤   switch(mSelectedSection)
4372c3 ¤   ¤   ¤   ¤   {
baf93d ¤   ¤   ¤   ¤   ¤   case 0:
f1b78c ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= 1 && newVal1 <= 12)
910d84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
ffc8d6 ¤   ¤   ¤   ¤   ¤   ¤   if(!ValidDay(newVal, mValues[1], mValues[2]))
--7ce2 001df28714140120147 Page 9 of CGADurationEditField.cp
ce3ac6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mValues[1] = 1;
4c00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
8aa3e1 ¤   ¤   ¤   ¤   ¤   case 1:
ec619e ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= 1 && newVal1 <= 31)
330d84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
d95e22 ¤   ¤   ¤   ¤   ¤   ¤   if(!ValidDay(mValues[0], newVal, mValues[2]))
cb258b ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = 1;
0300eb ¤   ¤   ¤   ¤   ¤   ¤   break;
cd4c85 ¤   ¤   ¤   ¤   ¤   case 2:
3905b5 ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= kMinFullYear &&
c450f9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal1 <= kMaxFullYear)
870d84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
e2c16a ¤   ¤   ¤   ¤   ¤   ¤   if(!ValidDay(mValues[0], mValues[1], newVal))
243ac6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mValues[1] = 1;
0c00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
552613 ¤   ¤   ¤   ¤   }
52f622 ¤   ¤   ¤   ¤   break;
596e54 ¤   ¤   ¤   case kLengthDurationType:
e66eb3 ¤   ¤   ¤   ¤   switch(mSelectedSection)
a872c3 ¤   ¤   ¤   ¤   {
f0f93d ¤   ¤   ¤   ¤   ¤   case 0:
a8a4a4 ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= 0 && newVal1 <= 99)
880d84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
1300eb ¤   ¤   ¤   ¤   ¤   ¤   break;
38a3e1 ¤   ¤   ¤   ¤   ¤   case 1:
da4c85 ¤   ¤   ¤   ¤   ¤   case 2:
673390 ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= 0 && newVal1 <= 59)
c70d84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
4a00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
3a2613 ¤   ¤   ¤   ¤   }
15f622 ¤   ¤   ¤   ¤   break;
fe912f ¤   ¤   ¤   case kTimeDurationType:
5d6eb3 ¤   ¤   ¤   ¤   switch(mSelectedSection)
1c72c3 ¤   ¤   ¤   ¤   {
f0f93d ¤   ¤   ¤   ¤   ¤   case 0:
20b78c ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= 1 && newVal1 <= 12)
0f0d84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
1d00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
fca3e1 ¤   ¤   ¤   ¤   ¤   case 1:
034c85 ¤   ¤   ¤   ¤   ¤   case 2:
793390 ¤   ¤   ¤   ¤   ¤   ¤   if(newVal1 >= 0 && newVal1 <= 59)
c20d84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newVal = newVal1;
7b00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
1d2613 ¤   ¤   ¤   ¤   }
cbf622 ¤   ¤   ¤   ¤   break;
f60fe4 ¤   ¤   }
a31cc0 ¤   ¤   mValues[mSelectedSection] = newVal;
8c9371 ¤   }
1247d1 ¤   if (!IsTarget())
0f5797 ¤   ¤   SwitchTarget(this);
550e24 ¤   else
5fc7a1 ¤   {
f32165 ¤   ¤   Boolean¤valChanged = FALSE;
9b1b52 ¤   ¤
56d501 ¤   ¤   for( Int16 valIndex = 0; valIndex < 4; valIndex++ )
aa5b34 ¤   ¤   {
3af2ca ¤   ¤   ¤   if( oldVals[valIndex] != mValues[valIndex] )
46f776 ¤   ¤   ¤   {
5e8825 ¤   ¤   ¤   ¤   valChanged = TRUE;
26f622 ¤   ¤   ¤   ¤   break;
19a3a6 ¤   ¤   ¤   }
ac0fe4 ¤   ¤   }
a9af5a
353b48 ¤   ¤   if( valChanged )
5b5b34 ¤   ¤   {
e56e91 ¤   ¤   ¤   FocusDraw();
8b9060 ¤   ¤   ¤   CalcLocalFrameRect(localFrame);
d1f387 ¤   ¤   ¤   DrawText(localFrame);
b60fe4 ¤   ¤   }
6d9371 ¤   }
48efe6 }
dfaf5a
--d1c7 001ccdba0c740120148 Page 1 of CGADurationEditField.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
3c4538 ¤   $Id: CGADurationEditField.h,v 1.1.8.1 1998/11/12 03:09:43 heller Exp $
f0f7f7 ____________________________________________________________________________*/
6a7b7d #pragma once
89af5a
922f94 #include <LCommander.h>
bd25ae #include <LCaption.h>
6caf5a
111bb2 typedef enum DurationType
34bb36 {
9a7c5d ¤   kDateDurationType = 0,
79ec97 ¤   kLengthDurationType,
d6ddd5 ¤   kTimeDurationType
608a62 } DurationType;
8caf5a
0a7fcb enum¤   {¤  kDownAdjust = -1, kUpAdjust = 1 };
b9af5a
06aa92 class CGADurationEditField :¤   public LCaption,
9429b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LCommander
dbbb36 {
085ed4 public:
051779 ¤   enum { class_ID = 'gDEF' };
f467c5 ¤
4b2432 ¤   ¤   ¤   ¤   ¤   ¤   CGADurationEditField(LStream * inStream);
337007 ¤   ¤   ¤   ¤   ¤   ¤   ~CGADurationEditField();
2294aa ¤   ¤   ¤   ¤   ¤   ¤
cbec4e ¤   void¤   ¤   ¤   ¤   SetDurationType(DurationType type);
9a8f8e ¤   void¤   ¤   ¤   ¤   SetDurationValue(UInt32 duration);
feb1a9 ¤   UInt32¤ ¤   ¤   ¤   GetDurationValue();¤// returns seconds
1319d8 ¤   virtual void¤   ¤   AdjustValue(Int16 direction);
c5af5a
8d35cc ¤   virtual Boolean¤¤   HandleKeyPress(const EventRecord&¤  inKeyEvent);
eed3d4 ¤   virtual void¤   ¤   DrawSelf();
3380fd ¤   virtual void¤   ¤   FinishCreateSelf();
ecc555 ¤   virtual void¤   ¤   ClickSelf(
390969 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent & inMouseDown);
fcac36 ¤   virtual void¤   ¤   AdjustCursorSelf(
4aec3e ¤   ¤   ¤   ¤   ¤   ¤   ¤   Point¤  ¤   ¤   ¤   inPortPt,
ed2b14 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord &¤inMacEvent);
1d3b22 ¤   virtual void¤   ¤   BeTarget();
6dda43 ¤   virtual void¤   ¤   DontBeTarget();
4967c5 ¤
e6a2d3 protected:
8b49c4 ¤   void¤   ¤   ¤   ¤   DrawBackground(const Rect & localFrame);
4eed0f ¤   void¤   ¤   ¤   ¤   DrawBox(const Rect & localFrame);
7d2193 ¤   void¤   ¤   ¤   ¤   DrawGrayBox(const Rect & localFrame);
e4091f ¤   void¤   ¤   ¤   ¤   DrawText(const Rect & localFrame);
39701d ¤   Boolean¤¤   ¤   ¤   ValidDay(Int16 month, Int16 day, Int16 year);
a30fb9 private:
3567c5 ¤
73c13a ¤   DurationType¤   ¤   mType;
15c55c ¤   Int16¤  ¤   ¤   ¤   mSelectedSection;
c87fd7 ¤   Int16¤  ¤   ¤   ¤   mHorizontalCutoffs[4];
3d6963 ¤   Int16¤  ¤   ¤   ¤   mValues[4];
d782f7 };
ccaf5a
--b2aa 001fdbb2f4a40120149 Page 1 of CSecureMemory.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
78684d ¤   $Id: CSecureMemory.h,v 1.8.8.1 1998/11/12 03:09:44 heller Exp $
79f7f7 ____________________________________________________________________________*/
e393c2 #ifndef Included_CSecureMemory_h¤   /* [ */
b76ce4 #define Included_CSecureMemory_h
8caf5a
6caf5a
eb0d08 #include "pgpMem.h"
ae0d08 #include "pgpMem.h"
5e4919 #include "pgpUtilities.h"
98af5a
48bf4a #include "MacSecureMemory.h"
65af5a
b50335 /*____________________________________________________________________________
86c373 ¤   Allocates a buffer of the specified size which is held in memory.
27f7f7 ____________________________________________________________________________*/
75cc81 class CSecureMemory
78bb36 {
d95ed4 public:
dde9f4 ¤   void *¤ ¤   mMemory;
e11b1c ¤   PGPSize¤¤   mSize;
3767c5 ¤
34dbdf ¤   CSecureMemory( PGPMemoryMgrRef memMgr, PGPSize size )
a0c7a1 ¤   {
5839dd ¤   ¤   mSize¤  = size;
c340d9 ¤   ¤   mMemory¤= PGPNewSecureData( memMgr, size, 0 );
c52d9d ¤   ¤   pgpAssert( IsntNull( mMemory ) );
ee9371 ¤   }
6c67c5 ¤
4bf376 ¤   ~CSecureMemory( void )
b4c7a1 ¤   {
5ff5f9 ¤   ¤   if ( IsntNull( mMemory ) )
3f5b34 ¤   ¤   {
e015ec ¤   ¤   ¤   PGPFreeData( mMemory );
51fd47 ¤   ¤   ¤   mMemory¤= NULL;
510fe4 ¤   ¤   }
039371 ¤   }
b982f7 };
6aaf5a
0eaf5a
e2fb92 #endif /* ] Included_CSecureMemory_h */
ddaf5a
5faf5a
0d7e4d /*__Editor_settings____
79af5a
c64126 ¤   Local Variables:
9a7b17 ¤   tab-width: 4
a30e6c ¤   End:
f75f8c ¤   vi: ts=4 sw=4
379e9b ¤   vim: si
fdd062 _____________________*/
--d0b8 0005ff3fbe94012014a Page 1 of CSharedProgressBar.cp
4b6438 /*_____________________________________________________________________________
cec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
2d4b0f ¤   All rights reserved.
167cb9 _____________________________________________________________________________*/
8aaf5a
95af5a
77e8ae #include <UDrawingUtils.h>
4eaf5a
45e21b #include "CSharedProgressBar.h"
150d08 #include "pgpMem.h"
0aaf5a
b08e7e static RGBColor¤sRGBBlackColor ¤= {0, 0, 0};
879cb2 static RGBColor¤sRGBWhiteColor ¤= {0xFFFF, 0xFFFF, 0xFFFF};
8daf5a
d022a4 // Remove dependency on qd:
74b1e2 static Pattern¤ sBlackPattern¤  = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
8a5932 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0xFF};
13af5a
eebe7b CSharedProgressBar::CSharedProgressBar(LStream *inStream) : LView(inStream)
01bb36 {
6df936 ¤   InitProgressBar();
beefe6 }
96af5a
2da28d CSharedProgressBar::CSharedProgressBar() : LView()
95bb36 {
c0f936 ¤   InitProgressBar();
54efe6 }
23af5a
f03cfd CSharedProgressBar::~CSharedProgressBar()
cdbb36 {
80efe6 }
70af5a
c66d52 ¤   void
827a24 CSharedProgressBar::InitProgressBar(void)
bebb36 {
baa1ab ¤   mPercentComplete¤   = 0;
6da023 ¤   mState¤ ¤   ¤   ¤   = 0;
7067c5 ¤
8b48e9 ¤   mForeColor.red¤ ¤   = 0x4444;¤  ¤   // Dark gray
27f840 ¤   mForeColor.green¤   = 0x4444;
8d50bf ¤   mForeColor.blue¤¤   = 0x4444;
f967c5 ¤
2214f4 ¤   mBackColor.red¤ ¤   = 0xCCCC;¤  ¤   // Blue/purple
99b6b8 ¤   mBackColor.green¤   = 0xCCCC;
4d7b7e ¤   mBackColor.blue¤¤   = 0xFFFF;
d3efe6 }
fcaf5a
8c6d52 ¤   void
d0b2d7 CSharedProgressBar::DrawSelf(void)
50bb36 {
975c98 #if PGP_DEBUG
0f36d9 ¤   /* Verify that the barber pole icon resources can be found */
f79013 ¤   if( IsNull( GetResource( kMini1BitMask, kIconID ) ) )
c9c7a1 ¤   {
805ad8 ¤   ¤   pgpDebugMsg( "CSharedProgressBar::DrawSelf(): Unable to find "
5b93be ¤   ¤   "needed resources" );
2c9371 ¤   }
107454 #endif
09af5a
93ab30 ¤   if (mPercentComplete > 100 ) {
25eb60 ¤   ¤   Rect¤   ¤   frame;
30d304 ¤   ¤   Rect¤   ¤   iconFrame;
1f87c7 ¤   ¤   ¤
c83667 ¤   ¤   ::PenNormal();
68ccc0 ¤   ¤   CalcLocalFrameRect(frame);
f21b52 ¤   ¤
fdfe46 ¤   ¤   ApplyForeAndBackColors();
a9c62a ¤   ¤   ::FrameRect(&frame);
beaf5a
402293 ¤   ¤   iconFrame.left ¤¤   = frame.left ¤  ¤   + mState - kIconWidth;
b180aa ¤   ¤   iconFrame.right¤¤   = iconFrame.left ¤  + kIconWidth;
5fc854 ¤   ¤   iconFrame.top¤  ¤   = frame.top;
--a03a 000874563cb4012014a Page 2 of CSharedProgressBar.cp
93e517 ¤   ¤   iconFrame.bottom¤   = iconFrame.top¤¤   + kIconHeight;
011b52 ¤   ¤
25e56a ¤   ¤   ::InsetRect(&frame, 1, 1);
53efc7 ¤   ¤   StClipRgnState¤ savedClip(frame);
041b52 ¤   ¤
5967c5 ¤
05c0ff ¤   ¤   while(iconFrame.left < frame.right)
6c5b34 ¤   ¤   {
cf192e ¤   ¤   ¤   ::PlotIconID(&iconFrame, atNone, ttNone, kIconID);
12225e ¤   ¤   ¤   iconFrame.left¤ += kIconWidth;
cee235 ¤   ¤   ¤   iconFrame.right¤+= kIconWidth;
b33b90 ¤   ¤   }¤
411b52 ¤   ¤
88f037 ¤   } else {
86de3b ¤   ¤   Rect¤   barRect;
00949f ¤   ¤   Rect¤   backFillRect;
f08ef0 ¤   ¤   Rect¤   foreFillRect;
151b52 ¤   ¤
c0df40 ¤   ¤   FocusDraw();
c354f3 ¤   ¤   PenNormal();
a21b52 ¤   ¤
9523fa ¤   ¤   CalcLocalFrameRect( barRect );
5b72ab ¤   ¤   FrameRect( &barRect );¤
e09bb5 ¤   ¤   InsetRect( &barRect, 1, 1 );
f11b52 ¤   ¤
339173 ¤   ¤   foreFillRect ¤  ¤   = barRect;
e87832 ¤   ¤   foreFillRect.right ¤= foreFillRect.left + ·( ( ( barRect.right -
c3c662 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   barRect.left ) *
96af17 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPercentComplete ) / 100 );
7e1b52 ¤   ¤
6564c0 ¤   ¤   backFillRect¤   ¤   = barRect;
f2f2de ¤   ¤   backFillRect.left¤  = foreFillRect.right;
601b52 ¤   ¤
0c5b34 ¤   ¤   {
a395a3 ¤   ¤   ¤   StDeviceLoop¤   devLoop( barRect );¤¤
82fbd2 ¤   ¤   ¤   SInt16¤ ¤   ¤   depth;
40091d ¤   ¤   ¤   RGBColor¤   ¤   saveForeColor;
fd54d7 ¤   ¤   ¤   RGBColor¤   ¤   saveBackColor;
6b87c7 ¤   ¤   ¤
110fe7 ¤   ¤   ¤   GetForeColor( &saveForeColor );
31af5a
3602e3 ¤   ¤   ¤   GetBackColor( &saveBackColor );
a3f8f7 ¤   ¤   ¤   RGBBackColor( &sRGBWhiteColor );
0987c7 ¤   ¤   ¤
9b2127 ¤   ¤   ¤   while( devLoop.NextDepth( depth ) )
148cf3 ¤   ¤   ¤   {¤
99bd1b ¤   ¤   ¤   ¤   if( foreFillRect.left != foreFillRect.right )
0b72c3 ¤   ¤   ¤   ¤   {
18aec5 ¤   ¤   ¤   ¤   ¤   if( depth >= 8 )
774859 ¤   ¤   ¤   ¤   ¤   {
b791f5 ¤   ¤   ¤   ¤   ¤   ¤   RGBForeColor( &mForeColor );
761c89 ¤   ¤   ¤   ¤   ¤   }
b14bd6 ¤   ¤   ¤   ¤   ¤   else
544859 ¤   ¤   ¤   ¤   ¤   {
fbdd80 ¤   ¤   ¤   ¤   ¤   ¤   RGBForeColor( &sRGBBlackColor );
221c89 ¤   ¤   ¤   ¤   ¤   }
77ae30 ¤   ¤   ¤   ¤   ¤
c411e6 ¤   ¤   ¤   ¤   ¤   FillRect( &foreFillRect, &sBlackPattern );
7f2613 ¤   ¤   ¤   ¤   }
51af5a
9065c6 ¤   ¤   ¤   ¤   if( backFillRect.left != backFillRect.right )
8472c3 ¤   ¤   ¤   ¤   {
01aec5 ¤   ¤   ¤   ¤   ¤   if( depth >= 8 )
b84859 ¤   ¤   ¤   ¤   ¤   {
4d2f4f ¤   ¤   ¤   ¤   ¤   ¤   RGBForeColor( &mBackColor );
c11c89 ¤   ¤   ¤   ¤   ¤   }
234bd6 ¤   ¤   ¤   ¤   ¤   else
9f4859 ¤   ¤   ¤   ¤   ¤   {
d9ca04 ¤   ¤   ¤   ¤   ¤   ¤   RGBForeColor( &sRGBWhiteColor );
571c89 ¤   ¤   ¤   ¤   ¤   }
8aae30 ¤   ¤   ¤   ¤   ¤
879bb9 ¤   ¤   ¤   ¤   ¤   FillRect( &backFillRect, &sBlackPattern );
--651e 00152856e424012014a Page 3 of CSharedProgressBar.cp
862613 ¤   ¤   ¤   ¤   }
2ba3a6 ¤   ¤   ¤   }
311b52 ¤   ¤
71e536 ¤   ¤   ¤   RGBForeColor( &saveForeColor );
74e832 ¤   ¤   ¤   RGBBackColor( &saveBackColor );
c80fe4 ¤   ¤   }
a09371 ¤   }
f5efe6 }
4caf5a
026d52 ¤   void
273982 CSharedProgressBar::SetPercentComplete(UInt32 percentComplete)
6bbb36 {
af04d3 ¤   if( percentComplete > 100 )
74ff7c ¤   ¤   IncrementState();
ec1b52 ¤   ¤
5c7207 ¤   if(( percentComplete != mPercentComplete ) || (percentComplete > 100))
62c7a1 ¤   {
fdb9cd ¤   ¤   mPercentComplete = percentComplete;
1cfefb ¤   ¤   Draw( nil );
ab9371 ¤   }
dcefe6 }
05af5a
428bfb //¤ Specify the foreground and/or background colors of a Window
bf465d //
90055a //¤ Specify nil for inForeColor and/or inBackColor to leave that
937d33 //¤ color trait unchanged
f3af5a
616d52 ¤   void
e553e9 CSharedProgressBar::SetForeAndBackColors(
6e820c ¤   const RGBColor¤ *foreColor,
6ca17e ¤   const RGBColor¤ *backColor)
26bb36 {
e7c052 ¤   if ( foreColor != nil )
c65925 ¤   ¤   mForeColor = *foreColor;
3367c5 ¤
ace8fb ¤   if( backColor != nil )
044f59 ¤   ¤   mBackColor = *backColor;
e3efe6 }
d3af5a
d2eb4f ¤   void¤
8ec56c CSharedProgressBar::IncrementState(void)
2ebb36 {
e504d8 ¤   mState++;
d18632 ¤   if(mState >= kMaxState)
c8e961 ¤   ¤   mState = 0;
3452e6 ¤   Draw(nil);
52efe6 }
--65da 001be3c463e4012014b Page 1 of CSharedProgressBar.h
4b6438 /*_____________________________________________________________________________
cec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
2d4b0f ¤   All rights reserved.
167cb9 _____________________________________________________________________________*/
8aaf5a
f77b7d #pragma once
b6af5a
592c73 #include <LView.h>
3faf5a
6bddd9 class CSharedProgressBar : public LView
9bbb36 {
f55ed4 public:
29af5a
1e0d90 ¤   enum { class_ID = 'Prog' };
38ad1a ¤   enum { kInfinitePercent = 200 };
89af5a
78650f ¤   ¤   ¤   ¤   ¤   ¤   CSharedProgressBar();
799bef ¤   ¤   ¤   ¤   ¤   ¤   CSharedProgressBar(LStream *inStream);
8767c5 ¤
8c6e3d ¤   virtual¤¤   ¤   ¤   ~CSharedProgressBar();
7caf5a
298abf ¤   virtual void¤   ¤   SetForeAndBackColors(const RGBColor *inForeColor,
37bd9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const RGBColor *inBackColor);
855759 ¤   void¤   ¤   ¤   ¤   SetPercentComplete(UInt32 percentComplete);
44af5a
bfa2d3 protected:
65af5a
39f350 ¤   RGBColor¤   ¤   mForeColor;
1fae9a ¤   RGBColor¤   ¤   mBackColor;
04ae21 ¤   UInt32¤ ¤   ¤   mPercentComplete;
0a8c85 ¤   UInt32¤ ¤   ¤   mState;
4567c5 ¤
da3d8c ¤   void¤   ¤   ¤   InitProgressBar(void);
a07761 ¤   virtual¤void¤   DrawSelf(void);
69af5a
ec9c57 ¤   void¤   ¤   ¤   IncrementState(void);
93af5a
a055cb ¤   enum¤   {
4c6548 ¤   ¤   ¤   ¤   kMaxState¤  = 16,
64f312 ¤   ¤   ¤   ¤   kIconWidth¤ = 16,
a5fd47 ¤   ¤   ¤   ¤   kIconHeight¤= 12,
c63283 ¤   ¤   ¤   ¤   kIconID¤¤   = 4000
abc0bf ¤   ¤   ¤   };
be82f7 };
--57d6 00080ab0ec04012014c Page 1 of PGPDemo.c
4b6438 /*_____________________________________________________________________________
cec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
2d4b0f ¤   All rights reserved.
167cb9 _____________________________________________________________________________*/
8aaf5a
75bbf4 #include "MacFiles.h"
181e0f #include "MacInternet.h"
a16915 #include "MacResources.h"
5faf5a
7439ae #include "PGPDemo.h"
7a1ab1 #include "PGPLibUtils.h"
85af5a
52ba67 #if PGP_DEMO¤   // [
fbaf5a
448ae2 #define¤kDemoEncryptSignEvaluationDays¤ 30
13450f #define¤kDemoTotalEvaluationDays¤   ¤   60
bdaf5a
404c96 #define¤kDemoAbsoluteExpirationYear¤¤   1998
209ea0 #define¤kDemoAbsoluteExpirationMonth¤   6
86419f #define¤kDemoAbsoluteExpirationDay¤ ¤   1
2baf5a
748ce3 // Change the reosurce ID to get a new demo expiration tracking sequence
4fd2c6 #define¤kDemoInfoResType¤   ¤   ¤   ¤   0x44AA6D6F¤ // D(tm)mo
7b232d #define¤kDemoInfoResID¤ ¤   ¤   ¤   ¤   21894
19af5a
c8619d typedef struct DemoInfo
1ebb36 {
786d23 ¤   OSType¤ magic;
8446c0 ¤   UInt32¤ firstUseDate;
d3d048 } DemoInfo;
48af5a
8d9280 ¤   static UInt32
e030a1 GetFirstDemoUseDateFromFile(const FSSpec *fileSpec)
b2bb36 {
e25dda ¤   UInt32¤ ¤   firstUseDate = 0;
99bb1e ¤   Boolean¤¤   saveResLoad;
337a43 ¤   short¤  ¤   saveResFile;
282630 ¤   short¤  ¤   fileRef;
8f67c5 ¤
e74407 ¤   saveResLoad = LMGetResLoad();
90bd22 ¤   saveResFile¤= CurResFile();
3a67c5 ¤
18e7a3 ¤   SetResLoad( FALSE );
0bd8f7 ¤   ¤   fileRef = FSpOpenResFile( fileSpec, fsRdPerm );
fde5c7 ¤   SetResLoad( TRUE );
a167c5 ¤
3fc08f ¤   if( fileRef > 0 )
c0c7a1 ¤   {
f98a2a ¤   ¤   DemoInfo¤   **demoInfoRes;
29af5a
917359 ¤   ¤   UseResFile( fileRef );
231b52 ¤   ¤
dcbc40 ¤   ¤   demoInfoRes = (DemoInfo **) Get1Resource( kDemoInfoResType,
9f1a76 ¤   ¤   ¤   ¤   ¤   kDemoInfoResID );
e1291a ¤   ¤   if( IsntNil( demoInfoRes ) &&
45005d ¤   ¤   ¤   (**demoInfoRes).magic == kDemoInfoResType )
515b34 ¤   ¤   {
eb935b ¤   ¤   ¤   firstUseDate = (**demoInfoRes).firstUseDate;
6f87c7 ¤   ¤   ¤
e3e846 ¤   ¤   ¤   ReleaseResource( (Handle) demoInfoRes );
e80fe4 ¤   ¤   }
f61b52 ¤   ¤
82f63f ¤   ¤   CloseResFile( fileRef );
cdecdc ¤   ¤   UseResFile( saveResFile );
b89371 ¤   }
6c67c5 ¤
f20e99 ¤   SetResLoad( saveResLoad );
62af5a
3636a7 ¤   return( firstUseDate );
deefe6 }
77af5a
809280 ¤   static UInt32
--4cfa 0005081be084012014c Page 2 of PGPDemo.c
403ea7 GetFirstDemoUseDate(void)
efbb36 {
1e3388 ¤   UInt32¤ ¤   firstUseDate = 0xFFFFFFFF;
35fc44 ¤   FSSpec¤ ¤   fileSpec;
f2f773 ¤   short¤  ¤   vRefNum;
b9fc9b ¤   long¤   ¤   dirID;
9967c5 ¤
490d95 ¤   // Check several files and take the latest date.
30a370 ¤   // Start with the shared library
5367c5 ¤
12c976 ¤   if( IsntErr( PGPGetPGPLibraryFSSpec( &fileSpec ) ) )
2ac7a1 ¤   {
8a3717 ¤   ¤   UInt32¤ tempDate;
401b52 ¤   ¤
4bd6fd ¤   ¤   tempDate = GetFirstDemoUseDateFromFile( &fileSpec );
01c0bc ¤   ¤   if( tempDate != 0 && tempDate < firstUseDate )
2e5b34 ¤   ¤   {
821dd8 ¤   ¤   ¤   firstUseDate = tempDate;
7a0fe4 ¤   ¤   }
239371 ¤   }
0867c5 ¤
d7b363 ¤   // Check the Note Pad and Scrapbook files.
6a7d53 ¤   if( IsntErr( FindFolder( kOnSystemDisk, kSystemFolderType,
0807ea ¤   ¤   ¤   kDontCreateFolder, &vRefNum, &dirID ) ) )
c7c7a1 ¤   {
155fc6 ¤   ¤   if( IsntErr( FSMakeFSSpec( vRefNum, dirID, "\pScrapbook File",
9f9894 ¤   ¤   ¤   ¤   ¤   &fileSpec ) ) )
8c5b34 ¤   ¤   {
5ebe43 ¤   ¤   ¤   UInt32¤ tempDate;
f487c7 ¤   ¤   ¤
f90cd4 ¤   ¤   ¤   tempDate = GetFirstDemoUseDateFromFile( &fileSpec );
a8c787 ¤   ¤   ¤   if( tempDate != 0 && tempDate < firstUseDate )
e7f776 ¤   ¤   ¤   {
bf1835 ¤   ¤   ¤   ¤   firstUseDate = tempDate;
5ca3a6 ¤   ¤   ¤   }
aa0fe4 ¤   ¤   }
f1af5a
7f4294 ¤   ¤   if( IsntErr( FSMakeFSSpec( vRefNum, dirID, "\pNote Pad File",
209894 ¤   ¤   ¤   ¤   ¤   &fileSpec ) ) )
4b5b34 ¤   ¤   {
6fbe43 ¤   ¤   ¤   UInt32¤ tempDate;
7d87c7 ¤   ¤   ¤
2e0cd4 ¤   ¤   ¤   tempDate = GetFirstDemoUseDateFromFile( &fileSpec );
5dc787 ¤   ¤   ¤   if( tempDate != 0 && tempDate < firstUseDate )
7bf776 ¤   ¤   ¤   {
091835 ¤   ¤   ¤   ¤   firstUseDate = tempDate;
b3a3a6 ¤   ¤   ¤   }
390fe4 ¤   ¤   }
409371 ¤   }
2167c5 ¤
9a8d3f ¤   if( firstUseDate == 0xFFFFFFFF )
c73307 ¤   ¤   firstUseDate = 0;
6f1b52 ¤   ¤
e636a7 ¤   return( firstUseDate );
33efe6 }
68af5a
d733c8 ¤   static void
2255c7 SaveFirstDemoUseDateToFile(
c9350f ¤   const FSSpec ¤  *fileSpec,
9a9ec6 ¤   UInt32¤ ¤   ¤   firstUseDate)
abbb36 {
c1bb1e ¤   Boolean¤¤   saveResLoad;
ec7a43 ¤   short¤  ¤   saveResFile;
702630 ¤   short¤  ¤   fileRef;
8967c5 ¤
e54407 ¤   saveResLoad = LMGetResLoad();
9bbd22 ¤   saveResFile¤= CurResFile();
6567c5 ¤
3de7a3 ¤   SetResLoad( FALSE );
f06c8b ¤   ¤   fileRef = FSpOpenResFile( fileSpec, fsRdWrPerm );
71e5c7 ¤   SetResLoad( TRUE );
5067c5 ¤
--e517 00043ca8a7c4012014c Page 3 of PGPDemo.c
07c08f ¤   if( fileRef > 0 )
11c7a1 ¤   {
a95dfd ¤   ¤   DemoInfo¤   demoInfo;
b0af5a
867359 ¤   ¤   UseResFile( fileRef );
7aaf5a
d71049 ¤   ¤   (void) Remove1Resource( kDemoInfoResType, kDemoInfoResID, TRUE );
0f1b52 ¤   ¤
c1d6bb ¤   ¤   demoInfo.magic¤ ¤   ¤   = kDemoInfoResType;
74b93d ¤   ¤   demoInfo.firstUseDate ¤ = firstUseDate;
9b1b52 ¤   ¤
d6c3cf ¤   ¤   (void) AddWriteResourcePtr( &demoInfo, sizeof( demoInfo ),
6d6e05 ¤   ¤   ¤   ¤   kDemoInfoResType, kDemoInfoResID, NULL );
191b52 ¤   ¤
a7f63f ¤   ¤   CloseResFile( fileRef );
07ecdc ¤   ¤   UseResFile( saveResFile );
a49371 ¤   }
cbaf5a
060e99 ¤   SetResLoad( saveResLoad );
3aefe6 }
eeaf5a
3a33c8 ¤   static void
72e9a3 SaveFirstDemoUseDate(UInt32 firstUseDate)
f4bb36 {
f9daad ¤   FSSpec¤ fileSpec;
aa0feb ¤   short¤  vRefNum;
5df269 ¤   long¤   dirID;
3567c5 ¤
3eb22a ¤   // Add to several files. Start with the shared library
8867c5 ¤
d3c976 ¤   if( IsntErr( PGPGetPGPLibraryFSSpec( &fileSpec ) ) )
e0c7a1 ¤   {
c38597 ¤   ¤   SaveFirstDemoUseDateToFile( &fileSpec, firstUseDate );
a79371 ¤   }
ac67c5 ¤
68b363 ¤   // Check the Note Pad and Scrapbook files.
767d53 ¤   if( IsntErr( FindFolder( kOnSystemDisk, kSystemFolderType,
2007ea ¤   ¤   ¤   kDontCreateFolder, &vRefNum, &dirID ) ) )
20c7a1 ¤   {
385fc6 ¤   ¤   if( IsntErr( FSMakeFSSpec( vRefNum, dirID, "\pScrapbook File",
659894 ¤   ¤   ¤   ¤   ¤   &fileSpec ) ) )
815b34 ¤   ¤   {
25086b ¤   ¤   ¤   SaveFirstDemoUseDateToFile( &fileSpec, firstUseDate );
3e0fe4 ¤   ¤   }
a6af5a
0b4294 ¤   ¤   if( IsntErr( FSMakeFSSpec( vRefNum, dirID, "\pNote Pad File",
e89894 ¤   ¤   ¤   ¤   ¤   &fileSpec ) ) )
d55b34 ¤   ¤   {
f5086b ¤   ¤   ¤   SaveFirstDemoUseDateToFile( &fileSpec, firstUseDate );
cf0fe4 ¤   ¤   }
7d9371 ¤   }
7befe6 }
efaf5a
96150e ¤   PGPDemoState
035ee2 GetDemoState(void)
c8bb36 {
5e43cf ¤   static PGPDemoState¤state = kDemoStateUnknown;
9667c5 ¤
ae9204 ¤   if( state == kDemoStateUnknown )
dac7a1 ¤   {
5acf94 ¤   ¤   UInt32¤ firstUseDate;
741b52 ¤   ¤
84c9ff ¤   ¤   pgpAssert( kDemoTotalEvaluationDays >=·
a10969 ¤   ¤   ¤   ¤   kDemoEncryptSignEvaluationDays );
b31b52 ¤   ¤
f1f06a ¤   ¤   state = kDemoStateActive;
f81b52 ¤   ¤
4530e4 ¤   ¤   // First time. Check our resources for expiration info.
d21b52 ¤   ¤
89627e ¤   ¤   firstUseDate = GetFirstDemoUseDate();
6ebda1 ¤   ¤   if( firstUseDate != 0 )
435b34 ¤   ¤   {
--40e2 000acf2a9204012014c Page 4 of PGPDemo.c
30126b ¤   ¤   ¤   UInt32¤ ¤   now;
3b92c6 ¤   ¤   ¤   UInt32¤ ¤   absExpiration;
a48323 ¤   ¤   ¤   DateTimeRec¤dtRec;
ec87c7 ¤   ¤   ¤
f4bd43 ¤   ¤   ¤   GetDateTime( &now );
4787c7 ¤   ¤   ¤
e7d3ad ¤   ¤   ¤   // Check for absolute expiration first.
0c87c7 ¤   ¤   ¤
9e9f25 ¤   ¤   ¤   dtRec.year¤ ¤   = kDemoAbsoluteExpirationYear;
0df922 ¤   ¤   ¤   dtRec.month¤¤   = kDemoAbsoluteExpirationMonth;
63ddee ¤   ¤   ¤   dtRec.day¤  ¤   = kDemoAbsoluteExpirationDay;
2603cb ¤   ¤   ¤   dtRec.hour¤ ¤   = 0;
3e7579 ¤   ¤   ¤   dtRec.minute¤   = 0;
034bcc ¤   ¤   ¤   dtRec.second¤   = 0;
db3273 ¤   ¤   ¤   dtRec.dayOfWeek¤= 0;
5e87c7 ¤   ¤   ¤
85c764 ¤   ¤   ¤   DateToSeconds( &dtRec, &absExpiration );
8387c7 ¤   ¤   ¤
e79d60 ¤   ¤   ¤   if( now >= absExpiration )
87f776 ¤   ¤   ¤   {
48cb80 ¤   ¤   ¤   ¤   state = kDemoStateExpired;
67a3a6 ¤   ¤   ¤   }
4b34a0 ¤   ¤   ¤   else if( now > firstUseDate +
a41ff1 ¤   ¤   ¤   ¤   ¤   ¤   ( kDemoTotalEvaluationDays * 24L * 60L * 60L ) )
98f776 ¤   ¤   ¤   {
cbcb80 ¤   ¤   ¤   ¤   state = kDemoStateExpired;
61a3a6 ¤   ¤   ¤   }
4834a0 ¤   ¤   ¤   else if( now > firstUseDate +
e8cde6 ¤   ¤   ¤   ¤   ¤   ¤   ( kDemoEncryptSignEvaluationDays * 24L * 60L * 60L ) )
1ef776 ¤   ¤   ¤   {
6447e2 ¤   ¤   ¤   ¤   state = kDemoStateEncryptionSigningDisabled;
c7a3a6 ¤   ¤   ¤   }
080fe4 ¤   ¤   }
bd0e1d ¤   ¤   else
865b34 ¤   ¤   {
67ae39 ¤   ¤   ¤   GetDateTime( &firstUseDate );
6e0fe4 ¤   ¤   }
981b52 ¤   ¤
a4466e ¤   ¤   SaveFirstDemoUseDate( firstUseDate );
c49371 ¤   }
cfaf5a
19e76c ¤   return( state );
80efe6 }
f3af5a
6e63ee #define¤kDemoOrderDialogResID¤  28395
eeeeb4 #define¤kDemoExpiredAlertResID¤ 28396
4667c5 ¤
3daf5a
027353 enum
55bb36 {
8d22f6 ¤   kNotYetButton¤  = 1,
0d3f4e ¤   kOrderButton¤   = 2
ff82f7 };
08af5a
48b374 ¤   static short
224e87 ShowOrderDialog(Boolean canOpenURL)
b6bb36 {
1bfb29 ¤   GrafPtr¤¤   savePort;
0be6bc ¤   DialogRef¤  theDialog;
816ebf ¤   short¤  ¤   itemHit = 0;
ff67c5 ¤
90f732 ¤   GetPort( &savePort );
39af5a
eb3d7a ¤   theDialog = GetNewDialog( kDemoOrderDialogResID, NULL, (WindowPtr) -1L );
011a3b ¤   if( IsntNil( theDialog ) )
ebc7a1 ¤   {
c18622 ¤   ¤   SetPort( theDialog );
6d1b52 ¤   ¤
ad0875 ¤   ¤   SetDialogDefaultItem( theDialog, kNotYetButton );
ccaf5a
c97254 ¤   ¤   if( ! canOpenURL )
ac5b34 ¤   ¤   {
--3af5 000d5c9ccfa4012014c Page 5 of PGPDemo.c
b412ba ¤   ¤   ¤   HideDialogItem( theDialog, kOrderButton );
870fe4 ¤   ¤   }
401b52 ¤   ¤
b1057e ¤   ¤   SysBeep( 1 );
691b52 ¤   ¤
1a651f ¤   ¤   ShowWindow( theDialog );
be5770 ¤   ¤   SelectWindow( theDialog );
32af5a
3c0c19 ¤   ¤   do
c75b34 ¤   ¤   {
ce1477 ¤   ¤   ¤   ModalDialog( NULL, &itemHit );
f134d9 ¤   ¤   } while( itemHit != kNotYetButton && itemHit != kOrderButton );
a31b52 ¤   ¤
596eae ¤   ¤   DisposeDialog( theDialog );
419371 ¤   }
1267c5 ¤
6e6d1e ¤   SetPort( savePort );
6767c5 ¤
bc80d4 ¤   return( itemHit );
3aefe6 }
99af5a
57150e ¤   PGPDemoState
24b80e ShowDemoDialog(Boolean canOpenURL)
2ebb36 {
0b3097 ¤   PGPDemoState¤   state = GetDemoState();
6aaf5a
220dd9 ¤   if( state == kDemoStateEncryptionSigningDisabled ||
15c2ab ¤   ¤   state == kDemoStateExpired )
47c7a1 ¤   {
462070 ¤   ¤   FSSpec¤ libFileSpec;
e31b52 ¤   ¤
2feead ¤   ¤   if( IsntErr( PGPGetPGPLibraryFSSpec( &libFileSpec ) ) )
635b34 ¤   ¤   {
33ffe4 ¤   ¤   ¤   Boolean¤saveResLoad;
e4b4a9 ¤   ¤   ¤   short¤  saveResFile;
2f5b24 ¤   ¤   ¤   short¤  fileRef;
1d87c7 ¤   ¤   ¤
3a979a ¤   ¤   ¤   saveResLoad = LMGetResLoad();
38f38b ¤   ¤   ¤   saveResFile¤= CurResFile();
eb87c7 ¤   ¤   ¤
4168a8 ¤   ¤   ¤   SetResLoad( FALSE );
ee69a3 ¤   ¤   ¤   ¤   fileRef = FSpOpenResFile( &libFileSpec, fsRdPerm );
78befc ¤   ¤   ¤   SetResLoad( TRUE );
131b52 ¤   ¤
b48e6e ¤   ¤   ¤   if( fileRef > 0 )
5df776 ¤   ¤   ¤   {
07bed5 ¤   ¤   ¤   ¤   UseResFile( fileRef );
deaf5a
b720cf ¤   ¤   ¤   ¤   FlushEvents( everyEvent, 0 );
9f04e4 ¤   ¤   ¤   ¤   InitCursor();
012b85 ¤   ¤   ¤   ¤
e0800c ¤   ¤   ¤   ¤   if( state == kDemoStateEncryptionSigningDisabled )
2f72c3 ¤   ¤   ¤   ¤   {
a39507 ¤   ¤   ¤   ¤   ¤   short¤  itemHit;
9eae30 ¤   ¤   ¤   ¤   ¤
680145 ¤   ¤   ¤   ¤   ¤   itemHit = ShowOrderDialog( canOpenURL );
bda67a ¤   ¤   ¤   ¤   ¤   if( itemHit == kOrderButton )
5f4859 ¤   ¤   ¤   ¤   ¤   {
be99c9 ¤   ¤   ¤   ¤   ¤   ¤   if( IsErr( OpenURL( "\phttp://www.pgp.com" ) ) )
ac8fec ¤   ¤   ¤   ¤   ¤   ¤   {
e2af0a ¤   ¤   ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
c0af0a ¤   ¤   ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
e5af0a ¤   ¤   ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
51db3c ¤   ¤   ¤   ¤   ¤   ¤   }
401c89 ¤   ¤   ¤   ¤   ¤   }
322613 ¤   ¤   ¤   ¤   }
aefa07 ¤   ¤   ¤   ¤   else
2172c3 ¤   ¤   ¤   ¤   {
0430fd ¤   ¤   ¤   ¤   ¤   StopAlert( kDemoExpiredAlertResID, NULL );
ff2613 ¤   ¤   ¤   ¤   }
e1af5a
d5ceba ¤   ¤   ¤   ¤   CloseResFile( fileRef );
--3ede 001a8f5d2714012014c Page 6 of PGPDemo.c
34a363 ¤   ¤   ¤   ¤   UseResFile( saveResFile );
91a3a6 ¤   ¤   ¤   }
3787c7 ¤   ¤   ¤
83c315 ¤   ¤   ¤   SetResLoad( saveResLoad );
e5af5a
7b2a8d ¤   ¤   ¤   if( state == kDemoStateExpired )
9cf776 ¤   ¤   ¤   {
910b67 ¤   ¤   ¤   ¤   // DeletePGPLib if the demo has expired
bcdc32 ¤   ¤   ¤   ¤   if( IsErr( FSpDelete( &libFileSpec ) ) )
7b72c3 ¤   ¤   ¤   ¤   {
ddae44 ¤   ¤   ¤   ¤   ¤   FSSpec¤ trashSpec;
a9ae30 ¤   ¤   ¤   ¤   ¤
78325b ¤   ¤   ¤   ¤   ¤   // Move to trash if we cannot delete the file.
27ae30 ¤   ¤   ¤   ¤   ¤
c3aedf ¤   ¤   ¤   ¤   ¤   if( IsntErr( FindFolder( libFileSpec.vRefNum,
7d362f ¤   ¤   ¤   ¤   ¤   ¤   kTrashFolderType, kCreateFolder, &trashSpec.vRefNum,
4b457c ¤   ¤   ¤   ¤   ¤   ¤   &trashSpec.parID ) ) )
8d4859 ¤   ¤   ¤   ¤   ¤   {
69eabb ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( FSMakeFSSpec( trashSpec.vRefNum,
5b58f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   trashSpec.parID, NULL, &trashSpec ) ) )
e78fec ¤   ¤   ¤   ¤   ¤   ¤   {
09c775 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) FSpCatMove( &libFileSpec, &trashSpec );
54db3c ¤   ¤   ¤   ¤   ¤   ¤   }
3f1c89 ¤   ¤   ¤   ¤   ¤   }
042613 ¤   ¤   ¤   ¤   }
0c5a2a ¤   ¤   ¤   }¤
7f0fe4 ¤   ¤   }
710e1d ¤   ¤   else
f35b34 ¤   ¤   {
b0c2cb ¤   ¤   ¤   SysBeep( 1 );
180fe4 ¤   ¤   }
14af5a
a69371 ¤   }
d467c5 ¤
0ae76c ¤   return( state );
a4efe6 }
63af5a
a86627 #endif¤ // ]¶
--8ba9 00163895cd04012014d Page 1 of PGPDemo.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
a35efe ¤   $Id: PGPDemo.h,v 1.2.18.1 1998/11/12 03:09:46 heller Exp $
ecf7f7 ____________________________________________________________________________*/
827b7d #pragma once
60af5a
40e9a7 #ifndef PGP_DEMO
7ba5dc PGP_DEMO is defined in PGPmailCompileFlags.h
790ad9 be sure to #include that file in your prefix
b47454 #endif
e6af5a
f5ba67 #if PGP_DEMO¤   // [
21af5a
3e3379 #ifdef __cplusplus
156dad extern "C" {
b37454 #endif
2faf5a
34233f typedef enum
4dbb36 {
31bfd3 ¤   kDemoStateUnknown¤  = 1,
127df7 ¤   kDemoStateActive,
92bc33 ¤   kDemoStateEncryptionSigningDisabled,
444284 ¤   kDemoStateExpired
e2af5a
10ab1a } PGPDemoState;
44af5a
d79cb1 PGPDemoState¤   GetDemoState(void);
5caf5a
8c32dd // App should quit if ShowDemoDialog() returns kDemoExpired
79087c PGPDemoState¤   ShowDemoDialog(Boolean canOpenURL);
11af5a
ab3379 #ifdef __cplusplus
f7efe6 }
647454 #endif
faaf5a
636627 #endif¤ // ]¶
--e47a 000af275e824012014e Page 1 of PGPOpenAdminPrefs.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
df0b7a ¤   $Id: PGPOpenAdminPrefs.cp,v 1.1.8.1 1998/11/12 03:09:47 heller Exp $
79f7f7 ____________________________________________________________________________*/
73af5a
574b15 #include <TextUtils.h>
34af5a
0fb397 #include "PGPOpenPrefs.h"
66af5a
9e76b7 #include "MacErrors.h"
a7bbf4 #include "MacFiles.h"
97c97b #include "pgpClientPrefs.h"
083991 #include "pgpAdminPrefs.h"
1291b9 #include "pgpSDKPrefs.h"
63894b #include "pgpFileSpec.h"
7476f0 #include "CComboError.h"
b1628e #include "pgpClientErrors.h"
dfa02f #include "pgpClientLib.h"
32af5a
9cbf19 const ResID¤¤   kPrefsNameListID¤   ¤   ¤   =¤  14444;
aa6e90 const short¤¤   kAdminPrefsFilenameStrIndex¤=¤  2;
afaf5a
b10335 /*____________________________________________________________________________
8942ae ¤   Acts differently, depending on whether this is an administrator build
d009e7 ¤   or not. ·If it's an admin build, then the admin prefs will be created
043fea ¤   if they don't exist. ·If it's not an admin build, then they won't be
83e298 ¤   created and a kPGPError_AdminPrefsNotFound error will be returned.
22f7f7 ____________________________________________________________________________*/
91af5a
edc744 ¤   PGPError
94b6f9 PGPOpenAdminPrefs(
630185 ¤   PGPMemoryMgrRef¤memoryMgr,
caf7d4 ¤   PGPPrefRef¤ ¤   *prefRef)
a1bb36 {
13de6f #if PGP_BUSINESS_SECURITY¤  // [
0a865f ¤   CComboError¤¤   err;
b16403 ¤   FSSpec¤ ¤   ¤   fsSpec;
a2c1af ¤   PGPBoolean¤ ¤   created = FALSE;
1267c5 ¤
f9d8b5 ¤   PGPValidatePtr( prefRef );
6651a4 ¤   *prefRef¤   = NULL;
2767c5 ¤
c07d00 ¤   err.err = FindPGPPreferencesFolder(-1, &fsSpec.vRefNum, &fsSpec.parID);
bfed80 ¤   if ( err.IsntError() )
f2c7a1 ¤   {
4092fe ¤   ¤   PGPBoolean¤ adminConfig;
921b52 ¤   ¤
84fbdb ¤   ¤   GetIndString( fsSpec.name, kPrefsNameListID,
ceb967 ¤   ¤   ¤   ¤   kAdminPrefsFilenameStrIndex);
0c1942 ¤   ¤   pgpAssert( fsSpec.name[0] != 0 );
961b52 ¤   ¤
42750c ¤   ¤   /* create it if it doesn't already exist */
1fd93c ¤   ¤   if ( ! FSpExists( &fsSpec ) &&
0649f0 ¤   ¤   ¤   IsntPGPError( err.pgpErr = PGPIsAdminConfigured( &adminConfig )))
cc5b34 ¤   ¤   {
9283fb ¤   ¤   ¤   if( !adminConfig )
caf776 ¤   ¤   ¤   {
2f851a ¤   ¤   ¤   ¤   // only an administrator build is allowed to create these
79b2d2 ¤   ¤   ¤   ¤   err.err¤= FSpCreate( &fsSpec,
dcdd3d ¤   ¤   ¤   ¤   ¤   ¤   kPGPMacFileCreator_Keys, 'pref', smSystemScript );
3821ef ¤   ¤   ¤   ¤   created = TRUE;
dca3a6 ¤   ¤   ¤   }
36bb8c ¤   ¤   ¤   else
d43b35 ¤   ¤   ¤   ¤   err.pgpErr¤ = kPGPClientError_AdminPrefsNotFound;
7f0fe4 ¤   ¤   }
281b52 ¤   ¤
66f9a8 ¤   ¤   if ( err.IsntError() )
8c5b34 ¤   ¤   {
81cfa2 ¤   ¤   ¤   PFLFileSpecRef¤ fsRef¤  = NULL;
af1b52 ¤   ¤
--714f 001811798024012014e Page 2 of PGPOpenAdminPrefs.cp
136869 ¤   ¤   ¤   err.pgpErr¤ = PFLNewFileSpecFromFSSpec( memoryMgr, &fsSpec, &fsRef);
5a75d7 ¤   ¤   ¤   if ( err.IsntError() )
4bf776 ¤   ¤   ¤   {
031e73 ¤   ¤   ¤   ¤   err.pgpErr = PGPOpenPrefFile(fsRef, adminDefaults,·
7178d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   adminDefaultsSize, prefRef);
1eaf5a
82c95b ¤   ¤   ¤   ¤   PFLFreeFileSpec( fsRef );
c2a3a6 ¤   ¤   ¤   }
5a0fe4 ¤   ¤   }
609371 ¤   }
3067c5 ¤
d21be7 ¤   return( err.ConvertToPGPError() );
51db21 #else
a29b33 ¤   memoryMgr;
6c1c11 ¤   prefRef;
c210dc ¤   pgpAssert(0);¤  // This function is *only* called in non-BS builds
f7e63f ¤   return kPGPError_FeatureNotAvailable;
87c812 #endif¤ // ] PGP_BUSINESS_SECURITY
32efe6 }
a9af5a
81af5a
--ab3d 0006d2ac0114012014f Page 1 of PGPOpenPrefs.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
284d8a ¤   $Id: PGPOpenPrefs.cp,v 1.15.8.1 1998/11/12 03:09:47 heller Exp $
2ff7f7 ____________________________________________________________________________*/
daaf5a
974b15 #include <TextUtils.h>
aeaf5a
0bb397 #include "PGPOpenPrefs.h"
88af5a
3276b7 #include "MacErrors.h"
02bbf4 #include "MacFiles.h"
a1c97b #include "pgpClientPrefs.h"
223991 #include "pgpAdminPrefs.h"
1f91b9 #include "pgpSDKPrefs.h"
d4894b #include "pgpFileSpec.h"
5376f0 #include "CComboError.h"
77628e #include "pgpClientErrors.h"
cdaf5a
a3bf19 const ResID¤¤   kPrefsNameListID¤   ¤   ¤   =¤  14444;
5bf199 const short¤¤   kClientPrefsFilenameStrIndex=¤  1;
00af5a
0aaf5a
6cc744 ¤   PGPError
b1e37f PGPOpenClientPrefs(
8b0185 ¤   PGPMemoryMgrRef¤memoryMgr,
32f7d4 ¤   PGPPrefRef¤ ¤   *prefRef)
c5bb36 {
05865f ¤   CComboError¤¤   err;
6c6403 ¤   FSSpec¤ ¤   ¤   fsSpec;
98cac9 ¤   Boolean¤¤   ¤   created = FALSE;
2767c5 ¤
41d8b5 ¤   PGPValidatePtr( prefRef );
fc51a4 ¤   *prefRef¤   = NULL;
8a67c5 ¤
cf7d00 ¤   err.err = FindPGPPreferencesFolder(-1, &fsSpec.vRefNum, &fsSpec.parID);
97ed80 ¤   if ( err.IsntError() )
cbc7a1 ¤   {
4c47c4 ¤   ¤   PFLFileSpecRef¤ fsRef¤  = NULL;
f61b52 ¤   ¤
bcfbdb ¤   ¤   GetIndString( fsSpec.name, kPrefsNameListID,
233188 ¤   ¤   ¤   ¤   ¤   kClientPrefsFilenameStrIndex);
c21942 ¤   ¤   pgpAssert( fsSpec.name[0] != 0 );
b91b52 ¤   ¤
b5750c ¤   ¤   /* create it if it doesn't already exist */
78a183 ¤   ¤   if ( ! FSpExists( &fsSpec ) )
9a5b34 ¤   ¤   {
69d417 ¤   ¤   ¤   err.err¤= FSpCreate( &fsSpec, 'pgpK', 'pref', smSystemScript );
198cb1 ¤   ¤   ¤   created = TRUE;
fb0fe4 ¤   ¤   }
ff1b52 ¤   ¤
91f9a8 ¤   ¤   if ( err.IsntError() )
c46869 ¤   ¤   ¤   err.pgpErr¤ = PFLNewFileSpecFromFSSpec( memoryMgr, &fsSpec, &fsRef);
8c87c7 ¤   ¤   ¤
30f9a8 ¤   ¤   if ( err.IsntError() )
fc5b34 ¤   ¤   {
829318 ¤   ¤   ¤   err.pgpErr = PGPOpenPrefFile(fsRef, clientDefaults,·
126f4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   clientDefaultsSize, prefRef);
da87c7 ¤   ¤   ¤
07f5b5 ¤   ¤   ¤   PFLFreeFileSpec( fsRef );
d80fe4 ¤   ¤   }
f39371 ¤   }
a267c5 ¤
8e1be7 ¤   return( err.ConvertToPGPError() );
30efe6 }
bfaf5a
b1c744 ¤   PGPError
2ede22 PGPGetGroupsFileFSSpec(FSSpec *fileSpec)
fcbb36 {
2dfb19 ¤   PGPError¤   ¤   err;
6d8a97 ¤   PGPContextRef¤  context;
--6211 001ec91fdd04012014f Page 2 of PGPOpenPrefs.cp
2a67c5 ¤
2d8d96 ¤   PGPValidatePtr( fileSpec );
4eaf5a
dfdc8f ¤   err = PGPNewContext( kPGPsdkAPIVersion, &context );
7cb1f0 ¤   if( IsntPGPError( err ) )
77c7a1 ¤   {
384dd6 ¤   ¤   err = PGPsdkLoadDefaultPrefs( context );
4a86f8 ¤   ¤   if( IsntPGPError( err ) )
765b34 ¤   ¤   {
bfbf46 ¤   ¤   ¤   PGPFileSpecRef¤ fileSpecRef;
8f1b52 ¤   ¤
8481fb ¤   ¤   ¤   err = PGPsdkPrefGetFileSpec( context, kPGPsdkPref_GroupsFile,
fc71f5 ¤   ¤   ¤   ¤   ¤   ¤   &fileSpecRef );
44698b ¤   ¤   ¤   if( IsntPGPError( err ) )
4cf776 ¤   ¤   ¤   {
565ea8 ¤   ¤   ¤   ¤   err = PGPGetFSSpecFromFileSpec( fileSpecRef, fileSpec );
0f2b85 ¤   ¤   ¤   ¤
3cdce1 ¤   ¤   ¤   ¤   PGPFreeFileSpec( fileSpecRef );
d5a3a6 ¤   ¤   ¤   }
910fe4 ¤   ¤   }
051b52 ¤   ¤
81937b ¤   ¤   PGPFreeContext( context );
459371 ¤   }
5767c5 ¤
2bdeb7 ¤   return( err );
f2efe6 }
ecaf5a
--0b83 0019cb7d05040120150 Page 1 of PGPOpenPrefs.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
1548ce ¤   $Id: PGPOpenPrefs.h,v 1.10.8.1 1998/11/12 03:09:48 heller Exp $
01f7f7 ____________________________________________________________________________*/
ed7b7d #pragma once
9daf5a
054919 #include "pgpUtilities.h"
ffe8b2 #include "pflPrefs.h"
25af5a
5a99c6 PGP_BEGIN_C_DECLARATIONS
1dcbcf #if PRAGMA_IMPORT_SUPPORTED
aeb981 #pragma import on
c27454 #endif
7baf5a
7faf5a
f9af5a
c47788 PGPError PGPOpenClientPrefs(¤   PGPMemoryMgrRef¤memoryMgr,
ac0c88 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPPrefRef¤ ¤   *prefRef);
d1da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
d5fff5 PGPError PGPOpenAdminPrefs(¤¤   PGPMemoryMgrRef¤memoryMgr,
fcc122 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPPrefRef¤ ¤   *prefRef );
3daf5a
e1acb8 PGPError PGPGetGroupsFileFSSpec(FSSpec¤ ¤   ¤   *fileSpec);
2caf5a
87af5a
3caf5a
08cbcf #if PRAGMA_IMPORT_SUPPORTED
2e2ced #pragma import reset
5f7454 #endif
be1254 PGP_END_C_DECLARATIONS
9caf5a
--f920 00033be70d540120151 Page 1 of PGPSharedEncryptDecrypt.cp
4b6438 /*_____________________________________________________________________________
cec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
2d4b0f ¤   All rights reserved.
167cb9 _____________________________________________________________________________*/
8aaf5a
f3feb2 #include <stdio.h>
f4324c #include <string.h>
fbaf5a
44bbf4 #include "MacFiles.h"
46c110 #include "pgpMacMemory.h"
0485c2 #include "MacStrings.h"
3974e2 #include "MacProcesses.h"
0f76b7 #include "MacErrors.h"
839f63 #include "pgpEncode.h"
e32f8d #include "pgpErrors.h"
eca076 #include "pgpKeys.h"
a54919 #include "pgpUtilities.h"
e3af5a
6976f0 #include "CComboError.h"
95af5a
7ef8d2 #include "PGPSharedEncryptDecrypt.h"
40af5a
28ef7f const OSType¤   kPGPkeysType¤   =¤  'APPL';
eff8b3 const OSType¤   kPGPkeysCreator¤=¤  'pgpK';
87af5a
c0b5ce const DescType¤ kAEPGPClass¤¤   =¤  'PGP ';
cb5813 const DescType¤ kAEImportKey¤   =¤  'IKey';
34af5a
1bc744 ¤   PGPError
daaeb6 PGPSharedForEachKeyDo(
64284d ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   context,
9873b9 ¤   PGPKeyOrdering ¤¤   ¤   ¤   ¤   keyOrdering,
2762c0 ¤   PGPSharedForEackKeyDoProcPtr¤   callbackProc,
8d0617 ¤   void¤   ¤   ¤   ¤   ¤   ¤   ¤   *callbackData)
9fbb36 {
f33bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
b9554e ¤   PGPKeySetRef¤   keySetRef;
4e1b52 ¤   ¤
056999 ¤   err = PGPOpenDefaultKeyRings( context, 0, &keySetRef );
36b1f0 ¤   if( IsntPGPError( err ) )
a4c7a1 ¤   {
36f5ae ¤   ¤   PGPKeyListRef¤  keyListRef;
9b1b52 ¤   ¤
1bfd5c ¤   ¤   err = PGPOrderKeySet( keySetRef, keyOrdering, &keyListRef );
6d86f8 ¤   ¤   if( IsntPGPError( err ) )
ba5b34 ¤   ¤   {
542559 ¤   ¤   ¤   PGPKeyIterRef¤  keyIterator;
2b87c7 ¤   ¤   ¤
ab211f ¤   ¤   ¤   err = PGPNewKeyIter( keyListRef, &keyIterator );
40698b ¤   ¤   ¤   if( IsntPGPError( err ) )
eff776 ¤   ¤   ¤   {
8abca8 ¤   ¤   ¤   ¤   PGPKeyRef¤  theKey;
f92b85 ¤   ¤   ¤   ¤
324248 ¤   ¤   ¤   ¤   err = PGPKeyIterNext( keyIterator, &theKey );
5a7f42 ¤   ¤   ¤   ¤   while( IsntErr( err ) )
3c72c3 ¤   ¤   ¤   ¤   {
6bd251 ¤   ¤   ¤   ¤   ¤   err = (*callbackProc)( keyIterator, theKey,
754921 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   callbackData );
3b14ec ¤   ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
4100eb ¤   ¤   ¤   ¤   ¤   ¤   break;
fc94aa ¤   ¤   ¤   ¤   ¤   ¤
b7fe51 ¤   ¤   ¤   ¤   ¤   err = PGPKeyIterNext( keyIterator, &theKey );
002613 ¤   ¤   ¤   ¤   }
792b85 ¤   ¤   ¤   ¤
4fc4e0 ¤   ¤   ¤   ¤   if( err == kPGPError_EndOfIteration )
00b37b ¤   ¤   ¤   ¤   ¤   err = kPGPError_NoErr;
30ae30 ¤   ¤   ¤   ¤   ¤
2aa5ab ¤   ¤   ¤   ¤   PGPFreeKeyIter( keyIterator );
9da3a6 ¤   ¤   ¤   }
0e87c7 ¤   ¤   ¤
b74b75 ¤   ¤   ¤   PGPFreeKeyList( keyListRef );
330fe4 ¤   ¤   }
--eab5 000fae55fc740120151 Page 2 of PGPSharedEncryptDecrypt.cp
2a67c5 ¤
0989a9 ¤   ¤   PGPFreeKeySet( keySetRef );
a49371 ¤   }
5e67c5 ¤
9f1c55 ¤   if( err == kPGPError_UserAbort )
8770bb ¤   ¤   err = kPGPError_NoErr;
eaaf5a
8cdeb7 ¤   return( err );
0cefe6 }
07af5a
b4d235 typedef struct KeyCounts
16bb36 {
3eb268 ¤   UInt32¤ ¤   publicKeys;
75f2de ¤   UInt32¤ ¤   privateKeys;
81af5a
2652e8 } KeyCounts;
d8af5a
6566dd ¤   static PGPError
045c8c CountKeysInDefaultKeyringCallbackProc(
01c545 ¤   PGPKeyIterRef¤  keyIterator,
b58c1a ¤   PGPKeyRef ¤ ¤   theKey,
77a91b ¤   void ¤  ¤   ¤   *userData)
b1bb36 {
fcaddb ¤   PGPBoolean¤ isPrivateKey = FALSE;
5967c5 ¤
473dca ¤   #pragma unused( keyIterator )
b367c5 ¤
29cc52 ¤   ++((KeyCounts *) userData)->publicKeys;
af67c5 ¤
684bb6 ¤   PGPGetKeyBoolean( theKey, kPGPKeyPropIsSecret, &isPrivateKey );
e907db ¤   if( isPrivateKey )
a8c7a1 ¤   {
023ee4 ¤   ¤   ++((KeyCounts *) userData)->privateKeys;
7e9371 ¤   }
3f67c5 ¤
ed2d68 ¤   return( kPGPError_NoErr );
c7efe6 }
9faf5a
41c744 ¤   PGPError
b4f9a9 CountKeysInDefaultKeyring(
59520e ¤   PGPContextRef¤  context,
335def ¤   UInt32 ¤¤   ¤   *numPublicKeys,
0dad37 ¤   UInt32 ¤¤   ¤   *numPrivateKeys)
f9bb36 {
9661e0 ¤   PGPError¤   err;
f6ab47 ¤   KeyCounts¤  keyCounts;
9767c5 ¤
254049 ¤   AssertAddrNullOrValid( numPublicKeys, UInt32, "CountKeysInDefaultKeyring" );
e15ee8 ¤   AssertAddrNullOrValid( numPrivateKeys, UInt32, "CountKeysInDefaultKeyring");
f667c5 ¤
8339d2 ¤   keyCounts.publicKeys ¤  = 0;
24afe9 ¤   keyCounts.privateKeys¤  = 0;
8267c5 ¤
0af3a2 ¤   err = PGPSharedForEachKeyDo( context, kPGPAnyOrdering,
df9ff8 ¤   ¤   ¤   ¤   CountKeysInDefaultKeyringCallbackProc, &keyCounts );
17af5a
22472f ¤   if( IsntNull( numPublicKeys ) )
cb4d32 ¤   ¤   *numPublicKeys = keyCounts.publicKeys;
81af5a
79b46e ¤   if( IsntNull( numPrivateKeys ) )
e5f80a ¤   ¤   *numPrivateKeys = keyCounts.privateKeys;
961b52 ¤   ¤
cbdeb7 ¤   return( err );
44efe6 }
76af5a
2866dd ¤   static PGPError
eef171 GetKeySimpleProperties(
013dd9 ¤   PGPKeyRef¤  ¤   ¤   ¤   theKey,
a99a86 ¤   PGPSharedKeyProperties¤ *properties)
f3bb36 {
b761e0 ¤   PGPError¤   err;
fa67c5 ¤
--f24e 000822c06ae40120151 Page 3 of PGPSharedEncryptDecrypt.cp
e777be ¤   pgpAssertAddrValid( theKey, VoidAlign );
c2a58d ¤   pgpAssertAddrValid( properties, PGPSharedKeyProperties );
5167c5 ¤
ddb65c ¤   pgpClearMemory( properties, sizeof( *properties ) );
5067c5 ¤
1aa94c ¤   err = PGPGetKeyBoolean( theKey, kPGPKeyPropIsSecret,
c45dac ¤   ¤   ¤   ¤   &properties->isSecret );
1d67c5 ¤
3dee03 ¤   if( IsntErr( err ) )
84c7a1 ¤   {
26334c ¤   ¤   err = PGPGetKeyBoolean( theKey, kPGPKeyPropIsAxiomatic,
fb9d0f ¤   ¤   ¤   ¤   ¤   &properties->isAxiomatic );
879371 ¤   }
f6af5a
35ee03 ¤   if( IsntErr( err ) )
bdc7a1 ¤   {
e29b3b ¤   ¤   err = PGPGetKeyBoolean( theKey, kPGPKeyPropIsSecretShared,
076170 ¤   ¤   ¤   ¤   ¤   &properties->isSplit );
679371 ¤   }
d2af5a
33ee03 ¤   if( IsntErr( err ) )
49c7a1 ¤   {
13b396 ¤   ¤   err = PGPGetKeyBoolean( theKey, kPGPKeyPropIsRevoked,
ab8aa0 ¤   ¤   ¤   ¤   ¤   &properties->isRevoked );
6a9371 ¤   }
fdaf5a
6cee03 ¤   if( IsntErr( err ) )
9bc7a1 ¤   {
16ea42 ¤   ¤   err = PGPGetKeyBoolean( theKey, kPGPKeyPropIsDisabled,
2ede49 ¤   ¤   ¤   ¤   ¤   &properties->isDisabled );
549371 ¤   }
dc67c5 ¤
e4ee03 ¤   if( IsntErr( err ) )
efc7a1 ¤   {
2544a1 ¤   ¤   PGPBoolean¤ isNotCorrupt;
261b52 ¤   ¤
13f7ec ¤   ¤   err = PGPGetKeyBoolean( theKey, kPGPKeyPropIsNotCorrupt,
fed597 ¤   ¤   ¤   ¤   ¤   &isNotCorrupt );
27fa6d ¤   ¤   properties->isCorrupt = ! isNotCorrupt;
c69371 ¤   }
f4af5a
b7ee03 ¤   if( IsntErr( err ) )
2fc7a1 ¤   {
7fe156 ¤   ¤   err = PGPGetKeyBoolean( theKey, kPGPKeyPropIsExpired,
26319d ¤   ¤   ¤   ¤   ¤   &properties->isExpired );
809371 ¤   }
afaf5a
17ee03 ¤   if( IsntErr( err ) )
e3c7a1 ¤   {
53abc2 ¤   ¤   err = PGPGetKeyBoolean( theKey, kPGPKeyPropCanSign,
22f452 ¤   ¤   ¤   ¤   ¤   &properties->canSign );
9f9371 ¤   }
1faf5a
f8ee03 ¤   if( IsntErr( err ) )
37c7a1 ¤   {
853c6f ¤   ¤   err = PGPGetKeyBoolean( theKey, kPGPKeyPropCanEncrypt,
8cfeb9 ¤   ¤   ¤   ¤   ¤   &properties->canEncrypt );
009371 ¤   }
1caf5a
95ee03 ¤   if( IsntErr( err ) )
77c7a1 ¤   {
c03c6f ¤   ¤   err = PGPGetKeyBoolean( theKey, kPGPKeyPropCanEncrypt,
81feb9 ¤   ¤   ¤   ¤   ¤   &properties->canEncrypt );
969371 ¤   }
a8af5a
05deb7 ¤   return( err );
18efe6 }
0daf5a
09c744 ¤   PGPError
acc179 PGPSharedGetKeyProperties(
8b3dd9 ¤   PGPKeyRef¤  ¤   ¤   ¤   theKey,
827376 ¤   const char¤ ¤   ¤   ¤   *userID,
--2616 000c30c259d40120151 Page 4 of PGPSharedEncryptDecrypt.cp
f49a86 ¤   PGPSharedKeyProperties¤ *properties)
a1bb36 {
7461e0 ¤   PGPError¤   err;
dd67c5 ¤
365ba5 ¤   AssertAddrNullOrValid( userID, char, "PGPSharedGetKeyProperties" );
7da58d ¤   pgpAssertAddrValid( properties, PGPSharedKeyProperties );
ac67c5 ¤
5fe6ff ¤   err = GetKeySimpleProperties( theKey, properties );
c3b1f0 ¤   if( IsntPGPError( err ) )
14c7a1 ¤   {
c55043 ¤   ¤   if( IsntNull( userID ) )
7c5b34 ¤   ¤   {
7db89e ¤   ¤   ¤   PGPKeySetRef¤   keySet;
9187c7 ¤   ¤   ¤
9543fa ¤   ¤   ¤   properties->userValidity = kPGPValidity_Unknown;
6894aa ¤   ¤   ¤   ¤   ¤   ¤
254373 ¤   ¤   ¤   err = PGPNewSingletonKeySet( theKey, &keySet );
e0698b ¤   ¤   ¤   if( IsntPGPError( err ) )
5df776 ¤   ¤   ¤   {
d5d796 ¤   ¤   ¤   ¤   PGPKeyListRef¤  keyList;
482b85 ¤   ¤   ¤   ¤
d16566 ¤   ¤   ¤   ¤   err = PGPOrderKeySet( keySet, kPGPAnyOrdering, &keyList );
cd5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
c672c3 ¤   ¤   ¤   ¤   {
94bc29 ¤   ¤   ¤   ¤   ¤   PGPKeyIterRef¤  iterator;
d3ae30 ¤   ¤   ¤   ¤   ¤
a18298 ¤   ¤   ¤   ¤   ¤   err = PGPNewKeyIter( keyList, &iterator );
d36ca0 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
8a4859 ¤   ¤   ¤   ¤   ¤   {
bbf51f ¤   ¤   ¤   ¤   ¤   ¤   PGPUserIDRef¤   curUserID;
ff0717 ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   foundUserID = FALSE;
09d85e ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef¤  ¤   keyRef;
7e94aa ¤   ¤   ¤   ¤   ¤   ¤
ee7c4b ¤   ¤   ¤   ¤   ¤   ¤   /* must advance to first key */
0da0d7 ¤   ¤   ¤   ¤   ¤   ¤   err¤= PGPKeyIterNext( iterator, &keyRef );
8aca6a ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
4594aa ¤   ¤   ¤   ¤   ¤   ¤
5d1389 ¤   ¤   ¤   ¤   ¤   ¤   while( IsntPGPError(
1b0f51 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPKeyIterNextUserID(iterator, &curUserID)))
1b8fec ¤   ¤   ¤   ¤   ¤   ¤   {
bdce16 ¤   ¤   ¤   ¤   ¤   ¤   ¤   char¤   ¤   checkUserID[256];
564bfe ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤¤   totalSize;
fd531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
d2ad82 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetUserIDStringBuffer( curUserID,
2957e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPUserIDPropName,
72c0eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( checkUserID ),
724859 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   checkUserID, &totalSize );
3f8d9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
a706b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
24d733 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( strcmp( checkUserID, userID ) == 0 )
dc31b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
589f7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPInt32¤   validity;
e3ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
7a594c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetUserIDNumber( curUserID,
7fd42d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPUserIDPropValidity,
b27db4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &validity );
bded43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
9e1366 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   properties->userValidity =
b6cc6f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPValidity) validity;
3aed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
2b1de7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   foundUserID = TRUE;
7ec32b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
a96560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
3a5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
acdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
1794aa ¤   ¤   ¤   ¤   ¤   ¤
6e2597 ¤   ¤   ¤   ¤   ¤   ¤   if( err == kPGPError_EndOfIteration )
82fa51 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kPGPError_NoErr;
11531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
0eeff7 ¤   ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeyIter( iterator );
911c89 ¤   ¤   ¤   ¤   ¤   }
c3ae30 ¤   ¤   ¤   ¤   ¤
--8b67 0004f5c05ed40120151 Page 5 of PGPSharedEncryptDecrypt.cp
6859d1 ¤   ¤   ¤   ¤   ¤   (void) PGPFreeKeyList( keyList );
3b2613 ¤   ¤   ¤   ¤   }
032b85 ¤   ¤   ¤   ¤
541a16 ¤   ¤   ¤   ¤   (void) PGPFreeKeySet( keySet );
0ba3a6 ¤   ¤   ¤   }
f20fe4 ¤   ¤   }
e40e1d ¤   ¤   else
055b34 ¤   ¤   {
cf8395 ¤   ¤   ¤   err = PGPGetPrimaryUserIDValidity( theKey,
8e4636 ¤   ¤   ¤   ¤   ¤   ¤   &properties->userValidity );
670fe4 ¤   ¤   }
0c9371 ¤   }
2ddeb7 ¤   return( err );
7cefe6 }
c4af5a
98c744 ¤   PGPError
e9c250 PGPSharedAddKeysToDefaultKeyring(
53a440 ¤   PGPKeySetRef keysToAdd)
21bb36 {
22e4de ¤   PGPError¤   ¤   ¤   result;
b3904e ¤   CComboError¤¤   ¤   comboErr;
a7fd87 ¤   ProcessSerialNumber¤keysPSN;
5becc0 ¤   PGPContextRef¤  ¤   context = PGPGetKeySetContext(keysToAdd);
e367c5 ¤
2f1be3 ¤   if ( FindProcess(kPGPkeysType, kPGPkeysCreator,
265fb4 ¤   &keysPSN, nil, nil, nil) )
69c7a1 ¤   {
72c38c ¤   ¤   AEDesc¤ ¤   theAddress = { typeNull, nil };
be25af ¤   ¤   AEDesc¤ ¤   theKeys = { typeNull, nil };
626b30 ¤   ¤   AppleEvent¤ theEvent = { typeNull, nil };
81fa20 ¤   ¤   void *¤ ¤   buffer = nil;
d7b4c5 ¤   ¤   PGPSize¤¤   bufferSize;
da67c5 ¤
6c929c ¤   ¤   comboErr.err = ::AECreateDesc(¤ typeProcessSerialNumber,
981c9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr) &keysPSN,
ff0a37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(keysPSN),
3d98ae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theAddress);
a72e21 ¤   ¤   if (comboErr.IsntError())
df5b34 ¤   ¤   {
9f2910 ¤   ¤   ¤   comboErr.pgpErr = PGPExportKeySet(¤ keysToAdd,
3b9132 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOAllocatedOutputBuffer(
e51029 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   context,
b13419 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &buffer,
df4c29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::MaxBlock(),
534c4a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &bufferSize),
be5f10 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(context));
b7c152 ¤   ¤   ¤   if (comboErr.IsntError())
57f776 ¤   ¤   ¤   {
dc6618 ¤   ¤   ¤   ¤   comboErr.err = ::AECreateDesc(¤ typeChar,
365385 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   buffer,
a8f49b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   bufferSize,
490b1a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theKeys);
29fdbc ¤   ¤   ¤   ¤   if (comboErr.IsntError())
3672c3 ¤   ¤   ¤   ¤   {
813d2e ¤   ¤   ¤   ¤   ¤   comboErr.err = ::AECreateAppleEvent(kAEPGPClass,
1ba5e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAEImportKey,
c4000e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theAddress,
fa3a0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAutoGenerateReturnID,
8c34db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAnyTransactionID,
33beec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theEvent);
2dc479 ¤   ¤   ¤   ¤   ¤   if (comboErr.IsntError())
1d4859 ¤   ¤   ¤   ¤   ¤   {
ab8230 ¤   ¤   ¤   ¤   ¤   ¤   comboErr.err = ::AEPutParamDesc(¤   &theEvent,
c51acf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyDirectObject,
229588 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theKeys);
938b47 ¤   ¤   ¤   ¤   ¤   ¤   if (comboErr.IsntError())
ee8fec ¤   ¤   ¤   ¤   ¤   ¤   {
1c7858 ¤   ¤   ¤   ¤   ¤   ¤   ¤   AEDesc¤ theReply;
57531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
8470c6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   comboErr.err = ::AESend(&theEvent,
5d844e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theReply,
4ff5d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAENoReply,
--e0b5 000dbed5e1d40120151 Page 6 of PGPSharedEncryptDecrypt.cp
ad055f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAENormalPriority,
a07019 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAEDefaultTimeout,
abe3c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
42dc60 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil);
7cdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
a41c89 ¤   ¤   ¤   ¤   ¤   }
162613 ¤   ¤   ¤   ¤   }
0ba3a6 ¤   ¤   ¤   }
6f0fe4 ¤   ¤   }
151b52 ¤   ¤
639b36 ¤   ¤   ::AEDisposeDesc(&theAddress);
0e00ad ¤   ¤   ::AEDisposeDesc(&theKeys);
1586a1 ¤   ¤   ::AEDisposeDesc(&theEvent);
5f21ed ¤   ¤   if (buffer != nil)
0d5b34 ¤   ¤   {
4adabd ¤   ¤   ¤   PGPFreeData(buffer);
3f0fe4 ¤   ¤   }
a49371 ¤   }
6a0e24 ¤   else
dec7a1 ¤   {
7c5ae8 ¤   ¤   PGPKeySetRef¤   defaultKeySet = kInvalidPGPKeySetRef;
0f1b52 ¤   ¤
9dacb8 ¤   ¤   comboErr.pgpErr = PGPOpenDefaultKeyRings(context,
80404a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyRingOpenFlags_Mutable,
ec7bae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &defaultKeySet);
c42e21 ¤   ¤   if (comboErr.IsntError())
3c5b34 ¤   ¤   {
a7faa9 ¤   ¤   ¤   comboErr.pgpErr = PGPAddKeys(keysToAdd, defaultKeySet);
6ac152 ¤   ¤   ¤   if (comboErr.IsntError())
6cf776 ¤   ¤   ¤   {
42288a ¤   ¤   ¤   ¤   comboErr.pgpErr = PGPCommitKeyRingChanges(defaultKeySet);
a9a3a6 ¤   ¤   ¤   }
400fe4 ¤   ¤   }
722e71 ¤   ¤   if( PGPKeySetRefIsValid( defaultKeySet ) )
bf5b34 ¤   ¤   {
59904e ¤   ¤   ¤   PGPFreeKeySet(defaultKeySet);
8c0fe4 ¤   ¤   }
289371 ¤   }
7267c5 ¤
242c8b ¤   if (comboErr.HavePGPError())
b5c7a1 ¤   {
5cb0be ¤   ¤   result = comboErr.pgpErr;
1e9371 ¤   }
b40e24 ¤   else
9fc7a1 ¤   {
2eda7c ¤   ¤   result = MacErrorToPGPError(comboErr.err);
889371 ¤   }
7167c5 ¤
9d5d73 ¤   return result;
14efe6 }
93af5a
7ac744 ¤   PGPError
1e555c PGPSharedGetIndKeyFromKeySet(
15215d ¤   PGPKeySetRef ¤  keySet,
5c187e ¤   PGPKeyOrdering ¤keyOrdering,
695f1a ¤   PGPUInt32¤  ¤   searchIndex,
06ddba ¤   PGPKeyRef¤  ¤   *theKey)
c0bb36 {
a3fb19 ¤   PGPError¤   ¤   err;
8a7e52 ¤   PGPKeyListRef¤  keyListRef;
c567c5 ¤
b29cae ¤   *theKey = kInvalidPGPKeyRef;
74af5a
ae43c4 ¤   err = PGPOrderKeySet( keySet, keyOrdering, &keyListRef );
58b1f0 ¤   if( IsntPGPError( err ) )
ecc7a1 ¤   {
a520b4 ¤   ¤   PGPKeyIterRef¤  keyIterator;
eb1b52 ¤   ¤
0407aa ¤   ¤   err = PGPNewKeyIter( keyListRef, &keyIterator );
2786f8 ¤   ¤   if( IsntPGPError( err ) )
6d5b34 ¤   ¤   {
db3e68 ¤   ¤   ¤   PGPUInt32¤  keyIndex;
--c6fb 0017b2f510f40120151 Page 7 of PGPSharedEncryptDecrypt.cp
e587c7 ¤   ¤   ¤
4698bb ¤   ¤   ¤   for( keyIndex = 1; keyIndex <= searchIndex; ++keyIndex )
1ff776 ¤   ¤   ¤   {
5f3e1b ¤   ¤   ¤   ¤   err = PGPKeyIterNext( keyIterator, theKey );
fe9c8a ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
5572c3 ¤   ¤   ¤   ¤   {
90f00e ¤   ¤   ¤   ¤   ¤   *theKey = kInvalidPGPKeyRef;
1c14c3 ¤   ¤   ¤   ¤   ¤   break;
d22613 ¤   ¤   ¤   ¤   }
64a3a6 ¤   ¤   ¤   }
57af5a
013433 ¤   ¤   ¤   PGPFreeKeyIter( keyIterator );
260fe4 ¤   ¤   }
281b52 ¤   ¤
67779b ¤   ¤   PGPFreeKeyList( keyListRef );
289371 ¤   }
9567c5 ¤
121c1a ¤   if( err == kPGPError_EndOfIteration )
b92f1f ¤   ¤   err = kPGPError_ItemNotFound;
1b1b52 ¤   ¤
1edeb7 ¤   return( err );
7befe6 }
--3ba7 0014a217cf040120152 Page 1 of PGPSharedEncryptDecrypt.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
6eb4c4 ¤   $Id: PGPSharedEncryptDecrypt.h,v 1.21.8.1 1998/11/12 03:09:50 heller Exp $
52f7f7 ____________________________________________________________________________*/
29af5a
7c7b7d #pragma once
2eaf5a
992f8d #include "pgpErrors.h"
659f63 #include "pgpEncode.h"
40a076 #include "pgpKeys.h"
53af5a
b1e684 #include "pgpUserInterface.h"
0faf5a
0a99c6 PGP_BEGIN_C_DECLARATIONS
92cbcf #if PRAGMA_IMPORT_SUPPORTED
f9b981 #pragma import on
257454 #endif
cfaf5a
8faf5a
5dd824 typedef PGPError (*PGPSharedForEackKeyDoProcPtr)( PGPKeyIterRef keyIterator,
f53314 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef theKey, void *userData );
57af5a
16af5a
f92458 typedef struct PGPSharedKeyProperties
f3bb36 {
03fbdc ¤   PGPBoolean¤ isSecret;
2bc26b ¤   PGPBoolean¤ isAxiomatic;
ea36a4 ¤   PGPBoolean¤ isSplit;
5f1444 ¤   PGPBoolean¤ isRevoked;
18ce73 ¤   PGPBoolean¤ isDisabled;
6f657c ¤   PGPBoolean¤ isCorrupt;
ec4684 ¤   PGPBoolean¤ isExpired;
954ffa ¤   PGPBoolean¤ canSign;¤   ¤   // Special ViaCrypt property
f04c94 ¤   PGPBoolean¤ canEncrypt;¤¤   // Special ViaCrypt property
74af5a
cb5720 ¤   PGPValidity¤userValidity;¤  // Valid for a particular user ID only
dc67c5 ¤
5b1c13 } PGPSharedKeyProperties;
49af5a
c8af5a
56af5a
8dcff2 PGPError¤   CountKeysInDefaultKeyring(PGPContextRef context,
bb925b ¤   ¤   ¤   ¤   ¤   ¤   UInt32 *numPublicKeys, UInt32 *numPrivateKeys);
bd67c5 ¤
43cead PGPError¤   PGPSharedForEachKeyDo( PGPContextRef context,
3a3351 ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyOrdering keyOrdering,
f0f2f7 ¤   ¤   ¤   ¤   ¤   ¤   PGPSharedForEackKeyDoProcPtr callbackProc,
e0d148 ¤   ¤   ¤   ¤   ¤   ¤   void *callbackData);
4a67c5 ¤
caec9a PGPError¤   PGPSharedGetKeyProperties(PGPKeyRef theKey, const char *userID,
81b903 ¤   ¤   ¤   ¤   ¤   ¤   PGPSharedKeyProperties *properties);
1e94aa ¤   ¤   ¤   ¤   ¤   ¤
f973d8 PGPError¤   PGPSharedAddKeysToDefaultKeyring(PGPKeySetRef keysToAdd);
2e67c5 ¤
9dcf1c PGPError¤   PGPSharedGetIndKeyFromKeySet(PGPKeySetRef keySet,
68175e ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyOrdering keyOrdering, PGPUInt32 searchIndex,
0b0e68 ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef *theKey);
adaf5a
e667c5 ¤
09cbcf #if PRAGMA_IMPORT_SUPPORTED
712ced #pragma import reset
5a7454 #endif
4a2827 PGP_END_C_DECLARATIONS¶
--5793 0009882b9f040120153 Page 1 of PGPSharedParse.cp
4b6438 /*_____________________________________________________________________________
cec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
2d4b0f ¤   All rights reserved.
167cb9 _____________________________________________________________________________*/
8aaf5a
280d08 #include "pgpMem.h"
64771f #include "PGPSharedParse.h"
28af5a
6caf5a
6b0335 /*____________________________________________________________________________
cbc4f2 ¤   Find a string in the buffer and return a pointer to it.
c867c5 ¤
e4986c ¤   Note: the length of the buffer and the length of the search string are
b3ed3e ¤   specified via length, *not* null termination.
aec988 ___________________________________________________________________________*/
92d2ab ¤   const char *
498348 FindMatchingBytes(
40a1b5 ¤   const char *¤   buffer,
18e12f ¤   const ulong¤¤   length,
404a56 ¤   const char *¤   findIt,
a26dfd ¤   const ulong¤¤   findItLength
2627e6 ¤   )
a8bb36 {
9ab28c ¤   pgpAssertAddrValid( buffer, char );
c874a5 ¤   pgpAssertAddrValid( findIt, char );
43e445 ¤   pgpAssert( findItLength >= 1 );
3487d8 ¤   // allow 'length' to be 0
7a67c5 ¤
112151 ¤   const char *¤   result¤ = nil;
ed67c5 ¤
d80a1e ¤   if ( ¤  length != 0 &&
adbfd8 ¤   ¤   ¤   findItLength != 0 &&
41a657 ¤   ¤   ¤   findItLength <= length )
8bc7a1 ¤   {
dad53f ¤   ¤   const char *¤   cur;
9a3d52 ¤   ¤   const char *¤   last;
1a7f7e ¤   ¤   const char¤ ¤   searchChar¤ = findIt[ 0 ];
511b52 ¤   ¤
8b5040 ¤   ¤   cur¤¤   = buffer;
1fc9e5 ¤   ¤   last¤   = cur + ( length - findItLength );
3dd2a2 ¤   ¤   while ( cur <= last )
2f5b34 ¤   ¤   {
8a4cea ¤   ¤   ¤   if ( *cur == searchChar )
78f776 ¤   ¤   ¤   {
3731c8 ¤   ¤   ¤   ¤   if ( pgpMemoryEqual( cur, findIt, findItLength ) )
7072c3 ¤   ¤   ¤   ¤   {
9092ea ¤   ¤   ¤   ¤   ¤   result¤ = cur;
1314c3 ¤   ¤   ¤   ¤   ¤   break;
722613 ¤   ¤   ¤   ¤   }
14a3a6 ¤   ¤   ¤   }
f887c7 ¤   ¤   ¤
c3bdb8 ¤   ¤   ¤   ++cur;
c80fe4 ¤   ¤   }
d69371 ¤   }
3767c5 ¤
e64c6e ¤   return( result );
85efe6 }
f3af5a
f0af5a
8aaf5a
0faf5a
8d0335 /*____________________________________________________________________________
a5f6e3 ¤   Find a block of the form:
fb67c5 ¤
0a6520 ¤   linestart
cfc9f6 ¤   ...
6dcdf2 ¤   lineEnd
8167c5 ¤
17dbd7 ¤   Return the offset at which it begins and its length.
36e00d ¤   Length includes the begin/end lines and the trailing carriage return/line
7b03df ¤   feed.
98f7f7 ____________________________________________________________________________*/
--6a8f 000fcfafb9040120153 Page 2 of PGPSharedParse.cp
dd7e69 ¤   Boolean
c5d03e FindBlock(
b16914 ¤   const void *¤   ¤   inBuffer,
80b1a8 ¤   const ulong¤¤   ¤   inBufferSize,
c621b2 ¤   ConstStr255Param¤   startLine,
9094ad ¤   ConstStr255Param¤   endLine,
c8e3e4 ¤   ulong *¤¤   ¤   ¤   encryptedBlockStart,
ea6d9d ¤   ulong *¤¤   ¤   ¤   encryptedBlockSize )
e3bb36 {
618a7a ¤   Boolean¤¤   ¤   foundBlock¤ = false;
923a51 ¤   const char *¤   cur = nil;
8a96b4 ¤   const char *¤   beginning¤  = nil;
698683 ¤   const char *¤   end¤= nil;
23514b ¤   const char¤ ¤   kCarriageReturnChar¤= 13;
077df3 ¤   const char¤ ¤   kLineFeedChar¤  ¤   = 10;
6bc9ae ¤   const char *¤   inBufferLast;
e067c5 ¤
80b6c0 ¤   cur¤¤   ¤   ¤   = (const char *)inBuffer;
295394 ¤   inBufferLast¤   = ( cur + inBufferSize ) -1;
5caf5a
7232c7 #define IsEOL( c )¤ ( (c) == '\r' || (c) == '\n' )
ba67c5 ¤
e087f3 ¤   while ( cur <= inBufferLast )
a19108 ¤   {·
c4e9df ¤   ¤   beginning¤  = FindMatchingBytes( cur, inBufferSize,
fdfe09 ¤   ¤   ¤   ¤   ¤   ¤   (const char *)&startLine[ 1 ],
d5a792 ¤   ¤   ¤   ¤   ¤   ¤   StrLength( startLine ) );
4db12b ¤   ¤   if ( IsNull( beginning ) )
86cdcb ¤   ¤   ¤   break;
4728a6 ¤   ¤   if ( (cur == inBuffer) || IsEOL( *(cur - 1) ) )
fecdcb ¤   ¤   ¤   break;
d11b52 ¤   ¤
fef323 ¤   ¤   // string doesn't start at beginning of line--skip it
5d5131 ¤   ¤   cur¤= beginning + StrLength( startLine );
7a9371 ¤   }
8c67c5 ¤
5ff418 ¤   if ( IsntNull( beginning ) )
5ec7a1 ¤   {
ac8172 ¤   ¤   ulong¤  bytesRemaining;
6d1b52 ¤   ¤
9e17e2 ¤   ¤   *encryptedBlockStart¤   = beginning - (const char *)inBuffer;
5d1b52 ¤   ¤
c4b6cb ¤   ¤   cur¤¤   ¤   ¤   = beginning + StrLength( startLine );
9d135b ¤   ¤   bytesRemaining¤ = inBufferSize - *encryptedBlockStart;
231b52 ¤   ¤
6e6880 ¤   ¤   while ( cur <= inBufferLast )
7f5b34 ¤   ¤   {
c272dd ¤   ¤   ¤   end¤= FindMatchingBytes( cur, bytesRemaining,
76066c ¤   ¤   ¤   ¤   ¤   (const char *)&endLine[ 1 ], StrLength( endLine ) );
d24bd4 ¤   ¤   ¤   if ( IsNull( end ) )
32f622 ¤   ¤   ¤   ¤   break;
eb2b85 ¤   ¤   ¤   ¤
cbd23c ¤   ¤   ¤   if ( IsEOL( *(end - 1 ) ) )
19f776 ¤   ¤   ¤   {
cab60f ¤   ¤   ¤   ¤   // advance past line end, which could be <CR><LF> or <LF> or
e2134a ¤   ¤   ¤   ¤   // <CR>
980d8f ¤   ¤   ¤   ¤   cur¤= end + StrLength( endLine );
e44834 ¤   ¤   ¤   ¤   if ( *cur == kCarriageReturnChar )
f272c3 ¤   ¤   ¤   ¤   {
7e64b0 ¤   ¤   ¤   ¤   ¤   ++cur;
f88e17 ¤   ¤   ¤   ¤   ¤   if ( *cur == kLineFeedChar )
187098 ¤   ¤   ¤   ¤   ¤   ¤   ++cur;
812613 ¤   ¤   ¤   ¤   }
5bb477 ¤   ¤   ¤   ¤   else if ( *cur == kLineFeedChar )
0d72c3 ¤   ¤   ¤   ¤   {
0564b0 ¤   ¤   ¤   ¤   ¤   ++cur;
1b2613 ¤   ¤   ¤   ¤   }
da2b85 ¤   ¤   ¤   ¤
9ab105 ¤   ¤   ¤   ¤   *encryptedBlockSize¤= ( cur - (const char *)inBuffer) -
87f6ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *encryptedBlockStart;
b22b85 ¤   ¤   ¤   ¤
fc59cf ¤   ¤   ¤   ¤   foundBlock¤ = true;
--05bb 000dd6742cd40120153 Page 3 of PGPSharedParse.cp
72f622 ¤   ¤   ¤   ¤   break;
36a3a6 ¤   ¤   ¤   }
2b87c7 ¤   ¤   ¤
2042b1 ¤   ¤   ¤   cur¤= end + StrLength( endLine );
820fe4 ¤   ¤   }
ea9371 ¤   }
0967c5 ¤
768195 ¤   return( foundBlock );
86efe6 }
0daf5a
2f0335 /*____________________________________________________________________________
6cf6e3 ¤   Find a block of the form:
cb67c5 ¤
ce0fa4 -----BEGIN PGP SIGNED MESSAGE-----
5a2448 ...
94e38f -----BEGIN PGP SIGNATURE-----
842448 ...
dbe726 -----END PGP SIGNATURE-----
0167c5 ¤
d7dbd7 ¤   Return the offset at which it begins and its length.
f4e00d ¤   Length includes the begin/end lines and the trailing carriage return/line
ef03df ¤   feed.
987cb9 _____________________________________________________________________________*/
c17e69 ¤   Boolean
50a4ee FindSignedBlock(
7d4f2f ¤   const void *¤   inBuffer,
a2bc48 ¤   const ulong¤¤   inBufferSize,
25e94d ¤   ulong *¤¤   ¤   encryptedBlockStart,
e76734 ¤   ulong *¤¤   ¤   encryptedBlockSize )
14bb36 {
cdedf9 ¤   const uchar¤¤   kPGPSignedBlockBeginString[] =
0a9474 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   "\p-----BEGIN PGP SIGNED MESSAGE-----";
9f60be ¤   const uchar¤¤   kPGPSignedBlockEndString[]¤ =
ba2fc5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   "\p-----END PGP SIGNATURE-----";
3367c5 ¤
334b7d ¤   return( FindBlock( inBuffer, inBufferSize,
da53db ¤   ¤   ¤   kPGPSignedBlockBeginString, kPGPSignedBlockEndString,
185e95 ¤   ¤   ¤   encryptedBlockStart, encryptedBlockSize ) );
caefe6 }
8eaf5a
76af5a
450335 /*____________________________________________________________________________
e7f6e3 ¤   Find a block of the form:
1667c5 ¤
a1764c ¤   -----BEGIN PGP MESSAGE-----
9b0536 ¤   .....
69761b ¤   -----END PGP MESSAGE-----
b767c5 ¤
0bdbd7 ¤   Return the offset at which it begins and its length.
65e00d ¤   Length includes the begin/end lines and the trailing carriage return/line
2703df ¤   feed.
df7cb9 _____________________________________________________________________________*/
6f7e69 ¤   Boolean
82070c FindEncryptedBlock(
f24f2f ¤   const void *¤   inBuffer,
62bc48 ¤   const ulong¤¤   inBufferSize,
f5e94d ¤   ulong *¤¤   ¤   encryptedBlockStart,
326734 ¤   ulong *¤¤   ¤   encryptedBlockSize )
51bb36 {
a0a641 ¤   const uchar¤¤   kBeginString[]¤ = "\p-----BEGIN PGP MESSAGE-----";
7e2523 ¤   const uchar¤¤   kEndString[]¤   = "\p-----END PGP MESSAGE-----";
d267c5 ¤
9f8056 ¤   return( FindBlock( inBuffer, inBufferSize, kBeginString, kEndString,
1f7820 ¤   ¤   ¤   ¤   encryptedBlockStart, encryptedBlockSize ) );
6fefe6 }
afaf5a
1eaf5a
b86438 /*_____________________________________________________________________________
c7f6e3 ¤   Find a block of the form:
8667c5 ¤
c2a8e8 ¤   -----BEGIN PGP KEY-----
dd0536 ¤   .....
--d163 00152d4e0e840120153 Page 4 of PGPSharedParse.cp
16ec75 ¤   -----END PGP KEY-----
e767c5 ¤
d9dbd7 ¤   Return the offset at which it begins and its length.
eee00d ¤   Length includes the begin/end lines and the trailing carriage return/line
ae03df ¤   feed.
977cb9 _____________________________________________________________________________*/
7c7e69 ¤   Boolean
466e0a FindPGPKeyBlock(
284f2f ¤   const void *¤   inBuffer,
39bc48 ¤   const ulong¤¤   inBufferSize,
36e94d ¤   ulong *¤¤   ¤   encryptedBlockStart,
e56734 ¤   ulong *¤¤   ¤   encryptedBlockSize )
c7bb36 {
717330 ¤   const uchar¤¤   kBeginString[]¤ = "\p-----BEGIN PGP PUBLIC KEY BLOCK-----";
16b8a2 ¤   const uchar¤¤   kEndString[]¤   = "\p-----END PGP PUBLIC KEY BLOCK-----";
b767c5 ¤
eb8056 ¤   return( FindBlock( inBuffer, inBufferSize, kBeginString, kEndString,
8c7820 ¤   ¤   ¤   ¤   encryptedBlockStart, encryptedBlockSize ) );
5cefe6 }
08af5a
36af5a
64af5a
bcaf5a
52af5a
--4da3 0018c21320840120154 Page 1 of PGPSharedParse.h
4b6438 /*_____________________________________________________________________________
cec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
2d4b0f ¤   All rights reserved.
167cb9 _____________________________________________________________________________*/
8aaf5a
f77b7d #pragma once
b6af5a
f0af5a
f0af5a
6aeafc const char *FindMatchingBytes( const char * buffer, ulong length,
66d35f ¤   ¤   ¤   ¤   const char * findIt, ulong findItLength );
3dae30 ¤   ¤   ¤   ¤   ¤
ae466a Boolean¤¤   FindBlock( const void * inBuffer, const ulong inBufferSize,
77964c ¤   ¤   ¤   ¤   ConstStr255Param startLine, ConstStr255Param endLine,
9a570f ¤   ¤   ¤   ¤   ulong * encryptedBlockStart, ulong * encryptedBlockSize );
2467c5 ¤
53b233 Boolean¤¤   FindSignedBlock( const void * inBuffer, const ulong inBufferSize,
a4570f ¤   ¤   ¤   ¤   ulong * encryptedBlockStart, ulong * encryptedBlockSize );
da7c20 Boolean¤¤   FindEncryptedBlock( const void * inBuffer,
0d5ec5 ¤   ¤   ¤   ¤   const ulong inBufferSize, ulong * encryptedBlockStart,
dacc25 ¤   ¤   ¤   ¤   ulong * encryptedBlockSize );
5083f2 Boolean¤¤   FindPGPKeyBlock( const void * inBuffer, const ulong inBufferSize,
f2570f ¤   ¤   ¤   ¤   ulong * encryptedBlockStart, ulong * encryptedBlockSize );
8caf5a
--0f8a 00065ee3a8140120155 Page 1 of PassphraseCache.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
a28800 ¤   $Id: PassphraseCache.cp,v 1.15.8.1 1998/11/12 03:09:52 heller Exp $
e9f7f7 ____________________________________________________________________________*/
a4af5a
58b935 #include <Timer.h>
28324c #include <string.h>
dbd83c ·
dda076 #include "pgpKeys.h"
854919 #include "pgpUtilities.h"
35d83c ·
5ae001 #include "PassphraseCache.h"
2ac110 #include "pgpMacMemory.h"
5ebf4a #include "MacSecureMemory.h"
fa85c2 #include "MacStrings.h"
1b8bd8 #include "MacEnvirons.h"
94af5a
e7547d #include "SetupA4.h"
aab488 #include "A4Stuff.h"
61af5a
a09c69 const SInt32¤   kPassbufferSize = 256;
bdaf5a
daf8ec static char¤¤   ¤   sScrambler[256];
c74e01 static PGPBoolean¤  sScramblerInitialized = false;
d5d83c ·
229789 CPassphraseCache::CPassphraseCache( PGPContextRef context )
94bb36 {
4fedcb ¤   RememberA4();
0d67c5 ¤
358f31 ¤   const ulong¤kDefaultEraseDelayMilliseconds¤ =
10484f ¤   ¤   ¤   ¤   kDefaultEraseDelaysSeconds * 1000;
b567c5 ¤
7d3eaa ¤   mPassbuffer¤¤   ¤   ¤   = nil;
39283b ¤   mPassbufferValid¤   ¤   = false;
16d6af ¤   mEraseTaskIsInstalled¤  = false;
291594 ¤   mEraseDelayMilliseconds¤= kDefaultEraseDelayMilliseconds;
ee67c5 ¤
0267f6 ¤   mEraseTask.upp¤ = NewTimerProc( sEraseTask );
c37972 ¤   pgpAssert( IsntNull( mEraseTask.upp ) );
d367c5 ¤
1c3bb3 ¤   mPassbuffer¤= NewPtrSys( kPassbufferSize );
50be65 ¤   pgpAssert( IsntNull( mPassbuffer ) );
db70d0 ¤   if ( VirtualMemoryIsOn() && IsntNull( mPassbuffer ) )
4bc7a1 ¤   {
514ae9 ¤   ¤   HoldMemory( mPassbuffer, kPassbufferSize );
c79371 ¤   }
ce67c5 ¤
f82101 ¤   if (! sScramblerInitialized) {
41f170 ¤   ¤   PGPContextGetRandomBytes( context, sScrambler, sizeof( char[256] ) );
69b062 ¤   ¤   sScramblerInitialized = true;
c29371 ¤   }
8cefe6 }
6faf5a
c6af5a
bd762a CPassphraseCache::~CPassphraseCache( )
cdbb36 {
cfa2fe ¤   RemoveEraseTask();
aa67c5 ¤
d00cf7 ¤   if ( IsntNull( mPassbuffer ) )
14c7a1 ¤   {
2aca0a ¤   ¤   pgpClearMemory( mPassbuffer, kPassbufferSize );
369371 ¤   }
cb67c5 ¤
ee4860 ¤   if ( IsntNull( mEraseTask.upp ) )
87c7a1 ¤   {
be8d0b ¤   ¤   DisposeRoutineDescriptor( mEraseTask.upp );
3d9371 ¤   }
6567c5 ¤
--1650 00008c81f7840120155 Page 2 of PassphraseCache.cp
d370d0 ¤   if ( VirtualMemoryIsOn() && IsntNull( mPassbuffer ) )
0fc7a1 ¤   {
6e6fc9 ¤   ¤   UnholdMemory( mPassbuffer, kPassbufferSize );
555830 ¤   ¤   DisposePtr( mPassbuffer );
c79371 ¤   }
a3efe6 }
3aaf5a
daaf5a
ec6d52 ¤   void
9cd095 CPassphraseCache::EraseTask( void )
a2bb36 {
bbd139 ¤   Forget();
0defe6 }
5daf5a
bbaf5a
966536 #if TARGET_RT_MAC_CFM¤  // [
d4af5a
dd6685 ¤   pascal void
f62b72 CPassphraseCache::sEraseTask( MyTMTask *myTask )
9abb36 {
28e070 ¤   pgpAssert( myTask->magic == MyTMTask::kMagic );
e967c5 ¤
7ff865 ¤   myTask->thisObject->EraseTask();
ffefe6 }
a7af5a
400dc2 #else¤  ¤   // ][
aaaf5a
c36685 ¤   pascal void
ced680 CPassphraseCache::sEraseTask( void )
3abb36 {
4d00e4 ¤   MyTMTask *¤ myTask¤ = (MyTMTask *)GetA1();
a6953d ¤   EnterCodeResource();
94af5a
09e070 ¤   pgpAssert( myTask->magic == MyTMTask::kMagic );
fdf865 ¤   myTask->thisObject->EraseTask();
5667c5 ¤
de1487 ¤   ExitCodeResource();
f1efe6 }
a7af5a
b8af5a
4ed356 #endif¤ ¤   // ]
66af5a
89af5a
f16d52 ¤   void
7734d8 CPassphraseCache::RemoveEraseTask( ·)
b1bb36 {
a37fe2 ¤   if ( mEraseTaskIsInstalled )
d5c7a1 ¤   {
490b7a ¤   ¤   RmvTime( (QElemPtr) &mEraseTask.tmTask );
a5d342 ¤   ¤   mEraseTaskIsInstalled¤  = false;
dc9371 ¤   }
e8efe6 }
97af5a
65af5a
4a6d52 ¤   void
c337c4 CPassphraseCache::InstallEraseTask( ·)
cabb36 {
73d832 ¤   pgpAssert( ! mEraseTaskIsInstalled );
fc67c5 ¤
7b75c2 ¤   if ( ! mEraseTaskIsInstalled )
77c7a1 ¤   {
99a697 ¤   ¤   TMTask *¤   ¤   task¤   = &mEraseTask.tmTask;
db1b52 ¤   ¤
4d9296 ¤   ¤   pgpClearMemory( task, sizeof( *task ) );
d61b52 ¤   ¤
bda8e5 ¤   ¤   mEraseTask.thisObject¤  = this;
0cd92d ¤   #if PGP_DEBUG
b213f5 ¤   ¤   mEraseTask.magic¤   ¤   = MyTMTask::kMagic;
5db7ec ¤   #endif
981b52 ¤   ¤
e726de ¤   ¤   task->tmAddr¤   = mEraseTask.upp;
084bd9 ¤   ¤   InsTime( (QElemPtr) task );
--53c0 000447687f940120155 Page 3 of PassphraseCache.cp
d30f67 ¤   ¤   PrimeTime( (QElemPtr) task, mEraseDelayMilliseconds );
081b52 ¤   ¤
4e0486 ¤   ¤   mEraseTaskIsInstalled¤  = true;
be9371 ¤   }
b5efe6 }
6baf5a
c86d52 ¤   void
1287ce CPassphraseCache::RememberData(
e75f58 ¤   PGPBoolean¤ ¤   isPassphrase,
889f8d ¤   const PGPByte ¤ *data,
ac070b ¤   PGPSize¤¤   ¤   dataLength)
92bb36 {
7b0721 ¤   PGPUInt32¤  i;
7367c5 ¤
7fd769 ¤   mPassbufferValid¤   = TRUE;
28ee93 ¤   mIsPassphrase¤  ¤   = isPassphrase;
faa4f6 ¤   mDataLength ¤   ¤   = (dataLength < kPassbufferSize) ? dataLength : kPassbu¶
39394e fferSize;
99c298 ¤   pgpCopyMemory( data, mPassbuffer, dataLength );
2367c5 ¤
3b8484 ¤   for( i = 0; i < dataLength; i++)
729531 ¤   ¤   mPassbuffer[i] ^= sScrambler[i];
80efe6 }
63af5a
7a67c5 ¤
086d52 ¤   void
070e85 CPassphraseCache::RememberPassphrase( const char *¤ passphrase )
e0bb36 {
18b8fc ¤   if ( IsNull( mPassbuffer ) )
8c99bf ¤   ¤   return;
ff1b52 ¤   ¤
afa2fe ¤   RemoveEraseTask();
6167c5 ¤
c6356e ¤   if ( mEraseDelayMilliseconds != 0 )
46c7a1 ¤   {
a49c31 ¤   ¤   RememberData( TRUE, (PGPByte *) passphrase, strlen( passphrase ) );
fbf774 ¤   ¤   InstallEraseTask();
5c9371 ¤   }
350e24 ¤   else
3fc7a1 ¤   {
a4f821 ¤   ¤   mPassbufferValid¤   = false;
09ca0a ¤   ¤   pgpClearMemory( mPassbuffer, kPassbufferSize );
bf9371 ¤   }
5fefe6 }
59af5a
da67c5 ¤
746d52 ¤   void
d53f56 CPassphraseCache::RememberPasskey(
471abf ¤   const void *¤   passkey,
2fecc8 ¤   PGPSize¤¤   ¤   passkeyLength )
c6bb36 {
04b8fc ¤   if ( IsNull( mPassbuffer ) )
0499bf ¤   ¤   return;
5d1b52 ¤   ¤
56a2fe ¤   RemoveEraseTask();
1167c5 ¤
bc356e ¤   if ( mEraseDelayMilliseconds != 0 )
ebc7a1 ¤   {
386ab2 ¤   ¤   RememberData( FALSE, (PGPByte *) passkey, passkeyLength );
baf774 ¤   ¤   InstallEraseTask();
a29371 ¤   }
ac0e24 ¤   else
d7c7a1 ¤   {
e3f821 ¤   ¤   mPassbufferValid¤   = false;
21ca0a ¤   ¤   pgpClearMemory( mPassbuffer, kPassbufferSize );
069371 ¤   }
caefe6 }
56af5a
aeaf5a
a66d52 ¤   void
ad74b9 CPassphraseCache::Forget( )
44bb36 {
--fb83 0005bb056f640120155 Page 4 of PassphraseCache.cp
85b8fc ¤   if ( IsNull( mPassbuffer ) )
1899bf ¤   ¤   return;
6e1b52 ¤   ¤
3ca2fe ¤   RemoveEraseTask();
b667c5 ¤
319fa6 ¤   pgpClearMemory( mPassbuffer, kPassbufferSize );
59c549 ¤   mPassbufferValid¤   = false;
7befe6 }
18af5a
18af5a
b2af5a
ba7e69 ¤   Boolean
356547 CPassphraseCache::GetPassphraseOrPasskey(
b12903 ¤   void *¤ ¤   ¤   buffer,
816310 ¤   PGPBoolean *¤   isPassphrase,
dcc3f2 ¤   PGPSize *¤  ¤   passkeyLength)
d2bb36 {
482fbb ¤   *passkeyLength = 0;
4a67c5 ¤
47e856 ¤   if ( mPassbufferValid )
e3c7a1 ¤   {
9e5121 ¤   ¤   *isPassphrase = mIsPassphrase;
0f1b52 ¤   ¤
414434 ¤   ¤   pgpCopyMemory( mPassbuffer, buffer, mDataLength );
d780ef ¤   ¤   for (UInt16 i = 0; i < mDataLength; i++)
42e058 ¤   ¤   ¤   ((char *) buffer)[i] ^= sScrambler[i];
181b52 ¤   ¤
552967 ¤   ¤   if ( mIsPassphrase )
8a5b34 ¤   ¤   {
2a694b ¤   ¤   ¤   ((char *) buffer)[mDataLength] = 0;
f30fe4 ¤   ¤   }
cf0e1d ¤   ¤   else
0b5b34 ¤   ¤   {
3708df ¤   ¤   ¤   *passkeyLength = mDataLength;
0c0fe4 ¤   ¤   }
d59371 ¤   }
b267c5 ¤
00064b ¤   return( mPassbufferValid );
31efe6 }
8baf5a
a716ea ¤   PGPBoolean
94da97 CPassphraseCache::GetPGPOptionList(
80a1bc ¤   PGPContextRef¤  ¤   context,
b73761 ¤   PGPOptionListRef ¤  *optionList)
46bb36 {
ed9542 ¤   PGPBoolean¤ ¤   ¤   haveData;
fdfc21 ¤   CSecureCString256¤  buffer;
b482f3 ¤   PGPBoolean¤ ¤   ¤   isPassPhrase;
a64474 ¤   PGPSize¤¤   ¤   ¤   passKeyLength;
ef67c5 ¤
930991 ¤   *optionList = kInvalidPGPOptionListRef;
1467c5 ¤
2b1b57 ¤   haveData = GetPassphraseOrPasskey( buffer, &isPassPhrase, &passKeyLength );
4df434 ¤   if( haveData )
00c7a1 ¤   {
c8adc2 ¤   ¤   if( isPassPhrase )
0b5b34 ¤   ¤   {
716e2d ¤   ¤   ¤   *optionList = PGPOPassphrase( context, buffer );
130fe4 ¤   ¤   }
d10e1d ¤   ¤   else
f45b34 ¤   ¤   {
d4aad5 ¤   ¤   ¤   *optionList = PGPOPasskeyBuffer( context, buffer, passKeyLength );
c90fe4 ¤   ¤   }
fc9371 ¤   }
4167c5 ¤
87508a ¤   return( haveData );
62efe6 }
5faf5a
e9dacc #pragma mark -
43af5a
c8af5a
5bb68f CSignPassphraseCache::CSignPassphraseCache( PGPContextRef context )
--6b63 000aac564a340120155 Page 5 of PassphraseCache.cp
0bfa28 ¤   : CPassphraseCache( context )
03bb36 {
be71e5 ¤   MacDebug_FillWithGarbage( &mKeyID, sizeof( mKeyID ) );
85efe6 }
0baf5a
dfaf5a
bb0335 /*____________________________________________________________________________
644157 ¤   Retrieve a cached passphrase, together with its corresponding key.
99811d ¤   Fetch the key using its key ID and its PGPPublicKeyAlgorithm
4267c5 ¤
94a333 ¤   Caller must call PGPFreeKey() on *signingKeyOut
31f7f7 ____________________________________________________________________________*/
e87e69 ¤   Boolean
f58ef3 CSignPassphraseCache::GetPassphraseOrPasskey(
940642 ¤   PGPKeySetRef¤   allKeys,
372903 ¤   void *¤ ¤   ¤   buffer,
c26310 ¤   PGPBoolean *¤   isPassphrase,
0dbd4a ¤   PGPSize *¤  ¤   passkeyLength,
cf04df ¤   PGPKeyRef *¤¤   keyRefOut )
37bb36 {
3544d7 ¤   Boolean¤¤   haveCache¤  = FALSE;
f626d5 ¤   PGPError¤   err¤= kPGPError_NoErr;
5367c5 ¤
51300b ¤   *keyRefOut¤ = kInvalidPGPKeyRef;
1797a4 ¤   ((char *) buffer)[ 0 ]¤ = '\0';
c467c5 ¤
bc2a60 ¤   haveCache¤  = inherited::GetPassphraseOrPasskey( buffer, isPassphrase,
c42179 ¤   ¤   ¤   ¤   ¤   ¤   ¤   passkeyLength );
8213b6 ¤   if ( haveCache )
2bc7a1 ¤   {
2ba65c ¤   ¤   err¤= PGPGetKeyByKeyID( allKeys,
1ec910 ¤   ¤   ¤   ¤   ¤   &mKeyID, mPublicKeyAlg, keyRefOut );
131b52 ¤   ¤
9d8445 ¤   ¤   haveCache¤  = IsntPGPError( err );
8e9371 ¤   }
ea67c5 ¤
66bb5a ¤   return( haveCache );
6defe6 }
ddaf5a
dd0335 /*____________________________________________________________________________
fb2131 ¤   Remember a passphrase, together with its corresponding key.
90e5eb ¤   Remember the key by turning its key ID into a string and also remembering
f3d2a3 ¤   its PGPPublicKeyAlgorithm
4cf7f7 ____________________________________________________________________________*/
436d52 ¤   void
222fae CSignPassphraseCache::RememberPassphrase(
13347c ¤   const char *¤   ¤   passphrase,
f385c2 ¤   PGPKeyRef¤  ¤   ¤   key)
67bb36 {
7826d5 ¤   PGPError¤   err¤= kPGPError_NoErr;
fc67c5 ¤
1cacf2 ¤   pgpAssertAddrValid( passphrase, char );
9467c5 ¤
c241e8 ¤   err¤= PGPGetKeyIDFromKey( key, &mKeyID );
e3f1e7 ¤   if ( IsntPGPError( err ) )
fec7a1 ¤   {
96109b ¤   ¤   PGPInt32¤   number;
bc1b52 ¤   ¤
ce9163 ¤   ¤   err¤= PGPGetKeyNumber( key, kPGPKeyPropAlgID, &number );
ff5d86 ¤   ¤   mPublicKeyAlg¤  = (PGPPublicKeyAlgorithm)number;
6f9371 ¤   }
f567c5 ¤
348c1a ¤   pgpAssertNoErr( err );
8467c5 ¤
e41712 ¤   inherited::RememberPassphrase( passphrase );
eaefe6 }
e3af5a
bcaf5a
c36d52 ¤   void
7eb551 CSignPassphraseCache::RememberPasskey(
721be8 ¤   const void *¤   ¤   passkey,
aa7e67 ¤   PGPSize¤¤   ¤   ¤   passkeyLength,
--027b 0013eed251940120155 Page 6 of PassphraseCache.cp
ba85c2 ¤   PGPKeyRef¤  ¤   ¤   key)
bbbb36 {
d826d5 ¤   PGPError¤   err¤= kPGPError_NoErr;
8267c5 ¤
3a41e8 ¤   err¤= PGPGetKeyIDFromKey( key, &mKeyID );
6cf1e7 ¤   if ( IsntPGPError( err ) )
c2c7a1 ¤   {
9a109b ¤   ¤   PGPInt32¤   number;
1a1b52 ¤   ¤
869163 ¤   ¤   err¤= PGPGetKeyNumber( key, kPGPKeyPropAlgID, &number );
e75d86 ¤   ¤   mPublicKeyAlg¤  = (PGPPublicKeyAlgorithm)number;
519371 ¤   }
4967c5 ¤
be8c1a ¤   pgpAssertNoErr( err );
2c67c5 ¤
55fc6a ¤   inherited::RememberPasskey( passkey, passkeyLength );
9befe6 }
3faf5a
9edacc #pragma mark -
2caf5a
f4af5a
8baf5a
f3af5a
7f698a CSignPassphraseCache *¤ gSigningPassphraseCache¤¤   = nil;
7c4c3f CSignPassphraseCache *¤ gDecryptionPassphraseCache¤ = nil;
2167c5 ¤
126d52 ¤   void
78d3d1 InitPassphraseCaches( PGPContextRef context )
f5bb36 {
190d41 ¤   if ( IsNull( gSigningPassphraseCache ) )
83c7a1 ¤   {
cf0889 ¤   ¤   gSigningPassphraseCache¤= new CSignPassphraseCache( context );
639371 ¤   }
aa67c5 ¤
aca4a4 ¤   if ( IsNull( gDecryptionPassphraseCache ) )
ecc7a1 ¤   {
1b205d ¤   ¤   gDecryptionPassphraseCache¤ = new CSignPassphraseCache( context );
bf9371 ¤   }
7befe6 }
60af5a
e66d52 ¤   void
660c3d DisposePassphraseCaches( void )
36bb36 {
43a40e ¤   delete gSigningPassphraseCache;
fe745f ¤   gSigningPassphraseCache¤= nil;
e967c5 ¤
0d6651 ¤   delete gDecryptionPassphraseCache;
3b6cd7 ¤   gDecryptionPassphraseCache¤ = nil;
eaefe6 }
be67c5 ¤
aaaf5a
d8af5a
40af5a
24af5a
00af5a
31af5a
6aaf5a
85af5a
f9af5a
81af5a
83af5a
3eaf5a
--5110 0008d2159b740120156 Page 1 of PassphraseCache.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
967fdb ¤   $Id: PassphraseCache.h,v 1.14.8.1 1998/11/12 03:09:52 heller Exp $
b3f7f7 ____________________________________________________________________________*/
8daf5a
438d55 #pragma once·
57af5a
50af5a
ffb935 #include <Timer.h>
5daf5a
98af5a
5ee82c #include "pgpPubTypes.h"
4a9f63 #include "pgpEncode.h"
05af5a
04ad96 class CPassphraseCache
d9bb36 {
e55ffe ¤   ulong¤  mEraseDelayMilliseconds;
0767c5 ¤
c9c0ba ¤   enum { kDefaultEraseDelaysSeconds¤  = 2 * 60 };¤// 2 minutes;
d9af5a
e4f5e2 ¤   typedef struct
50c7a1 ¤   {
6cf39b ¤   ¤   TMTask¤ ¤   ¤   ¤   tmTask;
554a91 ¤   ¤   CPassphraseCache *¤ thisObject;
0ef729 ¤   ¤   TimerUPP¤   ¤   ¤   upp;
1bd92d ¤   #if PGP_DEBUG
78d6b7 ¤   ¤   enum { kMagic¤  = 'ETSK' };
68ca8d ¤   ¤   OSType¤ ¤   ¤   ¤   magic;
6bb7ec ¤   #endif
1cf6fa ¤   } MyTMTask;
2267c5 ¤
f1a2d3 protected:
a55515 ¤   char *¤ ¤   mPassbuffer;
257ff2 ¤   Boolean¤¤   mPassbufferValid;
0d8510 ¤   PGPSize¤¤   mDataLength;
64c70e ¤   Boolean¤¤   mIsPassphrase;
82af5a
445195 ¤   Boolean¤¤   mEraseTaskIsInstalled;
e54a17 ¤   MyTMTask¤   mEraseTask;
7567c5 ¤
aebf7a ¤   void¤   ¤   RemoveEraseTask( void );
d0ae84 ¤   void¤   ¤   InstallEraseTask( void );
fd67c5 ¤
18332c ¤   void¤   ¤   EraseTask( void );
893a02 ¤   #if TARGET_RT_MAC_CFM
41b1c7 ¤   static pascal void¤ sEraseTask( MyTMTask *task );
0c47b4 ¤   #else
4cccb4 ¤   static pascal void¤ sEraseTask( void );
89b7ec ¤   #endif
5267c5 ¤
ef543d ¤   void¤   ¤   RememberData(PGPBoolean isPassphrase,
96cea8 ¤   ¤   ¤   ¤   ¤   ¤   const PGPByte *data, PGPSize dataLength);
2167c5 ¤
985ed4 public:
6e15bc ¤   ¤   ¤   CPassphraseCache(PGPContextRef context);
d16288 ¤   virtual¤~CPassphraseCache( void );
6467c5 ¤
8c5d62 ¤   PGPBoolean¤ HaveData(void) { return( mPassbufferValid ); }
c3d09e ¤   void¤   ¤   RememberPassphrase( const char *¤   passphrase );
fb2009 ¤   void¤   ¤   RememberPasskey( const void *¤  passkey,
8dc052 ¤   ¤   ¤   ¤   ¤   ¤   PGPSize passkeyLength );
c93494 ¤   void¤   ¤   Forget( void );
3d2dfa ¤   Boolean¤¤   GetPassphraseOrPasskey( void *¤ buffer,
742bc0 ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean * ·isPassphrase, PGPSize * passkeyLength );
55c5ad ¤   Boolean¤¤   GetPGPOptionList(PGPContextRef context, PGPOptionListRef *optio¶
a375b1 nList);
b967c5 ¤
8d540c ¤   void¤   ¤   SetCacheSeconds( ulong numSeconds )
--ee5e 0018b63c33f40120156 Page 2 of PassphraseCache.h
cc21fa ¤   ¤   ¤   ¤   ¤   { mEraseDelayMilliseconds = numSeconds * 1000; }
5282f7 };
50af5a
7eaf5a
4ab41d class CSignPassphraseCache : public CPassphraseCache
cabb36 {
8c0fb9 private:
f80db4 ¤   typedef CPassphraseCache¤   inherited;
1a67c5 ¤
06b05b ¤   PGPKeyID¤   ¤   ¤   ¤   mKeyID;
5e9697 ¤   PGPPublicKeyAlgorithm¤  mPublicKeyAlg;
0267c5 ¤
665ed4 public:
5b9a33 ¤   CSignPassphraseCache(PGPContextRef context);
6067c5 ¤
3d850f ¤   /* key is no longer needed after remembering */
15c0d9 ¤   void¤   ¤   RememberPassphrase( const char *passphrase, PGPKeyRef key );
dc2009 ¤   void¤   ¤   RememberPasskey( const void *¤  passkey,
6fc695 ¤   ¤   ¤   ¤   ¤   ¤   PGPSize passkeyLength, PGPKeyRef key );
5767c5 ¤
747fdc ¤   /* key set MUST be valid */
81ea91 ¤   Boolean¤¤   GetPassphraseOrPasskey( PGPKeySetRef allKeys,
812c32 ¤   ¤   ¤   ¤   ¤   void *buffer, PGPBoolean * isPassphrase,
4e9ac3 ¤   ¤   ¤   ¤   ¤   PGPSize * passkeyLength, PGPKeyRef *key);
1482f7 };
2caf5a
5faf5a
ed3379 #ifdef __cplusplus
036dad extern "C" {
f17454 #endif
2baf5a
a0d83c ·
a566c0 extern CSignPassphraseCache *¤  gSigningPassphraseCache;
d585ca extern CSignPassphraseCache *¤  gDecryptionPassphraseCache;
d4af5a
16af5a
41b0bc void¤   ¤   InitPassphraseCaches( PGPContextRef context );
231b88 void¤   ¤   DisposePassphraseCaches( void );
92af5a
37af5a
d3af5a
253379 #ifdef __cplusplus
78efe6 }
767454 #endif
ddaf5a
8baf5a
--8801 000d50fbf7e40120157 Page 1 of SignatureStatusMessage.cp
4b6438 /*_____________________________________________________________________________
cec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
2d4b0f ¤   All rights reserved.
167cb9 _____________________________________________________________________________*/
8aaf5a
4f4b15 #include <TextUtils.h>
99af5a
7a28cd #include <PP_Types.h>
38af5a
0285c2 #include "MacStrings.h"
62af5a
d4f8d2 #include "PGPSharedEncryptDecrypt.h"
b01ef8 #include "SignatureStatusMessage.h"
d8a076 #include "pgpKeys.h"
974919 #include "pgpUtilities.h"
85af5a
c2af5a
cdc336 const ResID¤kSigStatusStrListID¤= 14383;¤   // STR#
047353 enum
44bb36 {
64d1aa ¤   kSigStatusTemplateStrIndex¤ = 1,
b837c9 ¤   kSigStatusUnknownStrIndex,
54537e ¤   kSigStatusNotVerifiedStrIndex,
dfb904 ¤   kSigStatusGoodStrIndex,
f067c5 ¤
24a6d7 ¤   kSigStatusGoodButNoValidityStrIndex,
bbd075 ¤   kSigStatusGoodButMarginalValidityStrIndex,
209c2b ¤   kSigStatusGoodButUnknownValidityStrIndex,
684b30 ¤   kSigStatusGoodButExpiredStrIndex,
002283 ¤   kSigStatusGoodButDisabledStrIndex,
03a057 ¤   kSigStatusGoodButRevokedStrIndex,
21bb76 ¤   kSigStatusGoodButProblemStrIndex,
61379a ¤   kSigStatusKeyCorruptStrIndex,
d167c5 ¤
3e3630 ¤   kSigStatusBadStrIndex
5b82f7 };
ccaf5a
26af5a
18af5a
9fb374 ¤   static short
40dc04 GetSignatureStatusStrIndex(
4e1872 ¤   PGPEventSignatureData const * sigData,
11bd21 ¤   char const *¤   ¤   ¤   userID )
d8bb36 {
200f82 ¤   short¤  ¤   strIndex¤   = kSigStatusUnknownStrIndex;
6626d5 ¤   PGPError¤   err¤= kPGPError_NoErr;
e867c5 ¤
31c584 ¤   if ( sigData->checked )
d8c7a1 ¤   {
b98cb2 ¤   ¤   if ( sigData->verified )
2c5b34 ¤   ¤   {
4f71b2 ¤   ¤   ¤   PGPSharedKeyProperties¤ properties;
d574a7 ¤   ¤   ¤   PGPValidity¤¤   ¤   ¤   validity;
eb87c7 ¤   ¤   ¤
ecd3af ¤   ¤   ¤   /* checked, verified ·*/
b187c7 ¤   ¤   ¤
955f61 ¤   ¤   ¤   pgpAssert( sigData->signingKey != kInvalidPGPKeyRef );
dc9403 ¤   ¤   ¤   validity¤   = sigData->keyValidity;
d187c7 ¤   ¤   ¤
87ab00 ¤   ¤   ¤   strIndex¤   = kSigStatusUnknownStrIndex;
35af5a
68da60 ¤   ¤   ¤   // we don't really need all this stuff,
f45afc ¤   ¤   ¤   // but we do need the validity
d0510a ¤   ¤   ¤   err¤= PGPSharedGetKeyProperties(·
0b639f ¤   ¤   ¤   ¤   ¤   sigData->signingKey,
bf4f40 ¤   ¤   ¤   ¤   ¤   userID, &properties );
af144d ¤   ¤   ¤   pgpAssertNoErr( err );
be87c7 ¤   ¤   ¤
cefa3b ¤   ¤   ¤   if ( sigData->keyRevoked )
19dc60 ¤   ¤   ¤   ¤   strIndex¤   = kSigStatusGoodButRevokedStrIndex;
95cbbf ¤   ¤   ¤   else if ( sigData->keyExpired )
d53707 ¤   ¤   ¤   ¤   strIndex¤   = kSigStatusGoodButExpiredStrIndex;
--72a0 00053f5eb8540120157 Page 2 of SignatureStatusMessage.cp
66d852 ¤   ¤   ¤   else if ( sigData->keyDisabled )
8ab6ca ¤   ¤   ¤   ¤   strIndex¤   = kSigStatusGoodButDisabledStrIndex;
394088 ¤   ¤   ¤   else if ( ( ! properties.isAxiomatic ) &&
9a6804 ¤   ¤   ¤   ¤   ¤   validity != kPGPValidity_Complete )
a7f776 ¤   ¤   ¤   {
371182 ¤   ¤   ¤   ¤   if ( validity == kPGPValidity_Marginal )
b4a9bf ¤   ¤   ¤   ¤   strIndex = kSigStatusGoodButMarginalValidityStrIndex;
a4a1ac ¤   ¤   ¤   ¤   else if ( validity == kPGPValidity_Invalid )
b62365 ¤   ¤   ¤   ¤   strIndex = kSigStatusGoodButNoValidityStrIndex;
95fa07 ¤   ¤   ¤   ¤   else
d53d56 ¤   ¤   ¤   ¤   strIndex = kSigStatusGoodButUnknownValidityStrIndex;
91a3a6 ¤   ¤   ¤   }
59408e ¤   ¤   ¤   else if ( properties.isCorrupt )
12f776 ¤   ¤   ¤   {
91544e ¤   ¤   ¤   ¤   // can this case even occur? ·How did we verify things
4d16c9 ¤   ¤   ¤   ¤   // then?
4ec2b1 ¤   ¤   ¤   ¤   strIndex¤   = kSigStatusKeyCorruptStrIndex;
2fa3a6 ¤   ¤   ¤   }
dfbb8c ¤   ¤   ¤   else
69f776 ¤   ¤   ¤   {
8c1904 ¤   ¤   ¤   ¤   strIndex¤   = kSigStatusGoodStrIndex;
e7a3a6 ¤   ¤   ¤   }
f60fe4 ¤   ¤   }
200e1d ¤   ¤   else
b05b34 ¤   ¤   {
870aee ¤   ¤   ¤   /* checked, ! verified */
e22445 ¤   ¤   ¤   strIndex¤   = kSigStatusBadStrIndex;
c50fe4 ¤   ¤   }
0e9371 ¤   }
e00e24 ¤   else
01c7a1 ¤   {
a89c6a ¤   ¤   /* !checked*/
4254d5 ¤   ¤   strIndex¤   = kSigStatusNotVerifiedStrIndex;
719371 ¤   }
8567c5 ¤
f967c5 ¤
0c7664 ¤   return( strIndex );
d2efe6 }
beaf5a
236d52 ¤   void
31c82b GetSignatureStatusMessage(
bfc805 ¤   SignatureStatusInfo const *¤info,
188594 ¤   StringPtr¤  ¤   ¤   ¤   ¤   msg )
52bb36 {
5afbb2 ¤   ConstStringPtr¤ result¤ = nil;
fa8adc ¤   ulong¤  ¤   ¤   now;
db55b1 ¤   ushort¤ ¤   ¤   strIndex;
4e604e ¤   Str255¤ ¤   ¤   tempString;
9ecc6f ¤   Str255¤ ¤   ¤   statusTemplate;
2ee3df ¤   char¤   ¤   ¤   userName[ 256 ];
6e9372 ¤   PGPError¤   ¤   err¤= kPGPError_NoErr;
1a75fb ¤   PGPEventSignatureData const *¤  sigData¤= &info->sigData;
cb67c5 ¤
1c0abf ¤   GetIndString( statusTemplate, kSigStatusStrListID,
c5854b ¤   ¤   ¤   ¤   kSigStatusTemplateStrIndex );
1367c5 ¤
c2cb04 ¤   userName[ 0 ]¤  = 0;
337b2b ¤   if ( PGPKeyRefIsValid( sigData->signingKey ) )
7cc7a1 ¤   {
b355d8 ¤   ¤   err¤= PGPGetPrimaryUserIDNameBuffer( sigData->signingKey,
541d0f ¤   ¤   ¤   sizeof(userName), userName, NULL );
c59832 ¤   ¤   pgpAssertNoErr( err );
c59371 ¤   }
7d0e24 ¤   else
88c7a1 ¤   {
e283f3 ¤   ¤   /* no key, use key ID */
d797b7 ¤   ¤   CopyCString( info->keyIDString, userName );
699371 ¤   }
231b52 ¤   ¤
9dfa70 ¤   // *** PGP Signature Status: %s
f2d548 ¤   strIndex¤   = GetSignatureStatusStrIndex( sigData, userName);
5383fc ¤   GetIndString( tempString, kSigStatusStrListID, strIndex ·);
--e166 001392e785840120157 Page 3 of SignatureStatusMessage.cp
98c149 ¤   PrintPString( msg, statusTemplate, tempString );
7467c5 ¤
f67b2b ¤   if ( PGPKeyRefIsValid( sigData->signingKey ) )
03c7a1 ¤   {
bb42b5 ¤   ¤   ulong¤  ¤   ¤   macTime;
a8af5a
141417 ¤   ¤   // *** Signer: %s
e633a6 ¤   ¤   CToPString( userName, tempString );
93ccd5 ¤   ¤   PrintPString( msg, msg, tempString );
291b52 ¤   ¤
9c59b1 ¤   ¤   macTime¤= PGPTimeToMacTime( sigData->creationTime );
59d3de ¤   ¤   // *** Signed: %s, %s
0fc230 ¤   ¤   IUDateString( macTime, shortDate, tempString );
8accd5 ¤   ¤   PrintPString( msg, msg, tempString );
ad0945 ¤   ¤   IUTimeString( macTime, false, tempString );
8accd5 ¤   ¤   PrintPString( msg, msg, tempString );
129371 ¤   }
bc0e24 ¤   else
a5c7a1 ¤   {
a001d0 ¤   ¤   const uchar¤¤   kNotAvailableString[]¤  = "\pN/A";
151b52 ¤   ¤
9c33a6 ¤   ¤   CToPString( userName, tempString );
7accd5 ¤   ¤   PrintPString( msg, msg, tempString );
b1c1b9 ¤   ¤   PrintPString( msg, msg, kNotAvailableString );
fdc1b9 ¤   ¤   PrintPString( msg, msg, kNotAvailableString );
0a9371 ¤   }
171b52 ¤   ¤
19782f ¤   // *** Verifed: %s, %s
d13248 ¤   GetDateTime( &now );
508ab3 ¤   IUDateString( now, shortDate, tempString );
62f510 ¤   PrintPString( msg, msg, tempString );
cbfba4 ¤   IUTimeString( now, false, tempString );
91f510 ¤   PrintPString( msg, msg, tempString );
98efe6 }
79af5a
c9af5a
2daf5a
39af5a
--35b7 001e7e6ca5b40120158 Page 1 of SignatureStatusMessage.h
4b6438 /*_____________________________________________________________________________
cec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
2d4b0f ¤   All rights reserved.
167cb9 _____________________________________________________________________________*/
7a7b7d #pragma once
01af5a
13af5a
559f63 #include "pgpEncode.h"
84a076 #include "pgpKeys.h"
16af5a
d599c6 PGP_BEGIN_C_DECLARATIONS
bbcbcf #if PRAGMA_IMPORT_SUPPORTED
e6b981 #pragma import on
4b7454 #endif
91af5a
95af5a
4f1741 typedef struct
8cbb36 {
88de58 ¤   PGPEventSignatureData¤  sigData;
ed4a5e ¤   /* used if key could not be found */
98b990 ¤   char¤   ¤   ¤   ¤   ¤   keyIDString[ kPGPMaxKeyIDStringSize ];
b02684 } SignatureStatusInfo;
abaf5a
2ed6df void GetSignatureStatusMessage(¤SignatureStatusInfo const *¤info,
00842f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringPtr¤  msg );
d3af5a
3faf5a
b7af5a
afcbcf #if PRAGMA_IMPORT_SUPPORTED
2e2ced #pragma import reset
fc7454 #endif
e72827 PGP_END_C_DECLARATIONS¶
--48d7 000a249309040120159 Page 1 of WordWrap.cp
4b6438 /*_____________________________________________________________________________
cec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
2d4b0f ¤   All rights reserved.
167cb9 _____________________________________________________________________________*/
8aaf5a
88b935 #include <Timer.h>
4bfeb2 #include <stdio.h>
90324c #include <string.h>
fb156c #include <FSp_fopen.h>
3baf5a
fc0d08 #include "pgpMem.h"
d0bbf4 #include "MacFiles.h"
47af5a
da9e1d #include "WordWrap.h"
cdaf5a
e88005 no longer used; use pfl/common/util/pgpWordWrap.c
7faf5a
59cd1d #define MIN(a, b )¤ ¤   ( (a) <= (b) ? (a) : (b) )
10af5a
4eaf5a
a7837d ¤   inline Boolean
6c9ee1 IsWordBreakChar( char c )
1abb36 {
932e49 ¤   return( c == ' ' ||
dddecd ¤   ¤   ¤   c == '\t' ||
92b573 ¤   ¤   ¤   c == '\n' ||
127707 ¤   ¤   ¤   c == '\r' );
80efe6 }
b7af5a
0c837d ¤   inline Boolean
7c0590 IsEOLChar( char c )
05bb36 {
0743ed ¤   return( c == '\r' || c == '\n' );
94efe6 }
a7af5a
93af5a
f969ed ¤   static ushort
e3ee73 FindBreakChar( const char *buffer, ulong numChars )
76bb36 {
88dd6e ¤   ushort¤ breakIndex¤ = numChars;
ae67c5 ¤
06a350 ¤   // time to line break...find the last breaking character
e373ad ¤   for ( short index = numChars - 1; index >= 0; --index )
73c7a1 ¤   {
0e97d6 ¤   ¤   if ( IsWordBreakChar( buffer[ index ] ) )
9e5b34 ¤   ¤   {
4dbd68 ¤   ¤   ¤   breakIndex¤ = index;
5acdcb ¤   ¤   ¤   break;
300fe4 ¤   ¤   }
2a9371 ¤   }
ead793 ¤   return( breakIndex );
1aefe6 }
dcaf5a
91af5a
35d140 ¤   static OSErr
74c0fe WordWrapFiles(
7f999a ¤   FILE *¤ ¤   ¤   in,¤¤   ¤   // should be positioned at start
d2b794 ¤   FILE *¤ ¤   ¤   out,¤   ¤   // should be positioned at start
f2aa9f ¤   ushort¤ ¤   ¤   wrapLength,
254055 ¤   const char *¤   lineEnd¤¤   // "\r", "\r\n", "\n"
d527e6 ¤   )
a6bb36 {
1e6920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
80a068 ¤   int¤¤   ¤   ¤   c;
458105 ¤   ushort¤ ¤   ¤   charsOnCurrentLine¤ = 0;
4205da ¤   const ushort¤   kBufferSize¤¤   ¤   = 512;
81f574 ¤   char¤   ¤   ¤   buffer[ kBufferSize ];
58208d ¤   ushort¤ ¤   ¤   charsInBuffer¤  ¤   = 0;
3a696a ¤   ushort¤ ¤   ¤   lineEndLength¤  ¤   = strlen( lineEnd );
9667c5 ¤
625365 ¤   pgpAssert( wrapLength + 1 <= kBufferSize );
a2c1d1 ¤   if ( wrapLength + 1 > kBufferSize )
--2d3f 00037e695e040120159 Page 2 of WordWrap.cp
2649fa ¤   ¤   return( -1 );
6367c5 ¤
c98f91 ¤   while( ·(c = getc( in ) ) != EOF )
36c7a1 ¤   {
f2cc5b ¤   ¤   // accumulate characters into our temp buffer
b5b558 ¤   ¤   pgpAssert( charsInBuffer < kBufferSize );
003d4f ¤   ¤   buffer[ charsInBuffer ]¤= c;
aba44d ¤   ¤   ++charsInBuffer;
281b52 ¤   ¤
a4b3f6 ¤   ¤   if ( IsEOLChar( c ) )
135b34 ¤   ¤   {
5f420b ¤   ¤   ¤   charsOnCurrentLine¤ = 0;
2587c7 ¤   ¤   ¤
31b690 ¤   ¤   ¤   // if the buffer can't hold another lines worth, then write it
69ecbc ¤   ¤   ¤   // out now
1dd231 ¤   ¤   ¤   if ( charsInBuffer + wrapLength + 1 > kBufferSize )
9ef776 ¤   ¤   ¤   {
a23c37 ¤   ¤   ¤   ¤   if ( fwrite( buffer, sizeof(char), charsInBuffer, out ) !=
1aa4f8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   charsInBuffer )
8772c3 ¤   ¤   ¤   ¤   {
c1f753 ¤   ¤   ¤   ¤   ¤   err¤= -1;
6914c3 ¤   ¤   ¤   ¤   ¤   break;
142613 ¤   ¤   ¤   ¤   }
f828fc ¤   ¤   ¤   ¤   charsInBuffer¤  = 0;
75a3a6 ¤   ¤   ¤   }
c90fe4 ¤   ¤   }
4c0e1d ¤   ¤   else
6a5b34 ¤   ¤   {
ce0803 ¤   ¤   ¤   ++charsOnCurrentLine;
8fe4e5 ¤   ¤   ¤   if ( charsOnCurrentLine > wrapLength )
6df776 ¤   ¤   ¤   {
a2c6a3 ¤   ¤   ¤   ¤   ushort¤ breakIndex¤ = charsInBuffer;
752b85 ¤   ¤   ¤   ¤
44f8a7 ¤   ¤   ¤   ¤   breakIndex¤ = FindBreakChar( buffer, charsInBuffer );
f587c7 ¤   ¤   ¤
33577e ¤   ¤   ¤   ¤   if ( fwrite( buffer, sizeof(char), breakIndex, out ) !=
f61513 ¤   ¤   ¤   ¤   ¤   ¤   ¤   breakIndex )
b772c3 ¤   ¤   ¤   ¤   {
a6f753 ¤   ¤   ¤   ¤   ¤   err¤= -1;
e114c3 ¤   ¤   ¤   ¤   ¤   break;
282613 ¤   ¤   ¤   ¤   }
e7fa4a ¤   ¤   ¤   ¤   if ( fwrite( lineEnd, sizeof(char), lineEndLength, out ) !=
b263ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   lineEndLength )
c172c3 ¤   ¤   ¤   ¤   {
3bf753 ¤   ¤   ¤   ¤   ¤   err¤= -1;
c514c3 ¤   ¤   ¤   ¤   ¤   break;
542613 ¤   ¤   ¤   ¤   }
012b85 ¤   ¤   ¤   ¤
a10571 ¤   ¤   ¤   ¤   // careful: we are skipping the breaking char
a1aa21 ¤   ¤   ¤   ¤   pgpAssert( breakIndex <= charsInBuffer );
48e3b8 ¤   ¤   ¤   ¤   if ( breakIndex < charsInBuffer - 1 )
8a72c3 ¤   ¤   ¤   ¤   {
51b7aa ¤   ¤   ¤   ¤   ¤   // characters remain in the buffer after the break
b4dfe9 ¤   ¤   ¤   ¤   ¤   // character
71293a ¤   ¤   ¤   ¤   ¤   charsInBuffer¤  -= breakIndex + 1;
0702de ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( &buffer[ breakIndex + 1 ], &buffer[ 0 ],
898697 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   charsInBuffer);
b12613 ¤   ¤   ¤   ¤   }
adfa07 ¤   ¤   ¤   ¤   else
f072c3 ¤   ¤   ¤   ¤   {
119b90 ¤   ¤   ¤   ¤   ¤   charsInBuffer¤  = 0;¤
352613 ¤   ¤   ¤   ¤   }
4f2b85 ¤   ¤   ¤   ¤
2c1a5c ¤   ¤   ¤   ¤   charsOnCurrentLine¤ = charsInBuffer;
f3a3a6 ¤   ¤   ¤   }
c00fe4 ¤   ¤   }
399371 ¤   }
0767c5 ¤
705766 ¤   // flush any characters that remain in buffer
2e60c8 ¤   if ( charsInBuffer != 0 )
f2c7a1 ¤   {
37ff10 ¤   ¤   if ( fwrite( buffer, sizeof(char), charsInBuffer, out ) !=
--d337 001c5fb428840120159 Page 3 of WordWrap.cp
e6e9cb ¤   ¤   ¤   ¤   ¤   charsInBuffer )
e15b34 ¤   ¤   {
efb9b2 ¤   ¤   ¤   err¤= -1;
b50fe4 ¤   ¤   }
919371 ¤   }
df67c5 ¤
2cdeb7 ¤   return( err );
88efe6 }
11af5a
17af5a
66eacd ¤   OSErr
b56d61 FSpWordWrapFile(
c24c49 ¤   const FSSpec *¤ inSpec,
4be782 ¤   const FSSpec *¤ outSpec,
736f76 ¤   ushort¤ ¤   ¤   wrapLength )
8dbb36 {
25a32f ¤   AssertSpecIsValid( inSpec, "FSpWordWrapFile" );
d4ea30 ¤   AssertSpecIsValid( outSpec, "FSpWordWrapFile" );
8d4736 ¤   pgpAssert( ! FSpEqual( inSpec, outSpec ) );
022774 ¤   pgpAssert( wrapLength != 0 );
c867c5 ¤
d930bd ¤   OSErr¤  ¤   err;
30d05e ¤   FILE *¤ ¤   in¤ = NULL;
3f3e22 ¤   FILE *¤ ¤   out¤= NULL;
974f27 ¤   CInfoPBRec¤ cpb;
491b52 ¤   ¤
859a6c ¤   (void)FSpGetCatInfo( inSpec, &cpb );
f6af5a
ed04f8 ¤   err¤= FSpCreate( outSpec, cpbFileCreator( &cpb ), cpbFileType( &cpb ),
7cba78 ¤   ¤   ¤   ¤   smSystemScript );
ec5ecc ¤   if ( IsntErr( err ) )
4fc7a1 ¤   {
17ef92 ¤   ¤   in¤ = FSp_fopen( inSpec, "rb" );
b392b5 ¤   ¤   if ( IsntNull( in ) )
22f991 ¤   ¤   ¤   out¤= FSp_fopen( outSpec, "wb" );
939371 ¤   }
9367c5 ¤
eebb33 ¤   if ( IsntNull( in ) && IsntNull( out ) )
59c7a1 ¤   {
79b64f ¤   ¤   err¤= WordWrapFiles( in, out, wrapLength, "\r" );
c69371 ¤   }
ce0e24 ¤   else
36c7a1 ¤   {
0e3dca ¤   ¤   err¤= memFullErr;
3f9371 ¤   }
ad67c5 ¤
691be1 ¤   if ( IsntNull( in ) )
68808a ¤   ¤   fclose( in );
f7eab3 ¤   if ( IsntNull( out ) )
268d96 ¤   ¤   fclose( out );
6767c5 ¤
87deb7 ¤   return( err );
28efe6 }
76af5a
48af5a
4baf5a
7daf5a
41af5a
c5af5a
--4417 001f9ab42404012015a Page 1 of WordWrap.h
4b6438 /*_____________________________________________________________________________
cec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
2d4b0f ¤   All rights reserved.
167cb9 _____________________________________________________________________________*/
8aaf5a
f77b7d #pragma once
b6af5a
848005 no longer used; use pfl/common/util/pgpWordWrap.c
59af5a
2c3379 #ifdef __cplusplus
436dad extern "C" {
527454 #endif
b0af5a
d7efd2 OSErr¤  FSpWordWrapFile( const FSSpec *¤inSpec, const FSSpec * outSpec,
9626ee ¤   ¤   ¤   ushort wrapLength );
17af5a
39af5a
7b3379 #ifdef __cplusplus
89efe6 }
f92841 #endif¶
--d3c1 0005ce71beb4012015b Page 1 of pgpMacCustomContextAlloc.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
edb805 ¤   $Id: pgpMacCustomContextAlloc.c,v 1.8.8.1 1998/11/12 03:09:56 heller Exp $
86f7f7 ____________________________________________________________________________*/
1baf5a
66f5d2 #include "pgpMacCustomContextAlloc.h"
930d08 #include "pgpMem.h"
266773 #include "pgpMemoryMgr.h"
198bd8 #include "MacEnvirons.h"
77af5a
e77070 typedef struct BlockHeader
a8bb36 {
6f576a ¤   /* we should keep this struct a multiple of 16 bytes. ·For now,
0c5404 ¤   we use the extra space for extra magic fields */
79f677 ¤   #define kMagic¤ ¤   'MACM'
fb9d0d ¤   PGPUInt32¤  ¤   magic;
20a48c ¤   // if temp-mem, then this is non-null
655081 ¤   Handle¤ ¤   ¤   tempMemHandle;
263a06 ¤   PGPSize¤¤   ¤   userSize;
f74746 ¤   PGPUInt32¤  ¤   magic2;
acd5b2 } BlockHeader;
426a8b #define BlockHeaderToData( hdr )¤   ((void *)( ((BlockHeader *)hdr) + 1 ))
cf648d #define DataToBlockHeader( data )¤  \
774572 ¤   ((BlockHeader *)(((char *)data) - sizeof( BlockHeader )))
79af5a
748a82 #define IsTempMemBlock( hdr )¤  ¤   ( IsntNull( (hdr)->tempMemHandle ) )
66af5a
f06c2c ¤   static PGPBoolean
060bb6 sHeaderIsValid( BlockHeader const *hdr )
dfbb36 {
d0cd1f ¤   if ( IsNull( hdr ) )
dce20d ¤   ¤   return( FALSE );
7f08c5 ¤   return( hdr->magic == kMagic && hdr->magic2 == kMagic );
c5efe6 }
19af5a
6d792b #define BlockIsValid( hdr )¤¤   ( IsntNull( hdr ) && sHeaderIsValid( hdr ) )
b6af5a
2fefe2 /* anything larger than this will be allocated in temp mem */
d4cff2 #define kTempMemCutoff¤ ¤   ( 4UL * 1024UL )
7caf5a
e8af5a
9c25b0 ¤   static BlockHeader *
591cf3 sAllocateBlock(
a14abc ¤   PGPSize¤¤   requestSize,
f18c31 ¤   PGPBoolean¤ useTempMem )
dfbb36 {
97095b ¤   PGPSize¤¤   ¤   totalSize¤  = requestSize + sizeof( BlockHeader );
a7980e ¤   BlockHeader *¤  header¤ = NULL;
4867c5 ¤
1cde39 ¤   /* try getting a plain Ptr first, if that's what's desired */
1c33eb ¤   if ( requestSize < kTempMemCutoff )
ffc7a1 ¤   {
48b2e9 ¤   ¤   header¤ = (BlockHeader *)NewPtr( totalSize );
9f57cb ¤   ¤   if ( IsntNull( header ) )
0a0734 ¤   ¤   ¤   header->tempMemHandle¤  = NULL;
299371 ¤   }
3067c5 ¤
752455 ¤   if ( IsNull( header ) ·&& useTempMem)
85c7a1 ¤   {
a54de5 ¤   ¤   Handle¤ tempHandle;
2102da ¤   ¤   OSErr¤  err;
fcaf5a
a0f4b9 ¤   ¤   tempHandle¤ = TempNewHandle( totalSize, &err );
a012fb ¤   ¤   if ( IsntNull( tempHandle ) && IsntErr( err ) )
e75b34 ¤   ¤   {
d661fc ¤   ¤   ¤   HLock( tempHandle );
89cca5 ¤   ¤   ¤   header¤ = (BlockHeader *)*tempHandle;
5ca72e ¤   ¤   ¤   header->tempMemHandle¤  = tempHandle;
--7876 000f149450f4012015b Page 2 of pgpMacCustomContextAlloc.c
b50fe4 ¤   ¤   }
3b1b52 ¤   ¤
059371 ¤   }
ca67c5 ¤
3460c3 ¤   if ( IsntNull( header ) )
1dc7a1 ¤   {
fdfd26 ¤   ¤   header->magic¤  ¤   = kMagic;
c3de9a ¤   ¤   header->magic2¤ ¤   = kMagic;
28daff ¤   ¤   header->userSize¤   = requestSize;
7c9371 ¤   }
6767c5 ¤
4acbbb ¤   return( header );
21efe6 }
d1af5a
db062a ¤   static void *
3f2d9e sMacCustomAllocator(
875f6a ¤   PGPMemoryMgrRef ¤   mgr,
9e96f3 ¤   PGPUserValue¤   ¤   userValue,
40cb76 ¤   PGPSize ¤   ¤   ¤   requestSize,
682324 ¤   PGPMemoryMgrFlags ¤ flags )
eebb36 {
59980e ¤   BlockHeader *¤  header¤ = NULL;
22fee9 ¤   void *¤ ¤   ¤   mem¤= NULL;
9767c5 ¤
49b076 ¤   (void)mgr;
a34000 ¤   (void)flags;
ff9024 ¤   (void)userValue;
1267c5 ¤
05142d ¤   header¤ = sAllocateBlock( requestSize, TRUE );
bd67c5 ¤
ac60c3 ¤   if ( IsntNull( header ) )
2b3309 ¤   ¤   mem¤= BlockHeaderToData( header );
b50e24 ¤   else
ced855 ¤   ¤   mem¤= NULL;
348086 ¤   return( mem );
b6efe6 }
6faf5a
1eaf5a
3faf5a
e866dd ¤   static PGPError
ebf4c5 sMacCustomDealloc(
55724e ¤   PGPMemoryMgrRef mgr,
f43298 ¤   PGPUserValue¤   userValue,
2a60fa ¤   void *¤ ¤   ¤   allocation,
d4a3c0 ¤   PGPSize ¤   ¤   allocationSize )
e9bb36 {
559372 ¤   PGPError¤   ¤   err¤= kPGPError_NoErr;
1f980e ¤   BlockHeader *¤  header¤ = NULL;
8467c5 ¤
455a19 ¤   (void) mgr;
4e4d52 ¤   (void) userValue;
d44dfb ¤   (void) allocationSize;
0b67c5 ¤
b97a44 ¤   if ( IsNull( allocation ) )
95c7a1 ¤   {
9f9d35 ¤   ¤   pgpDebugMsg( "pgpMacCustomDealloc: NULL block" );
6a4023 ¤   ¤   return( kPGPError_BadParams );
869371 ¤   }
1367c5 ¤
431075 ¤   header¤ = DataToBlockHeader( allocation );
c83b89 ¤   if ( ! BlockIsValid( header ) )
61c7a1 ¤   {
b12379 ¤   ¤   pgpDebugMsg( "pgpMacCustomDealloc: bad block" );
3f4023 ¤   ¤   return( kPGPError_BadParams );
8f9371 ¤   }
f767c5 ¤
c00299 ¤   if ( IsTempMemBlock( header ) )
d5c7a1 ¤   {
269069 ¤   ¤   Handle¤ theHandle;
721b52 ¤   ¤
9c784b ¤   ¤   theHandle¤  = header->tempMemHandle;
f190cb ¤   ¤   pgpAssert( (Ptr)header == (Ptr)*theHandle );
--e6ed 00005b2ad4a4012015b Page 3 of pgpMacCustomContextAlloc.c
f11b52 ¤   ¤
e0bbea ¤   ¤   MacDebug_FillWithGarbage( *theHandle ,
4926c7 ¤   ¤   ¤   GetHandleSize( theHandle ) );
be87c7 ¤   ¤   ¤
eb98c2 ¤   ¤   DisposeHandle( theHandle );
6d9371 ¤   }
f00e24 ¤   else
20c7a1 ¤   {
425273 ¤   ¤   MacDebug_FillWithGarbage( header,
ed5004 ¤   ¤   ¤   GetPtrSize( (Ptr)header ) );
281b52 ¤   ¤
b8a103 ¤   ¤   DisposePtr( (Ptr)header );
8c9371 ¤   }
5caf5a
0a67c5 ¤
91deb7 ¤   return( err );
2eefe6 }
7caf5a
d2af5a
61af5a
7966dd ¤   static PGPError
018e99 sMacCustomRealloc(·
ca5f6a ¤   PGPMemoryMgrRef ¤   mgr,
2196f3 ¤   PGPUserValue¤   ¤   userValue,
bb43d9 ¤   void **¤¤   ¤   ¤   allocationPtr,
0b3250 ¤   PGPSize¤¤   ¤   ¤   newAllocationSize,
366569 ¤   PGPMemoryMgrFlags¤  flags,
a915ed ¤   PGPSize ¤   ¤   ¤   existingSize)
51bb36 {
b3a8cb ¤   PGPError¤   ¤   err¤= kPGPError_OutOfMemory;
4e980e ¤   BlockHeader *¤  header¤ = NULL;
7d32d7 ¤   PGPSize¤¤   ¤   totalSize;
5267c5 ¤
044487 ¤   PGPValidatePtr( allocationPtr );
7d6db2 ¤   header¤ ¤   = DataToBlockHeader( *allocationPtr );
606976 ¤   PGPValidateParam( BlockIsValid( header ) );
bd2b40 ¤   if ( newAllocationSize == header->userSize )
85a117 ¤   ¤   return( kPGPError_NoErr );
9267c5 ¤
418586 ¤   totalSize¤  = newAllocationSize + sizeof(BlockHeader);
2f67c5 ¤
2a753b ¤   /* CAUTION: if we fail, original must *not* move original */
f267c5 ¤
fd26de ¤   /* first, try resizing existing block in place */
1a01db ¤   /* for temp mem, don't attempt to grow a locked block;
a0c55e ¤   ··it may or may not be legal */
8b2acf ¤   err¤= kPGPError_OutOfMemory;
d14da9 ¤   if ( IsTempMemBlock( header ))
f8c7a1 ¤   {
c7d106 ¤   ¤   if ( newAllocationSize <= header->userSize )
f75b34 ¤   ¤   {
db4ed0 ¤   ¤   ¤   /* it's locked, but resizing may succeed */
3ea536 ¤   ¤   ¤   SetHandleSize( header->tempMemHandle, totalSize );
445d69 ¤   ¤   ¤   if ( GetHandleSize( header->tempMemHandle ) == totalSize )
9af776 ¤   ¤   ¤   {
f615f0 ¤   ¤   ¤   ¤   err¤= kPGPError_NoErr;
70a3a6 ¤   ¤   ¤   }
4d0fe4 ¤   ¤   }
659371 ¤   }
0e0e24 ¤   else
b6c7a1 ¤   {
dd2939 ¤   ¤   SetPtrSize( (Ptr)header, totalSize );
8ae697 ¤   ¤   if ( GetPtrSize( (Ptr)header ) == totalSize )
7b5b34 ¤   ¤   {
875403 ¤   ¤   ¤   err¤= kPGPError_NoErr;
f90fe4 ¤   ¤   }
e19371 ¤   }
c867c5 ¤
891861 ¤   if ( err == kPGPError_OutOfMemory )
2cc7a1 ¤   {
edae06 ¤   ¤   /* resizing existing block in place failed */
050f7a ¤   ¤   /* try allocating an all-new block */
--91d1 0005ddd370b4012015b Page 4 of pgpMacCustomContextAlloc.c
133bdd ¤   ¤   PGPSize¤¤   oldSize¤¤   = header->userSize;
8c2789 ¤   ¤   void *¤ ¤   newMem;
c41b52 ¤   ¤
3aff8a ¤   ¤   newMem¤ = sMacCustomAllocator( mgr, userValue,
6dfe67 ¤   ¤   ¤   ¤   ¤   newAllocationSize, flags ·);
fa9cfd ¤   ¤   if ( IsntNull( newMem ) )
2d5b34 ¤   ¤   {
5e5403 ¤   ¤   ¤   err¤= kPGPError_NoErr;
a587c7 ¤   ¤   ¤
9c9162 ¤   ¤   ¤   pgpCopyMemory( *allocationPtr, newMem,
0ea647 ¤   ¤   ¤   ¤   pgpMin( newAllocationSize, oldSize ) );
c72b85 ¤   ¤   ¤   ¤
24c13c ¤   ¤   ¤   sMacCustomDealloc( mgr, userValue,
635032 ¤   ¤   ¤   ¤   ¤   *allocationPtr, existingSize );
6d3d63 ¤   ¤   ¤   *allocationPtr¤ = newMem;
f80fe4 ¤   ¤   }
b69371 ¤   }
1f67c5 ¤
0bf1e7 ¤   if ( IsntPGPError( err ) )
fcc7a1 ¤   {
5cedb6 ¤   ¤   header¤ = DataToBlockHeader( *allocationPtr );
020569 ¤   ¤   header->userSize¤   = newAllocationSize;
699371 ¤   }
6967c5 ¤
79deb7 ¤   return( err );
89efe6 }
d4af5a
70af5a
c4af5a
3d33c8 ¤   static void
e617a8 sLockMemory(
7f2c65 ¤   void *¤ ¤   ¤   mem,
f08dce ¤   PGPSize¤¤   ¤   numBytes )
2abb36 {
257d70 ¤   if ( VirtualMemoryIsOn() ·)
dfc7a1 ¤   {
cc72dd ¤   ¤   HoldMemory( mem, numBytes );
159371 ¤   }
43efe6 }
2faf5a
0a33c8 ¤   static void
d9eca3 sUnlockMemory(
46c601 ¤   void *¤ mem,
da2b70 ¤   PGPSize¤numBytes )
27bb36 {
197d70 ¤   if ( VirtualMemoryIsOn() ·)
18c7a1 ¤   {
8d5d04 ¤   ¤   UnholdMemory( mem, numBytes );
0f9371 ¤   }
1fefe6 }
26af5a
7faf5a
3b062a ¤   static void *
1bae21 sMacSecureMemoryAllocationProc(
d14d00 ¤   PGPMemoryMgrRef¤¤   mgr,
3296f3 ¤   PGPUserValue¤   ¤   userValue,
4d1fee ¤   PGPSize ¤   ¤   ¤   allocationSize,
116569 ¤   PGPMemoryMgrFlags¤  flags,
13b166 ¤   PGPBoolean *¤   ¤   isNonPageable )
abbb36 {
223aa4 ¤   void *¤ ¤   ¤   ptr¤= NULL;
bd980e ¤   BlockHeader *¤  header¤ = NULL;
cff161 ¤   THz¤¤   ¤   ¤   saveZone¤   = GetZone();
0867c5 ¤
329917 ¤   pgpAssert( IsntNull( isNonPageable ) );
c85a19 ¤   (void) mgr;
60eec9 ¤   (void) flags;
ce4d52 ¤   (void) userValue;
3baf5a
8d3f7c ¤   *isNonPageable¤ = TRUE;
5467c5 ¤
5dab87 ¤   /* try system zone first */
--2f86 0005f225bec4012015b Page 5 of pgpMacCustomContextAlloc.c
5e6344 ¤   SetZone( SystemZone() );
2fdce4 ¤   header¤ = (BlockHeader *)sAllocateBlock( allocationSize, FALSE );
88b2fd ¤   SetZone( saveZone );
a367c5 ¤
335e00 ¤   if ( IsNull( header ) )
cac7a1 ¤   {
b3b2c8 ¤   ¤   /* system zone failed; try current zone and temp mem */
6b762b ¤   ¤   header¤ = (BlockHeader *)sAllocateBlock( allocationSize, TRUE );
4b9371 ¤   }
1c1b52 ¤   ¤
9660c3 ¤   if ( IsntNull( header ) )
fbc7a1 ¤   {
9328a2 ¤   ¤   ptr¤= BlockHeaderToData( header );
fefe57 ¤   ¤   /* lock user data; no need to lock header portion */
a2d32f ¤   ¤   sLockMemory( ptr, allocationSize );
e59371 ¤   }
c767c5 ¤
ea8327 ¤   return( ptr );
61efe6 }
66af5a
25af5a
f5af5a
aeaf5a
9a0335 /*____________________________________________________________________________
ee8d86 ¤   The default secure memory deallocator.
f4f7f7 ____________________________________________________________________________*/
3966dd ¤   static PGPError
d4ee48 sMacSecureMemoryDeallocationProc(
0d6740 ¤   PGPMemoryMgrRef¤mgr,
953298 ¤   PGPUserValue¤   userValue,
0060fa ¤   void *¤ ¤   ¤   allocation,
be7cbb ¤   PGPSize¤¤   ¤   allocationSize,
3b8b05 ¤   PGPBoolean¤ ¤   nonPageable )
cabb36 {
5326d5 ¤   PGPError¤   err¤= kPGPError_NoErr;
8b67c5 ¤
c45a19 ¤   (void) mgr;
794dfb ¤   (void) allocationSize;
de4d52 ¤   (void) userValue;
f0af5a
2f4305 ¤   pgpAssert( nonPageable );
a2f96c ¤   if ( nonPageable )
e2c7a1 ¤   {
c3dae0 ¤   ¤   /* unlock user data; no need to unlock header portion */
6ec1a8 ¤   ¤   sUnlockMemory( allocation, allocationSize );
bd9371 ¤   }
5f67c5 ¤
636b79 ¤   err¤= sMacCustomDealloc( mgr, userValue, (Ptr)allocation, allocationSize );
7167c5 ¤
112d68 ¤   return( kPGPError_NoErr );
5befe6 }
ddaf5a
83af5a
40c744 ¤   PGPError
2069a0 pgpNewContextCustomMacAllocators(
81fe81 ¤   PGPContextRef *¤context )
7ebb36 {
179479 ¤   PGPError¤   ¤   ¤   ¤   err¤= kPGPError_NoErr;
966168 ¤   PGPMemoryMgrRef¤¤   ¤   memMgrRef;
0d9998 ¤   PGPNewMemoryMgrStruct¤  customMemMgr;
ae67c5 ¤
2a1a06 ¤   pgpClearMemory( &customMemMgr, sizeof( customMemMgr ) );
1d67c5 ¤
b90ad8 ¤   customMemMgr.sizeofStruct¤  = sizeof( customMemMgr );
ac66d2 ¤   customMemMgr.allocProc¤ ¤   = sMacCustomAllocator;
709ff4 ¤   customMemMgr.reallocProc¤   = sMacCustomRealloc;
9ea1b4 ¤   customMemMgr.deallocProc¤   = sMacCustomDealloc;
1767c5 ¤
5dab50 ¤   customMemMgr.secureAllocProc¤   = sMacSecureMemoryAllocationProc;
ca6d22 ¤   customMemMgr.secureDeallocProc¤ = sMacSecureMemoryDeallocationProc;
c767c5 ¤
5f319a ¤   err = PGPNewMemoryMgrCustom( &customMemMgr, &memMgrRef );
--5754 0018f1046864012015b Page 6 of pgpMacCustomContextAlloc.c
54b1f0 ¤   if( IsntPGPError( err ) )
f1c7a1 ¤   {
50192c ¤   ¤   PGPNewContextStruct¤¤   custom;
211b52 ¤   ¤
f67633 ¤   ¤   pgpClearMemory( &custom, sizeof( custom ) );
ce1b52 ¤   ¤
52e8eb ¤   ¤   custom.sizeofStruct¤= sizeof( custom );
87c9cc ¤   ¤   custom.memoryMgr¤   = memMgrRef;
d667c5 ¤
bd374a ¤   ¤   err¤= PGPNewContextCustom( kPGPsdkAPIVersion, &custom,
65fe85 ¤   ¤   ¤   ¤   ¤   context );
73b466 ¤   }¤  ¤   ¤
b967c5 ¤
5edeb7 ¤   return( err );
39efe6 }
cfaf5a
eb2b85 ¤   ¤   ¤   ¤
daaf5a
a8af5a
60af5a
7aaf5a
87af5a
10af5a
c4af5a
2baf5a
7daf5a
f0af5a
d6af5a
15af5a
1eaf5a
34af5a
0eaf5a
cdaf5a
3aaf5a
45af5a
23af5a
87af5a
8baf5a
16af5a
8faf5a
99af5a
e2af5a
2faf5a
27af5a
c3af5a
097e4d /*__Editor_settings____
93af5a
f04126 ¤   Local Variables:
c97b17 ¤   tab-width: 4
900e6c ¤   End:
225f8c ¤   vi: ts=4 sw=4
289e9b ¤   vim: si
8fd062 _____________________*/
--1c85 001f5127cab4012015c Page 1 of pgpMacCustomContextAlloc.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
cf9e5d ¤   $Id: pgpMacCustomContextAlloc.h,v 1.3.16.1 1998/11/12 03:09:56 heller Exp $
c1f7f7 ____________________________________________________________________________*/
ee6350 #ifndef Included_pgpMacCustomContextAlloc_h¤/* [ */
8cfe57 #define Included_pgpMacCustomContextAlloc_h
98af5a
8faf5a
e94919 #include "pgpUtilities.h"
88af5a
e399c6 PGP_BEGIN_C_DECLARATIONS
edcbcf #if PRAGMA_IMPORT_SUPPORTED
8bb981 #pragma import on
b27454 #endif
7baf5a
11af5a
bdfc02 PGPError¤   pgpNewContextCustomMacAllocators( PGPContextRef *context );
baaf5a
cdaf5a
dcaf5a
70cbcf #if PRAGMA_IMPORT_SUPPORTED
a82ced #pragma import reset
d77454 #endif
9f1254 PGP_END_C_DECLARATIONS
55af5a
46d004 #endif /* ] Included_pgpMacCustomContextAlloc_h */
4daf5a
adaf5a
3f7e4d /*__Editor_settings____
28af5a
dc4126 ¤   Local Variables:
fd7b17 ¤   tab-width: 4
3f0e6c ¤   End:
175f8c ¤   vi: ts=4 sw=4
6b9e9b ¤   vim: si
f5d062 _____________________*/
--ca0c 00015a5aa274012015d Page 1 of pgpNavServices.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
75f82a ¤   $Id: pgpNavServices.cp,v 1.5.8.1 1998/11/12 03:09:57 heller Exp $
08f7f7 ____________________________________________________________________________*/
94af5a
509dbd #include "pgpNavServices.h"
c485c2 #include "MacStrings.h"
8b0d08 #include "pgpMem.h"
32af5a
f1af5a
8b7837 typedef struct PGPOSTypeList
b6bb36 {
1eacd9 ¤   PGPUInt16¤  count;
fc5a37 ¤   OSType¤ ¤   *list;
c79eb5 } PGPOSTypeList;
b1af5a
4aaf5a
7699cb ¤   pascal Boolean
1bea22 PGPNavFilterProc(
062bd7 ¤   AEDesc *¤   ¤   ¤   ¤   theItem,
ee82f6 ¤   void *¤ ¤   ¤   ¤   ¤   info,
4b8c1c ¤   NavCallBackUserData¤¤   callBackUD,
448c05 ¤   NavFilterModes¤ ¤   ¤   filterMode );
056685 ¤   pascal void
8016f6 PGPNavEventProc(
e7b925 ¤   NavEventCallbackMessage¤callbackSelector,
b53f9d ¤   NavCBRecPtr¤¤   ¤   ¤   callbackParms,
4b58db ¤   NavCallBackUserData¤¤   callbackUD );
86af5a
fb99cb ¤   pascal Boolean
42ea22 PGPNavFilterProc(
922bd7 ¤   AEDesc *¤   ¤   ¤   ¤   theItem,
2e82f6 ¤   void *¤ ¤   ¤   ¤   ¤   info,
908c1c ¤   NavCallBackUserData¤¤   callBackUD,
996d08 ¤   NavFilterModes¤ ¤   ¤   filterMode )
23bb36 {
88c74e ¤   OSErr¤  ¤   ¤   ¤   ¤   theErr = noErr;
49a9d9 ¤   Boolean¤¤   ¤   ¤   ¤   display = true;
1143e5 ¤   NavFileOrFolderInfo *¤  theInfo = (NavFileOrFolderInfo *)info;
10b8d1 ¤   PGPOSTypeList *¤¤   ¤   typeList = (PGPOSTypeList *) callBackUD;
68af5a
276621 ¤   if( theItem->descriptorType == typeFSS )
21d7c0 ¤   ¤   if ( !theInfo->isFolder && ( filterMode == kNavFilteringBrowserList ) )
6b5b34 ¤   ¤   {
c42d7e ¤   ¤   ¤   PGPUInt16¤  typeIndex;
1a87c7 ¤   ¤   ¤
c48246 ¤   ¤   ¤   display = false;
b4cbd0 ¤   ¤   ¤   for( typeIndex = 0; typeIndex < typeList->count; typeIndex++ )
ccf776 ¤   ¤   ¤   {
02ccfc ¤   ¤   ¤   ¤   if( theInfo->fileAndFolder.fileInfo.finderInfo.fdType ==
0a9ab9 ¤   ¤   ¤   ¤   ¤   typeList->list[typeIndex] )
7c72c3 ¤   ¤   ¤   ¤   {
f3bb47 ¤   ¤   ¤   ¤   ¤   display = true;
b714c3 ¤   ¤   ¤   ¤   ¤   break;
b32613 ¤   ¤   ¤   ¤   }
b3a3a6 ¤   ¤   ¤   }
900fe4 ¤   ¤   }
5b2b37 ¤   return display;
6aefe6 }
aaaf5a
55eacd ¤   OSErr
7a7bbe PGPNavGetFileOrFolder(
c7f553 ¤   Boolean¤¤   ¤   ¤   ¤   chooseFolder,
65156a ¤   Str255¤ ¤   ¤   ¤   ¤   message,
bed887 ¤   OSType¤ ¤   ¤   ¤   ¤   defaultCreator,
2fb6e6 ¤   PGPUInt16¤  ¤   ¤   ¤   numTypes,
48b3ae ¤   OSType *¤   ¤   ¤   ¤   allowTypes,
66b964 ¤   NavEventProcPtr¤¤   ¤   updateFunc,
edc7ed ¤   FSSpec *¤   ¤   ¤   ¤   choice )
15bb36 {
--d7a4 0000d4938da4012015d Page 2 of pgpNavServices.cp
0d1de4 ¤   OSErr¤  ¤   ¤   ¤   ¤   osErr;
f8ac2f ¤   NavReplyRecord¤ ¤   ¤   navRR;
8412dc ¤   NavDialogOptions¤   ¤   navDO;
330f04 ¤   NavEventUPP¤¤   ¤   ¤   navEP = NewNavEventProc( updateFunc );
8ef4a9 ¤   NavObjectFilterUPP¤ ¤   navOF = NewNavObjectFilterProc( PGPNavFilterProc );
f252e6 ¤   PGPOSTypeList¤  ¤   ¤   typeList;
be5017 ¤   NavTypeListHandle¤  ¤   navTypeHand = NULL;
c60296 ¤   WindowRecord¤   ¤   ¤   *frontWindow;
c50e80 ¤   short¤  ¤   ¤   ¤   ¤   saveWindowKind;
8967c5 ¤
02e38c ¤   DebugPatches_DisableWhackFreeSpace();
ae67c5 ¤
bdd8af ¤   /*
2ee654 ¤   ** Stupid Appearance Manager has bugs where controls in underlying
a96385 ¤   ** dialogs will get automatically disabled. Temporarily set the
76f856 ¤   ** front window's windowKind to be something other that dialogKind
9e53d3 ¤   ** to work around this.
299faa ¤   */
4e67c5 ¤
c79755 ¤   frontWindow = (WindowRecord *) FrontWindow();
d667c5 ¤
df4c48 ¤   saveWindowKind = frontWindow->windowKind;
0f8ed3 ¤   frontWindow->windowKind = kApplicationWindowKind;
8eaf5a
8e6ea7 ¤   osErr = NavGetDefaultDialogOptions( &navDO ); if( osErr ) goto done;
e0afd1 ¤   navDO.dialogOptionFlags = kNavAllFilesInPopup;
65053b ¤   CopyPString( message, navDO.message );
4973c6 ¤   CopyPString( LMGetCurApName(), navDO.clientName );
4567c5 ¤
ee22c7 ¤   if( chooseFolder )
61f450 ¤   ¤   osErr = NavChooseFolder( NULL, &navRR, &navDO, navEP, NULL, NULL );
7b0e24 ¤   else
19c7a1 ¤   {
956303 ¤   ¤   typeList.count¤ = numTypes;
612929 ¤   ¤   typeList.list¤  = allowTypes;
c91b52 ¤   ¤
d83218 ¤   ¤   navTypeHand = (NavTypeListHandle) NewHandle( sizeof(NavTypeList) +
116c3d ¤   ¤   ¤   ¤   ¤   ¤   ( sizeof( OSType ) * ( numTypes - 1 ) ) );
fbdbbf ¤   ¤   if( IsntNull( navTypeHand ) )
fb5b34 ¤   ¤   {
51459d ¤   ¤   ¤   (*navTypeHand)->componentSignature¤ = defaultCreator;
07b034 ¤   ¤   ¤   (*navTypeHand)->reserved¤   ¤   ¤   = 0;
715102 ¤   ¤   ¤   (*navTypeHand)->osTypeCount¤¤   ¤   = numTypes;
3c5d26 ¤   ¤   ¤   for( PGPUInt16 typeIndex = 0; typeIndex < numTypes; typeIndex++ )
cd2762 ¤   ¤   ¤   ¤   (*navTypeHand)->osType[typeIndex] = allowTypes[typeIndex];
ff0fe4 ¤   ¤   }
2c1b52 ¤   ¤
bbeb63 ¤   ¤   osErr = NavGetFile( NULL, &navRR, &navDO, navEP, NULL, NULL, //navOF,
5230f9 ¤   ¤   ¤   ¤   ¤   ¤   navTypeHand, (NavCallBackUserData) &typeList );
389371 ¤   }
4967c5 ¤
6970f3 ¤   frontWindow->windowKind = saveWindowKind;
08af5a
4e0930 ¤   if( navRR.validRecord && ( osErr == noErr ) )
e5c7a1 ¤   {
cdfd30 ¤   ¤   AEDesc¤ ¤   ¤   ¤   aed;
5d1b52 ¤   ¤
cfb966 ¤   ¤   osErr = AEGetNthDesc( &navRR.selection, 1, typeFSS, NULL, &aed );
77d894 ¤   ¤   if( osErr == noErr )
bc5b34 ¤   ¤   {
1efaf8 ¤   ¤   ¤   BlockMoveData( *aed.dataHandle, choice, sizeof( FSSpec ) );
f73c65 ¤   ¤   ¤   AEDisposeDesc( &aed );
cf0fe4 ¤   ¤   }
ba5d7c ¤   ¤   NavDisposeReply( &navRR );
dc9371 ¤   }
0bb38c done:
6334cc ¤   if( IsntNull( navTypeHand ) )
66c7a1 ¤   {
16fe31 ¤   ¤   HUnlock( (Handle) navTypeHand );
e5618a ¤   ¤   DisposeHandle( (Handle) navTypeHand );
fe9371 ¤   }
0d2e17 ¤   DisposeRoutineDescriptor( navEP );
--b0c8 00048a39cd24012015d Page 3 of pgpNavServices.cp
5588c1 ¤   DisposeRoutineDescriptor( navOF );
5967c5 ¤
14a1af ¤   DebugPatches_EnableWhackFreeSpace();
65af5a
0d872b ¤   return osErr;
cdefe6 }
fdaf5a
ebbf51 typedef struct PGPNavCallbackData
00bb36 {
581eea ¤   NavMenuItemSpecHandle¤  addItem;
6ca87e ¤   PGPBoolean¤ ¤   ¤   ¤   itemSelected;
c461fd ¤   NavEventProcPtr¤¤   ¤   updateFunc;
1a8f8d } PGPNavCallbackData;
06af5a
d16685 ¤   pascal void
7216f6 PGPNavEventProc(
b6b925 ¤   NavEventCallbackMessage¤callbackSelector,
3f3f9d ¤   NavCBRecPtr¤¤   ¤   ¤   callbackParms,
4b2efa ¤   NavCallBackUserData¤¤   callbackUD )
fdbb36 {
c7beb9 ¤   PGPNavCallbackData¤ ¤   *necd = (PGPNavCallbackData *) callbackUD;
5867c5 ¤
45978d ¤   switch( callbackSelector )
a5c7a1 ¤   {
79528f ¤   ¤   case kNavCBPopupMenuSelect:
fb5b34 ¤   ¤   {
365270 ¤   ¤   ¤   NavMenuItemSpec *¤  nms;
6887c7 ¤   ¤   ¤
721640 ¤   ¤   ¤   if( IsntNull( necd->addItem ) )
aff776 ¤   ¤   ¤   {
725c2e ¤   ¤   ¤   ¤   nms = (NavMenuItemSpec *) callbackParms->eventData.param;
efe65e ¤   ¤   ¤   ¤   if( ( nms->menuCreator == (*necd->addItem)->menuCreator ) &&
2a4962 ¤   ¤   ¤   ¤   ¤   ( nms->menuType == (*necd->addItem)->menuType ) )
7a72c3 ¤   ¤   ¤   ¤   {
0be7cf ¤   ¤   ¤   ¤   ¤   necd->itemSelected = TRUE;
d82613 ¤   ¤   ¤   ¤   }
77fa07 ¤   ¤   ¤   ¤   else
ba0f5f ¤   ¤   ¤   ¤   ¤   necd->itemSelected = FALSE;
e8a3a6 ¤   ¤   ¤   }
52cdcb ¤   ¤   ¤   break;
f60fe4 ¤   ¤   }
4b9371 ¤   }
554703 ¤   (necd->updateFunc)( callbackSelector, callbackParms, callbackUD );
01efe6 }
9eaf5a
43eacd ¤   OSErr
ed368e PGPNavPutFile(
29156a ¤   Str255¤ ¤   ¤   ¤   ¤   message,
ac0ed1 ¤   Str255¤ ¤   ¤   ¤   ¤   defaultName,
62aac5 ¤   OSType¤ ¤   ¤   ¤   ¤   fileType,
1f4d2c ¤   OSType¤ ¤   ¤   ¤   ¤   fileCreator,
4c8485 ¤   PGPNavReply *¤  ¤   ¤   navReply,
8ec673 ¤   NavMenuItemSpecHandle¤  addItem,
5c5f7a ¤   PGPBoolean *¤   ¤   ¤   itemSelected,
ecb964 ¤   NavEventProcPtr¤¤   ¤   updateFunc,
e1c7ed ¤   FSSpec *¤   ¤   ¤   ¤   choice )
2dbb36 {
551de4 ¤   OSErr¤  ¤   ¤   ¤   ¤   osErr;
fdac2f ¤   NavReplyRecord¤ ¤   ¤   navRR;
842254 ¤   NavReplyRecord *¤   ¤   navRRP;
7112dc ¤   NavDialogOptions¤   ¤   navDO;
465f0e ¤   NavEventUPP¤¤   ¤   ¤   navEP = NewNavEventProc( PGPNavEventProc );
e2fe68 ¤   PGPNavCallbackData¤ ¤   navCD;
5c0296 ¤   WindowRecord¤   ¤   ¤   *frontWindow;
c40e80 ¤   short¤  ¤   ¤   ¤   ¤   saveWindowKind;
7367c5 ¤
f8e38c ¤   DebugPatches_DisableWhackFreeSpace();
a5af5a
35d8af ¤   /*
4ee654 ¤   ** Stupid Appearance Manager has bugs where controls in underlying
186385 ¤   ** dialogs will get automatically disabled. Temporarily set the
48f856 ¤   ** front window's windowKind to be something other that dialogKind
--7cdb 00035506c794012015d Page 4 of pgpNavServices.cp
2553d3 ¤   ** to work around this.
a99faa ¤   */
a967c5 ¤
059755 ¤   frontWindow = (WindowRecord *) FrontWindow();
9d67c5 ¤
274c48 ¤   saveWindowKind = frontWindow->windowKind;
2e8ed3 ¤   frontWindow->windowKind = kApplicationWindowKind;
3067c5 ¤
5c6ea7 ¤   osErr = NavGetDefaultDialogOptions( &navDO ); if( osErr ) goto done;
a1ae16 ¤   if( IsntNull( navReply ) )
09c7a1 ¤   {
073aec ¤   ¤   navRRP = &navReply->rr;
f3178b ¤   ¤   navDO.dialogOptionFlags = 0;
949371 ¤   }
e30e24 ¤   else
99c7a1 ¤   {
db3881 ¤   ¤   navRRP = &navRR;
843337 ¤   ¤   navDO.dialogOptionFlags =¤  kNavDontAutoTranslate |
6a327b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNavDontAddTranslateItems;
a29371 ¤   }
e50598 ¤   if( IsntNull( addItem ) )
716cd2 ¤   ¤   navDO.popupExtension = (Handle) addItem;
c7053b ¤   CopyPString( message, navDO.message );
c973c6 ¤   CopyPString( LMGetCurApName(), navDO.clientName );
c6b1b9 ¤   CopyPString( defaultName, navDO.savedFileName );
9267c5 ¤
ddba04 ¤   navCD.addItem = addItem;
3b4a0c ¤   navCD.itemSelected = FALSE;
7f5359 ¤   navCD.updateFunc = updateFunc;
bb67c5 ¤
5b841a ¤   osErr = NavPutFile( NULL, navRRP, &navDO, navEP,
17b692 ¤   ¤   ¤   ¤   ¤   ¤   fileType, fileCreator, (NavCallBackUserData) &navCD );
63ac6c ¤   if( IsntNull( itemSelected ) )
b6a580 ¤   ¤   *itemSelected = navCD.itemSelected;
beaf5a
0670f3 ¤   frontWindow->windowKind = saveWindowKind;
08af5a
a6b1cb ¤   if( navRRP->validRecord && ( osErr == noErr ) )
f8c7a1 ¤   {
1efd30 ¤   ¤   AEDesc¤ ¤   ¤   ¤   aed;
ec1b52 ¤   ¤
d5b93d ¤   ¤   osErr = AEGetNthDesc( &navRRP->selection, 1, typeFSS, NULL, &aed );
3ad894 ¤   ¤   if( osErr == noErr )
c95b34 ¤   ¤   {
1bfaf8 ¤   ¤   ¤   BlockMoveData( *aed.dataHandle, choice, sizeof( FSSpec ) );
e44644 ¤   ¤   ¤   if( navRRP->replacing )
4dbf9b ¤   ¤   ¤   ¤   osErr = FSpDelete( choice );
183c65 ¤   ¤   ¤   AEDisposeDesc( &aed );
a70fe4 ¤   ¤   }
3f1b52 ¤   ¤
0f4a63 ¤   ¤   if( IsNull( navReply ) )
786ffe ¤   ¤   ¤   NavDisposeReply( navRRP );
1c9371 ¤   }
a067c5 ¤
bbb38c done:
a02e17 ¤   DisposeRoutineDescriptor( navEP );
34af5a
a8a1af ¤   DebugPatches_EnableWhackFreeSpace();
7eaf5a
b7872b ¤   return osErr;
b0efe6 }
c5af5a
5aeacd ¤   OSErr
3b1397 PGPNavFinishSave(
8c756e ¤   PGPNavReply¤*¤  ¤   ¤   navReply )
cfbb36 {
fce38c ¤   DebugPatches_DisableWhackFreeSpace();
4eaf5a
e49731 ¤   OSErr osErr = NavCompleteSave( &navReply->rr, kNavTranslateInPlace );
f900f0 ¤   NavDisposeReply( &navReply->rr );
61af5a
35a1af ¤   DebugPatches_EnableWhackFreeSpace();
--cdcf 0018779ca6b4012015d Page 5 of pgpNavServices.cp
e0af5a
31872b ¤   return osErr;
71efe6 }
87af5a
--64eb 0010d4a01ea4012015e Page 1 of pgpNavServices.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
0d46ab ¤   $Id: pgpNavServices.h,v 1.3.8.1 1998/11/12 03:09:58 heller Exp $
8ff7f7 ____________________________________________________________________________*/
52af5a
c68d55 #pragma once·
3daf5a
5faf5a
bf2073 #include <Navigation.h>
9aaf5a
95a702 typedef struct PGPNavReply
30bb36 {
44665c ¤   NavReplyRecord¤ rr;
7b85f0 } PGPNavReply;
31af5a
6aeacd ¤   OSErr
577bbe PGPNavGetFileOrFolder(
a6f553 ¤   Boolean¤¤   ¤   ¤   ¤   chooseFolder,
57156a ¤   Str255¤ ¤   ¤   ¤   ¤   message,
19d887 ¤   OSType¤ ¤   ¤   ¤   ¤   defaultCreator,
b6b6e6 ¤   PGPUInt16¤  ¤   ¤   ¤   numTypes,
40b3ae ¤   OSType *¤   ¤   ¤   ¤   allowTypes,
c6b964 ¤   NavEventProcPtr¤¤   ¤   updateFunc,
4e3c0c ¤   FSSpec *¤   ¤   ¤   ¤   choice );
1eaf5a
4aeacd ¤   OSErr
43368e PGPNavPutFile(
45156a ¤   Str255¤ ¤   ¤   ¤   ¤   message,
970ed1 ¤   Str255¤ ¤   ¤   ¤   ¤   defaultName,
33aac5 ¤   OSType¤ ¤   ¤   ¤   ¤   fileType,
8f4d2c ¤   OSType¤ ¤   ¤   ¤   ¤   fileCreator,
48d172 ¤   PGPNavReply *¤  ¤   ¤   navReply,¤  // pass NULL to disable translation
bb9bcc ¤   NavMenuItemSpecHandle¤  addItem,¤   // pass NULL for no extra items
415f7a ¤   PGPBoolean *¤   ¤   ¤   itemSelected,
d7b964 ¤   NavEventProcPtr¤¤   ¤   updateFunc,
d23c0c ¤   FSSpec *¤   ¤   ¤   ¤   choice );
0aaf5a
24eacd ¤   OSErr
b71397 PGPNavFinishSave(
278a2d ¤   PGPNavReply¤*¤  ¤   ¤   navReply );
0daf5a
--0808 000930e4a874012015f Page 1 of CModalDialogGrafPortView.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
c8a2cc ¤   $Id: CModalDialogGrafPortView.cp,v 1.5.8.1 1998/11/12 03:10:00 heller Exp $
8cf7f7 ____________________________________________________________________________*/
b8af5a
317e6d #include <UDrawingState.h>
02a85e #include <LArrayIterator.h>
140a93 #include <LPeriodical.h>
b9af5a
d10e06 #include "UPGPException.h"
bced36 #include "CModalDialogGrafPortView.h"
89af5a
68af5a
21af5a
3e0335 /*____________________________________________________________________________
91af5a
7c64a5 ¤   Notes:¤ ¤   ¤   ¤   The pointer to the object is stored in the dialog's
ba493a ¤   ¤   ¤   ¤   ¤   ¤   refcon.
b9af5a
31ebc1 ¤   ¤   ¤   ¤   ¤   ¤   The visibility of the DLOG and the GrafPortView must
aac7e3 ¤   ¤   ¤   ¤   ¤   ¤   match in order for this to work correctly correctly.
c6f7f7 ____________________________________________________________________________*/
9a69bb CModalDialogGrafPortView *
a3d433 CModalDialogGrafPortView::CreateCModalDialogGrafPortView(
923de7 ¤   ResIDT¤ ¤   ¤   inGrafPortView,
b97a99 ¤   LCommander *¤   inSuperCommander)
b9bb36 {
3b51ee ¤   StColorPortState¤   ¤   ¤   theSavePort(UQDGlobals::GetCurrentPort());
20428c ¤   GrafPtr¤¤   ¤   ¤   ¤   ¤   savedPort;
6f6778 ¤   DialogPtr¤  ¤   ¤   ¤   ¤   theDialog;
e21cde ¤   CModalDialogGrafPortView *¤ theModalDialogGrafPortView;
6667c5 ¤
872959 ¤   ::GetPort(&savedPort);
0267c5 ¤
d598b1 ¤   // Create the dialog and make it the current port
5a1dfc ¤   theDialog = ::GetNewDialog(¤inGrafPortView,
d98e22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
2dfa34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (WindowRef) -1);
9cb608 ¤   PGPThrowIfNil_(theDialog);
4867c5 ¤
33d944 ¤   ::SetPort(theDialog);
ca67c5 ¤
2f1426 ¤   // Create the grafport view
ec5665 ¤   theModalDialogGrafPortView = (CModalDialogGrafPortView *)
82b19b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CreateGrafPortView(¤inGrafPortView,
082377 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inSuperCommander);
00f26f ¤   PGPThrowIfNil_(theModalDialogGrafPortView);
2467c5 ¤
3188d6 ¤   theModalDialogGrafPortView->mSavedPort = savedPort;
4b67c5 ¤
6e4131 ¤   // Adjust current colors
21a6d3 ¤   ::GetForeColor(&theModalDialogGrafPortView->mForeColor);
eb9e11 ¤   ::GetBackColor(&theModalDialogGrafPortView->mBackColor);
ba67c5 ¤
748228 ¤   // Store the object in the refcon for further use
074277 ¤   ::SetWRefCon(theDialog, (SInt32) theModalDialogGrafPortView);
3467c5 ¤
475726 ¤   return theModalDialogGrafPortView;
3aefe6 }
d467c5 ¤
71af5a
1caf5a
98983b CModalDialogGrafPortView::CModalDialogGrafPortView(
7bcbb0 ¤   LStream *¤  inStream)
85dbbc ¤   ¤   : LGrafPortView(inStream), mUpdateWindows(sizeof(WindowRef))
f3bb36 {
d82e10 ¤   mFilterProc = nil;
93efe6 }
--30ca 000bc6a387f4012015f Page 2 of CModalDialogGrafPortView.cp
e0af5a
1aaf5a
17af5a
91b47f CModalDialogGrafPortView::~CModalDialogGrafPortView()
f3bb36 {
29e637 ¤   GrafPtr¤¤   finalPort¤  =¤  UQDGlobals::GetCurrentPort();
8967c5 ¤
7de8b9 ¤   OutOfFocus(nil);
0baf5a
250b33 ¤   // Dispose of the dialog
54e6cf ¤   if (GetMacPort() != nil) {
4396a2 ¤   ¤   if (finalPort == GetMacPort()) {
2f9abb ¤   ¤   ¤   finalPort = mSavedPort;
b80fe4 ¤   ¤   }
0acd93 ¤   ¤   DeleteAllSubPanes();
ffc1d4 ¤   ¤   ::DisposeDialog(GetMacPort());
b59371 ¤   }
9c67c5 ¤
a9c893 ¤   // Invalidate the windows that we captured Update events for
353432 ¤   LArrayIterator¤ ¤   iterator(mUpdateWindows);
3a50b8 ¤   WindowRef¤  ¤   ¤   theWindow;
05af5a
3a69f2 ¤   while (iterator.Next(&theWindow)) {
24828e ¤   ¤   ::SetPort(theWindow);
634129 ¤   ¤   ::InvalRect(&theWindow->portRect);
489371 ¤   }
fcff0c ¤   ::SetPort(finalPort);
c2efe6 }
b1af5a
01af5a
dcaf5a
7e6d52 ¤   void
dde33e CModalDialogGrafPortView::DrawSelf()
c0bb36 {
44c94e ¤   ApplyForeAndBackColors();
9467c5 ¤
fac06d ¤   LGrafPortView::DrawSelf();
f8efe6 }
58af5a
b4af5a
76af5a
e06d52 ¤   void
f86a5b CModalDialogGrafPortView::Run(
83585e ¤   ModalFilterProcPtr¤ inFilterProc)
eebb36 {
c3fcf6 ¤   mFilterProc = inFilterProc;
7267c5 ¤
1db737 ¤   SInt16¤ ¤   ¤   itemHit;
9a7ae5 ¤   ModalFilterUPP¤ filterUPP = NewModalFilterProc(ModalDialogFilterProc);
5867c5 ¤
24d8c1 ¤   PGPThrowIfNil_(filterUPP);
5cc4c0 ¤   mError.err = CComboError::kNoErr;
7f5952 ¤   mError.pgpErr = kPGPError_NoErr;
0a43ab ¤   do {
216088 ¤   ¤   ::ModalDialog(filterUPP, &itemHit);
37f378 ¤   } while (itemHit == 0);
af67c5 ¤
f4dcc8 ¤   ::DisposeRoutineDescriptor(filterUPP);
90ef21 ¤   if (mError.IsError()) {
d35219 ¤   ¤   PGPThrowComboErr_(mError);
2c9371 ¤   }
4aefe6 }
9aaf5a
56af5a
e6af5a
a899cb ¤   pascal Boolean
3f7e43 CModalDialogGrafPortView::ModalDialogFilterProc(
66d846 ¤   DialogPtr¤  ¤   theDialog,·
9231c6 ¤   EventRecord *¤  theEvent,
ecb2fb ¤   SInt16 *¤   ¤   itemHit)
b0bb36 {
bc8b12 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   result = true;
--818f 000e28f843c4012015f Page 3 of CModalDialogGrafPortView.cp
4e4954 ¤   CModalDialogGrafPortView *¤ theGrafPortView =
a3764b ¤   ¤   ¤   (CModalDialogGrafPortView *) ::GetWRefCon(theDialog);
abaf5a
de5168 ¤   try {
153aef ¤   ¤   StColorPortState¤   theSavePort(UQDGlobals::GetCurrentPort());
15af5a
b45968 ¤   ¤   OutOfFocus(nil);
4ead5f ¤   ¤   *itemHit = 1;
cfc7d3 ¤   ¤   if ((theGrafPortView->mFilterProc == nil)
71b499 ¤   ¤   || (theGrafPortView->mFilterProc(theDialog, theEvent, itemHit))) {
82767c ¤   ¤   ¤   // Get the grafportview
f487c7 ¤   ¤   ¤
18deb5 ¤   ¤   ¤   theGrafPortView->mExitDialog = false;
3d87c7 ¤   ¤   ¤
c14e08 ¤   ¤   ¤   // Give time to repeaters
b625c8 ¤   ¤   ¤   LPeriodical::DevoteTimeToRepeaters(*theEvent);
54fdce ¤   ¤   ¤   switch (theEvent->what) {
cd159c ¤   ¤   ¤   ¤   case mouseDown:
1672c3 ¤   ¤   ¤   ¤   {
bdc265 ¤   ¤   ¤   ¤   ¤   WindowPtr¤  theWindow;
b2bb60 ¤   ¤   ¤   ¤   ¤   SInt16¤ ¤   thePart = ::FindWindow(¤theEvent->where,
1c4401 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theWindow);
5eae30 ¤   ¤   ¤   ¤   ¤
a246b8 ¤   ¤   ¤   ¤   ¤   switch (thePart) {
5ad438 ¤   ¤   ¤   ¤   ¤   ¤   case inContent:
448fec ¤   ¤   ¤   ¤   ¤   ¤   {
2d2938 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (theWindow == theGrafPortView->GetMacPort()) {
8ea7ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::SetPort(theGrafPortView->GetMacPort());
bff685 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theGrafPortView->ClickInContent(*theEvent);
e95268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
badb3c ¤   ¤   ¤   ¤   ¤   ¤   }
ce00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
391c89 ¤   ¤   ¤   ¤   ¤   }
e42613 ¤   ¤   ¤   ¤   }
d0f622 ¤   ¤   ¤   ¤   break;
3494aa ¤   ¤   ¤   ¤   ¤   ¤
0994aa ¤   ¤   ¤   ¤   ¤   ¤
e52fea ¤   ¤   ¤   ¤   case autoKey:
f6a86e ¤   ¤   ¤   ¤   case keyDown:
c972c3 ¤   ¤   ¤   ¤   {
e0ea58 ¤   ¤   ¤   ¤   ¤   LCommander *¤   theTarget = LCommander::GetTarget();
30ae30 ¤   ¤   ¤   ¤   ¤
0bdd6d ¤   ¤   ¤   ¤   ¤   if (theTarget != nil) {
758e34 ¤   ¤   ¤   ¤   ¤   ¤   theTarget->ProcessKeyPress(*theEvent);
2d1c89 ¤   ¤   ¤   ¤   ¤   }
a82613 ¤   ¤   ¤   ¤   }
e0f622 ¤   ¤   ¤   ¤   break;
332b85 ¤   ¤   ¤   ¤
642b85 ¤   ¤   ¤   ¤
c428b9 ¤   ¤   ¤   ¤   case updateEvt:
a772c3 ¤   ¤   ¤   ¤   {
6c5d55 ¤   ¤   ¤   ¤   ¤   ::BeginUpdate(((WindowPtr) theEvent->message));
ca2e3d ¤   ¤   ¤   ¤   ¤   if (((WindowPtr) theEvent->message)
5b0a90 ¤   ¤   ¤   ¤   ¤   == theGrafPortView->GetMacPort()) {
fff564 ¤   ¤   ¤   ¤   ¤   ¤   theGrafPortView->Draw(nil);
f79638 ¤   ¤   ¤   ¤   ¤   } else if (theGrafPortView->mUpdateWindows.FetchIndexOf(
584219 ¤   ¤   ¤   ¤   ¤   &theEvent->message) == LArray::index_Bad) {
0f0748 ¤   ¤   ¤   ¤   ¤   ¤   theGrafPortView->
e716fe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mUpdateWindows.InsertItemsAt(1,
e7e0b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LArray::index_Last,
4a2176 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theEvent->message);
ba1c89 ¤   ¤   ¤   ¤   ¤   }
023216 ¤   ¤   ¤   ¤   ¤   ::EndUpdate(((WindowPtr) theEvent->message));
c52613 ¤   ¤   ¤   ¤   }
92f622 ¤   ¤   ¤   ¤   break;
072b85 ¤   ¤   ¤   ¤
262b85 ¤   ¤   ¤   ¤
7a2629 ¤   ¤   ¤   ¤   case activateEvt:
4672c3 ¤   ¤   ¤   ¤   {
4f2e3d ¤   ¤   ¤   ¤   ¤   if (((WindowPtr) theEvent->message)
460a90 ¤   ¤   ¤   ¤   ¤   == theGrafPortView->GetMacPort()) {
e2e681 ¤   ¤   ¤   ¤   ¤   ¤   if (theEvent->modifiers & activeFlag) {
--579d 0017d5976744012015f Page 4 of CModalDialogGrafPortView.cp
389976 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theGrafPortView->Activate();
0c3af7 ¤   ¤   ¤   ¤   ¤   ¤   } else {
2bcceb ¤   ¤   ¤   ¤   ¤   ¤   ¤   theGrafPortView->Deactivate();
47db3c ¤   ¤   ¤   ¤   ¤   ¤   }
ae1c89 ¤   ¤   ¤   ¤   ¤   }
9d2613 ¤   ¤   ¤   ¤   }
31f622 ¤   ¤   ¤   ¤   break;
242b85 ¤   ¤   ¤   ¤
3c2b85 ¤   ¤   ¤   ¤
7703f3 ¤   ¤   ¤   ¤   case nullEvent:
9272c3 ¤   ¤   ¤   ¤   {
b00d6f ¤   ¤   ¤   ¤   ¤   LPeriodical::DevoteTimeToIdlers(*theEvent);
342613 ¤   ¤   ¤   ¤   }
d6f622 ¤   ¤   ¤   ¤   break;
b2ae30 ¤   ¤   ¤   ¤   ¤
aca3a6 ¤   ¤   ¤   }
b987c7 ¤   ¤   ¤
b9971a ¤   ¤   ¤   // Check to see if we need to exit modal dialog
97ff4f ¤   ¤   ¤   if (! theGrafPortView->mExitDialog) {
d1b962 ¤   ¤   ¤   ¤   *itemHit = 0;
75a3a6 ¤   ¤   ¤   }
c30fe4 ¤   ¤   }
e69371 ¤   }
d667c5 ¤
21ca6f ¤   catch (CComboError & comboError) {
0e7133 ¤   ¤   theGrafPortView->mError = comboError;
229371 ¤   }
4167c5 ¤
21e0a3 ¤   catch (...) {
6ef2cd ¤   ¤   theGrafPortView->mError.pgpErr = kPGPError_UnknownError;
e29371 ¤   }
4867c5 ¤
435d73 ¤   return result;
92efe6 }
37af5a
62af5a
85af5a
9e6d52 ¤   void
d192e0 CModalDialogGrafPortView::Show()
7dbb36 {
889660 ¤   ::ShowWindow(mGrafPtr);
952d74 ¤   if (mVisible == triState_Off) {
fa3aef ¤   ¤   StColorPortState¤   theSavePort(UQDGlobals::GetCurrentPort());
3367c5 ¤
3a5968 ¤   ¤   OutOfFocus(nil);
7b98ae ¤   ¤   mVisible = triState_On;
484861 ¤   ¤   ShowSelf();
50a6c9 ¤   ¤   LView::Show();
369371 ¤   }
7defe6 }
--edec 0012577c43040120160 Page 1 of CModalDialogGrafPortView.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
621de9 ¤   $Id: CModalDialogGrafPortView.h,v 1.4.20.1 1998/11/12 03:10:01 heller Exp $
39f7f7 ____________________________________________________________________________*/
d1af5a
bd8d55 #pragma once·
97af5a
7b2774 #include "LGrafPortView.h"
40fa41 #include "LListener.h"
3476f0 #include "CComboError.h"
cfaf5a
09af5a
e779ee class CModalDialogGrafPortView : public LGrafPortView,
f8dfc0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·public LListener {
cc5ed4 public:
07cd43 ¤   static CModalDialogGrafPortView *¤  CreateCModalDialogGrafPortView(
68ae79 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ResIDT inGrafPortView,
4f3e12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LCommander * inSuperCommander);
6d3ede ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
99ea57 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CModalDialogGrafPortView(
e19ba5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LStream * inStream);
8bcdb0 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ¤   ~CModalDialogGrafPortView();
0a67c5 ¤
2f396d ¤   virtual void¤   ¤   ¤   ¤   ¤   ¤   Run(ModalFilterProcPtr inFilterProc
109ec9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   = nil);
3067c5 ¤
cbde3a ¤   virtual void¤   ¤   ¤   ¤   ¤   ¤   ListenToMessage(MessageT inMessage,
444168 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void * ioParam)
2b378b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { (void) inMessage;
b77fd2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (void) ioParam; }
eeaf5a
634d16 ¤   virtual void¤   ¤   ¤   ¤   ¤   ¤   Show();
ab67c5 ¤
6f764a ¤   static pascal Boolean ¤ ¤   ¤   ¤   ModalDialogFilterProc(
95ad60 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DialogPtr theDialog,·
f30908 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord * theEvent,
bbd46a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt16 * itemHit);¤
7667c5 ¤
c8a2d3 protected:
034c5b ¤   ModalFilterProcPtr¤ ¤   ¤   ¤   ¤   mFilterProc;
386cbb ¤   Boolean¤¤   ¤   ¤   ¤   ¤   ¤   ¤   mExitDialog;
b2aab6 ¤   CComboError¤¤   ¤   ¤   ¤   ¤   ¤   mError;
2e0cae ¤   GrafPtr¤¤   ¤   ¤   ¤   ¤   ¤   ¤   mSavedPort;
5a8aa8 ¤   LArray¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   mUpdateWindows;
b967c5 ¤
06da00 ¤   virtual void¤   ¤   ¤   ¤   ¤   ¤   DrawSelf();
2582f7 };
--33fc 000b686e65940120161 Page 1 of CPGPEncoderDecoder.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
7f7306 ¤   $Id: CPGPEncoderDecoder.cp,v 1.59.2.2.2.1 1998/11/12 03:10:02 heller Exp $
5df7f7 ____________________________________________________________________________*/
37af5a
00324c #include <string.h>
22af5a
5d1970 #include "PGPKeys.h"
e8ea7e #include "PGPUtilities.h"
e9bbf4 #include "MacFiles.h"
b6c110 #include "pgpMacMemory.h"
d185c2 #include "MacStrings.h"
fa76b7 #include "MacErrors.h"
d6f8d2 #include "PGPSharedEncryptDecrypt.h"
4bc8f2 #include "PGPUserInterface.h"
7b3a2c #include "WarningAlert.h"
054720 #include "pflPrefTypes.h"
6b10f0 #include "pgpOpenPrefs.h"
85c97b #include "pgpClientPrefs.h"
413991 #include "pgpAdminPrefs.h"
c66aa0 #include "pgpWordWrap.h"
f8fbe2 #include "pgpMemoryIO.h"
898e25 #include "pgpVersionHeader.h"
f8d73a #include "CSecureMemory.h"
65628e #include "pgpClientErrors.h"
8aaf5a
1c043a #include "CTempFile.h"
13af5a
e445d2 #include "CPGPEncoderDecoder.h"
f8af5a
70af5a
cf3520 struct SDecodeData {
1d57f3 ¤   Boolean¤¤   ¤   ¤   useCache;
f871fb ¤   Boolean¤¤   ¤   ¤   FYEO;
22c7a8 ¤   AnimatedCursorRef¤  cursor;
3aacf0 ¤   Handle¤ ¤   ¤   ¤   handle;
d2325d ¤   PGPKeySetRef¤   ¤   defaultKeys;
7582f7 };
f7af5a
24af5a
4786d4 // Statics
6fbd2e Boolean¤¤   ¤   ¤   ¤   CPGPEncoderDecoder::sCheckForMissingKeys = true;
0afdd6 CSignPassphraseCache *¤ CPGPEncoderDecoder::sSigningPassphraseCache = nil;
265bbf CSignPassphraseCache *¤ CPGPEncoderDecoder::sDecryptPassphraseCache = nil;
38fe9d PGPtlsContextRef¤   ¤   CPGPEncoderDecoder::sTLSContext
acbbd3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   = kInvalidPGPtlsContextRef;
ceaf5a
06af5a
27af5a
93e738 // Constants
a65973 const ResIDT¤   STRx_PGPEncoderDecoder¤ ¤   ¤   ¤   =¤  12121;
e66e11 const SInt16¤   kNoPublicKeysID¤¤   ¤   ¤   ¤   ¤   =¤  1;
94f5b2 const SInt16¤   kNoPrivateKeysID¤   ¤   ¤   ¤   ¤   =¤  2;
3a88f2 const SInt16¤   kAddKeysID¤ ¤   ¤   ¤   ¤   ¤   ¤   =¤  3;
04af5a
9f7d70 const ResIDT¤   STRx_PGPEncoderDecoderErrorStrings¤ =¤  12122;
7426a3 const SInt16¤   kErrorStringID¤ ¤   ¤   ¤   ¤   ¤   =¤  1;
e1d6b4 const SInt16¤   kErrorStringAdminPrefsNotFoundID¤   =¤  2;
a6af5a
1c6d52 ¤   void
011988 CPGPEncoderDecoder::Init(
2042ed ¤   PGPContextRef¤  inContext)
b9bb36 {
9af5d1 ¤   PGPError¤   pgpError;
fd67c5 ¤
e7e5c1 ¤   sSigningPassphraseCache = new CSignPassphraseCache(inContext);
07e190 ¤   sDecryptPassphraseCache = new CSignPassphraseCache(inContext);
b650be ¤   pgpError = PGPNewTLSContext(inContext, &sTLSContext);
--216b 000ae00647340120161 Page 2 of CPGPEncoderDecoder.cp
ab7e7d ¤   PGPThrowIfPGPErr_(pgpError);
2967c5 ¤
2ebe29 #if PGP_BUSINESS_SECURITY
6f67b2 ¤   pgpError = PGPCheckAutoUpdateKeysFromServer(
cc2763 ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr(inContext),
9e3ae4 ¤   ¤   ¤   ¤   ¤   ¤   true,
0c081c ¤   ¤   ¤   ¤   ¤   ¤   nil,
5ae378 ¤   ¤   ¤   ¤   ¤   ¤   nil);
5d7e7d ¤   PGPThrowIfPGPErr_(pgpError);
6b7454 #endif
e7efe6 }
46af5a
7daf5a
ceaf5a
eb6d52 ¤   void
42a441 CPGPEncoderDecoder::Cleanup()
a3bb36 {
91f252 ¤   delete sSigningPassphraseCache;
78d56e ¤   delete sDecryptPassphraseCache;
838e8f ¤   if (PGPtlsContextRefIsValid(sTLSContext)) {
de8a29 ¤   ¤   PGPFreeTLSContext(sTLSContext);
b29371 ¤   }
29efe6 }
3caf5a
7caf5a
ccaf5a
b97e69 ¤   Boolean
1a0be7 CPGPEncoderDecoder::EncodeHandle(
07c090 ¤   PGPContextRef¤  ¤   ¤   ¤   inContext,
f4d1eb ¤   Handle¤ ¤   ¤   ¤   ¤   ¤   ioDataH,
535ade ¤   EEncodeOptions¤ ¤   ¤   ¤   inOptions,
98d132 ¤   UInt32¤ ¤   ¤   ¤   ¤   ¤   inNumRecipients,
0332a2 ¤   const PGPRecipientSpec *¤   inRecipientList,
a8885e ¤   Boolean¤¤   ¤   ¤   ¤   ¤   inUseCache)
d7bb36 {
8e0c37 ¤   Boolean¤¤   ¤   ¤   result = false;
86e61c ¤   OSErr¤  ¤   ¤   ¤   err;
cbbb9c ¤   PGPError¤   ¤   ¤   pgpErr;
8b6b7d ¤   AnimatedCursorRef¤  cursorRef = nil;
241756 ¤   PGPKeySetRef¤   ¤   defaultKeySet = kInvalidPGPKeySetRef;
910d23 ¤   PGPKeySetRef¤   ¤   recipientSet = kInvalidPGPKeySetRef;
12b4fb ¤   PGPKeySetRef¤   ¤   newKeys = kInvalidPGPKeySetRef;
20e04f ¤   PGPKeySetRef¤   ¤   selectedSet = kInvalidPGPKeySetRef;
a08a5f ¤   PGPKeyRef¤  ¤   ¤   signingKey = kInvalidPGPKeyRef;
5aece0 ¤   PGPOptionListRef¤   optionList = kInvalidPGPOptionListRef;
ef1abc ¤   PGPPrefRef¤ ¤   ¤   prefRef = kInvalidPGPPrefRef;
9ba25d ¤   PGPIORef¤   ¤   ¤   wrapInput = kInvalidPGPIORef;
97af9c ¤   PGPIORef¤   ¤   ¤   wrapOutput = kInvalidPGPIORef;
9767c5 ¤
725168 ¤   try {
b875ff ¤   ¤   if (::GetHandleSize(ioDataH) > 0) {
6e0664 ¤   ¤   ¤   CSecureCString256¤  convEncryptPassphrase;
fcab6a ¤   ¤   ¤   CSecureMemory¤  ¤   signingBuffer(
16b9f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr(inContext),
737d92 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   256);
b304ec ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   signingPasskeySize;
fa0490 ¤   ¤   ¤   UInt32¤ ¤   ¤   ¤   numPublicKeys = 1;
9f0741 ¤   ¤   ¤   UInt32¤ ¤   ¤   ¤   numPrivateKeys = 1;
65b24a ¤   ¤   ¤   Boolean¤¤   ¤   ¤   usePassphrase = true;
e339b4 ¤   ¤   ¤   Boolean¤¤   ¤   ¤   fyeo = false;
8f67c5 ¤
604454 ¤   ¤   ¤   // Check for missing keys
29d38a ¤   ¤   ¤   if (sCheckForMissingKeys) {
29a448 ¤   ¤   ¤   ¤   err = CountKeysInDefaultKeyring(¤   inContext,
151173 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &numPublicKeys,
267d24 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &numPrivateKeys);
df87f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
1d2b85 ¤   ¤   ¤   ¤
da53c7 ¤   ¤   ¤   ¤   if ((numPublicKeys != 0) && (numPrivateKeys != 0)) {
daaaf8 ¤   ¤   ¤   ¤   ¤   sCheckForMissingKeys = false;
392613 ¤   ¤   ¤   ¤   }
aea3a6 ¤   ¤   ¤   }
--9d4c 000ee99948b40120161 Page 3 of CPGPEncoderDecoder.cp
e587c7 ¤   ¤   ¤
70d477 ¤   ¤   ¤   // Open default keyset
fed779 ¤   ¤   ¤   pgpErr = PGPOpenDefaultKeyRings(¤   inContext,
cd4446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
88bb1a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &defaultKeySet);
fc8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
d9af5a
b36532 ¤   ¤   ¤   // If encrypting, get the recipients
989a1e ¤   ¤   ¤   if ((inOptions & encodeOptions_Encrypt)
212407 ¤   ¤   ¤   && (! (inOptions & encodeOptions_ConvEncrypt))) {
dc113f ¤   ¤   ¤   ¤   PGPRecipientOptions¤¤   options = kPGPRecipientOptionsHideFileO¶
8a7f8b ptions
c4c3ab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   | kPGPRecipientOptionsShowFYEO;
caacd1 ¤   ¤   ¤   ¤   PGPRecipientSettings¤   settings =
686402 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPRecipientSettingsDefault;
e52b85 ¤   ¤   ¤   ¤
fd216a ¤   ¤   ¤   ¤   if (numPublicKeys == 0) {
f8b22e ¤   ¤   ¤   ¤   ¤   WarningAlert(¤  kWACautionAlertType,
670c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
f933b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_PGPEncoderDecoder,
b80c66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoPublicKeysID);
2d2613 ¤   ¤   ¤   ¤   }
a2af5a
7d766a ¤   ¤   ¤   ¤   if (! inUseCache) {
b0a071 ¤   ¤   ¤   ¤   ¤   options |= kPGPRecipientOptionsAlwaysShowDialog;
d42613 ¤   ¤   ¤   ¤   }
b9283c ¤   ¤   ¤   ¤   pgpErr = PGPClientRecipientDialog(¤ inContext,
e420a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sTLSContext,
82165a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeySet,
6afffa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inNumRecipients,
41c13f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inRecipientList,
90d9ab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   options,
b0bec7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   settings,
5ffb83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &settings,
30181b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &recipientSet,
b4b508 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &newKeys);
d28f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
6faf5a
01b940 ¤   ¤   ¤   ¤   if (PGPRefIsValid(newKeys)) {
a7bba1 ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSelectKeysDialog(
1e6cac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inContext,
15f2d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation,
65be65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_PGPEncoderDecoder,
426afd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAddKeysID),¤   ¤   ¤   ¤   ¤   ¶
9d1b52 ¤   ¤
d21ce4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeys,¤   ¤   ¤   ¤   ¤   ¤   ¤
c255ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeySet,
5cff07 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &selectedSet);
a133cf ¤   ¤   ¤   ¤   ¤   if (pgpErr != kPGPError_UserAbort) {
48c66f ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
f8f6ac ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPSharedAddKeysToDefaultKeyring(
861448 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectedSet);
04c66f ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
4c1c89 ¤   ¤   ¤   ¤   ¤   }
192613 ¤   ¤   ¤   ¤   }
1f2b85 ¤   ¤   ¤   ¤
a3212d ¤   ¤   ¤   ¤   if (settings & kPGPRecipientSettingsConvEncrypt) {
425c9a ¤   ¤   ¤   ¤   ¤   inOptions &= ~encodeOptions_Encrypt;
d08783 ¤   ¤   ¤   ¤   ¤   inOptions |= encodeOptions_ConvEncrypt;
7eb5fc ¤   ¤   ¤   ¤   } else {
cb7070 ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   numKeys;
9ce946 ¤   ¤   ¤   ¤   ¤   pgpErr¤ = PGPCountKeys( recipientSet, &numKeys);
551edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
222b85 ¤   ¤   ¤   ¤
cb2f36 ¤   ¤   ¤   ¤   ¤   if ( numKeys == 0) {
287a2f ¤   ¤   ¤   ¤   ¤   ¤   inOptions &= ~encodeOptions_Encrypt;
23e941 ¤   ¤   ¤   ¤   ¤   ¤   if (! (inOptions & encodeOptions_Sign)) {
4bf670 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowOSErr_(userCanceledErr);
d0db3c ¤   ¤   ¤   ¤   ¤   ¤   }
d01c89 ¤   ¤   ¤   ¤   ¤   }
d72613 ¤   ¤   ¤   ¤   }
ee2b85 ¤   ¤   ¤   ¤
--89cf 00033d7745a40120161 Page 4 of CPGPEncoderDecoder.cp
002e21 ¤   ¤   ¤   ¤   if (settings & kPGPRecipientSettingsFYEO) {
0173bc ¤   ¤   ¤   ¤   ¤   fyeo = true;
352613 ¤   ¤   ¤   ¤   }
c9a3a6 ¤   ¤   ¤   }
6a87c7 ¤   ¤   ¤
772b6e ¤   ¤   ¤   // If conventionally encrypting, get passphrase
757adf ¤   ¤   ¤   if (inOptions & encodeOptions_ConvEncrypt) {
8887fe ¤   ¤   ¤   ¤   char *¤ conventionalPassphrase;
eb2b85 ¤   ¤   ¤   ¤
2488f4 ¤   ¤   ¤   ¤   pgpErr = PGPConventionalEncryptionPassphraseDialog(
71fd34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inContext,
0d033a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase(¤inContext,
22afa3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &conventionalPassph¶
18e00d rase),
fd7055 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
2c8f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
c22db4 ¤   ¤   ¤   ¤   strcpy(convEncryptPassphrase, conventionalPassphrase);
944843 ¤   ¤   ¤   ¤   PGPFreeData(conventionalPassphrase);
60a3a6 ¤   ¤   ¤   }
9b87c7 ¤   ¤   ¤
2e4fb5 ¤   ¤   ¤   // If signing, get passphrase
075c64 ¤   ¤   ¤   if (inOptions & encodeOptions_Sign) {
7f8cb9 ¤   ¤   ¤   ¤   PGPGetPassphraseSettings¤   userSettings;
c82b85 ¤   ¤   ¤   ¤
7d2bc9 ¤   ¤   ¤   ¤   // Make sure we have a key to sign to
44988f ¤   ¤   ¤   ¤   if (numPrivateKeys == 0) {
47b22e ¤   ¤   ¤   ¤   ¤   WarningAlert(¤  kWACautionAlertType,
280c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
9a33b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_PGPEncoderDecoder,
af0528 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoPrivateKeysID);
f62613 ¤   ¤   ¤   ¤   }
752b85 ¤   ¤   ¤   ¤
d1e728 ¤   ¤   ¤   ¤   // Get passphrase
23766a ¤   ¤   ¤   ¤   if (! inUseCache) {
6c3da8 ¤   ¤   ¤   ¤   ¤   sSigningPassphraseCache->Forget();
c92613 ¤   ¤   ¤   ¤   }
022297 ¤   ¤   ¤   ¤   if (! sSigningPassphraseCache->GetPassphraseOrPasskey(defaultKe¶
7db91f ySet,
c4a633 ¤   ¤   ¤   ¤   signingBuffer.mMemory, &usePassphrase, &signingPasskeySize,
3e6e3d ¤   ¤   ¤   ¤   &signingKey)) {
76df45 ¤   ¤   ¤   ¤   ¤   usePassphrase = true;
9eeb99 ¤   ¤   ¤   ¤   ¤   pgpErr = PGPClientSigningPassphraseDialog(
d16cac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inContext,
3a55ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeySet,
fd8e22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
152c27 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPGetPassphraseOptionsHideFileOptions,
8588e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   userSettings,
813f91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signingKey,
839a1e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (char *) signingBuffer.mMemory,
642c90 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &userSettings,
42cf13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &signingKey);
ca512e ¤   ¤   ¤   ¤   ¤   if (pgpErr != kPGPError_KeyUnusableForSignature) {
c0c66f ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
ec81a1 ¤   ¤   ¤   ¤   ¤   } else {
f4faa4 ¤   ¤   ¤   ¤   ¤   ¤   PGPByte *¤  passkey = nil;
ab94aa ¤   ¤   ¤   ¤   ¤   ¤
4d8901 ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPReconstitutionDialog(
c6b180 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signingKey,
6c9c7f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeySet,
412464 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPtlsContextRef,
d46f48 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passkey,
73f34e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &signingPasskeySize);
3cc66f ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
def589 ¤   ¤   ¤   ¤   ¤   ¤   pgpCopyMemory(¤ passkey,
be8ad0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signingBuffer.mMemory,
ed4548 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signingPasskeySize);
3c1fd7 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeData(passkey);
41b696 ¤   ¤   ¤   ¤   ¤   ¤   usePassphrase = false;
691c89 ¤   ¤   ¤   ¤   ¤   }
0c5a64 ¤   ¤   ¤   ¤   ¤   SetPassbufferCache(¤true,
6db180 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signingKey,
337e18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   usePassphrase,
--c4ae 0008c07617d40120161 Page 5 of CPGPEncoderDecoder.cp
8b8ad0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signingBuffer.mMemory,
e54548 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signingPasskeySize);
a22613 ¤   ¤   ¤   ¤   }
f92b85 ¤   ¤   ¤   ¤
5c7689 ¤   ¤   ¤   ¤   // If we are only signing, wrap the input
b4f674 ¤   ¤   ¤   ¤   if ((! (inOptions & encodeOptions_Encrypt))
e7a226 ¤   ¤   ¤   ¤   && (! (inOptions &encodeOptions_ConvEncrypt))) {
2e67d0 ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ wordWrapEnabled;
44ae30 ¤   ¤   ¤   ¤   ¤
ee2a56 ¤   ¤   ¤   ¤   ¤   pgpErr = PGPOpenClientPrefs(
7baa7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr(inContext),
bd075f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &prefRef);
521edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
0791cc ¤   ¤   ¤   ¤   ¤   pgpErr = PGPGetPrefBoolean(¤prefRef,
26f27e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefWordWrapEnable,
e99327 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &wordWrapEnabled);
981edd ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
c7ae30 ¤   ¤   ¤   ¤   ¤
645b58 ¤   ¤   ¤   ¤   ¤   if (wordWrapEnabled) {
0695ff ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   wordWrapWidth;
c6a71f ¤   ¤   ¤   ¤   ¤   ¤   PGPFileOffset¤  bufSize;
b49124 ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤¤   ¤   unused;¤
2294aa ¤   ¤   ¤   ¤   ¤   ¤
798fec ¤   ¤   ¤   ¤   ¤   ¤   {
972546 ¤   ¤   ¤   ¤   ¤   ¤   ¤   StHandleLocker¤ theLock(ioDataH);
29531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
7b5a9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPGetPrefNumber(¤ prefRef,
b162c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefWordWrapWidth,
9d6775 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &wordWrapWidth);
a8d748 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
601ce9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPNewMemoryIOFixedBuffer(
05847d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr(inContext),
b3cec4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *ioDataH,
3cb81e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::GetHandleSize(ioDataH),
03bc2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPMemoryIORef*) &wrapInput);
8bd748 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
155634 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPNewMemoryIO(
95695a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr(inContext),
2fa778 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPMemoryIORef*) &wrapOutput);
62d748 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
4fd6b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = pgpWordWrapIO(¤wrapInput,
68dcfa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wrapOutput,
2dd739 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wordWrapWidth,
f1e3f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   "\r");
c1d748 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
b0d2a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeIO(wrapInput);
34df71 ¤   ¤   ¤   ¤   ¤   ¤   ¤   wrapInput = kInvalidPGPIORef;
09db3c ¤   ¤   ¤   ¤   ¤   ¤   }
0694aa ¤   ¤   ¤   ¤   ¤   ¤
22cf27 ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPIOSetPos(¤  wrapOutput,
571eeb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0);
9fc66f ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
07a152 ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPIOGetEOF(¤  wrapOutput,
dd862a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &bufSize);
2fc66f ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
04b3c3 ¤   ¤   ¤   ¤   ¤   ¤   ::SetHandleSize(ioDataH, bufSize);
4889ee ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfMemError_();
c68f49 ¤   ¤   ¤   ¤   ¤   ¤   ::HLock(ioDataH);
732fc8 ¤   ¤   ¤   ¤   ¤   ¤   pgpErr = PGPIORead(¤wrapOutput,
dcbfab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   bufSize,
39cec4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *ioDataH,
cd7c57 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &unused);
b5ea46 ¤   ¤   ¤   ¤   ¤   ¤   ::HUnlock(ioDataH);
b7c66f ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
6d1852 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeIO(wrapOutput);
f043b4 ¤   ¤   ¤   ¤   ¤   ¤   wrapOutput = kInvalidPGPIORef;
591c89 ¤   ¤   ¤   ¤   ¤   }
4d2613 ¤   ¤   ¤   ¤   }
19a3a6 ¤   ¤   ¤   }
feaf5a
45b7a2 ¤   ¤   ¤   // Load the cursor
8c4a8a ¤   ¤   ¤   err = Get1AnimatedCursor(acur_BeachBall, &cursorRef);
--7b85 00044942fee40120161 Page 6 of CPGPEncoderDecoder.cp
18c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
8b87c7 ¤   ¤   ¤
71917d ¤   ¤   ¤   // Do the encrypting
b081cc ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   bufSize;
eb0cfe ¤   ¤   ¤   void *¤ ¤   ¤   ¤   buf;
afaf5a
55b735 ¤   ¤   ¤   pgpErr = PGPGuaranteeMinimumEntropy(inContext);
778109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
e4a311 ¤   ¤   ¤   optionList = CreateOptionList(¤ inContext,
45fd23 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inOptions,
0b1d92 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   recipientSet,
63e42c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signingKey,
4e9ab8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   convEncryptPassphrase,
53072c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signingBuffer.mMemory,
87ee93 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signingPasskeySize,
fb2a7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   usePassphrase);
1f6bdc ¤   ¤   ¤   ::HLock(ioDataH);
945f83 ¤   ¤   ¤   pgpErr = PGPEncode(¤inContext,
09dde2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOInputBuffer(¤   inContext,
d72fb3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *ioDataH,
f525cf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::GetHandleSize(ioDataH)),
e23674 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOAllocatedOutputBuffer(¤ inContext,
1648f6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &buf,
70fb33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   MAX_PGPSize,
c4c021 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &bufSize),
ab48a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEventHandler(¤  inContext,
67a18a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEncodeEventHandler,
60f818 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cursorRef),
8e3064 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOSendNullEvents(¤inContext,
230f99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   500),
743331 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOForYourEyesOnly(inContext, fyeo),
0646dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   optionList,
bdb449 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
452c89 ¤   ¤   ¤   ::HUnlock(ioDataH);
2e8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
fd87c7 ¤   ¤   ¤
4a0c77 ¤   ¤   ¤   ::PtrToXHand(buf, ioDataH, bufSize);
bb8347 ¤   ¤   ¤   PGPFreeData(buf);
a3da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
746df5 ¤   ¤   ¤   result = true;
a10fe4 ¤   ¤   }
209371 ¤   }
3c67c5 ¤
ccca6f ¤   catch (CComboError & comboError) {
66adc1 ¤   ¤   if (! comboError.IsCancelError()) {
a0c452 ¤   ¤   ¤   if (comboError.HavePGPError()) {
2ebc0c ¤   ¤   ¤   ¤   ShowError(comboError.pgpErr);
a3042d ¤   ¤   ¤   } else {
14c90f ¤   ¤   ¤   ¤   ShowError(MacErrorToPGPError(comboError.err));
a0a3a6 ¤   ¤   ¤   }
5b0fe4 ¤   ¤   }
809371 ¤   }
1daf5a
3b7e82 ¤   catch(...) {
576fec ¤   ¤   ShowError(kPGPError_UnknownError);
309371 ¤   }
7967c5 ¤
677b8e ¤   // Cleanup
cdc7b3 ¤   if (cursorRef != nil) {
1c401d ¤   ¤   DisposeAnimatedCursor(cursorRef);
c69371 ¤   }
4dc419 ¤   if (PGPOptionListRefIsValid(optionList)) {
702562 ¤   ¤   PGPFreeOptionList(optionList);
b99371 ¤   }
8a8619 ¤   if (PGPKeySetRefIsValid(selectedSet)) {
1a4e78 ¤   ¤   PGPFreeKeySet(selectedSet);
f89371 ¤   }
9100b9 ¤   if (PGPKeySetRefIsValid(newKeys)) {
e8226d ¤   ¤   PGPFreeKeySet(newKeys);
039371 ¤   }
977ed1 ¤   if (PGPKeySetRefIsValid(recipientSet)) {
44a9de ¤   ¤   PGPFreeKeySet(recipientSet);
--4f9c 00003e58fff40120161 Page 7 of CPGPEncoderDecoder.cp
a19371 ¤   }
8e748b ¤   if (PGPKeySetRefIsValid(defaultKeySet)) {
27aca0 ¤   ¤   PGPFreeKeySet(defaultKeySet);
e99371 ¤   }
4bc733 ¤   if (PGPPrefRefIsValid(prefRef)) {
14fbc0 ¤   ¤   PGPClosePrefFile(prefRef);
3c9371 ¤   }
b1e3f5 ¤   if (PGPIORefIsValid(wrapInput)) {
2b40cc ¤   ¤   PGPFreeIO(wrapInput);
c29371 ¤   }
c4cd2b ¤   if (PGPIORefIsValid(wrapOutput)) {
8a4a0a ¤   ¤   PGPFreeIO(wrapOutput);
b19371 ¤   }
1caf5a
fb5d73 ¤   return result;
67efe6 }
abaf5a
85af5a
15af5a
ef7e69 ¤   Boolean
365692 CPGPEncoderDecoder::DecodeHandle(
aeb8d1 ¤   PGPContextRef¤  ¤   ¤   inContext,
a4ac13 ¤   Handle¤ ¤   ¤   ¤   ¤   inDataH,
aa9e59 ¤   PGPKeySetRef¤   ¤   ¤   inKeySet,
9501d8 ¤   SDecodeSectionHandle &¤ outDecodeSectionsHandle,
29fe85 ¤   Boolean *¤  ¤   ¤   ¤   outFYEO,
fe2262 ¤   Boolean¤¤   ¤   ¤   ¤   inUseCache)
1ebb36 {
a90c37 ¤   Boolean¤¤   ¤   ¤   result = false;
2aaf5a
9ab5b3 ¤   if (::GetHandleSize(inDataH) > 0) {
2d5d4a ¤   ¤   OSErr¤  ¤   ¤   ¤   err;
9e3060 ¤   ¤   PGPError¤   ¤   ¤   pgpErr;
ffdc22 ¤   ¤   UInt32¤ ¤   ¤   ¤   numPublicKeys = 1;
e69100 ¤   ¤   UInt32¤ ¤   ¤   ¤   numPrivateKeys = 1;
962a93 ¤   ¤   SDecodeData¤¤   ¤   decodeData = {inUseCache, false, nil, nil, inKeySet¶
dc82f7 };
84af5a
dbab27 ¤   ¤   // Check for missing keys
c8fd2a ¤   ¤   try {
eed38a ¤   ¤   ¤   if (sCheckForMissingKeys) {
aba448 ¤   ¤   ¤   ¤   err = CountKeysInDefaultKeyring(¤   inContext,
881173 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &numPublicKeys,
ea7d24 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &numPrivateKeys);
b387f8 ¤   ¤   ¤   ¤   PGPThrowIfOSErr_(err);
e62b85 ¤   ¤   ¤   ¤
ea216a ¤   ¤   ¤   ¤   if (numPublicKeys == 0) {
00b22e ¤   ¤   ¤   ¤   ¤   WarningAlert(¤  kWACautionAlertType,
9b0c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
8933b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_PGPEncoderDecoder,
db0c66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoPublicKeysID);
5246b1 ¤   ¤   ¤   ¤   } else if (numPrivateKeys == 0) {
bfb22e ¤   ¤   ¤   ¤   ¤   WarningAlert(¤  kWACautionAlertType,
150c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
2433b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_PGPEncoderDecoder,
cb0528 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoPrivateKeysID);
1bb5fc ¤   ¤   ¤   ¤   } else {
a6aaf8 ¤   ¤   ¤   ¤   ¤   sCheckForMissingKeys = false;
ef2613 ¤   ¤   ¤   ¤   }
33a3a6 ¤   ¤   ¤   }
5487c7 ¤   ¤   ¤
a34c19 ¤   ¤   ¤   // Get the cursor
c8123e ¤   ¤   ¤   err = Get1AnimatedCursor(acur_BeachBall, &decodeData.cursor);
a3c60b ¤   ¤   ¤   PGPThrowIfOSErr_(err);
f987c7 ¤   ¤   ¤
b3aad7 ¤   ¤   ¤   // Create Handle for storing decoded data
73eb30 ¤   ¤   ¤   decodeData.handle = ::NewHandle(0);
d54e81 ¤   ¤   ¤   PGPThrowIfMemFail_(decodeData.handle);
3f87c7 ¤   ¤   ¤
b82621 ¤   ¤   ¤   ::HLock(inDataH);
fed597 ¤   ¤   ¤   ::HLock(decodeData.handle);
0332bd ¤   ¤   ¤   pgpErr = PGPDecode(¤inContext,
--c35e 000f06e2bed40120161 Page 8 of CPGPEncoderDecoder.cp
81dde2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOInputBuffer(¤   inContext,
9dae0c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *inDataH,
9509e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::GetHandleSize(inDataH)),
e748a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEventHandler(¤  inContext,
c5791a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPDecodeEventHandler,
bec0e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &decodeData),
6f3064 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOSendNullEvents(¤inContext,
680f99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   500),
537f39 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeySetRef(¤ inContext,
0d6a4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inKeySet),
4d1759 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOSendEventIfKeyFound(inContext, true),
da6b99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassThroughIfUnrecognized(¤ inContext,
0a4270 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true),
a2b449 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
f4c584 ¤   ¤   ¤   ::HUnlock(decodeData.handle);
986174 ¤   ¤   ¤   ::HUnlock(inDataH);
0d8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
c287c7 ¤   ¤   ¤
0dc1de ¤   ¤   ¤   outDecodeSectionsHandle =
6ed4d8 ¤   ¤   ¤   ¤   ¤   (SDecodeSectionHandle) decodeData.handle;
7ddee2 ¤   ¤   ¤   *outFYEO = decodeData.FYEO;
30b566 ¤   ¤   ¤   decodeData.handle = nil;
026df5 ¤   ¤   ¤   result = true;
7c0fe4 ¤   ¤   }
af1b52 ¤   ¤
66c423 ¤   ¤   catch (CComboError & comboError) {
45b591 ¤   ¤   ¤   if (! comboError.IsCancelError()) {
2696cf ¤   ¤   ¤   ¤   if (comboError.HavePGPError()) {
6cf332 ¤   ¤   ¤   ¤   ¤   ShowError(comboError.pgpErr);
aab5fc ¤   ¤   ¤   ¤   } else {
d644f3 ¤   ¤   ¤   ¤   ¤   ShowError(MacErrorToPGPError(comboError.err));
7d2613 ¤   ¤   ¤   ¤   }
82a3a6 ¤   ¤   ¤   }
aa0fe4 ¤   ¤   }
cfaf5a
f53f09 ¤   ¤   catch(...) {
6dfe74 ¤   ¤   ¤   ShowError(kPGPError_UnknownError);
a10fe4 ¤   ¤   }
8b1b52 ¤   ¤
09992d ¤   ¤   // Cleanup
4681bc ¤   ¤   if (decodeData.cursor != nil) {
6859fc ¤   ¤   ¤   DisposeAnimatedCursor(decodeData.cursor);
da0fe4 ¤   ¤   }
8c5cf7 ¤   ¤   if (decodeData.handle != nil) {
d72dbe ¤   ¤   ¤   ::DisposeHandle(decodeData.handle);
d50fe4 ¤   ¤   }
7e9371 ¤   }
fa67c5 ¤
935d73 ¤   return result;
ccefe6 }
0baf5a
46af5a
b0af5a
276d52 ¤   void
c802a2 CPGPEncoderDecoder::FreeDecodeSection(
96eeae ¤   SDecodeSection *¤   inSection)
4ebb36 {
e95d79 ¤   if (inSection->buf != nil) {
3bc96a ¤   ¤   PGPFreeData(inSection->buf);
099371 ¤   }
f976dc ¤   if (PGPKeySetRefIsValid(inSection->addKeysSet)) {
71e657 ¤   ¤   PGPFreeKeySet(inSection->addKeysSet);
549371 ¤   }
64efe6 }
d7af5a
e5af5a
fcaf5a
cb13fb ¤   PGPOptionListRef
3e42c0 CPGPEncoderDecoder::CreateOptionList(
1f3c55 ¤   PGPContextRef¤  inContext,
50215c ¤   EEncodeOptions¤ inOptions,
f052cb ¤   PGPKeySetRef¤   inRecipients,
--87a9 000d3ec476e40120161 Page 9 of CPGPEncoderDecoder.cp
30f14a ¤   PGPKeyRef¤  ¤   inSigningKey,
b0ac09 ¤   char *¤ ¤   ¤   inConvEncryptPassphrase,
49cf6a ¤   void *¤ ¤   ¤   inPassBuffer,
c51416 ¤   PGPSize¤¤   ¤   inPassKeySize,
3b7191 ¤   Boolean¤¤   ¤   inUsePassphrase)
61bb36 {
3c3ddd ¤   PGPOptionListRef¤   optionList;
0ee747 ¤   CString¤¤   ¤   ¤   commentString;
071abc ¤   PGPPrefRef¤ ¤   ¤   prefRef = kInvalidPGPPrefRef;
5fbb9c ¤   PGPError¤   ¤   ¤   pgpErr;
be67c5 ¤
a95168 ¤   try {
a220d0 ¤   ¤   // Add admin comment
b1be29 #if PGP_BUSINESS_SECURITY
ce9cce ¤   ¤   pgpErr = PGPOpenAdminPrefs(¤PGPGetContextMemoryMgr(inContext),
4b7b4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &prefRef );
61af5a
82d757 ¤   ¤   if (pgpErr != kPGPError_NoErr) {
32f080 ¤   ¤   ¤   WarningAlert(¤  kWAStopAlertType,
509c29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
b9e6a6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   STRx_PGPEncoderDecoderErrorStrings,
5217e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kErrorStringID,
09d7f8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(pgpErr),
0f89c1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CString(¤   STRx_PGPEncoderDecoderErrorStrings,
9f6832 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kErrorStringAdminPrefsNotFoundID));
0abe70 ¤   ¤   ¤   PGPThrowOSErr_(userCanceledErr);
6d0fe4 ¤   ¤   }
76ce8b ¤   ¤   PGPGetPrefStringBuffer(¤prefRef,
c44d4f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefComments,
2c2036 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   commentString.GetBufferSize(),
e488c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   commentString);
1ffbc0 ¤   ¤   PGPClosePrefFile(prefRef);
9e7454 #endif
674ce0 ¤   ¤   // We need the client prefs for the rest of the options
d6c782 ¤   ¤   pgpErr = PGPOpenClientPrefs(¤   PGPGetContextMemoryMgr(inContext),
334e75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &prefRef);
bcc0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
a61b52 ¤   ¤
7e73c5 ¤   ¤   // If there was no admin comment, add the client comment
64ae48 ¤   ¤   if (commentString.GetLength() == 0) {
c2c833 ¤   ¤   ¤   PGPGetPrefStringBuffer(¤prefRef,
9c74a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefComment,
9fadca ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   commentString.GetBufferSize(),
991e86 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   commentString);
210fe4 ¤   ¤   }
0faf5a
cc1317 ¤   ¤   pgpErr = PGPNewOptionList(inContext, & optionList);
81c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
c8ce52 ¤   ¤   if (commentString.GetLength() != 0) {
932fb6 ¤   ¤   ¤   PGPAppendOptionList(¤   optionList,
95b08b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOCommentString(¤ inContext,
edabe1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   commentString),
7a7055 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
fa0fe4 ¤   ¤   }
94da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
be06ce ¤   ¤   // Add version string
e437e6 ¤   ¤   PGPAppendOptionList(¤   optionList,
d05516 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOVersionString(¤ inContext,
5d47b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpVersionHeaderString),
c2b449 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
ea1b52 ¤   ¤
2ecffa ¤   ¤   // Add rest of options
760c5f ¤   ¤   if ((inOptions & encodeOptions_Encrypt)
e7c607 ¤   ¤   && (! (inOptions & encodeOptions_ConvEncrypt))) {
332fb6 ¤   ¤   ¤   PGPAppendOptionList(¤   optionList,
de72f8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEncryptToKeySet(¤   inContext,
92140b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inRecipients),
4c7055 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
9faf5a
97eff0 ¤   ¤   ¤   PGPCipherAlgorithm *¤   allowedAlgorithms = nil;
220e10 ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   ¤   bufSize;
d387c7 ¤   ¤   ¤
--2ccb 000ba16d80240120161 Page 10 of CPGPEncoderDecoder.cp
379e23 ¤   ¤   ¤   PGPGetPrefData(¤prefRef,
0bb2dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefAllowedAlgorithmsList,
278b79 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &bufSize,
e4058a ¤   ¤   ¤   ¤   ¤   ¤   ¤   &allowedAlgorithms);
7a62a5 ¤   ¤   ¤   if (allowedAlgorithms != nil) {
a35d9f ¤   ¤   ¤   ¤   PGPAppendOptionList(
1a8012 ¤   ¤   ¤   ¤   ¤   optionList,
a9e076 ¤   ¤   ¤   ¤   ¤   PGPOPreferredAlgorithms(¤   inContext,
c53fc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   allowedAlgorithms,
d63746 ¤   ¤   ¤   ¤   ¤   bufSize / sizeof( PGPCipherAlgorithm ) ),
2df8f3 ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
77a714 ¤   ¤   ¤   ¤   PGPDisposePrefData(¤prefRef,
2005c3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   allowedAlgorithms);
c3a3a6 ¤   ¤   ¤   }
bf0fe4 ¤   ¤   }
2515ec ¤   ¤   if (inOptions & encodeOptions_ConvEncrypt) {
3fd817 ¤   ¤   ¤   PGPUInt32¤  preferredAlgorithm;
c787c7 ¤   ¤   ¤
6f9a29 ¤   ¤   ¤   pgpErr = PGPGetPrefNumber(¤ prefRef,
21bcd3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefPreferredAlgorithm,
52b7d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &preferredAlgorithm);
42d1ef ¤   ¤   ¤   if (pgpErr != kPGPError_NoErr) {
4ba8a4 ¤   ¤   ¤   ¤   preferredAlgorithm = kPGPCipherAlgorithm_CAST5;
30a3a6 ¤   ¤   ¤   }
3019e5 ¤   ¤   ¤   PGPAppendOptionList(¤
9dcebb ¤   ¤   ¤   ¤   ¤   ¤   ¤   optionList,
ea9187 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOConventionalEncrypt(inContext,·
f74239 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase(inContext,
aea001 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inConvEncryptPassphrase),
bc6cd0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext)),
518917 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOCipherAlgorithm(¤   inContext,
e72b52 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPCipherAlgorithm) preferredAlgorithm),
513b1e ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
8b0fe4 ¤   ¤   }
b4135a ¤   ¤   if (inOptions & encodeOptions_Sign) {
6560f7 ¤   ¤   ¤   PGPAppendOptionList(
772d4c ¤   ¤   ¤   ¤   optionList,
3f8980 ¤   ¤   ¤   ¤   PGPOSignWithKey(¤   inContext,
988c6c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inSigningKey,
ea6f45 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (inUsePassphrase) ?·
33fb08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase(
0e34a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inContext,
ee7870 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (char *) inPassBuffer) :
73eae8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer(¤ inContext,
9634e5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inPassBuffer,
87dba9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inPassKeySize),
ffa8cc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext)),
1ee0a3 ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
bb0fe4 ¤   ¤   }
a460db ¤   ¤   if (inOptions & encodeOptions_TextOutput) {
da2fb6 ¤   ¤   ¤   PGPAppendOptionList(¤   optionList,
15e523 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOArmorOutput(inContext, true),
b07055 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
860fe4 ¤   ¤   }
fd8693 ¤   ¤   if (inOptions & encodeOptions_TreatInputAsText) {
772fb6 ¤   ¤   ¤   PGPAppendOptionList(¤   optionList,
4384b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPODataIsASCII(inContext, true),
917055 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
0e0fe4 ¤   ¤   }
338f12 ¤   ¤   if (inOptions & encodeOptions_ClearSign) {
542fb6 ¤   ¤   ¤   PGPAppendOptionList(¤   optionList,
dc9043 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOClearSign(inContext, true),
8a7055 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
230fe4 ¤   ¤   }
78fbc0 ¤   ¤   PGPClosePrefFile(prefRef);
229371 ¤   }
8c67c5 ¤
80e0a3 ¤   catch (...) {
51fbdd ¤   ¤   if (PGPPrefRefIsValid(prefRef)) {
35ba33 ¤   ¤   ¤   PGPClosePrefFile(prefRef);
e20fe4 ¤   ¤   }
baa33a ¤   ¤   throw;
--1e9c 000d861510840120161 Page 11 of CPGPEncoderDecoder.cp
a19371 ¤   }
9967c5 ¤
8b4f4c ¤   return optionList;
08efe6 }
5faf5a
8faf5a
98af5a
386d52 ¤   void
18792e CPGPEncoderDecoder::SetPassbufferCache(
b0dd01 ¤   Boolean¤¤   ¤   inSigning,
1d00e6 ¤   PGPKeyRef¤  ·¤  inKey,
cf044f ¤   PGPBoolean¤ ¤   inUsePassphrase,
2e7911 ¤   void *¤ ¤   ¤   inBuffer,
e19d97 ¤   PGPSize¤¤   ¤   inPasskeySize)
e9bb36 {
31b02a ¤   PGPPrefRef¤ ¤   ¤   ¤   prefRef = kInvalidPGPPrefRef;
6a67c5 ¤
3d5168 ¤   try {
5eeaec ¤   ¤   CSignPassphraseCache *¤ theCache;
202992 ¤   ¤   PGPBoolean¤ ¤   ¤   ¤   cacheEnabled;
ab17e3 ¤   ¤   PGPUInt32¤  ¤   ¤   ¤   cacheDuration = 0;
841ae0 ¤   ¤   PGPError¤   ¤   ¤   ¤   pgpErr;
0c1b52 ¤   ¤
57f848 ¤   ¤   // Get the cache values
2200a8 ¤   ¤   pgpErr = PGPOpenClientPrefs(PGPGetContextMemoryMgr(PGPGetKeyContext(inK¶
381b7d ey)),
5096c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &prefRef);
bdc0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
321b52 ¤   ¤
bade81 ¤   ¤   if (inSigning) {
e9b584 ¤   ¤   ¤   theCache = sSigningPassphraseCache;
58ade4 ¤   ¤   ¤   pgpErr = PGPGetPrefBoolean(¤prefRef,
a75cba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefSignCacheEnable,
77bed2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &cacheEnabled);
298109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
662788 ¤   ¤   ¤   if (cacheEnabled) {
31c932 ¤   ¤   ¤   ¤   pgpErr = PGPGetPrefNumber(¤ prefRef,
15ea83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefSignCacheSeconds,
a586f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &cacheDuration);
e78f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
fea3a6 ¤   ¤   ¤   }
b045a6 ¤   ¤   } else {
3392b8 ¤   ¤   ¤   theCache = sDecryptPassphraseCache;
36ade4 ¤   ¤   ¤   pgpErr = PGPGetPrefBoolean(¤prefRef,
b71107 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDecryptCacheEnable,
60bed2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &cacheEnabled);
e18109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
122788 ¤   ¤   ¤   if (cacheEnabled) {
10c932 ¤   ¤   ¤   ¤   pgpErr = PGPGetPrefNumber(¤ prefRef,
2c96f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDecryptCacheSeconds,
0a86f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &cacheDuration);
5f8f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
5ca3a6 ¤   ¤   ¤   }
3a0fe4 ¤   ¤   }
fe1b52 ¤   ¤
80fe3e ¤   ¤   theCache->SetCacheSeconds(cacheDuration);
0d2428 ¤   ¤   if (inUsePassphrase) {
22befc ¤   ¤   ¤   theCache->RememberPassphrase((char *) inBuffer, inKey);
9c45a6 ¤   ¤   } else {
fe04e1 ¤   ¤   ¤   theCache->RememberPasskey(inBuffer, inPasskeySize, inKey);
590fe4 ¤   ¤   }
e29371 ¤   }
2967c5 ¤
65e0a3 ¤   catch (...) {
bf9371 ¤   }
43af5a
4ec733 ¤   if (PGPPrefRefIsValid(prefRef)) {
bdfbc0 ¤   ¤   PGPClosePrefFile(prefRef);
c49371 ¤   }
7cefe6 }
6caf5a
d8af5a
--621a 000b639cff540120161 Page 12 of CPGPEncoderDecoder.cp
3b6d52 ¤   void
677b5b CPGPEncoderDecoder::ShowError(
f24f7a ¤   PGPError¤   inErr)
c1bb36 {
e06d8e ¤   CString¤¤   theErrorString;
e667c5 ¤
b0c854 ¤   PGPGetClientErrorString(¤   inErr,
f5e232 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theErrorString.GetBufferSize() + 1,
418d69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theErrorString);
47f5ab ¤   WarningAlert(¤  kWAStopAlertType,
5dd280 ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
93aded ¤   ¤   ¤   ¤   ¤   STRx_PGPEncoderDecoderErrorStrings,
755ad4 ¤   ¤   ¤   ¤   ¤   kErrorStringID,
862129 ¤   ¤   ¤   ¤   ¤   CString(inErr),
69dca1 ¤   ¤   ¤   ¤   ¤   theErrorString);
56efe6 }
8eaf5a
40af5a
1aaf5a
cec744 ¤   PGPError
bd0c7b CPGPEncoderDecoder::PGPDecodeEventHandler(
9e3c55 ¤   PGPContextRef¤  inContext,
f370a8 ¤   PGPEvent *¤ ¤   inEventP,
218f16 ¤   PGPUserValue¤   inUserValue)
18bb36 {
fee74b ¤   PGPError¤   ¤   ¤   ¤   result = kPGPError_NoErr;
10dcc1 ¤   static PGPInt32¤¤   ¤   sSection;
571333 ¤   static Boolean¤ ¤   ¤   sAllocated;
2f366c ¤   static PGPUInt32¤   ¤   sKeyIDCount = 0;
0662be ¤   static PGPKeySetRef¤¤   sRecipientKeySet = kInvalidPGPKeySetRef;
6eebed ¤   static PGPKeyID *¤  ¤   sKeyIDList = nil;
e6c66f ¤   char *¤ ¤   ¤   ¤   ¤   tempPassphrase = nil;
1ab1aa ¤   SDecodeSectionHandle¤   decodeSectionH =·
b79564 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (SDecodeSectionHandle) ((SDecodeData *)
e850dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inUserValue)->handle;
8f67c5 ¤
bf5168 ¤   try {
c0a714 ¤   ¤   AnimateCursor(((SDecodeData *) inUserValue)->cursor);
e11b52 ¤   ¤
d38a20 ¤   ¤   switch (inEventP->type) {
6209f1 ¤   ¤   ¤   case kPGPEvent_InitialEvent:
3af776 ¤   ¤   ¤   {
a1a3e0 ¤   ¤   ¤   ¤   sSection = -1;
650712 ¤   ¤   ¤   ¤   sAllocated = false;
5ea3a6 ¤   ¤   ¤   }
cacdcb ¤   ¤   ¤   break;
ae87c7 ¤   ¤   ¤
d587c7 ¤   ¤   ¤
380e2f ¤   ¤   ¤   case kPGPEvent_EndLexEvent:
10f776 ¤   ¤   ¤   {
c60712 ¤   ¤   ¤   ¤   sAllocated = false;
97f217 ¤   ¤   ¤   ¤   if (PGPKeySetRefIsValid(sRecipientKeySet)) {
087b6b ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet(sRecipientKeySet);
88459f ¤   ¤   ¤   ¤   ¤   sRecipientKeySet = kInvalidPGPKeySetRef;
b72613 ¤   ¤   ¤   ¤   }
516b60 ¤   ¤   ¤   ¤   if (IsntNull(sKeyIDList)) {
ad75ce ¤   ¤   ¤   ¤   ¤   delete[] sKeyIDList;
8b7cc8 ¤   ¤   ¤   ¤   ¤   sKeyIDList = nil;
c12613 ¤   ¤   ¤   ¤   }
67a3a6 ¤   ¤   ¤   }
0dcdcb ¤   ¤   ¤   break;
2c87c7 ¤   ¤   ¤
6a87c7 ¤   ¤   ¤
210999 ¤   ¤   ¤   case kPGPEvent_AnalyzeEvent:
d0f776 ¤   ¤   ¤   {
bd7cae ¤   ¤   ¤   ¤   if (inEventP->data.analyzeData.sectionType ==
70f27a ¤   ¤   ¤   ¤   kPGPAnalyze_Encrypted) {
15a118 ¤   ¤   ¤   ¤   ¤   if (! sAllocated) {
41b46e ¤   ¤   ¤   ¤   ¤   ¤   sSection++;
49888c ¤   ¤   ¤   ¤   ¤   ¤   // Unlock long enough to grow the handle
ad9ea8 ¤   ¤   ¤   ¤   ¤   ¤   ::HUnlock((Handle) decodeSectionH);
b686ed ¤   ¤   ¤   ¤   ¤   ¤   ::SetHandleSize(¤   (Handle) decodeSectionH,
--31d7 0002b09a8e840120161 Page 13 of CPGPEncoderDecoder.cp
805069 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (sSection + 1)
93610a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   * sizeof(SDecodeSection));
a4cad7 ¤   ¤   ¤   ¤   ¤   ¤   ::HLock((Handle) decodeSectionH);
21b89f ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].buf = nil;
b4db84 ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet =
a47701 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPKeySetRef;
1a922b ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].sigDataValid = false;
ff86cb ¤   ¤   ¤   ¤   ¤   ¤   sAllocated = true;
0b1c89 ¤   ¤   ¤   ¤   ¤   }
8be970 ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].encrypted = true;
852613 ¤   ¤   ¤   ¤   }
cca3a6 ¤   ¤   ¤   }
05cdcb ¤   ¤   ¤   break;
2687c7 ¤   ¤   ¤
dd87c7 ¤   ¤   ¤
5b15a8 ¤   ¤   ¤   case kPGPEvent_RecipientsEvent:
27f776 ¤   ¤   ¤   {
1a6714 ¤   ¤   ¤   ¤   PGPUInt32¤  numFoundKeys = 0;
0b2b85 ¤   ¤   ¤   ¤
c844bd ¤   ¤   ¤   ¤   if (PGPKeySetRefIsValid(inEventP->
bd7d4c ¤   ¤   ¤   ¤   data.recipientsData.recipientSet)) {
731145 ¤   ¤   ¤   ¤   ¤   result = PGPIncKeySetRefCount(inEventP->
63cfd2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   data.recipientsData.recipientSet);
59200b ¤   ¤   ¤   ¤   ¤   if (IsntPGPError(result)) {
b662e4 ¤   ¤   ¤   ¤   ¤   ¤   sRecipientKeySet = inEventP->
deb942 ¤   ¤   ¤   ¤   ¤   ¤   ¤   data.recipientsData.recipientSet;
bb5590 ¤   ¤   ¤   ¤   ¤   ¤   if (IsntNull(inEventP->
921833 ¤   ¤   ¤   ¤   ¤   ¤   data.recipientsData.keyIDArray)) {
358aa1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sKeyIDCount = inEventP->
06399c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   data.recipientsData.keyCount;
42ef42 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sKeyIDList = new PGPKeyID[sKeyIDCount];
f96d74 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (sKeyIDList == nil) {
794690 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   result = kPGPError_OutOfMemory;
28079f ¤   ¤   ¤   ¤   ¤   ¤   ¤   } else {
f6cc7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpCopyMemory(
973086 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inEventP->data.recipientsData.keyIDArray,
5eb56d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sKeyIDList,
1ce1c6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sKeyIDCount * sizeof(PGPKeyID));
9a5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
47db3c ¤   ¤   ¤   ¤   ¤   ¤   }
181c89 ¤   ¤   ¤   ¤   ¤   }
a42613 ¤   ¤   ¤   ¤   }
0da3a6 ¤   ¤   ¤   }
d2cdcb ¤   ¤   ¤   break;
9387c7 ¤   ¤   ¤
1987c7 ¤   ¤   ¤
7f2d51 ¤   ¤   ¤   case kPGPEvent_PassphraseEvent:
09f776 ¤   ¤   ¤   {
d3b90d ¤   ¤   ¤   ¤   PGPKeyRef¤  ¤   ¤   keyRef = kInvalidPGPKeyRef;
d63129 ¤   ¤   ¤   ¤   CSecureMemory¤  ¤   passbuffer(PGPGetContextMemoryMgr(
f5adf3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inContext), 256);
4017ee ¤   ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   passkeySize;
a4386e ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   ¤   usePassphrase;
2aaf5a
d73d8c ¤   ¤   ¤   ¤   if (! ((SDecodeData *) inUserValue)->useCache) {
c88421 ¤   ¤   ¤   ¤   ¤   sDecryptPassphraseCache->Forget();
972613 ¤   ¤   ¤   ¤   }
862b85 ¤   ¤   ¤   ¤
542b86 ¤   ¤   ¤   ¤   if (inEventP->data.passphraseData.fConventional) {
9fdf45 ¤   ¤   ¤   ¤   ¤   usePassphrase = true;
3cea9a ¤   ¤   ¤   ¤   ¤   result = PGPConventionalDecryptionPassphraseDialog(
45fd34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inContext,
b34152 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase(
d52586 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inContext,
49b18d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &tempPassphrase),
f17055 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
da7f94 ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(result);
996e89 ¤   ¤   ¤   ¤   ¤   strcpy(¤(char *) passbuffer.mMemory,
1e8464 ¤   ¤   ¤   ¤   ¤   ¤   ¤   tempPassphrase);
1f7cf8 ¤   ¤   ¤   ¤   ¤   PGPFreeData(tempPassphrase);
ae0048 ¤   ¤   ¤   ¤   ¤   tempPassphrase = nil;
2bb5fc ¤   ¤   ¤   ¤   } else {
--89c5 000443b79e340120161 Page 14 of CPGPEncoderDecoder.cp
6a085b ¤   ¤   ¤   ¤   ¤   // Get passphrase
6ba8a0 ¤   ¤   ¤   ¤   ¤   if (! sDecryptPassphraseCache->GetPassphraseOrPasskey(
bf213c ¤   ¤   ¤   ¤   ¤   ¤   inEventP->data.passphraseData.keyset,
0cde82 ¤   ¤   ¤   ¤   ¤   ¤   passbuffer.mMemory, &usePassphrase, &passkeySize,
e1dad4 ¤   ¤   ¤   ¤   ¤   ¤   &keyRef)) {
ecbecb ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   newKeys = kInvalidPGPKeySetRef;
3b94aa ¤   ¤   ¤   ¤   ¤   ¤
5ce680 ¤   ¤   ¤   ¤   ¤   ¤   usePassphrase = true;
48b8ab ¤   ¤   ¤   ¤   ¤   ¤   result = PGPClientDecryptionPassphraseDialog(
be2586 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inContext,
6eb30d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sTLSContext,
1a8d77 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
d94b2b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sRecipientKeySet,
31232c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sKeyIDList,
88534c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sKeyIDCount,
81897b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPOptionListRef,
071c72 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &tempPassphrase,
665742 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyRef,
6fa3f6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &newKeys);
864686 ¤   ¤   ¤   ¤   ¤   ¤   if (result != kPGPError_KeyUnusableForDecryption) {
65b601 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(result);
531829 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (PGPKeySetRefIsValid(newKeys)) {
42a76f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (! sAllocated) {
dae10d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sSection++;
d99865 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Unlock long enough to grow the handle
fd29ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::HUnlock((Handle) decodeSectionH);
93cac9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::SetHandleSize(
cf926f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Handle) decodeSectionH,
938246 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (sSection + 1) * sizeof(
833e33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SDecodeSection));
5a81ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::HLock((Handle) decodeSectionH);
a0f644 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].buf = nil;
37cb6d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet =
003877 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPKeySetRef;
874a55 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].sigDataValid =
c0c8a0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false;
2dabd1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].encrypted =
c4c8a0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false;
11dec6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sAllocated = true;
2f6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
99f1b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (PGPKeySetRefIsValid(
996b8b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet)) {
df9ccb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   result = PGPAddKeys(
36a4fa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].
60f492 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   addKeysSet,
30124c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeys);
67b1d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(result);
37f593 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   result = PGPCommitKeyRingChanges(
a0124c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeys);
8ab1d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(result);
776923 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet((*decodeSectionH)[sSection].
171d5d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   addKeysSet);
406560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
bae42e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet =·
5535a6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeys;
135268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
dd9215 ¤   ¤   ¤   ¤   ¤   ¤   ¤   strcpy(¤(char *) passbuffer.mMemory,
c585e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tempPassphrase);
be40d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeData(tempPassphrase);
1476b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   tempPassphrase = nil;
e93af7 ¤   ¤   ¤   ¤   ¤   ¤   } else {
496e24 ¤   ¤   ¤   ¤   ¤   ¤   ¤   usePassphrase = false;
3e517a ¤   ¤   ¤   ¤   ¤   ¤   ¤   result = PGPReconstitutionDialog(
1a7998 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyRef,
cc6a6e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ((SDecodeData *) inUserValue)->defaultKeys,
7f7a7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPtlsContextRef,
7c4802 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPByte **) &tempPassphrase,
9d3663 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passkeySize);
b5b601 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(result);
3623f7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpCopyMemory(¤ tempPassphrase,
a998df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passbuffer.mMemory,
44705a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passkeySize);
--f377 0003577646d40120161 Page 15 of CPGPEncoderDecoder.cp
3040d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeData(tempPassphrase);
8876b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   tempPassphrase = nil;
4cdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
5e1ebb ¤   ¤   ¤   ¤   ¤   ¤   SetPassbufferCache(¤false,
1d7fef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyRef,
687923 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   usePassphrase,
6698df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passbuffer.mMemory,
b4705a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passkeySize);
6e1c89 ¤   ¤   ¤   ¤   ¤   }
e12613 ¤   ¤   ¤   ¤   }
4cae30 ¤   ¤   ¤   ¤   ¤
47a127 ¤   ¤   ¤   ¤   // Add the passphrase to the job
d9de8c ¤   ¤   ¤   ¤   result = PGPAddJobOptions(
786d7b ¤   ¤   ¤   ¤   ¤   ¤   ¤   inEventP->job,
48d93c ¤   ¤   ¤   ¤   ¤   ¤   ¤   (usePassphrase) ?
7b632c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( inContext,
7e6e59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (char *) passbuffer.mMemory) :
ce7498 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer(¤ inContext,
c6ebc6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passbuffer.mMemory,
90f6da ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passkeySize),
6c3b1e ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
e8ee0c ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(result);
eca3a6 ¤   ¤   ¤   }
f3cdcb ¤   ¤   ¤   break;
3587c7 ¤   ¤   ¤
6887c7 ¤   ¤   ¤
68cb4f ¤   ¤   ¤   case kPGPEvent_SignatureEvent:
adf776 ¤   ¤   ¤   {
60644d ¤   ¤   ¤   ¤   if (! sAllocated) {
b23f92 ¤   ¤   ¤   ¤   ¤   sSection++;
a252a5 ¤   ¤   ¤   ¤   ¤   // Unlock long enough to grow the handle
7f11ff ¤   ¤   ¤   ¤   ¤   ::HUnlock((Handle) decodeSectionH);
e50ca8 ¤   ¤   ¤   ¤   ¤   ::SetHandleSize(¤   (Handle) decodeSectionH,
1b5752 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (sSection + 1)
2ab1a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   * sizeof(SDecodeSection));
5bc9a0 ¤   ¤   ¤   ¤   ¤   ::HLock((Handle) decodeSectionH);
e2b87d ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].buf = nil;
2f01ad ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet =
2e383f ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPKeySetRef;
5a849d ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].sigDataValid = false;
6b4116 ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].encrypted = false;
a38887 ¤   ¤   ¤   ¤   ¤   sAllocated = true;
652613 ¤   ¤   ¤   ¤   }
91af5a
7fc899 ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   addedKeySetToJob;
a53eed ¤   ¤   ¤   ¤   PGPKeySetRef¤   newKeySet;
e32b85 ¤   ¤   ¤   ¤
b9399c ¤   ¤   ¤   ¤   result = PGPSignerKeyLookup(¤   inContext,
2c7674 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inEventP,
2049d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPKeySetRef,
dc3971 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &addedKeySetToJob,
1d70fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &newKeySet);
0cee0c ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(result);
db5a67 ¤   ¤   ¤   ¤   if (addedKeySetToJob) {
643935 ¤   ¤   ¤   ¤   ¤   if (PGPKeySetRefIsValid((*decodeSectionH)[sSection].
c98ef9 ¤   ¤   ¤   ¤   ¤   addKeysSet)) {
a2f27e ¤   ¤   ¤   ¤   ¤   ¤   result = PGPAddKeys(
53e58b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet,
3216dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newKeySet);
c9a726 ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(result);
94a858 ¤   ¤   ¤   ¤   ¤   ¤   result = PGPCommitKeyRingChanges(newKeySet);
c9a726 ¤   ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(result);
fa0fa9 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet((*decodeSectionH)[sSection].addKeysSet);
451c89 ¤   ¤   ¤   ¤   ¤   }
463f09 ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet = newKeySet;
1cb5fc ¤   ¤   ¤   ¤   } else {
48ba7d ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].sigData = inEventP->
f58be6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   data.signatureData;
907683 ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].sigDataValid = true;
c62613 ¤   ¤   ¤   ¤   }
35a3a6 ¤   ¤   ¤   }
35cdcb ¤   ¤   ¤   break;
--73c2 0004124093e40120161 Page 16 of CPGPEncoderDecoder.cp
e587c7 ¤   ¤   ¤
7f87c7 ¤   ¤   ¤
4ea226 ¤   ¤   ¤   case kPGPEvent_OutputEvent:
a5f776 ¤   ¤   ¤   {
c4644d ¤   ¤   ¤   ¤   if (! sAllocated) {
b83f92 ¤   ¤   ¤   ¤   ¤   sSection++;
b652a5 ¤   ¤   ¤   ¤   ¤   // Unlock long enough to grow the handle
3011ff ¤   ¤   ¤   ¤   ¤   ::HUnlock((Handle) decodeSectionH);
c90ca8 ¤   ¤   ¤   ¤   ¤   ::SetHandleSize(¤   (Handle) decodeSectionH,
c75752 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (sSection + 1)
28b1a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   * sizeof(SDecodeSection));
32c9a0 ¤   ¤   ¤   ¤   ¤   ::HLock((Handle) decodeSectionH);
35b87d ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].buf = nil;
1801ad ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet =
0e383f ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPKeySetRef;
10849d ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].sigDataValid = false;
4a4116 ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].encrypted = false;
5e8887 ¤   ¤   ¤   ¤   ¤   sAllocated = true;
b72613 ¤   ¤   ¤   ¤   }
f64145 ¤   ¤   ¤   ¤   if (inEventP->data.outputData.forYourEyesOnly) {
b71745 ¤   ¤   ¤   ¤   ¤   ((SDecodeData *) inUserValue)->FYEO = true;
a42613 ¤   ¤   ¤   ¤   }
39cfa6 ¤   ¤   ¤   ¤   result = PGPAddJobOptions(¤ inEventP->job,
c94199 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOAllocatedOutputBuffer(
8f339a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inContext,
bf4481 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &(*decodeSectionH)[sSection].
4e95a8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   buf,
f3ac29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   MAX_PGPSize,
144481 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &(*decodeSectionH)[sSection].
f91e71 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   size),
2a034c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(inContext));
5da3a6 ¤   ¤   ¤   }
43cdcb ¤   ¤   ¤   break;
f687c7 ¤   ¤   ¤
9d87c7 ¤   ¤   ¤
ee2096 ¤   ¤   ¤   case kPGPEvent_KeyFoundEvent:
00f776 ¤   ¤   ¤   {
99644d ¤   ¤   ¤   ¤   if (! sAllocated) {
e53f92 ¤   ¤   ¤   ¤   ¤   sSection++;
e952a5 ¤   ¤   ¤   ¤   ¤   // Unlock long enough to grow the handle
b711ff ¤   ¤   ¤   ¤   ¤   ::HUnlock((Handle) decodeSectionH);
b40ca8 ¤   ¤   ¤   ¤   ¤   ::SetHandleSize(¤   (Handle) decodeSectionH,
4cde20 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (sSection + 1) * sizeof(SDecodeSection)¶
756275 );
9bc9a0 ¤   ¤   ¤   ¤   ¤   ::HLock((Handle) decodeSectionH);
28b87d ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].buf = nil;
5301ad ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet =
1e383f ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPKeySetRef;
ff849d ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].sigDataValid = false;
474116 ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].encrypted = false;
998887 ¤   ¤   ¤   ¤   ¤   sAllocated = true;
a02613 ¤   ¤   ¤   ¤   }
11af5a
ad99b9 ¤   ¤   ¤   ¤   if (PGPKeySetRefIsValid(
1e25b2 ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet)) {
73f4c6 ¤   ¤   ¤   ¤   ¤   result = PGPAddKeys(
57c9df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inEventP->data.keyFoundData.keySet,
659e79 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet);
d27f94 ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(result);
c7bdde ¤   ¤   ¤   ¤   ¤   result = PGPCommitKeyRingChanges(
de9e79 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet);
5e7f94 ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(result);
65b5fc ¤   ¤   ¤   ¤   } else {
07bbde ¤   ¤   ¤   ¤   ¤   result = PGPIncKeySetRefCount(
33172e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inEventP->data.keyFoundData.keySet);
d07f94 ¤   ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(result);
c10b61 ¤   ¤   ¤   ¤   ¤   (*decodeSectionH)[sSection].addKeysSet = inEventP->
460475 ¤   ¤   ¤   ¤   ¤   ¤   data.keyFoundData.keySet;
b52613 ¤   ¤   ¤   ¤   }
4fa3a6 ¤   ¤   ¤   }
f6cdcb ¤   ¤   ¤   break;
410fe4 ¤   ¤   }
--e2b4 001a96f556140120161 Page 17 of CPGPEncoderDecoder.cp
a19371 ¤   }
9967c5 ¤
dae0a3 ¤   catch (...) {
3521b0 ¤   ¤   sAllocated = false;
9a35a5 ¤   ¤   if (tempPassphrase != nil) {
b228dd ¤   ¤   ¤   PGPFreeData(tempPassphrase);
bb0fe4 ¤   ¤   }
71bb91 ¤   ¤   if (PGPKeySetRefIsValid(sRecipientKeySet)) {
477aed ¤   ¤   ¤   PGPFreeKeySet(sRecipientKeySet);
150c19 ¤   ¤   ¤   sRecipientKeySet = kInvalidPGPKeySetRef;
be0fe4 ¤   ¤   }
ab2653 ¤   ¤   if (IsntNull(sKeyIDList)) {
f24d4b ¤   ¤   ¤   delete[] sKeyIDList;
7ea4b3 ¤   ¤   ¤   sKeyIDList = nil;
370fe4 ¤   ¤   }
9b9371 ¤   }
f567c5 ¤
2d5d73 ¤   return result;
a9efe6 }
--14bb 000719f898040120162 Page 1 of CPGPEncoderDecoder.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
4a8c50 ¤   $Id: CPGPEncoderDecoder.h,v 1.22.2.1.2.1 1998/11/12 03:10:04 heller Exp $
18f7f7 ____________________________________________________________________________*/
5eaf5a
b78d55 #pragma once·
64af5a
48af5a
01b6e8 #include "PGPclientLib.h"
f06ce9 #include "MacCursors.h"
140bb4 #include "CString.h"
88e3f9 #include "PGPEncode.h"
dbe001 #include "PassphraseCache.h"
ffaf5a
44af5a
2f5e25 typedef struct SDecodeSection {
027a17 ¤   void *¤ ¤   ¤   ¤   ¤   buf;
394e1c ¤   PGPSize¤¤   ¤   ¤   ¤   size;
862b77 ¤   PGPKeySetRef¤   ¤   ¤   addKeysSet;
93de58 ¤   PGPEventSignatureData¤  sigData;
227ab0 ¤   Boolean¤¤   ¤   ¤   ¤   sigDataValid;
7a5e46 ¤   Boolean¤¤   ¤   ¤   ¤   encrypted;
ed6d4e } **SDecodeSectionHandle;
51af5a
1e73f4 enum {
11d588 ¤   encodeOptions_Encrypt¤  ¤   ¤   = (1L << 0),
d7e838 ¤   encodeOptions_Sign¤ ¤   ¤   ¤   = (1L << 1),
8ee7ee ¤   encodeOptions_TextOutput¤   ¤   = (1L << 2),
a0e714 ¤   encodeOptions_TreatInputAsText¤ = (1L << 3),
7b45c2 ¤   encodeOptions_ClearSign¤¤   ¤   = (1L << 4),
79794e ¤   encodeOptions_ConvEncrypt¤  ¤   = (1L << 5)
7782f7 };
42af5a
4ea338 typedef OptionBits¤ EEncodeOptions;
cdaf5a
f6af5a
184b55 class CPGPEncoderDecoder {
785ed4 public:
9f6523 ¤   static void¤¤   ¤   ¤   ¤   ¤   Init(PGPContextRef inContext);
dde3c9 ¤   static void¤¤   ¤   ¤   ¤   ¤   Cleanup();
7567c5 ¤
873361 ¤   static Boolean¤ ¤   ¤   ¤   ¤   EncodeHandle(PGPContextRef inContext,
7dfd93 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Handle ioDataH,
3ec373 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EEncodeOptions inOptions,
49ef35 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 inNumRecipients = 0,
763c0e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPRecipientSpec *
882e8a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inRecipientList¤= nil,
a049d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inUseCache = false);
6ea5f4 ¤   static Boolean¤ ¤   ¤   ¤   ¤   DecodeHandle(PGPContextRef inContext,
927c2c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Handle inDataH,
0ac0ac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef inKeySet,
a17476 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SDecodeSectionHandle &
201a6e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outDecodeSectionsHandle,
76b159 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean * outFYEO,
b949d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inUseCache = false);
00da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
cafce6 ¤   static void¤¤   ¤   ¤   ¤   ¤   FreeDecodeSection(
8b64e4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SDecodeSection * inSection);
8e67c5 ¤
cea2d3 protected:
2bc0c8 ¤   static Boolean¤ ¤   ¤   ¤   ¤   sCheckForMissingKeys;
b0ffa1 ¤   static CSignPassphraseCache *¤  sSigningPassphraseCache;
96d89d ¤   static CSignPassphraseCache *¤  sDecryptPassphraseCache;
07498a ¤   static PGPtlsContextRef¤¤   ¤   sTLSContext;
1867c5 ¤
44da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
0e0f01 ¤   static PGPOptionListRef¤¤   ¤   CreateOptionList(
71ed7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPContextRef inContext,
--7abd 0014469cf6540120162 Page 2 of CPGPEncoderDecoder.h
96c373 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EEncodeOptions inOptions,
493418 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef inRecipients,
c5fb43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef inSigningKey,
c5d63c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   char * inConvEncryptPassphrase,
686931 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void * inPassBuffer,
46868d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize inPassKeySize,
c74098 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inUsePassphrase);
b94825 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
ab7df0 ¤   static void¤¤   ¤   ¤   ¤   ¤   SetPassbufferCache(
b09d06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inSigning,
f673bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef inKey,
695411 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean inUsePassphrase,
c3fb0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void * inBuffer,
c2ca43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize inPasskeySize);
78af5a
582cb6 ¤   static void¤¤   ¤   ¤   ¤   ¤   ShowError(PGPError inErr);
c967c5 ¤
7547f9 ¤   static PGPError¤¤   ¤   ¤   ¤   PGPEncodeEventHandler(
8aed7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPContextRef inContext,
e30777 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent * inEventP,
9398be ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue inUserValue)
262891 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { (void) inContext; (void) inEventP;
5d1d46 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··AnimateCursor((AnimatedCursorRef)
88c317 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inUserValue);
eb8450 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··return kPGPError_NoErr; }
bf9f69 ¤   static PGPError¤¤   ¤   ¤   ¤   PGPDecodeEventHandler(
a0ed7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPContextRef inContext,
0f0777 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent * inEventP,
985c4d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue inUserValue);
1682f7 };
48af5a
6d0264 const ResIDT¤   acur_BeachBall¤ ¤   ¤   ¤   ¤   ¤   =¤  12121;
44af5a
--9ad6 0010b3264b740120163 Page 1 of CPanel.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
9edad1 ¤   $Id: CPanel.cp,v 1.2.8.1 1998/11/12 03:10:05 heller Exp $
98f7f7 ____________________________________________________________________________*/
0aaf5a
412f94 #include <LCommander.h>
78af5a
9cfca7 #include "CPanel.h"
7daf5a
67af5a
80af5a
9f122d CPanel::CPanel(
5dcbb0 ¤   LStream *¤  inStream)
e5f03a ¤   ¤   : LView(inStream), mPanelTarget(nil)
17bb36 {
1fefe6 }
8daf5a
e9af5a
d0af5a
5a8215 CPanel::~CPanel()
b3bb36 {
d4efe6 }
5aaf5a
f0af5a
eeaf5a
b66d52 ¤   void
3977c4 CPanel::Show()
cebb36 {
479d20 ¤   LView::Show();
031291 ¤   if (mPanelTarget != nil) {
3332c0 ¤   ¤   LCommander::SwitchTarget(mPanelTarget);
c99371 ¤   }
c1efe6 }
cbaf5a
85af5a
70af5a
726d52 ¤   void
c20d9f CPanel::Hide()
33bb36 {
ad803a ¤   mPanelTarget = LCommander::GetTarget();
d8710c ¤   LView::Hide();
0befe6 }
--d947 0014e4a27a640120164 Page 1 of CPanel.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
ec57b8 ¤   $Id: CPanel.h,v 1.2.8.1 1998/11/12 03:10:05 heller Exp $
11f7f7 ____________________________________________________________________________*/
14af5a
e28d55 #pragma once·
8baf5a
3f2c73 #include <LView.h>
89af5a
30af5a
b45528 class LCommander;
a5af5a
d2af5a
023df2 class CPanel¤   :¤  public LView {
7a5ed4 public:
10bfe2 ¤   enum¤   ¤   ¤   ¤   ¤   { class_ID = 'CPnl' };
a1af5a
7b0df7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPanel(LStream * inStream);
356929 ¤   virtual¤¤   ¤   ¤   ¤   ~CPanel();
4faf5a
8b06d9 ¤   virtual void¤   ¤   ¤   Show();
cdeaf5 ¤   virtual void¤   ¤   ¤   Hide();
7567c5 ¤
c0ff0f ¤   virtual LCommander *¤   GetPanelTarget() { return mPanelTarget; }
50f8b5 ¤   virtual void¤   ¤   ¤   SetPanelTarget(LCommander * inTarget)
809ed0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { mPanelTarget = inTarget; }
d067c5 ¤
fda2d3 protected:
efbc70 ¤   LCommander *¤   ¤   ¤   mPanelTarget;
4ebf26 };¶
--836f 000341ee73440120165 Page 1 of CPassphraseCache.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
041746 ¤   $Id: CPassphraseCache.cp,v 1.3.18.1 1998/11/12 03:10:06 heller Exp $
a8f7f7 ____________________________________________________________________________*/
41af5a
ad0d08 #include "pgpMem.h"
ef1b4c #include "CPassphraseCache.h"
91af5a
0faf5a
b5af5a
6c0335 /*____________________________________________________________________________
dfaf5a
b40771 ¤   Function Name:¤ ¤   CPassphraseCache::CPassphraseCache
6af7f7 ____________________________________________________________________________*/
3f766f CPassphraseCache::CPassphraseCache()
0cf23e ¤   : mCache(nil), mCount(0), mKeySet(kPGPInvalidRef)
30bb36 {
a9efe6 }
47af5a
74af5a
5caf5a
160335 /*____________________________________________________________________________
d2af5a
70c698 ¤   Function Name:¤ ¤   CPassphraseCache::~CPassphraseCache
c4f7f7 ____________________________________________________________________________*/
5141ae CPassphraseCache::~CPassphraseCache()
4bbb36 {
019730 ¤   if (mKeySet != kPGPInvalidRef) {
b88075 ¤   ¤   PGPFreeKeySet(mKeySet);
b69371 ¤   }
e5646a ¤   if (mCache != nil) {
a35ecf ¤   ¤   WipeCache();
f17b92 ¤   ¤   ::DisposePtr((Ptr) mCache);
099371 ¤   }
a0efe6 }
c667c5 ¤
52af5a
76af5a
660335 /*____________________________________________________________________________
2eaf5a
1f5a0a ¤   Function Name:¤ ¤   CPassphraseCache::AddOrUpdateItem
aff7f7 ____________________________________________________________________________*/
be314a void
540637 CPassphraseCache::AddOrUpdateItem(
aa8777 ¤   UInt32¤ ¤   ¤   inTickCount,
1d9d7a ¤   PGPKeyRef¤  ¤   inKey,
a02525 ¤   const char *¤   inPassphrase)
8fbb36 {
f8fb3a ¤   SPassphraseCacheItem *¤ newCache = nil;
cd08b8 ¤   PGPKeySetRef¤   ¤   ¤   keySet = kPGPInvalidRef;
8b67c5 ¤
745168 ¤   try {
1b018a ¤   ¤   PGPError¤   pgpErr;
e71b52 ¤   ¤
630c17 ¤   ¤   SPassphraseCacheItem *¤ theItemP;
761b52 ¤   ¤
cc5c32 ¤   ¤   theItemP = FindItem(inKey);
3b8ae0 ¤   ¤   if (theItemP != nil) {
23f71a ¤   ¤   ¤   theItemP->tickCount = inTickCount;
365061 ¤   ¤   ¤   theItemP->passphrase->Assign(inPassphrase);
2745a6 ¤   ¤   } else {
412dd6 ¤   ¤   ¤   // Set the new item
59d7cb ¤   ¤   ¤   newCache = (SPassphraseCacheItem *) ::NewPtr((mCount + 1) *
34f564 ¤   ¤   ¤   ¤   ¤   ¤   sizeof(SPassphraseCacheItem));
679e76 ¤   ¤   ¤   PGPThrowIfMemFail_(newCache);
ebfe5e ¤   ¤   ¤   newCache[mCount].tickCount = inTickCount;
3a7534 ¤   ¤   ¤   newCache[mCount].passphrase = new CString(inPassphrase);
343400 ¤   ¤   ¤   PGPThrowIfNil_(newCache[mCount].passphrase);


--2a78 00043d3144840120165 Page 2 of CPassphraseCache.cp
e587c7 ¤   ¤   ¤
402959 ¤   ¤   ¤   // Add the key to the keyset
ceaa00 ¤   ¤   ¤   pgpErr = PGPNewSingletonKeySet(inKey, &keySet);
5b8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
829457 ¤   ¤   ¤   if (mKeySet == kPGPInvalidRef) {
e3a29a ¤   ¤   ¤   ¤   pgpErr = PGPNewKeySet(PGPGetKeyContext(inKey), &mKeySet);
238f45 ¤   ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
2da3a6 ¤   ¤   ¤   }
bfad33 ¤   ¤   ¤   pgpErr = PGPAddKeys(keySet, mKeySet);
588109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
f5f264 ¤   ¤   ¤   pgpErr = PGPCommitKeyRingChanges(mKeySet);
c98109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
f33dcd ¤   ¤   ¤   newCache[mCount].key = FindKeyInOtherKeySet(inKey, mKeySet);
86f151 ¤   ¤   ¤   PGPThrowIf_(newCache[mCount].key == kPGPInvalidRef);
f887c7 ¤   ¤   ¤
66fb4a ¤   ¤   ¤   // Copy the old data to the new cache
f3eb61 ¤   ¤   ¤   if (mCache != nil) {
f2e468 ¤   ¤   ¤   ¤   ::BlockMoveData(¤   mCache,
03be54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newCache,
af4d3f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::GetPtrSize((Ptr) mCache));
87db43 ¤   ¤   ¤   ¤   WipeCache();
2136a1 ¤   ¤   ¤   ¤   ::DisposePtr((Ptr) mCache);
30a3a6 ¤   ¤   ¤   }
d5b672 ¤   ¤   ¤   mCount++;
87f61e ¤   ¤   ¤   mCache = newCache;
f6d813 ¤   ¤   ¤   newCache = nil;
b20fe4 ¤   ¤   }
099371 ¤   }
af67c5 ¤
87e0a3 ¤   catch (...) {
649371 ¤   }
4a67c5 ¤
d8870b ¤   if (newCache != nil) {
c349e8 ¤   ¤   ::DisposePtr((Ptr) newCache);
d09371 ¤   }
2bbffa ¤   if (keySet != kPGPInvalidRef) {
bd1df5 ¤   ¤   PGPFreeKeySet(keySet);
729371 ¤   }
90efe6 }
d2af5a
24af5a
53af5a
0c0335 /*____________________________________________________________________________
35af5a
cbeefd ¤   Function Name:¤ ¤   CPassphraseCache::RemoveItem
cbf7f7 ____________________________________________________________________________*/
8f314a void
e6b589 CPassphraseCache::RemoveItem(
27611a ¤   PGPKeyRef¤  inKey)
4ebb36 {
91761c ¤   SInt32¤ ¤   ¤   index;
129293 ¤   PGPKeySetRef¤   keySet = kPGPInvalidRef;
da03e8 ¤   PGPError¤   ¤   pgpErr;
fc67c5 ¤
d35168 ¤   try {
14a85f ¤   ¤   index = FindItemIndex(inKey);
ac4a96 ¤   ¤   if (index != -1) {
fba414 ¤   ¤   ¤   delete mCache[index].passphrase;
2ad1de ¤   ¤   ¤   pgpErr = PGPNewSingletonKeySet(mCache[index].key, &keySet);
138109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
4677f3 ¤   ¤   ¤   pgpErr = PGPRemoveKeys(keySet, mKeySet);
fd8109 ¤   ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
7287c7 ¤   ¤   ¤
c4a184 ¤   ¤   ¤   ::BlockMoveData(¤   &mCache[index + 1],
9ff936 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mCache[index],
4810d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (mCount - index - 1) *
a67f41 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(SPassphraseCacheItem));
551845 ¤   ¤   ¤   pgpClearMemory( &mCache[mCount - 1], sizeof(SPassphraseCacheItem));
d12b31 ¤   ¤   ¤   mCount--;
8d128f ¤   ¤   ¤   ::SetPtrSize((Ptr) mCache, mCount * sizeof(SPassphraseCacheItem));
ef0fe4 ¤   ¤   }
439371 ¤   }



--f238 00023ce62e340120165 Page 3 of CPassphraseCache.cp
2a67c5 ¤
b9e0a3 ¤   catch (...) {
c79371 ¤   }
1167c5 ¤
9abffa ¤   if (keySet != kPGPInvalidRef) {
661df5 ¤   ¤   PGPFreeKeySet(keySet);
779371 ¤   }
deefe6 }
a4af5a
8caf5a
ed67c5 ¤
290335 /*____________________________________________________________________________
e5af5a
02e8bc ¤   Function Name:¤ ¤   CPassphraseCache::FindItem
d7f7f7 ____________________________________________________________________________*/
808998 SPassphraseCacheItem *
48d1af CPassphraseCache::FindItem(
d3611a ¤   PGPKeyRef¤  inKey)
e5bb36 {
f7d924 ¤   SPassphraseCacheItem *¤ result = nil;
2a81c0 ¤   SInt32¤ ¤   ¤   ¤   ¤   index;
4d67c5 ¤
95472c ¤   index = FindItemIndex(inKey);
73a877 ¤   if (index != -1) {
7415d1 ¤   ¤   result = &mCache[index];
1b9371 ¤   }
7c67c5 ¤
cf5d73 ¤   return result;
88efe6 }
0267c5 ¤
ccaf5a
8baf5a
c50335 /*____________________________________________________________________________
19af5a
52ad82 ¤   Function Name:¤ ¤   CPassphraseCache::ClearCache
e6f7f7 ____________________________________________________________________________*/
ed314a void
86bcee CPassphraseCache::ClearCache()
f2bb36 {
74646a ¤   if (mCache != nil) {
36d516 ¤   ¤   for (SInt32 i = 0; i < mCount; i++) {
e8d6a6 ¤   ¤   ¤   delete mCache[i].passphrase;
530fe4 ¤   ¤   }
999371 ¤   }
389730 ¤   if (mKeySet != kPGPInvalidRef) {
260ff2 ¤   ¤   PGPContextRef¤  context = PGPGetKeySetContext(mKeySet);
e867c5 ¤
538075 ¤   ¤   PGPFreeKeySet(mKeySet);
8219b8 ¤   ¤   PGPNewKeySet(context, &mKeySet);
219371 ¤   }
d61f44 ¤   WipeCache();
215783 ¤   mCount = 0;
92efe6 }
70af5a
78af5a
b9af5a
e70335 /*____________________________________________________________________________
e7af5a
82f520 ¤   Function Name:¤ ¤   CPassphraseCache::WipeCache
77f7f7 ____________________________________________________________________________*/
d8314a void
d74837 CPassphraseCache::WipeCache()
acbb36 {
28646a ¤   if (mCache != nil) {
5e46c0 ¤   ¤   pgpClearMemory(mCache, ::GetPtrSize((Ptr) mCache));
dc9371 ¤   }
c9efe6 }
74af5a
25af5a
3baf5a
170335 /*____________________________________________________________________________
23af5a
--2c67 0019100c13340120165 Page 4 of CPassphraseCache.cp
e9f0e7 ¤   Function Name:¤ ¤   CPassphraseCache::FindItemIndex
eff7f7 ____________________________________________________________________________*/
195623 SInt32
45b715 CPassphraseCache::FindItemIndex(
27611a ¤   PGPKeyRef¤  inKey)
44bb36 {
e8fe54 ¤   SInt32¤ result = -1;
de67c5 ¤
4a646a ¤   if (mCache != nil) {
0fd516 ¤   ¤   for (SInt32 i = 0; i < mCount; i++) {
a17a50 ¤   ¤   ¤   if (PGPCompareKeys(inKey, mCache[i].key, kPGPKeyIDOrdering) == 0) {
9dd945 ¤   ¤   ¤   ¤   result = i;
18f622 ¤   ¤   ¤   ¤   break;
8aa3a6 ¤   ¤   ¤   }
940fe4 ¤   ¤   }
2a9371 ¤   }
6367c5 ¤
505d73 ¤   return result;
faefe6 }
42af5a
b2af5a
23af5a
c80335 /*____________________________________________________________________________
a2af5a
f2e52e ¤   Function Name:¤ ¤   CPassphraseCache::FindKeyInOtherKeySet
36f7f7 ____________________________________________________________________________*/
279a4b PGPKeyRef
a9b525 CPassphraseCache::FindKeyInOtherKeySet(
259d7a ¤   PGPKeyRef¤  ¤   inKey,
6c68f9 ¤   PGPKeySetRef¤   inKeySet)
90bb36 {
fdc677 ¤   PGPKeyRef¤  ¤   result = kPGPInvalidRef;
00cea1 ¤   PGPKeyListRef¤  keyList = kPGPInvalidRef;
c01b3a ¤   PGPKeyIterRef¤  keyIter = kPGPInvalidRef;
fa03e8 ¤   PGPError¤   ¤   pgpErr;
3c67c5 ¤
ad5168 ¤   try {
325f07 ¤   ¤   pgpErr = PGPOrderKeySet(¤   inKeySet,
c015b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPAnyOrdering,
d93a97 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyList);
cdc0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
16fbdb ¤   ¤   pgpErr = PGPNewKeyIter(¤keyList,
f9e881 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyIter);
d4c0fa ¤   ¤   PGPThrowIfPGPErr_(pgpErr);
9ef15f ¤   ¤   while ((PGPKeyIterNext(keyIter, &result) == kPGPError_NoErr)
ad0443 ¤   ¤   && (result != kPGPInvalidRef)) {
77fd78 ¤   ¤   ¤   if (PGPCompareKeys(inKey, result, kPGPKeyIDOrdering) == 0) {
acf622 ¤   ¤   ¤   ¤   break;
aea3a6 ¤   ¤   ¤   }
fb0fe4 ¤   ¤   }
f89371 ¤   }
a567c5 ¤
b5e0a3 ¤   catch (...) {
169371 ¤   }
bf67c5 ¤
5dc84a ¤   if (keyIter != kPGPInvalidRef) {
e010bc ¤   ¤   PGPFreeKeyIter(keyIter);
b19371 ¤   }
373a8f ¤   if (keyList != kPGPInvalidRef) {
48c7b5 ¤   ¤   PGPFreeKeyList(keyList);
5f9371 ¤   }
a167c5 ¤
005d73 ¤   return result;
91be43 }¶
--946e 001b794ad9a40120166 Page 1 of CPassphraseCache.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
c619b8 ¤   $Id: CPassphraseCache.h,v 1.2.18.1 1998/11/12 03:10:07 heller Exp $
23f7f7 ____________________________________________________________________________*/
d1af5a
4d8d55 #pragma once·
deaf5a
911970 #include "PGPKeys.h"
5f0bb4 #include "CString.h"
53af5a
f3af5a
54af5a
fa3aa0 struct SPassphraseCacheItem {
3b9a41 ¤   UInt32¤ ¤   ¤   tickCount;
451502 ¤   PGPKeyRef¤  ¤   key;
fd285d ¤   CString *¤  ¤   passphrase;
2c82f7 };
aeaf5a
62af5a
f8af5a
7bf815 class CPassphraseCache {
db5ed4 public:
75c2a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPassphraseCache();
62d653 ¤   virtual¤¤   ¤   ¤   ¤   ~CPassphraseCache();
5667c5 ¤
952ddd ¤   void¤   ¤   ¤   ¤   ¤   AddOrUpdateItem(UInt32 inTickCount, PGPKeyRef inKey,
78975d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const char * inPassphrase);
eb2546 ¤   void¤   ¤   ¤   ¤   ¤   RemoveItem(PGPKeyRef inKey);
7bd5f4 ¤   SPassphraseCacheItem *¤ FindItem(PGPKeyRef inKey);
e367c5 ¤
cff36d ¤   void¤   ¤   ¤   ¤   ¤   ClearCache();
80af5a
69a2d3 protected:
6b54d8 ¤   SPassphraseCacheItem *¤ mCache;
b2c050 ¤   SInt32¤ ¤   ¤   ¤   ¤   mCount;
b97d20 ¤   PGPKeySetRef¤   ¤   ¤   mKeySet;
df67c5 ¤
911b0e ¤   void¤   ¤   ¤   ¤   ¤   WipeCache();
6267c5 ¤
a9e551 ¤   SInt32¤ ¤   ¤   ¤   ¤   FindItemIndex(PGPKeyRef inKey);
8267c5 ¤
06a223 ¤   PGPKeyRef¤  ¤   ¤   ¤   FindKeyInOtherKeySet(PGPKeyRef inKey,
e49227 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef inKeySet);
b7bf26 };¶
--abb9 000223ac89240120167 Page 1 of CCloseWindowPatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
3494a1 ¤   $Id: CCloseWindowPatcher.cp,v 1.3.8.1 1998/11/12 03:10:08 heller Exp $
69f7f7 ____________________________________________________________________________*/
3baf5a
0a70b5 #include <SetupA4.h>
aaaf5a
40805d #include "CCloseWindowPatcher.h"
6eaf5a
a7af5a
2aaf5a
c16213 // Define statics
0f8239 CCloseWindowPatcher *¤  CCloseWindowPatcher::sCloseWindowPatcher = nil;
b9af5a
2a898d CCloseWindowPatcher::CCloseWindowPatcher()
aebb36 {
f6c6af ¤   // Current version will only install one patch
9a54bc ¤   if (sCloseWindowPatcher == nil) {
b3a982 ¤   ¤   Patch(_CloseWindow, kProcInfo, (ProcPtr) CloseWindowCallback);
068040 ¤   ¤   sCloseWindowPatcher = this;
ca9371 ¤   }
bbefe6 }
ccaf5a
84af5a
b2af5a
780610 CCloseWindowPatcher::~CCloseWindowPatcher()
d7bb36 {
c4efe6 }
9faf5a
85af5a
03af5a
316d52 ¤   void
21465a CCloseWindowPatcher::NewCloseWindow(
a2f699 ¤   WindowRef¤  ¤   ¤   theWindow)
2dbb36 {
94a582 ¤   // default just calls through to the original
4894d4 ¤   OldCloseWindow(theWindow);
73efe6 }
a7af5a
0aaf5a
e9af5a
ef6d52 ¤   void
3184fb CCloseWindowPatcher::OldCloseWindow(
b5f699 ¤   WindowRef¤  ¤   ¤   theWindow)
67bb36 {
acfdb7 #if TARGET_RT_MAC_CFM
271300 ¤   ::CallUniversalProc(¤   mOldRoutine,
1029f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
94e27b ¤   ¤   ¤   ¤   ¤   ¤   ¤   theWindow);
afdb21 #else
e1fdec ¤   ((CloseWindowProc) mOldRoutine)(theWindow);
397454 #endif
3fefe6 }
4baf5a
41af5a
45af5a
be6685 ¤   pascal void
ee9f5a CCloseWindowPatcher::CloseWindowCallback(
3af699 ¤   WindowRef¤  ¤   ¤   theWindow)
febb36 {
db6aab ¤   EnterCallback();
e2af5a
ec5168 ¤   try {
65fd29 ¤   ¤   sCloseWindowPatcher->NewCloseWindow(theWindow);
989371 ¤   }
c867c5 ¤
837e82 ¤   catch(...) {
229371 ¤   }
--7826 00114cf3e2040120167 Page 2 of CCloseWindowPatcher.cp
2a67c5 ¤
0336ff ¤   ExitCallback();
14efe6 }
--1919 0018adab21840120168 Page 1 of CCloseWindowPatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
60b8e9 ¤   $Id: CCloseWindowPatcher.h,v 1.3.8.1 1998/11/12 03:10:09 heller Exp $
dbf7f7 ____________________________________________________________________________*/
c2af5a
968d55 #pragma once·
e5af5a
e4f973 #include "CPatcher.h"
46af5a
bda634 class CCloseWindowPatcher¤  :¤  public¤ CPatcher {
5a5ed4 public:
54fdb7 #if TARGET_RT_MAC_CFM
f18a7d ¤   enum {kProcInfo =¤  kPascalStackBased
87ad23 ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(WindowRef)))};
d8db21 #else
741858 ¤   enum {kProcInfo = 0};
5891a1 ¤   typedef pascal void¤¤   ¤   ¤   (*CloseWindowProc)(WindowRef theWindow);
587454 #endif
f01b52 ¤   ¤
8a6577 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CCloseWindowPatcher();
6f3df4 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CCloseWindowPatcher();
f0af5a
3ea2d3 protected:
9d9aa6 ¤   static CCloseWindowPatcher *¤   sCloseWindowPatcher;
e667c5 ¤
8ebc15 ¤   virtual void¤   ¤   ¤   ¤   ¤   NewCloseWindow(WindowRef theWindow);
2eaf5a
3324f3 ¤   virtual void¤   ¤   ¤   ¤   ¤   OldCloseWindow(WindowRef theWindow);
e1af5a
44987c ¤   static pascal ·void¤¤   ¤   ¤   CloseWindowCallback(WindowRef theWindow);
8a82f7 };
--5aa8 0013a831ea240120169 Page 1 of CDrawMenuBarPatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
5ba42c ¤   $Id: CDrawMenuBarPatcher.cp,v 1.3.8.1 1998/11/12 03:10:09 heller Exp $
29f7f7 ____________________________________________________________________________*/
0faf5a
c970b5 #include <SetupA4.h>
9daf5a
394db0 #include "CDrawMenuBarPatcher.h"
ceaf5a
70af5a
73af5a
aa6213 // Define statics
7e4d98 CDrawMenuBarPatcher *¤  CDrawMenuBarPatcher::sDrawMenuBarPatcher = nil;
dcaf5a
c4ac01 CDrawMenuBarPatcher::CDrawMenuBarPatcher()
27bb36 {
2ac6af ¤   // Current version will only install one patch
d96ac7 ¤   if (sDrawMenuBarPatcher == nil) {
ff059f ¤   ¤   Patch(_DrawMenuBar, kProcInfo, (ProcPtr) DrawMenuBarCallback);
016784 ¤   ¤   sDrawMenuBarPatcher = this;
349371 ¤   }
56efe6 }
25af5a
37af5a
a0af5a
0c3cc7 CDrawMenuBarPatcher::~CDrawMenuBarPatcher()
b4bb36 {
caefe6 }
c8af5a
abaf5a
21af5a
fe6d52 ¤   void
7ef6b8 CDrawMenuBarPatcher::NewDrawMenuBar()
ccbb36 {
04a582 ¤   // default just calls through to the original
7f0a11 ¤   OldDrawMenuBar();
23efe6 }
85af5a
0caf5a
9baf5a
0c6d52 ¤   void
7d42f9 CDrawMenuBarPatcher::OldDrawMenuBar()
7abb36 {
0ffdb7 #if TARGET_RT_MAC_CFM
571300 ¤   ::CallUniversalProc(¤   mOldRoutine,
9aed29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo);
49db21 #else
e28f82 ¤   ((DrawMenuBarProc) mOldRoutine)();
527454 #endif
a1efe6 }
b4af5a
87af5a
cbaf5a
3f6685 ¤   pascal void
0c0a5b CDrawMenuBarPatcher::DrawMenuBarCallback()
01bb36 {
2c6aab ¤   EnterCallback();
b2af5a
e275aa ¤   try {¤
26f107 ¤   ¤   sDrawMenuBarPatcher->NewDrawMenuBar();
d49371 ¤   }
7b67c5 ¤
2e7e82 ¤   catch(...) {
029371 ¤   }
dc67c5 ¤
4c36ff ¤   ExitCallback();
3aefe6 }
--78c9 001e515db5f4012016a Page 1 of CDrawMenuBarPatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
5f576a ¤   $Id: CDrawMenuBarPatcher.h,v 1.3.8.1 1998/11/12 03:10:10 heller Exp $
4df7f7 ____________________________________________________________________________*/
daaf5a
088d55 #pragma once·
5eaf5a
b3f973 #include "CPatcher.h"
14af5a
e5c9d1 class CDrawMenuBarPatcher¤  :¤  public¤ CPatcher {
005ed4 public:
90fdb7 #if TARGET_RT_MAC_CFM
7e9a63 ¤   enum {kProcInfo =¤  kPascalStackBased};
3fdb21 #else
7a1858 ¤   enum {kProcInfo = 0};
c03c9f ¤   typedef pascal void¤¤   ¤   ¤   (*DrawMenuBarProc)();
cf7454 #endif
e21b52 ¤   ¤
22a89a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CDrawMenuBarPatcher();
2ef019 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CDrawMenuBarPatcher();
18af5a
57a2d3 protected:
3aba16 ¤   static CDrawMenuBarPatcher *¤   sDrawMenuBarPatcher;
d267c5 ¤
a745ad ¤   virtual void¤   ¤   ¤   ¤   ¤   NewDrawMenuBar();
e7af5a
8e480e ¤   virtual void¤   ¤   ¤   ¤   ¤   OldDrawMenuBar();¤
cfaf5a
5e37fc ¤   static pascal void¤ ¤   ¤   ¤   DrawMenuBarCallback();
e582f7 };
--2d9f 0004f9fd7374012016b Page 1 of CEndUpdatePatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
109921 ¤   $Id: CEndUpdatePatcher.cp,v 1.3.8.1 1998/11/12 03:10:11 heller Exp $
f1f7f7 ____________________________________________________________________________*/
1baf5a
e070b5 #include <SetupA4.h>
2aaf5a
007693 #include "CEndUpdatePatcher.h"
bdaf5a
faaf5a
26af5a
166213 // Define statics
cb2e07 CEndUpdatePatcher *¤CEndUpdatePatcher::sEndUpdatePatcher = nil;
81af5a
98480b CEndUpdatePatcher::CEndUpdatePatcher()
38bb36 {
8ac6af ¤   // Current version will only install one patch
a286f6 ¤   if (sEndUpdatePatcher == nil) {
ba9f01 ¤   ¤   Patch(_EndUpDate, kProcInfo, (ProcPtr) EndUpdateCallback);
34e2fd ¤   ¤   sEndUpdatePatcher = this;
5d9371 ¤   }
a7efe6 }
f5af5a
06af5a
fbaf5a
93f631 CEndUpdatePatcher::~CEndUpdatePatcher()
30bb36 {
f7efe6 }
24af5a
b9af5a
50af5a
bd6d52 ¤   void
bbecf0 CEndUpdatePatcher::NewEndUpdate(
58f699 ¤   WindowRef¤  ¤   ¤   theWindow)
7dbb36 {
88a582 ¤   // default just calls through to the original
1e561d ¤   OldEndUpdate(theWindow);
38efe6 }
16af5a
06af5a
f1af5a
6f6d52 ¤   void
7328e9 CEndUpdatePatcher::OldEndUpdate(
79f699 ¤   WindowRef¤  ¤   ¤   theWindow)
7dbb36 {
f2fdb7 #if TARGET_RT_MAC_CFM
991300 ¤   ::CallUniversalProc(¤   mOldRoutine,
ec29f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
07e27b ¤   ¤   ¤   ¤   ¤   ¤   ¤   theWindow);
19db21 #else
39349f ¤   ((EndUpdateProc) mOldRoutine)(theWindow);
727454 #endif
36efe6 }
9daf5a
baaf5a
28af5a
406685 ¤   pascal void
7a9df8 CEndUpdatePatcher::EndUpdateCallback(
ddf699 ¤   WindowRef¤  ¤   ¤   theWindow)
aabb36 {
996aab ¤   EnterCallback();
b667c5 ¤
d1af5a
aa5168 ¤   try {
3b9783 ¤   ¤   sEndUpdatePatcher->NewEndUpdate(theWindow);
be9371 ¤   }
df67c5 ¤
4f7e82 ¤   catch(...) {
--4bf5 001ac31eb224012016b Page 2 of CEndUpdatePatcher.cp
a19371 ¤   }
9967c5 ¤
1a36ff ¤   ExitCallback();
acefe6 }
--f307 001119de9ab4012016c Page 1 of CEndUpdatePatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
c056f5 ¤   $Id: CEndUpdatePatcher.h,v 1.3.8.1 1998/11/12 03:10:11 heller Exp $
a3f7f7 ____________________________________________________________________________*/
95af5a
868d55 #pragma once·
0faf5a
bdf973 #include "CPatcher.h"
29af5a
e5d0c4 class CEndUpdatePatcher¤:¤  public¤ CPatcher {
735ed4 public:
14fdb7 #if TARGET_RT_MAC_CFM
d88a7d ¤   enum {kProcInfo =¤  kPascalStackBased
2fad23 ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(WindowRef)))};
9fdb21 #else
4c1858 ¤   enum {kProcInfo = 0};
0f2dfb ¤   typedef pascal void¤¤   ¤   (*EndUpdateProc)(WindowRef theWindow);
617454 #endif
a21b52 ¤   ¤
6b4d0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CEndUpdatePatcher();
b1121f ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CEndUpdatePatcher();
70af5a
26a2d3 protected:
28d42e ¤   static CEndUpdatePatcher *¤ sEndUpdatePatcher;
d467c5 ¤
be4590 ¤   virtual void¤   ¤   ¤   ¤   NewEndUpdate(WindowRef theWindow);
73af5a
2b616f ¤   virtual void¤   ¤   ¤   ¤   OldEndUpdate(WindowRef theWindow);
83af5a
ffa910 ¤   static pascal ·void¤¤   ¤   EndUpdateCallback(WindowRef theWindow);
1182f7 };
--2e5f 000f5948c7f4012016d Page 1 of CEventAvailPatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
40aae8 ¤   $Id: CEventAvailPatcher.cp,v 1.1.2.1.2.1 1998/11/12 03:10:12 heller Exp $
7ff7f7 ____________________________________________________________________________*/
42af5a
c370b5 #include <SetupA4.h>
b1af5a
4d002e #include "CEventAvailPatcher.h"
43af5a
79af5a
e5af5a
b86213 // Define statics
3456ea CEventAvailPatcher *¤   CEventAvailPatcher::sEventAvailPatcher = nil;
93af5a
d12c65 CEventAvailPatcher::CEventAvailPatcher()
0bbb36 {
35c6af ¤   // Current version will only install one patch
d19f21 ¤   if (sEventAvailPatcher == nil) {
39d097 ¤   ¤   Patch(_EventAvail, kProcInfo, (ProcPtr) EventAvailCallback);
4af5a0 ¤   ¤   sEventAvailPatcher = this;
819371 ¤   }
d4efe6 }
02af5a
99af5a
66af5a
90ed7c CEventAvailPatcher::~CEventAvailPatcher()
7dbb36 {
47efe6 }
d1af5a
98af5a
18af5a
1b7e69 ¤   Boolean
ebfb33 CEventAvailPatcher::NewEventAvail(
79bfd8 ¤   EventMask¤  ¤   eventMask,
ef4f7e ¤   EventRecord *¤  theEvent)
94bb36 {
9aa582 ¤   // default just calls through to the original
0cea0f ¤   return OldEventAvail(eventMask, theEvent);
eaefe6 }
34af5a
3aaf5a
2caf5a
8d7e69 ¤   Boolean
8976b7 CEventAvailPatcher::OldEventAvail(
0ebfd8 ¤   EventMask¤  ¤   eventMask,
8b4f7e ¤   EventRecord *¤  theEvent)
bdbb36 {
0b58ca #if¤TARGET_RT_MAC_CFM
ae891e ¤   return (Boolean) ::CallUniversalProc(¤  mOldRoutine,
e37fb3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
c723d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   eventMask,
f3803e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theEvent);
acdb21 #else
a707e4 ¤   return ((EventAvailProc) mOldRoutine)(¤ eventMask,
69803e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theEvent);
a17454 #endif
69efe6 }
9daf5a
13af5a
29af5a
3599cb ¤   pascal Boolean
1409af CEventAvailPatcher::EventAvailCallback(
0cbfd8 ¤   EventMask¤  ¤   eventMask,
244f7e ¤   EventRecord *¤  theEvent)
4fbb36 {
cc6aab ¤   EnterCallback();
cbaf5a
f5a182 ¤   Boolean¤result = false;
--b605 0012519c5c24012016d Page 2 of CEventAvailPatcher.cp
e0af5a
e75168 ¤   try {
bd74ed ¤   ¤   result = sEventAvailPatcher->NewEventAvail(¤eventMask,
ad87e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theEvent);
8e9371 ¤   }
c267c5 ¤
467e82 ¤   catch(...) {
0d9371 ¤   }
b067c5 ¤
cf36ff ¤   ExitCallback();
cb5d73 ¤   return result;
25efe6 }
--7631 0015b1a31b34012016e Page 1 of CEventAvailPatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
30b491 ¤   $Id: CEventAvailPatcher.h,v 1.1.2.1.2.1 1998/11/12 03:10:13 heller Exp $
15f7f7 ____________________________________________________________________________*/
d0af5a
d58d55 #pragma once·
d4af5a
37f973 #include "CPatcher.h"
76af5a
beaca5 class CEventAvailPatcher¤   :¤  public¤ CPatcher {
5f5ed4 public:
5258ca #if¤TARGET_RT_MAC_CFM
e699a8 ¤   enum {kProcInfo = kPascalStackBased
f52a9e ¤   ¤   | RESULT_SIZE(SIZE_CODE(sizeof(Boolean)))
fe0989 ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(EventMask)))
2765f4 ¤   ¤   | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(EventRecord *)))};
b5db21 #else
4e1858 ¤   enum {kProcInfo = 0};
90be29 ¤   typedef pascal Boolean ¤¤   ¤   (*EventAvailProc)(EventMask eventMask,
2f3f99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord * theEvent);
6e7454 #endif
2a1b52 ¤   ¤
d36572 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CEventAvailPatcher();
6e3388 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CEventAvailPatcher();
47af5a
2ba2d3 protected:
ba7953 ¤   static CEventAvailPatcher *¤¤   sEventAvailPatcher;
2b67c5 ¤
570691 ¤   virtual Boolean¤¤   ¤   ¤   ¤   NewEventAvail(EventMask eventMask,
1d3f99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord * theEvent);
29af5a
44226e ¤   virtual Boolean¤¤   ¤   ¤   ¤   OldEventAvail(EventMask eventMask,
1893c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord * theEvent);¤
83af5a
8e8171 ¤   static pascal Boolean¤  ¤   ¤   EventAvailCallback(EventMask eventMask,
30aab9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord *theEvent);
5b82f7 };
--1766 0001728594f4012016f Page 1 of CGetKeysPatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
c00e41 ¤   $Id: CGetKeysPatcher.cp,v 1.3.8.1 1998/11/12 03:10:13 heller Exp $
7ef7f7 ____________________________________________________________________________*/
63af5a
fc70b5 #include <SetupA4.h>
c5af5a
65ad84 #include "CGetKeysPatcher.h"
3aaf5a
a6af5a
fcaf5a
136213 // Define statics
532f71 CGetKeysPatcher *¤  CGetKeysPatcher::sGetKeysPatcher = nil;
63af5a
cc9860 CGetKeysPatcher::CGetKeysPatcher()
90bb36 {
dcc6af ¤   // Current version will only install one patch
c9105f ¤   if (sGetKeysPatcher == nil) {
5edb8b ¤   ¤   Patch(_GetKeys, kProcInfo, (ProcPtr) GetKeysCallback);
92a683 ¤   ¤   sGetKeysPatcher = this;
939371 ¤   }
a4efe6 }
9baf5a
26af5a
88af5a
8123e8 CGetKeysPatcher::~CGetKeysPatcher()
18bb36 {
5cefe6 }
8eaf5a
39af5a
34af5a
866d52 ¤   void
5e8151 CGetKeysPatcher::NewGetKeys(
fd99f2 ¤   KeyMap¤ theKeys)
b4bb36 {
e6a582 ¤   // default just calls through to the original
083f6b ¤   OldGetKeys(theKeys);
82efe6 }
6eaf5a
3faf5a
ecaf5a
4c6d52 ¤   void
824b04 CGetKeysPatcher::OldGetKeys(
9299f2 ¤   KeyMap¤ theKeys)
e9bb36 {
b6fdb7 #if TARGET_RT_MAC_CFM
f21300 ¤   ::CallUniversalProc(¤   mOldRoutine,
5829f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
a44bdf ¤   ¤   ¤   ¤   ¤   ¤   ¤   theKeys);
02db21 #else
852b03 ¤   ((GetKeysProc) mOldRoutine)(theKeys);
3b7454 #endif
32efe6 }
02af5a
82af5a
f7af5a
8a6685 ¤   pascal void
13e67c CGetKeysPatcher::GetKeysCallback(
0e99f2 ¤   KeyMap¤ theKeys)
55bb36 {
046aab ¤   EnterCallback();
0baf5a
f85168 ¤   try {
bd245e ¤   ¤   sGetKeysPatcher->NewGetKeys(theKeys);
379371 ¤   }
4c67c5 ¤
9e7e82 ¤   catch(...) {
179371 ¤   }
--edc8 00114cf3e204012016f Page 2 of CGetKeysPatcher.cp
2a67c5 ¤
0336ff ¤   ExitCallback();
14efe6 }
--44cf 001688bebb340120170 Page 1 of CGetKeysPatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
803a11 ¤   $Id: CGetKeysPatcher.h,v 1.3.8.1 1998/11/12 03:10:14 heller Exp $
1af7f7 ____________________________________________________________________________*/
f6af5a
138d55 #pragma once·
cbaf5a
d3f973 #include "CPatcher.h"
2baf5a
db1406 class CGetKeysPatcher¤  :¤  public¤ CPatcher {
c95ed4 public:
befdb7 #if TARGET_RT_MAC_CFM
858a7d ¤   enum {kProcInfo =¤  kPascalStackBased
562e76 ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(UInt32 *)))};
2ddb21 #else
821858 ¤   enum {kProcInfo = 0};
02c736 ¤   typedef pascal void¤¤   ¤   (*GetKeysProc)(KeyMap theKeys);
a97454 #endif
6c1b52 ¤   ¤
e43887 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CGetKeysPatcher();
e1d555 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ~CGetKeysPatcher();
6caf5a
2aa2d3 protected:
89857f ¤   static CGetKeysPatcher *¤   sGetKeysPatcher;
a567c5 ¤
7a1210 ¤   virtual void¤   ¤   ¤   ¤   NewGetKeys(KeyMap theKeys);
3aaf5a
35e609 ¤   virtual void¤   ¤   ¤   ¤   OldGetKeys(KeyMap theKeys);
1eaf5a
81f7a7 ¤   static pascal void¤ ¤   ¤   GetKeysCallback(KeyMap theKeys);
6882f7 };
--919b 00004538b4640120171 Page 1 of CGetResourcePatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
856e7d ¤   $Id: CGetResourcePatcher.cp,v 1.1.2.1.2.1 1998/11/12 03:10:15 heller Exp $
e2f7f7 ____________________________________________________________________________*/
4aaf5a
3b70b5 #include <SetupA4.h>
08af5a
0f568d #include "CGetResourcePatcher.h"
94af5a
e5af5a
6eaf5a
756213 // Define statics
3fb079 CGetResourcePatcher *¤  CGetResourcePatcher::sGetResourcePatcher = nil;
03af5a
82ed58 CGetResourcePatcher::CGetResourcePatcher()
4cbb36 {
98c6af ¤   // Current version will only install one patch
e5fd57 ¤   if (sGetResourcePatcher == nil) {
9635b4 ¤   ¤   Patch(_GetResource, kProcInfo, (ProcPtr) GetResourceCallback);
becc95 ¤   ¤   sGetResourcePatcher = this;
969371 ¤   }
85efe6 }
bdaf5a
5baf5a
c0af5a
910c54 CGetResourcePatcher::~CGetResourcePatcher()
16bb36 {
4befe6 }
11af5a
32af5a
07af5a
036692 ¤   Handle
542285 CGetResourcePatcher::NewGetResource(
05809f ¤   ResType¤theType,
8abe87 ¤   short¤  theID)
dbbb36 {
d7a582 ¤   // default just calls through to the original
8b2cd6 ¤   return OldGetResource(theType, theID);
0cefe6 }
afaf5a
ddaf5a
6eaf5a
a66692 ¤   Handle
77e024 CGetResourcePatcher::OldGetResource(
c8809f ¤   ResType¤theType,
cebe87 ¤   short¤  theID)
22bb36 {
0d58ca #if¤TARGET_RT_MAC_CFM
c13e3c ¤   return (Handle) ::CallUniversalProc(¤   mOldRoutine,
017fb3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
a3d9d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theType,
cd3c42 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theID);
13db21 #else
ba50d0 ¤   return ((GetResourceProc) mOldRoutine)(¤theType,
533c42 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theID);
1c7454 #endif
d1efe6 }
fbaf5a
2eaf5a
26af5a
86ca72 ¤   pascal Handle
230432 CGetResourcePatcher::GetResourceCallback(
e9809f ¤   ResType¤theType,
c8be87 ¤   short¤  theID)
10bb36 {
ad6aab ¤   EnterCallback();
9baf5a
04828f ¤   Handle¤ result = false;
--9d24 0013d48ff8e40120171 Page 2 of CGetResourcePatcher.cp
e0af5a
e75168 ¤   try {
2735ab ¤   ¤   result = sGetResourcePatcher->NewGetResource(¤  theType,
2a22a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theID);
e19371 ¤   }
dd67c5 ¤
6b7e82 ¤   catch(...) {
c99371 ¤   }
6667c5 ¤
4236ff ¤   ExitCallback();
d55d73 ¤   return result;
3defe6 }
--acca 00194e455e740120172 Page 1 of CGetResourcePatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
73f519 ¤   $Id: CGetResourcePatcher.h,v 1.1.2.1.2.1 1998/11/12 03:10:15 heller Exp $
c6f7f7 ____________________________________________________________________________*/
24af5a
308d55 #pragma once·
2eaf5a
8ef973 #include "CPatcher.h"
6faf5a
0d74ce class CGetResourcePatcher¤  :¤  public¤ CPatcher {
275ed4 public:
a258ca #if¤TARGET_RT_MAC_CFM
5699a8 ¤   enum {kProcInfo = kPascalStackBased
d82b1c ¤   ¤   | RESULT_SIZE(SIZE_CODE(sizeof(Handle)))
d71869 ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ResType)))
b5b2bb ¤   ¤   | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(short)))};
3adb21 #else
241858 ¤   enum {kProcInfo = 0};
b5f34f ¤   typedef pascal Handle ¤ ¤   ¤   (*GetResourceProc)(ResType theType,
c00de4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short theID);
3e7454 #endif
b31b52 ¤   ¤
72b3a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CGetResourcePatcher();
23eb24 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CGetResourcePatcher();
a7af5a
3aa2d3 protected:
91ef0e ¤   static CGetResourcePatcher *¤   sGetResourcePatcher;
2567c5 ¤
a4bb08 ¤   virtual Handle¤ ¤   ¤   ¤   ¤   NewGetResource(ResType theType,
940de4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short theID);
e00230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
146e9f ¤   virtual Handle¤ ¤   ¤   ¤   ¤   OldGetResource(ResType theType,
680de4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short theID);
e20230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
139432 ¤   static pascal Handle¤   ¤   ¤   GetResourceCallback(ResType theType,
df0de4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short theID);
9482f7 };
--df66 000d831695440120173 Page 1 of CInsertMenuPatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
8db52a ¤   $Id: CInsertMenuPatcher.cp,v 1.3.8.1 1998/11/12 03:10:16 heller Exp $
6bf7f7 ____________________________________________________________________________*/
dbaf5a
3270b5 #include <SetupA4.h>
eaaf5a
f4f30c #include "CInsertMenuPatcher.h"
23af5a
d7af5a
c4af5a
066213 // Define statics
1f6934 CInsertMenuPatcher *¤   CInsertMenuPatcher::sInsertMenuPatcher = nil;
7caf5a
7e2bf8 CInsertMenuPatcher::CInsertMenuPatcher()
64bb36 {
dbc6af ¤   // Current version will only install one patch
8807c7 ¤   if (sInsertMenuPatcher == nil) {
0ef713 ¤   ¤   Patch(_InsertMenu, kProcInfo, (ProcPtr) InsertMenuCallback);
a0d15f ¤   ¤   sInsertMenuPatcher = this;
d99371 ¤   }
00efe6 }
2faf5a
28af5a
2aaf5a
a6dc81 CInsertMenuPatcher::~CInsertMenuPatcher()
94bb36 {
31efe6 }
d4af5a
d2af5a
15af5a
8d6d52 ¤   void
b0e6c0 CInsertMenuPatcher::NewInsertMenu(
e881c9 ¤   MenuRef¤theMenu,
adc27f ¤   short¤  beforeID)
3fbb36 {
bba582 ¤   // default just calls through to the original
519f53 ¤   OldInsertMenu(theMenu, beforeID);
b7efe6 }
4aaf5a
76af5a
d7af5a
ab6d52 ¤   void
7f6b44 CInsertMenuPatcher::OldInsertMenu(
6a81c9 ¤   MenuRef¤theMenu,
e8c27f ¤   short¤  beforeID)
96bb36 {
e6fdb7 #if TARGET_RT_MAC_CFM
891300 ¤   ::CallUniversalProc(¤   mOldRoutine,
9d29f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
4797c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theMenu,
179232 ¤   ¤   ¤   ¤   ¤   ¤   ¤   beforeID);
fbdb21 #else
7f9c16 ¤   ((InsertMenuProc) mOldRoutine)(¤theMenu,
dd0de6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   beforeID);
a17454 #endif
dcefe6 }
74af5a
edaf5a
93af5a
d46685 ¤   pascal void
0cd575 CInsertMenuPatcher::InsertMenuCallback(
f381c9 ¤   MenuRef¤theMenu,
b2c27f ¤   short¤  beforeID)
edbb36 {
456aab ¤   EnterCallback();
f9af5a
d85168 ¤   try {
--5186 001069b2c8a40120173 Page 2 of CInsertMenuPatcher.cp
8c98e3 ·¤  ¤   sInsertMenuPatcher->NewInsertMenu(theMenu, beforeID);
c89371 ¤   }
6867c5 ¤
a27e82 ¤   catch(...) {
2c9371 ¤   }
d067c5 ¤
9b36ff ¤   ExitCallback();
06efe6 }
--f3f0 001d1d5852340120174 Page 1 of CInsertMenuPatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
77ff62 ¤   $Id: CInsertMenuPatcher.h,v 1.3.8.1 1998/11/12 03:10:17 heller Exp $
4df7f7 ____________________________________________________________________________*/
66af5a
0f8d55 #pragma once·
62af5a
d1f973 #include "CPatcher.h"
00af5a
57a503 class CInsertMenuPatcher¤   :¤  public¤ CPatcher {
295ed4 public:
5efdb7 #if TARGET_RT_MAC_CFM
c78a7d ¤   enum {kProcInfo =¤  kPascalStackBased
daee93 ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(MenuRef)))
d8b2bb ¤   ¤   | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(short)))};
89db21 #else
781858 ¤   enum {kProcInfo = 0};
e52862 ¤   typedef pascal void¤¤   ¤   (*InsertMenuProc)(MenuRef theMenu,
42dd34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short beforeID);
ec7454 #endif
271b52 ¤   ¤
a99527 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CInsertMenuPatcher();
32f671 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ~CInsertMenuPatcher();
6aaf5a
0da2d3 protected:
ea956e ¤   static CInsertMenuPatcher *¤sInsertMenuPatcher;
0c67c5 ¤
2c8fc5 ¤   virtual void¤   ¤   ¤   ¤   NewInsertMenu(MenuRef theMenu,
45b207 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short beforeID);
17af5a
a08d26 ¤   virtual void¤   ¤   ¤   ¤   OldInsertMenu(MenuRef theMenu,
7feeb8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short beforeID);¤
42af5a
995353 ¤   static pascal void¤ ¤   ¤   InsertMenuCallback(MenuRef theMenu,
07dd34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short beforeID);
d182f7 };
--c20c 0008dd8584a40120175 Page 1 of CMenuSelectPatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
72470c ¤   $Id: CMenuSelectPatcher.cp,v 1.3.8.1 1998/11/12 03:10:17 heller Exp $
1bf7f7 ____________________________________________________________________________*/
a9af5a
b970b5 #include <SetupA4.h>
7caf5a
25e3c6 #include "CMenuSelectPatcher.h"
a9af5a
efaf5a
9caf5a
df6213 // Define statics
b2c1dc CMenuSelectPatcher *¤   CMenuSelectPatcher::sMenuSelectPatcher = nil;
40af5a
1f02a6 CMenuSelectPatcher::CMenuSelectPatcher()
e0bb36 {
a3c6af ¤   // Current version will only install one patch
3aed3b ¤   if (sMenuSelectPatcher == nil) {
4d9813 ¤   ¤   Patch(_MenuSelect, kProcInfo, (ProcPtr) MenuSelectCallback);
2d1521 ¤   ¤   sMenuSelectPatcher = this;
1c9371 ¤   }
e0efe6 }
edaf5a
b2af5a
05af5a
2f3c89 CMenuSelectPatcher::~CMenuSelectPatcher()
a9bb36 {
cfefe6 }
50af5a
33af5a
74af5a
0033d7 ¤   long
15a2a9 CMenuSelectPatcher::NewMenuSelect(
44cc7f ¤   Point¤  startPt)
71bb36 {
d2a582 ¤   // default just calls through to the original
68eaa5 ¤   return OldMenuSelect(startPt);
fcefe6 }
caaf5a
ddaf5a
98af5a
a433d7 ¤   long
e42f2d CMenuSelectPatcher::OldMenuSelect(
05cc7f ¤   Point¤  startPt)
01bb36 {
60fdb7 #if TARGET_RT_MAC_CFM
451d7e ¤   return (long) ::CallUniversalProc(¤ mOldRoutine,
7c6e94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
28db66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   startPt);
d4db21 #else
318a0e ¤   return ((MenuSelectProc) mOldRoutine)(startPt);
af7454 #endif
43efe6 }
f8af5a
89af5a
eaaf5a
023800 ¤   pascal long
48de14 CMenuSelectPatcher::MenuSelectCallback(
d2cc7f ¤   Point¤  startPt)
b7bb36 {
056aab ¤   EnterCallback();
97af5a
2d9f1d ¤   long¤   result = 0;
1967c5 ¤
cd5168 ¤   try {
ae8e52 ¤   ¤   result = sMenuSelectPatcher->NewMenuSelect(startPt);
359371 ¤   }
8d67c5 ¤
--f1df 001ad69c0b940120175 Page 2 of CMenuSelectPatcher.cp
197e82 ¤   catch(...) {
119371 ¤   }
8667c5 ¤
8436ff ¤   ExitCallback();
935d73 ¤   return result;
adefe6 }
--48d9 001f1e761cb40120176 Page 1 of CMenuSelectPatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
63a198 ¤   $Id: CMenuSelectPatcher.h,v 1.3.8.1 1998/11/12 03:10:18 heller Exp $
43f7f7 ____________________________________________________________________________*/
1faf5a
a18d55 #pragma once·
c5af5a
e8f973 #include "CPatcher.h"
cfaf5a
cbad03 class CMenuSelectPatcher¤   :¤  public¤ CPatcher {
185ed4 public:
94fdb7 #if TARGET_RT_MAC_CFM
7590a1 ¤   enum {kProcInfo = ¤ kPascalStackBased
b417ca ¤   ¤   | RESULT_SIZE(SIZE_CODE(sizeof(long)))
43e93f ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Point)))};
f8db21 #else
cb1858 ¤   enum {kProcInfo = 0};
e325ec ¤   typedef pascal long¤¤   ¤   (*MenuSelectProc)(Point startPt);
df7454 #endif
b11b52 ¤   ¤
5785ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CMenuSelectPatcher();
bee6bb ¤   virtual¤¤   ¤   ¤   ¤   ¤   ~CMenuSelectPatcher();
3faf5a
7fa2d3 protected:
0aabf9 ¤   static CMenuSelectPatcher *¤sMenuSelectPatcher;
bf67c5 ¤
e08fb0 ¤   virtual long¤   ¤   ¤   ¤   NewMenuSelect(Point startPt);
59af5a
087c92 ¤   virtual long¤   ¤   ¤   ¤   OldMenuSelect(Point startPt);
d2af5a
f1d185 ¤   static pascal long¤ ¤   ¤   MenuSelectCallback(Point startPt);
f182f7 };
--6fd9 0014de6b61d40120177 Page 1 of CPatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
47a3aa ¤   $Id: CPatcher.cp,v 1.4.8.1 1998/11/12 03:10:19 heller Exp $
78f7f7 ____________________________________________________________________________*/
5faf5a
e1f973 #include "CPatcher.h"
69af5a
7aaf5a
08af5a
ea014b CPatcher::CPatcher()
371280 ¤   :¤  mOldRoutine(nil)
39bb36 {
2aefe6 }
4eaf5a
06af5a
bfed19 CPatcher::~CPatcher()
c1bb36 {
73efe6 }
89af5a
d0af5a
58af5a
aa6d52 ¤   void
07573c CPatcher::Patch(
67bf45 ¤   SInt16¤ ¤   ¤   inTrapNum,
0ec105 ¤   ProcInfoType¤   inProcInfo,
bdcaef ¤   ProcPtr¤¤   ¤   inProc)
ccbb36 {
1a0bdb ¤   UniversalProcPtr¤   theNewRoutine;
90af5a
d158ca #if¤TARGET_RT_MAC_CFM
3e7cfe ¤   theNewRoutine =
db3818 ¤   ¤   (UniversalProcPtr) ::NewRoutineDescriptor(¤ (ProcPtr) inProc,
69a8df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inProcInfo,
5857f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetCurrentArchitecture());
6cb600 ¤   PGPThrowIfNil_(theNewRoutine);
c6db21 #else
e7fd30 ¤   theNewRoutine = (UniversalProcPtr) inProc;
147454 #endif
e4af5a
5cc65a ¤   if (inTrapNum & 0x0800){
94d894 ¤   ¤   mOldRoutine = ::GetToolTrapAddress(inTrapNum);
bed1d4 ¤   ¤   ::SetToolTrapAddress(¤  (UniversalProcPtr) theNewRoutine,
298241 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inTrapNum);
fcf037 ¤   } else {
e24a21 ¤   ¤   mOldRoutine = ::GetOSTrapAddress(inTrapNum);
841499 ¤   ¤   ::SetOSTrapAddress(¤(UniversalProcPtr) theNewRoutine,
fa0a27 ¤   ¤   ¤   ¤   ¤   ¤   ¤   inTrapNum);
099371 ¤   }
4defe6 }
--3bd0 0013344cf2d40120178 Page 1 of CPatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
4f3ad7 ¤   $Id: CPatcher.h,v 1.2.20.1 1998/11/12 03:10:19 heller Exp $
3ff7f7 ____________________________________________________________________________*/
eaaf5a
178d55 #pragma once·
2faf5a
05a7a8 class CPatcher {
bf5ed4 public:
8df0f7 ¤   ¤   ¤   ¤   ¤   ¤   CPatcher();
fabebe ¤   virtual¤¤   ¤   ¤   ~CPatcher() = 0;
a867c5 ¤
e71409 ¤   virtual void¤   ¤   Patch(SInt16 inTrapNum, ProcInfoType inProcInfo,
6c76cb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ProcPtr inProc);
e467c5 ¤
59a2d3 protected:
8c3dff ¤   UniversalProcPtr¤   mOldRoutine;
f367c5 ¤
7c69c5 /*¤ Subclasses need to define the following:
15efc5 ¤   static Subclass *¤  sPatcherObject;
ba67c5 ¤
1889fc ¤   virtual somereturn¤ ¤   VirtualCallback();
ba0e42 ¤   virtual someReturn¤ ¤   CallOriginal();
678909 ¤   static someReturn¤  ¤   TheCallback(someParams)
5c40d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {sPatcherObject->virtualCallback; }
b77dc4 */¤
3382f7 };
--61d4 0005b4135b240120179 Page 1 of CPopUpMenuSelectPatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
dc0b26 ¤   $Id: CPopUpMenuSelectPatcher.cp,v 1.2.20.1 1998/11/12 03:10:20 heller Exp $
cff7f7 ____________________________________________________________________________*/
37af5a
8b70b5 #include <SetupA4.h>
2faf5a
420949 #include "CPopUpMenuSelectPatcher.h"
06af5a
a5af5a
90af5a
1f6213 // Define statics
034fd5 CPopUpMenuSelectPatcher *¤  CPopUpMenuSelectPatcher::sPopUpMenuSelectPatcher
50ce16 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   = nil;
3aaf5a
c4e77f CPopUpMenuSelectPatcher::CPopUpMenuSelectPatcher()
56bb36 {
c2c6af ¤   // Current version will only install one patch
32c4c5 ¤   if (sPopUpMenuSelectPatcher == nil) {
6fb8ca ¤   ¤   Patch(_PopUpMenuSelect, kProcInfo, (ProcPtr) PopUpMenuSelectCallback);
9be5d1 ¤   ¤   sPopUpMenuSelectPatcher = this;
119371 ¤   }
e1efe6 }
11af5a
5baf5a
95af5a
c47252 CPopUpMenuSelectPatcher::~CPopUpMenuSelectPatcher()
e6bb36 {
3befe6 }
03af5a
20af5a
e0af5a
db33d7 ¤   long
901d26 CPopUpMenuSelectPatcher::NewPopUpMenuSelect(
782703 ¤   MenuRef¤menu,
70ef81 ¤   short¤  top,
08af8d ¤   short¤  left,
908b16 ¤   short¤  popUpItem)
39bb36 {
bca582 ¤   // default just calls through to the original
a3d8e6 ¤   return OldPopUpMenuSelect(¤ menu,
111d66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   top,
b33cce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   left,
fb5869 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   popUpItem);
3fefe6 }
8caf5a
44af5a
aeaf5a
8433d7 ¤   long
a51c82 CPopUpMenuSelectPatcher::OldPopUpMenuSelect(
b12703 ¤   MenuRef¤menu,
44ef81 ¤   short¤  top,
9caf8d ¤   short¤  left,
148b16 ¤   short¤  popUpItem)
d0bb36 {
f19b22 #if GENERATINGCFM
7d1d7e ¤   return (long) ::CallUniversalProc(¤ mOldRoutine,
226e94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
bc82ca ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   menu,
9b1e33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   top,
2a39e5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   left,
41d678 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   popUpItem);
d3db21 #else
dc3cc7 ¤   return ((PopUpMenuSelectProc) mOldRoutine)(¤menu,
851fb5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   top,
71d8da ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   left,
d80c83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   popUpItem);
5b7454 #endif
--a598 001f0fc172840120179 Page 2 of CPopUpMenuSelectPatcher.cp
7aefe6 }
46af5a
8eaf5a
79af5a
ce3800 ¤   pascal long
46c5bb CPopUpMenuSelectPatcher::PopUpMenuSelectCallback(
832703 ¤   MenuRef¤menu,
42ef81 ¤   short¤  top,
ddaf8d ¤   short¤  left,
5b8b16 ¤   short¤  popUpItem)
a8bb36 {
af6aab ¤   EnterCallback();
23af5a
c39f1d ¤   long¤   result = 0;
7f67c5 ¤
935168 ¤   try {
a56eef ¤   ¤   result = sPopUpMenuSelectPatcher->NewPopUpMenuSelect(¤  menu,
a4065f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   top,
789097 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   left,
8ca08f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   popUpItem);
e39371 ¤   }
3467c5 ¤
657e82 ¤   catch(...) {
f09371 ¤   }
5f67c5 ¤
1136ff ¤   ExitCallback();
3d5d73 ¤   return result;
f0efe6 }
--edc2 001791e4c824012017a Page 1 of CPopUpMenuSelectPatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
01297c ¤   $Id: CPopUpMenuSelectPatcher.h,v 1.2.20.1 1998/11/12 03:10:20 heller Exp $
fcf7f7 ____________________________________________________________________________*/
1aaf5a
218d55 #pragma once·
bdaf5a
9ff973 #include "CPatcher.h"
0daf5a
81ada2 class CPopUpMenuSelectPatcher¤  :¤  public¤ CPatcher {
955ed4 public:
a29b22 #if GENERATINGCFM
f490a1 ¤   enum {kProcInfo = ¤ kPascalStackBased
a917ca ¤   ¤   | RESULT_SIZE(SIZE_CODE(sizeof(long)))
feee93 ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(MenuRef)))
9d8a8b ¤   ¤   | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(short)))
ac73ba ¤   ¤   | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(short)))
d93c21 ¤   ¤   | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(short)))};
3edb21 #else
fc1858 ¤   enum {kProcInfo = 0};
1b5e0d ¤   typedef pascal long¤¤   ¤   (*PopUpMenuSelectProc)(MenuRef menu,
b193a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short top, short left, short popUpItem);
977454 #endif
7d1b52 ¤   ¤
431d52 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPopUpMenuSelectPatcher();
19ef81 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ~CPopUpMenuSelectPatcher();
37af5a
f7a2d3 protected:
5da2a7 ¤   static CPopUpMenuSelectPatcher *¤   sPopUpMenuSelectPatcher;
9267c5 ¤
1d3530 ¤   virtual long¤   ¤   ¤   ¤   NewPopUpMenuSelect(MenuRef menu, short top,
086cf1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short left, short popUpItem);
08af5a
1d292f ¤   virtual long¤   ¤   ¤   ¤   OldPopUpMenuSelect(MenuRef menu, short top,
c96cf1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short left, short popUpItem);
c3af5a
f98a82 ¤   static pascal long¤ ¤   ¤   PopUpMenuSelectCallback(MenuRef menu,
0093a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short top, short left, short popUpItem);
7982f7 };
--4361 000e4620f424012017b Page 1 of CPutScrapPatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
a15882 ¤   $Id: CPutScrapPatcher.cp,v 1.3.8.1 1998/11/12 03:10:21 heller Exp $
0af7f7 ____________________________________________________________________________*/
1caf5a
7070b5 #include <SetupA4.h>
7aaf5a
43d654 #include "CPutScrapPatcher.h"
a0af5a
43af5a
10af5a
2b6213 // Define statics
bd7caa CPutScrapPatcher *¤ CPutScrapPatcher::sPutScrapPatcher = nil;
52af5a
34f62c CPutScrapPatcher::CPutScrapPatcher()
5fbb36 {
a7c6af ¤   // Current version will only install one patch
094778 ¤   if (sPutScrapPatcher == nil) {
b379a2 ¤   ¤   Patch(_PutScrap, kProcInfo, (ProcPtr) PutScrapCallback);
11631e ¤   ¤   sPutScrapPatcher = this;
ae9371 ¤   }
d2efe6 }
38af5a
1caf5a
74af5a
7ab0d2 CPutScrapPatcher::~CPutScrapPatcher()
d5bb36 {
d4efe6 }
18af5a
d2af5a
edaf5a
9833d7 ¤   long
62e119 CPutScrapPatcher::NewPutScrap(
d4e8b2 ¤   long¤   length,
82809f ¤   ResType¤theType,
9236b0 ¤   void *¤ source)
79bb36 {
3ea582 ¤   // default just calls through to the original
3313b8 ¤   return OldPutScrap(¤length,
9fe66f ¤   ¤   ¤   ¤   ¤   ¤   theType,
c59582 ¤   ¤   ¤   ¤   ¤   ¤   source);
93efe6 }
d0af5a
72af5a
9aaf5a
d633d7 ¤   long
d3e4fb CPutScrapPatcher::OldPutScrap(
0ee8b2 ¤   long¤   length,
3f809f ¤   ResType¤theType,
ee36b0 ¤   void *¤ source)
79bb36 {
60fdb7 #if TARGET_RT_MAC_CFM
851d7e ¤   return (long) ::CallUniversalProc(¤ mOldRoutine,
456e94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
c71645 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   length,
488acf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theType,
29f922 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   source);
58db21 #else
3aeb64 ¤   return ((PutScrapProc) mOldRoutine)(¤   length,
c6d9d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theType,
aaaa39 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   source);
517454 #endif
81efe6 }
8baf5a
c7af5a
7caf5a
c93800 ¤   pascal long
e43eb5 CPutScrapPatcher::PutScrapCallback(
--c816 0011255ce4e4012017b Page 2 of CPutScrapPatcher.cp
dae8b2 ¤   long¤   length,
04809f ¤   ResType¤theType,
cf36b0 ¤   void *¤ source)
06bb36 {
f96aab ¤   EnterCallback();
f5af5a
759f1d ¤   long¤   result = 0;
0367c5 ¤
3a5168 ¤   try {
69d3e6 ¤   ¤   result = sPutScrapPatcher->NewPutScrap(¤length,
52b6e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theType,
d4c50a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   source);
e49371 ¤   }
a067c5 ¤
4f7e82 ¤   catch(...) {
489371 ¤   }
cc67c5 ¤
c336ff ¤   ExitCallback();
9f5d73 ¤   return result;
12efe6 }
--e88b 0018e3597184012017c Page 1 of CPutScrapPatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
9a5b63 ¤   $Id: CPutScrapPatcher.h,v 1.3.8.1 1998/11/12 03:10:22 heller Exp $
10f7f7 ____________________________________________________________________________*/
d4af5a
0a8d55 #pragma once·
66af5a
79f973 #include "CPatcher.h"
10af5a
4133a9 class CPutScrapPatcher¤ :¤  public¤ CPatcher {
7a5ed4 public:
26fdb7 #if TARGET_RT_MAC_CFM
9f90a1 ¤   enum {kProcInfo = ¤ kPascalStackBased
e217ca ¤   ¤   | RESULT_SIZE(SIZE_CODE(sizeof(long)))
605fba ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(long)))
335f24 ¤   ¤   | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ResType)))
531858 ¤   ¤   | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(void *)))};
d6db21 #else
831858 ¤   enum {kProcInfo = 0};
948923 ¤   typedef pascal long¤¤   ¤   (*PutScrapProc)(long length, ResType theType,
585304 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void * source);
827454 #endif
0b1b52 ¤   ¤
ee99fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPutScrapPatcher();
366c8e ¤   virtual¤¤   ¤   ¤   ¤   ¤   ~CPutScrapPatcher();
2aaf5a
98a2d3 protected:
19bd1c ¤   static CPutScrapPatcher *¤  sPutScrapPatcher;
1067c5 ¤
3c0c21 ¤   virtual long¤   ¤   ¤   ¤   NewPutScrap(long length, ResType theType,
c05304 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void * source);
40af5a
421748 ¤   virtual long¤   ¤   ¤   ¤   OldPutScrap(long length, ResType theType,
cf5304 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void * source);
97af5a
102c7b ¤   static pascal long¤ ¤   ¤   PutScrapCallback(long length, ResType theType,
555304 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void * source);
8e82f7 };
--a58d 000694ba3af4012017d Page 1 of CSetMenuBarPatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
8d793f ¤   $Id: CSetMenuBarPatcher.cp,v 1.3.8.1 1998/11/12 03:10:22 heller Exp $
61f7f7 ____________________________________________________________________________*/
dfaf5a
4070b5 #include <SetupA4.h>
e9af5a
b55892 #include "CSetMenuBarPatcher.h"
35af5a
e0af5a
f3af5a
d76213 // Define statics
e4d45d CSetMenuBarPatcher *¤   CSetMenuBarPatcher::sSetMenuBarPatcher = nil;
33af5a
bb153a CSetMenuBarPatcher::CSetMenuBarPatcher()
e6bb36 {
0ac6af ¤   // Current version will only install one patch
881fd5 ¤   if (sSetMenuBarPatcher == nil) {
0d1f98 ¤   ¤   Patch(_SetMenuBar, kProcInfo, (ProcPtr) SetMenuBarCallback);
83ecda ¤   ¤   sSetMenuBarPatcher = this;
aa9371 ¤   }
a7efe6 }
b3af5a
ceaf5a
95af5a
127671 CSetMenuBarPatcher::~CSetMenuBarPatcher()
dabb36 {
d0efe6 }
0caf5a
5aaf5a
4daf5a
ba314a void
f64207 CSetMenuBarPatcher::NewSetMenuBar(
b95af4 ¤   Handle¤ menuList)
2ebb36 {
dfa582 ¤   // default just calls through to the original
ba314a ¤   OldSetMenuBar(menuList);
69efe6 }
6eaf5a
cdaf5a
0faf5a
97314a void
8dcf83 CSetMenuBarPatcher::OldSetMenuBar(
985af4 ¤   Handle¤ menuList)
4fbb36 {
9afdb7 #if TARGET_RT_MAC_CFM
dd1300 ¤   ::CallUniversalProc(¤   mOldRoutine,
1d29f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
e1390b ¤   ¤   ¤   ¤   ¤   ¤   ¤   menuList);
ebdb21 #else
695ba3 ¤   ((SetMenuBarProc) mOldRoutine)(menuList);
2d7454 #endif
21efe6 }
2faf5a
93af5a
b9af5a
987c35 pascal void
f75027 CSetMenuBarPatcher::SetMenuBarCallback(
f95af4 ¤   Handle¤ menuList)
f8bb36 {
636aab ¤   EnterCallback();
a7af5a
cc5168 ¤   try {
b20f16 ¤   ¤   sSetMenuBarPatcher->NewSetMenuBar(menuList);
5b9371 ¤   }
dc67c5 ¤
347e82 ¤   catch(...) {
699371 ¤   }
--948c 00114cf3e204012017d Page 2 of CSetMenuBarPatcher.cp
2a67c5 ¤
0336ff ¤   ExitCallback();
14efe6 }
--6e31 001bd19b1044012017e Page 1 of CSetMenuBarPatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
272f57 ¤   $Id: CSetMenuBarPatcher.h,v 1.3.8.1 1998/11/12 03:10:23 heller Exp $
f3f7f7 ____________________________________________________________________________*/
75af5a
f18d55 #pragma once·
a9af5a
d1f973 #include "CPatcher.h"
1caf5a
16e32c class CSetMenuBarPatcher¤   :¤  public¤ CPatcher {
155ed4 public:
ddfdb7 #if TARGET_RT_MAC_CFM
1090a1 ¤   enum {kProcInfo = ¤ kPascalStackBased
e5c89c ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))};
d2db21 #else
b81858 ¤   enum {kProcInfo = 0};
a7b781 ¤   typedef pascal void¤¤   ¤   (*SetMenuBarProc)(Handle menuList);
1f7454 #endif
931b52 ¤   ¤
343eb9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CSetMenuBarPatcher();
845def ¤   virtual¤¤   ¤   ¤   ¤   ¤   ~CSetMenuBarPatcher();
d3af5a
93a2d3 protected:
a21731 ¤   static CSetMenuBarPatcher *¤sSetMenuBarPatcher;
6d67c5 ¤
daf19e ¤   virtual void¤   ¤   ¤   ¤   NewSetMenuBar(Handle menuList);
d0af5a
2f2409 ¤   virtual void¤   ¤   ¤   ¤   OldSetMenuBar(Handle menuList);
d9af5a
0e21dc ¤   static pascal void¤ ¤   ¤   SetMenuBarCallback(Handle menuList);
bd82f7 };
--786f 000798a39384012017f Page 1 of CSetWTitlePatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
0991ef ¤   $Id: CSetWTitlePatcher.cp,v 1.3.8.1 1998/11/12 03:10:24 heller Exp $
cbf7f7 ____________________________________________________________________________*/
d1af5a
4b70b5 #include <SetupA4.h>
d1af5a
1d9711 #include "CSetWTitlePatcher.h"
03af5a
29af5a
9faf5a
976213 // Define statics
d56dee CSetWTitlePatcher *¤CSetWTitlePatcher::sSetWTitlePatcher = nil;
e8af5a
29e41c CSetWTitlePatcher::CSetWTitlePatcher()
5bbb36 {
b5c6af ¤   // Current version will only install one patch
1fb168 ¤   if (sSetWTitlePatcher == nil) {
99dd50 ¤   ¤   Patch(_SetWTitle, kProcInfo, (ProcPtr) SetWTitleCallback);
54d611 ¤   ¤   sSetWTitlePatcher = this;
549371 ¤   }
48efe6 }
a2af5a
dfaf5a
09af5a
12cfa7 CSetWTitlePatcher::~CSetWTitlePatcher()
63bb36 {
bcefe6 }
d1af5a
c9af5a
f6af5a
a06d52 ¤   void
514840 CSetWTitlePatcher::NewSetWTitle(
a78821 ¤   WindowRef¤  ¤   ¤   theWindow,
5b88bb ¤   ConstStr255Param¤   title)
5cbb36 {
11a582 ¤   // default just calls through to the original
8904ae ¤   OldSetWTitle(theWindow, title);
fcefe6 }
77af5a
6eaf5a
9caf5a
dd6d52 ¤   void
6b8c59 CSetWTitlePatcher::OldSetWTitle(
5d8821 ¤   WindowRef¤  ¤   ¤   theWindow,
1088bb ¤   ConstStr255Param¤   title)
bebb36 {
cf58ca #if¤TARGET_RT_MAC_CFM
cb1300 ¤   ::CallUniversalProc(¤   mOldRoutine,
f729f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
b6030d ¤   ¤   ¤   ¤   ¤   ¤   ¤   theWindow,
08f303 ¤   ¤   ¤   ¤   ¤   ¤   ¤   title);
f2db21 #else
15db33 ¤   ((SetWTitleProc) mOldRoutine)(¤ theWindow,
2cbe30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   title);
987454 #endif
bcefe6 }
46af5a
66af5a
fbaf5a
376685 ¤   pascal void
24316e CSetWTitlePatcher::SetWTitleCallback(
eb8821 ¤   WindowRef¤  ¤   ¤   theWindow,
b688bb ¤   ConstStr255Param¤   title)
39bb36 {
966aab ¤   EnterCallback();
4daf5a
795168 ¤   try {
--1e38 00137fb1f134012017f Page 2 of CSetWTitlePatcher.cp
64fd0b ¤   ¤   sSetWTitlePatcher->NewSetWTitle(theWindow, title);
e09371 ¤   }
b267c5 ¤
957e82 ¤   catch(...) {
6c9371 ¤   }
a567c5 ¤
fd36ff ¤   ExitCallback();
37efe6 }
--de74 00190f1b43e40120180 Page 1 of CSetWTitlePatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
3b77e2 ¤   $Id: CSetWTitlePatcher.h,v 1.3.8.1 1998/11/12 03:10:24 heller Exp $
65f7f7 ____________________________________________________________________________*/
b4af5a
f78d55 #pragma once·
b9af5a
c2f973 #include "CPatcher.h"
1aaf5a
13c0c0 class CSetWTitlePatcher¤:¤  public¤ CPatcher {
5a5ed4 public:
4258ca #if¤TARGET_RT_MAC_CFM
158a7d ¤   enum {kProcInfo =¤  kPascalStackBased
7973c9 ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(WindowRef)))
275c68 ¤   ¤   | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ConstStr255Param)))};
b2db21 #else
771858 ¤   enum {kProcInfo = 0};
5a5644 ¤   typedef pascal void¤¤   ¤   (*SetWTitleProc)(WindowRef theWindow,
ff2b96 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param title);
737454 #endif
3e1b52 ¤   ¤
17ac89 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CSetWTitlePatcher();
9af39d ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CSetWTitlePatcher();
03af5a
8fa2d3 protected:
991417 ¤   static CSetWTitlePatcher *¤ sSetWTitlePatcher;
b167c5 ¤
61b8a9 ¤   virtual void¤   ¤   ¤   ¤   NewSetWTitle(WindowRef theWindow,
e22b96 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param title);
56af5a
7e6ddc ¤   virtual void¤   ¤   ¤   ¤   OldSetWTitle(WindowRef theWindow,
022b96 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param title);
7faf5a
37a1c4 ¤   static pascal ·void¤¤   ¤   SetWTitleCallback(WindowRef theWindow,
4b2b96 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param title);
9082f7 };
--d5a3 000a910c15840120181 Page 1 of CSizeWindowPatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
fa93e0 ¤   $Id: CSizeWindowPatcher.cp,v 1.3.8.1 1998/11/12 03:10:25 heller Exp $
62f7f7 ____________________________________________________________________________*/
aaaf5a
d370b5 #include <SetupA4.h>
6caf5a
939f07 #include "CSizeWindowPatcher.h"
68af5a
18af5a
b7af5a
1a6213 // Define statics
5c5c30 CSizeWindowPatcher *¤   CSizeWindowPatcher::sSizeWindowPatcher = nil;
8baf5a
6e7a41 CSizeWindowPatcher::CSizeWindowPatcher()
7abb36 {
cec6af ¤   // Current version will only install one patch
a5c700 ¤   if (sSizeWindowPatcher == nil) {
4393de ¤   ¤   Patch(_SizeWindow, kProcInfo, (ProcPtr) SizeWindowCallback);
519863 ¤   ¤   sSizeWindowPatcher = this;
f89371 ¤   }
49efe6 }
f9af5a
cbaf5a
e6af5a
eded0e CSizeWindowPatcher::~CSizeWindowPatcher()
22bb36 {
7aefe6 }
c8af5a
3baf5a
4aaf5a
b26d52 ¤   void
a0df3f CSizeWindowPatcher::NewSizeWindow(
5c48cf ¤   WindowRef¤  theWindow,
6df95f ¤   short¤  ¤   w,
64360d ¤   short¤  ¤   h,
e82768 ¤   Boolean¤¤   fUpdate)
52bb36 {
faa582 ¤   // default just calls through to the original
7bb818 ¤   OldSizeWindow(theWindow, w, h, fUpdate);
e5efe6 }
99af5a
c9af5a
4aaf5a
836d52 ¤   void
8b52bb CSizeWindowPatcher::OldSizeWindow(
cb48cf ¤   WindowRef¤  theWindow,
67f95f ¤   short¤  ¤   w,
05360d ¤   short¤  ¤   h,
472768 ¤   Boolean¤¤   fUpdate)
75bb36 {
ea58ca #if¤TARGET_RT_MAC_CFM
751300 ¤   ::CallUniversalProc(¤   mOldRoutine,
dc29f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
c9030d ¤   ¤   ¤   ¤   ¤   ¤   ¤   theWindow,
2044df ¤   ¤   ¤   ¤   ¤   ¤   ¤   w,
0c8b8d ¤   ¤   ¤   ¤   ¤   ¤   ¤   h,
6d9631 ¤   ¤   ¤   ¤   ¤   ¤   ¤   fUpdate);
25db21 #else
23c195 ¤   ((SizeWindowProc) mOldRoutine)(¤theWindow,
a58953 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   w,
184601 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   h,
7d931a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fUpdate);
1a7454 #endif
24efe6 }
d3af5a
acaf5a
a9af5a
--3351 001ad20149540120181 Page 2 of CSizeWindowPatcher.cp
406685 ¤   pascal void
45ac9f CSizeWindowPatcher::SizeWindowCallback(
7f48cf ¤   WindowRef¤  theWindow,
0af95f ¤   short¤  ¤   w,
56360d ¤   short¤  ¤   h,
8f2768 ¤   Boolean¤¤   fUpdate)
84bb36 {
f16aab ¤   EnterCallback();
13af5a
8b5168 ¤   try {
d03ee6 ¤   ¤   sSizeWindowPatcher->NewSizeWindow(theWindow, w, h, fUpdate);
049371 ¤   }
9c67c5 ¤
127e82 ¤   catch(...) {
ab9371 ¤   }
d867c5 ¤
2e36ff ¤   ExitCallback();
adefe6 }
--e0d5 001b1b4d33440120182 Page 1 of CSizeWindowPatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
27867e ¤   $Id: CSizeWindowPatcher.h,v 1.3.8.1 1998/11/12 03:10:26 heller Exp $
aaf7f7 ____________________________________________________________________________*/
b5af5a
ac8d55 #pragma once·
5aaf5a
43f973 #include "CPatcher.h"
9caf5a
400190 class CSizeWindowPatcher¤   :¤  public¤ CPatcher {
475ed4 public:
af58ca #if¤TARGET_RT_MAC_CFM
d38a7d ¤   enum {kProcInfo =¤  kPascalStackBased
3173c9 ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(WindowRef)))
fa8a8b ¤   ¤   | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(short)))
8873ba ¤   ¤   | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(short)))
7853fa ¤   ¤   | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(Boolean)))};
d7db21 #else
291858 ¤   enum {kProcInfo = 0};
1b5d97 ¤   typedef pascal void¤¤   ¤   ¤   (*SizeWindowProc)(WindowRef theWindow,
d1245f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short w, short h,
d91ae6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean fUpdate);
447454 #endif
301b52 ¤   ¤
c9fa5b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CSizeWindowPatcher();
8faca1 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CSizeWindowPatcher();
4aaf5a
33a2d3 protected:
880869 ¤   static CSizeWindowPatcher *¤¤   sSizeWindowPatcher;
2867c5 ¤
48c7bf ¤   virtual void¤   ¤   ¤   ¤   ¤   NewSizeWindow(WindowRef theWindow,
c6245f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short w, short h,
f61ae6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean fUpdate);
f0af5a
bec174 ¤   virtual void¤   ¤   ¤   ¤   ¤   OldSizeWindow(WindowRef theWindow, short w,
d041fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short h,
cf1ae6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean fUpdate);
03af5a
813d80 ¤   static pascal ·void¤¤   ¤   ¤   SizeWindowCallback(WindowRef theWindow,
f9245f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short w, short h,
a41ae6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean fUpdate);
b182f7 };
--6a2f 00042f0536e40120183 Page 1 of CWaitNextEventDispatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
ecb70b ¤   $Id: CWaitNextEventDispatcher.cp,v 1.2.20.1 1998/11/12 03:10:26 heller Exp $
5ef7f7 ____________________________________________________________________________*/
63af5a
3ddcba #include "CWaitNextEventDispatcher.h"
23af5a
2faf5a
ef4c0f // Init statics
8c0bda SEventParams¤   CWaitNextEventDispatcher::sEventParams;
a8af5a
41af5a
9ece05 CWaitNextEventDispatcher::CWaitNextEventDispatcher()
20bb36 {
aaefe6 }
19af5a
50af5a
d8af5a
9d8644 CWaitNextEventDispatcher::~CWaitNextEventDispatcher()
f0bb36 {
a6efe6 }
ee67c5 ¤
bfaf5a
e9af5a
7e7e69 ¤   Boolean
1ccc13 CWaitNextEventDispatcher::NewWaitNextEvent(
b6bfd8 ¤   EventMask¤  ¤   eventMask,
dc31c6 ¤   EventRecord *¤  theEvent,
4c1b4e ¤   UInt32¤ ¤   ¤   sleep,
d3fcc6 ¤   RgnHandle¤  ¤   mouseRgn)
76cebb {¤
255168 ¤   try {
b3abb8 ¤   ¤   InitEventParms(eventMask, theEvent, sleep, mouseRgn);
589371 ¤   }
b867c5 ¤
37e0a3 ¤   catch (...) {
509371 ¤   }
8567c5 ¤
038d82 ¤   // Get the event
e8b311 ¤   sEventParams.result = OldWaitNextEvent(¤sEventParams.eventMask,
e15f46 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sEventParams.theEvent,
2c874c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sEventParams.sleep,
ebc51b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sEventParams.mouseRgn);
565168 ¤   try {
1e2da1 ¤   ¤   DispatchEvent();
6d9371 ¤   }
252b85 ¤   ¤   ¤   ¤
d3e0a3 ¤   catch (...) {
f19371 ¤   }
f367c5 ¤
d42f46 ¤   return sEventParams.result;
24efe6 }
f7af5a
80af5a
13af5a
7f6d52 ¤   void
e7c69f CWaitNextEventDispatcher::HandleNullEvent()
3dbb36 {
9b8f99 ¤   HandleIdleEvents();
24efe6 }
79af5a
08af5a
dbaf5a
5a6d52 ¤   void
89eca4 CWaitNextEventDispatcher::DispatchEvent()
bfbb36 {
d5c9c0 ¤   // Call repeating function
421963 ¤   HandleEveryEvent();
--c41c 000d613bcd140120183 Page 2 of CWaitNextEventDispatcher.cp
e0af5a
b65d18 ¤   // Dispatch
64bc76 ¤   switch (sEventParams.theEvent->what) {
df58c8 ¤   ¤   case nullEvent:
8e5b34 ¤   ¤   {
973bcc ¤   ¤   ¤   HandleNullEvent();
370fe4 ¤   ¤   }
b52f68 ¤   ¤   break;
851b52 ¤   ¤
0a4ea7 ¤   ¤   case mouseDown:
fc5b34 ¤   ¤   {
a7a8e6 ¤   ¤   ¤   HandleMouseDown();
e20fe4 ¤   ¤   }
2a2f68 ¤   ¤   break;
ff1b52 ¤   ¤
bc61db ¤   ¤   case mouseUp:
615b34 ¤   ¤   {
00a660 ¤   ¤   ¤   HandleMouseUp();
b30fe4 ¤   ¤   }
fa2f68 ¤   ¤   break;
c91b52 ¤   ¤
f0e68f ¤   ¤   case keyDown:
f75b34 ¤   ¤   {
39e240 ¤   ¤   ¤   HandleKeyDown();
620fe4 ¤   ¤   }
762f68 ¤   ¤   break;
941b52 ¤   ¤
ac5813 ¤   ¤   case keyUp:
c15b34 ¤   ¤   {
1c48d5 ¤   ¤   ¤   HandleKeyUp();
3d0fe4 ¤   ¤   }
932f68 ¤   ¤   break;
9baf5a
85610b ¤   ¤   case autoKey:
f25b34 ¤   ¤   {
ae7c9b ¤   ¤   ¤   HandleAutoKeyEvent();
940fe4 ¤   ¤   }
e92f68 ¤   ¤   break;
dbaf5a
6d7382 ¤   ¤   case updateEvt:
b25b34 ¤   ¤   {
89c29c ¤   ¤   ¤   HandleUpdateEvent();
e90fe4 ¤   ¤   }
6c2f68 ¤   ¤   break;
7a1b52 ¤   ¤
9ddc16 ¤   ¤   case diskEvt:
ec5b34 ¤   ¤   {
7cae40 ¤   ¤   ¤   HandleDiskEvent();
4d0fe4 ¤   ¤   }
dd2f68 ¤   ¤   break;
c41b52 ¤   ¤
a29875 ¤   ¤   case activateEvt:
e95b34 ¤   ¤   {
9c4ae6 ¤   ¤   ¤   HandleActivateEvent();
720fe4 ¤   ¤   }
812f68 ¤   ¤   break;
951b52 ¤   ¤
260731 ¤   ¤   case osEvt:
165b34 ¤   ¤   {
29f239 ¤   ¤   ¤   HandleOSEvent();
8b0fe4 ¤   ¤   }
802f68 ¤   ¤   break;
101b52 ¤   ¤
b86a16 ¤   ¤   case kHighLevelEvent:
955b34 ¤   ¤   {
cbf68e ¤   ¤   ¤   HandleHighLevelEvent();
e80fe4 ¤   ¤   }
2e2f68 ¤   ¤   break;
cc9371 ¤   }
a5efe6 }
c5af5a
d6af5a
--befa 0017ad790fa40120183 Page 3 of CWaitNextEventDispatcher.cp
e0af5a
2c6d52 ¤   void
d7fcd2 CWaitNextEventDispatcher::InitEventParms(
00bfd8 ¤   EventMask¤  ¤   eventMask,
8731c6 ¤   EventRecord *¤  theEvent,
111b4e ¤   UInt32¤ ¤   ¤   sleep,
a0fcc6 ¤   RgnHandle¤  ¤   mouseRgn)
babb36 {
d3fc0f ¤   // Set up eventparams
a362bc ¤   sEventParams.eventMask = eventMask;
394182 ¤   sEventParams.theEvent = theEvent;
a0b607 ¤   sEventParams.sleep = sleep;
b8791a ¤   sEventParams.mouseRgn = mouseRgn;
7d67c5 ¤
5677ca ¤   // Call PreFunction to allow filtering
77fa73 ¤   PreWaitNextEvent();
7aefe6 }
--a668 0016665933e40120184 Page 1 of CWaitNextEventDispatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
a239ff ¤   $Id: CWaitNextEventDispatcher.h,v 1.2.20.1 1998/11/12 03:10:27 heller Exp $
09f7f7 ____________________________________________________________________________*/
e0af5a
598d55 #pragma once·
11af5a
32732a #include "CWaitNextEventPatcher.h"
43af5a
279ebe typedef struct EventParamsS {
db3635 ¤   Boolean¤¤   ¤   result;
f16741 ¤   EventMask¤  ¤   eventMask;
ffe95f ¤   EventRecord *¤  theEvent;
c3c3d7 ¤   UInt32¤ ¤   ¤   sleep;
885ae7 ¤   RgnHandle¤  ¤   mouseRgn;
8a817b } SEventParams, * SEventParamsPtr;
1daf5a
5354c3 class CWaitNextEventDispatcher¤ :¤  public¤ CWaitNextEventPatcher {
fa5ed4 public:
21800d ¤   ¤   ¤   ¤   ¤   ¤   ¤   CWaitNextEventDispatcher();
050498 ¤   virtual¤¤   ¤   ¤   ¤   ~CWaitNextEventDispatcher();
a567c5 ¤
be5587 ¤   static SEventParamsPtr¤ GetEventParamsPtr() { return &sEventParams; }
251b52 ¤   ¤
fea2d3 protected:
8f9612 ¤   static SEventParams¤¤   sEventParams;
7e67c5 ¤
5666e9 ¤   virtual Boolean¤¤   ¤   NewWaitNextEvent(EventMask eventMask,
fc7f2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord * theEvent,
014720 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 sleep, RgnHandle mouseRgn);
5767c5 ¤
6bc65e ¤   virtual void¤   ¤   ¤   InitEventParms(EventMask eventMask,
642560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord * theEvent, UInt32 sleep,
bee838 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   RgnHandle mouseRgn);
5f52c0 ¤   virtual void¤   ¤   ¤   DispatchEvent();
04af5a
165ff6 ¤   virtual void¤   ¤   ¤   PreWaitNextEvent() { }
df67c5 ¤
881992 ¤   virtual void¤   ¤   ¤   HandleEveryEvent() { }
52ab51 ¤   virtual void¤   ¤   ¤   HandleIdleEvents() { }
f567c5 ¤
12d819 ¤   virtual void¤   ¤   ¤   HandleNullEvent();
17928b ¤   virtual void¤   ¤   ¤   HandleMouseDown() { }
25262e ¤   virtual void¤   ¤   ¤   HandleMouseUp() { }
050413 ¤   virtual void¤   ¤   ¤   HandleKeyDown() { }
439c3f ¤   virtual void¤   ¤   ¤   HandleKeyUp() { }
eac75a ¤   virtual void¤   ¤   ¤   HandleAutoKeyEvent() { }
2dc46b ¤   virtual void¤   ¤   ¤   HandleUpdateEvent() { }
5d1f55 ¤   virtual void¤   ¤   ¤   HandleDiskEvent() { }
48b7fe ¤   virtual void¤   ¤   ¤   HandleActivateEvent() { }
148d44 ¤   virtual void¤   ¤   ¤   HandleOSEvent() { }
49855c ¤   virtual void¤   ¤   ¤   HandleHighLevelEvent() { }
6682f7 };
--6344 000a02a31b940120185 Page 1 of CWaitNextEventPatcher.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
4750ea ¤   $Id: CWaitNextEventPatcher.cp,v 1.3.8.1 1998/11/12 03:10:28 heller Exp $
e0f7f7 ____________________________________________________________________________*/
5aaf5a
1970b5 #include <SetupA4.h>
61af5a
17732a #include "CWaitNextEventPatcher.h"
8caf5a
eaaf5a
e7af5a
c76213 // Define statics
87f1bc CWaitNextEventPatcher *¤CWaitNextEventPatcher::sWaitNextEventPatcher = nil;
18af5a
2f79c6 CWaitNextEventPatcher::CWaitNextEventPatcher()
09bb36 {
11c6af ¤   // Current version will only install one patch
b8a7f4 ¤   if (sWaitNextEventPatcher == nil) {
5e901d ¤   ¤   Patch(_WaitNextEvent, kProcInfo, (ProcPtr) WaitNextEventCallback);
2722e8 ¤   ¤   sWaitNextEventPatcher = this;
859371 ¤   }
43efe6 }
96af5a
62af5a
b6af5a
26f850 CWaitNextEventPatcher::~CWaitNextEventPatcher()
fbbb36 {
9aefe6 }
9eaf5a
0daf5a
50af5a
ed7e69 ¤   Boolean
0dad5c CWaitNextEventPatcher::NewWaitNextEvent(
f2bfd8 ¤   EventMask¤  ¤   eventMask,
8d31c6 ¤   EventRecord *¤  theEvent,
0c1b4e ¤   UInt32¤ ¤   ¤   sleep,
1bfcc6 ¤   RgnHandle¤  ¤   mouseRgn)
75bb36 {
83a582 ¤   // default just calls through to the original
f028bf ¤   return OldWaitNextEvent(eventMask, theEvent, sleep, mouseRgn);
c6efe6 }
3baf5a
39af5a
34af5a
2f7e69 ¤   Boolean
a3fe65 CWaitNextEventPatcher::OldWaitNextEvent(
e7bfd8 ¤   EventMask¤  ¤   eventMask,
3131c6 ¤   EventRecord *¤  theEvent,
1f1b4e ¤   UInt32¤ ¤   ¤   sleep,
f2fcc6 ¤   RgnHandle¤  ¤   mouseRgn)
83bb36 {
ce58ca #if¤TARGET_RT_MAC_CFM
05891e ¤   return (Boolean) ::CallUniversalProc(¤  mOldRoutine,
fc7fb3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kProcInfo,
0723d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   eventMask,
7d487c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theEvent,
cedd49 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sleep,
955bd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mouseRgn);
86db21 #else
0ece43 ¤   return ((WaitNextEventProc) mOldRoutine)(¤  eventMask,
3d4b0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theEvent,
23cc6e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sleep,
3c5cee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mouseRgn);
7e7454 #endif
22efe6 }
bcaf5a
20af5a
a0af5a
--23e5 0016d98f06540120185 Page 2 of CWaitNextEventPatcher.cp
4b99cb ¤   pascal Boolean
e075bf CWaitNextEventPatcher::WaitNextEventCallback(
59bfd8 ¤   EventMask¤  ¤   eventMask,
2531c6 ¤   EventRecord *¤  theEvent,
111b4e ¤   UInt32¤ ¤   ¤   sleep,
95fcc6 ¤   RgnHandle¤  ¤   mouseRgn)
4ebb36 {
246aab ¤   EnterCallback();
42af5a
26a182 ¤   Boolean¤result = false;
0eaf5a
635168 ¤   try {
9fb3ec ¤   ¤   result = sWaitNextEventPatcher->NewWaitNextEvent(¤  eventMask,
340031 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theEvent,
a6464b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sleep,
d5c27c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mouseRgn);
799371 ¤   }
e267c5 ¤
877e82 ¤   catch(...) {
849371 ¤   }
0667c5 ¤
6b36ff ¤   ExitCallback();
cb5d73 ¤   return result;
6defe6 }
--4b68 00191b618e840120186 Page 1 of CWaitNextEventPatcher.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
c82344 ¤   $Id: CWaitNextEventPatcher.h,v 1.3.8.1 1998/11/12 03:10:28 heller Exp $
47f7f7 ____________________________________________________________________________*/
84af5a
7e8d55 #pragma once·
37af5a
4bf973 #include "CPatcher.h"
9faf5a
6046ff class CWaitNextEventPatcher¤:¤  public¤ CPatcher {
675ed4 public:
5358ca #if¤TARGET_RT_MAC_CFM
ea99a8 ¤   enum {kProcInfo = kPascalStackBased
a12a9e ¤   ¤   | RESULT_SIZE(SIZE_CODE(sizeof(Boolean)))
590989 ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(EventMask)))
612787 ¤   ¤   | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(EventRecord *)))
b976de ¤   ¤   | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(UInt32)))
944717 ¤   ¤   | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(RgnHandle)))};
e6db21 #else
471858 ¤   enum {kProcInfo = 0};
0ffe82 ¤   typedef pascal Boolean ¤¤   ¤   (*WaitNextEventProc)(EventMask eventMask,
1d3466 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord * theEvent,
c88407 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 sleep, RgnHandle mouseRgn);
d17454 #endif
101b52 ¤   ¤
98a02d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CWaitNextEventPatcher();
57d844 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CWaitNextEventPatcher();
5daf5a
8aa2d3 protected:
1a08b3 ¤   static CWaitNextEventPatcher *¤ sWaitNextEventPatcher;
f667c5 ¤
d8da00 ¤   virtual Boolean¤¤   ¤   ¤   ¤   NewWaitNextEvent(EventMask eventMask,
bb3466 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord * theEvent,
4e8407 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 sleep, RgnHandle mouseRgn);
9eaf5a
5558a0 ¤   virtual Boolean¤¤   ¤   ¤   ¤   OldWaitNextEvent(EventMask eventMask,
063466 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord * theEvent,
63ee8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 sleep, RgnHandle mouseRgn);¤
05af5a
9a18d4 ¤   static pascal Boolean¤  ¤   ¤   WaitNextEventCallback(EventMask eventMask,
91c407 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord *theEvent, UInt32 sleep,
26a1be ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   RgnHandle mouseRgn);
9182f7 };
--4506 001116098b740120187 Page 1 of CRestorePortColorsAttachment.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
6a46e5 ¤   $Id: CRestorePortColorsAttachment.cp,v 1.4.8.1 1998/11/12 03:10:30 heller E¶
59fda4 xp $
a5f7f7 ____________________________________________________________________________*/
77af5a
4bf38b #include <LStream.h>
0a60c3 #include <LPane.h>
05af5a
195b4e #include "CRestorePortColorsAttachment.h"
9caf5a
76af5a
a3af5a
408ab9 CRestorePortColorsAttachment::CRestorePortColorsAttachment(
dbb6e4 ¤   Boolean¤inForeColor,
5f9e49 ¤   Boolean inBackColor,
4812c5 ¤   Boolean¤inExecuteHost)
5453de ¤   ¤   : LAttachment(msg_DrawOrPrint, inExecuteHost),
86cb4d ¤   ¤   mForeColor(inForeColor), mBackColor(inBackColor)¤   ¤
77bb36 {
f9efe6 }
f4af5a
6eaf5a
50af5a
f38ab9 CRestorePortColorsAttachment::CRestorePortColorsAttachment(
d0cbb0 ¤   LStream *¤  inStream)
6f37ab ¤   ¤   : LAttachment(inStream)
3dbb36 {
67803e ¤   inStream->ReadData(&mForeColor, sizeof(Boolean));
173380 ¤   inStream->ReadData(&mBackColor, sizeof(Boolean));
2fefe6 }
54ae30 ¤   ¤   ¤   ¤   ¤
a8af5a
51af5a
d66d52 ¤   void
184b9e CRestorePortColorsAttachment::ExecuteSelf(
027b08 ¤   MessageT¤   inMessage,
d4121e ¤   void *¤ ¤   ioParam)
8cbb36 {
4fe9c8 ¤   (void) inMessage;
2328bb ¤   (void) ioParam;
2667c5 ¤
d53d3e ¤   RGBColor¤   foreColor;
a160f4 ¤   RGBColor¤   backColor;
f467c5 ¤
0ee12d ¤   ::GetForeColor(&foreColor);
7c72ff ¤   ::GetBackColor(&backColor);
a467c5 ¤
0881c2 ¤   dynamic_cast<LPane *>(GetOwnerHost())->ApplyForeAndBackColors();
9492df ¤   if (!mForeColor) {
b3c70f ¤   ¤   ::RGBForeColor(&foreColor);
8e9371 ¤   }
32a17c ¤   if (! mBackColor) {
ef54dd ¤   ¤   ::RGBBackColor(&backColor);
769371 ¤   }
11be43 }¶
--22f1 00104b9b0ba40120188 Page 1 of CRestorePortColorsAttachment.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
05e0ee ¤   $Id: CRestorePortColorsAttachment.h,v 1.3.18.1 1998/11/12 03:10:31 heller E¶
69fda4 xp $
72f7f7 ____________________________________________________________________________*/
46af5a
0a8d55 #pragma once·
55af5a
e242d4 #include <LAttachment.h>
1aaf5a
b9ae3f class¤  CRestorePortColorsAttachment : public LAttachment {
e45ed4 public:
506476 ¤   enum { class_ID = 'RPCA' };
dc67c5 ¤
114db6 ¤   ¤   ¤   ¤   ¤   CRestorePortColorsAttachment(
5e91d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inForeColor = true,
dc4c2a ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inBackColor = true,
7cc711 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   inExecuteHost = true);
e5e818 ¤   ¤   ¤   ¤   ¤   CRestorePortColorsAttachment(LStream * inStream);
8eae30 ¤   ¤   ¤   ¤   ¤
b4a2d3 protected:
2a85d8 ¤   Boolean¤¤   ¤   mForeColor;
0cd812 ¤   Boolean¤¤   ¤   mBackColor;
ab67c5 ¤
b6686b ¤   virtual void¤   ExecuteSelf(MessageT inMessage, void *ioParam);
0482f7 };
--90ab 000130e411a40120189 Page 1 of CSaveRestoreScrap.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
303319 ¤   $Id: CSaveRestoreScrap.cp,v 1.5.8.1 1998/11/12 03:10:32 heller Exp $
cbf7f7 ____________________________________________________________________________*/
e7af5a
88bbf4 #include "MacFiles.h"
9faf5a
7cfd50 #include "CSaveRestoreScrap.h"
33af5a
daaf5a
42af5a
a4432d CSaveRestoreScrap::CSaveRestoreScrap()
c66783 ¤   : mSavedScrap(nil), mScrapFile(nil), mRestore(false),
348279 ¤   mMemoryMgr(kInvalidPGPMemoryMgrRef)
05bb36 {
efe4eb ¤   Save();
21efe6 }
8baf5a
d5af5a
9caf5a
8c8ab2 CSaveRestoreScrap::~CSaveRestoreScrap()
e3bb36 {
89d8cf ¤   if (mRestore) {
ceac5f ¤   ¤   Restore();
659371 ¤   }
7567c5 ¤
ed9a53 ¤   if( PGPMemoryMgrRefIsValid( mMemoryMgr ) )
a073b3 ¤   ¤   PGPFreeMemoryMgr( mMemoryMgr );
41af5a
9a1eab ¤   delete mSavedScrap;
ea67e7 ¤   delete mScrapFile;
46efe6 }
c9af5a
a4af5a
36af5a
376d52 ¤   void
2d1733 CSaveRestoreScrap::Save()
81bb36 {
76980d ¤   // Save the scrap state
c60f94 ¤   mScrapSize = ::LMGetScrapSize();
dcdf09 ¤   mScrapState = ::LMGetScrapState();
c93e39 ¤   mScrapLoaded = (::LMGetScrapHandle() != nil);
9b67c5 ¤
cf10b5 ¤   // Unload the scrap if it is loaded
b3f5c0 ¤   if (mScrapLoaded) {
00b9fc ¤   ¤   ::UnloadScrap();
b89371 ¤   }
f867c5 ¤
f8fcb0 ¤   // Save the scrap in a temp file
b430bd ¤   OSErr¤  ¤   err;
baf7ef ¤   PGPError¤   pgpErr;
6fa246 ¤   SInt16¤ ¤   vRefNum;
2f9332 ¤   SInt32¤ ¤   parID;
3ba3da ¤   FSSpec¤ ¤   scrapSpec;
99cb15 ¤   FSSpec¤ ¤   savedScrapSpec;
a267c5 ¤
dfc438 ¤   err = ::FindFolder(¤kOnSystemDisk,
d7f3ed ¤   ¤   ¤   ¤   ¤   ¤   kSystemFolderType,
f54261 ¤   ¤   ¤   ¤   ¤   ¤   false,
afd1ca ¤   ¤   ¤   ¤   ¤   ¤   &vRefNum,
1f71c9 ¤   ¤   ¤   ¤   ¤   ¤   &parID);
ba5e5c ¤   PGPThrowIfOSErr_(err);
1467c5 ¤
0d2596 ¤   ::FSMakeFSSpec(¤vRefNum,
d1a70e ¤   ¤   ¤   ¤   ¤   parID,
2544ad ¤   ¤   ¤   ¤   ¤   ::LMGetScrapName(),
9cb843 ¤   ¤   ¤   ¤   ¤   &scrapSpec);
13810b ¤   mScrapFile = new LFile(scrapSpec);
--cbdd 001dfce5b3c40120189 Page 2 of CSaveRestoreScrap.cp
82ef82 ¤   PGPThrowIfNil_(mScrapFile);
1d7ab6 ¤   mSavedScrap = new CTempFile(mScrapFile, false);
f9e4c2 ¤   PGPThrowIfNil_(mSavedScrap);
af90e9 ¤   mSavedScrap->GetSpecifier(savedScrapSpec);
33e286 ¤   pgpErr = PGPNewMemoryMgr( 0, &mMemoryMgr );
0b8d03 ¤   PGPThrowIfPGPErr_( pgpErr );
1902a6 ¤   err = FSpCopyFiles(mMemoryMgr, &scrapSpec, &savedScrapSpec);
2f5e5c ¤   PGPThrowIfOSErr_(err);
5a67c5 ¤
3ada30 ¤   // Reload the scrap if necessary
e3f5c0 ¤   if (mScrapLoaded) {
2423aa ¤   ¤   ::LoadScrap();
169371 ¤   }
9b67c5 ¤
929fdb ¤   mRestore = true;
7defe6 }
faaf5a
ddaf5a
12af5a
896d52 ¤   void
6d86f7 CSaveRestoreScrap::Restore()
cdbb36 {
a9a3da ¤   FSSpec¤ ¤   scrapSpec;
512d00 ¤   SInt16¤ ¤   refNum;
a2dc42 ¤   OSStatus¤   err;
b7ef93 ¤   SInt32¤ ¤   numBytes;
dc67c5 ¤
89c59c ¤   ::ZeroScrap();
26082d ¤   ::UnloadScrap();
0567c5 ¤
2e9dc0 ¤   mScrapFile->GetSpecifier(scrapSpec);¤
3b8464 ¤   err = FSpFindOpenForkRef(¤  &scrapSpec,
a28fed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false,
c148a8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &refNum);
085e5c ¤   PGPThrowIfOSErr_(err);
70103d ¤   mSavedScrap->OpenDataFork(fsRdPerm);
12a805 ¤   err = ::GetEOF(mSavedScrap->GetDataForkRefNum(), &numBytes);
395e5c ¤   PGPThrowIfOSErr_(err);
2f36bc ¤   err = ::SetEOF(refNum, numBytes);
c55e5c ¤   PGPThrowIfOSErr_(err);
2346db ¤   err = ::SetFPos(refNum, fsFromStart, 0);
7e5e5c ¤   PGPThrowIfOSErr_(err);
ce72ee ¤   err = FSCopyBytes(¤ mMemoryMgr,
37f19d ¤   ¤   ¤   ¤   ¤   ¤   mSavedScrap->GetDataForkRefNum(),
e6da84 ¤   ¤   ¤   ¤   ¤   ¤   0,
979604 ¤   ¤   ¤   ¤   ¤   ¤   refNum,
b5da84 ¤   ¤   ¤   ¤   ¤   ¤   0,
5e7ae7 ¤   ¤   ¤   ¤   ¤   ¤   numBytes);
b767c5 ¤
39c36a ¤   ::LMSetScrapSize(mScrapSize);
50b9a4 ¤   ::LMSetScrapState(0);
f9f5c0 ¤   if (mScrapLoaded) {
5923aa ¤   ¤   ::LoadScrap();
b19371 ¤   }
256cc6 ¤   ::LMSetScrapState(mScrapState);
dfbe43 }¶
--b8d4 0011efa12c54012018a Page 1 of CSaveRestoreScrap.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
4291bd ¤   $Id: CSaveRestoreScrap.h,v 1.4.8.1 1998/11/12 03:10:33 heller Exp $
a7f7f7 ____________________________________________________________________________*/
05af5a
f28d55 #pragma once·
33af5a
716773 #include "pgpMemoryMgr.h"
cfaf5a
92043a #include "CTempFile.h"
a0af5a
0b577a class CSaveRestoreScrap {
db5ed4 public:
b9ab28 ¤   ¤   ¤   ¤   CSaveRestoreScrap();
75f904 ¤   ¤   ¤   ¤   ~CSaveRestoreScrap();
7587c7 ¤   ¤   ¤
8d974c ¤   void¤   ¤   Save();
681782 ¤   void¤   ¤   Restore();
ea67c5 ¤
517976 ¤   void¤   ¤   SetRestore(Boolean inRestore) { mRestore = inRestore; }
1567c5 ¤
17a2d3 protected:
efdb5d ¤   Boolean¤¤   ¤   mScrapLoaded;
d5b58a ¤   SInt32¤ ¤   ¤   mScrapSize;
5b8e11 ¤   SInt16¤ ¤   ¤   mScrapState;
a3f7de ¤   CTempFile *¤¤   mSavedScrap;
5e3fa9 ¤   LFile *¤¤   ¤   mScrapFile;
a3d120 ¤   Boolean¤¤   ¤   mRestore;
412d1b ¤   PGPMemoryMgrRef¤mMemoryMgr;
1ebf26 };¶
--8d78 00033ddd6b44012018b Page 1 of CShareholderList.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
625c9f ¤   $Id: CShareholderList.cp,v 1.4.8.1 1998/11/12 03:10:34 heller Exp $
83f7f7 ____________________________________________________________________________*/
66af5a
dd255b #include <Fonts.h>
f4af5a
a17c52 #include <LTableMonoGeometry.h>
fd2ab7 #include <LTableSingleSelector.h>
637b38 #include <LTableArrayStorage.h>
e08f92 #include <UGAColorRamp.h>
bfe8ae #include <UDrawingUtils.h>
f2af5a
b785c2 #include "MacStrings.h"
62af5a
5e8ac0 #include "CShareholderList.h"
56af5a
b77f40 static const ResIDT¤kRSAUserIDIconID¤   =¤  3002;
60c77f static const ResIDT¤kDHUserIDIconID¤¤   =¤  3020;
4eed53 static const ResIDT kConventionalIconID¤=¤  3032;
ffaf5a
353389 const Int16¤¤   kUserIDColumnWidth¤ ¤   =¤  260;
a2dcad const Int16¤¤   kSharesColumnWidth¤ ¤   =¤  32;
58fc7c const Int16¤¤   kUserIDStringLength¤¤   =¤  256;
bff7c8 const Int16¤¤   kLeftIndent¤¤   ¤   ¤   =¤  2;
e955d9 const Int16¤¤   kIconWidth¤ ¤   ¤   ¤   =¤  16;
6e3d88 const Int16¤¤   kIconHeight¤¤   ¤   ¤   =¤  16;
82af5a
2caf5a
3cfd52 CShareholderList::CShareholderList(
1b6689 ¤   LStream¤*inStream)
f4ba7e ¤   ¤   : LTableView(inStream)
fcbb36 {
d87524 ¤   mTableGeometry = new LTableMonoGeometry(this, mFrameSize.width, 18);
56f97f ¤   mTableSelector = new LTableSingleSelector(this);
2d1783 ¤   mTableStorage = new LTableArrayStorage(this, sizeof(ShareholderListEntry));
38efe6 }
dfaf5a
8d6d52 ¤   void
dec634 CShareholderList::DrawSelf()
fdbb36 {
0ed8a7 ¤   Rect frame;
0daf5a
c3e710 ¤   RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
fac6eb ¤   RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
f740bf ¤   CalcLocalFrameRect(frame);
b6b49b ¤   EraseRect(&frame);
d1de04 ¤   LTableView::DrawSelf();
13efe6 }
c8af5a
3f6d52 ¤   void
fb1a99 CShareholderList::DrawCell(
631bb3 ¤   const STableCell¤   &inCell,
4bc050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
5dbb36 {
597988 ¤   StDeviceLoop¤   ¤   devLoop(inLocalRect);¤  ¤
3a5583 ¤   SInt16¤ ¤   ¤   ¤   depth,
48eb45 ¤   ¤   ¤   ¤   ¤   ¤   iconID;
a02f29 ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof(ShareholderListEntry);
c7a6dc ¤   ShareholderListEntry holder;
9e3661 ¤   Str255¤ ¤   ¤   ¤   str;
2edd82 ¤   Rect¤   ¤   ¤   ¤   iconRect;
96af5a
ea2ec3 ¤   while(devLoop.NextDepth(depth))
b3c7a1 ¤   {
155159 ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
5570a2 ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
3376c9 ¤   ¤   ::EraseRect(&inLocalRect);
--6450 001757b16f44012018b Page 2 of CShareholderList.cp
cd3324 ¤   ¤   GetCellData(inCell, &holder, dataSize);
331b52 ¤   ¤
f96647 ¤   ¤   iconRect.left ¤ = ¤ inLocalRect.left + kLeftIndent;
04253e ¤   ¤   iconRect.top¤   =¤  inLocalRect.top + 1;
7ded83 ¤   ¤   iconRect.right ¤= ¤ iconRect.left + kIconWidth;
567190 ¤   ¤   iconRect.bottom = ¤ iconRect.top + kIconHeight;
a31b52 ¤   ¤
3f2ff9 ¤   ¤   switch( holder.algorithm )
715b34 ¤   ¤   {
6b7db2 ¤   ¤   ¤   case kPGPPublicKeyAlgorithm_DSA:
5cad20 ¤   ¤   ¤   ¤   iconID = kDHUserIDIconID;
83f622 ¤   ¤   ¤   ¤   break;
04f26a ¤   ¤   ¤   case kPGPPublicKeyAlgorithm_RSA:
44ce09 ¤   ¤   ¤   ¤   iconID = kRSAUserIDIconID;
0cf622 ¤   ¤   ¤   ¤   break;
0bdb68 ¤   ¤   ¤   default:
8f19b3 ¤   ¤   ¤   ¤   iconID = kConventionalIconID;
baf622 ¤   ¤   ¤   ¤   break;
5e0fe4 ¤   ¤   }
1e6e45 ¤   ¤   PlotIconID(&iconRect, atNone, ttNone, iconID );
6a1b52 ¤   ¤
f1523b ¤   ¤   CToPString( holder.name, str );
400ea2 ¤   ¤   ::TextSize(9);
abde3c ¤   ¤   ::TextFont(kFontIDGeneva);
a7a301 ¤   ¤   ::TextFace(0);
6a62f7 ¤   ¤   ::TruncString(¤ kUserIDColumnWidth - 22, str, truncMiddle);
7b829c ¤   ¤   ::MoveTo(inLocalRect.left + 22, inLocalRect.bottom - 5);
68d759 ¤   ¤   ::DrawString(str);
aac623 ¤   ¤   ::MoveTo(¤  inLocalRect.left + kUserIDColumnWidth + 4,
5bc38a ¤   ¤   ¤   ¤   ¤   inLocalRect.bottom -5);
160d52 ¤   ¤   NumToString( holder.numShares, str );
31d759 ¤   ¤   ::DrawString(str);
fc9371 ¤   }
b6efe6 }
7caf5a
146d52 ¤   void
44ac89 CShareholderList::DeactivateSelf()
46bb36 {
2c3895 ¤   Draw( NULL );
a2af5a
64b4b3 ¤   LTableView::DeactivateSelf();
6fefe6 }
d3af5a
d46d52 ¤   void
23aaa9 CShareholderList::ActivateSelf()
74bb36 {
73d368 ¤   LTableView::ActivateSelf();
17af5a
154fc9 ¤   Refresh();
ccefe6 }
c2af5a
8c6d52 ¤   void
d052e4 CShareholderList::ClickSelf(
cdc267 ¤   const SMouseDownEvent &inMouseDown)
f5bb36 {
2ec8c2 ¤   LTableView::ClickSelf(inMouseDown);
c5efe6 }
a0af5a
696d52 ¤   void
4aab69 CShareholderList::SelectionChanged()
dfbb36 {
68635a ¤   BroadcastMessage(kSLSelectionChangedMessageID, NULL);
11efe6 }
75af5a
--d194 00151d1d7ea4012018c Page 1 of CShareholderList.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
86041e ¤   $Id: CShareholderList.h,v 1.1.8.1 1998/11/12 03:10:35 heller Exp $
3cf7f7 ____________________________________________________________________________*/
887b7d #pragma once
74af5a
61a787 #include <LTableView.h>
50ea2f #include <LBroadcaster.h>
efaf5a
fce82c #include "pgpPubTypes.h"
1baf5a
d5b3bb const MessageT¤ kSLSelectionChangedMessageID¤   = 'cdSC';
fdaf5a
d2ffd8 const PGPUInt16¤kMaxShareholderUserIDLength¤¤   = 255;
4aaf5a
9130aa typedef struct ShareholderListEntry
6cbb36 {
1a731e ¤   PGPBoolean¤ ¤   ¤   ¤   hasKey;
613f1b ¤   PGPKeyID¤   ¤   ¤   ¤   keyID;
3fea37 ¤   PGPPublicKeyAlgorithm¤  algorithm;
669c4c ¤   char¤   ¤   ¤   ¤   ¤   name[kMaxShareholderUserIDLength + 1];
691f8f ¤   char¤   ¤   ¤   ¤   ¤   *phrase;
2d62b8 ¤   PGPUInt32¤  ¤   ¤   ¤   numShares;
c109a1 } ShareholderListEntry;
e4af5a
a3ef7d class CShareholderList¤ :¤  public LTableView,
bbcf7c ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster
56bb36 {
195ed4 public:
c4e845 ¤   enum { class_ID = 'shaL' };¤
0d3cd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CShareholderList(LStream *inStream);
64c520 ¤   void¤   ¤   ¤   ¤   ¤   DrawSelf();
e8700d ¤   void¤   ¤   ¤   ¤   ¤   DrawCell(
7e6d8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &inCell,
1b8e01 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect¤ ¤   ¤   &inLocalRect);
a18023 ¤   void¤   ¤   ¤   ¤   ¤   ClickSelf(
f6098f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent &inMouseDown);
91d2d3 ¤   void¤   ¤   ¤   ¤   ¤   DeactivateSelf();
8c82e4 ¤   void¤   ¤   ¤   ¤   ¤   ActivateSelf();
69cb1e ¤   void¤   ¤   ¤   ¤   ¤   SelectionChanged();
0f82f7 };
51af5a
--1b73 000bfa62d4d4012018d Page 1 of CString.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
a056bd ¤   $Id: CString.cp,v 1.5.20.1 1998/11/12 03:10:36 heller Exp $
65f7f7 ____________________________________________________________________________*/
9faf5a
61324c #include <string.h>
1faf5a
770d08 #include "pgpMem.h"
610bb4 #include "CString.h"
9baf5a
4daf5a
45af5a
7fb677 CString::CString()
26bb36 {
889e5e ¤   InitString("", 0, 0);
32efe6 }
b5af5a
66af5a
73af5a
a6f710 CString::CString(
d2fb6d ¤   const Str255¤   inString,
6c277f ¤   UInt32¤ ¤   ¤   inBufSize)
f7bb36 {
51957e ¤   InitString((const char *) &inString[1], inString[0], inBufSize);
9aefe6 }
d1af5a
4faf5a
76af5a
72f710 CString::CString(
1d1e20 ¤   const char *¤   inString,
48277f ¤   UInt32¤ ¤   ¤   inBufSize)
13bb36 {
fb1b47 ¤   InitString(inString, strlen(inString), inBufSize);
20efe6 }
37af5a
6caf5a
99af5a
99f710 CString::CString(
2d4eda ¤   ResIDT¤ inResID,
fe215c ¤   SInt16¤ inIndex)
cfbb36 {
4c37c8 ¤   if (inIndex > 0) {
2e522b ¤   ¤   Str255¤ theString;
2f67c5 ¤
9bbfa1 ¤   ¤   ::GetIndString(theString, inResID, inIndex);
cbedf1 ¤   ¤   InitString((const char *) &theString[1], theString[0], 0);
18f037 ¤   } else {
ff9c76 ¤   ¤   StringHandle¤   theStringH = ::GetString(inResID);
081b52 ¤   ¤
ae5bda ¤   ¤   if (theStringH != nil) {
74fb13 ¤   ¤   ¤   StHandleLocker¤ theLock((Handle) theStringH);
c687c7 ¤   ¤   ¤
62cb39 ¤   ¤   ¤   InitString((const char *) &(*theStringH)[1], (*theStringH)[0], 0);
500fe4 ¤   ¤   }
6b9371 ¤   }
b9efe6 }
02af5a
ddaf5a
04af5a
b6f710 CString::CString(
177d28 ¤   SInt32¤ inNumber)
efbb36 {
dcb0ca ¤   Str255¤ theString;
0067c5 ¤
66e6a2 ¤   ::NumToString(inNumber, theString);
a5600d ¤   InitString((const char *) &theString[1], theString[0], 0);
76efe6 }
bfaf5a
--ff1d 000c0cfc47d4012018d Page 2 of CString.cp
e0af5a
1aaf5a
de247a CString::~CString()
acbb36 {
def012 ¤   if (mClearOnDelete) {
5ec13f ¤   ¤   pgpClearMemory(¤mBuffer,
6a5710 ¤   ¤   ¤   ¤   ¤   ¤   mBufSize + 2);
5b9371 ¤   }
d388dd ¤   delete [] mBuffer;
9cefe6 }
99af5a
8faf5a
1caf5a
396d52 ¤   void
7171b4 CString::InitString()
98bb36 {
9630ad ¤   mUpdateString = updateString_None;
ca988b ¤   mLength = 0;
9dad44 ¤   mBufSize = 0;
f1a7a9 ¤   mBuffer = nil;
fecec5 ¤   mClearOnDelete = false;
8de609 ¤   AllocateBuffer(mBufSize);
d0efe6 }
1aaf5a
73af5a
336d52 ¤   void
a530c1 CString::InitString(
391fef ¤   const char *¤   inBuffer,
98eaf5 ¤   UInt32¤ ¤   ¤   inLength,
30277f ¤   UInt32¤ ¤   ¤   inBufSize)
edbb36 {
ed30ad ¤   mUpdateString = updateString_None;
8967c5 ¤
452c9c ¤   if (inBufSize < inLength) {
cf9194 ¤   ¤   mBufSize = inLength;
d6f037 ¤   } else {
43fa3a ¤   ¤   mBufSize = inBufSize;
259371 ¤   }
0467c5 ¤
c82e71 ¤   mLength = inLength;
2f67c5 ¤
daa7a9 ¤   mBuffer = nil;
ade609 ¤   AllocateBuffer(mBufSize);
0167c5 ¤
8fd3dd ¤   ::BlockMoveData(¤   inBuffer,
49a5ef ¤   ¤   ¤   ¤   ¤   ¤   &mBuffer[1],
6c0585 ¤   ¤   ¤   ¤   ¤   ¤   inLength);
090403 ¤   AdjustStringsToLength();
d6efe6 }
9daf5a
68af5a
b1af5a
166d52 ¤   void
942db0 CString::SetLength(
f8c222 ¤   UInt32¤ inLength)
6dbb36 {
2264b9 ¤   if (inLength > mBufSize) {
baa2ed ¤   ¤   ReallocateBuffer(inLength);
cf9371 ¤   }
c767c5 ¤
832e71 ¤   mLength = inLength;
480403 ¤   AdjustStringsToLength();
60efe6 }
52af5a
e8af5a
ffaf5a
ac5b12 ¤   UInt8
dee6bd CString::GetPLength() const
e3bb36 {
3c5bb6 ¤   switch(mUpdateString) {
ed3a10 ¤   ¤   case updateString_PString:
c01857 ¤   ¤   ¤   UpdatePString();
--5345 000c892c3374012018d Page 3 of CString.cp
7ecdcb ¤   ¤   ¤   break;
4b9371 ¤   }
fe85e0 ¤   return mBuffer[0];
e4efe6 }
1eaf5a
e4af5a
c5af5a
93cd56 ¤   UInt32
52920c CString::GetLength() const
ebbb36 {
2d5bb6 ¤   switch(mUpdateString) {
013a10 ¤   ¤   case updateString_PString:
cb1857 ¤   ¤   ¤   UpdatePString();
9dcdcb ¤   ¤   ¤   break;
9787c7 ¤   ¤   ¤
a71383 ¤   ¤   case updateString_CString:
ba97a1 ¤   ¤   ¤   UpdateCString();
1ecdcb ¤   ¤   ¤   break;
119371 ¤   }
3c9bd4 ¤   return mLength;
3defe6 }
f5af5a
45af5a
96af5a
586d52 ¤   void
dd1b3e CString::AllocateBuffer(
5bbcd8 ¤   UInt32¤ inBufSize)
edbb36 {
3488dd ¤   delete [] mBuffer;
8767c5 ¤
5fccea ¤   // The buffer should always be at least large enough for a pascal string
9a2c09 ¤   if (inBufSize < 255) {
e08923 ¤   ¤   inBufSize = 255;
479371 ¤   }
d767c5 ¤
f808fe ¤   mBuffer = new char[inBufSize + 2];
ea375a ¤   PGPThrowIfNil_(mBuffer);
89736e ¤   mBufSize = inBufSize;
2befe6 }
b9af5a
bcaf5a
2caf5a
e36d52 ¤   void
c77511 CString::ReallocateBuffer(
b6bcd8 ¤   UInt32¤ inBufSize)
6dbb36 {
30d753 ¤   char *¤ theBuffer = mBuffer;
6c67c5 ¤
e85bb6 ¤   switch(mUpdateString) {
233a10 ¤   ¤   case updateString_PString:
6e1857 ¤   ¤   ¤   UpdatePString();
7dcdcb ¤   ¤   ¤   break;
fb87c7 ¤   ¤   ¤
d21383 ¤   ¤   case updateString_CString:
c597a1 ¤   ¤   ¤   UpdateCString();
d0cdcb ¤   ¤   ¤   break;
c89371 ¤   }
1baf5a
7308fe ¤   mBuffer = new char[inBufSize + 2];
ec375a ¤   PGPThrowIfNil_(mBuffer);
7867c5 ¤
f893b5 ¤   ::BlockMoveData(¤   theBuffer,
d6bb7a ¤   ¤   ¤   ¤   ¤   ¤   mBuffer,
9bc572 ¤   ¤   ¤   ¤   ¤   ¤   mLength + 2);
41f581 ¤   delete [] theBuffer;
8b67c5 ¤
7f736e ¤   mBufSize = inBufSize;
62efe6 }
22af5a
5baf5a
3eaf5a
c8e569 ¤   ConstStringPtr
--a36a 000091bdd1c4012018d Page 4 of CString.cp
02b2ae CString::GetConstPString()
d9bb36 {
fe7f22 ¤   if (mUpdateString == updateString_PString) {
5d2c0a ¤   ¤   UpdatePString();
6a9371 ¤   }
03a850 ¤   return (ConstStringPtr) mBuffer;
68efe6 }
e4af5a
f1af5a
0daf5a
62997e ¤   StringPtr
f71632 CString::GetPString()
50bb36 {
c47f22 ¤   if (mUpdateString == updateString_PString) {
a72c0a ¤   ¤   UpdatePString();
7e9371 ¤   }
3d6337 ¤   mUpdateString = updateString_CString;
23a099 ¤   return (StringPtr) mBuffer;
77efe6 }
acaf5a
b1af5a
45af5a
42d2ab ¤   const char *
791495 CString::GetConstCString()
6ebb36 {
f3f0d4 ¤   if (mUpdateString == updateString_CString) {
75a3fc ¤   ¤   UpdateCString();
4a9371 ¤   }
7486c5 ¤   return static_cast<const char *>(&mBuffer[1]);
0befe6 }
a1af5a
ccaf5a
c2af5a
b0d25c ¤   char *
0db009 CString::GetCString()
4bbb36 {
8bf0d4 ¤   if (mUpdateString == updateString_CString) {
87a3fc ¤   ¤   UpdateCString();
e49371 ¤   }
ac4aa4 ¤   mUpdateString = updateString_PString;
bc9757 ¤   return static_cast<char *>(&mBuffer[1]);
b8efe6 }
7caf5a
63af5a
2eaf5a
046d52 ¤   void
6bd915 CString::UpdatePString() const
debb36 {
ba911d ¤   // We need to cast away const here so that we can do our lazy evaluation
ad8136 ¤   CString *¤  thisNoConst = const_cast<CString *>(this);
eb67c5 ¤
8be1ca ¤   thisNoConst->mLength = strlen(&mBuffer[1]);
b284b9 ¤   thisNoConst->mBuffer[0] = (mLength < 255) ? mLength : 255;
b85e0f ¤   thisNoConst->mUpdateString = updateString_None;
83efe6 }
87af5a
4eaf5a
62af5a
ea6d52 ¤   void
a3e2bc CString::UpdateCString() const
c5bb36 {
a6911d ¤   // We need to cast away const here so that we can do our lazy evaluation
048136 ¤   CString *¤  thisNoConst = const_cast<CString *>(this);
f667c5 ¤
760b47 ¤   thisNoConst->mLength = ((UInt8 *) mBuffer)[0];
3ac7ab ¤   thisNoConst->mBuffer[mLength + 1] = 0;
c05e0f ¤   thisNoConst->mUpdateString = updateString_None;
83efe6 }
25af5a
1caf5a
4eaf5a
096d52 ¤   void
--d560 0013b2c67854012018d Page 5 of CString.cp
ed2448 CString::AdjustStringsToLength() const
b7bb36 {
9e233f ¤   mBuffer[0] = (mLength < 255) ? mLength : 255;
59dd81 ¤   mBuffer[mLength + 1] = 0;
30efe6 }
67af5a
70af5a
cdaf5a
73897e ¤   CString &
4d7197 CString::Assign(
034eda ¤   ResIDT¤ inResID,
07215c ¤   SInt16¤ inIndex)
34bb36 {
fa37c8 ¤   if (inIndex > 0) {
82522b ¤   ¤   Str255¤ theString;
2667c5 ¤
8abfa1 ¤   ¤   ::GetIndString(theString, inResID, inIndex);
17f5ef ¤   ¤   Assign(theString);
c9f037 ¤   } else {
359c76 ¤   ¤   StringHandle¤   theStringH = ::GetString(inResID);
ef1b52 ¤   ¤
c85bda ¤   ¤   if (theStringH != nil) {
a9fb13 ¤   ¤   ¤   StHandleLocker¤ theLock((Handle) theStringH);
1c87c7 ¤   ¤   ¤
a50700 ¤   ¤   ¤   Assign(theStringH);
1c0fe4 ¤   ¤   }
c69371 ¤   }
2067c5 ¤
95e9d2 ¤   return *this;
17efe6 }
beaf5a
c8af5a
6aaf5a
77897e ¤   CString &
587197 CString::Assign(
691fef ¤   const char *¤   inBuffer,
9b944d ¤   UInt32¤ ¤   ¤   inLength)
52bb36 {
355686 ¤   AllocateBuffer(inLength);
3d67c5 ¤
3ed3dd ¤   ::BlockMoveData(¤   inBuffer,
38a5ef ¤   ¤   ¤   ¤   ¤   ¤   &mBuffer[1],
5f0585 ¤   ¤   ¤   ¤   ¤   ¤   inLength);
0a2e71 ¤   mLength = inLength;
500403 ¤   AdjustStringsToLength();
a367c5 ¤
b4e9d2 ¤   return *this;
67efe6 }
6eaf5a
0caf5a
81af5a
73eb4f ¤   void¤
e67a1e CString::AssignTo(StringPtr inString)
45bb36 {
3e4b3e ¤   ::BlockMoveData(¤   GetConstPString(),
3c740f ¤   ¤   ¤   ¤   ¤   ¤   inString,
e207fc ¤   ¤   ¤   ¤   ¤   ¤   GetPLength());
f5efe6 }
42af5a
3baf5a
--e57b 0004ab77b464012018e Page 1 of CString.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
dfb7a7 ¤   $Id: CString.h,v 1.7.8.1 1998/11/12 03:10:36 heller Exp $
57f7f7 ____________________________________________________________________________*/
cbaf5a
d28d55 #pragma once·
7daf5a
15324c #include <string.h>
c9af5a
e4cc5c #include <UMemoryMgr.h>
b4af5a
c10e06 #include "UPGPException.h"
9eaf5a
69b8b1 class CString {
385ed4 public:
841acc ¤   ¤   ¤   ¤   ¤   CString();
5dd07b ¤   ¤   ¤   ¤   ¤   CString(const Str255 inString, UInt32 inBufSize = 0);
4ef055 ¤   ¤   ¤   ¤   ¤   CString(const char * inString, UInt32 inBufSize = 0);
37b3aa ¤   ¤   ¤   ¤   ¤   CString(const char * inBuffer, UInt32 inLength,
3bbf52 ¤   ¤   ¤   ¤   ¤   ¤   UInt32 inBufSize)
6d1a34 ¤   ¤   ¤   ¤   ¤   ¤   { InitString(inBuffer, inLength, inBufSize); }
a0dccb ¤   ¤   ¤   ¤   ¤   CString(ResIDT inResID, SInt16 inIndex);
8c59f2 ¤   ¤   ¤   ¤   ¤   CString(SInt32 inNumber);
9c9cd0 ¤   ¤   ¤   ¤   ¤   ~CString();
e8ae30 ¤   ¤   ¤   ¤   ¤
730ca7 ¤   void¤   ¤   ¤   SetClearOnDelete(Boolean inClear)
d04ede ¤   ¤   ¤   ¤   ¤   ¤   { mClearOnDelete = inClear; }
272b85 ¤   ¤   ¤   ¤
be433e ¤   ¤   ¤   ¤   ¤   // Getting and setting the pascal string
a6f8b3 ¤   ConstStringPtr¤ GetConstPString();
c9c1d2 ¤   StringPtr¤  ¤   GetPString();
1267c5 ¤
d450bd ¤   ¤   ¤   ¤   ¤   // Getting and setting the c string
781a77 ¤   const char *¤   GetConstCString();
4c4c24 ¤   char *¤ ¤   ¤   GetCString();
ee2b85 ¤   ¤   ¤   ¤
62d828 ¤   ¤   ¤   ¤   ¤   // Conversion operators
9d034b ¤   ¤   ¤   ¤   ¤   operator ConstStringPtr() { return GetConstPString(); }
e37799 ¤   ¤   ¤   ¤   ¤   operator StringPtr() { return GetPString(); }
fa6643 ¤   ¤   ¤   ¤   ¤   operator char *() { return GetCString(); }
139c23 ¤   ¤   ¤   ¤   ¤   operator const char *() { return GetConstCString(); }
44ae30 ¤   ¤   ¤   ¤   ¤
5c799e ¤   ¤   ¤   ¤   ¤   // Index into string
607d44 ¤   char &¤ ¤   ¤   operator[](UInt32 inPosition)
9ffd44 ¤   ¤   ¤   ¤   ¤   ¤   { PGPThrowIf_(inPosition > (GetLength() - 1));
7c733c ¤   ¤   ¤   ¤   ¤   ¤   ¤   return mBuffer[inPosition + 1]; }
e91f49 ¤   const char &¤   operator[](UInt32 inPosition) const
6efd44 ¤   ¤   ¤   ¤   ¤   ¤   { PGPThrowIf_(inPosition > (GetLength() - 1));
9e733c ¤   ¤   ¤   ¤   ¤   ¤   ¤   return mBuffer[inPosition + 1]; }
412b85 ¤   ¤   ¤   ¤
cc0211 ¤   ¤   ¤   ¤   ¤   // Getting and setting length
7b93ad ¤   UInt8¤  ¤   ¤   GetPLength() const;
02f05f ¤   UInt32¤ ¤   ¤   GetLength() const;
318aa5 ¤   void¤   ¤   ¤   SetLength(UInt32 inLength);
3a67c5 ¤
52e3be ¤   ¤   ¤   ¤   ¤   // Getting and setting the buffer size
2c7b50 ¤   UInt32¤ ¤   ¤   GetBufferSize() { return mBufSize; }
41bc8c ¤   void¤   ¤   ¤   SetBufferSize(UInt32 inBufSize)
2e2743 ¤   ¤   ¤   ¤   ¤   ¤   { ReallocateBuffer(inBufSize); }
6294aa ¤   ¤   ¤   ¤   ¤   ¤
68095e ¤   ¤   ¤   ¤   ¤   // Assignment
882a69 ¤   CString &¤  ¤   Assign(const char * inBuffer, UInt32 inLength);
bd2f7a ¤   CString &¤  ¤   Assign(const char * inString)
69cec4 ¤   ¤   ¤   ¤   ¤   ¤   { return Assign(inString, strlen(inString)); }
cb0e60 ¤   CString &¤  ¤   Assign(ResIDT inResID, SInt16 inIndex);
97200e ¤   CString &¤  ¤   Assign(StringHandle¤inStringH)
e488ca ¤   ¤   ¤   ¤   ¤   ¤   { StHandleLocker theLock((Handle) inStringH);
4ac4bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   return Assign(*inStringH); }
--090a 001a139d5274012018e Page 2 of CString.h
bdbf70 ¤   CString &¤  ¤   Assign(ConstStringPtr inString)
7bf790 ¤   ¤   ¤   ¤   ¤   ¤   { return Assign((const char *) &inString[1],
7c8217 ¤   ¤   ¤   ¤   ¤   ¤   ¤   inString[0]); }
46feeb ¤   CString &¤  ¤   Assign(CString & inCString)
e8edf7 ¤   ¤   ¤   ¤   ¤   ¤   {¤  return Assign(&inCString.mBuffer[1],
f0369a ¤   ¤   ¤   ¤   ¤   ¤   ¤   inCString.mBufSize); }
6494aa ¤   ¤   ¤   ¤   ¤   ¤
edd23e ¤   void¤   ¤   ¤   AssignTo(StringPtr inString);
58af5a
51a2d3 protected:
516316 ¤   enum EUpdateString {
37b1c1 ¤   ¤   updateString_None¤  ¤   =¤  0,
2aaf3a ¤   ¤   updateString_PString¤   =¤  1,
e336ac ¤   ¤   updateString_CString¤   =¤  2
d862bd ¤   };
ecbaa1 ¤   EUpdateString¤  mUpdateString;
3b3447 ¤   UInt32¤ ¤   ¤   mLength;
076013 ¤   Boolean¤¤   ¤   mClearOnDelete;
dcc34f ¤   UInt32¤ ¤   ¤   mBufSize; // Does not include the pchar and cchar.
e14c4e ¤   char *¤ ¤   ¤   mBuffer;
7c67c5 ¤
b60c47 ¤   void¤   ¤   ¤   UpdatePString() const;
2234b7 ¤   void¤   ¤   ¤   UpdateCString() const;
2de439 ¤   void¤   ¤   ¤   AdjustStringsToLength() const;
4eb917 ¤   void¤   ¤   ¤   AllocateBuffer(UInt32 inBufSize);
7cc2d1 ¤   void¤   ¤   ¤   ReallocateBuffer(UInt32 inBufSize);
b8af5a
120fb9 private:
6cbe1b ¤   void¤   ¤   ¤   InitString(const char * inBuffer, UInt32 inLength,
7f7108 ¤   ¤   ¤   ¤   ¤   ¤   UInt32 inBufSize);
30ed74 ¤   void¤   ¤   ¤   InitString();
e882f7 };
a1af5a
--e4c9 000ea3216a94012018f Page 1 of CTempFile.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
05b0ff ¤   $Id: CTempFile.cp,v 1.6.8.1 1998/11/12 03:10:37 heller Exp $
8af7f7 ____________________________________________________________________________*/
48af5a
8a3330 #include <LString.h>
54af5a
dc043a #include "CTempFile.h"
6caf5a
1daf5a
ef4e53 CTempFile::CTempFile(
d514dd ¤   LFile * inFile,
8779e7 ¤   Boolean¤inCreate)
e5bb36 {
6e009b ¤   FSSpec¤ theSpec;
5fabaa ¤   FInfo¤  theFinderInfo;
e567c5 ¤
59a4d6 ¤   inFile->GetSpecifier(theSpec);
ed23f6 ¤   ::FSpGetFInfo(¤ &theSpec,
0d2647 ¤   ¤   ¤   ¤   ¤   &theFinderInfo);
298cd1 ¤   InitCTempFile(¤ theFinderInfo.fdCreator,
4c5ee4 ¤   ¤   ¤   ¤   ¤   theFinderInfo.fdType,
15affa ¤   ¤   ¤   ¤   ¤   theSpec.name,
883d53 ¤   ¤   ¤   ¤   ¤   inCreate);
99efe6 }
54af5a
efaf5a
73af5a
724e53 CTempFile::CTempFile(
02e9b0 ¤   OSType¤ inCreator,
2ccdea ¤   OSType¤ inFileType,
8b521d ¤   Str63¤  inName,
8679e7 ¤   Boolean¤inCreate)
4bbb36 {
46bb5a ¤   StringPtr¤  name = "\pTemp";
e667c5 ¤
4f9b40 ¤   if (inName != nil) {
79ebd8 ¤   ¤   name = inName;
3e9371 ¤   }
d25302 ¤   InitCTempFile(¤ inCreator,
824890 ¤   ¤   ¤   ¤   ¤   inFileType,
9a57fb ¤   ¤   ¤   ¤   ¤   name,
553d53 ¤   ¤   ¤   ¤   ¤   inCreate);
39efe6 }
a2af5a
87af5a
8baf5a
846d52 ¤   void
62f68d CTempFile::InitCTempFile(
e6e9b0 ¤   OSType¤ inCreator,
26cdea ¤   OSType¤ inFileType,
95521d ¤   Str63¤  inName,
8c79e7 ¤   Boolean¤inCreate)
3bbb36 {
f03b95 ¤   Int16¤  ¤   ¤   theVRef;
6f7644 ¤   Int32¤  ¤   ¤   theDirID;
2d6b9d ¤   OSStatus¤   ¤   err = noErr;
9aaf5a
1f7dfa ¤   // Get the temporary folder
b4c438 ¤   err = ::FindFolder(¤kOnSystemDisk,
a3c6f5 ¤   ¤   ¤   ¤   ¤   ¤   kTemporaryFolderType,
663ae4 ¤   ¤   ¤   ¤   ¤   ¤   true,
f26fcc ¤   ¤   ¤   ¤   ¤   ¤   &theVRef,
1a311b ¤   ¤   ¤   ¤   ¤   ¤   &theDirID);
af5e5c ¤   PGPThrowIfOSErr_(err);
da67c5 ¤
72f465 ¤   TString<Str63>¤ theFileName = inName;
eaab95 ¤   SInt32¤ ¤   ¤   theCount = 0;
--2fdc 0014ffa9c864012018f Page 2 of CTempFile.cp
2a67c5 ¤
69f293 ¤   // Create FSSpecs until we find one that doesn't exist
62c664 ¤   while (err != fnfErr) {
ab9ed3 ¤   ¤   err = ::FSMakeFSSpec(¤  theVRef,
2baa2a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDirID,
8c8048 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theFileName,
0b227a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mMacFileSpec);
00da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
89cc61 ¤   ¤   theFileName = inName + TString<Str31>(theCount++);
969371 ¤   }
0f67c5 ¤
a6fb13 ¤   PGPThrowIf_(err != fnfErr);
5567c5 ¤
01e10f ¤   if (inCreate) {
8a913c ¤   ¤   CreateNewFile(¤ inCreator,
9f9034 ¤   ¤   ¤   ¤   ¤   ¤   inFileType);
669371 ¤   }
4defe6 }
f3af5a
9faf5a
6baf5a
47af5a
43af5a
ebf6f2 CTempFile::~CTempFile()
0dbb36 {
a3fbdc ¤   CloseDataFork();
da9cdc ¤   CloseResourceFork();
02af5a
09abf1 ¤   // Delete the file
01d5f0 ¤   ::FSpDelete(&mMacFileSpec);
4fefe6 }
--a03c 001a55895d140120190 Page 1 of CTempFile.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
6b13d1 ¤   $Id: CTempFile.h,v 1.3.20.1 1998/11/12 03:10:38 heller Exp $
b3f7f7 ____________________________________________________________________________*/
d4af5a
eb8d55 #pragma once·
35af5a
dae4a8 #include <LFileStream.h>
b0af5a
d90208 class CTempFile¤:¤  public LFileStream {
475ed4 public:
fc433a ¤   ¤   ¤   ¤   ¤   CTempFile(OSType inCreator = '????',
d2a3e7 ¤   ¤   ¤   ¤   ¤   ¤   OSType inFileType = '????',
0861ef ¤   ¤   ¤   ¤   ¤   ¤   StringPtr inName = nil, Boolean inCreate = true);
31f88c ¤   ¤   ¤   ¤   ¤   CTempFile(LFile * inFile, Boolean inCreate = true);
a04254 ¤   virtual¤¤   ¤   ~CTempFile();
ca67c5 ¤
530fb9 private:
353c47 ¤   virtual¤void¤   InitCTempFile(OSType inCreator, OSType inFileType,
ea5b40 ¤   ¤   ¤   ¤   ¤   ¤   Str63 inName, Boolean inCreate);
a582f7 };
--f278 001cd10b42840120191 Page 1 of CWindowRefArray.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
0aada3 ¤   $Id: CWindowRefArray.cp,v 1.2.20.1 1998/11/12 03:10:39 heller Exp $
e5f7f7 ____________________________________________________________________________*/
e2af5a
47e9d8 #include "CWindowRefArray.h"
0faf5a
9daf5a
00af5a
ae0c61 CWindowRefArray::CWindowRefArray()
db4e11 ¤   : LArray(sizeof(SWindowRef))
a1bb36 {
d1efe6 }
e3af5a
90af5a
edaf5a
8e1e8f CWindowRefArray::~CWindowRefArray()
b0bb36 {
8fefe6 }
ceaf5a
44af5a
c6af5a
622c89 ¤   ArrayIndexT
0422b6 CWindowRefArray::FetchIndexOfWindowRef(
38e054 ¤   const WindowRef¤inWindowRef)
3bbb36 {
00a310 ¤   SWindowRef¤ theItem = {inWindowRef, nil};
8d67c5 ¤
cb413b ¤   SetComparator(new CWindowRefComparator);
7ed33e ¤   return FetchIndexOf(&theItem, sizeof(SWindowRef));
b8efe6 }
f6af5a
51af5a
50af5a
be2c89 ¤   ArrayIndexT
2e6780 CWindowRefArray::FetchIndexOfGrafPortView(
22ea2e ¤   const LGrafPortView *¤  inGrafPortView)
86bb36 {
30a78a ¤   SWindowRef¤ theItem = {nil, const_cast<LGrafPortView *>(inGrafPortView)};
0367c5 ¤
9755a6 ¤   SetComparator(new CGrafPortViewComparator);
65d33e ¤   return FetchIndexOf(&theItem, sizeof(SWindowRef));
cdefe6 }
--ff54 000a0b5773b40120192 Page 1 of CWindowRefArray.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
8598cd ¤   $Id: CWindowRefArray.h,v 1.4.8.1 1998/11/12 03:10:40 heller Exp $
46f7f7 ____________________________________________________________________________*/
18af5a
668d55 #pragma once·
d0af5a
26b0f8 #include <LArray.h>
6215dd #include <LComparator.h>
81af5a
7ced73 class LGrafPortView;
c2af5a
4728a5 typedef struct WindowRefS {
863706 ¤   WindowRef¤  ¤   windowRef;
6eae6e ¤   LGrafPortView *¤grafPortView;
081295 } SWindowRef, * SWindowRefPtr;
36af5a
b6f991 typedef const SWindowRef *¤ ConstSWindowRefPtr;
70af5a
cd78f4 class CWindowRefArray¤  :¤  public LArray {
415ed4 public:
c135f1 ¤   ¤   ¤   ¤   ¤   ¤   CWindowRefArray();
375323 ¤   virtual¤¤   ¤   ¤   ~CWindowRefArray();
f667c5 ¤
2239b7 ¤   virtual ArrayIndexT¤InsertSWindowRef(const SWindowRef & inItem)
87d54a ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return InsertItemsAt(1,1, &inItem,
97fcd7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(SWindowRef)); }
f5531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
a24428 ¤   virtual ArrayIndexT¤FetchIndexOfWindowRef(const WindowRef inWindowRef);
b448b2 ¤   virtual ArrayIndexT¤FetchIndexOfGrafPortView(
7ce11b ¤   ¤   ¤   ¤   ¤   ¤   ¤   const LGrafPortView * inGrafPortView);
f667c5 ¤
26e183 ¤   virtual Boolean¤¤   FetchSWindowRefAt(ArrayIndexT inAtIndex,
b51184 ¤   ¤   ¤   ¤   ¤   ¤   ¤   SWindowRef & outItem) const
ff485d ¤   ¤   ¤   ¤   ¤   ¤   ¤   { ¤ return FetchItemAt(inAtIndex, &outItem); }
d167c5 ¤
ac7b52 ¤   virtual void¤   ¤   RemoveSWindowRefAt(ArrayIndexT inAtIndex)
de7161 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { RemoveItemsAt(1, inAtIndex); }
fc67c5 ¤
eaa2d3 protected:
601a0b ¤   class CWindowRefComparator¤ :¤  public LComparator {
4667d4 ¤   public:
47379b ¤   ¤   ¤   ¤   ¤   ¤   CWindowRefComparator(){ }
bd897a ¤   ¤   virtual¤¤   ¤   ~CWindowRefComparator(){ }
0d94aa ¤   ¤   ¤   ¤   ¤   ¤
1e2e28 ¤   ¤   virtual Int32¤  Compare(const void * inItemOne,
596b36 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const void * inItemTwo,
209128 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 inSizeOne, UInt32 inSizeTwo) const
300343 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { (void) inSizeOne; (void) inSizeTwo;
1f089d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··return ! (static_cast<ConstSWindowRefPtr>
1e1ef4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··(inItemOne)->windowRef ==
3a916b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··static_cast<ConstSWindowRefPtr>
d8ae6b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··(inItemTwo)->windowRef); }
8062bd ¤   };
3baf5a
f86a96 ¤   class CGrafPortViewComparator¤  :¤  public LComparator {
8867d4 ¤   public:
74a05d ¤   ¤   ¤   ¤   ¤   ¤   CGrafPortViewComparator(){ }
32535e ¤   ¤   virtual¤¤   ¤   ~CGrafPortViewComparator(){ }
5794aa ¤   ¤   ¤   ¤   ¤   ¤
722e28 ¤   ¤   virtual Int32¤  Compare(const void * inItemOne,
136b36 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const void * inItemTwo,
439128 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 inSizeOne, UInt32 inSizeTwo) const
740343 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { (void) inSizeOne; (void) inSizeTwo;
c7089d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··return ! (static_cast<ConstSWindowRefPtr>
169f8d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··(inItemOne)->grafPortView ==
d9916b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··static_cast<ConstSWindowRefPtr>
a0de9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··(inItemTwo)->grafPortView); }
--4b64 001779d076f40120192 Page 2 of CWindowRefArray.h
5562bd ¤   };
9a82f7 };
77af5a
--6d75 0002ea8eaae40120193 Page 1 of CFM-MESP.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
760075 ¤   $Id: CFM-MESP.cp,v 1.2.20.1 1998/11/12 03:10:41 heller Exp $
69f7f7 ____________________________________________________________________________*/
25af5a
2a8f22 #include <CodeFragments.h>
863a79 #include <MixedMode.h>
ff468b #include <UDebugging.h>
b6af5a
d29548 #include "plugin.h"
54af5a
c5af5a
9073f4 enum {
27030a ¤   kFinderSignature = 'MACS'
cb82f7 };
57af5a
cdaf5a
c0134b ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Error code
6e8fb3 main (
f95f18 ¤   ProcessInfoRec *¤   inProcInfo,¤// Proc info for captured browser
54c150 ¤   FSSpec *¤   ¤   ¤   inFSSpec)¤  // FSSpec for this plugin
e5bb36 {
d0e61c ¤   OSErr¤  ¤   ¤   ¤   err;
bf4155 ¤   SInt32¤ ¤   ¤   ¤   result;
07af5a
b62165 ¤   // Check for CFM
e6e4ed ¤   SInt32¤ response;
3667c5 ¤
e1d306 ¤   err = ::Gestalt(gestaltCFMAttr, &response);
93df56 ¤   if ((err != noErr) || (((response >> gestaltCFMPresent) & 1) != 1)) {
639d5d ¤   ¤   result = kUnknownErr;
24f037 ¤   } else {
d70c50 ¤   ¤   // Load the library
aa6b02 ¤   ¤   CFragConnectionID¤  connID;
d78574 ¤   ¤   Ptr¤¤   ¤   ¤   ¤   mainAddr;
754a68 ¤   ¤   Str255¤ ¤   ¤   ¤   errName;
f69063 ¤   ¤   THz¤¤   ¤   ¤   ¤   savedZone = ::GetZone();
4baf5a
f950e7 ¤   ¤   // If the app is the finder, we need to load in the system zone
adcb25 ¤   ¤   if (inProcInfo->processSignature == kFinderSignature) {
3c50ed ¤   ¤   ¤   ::SetZone(::SystemZone());
9b0fe4 ¤   ¤   }
3771f5 ¤   ¤   err = ::GetDiskFragment(¤   inFSSpec,
fdfcf5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0L,
1c40bb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCFragGoesToEOF,
255846 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inProcInfo->processName,
663a37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kLoadCFrag,
a49250 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &connID,
ac2ffc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr*)&mainAddr,
779d37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   errName);
71d062 ¤   ¤   ::SetZone(savedZone);
31951b ¤   ¤   if (err != noErr) {
b6aa55 ¤   ¤   ¤   result = kUnknownErr;
2d5acc ¤   ¤   } else {¤
d149fd ¤   ¤   ¤   // Create the UPP
73fda0 ¤   ¤   ¤   PlugInMainProcUPP¤  mainUPP;
62af5a
720d07 ¤   ¤   ¤   mainUPP = (PlugInMainProcUPP) ::NewRoutineDescriptorTrap(
8ee4a3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (ProcPtr) mainAddr,
124c29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   uppPlugInMainProcInfo,
3dd872 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CFM_MESPTarget_);
da7506 ¤   ¤   ¤   if (mainUPP == nil) {
f82669 ¤   ¤   ¤   ¤   ::CloseConnection(& connID);
bcb91b ¤   ¤   ¤   ¤   result = kOutOfMemoryErr;
3a042d ¤   ¤   ¤   } else {
1a8574 ¤   ¤   ¤   ¤   savedZone = ::GetZone();
525ea1 ¤   ¤   ¤   ¤   ::SetZone(::SystemZone());
2ea464 ¤   ¤   ¤   ¤   result = CallPlugInMainProc(mainUPP, inProcInfo, inFSSpec);
--c44a 00104db4f7240120193 Page 2 of CFM-MESP.cp
bb0819 ¤   ¤   ¤   ¤   ::SetZone(savedZone);
1ee809 ¤   ¤   ¤   ¤   ::DisposeRoutineDescriptorTrap((UniversalProcPtr) mainUPP);
6d2b85 ¤   ¤   ¤   ¤
5a7f17 ¤   ¤   ¤   ¤   // Close the connection if we are not patching
bc8607 ¤   ¤   ¤   ¤   if (result != noErr) {
6d74f4 ¤   ¤   ¤   ¤   ¤   ::CloseConnection(& connID);
cd2613 ¤   ¤   ¤   ¤   }
e9a3a6 ¤   ¤   ¤   }
fb0fe4 ¤   ¤   }
479371 ¤   }
9a67c5 ¤
690b72 ¤   return result | kUnloadPlug;
04efe6 }
--9d5f 00102cbaa3740120194 Page 1 of CFM68K-MESPPrefix.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
f0e0dc ¤   $Id: CFM68K-MESPPrefix.h,v 1.2.20.1 1998/11/12 03:10:42 heller Exp $
0ef7f7 ____________________________________________________________________________*/
87af5a
af8c5a #include <MacHeaders.h>
daaf5a
023adc #define CFM_MESPTarget_¤(kM68kISA | kCFM68kRTA)¶
--4767 001f4da89f940120195 Page 1 of CFMPPC-MESPPrefix.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
c81f96 ¤   $Id: CFMPPC-MESPPrefix.h,v 1.2.20.1 1998/11/12 03:10:43 heller Exp $
22f7f7 ____________________________________________________________________________*/
82af5a
4c8c5a #include <MacHeaders.h>
d4af5a
f4893f #define CFM_MESPTarget_¤(kPowerPCISA | kPowerPCRTA)¶
--3556 0004e9d850d40120196 Page 1 of init.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
c93618 ¤   $Id: init.c,v 1.2.20.1 1998/11/12 03:10:44 heller Exp $
f5f7f7 ____________________________________________________________________________*/
9baf5a
8b728f #include <Types.h>
ecaf5a
c070b5 #include <SetupA4.h>
969040 #include <A4Stuff.h>
efaf5a
98ebc1 #include "ShowInitIcon.h"
b3b84e #include "Jimi.h"
379548 #include "plugin.h"
069bee #include "init.h"
6caf5a
231c5d #ifdef powerc
11af5a
df77e0 #define MacsBug_() ····SysBreak()
28373f #define MacsBugStr_(s) SysBreakStr(s)
77af5a
a9ec0c #else // 68K
0eaf5a
9c34a5 #define MacsBug_() ····Debugger()
0c4970 #define MacsBugStr_(s) DebugStr(s)
daaf5a
e97454 #endif
d4af5a
b8d4c2 void main(void)
1abb36 {
f149ac ¤   // Remember A4
2a953d ¤   EnterCodeResource();
be67c5 ¤
c1c7a1 ¤   {
607ef2 ¤   ¤   THz¤¤   ¤   ¤   ¤   savedZone;
bdd52c ¤   ¤   SInt32¤ ¤   ¤   ¤   theResponse;
e753e6 ¤   ¤   OSErr¤  ¤   ¤   ¤   err = noErr;
9b1536 ¤   ¤   Boolean¤¤   ¤   ¤   canRun = true;
b9e364 ¤   ¤   Handle¤ ¤   ¤   ¤   patchCodeH = NULL;
e16aa8 ¤   ¤   CFragConnectionID¤  connID = 0;
37bb23 ¤   ¤   Ptr¤¤   ¤   ¤   ¤   symDirNameAddr = nil;
691b52 ¤   ¤
a39ee9 ¤   ¤   // Set the current heap to the system heap
e6a676 ¤   ¤   savedZone = GetZone();
7462e6 ¤   ¤   SetZone(SystemZone());
721b52 ¤   ¤
135e6c ¤   ¤   // Show starting icon
1809ff ¤   ¤   ShowInitIcon(kRunningIcon, false);
aaaf5a
6a375a ¤   ¤   // Check to see if we are running System 7.5 or greater
3f92f2 ¤   ¤   err = Gestalt(gestaltSystemVersion, &theResponse);
cd9252 ¤   ¤   if ((err != noErr) || (theResponse < kMinimumSystemVersion)) {
2770be ¤   ¤   ¤   canRun = false;
6d0fe4 ¤   ¤   }
9387c7 ¤   ¤   ¤
c26fca ¤   ¤   // Patch trap
82da31 ¤   ¤   if (canRun) {
41ffac ¤   ¤   ¤   // Get the patch code and detach it
f81719 ¤   ¤   ¤   patchCodeH = Get1Resource(¤ kPatchResType,
b1f329 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   k68KPatchResID);
fccfdb ¤   ¤   ¤   if (patchCodeH == NULL) {
09dde0 ¤   ¤   ¤   ¤   canRun = false;
9a042d ¤   ¤   ¤   } else {
497187 ¤   ¤   ¤   ¤   // JSR to our code
263607 ¤   ¤   ¤   ¤   JimiInitProcPtr¤JimiInit = (JimiInitProcPtr) *patchCodeH;
022b85 ¤   ¤   ¤   ¤
c5067f ¤   ¤   ¤   ¤   JimiInit(patchCodeH);
c6a3a6 ¤   ¤   ¤   }
4e0fe4 ¤   ¤   }
--da02 001673837b740120196 Page 2 of init.c
f11b52 ¤   ¤
daa1ab ¤   ¤   // Display the correct icon
61da31 ¤   ¤   if (canRun) {
670a08 ¤   ¤   ¤   ShowInitIcon(kRunningIcon, true);
ad45a6 ¤   ¤   } else {
67eae1 ¤   ¤   ¤   ShowInitIcon(kNotRunningIcon, true);
9f0fe4 ¤   ¤   }
c01b52 ¤   ¤
e68ce5 ¤   ¤   // Restore the previous heap
f90327 ¤   ¤   SetZone(savedZone);
4b9371 ¤   }
ed67c5 ¤
ed9e0c ¤   // Restore A4
a81487 ¤   ExitCodeResource();
67efe6 }
--e158 001bbb9777540120197 Page 1 of init.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
b8bcfd ¤   $Id: init.h,v 1.2.20.1 1998/11/12 03:10:45 heller Exp $
11f7f7 ____________________________________________________________________________*/
e9af5a
fa8d55 #pragma once·
56af5a
66af5a
2173f4 enum {
72b522 ¤   kMinimumSystemVersion¤  =¤  0x00000750,
af67c5 ¤
c9e064 ¤   k68KPatchResID¤ ¤   ¤   =¤  1001,
75003d ¤   kPatchResType¤  ¤   ¤   =¤  'Jimi'
bb82f7 };
--451c 0007b59698e40120198 Page 1 of Jimi.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
d7db5f ¤   $Id: Jimi.cp,v 1.3.8.1 1998/11/12 03:10:46 heller Exp $
cef7f7 ____________________________________________________________________________*/
7aaf5a
72922b // Turn on and off debugging
6621a8 //#define Debug_Throw
dcaf5a
abaf5a
999317 #include <ShutDown.h>
d2af5a
129040 #include <A4Stuff.h>
d4c645 #include <SetUpA4.h>
e5af5a
ae324c #include <string.h>
12af5a
b6468b #include <UDebugging.h>
e2c963 #include <UException.h>
89af5a
18aa64 #include "StSaveCurResFile.h"
f5db55 #include "sharedmem.h"
f09548 #include "plugin.h"
899bee #include "init.h"
d4b84e #include "Jimi.h"
30af5a
f61c5d #ifdef powerc
70af5a
e077e0 #define MacsBug_() ····SysBreak()
e3373f #define MacsBugStr_(s) SysBreakStr(s)
8caf5a
93ec0c #else // 68K
77af5a
c934a5 #define MacsBug_() ····Debugger()
4a4970 #define MacsBugStr_(s) DebugStr(s)
43af5a
777454 #endif
39af5a
dbaf5a
b61622 // Declarations
4a83b9 pascal OSErr SharedMemSelector(OSType selector,¤long *response);
c2af5a
8989d8 typedef struct FSSpecListS{
0c00ad ¤   UInt32¤ ¤   ¤   ¤   ¤   minFreeSpace;
c2d17a ¤   FSSpec¤ ¤   ¤   ¤   ¤   fsSpec;
b7cfd2 ¤   struct FSSpecListS *¤   link;
92e3eb } FSSpecListS, *FSSpecListSPtr;
8aaf5a
df2879 typedef struct CaptureListS{
e4380d ¤   OSType¤ ¤   ¤   ¤   ¤   creator;
b6a88b ¤   FSSpecListSPtr¤ ¤   ¤   fsSpecListP;
390c40 ¤   struct CaptureListS *¤  link;
e2b3cc } CaptureListS, *CaptureListSPtr;
7eaf5a
c4d34c typedef struct ProcessListS {
f92898 ¤   ProcessSerialNumber¤¤   psn;
ec5008 ¤   struct ProcessListS *¤  link;
c0d261 } ProcessListS, *ProcessListSPtr;
4baf5a
9cfaca const¤  Str31¤  kCaptureListNamedBlock¤ =¤  "\pJimi_CaptureList";
f9b4ee const¤  Str31¤  kJimiVersionNamedBlock¤ =¤  "\pJimi_Version";
160e53 const¤  UInt16¤ kJimiVersion¤   ¤   ¤   =¤  0x0100;
b9b362 const¤  OSType¤ kFinderSig¤ ¤   ¤   ¤   =¤  'MACS';
f4af5a
56af5a
f9b932 // Globals
545521 Str31¤  ¤   ¤   ¤   gDirName;
d09097 UniversalProcPtr¤   gPreviousCall;
7b4c22 ProcessListSPtr¤¤   gProcessListP = nil;
--304e 0000ea28b3740120198 Page 2 of Jimi.cp
c3a882 Boolean¤¤   ¤   ¤   gInitialized = false;
a2af5a
3daf5a
3549e9 pascal void MyShutDownProc();
993379 #ifdef __cplusplus
e56dad extern "C" {
ff7454 #endif
07c013 extern void¤__InitCode__(void);
edbb28 extern void¤__destroy_global_chain(void);
ad3379 #ifdef __cplusplus
c2efe6 }
e17454 #endif
a5af5a
9d6685 ¤   pascal void
482fe1 main(
a5ea4d ¤   Handle¤ inJimiResH)
f9bb36 {
4b953d ¤   EnterCodeResource();
3b46cc ¤   PrepareCallback();
f4af5a
5d44eb ¤   __InitCode__();
1267c5 ¤
aabbdf ¤   SInt32¤ ¤   ¤   ¤   ¤   err = noErr;
794b8f ¤   CaptureListSPtr *¤  ¤   theCaptureListP;
27130c ¤   UInt16 *¤   ¤   ¤   ¤   theJimiVersionP;
a667c5 ¤
d630ad ¤   // Install this resource if it is the first one otherwise get shared
a3355b ¤   // mem
da2c09 ¤   err = GetNamedBlock(¤   kCaptureListNamedBlock,
315c90 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr *) &theCaptureListP);
e836cb ¤   if (err == gestaltUndefSelectorErr) {
082d62 ¤   ¤   // Add Gestalt Selector
72cdba ¤   ¤   err = ::NewGestalt(¤kSharedMemSelector,
739787 ¤   ¤   ¤   ¤   ¤   ¤   ¤   NewSelectorFunctionProc(SharedMemSelector));
53951b ¤   ¤   if (err != noErr) {
b03fac ¤   ¤   ¤   goto exitLabel;
540fe4 ¤   ¤   }
4ff472 ¤   ¤   err = NewNamedBlock(¤   kCaptureListNamedBlock,
f9fe58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(CaptureListSPtr),
855bab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr *) &theCaptureListP);
08951b ¤   ¤   if (err != noErr) {
bc3fac ¤   ¤   ¤   goto exitLabel;
890fe4 ¤   ¤   }
3294a9 ¤   ¤   *theCaptureListP = nil;
921b52 ¤   ¤
ea24ef ¤   ¤   err = NewNamedBlock(¤   kJimiVersionNamedBlock,
137a27 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(UInt16),
e09d58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr *) &theJimiVersionP);
c8951b ¤   ¤   if (err != noErr) {
903fac ¤   ¤   ¤   goto exitLabel;
690fe4 ¤   ¤   }
4718af ¤   ¤   *theJimiVersionP = 0;
4d7280 ¤   } else if (err != noErr) {
b7c9c9 ¤   ¤   goto exitLabel;
edf037 ¤   } else {
10a938 ¤   ¤   err = GetNamedBlock(¤   kJimiVersionNamedBlock,
3a9d58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr *) &theJimiVersionP);
d3951b ¤   ¤   if (err != noErr) {
483fac ¤   ¤   ¤   goto exitLabel;
070fe4 ¤   ¤   }
659371 ¤   }
9b67c5 ¤
c538d4 ¤   // Detach ourselves if our version number is greater than existing
4a5e50 ¤   if (kJimiVersion > *theJimiVersionP) {
dd591f ¤   ¤   *theJimiVersionP = kJimiVersion;
8a4598 ¤   ¤   // Detach ourselves
b2703d ¤   ¤   ::DetachResource(inJimiResH);
c21b52 ¤   ¤
66bbf2 ¤   ¤   // Get the current trap
53dbee ¤   ¤   gPreviousCall = ::GetToolTrapAddress(_InitMenus);
df1b52 ¤   ¤
0e2f52 ¤   ¤   // Install the new trap
--222c 0005571a62440120198 Page 3 of Jimi.cp
f0f885 ¤   ¤   ::SetToolTrapAddress(¤  (UniversalProcPtr) MyInitMenus,
d73474 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   _InitMenus);
31531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
de10ee ¤   ¤   // Install shutdown proc
abfbca ¤   ¤   ::ShutDwnInstall(¤  MyShutDownProc,
89f081 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sdOnDrivers);
bb9371 ¤   }
3767c5 ¤
033d39 ¤   // Add this resource file to the capture list
6a3190 ¤   FSSpec¤ ¤   ¤   theSpec;
1bc154 ¤   FCBPBRec¤   ¤   pb;
6fea13 ¤   Handle¤ ¤   ¤   theCLst;
2ea5ca ¤   OSType¤ ¤   ¤   creator;
bd294a ¤   UInt16¤ ¤   ¤   numItems;
b3f338 ¤   char *¤ ¤   ¤   curPos;
4a9724 ¤   CaptureListSPtr¤curCaptureListP;
7ee869 ¤   FSSpecListSPtr¤ curFSSpecListP;
7867c5 ¤
0f9337 ¤   pb.ioCompletion = nil;
b506f8 ¤   pb.ioNamePtr = theSpec.name;
344ceb ¤   pb.ioVRefNum = 0;
23a4e2 ¤   pb.ioRefNum = ::CurResFile();
dcad27 ¤   pb.ioFCBIndx = 0;
3267c5 ¤
cceaf8 ¤   err = ::PBGetFCBInfoSync(&pb);
d6637e ¤   if (err != noErr) {
88c9c9 ¤   ¤   goto exitLabel;
279371 ¤   }
bbd0e8 ¤   theSpec.vRefNum = pb.ioFCBVRefNum;
dc9e3a ¤   theSpec.parID = pb.ioFCBParID;
af67c5 ¤
6e867a ¤   // Get the STR# resource
883cf5 ¤   theCLst = Get1Resource(¤'CLst',
d8eb28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPluginCLstID);
5d0992 ¤   if (theCLst == nil)
93c9c9 ¤   ¤   goto exitLabel;
801652 ¤   HLock(theCLst);
02af5a
3f6a96 ¤   // Walk the CLst resource adding this FSSpec to the capture list
ea8f84 ¤   curPos = *theCLst + sizeof(UInt16);
25515e ¤   numItems = *(UInt16 *) curPos;
335b66 ¤   curPos += sizeof(numItems);
1dec2e ¤   curCaptureListP = *theCaptureListP;
fac7f7 ¤   while (numItems > 0){
fce4a2 ¤   ¤   creator = *(OSType *)curPos;
dfe05d ¤   ¤   curPos += sizeof(creator);
60af5a
684282 ¤   ¤   // Walk the capture list to add the FSSpec
088d24 ¤   ¤   while (curCaptureListP != nil){
7fc152 ¤   ¤   ¤   // If the creator already exists, just link a new FSSpecList
31d1be ¤   ¤   ¤   //¤ struct to it
fcac4d ¤   ¤   ¤   if (curCaptureListP->creator == creator){
97af83 ¤   ¤   ¤   ¤   curFSSpecListP = (FSSpecListSPtr)
8aa812 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::NewPtrSys(sizeof(FSSpecListS));
c0b173 ¤   ¤   ¤   ¤   if (curFSSpecListP == nil) {
16190e ¤   ¤   ¤   ¤   ¤   goto exitLabel;
8b2613 ¤   ¤   ¤   ¤   }
c966a6 ¤   ¤   ¤   ¤   curFSSpecListP->fsSpec = theSpec;
eabef3 ¤   ¤   ¤   ¤   curFSSpecListP->minFreeSpace = *(UInt32 *)curPos;
fffdea ¤   ¤   ¤   ¤   curPos += sizeof(UInt32);
fc83ea ¤   ¤   ¤   ¤   curFSSpecListP->link = curCaptureListP->fsSpecListP;
b752de ¤   ¤   ¤   ¤   curCaptureListP->fsSpecListP = curFSSpecListP;
def622 ¤   ¤   ¤   ¤   break;
23a3a6 ¤   ¤   ¤   }
0801eb ¤   ¤   ¤   curCaptureListP = curCaptureListP->link;
8e0fe4 ¤   ¤   }
601b52 ¤   ¤
96859b ¤   ¤   // Otherwise create a new CaptureList struct and link it in
99d78e ¤   ¤   if (curCaptureListP == nil){
8f3970 ¤   ¤   ¤   curCaptureListP = (CaptureListSPtr)
a1de5b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::NewPtrSys(sizeof(CaptureListS));
55ac90 ¤   ¤   ¤   if (curCaptureListP == nil)
--425f 000bcf7673340120198 Page 4 of Jimi.cp
6b92f2 ¤   ¤   ¤   ¤   goto exitLabel;
c189da ¤   ¤   ¤   curCaptureListP->creator = creator;
c9df57 ¤   ¤   ¤   curCaptureListP->link = *theCaptureListP;
92a619 ¤   ¤   ¤   *theCaptureListP = curCaptureListP;
e4e0bd ¤   ¤   ¤   curFSSpecListP = (FSSpecListSPtr)
06bd31 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::NewPtrSys(sizeof(FSSpecListS));
018351 ¤   ¤   ¤   if (curFSSpecListP == nil)
4d92f2 ¤   ¤   ¤   ¤   goto exitLabel;
c92998 ¤   ¤   ¤   curFSSpecListP->fsSpec = theSpec;
1202ea ¤   ¤   ¤   curFSSpecListP->minFreeSpace = *(UInt32 *)curPos;
e5c104 ¤   ¤   ¤   curPos += sizeof(UInt32);
79dc27 ¤   ¤   ¤   curFSSpecListP->link = nil;
ee523c ¤   ¤   ¤   curCaptureListP->fsSpecListP = curFSSpecListP;
960fe4 ¤   ¤   }
bb1b52 ¤   ¤
10002c ¤   ¤   numItems--;
329371 ¤   }
4667c5 ¤
922edc exitLabel:
831487 ¤   ExitCodeResource();
c7efe6 }
64af5a
a9af5a
baaf5a
856685 ¤   pascal void
d03b59 MyShutDownProc()
1ebb36 {
b06aab ¤   EnterCallback();
4f67c5 ¤
0530bd ¤   OSErr¤  ¤   err;
f73d50 ¤   UInt16 *¤   theJimiVersionP;
b367c5 ¤
6afc94 ¤   err = GetNamedBlock(¤   kJimiVersionNamedBlock,
0e9a63 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr *) &theJimiVersionP);
a0793c ¤   if (err == noErr) {
228d4d ¤   ¤   if (*theJimiVersionP == kJimiVersion) {
c66cd3 ¤   ¤   ¤   __destroy_global_chain();
9c0fe4 ¤   ¤   }
499371 ¤   }
e567c5 ¤
5336ff ¤   ExitCallback();
39efe6 }
13af5a
e0af5a
94af5a
386685 ¤   pascal void
bee399 MyInitMenus(void)
69bb36 {
5f6aab ¤   EnterCallback();
76af5a
3cc7a1 ¤   {
38c9c0 ¤   ¤   SInt32¤ ¤   ¤   ¤   err;
595233 ¤   ¤   UInt16 *¤   ¤   ¤   theJimiVersionP;
ba1b52 ¤   ¤
d1a938 ¤   ¤   err = GetNamedBlock(¤   kJimiVersionNamedBlock,
f19d58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr *) &theJimiVersionP);
fa951b ¤   ¤   if (err != noErr) {
bebbd7 ¤   ¤   ¤   goto errorLabel;
940fe4 ¤   ¤   }
631b52 ¤   ¤
c68d4d ¤   ¤   if (*theJimiVersionP == kJimiVersion) {
c149b7 ¤   ¤   ¤   StSaveCurResFile¤   saveCurRes;
30d70e ¤   ¤   ¤   ProcessInfoRec¤ ¤   theProcessInfo;
6fb81c ¤   ¤   ¤   ProcessSerialNumber¤theCurrentProcess = {0, kCurrentProcess};
060a12 ¤   ¤   ¤   SInt32¤ ¤   ¤   ¤   gestaltReturn;
8428dc ¤   ¤   ¤   Boolean¤¤   ¤   ¤   sameProcess = true;
ff564c ¤   ¤   ¤   CaptureListSPtr¤¤   curCaptureListP;
551277 ¤   ¤   ¤   FSSpecListSPtr¤ ¤   curFSSpecListP;
0076c2 ¤   ¤   ¤   SInt32¤ ¤   ¤   ¤   plugResult;
12e0d9 ¤   ¤   ¤   FSSpec¤ ¤   ¤   ¤   processFSSpec;
221940 ¤   ¤   ¤   Str31¤  ¤   ¤   ¤   processName;
bc1471 ¤   ¤   ¤   ProcessListSPtr¤¤   currProcessStructP;
--a6f4 0009c55804a40120198 Page 5 of Jimi.cp
e0af5a
1aaf5a
23909d ¤   ¤   ¤   // Make sure we have process manager
cc59a5 ¤   ¤   ¤   err = ::Gestalt(gestaltOSAttr, &gestaltReturn);
8faf5a
b23845 ¤   ¤   ¤   if (err != noErr) {
410081 ¤   ¤   ¤   ¤   goto errorLabel;
dea3a6 ¤   ¤   ¤   }
ecaf5a
02af5a
7b8c84 ¤   ¤   ¤   // Get info for the current process
a89d33 ¤   ¤   ¤   memset(¤&theProcessInfo,
453865 ¤   ¤   ¤   ¤   ¤   0,
fd3e34 ¤   ¤   ¤   ¤   ¤   sizeof(theProcessInfo));
2e9107 ¤   ¤   ¤   theProcessInfo.processInfoLength = sizeof(theProcessInfo);
0a005d ¤   ¤   ¤   theProcessInfo.processAppSpec = &processFSSpec;
89dbd9 ¤   ¤   ¤   theProcessInfo.processName = processName;
194426 ¤   ¤   ¤   ::GetProcessInformation(¤   &theCurrentProcess,
706a99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theProcessInfo);
a887c7 ¤   ¤   ¤
28bd2b ¤   ¤   ¤   // Check to see if we are getting a duplicate call
114aee ¤   ¤   ¤   currProcessStructP = gProcessListP;
a89430 ¤   ¤   ¤   while (currProcessStructP != nil) {¤
30d3c4 ¤   ¤   ¤   ¤   ::SameProcess(¤ &currProcessStructP->psn,
d90695 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theProcessInfo.processNumber, &sameProcess);
23299b ¤   ¤   ¤   ¤   if (sameProcess) {
4414c3 ¤   ¤   ¤   ¤   ¤   break;
df2613 ¤   ¤   ¤   ¤   }
069fad ¤   ¤   ¤   ¤   currProcessStructP = currProcessStructP->link;
83a3a6 ¤   ¤   ¤   }
030400 ¤   ¤   ¤   if (currProcessStructP != nil) {
390081 ¤   ¤   ¤   ¤   goto errorLabel;
0ea3a6 ¤   ¤   ¤   }
2387c7 ¤   ¤   ¤
85af5a
94fa5a ¤   ¤   ¤   // Everything worked, create a new process list struct for this
9b154f ¤   ¤   ¤   currProcessStructP = (ProcessListSPtr)
abfd8d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::NewPtrSys(sizeof(ProcessListS));
380fe7 ¤   ¤   ¤   if (currProcessStructP == nil) {
560081 ¤   ¤   ¤   ¤   goto errorLabel;
36a3a6 ¤   ¤   ¤   }
e45b11 ¤   ¤   ¤   currProcessStructP->psn = theProcessInfo.processNumber;
a5a595 ¤   ¤   ¤   currProcessStructP->link = gProcessListP;
24025a ¤   ¤   ¤   gProcessListP = currProcessStructP;
0eaf5a
2aaf5a
4f9a85 ¤   ¤   ¤   // Walk the list and see if we need to load a library
144a09 ¤   ¤   ¤   CaptureListSPtr *¤  ¤   theCaptureListP;
eb5407 ¤   ¤   ¤   SInt16¤ ¤   ¤   ¤   ¤   plugID;
ecaf5a
d7f6f2 ¤   ¤   ¤   err = GetNamedBlock(¤   kCaptureListNamedBlock,
cf5b49 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Ptr *) &theCaptureListP);
383845 ¤   ¤   ¤   if (err != noErr) {
f00081 ¤   ¤   ¤   ¤   goto errorLabel;
e2a3a6 ¤   ¤   ¤   }
5387c7 ¤   ¤   ¤
d7ab55 ¤   ¤   ¤   // Determine our machine type
5bd394 ¤   ¤   ¤   SInt32¤ ¤   ¤   ¤   theResponse;
56586f ¤   ¤   ¤   err = Gestalt(gestaltSysArchitecture, &theResponse);
123845 ¤   ¤   ¤   if (err != noErr) {
bc0081 ¤   ¤   ¤   ¤   goto errorLabel;
31a3a6 ¤   ¤   ¤   }
c41de1 ¤   ¤   ¤   if (theResponse == gestalt68k) {
10a665 ¤   ¤   ¤   ¤   plugID = k68kPlugResID;
f13838 ¤   ¤   ¤   } else if (theResponse == gestaltPowerPC) {
15941d ¤   ¤   ¤   ¤   plugID = kPPCPlugResID;
a2042d ¤   ¤   ¤   } else {
ee0081 ¤   ¤   ¤   ¤   goto errorLabel;
a8a3a6 ¤   ¤   ¤   }
fbaf5a
45af5a
9c7143 ¤   ¤   ¤   for (curCaptureListP = *theCaptureListP; curCaptureListP != nil;
--8f9b 000d9f790a740120198 Page 6 of Jimi.cp
b32fb7 ¤   ¤   ¤   curCaptureListP = curCaptureListP->link){
c5f384 ¤   ¤   ¤   ¤   if ((curCaptureListP->creator
248174 ¤   ¤   ¤   ¤   == theProcessInfo.processSignature)
c77214 ¤   ¤   ¤   ¤   || (curCaptureListP->creator == kEveryProcess)){
9d96eb ¤   ¤   ¤   ¤   ¤   for (curFSSpecListP = curCaptureListP->fsSpecListP;
0a3d13 ¤   ¤   ¤   ¤   ¤   curFSSpecListP != nil;
b27b4c ¤   ¤   ¤   ¤   ¤   curFSSpecListP = curFSSpecListP->link){
664151 ¤   ¤   ¤   ¤   ¤   ¤   // Make sure that we have enough memory
5e8ee6 ¤   ¤   ¤   ¤   ¤   ¤   SInt32¤ total;
9af45d ¤   ¤   ¤   ¤   ¤   ¤   SInt32¤ contig;
f394aa ¤   ¤   ¤   ¤   ¤   ¤
366058 ¤   ¤   ¤   ¤   ¤   ¤   ::PurgeSpace(&total, &contig);
4283a7 ¤   ¤   ¤   ¤   ¤   ¤   total += ::GetApplLimit() - ::LMGetHeapEnd() - 32;
533b6c ¤   ¤   ¤   ¤   ¤   ¤   if ((theProcessInfo.processSignature == kFinderSig)
f97b18 ¤   ¤   ¤   ¤   ¤   ¤   || (total >= curFSSpecListP->minFreeSpace)) {
57e267 ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Load and execute the plugin
06de4f ¤   ¤   ¤   ¤   ¤   ¤   ¤   short¤  fileRef;
d43b2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   Handle¤ mainAddrH;
0f531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
3fafe1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileRef = ::FSpOpenResFile(¤&curFSSpecListP->
d9e875 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fsSpec,
520b92 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fsRdPerm);
6a654a ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (::ResError() == noErr) {
105a50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mainAddrH = ::Get1Resource(¤kPlugResType,
7a06e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   plugID);
c2bb5a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (mainAddrH != nil) {
87af5a
75b607 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::DetachResource(mainAddrH);
f86560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
61af5a
7bdf4f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::CloseResFile(fileRef);
ccbb5a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (mainAddrH != nil) {
d4838f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   plugResult = (*((PlugInMain) *mainAddrH))(
b6ff98 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theProcessInfo,
9d8988 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &curFSSpecListP->fsSpec);
9ce6fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (plugResult & kUnloadPlug) {
e1e959 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // This also disposes of the fake
9ef3b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // plugin for CFM68k code
fdf4cf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::DisposeHandle(mainAddrH);
4a8a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
d36560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
3c5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
80db3c ¤   ¤   ¤   ¤   ¤   ¤   }
f71c89 ¤   ¤   ¤   ¤   ¤   }
5a2613 ¤   ¤   ¤   ¤   }
5da3a6 ¤   ¤   ¤   }
660fe4 ¤   ¤   }
cfaf5a
0d8b45 errorLabel:
02af5a
89aa13 ¤   ¤   // Call through to original function
57bee2 ¤   ¤   ((InitMenusProc) gPreviousCall)();
b3af5a
249371 ¤   }
ca67c5 ¤
7936ff ¤   ExitCallback();
7cefe6 }
8baf5a
6daf5a
44af5a
fbaf5a
5e7e5d /////////// Implement Shared Memory ·////////////////////////////////////////
27af5a
8adab9 NamedBlockP¤¤   gNamedBlocks = nil;
38af5a
bb48f4 ¤   pascal OSErr
36f655 SharedMemSelector(
fd11a1 ¤   OSType selector,
003799 ¤   long *response)
aabb36 {
7ec258 ¤   (void) selector;
d967c5 ¤
--81b7 0018bb907d440120198 Page 7 of Jimi.cp
ce6aab ¤   EnterCallback();
8c67c5 ¤
1d3f4b ¤   *response = (long) &gNamedBlocks;
7167c5 ¤
4a36ff ¤   ExitCallback();
5daf5a
d26bba ¤   return noErr;
8befe6 }
--6583 0010330bcc140120199 Page 1 of Jimi.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
54f693 ¤   $Id: Jimi.h,v 1.2.20.1 1998/11/12 03:10:47 heller Exp $
72f7f7 ____________________________________________________________________________*/
67af5a
798d55 #pragma once·
ccaf5a
c6dca8 typedef pascal void (*JimiInitProcPtr) (Handle inJimiResH);
8f080c typedef pascal void¤(*InitMenusProc)(void);
d7af5a
03dbaf pascal¤ void¤   MyInitMenus(void);
--77a3 000208a3e6a4012019a Page 1 of sharedmem.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
39ac3d ¤   $Id: sharedmem.c,v 1.2.20.1 1998/11/12 03:10:48 heller Exp $
79f7f7 ____________________________________________________________________________*/
49af5a
d0324c #include <string.h>
f3af5a
11db55 #include "sharedmem.h"
21af5a
7daf5a
62af5a
ee1c3a ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   ¤   // Error
495c8e NewNamedBlock(
6c1f5c ¤   const Str31¤¤   inName,¤¤   // Name of block
c0dc92 ¤   const UInt32¤   inSize,¤¤   // Size of block
b2648b ¤   Ptr *¤  ¤   ¤   outAddress)¤// Address of returned block
b2bb36 {
f672f8 ¤   SInt32¤ ¤   ¤   err¤= noErr;
a1ce5d ¤   NamedBlockP *¤  gNamedBlocksP;
b267c5 ¤
4005ac ¤   // Get the head of the list
0a381e ¤   err = Gestalt(¤ kSharedMemSelector,
ea9379 ¤   ¤   ¤   ¤   ¤   (long *) &gNamedBlocksP);
62793c ¤   if (err == noErr) {
6f80e1 ¤   ¤   NamedBlockP¤¤   theNamedBlock = *gNamedBlocksP;
7baf5a
c47a80 ¤   ¤   // Check to make sure that a block with this name doesn't already
775b58 ¤   ¤   // exist
8c1a0a ¤   ¤   while (theNamedBlock != nil) {
ff573b ¤   ¤   ¤   if (memcmp(inName, theNamedBlock->name, inName[0] + 1) == 0) {
b6f622 ¤   ¤   ¤   ¤   break;
9c042d ¤   ¤   ¤   } else {
ba5d55 ¤   ¤   ¤   ¤   theNamedBlock = theNamedBlock->link;
98a3a6 ¤   ¤   ¤   }
f60fe4 ¤   ¤   }
521b52 ¤   ¤
e3409f ¤   ¤   // Allocate new block and put it into the list
3b1e2f ¤   ¤   if (theNamedBlock == nil) {
595064 ¤   ¤   ¤   theNamedBlock =
79e7c4 ¤   ¤   ¤   ¤   (NamedBlockP) NewPtrSys(inSize + sizeof(NamedBlockS));
0fdb7a ¤   ¤   ¤   if (theNamedBlock == nil) {
168b49 ¤   ¤   ¤   ¤   err = err_AllocationError;
b5042d ¤   ¤   ¤   } else {
82e7d1 ¤   ¤   ¤   ¤   memcpy(theNamedBlock->name, inName, inName[0] + 1);
c93f58 ¤   ¤   ¤   ¤   theNamedBlock->link = *gNamedBlocksP;
627bb7 ¤   ¤   ¤   ¤   *gNamedBlocksP = theNamedBlock;
c0c7ae ¤   ¤   ¤   ¤   if (outAddress != nil) {
8eb757 ¤   ¤   ¤   ¤   ¤   *outAddress = (Ptr) theNamedBlock->data;
212613 ¤   ¤   ¤   ¤   }
39a3a6 ¤   ¤   ¤   }
6545a6 ¤   ¤   } else {
a64388 ¤   ¤   ¤   err = err_DuplicateName;
750fe4 ¤   ¤   }
8e9371 ¤   }
8c5ea8 ¤   return err;
22efe6 }
9eaf5a
d7af5a
47af5a
0a7bec ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   // Error
7e4b21 GetNamedBlock(
bb500b ¤   const Str31¤inName,¤¤   // Name of block
d0e763 ¤   Ptr *¤  ¤   outAddress)¤// Address of named block
46bb36 {
c072f8 ¤   SInt32¤ ¤   ¤   err¤= noErr;
81ce5d ¤   NamedBlockP *¤  gNamedBlocksP;
a067c5 ¤
2005ac ¤   // Get the head of the list
--d1b8 0018fdf970f4012019a Page 2 of sharedmem.c
40381e ¤   err = Gestalt(¤ kSharedMemSelector,
b99379 ¤   ¤   ¤   ¤   ¤   (long *) &gNamedBlocksP);
3867c5 ¤
be8da2 ¤   // Search for the block
34793c ¤   if (err == noErr) {
f480e1 ¤   ¤   NamedBlockP¤¤   theNamedBlock = *gNamedBlocksP;
9d1b52 ¤   ¤
681a0a ¤   ¤   while (theNamedBlock != nil) {
15573b ¤   ¤   ¤   if (memcmp(inName, theNamedBlock->name, inName[0] + 1) == 0) {
bdf622 ¤   ¤   ¤   ¤   break;
33042d ¤   ¤   ¤   } else {
455d55 ¤   ¤   ¤   ¤   theNamedBlock = theNamedBlock->link;
eda3a6 ¤   ¤   ¤   }
7a0fe4 ¤   ¤   }
6f15c8 ¤   ¤   if (theNamedBlock != nil) {
64c243 ¤   ¤   ¤   if (outAddress != nil) {
8191e2 ¤   ¤   ¤   ¤   *outAddress = (Ptr) theNamedBlock->data;
22a3a6 ¤   ¤   ¤   }
7c45a6 ¤   ¤   } else {
4cde83 ¤   ¤   ¤   err = err_BlockNotFound;
1b0fe4 ¤   ¤   }
3e9371 ¤   }
7c5ea8 ¤   return err;
e2efe6 }
f0af5a
4baf5a
daaf5a
1a27ab ¤   SInt32¤ ¤   ¤   ¤   ¤   // Error
3b3e56 ReleaseNamedBlock(
be1650 ¤   const Str31 inName)¤// Name of block
febb36 {
0572f8 ¤   SInt32¤ ¤   ¤   err¤= noErr;
53ce5d ¤   NamedBlockP *¤  gNamedBlocksP;
6e67c5 ¤
912487 ¤   // Get head of list
2d381e ¤   err = Gestalt(¤ kSharedMemSelector,
739379 ¤   ¤   ¤   ¤   ¤   (long *) &gNamedBlocksP);
66ae30 ¤   ¤   ¤   ¤   ¤
6dc6f2 ¤   // Release block
4b793c ¤   if (err == noErr) {
4b80e1 ¤   ¤   NamedBlockP¤¤   theNamedBlock = *gNamedBlocksP;
875612 ¤   ¤   NamedBlockP¤¤   prevNamedBlock = nil;
ca1b52 ¤   ¤
ee1a0a ¤   ¤   while (theNamedBlock != nil) {
32573b ¤   ¤   ¤   if (memcmp(inName, theNamedBlock->name, inName[0] + 1) == 0) {
c3f622 ¤   ¤   ¤   ¤   break;
a1042d ¤   ¤   ¤   } else {
09ae22 ¤   ¤   ¤   ¤   prevNamedBlock = theNamedBlock;
365d55 ¤   ¤   ¤   ¤   theNamedBlock = theNamedBlock->link;
1aa3a6 ¤   ¤   ¤   }
fa0fe4 ¤   ¤   }
0815c8 ¤   ¤   if (theNamedBlock != nil) {
ae2a52 ¤   ¤   ¤   if (prevNamedBlock == nil) {
7ad3c6 ¤   ¤   ¤   ¤   *gNamedBlocksP = theNamedBlock->link;
10042d ¤   ¤   ¤   } else {
335ab3 ¤   ¤   ¤   ¤   prevNamedBlock->link = theNamedBlock->link;
a9a3a6 ¤   ¤   ¤   }
c1665f ¤   ¤   ¤   DisposePtr((Ptr) theNamedBlock);
ab45a6 ¤   ¤   } else {
cade83 ¤   ¤   ¤   err = err_BlockNotFound;
da0fe4 ¤   ¤   }
5c9371 ¤   }
105ea8 ¤   return err;
baefe6 }
8faf5a
--641f 0017abfb75a4012019b Page 1 of sharedmem.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
4826d8 ¤   $Id: sharedmem.h,v 1.2.20.1 1998/11/12 03:10:49 heller Exp $
9df7f7 ____________________________________________________________________________*/
3baf5a
738d55 #pragma once·
69af5a
843379 #ifdef __cplusplus
f06dad extern "C" {
997454 #endif
fbaf5a
33fa23 #if PRAGMA_ALIGN_SUPPORTED
20af46 #pragma options align=mac68k
ac7454 #endif
90af5a
2faf5a
3baf5a
74b4b9 // Gestalt selector
4f73f4 enum {
bec380 ¤   kSharedMemSelector¤ =¤  'PVTL'
7382f7 };
7eaf5a
1e55f0 // Possible errors
6573f4 enum {
cd1127 ¤   err_Unknown¤¤   ¤   =¤  'Uknw',
0e820e ¤   err_AllocationError¤=¤  'Aloc',
723f67 ¤   err_BlockNotFound¤  =¤  'BkNF',
0bc819 ¤   err_DuplicateName¤  =¤  'DpNm'
4082f7 };
2baf5a
1beaba // Memory block structure
a4b8d9 typedef struct NamedBlock{
3dd72e ¤   Str31¤  ¤   ¤   ¤   name;
8f08a9 ¤   struct NamedBlock *¤link;
5fe32f ¤   Byte¤   ¤   ¤   ¤   data[1];
713b05 } NamedBlockS, *NamedBlockP;
f2af5a
e1af5a
dae467 // Function declarations
cb0328 SInt32 NewNamedBlock(const Str31 inName, const UInt32 inSize,
3deab5 Ptr * outAddress);
40b1e8 SInt32 GetNamedBlock(const Str31 inName, Ptr * outAddress);
f99290 SInt32 ReleaseNamedBlock(const Str31 inName);
d5af5a
c2af5a
0caf5a
6caf5a
57fa23 #if PRAGMA_ALIGN_SUPPORTED
4d7c46 #pragma options align=reset
f57454 #endif
60af5a
583379 #ifdef __cplusplus
f7efe6 }
7a7454 #endif
--596d 001f98186df4012019c Page 1 of plugin.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
07c195 ¤   $Id: plugin.h,v 1.3.8.1 1998/11/12 03:10:50 heller Exp $
d7f7f7 ____________________________________________________________________________*/
7eaf5a
628d55 #pragma once·
6daf5a
0daf5a
bbf341 // Main entry point declaration
2f3379 #ifdef __cplusplus
216dad extern "C" {
7e7454 #endif
b2c5bc typedef SInt32 (*PlugInMain)(ProcessInfoRec *, FSSpec *);
3caf5a
813379 #ifdef __cplusplus
1defe6 }
e07454 #endif
5daf5a
af73f4 enum {
28b63a ¤   uppPlugInMainProcInfo = kThinkCStackBased
93e162 ¤   ¤   | RESULT_SIZE(SIZE_CODE(sizeof(SInt32)))
f75fd4 ¤   ¤   | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ProcessInfoRec *)))
d2a520 ¤   ¤   | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(FSSpec *)))
7982f7 };
b1af5a
e2fdb7 #if TARGET_RT_MAC_CFM
b9a8d6 typedef UniversalProcPtr PlugInMainProcUPP;
b89f6b #define CallPlugInMainProc(userRoutine, processInfoPtr, fsSpecPtr)¤ \
5dad20 (SInt32) CallUniversalProc(¤(UniversalProcPtr)(userRoutine),¤   ¤   \
c0bee1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   uppPlugInMainProcInfo,¤ ¤   ¤   ¤   ¤   \
5079ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   (processInfoPtr),¤  ¤   ¤   ¤   ¤   ¤   \
0a520a ¤   ¤   ¤   ¤   ¤   ¤   ¤   (fsSpecPtr))¤   ¤   ¤   ¤   ¤   ¤   ¤
07db21 #else
b7ff5c typedef PlugInMain PlugInMainProcUPP;
3aee83 #define CallPlugInMainProc(userRoutine, processInfoPtr, fsSpecPtr)\
7373f4 (SInt32)(*(userRoutine))((processInfoPtr), (fsSpecPtr))
6d7454 #endif
fbaf5a
2154bd // Initialization errors
ea73f4 enum {
3540eb ¤   kNoErr¤ ¤   ¤   =¤  0x00000000,
648d42 ¤   kUnloadPlug¤¤   =¤  0x00010000,¤// Any error returned with bit 16 set
0d3c86 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // will unload the plugin.
3e5fb8 ¤   kUnknownErr¤¤   =¤  0x00010001,
ac003b ¤   kPlugExpired¤   =¤  0x00010002,
6e4b01 ¤   kOutOfMemoryErr¤=¤  0x00010003
2982f7 };
1faf5a
4c435d // Capture IDs list
1373f4 enum {
eda7f9 ¤   kPluginCLstID¤  =¤  1000¤   // The CLst that lists all creators this
f4a7c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // plugin needs captured.
9082f7 };
acaf5a
5fc85e // For plugs that want their main called for every process
2b1c4e const OSType¤   kEveryProcess = '****';
85af5a
f613ae // Plugin resource location for 68k machines
894e38 const ResType¤  kPlugResType¤   =¤  'MESP';
ca36dd const SInt16¤   kPPCPlugResID¤  =¤  1000;
aea8c8 const SInt16¤   k68kPlugResID¤  =¤  1001;
23af5a
c73b30 // ICN# IDs for the icon to show at startup
2a7fff const SInt16¤   kRunningIcon¤   ¤   ¤   =¤  1000;
81adaa const SInt16¤   kNotRunningIcon¤¤   ¤   =¤  1001;
f967c5 ¤
--140c 0000b30ff224012019d Page 1 of ShowInitIcon.c
6d5812 // ShowInitIcon - version 1.0.1, May 30th, 1995
40c87c // This code is intended to let INIT writers easily display an icon at
1dd5bd // startup time.
8a7512 // View in Geneva 9pt, 4-space tabs
0daf5a
0d46cd // Written by: Peter N Lewis <peter@mail.peter.com.au>,
624f4f // Jim Walker <JWWalker@aol.com> and Francois Pottier <pottier@dmi.ens.fr>,
bc20e6 // with thanks to previous ShowINIT authors.
4e8929 // Send comments and bug reports to Francois Pottier.
98af5a
f99197 // This version features:
d2b46f // - Short and readable code.
1632f7 // - Correctly wraps around when more than one row of icons has been
14efaa // ··displayed.
9e7c12 // - works with System 6
aeb770 // - Built with Universal Headers & CodeWarrior. Should work with other
977475 // ··headers/compilers.
33af5a
186b82 #include <Memory.h>
1bfd5c #include <Resources.h>
fe7c7a #include <Icons.h>
87fbf0 #include <OSUtils.h>
7bebc1 #include "ShowInitIcon.h"
c9af5a
0683dc // You should set SystemSixOrLater in your headers to avoid including glue
44d09a // for SysEnvirons.
8daf5a
76c772 // --------------------------------------------------------------------------
2908a2 // Set this flag to 1 if you want to compile this file into a stand-alone
9d0d58 // resource (see note below).
d35553 // Set it to 0 if you want to include this source file into your INIT project.
b6af5a
d5b177 #if 0
676f02 #define ShowInitIcon main
837454 #endif
57af5a
59c772 // --------------------------------------------------------------------------
c33aca // The ShowINIT mechanism works by having each INIT read/write data from
34439b // these globals.
1f0f73 // The MPW C compiler doesn't accept variables declared at an absolute
b70291 // address, so I use these macros instead.
388f4b // Only one macro is defined per variable; there is no need to define a Set
f9cea1 // and a Get accessor like in <LowMem.h>.
86af5a
b121d2 #define¤LMVCoord¤   ¤   ¤   (* (short*) 0x92A)
547bf4 #define¤LMVCheckSum¤¤   (* (short*) 0x928)
51167d #define¤LMHCoord¤   ¤   ¤   (* (short*) 0x92C)
41b846 #define¤LMHCheckSum¤¤   (* (short*) 0x92E)
2faf5a
37c772 // --------------------------------------------------------------------------
71fcbf // Prototypes for the subroutines. The main routine comes first; this is
bb0d8f // necessary to make THINK C's "Custom Header" option work.
36af5a
b750d9 static unsigned short CheckSum (unsigned short x);
fb68cb static void ComputeIconRect (Rect* iconRect, Rect* screenBounds);
7ffd68 static void AdvanceIconPosition (Rect* iconRect);
207082 static void DrawBWIcon (short iconID, Rect *iconRect);
21af5a
05c772 // --------------------------------------------------------------------------
3f0078 // Main routine.
31af5a
c5f0f7 typedef struct {
5d6289 ¤   QDGlobals¤  ¤   ¤   qd;¤¤   ¤   ¤   // Storage for the QuickDraw globals
68ca29 ¤   long¤   ¤   ¤   ¤   qdGlobalsPtr;¤  // A5 points to this place;
d28c67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // it will contain a pointer to qd
c11535 } QDStorage;
5baf5a
a9892f pascal void ShowInitIcon (short iconFamilyID, Boolean advance)
4fbb36 {
210886 ¤   long¤   ¤   ¤   ¤   oldA5;¤ ¤   ¤   // Original value of register A5
6b64ef ¤   QDStorage¤  ¤   ¤   qds;¤   ¤   ¤   // Fake QD globals
0b42c5 ¤   CGrafPort¤  ¤   ¤   colorPort;
--8154 000bdf420244012019d Page 2 of ShowInitIcon.c
afc6a4 ¤   GrafPort¤   ¤   ¤   bwPort;
e4b08b ¤   Rect¤   ¤   ¤   ¤   destRect;
287825 ¤   SysEnvRec¤  ¤   environment;¤   ¤   // Machine configuration.
f467c5 ¤
a91c41 ¤   oldA5 = SetA5((long) &qds.qdGlobalsPtr);¤   // Tell A5 to point to the
500a8a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // end of the fake QD Globals
0f3e68 ¤   InitGraf(&qds.qd.thePort);¤ ¤   ¤   ¤   ¤   // Initialize the fake QD
786bfd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Globals
1367c5 ¤
a36eb1 ¤   SysEnvirons(curSysEnvVers, &environment);¤  // Find out what kind of
ca8a3e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // machine this is
c7af5a
d56fdd ¤   ComputeIconRect(&destRect, &qds.qd.screenBits.bounds);¤ // Compute where
56d520 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // the icon
aa682d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // should be drawn
4daf5a
39bde0 ¤   if (environment.systemVersion >= 0x0700 && environment.hasColorQD) {
bcdb04 ¤   ¤   OpenCPort(&colorPort);
7daa39 ¤   ¤   PlotIconID(&destRect, atNone, ttNone, iconFamilyID);
e346e6 ¤   ¤   CloseCPort(&colorPort);
b29371 ¤   }
5e665a ¤   else {
bdd734 ¤   ¤   OpenPort(&bwPort);
4c22f5 ¤   ¤   DrawBWIcon(iconFamilyID, &destRect);
729939 ¤   ¤   ClosePort(&bwPort);
039371 ¤   }
b367c5 ¤
785f6e ¤   if (advance)
cc5675 ¤   ¤   AdvanceIconPosition (&destRect);
f71b52 ¤   ¤
b21ea3 ¤   SetA5(oldA5); ¤ ¤   ¤   ¤   ¤   // Restore A5 to its previous value
40efe6 }
bbaf5a
19c772 // --------------------------------------------------------------------------
0dcc31 // A checksum is used to make sure that the data in there was left by another
21dda2 // ShowINIT-aware INIT.
2caf5a
876c72 static unsigned short CheckSum (unsigned short x)
febb36 {
de62ae ¤   return ((x << 1) | (x >> 15)) ^ 0x1021;
efefe6 }
2daf5a
58c772 // --------------------------------------------------------------------------
8f888f // ComputeIconRect computes where the icon should be displayed.
47af5a
a8b5db static void ComputeIconRect (Rect* iconRect, Rect* screenBounds)
6dbb36 {
353cba ¤   if (CheckSum(LMHCoord) != LMHCheckSum)¤ // If we are first, we need to
faf36d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // initialize the shared data.
1553af ¤   ¤   LMHCoord = 8;
638908 ¤   if (CheckSum(LMVCoord) != LMVCheckSum)
03d176 ¤   ¤   LMVCoord = screenBounds->bottom - 40;
5367c5 ¤
16384d ¤   if (LMHCoord + 34 > screenBounds->right) {¤ // Check whether we must
bd3638 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // wrap
8678c9 ¤   ¤   iconRect->left = 8;
ff1994 ¤   ¤   iconRect->top = LMVCoord - 40;
119371 ¤   }
cf665a ¤   else {
bab964 ¤   ¤   iconRect->left = LMHCoord;
222d7c ¤   ¤   iconRect->top = LMVCoord;
3b9371 ¤   }
7c042b ¤   iconRect->right = iconRect->left + 32;
91adef ¤   iconRect->bottom = iconRect->top + 32;
beefe6 }
afaf5a
d9cdd1 // AdvanceIconPosition updates the shared global variables so that the next
662de9 // extension will draw its icon beside ours.
4aaf5a
67975a static void AdvanceIconPosition (Rect* iconRect)
43bb36 {
bd91b1 ¤   LMHCoord = iconRect->left + 40;¤¤   // Update the shared data
--0e25 0015073a98c4012019d Page 3 of ShowInitIcon.c
c3b0fa ¤   LMVCoord = iconRect->top;
007dd6 ¤   LMHCheckSum = CheckSum(LMHCoord);
8f8fbe ¤   LMVCheckSum = CheckSum(LMVCoord);
dfefe6 }
88af5a
40f362 // DrawBWIcon draws the 'ICN#' member of the icon family. It works under
e61143 // System 6.
33af5a
7e3d43 static void DrawBWIcon (short iconID, Rect *iconRect)
23bb36 {
8e7688 ¤   Handle¤ ¤   icon;
ac5f3a ¤   BitMap¤ ¤   source, destination;
aa8075 ¤   GrafPtr¤¤   port;
9867c5 ¤
b85f98 ¤   icon = Get1Resource('ICN#', iconID);
bad322 ¤   if (icon != NULL) {
5b8b8a ¤   ¤   HLock(icon);
92db3c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Prepare the source and
de327f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // destination bitmaps.
fee4c0 ¤   ¤   source.baseAddr = *icon + 128;¤ ¤   // Mask address.
a55706 ¤   ¤   source.rowBytes = 4;
283eb8 ¤   ¤   SetRect(&source.bounds, 0, 0, 32, 32);
e8da2c ¤   ¤   GetPort(&port);
a71b6b ¤   ¤   destination = port->portBits;
90b13a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Transfer the mask.
fbc69e ¤   ¤   CopyBits(¤  &source, &destination, &source.bounds, iconRect,
e0dc70 ¤   ¤   ¤   ¤   ¤   srcBic, nil);
e24d11 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Then the icon.
5199d9 ¤   ¤   source.baseAddr = *icon;
967c4f ¤   ¤   CopyBits(&source, &destination, &source.bounds, iconRect, srcOr, nil);
109371 ¤   }
b5efe6 }
fbaf5a
15c772 // --------------------------------------------------------------------------
3c9443 // Notes
65af5a
5f153c // Checking for PlotIconID:
e844f3 // We (PNL) now check for system 7 and colour QD, and use colour graf ports
37019a // and PlotIconID only if both are true
503a79 // Otherwise we use B&W grafport and draw using PlotBWIcon.
--a14d 001016a29504012019e Page 1 of ShowInitIcon.h
bfb2bf #ifndef __ShowInitIcon__
04f155 #define __ShowInitIcon__
1baf5a
72728f #include <Types.h>
69af5a
8c506a // Usage: pass the ID of your icon family (ICN#/icl4/icl8) to have it drawn
24406b // in the right spot. If 'advance' is true, the next INIT icon will be drawn
17ce01 // to the right of your icon. If it is false, the next INIT icon will
929150 // overwrite yours. You can use it to create animation effects by calling
24b048 // ShowInitIcon several times with 'advance' set to false.
35af5a
b13379 #ifdef __cplusplus
706dad extern "C" {
9f7454 #endif
2faf5a
22d95c pascal void ShowInitIcon (short iconFamilyID, Boolean advance);
b1af5a
0f3379 #ifdef __cplusplus
2aefe6 }
f97454 #endif
50af5a
01358c #endif /* __ShowInitIcon__ */
--9822 0017ee0b4554012019f Page 1 of StSaveCurResFile.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
3e5d0c ¤   $Id: StSaveCurResFile.cp,v 1.3.20.1 1998/11/12 03:10:52 heller Exp $
d6f7f7 ____________________________________________________________________________*/
eeaf5a
49aa64 #include "StSaveCurResFile.h"
9baf5a
06af5a
bf94e6 StSaveCurResFile::StSaveCurResFile(
886524 ¤   Boolean¤inResLoad)
62bb36 {
6aa96f ¤   Initialize(inResLoad);
98efe6 }
5caf5a
87af5a
9daf5a
fd94e6 StSaveCurResFile::StSaveCurResFile(
260b54 ¤   SInt16¤ inRefNum,
b16524 ¤   Boolean¤inResLoad)
25bb36 {
23a96f ¤   Initialize(inResLoad);
6d5ad2 ¤   ::UseResFile(inRefNum);
7befe6 }
f8af5a
d2af5a
81af5a
d294e6 StSaveCurResFile::StSaveCurResFile(
a21e9e ¤   FSSpec¤ inSpec,
e097f2 ¤   SInt16¤ inPerm,
106524 ¤   Boolean¤inResLoad)
d72150 ¤   ¤   : mOpenedFile(inSpec)
48bb36 {
5ea96f ¤   Initialize(inResLoad);
459530 ¤   mOpenedFile.OpenResourceFork(inPerm);
a4efe6 }
1dae30 ¤   ¤   ¤   ¤   ¤
7eaf5a
aeaf5a
00963e StSaveCurResFile::~StSaveCurResFile()
c3bb36 {
cd387e ¤   ::UseResFile(mSavedResFile);
21b8dd ¤   ::LMSetResLoad(mResLoad);
66efe6 }
90af5a
1caf5a
02af5a
536d52 ¤   void
32a661 StSaveCurResFile::Initialize(
b66524 ¤   Boolean¤inResLoad)
dabb36 {
1d1bf8 ¤   mSavedResFile = ::CurResFile();
a72fd7 ¤   mResLoad = ::LMGetResLoad();
84337f ¤   ::SetResLoad(inResLoad);
7ebe43 }¶
--6a06 0014444f676401201a0 Page 1 of StSaveCurResFile.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
eacdb8 ¤   $Id: StSaveCurResFile.h,v 1.3.20.1 1998/11/12 03:10:52 heller Exp $
7ff7f7 ____________________________________________________________________________*/
64af5a
e78d55 #pragma once·
56af5a
9b9f28 #include "LFile.h"
54af5a
ca7be1 class StSaveCurResFile {
035ed4 public:
126b38 ¤   ¤   ¤   ¤   StSaveCurResFile(Boolean inResLoad = true);
7aebe2 ¤   ¤   ¤   ¤   StSaveCurResFile(SInt16 inRefNum, Boolean inResLoad = true);
827c38 ¤   ¤   ¤   ¤   StSaveCurResFile(FSSpec inSpec, SInt16 inPerm = fsRdPerm,
fad198 ¤   ¤   ¤   ¤   ¤   ¤   Boolean inResLoad = true);
14ae30 ¤   ¤   ¤   ¤   ¤
41b2a1 ¤   virtual¤¤   ~StSaveCurResFile();
d567c5 ¤
e3a2d3 protected:
2d674e ¤   SInt8¤  ¤   mResLoad;
a80b17 ¤   SInt16¤ ¤   mSavedResFile;
ea1b59 ¤   LFile¤  ¤   mOpenedFile;
be67c5 ¤
d56f94 ¤   void¤   ¤   Initialize(Boolean inResLoad = true);
4482f7 };
--a46f 0010a033a98401201a1 Page 1 of StSaveHeapZone.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
1dd423 ¤   $Id: StSaveHeapZone.h,v 1.2.20.1 1998/11/12 03:10:53 heller Exp $
c6f7f7 ____________________________________________________________________________*/
f5af5a
4f8d55 #pragma once·
2baf5a
59ff18 class StSaveHeapZone {
e75ed4 public:
796876 ¤   ¤   ¤   ¤   StSaveHeapZone()
5ddbbf ¤   ¤   ¤   ¤   ¤   { mSavedZone = ::GetZone(); }
3520a9 ¤   ¤   ¤   ¤   StSaveHeapZone(THz inSetZone)
93a19a ¤   ¤   ¤   ¤   ¤   { mSavedZone = ::GetZone(); ::SetZone(inSetZone); }
34616e ¤   virtual¤¤   ~StSaveHeapZone()
bc08b3 ¤   ¤   ¤   ¤   ¤   { ::SetZone(mSavedZone); }
76af5a
1ea2d3 protected:
5f0d55 ¤   THz¤¤   ¤   mSavedZone;
0a82f7 };
--0f02 0012ff95810401201a2 Page 1 of StSuspendAESpecialHandler.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
159350 ¤   $Id: StSuspendAESpecialHandler.cp,v 1.2.20.1 1998/11/12 03:10:54 heller Exp¶
0aed4e ·$
98f7f7 ____________________________________________________________________________*/
f7af5a
9a464b #include "StSuspendAESpecialHandler.h"
b1af5a
38af5a
03af5a
906f42 StSuspendAESpecialHandler::StSuspendAESpecialHandler(
be8d48 ¤   AEKeyword¤  inFunctionClass,
69a473 ¤   Boolean¤¤   inIsSysHandler)
ca3a29 ¤   ¤   : mFunctionClass(inFunctionClass), mHandler(nil),
dc83a3 ¤   ¤   ··mIsSysHandler(inIsSysHandler)
b2bb36 {
ac4eb6 ¤   Suspend();
99efe6 }
2eaf5a
ceaf5a
9daf5a
3368a6 StSuspendAESpecialHandler::~StSuspendAESpecialHandler()
22bb36 {
9fca56 ¤   Resume();
e5efe6 }
8b67c5 ¤
e5af5a
73af5a
166d52 ¤   void
b2f235 StSuspendAESpecialHandler::Suspend()
b9bb36 {
f806ac ¤   ::AEGetSpecialHandler(¤ mFunctionClass,
09d323 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mHandler,
b16745 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mIsSysHandler);
57a0fb ¤   if (mHandler != nil) {
fc3a1d ¤   ¤   ::AERemoveSpecialHandler(¤  mFunctionClass,
40c7b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mHandler,
bfe954 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mIsSysHandler);
0b9371 ¤   }
4fefe6 }
ebaf5a
d8af5a
38af5a
826d52 ¤   void
e4a30c StSuspendAESpecialHandler::Resume()
42bb36 {
4fa0fb ¤   if (mHandler != nil) {
11e6ae ¤   ¤   ::AEInstallSpecialHandler(¤ mFunctionClass,
c7c7b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mHandler,
d5e954 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mIsSysHandler);
2d9371 ¤   }
2fefe6 }
--2cec 001cf316cda401201a3 Page 1 of StSuspendAESpecialHandler.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
16d8e8 ¤   $Id: StSuspendAESpecialHandler.h,v 1.2.20.1 1998/11/12 03:10:54 heller Exp $
4cf7f7 ____________________________________________________________________________*/
afaf5a
6d8d55 #pragma once·
ebaf5a
d2b0ae class StSuspendAESpecialHandler {
8d5ed4 public:
2c2bf4 ¤   ¤   ¤   ¤   ¤   ¤   StSuspendAESpecialHandler(
2ae433 ¤   ¤   ¤   ¤   ¤   ¤   ¤   AEKeyword inFunctionClass,
0d96c0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inIsSysHandler = false);
2a5962 ¤   virtual¤¤   ¤   ¤   ~StSuspendAESpecialHandler();
a067c5 ¤
baa2d3 protected:
a8ba3b ¤   AEKeyword¤  ¤   ¤   mFunctionClass;
c2f691 ¤   UniversalProcPtr¤   mHandler;
99ebd7 ¤   Boolean¤¤   ¤   ¤   mIsSysHandler;
ebaf5a
1d1c7e ¤   void¤   ¤   ¤   ¤   Suspend();
498706 ¤   void¤   ¤   ¤   ¤   Resume();
cf82f7 };
--7a51 001b673191f401201a4 Page 1 of UPGPException.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
0dc45c ¤   $Id: UPGPException.cp,v 1.1.20.1 1998/11/12 03:10:56 heller Exp $
67f7f7 ____________________________________________________________________________*/
0faf5a
43d7de #ifdef Debug_Throw
dd6619 Str15¤  gErrorString;
b62841 #endif¶
--a7e7 000c97920b3401201a5 Page 1 of UPGPException.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
0c3fcd ¤   $Id: UPGPException.h,v 1.3.18.1 1998/11/12 03:10:56 heller Exp $
fbf7f7 ____________________________________________________________________________*/
29af5a
658d55 #pragma once·
58af5a
8fc963 #include <UException.h>
4e5317 #include "PGPErrors.h"
4476f0 #include "CComboError.h"
38af5a
06af5a
396ed6 /* Defines the following macros
63610a ¤   PGPThrow_Err
03536c ¤   PGPThrowComboErr_
c66e10 ¤   PGPThrowIfPGPErr_
98955d ¤   PGPThrowPGPErr_
ac9f32 ¤   PGPThrowIfOSErr_
1d3d0e ¤   PGPThrowOSErr_
ea6742 ¤   PGPThrowIfNil_
b82527 ¤   PGPThrowIfNULL_
0ee2c9 ¤   PGPThrowIfResError_
92f632 ¤   PGPThrowIfMemError_
8230fd ¤   PGPThrowIfResFail_
a96aa9 ¤   PGPThrowIfMemFail_
0c14a8 ¤   PGPThrowIf_
1a6f8f ¤   PGPThrowIfNot_
af7fe0 */
d9af5a
332600 #define PGPThrow_Err(err)¤  ¤   throw(err)
43af5a
58af5a
94d7de #ifdef Debug_Throw
fde5cb extern Str15¤   gErrorString;
dcf635 #define¤PGPThrowComboErr_(comboerr)¤¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
d2e6e0 ¤   do {¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
57c6f3 ¤   ¤   if (! comboerr.IsCancelError()) {¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
de1ec8 ¤   ¤   ¤   if (comboerr.HavePGPError()) {¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
eca359 ¤   ¤   ¤   ¤   ::NumToString(comboerr.pgpErr, gErrorString);¤  ¤   ¤   \
e20877 ¤   ¤   ¤   } else {¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
906c0b ¤   ¤   ¤   ¤   ::NumToString(comboerr.err, gErrorString);¤ ¤   ¤   ¤   \
34ad09 ¤   ¤   ¤   }¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
e86c25 ¤   ¤   ¤   if (gDebugThrow == debugAction_Alert) {¤¤   ¤   ¤   ¤   ¤   \
efce53 ¤   ¤   ¤   ¤   UDebugging::AlertThrowAt(¤  gErrorString,¤  ¤   ¤   ¤   \
7c27de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   "\p" __FILE__, __LINE__);¤  \
ea42d5 ¤   ¤   ¤   } else if (gDebugThrow == debugAction_LowLevelDebugger) {¤  \
234bb7 ¤   ¤   ¤   ¤   BreakStrToLowLevelDebugger_(gErrorString);¤ ¤   ¤   ¤   \
649236 ¤   ¤   ¤   } else if (gDebugThrow == debugAction_SourceDebugger) {¤¤   \
35e9b7 ¤   ¤   ¤   ¤   BreakToSourceDebugger_();¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
c8ad09 ¤   ¤   ¤   }¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
d3e426 ¤   ¤   }¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
ec6168 ¤   ¤   PGPThrow_Err(comboerr);¤¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
3569cf ¤   } while (false)
cfdb21 #else
49064d #define PGPThrowComboErr_(comboerr)¤¤   PGPThrow_Err(comboerr)
397454 #endif
85af5a
2aaf5a
c78a80 #define PGPThrowIfPGPErr_(pgpErr)¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
52cf86 ¤   if (pgpErr != kPGPError_NoErr) {¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
2353ee ¤   ¤   PGPThrowComboErr_(CComboError(CComboError::kPGPError, pgpErr));¤\
929371 ¤   }
12af5a
51bd28 #define PGPThrowPGPErr_(err)¤   PGPThrowComboErr_(¤ ¤   ¤   ¤   ¤   ¤   ¤   \
26f71f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CComboError(CComboError::kPGPError, err))
6aaf5a
75af5a
c9af5a
--2dc5 0011666261c401201a5 Page 2 of UPGPException.h
30575f #define PGPThrowIfOSErr_(err)¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
86c025 ¤   if (err != noErr) {¤¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
e72bb2 ¤   ¤   PGPThrowComboErr_(CComboError(CComboError::kPlatformError, err));¤  \
2b9371 ¤   }
98af5a
c9af5a
20af5a
e49a21 #define PGPThrowOSErr_(err)¤PGPThrowComboErr_(¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
e214a3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CComboError(CComboError::kPlatformError, err))
5caf5a
5caf5a
88af5a
485c17 #define¤PGPThrowIfNil_(ptr)¤¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
a7c32e ¤   ¤   if ((ptr) == nil) PGPThrowComboErr_(¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
6c0d25 ¤   ¤   ¤   ¤   CComboError(CComboError::kPGPError, kPGPError_BadMemAddress));
23af5a
34af5a
b0af5a
e21d3b #define¤PGPThrowIfNULL_(ptr)¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
06c32e ¤   ¤   if ((ptr) == nil) PGPThrowComboErr_(¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
36e002 ¤   ¤   ¤   CComboError(CComboError::kPGPError, kPGPError_BadMemAddress));
5faf5a
e99e6d #define¤PGPThrowIfResError_()¤  PGPThrowIfOSErr_(ResError())
f6d0c4 #define¤PGPThrowIfMemError_()¤  PGPThrowIfOSErr_(MemError())
b7af5a
aeaf5a
e61051 #define¤PGPThrowIfResFail_(h)¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
8a12c4 ¤   if ((h) == nil) {¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
e567f5 ¤   ¤   OSErr¤  __theErr = ResError();¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
5210e7 ¤   ¤   if (__theErr == noErr) {¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
bd3e89 ¤   ¤   ¤   __theErr = resNotFound;¤¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
203aae ¤   ¤   }¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
66066e ¤   PGPThrowComboErr_(CComboError(CComboError::kPlatformError, __theErr));¤ \
5a9371 ¤   }
23af5a
b7af5a
7667c5 ¤
b5d4ea #define¤PGPThrowIfMemFail_(p)¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
16ad4e ¤   if ((p) == nil) {¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
e8a798 ¤   ¤   OSErr¤  __theErr = MemError();¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
4a327d ¤   ¤   if (__theErr == noErr) __theErr = memFullErr;¤  ¤   ¤   ¤   ¤   ¤   \
4e066e ¤   PGPThrowComboErr_(CComboError(CComboError::kPlatformError, __theErr));¤ \
a49371 ¤   }
6daf5a
46af5a
65af5a
d49ee3 #define¤PGPThrowIf_(test)¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
2338f4 ¤   ¤   if (test) PGPThrowComboErr_(CComboError(CComboError::kPGPError,¤¤   \
67c17f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPError_AssertFailed));
d7af5a
68af5a
8baf5a
a74bc1 #define¤PGPThrowIfNot_(test)¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
3fc2bf ¤   ¤   if (!(test)) PGPThrowComboErr_(CComboError(CComboError::kPGPError,¤ \
167d2e ¤   ¤   ¤   ¤   ¤   kPGPError_AssertFailed));
--1351 00086449a24401201a6 Page 1 of BackupHandler.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
a2c0ef ¤   $Id: BackupHandler.cp,v 1.14.8.1 1998/11/12 03:07:51 heller Exp $
26f7f7 ____________________________________________________________________________*/
1ff871 #include "BackupHandler.h"
419dc2 #include "CWarningAlert.h"
b6a076 #include "pgpKeys.h"
26b8cb #include "CPGPKeys.h"
25bbf4 #include "MacFiles.h"
2659c5 #include "CPGPStDialogHandler.h"
28af5a
634919 #include "pgpUtilities.h"
0f91b9 #include "pgpSDKPrefs.h"
25af5a
54dd56 #include <PP_Messages.h>
337b32 #include <PP_KeyCodes.h>
72c660 #include <UKeyFilters.h>
b1af5a
b97e69 ¤   Boolean
857a48 BackupHandler::Run(void)
2dbb36 {
09d9fb ¤   CPGPStDialogHandler¤theHandler(kBackupWindowID, this);
8b8c55 ¤   MessageT¤   ¤   ¤   hitMessage;
6567c5 ¤
4416ad ¤   LWindow¤¤   ¤   *theDialog ¤= theHandler.GetDialog();¤
989fcc ¤   pgpAssertAddrValid(theDialog, LWindow);
0667c5 ¤
cfad6a ¤   mOKButton = (LPushButton *)theDialog->FindPaneByID(kOKButtonID);¤
24af5a
ddfe8f ¤   mDontSaveButton = (LPushButton *)
84cb04 ¤   ¤   theDialog->FindPaneByID(kNoBackupButtonID);¤
35af5a
43d7cd ¤   mCancelButton = (LPushButton *)theDialog->FindPaneByID(kCancelButtonID);¤
b067c5 ¤
3923c9 ¤   mCancelButton->AddListener(&theHandler);
18af5a
a60cf4 ¤   theDialog->Show();
8b098f ¤   SwitchTarget(theDialog);
bc67c5 ¤
6dcfa1 ¤   do
3ec7a1 ¤   {
682196 ¤   ¤   hitMessage = theHandler.DoDialog();
cf77fd ¤   }¤  while(hitMessage == msg_Nothing);
ba67c5 ¤
800306 ¤   if(hitMessage == msg_OK)
10c7a1 ¤   {
8fae21 ¤   ¤   Point¤  ¤   where¤  = { 0, 0 };
747620 ¤   ¤   SFReply¤¤   reply;
ea5c64 ¤   ¤   Str255¤ ¤   prompt, fileName;
581b52 ¤   ¤
967310 ¤   ¤   GetIndString(prompt, kBackupStrings, kBackupMessageID);
29c8ac ¤   ¤   pgpAssert(prompt[ 0 ] > 0);
a61b52 ¤   ¤
4b342a ¤   ¤   GetIndString(fileName, kBackupStrings, kBackupFileNameID);
f2a858 ¤   ¤   pgpAssert(fileName[ 0 ] > 0);
a11b52 ¤   ¤
a239d9 ¤   ¤   SFPutFile(where, prompt, fileName, nil, &reply);
03d0aa ¤   ¤   if(reply.good)
d05b34 ¤   ¤   {
827abc ¤   ¤   ¤   OSStatus¤   ¤   myErr;
e97412 ¤   ¤   ¤   PGPError¤   ¤   err;
7d03ad ¤   ¤   ¤   Int16¤  ¤   ¤   vRefNum;
e9f7e8 ¤   ¤   ¤   Int32¤  ¤   ¤   dirID, procID;
12d9a3 ¤   ¤   ¤   FSSpec¤ ¤   ¤   spec, srcSpec;
9c87c7 ¤   ¤   ¤
3ce39e ¤   ¤   ¤   myErr = GetWDInfo(reply.vRefNum, &vRefNum, &dirID, &procID);
0b9ca6 ¤   ¤   ¤   if(myErr == noErr)
86f776 ¤   ¤   ¤   {
--c8bb 0002c391d90401201a6 Page 2 of BackupHandler.cp
558a34 ¤   ¤   ¤   ¤   myErr = FSMakeFSSpec(vRefNum, dirID, reply.fName, &spec);
6c9861 ¤   ¤   ¤   ¤   if(myErr == fnfErr)
4cc038 ¤   ¤   ¤   ¤   ¤   myErr = noErr;
dd3dff ¤   ¤   ¤   ¤   FSpDelete( &spec );
6fa3a6 ¤   ¤   ¤   }
5b531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
a79ca6 ¤   ¤   ¤   if(myErr == noErr)
66f776 ¤   ¤   ¤   {
ad5e17 ¤   ¤   ¤   ¤   PGPFileSpecRef¤ fileRef;
a287c7 ¤   ¤   ¤
a9143f ¤   ¤   ¤   ¤   err = PGPsdkPrefGetFileSpec(¤   gPGPContext,
e55ff3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPsdkPref_PrivateKeyring,
ca30dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fileRef);
98bfc9 ¤   ¤   ¤   ¤   if(IsntErr(err) && fileRef)
4b72c3 ¤   ¤   ¤   ¤   {
78ef53 ¤   ¤   ¤   ¤   ¤   err = PGPGetFSSpecFromFileSpec(fileRef, &srcSpec);
0f6aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
0a23d6 ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->CommitDefaultKeyrings();
54a5d7 ¤   ¤   ¤   ¤   ¤   myErr = FSpCopyFiles( gPGPMemoryMgr, &srcSpec, &spec);
52c291 ¤   ¤   ¤   ¤   ¤   PGPFreeFileSpec( fileRef );
0bd20b ¤   ¤   ¤   ¤   ¤   fileRef¤= NULL;
d62613 ¤   ¤   ¤   ¤   }
39fa07 ¤   ¤   ¤   ¤   else
2b7d22 ¤   ¤   ¤   ¤   ¤   myErr = -43;
8fa3a6 ¤   ¤   ¤   }
a0af5a
009741 ¤   ¤   ¤   if(myErr != noErr)
b9ff2e ¤   ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
b72f8b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kBackupStrings, kBackupErrorStringID);
290fe4 ¤   ¤   }
a6d4a3 ¤   ¤   GetIndString(prompt, kBackupStrings, kPublicBackupMessageID);
71c8ac ¤   ¤   pgpAssert(prompt[ 0 ] > 0);
631b52 ¤   ¤
23470a ¤   ¤   GetIndString(fileName, kBackupStrings, kPublicFileNameID);
e6a858 ¤   ¤   pgpAssert(fileName[ 0 ] > 0);
e91b52 ¤   ¤
9039d9 ¤   ¤   SFPutFile(where, prompt, fileName, nil, &reply);
78d0aa ¤   ¤   if(reply.good)
415b34 ¤   ¤   {
cb7abc ¤   ¤   ¤   OSStatus¤   ¤   myErr;
dc7412 ¤   ¤   ¤   PGPError¤   ¤   err;
695bfa ¤   ¤   ¤   PGPFileSpecRef¤ fileRef;
4003ad ¤   ¤   ¤   Int16¤  ¤   ¤   vRefNum;
bcf7e8 ¤   ¤   ¤   Int32¤  ¤   ¤   dirID, procID;
dad9a3 ¤   ¤   ¤   FSSpec¤ ¤   ¤   spec, srcSpec;
c587c7 ¤   ¤   ¤
d0e39e ¤   ¤   ¤   myErr = GetWDInfo(reply.vRefNum, &vRefNum, &dirID, &procID);
0d9ca6 ¤   ¤   ¤   if(myErr == noErr)
8ff776 ¤   ¤   ¤   {
c88a34 ¤   ¤   ¤   ¤   myErr = FSMakeFSSpec(vRefNum, dirID, reply.fName, &spec);
0c9861 ¤   ¤   ¤   ¤   if(myErr == fnfErr)
c8c038 ¤   ¤   ¤   ¤   ¤   myErr = noErr;
9c3dff ¤   ¤   ¤   ¤   FSpDelete( &spec );
fca3a6 ¤   ¤   ¤   }
0e531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
c99ca6 ¤   ¤   ¤   if(myErr == noErr)
d0f776 ¤   ¤   ¤   {
dd143f ¤   ¤   ¤   ¤   err = PGPsdkPrefGetFileSpec(¤   gPGPContext,
eaa713 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPsdkPref_PublicKeyring,
8b30dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fileRef);
c1bd8d ¤   ¤   ¤   ¤   if(fileRef)
bf72c3 ¤   ¤   ¤   ¤   {
15ef53 ¤   ¤   ¤   ¤   ¤   err = PGPGetFSSpecFromFileSpec(fileRef, &srcSpec);
726aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
d723d6 ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->CommitDefaultKeyrings();
2655ce ¤   ¤   ¤   ¤   ¤   myErr = FSpCopyFiles(gPGPMemoryMgr, &srcSpec, &spec);
5b2613 ¤   ¤   ¤   ¤   }
35fa07 ¤   ¤   ¤   ¤   else
d87d22 ¤   ¤   ¤   ¤   ¤   myErr = -43;
22a3a6 ¤   ¤   ¤   }
85af5a
2c9741 ¤   ¤   ¤   if(myErr != noErr)
--9fd3 0011d9ed974401201a6 Page 3 of BackupHandler.cp
11ff2e ¤   ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
602f8b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kBackupStrings, kBackupErrorStringID);
560fe4 ¤   ¤   }
c69371 ¤   }
49eb66 ¤   else if(hitMessage == msg_Cancel)
dc92b0 ¤   ¤   return false;
9aab7e ¤   return true;
d4efe6 }
feaf5a
18af5a
707e69 ¤   Boolean
6e533c BackupHandler::HandleKeyPress(const EventRecord&¤   inKeyEvent)
aebb36 {
cf9dbc ¤   switch (inKeyEvent.message & charCodeMask)·
b0c7a1 ¤   {
93073f ¤   ¤   case char_Enter:
b735bd ¤   ¤   case char_Return:
98ce1c ¤   ¤   ¤   pgpAssertAddrValid(mOKButton, VoidAlign);
cc5675 ¤   ¤   ¤   mOKButton->SimulateHotSpotClick(kControlButtonPart);
525b24 ¤   ¤   ¤   return true;
73cdcb ¤   ¤   ¤   break;
af87c7 ¤   ¤   ¤
cbc82e ¤   ¤   case char_Escape:
e05388 ¤   ¤   ¤   pgpAssertAddrValid(mCancelButton, VoidAlign);
fc30a0 ¤   ¤   ¤   if ((inKeyEvent.message & keyCodeMask) == vkey_Escape)·
5057e7 ¤   ¤   ¤   ¤   mCancelButton->SimulateHotSpotClick(kControlButtonPart);
3d5b24 ¤   ¤   ¤   return true;
08cdcb ¤   ¤   ¤   break;
4a87c7 ¤   ¤   ¤
459ae3 ¤   ¤   default:
ed5b34 ¤   ¤   {
789348 ¤   ¤   ¤   char¤   charCode = inKeyEvent.message & charCodeMask;
4987c7 ¤   ¤   ¤
e28210 ¤   ¤   ¤   if ((charCode == 's') || (charCode == 'S'))
2ef776 ¤   ¤   ¤   {
90cd6b ¤   ¤   ¤   ¤   pgpAssertAddrValid(mOKButton, VoidAlign);
37dc30 ¤   ¤   ¤   ¤   mOKButton->SimulateHotSpotClick(kControlButtonPart);
826f79 ¤   ¤   ¤   ¤   return true;
67a3a6 ¤   ¤   ¤   }
88e704 ¤   ¤   ¤   else if ((charCode == 'd') || (charCode == 'D'))
01f776 ¤   ¤   ¤   {
8f6350 ¤   ¤   ¤   ¤   pgpAssertAddrValid(mDontSaveButton, VoidAlign);
ead37e ¤   ¤   ¤   ¤   mDontSaveButton->SimulateHotSpotClick(kControlButtonPart);
7c6f79 ¤   ¤   ¤   ¤   return true;
c8a3a6 ¤   ¤   ¤   }
74e767 ¤   ¤   ¤   if (UKeyFilters::IsCmdPeriod(inKeyEvent))·
d0f776 ¤   ¤   ¤   {
bc57e7 ¤   ¤   ¤   ¤   mCancelButton->SimulateHotSpotClick(kControlButtonPart);
606f79 ¤   ¤   ¤   ¤   return true;
27a3a6 ¤   ¤   ¤   }
146b93 ¤   ¤   ¤   else·
867e26 ¤   ¤   ¤   ¤   return LCommander::HandleKeyPress(inKeyEvent);
ce0fe4 ¤   ¤   }
039371 ¤   }
29efe6 }
1daf5a
--d2e4 00133be0970401201a7 Page 1 of BackupHandler.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
4b33a4 ¤   $Id: BackupHandler.h,v 1.5.8.1 1998/11/12 03:07:51 heller Exp $
44f7f7 ____________________________________________________________________________*/
97af5a
ff2f94 #include <LCommander.h>
ee8fd4 #include <LWindow.h>
00d797 #include <LPushButton.h>
05af5a
afaf5a
f6cc3e class LWindow;
86fb7b class LGAPushButton;
73af5a
7c8afa class¤  BackupHandler:¤ public¤ LCommander
76bb36 {
32a2d3 protected:
a2d35c ¤   LWindow¤¤   ¤   *mWindow;
c82f1e ¤   LPushButton¤¤   *mOKButton;
14320a ¤   LPushButton¤¤   *mCancelButton;
7e8d9d ¤   LPushButton¤¤   *mDontSaveButton;
b206cb ¤   enum¤   ¤   ¤   {
6412f3 ¤   ¤   ¤   ¤   ¤   ¤   kBackupWindowID¤¤   ¤   = 135,
049619 ¤   ¤   ¤   ¤   ¤   ¤   kOKButtonID¤¤   ¤   ¤   = 'OK ·',
0069e2 ¤   ¤   ¤   ¤   ¤   ¤   kCancelButtonID¤¤   ¤   = 'Canc',
a69ae6 ¤   ¤   ¤   ¤   ¤   ¤   kNoBackupButtonID¤  ¤   = 'Dont',
0c6c20 ¤   ¤   ¤   ¤   ¤   ¤   kBackupStrings ¤¤   ¤   = 1008,
fe894f ¤   ¤   ¤   ¤   ¤   ¤   kBackupOKTitleID¤   ¤   = 1,
1777c3 ¤   ¤   ¤   ¤   ¤   ¤   kBackupCancelTitleID¤   = 2,
392960 ¤   ¤   ¤   ¤   ¤   ¤   kBackupMessageID¤   ¤   = 3,
9f942b ¤   ¤   ¤   ¤   ¤   ¤   kBackupErrorStringID¤   = 4,
e469a2 ¤   ¤   ¤   ¤   ¤   ¤   kBackupFileNameID¤  ¤   = 5,
fa7f11 ¤   ¤   ¤   ¤   ¤   ¤   kPublicBackupMessageID¤ = 6,
ea298a ¤   ¤   ¤   ¤   ¤   ¤   kPublicFileNameID¤  ¤   = 7,
3435e8 ¤   ¤   ¤   ¤   ¤   ¤   kBackupCreator¤ ¤   ¤   = '????',
fd3d49 ¤   ¤   ¤   ¤   ¤   ¤   kBackupFileType¤¤   ¤   = 'TEXT'
aa19f5 ¤   ¤   ¤   ¤   ¤   };
c3af5a
165ed4 public:
e73c8b ¤   Boolean¤Run( void );
c067c5 ¤
0b8c50 ¤   Boolean¤HandleKeyPress( const EventRecord&¤ inKeyEvent );
6eaf5a
bd82f7 };
33af5a
--e843 001df05815a401201a8 Page 1 of CDragSource.h
997b7d #pragma once
bdaf5a
58fd99 #include <UTables.h>
97af5a
d89f3d class CKeyDragTask;
26af5a
c96476 class CDragSource
5cbb36 {
dc5ed4 public:
cd2e89 ¤   virtual void¤   GetDragHiliteRgn(
7a4202 ¤   ¤   ¤   ¤   ¤   ¤   RgnHandle¤  ¤   ¤   ioHiliteRgn,
035303 ¤   ¤   ¤   ¤   ¤   ¤   const STableCell&¤  skipCell,
924202 ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   globalize )¤= 0;
7494aa ¤   ¤   ¤   ¤   ¤   ¤
50ab7c ¤   virtual void¤   AddFlavors(¤¤
c8c0f5 ¤   ¤   ¤   ¤   ¤   ¤   CKeyDragTask¤   ¤   *dragTask )¤= 0;
73071b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
fb410d ¤   virtual Boolean¤GetKeyRef(
4364f0 ¤   ¤   ¤   ¤   ¤   ¤   ItemReference¤  ¤   item,·
504c50 ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef *¤¤   ¤   key )¤  ¤   = 0;
d059da ¤   virtual Boolean¤GetTextBlock(
7764f0 ¤   ¤   ¤   ¤   ¤   ¤   ItemReference¤  ¤   item,·
1b403b ¤   ¤   ¤   ¤   ¤   ¤   void¤   ¤   ¤   ¤   **outData,
c1d69c ¤   ¤   ¤   ¤   ¤   ¤   long¤   ¤   ¤   ¤   *len )¤ ¤   = 0;
01c883 ¤   virtual¤Boolean¤GetHFS(
8da073 ¤   ¤   ¤   ¤   ¤   ¤   ItemReference¤  ¤   item,
c1f66a ¤   ¤   ¤   ¤   ¤   ¤   DragReference¤  ¤   dragRef,
2a0b1e ¤   ¤   ¤   ¤   ¤   ¤   FSSpec¤ ¤   ¤   ¤   *spec)¤ ¤   = 0;
6582f7 };
dfaf5a
--b15d 000e1100939401201a9 Page 1 of CFingerprintField.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
79eb51 ¤   $Id: CFingerprintField.cp,v 1.7.8.1 1998/11/12 03:07:52 heller Exp $
f4f7f7 ____________________________________________________________________________*/
dfaf5a
a0dc1d #include <Scrap.h>
ebaf5a
a61d80 #include <LDragAndDrop.h>
1ea13b #include <LDragTask.h>
2f8f92 #include <UGAColorRamp.h>
827e6d #include <UDrawingState.h>
55e8ae #include <UDrawingUtils.h>
a5f8a6 #include <UTextTraits.h>
64dd56 #include <PP_Messages.h>
d7324c #include <string.h>
07af5a
afc238 #include "CFingerprintField.h"
c9af5a
7aaf5a
80d5fd ¤   CFingerprintField *
4ce88b CFingerprintField::CreateFromStream(
33796d ¤   LStream * inStream)
3dbb36 {
b3ed7b ¤   return new CFingerprintField(inStream);
8fefe6 }
8caf5a
88e9ca CFingerprintField::CFingerprintField()
3cbb36 {
e4efe6 }
42af5a
2aa79d CFingerprintField::CFingerprintField(
86152c ¤   const CFingerprintField & inOriginal)
2cd199 ¤   : CRecessedCaption(inOriginal)
25bb36 {
efefe6 }
aaaf5a
72a79d CFingerprintField::CFingerprintField(
55796d ¤   LStream * inStream)
c20234 ¤   : CRecessedCaption(inStream)
40bb36 {
4aefe6 }
dcaf5a
d57e69 ¤   Boolean
64c52c CFingerprintField::ObeyCommand(
a918df ¤   CommandT¤   ¤   ¤   inCommand,
8d1c0e ¤   void *¤ ¤   ¤   ¤   ioParam)
79bb36 {
059d83 ¤   Boolean cmdHandled;
9a3ac9 ¤   if ((inCommand == cmd_Copy) && (IsTarget()))
b5c7a1 ¤   {
44fe75 ¤   ¤   ::ZeroScrap();
f9c994 ¤   ¤   ::PutScrap(mText[ 0 ], 'TEXT', &mText[ 1 ]);
a5a85c ¤   ¤   cmdHandled = true;
f69371 ¤   }
978a92 ¤   else if( inCommand == msg_TabSelect )
32c7a1 ¤   {
84c1c5 ¤   ¤   cmdHandled = TRUE;
689371 ¤   }
5f0e24 ¤   else
fcc7a1 ¤   {
fe5f52 ¤   ¤   cmdHandled = LCommander::ObeyCommand(inCommand, ioParam);
809371 ¤   }
fb51a4 ¤   return cmdHandled;
a6efe6 }
85af5a
7f6d52 ¤   void
a3f3d4 CFingerprintField::FindCommandStatus(
e118df ¤   CommandT¤   ¤   ¤   inCommand,
--7963 000892e6f9e401201a9 Page 2 of CFingerprintField.cp
fedaea ¤   Boolean &¤  ¤   ¤   outEnabled,
2b22f2 ¤   Boolean &¤  ¤   ¤   outUsesMark,
2b2128 ¤   Char16 &¤   ¤   ¤   outMark,
21f1d2 ¤   Str255¤ ¤   ¤   ¤   outName)
7abb36 {
aa3ac9 ¤   if ((inCommand == cmd_Copy) && (IsTarget()))
95c7a1 ¤   {
379b7e ¤   ¤   outEnabled = true;
3c994c ¤   ¤   outUsesMark = false;
909371 ¤   }
7d0e24 ¤   else
5fc7a1 ¤   {
6117d2 ¤   ¤   LCommander::FindCommandStatus(inCommand, outEnabled, outUsesMark,
b87b5a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outMark, outName);
949371 ¤   }
34efe6 }
5faf5a
9a6d52 ¤   void
9271d0 CFingerprintField::FinishCreateSelf()
b5bb36 {
cfa39e ¤   CRecessedCaption::FinishCreateSelf();
d6efe6 }
7baf5a
9c6d52 ¤   void
25751a CFingerprintField::ClickSelf(
7b9508 ¤   const SMouseDownEvent & inMouseDown)
70bb36 {
3ec3a2 ¤   CRecessedCaption::ClickSelf(inMouseDown);
4891f0 ¤   // clicking in a CFingerprintField makes it the Target.
42af5a
a247d1 ¤   if (!IsTarget())
8bc7a1 ¤   {
995797 ¤   ¤   SwitchTarget(this);
6a9371 ¤   }
b267c5 ¤
bad2af ¤   if( LDropArea::DragAndDropIsPresent() )
48c7a1 ¤   {
4c66a9 ¤   ¤   if( WaitMouseMoved( inMouseDown.macEvent.where ) )
025b34 ¤   ¤   {
ad38d0 ¤   ¤   ¤   Rect¤   ¤   ¤   ¤   dragRect;
e459fb ¤   ¤   ¤   StPortOriginState¤  saveState( GetMacPort() );
0487c7 ¤   ¤   ¤
8da728 ¤   ¤   ¤   SetOrigin( 0, 0 );
9287c7 ¤   ¤   ¤
3bf286 ¤   ¤   ¤   CalcPortFrameRect( dragRect );
c387c7 ¤   ¤   ¤
bcd850 ¤   ¤   ¤   LDragTask¤  drag( inMouseDown.macEvent, dragRect,
7551cb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   1, 'TEXT', &mText[1], mText[0], 0 );
b90fe4 ¤   ¤   }
bd9371 ¤   }
43efe6 }
18af5a
946d52 ¤   void
fcb0b6 CFingerprintField::AdjustCursorSelf(
99e42e ¤   Point¤  ¤   ¤   ¤   inPortPt,
327f53 ¤   const EventRecord &¤inMacEvent)
c6bb36 {
d3dca5 ¤   CRecessedCaption::AdjustCursorSelf(inPortPt, inMacEvent);
eeefe6 }
91af5a
b66d52 ¤   void
bc61d5 CFingerprintField::BeTarget()
00bb36 {
e52bd4 ¤   LCommander::BeTarget();
6cc137 ¤   Refresh();¤
6defe6 }
76af5a
ba6d52 ¤   void
42a010 CFingerprintField::DontBeTarget()
ccbb36 {
7b6367 ¤   LCommander::DontBeTarget();
894fc9 ¤   Refresh();
--1506 0002b6d98ac401201a9 Page 3 of CFingerprintField.cp
7aefe6 }
46af5a
746d52 ¤   void
00e1ca CFingerprintField::DrawSelf()
25bb36 {
795e64 ¤   // background color is white for all drawing in this pane
e73d18 ¤   StColorPenState¤theColorPenState;
7deb77 ¤   ::RGBBackColor (&(UGAColorRamp::GetWhiteColor()));
e4c21f ¤   CRecessedCaption::DrawSelf();
1befe6 }
24af5a
b66d52 ¤   void
53a284 CFingerprintField::DrawBackground(
f80530 ¤   const Rect & localFrame)
d9bb36 {
64a045 ¤   Rect frameCopy = localFrame;
bdb367 ¤   ::InsetRect(&frameCopy, 2, 2);
d4a708 ¤   ::EraseRect(&frameCopy);
f7efe6 }
9baf5a
026d52 ¤   void
4240d2 CFingerprintField::DrawBox(
2c0530 ¤   const Rect & localFrame)
b6bb36 {
8e3d18 ¤   StColorPenState¤theColorPenState;
d5a045 ¤   Rect frameCopy = localFrame;
d70d8e ¤   ::PenNormal();
0faf5a
eac673 ¤   /*// draw the surrounding shadow if on a color screen
fcc7a1 ¤   {
caac01 ¤   ¤   StDeviceLoop¤   theLoop (localFrame);
2baf5a
5b9bc4 ¤   ¤   Int16¤  ¤   ¤   ¤   depth;
aedbf2 ¤   ¤   while (theLoop.NextDepth (depth))·
985b34 ¤   ¤   {
d9120b ¤   ¤   ¤   if (depth >= 8)¤// 256 colors
19f776 ¤   ¤   ¤   {
fa152b ¤   ¤   ¤   ¤   DrawGrayBox(localFrame);
aca3a6 ¤   ¤   ¤   }
950fe4 ¤   ¤   }
3d9371 ¤   }
2567c5 ¤
7aff45 ¤   // always draw the black box regardless of depth
630d8e ¤   ::PenNormal();
4d3ec4 ¤   ::InsetRect(&frameCopy, 1, 1);
b88e29 ¤   ::RGBForeColor (&(UGAColorRamp::GetBlackColor()));
775758 ¤   ::FrameRect(&frameCopy);*/
d7efe6 }
02af5a
ad6d52 ¤   void
247aa4 CFingerprintField::DrawText(
330530 ¤   const Rect & localFrame)
abbb36 {
c9a045 ¤   Rect frameCopy = localFrame;
a999a6 ¤   // three pixels around text are shadow, black box, white box.
ea3009 ¤   ::InsetRect(&frameCopy, 3, 3);
ce67c5 ¤
2d03b4 ¤   frameCopy.top--;¤   // needed to match spec appearance
cdaf5a
e0c7a1 ¤   {
549d57 ¤   ¤   StColorPenState¤theColorPenState;¤  //¤ needed to restore before
8f1246 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   //¤ target-hiliting below
0046ce ¤   ¤   Int16 just = UTextTraits::SetPortTextTraits(mTxtrID);
161b52 ¤   ¤
b1fce1 ¤   ¤   RGBColor¤   textColor;
cee934 ¤   ¤   ::GetForeColor(&textColor);
c71b52 ¤   ¤
5efe46 ¤   ¤   ApplyForeAndBackColors();
3a44ea ¤   ¤   ::RGBForeColor(&textColor);
47af5a
c853a0 ¤   ¤   UTextDrawing::DrawWithJustification((Ptr)&mText[1], mText[0],
2b3bbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   frameCopy, just);
--9712 001b43a2537401201a9 Page 4 of CFingerprintField.cp
a19371 ¤   }
9967c5 ¤
ba3566 ¤   if (IsTarget())
bfc7a1 ¤   {
050844 ¤   ¤   UDrawingUtils::SetHiliteModeOn();
900618 ¤   ¤   ::InvertRect(&frameCopy);
f59371 ¤   }
b4efe6 }
--6cea 00194b16117401201aa Page 1 of CFingerprintField.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
dae033 ¤   $Id: CFingerprintField.h,v 1.3.8.1 1998/11/12 03:07:53 heller Exp $
7ef7f7 ____________________________________________________________________________*/
877b7d #pragma once
68af5a
c32f94 #include <LCommander.h>
46af5a
eb7894 #include "CRecessedCaption.h"
e5af5a
bbec37 class CFingerprintField :¤  public CRecessedCaption,
e26686 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LCommander
34bb36 {
4a5ed4 public:
a335da ¤   enum { class_ID = 'Fing' };
de9844 ¤   static CFingerprintField * CreateFromStream(LStream * inStream);
60af5a
f09715 ¤   ¤   ¤   ¤   ¤   ¤   CFingerprintField();
fbb222 ¤   ¤   ¤   ¤   ¤   ¤   CFingerprintField(
9f884b ¤   ¤   ¤   ¤   ¤   ¤   ¤   const CFingerprintField & inOriginal );
38e0ef ¤   ¤   ¤   ¤   ¤   ¤   CFingerprintField(¤ LStream * inStream );
b6af5a
4f368b ¤   virtual Boolean¤¤   ObeyCommand(
4608b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CommandT¤   ¤   ¤   inCommand,
c80352 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *¤ ¤   ¤   ¤   ioParam);
3177c0 ¤   virtual void¤   ¤   FindCommandStatus(
e508b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CommandT¤   ¤   ¤   inCommand,
44072f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &¤  ¤   ¤   outEnabled,
67b38e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &¤  ¤   ¤   outUsesMark,
c05715 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &¤   ¤   ¤   outMark,
3e1f5e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   ¤   ¤   outName);
c7d3d4 ¤   virtual void¤   ¤   DrawSelf();
6080fd ¤   virtual void¤   ¤   FinishCreateSelf();
4bc555 ¤   virtual void¤   ¤   ClickSelf(
3a0969 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent & inMouseDown);
f7ac36 ¤   virtual void¤   ¤   AdjustCursorSelf(
12ec3e ¤   ¤   ¤   ¤   ¤   ¤   ¤   Point¤  ¤   ¤   ¤   inPortPt,
522b14 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord &¤inMacEvent);
223b22 ¤   virtual void¤   ¤   BeTarget();
cdda43 ¤   virtual void¤   ¤   DontBeTarget();
c967c5 ¤
ada2d3 protected:
27e4bf ¤   virtual void¤   ¤   DrawBackground(¤const Rect & localFrame);
6d4bbe ¤   virtual void¤   ¤   DrawBox(¤   ¤   const Rect & localFrame);
eb4860 ¤   virtual void¤   ¤   DrawText(¤  ¤   const Rect & localFrame);
d582f7 };
94af5a
--fe6d 00013aca8fa401201ab Page 1 of CGroupsWindow.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
4a8a75 ¤   $Id: CGroupsWindow.cp,v 1.41.2.1.2.1 1998/11/12 03:07:53 heller Exp $
64f7f7 ____________________________________________________________________________*/
c8af5a
ec255b #include <Fonts.h>
97af5a
6c8f92 #include <UGAColorRamp.h>
ba7e6d #include <UDrawingState.h>
e2e8ae #include <UDrawingUtils.h>
2dffe3 #include <UGraphicUtils.h>
cbbe77 #include <LTableMultiGeometry.h>
238848 #include <LTableMultiSelector.h>
717b38 #include <LTableArrayStorage.h>
697c09 #include <LEditText.h>
b4a13b #include <LDragTask.h>
d37538 #include <LDropFlag.h>
66dd56 #include <PP_Messages.h>
4e7b32 #include <PP_KeyCodes.h>
0caf5a
5adf3f #include "CGroupsWindow.h"
76af5a
4d6ff8 #include "CKeyTable.h"
2eb409 #include "CKeyView.h"
bab8cb #include "CPGPKeys.h"
32d49e #include "CKeyInfoWindow.h"
745dc0 #include "ResourceConstants.h"
a2af5a
a89dc2 #include "CWarningAlert.h"
8ebbf4 #include "MacFiles.h"
e085c2 #include "MacStrings.h"
7f59c5 #include "CPGPStDialogHandler.h"
27af5a
0a894b #include "pgpFileSpec.h"
dd0d08 #include "pgpMem.h"
46a076 #include "pgpKeys.h"
8e4919 #include "pgpUtilities.h"
7ac97b #include "pgpClientPrefs.h"
c610f0 #include "pgpOpenPrefs.h"
baa02f #include "pgpClientLib.h"
a691b9 #include "pgpSDKPrefs.h"
43af5a
15af5a
bc92fd const Int16¤¤   ¤   kRowHeight¤ ¤   ¤   ¤   ¤   = ¤ 18;
cc8296 const ResIDT¤   ¤   kNewGroupDialogID¤  ¤   ¤   = ¤ 155;
740282 const Int16¤¤   ¤   kUserIDStringLength¤¤   ¤   = ¤ 256;
cbde12 const FlavorType¤   kGroupIDDragFlavor¤ ¤   ¤   = ¤ 'gkID';
cbf8b5 const FlavorType¤   kGroupItemDragFlavor¤   ¤   =¤  'giID';
cf77fd const ResIDT¤   ¤   kGroupColumnTitleStringsID¤ = ¤ 1021;
aa7ffe const Int16¤¤   ¤   kNameColumnWidth¤   ¤   ¤   =¤  286;
fbb139 const Int16¤¤   ¤   kValidityColumnWidth¤   ¤   =¤  51;
e6af5a
bcaf5a
0ff989 enum¤   {
56ab0e ¤   ¤   ¤   kStringListID¤  ¤   = 1020,
79ee6b ¤   ¤   ¤   kBadGroupInfoStringID = 1,
3bb7b7 ¤   ¤   ¤   kDeleteConfirmStringID,
494ede ¤   ¤   ¤   kUnknownKeyStringID,
3c8223 ¤   ¤   ¤   kExpandSelectionID,
2b4d9c ¤   ¤   ¤   kCollapseSelectionID,
b5f6d7 ¤   ¤   ¤   kExpandAllID,
4f5a48 ¤   ¤   ¤   kCollapseAllID
abcdb9 ¤   ¤   };¤
16af5a
09af5a
a1fef2 #pragma mark --- Window Functions ---
c8af5a
13227a CGroupsWindow::CGroupsWindow()
--e546 000b4d95167401201ab Page 2 of CGroupsWindow.cp
2cbb36 {
cbefe6 }
a7af5a
ffe4e0 CGroupsWindow::CGroupsWindow(LStream *inStream)
d228bf ¤   :¤  LWindow(inStream)
a5bb36 {
d85ab6 ¤   mGroupsRef¤ ¤   = kInvalidPGPGroupSetRef;
d9b15f ¤   mGroupsFile¤¤   = kInvalidPGPFileSpecRef;
05efe6 }
2daf5a
3de6b1 CGroupsWindow::~CGroupsWindow()
c2bb36 {
637bb3 ¤   if( PGPGroupSetRefIsValid(mGroupsRef) &&
579779 ¤   ¤   PGPFileSpecRefIsValid(mGroupsFile))
c1c7a1 ¤   {
fddb1b ¤   ¤   if(PGPGroupSetNeedsCommit(mGroupsRef))
e9774b ¤   ¤   ¤   PGPSaveGroupSetToFile(mGroupsRef, mGroupsFile);
819371 ¤   }
a49b92 ¤   if(PGPGroupSetRefIsValid(mGroupsRef))
60c4f2 ¤   ¤   PGPFreeGroupSet(mGroupsRef);
fc1026 ¤   if(PGPFileSpecRefIsValid(mGroupsFile))
4069e1 ¤   ¤   PGPFreeFileSpec(mGroupsFile);
fdefe6 }
d4af5a
2c6d52 ¤   void
87dea3 CGroupsWindow::FinishCreateSelf()
84bb36 {
110305 ¤   LWindow::FinishCreateSelf();
d85303 ¤   mGroupsTable = (CGroupsTable *)FindPaneByID(CGroupsTable::class_ID);
14c7a1 ¤   {
c3cf44 ¤   ¤   PGPError¤   ¤   err;
c720bc ¤   ¤   PGPFileSpecRef¤ groupSpec;
9c1b52 ¤   ¤
06532c ¤   ¤   err = PGPsdkPrefGetFileSpec( gPGPContext, kPGPsdkPref_GroupsFile,
3cc145 ¤   ¤   ¤   ¤   ¤   &groupSpec );
6e86f8 ¤   ¤   if( IsntPGPError( err ) )
2c5b34 ¤   ¤   {
a644b9 ¤   ¤   ¤   mGroupsFile = groupSpec;
78e709 ¤   ¤   ¤   err = PGPNewGroupSetFromFile(gPGPContext, groupSpec,
472ca7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mGroupsRef);
b8af5a
363c6b ¤   ¤   ¤   if ( IsntPGPError( err ) )
80f776 ¤   ¤   ¤   {
29ed68 ¤   ¤   ¤   ¤   err¤= PGPSortGroupSetStd( mGroupsRef,
5e3b86 ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet() );
bfa3a6 ¤   ¤   ¤   }
380fe4 ¤   ¤   }
425194 ¤   ¤   if( IsErr( err ) && !PGPGroupSetRefIsValid( mGroupsRef ) )
915b34 ¤   ¤   {
ce03e8 ¤   ¤   ¤   // We couldn't open the file, let's just make a group set
29b193 ¤   ¤   ¤   err = PGPNewGroupSet(gPGPContext, &mGroupsRef);
a1524f ¤   ¤   ¤   pgpAssertNoErr(err);
640fe4 ¤   ¤   }
6faf0b ¤   ¤   if(IsErr(err))
0b3c4c ¤   ¤   ¤   ReportPGPError(err);
e5b82a ¤   ¤   pgpAssertAddrValid(mGroupsRef, PGPGroupSetRef);
50a82a ¤   ¤   mGroupsTable->SetGroupSet(mGroupsRef, mGroupsFile);
149371 ¤   }
1ac18d ¤   SwitchTarget(mGroupsTable);
aa60d9 ¤   Show();
3fefe6 }
30af5a
f96d52 ¤   void
d113d6 CGroupsWindow::AttemptClose()
d8bb36 {
a9fe86 ¤   BroadcastMessage(kGroupsWindowClosed, NULL);
2d1fbc ¤   LWindow::AttemptClose();
95efe6 }
c2af5a
5b6d52 ¤   void
e2d7be CGroupsWindow::ListenToMessage(MessageT inMessage, void *ioParam)
b4bb36 {
--8588 0005ae61662401201ab Page 3 of CGroupsWindow.cp
6e26d0 ¤   switch(inMessage)
f8c7a1 ¤   {
ce9371 ¤   }
58efe6 }
12af5a
726d52 ¤   void
7f9819 CGroupsWindow::InvalidateCaches()
bfbb36 {
39fa5f ¤   mGroupsTable->InvalidateCaches();
54efe6 }
e3af5a
1aaf5a
446e80 #pragma mark --- Table Functions ---
47af5a
1821f6 CGroupsTable::CGroupsTable(
4b6689 ¤   LStream¤*inStream)
5d53c4 ¤   ¤   :¤  CPGPHierarchyTable(inStream),
590019 ¤   ¤   ¤   LDragAndDrop(UQDGlobals::GetCurrentPort(), this)
bfbb36 {
0faaa3 ¤   mTableGeometry¤ = new LTableMultiGeometry(this,¤100, kRowHeight);
51ce41 ¤   mTableSelector¤ = new LTableMultiSelector(this);
82e68e ¤   mTableStorage¤  = new LTableArrayStorage(this, (ulong)0);
73d75e ¤   mGroupsRef¤ = kInvalidPGPGroupSetRef;
634920 ¤   mGroupsFile¤= kInvalidPGPFileSpecRef;
1c3e37 ¤   mSendingDrag = FALSE;
6defe6 }
f0af5a
6b314a void
78baea CGroupsTable::FinishCreateSelf()
49bb36 {
ba0bf3 ¤   RemoveAllCols(false);
14ca88 ¤   InsertCols(kMaxColumnTypes, 1, NULL, 0, false);
da8b9a ¤   SetColWidth(kNameColumnWidth, 1, 1);
878018 ¤   SetColWidth(kValidityColumnWidth, 2, 2);
3c40e3 ¤   SetColWidth(300, 3, 3);
caefe6 }
e2af5a
9f003d CGroupsTable::~CGroupsTable()
6cbb36 {
6fefe6 }
06af5a
096d52 ¤   void
f0d831 CGroupsTable::SetGroupSet(PGPGroupSetRef groupRef, PGPFileSpecRef groupsFile)
8fbb36 {
289563 ¤   mGroupsRef¤ = groupRef;
550d01 ¤   mGroupsFile¤= groupsFile;
a6e78a ¤   ResyncTable(TRUE, FALSE);
dec46d ¤   RedrawTable();
1befe6 }
70af5a
226d52 ¤   void
0dfc50 CGroupsTable::InvalidateCaches()
91bb36 {
902b89 ¤   RebuildTable();
aaefe6 }
1daf5a
ae6d52 ¤   void
e04f48 CGroupsTable::RebuildTable()
d8bb36 {
d767d2 ¤   RemoveAllRows(false);
6e9fd9 ¤   ResortGroups();
94e78a ¤   ResyncTable(TRUE, FALSE);
3ec46d ¤   RedrawTable();
d1efe6 }
a3af5a
6b6d52 ¤   void
bac023 CGroupsTable::ResyncTable(Boolean collapse, Boolean onlyUnmarked)
6dbb36 {
335d66 ¤   PGPUInt32¤  ¤   ¤   numGroups,
384802 ¤   ¤   ¤   ¤   ¤   ¤   groupIndex,
cfb183 ¤   ¤   ¤   ¤   ¤   ¤   itemIndex,
5a959f ¤   ¤   ¤   ¤   ¤   ¤   numKeyEntries,
--4561 00034970d24401201ab Page 4 of CGroupsWindow.cp
584ee9 ¤   ¤   ¤   ¤   ¤   ¤   numTotalEntries;
9e7bc5 ¤   PGPGroupID¤ ¤   ¤   groupID;
278f52 ¤   PGPError¤   ¤   ¤   err;
016186 ¤   GroupTableEntry¤¤   groupEntry;
f8629b ¤   PGPGroupInfo¤   ¤   groupInfo;
e11863 ¤   PGPGroupItem¤   ¤   groupItem;
793e86 ¤   TableIndexT¤¤   ¤   lastGroupRow,
33c45e ¤   ¤   ¤   ¤   ¤   ¤   lastRow,
b9cad0 ¤   ¤   ¤   ¤   ¤   ¤   itemSubRow;
9167c5 ¤
706bef ¤   if(!onlyUnmarked)
63ee86 ¤   ¤   RemoveAllRows(false);
acea53 ¤   lastRow = lastGroupRow = 0;
8726ed ¤   err = PGPCountGroupsInSet(mGroupsRef, &numGroups);
4fdd44 ¤   pgpAssertNoErr(err);
ea9263 ¤   for(groupIndex = 0; groupIndex < numGroups ; groupIndex++)
66c7a1 ¤   {
633038 ¤   ¤   err = PGPGetIndGroupID(mGroupsRef, groupIndex, &groupID);
23e919 ¤   ¤   pgpAssertNoErr(err);
91b929 ¤   ¤   err = PGPGetGroupInfo(mGroupsRef, groupID, &groupInfo);
56e919 ¤   ¤   pgpAssertNoErr(err);
504441 ¤   ¤   ++lastRow;
874102 ¤   ¤   if(groupInfo.userValue == 0 || !onlyUnmarked)
675b34 ¤   ¤   {
e69041 ¤   ¤   ¤   groupEntry.isTopGroup = TRUE;
8aa4f6 ¤   ¤   ¤   groupEntry.u.groupID = groupID;
5152d5 ¤   ¤   ¤   lastGroupRow = InsertSiblingRows(1, lastGroupRow, &groupEntry,
20805d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(GroupTableEntry),
8bfc44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TRUE, TRUE);
6bb775 ¤   ¤   ¤   PGPSetGroupUserValue(mGroupsRef, groupID, (PGPUserValue)1);
730fe4 ¤   ¤   }
909426 ¤   ¤   else if(!lastGroupRow)
2f40b5 ¤   ¤   ¤   lastGroupRow = 1;
48ef68 ¤   ¤   if(lastRow > 1)
a9270a ¤   ¤   ¤   lastGroupRow = lastRow;
d08222 ¤   ¤   err = PGPCountGroupItems(mGroupsRef, groupID, FALSE,
2c2053 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &numKeyEntries, &numTotalEntries);
6ce919 ¤   ¤   pgpAssertNoErr(err);
011124 ¤   ¤   if(numTotalEntries > 0)
b25b34 ¤   ¤   {
32e34c ¤   ¤   ¤   for(itemIndex = 0; itemIndex < numTotalEntries; itemIndex++)
faf776 ¤   ¤   ¤   {
bb4469 ¤   ¤   ¤   ¤   err = PGPGetIndGroupItem(mGroupsRef, groupID,
359c50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   itemIndex, &groupItem);
216f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
d8a20e ¤   ¤   ¤   ¤   lastRow++;
9c3d8e ¤   ¤   ¤   ¤   if(groupItem.userValue == 0 || !onlyUnmarked)
5872c3 ¤   ¤   ¤   ¤   {
3f2b74 ¤   ¤   ¤   ¤   ¤   groupEntry.isTopGroup = FALSE;
455d1c ¤   ¤   ¤   ¤   ¤   groupEntry.u.item.ownerGroupID = groupID;
458436 ¤   ¤   ¤   ¤   ¤   groupEntry.u.item.cachedKey = kInvalidPGPKeyRef;
5e3221 ¤   ¤   ¤   ¤   ¤   pgpCopyMemory(&groupItem, &groupEntry.u.item.groupItem,
c63ebd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(PGPGroupItem));
9aed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
631f1d ¤   ¤   ¤   ¤   ¤   if(itemIndex == 0)
434859 ¤   ¤   ¤   ¤   ¤   {
1a9b40 ¤   ¤   ¤   ¤   ¤   ¤   InsertChildRows(1, lastGroupRow, &groupEntry,
79f684 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(GroupTableEntry),
f42f2a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FALSE, TRUE);
7e51b3 ¤   ¤   ¤   ¤   ¤   ¤   itemSubRow = lastGroupRow + 1;
ce1c89 ¤   ¤   ¤   ¤   ¤   }
614bd6 ¤   ¤   ¤   ¤   ¤   else
5f95f2 ¤   ¤   ¤   ¤   ¤   ¤   itemSubRow = InsertSiblingRows(1, itemSubRow,
9c7b58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &groupEntry, sizeof(GroupTableEntry),
b82c5d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FALSE, TRUE);
215119 ¤   ¤   ¤   ¤   ¤   PGPSetIndGroupItemUserValue(mGroupsRef, groupID,
a13df3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   itemIndex, (PGPUserValue)1);
6c2613 ¤   ¤   ¤   ¤   }
00fa07 ¤   ¤   ¤   ¤   else
4972c3 ¤   ¤   ¤   ¤   {
7f1f1d ¤   ¤   ¤   ¤   ¤   if(itemIndex == 0)
3451b3 ¤   ¤   ¤   ¤   ¤   ¤   itemSubRow = lastGroupRow + 1;
--a57c 000ca2d417b401201ab Page 5 of CGroupsWindow.cp
f54bd6 ¤   ¤   ¤   ¤   ¤   else
b33623 ¤   ¤   ¤   ¤   ¤   ¤   itemSubRow = lastRow;
f12613 ¤   ¤   ¤   ¤   }
00a3a6 ¤   ¤   ¤   }
520fe4 ¤   ¤   }
049371 ¤   }
a31351 ¤   if(collapse)
e82e39 ¤   ¤   CollapseGroups(FALSE);
7defe6 }
e1af5a
ad6d52 ¤   void
1a1043 CGroupsTable::RedrawTable()
c3bb36 {
f7d8a7 ¤   Rect frame;
5067c5 ¤
2ed986 ¤   CalcPortFrameRect(frame);
b89033 ¤   InvalPortRect(&frame);
84efe6 }
52af5a
066d52 ¤   void
0325c6 CGroupsTable::CollapseGroups(Boolean all)
8ebb36 {
fd8295 ¤   TableIndexT¤rows,
dd8bde ¤   ¤   ¤   ¤   cols,
25c879 ¤   ¤   ¤   ¤   rowIndex;
6226c1 ¤   STableCell¤ cell(1, 1);
1450da ¤   Boolean¤¤   selectedOnly;
db0981 ¤   Rect¤   ¤   frame;
1667c5 ¤
3241ca ¤   if(all)
ee62c2 ¤   ¤   selectedOnly = FALSE;
d40e24 ¤   else
a2795a ¤   ¤   selectedOnly = (mTableSelector->GetFirstSelectedRow() > 0);
192be0 ¤   GetWideOpenTableSize(rows, cols);
47c1a5 ¤   for(rowIndex = rows;rowIndex > 0;rowIndex--)
87c7a1 ¤   {
859da9 ¤   ¤   cell.row = GetExposedIndex(rowIndex);
2867f9 ¤   ¤   if(!selectedOnly || CellIsSelected(cell))
f85fc4 ¤   ¤   ¤   if(IsCollapsable(rowIndex))
2cd837 ¤   ¤   ¤   ¤   DeepCollapseRow(rowIndex);
bd9371 ¤   }
4b846a ¤   cell.row = cell.col = 1;
136729 ¤   ScrollCellIntoFrame(cell);
4c67c5 ¤
1bd986 ¤   CalcPortFrameRect(frame);
f19033 ¤   InvalPortRect(&frame);
93efe6 }
b0af5a
cc6d52 ¤   void
0e3813 CGroupsTable::ExpandGroups()
e9bb36 {
9a8295 ¤   TableIndexT¤rows,
568bde ¤   ¤   ¤   ¤   cols,
97c879 ¤   ¤   ¤   ¤   rowIndex;
1226c1 ¤   STableCell¤ cell(1, 1);
4750da ¤   Boolean¤¤   selectedOnly;
2067c5 ¤
314434 ¤   selectedOnly = (mTableSelector->GetFirstSelectedRow() > 0);
4d2be0 ¤   GetWideOpenTableSize(rows, cols);
84c1a5 ¤   for(rowIndex = rows;rowIndex > 0;rowIndex--)
47c7a1 ¤   {
179da9 ¤   ¤   cell.row = GetExposedIndex(rowIndex);
5867f9 ¤   ¤   if(!selectedOnly || CellIsSelected(cell))
ed5fc4 ¤   ¤   ¤   if(IsCollapsable(rowIndex))
25ccbb ¤   ¤   ¤   ¤   DeepExpandRow(rowIndex);
519371 ¤   }
b3c46d ¤   RedrawTable();
52efe6 }
31af5a
126d52 ¤   void
ea51aa CGroupsTable::DrawCell(
ca1bb3 ¤   const STableCell¤   &inCell,
--fe86 0009b51035e401201ab Page 6 of CGroupsWindow.cp
f1c050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
80bb36 {
2598d7 ¤   TableIndexT¤woRow = mCollapsableTree->GetWideOpenIndex(inCell.row);
680981 ¤   Rect¤   ¤   frame;
4faf5a
4767b9 ¤   CalcLocalFrameRect( frame );
28c7a1 ¤   {
83296f ¤   ¤   StDeviceLoop¤   devLoop(frame);¤¤
cc77ad ¤   ¤   SInt16¤ ¤   ¤   depth;
b1af5a
93eb96 ¤   ¤   while(devLoop.NextDepth(depth))
235b34 ¤   ¤   {
f30190 ¤   ¤   ¤   STableCell¤ ¤   ¤   woCell(woRow, 1);
fe1d19 ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof(GroupTableEntry);
5fc55d ¤   ¤   ¤   GroupTableEntry¤¤   tableEntry;
f587c7 ¤   ¤   ¤
24a74f ¤   ¤   ¤   GetCellData(woCell, &tableEntry, dataSize);
6354ff ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray1));
ca447a ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
a40a1d ¤   ¤   ¤   ::TextMode(srcOr);
4346c8 ¤   ¤   ¤   switch(inCell.col-1)
21f776 ¤   ¤   ¤   {
9f09d9 ¤   ¤   ¤   ¤   case kAddressColumnID:
efec11 ¤   ¤   ¤   ¤   ¤   DrawAddressColumnCell(&tableEntry, inLocalRect, depth);
f7b9c2 ¤   ¤   ¤   ¤   ¤   SetCellData(woCell, &tableEntry, dataSize);
28cdbc ¤   ¤   ¤   ¤   ¤   DrawDropFlag(inCell, woRow);
f214c3 ¤   ¤   ¤   ¤   ¤   break;
830948 ¤   ¤   ¤   ¤   case kValidityColumnID:
82cccc ¤   ¤   ¤   ¤   ¤   DrawValidityColumnCell(&tableEntry, inLocalRect, depth);
5f14c3 ¤   ¤   ¤   ¤   ¤   break;
5263bb ¤   ¤   ¤   ¤   case kDescriptionColumnID:
a6ede8 ¤   ¤   ¤   ¤   ¤   DrawDescriptionColumnCell(&tableEntry, inLocalRect, depth);
3514c3 ¤   ¤   ¤   ¤   ¤   break;
30a3a6 ¤   ¤   ¤   }
6d7810 ¤   ¤   ¤   if(depth >= 8)
0dba9d ¤   ¤   ¤   ¤   RefreshBorder(inLocalRect);
d90fe4 ¤   ¤   }
c89371 ¤   }
66efe6 }
0daf5a
fa6d52 ¤   void
4f4731 CGroupsTable::CacheKey(GroupTableEntry *tableEntry)
ebbb36 {
8a61e0 ¤   PGPError¤   err;
c067c5 ¤
92c9a6 ¤   if(!PGPKeyRefIsValid(tableEntry->u.item.cachedKey) &&
2efa15 ¤   ¤   tableEntry->u.item.groupItem.type == kPGPGroupItem_KeyID)
f6c7a1 ¤   {
244294 ¤   ¤   err = PGPGetKeyByKeyID(CPGPKeys::TheApp()->GetKeySet(),
ccd6ca ¤   ¤   ¤   ¤   ¤   ¤   &tableEntry->u.item.groupItem.u.key.keyID,
3b1556 ¤   ¤   ¤   ¤   ¤   ¤   tableEntry->u.item.groupItem.u.key.algorithm,
da7053 ¤   ¤   ¤   ¤   ¤   ¤   &tableEntry->u.item.cachedKey);
3e9371 ¤   }
c6efe6 }
d6af5a
2b6d52 ¤   void
3bf591 CGroupsTable::DrawAddressColumnCell(
4ff7a4 ¤   GroupTableEntry¤¤   *gtr,
bf2d08 ¤   Rect¤   ¤   ¤   ¤   cellRect,
85b19a ¤   Int16¤  ¤   ¤   ¤   depth)
fdbb36 {
983bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
4486a4 ¤   Rect¤   ¤   ¤   sortColumnRect;
c7bbb8 ¤   Str255¤ ¤   ¤   pstr;
115052 ¤   ResIDT¤ ¤   ¤   iconID;
cdadf6 ¤   Int16¤  ¤   ¤   slop;
a040a8 ¤   PGPGroupInfo¤   groupInfo;
d7af5a
b3f82d ¤   // Draw Background
35a118 ¤   if(depth >= 8)
c4c7a1 ¤   {
9bbc5e ¤   ¤   // Draw MacOS8-like background for cells, selected column
--6f0c 00018bebbc3401201ab Page 7 of CGroupsWindow.cp
251a40 ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray1));
c280c6 ¤   ¤   ::PaintRect(&cellRect);
63078c ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
1f12e6 ¤   ¤   sortColumnRect = cellRect;
8c38eb ¤   ¤   sortColumnRect.left = cellRect.left + kDropFlagSlop;
6b64cf ¤   ¤   sortColumnRect.right = cellRect.right;
cb759e ¤   ¤   ::PaintRect(&sortColumnRect);
8c5159 ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
b59371 ¤   }
290e24 ¤   else
2fc7a1 ¤   {
d55159 ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
0b70a2 ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
a2a204 ¤   ¤   ::EraseRect(&cellRect);
f29371 ¤   }
aedcbe ¤   // Draw Info
113f18 ¤   if(gtr->isTopGroup)
60c7a1 ¤   {
68112d ¤   ¤   iconID = kDHGroupIconID;
311f38 ¤   ¤   CKeyTable::DrawIcon(iconID, cellRect, 1);
cd1b52 ¤   ¤
8f5fad ¤   ¤   err = PGPGetGroupInfo(mGroupsRef, gtr->u.groupID, &groupInfo);
52e919 ¤   ¤   pgpAssertNoErr(err);
aab4c6 ¤   ¤   CToPString(groupInfo.name, pstr);
a5de3c ¤   ¤   ::TextFont(kFontIDGeneva);
b30ea2 ¤   ¤   ::TextSize(9);
aaa301 ¤   ¤   ::TextFace(0);
54d9e3 ¤   ¤   ::TruncString(¤ kNameColumnWidth -
c5f1ff ¤   ¤   ¤   ¤   ¤   ¤   kDropFlagSlop - kLeftIndent -
fb515e ¤   ¤   ¤   ¤   ¤   ¤   kIconWidth - kLeftBorder,
536900 ¤   ¤   ¤   ¤   ¤   ¤   pstr, truncMiddle);
be3388 ¤   ¤   ::MoveTo(cellRect.left + kDropFlagSlop + kLeftIndent +
2887ba ¤   ¤   ¤   ¤   ¤   ¤   kIconWidth + kLeftBorder, cellRect.bottom -
fe7834 ¤   ¤   ¤   ¤   ¤   ¤   kBottomBorder);
b265ba ¤   ¤   ::DrawString(pstr);
599371 ¤   }
150e24 ¤   else
2ac7a1 ¤   {
1339ca ¤   ¤   pstr[0] = 0;
60a301 ¤   ¤   ::TextFace(0);
c02d73 ¤   ¤   if(gtr->u.item.groupItem.type == kPGPGroupItem_KeyID)
f45b34 ¤   ¤   {
80c2af ¤   ¤   ¤   char¤   ¤   cstr[kUserIDStringLength];
a17422 ¤   ¤   ¤   PGPSize¤¤   len;
ae87c7 ¤   ¤   ¤
117e85 ¤   ¤   ¤   CacheKey(gtr);
672a02 ¤   ¤   ¤   if(PGPKeyRefIsValid(gtr->u.item.cachedKey))
c7f776 ¤   ¤   ¤   {
44b621 ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   ¤   ¤   expired,
2336bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   revoked,
cc7516 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   disabled,
1c7cf1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   secret;
88ad51 ¤   ¤   ¤   ¤   PGPPublicKeyAlgorithm¤  algorithm;
06e598 ¤   ¤   ¤   ¤   PGPKeyRef¤  ¤   ¤   ¤   key;
e42b85 ¤   ¤   ¤   ¤
9c78c9 ¤   ¤   ¤   ¤   key ¤   ¤   = gtr->u.item.cachedKey;
2add93 ¤   ¤   ¤   ¤   algorithm ¤ = (PGPPublicKeyAlgorithm)
7f422f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   gtr->u.item.groupItem.u.key.algorithm;
512b85 ¤   ¤   ¤   ¤
8c5c03 ¤   ¤   ¤   ¤   err = PGPGetKeyBoolean(¤key, kPGPKeyPropIsExpired,
7d8d57 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &expired);
9a6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
6b0ec3 ¤   ¤   ¤   ¤   err = PGPGetKeyBoolean(¤key, kPGPKeyPropIsRevoked,
a24b09 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &revoked);
b56f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
c8efd7 ¤   ¤   ¤   ¤   err = PGPGetKeyBoolean(¤key, kPGPKeyPropIsDisabled,
0d4023 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &disabled);
ca6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
605719 ¤   ¤   ¤   ¤   err = PGPGetKeyBoolean(key, kPGPKeyPropIsSecret,
35fbab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &secret);
096f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
18af5a
--76ae 000d8dd49f0401201ab Page 8 of CGroupsWindow.cp
432c46 ¤   ¤   ¤   ¤   if( revoked )
d372c3 ¤   ¤   ¤   ¤   {
3b2b7e ¤   ¤   ¤   ¤   ¤   if(algorithm == kPGPPublicKeyAlgorithm_DSA)
dddeab ¤   ¤   ¤   ¤   ¤   ¤   iconID = kDSARevokedKeyID;
1a4bd6 ¤   ¤   ¤   ¤   ¤   else
c8b668 ¤   ¤   ¤   ¤   ¤   ¤   iconID = kRSARevokedKeyID;
402613 ¤   ¤   ¤   ¤   }
ba8b1f ¤   ¤   ¤   ¤   else if( expired )
b472c3 ¤   ¤   ¤   ¤   {
f789b3 ¤   ¤   ¤   ¤   ¤   if( algorithm == kPGPPublicKeyAlgorithm_DSA )
da79bc ¤   ¤   ¤   ¤   ¤   ¤   iconID = kDSAExpiredKeyID;
e54bd6 ¤   ¤   ¤   ¤   ¤   else
ee117f ¤   ¤   ¤   ¤   ¤   ¤   iconID = kRSAExpiredKeyID;
f32613 ¤   ¤   ¤   ¤   }
5e7d18 ¤   ¤   ¤   ¤   else if( disabled )
5972c3 ¤   ¤   ¤   ¤   {
c489b3 ¤   ¤   ¤   ¤   ¤   if( algorithm == kPGPPublicKeyAlgorithm_DSA )
6be6e1 ¤   ¤   ¤   ¤   ¤   ¤   iconID = kDSADisabledKeyID;
904bd6 ¤   ¤   ¤   ¤   ¤   else
d1121e ¤   ¤   ¤   ¤   ¤   ¤   iconID = kRSADisabledKeyID;
0a2613 ¤   ¤   ¤   ¤   }
9ff514 ¤   ¤   ¤   ¤   else if(secret)
f472c3 ¤   ¤   ¤   ¤   {
0c2b7e ¤   ¤   ¤   ¤   ¤   if(algorithm == kPGPPublicKeyAlgorithm_DSA)
6aae2f ¤   ¤   ¤   ¤   ¤   ¤   iconID = kDSAKeyPairIconID;
b24bd6 ¤   ¤   ¤   ¤   ¤   else
7d5ad0 ¤   ¤   ¤   ¤   ¤   ¤   iconID = kRSAKeyPairIconID;
502613 ¤   ¤   ¤   ¤   }
2cfa07 ¤   ¤   ¤   ¤   else
7e72c3 ¤   ¤   ¤   ¤   {
f52b7e ¤   ¤   ¤   ¤   ¤   if(algorithm == kPGPPublicKeyAlgorithm_DSA)
108a4e ¤   ¤   ¤   ¤   ¤   ¤   iconID = kDSAKeyIconID;
844bd6 ¤   ¤   ¤   ¤   ¤   else
0052f4 ¤   ¤   ¤   ¤   ¤   ¤   iconID = kRSAKeyIconID;
972613 ¤   ¤   ¤   ¤   }
072b85 ¤   ¤   ¤   ¤
cf80ec ¤   ¤   ¤   ¤   len = kUserIDStringLength;
43da69 ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer( key,
bd4fa7 ¤   ¤   ¤   ¤   ¤   kUserIDStringLength, cstr, &len);
3d9264 ¤   ¤   ¤   ¤   if(err != kPGPError_BufferTooSmall)
4f6aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
20289b ¤   ¤   ¤   ¤   CToPString(cstr, pstr);
16a3a6 ¤   ¤   ¤   }
9ebb8c ¤   ¤   ¤   else
22f776 ¤   ¤   ¤   {
cdfcda ¤   ¤   ¤   ¤   char¤   keyIDString[ kPGPMaxKeyIDStringSize ];
952b85 ¤   ¤   ¤   ¤
8b68f0 ¤   ¤   ¤   ¤   iconID = kDSADisabledKeyID;
18fd80 ¤   ¤   ¤   ¤   ::GetIndString(pstr, kStringListID, kUnknownKeyStringID);
fdaf5a
5a4419 ¤   ¤   ¤   ¤   err = PGPGetKeyIDString( &gtr->u.item.groupItem.u.key.keyID,
1d00b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyIDString_Abbreviated, keyIDString);
3d6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
4099ff ¤   ¤   ¤   ¤   if(IsntPGPError(err))
3f72c3 ¤   ¤   ¤   ¤   {
9e9e4d ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   keyIDPString;
19ae30 ¤   ¤   ¤   ¤   ¤
29fca9 ¤   ¤   ¤   ¤   ¤   CToPString(keyIDString, keyIDPString);
bd9c5e ¤   ¤   ¤   ¤   ¤   AppendPString(keyIDPString, pstr);
622613 ¤   ¤   ¤   ¤   }
192fda ¤   ¤   ¤   ¤   ::TextFace(italic);
2aa3a6 ¤   ¤   ¤   }
990fe4 ¤   ¤   }
3e0e1d ¤   ¤   else
1f5b34 ¤   ¤   {
732c45 ¤   ¤   ¤   iconID = kDHGroupIconID;
236278 ¤   ¤   ¤   err = PGPGetGroupInfo(mGroupsRef, gtr->u.item.groupItem.u.group.id,
9ffe79 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &groupInfo);
3f524f ¤   ¤   ¤   pgpAssertNoErr(err);
4a768c ¤   ¤   ¤   if(IsntPGPError(err))
13c23d ¤   ¤   ¤   ¤   CToPString(groupInfo.name, pstr);
d80fe4 ¤   ¤   }
--6e60 000e1a14fdf401201ab Page 9 of CGroupsWindow.cp
743af5 ¤   ¤   CKeyTable::DrawIcon(iconID, cellRect, 2);
f11b52 ¤   ¤
64de3c ¤   ¤   ::TextFont(kFontIDGeneva);
c90ea2 ¤   ¤   ::TextSize(9);
de202e ¤   ¤   slop = kDropFlagSlop + kLeftIndent + kLevelIndent + kIconWidth +
5991e6 ¤   ¤   ¤   ¤   kLeftBorder;
8aec44 ¤   ¤   ::TruncString(¤ kNameColumnWidth - slop, pstr, truncMiddle);
f5b084 ¤   ¤   ::MoveTo(cellRect.left + slop, cellRect.bottom - kBottomBorder);
ba65ba ¤   ¤   ::DrawString(pstr);
fc9371 ¤   }
c898e8 ¤   ::TextFace(0);
38efe6 }
29af5a
866d52 ¤   void
188c0e CGroupsTable::DrawValidity(Int32 trustValue, Rect cellRect, Int16 depth)
38bb36 {
068ff0 ¤   RGBColor¤   trustColor = { 52223, 52223, 65535 };
2f1a47 ¤   Int16¤  ¤   width;
d15e1d ¤   PGPBoolean¤ showMarginal;
b761e0 ¤   PGPError¤   err;
0267c5 ¤
96a5de ¤   const Int16¤¤   kMaxValidity ¤  ¤   ¤   =¤  2;
c8d68a ¤   const Int16 ¤   kBarRightBorder¤¤   ¤   =¤  10;
9edb4c ¤   const Int16¤ ¤  kBarLeftBorder¤ ¤   ¤   =¤  4;
faa0b3 ¤   const Int16¤¤   kBarHeight¤ ¤   ¤   ¤   =¤  10;
8867c5 ¤
08fcb8 ¤   err = PGPGetPrefBoolean(gPrefRef,
bd0916 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDisplayMarginalValidity, &showMarginal);
f0dd44 ¤   pgpAssertNoErr(err);
8c1084 ¤   if(!showMarginal)
5cc7a1 ¤   {
a5e1d5 ¤   ¤   ResIDT¤ ¤   iconID;
c0af5a
769adc ¤   ¤   if(trustValue > kMaxValidity)
0e5b34 ¤   ¤   {
2e2c1c ¤   ¤   ¤   iconID = kAxiomaticIconID;
b70fe4 ¤   ¤   }
2b7edf ¤   ¤   else if(trustValue > 1)
035b34 ¤   ¤   {
76612b ¤   ¤   ¤   iconID = kValidKeyIconID;
220fe4 ¤   ¤   }
d4d001 ¤   ¤   else if(trustValue == 1)
195b34 ¤   ¤   {
f53c07 ¤   ¤   ¤   PGPBoolean¤ marginalIsInvalid;
671b52 ¤   ¤
a5f993 ¤   ¤   ¤   err = PGPGetPrefBoolean(gPrefRef,
b1cb7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefMarginalIsInvalid,
e36eee ¤   ¤   ¤   ¤   ¤   ¤   ¤   &marginalIsInvalid);
30524f ¤   ¤   ¤   pgpAssertNoErr(err);
7487c7 ¤   ¤   ¤
92b0a0 ¤   ¤   ¤   if( marginalIsInvalid )
2df776 ¤   ¤   ¤   {
905e31 ¤   ¤   ¤   ¤   iconID = kKeyAttrOffIconID;
d8a3a6 ¤   ¤   ¤   }
e6bb8c ¤   ¤   ¤   else
f6f776 ¤   ¤   ¤   {
6e5dc5 ¤   ¤   ¤   ¤   iconID = kValidKeyIconID;
38a3a6 ¤   ¤   ¤   }
0c0fe4 ¤   ¤   }
3d0e1d ¤   ¤   else
b25b34 ¤   ¤   {
b6d657 ¤   ¤   ¤   iconID = kKeyAttrOffIconID;
3f0fe4 ¤   ¤   }
caaf5a
a74d1d ¤   ¤   CKeyTable::DrawIcon(iconID, cellRect, -2);
c09371 ¤   }
ed0e24 ¤   else
f7c7a1 ¤   {
7d8421 ¤   ¤   width = kValidityColumnWidth - kBarRightBorder
4e5de6 ¤   ¤   ¤   ¤   - kBarLeftBorder;
b9d00d ¤   ¤   cellRect.left ¤ +=¤ kBarLeftBorder;
e1e180 ¤   ¤   cellRect.right¤ = ¤ cellRect.left + width;
--9ea0 00068d3c2e1401201ab Page 10 of CGroupsWindow.cp
224628 ¤   ¤   cellRect.bottom¤=¤  cellRect.bottom - kBottomBorder;
203cf6 ¤   ¤   cellRect.top¤   =¤  cellRect.bottom - kBarHeight;
1e1b52 ¤   ¤
815159 ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
3de472 ¤   ¤   ::FrameRect(&cellRect);
2335c0 ¤   ¤   ::InsetRect(&cellRect, 1, 1);
5e9adc ¤   ¤   if(trustValue > kMaxValidity)
88ee0e ¤   ¤   ¤   trustValue = kMaxValidity;
f09af1 ¤   ¤   if(depth >= 8)
7b5b34 ¤   ¤   {
398cd2 ¤   ¤   ¤   ::RGBForeColor(&trustColor);
eb0b3a ¤   ¤   ¤   ::PaintRect(&cellRect);
b60fe4 ¤   ¤   }
aa1b52 ¤   ¤
1f9337 ¤   ¤   cellRect.right -= width * (kMaxValidity - trustValue) /
a0a9f0 ¤   ¤   ¤   ¤   kMaxValidity;
894060 ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray9));
1280c6 ¤   ¤   ::PaintRect(&cellRect);
b3fe46 ¤   ¤   ApplyForeAndBackColors();
089371 ¤   }
bbefe6 }
baaf5a
4a6d52 ¤   void
4bd5e0 CGroupsTable::DrawValidityColumnCell(
edf7a4 ¤   GroupTableEntry¤¤   *gtr,
262d08 ¤   Rect¤   ¤   ¤   ¤   cellRect,
1cb19a ¤   Int16¤  ¤   ¤   ¤   depth)
e9bb36 {
5d61e0 ¤   PGPError¤   err;
2b9cea ¤   PGPValidity¤validity¤   = kPGPValidity_Unknown;
41009a ¤   PGPUInt32¤  notFound;
ecd9d2 ¤   PGPInt32¤   displayValidity¤= 0;
4d67c5 ¤
773f18 ¤   if(gtr->isTopGroup)
09c7a1 ¤   {
059497 ¤   ¤   err = PGPGetGroupLowestValidity(mGroupsRef,
4ab7ea ¤   ¤   ¤   ¤   ¤   ¤   gtr->u.groupID, CPGPKeys::TheApp()->GetKeySet(),
98ca0b ¤   ¤   ¤   ¤   ¤   ¤   &validity, &notFound);
6ce919 ¤   ¤   pgpAssertNoErr(err);
469371 ¤   }
c40e24 ¤   else
eec7a1 ¤   {
d12d73 ¤   ¤   if(gtr->u.item.groupItem.type == kPGPGroupItem_KeyID)
3d5b34 ¤   ¤   {
057e85 ¤   ¤   ¤   CacheKey(gtr);
a52a02 ¤   ¤   ¤   if(PGPKeyRefIsValid(gtr->u.item.cachedKey))
24f776 ¤   ¤   ¤   {
e56514 ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserIDValidity(gtr->u.item.cachedKey,
fd12ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &validity);
0a6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
eda3a6 ¤   ¤   ¤   }
c30fe4 ¤   ¤   }
770e1d ¤   ¤   else
c45b34 ¤   ¤   {
c6c13b ¤   ¤   ¤   err = PGPGetGroupLowestValidity(mGroupsRef,
1c4f5f ¤   ¤   ¤   ¤   ¤   ¤   ¤   gtr->u.item.groupItem.u.group.id,
4ab190 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet(),
b212b9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &validity, &notFound);
46524f ¤   ¤   ¤   pgpAssertNoErr(err);
700fe4 ¤   ¤   }
f39371 ¤   }
aae780 ¤   switch(validity)
39c7a1 ¤   {
e19ae3 ¤   ¤   default:
3ebf24 ¤   ¤   case kPGPValidity_Unknown:
efa5c5 ¤   ¤   case kPGPValidity_Invalid:
739533 ¤   ¤   ¤   displayValidity = 0;
31cdcb ¤   ¤   ¤   break;
d6ff6d ¤   ¤   case kPGPValidity_Marginal:
27cfef ¤   ¤   ¤   displayValidity = 1;
d3cdcb ¤   ¤   ¤   break;
685fdb ¤   ¤   case kPGPValidity_Complete:
--d4e6 000279a2a77401201ab Page 11 of CGroupsWindow.cp
2f208b ¤   ¤   ¤   displayValidity = 2;
72cdcb ¤   ¤   ¤   break;
239371 ¤   }
7a11dc ¤   DrawValidity( displayValidity, cellRect, depth);
60efe6 }
5eaf5a
536d52 ¤   void
b2085b CGroupsTable::DrawDescriptionColumnCell(
2bf7a4 ¤   GroupTableEntry¤¤   *gtr,
3b2d08 ¤   Rect¤   ¤   ¤   ¤   cellRect,
b0b19a ¤   Int16¤  ¤   ¤   ¤   depth)
3fbb36 {
ad6e14 ¤   Str255¤ ¤   ¤   str;
c0fb19 ¤   PGPError¤   ¤   err;
fa40a8 ¤   PGPGroupInfo¤   groupInfo;
4567c5 ¤
243f18 ¤   if(gtr->isTopGroup)
d1c7a1 ¤   {
c95fad ¤   ¤   err = PGPGetGroupInfo(mGroupsRef, gtr->u.groupID, &groupInfo);
15e919 ¤   ¤   pgpAssertNoErr(err);
bd0473 ¤   ¤   CToPString(groupInfo.description, str);
c5de3c ¤   ¤   ::TextFont(kFontIDGeneva);
570ea2 ¤   ¤   ::TextSize(9);
83a301 ¤   ¤   ::TextFace(0);
bfcf2f ¤   ¤   ::MoveTo(¤  cellRect.left + kLeftIndent,
cd16b3 ¤   ¤   ¤   ¤   ¤   cellRect.bottom - kBottomBorder);
58d759 ¤   ¤   ::DrawString(str);
349371 ¤   }
9fefe6 }
30af5a
ff6d52 ¤   void
307f57 CGroupsTable::UpdateValidityColumn()
9abb36 {
d98ec1 ¤   TableIndexT¤numRows, numCols;
48f621 ¤   GetTableSize(numRows, numCols);
e467c5 ¤
cb4e82 ¤   STableCell¤ topCell(1, 2);
81add3 ¤   STableCell ¤botCell(numRows, 2);
fa9874 ¤   STableCell¤ cell;
4267c5 ¤
6a9ecb ¤   FocusDraw();
c32c8c ¤   for(cell = botCell; cell.row >= topCell.row; cell.row--)·
61c7a1 ¤   {
6037b0 ¤   ¤   Rect cellRect;
eb90e9 ¤   ¤   if(GetLocalCellRect(cell, cellRect))
a01acf ¤   ¤   ¤   DrawCell(cell, cellRect);
4d9371 ¤   }
f5efe6 }
e7af5a
296d52 ¤   void
03fdf0 CGroupsTable::RefreshBorder(Rect cellRect)
16bb36 {
fcd8a7 ¤   Rect frame;
eb67c5 ¤
7d40bf ¤   CalcLocalFrameRect(frame);
6f9727 ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_White));
7e4326 ¤   ::MoveTo(frame.left, cellRect.bottom - 1);
d61a04 ¤   ::LineTo(frame.right - 1, cellRect.bottom - 1);
e3ed40 ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
54efe6 }
44af5a
5b6d52 ¤   void
0ee854 CGroupsTable::ShowInfo()
afbb36 {
f58ec1 ¤   TableIndexT¤numRows, numCols;
7df621 ¤   GetTableSize(numRows, numCols);
ca67c5 ¤
e36b4f ¤   STableCell¤ topCell(1, 1);
3d881e ¤   STableCell ¤botCell(numRows, 1);
cb9874 ¤   STableCell¤ cell;
bbfb19 ¤   PGPError¤   ¤   err;
2787c7 ¤   ¤   ¤
--ea45 0001dba5f33401201ab Page 12 of CGroupsWindow.cp
e42c8c ¤   for(cell = botCell; cell.row >= topCell.row; cell.row--)·
4dc7a1 ¤   {
e2c85e ¤   ¤   if(CellIsSelected(cell))·
4e5b34 ¤   ¤   {
411758 ¤   ¤   ¤   TableIndexT¤¤   inWideOpenRow =
ce027e ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(cell.row);
c085ac ¤   ¤   ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
35e776 ¤   ¤   ¤   GroupTableEntry¤tableEntry;
108b16 ¤   ¤   ¤   Uint32¤ ¤   ¤   dataSize = sizeof(GroupTableEntry);
b287c7 ¤   ¤   ¤
c4a74f ¤   ¤   ¤   GetCellData(woCell, &tableEntry, dataSize);
317aed ¤   ¤   ¤   if(tableEntry.isTopGroup ||
38b881 ¤   ¤   ¤   ¤   tableEntry.u.item.groupItem.type == kPGPGroupItem_Group)
9ef776 ¤   ¤   ¤   {
938368 ¤   ¤   ¤   ¤   PGPGroupInfo¤   groupInfo;
a314b3 ¤   ¤   ¤   ¤   PGPGroupID¤ ¤   id;
7b2b85 ¤   ¤   ¤   ¤
2a0428 ¤   ¤   ¤   ¤   if(tableEntry.isTopGroup)
bc088e ¤   ¤   ¤   ¤   ¤   id = tableEntry.u.groupID;
60fa07 ¤   ¤   ¤   ¤   else
8d26d3 ¤   ¤   ¤   ¤   ¤   id = tableEntry.u.item.groupItem.u.group.id;
98feb4 ¤   ¤   ¤   ¤   err = PGPGetGroupInfo(mGroupsRef, id, &groupInfo);
fc6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
ac99ff ¤   ¤   ¤   ¤   if(IsntPGPError(err))
dc72c3 ¤   ¤   ¤   ¤   {
5d0a0f ¤   ¤   ¤   ¤   ¤   if(EditGroup(&groupInfo))
e54859 ¤   ¤   ¤   ¤   ¤   {
ae1c5c ¤   ¤   ¤   ¤   ¤   ¤   err = PGPSetGroupName(mGroupsRef,
fb9d74 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   id, groupInfo.name);
ba6c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
c20f4b ¤   ¤   ¤   ¤   ¤   ¤   err = PGPSetGroupDescription(mGroupsRef,
9c15d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   id, groupInfo.description);
c56c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
3ef11a ¤   ¤   ¤   ¤   ¤   ¤   Draw(nil);
2a1c89 ¤   ¤   ¤   ¤   ¤   }
f22613 ¤   ¤   ¤   ¤   }
e2a3a6 ¤   ¤   ¤   }
76bb8c ¤   ¤   ¤   else
74f776 ¤   ¤   ¤   {
2cea6a ¤   ¤   ¤   ¤   if(PGPKeyRefIsValid(tableEntry.u.item.cachedKey))
e472c3 ¤   ¤   ¤   ¤   {
7326db ¤   ¤   ¤   ¤   ¤   if(!CKeyInfoWindow::OpenKeyInfo(
3ee727 ¤   ¤   ¤   ¤   ¤   ¤   ¤   tableEntry.u.item.cachedKey,·
d224c6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetDefaultKeyView()->
569338 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetKeyTable()))
f98da4 ¤   ¤   ¤   ¤   ¤   ¤   break;¤ // Too many key windows, break out
6b2613 ¤   ¤   ¤   ¤   }
87a3a6 ¤   ¤   ¤   }
340fe4 ¤   ¤   }
369371 ¤   }
85efe6 }
f7af5a
416d52 ¤   void
be607d CGroupsTable::ClickCell(
7bdf40 ¤   const STableCell&¤  ¤   inCell,
0c067a ¤   const SMouseDownEvent&¤ inMouseDown)
cbbb36 {
6a16d5 ¤   if(GetClickCount() == 2)
8bc7a1 ¤   {
9d3b22 ¤   ¤   ShowInfo();
549371 ¤   }
bed50f ¤   else if (LDropArea::DragAndDropIsPresent() &&·
02fd86 ¤   ¤   ¤   ::WaitMouseMoved(inMouseDown.macEvent.where))
586604 ¤   ¤   StartDrag(inCell, inMouseDown);
9d6f0c ¤   else if(inCell.col == 1)
0effd4 ¤   ¤   CPGPHierarchyTable::ClickCell(inCell, inMouseDown);
cdefe6 }
f0af5a
b76d52 ¤   void
4f9917 CGroupsTable::StartDrag(
e6df40 ¤   const STableCell&¤  ¤   inCell,
1d067a ¤   const SMouseDownEvent&¤ inMouseDown)
--abd2 000237b571a401201ab Page 13 of CGroupsWindow.cp
2cbb36 {
950214 ¤   Rect¤   ¤   ¤   cellRect;
d35a6b ¤   TableIndexT¤¤   inWideOpenRow =
363cce ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(inCell.row);
896493 ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
94a9df ¤   GroupTableEntry¤tableEntry;
a4c05d ¤   Uint32¤ ¤   ¤   dataSize = sizeof(GroupTableEntry);
6367c5 ¤
a664a2 ¤   GetCellData(woCell, &tableEntry, dataSize);
93af5a
620cff ¤   mSendingDrag = TRUE;
0b67c5 ¤
5d43f4 ¤   // Setup the drag rect
e0cf0d ¤   GetLocalCellRect(inCell, cellRect);
b3dab3 ¤   ::InsetRect(&cellRect, 1, 1);
7a4225 ¤   cellRect.left = kDropFlagSlop;
222ba8 ¤   cellRect.right = kNameColumnWidth;
76e0bd ¤   if(tableEntry.isTopGroup)
08c7a1 ¤   {
4a9378 ¤   ¤   LDragTask¤  drag(inMouseDown.macEvent, cellRect,·
ce69c1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   1, kGroupIDDragFlavor,
b362f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &tableEntry.u.groupID,
9cb96f ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(PGPGroupID), flavorSenderOnly);
2d9371 ¤   }
e80e24 ¤   else
02c7a1 ¤   {
349378 ¤   ¤   LDragTask¤  drag(inMouseDown.macEvent, cellRect,·
2354c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   1, kGroupItemDragFlavor,
bc9ba4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &tableEntry.u.item.groupItem,
0dbfb0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(PGPGroupItem), flavorSenderOnly);
3f9371 ¤   }
1467c5 ¤
ca3e37 ¤   mSendingDrag = FALSE;
c9efe6 }
21af5a
3d6d52 ¤   void
6c51b7 CGroupsTable::ClickSelf(
9b3ba4 ¤   const SMouseDownEvent¤  &inMouseDown)
c6bb36 {
6cee5d ¤   STableCell¤ hitCell;
b32dc5 ¤   SPoint32¤   imagePt;
1467c5 ¤
d927f5 ¤   LocalToImagePoint(inMouseDown.whereLocal, imagePt);
2f67c5 ¤
5f2521 ¤   if (GetCellHitBy(imagePt, hitCell)) {
0f8516 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Click is inside hitCell
a71a25 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Check if click is inside DropFlag
edc847 ¤   ¤   TableIndexT¤woRow = mCollapsableTree->GetWideOpenIndex(hitCell.row);
9afd09 ¤   ¤   Rect¤   flagRect;
6a6eb5 ¤   ¤   CalcCellFlagRect(hitCell, flagRect);
be1b52 ¤   ¤
ee5cf5 ¤   ¤   if ((hitCell.col == 1) &&
43eefc ¤   ¤   ¤   mCollapsableTree->IsCollapsable(woRow) &&
dae04f ¤   ¤   ¤   ::PtInRect(inMouseDown.whereLocal, &flagRect))
195b34 ¤   ¤   {
9dce83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Click is inside DropFlag
da6e91 ¤   ¤   ¤   FocusDraw();
9aef82 ¤   ¤   ¤   Boolean¤expanded = mCollapsableTree->IsExpanded(woRow);
22044c ¤   ¤   ¤   if (LDropFlag::TrackClick(flagRect, inMouseDown.whereLocal,
e0bcec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   expanded)) {
3d60c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Mouse released inside DropFlag
682880 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··so toggle the Row
6502c0 ¤   ¤   ¤   ¤   if (inMouseDown.macEvent.modifiers & optionKey) {
ae1fce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // OptionKey down means to do
2c03e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··a deep collapse/expand
adf999 ¤   ¤   ¤   ¤   ¤   if (expanded) {
daf5d3 ¤   ¤   ¤   ¤   ¤   ¤   DeepCollapseRow(woRow);
ef81a1 ¤   ¤   ¤   ¤   ¤   } else {
ef3789 ¤   ¤   ¤   ¤   ¤   ¤   DeepExpandRow(woRow);
5e1c89 ¤   ¤   ¤   ¤   ¤   }
282b85 ¤   ¤   ¤   ¤
23ad6c ¤   ¤   ¤   ¤   } else {¤   ¤   ¤   ¤   // Shallow collapse/expand
--7727 000b9148306401201ab Page 14 of CGroupsWindow.cp
01f999 ¤   ¤   ¤   ¤   ¤   if (expanded) {
ac6740 ¤   ¤   ¤   ¤   ¤   ¤   CollapseRow(woRow);
3a81a1 ¤   ¤   ¤   ¤   ¤   } else {
e09b12 ¤   ¤   ¤   ¤   ¤   ¤   ExpandRow(woRow);
3f1c89 ¤   ¤   ¤   ¤   ¤   }
522613 ¤   ¤   ¤   ¤   }
8fa3a6 ¤   ¤   ¤   }
2067c5 ¤
670fe4 ¤   ¤   }
970e1d ¤   ¤   else
c75b34 ¤   ¤   {
c5f4ae ¤   ¤   ¤   if(hitCell.col == 1)
d0f776 ¤   ¤   ¤   {
cfb9e4 ¤   ¤   ¤   ¤   if (ClickSelect(hitCell, inMouseDown))
f71734 ¤   ¤   ¤   ¤   ¤   ClickCell(hitCell, inMouseDown);
22a3a6 ¤   ¤   ¤   }
fd0fe4 ¤   ¤   }
eaf8d7 ¤   } else {¤   ¤   ¤   ¤   ¤   ¤   ¤   // Click is outside of any Cell
feb62c ¤   ¤   UnselectAllCells();
0e9371 ¤   }
e2efe6 }
d2af5a
2d6d52 ¤   void
c2a2e3 CGroupsTable::HiliteCellActively(
c61bb3 ¤   const STableCell¤   &inCell,
ff8e9d ¤   Boolean¤¤   ¤   ¤   /*inHilite*/)
1ebb36 {
e3a0e5 ¤   Rect¤   cellFrame;
8367c5 ¤
6af97a ¤   if(inCell.col != 1)
1a99bf ¤   ¤   return;
c7fdc9 ¤   if(GetLocalCellRect(inCell, cellFrame) && FocusExposed())
5dc7a1 ¤   {
7f2da9 ¤   ¤   StDeviceLoop¤   devLoop(cellFrame);¤¤
ff77ad ¤   ¤   SInt16¤ ¤   ¤   depth;
5faf5a
61eb96 ¤   ¤   while(devLoop.NextDepth(depth))
c25b34 ¤   ¤   {
2fc87d ¤   ¤   ¤   StColorPenState saveColorPen; ··// Preserve color & pen state
21c514 ¤   ¤   ¤   StColorPenState::Normalize();
b17810 ¤   ¤   ¤   if(depth >= 8)
3df776 ¤   ¤   ¤   {
de5f85 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
b452cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
27a3a6 ¤   ¤   ¤   }
81bb8c ¤   ¤   ¤   else
99f776 ¤   ¤   ¤   {
1f7337 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
c452cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
e8a3a6 ¤   ¤   ¤   }
53fb14 ¤   ¤   ¤   cellFrame.left += kDropFlagSlop;
572c34 ¤   ¤   ¤   cellFrame.right = cellFrame.left + kNameColumnWidth;
d701a6 ¤   ········UDrawingUtils::SetHiliteModeOn();
a6d038 ¤   ¤   ¤   ::InvertRect(&cellFrame);
3a0fe4 ¤   ¤   }
5f9371 ¤   }
b9efe6 }
22af5a
c96d52 ¤   void
6409c7 CGroupsTable::HiliteCellInactively(
171bb3 ¤   const STableCell¤   &inCell,
bc7e1e ¤   Boolean¤¤   ¤   ·¤  /*inHilite*/)
0abb36 {
75a0e5 ¤   Rect¤   cellFrame;
fd67c5 ¤
0af97a ¤   if(inCell.col != 1)
f699bf ¤   ¤   return;
c0fdc9 ¤   if(GetLocalCellRect(inCell, cellFrame) && FocusExposed())
26c7a1 ¤   {
622da9 ¤   ¤   StDeviceLoop¤   devLoop(cellFrame);¤¤
7277ad ¤   ¤   SInt16¤ ¤   ¤   depth;
b9af5a
--6212 0003a1f1ce1401201ab Page 15 of CGroupsWindow.cp
01eb96 ¤   ¤   while(devLoop.NextDepth(depth))
d35b34 ¤   ¤   {
ecad33 ¤   ········StColorPenState saveColorPen; ··// Preserve color & pen state
7256ca ¤   ········StColorPenState::Normalize();
1c3e2d ¤   ········if(depth >= 8)
ef8722 ¤   ········{
4a5f85 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
e052cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
13a3a6 ¤   ¤   ¤   }
bfbb8c ¤   ¤   ¤   else
ebf776 ¤   ¤   ¤   {
1c7337 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
ea52cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
4ea3a6 ¤   ¤   ¤   }
4fe1b4 ¤   ¤   ¤   ::PenMode(srcXor);
83fb14 ¤   ¤   ¤   cellFrame.left += kDropFlagSlop;
252c34 ¤   ¤   ¤   cellFrame.right = cellFrame.left + kNameColumnWidth;
783181 ¤   ¤   ¤   UDrawingUtils::SetHiliteModeOn();
a60e92 ¤   ¤   ¤   ::FrameRect(&cellFrame);
e90fe4 ¤   ¤   }
c59371 ¤   }
81efe6 }
7caf5a
7f6d52 ¤   void
acd3b3 CGroupsTable::HiliteCellDrag(
4b650b ¤   const STableCell¤   &inCell)
c5bb36 {
15a0e5 ¤   Rect¤   cellFrame;
0967c5 ¤
47f97a ¤   if(inCell.col != 1)
1b99bf ¤   ¤   return;
10fdc9 ¤   if(GetLocalCellRect(inCell, cellFrame) && FocusExposed())
4ac7a1 ¤   {
1d2da9 ¤   ¤   StDeviceLoop¤   devLoop(cellFrame);¤¤
0d77ad ¤   ¤   SInt16¤ ¤   ¤   depth;
1aaf5a
edeb96 ¤   ¤   while(devLoop.NextDepth(depth))
0f5b34 ¤   ¤   {
52ad33 ¤   ········StColorPenState saveColorPen; ··// Preserve color & pen state
c556ca ¤   ········StColorPenState::Normalize();
073e2d ¤   ········if(depth >= 8)
f08722 ¤   ········{
fe5f85 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
5752cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
35a3a6 ¤   ¤   ¤   }
b0bb8c ¤   ¤   ¤   else
96f776 ¤   ¤   ¤   {
aa7337 ¤   ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
1852cc ¤   ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
65a3a6 ¤   ¤   ¤   }
f6fb14 ¤   ¤   ¤   cellFrame.left += kDropFlagSlop;
4c2c34 ¤   ¤   ¤   cellFrame.right = cellFrame.left + kNameColumnWidth;
948cc2 ¤   ¤   ¤   cellFrame.bottom -= 1;
4cd038 ¤   ¤   ¤   ::InvertRect(&cellFrame);
c40fe4 ¤   ¤   }
3d9371 ¤   }
98efe6 }
b0af5a
c66d52 ¤   void
a5c567 CGroupsTable::DrawSelf()
9abb36 {
12d8a7 ¤   Rect frame;
11af5a
2ba659 ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray1));
9dccbb ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
4040bf ¤   CalcLocalFrameRect(frame);
f7c7a1 ¤   {
e9296f ¤   ¤   StDeviceLoop¤   devLoop(frame);¤¤
4e77ad ¤   ¤   SInt16¤ ¤   ¤   depth;
68af5a
cbeb96 ¤   ¤   while(devLoop.NextDepth(depth))
3a5b34 ¤   ¤   {
--8c20 000d5505154401201ab Page 16 of CGroupsWindow.cp
dfc776 ¤   ¤   ¤   if(depth > 1)
3848b8 ¤   ¤   ¤   ¤   ::PaintRect(&frame);
4cbb8c ¤   ¤   ¤   else
8630c1 ¤   ¤   ¤   ¤   ::EraseRect(&frame);
670fe4 ¤   ¤   }
239371 ¤   }
45de04 ¤   LTableView::DrawSelf();
e1efe6 }
25af5a
da7e69 ¤   Boolean
b1cafd CGroupsTable::EditGroup(PGPGroupInfo *groupInfo)
47bb36 {
b0be44 ¤   CPGPStDialogHandler¤newGroupDialog(kNewGroupDialogID, this);
375854 ¤   LWindow¤¤   ¤   ¤   *ngd;
20dbc1 ¤   MessageT¤   ¤   ¤   dialogMessage;
019fca ¤   Str255¤ ¤   ¤   ¤   pstr;
ed4e72 ¤   LEditText¤  ¤   ¤   *mAddressEditField,
e1b77d ¤   ¤   ¤   ¤   ¤   ¤   *mDescriptionEditField;
4af603 ¤   Boolean¤¤   ¤   ¤   success = FALSE;
59af5a
ded593 ¤   const PaneIDT¤  kAddressEditField¤  ¤   = 'eAdd';
fc2118 ¤   const PaneIDT¤  kDescEditField¤ ¤   ¤   = 'eDes';
9967c5 ¤
928eb6 ¤   ngd = newGroupDialog.GetDialog();
4c3057 ¤   mAddressEditField = (LEditText *)ngd->FindPaneByID(kAddressEditField);
9be196 ¤   mDescriptionEditField =
cf6cbd ¤   ¤   (LEditText *)ngd->FindPaneByID(kDescEditField);
df6050 ¤   if(groupInfo->id != kPGPInvalidGroupID)
99c7a1 ¤   {
e0a8a9 ¤   ¤   CToPString(groupInfo->name, pstr);
ab75a8 ¤   ¤   mAddressEditField->SetDescriptor(pstr);
6f2504 ¤   ¤   CToPString(groupInfo->description, pstr);
ec7cd8 ¤   ¤   mDescriptionEditField->SetDescriptor(pstr);
6a9371 ¤   }
1a0ff2 ¤   ngd->Show();
c22204 badInput:
4dcfa1 ¤   do
45c7a1 ¤   {
e5dcbd ¤   ¤   dialogMessage = newGroupDialog.DoDialog();
d59b18 ¤   } while(dialogMessage != msg_OK &&
08005c ¤   ¤   ¤   dialogMessage != msg_Cancel);
b1f518 ¤   if(dialogMessage == msg_OK)
97c7a1 ¤   {
b3c6eb ¤   ¤   mAddressEditField->GetDescriptor(pstr);
1659bc ¤   ¤   if(pstr[0] == '\0')
655b34 ¤   ¤   {
ff7f22 ¤   ¤   ¤   CWarningAlert::Display(kWAStopAlertType, kWAOKStyle,
cc3898 ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kBadGroupInfoStringID);
12d354 ¤   ¤   ¤   goto badInput;
fc0fe4 ¤   ¤   }
5776e8 ¤   ¤   PToCString(pstr, groupInfo->name);
afcf9b ¤   ¤   mDescriptionEditField->GetDescriptor(pstr);
3638a8 ¤   ¤   PToCString(pstr, groupInfo->description);
542cb4 ¤   ¤   success = TRUE;
089371 ¤   }
e97e96 ¤   return success;
3aefe6 }
d0af5a
5daf5a
0e6d52 ¤   void
ecd704 CGroupsTable::DeleteSelection()
b1cebb {¤
260ae0 ¤   Boolean¤¤   rebuild = FALSE;
cd67c5 ¤
1b8ec1 ¤   TableIndexT¤numRows, numCols;
27f621 ¤   GetTableSize(numRows, numCols);
1f67c5 ¤
076b4f ¤   STableCell¤ topCell(1, 1);
3d881e ¤   STableCell ¤botCell(numRows, 1);
5c9874 ¤   STableCell¤ cell;
fd67c5 ¤
d52c8c ¤   for(cell = botCell; cell.row >= topCell.row; cell.row--)·
--d0ae 000b68d778f401201ab Page 17 of CGroupsWindow.cp
f7c7a1 ¤   {
bec85e ¤   ¤   if(CellIsSelected(cell))·
f65b34 ¤   ¤   {
311758 ¤   ¤   ¤   TableIndexT¤¤   inWideOpenRow =
3c7b34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(cell.row);
2785ac ¤   ¤   ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
c8e776 ¤   ¤   ¤   GroupTableEntry¤tableEntry;
697412 ¤   ¤   ¤   PGPError¤   ¤   err;
aa8b16 ¤   ¤   ¤   Uint32¤ ¤   ¤   dataSize = sizeof(GroupTableEntry);
9787c7 ¤   ¤   ¤
eaa74f ¤   ¤   ¤   GetCellData(woCell, &tableEntry, dataSize);
0138c6 ¤   ¤   ¤   if(tableEntry.isTopGroup)
a9f776 ¤   ¤   ¤   {
641eb4 ¤   ¤   ¤   ¤   err = PGPDeleteGroup(mGroupsRef, tableEntry.u.groupID);
dc6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
ed169b ¤   ¤   ¤   ¤   rebuild = TRUE;
3c2b85 ¤   ¤   ¤   ¤
a3a3a6 ¤   ¤   ¤   }
4fbb8c ¤   ¤   ¤   else
95f776 ¤   ¤   ¤   {
8cae51 ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   numKeys,
69af3c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numTotal,
7526a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   itemIndex;
163fca ¤   ¤   ¤   ¤   PGPGroupItem¤   groupItem;
c72b85 ¤   ¤   ¤   ¤
79ec67 ¤   ¤   ¤   ¤   RemoveRows(1, inWideOpenRow, true);
a3d500 ¤   ¤   ¤   ¤   err = PGPCountGroupItems(mGroupsRef,
dddde1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   tableEntry.u.item.ownerGroupID,
c14b62 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FALSE, &numKeys, &numTotal);
0b6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
b5fa84 ¤   ¤   ¤   ¤   if(IsntPGPError(err) && numTotal > 0)
3672c3 ¤   ¤   ¤   ¤   {
5548a2 ¤   ¤   ¤   ¤   ¤   for(itemIndex = 0; itemIndex < numTotal; itemIndex++)
fc4859 ¤   ¤   ¤   ¤   ¤   {
c7d0ba ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetIndGroupItem(mGroupsRef,
6719fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tableEntry.u.item.ownerGroupID,
d4ea75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   itemIndex, &groupItem);
366c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
c33f6a ¤   ¤   ¤   ¤   ¤   ¤   if(pgpMemoryEqual(&groupItem.u,
a23465 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &tableEntry.u.item.groupItem.u,
c717d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(groupItem.u)))
7b8fec ¤   ¤   ¤   ¤   ¤   ¤   {
e4f2b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPDeleteIndItemFromGroup(mGroupsRef,
c26ae4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tableEntry.u.item.ownerGroupID,
a14c9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   itemIndex);
823eef ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
8c8c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
35db3c ¤   ¤   ¤   ¤   ¤   ¤   }
b41c89 ¤   ¤   ¤   ¤   ¤   }
0b2613 ¤   ¤   ¤   ¤   }
88a3a6 ¤   ¤   ¤   }
620fe4 ¤   ¤   }
d59371 ¤   }
cc1037 ¤   if( rebuild )
ee517d ¤   ¤   RebuildTable();
06af9f ¤   UpdateValidityColumn();
724a83 ¤   if(PGPGroupSetNeedsCommit(mGroupsRef))
eaf81c ¤   ¤   PGPSaveGroupSetToFile(mGroupsRef, mGroupsFile);
08efe6 }
16af5a
f56d52 ¤   void
9c7916 CGroupsTable::UpdateFromServer()
e5bb36 {
018ec1 ¤   TableIndexT¤numRows, numCols;
51f621 ¤   GetTableSize(numRows, numCols);
e567c5 ¤
d16b4f ¤   STableCell¤ topCell(1, 1);
14881e ¤   STableCell ¤botCell(numRows, 1);
879874 ¤   STableCell¤ cell;
db67c5 ¤
ee2c8c ¤   for(cell = botCell; cell.row >= topCell.row; cell.row--)·
b6c7a1 ¤   {
--50bd 000aca3ff63401201ab Page 18 of CGroupsWindow.cp
d4c85e ¤   ¤   if(CellIsSelected(cell))·
065b34 ¤   ¤   {
4f1758 ¤   ¤   ¤   TableIndexT¤¤   inWideOpenRow =
f47b34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(cell.row);
9685ac ¤   ¤   ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
3ee776 ¤   ¤   ¤   GroupTableEntry¤tableEntry;
b18b16 ¤   ¤   ¤   Uint32¤ ¤   ¤   dataSize = sizeof(GroupTableEntry);
91270a ¤   ¤   ¤   PGPKeySetRef¤   keySet = kInvalidPGPKeySetRef;
af7412 ¤   ¤   ¤   PGPError¤   ¤   err;
7987c7 ¤   ¤   ¤
e3a11a ¤   ¤   ¤   keySet = NULL;
71a74f ¤   ¤   ¤   GetCellData(woCell, &tableEntry, dataSize);
cb38c6 ¤   ¤   ¤   if(tableEntry.isTopGroup)
97f776 ¤   ¤   ¤   {
f90177 ¤   ¤   ¤   ¤   err = PGPGetGroupFromServer(gPGPContext, gTLSContext,
47a151 ¤   ¤   ¤   ¤   ¤   ¤   mGroupsRef, tableEntry.u.groupID, NULL, 0, &keySet);
6dc010 ¤   ¤   ¤   ¤   if(IsPGPError(err) && (err != kPGPError_UserAbort))
0204c9 ¤   ¤   ¤   ¤   ¤   ReportPGPError(err);
dca3a6 ¤   ¤   ¤   }
dfbb8c ¤   ¤   ¤   else
b8f776 ¤   ¤   ¤   {
b7fb3b ¤   ¤   ¤   ¤   err = PGPGetKeyIDFromServer( gPGPContext, gTLSContext,
635e02 ¤   ¤   ¤   ¤   ¤   ¤   &tableEntry.u.item.groupItem.u.key.keyID, &keySet);
02c010 ¤   ¤   ¤   ¤   if(IsPGPError(err) && (err != kPGPError_UserAbort))
a104c9 ¤   ¤   ¤   ¤   ¤   ReportPGPError(err);
c1a3a6 ¤   ¤   ¤   }
731488 ¤   ¤   ¤   if(PGPKeySetRefIsValid(keySet))
6df776 ¤   ¤   ¤   {
785743 ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetDefaultKeyView()->GetKeyTable()->
0e27bb ¤   ¤   ¤   ¤   ¤   ImportKeysFromKeySet(keySet);
6ba3a6 ¤   ¤   ¤   }
cf0fe4 ¤   ¤   }
499371 ¤   }
97efe6 }
2aaf5a
916d52 ¤   void
c638ee CGroupsTable::FindCommandStatus(
9dea24 ¤   CommandT¤   inCommand,
45a472 ¤   Boolean¤¤   &outEnabled,
323a4d ¤   Boolean¤¤   &outUsesMark,
505dc0 ¤   Char16¤ ¤   &outMark,
84d894 ¤   Str255¤ ¤   outName)
8dbb36 {
58836e ¤   switch(inCommand)·
30c7a1 ¤   {
011b1c ¤   ¤   case cmd_Clear:
77d5b0 ¤   ¤   case cmd_OptionClear:
91e8f3 ¤   ¤   ¤   if(mTableSelector->GetFirstSelectedRow() > 0)
110329 ¤   ¤   ¤   ¤   outEnabled = true;
18cdcb ¤   ¤   ¤   break;
b93513 ¤   ¤   case cmd_SelectAll:
712229 ¤   ¤   case cmd_NewGroup:
273c79 ¤   ¤   case cmd_ImportGroups:
0a8f56 ¤   ¤   ¤   outEnabled = true;
b1cdcb ¤   ¤   ¤   break;
c0328d ¤   ¤   case cmd_CollapseAll:
a58f56 ¤   ¤   ¤   outEnabled = true;
88e8f3 ¤   ¤   ¤   if(mTableSelector->GetFirstSelectedRow() > 0)
63f0f9 ¤   ¤   ¤   ¤   GetIndString(¤  outName,
f3629f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
047087 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCollapseSelectionID);
ccbb8c ¤   ¤   ¤   else
98f0f9 ¤   ¤   ¤   ¤   GetIndString(¤  outName,
81629f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
31b380 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCollapseAllID);
facdcb ¤   ¤   ¤   break;
33537b ¤   ¤   case cmd_ExpandAll:
c78f56 ¤   ¤   ¤   outEnabled = true;
c5e8f3 ¤   ¤   ¤   if(mTableSelector->GetFirstSelectedRow() > 0)
10f0f9 ¤   ¤   ¤   ¤   GetIndString(¤  outName,
20629f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
ac153d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kExpandSelectionID);
--f49d 0000892a8bc401201ab Page 19 of CGroupsWindow.cp
b1bb8c ¤   ¤   ¤   else
25f0f9 ¤   ¤   ¤   ¤   GetIndString(¤  outName,
a2629f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
1ddd29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kExpandAllID);
e3cdcb ¤   ¤   ¤   break;
0f2cde ¤   ¤   case cmd_GroupProperties:
55e8f3 ¤   ¤   ¤   if(mTableSelector->GetFirstSelectedRow() > 0)
596ab0 ¤   ¤   ¤   ¤   outEnabled = TRUE;
4acdcb ¤   ¤   ¤   break;
7c9790 ¤   ¤   case cmd_KSGetKeys:
cdba64 ¤   ¤   ¤   if(mTableSelector->GetFirstSelectedRow() > 0 &&
56a1ea ¤   ¤   ¤   ¤   gServerCallsPresent)
fa6ab0 ¤   ¤   ¤   ¤   outEnabled = TRUE;
cecdcb ¤   ¤   ¤   break;
c69ae3 ¤   ¤   default:
94bdce ¤   ¤   ¤   ·LCommander::FindCommandStatus(inCommand, outEnabled,
1c8186 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outUsesMark, outMark, outName);
73cdcb ¤   ¤   ¤   break;
809371 ¤   }
0defe6 }
8aaf5a
4c7e69 ¤   Boolean
f2bd8d CGroupsTable::ObeyCommand(
89ea24 ¤   CommandT¤   inCommand,
ae0597 ¤   void¤   ¤   *ioParam)
3ebb36 {
1483cb ¤   Boolean¤¤   cmdHandled = true,
30bdc4 ¤   ¤   ¤   ¤   bypass = FALSE;
4baf5a
e7db4f ¤   switch (inCommand)·
0dc7a1 ¤   {
97d5b0 ¤   ¤   case cmd_OptionClear:
c7db20 ¤   ¤   ¤   bypass = TRUE;
6d1b1c ¤   ¤   case cmd_Clear:
685b34 ¤   ¤   {
09b33b ¤   ¤   ¤   if(bypass || CWarningAlert::Display(kWACautionAlertType,
cbec7c ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKCancelStyle, kStringListID,
669b66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDeleteConfirmStringID) == msg_OK)
b6f776 ¤   ¤   ¤   {
bed7e9 ¤   ¤   ¤   ¤   DeleteSelection();
c2a3a6 ¤   ¤   ¤   }
abcdcb ¤   ¤   ¤   break;
2d0fe4 ¤   ¤   }
682229 ¤   ¤   case cmd_NewGroup:
075b34 ¤   ¤   {
0f8d24 ¤   ¤   ¤   PGPGroupInfo¤   groupInfo;
087412 ¤   ¤   ¤   PGPError¤   ¤   err;
4f87c7 ¤   ¤   ¤
5b5928 ¤   ¤   ¤   pgpClearMemory(&groupInfo, sizeof(PGPGroupInfo));
4d0f24 ¤   ¤   ¤   if(EditGroup(&groupInfo))
c0f776 ¤   ¤   ¤   {
eedc45 ¤   ¤   ¤   ¤   PGPGroupID¤ ¤   newGroupID = kPGPInvalidGroupID;
ba2b85 ¤   ¤   ¤   ¤
794720 ¤   ¤   ¤   ¤   err = PGPNewGroup(mGroupsRef, groupInfo.name,
b96f74 ¤   ¤   ¤   ¤   ¤   ¤   ¤   groupInfo.description, &newGroupID);
626f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
1899ff ¤   ¤   ¤   ¤   if(IsntPGPError(err))
eb72c3 ¤   ¤   ¤   ¤   {
1aa3bf ¤   ¤   ¤   ¤   ¤   if ( IsntPGPError( err ) )
cf4859 ¤   ¤   ¤   ¤   ¤   {
0f0c1f ¤   ¤   ¤   ¤   ¤   ¤   err¤= PGPSortGroupSetStd( mGroupsRef,
bab698 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet() );
331c89 ¤   ¤   ¤   ¤   ¤   }
3caf5a
d56812 ¤   ¤   ¤   ¤   ¤   ResyncTable(FALSE, TRUE);
4f2613 ¤   ¤   ¤   ¤   }
07a3a6 ¤   ¤   ¤   }
4fcdcb ¤   ¤   ¤   break;
cb0fe4 ¤   ¤   }
fc3c79 ¤   ¤   case cmd_ImportGroups:
ca5b34 ¤   ¤   {
08d6c3 ¤   ¤   ¤   FSSpec¤ ¤   ¤   ¤   fsSpec;
--557b 00041374748401201ab Page 20 of CGroupsWindow.cp
246a20 ¤   ¤   ¤   SFTypeList¤ ¤   ¤   typeList;
6187c7 ¤   ¤   ¤
3a82c8 ¤   ¤   ¤   typeList[0] = kPGPMacFileType_Groups;
d387c7 ¤   ¤   ¤
9cfa9c ¤   ¤   ¤   if( CustomGetFileWithShowAll( 1, typeList, &fsSpec ) )
e783ec ¤   ¤   ¤   ¤   ImportGroupsFromFile( &fsSpec );
d3cdcb ¤   ¤   ¤   break;
d00fe4 ¤   ¤   }
e9328d ¤   ¤   case cmd_CollapseAll:
1da246 ¤   ¤   ¤   CollapseGroups(FALSE);
7bcdcb ¤   ¤   ¤   break;
8f537b ¤   ¤   case cmd_ExpandAll:
5d4b39 ¤   ¤   ¤   ExpandGroups();
49cdcb ¤   ¤   ¤   break;
363513 ¤   ¤   case cmd_SelectAll:
eb1b72 ¤   ¤   ¤   UnselectAllCells();
212331 ¤   ¤   ¤   SelectAllCells();
a6cdcb ¤   ¤   ¤   break;
a82cde ¤   ¤   case cmd_GroupProperties:
b841d6 ¤   ¤   ¤   ShowInfo();
e1cdcb ¤   ¤   ¤   break;
729790 ¤   ¤   case cmd_KSGetKeys:
39605a ¤   ¤   ¤   UpdateFromServer();
e1cdcb ¤   ¤   ¤   break;
2f9ae3 ¤   ¤   default:
67a812 ¤   ¤   ¤   cmdHandled = ·LCommander::ObeyCommand(inCommand, ioParam);
20cdcb ¤   ¤   ¤   break;
949371 ¤   }
7767c5 ¤
1f51a4 ¤   return cmdHandled;
3aefe6 }
40af5a
a46d52 ¤   void
1b595b CGroupsTable::FocusDropArea()
d1bb36 {
57e8b9 ¤   OutOfFocus(nil);
a99ecb ¤   FocusDraw();
62efe6 }
c7af5a
387e69 ¤   Boolean
d5f0c6 CGroupsTable::ItemIsAcceptable(
990ddf ¤   DragReference¤  ¤   inDragRef,
fa1f0b ¤   ItemReference¤  ¤   inItemRef)
72bb36 {
105ee0 ¤   Boolean¤¤   ¤   isAcceptable = FALSE;
043a61 ¤   ushort¤ ¤   ¤   numFlavors;
fc25e4 ¤   OSStatus¤   ¤   status;
6f686e ¤   DragAttributes¤ attributes;
b367c5 ¤
3320a7 ¤   GetDragAttributes(inDragRef, &attributes);
985ece ¤   status = CountDragItemFlavors(inDragRef, inItemRef, &numFlavors);
d3115f ¤   if(IsntErr(status))
00c7a1 ¤   {
38abfe ¤   ¤   for(ushort flavorIndex = 1; flavorIndex <= numFlavors; flavorIndex++)
295b34 ¤   ¤   {
559a9f ¤   ¤   ¤   FlavorType¤ flavorType;
1187c7 ¤   ¤   ¤
620895 ¤   ¤   ¤   status = GetFlavorType(inDragRef, inItemRef, flavorIndex,
0fb4ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorType);
554a64 ¤   ¤   ¤   if(IsntErr(status))
64f776 ¤   ¤   ¤   {
49829a ¤   ¤   ¤   ¤   switch(flavorType)
d872c3 ¤   ¤   ¤   ¤   {
121f69 ¤   ¤   ¤   ¤   ¤   case 'TEXT':
3a4e4b ¤   ¤   ¤   ¤   ¤   case kGroupIDDragFlavor:
5739b9 ¤   ¤   ¤   ¤   ¤   case kGroupItemDragFlavor:
754059 ¤   ¤   ¤   ¤   ¤   ¤   isAcceptable = TRUE;
f200eb ¤   ¤   ¤   ¤   ¤   ¤   break;
9d9aab ¤   ¤   ¤   ¤   ¤   case flavorTypeHFS:
b54859 ¤   ¤   ¤   ¤   ¤   {
2a5125 ¤   ¤   ¤   ¤   ¤   ¤   HFSFlavor¤  flavorData;
41e78e ¤   ¤   ¤   ¤   ¤   ¤   ByteCount¤  dataSize;
--0442 000a588eec3401201ab Page 21 of CGroupsWindow.cp
6016d8 ¤   ¤   ¤   ¤   ¤   ¤   ByteCount¤  dataOffset;
c294aa ¤   ¤   ¤   ¤   ¤   ¤
3e4206 ¤   ¤   ¤   ¤   ¤   ¤   dataSize ¤  = sizeof(flavorData);
7ea0be ¤   ¤   ¤   ¤   ¤   ¤   dataOffset¤ = 0;
2d94aa ¤   ¤   ¤   ¤   ¤   ¤
3c700a ¤   ¤   ¤   ¤   ¤   ¤   status = GetFlavorData(inDragRef, inItemRef,
be7b49 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, &flavorData,
57b306 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Int32 *) &dataSize, dataOffset);
398cab ¤   ¤   ¤   ¤   ¤   ¤   if(IsntErr(status))
d08fec ¤   ¤   ¤   ¤   ¤   ¤   {
46048c ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Check for dragged folders and/or disks
07531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
0d49dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(flavorData.fileType == kPGPMacFileType_Groups &&
65ed12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorData.fileCreator == kPGPMacFileCreator_Ke¶
8f97eb ys)
d706b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
612846 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isAcceptable = true;
165268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
97db3c ¤   ¤   ¤   ¤   ¤   ¤   }
4600eb ¤   ¤   ¤   ¤   ¤   ¤   break;
e31c89 ¤   ¤   ¤   ¤   ¤   }
d92613 ¤   ¤   ¤   ¤   }
75ae30 ¤   ¤   ¤   ¤   ¤
6d974b ¤   ¤   ¤   ¤   if(isAcceptable)
d814c3 ¤   ¤   ¤   ¤   ¤   break;
37a3a6 ¤   ¤   ¤   }
930fe4 ¤   ¤   }
319371 ¤   }
cc7b24 ¤   return(isAcceptable);
daefe6 }
61af5a
f56d52 ¤   void
a39ce9 CGroupsTable::ResortGroups()
54bb36 {
ca61e0 ¤   PGPError¤   err;
9267c5 ¤
873592 ¤   err¤= PGPSortGroupSetStd( mGroupsRef,
9af528 ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet() );
aedd44 ¤   pgpAssertNoErr(err);
e0efe6 }
faaf5a
dcc744 ¤   PGPError
470e70 CGroupsTable::AddKeyIDToGroup(
025cba ¤   PGPKeyID¤   ¤   ¤   *keyID,
840943 ¤   PGPUInt32¤  ¤   ¤   algorithm,
c1bf56 ¤   const STableCell¤   &groupCell)
54bb36 {
fdbf7f ¤   TableIndexT¤¤   ¤   woRow = GetWideOpenIndex(groupCell.row);
14776b ¤   STableCell¤ ¤   ¤   woCell(woRow, 1);
06e46b ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof(GroupTableEntry);
2d886e ¤   GroupTableEntry¤¤   tableEntry;
168e27 ¤   PGPError¤   ¤   ¤   err = kPGPError_UnknownError;
8367c5 ¤
4864a2 ¤   GetCellData(woCell, &tableEntry, dataSize);
61e0bd ¤   if(tableEntry.isTopGroup)
dac7a1 ¤   {
c37075 ¤   ¤   PGPGroupItem¤   groupItem;
431b52 ¤   ¤
d60dac ¤   ¤   groupItem.type ¤¤   ¤   ¤   = kPGPGroupItem_KeyID;
617a2b ¤   ¤   groupItem.userValue ¤   ¤   = 0;
b8afe1 ¤   ¤   groupItem.u.key.algorithm ¤ = (PGPPublicKeyAlgorithm) algorithm;
05784c ¤   ¤   groupItem.u.key.keyID¤  ¤   = *keyID;
0f1b52 ¤   ¤
7aa45a ¤   ¤   err = PGPAddItemToGroup(mGroupsRef, &groupItem, tableEntry.u.groupID);
7ee52d ¤   ¤   ResortGroups();
c3824a ¤   ¤   ResyncTable(FALSE, TRUE);
1002c1 ¤   ¤   UpdateValidityColumn();
a7db1b ¤   ¤   if(PGPGroupSetNeedsCommit(mGroupsRef))
56774b ¤   ¤   ¤   PGPSaveGroupSetToFile(mGroupsRef, mGroupsFile);
6e9371 ¤   }
535ea8 ¤   return err;
a5efe6 }
--79fe 000f3a67584401201ab Page 22 of CGroupsWindow.cp
e0af5a
01c744 ¤   PGPError
3ffd67 CGroupsTable::AddGroupToGroup(
d6a35c ¤   PGPGroupID¤ ¤   ¤   groupID,
c5bf56 ¤   const STableCell¤   &groupCell)
b1bb36 {
e1bf7f ¤   TableIndexT¤¤   ¤   woRow = GetWideOpenIndex(groupCell.row);
80776b ¤   STableCell¤ ¤   ¤   woCell(woRow, 1);
c8e46b ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof(GroupTableEntry);
f6886e ¤   GroupTableEntry¤¤   tableEntry;
fb8e27 ¤   PGPError¤   ¤   ¤   err = kPGPError_UnknownError;
5767c5 ¤
5c64a2 ¤   GetCellData(woCell, &tableEntry, dataSize);
bbe0bd ¤   if(tableEntry.isTopGroup)
b7c7a1 ¤   {
627075 ¤   ¤   PGPGroupItem¤   groupItem;
ee1b52 ¤   ¤
61e9df ¤   ¤   groupItem.type = kPGPGroupItem_Group;
e8d590 ¤   ¤   groupItem.userValue = 0;
9475f4 ¤   ¤   groupItem.u.group.id = groupID;
a7a45a ¤   ¤   err = PGPAddItemToGroup(mGroupsRef, &groupItem, tableEntry.u.groupID);
a4e52d ¤   ¤   ResortGroups();
87824a ¤   ¤   ResyncTable(FALSE, TRUE);
6102c1 ¤   ¤   UpdateValidityColumn();
91db1b ¤   ¤   if(PGPGroupSetNeedsCommit(mGroupsRef))
b4774b ¤   ¤   ¤   PGPSaveGroupSetToFile(mGroupsRef, mGroupsFile);
fb9371 ¤   }
eb5ea8 ¤   return err;
f5efe6 }
76af5a
57c744 ¤   PGPError
8aa2a1 CGroupsTable::AddGroupItemToGroup(
629902 ¤   PGPGroupItem¤   ¤   *item,
42bf56 ¤   const STableCell¤   &groupCell)
e2bb36 {
e9bf7f ¤   TableIndexT¤¤   ¤   woRow = GetWideOpenIndex(groupCell.row);
3d776b ¤   STableCell¤ ¤   ¤   woCell(woRow, 1);
22e46b ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof(GroupTableEntry);
cd886e ¤   GroupTableEntry¤¤   tableEntry;
818e27 ¤   PGPError¤   ¤   ¤   err = kPGPError_UnknownError;
8967c5 ¤
0264a2 ¤   GetCellData(woCell, &tableEntry, dataSize);
1de0bd ¤   if(tableEntry.isTopGroup)
5fc7a1 ¤   {
6fc2ba ¤   ¤   item->userValue = 0;
19a090 ¤   ¤   err = PGPAddItemToGroup(mGroupsRef, item, tableEntry.u.groupID);
9ae52d ¤   ¤   ResortGroups();
a9824a ¤   ¤   ResyncTable(FALSE, TRUE);
cb02c1 ¤   ¤   UpdateValidityColumn();
65db1b ¤   ¤   if(PGPGroupSetNeedsCommit(mGroupsRef))
0a774b ¤   ¤   ¤   PGPSaveGroupSetToFile(mGroupsRef, mGroupsFile);
569371 ¤   }
d25ea8 ¤   return err;
6cefe6 }
c5af5a
666d52 ¤   void
ee1f81 CGroupsTable::ReceiveDragItem(
669701 ¤   DragReference¤  inDragRef,
6ac31d ¤   DragAttributes¤ inDragAttrs,
c082a5 ¤   ItemReference¤  inItemRef,
b91a3a ¤   Rect¤   ¤   ¤   &/*inItemBounds*/)¤ // In Local coordinates
3cbb36 {
1ce019 ¤   Boolean¤¤   ¤   received = FALSE;
e23a61 ¤   ushort¤ ¤   ¤   numFlavors;
5925e4 ¤   OSStatus¤   ¤   status;
548060 ¤   Size¤   ¤   ¤   droppedSize,
216dd0 ¤   ¤   ¤   ¤   ¤   expectedSize;
c8fb19 ¤   PGPError¤   ¤   err;
0b67c5 ¤
be5ece ¤   status = CountDragItemFlavors(inDragRef, inItemRef, &numFlavors);
c3115f ¤   if(IsntErr(status))
f3c7a1 ¤   {
--9dd4 000f6c4e1c6401201ab Page 23 of CGroupsWindow.cp
86abfe ¤   ¤   for(ushort flavorIndex = 1; flavorIndex <= numFlavors; flavorIndex++)
aa5b34 ¤   ¤   {
d99a9f ¤   ¤   ¤   FlavorType¤ flavorType;
2487c7 ¤   ¤   ¤
c10895 ¤   ¤   ¤   status = GetFlavorType(inDragRef, inItemRef, flavorIndex,
0fb4ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorType);
a94a64 ¤   ¤   ¤   if(IsntErr(status))
32f776 ¤   ¤   ¤   {
1fc443 ¤   ¤   ¤   ¤   status = GetFlavorDataSize(inDragRef, inItemRef,
b255f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, &expectedSize);
d00006 ¤   ¤   ¤   ¤   if(flavorType == 'TEXT')
d372c3 ¤   ¤   ¤   ¤   {
b94639 ¤   ¤   ¤   ¤   ¤   PGPByte¤¤   ¤   *droppedBuf;
cbae30 ¤   ¤   ¤   ¤   ¤
63bb2a ¤   ¤   ¤   ¤   ¤   if((mLastDragCell.row == 0) || (mLastDragCell.col != 1))
f52f03 ¤   ¤   ¤   ¤   ¤   ¤   return;
036a14 ¤   ¤   ¤   ¤   ¤   if(IsntErr(status) && IsntNull(droppedBuf =
551624 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPByte *)pgpAlloc(expectedSize)))
9c4859 ¤   ¤   ¤   ¤   ¤   {
1278b4 ¤   ¤   ¤   ¤   ¤   ¤   droppedSize = expectedSize;
26700a ¤   ¤   ¤   ¤   ¤   ¤   status = GetFlavorData(inDragRef, inItemRef,
319b08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, droppedBuf, &droppedSize, 0);
abb67f ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(status);
94eca9 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssert(droppedSize == expectedSize);
de8cab ¤   ¤   ¤   ¤   ¤   ¤   if(IsntErr(status))
6d8fec ¤   ¤   ¤   ¤   ¤   ¤   {
7b66e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   newKeySet;
2d531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
e7fa31 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPImportKeySet( gPGPContext, &newKeySet,
41d01d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOInputBuffer( gPGPContext,
52cb7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   droppedBuf, droppedSize ),
a325a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
c63eef ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
72fa41 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err) && PGPKeySetRefIsValid(newKeyS¶
9b6b1a et))
1b06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
58ad9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyIterRef¤  keyIter;
eabf9b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyListRef¤  keyList;
2dda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
c8646f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPOrderKeySet(newKeySet,
34861c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPAnyOrdering,
59f439 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyList);
187deb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err))
7c31b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
50b4b9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPNewKeyIter(keyList, &keyIter);
237e9c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err))
a0dec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
baabc7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef¤  key;
252589 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyID¤   keyID;
7a0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
124e13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   while(IsntPGPError(
5f971c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyIterNext(keyIter, &key))
623cb6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   && PGPKeyRefIsValid(key))
1ce22d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
dc3cba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyIDFromKey(key,
e9b9b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID);
e2e99a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err) )
f2dbe8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
44fff1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPInt32 algorithm;
1f071b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
8e2733 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyNumber(key,
adacdb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropAlgID,·
9e7cac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm);
61741e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
c68f9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = AddKeyIDToGroup(
a21101 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID, algorithm,
72d3e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mLastDragCell);
1535a6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err))
152da4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   received = TRUE;
a98f38 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
48b6fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
f6bca8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeyIter(keyIter);
--e0be 0008e9ec76b401201ab Page 24 of CGroupsWindow.cp
0e8a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
6db188 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeyList(keyList);
4a6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
1b591e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet(newKeySet);
b05268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
d6db3c ¤   ¤   ¤   ¤   ¤   ¤   }
782770 ¤   ¤   ¤   ¤   ¤   ¤   pgpFree(droppedBuf);
6f1c89 ¤   ¤   ¤   ¤   ¤   }
072613 ¤   ¤   ¤   ¤   }
45bed9 ¤   ¤   ¤   ¤   else if(flavorType == kGroupIDDragFlavor)
7a72c3 ¤   ¤   ¤   ¤   {
cce26f ¤   ¤   ¤   ¤   ¤   PGPGroupID¤ groupID;
48ae30 ¤   ¤   ¤   ¤   ¤
17bb2a ¤   ¤   ¤   ¤   ¤   if((mLastDragCell.row == 0) || (mLastDragCell.col != 1))
3c2f03 ¤   ¤   ¤   ¤   ¤   ¤   return;
b349f0 ¤   ¤   ¤   ¤   ¤   if(IsntErr(status) && expectedSize == sizeof(PGPGroupID))
364859 ¤   ¤   ¤   ¤   ¤   {
de78b4 ¤   ¤   ¤   ¤   ¤   ¤   droppedSize = expectedSize;
97700a ¤   ¤   ¤   ¤   ¤   ¤   status = GetFlavorData(inDragRef, inItemRef,
176e15 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, &groupID, &droppedSize, 0);
dab67f ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(status);
a98cab ¤   ¤   ¤   ¤   ¤   ¤   if(IsntErr(status))
e18fec ¤   ¤   ¤   ¤   ¤   ¤   {
733e14 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = AddGroupToGroup(groupID, mLastDragCell);
c7d3ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err))
f56755 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   received = TRUE;
35db3c ¤   ¤   ¤   ¤   ¤   ¤   }
061c89 ¤   ¤   ¤   ¤   ¤   }
9b2613 ¤   ¤   ¤   ¤   }
55bd4e ¤   ¤   ¤   ¤   else if(flavorType == kGroupItemDragFlavor)
d172c3 ¤   ¤   ¤   ¤   {
6928af ¤   ¤   ¤   ¤   ¤   PGPGroupItem¤   item;
59ae30 ¤   ¤   ¤   ¤   ¤
1dbb2a ¤   ¤   ¤   ¤   ¤   if((mLastDragCell.row == 0) || (mLastDragCell.col != 1))
772f03 ¤   ¤   ¤   ¤   ¤   ¤   return;
3c017a ¤   ¤   ¤   ¤   ¤   if(IsntErr(status) && expectedSize == sizeof(PGPGroupItem))
154859 ¤   ¤   ¤   ¤   ¤   {
1c78b4 ¤   ¤   ¤   ¤   ¤   ¤   droppedSize = expectedSize;
22700a ¤   ¤   ¤   ¤   ¤   ¤   status = GetFlavorData(inDragRef, inItemRef,
681bc4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, &item, &droppedSize, 0);
cfb67f ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(status);
238cab ¤   ¤   ¤   ¤   ¤   ¤   if(IsntErr(status))
c68fec ¤   ¤   ¤   ¤   ¤   ¤   {
ad250a ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = AddGroupItemToGroup(&item, mLastDragCell);
2bd3ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err))
386755 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   received = TRUE;
43db3c ¤   ¤   ¤   ¤   ¤   ¤   }
c91c89 ¤   ¤   ¤   ¤   ¤   }
c62613 ¤   ¤   ¤   ¤   }
9b1657 ¤   ¤   ¤   ¤   else if(flavorType == flavorTypeHFS)
e972c3 ¤   ¤   ¤   ¤   {
564975 ¤   ¤   ¤   ¤   ¤   HFSFlavor¤  flavorData;
08de4b ¤   ¤   ¤   ¤   ¤   ByteCount¤  dataSize;
65ae30 ¤   ¤   ¤   ¤   ¤
f34171 ¤   ¤   ¤   ¤   ¤   dataSize ¤  = sizeof(flavorData);
daae30 ¤   ¤   ¤   ¤   ¤
a6a9e8 ¤   ¤   ¤   ¤   ¤   status = GetFlavorData(inDragRef, inItemRef, flavorType,
7e710d ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorData, (Int32 *) &dataSize, 0);
2404cd ¤   ¤   ¤   ¤   ¤   if(IsntErr(status))
574859 ¤   ¤   ¤   ¤   ¤   {
01df83 ¤   ¤   ¤   ¤   ¤   ¤   received = ImportGroupsFromFile(
b99ecf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorData.fileSpec );
221c89 ¤   ¤   ¤   ¤   ¤   }
f02613 ¤   ¤   ¤   ¤   }
3af5bf ¤   ¤   ¤   ¤   if(received)
1d14c3 ¤   ¤   ¤   ¤   ¤   break;
e6a3a6 ¤   ¤   ¤   }
d10fe4 ¤   ¤   }
0f9371 ¤   }
b9efe6 }
c6af5a
8e7e69 ¤   Boolean
--d8f0 0003e358c59401201ab Page 25 of CGroupsWindow.cp
27033c CGroupsTable::ImportGroupsFromFile(
0e24e1 ¤   const FSSpec¤   *fsSpec )
01bb36 {
00b155 ¤   PGPGroupSetRef¤ mergeGroupSet;
42fb19 ¤   PGPError¤   ¤   err;
e167c5 ¤
58d6c0 ¤   err = PGPNewGroupSetFromFSSpec(gPGPContext, fsSpec, &mergeGroupSet);
88b1f0 ¤   if( IsntPGPError( err ) )
11c7a1 ¤   {
802e88 ¤   ¤   err = PGPMergeGroupSets( mergeGroupSet, mGroupsRef );
f89832 ¤   ¤   pgpAssertNoErr( err );
bbebcd ¤   ¤   PGPFreeGroupSet( mergeGroupSet );
68e52d ¤   ¤   ResortGroups();
6c804e ¤   ¤   ResyncTable( FALSE, TRUE );
4302c1 ¤   ¤   UpdateValidityColumn();
f7444e ¤   ¤   if( PGPGroupSetNeedsCommit( mGroupsRef ) )
3c2370 ¤   ¤   ¤   PGPSaveGroupSetToFile( mGroupsRef, mGroupsFile );
4a86f8 ¤   ¤   if( IsntPGPError( err ) )
e532bd ¤   ¤   ¤   return TRUE;
5a9371 ¤   }
9fa230 ¤   return FALSE;
ffefe6 }
2daf5a
8b6d52 ¤   void
643f01 CGroupsTable::HiliteDropArea(
bee9b9 ¤   DragReference¤  inDragRef)
98bb36 {
8ac358 ¤   Rect¤   ¤   dropRect;
d2a3d0 ¤   RgnHandle¤  dropRgn;
2167c5 ¤
ec8cf6 ¤   CalcLocalFrameRect(dropRect);
e00c3b ¤   /*::PenSize(2,2);
869727 ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_White));
084970 ¤   ::FrameRect(&dropRect);
d4ed40 ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
64ccbb ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
edcb9f ¤   ::PenSize(1,1);*/
e7ed40 ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
fefdc5 ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_Gray1));
41a8a5 ¤   dropRgn = ::NewRgn();
b275ed ¤   ::RectRgn(dropRgn, &dropRect);
5bb2ab ¤   ::ShowDragHilite(inDragRef, dropRgn, true);
7666b9 ¤   ::DisposeRgn(dropRgn);
caefe6 }
81af5a
b86d52 ¤   void
383bbb CGroupsTable::UnhiliteDropArea(
f3e9b9 ¤   DragReference¤  inDragRef)
e7bb36 {
94c358 ¤   Rect¤   ¤   dropRect;
56ed79 ¤   //RgnHandle¤dropRgn;
37af5a
485803 ¤   CalcPortFrameRect(dropRect);
108393 ¤   ::HideDragHilite(inDragRef);
0d2e2f ¤   /*dropRgn = ::NewRgn();
1d2296 ¤   ::OpenRgn();
2bf0a1 ¤   ::PenSize(2,2);
6e4970 ¤   ::FrameRect(&dropRect);
61b793 ¤   ::CloseRgn(dropRgn);
2e3d6d ¤   InvalPortRgn(dropRgn);
6fe7dc ¤   ::DisposeRgn(dropRgn);*/
fcefe6 }
bfaf5a
266d52 ¤   void
063136 CGroupsTable::EnterDropArea(
319701 ¤   DragReference¤  inDragRef,
68c024 ¤   Boolean¤¤   ¤   inDragHasLeftSender)
f1bb36 {
b12169 ¤   LDragAndDrop::EnterDropArea(inDragRef, inDragHasLeftSender);
a94049 ¤   UnselectAllCells();
253585 ¤   mLastDragCell.SetCell(0,0);
3eefe6 }
--0fe5 000a38261b2401201ab Page 26 of CGroupsWindow.cp
e0af5a
2c6d52 ¤   void
ee4e6f CGroupsTable::LeaveDropArea(
99e9b9 ¤   DragReference¤  inDragRef)
78bb36 {
6b3f19 ¤   if(mLastDragCell.row != 0)
b4cdb3 ¤   ¤   HiliteCellDrag(mLastDragCell);
f93fb9 ¤   LDragAndDrop::LeaveDropArea(inDragRef);
59efe6 }
5caf5a
f76d52 ¤   void
971d3d CGroupsTable::InsideDropArea(
67e9b9 ¤   DragReference¤  inDragRef)
e5bb36 {
fb3f34 ¤   Point¤  ¤   mousePos;
322dc5 ¤   SPoint32¤   imagePt;
8074a7 ¤   STableCell¤ overCell;
9d98e5 ¤   Boolean¤¤   foundCell;
a9207d ¤   Uint32¤ ¤   nestingLevel;
8467c5 ¤
e4cc10 ¤   if(IsntErr(::GetDragMouse(inDragRef, &mousePos, nil)))
8dc7a1 ¤   {
ca60a0 ¤   ¤   ::GlobalToLocal(&mousePos);
d0cdb7 ¤   ¤   LocalToImagePoint(mousePos, imagePt);
efe263 ¤   ¤   foundCell = GetCellHitBy(imagePt, overCell);
8a60f2 ¤   ¤   if(foundCell)
70a025 ¤   ¤   ¤   nestingLevel = GetNestingLevel(GetWideOpenIndex(overCell.row));
a3c587 ¤   ¤   if(foundCell && (overCell.col == 1) && (nestingLevel == 0))
995b34 ¤   ¤   {
134225 ¤   ¤   ¤   if(overCell != mLastDragCell)
05f776 ¤   ¤   ¤   {
10fcd9 ¤   ¤   ¤   ¤   if(mLastDragCell.row != 0)
7d8ad5 ¤   ¤   ¤   ¤   ¤   HiliteCellDrag(mLastDragCell);
5517da ¤   ¤   ¤   ¤   mLastDragCell = overCell;
4c5267 ¤   ¤   ¤   ¤   HiliteCellDrag(mLastDragCell);
7aa3a6 ¤   ¤   ¤   }
ae0fe4 ¤   ¤   }
100e1d ¤   ¤   else
895b34 ¤   ¤   {
78f295 ¤   ¤   ¤   if(mLastDragCell.row != 0)
1ff776 ¤   ¤   ¤   {
7f5267 ¤   ¤   ¤   ¤   HiliteCellDrag(mLastDragCell);
5ef34a ¤   ¤   ¤   ¤   mLastDragCell.SetCell(0,0);
78a3a6 ¤   ¤   ¤   }
7c0fe4 ¤   ¤   }
8d9371 ¤   }
82efe6 }
82af5a
c26d52 ¤   void
cd4fc2 CGroupsTable::ScrollImageBy(¤   Int32¤  ¤   inLeftDelta,
57d055 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   inTopDelta,
93cfa3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   inRefresh)
afbb36 {
998e10 ¤   if(inLeftDelta != 0)
f3c7a1 ¤   {
715b22 ¤   ¤   /*mLabels->NotifyScrolled(inLeftDelta);
b00f57 ¤   ¤   if(inRefresh)
6731c6 ¤   ¤   ¤   mLabels->Refresh();*/
209371 ¤   }
121ea1 ¤   CPGPHierarchyTable::ScrollImageBy(inLeftDelta, inTopDelta, inRefresh);
16efe6 }
f6af5a
137e69 ¤   Boolean
5a3619 CGroupsTable::HandleKeyPress(const EventRecord&¤inKeyEvent)
46bb36 {
086ff1 ¤   Boolean¤¤   keyHandled¤ = true;
42cea0 ¤   Int16¤  ¤   theKey¤ ¤   = inKeyEvent.message & charCodeMask;
fa9874 ¤   STableCell¤ cell;
749923 ¤   TableIndexT¤rows, cols;
0367c5 ¤
bd7f42 ¤   if(inKeyEvent.modifiers & cmdKey)
a3f1fc ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
--b9ad 000fed04167401201ab Page 27 of CGroupsWindow.cp
060e24 ¤   else
c2c7a1 ¤   {
d9d4c4 ¤   ¤   SetUpdateCommandStatus(TRUE);
192b6b ¤   ¤   switch(theKey)
4f5b34 ¤   ¤   {
abdb68 ¤   ¤   ¤   default:
c723b3 ¤   ¤   ¤   ¤   if(((theKey >= ' ') && (theKey <= 'Z')) ||
07588e ¤   ¤   ¤   ¤   ¤   ((theKey >= 'a') && (theKey <= 'z')))
5172c3 ¤   ¤   ¤   ¤   {
ce2613 ¤   ¤   ¤   ¤   }
2efa07 ¤   ¤   ¤   ¤   else
2ca6e6 ¤   ¤   ¤   ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
79f622 ¤   ¤   ¤   ¤   break;
8799fa ¤   ¤   ¤   case char_UpArrow:
443692 ¤   ¤   ¤   ¤   cell = GetFirstSelectedCell();
1bf1f9 ¤   ¤   ¤   ¤   cell.col = 1;
8aea63 ¤   ¤   ¤   ¤   if(cell.row > 1)
d13ca2 ¤   ¤   ¤   ¤   ¤   cell.row--;
30fceb ¤   ¤   ¤   ¤   if(cell.row < 1)
52b7d3 ¤   ¤   ¤   ¤   ¤   cell.row = 1;
ff908e ¤   ¤   ¤   ¤   UnselectAllCells();
0ea4e9 ¤   ¤   ¤   ¤   ScrollCellIntoFrame(cell);
27c7e4 ¤   ¤   ¤   ¤   SelectCell(cell);
bdf622 ¤   ¤   ¤   ¤   break;
b310b3 ¤   ¤   ¤   case char_DownArrow:
ea9505 ¤   ¤   ¤   ¤   GetTableSize(rows, cols);
633692 ¤   ¤   ¤   ¤   cell = GetFirstSelectedCell();
09f1f9 ¤   ¤   ¤   ¤   cell.col = 1;
3c0cbf ¤   ¤   ¤   ¤   cell.row++;
c5efd1 ¤   ¤   ¤   ¤   if(cell.row > rows)
1502f5 ¤   ¤   ¤   ¤   ¤   cell.row = rows;
41908e ¤   ¤   ¤   ¤   UnselectAllCells();
b1a4e9 ¤   ¤   ¤   ¤   ScrollCellIntoFrame(cell);
b9c7e4 ¤   ¤   ¤   ¤   SelectCell(cell);
40f622 ¤   ¤   ¤   ¤   break;
c252bc ¤   ¤   ¤   case char_LeftArrow:
d81c5e ¤   ¤   ¤   case char_RightArrow:
3af622 ¤   ¤   ¤   ¤   break;
6f4c64 ¤   ¤   ¤   case char_Home:
3b07b9 ¤   ¤   ¤   ¤   cell.row = cell.col = 1;
87a4e9 ¤   ¤   ¤   ¤   ScrollCellIntoFrame(cell);
30f622 ¤   ¤   ¤   ¤   break;
e48dc9 ¤   ¤   ¤   case char_End:
639505 ¤   ¤   ¤   ¤   GetTableSize(rows, cols);
aef1f9 ¤   ¤   ¤   ¤   cell.col = 1;
483f9d ¤   ¤   ¤   ¤   cell.row = rows;
0ba4e9 ¤   ¤   ¤   ¤   ScrollCellIntoFrame(cell);
5df622 ¤   ¤   ¤   ¤   break;
686f81 ¤   ¤   ¤   case char_PageUp:
28f776 ¤   ¤   ¤   {
3d59cb ¤   ¤   ¤   ¤   Rect¤   frameRect;
562b85 ¤   ¤   ¤   ¤
5eaf32 ¤   ¤   ¤   ¤   CalcLocalFrameRect(frameRect);
2982dd ¤   ¤   ¤   ¤   ScrollPinnedImageBy( 0,
0205b9 ¤   ¤   ¤   ¤   ¤   -UGraphicUtils::RectHeight(frameRect), true );
bef622 ¤   ¤   ¤   ¤   break;
6ea3a6 ¤   ¤   ¤   }
6e895e ¤   ¤   ¤   case char_PageDown:
3df776 ¤   ¤   ¤   {
b459cb ¤   ¤   ¤   ¤   Rect¤   frameRect;
e52b85 ¤   ¤   ¤   ¤
36af32 ¤   ¤   ¤   ¤   CalcLocalFrameRect(frameRect);
8d82dd ¤   ¤   ¤   ¤   ScrollPinnedImageBy( 0,
0c0403 ¤   ¤   ¤   ¤   ¤   UGraphicUtils::RectHeight(frameRect), true );
29f622 ¤   ¤   ¤   ¤   break;
4fa3a6 ¤   ¤   ¤   }
4d56ed ¤   ¤   ¤   case char_Tab:
7abce9 ¤   ¤   ¤   case char_Return:
993362 ¤   ¤   ¤   case char_Enter:
c7a190 ¤   ¤   ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
b0f622 ¤   ¤   ¤   ¤   break;
fe79b8 ¤   ¤   ¤   case char_FwdDelete:
--d905 001fd60536a401201ab Page 28 of CGroupsWindow.cp
d8d41d ¤   ¤   ¤   case char_Backspace:
b82c6f ¤   ¤   ¤   ¤   if(inKeyEvent.modifiers & optionKey)
d55c51 ¤   ¤   ¤   ¤   ¤   LCommander::GetTarget()->ProcessCommand(cmd_OptionClear);
75fa07 ¤   ¤   ¤   ¤   else
3c07dc ¤   ¤   ¤   ¤   ¤   LCommander::GetTarget()->ProcessCommand(cmd_Clear);
c7f622 ¤   ¤   ¤   ¤   break;
080fe4 ¤   ¤   }
3e9371 ¤   }
54c022 ¤   return keyHandled;
02efe6 }
fdaf5a
--ca21 0001d97fca9401201ac Page 1 of CGroupsWindow.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
14737c ¤   $Id: CGroupsWindow.h,v 1.15.2.1.2.1 1998/11/12 03:07:54 heller Exp $
cff7f7 ____________________________________________________________________________*/
447b7d #pragma once
75af5a
531d80 #include <LDragAndDrop.h>
268fd4 #include <LWindow.h>
e0f1a9 #include <LListener.h>
16ea2f #include <LBroadcaster.h>
fac2ae #include "pgpGroups.h"
efaf5a
181a11 #include "CPGPHierarchyTable.h"
b7af5a
45fcd9 const ResIDT¤   kGroupsWindowID¤¤   ¤   ¤   =¤  154;
e71060 const MessageT¤ kGroupsWindowClosed¤¤   ¤   =¤  'GWcl';
08af5a
c5f200 typedef struct GroupTableEntry
59bb36 {
34ea3f ¤   Boolean¤¤   ¤   isTopGroup;
6ff20a ¤   union
70c7a1 ¤   {
ced0cd ¤   ¤   PGPGroupID¤ ¤   groupID;
542b33 ¤   ¤   struct
035b34 ¤   ¤   {
c33186 ¤   ¤   ¤   PGPGroupItem¤   groupItem;
140f0c ¤   ¤   ¤   PGPGroupID¤ ¤   ownerGroupID;
764e82 ¤   ¤   ¤   PGPKeyRef¤  ¤   cachedKey;
121867 ¤   ¤   } item;
47fef9 ¤   } u;
852e6f } GroupTableEntry;
24af5a
7133d4 class¤  CGroupsTable¤   :¤  public CPGPHierarchyTable,
c839e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LCommander,
151951 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LDragAndDrop
cdbb36 {
ad5ed4 public:
3b7a42 ¤   enum { class_ID = 'tGrp' };
45e116 ¤   ¤   ¤   ¤   ¤   ¤   CGroupsTable(LStream *inStream);
55ee25 ¤   virtual¤¤   ¤   ¤   ~CGroupsTable();
706ed9 ¤   void¤   ¤   ¤   ¤   FinishCreateSelf();
e267c5 ¤
8ad3d4 ¤   virtual void¤   ¤   DrawSelf();
adc3bf ¤   virtual Boolean¤¤   ObeyCommand(CommandT inCommand, void* ioParam);¤
9b48a0 ¤   virtual void¤   ¤   FindCommandStatus(CommandT inCommand,
3e3663 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
8ae9fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName);
31af5a
863a3a ¤   virtual void¤   ¤   DrawCell(
b40b7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   ¤   &inCell,
237ee5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect¤ ¤   ¤   ¤   &inLocalRect);
62f49f ¤   virtual void¤   ¤   ClickCell(
0d0285 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell&¤  ¤   inCell,
714c4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent&¤ inMouseDown);
dec555 ¤   virtual void¤   ¤   ClickSelf(
372291 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent¤  &inMouseDown);
ea35cc ¤   virtual Boolean¤¤   HandleKeyPress(const EventRecord&¤  inKeyEvent);
246ad0 ¤   virtual void¤   ¤   HiliteCellActively(
eb6d8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &inCell,
dcffa6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   inHilite);
44df49 ¤   virtual void¤   ¤   HiliteCellInactively(
dc6d8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &inCell,
84ffa6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   inHilite);
fe5314 ¤   void¤   ¤   ¤   ¤   HiliteCellDrag(const STableCell¤&inCell);
64939c ¤   void¤   ¤   ¤   ¤   SetGroupSet(
ca3511 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGroupSetRef¤ ¤   groupRef,
7ef7a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFileSpecRef¤ ¤   groupsFile);
1da35b ¤   void¤   ¤   ¤   ¤   FocusDropArea();
--835d 0002cd6b0a3401201ac Page 2 of CGroupsWindow.h
052625 ¤   virtual Boolean¤¤   ItemIsAcceptable(
4386e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragReference¤  inDragRef,
12a0ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ItemReference¤  inItemRef);
f386c1 ¤   virtual void¤   ¤   ReceiveDragItem(
b886e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragReference¤  inDragRef,
1be54c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragAttributes¤ inDragAttrs,
98934d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ItemReference¤  inItemRef,
79f608 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   ¤   &inItemBounds);
17acf0 ¤   void¤   ¤   ¤   ¤   HiliteDropArea(¤DragReference¤  inDragRef);
40d9d0 ¤   void¤   ¤   ¤   ¤   UnhiliteDropArea(DragReference¤ inDragRef);
54aaa3 ¤   void¤   ¤   ¤   ¤   EnterDropArea(¤ DragReference¤  inDragRef,
3c988d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   inDragHasLeftSender);
145f11 ¤   void¤   ¤   ¤   ¤   LeaveDropArea(¤ DragReference¤  inDragRef);
74fa72 ¤   void¤   ¤   ¤   ¤   InsideDropArea(¤DragReference¤  inDragRef);
1f67c5 ¤
7aff1a ¤   void¤   ¤   ¤   ¤   ScrollImageBy(
f0bdf6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   inLeftDelta,
560aae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   inTopDelta,
f54d85 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   inRefresh);
00744e ¤   void¤   ¤   ¤   ¤   InvalidateCaches();
204070 ¤   Boolean¤¤   ¤   ¤   ImportGroupsFromFile( const FSSpec¤ *fsSpec );
2bae69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
db0fb9 private:
8f5bc6 ¤   void¤   ¤   ¤   ¤   ResyncTable(Boolean collapse, Boolean onlyUnmarked);
202c37 ¤   void¤   ¤   ¤   ¤   RedrawTable();
031e08 ¤   void¤   ¤   ¤   ¤   CollapseGroups(Boolean all);
2f3a9f ¤   void¤   ¤   ¤   ¤   ExpandGroups();
fc8be2 ¤   void¤   ¤   ¤   ¤   DrawAddressColumnCell(
d5c8bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GroupTableEntry¤¤   *gtr,
54c718 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   ¤   ¤   cellRect,
62a967 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   ¤   ¤   depth);
e29482 ¤   void¤   ¤   ¤   ¤   DrawValidityColumnCell(
adc8bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GroupTableEntry¤¤   *gtr,
d5c718 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   ¤   ¤   cellRect,
52a967 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   ¤   ¤   depth);
90e710 ¤   void¤   ¤   ¤   ¤   DrawDescriptionColumnCell(
50c8bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GroupTableEntry¤¤   *gtr,
99c718 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   ¤   ¤   cellRect,
51a967 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   ¤   ¤   depth);
74bc9b ¤   void¤   ¤   ¤   ¤   DrawValidity(¤  Int32¤  ¤   trustValue,
06138d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
00fd9c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth);
306707 ¤   void¤   ¤   ¤   ¤   UpdateValidityColumn();
6cb2d3 ¤   void¤   ¤   ¤   ¤   RefreshBorder(Rect cellRect);
e745f2 ¤   Boolean¤¤   ¤   ¤   EditGroup(PGPGroupInfo *groupInfo);
4a6b84 ¤   void¤   ¤   ¤   ¤   DeleteSelection();
ed10b2 ¤   void¤   ¤   ¤   ¤   StartDrag(
0f0285 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell&¤  ¤   inCell,
0d4c4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent&¤ inMouseDown);
4a5c09 ¤   PGPError¤   ¤   ¤   AddKeyIDToGroup(
f8ce9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyID¤   ¤   ¤   *keyID,
651928 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   algorithm,
eda650 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &groupCell);
73af1e ¤   PGPError¤   ¤   ¤   AddGroupToGroup(
a4d561 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGroupID¤ ¤   ¤   groupID,
23a650 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &groupCell);
9037dc ¤   PGPError¤   ¤   ¤   AddGroupItemToGroup(
2405f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGroupItem¤   ¤   *item,
2ca650 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &groupCell);
bd62ee ¤   void¤   ¤   ¤   ¤   ResortGroups();
685bd7 ¤   void¤   ¤   ¤   ¤   CacheKey(GroupTableEntry *tableEntry);
b453f9 ¤   void¤   ¤   ¤   ¤   UpdateFromServer();
29d6be ¤   void¤   ¤   ¤   ¤   RebuildTable();
51e647 ¤   void¤   ¤   ¤   ¤   ShowInfo();
7067c5 ¤
562f4b ¤   enum
35c7a1 ¤   {
d1713a ¤   ¤   kMaxColumnTypes¤¤   =¤  3,
c45477 ¤   ¤   kAddressColumnID¤   =¤  0,
0ae697 ¤   ¤   kValidityColumnID,
c1c7d8 ¤   ¤   kDescriptionColumnID
2c62bd ¤   };
--9eb8 001ee81261b401201ac Page 3 of CGroupsWindow.h
2a67c5 ¤
e7e2e7 ¤   STableCell¤ ¤   ¤   ¤   mLastDragCell;
39abe1 ¤   Boolean¤¤   ¤   ¤   ¤   mSendingDrag;
c03eb1 ¤   PGPGroupSetRef¤ ¤   ¤   mGroupsRef;
14f8fa ¤   PGPFileSpecRef¤ ¤   ¤   mGroupsFile;
9e82f7 };
60af5a
866a6c class¤  CGroupsWindow¤  :¤  public LWindow,
14bca0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener,
5acf7c ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster
b0bb36 {
bc5ed4 public:
12f139 ¤   enum { class_ID = 'Gwin' };
703424 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CGroupsWindow();
d283de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CGroupsWindow(LStream *inStream);
fced70 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ~CGroupsWindow();
a09a35 ¤   void¤   ¤   ¤   ¤   ¤   ¤   FinishCreateSelf();
1361cb ¤   virtual void¤   ¤   ¤   ¤   AttemptClose();
2ea386 ¤   void¤   ¤   ¤   ¤   ¤   ¤   ListenToMessage(MessageT¤   inMessage,
b504bb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *¤ ¤   ioParam);
4567c5 ¤
aa80a2 ¤   void¤   ¤   ¤   ¤   ¤   ¤   InvalidateCaches();
970fb9 private:
473069 ¤   CGroupsTable¤   ¤   ¤   ¤   *mGroupsTable;
11f96e ¤   PGPGroupSetRef¤ ¤   ¤   ¤   mGroupsRef;
30c957 ¤   PGPFileSpecRef¤ ¤   ¤   ¤   mGroupsFile;
8f82f7 };
eeaf5a
--c83d 0003adf4664401201ad Page 1 of CKeyDragTask.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
2fc137 ¤   $Id: CKeyDragTask.cp,v 1.7.2.1.2.1 1998/11/12 03:07:55 heller Exp $
35f7f7 ____________________________________________________________________________*/
a3271e #include "CKeyDragTask.h"
98fbb5 #include "CDragSource.h"
fdaf5a
944919 #include "pgpUtilities.h"
bc0d08 #include "pgpMem.h"
f2af5a
714558 ¤   static pascal OSErr·
fb31e6 SendData(
4b38a2 ¤   FlavorType flavor,·
99e4c7 ¤   void *dragSendRefCon,·
91555c ¤   ItemReference theItemRef,
9d4c9a ¤   DragReference theDragRef);
d1af5a
04389b CKeyDragTask::CKeyDragTask(
f23f44 ¤   CDragSource & inSource,
dfa2f5 ¤   const EventRecord & inEventRecord) :
c72fe5 ¤   ¤   mSource(inSource),
771907 ¤   ¤   LDragTask(inEventRecord)
1fbb36 {
7385ea ¤   mDragDataProc = NewDragSendDataProc(SendData);
a9efe6 }
3baf5a
d8c34a CKeyDragTask::~CKeyDragTask()
27bb36 {
0d909d ¤   DisposeRoutineDescriptor(mDragDataProc);
bcefe6 }
b5af5a
894558 ¤   static pascal OSErr·
3431e6 SendData(
7338a2 ¤   FlavorType flavor,·
67e4c7 ¤   void *dragSendRefCon,·
b8555c ¤   ItemReference theItemRef,
ccceae ¤   DragReference theDragRef)
77bb36 {
e1e0c5 ¤   OSErr¤  result = cantGetFlavorErr;
3eaf5a
1240e0 ¤   if(flavor == kKeyDragFlavor)
6ec7a1 ¤   {
3a7444 ¤   ¤   PGPKeyRef¤  key;
031b52 ¤   ¤
c6ad0e ¤   ¤   if(((CKeyDragTask *)dragSendRefCon)->CreateKeyRef(theItemRef, &key))
415b34 ¤   ¤   {
00b2ce ¤   ¤   ¤   result = SetDragItemFlavorData(theDragRef,·
543a54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theItemRef,·
919b13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeyDragFlavor,
efccd4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &key,·
874e0c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(PGPKeyRef),·
4acd66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0L);
e60fe4 ¤   ¤   }
199371 ¤   }
e83501 ¤   else if(flavor == 'TEXT')
6ec7a1 ¤   {
5a2849 ¤   ¤   void¤   *textBlock;
0127d4 ¤   ¤   long¤   len;
49af5a
ec2197 ¤   ¤   if(((CKeyDragTask *)dragSendRefCon)->CreateText(theItemRef,
b610e3 ¤   ¤   ¤   &textBlock, &len))
525b34 ¤   ¤   {
86b2ce ¤   ¤   ¤   result = SetDragItemFlavorData(theDragRef,·
a03a54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theItemRef,·
13de8c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   'TEXT',
723446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   textBlock,·
092bd7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   len,·
3acd66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0L);
--2f36 00043138de4401201ad Page 2 of CKeyDragTask.cp
ebc7e2 ¤   ¤   ¤   PGPFreeData((char *)textBlock);
e00fe4 ¤   ¤   }
d39371 ¤   }
115b7d ¤   else if(flavor == flavorTypePromiseHFS)
41c7a1 ¤   {
01cce5 ¤   ¤   FSSpec¤ spec;
bc1b52 ¤   ¤
7e897d ¤   ¤   if(((CKeyDragTask *)dragSendRefCon)->CreateHFS(theItemRef, &spec))
ba5b34 ¤   ¤   {
b3b2ce ¤   ¤   ¤   result = SetDragItemFlavorData(theDragRef,·
6e3a54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theItemRef,·
08d102 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorTypeHFS,
844fda ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &spec,·
21ec51 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(FSSpec),·
eacd66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0L);
0e0fe4 ¤   ¤   }
459371 ¤   }
350e24 ¤   else
8dc7a1 ¤   {
ecc76a ¤   ¤   pgpAssert(0);¤  // Illegal flavor requested
6c9371 ¤   }
e25d73 ¤   return result;
86efe6 }
81af5a
187e69 ¤   Boolean
da85d9 CKeyDragTask::CreateKeyRef(ItemReference theItemRef, PGPKeyRef *key)
a5bb36 {
d6207d ¤   return mSource.GetKeyRef(theItemRef, key);
faefe6 }
97af5a
097e69 ¤   Boolean
4740c9 CKeyDragTask::CreateText(ItemReference theItemRef, void **textBlock,
d67a5e ¤   ¤   ¤   ¤   ¤   ¤   long *len)
50bb36 {
70d050 ¤   return mSource.GetTextBlock(theItemRef, textBlock, len);
96efe6 }
00af5a
307e69 ¤   Boolean
200cf7 CKeyDragTask::CreateHFS(ItemReference theItemRef, FSSpec *spec)
e0bb36 {
24a947 ¤   return mSource.GetHFS(theItemRef, mDragRef, spec);
85efe6 }
beaf5a
60eb4f ¤   void¤
e863a3 CKeyDragTask::AddFlavors(DragReference inDragRef)
b8bb36 {
0bd32a ¤   mDragRef = inDragRef;
3b9265 ¤   SetDragSendProc(mDragRef, mDragDataProc, this);
6490e8 ¤   mSource.AddFlavors(this);
2defe6 }
c3af5a
266d52 ¤   void
e6a432 CKeyDragTask::AddThisFlavor(UInt32¤ theRef)
0fbb36 {
b26eef ¤   OSErr¤  theErr;
6f67c5 ¤
29bdcb ¤   // I disabled the HFS drag support because Eudora takes the HFS
2875e7 ¤   // rather than the TEXT and we always want to paste TEXT into
cc0cda ¤   // Eudora.
6967c5 ¤
6bd3cf ¤   //theErr = ::AddDragItemFlavor(mDragRef, theRef, flavorTypePromiseHFS,
c1616a ¤   //¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil, 0, 0);
ef975b ¤   //pgpAssert(IsntErr(theErr));
6128bc ¤   theErr = ::AddDragItemFlavor(mDragRef, theRef, kKeyDragFlavor, nil, 0,·
9f80a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorNotSaved );
6c0ffc ¤   pgpAssert(IsntErr(theErr));
e9fb28 ¤   theErr = ::AddDragItemFlavor(mDragRef, theRef, 'TEXT', nil, 0, 0);
bb0ffc ¤   pgpAssert(IsntErr(theErr));
15efe6 }
69af5a
bdb646 ·¤  void¤
43697c CKeyDragTask::MakeDragRegion(DragReference, RgnHandle inDragRegion)
--de8c 0014e91562c401201ad Page 3 of CKeyDragTask.cp
2cbb36 {
07a5af ¤   STableCell¤ cell(0, 0);
9b67c5 ¤
82d26f ¤   mSource.GetDragHiliteRgn( inDragRegion, cell, true );
95efe6 }
4eaf5a
--7ad2 00180de38d1401201ae Page 1 of CKeyDragTask.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
eed0bb ¤   $Id: CKeyDragTask.h,v 1.5.8.1 1998/11/12 03:07:56 heller Exp $
50f7f7 ____________________________________________________________________________*/
5e7b7d #pragma once
45af5a
afa13b #include <LDragTask.h>
afaf5a
b3a076 #include "pgpKeys.h"
e8af5a
126ea5 class¤  CDragSource;
b1af5a
5dbd25 const FlavorType¤   kKeyDragFlavor¤ ¤   ¤   = ¤ 'pgKY';
76af5a
d4474e class¤  CKeyDragTask¤   :¤  public LDragTask
05bb36 {
8f5ed4 public:
828a77 ¤   ¤   ¤   CKeyDragTask(¤  CDragSource & inSource,
d293a9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord& inEventRecord);
667575 ¤   ¤   ¤   ~CKeyDragTask();
9faf5a
c86d45 ¤   void¤   AddThisFlavor( UInt32¤  theRef );
0467c5 ¤
f853ee ¤   Boolean¤CreateKeyRef(ItemReference theItemRef, PGPKeyRef *key);
85af42 ¤   Boolean¤CreateText(ItemReference theItemRef, void **textBlock, long *len);
af2476 ¤   Boolean¤CreateHFS(ItemReference theItemRef, FSSpec *spec);
33af5a
6ba2d3 protected:
1e38b6 ¤   virtual void¤   AddFlavors(
7ba394 ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragReference¤  ¤   ¤   inDragRef);
d8351a ¤   virtual void¤   MakeDragRegion(
23f07e ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragReference¤  ¤   ¤   inDragRef,
eb298e ¤   ¤   ¤   ¤   ¤   ¤   ¤   RgnHandle¤  ¤   ¤   ¤   inDragRegion);
f8af5a
3a183f ¤   CDragSource&¤   mSource;
51e7d1 ¤   DragReference¤  mDragRef;
18417f ¤   DragSendDataUPP¤mDragDataProc;
bb82f7 };
80af5a
--d502 000edde11ba401201af Page 1 of CKeyGenWizardDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
3aaf5a
daaf5a
ed1ce5 ¤   $Id: CKeyGenWizardDialog.cp,v 1.79.8.1 1998/11/12 03:07:57 heller Exp $
1ef7f7 ____________________________________________________________________________*/
c4af5a
e84d37 #include <LowMem.h>
48af5a
6f40db #include <LRadioButton.h>
b78708 #include <LCheckBox.h>
ddd797 #include <LPushButton.h>
4049f7 #include <LProgressBar.h>
837c09 #include <LEditText.h>
c405c6 #include <LStaticText.h>
9aa94f #include <LTextGroupBox.h>
1fec08 #include <LLittleArrows.h>
4e7c99 #include <URegistrar.h>
7117f9 #include <UReanimator.h>
bcdd56 #include <PP_Messages.h>
43af5a
3ff371 #include <fp.h>
3a324c #include <string.h>
46af5a
8359ab #include "CKeyGenWizardDialog.h"
daaf5a
0c829c #include "CPassphraseEdit.h"
e259c5 #include "CPGPStDialogHandler.h"
e5d73a #include "CSecureMemory.h"
e49dc2 #include "CWarningAlert.h"
1aaf5a
bcf205 #include "CKeyWindow.h"
a04d6a #include "CGADurationEditField.h"
d2b8cb #include "CPGPKeys.h"
306ff8 #include "CKeyTable.h"
ce8bd8 #include "MacEnvirons.h"
0185c2 #include "MacStrings.h"
01af5a
330d08 #include "pgpMem.h"
ecc9be #include "pgpRandomPool.h"
d22f8d #include "pgpErrors.h"
28a02f #include "pgpClientLib.h"
0bc97b #include "pgpClientPrefs.h"
503991 #include "pgpAdminPrefs.h"
7ae684 #include "pgpUserInterface.h"
d7af5a
3c8353 const Int16¤¤   ¤   kRecommendedMinPassLength¤  =¤  8;
b2af5a
354e2b const ResIDT¤   ¤   kStringListResID¤   = 1015;
8aaf5a
16d1bd const ResIDT¤   ¤   view_Introduction¤  = 200;
e36641 const ResIDT¤   ¤   view_NameAndAddress¤= 201;
6fcec0 const ResIDT¤   ¤   view_KeyType¤   ¤   = 202;
f52239 const ResIDT¤   ¤   view_KeySize¤   ¤   = 203;
5d350a const ResIDT¤   ¤   view_KeyExpiration¤ = 204;
f861fe const ResIDT¤   ¤   view_KeyPassphrase¤ = 205;
80e522 const ResIDT¤   ¤   view_BadPassphrase¤ = 211;
48a09e const ResIDT¤   ¤   view_GetRandomData¤ = 206;
45e5e5 const ResIDT¤   ¤   view_GeneratingKey¤ = 207;
76d155 const ResIDT¤   ¤   view_MRK¤   ¤   ¤   = 208;
f901c6 const ResIDT¤   ¤   view_Corp¤  ¤   ¤   = 209;
9d87ff const ResIDT¤   ¤   view_Revoker¤   ¤   = 213;
80e917 const ResIDT¤   ¤   view_SendToServer¤  = 212;
94a4de const ResIDT¤   ¤   view_Conclusion¤¤   = 210;
27af5a
3402f4 const MessageT¤ ¤   kNextViewMessage¤   ¤   ¤   = 'Next';
b6c5f3 const MessageT¤ ¤   kPreviousViewMessage¤   ¤   = 'Prev';
644ed8 const MessageT¤ ¤   kAllowViewSwitchMessage¤¤   = 'ASwi';
1daf5a
ed43d2 const PaneIDT¤  ¤   kNextButtonPaneID¤  ¤   ¤   = 'bNxt';
--6a6a 0008f20dab4401201af Page 2 of CKeyGenWizardDialog.cp
fdfe78 const PaneIDT¤  ¤   kPreviousButtonPaneID¤  ¤   = 'bPrv';
a7243b const PaneIDT¤  ¤   kCancelButtonPaneID¤¤   ¤   = 'bCan';
b17bf2 const PaneIDT¤  ¤   kGeneratingKeyProgressID¤   = 'Ther';
d8af5a
577c83 const UInt32¤   ¤   kMinKeySize¤¤   ¤   ¤   = 768;
2d1c3a const UInt32¤   ¤   kRSAMaxKeySize¤ ¤   ¤   = 2048;
696dee const UInt32¤   ¤   kDSAElGamalMaxKeySize¤  = 4096;
8faf5a
ff7252 const UInt32¤   ¤   kMaxKeyExpirationDays¤  = 10950;
d9af5a
b67353 enum
86bb36 {
7eeef4 ¤   kNextButtonTitleStrIndex¤   = 1,
88cdbe ¤   kDoneButtonTitleStrIndex,
1b4513 ¤   kNameRequiredStrIndex,
379331 ¤   kVerifyNoEmailAddressStrIndex,
a1187a ¤   kKeyRangeCaptionFormatStrIndex,
9709e7 ¤   kKeySizeOutOfRangeStrIndex,
793a98 ¤   kKeyExpirationOutOfRangeStrIndex,
da5f27 ¤   kKeyGenerationErrorStrIndex,
534cdd ¤   kNoMRKErrorStrIndex,
328483 ¤   kNoCorpKeyErrorStrIndex,
18e248 ¤   k768WarningStrIndex,
39bd94 ¤   kAdminKeySizeErrorStrIndex,
f73a4a ¤   kNoRevokerKeyErrorStrIndex
9882f7 };
b7af5a
d65290 Boolean¤¤   CKeyGenWizardDialog::mGeneratingKey;
0b0943 PGPError¤   CKeyGenWizardDialog::mKeyGenerationError;
9baf5a
92b0e0 #pragma mark --- CKeyGenWizardView ---
bdaf5a
db5952 class CKeyGenWizardView : ¤ public LView,
ca6686 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LCommander
8bbb36 {
4e5ed4 public:
a7af5a
1e6582 ¤   enum { class_ID = 'vKGW' };
5a67c5 ¤
317c36 ¤   ¤   ¤   ¤   CKeyGenWizardView(LStream *inStream);
26b870 ¤   virtual¤¤   ~CKeyGenWizardView();
baaf5a
0982f7 };
a4af5a
69b9a3 CKeyGenWizardView::CKeyGenWizardView(LStream *inStream)
2a80d6 ¤   : LView(inStream)
bcbb36 {
2defe6 }
48af5a
586fad CKeyGenWizardView::~CKeyGenWizardView()
5abb36 {
3aefe6 }
6faf5a
689bb5 #pragma mark --- CNameAndAddressView ---
4baf5a
f455ac class CNameAndAddressView : public CKeyGenWizardView
1abb36 {
255ed4 public:
f9af5a
87f064 ¤   enum { class_ID = 'vNAA' };
6067c5 ¤
25b81c ¤   ¤   ¤   ¤   ¤   CNameAndAddressView(LStream *inStream);
e09178 ¤   virtual¤¤   ¤   ~CNameAndAddressView();
72af5a
051bd7 ¤   void¤   ¤   ¤   GetParams(StringPtr name, StringPtr address);
be5ba4 ¤   void¤   ¤   ¤   SetParams(ConstStr255Param name, ConstStr255Param address);
4467c5 ¤
2e524d ¤   void¤   ¤   ¤   GetEmailAddress(StringPtr address);
c0076d ¤   void¤   ¤   ¤   SetEmailAddress(ConstStr255Param address);
3967c5 ¤
450fb9 private:
8faf5a
--0ac3 000439a1b38401201af Page 3 of CKeyGenWizardDialog.cp
602f4b ¤   enum
66c7a1 ¤   {
de1f30 ¤   ¤   kNameEditFieldPaneID¤   ¤   ¤   = 'Name',
519699 ¤   ¤   kEmailAddressEditFieldPaneID¤   = 'Mail'
e7f4b9 ¤   };¤
3382f7 };
66af5a
6fb6d8 CNameAndAddressView::CNameAndAddressView(LStream *inStream)
992e00 ¤   : CKeyGenWizardView(inStream)
93bb36 {
50efe6 }
22af5a
b37b1c CNameAndAddressView::~CNameAndAddressView()
0abb36 {
58efe6 }
7faf5a
256d52 ¤   void
e5e8d3 CNameAndAddressView::GetParams(
fe06b0 ¤   StringPtr name,
8dc72e ¤   StringPtr address)
86bb36 {
98a3e4 ¤   LEditText¤  *editFieldObj;
a867c5 ¤
83a331 ¤   editFieldObj = (LEditText *) FindPaneByID( kNameEditFieldPaneID );
986ffa ¤   pgpAssertAddrValid( editFieldObj, LEditText );
ce67c5 ¤
8ff2b2 ¤   editFieldObj->GetDescriptor( name );
f9af5a
46a29f ¤   editFieldObj = (LEditText *) FindPaneByID(
1ab18d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEmailAddressEditFieldPaneID );
e96ffa ¤   pgpAssertAddrValid( editFieldObj, LEditText );
6f67c5 ¤
c3f1b4 ¤   editFieldObj->GetDescriptor( address );
4befe6 }
a4af5a
266d52 ¤   void
f1c7c3 CNameAndAddressView::SetParams(
0901a2 ¤   ConstStr255Param name,
f6ba0b ¤   ConstStr255Param address)
bfbb36 {
22a3e4 ¤   LEditText¤  *editFieldObj;
5b67c5 ¤
b8a29f ¤   editFieldObj = (LEditText *) FindPaneByID(
dbb18d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kEmailAddressEditFieldPaneID );
d56ffa ¤   pgpAssertAddrValid( editFieldObj, LEditText );
9b67c5 ¤
00690b ¤   editFieldObj->SetDescriptor( address );
8aaf5a
eca331 ¤   editFieldObj = (LEditText *) FindPaneByID( kNameEditFieldPaneID );
246ffa ¤   pgpAssertAddrValid( editFieldObj, LEditText );
b067c5 ¤
7519ac ¤   editFieldObj->SetDescriptor( name );
e23c74 ¤   editFieldObj->SelectAll();
6852a5 ¤   SwitchTarget( editFieldObj );
81efe6 }
56af5a
234ad5 #pragma mark --- CKeyTypeView ---
86af5a
f102ce class CKeyTypeView : public CKeyGenWizardView
04bb36 {
a15ed4 public:
4baf5a
7ee194 ¤   enum { class_ID = 'vKTp' };
8267c5 ¤
e0dbd3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CKeyTypeView(LStream *inStream);
d69c26 ¤   virtual¤¤   ¤   ¤   ¤   ~CKeyTypeView();
37dcb9 ¤   virtual void¤   ¤   ¤   FinishCreateSelf();
4067c5 ¤
2f8e28 ¤   PGPPublicKeyAlgorithm¤  GetAlgorithm(void);
1ad528 ¤   void¤   ¤   ¤   ¤   ¤   SetAlgorithm(UInt32 algorithm);
7467c5 ¤
430fb9 private:
--0350 000caba2c18401201af Page 4 of CKeyGenWizardDialog.cp
e0af5a
772f4b ¤   enum
92c7a1 ¤   {
de7ed5 ¤   ¤   kDSAElGamalButtonPaneID¤= 'bDSA',
170d34 ¤   ¤   kRSAButtonPaneID¤   ¤   = 'bRSA',
55aa96 ¤   ¤   kButtonGroupPaneID¤ ¤   = 'vGrp'
69f4b9 ¤   };¤
2682f7 };
80af5a
d03bdb CKeyTypeView::CKeyTypeView(LStream *inStream)
bb2e00 ¤   : CKeyGenWizardView(inStream)
78bb36 {
76efe6 }
c1af5a
2ea11e CKeyTypeView::~CKeyTypeView()
21bb36 {
69efe6 }
a7af5a
156d52 ¤   void
1ea69a CKeyTypeView::FinishCreateSelf()
ccbb36 {
15a3c1 ¤   PGPBoolean¤ ¤   allowRSA = TRUE;
9daf5a
aabe29 #if PGP_BUSINESS_SECURITY
6261e0 ¤   PGPError¤   err;
deaf5a
3f0e24 ¤   err = PGPGetPrefBoolean(gAdminPrefRef, kPGPPrefAllowRSAKeyGen, &allowRSA);
2cdd44 ¤   pgpAssertNoErr(err);
fd7454 #endif
33bf7d ¤   if( allowRSA )
ede32c ¤   ¤   PGPRSASupported( &allowRSA );
a122a7 ¤   if( !allowRSA || NO_RSA_KEYGEN )
024327 ¤   ¤   ((LRadioButton *)FindPaneByID(kRSAButtonPaneID))->Disable();
81efe6 }
dcaf5a
086d52 ¤   void
bbbd25 CKeyTypeView::SetAlgorithm(UInt32 algorithm)
49bb36 {
0f9d55 ¤   PaneIDT¤paneID = PaneIDT_Undefined;
9967c5 ¤
6aaa80 ¤   switch( algorithm )
dec7a1 ¤   {
5d7b0a ¤   ¤   case kPGPPublicKeyAlgorithm_DSA:
9c80e0 ¤   ¤   ¤   paneID = kDSAElGamalButtonPaneID;
60cdcb ¤   ¤   ¤   break;
fb1b52 ¤   ¤
12f4d2 ¤   ¤   case kPGPPublicKeyAlgorithm_RSA:
06a793 ¤   ¤   ¤   paneID = kRSAButtonPaneID;
0acdcb ¤   ¤   ¤   break;
c1af5a
909ae3 ¤   ¤   default:
4c37a4 ¤   ¤   ¤   pgpDebugMsg( "SetAlgorithm(): Unknown algorithm" );
76cdcb ¤   ¤   ¤   break;
fc9371 ¤   }
af67c5 ¤
f056f0 ¤   if( paneID != PaneIDT_Undefined )
98c7a1 ¤   {
2cf9a8 ¤   ¤   LRadioButton¤   *buttonObj;
5787c7 ¤   ¤   ¤
2434bb ¤   ¤   buttonObj = (LRadioButton *) FindPaneByID( paneID );
2e1b52 ¤   ¤
322dd3 ¤   ¤   buttonObj->SetValue( 1 );
be9371 ¤   }
06efe6 }
7eaf5a
c0f137 ¤   PGPPublicKeyAlgorithm
fd8b4a CKeyTypeView::GetAlgorithm(void)
a3bb36 {
7d215b ¤   LRadioButton¤   ¤   ¤   *buttonObj;
b0ea37 ¤   PGPPublicKeyAlgorithm¤  algorithm;
f567c5 ¤
cadc87 ¤   algorithm = kPGPPublicKeyAlgorithm_DSA;
--9f69 000aaa31feb401201af Page 5 of CKeyGenWizardDialog.cp
2a67c5 ¤
7028b8 ¤   buttonObj = (LRadioButton *) FindPaneByID( kRSAButtonPaneID );
d867c5 ¤
2b9d09 ¤   if( buttonObj->GetValue() > 0 )
c7c7a1 ¤   {
444b0f ¤   ¤   algorithm = kPGPPublicKeyAlgorithm_RSA;
709371 ¤   }
9667c5 ¤
794cfe ¤   return( algorithm );
9eefe6 }
d9af5a
5550c6 #pragma mark --- CKeySizeView ---
13af5a
9db1f0 class CKeySizeView : public CKeyGenWizardView
fabb36 {
805ed4 public:
7aaf5a
170f82 ¤   enum { class_ID = 'vKSz' };
fd67c5 ¤
e2ca3e ¤   ¤   ¤   ¤   ¤   CKeySizeView(LStream *inStream);
047219 ¤   virtual¤¤   ¤   ~CKeySizeView();
b6af5a
0cae03 ¤   UInt32¤ ¤   ¤   GetKeySize(void);
7f6224 ¤   void¤   ¤   ¤   SetParams(UInt32 algorithm, UInt32 keySize);
7b67c5 ¤
d0a2d3 protected:
caaf5a
d190d4 ¤   virtual¤void¤   FinishCreateSelf(void);
7767c5 ¤
030fb9 private:
74af5a
f92f4b ¤   enum
8dc7a1 ¤   {
fb42a6 ¤   ¤   k768BitsButtonPaneID¤   ¤   ¤   = 768,
1ef8ee ¤   ¤   k1024BitsButtonPaneID¤  ¤   ¤   = 1024,
1e8ca3 ¤   ¤   k1536BitsButtonPaneID¤  ¤   ¤   = 1536,
66ab5a ¤   ¤   k2048BitsButtonPaneID¤  ¤   ¤   = 2048,
676f7a ¤   ¤   k3072BitsButtonPaneID¤  ¤   ¤   = 3072,
a370ed ¤   ¤   kCustomBitsButtonPaneID¤¤   ¤   = 'bCus',
f9fbf0 ¤   ¤   kCustomBitsEditFieldPaneID¤ ¤   = 'eCus',
25cc44 ¤   ¤   kCustomBitsRangeCaptionPaneID¤  = 'cRng',
5b5103 ¤   ¤   kRSALimitNoteCaptionPaneID¤ ¤   = 'cNot'
dc62bd ¤   };
3467c5 ¤
4a80dd ¤   typedef struct ButtonInfo
36c7a1 ¤   {
6ae70a ¤   ¤   UInt32¤ ¤   Keys;
fc60fa ¤   ¤   PaneIDT¤¤   paneID;
7d62bd ¤   };
ab67c5 ¤
ceb3b9 ¤   static ButtonInfo¤  sButtonInfo[];
d167c5 ¤
59f9d2 ¤   LRadioButton¤   ¤   *mCustomBitsButton;
a8ed13 ¤   LEditText¤  ¤   *mCustomBitsEditField;
f682f7 };
0faf5a
598994 CKeySizeView::ButtonInfo¤   CKeySizeView::sButtonInfo[] = {
4c7a7c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { 768, k768BitsButtonPaneID },
5bd0b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { 1024, k1024BitsButtonPaneID },
2267d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { 1536, k1536BitsButtonPaneID },
399d54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { 2048, k2048BitsButtonPaneID },
e98110 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { 3072, k3072BitsButtonPaneID } };
8eaf5a
0e381b CKeySizeView::CKeySizeView(LStream *inStream)
c02e00 ¤   : CKeyGenWizardView(inStream)
47bb36 {
00efe6 }
94af5a
8b4292 CKeySizeView::~CKeySizeView(void)
cfbb36 {
a9efe6 }
aaaf5a
--9a89 00009f2a831401201af Page 6 of CKeyGenWizardDialog.cp
3b6d52 ¤   void
42506a CKeySizeView::FinishCreateSelf(void)
17bb36 {
49394c ¤   CKeyGenWizardView::FinishCreateSelf();
df67c5 ¤
19f7a4 ¤   mCustomBitsButton = (LRadioButton *) FindPaneByID(
288ff4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCustomBitsButtonPaneID );
f6af5a
bca79b ¤   mCustomBitsEditField = (LEditText *) FindPaneByID(
c99768 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCustomBitsEditFieldPaneID );
75db8a ¤   pgpAssertAddrValid( mCustomBitsEditField, LEditText );
8cefe6 }
72af5a
086d52 ¤   void
bdf7a6 CKeySizeView::SetParams(UInt32 algorithm, UInt32 keySize)
d0bb36 {
05843f ¤   Boolean¤¤   ¤   foundButton = false;
c97a51 ¤   UInt32¤ ¤   ¤   numButtons;
537254 ¤   LRadioButton¤   *buttonObj;
0869cd ¤   LStaticText¤¤   *captionObj;
72e011 ¤   Str255¤ ¤   ¤   caption;
1f9b6e ¤   UInt32¤ ¤   ¤   maxKeySize;
06842b ¤   Str32¤  ¤   ¤   numStr;
9767c5 ¤
0cc61f ¤   pgpAssert( keySize >= 768 && keySize <= 4096 );
d767c5 ¤
402096 ¤   if( algorithm == kPGPPublicKeyAlgorithm_RSA )
71c7a1 ¤   {
65a42e ¤   ¤   maxKeySize = kRSAMaxKeySize;
5e1b52 ¤   ¤
334b96 ¤   ¤   buttonObj = (LRadioButton *) FindPaneByID( k3072BitsButtonPaneID );
c01b52 ¤   ¤
d19827 ¤   ¤   buttonObj->Disable();
0d1b52 ¤   ¤
279c9b ¤   ¤   captionObj = (LStaticText *) FindPaneByID( kRSALimitNoteCaptionPaneID );
5b1b52 ¤   ¤
ae38fa ¤   ¤   captionObj->Show();
f39371 ¤   }
4a0e24 ¤   else
15c7a1 ¤   {
9b508d ¤   ¤   maxKeySize = kDSAElGamalMaxKeySize;
479371 ¤   }
6167c5 ¤
72cac1 ¤   if( keySize > maxKeySize )
a672b3 ¤   ¤   keySize = maxKeySize;
951b52 ¤   ¤
143d2a ¤   GetIndString( caption, kStringListResID, kKeyRangeCaptionFormatStrIndex );
3febc0 ¤   NumToString( maxKeySize, numStr );
e5b2a9 ¤   PrintPString( caption, caption, numStr );
1c67c5 ¤
79b969 ¤   captionObj = (LStaticText *) FindPaneByID( kCustomBitsRangeCaptionPaneID );
6b67c5 ¤
ec499a ¤   captionObj->SetDescriptor( caption );
6167c5 ¤
7e2d92 ¤   numButtons = sizeof( sButtonInfo ) / sizeof( sButtonInfo[0] );
656f1d ¤   for( UInt32 buttonIndex = 0; buttonIndex < numButtons; buttonIndex++ )
3cc7a1 ¤   {
5861e7 ¤   ¤   if( sButtonInfo[buttonIndex].Keys == keySize )
b35b34 ¤   ¤   {
ce72df ¤   ¤   ¤   buttonObj = (LRadioButton *) FindPaneByID(
df5e0e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sButtonInfo[buttonIndex].paneID );
8987c7 ¤   ¤   ¤
0fc2a0 ¤   ¤   ¤   buttonObj->SetValue( 1 );
e1e7dd ¤   ¤   ¤   foundButton = true;
6587c7 ¤   ¤   ¤
9acdcb ¤   ¤   ¤   break;
330fe4 ¤   ¤   }
119371 ¤   }
1067c5 ¤
b66ed8 ¤   if( ! foundButton )
fdc7a1 ¤   {
0922f5 ¤   ¤   mCustomBitsButton->SetValue( 1 );
--2b50 0008e767c91401201af Page 7 of CKeyGenWizardDialog.cp
0425cb ¤   ¤   mCustomBitsEditField->SetValue( keySize );
d39371 ¤   }
c3af5a
f44ad1 ¤   mCustomBitsEditField->SelectAll();
9c02e9 ¤   SwitchTarget( mCustomBitsEditField );
c6efe6 }
39af5a
3fcd56 ¤   UInt32
1b25d9 CKeySizeView::GetKeySize(void)
0bbb36 {
6cafeb ¤   UInt32¤ Keys;
842e18 ¤   Boolean¤foundButton = false;
c0ab7f ¤   UInt32¤ numButtons;
b567c5 ¤
812d92 ¤   numButtons = sizeof( sButtonInfo ) / sizeof( sButtonInfo[0] );
336f1d ¤   for( UInt32 buttonIndex = 0; buttonIndex < numButtons; buttonIndex++ )
6dc7a1 ¤   {
74f9a8 ¤   ¤   LRadioButton¤   *buttonObj;
581b52 ¤   ¤
da63f8 ¤   ¤   buttonObj = (LRadioButton *) FindPaneByID(
a0b329 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sButtonInfo[buttonIndex].paneID );
9a1b52 ¤   ¤
bc585c ¤   ¤   if( buttonObj->GetValue() > 0 )
3d5b34 ¤   ¤   {
5adec3 ¤   ¤   ¤   Keys ¤  = sButtonInfo[buttonIndex].Keys;
bce7dd ¤   ¤   ¤   foundButton = true;
f7cdcb ¤   ¤   ¤   break;
580fe4 ¤   ¤   }
5c9371 ¤   }
c867c5 ¤
eb6ed8 ¤   if( ! foundButton )
76c7a1 ¤   {
2a5d9b ¤   ¤   pgpAssert( mCustomBitsButton->GetValue() > 0 );
3a1b52 ¤   ¤
d8914c ¤   ¤   Keys = mCustomBitsEditField->GetValue();
a29371 ¤   }
ed67c5 ¤
fab923 ¤   return( Keys );
adefe6 }
99af5a
0c7e86 #pragma mark --- CKeyExpirationView ---
adaf5a
fa8609 class CKeyExpirationView :¤ public CKeyGenWizardView,
ab2717 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener
76bb36 {
315ed4 public:
7daf5a
1cead0 ¤   enum { class_ID = 'vKEx' };
c467c5 ¤
258c32 ¤   ¤   ¤   ¤   ¤   CKeyExpirationView(LStream *inStream);
cb2733 ¤   virtual¤¤   ¤   ~CKeyExpirationView();
2faf5a
30f6cc ¤   Boolean¤¤   ¤   GetExpiration(UInt32 *expirationDays);
73bba9 ¤   void¤   ¤   ¤   SetExpiration(UInt32 Keys);
9ef559 ¤   virtual¤void¤   ListenToMessage(MessageT inMessage, void *ioParam);
d367c5 ¤
d60fb9 private:
91af5a
8664bd ¤   Int32¤  ¤   ¤   ¤   ¤   ¤   mLastArrowValue;
61af5a
362f4b ¤   enum
d5c7a1 ¤   {
d446ea ¤   ¤   kNeverButtonPaneID¤ ¤   = 'bNvr',
d890fc ¤   ¤   kDaysButtonPaneID¤  ¤   = 'bExp',
c49399 ¤   ¤   kDateDurationFieldID¤   = 'eDur',
7eccf8 ¤   ¤   kDateArrowsID¤  ¤   ¤   = 'lArr'
fe62bd ¤   };
4082f7 };
91af5a
48e7ae CKeyExpirationView::CKeyExpirationView(LStream *inStream)
442e00 ¤   : CKeyGenWizardView(inStream)
8ebb36 {
--5e56 00064487a7a401201af Page 8 of CKeyGenWizardDialog.cp
7aefe6 }
46af5a
6ac24d CKeyExpirationView::~CKeyExpirationView(void)
a2bb36 {
fdefe6 }
adaf5a
716d52 ¤   void
684efe CKeyExpirationView::SetExpiration(UInt32 days)
02bb36 {
58215b ¤   LRadioButton¤   ¤   ¤   *buttonObj;
a2b9b5 ¤   CGADurationEditField¤   *durationObj;
c70df2 ¤   LLittleArrows¤  ¤   ¤   *arrowsObj;
ff3345 ¤   UInt32¤ ¤   ¤   ¤   ¤   timeNow;
b11b52 ¤   ¤
d08484 ¤   durationObj = (CGADurationEditField *)
123772 ¤   ¤   ¤   ¤   ¤   FindPaneByID( kDateDurationFieldID );
078b49 ¤   durationObj->SetDurationType(kDateDurationType);
21a043 ¤   arrowsObj = (LLittleArrows *) FindPaneByID(kDateArrowsID);
f0ab92 ¤   mLastArrowValue = arrowsObj->GetValue();
050197 ¤   arrowsObj->AddListener(this);
cdaf5a
7000fd ¤   GetDateTime(&timeNow);
8e9840 ¤   timeNow += days * 86400;
c1012b ¤   durationObj->SetDurationValue( timeNow );
d767c5 ¤
489c6e ¤   if( days == 0 )
c7c7a1 ¤   {
4ea1e5 ¤   ¤   buttonObj = (LRadioButton *) FindPaneByID( kNeverButtonPaneID );
311b52 ¤   ¤
f12dd3 ¤   ¤   buttonObj->SetValue( 1 );
369371 ¤   }
4d0e24 ¤   else
fb58c8 ¤   {¤  ¤
9e81eb ¤   ¤   buttonObj = (LRadioButton *) FindPaneByID( kDaysButtonPaneID );
311b52 ¤   ¤
6c2dd3 ¤   ¤   buttonObj->SetValue( 1 );
f39371 ¤   }
edefe6 }
efaf5a
9c7e69 ¤   Boolean
319bbc CKeyExpirationView::GetExpiration(UInt32 *expirationDays)
07bb36 {
8e7254 ¤   LRadioButton¤   *buttonObj;
0beddc ¤   Boolean¤¤   ¤   validExpiration;
9fbda9 ¤   UInt32¤ ¤   ¤   expireDate,
a6bc70 ¤   ¤   ¤   ¤   ¤   timeNow;
1c67c5 ¤
5aa180 ¤   validExpiration = true;
ff67c5 ¤
39a693 ¤   buttonObj = (LRadioButton *) FindPaneByID( kNeverButtonPaneID );
8567c5 ¤
d79d09 ¤   if( buttonObj->GetValue() > 0 )
dec7a1 ¤   {
917f28 ¤   ¤   *expirationDays = 0;
4a9371 ¤   }
490e24 ¤   else
bac7a1 ¤   {
298070 ¤   ¤   CGADurationEditField¤   *durationObj;
ab87c7 ¤   ¤   ¤
d7151c ¤   ¤   durationObj = (CGADurationEditField *)
7dd572 ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID( kDateDurationFieldID );
8467c5 ¤
1246a5 ¤   ¤   expireDate = durationObj->GetDurationValue();
4b14d5 ¤   ¤   GetDateTime(&timeNow);
be7607 ¤   ¤   *expirationDays = ((expireDate - timeNow) / 86400) + 1;
0d78d9 ¤   ¤   if( *expirationDays < 1 || *expirationDays > kMaxKeyExpirationDays )
f65b34 ¤   ¤   {
8330ef ¤   ¤   ¤   validExpiration = false;
180fe4 ¤   ¤   }
a59371 ¤   }
3a67c5 ¤
647749 ¤   return( validExpiration );
--25e8 000e9e83934401201af Page 9 of CKeyGenWizardDialog.cp
7aefe6 }
46af5a
746d52 ¤   void
bc0da9 CKeyExpirationView::ListenToMessage(MessageT inMessage, void *ioParam)
55bb36 {
7dfea8 ¤   Int32¤  ¤   ¤   ¤   ¤   newValue;
b4b9b5 ¤   CGADurationEditField¤   *durationObj;
8567c5 ¤
f7769e ¤   switch( inMessage )
e2c7a1 ¤   {
2c2719 ¤   ¤   case kDateArrowsID:
4bcdae ¤   ¤   ¤   durationObj = (CGADurationEditField *)
bc696b ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID( kDateDurationFieldID );
3b0e9f ¤   ¤   ¤   newValue = *(Int32 *)ioParam;
ea5914 ¤   ¤   ¤   if(newValue < mLastArrowValue)
fa4cb8 ¤   ¤   ¤   ¤   durationObj->AdjustValue(kDownAdjust);
8cbb8c ¤   ¤   ¤   else
f8a5c1 ¤   ¤   ¤   ¤   durationObj->AdjustValue(kUpAdjust);
ae8d3d ¤   ¤   ¤   mLastArrowValue = newValue;
9dcdcb ¤   ¤   ¤   break;
599371 ¤   }
d2efe6 }
5baf5a
02fc4c #pragma mark --- CMRKView ---
74af5a
53d9b0 class CMRKView ¤¤   :¤  ¤   public CKeyGenWizardView
37bb36 {
5b5ed4 public:
e0af5a
f79852 ¤   enum { class_ID = 'vKMR' };
9067c5 ¤
78bebd ¤   ¤   ¤   ¤   ¤   CMRKView(LStream *inStream);
3a73a1 ¤   virtual¤¤   ¤   ~CMRKView();
5caf5a
cdfa40 ¤   void¤   ¤   ¤   SetMRK(PGPKeyRef mrkKey);
3667c5 ¤
480fb9 private:
c1af5a
e62f4b ¤   enum
8ac7a1 ¤   {
f9d09b ¤   ¤   kMRKPaneID¤ ¤   ¤   ¤   = 'cMRK'
7562bd ¤   };
dc82f7 };
1baf5a
d9dc0c CMRKView::CMRKView(LStream *inStream)
c12e00 ¤   : CKeyGenWizardView(inStream)
91bb36 {
a6efe6 }
6baf5a
c79e2b CMRKView::~CMRKView(void)
15bb36 {
0befe6 }
71af5a
1e6d52 ¤   void
c407d6 CMRKView::SetMRK(PGPKeyRef mrkKey)
3bbb36 {
4cfb19 ¤   PGPError¤   ¤   err;
826e14 ¤   Str255¤ ¤   ¤   str;
b4de55 ¤   PGPSize¤¤   ¤   len;
25af5a
1af2a6 ¤   err = PGPGetPrimaryUserIDNameBuffer(mrkKey,
17f5f7 ¤   ¤   sizeof(str) - 1, (char *)&str[1], &len);
84dd44 ¤   pgpAssertNoErr(err);
f75192 ¤   str[0] = len;
5c2803 ¤   ((LStaticText *)FindPaneByID(kMRKPaneID))->SetDescriptor(str);
46efe6 }
4faf5a
7ff416 #pragma mark --- CCorpView ---
8caf5a
e08247 class CCorpView ¤   ¤   :¤  ¤   public CKeyGenWizardView
22bb36 {
e95ed4 public:
--a194 00017cecbd3401201af Page 10 of CKeyGenWizardDialog.cp
e0af5a
4f64b6 ¤   enum { class_ID = 'vCor' };
8c67c5 ¤
bdb2f4 ¤   ¤   ¤   ¤   ¤   CCorpView(LStream *inStream);
c561d1 ¤   virtual¤¤   ¤   ~CCorpView();
23af5a
e43eab ¤   void¤   ¤   ¤   SetCorpKey(PGPKeyRef corpKey);
ea67c5 ¤
9f0fb9 private:
5faf5a
df2f4b ¤   enum
fbc7a1 ¤   {
483b46 ¤   ¤   kCorpPaneID¤¤   ¤   ¤   = 'cCor'
3562bd ¤   };
e782f7 };
0daf5a
fcca46 CCorpView::CCorpView(LStream *inStream)
b52e00 ¤   : CKeyGenWizardView(inStream)
6abb36 {
3befe6 }
51af5a
2bf608 CCorpView::~CCorpView(void)
59bb36 {
b1efe6 }
90af5a
e16d52 ¤   void
0dea54 CCorpView::SetCorpKey(PGPKeyRef corpKey)
f6bb36 {
79fb19 ¤   PGPError¤   ¤   err;
9f6e14 ¤   Str255¤ ¤   ¤   str;
1bde55 ¤   PGPSize¤¤   ¤   len;
53af5a
3ed3e0 ¤   err = PGPGetPrimaryUserIDNameBuffer(corpKey,
6bc9df ¤   ¤   ¤   ¤   sizeof(str) - 1, (char *)&str[1], &len);
8bdd44 ¤   pgpAssertNoErr(err);
e85192 ¤   str[0] = len;
5a74da ¤   ((LStaticText *)FindPaneByID(kCorpPaneID))->SetDescriptor(str);
54efe6 }
1daf5a
971dc7 #pragma mark --- CRevokerView ---
daaf5a
03381f class CRevokerView ¤¤   :¤  ¤   public CKeyGenWizardView
7dbb36 {
2f5ed4 public:
e6af5a
3064b6 ¤   enum { class_ID = 'vCor' };
d567c5 ¤
e3ee7d ¤   ¤   ¤   ¤   ¤   CRevokerView(LStream *inStream);
640fa6 ¤   virtual¤¤   ¤   ~CRevokerView();
a6af5a
9d6230 ¤   void¤   ¤   ¤   SetRevokerKey(PGPKeyRef corpKey);
7f67c5 ¤
620fb9 private:
20af5a
3f2f4b ¤   enum
7cc7a1 ¤   {
5fea6c ¤   ¤   kRevokerPaneID¤ ¤   ¤   ¤   = 'cRev'
0c62bd ¤   };
1d82f7 };
a7af5a
c8120e CRevokerView::CRevokerView(LStream *inStream)
cc2e00 ¤   : CKeyGenWizardView(inStream)
87bb36 {
b4efe6 }
0caf5a
10b210 CRevokerView::~CRevokerView(void)
0fbb36 {
f2efe6 }
8daf5a
776d52 ¤   void
a9eec1 CRevokerView::SetRevokerKey(PGPKeyRef revokerKey)
17bb36 {
--f136 0002deb7622401201af Page 11 of CKeyGenWizardDialog.cp
9dfb19 ¤   PGPError¤   ¤   err;
156e14 ¤   Str255¤ ¤   ¤   str;
1dde55 ¤   PGPSize¤¤   ¤   len;
26af5a
f63a7f ¤   err = PGPGetPrimaryUserIDNameBuffer(revokerKey,
57c9df ¤   ¤   ¤   ¤   sizeof(str) - 1, (char *)&str[1], &len);
a4dd44 ¤   pgpAssertNoErr(err);
645192 ¤   str[0] = len;
4f4064 ¤   ((LStaticText *)FindPaneByID(kRevokerPaneID))->SetDescriptor(str);
6eefe6 }
9eaf5a
a3f7c4 #pragma mark --- CSendToServerView ---
9aaf5a
f23553 class CSendToServerView ¤   :¤  ¤   public CKeyGenWizardView
efbb36 {
9c5ed4 public:
4aaf5a
507dce ¤   enum { class_ID = 'vStS' };
f867c5 ¤
6f7757 ¤   ¤   ¤   ¤   ¤   CSendToServerView(LStream *inStream);
b27d01 ¤   virtual¤¤   ¤   ~CSendToServerView();
3a67c5 ¤
4c1936 ¤   void¤   ¤   ¤   DoSendToServer(PGPKeyRef¤   generatedKey);
45af5a
120fb9 private:
c72f4b ¤   enum
15c7a1 ¤   {
cc107a ¤   ¤   kSendToServerBoxPaneID¤ ¤   = 'xSnd'
fa62bd ¤   };
ec82f7 };
d0af5a
679bac CSendToServerView::CSendToServerView(LStream *inStream)
322e00 ¤   : CKeyGenWizardView(inStream)
69bb36 {
0defe6 }
15af5a
d3b36f CSendToServerView::~CSendToServerView(void)
2fbb36 {
76efe6 }
2daf5a
f86d52 ¤   void
5a0c41 CSendToServerView::DoSendToServer(PGPKeyRef¤generatedKey)
22bb36 {
ee9e0d ¤   LCheckBox¤  *checkboxObj;
d2af5a
7ed969 ¤   checkboxObj = (LCheckBox *) FindPaneByID( kSendToServerBoxPaneID );
4967c5 ¤
87f59a ¤   if(checkboxObj->GetValue() && PGPKeyRefIsValid(generatedKey))
8cc7a1 ¤   {
753404 ¤   ¤   PGPError¤   ¤   ¤   err;
74b2c9 ¤   ¤   PGPKeyServerEntry¤  rootServer;
3f1b52 ¤   ¤
8c43fe ¤   ¤   err = PGPGetRootKeyServer( gPrefRef, &rootServer );
5986f8 ¤   ¤   if( IsntPGPError( err ) )
28c67e ¤   ¤   ¤   err = PGPSendKeyToServer( gPGPContext, gTLSContext,
3c3cff ¤   ¤   ¤   ¤   ¤   generatedKey, &rootServer );
ba086a ¤   ¤   if( IsPGPError(err) && (err != kPGPError_UserAbort) )
b33c4c ¤   ¤   ¤   ReportPGPError(err);
529371 ¤   }
59efe6 }
d4af5a
5b8ba8 #pragma mark --- CBadPassphraseView ---
8caf5a
6130f0 class CBadPassphraseView ¤  :¤  ¤   public CKeyGenWizardView
91bb36 {
015ed4 public:
9caf5a
044109 ¤   enum { class_ID = 'vBPh' };
be67c5 ¤
ca80cd ¤   ¤   ¤   ¤   ¤   CBadPassphraseView(LStream *inStream);
fa96e1 ¤   virtual¤¤   ¤   ~CBadPassphraseView();
2d67c5 ¤
--df01 000ddca874d401201af Page 12 of CKeyGenWizardDialog.cp
95da08 ¤   void¤   ¤   ¤   SetPassphrase(¤ ConstStr255Param passphrase,
e71cd0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param confirmation);
99af5a
cc0fb9 private:
db2f4b ¤   enum
76c7a1 ¤   {
c8efdd ¤   ¤   kConfirmationBoxPaneID¤ ¤   = 'bCon',
1e2c0c ¤   ¤   kMinLengthBoxPaneID¤¤   ¤   = 'bMLe',
dfb4a8 ¤   ¤   kMinQualityBoxPaneID¤   ¤   = 'bMQu',
3fe858 ¤   ¤   kMinLengthCaption1PaneID¤   = 'cML1',
db9421 ¤   ¤   kMinLengthCaption2PaneID¤   = 'cML2',
00bff6 ¤   ¤   kMinLengthCaption3PaneID¤   = 'cML3',
fcac11 ¤   ¤   kMinQualityCaptionPaneID¤   = 'cPQ1',
61d38e ¤   ¤   kMinQualityBarPaneID¤   ¤   = 'cPQ2',
a5914f ¤   ¤   kBadConfirmPaneID¤  ¤   ¤   = 'cCP1'
0d62bd ¤   };
5e82f7 };
c9af5a
e2a217 CBadPassphraseView::CBadPassphraseView(LStream *inStream)
3a2e00 ¤   : CKeyGenWizardView(inStream)
2dbb36 {
b4efe6 }
39af5a
6f641d CBadPassphraseView::~CBadPassphraseView(void)
9ebb36 {
dfefe6 }
84af5a
d56d52 ¤   void
6e00f7 CBadPassphraseView::SetPassphrase(
7704cf ¤   ConstStr255Param passphrase,
158c4b ¤   ConstStr255Param confirmation)
9abb36 {
4a48e6 ¤   Boolean¤¤   match,
365535 ¤   ¤   ¤   ¤   enforceLength,
ff5952 ¤   ¤   ¤   ¤   goodLength,
b8cafe ¤   ¤   ¤   ¤   goodQuality;
a067c5 ¤
675fdf ¤   CKeyGenWizardDialog::IsGoodPassphrase(
c3a0a3 ¤   ¤   passphrase, confirmation, match,
39360e ¤   ¤   enforceLength, goodLength, goodQuality);
142fef ¤   if(match)
2abee9 ¤   ¤   ((LTextGroupBox *)FindPaneByID(kConfirmationBoxPaneID))->Hide();
cf7b5d ¤   if(goodLength)
10557c ¤   ¤   ((LTextGroupBox *)FindPaneByID(kMinLengthBoxPaneID))->Hide();
cf0e24 ¤   else
80c7a1 ¤   {
1b3105 ¤   ¤   Str255¤ ¤   lengthString;
287c4d ¤   ¤   PGPUInt32¤  minLength;
e3af5a
ca8dda ¤   ¤   minLength = kRecommendedMinPassLength;
80be29 #if PGP_BUSINESS_SECURITY
949028 ¤   ¤   if(enforceLength)
3a5b34 ¤   ¤   {
8ce46c ¤   ¤   ¤   PGPError¤   err;
ce87c7 ¤   ¤   ¤
08d29c ¤   ¤   ¤   err = PGPGetPrefNumber(
f4df32 ¤   ¤   ¤   ¤   ¤   gAdminPrefRef, kPGPPrefMinChars, &minLength);
d7524f ¤   ¤   ¤   pgpAssertNoErr(err);
4e0fe4 ¤   ¤   }
d77454 #endif
80f29e ¤   ¤   ::NumToString(minLength, lengthString);
c98325 ¤   ¤   ((LStaticText *)FindPaneByID(kMinLengthCaption2PaneID))->
4c8776 ¤   ¤   ¤   SetDescriptor(lengthString);
f69371 ¤   }
baadb7 ¤   if(goodQuality)
4fa058 ¤   ¤   ((LTextGroupBox *)FindPaneByID(kMinQualityBoxPaneID))->Hide();
0a0e24 ¤   else
a5c7a1 ¤   {
c4be29 #if PGP_BUSINESS_SECURITY
2a2b3d ¤   ¤   PGPUInt32¤  minQuality;
1dd031 ¤   ¤   PGPError¤   err;
dd1b52 ¤   ¤
--0b84 0000ba381d9401201af Page 13 of CKeyGenWizardDialog.cp
a85960 ¤   ¤   err = PGPGetPrefNumber(
2d7089 ¤   ¤   ¤   ¤   gAdminPrefRef, kPGPPrefMinQuality, &minQuality);
e6e919 ¤   ¤   pgpAssertNoErr(err);
0e4184 ¤   ¤   if(IsntPGPError(err))
955b34 ¤   ¤   {
902658 ¤   ¤   ¤   ((LProgressBar *)FindPaneByID(kMinQualityBarPaneID))->
772a70 ¤   ¤   ¤   ¤   SetValue(minQuality);
f70fe4 ¤   ¤   }
157454 #endif
c99371 ¤   }
29efe6 }
71af5a
5770ae #pragma mark --- CKeyPassphraseView ---
f3af5a
80e7c1 class CKeyPassphraseView : ·public CKeyGenWizardView,
072717 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener
29bb36 {
4a5ed4 public:
70af5a
b30b82 ¤   enum { class_ID = 'vKPP' };
db67c5 ¤
887e68 ¤   ¤   ¤   ¤   ¤   CKeyPassphraseView(LStream *inStream);
417fdd ¤   virtual¤¤   ¤   ~CKeyPassphraseView();
d3af5a
aa97ff ¤   void¤   ¤   ¤   ClearPassphrase(void);
40cd88 ¤   void¤   ¤   ¤   GetPassphrase(¤ StringPtr¤  passphrase,
658423 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   StringPtr¤  confirmation);
0d67c5 ¤
6fa2d3 protected:
5baf5a
7190d4 ¤   virtual¤void¤   FinishCreateSelf(void);
b1f559 ¤   virtual¤void¤   ListenToMessage(MessageT inMessage, void *ioParam);
8767c5 ¤
690fb9 private:
17af5a
7b2f4b ¤   enum
38c7a1 ¤   {
24deaf ¤   ¤   kPassphraseEditFieldPaneID¤ ¤   = 'ePas',
b53369 ¤   ¤   kConfirmationEditFieldPaneID¤   = 'eCon',
388e32 ¤   ¤   kPassphraseQualityBarPaneID¤¤   = 'pbPQ',
efb7ae ¤   ¤   kHideTypingCheckboxPaneID¤  ¤   = 'xHid',
91d316 ¤   ¤   kRecommendedQualityBarPaneID¤   = 'pbRQ',
26b931 ¤   ¤   kRecommendedQualityCaptionPaneID= 'cRQ1',
e85dbe ¤   ¤   kMinPassphraseLenCaptionPaneID¤ = 'cMin'
b762bd ¤   };
3aaf5a
78265f ¤   CPassphraseEdit¤*mPassphraseEditField;
5f0174 ¤   CPassphraseEdit¤*mConfirmationEditField;
074369 ¤   LProgressBar¤   *mPassQualityProgressBar;
d604e9 ¤   LCheckBox¤  ¤   *mHideTypingCheckbox;
ce82f7 };
34af5a
4aaee7 CKeyPassphraseView::CKeyPassphraseView(LStream *inStream)
0c2e00 ¤   : CKeyGenWizardView(inStream)
b5bb36 {
a9efe6 }
7eaf5a
9695ad CKeyPassphraseView::~CKeyPassphraseView(void)
b0bb36 {
3eefe6 }
7baf5a
686d52 ¤   void
0903af CKeyPassphraseView::GetPassphrase(
866db9 ¤   StringPtr¤  passphrase,
71d698 ¤   StringPtr¤  confirmation)
f5bb36 {
af8c59 ¤   mPassphraseEditField->GetDescriptor( passphrase );
e50fea ¤   mConfirmationEditField->GetDescriptor( confirmation );
22efe6 }
d4af5a
136d52 ¤   void
0bd0aa CKeyPassphraseView::ClearPassphrase(void)
--ac76 000ee3a7b3b401201af Page 14 of CKeyGenWizardDialog.cp
2cbb36 {
528fb0 ¤   mPassphraseEditField->ClearPassphrase();
49ebc0 ¤   mConfirmationEditField->ClearPassphrase();
cdc019 ¤   mPassQualityProgressBar->SetValue( 0 );
b967c5 ¤
bb740c ¤   SwitchTarget( mPassphraseEditField );
c3efe6 }
1eaf5a
be6d52 ¤   void
1015f1 CKeyPassphraseView::FinishCreateSelf(void)
e7cebb {¤
cb8c2d ¤   PGPUInt32¤  minLength = kRecommendedMinPassLength;
a0060d ¤   Str255¤ ¤   lengthString;
fc67c5 ¤
51394c ¤   CKeyGenWizardView::FinishCreateSelf();
ac67c5 ¤
138d98 ¤   mPassphraseEditField ¤  = (CPassphraseEdit *)
9f0b6b ¤   ¤   FindPaneByID( kPassphraseEditFieldPaneID );
8056ea ¤   mConfirmationEditField ¤= (CPassphraseEdit *)
7b23b3 ¤   ¤   FindPaneByID( kConfirmationEditFieldPaneID );
847e02 ¤   mPassQualityProgressBar = (LProgressBar *)
8bc032 ¤   ¤   FindPaneByID( kPassphraseQualityBarPaneID );
2725d7 ¤   mHideTypingCheckbox ¤   = (LCheckBox *)
1a9d59 ¤   ¤   FindPaneByID( kHideTypingCheckboxPaneID );
8baf5a
163ba7 ¤   pgpAssertAddrValid( mPassphraseEditField, VoidAlign );
b55e58 ¤   pgpAssertAddrValid( mConfirmationEditField, VoidAlign );
001182 ¤   pgpAssertAddrValid( mPassQualityProgressBar, VoidAlign );
31af5a
2a6681 ¤   mPassphraseEditField->AddListener(this);
81eba8 ¤   mHideTypingCheckbox->AddListener( this );
bb67c5 ¤
dfbe29 #if PGP_BUSINESS_SECURITY
4bc7a1 ¤   {
ff5608 ¤   ¤   PGPBoolean¤ enforceMinQuality,
bc1e67 ¤   ¤   ¤   ¤   ¤   enforceMinLength;
5e2b3d ¤   ¤   PGPUInt32¤  minQuality;
31d031 ¤   ¤   PGPError¤   err;
9b1b52 ¤   ¤
c9d9d8 ¤   ¤   err = PGPGetPrefBoolean(
c58570 ¤   ¤   ¤   ¤   gAdminPrefRef, kPGPPrefEnforceMinQuality, &enforceMinQuality);
f6e919 ¤   ¤   pgpAssertNoErr(err);
35e73f ¤   ¤   if(IsntPGPError(err) && enforceMinQuality)
e45b34 ¤   ¤   {
cfd29c ¤   ¤   ¤   err = PGPGetPrefNumber(
38facc ¤   ¤   ¤   ¤   ¤   gAdminPrefRef, kPGPPrefMinQuality, &minQuality);
28524f ¤   ¤   ¤   pgpAssertNoErr(err);
52768c ¤   ¤   ¤   if(IsntPGPError(err))
58f776 ¤   ¤   ¤   {
86d274 ¤   ¤   ¤   ¤   LProgressBar¤   *recQualityBar;
fc2b85 ¤   ¤   ¤   ¤
40b253 ¤   ¤   ¤   ¤   ((LStaticText *)FindPaneByID(kRecommendedQualityCaptionPaneID))¶
ea7fac ->
51618b ¤   ¤   ¤   ¤   ¤   Show();
bf0235 ¤   ¤   ¤   ¤   recQualityBar =
1f2502 ¤   ¤   ¤   ¤   ¤   (LProgressBar *)FindPaneByID(kRecommendedQualityBarPaneID);
cd7220 ¤   ¤   ¤   ¤   recQualityBar->Show();
b10d85 ¤   ¤   ¤   ¤   recQualityBar->SetValue(minQuality);
eca3a6 ¤   ¤   ¤   }
4a0fe4 ¤   ¤   }
12d9d8 ¤   ¤   err = PGPGetPrefBoolean(
c6e4d8 ¤   ¤   ¤   ¤   gAdminPrefRef, kPGPPrefEnforceMinChars, &enforceMinLength);
f0e919 ¤   ¤   pgpAssertNoErr(err);
0fb795 ¤   ¤   if(IsntPGPError(err) && enforceMinLength)
4c5b34 ¤   ¤   {
fed29c ¤   ¤   ¤   err = PGPGetPrefNumber(
72df32 ¤   ¤   ¤   ¤   ¤   gAdminPrefRef, kPGPPrefMinChars, &minLength);
68524f ¤   ¤   ¤   pgpAssertNoErr(err);
cb0fe4 ¤   ¤   }
759371 ¤   }
237454 #endif
eeeace ¤   ::NumToString(minLength, lengthString);
--6c76 000dcab1453401201af Page 15 of CKeyGenWizardDialog.cp
5df348 ¤   ((LStaticText *)FindPaneByID(kMinPassphraseLenCaptionPaneID))->
df829b ¤   ¤   SetDescriptor(lengthString);
e850ad ¤   SwitchTarget( mPassphraseEditField );¤
78efe6 }
18af5a
7a6d52 ¤   void
42b3f8 CKeyPassphraseView::ListenToMessage(MessageT inMessage, void *ioParam)
0bbb36 {
d7769e ¤   switch( inMessage )
12c7a1 ¤   {
b0261a ¤   ¤   case kPassphraseEditFieldPaneID:
325b34 ¤   ¤   {
50e308 ¤   ¤   ¤   CSecureCString256¤  passphrase;
30828d ¤   ¤   ¤   PGPUInt16¤  ¤   ¤   quality;
7587c7 ¤   ¤   ¤
579ae5 ¤   ¤   ¤   mPassphraseEditField->GetDescriptor( (uchar *) passphrase.mString );
18f16a ¤   ¤   ¤   PToCString( (uchar *) passphrase.mString, passphrase.mString );
6487c7 ¤   ¤   ¤
7920b2 ¤   ¤   ¤   quality = PGPEstimatePassphraseQuality( passphrase );
0e4d1d ¤   ¤   ¤   mPassQualityProgressBar->SetValue( quality );
98cdcb ¤   ¤   ¤   break;
8b0fe4 ¤   ¤   }
6caf5a
623da3 ¤   ¤   case kHideTypingCheckboxPaneID:
bf5b34 ¤   ¤   {
63348f ¤   ¤   ¤   Boolean¤hide;
4e87c7 ¤   ¤   ¤
9d44d5 ¤   ¤   ¤   hide = ( mHideTypingCheckbox->GetValue() == 1 );
e787c7 ¤   ¤   ¤
168157 ¤   ¤   ¤   mPassphraseEditField->SetHideTyping( hide );
74970a ¤   ¤   ¤   mConfirmationEditField->SetHideTyping( hide );
d287c7 ¤   ¤   ¤
00cdcb ¤   ¤   ¤   break;
ad0fe4 ¤   ¤   }
349371 ¤   }
70efe6 }
37af5a
0f5eaa #pragma mark --- CGetRandomDataView ---
75af5a
19df9d class CGetRandomDataView : ·public CKeyGenWizardView,
a7619d ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster,
244c44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LPeriodical
53bb36 {
735ed4 public:
9caf5a
0a5547 ¤   enum { class_ID = 'vGRD' };
4d67c5 ¤
4cf2ae ¤   ¤   ¤   ¤   ¤   ¤   CGetRandomDataView(LStream *inStream);
323df7 ¤   virtual¤¤   ¤   ¤   ~CGetRandomDataView();
9baf5a
6962cd ¤   virtual¤Boolean¤¤   HandleKeyPress(const EventRecord& inKeyEvent);
4a9cd8 ¤   void¤   ¤   ¤   ¤   SetParams(
2a6336 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPPublicKeyAlgorithm¤  algorithm,
2b77d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32¤ ¤   ¤   ¤   ¤   encryptKeySize,
b72817 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32¤ ¤   ¤   ¤   ¤   signingKeySize);
3bcc99 ¤   virtual¤void¤   ¤   SpendTime(const EventRecord &inMacEvent);
e4af5a
d2a2d3 protected:
82af5a
abd5cd ¤   virtual¤void¤   ¤   FinishCreateSelf(void);
43af5a
280fb9 private:
9caf5a
ca164e ¤   SInt32¤ ¤   ¤   mNeededEntropy;
2ff445 ¤   SInt32¤ ¤   ¤   mStartEntropy;
733605 ¤   Boolean¤¤   ¤   mCollectingData;
21c36e ¤   UInt32¤ ¤   ¤   mEncryptKeySize;
42e692 ¤   UInt32¤ ¤   ¤   mAlgorithm;
e75599 ¤   LProgressBar¤   *mProgressBar;
14ec18 ¤   UInt32¤ ¤   ¤   mEntropyCollected;
1e8465 ¤   Point¤  ¤   ¤   mLastMouseLoc;
dc67c5 ¤
--7ffa 0001cac0354401201af Page 16 of CKeyGenWizardDialog.cp
602f4b ¤   enum
66c7a1 ¤   {
07fd04 ¤   ¤   kMinimumUserEntropy = 300,
2a1b52 ¤   ¤
74e576 ¤   ¤   kProgressBarPaneID¤ = 'bPrg'
f962bd ¤   };
1082f7 };
3baf5a
61ef14 CGetRandomDataView::CGetRandomDataView(LStream *inStream)
f42e00 ¤   : CKeyGenWizardView(inStream)
c5bb36 {
fdfc52 ¤   mCollectingData ¤   = true;
902e94 ¤   mEntropyCollected¤  = 0;
b6efe6 }
e0af5a
34955b CGetRandomDataView::~CGetRandomDataView()
14bb36 {
0aefe6 }
3caf5a
366d52 ¤   void
fa4101 CGetRandomDataView::FinishCreateSelf(void)
46bb36 {
c5394c ¤   CKeyGenWizardView::FinishCreateSelf();
de67c5 ¤
bcb380 ¤   mProgressBar = (LProgressBar *) FindPaneByID( kProgressBarPaneID );
5ff066 ¤   StartRepeating();
6faf5a
2e6229 ¤   SwitchTarget( this );
2e68d2 ¤   StartIdling();
b5efe6 }
e2af5a
686d52 ¤   void
873eee CGetRandomDataView::SpendTime(const EventRecord &inMacEvent)
c0bb36 {
93303e ¤   if( mCollectingData )
48c7a1 ¤   {
9b35d8 ¤   ¤   PGPUInt32¤  curEntropy;¤¤
8b727d ¤   ¤   GrafPtr¤¤   savePort;
21dde1 ¤   ¤   GrafPtr¤¤   wMgrPort;
6ef085 ¤   ¤   Point¤  ¤   mouseLoc;
3de398 ¤   ¤   UInt32¤ ¤   complete;
b4af5a
4ca88a ¤   ¤   ::GetPort(&savePort);
a0b935 ¤   ¤   ::GetWMgrPort(&wMgrPort);¤
961b52 ¤   ¤
7cc8dd ¤   ¤   ::SetPort(wMgrPort);
72183e ¤   ¤   ::GetMouse(&mouseLoc);
e69697 ¤   ¤   ::SetPort(savePort);
931b52 ¤   ¤
566059 ¤   ¤   if((mouseLoc.v != mLastMouseLoc.v) ||
bd9125 ¤   ¤   ¤   (mouseLoc.h != mLastMouseLoc.h))
745b34 ¤   ¤   {
c6e16e ¤   ¤   ¤   mEntropyCollected +=
7cd402 ¤   ¤   ¤   ¤   PGPGlobalRandomPoolAddMouse(mouseLoc.h, mouseLoc.v);
745fda ¤   ¤   ¤   mLastMouseLoc = mouseLoc;
d70fe4 ¤   ¤   }
c5af5a
0e4b9e ¤   ¤   curEntropy = PGPGlobalRandomPoolGetEntropy();
82c8b1 ¤   ¤   if( curEntropy >= PGPGlobalRandomPoolGetSize() )
685b34 ¤   ¤   {
59c202 ¤   ¤   ¤   // Collect extra random bits even if the pool is full
44fce1 ¤   ¤   ¤   if(mStartEntropy + mEntropyCollected > curEntropy)
effd3e ¤   ¤   ¤   ¤   curEntropy = mStartEntropy + mEntropyCollected;
320fe4 ¤   ¤   }
a61b52 ¤   ¤
efe98b ¤   ¤   complete = ( curEntropy - mStartEntropy ) *
ae49a6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   100 / ( mNeededEntropy - mStartEntropy );
05fa9d ¤   ¤   if(complete > 100)
b9ab90 ¤   ¤   ¤   complete = 100;
c6f350 ¤   ¤   mProgressBar->SetValue(complete);
62af5a
1cff7c ¤   ¤   if( curEntropy >= mNeededEntropy )
--359d 000bc3e2e2d401201af Page 17 of CKeyGenWizardDialog.cp
e35b34 ¤   ¤   {
e6096d ¤   ¤   ¤   mProgressBar->SetValue( 100 );
19ebd7 ¤   ¤   ¤   mCollectingData = false;
ad87c7 ¤   ¤   ¤
e2d048 ¤   ¤   ¤   BroadcastMessage( kAllowViewSwitchMessage, nil );
ec0fe4 ¤   ¤   }
9b9371 ¤   }
0aefe6 }
21af5a
c07e69 ¤   Boolean
af2f91 CGetRandomDataView::HandleKeyPress(const EventRecord &inKeyEvent)
dcbb36 {
5adc13 ¤   Boolean¤keyHandled;
73e920 ¤   Char16¤ theChar = inKeyEvent.message & charCodeMask;
c967c5 ¤
bd303e ¤   if( mCollectingData )
392ef1 ¤   {¤
6b5bfd ¤   ¤   mEntropyCollected += PGPGlobalRandomPoolAddKeystroke(theChar);
f135b5 ¤   ¤   keyHandled = true;
219371 ¤   }
080e24 ¤   else
29c7a1 ¤   {
5b3e47 ¤   ¤   keyHandled = CKeyGenWizardView::HandleKeyPress( inKeyEvent );
b49371 ¤   }
34af5a
afc022 ¤   return keyHandled;
feefe6 }
b3af5a
bf6d52 ¤   void
5bb7ff CGetRandomDataView::SetParams(
cd32ae ¤   PGPPublicKeyAlgorithm¤  algorithm,
0ada4b ¤   UInt32¤ ¤   ¤   ¤   ¤   encryptKeySize,
05d021 ¤   UInt32¤ ¤   ¤   ¤   ¤   signingKeySize)
eabb36 {
e961e0 ¤   PGPError¤   err;
4dc512 ¤   PGPBoolean¤ fastGen;
8367c5 ¤
dee2ba ¤   err = PGPGetPrefBoolean(gPrefRef, kPGPPrefFastKeyGen, &fastGen);
ccdd44 ¤   pgpAssertNoErr(err);
fa2c6b ¤   mStartEntropy = PGPGlobalRandomPoolGetEntropy();
4667c5 ¤
0fa86a ¤   mNeededEntropy = PGPGetKeyEntropyNeeded(
577cdf ¤   ¤   ¤   gPGPContext,
d433a4 ¤   ¤   ¤   PGPOKeyGenParams(gPGPContext, algorithm, signingKeySize),
e9809e ¤   ¤   ¤   PGPOKeyGenFast(gPGPContext, fastGen),
2604cc ¤   ¤   ¤   PGPOLastOption(gPGPContext));
aa7adc ¤   if( algorithm == kPGPPublicKeyAlgorithm_DSA )
e1c7a1 ¤   {
9b6d14 ¤   ¤   mNeededEntropy += PGPGetKeyEntropyNeeded(
857cdf ¤   ¤   ¤   gPGPContext,
0de921 ¤   ¤   ¤   PGPOKeyGenParams(gPGPContext,
f67b1d ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPublicKeyAlgorithm_ElGamal, encryptKeySize),
e3809e ¤   ¤   ¤   PGPOKeyGenFast(gPGPContext, fastGen),
f104cc ¤   ¤   ¤   PGPOLastOption(gPGPContext));
bb9371 ¤   }
9a67c5 ¤
b2f215 ¤   // Force collection of some data.
f3d1b6 ¤   if( mNeededEntropy - mStartEntropy < (SInt32) kMinimumUserEntropy )
bca444 ¤   ¤   mNeededEntropy = mStartEntropy + kMinimumUserEntropy;
baaf5a
6aed24 ¤   mNeededEntropy = min( mNeededEntropy, PGPGlobalRandomPoolGetSize() );
f2efe6 }
99af5a
ae410d #pragma mark --- CGeneratingKeyView ---
ccaf5a
bff626 class CGeneratingKeyView : public CKeyGenWizardView
1fbb36 {
9e5ed4 public:
45af5a
61e87b ¤   enum { class_ID = 'vGen' };
b067c5 ¤
bc2b71 ¤   ¤   ¤   ¤   CGeneratingKeyView(LStream *inStream);
--6d5e 000361d4a9a401201af Page 18 of CKeyGenWizardDialog.cp
887a02 ¤   virtual¤¤   ~CGeneratingKeyView();
7eaf5a
2582f7 };
21af5a
431279 CGeneratingKeyView::CGeneratingKeyView(LStream *inStream)
312e00 ¤   : CKeyGenWizardView(inStream)
adbb36 {
61efe6 }
39af5a
da8c35 CGeneratingKeyView::~CGeneratingKeyView()
e6bb36 {
7cefe6 }
94af5a
da7ff2 #pragma mark --- CKeyGenWizardDialog ---
00af5a
7d33ce CKeyGenWizardDialog::CKeyGenWizardDialog(LStream *inStream)
211fb6 ¤   : LGADialog(inStream)
7cbb36 {
553a25 ¤   mCurrentView ¤  ¤   = kViewInvalid;
baa219 ¤   mFinished¤  ¤   ¤   = false;
d5017b ¤   mGeneratedKey¤  ¤   = kInvalidPGPKeyRef;
d0a068 ¤   mCurrentViewObj¤¤   = nil;
b1fbbe ¤   mEmailAddress[0]¤   = 0;
c30c93 ¤   mEncryptKeySize¤¤   = 2048;
aaf4ae ¤   mSigningKeySize¤¤   = 1024;
8e95f5 ¤   mAllowRSAKeygen¤¤   = TRUE;
2ed925 ¤   mAlgorithm¤ ¤   ¤   = kPGPPublicKeyAlgorithm_DSA;
f2f1ab ¤   mExpirationDays¤¤   = 0;
e188e5 ¤   mGeneratingKey¤ ¤   = false;
f3dc68 ¤   mParentKeyTable¤¤   = nil;
ce67c5 ¤
a04c92 ¤   GetMachineOwnerName( mName );
2eefe6 }
e1af5a
32fa73 CKeyGenWizardDialog::~CKeyGenWizardDialog()
07bb36 {
5f305c ¤   // Clear items for security reasons.
d746b0 ¤   pgpClearMemory( mName, sizeof( mName ) );
7910fd ¤   pgpClearMemory( mEmailAddress, sizeof( mEmailAddress ) );
b3e6c8 ¤   pgpClearMemory( mPassphrase, sizeof( mPassphrase ) );
7e1ad0 ¤   pgpClearMemory( mConfirmation, sizeof( mConfirmation ) );
bdefe6 }
19af5a
866d52 ¤   void
fa8a02 CKeyGenWizardDialog::FinishCreateSelf()
e9bb36 {
7b893a ¤   LGADialog::FinishCreateSelf();
d167c5 ¤
dffcb1 ¤   RegisterClass_( CKeyGenWizardView );
2d9d76 ¤   RegisterClass_( CNameAndAddressView );
ed7d9f ¤   RegisterClass_( CKeyTypeView );
36bf25 ¤   RegisterClass_( CKeySizeView );
396ae5 ¤   RegisterClass_( CKeyExpirationView );
850d6f ¤   RegisterClass_( CMRKView );
82f125 ¤   RegisterClass_( CCorpView );
99320b ¤   RegisterClass_( CKeyPassphraseView );
2d4cd4 ¤   RegisterClass_( CGetRandomDataView );
a8123b ¤   RegisterClass_( CGeneratingKeyView );
7367c5 ¤
5feab8 ¤   mNextButton = (LPushButton *) FindPaneByID( kNextButtonPaneID );
7b4451 ¤   pgpAssertAddrValid( mNextButton, VoidAlign );
b9af5a
db50ad ¤   mPreviousButton = (LPushButton *) FindPaneByID( kPreviousButtonPaneID );
cd9521 ¤   pgpAssertAddrValid( mPreviousButton, VoidAlign );
63af5a
3973a9 ¤   mCancelButton = (LPushButton *) FindPaneByID( kCancelButtonPaneID );
5d82a9 ¤   pgpAssertAddrValid( mCancelButton, VoidAlign );
0caf5a
31b39b ¤   // mNextButton already added by the modal dialog handler.
eaf014 ¤   mPreviousButton->AddListener( this );
c567c5 ¤
3619d4 ¤   mMRKKey¤¤   = NULL;
--2d92 000b3c359c3401201af Page 19 of CKeyGenWizardDialog.cp
fe1cee ¤   mRevokerKey¤= NULL;
0739fb ¤   mCorpKey¤   = NULL;
18be29 #if PGP_BUSINESS_SECURITY
b1c7a1 ¤   {
e0cf44 ¤   ¤   PGPError¤   ¤   err;
0ca9c6 ¤   ¤   PGPBoolean¤ ¤   useMRK,
e707ac ¤   ¤   ¤   ¤   ¤   ¤   autoCorp,
d40ef5 ¤   ¤   ¤   ¤   ¤   ¤   addRevoker;
073362 ¤   ¤   PGPKeySetRef¤   keySet;
3bd4d7 ¤   ¤   PGPKeyID¤   ¤   keyID;
75ea08 ¤   ¤   PGPSize¤¤   ¤   len;
67c4e8 ¤   ¤   PGPByte¤¤   ¤   *keyIDRaw;
7c87c7 ¤   ¤   ¤
981b52 ¤   ¤
435490 ¤   ¤   keySet = CPGPKeys::TheApp()->GetKeySet();
e64d68 ¤   ¤   // Set MRK on this key?
c7e020 ¤   ¤   err = PGPGetPrefBoolean(gAdminPrefRef, kPGPPrefUseDHADK, &useMRK);
9fe919 ¤   ¤   pgpAssertNoErr(err);
1fc8d9 ¤   ¤   if(useMRK)
2b5b34 ¤   ¤   {
c73b92 ¤   ¤   ¤   err = PGPGetPrefData(¤  gAdminPrefRef, kPGPPrefDHADKID,
83051d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &len, &keyIDRaw);
0d524f ¤   ¤   ¤   pgpAssertNoErr(err);
ea768c ¤   ¤   ¤   if(IsntPGPError(err))
f1f776 ¤   ¤   ¤   {
dad56d ¤   ¤   ¤   ¤   err = PGPImportKeyID( keyIDRaw, &keyID);
f16f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
d399ff ¤   ¤   ¤   ¤   if(IsntPGPError(err))
c572c3 ¤   ¤   ¤   ¤   {
bc1ced ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyByKeyID(¤keySet,
19dc3f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID,
f226d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPublicKeyAlgorithm_DSA,
7accc6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mMRKKey);
dc6aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
af2613 ¤   ¤   ¤   ¤   }
fe2d36 ¤   ¤   ¤   ¤   err = PGPDisposePrefData(gAdminPrefRef, keyIDRaw);
fc6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
b1a3a6 ¤   ¤   ¤   }
d10fe4 ¤   ¤   }
75acf9 ¤   ¤   // Should we auto-sign/trust the Corporate Key?
014ebf ¤   ¤   err = PGPGetPrefBoolean(gAdminPrefRef,
7b16e5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefAutoSignTrustCorp, &autoCorp);
c3e919 ¤   ¤   pgpAssertNoErr(err);
523c83 ¤   ¤   if(autoCorp)
935b34 ¤   ¤   {
4890c1 ¤   ¤   ¤   err = PGPGetPrefData(¤  gAdminPrefRef, kPGPPrefCorpKeyID,
7e051d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &len, &keyIDRaw);
44524f ¤   ¤   ¤   pgpAssertNoErr(err);
0b768c ¤   ¤   ¤   if(IsntPGPError(err))
17f776 ¤   ¤   ¤   {
0e4722 ¤   ¤   ¤   ¤   PGPUInt32¤  corpKeyAlgorithm;
ff2b85 ¤   ¤   ¤   ¤
4cd56d ¤   ¤   ¤   ¤   err = PGPImportKeyID( keyIDRaw, &keyID);
816f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
9999ff ¤   ¤   ¤   ¤   if(IsntPGPError(err))
a572c3 ¤   ¤   ¤   ¤   {
8d7080 ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefNumber(gAdminPrefRef,
ea7d98 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefCorpKeyPublicKeyAlgorithm,
5278f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &corpKeyAlgorithm );
296aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
63ae30 ¤   ¤   ¤   ¤   ¤
d51ced ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyByKeyID(¤keySet,
5f522e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID,
ae95ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPPublicKeyAlgorithm)corpKeyAlgorithm,
c49f75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mCorpKey);
d96aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
362613 ¤   ¤   ¤   ¤   }
7a2d36 ¤   ¤   ¤   ¤   err = PGPDisposePrefData(gAdminPrefRef, keyIDRaw);
ad6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
c4a3a6 ¤   ¤   ¤   }
910fe4 ¤   ¤   }
b3eaed ¤   ¤   // Should we set a designated revoker?
--b118 00019439afa401201af Page 20 of CKeyGenWizardDialog.cp
d94ebf ¤   ¤   err = PGPGetPrefBoolean(gAdminPrefRef,
055682 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefAutoAddRevoker, &addRevoker);
e5e919 ¤   ¤   pgpAssertNoErr(err);
46e928 ¤   ¤   if(addRevoker)
2b5b34 ¤   ¤   {
6932d0 ¤   ¤   ¤   err = PGPGetPrefData(¤  gAdminPrefRef, kPGPPrefRevokerKeyID,
13051d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &len, &keyIDRaw);
ec524f ¤   ¤   ¤   pgpAssertNoErr(err);
69768c ¤   ¤   ¤   if(IsntPGPError(err))
e2f776 ¤   ¤   ¤   {
4e132e ¤   ¤   ¤   ¤   PGPUInt32¤  revokerKeyAlgorithm;
9f2b85 ¤   ¤   ¤   ¤
7a7158 ¤   ¤   ¤   ¤   err = PGPImportKeyID( keyIDRaw, &keyID );
c86f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
ef99ff ¤   ¤   ¤   ¤   if(IsntPGPError(err))
3072c3 ¤   ¤   ¤   ¤   {
ca7080 ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefNumber(gAdminPrefRef,
287e80 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefRevokerPublicKeyAlgorithm,
c25324 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &revokerKeyAlgorithm );
cf6aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
69ae30 ¤   ¤   ¤   ¤   ¤
071ced ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyByKeyID(¤keySet,
39522e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID,
f78fa2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPPublicKeyAlgorithm)revokerKeyAlgorithm,
de527a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mRevokerKey);
b06aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
f72613 ¤   ¤   ¤   ¤   }
b52d36 ¤   ¤   ¤   ¤   err = PGPDisposePrefData(gAdminPrefRef, keyIDRaw);
686f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
5da3a6 ¤   ¤   ¤   }
eb0fe4 ¤   ¤   }
644e0b ¤   ¤   if(useMRK && !mMRKKey)
795b34 ¤   ¤   {
5f404a ¤   ¤   ¤   CWarningAlert::Display(¤kWAStopAlertType, kWAOKStyle,·
45d399 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListResID, kNoMRKErrorStrIndex );
e0dad8 ¤   ¤   ¤   mFinished = true;
5d0fe4 ¤   ¤   }
e15607 ¤   ¤   else if(autoCorp && !mCorpKey)
915b34 ¤   ¤   {
5b404a ¤   ¤   ¤   CWarningAlert::Display(¤kWAStopAlertType, kWAOKStyle,·
7605a8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListResID, kNoCorpKeyErrorStrIndex );
63dad8 ¤   ¤   ¤   mFinished = true;
060fe4 ¤   ¤   }
5cf9aa ¤   ¤   else if(addRevoker && !mRevokerKey)
8d5b34 ¤   ¤   {
77404a ¤   ¤   ¤   CWarningAlert::Display(¤kWAStopAlertType, kWAOKStyle,·
9b07f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListResID, kNoRevokerKeyErrorStrIndex );
53dad8 ¤   ¤   ¤   mFinished = true;
da0fe4 ¤   ¤   }
1d64bb ¤   ¤   err = PGPGetPrefBoolean(gAdminPrefRef, kPGPPrefAllowRSAKeyGen,
d7aec1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mAllowRSAKeygen);
cee919 ¤   ¤   pgpAssertNoErr(err);
789371 ¤   }
127454 #endif
ce4532 ¤   if(PGP_FREEWARE || NO_RSA_KEYGEN)
bdeef3 ¤   ¤   mAllowRSAKeygen = FALSE;
1b67c5 ¤
0d0f04 ¤   SwitchToView( kViewIntroduction, FALSE );
71efe6 }
18af5a
4e6d52 ¤   void
f1cc4e CKeyGenWizardDialog::SetKeyTable(CKeyTable *keyTable)
2cbb36 {
4adea8 ¤   pgpAssertAddrValid(keyTable, CKeyGenWizardDialog *);
4537cd ¤   mParentKeyTable = keyTable;
b2efe6 }
16af5a
e86d52 ¤   void
caafb7 CKeyGenWizardDialog::ListenToMessage(MessageT inMessage, void *ioParam)
e7bb36 {
13769e ¤   switch( inMessage )
19c7a1 ¤   {
--19a1 000b6486d54401201af Page 21 of CKeyGenWizardDialog.cp
cc2806 ¤   ¤   case kNextViewMessage:
4b5b34 ¤   ¤   {
f4f9ee ¤   ¤   ¤   GotoNextView();
ff87c7 ¤   ¤   ¤
83a979 ¤   ¤   ¤   if( FinishedKeyGeneration() )
a0f776 ¤   ¤   ¤   {
9cba40 ¤   ¤   ¤   ¤   DoClose();
97a3a6 ¤   ¤   ¤   }
d2cdcb ¤   ¤   ¤   break;
c70fe4 ¤   ¤   }
e087c7 ¤   ¤   ¤
a7c01f ¤   ¤   case kPreviousViewMessage:
70e377 ¤   ¤   ¤   GotoPreviousView();
b1cdcb ¤   ¤   ¤   break;
2287c7 ¤   ¤   ¤
785686 ¤   ¤   case msg_Cancel:
3b5b34 ¤   ¤   {
b9392a ¤   ¤   ¤   if( mGeneratingKey )
ebf776 ¤   ¤   ¤   {
a260b5 ¤   ¤   ¤   ¤   // This is the error returned if the user cancels.
4edfd4 ¤   ¤   ¤   ¤   mKeyGenerationError = kPGPError_OutOfMemory;
0aa3a6 ¤   ¤   ¤   }
bbbb8c ¤   ¤   ¤   else
75f776 ¤   ¤   ¤   {
2fba40 ¤   ¤   ¤   ¤   DoClose();
e7a3a6 ¤   ¤   ¤   }
b687c7 ¤   ¤   ¤
45cdcb ¤   ¤   ¤   break;
e90fe4 ¤   ¤   }
3d1b52 ¤   ¤
96525c ¤   ¤   case kAllowViewSwitchMessage:
4117a3 ¤   ¤   ¤   mNextButton->Enable();
fc6ce0 ¤   ¤   ¤   mPreviousButton->Enable();
70cdcb ¤   ¤   ¤   break;
7aaf5a
f29ae3 ¤   ¤   default:
7d1d75 ¤   ¤   ¤   LGADialog::ListenToMessage( inMessage, ioParam );
f7cdcb ¤   ¤   ¤   break;
519371 ¤   }
eaefe6 }
49af5a
b96d52 ¤   void
fd44ea CKeyGenWizardDialog::AdjustControlsForView(KeyGenerationView theView)
1cbb36 {
ed845b ¤   short¤  titleIndex = kNextButtonTitleStrIndex;
cb5d1a ¤   Str255¤ buttonTitle;
1267c5 ¤
db8ff4 ¤   mNextButton->Enable();
d8a16c ¤   mPreviousButton->Enable();
e8af5a
434d1e ¤   switch( theView )
5fc7a1 ¤   {
97eac6 ¤   ¤   case kViewIntroduction:
45aa0a ¤   ¤   ¤   mPreviousButton->Disable();
a4cdcb ¤   ¤   ¤   break;
e57556 ¤   ¤   case kViewGetRandomData:
c6e44c ¤   ¤   case kViewGeneratingKey:
cfaa0a ¤   ¤   ¤   mPreviousButton->Disable();
59daee ¤   ¤   ¤   mNextButton->Disable();
a6cdcb ¤   ¤   ¤   break;
69b46a ¤   ¤   case kViewKeyBadPassphrase:
4ebeed ¤   ¤   ¤   if(mPassphraseEnforceLength || !mPassphraseGoodQuality ||
cac10e ¤   ¤   ¤   ¤   ¤   !mPassphraseMatched)
651fbb ¤   ¤   ¤   ¤   mNextButton->Disable();
f1cdcb ¤   ¤   ¤   break;
b6ea17 ¤   ¤   case kViewConclusion:
442bd5 ¤   ¤   ¤   titleIndex = kDoneButtonTitleStrIndex;
3897bc ¤   ¤   case kViewSendToServer:
f2aa0a ¤   ¤   ¤   mPreviousButton->Disable();
7ecfee ¤   ¤   ¤   mCancelButton->Disable();
74cdcb ¤   ¤   ¤   break;
b69371 ¤   }
--8e89 000866a537a401201af Page 22 of CKeyGenWizardDialog.cp
2a67c5 ¤
fe4e78 ¤   GetIndString( buttonTitle, kStringListResID, titleIndex );
ed4bf6 ¤   mNextButton->SetDescriptor( buttonTitle );
aeefe6 }
90af5a
ea7e69 ¤   Boolean
3d5193 CKeyGenWizardDialog::IsGoodPassphrase(
05799e ¤   ConstStr255Param¤   passphrase,
2890be ¤   ConstStr255Param¤   confirmation,
8f96ef ¤   Boolean¤¤   ¤   ¤   &confirmMatch,
748806 ¤   Boolean¤¤   ¤   ¤   &enforceLength,
badedc ¤   Boolean¤¤   ¤   ¤   &goodLength,
18012e ¤   Boolean¤¤   ¤   ¤   &goodQuality)
93bb36 {
b74207 ¤   goodLength = TRUE;
7ce16b ¤   goodQuality = TRUE;
9586de ¤   confirmMatch = TRUE;
2eb248 ¤   enforceLength = FALSE;
cc31ab ¤   if(!PStringsAreEqual(passphrase, confirmation))
f58762 ¤   ¤   confirmMatch = FALSE;
805989 #if¤PGP_BUSINESS_SECURITY
44c7a1 ¤   {
360274 ¤   ¤   PGPBoolean¤ enforceMinLength,
efa507 ¤   ¤   ¤   ¤   ¤   enforceMinQuality;
24a4d4 ¤   ¤   PGPUInt32¤  minLength,
351f7d ¤   ¤   ¤   ¤   ¤   minQuality;
e3d031 ¤   ¤   PGPError¤   err;
1b1b52 ¤   ¤
00d9d8 ¤   ¤   err = PGPGetPrefBoolean(
97e4d8 ¤   ¤   ¤   ¤   gAdminPrefRef, kPGPPrefEnforceMinChars, &enforceMinLength);
f5e919 ¤   ¤   pgpAssertNoErr(err);
93b795 ¤   ¤   if(IsntPGPError(err) && enforceMinLength)
e85b34 ¤   ¤   {
2fd29c ¤   ¤   ¤   err = PGPGetPrefNumber(
c8df32 ¤   ¤   ¤   ¤   ¤   gAdminPrefRef, kPGPPrefMinChars, &minLength);
4e524f ¤   ¤   ¤   pgpAssertNoErr(err);
6da57f ¤   ¤   ¤   if(passphrase[0] < minLength)
8e9579 ¤   ¤   ¤   ¤   goodLength = FALSE;
4e85ab ¤   ¤   ¤   enforceLength = TRUE;
d30fe4 ¤   ¤   }
27d9d8 ¤   ¤   err = PGPGetPrefBoolean(
8f8570 ¤   ¤   ¤   ¤   gAdminPrefRef, kPGPPrefEnforceMinQuality, &enforceMinQuality);
34e919 ¤   ¤   pgpAssertNoErr(err);
04e73f ¤   ¤   if(IsntPGPError(err) && enforceMinQuality)
e35b34 ¤   ¤   {
fdb26d ¤   ¤   ¤   CSecureCString256¤  cPassphrase;
8e87c7 ¤   ¤   ¤
69d29c ¤   ¤   ¤   err = PGPGetPrefNumber(
42facc ¤   ¤   ¤   ¤   ¤   gAdminPrefRef, kPGPPrefMinQuality, &minQuality);
86524f ¤   ¤   ¤   pgpAssertNoErr(err);
e687c7 ¤   ¤   ¤
4a5c4c ¤   ¤   ¤   PToCString( passphrase, cPassphrase );
83d0d4 ¤   ¤   ¤   if( PGPEstimatePassphraseQuality(cPassphrase) < minQuality)
895e14 ¤   ¤   ¤   ¤   goodQuality = FALSE;
0e0fe4 ¤   ¤   }
819371 ¤   }
5297b2 #endif¤ // PGP_BUSINESS_SECURITY
d5dcba ¤   if(passphrase[0] < kRecommendedMinPassLength)
57b3db ¤   ¤   goodLength = FALSE;
9466b9 ¤   return (confirmMatch && goodLength && goodQuality);
acefe6 }
1daf5a
cc7e69 ¤   Boolean
82005c CKeyGenWizardDialog::LeaveCurrentView(KeyGenerationView newView)
5ebb36 {
aea3ea ¤   Boolean¤okToSwitch = true;
4267c5 ¤
6ac99d ¤   switch( mCurrentView )
b6c7a1 ¤   {
98598c ¤   ¤   case kViewNameAndEmailAddress:
e05b34 ¤   ¤   {
86f80c ¤   ¤   ¤   CNameAndAddressView¤*viewObj = (CNameAndAddressView *)
--9509 000e3c2f57f401201af Page 23 of CKeyGenWizardDialog.cp
26055d ¤   ¤   ¤   ¤   mCurrentViewObj;
b287c7 ¤   ¤   ¤
aeff70 ¤   ¤   ¤   viewObj->GetParams( mName, mEmailAddress );
4f87c7 ¤   ¤   ¤
f46843 ¤   ¤   ¤   // Only validate if switching to the next pane
215515 ¤   ¤   ¤   if( ( newView == (KeyGenerationView) ((UInt32)
1c5527 ¤   ¤   ¤   ¤   kViewNameAndEmailAddress + 1 ) ) ||
c3d5e0 ¤   ¤   ¤   ¤   ( newView == (KeyGenerationView) ((UInt32)
c0ab03 ¤   ¤   ¤   ¤   kViewNameAndEmailAddress + 2 ) ) )
15f776 ¤   ¤   ¤   {
901bb7 ¤   ¤   ¤   ¤   if( mName[0] == 0 )
6472c3 ¤   ¤   ¤   ¤   {
c6250d ¤   ¤   ¤   ¤   ¤   SysBeep(1);
f3ae30 ¤   ¤   ¤   ¤   ¤
e2ac49 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display( kWACautionAlertType, kWAOKStyle,·
25652e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListResID, kNameRequiredStrIndex );
c95227 ¤   ¤   ¤   ¤   ¤   okToSwitch = false;
082613 ¤   ¤   ¤   ¤   }
ab5ec3 ¤   ¤   ¤   ¤   else if( mEmailAddress[0] == 0 )
7372c3 ¤   ¤   ¤   ¤   {
52250d ¤   ¤   ¤   ¤   ¤   SysBeep(1);
85ae30 ¤   ¤   ¤   ¤   ¤
a90fe2 ¤   ¤   ¤   ¤   ¤   if( CWarningAlert::Display(¤kWACautionAlertType,
bc3b37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKCancelStyle,·
3df417 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListResID,
e696ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kVerifyNoEmailAddressStrIndex )
b9b2ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   != msg_OK )
364859 ¤   ¤   ¤   ¤   ¤   {
71da41 ¤   ¤   ¤   ¤   ¤   ¤   okToSwitch = false;
6d1c89 ¤   ¤   ¤   ¤   ¤   }
7e2613 ¤   ¤   ¤   ¤   }
d5a3a6 ¤   ¤   ¤   }
1787c7 ¤   ¤   ¤
2dcdcb ¤   ¤   ¤   break;
6a0fe4 ¤   ¤   }
9b1b52 ¤   ¤
c4d869 ¤   ¤   case kViewKeyType:
475b34 ¤   ¤   {
2df909 ¤   ¤   ¤   CKeyTypeView¤   *viewObj = (CKeyTypeView *) mCurrentViewObj;
3587c7 ¤   ¤   ¤
23e7ca ¤   ¤   ¤   mAlgorithm = viewObj->GetAlgorithm();
3dcdcb ¤   ¤   ¤   break;
350fe4 ¤   ¤   }
d01b52 ¤   ¤
9bac56 ¤   ¤   case kViewKeySize:
525b34 ¤   ¤   {
9b18ff ¤   ¤   ¤   CKeySizeView¤   *viewObj = (CKeySizeView *) mCurrentViewObj;
eed5c7 ¤   ¤   ¤   UInt32¤ ¤   ¤   maxKeySize;
a387c7 ¤   ¤   ¤
ddfcd4 ¤   ¤   ¤   if( mAlgorithm == kPGPPublicKeyAlgorithm_DSA )
7af776 ¤   ¤   ¤   {
10de9c ¤   ¤   ¤   ¤   maxKeySize = kDSAElGamalMaxKeySize;
9fa3a6 ¤   ¤   ¤   }
31bb8c ¤   ¤   ¤   else
f5f776 ¤   ¤   ¤   {
b1a77b ¤   ¤   ¤   ¤   maxKeySize = kRSAMaxKeySize;
5ba3a6 ¤   ¤   ¤   }
e987c7 ¤   ¤   ¤
f65ce1 ¤   ¤   ¤   mEncryptKeySize = viewObj->GetKeySize();
4697f8 ¤   ¤   ¤   if( mEncryptKeySize < kMinKeySize || mEncryptKeySize > maxKeySize )
24f776 ¤   ¤   ¤   {
541a54 ¤   ¤   ¤   ¤   Str32¤  numStr;
af2b85 ¤   ¤   ¤   ¤
62aca6 ¤   ¤   ¤   ¤   NumToString( maxKeySize, numStr );
752b85 ¤   ¤   ¤   ¤
3e8853 ¤   ¤   ¤   ¤   SysBeep(1);
452b85 ¤   ¤   ¤   ¤
22d6f6 ¤   ¤   ¤   ¤   (void)CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
b61afa ¤   ¤   ¤   ¤   ¤   kStringListResID, kKeySizeOutOfRangeStrIndex, numStr );
482b85 ¤   ¤   ¤   ¤
b59772 ¤   ¤   ¤   ¤   okToSwitch = false;
e3a3a6 ¤   ¤   ¤   }
--1daa 00073ce5183401201af Page 24 of CKeyGenWizardDialog.cp
b1bb8c ¤   ¤   ¤   else
89f776 ¤   ¤   ¤   {
28be29 #if PGP_BUSINESS_SECURITY
24711b ¤   ¤   ¤   ¤   PGPUInt32¤  minAdminKeySize;
305f3a ¤   ¤   ¤   ¤   PGPError¤   err;
eb2b85 ¤   ¤   ¤   ¤
af73f7 ¤   ¤   ¤   ¤   err = PGPGetPrefNumber(gAdminPrefRef,
3bbb68 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefMinimumKeySize, &minAdminKeySize);
806f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
3f6a9d ¤   ¤   ¤   ¤   if(mEncryptKeySize < minAdminKeySize)
b372c3 ¤   ¤   ¤   ¤   {
61d4c3 ¤   ¤   ¤   ¤   ¤   Str255¤ adminKeySizeStr;
54ae30 ¤   ¤   ¤   ¤   ¤
b5b14e ¤   ¤   ¤   ¤   ¤   ::NumToString(minAdminKeySize, adminKeySizeStr);
5b8489 ¤   ¤   ¤   ¤   ¤   (void)CWarningAlert::Display(kWACautionAlertType,
470c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
bf1560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListResID,
2debad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAdminKeySizeErrorStrIndex,
fd9e95 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   adminKeySizeStr );
1b5227 ¤   ¤   ¤   ¤   ¤   okToSwitch = false;
a42613 ¤   ¤   ¤   ¤   }
977454 #endif
808a15 ¤   ¤   ¤   ¤   if(mEncryptKeySize < 768)
ea72c3 ¤   ¤   ¤   ¤   {
67c259 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(¤kWANoteAlertType,
8e9e2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,·
dd1617 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListResID,
6f42bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   k768WarningStrIndex );
762613 ¤   ¤   ¤   ¤   }
c8fc36 ¤   ¤   ¤   ¤   if( mAlgorithm == kPGPPublicKeyAlgorithm_DSA )
3972c3 ¤   ¤   ¤   ¤   {
ab478c ¤   ¤   ¤   ¤   ¤   if( mEncryptKeySize < 1024 )
0a4859 ¤   ¤   ¤   ¤   ¤   {
35eb56 ¤   ¤   ¤   ¤   ¤   ¤   mSigningKeySize = mEncryptKeySize;
f01c89 ¤   ¤   ¤   ¤   ¤   }
824bd6 ¤   ¤   ¤   ¤   ¤   else
e24aa2 ¤   ¤   ¤   ¤   ¤   ¤   mSigningKeySize = 1024;
f22613 ¤   ¤   ¤   ¤   }
67fa07 ¤   ¤   ¤   ¤   else
8372c3 ¤   ¤   ¤   ¤   {
62ec6d ¤   ¤   ¤   ¤   ¤   mSigningKeySize = mEncryptKeySize;
1b2613 ¤   ¤   ¤   ¤   }
0aa3a6 ¤   ¤   ¤   }
7eaf5a
74cdcb ¤   ¤   ¤   break;
a10fe4 ¤   ¤   }
10af5a
11e715 ¤   ¤   case kViewKeyExpiration:
205b34 ¤   ¤   {
96581c ¤   ¤   ¤   CKeyExpirationView¤ *viewObj = (CKeyExpirationView *)
5f230c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCurrentViewObj;
a087c7 ¤   ¤   ¤
d27259 ¤   ¤   ¤   if( ! viewObj->GetExpiration( &mExpirationDays ) )
09f776 ¤   ¤   ¤   {
138853 ¤   ¤   ¤   ¤   SysBeep(1);
ab2b85 ¤   ¤   ¤   ¤
ac27fd ¤   ¤   ¤   ¤   (void) CWarningAlert::Display( kWACautionAlertType, kWAOKStyle,·
bf1617 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListResID,
2cbfff ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeyExpirationOutOfRangeStrIndex );
6d9772 ¤   ¤   ¤   ¤   okToSwitch = false;
44a3a6 ¤   ¤   ¤   }
ec87c7 ¤   ¤   ¤
cacdcb ¤   ¤   ¤   break;
b20fe4 ¤   ¤   }
b51b52 ¤   ¤
3097bc ¤   ¤   case kViewSendToServer:
955b34 ¤   ¤   {
423951 ¤   ¤   ¤   CSendToServerView¤  *viewObj = (CSendToServerView *)
30230c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCurrentViewObj;
b4af5a
16d60c ¤   ¤   ¤   viewObj->DoSendToServer(mGeneratedKey);
73cdcb ¤   ¤   ¤   break;
--7edc 00023f2cbd7401201af Page 25 of CKeyGenWizardDialog.cp
b50fe4 ¤   ¤   }
6b9371 ¤   }
b4af5a
dc7936 ¤   if( okToSwitch && IsntNull( mCurrentViewObj ) )
5cc7a1 ¤   {
3cfe54 ¤   ¤   Rect¤   viewRect;
f51b52 ¤   ¤
1c37e7 ¤   ¤   mCurrentViewObj->CalcPortFrameRect( viewRect );
334035 ¤   ¤   delete mCurrentViewObj;¤¤   ¤   ¤   // delete it
f20b72 ¤   ¤   mCurrentViewObj = nil;
891b52 ¤   ¤
75df40 ¤   ¤   FocusDraw();
c4fe46 ¤   ¤   ApplyForeAndBackColors();
f7b28c ¤   ¤   EraseRect( &viewRect );
579371 ¤   }
1667c5 ¤
40749d ¤   return( okToSwitch );
b0efe6 }
37af5a
fe6d52 ¤   void
f655a0 CKeyGenWizardDialog::EnterView(KeyGenerationView newView)
95bb36 {
3aff1f ¤   ResIDT¤ newViewResID;
7167c5 ¤
18f3ee ¤   switch( newView )
88c7a1 ¤   {
0ceac6 ¤   ¤   case kViewIntroduction:
9c4534 ¤   ¤   ¤   newViewResID = view_Introduction;
32cdcb ¤   ¤   ¤   break;
51af5a
c3598c ¤   ¤   case kViewNameAndEmailAddress:
1c26b2 ¤   ¤   ¤   newViewResID = view_NameAndAddress;
66cdcb ¤   ¤   ¤   break;
21af5a
bfd869 ¤   ¤   case kViewKeyType:
9ae606 ¤   ¤   ¤   newViewResID = view_KeyType;
18cdcb ¤   ¤   ¤   break;
30af5a
60ac56 ¤   ¤   case kViewKeySize:
969239 ¤   ¤   ¤   newViewResID = view_KeySize;
5acdcb ¤   ¤   ¤   break;
0887c7 ¤   ¤   ¤
33e715 ¤   ¤   case kViewKeyExpiration:
187023 ¤   ¤   ¤   newViewResID = view_KeyExpiration;
8ccdcb ¤   ¤   ¤   break;
c4af5a
caf0e2 ¤   ¤   case kViewKeyMRK:
79705e ¤   ¤   ¤   newViewResID = view_MRK;
5ecdcb ¤   ¤   ¤   break;
9daf5a
729935 ¤   ¤   case kViewSignCorp:
22b0ed ¤   ¤   ¤   newViewResID = view_Corp;
dbcdcb ¤   ¤   ¤   break;
fcaf5a
1b43bb ¤   ¤   case kViewAddRevoker:
6ede0a ¤   ¤   ¤   newViewResID = view_Revoker;
7dcdcb ¤   ¤   ¤   break;
abaf5a
96f0e2 ¤   ¤   case kViewKeyPassphrase:
4d67d4 ¤   ¤   ¤   newViewResID = view_KeyPassphrase;
5ecdcb ¤   ¤   ¤   break;
14af5a
5fb46a ¤   ¤   case kViewKeyBadPassphrase:
a3e994 ¤   ¤   ¤   newViewResID = view_BadPassphrase;
76cdcb ¤   ¤   ¤   break;
00af5a
dd7556 ¤   ¤   case kViewGetRandomData:
1ae260 ¤   ¤   ¤   newViewResID = view_GetRandomData;
ebcdcb ¤   ¤   ¤   break;
4eaf5a
51e44c ¤   ¤   case kViewGeneratingKey:
23737a ¤   ¤   ¤   newViewResID = view_GeneratingKey;
--a4d0 00064bbd87f401201af Page 26 of CKeyGenWizardDialog.cp
7ecdcb ¤   ¤   ¤   break;
3987c7 ¤   ¤   ¤
da97bc ¤   ¤   case kViewSendToServer:
c2384e ¤   ¤   ¤   newViewResID = view_SendToServer;
9acdcb ¤   ¤   ¤   break;
55af5a
b1ea17 ¤   ¤   case kViewConclusion:
cf9bb3 ¤   ¤   ¤   newViewResID = view_Conclusion;
03cdcb ¤   ¤   ¤   break;
aaaf5a
b09ae3 ¤   ¤   default:
d32c57 ¤   ¤   ¤   newViewResID = 0;
97cdcb ¤   ¤   ¤   break;
d29371 ¤   }
de67c5 ¤
6a8620 ¤   if( newViewResID != 0 )
07c7a1 ¤   {
a4e776 ¤   ¤   LCommander::SetDefaultCommander( this );
6a0ad3 ¤   ¤   LPane::SetDefaultView( this );
0a1b52 ¤   ¤
ef0a29 ¤   ¤   mCurrentViewObj = (CKeyGenWizardView *)
9c711e ¤   ¤   ¤   ¤   ¤   ¤   ¤   UReanimator::ReadObjects( 'PPob', newViewResID );
28cc83 ¤   ¤   mCurrentViewObj->FinishCreate();
9fe4f1 ¤   ¤   mCurrentViewObj->SetSuperCommander( this );
191b52 ¤   ¤
6a345b ¤   ¤   switch( newView )
b75b34 ¤   ¤   {
ec57c0 ¤   ¤   ¤   case kViewNameAndEmailAddress:
d9f776 ¤   ¤   ¤   {
66b37a ¤   ¤   ¤   ¤   CNameAndAddressView¤*viewObj =
036476 ¤   ¤   ¤   ¤   ¤   ¤   (CNameAndAddressView *) mCurrentViewObj;
b82b85 ¤   ¤   ¤   ¤
6c9753 ¤   ¤   ¤   ¤   viewObj->SetParams( mName, mEmailAddress );
d3f622 ¤   ¤   ¤   ¤   break;
a5a3a6 ¤   ¤   ¤   }
58af5a
4fcc41 ¤   ¤   ¤   case kViewKeyType:
eef776 ¤   ¤   ¤   {
6064d3 ¤   ¤   ¤   ¤   CKeyTypeView¤   *viewObj = (CKeyTypeView *) mCurrentViewObj;
552b85 ¤   ¤   ¤   ¤
b74a74 ¤   ¤   ¤   ¤   viewObj->SetAlgorithm( mAlgorithm );
77f622 ¤   ¤   ¤   ¤   break;
29a3a6 ¤   ¤   ¤   }
a6af5a
b8b87e ¤   ¤   ¤   case kViewKeySize:
32f776 ¤   ¤   ¤   {
358525 ¤   ¤   ¤   ¤   CKeySizeView¤   *viewObj = (CKeySizeView *) mCurrentViewObj;
dd2b85 ¤   ¤   ¤   ¤
336dc5 ¤   ¤   ¤   ¤   viewObj->SetParams( mAlgorithm, mEncryptKeySize );
ebf622 ¤   ¤   ¤   ¤   break;
c7a3a6 ¤   ¤   ¤   }
3baf5a
91da7d ¤   ¤   ¤   case kViewKeyExpiration:
91f776 ¤   ¤   ¤   {
93f1e0 ¤   ¤   ¤   ¤   CKeyExpirationView¤ *viewObj =
fabe0d ¤   ¤   ¤   ¤   ¤   (CKeyExpirationView *) mCurrentViewObj;
de2b85 ¤   ¤   ¤   ¤
f7f254 ¤   ¤   ¤   ¤   viewObj->SetExpiration( mExpirationDays );
79f622 ¤   ¤   ¤   ¤   break;
dba3a6 ¤   ¤   ¤   }
3eaf5a
2979b6 ¤   ¤   ¤   case kViewKeyMRK:
92f776 ¤   ¤   ¤   {
163abd ¤   ¤   ¤   ¤   CMRKView¤   *viewObj =
1fcbc0 ¤   ¤   ¤   ¤   ¤   (CMRKView *) mCurrentViewObj;
782b85 ¤   ¤   ¤   ¤
a8754f ¤   ¤   ¤   ¤   viewObj->SetMRK(mMRKKey);
a8f622 ¤   ¤   ¤   ¤   break;
4ba3a6 ¤   ¤   ¤   }
34af5a
c1346b ¤   ¤   ¤   case kViewSignCorp:
64f776 ¤   ¤   ¤   {
--a380 00054176579401201af Page 27 of CKeyGenWizardDialog.cp
4da51b ¤   ¤   ¤   ¤   CCorpView¤  *viewObj =
a2d5e6 ¤   ¤   ¤   ¤   ¤   (CCorpView *) mCurrentViewObj;
242b85 ¤   ¤   ¤   ¤
f1e50f ¤   ¤   ¤   ¤   viewObj->SetCorpKey(mCorpKey);
a4f622 ¤   ¤   ¤   ¤   break;
79a3a6 ¤   ¤   ¤   }
cc87c7 ¤   ¤   ¤
4474b3 ¤   ¤   ¤   case kViewAddRevoker:
3bf776 ¤   ¤   ¤   {
ca6870 ¤   ¤   ¤   ¤   CRevokerView¤   *viewObj =
f12e29 ¤   ¤   ¤   ¤   ¤   (CRevokerView *) mCurrentViewObj;
322b85 ¤   ¤   ¤   ¤
c4d1a1 ¤   ¤   ¤   ¤   viewObj->SetRevokerKey(mRevokerKey);
00f622 ¤   ¤   ¤   ¤   break;
78a3a6 ¤   ¤   ¤   }
cc87c7 ¤   ¤   ¤
af713f ¤   ¤   ¤   case kViewKeyBadPassphrase:
fdf776 ¤   ¤   ¤   {
d410ef ¤   ¤   ¤   ¤   CBadPassphraseView¤ *viewObj =
99b2f2 ¤   ¤   ¤   ¤   ¤   (CBadPassphraseView *) mCurrentViewObj;
132b85 ¤   ¤   ¤   ¤
c94912 ¤   ¤   ¤   ¤   viewObj->SetPassphrase(mPassphrase, mConfirmation);
61f622 ¤   ¤   ¤   ¤   break;
eba3a6 ¤   ¤   ¤   }
9387c7 ¤   ¤   ¤
c3483e ¤   ¤   ¤   case kViewGetRandomData:
ccf776 ¤   ¤   ¤   {
d41ff1 ¤   ¤   ¤   ¤   CGetRandomDataView¤ *viewObj =
64c073 ¤   ¤   ¤   ¤   ¤   (CGetRandomDataView *) mCurrentViewObj;
722b85 ¤   ¤   ¤   ¤
c685d4 ¤   ¤   ¤   ¤   viewObj->SetParams( mAlgorithm, mEncryptKeySize,
d86f69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mSigningKeySize );
3d9946 ¤   ¤   ¤   ¤   viewObj->AddListener( this );
3ef622 ¤   ¤   ¤   ¤   break;
d6a3a6 ¤   ¤   ¤   }
6d0fe4 ¤   ¤   }
fa1b52 ¤   ¤
121863 ¤   ¤   mCurrentViewObj->Show();
3f12c1 ¤   ¤   mCurrentViewObj->Draw( nil );
9dd1bf ¤   ¤   mCurrentViewObj->DontRefresh();
c79371 ¤   }
fb67c5 ¤
d1ee3e ¤   mCurrentView = newView;
e1efe6 }
62af5a
2daf5a
826d52 ¤   void
4b62ea CKeyGenWizardDialog::SwitchToView(¤ KeyGenerationView newView,
7c363b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean increment)
68bb36 {
fb34e4 ¤   Boolean directional = FALSE;
8e67c5 ¤
60804a ¤   if(newView == kViewInvalid)
0fc7a1 ¤   {
b0f611 ¤   ¤   directional = TRUE;
a5323e ¤   ¤   if(increment)
72e212 ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)mCurrentView + 1);
710e1d ¤   ¤   else
8ffae8 ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)mCurrentView - 1);
0c9371 ¤   }
e89ec4 ¤   if( newView == kViewExit )
f6c7a1 ¤   {
6b538c ¤   ¤   mFinished = true;
cf9371 ¤   }
a00e24 ¤   else
2cc7a1 ¤   {
8fd50e ¤   ¤   if(directional)
725b34 ¤   ¤   {
b1c24a ¤   ¤   ¤   if(newView == kViewKeyType && !mAllowRSAKeygen)
0df776 ¤   ¤   ¤   {
257cdf ¤   ¤   ¤   ¤   if(increment)
542c12 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView + 1);
--c372 0005f64a0c2401201af Page 28 of CKeyGenWizardDialog.cp
67fa07 ¤   ¤   ¤   ¤   else
0634e8 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView - 1);
d2a3a6 ¤   ¤   ¤   }
d96678 ¤   ¤   ¤   if(newView == kViewKeyMRK && (!mMRKKey ||
71d0b4 ¤   ¤   ¤   ¤   (mAlgorithm == kPGPPublicKeyAlgorithm_RSA)))
64f776 ¤   ¤   ¤   {
eb7cdf ¤   ¤   ¤   ¤   if(increment)
cd2c12 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView + 1);
cbfa07 ¤   ¤   ¤   ¤   else
8934e8 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView - 1);
89a3a6 ¤   ¤   ¤   }
2bbbfb ¤   ¤   ¤   if(newView == kViewSignCorp && !mCorpKey)
14f776 ¤   ¤   ¤   {
157cdf ¤   ¤   ¤   ¤   if(increment)
2a2c12 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView + 1);
cffa07 ¤   ¤   ¤   ¤   else
7234e8 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView - 1);
1aa3a6 ¤   ¤   ¤   }
d350d7 ¤   ¤   ¤   if(newView == kViewAddRevoker &&
464101 ¤   ¤   ¤   ¤   ( !mRevokerKey || ( mAlgorithm == kPGPPublicKeyAlgorithm_RSA ) ¶
742e7a ) )
30f776 ¤   ¤   ¤   {
697cdf ¤   ¤   ¤   ¤   if(increment)
2e2c12 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView + 1);
6ffa07 ¤   ¤   ¤   ¤   else
d234e8 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView - 1);
f7a3a6 ¤   ¤   ¤   }
e9bbfb ¤   ¤   ¤   if(newView == kViewSignCorp && !mCorpKey)
fdf776 ¤   ¤   ¤   {
4f7cdf ¤   ¤   ¤   ¤   if(increment)
362c12 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView + 1);
f7fa07 ¤   ¤   ¤   ¤   else
d234e8 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView - 1);
43a3a6 ¤   ¤   ¤   }
7f6678 ¤   ¤   ¤   if(newView == kViewKeyMRK && (!mMRKKey ||
d8d0b4 ¤   ¤   ¤   ¤   (mAlgorithm == kPGPPublicKeyAlgorithm_RSA)))
4df776 ¤   ¤   ¤   {
517cdf ¤   ¤   ¤   ¤   if(increment)
752c12 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView + 1);
76fa07 ¤   ¤   ¤   ¤   else
8834e8 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView - 1);
82a3a6 ¤   ¤   ¤   }
996a10 ¤   ¤   ¤   if(newView == kViewKeyBadPassphrase)
f4f776 ¤   ¤   ¤   {
772e2b ¤   ¤   ¤   ¤   if(!increment)
1a34e8 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView - 1);
d1fa07 ¤   ¤   ¤   ¤   else
4872c3 ¤   ¤   ¤   ¤   {
4fb01a ¤   ¤   ¤   ¤   ¤   CKeyPassphraseView¤ *viewObj = (CKeyPassphraseView *)
57b9a0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCurrentViewObj;
a8ae30 ¤   ¤   ¤   ¤   ¤
6c7c42 ¤   ¤   ¤   ¤   ¤   viewObj->GetPassphrase(mPassphrase, mConfirmation);
912cb4 ¤   ¤   ¤   ¤   ¤   if(IsGoodPassphrase(mPassphrase, mConfirmation,
75e089 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPassphraseMatched,
50d7b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPassphraseEnforceLength,
7803be ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPassphraseGoodLength,
c335f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPassphraseGoodQuality))
514859 ¤   ¤   ¤   ¤   ¤   {
ac371b ¤   ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView + 1);
981c89 ¤   ¤   ¤   ¤   ¤   }
ab2613 ¤   ¤   ¤   ¤   }
1ea3a6 ¤   ¤   ¤   }
1ab7e5 ¤   ¤   ¤   if(newView == kViewSendToServer)
d9f776 ¤   ¤   ¤   {
8ddd95 ¤   ¤   ¤   ¤   if(!gServerCallsPresent)
512c12 ¤   ¤   ¤   ¤   ¤   newView = (KeyGenerationView)((UInt32)newView + 1);
b1a3a6 ¤   ¤   ¤   }
2d0fe4 ¤   ¤   }
b81b52 ¤   ¤
735c04 ¤   ¤   // Skip the random input collection pane if the pool is full.
c54d6c ¤   ¤   if( newView == kViewGetRandomData )
5f5b34 ¤   ¤   {
--18f7 000656b8cc4401201af Page 29 of CKeyGenWizardDialog.cp
fab31c ¤   ¤   ¤   if( PGPGlobalRandomPoolGetEntropy() ==
561275 ¤   ¤   ¤   ¤   PGPGlobalRandomPoolGetSize() )
0ef776 ¤   ¤   ¤   {
ee921b ¤   ¤   ¤   ¤   newView = (KeyGenerationView)
7c5511 ¤   ¤   ¤   ¤   ¤   ((UInt32) kViewGetRandomData + 1);
a0a3a6 ¤   ¤   ¤   }
860fe4 ¤   ¤   }
d51b52 ¤   ¤
c14a8b ¤   ¤   if( LeaveCurrentView( newView ) )
765b34 ¤   ¤   {
5ca12a ¤   ¤   ¤   AdjustControlsForView( newView );
d1dd68 ¤   ¤   ¤   EnterView( newView );
3987c7 ¤   ¤   ¤
b4cccf ¤   ¤   ¤   // Special case the state machine for generating key
beea76 ¤   ¤   ¤   if( newView == kViewGeneratingKey )
56f776 ¤   ¤   ¤   {
2d0af7 ¤   ¤   ¤   ¤   Boolean¤goodKey;
2f2b85 ¤   ¤   ¤   ¤
a549f0 ¤   ¤   ¤   ¤   goodKey = GenerateKey();
faca28 ¤   ¤   ¤   ¤   if( goodKey )
6572c3 ¤   ¤   ¤   ¤   {
97df4c ¤   ¤   ¤   ¤   ¤   GotoNextView();
4e2613 ¤   ¤   ¤   ¤   }
f1fa07 ¤   ¤   ¤   ¤   else
dc72c3 ¤   ¤   ¤   ¤   {
e95fd9 ¤   ¤   ¤   ¤   ¤   SwitchToView( kViewExit, FALSE );
272613 ¤   ¤   ¤   ¤   }
fda3a6 ¤   ¤   ¤   }
530fe4 ¤   ¤   }
ae9371 ¤   }
26efe6 }
a2af5a
176d52 ¤   void
6d3be9 CKeyGenWizardDialog::GotoNextView(void)
8abb36 {
017cbf ¤   if( mCurrentView != kViewConclusion )
a4c7a1 ¤   {
d0cf54 ¤   ¤   SwitchToView(kViewInvalid, TRUE);
d29371 ¤   }
dd0e24 ¤   else
ebc7a1 ¤   {
1a538c ¤   ¤   mFinished = true;
5b9371 ¤   }
1fefe6 }
90af5a
5c6d52 ¤   void
9dbe34 CKeyGenWizardDialog::GotoPreviousView(void)
72bb36 {
04b94f ¤   pgpAssert( mCurrentView != kViewInvalid );
4067c5 ¤
b0cf06 ¤   if( mCurrentView != kViewIntroduction )
2cc7a1 ¤   {
1c8f18 ¤   ¤   SwitchToView(kViewInvalid, FALSE);
219371 ¤   }
21efe6 }
8aaf5a
226d52 ¤   void
d10806 CKeyGenWizardDialog::FindCommandStatus(
d3ea24 ¤   CommandT¤   inCommand,
ffa472 ¤   Boolean¤¤   &outEnabled,
543a4d ¤   Boolean¤¤   &outUsesMark,
fe5dc0 ¤   Char16¤ ¤   &outMark,
42d894 ¤   Str255¤ ¤   outName)
3fbb36 {
635e7f ¤   outEnabled = false;
b5efe6 }
6baf5a
a1c744 ¤   PGPError
23a3dc CKeyGenWizardDialog::GenerateKeyCallback(PGPContextRef context,
1a9330 ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event, PGPUserValue userValue)
5abb36 {
6507cd ¤   ulong¤  ¤   ¤   ¤   timeNow;
--a95b 000e5c7b8f1401201af Page 30 of CKeyGenWizardDialog.cp
73096e ¤   CKeyGenWizardDialog¤*dialogObj = (CKeyGenWizardDialog *) userValue;
0372cf ¤   static ulong¤   ¤   lastEventTime;
0b67c5 ¤
c8127c ¤   if(event->type == kPGPEvent_KeyGenEvent)
1ac7a1 ¤   {
18653f ¤   ¤   timeNow = LMGetTicks();
9f3300 ¤   ¤   if( timeNow - lastEventTime > 30 )
0a5b34 ¤   ¤   {
43a86e ¤   ¤   ¤   lastEventTime = timeNow;
8e87c7 ¤   ¤   ¤
97a030 ¤   ¤   ¤   CPGPKeys::TheApp()->ProcessNextEvent();
6a0fe4 ¤   ¤   }
369371 ¤   }
114302 ¤   return( mKeyGenerationError );
b2efe6 }
9aaf5a
ee7e69 ¤   Boolean
354dae CKeyGenWizardDialog::GenerateKey(void)
46bb36 {
fb8f52 ¤   PGPError¤   ¤   ¤   err;
72ab5f ¤   PGPKeyRef¤  ¤   ¤   key = kInvalidPGPKeyRef;
812aeb ¤   char¤   ¤   ¤   ¤   userIDStr[256];
8dc9c4 ¤   CSecureCString256¤  passphraseC;
054f05 ¤   Boolean¤¤   ¤   ¤   good = false;
ce3924 ¤   PGPBoolean¤ ¤   ¤   fastGen;
e272a4 ¤   PGPUInt32¤  ¤   ¤   numAllowed;
402a7a ¤   PGPCipherAlgorithm¤ *allowedAlgs;
8ce3eb ¤   PGPSize¤¤   ¤   ¤   dataSize;
c52d9a ¤   PGPBoolean ¤¤   ¤   enforce = FALSE;
e8a253 ¤   PGPKeySetRef¤   ¤   mrkKeySet = kInvalidPGPKeySetRef,
d1eb8a ¤   ¤   ¤   ¤   ¤   ¤   revokerKeySet = kInvalidPGPKeySetRef;
2f67c5 ¤
b867c5 ¤
cf25dc ¤   PToCString( mName, userIDStr );
0f3f84 ¤   if( mEmailAddress[0] != 0 )
66c7a1 ¤   {
d468df ¤   ¤   char¤   emailAddress[256];
9e1b52 ¤   ¤
e93ce8 ¤   ¤   PToCString( mEmailAddress, emailAddress );
ae1b52 ¤   ¤
902958 ¤   ¤   strcat( userIDStr, " <" );
eddc2b ¤   ¤   strcat( userIDStr, emailAddress );
2d970b ¤   ¤   strcat( userIDStr, ">" );
d99371 ¤   }
9f67c5 ¤
8c9900 ¤   PToCString( mPassphrase, passphraseC);
0867c5 ¤
6ecb3e ¤   mGeneratingKey ¤¤   = true;
0d0588 ¤   mKeyGenerationError¤= noErr;
0d67c5 ¤
96a14a ¤   // Force dimming of menu bar.
ca2711 ¤   LCommander::SetUpdateCommandStatus( TRUE );
770ca5 ¤   LEventDispatcher::GetCurrentEventDispatcher()->UpdateMenus();
161b52 ¤   ¤
70e2ba ¤   err = PGPGetPrefBoolean(gPrefRef, kPGPPrefFastKeyGen, &fastGen);
dfdd44 ¤   pgpAssertNoErr(err);
52af5a
640f18 ¤   err = PGPGetPrefData(gPrefRef, kPGPPrefAllowedAlgorithmsList,
9d5a42 ¤   ¤   ¤   ¤   &dataSize, &allowedAlgs);
94dd44 ¤   pgpAssertNoErr(err);
7bd9f8 ¤   numAllowed = dataSize / sizeof(PGPCipherAlgorithm);
3c67c5 ¤
22ffa2 ¤   if( PGPKeyRefIsValid( mMRKKey ) )
47c7a1 ¤   {
17d73c ¤   ¤   err = PGPNewSingletonKeySet(mMRKKey, &mrkKeySet);
05e919 ¤   ¤   pgpAssertNoErr(err);
f24ebf ¤   ¤   err = PGPGetPrefBoolean(gAdminPrefRef,
2d3815 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefEnforceIncomingADK, &enforce);
b2e919 ¤   ¤   pgpAssertNoErr(err);
cc9371 ¤   }
ec97e0 ¤   if( ( mAlgorithm != kPGPPublicKeyAlgorithm_RSA ) &&
e5b3bf ¤   ¤   PGPKeyRefIsValid( mRevokerKey ) )
--b121 0000ec17d4e401201af Page 31 of CKeyGenWizardDialog.cp
f7c7a1 ¤   {
8b05af ¤   ¤   err = PGPNewSingletonKeySet(mRevokerKey, &revokerKeySet);
28e919 ¤   ¤   pgpAssertNoErr(err);
4f9371 ¤   }
99cac5 ¤   err = PGPGenerateKey(¤  gPGPContext, &key,
064a18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeyGenParams(gPGPContext,·
aa0ddd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mAlgorithm, mSigningKeySize),
7426ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeyGenName(gPGPContext,·
9feea4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   userIDStr, strlen(userIDStr)),
9d300b ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeySetRef(gPGPContext,·
5fc925 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet()),
b1e466 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase(gPGPContext, passphraseC),
4473f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeyGenFast(gPGPContext, fastGen),
530a82 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOExpiration(gPGPContext, mExpirationDays),
614f58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPreferredAlgorithms(
65c017 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, allowedAlgs, numAllowed ),
b9940a ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEventHandler(gPGPContext,·
a8c483 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GenerateKeyCallback, this),
1c34f9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRefIsValid( mrkKeySet ) ?
305dfb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOAdditionalRecipientRequestKeySet(
7e1070 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext,·
74beea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mrkKeySet, enforce ? 0x80 : 0) :
4a526d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( gPGPContext ),
80f7be ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRefIsValid( revokerKeySet ) ?
32e78f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPORevocationKeySet( gPGPContext,
f2e7b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   revokerKeySet ) :
27526d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( gPGPContext ),
c55822 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(gPGPContext)
911b96 ¤   ¤   ¤   ¤   ¤   ¤   );
5c0f1a ¤   if( PGPKeySetRefIsValid( mrkKeySet ) )
9de5db ¤   ¤   PGPFreeKeySet( mrkKeySet );
1352fa ¤   if( PGPKeySetRefIsValid( revokerKeySet ) )
64aeca ¤   ¤   PGPFreeKeySet( revokerKeySet );
d567c5 ¤
f621be ¤   if(IsntNull(allowedAlgs))
3533d5 ¤   ¤   PGPDisposePrefData(gPrefRef, allowedAlgs);
1967c5 ¤
95d3cd ¤   mGeneratingKey = false;
8c67c5 ¤
33d6c1 ¤   // who knows why the lib returns nomem if
8d40c0 ¤   // the user aborts the generatekey....
96ddce ¤   // the world will never know...
6a6cdf ¤   if(err != kPGPError_OutOfMemory)
f9c7a1 ¤   {
a33c69 ¤   ¤   pgpAssert(IsntErr(err));
b27789 ¤   ¤   if( err )
045b34 ¤   ¤   {
c7b159 ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
5e0b68 ¤   ¤   ¤   ¤   ¤   ¤   kStringListResID, kKeyGenerationErrorStrIndex );
970fe4 ¤   ¤   }
869371 ¤   }
2967c5 ¤
19c8d0 ¤   if(IsntPGPError(err))
73c7a1 ¤   {
55c4b7 ¤   ¤   if( mAlgorithm == kPGPPublicKeyAlgorithm_DSA)
1f5b34 ¤   ¤   {
e33c7e ¤   ¤   ¤   PGPSubKeyRef subKey;
e287c7 ¤   ¤   ¤
888597 ¤   ¤   ¤   mGeneratingKey ¤¤   = true;
d43d0d ¤   ¤   ¤   mKeyGenerationError¤= noErr;
4f87c7 ¤   ¤   ¤
3da266 ¤   ¤   ¤   err = PGPGenerateSubKey(gPGPContext, &subKey,
1a7ab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeyGenMasterKey(gPGPContext, key),
8ac706 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeyGenParams(gPGPContext,·
5a20e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPublicKeyAlgorithm_ElGamal,
da3b96 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mEncryptKeySize),
648b9a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase(gPGPContext, passphraseC),
fa329f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOExpiration(gPGPContext,
bcc48c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mExpirationDays),
537064 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeyGenFast(gPGPContext, fastGen),
cd1914 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEventHandler(gPGPContext,·
0e1c59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GenerateKeyCallback,
--b600 000319225d4401201af Page 32 of CKeyGenWizardDialog.cp
1532b9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   this),
0c1369 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(gPGPContext)
5683c1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   );
e9f56f ¤   ¤   ¤   mGeneratingKey = false;
0f87c7 ¤   ¤   ¤
40b52e ¤   ¤   ¤   if(IsPGPError(err))
7af776 ¤   ¤   ¤   {
7afd18 ¤   ¤   ¤   ¤   PGPKeySetRef genKeySet;
272b85 ¤   ¤   ¤   ¤
443d17 ¤   ¤   ¤   ¤   if(err != kPGPError_OutOfMemory)
4572c3 ¤   ¤   ¤   ¤   {
4e0254 ¤   ¤   ¤   ¤   ¤   pgpAssert(IsntErr(err));
e095e5 ¤   ¤   ¤   ¤   ¤   if(err)
024859 ¤   ¤   ¤   ¤   ¤   {
53b177 ¤   ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
c51560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListResID,
a93a76 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeyGenerationErrorStrIndex);
82bfba ¤   ¤   ¤   ¤   ¤   }¤  ¤   ¤   ¤
892613 ¤   ¤   ¤   ¤   }
6d2600 ¤   ¤   ¤   ¤   // Make sure DSS key doesn't sit around naked without
16ff40 ¤   ¤   ¤   ¤   // its ElGamal buddy
9d2b85 ¤   ¤   ¤   ¤
a176d8 ¤   ¤   ¤   ¤   err = PGPNewSingletonKeySet(key, &genKeySet);
856f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
f42d29 ¤   ¤   ¤   ¤   err = PGPRemoveKeys( ·genKeySet,
e93b86 ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet() );
096f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
509a76 ¤   ¤   ¤   ¤   PGPFreeKeySet(genKeySet);
1da3a6 ¤   ¤   ¤   }
0e0fe4 ¤   ¤   }
ec1b52 ¤   ¤
0b4184 ¤   ¤   if(IsntPGPError(err))
cf5b34 ¤   ¤   {
4f5989 #if¤PGP_BUSINESS_SECURITY
ca5cf5 ¤   ¤   ¤   // Shall we sign and trust the Corporate key?
211175 ¤   ¤   ¤   if(mCorpKey)
56f776 ¤   ¤   ¤   {
1fe087 ¤   ¤   ¤   ¤   PGPUserIDRef¤   userID;
a6195f ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   metaCorp = FALSE;
23af5a
b0e15d ¤   ¤   ¤   ¤   err = PGPGetPrefBoolean(
55ff93 ¤   ¤   ¤   ¤   ¤   gAdminPrefRef, kPGPPrefMetaIntroducerCorp,
b0146b ¤   ¤   ¤   ¤   ¤   &metaCorp);
422675 ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserID(mCorpKey, &userID);
016f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
34be63 ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetMinimumRandomData();
6db69f ¤   ¤   ¤   ¤   err = PGPSignUserID(userID, key,
ab4d5c ¤   ¤   ¤   ¤   ¤   PGPOPassphrase(gPGPContext, passphraseC),
9d968e ¤   ¤   ¤   ¤   ¤   PGPOExpiration(gPGPContext, 0),
6a208e ¤   ¤   ¤   ¤   ¤   PGPOExportable(gPGPContext, FALSE),
19a8fc ¤   ¤   ¤   ¤   ¤   PGPOSigTrust(gPGPContext,
4a7563 ¤   ¤   ¤   ¤   ¤   ¤   metaCorp ? 2 : 0, kPGPKeyTrust_Complete),
cb7237 ¤   ¤   ¤   ¤   ¤   PGPOLastOption(gPGPContext));
be6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
5be173 ¤   ¤   ¤   ¤   err = PGPSetKeyTrust(mCorpKey, kPGPKeyTrust_Complete);
5e24cf ¤   ¤   ¤   ¤   // Valid errors can occur here which do not appear
1db986 ¤   ¤   ¤   ¤   // to have reasonable result codes, so we ignore errors
5d6a37 ¤   ¤   ¤   ¤   // in this case. ·For instance, an error will be returned
88ed0c ¤   ¤   ¤   ¤   // if the corporate key is on the keyring and is implicitly
29354e ¤   ¤   ¤   ¤   // trusted.
0ba3a6 ¤   ¤   ¤   }
827454 #endif
c28ae1 ¤   ¤   ¤   mParentKeyTable->ResyncTable(FALSE, TRUE);
1edc23 ¤   ¤   ¤   mParentKeyTable->RedrawTable();
da88a4 ¤   ¤   ¤   CPGPKeys::TheApp()->CreatedKey();
a3df4a ¤   ¤   ¤   CPGPKeys::TheApp()->CommitDefaultKeyrings();
4587c7 ¤   ¤   ¤
9ae1c7 ¤   ¤   ¤   good = true;
850fe4 ¤   ¤   }
95a375 ¤   ¤   if(good)
4e954c ¤   ¤   ¤   mGeneratedKey = key;
319371 ¤   }
--2f87 0013efd928f401201af Page 33 of CKeyGenWizardDialog.cp
e0af5a
0f8b2d ¤   pgpClearMemory( userIDStr, sizeof( userIDStr ) );
88ffcc ¤   pgpClearMemory( passphraseC, sizeof( passphraseC ) );
6a67c5 ¤
c80330 ¤   return( good );
93efe6 }
3eaf5a
--31b8 000c32ac43e401201b0 Page 1 of CKeyGenWizardDialog.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
35a4e5 ¤   $Id: CKeyGenWizardDialog.h,v 1.16.8.1 1998/11/12 03:07:58 heller Exp $
28f7f7 ____________________________________________________________________________*/
c87b7d #pragma once
3caf5a
a5f0a0 #include <LGADialog.h>
e3af5a
0fa076 #include "pgpKeys.h"
ce9f63 #include "pgpEncode.h"
52af5a
59151f class CKeyGenWizardView;
53fd31 class CKeyTable;
6b88da class LPushButton;
52af5a
a3af5a
69bb63 class CKeyGenWizardDialog¤  :¤  public LGADialog
e5bb36 {
945ed4 public:
bb01ec ¤   enum { class_ID = 'dKGW' };
2667c5 ¤
afeaff ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CKeyGenWizardDialog(LStream *inStream);
ca8c6a ¤   virtual¤¤   ¤   ¤   ¤   ¤   ~CKeyGenWizardDialog();
beaf5a
719143 ¤   virtual void¤   ¤   ¤   ¤   FindCommandStatus(CommandT inCommand,
0039fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled,
c32319 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outUsesMark,
d6a081 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark,
eb54e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Str255 outName);
301685 ¤   virtual¤void¤   ¤   ¤   ¤   ListenToMessage(MessageT inMessage,
3e93f8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *ioParam);
3267c5 ¤
f67855 ¤   virtual void¤   ¤   ¤   ¤   SetKeyTable(CKeyTable *keyTable);
f9af5a
63f323 ¤   static Boolean¤ ¤   ¤   ¤   IsGoodPassphrase(
809935 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param¤   passphrase,
f23ce7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param¤   confirmation,
9e5907 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   &confirmMatch,
62e38f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   &enforceLength,
39c5e5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   &goodLength,
0007b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   &goodQuality);
1ea2d3 protected:
cdaf5a
66101a ¤   virtual¤void¤   ¤   ¤   ¤   FinishCreateSelf(void);
dcaf5a
690fb9 private:
1baf5a
13fa45 ¤   // It is assumed that this enum is kept in user presentation order.
3fb818 ¤   typedef enum KeyGenerationView
fcc7a1 ¤   {
7fef02 ¤   ¤   kViewInvalid¤   ¤   ¤   = 1,
794bb0 ¤   ¤   kViewIntroduction,
890e2e ¤   ¤   kViewNameAndEmailAddress,
7e211b ¤   ¤   kViewKeyType,
b65524 ¤   ¤   kViewKeySize,
486308 ¤   ¤   kViewKeyExpiration,
b0c90a ¤   ¤   kViewKeyMRK,
c05b54 ¤   ¤   kViewSignCorp,
539352 ¤   ¤   kViewAddRevoker,
af74ff ¤   ¤   kViewKeyPassphrase,
5e6bb5 ¤   ¤   kViewKeyBadPassphrase,
e1f14b ¤   ¤   kViewGetRandomData,
0b6051 ¤   ¤   kViewGeneratingKey,
b936ca ¤   ¤   kViewSendToServer,
e83afe ¤   ¤   kViewConclusion,
1f7b4b ¤   ¤   kViewExit¤  ¤   ¤   // Not a real view
26b99e ¤   } KeyGenerationView;
c3af5a
--014f 00104537fbe401201b0 Page 2 of CKeyGenWizardDialog.h
e0af5a
69c88f ¤   KeyGenerationView¤  ¤   ¤   mCurrentView;
159324 ¤   CKeyGenWizardView¤  ¤   ¤   *mCurrentViewObj;
0303d6 ¤   CKeyTable¤  ¤   ¤   ¤   ¤   *mParentKeyTable;
46dbe2 ¤   PGPKeyRef¤  ¤   ¤   ¤   ¤   mGeneratedKey;¤ // invalid until post-gen
f1682e ¤   PGPKeyRef¤  ¤   ¤   ¤   ¤   mMRKKey;
36df40 ¤   PGPKeyRef¤  ¤   ¤   ¤   ¤   mCorpKey;
0ec00d ¤   PGPKeyRef¤  ¤   ¤   ¤   ¤   mRevokerKey;
0797c1 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mFinished;
eb4ad5 ¤   LPushButton¤¤   ¤   ¤   ¤   *mNextButton;
308176 ¤   LPushButton¤¤   ¤   ¤   ¤   *mPreviousButton;
d31a1b ¤   LPushButton¤¤   ¤   ¤   ¤   *mCancelButton;
eb5b0a ¤   Str255¤ ¤   ¤   ¤   ¤   ¤   mName;
ef39f0 ¤   Str255¤ ¤   ¤   ¤   ¤   ¤   mEmailAddress;
1aff94 ¤   UInt32¤ ¤   ¤   ¤   ¤   ¤   mEncryptKeySize;
dc8b46 ¤   UInt32¤ ¤   ¤   ¤   ¤   ¤   mSigningKeySize;
30b459 ¤   PGPPublicKeyAlgorithm¤  ¤   mAlgorithm;
232aec ¤   UInt32¤ ¤   ¤   ¤   ¤   ¤   mExpirationDays;
cb5be9 ¤   Str255¤ ¤   ¤   ¤   ¤   ¤   mPassphrase,
0f6bca ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mConfirmation;
5e9686 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mPassphraseMatched,
5c0467 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPassphraseGoodLength,
207414 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPassphraseGoodQuality,
235130 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPassphraseEnforceLength;
f8cffa ¤   PGPBoolean¤ ¤   ¤   ¤   ¤   mAllowRSAKeygen;
e5af5a
9e5db9 ¤   static Boolean¤ ¤   ¤   ¤   mGeneratingKey;
3ce575 ¤   static PGPError¤¤   ¤   ¤   mKeyGenerationError;
d367c5 ¤
66628e ¤   void¤   ¤   ¤   ¤   ¤   ¤   AdjustControlsForView(
155f6a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   KeyGenerationView theView);
c1d936 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   FinishedKeyGeneration(void)
20df21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( mFinished ); };
1c5d67 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   GenerateKey(void);
04c359 ¤   void¤   ¤   ¤   ¤   ¤   ¤   GotoNextView(void);
e8c784 ¤   void¤   ¤   ¤   ¤   ¤   ¤   GotoPreviousView(void);
9f2f71 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   LeaveCurrentView(KeyGenerationView newView);
3184b1 ¤   void¤   ¤   ¤   ¤   ¤   ¤   SwitchToView(¤  KeyGenerationView newView,
60f963 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean increment);
ee1b2b ¤   void¤   ¤   ¤   ¤   ¤   ¤   EnterView(KeyGenerationView newView);
57d90a ¤   Boolean¤¤   ¤   ¤   ¤   ¤   ValidateCurrentView(void);
fb67c5 ¤
30f84d ¤   static PGPError¤¤   ¤   ¤   GenerateKeyCallback(
92c87f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPContextRef¤  context,
8ee7a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent¤   ¤   *event,
051f47 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue¤   userValue);
8882f7 };
04af5a
--9f58 000ff4d2a03401201b1 Page 1 of CKeyInfoWindow.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
aafdff ¤   $Id: CKeyInfoWindow.cp,v 1.57.2.1.2.1 1998/11/12 03:07:59 heller Exp $
8bf7f7 ____________________________________________________________________________*/
b0af5a
3eb125 #include <LBevelButton.h>
c88708 #include <LCheckBox.h>
307c09 #include <LEditText.h>
f81628 #include <LGATabsControlImp.h>
06ec08 #include <LLittleArrows.h>
c04119 #include <LMultiPanelView.h>
5b40db #include <LRadioButton.h>
777b38 #include <LTableArrayStorage.h>
927c52 #include <LTableMonoGeometry.h>
f02ab7 #include <LTableSingleSelector.h>
fdb919 #include <LTabsControl.h>
79a94f #include <LTextGroupBox.h>
4849f7 #include <LProgressBar.h>
5bd797 #include <LPushButton.h>
0ede04 #include <LSlider.h>
20dd56 #include <PP_Messages.h>
6add06 #include <UDesktop.h>
0fe8ae #include <UDrawingUtils.h>
578f92 #include <UGAColorRamp.h>
0bffe3 #include <UGraphicUtils.h>
867c99 #include <URegistrar.h>
cbf8a6 #include <UTextTraits.h>
61af5a
b0d49e #include "CKeyInfoWindow.h"
f9f205 #include "CKeyWindow.h"
206ff8 #include "CKeyTable.h"
84b8cb #include "CPGPKeys.h"
fa4a92 #include "CPhotoUserID.h"
f84d6a #include "CGADurationEditField.h"
07c238 #include "CFingerprintField.h"
ae9dc2 #include "CWarningAlert.h"
2059c5 #include "CPGPStDialogHandler.h"
3a69be #include "CGAProgressDialog.h"
d076b7 #include "MacErrors.h"
2b0e9a #include "MacQuickDraw.h"
17bf4a #include "MacSecureMemory.h"
b985c2 #include "MacStrings.h"
ecf8d2 #include "PGPSharedEncryptDecrypt.h"
9c5dc0 #include "ResourceConstants.h"
70a02f #include "pgpClientLib.h"
6fc97b #include "pgpClientPrefs.h"
493991 #include "pgpAdminPrefs.h"
58c9be #include "pgpRandomPool.h"
6c3b50 #include "GetPassphrase.h"
9daf5a
0b0d08 #include "pgpMem.h"
c02f8d #include "pgpErrors.h"
354919 #include "pgpUtilities.h"
24af5a
067353 enum
8dbb36 {
51cb87 ¤   kNeverExpiresID¤¤   ¤   = 1,
7d3510 ¤   kRSATypeID,
97b122 ¤   kDSATypeID,
a254bd ¤   kTooManyWindowsID,
d52b7e ¤   kInvalidKeySetTrustID,
7ce850 ¤   kUnknownMRKID,
26e860 ¤   kSubkeysStrIndex,
37315c ¤   kADKStrIndex,
c75f56 ¤   kRevokerStrIndex,
94ce6a ¤   kSubkeyWrongSizeMsgStrIndex,
a31a1b ¤   kBadSubkeyExpirationMsgStrIndex,
ff855c ¤   kSubkeyAlreadyExpiredMsgStrIndex,
--d720 000be6b1589401201b1 Page 2 of CKeyInfoWindow.cp
2c508c ¤   kConfirmRemoveSubkeyStrIndex,
9ed882 ¤   kConfirmRemoveLastSubkeyStrIndex,
646484 ¤   kConfirmRevokeSubkeyStrIndex,
05bd94 ¤   kAdminKeySizeErrorStrIndex,
5f2508 ¤   kPassphraseChangedStrIndex,
42fd64 ¤   kEnterNewPhraseStrIndex,
d25fa1 ¤   kJoinButtonStrIndex,
165f98 ¤   kCreatingSubkeyStrIndex,
d5e2a4 ¤   kKeyRejoinedStrIndex,
70b523 ¤   kChangePassphraseButtonStrIndex
0a82f7 };
f0af5a
f38db4 const ResIDT¤   ¤   kKeyInfoWindowID¤   ¤   = 140;
547346 const ResIDT¤   ¤   kChangePassDialogID¤¤   = 136;
8f1a41 const ResIDT¤   ¤   kNewSubkeyDialogResID¤  = 137;
07af58 const ResIDT¤   ¤   kKeyInfoStringListID¤   = 1010;
caaf5a
0be62e const short¤¤   ¤   kNumTrustValues¤¤   ¤   =¤  3;
f0c51b const short¤¤   ¤   kNumValidityValues¤ ¤   =¤  3;
ea8d19 const Int16¤¤   ¤   kUnsupportedStringID¤   =¤  4;
6baf5a
bdd14c const ResIDT¤   ¤   kGeneralPanelViewResID¤ = 142;
9c8653 const ResIDT¤   ¤   kSubkeysPanelViewResID¤ = 143;
602ef4 const ResIDT¤   ¤   kADKPanelViewResID¤ ¤   = 144;
424f5b const ResIDT¤   ¤   kRevokerPanelViewResID¤ = 148;
22af5a
fbaf5a
8476b1 short¤  ¤   ¤   CKeyInfoWindow::sNumKeyInfoWindows¤ = 0;
0bb2e9 CKeyInfoWindow¤ *CKeyInfoWindow::sKeyInfoWindows[kMaxKeyInfoWindows];
5caf5a
3caf5a
c0b86d #pragma mark --- CKeyInfoPanelView ---
5faf5a
ba90d4 class CKeyInfoPanelView : ¤ public LView,
886686 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LCommander
fcbb36 {
ae5ed4 public:
5b67c5 ¤
9bff72 ¤   enum { class_ID = 'vKIP' };
6c1b52 ¤   ¤
d2fc90 ¤   ¤   ¤   ¤   ¤   CKeyInfoPanelView(LStream *inStream);
95b89c ¤   virtual¤¤   ¤   ~CKeyInfoPanelView();
c8af5a
be51e4 ¤   Boolean¤¤   ¤   HasChanged(void) { return( mChanged ); };
85dd78 ¤   virtual void¤   SavePanel(void);
5efb0f ¤   virtual void¤   SetInfo(PGPKeySetRef keySet, PGPKeyRef theKey,
bd7cd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean keyCanBeModified);
6267c5 ¤
81a2d3 protected:
d4af5a
cf0d6c ¤   PGPKeySetRef¤   mKeySet;
93ddaf ¤   PGPKeyRef¤  ¤   mKey;
20c4be ¤   Boolean¤¤   ¤   mKeyCanBeModified;
c9a424 ¤   Boolean¤¤   ¤   mChanged;
c64174 ¤   PGPKeyIterRef¤  mKeyIter;
2be58f ¤   PGPKeyListRef¤  mKeyList;
3782f7 };
f8af5a
e86f25 CKeyInfoPanelView::CKeyInfoPanelView(LStream *inStream)
0e25e5 ¤   : LView( inStream )
34bb36 {
85ccf5 ¤   mKeySet ¤   ¤   ¤   = kInvalidPGPKeySetRef;
7aefac ¤   mKey ¤  ¤   ¤   ¤   = kInvalidPGPKeyRef;
1e7ab9 ¤   mKeyCanBeModified¤  = TRUE;
7fd530 ¤   mChanged¤   ¤   ¤   = FALSE;
b75d3c ¤   mKeyIter ¤  ¤   ¤   = kInvalidPGPKeyIterRef;
42bcdd ¤   mKeyList¤   ¤   ¤   = kInvalidPGPKeyListRef;
70efe6 }
0eaf5a
9843a6 CKeyInfoPanelView::~CKeyInfoPanelView()
a3bb36 {
bed33d ¤   if( PGPKeyIterRefIsValid( mKeyIter ) )
--a349 000829530f8401201b1 Page 3 of CKeyInfoWindow.cp
f7c7a1 ¤   {
a7f7d9 ¤   ¤   PGPFreeKeyIter( mKeyIter );
70a03c ¤   ¤   mKeyIter = kInvalidPGPKeyIterRef;
8e9371 ¤   }
5f67c5 ¤
34c9e1 ¤   if( PGPKeyListRefIsValid( mKeyList ) )
08c7a1 ¤   {
9d6438 ¤   ¤   PGPFreeKeyList( mKeyList );
03aa7d ¤   ¤   mKeyList = kInvalidPGPKeyListRef;
719371 ¤   }
66efe6 }
8eaf5a
856d52 ¤   void
ab4dfa CKeyInfoPanelView::SetInfo(
9e215d ¤   PGPKeySetRef ¤  keySet,
a78c1a ¤   PGPKeyRef ¤ ¤   theKey,
b685b0 ¤   PGPBoolean ¤¤   keyCanBeModified)
cebb36 {
a061e0 ¤   PGPError¤   err;
3767c5 ¤
f3eb42 ¤   mKeySet¤¤   ¤   ¤   = keySet;
aa42e0 ¤   mKey ¤  ¤   ¤   ¤   = theKey;
4c943e ¤   mKeyCanBeModified¤  = keyCanBeModified;
b8af5a
28434f ¤   err = PGPOrderKeySet( keySet, kPGPAnyOrdering, &mKeyList );
408c1a ¤   pgpAssertNoErr( err );
b1b1f0 ¤   if( IsntPGPError( err ) )
bcc7a1 ¤   {
390694 ¤   ¤   err = PGPNewKeyIter( mKeyList, &mKeyIter );
6a9832 ¤   ¤   pgpAssertNoErr( err );
4386f8 ¤   ¤   if( IsntPGPError( err ) )
e35b34 ¤   ¤   {
37b48b ¤   ¤   ¤   (void) PGPKeyIterSeek( mKeyIter, theKey );
9c0fe4 ¤   ¤   }
b79371 ¤   }
e467c5 ¤
fcefe6 }
b0af5a
c95e8c ······void
a37e91 CKeyInfoPanelView::SavePanel(void)
11bb36 {
9befe6 }
28af5a
8ae231 #pragma mark --- CKeyPanelGeneral ---
d0af5a
dea087 class CKeyPanelGeneral : ¤  public CKeyInfoPanelView,
032717 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener
d0bb36 {
c85ed4 public:
91af5a
4aa113 ¤   enum { class_ID = 'vKIG' };
f7af5a
d1dd41 ¤   ¤   ¤   ¤   ¤   CKeyPanelGeneral(LStream *inStream);
2942c6 ¤   virtual¤¤   ¤   ~CKeyPanelGeneral(void);
5d67c5 ¤
e92e22 ¤   virtual void¤   ListenToMessage(MessageT inMessage, void *ioParam);
7add78 ¤   virtual void¤   SavePanel(void);
e7fb0f ¤   virtual void¤   SetInfo(PGPKeySetRef keySet, PGPKeyRef theKey,
c27cd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean keyCanBeModified);
2867c5 ¤
5ea2d3 protected:
e3af5a
a490d4 ¤   virtual¤void¤   FinishCreateSelf(void);
8567c5 ¤
2b0fb9 private:
ec92e6 ¤   virtual void¤   ChangePassphrase();
95af5a
3c2f4b ¤   enum
e8c7a1 ¤   {
b5df76 ¤   ¤   kKeyIDCaption¤  ¤   ¤   = 'eKID',
a69cf9 ¤   ¤   kCreationCaption¤   ¤   = 'cCre',
823c3d ¤   ¤   kValidityBox¤   ¤   ¤   = 'bVal',
--ba35 0009a45742b401201b1 Page 4 of CKeyInfoWindow.cp
ae7438 ¤   ¤   kTrustSlider¤   ¤   ¤   = 'sTru',
f86cfc ¤   ¤   kFingerprintCaption¤¤   = 'eFin',
0672e7 ¤   ¤   kEnabledCheckbox¤   ¤   = 'xEna',
f49fc2 ¤   ¤   kPassphraseButton¤  ¤   = 'bPas',
64ada1 ¤   ¤   kKeyTypeCaption¤¤   ¤   = 'cTyp',
0e1052 ¤   ¤   kExpiresCaption¤¤   ¤   = 'cExp',
93754a ¤   ¤   kSizeCaption¤   ¤   ¤   = 'cSiz',
2318d4 ¤   ¤   kCipherCaption¤ ¤   ¤   = 'cCyp',
d5e1aa ¤   ¤   kAxiomaticCheckbox¤ ¤   = 'xTru',
e62d98 ¤   ¤   kPhotoUserID¤   ¤   ¤   = 'pPID',
f0888b ¤   ¤   kNextPhotoButtonID¤ ¤   = 'Next',
3d42b6 ¤   ¤   kPrevPhotoButtonID¤ ¤   = 'Prev'
081b52 ¤   ¤
5062bd ¤   };
24af5a
fdd1bf ¤   PGPSharedKeyProperties¤ ¤   mKeyProperties;
4c67c5 ¤
6cbbd4 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mTrustChanged;
9967c5 ¤
4763d4 ¤   LStaticText¤¤   ¤   ¤   ¤   *mCreationCaption,
0c655a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mExpiresCaption,
6b1743 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mKeyTypeCaption,
ebd482 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mSizeCaption,
408106 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mCipherCaption;
481cac ¤   CFingerprintField¤  ¤   ¤   *mFingerprintCaption,
90dc18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mKeyIDCaption;
cfe7ce ¤   LCheckBox¤  ¤   ¤   ¤   ¤   *mEnabledCheckbox,
e8b5f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mAxiomaticCheckbox;
484bcc ¤   LSlider¤¤   ¤   ¤   ¤   ¤   *mTrustSlider;
c95d4e ¤   LProgressBar¤   ¤   ¤   ¤   *mValidityBox;
b79a8c ¤   LPushButton¤¤   ¤   ¤   ¤   *mPassphraseButton;
1311a0 ¤   CPhotoUserID¤   ¤   ¤   ¤   *mPhotoUserID;
52f125 ¤   LBevelButton¤   ¤   ¤   ¤   *mNextPhotoButton;
e56484 ¤   LBevelButton¤   ¤   ¤   ¤   *mPrevPhotoButton;
643c8a ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   mNumPhotoIDs;
f21f4e ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   mPhotoIDIndex;
6367c5 ¤
c75a58 ¤   void¤   ¤   ¤   ¤   ¤   ¤   SwitchPhoto(PGPUInt32 newPhotoIndex);
1167c7 ¤   void¤   ¤   ¤   ¤   ¤   ¤   UpdatePhotoStatus(PGPUserIDRef userID);
8382f7 };
6eaf5a
0caf5a
443469 CKeyPanelGeneral::CKeyPanelGeneral(LStream *inStream)
3fcda9 ¤   : CKeyInfoPanelView( inStream )
cdbb36 {
bf7183 ¤   mNumPhotoIDs¤   = 0;
43a2c9 ¤   mPhotoIDIndex¤  = 1;
7fefe6 }
e6af5a
a05525 CKeyPanelGeneral::~CKeyPanelGeneral()
49bb36 {
b2efe6 }
a1af5a
836d52 ¤   void
1f921e CKeyPanelGeneral::FinishCreateSelf(void)
b0bb36 {
91fecb ¤   CKeyInfoPanelView::FinishCreateSelf();
6367c5 ¤
7d2641 ¤   mTrustChanged = FALSE;
0c67c5 ¤
0911fe ¤   mKeyIDCaption =¤¤   ¤   (CFingerprintField *)FindPaneByID(kKeyIDCaption);
1fcf25 ¤   pgpAssertAddrValid(mKeyIDCaption,¤  ¤   VoidAlign);
c0d479 ¤   mKeyTypeCaption =¤  ¤   (LStaticText *)¤FindPaneByID(kKeyTypeCaption);
802e4c ¤   pgpAssertAddrValid(mKeyTypeCaption,¤¤   VoidAlign);
9e95d7 ¤   mCreationCaption =¤ ¤   (LStaticText *)¤FindPaneByID(kCreationCaption);
a4b9ed ¤   pgpAssertAddrValid(mCreationCaption,¤   VoidAlign);
950096 ¤   mSizeCaption =¤ ¤   ¤   (LStaticText *)¤FindPaneByID(kSizeCaption);
cfb81c ¤   pgpAssertAddrValid(mSizeCaption,¤   ¤   VoidAlign);
c28e2d ¤   mCipherCaption =¤   ¤   (LStaticText *)¤FindPaneByID(kCipherCaption);
6f15c3 ¤   pgpAssertAddrValid(mCipherCaption,¤ ¤   VoidAlign);
43df1e ¤   mExpiresCaption =¤  ¤   (LStaticText *)¤FindPaneByID(kExpiresCaption);
9ab5cb ¤   pgpAssertAddrValid(mExpiresCaption,¤¤   VoidAlign);
--63ce 000f57a84bf401201b1 Page 5 of CKeyInfoWindow.cp
960f89 ¤   mEnabledCheckbox =¤ ¤   (LCheckBox *)¤  FindPaneByID(kEnabledCheckbox);
ce826d ¤   pgpAssertAddrValid(mEnabledCheckbox,¤   VoidAlign);
c98f90 ¤   mTrustSlider =¤ ¤   ¤   (LSlider *)¤FindPaneByID(kTrustSlider);
e1f912 ¤   pgpAssertAddrValid(mTrustSlider,¤   ¤   VoidAlign);
6164ff ¤   mValidityBox =¤ ¤   ¤   (LProgressBar *)FindPaneByID(kValidityBox);
71070c ¤   pgpAssertAddrValid(mValidityBox,¤   ¤   VoidAlign);
4bd258 ¤   mPassphraseButton =¤¤   (LPushButton *)FindPaneByID(kPassphraseButton);
cb2a43 ¤   pgpAssertAddrValid(mPassphraseButton,¤  VoidAlign);
b40323 ¤   mAxiomaticCheckbox =¤   (LCheckBox *)¤  FindPaneByID(kAxiomaticCheckbox);
eda388 ¤   pgpAssertAddrValid(mAxiomaticCheckbox,¤ VoidAlign);
9c1034 ¤   mFingerprintCaption =¤  (CFingerprintField *)
edad41 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(kFingerprintCaption);
d26d7a ¤   pgpAssertAddrValid(mFingerprintCaption,¤VoidAlign);
dd34b9 ¤   mPhotoUserID = ¤¤   ¤   (CPhotoUserID *)FindPaneByID(kPhotoUserID);
04f8bb ¤   pgpAssertAddrValid(mPhotoUserID, ¤  ¤   VoidAlign);
56ff0e ¤   mNextPhotoButton = ¤¤   (LBevelButton *)FindPaneByID(kNextPhotoButtonID);
50defb ¤   pgpAssertAddrValid(mNextPhotoButton, ¤  VoidAlign);
880323 ¤   mPrevPhotoButton = ¤¤   (LBevelButton *)FindPaneByID(kPrevPhotoButtonID);
5f3927 ¤   pgpAssertAddrValid(mPrevPhotoButton, ¤  VoidAlign);
86af5a
ad5004 ¤   mPhotoUserID->Lock();
d0cd57 ¤   mNextPhotoButton->AddListener( this );
d4a25a ¤   mPrevPhotoButton->AddListener( this );
e021c4 ¤   SwitchTarget(mKeyIDCaption);
84efe6 }
f1af5a
dc6d52 ¤   void
dc14db CKeyPanelGeneral::SetInfo(
30215d ¤   PGPKeySetRef ¤  keySet,
1eaa63 ¤   PGPKeyRef ¤ ¤   key,
e985b0 ¤   PGPBoolean ¤¤   keyCanBeModified)
f4bb36 {
6dfb19 ¤   PGPError¤   ¤   err;
b9bbb8 ¤   Str255¤ ¤   ¤   pstr;
fcf0ba ¤   Str32¤  ¤   ¤   str2;
75811d ¤   size_t¤ ¤   ¤   len;
612dbc ¤   PGPInt32¤   ¤   keyStatus;
8fbfaa ¤   Int16¤  ¤   ¤   trust;
31c0ff ¤   PGPKeyID¤   ¤   keyID;
eada1f ¤   PGPTime¤¤   ¤   creation,
fde049 ¤   ¤   ¤   ¤   ¤   expiration;
a69088 ¤   PGPInt32¤   ¤   bits,
894ddf ¤   ¤   ¤   ¤   ¤   algorithm;
f667c5 ¤
19c182 ¤   CKeyInfoPanelView::SetInfo( keySet, key, keyCanBeModified );
ba67c5 ¤
d5b750 ¤   err = PGPSharedGetKeyProperties( key, NULL, &mKeyProperties );
e68c1a ¤   pgpAssertNoErr( err );
cc67c5 ¤
c69f4e ¤   if( mKeyProperties.isExpired || mKeyProperties.isRevoked )
11c7a1 ¤   {
953d13 ¤   ¤   keyCanBeModified = FALSE;
dc9371 ¤   }
7d67c5 ¤
fbf5c5 ¤   // Get the KeyID
62fa74 ¤   err = PGPGetKeyIDFromKey( key, &keyID );
868c1a ¤   pgpAssertNoErr( err );
b1b1f0 ¤   if( IsntPGPError( err ) )
73c7a1 ¤   {
78fb03 ¤   ¤   char¤   keyIDString[ kPGPMaxKeyIDStringSize ];
541b52 ¤   ¤
cca5a8 ¤   ¤   err = PGPGetKeyIDString( &keyID,
28a34a ¤   ¤   ¤   ¤   ¤   kPGPKeyIDString_Abbreviated, keyIDString);
9ee919 ¤   ¤   pgpAssertNoErr(err);
a38262 ¤   ¤   CToPString(keyIDString, pstr);
c5e6b1 ¤   ¤   if(pstr[0] > 10)
799be7 ¤   ¤   ¤   pstr[0] = 10;
ed87c7 ¤   ¤   ¤
346f59 ¤   ¤   mKeyIDCaption->SetDescriptor( pstr );
9f9371 ¤   }
6367c5 ¤
f58bc7 ¤   // Get the Fingerprint
--d145 000dd77479a401201b1 Page 6 of CKeyInfoWindow.cp
959234 ¤   CKeyInfoWindow::GetFingerprintString( pstr, key );
7fab05 ¤   mFingerprintCaption->SetDescriptor( pstr );
e567c5 ¤
1044e9 ¤   mEnabledCheckbox->SetValue( ! mKeyProperties.isDisabled );
c167c5 ¤
f3da22 ¤   // Get the Trust
9e60ad ¤   err = PGPGetKeyNumber(key, kPGPKeyPropTrust, &keyStatus);
7045f5 ¤   pgpAssert(!err);
bd265a ¤   switch(keyStatus & kPGPKeyTrust_Mask)
66c7a1 ¤   {
06108c ¤   ¤   case kPGPKeyTrust_Undefined:
e2a0f6 ¤   ¤   case kPGPKeyTrust_Unknown:
072d51 ¤   ¤   case kPGPKeyTrust_Never:
b39ae3 ¤   ¤   default:
18f690 ¤   ¤   ¤   trust = 0;
26cdcb ¤   ¤   ¤   break;
490aed ¤   ¤   case kPGPKeyTrust_Marginal:
3eac4c ¤   ¤   ¤   trust = 1;
a4cdcb ¤   ¤   ¤   break;
8baa5b ¤   ¤   case kPGPKeyTrust_Complete:
566c6c ¤   ¤   case kPGPKeyTrust_Ultimate:
624328 ¤   ¤   ¤   trust = 2;
45cdcb ¤   ¤   ¤   break;
d69371 ¤   }
5baf5a
d74c84 ¤   mTrustSlider->SetMaxValue(kNumTrustValues - 1);
6c5efd ¤   mTrustSlider->SetValue(trust);
ba67c5 ¤
0da282 ¤   // Get the Validity
7cbb79 ¤   err = PGPGetKeyNumber(key, kPGPKeyPropValidity, &keyStatus);
1b45f5 ¤   pgpAssert(!err);
57e1b2 ¤   switch(keyStatus)
ccc7a1 ¤   {
11bf24 ¤   ¤   case kPGPValidity_Unknown:
a6a5c5 ¤   ¤   case kPGPValidity_Invalid:
6f9ae3 ¤   ¤   default:
9bf690 ¤   ¤   ¤   trust = 0;
9acdcb ¤   ¤   ¤   break;
7aff6d ¤   ¤   case kPGPValidity_Marginal:
85ac4c ¤   ¤   ¤   trust = 1;
bfcdcb ¤   ¤   ¤   break;
335fdb ¤   ¤   case kPGPValidity_Complete:
1b4328 ¤   ¤   ¤   trust = 2;
71cdcb ¤   ¤   ¤   break;
4c9371 ¤   }
6eaf5a
13760b ¤   mValidityBox->SetMaxValue(kNumValidityValues - 1);
26c2d2 ¤   mValidityBox->SetValue(trust);
6867c5 ¤
750ea8 ¤   mAxiomaticCheckbox->SetValue(mKeyProperties.isAxiomatic ? 1 : 0);
079c12 ¤   if(mKeyProperties.isAxiomatic)
a7c7a1 ¤   {
6d6156 ¤   ¤   mTrustSlider->Disable();
089371 ¤   }
911b52 ¤   ¤
baf5bc ¤   // Get the Creation Date
e1d914 ¤   err = PGPGetKeyTime(key, kPGPKeyPropCreation, &creation);
a945f5 ¤   pgpAssert(!err);
c97b83 ¤   creation = PGPTimeToMacTime(creation);
e82b77 ¤   ::DateString(creation, shortDate, pstr, NULL);
6cc405 ¤   mCreationCaption->SetDescriptor(pstr);
fbf2da ·¤  ¤
b6ffc6 ¤   // Get the Expiration Date
9358be ¤   err = PGPGetKeyTime(key, kPGPKeyPropExpiration, &expiration);
5b45f5 ¤   pgpAssert(!err);
baf221 ¤   if(IsntErr(err) && expiration)
03c7a1 ¤   {
bdea3f ¤   ¤   expiration = PGPTimeToMacTime(expiration);
fa6398 ¤   ¤   ::DateString(expiration, shortDate, pstr, NULL);
cd9371 ¤   }
bc0e24 ¤   else
ddf24f ¤   ¤   ::GetIndString(pstr, kKeyInfoStringListID, kNeverExpiresID);
--05b7 0009cc5b95c401201b1 Page 7 of CKeyInfoWindow.cp
415c01 ¤   mExpiresCaption->SetDescriptor(pstr);
7467c5 ¤
93dbf8 ¤   // Get the Algorithm ID
5f32fc ¤   err = PGPGetKeyNumber(key, kPGPKeyPropAlgID, &algorithm);
e645f5 ¤   pgpAssert(!err);
1ce5aa ¤   switch(algorithm)
fec7a1 ¤   {
07f4d2 ¤   ¤   case kPGPPublicKeyAlgorithm_RSA:
cbfdba ¤   ¤   case kPGPPublicKeyAlgorithm_RSAEncryptOnly:
cb1dd8 ¤   ¤   case kPGPPublicKeyAlgorithm_RSASignOnly:
a49c2e ¤   ¤   ¤   ::GetIndString(pstr, kKeyInfoStringListID, kRSATypeID);
abcdcb ¤   ¤   ¤   break;
a07b0a ¤   ¤   case kPGPPublicKeyAlgorithm_DSA:
c73672 ¤   ¤   case kPGPPublicKeyAlgorithm_ElGamal:¤   // Technically not
058e3b ¤   ¤   ¤   ::GetIndString(pstr, kKeyInfoStringListID, kDSATypeID);
17cdcb ¤   ¤   ¤   break;
109ae3 ¤   ¤   default:
9a7eaf ¤   ¤   ¤   pgpDebugPStr("\pUnknown algorithm");
e9cdcb ¤   ¤   ¤   break;
d49371 ¤   }
35c852 ¤   mKeyTypeCaption->SetDescriptor(pstr);
0167c5 ¤
bfecf5 ¤   // Get the Key Size
312052 ¤   err = PGPGetKeyNumber(key, kPGPKeyPropBits, &bits);
b3dd44 ¤   pgpAssertNoErr(err);
5bba47 ¤   ::NumToString(bits, pstr);
4aa3d8 ¤   if(algorithm == kPGPPublicKeyAlgorithm_DSA)
a1c7a1 ¤   {
984a63 ¤   ¤   PGPSubKeyRef¤   subKey;
b91b52 ¤   ¤
a3a31b ¤   ¤   err = PGPKeyIterNextSubKey(mKeyIter, &subKey);
e2bc11 ¤   ¤   if(IsntPGPError(err) && IsntNull(subKey))
4d5b34 ¤   ¤   {
237835 ¤   ¤   ¤   err = PGPGetSubKeyNumber(subKey, kPGPKeyPropBits,
70f430 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &bits);
49524f ¤   ¤   ¤   pgpAssertNoErr(err);
71ee5b ¤   ¤   ¤   ::NumToString(bits, str2);
2156d1 ¤   ¤   ¤   AppendPString("\p/", str2);
c3ec1f ¤   ¤   ¤   AppendPString(pstr, str2);
a8dbea ¤   ¤   ¤   CopyPString(str2, pstr);
610fe4 ¤   ¤   }
ea9371 ¤   }
ec4e57 ¤   mSizeCaption->SetDescriptor(pstr);
ae67c5 ¤
dc24bc ¤   // Get the Preferred Cipher
acc7a1 ¤   {
e09401 ¤   ¤   PGPByte¤¤   propBuff[128];¤
c31b52 ¤   ¤
4c5a53 ¤   ¤   err = PGPGetKeyPropertyBuffer(key, kPGPKeyPropPreferredAlgorithms,
e061bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( propBuff ), propBuff, &len);
b2e919 ¤   ¤   pgpAssertNoErr(err);
0f7d98 ¤   ¤   if ( IsntPGPError( err ) )
9a5b34 ¤   ¤   {
b325db ¤   ¤   ¤   if(len >= sizeof(PGPCipherAlgorithm))
3ef776 ¤   ¤   ¤   {
bde6b9 ¤   ¤   ¤   ¤   UInt32¤ prefAlg = *(PGPCipherAlgorithm const *)&propBuff[0];
212b85 ¤   ¤   ¤   ¤
8679c6 ¤   ¤   ¤   ¤   pgpAssert((prefAlg >= kPGPCipherAlgorithm_None) &&
5ce834 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (prefAlg <= kPGPCipherAlgorithm_CAST5));
fe5e3a ¤   ¤   ¤   ¤   ::GetIndString(pstr, kAlgorithmStringsID, prefAlg);
dca3a6 ¤   ¤   ¤   }
29bb8c ¤   ¤   ¤   else
0ee459 ¤   ¤   ¤   ¤   ::GetIndString(pstr, kAlgorithmStringsID, kIDEAString);
cb7151 ¤   ¤   ¤   mCipherCaption->SetDescriptor(pstr);
3d0fe4 ¤   ¤   }
f59371 ¤   }
64af5a
625521 ¤   if( mKeyProperties.isAxiomatic || ! keyCanBeModified )
b7c7a1 ¤   {
b9a6d2 ¤   ¤   mEnabledCheckbox->Hide();
1d6156 ¤   ¤   mTrustSlider->Disable();
9c9371 ¤   }
--002b 000cfa10083401201b1 Page 8 of CKeyInfoWindow.cp
e0af5a
0362c1 ¤   // Set the Passphrase button status
872aaa ¤   if( ! mKeyProperties.isSecret || ! keyCanBeModified )
86c7a1 ¤   {
82d155 ¤   ¤   mPassphraseButton->Hide();
d164d8 ¤   ¤   mAxiomaticCheckbox->Hide();
339371 ¤   }
1200c1 ¤   else if( mKeyProperties.isSplit )
8ac7a1 ¤   {
d64872 ¤   ¤   ::GetIndString(pstr, kKeyInfoStringListID, kJoinButtonStrIndex);
b624e5 ¤   ¤   mPassphraseButton->SetDescriptor( pstr );
3e9371 ¤   }
fd67c5 ¤
3b0c92 ¤   // Count photo user ID's
ed6e8e ¤   err = PGPKeyIterRewindUserID( mKeyIter );
728c1a ¤   pgpAssertNoErr( err );
8067c5 ¤
eeb7df ¤   while( IsntPGPError( err ) )
c3c7a1 ¤   {
ebae2e ¤   ¤   PGPUserIDRef¤   userID;
4e1b52 ¤   ¤
e7fd7f ¤   ¤   err = PGPKeyIterNextUserID( mKeyIter, &userID );
6c86f8 ¤   ¤   if( IsntPGPError( err ) )
0c5b34 ¤   ¤   {
f9a907 ¤   ¤   ¤   PGPBoolean¤ isAttributeID;
f687c7 ¤   ¤   ¤
e90cee ¤   ¤   ¤   err = PGPGetUserIDBoolean( userID, kPGPUserIDPropIsAttribute,
3ff81a ¤   ¤   ¤   ¤   ¤   ¤   ¤   &isAttributeID );
ad144d ¤   ¤   ¤   pgpAssertNoErr( err );
0687c7 ¤   ¤   ¤
72a3d8 ¤   ¤   ¤   if( IsntPGPError( err ) && isAttributeID )
e2f776 ¤   ¤   ¤   {
a49e3d ¤   ¤   ¤   ¤   PGPInt32¤   attributeType;
bd2b85 ¤   ¤   ¤   ¤
c1fb81 ¤   ¤   ¤   ¤   err = PGPGetUserIDNumber( userID,
a47d7f ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPUserIDPropAttributeType, &attributeType );
1755be ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
df2b85 ¤   ¤   ¤   ¤
b55bf0 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) &&
7b70e4 ¤   ¤   ¤   ¤   ¤   isAttributeID == kPGPAttribute_Image )
b972c3 ¤   ¤   ¤   ¤   {
6a07ed ¤   ¤   ¤   ¤   ¤   mNumPhotoIDs++;
e92613 ¤   ¤   ¤   ¤   }
c3a3a6 ¤   ¤   ¤   }
25ec70 ¤   ¤   }¤  ¤
769371 ¤   }
da67c5 ¤
f0713c ¤   if( mNumPhotoIDs < 2 )
a1c7a1 ¤   {
b7e5a4 ¤   ¤   mNextPhotoButton->Hide();
1cda7e ¤   ¤   mPrevPhotoButton->Hide();
4e9371 ¤   }
a967c5 ¤
5efc87 ¤   if( mNumPhotoIDs >= 1 )
7ec7a1 ¤   {
337b20 ¤   ¤   SwitchPhoto( 1 );
529371 ¤   }
8c0e24 ¤   else
d6c7a1 ¤   {
25ae2e ¤   ¤   PGPUserIDRef¤   userID;
6a1b52 ¤   ¤
5aa78c ¤   ¤   err = PGPGetPrimaryUserID( key, &userID );
cc9832 ¤   ¤   pgpAssertNoErr( err );
ab1b52 ¤   ¤
216719 ¤   ¤   UpdatePhotoStatus( userID );
3d9371 ¤   }
64af5a
2530af ¤   mPassphraseButton->AddListener( this );
dd923a ¤   mAxiomaticCheckbox->AddListener( this );
618c16 ¤   mEnabledCheckbox->AddListener( this );
94f8db ¤   mTrustSlider->AddListener(this);
cfefe6 }
--cfdd 0009f87f535401201b1 Page 9 of CKeyInfoWindow.cp
e0af5a
2c6d52 ¤   void
b07d8a CKeyPanelGeneral::ChangePassphrase()
e2bb36 {
a17d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
43435c ¤   PGPBoolean¤ ¤   ¤   shared = FALSE;
e6b2bd ¤   CSecureCString256¤  oldPhrase;
892858 ¤   char¤   ¤   ¤   ¤   *newPhrase = NULL;
a6635f ¤   PGPByte¤¤   ¤   ¤   *oldPassKey = NULL;
6f21c8 ¤   PGPSize¤¤   ¤   ¤   oldPassKeySize;
af3ddc ¤   PGPInt32¤   ¤   ¤   algorithm;
7f9fca ¤   Str255¤ ¤   ¤   ¤   pstr;
81885b ¤   char¤   ¤   ¤   ¤   cstr[256];
37be29 #if PGP_BUSINESS_SECURITY
0d1771 ¤   PGPBoolean¤ ¤   ¤   enforceLength,
8493e2 ¤   ¤   ¤   ¤   ¤   ¤   enforceQuality;
bbd3b4 ¤   PGPUInt32¤  ¤   ¤   minLength,
5d9481 ¤   ¤   ¤   ¤   ¤   ¤   minQuality;
ee7454 #endif
9867c5 ¤
f066ab ¤   err = GetPassForKey( mKey, &shared, oldPhrase,
06cc4b ¤   ¤   ¤   ¤   ¤   ¤   &oldPassKey, &oldPassKeySize );
c27f7d ¤   if( IsPGPError( err ) )
06262d ¤   ¤   goto done;
6a67c5 ¤
78be29 #if PGP_BUSINESS_SECURITY
67153e ¤   err = PGPGetPrefBoolean( gAdminPrefRef, kPGPPrefEnforceMinChars,
e65cbd ¤   ¤   ¤   &enforceLength);
2d8c1a ¤   pgpAssertNoErr( err );
311714 ¤   err = PGPGetPrefBoolean( gAdminPrefRef, kPGPPrefEnforceMinQuality,
392052 ¤   ¤   ¤   &enforceQuality);
1f8c1a ¤   pgpAssertNoErr( err );
67aa31 ¤   err = PGPGetPrefNumber( gAdminPrefRef, kPGPPrefMinChars,
e8dc59 ¤   ¤   ¤   &minLength);
ce8c1a ¤   pgpAssertNoErr( err );
a1d9a0 ¤   err = PGPGetPrefNumber( gAdminPrefRef, kPGPPrefMinQuality,
7b81f8 ¤   ¤   ¤   &minQuality);
488c1a ¤   pgpAssertNoErr( err );
567454 #endif
16af5a
2f9dfc ¤   GetIndString( pstr, kKeyInfoStringListID, kEnterNewPhraseStrIndex );
cd5e59 ¤   PToCString( pstr, cstr );
cf33e8 ¤   err = PGPConfirmationPassphraseDialog( gPGPContext,
96a1c4 ¤   ¤   ¤   PGPOUIDialogPrompt( gPGPContext, cstr ),
a1eb5d ¤   ¤   ¤   PGPOUIOutputPassphrase( gPGPContext, &newPhrase ),
58be29 #if PGP_BUSINESS_SECURITY
c509c6 ¤   ¤   ¤   enforceLength ?
06031a ¤   ¤   ¤   ¤   PGPOUIMinimumPassphraseLength(
7dc1bf ¤   ¤   ¤   ¤   ¤   gPGPContext, minLength ) :
c09c21 ¤   ¤   ¤   ¤   PGPONullOption( gPGPContext ),
6e8c2f ¤   ¤   ¤   enforceQuality ?
e2d870 ¤   ¤   ¤   ¤   PGPOUIMinimumPassphraseQuality(
bc600a ¤   ¤   ¤   ¤   ¤   gPGPContext, minQuality ) :
649c21 ¤   ¤   ¤   ¤   PGPONullOption( gPGPContext ),
cb7454 #endif
a63dc8 ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
eb67c5 ¤
137f7d ¤   if( IsPGPError( err ) )
9b262d ¤   ¤   goto done;
9667c5 ¤
dae77c ¤   err = PGPChangePassphrase( mKey, shared ?
f01ebc ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, oldPassKey, oldPassKeySize ) :
c1ce7d ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, oldPhrase ),
02cb9f ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, newPhrase ),
016f55 ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
637f7d ¤   if( IsPGPError( err ) )
26262d ¤   ¤   goto done;
61b46b ¤   err = PGPGetKeyNumber( mKey, kPGPKeyPropAlgID, &algorithm );
337f7d ¤   if( IsPGPError( err ) )
67262d ¤   ¤   goto done;
76a3d8 ¤   if(algorithm == kPGPPublicKeyAlgorithm_DSA)
9fc7a1 ¤   {
--ad1b 0001741b7a4401201b1 Page 10 of CKeyInfoWindow.cp
0bed3c ¤   ¤   PGPKeyIterRef¤  ¤   keyIter;
78efe1 ¤   ¤   PGPSubKeyRef¤   ¤   subKey;
341b52 ¤   ¤
d02771 ¤   ¤   err = PGPNewKeyIter( CPGPKeys::TheApp()->GetKeyList(), &keyIter );
2ed223 ¤   ¤   if( IsPGPError( err ) )
6b1dc4 ¤   ¤   ¤   goto done;
c5952b ¤   ¤   PGPKeyIterSeek( keyIter, mKey );
7f87e5 ¤   ¤   while( IsntPGPError ( err ) &&
1f97c1 ¤   ¤   ¤   IsntPGPError( PGPKeyIterNextSubKey( keyIter, &subKey ) ) &&
3c1556 ¤   ¤   ¤   IsntNull( subKey ) )
945b34 ¤   ¤   {
c7ae19 ¤   ¤   ¤   err = PGPChangeSubKeyPassphrase( subKey, shared ?
f91ebc ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, oldPassKey, oldPassKeySize ) :
cbce7d ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, oldPhrase ),
b5cb9f ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, newPhrase ),
c86f55 ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
860fe4 ¤   ¤   }
1210a7 ¤   ¤   PGPFreeKeyIter( keyIter );
a39371 ¤   }
9eb1f0 ¤   if( IsntPGPError( err ) )
74c7a1 ¤   {
3d75b4 ¤   ¤   CWarningAlert::Display( kWACautionAlertType, kWAOKStyle,
92af21 ¤   ¤   ¤   ¤   ¤   ¤   kKeyInfoStringListID,
1de751 ¤   ¤   ¤   ¤   ¤   ¤   shared ?¤   kKeyRejoinedStrIndex¤   :
aa685d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPassphraseChangedStrIndex );
f19371 ¤   }
d5af5a
3a48b2 ¤   mChanged = TRUE;
88dfa4 ¤   mKeyProperties.isAxiomatic = TRUE;
0593ba ¤   mAxiomaticCheckbox->SetValue(1);
4bc6fb ¤   if( shared )
17c7a1 ¤   {
c16ba8 ¤   ¤   GetIndString( pstr, kKeyInfoStringListID, kChangePassphraseButtonStrInd¶
0e31c3 ex );
b024e5 ¤   ¤   mPassphraseButton->SetDescriptor( pstr );
579371 ¤   }
2bb38c done:
530d8d ¤   if( IsntNull( oldPassKey ) )
200720 ¤   ¤   PGPFreeData( oldPassKey );
3ff476 ¤   if( IsntNull( newPhrase ) )
5cfcad ¤   ¤   PGPFreeData( newPhrase );
8c830f ¤   return;
a7efe6 }
02af5a
716d52 ¤   void
0c6fa8 CKeyPanelGeneral::ListenToMessage(MessageT inMessage, void *ioParam)
b2bb36 {
814968 ¤   Int32 value;
6567c5 ¤
fee04e ¤   value = *(Int32 *)ioParam;
8526d0 ¤   switch(inMessage)
61c7a1 ¤   {
a93fbb ¤   ¤   case kTrustSlider:
28053b ¤   ¤   ¤   mTrustChanged = TRUE;
d4cd3e ¤   ¤   ¤   mChanged = TRUE;
f7cdcb ¤   ¤   ¤   break;
b0bd40 ¤   ¤   case kEnabledCheckbox:
07cd3e ¤   ¤   ¤   mChanged = TRUE;
20cdcb ¤   ¤   ¤   break;
4bb834 ¤   ¤   case kPassphraseButton:
fff7ce ¤   ¤   ¤   ChangePassphrase();
0bcdcb ¤   ¤   ¤   break;
a91b52 ¤   ¤
7bb71d ¤   ¤   case kAxiomaticCheckbox:
aecd3e ¤   ¤   ¤   mChanged = TRUE;
4e741a ¤   ¤   ¤   if(value != 0)
10f776 ¤   ¤   ¤   {
5c59d3 ¤   ¤   ¤   ¤   mTrustSlider->Disable();
f92778 ¤   ¤   ¤   ¤   mTrustSlider->SetValue(kNumTrustValues - 1);
165488 ¤   ¤   ¤   ¤   mValidityBox->SetValue(kNumValidityValues - 1);
6f754f ¤   ¤   ¤   ¤   mEnabledCheckbox->Hide();
17a3a6 ¤   ¤   ¤   }
--1bf4 00013180cc3401201b1 Page 11 of CKeyInfoWindow.cp
b1bb8c ¤   ¤   ¤   else
89f776 ¤   ¤   ¤   {
8b1a54 ¤   ¤   ¤   ¤   mTrustSlider->Enable();
396374 ¤   ¤   ¤   ¤   mTrustSlider->SetValue(0);
999d74 ¤   ¤   ¤   ¤   mValidityBox->SetValue(0);
269963 ¤   ¤   ¤   ¤   mEnabledCheckbox->Show();
e9a3a6 ¤   ¤   ¤   }
6884e7 ¤   ¤   ¤   mTrustSlider->Draw(nil);
e1e936 ¤   ¤   ¤   mValidityBox->Draw(nil);
cccdcb ¤   ¤   ¤   break;
a587c7 ¤   ¤   ¤
f2290b ¤   ¤   case kNextPhotoButtonID:
f32852 ¤   ¤   ¤   SwitchPhoto( mPhotoIDIndex + 1 );
81cdcb ¤   ¤   ¤   break;
7caf5a
845c08 ¤   ¤   case kPrevPhotoButtonID:
03709f ¤   ¤   ¤   SwitchPhoto( mPhotoIDIndex - 1 );
aecdcb ¤   ¤   ¤   break;
629371 ¤   }
49efe6 }
67af5a
206d52 ¤   void
55f82e CKeyPanelGeneral::UpdatePhotoStatus(PGPUserIDRef userID)
09bb36 {
df3cbe ¤   PGPError¤   ¤   ¤   ¤   err = kPGPError_NoErr;
d3cc80 ¤   PGPPhotoUserIDStatus¤   status;
4767c5 ¤
db7dd6 ¤   status = kPGPPhotoUserIDStatus_Normal;
7b67c5 ¤
d88296 ¤   if( mKeyProperties.isRevoked )
b9c7a1 ¤   {
492911 ¤   ¤   status = kPGPPhotoUserIDStatus_Revoked;
3e9371 ¤   }
6ebfa6 ¤   else if( mKeyProperties.isExpired )
e8c7a1 ¤   {
037bd1 ¤   ¤   status = kPGPPhotoUserIDStatus_Expired;
cf9371 ¤   }
77ad90 ¤   else if( ! mKeyProperties.isAxiomatic )
c3c7a1 ¤   {
52927a ¤   ¤   PGPInt32¤   temp;
3b70d1 ¤   ¤   PGPValidity¤validity;
68324b ¤   ¤   PGPBoolean¤ marginalIsInvalid;
d31b52 ¤   ¤
3ae148 ¤   ¤   (void) PGPGetUserIDNumber( userID, kPGPUserIDPropValidity, &temp );
a29832 ¤   ¤   pgpAssertNoErr( err );
a21b52 ¤   ¤
479721 ¤   ¤   validity = (PGPValidity) temp;
921b52 ¤   ¤
d1727b ¤   ¤   if( validity == kPGPValidity_Complete )
c65b34 ¤   ¤   {
3634fc ¤   ¤   ¤   status = kPGPPhotoUserIDStatus_Normal;
da0fe4 ¤   ¤   }
ddc755 ¤   ¤   else if( validity == kPGPValidity_Marginal )
ff5b34 ¤   ¤   {
949b66 ¤   ¤   ¤   err = PGPGetPrefBoolean( gPrefRef, kPGPPrefMarginalIsInvalid,
e53c73 ¤   ¤   ¤   ¤   ¤   ¤   &marginalIsInvalid);
8b55be ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
9287c7 ¤   ¤   ¤
e8b0a0 ¤   ¤   ¤   if( marginalIsInvalid )
1cf776 ¤   ¤   ¤   {
c01c3b ¤   ¤   ¤   ¤   status = kPGPPhotoUserIDStatus_NoValidity;
bfa3a6 ¤   ¤   ¤   }
bf0fe4 ¤   ¤   }
0d0e1d ¤   ¤   else
315b34 ¤   ¤   {
351b00 ¤   ¤   ¤   status = kPGPPhotoUserIDStatus_NoValidity;
c20fe4 ¤   ¤   }
959371 ¤   }
3b67c5 ¤
586a2d ¤   mPhotoUserID->SetStatus( status );
25efe6 }
1367c5 ¤
--36dc 000e7c67239401201b1 Page 12 of CKeyInfoWindow.cp
3b6d52 ¤   void
ef71e7 CKeyPanelGeneral::SwitchPhoto(PGPUInt32 newPhotoIndex)
86bb36 {
d5fb19 ¤   PGPError¤   ¤   err;
10f5cb ¤   PGPUInt32¤  ¤   curPhotoIndex = 0;
253f10 ¤   PGPUserIDRef¤   userID = kInvalidPGPUserIDRef;
f31b52 ¤   ¤
a61edc ¤   if( newPhotoIndex < 1 || newPhotoIndex > mNumPhotoIDs )
3899bf ¤   ¤   return;
0f1b52 ¤   ¤
6f4ea5 ¤   mPhotoUserID->ClearPicture();
7967c5 ¤
1a6e8e ¤   err = PGPKeyIterRewindUserID( mKeyIter );
a38c1a ¤   pgpAssertNoErr( err );
7867c5 ¤
10b7df ¤   while( IsntPGPError( err ) )
0ac7a1 ¤   {
d2fd7f ¤   ¤   err = PGPKeyIterNextUserID( mKeyIter, &userID );
6b86f8 ¤   ¤   if( IsntPGPError( err ) )
a65b34 ¤   ¤   {
c8a907 ¤   ¤   ¤   PGPBoolean¤ isAttributeID;
9287c7 ¤   ¤   ¤
1e0cee ¤   ¤   ¤   err = PGPGetUserIDBoolean( userID, kPGPUserIDPropIsAttribute,
7bf81a ¤   ¤   ¤   ¤   ¤   ¤   ¤   &isAttributeID );
a5144d ¤   ¤   ¤   pgpAssertNoErr( err );
d687c7 ¤   ¤   ¤
fda3d8 ¤   ¤   ¤   if( IsntPGPError( err ) && isAttributeID )
5ef776 ¤   ¤   ¤   {
409e3d ¤   ¤   ¤   ¤   PGPInt32¤   attributeType;
2f2b85 ¤   ¤   ¤   ¤
4dfb81 ¤   ¤   ¤   ¤   err = PGPGetUserIDNumber( userID,
917d7f ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPUserIDPropAttributeType, &attributeType );
7c55be ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
822b85 ¤   ¤   ¤   ¤
7e5bf0 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) &&
2a70e4 ¤   ¤   ¤   ¤   ¤   isAttributeID == kPGPAttribute_Image )
2072c3 ¤   ¤   ¤   ¤   {
c49c2d ¤   ¤   ¤   ¤   ¤   ++curPhotoIndex;
a6ae30 ¤   ¤   ¤   ¤   ¤
68c38c ¤   ¤   ¤   ¤   ¤   if( curPhotoIndex == newPhotoIndex )
924859 ¤   ¤   ¤   ¤   ¤   {
dc00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
8c1c89 ¤   ¤   ¤   ¤   ¤   }
752613 ¤   ¤   ¤   ¤   }
44a3a6 ¤   ¤   ¤   }
24ec70 ¤   ¤   }¤  ¤
589371 ¤   }
f1af5a
869830 ¤   if( IsntPGPError( err ) &&
7c7a55 ¤   ¤   PGPUserIDRefIsValid( userID ) )
bcc7a1 ¤   {
008c09 ¤   ¤   char¤   temp;
02ea97 ¤   ¤   PGPSize¤bufferSize;
771b52 ¤   ¤
b5b1f7 ¤   ¤   // get length of photo id buffer
cce6fb ¤   ¤   (void) PGPGetUserIDStringBuffer( userID,
a3f679 ¤   ¤   ¤   ¤   ¤   kPGPUserIDPropAttributeData, 1, &temp, &bufferSize );
7caf5a
28f364 ¤   ¤   if( bufferSize > 0 )
e25b34 ¤   ¤   {
336b0e ¤   ¤   ¤   void¤   *buffer;
7c87c7 ¤   ¤   ¤
c4b69d ¤   ¤   ¤   buffer = PGPNewData(gPGPMemoryMgr, bufferSize, 0);
3cc2c8 ¤   ¤   ¤   if( IsntNull( buffer ) )
f0f776 ¤   ¤   ¤   {
df7116 ¤   ¤   ¤   ¤   err = PGPGetUserIDStringBuffer( userID,
4f195f ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPUserIDPropAttributeData,
002e36 ¤   ¤   ¤   ¤   ¤   ¤   ¤   bufferSize, (char *) buffer, &bufferSize );
875565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
ca72c3 ¤   ¤   ¤   ¤   {
c2e008 ¤   ¤   ¤   ¤   ¤   err = MacErrorToPGPError( mPhotoUserID->SetPhotoData(
e74c3d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, buffer, bufferSize, FALSE ) );
--1ae0 000ccb319dc401201b1 Page 13 of CKeyInfoWindow.cp
935bf2 ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
c5ae30 ¤   ¤   ¤   ¤   ¤
586ca0 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
4a4859 ¤   ¤   ¤   ¤   ¤   {
5765ca ¤   ¤   ¤   ¤   ¤   ¤   UpdatePhotoStatus( userID );
951c89 ¤   ¤   ¤   ¤   ¤   }
a42613 ¤   ¤   ¤   ¤   }
ce2b85 ¤   ¤   ¤   ¤
513d1b ¤   ¤   ¤   ¤   PGPFreeData( buffer );
5ca3a6 ¤   ¤   ¤   }
eabb8c ¤   ¤   ¤   else
abf776 ¤   ¤   ¤   {
acbfb4 ¤   ¤   ¤   ¤   err = kPGPError_OutOfMemory;
60a3a6 ¤   ¤   ¤   }
a787c7 ¤   ¤   ¤
45144d ¤   ¤   ¤   pgpAssertNoErr( err );
500fe4 ¤   ¤   }
a99371 ¤   }
8a67c5 ¤
3b8eb5 ¤   mPhotoIDIndex = newPhotoIndex;
4767c5 ¤
1719c8 ¤   if( mPhotoIDIndex == 1 )
55c7a1 ¤   {
c82852 ¤   ¤   mPrevPhotoButton->Disable();
1d9371 ¤   }
ce0e24 ¤   else
f1c7a1 ¤   {
470c06 ¤   ¤   mPrevPhotoButton->Enable();
fa9371 ¤   }
2d67c5 ¤
8dafef ¤   if( mPhotoIDIndex == mNumPhotoIDs )
cac7a1 ¤   {
05e14d ¤   ¤   mNextPhotoButton->Disable();
d79371 ¤   }
bb0e24 ¤   else
a3c7a1 ¤   {
f36739 ¤   ¤   mNextPhotoButton->Enable();
e39371 ¤   }
47efe6 }
b0af5a
5b6d52 ¤   void
e6e7d5 CKeyPanelGeneral::SavePanel(void)
90bb36 {
cb61e0 ¤   PGPError¤   err;
62c69d ¤   uchar¤  ¤   trust;
bcf985 ¤   PGPValidity¤validity;
fb67c5 ¤
2cd408 ¤   if( HasChanged() &&
585d5d ¤   ¤   mKeyCanBeModified &&
da07e3 ¤   ¤   ! mKeyProperties.isExpired &&
bff69d ¤   ¤   ! mKeyProperties.isRevoked)
ddc7a1 ¤   {
d371a9 ¤   ¤   PGPBoolean¤ axiomatic = ( mAxiomaticCheckbox->GetValue() != 0 );
421b52 ¤   ¤
0ec51f ¤   ¤   if(axiomatic && !mKeyProperties.isAxiomatic)
4a5b34 ¤   ¤   {
e892d6 ¤   ¤   ¤   if( mKeyProperties.isDisabled )
b1f776 ¤   ¤   ¤   {
b75387 ¤   ¤   ¤   ¤   /* Enable key before setting axiomatic trust */
2a2b85 ¤   ¤   ¤   ¤
dd1a4c ¤   ¤   ¤   ¤   err = PGPEnableKey(mKey);
976f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
5ba3a6 ¤   ¤   ¤   }
ab87c7 ¤   ¤   ¤
a1618b ¤   ¤   ¤   err = PGPSetKeyAxiomatic(mKey, PGPOLastOption(
c35085 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetKeyContext( mKey ) ) );
00524f ¤   ¤   ¤   pgpAssertNoErr(err);
fc0fe4 ¤   ¤   }
240e1d ¤   ¤   else
a35b34 ¤   ¤   {
a2dd07 ¤   ¤   ¤   if(!axiomatic && mKeyProperties.isAxiomatic)
ccf776 ¤   ¤   ¤   {
--1344 000ae893a65401201b1 Page 14 of CKeyInfoWindow.cp
e4994b ¤   ¤   ¤   ¤   err = PGPUnsetKeyAxiomatic(mKey);
0f6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
25a3a6 ¤   ¤   ¤   }
2799a1 ¤   ¤   ¤   else if(mTrustSlider->IsEnabled())
ccf776 ¤   ¤   ¤   {
381683 ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserIDValidity(mKey, &validity);
717b2f ¤   ¤   ¤   ¤   pgpAssert(!err);
f1c3a9 ¤   ¤   ¤   ¤   switch(mTrustSlider->GetValue())
3972c3 ¤   ¤   ¤   ¤   {
f55ee4 ¤   ¤   ¤   ¤   ¤   default:
76f93d ¤   ¤   ¤   ¤   ¤   case 0:
09fb8c ¤   ¤   ¤   ¤   ¤   ¤   trust = kPGPKeyTrust_Never;
e200eb ¤   ¤   ¤   ¤   ¤   ¤   break;
29a3e1 ¤   ¤   ¤   ¤   ¤   case 1:
6f63ea ¤   ¤   ¤   ¤   ¤   ¤   trust = kPGPKeyTrust_Marginal;
0f00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
b94c85 ¤   ¤   ¤   ¤   ¤   case 2:
d2c35c ¤   ¤   ¤   ¤   ¤   ¤   trust = kPGPKeyTrust_Complete;
2600eb ¤   ¤   ¤   ¤   ¤   ¤   break;
c31659 ¤   ¤   ¤   ¤   ¤   case 3:
43c35c ¤   ¤   ¤   ¤   ¤   ¤   trust = kPGPKeyTrust_Complete;
c400eb ¤   ¤   ¤   ¤   ¤   ¤   break;
432613 ¤   ¤   ¤   ¤   }
c944ae ¤   ¤   ¤   ¤   err = PGPSetKeyTrust(mKey, trust);
cf7b2f ¤   ¤   ¤   ¤   pgpAssert(!err);
6c70a6 ¤   ¤   ¤   ¤   if(mTrustChanged && ((validity == kPGPValidity_Invalid) ||
543444 ¤   ¤   ¤   ¤   ¤   (validity == kPGPValidity_Unknown)))
e272c3 ¤   ¤   ¤   ¤   {
98e427 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
972dd9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeyInfoStringListID, kInvalidKeySetTrustID¶
576275 );
3e2613 ¤   ¤   ¤   ¤   }
baa3a6 ¤   ¤   ¤   }
51af5a
f7220c ¤   ¤   ¤   if( mEnabledCheckbox->GetValue() != 0 )
56f776 ¤   ¤   ¤   {
1b1a4c ¤   ¤   ¤   ¤   err = PGPEnableKey(mKey);
897b2f ¤   ¤   ¤   ¤   pgpAssert(!err);
9ca3a6 ¤   ¤   ¤   }
7bbb8c ¤   ¤   ¤   else
7cf776 ¤   ¤   ¤   {
aa25e8 ¤   ¤   ¤   ¤   err = PGPDisableKey(mKey);
cf7b2f ¤   ¤   ¤   ¤   pgpAssert(!err);
0f5a2a ¤   ¤   ¤   }¤
323b90 ¤   ¤   }¤
be9371 ¤   }
a2efe6 }
0caf5a
0213fb #pragma mark --- CNewSubkeyDialog ---
88af5a
37a38e class CNewSubkeyDialog : public LGADialog
a1bb36 {
5c5ed4 public:
bcaf5a
045687 ¤   enum { class_ID = 'NSub' };
0667c5 ¤
fb2873 ¤   ¤   ¤   ¤   ¤   CNewSubkeyDialog(LStream *inStream);
eb5ef6 ¤   virtual¤¤   ¤   ~CNewSubkeyDialog(void);
70af5a
5ce4f3 ¤   void¤   ¤   ¤   GetParams(PGPTime *startDate, PGPTime *expirationDate,
c36c0a ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPInt32 *keyBits);
b62e22 ¤   virtual void¤   ListenToMessage(MessageT inMessage, void *ioParam);
0067c5 ¤
79a2d3 protected:
beaf5a
95a2f8 ¤   virtual void¤   FinishCreateSelf(void);
dcaf5a
950fb9 private:
a3af5a
de2f4b ¤   enum
c9c7a1 ¤   {
ae4c02 ¤   ¤   kKeyBitsEditTextPaneID¤ ¤   = 'eBit',
--63e1 0003a0ad791401201b1 Page 15 of CKeyInfoWindow.cp
d099e1 ¤   ¤   kStartDateEditFieldPaneID¤  = 'eStr',
e165b5 ¤   ¤   kStartDateArrowsPaneID¤ ¤   = 'aStr',
b0b012 ¤   ¤   kExpDateEditFieldPaneID¤¤   = 'eExp',
986582 ¤   ¤   kExpDateArrowsPaneID¤   ¤   = 'aExp',
75af12 ¤   ¤   kNeverExpiresButtonPaneID¤  = 'bNvr',
3d1b52 ¤   ¤
cc9c9a ¤   ¤   cmd_ChangeStartDate¤¤   ¤   = kStartDateArrowsPaneID,
d7e4d1 ¤   ¤   cmd_ChangeExpirationDate¤   = kExpDateArrowsPaneID
6162bd ¤   };
fb67c5 ¤
7b6437 ¤   LEditText¤  ¤   ¤   ¤   *mKeyBitsEditField;
2e3391 ¤   CGADurationEditField¤   *mStartDateEditField;
08a336 ¤   CGADurationEditField¤   *mExpDateEditField;
6b3e9d ¤   Int32¤  ¤   ¤   ¤   ¤   mLastStartDateArrowsValue;
2459f2 ¤   Int32¤  ¤   ¤   ¤   ¤   mLastExpDateArrowsValue;
b782f7 };
e8af5a
0a5e6a CNewSubkeyDialog::CNewSubkeyDialog(LStream *inStream)
7e96e2 ¤   ¤   : LGADialog(inStream)
4cbb36 {
12efe6 }
bcaf5a
5df676 CNewSubkeyDialog::~CNewSubkeyDialog(void)
3bbb36 {
40efe6 }
06af5a
196d52 ¤   void
a55213 CNewSubkeyDialog::FinishCreateSelf(void)
00bb36 {
24bda4 ¤   UInt32¤ ¤   ¤   expiration;
b40d86 ¤   DateTimeRec¤¤   dtRec;
6ba43e ¤   LLittleArrows¤  *arrowsObj;
587861 ¤   UInt32¤ ¤   ¤   now;
d467c5 ¤
9e893a ¤   LGADialog::FinishCreateSelf();
1467c5 ¤
914683 ¤   mKeyBitsEditField = (LEditText *) FindPaneByID( kKeyBitsEditTextPaneID );
0c6844 ¤   pgpAssertAddrValid( mKeyBitsEditField, VoidAlign );
0e67c5 ¤
bc3eea ¤   mKeyBitsEditField->SelectAll();
25af5a
c646c0 ¤   mStartDateEditField = (CGADurationEditField *)
66275b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID( kStartDateEditFieldPaneID );
41d52d ¤   pgpAssertAddrValid( mStartDateEditField, VoidAlign );
36af5a
e93e02 ¤   mExpDateEditField = (CGADurationEditField *)
fe6e34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID( kExpDateEditFieldPaneID );
5d2cdc ¤   pgpAssertAddrValid( mExpDateEditField, VoidAlign );
9867c5 ¤
353248 ¤   GetDateTime( &now );
d8af5a
15d94e ¤   mStartDateEditField->SetDurationType( kDateDurationType );¤ ¤   ¤   ¤   ¤
0929f4 ¤   mStartDateEditField->SetDurationValue( now );¤  ¤   ¤   ¤   ¤
99af5a
518eaf ¤   /* Set expiration to +1 year */
8d9f7f ¤   SecondsToDate( now, &dtRec );
77a37c ¤   dtRec.year++;
fd7e27 ¤   DateToSeconds( &dtRec, &expiration );
6067c5 ¤
e62250 ¤   mExpDateEditField->SetDurationType( kDateDurationType );¤   ¤   ¤   ¤   ¤
b88fb5 ¤   mExpDateEditField->SetDurationValue( expiration );¤ ¤   ¤   ¤   ¤
4eaf5a
97c0dd ¤   arrowsObj = (LLittleArrows *) FindPaneByID( kStartDateArrowsPaneID );
878da0 ¤   pgpAssertAddrValid( arrowsObj, VoidAlign );
4367c5 ¤
f8dcce ¤   arrowsObj->AddListener( this );
2b92c3 ¤   mLastStartDateArrowsValue = arrowsObj->GetValue();
89af5a
175db4 ¤   arrowsObj = (LLittleArrows *) FindPaneByID( kExpDateArrowsPaneID );
b58da0 ¤   pgpAssertAddrValid( arrowsObj, VoidAlign );
1167c5 ¤
3adcce ¤   arrowsObj->AddListener( this );
--ce38 000a6e3ce6e401201b1 Page 16 of CKeyInfoWindow.cp
ed5ce4 ¤   mLastExpDateArrowsValue = arrowsObj->GetValue();
2267c5 ¤
78efe6 }
37af5a
7b6d52 ¤   void
403de2 CNewSubkeyDialog::ListenToMessage(
0519a3 ¤   MessageT ¤  inMessage,
667503 ¤   void ¤  ¤   *ioParam)
a3bb36 {
baed12 ¤   Int32¤  newValue;
5167c5 ¤
b6769e ¤   switch( inMessage )
77c7a1 ¤   {
23622f ¤   ¤   case cmd_ChangeStartDate:
16ecd0 ¤   ¤   ¤   newValue = *(Int32 *) ioParam;
4f131b ¤   ¤   ¤   mStartDateEditField->AdjustValue(
566cb0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newValue < mLastStartDateArrowsValue ?
d296cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDownAdjust : kUpAdjust );
8e9a1b ¤   ¤   ¤   mLastStartDateArrowsValue = newValue;
f3cdcb ¤   ¤   ¤   break;
7187c7 ¤   ¤   ¤
4a978e ¤   ¤   case cmd_ChangeExpirationDate:
b2ecd0 ¤   ¤   ¤   newValue = *(Int32 *) ioParam;
353e94 ¤   ¤   ¤   mExpDateEditField->AdjustValue(
4c0e57 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newValue < mLastExpDateArrowsValue ?
c396cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDownAdjust : kUpAdjust );
2e7fc3 ¤   ¤   ¤   mLastExpDateArrowsValue = newValue;
d3cdcb ¤   ¤   ¤   break;
9a9371 ¤   }
d3efe6 }
3faf5a
3d6d52 ¤   void
e7b9c6 CNewSubkeyDialog::GetParams(
ef277e ¤   PGPTime¤¤   *startDate,
00bd0d ¤   PGPTime¤¤   *expirationDate,
fec695 ¤   PGPInt32¤   *keyBits)
e0bb36 {
038d82 ¤   LRadioButton¤   *radio;
c967c5 ¤
11e218 ¤   *keyBits ¤  = mKeyBitsEditField->GetValue();
693dd7 ¤   *startDate ¤= PGPTimeFromMacTime(mStartDateEditField->GetDurationValue());
1d67c5 ¤
d4d058 ¤   radio = (LRadioButton *) FindPaneByID( kNeverExpiresButtonPaneID );
b8bfca ¤   if( radio->GetValue() != 0)
39c7a1 ¤   {
9d28f1 ¤   ¤   *expirationDate = 0;
f09371 ¤   }
1a0e24 ¤   else
a9c7a1 ¤   {
6f3934 ¤   ¤   *expirationDate = PGPTimeFromMacTime(
b89da4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mExpDateEditField->GetDurationValue() );
8e9371 ¤   }
77efe6 }
6467c5 ¤
9295e9 #pragma mark --- CSubkeyTable ---
51af5a
af2877 typedef struct SubkeyTableItem
89bb36 {
588dd1 ¤   PGPSubKeyRef¤   ¤   subKeyRef;
f21720 ¤   PGPInt32¤   ¤   ¤   keyBits;
893a8b ¤   PGPTime¤¤   ¤   ¤   validFromDate;
94a2c7 ¤   PGPTime¤¤   ¤   ¤   expirationDate;
9a9915 ¤   PGPBoolean¤ ¤   ¤   isExpired;
75cbd5 ¤   PGPBoolean¤ ¤   ¤   isRevoked;
3567c5 ¤
4a298d } SubkeyTableItem;
f8af5a
88ac34 class CSubkeyTable : public LTableView,
276ec9 ¤   ¤   ¤   ¤   ¤   ·public LBroadcaster
06bb36 {
5f5ed4 public:
a6af5a
--145e 0006e5a5efe401201b1 Page 17 of CKeyInfoWindow.cp
87dd42 ¤   enum { class_ID = 'SubK' };
fb67c5 ¤
f1a7ec ¤   ¤   ¤   ¤   ¤   CSubkeyTable(LStream *inStream);
cefcb8 ¤   virtual¤¤   ¤   ~CSubkeyTable(void);
93af5a
9b4b2f ¤   virtual void¤   DrawSelf(void);
fa5ae3 ¤   virtual void¤   SelectionChanged(void);
b2af5a
5da2d3 protected:
b1af5a
1c7fef ¤   void¤   ¤   ¤   DrawCell(const STableCell &inCell,
9492e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect &inLocalRect);
ec8dda ¤   virtual void¤   HiliteCellActively(const STableCell &inCell,
22a977 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inHilite);
faea82 ¤   virtual void¤   HiliteCellInactively( const STableCell &inCell,
3ea977 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inHilite);
c00fb9 private:
8caf5a
8a2f4b ¤   enum
05c7a1 ¤   {
7c9209 ¤   ¤   kIconOffset¤¤   ¤   ¤   = 5,
66f27e ¤   ¤   kValidFromColumnOffset¤ = 26,
050db9 ¤   ¤   kValidFromTextOffset¤   = kValidFromColumnOffset + 5,
f111bc ¤   ¤   kValidFromColumnWidth¤  = 70,
98d4bd ¤   ¤   kExpirationColumnOffset¤= 105,
a2491d ¤   ¤   kBitsColumnOffset¤  ¤   = 180
e262bd ¤   };
8882f7 };
97af5a
2f9ef3 CSubkeyTable::CSubkeyTable(LStream *inStream)
3dba7e ¤   ¤   : LTableView(inStream)
73bb36 {
70a167 ¤   mTableGeometry ¤= new LTableMonoGeometry( this, mFrameSize.width, 18 );
7a2079 ¤   mTableSelector ¤= new LTableSingleSelector( this );
f95d2d ¤   mTableStorage ¤ = new LTableArrayStorage( this, sizeof( SubkeyTableItem ) );
daefe6 }
5faf5a
c9863a CSubkeyTable::~CSubkeyTable(void)
a8bb36 {
aeefe6 }
e6af5a
656d52 ¤   void
6d5cd1 CSubkeyTable::DrawSelf(void)
51bb36 {
79d8a7 ¤   Rect frame;
ddaf5a
564ebd ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Gray1 ) );
a9d7dd ¤   RGBBackColor( &UGAColorRamp::GetColor( colorRamp_White ) );
b867c5 ¤
9167b9 ¤   CalcLocalFrameRect( frame );
ce67c5 ¤
c2c7a1 ¤   {
c544fe ¤   ¤   StDeviceLoop¤   devLoop( frame );¤  ¤
8577ad ¤   ¤   SInt16¤ ¤   ¤   depth;
35af5a
843977 ¤   ¤   while( devLoop.NextDepth( depth ) )
015b34 ¤   ¤   {
f5214b ¤   ¤   ¤   if( depth > 1 )
dfe594 ¤   ¤   ¤   ¤   PaintRect( &frame );
c9bb8c ¤   ¤   ¤   else
b03d87 ¤   ¤   ¤   ¤   EraseRect( &frame );
fe0fe4 ¤   ¤   }
ce9371 ¤   }
af67c5 ¤
5cde04 ¤   LTableView::DrawSelf();
d5efe6 }
42af5a
ee6d52 ¤   void
0295d2 CSubkeyTable::DrawCell(
861bb3 ¤   const STableCell¤   &inCell,
36c050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
6ebb36 {
--52f1 000bd384de7401201b1 Page 18 of CKeyInfoWindow.cp
ce981b ¤   StDeviceLoop¤   devLoop( inLocalRect );¤¤
946385 ¤   SInt16¤ ¤   ¤   depth;
34d77a ¤   SubkeyTableItem¤tableItem;
bbb37e ¤   Uint32¤ ¤   ¤   dataSize;
652a07 ¤   Rect¤   ¤   ¤   iconRect;
b25b49 ¤   Rect¤   ¤   ¤   grayRect;
0a3230 ¤   Rect¤   ¤   ¤   textRect;
03f911 ¤   FontInfo¤   ¤   fontInfo;
d56e12 ¤   PGPUInt32¤  ¤   textBaseLine;
1ba092 ¤   Str32¤  ¤   ¤   creationStr;
1e482e ¤   Str32¤  ¤   ¤   expirationStr;
694f6f ¤   Str32¤  ¤   ¤   bitsStr;
d09793 ¤   ResIDT¤ ¤   ¤   iconResID;
ea67c5 ¤
a64566 ¤   dataSize = sizeof( tableItem );
72ac8e ¤   GetCellData( inCell, &tableItem, dataSize );
92af5a
6dfb73 ¤   if( tableItem.isRevoked )
dac7a1 ¤   {
d955b3 ¤   ¤   iconResID = kDSARevokedKeyID;
489371 ¤   }
23ff19 ¤   else if( tableItem.isExpired )
9dc7a1 ¤   {
f8f2a4 ¤   ¤   iconResID = kDSAExpiredKeyID;
399371 ¤   }
600e24 ¤   else
65c7a1 ¤   {
22536e ¤   ¤   iconResID = kDSAKeyIconID;
3d9371 ¤   }
edaf5a
6c06fb ¤   DateString( PGPTimeToMacTime( tableItem.validFromDate ), shortDate,
9308c8 ¤   ¤   ¤   ¤   ¤   creationStr, NULL );¤
4967c5 ¤
853223 ¤   if( tableItem.expirationDate != 0 )
a5c7a1 ¤   {
bc295a ¤   ¤   DateString( PGPTimeToMacTime( tableItem.expirationDate ), shortDate,
012ce6 ¤   ¤   ¤   ¤   ¤   expirationStr, NULL );
629371 ¤   }
9d0e24 ¤   else
93c7a1 ¤   {
fc8388 ¤   ¤   GetIndString( expirationStr, kKeyInfoStringListID, kNeverExpiresID );
689371 ¤   }
db67c5 ¤
f79505 ¤   NumToString( tableItem.keyBits, bitsStr );
b894aa ¤   ¤   ¤   ¤   ¤   ¤
a6094d ¤   // This code assumes that small icons are 16x16.·
7789ac ¤   iconRect.left ¤ = inLocalRect.left + kIconOffset;
d1e49c ¤   iconRect.right¤ = iconRect.left ·+ 16;
b7cd74 ¤   iconRect.top¤   = inLocalRect.top;
b67d71 ¤   iconRect.bottom¤= iconRect.top + 16;
c867c5 ¤
2ecf79 ¤   AlignRect( &inLocalRect, &iconRect, kAlignAtVerticalCenter );
59af5a
24e70b ¤   grayRect ¤  ¤   = inLocalRect;
bac367 ¤   grayRect.left ¤ = inLocalRect.left + kValidFromColumnOffset;
a75f1c ¤   grayRect.right ¤= grayRect.left + kValidFromColumnWidth;
2b67c5 ¤
5712a9 ¤   // Geneva 9 left
311056 ¤   UTextTraits::SetPortTextTraits( 135 );
faf556 ¤   GetFontInfo( &fontInfo );
bf67c5 ¤
bb23e3 ¤   textRect ¤  ¤   = inLocalRect;
b04c24 ¤   textRect.bottom¤= textRect.top + fontInfo.ascent +
a9b2c3 ¤   ¤   ¤   ¤   ¤   ¤   fontInfo.descent + fontInfo.leading;
3c67c5 ¤
a30fc6 ¤   AlignRect( &inLocalRect, &textRect, kAlignAtVerticalCenter );
6f7b09 ¤   textBaseLine = textRect.bottom - fontInfo.descent - 1;
c567c5 ¤
2cb111 ¤   while( devLoop.NextDepth( depth ) )
79c7a1 ¤   {
329af1 ¤   ¤   if(depth >= 8)
bd5b34 ¤   ¤   {
--e0f3 0006d0dcaeb401201b1 Page 19 of CKeyInfoWindow.cp
c3a97d ¤   ¤   ¤   // Draw MacOS8-like background for cells, selected column
403da4 ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Gray1 ) );
4336b8 ¤   ¤   ¤   PaintRect( &inLocalRect );
fd87c7 ¤   ¤   ¤
3a95ca ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Gray2 ) );
d50ae2 ¤   ¤   ¤   PaintRect( &grayRect );
0c87c7 ¤   ¤   ¤
c5777a ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_White ) );
316d39 ¤   ¤   ¤   MoveTo( inLocalRect.left, inLocalRect.bottom - 1 );
b9af86 ¤   ¤   ¤   LineTo( inLocalRect.right - 1, inLocalRect.bottom - 1 );
1a87c7 ¤   ¤   ¤
7183fa ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Black ) );
9b0fe4 ¤   ¤   }
180e1d ¤   ¤   else
6f5b34 ¤   ¤   {
5583fa ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Black ) );
b9a4c4 ¤   ¤   ¤   RGBBackColor( &UGAColorRamp::GetColor( colorRamp_White ) );
f6dd62 ¤   ¤   ¤   EraseRect( &inLocalRect );
c70fe4 ¤   ¤   }
c51b52 ¤   ¤
80f3ed ¤   ¤   // Draw icon
017f41 ¤   ¤   PlotIconID( &iconRect, kAlignNone, kTransformNone, iconResID );
bdaf5a
581274 ¤   ¤   // Draw the item name
fd1b52 ¤   ¤
7dcac3 ¤   ¤   MoveTo( kValidFromTextOffset, textBaseLine );
4f4bec ¤   ¤   DrawString( creationStr );
5faf5a
a9ad78 ¤   ¤   MoveTo( kExpirationColumnOffset, textBaseLine );
63ec01 ¤   ¤   DrawString( expirationStr );
65af5a
5a4b6a ¤   ¤   MoveTo( kBitsColumnOffset, textBaseLine );
d93a79 ¤   ¤   DrawString( bitsStr );
a19371 ¤   }
4defe6 }
42af5a
d26d52 ¤   void
2bf907 CSubkeyTable::HiliteCellActively(
841bb3 ¤   const STableCell¤   &inCell,
a7a368 ¤   Boolean¤¤   ¤   ¤   inHilite)
b5bb36 {
7aa0e5 ¤   Rect¤   cellFrame;
8167c5 ¤
08668d ¤   (void) inHilite;
acaf5a
1e8654 ¤   if( GetLocalCellRect( inCell, cellFrame ) &&
c3f57b ¤   ¤   FocusExposed() )
08c7a1 ¤   {
d565b7 ¤   ¤   StDeviceLoop¤   devLoop( cellFrame );¤  ¤
8077ad ¤   ¤   SInt16¤ ¤   ¤   depth;
e1af5a
e03977 ¤   ¤   while( devLoop.NextDepth( depth ) )
585b34 ¤   ¤   {
e4c87d ¤   ¤   ¤   StColorPenState saveColorPen; ··// Preserve color & pen state
ac87c7 ¤   ¤   ¤
e1c514 ¤   ¤   ¤   StColorPenState::Normalize();
0e87c7 ¤   ¤   ¤
da28fb ¤   ¤   ¤   if( depth >= 8 )
89f776 ¤   ¤   ¤   {
3c5d7d ¤   ¤   ¤   ¤   RGBBackColor( &UGAColorRamp::GetColor( colorRamp_Gray2 ) );
ed98f3 ¤   ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Black ) );
5da3a6 ¤   ¤   ¤   }
4dbb8c ¤   ¤   ¤   else
9df776 ¤   ¤   ¤   {
d9bfcd ¤   ¤   ¤   ¤   RGBBackColor( &UGAColorRamp::GetColor( colorRamp_White ) );
b298f3 ¤   ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Black ) );
60a3a6 ¤   ¤   ¤   }
0887c7 ¤   ¤   ¤
ab4738 ¤   ¤   ¤   cellFrame.left ¤+= kValidFromColumnOffset;
ccd03d ¤   ¤   ¤   cellFrame.right = cellFrame.left + kValidFromColumnWidth;
0aae30 ¤   ¤   ¤   ¤   ¤
6d01a6 ¤   ········UDrawingUtils::SetHiliteModeOn();
--cc5d 000ea2dad37401201b1 Page 20 of CKeyInfoWindow.cp
96dbbb ¤   ¤   ¤   InvertRect( &cellFrame );
390fe4 ¤   ¤   }
669371 ¤   }
4fefe6 }
e8af5a
446d52 ¤   void
6c6b68 CSubkeyTable::HiliteCellInactively(
e81bb3 ¤   const STableCell¤   &inCell,
402697 ¤   Boolean¤¤   ¤   ·¤  inHilite)
cabb36 {
9ca0e5 ¤   Rect¤   cellFrame;
8a67c5 ¤
7a668d ¤   (void) inHilite;
8f67c5 ¤
538654 ¤   if( GetLocalCellRect( inCell, cellFrame ) &&
fbf57b ¤   ¤   FocusExposed() )
71c7a1 ¤   {
8565b7 ¤   ¤   StDeviceLoop¤   devLoop( cellFrame );¤  ¤
5377ad ¤   ¤   SInt16¤ ¤   ¤   depth;
23af5a
bd3977 ¤   ¤   while( devLoop.NextDepth( depth ) )
c75b34 ¤   ¤   {
bbad33 ¤   ········StColorPenState saveColorPen; ··// Preserve color & pen state
af50b7 ¤   ········
a356ca ¤   ········StColorPenState::Normalize();
3e50b7 ¤   ········
760913 ¤   ········if( depth >= 8 )
338722 ¤   ········{
395d7d ¤   ¤   ¤   ¤   RGBBackColor( &UGAColorRamp::GetColor( colorRamp_Gray2 ) );
8398f3 ¤   ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Black ) );
14a3a6 ¤   ¤   ¤   }
00bb8c ¤   ¤   ¤   else
4ef776 ¤   ¤   ¤   {
04bfcd ¤   ¤   ¤   ¤   RGBBackColor( &UGAColorRamp::GetColor( colorRamp_White ) );
3598f3 ¤   ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Black ) );
a7a3a6 ¤   ¤   ¤   }
3a87c7 ¤   ¤   ¤
583423 ¤   ¤   ¤   PenMode( srcXor );
0987c7 ¤   ¤   ¤
2f4738 ¤   ¤   ¤   cellFrame.left ¤+= kValidFromColumnOffset;
39d03d ¤   ¤   ¤   cellFrame.right = cellFrame.left + kValidFromColumnWidth;
c6ae30 ¤   ¤   ¤   ¤   ¤
b33181 ¤   ¤   ¤   UDrawingUtils::SetHiliteModeOn();
0f2e14 ¤   ¤   ¤   FrameRect( &cellFrame );
220fe4 ¤   ¤   }
4c9371 ¤   }
85efe6 }
6baf5a
346d52 ¤   void
218759 CSubkeyTable::SelectionChanged(void)
c3bb36 {
587b3c ¤   BroadcastMessage( mPaneID, NULL );
72efe6 }
21af5a
eb52d0 #pragma mark --- CKeyPanelSubkeys ---
22af5a
9cc7fd class CKeyPanelSubkeys : public CKeyInfoPanelView,
ed938d ¤   ¤   ¤   ¤   ¤   ¤   ·public LListener
44bb36 {
d75ed4 public:
beaf5a
2ef30f ¤   enum { class_ID = 'vKIS' };
05af5a
ce7a0f ¤   ¤   ¤   ¤   ¤   CKeyPanelSubkeys(LStream *inStream);
8a2bd5 ¤   virtual¤¤   ¤   ~CKeyPanelSubkeys(void);
ba67c5 ¤
d52e22 ¤   virtual void¤   ListenToMessage(MessageT inMessage, void *ioParam);
f9fb0f ¤   virtual void¤   SetInfo(PGPKeySetRef keySet, PGPKeyRef theKey,
cd7cd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean keyCanBeModified);
ed0fc4 ¤   virtual void¤   Show(void);
9baf5a
eaa2d3 protected:
--41df 000dcd436c9401201b1 Page 21 of CKeyInfoWindow.cp
e0af5a
2d90d4 ¤   virtual¤void¤   FinishCreateSelf(void);
6967c5 ¤
630fb9 private:
09af5a
aa2f4b ¤   enum
a7c7a1 ¤   {
079928 ¤   ¤   kNewButtonPaneID¤   ¤   = 'bNew',
ad739b ¤   ¤   kRemoveButtonPaneID¤¤   = 'bRem',
2a02fe ¤   ¤   kRevokeButtonPaneID¤¤   = 'bRev',
ae1670 ¤   ¤   kSubkeyTablePaneID¤ ¤   = 'tSub',
0b1b52 ¤   ¤
cab619 ¤   ¤   cmd_NewSubkey¤  ¤   ¤   = kNewButtonPaneID,
4ec196 ¤   ¤   cmd_RevokeSubkey¤   ¤   = kRevokeButtonPaneID,
4ee69c ¤   ¤   cmd_RemoveSubkey¤   ¤   = kRemoveButtonPaneID,
aefd9b ¤   ¤   cmd_ChangedSubkey¤  ¤   = kSubkeyTablePaneID
3862bd ¤   };
5b67c5 ¤
d77ed4 ¤   LPushButton¤¤   ¤   ¤   *mNewButton;
5b0eb4 ¤   LPushButton¤¤   ¤   ¤   *mRevokeButton;
c0b1ae ¤   LPushButton¤¤   ¤   ¤   *mRemoveButton;
dd74bd ¤   CSubkeyTable¤   ¤   ¤   *mSubkeyTable;
515281 ¤   PGPSharedKeyProperties¤ mKeyProperties;
981a8a ¤   static ulong¤   ¤   ¤   sKeyGenStartTicks;
0c67c5 ¤
a9cfaf ¤   void¤   ¤   ¤   AdjustButtons(void);
579d00 ¤   void¤   ¤   ¤   NewSubKey(void);
f445a7 ¤   void¤   ¤   ¤   RemoveSubKey(void);
781a61 ¤   void¤   ¤   ¤   RevokeSubKey(void);
06af5a
81d3d7 ¤   static PGPError¤GenerateKeyCallback(PGPContextRef context,
f52413 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent *event, PGPUserValue userValue);
7c82f7 };
73af5a
a13e32 ulong¤  CKeyPanelSubkeys::sKeyGenStartTicks = 0;
5caf5a
c87e62 CKeyPanelSubkeys::CKeyPanelSubkeys(LStream *inStream)
10cda9 ¤   : CKeyInfoPanelView( inStream )
06bb36 {
1befe6 }
77af5a
ab1fb8 CKeyPanelSubkeys::~CKeyPanelSubkeys()
77bb36 {
68efe6 }
4baf5a
906d52 ¤   void
60a939 CKeyPanelSubkeys::FinishCreateSelf(void)
65bb36 {
effecb ¤   CKeyInfoPanelView::FinishCreateSelf();
4eaf5a
889080 ¤   mNewButton = (LPushButton *) FindPaneByID( kNewButtonPaneID );
64c2a5 ¤   pgpAssertAddrValid( mNewButton, VoidAlign );
02af5a
f04306 ¤   mRevokeButton = (LPushButton *) FindPaneByID( kRevokeButtonPaneID );
76b345 ¤   pgpAssertAddrValid( mRevokeButton, VoidAlign );
cbaf5a
407813 ¤   mRemoveButton = (LPushButton *) FindPaneByID( kRemoveButtonPaneID );
82d77b ¤   pgpAssertAddrValid( mRemoveButton, VoidAlign );
3467c5 ¤
256b90 ¤   mSubkeyTable = (CSubkeyTable *) FindPaneByID( kSubkeyTablePaneID );
18e4c5 ¤   pgpAssertAddrValid( mSubkeyTable, VoidAlign );
40af5a
f8c537 ¤   mNewButton->AddListener( this );
d5f021 ¤   mRevokeButton->AddListener( this );
17e657 ¤   mRemoveButton->AddListener( this );
0a2bd4 ¤   mSubkeyTable->AddListener( this );
0467c5 ¤
b167c5 ¤
deefe6 }
d2af5a
3ec744 ¤   PGPError
dcd79e CKeyPanelSubkeys::GenerateKeyCallback(
--8836 0008b67b1a5401201b1 Page 22 of CKeyInfoWindow.cp
ac35f6 ¤   PGPContextRef ¤ context,
157467 ¤   PGPEvent ¤  ¤   *event,
672e8b ¤   PGPUserValue ¤  userValue)
c2bb36 {
597d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
2f67c5 ¤
c7acb3 ¤   if( event->type == kPGPEvent_KeyGenEvent )
72c7a1 ¤   {
e53aa5 ¤   ¤   ulong¤  ¤   ¤   ¤   timeNow;
788485 ¤   ¤   CPGPStDialogHandler¤*dialogHandler;
35b748 ¤   ¤   CGAProgressDialog¤  *dialogObj;
4a7c83 ¤   ¤   static ulong¤   ¤   lastEventTime;
f3af5a
fa67f7 ¤   ¤   dialogHandler ¤ = (CPGPStDialogHandler *) userValue;
a385a6 ¤   ¤   dialogObj¤  ¤   = (CGAProgressDialog *) dialogHandler->GetDialog();
771b52 ¤   ¤
20653f ¤   ¤   timeNow = LMGetTicks();
0dc0b3 ¤   ¤   if( ! dialogObj->IsVisible() )
845b34 ¤   ¤   {
364539 ¤   ¤   ¤   // Show progress dialog after 3 seconds
1acc17 ¤   ¤   ¤   if( timeNow - sKeyGenStartTicks > 60L * 3 )
d9f776 ¤   ¤   ¤   {
b39923 ¤   ¤   ¤   ¤   dialogObj->Show();
aba3a6 ¤   ¤   ¤   }
0b0fe4 ¤   ¤   }
831b52 ¤   ¤
5140fd ¤   ¤   if( dialogObj->IsVisible() )
915b34 ¤   ¤   {
ecb410 ¤   ¤   ¤   if( timeNow - lastEventTime > 10 )
aaf776 ¤   ¤   ¤   {
75dc42 ¤   ¤   ¤   ¤   MessageT¤   theMessage;
5c2b85 ¤   ¤   ¤   ¤
50ad83 ¤   ¤   ¤   ¤   lastEventTime = timeNow;
ae2b85 ¤   ¤   ¤   ¤
3bf2b2 ¤   ¤   ¤   ¤   theMessage = dialogHandler->DoDialog();
33015d ¤   ¤   ¤   ¤   if( theMessage == msg_Cancel )
d5d1ff ¤   ¤   ¤   ¤   ¤   err = kPGPError_UserAbort;
56a3a6 ¤   ¤   ¤   }
ba0fe4 ¤   ¤   }
3c9371 ¤   }
1b67c5 ¤
c4deb7 ¤   return( err );
41efe6 }
69af5a
0a6d52 ¤   void
a43847 CKeyPanelSubkeys::NewSubKey(void)
38bb36 {
f83ce3 ¤   CPGPStDialogHandler¤dialogHandler( kNewSubkeyDialogResID, this );
8ea36b ¤   CNewSubkeyDialog¤   *theDialog;¤
e88c55 ¤   MessageT¤   ¤   ¤   hitMessage;
890f57 ¤   SubkeyTableItem¤¤   tableItem;
4e67c5 ¤
97fd24 ¤   mSubkeyTable->UnselectAllCells();
4567c5 ¤
ba3fae ¤   theDialog = (CNewSubkeyDialog *) dialogHandler.GetDialog();
040cf4 ¤   theDialog->Show();
1467c5 ¤
22cfa1 ¤   do
09c7a1 ¤   {
84728b ¤   ¤   hitMessage = dialogHandler.DoDialog();
b07a98 ¤   ¤   if( hitMessage == msg_OK )
ae5b34 ¤   ¤   {
722f4c ¤   ¤   ¤   Boolean¤addSubKey = TRUE;
cc87c7 ¤   ¤   ¤
dfdf1d ¤   ¤   ¤   pgpClearMemory( &tableItem, sizeof( tableItem ) );
e287c7 ¤   ¤   ¤
c422c2 ¤   ¤   ¤   theDialog->GetParams( &tableItem.validFromDate,
1a7d12 ¤   ¤   ¤   ¤   ¤   ¤   &tableItem.expirationDate, &tableItem.keyBits );
5687c7 ¤   ¤   ¤
d80890 ¤   ¤   ¤   if( tableItem.keyBits < 768 || tableItem.keyBits > 4096 )
47f776 ¤   ¤   ¤   {
8b4b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
--6447 0007dc5207f401201b1 Page 23 of CKeyInfoWindow.cp
91bdb7 ¤   ¤   ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
92e592 ¤   ¤   ¤   ¤   ¤   ¤   kKeyInfoStringListID, kSubkeyWrongSizeMsgStrIndex );
5894aa ¤   ¤   ¤   ¤   ¤   ¤
20d7c2 ¤   ¤   ¤   ¤   addSubKey = FALSE;
e8a3a6 ¤   ¤   ¤   }
71bb8c ¤   ¤   ¤   else
82f776 ¤   ¤   ¤   {
e30075 ¤   ¤   #if PGP_BUSINESS_SECURITY
30711b ¤   ¤   ¤   ¤   PGPUInt32¤  minAdminKeySize;
015f3a ¤   ¤   ¤   ¤   PGPError¤   err;
ef2b85 ¤   ¤   ¤   ¤
cdb041 ¤   ¤   ¤   ¤   err = PGPGetPrefNumber( gAdminPrefRef,
2cbb68 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefMinimumKeySize, &minAdminKeySize);
7455be ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
68cad6 ¤   ¤   ¤   ¤   if( tableItem.keyBits < minAdminKeySize )
0b72c3 ¤   ¤   ¤   ¤   {
8ad4c3 ¤   ¤   ¤   ¤   ¤   Str255¤ adminKeySizeStr;
0dae30 ¤   ¤   ¤   ¤   ¤
26b14e ¤   ¤   ¤   ¤   ¤   ::NumToString(minAdminKeySize, adminKeySizeStr);
653322 ¤   ¤   ¤   ¤   ¤   (void) CWarningAlert::Display(kWACautionAlertType,
c00c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
354d69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeyInfoStringListID,
f5ebad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAdminKeySizeErrorStrIndex,
139e95 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   adminKeySizeStr );
c69631 ¤   ¤   ¤   ¤   ¤   addSubKey = FALSE;
3f2613 ¤   ¤   ¤   ¤   }
4bd656 ¤   ¤   #endif
ffa3a6 ¤   ¤   ¤   }
2a87c7 ¤   ¤   ¤
b9ad2a ¤   ¤   ¤   if( addSubKey && tableItem.expirationDate != 0 )
bcf776 ¤   ¤   ¤   {
e71496 ¤   ¤   ¤   ¤   if( tableItem.expirationDate <= tableItem.validFromDate )
ec72c3 ¤   ¤   ¤   ¤   {
067c97 ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
3dab01 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
694e1e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeyInfoStringListID,
1994bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kBadSubkeyExpirationMsgStrIndex );
0e531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
cd9631 ¤   ¤   ¤   ¤   ¤   addSubKey = FALSE;
c02613 ¤   ¤   ¤   ¤   }
25e344 ¤   ¤   ¤   ¤   else if( tableItem.expirationDate <= PGPGetTime() )
ec72c3 ¤   ¤   ¤   ¤   {
f07c97 ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
80c3c2 ¤   ¤   ¤   ¤   ¤   if( CWarningAlert::Display( kWAStopAlertType,
4ec588 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKCancelStyle,
a54e1e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeyInfoStringListID,
2970c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSubkeyAlreadyExpiredMsgStrIndex ) != msg_OK )
d14859 ¤   ¤   ¤   ¤   ¤   {
87987d ¤   ¤   ¤   ¤   ¤   ¤   addSubKey = FALSE;
ce1c89 ¤   ¤   ¤   ¤   ¤   }
e42613 ¤   ¤   ¤   ¤   }
50a3a6 ¤   ¤   ¤   }
ee87c7 ¤   ¤   ¤
5febfa ¤   ¤   ¤   if( ! addSubKey )
41fb4b ¤   ¤   ¤   ¤   hitMessage = msg_Cancel;
6d0fe4 ¤   ¤   }
211b52 ¤   ¤
b686dc ¤   } while( hitMessage != msg_OK && hitMessage != msg_Cancel );
7e67c5 ¤
07e0d8 ¤   theDialog->Hide();
8c67c5 ¤
32f6e7 ¤   if( hitMessage == msg_OK )
47c7a1 ¤   {
d73404 ¤   ¤   PGPError¤   ¤   ¤   err;
276b6e ¤   ¤   CSecureCString256¤  passphrase;
050af6 ¤   ¤   PGPByte¤¤   ¤   ¤   *passKey = NULL;
6db4f2 ¤   ¤   PGPSize¤¤   ¤   ¤   passKeySize;
cbe3ff ¤   ¤   PGPBoolean¤ ¤   ¤   split = FALSE;
811b52 ¤   ¤
c56c19 ¤   ¤   err = GetPassForKey( mKey, &split, passphrase,
c2912f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passKey, &passKeySize );
7daf5a
--45ee 0003e44e850401201b1 Page 24 of CKeyInfoWindow.cp
2e86f8 ¤   ¤   if( IsntPGPError( err ) )
d75b34 ¤   ¤   {
33c646 ¤   ¤   ¤   PGPUInt32¤  neededBits;
d7b8ee ¤   ¤   ¤   PGPUInt32¤  currentBits;
714a19 ¤   ¤   ¤   PGPBoolean¤ fastGen;
2467c5 ¤
0f7816 ¤   ¤   ¤   err = PGPGetPrefBoolean(gPrefRef, kPGPPrefFastKeyGen, &fastGen);
ee144d ¤   ¤   ¤   pgpAssertNoErr( err );
39af5a
0823e4 ¤   ¤   ¤   neededBits = PGPGetKeyEntropyNeeded( gPGPContext,
7bb068 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeyGenParams( gPGPContext,·
976e94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPublicKeyAlgorithm_ElGamal,
045497 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tableItem.keyBits ),
ea2211 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeyGenFast( gPGPContext, fastGen ),
bfafe1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
5787c7 ¤   ¤   ¤
db2708 ¤   ¤   ¤   currentBits = PGPGlobalRandomPoolGetEntropy();
715433 ¤   ¤   ¤   if( neededBits > currentBits )
ccf776 ¤   ¤   ¤   {
dfb200 ¤   ¤   ¤   ¤   // If we're displaying the dialog, get at lest 500 bits so
a7200f ¤   ¤   ¤   ¤   // the dislog remains visible long enough to see it.
023c7a ¤   ¤   ¤   ¤   neededBits = neededBits - currentBits;
2371c8 ¤   ¤   ¤   ¤   if( neededBits < 500 )
d90095 ¤   ¤   ¤   ¤   ¤   neededBits = 500;
f9ae30 ¤   ¤   ¤   ¤   ¤
cb18de ¤   ¤   ¤   ¤   UDesktop::Deactivate();
3728b8 ¤   ¤   ¤   ¤   ¤   err = PGPCollectRandomDataDialog( gPGPContext, neededBits,
02afe1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
26090b ¤   ¤   ¤   ¤   UDesktop::Activate();
13a3a6 ¤   ¤   ¤   }
d587c7 ¤   ¤   ¤
ff698b ¤   ¤   ¤   if( IsntPGPError( err ) )
b5f776 ¤   ¤   ¤   {
8295a7 ¤   ¤   ¤   ¤   UInt32¤ ¤   ¤   ¤   expirationDays = 0;
312334 ¤   ¤   ¤   ¤   CPGPStDialogHandler¤dialogHandler(kProgressDialogResID, this);
59277e ¤   ¤   ¤   ¤   CGAProgressDialog¤  *dialogObj;
1faf1f ¤   ¤   ¤   ¤   Str255¤ ¤   ¤   ¤   caption;
3e2b85 ¤   ¤   ¤   ¤
8d4bd1 ¤   ¤   ¤   ¤   sKeyGenStartTicks = LMGetTicks();
ba2b85 ¤   ¤   ¤   ¤
31b7de ¤   ¤   ¤   ¤   dialogObj = (CGAProgressDialog *) dialogHandler.GetDialog();
b5c65d ¤   ¤   ¤   ¤   pgpAssertAddrValid( dialogObj, VoidAlign );
972b85 ¤   ¤   ¤   ¤
c78930 ¤   ¤   ¤   ¤   GetIndString( caption, kKeyInfoStringListID,
6c713e ¤   ¤   ¤   ¤   ¤   ¤   kCreatingSubkeyStrIndex );
9794aa ¤   ¤   ¤   ¤   ¤   ¤
9cd2dc ¤   ¤   ¤   ¤   dialogObj->SetCaption( caption );
c72e9a ¤   ¤   ¤   ¤   dialogObj->SetIndeterminateFlag( TRUE );
452b85 ¤   ¤   ¤   ¤
4a3454 ¤   ¤   ¤   ¤   if( tableItem.expirationDate != 0 )
4072c3 ¤   ¤   ¤   ¤   {
df2083 ¤   ¤   ¤   ¤   ¤   expirationDays = ( ( tableItem.expirationDate -
cc51ca ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tableItem.validFromDate ) / 86400 ) + 1;
482613 ¤   ¤   ¤   ¤   }
340230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
ffc400 ¤   ¤   ¤   ¤   err = PGPGenerateSubKey( gPGPContext, &tableItem.subKeyRef,
5ed870 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeyGenMasterKey( gPGPContext, mKey ),
e1b068 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeyGenParams( gPGPContext,·
216e94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPublicKeyAlgorithm_ElGamal,
395497 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tableItem.keyBits ),
97d51f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOCreationDate( gPGPContext,
a9c1b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tableItem.validFromDate ),
ddcd5b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOExpiration( gPGPContext, expirationDays ),
d62211 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOKeyGenFast( gPGPContext, fastGen ),
4e3f70 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   split ?
e5d9c1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext,
aea708 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passKey, passKeySize ) :
ada1d7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, passphrase ),
2b94e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEventHandler(gPGPContext,·
e73aec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GenerateKeyCallback,
30f8f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPUserValue) &dialogHandler ),
3eafe1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
--1a03 000a3dd6f86401201b1 Page 25 of CKeyInfoWindow.cp
cfa3a6 ¤   ¤   ¤   }
58531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
15698b ¤   ¤   ¤   if( IsntPGPError( err ) )
f2f776 ¤   ¤   ¤   {
c4f9a2 ¤   ¤   ¤   ¤   mSubkeyTable->InsertRows( 1, 32000, &tableItem,
88f9e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( tableItem ), TRUE );
326425 ¤   ¤   ¤   ¤   AdjustButtons();
fd7668 ¤   ¤   ¤   ¤   mChanged = TRUE;
6aa3a6 ¤   ¤   ¤   }
300fe4 ¤   ¤   }
195dc5 ¤   ¤   if( IsntNull( passKey ) )
57c4ad ¤   ¤   ¤   PGPFreeData( passKey );
9c9371 ¤   }
3aefe6 }
0faf5a
fc6d52 ¤   void
a62579 CKeyPanelSubkeys::RemoveSubKey(void)
ecbb36 {
50fa45 ¤   STableCell¤ theCell;
8267c5 ¤
fc4b3a ¤   theCell = mSubkeyTable->GetFirstSelectedCell();
31fe9c ¤   if( ! theCell.IsNullCell() )
87c7a1 ¤   {
2017fa ¤   ¤   Boolean¤¤   doRemove = FALSE;
fcbbe8 ¤   ¤   TableIndexT¤numRows;
764f63 ¤   ¤   TableIndexT¤numColumns;
298cad ¤   ¤   short¤  ¤   strIndex;
6c1b52 ¤   ¤
b6c1ca ¤   ¤   mSubkeyTable->UnselectAllCells();
5169be ¤   ¤   mSubkeyTable->GetTableSize( numRows, numColumns );
981b52 ¤   ¤
741189 ¤   ¤   if( numRows == 1 )
49ecbd ¤   ¤   ¤   strIndex = kConfirmRemoveLastSubkeyStrIndex;
710e1d ¤   ¤   else
9166b2 ¤   ¤   ¤   strIndex = kConfirmRemoveSubkeyStrIndex;
221b52 ¤   ¤
5ed7db ¤   ¤   if( CWarningAlert::Display( kWACautionAlertType,
e27829 ¤   ¤   ¤   ¤   ¤   kWACancelOKStyle, kKeyInfoStringListID,
0dcfd8 ¤   ¤   ¤   ¤   ¤   strIndex ) == msg_OK )
935b34 ¤   ¤   {
8640e8 ¤   ¤   ¤   SubkeyTableItem¤¤   tableItem;
2c2f4d ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof( tableItem );
67096c ¤   ¤   ¤   PGPError¤   ¤   ¤   err;
9d87c7 ¤   ¤   ¤
1db854 ¤   ¤   ¤   mSubkeyTable->GetCellData( theCell, &tableItem, dataSize );
1387c7 ¤   ¤   ¤
e6638b ¤   ¤   ¤   err = PGPRemoveSubKey( tableItem.subKeyRef );
be698b ¤   ¤   ¤   if( IsntPGPError( err ) )
88f776 ¤   ¤   ¤   {
1f99d4 ¤   ¤   ¤   ¤   mSubkeyTable->RemoveRows( 1, theCell.row, TRUE );
ee6425 ¤   ¤   ¤   ¤   AdjustButtons();
067668 ¤   ¤   ¤   ¤   mChanged = TRUE;
46a3a6 ¤   ¤   ¤   }
310fe4 ¤   ¤   }
a69371 ¤   }
7cefe6 }
0daf5a
bc6d52 ¤   void
790ef4 CKeyPanelSubkeys::RevokeSubKey(void)
85bb36 {
91fa45 ¤   STableCell¤ theCell;
c567c5 ¤
674b3a ¤   theCell = mSubkeyTable->GetFirstSelectedCell();
37fe9c ¤   if( ! theCell.IsNullCell() )
91c7a1 ¤   {
6ac1ca ¤   ¤   mSubkeyTable->UnselectAllCells();
f41b52 ¤   ¤
24d7db ¤   ¤   if( CWarningAlert::Display( kWACautionAlertType,
717829 ¤   ¤   ¤   ¤   ¤   kWACancelOKStyle, kKeyInfoStringListID,
bf94c7 ¤   ¤   ¤   ¤   ¤   kConfirmRevokeSubkeyStrIndex ) == msg_OK )
a35b34 ¤   ¤   {
a340e8 ¤   ¤   ¤   SubkeyTableItem¤¤   tableItem;
--c006 000aab68c75401201b1 Page 26 of CKeyInfoWindow.cp
202f4d ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof( tableItem );
bc987e ¤   ¤   ¤   PGPBoolean¤ ¤   ¤   needsPassphrase = FALSE,
67fdaf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   split = FALSE;
d2e308 ¤   ¤   ¤   CSecureCString256¤  passphrase;
e5096c ¤   ¤   ¤   PGPError¤   ¤   ¤   err;
a6586b ¤   ¤   ¤   PGPByte¤¤   ¤   ¤   *passKey = NULL;
92b24a ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   passKeySize;
1487c7 ¤   ¤   ¤
0eb854 ¤   ¤   ¤   mSubkeyTable->GetCellData( theCell, &tableItem, dataSize );
4487c7 ¤   ¤   ¤
db6b22 ¤   ¤   ¤   err = GetPassForKey( mKey, &split, passphrase,
8b8d59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passKey, &passKeySize );¤  ¤   ¤
5e698b ¤   ¤   ¤   if( IsntPGPError( err ) )
f9f776 ¤   ¤   ¤   {
09be63 ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetMinimumRandomData();
fc2b85 ¤   ¤   ¤   ¤
337dbe ¤   ¤   ¤   ¤   err = PGPRevokeSubKey( tableItem.subKeyRef, split ?
db382e ¤   ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, passKey, passKeySize ) :
ad8fd7 ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, passphrase ),
5d537d ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
7055be ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
822b85 ¤   ¤   ¤   ¤
175565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
3772c3 ¤   ¤   ¤   ¤   {
ecd4f6 ¤   ¤   ¤   ¤   ¤   tableItem.isRevoked = TRUE;
27ae30 ¤   ¤   ¤   ¤   ¤
ecce48 ¤   ¤   ¤   ¤   ¤   mSubkeyTable->SetCellData( theCell, &tableItem, sizeof(tabl¶
cc8e3e eItem));
d828de ¤   ¤   ¤   ¤   ¤   mSubkeyTable->Refresh();
68594d ¤   ¤   ¤   ¤   ¤   AdjustButtons();
814b00 ¤   ¤   ¤   ¤   ¤   mChanged = TRUE;
682613 ¤   ¤   ¤   ¤   }
39a3a6 ¤   ¤   ¤   }
bfb2b6 ¤   ¤   ¤   if( IsntNull( passKey ) )
1501f8 ¤   ¤   ¤   ¤   PGPFreeData( passKey );
db0fe4 ¤   ¤   }
dd9371 ¤   }
7eefe6 }
44af5a
586d52 ¤   void
3f92fc CKeyPanelSubkeys::ListenToMessage(
fe19a3 ¤   MessageT ¤  inMessage,
fd7503 ¤   void ¤  ¤   *ioParam)
26bb36 {
04769e ¤   switch( inMessage )
b4c7a1 ¤   {
5b8b64 ¤   ¤   case cmd_NewSubkey:
24c9e0 ¤   ¤   ¤   NewSubKey();
4ccdcb ¤   ¤   ¤   break;
b61b52 ¤   ¤
d93d76 ¤   ¤   case cmd_RevokeSubkey:
045bab ¤   ¤   ¤   RevokeSubKey();
02cdcb ¤   ¤   ¤   break;
3d87c7 ¤   ¤   ¤
db826c ¤   ¤   case cmd_RemoveSubkey:
577e36 ¤   ¤   ¤   RemoveSubKey();
25cdcb ¤   ¤   ¤   break;
c187c7 ¤   ¤   ¤
856320 ¤   ¤   case cmd_ChangedSubkey:
ebdf73 ¤   ¤   ¤   AdjustButtons();
3ccdcb ¤   ¤   ¤   break;
929371 ¤   }
11efe6 }
faaf5a
256d52 ¤   void
fbc323 CKeyPanelSubkeys::Show(void)
39bb36 {
1dfd24 ¤   mSubkeyTable->UnselectAllCells();
b767c5 ¤
15c135 ¤   CKeyInfoPanelView::Show();
bcefe6 }
aaaf5a
--2e01 0002572bb1d401201b1 Page 27 of CKeyInfoWindow.cp
3b6d52 ¤   void
5d60bd CKeyPanelSubkeys::AdjustButtons(void)
f2bb36 {
89f3ef ¤   Boolean¤¤   enableNewButton ¤   = FALSE;
6c627d ¤   Boolean¤¤   enableRemoveButton ¤= FALSE;
0cee01 ¤   Boolean¤¤   enableRevokeButton ¤= FALSE;
0867c5 ¤
5abab5 ¤   if( mKeyCanBeModified )
adc7a1 ¤   {
142774 ¤   ¤   Boolean¤¤   ¤   ¤   haveSelection = FALSE;
e9d873 ¤   ¤   STableCell¤ ¤   ¤   theCell;
0a4ea4 ¤   ¤   SubkeyTableItem¤¤   tableItem;
321b52 ¤   ¤
121e96 ¤   ¤   theCell = mSubkeyTable->GetFirstSelectedCell();
8cc3f4 ¤   ¤   if( ! theCell.IsNullCell() )
e85b34 ¤   ¤   {
87c0ec ¤   ¤   ¤   Uint32¤ dataSize = sizeof( tableItem );
a2af5a
5996e5 ¤   ¤   ¤   haveSelection = TRUE;
da87c7 ¤   ¤   ¤
63b854 ¤   ¤   ¤   mSubkeyTable->GetCellData( theCell, &tableItem, dataSize );
df0fe4 ¤   ¤   }
491b52 ¤   ¤
620f31 ¤   ¤   if( mKeyProperties.isSecret &&
623b0d ¤   ¤   ¤   ! mKeyProperties.isExpired &&
6d7068 ¤   ¤   ¤   ! mKeyProperties.isRevoked )
e25b34 ¤   ¤   {
8223ec ¤   ¤   ¤   enableNewButton = TRUE;
1f87c7 ¤   ¤   ¤
b61c18 ¤   ¤   ¤   if( haveSelection && ! tableItem.isRevoked )
bff776 ¤   ¤   ¤   {
95c874 ¤   ¤   ¤   ¤   enableRevokeButton = TRUE;
2ea3a6 ¤   ¤   ¤   }
e10fe4 ¤   ¤   }
511b52 ¤   ¤
b50bf3 ¤   ¤   enableRemoveButton = mKeyProperties.isSecret && haveSelection;
6b9371 ¤   }
76af5a
debe29 #if PGP_BUSINESS_SECURITY
baaf5a
a0a9d1 ¤   PGPBoolean¤ allowKeyGen;
9661e0 ¤   PGPError¤   err;
4167c5 ¤
b2d336 ¤   err = PGPGetPrefBoolean( gAdminPrefRef, kPGPPrefAllowKeyGen,
c2f706 ¤   ¤   ¤   ¤   &allowKeyGen );
23dd44 ¤   pgpAssertNoErr(err);
dc6c41 ¤   if( IsntPGPError( err ) && ! allowKeyGen )
c7c7a1 ¤   {
fd216a ¤   ¤   enableNewButton = FALSE;
9c9371 ¤   }
6367c5 ¤
9a97b2 #endif¤ // PGP_BUSINESS_SECURITY
0daf5a
577bdb ¤   if( enableNewButton )
83c7a1 ¤   {
4b3de9 ¤   ¤   mNewButton->Enable();
ea9371 ¤   }
f60e24 ¤   else
32c7a1 ¤   {
b3379a ¤   ¤   mNewButton->Disable();
209371 ¤   }
e6af5a
272003 ¤   if( enableRemoveButton )
97c7a1 ¤   {
3b33fd ¤   ¤   mRemoveButton->Enable();
8f9371 ¤   }
5e0e24 ¤   else
c4c7a1 ¤   {
206131 ¤   ¤   mRemoveButton->Disable();
f79371 ¤   }
1aaf5a
259f67 ¤   if( enableRevokeButton )
--7773 000e9078feb401201b1 Page 28 of CKeyInfoWindow.cp
f7c7a1 ¤   {
bd8a9a ¤   ¤   mRevokeButton->Enable();
389371 ¤   }
e40e24 ¤   else
52c7a1 ¤   {
db7631 ¤   ¤   mRevokeButton->Disable();
589371 ¤   }
f3efe6 }
41af5a
406d52 ¤   void
91cc67 CKeyPanelSubkeys::SetInfo(
da215d ¤   PGPKeySetRef ¤  keySet,
48aa63 ¤   PGPKeyRef ¤ ¤   key,
4585b0 ¤   PGPBoolean ¤¤   keyCanBeModified)
d2bb36 {
25fb19 ¤   PGPError¤   ¤   err;
77284e ¤   PGPSubKeyRef¤   subKeyRef;
fe67c5 ¤
a7c182 ¤   CKeyInfoPanelView::SetInfo( keySet, key, keyCanBeModified );
9667c5 ¤
b1b750 ¤   err = PGPSharedGetKeyProperties( key, NULL, &mKeyProperties );
3b8c1a ¤   pgpAssertNoErr( err );
6caf5a
715065 ¤   err = PGPKeyIterRewindSubKey( mKeyIter );
478c1a ¤   pgpAssertNoErr( err );
4a67c5 ¤
781342 ¤   mSubkeyTable->InsertCols( 1, 1, NULL, 0, TRUE );
0aaf5a
900854 ¤   while( IsntPGPError( PGPKeyIterNextSubKey( mKeyIter, &subKeyRef ) ) )
9ac7a1 ¤   {
e75b05 ¤   ¤   SubkeyTableItem¤tableItem;
d51b52 ¤   ¤
f8dfff ¤   ¤   pgpClearMemory( &tableItem, sizeof( tableItem ) );
fd1b52 ¤   ¤
68a6dd ¤   ¤   tableItem.subKeyRef = subKeyRef;
ae1b52 ¤   ¤
2efee2 ¤   ¤   err = PGPGetSubKeyNumber(subKeyRef, kPGPKeyPropBits,
410ee3 ¤   ¤   ¤   ¤   ¤   ¤   &tableItem.keyBits);
fa9832 ¤   ¤   pgpAssertNoErr( err );
4f1b52 ¤   ¤
04cdf5 ¤   ¤   err = PGPGetSubKeyTime( subKeyRef, kPGPKeyPropCreation,
c0cabb ¤   ¤   ¤   ¤   ¤   ¤   &tableItem.validFromDate );
e39832 ¤   ¤   pgpAssertNoErr( err );
2baf5a
81d2b4 ¤   ¤   err = PGPGetSubKeyTime( subKeyRef, kPGPKeyPropExpiration,
f37d41 ¤   ¤   ¤   ¤   ¤   ¤   &tableItem.expirationDate );
d79832 ¤   ¤   pgpAssertNoErr( err );
941b52 ¤   ¤
180e37 ¤   ¤   err = PGPGetSubKeyBoolean( subKeyRef, kPGPKeyPropIsRevoked,
4a4ef7 ¤   ¤   ¤   ¤   ¤   ¤   &tableItem.isRevoked );
c29832 ¤   ¤   pgpAssertNoErr( err );
0faf5a
7e5cf7 ¤   ¤   err = PGPGetSubKeyBoolean( subKeyRef, kPGPKeyPropIsExpired,
dbf5ca ¤   ¤   ¤   ¤   ¤   ¤   &tableItem.isExpired );
6a9832 ¤   ¤   pgpAssertNoErr( err );
dd94aa ¤   ¤   ¤   ¤   ¤   ¤
8ac944 ¤   ¤   mSubkeyTable->InsertRows( 1, 32000, &tableItem, sizeof( tableItem ),
71a699 ¤   ¤   ¤   ¤   ¤   ¤   TRUE );
879371 ¤   }
fd67c5 ¤
814ffc ¤   if( ! mKeyProperties.isSecret )
bcc7a1 ¤   {
f0c45f ¤   ¤   LPane¤  *pane;
711b52 ¤   ¤
058262 ¤   ¤   // Hide explanatory text at the bottom of the panel.
ae1b52 ¤   ¤
5cd073 ¤   ¤   pane = FindPaneByID( 1 );
0d66f8 ¤   ¤   pgpAssertAddrValid( pane, VoidAlign );
d81b52 ¤   ¤
f13664 ¤   ¤   pane->Hide();
7daf5a
e9cdbf ¤   ¤   pane = FindPaneByID( 2 );
--cb8c 000514ab0ca401201b1 Page 29 of CKeyInfoWindow.cp
0966f8 ¤   ¤   pgpAssertAddrValid( pane, VoidAlign );
fb1b52 ¤   ¤
bf3664 ¤   ¤   pane->Hide();
23af5a
dac6fb ¤   ¤   pane = FindPaneByID( 3 );
2966f8 ¤   ¤   pgpAssertAddrValid( pane, VoidAlign );
1b1b52 ¤   ¤
593664 ¤   ¤   pane->Hide();
be9371 ¤   }
6e67c5 ¤
175aff ¤   AdjustButtons();
d5efe6 }
6eaf5a
cf72df #pragma mark --- CADKTable ---
eeaf5a
fc327f typedef struct ADKTableItem
0ebb36 {
35f1d8 ¤   PGPKeyRef¤  keyRef;
cfd56b ¤   PGPKeyID¤   keyID;¤ /* Valid if keyRef is invalid */
db210f ¤   PGPByte¤¤   adkClass;
8e67c5 ¤
08bf6f } ADKTableItem;
9eaf5a
7ed932 class CADKTable¤:¤  public LTableView
31bb36 {
765ed4 public:
acaf5a
b20381 ¤   enum { class_ID = 'tADK' };
7f67c5 ¤
3459af ¤   ¤   ¤   ¤   ¤   CADKTable(LStream *inStream);
f5fb3e ¤   virtual¤¤   ¤   ~CADKTable(void);
cbaf5a
39cfa2 ¤   virtual void¤   ClickSelf(const SMouseDownEvent &inMouseDown);
d34b2f ¤   virtual void¤   DrawSelf(void);
7caf5a
a8a2d3 protected:
99af5a
287fef ¤   void¤   ¤   ¤   DrawCell(const STableCell &inCell,
7292e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect &inLocalRect);
a58dda ¤   virtual void¤   HiliteCellActively(const STableCell &inCell,
d7a977 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inHilite);
98ea82 ¤   virtual void¤   HiliteCellInactively( const STableCell &inCell,
06a977 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inHilite);
7482f7 };
96af5a
b71d43 CADKTable::CADKTable(LStream *inStream)
ccba7e ¤   ¤   : LTableView(inStream)
7bbb36 {
10a167 ¤   mTableGeometry ¤= new LTableMonoGeometry( this, mFrameSize.width, 18 );
d92079 ¤   mTableSelector ¤= new LTableSingleSelector( this );
2d8369 ¤   mTableStorage ¤ = new LTableArrayStorage( this, sizeof( ADKTableItem ) );
98efe6 }
30af5a
1d85f0 CADKTable::~CADKTable(void)
82bb36 {
0fefe6 }
f2af5a
436d52 ¤   void
5e0491 CADKTable::DrawSelf(void)
f3bb36 {
c8d8a7 ¤   Rect frame;
01af5a
9fcebc ¤   RGBForeColor( &UGAColorRamp::GetColor(colorRamp_Gray1) );
c108df ¤   RGBBackColor( &UGAColorRamp::GetColor(colorRamp_White) );
5067c5 ¤
0c67b9 ¤   CalcLocalFrameRect( frame );
a767c5 ¤
2ec7a1 ¤   {
4a44fe ¤   ¤   StDeviceLoop¤   devLoop( frame );¤  ¤
c277ad ¤   ¤   SInt16¤ ¤   ¤   depth;
03af5a
513977 ¤   ¤   while( devLoop.NextDepth( depth ) )
--e0b8 00071832f7e401201b1 Page 30 of CKeyInfoWindow.cp
e35b34 ¤   ¤   {
58214b ¤   ¤   ¤   if( depth > 1 )
a3e594 ¤   ¤   ¤   ¤   PaintRect( &frame );
9cbb8c ¤   ¤   ¤   else
2f3d87 ¤   ¤   ¤   ¤   EraseRect( &frame );
340fe4 ¤   ¤   }
709371 ¤   }
0067c5 ¤
4ade04 ¤   LTableView::DrawSelf();
7fefe6 }
84af5a
6c6d52 ¤   void
f24ca8 CADKTable::DrawCell(
921bb3 ¤   const STableCell¤   &inCell,
afc050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
54bb36 {
e9981b ¤   StDeviceLoop¤   devLoop( inLocalRect );¤¤
9d6385 ¤   SInt16¤ ¤   ¤   depth;
c0fb19 ¤   PGPError¤   ¤   err;
f78fce ¤   ADKTableItem¤   tableItem;
17b37e ¤   Uint32¤ ¤   ¤   dataSize;
779793 ¤   ResIDT¤ ¤   ¤   iconResID;
d56e14 ¤   Str255¤ ¤   ¤   str;
b50841 ¤   Rect¤   ¤   ¤   keyIconRect;
96ca61 ¤   Rect¤   ¤   ¤   requiredIconRect;
5808e5 ¤   Rect¤   ¤   ¤   nameRect;
b03230 ¤   Rect¤   ¤   ¤   textRect;
f5f911 ¤   FontInfo¤   ¤   fontInfo;
26088d ¤   PGPUInt32¤  ¤   maxTextWidth;
ed6e12 ¤   PGPUInt32¤  ¤   textBaseLine;
0967c5 ¤
2ddf11 ¤   iconResID = kDSAKeyIconID;
7867c5 ¤
b84566 ¤   dataSize = sizeof( tableItem );
f3ac8e ¤   GetCellData( inCell, &tableItem, dataSize );
2baf5a
00a80c ¤   if( PGPKeyRefIsValid( tableItem.keyRef ) )
03c7a1 ¤   {
ef407f ¤   ¤   PGPSize¤¤   len;
a1f1d9 ¤   ¤   PGPInt32¤   algorithm;
801b52 ¤   ¤
353bc7 ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer( tableItem.keyRef,
b3e3ca ¤   ¤   ¤   sizeof( str ) - 1, (char *) &str[1], &len );
e49832 ¤   ¤   pgpAssertNoErr( err );
0a1b52 ¤   ¤
a36b08 ¤   ¤   str[0] = len;
641b52 ¤   ¤
357452 ¤   ¤   err = PGPGetKeyNumber( tableItem.keyRef, kPGPKeyPropAlgID,
9fbc18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm);
6a9832 ¤   ¤   pgpAssertNoErr( err );
c61b52 ¤   ¤
3dec30 ¤   ¤   if( algorithm != kPGPPublicKeyAlgorithm_DSA )
d85b34 ¤   ¤   {
a2ca27 ¤   ¤   ¤   iconResID = kRSAKeyIconID;
110fe4 ¤   ¤   }
ce9371 ¤   }
c40e24 ¤   else
1cc7a1 ¤   {
234744 ¤   ¤   Str255¤ tempStr;
9ffb03 ¤   ¤   char¤   keyIDString[ kPGPMaxKeyIDStringSize ];
621b52 ¤   ¤
eaff0b ¤   ¤   err = PGPGetKeyIDString( &tableItem.keyID,
702493 ¤   ¤   ¤   ¤   ¤   kPGPKeyIDString_Abbreviated, keyIDString );
609832 ¤   ¤   pgpAssertNoErr( err );
b81b52 ¤   ¤
531b68 ¤   ¤   CToPString( keyIDString, tempStr );
231b52 ¤   ¤
f1f467 ¤   ¤   GetIndString( str, kKeyInfoStringListID, kUnknownMRKID );
bf41f1 ¤   ¤   PrintPString( str, str, tempStr );
489371 ¤   }
e767c5 ¤
71fe7e ¤   #define kIconMargin¤¤   5
--9815 00042d123d7401201b1 Page 31 of CKeyInfoWindow.cp
cd8cc4 ¤   #define kTextMargin¤¤   5
e31b52 ¤   ¤
fda858 ¤   // This code assumes that we're drawing 16x16 icons.
f9f3c9 ¤   keyIconRect.left ¤  = inLocalRect.left + kIconMargin;
c0c2af ¤   keyIconRect.right¤  = keyIconRect.left ·+ 16;
5d6e18 ¤   keyIconRect.top¤¤   = inLocalRect.top;
063ef3 ¤   keyIconRect.bottom¤ = keyIconRect.top + 16;
a967c5 ¤
92b545 ¤   AlignRect( &inLocalRect, &keyIconRect, kAlignAtVerticalCenter );
79af5a
4b3542 ¤   requiredIconRect.right ¤= inLocalRect.right - kIconMargin;
da4b3e ¤   requiredIconRect.left¤  = requiredIconRect.right - 16;
735084 ¤   requiredIconRect.top¤   = inLocalRect.top;
69e0b3 ¤   requiredIconRect.bottom¤= requiredIconRect.top + 16;
b567c5 ¤
2b9267 ¤   AlignRect( &inLocalRect, &requiredIconRect, kAlignAtVerticalCenter );
21af5a
1ba907 ¤   nameRect ¤  ¤   = inLocalRect;
96b9c6 ¤   nameRect.left ¤ = keyIconRect.right + kIconMargin;
6e609a ¤   nameRect.right ¤= requiredIconRect.left - kIconMargin;
17af5a
fc12a9 ¤   // Geneva 9 left
9c1056 ¤   UTextTraits::SetPortTextTraits( 135 );
e4f556 ¤   GetFontInfo( &fontInfo );
8567c5 ¤
5084f3 ¤   textRect ¤  ¤   = nameRect;
fa4c24 ¤   textRect.bottom¤= textRect.top + fontInfo.ascent +
53b2c3 ¤   ¤   ¤   ¤   ¤   ¤   fontInfo.descent + fontInfo.leading;
690329 ¤   textRect.left¤  = textRect.left + kTextMargin;
6510a2 ¤   textRect.right¤ = textRect.right - kTextMargin;
d867c5 ¤
3e0fc6 ¤   AlignRect( &inLocalRect, &textRect, kAlignAtVerticalCenter );
507b09 ¤   textBaseLine = textRect.bottom - fontInfo.descent - 1;
9967c5 ¤
ca3dbc ¤   maxTextWidth = UGraphicUtils::RectWidth( textRect );
3898db ¤   if( StringWidth( str ) > maxTextWidth )
93c7a1 ¤   {
4300c4 ¤   ¤   TruncString( maxTextWidth, str, smTruncMiddle );
299371 ¤   }
de67c5 ¤
cd47bd ¤   while( devLoop.NextDepth(depth) )
ecc7a1 ¤   {
ab9af1 ¤   ¤   if(depth >= 8)
4f5b34 ¤   ¤   {
54a97d ¤   ¤   ¤   // Draw MacOS8-like background for cells, selected column
a03da4 ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Gray1 ) );
5f36b8 ¤   ¤   ¤   PaintRect( &inLocalRect );
8187c7 ¤   ¤   ¤
d395ca ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Gray2 ) );
af6ca3 ¤   ¤   ¤   PaintRect( &nameRect );
dd87c7 ¤   ¤   ¤
76777a ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_White ) );
c66d39 ¤   ¤   ¤   MoveTo( inLocalRect.left, inLocalRect.bottom - 1 );
2caf86 ¤   ¤   ¤   LineTo( inLocalRect.right - 1, inLocalRect.bottom - 1 );
2987c7 ¤   ¤   ¤
eb83fa ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Black ) );
b40fe4 ¤   ¤   }
d50e1d ¤   ¤   else
185b34 ¤   ¤   {
d3d0c8 ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Black ));
c2dc8e ¤   ¤   ¤   RGBBackColor( &UGAColorRamp::GetColor( colorRamp_White ));
c9dd62 ¤   ¤   ¤   EraseRect( &inLocalRect );
670fe4 ¤   ¤   }
ca1b52 ¤   ¤
c2f3ed ¤   ¤   // Draw icon
fbb515 ¤   ¤   PlotIconID( &keyIconRect, kAlignNone, kTransformNone, iconResID );
78af5a
681274 ¤   ¤   // Draw the item name
921b52 ¤   ¤
cca96d ¤   ¤   MoveTo( textRect.left, textBaseLine );
630dd6 ¤   ¤   DrawString( str );
42af5a
--8d7d 000eb9ac023401201b1 Page 32 of CKeyInfoWindow.cp
bb38de ¤   ¤   // Draw required icon
248fda ¤   ¤   PlotIconID( &requiredIconRect, kAlignNone, kTransformNone,
7ff449 ¤   ¤   ¤   ¤   ·( (tableItem.adkClass & 0x80) != 0) ? kMRKActiveIconID :
f161d8 ¤   ¤   ¤   ¤   ·kKeyAttrOffIconID );
e29371 ¤   }
8cefe6 }
29af5a
246d52 ¤   void
5e08eb CADKTable::HiliteCellActively(
d11bb3 ¤   const STableCell¤   &inCell,
21a368 ¤   Boolean¤¤   ¤   ¤   inHilite)
c7bb36 {
1c380a ¤   (void) inCell;
52668d ¤   (void) inHilite;
55efe6 }
5daf5a
106d52 ¤   void
afcd57 CADKTable::HiliteCellInactively(
301bb3 ¤   const STableCell¤   &inCell,
5a2697 ¤   Boolean¤¤   ¤   ·¤  inHilite)
79bb36 {
ca380a ¤   (void) inCell;
8f668d ¤   (void) inHilite;
35efe6 }
54af5a
c86d52 ¤   void
de8f3e CADKTable::ClickSelf(const SMouseDownEvent &inMouseDown)
c5bb36 {
c35be1 ¤   (void) inMouseDown;
47efe6 }
71af5a
eaaf5a
ba066e #pragma mark --- CKeyPanelADK ---
19af5a
bff0b4 class CKeyPanelADK : public CKeyInfoPanelView
83bb36 {
db5ed4 public:
d8af5a
15b9e9 ¤   enum { class_ID = 'vKIA' };
f8af5a
c07455 ¤   ¤   ¤   ¤   ¤   CKeyPanelADK(LStream *inStream);
db4f64 ¤   virtual¤¤   ¤   ~CKeyPanelADK(void);
df67c5 ¤
34fb0f ¤   virtual void¤   SetInfo(PGPKeySetRef keySet, PGPKeyRef theKey,
327cd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean keyCanBeModified);
70af5a
bda2d3 protected:
ceaf5a
5f90d4 ¤   virtual¤void¤   FinishCreateSelf(void);
7167c5 ¤
400fb9 private:
80af5a
a22f4b ¤   enum
c6c7a1 ¤   {
4d2d3e ¤   ¤   kADKTablePaneID = 'ADKs'
6162bd ¤   };
c467c5 ¤
6c2b0b ¤   CADKTable¤  ¤   *mADKTable;
fa82f7 };
d3af5a
7faf5a
0ae8f7 CKeyPanelADK::CKeyPanelADK(LStream *inStream)
33cda9 ¤   : CKeyInfoPanelView( inStream )
2abb36 {
90efe6 }
9aaf5a
5519f0 CKeyPanelADK::~CKeyPanelADK()
95bb36 {
60efe6 }
25af5a
656d52 ¤   void
eb93c2 CKeyPanelADK::FinishCreateSelf(void)
--8273 0007819a41a401201b1 Page 33 of CKeyInfoWindow.cp
2cbb36 {
dafecb ¤   CKeyInfoPanelView::FinishCreateSelf();
7d67c5 ¤
5c3658 ¤   mADKTable = (CADKTable *) FindPaneByID( kADKTablePaneID );
32673b ¤   pgpAssertAddrValid( mADKTable, VoidAlign );
caefe6 }
ddaf5a
f86d52 ¤   void
c1f663 CKeyPanelADK::SetInfo(
a9215d ¤   PGPKeySetRef ¤  keySet,
d3aa63 ¤   PGPKeyRef ¤ ¤   key,
a685b0 ¤   PGPBoolean ¤¤   keyCanBeModified)
12bb36 {
bbfb19 ¤   PGPError¤   ¤   err;
118597 ¤   PGPUInt32¤  ¤   numADKeys;
7667c5 ¤
f0c182 ¤   CKeyInfoPanelView::SetInfo( keySet, key, keyCanBeModified );
f467c5 ¤
3a1b32 ¤   err = PGPCountAdditionalRecipientRequests( key, &numADKeys );
095bad ¤   if( IsntPGPError( err ) && numADKeys > 0 )
60c7a1 ¤   {
b52808 ¤   ¤   PGPUInt32¤  ¤   adkIndex;
8e1b52 ¤   ¤
ccb85d ¤   ¤   mADKTable->InsertCols( 1, 1, NULL, 0, TRUE );
80af5a
82e6bd ¤   ¤   for( adkIndex = 0; adkIndex < numADKeys; adkIndex++ )
905b34 ¤   ¤   {
274242 ¤   ¤   ¤   ADKTableItem¤   tableItem;
e7870f ¤   ¤   ¤   Boolean¤¤   ¤   addTableItem = TRUE;
8787c7 ¤   ¤   ¤
25df1d ¤   ¤   ¤   pgpClearMemory( &tableItem, sizeof( tableItem ) );
c087c7 ¤   ¤   ¤
a506af ¤   ¤   ¤   err = PGPGetIndexedAdditionalRecipientRequestKey( key, keySet,
ee0118 ¤   ¤   ¤   ¤   ¤   ¤   adkIndex, &tableItem.keyRef, &tableItem.keyID,
a649d2 ¤   ¤   ¤   ¤   ¤   ¤   &tableItem.adkClass );
aa59df ¤   ¤   ¤   if( IsPGPError( err ) )
da1a44 ¤   ¤   ¤   ¤   addTableItem = FALSE;
1887c7 ¤   ¤   ¤
4143f5 ¤   ¤   ¤   if( addTableItem )
c6f776 ¤   ¤   ¤   {
3b8b29 ¤   ¤   ¤   ¤   mADKTable->InsertRows( 1, 32000, &tableItem, sizeof( tableItem ¶
f2baec ),
7fa699 ¤   ¤   ¤   ¤   ¤   ¤   TRUE );
88a3a6 ¤   ¤   ¤   }
bc0fe4 ¤   ¤   }
4e9371 ¤   }
8defe6 }
7daf5a
1c612c #pragma mark --- CRevokerTable ---
90af5a
ba35cb typedef struct RevokerTableItem
4bbb36 {
e4f1d8 ¤   PGPKeyRef¤  keyRef;
dbd56b ¤   PGPKeyID¤   keyID;¤ /* Valid if keyRef is invalid */
9667c5 ¤
c6168a } RevokerTableItem;
ceaf5a
2c7813 class CRevokerTable¤:¤  public LTableView
d5bb36 {
e55ed4 public:
34af5a
eadc70 ¤   enum { class_ID = 'tRev' };
d067c5 ¤
96a7b1 ¤   ¤   ¤   ¤   ¤   CRevokerTable(LStream *inStream);
23643c ¤   virtual¤¤   ¤   ~CRevokerTable(void);
1baf5a
f4cfa2 ¤   virtual void¤   ClickSelf(const SMouseDownEvent &inMouseDown);
be4b2f ¤   virtual void¤   DrawSelf(void);
78af5a
e9a2d3 protected:
9daf5a
787fef ¤   void¤   ¤   ¤   DrawCell(const STableCell &inCell,
--07e9 000d1919322401201b1 Page 34 of CKeyInfoWindow.cp
8092e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect &inLocalRect);
038dda ¤   virtual void¤   HiliteCellActively(const STableCell &inCell,
72a977 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inHilite);
f4ea82 ¤   virtual void¤   HiliteCellInactively( const STableCell &inCell,
71a977 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inHilite);
7982f7 };
a9af5a
06e834 CRevokerTable::CRevokerTable(LStream *inStream)
2aba7e ¤   ¤   : LTableView(inStream)
14bb36 {
b6a167 ¤   mTableGeometry ¤= new LTableMonoGeometry( this, mFrameSize.width, 18 );
722079 ¤   mTableSelector ¤= new LTableSingleSelector( this );
9ebe3d ¤   mTableStorage ¤ = new LTableArrayStorage( this, sizeof( RevokerTableItem ) ¶
336275 );
69efe6 }
53af5a
daa263 CRevokerTable::~CRevokerTable(void)
9ebb36 {
a2efe6 }
6daf5a
fa6d52 ¤   void
c2dc0a CRevokerTable::DrawSelf(void)
16bb36 {
3bd8a7 ¤   Rect frame;
7caf5a
f4cebc ¤   RGBForeColor( &UGAColorRamp::GetColor(colorRamp_Gray1) );
ea08df ¤   RGBBackColor( &UGAColorRamp::GetColor(colorRamp_White) );
9767c5 ¤
6667b9 ¤   CalcLocalFrameRect( frame );
2367c5 ¤
03c7a1 ¤   {
2f44fe ¤   ¤   StDeviceLoop¤   devLoop( frame );¤  ¤
4777ad ¤   ¤   SInt16¤ ¤   ¤   depth;
d9af5a
d93977 ¤   ¤   while( devLoop.NextDepth( depth ) )
ca5b34 ¤   ¤   {
38214b ¤   ¤   ¤   if( depth > 1 )
77e594 ¤   ¤   ¤   ¤   PaintRect( &frame );
2dbb8c ¤   ¤   ¤   else
603d87 ¤   ¤   ¤   ¤   EraseRect( &frame );
a70fe4 ¤   ¤   }
659371 ¤   }
0267c5 ¤
25de04 ¤   LTableView::DrawSelf();
a9efe6 }
88af5a
516d52 ¤   void
085c4f CRevokerTable::DrawCell(
651bb3 ¤   const STableCell¤   &inCell,
76c050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
4fbb36 {
6b981b ¤   StDeviceLoop¤   devLoop( inLocalRect );¤¤
df6385 ¤   SInt16¤ ¤   ¤   depth;
c7fb19 ¤   PGPError¤   ¤   err;
8756e3 ¤   RevokerTableItem¤   tableItem;
efb37e ¤   Uint32¤ ¤   ¤   dataSize;
5c9793 ¤   ResIDT¤ ¤   ¤   iconResID;
066e14 ¤   Str255¤ ¤   ¤   str;
b40841 ¤   Rect¤   ¤   ¤   keyIconRect;
3708e5 ¤   Rect¤   ¤   ¤   nameRect;
153230 ¤   Rect¤   ¤   ¤   textRect;
aaf911 ¤   FontInfo¤   ¤   fontInfo;
6a088d ¤   PGPUInt32¤  ¤   maxTextWidth;
f66e12 ¤   PGPUInt32¤  ¤   textBaseLine;
6067c5 ¤
1ddf11 ¤   iconResID = kDSAKeyIconID;
aa67c5 ¤
804566 ¤   dataSize = sizeof( tableItem );
9eac8e ¤   GetCellData( inCell, &tableItem, dataSize );
64af5a
13a80c ¤   if( PGPKeyRefIsValid( tableItem.keyRef ) )
d1c7a1 ¤   {
--767a 00031fbdbfc401201b1 Page 35 of CKeyInfoWindow.cp
88407f ¤   ¤   PGPSize¤¤   len;
bef1d9 ¤   ¤   PGPInt32¤   algorithm;
501b52 ¤   ¤
de3bc7 ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer( tableItem.keyRef,
ece3ca ¤   ¤   ¤   sizeof( str ) - 1, (char *) &str[1], &len );
1d9832 ¤   ¤   pgpAssertNoErr( err );
141b52 ¤   ¤
1b6b08 ¤   ¤   str[0] = len;
c91b52 ¤   ¤
257452 ¤   ¤   err = PGPGetKeyNumber( tableItem.keyRef, kPGPKeyPropAlgID,
dfbc18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm);
bb9832 ¤   ¤   pgpAssertNoErr( err );
451b52 ¤   ¤
12ec30 ¤   ¤   if( algorithm != kPGPPublicKeyAlgorithm_DSA )
725b34 ¤   ¤   {
88ca27 ¤   ¤   ¤   iconResID = kRSAKeyIconID;
250fe4 ¤   ¤   }
f69371 ¤   }
7f0e24 ¤   else
fec7a1 ¤   {
944744 ¤   ¤   Str255¤ tempStr;
a4fb03 ¤   ¤   char¤   keyIDString[ kPGPMaxKeyIDStringSize ];
241b52 ¤   ¤
15ff0b ¤   ¤   err = PGPGetKeyIDString( &tableItem.keyID,
602493 ¤   ¤   ¤   ¤   ¤   kPGPKeyIDString_Abbreviated, keyIDString );
579832 ¤   ¤   pgpAssertNoErr( err );
fa1b52 ¤   ¤
3d1b68 ¤   ¤   CToPString( keyIDString, tempStr );
941b52 ¤   ¤
8cf467 ¤   ¤   GetIndString( str, kKeyInfoStringListID, kUnknownMRKID );
9641f1 ¤   ¤   PrintPString( str, str, tempStr );
db9371 ¤   }
1467c5 ¤
9ffe7e ¤   #define kIconMargin¤¤   5
008cc4 ¤   #define kTextMargin¤¤   5
cf1b52 ¤   ¤
88a858 ¤   // This code assumes that we're drawing 16x16 icons.
6ef3c9 ¤   keyIconRect.left ¤  = inLocalRect.left + kIconMargin;
74c2af ¤   keyIconRect.right¤  = keyIconRect.left ·+ 16;
c86e18 ¤   keyIconRect.top¤¤   = inLocalRect.top;
cb3ef3 ¤   keyIconRect.bottom¤ = keyIconRect.top + 16;
d467c5 ¤
8cb545 ¤   AlignRect( &inLocalRect, &keyIconRect, kAlignAtVerticalCenter );
7baf5a
0ca907 ¤   nameRect ¤  ¤   = inLocalRect;
cbb9c6 ¤   nameRect.left ¤ = keyIconRect.right + kIconMargin;
18af5a
1d12a9 ¤   // Geneva 9 left
fb1056 ¤   UTextTraits::SetPortTextTraits( 135 );
2bf556 ¤   GetFontInfo( &fontInfo );
2767c5 ¤
2c84f3 ¤   textRect ¤  ¤   = nameRect;
e64c24 ¤   textRect.bottom¤= textRect.top + fontInfo.ascent +
1cb2c3 ¤   ¤   ¤   ¤   ¤   ¤   fontInfo.descent + fontInfo.leading;
c60329 ¤   textRect.left¤  = textRect.left + kTextMargin;
9f10a2 ¤   textRect.right¤ = textRect.right - kTextMargin;
b767c5 ¤
370fc6 ¤   AlignRect( &inLocalRect, &textRect, kAlignAtVerticalCenter );
467b09 ¤   textBaseLine = textRect.bottom - fontInfo.descent - 1;
de67c5 ¤
ef3dbc ¤   maxTextWidth = UGraphicUtils::RectWidth( textRect );
2298db ¤   if( StringWidth( str ) > maxTextWidth )
bac7a1 ¤   {
e000c4 ¤   ¤   TruncString( maxTextWidth, str, smTruncMiddle );
449371 ¤   }
8d67c5 ¤
4547bd ¤   while( devLoop.NextDepth(depth) )
53c7a1 ¤   {
a89af1 ¤   ¤   if(depth >= 8)
b75b34 ¤   ¤   {
5ea97d ¤   ¤   ¤   // Draw MacOS8-like background for cells, selected column
313da4 ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Gray1 ) );
--267b 0006abfef16401201b1 Page 36 of CKeyInfoWindow.cp
2a36b8 ¤   ¤   ¤   PaintRect( &inLocalRect );
1e87c7 ¤   ¤   ¤
ab95ca ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Gray2 ) );
9e6ca3 ¤   ¤   ¤   PaintRect( &nameRect );
3987c7 ¤   ¤   ¤
95777a ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_White ) );
e36d39 ¤   ¤   ¤   MoveTo( inLocalRect.left, inLocalRect.bottom - 1 );
2daf86 ¤   ¤   ¤   LineTo( inLocalRect.right - 1, inLocalRect.bottom - 1 );
e787c7 ¤   ¤   ¤
6e83fa ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Black ) );
220fe4 ¤   ¤   }
520e1d ¤   ¤   else
1e5b34 ¤   ¤   {
e1d0c8 ¤   ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor( colorRamp_Black ));
bfdc8e ¤   ¤   ¤   RGBBackColor( &UGAColorRamp::GetColor( colorRamp_White ));
3cdd62 ¤   ¤   ¤   EraseRect( &inLocalRect );
520fe4 ¤   ¤   }
3c1b52 ¤   ¤
98f3ed ¤   ¤   // Draw icon
17b515 ¤   ¤   PlotIconID( &keyIconRect, kAlignNone, kTransformNone, iconResID );
1baf5a
4a1274 ¤   ¤   // Draw the item name
1d1b52 ¤   ¤
d3a96d ¤   ¤   MoveTo( textRect.left, textBaseLine );
9e0dd6 ¤   ¤   DrawString( str );
7a9371 ¤   }
d8efe6 }
4baf5a
166d52 ¤   void
976cb2 CRevokerTable::HiliteCellActively(
1b1bb3 ¤   const STableCell¤   &inCell,
82a368 ¤   Boolean¤¤   ¤   ¤   inHilite)
f5bb36 {
f9380a ¤   (void) inCell;
b9668d ¤   (void) inHilite;
51efe6 }
b1af5a
3b6d52 ¤   void
61ec9a CRevokerTable::HiliteCellInactively(
6f1bb3 ¤   const STableCell¤   &inCell,
bc2697 ¤   Boolean¤¤   ¤   ·¤  inHilite)
1cbb36 {
d9380a ¤   (void) inCell;
af668d ¤   (void) inHilite;
74efe6 }
6daf5a
2d6d52 ¤   void
95e20b CRevokerTable::ClickSelf(const SMouseDownEvent &inMouseDown)
cabb36 {
8d5be1 ¤   (void) inMouseDown;
0aefe6 }
3caf5a
e8cb9e #pragma mark --- CKeyPanelRevoker ---
4caf5a
8a8219 class CKeyPanelRevoker : public CKeyInfoPanelView
05bb36 {
4c5ed4 public:
48af5a
d3f724 ¤   enum { class_ID = 'vKIR' };
e5af5a
350453 ¤   ¤   ¤   ¤   ¤   CKeyPanelRevoker(LStream *inStream);
2df3fd ¤   virtual¤¤   ¤   ~CKeyPanelRevoker(void);
c967c5 ¤
bffb0f ¤   virtual void¤   SetInfo(PGPKeySetRef keySet, PGPKeyRef theKey,
9c7cd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean keyCanBeModified);
00af5a
b3a2d3 protected:
c0af5a
8d90d4 ¤   virtual¤void¤   FinishCreateSelf(void);
3d67c5 ¤
0f0fb9 private:
6aaf5a
--a958 000dd146292401201b1 Page 37 of CKeyInfoWindow.cp
602f4b ¤   enum
66c7a1 ¤   {
764e5f ¤   ¤   kRevokerTablePaneID = 'Rev '
f662bd ¤   };
0167c5 ¤
c14c77 ¤   CRevokerTable¤  ¤   *mRevokerTable;
dc82f7 };
ebaf5a
ccaf5a
5836f2 CKeyPanelRevoker::CKeyPanelRevoker(LStream *inStream)
1dcda9 ¤   : CKeyInfoPanelView( inStream )
f8bb36 {
d7efe6 }
bfaf5a
b39025 CKeyPanelRevoker::~CKeyPanelRevoker()
15bb36 {
9defe6 }
f9af5a
476d52 ¤   void
617bd8 CKeyPanelRevoker::FinishCreateSelf(void)
f4bb36 {
2dfecb ¤   CKeyInfoPanelView::FinishCreateSelf();
7e67c5 ¤
36a8bf ¤   mRevokerTable = (CRevokerTable *) FindPaneByID( kRevokerTablePaneID );
a55020 ¤   pgpAssertAddrValid( mRevokerTable, VoidAlign );
78efe6 }
16af5a
706d52 ¤   void
c29865 CKeyPanelRevoker::SetInfo(
ca215d ¤   PGPKeySetRef ¤  keySet,
3caa63 ¤   PGPKeyRef ¤ ¤   key,
c085b0 ¤   PGPBoolean ¤¤   keyCanBeModified)
49bb36 {
f9fb19 ¤   PGPError¤   ¤   err;
25b6bb ¤   PGPUInt32¤  ¤   numRevokerKeys;
c7b041 ¤   PGPKeySetRef¤   mainKeySet = CPGPKeys::TheApp()->GetKeySet();
cd67c5 ¤
c9c182 ¤   CKeyInfoPanelView::SetInfo( keySet, key, keyCanBeModified );
e867c5 ¤
9e2350 ¤   err = PGPCountRevocationKeys( key, &numRevokerKeys );
e49e41 ¤   if( IsntPGPError( err ) && numRevokerKeys > 0 )
2ec7a1 ¤   {
850485 ¤   ¤   PGPUInt32¤  ¤   keyIndex;
2d1b52 ¤   ¤
a53c12 ¤   ¤   mRevokerTable->InsertCols( 1, 1, NULL, 0, TRUE );
39af5a
f8d9a3 ¤   ¤   for( keyIndex = 0; keyIndex < numRevokerKeys; keyIndex++ )
e35b34 ¤   ¤   {
a3195c ¤   ¤   ¤   RevokerTableItem¤   tableItem;
c087c7 ¤   ¤   ¤
f7df1d ¤   ¤   ¤   pgpClearMemory( &tableItem, sizeof( tableItem ) );
fa87c7 ¤   ¤   ¤
630974 ¤   ¤   ¤   err = PGPGetIndexedRevocationKey( key, keySet,
4d82c0 ¤   ¤   ¤   ¤   ¤   ¤   keyIndex, &tableItem.keyRef, &tableItem.keyID );
3a698b ¤   ¤   ¤   if( IsntPGPError( err ) )
abf776 ¤   ¤   ¤   {
74260f ¤   ¤   ¤   ¤   if( ! PGPKeyRefIsValid( tableItem.keyRef ) &&
f03987 ¤   ¤   ¤   ¤   ¤   PGPKeySetRefIsValid( mainKeySet ) &&
5e900d ¤   ¤   ¤   ¤   ¤   mainKeySet != keySet )
f272c3 ¤   ¤   ¤   ¤   {
61a3e7 ¤   ¤   ¤   ¤   ¤   /*
6f77ee ¤   ¤   ¤   ¤   ¤   ** Search the main key set for the revoker key. We would
d0dd33 ¤   ¤   ¤   ¤   ¤   ** never really do this when processing a revoker because
bd5fd3 ¤   ¤   ¤   ¤   ¤   ** strict fingerprint checking is required, however is
7a9858 ¤   ¤   ¤   ¤   ¤   ** it adequate to do so here for display purposes.
66e4e2 ¤   ¤   ¤   ¤   ¤   */
28ae30 ¤   ¤   ¤   ¤   ¤
20098c ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyByKeyID( mainKeySet, &tableItem.keyID,
1931da ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPublicKeyAlgorithm_DSA, &tableItem.keyRef );
1514ec ¤   ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
0dffbf ¤   ¤   ¤   ¤   ¤   ¤   tableItem.keyRef = kInvalidPGPKeyRef;
dd2613 ¤   ¤   ¤   ¤   }
--667a 0006a4224cb401201b1 Page 38 of CKeyInfoWindow.cp
d6ae30 ¤   ¤   ¤   ¤   ¤
fb3917 ¤   ¤   ¤   ¤   mRevokerTable->InsertRows( 1, 32000, &tableItem,
9c96da ¤   ¤   ¤   ¤   ¤   ¤   sizeof( tableItem ), TRUE );
90a3a6 ¤   ¤   ¤   }
930fe4 ¤   ¤   }
e49371 ¤   }
2cefe6 }
f8af5a
dee3d3 #pragma mark --- CKeyInfoWindow ---
adaf5a
de38e5 /*
c2926a Pass NIL for the table to OpenKeyInfo to disable redrawing the
8388af table on close and disable all editable control in the key info
cb0ccb window. ·This is useful for editing keyserver search keysets
d7fa44 for instance where you can't modify the trust, etc...
d77fe0 */
827e69 ¤   Boolean
279fff CKeyInfoWindow::OpenKeyInfo(PGPKey *key, CKeyTable *table)
dcbb36 {
772cdd ¤   CKeyInfoWindow *keyInfoWindow;
475c41 ¤   short kiIndex;
1167c5 ¤
f88064 ¤   if(sNumKeyInfoWindows < kMaxKeyInfoWindows)
4dc7a1 ¤   {
16c8fb ¤   ¤   for(kiIndex = 0;kiIndex < sNumKeyInfoWindows;kiIndex++)
bc5b34 ¤   ¤   {
4801e6 ¤   ¤   ¤   if(sKeyInfoWindows[kiIndex]->GetKey() == key)
19f776 ¤   ¤   ¤   {
938682 ¤   ¤   ¤   ¤   sKeyInfoWindows[kiIndex]->Select();
c806e0 ¤   ¤   ¤   ¤   return TRUE;
60a3a6 ¤   ¤   ¤   }
3e0fe4 ¤   ¤   }
31af5a
da5225 ¤   ¤   RegisterClass_( CKeyInfoWindow );
fc1b52 ¤   ¤
9fcd8c ¤   ¤   keyInfoWindow = (CKeyInfoWindow *)
47c67a ¤   ¤   ¤   LWindow::CreateWindow( kKeyInfoWindowID, CPGPKeys::TheApp() );
dd15a3 ¤   ¤   sKeyInfoWindows[sNumKeyInfoWindows] = keyInfoWindow;
c67a46 ¤   ¤   keyInfoWindow->SetInfo( table, key );
6f5b30 ¤   ¤   sNumKeyInfoWindows++;
87836c ¤   ¤   return TRUE;
a39371 ¤   }
d60e24 ¤   else
52c7a1 ¤   {
0d8c37 ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
539b88 ¤   ¤   ¤   ¤   ¤   ¤   kKeyInfoStringListID, kTooManyWindowsID);
3598aa ¤   ¤   return FALSE;
e09371 ¤   }
96efe6 }
d8af5a
416d52 ¤   void
3238e6 CKeyInfoWindow::CloseAll()
e6cebb {¤
329301 ¤   while(sNumKeyInfoWindows > 0)
79c7a1 ¤   {
5448db ¤   ¤   pgpAssertAddrValid(sKeyInfoWindows[0], VoidAlign);
f883d7 ¤   ¤   sKeyInfoWindows[0]->DoClose();
199371 ¤   }
f2a8e2 ¤   pgpAssert(sNumKeyInfoWindows == 0);
e6efe6 }
c9af5a
9f3609 ¤   PGPKeyRef
298113 CKeyInfoWindow::GetKey()
16bb36 {
aa12a8 ¤   return mWindowKey;
84efe6 }
83af5a
4dc632 CKeyInfoWindow::CKeyInfoWindow(LStream *inStream)
1028bf ¤   :¤  LWindow(inStream)
b0bb36 {
1b77c8 ¤   RegisterClass_( CKeyPanelGeneral );
6a352d ¤   RegisterClass_( CKeyPanelSubkeys );
--7713 0004b88f1ad401201b1 Page 39 of CKeyInfoWindow.cp
31b231 ¤   RegisterClass_( CKeyPanelADK );
5b9a60 ¤   RegisterClass_( CKeyPanelRevoker );
d067c5 ¤
3d2087 ¤   RegisterClass_( CADKTable );
df0bc2 ¤   RegisterClass_( CRevokerTable );
3e84d6 ¤   RegisterClass_( CSubkeyTable );
22025e ¤   RegisterClass_( CNewSubkeyDialog );
92efe6 }
89af5a
5d0daf CKeyInfoWindow::~CKeyInfoWindow()
b0bb36 {
c1efe6 }
20af5a
1b6d52 ¤   void
76636c CKeyInfoWindow::FinishCreateSelf()
9bbb36 {
b80305 ¤   LWindow::FinishCreateSelf();
2a67c5 ¤
37d4e7 ¤   SetThemeWindowBackground( GetMacPort(),
3e74b6 ¤   ¤   ¤   ¤   kThemeActiveModelessDialogBackgroundBrush, FALSE );
b5efe6 }
3eaf5a
956d52 ¤   void
c6d2ec CKeyInfoWindow::ApplyForeAndBackColors(void) const
ebbb36 {
436fea ¤   if( IsActive() )
6fccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
1b74b6 ¤   ¤   ¤   ¤   kThemeActiveModelessDialogBackgroundBrush, FALSE );
4d0e24 ¤   else
b3ccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
f2737f ¤   ¤   ¤   ¤   kThemeInactiveModelessDialogBackgroundBrush, FALSE );
efefe6 }
55af5a
d16d52 ¤   void
f4c258 CKeyInfoWindow::CleanupPanel(short panelIndex)
63bb36 {
d2fb86 ¤   CKeyInfoPanelView¤  *panel;
2c67c5 ¤
f94049 ¤   panel = (CKeyInfoPanelView *) mMultiView->RemovePanel( panelIndex );
9ff2b6 ¤   panel->SavePanel();
6f67c5 ¤
7db057 ¤   delete panel;
c8efe6 }
1aaf5a
dc7e69 ¤   Boolean
1e72e8 CKeyInfoWindow::HasChanged(void)
2abb36 {
ddcf30 ¤   UInt16¤ numPanels;
5ddd73 ¤   Boolean¤hasChanged = FALSE;
d467c5 ¤
114bb5 ¤   numPanels = mMultiView->GetPanelCount();
811841 ¤   for( UInt16 panelIndex = 1; panelIndex <= numPanels; panelIndex++ )
51c7a1 ¤   {
ae707a ¤   ¤   CKeyInfoPanelView¤  *panel;
631b52 ¤   ¤
9601b8 ¤   ¤   panel = (CKeyInfoPanelView *) mMultiView->GetPanel( panelIndex );
c847a8 ¤   ¤   if( IsntNull( panel ) )
1e5b34 ¤   ¤   {
2a4d1e ¤   ¤   ¤   if( panel->HasChanged() )
1ef776 ¤   ¤   ¤   {
cbc511 ¤   ¤   ¤   ¤   hasChanged = TRUE;
d5f622 ¤   ¤   ¤   ¤   break;
cfa3a6 ¤   ¤   ¤   }
920fe4 ¤   ¤   }
479371 ¤   }
5eaf5a
355d3a ¤   return( hasChanged );
e2efe6 }
95af5a
476d52 ¤   void
f660ed CKeyInfoWindow::ProcessClose(void)
4bbb36 {
--6bee 0005f456e0d401201b1 Page 40 of CKeyInfoWindow.cp
d2f782 ¤   short¤  windowIndex;
7fe401 ¤   short¤  windowID;
c14617 ¤   Boolean¤hasChanged;
c0cf30 ¤   UInt16¤ numPanels;
d967c5 ¤
088212 ¤   hasChanged = HasChanged();
2b67c5 ¤
804bb5 ¤   numPanels = mMultiView->GetPanelCount();
9393c7 ¤   for( UInt16 panelIndex = numPanels; panelIndex >= 1; panelIndex-- )
9ac7a1 ¤   {
66a034 ¤   ¤   CleanupPanel( panelIndex );
8b9371 ¤   }
3367c5 ¤
f38cf5 ¤   Hide();
2467c5 ¤
f82fa3 ¤   // Remove this Key Info window from the list
933c64 ¤   for(windowID = 0;windowID < sNumKeyInfoWindows;windowID++)
46c7a1 ¤   {
dfa80d ¤   ¤   if(sKeyInfoWindows[windowID] == this)
d95b34 ¤   ¤   {
bd9dd1 ¤   ¤   ¤   sKeyInfoWindows[windowID] = NULL;
afcdcb ¤   ¤   ¤   break;
b00fe4 ¤   ¤   }
b99371 ¤   }
1b67c5 ¤
500dbb ¤   for(windowIndex = windowID + 1;
da3fff ¤   ¤   windowIndex < sNumKeyInfoWindows;
d973c4 ¤   ¤   windowIndex++)
a4cd55 ¤   ¤   sKeyInfoWindows[windowIndex-1] = sKeyInfoWindows[windowIndex];
b14f27 ¤   sNumKeyInfoWindows--;
c5af5a
ed1b52 ¤   ¤
6951bb ¤   pgpAssert((hasChanged && IsntNull(mParentTable)) || !hasChanged);
dedeaa ¤   if(hasChanged && mParentTable)
1fc7a1 ¤   {
4cb079 ¤   ¤   CPGPKeys::TheApp()->CommitDefaultKeyrings();
e2e7b9 ¤   ¤   mParentTable->RedrawTable();
899371 ¤   }
a9efe6 }
afaf5a
3d6d52 ¤   void
7cc309 CKeyInfoWindow::AttemptClose(void)
91bb36 {
c2c17c ¤   ProcessClose();
ab67c5 ¤
cb1fbc ¤   LWindow::AttemptClose();
53efe6 }
51af5a
8e6d52 ¤   void
db3407 CKeyInfoWindow::DoClose(void)
d3bb36 {
3bc17c ¤   ProcessClose();
fa67c5 ¤
cdf8c8 ¤   LWindow::DoClose();
bcefe6 }
25af5a
016d52 ¤   void
3fec2b CKeyInfoWindow::SetInfo(
42e9ec ¤   CKeyTable ¤ *table,
2b146a ¤   PGPKeyRef ¤ theKey)
72bb36 {
6db718 ¤   UInt16¤ ¤   ¤   ¤   numPanels;
40ad01 ¤   UInt16¤ ¤   ¤   ¤   panelIndex;
519fca ¤   Str255¤ ¤   ¤   ¤   pstr;
c08f52 ¤   PGPError¤   ¤   ¤   err;
4c2097 ¤   PGPSize¤¤   ¤   ¤   len;
7053cf ¤   LTabsControl¤   ¤   *tabsControl;
fd3ddc ¤   PGPInt32¤   ¤   ¤   algorithm;
9bf341 ¤   PGPUInt32¤  ¤   ¤   numKeys;
63fdad ¤   ControlTabInfoRec¤  tabInfo;
c867c5 ¤
5f626c ¤   mParentTable ¤  = table;
--f3b7 0001abef389401201b1 Page 41 of CKeyInfoWindow.cp
026b85 ¤   mWindowKey¤ ¤   = theKey;
ced788 ¤   panelIndex¤ ¤   = 2;
f967c5 ¤
f07e10 ¤   mMultiView = (LMultiPanelView *) FindPaneByID( kMultiPanelViewPaneID );
53961e ¤   pgpAssertAddrValid( mMultiView, VoidAlign );
2567c5 ¤
d061ef ¤   tabsControl = (LTabsControl *) FindPaneByID( kTabsControlPaneID );
cb0ecc ¤   pgpAssertAddrValid( tabsControl, VoidAlign );
5d67c5 ¤
3cb166 ¤   mMultiView->AddPanel( kGeneralPanelViewResID, NULL, 1 );
b967c5 ¤
8ada03 ¤   pgpClearMemory( &tabInfo, sizeof( tabInfo ) );
5167c5 ¤
56c14d ¤   tabInfo.version = kControlTabInfoVersionZero;
5467c5 ¤
f10af8 ¤   if( IsntPGPError( PGPGetKeyNumber( theKey, kPGPKeyPropAlgID,
b46aeb ¤   ¤   ¤   ¤   &algorithm ) ) && algorithm == kPGPPublicKeyAlgorithm_DSA )
2fc7a1 ¤   {
92d3f0 ¤   ¤   // Add Subkeys panel
ef8685 ¤   ¤   mMultiView->AddPanel( kSubkeysPanelViewResID, NULL, panelIndex );
c21b52 ¤   ¤
31cade ¤   ¤   GetIndString( tabInfo.name, kKeyInfoStringListID, kSubkeysStrIndex );
72b8c3 ¤   ¤   tabsControl->SetDataTag( panelIndex, kControlTabInfoTag,
5ba4fa ¤   ¤   ¤   ¤   ¤   sizeof( tabInfo ), &tabInfo );
221b52 ¤   ¤
a19570 ¤   ¤   panelIndex++;
789371 ¤   }
b467c5 ¤
336276 ¤   if( IsntPGPError( PGPCountAdditionalRecipientRequests( theKey,
b365eb ¤   ¤   ¤   &numKeys ) ) && numKeys != 0 )
88c7a1 ¤   {
6e91b5 ¤   ¤   // Add ADK panel
7d4c41 ¤   ¤   mMultiView->AddPanel( kADKPanelViewResID, NULL, panelIndex );
d6af5a
804628 ¤   ¤   GetIndString( tabInfo.name, kKeyInfoStringListID, kADKStrIndex );
8ab8c3 ¤   ¤   tabsControl->SetDataTag( panelIndex, kControlTabInfoTag,
e2a4fa ¤   ¤   ¤   ¤   ¤   sizeof( tabInfo ), &tabInfo );
42ae30 ¤   ¤   ¤   ¤   ¤
d09570 ¤   ¤   panelIndex++;
669371 ¤   }
a767c5 ¤
98970f ¤   if( IsntPGPError( PGPCountRevocationKeys( theKey, &numKeys ) ) &&
623179 ¤   ¤   ¤   numKeys != 0 )
f0c7a1 ¤   {
f206ce ¤   ¤   // Add Revoker panel
ea1711 ¤   ¤   mMultiView->AddPanel( kRevokerPanelViewResID, NULL, panelIndex );
86af5a
75e998 ¤   ¤   GetIndString( tabInfo.name, kKeyInfoStringListID, kRevokerStrIndex );
6db8c3 ¤   ¤   tabsControl->SetDataTag( panelIndex, kControlTabInfoTag,
10a4fa ¤   ¤   ¤   ¤   ¤   sizeof( tabInfo ), &tabInfo );
40ae30 ¤   ¤   ¤   ¤   ¤
e59570 ¤   ¤   panelIndex++;
d29371 ¤   }
7167c5 ¤
1ad0d6 ¤   // Force creation of all panels so we can control the LCommander hierarchy
8d67c5 ¤
904bb5 ¤   numPanels = mMultiView->GetPanelCount();
415f76 ¤   tabsControl->SetMaxValue( numPanels );
eeaf5a
58067b ¤   for( panelIndex = 1; panelIndex <= numPanels; panelIndex++ )
9cc7a1 ¤   {
59707a ¤   ¤   CKeyInfoPanelView¤  *panel;
9a1b52 ¤   ¤
e8bbb3 ¤   ¤   LCommander::SetDefaultCommander( mMultiView );
5a7864 ¤   ¤   LPane::SetDefaultView( mMultiView );
d71b52 ¤   ¤
676580 ¤   ¤   panel = (CKeyInfoPanelView *) mMultiView->CreatePanel( panelIndex );
f147a8 ¤   ¤   if( IsntNull( panel ) )
515b34 ¤   ¤   {
493db5 ¤   ¤   ¤   panel->SetInfo( table->GetKeySet(), theKey, table->IsWritable() );
090fe4 ¤   ¤   }
1a9371 ¤   }
--5468 001103a24d0401201b1 Page 42 of CKeyInfoWindow.cp
e0af5a
1fb1cd ¤   mMultiView->SwitchToPanel( 1, FALSE );
e767c5 ¤
a0a8ac ¤   // Set the window totle
c9c2a0 ¤   err = PGPGetPrimaryUserIDNameBuffer( theKey, sizeof( pstr ) - 1,
59412b ¤   ¤   ¤   ¤   ¤   (char *) &pstr[1], &len);
d28c1a ¤   pgpAssertNoErr( err );
9b420b ¤   pstr[0] = len;
d9a1c1 ¤   SetDescriptor( pstr );
6367c5 ¤
6560d9 ¤   Show();
f8efe6 }
5caf5a
bf6d52 ¤   void
58cf17 CKeyInfoWindow::GetFingerprintString(Str255 pstr, PGPKeyRef key)
b7bb36 {
e6153b ¤   static char hexDigit[] = "0123456789ABCDEF";
a261e0 ¤   PGPError¤   err;
34f1ae ¤   PGPSize¤¤   len;
8464d3 ¤   PGPByte¤¤   fingerprint[ 256 ];
0489b7 ¤   Int16¤  ¤   strIndex;
e14440 ¤   uchar¤  ¤   *p;
ce67c5 ¤
d74dba ¤   err = PGPGetKeyPropertyBuffer( key, kPGPKeyPropFingerprint,
1b86d8 ¤   ¤   ¤   sizeof( fingerprint ), fingerprint, &len);
1fdd44 ¤   pgpAssertNoErr(err);
aff1e7 ¤   if ( IsntPGPError( err ) )
66c7a1 ¤   {
32308f ¤   ¤   if(len == 20)
f45b34 ¤   ¤   {
54e90b ¤   ¤   ¤   pstr[0] = 50;
c20879 ¤   ¤   ¤   p = pstr + 1;
51cf0d ¤   ¤   ¤   for(strIndex = 0 ; strIndex < 20 ; strIndex++)
51f776 ¤   ¤   ¤   {
0fea1d ¤   ¤   ¤   ¤   *p++ = hexDigit[fingerprint[strIndex]>>4];
9aff1b ¤   ¤   ¤   ¤   *p++ = hexDigit[fingerprint[strIndex]&0xF];
0ac5a6 ¤   ¤   ¤   ¤   if((strIndex == 1) || (strIndex == 3) || (strIndex == 5)
791e5b ¤   ¤   ¤   ¤   ¤   ¤   || (strIndex == 7) || (strIndex == 11) ||
40a476 ¤   ¤   ¤   ¤   ¤   ¤   (strIndex == 13)
1950b7 ¤   ¤   ¤   ¤   ¤   ¤   || (strIndex == 13) || (strIndex == 15) ||
d7c2f8 ¤   ¤   ¤   ¤   ¤   ¤   (strIndex == 17))
7d58c5 ¤   ¤   ¤   ¤   ¤   *p++ = ' ';
8f081b ¤   ¤   ¤   ¤   else if(strIndex == 9)
8d72c3 ¤   ¤   ¤   ¤   {
bf58c5 ¤   ¤   ¤   ¤   ¤   *p++ = ' ';
d258c5 ¤   ¤   ¤   ¤   ¤   *p++ = ' ';
982613 ¤   ¤   ¤   ¤   }
44a3a6 ¤   ¤   ¤   }
080fe4 ¤   ¤   }
220e1d ¤   ¤   else
135b34 ¤   ¤   {
fff5b0 ¤   ¤   ¤   pstr[0] = 40;
7d0879 ¤   ¤   ¤   p = pstr + 1;
90c34f ¤   ¤   ¤   for(strIndex = 0 ; strIndex < 16 ; strIndex++)
d0f776 ¤   ¤   ¤   {
84ea1d ¤   ¤   ¤   ¤   *p++ = hexDigit[fingerprint[strIndex]>>4];
81ff1b ¤   ¤   ¤   ¤   *p++ = hexDigit[fingerprint[strIndex]&0xF];
ffc5a6 ¤   ¤   ¤   ¤   if((strIndex == 1) || (strIndex == 3) || (strIndex == 5)
a43abe ¤   ¤   ¤   ¤   ¤   || (strIndex == 9) || (strIndex == 11) || (strIndex == 13))
0c58c5 ¤   ¤   ¤   ¤   ¤   *p++ = ' ';
621800 ¤   ¤   ¤   ¤   else if(strIndex == 7)
ab72c3 ¤   ¤   ¤   ¤   {
8c58c5 ¤   ¤   ¤   ¤   ¤   *p++ = ' ';
fb58c5 ¤   ¤   ¤   ¤   ¤   *p++ = ' ';
b32613 ¤   ¤   ¤   ¤   }
b6a3a6 ¤   ¤   ¤   }
200fe4 ¤   ¤   }
8b9371 ¤   }
10efe6 }
--06a9 001e5838cbb401201b2 Page 1 of CKeyInfoWindow.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
081cc0 ¤   $Id: CKeyInfoWindow.h,v 1.15.8.1 1998/11/12 03:08:00 heller Exp $
fbf7f7 ____________________________________________________________________________*/
857b7d #pragma once
45af5a
aaf1a9 #include <LListener.h>
478fd4 #include <LWindow.h>
9505c6 #include <LStaticText.h>
04a076 #include "pgpKeys.h"
77af5a
e6fd31 class CKeyTable;
97920f class LMultiPanelView;
b5af5a
0ed259 const short¤kMaxKeyInfoWindows¤ =¤  16;¤// Prevent memory problems
f3af5a
ba0ee2 class CKeyInfoWindow : public LWindow
25bb36 {
e05ed4 public:
098ad3 ¤   enum { class_ID = 'KInf' };
34f58f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CKeyInfoWindow(LStream *inStream);
d313f9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ~CKeyInfoWindow();
dc9a35 ¤   void¤   ¤   ¤   ¤   ¤   ¤   FinishCreateSelf();
18dc9a ¤   virtual void¤   ¤   ¤   ¤   ApplyForeAndBackColors(void) const;
acaf5a
e8aaa9 ¤   virtual void¤   ¤   ¤   ¤   AttemptClose(void);
2b02ae ¤   virtual void¤   ¤   ¤   ¤   DoClose(void);
a0ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
965717 ¤   static Boolean¤ ¤   ¤   ¤   OpenKeyInfo(PGPKey *key, CKeyTable *table);
59d1c0 ¤   static void¤¤   ¤   ¤   ¤   CloseAll();
0b67c5 ¤
5c002f ¤   static¤ void¤   ¤   ¤   ¤   GetFingerprintString(
1be9f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Str255 pstr, PGPKeyRef key);
9667c5 ¤
9cf066 ¤   PGPKeyRef¤  ¤   ¤   ¤   ¤   GetKey();
6667c5 ¤
b30fb9 private:
cbaf5a
e62f4b ¤   enum
a5c7a1 ¤   {
4fe7a3 ¤   ¤   kMultiPanelViewPaneID ¤ = 'pMPV',
d2a3e4 ¤   ¤   kTabsControlPaneID¤ ¤   = 'pTab'
e762bd ¤   };
3eaf5a
5de4cb ¤   LMultiPanelView¤¤   ¤   ¤   *mMultiView;
fc3031 ¤   PGPKeyRef¤  ¤   ¤   ¤   ¤   mWindowKey;
6843da ¤   CKeyTable¤  ¤   ¤   ¤   ¤   *mParentTable;
a8af5a
a18c1b ¤   Boolean¤¤   ¤   ¤   ¤   ¤   HasChanged(void);
3ea911 ¤   void¤   ¤   ¤   ¤   ¤   ¤   CleanupPanel(short panelIndex);
f40fb7 ¤   void¤   ¤   ¤   ¤   ¤   ¤   ProcessClose(void);
eb0547 ¤   void¤   ¤   ¤   ¤   ¤   ¤   SetInfo(CKeyTable *table, PGPKeyRef theKey);
0667c5 ¤
4ffe0b ¤   static CKeyInfoWindow¤  ¤   *sKeyInfoWindows[kMaxKeyInfoWindows];
48939c ¤   static short¤   ¤   ¤   ¤   sNumKeyInfoWindows;
fe1b52 ¤   ¤
5682f7 };
e5af5a
--fca7 0003f2e78a1401201b3 Page 1 of CKeyTable.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
75f133 ¤   $Id: CKeyTable.cp,v 1.167.2.3.2.2 1998/11/13 02:49:41 heller Exp $
def7f7 ____________________________________________________________________________*/
f0af5a
36255b #include <Fonts.h>
0c0334 #include <Drag.h>
2ae0ab #include <Processes.h>
a7dc1d #include <Scrap.h>
1faf5a
e38f92 #include <UGAColorRamp.h>
ce7e6d #include <UDrawingState.h>
6ae8ae #include <UDrawingUtils.h>
acffe3 #include <UGraphicUtils.h>
7bcc5c #include <UMemoryMgr.h>
bd7c09 #include <LEditText.h>
5d7538 #include <LDropFlag.h>
e549f7 #include <LProgressBar.h>
557b38 #include <LTableArrayStorage.h>
76be77 #include <LTableMultiGeometry.h>
cf8848 #include <LTableMultiSelector.h>
88dd56 #include <PP_Messages.h>
b57b32 #include <PP_KeyCodes.h>
73dd06 #include <UDesktop.h>
a0af5a
06324c #include <string.h>
34af5a
966ff8 #include "CKeyTable.h"
e386be #include "CKeyTableLabels.h"
40b409 #include "CKeyView.h"
195cd1 #include "CSearchWindow.h"
8c21d6 #include "CSignDialog.h"
a254e1 #include "CSplitWindow.h"
d9d49e #include "CKeyInfoWindow.h"
7e271e #include "CKeyDragTask.h"
45b8cb #include "CPGPKeys.h"
4a4a92 #include "CPhotoUserID.h"
373b50 #include "GetPassphrase.h"
a99dc2 #include "CWarningAlert.h"
0f59c5 #include "CPGPStDialogHandler.h"
db5dc0 #include "ResourceConstants.h"
d485c2 #include "MacStrings.h"
955286 #include "MacDialogs.h"
923852 #include "UDragAndDropUtils.h"
cf59ab #include "CKeyGenWizardDialog.h"
05d73a #include "CSecureMemory.h"
2369be #include "CGAProgressDialog.h"
c7af5a
34a02f #include "pgpClientLib.h"
27af5a
23bac3 // SDK Includes
9a2f8d #include "pgpErrors.h"
560d08 #include "pgpMem.h"
5404f5 #include "pgpFeatures.h"
1c4919 #include "pgpUtilities.h"
c7c97b #include "pgpClientPrefs.h"
763991 #include "pgpAdminPrefs.h"
6d8e25 #include "pgpVersionHeader.h"
b991b9 #include "pgpSDKPrefs.h"
b3af5a
8a65a9 const Int16¤¤   kDefaultColumnWidth¤¤   =¤  16;
380bd9 const Int16¤¤   kRowHeight¤ ¤   ¤   ¤   =¤  18;
1a36f2 const Int16¤¤   kBarHeight¤ ¤   ¤   ¤   =¤  10;
8c40cb const Int16 ¤   kBarRightBorder¤¤   ¤   =¤  10;
f703fe const Int16¤ ¤  kBarLeftBorder¤ ¤   ¤   =¤  4;
7961ea const Int16¤¤   kMaxTrust¤  ¤   ¤   ¤   =¤  3;
5aafb1 const Int16¤¤   kMaxValidity¤   ¤   ¤   =¤  2;
31c853 const Int16¤¤   kTextIndent¤¤   ¤   ¤   =¤  3;
3f5310 const Int32¤¤   kMaxKeyBuffer¤  ¤   ¤   =¤  MAX_PGPInt32;
--c810 0005f4e0b78401201b3 Page 2 of CKeyTable.cp
78425f const ResIDT¤   kBarberIconID¤  ¤   ¤   =¤  4000;
af3542 const ResIDT¤   kExportCustomPutDialog¤ =¤  1004;
15fc7c const Int16¤¤   kUserIDStringLength¤¤   =¤  256;
cfaf5a
18864f const Int16¤¤   kUserValueMarked¤   ¤   =¤  1;
bcf178 const Int16¤¤   kUserValueUnmarked¤ ¤   =¤  0;
4aaf5a
6a4f22 const ResIDT¤   dialog_AddUserID¤   ¤   = 138;
82c683 const ResIDT¤   dialog_KeyGenWizard¤¤   = 150;
774ef7 const ResIDT¤   dialog_AddPhotoUserID¤  = 158;
02af5a
bd7f67 const UInt32¤   kDefaultKeyBufferLength¤= 32767;
aaaf5a
9c4546 static char¤¤   hexDigit[] = "0123456789ABCDEF";
26af5a
48e6cc NMRec¤  ¤   ¤   ¤   sImportNotification;
f081be ProcessSerialNumber¤sThisProcess;
2e4a46 Str255¤ ¤   ¤   ¤   sNotifyString;
68af5a
e05fa0 KeyTableColumnInfo¤ CKeyTable::kDefaultColumnInfo¤  =
24c7a1 ¤   {
37be29 #if PGP_BUSINESS_SECURITY
49e3f4 ¤   ¤   4,
229e8e ¤   ¤   kUserIDColumnID,
7be697 ¤   ¤   kValidityColumnID,
3f7a36 ¤   ¤   kKeySizeColumnID,
7682bb ¤   ¤   kDescriptionColumnID,
c3ede6 ¤   ¤   0,0,0,0,0,
10db21 #else
c5b928 ¤   ¤   5,
9c9e8e ¤   ¤   kUserIDColumnID,
b2e697 ¤   ¤   kValidityColumnID,
32219f ¤   ¤   kTrustColumnID,
b17a36 ¤   ¤   kKeySizeColumnID,
d582bb ¤   ¤   kDescriptionColumnID,
783d98 ¤   ¤   0,0,0,0,
fe7454 #endif
9e1b52 ¤   ¤
ea2639 ¤   ¤   286, 53, 53, 81, 71, 71, 71, 35, 100
8762bd ¤   };
16af5a
f363f1 Int16 MatchUserIDs(char *uid1, char *uid2);
70af5a
ad9629 // The following small class fixes a PowerPlant bug in
6d1504 // LTableArrayStorage. ·The PowerPlant class does not
699baf // properly support LHierarchyTable
5daf5a
a6d37d class CHierarchyTableArrayStorage¤  :¤  public LTableArrayStorage
abbb36 {
db5ed4 public:
cd995e ¤   ¤   ¤   ¤   ¤   ¤   CHierarchyTableArrayStorage(
9d38c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LTableView¤ ¤   ¤   *inTableView,
b70966 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   inDataSize);
66fb36 ¤   virtual void¤   ¤   InsertCols(
247dc7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   inHowMany,
f89ff1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TableIndexT¤¤   ¤   inAfterCol,
cdc956 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const void¤ ¤   ¤   *inDataPtr,
700966 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   inDataSize);
64aaae ¤   virtual void¤   ¤   RemoveCols(
897dc7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   inHowMany,
07af48 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TableIndexT¤¤   ¤   inFromCol);
e282f7 };
bdaf5a
d9f2f2 CHierarchyTableArrayStorage::CHierarchyTableArrayStorage(
5081bd ¤   LTableView¤ ¤   ¤   *inTableView,
44a225 ¤   Uint32¤ ¤   ¤   ¤   inDataSize )
591181 ¤   ¤   :¤  LTableArrayStorage(inTableView, inDataSize)
4fbb36 {
baefe6 }
1daf5a
126d52 ¤   void
5fd9b0 CHierarchyTableArrayStorage::RemoveCols(
--4f59 000140ac741401201b3 Page 3 of CKeyTable.cp
1584ae ¤   Uint32¤ ¤   inHowMany,
ff2fa9 ¤   TableIndexT¤inFromCol)
93bb36 {
153353 ¤   TableIndexT¤¤   ¤   rows,
8b1da6 ¤   ¤   ¤   ¤   ¤   ¤   cols;
fc0450 ¤   CPGPHierarchyTable¤ *hTable;
2e67c5 ¤
365056 ¤   hTable = (CPGPHierarchyTable *)mTableView;
7cbc86 ¤   hTable->GetWideOpenTableSize(rows, cols);
e467c5 ¤
58a363 ¤   STableCell¤ theCell(0, inFromCol);
9667c5 ¤
fb48ec ¤   for (theCell.row = 1; theCell.row <= rows; theCell.row++) {
eea176 ¤   ¤   TableIndexT¤startIndex;
71c3a2 ¤   ¤   mTableView->CellToIndex(theCell, startIndex);
64f271 ¤   ¤   mDataArray->RemoveItemsAt(inHowMany, startIndex);
ee9371 ¤   }
84efe6 }
8caf5a
666d52 ¤   void
638828 CHierarchyTableArrayStorage::InsertCols(
5c84ae ¤   Uint32¤ ¤   inHowMany,
00087d ¤   TableIndexT¤inAfterCol,
467da0 ¤   const void¤ *inDataPtr,
b9f0a7 ¤   Uint32¤ ¤   inDataSize)
24bb36 {
823353 ¤   TableIndexT¤¤   ¤   rows,
1c1da6 ¤   ¤   ¤   ¤   ¤   ¤   cols;
c50450 ¤   CPGPHierarchyTable¤ *hTable;
6767c5 ¤
aa5056 ¤   hTable = (CPGPHierarchyTable *)mTableView;
20bc86 ¤   hTable->GetWideOpenTableSize(rows, cols);
b567c5 ¤
b81ae1 ¤   STableCell¤ theCell(0, inAfterCol + 1);
eb67c5 ¤
5648ec ¤   for (theCell.row = 1; theCell.row <= rows; theCell.row++) {
9ca176 ¤   ¤   TableIndexT¤startIndex;
1ac3a2 ¤   ¤   mTableView->CellToIndex(theCell, startIndex);
487b51 ¤   ¤   mDataArray->InsertItemsAt(inHowMany, startIndex, inDataPtr,
b70eea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inDataSize);
139371 ¤   }
d3efe6 }
07af5a
73ae5c #pragma mark --- Initialization ---
43af5a
db63f0 CKeyTable::CKeyTable(
d36689 ¤   LStream¤*inStream)
fd53c4 ¤   ¤   :¤  CPGPHierarchyTable(inStream),
050019 ¤   ¤   ¤   LDragAndDrop(UQDGlobals::GetCurrentPort(), this)
09bb36 {
ae5cd2 ¤   mTableGeometry¤ = new LTableMultiGeometry(this,¤kDefaultColumnWidth,
481949 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kRowHeight);
eace41 ¤   mTableSelector¤ = new LTableMultiSelector(this);
846b15 ¤   mTableStorage¤  = new CHierarchyTableArrayStorage(this, (ulong)0);
e04c3d ¤   mLastKeypress¤  = 0;
541181 ¤   mKeySet¤¤   ¤   = NULL;
ac3b9a ¤   mKeyList¤   ¤   = NULL;
a5e18c ¤   mKeyLabels¤ ¤   = NULL;
39b61f ¤   mDefaultKey¤¤   = NULL;
cf6d4c ¤   mImports¤   ¤   = NULL;
b77117 ¤   mDefaultRing¤   = FALSE;
783ccd ¤   mMutableRing¤   = FALSE;
e71ca6 ¤   mNotified¤  ¤   = FALSE;
f7a481 ¤   mSendingDrag¤   = FALSE;
9b25db ¤   mTargetKeyServer= NULL;
1d1091 ¤   mDragHiliteWorld= NULL;
d5d9fc ¤   mDragHiliteRgn¤ = NULL;
ab08b9 ¤   mNotifyIconSuite= NULL;
ab0671 ¤   PGPRSASupported( &mHasRSA );
feefe6 }
fdaf5a
14314a void
--3a07 000c9997078401201b3 Page 4 of CKeyTable.cp
0dbe81 CKeyTable::FinishCreateSelf()
efbb36 {
698f52 ¤   PGPError¤   ¤   ¤   err;
e22097 ¤   PGPSize¤¤   ¤   ¤   len;
33da30 ¤   KeyTableColumnInfo¤ *prefColumnInfo;
1967c5 ¤
6e0cd4 ¤   ::GetCurrentProcess(&sThisProcess);
ea67c5 ¤
317cba ¤   mBarberPixPat = ::GetPixPat(kBarberIconID);
a70dd3 ¤   pgpAssertAddrValid(mBarberPixPat, VoidAlign);
7e67c5 ¤
0df357 ¤   // Load Prefs for column display
1e83ef ¤   len = sizeof(KeyTableColumnInfo);
615441 ¤   err = PGPGetPrefData(gPrefRef, kPGPPrefPGPkeysMacColumnData,
e1f065 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &len, &prefColumnInfo);
0fee15 ¤   if(IsPGPError(err))
9bc7a1 ¤   {
27d5de ¤   ¤   ::BlockMoveData(&kDefaultColumnInfo, &mColumnInfo,
12ebc4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(KeyTableColumnInfo));
e89371 ¤   }
5a0e24 ¤   else
aac7a1 ¤   {
637062 ¤   ¤   ::BlockMoveData(prefColumnInfo, &mColumnInfo,
f2ebc4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(KeyTableColumnInfo));
76a829 ¤   ¤   PGPDisposePrefData(gPrefRef, prefColumnInfo);
0d9371 ¤   }
d3a07f ¤   SetupColumns();
f567c5 ¤
7ce8c8 ¤   mKeyIter = NULL;
9e67c5 ¤
10a1f2 ¤   SwitchTarget(this);
4767c5 ¤
c3d645 ¤   BuildServerSubmenu();
f6efe6 }
c3af5a
3066a8 CKeyTable::~CKeyTable()
8bbb36 {
6e402e ¤   Reset1();
bab2c5 ¤   DisposePixPat( mBarberPixPat );
c6d467 ¤   if( IsntNull( mNotifyIconSuite ) )
fadec5 ¤   ¤   DisposeIconSuite( mNotifyIconSuite, TRUE );
55abfb ¤   SaveColumnInfo();
62efe6 }
67af5a
836d52 ¤   void
dd0e98 CKeyTable::SetKeyLabels( CKeyTableLabels *keyLabels )
44bb36 {
5a408a ¤   mKeyLabels = keyLabels;
88711f ¤   mKeyLabels->AdjustLabelSizes();
1befe6 }
c1af5a
1d6d52 ¤   void
74a322 CKeyTable::SaveColumnInfo()
ccbb36 {
790040 ¤   PGPError err;
7467c5 ¤
39658f ¤   err = PGPSetPrefData(gPrefRef, kPGPPrefPGPkeysMacColumnData,
ad7dd6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(KeyTableColumnInfo), &mColumnInfo);
f6dd44 ¤   pgpAssertNoErr(err);
7eefe6 }
fdaf5a
d06d52 ¤   void
ae3497 CKeyTable::ListenToMessage(¤MessageT inMessage,
0a8061 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void */*ioParam*/)
0abb36 {
2e26d0 ¤   switch(inMessage)
3ac7a1 ¤   {
b913a3 ¤   ¤   case kKeyTableRedrawMessage:
741d65 ¤   ¤   ¤   RedrawTable();
08cdcb ¤   ¤   ¤   break;
c5a2b0 ¤   ¤   case kKeyTableResyncMessage:
c96d39 ¤   ¤   ¤   ResyncTable(FALSE, TRUE);
--02f8 000c843da62401201b3 Page 5 of CKeyTable.cp
9d1d65 ¤   ¤   ¤   RedrawTable();
c0cdcb ¤   ¤   ¤   break;
ce11ee ¤   ¤   case kRebuildServersMessage:
d66819 ¤   ¤   ¤   BuildServerSubmenu();
50cdcb ¤   ¤   ¤   break;
6f9371 ¤   }
f4efe6 }
50af5a
656d52 ¤   void
eba07a CKeyTable::SetupColumns()
66bb36 {
56f71d ¤   Int16¤  ¤   columnIndex;
b1af5a
bb0bf3 ¤   RemoveAllCols(false);
19b11d ¤   InsertCols(mColumnInfo.numActiveColumns, 1, NULL, 0, false);
6e7365 ¤   for(columnIndex = 0;columnIndex < mColumnInfo.numActiveColumns;
f4505d ¤   ¤   columnIndex++)
10c7a1 ¤   {
fd473a ¤   ¤   SetColWidth(
845af5 ¤   ¤   ¤   mColumnInfo.columnWidths[mColumnInfo.columns[columnIndex]],
94d42e ¤   ¤   ¤   columnIndex + 1, columnIndex + 1);
e49371 ¤   }
0b1862 }¤
02af5a
e46d52 ¤   void
c45cf5 CKeyTable::GetKeyColumnInfo(KeyTableColumnInfo *columnInfo)
3ebb36 {
507620 ¤   ::BlockMoveData(&mColumnInfo, columnInfo, sizeof(KeyTableColumnInfo));
daefe6 }
5aaf5a
867e69 ¤   Boolean
a3a7d4 CKeyTable::ColumnVisible(Int16¤ columnID)
65bb36 {
17f71d ¤   Int16¤  ¤   columnIndex;
d8af5a
9b7365 ¤   for(columnIndex = 0;columnIndex < mColumnInfo.numActiveColumns;
6c505d ¤   ¤   columnIndex++)
89c7a1 ¤   {
642e50 ¤   ¤   if(mColumnInfo.columns[columnIndex] == columnID)
f85b24 ¤   ¤   ¤   return true;
539371 ¤   }
0ca82a ¤   return false;
ccefe6 }
21af5a
506d52 ¤   void
e39153 CKeyTable::MoveColumn(Int16 oldCol, Int16 newCol)
64bb36 {
41b37c ¤   Int16 colType;
2567c5 ¤
56313b ¤   colType = mColumnInfo.columns[oldCol];
c770f3 ¤   if(newCol < oldCol)
a7b9af ¤   ¤   newCol++;
b29e1c ¤   if(oldCol < mColumnInfo.numActiveColumns - 1)
4e8ac8 ¤   ¤   ::BlockMoveData(&mColumnInfo.columns[oldCol + 1],
bcf9c2 ¤   ¤   ¤   ¤   ¤   ¤   &mColumnInfo.columns[oldCol],
f6bcd6 ¤   ¤   ¤   ¤   ¤   ¤   sizeof(Int16) *
36b763 ¤   ¤   ¤   ¤   ¤   ¤   (mColumnInfo.numActiveColumns - oldCol - 1));
2a60c0 ¤   if(newCol < mColumnInfo.numActiveColumns - 1)
0998e4 ¤   ¤   ::BlockMoveData(&mColumnInfo.columns[newCol],
4812e7 ¤   ¤   ¤   ¤   ¤   &mColumnInfo.columns[newCol + 1],
cf7983 ¤   ¤   ¤   ¤   ¤   sizeof(Int16) *
526659 ¤   ¤   ¤   ¤   ¤   (mColumnInfo.numActiveColumns - newCol - 1));
9d4da5 ¤   mColumnInfo.columns[newCol] = colType;
39f893 ¤   RemoveCols(1, oldCol + 1, false);
2411bb ¤   InsertCols(1, newCol, NULL, 0, false);
93ef65 ¤   SetColWidth(mColumnInfo.columnWidths[colType], newCol + 1, newCol + 1);
894fc9 ¤   Refresh();
29efe6 }
88af5a
af6d52 ¤   void
ef58e1 CKeyTable::ResizeColumn( Int16 col, Int16 newSize )
c8bb36 {
--5b6c 0001d5c91fb401201b3 Page 6 of CKeyTable.cp
fdc2f9 ¤   mColumnInfo.columnWidths[mColumnInfo.columns[col]] = newSize;
02da77 ¤   SetColWidth( mColumnInfo.columnWidths[mColumnInfo.columns[col]],
a67808 ¤   ¤   col + 1, col + 1 );
1f4fc9 ¤   Refresh();
a9efe6 }
90af5a
876d52 ¤   void
dd80b5 CKeyTable::Reset()
8ebb36 {
d80040 ¤   PGPError err;
3c67c5 ¤
d6bd47 ¤   if(PGPKeySetRefIsValid(mKeySet))
45c7a1 ¤   {
97fa17 ¤   ¤   if(mKeyIter)
480582 ¤   ¤   ¤   PGPFreeKeyIter(mKeyIter);
9a80e1 ¤   ¤   err = PGPNewKeyIter(mKeyList, &mKeyIter);
f0e919 ¤   ¤   pgpAssertNoErr(err);
5f44ad ¤   ¤   pgpAssertAddrValid(mKeyIter, VoidAlign);
ea1b52 ¤   ¤
20bd5f ¤   ¤   mDefaultKey = NULL;
d19371 ¤   }
e5efe6 }
c1af5a
dc6d52 ¤   void
7424b9 CKeyTable::Reset1()
b9bb36 {
990040 ¤   PGPError err;
0567c5 ¤
d32f7e ¤   CKeyInfoWindow::CloseAll();
77b69d ¤   if(PGPKeyIterRefIsValid(mKeyIter))
b5c7a1 ¤   {
15f29a ¤   ¤   err = PGPFreeKeyIter(mKeyIter);
a1e919 ¤   ¤   pgpAssertNoErr(err);
799371 ¤   }
679cd2 ¤   mKeyIter = kInvalidPGPKeyIterRef;
8d07d6 ¤   if(PGPKeyListRefIsValid(mKeyList))
76c7a1 ¤   {
c34137 ¤   ¤   err = PGPFreeKeyList(mKeyList);
22e919 ¤   ¤   pgpAssertNoErr(err);
c39371 ¤   }
509693 ¤   mKeyList = kInvalidPGPKeyListRef;
18bcce ¤   CPGPKeys::TheApp()->SetKeyList(mKeyList);
acbd47 ¤   if(PGPKeySetRefIsValid(mKeySet))
b1c7a1 ¤   {
42fe87 ¤   ¤   if(mDefaultRing)
badf4a ¤   ¤   ¤   CPGPKeys::TheApp()->CommitDefaultKeyrings();
6e826f ¤   ¤   else if(mMutableRing)
8b5b34 ¤   ¤   {
991629 ¤   ¤   ¤   err = PGPCommitKeyRingChanges(mKeySet);
22b52e ¤   ¤   ¤   if(IsPGPError(err))
660124 ¤   ¤   ¤   ¤   ReportPGPError(err);
a40fe4 ¤   ¤   }
a88075 ¤   ¤   PGPFreeKeySet(mKeySet);
4d9371 ¤   }
13dbc6 ¤   mKeySet = kInvalidPGPKeySetRef;
6fefe6 }
07af5a
1b6d52 ¤   void
8da1d9 CKeyTable::Empty()
d9bb36 {
b08738 ¤   ClearTable();
01dc5d ¤   Reset();
884fc9 ¤   Refresh();
23efe6 }
38af5a
3a6d52 ¤   void
23649e CKeyTable::CommitKeySet()
61bb36 {
c861e0 ¤   PGPError¤   err;
2167c5 ¤
1a4f56 ¤   if(mDefaultRing)
1db079 ¤   ¤   CPGPKeys::TheApp()->CommitDefaultKeyrings();
--c0dc 000a1aad270401201b3 Page 7 of CKeyTable.cp
770b3b ¤   else if(mMutableRing)
7ec7a1 ¤   {
658068 ¤   ¤   err = PGPCommitKeyRingChanges(mKeySet);
391870 ¤   ¤   if(IsPGPError(err))
513c4c ¤   ¤   ¤   ReportPGPError(err);
799371 ¤   }
feefe6 }
70af5a
c46d52 ¤   void
a0b01b CKeyTable::SetKeyDBInfo(¤   PGPKeySetRef¤   keySet,
ac9a00 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   writable,
47075d ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   defaultRings )
e3bb36 {
315edf ¤   PGPBoolean¤ generatedKey;
e57b0e ¤   PGPBoolean¤ pairFound,
2e2bcf ¤   ¤   ¤   ¤   allowKG = TRUE;
d761e0 ¤   PGPError¤   err;
53af5a
8978eb ¤   mKeySet¤¤   ¤   = keySet;
8b4193 ¤   mMutableRing¤   = writable;
df1e9c ¤   mDefaultRing¤   = defaultRings;
39af5a
9ab14d ¤   err = PGPOrderKeySet(mKeySet, kPGPUserIDOrdering, &mKeyList);
e64b52 ¤   pgpAssert( IsntPGPError( err ) && PGPKeyListRefIsValid( mKeyList ) );
93fe76 ¤   CPGPKeys::TheApp()->SetKeyList( mKeyList );
0baf5a
d48738 ¤   ClearTable();
86dc5d ¤   Reset();
e567c5 ¤
005c05 ¤   pairFound = ResyncTable(TRUE, TRUE);
c067c5 ¤
c66e83 ¤   if(defaultRings)
7fc7a1 ¤   {
bbbe29 #if PGP_BUSINESS_SECURITY
ae758b ¤   ¤   PGPSize¤¤   ¤   defaultKeysSize;
e85ba0 ¤   ¤   char¤   ¤   ¤   *defaultKeys;
e0e53f ¤   ¤   PGPKeySetRef¤   defaultKeysSet = kInvalidPGPKeySetRef;
9e1b52 ¤   ¤
5d43b9 ¤   ¤   err = PGPGetPrefData(gAdminPrefRef, kPGPPrefDefaultKeys,
0178fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &defaultKeysSize, &defaultKeys);
684184 ¤   ¤   if(IsntPGPError(err))
565b34 ¤   ¤   {
c6795a ¤   ¤   ¤   if(defaultKeysSize > 10)
b8f776 ¤   ¤   ¤   {
e9973a ¤   ¤   ¤   ¤   err = PGPImportKeySet(gPGPContext, &defaultKeysSet,
4ff495 ¤   ¤   ¤   ¤   ¤   ¤   PGPOInputBuffer(gPGPContext, defaultKeys,
ebeaf1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   defaultKeysSize),
07dc36 ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(gPGPContext));
3f8397 ¤   ¤   ¤   ¤   if(IsntPGPError(err) && PGPKeySetRefIsValid(defaultKeysSet))
1b72c3 ¤   ¤   ¤   ¤   {
717206 ¤   ¤   ¤   ¤   ¤   err = PGPAddKeys(defaultKeysSet, mKeySet);
606aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
b4aba2 ¤   ¤   ¤   ¤   ¤   CommitKeySet();
158ff9 ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet(defaultKeysSet);
053408 ¤   ¤   ¤   ¤   ¤   pairFound = ResyncTable(TRUE, TRUE);
372613 ¤   ¤   ¤   ¤   }
f612c7 ¤   ¤   ¤   ¤   err = PGPSetPrefString(gAdminPrefRef,
7da301 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDefaultKeys, "");
cea3a6 ¤   ¤   ¤   }
23ee33 ¤   ¤   ¤   PGPDisposePrefData(gPrefRef, defaultKeys);
b00fe4 ¤   ¤   }
e3af5a
f2af7b ¤   ¤   err = PGPGetPrefBoolean(gAdminPrefRef, kPGPPrefAllowKeyGen,
163377 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &allowKG);
d4e919 ¤   ¤   pgpAssertNoErr(err);
6c7454 #endif
501b52 ¤   ¤
109463 ¤   ¤   err = PGPGetPrefBoolean(gPrefRef, kPGPPrefFirstKeyGenerated,
825b23 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &generatedKey);
89e919 ¤   ¤   pgpAssertNoErr(err);
925983 ¤   ¤   if(!generatedKey && allowKG)
a15b34 ¤   ¤   {
--3206 000d30577e9401201b3 Page 8 of CKeyTable.cp
2ea2db ¤   ¤   ¤   err = PGPSetPrefBoolean(gPrefRef, kPGPPrefFirstKeyGenerated,
94526c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TRUE);
4f524f ¤   ¤   ¤   pgpAssertNoErr(err);
0e87c7 ¤   ¤   ¤
9419ff ¤   ¤   ¤   if(!pairFound)
c8f776 ¤   ¤   ¤   {
d5b866 ¤   ¤   ¤   ¤   CKeyGenWizardDialog *kgw;
202b85 ¤   ¤   ¤   ¤
67f98a ¤   ¤   ¤   ¤   kgw = (CKeyGenWizardDialog *)
fc17da ¤   ¤   ¤   ¤   ¤   LWindow::CreateWindow(dialog_KeyGenWizard,
4d6dfd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp());
61b773 ¤   ¤   ¤   ¤   kgw->SetKeyTable(this);
a4a3a6 ¤   ¤   ¤   }
c90fe4 ¤   ¤   }
699371 ¤   }
a8efe6 }
eaaf5a
bddcae #pragma mark --- Drawing ---
b2af5a
c86d52 ¤   void
4d7d64 CKeyTable::DrawSelf()
45bb36 {
52d782 ¤   StColorPenState¤colorState;
07ff85 ¤   RgnHandle¤  ¤   localUpdateRgnH = GetLocalUpdateRgn();
c6dd3c ¤   Rect¤   ¤   ¤   updateRect = (**localUpdateRgnH).rgnBBox;
b46385 ¤   SInt16¤ ¤   ¤   depth;
9594e3 ¤   Rect¤   ¤   ¤   frame,
5da6f8 ¤   ¤   ¤   ¤   ¤   sortFrame,
3ad258 ¤   ¤   ¤   ¤   ¤   noSortFrame,
562705 ¤   ¤   ¤   ¤   ¤   cellRect;
1acd9f ¤   STableCell¤ ¤   cell,
91a381 ¤   ¤   ¤   ¤   ¤   topLeftCell,
6f5fde ¤   ¤   ¤   ¤   ¤   botRightCell;
c067c5 ¤
b6477f ¤   DisposeRgn( localUpdateRgnH );
2f40bf ¤   CalcLocalFrameRect(frame);
431c25 ¤   FetchIntersectingCells( updateRect, topLeftCell, botRightCell );
eae97b ¤   noSortFrame = updateRect;
c37eab ¤   sortFrame.left = mImageLocation.h;
f45220 ¤   sortFrame.right = sortFrame.left + GetColWidth( 1 );
842fcd ¤   sortFrame.top = noSortFrame.top;
6854b9 ¤   sortFrame.bottom = noSortFrame.bottom;
c69101 ¤   noSortFrame.left = sortFrame.right;
5e67c5 ¤
3ad866 ¤   colorState.Normalize();
e5a3a3 ¤   TextFont( kFontIDGeneva );
00b1c9 ¤   TextSize( 9 );
203ea6 ¤   TextFace( 0 );
2d53d8 ¤   TextMode( srcOr );
3ec7a1 ¤   {
28296f ¤   ¤   StDeviceLoop¤   devLoop(frame);¤¤
04eb96 ¤   ¤   while(devLoop.NextDepth(depth))
0f5b34 ¤   ¤   {
0462b7 ¤   ¤   ¤   SetThemeBackground( kThemeListViewBackgroundBrush, depth,
50f670 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ( depth > 1 ) );
eb1aa0 ¤   ¤   ¤   EraseRect( &noSortFrame );
4b1af1 ¤   ¤   ¤   if( sortFrame.right > 0 )
57f776 ¤   ¤   ¤   {
c3187b ¤   ¤   ¤   ¤   SetThemeBackground( kThemeListViewSortColumnBackgroundBrush,
388d2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   depth, ( depth > 1 ) );
a2be2a ¤   ¤   ¤   ¤   EraseRect( &sortFrame );
daa3a6 ¤   ¤   ¤   }
f1b69b ¤   ¤   ¤   mLowVertUpdate = mHighVertUpdate = 0;
1faf5a
a17690 ¤   ¤   ¤   for(cell.row = topLeftCell.row; cell.row <= botRightCell.row;
97aa9e ¤   ¤   ¤   ¤   cell.row++)
8cf776 ¤   ¤   ¤   {
42ce41 ¤   ¤   ¤   ¤   for(cell.col = topLeftCell.col; cell.col <= botRightCell.col;
57de70 ¤   ¤   ¤   ¤   ¤   cell.col++)
7772c3 ¤   ¤   ¤   ¤   {
aaf19a ¤   ¤   ¤   ¤   ¤   GetLocalCellRect( cell, cellRect );
d30ab0 ¤   ¤   ¤   ¤   ¤   DrawCell( cell, cellRect );
--d872 0004934cab7401201b3 Page 9 of CKeyTable.cp
862613 ¤   ¤   ¤   ¤   }
2ba3a6 ¤   ¤   ¤   }
06b313 ¤   ¤   ¤   if( mHighVertUpdate > 0 && mLowVertUpdate > 0 )
81f776 ¤   ¤   ¤   {
455de7 ¤   ¤   ¤   ¤   SetThemePen( kThemeListViewSeparatorBrush, depth,
94a4ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ( depth > 1 ) );
b88f00 ¤   ¤   ¤   ¤   do
6672c3 ¤   ¤   ¤   ¤   {
d2a0d5 ¤   ¤   ¤   ¤   ¤   MoveTo( frame.left, mLowVertUpdate );
00ada0 ¤   ¤   ¤   ¤   ¤   LineTo( frame.right - 1, mLowVertUpdate );
0a937c ¤   ¤   ¤   ¤   ¤   mLowVertUpdate += kRowHeight;
3cd657 ¤   ¤   ¤   ¤   } while( mLowVertUpdate <= mHighVertUpdate );
3ca3a6 ¤   ¤   ¤   }
f90fe4 ¤   ¤   }
159371 ¤   }
4260f3 ¤   HiliteSelection(IsActive(), true);
5eefe6 }
abaf5a
026d52 ¤   void
371450 CKeyTable::DrawCell1(
f71bb3 ¤   const STableCell¤   &inCell,
dcbee8 ¤   const Rect¤ ¤   ¤   &inLocalRect,
c49f0e ¤   Boolean¤¤   ¤   ¤   hilite,
c74b82 ¤   Boolean¤¤   ¤   ¤   inactive )
3dbb36 {
a68707 ¤   TableIndexT¤¤   woRow = mCollapsableTree->GetWideOpenIndex(inCell.row);
4f4c7a ¤   Rect¤   ¤   ¤   frame;
10af5a
0867b9 ¤   CalcLocalFrameRect( frame );
9fc7a1 ¤   {
a0296f ¤   ¤   StDeviceLoop¤   devLoop(frame);¤¤
7a77ad ¤   ¤   SInt16¤ ¤   ¤   depth;
44af5a
daeb96 ¤   ¤   while(devLoop.NextDepth(depth))
f55b34 ¤   ¤   {
a5fa4b ¤   ¤   ¤   StClipRgnState¤ clip;
84146e ¤   ¤   ¤   STableCell¤ ¤   woCell(woRow, 1);
12f457 ¤   ¤   ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
bccece ¤   ¤   ¤   KeyTableRef¤¤   keyRef;
8987c7 ¤   ¤   ¤
32e368 ¤   ¤   ¤   clip.ClipToIntersection( inLocalRect );
fd92cd ¤   ¤   ¤   GetCellData(woCell, &keyRef, dataSize);
892fcd ¤   ¤   ¤   SetThemeTextColor( kThemeListViewTextColor, depth, ( depth > 1 ) );
a0d311 ¤   ¤   ¤   switch( mColumnInfo.columns[inCell.col-1] )
7bf776 ¤   ¤   ¤   {
d9961c ¤   ¤   ¤   ¤   case kUserIDColumnID:
0e1577 ¤   ¤   ¤   ¤   ¤   if( DrawUserIDColumnCell(&keyRef, inLocalRect, depth,
b6c45b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   hilite, inactive ) )
525762 ¤   ¤   ¤   ¤   ¤   ¤   SetCellData(woCell, &keyRef, dataSize);
36cdbc ¤   ¤   ¤   ¤   ¤   DrawDropFlag(inCell, woRow);
1c14c3 ¤   ¤   ¤   ¤   ¤   break;
db0948 ¤   ¤   ¤   ¤   case kValidityColumnID:
fc0d29 ¤   ¤   ¤   ¤   ¤   DrawValidityColumnCell(&keyRef, inLocalRect, depth);
7f14c3 ¤   ¤   ¤   ¤   ¤   break;
f347e1 ¤   ¤   ¤   ¤   case kTrustColumnID:
9f4818 ¤   ¤   ¤   ¤   ¤   DrawTrustColumnCell(&keyRef, inLocalRect, depth);
0f14c3 ¤   ¤   ¤   ¤   ¤   break;
f65fa8 ¤   ¤   ¤   ¤   case kKeySizeColumnID:
b06437 ¤   ¤   ¤   ¤   ¤   DrawSizeColumnCell(&keyRef, inLocalRect, depth);
3514c3 ¤   ¤   ¤   ¤   ¤   break;
d97ccc ¤   ¤   ¤   ¤   case kKeyIDColumnID:
07b0bb ¤   ¤   ¤   ¤   ¤   DrawKeyIDColumnCell(&keyRef, inLocalRect, depth);
8114c3 ¤   ¤   ¤   ¤   ¤   break;
97d477 ¤   ¤   ¤   ¤   case kCreationColumnID:
103ca9 ¤   ¤   ¤   ¤   ¤   DrawCreationColumnCell(&keyRef, inLocalRect, depth);
0414c3 ¤   ¤   ¤   ¤   ¤   break;
8acd71 ¤   ¤   ¤   ¤   case kExpirationColumnID:
f07232 ¤   ¤   ¤   ¤   ¤   DrawExpirationColumnCell(&keyRef, inLocalRect, depth);
3914c3 ¤   ¤   ¤   ¤   ¤   break;
86b03b ¤   ¤   ¤   ¤   case kMRKColumnID:
7c63f5 ¤   ¤   ¤   ¤   ¤   DrawMRKColumnCell(&keyRef, inLocalRect, depth);
4914c3 ¤   ¤   ¤   ¤   ¤   break;
--3e90 000b56845ab401201b3 Page 10 of CKeyTable.cp
f163bb ¤   ¤   ¤   ¤   case kDescriptionColumnID:
18af8b ¤   ¤   ¤   ¤   ¤   DrawDescriptionColumnCell(&keyRef, inLocalRect, depth);
6614c3 ¤   ¤   ¤   ¤   ¤   break;
dfa3a6 ¤   ¤   ¤   }
4ba4f0 ¤   ¤   ¤   if( !mLowVertUpdate ||
488281 ¤   ¤   ¤   ¤   ( mLowVertUpdate > inLocalRect.bottom - 1 ) )
0765b7 ¤   ¤   ¤   ¤   mLowVertUpdate = inLocalRect.bottom - 1;
fb036a ¤   ¤   ¤   if( !mHighVertUpdate ||
4560be ¤   ¤   ¤   ¤   ( mHighVertUpdate < inLocalRect.bottom - 1 ) )
3c009e ¤   ¤   ¤   ¤   mHighVertUpdate = inLocalRect.bottom - 1;
5a0fe4 ¤   ¤   }
869371 ¤   }
b9efe6 }
12af5a
6e6d52 ¤   void
7bb1c7 CKeyTable::DrawCell(
9c1bb3 ¤   const STableCell¤   &inCell,
9ac050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
f3bb36 {
1d204b ¤   DrawCell1( inCell, inLocalRect, false, false );
8aefe6 }
69af5a
417e69 ¤   Boolean
6d9847 CKeyTable::DrawUserIDColumnCell(
011363 ¤   KeyTableRef¤¤   *ktr,
60da8d ¤   Rect¤   ¤   ¤   cellRect,
03ddd8 ¤   Int16¤  ¤   ¤   depth,
8f67e4 ¤   Boolean¤¤   ¤   hilite,
6f8391 ¤   Boolean¤¤   ¤   inactive )
ffbb36 {
cffb19 ¤   PGPError¤   ¤   err;
b80f0b ¤   char¤   ¤   ¤   cstr[kUserIDStringLength];
7fbbb8 ¤   Str255¤ ¤   ¤   pstr;
4ede55 ¤   PGPSize¤¤   ¤   len;
0ab042 ¤   Int16¤  ¤   ¤   width;
eb46e5 ¤   Rect¤   ¤   ¤   hiliteRect;
705052 ¤   ResIDT¤ ¤   ¤   iconID;
33af5a
80a73a ¤   switch( ktr->type )
9ac7a1 ¤   {
e3bf41 ¤   ¤   case kKey:
3a5b34 ¤   ¤   {
a4ed02 ¤   ¤   ¤   PGPBoolean¤ expired,
a25a1d ¤   ¤   ¤   ¤   ¤   ¤   revoked,
87d070 ¤   ¤   ¤   ¤   ¤   ¤   disabled,
53a26e ¤   ¤   ¤   ¤   ¤   ¤   secret;
807da6 ¤   ¤   ¤   PGPInt32¤   algorithm;
644019 ¤   ¤   ¤   PGPKeyRef¤  key;
1487c7 ¤   ¤   ¤
88af5a
5a88a1 ¤   ¤   ¤   key = ktr->u.key;
d50ca6 ¤   ¤   ¤   PGPGetKeyBoolean( key, kPGPKeyPropIsExpired, &expired );
095959 ¤   ¤   ¤   PGPGetKeyBoolean( key, kPGPKeyPropIsRevoked, &revoked );
8e4364 ¤   ¤   ¤   PGPGetKeyBoolean( key, kPGPKeyPropIsDisabled, &disabled );
55efb0 ¤   ¤   ¤   PGPGetKeyBoolean( key, kPGPKeyPropIsSecret, &secret );
02f7fd ¤   ¤   ¤   PGPGetKeyNumber( key, kPGPKeyPropAlgID, &algorithm );
98a512 ¤   ¤   ¤   if( revoked )
719989 ¤   ¤   ¤   ¤   iconID = (algorithm == kPGPPublicKeyAlgorithm_DSA) ?¤
86152f ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDSARevokedKeyID : kRSARevokedKeyID;
380760 ¤   ¤   ¤   else if( expired )
a39989 ¤   ¤   ¤   ¤   iconID = (algorithm == kPGPPublicKeyAlgorithm_DSA) ?¤
21bd6a ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDSAExpiredKeyID : kRSAExpiredKeyID;
d2f6e4 ¤   ¤   ¤   else if( disabled )
3af776 ¤   ¤   ¤   {
79ef62 ¤   ¤   ¤   ¤   if(algorithm == kPGPPublicKeyAlgorithm_DSA)
8f70a0 ¤   ¤   ¤   ¤   ¤   iconID = kDSADisabledKeyID;
53fa07 ¤   ¤   ¤   ¤   else
7d845f ¤   ¤   ¤   ¤   ¤   iconID = kRSADisabledKeyID;
3ca3a6 ¤   ¤   ¤   }
4c6a71 ¤   ¤   ¤   else if( secret )
f2f776 ¤   ¤   ¤   {
b5cbaa ¤   ¤   ¤   ¤   PGPBoolean¤ secShared;
--f392 000c7059a9f401201b3 Page 11 of CKeyTable.cp
9f2b85 ¤   ¤   ¤   ¤
33f8a5 ¤   ¤   ¤   ¤   PGPGetKeyBoolean( key, kPGPKeyPropIsSecretShared,
86d669 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &secShared);
cfef62 ¤   ¤   ¤   ¤   if(algorithm == kPGPPublicKeyAlgorithm_DSA)
8ee79f ¤   ¤   ¤   ¤   ¤   iconID = secShared ?¤   kDSASplitKeyPairIconID :
ce8c21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDSAKeyPairIconID;
e7fa07 ¤   ¤   ¤   ¤   else
eda803 ¤   ¤   ¤   ¤   ¤   iconID = secShared ?¤   kRSASplitKeyPairIconID :
6178de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kRSAKeyPairIconID;
2aa3a6 ¤   ¤   ¤   }
8946e3 ¤   ¤   ¤   else if(algorithm == kPGPPublicKeyAlgorithm_DSA)
7d1a78 ¤   ¤   ¤   ¤   iconID = kDSAKeyIconID;
3fbb8c ¤   ¤   ¤   else
90c2c2 ¤   ¤   ¤   ¤   iconID = kRSAKeyIconID;
39ced1 ¤   ¤   ¤   DrawIcon(iconID, cellRect, 1, hilite ?¤ kTransformSelected :
07de5f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kTransformNone );
3b87c7 ¤   ¤   ¤
b28ea0 ¤   ¤   ¤   len = kUserIDStringLength;
507881 ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer( key, kUserIDStringLength,
d8d004 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cstr, &len );
700425 ¤   ¤   ¤   if(err != kPGPError_BufferTooSmall)
1e6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
14edce ¤   ¤   ¤   CToPString(cstr, pstr);
3cd82f ¤   ¤   ¤   if( mDefaultKey == key )
4a5f01 ¤   ¤   ¤   ¤   TextFace( bold );
3ff6e4 ¤   ¤   ¤   else if( disabled )
3d2411 ¤   ¤   ¤   ¤   TextFace( italic );
81ef23 ¤   ¤   ¤   if( !mHasRSA && ( algorithm == kPGPPublicKeyAlgorithm_RSA ) )
4a2411 ¤   ¤   ¤   ¤   TextFace( italic );
7878ee ¤   ¤   ¤   TruncString(¤   mColumnInfo.columnWidths[kUserIDColumnID] -
23f288 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDropFlagSlop - kLeftIndent -
e8ff5f ¤   ¤   ¤   ¤   ¤   ¤   ¤   kIconWidth - kLeftBorder,
547150 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pstr, truncMiddle);
7c1611 ¤   ¤   ¤   hiliteRect.left = cellRect.left + kDropFlagSlop +
3e9c5c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kIconWidth + kLeftBorder;
18cdcb ¤   ¤   ¤   break;
ad0fe4 ¤   ¤   }
2339de ¤   ¤   case kUserID:
455b34 ¤   ¤   {
d4b1b2 ¤   ¤   ¤   PGPUserIDRef¤   user;
03e428 ¤   ¤   ¤   PGPInt32¤   ¤   algorithm;
86f925 ¤   ¤   ¤   PGPBoolean¤ ¤   isAttributeID;
5d87c7 ¤   ¤   ¤
2e66a2 ¤   ¤   ¤   user = ktr->u.user;
fb87c7 ¤   ¤   ¤
a36d48 ¤   ¤   ¤   err = PGPGetUserIDBoolean( user, kPGPUserIDPropIsAttribute,
95c1df ¤   ¤   ¤   ¤   ¤   ¤   &isAttributeID );
dd144d ¤   ¤   ¤   pgpAssertNoErr( err );
b587c7 ¤   ¤   ¤
7be451 ¤   ¤   ¤   if( isAttributeID )
a3f776 ¤   ¤   ¤   {
4d9e3d ¤   ¤   ¤   ¤   PGPInt32¤   attributeType;
1e54d6 ¤   ¤   ¤   ¤   short¤  ¤   strIndex;
712b85 ¤   ¤   ¤   ¤
1be806 ¤   ¤   ¤   ¤   err = PGPGetUserIDNumber( user,
0fadd4 ¤   ¤   ¤   ¤   ¤   ¤   kPGPUserIDPropAttributeType, &attributeType );
cc2b85 ¤   ¤   ¤   ¤
15bb8d ¤   ¤   ¤   ¤   if( attributeType == kPGPAttribute_Image )
f272c3 ¤   ¤   ¤   ¤   {
a9a76d ¤   ¤   ¤   ¤   ¤   strIndex ¤  = kPhotographID;
a7ec7f ¤   ¤   ¤   ¤   ¤   iconID¤ ¤   = kPhotoUserIDIconID;
f52613 ¤   ¤   ¤   ¤   }
61fa07 ¤   ¤   ¤   ¤   else
f372c3 ¤   ¤   ¤   ¤   {
ca5b56 ¤   ¤   ¤   ¤   ¤   strIndex ¤  = kUnknownID;
a1aad4 ¤   ¤   ¤   ¤   ¤   iconID¤ ¤   = kUnknowUserIDIconID;
8d2613 ¤   ¤   ¤   ¤   }
21af5a
a3d50b ¤   ¤   ¤   ¤   GetIndString( pstr, kStringListID, strIndex);
f2a3a6 ¤   ¤   ¤   }
aabb8c ¤   ¤   ¤   else
c7f776 ¤   ¤   ¤   {
--d252 000eddd8c1d401201b3 Page 12 of CKeyTable.cp
388677 ¤   ¤   ¤   ¤   err = PGPGetKeyNumber(ktr->ownerKey, kPGPKeyPropAlgID,
75ef03 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm);
0c6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
742b85 ¤   ¤   ¤   ¤
4235aa ¤   ¤   ¤   ¤   if( algorithm == kPGPPublicKeyAlgorithm_DSA )
fa94e5 ¤   ¤   ¤   ¤   ¤   iconID = kDHUserIDIconID;
f7fa07 ¤   ¤   ¤   ¤   else
ee5f91 ¤   ¤   ¤   ¤   ¤   iconID = kRSAUserIDIconID;
baaf5a
597688 ¤   ¤   ¤   ¤   err = PGPGetUserIDStringBuffer(user, kPGPUserIDPropName,
a3aed0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kUserIDStringLength, cstr, &len);
e2289b ¤   ¤   ¤   ¤   CToPString(cstr, pstr);
15a3a6 ¤   ¤   ¤   }
f487c7 ¤   ¤   ¤
af524f ¤   ¤   ¤   pgpAssertNoErr(err);
50af5a
ba3cb6 ¤   ¤   ¤   DrawIcon(iconID, cellRect, 2, hilite ?¤ kTransformSelected :
ffde5f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kTransformNone );
b678ee ¤   ¤   ¤   TruncString(¤   mColumnInfo.columnWidths[kUserIDColumnID] -
45f288 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDropFlagSlop - kLeftIndent -
421c69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kLevelIndent - kIconWidth - kLeftBorder,
8d7150 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pstr, truncMiddle);
061611 ¤   ¤   ¤   hiliteRect.left = cellRect.left + kDropFlagSlop +
a2c87b ¤   ¤   ¤   ¤   ¤   ¤   ¤   kLevelIndent + kIconWidth + kLeftBorder;
9acdcb ¤   ¤   ¤   break;
260fe4 ¤   ¤   }
9aa588 ¤   ¤   case kSignature:
0f5b34 ¤   ¤   {
de8c2a ¤   ¤   ¤   Str255¤ ¤   str2;
b864c7 ¤   ¤   ¤   size_t¤ ¤   len;
97d6e7 ¤   ¤   ¤   PGPKeyRef¤  certKey;
55bfc2 ¤   ¤   ¤   PGPBoolean¤ revoked,
cd08dd ¤   ¤   ¤   ¤   ¤   ¤   expired,
5f73e8 ¤   ¤   ¤   ¤   ¤   ¤   verified,
e47a6d ¤   ¤   ¤   ¤   ¤   ¤   tried,
aaec27 ¤   ¤   ¤   ¤   ¤   ¤   notCorrupt,
279770 ¤   ¤   ¤   ¤   ¤   ¤   exportable;
02af69 ¤   ¤   ¤   PGPInt32¤   trustLevel;
3bb652 ¤   ¤   ¤   PGPSigRef¤  sig;
79af5a
0860e0 ¤   ¤   ¤   sig = ktr->u.sig;
e1dbd1 ¤   ¤   ¤   PGPGetSigBoolean(sig, kPGPSigPropIsRevoked, &revoked);
eb3ecb ¤   ¤   ¤   PGPGetSigBoolean(sig, kPGPSigPropIsVerified, &verified);
006151 ¤   ¤   ¤   PGPGetSigBoolean(sig, kPGPSigPropIsTried, &tried);
257fe3 ¤   ¤   ¤   PGPGetSigBoolean(sig, kPGPSigPropIsNotCorrupt, &notCorrupt);
500978 ¤   ¤   ¤   PGPGetSigBoolean(sig, kPGPSigPropIsExportable, &exportable);
9b99f6 ¤   ¤   ¤   PGPGetSigBoolean(sig, kPGPSigPropIsExpired, &expired);
f06610 ¤   ¤   ¤   PGPGetSigNumber(sig, kPGPSigPropTrustLevel, &trustLevel);
3f87c7 ¤   ¤   ¤
b1f566 ¤   ¤   ¤   if(revoked)
414b5f ¤   ¤   ¤   ¤   iconID = ¤  kRevokedSigID;
e52194 ¤   ¤   ¤   else if(expired)
5c423a ¤   ¤   ¤   ¤   iconID =¤   kSignatureExpiredIconID;
cbeb01 ¤   ¤   ¤   else if(verified)
faf776 ¤   ¤   ¤   {
f28664 ¤   ¤   ¤   ¤   if(exportable)
c972c3 ¤   ¤   ¤   ¤   {
4f688f ¤   ¤   ¤   ¤   ¤   if(trustLevel == 1)
ae7f2b ¤   ¤   ¤   ¤   ¤   ¤   iconID =¤   kExportMetaSigIconID;
964bd6 ¤   ¤   ¤   ¤   ¤   else
a1e3c9 ¤   ¤   ¤   ¤   ¤   ¤   iconID =¤   kExportSignatureIconID;
0e2613 ¤   ¤   ¤   ¤   }
38fa07 ¤   ¤   ¤   ¤   else
2572c3 ¤   ¤   ¤   ¤   {
6987eb ¤   ¤   ¤   ¤   ¤   if(trustLevel == 2)
505bac ¤   ¤   ¤   ¤   ¤   ¤   iconID =¤   kNoExportMetaSigIconID;
bd4bd6 ¤   ¤   ¤   ¤   ¤   else
6a452b ¤   ¤   ¤   ¤   ¤   ¤   iconID =¤   kNoExportSignatureIconID;
e02613 ¤   ¤   ¤   ¤   }
e9a3a6 ¤   ¤   ¤   }
64f46b ¤   ¤   ¤   else if(tried)
eda1fa ¤   ¤   ¤   ¤   iconID =¤   kBadSignatureID;
--019a 000f1692ad4401201b3 Page 13 of CKeyTable.cp
29da88 ¤   ¤   ¤   else if(notCorrupt)
66f776 ¤   ¤   ¤   {
e10bae ¤   ¤   ¤   ¤   if( exportable )
ff6c9e ¤   ¤   ¤   ¤   ¤   iconID =¤   kExportSignatureIconID;
89fa07 ¤   ¤   ¤   ¤   else
24a72b ¤   ¤   ¤   ¤   ¤   iconID =¤   kNoExportSignatureIconID;
e5a3a6 ¤   ¤   ¤   }
ecbb8c ¤   ¤   ¤   else
a9a1fa ¤   ¤   ¤   ¤   iconID =¤   kBadSignatureID;
576d6b ¤   ¤   ¤   DrawIcon(iconID, cellRect, 3, hilite ?¤ kTransformSelected :
2fde5f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kTransformNone );
1a9ad8 ¤   ¤   ¤   err = PGPGetSigCertifierKey(sig, mKeySet, &certKey);
201d7c ¤   ¤   ¤   if(!PGPKeyRefIsValid(certKey) && !mDefaultRing)
e0f776 ¤   ¤   ¤   {
de2d45 ¤   ¤   ¤   ¤   err = PGPGetSigCertifierKey(sig,
7e9725 ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet(),
56ab32 ¤   ¤   ¤   ¤   ¤   ¤   &certKey);
7da3a6 ¤   ¤   ¤   }
e2098b ¤   ¤   ¤   if(IsntPGPError(err) && PGPKeyRefIsValid(certKey))
daf776 ¤   ¤   ¤   {
9eff02 ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer(certKey,
994fa7 ¤   ¤   ¤   ¤   ¤   kUserIDStringLength, cstr, &len);
106f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
02289b ¤   ¤   ¤   ¤   CToPString(cstr, pstr);
7fa3a6 ¤   ¤   ¤   }
eebb8c ¤   ¤   ¤   else
d5f776 ¤   ¤   ¤   {
45195b ¤   ¤   ¤   ¤   PGPKeyID¤   ¤   keyID;
ab099d ¤   ¤   ¤   ¤   char¤   ¤   ¤   keyIDString[ kPGPMaxKeyIDStringSize ];
992b85 ¤   ¤   ¤   ¤
f9b407 ¤   ¤   ¤   ¤   ::GetIndString(¤pstr,
50629f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
072f52 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSigUserUnavailableID);
cacf70 ¤   ¤   ¤   ¤   err = PGPGetKeyIDOfCertifier(sig, &keyID);
306f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
11f18d ¤   ¤   ¤   ¤   err = PGPGetKeyIDString( &keyID,
3b2b0e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyIDString_Abbreviated,
6a1875 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyIDString);
d36f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
ce8426 ¤   ¤   ¤   ¤   CToPString(keyIDString, str2);
c5380f ¤   ¤   ¤   ¤   if(str2[0] > 10)
b4740e ¤   ¤   ¤   ¤   ¤   str2[0] = 10;
1a53a0 ¤   ¤   ¤   ¤   AppendPString(str2, pstr);
532411 ¤   ¤   ¤   ¤   TextFace( italic );
1ea3a6 ¤   ¤   ¤   }
ef78ee ¤   ¤   ¤   TruncString(¤   mColumnInfo.columnWidths[kUserIDColumnID] -
13f288 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDropFlagSlop - kLeftIndent -
ebdad1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kLevelIndent * 2 - kIconWidth - kLeftBorder,
9c9b9a ¤   ¤   ¤   ¤   ¤   ¤   ¤   pstr, truncMiddle );
5e1611 ¤   ¤   ¤   hiliteRect.left = cellRect.left + kDropFlagSlop +
480ec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kLevelIndent * 2 + kIconWidth + kLeftBorder;
a2cdcb ¤   ¤   ¤   break;
510fe4 ¤   ¤   }
da9371 ¤   }
6a3d6b ¤   MoveTo( hiliteRect.left + kLeftIndent, cellRect.bottom - kBottomBorder );
0debc9 ¤   width = StringWidth( pstr );
220067 ¤   if( hilite && !inactive )
2c0d5d ¤   ¤   TextMode(srcCopy);
73ba65 ¤   DrawString( pstr );
2cf378 ¤   if( hilite )
fbc7a1 ¤   {
7c64fb ¤   ¤   hiliteRect.right = hiliteRect.left + width + kLeftIndent;
cbace6 ¤   ¤   hiliteRect.top = cellRect.top;
38072f ¤   ¤   hiliteRect.bottom = cellRect.bottom - 1;
57af21 ¤   ¤   if( inactive )
e55b34 ¤   ¤   {
d6e22f ¤   ¤   ¤   RGBColor¤   hiliteColor;
4f87c7 ¤   ¤   ¤
dc74fb ¤   ¤   ¤   LMGetHiliteRGB( &hiliteColor );
f49c5c ¤   ¤   ¤   RGBForeColor( &hiliteColor );
ec0a43 ¤   ¤   ¤   FrameRect( &hiliteRect );
f10fe4 ¤   ¤   }
--a6a2 00094f924c4401201b3 Page 14 of CKeyTable.cp
040e1d ¤   ¤   else
5c5b34 ¤   ¤   {
aa3181 ¤   ¤   ¤   UDrawingUtils::SetHiliteModeOn();
d815ac ¤   ¤   ¤   InvertRect(&hiliteRect);
060fe4 ¤   ¤   }
8a9371 ¤   }
903ea6 ¤   TextFace( 0 );
b6c7a1 ¤   {
1c8b20 ¤   ¤   Int16¤  sl, sr;
1b1b52 ¤   ¤
8ced7b ¤   ¤   sl = hiliteRect.left - kIconWidth - kLeftBorder;
b66ec9 ¤   ¤   sr = hiliteRect.left + width;
6ca867 ¤   ¤   if( sr != ktr->selectRight || sl != ktr->selectLeft ||
daf96e ¤   ¤   ¤   iconID != ktr->iconID )
935b34 ¤   ¤   {
21e0f6 ¤   ¤   ¤   ktr->selectLeft¤¤   = sl;
03136d ¤   ¤   ¤   ktr->selectRight¤   = sr;
295708 ¤   ¤   ¤   ktr->iconID¤¤   ¤   = iconID;
295b24 ¤   ¤   ¤   return true;
830fe4 ¤   ¤   }
639371 ¤   }
94a82a ¤   return false;
f9efe6 }
98af5a
b26d52 ¤   void
2e6daa CKeyTable::DrawValidityColumnCell(¤ KeyTableRef¤*ktr,
27f18d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
0a6461 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth)
33bb36 {
7661e0 ¤   PGPError¤   err;
039cea ¤   PGPValidity¤validity¤   = kPGPValidity_Unknown;
b80d79 ¤   PGPBoolean¤ axiomatic;
8a67c5 ¤
923777 ¤   switch(ktr->type)
12c7a1 ¤   {
490e89 ¤   ¤   PGPInt32¤   myValidityNumber¤   = 0;
211b52 ¤   ¤
b4bf41 ¤   ¤   case kKey:
f839de ¤   ¤   case kUserID:
b2beef ¤   ¤   ¤   if(ktr->type == kKey)
3ef776 ¤   ¤   ¤   {
00fb4f ¤   ¤   ¤   ¤   PGPKeyRef¤  key;
3167c5 ¤
3bbfa9 ¤   ¤   ¤   ¤   key = ktr->u.key;
04e7aa ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserIDValidity(key, &validity);
266f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
7b3a09 ¤   ¤   ¤   ¤   PGPGetKeyBoolean(key, kPGPKeyPropIsAxiomatic, &axiomatic);
b4a3a6 ¤   ¤   ¤   }
8cbb8c ¤   ¤   ¤   else
d4f776 ¤   ¤   ¤   {
4b5ec1 ¤   ¤   ¤   ¤   PGPUserIDRef¤   user;
f6861a ¤   ¤   ¤   ¤   PGPInt32¤   ¤   number;
fdaf5a
60ed5e ¤   ¤   ¤   ¤   user = ktr->u.user;
d4af22 ¤   ¤   ¤   ¤   err = PGPGetUserIDNumber(user, kPGPUserIDPropValidity,
14dd9e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &number);
b2ff19 ¤   ¤   ¤   ¤   validity¤   = (PGPValidity)number;
206f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
645888 ¤   ¤   ¤   ¤   PGPGetKeyBoolean(ktr->ownerKey, kPGPKeyPropIsAxiomatic,
0383d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &axiomatic);
eea3a6 ¤   ¤   ¤   }
af620c ¤   ¤   ¤   switch(validity)
24f776 ¤   ¤   ¤   {
5e6ab9 ¤   ¤   ¤   ¤   default:
54f09b ¤   ¤   ¤   ¤   case kPGPValidity_Unknown:
0dea7a ¤   ¤   ¤   ¤   case kPGPValidity_Invalid:
a38e6f ¤   ¤   ¤   ¤   ¤   myValidityNumber = 0;
1e14c3 ¤   ¤   ¤   ¤   ¤   break;
0bb25e ¤   ¤   ¤   ¤   case kPGPValidity_Marginal:
78d4b3 ¤   ¤   ¤   ¤   ¤   myValidityNumber = 1;
bb14c3 ¤   ¤   ¤   ¤   ¤   break;
9412e8 ¤   ¤   ¤   ¤   case kPGPValidity_Complete:
--a6a3 000959eec14401201b3 Page 15 of CKeyTable.cp
d93bd7 ¤   ¤   ¤   ¤   ¤   myValidityNumber = 2;
0314c3 ¤   ¤   ¤   ¤   ¤   break;
b8a3a6 ¤   ¤   ¤   }
5a03f4 ¤   ¤   ¤   DrawValidity(axiomatic ? (kMaxValidity + 1) : myValidityNumber,
08412d ¤   ¤   ¤   ¤   ¤   ¤   ¤   cellRect, depth);
cfcdcb ¤   ¤   ¤   break;
a9a588 ¤   ¤   case kSignature:
0ccdcb ¤   ¤   ¤   break;
b19371 ¤   }
78efe6 }
3daf5a
466d52 ¤   void
558ec5 CKeyTable::DrawTrustColumnCell(¤¤   KeyTableRef¤*ktr,
0bf18d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
c16461 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth)
febb36 {
ed0040 ¤   PGPError err;
dd67c5 ¤
db3777 ¤   switch(ktr->type)
0cc7a1 ¤   {
e4bf41 ¤   ¤   case kKey:
61f776 ¤   ¤   ¤   {
1afb4f ¤   ¤   ¤   ¤   PGPKeyRef¤  key;
159d45 ¤   ¤   ¤   ¤   PGPInt32¤   trust;
8867c5 ¤
ebbfa9 ¤   ¤   ¤   ¤   key = ktr->u.key;
f0f440 ¤   ¤   ¤   ¤   err = PGPGetKeyNumber(key, kPGPKeyPropTrust, &trust);
2f6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
2c1e92 ¤   ¤   ¤   ¤   switch(trust)
3972c3 ¤   ¤   ¤   ¤   {
745ee4 ¤   ¤   ¤   ¤   ¤   default:
974144 ¤   ¤   ¤   ¤   ¤   case kPGPKeyTrust_Undefined:
5b7ed1 ¤   ¤   ¤   ¤   ¤   case kPGPKeyTrust_Unknown:
23136c ¤   ¤   ¤   ¤   ¤   case kPGPKeyTrust_Never:
f98c26 ¤   ¤   ¤   ¤   ¤   ¤   trust = 0;
b400eb ¤   ¤   ¤   ¤   ¤   ¤   break;
045f8e ¤   ¤   ¤   ¤   ¤   case kPGPKeyTrust_Marginal:
ead6fa ¤   ¤   ¤   ¤   ¤   ¤   trust = 1;
1600eb ¤   ¤   ¤   ¤   ¤   ¤   break;
ecff38 ¤   ¤   ¤   ¤   ¤   case kPGPKeyTrust_Complete:
57399e ¤   ¤   ¤   ¤   ¤   ¤   trust = 2;
c400eb ¤   ¤   ¤   ¤   ¤   ¤   break;
3f390f ¤   ¤   ¤   ¤   ¤   case kPGPKeyTrust_Ultimate:
476342 ¤   ¤   ¤   ¤   ¤   ¤   trust = 3;
7f00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
8d2613 ¤   ¤   ¤   ¤   }
9b627c ¤   ¤   ¤   ¤   DrawTrust(trust, cellRect, depth);
21a3a6 ¤   ¤   ¤   }
99cdcb ¤   ¤   ¤   break;
3039de ¤   ¤   case kUserID:
afa588 ¤   ¤   case kSignature:
7ecdcb ¤   ¤   ¤   break;
dc9371 ¤   }
e1efe6 }
6eaf5a
df6d52 ¤   void
4f13ca CKeyTable::DrawSizeColumnCell(¤ KeyTableRef¤*ktr,
0af18d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
066461 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth)
6bbb36 {
750040 ¤   PGPError err;
ac67c5 ¤
603777 ¤   switch(ktr->type)
59c7a1 ¤   {
95bf41 ¤   ¤   case kKey:
cf5b34 ¤   ¤   {
1f9a09 ¤   ¤   ¤   PGPKeyRef¤  ¤   key;
5ec19f ¤   ¤   ¤   PGPSubKeyRef¤   subKey;
9b2ed4 ¤   ¤   ¤   PGPInt32¤   ¤   bits,
dd8053 ¤   ¤   ¤   ¤   ¤   ¤   ¤   algorithm;
0e3986 ¤   ¤   ¤   Str255¤ ¤   ¤   str,
95aafb ¤   ¤   ¤   ¤   ¤   ¤   ¤   str2;
--b211 0007662ec60401201b3 Page 16 of CKeyTable.cp
e0af5a
c488a1 ¤   ¤   ¤   key = ktr->u.key;
c59cf7 ¤   ¤   ¤   PGPGetKeyNumber(key, kPGPKeyPropBits, &bits);
098f0d ¤   ¤   ¤   PGPGetKeyNumber(key, kPGPKeyPropAlgID, &algorithm);
b14b6f ¤   ¤   ¤   NumToString(bits, str);
84d7aa ¤   ¤   ¤   if( algorithm == kPGPPublicKeyAlgorithm_DSA )
a6f776 ¤   ¤   ¤   {
98e7d8 ¤   ¤   ¤   ¤   PGPKeyIterSeek(mKeyIter, key);
c2a4c2 ¤   ¤   ¤   ¤   err = PGPKeyIterNextSubKey(mKeyIter, &subKey);
24a64a ¤   ¤   ¤   ¤   if( IsntPGPError( err ) && IsntNull( subKey ) )
0472c3 ¤   ¤   ¤   ¤   {
0dd10f ¤   ¤   ¤   ¤   ¤   err = PGPGetSubKeyNumber(subKey, kPGPKeyPropBits,
e437dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &bits);
146aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
7eab56 ¤   ¤   ¤   ¤   ¤   NumToString(bits, str2);
f0c6e7 ¤   ¤   ¤   ¤   ¤   AppendPString("\p/", str2);
8ebba7 ¤   ¤   ¤   ¤   ¤   AppendPString(str, str2);
a51961 ¤   ¤   ¤   ¤   ¤   CopyPString(str2, str);
0a2613 ¤   ¤   ¤   ¤   }
08a3a6 ¤   ¤   ¤   }
87692f ¤   ¤   ¤   MoveTo(¤cellRect.left + kLeftIndent + kTextIndent,
c116b3 ¤   ¤   ¤   ¤   ¤   cellRect.bottom - kBottomBorder);
adcfd2 ¤   ¤   ¤   DrawString(str);
d3cdcb ¤   ¤   ¤   break;
c30fe4 ¤   ¤   }
ed39de ¤   ¤   case kUserID:
c9a588 ¤   ¤   case kSignature:
0acdcb ¤   ¤   ¤   break;
eb9371 ¤   }
6fefe6 }
59af5a
bb6d52 ¤   void
e3dac6 CKeyTable::DrawKeyIDColumnCell(¤¤   KeyTableRef¤*ktr,
c2f18d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
ee6461 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth)
51bb36 {
49a73a ¤   switch( ktr->type )
88c7a1 ¤   {
dbbf41 ¤   ¤   case kKey:
1c5b34 ¤   ¤   {
40e46c ¤   ¤   ¤   PGPError¤   err;
104019 ¤   ¤   ¤   PGPKeyRef¤  key;
2efd67 ¤   ¤   ¤   Str255¤ ¤   pstr;
12b97f ¤   ¤   ¤   PGPKeyID¤   keyID;
8cff79 ¤   ¤   ¤   char¤   ¤   keyIDString[ kPGPMaxKeyIDStringSize ];
ebaf5a
ef88a1 ¤   ¤   ¤   key = ktr->u.key;
1ed24a ¤   ¤   ¤   err = PGPGetKeyIDFromKey(key, &keyID );
f8524f ¤   ¤   ¤   pgpAssertNoErr(err);
a154f3 ¤   ¤   ¤   err = PGPGetKeyIDString( &keyID, kPGPKeyIDString_Abbreviated,
d7b674 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyIDString);
da524f ¤   ¤   ¤   pgpAssertNoErr(err);
668c2e ¤   ¤   ¤   CToPString(keyIDString, pstr);
adaf5a
f14ff3 ¤   ¤   ¤   MoveTo( cellRect.left + kLeftIndent + kTextIndent,
ec4953 ¤   ¤   ¤   ¤   ¤   ¤   cellRect.bottom - kBottomBorder );
0de15e ¤   ¤   ¤   DrawString( pstr );
cecdcb ¤   ¤   ¤   break;
240fe4 ¤   ¤   }
8c39de ¤   ¤   case kUserID:
f4a588 ¤   ¤   case kSignature:
b1cdcb ¤   ¤   ¤   break;
269371 ¤   }
a5efe6 }
4aaf5a
f56d52 ¤   void
40afe6 CKeyTable::DrawCreationColumnCell(¤ KeyTableRef¤*ktr,
dbf18d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
b66461 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth)
e0bb36 {
e530dd ¤   PGPTime¤¤   creation;
76109c ¤   Str255¤ ¤   str;
--82c2 000c87da94b401201b3 Page 17 of CKeyTable.cp
2a67c5 ¤
9f3777 ¤   switch(ktr->type)
c2c7a1 ¤   {
17bf41 ¤   ¤   case kKey:
4f5b34 ¤   ¤   {
024019 ¤   ¤   ¤   PGPKeyRef¤  key;
4caf5a
7e88a1 ¤   ¤   ¤   key = ktr->u.key;
049710 ¤   ¤   ¤   PGPGetKeyTime( key, kPGPKeyPropCreation, &creation );
b625e8 ¤   ¤   ¤   creation = PGPTimeToMacTime( creation );
672b80 ¤   ¤   ¤   DateString( creation, shortDate, str, NULL );
394ff3 ¤   ¤   ¤   MoveTo( cellRect.left + kLeftIndent + kTextIndent,
bf4e68 ¤   ¤   ¤   ¤   ¤   cellRect.bottom - kBottomBorder );
f919fe ¤   ¤   ¤   DrawString( str );
38cdcb ¤   ¤   ¤   break;
de0fe4 ¤   ¤   }
c439de ¤   ¤   case kUserID:
34cdcb ¤   ¤   ¤   break;
2da588 ¤   ¤   case kSignature:
7e5b34 ¤   ¤   {
88b652 ¤   ¤   ¤   PGPSigRef¤  sig;
afaf5a
3960e0 ¤   ¤   ¤   sig = ktr->u.sig;
2d0440 ¤   ¤   ¤   PGPGetSigTime( sig, kPGPSigPropCreation, &creation );
a525e8 ¤   ¤   ¤   creation = PGPTimeToMacTime( creation );
4a2b80 ¤   ¤   ¤   DateString( creation, shortDate, str, NULL );
4c4ff3 ¤   ¤   ¤   MoveTo( cellRect.left + kLeftIndent + kTextIndent,
834e68 ¤   ¤   ¤   ¤   ¤   cellRect.bottom - kBottomBorder );
7f19fe ¤   ¤   ¤   DrawString( str );
8ecdcb ¤   ¤   ¤   break;
f40fe4 ¤   ¤   }
2c9371 ¤   }
22efe6 }
83af5a
e76d52 ¤   void
82cb62 CKeyTable::DrawExpirationColumnCell(¤   KeyTableRef¤*ktr,
23138d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
45635a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth)
acbb36 {
ac5f34 ¤   PGPTime¤¤   expiration;
82109c ¤   Str255¤ ¤   str;
2caf5a
fba73a ¤   switch( ktr->type )
f9c7a1 ¤   {
10bf41 ¤   ¤   case kKey:
965b34 ¤   ¤   {
434019 ¤   ¤   ¤   PGPKeyRef¤  key;
b1af5a
7f88a1 ¤   ¤   ¤   key = ktr->u.key;
746a77 ¤   ¤   ¤   PGPGetKeyTime( key, kPGPKeyPropExpiration, &expiration );
a92ebc ¤   ¤   ¤   if( expiration != 0 )
90f776 ¤   ¤   ¤   {
8bfc23 ¤   ¤   ¤   ¤   expiration = PGPTimeToMacTime(expiration);
e6f825 ¤   ¤   ¤   ¤   DateString( expiration, shortDate, str, NULL );
41a3a6 ¤   ¤   ¤   }
b8bb8c ¤   ¤   ¤   else
601064 ¤   ¤   ¤   ¤   GetIndString( str, kStringListID, kNeverExpiresID );
0d692f ¤   ¤   ¤   MoveTo(¤cellRect.left + kLeftIndent + kTextIndent,
c915c4 ¤   ¤   ¤   ¤   ¤   ¤   cellRect.bottom - kBottomBorder);
0b19fe ¤   ¤   ¤   DrawString( str );
04cdcb ¤   ¤   ¤   break;
ac0fe4 ¤   ¤   }
37a588 ¤   ¤   case kSignature:
a55b34 ¤   ¤   {
2eb652 ¤   ¤   ¤   PGPSigRef¤  sig;
b0af5a
f560e0 ¤   ¤   ¤   sig = ktr->u.sig;
f9f7ad ¤   ¤   ¤   PGPGetSigTime(sig, kPGPSigPropExpiration, &expiration);
2b2ebc ¤   ¤   ¤   if( expiration != 0 )
95f776 ¤   ¤   ¤   {
2afc23 ¤   ¤   ¤   ¤   expiration = PGPTimeToMacTime(expiration);
c80c36 ¤   ¤   ¤   ¤   DateString(expiration, shortDate, str, NULL);
--8bfb 00015e5df84401201b3 Page 18 of CKeyTable.cp
cfa3a6 ¤   ¤   ¤   }
41bb8c ¤   ¤   ¤   else
d4ff2f ¤   ¤   ¤   ¤   GetIndString( str, kStringListID, kNeverExpiresID);
a24ff3 ¤   ¤   ¤   MoveTo( cellRect.left + kLeftIndent + kTextIndent,
0c15c4 ¤   ¤   ¤   ¤   ¤   ¤   cellRect.bottom - kBottomBorder);
9119fe ¤   ¤   ¤   DrawString( str );
c3cdcb ¤   ¤   ¤   break;
970fe4 ¤   ¤   }
db39de ¤   ¤   case kUserID:
14cdcb ¤   ¤   ¤   break;
159371 ¤   }
27efe6 }
75af5a
046d52 ¤   void
944d14 CKeyTable::DrawMRKColumnCell(¤  ¤   KeyTableRef¤*ktr,
8cf18d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
ab6461 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth)
dabb36 {
2ea73a ¤   switch( ktr->type )
5cc7a1 ¤   {
61bf41 ¤   ¤   case kKey:
485b34 ¤   ¤   {
d99a09 ¤   ¤   ¤   PGPKeyRef¤  ¤   key;
9c7412 ¤   ¤   ¤   PGPError¤   ¤   err;
89447a ¤   ¤   ¤   PGPUInt32¤  ¤   numADKs;
7eaf5a
5d88a1 ¤   ¤   ¤   key = ktr->u.key;
cb8d9a ¤   ¤   ¤   err = PGPCountAdditionalRecipientRequests( key, &numADKs );
748649 ¤   ¤   ¤   if( IsntPGPError( err ) && ( numADKs > 0 ) )
58a340 ¤   ¤   ¤   ¤   DrawIcon(kMRKActiveIconID, cellRect, -1);
d1bb8c ¤   ¤   ¤   else
ae3f15 ¤   ¤   ¤   ¤   DrawIcon(kKeyAttrOffIconID, cellRect, -1);
2dcdcb ¤   ¤   ¤   break;
b10fe4 ¤   ¤   }
7739de ¤   ¤   case kUserID:
6ea588 ¤   ¤   case kSignature:
44cdcb ¤   ¤   ¤   break;
979371 ¤   }
f4efe6 }
77af5a
396d52 ¤   void
b0af59 CKeyTable::DrawDescriptionColumnCell(¤  KeyTableRef¤*ktr,
20138d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
e0635a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth)
cdbb36 {
c9109c ¤   Str255¤ ¤   str;
11e5f1 ¤   PGPInt32¤   algorithm;
1289b7 ¤   Int16¤  ¤   strIndex;
7267c5 ¤
25a73a ¤   switch( ktr->type )
34c7a1 ¤   {
18bf41 ¤   ¤   case kKey:
175b34 ¤   ¤   {
874019 ¤   ¤   ¤   PGPKeyRef¤  key;
adbb35 ¤   ¤   ¤   PGPBoolean¤ secret,
db01e2 ¤   ¤   ¤   ¤   ¤   ¤   shared;
8faf5a
2388a1 ¤   ¤   ¤   key = ktr->u.key;
130e62 ¤   ¤   ¤   PGPGetKeyBoolean(key, kPGPKeyPropIsSecret, &secret);
e28f0d ¤   ¤   ¤   PGPGetKeyNumber(key, kPGPKeyPropAlgID, &algorithm);
768549 ¤   ¤   ¤   PGPGetKeyBoolean( key, kPGPKeyPropIsSecretShared, &shared );
bd36a1 ¤   ¤   ¤   if( shared )
e55ef7 ¤   ¤   ¤   ¤   strIndex = kSplitKeyPairDescriptionID;
bf6a71 ¤   ¤   ¤   else if( secret )
bcf776 ¤   ¤   ¤   {
f835aa ¤   ¤   ¤   ¤   if( algorithm == kPGPPublicKeyAlgorithm_DSA )
2a0722 ¤   ¤   ¤   ¤   ¤   strIndex = kDHDSSKeyPairDescriptionID;
1bfa07 ¤   ¤   ¤   ¤   else
79fa87 ¤   ¤   ¤   ¤   ¤   strIndex = kRSAKeyPairDescriptionID;
ffa3a6 ¤   ¤   ¤   }
c7bb8c ¤   ¤   ¤   else
15f776 ¤   ¤   ¤   {
--8642 000ea11393c401201b3 Page 19 of CKeyTable.cp
ee35aa ¤   ¤   ¤   ¤   if( algorithm == kPGPPublicKeyAlgorithm_DSA )
77c6ee ¤   ¤   ¤   ¤   ¤   strIndex = kDHDSSKeyDescriptionID;
f1fa07 ¤   ¤   ¤   ¤   else
071935 ¤   ¤   ¤   ¤   ¤   strIndex = kRSAKeyDescriptionID;
86a3a6 ¤   ¤   ¤   }
a0cdcb ¤   ¤   ¤   break;
e00fe4 ¤   ¤   }
fc39de ¤   ¤   case kUserID:
add359 ¤   ¤   ¤   strIndex = kUserIDDescriptionID;
c4cdcb ¤   ¤   ¤   break;
75a588 ¤   ¤   case kSignature:
8a6f3b ¤   ¤   ¤   PGPGetSigNumber( ktr->u.sig, kPGPSigPropAlgID, &algorithm );
b3d7aa ¤   ¤   ¤   if( algorithm == kPGPPublicKeyAlgorithm_DSA )
2c1862 ¤   ¤   ¤   ¤   strIndex = kDSSSignatureDescriptionID;
42c23f ¤   ¤   ¤   else if( algorithm == kPGPPublicKeyAlgorithm_RSA )
16be50 ¤   ¤   ¤   ¤   strIndex = kRSASignatureDescriptionID;
54bb8c ¤   ¤   ¤   else
a806c2 ¤   ¤   ¤   ¤   strIndex = kUnknownSignatureDescriptionID;
d7cdcb ¤   ¤   ¤   break;
cd9371 ¤   }
1d4b97 ¤   GetIndString( str, kKeyDescriptionsStringListID, strIndex );
fe6ef6 ¤   MoveTo(¤cellRect.left + kLeftIndent + kTextIndent,
b75f4f ¤   ¤   ¤   ¤   cellRect.bottom - kBottomBorder );
52ef37 ¤   DrawString( str );
e3efe6 }
0aaf5a
586d52 ¤   void
f53f42 CKeyTable::DrawTrust(Int32 trustValue, Rect cellRect, Int16 depth)
32bb36 {
058ff0 ¤   RGBColor¤   trustColor = { 52223, 52223, 65535 };
d51a47 ¤   Int16¤  ¤   width;
5667c5 ¤
09405c ¤   width = mColumnInfo.columnWidths[kTrustColumnID] -
c6284f ¤   ¤   ¤   ¤   kBarRightBorder - kBarLeftBorder;
5e586b ¤   cellRect.left ¤ +=¤ kBarLeftBorder;
8f3932 ¤   cellRect.right¤ = ¤ cellRect.left + width;
aa609d ¤   cellRect.bottom¤=¤  cellRect.bottom - kBottomBorder;
663f81 ¤   cellRect.top¤   =¤  cellRect.bottom - kBarHeight;
f267c5 ¤
92e710 ¤   RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
80b1ee ¤   FrameRect(&cellRect);
021010 ¤   InsetRect(&cellRect, 1, 1);
7018a3 ¤   if(trustValue >= kMaxTrust)
45c7a1 ¤   {
d7822e ¤   ¤   PenPixPat(mBarberPixPat);
035c0e ¤   ¤   PaintRect(&cellRect);
bf54f3 ¤   ¤   PenNormal();
f49371 ¤   }
1d0e24 ¤   else
fac7a1 ¤   {
619af1 ¤   ¤   if(depth >= 8)
d85b34 ¤   ¤   {
99b6d7 ¤   ¤   ¤   RGBForeColor(&trustColor);
276b06 ¤   ¤   ¤   PaintRect(&cellRect);
770fe4 ¤   ¤   }
be1b52 ¤   ¤
a63532 ¤   ¤   cellRect.right -= width * ((kMaxTrust - 1) - trustValue) /
c57368 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (kMaxTrust - 1);
5453fd ¤   ¤   RGBForeColor( &UGAColorRamp::GetColor(colorRamp_Gray9) );
665c0e ¤   ¤   PaintRect(&cellRect);
af9371 ¤   }
04c94e ¤   ApplyForeAndBackColors();
53efe6 }
8eaf5a
656d52 ¤   void
fc95db CKeyTable::DrawValidity(Int32 trustValue, Rect cellRect, Int16 depth)
bcbb36 {
c78ff0 ¤   RGBColor¤   trustColor = { 52223, 52223, 65535 };
341a47 ¤   Int16¤  ¤   width;
8b5e1d ¤   PGPBoolean¤ showMarginal;
1f61e0 ¤   PGPError¤   err;
ea67c5 ¤
--e330 00051747d14401201b3 Page 20 of CKeyTable.cp
24fcb8 ¤   err = PGPGetPrefBoolean(gPrefRef,
b40916 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDisplayMarginalValidity, &showMarginal);
f6dd44 ¤   pgpAssertNoErr(err);
181084 ¤   if(!showMarginal)
1ac7a1 ¤   {
d5e1d5 ¤   ¤   ResIDT¤ ¤   iconID;
6caf5a
ed9adc ¤   ¤   if(trustValue > kMaxValidity)
995b34 ¤   ¤   {
6c2c1c ¤   ¤   ¤   iconID = kAxiomaticIconID;
9e0fe4 ¤   ¤   }
1f7edf ¤   ¤   else if(trustValue > 1)
935b34 ¤   ¤   {
bf612b ¤   ¤   ¤   iconID = kValidKeyIconID;
8e0fe4 ¤   ¤   }
b3d001 ¤   ¤   else if(trustValue == 1)
fc5b34 ¤   ¤   {
6f3c07 ¤   ¤   ¤   PGPBoolean¤ marginalIsInvalid;
f51b52 ¤   ¤
2cf993 ¤   ¤   ¤   err = PGPGetPrefBoolean(gPrefRef,
36cb7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefMarginalIsInvalid,
076eee ¤   ¤   ¤   ¤   ¤   ¤   ¤   &marginalIsInvalid);
2f524f ¤   ¤   ¤   pgpAssertNoErr(err);
9387c7 ¤   ¤   ¤
f1b0a0 ¤   ¤   ¤   if( marginalIsInvalid )
bcf776 ¤   ¤   ¤   {
615e31 ¤   ¤   ¤   ¤   iconID = kKeyAttrOffIconID;
aca3a6 ¤   ¤   ¤   }
33bb8c ¤   ¤   ¤   else
14f776 ¤   ¤   ¤   {
055dc5 ¤   ¤   ¤   ¤   iconID = kValidKeyIconID;
90a3a6 ¤   ¤   ¤   }
fe0fe4 ¤   ¤   }
250e1d ¤   ¤   else
b65b34 ¤   ¤   {
14d657 ¤   ¤   ¤   iconID = kKeyAttrOffIconID;
7b0fe4 ¤   ¤   }
f81b52 ¤   ¤
769316 ¤   ¤   DrawIcon(iconID, cellRect, -2);
189371 ¤   }
950e24 ¤   else
32c7a1 ¤   {
1395bb ¤   ¤   width = mColumnInfo.columnWidths[kValidityColumnID] - kBarRightBorder
375de6 ¤   ¤   ¤   ¤   - kBarLeftBorder;
bed00d ¤   ¤   cellRect.left ¤ +=¤ kBarLeftBorder;
51e180 ¤   ¤   cellRect.right¤ = ¤ cellRect.left + width;
184628 ¤   ¤   cellRect.bottom¤=¤  cellRect.bottom - kBottomBorder;
0c3cf6 ¤   ¤   cellRect.top¤   =¤  cellRect.bottom - kBarHeight;
8b1b52 ¤   ¤
cd5159 ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
69e472 ¤   ¤   ::FrameRect(&cellRect);
1135c0 ¤   ¤   ::InsetRect(&cellRect, 1, 1);
129adc ¤   ¤   if(trustValue > kMaxValidity)
585b34 ¤   ¤   {
90b3d6 ¤   ¤   ¤   ::PenPixPat(mBarberPixPat);
230b3a ¤   ¤   ¤   ::PaintRect(&cellRect);
37d486 ¤   ¤   ¤   ::PenNormal();
700fe4 ¤   ¤   }
820e1d ¤   ¤   else
8a5b34 ¤   ¤   {
ed7810 ¤   ¤   ¤   if(depth >= 8)
5bf776 ¤   ¤   ¤   {
658a6a ¤   ¤   ¤   ¤   ::RGBForeColor(&trustColor);
4dce6f ¤   ¤   ¤   ¤   ::PaintRect(&cellRect);
19a3a6 ¤   ¤   ¤   }
5387c7 ¤   ¤   ¤
0dae59 ¤   ¤   ¤   cellRect.right -= width * (kMaxValidity - trustValue) /
909ef8 ¤   ¤   ¤   ¤   ¤   kMaxValidity;
af5543 ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray9));
ff0b3a ¤   ¤   ¤   ::PaintRect(&cellRect);
780fe4 ¤   ¤   }
51fe46 ¤   ¤   ApplyForeAndBackColors();
--155e 000d7a2e97e401201b3 Page 21 of CKeyTable.cp
a19371 ¤   }
c9efe6 }
a0af5a
5a6d52 ¤   void
9c3324 CKeyTable::DrawIcon(
438f44 ¤   ResIDT¤ ¤   ¤   ¤   iconID,
c52d08 ¤   Rect¤   ¤   ¤   ¤   cellRect,
9c8cb4 ¤   UInt32¤ ¤   ¤   ¤   indentLevel,
c6f3d0 ¤   IconTransformType¤  transform )
6dbb36 {
13dd82 ¤   Rect¤   ¤   ¤   ¤   iconRect;
f8af5a
8e9b86 ¤   switch(indentLevel)
fec7a1 ¤   {
72b98c ¤   ¤   case -2:
62dd60 ¤   ¤   ¤   iconRect.left ¤ = ¤ cellRect.left + 10;
57cdcb ¤   ¤   ¤   break;
ea56e8 ¤   ¤   case -1:
bdf5e3 ¤   ¤   ¤   iconRect.left ¤ = ¤ cellRect.left + kLeftIndent;
40cdcb ¤   ¤   ¤   break;
47e2df ¤   ¤   case 0:
b83c54 ¤   ¤   ¤   iconRect.left ¤ = ¤ cellRect.left + kDropFlagSlop;
90cdcb ¤   ¤   ¤   break;
e0b803 ¤   ¤   case 1:
dee687 ¤   ¤   ¤   iconRect.left ¤ = ¤ cellRect.left + kDropFlagSlop + kLeftIndent;
69cdcb ¤   ¤   ¤   break;
b75767 ¤   ¤   case 2:
54a1f1 ¤   ¤   ¤   iconRect.left ¤ = ¤ cellRect.left + kDropFlagSlop + kLeftIndent
b355f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   + kLevelIndent;
1dcdcb ¤   ¤   ¤   break;
c80dbb ¤   ¤   case 3:
91a1f1 ¤   ¤   ¤   iconRect.left ¤ = ¤ cellRect.left + kDropFlagSlop + kLeftIndent
0eba12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   + kLevelIndent * 2;
16cdcb ¤   ¤   ¤   break;
3c9ae3 ¤   ¤   default:
e1b783 ¤   ¤   ¤   pgpAssert(0);
e0cdcb ¤   ¤   ¤   break;
539371 ¤   }
0e87c7 ¤   ¤   ¤
5bd028 ¤   iconRect.top¤   =¤  cellRect.top + 1;
098ef2 ¤   iconRect.right ¤= ¤ iconRect.left + 16;//kIconWidth;
037874 ¤   iconRect.bottom = ¤ iconRect.top + 16;//kIconHeight;
cc67c5 ¤
eccd73 ¤   PlotIconID(&iconRect, kAlignNone, transform, iconID);
eaefe6 }
5eaf5a
2b6d52 ¤   void
310b89 CKeyTable::RedrawTable()
a8bb36 {
3dd8a7 ¤   Rect frame;
3c67c5 ¤
24d986 ¤   CalcPortFrameRect(frame);
c89033 ¤   InvalPortRect(&frame);
f3efe6 }
daaf5a
936d52 ¤   void
fa7f32 CKeyTable::HiliteCellActively(
4f1bb3 ¤   const STableCell¤   &inCell,
64d5f2 ¤   Boolean¤¤   ¤   ¤   inHilite )
95bb36 {
5311e8 ¤   StColorPenState¤saveColorPen;
87b572 ¤   Rect¤   ¤   ¤   cellFrame,
001cc3 ¤   ¤   ¤   ¤   ¤   insideFrame;
3267c5 ¤
32262e ¤   if( inCell.col != 1 )
1a99bf ¤   ¤   return;
d1b3ff ¤   if( GetLocalCellRect(inCell, cellFrame) && FocusExposed() )
bdc7a1 ¤   {
2e973f ¤   ¤   insideFrame = cellFrame;
439b82 ¤   ¤   insideFrame.bottom--;
5c2fdc ¤   ¤   TextFont( kFontIDGeneva );
d78a20 ¤   ¤   TextSize( 9 );
--e086 00097ae37c9401201b3 Page 22 of CKeyTable.cp
1a054f ¤   ¤   TextFace( 0 );
d2b139 ¤   ¤   TextMode( srcOr );
6eada2 ¤   ¤   if( !inHilite )
835b34 ¤   ¤   {
899721 ¤   ¤   ¤   StDeviceLoop¤   devLoop(insideFrame);¤  ¤
7bfbd2 ¤   ¤   ¤   SInt16¤ ¤   ¤   depth;
79af5a
7363f0 ¤   ¤   ¤   while(devLoop.NextDepth(depth))
1ef776 ¤   ¤   ¤   {
49187b ¤   ¤   ¤   ¤   SetThemeBackground( kThemeListViewSortColumnBackgroundBrush,
308d2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   depth, ( depth > 1 ) );
f852eb ¤   ¤   ¤   ¤   EraseRect( &insideFrame );
99a3a6 ¤   ¤   ¤   }
e30fe4 ¤   ¤   }
b06952 ¤   ¤   DrawCell1( inCell, cellFrame, inHilite, false );
a29371 ¤   }
a3efe6 }
c9af5a
9c6d52 ¤   void
bb424c CKeyTable::HiliteCellInactively(
ce1bb3 ¤   const STableCell¤   &inCell,
40da0f ¤   Boolean¤¤   ¤   ·¤  inHilite )
98bb36 {
d411e8 ¤   StColorPenState¤saveColorPen;
3cb572 ¤   Rect¤   ¤   ¤   cellFrame,
ed1cc3 ¤   ¤   ¤   ¤   ¤   insideFrame;
b667c5 ¤
7d262e ¤   if( inCell.col != 1 )
f999bf ¤   ¤   return;
91b3ff ¤   if( GetLocalCellRect(inCell, cellFrame) && FocusExposed() )
eec7a1 ¤   {
e2973f ¤   ¤   insideFrame = cellFrame;
eb9b82 ¤   ¤   insideFrame.bottom--;
122fdc ¤   ¤   TextFont( kFontIDGeneva );
3d8a20 ¤   ¤   TextSize( 9 );
21054f ¤   ¤   TextFace( 0 );
a4b139 ¤   ¤   TextMode( srcOr );
22ada2 ¤   ¤   if( !inHilite )
695b34 ¤   ¤   {
fc9721 ¤   ¤   ¤   StDeviceLoop¤   devLoop(insideFrame);¤  ¤
40fbd2 ¤   ¤   ¤   SInt16¤ ¤   ¤   depth;
41af5a
fc63f0 ¤   ¤   ¤   while(devLoop.NextDepth(depth))
c9f776 ¤   ¤   ¤   {
bb187b ¤   ¤   ¤   ¤   SetThemeBackground( kThemeListViewSortColumnBackgroundBrush,
5d8d2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   depth, ( depth > 1 ) );
b552eb ¤   ¤   ¤   ¤   EraseRect( &insideFrame );
a6a3a6 ¤   ¤   ¤   }
430fe4 ¤   ¤   }
bfc3be ¤   ¤   DrawCell1( inCell, cellFrame, inHilite, true );
1d9371 ¤   }
00efe6 }
f8af5a
e33634 #pragma mark --- Table Management ---
a0af5a
b56d52 ¤   void
22b8e8 CKeyTable::UnmarkKey(PGPKeyRef inKey)
31bb36 {
7b1502 ¤   PGPKeyRef¤  ¤   key;
270fee ¤   PGPUserIDRef¤   user;
42fd43 ¤   PGPSigRef¤  ¤   sig;
82fb19 ¤   PGPError¤   ¤   err;
44af5a
fdd209 ¤   PGPKeyIterRewind(mKeyIter);
8bda32 ¤   while(IsntPGPError(err = PGPKeyIterNext(mKeyIter, &key)) && IsntNull(key))
c9c7a1 ¤   {
8db151 ¤   ¤   if(key == inKey)
205b34 ¤   ¤   {
45f532 ¤   ¤   ¤   err = PGPSetKeyUserVal(key, kUserValueUnmarked);
8ec079 ¤   ¤   ¤   pgpAssert(!err);
e9fb6a ¤   ¤   ¤   while(IsntPGPError(err = PGPKeyIterNextUserID(mKeyIter, &user)) &&
97ad32 ¤   ¤   ¤   ¤   ¤   IsntNull(user))
--4e48 00015407b5c401201b3 Page 23 of CKeyTable.cp
99f776 ¤   ¤   ¤   {
6d4591 ¤   ¤   ¤   ¤   err = PGPSetUserIDUserVal(user, kUserValueUnmarked);
b77b2f ¤   ¤   ¤   ¤   pgpAssert(!err);
bf57ca ¤   ¤   ¤   ¤   while(IsntPGPError(
915605 ¤   ¤   ¤   ¤   ¤   err = PGPKeyIterNextUIDSig(mKeyIter, &sig)) &&
92189a ¤   ¤   ¤   ¤   ¤   IsntNull(sig))
ea72c3 ¤   ¤   ¤   ¤   {
d885c5 ¤   ¤   ¤   ¤   ¤   err = PGPSetSigUserVal(sig, kUserValueUnmarked);
fb4647 ¤   ¤   ¤   ¤   ¤   pgpAssert(!err);
f02613 ¤   ¤   ¤   ¤   }
53a3a6 ¤   ¤   ¤   }
f5cdcb ¤   ¤   ¤   break;
cc0fe4 ¤   ¤   }
209371 ¤   }
06efe6 }
c3af5a
7a6d52 ¤   void
0c85e0 CKeyTable::RemoveKeyFromTable(PGPKeyRef inKey)
f8bb36 {
ae948c ¤   KeyTableRef¤¤   tableRef;
1044a1 ¤   STableCell¤ ¤   cell(1,1);
ff4199 ¤   TableIndexT¤¤   rows,
5e4c6b ¤   ¤   ¤   ¤   ¤   cols,
a3412d ¤   ¤   ¤   ¤   ¤   rowIndex;
482eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
2b67c5 ¤
3f2be0 ¤   GetWideOpenTableSize(rows, cols);
04d454 ¤   for(rowIndex = 1;rowIndex < rows;rowIndex++)
4dc7a1 ¤   {
94c81e ¤   ¤   cell.row = rowIndex;
e40afe ¤   ¤   GetCellData(cell, &tableRef, dataSize);
631e9c ¤   ¤   if((tableRef.type == kKey) && (tableRef.u.key == inKey))
3c5b34 ¤   ¤   {
af4eff ¤   ¤   ¤   RemoveRows(1, rowIndex, true);
d0cdcb ¤   ¤   ¤   break;
d60fe4 ¤   ¤   }
c49371 ¤   }
b1efe6 }
b1af5a
426d52 ¤   void
6705d2 CKeyTable::TerminateKey(PGPKeyRef inKey)
2fbb36 {
c3948c ¤   KeyTableRef¤¤   tableRef;
bc44a1 ¤   STableCell¤ ¤   cell(1,1);
3e4199 ¤   TableIndexT¤¤   rows,
954c6b ¤   ¤   ¤   ¤   ¤   cols,
99412d ¤   ¤   ¤   ¤   ¤   rowIndex;
0f2eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
0067c5 ¤
ab2be0 ¤   GetWideOpenTableSize(rows, cols);
2dd454 ¤   for(rowIndex = 1;rowIndex < rows;rowIndex++)
38c7a1 ¤   {
0cc81e ¤   ¤   cell.row = rowIndex;
c50afe ¤   ¤   GetCellData(cell, &tableRef, dataSize);
611e9c ¤   ¤   if((tableRef.type == kKey) && (tableRef.u.key == inKey))
655b34 ¤   ¤   {
3bbf37 ¤   ¤   ¤   tableRef.terminated = TRUE;
9147f7 ¤   ¤   ¤   SetCellData(cell, &tableRef, dataSize);
38cdcb ¤   ¤   ¤   break;
db0fe4 ¤   ¤   }
239371 ¤   }
16efe6 }
cbaf5a
496d52 ¤   void
c7ca3f CKeyTable::RemoveTerminatedKeys()
99bb36 {
d9948c ¤   KeyTableRef¤¤   tableRef;
8d44a1 ¤   STableCell¤ ¤   cell(1,1);
594199 ¤   TableIndexT¤¤   rows,
a94c6b ¤   ¤   ¤   ¤   ¤   cols,
b5412d ¤   ¤   ¤   ¤   ¤   rowIndex;
152eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
--66b1 000b06fb2ff401201b3 Page 24 of CKeyTable.cp
2a67c5 ¤
782be0 ¤   GetWideOpenTableSize(rows, cols);
cfc1a5 ¤   for(rowIndex = rows;rowIndex > 0;rowIndex--)
38c7a1 ¤   {
06c81e ¤   ¤   cell.row = rowIndex;
7e0afe ¤   ¤   GetCellData(cell, &tableRef, dataSize);
ce43ec ¤   ¤   if((tableRef.type == kKey) && tableRef.terminated)
c44eff ¤   ¤   ¤   RemoveRows(1, rowIndex, true);
0e9371 ¤   }
b9efe6 }
44af5a
e06d52 ¤   void
d2a66b CKeyTable::ClearTable()
5dbb36 {
2467d2 ¤   RemoveAllRows(false);
63efe6 }
77af5a
db38e5 /*
1f4252 ResyncTable
f3af5a
9a47c2 This is a meaty function. ·It runs through the KeyDB list of keys and checks
beb792 each key, userID, and signature to see whether its userVal has been set to
e272a0 non-zero. ·If it hasn't, then the function assumes that entry is not yet in
1909b5 the table and adds it. ·It also sets its userVal to 1 so that it wont be
f5e1b0 added again later. ·This function is used in many places, for example when
a3c4eb signing key(s), this function is called to merge all the new signature(s)
a9ffff into the displayed list.
16af5a
f96aef Returns TRUE if at least one key pair was found while iterating over the
e2e146 list
fd7fe0 */
e6af5a
8b7e69 ¤   Boolean
87131d CKeyTable::ResyncTable(Boolean collapse, Boolean onlyUnmarked)
74bb36 {
6a72fa ¤   PGPKeyRef ¤ ¤   key;
230fee ¤   PGPUserIDRef¤   user;
8cfd43 ¤   PGPSigRef¤  ¤   sig;
83fb19 ¤   PGPError¤   ¤   err;
fd948c ¤   KeyTableRef¤¤   tableRef;
a2b42d ¤   Int32¤  ¤   ¤   userVal;
ed46d6 ¤   TableIndexT¤¤   uidSubRow,
75158a ¤   ¤   ¤   ¤   ¤   sigSubRow,
ed38ac ¤   ¤   ¤   ¤   ¤   lastKeyRow,
88a791 ¤   ¤   ¤   ¤   ¤   lastRow;
1f6641 ¤   Int16¤  ¤   ¤   uidIndex,
9a926d ¤   ¤   ¤   ¤   ¤   sigIndex;
91ae51 ¤   Boolean¤¤   ¤   pairFound = FALSE;
b05dd9 ¤   PGPBoolean¤ ¤   secret;
c467c5 ¤
73b58a ¤   lastRow = lastKeyRow = 0;
734f56 ¤   if(mDefaultRing)
c0c7a1 ¤   {
6a0a5c ¤   ¤   PGPGetDefaultPrivateKey(mKeySet, &mDefaultKey);
419371 ¤   }
f2d209 ¤   PGPKeyIterRewind(mKeyIter);
10da32 ¤   while(IsntPGPError(err = PGPKeyIterNext(mKeyIter, &key)) && IsntNull(key))
fec7a1 ¤   {
d46525 ¤   ¤   err = PGPGetKeyBoolean(key, kPGPKeyPropIsSecret, &secret);
03f424 ¤   ¤   pgpAssert(!err);
064901 ¤   ¤   if(secret)
a78550 ¤   ¤   ¤   pairFound = TRUE;
cdc2ce ¤   ¤   err = PGPGetKeyUserVal(key, (PGPUserValue *)&userVal);
57f424 ¤   ¤   pgpAssert(!err);
1f4441 ¤   ¤   ++lastRow;
552bef ¤   ¤   if(userVal != kUserValueMarked || !onlyUnmarked)
ef5b34 ¤   ¤   {
50ccf8 ¤   ¤   ¤   tableRef.type¤  ¤   =¤  kKey;
36d851 ¤   ¤   ¤   tableRef.ownerKey¤  =¤  key;
d33590 ¤   ¤   ¤   tableRef.terminated =¤  FALSE;
cab120 ¤   ¤   ¤   tableRef.u.key¤ ¤   =¤  key;
b0f850 ¤   ¤   ¤   lastKeyRow = InsertSiblingRows(1, lastKeyRow, &tableRef,
--d521 00036d63a73401201b3 Page 25 of CKeyTable.cp
b722ac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(KeyTableRef), TRUE, TRUE);
3bc9ea ¤   ¤   ¤   err = PGPSetKeyUserVal(key, (PGPUserValue)kUserValueMarked);
ce524f ¤   ¤   ¤   pgpAssertNoErr(err);
c10fe4 ¤   ¤   }
0e729d ¤   ¤   else if(!lastKeyRow)
03284f ¤   ¤   ¤   lastKeyRow = 1;
7cef68 ¤   ¤   if(lastRow > 1)
7a3534 ¤   ¤   ¤   lastKeyRow = lastRow;
e05b4e ¤   ¤   for(uidIndex = 1;IsntPGPError(err = PGPKeyIterNextUserID(mKeyIter,
b35357 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &user)) && IsntNull(user);uidIndex++)
4d5b34 ¤   ¤   {
415bf9 ¤   ¤   ¤   err = PGPKeyIterNextUIDSig(mKeyIter, &sig);
cc9a4f ¤   ¤   ¤   err = PGPGetUserIDUserVal(user, (PGPUserValue *)&userVal);
05c079 ¤   ¤   ¤   pgpAssert(!err);
877fa8 ¤   ¤   ¤   ++lastRow;
730d5a ¤   ¤   ¤   if(userVal != kUserValueMarked || !onlyUnmarked)
aff776 ¤   ¤   ¤   {
25b52f ¤   ¤   ¤   ¤   tableRef.type¤  ¤   =¤  kUserID;
15a408 ¤   ¤   ¤   ¤   tableRef.terminated =¤  FALSE;
33dee9 ¤   ¤   ¤   ¤   tableRef.ownerKey¤  =¤  key;
9393bb ¤   ¤   ¤   ¤   tableRef.u.user¤¤   =¤  user;
32c2b0 ¤   ¤   ¤   ¤   if(uidIndex == 1)¤  // First user ID
fe72c3 ¤   ¤   ¤   ¤   {
65a0a3 ¤   ¤   ¤   ¤   ¤   InsertChildRows(1, lastKeyRow, &tableRef,
b1341a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(KeyTableRef), TRUE, TRUE);
a3a8b9 ¤   ¤   ¤   ¤   ¤   uidSubRow = lastKeyRow + 1;
992613 ¤   ¤   ¤   ¤   }
2ffa07 ¤   ¤   ¤   ¤   else
b0065d ¤   ¤   ¤   ¤   ¤   uidSubRow = InsertSiblingRows(1, uidSubRow, &tableRef,
06341a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(KeyTableRef), TRUE, TRUE);
ba510b ¤   ¤   ¤   ¤   err = PGPSetUserIDUserVal(user,
0d661a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPUserValue)kUserValueMarked);
fc7b2f ¤   ¤   ¤   ¤   pgpAssert(!err);
27a3a6 ¤   ¤   ¤   }
d9bb8c ¤   ¤   ¤   else
a6f776 ¤   ¤   ¤   {
7a8d5d ¤   ¤   ¤   ¤   if(uidIndex == 1)
b9a8b9 ¤   ¤   ¤   ¤   ¤   uidSubRow = lastKeyRow + 1;
6afa07 ¤   ¤   ¤   ¤   else
3b5687 ¤   ¤   ¤   ¤   ¤   uidSubRow = lastRow;
b9a3a6 ¤   ¤   ¤   }
3877de ¤   ¤   ¤   for(sigIndex = 1; (sigIndex == 1 && IsntNull(sig)) ||
c2ca3c ¤   ¤   ¤   ¤   IsntPGPError(err = PGPKeyIterNextUIDSig(mKeyIter, &sig)) &&
4d2038 ¤   ¤   ¤   ¤   IsntNull(sig);sigIndex++)
49f776 ¤   ¤   ¤   {
815618 ¤   ¤   ¤   ¤   err = PGPGetSigUserVal(sig, (PGPUserValue *)&userVal);
757b2f ¤   ¤   ¤   ¤   pgpAssert(!err);
409d49 ¤   ¤   ¤   ¤   ++lastRow;
13d773 ¤   ¤   ¤   ¤   if(userVal != kUserValueMarked || !onlyUnmarked)
4472c3 ¤   ¤   ¤   ¤   {
e2113c ¤   ¤   ¤   ¤   ¤   tableRef.type¤  ¤   =¤  kSignature;
ed8c74 ¤   ¤   ¤   ¤   ¤   tableRef.ownerKey¤  =¤  key;
ec7cba ¤   ¤   ¤   ¤   ¤   tableRef.terminated =¤  FALSE;
380d44 ¤   ¤   ¤   ¤   ¤   tableRef.u.sig¤ ¤   =¤  sig;
722b4c ¤   ¤   ¤   ¤   ¤   if(sigIndex == 1)¤  // First signature
ab4859 ¤   ¤   ¤   ¤   ¤   {
5de7c2 ¤   ¤   ¤   ¤   ¤   ¤   InsertChildRows(1, uidSubRow, &tableRef,
fc7651 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(KeyTableRef), FALSE, TRUE);
fbf094 ¤   ¤   ¤   ¤   ¤   ¤   sigSubRow = uidSubRow + 1;
ee1c89 ¤   ¤   ¤   ¤   ¤   }
c44bd6 ¤   ¤   ¤   ¤   ¤   else
2b21d3 ¤   ¤   ¤   ¤   ¤   ¤   sigSubRow = InsertSiblingRows(1, sigSubRow,
73638a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &tableRef, sizeof(KeyTableRef),
de2c5d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FALSE, TRUE);
f07f6c ¤   ¤   ¤   ¤   ¤   err = PGPSetSigUserVal(sig,
e3fbc0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPUserValue)kUserValueMarked);
da4647 ¤   ¤   ¤   ¤   ¤   pgpAssert(!err);
d92613 ¤   ¤   ¤   ¤   }
a8fa07 ¤   ¤   ¤   ¤   else
c072c3 ¤   ¤   ¤   ¤   {
6cd434 ¤   ¤   ¤   ¤   ¤   if(sigIndex == 1)
36f094 ¤   ¤   ¤   ¤   ¤   ¤   sigSubRow = uidSubRow + 1;
--b403 00062e3a88c401201b3 Page 26 of CKeyTable.cp
f54bd6 ¤   ¤   ¤   ¤   ¤   else
ff5e9d ¤   ¤   ¤   ¤   ¤   ¤   sigSubRow = lastRow;
cd2613 ¤   ¤   ¤   ¤   }
63a3a6 ¤   ¤   ¤   }
e60fe4 ¤   ¤   }
599371 ¤   }
851351 ¤   if(collapse)
3272f7 ¤   ¤   CollapseKeys(TRUE);
9ea588 ¤   return pairFound;
00efe6 }
fbaf5a
e8c744 ¤   PGPError
9e939e CKeyTable::ReverifySigsHandler(
dd520e ¤   PGPContextRef¤  context,
006fdc ¤   PGPEvent¤   ¤   *event,
051b51 ¤   PGPUserValue¤   userValue )
dcbb36 {
ccac3e ¤   CPGPStDialogHandler¤¤   *dialog = (CPGPStDialogHandler *) userValue;
5067c5 ¤
e94e41 ¤   if( dialog->DoDialog() == msg_Cancel )
4b74be ¤   ¤   return kPGPError_UserAbort;
b10e24 ¤   else
76b840 ¤   ¤   return kPGPError_NoErr;
b9efe6 }
e8af5a
5d6d52 ¤   void
36448a CKeyTable::ReverifySigs()
7abb36 {
700774 ¤   CPGPStDialogHandler¤¤   dialogHandler( kProgressDialogResID, nil );
e685dd ¤   CGAProgressDialog *¤¤   dialogObj;
459ca3 ¤   Str255¤ ¤   ¤   ¤   ¤   pstr;
6c3cbe ¤   PGPError¤   ¤   ¤   ¤   err = kPGPError_NoErr;
97ad37 ¤   PGPKeySetRef¤   ¤   ¤   checkKeys = kInvalidPGPKeySetRef,
7db054 ¤   ¤   ¤   ¤   ¤   ¤   ¤   singleKeySet = kInvalidPGPKeySetRef;
582c20 ¤   PGPUInt32¤  ¤   ¤   ¤   numKeys;
2536d0 ¤   TableIndexT¤¤   ¤   ¤   numRows, numCols;
5f1b52 ¤   ¤
16a737 ¤   dialogObj = (CGAProgressDialog *) dialogHandler.GetDialog();
167ffa ¤   GetIndString( pstr, kStringListID, kVerifyingSignaturesID );
9c9b15 ¤   dialogObj->SetCaption( pstr );
55402f ¤   dialogObj->SetIndeterminateFlag( TRUE );
e4e395 ¤   dialogObj->Show();
2967c5 ¤
f7f621 ¤   GetTableSize(numRows, numCols);
306b4f ¤   STableCell¤ topCell(1, 1);
8e881e ¤   STableCell ¤botCell(numRows, 1);
f39b43 ¤   STableCell¤ cell;¤  ¤   ¤   ¤   // Loop thru all cells
52af5a
e3bf44 ¤   err = PGPNewEmptyKeySet(mKeySet, &checkKeys);
cc7f7d ¤   if( IsPGPError( err ) )
06262d ¤   ¤   goto done;
812c8c ¤   for(cell = botCell; cell.row >= topCell.row; cell.row--)·
0fc7a1 ¤   {
c4c85e ¤   ¤   if(CellIsSelected(cell))·
475b34 ¤   ¤   {
ac1758 ¤   ¤   ¤   TableIndexT¤¤   inWideOpenRow =
65027e ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(cell.row);
7085ac ¤   ¤   ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
97cece ¤   ¤   ¤   KeyTableRef¤¤   keyRef;
baba53 ¤   ¤   ¤   PGPKeySetRef¤   oldKeys = checkKeys;
f1f457 ¤   ¤   ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
93814f ¤   ¤   ¤   PGPKeySetRef¤   singleKeySet;
cb87c7 ¤   ¤   ¤
d792cd ¤   ¤   ¤   GetCellData(woCell, &keyRef, dataSize);
318240 ¤   ¤   ¤   err = PGPNewSingletonKeySet(keyRef.ownerKey, &singleKeySet);
2859df ¤   ¤   ¤   if( IsPGPError( err ) )
16ff25 ¤   ¤   ¤   ¤   goto done;
36f1b8 ¤   ¤   ¤   err = PGPUnionKeySets(oldKeys, singleKeySet, &checkKeys);
6259df ¤   ¤   ¤   if( IsPGPError( err ) )
10ff25 ¤   ¤   ¤   ¤   goto done;
1c5b55 ¤   ¤   ¤   PGPFreeKeySet( oldKeys );
62d7e8 ¤   ¤   ¤   PGPFreeKeySet( singleKeySet );
--ba4e 0008f200e63401201b3 Page 27 of CKeyTable.cp
2870e0 ¤   ¤   ¤   singleKeySet = kInvalidPGPKeySetRef;
96dae0 ¤   ¤   ¤   if( dialogHandler.DoDialog() == msg_Cancel )
71f776 ¤   ¤   ¤   {
744067 ¤   ¤   ¤   ¤   err = kPGPError_UserAbort;
09ff25 ¤   ¤   ¤   ¤   goto done;
1aa3a6 ¤   ¤   ¤   }
5a0fe4 ¤   ¤   }
059371 ¤   }
5ba55b ¤   PGPCountKeys( checkKeys, &numKeys );
35a952 ¤   if( numKeys > 0 )
1ac7a1 ¤   {
f40d03 ¤   ¤   err = PGPCheckKeyRingSigs( checkKeys, CPGPKeys::TheApp()->GetKeySet(),
59a562 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TRUE, ReverifySigsHandler, &dialogHandler );
68d223 ¤   ¤   if( IsPGPError( err ) )
441dc4 ¤   ¤   ¤   goto done;
f8ff84 ¤   ¤   RedrawTable();
2a9371 ¤   }
70b38c done:
0d3be0 ¤   if( PGPKeySetRefIsValid( checkKeys ) )
78b4be ¤   ¤   PGPFreeKeySet( checkKeys );
455af5 ¤   if( PGPKeySetRefIsValid( singleKeySet ) )
35d9a4 ¤   ¤   PGPFreeKeySet( singleKeySet );
76dbb4 ¤   if( IsPGPError( err ) && err != kPGPError_UserAbort )
ba3822 ¤   ¤   ReportPGPError( err );
65efe6 }
64af5a
166d52 ¤   void
7346ab CKeyTable::Sign()
2bbb36 {
0020f6 ¤   TableIndexT¤¤   numRows, numCols;
21fb19 ¤   PGPError¤   ¤   err;
0a4fdc ¤   KeyTableRef¤¤   *userIDs;
d8a782 ¤   Int32¤  ¤   ¤   numUserIDs;
0a8fa0 ¤   PGPBoolean¤ ¤   ksSync;
9c1b52 ¤   ¤
f7f621 ¤   GetTableSize(numRows, numCols);
d96b4f ¤   STableCell¤ topCell(1, 1);
e1881e ¤   STableCell ¤botCell(numRows, 1);
569b43 ¤   STableCell¤ cell;¤  ¤   ¤   ¤   // Loop thru all cells
be67c5 ¤
1dfcb8 ¤   err = PGPGetPrefBoolean(gPrefRef,
1de485 ¤   ¤   ¤   ¤   kPGPPrefKeyServerSyncOnKeySign, &ksSync);
5ddd44 ¤   pgpAssertNoErr(err);
a4e6cd ¤   numUserIDs = 0;
2a0a25 ¤   userIDs = (KeyTableRef¤ *)pgpAlloc(sizeof(KeyTableRef));
732c8c ¤   for(cell = botCell; cell.row >= topCell.row; cell.row--)·
53c7a1 ¤   {
c9c85e ¤   ¤   if(CellIsSelected(cell))·
a95b34 ¤   ¤   {
ec1758 ¤   ¤   ¤   TableIndexT¤¤   inWideOpenRow =
6f027e ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(cell.row);
5185ac ¤   ¤   ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
fbcece ¤   ¤   ¤   KeyTableRef¤¤   keyRef;
f1f457 ¤   ¤   ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
2587c7 ¤   ¤   ¤
7e92cd ¤   ¤   ¤   GetCellData(woCell, &keyRef, dataSize);
5f6cce ¤   ¤   ¤   if(keyRef.type == kSignature)
85d040 ¤   ¤   ¤   ¤   continue;
614292 ¤   ¤   ¤   err = pgpRealloc(¤  &userIDs,
74fea9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (numUserIDs + 1) * sizeof(KeyTableRef));
7a524f ¤   ¤   ¤   pgpAssertNoErr(err);
2c768c ¤   ¤   ¤   if(IsntPGPError(err))
bcf776 ¤   ¤   ¤   {
fe2e01 ¤   ¤   ¤   ¤   userIDs[numUserIDs] = keyRef;
5163e4 ¤   ¤   ¤   ¤   numUserIDs ++;
ab4270 ¤   ¤   ¤   ¤   if(ksSync)
3e540b ¤   ¤   ¤   ¤   ¤   GetCellOnServer(cell);
78a3a6 ¤   ¤   ¤   }
8b0fe4 ¤   ¤   }
4b9371 ¤   }
566c12 ¤   if(numUserIDs > 0)
8fc7a1 ¤   {
--ebe1 0007ede7372401201b3 Page 28 of CKeyTable.cp
54880d ¤   ¤   CSignDialog *mSignDialog;
fe1b52 ¤   ¤
bfceba ¤   ¤   mSignDialog = (CSignDialog *)
5b3697 ¤   ¤   ¤   LWindow::CreateWindow(kSignDialogResID, CPGPKeys::TheApp());
b16f91 ¤   ¤   mSignDialog->AddListener(this);
ccc332 ¤   ¤   mSignDialog->SetUserIDs(mDefaultKey, userIDs, numUserIDs);
6c9b78 ¤   ¤   if(ksSync)
765b34 ¤   ¤   {
6c6d39 ¤   ¤   ¤   ResyncTable(FALSE, TRUE);
721d65 ¤   ¤   ¤   RedrawTable();
030fe4 ¤   ¤   }
259371 ¤   }
ff0e24 ¤   else
34a4e3 ¤   ¤   pgpFree(userIDs);
d0efe6 }
fdaf5a
9a7e69 ¤   Boolean
8f2a10 CKeyTable::Delete(STableCell& inCell)
f3bb36 {
2e5a6b ¤   TableIndexT¤¤   inWideOpenRow =
a772b9 ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(inCell.row);
7c6493 ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
60e86c ¤   KeyTableRef¤¤   keyRef;
f92eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
e2f762 ¤   Boolean¤¤   ¤   result = TRUE;
2cfb19 ¤   PGPError¤   ¤   err;
1a67c5 ¤
691cdc ¤   GetCellData(woCell, &keyRef, dataSize);
48af5a
8c168c ¤   switch(keyRef.type)
eec7a1 ¤   {
b9bf41 ¤   ¤   case kKey:
265b34 ¤   ¤   {
e1694a ¤   ¤   ¤   PGPKeySetRef¤   ¤   singleKeySet;
d087c7 ¤   ¤   ¤
fc8a51 ¤   ¤   ¤   err = PGPNewSingletonKeySet(keyRef.u.key, &singleKeySet);
aa9d48 ¤   ¤   ¤   if(IsntPGPError(err) && IsntNull(singleKeySet))
e1f776 ¤   ¤   ¤   {
22125a ¤   ¤   ¤   ¤   err = PGPRemoveKeys( singleKeySet, mKeySet );
a26f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
4622eb ¤   ¤   ¤   ¤   PGPFreeKeySet(singleKeySet);
8e99ff ¤   ¤   ¤   ¤   if(IsntPGPError(err))
6572c3 ¤   ¤   ¤   ¤   {
82b9cb ¤   ¤   ¤   ¤   ¤   RemoveRows(1, inWideOpenRow, true);
b3c5df ¤   ¤   ¤   ¤   ¤   if(mDefaultKey == keyRef.u.key)
aad6ce ¤   ¤   ¤   ¤   ¤   ¤   mDefaultKey = NULL;
554ce4 ¤   ¤   ¤   ¤   ¤   if(mDefaultRing)
d93cda ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->InvalidateCaches();
ec2613 ¤   ¤   ¤   ¤   }
41a3a6 ¤   ¤   ¤   }
e4cdcb ¤   ¤   ¤   break;
030fe4 ¤   ¤   }
d239de ¤   ¤   case kUserID:
a69764 ¤   ¤   ¤   // This procedure could resort the table, so we need to
7f2179 ¤   ¤   ¤   // remove the whole key from the table and resync with
713aec ¤   ¤   ¤   // the sorted iterator
7787c7 ¤   ¤   ¤
dba018 ¤   ¤   ¤   UnmarkKey(keyRef.ownerKey);
9b5b04 ¤   ¤   ¤   TerminateKey(keyRef.ownerKey);
6087c7 ¤   ¤   ¤
b6a928 ¤   ¤   ¤   err = PGPRemoveUserID(keyRef.u.user);
6f4cf6 ¤   ¤   ¤   if(err != kPGPError_BadParams)¤ // tried to delete primary user id
0f6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
a6cdcb ¤   ¤   ¤   break;
caa588 ¤   ¤   case kSignature:
704b4a ¤   ¤   ¤   err = PGPRemoveSig(keyRef.u.sig);
16524f ¤   ¤   ¤   pgpAssertNoErr(err);
14768c ¤   ¤   ¤   if(IsntPGPError(err))
d3ec67 ¤   ¤   ¤   ¤   RemoveRows(1, inWideOpenRow, true);
c9cdcb ¤   ¤   ¤   break;
8e9371 ¤   }
7e5d73 ¤   return result;
--63e8 00087c984aa401201b3 Page 29 of CKeyTable.cp
7aefe6 }
46af5a
cf7e69 ¤   Boolean
dfeb40 CKeyTable::EnableKey(STableCell& inCell)
a6bb36 {
445a6b ¤   TableIndexT¤¤   inWideOpenRow =
3c72b9 ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(inCell.row);
2e6493 ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
9fe86c ¤   KeyTableRef¤¤   keyRef;
7c2eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
03af5a
a01cdc ¤   GetCellData(woCell, &keyRef, dataSize);
601abf ¤   if( keyRef.type == kKey )
9a4da1 ¤   ¤   PGPEnableKey( keyRef.u.key );
20c2e7 ¤   return TRUE;
dfefe6 }
f5af5a
227e69 ¤   Boolean
b62195 CKeyTable::DisableKey(STableCell& inCell)
81bb36 {
f55a6b ¤   TableIndexT¤¤   inWideOpenRow =
6472b9 ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(inCell.row);
eb6493 ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
bee86c ¤   KeyTableRef¤¤   keyRef;
f82eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
e9af5a
d01cdc ¤   GetCellData(woCell, &keyRef, dataSize);
9e1abf ¤   if( keyRef.type == kKey )
8138ec ¤   ¤   PGPDisableKey( keyRef.u.key );
53c2e7 ¤   return TRUE;
35efe6 }
daaf5a
0c7e69 ¤   Boolean
74187d CKeyTable::ShowKeyInfo(STableCell& inCell)
c7bb36 {
f05a6b ¤   TableIndexT¤¤   inWideOpenRow =
d772b9 ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(inCell.row);
666493 ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
54e86c ¤   KeyTableRef¤¤   keyRef;
08fb19 ¤   PGPError¤   ¤   err;
80aeb1 ¤   PGPKeyRef¤  ¤   certifierKey;
612eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
50f762 ¤   Boolean¤¤   ¤   result = TRUE;
fe67c5 ¤
571cdc ¤   GetCellData(woCell, &keyRef, dataSize);
f9dcb3 ¤   if(keyRef.type == kKey)
52c7a1 ¤   {
7555b0 ¤   ¤   if(!CKeyInfoWindow::OpenKeyInfo(keyRef.u.key, this))
9c4ebc ¤   ¤   ¤   result = FALSE;¤// Too many key windows, break out
bf9371 ¤   }
422e7f ¤   else if(keyRef.type == kUserID)
49c7a1 ¤   {
949f05 ¤   ¤   if(!CKeyInfoWindow::OpenKeyInfo(keyRef.ownerKey, this))
c74ebc ¤   ¤   ¤   result = FALSE;¤// Too many key windows, break out
8a9371 ¤   }
353e6f ¤   else if(keyRef.type == kSignature)
03c7a1 ¤   {
ccfaea ¤   ¤   CKeyTable¤  *parentTable = this;
4e1b52 ¤   ¤
4e6e37 ¤   ¤   err = PGPGetSigCertifierKey(keyRef.u.sig, mKeySet, &certifierKey);
7baba0 ¤   ¤   if(!mDefaultRing && IsPGPError(err))
1c5b34 ¤   ¤   {
62a860 ¤   ¤   ¤   err = PGPGetSigCertifierKey(keyRef.u.sig,·
15f816 ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet(),
173f93 ¤   ¤   ¤   ¤   ¤   &certifierKey);
ac768c ¤   ¤   ¤   if(IsntPGPError(err))
4fe718 ¤   ¤   ¤   ¤   parentTable =
db43e0 ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetDefaultKeyView()->GetKeyTable();
e30fe4 ¤   ¤   }
9f7edc ¤   ¤   if(!PGPKeyRefIsValid(certifierKey))
cfb159 ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
876deb ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kCertUnavailableID);
--06b6 0002af87981401201b3 Page 30 of CKeyTable.cp
b6cab8 ¤   ¤   else if(!err && !CKeyInfoWindow::OpenKeyInfo(certifierKey, parentTable))
5a4ebc ¤   ¤   ¤   result = FALSE;¤// Too many key windows, break out
5e9371 ¤   }
8a67c5 ¤
035d73 ¤   return result;
71efe6 }
85af5a
c07e69 ¤   Boolean
c8c428 CKeyTable::Revoke(STableCell& inCell)
f7bb36 {
f37d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
9fedb5 ¤   TableIndexT¤¤   ¤   inWideOpenRow =
d069b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(inCell.row);
e81e26 ¤   STableCell¤ ¤   ¤   woCell(inWideOpenRow, 1);
daa164 ¤   KeyTableRef¤¤   ¤   keyRef;
d9038b ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof(KeyTableRef);
a4ae3b ¤   CSecureCString256¤  passphrase;
8e0c4e ¤   PGPByte¤¤   ¤   ¤   *passKey = NULL;
4bb11f ¤   PGPSize¤¤   ¤   ¤   passKeySize;
b0dd56 ¤   Boolean¤¤   ¤   ¤   result = TRUE;
ebd33c ¤   PGPBoolean¤ ¤   ¤   ksSync,
b07af7 ¤   ¤   ¤   ¤   ¤   ¤   secret,
08627b ¤   ¤   ¤   ¤   ¤   ¤   split = FALSE;
db9bb0 ¤   PGPKeyRef¤  ¤   ¤   revokerKey = kInvalidPGPKeyRef;
ea67c5 ¤
1bfcb8 ¤   err = PGPGetPrefBoolean(gPrefRef,
c7af4f ¤   ¤   ¤   ¤   kPGPPrefKeyServerSyncOnRevocation, &ksSync);¤   CKERR;
dd1cdc ¤   GetCellData(woCell, &keyRef, dataSize);
4edcb3 ¤   if(keyRef.type == kKey)
8ac7a1 ¤   {
0228fb ¤   ¤   if(CWarningAlert::Display(kWACautionAlertType, kWAOKCancelStyle,
054610 ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kRevokeConfirmID) == msg_OK)
db5b34 ¤   ¤   {
f2a091 ¤   ¤   ¤   if(ksSync)
d29ea7 ¤   ¤   ¤   ¤   GetCellOnServer(inCell);
b487c7 ¤   ¤   ¤
f24ed2 ¤   ¤   ¤   PGPGetKeyBoolean( keyRef.u.key, kPGPKeyPropIsSecret, &secret );
917866 ¤   ¤   ¤   if( secret )
80c1cf ¤   ¤   ¤   ¤   revokerKey = keyRef.u.key;
1dbb8c ¤   ¤   ¤   else
2cf776 ¤   ¤   ¤   {
68b361 ¤   ¤   ¤   ¤   PGPUInt32¤  numRevokers,
b9fcd9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   revIndex;
a968a2 ¤   ¤   ¤   ¤   PGPBoolean¤ revSecret,
0bb3e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   revSplit;
b0fb4f ¤   ¤   ¤   ¤   PGPKeyRef¤  key;
e92b85 ¤   ¤   ¤   ¤
094ede ¤   ¤   ¤   ¤   err = PGPCountRevocationKeys( keyRef.u.key, &numRevokers );
66fbc9 ¤   ¤   ¤   ¤   CKERR;
143dcc ¤   ¤   ¤   ¤   for( revIndex = 0; revIndex < numRevokers; revIndex++ )
b372c3 ¤   ¤   ¤   ¤   {
c8764f ¤   ¤   ¤   ¤   ¤   err = PGPGetIndexedRevocationKey( keyRef.u.key, mKeySet,
34b39b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   revIndex, &key, NULL ); CKERR;
5dfdce ¤   ¤   ¤   ¤   ¤   if( PGPKeyRefIsValid( key ) )
894859 ¤   ¤   ¤   ¤   ¤   {
091a26 ¤   ¤   ¤   ¤   ¤   ¤   PGPGetKeyBoolean( key, kPGPKeyPropIsSecret,
3ac36b ¤   ¤   ¤   ¤   ¤   ¤   ¤   &revSecret );
36fb30 ¤   ¤   ¤   ¤   ¤   ¤   PGPGetKeyBoolean( key, kPGPKeyPropIsSecretShared,
cff72c ¤   ¤   ¤   ¤   ¤   ¤   ¤   &revSplit );
4e5fa6 ¤   ¤   ¤   ¤   ¤   ¤   if( revSecret )
728fec ¤   ¤   ¤   ¤   ¤   ¤   {
614b01 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( !PGPKeyRefIsValid( revokerKey ) || !revSplit )
17b69f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   revokerKey = key;
cc0193 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( !revSplit )
e9cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
3bdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
ee1c89 ¤   ¤   ¤   ¤   ¤   }
262613 ¤   ¤   ¤   ¤   }
91a3a6 ¤   ¤   ¤   }
495ac1 ¤   ¤   ¤   if( PGPKeyRefIsValid( revokerKey ) )
f38127 ¤   ¤   ¤   ¤   err = GetPassForKey( revokerKey, &split, passphrase,
2a732f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passKey, &passKeySize );
--7c73 00001c8eb6a401201b3 Page 31 of CKeyTable.cp
b1bb8c ¤   ¤   ¤   else
8e2a34 ¤   ¤   ¤   ¤   err = kPGPError_ItemNotFound;
20af5a
0a698b ¤   ¤   ¤   if( IsntPGPError( err ) )
c3f776 ¤   ¤   ¤   {
8a157f ¤   ¤   ¤   ¤   /* Revoke all subkeys first */
852b85 ¤   ¤   ¤   ¤
d93e20 ¤   ¤   ¤   ¤   if( PGPKeyIterSeek( mKeyIter, keyRef.u.key ) >= 0 )
ed72c3 ¤   ¤   ¤   ¤   {
928cac ¤   ¤   ¤   ¤   ¤   PGPSubKeyRef¤   subKey;
18ae30 ¤   ¤   ¤   ¤   ¤
fd71e2 ¤   ¤   ¤   ¤   ¤   err = PGPKeyIterNextSubKey( mKeyIter, &subKey );
07db7f ¤   ¤   ¤   ¤   ¤   while( IsntPGPError( err ) )
014859 ¤   ¤   ¤   ¤   ¤   {
6c4711 ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetMinimumRandomData();
7b94aa ¤   ¤   ¤   ¤   ¤   ¤
813c54 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPRevokeSubKey( subKey, split ?
812faf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, passKey,
c2c69d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passKeySize ) :
58a1d7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, passphrase ),
d825a4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
71ae30 ¤   ¤   ¤   ¤   ¤
b0239e ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
08eb4e ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPKeyIterNextSubKey( mKeyIter, &subKey );
071c89 ¤   ¤   ¤   ¤   ¤   }
04ae30 ¤   ¤   ¤   ¤   ¤
27c797 ¤   ¤   ¤   ¤   ¤   if( err == kPGPError_EndOfIteration )
c522e3 ¤   ¤   ¤   ¤   ¤   ¤   err = kPGPError_NoErr;
b52613 ¤   ¤   ¤   ¤   }
99fa07 ¤   ¤   ¤   ¤   else
8772c3 ¤   ¤   ¤   ¤   {
7982f3 ¤   ¤   ¤   ¤   ¤   err = kPGPError_KeyInvalid;¤/* Better error? */
1d2613 ¤   ¤   ¤   ¤   }
f3a3a6 ¤   ¤   ¤   }
1987c7 ¤   ¤   ¤
f7698b ¤   ¤   ¤   if( IsntPGPError( err ) )
cef776 ¤   ¤   ¤   {
81be63 ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetMinimumRandomData();
c3a615 ¤   ¤   ¤   ¤   err = PGPRevokeKey( keyRef.u.key, split ?
a86afe ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, passKey, passKeySize ) :
33022b ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, passphrase ),
373c4e ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
c24270 ¤   ¤   ¤   ¤   if(ksSync)
5cc15f ¤   ¤   ¤   ¤   ¤   SendKeyToServer(inCell);
d5a3a6 ¤   ¤   ¤   }
9c0fe4 ¤   ¤   }
749371 ¤   }
cfbc60 ¤   else if( keyRef.type == kSignature )
6fc7a1 ¤   {
d46db1 ¤   ¤   PGPKeyRef¤  certKey;
2e1b52 ¤   ¤
1ec31b ¤   ¤   err = PGPGetSigCertifierKey( keyRef.u.sig, mKeySet, &certKey );
ea7db8 ¤   ¤   if( IsntPGPError( err ) && PGPKeyRefIsValid( certKey ) )
a75b34 ¤   ¤   {
96a091 ¤   ¤   ¤   if(ksSync)
df6821 ¤   ¤   ¤   ¤   GetKeyOnServer(certKey);
ff9618 ¤   ¤   ¤   err = GetPassForKey( certKey, &split, passphrase,
2d732f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passKey, &passKeySize );
ae698b ¤   ¤   ¤   if( IsntPGPError( err ) )
078cf3 ¤   ¤   ¤   {¤
60be63 ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetMinimumRandomData();
70c130 ¤   ¤   ¤   ¤   err = PGPRevokeSig( keyRef.u.sig, mKeySet, split ?
d36afe ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, passKey, passKeySize ) :
879dba ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, passphrase),
9f3c4e ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
2a17e5 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) && ksSync)
fc72c3 ¤   ¤   ¤   ¤   {
8274f4 ¤   ¤   ¤   ¤   ¤   err = PGPSendKeyToServer(gPGPContext, gTLSContext,
543e06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   certKey, ·NULL);
b82613 ¤   ¤   ¤   ¤   }
78a3a6 ¤   ¤   ¤   }
010fe4 ¤   ¤   }
--8233 000d47fb0ec401201b3 Page 32 of CKeyTable.cp
a19371 ¤   }
7bb38c done:
87fd05 ¤   if( err == kPGPError_ItemNotFound )
50c7a1 ¤   {
1f148d ¤   ¤   CWarningAlert::Display( kWAStopAlertType, kWAOKStyle,
ad7c03 ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kNoRevokerKeyID );
d49371 ¤   }
fa3ae5 ¤   else if( IsPGPError( err ) )
fb3822 ¤   ¤   ReportPGPError( err );
096acd ¤   if( IsntNull( passKey ) )
f34f51 ¤   ¤   PGPFreeData( passKey );
8a485f ¤   return ( err == kPGPError_NoErr );
caefe6 }
baaf5a
197e69 ¤   Boolean
4ccd2b CKeyTable::Split(STableCell& inCell)
76bb36 {
12edb5 ¤   TableIndexT¤¤   ¤   inWideOpenRow =
2969b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(inCell.row);
271e26 ¤   STableCell¤ ¤   ¤   woCell(inWideOpenRow, 1);
6ea164 ¤   KeyTableRef¤¤   ¤   keyRef;
b3038b ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof(KeyTableRef);
578f52 ¤   PGPError¤   ¤   ¤   err;
e4dd56 ¤   Boolean¤¤   ¤   ¤   result = TRUE;
4ed9dc ¤   PGPBoolean¤ ¤   ¤   secret;
3967c5 ¤
001cdc ¤   GetCellData(woCell, &keyRef, dataSize);
29dcb3 ¤   if(keyRef.type == kKey)
ecc7a1 ¤   {
c593da ¤   ¤   err = PGPGetKeyBoolean(keyRef.u.key, kPGPKeyPropIsSecret, &secret);
18e919 ¤   ¤   pgpAssertNoErr(err);
6d4901 ¤   ¤   if(secret)
175b34 ¤   ¤   {
d827b3 ¤   ¤   ¤   CSplitWindow *mSplitWindow;
a987c7 ¤   ¤   ¤
f92b12 ¤   ¤   ¤   mSplitWindow = (CSplitWindow *)
92ba6b ¤   ¤   ¤   ¤   LWindow::CreateWindow(kSplitDialogResID, this);
c53034 ¤   ¤   ¤   mSplitWindow->AddListener(this);
caea0b ¤   ¤   ¤   mSplitWindow->SetSplitKey(keyRef.u.key);
f20fe4 ¤   ¤   }
cc9371 ¤   }
1c5d73 ¤   return result;
beefe6 }
bfaf5a
877e69 ¤   Boolean
a35cf2 CKeyTable::SendKeyToServer(STableCell& inCell)
9bbb36 {
7d5a6b ¤   TableIndexT¤¤   inWideOpenRow =
e772b9 ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(inCell.row);
026493 ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
80948c ¤   KeyTableRef¤¤   tableRef;
13f94c ¤   UInt32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
6f3bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
4daf5a
4d477d ¤   GetCellData(woCell, &tableRef, dataSize);
44af5a
6a0f42 ¤   err = PGPSendKeyToServer(gPGPContext, gTLSContext, tableRef.ownerKey,
1cdbfc ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTargetKeyServer);
801dd9 ¤   if( err == kPGPError_ServerKeyFailedPolicy )
66c7a1 ¤   {
0ef33d ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
c48e1e ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kFailedServerPolicyID );
809371 ¤   }
e7ff76 ¤   else if( IsPGPError(err) && ( err != kPGPError_UserAbort ) )
b2871a ¤   ¤   ReportPGPError(err);
33af5a
e211ba ¤   return IsntPGPError(err);
00efe6 }
2eaf5a
9f7e69 ¤   Boolean
e1738b CKeyTable::GetKeyOnServer(PGPKeyRef key)
d4bb36 {
--13f9 000be589ddc401201b3 Page 33 of CKeyTable.cp
ee9e3c ¤   PGPKeySetRef¤   keySet;
9afb19 ¤   PGPError¤   ¤   err;
f4af5a
818934 ¤   err = PGPGetKeyFromServer(gPGPContext, gTLSContext, key, &keySet);
5fb635 ¤   if(IsPGPError(err) && (err != kPGPError_UserAbort))
f6871a ¤   ¤   ReportPGPError(err);
4faf5a
af59bb ¤   if(PGPKeySetRefIsValid(keySet))
92c7a1 ¤   {
c436df ¤   ¤   err = PGPAddKeys(keySet, mKeySet);
bce919 ¤   ¤   pgpAssertNoErr(err);
327b65 ¤   ¤   CommitKeySet();
8424c8 ¤   ¤   err = PGPFreeKeySet(keySet);
5de919 ¤   ¤   pgpAssertNoErr(err);
679371 ¤   }
a611ba ¤   return IsntPGPError(err);
4defe6 }
beaf5a
d07e69 ¤   Boolean
2f57d0 CKeyTable::GetCellOnServer(STableCell& inCell)
aabb36 {
b05a6b ¤   TableIndexT¤¤   inWideOpenRow =
3172b9 ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(inCell.row);
ae6493 ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
13948c ¤   KeyTableRef¤¤   tableRef;
782eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
09c0ff ¤   PGPKeyID¤   ¤   keyID;
699e3c ¤   PGPKeySetRef¤   keySet;
1b1502 ¤   PGPKeyRef¤  ¤   key;
cefb19 ¤   PGPError¤   ¤   err;
3a67c5 ¤
3c7812 ¤   keySet = NULL;
21477d ¤   GetCellData(woCell, &tableRef, dataSize);
cf2008 ¤   if(tableRef.type == kKey)
55c7a1 ¤   {
485a58 ¤   ¤   err = PGPGetKeyFromServer( gPGPContext, gTLSContext,
c144e6 ¤   ¤   ¤   ¤   ¤   tableRef.u.key, &keySet);
503962 ¤   ¤   if(IsPGPError(err) && (err != kPGPError_UserAbort))
793c4c ¤   ¤   ¤   ReportPGPError(err);
239371 ¤   }
403211 ¤   else if(tableRef.type == kSignature)
5dc7a1 ¤   {
256b13 ¤   ¤   err = PGPGetKeyIDOfCertifier(tableRef.u.sig,
8da32e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID);
d1e919 ¤   ¤   pgpAssertNoErr(err);
e1f872 ¤   ¤   if(IsntPGPError(err) )
bd5b34 ¤   ¤   {
0f359d ¤   ¤   ¤   err = PGPGetSigCertifierKey(tableRef.u.sig,
c29575 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mKeySet,
d908b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &key);
35a355 ¤   ¤   ¤   // intentionally don't report error here
fdd5ea ¤   ¤   ¤   // key may not be on the ring
31698b ¤   ¤   ¤   if( IsntPGPError( err ) )
37f776 ¤   ¤   ¤   {
0f0a34 ¤   ¤   ¤   ¤   err = PGPGetKeyFromServer( gPGPContext, gTLSContext,
eed321 ¤   ¤   ¤   ¤   ¤   ¤   ¤   key, &keySet);
60a3a6 ¤   ¤   ¤   }
8ebb8c ¤   ¤   ¤   else
06f776 ¤   ¤   ¤   {
acfb3b ¤   ¤   ¤   ¤   err = PGPGetKeyIDFromServer( gPGPContext, gTLSContext,
55d2bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID, &keySet);
d8a3a6 ¤   ¤   ¤   }
4487c7 ¤   ¤   ¤
7efd7e ¤   ¤   ¤   if(IsPGPError(err) && (err != kPGPError_UserAbort))
860124 ¤   ¤   ¤   ¤   ReportPGPError(err);
4f0fe4 ¤   ¤   }
cd9371 ¤   }
8259bb ¤   if(PGPKeySetRefIsValid(keySet))
74c7a1 ¤   {
7f36df ¤   ¤   err = PGPAddKeys(keySet, mKeySet);
08e919 ¤   ¤   pgpAssertNoErr(err);
be7b65 ¤   ¤   CommitKeySet();
--404c 000c6ed4f74401201b3 Page 34 of CKeyTable.cp
e724c8 ¤   ¤   err = PGPFreeKeySet(keySet);
91e919 ¤   ¤   pgpAssertNoErr(err);
ce9371 ¤   }
b511ba ¤   return IsntPGPError(err);
a7efe6 }
e1af5a
c6cd56 ¤   UInt32
72250c CKeyTable::SelectionAction(Boolean (CKeyTable::*function)(STableCell&))
f3cebb {¤
68d767 ¤   UInt32¤ cellsPerformedCount = 0;
bd67c5 ¤
448ec1 ¤   TableIndexT¤numRows, numCols;
17f621 ¤   GetTableSize(numRows, numCols);
6d67c5 ¤
e16b4f ¤   STableCell¤ topCell(1, 1);
d5881e ¤   STableCell ¤botCell(numRows, 1);
a09874 ¤   STableCell¤ cell;
ef67c5 ¤
1d2c8c ¤   for(cell = botCell; cell.row >= topCell.row; cell.row--)·
a1c7a1 ¤   {
3ac85e ¤   ¤   if(CellIsSelected(cell))·
365b34 ¤   ¤   {
d74289 ¤   ¤   ¤   if((this->*function)(cell) == true)
2e4595 ¤   ¤   ¤   ¤   cellsPerformedCount++;
19bb8c ¤   ¤   ¤   else
531b7c ¤   ¤   ¤   ¤   goto error;
200fe4 ¤   ¤   }
fd9371 ¤   }
7d60ff error:
36fb80 ¤   return cellsPerformedCount;
68efe6 }
8caf5a
5e6d52 ¤   void
34d87e CKeyTable::ClickCell(
41df40 ¤   const STableCell&¤  ¤   inCell,
26067a ¤   const SMouseDownEvent&¤ inMouseDown)
41bb36 {
b316d5 ¤   if(GetClickCount() == 2)
997fce ¤   ¤   SelectionAction(&CKeyTable::ShowKeyInfo);
a662b5 ¤   else if ( LDropArea::DragAndDropIsPresent() &&·
d6edab ¤   ¤   ¤   ¤   ¤   ¤   WaitMouseMoved( inMouseDown.macEvent.where ) )
f4c7a1 ¤   {
003ed3 ¤   ¤   LGWorld¤¤   *dragWorld = NULL;
b552a5 ¤   ¤   RgnHandle¤  dragImageRgn = NULL;
dae4fd ¤   ¤   RgnHandle¤  litCellRgn = NULL;
811b52 ¤   ¤
e638a2 ¤   ¤   mSendingDrag = TRUE;
c91b52 ¤   ¤
2e9a7c ¤   ¤   CKeyDragTask¤   drag(*this, inMouseDown.macEvent);
9c6089 #ifdef¤ __POWERPC__
d3816c ¤   ¤   OSErr¤  ¤   err;
0faf5a
2a2efc ¤   ¤   if( UEnvironment::HasGestaltAttribute(gestaltDragMgrAttr,
d81470 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   gestaltDragMgrHasImageSupport ) )
ce5b34 ¤   ¤   {
d7992b ¤   ¤   ¤   StColorPenState¤colorState;
a9d42d ¤   ¤   ¤   Rect¤   ¤   ¤   frame;
c99d16 ¤   ¤   ¤   Int16¤  ¤   ¤   depth;
3802f6 ¤   ¤   ¤   Rect¤   ¤   ¤   cellRect,
89c452 ¤   ¤   ¤   ¤   ¤   ¤   ¤   zCellRect,
8b9bfa ¤   ¤   ¤   ¤   ¤   ¤   ¤   zFrame;
4b87c7 ¤   ¤   ¤
9e5f3c ¤   ¤   ¤   CalcLocalFrameRect( frame );
7283a6 ¤   ¤   ¤   GetLocalCellRect( inCell, cellRect );
6287c7 ¤   ¤   ¤
1b10aa ¤   ¤   ¤   StDeviceLoop¤   devLoop(frame);¤¤
c8ac81 ¤   ¤   ¤   if(¤devLoop.NextDepth( depth ) &&
cded45 ¤   ¤   ¤   ¤   IsntNull( dragImageRgn = NewRgn() ) &&
be6e94 ¤   ¤   ¤   ¤   IsntNull( litCellRgn = NewRgn() ) )
d4f776 ¤   ¤   ¤   {
6b8b2c ¤   ¤   ¤   ¤   // Get selected region in image (local) coords
c66a07 ¤   ¤   ¤   ¤   GetDragHiliteRgn( dragImageRgn, inCell, false );
--fb0b 000231ecd88401201b3 Page 35 of CKeyTable.cp
9fbf01 ¤   ¤   ¤   ¤   GetCellDragRgn( inCell, litCellRgn, false );
9caeb9 ¤   ¤   ¤   ¤   OffsetRgn( litCellRgn, cellRect.left, cellRect.top );
7797bd ¤   ¤   ¤   ¤   UnionRgn( litCellRgn, dragImageRgn, dragImageRgn );
be2b85 ¤   ¤   ¤   ¤
2291b3 ¤   ¤   ¤   ¤   // Offset the offscreen rect to 0 for size efficiency
8bcc46 ¤   ¤   ¤   ¤   zFrame = (**dragImageRgn).rgnBBox;
b78ac9 ¤   ¤   ¤   ¤   OffsetRect( &zFrame, -zFrame.left, -zFrame.top );
0b2b85 ¤   ¤   ¤   ¤
2acc32 ¤   ¤   ¤   ¤   try
3072c3 ¤   ¤   ¤   ¤   {
b40f67 ¤   ¤   ¤   ¤   ¤   // Create the offscreen GWorld
bdf776 ¤   ¤   ¤   ¤   ¤   dragWorld = new LGWorld( zFrame, depth, useTempMem );
58ae30 ¤   ¤   ¤   ¤   ¤
aa7ddb ¤   ¤   ¤   ¤   ¤   // Safety check
7c233d ¤   ¤   ¤   ¤   ¤   OutOfFocus( NULL );
77e19a ¤   ¤   ¤   ¤   ¤   FocusDraw();
14ae30 ¤   ¤   ¤   ¤   ¤
7627fb ¤   ¤   ¤   ¤   ¤   // Draw the hit cell and frame the rest offscreen
487b6e ¤   ¤   ¤   ¤   ¤   // Note that some of this may not even be visible,
3579d7 ¤   ¤   ¤   ¤   ¤   // so this must be done offscreen
d8e072 ¤   ¤   ¤   ¤   ¤   if( dragWorld->BeginDrawing() )
114859 ¤   ¤   ¤   ¤   ¤   {
ade73d ¤   ¤   ¤   ¤   ¤   ¤   TableIndexT¤¤   woRow =
df69b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(inCell.row);
b1f626 ¤   ¤   ¤   ¤   ¤   ¤   STableCell¤ ¤   woCell(woRow, 1);
174352 ¤   ¤   ¤   ¤   ¤   ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
789bad ¤   ¤   ¤   ¤   ¤   ¤   KeyTableRef¤¤   keyRef;
b21395 ¤   ¤   ¤   ¤   ¤   ¤   PixMapHandle¤   dragImage;
ee590b ¤   ¤   ¤   ¤   ¤   ¤   GrafPtr¤¤   ¤   thisPort;
291592 ¤   ¤   ¤   ¤   ¤   ¤   Point¤  ¤   ¤   offsetPt;
5094aa ¤   ¤   ¤   ¤   ¤   ¤
0eec90 ¤   ¤   ¤   ¤   ¤   ¤   GetPort( &thisPort );
451dee ¤   ¤   ¤   ¤   ¤   ¤   StColorPenState::Normalize();
6e94aa ¤   ¤   ¤   ¤   ¤   ¤
602fe5 ¤   ¤   ¤   ¤   ¤   ¤   // Frame the non-hit cells
d2d297 ¤   ¤   ¤   ¤   ¤   ¤   offsetPt = topLeft( (**dragImageRgn).rgnBBox );
9002b7 ¤   ¤   ¤   ¤   ¤   ¤   OffsetRgn( dragImageRgn, -offsetPt.h, -offsetPt.v );
9329d6 ¤   ¤   ¤   ¤   ¤   ¤   PenSize( 2, 2 );
5f9475 ¤   ¤   ¤   ¤   ¤   ¤   FrameRgn( dragImageRgn );
125741 ¤   ¤   ¤   ¤   ¤   ¤   PenNormal();
ae94aa ¤   ¤   ¤   ¤   ¤   ¤
fbb0b4 ¤   ¤   ¤   ¤   ¤   ¤   // Draw the hit cell
a52949 ¤   ¤   ¤   ¤   ¤   ¤   TextFont( kFontIDGeneva );
98b165 ¤   ¤   ¤   ¤   ¤   ¤   TextSize( 9 );
7a3e0a ¤   ¤   ¤   ¤   ¤   ¤   TextFace( 0 );
31d4c5 ¤   ¤   ¤   ¤   ¤   ¤   SetThemeTextColor( kThemeListViewTextColor, depth,
0ceced ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ( depth > 1 ) );
020462 ¤   ¤   ¤   ¤   ¤   ¤   zCellRect = cellRect;
4516f3 ¤   ¤   ¤   ¤   ¤   ¤   OffsetRect( &zCellRect, -offsetPt.h, -offsetPt.v );
0c45e3 ¤   ¤   ¤   ¤   ¤   ¤   GetCellData( woCell, &keyRef, dataSize );
379553 ¤   ¤   ¤   ¤   ¤   ¤   DrawUserIDColumnCell( &keyRef, zCellRect, depth,
3fbbf9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true, false );
35c461 ¤   ¤   ¤   ¤   ¤   ¤   dragWorld->EndDrawing();
6494aa ¤   ¤   ¤   ¤   ¤   ¤
548e2a ¤   ¤   ¤   ¤   ¤   ¤   dragImage =
c6c776 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetGWorldPixMap( dragWorld->GetMacGWorld() );
8294aa ¤   ¤   ¤   ¤   ¤   ¤
c77158 ¤   ¤   ¤   ¤   ¤   ¤   LocalToPortPoint( offsetPt );
2dd600 ¤   ¤   ¤   ¤   ¤   ¤   PortToGlobalPoint( offsetPt );
b8c43a ¤   ¤   ¤   ¤   ¤   ¤   err = SetDragImage( drag.GetDragReference(),
cc26e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dragImage, dragImageRgn,
1820c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   offsetPt, kDragStandardTranslucency );
4b1c89 ¤   ¤   ¤   ¤   ¤   }
d42613 ¤   ¤   ¤   ¤   }
006406 ¤   ¤   ¤   ¤   catch(...)
1f72c3 ¤   ¤   ¤   ¤   {
2a5ad4 ¤   ¤   ¤   ¤   ¤   // Oh well, not enough memory for a ghosted drag
2f2613 ¤   ¤   ¤   ¤   }
57a3a6 ¤   ¤   ¤   }
5a0fe4 ¤   ¤   }
777454 #endif
23454e ¤   ¤   drag.DoDrag();
--d849 000a27540f0401201b3 Page 36 of CKeyTable.cp
355651 ¤   ¤   if( IsntNull( dragWorld ) )
777882 ¤   ¤   ¤   delete dragWorld;
10b34c ¤   ¤   if( IsntNull( dragImageRgn ) )
3a1b3f ¤   ¤   ¤   DisposeRgn( dragImageRgn );
2e7be8 ¤   ¤   if( IsntNull( litCellRgn ) )
5cbef9 ¤   ¤   ¤   DisposeRgn( litCellRgn );
e5370a ¤   ¤   if(UDragAndDropUtils::DroppedInTrash(drag.GetDragReference()) &&
dbf29d ¤   ¤   ¤   mMutableRing)
025b34 ¤   ¤   {
bf09b2 ¤   ¤   ¤   if(UDragAndDropUtils::CheckForOptionKey(drag.GetDragReference()))
df59e3 ¤   ¤   ¤   ¤   LCommander::GetTarget()->ProcessCommand(cmd_OptionClear);¤  ¤
e4bb8c ¤   ¤   ¤   else
0449ab ¤   ¤   ¤   ¤   LCommander::GetTarget()->ProcessCommand(cmd_Clear);
f70fe4 ¤   ¤   }
941b52 ¤   ¤
20b763 ¤   ¤   mSendingDrag = FALSE;
ea9371 ¤   }
f06f0c ¤   else if(inCell.col == 1)
d2c7a1 ¤   {
6f3b5f ¤   ¤   if( !IsTarget() )
02dc75 ¤   ¤   ¤   SwitchTarget( this );
5150a0 ¤   ¤   CPGPHierarchyTable::ClickCell( inCell, inMouseDown );
f09371 ¤   }
3befe6 }
4caf5a
db6d52 ¤   void
743023 CKeyTable::ClickValidityCell(
bba1f8 ¤   const STableCell&¤  ¤   inCell)
5fbb36 {
30e843 ¤   STableCell¤ selCell;
342dc5 ¤   SPoint32¤   imagePt;
429f58 ¤   Rect¤   ¤   cellRect;
fa011c ¤   Point¤  ¤   curMouse;
0a34c4 ¤   Boolean¤¤   pressed = FALSE;
f98684 ¤   PGPBoolean¤ showMarginal,
dd6129 ¤   ¤   ¤   ¤   axiomatic;
6398d7 ¤   TableIndexT¤woRow = mCollapsableTree->GetWideOpenIndex(inCell.row);
575f83 ¤   STableCell¤ woCell(woRow, 1);
6ce0c2 ¤   Uint32¤ ¤   dataSize = sizeof(KeyTableRef);
1ae13c ¤   KeyTableRef¤keyRef;
6b61e0 ¤   PGPError¤   err;
6287c7 ¤   ¤   ¤
c71cdc ¤   GetCellData(woCell, &keyRef, dataSize);
3bfcb8 ¤   err = PGPGetPrefBoolean(gPrefRef,
27e563 ¤   ¤   kPGPPrefDisplayMarginalValidity, &showMarginal);
b4dd44 ¤   pgpAssertNoErr(err);
ef8f06 ¤   if(!showMarginal && (keyRef.type != kSignature))
87c7a1 ¤   {
46fc6b ¤   ¤   err = PGPGetKeyBoolean(keyRef.ownerKey, kPGPKeyPropIsAxiomatic,
03d7f6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &axiomatic);
2fe919 ¤   ¤   pgpAssertNoErr(err);
eedf40 ¤   ¤   FocusDraw();
c1476b ¤   ¤   GetLocalCellRect(inCell, cellRect);
9d3335 ¤   ¤   while(::StillDown())
b85b34 ¤   ¤   {
d189d0 ¤   ¤   ¤   ::GetMouse(&curMouse);
76946d ¤   ¤   ¤   LocalToImagePoint(curMouse, imagePt);
b67cb7 ¤   ¤   ¤   if(GetCellHitBy(imagePt, selCell) &&
26b523 ¤   ¤   ¤   ¤   (selCell == inCell))
def776 ¤   ¤   ¤   {
88185e ¤   ¤   ¤   ¤   if(!pressed)
6f43db ¤   ¤   ¤   ¤   ¤   DrawIcon(axiomatic? kPressedAxiomaticIconID :·
b41192 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPressedValidityIconID,
843c3f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cellRect, -2);
a5c954 ¤   ¤   ¤   ¤   pressed = TRUE;
4fa3a6 ¤   ¤   ¤   }
20af5b ¤   ¤   ¤   else if(pressed)
4ef776 ¤   ¤   ¤   {
9f7fac ¤   ¤   ¤   ¤   DrawCell(inCell, cellRect);
bc252b ¤   ¤   ¤   ¤   pressed = FALSE;
79a3a6 ¤   ¤   ¤   }
a20fe4 ¤   ¤   }
--8800 000366a36fd401201b3 Page 37 of CKeyTable.cp
41539d ¤   ¤   if(pressed)
a85b34 ¤   ¤   {
63f7ca ¤   ¤   ¤   DrawCell(inCell, cellRect);
4ccc71 ¤   ¤   ¤   selCell = inCell;
5ebfe8 ¤   ¤   ¤   selCell.col = 1;
f5ac9f ¤   ¤   ¤   if (!CellIsSelected(selCell)) {
18908e ¤   ¤   ¤   ¤   UnselectAllCells();
4683d7 ¤   ¤   ¤   ¤   SelectCell(selCell);
05a3a6 ¤   ¤   ¤   }
26b6b3 ¤   ¤   ¤   Sign();
780fe4 ¤   ¤   }
e69371 ¤   }
3defe6 }
abaf5a
24af5a
68b516 // The following function is copied from LHierarchyTable,
c8b4cd // and is modified here to fix a stupid bug in PowerPlant that
625abc // puts a drop flag in every cell in the row.
b4af5a
396d52 ¤   void
b4e9b4 CKeyTable::ClickSelf(
1a3ba4 ¤   const SMouseDownEvent¤  &inMouseDown)
efbb36 {
46ee5d ¤   STableCell¤ hitCell;
1c2dc5 ¤   SPoint32¤   imagePt;
9d67c5 ¤
3927f5 ¤   LocalToImagePoint(inMouseDown.whereLocal, imagePt);
df67c5 ¤
472521 ¤   if (GetCellHitBy(imagePt, hitCell)) {
ec8516 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Click is inside hitCell
ad1a25 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Check if click is inside DropFlag
57c847 ¤   ¤   TableIndexT¤woRow = mCollapsableTree->GetWideOpenIndex(hitCell.row);
3efd09 ¤   ¤   Rect¤   flagRect;
1a6eb5 ¤   ¤   CalcCellFlagRect(hitCell, flagRect);
0e1b52 ¤   ¤
455cf5 ¤   ¤   if ((hitCell.col == 1) &&
b2eefc ¤   ¤   ¤   mCollapsableTree->IsCollapsable(woRow) &&
20e04f ¤   ¤   ¤   ::PtInRect(inMouseDown.whereLocal, &flagRect))
fb5b34 ¤   ¤   {
7f33bc ¤   ¤   ¤   SInt16¤ depth;
12ce83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Click is inside DropFlag
3b6e91 ¤   ¤   ¤   FocusDraw();
506ef8 ¤   ¤   ¤   depth = (**((**GetMainDevice()).gdPMap)).pixelSize;
7785a1 ¤   ¤   ¤   SetThemeBackground( kThemeListViewSortColumnBackgroundBrush,
358d2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   depth, ( depth > 1 ) );
17ef82 ¤   ¤   ¤   Boolean¤expanded = mCollapsableTree->IsExpanded(woRow);
74044c ¤   ¤   ¤   if (LDropFlag::TrackClick(flagRect, inMouseDown.whereLocal,
1fbcec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   expanded)) {
8960c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Mouse released inside DropFlag
722880 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··so toggle the Row
fb02c0 ¤   ¤   ¤   ¤   if (inMouseDown.macEvent.modifiers & optionKey) {
7e1fce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // OptionKey down means to do
f103e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··a deep collapse/expand
90f999 ¤   ¤   ¤   ¤   ¤   if (expanded) {
46f5d3 ¤   ¤   ¤   ¤   ¤   ¤   DeepCollapseRow(woRow);
0b81a1 ¤   ¤   ¤   ¤   ¤   } else {
8c3789 ¤   ¤   ¤   ¤   ¤   ¤   DeepExpandRow(woRow);
e11c89 ¤   ¤   ¤   ¤   ¤   }
f42b85 ¤   ¤   ¤   ¤
07ad6c ¤   ¤   ¤   ¤   } else {¤   ¤   ¤   ¤   // Shallow collapse/expand
2cf999 ¤   ¤   ¤   ¤   ¤   if (expanded) {
6f6740 ¤   ¤   ¤   ¤   ¤   ¤   CollapseRow(woRow);
5e81a1 ¤   ¤   ¤   ¤   ¤   } else {
229b12 ¤   ¤   ¤   ¤   ¤   ¤   ExpandRow(woRow);
991c89 ¤   ¤   ¤   ¤   ¤   }
7d2613 ¤   ¤   ¤   ¤   }
5da3a6 ¤   ¤   ¤   }
9967c5 ¤
0a0fe4 ¤   ¤   }
150e1d ¤   ¤   else
115b34 ¤   ¤   {
36f4ae ¤   ¤   ¤   if(hitCell.col == 1)
--d21b 00070cbb284401201b3 Page 38 of CKeyTable.cp
99f776 ¤   ¤   ¤   {
91190c ¤   ¤   ¤   ¤   TableIndexT¤woRow =
efd879 ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(hitCell.row);
38b5db ¤   ¤   ¤   ¤   STableCell¤ woCell(woRow, 1);
29ac78 ¤   ¤   ¤   ¤   Uint32¤ ¤   dataSize = sizeof(KeyTableRef);
7d31fb ¤   ¤   ¤   ¤   KeyTableRef¤keyRef;
d7af5a
68c761 ¤   ¤   ¤   ¤   GetCellData(woCell, &keyRef, dataSize);
822120 ¤   ¤   ¤   ¤   if( inMouseDown.whereLocal.h >= keyRef.selectLeft &&
032686 ¤   ¤   ¤   ¤   ¤   inMouseDown.whereLocal.h <= keyRef.selectRight )
ed72c3 ¤   ¤   ¤   ¤   {
8d6021 ¤   ¤   ¤   ¤   ¤   if(ClickSelect(hitCell, inMouseDown))
4f7807 ¤   ¤   ¤   ¤   ¤   ¤   ClickCell(hitCell, inMouseDown);
ae2613 ¤   ¤   ¤   ¤   }
f9de20 ¤   ¤   ¤   ¤   else if( !inMouseDown.macEvent.modifiers )
0055db ¤   ¤   ¤   ¤   ¤   UnselectAllCells();
3ca3a6 ¤   ¤   ¤   }
ebbb8c ¤   ¤   ¤   else
c2f776 ¤   ¤   ¤   {
35224e ¤   ¤   ¤   ¤   if(hitCell.col <= mColumnInfo.numActiveColumns &&
791466 ¤   ¤   ¤   ¤   ¤   mColumnInfo.columns[hitCell.col - 1] == kValidityColumnID)
b672c3 ¤   ¤   ¤   ¤   {
b8d925 ¤   ¤   ¤   ¤   ¤   ClickValidityCell(hitCell);
9d2613 ¤   ¤   ¤   ¤   }
6bfa07 ¤   ¤   ¤   ¤   else
b955db ¤   ¤   ¤   ¤   ¤   UnselectAllCells();
29a3a6 ¤   ¤   ¤   }
4a0fe4 ¤   ¤   }
58f8d7 ¤   } else {¤   ¤   ¤   ¤   ¤   ¤   ¤   // Click is outside of any Cell
b6b62c ¤   ¤   UnselectAllCells();
7c9371 ¤   }
a8efe6 }
81af5a
dc6d52 ¤   void
46fd18 CKeyTable::Click(
86a42b ¤   SMouseDownEvent¤&inMouseDown)
a1bb36 {
c0149b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Check if a SubPane of this View
418d18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··is hit
21f62a ¤   LPane¤  *clickedPane = FindSubPaneHitBy(inMouseDown.wherePort.h,
40fbc1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inMouseDown.wherePort.v);
503ede ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
55b736 ¤   if (clickedPane != nil) {¤  ¤   // SubPane is hit, let it respond to
c1dfa9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··the Click
7b3db4 ¤   ¤   clickedPane->Click(inMouseDown);
471b52 ¤   ¤
5dee48 ¤   } else {¤   ¤   ¤   ¤   ¤   ¤   // No SubPane hit. Inherited function
09b33f ¤   ¤   PortToLocalPoint(inMouseDown.whereLocal);
672ee1 ¤   ¤   UpdateClickCount(inMouseDown);
931b52 ¤   ¤
cfcd2b ¤   ¤   if (ExecuteAttachments(msg_Click, &inMouseDown)) {
0099eb ¤   ¤   ¤   ClickSelf(inMouseDown);
060fe4 ¤   ¤   }
109371 ¤   }
8eefe6 }
2aaf5a
a816ea ¤   PGPBoolean
1231cd CKeyTable::GetSelectionStats(
18ef82 ¤   PGPUInt32¤  ¤   *numKeys,
03c492 ¤   PGPUInt32¤  ¤   *numUserIDs,
282b7e ¤   PGPUInt32¤  ¤   *numSigs )
8dbb36 {
d33bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
c720f6 ¤   TableIndexT¤¤   numRows, numCols;
8267c5 ¤
bdf621 ¤   GetTableSize(numRows, numCols);
ae6f44 ¤   STableCell¤ ¤   topCell(1, 1);
b94db4 ¤   STableCell ¤¤   botCell(numRows, 1);
8cc0d7 ¤   STableCell¤ ¤   cell;¤  ¤   ¤   ¤   // Loop thru all cells
47af5a
21a21e ¤   *numKeys¤   ¤   = 0;
7075a6 ¤   *numUserIDs¤¤   = 0;
--a991 0008d2e90ca401201b3 Page 39 of CKeyTable.cp
99195a ¤   *numSigs¤   ¤   = 0;
a42c8c ¤   for(cell = botCell; cell.row >= topCell.row; cell.row--)·
bbc7a1 ¤   {
49c85e ¤   ¤   if(CellIsSelected(cell))·
5a5b34 ¤   ¤   {
e21758 ¤   ¤   ¤   TableIndexT¤¤   inWideOpenRow =
80027e ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(cell.row);
0d85ac ¤   ¤   ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
a4cece ¤   ¤   ¤   KeyTableRef¤¤   keyRef;
1cf457 ¤   ¤   ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
2487c7 ¤   ¤   ¤
a992cd ¤   ¤   ¤   GetCellData(woCell, &keyRef, dataSize);
b82fa1 ¤   ¤   ¤   switch( keyRef.type )
0af776 ¤   ¤   ¤   {
166649 ¤   ¤   ¤   ¤   case kKey:
44f17b ¤   ¤   ¤   ¤   ¤   ++*numKeys;
c714c3 ¤   ¤   ¤   ¤   ¤   break;
cd773f ¤   ¤   ¤   ¤   case kUserID:
ca873c ¤   ¤   ¤   ¤   ¤   ++*numUserIDs;
b514c3 ¤   ¤   ¤   ¤   ¤   break;
ce2a83 ¤   ¤   ¤   ¤   case kSignature:
ab8840 ¤   ¤   ¤   ¤   ¤   ++*numSigs;
6d14c3 ¤   ¤   ¤   ¤   ¤   break;
9da3a6 ¤   ¤   ¤   }
ef0fe4 ¤   ¤   }
e19371 ¤   }
eb8807 ¤   if( *numKeys > 0 || *numUserIDs > 0 || *numSigs > 0 )
58836c ¤   ¤   return TRUE;
2aa230 ¤   return FALSE;
84efe6 }
37af5a
876d52 ¤   void
b64a3a CKeyTable::GetSelectedKeySet(
720a2e ¤   PGPKeySetRef *selectedKeys )
dabb36 {
363cbe ¤   PGPError¤   ¤   ¤   ¤   err = kPGPError_NoErr;
4f4eb0 ¤   PGPKeySetRef¤   ¤   ¤   selKeys = kInvalidPGPKeySetRef,
efb054 ¤   ¤   ¤   ¤   ¤   ¤   ¤   singleKeySet = kInvalidPGPKeySetRef;
762c20 ¤   PGPUInt32¤  ¤   ¤   ¤   numKeys;
0d36d0 ¤   TableIndexT¤¤   ¤   ¤   numRows, numCols;
bf1b52 ¤   ¤
07e328 ¤   *selectedKeys = kInvalidPGPKeySetRef;
b1f621 ¤   GetTableSize(numRows, numCols);
5f6b4f ¤   STableCell¤ topCell(1, 1);
fb881e ¤   STableCell ¤botCell(numRows, 1);
1c9b43 ¤   STableCell¤ cell;¤  ¤   ¤   ¤   // Loop thru all cells
07af5a
6464e0 ¤   err = PGPNewEmptyKeySet(mKeySet, &selKeys);
ea7f7d ¤   if( IsPGPError( err ) )
e7262d ¤   ¤   goto done;
fe2c8c ¤   for(cell = botCell; cell.row >= topCell.row; cell.row--)·
79c7a1 ¤   {
41c85e ¤   ¤   if(CellIsSelected(cell))·
a15b34 ¤   ¤   {
371758 ¤   ¤   ¤   TableIndexT¤¤   inWideOpenRow =
7c027e ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(cell.row);
b885ac ¤   ¤   ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
5bcece ¤   ¤   ¤   KeyTableRef¤¤   keyRef;
e5f457 ¤   ¤   ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
aa87c7 ¤   ¤   ¤
d992cd ¤   ¤   ¤   GetCellData(woCell, &keyRef, dataSize);
7dc2c4 ¤   ¤   ¤   if( keyRef.type == kKey )
30f776 ¤   ¤   ¤   {
da1b4d ¤   ¤   ¤   ¤   PGPKeySetRef¤   oldKeys = selKeys,
a62f0f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   singleKeySet;
5a2b85 ¤   ¤   ¤   ¤
061f9a ¤   ¤   ¤   ¤   err = PGPNewSingletonKeySet(keyRef.ownerKey, &singleKeySet);
549c8a ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
fdeb0d ¤   ¤   ¤   ¤   ¤   goto done;
394fcb ¤   ¤   ¤   ¤   err = PGPUnionKeySets(oldKeys, singleKeySet, &selKeys);
ae9c8a ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
8deb0d ¤   ¤   ¤   ¤   ¤   goto done;
--7a00 0003a646916401201b3 Page 40 of CKeyTable.cp
3e67bb ¤   ¤   ¤   ¤   PGPFreeKeySet( oldKeys );
bf4670 ¤   ¤   ¤   ¤   PGPFreeKeySet( singleKeySet );
2a23fb ¤   ¤   ¤   ¤   singleKeySet = kInvalidPGPKeySetRef;
63a3a6 ¤   ¤   ¤   }
660fe4 ¤   ¤   }
a59371 ¤   }
436180 ¤   PGPCountKeys( selKeys, &numKeys );
810996 ¤   if( !numKeys )
c5c7a1 ¤   {
b31d58 ¤   ¤   PGPFreeKeySet( selKeys );
b95bc0 ¤   ¤   selKeys = kInvalidPGPKeySetRef;
189371 ¤   }
c00e24 ¤   else
c7619e ¤   ¤   *selectedKeys = selKeys;
33b38c done:
405af5 ¤   if( PGPKeySetRefIsValid( singleKeySet ) )
2cd9a4 ¤   ¤   PGPFreeKeySet( singleKeySet );
f9dbb4 ¤   if( IsPGPError( err ) && err != kPGPError_UserAbort )
643822 ¤   ¤   ReportPGPError( err );
fdefe6 }
07af5a
897e69 ¤   Boolean
5e501b CKeyTable::SelectionExists()
55bb36 {
c24585 ¤   if(mTableSelector->GetFirstSelectedRow() > 0)
06836c ¤   ¤   return TRUE;
e60e24 ¤   else
6e98aa ¤   ¤   return FALSE;
c7efe6 }
7faf5a
2b6d52 ¤   void
7d8343 CKeyTable::CollapseKeys(Boolean all)
7dbb36 {
908295 ¤   TableIndexT¤rows,
e38bde ¤   ¤   ¤   ¤   cols,
78c879 ¤   ¤   ¤   ¤   rowIndex;
8726c1 ¤   STableCell¤ cell(1, 1);
8f50da ¤   Boolean¤¤   selectedOnly;
4167c5 ¤
c741ca ¤   if(all)
7762c2 ¤   ¤   selectedOnly = FALSE;
140e24 ¤   else
9d388f ¤   ¤   selectedOnly = SelectionExists();
432be0 ¤   GetWideOpenTableSize(rows, cols);
24c1a5 ¤   for(rowIndex = rows;rowIndex > 0;rowIndex--)
ebc7a1 ¤   {
039da9 ¤   ¤   cell.row = GetExposedIndex(rowIndex);
6567f9 ¤   ¤   if(!selectedOnly || CellIsSelected(cell))
8f5fc4 ¤   ¤   ¤   if(IsCollapsable(rowIndex))
38d837 ¤   ¤   ¤   ¤   DeepCollapseRow(rowIndex);
a59371 ¤   }
22846a ¤   cell.row = cell.col = 1;
5c6729 ¤   ScrollCellIntoFrame(cell);
84c46d ¤   RedrawTable();
81efe6 }
7eaf5a
8f6d52 ¤   void
9f0fb3 CKeyTable::ExpandKeys()
75bb36 {
9e8295 ¤   TableIndexT¤rows,
c48bde ¤   ¤   ¤   ¤   cols,
b6c879 ¤   ¤   ¤   ¤   rowIndex;
fc26c1 ¤   STableCell¤ cell(1, 1);
1850da ¤   Boolean¤¤   selectedOnly;
8167c5 ¤
310461 ¤   selectedOnly = SelectionExists();
f22be0 ¤   GetWideOpenTableSize(rows, cols);
2dc1a5 ¤   for(rowIndex = rows;rowIndex > 0;rowIndex--)
7ac7a1 ¤   {
3d9da9 ¤   ¤   cell.row = GetExposedIndex(rowIndex);
c367f9 ¤   ¤   if(!selectedOnly || CellIsSelected(cell))
3a5fc4 ¤   ¤   ¤   if(IsCollapsable(rowIndex))
--7893 000a961cb8b401201b3 Page 41 of CKeyTable.cp
9cccbb ¤   ¤   ¤   ¤   DeepExpandRow(rowIndex);
f79371 ¤   }
35c46d ¤   RedrawTable();
3cefe6 }
98af5a
f17e69 ¤   Boolean
b18146 CKeyTable::AskUserForUserID(Str255 userIDStr)
4abb36 {
b777cf ¤   CPGPStDialogHandler addUserDialog(dialog_AddUserID, CPGPKeys::TheApp());
bbbc41 ¤   LWindow¤¤   ¤   ¤   *window;
fbdbc1 ¤   MessageT¤   ¤   ¤   dialogMessage;
05ec47 ¤   Str255¤ ¤   ¤   ¤   stringValue;
7b67c5 ¤
c82fdd ¤   window = addUserDialog.GetDialog();
073653 tryAgain:
5ecfa1 ¤   do
64c7a1 ¤   {
fcfa06 ¤   ¤   dialogMessage = addUserDialog.DoDialog();
06fa35 ¤   } while( dialogMessage != msg_OK && dialogMessage != msg_Cancel );
8df518 ¤   if(dialogMessage == msg_OK)
94c7a1 ¤   {
3550ed ¤   ¤   ((LEditText *)window->FindPaneByID('eNam'))->
3dd5b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetDescriptor(stringValue);
65af5a
e3abca ¤   ¤   if (stringValue[ 0 ] == '\0')
1c5b34 ¤   ¤   {
04b159 ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
be9808 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kBadNameID);
88c703 ¤   ¤   ¤   goto tryAgain;
470fe4 ¤   ¤   }
e40e1d ¤   ¤   else
367832 ¤   ¤   ¤   CopyPString(stringValue, userIDStr);
a2af5a
8373d8 ¤   ¤   ((LEditText *)window->FindPaneByID('eEma'))->
34d5b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetDescriptor(stringValue);
da1471 ¤   ¤   if (stringValue[ 0 ] != '\0')
695b34 ¤   ¤   {
4f60c1 ¤   ¤   ¤   AppendPString("\p <", userIDStr);
641893 ¤   ¤   ¤   AppendPString(stringValue, userIDStr);
0b9586 ¤   ¤   ¤   AppendPString("\p>", userIDStr);
000fe4 ¤   ¤   }
65836c ¤   ¤   return TRUE;
309371 ¤   }
83a230 ¤   return FALSE;
f6efe6 }
6faf5a
417e69 ¤   Boolean
0ea414 CKeyTable::AskUserForPhotoID(
adee02 ¤   void ¤  **photoData,
9b9ab9 ¤   PGPSize¤*photoDataSize)
3bbb36 {
c8623b ¤   CPGPStDialogHandler addPhotoDialog(dialog_AddPhotoUserID,
57b7d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp());
d7bc41 ¤   LWindow¤¤   ¤   ¤   *window;
0cdbc1 ¤   MessageT¤   ¤   ¤   dialogMessage;
ba0a37 ¤   CPhotoUserID¤   ¤   *photoIDPane;
5eba16 ¤   LPushButton¤¤   ¤   *okButton;
287219 ¤   Boolean¤¤   ¤   ¤   haveData = FALSE;
5967c5 ¤
b3b161 ¤   window = addPhotoDialog.GetDialog();
9aaf5a
a9bfa8 ¤   photoIDPane = (CPhotoUserID *) window->FindPaneByID( 'pPID' );
f8bdef ¤   pgpAssertAddrValid( photoIDPane, VoidAlign );
c467c5 ¤
e14faf ¤   okButton = (LPushButton *) window->FindPaneByID( 'okay' );
e17c2d ¤   pgpAssertAddrValid( okButton, VoidAlign );
7667c5 ¤
5eb92b ¤   SwitchTarget( photoIDPane );
2d67c5 ¤
6acfa1 ¤   do
14c7a1 ¤   {
a9adbb ¤   ¤   if( photoIDPane->HavePicture() )
--b85f 00057cbed12401201b3 Page 42 of CKeyTable.cp
e35b34 ¤   ¤   {
42f7e3 ¤   ¤   ¤   okButton->Enable();
860fe4 ¤   ¤   }
830e1d ¤   ¤   else
2b5b34 ¤   ¤   {
a5980a ¤   ¤   ¤   okButton->Disable();
8f0fe4 ¤   ¤   }
431b52 ¤   ¤
10be93 ¤   ¤   dialogMessage = addPhotoDialog.DoDialog();
adaf5a
f2d38d ¤   ¤   if( dialogMessage == 'File' )
af5b34 ¤   ¤   {
3031a0 ¤   ¤   ¤   StandardFileReply¤  sfReply;
556a20 ¤   ¤   ¤   SFTypeList¤ ¤   ¤   typeList;
ec87c7 ¤   ¤   ¤
10ecc9 ¤   ¤   ¤   typeList[0] = 'PICT';
bc87c7 ¤   ¤   ¤
9edd8b ¤   ¤   ¤   UDesktop::Deactivate();
fce739 ¤   ¤   ¤   ¤   StandardGetFile( NULL, 1, typeList, &sfReply );
8de678 ¤   ¤   ¤   UDesktop::Activate();
e087c7 ¤   ¤   ¤
1b8d67 ¤   ¤   ¤   if( sfReply.sfGood )
7df776 ¤   ¤   ¤   {
77e677 ¤   ¤   ¤   ¤   photoIDPane->AddPictureFromFile( &sfReply.sfFile );
3aa3a6 ¤   ¤   ¤   }
c40fe4 ¤   ¤   }
301b52 ¤   ¤
18fa35 ¤   } while( dialogMessage != msg_OK && dialogMessage != msg_Cancel );
2b67c5 ¤
092b21 ¤   if( dialogMessage == msg_OK )
bbc7a1 ¤   {
a8baf0 ¤   ¤   photoIDPane->GetPhotoData( gPGPContext, photoData, photoDataSize );
e5b65c ¤   ¤   haveData = photoDataSize != 0;
b89371 ¤   }
6867c5 ¤
d1508a ¤   return( haveData );
2defe6 }
30af5a
466d52 ¤   void
b4b140 CKeyTable::AddUserID(
c7af03 ¤   PGPBoolean addPhotoID )
6fbb36 {
08fb19 ¤   PGPError¤   ¤   err;
d3cd9f ¤   STableCell¤ ¤   cell,
d3de54 ¤   ¤   ¤   ¤   ¤   wideCell;
972eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
7ce86c ¤   KeyTableRef¤¤   keyRef;
955dd9 ¤   PGPBoolean¤ ¤   secret;
a9002e ¤   Boolean¤¤   ¤   firstPass = TRUE;
ff67c5 ¤
57e8b5 ¤   cell = GetFirstSelectedCell();
e555a2 ¤   wideCell.col = 1;
7a9b07 ¤   wideCell.row = mCollapsableTree->GetWideOpenIndex(cell.row);
d4b82f ¤   GetCellData(wideCell, &keyRef, dataSize);
a5db81 ¤   secret = FALSE;
78dcb3 ¤   if(keyRef.type == kKey)
eac7a1 ¤   {
14c3bf ¤   ¤   err = PGPGetKeyBoolean( keyRef.u.key, kPGPKeyPropIsSecret, &secret );
9d9832 ¤   ¤   pgpAssertNoErr( err );
a59371 ¤   }
ec8781 ¤   if( addPhotoID )
8cc7a1 ¤   {
60ae2e ¤   ¤   PGPUserIDRef¤   userID;
82f769 ¤   ¤   PGPBoolean¤ ¤   isAttributeID;
7f1b52 ¤   ¤
28367d ¤   ¤   PGPKeyIterSeek( mKeyIter, keyRef.u.key );
201572 ¤   ¤   while( IsntPGPError( PGPKeyIterNextUserID( mKeyIter, &userID ) ) )
e75b34 ¤   ¤   {
d70cee ¤   ¤   ¤   err = PGPGetUserIDBoolean( userID, kPGPUserIDPropIsAttribute,
57c1df ¤   ¤   ¤   ¤   ¤   ¤   &isAttributeID );
85144d ¤   ¤   ¤   pgpAssertNoErr( err );
5787c7 ¤   ¤   ¤
--7bbf 000c37a3469401201b3 Page 43 of CKeyTable.cp
88e451 ¤   ¤   ¤   if( isAttributeID )
acf776 ¤   ¤   ¤   {
6a9e3d ¤   ¤   ¤   ¤   PGPInt32¤   attributeType;
a12b85 ¤   ¤   ¤   ¤
18fb81 ¤   ¤   ¤   ¤   err = PGPGetUserIDNumber( userID,
adadd4 ¤   ¤   ¤   ¤   ¤   ¤   kPGPUserIDPropAttributeType, &attributeType );
b02b85 ¤   ¤   ¤   ¤
9ebb8d ¤   ¤   ¤   ¤   if( attributeType == kPGPAttribute_Image )
a172c3 ¤   ¤   ¤   ¤   {
6ae427 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
a0e064 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kOnlyOnePhotoID);
de825d ¤   ¤   ¤   ¤   ¤   return;
ed2613 ¤   ¤   ¤   ¤   }
b2a3a6 ¤   ¤   ¤   }
a60fe4 ¤   ¤   }
519371 ¤   }
df67c5 ¤
dc0104 ¤   if( ( keyRef.type == kKey ) && secret )
ebc7a1 ¤   {
221c8b ¤   ¤   PGPBoolean¤ ksSync;
763d03 ¤   ¤   PGPBoolean¤ needsPass;
b7cdaa ¤   ¤   Str255¤ ¤   userIDStr;
6752c2 ¤   ¤   void¤   ¤   *photoData;
b3c0f9 ¤   ¤   PGPSize¤¤   photoDataSize;
d91b52 ¤   ¤
70efa3 ¤   ¤   needsPass ¤ ¤   = FALSE;
748ce5 ¤   ¤   userIDStr[0] ¤  = 0;
a4676e ¤   ¤   photoData¤  ¤   = NULL;
343744 ¤   ¤   photoDataSize¤  = 0;
a41b52 ¤   ¤
39c056 ¤   ¤   err = PGPGetPrefBoolean(gPrefRef,
b9d5cb ¤   ¤   ¤   ¤   ¤   kPGPPrefKeyServerSyncOnAdd, &ksSync);
b9e919 ¤   ¤   pgpAssertNoErr(err);
b89b78 ¤   ¤   if(ksSync)
215b34 ¤   ¤   {
341bb4 ¤   ¤   ¤   GetCellOnServer(cell);
966d39 ¤   ¤   ¤   ResyncTable(FALSE, TRUE);
520fe4 ¤   ¤   }
821b52 ¤   ¤
883650 ¤   ¤   if( addPhotoID )
275b34 ¤   ¤   {
ffc30a ¤   ¤   ¤   needsPass = AskUserForPhotoID( &photoData, &photoDataSize );
ae0fe4 ¤   ¤   }
c30e1d ¤   ¤   else
455b34 ¤   ¤   {
743be3 ¤   ¤   ¤   needsPass = AskUserForUserID( userIDStr );
a30fe4 ¤   ¤   }
b71b52 ¤   ¤
4bb9db ¤   ¤   if( needsPass )
cd5b34 ¤   ¤   {
c8e308 ¤   ¤   ¤   CSecureCString256¤  passphrase;
06586b ¤   ¤   ¤   PGPByte¤¤   ¤   ¤   *passKey = NULL;
cfb24a ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   passKeySize;
8b7267 ¤   ¤   ¤   PGPBoolean¤ ¤   ¤   split = FALSE;
b487c7 ¤   ¤   ¤
f49861 ¤   ¤   ¤   passphrase[0] = 0;
f6af5a
830bd1 ¤   ¤   ¤   err = GetPassForKey( keyRef.u.key, &split, passphrase,
d7732f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passKey, &passKeySize );
71698b ¤   ¤   ¤   if( IsntPGPError( err ) )
c4f776 ¤   ¤   ¤   {
c5be63 ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetMinimumRandomData();
862b85 ¤   ¤   ¤   ¤
fbb95b ¤   ¤   ¤   ¤   if( addPhotoID )
1872c3 ¤   ¤   ¤   ¤   {
af5986 ¤   ¤   ¤   ¤   ¤   err = PGPAddAttributeUserID( keyRef.u.key,
f0b2fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPAttribute_Image, (PGPByte *) photoData,
172103 ¤   ¤   ¤   ¤   ¤   ¤   ¤   photoDataSize, split ?
29b503 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, passKey,
581d20 ¤   ¤   ¤   ¤   ¤   ¤   ¤   passKeySize ) :
b33480 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, passphrase),
c375c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
--551b 000378bcb3b401201b3 Page 44 of CKeyTable.cp
862613 ¤   ¤   ¤   ¤   }
7dfa07 ¤   ¤   ¤   ¤   else
8772c3 ¤   ¤   ¤   ¤   {
a7d0ab ¤   ¤   ¤   ¤   ¤   char¤   cStringUsrID[ 256 ];
5aaf5a
e8ceb8 ¤   ¤   ¤   ¤   ¤   PToCString( userIDStr, cStringUsrID );
82ae30 ¤   ¤   ¤   ¤   ¤
fda5d4 ¤   ¤   ¤   ¤   ¤   err = PGPAddUserID(keyRef.u.key, cStringUsrID, split ?
d3b275 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, passKey,
540570 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   passKeySize ) :
a32236 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, passphrase),
2ca135 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ));
702613 ¤   ¤   ¤   ¤   }
092b85 ¤   ¤   ¤   ¤
7b9039 ¤   ¤   ¤   ¤   if(err == kPGPError_DuplicateUserID)
9572c3 ¤   ¤   ¤   ¤   {
ace427 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
3a0b33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kDupeUserID);
c92613 ¤   ¤   ¤   ¤   }
3dfa07 ¤   ¤   ¤   ¤   else
6b4647 ¤   ¤   ¤   ¤   ¤   pgpAssert(!err);
521ece ¤   ¤   ¤   ¤   if(!err)
fc72c3 ¤   ¤   ¤   ¤   {
e2bbc8 ¤   ¤   ¤   ¤   ¤   UnmarkKey(keyRef.u.key);
a57170 ¤   ¤   ¤   ¤   ¤   RemoveKeyFromTable(keyRef.u.key);
ad6812 ¤   ¤   ¤   ¤   ¤   ResyncTable(FALSE, TRUE);
74aba2 ¤   ¤   ¤   ¤   ¤   CommitKeySet();
ce6aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
962613 ¤   ¤   ¤   ¤   }
69a3a6 ¤   ¤   ¤   }
73b2b6 ¤   ¤   ¤   if( IsntNull( passKey ) )
1c01f8 ¤   ¤   ¤   ¤   PGPFreeData( passKey );
d8a091 ¤   ¤   ¤   if(ksSync)
21f776 ¤   ¤   ¤   {
536778 ¤   ¤   ¤   ¤   err = PGPSendKeyToServer(gPGPContext, gTLSContext,
aa40e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyRef.u.key, NULL);
a0c010 ¤   ¤   ¤   ¤   if(IsPGPError(err) && (err != kPGPError_UserAbort))
8a04c9 ¤   ¤   ¤   ¤   ¤   ReportPGPError(err);
56a3a6 ¤   ¤   ¤   }
360fe4 ¤   ¤   }
321b52 ¤   ¤
026a3a ¤   ¤   if( IsntNull( photoData ) )
580a9b ¤   ¤   ¤   PGPFreeData( photoData );
139371 ¤   }
170e24 ¤   else
478c37 ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
603fdf ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kAddNameOnlyPairsID);
54efe6 }
01af5a
786d52 ¤   void
83359d CKeyTable::AddRevoker()
88bb36 {
c67d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
ef5d3f ¤   STableCell¤ ¤   ¤   cell,
efe95c ¤   ¤   ¤   ¤   ¤   ¤   wideCell;
88038b ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof(KeyTableRef);
81a164 ¤   KeyTableRef¤¤   ¤   keyRef;
a53ec2 ¤   PGPKeySetRef¤   ¤   revokerSet = kInvalidPGPKeySetRef;
31ae3b ¤   CSecureCString256¤  passphrase;
320c4e ¤   PGPByte¤¤   ¤   ¤   *passKey = NULL;
40b11f ¤   PGPSize¤¤   ¤   ¤   passKeySize;
e90ba5 ¤   PGPBoolean¤ ¤   ¤   ksSync;
9e67c5 ¤
6fe8b5 ¤   cell = GetFirstSelectedCell();
9e55a2 ¤   wideCell.col = 1;
e79b07 ¤   wideCell.row = mCollapsableTree->GetWideOpenIndex(cell.row);
d0b82f ¤   GetCellData(wideCell, &keyRef, dataSize);
2fdcb3 ¤   if(keyRef.type == kKey)
3fc7a1 ¤   {
f93ca4 ¤   ¤   Str255¤ ¤   prompt;
2c929f ¤   ¤   char¤   ¤   cstr[256];
37537d ¤   ¤   PGPUInt32¤  numRevokers;
--23f7 0001f1f9467401201b3 Page 45 of CKeyTable.cp
f11b52 ¤   ¤
615850 ¤   ¤   err = PGPGetPrefBoolean( gPrefRef,
5db164 ¤   ¤   ¤   ¤   ¤   kPGPPrefKeyServerSyncOnAdd, &ksSync );
58e919 ¤   ¤   pgpAssertNoErr(err);
fa2723 ¤   ¤   if( ksSync )
215b34 ¤   ¤   {
7e6a7d ¤   ¤   ¤   GetCellOnServer( cell );
68451b ¤   ¤   ¤   ResyncTable( FALSE, TRUE );
310fe4 ¤   ¤   }
98af79 ¤   ¤   GetIndString( prompt, kStringListID, kAddRevokerID );
1b1d88 ¤   ¤   PToCString( prompt, cstr );
5a5677 ¤   ¤   UDesktop::Deactivate();
ac87aa ¤   ¤   err = PGPSelectKeysDialog( gPGPContext, kPGPSelectKeysNoRSAKeys,
2074bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cstr, mKeySet, NULL, &revokerSet );
3dd4ea ¤   ¤   UDesktop::Activate();¤  CKERR;
f0f610 ¤   ¤   PGPCountKeys( revokerSet, &numRevokers );
ef1b52 ¤   ¤
7e66a8 ¤   ¤   if( numRevokers > 0 && ( msg_OK ==
495252 ¤   ¤   ¤   CWarningAlert::Display( kWACautionAlertType, kWAOKCancelStyle,
d00ff3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kAddRevokerConfirmationID ) ) )
4a5b34 ¤   ¤   {
e8aff8 ¤   ¤   ¤   PGPBoolean¤ split;
bb87c7 ¤   ¤   ¤
b20bd1 ¤   ¤   ¤   err = GetPassForKey( keyRef.u.key, &split, passphrase,
902d48 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &passKey, &passKeySize );¤  CKERR;
ff4e2b ¤   ¤   ¤   err = PGPAddKeyOptions( keyRef.u.key, split ?
dc6afe ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, passKey, passKeySize ) :
ca022b ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, passphrase ),
224485 ¤   ¤   ¤   ¤   ¤   PGPORevocationKeySet( gPGPContext, revokerSet ),
67a7a1 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) ); CKERR;
0da091 ¤   ¤   ¤   if(ksSync)
81f776 ¤   ¤   ¤   {
be6778 ¤   ¤   ¤   ¤   err = PGPSendKeyToServer(gPGPContext, gTLSContext,
6040e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyRef.u.key, NULL);
a5c07a ¤   ¤   ¤   ¤   if( IsPGPError(err) && ( err != kPGPError_UserAbort ) )
f804c9 ¤   ¤   ¤   ¤   ¤   ReportPGPError(err);
7fa3a6 ¤   ¤   ¤   }
6d4f24 ¤   ¤   ¤   CWarningAlert::Display( kWANoteAlertType, kWAOKStyle,
d0fbbe ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kAddRevokerFinishedID );
2f0fe4 ¤   ¤   }
899371 ¤   }
18b38c done:
1eb0bc ¤   if( PGPKeySetRefIsValid( revokerSet ) )
5d10dc ¤   ¤   PGPFreeKeySet( revokerSet );
596acd ¤   if( IsntNull( passKey ) )
874f51 ¤   ¤   PGPFreeData( passKey );
657f7d ¤   if( IsPGPError( err ) )
ac3822 ¤   ¤   ReportPGPError( err );
e9efe6 }
daaf5a
617e69 ¤   Boolean
7a1632 CKeyTable::SetDefault()
12bb36 {
1afb19 ¤   PGPError¤   ¤   err;
da1506 ¤   STableCell¤ ¤   cell;
bb2eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
a7e86c ¤   KeyTableRef¤¤   keyRef;
578026 ¤   PGPBoolean¤ ¤   secret = FALSE;
8367c5 ¤
54e8b5 ¤   cell = GetFirstSelectedCell();
2a8582 ¤   cell.col = 1;
bd5bea ¤   cell.row = mCollapsableTree->GetWideOpenIndex(cell.row);
a75561 ¤   GetCellData(cell, &keyRef, dataSize);
c3dcb3 ¤   if(keyRef.type == kKey)
66c7a1 ¤   {
9693da ¤   ¤   err = PGPGetKeyBoolean(keyRef.u.key, kPGPKeyPropIsSecret, &secret);
01e919 ¤   ¤   pgpAssertNoErr(err);
ea9371 ¤   }
68fc47 ¤   if((keyRef.type == kKey) && secret)
e0c7a1 ¤   {
490c20 ¤   ¤   PGPSetDefaultPrivateKey(keyRef.u.key);
1fc861 ¤   ¤   mDefaultKey = keyRef.u.key;
--0ed5 0009f9143c0401201b3 Page 46 of CKeyTable.cp
58a2fa ¤   ¤   PGPsdkSavePrefs(gPGPContext);
8bff84 ¤   ¤   RedrawTable();
bf836c ¤   ¤   return TRUE;
369371 ¤   }
eb2e7f ¤   else if(keyRef.type == kUserID)
b2c7a1 ¤   {
d1e6e3 ¤   ¤   err = PGPSetPrimaryUserID(keyRef.u.user);
d6e919 ¤   ¤   pgpAssertNoErr(err);
f57b65 ¤   ¤   CommitKeySet();
a6654d ¤   ¤   UnmarkKey(keyRef.ownerKey);
6f25c1 ¤   ¤   RemoveKeyFromTable(keyRef.ownerKey);
48824a ¤   ¤   ResyncTable(FALSE, TRUE);
06ff84 ¤   ¤   RedrawTable();
7a836c ¤   ¤   return TRUE;
4f9371 ¤   }
bf0e24 ¤   else
b398aa ¤   ¤   return FALSE;
bdefe6 }
ccaf5a
087e69 ¤   Boolean
98d8d9 CKeyTable::WeAreFront()
50bb36 {
97c71b ¤   ProcessSerialNumber¤process;
6c8b03 ¤   Boolean¤¤   ¤   ¤   weFront = FALSE;
b8af5a
3e3a5f ¤   ::GetFrontProcess(&process);
5eb171 ¤   ::SameProcess(&process, &sThisProcess, &weFront);
7267c5 ¤
cf4733 ¤   return weFront;
0defe6 }
cfaf5a
ec6d52 ¤   void
847cef CKeyTable::ImportHandler()
c8bb36 {
c43edb ¤   PGPKeySetRef¤   ¤   newKeySet,
e1d4f3 ¤   ¤   ¤   ¤   ¤   ¤   selectedKeySet;
646b90 ¤   PGPFileSpecRef¤ ¤   pgpFileRef;
14f99a ¤   PGPUInt32¤  ¤   ¤   keyCount;
093661 ¤   Str255¤ ¤   ¤   ¤   str;
a28f52 ¤   PGPError¤   ¤   ¤   err;
7d2870 ¤   KeyImportStruct¤¤   *savedKis;
c1ed7b ¤   Boolean¤¤   ¤   ¤   abort = FALSE;
7667c5 ¤
33ccb1 ¤   while(IsntNull(mImports))
61c7a1 ¤   {
761d52 ¤   ¤   if(mImports->savedImportIsFile)
a75b34 ¤   ¤   {
eda6f4 ¤   ¤   ¤   err = PGPNewFileSpecFromFSSpec(gPGPContext,
444498 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mImports->savedImportSpec, &pgpFileRef);
b3524f ¤   ¤   ¤   pgpAssertNoErr(err);
26768c ¤   ¤   ¤   if(IsntPGPError(err))
c1f776 ¤   ¤   ¤   {
069221 ¤   ¤   ¤   ¤   err = PGPImportKeySet( gPGPContext, &newKeySet,
4bd0bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOInputFile( gPGPContext, pgpFileRef ),
9a75c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
5957c4 ¤   ¤   ¤   ¤   PGPFreeFileSpec(pgpFileRef);
83a3a6 ¤   ¤   ¤   }
4f0fe4 ¤   ¤   }
a70e1d ¤   ¤   else
6c5b34 ¤   ¤   {
43563d ¤   ¤   ¤   err = PGPImportKeySet( gPGPContext, &newKeySet,
8e2372 ¤   ¤   ¤   ¤   ¤   PGPOInputBuffer( gPGPContext,
0949ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   mImports->savedImportBuffer,
454080 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mImports->savedImportBufferSize ),
4c3c4e ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
f9cd1a ¤   ¤   ¤   pgpFree(mImports->savedImportBuffer);
f90fe4 ¤   ¤   }
8a5d72 ¤   ¤   if(IsntPGPError(err) && PGPKeySetRefIsValid(newKeySet))
805b34 ¤   ¤   {
327403 ¤   ¤   ¤   err = PGPCountKeys(newKeySet, &keyCount);
c2d561 ¤   ¤   ¤   if(IsntPGPError(err) && keyCount > 0)
9ff776 ¤   ¤   ¤   {
--be57 000e4182e05401201b3 Page 47 of CKeyTable.cp
e90837 ¤   ¤   ¤   ¤   if(!mImports->bypassImportDialog)
8f72c3 ¤   ¤   ¤   ¤   {
e838e2 ¤   ¤   ¤   ¤   ¤   char¤   cstring[128];
a1ae30 ¤   ¤   ¤   ¤   ¤
6510a1 ¤   ¤   ¤   ¤   ¤   ::GetIndString(¤str,
3eba2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
8d33db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSpecifyKeysToImportID);
db557e ¤   ¤   ¤   ¤   ¤   PToCString(str, cstring);
8590b8 ¤   ¤   ¤   ¤   ¤   UDesktop::Deactivate();
d5f076 ¤   ¤   ¤   ¤   ¤   err = PGPSelectKeysDialog(gPGPContext,
9fbc08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSelectKeysImportVariation,
3dde33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cstring, newKeySet, mKeySet,
30fc05 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &selectedKeySet);
2635e5 ¤   ¤   ¤   ¤   ¤   UDesktop::Activate();
9a2613 ¤   ¤   ¤   ¤   }
82fa07 ¤   ¤   ¤   ¤   else
e43756 ¤   ¤   ¤   ¤   ¤   selectedKeySet = newKeySet;
b211d2 ¤   ¤   ¤   ¤   if(IsntPGPError(err) && PGPKeySetRefIsValid(selectedKeySet))
9d72c3 ¤   ¤   ¤   ¤   {
b37d88 ¤   ¤   ¤   ¤   ¤   err = PGPAddKeys(selectedKeySet, mKeySet);
6e6aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
d9aba2 ¤   ¤   ¤   ¤   ¤   CommitKeySet();
48a636 ¤   ¤   ¤   ¤   ¤   if(!mImports->bypassImportDialog)
4e0c9b ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet(selectedKeySet);
602613 ¤   ¤   ¤   ¤   }
e4e113 ¤   ¤   ¤   ¤   else if(err == kPGPError_UserAbort)
0a72c3 ¤   ¤   ¤   ¤   {
079409 ¤   ¤   ¤   ¤   ¤   abort = TRUE;
532613 ¤   ¤   ¤   ¤   }
24fa07 ¤   ¤   ¤   ¤   else
c704c9 ¤   ¤   ¤   ¤   ¤   ReportPGPError(err);
52a3a6 ¤   ¤   ¤   }
48bb8c ¤   ¤   ¤   else
9bff2e ¤   ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
19f069 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kNoKeysFoundID);
b8be7d ¤   ¤   ¤   PGPFreeKeySet(newKeySet);
cc0fe4 ¤   ¤   }
d96b7c ¤   ¤   savedKis = mImports;
7eaa74 ¤   ¤   mImports = mImports->next;
36f5a7 ¤   ¤   pgpFree(savedKis);
3e1b3d ¤   ¤   if(abort)
165b34 ¤   ¤   {
c101bc ¤   ¤   ¤   // user has aborted import, dispose all queued imports
8e14ca ¤   ¤   ¤   while(IsntNull(mImports))
29f776 ¤   ¤   ¤   {
7e2030 ¤   ¤   ¤   ¤   if(!mImports->savedImportIsFile)
b3606c ¤   ¤   ¤   ¤   ¤   pgpFree(mImports->savedImportBuffer);
89ed42 ¤   ¤   ¤   ¤   savedKis = mImports;
d3e5cb ¤   ¤   ¤   ¤   mImports = mImports->next;
316df0 ¤   ¤   ¤   ¤   pgpFree(savedKis);
06a3a6 ¤   ¤   ¤   }
060fe4 ¤   ¤   }
699371 ¤   }
01b542 ¤   ResyncTable(FALSE, TRUE);
08c46d ¤   RedrawTable();
684f56 ¤   if(mDefaultRing)
6db47c ¤   ¤   CPGPKeys::TheApp()->InvalidateCaches();
1cefe6 }
e1af5a
836d52 ¤   void
b6f398 CKeyTable::SpendTime(const EventRecord¤ ¤   &/*inMacEvent*/)
5bbb36 {
f2642b ¤   if(!WeAreFront())
f699bf ¤   ¤   return;
2ee276 ¤   else if(mBlockDialogDelays > 0)
d7c7a1 ¤   {
54a506 ¤   ¤   mBlockDialogDelays--;
b399bf ¤   ¤   return;
569371 ¤   }
1209d5 ¤   if(mNotified)
29c7a1 ¤   {
e436b1 ¤   ¤   ::NMRemove(&sImportNotification);
--14d8 000f21261bf401201b3 Page 48 of CKeyTable.cp
32526c ¤   ¤   mNotified = FALSE;
da9371 ¤   }
c5b35f ¤   StopIdling();
001dc9 ¤   ImportHandler();
04efe6 }
baaf5a
b76d52 ¤   void
1cabca CKeyTable::ImportKeysFromFile(FSSpec *keyFile, Boolean noDialog)
c5bb36 {
4a5cfc ¤   KeyImportStruct¤*kis;
ef67c5 ¤
162c9d ¤   pgpAssertAddrValid(keyFile, FSSpec);
d667c5 ¤
434648 ¤   kis = (KeyImportStruct¤ *)pgpAlloc(sizeof(KeyImportStruct));
993a50 ¤   if(IsntNull(kis))
fec7a1 ¤   {
f50ab8 ¤   ¤   kis->savedImportIsFile = TRUE;
d92b5e ¤   ¤   kis->bypassImportDialog = noDialog;
562c8a ¤   ¤   ::BlockMoveData(keyFile, &kis->savedImportSpec, sizeof(FSSpec));
6e728a ¤   ¤   kis->next = mImports;
0d353d ¤   ¤   mImports = kis;
90533b ¤   ¤   StartIdling();
822c45 ¤   ¤   StepForward();
c39371 ¤   }
acefe6 }
3daf5a
b26d52 ¤   void
ac82d6 CKeyTable::ImportKeysFromHandle(Handle data)
f1bb36 {
d05cfc ¤   KeyImportStruct¤*kis;
1d67c5 ¤
a10fa1 ¤   if(IsntNull(data))
51c7a1 ¤   {
1ccc0d ¤   ¤   kis = (KeyImportStruct¤ *)pgpAlloc(sizeof(KeyImportStruct));
2bfde5 ¤   ¤   if(IsntNull(kis))
085b34 ¤   ¤   {
85c606 ¤   ¤   ¤   long¤   importSize;
e387c7 ¤   ¤   ¤
1de6a9 ¤   ¤   ¤   importSize = GetHandleSize(data);
cd80ec ¤   ¤   ¤   kis->savedImportIsFile = FALSE;
bc5bf0 ¤   ¤   ¤   kis->bypassImportDialog = TRUE;
64c183 ¤   ¤   ¤   kis->savedImportBuffer = (PGPByte *)pgpAlloc(importSize);
bea5c8 ¤   ¤   ¤   if(IsntNull(kis->savedImportBuffer))
4ff776 ¤   ¤   ¤   {
768098 ¤   ¤   ¤   ¤   ::BlockMoveData(*data, kis->savedImportBuffer, importSize);
e2b819 ¤   ¤   ¤   ¤   kis->savedImportBufferSize = importSize;
34aaf1 ¤   ¤   ¤   ¤   kis->next = mImports;
d36e06 ¤   ¤   ¤   ¤   mImports = kis;
3e2313 ¤   ¤   ¤   ¤   ImportHandler();
1ba3a6 ¤   ¤   ¤   }
38bb8c ¤   ¤   ¤   else
331306 ¤   ¤   ¤   ¤   // out of memory
43f420 ¤   ¤   ¤   ¤   pgpFree(kis);
f60fe4 ¤   ¤   }
b99371 ¤   }
7defe6 }
d9af5a
166d52 ¤   void
98ac9d CKeyTable::ImportKeysFromKeySet(PGPKeySetRef keySet)
fcbb36 {
3e59bb ¤   if(PGPKeySetRefIsValid(keySet))
b2c7a1 ¤   {
1dd031 ¤   ¤   PGPError¤   err;
c71b52 ¤   ¤
7d36df ¤   ¤   err = PGPAddKeys(keySet, mKeySet);
68e919 ¤   ¤   pgpAssertNoErr(err);
087b65 ¤   ¤   CommitKeySet();
5e1df5 ¤   ¤   PGPFreeKeySet(keySet);
6f824a ¤   ¤   ResyncTable(FALSE, TRUE);
07ff84 ¤   ¤   RedrawTable();
71fe87 ¤   ¤   if(mDefaultRing)
f2223d ¤   ¤   ¤   CPGPKeys::TheApp()->InvalidateCaches();
--72c9 0001bad080d401201b3 Page 49 of CKeyTable.cp
a19371 ¤   }
c9efe6 }
a0af5a
5a6d52 ¤   void
c02ce1 CKeyTable::CopyKeys()
6bbb36 {
148ec1 ¤   TableIndexT¤numRows, numCols;
78f621 ¤   GetTableSize(numRows, numCols);
dd67c5 ¤
626f44 ¤   STableCell¤ ¤   topCell(1, 1);
a04db4 ¤   STableCell ¤¤   botCell(numRows, 1);
041506 ¤   STableCell¤ ¤   cell;
8d67c5 ¤
24a28d ¤   PGPKeySetRef¤   keysToExport;
3bfb19 ¤   PGPError¤   ¤   err;
7df4ee ¤   Int16¤  ¤   ¤   keyCount = 0;
a667c5 ¤
e8c59c ¤   ::ZeroScrap();
d46039 ¤   err = PGPNewKeySet(gPGPContext, &keysToExport);
25dd44 ¤   pgpAssertNoErr(err);
91948a ¤   pgpAssertAddrValid(keysToExport, VoidAlign);
9c2c8c ¤   for(cell = botCell; cell.row >= topCell.row; cell.row--)·
e1c7a1 ¤   {
99c85e ¤   ¤   if(CellIsSelected(cell))·
cf5b34 ¤   ¤   {
3aed0d ¤   ¤   ¤   TableIndexT¤¤   inWideOpenRow = mCollapsableTree->
386f50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetWideOpenIndex(cell.row);
792dac ¤   ¤   ¤   STableCell¤ ¤   woCell(inWideOpenRow, cell.col);
e5cece ¤   ¤   ¤   KeyTableRef¤¤   keyRef;
32f457 ¤   ¤   ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
60814f ¤   ¤   ¤   PGPKeySetRef¤   singleKeySet;
5187c7 ¤   ¤   ¤
7392cd ¤   ¤   ¤   GetCellData(woCell, &keyRef, dataSize);
e3fa11 ¤   ¤   ¤   if(keyRef.type == kKey)
01f776 ¤   ¤   ¤   {
279ce7 ¤   ¤   ¤   ¤   err = PGPNewSingletonKeySet(keyRef.u.key, &singleKeySet);
086f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
9a880a ¤   ¤   ¤   ¤   pgpAssertAddrValid(singleKeySet, VoidAlign);
8ba217 ¤   ¤   ¤   ¤   err = PGPAddKeys(singleKeySet, keysToExport);
f26f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
070a8e ¤   ¤   ¤   ¤   err = PGPCommitKeyRingChanges(keysToExport);
d53ed2 ¤   ¤   ¤   ¤   if(IsPGPError(err))
e004c9 ¤   ¤   ¤   ¤   ¤   ReportPGPError(err);
1422eb ¤   ¤   ¤   ¤   PGPFreeKeySet(singleKeySet);
9d131a ¤   ¤   ¤   ¤   keyCount++;
9ea3a6 ¤   ¤   ¤   }
370fe4 ¤   ¤   }
7f9371 ¤   }
0b3a43 ¤   if((keyCount > 0) )
d1c7a1 ¤   {
27186e ¤   ¤   void¤   ¤   ¤   *keyBuffer;
cdcec3 ¤   ¤   UInt32¤ ¤   ¤   keyBufferLen;
2d2a24 ¤   ¤   char¤   ¤   ¤   comment[256];
571f6e ¤   ¤   PGPBoolean¤ ¤   compat;
9b1b52 ¤   ¤
a36ce0 ¤   ¤   comment[0] = 0;
93be29 #if PGP_BUSINESS_SECURITY
30cfab ¤   ¤   PGPGetPrefStringBuffer(
a28bf9 ¤   ¤   ¤   ¤   gAdminPrefRef,
e0e829 ¤   ¤   ¤   ¤   kPGPPrefComments,
25c510 ¤   ¤   ¤   ¤   sizeof(comment), comment);
4a97b2 #endif¤ // PGP_BUSINESS_SECURITY
603644 ¤   ¤   if(comment[0] == 0)
c14457 ¤   ¤   ¤   PGPGetPrefStringBuffer(
18573f ¤   ¤   ¤   ¤   ¤   gPrefRef,
bf7676 ¤   ¤   ¤   ¤   ¤   kPGPPrefComment,
c575a5 ¤   ¤   ¤   ¤   ¤   sizeof( comment ), comment);
ec1b52 ¤   ¤
1e46d5 ¤   ¤   PGPGetPrefBoolean( gPrefRef, kPGPPrefExportKeysCompatible,
fbb452 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &compat );
cc1b52 ¤   ¤
1bdbfe ¤   ¤   /* let SDK export to a buffer it creates itself */
--2f34 000614782d7401201b3 Page 50 of CKeyTable.cp
bbeccc ¤   ¤   err = PGPExportKeySet(keysToExport,
6aa471 ¤   ¤   ¤   PGPOAllocatedOutputBuffer( gPGPContext,
ad43d7 ¤   ¤   ¤   ¤   &keyBuffer, MAX_PGPUInt32, &keyBufferLen ),
17e809 ¤   ¤   ¤   PGPOVersionString( gPGPContext, pgpVersionHeaderString),
1f7b18 ¤   ¤   ¤   PGPOCommentString( gPGPContext, comment),
6f0553 ¤   ¤   ¤   compat ?
7e2a55 ¤   ¤   ¤   ¤   PGPOExportFormat( gPGPContext, kPGPExportFormat_Basic ) :
e9b3d3 ¤   ¤   ¤   ¤   PGPOExportFormat( gPGPContext, kPGPExportFormat_Complete ),
4931c3 ¤   ¤   ¤   PGPOLastOption( gPGPContext ));
10f424 ¤   ¤   pgpAssert(!err);
b386f8 ¤   ¤   if( IsntPGPError( err ) )
5e5b34 ¤   ¤   {
e73586 ¤   ¤   ¤   ::PutScrap(keyBufferLen, 'TEXT', keyBuffer);
7587c7 ¤   ¤   ¤
966528 ¤   ¤   ¤   PGPFreeData( keyBuffer );
b90fe4 ¤   ¤   }
089371 ¤   }
ddb654 ¤   PGPFreeKeySet(keysToExport);
a7efe6 }
b6af5a
056d52 ¤   void
f054f3 CKeyTable::ToggleColumn(Int16 columnID)
7dbb36 {
8a5b6c ¤   Int16¤  columnIndex,
eeac28 ¤   ¤   ¤   oldColumn;
d99d5b ¤   Boolean¤found = false;
a867c5 ¤
bc9fe4 ¤   for(columnIndex = 0; columnIndex < mColumnInfo.numActiveColumns;
25505d ¤   ¤   columnIndex++)
09c7a1 ¤   {
562e50 ¤   ¤   if(mColumnInfo.columns[columnIndex] == columnID)
545b34 ¤   ¤   {
a6862d ¤   ¤   ¤   oldColumn = columnIndex;
8b515d ¤   ¤   ¤   found = true;
a8cdcb ¤   ¤   ¤   break;
d00fe4 ¤   ¤   }
c49371 ¤   }
cd67c5 ¤
ac45a7 ¤   if(found)
d1c7a1 ¤   {
5f59a8 ¤   ¤   found = false;
cd9892 ¤   ¤   for(columnIndex = 0; columnIndex < mColumnInfo.numActiveColumns;
05b2bc ¤   ¤   ¤   columnIndex++)
765b34 ¤   ¤   {
86fa88 ¤   ¤   ¤   if(found)
f21196 ¤   ¤   ¤   ¤   mColumnInfo.columns[columnIndex - 1] =
b94e8d ¤   ¤   ¤   ¤   ¤   mColumnInfo.columns[columnIndex];
b80883 ¤   ¤   ¤   else if(mColumnInfo.columns[columnIndex] == columnID)
e5d809 ¤   ¤   ¤   ¤   found = true;
fa0fe4 ¤   ¤   }
90b112 ¤   ¤   mColumnInfo.numActiveColumns --;
deb869 ¤   ¤   RemoveCols(1, oldColumn + 1, false);
1b9371 ¤   }
670e24 ¤   else
81c7a1 ¤   {
cf87f2 ¤   ¤   mColumnInfo.columns[mColumnInfo.numActiveColumns] =
d111c2 ¤   ¤   ¤   columnID;
84588f ¤   ¤   InsertCols(1, mColumnInfo.numActiveColumns, NULL, 0, false);
702c51 ¤   ¤   mColumnInfo.numActiveColumns ++;
2e7323 ¤   ¤   mColumnInfo.columnWidths[columnID] =
233502 ¤   ¤   ¤   ¤   kDefaultColumnInfo.columnWidths[columnID];
487b7a ¤   ¤   SetColWidth(mColumnInfo.columnWidths[columnID],
1e0b91 ¤   ¤   ¤   mColumnInfo.numActiveColumns, mColumnInfo.numActiveColumns);
8b9371 ¤   }
cac46d ¤   RedrawTable();
72711f ¤   mKeyLabels->AdjustLabelSizes();
42abfb ¤   SaveColumnInfo();
a8efe6 }
6caf5a
626ba8 typedef struct SFInfo
e4bb36 {
61e9e4 ¤   StandardFileReply¤  ¤   ¤   sfReply;
--c86f 00056366ac0401201b3 Page 51 of CKeyTable.cp
781add ¤   DialogPtr¤  ¤   ¤   ¤   ¤   dialog;
b247e5 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   exportPrivate;
978e95 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   complete;
7b81a8 } SFInfo;
12af5a
7d7353 enum
2bbb36 {
8353e6 ¤   kExportPrivateCheckboxItem¤ = 13,
96d151 ¤   kCompleteExportCheckboxItem¤= 14
2f82f7 };
41af5a
e16867 ¤   static pascal short
310993 ExportDialogHook(short item, DialogPtr dialog, SFInfo *sfInfo)
68bb36 {
b363e1 ¤   pgpAssertAddrValid( dialog, DialogRecord );
a0a538 ¤   pgpAssertAddrValid( sfInfo, SFInfo );
89af5a
ceb7f1 ¤   if( IsNull( sfInfo->dialog ) || ( sfInfo->dialog == dialog ) )
bd217e ¤   ¤   switch( item )
bd5b34 ¤   ¤   {
8aefea ¤   ¤   ¤   case kExportPrivateCheckboxItem:
b2f776 ¤   ¤   ¤   {
fc5c6c ¤   ¤   ¤   ¤   sfInfo->exportPrivate = ToggleDialogCheckbox( dialog,
cfe080 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kExportPrivateCheckboxItem );
20e56f ¤   ¤   ¤   ¤   item = sfHookNullEvent;
89f622 ¤   ¤   ¤   ¤   break;
96a3a6 ¤   ¤   ¤   }
6ce768 ¤   ¤   ¤   case kCompleteExportCheckboxItem:
9df776 ¤   ¤   ¤   {
42acf7 ¤   ¤   ¤   ¤   sfInfo->complete = ToggleDialogCheckbox( dialog,
72a248 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCompleteExportCheckboxItem );
2fe56f ¤   ¤   ¤   ¤   item = sfHookNullEvent;
a5f622 ¤   ¤   ¤   ¤   break;
c4a3a6 ¤   ¤   ¤   }
3bfb18 ¤   ¤   ¤   case sfHookFirstCall:
aa28d7 ¤   ¤   ¤   ¤   if( IsNull( sfInfo->dialog ) )
bf72c3 ¤   ¤   ¤   ¤   {
bcfd0d ¤   ¤   ¤   ¤   ¤   sfInfo->dialog = dialog;
567ab4 ¤   ¤   ¤   ¤   ¤   if( sfInfo->complete )
4bf6fa ¤   ¤   ¤   ¤   ¤   ¤   ToggleDialogCheckbox( dialog,
6b4f6f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCompleteExportCheckboxItem );
146d09 ¤   ¤   ¤   ¤   ¤   item = sfHookNullEvent;
632613 ¤   ¤   ¤   ¤   }
69f622 ¤   ¤   ¤   ¤   break;
740fe4 ¤   ¤   }
a4e2ea ¤   return item;
70efe6 }
b5af5a
7d6d52 ¤   void
4ae713 CKeyTable::ExportSelected()
1bbb36 {
9b8f52 ¤   PGPError¤   ¤   ¤   err;
a924e9 ¤   TableIndexT¤¤   ¤   numRows, numCols;
3478c8 ¤   DlgHookYDUPP¤   ¤   cbHook;
32ce8a ¤   static Point¤   ¤   where={0,0};
e0f621 ¤   GetTableSize(numRows, numCols);
6c67c5 ¤
166b4f ¤   STableCell¤ topCell(1, 1);
27881e ¤   STableCell ¤botCell(numRows, 1);
5f9874 ¤   STableCell¤ cell;
4667c5 ¤
7bebcb ¤   SFInfo¤ ¤   ¤   ¤   sfInfo;
40db7c ¤   Str255¤ ¤   ¤   ¤   exportPrompt,
79ffc6 ¤   ¤   ¤   ¤   ¤   ¤   exportFilename;
ea613d ¤   PGPBoolean¤ ¤   ¤   boolPref;
4867c5 ¤
fb7b30 ¤   GetIndString(exportPrompt, kStringListID, kExportKeysPromptID);
910c65 ¤   GetIndString(exportFilename, kStringListID, kExportKeysDefaultNameID);
e067c5 ¤
81460b ¤   PGPGetPrefBoolean( gPrefRef, kPGPPrefExportKeysCompatible, &boolPref );
b1bbeb ¤   sfInfo.complete¤¤   ¤   = !boolPref;
5683ae ¤   sfInfo.exportPrivate¤   = FALSE;
--cc90 0001f43aff7401201b3 Page 52 of CKeyTable.cp
c760fc ¤   sfInfo.dialog¤  ¤   ¤   = NULL;
0067c5 ¤
377fd8 ¤   cbHook ¤¤   = NewDlgHookYDProc( ExportDialogHook );
34af5a
74fb29 ¤   UDesktop::Deactivate();
5ef1d7 ¤   CustomPutFile(exportPrompt, exportFilename, &sfInfo.sfReply,
6721cc ¤   ¤   ¤   ¤   ¤   kExportCustomPutDialog, where, cbHook, NULL, NULL,
6606f9 ¤   ¤   ¤   ¤   ¤   NULL, &sfInfo);
3c5824 ¤   UDesktop::Activate();
f0af5a
c0a52d ¤   DisposeRoutineDescriptor( cbHook );
f867c5 ¤
c867c5 ¤
c217d7 ¤   if(sfInfo.sfReply.sfGood)
4dc7a1 ¤   {
4c28d5 ¤   ¤   PGPFileSpecRef¤ ¤   pgpFileRef = kInvalidPGPFileSpecRef;
1faa17 ¤   ¤   PGPKeySetRef¤   ¤   keysToExport = kInvalidPGPKeySetRef;
e61ac4 ¤   ¤   Int32¤  ¤   ¤   ¤   keysExported = 0;
ab1b52 ¤   ¤
bc61b5 ¤   ¤   FSpDelete( &sfInfo.sfReply.sfFile );
32de3d ¤   ¤   err = PGPNewFileSpecFromFSSpec(gPGPContext, &sfInfo.sfReply.sfFile,
5b138a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &pgpFileRef);
d4e919 ¤   ¤   pgpAssertNoErr(err);
f1e83c ¤   ¤   if(PGPFileSpecRefIsValid(pgpFileRef))
cf5b34 ¤   ¤   {
1383fc ¤   ¤   ¤   err = PGPNewEmptyKeySet(mKeySet, &keysToExport);
54524f ¤   ¤   ¤   pgpAssertNoErr(err);
6edcb0 ¤   ¤   ¤   if(PGPKeySetRefIsValid(keysToExport))
d3f776 ¤   ¤   ¤   {
839300 ¤   ¤   ¤   ¤   for(cell = botCell; cell.row >= topCell.row; cell.row--)·
0f72c3 ¤   ¤   ¤   ¤   {
0c2206 ¤   ¤   ¤   ¤   ¤   if(CellIsSelected(cell))·
884859 ¤   ¤   ¤   ¤   ¤   {
44cce5 ¤   ¤   ¤   ¤   ¤   ¤   TableIndexT¤¤   inWideOpenRow =
f2d855 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetWideOpenIndex(cell.row);
1fd8c2 ¤   ¤   ¤   ¤   ¤   ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
3a9bad ¤   ¤   ¤   ¤   ¤   ¤   KeyTableRef¤¤   keyRef;
3f4352 ¤   ¤   ¤   ¤   ¤   ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
e4c8d2 ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   oldKeys = keysToExport;
12effa ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   oneKey;
dd94aa ¤   ¤   ¤   ¤   ¤   ¤
258c2a ¤   ¤   ¤   ¤   ¤   ¤   GetCellData(woCell, &keyRef, dataSize);
c864ff ¤   ¤   ¤   ¤   ¤   ¤   err = PGPNewSingletonKeySet(keyRef.ownerKey, &oneKey);
f26c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
ff20b2 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPUnionKeySets(oldKeys, oneKey, &keysToExport);
426c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
e5334a ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet(oldKeys);
d43b10 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet(oneKey);
d69dac ¤   ¤   ¤   ¤   ¤   ¤   keysExported++;
d81c89 ¤   ¤   ¤   ¤   ¤   }
b02613 ¤   ¤   ¤   ¤   }
84e61c ¤   ¤   ¤   ¤   if(keysExported > 0)
8772c3 ¤   ¤   ¤   ¤   {
8f0059 ¤   ¤   ¤   ¤   ¤   char comment[256];
cfae30 ¤   ¤   ¤   ¤   ¤
e7bc27 ¤   ¤   ¤   ¤   ¤   comment[0] = 0;
87377d ¤   #if PGP_BUSINESS_SECURITY
e40964 ¤   ¤   ¤   ¤   ¤   PGPGetPrefStringBuffer(
314839 ¤   ¤   ¤   ¤   ¤   ¤   ¤   gAdminPrefRef,
750271 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefComments,
a29d1d ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(comment), comment);
acaada ¤   #endif¤ // PGP_BUSINESS_SECURITY
b7d5b3 ¤   ¤   ¤   ¤   ¤   if(comment[0] == 0)
a61134 ¤   ¤   ¤   ¤   ¤   ¤   PGPGetPrefStringBuffer(
f5b3aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPrefRef,
d227be ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefComment,
646f38 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( comment ), comment);
3222a6 ¤   ¤   ¤   ¤   ¤   err = PGPExportKeySet( keysToExport,
f57a9d ¤   ¤   ¤   ¤   ¤   ¤   PGPOOutputFile(gPGPContext, pgpFileRef),
8f7b1c ¤   ¤   ¤   ¤   ¤   ¤   PGPOExportPrivateKeys(gPGPContext,
3a1a98 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sfInfo.exportPrivate),
1fc488 ¤   ¤   ¤   ¤   ¤   ¤   PGPOVersionString(gPGPContext,
--05f2 000242fe6a3401201b3 Page 53 of CKeyTable.cp
73dd1c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpVersionHeaderString),
7bb04e ¤   ¤   ¤   ¤   ¤   ¤   PGPOCommentString(gPGPContext, comment),
568d44 ¤   ¤   ¤   ¤   ¤   ¤   sfInfo.complete ?
6a165b ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOExportFormat(gPGPContext,
4e3341 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPExportFormat_Complete ) :
752677 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOExportFormat( gPGPContext,
78ea30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPExportFormat_Basic ),
67dc36 ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption(gPGPContext));
056aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
ed2613 ¤   ¤   ¤   ¤   }
fffa07 ¤   ¤   ¤   ¤   else
8415a1 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(kWANoteAlertType, kWAOKStyle,
d859b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kNoKeyToExportID);
988869 ¤   ¤   ¤   ¤   PGPFreeKeySet(keysToExport);
2ba3a6 ¤   ¤   ¤   }
7f517c ¤   ¤   ¤   PGPFreeFileSpec(pgpFileRef);
8c0fe4 ¤   ¤   }
fd9371 ¤   }
7fefe6 }
0aaf5a
4f6d52 ¤   void
9553b8 CKeyTable::BuildServerSubmenu()
25bb36 {
c284f0 ¤   MenuHandle¤ ¤   ¤   serverMenu;
fa9799 ¤   Int16¤  ¤   ¤   ¤   numItems;
aed603 ¤   PGPKeyServerEntry¤  *ksEntries;
624043 ¤   PGPUInt32¤  ¤   ¤   ksCount;
a18f52 ¤   PGPError¤   ¤   ¤   err;
ce67c5 ¤
c5bb68 ¤   serverMenu = ::GetMenuHandle(kSendToServerMENUID);
3bd6ec ¤   if(IsntNull(serverMenu))
43c7a1 ¤   {
99ac98 ¤   ¤   numItems = ::CountMItems(serverMenu);
83f60c ¤   ¤   while(numItems > 2)
adde63 ¤   ¤   ¤   ::DeleteMenuItem(serverMenu, numItems--);
de7211 ¤   ¤   err = PGPGetKeyServerPrefs(gPrefRef, &ksEntries, &ksCount);
d7e919 ¤   ¤   pgpAssertNoErr(err);
c74184 ¤   ¤   if(IsntPGPError(err))
865b34 ¤   ¤   {
f0c6bc ¤   ¤   ¤   for(Int16 ksInx = 0; ksInx < ksCount; ksInx++)
f9f776 ¤   ¤   ¤   {
94e776 ¤   ¤   ¤   ¤   if(IsKeyServerListed(ksEntries[ksInx].flags))
4a72c3 ¤   ¤   ¤   ¤   {
f1846d ¤   ¤   ¤   ¤   ¤   Str255¤ menuStr;
ffd20c ¤   ¤   ¤   ¤   ¤   char¤   url[kMaxServerNameLength + 1];
a1ae30 ¤   ¤   ¤   ¤   ¤
ea73d8 ¤   ¤   ¤   ¤   ¤   PGPGetKeyServerURL( &ksEntries[ksInx], url );
4f4d36 ¤   ¤   ¤   ¤   ¤   CToPString( url, menuStr );
69608a ¤   ¤   ¤   ¤   ¤   ::InsertMenuItem(serverMenu, "\pA", 0x6FFF);
5f1877 ¤   ¤   ¤   ¤   ¤   ::SetMenuItemText(serverMenu, ++numItems, menuStr);
5e2613 ¤   ¤   ¤   ¤   }
35a3a6 ¤   ¤   ¤   }
d1d269 ¤   ¤   ¤   PGPDisposePrefData(gPrefRef, ksEntries);
570fe4 ¤   ¤   }
bd9371 ¤   }
d6efe6 }
a4af5a
b9c744 ¤   PGPError
768761 CKeyTable::GetMetaIntroducers(
1e2db3 ¤   PGPKeySetRef¤   ¤   *metaKeys )
85bb36 {
4f7d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
4f227e ¤   PGPBoolean¤ ¤   ¤   noMargValid;
63c760 ¤   PGPUInt32¤  ¤   ¤   validThreshold;
44c285 ¤   PGPKeySetRef¤   ¤   metaSet = kInvalidPGPKeySetRef,
9586b1 ¤   ¤   ¤   ¤   ¤   ¤   singleSet = kInvalidPGPKeySetRef;
a2998a ¤   PGPKeyListRef¤  ¤   keyList = kInvalidPGPKeyListRef;
561670 ¤   PGPKeyIterRef¤  ¤   keyIter = kInvalidPGPKeyIterRef;
d523e3 ¤   PGPKeyRef¤  ¤   ¤   key;
9a67c5 ¤
aaa0e0 ¤   *metaKeys = NULL;
2437d3 ¤   PGPGetPrefBoolean( gPrefRef, kPGPPrefMarginalIsInvalid, &noMargValid );
--1eb4 00095e5dbcf401201b3 Page 54 of CKeyTable.cp
f13f2d ¤   if( noMargValid )
583748 ¤   ¤   validThreshold = kPGPValidity_Complete;
da0e24 ¤   else
b197fe ¤   ¤   validThreshold = kPGPValidity_Marginal;
c5f25c ¤   err = PGPNewKeySet( gPGPContext, &metaSet );¤   CKERR;
8e5555 ¤   err = PGPOrderKeySet( mKeySet, kPGPAnyOrdering, &keyList ); CKERR;
43857d ¤   err = PGPNewKeyIter( keyList, &keyIter ); CKERR;
3367c5 ¤
62509a ¤   while(¤ IsntPGPError( PGPKeyIterNext( keyIter, &key ) ) &&
996e28 ¤   ¤   ¤   PGPKeyRefIsValid( key ) )
b5c7a1 ¤   {
317240 ¤   ¤   PGPBoolean¤ ¤   expired,
de5a1d ¤   ¤   ¤   ¤   ¤   ¤   revoked,
d308e9 ¤   ¤   ¤   ¤   ¤   ¤   disabled;
fcaee2 ¤   ¤   PGPValidity¤¤   validity;
aeae2e ¤   ¤   PGPUserIDRef¤   userID;
381b52 ¤   ¤
4e86e3 ¤   ¤   PGPGetKeyBoolean( key, kPGPKeyPropIsExpired, &expired );
45d31c ¤   ¤   PGPGetKeyBoolean( key, kPGPKeyPropIsRevoked, &revoked );
8450e8 ¤   ¤   PGPGetKeyBoolean( key, kPGPKeyPropIsDisabled, &disabled );
cd956b ¤   ¤   PGPGetPrimaryUserIDValidity( key, &validity );
d21b52 ¤   ¤
dfc265 ¤   ¤   if( !expired && !revoked && !disabled && validity >= validThreshold )
905b34 ¤   ¤   {
3d8628 ¤   ¤   ¤   while(¤ IsntPGPError(
1b2660 ¤   ¤   ¤   ¤   ¤   PGPKeyIterNextUserID( keyIter, &userID ) ) &&
707c22 ¤   ¤   ¤   ¤   ¤   PGPUserIDRefIsValid( userID ) )
def776 ¤   ¤   ¤   {
230d04 ¤   ¤   ¤   ¤   PGPSigRef¤  sig;
532b85 ¤   ¤   ¤   ¤
8a10dc ¤   ¤   ¤   ¤   while( IsntPGPError(
9b8a7c ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyIterNextUIDSig( keyIter, &sig ) ) &&
909364 ¤   ¤   ¤   ¤   ¤   ¤   PGPSigRefIsValid( sig ) )
c172c3 ¤   ¤   ¤   ¤   {
0388aa ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ exportable;
89c98f ¤   ¤   ¤   ¤   ¤   PGPInt32¤   sigTrust;
94ae30 ¤   ¤   ¤   ¤   ¤
d83e8f ¤   ¤   ¤   ¤   ¤   PGPGetSigBoolean( sig, kPGPSigPropIsRevoked, &revoked );
c103d1 ¤   ¤   ¤   ¤   ¤   PGPGetSigBoolean( sig, kPGPSigPropIsExportable,
9c7ba1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &exportable );
f522db ¤   ¤   ¤   ¤   ¤   PGPGetSigNumber( sig, kPGPSigPropTrustLevel, &sigTrust );
00af5a
280199 ¤   ¤   ¤   ¤   ¤   if ( !revoked && !exportable && ( sigTrust == 2 ) )
344859 ¤   ¤   ¤   ¤   ¤   {
ba83ca ¤   ¤   ¤   ¤   ¤   ¤   err = PGPNewSingletonKeySet( key, &singleSet ); CKERR;
bef699 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPAddKeys( singleSet, metaSet ); CKERR;
f2a095 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPCommitKeyRingChanges( metaSet ); CKERR;
8ef89c ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( singleSet );
c486b1 ¤   ¤   ¤   ¤   ¤   ¤   singleSet = kInvalidPGPKeySetRef;
601c89 ¤   ¤   ¤   ¤   ¤   }
aa2613 ¤   ¤   ¤   ¤   }
0da3a6 ¤   ¤   ¤   }
b50fe4 ¤   ¤   }
119371 ¤   }
0d1c96 ¤   *metaKeys = metaSet;
ae0e73 ¤   metaSet = kInvalidPGPKeySetRef;
36b38c done:
9e1c10 ¤   if( PGPKeySetRefIsValid( metaSet ) )
26f8a2 ¤   ¤   PGPFreeKeySet( metaSet );
2b3b6f ¤   if( PGPKeySetRefIsValid( singleSet ) )
813bbe ¤   ¤   PGPFreeKeySet( singleSet );
26d0ad ¤   if( PGPKeyListRefIsValid( keyList ) )
506efb ¤   ¤   PGPFreeKeyList( keyList );
03d661 ¤   if( PGPKeyIterRefIsValid( keyIter ) )
fb10a7 ¤   ¤   PGPFreeKeyIter( keyIter );
8e5ea8 ¤   return err;
f6efe6 }
ffaf5a
096d52 ¤   void
817931 CKeyTable::UpdateIntroducers()
4ebb36 {
955cca ¤   PGPError¤   ¤   ¤   ¤   ¤   ¤   err = kPGPError_NoErr;
--b882 0001f93b63a401201b3 Page 55 of CKeyTable.cp
ddb3ae ¤   PGPKeySetRef¤   ¤   ¤   ¤   ¤   metaSet¤¤   = kInvalidPGPKeySetRef,
e16547 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   foundSet¤   = kInvalidPGPKeySetRef,
afad86 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   singleKey¤  = kInvalidPGPKeySetRef;
10c2c0 ¤   PGPKeyListRef¤  ¤   ¤   ¤   ¤   keyList¤¤   = kInvalidPGPKeyListRef,
c88c0a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signedList¤ = kInvalidPGPKeyListRef;
666684 ¤   PGPKeyIterRef¤  ¤   ¤   ¤   ¤   keyIter¤¤   = kInvalidPGPKeyIterRef,
51c937 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   signedIter¤ = kInvalidPGPKeyIterRef;
757b70 ¤   PGPFilterRef¤   ¤   ¤   ¤   ¤   filter¤ ¤   = kInvalidPGPFilterRef;
850aee ¤   PGPKeyServerRef¤¤   ¤   ¤   ¤   rootRef¤¤   = kInvalidPGPKeyServerRef;
9ffd83 ¤   PGPKeyRef¤  ¤   ¤   ¤   ¤   ¤   key;
03cf39 ¤   PGPKeyServerEntry¤  ¤   ¤   ¤   rootServer;
6c42bc ¤   PGPKeyServerSpec¤   ¤   ¤   ¤   ksSpec;
bb73c2 ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   ¤   keyCount;
4a5a81 ¤   StPGPPreserveKeyServerStorage¤  keyserverStorage;
acaf5a
7167c5 ¤
8acca9 ¤   err = PGPGetRootKeyServer( gPrefRef, &rootServer );
63fd05 ¤   if( err == kPGPError_ItemNotFound )
f2c7a1 ¤   {
2d75b4 ¤   ¤   CWarningAlert::Display( kWACautionAlertType, kWAOKStyle,
13c44d ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kNoRootServerID );
5070bb ¤   ¤   err = kPGPError_NoErr;
6f262d ¤   ¤   goto done;
889371 ¤   }
b64339 ¤   CKERR;
3c78ae ¤   err = PGPNewKeyServerFromHostName( gPGPContext,
f0f18c ¤   ¤   ¤   ¤   rootServer.serverDNS,
94792c ¤   ¤   ¤   ¤   rootServer.serverPort,
09df6a ¤   ¤   ¤   ¤   rootServer.protocol,
801e20 ¤   ¤   ¤   ¤   kPGPKeyServerAccessType_Normal,
efe8d6 ¤   ¤   ¤   ¤   kPGPKeyServerKeySpace_Normal,
dbd4bc ¤   ¤   ¤   ¤   &rootRef );¤CKERR;
17d16e ¤   pgpClearMemory( &ksSpec, sizeof(PGPKeyServerSpec) );
734d72 ¤   ksSpec.server¤  ¤   = rootRef;
6467c5 ¤
966f5f ¤   err = GetMetaIntroducers( &metaSet ); CKERR;
de67c5 ¤
eee90e ¤   err = PGPCountKeys( metaSet, &keyCount );¤  CKERR;
939ff6 ¤   // Update each meta-introducer from the appropriate server
aa03c5 ¤   err = PGPOrderKeySet( metaSet, kPGPAnyOrdering, &keyList ); CKERR;
51857d ¤   err = PGPNewKeyIter( keyList, &keyIter ); CKERR;
98509a ¤   while(¤ IsntPGPError( PGPKeyIterNext( keyIter, &key ) ) &&
046e28 ¤   ¤   ¤   PGPKeyRefIsValid( key ) )
f8c7a1 ¤   {
4b7884 ¤   ¤   err = PGPSearchKeyServerDialog( gPGPContext,
0567a8 ¤   ¤   ¤   ¤   1, &ksSpec, gTLSContext, FALSE, &foundSet,
b67d2b ¤   ¤   ¤   ¤   PGPOUIKeyServerSearchKey( gPGPContext, key ),
bc6f55 ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
3e19b8 ¤   ¤   if( err == kPGPError_UserAbort )
c85b34 ¤   ¤   {
36fcc4 ¤   ¤   ¤   err = kPGPError_NoErr;
3a1dc4 ¤   ¤   ¤   goto done;
050fe4 ¤   ¤   }
5dd223 ¤   ¤   if( IsPGPError( err ) )
82b45d ¤   ¤   ¤   ReportPGPError( err );
1e0362 ¤   ¤   if( PGPKeySetRefIsValid( foundSet ) )
e05b34 ¤   ¤   {
9d25b7 ¤   ¤   ¤   err = PGPAddKeys( foundSet, mKeySet );¤ CKERR;
968d00 ¤   ¤   ¤   CommitKeySet();
5ecf10 ¤   ¤   ¤   PGPFreeKeySet( foundSet );
7b6e22 ¤   ¤   ¤   foundSet = kInvalidPGPKeySetRef;
6f0fe4 ¤   ¤   }
189371 ¤   }
560191 ¤   CommitKeySet();
dc67c5 ¤
820e28 ¤   // Find all the trust==1 keys signed by each meta-introducer
fa179f ¤   err = PGPKeyIterRewind( keyIter );¤ CKERR;
1b509a ¤   while(¤ IsntPGPError( PGPKeyIterNext( keyIter, &key ) ) &&
3d6e28 ¤   ¤   ¤   PGPKeyRefIsValid( key ) )
a0c7a1 ¤   {
3c447c ¤   ¤   PGPKeyID¤   ¤   ¤   keyIDMeta;
1f1b52 ¤   ¤
--e502 000a1c6a5a1401201b3 Page 56 of CKeyTable.cp
957441 ¤   ¤   err = PGPGetKeyIDFromKey( key, &keyIDMeta );¤   CKERR;
58dfa1 ¤   ¤   err = PGPNewSigKeyIDFilter( gPGPContext, &keyIDMeta, &filter ); CKERR;
461b52 ¤   ¤
cb6ce4 ¤   ¤   err = PGPSearchKeyServerDialog( gPGPContext, 1, &ksSpec, gTLSContext,
0b7139 ¤   ¤   ¤   ¤   ¤   ¤   FALSE, &foundSet,
8dbdc9 ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIKeyServerSearchFilter( gPGPContext, filter ),
b9537d ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
c019b8 ¤   ¤   if( err == kPGPError_UserAbort )
3b5b34 ¤   ¤   {
0afcc4 ¤   ¤   ¤   err = kPGPError_NoErr;
f91dc4 ¤   ¤   ¤   goto done;
060fe4 ¤   ¤   }
27d223 ¤   ¤   if( IsPGPError( err ) )
a2b45d ¤   ¤   ¤   ReportPGPError( err );
6e46f4 ¤   ¤   PGPFreeFilter( filter );
eafa48 ¤   ¤   filter = kInvalidPGPFilterRef;
f70362 ¤   ¤   if( PGPKeySetRefIsValid( foundSet ) )
8b5b34 ¤   ¤   {
6a1229 ¤   ¤   ¤   err = PGPOrderKeySet( foundSet, kPGPAnyOrdering, &signedList );
8bc020 ¤   ¤   ¤   CKERR;
50f1eb ¤   ¤   ¤   err = PGPNewKeyIter( signedList, &signedIter ); CKERR;
6b87c7 ¤   ¤   ¤
4be697 ¤   ¤   ¤   while(¤ IsntPGPError( PGPKeyIterNext( signedIter, &key ) ) &&
e66b03 ¤   ¤   ¤   ¤   ¤   PGPKeyRefIsValid( key ) )
9ff776 ¤   ¤   ¤   {
68e087 ¤   ¤   ¤   ¤   PGPUserIDRef¤   userID;
8c6a79 ¤   ¤   ¤   ¤   Boolean¤¤   ¤   metaSigned = FALSE;
9e2b85 ¤   ¤   ¤   ¤
47ca47 ¤   ¤   ¤   ¤   while(¤ !metaSigned && IsntPGPError(
cf6316 ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyIterNextUserID( signedIter, &userID ) ) &&
7b298e ¤   ¤   ¤   ¤   ¤   ¤   PGPUserIDRefIsValid( userID ) )
d472c3 ¤   ¤   ¤   ¤   {
8b306c ¤   ¤   ¤   ¤   ¤   PGPSigRef¤  sig;
c8ae30 ¤   ¤   ¤   ¤   ¤
751531 ¤   ¤   ¤   ¤   ¤   while( IsntPGPError(
5799f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyIterNextUIDSig( keyIter, &sig ) ) &&
733d65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSigRefIsValid( sig ) )
e64859 ¤   ¤   ¤   ¤   ¤   {
f343bb ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyID¤   signerID;
b090fa ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ exportable;
7bf04a ¤   ¤   ¤   ¤   ¤   ¤   PGPInt32¤   sigTrust;
f594aa ¤   ¤   ¤   ¤   ¤   ¤
4c3d37 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyIDOfCertifier( sig, &signerID ); CKERR;
fe70c5 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetSigBoolean( sig, kPGPSigPropIsExportable,
badbbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &exportable );¤ CKERR;
e755d5 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetSigNumber( sig, kPGPSigPropTrustLevel,
3c8b4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &sigTrust );¤   CKERR;
5594aa ¤   ¤   ¤   ¤   ¤   ¤
4f2368 ¤   ¤   ¤   ¤   ¤   ¤   if( exportable && ( sigTrust == 1 ) &&
adf38d ¤   ¤   ¤   ¤   ¤   ¤   ¤   !PGPCompareKeyIDs( &keyIDMeta, &signerID ) )
168fec ¤   ¤   ¤   ¤   ¤   ¤   {
822fe5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   metaSigned = TRUE;
a85a3c ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPNewSingletonKeySet( key, &singleKey );
15817f ¤   ¤   ¤   ¤   ¤   ¤   ¤   CKERR;
e23d21 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPAddKeys( singleKey, mKeySet );¤CKERR;
70ba61 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( singleKey );
a41fce ¤   ¤   ¤   ¤   ¤   ¤   ¤   singleKey = kInvalidPGPKeySetRef;
4b8c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
4edb3c ¤   ¤   ¤   ¤   ¤   ¤   }
471c89 ¤   ¤   ¤   ¤   ¤   }
e22613 ¤   ¤   ¤   ¤   }
06a3a6 ¤   ¤   ¤   }
5a8d00 ¤   ¤   ¤   CommitKeySet();
ac87c7 ¤   ¤   ¤
4d4ff1 ¤   ¤   ¤   PGPFreeKeyList( signedList );
d163be ¤   ¤   ¤   signedList = kInvalidPGPKeyListRef;
b4046e ¤   ¤   ¤   PGPFreeKeyIter( signedIter );
1669ff ¤   ¤   ¤   signedIter = kInvalidPGPKeyIterRef;
24cf10 ¤   ¤   ¤   PGPFreeKeySet( foundSet );
e96e22 ¤   ¤   ¤   foundSet = kInvalidPGPKeySetRef;
a80fe4 ¤   ¤   }
a19371 ¤   }
--f86b 000328c8d8b401201b3 Page 57 of CKeyTable.cp
d8b38c done:
1d1c10 ¤   if( PGPKeySetRefIsValid( metaSet ) )
6bf8a2 ¤   ¤   PGPFreeKeySet( metaSet );
f13aa7 ¤   if( PGPKeySetRefIsValid( foundSet ) )
2b8ee3 ¤   ¤   PGPFreeKeySet( foundSet );
877874 ¤   if( PGPKeySetRefIsValid( singleKey ) )
d32cef ¤   ¤   PGPFreeKeySet( singleKey );
4dd0ad ¤   if( PGPKeyListRefIsValid( keyList ) )
b26efb ¤   ¤   PGPFreeKeyList( keyList );
45d661 ¤   if( PGPKeyIterRefIsValid( keyIter ) )
6410a7 ¤   ¤   PGPFreeKeyIter( keyIter );
9321aa ¤   if( PGPKeyListRefIsValid( signedList ) )
da731f ¤   ¤   PGPFreeKeyList( signedList );
b36497 ¤   if( PGPKeyIterRefIsValid( signedIter ) )
753880 ¤   ¤   PGPFreeKeyIter( signedIter );
48468f ¤   if( PGPFilterRefIsValid( filter ) )
cb46f4 ¤   ¤   PGPFreeFilter( filter );
87451f ¤   if( PGPKeyServerRefIsValid( rootRef ) )
6b7abc ¤   ¤   PGPFreeKeyServer( rootRef );
177f7d ¤   if( IsPGPError( err ) )
d33822 ¤   ¤   ReportPGPError( err );
81efe6 }
35af5a
ee7e69 ¤   Boolean
7cae26 CKeyTable::ObeyCommand(
4eea24 ¤   CommandT¤   inCommand,
1e0597 ¤   void¤   ¤   *ioParam)
2bbb36 {
1a5b52 ¤   Boolean¤¤   cmdHandled = true;
e92470 ¤   ResIDT¤ ¤   theMenuID;
bf4020 ¤   Int16¤  ¤   theMenuItem;
9c61e0 ¤   PGPError¤   err;
e3af5a
9c2ee6 ¤   if(IsSyntheticCommand(inCommand, theMenuID, theMenuItem))
3fc7a1 ¤   {
01a7ee ¤   ¤   switch(theMenuID)
f65b34 ¤   ¤   {
430390 ¤   ¤   ¤   case kSendToServerMENUID:
ad626e ¤   ¤   ¤   ¤   if(gServerCallsPresent)
4772c3 ¤   ¤   ¤   ¤   {
501521 ¤   ¤   ¤   ¤   ¤   PGPKeyServerEntry¤  *ksEntries;
282ce3 ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   ksCount;
81ae30 ¤   ¤   ¤   ¤   ¤
d3783b ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyServerPrefs(gPrefRef, &ksEntries,
071474 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &ksCount);
226aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
fea511 ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err))
584859 ¤   ¤   ¤   ¤   ¤   {
8e6cfd ¤   ¤   ¤   ¤   ¤   ¤   theMenuItem -= 3;
12d202 ¤   ¤   ¤   ¤   ¤   ¤   if(theMenuItem < ksCount)
058fec ¤   ¤   ¤   ¤   ¤   ¤   {
5a8b27 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32¤ successfulSends;
626caf ¤   ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ numSendsString;
95531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
beb46e ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTargetKeyServer = &ksEntries[theMenuItem];
305cf9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   successfulSends =·
3113d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SelectionAction(&CKeyTable::SendKeyToServer);
d5ad45 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(successfulSends > 0)
7e06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
31d761 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NumToString(successfulSends, numSendsString);
3eff22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(kWANoteAlertType,
0082c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle, kStringListID,
bba3f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kServerSendSuccessful,
b8f1df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numSendsString);
af5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
625b9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTargetKeyServer = NULL;
67db3c ¤   ¤   ¤   ¤   ¤   ¤   }
6341c6 ¤   ¤   ¤   ¤   ¤   ¤   PGPDisposePrefData(gPrefRef, ksEntries);
b31c89 ¤   ¤   ¤   ¤   ¤   }
7d2613 ¤   ¤   ¤   ¤   }
7cf622 ¤   ¤   ¤   ¤   break;
32db68 ¤   ¤   ¤   default:
--efbf 00018a01aa6401201b3 Page 58 of CKeyTable.cp
ce5cc7 ¤   ¤   ¤   ¤   cmdHandled = LCommander::ObeyCommand(inCommand, ioParam);
9cf622 ¤   ¤   ¤   ¤   break;
090fe4 ¤   ¤   }
2d9371 ¤   }
963e7d ¤   else switch (inCommand)·
c3c7a1 ¤   {
53975b ¤   ¤   case cmd_ViewValidity:
b33c71 ¤   ¤   ¤   ToggleColumn(kValidityColumnID);
b0cdcb ¤   ¤   ¤   break;
b34724 ¤   ¤   case cmd_ViewTrust:
9bbbfc ¤   ¤   ¤   ToggleColumn(kTrustColumnID);
60cdcb ¤   ¤   ¤   break;
79eb22 ¤   ¤   case cmd_ViewSize:
774f90 ¤   ¤   ¤   ToggleColumn(kKeySizeColumnID);
e4cdcb ¤   ¤   ¤   break;
2fd4ba ¤   ¤   case cmd_ViewKeyID:
704120 ¤   ¤   ¤   ToggleColumn(kKeyIDColumnID);
9fcdcb ¤   ¤   ¤   break;
479a75 ¤   ¤   case cmd_ViewCreationDate:
3ef5d8 ¤   ¤   ¤   ToggleColumn(kCreationColumnID);
26cdcb ¤   ¤   ¤   break;
c052fe ¤   ¤   case cmd_ViewExpirationDate:
dc87f2 ¤   ¤   ¤   ToggleColumn(kExpirationColumnID);
23cdcb ¤   ¤   ¤   break;
65a8f7 ¤   ¤   case cmd_ViewMRK:
346678 ¤   ¤   ¤   ToggleColumn(kMRKColumnID);
bccdcb ¤   ¤   ¤   break;
559963 ¤   ¤   case cmd_ViewDescription:
44866b ¤   ¤   ¤   ToggleColumn(kDescriptionColumnID);
9dcdcb ¤   ¤   ¤   break;
478fe9 ¤   ¤   case cmd_Copy:
2c9117 ¤   ¤   ¤   CopyKeys();
43cdcb ¤   ¤   ¤   break;
cc18da ¤   ¤   case cmd_Paste:
565b34 ¤   ¤   {
84ef14 ¤   ¤   ¤   Handle¤ pastedTextH;
363f2e ¤   ¤   ¤   Int32¤  offset,
b2bd1d ¤   ¤   ¤   ¤   ¤   length;
ce87c7 ¤   ¤   ¤
cb9ada ¤   ¤   ¤   length = ::GetScrap(nil, 'TEXT', &offset);
b02b71 ¤   ¤   ¤   pastedTextH = ::NewHandle(length);
6192ee ¤   ¤   ¤   HNoPurge(pastedTextH);
a3d341 ¤   ¤   ¤   if((length = ::GetScrap(pastedTextH, 'TEXT', &offset)) > 0)
01f776 ¤   ¤   ¤   {
203eed ¤   ¤   ¤   ¤   PGPKeySetRef¤   newKeySet;
04a8f4 ¤   ¤   ¤   ¤   uchar¤  ¤   ¤   *pastedChars;
7d2b85 ¤   ¤   ¤   ¤
7141f7 ¤   ¤   ¤   ¤   HLock(pastedTextH);
7db808 ¤   ¤   ¤   ¤   pastedChars = *(uchar **)pastedTextH;
e62b85 ¤   ¤   ¤   ¤
089221 ¤   ¤   ¤   ¤   err = PGPImportKeySet( gPGPContext, &newKeySet,
d82ed7 ¤   ¤   ¤   ¤   ¤   ¤   PGPOInputBuffer( gPGPContext, pastedChars, length ),
f6537d ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
4c94aa ¤   ¤   ¤   ¤   ¤   ¤
91cff4 ¤   ¤   ¤   ¤   if(IsntPGPError(err) && IsntNull(newKeySet))
fa72c3 ¤   ¤   ¤   ¤   {
caea33 ¤   ¤   ¤   ¤   ¤   err = PGPAddKeys(newKeySet, mKeySet);
ee6aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
eaaba2 ¤   ¤   ¤   ¤   ¤   CommitKeySet();
c3bb56 ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet(newKeySet);
ea6812 ¤   ¤   ¤   ¤   ¤   ResyncTable(FALSE, TRUE);
9d4ce4 ¤   ¤   ¤   ¤   ¤   if(mDefaultRing)
e53cda ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->InvalidateCaches();
4b2613 ¤   ¤   ¤   ¤   }
9fa3a6 ¤   ¤   ¤   }
4184ea ¤   ¤   ¤   ::DisposeHandle(pastedTextH);
b4cdcb ¤   ¤   ¤   break;
4c0fe4 ¤   ¤   }
5323a7 ¤   ¤   case cmd_NewKey:
ae5b34 ¤   ¤   {
9c8488 ¤   ¤   ¤   CKeyGenWizardDialog *kgw;
1887c7 ¤   ¤   ¤
--1ac7 0000bb99a05401201b3 Page 59 of CKeyTable.cp
06c04f ¤   ¤   ¤   kgw = (CKeyGenWizardDialog *)
931738 ¤   ¤   ¤   ¤   LWindow::CreateWindow(dialog_KeyGenWizard,
9ab7d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp());
657226 ¤   ¤   ¤   kgw->SetKeyTable(this);
48cdcb ¤   ¤   ¤   break;
000fe4 ¤   ¤   }
03d5b0 ¤   ¤   case cmd_OptionClear:
95804c ¤   ¤   ¤   SelectionAction(&CKeyTable::Delete);
5bf275 ¤   ¤   ¤   RemoveTerminatedKeys();
866d39 ¤   ¤   ¤   ResyncTable(FALSE, TRUE);
0d1d65 ¤   ¤   ¤   RedrawTable();
118d00 ¤   ¤   ¤   CommitKeySet();
d2cdcb ¤   ¤   ¤   break;
1d1b1c ¤   ¤   case cmd_Clear:
e4f776 ¤   ¤   ¤   {
2aff13 ¤   ¤   ¤   ¤   Str255¤ question;
4fd72b ¤   ¤   ¤   ¤   GetIndString(¤  question,
09629f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
7c9848 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kClearQuestion);
2d028c ¤   ¤   ¤   ¤   if(CWarningAlert::Display(kWACautionAlertType,
5b3655 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKCancelStyle, kStringListID,
2b2f8b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kClearQuestion) == msg_OK)
9a72c3 ¤   ¤   ¤   ¤   {
2cbc64 ¤   ¤   ¤   ¤   ¤   SelectionAction(&CKeyTable::Delete);
f8bf46 ¤   ¤   ¤   ¤   ¤   RemoveTerminatedKeys();
516812 ¤   ¤   ¤   ¤   ¤   ResyncTable(FALSE, TRUE);
c08532 ¤   ¤   ¤   ¤   ¤   RedrawTable();
7faba2 ¤   ¤   ¤   ¤   ¤   CommitKeySet();
ca2613 ¤   ¤   ¤   ¤   }
bda3a6 ¤   ¤   ¤   }
1bcdcb ¤   ¤   ¤   break;
708463 ¤   ¤   case cmd_Revoke:
c470eb ¤   ¤   ¤   SelectionAction(&CKeyTable::Revoke);
d16d39 ¤   ¤   ¤   ResyncTable(FALSE, TRUE);
db1d65 ¤   ¤   ¤   RedrawTable();
bc8d00 ¤   ¤   ¤   CommitKeySet();
dacdcb ¤   ¤   ¤   break;
909b17 ¤   ¤   case cmd_SplitKey:
d1b41c ¤   ¤   ¤   SelectionAction(&CKeyTable::Split);
03cdcb ¤   ¤   ¤   break;
a1328d ¤   ¤   case cmd_CollapseAll:
6ca362 ¤   ¤   ¤   CollapseKeys(FALSE);
7dcdcb ¤   ¤   ¤   break;
de537b ¤   ¤   case cmd_ExpandAll:
66207b ¤   ¤   ¤   ExpandKeys();
3ecdcb ¤   ¤   ¤   break;
f83513 ¤   ¤   case cmd_SelectAll:
321b72 ¤   ¤   ¤   UnselectAllCells();
592331 ¤   ¤   ¤   SelectAllCells();
cbcdcb ¤   ¤   ¤   break;
dfd382 ¤   ¤   case cmd_SetDefault:
b273d9 ¤   ¤   ¤   if(!SetDefault())
f7ff2e ¤   ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
a850ab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kCantDefaultStringID);
81cdcb ¤   ¤   ¤   break;
cd76d4 ¤   ¤   case cmd_Info:
34d1cf ¤   ¤   ¤   SelectionAction(&CKeyTable::ShowKeyInfo);
dbcdcb ¤   ¤   ¤   break;
06f731 ¤   ¤   case cmd_Sign1:
89b6b3 ¤   ¤   ¤   Sign();
bdcdcb ¤   ¤   ¤   break;
eda3f1 ¤   ¤   case cmd_EnableKeys:
210421 ¤   ¤   ¤   SelectionAction(&CKeyTable::EnableKey);
801d65 ¤   ¤   ¤   RedrawTable();
d98d00 ¤   ¤   ¤   CommitKeySet();
f3cdcb ¤   ¤   ¤   break;
e07d66 ¤   ¤   case cmd_DisableKeys:
701169 ¤   ¤   ¤   SelectionAction(&CKeyTable::DisableKey);
d11d65 ¤   ¤   ¤   RedrawTable();
828d00 ¤   ¤   ¤   CommitKeySet();
51cdcb ¤   ¤   ¤   break;
0b83a0 ¤   ¤   case cmd_AddName:
--d925 000c7c1f34e401201b3 Page 60 of CKeyTable.cp
41ff09 ¤   ¤   case cmd_AddPhotoUserID:
06d769 ¤   ¤   ¤   AddUserID( inCommand == cmd_AddPhotoUserID );
c81d65 ¤   ¤   ¤   RedrawTable();
25cdcb ¤   ¤   ¤   break;
336e80 ¤   ¤   case cmd_AddRevoker:
76e83d ¤   ¤   ¤   AddRevoker();
a5cdcb ¤   ¤   ¤   break;
cde89d ¤   ¤   case cmd_ReverifySignatures:
84db85 ¤   ¤   ¤   ReverifySigs();
d0cdcb ¤   ¤   ¤   break;
a79790 ¤   ¤   case cmd_KSGetKeys:
efa73b ¤   ¤   ¤   if(gServerCallsPresent)
52f776 ¤   ¤   ¤   {
e0b19c ¤   ¤   ¤   ¤   if(SelectionAction(&CKeyTable::GetCellOnServer))
e472c3 ¤   ¤   ¤   ¤   {
476812 ¤   ¤   ¤   ¤   ¤   ResyncTable(FALSE, TRUE);
948532 ¤   ¤   ¤   ¤   ¤   RedrawTable();
f42613 ¤   ¤   ¤   ¤   }
37a3a6 ¤   ¤   ¤   }
57cdcb ¤   ¤   ¤   break;
60a517 ¤   ¤   case cmd_KSSendKeyToDomain:
76a73b ¤   ¤   ¤   if(gServerCallsPresent)
c3f776 ¤   ¤   ¤   {
8a8c19 ¤   ¤   ¤   ¤   UInt32¤ successfulSends;
076ad8 ¤   ¤   ¤   ¤   Str255¤ numSendsString;
9a2b85 ¤   ¤   ¤   ¤
565ca3 ¤   ¤   ¤   ¤   mTargetKeyServer = NULL;
5682de ¤   ¤   ¤   ¤   successfulSends =·
df690b ¤   ¤   ¤   ¤   ¤   SelectionAction(&CKeyTable::SendKeyToServer);
6aab32 ¤   ¤   ¤   ¤   if(successfulSends > 0)
6372c3 ¤   ¤   ¤   ¤   {
eeadbe ¤   ¤   ¤   ¤   ¤   NumToString(successfulSends, numSendsString);
89a838 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(kWANoteAlertType,
4d08e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle, kStringListID,
13b50a ¤   ¤   ¤   ¤   ¤   ¤   ¤   kServerSendSuccessful,
ba9f6a ¤   ¤   ¤   ¤   ¤   ¤   ¤   numSendsString);
592613 ¤   ¤   ¤   ¤   }
dea3a6 ¤   ¤   ¤   }
41cdcb ¤   ¤   ¤   break;
04e016 ¤   ¤   case cmd_ImportKeys:
95f776 ¤   ¤   ¤   {
655ea5 ¤   ¤   ¤   ¤   FSSpec¤ ¤   ¤   ¤   fsSpec;
bf53e5 ¤   ¤   ¤   ¤   SFTypeList¤ ¤   ¤   typeList;
982b85 ¤   ¤   ¤   ¤
879be9 ¤   ¤   ¤   ¤   typeList[0] = kPGPMacFileType_ArmorFile;
0c596d ¤   ¤   ¤   ¤   typeList[1] = kPGPMacFileType_PrivRing;
d5aceb ¤   ¤   ¤   ¤   typeList[2] = kPGPMacFileType_PubRing;
b52b85 ¤   ¤   ¤   ¤
45e1e6 ¤   ¤   ¤   ¤   if( CustomGetFileWithShowAll( 3, typeList, &fsSpec ) )
caa54e ¤   ¤   ¤   ¤   ¤   ImportKeysFromFile( &fsSpec, FALSE );
f3a3a6 ¤   ¤   ¤   }
02cdcb ¤   ¤   ¤   break;
40950d ¤   ¤   case cmd_ExportKeys:
8ac554 ¤   ¤   ¤   ExportSelected();
54cdcb ¤   ¤   ¤   break;
735a37 ¤   ¤   case cmd_UpdateIntroducers:
ac1430 ¤   ¤   ¤   UpdateIntroducers();
eacdcb ¤   ¤   ¤   break;
2d9ae3 ¤   ¤   default:
9b4a71 ¤   ¤   ¤   cmdHandled = LCommander::ObeyCommand(inCommand, ioParam);
7ecdcb ¤   ¤   ¤   break;
d99371 ¤   }
c467c5 ¤
ed51a4 ¤   return cmdHandled;
eaefe6 }
6daf5a
a96d52 ¤   void
c85301 CKeyTable::GetColumnCheck(¤ Int16¤  ¤   columnID,
96209f ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   &outEnabled,
ae0622 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   &outUsesMark,
373842 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16¤ ¤   &outMark)
c7bb36 {
--c79f 000ea3ee6d1401201b3 Page 61 of CKeyTable.cp
a222dd ¤   if(ColumnVisible(columnID))
7cc7a1 ¤   {
c54e4e ¤   ¤   outUsesMark = true;
dd797b ¤   ¤   outMark = checkMark;
859371 ¤   }
380e24 ¤   else
12c7a1 ¤   {
574e4e ¤   ¤   outUsesMark = true;
868744 ¤   ¤   outMark = ' ';
5f9371 ¤   }
f9799f ¤   outEnabled = true;
dfefe6 }
b8af5a
176d52 ¤   void
133c85 CKeyTable::FindCommandStatus(
c6ea24 ¤   CommandT¤   inCommand,
f8a472 ¤   Boolean¤¤   &outEnabled,
283a4d ¤   Boolean¤¤   &outUsesMark,
675dc0 ¤   Char16¤ ¤   &outMark,
3ad894 ¤   Str255¤ ¤   outName)
5fbb36 {
d261e0 ¤   PGPError¤   err;
e48d62 ¤   PGPBoolean¤ canSign;
af2b85 ¤   ¤   ¤   ¤
27836e ¤   switch(inCommand)·
4ac7a1 ¤   {
43975b ¤   ¤   case cmd_ViewValidity:
5f3bee ¤   ¤   ¤   GetColumnCheck(kValidityColumnID,
cfe73a ¤   ¤   ¤   ¤   ¤   ¤   ¤   outEnabled, outUsesMark, outMark);
e2cdcb ¤   ¤   ¤   break;
904724 ¤   ¤   case cmd_ViewTrust:
265a37 ¤   ¤   ¤   GetColumnCheck(kTrustColumnID,
b7e73a ¤   ¤   ¤   ¤   ¤   ¤   ¤   outEnabled, outUsesMark, outMark);
1dcdcb ¤   ¤   ¤   break;
3feb22 ¤   ¤   case cmd_ViewSize:
9fd65d ¤   ¤   ¤   GetColumnCheck(kKeySizeColumnID,
84e73a ¤   ¤   ¤   ¤   ¤   ¤   ¤   outEnabled, outUsesMark, outMark);
b4cdcb ¤   ¤   ¤   break;
c6d4ba ¤   ¤   case cmd_ViewKeyID:
6c81bf ¤   ¤   ¤   GetColumnCheck(kKeyIDColumnID, outEnabled, outUsesMark, outMark);
02cdcb ¤   ¤   ¤   break;
db9a75 ¤   ¤   case cmd_ViewCreationDate:
eae6d1 ¤   ¤   ¤   GetColumnCheck(kCreationColumnID,
a5e73a ¤   ¤   ¤   ¤   ¤   ¤   ¤   outEnabled, outUsesMark, outMark);
8dcdcb ¤   ¤   ¤   break;
5652fe ¤   ¤   case cmd_ViewExpirationDate:
dc6db5 ¤   ¤   ¤   GetColumnCheck(kExpirationColumnID,
52e73a ¤   ¤   ¤   ¤   ¤   ¤   ¤   outEnabled, outUsesMark, outMark);
2bcdcb ¤   ¤   ¤   break;
cba8f7 ¤   ¤   case cmd_ViewMRK:
98f2bf ¤   ¤   ¤   GetColumnCheck(kMRKColumnID, outEnabled, outUsesMark, outMark);
01cdcb ¤   ¤   ¤   break;
c19963 ¤   ¤   case cmd_ViewDescription:
ec713e ¤   ¤   ¤   GetColumnCheck(kDescriptionColumnID,
8ce73a ¤   ¤   ¤   ¤   ¤   ¤   ¤   outEnabled, outUsesMark, outMark);
79cdcb ¤   ¤   ¤   break;
dd18da ¤   ¤   case cmd_Paste:
e4e5ef ¤   ¤   ¤   {¤  // Check if TEXT is in the Scrap
bd4ae9 ¤   ¤   ¤   ¤   Int32¤  offset;
81835b ¤   ¤   ¤   ¤   outEnabled = (::GetScrap(nil, 'TEXT', &offset) > 0);
f7a3a6 ¤   ¤   ¤   }
e1cdcb ¤   ¤   ¤   break;
85d180 ¤   ¤   case cmd_KSSendKeys:
22a517 ¤   ¤   case cmd_KSSendKeyToDomain:
b99790 ¤   ¤   case cmd_KSGetKeys:
f45d0f ¤   ¤   ¤   if(SelectionExists() && gServerCallsPresent)
486ab0 ¤   ¤   ¤   ¤   outEnabled = TRUE;
83cdcb ¤   ¤   ¤   break;
7d9b17 ¤   ¤   case cmd_SplitKey:
056b56 ¤   ¤   case cmd_AddToKey:
f583a0 ¤   ¤   case cmd_AddName:
eaff09 ¤   ¤   case cmd_AddPhotoUserID:
--5f98 00001ae5127401201b3 Page 62 of CKeyTable.cp
1b6e80 ¤   ¤   case cmd_AddRevoker:
a58463 ¤   ¤   case cmd_Revoke:
96a93a ¤   ¤   ¤   if(!mMutableRing || !mDefaultRing)
5df776 ¤   ¤   ¤   {
9184a2 ¤   ¤   ¤   ¤   outEnabled = FALSE;
9cf622 ¤   ¤   ¤   ¤   break;
19a3a6 ¤   ¤   ¤   }
02d382 ¤   ¤   case cmd_SetDefault:
aef776 ¤   ¤   ¤   {
b03904 ¤   ¤   ¤   ¤   STableCell¤ cell,
bde3ca ¤   ¤   ¤   ¤   ¤   ¤   ¤   ocell;
b58b95 ¤   ¤   ¤   ¤   KeyTableRef¤tableRef;
8e3c25 ¤   ¤   ¤   ¤   UInt32¤ ¤   dataSize = sizeof(KeyTableRef);
382b85 ¤   ¤   ¤   ¤
8084a2 ¤   ¤   ¤   ¤   outEnabled = FALSE;
c42b85 ¤   ¤   ¤   ¤
5e04d5 ¤   ¤   ¤   ¤   if(inCommand == cmd_SetDefault)
851c86 ¤   ¤   ¤   ¤   ¤   GetIndString( outName, kStringListID,
03e4af ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSetDefaultMenuItemID);
ed2aa7 ¤   ¤   ¤   ¤   if(SelectionExists())
cf72c3 ¤   ¤   ¤   ¤   {
16ebd2 ¤   ¤   ¤   ¤   ¤   ocell = cell = GetFirstSelectedCell();
de28c2 ¤   ¤   ¤   ¤   ¤   if( ! GetNextSelectedCell(ocell) )
b54859 ¤   ¤   ¤   ¤   ¤   {
102982 ¤   ¤   ¤   ¤   ¤   ¤   cell.col = 1;
c72861 ¤   ¤   ¤   ¤   ¤   ¤   cell.row = GetWideOpenIndex(cell.row);
5d8258 ¤   ¤   ¤   ¤   ¤   ¤   GetCellData(cell, &tableRef, dataSize);
86e3e9 ¤   ¤   ¤   ¤   ¤   ¤   if( tableRef.type == kKey )
fb8fec ¤   ¤   ¤   ¤   ¤   ¤   {
0a4347 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( inCommand == cmd_Revoke )
b406b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
eaf261 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ revocable;
56da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
5e8c4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetKeyBoolean(tableRef.u.key,
e3c88d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropIsRevocable, &revocable);
9461d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( revocable )
5a7d02 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outEnabled = TRUE;
815268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
aec4dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
3306b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
1f8c4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetKeyBoolean(tableRef.u.key,
2fbed3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropCanSign, &canSign);
14e3e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( canSign )
0431b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
2b57d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( ( inCommand == cmd_AddPhotoUserID )
f8b0d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   || ( inCommand == cmd_AddRevoker ) )
cadec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
546dcd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPInt32¤   algorithm;
ea0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
1ddc9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetKeyNumber( tableRef.u.key,
db5e67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropAlgID,
8cf86d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm );
89dad7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( algorithm !=
951282 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPublicKeyAlgorithm_RSA )
357adb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outEnabled = TRUE;
b38a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
99fc58 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
0f7a39 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outEnabled = TRUE;
1c6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
e55268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
44db3c ¤   ¤   ¤   ¤   ¤   ¤   }
b36e9d ¤   ¤   ¤   ¤   ¤   ¤   else if( inCommand == cmd_Revoke &&
62bf54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   tableRef.type == kSignature )
228fec ¤   ¤   ¤   ¤   ¤   ¤   {
cb7788 ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Could make sure the certifying key is a
675fb0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   // secret key here, but that would slow
70120e ¤   ¤   ¤   ¤   ¤   ¤   ¤   // things down a lot
4ab497 ¤   ¤   ¤   ¤   ¤   ¤   ¤   outEnabled = TRUE;
7bdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
7f71f6 ¤   ¤   ¤   ¤   ¤   ¤   else if( tableRef.type == kUserID &&
6ed89b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inCommand == cmd_SetDefault )
018fec ¤   ¤   ¤   ¤   ¤   ¤   {
--3695 000110c32a1401201b3 Page 63 of CKeyTable.cp
2dff46 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ isAttributeID;
1d531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
f192c0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetUserIDBoolean( tableRef.u.user,
b3f008 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPUserIDPropIsAttribute,
97bf30 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &isAttributeID);
2912d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
67531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
18b504 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( ! isAttributeID )
c506b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
bf6c25 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outEnabled = TRUE;
d398f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetIndString(¤  outName,
c9acd3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
7f1917 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSetPrimaryNameMenuItemID);
295268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
1edb3c ¤   ¤   ¤   ¤   ¤   ¤   }
eb1c89 ¤   ¤   ¤   ¤   ¤   }
f32613 ¤   ¤   ¤   ¤   }
71a3a6 ¤   ¤   ¤   }
b3cdcb ¤   ¤   ¤   break;
e9a3f1 ¤   ¤   case cmd_EnableKeys:
457d66 ¤   ¤   case cmd_DisableKeys:
691b1c ¤   ¤   case cmd_Clear:
13d5b0 ¤   ¤   case cmd_OptionClear:
799286 ¤   ¤   ¤   if(!mMutableRing)
adf622 ¤   ¤   ¤   ¤   break;
500a6a ¤   ¤   case cmd_Info:¤
718fe9 ¤   ¤   case cmd_Copy:
6e950d ¤   ¤   case cmd_ExportKeys:
cee89d ¤   ¤   case cmd_ReverifySignatures:
f7f731 ¤   ¤   case cmd_Sign1:
ca14ec ¤   ¤   ¤   outEnabled = SelectionExists();
69cdcb ¤   ¤   ¤   break;
61328d ¤   ¤   case cmd_CollapseAll:
d58f56 ¤   ¤   ¤   outEnabled = true;
02c5d4 ¤   ¤   ¤   if(SelectionExists())
b7f0f9 ¤   ¤   ¤   ¤   GetIndString(¤  outName,
e4629f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
367087 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCollapseSelectionID);
3bbb8c ¤   ¤   ¤   else
e0f0f9 ¤   ¤   ¤   ¤   GetIndString(¤  outName,
c8629f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
e6b380 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCollapseAllID);
4fcdcb ¤   ¤   ¤   break;
ea537b ¤   ¤   case cmd_ExpandAll:
f98f56 ¤   ¤   ¤   outEnabled = true;
bfc5d4 ¤   ¤   ¤   if(SelectionExists())
1ef0f9 ¤   ¤   ¤   ¤   GetIndString(¤  outName,
2f629f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
ef153d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kExpandSelectionID);
34bb8c ¤   ¤   ¤   else
93f0f9 ¤   ¤   ¤   ¤   GetIndString(¤  outName,
7a629f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
92dd29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kExpandAllID);
a3cdcb ¤   ¤   ¤   break;
895a37 ¤   ¤   case cmd_UpdateIntroducers:
fabe29 #if PGP_BUSINESS_SECURITY
83a93a ¤   ¤   ¤   if(!mMutableRing || !mDefaultRing)
e7f622 ¤   ¤   ¤   ¤   break;
9a8f56 ¤   ¤   ¤   outEnabled = true;
977454 #endif
99cdcb ¤   ¤   ¤   break;
4123a7 ¤   ¤   case cmd_NewKey:
0c5989 #if¤PGP_BUSINESS_SECURITY
301241 ¤   ¤   ¤   PGPBoolean¤ ¤   allowKG;
b687c7 ¤   ¤   ¤
6ee10c ¤   ¤   ¤   err = PGPGetPrefBoolean(gAdminPrefRef, kPGPPrefAllowKeyGen,
34a2ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &allowKG);
47524f ¤   ¤   ¤   pgpAssertNoErr(err);
f5273c ¤   ¤   ¤   if(!allowKG)
e5f622 ¤   ¤   ¤   ¤   break;
5f7454 #endif
11e016 ¤   ¤   case cmd_ImportKeys:
--ba95 000016c881d401201b3 Page 64 of CKeyTable.cp
5ea93a ¤   ¤   ¤   if(!mMutableRing || !mDefaultRing)
16f622 ¤   ¤   ¤   ¤   break;
053513 ¤   ¤   case cmd_SelectAll:
ba8f56 ¤   ¤   ¤   outEnabled = true;
dccdcb ¤   ¤   ¤   break;
3c9ae3 ¤   ¤   default:
fd6de7 ¤   ¤   ¤   LCommander::FindCommandStatus(inCommand, outEnabled,
148186 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outUsesMark, outMark, outName);
f3cdcb ¤   ¤   ¤   break;
a49371 ¤   }
a2efe6 }
a4af5a
bc7e69 ¤   Boolean
f310d5 CKeyTable::HandleKeyPress(const EventRecord&¤   inKeyEvent)
a3bb36 {
366ff1 ¤   Boolean¤¤   keyHandled¤ = true;
4e1639 ¤   Int16¤  ¤   theKey¤ ¤   = inKeyEvent.message & charCodeMask,
2e96bf ¤   ¤   ¤   ¤   charInx;
da9874 ¤   STableCell¤ cell;
b09923 ¤   TableIndexT¤rows, cols;
1367c5 ¤
3b7f42 ¤   if(inKeyEvent.modifiers & cmdKey)
20f1fc ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
1f0e24 ¤   else
2fc7a1 ¤   {
bfd4c4 ¤   ¤   SetUpdateCommandStatus(TRUE);
d02b6b ¤   ¤   switch(theKey)
e45b34 ¤   ¤   {
d9db68 ¤   ¤   ¤   default:
fa23b3 ¤   ¤   ¤   ¤   if(((theKey >= ' ') && (theKey <= 'Z')) ||
b2588e ¤   ¤   ¤   ¤   ¤   ((theKey >= 'a') && (theKey <= 'z')))
b572c3 ¤   ¤   ¤   ¤   {
c5a19f ¤   ¤   ¤   ¤   ¤   if(inKeyEvent.when - kMaxKeypressInterval <=
f97caf ¤   ¤   ¤   ¤   ¤   ¤   mLastKeypress)
e14859 ¤   ¤   ¤   ¤   ¤   {
96c29f ¤   ¤   ¤   ¤   ¤   ¤   if((charInx = strlen(mSearchString)) <
e72530 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMaxSearchStringSize - 1)
798fec ¤   ¤   ¤   ¤   ¤   ¤   {
92c982 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mSearchString[charInx]¤ ¤   = theKey;
79827c ¤   ¤   ¤   ¤   ¤   ¤   ¤   mSearchString[charInx+1]¤   = 0;
a7db3c ¤   ¤   ¤   ¤   ¤   ¤   }
3d1c89 ¤   ¤   ¤   ¤   ¤   }
e44bd6 ¤   ¤   ¤   ¤   ¤   else
514859 ¤   ¤   ¤   ¤   ¤   {
e4389a ¤   ¤   ¤   ¤   ¤   ¤   mSearchString[0] = theKey;
236d85 ¤   ¤   ¤   ¤   ¤   ¤   mSearchString[1] = 0;
021c89 ¤   ¤   ¤   ¤   ¤   }
e532db ¤   ¤   ¤   ¤   ¤   mLastKeypress = inKeyEvent.when;
0f7645 ¤   ¤   ¤   ¤   ¤   SelectSearchString();
2b2613 ¤   ¤   ¤   ¤   }
fdfa07 ¤   ¤   ¤   ¤   else
dea6e6 ¤   ¤   ¤   ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
79f622 ¤   ¤   ¤   ¤   break;
9199fa ¤   ¤   ¤   case char_UpArrow:
323692 ¤   ¤   ¤   ¤   cell = GetFirstSelectedCell();
38f1f9 ¤   ¤   ¤   ¤   cell.col = 1;
3aea63 ¤   ¤   ¤   ¤   if(cell.row > 1)
df3ca2 ¤   ¤   ¤   ¤   ¤   cell.row--;
5dfceb ¤   ¤   ¤   ¤   if(cell.row < 1)
a5b7d3 ¤   ¤   ¤   ¤   ¤   cell.row = 1;
5e908e ¤   ¤   ¤   ¤   UnselectAllCells();
4aa4e9 ¤   ¤   ¤   ¤   ScrollCellIntoFrame(cell);
1fc7e4 ¤   ¤   ¤   ¤   SelectCell(cell);
89f622 ¤   ¤   ¤   ¤   break;
7910b3 ¤   ¤   ¤   case char_DownArrow:
009505 ¤   ¤   ¤   ¤   GetTableSize(rows, cols);
a33692 ¤   ¤   ¤   ¤   cell = GetFirstSelectedCell();
2af1f9 ¤   ¤   ¤   ¤   cell.col = 1;
ab0cbf ¤   ¤   ¤   ¤   cell.row++;
65efd1 ¤   ¤   ¤   ¤   if(cell.row > rows)
9702f5 ¤   ¤   ¤   ¤   ¤   cell.row = rows;
01908e ¤   ¤   ¤   ¤   UnselectAllCells();
--8189 00090fde94e401201b3 Page 65 of CKeyTable.cp
75a4e9 ¤   ¤   ¤   ¤   ScrollCellIntoFrame(cell);
e6c7e4 ¤   ¤   ¤   ¤   SelectCell(cell);
5ef622 ¤   ¤   ¤   ¤   break;
8052bc ¤   ¤   ¤   case char_LeftArrow:
d01c5e ¤   ¤   ¤   case char_RightArrow:
41f622 ¤   ¤   ¤   ¤   break;
804c64 ¤   ¤   ¤   case char_Home:
df07b9 ¤   ¤   ¤   ¤   cell.row = cell.col = 1;
c5a4e9 ¤   ¤   ¤   ¤   ScrollCellIntoFrame(cell);
f2f622 ¤   ¤   ¤   ¤   break;
308dc9 ¤   ¤   ¤   case char_End:
c99505 ¤   ¤   ¤   ¤   GetTableSize(rows, cols);
95f1f9 ¤   ¤   ¤   ¤   cell.col = 1;
463f9d ¤   ¤   ¤   ¤   cell.row = rows;
88a4e9 ¤   ¤   ¤   ¤   ScrollCellIntoFrame(cell);
06f622 ¤   ¤   ¤   ¤   break;
326f81 ¤   ¤   ¤   case char_PageUp:
33f776 ¤   ¤   ¤   {
3659cb ¤   ¤   ¤   ¤   Rect¤   frameRect;
082b85 ¤   ¤   ¤   ¤
97af32 ¤   ¤   ¤   ¤   CalcLocalFrameRect(frameRect);
6e82dd ¤   ¤   ¤   ¤   ScrollPinnedImageBy( 0,
8905b9 ¤   ¤   ¤   ¤   ¤   -UGraphicUtils::RectHeight(frameRect), true );
0af622 ¤   ¤   ¤   ¤   break;
91a3a6 ¤   ¤   ¤   }
be895e ¤   ¤   ¤   case char_PageDown:
c6f776 ¤   ¤   ¤   {
1659cb ¤   ¤   ¤   ¤   Rect¤   frameRect;
af2b85 ¤   ¤   ¤   ¤
3caf32 ¤   ¤   ¤   ¤   CalcLocalFrameRect(frameRect);
6382dd ¤   ¤   ¤   ¤   ScrollPinnedImageBy( 0,
060403 ¤   ¤   ¤   ¤   ¤   UGraphicUtils::RectHeight(frameRect), true );
c6f622 ¤   ¤   ¤   ¤   break;
fea3a6 ¤   ¤   ¤   }
aa56ed ¤   ¤   ¤   case char_Tab:
d5bce9 ¤   ¤   ¤   case char_Return:
113362 ¤   ¤   ¤   case char_Enter:
c0a190 ¤   ¤   ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
a3f622 ¤   ¤   ¤   ¤   break;
0979b8 ¤   ¤   ¤   case char_FwdDelete:
09d41d ¤   ¤   ¤   case char_Backspace:
aa2c6f ¤   ¤   ¤   ¤   if(inKeyEvent.modifiers & optionKey)
395c51 ¤   ¤   ¤   ¤   ¤   LCommander::GetTarget()->ProcessCommand(cmd_OptionClear);
93fa07 ¤   ¤   ¤   ¤   else
8807dc ¤   ¤   ¤   ¤   ¤   LCommander::GetTarget()->ProcessCommand(cmd_Clear);
1df622 ¤   ¤   ¤   ¤   break;
4d0fe4 ¤   ¤   }
229371 ¤   }
3dc022 ¤   return keyHandled;
c6efe6 }
c8af5a
2cc2cf ¤   Int16
defc4b MatchUserIDs(char *uid1, char *uid2)
9ebb36 {
30f2bd ¤   Int16¤  matchChars = 0;
d3ddf7 ¤   char¤   a, b;
b067c5 ¤
c478e1 ¤   while(*uid1 && *uid2)
55c7a1 ¤   {
c84097 ¤   ¤   a = *uid1++;¤   b = *uid2++;
ca4ca4 ¤   ¤   if((a >= 'a') && (a <= 'z'))
bb2e73 ¤   ¤   ¤   a -= ('a' - 'A');
f2be9a ¤   ¤   if((b >= 'a') && (b <= 'z'))
4a2f4b ¤   ¤   ¤   b -= ('a' - 'A');
40d702 ¤   ¤   if(a == b)
ebaee9 ¤   ¤   ¤   matchChars++;
030e1d ¤   ¤   else
72cdcb ¤   ¤   ¤   break;
139371 ¤   }
2e0383 ¤   return matchChars;
42efe6 }
90af5a
--979d 00072993700401201b3 Page 66 of CKeyTable.cp
3b6d52 ¤   void
a8c6c3 CKeyTable::SelectSearchString()
d2bb36 {
b89874 ¤   STableCell¤ cell;
b78295 ¤   TableIndexT¤rows,
988bde ¤   ¤   ¤   ¤   cols,
a6a949 ¤   ¤   ¤   ¤   row,
478678 ¤   ¤   ¤   ¤   lastMarkerRow=0;
12daba ¤   KeyTableRef¤tableRef;
2de0c2 ¤   Uint32¤ ¤   dataSize = sizeof(KeyTableRef);
8761e0 ¤   PGPError¤   err;
28444a ¤   UInt32¤ ¤   len;
c8b99f ¤   char¤   ¤   userIDStr[kUserIDStringLength];
45083b ¤   Int16¤  ¤   searchScore,
86d8c6 ¤   ¤   ¤   ¤   bestSearchScore = 0;
3267c5 ¤
d84049 ¤   UnselectAllCells();
702be0 ¤   GetWideOpenTableSize(rows, cols);
848582 ¤   cell.col = 1;
213670 ¤   for(row=1;row<=rows;row++)
d1c7a1 ¤   {
7b9d43 ¤   ¤   cell.row = row;
d6174e ¤   ¤   GetCellData(¤   cell,
c42a5f ¤   ¤   ¤   ¤   ¤   ¤   &tableRef,
0f551e ¤   ¤   ¤   ¤   ¤   ¤   dataSize);
6a1700 ¤   ¤   if(tableRef.type == kKey)
635b34 ¤   ¤   {
7ba40e ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer(tableRef.u.key,
40a9d0 ¤   ¤   ¤   ¤   ¤   ¤   kUserIDStringLength - 1, userIDStr, &len);
97524f ¤   ¤   ¤   pgpAssertNoErr(err);
cd6f1e ¤   ¤   ¤   userIDStr[len] = 0;
2cc383 ¤   ¤   ¤   searchScore = MatchUserIDs(userIDStr, mSearchString);
63e40b ¤   ¤   ¤   if(searchScore > bestSearchScore)
0df776 ¤   ¤   ¤   {
cd809f ¤   ¤   ¤   ¤   bestSearchScore = searchScore;
414848 ¤   ¤   ¤   ¤   lastMarkerRow = row;¤
f3a3a6 ¤   ¤   ¤   }
ed0fe4 ¤   ¤   }
d19371 ¤   }
24da06 ¤   cell.row = lastMarkerRow;
df9693 ¤   if(!lastMarkerRow)
2c316a ¤   ¤   mSearchString[0] = 0;
8e0a00 ¤   else if(rows)
dec7a1 ¤   {
6c9ccf ¤   ¤   cell.row = GetExposedIndex(cell.row);
c8eb56 ¤   ¤   ScrollCellIntoFrame(cell);
8579b8 ¤   ¤   SelectCell(cell);
e99371 ¤   }
e6efe6 }
b5af5a
976d52 ¤   void
920079 CKeyTable::ScrollImageBy(¤  Int32¤  ¤   inLeftDelta,
edd055 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   inTopDelta,
c6cfa3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   inRefresh)
12bb36 {
3d8e10 ¤   if(inLeftDelta != 0)
33c7a1 ¤   {
5ecf78 ¤   ¤   mKeyLabels->NotifyScrolled(inLeftDelta);
3a0f57 ¤   ¤   if(inRefresh)
b29473 ¤   ¤   ¤   mKeyLabels->Refresh();
1f9371 ¤   }
5c1ea1 ¤   CPGPHierarchyTable::ScrollImageBy(inLeftDelta, inTopDelta, inRefresh);
d7efe6 }
3baf5a
9c045c #pragma mark --- Drag and Drop ---
25af5a
2c6d52 ¤   void
7cc278 CKeyTable::GetCellDragRgn(
b80948 ¤   const STableCell&¤  inCell,
94ed55 ¤   RgnHandle¤  ¤   ¤   dragRgn,
348415 ¤   Boolean¤¤   ¤   ¤   cutout )
72bb36 {
--e9f6 000bac8ef3c401201b3 Page 67 of CKeyTable.cp
e906a5 ¤   StColorPenState¤¤   colorState;
9af3b3 ¤   TableIndexT¤¤   ¤   woRow =
f469b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(inCell.row);
0f776b ¤   STableCell¤ ¤   ¤   woCell(woRow, 1);
af038b ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof(KeyTableRef);
a5a164 ¤   KeyTableRef¤¤   ¤   keyRef;
286f87 ¤   Rect¤   ¤   ¤   ¤   grabRect;
2182fd ¤   IconSuiteRef¤   ¤   iconHandle;
679912 ¤   RgnHandle¤  ¤   ¤   iconRgn,
0d279f ¤   ¤   ¤   ¤   ¤   ¤   innerRgn;
7d87c7 ¤   ¤   ¤
205b2f ¤   pgpAssert( IsntNull( dragRgn ) );
1267c5 ¤
2df9b2 ¤   GetCellData( woCell, &keyRef, dataSize );
d51b52 ¤   ¤
b809c0 ¤   OpenRgn();
882f89 ¤   PenSize( 2, 2 );
90e743 ¤   grabRect.left¤  = keyRef.selectLeft +
32b7eb ¤   ¤   ¤   ¤   ¤   ¤   kIconWidth + kLeftBorder +
5168a3 ¤   ¤   ¤   ¤   ¤   ¤   kLeftIndent;
7621e0 ¤   grabRect.right¤ = keyRef.selectRight + 1;
5bcf30 ¤   grabRect.top¤   = 3;
cd7f1f ¤   grabRect.bottom¤= kRowHeight - 3;
e50235 ¤   FrameRect( &grabRect );
0a1eb5 ¤   CloseRgn( dragRgn );
beaf5a
26704d ¤   if( !GetIconSuite( &iconHandle,
8b8967 ¤   ¤   ¤   ¤   ¤   ¤   keyRef.iconID,
259c29 ¤   ¤   ¤   ¤   ¤   ¤   kSelectorAllSmallData ) )
01c7a1 ¤   {
e8d195 ¤   ¤   iconRgn = NewRgn();
ab0b86 ¤   ¤   if( IsntNull( iconRgn ) )
645b34 ¤   ¤   {
f2fc72 ¤   ¤   ¤   grabRect.top = 1;
b906a6 ¤   ¤   ¤   grabRect.bottom = grabRect.top + kIconHeight;
308168 ¤   ¤   ¤   grabRect.left = keyRef.selectLeft + kLeftIndent;
d2e319 ¤   ¤   ¤   grabRect.right = grabRect.left + kIconWidth;
8587c7 ¤   ¤   ¤
4ebd1a ¤   ¤   ¤   if( !IconSuiteToRgn( iconRgn, &grabRect, kAlignNone,
47fa4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   iconHandle ) )
7bf776 ¤   ¤   ¤   {
06f2bd ¤   ¤   ¤   ¤   UnionRgn( iconRgn, dragRgn, dragRgn );
d0a3a6 ¤   ¤   ¤   }
837181 ¤   ¤   ¤   DisposeRgn( iconRgn );
a70fe4 ¤   ¤   }
47b169 ¤   ¤   DisposeIconSuite( iconHandle, false );
239371 ¤   }
9067c5 ¤
859d2e ¤   if( cutout )
36c7a1 ¤   {
958458 ¤   ¤   innerRgn = NewRgn();
6e46a9 ¤   ¤   if( IsntNull( innerRgn ) )
375b34 ¤   ¤   {
92a923 ¤   ¤   ¤   CopyRgn( dragRgn, innerRgn );
70d8d0 ¤   ¤   ¤   InsetRgn( innerRgn, 2, 2 );
eba369 ¤   ¤   ¤   DiffRgn( dragRgn, innerRgn, dragRgn );
af7bea ¤   ¤   ¤   DisposeRgn( innerRgn );
470fe4 ¤   ¤   }
809371 ¤   }
c8efe6 }
0eaf5a
8143dd ¤   void¤   ¤
903efe CKeyTable::GetDragHiliteRgn(
4f2fe2 ¤   RgnHandle¤  ¤   ¤   ioHiliteRgn,
425864 ¤   const STableCell&¤  skipCell,
971294 ¤   Boolean¤¤   ¤   ¤   globalize )
57bb36 {
c2d782 ¤   StColorPenState¤colorState;
a2cd9f ¤   STableCell¤ ¤   cell,
feb9a7 ¤   ¤   ¤   ¤   ¤   topLCell,
627e88 ¤   ¤   ¤   ¤   ¤   botRCell;
ba83ee ¤   RgnHandle¤  ¤   cellRgn;
--5bb7 0001e468116401201b3 Page 68 of CKeyTable.cp
82da8d ¤   Rect¤   ¤   ¤   cellRect,
f5d18a ¤   ¤   ¤   ¤   ¤   frame;
c1af5a
9867b9 ¤   CalcLocalFrameRect( frame );
a2a8e1 ¤   FetchIntersectingCells( frame, topLCell, botRCell );
3a8582 ¤   cell.col = 1;
ba191f ¤   for( cell.row = 0; cell.row <= mRows; cell.row++ )·
fec7a1 ¤   {
163883 ¤   ¤   if( CellIsSelected( cell ) ·&& cell != skipCell &&
1ebfb8 ¤   ¤   ¤   ( cell.row >= topLCell.row ) && (cell.row <= botRCell.row ) &&
060767 ¤   ¤   ¤   ( cell.col >= topLCell.col ) && (cell.col <= botRCell.col ) )
225b34 ¤   ¤   {
f65203 ¤   ¤   ¤   cellRgn = NewRgn();
6cf646 ¤   ¤   ¤   if( IsntNull( cellRgn ) )
faf776 ¤   ¤   ¤   {
d4da92 ¤   ¤   ¤   ¤   GetCellDragRgn( cell, cellRgn, true );
85a436 ¤   ¤   ¤   ¤   GetLocalCellRect( cell, cellRect );
8bdeda ¤   ¤   ¤   ¤   if( globalize )
e772c3 ¤   ¤   ¤   ¤   {
b2be90 ¤   ¤   ¤   ¤   ¤   LocalToPortPoint( topLeft( cellRect ) );
0b12fc ¤   ¤   ¤   ¤   ¤   PortToGlobalPoint( topLeft( cellRect ) );
c22613 ¤   ¤   ¤   ¤   }
2b7458 ¤   ¤   ¤   ¤   OffsetRgn( cellRgn, cellRect.left, cellRect.top );
e11178 ¤   ¤   ¤   ¤   UnionRgn(ioHiliteRgn, cellRgn, ioHiliteRgn);
dc1240 ¤   ¤   ¤   ¤   DisposeRgn( cellRgn );
7aa3a6 ¤   ¤   ¤   }
9d0fe4 ¤   ¤   }
9f9371 ¤   }
03efe6 }
7daf5a
5deb4f ¤   void¤
620f22 CKeyTable::AddFlavors(CKeyDragTask¤ *dragTask)
debb36 {
b34e0e ¤   pgpAssertAddrValid(dragTask, VoidAlign);
d8c8e3 ¤   mDragTask = dragTask;
8943ad ¤   SelectionAction(&CKeyTable::AddDrag);
4eefe6 }
3daf5a
2a640c ¤   Boolean¤
d2acc4 CKeyTable::GetKeyRef(
2c0643 ¤   ItemReference¤  item,·
751d77 ¤   PGPKeyRef *¤¤   key)
11bb36 {
635a6b ¤   TableIndexT¤¤   inWideOpenRow =
9fc140 ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(item);
9d6493 ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
b9e86c ¤   KeyTableRef¤¤   keyRef;
ba2eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
afaf5a
941cdc ¤   GetCellData(woCell, &keyRef, dataSize);
8867c5 ¤
10fbd3 ¤   *key = keyRef.ownerKey;
d7c2e7 ¤   return TRUE;
3defe6 }
f4af5a
8c640c ¤   Boolean¤
e65b29 CKeyTable::GetTextBlock(ItemReference¤  item,·
d186f2 ¤   ¤   ¤   ¤   ¤   ¤   void¤   ¤   ¤   **outData,
f2a6cd ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   ¤   *len)
70bb36 {
b85a6b ¤   TableIndexT¤¤   inWideOpenRow =
02c140 ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(item);
5b6493 ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
1fe86c ¤   KeyTableRef¤¤   keyRef;
6e2eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
1752d2 ¤   PGPKeySetRef¤   singleKeySet;
fafb19 ¤   PGPError¤   ¤   err;
19af5a
101cdc ¤   GetCellData(woCell, &keyRef, dataSize);
e967c5 ¤
76c543 ¤   // This cell has been dragged. ·We will now
1eff1f ¤   // create a text buffer of the ASCII armored
--424e 000d9eaac96401201b3 Page 69 of CKeyTable.cp
d5342a ¤   // version of the key to hand back.
2667c5 ¤
b231b3 ¤   *outData = NULL;
cfdcb3 ¤   if(keyRef.type == kKey)
e9c7a1 ¤   {
dc9f72 ¤   ¤   err = PGPNewSingletonKeySet(keyRef.u.key, &singleKeySet);
04121f ¤   ¤   if(IsntPGPError(err) && IsntNull(singleKeySet))
b95b34 ¤   ¤   {
23b022 ¤   ¤   ¤   PGPByte¤¤   *keyBuf;
a0196b ¤   ¤   ¤   PGPSize¤¤   keyBufLen;
20d98e ¤   ¤   ¤   char¤   ¤   comment[256];
e98c45 ¤   ¤   ¤   PGPBoolean¤ compat;
00531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
a29a85 ¤   ¤   ¤   comment[0] = 0;
a4be29 #if PGP_BUSINESS_SECURITY
8b4457 ¤   ¤   ¤   PGPGetPrefStringBuffer(
e90786 ¤   ¤   ¤   ¤   ¤   gAdminPrefRef,
0f075a ¤   ¤   ¤   ¤   ¤   kPGPPrefComments,
525488 ¤   ¤   ¤   ¤   ¤   sizeof(comment), comment);
ba97b2 #endif¤ // PGP_BUSINESS_SECURITY
f19b1a ¤   ¤   ¤   if(comment[0] == 0)
0a8102 ¤   ¤   ¤   ¤   PGPGetPrefStringBuffer(
b06037 ¤   ¤   ¤   ¤   ¤   ¤   gPrefRef,
47739b ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefComment,
2d8c3a ¤   ¤   ¤   ¤   ¤   ¤   sizeof(comment), comment);
ef87c7 ¤   ¤   ¤
415559 ¤   ¤   ¤   PGPGetPrefBoolean( gPrefRef, kPGPPrefExportKeysCompatible,
4cba1e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &compat );
6087c7 ¤   ¤   ¤
c8eed1 ¤   ¤   ¤   err = PGPExportKeySet( singleKeySet,
68b8be ¤   ¤   ¤   ¤   ¤   PGPOAllocatedOutputBuffer(gPGPContext, &keyBuf,
40bb69 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMaxKeyBuffer, &keyBufLen),
5f6a67 ¤   ¤   ¤   ¤   ¤   PGPOCommentString(gPGPContext, comment),
614129 ¤   ¤   ¤   ¤   ¤   PGPOVersionString(gPGPContext, pgpVersionHeaderString),
0980df ¤   ¤   ¤   ¤   ¤   compat ?
7cd473 ¤   ¤   ¤   ¤   ¤   PGPOExportFormat(gPGPContext, kPGPExportFormat_Basic) :
df918f ¤   ¤   ¤   ¤   ¤   PGPOExportFormat(gPGPContext, kPGPExportFormat_Complete),
7a7237 ¤   ¤   ¤   ¤   ¤   PGPOLastOption(gPGPContext));
c4524f ¤   ¤   ¤   pgpAssertNoErr(err);
9a2453 ¤   ¤   ¤   PGPFreeKeySet(singleKeySet);
b6768c ¤   ¤   ¤   if(IsntPGPError(err))
7cf776 ¤   ¤   ¤   {
8eb070 ¤   ¤   ¤   ¤   *outData = (void *)keyBuf;
6e20e2 ¤   ¤   ¤   ¤   *len = keyBufLen;
3306e0 ¤   ¤   ¤   ¤   return TRUE;
57a3a6 ¤   ¤   ¤   }
a5bb8c ¤   ¤   ¤   else
000124 ¤   ¤   ¤   ¤   ReportPGPError(err);
fc0fe4 ¤   ¤   }
979371 ¤   }
40a230 ¤   return FALSE;
ddefe6 }
a4af5a
b464d9 ¤   ¤   Boolean
d589ba CKeyTable::GetHFS(
351d02 ¤   ItemReference¤  item,
d78597 ¤   DragReference¤  dragRef,
8dd6ef ¤   FSSpec¤ ¤   ¤   *spec)
9cbb36 {
de1841 ¤   OSErr¤  ¤   theErr;
e3155d ¤   AEDesc¤ ¤   droppedLocation;
058250 ¤   CInfoPBRec¤ catInfo;
f467c5 ¤
594dfb ¤   pgpAssertAddrValid(spec, FSSpec);
154b45 ¤   theErr = ::GetDropLocation(dragRef, &droppedLocation);
51620a ¤   pgpAssert(theErr == noErr);
3f98c3 ¤   if(theErr == noErr)
57c7a1 ¤   {
042918 ¤   ¤   Boolean¤isChanged;
fdaf5a
5df408 ¤   ¤   pgpAssert(droppedLocation.descriptorType == typeAlias);
d911f7 ¤   ¤   StHandleLocker¤ lock(droppedLocation.dataHandle);
--5271 000c4ac661f401201b3 Page 70 of CKeyTable.cp
2ac0bd ¤   ¤   theErr = ::ResolveAlias(¤   nil,·
0a6c48 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   AliasHandle(droppedLocation.dataHandle),
e6c150 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   spec,
e1f35c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &isChanged);
131b52 ¤   ¤
54e9f6 ¤   ¤   pgpAssert(theErr == noErr);
709371 ¤   }
2467c5 ¤
d9f426 ¤   if (theErr == noErr)
a3c7a1 ¤   {
01ae69 ¤   ¤   catInfo.hFileInfo.ioCompletion ¤= nil;
4888c4 ¤   ¤   catInfo.hFileInfo.ioNamePtr ¤   = spec->name;
aa4b52 ¤   ¤   catInfo.hFileInfo.ioVRefNum¤¤   = spec->vRefNum;
0ebb67 ¤   ¤   catInfo.hFileInfo.ioFDirIndex¤  = 0;
d1ae76 ¤   ¤   catInfo.hFileInfo.ioDirID¤  ¤   = spec->parID;
5b1b52 ¤   ¤
f53755 ¤   ¤   theErr = PBGetCatInfoSync(&catInfo);
4b1b52 ¤   ¤
efaf5a
f20f71 ¤   ¤   spec->parID ¤   ¤   ¤   ¤   ¤   ¤   = catInfo.hFileInfo.ioDirID;
2f67c5 ¤
aae9f6 ¤   ¤   pgpAssert(theErr == noErr);
919371 ¤   }
17af5a
b9f426 ¤   if (theErr == noErr)
7fc7a1 ¤   {
5b9f3e ¤   ¤   TableIndexT¤¤   inWideOpenRow =
c0d463 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCollapsableTree->GetWideOpenIndex(item);
f12bad ¤   ¤   STableCell¤ ¤   woCell(inWideOpenRow, 1);
9b4532 ¤   ¤   KeyTableRef¤¤   keyRef;
78a399 ¤   ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef),
0ee481 ¤   ¤   ¤   ¤   ¤   ¤   len;
d6544d ¤   ¤   uchar¤  ¤   ¤   userIDStr[kUserIDStringLength];
babda1 ¤   ¤   PGPKeySetRef¤   singleKeySet;
7ecf44 ¤   ¤   PGPError¤   ¤   err;
e31b52 ¤   ¤
4d048c ¤   ¤   GetCellData(woCell, &keyRef, dataSize);
653b38 ¤   ¤   // This cell has been dragged to the Finder. ·We will now
3a08b6 ¤   ¤   // create a file of the ASCII armored version of the key.
621b52 ¤   ¤
e171ed ¤   ¤   if(keyRef.type == kKey)
675b34 ¤   ¤   {
ee8a51 ¤   ¤   ¤   err = PGPNewSingletonKeySet(keyRef.u.key, &singleKeySet);
039d48 ¤   ¤   ¤   if(IsntPGPError(err) && IsntNull(singleKeySet))
e4f776 ¤   ¤   ¤   {
7371d1 ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer(keyRef.u.key,
6ea51e ¤   ¤   ¤   ¤   ¤   ¤   kUserIDStringLength - 1, (char *)userIDStr, &len);
d27b2f ¤   ¤   ¤   ¤   pgpAssert(!err);
1be4e2 ¤   ¤   ¤   ¤   userIDStr[len] = 0;
a41df6 ¤   ¤   ¤   ¤   if(len > 31)
0b72c3 ¤   ¤   ¤   ¤   {
01d225 ¤   ¤   ¤   ¤   ¤   userIDStr[30] = 0xC9; /* Elipses */
aa5d75 ¤   ¤   ¤   ¤   ¤   userIDStr[31] = 0;
b02613 ¤   ¤   ¤   ¤   }
d53ed7 ¤   ¤   ¤   ¤   pgpAssert(0);
bbe3a4 ¤   ¤   ¤   ¤   // Temporarily commented out following line
e35b84 ¤   ¤   ¤   ¤   //err = pgpExportKeyFile(singleKeySet, userIDStr);
197b2f ¤   ¤   ¤   ¤   pgpAssert(!err);
0236fc ¤   ¤   ¤   ¤   //pgpFixBeforeShip("handles dupe filenames??");
2e22eb ¤   ¤   ¤   ¤   PGPFreeKeySet(singleKeySet);
c206e0 ¤   ¤   ¤   ¤   return TRUE;
a8a3a6 ¤   ¤   ¤   }
ab0fe4 ¤   ¤   }
c69371 ¤   }
a267c5 ¤
d6c0db ¤   return theErr == noErr;
ccefe6 }
a4af5a
3c640c ¤   Boolean¤
8de722 CKeyTable::AddDrag(STableCell& aCell)
0fbb36 {
c4850a ¤   pgpAssertAddrValid(mDragTask, VoidAlign);
--90eb 0000421c9a4401201b3 Page 71 of CKeyTable.cp
91d17e ¤   mDragTask->AddThisFlavor(aCell.row);
2fab7e ¤   return true;
82efe6 }
e3af5a
526d52 ¤   void
24c0d3 CKeyTable::FocusDropArea()
e9bb36 {
b2e8b9 ¤   OutOfFocus(nil);
a39ecb ¤   FocusDraw();
14efe6 }
03af5a
456d52 ¤   void
6fa689 CKeyTable::HiliteDropArea(
0de9b9 ¤   DragReference¤  inDragRef)
48bb36 {
bd4c7a ¤   Rect¤   ¤   ¤   frame;
a20541 ¤   Int16¤  ¤   ¤   depth;
7667c5 ¤
f8ba8f ¤   pgpAssert( IsNull( mDragHiliteWorld ) && IsNull( mDragHiliteRgn ) );
9f67c5 ¤
ca67b9 ¤   CalcLocalFrameRect( frame );
1167c5 ¤
2f1581 ¤   StDeviceLoop¤   devLoop(frame);¤¤
ec33ef ¤   if(devLoop.NextDepth(depth))
d6c7a1 ¤   {
39e57e ¤   ¤   RgnHandle¤  innerRgn;
407bda ¤   ¤   RGBColor¤   opColor;
0d1b52 ¤   ¤
be41f1 ¤   ¤   try
195b34 ¤   ¤   {
02213c ¤   ¤   ¤   mDragHiliteWorld = new LGWorld( frame, depth, useTempMem );
5c6687 ¤   ¤   ¤   mDragHiliteRgn = NewRgn();
413f0e ¤   ¤   ¤   innerRgn = NewRgn();
d721bf ¤   ¤   ¤   RectRgn( mDragHiliteRgn, &frame );
87c153 ¤   ¤   ¤   CopyRgn( mDragHiliteRgn, innerRgn );
3e522b ¤   ¤   ¤   InsetRgn( innerRgn, 3, 3 );
09850d ¤   ¤   ¤   DiffRgn( mDragHiliteRgn, innerRgn, mDragHiliteRgn );
3e7bea ¤   ¤   ¤   DisposeRgn( innerRgn );
b287c7 ¤   ¤   ¤
5db639 ¤   ¤   ¤   if( mDragHiliteWorld->BeginDrawing() )
7cf776 ¤   ¤   ¤   {
f7d7d9 ¤   ¤   ¤   ¤   GrafPtr¤thisPort;
0d2b85 ¤   ¤   ¤   ¤
4ce9bb ¤   ¤   ¤   ¤   GetPort( &thisPort );
2824c8 ¤   ¤   ¤   ¤   StColorState::Normalize();
ebe7dd ¤   ¤   ¤   ¤   CopyBits( &GetMacPort()->portBits,
8fa09b ¤   ¤   ¤   ¤   ¤   ¤   ¤   &thisPort->portBits,
f68cca ¤   ¤   ¤   ¤   ¤   ¤   ¤   &frame, &frame, srcCopy, mDragHiliteRgn );
ad5c93 ¤   ¤   ¤   ¤   mDragHiliteWorld->EndDrawing();
982b85 ¤   ¤   ¤   ¤
7998a0 ¤   ¤   ¤   ¤   SetThemePen( kThemeDragHiliteBrush, 16, 1 );
d1cdf0 ¤   ¤   ¤   ¤   opColor.red = opColor.green = opColor.blue = 0x7FFF;
5ddd93 ¤   ¤   ¤   ¤   OpColor( &opColor );
ad5025 ¤   ¤   ¤   ¤   PenMode( blend );
b3c0c4 ¤   ¤   ¤   ¤   PaintRgn( mDragHiliteRgn );
34a3a6 ¤   ¤   ¤   }
7e0fe4 ¤   ¤   }
e3bd0e ¤   ¤   catch(...)
e65b34 ¤   ¤   {
a64f06 ¤   ¤   ¤   // Oh well, we ran out of memory, no problem
850fe4 ¤   ¤   }
899371 ¤   }
45efe6 }
b0af5a
3a6d52 ¤   void
9b70ff CKeyTable::UnhiliteDropArea(
3ee9b9 ¤   DragReference¤  inDragRef)
f5bb36 {
8d1fc1 ¤   Rect¤   frame;
f640bf ¤   CalcLocalFrameRect(frame);
88e708 ¤   StColorState::Normalize();
047ecc ¤   if( IsntNull( mDragHiliteWorld ) && IsntNull( mDragHiliteRgn ) )
--6cec 0004401ed6e401201b3 Page 72 of CKeyTable.cp
f7c7a1 ¤   {
a0a429 ¤   ¤   mDragHiliteWorld->CopyImage(GetMacPort(), frame, srcCopy,
a274f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mDragHiliteRgn);
a0ebaf ¤   ¤   DisposeRgn( mDragHiliteRgn );
db76a7 ¤   ¤   mDragHiliteRgn = NULL;
7fad79 ¤   ¤   delete mDragHiliteWorld;
f9894d ¤   ¤   mDragHiliteWorld = NULL;
1d9371 ¤   }
29efe6 }
4faf5a
8f7e69 ¤   Boolean
85af38 CKeyTable::ItemIsAcceptable(DragReference inDragRef, ItemReference inItemRef)
ffbb36 {
ca5ee0 ¤   Boolean¤¤   ¤   isAcceptable = FALSE;
083a61 ¤   ushort¤ ¤   ¤   numFlavors;
5d25e4 ¤   OSStatus¤   ¤   status;
e867c5 ¤
d18588 ¤   if(!mMutableRing || mSendingDrag)
2892b0 ¤   ¤   return false;
bd5ece ¤   status = CountDragItemFlavors(inDragRef, inItemRef, &numFlavors);
c3115f ¤   if(IsntErr(status))
a0c7a1 ¤   {
98abfe ¤   ¤   for(ushort flavorIndex = 1; flavorIndex <= numFlavors; flavorIndex++)
095b34 ¤   ¤   {
2a9a9f ¤   ¤   ¤   FlavorType¤ flavorType;
ee87c7 ¤   ¤   ¤
0f0895 ¤   ¤   ¤   status = GetFlavorType(inDragRef, inItemRef, flavorIndex,
80b4ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorType);
104a64 ¤   ¤   ¤   if(IsntErr(status))
aff776 ¤   ¤   ¤   {
03e6d2 ¤   ¤   ¤   ¤   if(flavorType == kKeyDragFlavor)
8872c3 ¤   ¤   ¤   ¤   {
6846e1 ¤   ¤   ¤   ¤   ¤   isAcceptable = TRUE;
412613 ¤   ¤   ¤   ¤   }
677109 ¤   ¤   ¤   ¤   else if(flavorType == 'TEXT')
2b72c3 ¤   ¤   ¤   ¤   {
1246e1 ¤   ¤   ¤   ¤   ¤   isAcceptable = TRUE;
fa2613 ¤   ¤   ¤   ¤   }
031657 ¤   ¤   ¤   ¤   else if(flavorType == flavorTypeHFS)
3572c3 ¤   ¤   ¤   ¤   {
c44975 ¤   ¤   ¤   ¤   ¤   HFSFlavor¤  flavorData;
3ade4b ¤   ¤   ¤   ¤   ¤   ByteCount¤  dataSize;
dd0e88 ¤   ¤   ¤   ¤   ¤   ByteCount¤  dataOffset;
7aae30 ¤   ¤   ¤   ¤   ¤
1f4171 ¤   ¤   ¤   ¤   ¤   dataSize ¤  = sizeof(flavorData);
9ea553 ¤   ¤   ¤   ¤   ¤   dataOffset¤ = 0;
14ae30 ¤   ¤   ¤   ¤   ¤
f5a9e8 ¤   ¤   ¤   ¤   ¤   status = GetFlavorData(inDragRef, inItemRef, flavorType,
e98cfe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorData, (Int32 *) &dataSize,
2d0822 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dataOffset);
0504cd ¤   ¤   ¤   ¤   ¤   if(IsntErr(status))
7f4859 ¤   ¤   ¤   ¤   ¤   {
a811af ¤   ¤   ¤   ¤   ¤   ¤   // Check for dragged folders and/or disks
a594aa ¤   ¤   ¤   ¤   ¤   ¤
cd2290 ¤   ¤   ¤   ¤   ¤   ¤   if(flavorData.fileType != 'disk' &&
999b3b ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorData.fileType != 'fold')
c68fec ¤   ¤   ¤   ¤   ¤   ¤   {
d97b5d ¤   ¤   ¤   ¤   ¤   ¤   ¤   isAcceptable = true;
aedb3c ¤   ¤   ¤   ¤   ¤   ¤   }
2a1c89 ¤   ¤   ¤   ¤   ¤   }
bb2613 ¤   ¤   ¤   ¤   }
25af5a
a7974b ¤   ¤   ¤   ¤   if(isAcceptable)
2214c3 ¤   ¤   ¤   ¤   ¤   break;
a7a3a6 ¤   ¤   ¤   }
cc0fe4 ¤   ¤   }
379371 ¤   }
d17b24 ¤   return(isAcceptable);
a4efe6 }
dfaf5a
446d52 ¤   void
446f0c CKeyTable::StepForward()
--83c4 0008260e96e401201b3 Page 73 of CKeyTable.cp
2cbb36 {
f3642b ¤   if(!WeAreFront())
e9c7a1 ¤   {
fbd993 ¤   ¤   if(!mNotified)
795b34 ¤   ¤   {
b676d4 ¤   ¤   ¤   GetIndString(¤  sNotifyString,
7cf307 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
4fb3d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStepForwardID);
9347c5 ¤   ¤   ¤   GetIconSuite( &mNotifyIconSuite, 128, svAllSmallData );
cd9d06 ¤   ¤   ¤   HNoPurge( mNotifyIconSuite );
1f9fbb ¤   ¤   ¤   sImportNotification.qType = nmType;
20a016 ¤   ¤   ¤   sImportNotification.nmMark = 1;
a07286 ¤   ¤   ¤   sImportNotification.nmIcon = mNotifyIconSuite;
aec0e9 ¤   ¤   ¤   sImportNotification.nmSound = NULL;
e1ce2c ¤   ¤   ¤   sImportNotification.nmStr = sNotifyString;
953796 ¤   ¤   ¤   sImportNotification.nmResp = NULL;
f63f6d ¤   ¤   ¤   sImportNotification.nmRefCon = 0;
eca53d ¤   ¤   ¤   NMInstall(&sImportNotification);
dc4840 ¤   ¤   ¤   mBlockDialogDelays = 3;
8da034 ¤   ¤   ¤   mNotified = TRUE;
bf0fe4 ¤   ¤   }
629371 ¤   }
ff0e24 ¤   else
85c7a1 ¤   {
d82cd8 ¤   ¤   mBlockDialogDelays = 0;
e1526c ¤   ¤   mNotified = FALSE;
8a9371 ¤   }
b2efe6 }
d2af5a
4a6d52 ¤   void
cb1758 CKeyTable::ReceiveDragItem(
8e9701 ¤   DragReference¤  inDragRef,
d0c31d ¤   DragAttributes¤ inDragAttrs,
5382a5 ¤   ItemReference¤  inItemRef,
011a3a ¤   Rect¤   ¤   ¤   &/*inItemBounds*/)¤ // In Local coordinates
95bb36 {
d93880 ¤   Boolean¤¤   ¤   received = FALSE,
233486 ¤   ¤   ¤   ¤   ¤   localSend;
563a61 ¤   ushort¤ ¤   ¤   numFlavors;
1d25e4 ¤   OSStatus¤   ¤   status;
c067c5 ¤
2d30bb ¤   localSend = (inDragAttrs & kDragInsideSenderApplication);
cb67c5 ¤
435ece ¤   status = CountDragItemFlavors(inDragRef, inItemRef, &numFlavors);
21115f ¤   if(IsntErr(status))
90c7a1 ¤   {
ffabfe ¤   ¤   for(ushort flavorIndex = 1; flavorIndex <= numFlavors; flavorIndex++)
ed5b34 ¤   ¤   {
899a9f ¤   ¤   ¤   FlavorType¤ flavorType;
d90056 ¤   ¤   ¤   Size¤   ¤   expectedSize = 0,
25dadc ¤   ¤   ¤   ¤   ¤   ¤   droppedSize;
b087c7 ¤   ¤   ¤
b40895 ¤   ¤   ¤   status = GetFlavorType(inDragRef, inItemRef, flavorIndex,
07b4ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorType);
0e4a64 ¤   ¤   ¤   if(IsntErr(status))
d5f776 ¤   ¤   ¤   {
bde6d2 ¤   ¤   ¤   ¤   if(flavorType == kKeyDragFlavor)
d072c3 ¤   ¤   ¤   ¤   {
1cf5ad ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   keySet;
d1a28c ¤   ¤   ¤   ¤   ¤   PGPKeyRef¤  ¤   key;
c5ae30 ¤   ¤   ¤   ¤   ¤
ac4e06 ¤   ¤   ¤   ¤   ¤   status = GetFlavorDataSize(inDragRef, inItemRef,
d44ef8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, &expectedSize);
11f4b7 ¤   ¤   ¤   ¤   ¤   if( expectedSize == sizeof(PGPKeyRef) )
454859 ¤   ¤   ¤   ¤   ¤   {
3e78b4 ¤   ¤   ¤   ¤   ¤   ¤   droppedSize = expectedSize;
6f700a ¤   ¤   ¤   ¤   ¤   ¤   status = GetFlavorData(inDragRef, inItemRef,
329559 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, &key, &droppedSize, 0);
4889a6 ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) &&
2e17aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   IsntPGPError( PGPNewSingletonKeySet( key, &keySet )¶
654022 ·) )
828fec ¤   ¤   ¤   ¤   ¤   ¤   {
--ad0e 0011a5f3ddc401201b3 Page 74 of CKeyTable.cp
56a34e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ImportKeysFromKeySet( keySet );
6835c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   received = TRUE;
96db3c ¤   ¤   ¤   ¤   ¤   ¤   }
ad1c89 ¤   ¤   ¤   ¤   ¤   }
802613 ¤   ¤   ¤   ¤   }
9d7109 ¤   ¤   ¤   ¤   else if(flavorType == 'TEXT')
3372c3 ¤   ¤   ¤   ¤   {
874639 ¤   ¤   ¤   ¤   ¤   PGPByte¤¤   ¤   *droppedBuf;
47ae30 ¤   ¤   ¤   ¤   ¤
464e06 ¤   ¤   ¤   ¤   ¤   status = GetFlavorDataSize(inDragRef, inItemRef,
b74ef8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, &expectedSize);
5b6a14 ¤   ¤   ¤   ¤   ¤   if(IsntErr(status) && IsntNull(droppedBuf =
551624 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPByte *)pgpAlloc(expectedSize)))
954859 ¤   ¤   ¤   ¤   ¤   {
bf78b4 ¤   ¤   ¤   ¤   ¤   ¤   droppedSize = expectedSize;
c0700a ¤   ¤   ¤   ¤   ¤   ¤   status = GetFlavorData(inDragRef, inItemRef,
959b08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, droppedBuf, &droppedSize, 0);
40b67f ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(status);
68eca9 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssert(droppedSize == expectedSize);
fd8cab ¤   ¤   ¤   ¤   ¤   ¤   if(IsntErr(status))
5d8fec ¤   ¤   ¤   ¤   ¤   ¤   {
8daead ¤   ¤   ¤   ¤   ¤   ¤   ¤   KeyImportStruct *kis;
75531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
46136a ¤   ¤   ¤   ¤   ¤   ¤   ¤   kis = (KeyImportStruct *)
79f680 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAlloc(sizeof(KeyImportStruct));
2da9e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(IsntNull(kis))
1506b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
6a101a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kis->savedImportIsFile = FALSE;
279320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kis->bypassImportDialog = localSend;
503cd1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kis->savedImportBuffer = droppedBuf;
d69493 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kis->savedImportBufferSize = droppedSize;
9b4ee5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kis->next = mImports;
51b099 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mImports = kis;
70f7aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   StartIdling();
e188d4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   StepForward();
045268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
12db3c ¤   ¤   ¤   ¤   ¤   ¤   }
f57f8b ¤   ¤   ¤   ¤   ¤   ¤   else
bf75ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpFree(droppedBuf);
d51c89 ¤   ¤   ¤   ¤   ¤   }
57369d ¤   ¤   ¤   ¤   ¤   received = TRUE;
842613 ¤   ¤   ¤   ¤   }
511657 ¤   ¤   ¤   ¤   else if(flavorType == flavorTypeHFS)
2e72c3 ¤   ¤   ¤   ¤   {
324975 ¤   ¤   ¤   ¤   ¤   HFSFlavor¤  flavorData;
80de4b ¤   ¤   ¤   ¤   ¤   ByteCount¤  dataSize;
73ae30 ¤   ¤   ¤   ¤   ¤
a14171 ¤   ¤   ¤   ¤   ¤   dataSize ¤  = sizeof(flavorData);
0eae30 ¤   ¤   ¤   ¤   ¤
0ba9e8 ¤   ¤   ¤   ¤   ¤   status = GetFlavorData(inDragRef, inItemRef, flavorType,
fc710d ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorData, (Int32 *) &dataSize, 0);
7904cd ¤   ¤   ¤   ¤   ¤   if(IsntErr(status))
544859 ¤   ¤   ¤   ¤   ¤   {
a4b39c ¤   ¤   ¤   ¤   ¤   ¤   ImportKeysFromFile(&flavorData.fileSpec, localSend);
373370 ¤   ¤   ¤   ¤   ¤   ¤   received = TRUE;
251c89 ¤   ¤   ¤   ¤   ¤   }
522613 ¤   ¤   ¤   ¤   }
2aaf5a
0df5bf ¤   ¤   ¤   ¤   if(received)
5914c3 ¤   ¤   ¤   ¤   ¤   break;
0fa3a6 ¤   ¤   ¤   }
c00fe4 ¤   ¤   }
429371 ¤   }
85efe6 }
1aaf5a
--1d57 000af198255401201b4 Page 1 of CKeyTable.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
e883ba ¤   $Id: CKeyTable.h,v 1.55.2.1.2.1 1998/11/12 03:08:03 heller Exp $
1ef7f7 ____________________________________________________________________________*/
1d7b7d #pragma once
56af5a
79dfca #include <UGWorld.h>
b01d80 #include <LDragAndDrop.h>
3df1a9 #include <LListener.h>
41ea2f #include <LBroadcaster.h>
9b0a93 #include <LPeriodical.h>
a52f94 #include <LCommander.h>
89af5a
2ca076 #include "pgpKeys.h"
cffbb5 #include "CDragSource.h"
2b1a11 #include "CPGPHierarchyTable.h"
b0ed82 #include "pgpKeyServerPrefs.h"
b2af5a
be9f3d class CKeyDragTask;
927265 class CKeyTableLabels;
231b02 class CSearchWindow;
2f215a class CGroupsWindow;
6eaf5a
51c14f const ResIDT¤   kColumnTitleStringsID¤  =¤  1000;
f7b6f5 const Int16¤¤   kMaxKeyTableColumnTypes¤=¤  9;
7e87db const Int16¤¤   kMaxKeypressInterval¤   =¤  60;
e2ba86 const Int16¤¤   kMaxSearchStringSize¤   =¤  64;
0a70c7 const Int16¤¤   kDropFlagSlop¤  ¤   ¤   =¤  20;
d91fe5 const Int16¤¤   kLevelIndent¤   ¤   ¤   =¤  20;
3b97e5 const MessageT¤ kRebuildServersMessage¤ =¤  'reSM';
eefb6e const MessageT¤ kKeyTableRedrawMessage¤ =¤  'redr';
747994 const MessageT¤ kKeyTableResyncMessage¤ =¤  'resy';
80f7c8 const Int16¤¤   kLeftIndent¤¤   ¤   ¤   =¤  2;
e555d9 const Int16¤¤   kIconWidth¤ ¤   ¤   ¤   =¤  16;
363d88 const Int16¤¤   kIconHeight¤¤   ¤   ¤   =¤  16;
97c41b const Int16¤¤   kLeftBorder¤¤   ¤   ¤   =¤  4;
3d9e34 const Int16¤¤   kBottomBorder¤  ¤   ¤   =¤  5;
a0af5a
1af6df typedef struct KeyTableColumnInfo
fdbb36 {
405a53 ¤   Int16¤  numActiveColumns;
34f203 ¤   Int16¤  columns[kMaxKeyTableColumnTypes];
416a59 ¤   Int16¤  columnWidths[kMaxKeyTableColumnTypes];
84e2b2 } KeyTableColumnInfo;
56af5a
0e87cd enum KeyTableEntryType¤ {¤  kKey, kUserID, kSignature¤  };
90af5a
279cc0 typedef struct KeyTableRef
88bb36 {
33191b ¤   enum KeyTableEntryType¤ type;
126725 ¤   PGPKeyRef¤  ¤   ¤   ¤   ownerKey;
b6362d ¤   Boolean¤¤   ¤   ¤   ¤   terminated;
cb444f ¤   ResIDT¤ ¤   ¤   ¤   ¤   iconID;
bfc4b8 ¤   Int16¤  ¤   ¤   ¤   ¤   selectRight,
17308f ¤   ¤   ¤   ¤   ¤   ¤   ¤   selectLeft;
b9f20a ¤   union
69c7a1 ¤   {
e798b5 ¤   ¤   PGPKeyRef¤  ¤   ¤   key;
4a528c ¤   ¤   PGPUserIDRef¤   ¤   user;
da39d4 ¤   ¤   PGPSigRef¤  ¤   ¤   sig;
41fef9 ¤   } u;
3e60d5 } KeyTableRef;
41af5a
410276 typedef struct KeyImportStruct
97bb36 {
bd1c40 ¤   Boolean¤¤   ¤   ¤   savedImportIsFile;
3bed80 ¤   Boolean¤¤   ¤   ¤   bypassImportDialog;
af6114 ¤   FSSpec¤ ¤   ¤   ¤   savedImportSpec;
--aa42 000f8638df0401201b4 Page 2 of CKeyTable.h
8aa2f2 ¤   PGPByte¤¤   ¤   ¤   *savedImportBuffer;
fd87be ¤   PGPSize¤¤   ¤   ¤   savedImportBufferSize;
d8c6d6 ¤   KeyImportStruct¤¤   *next;
a2382e } KeyImportStruct;
5eaf5a
0baf5a
386fa1 class¤  CKeyTable¤  :¤  public CPGPHierarchyTable,
723300 ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster,
18a879 ¤   ¤   ¤   ¤   ¤   ¤   public LCommander,
c4840d ¤   ¤   ¤   ¤   ¤   ¤   public CDragSource,
54c931 ¤   ¤   ¤   ¤   ¤   ¤   public LDragAndDrop,
808565 ¤   ¤   ¤   ¤   ¤   ¤   public LListener,
52dddc ¤   ¤   ¤   ¤   ¤   ¤   public LPeriodical
9dbb36 {
3a5ed4 public:
434d2f ¤   enum { class_ID = 'keyT' };
f8899a ¤   ¤   ¤   ¤   ¤   ¤   CKeyTable(LStream *inStream);
6e3724 ¤   virtual¤¤   ¤   ¤   ~CKeyTable();
a96ed9 ¤   void¤   ¤   ¤   ¤   FinishCreateSelf();
d8c3bf ¤   virtual Boolean¤¤   ObeyCommand(CommandT inCommand, void* ioParam);¤
cb48a0 ¤   virtual void¤   ¤   FindCommandStatus(CommandT inCommand,
020bef ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
7840c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName);
d535cc ¤   virtual Boolean¤¤   HandleKeyPress(const EventRecord&¤  inKeyEvent);
11d3d4 ¤   virtual void¤   ¤   DrawSelf();
c383ca ¤   virtual void¤   ¤   ClickSelf(const SMouseDownEvent¤&inMouseDown);
ceb8f9 ¤   virtual void¤   ¤   Click(SMouseDownEvent¤  &inMouseDown);
fd8e54 ¤   virtual void¤   ¤   ListenToMessage(¤   MessageT¤   inMessage,
dee5d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void¤   ¤   *ioParam);
db75ae ¤   virtual void¤   ¤   SpendTime(const EventRecord¤¤   &inMacEvent);
2b67c5 ¤
f8ff1a ¤   void¤   ¤   ¤   ¤   ScrollImageBy(
b4bdf6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   inLeftDelta,
ac0aae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   inTopDelta,
be4d85 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   inRefresh);
486596 ¤   void¤   ¤   ¤   ¤   SetKeyLabels(CKeyTableLabels *keyLabels);
d8af5a
e4daa0 ¤   // Drag and Drop Class Overrides
0ca35b ¤   void¤   ¤   ¤   ¤   FocusDropArea();
7a2625 ¤   virtual Boolean¤¤   ItemIsAcceptable(
c986e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragReference¤  inDragRef,
8da0ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ItemReference¤  inItemRef);
6b86c1 ¤   virtual void¤   ¤   ReceiveDragItem(
c186e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragReference¤  inDragRef,
4be54c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragAttributes¤ inDragAttrs,
0c934d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ItemReference¤  inItemRef,
65f608 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   ¤   &inItemBounds);
4dacf0 ¤   void¤   ¤   ¤   ¤   HiliteDropArea(¤DragReference¤  inDragRef);
80d9d0 ¤   void¤   ¤   ¤   ¤   UnhiliteDropArea(DragReference¤ inDragRef);
8267c5 ¤
8ffcae ¤   // The next four functions are overrides from CDragSource
008b08 ¤   virtual void¤   ¤   GetDragHiliteRgn(¤  RgnHandle¤  ¤   ioHiliteRgn,
730df8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell&¤  skipCell,
b70605 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   globalize );
e9fffd ¤   virtual void¤   ¤   AddFlavors(¤¤   ¤   CKeyDragTask¤   *dragTask);
6914e2 ¤   virtual Boolean¤¤   GetKeyRef(¤ ¤   ¤   ItemReference¤  item,·
a4ef50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef *¤¤   key);
c98ec4 ¤   virtual Boolean¤¤   GetTextBlock(¤  ¤   ItemReference¤  item,·
9b0e7c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void¤   ¤   ¤   **outData,
50e74a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   ¤   *len );
c6ec9e ¤   virtual Boolean¤¤   GetHFS(¤¤   ¤   ¤   ItemReference¤  item,
131890 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragReference¤  dragRef,
b4d906 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FSSpec¤ ¤   ¤   *spec);
e4af5a
62142f ¤   // Key Management routines
88c711 ¤   virtual void¤   ¤   SetKeyDBInfo(¤  PGPKeySetRef¤   keySet,
4ec76e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   writable,
2e3e42 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   defaultRings );
baf0b1 ¤   void¤   ¤   ¤   ¤   GetKeyColumnInfo(KeyTableColumnInfo *columnInfo);
0875b7 ¤   void¤   ¤   ¤   ¤   ImportKeysFromHandle(Handle data);
011b29 ¤   void¤   ¤   ¤   ¤   ImportKeysFromKeySet(PGPKeySetRef keySet);
f8af5a
--ee3c 0001efcef76401201b4 Page 3 of CKeyTable.h
183d2b ¤   // Table Management routines
6a0a17 ¤   Boolean¤¤   ¤   ¤   ResyncTable(Boolean collapse, Boolean onlyUnmarked);
5b2c37 ¤   void¤   ¤   ¤   ¤   RedrawTable();
f9ab27 ¤   void¤   ¤   ¤   ¤   ClearTable();
430d7e ¤   void¤   ¤   ¤   ¤   Reset1();
1e59a9 ¤   void¤   ¤   ¤   ¤   Empty();
9da545 ¤   void¤   ¤   ¤   ¤   MoveColumn( Int16 oldCol, Int16 newCol );
3a8ac9 ¤   void¤   ¤   ¤   ¤   ResizeColumn( Int16 col, Int16 newSize );
9267c5 ¤
2d8f6c ¤   static void¤¤   ¤   DrawIcon(
e89236 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ResIDT¤ ¤   ¤   ¤   iconID,
c02518 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   ¤   ¤   cellRect,
4ac7e1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32¤ ¤   ¤   ¤   indentLevel,
7798cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   IconTransformType¤  transform = kTransformNone );
0e67c5 ¤
9e7d45 ¤   Boolean¤¤   ¤   ¤   IsWritable()¤   {¤  return mMutableRing;¤   }
8a58f9 ¤   PGPKeySetRef¤   ¤   GetKeySet()¤¤   {¤  return mKeySet;¤¤   ¤   }
dcc8bc ¤   PGPKeyListRef¤  ¤   GetKeyList()¤   {¤  return mKeyList;¤   ¤   }
1eee96 ¤   void¤   ¤   ¤   ¤   BuildServerSubmenu();
587309 ¤   PGPBoolean¤ ¤   ¤   GetSelectionStats(
5de900 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  *numKeys,
332916 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  *numUserIDs,
9440b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  *numSigs );
f06306 ¤   void¤   ¤   ¤   ¤   GetSelectedKeySet(
912246 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef *selectedKeys );
fda2d3 protected:
5e3a3a ¤   virtual void¤   ¤   DrawCell(
2e0b7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   ¤   &inCell,
117ee5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect¤ ¤   ¤   ¤   &inLocalRect);
34f49f ¤   virtual void¤   ¤   ClickCell(
010285 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell&¤  ¤   inCell,
1b4c4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent&¤ inMouseDown);
356ad0 ¤   virtual void¤   ¤   HiliteCellActively(
0d6d8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &inCell,
8fffa6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   inHilite);
9cdf49 ¤   virtual void¤   ¤   HiliteCellInactively(
2d6d8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &inCell,
63ffa6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   inHilite);
4e191f ¤   void¤   ¤   ¤   ¤   ClickValidityCell(
51ea3a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell&¤  ¤   inCell);
dd0fb9 private:
5825f6 ¤   void¤   ¤   ¤   ¤   DrawCell1(
576d8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &inCell,
be0792 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect¤ ¤   ¤   &inLocalRect,
8d0d2b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   hilite,
017ab4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   inactive );
00f0e2 ¤   void¤   ¤   ¤   ¤   Reset();
37fca6 ¤   void¤   ¤   ¤   ¤   CommitKeySet();
1ae4ac ¤   Boolean¤¤   ¤   ¤   AskUserForUserID(Str255 userIDStr);
8fb7d5 ¤   Boolean¤¤   ¤   ¤   AskUserForPhotoID(void **photoData,
05ac1d ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤*photoDataSize);
b667c5 ¤
ac3441 ¤   Boolean¤¤   ¤   ¤   SelectionExists();
da846c ¤   void¤   ¤   ¤   ¤   CollapseKeys(Boolean all);
5af14b ¤   void¤   ¤   ¤   ¤   ExpandKeys();
69e695 ¤   UInt32¤ ¤   ¤   ¤   SelectionAction(
b69d00 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean (CKeyTable::*function)(STableCell&));
b077f4 ¤   Boolean¤¤   ¤   ¤   ShowKeyInfo(STableCell& inCell);
39dcba ¤   Boolean¤¤   ¤   ¤   Revoke(STableCell& inCell);
331c6e ¤   Boolean¤¤   ¤   ¤   Split(STableCell& inCell);
55619f ¤   Boolean¤¤   ¤   ¤   Delete(STableCell& inCell);
5cd1d3 ¤   Boolean¤¤   ¤   ¤   AddDrag(STableCell& inCell);
b84d27 ¤   Boolean¤¤   ¤   ¤   EnableKey(STableCell& inCell);
89a86c ¤   Boolean¤¤   ¤   ¤   DisableKey(STableCell& inCell);
051f4d ¤   Boolean¤¤   ¤   ¤   GetCellOnServer(STableCell& inCell);
411d56 ¤   Boolean¤¤   ¤   ¤   SendKeyToServer(STableCell& inCell);
3b3560 ¤   Boolean¤¤   ¤   ¤   GetKeyOnServer(PGPKeyRef key);
f87acc ¤   Boolean¤¤   ¤   ¤   SetDefault();
3d2034 ¤   void¤   ¤   ¤   ¤   AddUserID(PGPBoolean addPhotoID);
3b390d ¤   void¤   ¤   ¤   ¤   AddRevoker();
4bee8d ¤   void¤   ¤   ¤   ¤   Sign();
1eaa23 ¤   void¤   ¤   ¤   ¤   ReverifySigs();
--1d97 0001e28e66b401201b4 Page 4 of CKeyTable.h
92e126 ¤   static PGPError¤¤   ReverifySigsHandler(
579f65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPContextRef¤  context,
d050a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent¤   ¤   *event,
cdef23 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue¤   userValue );
8e2a88 ¤   PGPError¤   ¤   ¤   GetMetaIntroducers(PGPKeySetRef¤¤   *metaKeys);
878392 ¤   void¤   ¤   ¤   ¤   UpdateIntroducers();
745808 ¤   void¤   ¤   ¤   ¤   ImportHandler();
21fdd1 ¤   void¤   ¤   ¤   ¤   ImportKeysFromFile(FSSpec *keyFile, Boolean noDialog);
2039af ¤   void¤   ¤   ¤   ¤   UnmarkKey(PGPKeyRef inKey);
02717e ¤   void¤   ¤   ¤   ¤   RemoveKeyFromTable(PGPKeyRef inKey);
1fcff9 ¤   void¤   ¤   ¤   ¤   TerminateKey(PGPKeyRef inKey);
c31c4f ¤   void¤   ¤   ¤   ¤   RemoveTerminatedKeys();
863686 ¤   void¤   ¤   ¤   ¤   CopyKeys();
555c75 ¤   void¤   ¤   ¤   ¤   ExportSelected();
e92357 ¤   void¤   ¤   ¤   ¤   SelectSearchString();
6f5d48 ¤   void¤   ¤   ¤   ¤   SetupColumns();
a083ca ¤   Boolean¤¤   ¤   ¤   ColumnVisible(Int16¤columnID);
3a5deb ¤   void¤   ¤   ¤   ¤   ToggleColumn(Int16 columnID);
e3569e ¤   void¤   ¤   ¤   ¤   GetColumnCheck(¤Int16¤  ¤   columnID,
dfb330 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   &outEnabled,
a95b4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   &outUsesMark,
d277f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16¤ ¤   &outMark);
5d436d ¤   void¤   ¤   ¤   ¤   GetCellDragRgn(
04621f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell&¤  inCell,
11cb04 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   RgnHandle¤  ¤   ¤   dragRgn,
d004a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   cutout );
54f086 ¤   Boolean¤¤   ¤   ¤   DrawUserIDColumnCell(¤  KeyTableRef¤*ktr,
cebab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
1590fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth,
2bc295 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   hilite,
3bf537 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   inactive );
33c284 ¤   void¤   ¤   ¤   ¤   DrawValidityColumnCell(¤KeyTableRef¤*ktr,
34bab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
5504ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth);
57313b ¤   void¤   ¤   ¤   ¤   DrawTrustColumnCell(¤   KeyTableRef¤*ktr,
87bab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
4d04ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth);
fac5bc ¤   void¤   ¤   ¤   ¤   DrawSizeColumnCell(¤¤   KeyTableRef¤*ktr,
ddbab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
0004ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth);
83870d ¤   void¤   ¤   ¤   ¤   DrawKeyIDColumnCell(¤   KeyTableRef¤*ktr,
26bab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
2004ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth);
8ea200 ¤   void¤   ¤   ¤   ¤   DrawCreationColumnCell(¤KeyTableRef¤*ktr,
25bab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
6904ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth);
27d935 ¤   void¤   ¤   ¤   ¤   DrawExpirationColumnCell(KeyTableRef *ktr,
7ebab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
7504ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth);
836a4e ¤   void¤   ¤   ¤   ¤   DrawMRKColumnCell(¤ ¤   KeyTableRef¤*ktr,
9ebab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
7f04ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth);
65dd2e ¤   void¤   ¤   ¤   ¤   DrawDescriptionColumnCell(KeyTableRef *ktr,
e0bab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
1704ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth);
6ce047 ¤   void¤   ¤   ¤   ¤   DrawTrust(¤ ¤   ¤   ¤   Int32¤  ¤   trustValue,
25bab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
1e04ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth);
e3d882 ¤   void¤   ¤   ¤   ¤   DrawValidity(¤  ¤   ¤   Int32¤  ¤   trustValue,
3fbab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   cellRect,
7c04ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   depth);
a723df ¤   Boolean¤¤   ¤   ¤   WeAreFront();
3efff6 ¤   void¤   ¤   ¤   ¤   StepForward();
0a7c3b ¤   void¤   ¤   ¤   ¤   SaveColumnInfo();
cbaf5a
7867c5 ¤
9125dc ¤   PGPKeyIterRef¤  ¤   mKeyIter;
2935ef ¤   PGPKeySetRef¤   ¤   mKeySet;
d80cfc ¤   PGPKeyListRef¤  ¤   mKeyList;
2b2abf ¤   KeyTableColumnInfo¤ mColumnInfo;
08a9be ¤   CKeyTableLabels¤¤   *mKeyLabels;
1e9b93 ¤   Boolean¤¤   ¤   ¤   mMutableRing;
--0082 000292131fe401201b4 Page 5 of CKeyTable.h
314083 ¤   Boolean¤¤   ¤   ¤   mDefaultRing;
d1c839 ¤   PGPBoolean¤ ¤   ¤   mHasRSA;
d0b04e ¤   CKeyDragTask¤   ¤   *mDragTask;
6975f6 ¤   PixPatHandle¤   ¤   mBarberPixPat;
068ac4 ¤   Int16¤  ¤   ¤   ¤   mLowVertUpdate,
f76a62 ¤   ¤   ¤   ¤   ¤   ¤   mHighVertUpdate;
4bf802 ¤   PGPKeyRef¤  ¤   ¤   mDefaultKey;
3baaea ¤   KeyImportStruct¤¤   *mImports;
8e3ecd ¤   Int32¤  ¤   ¤   ¤   mBlockDialogDelays;
31c6dd ¤   Boolean¤¤   ¤   ¤   mNotified,
b50e6d ¤   ¤   ¤   ¤   ¤   ¤   mSendingDrag;
e550b4 ¤   PGPKeyServerEntry¤  *mTargetKeyServer;
c4ab17 ¤   LGWorld¤¤   ¤   ¤   *mDragHiliteWorld;
5f674c ¤   RgnHandle¤  ¤   ¤   mDragHiliteRgn;
f32a69 ¤   Handle¤ ¤   ¤   ¤   mNotifyIconSuite;
8367c5 ¤
9ea3e7 ¤   UInt32¤ ¤   ¤   ¤   mLastKeypress;
bdf30d ¤   char¤   ¤   ¤   ¤   mSearchString[kMaxSearchStringSize];
9967c5 ¤
135f00 ¤   static KeyTableColumnInfo¤  kDefaultColumnInfo;
1067c5 ¤
4e55cb ¤   enum¤   {
5765bd ¤   ¤   ¤   ¤   kUserIDColumnID = 0,
437ec0 ¤   ¤   ¤   ¤   kValidityColumnID,
167aa4 ¤   ¤   ¤   ¤   kTrustColumnID,
38c46a ¤   ¤   ¤   ¤   kKeySizeColumnID,
d94189 ¤   ¤   ¤   ¤   kKeyIDColumnID,
7aa3ff ¤   ¤   ¤   ¤   kCreationColumnID,
7ec13f ¤   ¤   ¤   ¤   kExpirationColumnID,
be9fff ¤   ¤   ¤   ¤   kMRKColumnID,
a741e6 ¤   ¤   ¤   ¤   kDescriptionColumnID
08c0bf ¤   ¤   ¤   };
75af5a
0655cb ¤   enum¤   {
80797f ¤   ¤   ¤   ¤   kStringListID¤  ¤   = 1004,
9a8c26 ¤   ¤   ¤   ¤   kAddNameOnlyPairsID¤= 1,
0d217b ¤   ¤   ¤   ¤   kClearQuestion,
16c9cc ¤   ¤   ¤   ¤   kCantDefaultStringID,
1a0261 ¤   ¤   ¤   ¤   kBadPassID,
6b09df ¤   ¤   ¤   ¤   kExpandSelectionID,
66a2ef ¤   ¤   ¤   ¤   kCollapseSelectionID,
337f83 ¤   ¤   ¤   ¤   kExpandAllID,
82bbf1 ¤   ¤   ¤   ¤   kCollapseAllID,
3c2837 ¤   ¤   ¤   ¤   kSigUserUnavailableID,
2a6b78 ¤   ¤   ¤   ¤   kRevokeConfirmID,
875c55 ¤   ¤   ¤   ¤   kCertUnavailableID,
462ad9 ¤   ¤   ¤   ¤   kUserIDSampleID,
fbfcf8 ¤   ¤   ¤   ¤   kNoKeyToExportID,
cfe0b3 ¤   ¤   ¤   ¤   kDupeUserID,
c0156f ¤   ¤   ¤   ¤   kGetSignerMenuItemID,
d9d129 ¤   ¤   ¤   ¤   kGetSelectedKeyMenuItemID,
d1b611 ¤   ¤   ¤   ¤   kSetDefaultMenuItemID,
48913e ¤   ¤   ¤   ¤   kSetPrimaryNameMenuItemID,
09226e ¤   ¤   ¤   ¤   kNeverExpiresID,
a69dde ¤   ¤   ¤   ¤   kBadNameID,
b8a6e0 ¤   ¤   ¤   ¤   kNoKeysFoundID,
2dca26 ¤   ¤   ¤   ¤   kSpecifyKeysToImportID,
ecf3a1 ¤   ¤   ¤   ¤   kStepForwardID,
4c5a0b ¤   ¤   ¤   ¤   kExportKeysPromptID,
308cd1 ¤   ¤   ¤   ¤   kExportKeysDefaultNameID,
5cf26c ¤   ¤   ¤   ¤   kServerSendSuccessful,
41aacd ¤   ¤   ¤   ¤   kVerifyingSignaturesID,
f272a3 ¤   ¤   ¤   ¤   kFailedServerPolicyID,
eb6b8a ¤   ¤   ¤   ¤   kPhotographID,
706b0a ¤   ¤   ¤   ¤   kUnknownID,
196e6a ¤   ¤   ¤   ¤   kNoRootServerID,
ae47b7 ¤   ¤   ¤   ¤   kAddRevokerID,
2d503d ¤   ¤   ¤   ¤   kAddRevokerConfirmationID,
9761dd ¤   ¤   ¤   ¤   kAddRevokerFinishedID,
b94942 ¤   ¤   ¤   ¤   kNoRevokerKeyID,
61db01 ¤   ¤   ¤   ¤   kOnlyOnePhotoID,
292b85 ¤   ¤   ¤   ¤
--da16 001ce253238401201b4 Page 6 of CKeyTable.h
e1166f ¤   ¤   ¤   ¤   kKeyDescriptionsStringListID¤   =¤  1018,
678e67 ¤   ¤   ¤   ¤   kRSAKeyDescriptionID¤   ¤   ¤   =¤  1,
5dc7cf ¤   ¤   ¤   ¤   kDHDSSKeyDescriptionID,
849dfc ¤   ¤   ¤   ¤   kRSAKeyPairDescriptionID,
ae48ee ¤   ¤   ¤   ¤   kDHDSSKeyPairDescriptionID,
ad59f9 ¤   ¤   ¤   ¤   kUserIDDescriptionID,
355095 ¤   ¤   ¤   ¤   kDSSSignatureDescriptionID,
63f6a7 ¤   ¤   ¤   ¤   kRSASignatureDescriptionID,
096084 ¤   ¤   ¤   ¤   kUnknownSignatureDescriptionID,
59f548 ¤   ¤   ¤   ¤   kSplitKeyPairDescriptionID
83c0bf ¤   ¤   ¤   };
4482f7 };
ceaf5a
--35de 0009fe05eb2401201b5 Page 1 of CKeyTableLabels.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
ea2045 ¤   $Id: CKeyTableLabels.cp,v 1.16.8.1 1998/11/12 03:08:04 heller Exp $
e2f7f7 ____________________________________________________________________________*/
0c8f92 #include <UGAColorRamp.h>
137e6d #include <UDrawingState.h>
b0fe40 #include <UCursor.h>
f5b125 #include <LBevelButton.h>
b9af5a
9386be #include "CKeyTableLabels.h"
ae6ff8 #include "CKeyTable.h"
0daf5a
666838 #define RESIZEZONESIZE¤ ¤   3
f5aab6 #define MINCOLUMNWIDTH¤ ¤   5
6a9860 #define MINFIRSTCOLUMNWIDTH¤40
8caf5a
5bf3ec CKeyTableLabels::CKeyTableLabels(LStream *inStream)
a44763 ¤   ¤   : LView(inStream)
c9bb36 {
092558 ¤   mKeyTable¤  ¤   = nil;
429e7e ¤   mScrollDelta¤   = 0;
caefe6 }
e8af5a
8a73c3 CKeyTableLabels::~CKeyTableLabels()
1abb36 {
35efe6 }
17af5a
456d52 ¤   void
a54edd CKeyTableLabels::FinishCreateSelf()
acbb36 {
840f17 ¤   mNameHeader¤¤   ¤   = (LBevelButton *)FindPaneByID( kNameHeaderID );
8de774 ¤   mValidityHeader¤¤   = (LBevelButton *)FindPaneByID( kValidityHeaderID );
174fe7 ¤   mTrustHeader¤   ¤   = (LBevelButton *)FindPaneByID( kTrustHeaderID );
7e0044 ¤   mSizeHeader¤¤   ¤   = (LBevelButton *)FindPaneByID( kSizeHeaderID );
c3927e ¤   mKeyIDHeader¤   ¤   = (LBevelButton *)FindPaneByID( kKeyIDHeaderID );
45e112 ¤   mCreationHeader¤¤   = (LBevelButton *)FindPaneByID( kCreationHeaderID );
dde1ee ¤   mExpirationHeader¤  = (LBevelButton *)FindPaneByID( kExpirationHeaderID );
435937 ¤   mADKHeader¤ ¤   ¤   = (LBevelButton *)FindPaneByID( kADKHeaderID );
11479d ¤   mDescriptionHeader¤ = (LBevelButton *)FindPaneByID( kDescriptionHeaderID );
845739 ¤   mEmptyHeader¤   ¤   = (LBevelButton *)FindPaneByID( kEmptyHeaderID );
81efe6 }
6caf5a
3a6d52 ¤   void
b53e44 CKeyTableLabels::AdjustCursor(
efe42e ¤   Point¤  ¤   ¤   ¤   inPortPt,
399e6b ¤   const EventRecord¤  &inMacEvent)
30bb36 {
bb94e1 ¤   Boolean¤¤   ¤   ¤   inResizeZone;
03457f ¤   Point¤  ¤   ¤   ¤   localPt;
dc67c5 ¤
55ad5e ¤   localPt = inPortPt;
82ddec ¤   PortToLocalPoint( localPt );
3125b4 ¤   FindColumnHitBy( localPt, &inResizeZone );
82f3f0 ¤   if( inResizeZone )
6de7a5 ¤   ¤   UCursor::SetCross();
490e24 ¤   else
89d7ce ¤   ¤   LPane::AdjustCursor( inPortPt, inMacEvent );
42efe6 }
0aaf5a
1ac2cf ¤   Int16
c95b4e CKeyTableLabels::FindColumnHitBy(Point loc, Boolean *outResizeZone)
66bb36 {
1aab02 ¤   KeyTableColumnInfo¤ columnInfo;
5c8c0d ¤   Int16¤  ¤   ¤   ¤   colIndex,
1281b5 ¤   ¤   ¤   ¤   ¤   ¤   pos;
5d67c5 ¤
c06e59 ¤   *outResizeZone = FALSE;
9ff9cb ¤   mKeyTable->GetKeyColumnInfo(&columnInfo);
--b7de 000353436ae401201b5 Page 2 of CKeyTableLabels.cp
52d8ef ¤   pos = -mScrollDelta + 2;
649a1f ¤   for(colIndex = 0; colIndex < columnInfo.numActiveColumns; colIndex++)
48c7a1 ¤   {
fe9fe1 ¤   ¤   pos += columnInfo.columnWidths[columnInfo.columns[colIndex]];
d01f02 ¤   ¤   if(loc.h < pos)
bc5b34 ¤   ¤   {
d9590b ¤   ¤   ¤   if( pos - loc.h <= RESIZEZONESIZE )
482e29 ¤   ¤   ¤   ¤   *outResizeZone = TRUE;
f24e6d ¤   ¤   ¤   return colIndex;
830fe4 ¤   ¤   }
cb9371 ¤   }
3ce69f ¤   return -1;
34efe6 }
90af5a
896d52 ¤   void
acea7e CKeyTableLabels::GetColumnRect(Int16 col, Rect &colRect)
a3bb36 {
89ab02 ¤   KeyTableColumnInfo¤ columnInfo;
b18aa0 ¤   Int16¤  ¤   ¤   ¤   pos,
557444 ¤   ¤   ¤   ¤   ¤   ¤   colIndex;
ebecc8 ¤   Rect¤   ¤   ¤   ¤   localRect;
1267c5 ¤
280b0b ¤   CalcLocalFrameRect(localRect);
59f9cb ¤   mKeyTable->GetKeyColumnInfo(&columnInfo);
9aec0e ¤   pos = 0;
eb9a1f ¤   for(colIndex = 0; colIndex < columnInfo.numActiveColumns; colIndex++)
1ac7a1 ¤   {
d0a900 ¤   ¤   if(colIndex == col)
045b34 ¤   ¤   {
397ec8 ¤   ¤   ¤   colRect.top¤¤   = localRect.top;
f3ab7b ¤   ¤   ¤   colRect.bottom¤ = localRect.bottom - 1;
701dff ¤   ¤   ¤   colRect.left¤   = localRect.left + pos;
a11eb2 ¤   ¤   ¤   colRect.right¤  = colRect.left +
80f246 ¤   ¤   ¤   ¤   ¤   columnInfo.columnWidths[columnInfo.columns[colIndex]] - 1;
b72732 ¤   ¤   ¤   ::OffsetRect(&colRect, -mScrollDelta, 0);
fdcdcb ¤   ¤   ¤   break;
6c0fe4 ¤   ¤   }
bd9fe1 ¤   ¤   pos += columnInfo.columnWidths[columnInfo.columns[colIndex]];
2a9371 ¤   }
a5efe6 }
afaf5a
9a6d52 ¤   void
e14544 CKeyTableLabels::Click(
b2a42b ¤   SMouseDownEvent¤&inMouseDown)
d1bb36 {
4de685 ¤   LPane::Click(inMouseDown);¤ // ignore subpane hits
68efe6 }
4daf5a
a36d52 ¤   void
a6e716 CKeyTableLabels::ClickSelf(
943ba4 ¤   const SMouseDownEvent¤  &inMouseDown)
82bb36 {
0e4fb5 ¤   RgnHandle¤  ¤   ¤   columnRgn;
27a90f ¤   Rect¤   ¤   ¤   ¤   columnRect,
1b1fcf ¤   ¤   ¤   ¤   ¤   ¤   limitRect,
b6a672 ¤   ¤   ¤   ¤   ¤   ¤   slopRect,
352ad2 ¤   ¤   ¤   ¤   ¤   ¤   ktRect,
5b7870 ¤   ¤   ¤   ¤   ¤   ¤   superFrame;
23ec7e ¤   Int16¤  ¤   ¤   ¤   col,
c851bb ¤   ¤   ¤   ¤   ¤   ¤   newCol;
01ad50 ¤   UInt32¤ ¤   ¤   ¤   dragDiff;
3be924 ¤   Point¤  ¤   ¤   ¤   newPoint;
6c1803 ¤   Boolean¤¤   ¤   ¤   inResize;
6d67c5 ¤
649ecb ¤   FocusDraw();
e6af5a
446f09 ¤   mSuperView->CalcLocalFrameRect( superFrame );
89c391 ¤   StClipRgnState¤ clip(superFrame);
8167c5 ¤
9f7cd4 ¤   col = FindColumnHitBy( inMouseDown.whereLocal, &inResize );
dfe7fb ¤   if( inResize )
35c7a1 ¤   {
--d83a 000a438d6cd401201b5 Page 3 of CKeyTableLabels.cp
96ce8d ¤   ¤   Int16¤  startH,
925891 ¤   ¤   ¤   ¤   startWidth;
231b52 ¤   ¤
545a3b ¤   ¤   GetColumnRect(col, columnRect);
137349 ¤   ¤   startH = columnRect.left;
0753fe ¤   ¤   startWidth = columnRect.right - columnRect.left;
48377a ¤   ¤   CalcLocalFrameRect(limitRect);
58c7d1 ¤   ¤   limitRect.left = columnRect.left + MINCOLUMNWIDTH;
b284fd ¤   ¤   if( !col )
419d5a ¤   ¤   ¤   limitRect.left = columnRect.left + MINFIRSTCOLUMNWIDTH;
c5bf18 ¤   ¤   limitRect.right -= 16;
9ff64c ¤   ¤   slopRect = limitRect;
b5e55b ¤   ¤   ::InsetRect(&slopRect, -32, -256);
9e1d9c ¤   ¤   mKeyTable->CalcPortFrameRect(ktRect);
5f3ca7 ¤   ¤   columnRect.top ++;
c98f0d ¤   ¤   columnRect.bottom += ktRect.bottom - ktRect.top + 1;
7ea354 ¤   ¤   columnRect.right++;
f4f203 ¤   ¤   columnRect.left = columnRect.right - 2;
6f7f1c ¤   ¤   columnRgn = ::NewRgn();
2443be ¤   ¤   ::RectRgn(columnRgn, &columnRect);
6f1a71 ¤   ¤   dragDiff = ::DragGrayRgn(columnRgn, inMouseDown.whereLocal,
155da5 ¤   ¤   ¤   ¤   ¤   ¤   &limitRect, &slopRect, hAxisOnly,
28cda4 ¤   ¤   ¤   ¤   ¤   ¤   NULL);
17b9b9 ¤   ¤   DisposeRgn(columnRgn);
0c6790 ¤   ¤   newPoint = inMouseDown.whereLocal;
7db7f2 ¤   ¤   newPoint.h += dragDiff & 0xFFFF;
581f26 ¤   ¤   if( newPoint.h - startH >= MINCOLUMNWIDTH &&
6dbd64 ¤   ¤   ¤   newPoint.h - startH != startWidth )
7a5b34 ¤   ¤   {
e2c152 ¤   ¤   ¤   mKeyTable->ResizeColumn( col, newPoint.h - startH );
6d1d5a ¤   ¤   ¤   AdjustLabelSizes();
a80fe4 ¤   ¤   }
f09371 ¤   }
679a81 ¤   else if( col > 0 )
00c7a1 ¤   {
095a3b ¤   ¤   GetColumnRect(col, columnRect);
d21d9c ¤   ¤   mKeyTable->CalcPortFrameRect(ktRect);
803ca7 ¤   ¤   columnRect.top ++;
038f0d ¤   ¤   columnRect.bottom += ktRect.bottom - ktRect.top + 1;
c7a354 ¤   ¤   columnRect.right++;
357f1c ¤   ¤   columnRgn = ::NewRgn();
ef43be ¤   ¤   ::RectRgn(columnRgn, &columnRect);
a7377a ¤   ¤   CalcLocalFrameRect(limitRect);
5bbf18 ¤   ¤   limitRect.right -= 16;
89f64c ¤   ¤   slopRect = limitRect;
3ae55b ¤   ¤   ::InsetRect(&slopRect, -32, -256);
ad1a71 ¤   ¤   dragDiff = ::DragGrayRgn(columnRgn, inMouseDown.whereLocal,
225da5 ¤   ¤   ¤   ¤   ¤   ¤   &limitRect, &slopRect, hAxisOnly,
89cda4 ¤   ¤   ¤   ¤   ¤   ¤   NULL);
7ab9b9 ¤   ¤   DisposeRgn(columnRgn);
046790 ¤   ¤   newPoint = inMouseDown.whereLocal;
95b7f2 ¤   ¤   newPoint.h += dragDiff & 0xFFFF;
6101f8 ¤   ¤   newCol = FindColumnHitBy(newPoint, &inResize);
4f0b4c ¤   ¤   if((newCol != col) && (newCol >= 0))
d35b34 ¤   ¤   {
cb916f ¤   ¤   ¤   mKeyTable->MoveColumn(col, newCol);
051d5a ¤   ¤   ¤   AdjustLabelSizes();
b30fe4 ¤   ¤   }
e89371 ¤   }
55efe6 }
22af5a
566d52 ¤   void
50beaa CKeyTableLabels::NotifyScrolled(Int32 delta)
b8bb36 {
b4666c ¤   mScrollDelta += delta;
6f4661 ¤   AdjustLabelSizes();
10efe6 }
11af5a
f96d52 ¤   void
447abf CKeyTableLabels::AdjustLabelSizes()
d7bb36 {
a4ab02 ¤   KeyTableColumnInfo¤ columnInfo;
--af98 00195c170cf401201b5 Page 4 of CKeyTableLabels.cp
0e8c0d ¤   Int16¤  ¤   ¤   ¤   colIndex,
61a846 ¤   ¤   ¤   ¤   ¤   ¤   endPos;
f27f64 ¤   LBevelButton¤   ¤   *columns[kMaxKeyTableColumnTypes],
2036b7 ¤   ¤   ¤   ¤   ¤   ¤   *thisColumn;
864d43 ¤   Rect¤   ¤   ¤   ¤   colRect,
34c5a2 ¤   ¤   ¤   ¤   ¤   ¤   frame;
1adaa2 ¤   SDimension16¤   ¤   oldSize;
8367c5 ¤
f1acd7 ¤   columns[0]¤ =¤  mNameHeader;
9b274d ¤   columns[1]¤ =¤  mValidityHeader;
ebdb5c ¤   columns[2]¤ =¤  mTrustHeader;
53c079 ¤   columns[3]¤ =¤  mSizeHeader;
fe69c8 ¤   columns[4]¤ =¤  mKeyIDHeader;
503b9c ¤   columns[5]¤ =¤  mCreationHeader;
253d13 ¤   columns[6]¤ =¤  mExpirationHeader;
483591 ¤   columns[7]¤ =¤  mADKHeader;
80a514 ¤   columns[8]¤ =¤  mDescriptionHeader;
5b67c5 ¤
8c67b9 ¤   CalcLocalFrameRect( frame );
56f9cb ¤   mKeyTable->GetKeyColumnInfo(&columnInfo);
6a585a ¤   for( colIndex = 0; colIndex < columnInfo.numActiveColumns; colIndex++ )
b8c7a1 ¤   {
0d2227 ¤   ¤   thisColumn = columns[columnInfo.columns[colIndex]];
9d861c ¤   ¤   columns[columnInfo.columns[colIndex]] = NULL;
574407 ¤   ¤   GetColumnRect( colIndex, colRect );
8fe954 ¤   ¤   if( colRect.right > frame.right - 16 )
355def ¤   ¤   ¤   colRect.right = frame.right - 16;
0fdbe9 ¤   ¤   thisColumn->GetFrameSize( oldSize );
f9728c ¤   ¤   thisColumn->PlaceInSuperFrameAt( colRect.left, 0, true );
07b43d ¤   ¤   thisColumn->ResizeFrameTo( colRect.right - colRect.left + 1,
34ec03 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   oldSize.height, true );
7ceccb ¤   ¤   thisColumn->Show();
a92a5d ¤   ¤   endPos = colRect.right;
e69371 ¤   }
705f25 ¤   for( colIndex = 0; colIndex < kMaxKeyTableColumnTypes; colIndex++ )
c0c7a1 ¤   {
4a0bc1 ¤   ¤   if( columns[colIndex] )
d546e4 ¤   ¤   ¤   columns[colIndex]->Hide();
de9371 ¤   }
1327d8 ¤   mEmptyHeader->PlaceInSuperFrameAt( endPos, 0, true );
b7791f ¤   mEmptyHeader->ResizeFrameTo( frame.right - endPos,
d76354 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   oldSize.height, true );
daefe6 }
efaf5a
7a6d52 ¤   void
509168 CKeyTableLabels::ResizeFrameBy(
bcf533 ¤   Int16¤  ¤   inWidthDelta,
312452 ¤   Int16¤  ¤   inHeightDelta,
315161 ¤   Boolean¤¤   inRefresh)
42bb36 {
390573 ¤   LView::ResizeFrameBy(inWidthDelta, inHeightDelta, inRefresh);
1567c5 ¤
8f4661 ¤   AdjustLabelSizes();
7eefe6 }
95af5a
--32aa 0010f1f0916401201b6 Page 1 of CKeyTableLabels.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
d8c8d8 ¤   $Id: CKeyTableLabels.h,v 1.8.8.1 1998/11/12 03:08:05 heller Exp $
daf7f7 ____________________________________________________________________________*/
6c7b7d #pragma once
ccaf5a
272c73 #include <LView.h>
b6af5a
a8fd31 class CKeyTable;
ed548d class LBevelButton;
a3af5a
218455 class¤  CKeyTableLabels¤:¤  public LView
b2bb36 {
c75ed4 public:
8b2ec7 ¤   enum { class_ID = 'keyL' };
6eaf5a
765c70 ¤   ¤   ¤   ¤   ¤   ¤   CKeyTableLabels(LStream *inStream);
1e3c45 ¤   virtual¤¤   ¤   ¤   ~CKeyTableLabels();
906ed9 ¤   void¤   ¤   ¤   ¤   FinishCreateSelf();
fdb8f9 ¤   virtual void¤   ¤   Click(SMouseDownEvent¤  &inMouseDown);
e883ca ¤   virtual void¤   ¤   ClickSelf(const SMouseDownEvent¤&inMouseDown);
27684f ¤   void¤   ¤   ¤   ¤   AdjustCursor(
1d0e3e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Point¤  ¤   ¤   ¤   inPortPt,
266411 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord¤  &inMacEvent);
a2af5a
66c2bd ¤   void¤   ¤   ¤   ¤   SetKeyTable(CKeyTable *keyTable)
1857d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {¤  mKeyTable = keyTable;¤  }
5e531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
c41817 ¤   void¤   ¤   ¤   ¤   NotifyScrolled(Int32 delta);
b067c5 ¤
2f2ef9 ¤   void¤   ¤   ¤   ¤   AdjustLabelSizes();
cc1491 ¤   virtual void¤   ¤   ResizeFrameBy(
57464c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   ¤   inWidthDelta,
2daf91 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   ¤   inHeightDelta,
c51831 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   inRefresh);
0d0fb9 private:
f9b8d0 ¤   Int16¤  ¤   ¤   ¤   FindColumnHitBy(Point loc, Boolean *outResizeZone);
c62395 ¤   void¤   ¤   ¤   ¤   GetColumnRect(Int16 col, Rect &colRect);
3767c5 ¤
e63456 ¤   CKeyTable¤  ¤   ¤   *mKeyTable;
fee0aa ¤   Int32¤  ¤   ¤   ¤   mScrollDelta;
0867c5 ¤
64ff10 ¤   LBevelButton¤   ¤   *mNameHeader,
950879 ¤   ¤   ¤   ¤   ¤   ¤   *mValidityHeader,
c7850e ¤   ¤   ¤   ¤   ¤   ¤   *mTrustHeader,
c8fc2e ¤   ¤   ¤   ¤   ¤   ¤   *mSizeHeader,
be0544 ¤   ¤   ¤   ¤   ¤   ¤   *mCreationHeader,
07ced4 ¤   ¤   ¤   ¤   ¤   ¤   *mExpirationHeader,
0050b0 ¤   ¤   ¤   ¤   ¤   ¤   *mADKHeader,
1a32ad ¤   ¤   ¤   ¤   ¤   ¤   *mDescriptionHeader,
b1d867 ¤   ¤   ¤   ¤   ¤   ¤   *mKeyIDHeader,
fd5da5 ¤   ¤   ¤   ¤   ¤   ¤   *mEmptyHeader;
7be23f ¤   enum¤   {¤
3a978c ¤   ¤   ¤   ¤   kNameHeaderID¤  ¤   ¤   = 'whNa',
fa75c6 ¤   ¤   ¤   ¤   kValidityHeaderID¤  ¤   = 'whVa',
8e778e ¤   ¤   ¤   ¤   kTrustHeaderID¤ ¤   ¤   = 'whTr',
9e1dd1 ¤   ¤   ¤   ¤   kSizeHeaderID¤  ¤   ¤   = 'whSi',
af3e60 ¤   ¤   ¤   ¤   kCreationHeaderID¤  ¤   = 'whCr',
32353a ¤   ¤   ¤   ¤   kExpirationHeaderID¤¤   = 'whEx',
4871c6 ¤   ¤   ¤   ¤   kADKHeaderID¤   ¤   ¤   = 'whAD',
c712a7 ¤   ¤   ¤   ¤   kDescriptionHeaderID¤   = 'whDe',
530890 ¤   ¤   ¤   ¤   kKeyIDHeaderID¤ ¤   ¤   = 'whID',
fcfb90 ¤   ¤   ¤   ¤   kEmptyHeaderID¤ ¤   ¤   = 'whNN'
67c0bf ¤   ¤   ¤   };
1f82f7 };
0faf5a
--68c9 000476340bd401201b7 Page 1 of CKeyView.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
5ffd85 ¤   $Id: CKeyView.cp,v 1.13.8.1 1998/11/12 03:08:05 heller Exp $
b1f7f7 ____________________________________________________________________________*/
938f92 #include <UGAColorRamp.h>
1faf5a
14b409 #include "CKeyView.h"
3e6ff8 #include "CKeyTable.h"
9786be #include "CKeyTableLabels.h"
5a002e #include "CPGPActiveScroller.h"
4aaf5a
40d226 CKeyView::CKeyView()
62bb36 {
79af5a
07efe6 }
cbaf5a
779807 CKeyView::CKeyView(
276689 ¤   LStream¤*inStream)
fc4763 ¤   ¤   : LView(inStream)
86bb36 {
efefe6 }
73af5a
2a1eec CKeyView::~CKeyView()
41bb36 {
d5af5a
b6efe6 }
3baf5a
906d52 ¤   void
96303b CKeyView::FinishCreateSelf()
a5bb36 {
4a358f ¤   LView::FinishCreateSelf();
8867c5 ¤
dc8ff9 ¤   mKeyTable =¤¤   ¤   (CKeyTable *)¤  ¤   FindPaneByID(kKeyTable);
5cf1bd ¤   pgpAssertAddrValid(mKeyTable,¤  ¤   ¤   VoidAlign);
94dc74 ¤   mKeyTableLabels =¤  (CKeyTableLabels *)¤FindPaneByID(kKeyTableLabels);
715139 ¤   pgpAssertAddrValid(mKeyTableLabels,¤VoidAlign);
9a6de3 ¤   mKeyScroller =¤ ¤   (CPGPActiveScroller *)¤ FindPaneByID(kKeyScroller);
05b505 ¤   pgpAssertAddrValid(mKeyScroller,¤   VoidAlign);
7c8dc7 ¤   mKeyTableLabels->SetKeyTable(mKeyTable);
b06f72 ¤   mKeyTable->SetKeyLabels(mKeyTableLabels);
9e67c5 ¤
be73fa ¤   mStatusCaption¤ =¤  (LCaption *)¤   ¤   FindPaneByID(kStatusCaption);
4e2467 ¤   mUnlockButton¤  =¤  (LBevelButton *)¤   FindPaneByID(kUnlockButton);
153b9a ¤   mLockButton¤¤   =¤  (LBevelButton *)¤   FindPaneByID(kLockButton);
7fefe6 }
2aaf5a
bf6d52 ¤   void
0d3822 CKeyView::SetKeyDBInfo(¤PGPKeySetRef¤   keySet,
d83401 ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   writable,
020066 ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   defaultRings )
38bb36 {
b7ecc0 ¤   pgpAssertAddrValid(keySet, PGPKeySetRef);
076297 ¤   mKeyTable->SetKeyDBInfo(keySet, writable, defaultRings);
4cefe6 }
3caf5a
9c6d52 ¤   void
5b3a49 CKeyView::Empty()
e7bb36 {
087a6d ¤   mKeyTable->Empty();
45efe6 }
fcaf5a
776d52 ¤   void
4d68db CKeyView::CloseKeys()
b0bb36 {
d58d75 ¤   mKeyTable->Reset1();
b2efe6 }
ddaf5a
47d190 ¤   PGPKeySetRef
--14ee 0014e75ec07401201b7 Page 2 of CKeyView.cp
639669 CKeyView::GetKeySet()
8abb36 {
9451fb ¤   return mKeyTable->GetKeySet();
68efe6 }
dcaf5a
bb6d52 ¤   void
60f468 CKeyView::ImportKeysFromHandle(Handle data)
34bb36 {
6d3f07 ¤   mKeyTable->ImportKeysFromHandle(data);
71efe6 }
4eaf5a
--da29 0008195e234401201b8 Page 1 of CKeyView.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
2321e2 ¤   $Id: CKeyView.h,v 1.13.8.1 1998/11/12 03:08:06 heller Exp $
5bf7f7 ____________________________________________________________________________*/
387b7d #pragma once
e0af5a
ab2c73 #include <LView.h>
1daf5a
e0a076 #include "pgpKeys.h"
2caf5a
c1fd31 class CKeyTable;
fc7265 class CKeyTableLabels;
6ae33b class LCaption;
1a548d class LBevelButton;
3e0142 class CPGPActiveScroller;
4faf5a
4bf3bd const ResIDT¤   kKeyViewResID¤  ¤   =¤  132;
99af5a
261f29 class CKeyView¤ :¤  public LView
65bb36 {
d65ed4 public:
d92644 ¤   enum {¤ class_ID = 'keyV'¤  };
a367c5 ¤
c8af5a
753671 ¤   ¤   ¤   ¤   ¤   CKeyView();
865bb1 ¤   ¤   ¤   ¤   ¤   CKeyView(LStream¤   *inStream);
20ec1a ¤   ¤   ¤   ¤   ¤   ~CKeyView();
97ae30 ¤   ¤   ¤   ¤   ¤
b13852 ¤   virtual void¤   FinishCreateSelf();
4e67c5 ¤
53d034 ¤   virtual void¤   CloseKeys();
8539ec ¤   virtual void¤   SetKeyDBInfo(¤  PGPKeySetRef¤   keySet,
2b7b77 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   writable,
4539eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   defaultRings
3683c1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   );
1f2b94 ¤   PGPKeySetRef¤   GetKeySet();
549c4c ¤   CKeyTable¤  ¤   *GetKeyTable()¤ {¤  return mKeyTable;¤  }
4f7a26 ¤   virtual void¤   Empty();
3b3a07 ¤   void¤   ¤   ¤   ImportKeysFromHandle(Handle data);
b667c5 ¤
66c4ed ¤   LCaption¤   ¤   *GetCaptionPane()¤  {¤  return mStatusCaption;¤ }
1cc3f1 ¤   LBevelButton¤   *GetLockButton()¤   {¤  return mLockButton;¤¤   }
4c2b6d ¤   LBevelButton¤   *GetUnlockButton()¤ {¤  return mUnlockButton;¤  }
fc67c5 ¤
10a2d3 protected:
6955cb ¤   enum¤   {
d370c9 ¤   ¤   ¤   ¤   kStringListID ¤ = 1000,
7628e9 ¤   ¤   ¤   ¤   kUserIDStringID¤¤   = 1,
e9c8f4 ¤   ¤   ¤   ¤   kValidityStringID,
abcc90 ¤   ¤   ¤   ¤   kTrustStringID,
f715cb ¤   ¤   ¤   ¤   kCreationStringID,
b558f3 ¤   ¤   ¤   ¤   kSizeStringID
e6c0bf ¤   ¤   ¤   };
45af5a
480fb9 private:
37f0f8 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mIsDefaultKeyrings;
fc0274 ¤   CKeyTable¤  ¤   ¤   ¤   ¤   *mKeyTable;
84d9de ¤   CKeyTableLabels¤¤   ¤   ¤   *mKeyTableLabels;
a9413f ¤   CPGPActiveScroller¤ ¤   ¤   *mKeyScroller;
fa0899 ¤   LCaption¤   ¤   ¤   ¤   ¤   *mStatusCaption;
31a692 ¤   LBevelButton¤   ¤   ¤   ¤   *mLockButton;
7d1ec7 ¤   LBevelButton¤   ¤   ¤   ¤   *mUnlockButton;
1d67c5 ¤
0ee23f ¤   enum¤   {¤
23691e ¤   ¤   ¤   ¤   kKeyTableLabels¤¤   ¤   = 'lKey',
c988c3 ¤   ¤   ¤   ¤   kKeyTable¤  ¤   ¤   ¤   = 'tKey',
195e63 ¤   ¤   ¤   ¤   kKeyScroller¤   ¤   ¤   = 'sKey',
816c6e ¤   ¤   ¤   ¤   kStatusPlacard¤ ¤   ¤   = 'Plaq',
--7ab8 0018470b2cb401201b8 Page 2 of CKeyView.h
61a614 ¤   ¤   ¤   ¤   kStatusCaption¤ ¤   ¤   = 'cSta',
ee831a ¤   ¤   ¤   ¤   kUnlockButton¤  ¤   ¤   = 'bULk',
369139 ¤   ¤   ¤   ¤   kLockButton¤¤   ¤   ¤   = 'bLok'
d1c0bf ¤   ¤   ¤   };
ce82f7 };
84af5a
--7c7e 000a7a36b52401201b9 Page 1 of CKeyWindow.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
aa8cfd ¤   $Id: CKeyWindow.cp,v 1.9.8.1 1998/11/12 03:08:06 heller Exp $
aaf7f7 ____________________________________________________________________________*/
448f92 #include <UGAColorRamp.h>
9c75de #include <UWindows.h>
4717f9 #include <UReanimator.h>
f6f1ac #include <LWindowHeader.h>
1baf5a
8df205 #include "CKeyWindow.h"
9eb409 #include "CKeyView.h"
9fb8cb #include "CPGPKeys.h"
8faf5a
832f8d #include "pgpErrors.h"
23c97b #include "pgpClientPrefs.h"
1faf5a
ba8131 const Int16¤kMinimumWindowHeight¤   =¤  150;
17af5a
ebbfad const PaneIDT¤  kToolbarPaneID¤ ¤   =¤  'Tlbr';
05af5a
edaf5a
196ee4 CKeyWindow::CKeyWindow()
a2bb36 {
d5efe6 }
1aaf5a
cba5f7 CKeyWindow::CKeyWindow(LStream *inStream)
0c28bf ¤   :¤  LWindow(inStream)
68bb36 {
7defe6 }
04af5a
18fb47 CKeyWindow::~CKeyWindow()
4abb36 {
5c266f ¤   Rect¤   ¤   windowPos;
b861e0 ¤   PGPError¤   err;
6734f0 ¤   size_t¤ ¤   length;¤
2f67c5 ¤
aa2813 ¤   length = sizeof(Rect);
c006ca ¤   windowPos = UWindows::GetWindowContentRect(mMacWindowP);
6967c5 ¤
353cee ¤   if(windowPos.bottom - windowPos.top >= kMinimumWindowHeight)
d9c7a1 ¤   {
a55ff2 ¤   ¤   err = PGPSetPrefData(¤  gPrefRef,
357b46 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefPGPkeysMacMainWinPos,
6d8673 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   length,
c90129 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &windowPos);
13e919 ¤   ¤   pgpAssertNoErr(err);
239371 ¤   }
beefe6 }
a3af5a
5a6d52 ¤   void
3b0372 CKeyWindow::FinishCreateSelf()
f8bb36 {
6f61e0 ¤   PGPError¤   err;
3da928 ¤   Rect¤   ¤   *windPosPtr,
c26306 ¤   ¤   ¤   ¤   windowPos,
6e6765 ¤   ¤   ¤   ¤   monitorIntersectRect,
5768d6 ¤   ¤   ¤   ¤   windowTitleBarRect;
b5171b ¤   size_t¤ ¤   length;
a267c5 ¤
980305 ¤   LWindow::FinishCreateSelf();
ac1b52 ¤   ¤
44b5eb ¤   LCommander::SetDefaultCommander( this );
894b20 ¤   LPane::SetDefaultView( this );
27af5a
4c20cd ¤   mKeyView = (CKeyView *)
24f2ff ¤   ¤   UReanimator::ReadObjects( 'PPob', kKeyViewResID );
2c45c4 ¤   mToolbar = (LWindowHeader *)FindPaneByID( kToolbarPaneID );
a767c5 ¤
--c672 00016651723401201b9 Page 2 of CKeyWindow.cp
e6e9a9 ¤   mKeyView->FinishCreate();
6e5185 ¤   mKeyView->ResizeFrameBy(1,2,false);
685b69 ¤   PGPGetPrefBoolean( gPrefRef, kPGPPrefPGPkeysMacShowToolbar, &mShowToolbar );
0d305f ¤   if( mShowToolbar )
32b36c ¤   ¤   DoToolbar();
67af5a
6e2813 ¤   length = sizeof(Rect);
0b3540 ¤   err = PGPGetPrefData(¤  gPrefRef,
ab9946 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefPGPkeysMacMainWinPos,
28f961 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &length,
574920 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &windPosPtr);
04c8d0 ¤   if(IsntPGPError(err))
4ac7a1 ¤   {
a51f4e ¤   ¤   windowPos = *windPosPtr;
560e01 ¤   ¤   PGPDisposePrefData(gPrefRef, windPosPtr);
706f21 ¤   ¤   windowTitleBarRect = windowPos;
05bb59 ¤   ¤   windowTitleBarRect.bottom = windowTitleBarRect.top + 20;
437da3 ¤   ¤   // sanity check
96728b ¤   ¤   if((windowPos.left > 0) && (windowPos.right > 0)
50ce38 ¤   ¤   ¤   && (windowPos.top > 0) && (windowPos.bottom > 0)
a4b9c3 ¤   ¤   ¤   && SectRect(&windowTitleBarRect, &qd.screenBits.bounds,
21f623 ¤   ¤   ¤   ¤   ¤   ¤   &monitorIntersectRect))
875b34 ¤   ¤   {
64738e ¤   ¤   ¤   DoSetBounds(windowPos);
640fe4 ¤   ¤   }
419371 ¤   }
6367c5 ¤
8160d9 ¤   Show();
55efe6 }
40af5a
f56d52 ¤   void
2811c7 CKeyWindow::DoToolbar()
59bb36 {
827669 ¤   Rect¤   keyFrame,
b142fc ¤   ¤   ¤   barFrame;
e55adf ¤   Int16¤  barHeight;
7767c5 ¤
ac70f8 ¤   mKeyView->CalcLocalFrameRect( keyFrame );
9ad147 ¤   mToolbar->CalcLocalFrameRect( barFrame );
d1cea3 ¤   barHeight = barFrame.bottom - barFrame.top;
bb305f ¤   if( mShowToolbar )
8dc7a1 ¤   {
c78bca ¤   ¤   mKeyView->PlaceInSuperFrameAt(¤ -1, barFrame.bottom - 2, true );
feff50 ¤   ¤   mKeyView->ResizeFrameBy( 0, -barHeight + 1, true );
4cfd61 ¤   ¤   mToolbar->Show();
989371 ¤   }
0c0e24 ¤   else
60c7a1 ¤   {
d7114d ¤   ¤   mToolbar->Hide();
d7e590 ¤   ¤   mKeyView->PlaceInSuperFrameAt(¤ -1, -1, true );
2d57b9 ¤   ¤   mKeyView->ResizeFrameBy( 0, barHeight - 1, true );
7f9371 ¤   }
5eefe6 }
a4af5a
8d6d52 ¤   void
028176 CKeyWindow::FindCommandStatus(
5eea24 ¤   CommandT¤   inCommand,
faa472 ¤   Boolean¤¤   &outEnabled,
343a4d ¤   Boolean¤¤   &outUsesMark,
fb5dc0 ¤   Char16¤ ¤   &outMark,
eed894 ¤   Str255¤ ¤   outName)
37bb36 {
35836e ¤   switch(inCommand)·
c3c7a1 ¤   {
3bd19c ¤   ¤   case cmd_Toolbar:
8f8f56 ¤   ¤   ¤   outEnabled = true;
8de310 ¤   ¤   ¤   outUsesMark = true;
c8c696 ¤   ¤   ¤   if( mShowToolbar )
57ff45 ¤   ¤   ¤   ¤   outMark = checkMark;
fbbb8c ¤   ¤   ¤   else
6b718d ¤   ¤   ¤   ¤   outMark = ' ';
16cdcb ¤   ¤   ¤   break;
--2410 001a6c72834401201b9 Page 3 of CKeyWindow.cp
d39ae3 ¤   ¤   default:
13088f ¤   ¤   ¤   ·LWindow::FindCommandStatus(inCommand, outEnabled,
bb8186 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outUsesMark, outMark, outName);
59cdcb ¤   ¤   ¤   break;
f39371 ¤   }
faefe6 }
01af5a
0c7e69 ¤   Boolean
db409b CKeyWindow::ObeyCommand(
c0ea24 ¤   CommandT¤   inCommand,
570597 ¤   void¤   ¤   *ioParam)
dcbb36 {
7e5b52 ¤   Boolean¤¤   cmdHandled = true;
3867c5 ¤
000617 ¤   switch( inCommand )
bac7a1 ¤   {
75d19c ¤   ¤   case cmd_Toolbar:
0e7c89 ¤   ¤   ¤   mShowToolbar = !mShowToolbar;
20c316 ¤   ¤   ¤   PGPSetPrefBoolean( gPrefRef, kPGPPrefPGPkeysMacShowToolbar,
5680a8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mShowToolbar );
0702bd ¤   ¤   ¤   DoToolbar();
3fcdcb ¤   ¤   ¤   break;
599ae3 ¤   ¤   default:
5316e6 ¤   ¤   ¤   cmdHandled = LWindow::ObeyCommand(inCommand, ioParam);
abcdcb ¤   ¤   ¤   break;
db9371 ¤   }
a067c5 ¤
1951a4 ¤   return cmdHandled;
7befe6 }
a6af5a
--ad8e 0010fea5b16401201ba Page 1 of CKeyWindow.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
0ae676 ¤   $Id: CKeyWindow.h,v 1.4.8.1 1998/11/12 03:08:07 heller Exp $
90f7f7 ____________________________________________________________________________*/
d77b7d #pragma once
e2af5a
a28fd4 #include <LWindow.h>
f2af5a
26a076 #include "pgpKeys.h"
16af5a
742ed9 class CKeyView;
384d57 class LWindowHeader;
d5af5a
623e0e class CKeyWindow¤   ¤   :¤  ¤   public LWindow
8bbb36 {
405ed4 public:
d74152 ¤   enum { class_ID = 'keyW' };
663ca4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CKeyWindow();
da9412 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CKeyWindow(LStream *inStream);
2df0f1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ~CKeyWindow();
8a9a35 ¤   void¤   ¤   ¤   ¤   ¤   ¤   FinishCreateSelf();
539143 ¤   virtual void¤   ¤   ¤   ¤   FindCommandStatus(CommandT inCommand,
3b3663 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
88e9fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName);
813f22 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   ObeyCommand(
3e62fa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CommandT¤   inCommand,
eb68cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void¤   ¤   *ioParam);
02b7ab ¤   CKeyView¤   ¤   ¤   ¤   ¤   *GetKeyView()
4817fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {¤  return mKeyView;¤   }
f11a14 ¤   void¤   ¤   ¤   ¤   ¤   ¤   DoToolbar();
9167c5 ¤
890fb9 private:
ce79da ¤   CKeyView¤   ¤   ¤   ¤   ¤   *mKeyView;
b705b5 ¤   LWindowHeader¤  ¤   ¤   ¤   *mToolbar;
972383 ¤   PGPBoolean¤ ¤   ¤   ¤   ¤   mShowToolbar;
ea82f7 };
0faf5a
--2ca5 00061c998fe401201bb Page 1 of CPGPKeys.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
bcb641 ¤   $Id: CPGPKeys.cp,v 1.119.2.1.2.2 1998/11/13 02:49:43 heller Exp $
44f7f7 ____________________________________________________________________________*/
6243c8 #include <Balloons.h>
7f4d37 #include <LowMem.h>
fde0ab #include <Processes.h>
e7af5a
fcdd56 #include <PP_Messages.h>
592204 #include <PP_Resources.h>
b0902e #include <UAttachments.h>
3b7c99 #include <URegistrar.h>
b74b3b #include <UEnvironment.h>
2cffe3 #include <UGraphicUtils.h>
f87e6d #include <UDrawingState.h>
68cc5c #include <UMemoryMgr.h>
cfdd06 #include <UDesktop.h>
14740c #include <UAppleEventsMgr.h>
9348eb #include <UScreenPort.h>
2f15dd #include <LComparator.h>
56bce5 #include <LIconPane.h>
5ba4c1 #include <LGAFocusBorder.h>
a44119 #include <LMultiPanelView.h>
ff0e3a #include <LRadioGroup.h>
42dfe2 #include <LRadioGroupView.h>
cc7e73 #include <LTabGroup.h>
e75a50 #include <LMenu.h>
6aaf5a
e0c38f // Appearance classes
cdb125 #include <LBevelButton.h>
d526cc #include <LChasingArrows.h>
448708 #include <LCheckBox.h>
f566bb #include <LCmdBevelButton.h>
d97c09 #include <LEditText.h>
d7f0a0 #include <LGADialog.h>
b876ae #include <LIconControl.h>
a3ec08 #include <LLittleArrows.h>
1bcffe #include <LPlacard.h>
4b0aae #include <LPopupButton.h>
ed49f7 #include <LProgressBar.h>
c9d797 #include <LPushButton.h>
8440db #include <LRadioButton.h>
f862c6 #include <LScrollBar.h>
cfa861 #include <LStdControlImp.h>
887304 #include <LScrollerView.h>
8d2786 #include <LSeparatorLine.h>
9ade04 #include <LSlider.h>
a005c6 #include <LStaticText.h>
edb919 #include <LTabsControl.h>
73a94f #include <LTextGroupBox.h>
a5f1ac #include <LWindowHeader.h>
55af5a
14a055 // Appearance Manager Implementations
70cf39 #include <LAMBevelButtonImp.h>
0bfd90 #include <LAMControlImp.h>
6f8698 #include <LAMPlacardImp.h>
3e34b5 #include <LAMPopupButtonImp.h>
7eef3e #include <LAMPushButtonImp.h>
fd5a8a #include <LAMStaticTextImp.h>
3622f4 #include <LAMTabsControlImp.h>
7ba389 #include <LAMTrackActionImp.h>
40af5a
e1d386 // Grayscale Implementations
62b3c6 #include <LGALittleArrowsImp.h>
a2af5a
f1b8cb #include "CPGPKeys.h"
939ff9 #include "BETA.h"
6139ae #include "PGPDemo.h"
--e995 00057c0b4b9401201bb Page 2 of CPGPKeys.cp
b19dc2 #include "CWarningAlert.h"
69fd2e #include "MacDebugPatches.h"
81e0bd #include "PGPKeysMenuBar.h"
cdf205 #include "CKeyWindow.h"
6a5cd1 #include "CSearchWindow.h"
95138b #include "CSearchPanel.h"
62df3f #include "CGroupsWindow.h"
df4d6a #include "CGADurationEditField.h"
cbb409 #include "CKeyView.h"
ccaf5a
ff54e1 #include "CSplitWindow.h"
9ec907 #include "CSendKeyShares.h"
0bc238 #include "CFingerprintField.h"
8f86be #include "CKeyTableLabels.h"
f37894 #include "CRecessedCaption.h"
f43d25 #include "ABalloon.h"
db6ff8 #include "CKeyTable.h"
640021 #include "CPicture.h"
dd829c #include "CPassphraseEdit.h"
ef4a92 #include "CPhotoUserID.h"
8521d6 #include "CSignDialog.h"
41e7cd #include "CVersionCaption.h"
db59c5 #include "CPGPStDialogHandler.h"
f54b88 #include "CPGPAMTabsControlImp.h"
2059ab #include "CKeyGenWizardDialog.h"
eb7ffa #include "CProgressBar.h"
39e213 #include "CPGPAMEditTextImp.h"
55002e #include "CPGPActiveScroller.h"
1a69be #include "CGAProgressDialog.h"
8bf871 #include "BackupHandler.h"
d7c9be #include "pgpRandomPool.h"
b676b7 #include "MacErrors.h"
f51e0f #include "MacInternet.h"
6c5286 #include "MacDialogs.h"
4185c2 #include "MacStrings.h"
a9bbf4 #include "MacFiles.h"
ddb397 #include "PGPOpenPrefs.h"
b3f5d2 #include "pgpMacCustomContextAlloc.h"
34af5a
904bb5 // PGPsdk includes
3b4919 #include "pgpUtilities.h"
462f8d #include "pgpErrors.h"
b8c9be #include "pgpRandomPool.h"
260d08 #include "pgpMem.h"
f491b9 #include "pgpSDKPrefs.h"
56c97b #include "pgpClientPrefs.h"
ea3991 #include "pgpAdminPrefs.h"
9fc9be #include "pgpRandomPool.h"
27eb5b #include "pgpKeyServer.h"
04a02f #include "pgpClientLib.h"
47af5a
2a324c #include <string.h>
9daf5a
dccd5a ResIDT¤ ¤   ¤   ¤   gApplicationResFile;
7cea37 PGPContextRef¤  ¤   gPGPContext;
a3fdfb PGPMemoryMgrRef¤¤   gPGPMemoryMgr;
8650f5 PGPtlsContextRef¤   gTLSContext;
c77496 PGPPrefRef¤ ¤   ¤   gPrefRef;
3dbcf0 PGPPrefRef¤ ¤   ¤   gAdminPrefRef;
f17c96 Boolean¤¤   ¤   ¤   gServerCallsPresent;
6c8182 PGPBoolean¤ ¤   ¤   gIsAdminConfigured;
e0117b FSSpec¤ ¤   ¤   ¤   gAppFSSpec;
eeaf5a
98eb5b const ResIDT¤   ¤   kKeyWindow¤ ¤   ¤   ¤   ¤   ¤   ¤   = 129;
6e3fc5 const ResIDT¤   ¤   kWindowAbout¤   ¤   ¤   ¤   ¤   ¤   = 131;
50182e const ResIDT¤   ¤   kNoKeyFilesDialog¤  ¤   ¤   ¤   ¤   = 147;
57416f const ResIDT¤   ¤   kReadOnlyErrorDialog¤   ¤   ¤   ¤   = 157;
9c29a0 const ResIDT¤   ¤   kAboutMainPictureResID¤ ¤   ¤   ¤   = 129;
fd2709 const ResIDT¤   ¤   kAboutCreditsPictureResID¤  ¤   ¤   = 130;
780494 const short¤¤   ¤   kSplashDisplayTime¤ ¤   ¤   ¤   ¤   = 30;
74d513 const ulong¤¤   ¤   kSecondsInADay¤ ¤   ¤   ¤   ¤   ¤   = 86400;
57eb81 const ResIDT¤   ¤   kOpenCustomGetDialog¤   ¤   ¤   ¤   = 1001;
--3411 000bbce87fb401201bb Page 3 of CPGPKeys.cp
c5d9ef const long¤ ¤   ¤   ae_ImportKey¤   ¤   ¤   ¤   ¤   ¤   = 4000;
f6af5a
20af5a
1bf989 enum¤   {
c22935 ¤   ¤   ¤   kStringListID¤  ¤   ¤   = 1017,
801dab ¤   ¤   ¤   kNoAdminPrefsStringID¤  = 1,
2bfc4c ¤   ¤   ¤   kErrorPrefaceStringID,
f809cf ¤   ¤   ¤   kAboutInfoButtonTitleStrIndex,
66690b ¤   ¤   ¤   kAboutCreditsButtonTitleStrIndex,
418de3 ¤   ¤   ¤   kPGPWebSiteURLStrIndex,
d83640 ¤   ¤   ¤   kCantLaunchWebBrowserBecauseStrIndex,
cc6507 ¤   ¤   ¤   kUnrecoverableKeyringErrorStrIndex,
51078d ¤   ¤   ¤   kUnrecoverablePrefsErrorStrIndex,
b384e8 ¤   ¤   ¤   kPGPRegisterURLStrIndex,
1c9756 ¤   ¤   ¤   kPGPRegisterOnlineItemStrIndex,
171c59 ¤   ¤   ¤   kNoGroupsSupportStrIndex,
700230 ¤   ¤   ¤   kPGPUpgradeItemStrIndex,
f1f908 ¤   ¤   ¤   kPGPBuyNowURLStrIndex,
2ffcea ¤   ¤   ¤   kURLRegExtensionStrIndex,
dd461e ¤   ¤   ¤   kUpdateIntroducersStrIndex,
cc4749 ¤   ¤   ¤   kUpdateAllStrIndex
25a105 ¤   ¤   };
73af5a
94e14a static void RealMain(void)
b5bb36 {
7cc340 ¤   // GrowZone stuff disabled, not working,
0608d5 ¤   // possible PowerPlant bug?
c0d8f5 ¤   //LGrowZone* growZone = new LGrowZone(20000);
9aaf5a
2b256d ¤   // set these globals before we do anything else
447fda ¤   gApplicationResFile = ::CurResFile();
27af5a
025004 ¤   CPGPKeys*¤  theApp = new CPGPKeys;
93aac4 ¤   theApp->Run();
316aac ¤   delete theApp;
c867c5 ¤
fe9ce6 ¤   //delete growZone;
0defe6 }
69af5a
f0d4c2 void main(void)
d5bb36 {
21696d ¤   ProcessInfoRec¤ ¤   processInfo;
87bbaf ¤   ProcessSerialNumber¤currentProcess;
cc67c5 ¤
eb5c98 #if PGP_DEBUG
3d4b54 ¤   SetDebugThrow_( debugAction_LowLevelDebugger );
e94159 ¤   SetDebugSignal_( debugAction_LowLevelDebugger );
40db21 #else
c6706c ¤   SetDebugThrow_( debugAction_Nothing );
3c6000 ¤   SetDebugSignal_( debugAction_Nothing );
6f7454 #endif
5baf5a
0eb567 ¤   InitializeHeap(3);
361fc2 ¤   UQDGlobals::InitializeToolbox(&qd);
732681 ¤   DebugPatches_PatchDisposeTraps();
b967c5 ¤
504ba9 ¤   GetCurrentProcess(&currentProcess);
12fb5f ¤   processInfo.processAppSpec = &gAppFSSpec;
9b20f4 ¤   processInfo.processInfoLength = sizeof(ProcessInfoRec);
21d90e ¤   processInfo.processName = NULL;
61e6e9 ¤   GetProcessInformation(&currentProcess, &processInfo);
b567c5 ¤
88dc45 ¤   // make sure we do not leak the Comparator classes
7f50df ¤   LComparator::GetComparator();
5b205b ¤   LLongComparator::GetComparator();
fbaf5a
cc8d10 ¤   pgpLeaksBeginSession("main");
cac183 ¤   //pgpLeaksSuspend();
30e75c ¤   ¤   RealMain();
aa67c5 ¤
7ad29d ¤   pgpLeaksEndSession();
bbefe6 }
--2ea9 000b732a3ea401201bb Page 4 of CPGPKeys.cp
e0af5a
9c3555 CPGPKeys¤   *CPGPKeys::sTheApp = 0;
7faf5a
aaa6cd CPGPKeys::CPGPKeys(void):
da1020 ¤   mMenuBar(0),
c0fd67 ¤   mModelDirector(0),
c6ee16 ¤   mCreatedKey(false),
34741a ¤   mPreviousStorage(NULL)
13bb36 {
17f43c ¤   sTheApp¤¤   ¤   = this;
80c377 ¤   mKeyWindow¤ ¤   = NULL;
842986 ¤   mSearchWindow¤  = NULL;
4284e0 ¤   mGroupsWindow¤  = NULL;
4d67c5 ¤
2a6b6b ¤   UEnvironment::InitEnvironment();
d578cd ¤   UGraphicUtils::InitGraphicsUtilities();
96af5a
5c9838 #if BETA
7b0bf4 ¤   if( BetaExpired() )
cac7a1 ¤   {
5b1ed8 ¤   ¤   Alert(205, NULL);¤  // Beta expiration
a4d011 ¤   ¤   ExitToShell();
579371 ¤   }
d57454 #endif
c37623 ¤   if( !HaveAppearanceMgr() )
e4c7a1 ¤   {
0489f3 ¤   ¤   Alert(206, NULL);
49d011 ¤   ¤   ExitToShell();
379371 ¤   }
f8af5a
f5d3d8 ¤   RegisterClass_( LActiveScroller );
d08ab7 ¤   RegisterClass_( LBorderAttachment );
6e169d ¤   RegisterClass_( LCaption );
442dd2 ¤   RegisterClass_( LGADialog );
f89725 ¤   RegisterClass_( LGAFocusBorder );
143e59 ¤   RegisterClass_( LMultiPanelView );
e1d0d0 ¤   RegisterClass_( LPaintAttachment );
a9904e ¤   RegisterClass_( LScrollerView );
84a301 ¤   RegisterClass_( LTabGroup );
912996 ¤   RegisterClass_( LTableView );
42d1e5 ¤   RegisterClass_( LRadioGroup );
e1a0a2 ¤   RegisterClass_( LRadioGroupView );
26323d ¤   RegisterClass_( LView );
3b67c5 ¤
1a8725 ¤   // Appearance classes:
7967c5 ¤
a241d9 ¤   RegisterClass_( LBevelButton );
be1528 ¤   RegisterClass_( LChasingArrows );
a85a7a ¤   RegisterClass_( LCheckBox );
b619fb ¤   RegisterClass_( LCmdBevelButton );
84a17b ¤   RegisterClass_( LEditText );
3c8652 ¤   RegisterClass_( LIconControl );
180f42 ¤   RegisterClass_( LLittleArrows );
75fccd ¤   RegisterClass_( LPlacard );
f5fa52 ¤   RegisterClass_( LPopupButton );
d2b90b ¤   RegisterClass_( LProgressBar );
5d0848 ¤   RegisterClass_( LPushButton );
f7b027 ¤   RegisterClass_( LRadioButton );
23ecd7 ¤   RegisterClass_( LScrollBar );
ec1462 ¤   RegisterClass_( LSeparatorLine );
2fea4e ¤   RegisterClass_( LSlider );
7fda19 ¤   RegisterClass_( LStaticText );
8449e5 ¤   RegisterClass_( LTabsControl );
864a05 ¤   RegisterClass_( LTextGroupBox );
3e12e6 ¤   RegisterClass_( LWindowHeader );
6567c5 ¤
d4f0b7 ¤   (void) RegisterAppearanceClient();
b9af5a
9a778d ¤   RegisterClassID_( LAMBevelButtonImp, ¤  LBevelButton::imp_class_ID );
d6a91a ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LChasingArrows::imp_class_ID );
a9971b ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LCheckBox::imp_class_ID );
b73ff2 ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LRadioButton::imp_class_ID );
--4100 00038d23b87401201bb Page 5 of CPGPKeys.cp
b77038 ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LIconControl::imp_class_ID );
27ae52 ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LProgressBar::imp_class_ID );
00b4d4 ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LTextGroupBox::imp_class_ID );¤ ¤
99e68d ¤   RegisterClassID_( LAMControlImp,¤   ¤   LScrollBar::imp_class_ID );
da963d ¤   RegisterClassID_( LAMControlImp,¤   ¤   LSeparatorLine::imp_class_ID );
b705f3 ¤   RegisterClassID_( CPGPAMEditTextImp,¤   LEditText::imp_class_ID );
cffef8 ¤   RegisterClassID_( LAMPlacardImp, ¤  ¤   LPlacard::imp_class_ID );
94dd65 ¤   RegisterClassID_( LAMPopupButtonImp, ¤  LPopupButton::imp_class_ID );
2db779 ¤   RegisterClassID_( LAMPushButtonImp,¤¤   LPushButton::imp_class_ID );
a21ecd ¤   RegisterClassID_( LAMStaticTextImp,¤¤   LStaticText::imp_class_ID );
0d11e1 ¤   RegisterClassID_( LAMTrackActionImp, ¤  LSlider::imp_class_ID);
6cf925 ¤   RegisterClassID_( CPGPAMTabsControlImp,¤LTabsControl::imp_class_ID );
0e2aeb ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LWindowHeader::imp_class_ID );
d249eb ¤   RegisterClassID_( LGALittleArrowsImp,¤  LLittleArrows::imp_class_ID );
c667c5 ¤
d97cb5 ¤   RegisterClass_(CKeyWindow);
50d356 ¤   RegisterClass_(CKeyView);
63d154 ¤   RegisterClass_(CSearchWindow);
889815 ¤   RegisterClass_(CSearchPanel);
2f0fa3 ¤   RegisterClass_(CGroupsWindow);
af2d60 ¤   RegisterClass_(CGroupsTable);
e5323d ¤   RegisterClass_(CKeyTableLabels);
56bc10 ¤   RegisterClass_(CKeyTable);
14de00 ¤   RegisterClass_(CSplitWindow);
32577f ¤   RegisterClass_(CVersionCaption);
1478f7 ¤   RegisterClass_(CPicture);
76a890 ¤   RegisterClass_(CGADurationEditField);
d9af5a
473079 ¤   RegisterClass_(CPassphraseEdit);
d1b42e ¤   RegisterClass_(LIconPane);
cf86f4 ¤   RegisterClass_(CRecessedCaption);
fd6ee4 ¤   RegisterClass_( CPhotoUserID );
b9af5a
797504 ¤   RegisterClass_(CKeyGenWizardDialog);
7f67c5 ¤
5c7ce8 ¤   RegisterClass_(CFingerprintField);
4b65aa ¤   RegisterClass_(CSignDialog);
ec67c5 ¤
9b80a6 ¤   RegisterClass_(CGAProgressDialog);
fb26d7 ¤   RegisterClass_(CPGPActiveScroller);
07978a ¤   RegisterClass_(CProgressBar);
3df6e3 ¤   RegisterClass_(CWarningAlert);
2b67c5 ¤
4e9f0b ¤   RegisterClass_(ABalloon);
bb67c5 ¤
1f3c5a ¤   mSplashScreen¤  = NULL;
a44b98 ¤   mCheckedLicense = FALSE;
b14747 ¤   mLastMouseLoc.h¤= mLastMouseLoc.v = -1;
e5ee34 ¤   mSearching¤ ¤   = FALSE;
79fd45 ¤   mAppStarted¤¤   = FALSE;
b6efe6 }
b5af5a
726d52 ¤   void
c29161 CPGPKeys::CleanUpPPLeaks()
e5bb36 {
a36eef ¤   OSErr¤  theErr;
1d67c5 ¤
af8384 ¤   pgpAssertAddrValid(&UAppleEventsMgr::sAnyType, AEDesc);
7b41aa ¤   theErr = ::AEDisposeDesc(&UAppleEventsMgr::sAnyType);
7c620a ¤   pgpAssert(theErr == noErr);
0a67c5 ¤
d907f4 ¤   URegistrar::DisposeClassTable();
b25780 ¤   UScreenPort::Dispose();
b8efe6 }
88af5a
bf04de CPGPKeys::~CPGPKeys(void)
76bb36 {
91b35f ¤   StopIdling();
5090b0 ¤   if(IsntNull(mGroupsWindow))
c88daf ¤   ¤   delete mGroupsWindow;
c3a66b ¤   mGroupsWindow = NULL;
384e47 ¤   if(IsntNull(mSearchWindow))
--ced2 00028904644401201bb Page 6 of CPGPKeys.cp
02b7f7 ¤   ¤   delete mSearchWindow;
42e496 ¤   mSearchWindow = NULL;
f074e3 ¤   if(IsntNull(mKeyWindow))
afc093 ¤   ¤   delete mKeyWindow;
583ec0 ¤   mKeyWindow = NULL;
1567c5 ¤
dc731a ¤   if(¤gServerCallsPresent )
06c7a1 ¤   {
2bdd89 ¤   ¤   PGPKeyServerDisposeThreadStorage(mPreviousStorage);
05d582 ¤   ¤   PGPKeyServerCleanup();
595ec0 ¤   ¤   if( PGPtlsContextRefIsValid( gTLSContext ) )
31632d ¤   ¤   ¤   PGPFreeTLSContext( gTLSContext );
479371 ¤   }
5d5989 #if¤PGP_BUSINESS_SECURITY
1e1015 ¤   PGPClosePrefFile(gAdminPrefRef);
4c7454 #endif
4fb4b3 ¤   PGPSavePrefFile(gPrefRef);
7e1f47 ¤   PGPClosePrefFile(gPrefRef);
37cf8b ¤   PGPFreeMemoryMgr(gPGPMemoryMgr);
ac63ed ¤   PGPFreeContext(gPGPContext);
c867c5 ¤
f67f9e ¤   pgpAssertAddrValid(mMenuBar, VoidAlign);
664358 ¤   if(IsntNull(mMenuBar))
dc77f4 ¤   ¤   delete mMenuBar;
0f1b52 ¤   ¤
e7f263 ¤   pgpAssertAddrValid(mModelDirector, LModelDirector);
2786cb ¤   if(IsntNull(mModelDirector))
303dfc ¤   ¤   delete mModelDirector;
3dae30 ¤   ¤   ¤   ¤   ¤
e5e691 ¤   CleanUpPPLeaks();
12efe6 }
97af5a
246d52 ¤   void
dbd3b2 CPGPKeys::ResetKeyDB()
41bb36 {
fc61e0 ¤   PGPError¤   err;
ba8cff ¤   short¤  ¤   keyFilesErr;
7a67c5 ¤
4c90b0 ¤   if(IsntNull(mGroupsWindow))
578daf ¤   ¤   delete mGroupsWindow;
bf929b ¤   mDefaultKeysView->CloseKeys();
bb0d0a ¤   // Out with the old
d867c5 ¤
6db050 ¤   // In with the new
4d1ff2 ¤   err = 0;
855985 ¤   err = PGPOpenDefaultKeyRings(gPGPContext,
1273b0 ¤   ¤   ¤   kPGPKeyRingOpenFlags_Mutable, &mKeySet);
0ac773 ¤   if(!PGPKeySetRefIsValid(mKeySet) && (err != kPGPError_FileLocked))
44c7a1 ¤   {
433a8c ¤   ¤   if(err == kPGPError_FilePermissions)
e95b34 ¤   ¤   {
c98a5b ¤   ¤   ¤   mWritableKeyring = FALSE;
86b8ba ¤   ¤   ¤   err = PGPOpenDefaultKeyRings(gPGPContext,
5e6c5e ¤   ¤   ¤   ¤   ¤   (PGPKeyRingOpenFlags)0, &mKeySet);
990fe4 ¤   ¤   }
d4023e ¤   ¤   if(!PGPKeySetRefIsValid(mKeySet) && ((err == kPGPError_CantOpenFile) ||
160192 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (err == kPGPError_FileNotFound)))
265b34 ¤   ¤   {
2919d4 ¤   ¤   tryOpenKeysAgain:
af218a ¤   ¤   ¤   if((keyFilesErr = AskMakeNewKeyFiles()) != 0)
52f776 ¤   ¤   ¤   {
8edb86 ¤   ¤   ¤   ¤   if(keyFilesErr == 1)
052be4 ¤   ¤   ¤   ¤   ¤   ResetDefaultKeyringsPath();
5be6b3 ¤   ¤   ¤   ¤   mWritableKeyring = TRUE;
33bbcd ¤   ¤   ¤   ¤   err = PGPOpenDefaultKeyRings(gPGPContext,
197d71 ¤   ¤   ¤   ¤   ¤   ¤   (PGPKeyRingOpenFlags)
36fd18 ¤   ¤   ¤   ¤   ¤   ¤   (kPGPKeyRingOpenFlags_Mutable |
38cc8d ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyRingOpenFlags_Create), &mKeySet);
b7a3a6 ¤   ¤   ¤   }
dbbb8c ¤   ¤   ¤   else
5ef776 ¤   ¤   ¤   {
285dd0 ¤   ¤   ¤   ¤   PGPFreeContext(gPGPContext);
--b43f 000cb985d96401201bb Page 7 of CPGPKeys.cp
6e6133 ¤   ¤   ¤   ¤   ::ExitToShell();
38a3a6 ¤   ¤   ¤   }
ec0fe4 ¤   ¤   }
099371 ¤   }
3f415f ¤   if(!PGPKeySetRefIsValid(mKeySet) && IsErr(err))
bec7a1 ¤   {
79e2e8 ¤   ¤   // Fatal keyring error
029eb3 ¤   ¤   ::SysBeep(1);
43a50b ¤   ¤   CWarningAlert::Display(kWAStopAlertType, kWAOKStyle,
d54651 ¤   ¤   ¤   kStringListID, kUnrecoverableKeyringErrorStrIndex);
246b76 ¤   ¤   goto tryOpenKeysAgain;
6e9371 ¤   }
577fc3 ¤   // Reset the list
82cae7 ¤   mDefaultKeysView->SetKeyDBInfo(¤mKeySet, mWritableKeyring, true);
2aefe6 }
e6af5a
5388f9 ¤   short
79e6cf CPGPKeys::AskMakeNewKeyFiles()
a4bb36 {
c8eebf ¤   CPGPStDialogHandler¤askKeyFilesDialog(kNoKeyFilesDialog, this);
be855d ¤   const CommandT¤ ¤   kQuitButton¤¤   ¤   ¤   = 'quit';
215aa5 ¤   const CommandT¤ ¤   kNewKeyFilesButton¤ ¤   = 'nuke';
f6d5a9 ¤   const CommandT¤ ¤   kSelectKeyFilesButton¤  = 'sele';
91dbc1 ¤   MessageT¤   ¤   ¤   dialogMessage;
bc7d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
0f67c5 ¤
0acfa1 ¤   do
00c7a1 ¤   {
766eae ¤   ¤   dialogMessage = askKeyFilesDialog.DoDialog();
22aad5 ¤   } while(!dialogMessage);
88b27b ¤   if(dialogMessage == kNewKeyFilesButton)
bae102 ¤   ¤   return 1;
1aac28 ¤   else if(dialogMessage == kSelectKeyFilesButton)
eac7a1 ¤   {
77c5c2 ¤   ¤   FSSpec¤ publicSpec,
53b8fd ¤   ¤   ¤   ¤   privateSpec;
4e1b52 ¤   ¤
b06878 ¤   ¤   err = PGPSelectPGPFile( gPGPContext, kPGPFileSelector_PublicKeys,
c113f8 ¤   ¤   ¤   ¤   ¤   ¤   &publicSpec );
55d223 ¤   ¤   if( IsPGPError( err ) )
bb8144 ¤   ¤   ¤   return 0;
d21b52 ¤   ¤
9b338c ¤   ¤   err = PGPSelectPGPFile( gPGPContext, kPGPFileSelector_PrivateKeys,
ee47cc ¤   ¤   ¤   ¤   ¤   ¤   &privateSpec );
89d223 ¤   ¤   if( IsPGPError( err ) )
728144 ¤   ¤   ¤   return 0;
e187c7 ¤   ¤   ¤
370706 ¤   ¤   err = PGPSetPGPFileFSSpec( gPGPContext, kPGPFileSelector_PublicKeys,
d7520b ¤   ¤   ¤   ¤   ¤   &publicSpec );
109832 ¤   ¤   pgpAssertNoErr( err );
b3af5a
bea91a ¤   ¤   err = PGPSetPGPFileFSSpec( gPGPContext, kPGPFileSelector_PrivateKeys,
068299 ¤   ¤   ¤   ¤   ¤   &privateSpec );
e19832 ¤   ¤   pgpAssertNoErr( err );
25af5a
f20e66 ¤   ¤   return 2;
ee9371 ¤   }
fb0e24 ¤   else
60bbde ¤   ¤   return 0;
6eefe6 }
dfaf5a
6dc744 ¤   PGPError
3e879e CPGPKeys::GetMinimumRandomData()
d0bb36 {
2a8e12 ¤   PGPError¤   err = kPGPError_NoErr;
ca67c5 ¤
814d81 ¤   if( ! PGPGlobalRandomPoolHasMinimumEntropy() )
edc7a1 ¤   {
811f1b ¤   ¤   PGPUInt32¤  haveBits;
244dba ¤   ¤   PGPUInt32¤  neededBits;
751b52 ¤   ¤
cb7c3a ¤   ¤   haveBits ¤  = PGPGlobalRandomPoolGetEntropy();
--9127 000b8cd2ce0401201bb Page 8 of CPGPKeys.cp
5438eb ¤   ¤   neededBits ¤= PGPGlobalRandomPoolGetMinimumEntropy();
b91b52 ¤   ¤
f158a0 ¤   ¤   pgpAssert( haveBits < neededBits );
301b52 ¤   ¤
c71c82 ¤   ¤   if( haveBits < neededBits )
c05b34 ¤   ¤   {
6d1b04 ¤   ¤   ¤   neededBits = neededBits - haveBits + 100;
be0fe4 ¤   ¤   }
a50e1d ¤   ¤   else
085b34 ¤   ¤   {
ce641d ¤   ¤   ¤   neededBits = 300;¤  /* Token amount */
0f0fe4 ¤   ¤   }
d41b52 ¤   ¤
b75677 ¤   ¤   UDesktop::Deactivate();
4e06b8 ¤   ¤   err = PGPCollectRandomDataDialog( gPGPContext, neededBits,
b5537d ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
90d170 ¤   ¤   UDesktop::Activate();
1b9371 ¤   }
ee67c5 ¤
69deb7 ¤   return( err );
21efe6 }
9aaf5a
53af5a
be5c98 #if PGP_DEBUG
01aa66 #include "PowerPlantLeaks.h"
b433c8 ¤   static void
652c67 InitPowerplantLeaks()
c1bb36 {
8d4ca6 ¤   CForceInitLPeriodical¤  initLPeriodical;
a3efe6 }
f2af5a
52db21 #else
7168b2 #define InitPowerplantLeaks()¤  {/*nothing*/}
997454 #endif
f7af5a
b76d52 ¤   void
abf238 CPGPKeys::StartUp(void)
efbb36 {
b2fb19 ¤   PGPError¤   ¤   err;
4f0d15 ¤   Int16¤  ¤   ¤   keyFilesErr;
1067c5 ¤
3d78be ¤   if( mAppStarted )
f3dd85 ¤   ¤   return;¤¤   /* Already did this */
531b52 ¤   ¤
e85415 ¤   pgpLeaksSuspend();
5930da ¤   new UMainThread;
8167c5 ¤
6df554 ¤   InitPowerplantLeaks();
6f67c5 ¤
40d673 #if PGP_DEMO
0ec47d ¤   if( ShowDemoDialog( TRUE ) == kDemoStateExpired )
fbc7a1 ¤   {
b3ee38 ¤   ¤   ::ExitToShell();
1d9371 ¤   }
f57454 #endif
a6af5a
6cc397 ¤   mHelpMenuRegisterItemNumber = -1;
4b1b63 ¤   /*{
b7049b ¤   ¤   OSErr¤  ¤   osErr;
7408ac ¤   ¤   MenuHandle¤ helpMenuHandle;
901b52 ¤   ¤
504a80 ¤   ¤   //Install Register... command on Help menu
531b52 ¤   ¤
1ed73e ¤   ¤   osErr = HMGetHelpMenuHandle(&helpMenuHandle);
13899d ¤   ¤   if(IsntErr(osErr))
355b34 ¤   ¤   {
d8f21b ¤   ¤   ¤   Str255¤ itemStr;
7587c7 ¤   ¤   ¤
ef2ff5 #if PGP_FREEWARE
182d6e ¤   ¤   ¤   GetIndString(itemStr, kStringListID,
9934f2 ¤   ¤   ¤   ¤   kPGPUpgradeItemStrIndex);
b8db21 #else
--456a 000601a533d401201bb Page 9 of CPGPKeys.cp
8b2d6e ¤   ¤   ¤   GetIndString(itemStr, kStringListID,
065c24 ¤   ¤   ¤   ¤   kPGPRegisterOnlineItemStrIndex);
307454 #endif
c23c95 ¤   ¤   ¤   AppendMenu(helpMenuHandle, itemStr);
c2c9b7 ¤   ¤   ¤   mHelpMenuRegisterItemNumber = CountMItems(helpMenuHandle);
f60fe4 ¤   ¤   }
4f4394 ¤   }*/
fe67c5 ¤
e812a4 ¤   err = pgpNewContextCustomMacAllocators( &gPGPContext );
803d4f ¤   //err = PGPNewContext(kPGPsdkAPIVersion, &gPGPContext);
52dd44 ¤   pgpAssertNoErr(err);
c3af5a
12a643 ¤   err = PGPsdkLoadDefaultPrefs(gPGPContext);
6fdd44 ¤   pgpAssertNoErr(err);
6f67c5 ¤
4af198 ¤   err = PGPNewMemoryMgr( 0, &gPGPMemoryMgr);
cedd44 ¤   pgpAssertNoErr(err);
e30c81 ¤   err = PGPOpenClientPrefs(gPGPMemoryMgr, &gPrefRef);
7eee15 ¤   if(IsPGPError(err))
5ec7a1 ¤   {
759eb3 ¤   ¤   ::SysBeep(1);
23a50b ¤   ¤   CWarningAlert::Display(kWAStopAlertType, kWAOKStyle,
43b9fb ¤   ¤   ¤   kStringListID, kUnrecoverablePrefsErrorStrIndex);
22e919 ¤   ¤   pgpAssertNoErr(err);
33ee38 ¤   ¤   ::ExitToShell();
909371 ¤   }
3167c5 ¤
7f2c3b ¤   gIsAdminConfigured = FALSE;
d6adcd ¤   gAdminPrefRef = kInvalidPGPPrefRef;
055989 #if¤PGP_BUSINESS_SECURITY
53eafc ¤   err = PGPIsAdminConfigured( &gIsAdminConfigured );
a18c1a ¤   pgpAssertNoErr( err );
b567c5 ¤
56da2b ¤   err = PGPOpenAdminPrefs(gPGPMemoryMgr, &gAdminPrefRef );
5dee15 ¤   if(IsPGPError(err))
6bc7a1 ¤   {
55a50b ¤   ¤   CWarningAlert::Display(kWAStopAlertType, kWAOKStyle,
874676 ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kNoAdminPrefsStringID);
82e919 ¤   ¤   pgpAssertNoErr(err);
1dee38 ¤   ¤   ::ExitToShell();
999371 ¤   }
ca7454 #endif
09af5a
195ef5 ¤   gTLSContext¤¤   ¤   = kInvalidPGPtlsContextRef;
fa7594 ¤   gServerCallsPresent = FALSE;
ee74ac ¤   if( CFM_AddressIsResolved_( ::PGPKeyServerInit ) )
8dc7a1 ¤   {
2bf2da ¤   ¤   if( IsntPGPError( PGPKeyServerInit() ) &&
8dc96b ¤   ¤   ¤   IsntPGPError( PGPNewTLSContext( gPGPContext, &gTLSContext ) ) )
9e5b34 ¤   ¤   {
cd4fe7 ¤   ¤   ¤   PGPKeyServerCreateThreadStorage(&mPreviousStorage);
eaad8f ¤   ¤   ¤   gServerCallsPresent = TRUE;
b70fe4 ¤   ¤   }
5b9371 ¤   }
1567c5 ¤
56ebcf ¤   // Personalize if necessary
1a67c5 ¤
fa5e82 ¤   if(!mCheckedLicense)
68c7a1 ¤   {
89a14d ¤   ¤   Str255¤ ¤   str;
c2da22 ¤   ¤   char¤   ¤   nameStr[128];
f2007c ¤   ¤   char¤   ¤   cstr[128];
1daf5a
87b9b7 ¤   ¤   mCheckedLicense = TRUE;
300a21 ¤   ¤   err = PGPGetPrefStringBuffer(gPrefRef, kPGPPrefOwnerName,
5ec8d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( nameStr ) - 1, nameStr);
9b9832 ¤   ¤   pgpAssertNoErr( err );
861b52 ¤   ¤
182cdf ¤   ¤   if(nameStr[0] == '\0')
135b34 ¤   ¤   {
ae72fa ¤   ¤   ¤   const short¤¤   ¤   kWindowRegister¤¤   = 139;
6060dc ¤   ¤   ¤   const PaneIDT¤  ¤   kOwnerNameID¤   ¤   = 'eNam';
--05d5 0000beec4a2401201bb Page 10 of CPGPKeys.cp
fb976e ¤   ¤   ¤   const PaneIDT¤  ¤   kOwnerCompanyID¤¤   = 'eCom';
f9ca96 ¤   ¤   ¤   const PaneIDT¤  ¤   kCaptionCompanyID¤  = 'cCom';
3faf5a
aa1abd ¤   ¤   ¤   CPGPStDialogHandler¤regDialog(kWindowRegister, this);
ea07ac ¤   ¤   ¤   LWindow¤¤   ¤   ¤   *regLDialog;
b789a9 ¤   ¤   ¤   MessageT¤   ¤   ¤   message;
a987c7 ¤   ¤   ¤
222cc7 ¤   ¤   ¤   regLDialog = regDialog.GetDialog();
3387c7 ¤   ¤   ¤
32be29 #if PGP_BUSINESS_SECURITY
5ebe09 ¤   ¤   ¤   if( gIsAdminConfigured )
0bf776 ¤   ¤   ¤   {
b26e1e ¤   ¤   ¤   ¤   ((LStaticText *)regLDialog->FindPaneByID(kCaptionCompanyID))->
538da7 ¤   ¤   ¤   ¤   ¤   Hide();
4a3b8f ¤   ¤   ¤   ¤   ((LEditText *)regLDialog->FindPaneByID(kOwnerCompanyID))->
528da7 ¤   ¤   ¤   ¤   ¤   Hide();
74a3a6 ¤   ¤   ¤   }
d97454 #endif
4487c7 ¤   ¤   ¤
ec6da3 ¤   ¤   ¤   do
75f776 ¤   ¤   ¤   {
6aac25 ¤   ¤   ¤   ¤   message = regDialog.DoDialog();
f315d3 ¤   ¤   ¤   } while((message != msg_OK) && (message != msg_Cancel));
2e9fa5 ¤   ¤   ¤   if(message == msg_OK)
f9f776 ¤   ¤   ¤   {
10e373 ¤   ¤   ¤   ¤   ((LEditText *)regLDialog->FindPaneByID(kOwnerNameID))->
45cca4 ¤   ¤   ¤   ¤   ¤   GetDescriptor(str);
4dfb26 ¤   ¤   ¤   ¤   PToCString(str, cstr);
985136 ¤   ¤   ¤   ¤   err = PGPSetPrefString(gPrefRef, kPGPPrefOwnerName, cstr);
c96f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
ca3b8f ¤   ¤   ¤   ¤   ((LEditText *)regLDialog->FindPaneByID(kOwnerCompanyID))->
bacca4 ¤   ¤   ¤   ¤   ¤   GetDescriptor(str);
60fb26 ¤   ¤   ¤   ¤   PToCString(str, cstr);
8f70b8 ¤   ¤   ¤   ¤   err = PGPSetPrefString(gPrefRef, kPGPPrefCompanyName, cstr);
cc6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
647773 ¤   ¤   ¤   ¤   PGPSavePrefFile(gPrefRef);
386f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
25a3a6 ¤   ¤   ¤   }
b10fe4 ¤   ¤   }
0f9371 ¤   }
85af5a
e00b52 ¤   ShowSplashScreen();
a96560 ¤   mWritableKeyring = TRUE;
ba5985 ¤   err = PGPOpenDefaultKeyRings(gPGPContext,
451c83 ¤   ¤   ¤   ¤   kPGPKeyRingOpenFlags_Mutable, &mKeySet);
51c773 ¤   if(!PGPKeySetRefIsValid(mKeySet) && (err != kPGPError_FileLocked))
bcc7a1 ¤   {
723a8c ¤   ¤   if(err == kPGPError_FilePermissions)
9b5b34 ¤   ¤   {
f08a5b ¤   ¤   ¤   mWritableKeyring = FALSE;
f9b8ba ¤   ¤   ¤   err = PGPOpenDefaultKeyRings(gPGPContext,
586c5e ¤   ¤   ¤   ¤   ¤   (PGPKeyRingOpenFlags)0, &mKeySet);
db0fe4 ¤   ¤   }
3ed430 ¤   ¤   if(!PGPKeySetRefIsValid(mKeySet) &&
1ce93c ¤   ¤   ¤   ( err == kPGPError_CantOpenFile ||
783798 ¤   ¤   ¤   ¤   err == kPGPError_FileNotFound ))
fb5b34 ¤   ¤   {
a619d4 ¤   ¤   tryOpenKeysAgain:
76218a ¤   ¤   ¤   if((keyFilesErr = AskMakeNewKeyFiles()) != 0)
f8f776 ¤   ¤   ¤   {
e2db86 ¤   ¤   ¤   ¤   if(keyFilesErr == 1)
012be4 ¤   ¤   ¤   ¤   ¤   ResetDefaultKeyringsPath();
25e6b3 ¤   ¤   ¤   ¤   mWritableKeyring = TRUE;
d3bbcd ¤   ¤   ¤   ¤   err = PGPOpenDefaultKeyRings(gPGPContext,
197d71 ¤   ¤   ¤   ¤   ¤   ¤   (PGPKeyRingOpenFlags)
e5fd18 ¤   ¤   ¤   ¤   ¤   ¤   (kPGPKeyRingOpenFlags_Mutable |
76cc8d ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyRingOpenFlags_Create), &mKeySet);
67a3a6 ¤   ¤   ¤   }
b4bb8c ¤   ¤   ¤   else
10f776 ¤   ¤   ¤   {
e02167 ¤   ¤   ¤   ¤   // User has requested Quit
0b5dd0 ¤   ¤   ¤   ¤   PGPFreeContext(gPGPContext);
--ddd9 000b8df5829401201bb Page 11 of CPGPKeys.cp
6e6133 ¤   ¤   ¤   ¤   ::ExitToShell();
38a3a6 ¤   ¤   ¤   }
ec0fe4 ¤   ¤   }
099371 ¤   }
c85aca ¤   if(!PGPKeySetRefIsValid(mKeySet) && IsPGPError(err))
e2c7a1 ¤   {
006daf ¤   ¤   // Fatal no keyrings error
159eb3 ¤   ¤   ::SysBeep(1);
4ba50b ¤   ¤   CWarningAlert::Display(kWAStopAlertType, kWAOKStyle,
3b4651 ¤   ¤   ¤   kStringListID, kUnrecoverableKeyringErrorStrIndex);
d66b76 ¤   ¤   goto tryOpenKeysAgain;
049371 ¤   }
c1af5a
4fd53d ¤   mKeyWindow = (CKeyWindow *)
b73e3d ¤   ¤   LWindow::CreateWindow(kKeyWindow, this);
3548df ¤   mDefaultKeysView = mKeyWindow->GetKeyView();
bbcc98 ¤   mDefaultKeysView->SetKeyDBInfo(mKeySet, mWritableKeyring, true);
6f67c5 ¤
2edbca ¤   AddListener( mDefaultKeysView->GetKeyTable() );
4d67c5 ¤
ba68d2 ¤   StartIdling();
1c67c5 ¤
2bb8ec ¤   pgpLeaksResume();
8467c5 ¤
16bd5f ¤   mAppStarted = TRUE;
665989 #if¤PGP_BUSINESS_SECURITY
67c7a1 ¤   {
4d950f ¤   ¤   PGPBoolean¤ updateIntroducers,
753cae ¤   ¤   ¤   ¤   ¤   updateAll;
51f40b ¤   ¤   Uint32¤ ¤   timeNow;
08d031 ¤   ¤   PGPError¤   err;
801b52 ¤   ¤
6aabf5 ¤   ¤   GetDateTime( &timeNow );
3b7504 ¤   ¤   err = PGPCheckAutoUpdateKeysFromServer( gPGPMemoryMgr, FALSE,
ced474 ¤   ¤   ¤   ¤   ¤   &updateAll, &updateIntroducers );
30364b ¤   ¤   if( updateIntroducers )
235b34 ¤   ¤   {
af59c3 ¤   ¤   ¤   if( CWarningAlert::Display(kWANoteAlertType, kWAOKCancelStyle,
4f5da3 ¤   ¤   ¤   ¤   kStringListID, kUpdateIntroducersStrIndex)
651883 ¤   ¤   ¤   ¤   == msg_OK )
a1f776 ¤   ¤   ¤   {
586576 ¤   ¤   ¤   ¤   GetTarget()->ProcessCommand( cmd_UpdateIntroducers, NULL );
8ea3a6 ¤   ¤   ¤   }
a43db8 ¤   ¤   ¤   err = PGPSetPrefNumber( gAdminPrefRef,
a1f10d ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefLastTrustedIntroducersUpdate, timeNow );
f10fe4 ¤   ¤   }
de95dc ¤   ¤   if( updateAll )
ed5b34 ¤   ¤   {
d059c3 ¤   ¤   ¤   if( CWarningAlert::Display(kWANoteAlertType, kWAOKCancelStyle,
3c7be2 ¤   ¤   ¤   ¤   kStringListID, kUpdateAllStrIndex)
d71883 ¤   ¤   ¤   ¤   == msg_OK )
f7f776 ¤   ¤   ¤   {
ec8473 ¤   ¤   ¤   ¤   GetTarget()->ProcessCommand( cmd_SelectAll, NULL );
751764 ¤   ¤   ¤   ¤   GetTarget()->ProcessCommand( cmd_KSGetKeys, NULL );
a8a3a6 ¤   ¤   ¤   }
3f3db8 ¤   ¤   ¤   err = PGPSetPrefNumber( gAdminPrefRef,
f2e10b ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefLastAllKeysUpdate, timeNow );
b30fe4 ¤   ¤   }
614112 ¤   ¤   if( updateIntroducers || updateAll )
ed18b7 ¤   ¤   ¤   PGPSavePrefFile( gAdminPrefRef );
6e9371 ¤   }
cd7454 #endif
21efe6 }
55af5a
ab6d52 ¤   void
9601e8 CPGPKeys::ListenToMessage(¤ MessageT inMessage,
4a8061 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void */*ioParam*/)
b0bb36 {
e326d0 ¤   switch(inMessage)
4cc7a1 ¤   {
83b163 ¤   ¤   case kSearchWindowClosed:
b85aca ¤   ¤   ¤   mSearchWindow = NULL;
--94fb 000c6e4d93f401201bb Page 12 of CPGPKeys.cp
7ecdcb ¤   ¤   ¤   break;
b13718 ¤   ¤   case kSearchInProgress:
2be224 ¤   ¤   ¤   mSearching = TRUE;
c8e10b ¤   ¤   ¤   SetUpdateCommandStatus(true);
93cdcb ¤   ¤   ¤   break;
721457 ¤   ¤   case kSearchComplete:
7e5687 ¤   ¤   ¤   mSearching = FALSE;
80e10b ¤   ¤   ¤   SetUpdateCommandStatus(true);
7ccdcb ¤   ¤   ¤   break;
194823 ¤   ¤   case kGroupsWindowClosed:
cb1837 ¤   ¤   ¤   mGroupsWindow = NULL;
fbcdcb ¤   ¤   ¤   break;
699371 ¤   }
14efe6 }
e4af5a
c76d52 ¤   void
3c8e0b CPGPKeys::FindCommandStatus(
e7ea24 ¤   CommandT¤   inCommand,
e8a472 ¤   Boolean¤¤   &outEnabled,
9b3a4d ¤   Boolean¤¤   &outUsesMark,
3d5dc0 ¤   Char16¤ ¤   &outMark,
81d894 ¤   Str255¤ ¤   outName)
c0bb36 {
5cdb4f ¤   switch (inCommand)·
5dc7a1 ¤   {
e5ff23 ¤   ¤   case cmd_UpdateGroupLists:
2041f9 ¤   ¤   case cmd_SendGroupLists:
edbe29 #if PGP_BUSINESS_SECURITY
78685a ¤   ¤   ¤   PGPBoolean¤ configured = FALSE;
d787c7 ¤   ¤   ¤
7ce59f ¤   ¤   ¤   PGPIsAdminConfigured( &configured );
d76432 ¤   ¤   ¤   if( !configured && gServerCallsPresent )
9b0329 ¤   ¤   ¤   ¤   outEnabled = true;
397454 #endif
1acdcb ¤   ¤   ¤   break;
ac0c0f ¤   ¤   case cmd_SendShareFile:
43f346 ¤   ¤   case cmd_ShowGroups:
a0da34 ¤   ¤   case cmd_Preferences:¤
c88f56 ¤   ¤   ¤   outEnabled = true;
53cdcb ¤   ¤   ¤   break;
27892e ¤   ¤   case cmd_Search:
eca73b ¤   ¤   ¤   if(gServerCallsPresent)
b70329 ¤   ¤   ¤   ¤   outEnabled = true;
0fcdcb ¤   ¤   ¤   break;
9ff85a ¤   ¤   case cmd_Quit:
c5318f ¤   ¤   ¤   if(mSearching)
6ef776 ¤   ¤   ¤   {
ab8eb8 ¤   ¤   ¤   ¤   outEnabled = false;
d1f622 ¤   ¤   ¤   ¤   break;
a2a3a6 ¤   ¤   ¤   }
ff9ae3 ¤   ¤   default:
5687c8 ¤   ¤   ¤   LDocApplication::FindCommandStatus(inCommand, outEnabled,
becfdf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outUsesMark, outMark, outName);
c0cdcb ¤   ¤   ¤   break;
f99371 ¤   }
d8efe6 }
fcaf5a
377e69 ¤   Boolean
b29360 CPGPKeys::ObeyCommand(
67ea24 ¤   CommandT¤   inCommand,
6a0597 ¤   void¤   ¤   *ioParam)
94bb36 {
485b52 ¤   Boolean¤¤   cmdHandled = true;
b62470 ¤   ResIDT¤ ¤   theMenuID;
a14020 ¤   Int16¤  ¤   theMenuItem;
2baf5a
ddc177 ¤   /* Handle case of earlier than expected commands */
2aacd5 ¤   if( ! mAppStarted )
8eb68a ¤   ¤   StartUp();
2f1b52 ¤   ¤
a72ee6 ¤   if(IsSyntheticCommand(inCommand, theMenuID, theMenuItem))
c6c7a1 ¤   {
--9dc9 000117d258e401201bb Page 13 of CPGPKeys.cp
f9a7ee ¤   ¤   switch(theMenuID)
755b34 ¤   ¤   {
e3efa4 ¤   ¤   ¤   case kSubstituteHelpMenuID:
53f776 ¤   ¤   ¤   {
aee2e4 ¤   ¤   ¤   ¤   /*if(theMenuItem == mHelpMenuRegisterItemNumber)
7b72c3 ¤   ¤   ¤   ¤   {
962e3b ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   url,
97ac6e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   licenseStr,
305178 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   licenseNumStr;
9335cb ¤   ¤   ¤   ¤   ¤   char¤   ¤   licenseCStr[128];
08d180 ¤   ¤   ¤   ¤   ¤   OSStatus¤   status;
226252 ¤   ¤   ¤   ¤   ¤   PGPError¤   err;
0caf5a
cf2ff5 #if PGP_FREEWARE
81d9b6 ¤   ¤   ¤   ¤   ¤   GetIndString( url, kStringListID,
4269e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPBuyNowURLStrIndex );
16db21 #else
a0d9b6 ¤   ¤   ¤   ¤   ¤   GetIndString( url, kStringListID,
5b32d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPRegisterURLStrIndex );
3d7454 #endif
0eb65c ¤   ¤   ¤   ¤   ¤   licenseCStr[0] = '\0';
2d5989 #if¤PGP_BUSINESS_SECURITY
f56fe1 ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefStringBuffer(
bf0d2c ¤   ¤   ¤   ¤   ¤   ¤   ¤   gAdminPrefRef, kPGPPrefSiteLicenseNumber, 128,
07d45d ¤   ¤   ¤   ¤   ¤   ¤   ¤   licenseCStr);
5a7454 #endif
b00443 ¤   ¤   ¤   ¤   ¤   if(licenseCStr[0] == '\0')
6e4859 ¤   ¤   ¤   ¤   ¤   {
48c1e0 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefStringBuffer(
5ceced ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPrefRef, kPGPPrefLicenseNumber, 128,
fad45d ¤   ¤   ¤   ¤   ¤   ¤   ¤   licenseCStr);
371c89 ¤   ¤   ¤   ¤   ¤   }
bfbbf8 ¤   ¤   ¤   ¤   ¤   if(licenseCStr[0] != '\0')
a44859 ¤   ¤   ¤   ¤   ¤   {
790625 ¤   ¤   ¤   ¤   ¤   ¤   CToPString(licenseCStr, licenseNumStr);
54cf43 ¤   ¤   ¤   ¤   ¤   ¤   GetIndString( licenseStr, kStringListID,
0ab7a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kURLRegExtensionStrIndex );
a2ec92 ¤   ¤   ¤   ¤   ¤   ¤   AppendPString(licenseNumStr, licenseStr);
de29c6 ¤   ¤   ¤   ¤   ¤   ¤   AppendPString(licenseStr, url);
1d1c89 ¤   ¤   ¤   ¤   ¤   }
acd035 ¤   ¤   ¤   ¤   ¤   status = OpenURL( url );
52cc46 ¤   ¤   ¤   ¤   ¤   if( IsErr( status ) )
754859 ¤   ¤   ¤   ¤   ¤   {
86c786 ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ errorStr;
50af5a
e993e4 ¤   ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
8b99b6 ¤   ¤   ¤   ¤   ¤   ¤   ::NumToString(status, errorStr);
c327ba ¤   ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display( kWACautionAlertType,
f49c29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
a1f307 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
c3c52f ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCantLaunchWebBrowserBecauseStrIndex,
637959 ¤   ¤   ¤   ¤   ¤   ¤   ¤   errorStr );
071c89 ¤   ¤   ¤   ¤   ¤   }
652613 ¤   ¤   ¤   ¤   }
728ea0 ¤   ¤   ¤   ¤   break;*/
ada3a6 ¤   ¤   ¤   }
0ddb68 ¤   ¤   ¤   default:
9ac10a ¤   ¤   ¤   ¤   cmdHandled = LDocApplication::ObeyCommand(inCommand, ioParam);
8bf622 ¤   ¤   ¤   ¤   break;
080fe4 ¤   ¤   }
e59371 ¤   }
613e7d ¤   else switch (inCommand)·
e5c7a1 ¤   {
7b9562 ¤   ¤   case cmd_Preferences:
69f776 ¤   ¤   ¤   {
4b3468 ¤   ¤   ¤   ¤   PGPPrefDialogFlags¤ flags;
932b85 ¤   ¤   ¤   ¤
fdd468 ¤   ¤   ¤   ¤   if( IsntPGPError( PGPPreferencesDialog( gPGPContext,
bae68a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet(),
33c551 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPrefRef,
da1034 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   gAdminPrefRef,
114ddb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flags ) ) )
--48a8 0008eba43d0401201bb Page 14 of CPGPKeys.cp
d072c3 ¤   ¤   ¤   ¤   {
c3f658 ¤   ¤   ¤   ¤   ¤   if( ( flags & kPGPPrefDialog_ChangedKeyFiles ) != 0 )
6a4859 ¤   ¤   ¤   ¤   ¤   {
a5470e ¤   ¤   ¤   ¤   ¤   ¤   ResetKeyDB();
851c89 ¤   ¤   ¤   ¤   ¤   }
adaf5a
47af57 ¤   ¤   ¤   ¤   ¤   if( ( flags & kPGPPrefDialog_ChangedServerList ) != 0 )
b44859 ¤   ¤   ¤   ¤   ¤   {
221b01 ¤   ¤   ¤   ¤   ¤   ¤   BroadcastMessage( kRebuildServersMessage );
251c89 ¤   ¤   ¤   ¤   ¤   }
f6af5a
d6f363 ¤   ¤   ¤   ¤   ¤   BroadcastMessage( kKeyTableRedrawMessage );
122613 ¤   ¤   ¤   ¤   }
e7a3a6 ¤   ¤   ¤   }
29cdcb ¤   ¤   ¤   break;
f70c0f ¤   ¤   case cmd_SendShareFile:
e35cda ¤   ¤   ¤   CSendKeyShares::SendKeyShares( NULL );
22cdcb ¤   ¤   ¤   break;
2d892e ¤   ¤   case cmd_Search:
af6b14 ¤   ¤   ¤   if( IsNull( mSearchWindow ) )
c0f776 ¤   ¤   ¤   {
52765b ¤   ¤   ¤   ¤   mSearchWindow = (CSearchWindow *)
63c5de ¤   ¤   ¤   ¤   ¤   LWindow::CreateWindow(kSearchWindowID, this);
aa1ac0 ¤   ¤   ¤   ¤   AddListener( mSearchWindow );
2c73bc ¤   ¤   ¤   ¤   mSearchWindow->AddListener( this );
10a3a6 ¤   ¤   ¤   }
cabb8c ¤   ¤   ¤   else
7a87a1 ¤   ¤   ¤   ¤   mSearchWindow->Select();
efcdcb ¤   ¤   ¤   break;
82f346 ¤   ¤   case cmd_ShowGroups:
4265e7 ¤   ¤   ¤   if( IsNull( mGroupsWindow ) )
4ef776 ¤   ¤   ¤   {
0fde95 ¤   ¤   ¤   ¤   mGroupsWindow = (CGroupsWindow *)
09daa6 ¤   ¤   ¤   ¤   ¤   LWindow::CreateWindow( kGroupsWindowID,
8d60fd ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp() );
26cf5e ¤   ¤   ¤   ¤   mGroupsWindow->AddListener( this );
7fa3a6 ¤   ¤   ¤   }
37bb8c ¤   ¤   ¤   else
01813c ¤   ¤   ¤   ¤   mGroupsWindow->Select();
b0cdcb ¤   ¤   ¤   break;
47ff23 ¤   ¤   case cmd_UpdateGroupLists:
a141f9 ¤   ¤   case cmd_SendGroupLists:
9c9227 ¤   ¤   ¤   ServerGroupUpdate( inCommand );
dccdcb ¤   ¤   ¤   break;
0df85a ¤   ¤   case cmd_Quit:
02d479 ¤   ¤   ¤   if(TryingToQuit())
3e07aa ¤   ¤   ¤   ¤   SendAEQuit();
b3cdcb ¤   ¤   ¤   break;
f89ae3 ¤   ¤   default:
9a2c2d ¤   ¤   ¤   cmdHandled = LDocApplication::ObeyCommand(inCommand, ioParam);
ddcdcb ¤   ¤   ¤   break;
ae9371 ¤   }
1f67c5 ¤
9c51a4 ¤   return cmdHandled;
6eefe6 }
97af5a
a26d52 ¤   void
f2f741 CPGPKeys::ServerGroupUpdate(
e4af71 ¤   CommandT¤   inCommand¤  )
8ebb36 {
723bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
20fbd1 ¤   PGPGroupSetRef¤ groupSet = kInvalidPGPGroupSetRef;
408747 ¤   PGPFileSpecRef¤ groupSpec = kInvalidPGPFileSpecRef;
f767c5 ¤
1facc8 ¤   if( IsntNull( mGroupsWindow ) )
a3c7a1 ¤   {
328daf ¤   ¤   delete mGroupsWindow;
f12f3f ¤   ¤   mGroupsWindow = NULL;
ca9371 ¤   }
61459a ¤   err = PGPsdkPrefGetFileSpec( gPGPContext, kPGPsdkPref_GroupsFile,
9af64d ¤   ¤   ¤   ¤   &groupSpec );
8e69a2 ¤   if( inCommand == cmd_SendGroupLists )
--f70f 00071654bc0401201bb Page 15 of CPGPKeys.cp
f7c7a1 ¤   {
4486f8 ¤   ¤   if( IsntPGPError( err ) )
275b34 ¤   ¤   {
49fc2a ¤   ¤   ¤   err = PGPNewGroupSetFromFile( gPGPContext, groupSpec,
a78e7a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &groupSet );
390fe4 ¤   ¤   }
549371 ¤   }
15b1f0 ¤   if( IsntPGPError( err ) )
27c7a1 ¤   {
a501e9 ¤   ¤   err = PGPGroupListOperationOnServer( gPGPContext, gTLSContext,
6a9f7c ¤   ¤   ¤   ¤   mKeySet, inCommand == cmd_SendGroupLists, &groupSet );
f39371 ¤   }
1aa298 ¤   if( IsntPGPError( err ) && inCommand == cmd_UpdateGroupLists &&
dc853c ¤   ¤   PGPGroupSetRefIsValid( groupSet ) )
5ec7a1 ¤   {
03b22d ¤   ¤   err = PGPSaveGroupSetToFile( groupSet, groupSpec );
c49371 ¤   }
3067c5 ¤
7b9328 ¤   if( PGPGroupSetRefIsValid( groupSet ) )
7ae8c9 ¤   ¤   PGPFreeGroupSet( groupSet );
fee1f4 ¤   if( PGPFileSpecRefIsValid( groupSpec ) )
dae681 ¤   ¤   PGPFreeFileSpec( groupSpec );
1267c5 ¤
807f7d ¤   if( IsPGPError( err ) )
863822 ¤   ¤   ReportPGPError( err );
f3c27b ¤   if( IsntPGPError( err ) && inCommand == cmd_UpdateGroupLists )
d5c4d3 ¤   ¤   ProcessCommand( cmd_ShowGroups, NULL );
74efe6 }
51af5a
8c7e69 ¤   Boolean
a45de2 CPGPKeys::TryingToQuit(void)
e2bb36 {
422b9c ¤   if(mCreatedKey)
58c7a1 ¤   {
0ebb29 ¤   ¤   BackupHandler¤  handler;
0bf797 ¤   ¤   return handler.Run();
b29371 ¤   }
840e24 ¤   else
9deaf5 ¤   ¤   return true;
e2efe6 }
ecaf5a
8c6d52 ¤   void
fe1ebd CPGPKeys::CreatedKey()
7bbb36 {
1b80ab ¤   mCreatedKey = true;
09efe6 }
e7af5a
076d52 ¤   void
4b50c2 CPGPKeys::MakeLicenseStr(Str255 outLicenseStr)
99bb36 {
1561e0 ¤   PGPError¤   err;
d8f265 ¤   char¤   ¤   companyStr[128];
98ed2a ¤   char¤   ¤   nameStr[128];
f021a4 ¤   char¤   ¤   str[256];
6e67c5 ¤
affd5c ¤   companyStr[0] = '\0';
f5be29 #if PGP_BUSINESS_SECURITY
08ae96 ¤   err = PGPGetPrefStringBuffer( gAdminPrefRef, kPGPPrefAdminCompanyName,
cc262b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( companyStr ) - 1, companyStr );
748c1a ¤   pgpAssertNoErr( err );
537454 #endif
84a0ff ¤   if( companyStr[0] == '\0' )
4ec7a1 ¤   {
4b18f7 ¤   ¤   err = PGPGetPrefStringBuffer( gPrefRef, kPGPPrefCompanyName,
01262b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( companyStr ) - 1, companyStr );
c69832 ¤   ¤   pgpAssertNoErr( err );
e29371 ¤   }
be67c5 ¤
5e9c1a ¤   err = PGPGetPrefStringBuffer( gPrefRef, kPGPPrefOwnerName,
7c8cc6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( companyStr ) - 1, nameStr );
758c1a ¤   pgpAssertNoErr( err );
7167c5 ¤
--d07d 0009f6953d2401201bb Page 16 of CPGPKeys.cp
2a67c5 ¤
0a8995 ¤   strcpy( str, nameStr );
1b4f3c ¤   strcat( str, "\r" );
8f1f73 ¤   strcat( str, companyStr );
aacb51 ¤   c2pstr( str );
ecc02d ¤   CopyPString( (uchar *)str, outLicenseStr );
d4efe6 }
58af5a
3c6d52 ¤   void
811cb4 CPGPKeys::ShowAboutBox()
dbbb36 {
ad34e7 ¤   Boolean¤didShowDialog = FALSE;
2aac2e ¤   FSSpec¤ libraryFileSpec;
8567c5 ¤
0b1fea ¤   // Open the library resource file at the top of the resource chain
7761ff ¤   // so we get our pictures.
f5f7ee ¤   if( IsntErr( PGPGetClientLibFSSpec( &libraryFileSpec ) ) )
2bc7a1 ¤   {
630fff ¤   ¤   short¤  saveResFile;
7aface ¤   ¤   short¤  libFileRefNum;
4c1b52 ¤   ¤
6331ea ¤   ¤   saveResFile = CurResFile();
f11b52 ¤   ¤
55f446 ¤   ¤   libFileRefNum = FSpOpenResFile( &libraryFileSpec, fsRdPerm );
cb0214 ¤   ¤   if( libFileRefNum > 0 )
765b34 ¤   ¤   {
89a680 ¤   ¤   ¤   UseResFile( libFileRefNum );
b587c7 ¤   ¤   ¤
fbf776 ¤   ¤   ¤   {
c02ac8 ¤   ¤   ¤   ¤   CPGPStDialogHandler¤aboutDialog(kWindowAbout, this);
a3871e ¤   ¤   ¤   ¤   LWindow¤¤   ¤   *theDialog;
24ef2b ¤   ¤   ¤   ¤   MessageT¤   ¤   message;
e433dd ¤   ¤   ¤   ¤   Boolean¤¤   ¤   credits = FALSE;
10dc77 ¤   ¤   ¤   ¤   Str255¤ ¤   ¤   str;
022b85 ¤   ¤   ¤   ¤
f61acb ¤   ¤   ¤   ¤   const MessageT¤ ¤   kPGPButtonMessage¤  ¤   = 'bPGP';
e49ca9 ¤   ¤   ¤   ¤   const MessageT¤ ¤   kCreditsButtonMessage¤  = 'bCre';
8739bb ¤   ¤   ¤   ¤   const MessageT¤ ¤   kOKButtonMessage¤   ¤   = 'bOK ';
c42b85 ¤   ¤   ¤   ¤
1c110c ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   kCreditsButtonPaneID¤   = 'bCre';
4ffb84 ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   kAboutPicturePaneID¤¤   = 'APIC';
234b4a ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   kCreditsPicturePaneID¤  = 'CPIC';
a0fe6b ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   kBSAFEPicturePaneID¤¤   = 'RPIC';
4bde2b ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   kLicenseCaptionID¤  ¤   = 'cLic';
4d2b85 ¤   ¤   ¤   ¤
2ec6a7 ¤   ¤   ¤   ¤   theDialog = aboutDialog.GetDialog();
997cce ¤   ¤   ¤   ¤   didShowDialog = TRUE;
5eaf5a
910110 ¤   ¤   ¤   ¤   MakeLicenseStr(str);
40a863 ¤   ¤   ¤   ¤   ((LStaticText *)theDialog->FindPaneByID(kLicenseCaptionID))->
3f3472 ¤   ¤   ¤   ¤   ¤   SetDescriptor(str);
1f2b85 ¤   ¤   ¤   ¤
9c176b ¤   ¤   ¤   ¤   while((message = aboutDialog.DoDialog()) != kOKButtonMessage )
f072c3 ¤   ¤   ¤   ¤   {
8972f7 ¤   ¤   ¤   ¤   ¤   if( message == kPGPButtonMessage )
f54859 ¤   ¤   ¤   ¤   ¤   {
87f34f ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   url;
9a59e6 ¤   ¤   ¤   ¤   ¤   ¤   OSStatus¤   status;
c194aa ¤   ¤   ¤   ¤   ¤   ¤
18dac1 ¤   ¤   ¤   ¤   ¤   ¤   GetIndString( url, kStringListID,
98a35d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPWebSiteURLStrIndex );
1194aa ¤   ¤   ¤   ¤   ¤   ¤
7482a8 ¤   ¤   ¤   ¤   ¤   ¤   status = OpenURL( url );
50f583 ¤   ¤   ¤   ¤   ¤   ¤   if( IsErr( status ) )
278fec ¤   ¤   ¤   ¤   ¤   ¤   {
91fe43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ errorStr;
a3af5a
f7af0a ¤   ¤   ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
f233b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   NumToString(status, errorStr);
0320cc ¤   ¤   ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display( kWACautionAlertType,
b2144f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
9f629f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
--d9c0 0006417baa7401201bb Page 17 of CPGPKeys.cp
fed00c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCantLaunchWebBrowserBecauseStrIndex,
43f13f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   errorStr );
34db3c ¤   ¤   ¤   ¤   ¤   ¤   }
fa1c89 ¤   ¤   ¤   ¤   ¤   }
a62270 ¤   ¤   ¤   ¤   ¤   else if ( message == kCreditsButtonMessage )
6b4859 ¤   ¤   ¤   ¤   ¤   {
8cec2c ¤   ¤   ¤   ¤   ¤   ¤   Str255¤ buttonTitle;
0b94aa ¤   ¤   ¤   ¤   ¤   ¤
2898c6 ¤   ¤   ¤   ¤   ¤   ¤   if( credits )
af8fec ¤   ¤   ¤   ¤   ¤   ¤   {
fdd945 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kAboutPicturePaneID )->
3f827c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Show();
e90594 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kCreditsPicturePaneID )->
ba6e50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Hide();
e537fe ¤   ¤   ¤   ¤   ¤   #if CREDIT_RSA_BSAFE
0ca85d ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kBSAFEPicturePaneID )->
e26e50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Hide();
b9edfd ¤   ¤   ¤   ¤   ¤   #endif
14531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
cfed68 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetIndString( buttonTitle, kStringListID,
f3299c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAboutCreditsButtonTitleStrIndex );
34db3c ¤   ¤   ¤   ¤   ¤   ¤   }
c07f8b ¤   ¤   ¤   ¤   ¤   ¤   else
d38fec ¤   ¤   ¤   ¤   ¤   ¤   {
c50594 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kCreditsPicturePaneID )->
19827c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Show();
0037fe ¤   ¤   ¤   ¤   ¤   #if CREDIT_RSA_BSAFE
58a85d ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kBSAFEPicturePaneID )->
d2827c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Show();
b8edfd ¤   ¤   ¤   ¤   ¤   #endif
1ad945 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theDialog->FindPaneByID( kAboutPicturePaneID )->
f16e50 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Hide();
80af5a
c7ed68 ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetIndString( buttonTitle, kStringListID,
d7c0b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAboutInfoButtonTitleStrIndex );
eddb3c ¤   ¤   ¤   ¤   ¤   ¤   }
3e94aa ¤   ¤   ¤   ¤   ¤   ¤
d4a94e ¤   ¤   ¤   ¤   ¤   ¤   ((LControl *)theDialog->
b2958c ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID(kCreditsButtonPaneID))->
2551fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   SetDescriptor( buttonTitle );
3aaf5a
5e8879 ¤   ¤   ¤   ¤   ¤   ¤   credits = ! credits;
c51c89 ¤   ¤   ¤   ¤   ¤   }
ec2613 ¤   ¤   ¤   ¤   }
baa3a6 ¤   ¤   ¤   }
f487c7 ¤   ¤   ¤
df9e6b ¤   ¤   ¤   CloseResFile( libFileRefNum );
9bad2f ¤   ¤   ¤   UseResFile( saveResFile );
b00fe4 ¤   ¤   }
f79371 ¤   }
1e67c5 ¤
069337 ¤   if( ! didShowDialog )
d3057e ¤   ¤   SysBeep( 1 );
dfefe6 }
09af5a
3a6d52 ¤   void
d777d2 CPGPKeys::ShowSplashScreen()
2cbb36 {
825215 ¤   FSSpec¤ ¤   libraryFileSpec;
9e61e0 ¤   PGPError¤   err;
fc0180 ¤   ulong¤  ¤   timeNow;
7293bd ¤   PGPUInt32¤  lastSplashed;
1a67c5 ¤
4f00fd ¤   GetDateTime(&timeNow);
359e7c ¤   err = PGPGetPrefNumber(gPrefRef, kPGPPrefDateOfLastSplashScreen,
3ba1e6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &lastSplashed);
a0dd44 ¤   pgpAssertNoErr(err);
d29ef6 ¤   if(timeNow - lastSplashed < kSecondsInADay)¤¤   // One day
4999bf ¤   ¤   return;
b867c5 ¤
8cd04e ¤   // Open the libarary resource file at the top of the resource chain
6461ff ¤   // so we get our pictures.
--07ff 0007684d2ba401201bb Page 18 of CPGPKeys.cp
39f7ee ¤   if( IsntErr( PGPGetClientLibFSSpec( &libraryFileSpec ) ) )
d0c7a1 ¤   {
450fff ¤   ¤   short¤  saveResFile;
8bface ¤   ¤   short¤  libFileRefNum;
a51b52 ¤   ¤
f831ea ¤   ¤   saveResFile = CurResFile();
fa1b52 ¤   ¤
56f446 ¤   ¤   libFileRefNum = FSpOpenResFile( &libraryFileSpec, fsRdPerm );
3d0214 ¤   ¤   if( libFileRefNum > 0 )
235b34 ¤   ¤   {
87a680 ¤   ¤   ¤   UseResFile( libFileRefNum );
8787c7 ¤   ¤   ¤
4cf776 ¤   ¤   ¤   {
1a0166 ¤   ¤   ¤   ¤   const ResIDT¤   ¤   kWindowSplash¤  ¤   ¤   = 146;
3f64ba ¤   ¤   ¤   ¤   const MessageT¤ ¤   kLicenseCaptionID¤  ¤   = 'cLic';
f54090 ¤   ¤   ¤   ¤   LCaption¤   ¤   ¤   *licenseCaption;
66b135 ¤   ¤   ¤   ¤   Str255¤ ¤   ¤   ¤   licenseStr;
b12b85 ¤   ¤   ¤   ¤
45e1f2 ¤   ¤   ¤   ¤   mSplashScreen = (LGADialog *)
ffbd1a ¤   ¤   ¤   ¤   ¤   LWindow::CreateWindow(kWindowSplash, this);
617faa ¤   ¤   ¤   ¤   licenseCaption = ((LCaption *)
7ff942 ¤   ¤   ¤   ¤   ¤   mSplashScreen->FindPaneByID(kLicenseCaptionID));
83831e ¤   ¤   ¤   ¤   MakeLicenseStr(licenseStr);
c5da21 ¤   ¤   ¤   ¤   licenseCaption->SetDescriptor(licenseStr);
39cd54 ¤   ¤   ¤   ¤   mSplashScreen->UpdatePort();
1fed21 ¤   ¤   ¤   ¤   mSplashDisplayTime = LMGetTicks();
c81535 ¤   ¤   ¤   ¤   err = PGPSetPrefNumber(gPrefRef,
7ad2a0 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefDateOfLastSplashScreen, timeNow);
2d04ec ¤   ¤   ¤   ¤   pgpAssert(IsntErr(err));
a9a3a6 ¤   ¤   ¤   }
cd87c7 ¤   ¤   ¤
959e6b ¤   ¤   ¤   CloseResFile( libFileRefNum );
dbad2f ¤   ¤   ¤   UseResFile( saveResFile );
550fe4 ¤   ¤   }
d09371 ¤   }
bcefe6 }
3baf5a
136d52 ¤   void
64b43f CPGPKeys::EndSplashScreen()
62bb36 {
005919 ¤   if(mSplashScreen)
36c7a1 ¤   {
c6a8c6 ¤   ¤   while((mSplashDisplayTime + kSplashDisplayTime > LMGetTicks()) &&
384c98 ¤   ¤   ¤   ¤   !Button())
e7b110 ¤   ¤   ¤   ;
c76bf9 ¤   ¤   delete mSplashScreen;
0d9fd4 ¤   ¤   mSplashScreen = NULL;
a7ebe0 ¤   ¤   ::FlushEvents(mDownMask, 0);
139371 ¤   }
efefe6 }
e8af5a
926d52 ¤   void
9f47c8 CPGPKeys::MakeMenuBar()
e0bb36 {
dfb765 ¤   mMenuBar = new PGPKeysMenuBar(MBAR_Initial);
93efe6 }
4aaf5a
666d52 ¤   void
0dfbe8 CPGPKeys::MakeModelDirector()
6bbb36 {
9b5415 ¤   pgpLeaksSuspend();
b0741c ¤   mModelDirector = new LModelDirector(this);
0fb8ec ¤   pgpLeaksResume();
1cefe6 }
42af5a
f96d52 ¤   void
8a1e8e CPGPKeys::SpendTime(
64ee99 ¤   const EventRecord¤  &/*inMacEvent*/)
1abb36 {
b0fb29 ¤   GrafPtr¤¤   savePort;
d554b5 ¤   GrafPtr¤¤   wMgrPort;
7679d1 ¤   Point¤  ¤   mouseLoc;
--9720 000c75c976b401201bb Page 19 of CPGPKeys.cp
e0af5a
0b44bb ¤   if( IsntNull( mSplashScreen ) )
cac7a1 ¤   {
587668 ¤   ¤   EndSplashScreen();
0a9371 ¤   }
5aaf5a
7721de ¤   ::GetPort(&savePort);
a0354a ¤   ::GetWMgrPort(&wMgrPort);¤
a567c5 ¤
d5fc80 ¤   ::SetPort(wMgrPort);
bd0c16 ¤   ::GetMouse(&mouseLoc);
f3a2ca ¤   ::SetPort(savePort);
1d67c5 ¤
80599c ¤   if((mouseLoc.v != mLastMouseLoc.v) ||
47979d ¤   ¤   (mouseLoc.h != mLastMouseLoc.h))
3fc7a1 ¤   {
bd846e ¤   ¤   PGPGlobalRandomPoolAddMouse(mouseLoc.h, mouseLoc.v);
ecb0a9 ¤   ¤   mLastMouseLoc = mouseLoc;
cb9371 ¤   }
63efe6 }
26af5a
901fc8 ¤   PGPKeyListRef
a8c032 CPGPKeys::GetKeyList()
e3bb36 {
502455 ¤   return mKeyList;
6cefe6 }
94af5a
4b6d52 ¤   void
ab0312 CPGPKeys::SetKeyList(PGPKeyListRef keyList)
f2bb36 {
e68b47 ¤   mKeyList = keyList;
ddefe6 }
22af5a
317c09 ¤   PGPKeySet *
a17d85 CPGPKeys::GetKeySet()
31bb36 {
715f56 ¤   return mKeySet;
1befe6 }
7caf5a
b96d52 ¤   void
32e32d CPGPKeys::CommitDefaultKeyrings()
ddbb36 {
8f61e0 ¤   PGPError¤   err;
f767c5 ¤
bb9838 ¤   err = PGPCommitKeyRingChanges(mKeySet);
30ee15 ¤   if(IsPGPError(err))
39c7a1 ¤   {
bb232c ¤   ¤   if((err == kPGPError_ItemIsReadOnly) &&
acc095 ¤   ¤   ¤   !mWritableKeyring)
da5b34 ¤   ¤   {
742b34 ¤   ¤   ¤   PGPBoolean¤ warnRO;
d587c7 ¤   ¤   ¤
05f993 ¤   ¤   ¤   err = PGPGetPrefBoolean(gPrefRef,
2448c9 ¤   ¤   ¤   ¤   kPGPPrefWarnOnReadOnlyKeyRings, &warnRO);
63524f ¤   ¤   ¤   pgpAssertNoErr(err);
363a70 ¤   ¤   ¤   if(warnRO)
50f776 ¤   ¤   ¤   {
bc9ad7 ¤   ¤   ¤   ¤   CPGPStDialogHandler¤roErrorDialog(kReadOnlyErrorDialog, this);
d7d9cd ¤   ¤   ¤   ¤   const PaneIDT¤  ¤   kNoWarnCheckbox¤= 'xWar';
199ca7 ¤   ¤   ¤   ¤   MessageT¤   ¤   ¤   dialogMessage;
d23914 ¤   ¤   ¤   ¤   LWindow¤¤   ¤   ¤   *roErrorLWindow;
372b85 ¤   ¤   ¤   ¤
478f00 ¤   ¤   ¤   ¤   do
db72c3 ¤   ¤   ¤   ¤   {
037aee ¤   ¤   ¤   ¤   ¤   dialogMessage = roErrorDialog.DoDialog();
7c2906 ¤   ¤   ¤   ¤   } while(!dialogMessage);
771c28 ¤   ¤   ¤   ¤   roErrorLWindow = roErrorDialog.GetDialog();
98494b ¤   ¤   ¤   ¤   if(((LCheckBox *)roErrorLWindow->
ef8fa7 ¤   ¤   ¤   ¤   ¤   FindPaneByID(kNoWarnCheckbox))->
9ec048 ¤   ¤   ¤   ¤   ¤   GetValue())
8f72c3 ¤   ¤   ¤   ¤   {
c74ef0 ¤   ¤   ¤   ¤   ¤   err = PGPSetPrefBoolean(gPrefRef,
--fbec 000145be38d401201bb Page 20 of CPGPKeys.cp
cf8e90 ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefWarnOnReadOnlyKeyRings, FALSE);
866aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
fb2613 ¤   ¤   ¤   ¤   }
68a3a6 ¤   ¤   ¤   }
d50fe4 ¤   ¤   }
2f0e1d ¤   ¤   else
ba3c4c ¤   ¤   ¤   ReportPGPError(err);
369371 ¤   }
f5efe6 }
f0af5a
016ba8 typedef struct SFInfo
0dbb36 {
d20925 ¤   StandardFileReply¤  sfReply;
97bf02 ¤   Boolean¤¤   ¤   ¤   showAllFiles;
41b9bd ¤   SFTypeList¤ ¤   ¤   typeList;
d42c77 ¤   short¤  ¤   ¤   ¤   numTypes;
e181a8 } SFInfo;
50af5a
d17353 enum
fcbb36 {
620b20 ¤   kShowAllFilesCheckboxItem¤  = 10
d482f7 };
f0af5a
8b6867 ¤   static pascal short
19ce21 CustomGetFileHook(short item, DialogPtr dialog, SFInfo *sfInfo)
e2bb36 {
3c63e1 ¤   pgpAssertAddrValid( dialog, DialogRecord );
4ea538 ¤   pgpAssertAddrValid( sfInfo, SFInfo );
05af5a
99eeb5 ¤   if( GetWRefCon( dialog ) == sfMainDialogRefCon )
a5c7a1 ¤   {
53217e ¤   ¤   switch( item )
355b34 ¤   ¤   {
694810 ¤   ¤   ¤   case kShowAllFilesCheckboxItem:
a9e39b ¤   ¤   ¤   {¤  ¤   ¤
2b19be ¤   ¤   ¤   ¤   sfInfo->showAllFiles = ToggleDialogCheckbox( dialog,
fcaab0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kShowAllFilesCheckboxItem );
0d72fd ¤   ¤   ¤   ¤   item = sfHookRebuildList;
49f622 ¤   ¤   ¤   ¤   break;
bfa3a6 ¤   ¤   ¤   }
8f87c7 ¤   ¤   ¤
330fe4 ¤   ¤   }
c09371 ¤   }
1967c5 ¤
10e2ea ¤   return item;
66efe6 }
7baf5a
411a2a ¤   static pascal Boolean
f6e74c VisibleItemFileFilterProc(CInfoPBPtr cpb)
e8bb36 {
317c56 ¤   Boolean¤shouldFilter = FALSE;
4967c5 ¤
01a0bd ¤   pgpAssertAddrValid( cpb, CInfoPBRec);
b0af5a
0b2577 ¤   if( cpbIsFile( cpb ) )
12c7a1 ¤   {
efda16 ¤   ¤   if( ( cpb->hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible ) != 0 )
675b34 ¤   ¤   {
3c7850 ¤   ¤   ¤   shouldFilter = TRUE;
190fe4 ¤   ¤   }
f79371 ¤   }
3a0e24 ¤   else
1bc7a1 ¤   {
178b69 ¤   ¤   if( ( cpb->dirInfo.ioDrUsrWds.frFlags & kIsInvisible ) != 0 )
3a5b34 ¤   ¤   {
b27850 ¤   ¤   ¤   shouldFilter = TRUE;
380fe4 ¤   ¤   }
359371 ¤   }
f267c5 ¤
cdb746 ¤   return( shouldFilter );
5aefe6 }
14af5a
--0c11 000c7407ad4401201bb Page 21 of CPGPKeys.cp
da1a2a ¤   static pascal Boolean
860204 CustomGetFileFilter(CInfoPBPtr cpb, const SFInfo *sfInfo)
9cbb36 {
397c56 ¤   Boolean¤shouldFilter = FALSE;
6767c5 ¤
264e12 ¤   shouldFilter = VisibleItemFileFilterProc( cpb );
e05e82 ¤   if( ! shouldFilter )
4fc7a1 ¤   {
e259b8 ¤   ¤   if( cpbIsFile( cpb ) && !sfInfo->showAllFiles &&
592a2b ¤   ¤   ¤   ( sfInfo->numTypes > 0 ) )
9a5b34 ¤   ¤   {
790f16 ¤   ¤   ¤   Boolean¤found = FALSE;
2187c7 ¤   ¤   ¤
20d346 ¤   ¤   ¤   for( short typeIndex = 0; typeIndex < sfInfo->numTypes; typeIndex++¶
f95d36 ·)
08e353 ¤   ¤   ¤   ¤   if( sfInfo->typeList[typeIndex] == cpbFileType( cpb ) )
278698 ¤   ¤   ¤   ¤   ¤   found = TRUE;
d959bd ¤   ¤   ¤   if( !found )
044538 ¤   ¤   ¤   ¤   shouldFilter = TRUE;
7a0fe4 ¤   ¤   }
179371 ¤   }
f11b52 ¤   ¤
95b746 ¤   return( shouldFilter );
94efe6 }
cbaf5a
ea7e69 ¤   Boolean
00e2aa CustomGetFileWithShowAll(
87f4ee ¤   short¤  ¤   ¤   ¤   numTypes,
366124 ¤   SFTypeList¤ ¤   ¤   typeList,
908eea ¤   FSSpec¤ ¤   ¤   ¤   *fsSpec )
04bb36 {
6cebcb ¤   SFInfo¤ ¤   ¤   ¤   sfInfo;
3a78c8 ¤   DlgHookYDUPP¤   ¤   cbHook;
30408f ¤   FileFilterYDUPP¤¤   filterUPP;
9ace8a ¤   static Point¤   ¤   where={0,0};
6867c5 ¤
ee5235 ¤   cbHook ¤¤   =
f5c4f2 ¤   ¤   NewDlgHookYDProc( CustomGetFileHook );
878dd2 ¤   filterUPP¤  =
40ad02 ¤   ¤   NewFileFilterYDProc( CustomGetFileFilter );
e0a06a ¤   sfInfo.showAllFiles¤= FALSE;
670121 ¤   sfInfo.numTypes¤¤   = numTypes;
2609f5 ¤   sfInfo.typeList[0]¤ = typeList[0];
e28607 ¤   sfInfo.typeList[1]¤ = typeList[1];
031e00 ¤   sfInfo.typeList[2]¤ = typeList[2];
1091f2 ¤   sfInfo.typeList[3]¤ = typeList[3];
70af5a
3dfb29 ¤   UDesktop::Deactivate();
622196 ¤   CustomGetFile(¤ filterUPP,
5bc898 ¤   ¤   ¤   ¤   ¤   -1, typeList,
48e8e3 ¤   ¤   ¤   ¤   ¤   &sfInfo.sfReply,
9ac6b3 ¤   ¤   ¤   ¤   ¤   kOpenCustomGetDialog,
b414f9 ¤   ¤   ¤   ¤   ¤   where,
813844 ¤   ¤   ¤   ¤   ¤   cbHook,
832797 ¤   ¤   ¤   ¤   ¤   NULL,
cf2797 ¤   ¤   ¤   ¤   ¤   NULL,
ae2797 ¤   ¤   ¤   ¤   ¤   NULL,
2de500 ¤   ¤   ¤   ¤   ¤   &sfInfo );
a05824 ¤   UDesktop::Activate();
77af5a
86a52d ¤   DisposeRoutineDescriptor( cbHook );
2105d4 ¤   DisposeRoutineDescriptor( filterUPP );
b267c5 ¤
64857a ¤   if( sfInfo.sfReply.sfGood )
e6c7a1 ¤   {
9a9d1c ¤   ¤   *fsSpec = sfInfo.sfReply.sfFile;
1e836c ¤   ¤   return TRUE;
0e9371 ¤   }
0ba230 ¤   return FALSE;
37efe6 }
fdaf5a
c76d52 ¤   void
--7321 000a22e2e6a401201bb Page 22 of CPGPKeys.cp
d14ab5 CPGPKeys::InvalidateCaches()
64bb36 {
2b90b0 ¤   if(IsntNull(mGroupsWindow))
22c7a1 ¤   {
8f7442 ¤   ¤   mGroupsWindow->InvalidateCaches();
209371 ¤   }
53efe6 }
18af5a
d16d52 ¤   void
5f4f4e CPGPKeys::OpenDocument(
a98ae0 ¤   FSSpec¤ *inMacFSSpec)
bebb36 {
2739e0 ¤   FInfo¤  fInfo;
8967c5 ¤
81acd5 ¤   if( ! mAppStarted )
e0b68a ¤   ¤   StartUp();
3167c5 ¤
7b5d22 ¤   if( IsntErr( FSpGetFInfo( inMacFSSpec, &fInfo ) ) )
bbc7a1 ¤   {
a39c85 ¤   ¤   switch( fInfo.fdType )
c65b34 ¤   ¤   {
6b2ffe ¤   ¤   ¤   case kPGPMacFileCreator_SplitKey:
c6c474 ¤   ¤   ¤   ¤   CSendKeyShares::SendKeyShares( inMacFSSpec );
acf622 ¤   ¤   ¤   ¤   break;
e80fe4 ¤   ¤   }
b59371 ¤   }
7befe6 }
2eaf5a
136d52 ¤   void
dc9229 ReportPGPError(PGPError err)
3abb36 {
82be02 ¤   if( IsPGPError( err ) ·&& ( err != kPGPError_UserAbort ) )
58c7a1 ¤   {
26c481 ¤   ¤   char¤   str[256];
b9bdf2 ¤   ¤   Str255¤ pStr;
a71b52 ¤   ¤
8446fb ¤   ¤   PGPGetClientErrorString(err, sizeof( str ), str);
e18ef4 ¤   ¤   CToPString( str, pStr);
941b52 ¤   ¤
2b8c37 ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
1a1fbb ¤   ¤   ¤   kStringListID, kErrorPrefaceStringID, pStr);
429371 ¤   }
d5efe6 }
75af5a
363c34 /*¤ pascal void
1305b0 PKNavEventProc(
17b925 ¤   NavEventCallbackMessage¤callbackSelector,
683f9d ¤   NavCBRecPtr¤¤   ¤   ¤   callbackParms,
5d2efa ¤   NavCallBackUserData¤¤   callbackUD )
aabb36 {
32978d ¤   switch( callbackSelector )
bcc7a1 ¤   {
211d18 ¤   ¤   case kNavCBEvent:
97da7c ¤   ¤   ¤   if( callbackParms->eventData.event->what == updateEvt )
b2e158 ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->
dac528 ¤   ¤   ¤   ¤   ¤   DispatchEvent( *callbackParms->eventData.event );
f2cdcb ¤   ¤   ¤   break;
229371 ¤   }
f8efe6 }
877fe0 */
4b6d52 ¤   void
a18ce1 CPGPKeys::HandleAppleEvent(
478e4e ¤   const AppleEvent¤   &inAppleEvent,
105341 ¤   AppleEvent¤ ¤   ¤   &outAEReply,
b9df45 ¤   AEDesc¤ ¤   ¤   ¤   &outResult,
e2e675 ¤   long¤   ¤   ¤   ¤   inAENumber)
cebb36 {
0e5867 ¤   switch( inAENumber )
29c7a1 ¤   {
84ca74 ¤   ¤   case ae_ImportKey:
155b34 ¤   ¤   {
a25ae9 ¤   ¤   ¤   StAEDescriptor¤ descKeys(¤  inAppleEvent,
--ca37 0004fafc628401201bb Page 23 of CPGPKeys.cp
0d23ba ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyDirectObject);
df87c7 ¤   ¤   ¤
407667 ¤   ¤   ¤   if(mWritableKeyring)
a9f776 ¤   ¤   ¤   {
dc602e ¤   ¤   ¤   ¤   mDefaultKeysView->
f6206e ¤   ¤   ¤   ¤   ¤   ImportKeysFromHandle(descKeys.mDesc.dataHandle);
97a3a6 ¤   ¤   ¤   }
45cdcb ¤   ¤   ¤   break;
c00fe4 ¤   ¤   }
f1af5a
05af5a
2c9ae3 ¤   ¤   default:
cca604 ¤   ¤   ¤   LDocApplication::HandleAppleEvent(inAppleEvent, outAEReply,
a612dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outResult, inAENumber);
eecdcb ¤   ¤   ¤   break;
2b9371 ¤   }
c567c5 ¤
55efe6 }
1aaf5a
d66d52 ¤   void
52e750 CPGPKeys::ResetDefaultKeyringsPath()
67bb36 {
a93827 ¤   CInfoPBRec¤ ¤   pb;
1a5130 ¤   Str255¤ ¤   ¤   name;
cffb19 ¤   PGPError¤   ¤   err;
9a4704 ¤   FSSpec¤ ¤   ¤   publicKeyFileSpec;
f8e289 ¤   FSSpec¤ ¤   ¤   privateKeyFileSpec;
6e67c5 ¤
0b5618 ¤   GetIndString(name, kMiscStringsID, kPGPKeyringsFolderStringID);
1767c5 ¤
fd8435 ¤   pb.dirInfo.ioVRefNum ¤  = gAppFSSpec.vRefNum;
04b7da ¤   pb.dirInfo.ioDrDirID ¤  = gAppFSSpec.parID;
fc843d ¤   pb.dirInfo.ioNamePtr ¤  = name;
8ce2ff ¤   pb.dirInfo.ioFDirIndex ¤= 0;
a367c5 ¤
275ba3 ¤   if (PBGetCatInfoSync( &pb ) == noErr
1e7de8 ¤   ¤   ¤   ¤   && cpbIsFolder( &pb ))
3dc7a1 ¤   {
6eb331 ¤   ¤   publicKeyFileSpec.vRefNum ¤ = pb.dirInfo.ioVRefNum;
bc393d ¤   ¤   publicKeyFileSpec.parID ¤   = pb.dirInfo.ioDrDirID;
aa1b52 ¤   ¤
13d175 ¤   ¤   err = PGPGetPGPFileName( gPGPContext,
536bd7 ¤   ¤   ¤   ¤   ¤   kPGPFileSelector_PublicKeys,
ce1c52 ¤   ¤   ¤   ¤   ¤   publicKeyFileSpec.name );
0e9832 ¤   ¤   pgpAssertNoErr( err );
921b52 ¤   ¤
555aae ¤   ¤   privateKeyFileSpec.vRefNum ¤= pb.dirInfo.ioVRefNum;
470e40 ¤   ¤   privateKeyFileSpec.parID ¤  = pb.dirInfo.ioDrDirID;
2a1b52 ¤   ¤
45d175 ¤   ¤   err = PGPGetPGPFileName( gPGPContext,
8c75b7 ¤   ¤   ¤   ¤   ¤   kPGPFileSelector_PrivateKeys,·
1eee4b ¤   ¤   ¤   ¤   ¤   privateKeyFileSpec.name );
eb9832 ¤   ¤   pgpAssertNoErr( err );
889371 ¤   }
4a0e24 ¤   else
75c7a1 ¤   {
03f1ed ¤   ¤   err = PGPGetPGPFileDefaultFSSpec( gPGPContext,
a848de ¤   ¤   ¤   ¤   ¤   kPGPFileSelector_PublicKeys, &publicKeyFileSpec );
9d9832 ¤   ¤   pgpAssertNoErr( err );
ebaf5a
f51956 ¤   ¤   err = PGPGetPGPFileDefaultFSSpec( gPGPContext,·
5e6e72 ¤   ¤   ¤   ¤   ¤   kPGPFileSelector_PrivateKeys,
ad77e1 ¤   ¤   ¤   ¤   ¤   &privateKeyFileSpec );
889832 ¤   ¤   pgpAssertNoErr( err );
519371 ¤   }
9967c5 ¤
549adc ¤   err = PGPSetPGPFileFSSpec( gPGPContext, kPGPFileSelector_PublicKeys,
180aa3 ¤   ¤   ¤   ¤   &publicKeyFileSpec );
c98c1a ¤   pgpAssertNoErr( err );
9faf5a
d0d050 ¤   err = PGPSetPGPFileFSSpec( gPGPContext, kPGPFileSelector_PrivateKeys,
4f79ad ¤   ¤   ¤   ¤   &privateKeyFileSpec );
--555a 0012713d47d401201bb Page 24 of CPGPKeys.cp
b88c1a ¤   pgpAssertNoErr( err );
11efe6 }
27af5a
--1ce9 00096ee5a73401201bc Page 1 of CPGPKeys.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
37af5a
754bcc ¤   $Id: CPGPKeys.h,v 1.44.8.1 1998/11/12 03:08:09 heller Exp $
5bf7f7 ____________________________________________________________________________*/
437b7d #pragma once
82af5a
4eea2f #include <LBroadcaster.h>
2ecf7d #include <LDocApplication.h>
a80a93 #include <LPeriodical.h>
eef0a0 #include <LGADialog.h>
bcd807 #include <LModelDirector.h>
2296c2 #include <LMenuBar.h>
ccda57 //#include <Navigation.h>
7aaf5a
74a076 #include "pgpKeys.h"
e6ec82 #include "pgpTLS.h"
f36773 #include "pgpMemoryMgr.h"
724720 #include "pflPrefTypes.h"
ceeb5b #include "pgpKeyServer.h"
94af5a
356044 class CKeyWindow;
762ed9 class CKeyView;
3d1b02 class CSearchWindow;
4b215a class CGroupsWindow;
4ead73 class LGADialogBox;
c0af5a
bd3abb extern ResIDT¤  ¤   ¤   ¤   gApplicationResFile;
f9d77f extern FSSpec¤  ¤   ¤   ¤   gApplicationFSSpec;
a3a4ee extern PGPContextRef¤   ¤   gPGPContext;
8cf2e4 extern PGPMemoryMgrRef¤ ¤   gPGPMemoryMgr;
7a60e9 extern PGPtlsContextRef¤¤   gTLSContext;
db821f extern PGPPrefRef¤  ¤   ¤   gPrefRef;
745b70 extern PGPPrefRef¤  ¤   ¤   gAdminPrefRef;
4cc37e extern Boolean¤ ¤   ¤   ¤   gServerCallsPresent;
645ee8 extern PGPBoolean¤  ¤   ¤   gIsAdminConfigured;
1f4b1f extern FSSpec¤  ¤   ¤   ¤   gAppFSSpec;
57af5a
deab71 const ResIDT¤   ¤   ¤   ¤   kSubstituteHelpMenuID¤  =¤  8322;
e9af5a
9ff989 enum¤   {
0952bd ¤   ¤   ¤   kAlgorithmStringsID¤¤   ¤   = 1012,
9d7564 ¤   ¤   ¤   kIDEAString¤¤   ¤   ¤   ¤   = 1,
cbe0ea ¤   ¤   ¤   kTripleDESString¤   ¤   ¤   = 2,
651e0a ¤   ¤   ¤   kCASTString¤¤   ¤   ¤   ¤   = 3
f4a105 ¤   ¤   };
45af5a
23f989 enum¤   {
b3c423 ¤   ¤   ¤   kMiscStringsID¤ ¤   ¤   ¤   = 1006,
971305 ¤   ¤   ¤   kPGPKeyringsFolderStringID¤ = 1
6da105 ¤   ¤   };
4b1b52 ¤   ¤
ef5be9 #define CKERR¤  ¤   ¤   if( IsPGPError( err ) ) goto done¤
10af5a
4e7bca #define kPGPMacFileCreator_SplitKey¤¤   ¤   ¤   'pgSK'
deaf5a
25af5a
3c00c0 class CPGPKeys¤ :¤  public LDocApplication,
294ce3 ¤   ¤   ¤   ¤   ¤   public LPeriodical,
d2b98b ¤   ¤   ¤   ¤   ¤   public LListener,
445f4a ¤   ¤   ¤   ¤   ¤   public LBroadcaster
dcbb36 {
9c5ed4 public:
ca68b8 ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys( void );¤  ¤
e0b3b0 ¤   virtual ¤   ¤   ¤   ~CPGPKeys( void );¤ ¤
7867c5 ¤
007285 ¤   ¤   // this overriding function performs application functions
961b52 ¤   ¤
--3fcf 0006bcc5896401201bc Page 2 of CPGPKeys.h
69c3bf ¤   virtual Boolean¤¤   ObeyCommand(CommandT inCommand, void* ioParam);¤
8bbc5a ¤   virtual void¤   ¤   MakeMenuBar();
a92fd1 ¤   virtual void¤   ¤   MakeModelDirector();
f21d23 ¤   virtual void¤   ¤   ShowAboutBox();
cb4ca8 ¤   virtual void¤   ¤   SpendTime(const EventRecord &/*inMacEvent*/);
3567c5 ¤
4aaf7a ¤   ¤   // this overriding function returns the status of menu items
701b52 ¤   ¤
5d48a0 ¤   virtual void¤   ¤   FindCommandStatus(CommandT inCommand,
460bef ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
c640c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName);
a22d7b ¤   virtual void¤   ¤   HandleAppleEvent( const AppleEvent &inAppleEvent,
71ee1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   AppleEvent &outAEReply, AEDesc &outResult,
90bbde ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32 inAENumber );
a867f7 ¤   virtual void¤   ¤   OpenDocument(FSSpec *inMacFSSpec);
a48e54 ¤   virtual void¤   ¤   ListenToMessage(¤   MessageT¤   inMessage,
ace5d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void¤   ¤   *ioParam);
8aaf5a
1caf5a
b8515d ¤   PGPKeyListRef¤  ¤   GetKeyList();
66fd80 ¤   void¤   ¤   ¤   ¤   SetKeyList(PGPKeyListRef keyList);
33635b ¤   PGPKeySetRef¤   ¤   GetKeySet();
592b49 ¤   CKeyView¤   ¤   ¤   *GetDefaultKeyView()¤   {¤  return mDefaultKeysView;}
5b9e2e ¤   Boolean¤¤   ¤   ¤   IsKeyringWritable()¤{¤  return mWritableKeyring;¤   }
f1744e ¤   void¤   ¤   ¤   ¤   InvalidateCaches();
2167c5 ¤
eb42a6 ¤   PGPError¤   ¤   ¤   GetMinimumRandomData();
691b52 ¤   ¤
ca43f7 ¤   inline ¤static¤ CPGPKeys¤   *TheApp( void );
b067c5 ¤
c66c12 ¤   void¤   ¤   ¤   ¤   CreatedKey( void );
b7c711 ¤   void¤   ¤   ¤   ¤   ResetKeyDB();
8a49f9 ¤   void¤   ¤   ¤   ¤   CommitDefaultKeyrings();
2067c5 ¤
2c2ff5 #if PGP_FREEWARE
6bf8db ¤   void¤   ¤   ¤   ¤   ShowFreewareUpgradeDialog(Boolean skipDateCheck);
717454 #endif
ae67c5 ¤
74a2d3 protected:
ef35af ¤   void¤   ¤   ¤   ¤   ¤   ShowSplashScreen();
0d9246 ¤   void¤   ¤   ¤   ¤   ¤   EndSplashScreen();
945c75 ¤   void¤   ¤   ¤   ¤   ¤   MakeLicenseStr(Str255 outLicenseStr);
8571cc ¤   short¤  ¤   ¤   ¤   ¤   AskMakeNewKeyFiles();
e5c28d ¤   void¤   ¤   ¤   ¤   ¤   ServerGroupUpdate(¤ CommandT¤   inCommand¤  );
b9af5a
080e3e ¤   static¤ CPGPKeys¤   ¤   *sTheApp;
ea67c5 ¤
4a7d20 ¤   PGPKeySetRef¤   ¤   ¤   mKeySet;
bfe6cb ¤   PGPKeyListRef¤  ¤   ¤   mKeyList;
88cdae ¤   CKeyWindow¤ ¤   ¤   ¤   *mKeyWindow;
f80cce ¤   CKeyView¤   ¤   ¤   ¤   *mDefaultKeysView;
2d80e8 ¤   CSearchWindow¤  ¤   ¤   *mSearchWindow;
5a18ad ¤   CGroupsWindow¤  ¤   ¤   *mGroupsWindow;
1a80ab ¤   LGADialog¤  ¤   ¤   ¤   *mSplashScreen;
407f38 ¤   ulong¤  ¤   ¤   ¤   ¤   mSplashDisplayTime;
3c7d55 ¤   LModelDirector¤ ¤   ¤   *mModelDirector;
13209e ¤   LMenuBar¤   ¤   ¤   ¤   *mMenuBar;
0e6ac7 ¤   Int16¤  ¤   ¤   ¤   ¤   mHelpMenuRegisterItemNumber;
0894d2 ¤   Boolean¤¤   ¤   ¤   ¤   mCreatedKey,
72e33c ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCheckedLicense,
f0b17d ¤   ¤   ¤   ¤   ¤   ¤   ¤   mWritableKeyring,
49297f ¤   ¤   ¤   ¤   ¤   ¤   ¤   mSearching,
d24ada ¤   ¤   ¤   ¤   ¤   ¤   ¤   mAppStarted;
6067c5 ¤
127dbd ¤   Point¤  ¤   ¤   ¤   ¤   mLastMouseLoc;
57af5a
4f7c54 ¤   PGPKeyServerThreadStorageRef¤   mPreviousStorage;
1caf5a
5a67c5 ¤
56712c ¤   virtual void¤   ¤   StartUp();¤ ¤   // overriding startup functions
1ac8ad ¤   ¤   ¤   void¤   ¤   CleanUpPPLeaks( void );
6b4411 ¤   ¤   ¤   Boolean¤¤   TryingToQuit( void );
--e1dd 0019099efd7401201bc Page 3 of CPGPKeys.h
b10cfa ¤   ¤   ¤   void¤   ¤   ResetDefaultKeyringsPath(void);
af82f7 };
45af5a
2a5b4c const ResIDT¤   kMaxMenuID¤ ¤   ¤   ¤   ·¤  = 500;
02af5a
a8769e const MessageT¤ cmd_CollapseAll¤¤   ¤   ¤   = 1101;¤
0c9705 const MessageT¤ cmd_ExpandAll¤  ¤   ¤   ¤   = 1102;¤
97a736 const MessageT¤ cmd_Sign1¤  ¤   ¤   ¤   ¤   = 1201;¤
6c38cd const MessageT¤ cmd_AddName¤¤   ¤   ¤   ¤   = 1202;¤
1a70f4 const MessageT¤ cmd_SetDefault¤ ¤   ¤   ¤   = 1203;¤
2bf8ab const MessageT¤ cmd_NewKey¤ ¤   ¤   ¤   ¤   = 1204;¤
e449e3 const MessageT¤ cmd_Info¤   ¤   ¤   ¤   ¤   = 1205;¤
2a9358 const MessageT¤ cmd_Revoke¤ ¤   ¤   ¤   ¤   = 1206;¤
cd48f7 const MessageT¤ cmd_ImportKeys¤ ¤   ¤   ¤   = 1207;
038ed1 const MessageT¤ cmd_ExportKeys¤ ¤   ¤   ¤   = 1208;
7c58ca const MessageT¤ cmd_ChangePassphrase¤   ¤   = 1209;
8d0edf const MessageT¤ cmd_OptionRevoke¤   ¤   ¤   = 1210;
98fcee const MessageT¤ cmd_KSGetKeys¤  ¤   ¤   ¤   = 1212;
64a3b8 const MessageT¤ cmd_KSSendKeys¤ ¤   ¤   ¤   = 1213;
de4868 const MessageT¤ cmd_Search¤ ¤   ¤   ¤   ¤   = 1214;
c5b701 const MessageT¤ cmd_ViewValidity¤   ¤   ¤   = 1215;
cba846 const MessageT¤ cmd_ViewTrust¤  ¤   ¤   ¤   = 1216;
c45d7c const MessageT¤ cmd_ViewSize¤   ¤   ¤   ¤   = 1217;
0080e6 const MessageT¤ cmd_ViewKeyID¤  ¤   ¤   ¤   = 1218;
2e5e9e const MessageT¤ cmd_ViewCreationDate¤   ¤   = 1219;
116aad const MessageT¤ cmd_ViewExpirationDate¤ ¤   = 1220;
6e9e6c const MessageT¤ cmd_ViewMRK¤¤   ¤   ¤   ¤   = 1221;
8c1e68 const MessageT¤ cmd_ViewDescription¤¤   ¤   = 1222;
412848 const MessageT¤ cmd_ShowGroups¤ ¤   ¤   ¤   = 1223;
065ef5 const MessageT¤ cmd_NewGroup¤   ¤   ¤   ¤   = 1224;
339d68 const MessageT¤ cmd_KSSendKeyToDomain¤  ¤   = 1225;
957931 const MessageT¤ cmd_SplitKey¤   ¤   ¤   ¤   = 1226;
653453 const MessageT¤ cmd_SendShareFile¤  ¤   ¤   = 1227;
32410d const MessageT¤ cmd_ReverifySignatures¤ ¤   = 1228;
96b0f4 const MessageT¤ cmd_EnableKeys¤ ¤   ¤   ¤   = 1229;
2d27cb const MessageT¤ cmd_DisableKeys¤¤   ¤   ¤   = 1230;
9418ae const MessageT¤ cmd_UpdateIntroducers¤  ¤   = 1231;
fc7306 const MessageT¤ cmd_AddToKey¤   ¤   ¤   ¤   = 1232;¤
5a7e5c const MessageT¤ cmd_AddPhotoUserID¤ ¤   ¤   = 1233;
ea7096 const MessageT¤ cmd_ServerDisable¤  ¤   ¤   = 1234;
6b8e69 const MessageT¤ cmd_ServerDelete¤   ¤   ¤   = 1235;
3f7312 const MessageT¤ cmd_UpdateGroupLists¤   ¤   = 1236;
667c74 const MessageT¤ cmd_SendGroupLists¤ ¤   ¤   = 1237;
2295c8 const MessageT¤ cmd_AddRevoker¤ ¤   ¤   ¤   = 1238;
52e185 const MessageT¤ cmd_Toolbar¤¤   ¤   ¤   ¤   = 1239;
e61a98 const MessageT¤ cmd_ImportGroups¤   ¤   ¤   = 1240;
fa23da const MessageT¤ cmd_GroupProperties¤¤   ¤   = 1241;
fb17f7 const MessageT¤ cmd_OptionClear¤¤   ¤   ¤   = 50;
f6af5a
378ba2 ¤   CPGPKeys *
16b6e9 CPGPKeys::TheApp()
34bb36 {
0bd5d1 ¤   pgpAssertAddrValid(sTheApp, CPGPKeys);
45a089 ¤   return sTheApp;
45efe6 }
26af5a
52bfe0 void ReportPGPError(PGPError err);
57f29c /*pascal void PKNavEventProc(
55b925 ¤   NavEventCallbackMessage¤callbackSelector,
7a3f9d ¤   NavCBRecPtr¤¤   ¤   ¤   callbackParms,
2058db ¤   NavCallBackUserData¤¤   callbackUD );
a37fe0 */
53e56f Boolean CustomGetFileWithShowAll(
a8f4ee ¤   short¤  ¤   ¤   ¤   numTypes,
dd6124 ¤   SFTypeList¤ ¤   ¤   typeList,
6a48fa ¤   FSSpec¤ ¤   ¤   ¤   *fsSpec );
e1af5a
03f8ab #define min(x,y) (((x)<(y)) ? (x) : (y))
4caf5a
26c81d #define max(x,y) (((x)>(y)) ? (x) : (y))
90af5a
--71c9 00095567bcf401201bd Page 1 of CPhotoUserID.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
387d59 ¤   $Id: CPhotoUserID.cp,v 1.11.8.1 1998/11/12 03:08:10 heller Exp $
a0f7f7 ____________________________________________________________________________*/
04af5a
601ef3 #include <Folders.h>
48dc1d #include <Scrap.h>
bbaf5a
80a13b #include <LDragTask.h>
e2dd56 #include <PP_Messages.h>
a87e6d #include <UDrawingState.h>
3fe8ae #include <UDrawingUtils.h>
e88f92 #include <UGAColorRamp.h>
a8ffe3 #include <UGraphicUtils.h>
08af5a
2276b7 #include "MacErrors.h"
cbbbf4 #include "MacFiles.h"
690e9a #include "MacQuickDraw.h"
4c6277 #include "PGPMacMemory.h"
2f3d4b #include "pgpEndianConversion.h"
2e08c5 #include "pgpJPEG.h"
12d379 #include "pgpClientShared.h"
f54919 #include "pgpUtilities.h"
40af5a
dc4a92 #include "CPhotoUserID.h"
d0b8cb #include "CPGPKeys.h"
b2af5a
428e26 #define¤kMaxPhotoIDWidth¤   120
a56ee5 #define kMaxPhotoIDHeight¤  144
dcaf5a
5dd55e const ResIDT¤   kInvalidPhotoIDResID ¤  ¤   ¤   = 2102;
35d5a3 const ResIDT¤   kRevokedPhotoIDResID ¤  ¤   ¤   = 2104;
b442d0 const ResIDT¤   kExpiredPhotoIDResID ¤  ¤   ¤   = 2106;
22af5a
901af2 CPhotoUserID::CPhotoUserID(LStream *inStream) :
9b276c ¤   ¤   LPane( inStream ),
501dd9 ¤   ¤   LDragAndDrop( GetMacPort(), this )
76bb36 {
51250c ¤   mLocked = FALSE;
03b559 ¤   mGWorld¤= NULL;
8bc269 ¤   mStatus¤= kPGPPhotoUserIDStatus_Normal;
cdefe6 }
baaf5a
e59eb2 CPhotoUserID::~CPhotoUserID(void)
3abb36 {
b084b3 ¤   FreeGWorld();
bdefe6 }
38af5a
045a94 ¤   Point
99a388 CPhotoUserID::CalcScaledImageSize(Point imageSize)
cdbb36 {
96fc7a ¤   Point¤  scaledSize;
b791d4 ¤   float¤  scaleFactor;
ae67c5 ¤
d53d16 ¤   scaledSize = imageSize;
4967c5 ¤
24b525 ¤   // Compute scaled picture·
66942a ¤   if( scaledSize.h > kMaxPhotoIDWidth )
09c7a1 ¤   {
9a574b ¤   ¤   scaleFactor = (float) kMaxPhotoIDWidth / (float) scaledSize.h;
351b52 ¤   ¤
4ff75e ¤   ¤   scaledSize.h = kMaxPhotoIDWidth;
79de5d ¤   ¤   scaledSize.v = scaledSize.v * scaleFactor;
409371 ¤   }
6faf5a
a5a4eb ¤   if( scaledSize.v > kMaxPhotoIDHeight )
fdc7a1 ¤   {
9b478b ¤   ¤   scaleFactor = (float) kMaxPhotoIDHeight / (float) scaledSize.v;
9f1b52 ¤   ¤
95ae0f ¤   ¤   scaledSize.v = kMaxPhotoIDHeight;
--238b 000927fed14401201bd Page 2 of CPhotoUserID.cp
0be0cf ¤   ¤   scaledSize.h = scaledSize.h * scaleFactor;
ac9371 ¤   }
e367c5 ¤
a727cc ¤   return( scaledSize );
12efe6 }
7aaf5a
fe85ea ¤   OSStatus
df82e1 CPhotoUserID::AllocateGWorld(Point imageSize)
18bb36 {
c86792 ¤   OSStatus¤   err = noErr;
5b67c5 ¤
e93668 ¤   if( IsntNull( mGWorld ) )
77c7a1 ¤   {
b67cee ¤   ¤   if( mGWorldSize.v != imageSize.v ||
adf169 ¤   ¤   ¤   mGWorldSize.h != imageSize.h )
a45b34 ¤   ¤   {
f1799c ¤   ¤   ¤   FreeGWorld();
1c0fe4 ¤   ¤   }
329371 ¤   }
6667c5 ¤
b8f8e5 ¤   if( IsNull( mGWorld ) )
88c7a1 ¤   {
0f848d ¤   ¤   Rect¤   imageRect;
6e1b52 ¤   ¤
e932e6 ¤   ¤   SetRect( &imageRect, 0, 0, imageSize.h, imageSize.v );
f41b52 ¤   ¤
64aaea ¤   ¤   err = NewGWorld( &mGWorld, 32, &imageRect, NULL, NULL, useTempMem );
9ada5e ¤   ¤   if( IsntErr( err ) )
a65b34 ¤   ¤   {
c9b2d4 ¤   ¤   ¤   mGWorldSize = imageSize;
b40fe4 ¤   ¤   }
1f9371 ¤   }
0d67c5 ¤
72753c ¤   SetUpdateCommandStatus( TRUE );
e967c5 ¤
9cdeb7 ¤   return( err );
adefe6 }
f2af5a
3e6d52 ¤   void
73f57e CPhotoUserID::FreeGWorld(void)
40bb36 {
233668 ¤   if( IsntNull( mGWorld ) )
91c7a1 ¤   {
8dc906 ¤   ¤   DisposeGWorld( mGWorld );
13349f ¤   ¤   mGWorld = NULL;
fe1b52 ¤   ¤
d2b069 ¤   ¤   SetUpdateCommandStatus( TRUE );
9e9371 ¤   }
d0efe6 }
87af5a
4a6d52 ¤   void
4395f9 CPhotoUserID::FindCommandStatus(
efea24 ¤   CommandT¤   inCommand,
09a472 ¤   Boolean¤¤   &outEnabled,
573a4d ¤   Boolean¤¤   &outUsesMark,
8a5dc0 ¤   Char16¤ ¤   &outMark,
0bd894 ¤   Str255¤ ¤   outName)
63bb36 {
cf0617 ¤   switch( inCommand )
98c7a1 ¤   {
c88fe9 ¤   ¤   case cmd_Copy:
6d143a ¤   ¤   ¤   outEnabled = HavePicture();
07cdcb ¤   ¤   ¤   break;
fcaf5a
0f1b1c ¤   ¤   case cmd_Clear:
0f4280 ¤   ¤   ¤   outEnabled = HavePicture() && ! IsLocked();
45cdcb ¤   ¤   ¤   break;
b487c7 ¤   ¤   ¤
7918da ¤   ¤   case cmd_Paste:
fb5b34 ¤   ¤   {
f4d920 ¤   ¤   ¤   long¤   offset;
9287c7 ¤   ¤   ¤
--205a 0002e697d32401201bd Page 3 of CPhotoUserID.cp
272f33 ¤   ¤   ¤   outEnabled = ( GetScrap( NULL, 'PICT', &offset ) >= 0 &&
5e05fa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ! IsLocked() );
f1cdcb ¤   ¤   ¤   break;
9c0fe4 ¤   ¤   }
e21b52 ¤   ¤
1b9ae3 ¤   ¤   default:
ae3fcf ¤   ¤   ¤   LCommander::FindCommandStatus( inCommand, outEnabled,
43364d ¤   ¤   ¤   ¤   ¤   outUsesMark, outMark, outName );
a0cdcb ¤   ¤   ¤   break;
8c9371 ¤   }
11efe6 }
c7af5a
857e69 ¤   Boolean
ca00ef CPhotoUserID::ObeyCommand(
dfea24 ¤   CommandT¤   inCommand,
46ed36 ¤   void*¤  ¤   ioParam)
4fbb36 {
e749ae ¤   Boolean¤¤   cmdHandled = FALSE;
a067c5 ¤
500617 ¤   switch( inCommand )
22c7a1 ¤   {
8618da ¤   ¤   case cmd_Paste:
b75b34 ¤   ¤   {
3c660e ¤   ¤   ¤   PicHandle¤  picture;
f2da19 ¤   ¤   ¤   long¤   ¤   offset;
2f87c7 ¤   ¤   ¤
c75ef6 ¤   ¤   ¤   picture = (PicHandle) pgpNewHandle( 0, kMacMemory_PreferTempMem |
dedc2f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap );
4e87c7 ¤   ¤   ¤
8f6cd3 ¤   ¤   ¤   if( GetScrap( (Handle) picture, 'PICT', &offset ) > 0 )
9af776 ¤   ¤   ¤   {
75e298 ¤   ¤   ¤   ¤   OSStatus¤   err;
cc2b85 ¤   ¤   ¤   ¤
61d30f ¤   ¤   ¤   ¤   err = SetPictureData( picture, TRUE );
1655be ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
03a3a6 ¤   ¤   ¤   }
e587c7 ¤   ¤   ¤
dd9870 ¤   ¤   ¤   pgpDisposeHandle( (Handle) picture );
0387c7 ¤   ¤   ¤
68d5ed ¤   ¤   ¤   cmdHandled = TRUE;
00cdcb ¤   ¤   ¤   break;
730fe4 ¤   ¤   }
f11b52 ¤   ¤
358fe9 ¤   ¤   case cmd_Copy:
0d5b34 ¤   ¤   {
edd845 ¤   ¤   ¤   if( HavePicture() )
8df776 ¤   ¤   ¤   {
1d5b66 ¤   ¤   ¤   ¤   PicHandle¤  picture;
02e298 ¤   ¤   ¤   ¤   OSStatus¤   err;
0b2b85 ¤   ¤   ¤   ¤
28a26c ¤   ¤   ¤   ¤   err = GetPictureData( &picture );
a55c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
9a72c3 ¤   ¤   ¤   ¤   {
118ca3 ¤   ¤   ¤   ¤   ¤   HLock( (Handle) picture );
46ae30 ¤   ¤   ¤   ¤   ¤
4aa23b ¤   ¤   ¤   ¤   ¤   ZeroScrap();
9f6a8d ¤   ¤   ¤   ¤   ¤   err = PutScrap( GetHandleSize( (Handle) picture ),
cfaa52 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   'PICT', *picture );
485bf2 ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
55ae30 ¤   ¤   ¤   ¤   ¤
36f4a0 ¤   ¤   ¤   ¤   ¤   DisposeHandle( (Handle) picture );
622613 ¤   ¤   ¤   ¤   }
bd2b85 ¤   ¤   ¤   ¤
0c55be ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
e8a3a6 ¤   ¤   ¤   }
b287c7 ¤   ¤   ¤
35d5ed ¤   ¤   ¤   cmdHandled = TRUE;
46cdcb ¤   ¤   ¤   break;
2b0fe4 ¤   ¤   }
441b52 ¤   ¤
681b1c ¤   ¤   case cmd_Clear:
2e95d6 ¤   ¤   ¤   ClearPicture();
--1718 0006ccb0b74401201bd Page 4 of CPhotoUserID.cp
5ad5ed ¤   ¤   ¤   cmdHandled = TRUE;
3ccdcb ¤   ¤   ¤   break;
ec87c7 ¤   ¤   ¤
9d593e ¤   ¤   case msg_TabSelect:
70d5ed ¤   ¤   ¤   cmdHandled = TRUE;
98cdcb ¤   ¤   ¤   break;
c887c7 ¤   ¤   ¤
359ae3 ¤   ¤   default:
68c10e ¤   ¤   ¤   LCommander::ObeyCommand( inCommand, ioParam );
6bcdcb ¤   ¤   ¤   break;
0f9371 ¤   }
d267c5 ¤
1a51a4 ¤   return cmdHandled;
72efe6 }
faaf5a
5b6d52 ¤   void
c02a8f CPhotoUserID::ClearPicture(void)
e9bb36 {
5684b3 ¤   FreeGWorld();
e74fc9 ¤   Refresh();
7aefe6 }
bd67c5 ¤
607e69 ¤   Boolean
1badee CPhotoUserID::ItemIsAcceptable(
9a9701 ¤   DragReference¤  inDragRef,
fffc1d ¤   ItemReference¤  inItemRef)
03bb36 {
ea656c ¤   Boolean¤¤   isAcceptable = FALSE;
7e67c5 ¤
75f356 ¤   if( ! IsLocked() )
8dc7a1 ¤   {
a21704 ¤   ¤   ushort¤ ¤   numFlavors;
b63277 ¤   ¤   OSStatus¤   status;
6aaf5a
734878 ¤   ¤   status = CountDragItemFlavors(inDragRef, inItemRef, &numFlavors);
4de73a ¤   ¤   if(IsntErr(status))
1c5b34 ¤   ¤   {
17e06e ¤   ¤   ¤   ushort flavorIndex;
aa87c7 ¤   ¤   ¤
5b7847 ¤   ¤   ¤   for( flavorIndex = 1; flavorIndex <= numFlavors; flavorIndex++ )
e6f776 ¤   ¤   ¤   {
f25fca ¤   ¤   ¤   ¤   FlavorType¤ flavorType;
aa2b85 ¤   ¤   ¤   ¤
5e1e23 ¤   ¤   ¤   ¤   status = GetFlavorType(inDragRef, inItemRef, flavorIndex,
061aec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorType);
36c198 ¤   ¤   ¤   ¤   if(IsntErr(status))
8272c3 ¤   ¤   ¤   ¤   {
6aab90 ¤   ¤   ¤   ¤   ¤   if(flavorType == 'PICT')
494859 ¤   ¤   ¤   ¤   ¤   {
154059 ¤   ¤   ¤   ¤   ¤   ¤   isAcceptable = TRUE;
c81c89 ¤   ¤   ¤   ¤   ¤   }
ef7964 ¤   ¤   ¤   ¤   ¤   else if(flavorType == flavorTypeHFS)
e44859 ¤   ¤   ¤   ¤   ¤   {
5d5125 ¤   ¤   ¤   ¤   ¤   ¤   HFSFlavor¤  flavorData;
f3e78e ¤   ¤   ¤   ¤   ¤   ¤   ByteCount¤  dataSize;
2c16d8 ¤   ¤   ¤   ¤   ¤   ¤   ByteCount¤  dataOffset;
1094aa ¤   ¤   ¤   ¤   ¤   ¤
364206 ¤   ¤   ¤   ¤   ¤   ¤   dataSize ¤  = sizeof(flavorData);
d3a0be ¤   ¤   ¤   ¤   ¤   ¤   dataOffset¤ = 0;
c094aa ¤   ¤   ¤   ¤   ¤   ¤
a4700a ¤   ¤   ¤   ¤   ¤   ¤   status = GetFlavorData(inDragRef, inItemRef,
f07b49 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, &flavorData,
55adc0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Int32 *) &dataSize,
805b39 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dataOffset);
b18cab ¤   ¤   ¤   ¤   ¤   ¤   if(IsntErr(status))
8d8fec ¤   ¤   ¤   ¤   ¤   ¤   {
00048c ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Check for dragged folders and/or disks
27531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
733a02 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(flavorData.fileType == 'PICT')
8306b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
b52846 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   isAcceptable = true;
6c5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
--7a00 000f57330f7401201bd Page 5 of CPhotoUserID.cp
0ddb3c ¤   ¤   ¤   ¤   ¤   ¤   }
fc1c89 ¤   ¤   ¤   ¤   ¤   }
96ae30 ¤   ¤   ¤   ¤   ¤
13aa23 ¤   ¤   ¤   ¤   ¤   if(isAcceptable)
9400eb ¤   ¤   ¤   ¤   ¤   ¤   break;
d62613 ¤   ¤   ¤   ¤   }
90a3a6 ¤   ¤   ¤   }
410fe4 ¤   ¤   }
599371 ¤   }
e667c5 ¤
5f7b24 ¤   return(isAcceptable);
17efe6 }
8aaf5a
0b6d52 ¤   void
01761f CPhotoUserID::DoDropAreaHilite(
983270 ¤   DragReference ¤ inDragRef,
4d44bb ¤   Boolean¤¤   ¤   showHilite)
d1bb36 {
8e53cc ¤   RGBColor¤   ¤   tempColor;
ff5e14 ¤   Rect¤   ¤   ¤   dropRect;
462784 ¤   StColorState¤   saveColorState;
d567c5 ¤
c6b1a6 ¤   tempColor = UGAColorRamp::GetBlackColor();
8275f0 ¤   RGBForeColor( &tempColor );
23af5a
42a622 ¤   tempColor = UGAColorRamp::GetWhiteColor();
82a506 ¤   RGBBackColor( &tempColor );
17af5a
c9b8ad ¤   CalcLocalFrameRect( dropRect );
f13f44 ¤   InsetRect( &dropRect, 1, 1 );
46af5a
37edd9 ¤   StRegion¤   dropRgn( dropRect );
d667c5 ¤
6951d2 ¤   if( showHilite )
7dc7a1 ¤   {
2e1cc6 ¤   ¤   ShowDragHilite( inDragRef, dropRgn, TRUE );
e29371 ¤   }
670e24 ¤   else
3fc7a1 ¤   {
0a7ce8 ¤   ¤   HideDragHilite( inDragRef );
ff9371 ¤   }
baefe6 }
58af5a
5c6d52 ¤   void
02d48b CPhotoUserID::HiliteDropArea(DragReference inDragRef)
18bb36 {
3e2852 ¤   DoDropAreaHilite( inDragRef, TRUE );
30efe6 }
4aaf5a
e26d52 ¤   void
7609af CPhotoUserID::UnhiliteDropArea(DragReference inDragRef)
9bbb36 {
39244a ¤   DoDropAreaHilite( inDragRef, FALSE );
0defe6 }
1267c5 ¤
b985ea ¤   OSStatus
0d293a CPhotoUserID::GetPictureData(PicHandle *picturePtr)
bfbb36 {
5217ff ¤   OSStatus¤   err¤¤   = noErr;
73a4dc ¤   PicHandle¤  picture = NULL;
f567c5 ¤
46837e ¤   if( HavePicture() )
c3c7a1 ¤   {
0d625e ¤   ¤   GWorldPtr¤  tempGWorld;
5c37bf ¤   ¤   Rect¤   ¤   imageRect;
f51b52 ¤   ¤
4807dc ¤   ¤   SetRect( &imageRect, 0, 0, mGWorldSize.h, mGWorldSize.v );
491b52 ¤   ¤
d867a2 ¤   ¤   err = NewGWorld( &tempGWorld, 32, &imageRect, NULL, NULL, useTempMem );
e4da5e ¤   ¤   if( IsntErr( err ) )
395b34 ¤   ¤   {
f5b293 ¤   ¤   ¤   CGrafPtr¤   ¤   savePort;
--9364 000655f7997401201bd Page 6 of CPhotoUserID.cp
9b4f5d ¤   ¤   ¤   GDHandle¤   ¤   saveDevice;
ce2469 ¤   ¤   ¤   OpenCPicParams¤ picParams;
1b87c7 ¤   ¤   ¤
c3616a ¤   ¤   ¤   GetGWorld( &savePort, &saveDevice );
f2d830 ¤   ¤   ¤   SetGWorld( tempGWorld, NULL );
8c87c7 ¤   ¤   ¤
dcc52d ¤   ¤   ¤   LockPixels( GetGWorldPixMap( tempGWorld ) );
0187c7 ¤   ¤   ¤
ed109c ¤   ¤   ¤   pgpClearMemory( &picParams, sizeof( picParams ) );
1b87c7 ¤   ¤   ¤
b4faa2 ¤   ¤   ¤   picParams.srcRect ¤ = imageRect;
6d6946 ¤   ¤   ¤   picParams.hRes¤ ¤   = 0x00480000;¤  // 72 DPI
1e46a0 ¤   ¤   ¤   picParams.vRes¤ ¤   = 0x00480000;¤  // 72 DPI
c0e4b5 ¤   ¤   ¤   picParams.version¤  = -2;
8187c7 ¤   ¤   ¤
2f3e62 ¤   ¤   ¤   picture = OpenCPicture( &picParams );
e1e9bc ¤   ¤   ¤   if( IsntNull( picture ) )
d9f776 ¤   ¤   ¤   {
c8e18a ¤   ¤   ¤   ¤   CopyBits( ¤ &((GrafPtr) mGWorld)->portBits,
660997 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &((GrafPtr) tempGWorld)->portBits,
751813 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &imageRect, &imageRect, srcCopy, NULL );
34ecf5 ¤   ¤   ¤   ¤   ClosePicture();
fba3a6 ¤   ¤   ¤   }
0f87c7 ¤   ¤   ¤
be4ec1 ¤   ¤   ¤   SetGWorld( savePort, saveDevice );
4287c7 ¤   ¤   ¤
1e8c02 ¤   ¤   ¤   UnlockPixels( GetGWorldPixMap( tempGWorld ) );
25f570 ¤   ¤   ¤   DisposeGWorld( tempGWorld );
5e0fe4 ¤   ¤   }
a49371 ¤   }
2b0e24 ¤   else
aac7a1 ¤   {
278c8d ¤   ¤   err = eofErr;
509371 ¤   }
2167c5 ¤
502ed5 ¤   *picturePtr = picture;
6667c5 ¤
e7deb7 ¤   return( err );
58efe6 }
d4af5a
cc85ea ¤   OSStatus
46d2fe CPhotoUserID::SetPictureData(
265664 ¤   PicHandle ¤ picture,
eb4cb5 ¤   Boolean¤¤   scaleToFit)
9fbb36 {
b46792 ¤   OSStatus¤   err = noErr;
10c1bf ¤   CGrafPtr¤   savePort;
117a5b ¤   GDHandle¤   saveDevice;
5c2397 ¤   Rect¤   ¤   imageRect;
bca10a ¤   Point¤  ¤   imageSize;
3067c5 ¤
bf354f ¤   GetGWorld( &savePort, &saveDevice );
be67c5 ¤
70148c ¤   // Image the picture into a GWorld.
12d2b3 ¤   imageRect = (**picture).picFrame;
8667c5 ¤
b4f0cc ¤   imageSize.h = UGraphicUtils::RectWidth( imageRect );
8e79ac ¤   imageSize.v = UGraphicUtils::RectHeight( imageRect );
af67c5 ¤
97f008 ¤   if( scaleToFit )
dd4a3e ¤   ¤   imageSize = CalcScaledImageSize( imageSize );
a767c5 ¤
b367cb ¤   err = AllocateGWorld( imageSize );
47ee03 ¤   if( IsntErr( err ) )
6258c8 ¤   {¤  ¤
da32e6 ¤   ¤   SetRect( &imageRect, 0, 0, imageSize.h, imageSize.v );
961b52 ¤   ¤
0bc9c8 ¤   ¤   SetGWorld( mGWorld, NULL );
506fda ¤   ¤   LockPixels( GetGWorldPixMap( mGWorld ) );
f7d68e ¤   ¤   DrawPicture( picture, &imageRect );
b51bf8 ¤   ¤   UnlockPixels( GetGWorldPixMap( mGWorld ) );
659371 ¤   }
--67a9 000db4a9c0a401201bd Page 7 of CPhotoUserID.cp
2a67c5 ¤
aad115 ¤   SetGWorld( savePort, saveDevice );
954fc9 ¤   Refresh();
93af5a
1cdeb7 ¤   return( err );
5aefe6 }
3aaf5a
7885ea ¤   OSStatus
af631a CPhotoUserID::AddPictureFromFile(const FSSpec *fileSpec)
d2bb36 {
27dc42 ¤   OSStatus¤   err;
194f27 ¤   CInfoPBRec¤ cpb;
b467c5 ¤
d49172 ¤   err = FSpGetCatInfo( fileSpec, &cpb );
d581f2 ¤   if( IsntErr( err ))
67c7a1 ¤   {
c96f79 ¤   ¤   short¤  fileRef;
e11b52 ¤   ¤
ab0a95 ¤   ¤   err = FSpOpenDF( fileSpec, fsRdPerm, &fileRef );
deda5e ¤   ¤   if( IsntErr( err ) )
265b34 ¤   ¤   {
0bdf46 ¤   ¤   ¤   long¤   fileSize;
d887c7 ¤   ¤   ¤
3af811 ¤   ¤   ¤   err = GetEOF( fileRef, &fileSize );
0a6108 ¤   ¤   ¤   if( IsntErr( err ) )
def776 ¤   ¤   ¤   {
f400bd ¤   ¤   ¤   ¤   if( fileSize > 512L )
9a72c3 ¤   ¤   ¤   ¤   {
68e5e1 ¤   ¤   ¤   ¤   ¤   err = SetFPos( fileRef, fsFromStart, 512L );
c6598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
774859 ¤   ¤   ¤   ¤   ¤   {
f65833 ¤   ¤   ¤   ¤   ¤   ¤   PicHandle¤  picture;
0f54f8 ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  bufferSize;
6794aa ¤   ¤   ¤   ¤   ¤   ¤
22765c ¤   ¤   ¤   ¤   ¤   ¤   bufferSize = fileSize - 512L;
6f94aa ¤   ¤   ¤   ¤   ¤   ¤
dd47ea ¤   ¤   ¤   ¤   ¤   ¤   picture = (PicHandle) pgpNewHandle( bufferSize,
13d34c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_PreferTempMem |
5041f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap );
c8ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
d8a3a9 ¤   ¤   ¤   ¤   ¤   ¤   if( IsntNull( picture ) )
9f8fec ¤   ¤   ¤   ¤   ¤   ¤   {
c5a74d ¤   ¤   ¤   ¤   ¤   ¤   ¤   long¤   count = bufferSize;
21531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
444536 ¤   ¤   ¤   ¤   ¤   ¤   ¤   HLock( (Handle) picture );
49531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
4dbbf3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = FSRead( fileRef, &count, *picture );
1c0da8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
5806b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
3c4aa6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = SetPictureData( picture, TRUE );
fd5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
46531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
336b1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDisposeHandle( (Handle) picture );
0bdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
3f7f8b ¤   ¤   ¤   ¤   ¤   ¤   else
708fec ¤   ¤   ¤   ¤   ¤   ¤   {
567e02 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = memFullErr;
badb3c ¤   ¤   ¤   ¤   ¤   ¤   }
ab1c89 ¤   ¤   ¤   ¤   ¤   }
c12613 ¤   ¤   ¤   ¤   }
defa07 ¤   ¤   ¤   ¤   else
2972c3 ¤   ¤   ¤   ¤   {
0bf564 ¤   ¤   ¤   ¤   ¤   err = eofErr;
db2613 ¤   ¤   ¤   ¤   }
f7a3a6 ¤   ¤   ¤   }
2a1b52 ¤   ¤
e601e0 ¤   ¤   ¤   FSClose( fileRef );
6e0fe4 ¤   ¤   }
7f9371 ¤   }
2767c5 ¤
81deb7 ¤   return( err );
dbefe6 }
--f3fc 000a0a8a63c401201bd Page 8 of CPhotoUserID.cp
e0af5a
2c6d52 ¤   void
f1ca2e CPhotoUserID::ReceiveDragItem(
9b9701 ¤   DragReference¤  inDragRef,
12c31d ¤   DragAttributes¤ inDragAttrs,
5b82a5 ¤   ItemReference¤  inItemRef,
ca22a2 ¤   Rect&¤  ¤   ¤   inItemBounds)
b8bb36 {
9053fd ¤   if( ( inDragAttrs & kDragInsideSenderWindow ) == 0 )
40c7a1 ¤   {
681704 ¤   ¤   ushort¤ ¤   numFlavors;
206d93 ¤   ¤   OSStatus¤   err;
d5af5a
19a942 ¤   ¤   err = CountDragItemFlavors(inDragRef, inItemRef, &numFlavors);
6ada5e ¤   ¤   if( IsntErr( err ) )
f75b34 ¤   ¤   {
00f7fd ¤   ¤   ¤   for( ushort flavorIndex = 1; flavorIndex <= numFlavors;
5a2577 ¤   ¤   ¤   ¤   ¤   ¤   flavorIndex++ )
cef776 ¤   ¤   ¤   {
185fca ¤   ¤   ¤   ¤   FlavorType¤ flavorType;
572b85 ¤   ¤   ¤   ¤
d11a8c ¤   ¤   ¤   ¤   err = GetFlavorType( inDragRef, inItemRef, flavorIndex,
3ee416 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorType );
415c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
c372c3 ¤   ¤   ¤   ¤   {
f588f8 ¤   ¤   ¤   ¤   ¤   if( flavorType == 'PICT' )
834859 ¤   ¤   ¤   ¤   ¤   {
216a21 ¤   ¤   ¤   ¤   ¤   ¤   Size¤   dataSize;
9294aa ¤   ¤   ¤   ¤   ¤   ¤
c880d2 ¤   ¤   ¤   ¤   ¤   ¤   err = GetFlavorDataSize( inDragRef, inItemRef,
96353e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, &dataSize );
595f35 ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
778fec ¤   ¤   ¤   ¤   ¤   ¤   {
a30aae ¤   ¤   ¤   ¤   ¤   ¤   ¤   PicHandle¤  picture;
d5531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
7a5935 ¤   ¤   ¤   ¤   ¤   ¤   ¤   picture = (PicHandle) pgpNewHandle( dataSize,
45d34c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_PreferTempMem |
1741f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap );
f70da8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntNull( picture ) )
7b06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
18420d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   HLock( (Handle) picture );
d8da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
c52d5a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = GetFlavorData( inDragRef, inItemRef,
034bcc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, *picture, &dataSize,
c9c3b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0 );
975eb3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
dd31b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
ae9a0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = SetPictureData( picture, TRUE );
c46560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
06da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
c27e3c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDisposeHandle( (Handle) picture );
bf5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
6cc4dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
bb06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
44313c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = memFullErr;
f15268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
f4db3c ¤   ¤   ¤   ¤   ¤   ¤   }
861c89 ¤   ¤   ¤   ¤   ¤   }
294bd6 ¤   ¤   ¤   ¤   ¤   else
fe4859 ¤   ¤   ¤   ¤   ¤   {
4e5125 ¤   ¤   ¤   ¤   ¤   ¤   HFSFlavor¤  flavorData;
eee78e ¤   ¤   ¤   ¤   ¤   ¤   ByteCount¤  dataSize;
7a94aa ¤   ¤   ¤   ¤   ¤   ¤
c7e9f6 ¤   ¤   ¤   ¤   ¤   ¤   dataSize = sizeof( flavorData );
8394aa ¤   ¤   ¤   ¤   ¤   ¤
42f563 ¤   ¤   ¤   ¤   ¤   ¤   err = GetFlavorData(inDragRef, inItemRef, flavorType,
533cfa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorData, (Int32 *) &dataSize, 0 );
af95b2 ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) && flavorData.fileType == 'PICT' )
318fec ¤   ¤   ¤   ¤   ¤   ¤   {
7f5190 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = AddPictureFromFile( &flavorData.fileSpec );
4d459f ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
a006b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
--1fd6 00002bb612c401201bd Page 9 of CPhotoUserID.cp
ad6332 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Cannot display a dialog from the drag
c25d1c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // manager
b096cf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
ac5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
33db3c ¤   ¤   ¤   ¤   ¤   ¤   }
441c89 ¤   ¤   ¤   ¤   ¤   }
b22613 ¤   ¤   ¤   ¤   }
50a3a6 ¤   ¤   ¤   }
ba0fe4 ¤   ¤   }
7a9371 ¤   }
e9efe6 }
0daf5a
7c6d52 ¤   void
ca7e0a CPhotoUserID::DrawPhoto(
adda7d ¤   const Rect ¤*photoRect,
1917bf ¤   SInt16¤ ¤   inBitDepth)
debb36 {
0dc0aa ¤   StColorState¤   saveColors;
7b3e13 ¤   ResIDT¤ ¤   ¤   pictResID = 0;
9a8509 ¤   ResIDT¤ ¤   ¤   maskResID = 0;
6f67c5 ¤
d978a9 ¤   ForeColor( blackColor );
f7bfdb ¤   BackColor( whiteColor );
ba67c5 ¤
11837e ¤   if( HavePicture() )
8cc7a1 ¤   {
ba32ed ¤   ¤   Rect¤   sourceRect;
4bf1ae ¤   ¤   Point¤  destSize;
851b52 ¤   ¤
5879e4 ¤   ¤   if( mGWorldSize.h > kMaxPhotoIDWidth ||
a9f4c7 ¤   ¤   ¤   mGWorldSize.v > kMaxPhotoIDHeight )
e65b34 ¤   ¤   {
7a87c7 ¤   ¤   ¤
af661b ¤   ¤   ¤   // Our GWorld is larger than the display area.
8b47e1 ¤   ¤   ¤   // Scale the image
9087c7 ¤   ¤   ¤
77ad56 ¤   ¤   ¤   destSize = CalcScaledImageSize( mGWorldSize );
cf0fe4 ¤   ¤   }
b60e1d ¤   ¤   else
375b34 ¤   ¤   {
8505fe ¤   ¤   ¤   destSize = mGWorldSize;
3d0fe4 ¤   ¤   }
a1af5a
176985 ¤   ¤   SetRect( &sourceRect, 0, 0, mGWorldSize.h, mGWorldSize.v );
41f740 ¤   ¤   SetRect( &mImageRect, 0, 0, destSize.h, destSize.v );
5daf5a
3ca255 ¤   ¤   AlignRect( photoRect, &mImageRect, kAlignAtAbsoluteCenter );
5f1b52 ¤   ¤
7c1dad ¤   ¤   RGBForeColor( &UGAColorRamp::GetBlackColor() );
2c3802 ¤   ¤   RGBBackColor( &UGAColorRamp::GetWhiteColor() );
781b52 ¤   ¤
81f719 ¤   ¤   CopyBits( &((GrafPtr)mGWorld)->portBits,
122e13 ¤   ¤   ¤   ¤   &GetMacPort()->portBits,
2efdcb ¤   ¤   ¤   ¤   &sourceRect, &mImageRect, srcCopy | ditherCopy, NULL );
7eaf5a
7bc6c1 ¤   ¤   switch( mStatus )
1b5b34 ¤   ¤   {
7abc83 ¤   ¤   ¤   case kPGPPhotoUserIDStatus_Normal:
69cf7c ¤   ¤   ¤   ¤   /* No overlay picture */
12f622 ¤   ¤   ¤   ¤   break;
85af5a
8b2461 ¤   ¤   ¤   case kPGPPhotoUserIDStatus_NoValidity:
379389 ¤   ¤   ¤   ¤   pictResID = kInvalidPhotoIDResID;
c8f622 ¤   ¤   ¤   ¤   break;
02af5a
2e77ac ¤   ¤   ¤   case kPGPPhotoUserIDStatus_Revoked:
d04136 ¤   ¤   ¤   ¤   pictResID = kRevokedPhotoIDResID;
cff622 ¤   ¤   ¤   ¤   break;
e6af5a
6b256c ¤   ¤   ¤   case kPGPPhotoUserIDStatus_Expired:
17aff4 ¤   ¤   ¤   ¤   pictResID = kExpiredPhotoIDResID;
02f622 ¤   ¤   ¤   ¤   break;
--7f59 00017775247401201bd Page 10 of CPhotoUserID.cp
e587c7 ¤   ¤   ¤
3adb68 ¤   ¤   ¤   default:
1d5ab0 ¤   ¤   ¤   ¤   pgpDebugMsg( "DrawPhoto: Unknown status");
e8f622 ¤   ¤   ¤   ¤   break;
430fe4 ¤   ¤   }
0267c5 ¤
3209e0 ¤   ¤   if( inBitDepth >= 8 )
925b34 ¤   ¤   {
ecee99 ¤   ¤   ¤   maskResID = pictResID + 1;
7e0fe4 ¤   ¤   }
5f9371 ¤   }
d467c5 ¤
67e174 ¤   if( pictResID != 0 )
a7c7a1 ¤   {
2e08b1 ¤   ¤   PicHandle¤  thePicture;
83af5a
cac37e ¤   ¤   thePicture = GetPicture( pictResID );
50b613 ¤   ¤   if( IsntNull( thePicture ) )
c45b34 ¤   ¤   {
7190a5 ¤   ¤   ¤   Rect¤   imageRect;
a387c7 ¤   ¤   ¤
b25711 ¤   ¤   ¤   HLock( (Handle) thePicture );
fb87c7 ¤   ¤   ¤
657798 ¤   ¤   ¤   imageRect = (**thePicture).picFrame;
bac6b6 ¤   ¤   ¤   AlignRect( photoRect, &imageRect, kAlignAtAbsoluteCenter );
79af5a
2f0dc6 ¤   ¤   ¤   if( maskResID != 0 )
bbf776 ¤   ¤   ¤   {
e2db81 ¤   ¤   ¤   ¤   PicHandle¤  maskPicture;
fc9090 ¤   ¤   ¤   ¤   CGrafPtr¤   savePort;
cb99ac ¤   ¤   ¤   ¤   GDHandle¤   saveDevice;
3d9cff ¤   ¤   ¤   ¤   Rect¤   ¤   gWorldRect;
e6f517 ¤   ¤   ¤   ¤   QDErr¤  ¤   err;
902b85 ¤   ¤   ¤   ¤
f206de ¤   ¤   ¤   ¤   /* Draw picture transparently using mask */
7d3271 ¤   ¤   ¤   ¤   GetGWorld( &savePort, &saveDevice );
252b85 ¤   ¤   ¤   ¤
67b141 ¤   ¤   ¤   ¤   gWorldRect = imageRect;
560976 ¤   ¤   ¤   ¤   OffsetRect( &gWorldRect, -gWorldRect.left, -gWorldRect.top );
19ae30 ¤   ¤   ¤   ¤   ¤
1a7626 ¤   ¤   ¤   ¤   maskPicture = GetPicture( maskResID );
c0c244 ¤   ¤   ¤   ¤   if( IsntNull( maskPicture ) )
6472c3 ¤   ¤   ¤   ¤   {
3dfd06 ¤   ¤   ¤   ¤   ¤   GWorldPtr¤  pictGWorld;
4fae30 ¤   ¤   ¤   ¤   ¤
785937 ¤   ¤   ¤   ¤   ¤   err = NewGWorld( &pictGWorld, 16, &gWorldRect, NULL, NULL,
0050a8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   useTempMem );
d25bf2 ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
10598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
0e4859 ¤   ¤   ¤   ¤   ¤   {
aa7d05 ¤   ¤   ¤   ¤   ¤   ¤   GWorldPtr¤  maskGWorld;
34af5a
80bf5f ¤   ¤   ¤   ¤   ¤   ¤   SetGWorld( pictGWorld, NULL );
faaf5f ¤   ¤   ¤   ¤   ¤   ¤   ForeColor( blackColor );
1d682d ¤   ¤   ¤   ¤   ¤   ¤   BackColor( whiteColor );
7894aa ¤   ¤   ¤   ¤   ¤   ¤
7f15e7 ¤   ¤   ¤   ¤   ¤   ¤   LockPixels( GetGWorldPixMap( pictGWorld ) );
d5031a ¤   ¤   ¤   ¤   ¤   ¤   DrawPicture( thePicture, &gWorldRect );
1194aa ¤   ¤   ¤   ¤   ¤   ¤
138128 ¤   ¤   ¤   ¤   ¤   ¤   err = NewGWorld( &maskGWorld, 16, &gWorldRect, NULL,
ebba12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NULL, useTempMem );
cbca6a ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
715f35 ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
6a8fec ¤   ¤   ¤   ¤   ¤   ¤   {
a3e105 ¤   ¤   ¤   ¤   ¤   ¤   ¤   SetGWorld( maskGWorld, NULL );
58fc44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ForeColor( blackColor );
ab3b36 ¤   ¤   ¤   ¤   ¤   ¤   ¤   BackColor( whiteColor );
1d531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
2dadf1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   LockPixels( GetGWorldPixMap( maskGWorld ) );
0ab4f6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   DrawPicture( maskPicture, &gWorldRect );
baaf5a
17808d ¤   ¤   ¤   ¤   ¤   ¤   ¤   SetGWorld( savePort, saveDevice );
--cf19 000d9c03df3401201bd Page 11 of CPhotoUserID.cp
e0af5a
fb8def ¤   ¤   ¤   ¤   ¤   ¤   ¤   CopyDeepMask( ·¤&((GrafPtr) pictGWorld)->portBits,
1199ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &((GrafPtr) maskGWorld)->portBits,
a1ba82 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &GetMacPort()->portBits,
9a40d1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &gWorldRect, &gWorldRect, &imageRect, s¶
3aa665 rcCopy, NULL );
fe531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
d3db48 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UnlockPixels( GetGWorldPixMap( maskGWorld ) );
3de732 ¤   ¤   ¤   ¤   ¤   ¤   ¤   DisposeGWorld( maskGWorld );
bedb3c ¤   ¤   ¤   ¤   ¤   ¤   }
6594aa ¤   ¤   ¤   ¤   ¤   ¤
0fb483 ¤   ¤   ¤   ¤   ¤   ¤   UnlockPixels( GetGWorldPixMap( pictGWorld ) );
c1695f ¤   ¤   ¤   ¤   ¤   ¤   DisposeGWorld( pictGWorld );
321c89 ¤   ¤   ¤   ¤   ¤   }
fdae30 ¤   ¤   ¤   ¤   ¤
1983a4 ¤   ¤   ¤   ¤   ¤   ReleaseResource( (Handle) maskPicture );
b12613 ¤   ¤   ¤   ¤   }
72af5a
089673 ¤   ¤   ¤   ¤   SetGWorld( savePort, saveDevice );
eba3a6 ¤   ¤   ¤   }
a2bb8c ¤   ¤   ¤   else
14f776 ¤   ¤   ¤   {
0ba13c ¤   ¤   ¤   ¤   /* Draw picture directly */¤¤   ¤
ddf698 ¤   ¤   ¤   ¤   DrawPicture( thePicture, &imageRect );
86a3a6 ¤   ¤   ¤   }
8887c7 ¤   ¤   ¤
429fbc ¤   ¤   ¤   ReleaseResource( (Handle) thePicture );
950fe4 ¤   ¤   }
9b9371 ¤   }
61efe6 }
24af5a
b86d52 ¤   void
c662bc CPhotoUserID::DrawSelf(void)
a2bb36 {
5dd8a7 ¤   Rect frame;
2caf5a
c167b9 ¤   CalcLocalFrameRect( frame );
3867c5 ¤
a1c7a1 ¤   {
f4296f ¤   ¤   StDeviceLoop¤   devLoop(frame);¤¤
4877ad ¤   ¤   SInt16¤ ¤   ¤   depth;
48af5a
c73977 ¤   ¤   while( devLoop.NextDepth( depth ) )
3d5b34 ¤   ¤   {
931beb ¤   ¤   ¤   DrawPhoto( &frame, depth );
a50fe4 ¤   ¤   }
2d9371 ¤   }
deefe6 }
56af5a
3e6d52 ¤   void
cc03db CPhotoUserID::ClickSelf(
759508 ¤   const SMouseDownEvent & inMouseDown)
f7bb36 {
c0c0bc ¤   LPane::ClickSelf( inMouseDown );
61af5a
3d74f9 ¤   if( ! IsTarget() )
3deb7d ¤   ¤   SwitchTarget( this );
661b52 ¤   ¤
0cf574 ¤   if( HavePicture() &&
bfc4bb ¤   ¤   LDropArea::DragAndDropIsPresent() )
12c7a1 ¤   {
2266a9 ¤   ¤   if( WaitMouseMoved( inMouseDown.macEvent.where ) )
8b5b34 ¤   ¤   {
8f660e ¤   ¤   ¤   PicHandle¤  picture;
c587c7 ¤   ¤   ¤
450828 ¤   ¤   ¤   if( IsntErr( GetPictureData( &picture ) ) )
39f776 ¤   ¤   ¤   {
50e306 ¤   ¤   ¤   ¤   Rect¤   ¤   ¤   ¤   frameRect;
a2a1d8 ¤   ¤   ¤   ¤   Rect¤   ¤   ¤   ¤   dragRect = mImageRect;
955919 ¤   ¤   ¤   ¤   StPortOriginState¤  saveState( GetMacPort() );
532b85 ¤   ¤   ¤   ¤
d92b57 ¤   ¤   ¤   ¤   SetOrigin( 0, 0 );
--86c4 0009bee9aa9401201bd Page 12 of CPhotoUserID.cp
051d3b ¤   ¤   ¤   ¤   HLock( (Handle) picture );
822b85 ¤   ¤   ¤   ¤
b6c4d8 ¤   ¤   ¤   ¤   CalcPortFrameRect( frameRect );
bd8b7b ¤   ¤   ¤   ¤   AlignRect( &frameRect, &dragRect, kAlignAtAbsoluteCenter );
5c2b85 ¤   ¤   ¤   ¤
cc6449 ¤   ¤   ¤   ¤   LDragTask¤  drag( inMouseDown.macEvent, dragRect,
cc20bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   1, 'PICT', *picture,
c9258f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetHandleSize( (Handle) picture), 0 );
f8ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
44e587 ¤   ¤   ¤   ¤   DisposeHandle( (Handle) picture );
b3a3a6 ¤   ¤   ¤   }
0a0fe4 ¤   ¤   }
e19371 ¤   }
0aefe6 }
cdaf5a
dc85ea ¤   OSStatus
745dbf CPhotoUserID::CreateTempJPEGFile(FSSpec *fileSpec)
08bb36 {
34dc42 ¤   OSStatus¤   err;
cb67c5 ¤
183253 ¤   if( IsErr( FindFolder( kOnSystemDisk, kTemporaryFolderType,
0318d1 ¤   ¤   ¤   ¤   kCreateFolder, &fileSpec->vRefNum, &fileSpec->parID ) ) )
08c7a1 ¤   {
b10d24 ¤   ¤   fileSpec->vRefNum ¤ = -1;
b3eab6 ¤   ¤   fileSpec->parID¤¤   = fsRtDirID;
a29371 ¤   }
87af5a
40bddc ¤   err = FSGetUniqueName( fileSpec->vRefNum, fileSpec->parID,
d02fe8 ¤   ¤   ¤   ¤   "\pPGPkeys TEMP", fileSpec->name );
86ee03 ¤   if( IsntErr( err ) )
89c7a1 ¤   {
b0e78f ¤   ¤   err = FSpCreate( fileSpec, 'pgpK', 'TEMP', 0 );
169371 ¤   }
7267c5 ¤
e7deb7 ¤   return( err );
deefe6 }
9eaf5a
4f85ea ¤   OSStatus
274898 CPhotoUserID::JPEGToGWorld(JPEGDecompressionContext *jpegContext)
c8bb36 {
616792 ¤   OSStatus¤   err = noErr;
b5af5a
9ed429 ¤   // Setup JPEG decompression parameters
d4531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
2a609b ¤   jpegContext->dInfo.quantize_colors ¤= FALSE;
352080 ¤   jpegContext->dInfo.out_color_space¤ = JCS_RGB;
0baf5a
8207a4 ¤   err = JPEGStartDecompress( jpegContext );
761264 ¤   if( err == noErr )
d9c7a1 ¤   {
422fde ¤   ¤   UInt32¤ ¤   bufferSize;
c9f5c9 ¤   ¤   void¤   ¤   *buffer;
3cb522 ¤   ¤   Point¤  ¤   imageSize;
0a1b52 ¤   ¤
64c9d2 ¤   ¤   imageSize.h = jpegContext->dInfo.image_width;
d9fcd3 ¤   ¤   imageSize.v = jpegContext->dInfo.image_height;
ae1b52 ¤   ¤
16434e ¤   ¤   // Create buffer for one scan line
f44f21 ¤   ¤   bufferSize = imageSize.h * jpegContext->dInfo.out_color_components;
5aaf5a
79e816 ¤   ¤   buffer = pgpAllocMac( bufferSize, kMacMemory_PreferTempMem |
cd305a ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap );
04ffa0 ¤   ¤   if( IsntNull( buffer ) )
9e5b34 ¤   ¤   {
c8f577 ¤   ¤   ¤   UInt32¤ ¤   remainingLines;
277b69 ¤   ¤   ¤   UInt16¤ ¤   gWorldRowBytes;
5eddd4 ¤   ¤   ¤   char¤   ¤   *destBaseAddr;
d678b1 ¤   ¤   ¤   UInt32¤ ¤   scanLineIndex;
ce87c7 ¤   ¤   ¤
e6b7ce ¤   ¤   ¤   destBaseAddr ¤  = GetPixBaseAddr( mGWorld->portPixMap );
97b8a0 ¤   ¤   ¤   gWorldRowBytes ¤= (**mGWorld->portPixMap).rowBytes & 0x7FFF;
9be42f ¤   ¤   ¤   remainingLines ¤= jpegContext->dInfo.output_height;
--1980 000720a4ebb401201bd Page 13 of CPhotoUserID.cp
e587c7 ¤   ¤   ¤
bf7194 ¤   ¤   ¤   for( scanLineIndex = 0; scanLineIndex < remainingLines;
667d17 ¤   ¤   ¤   ¤   ¤   scanLineIndex++ )
b7f776 ¤   ¤   ¤   {
1566e4 ¤   ¤   ¤   ¤   JDIMENSION¤ count;
5d2b85 ¤   ¤   ¤   ¤
076d5f ¤   ¤   ¤   ¤   err = PGPErrorToMacError( JPEGReadScanlines( jpegContext,
74ed8b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (JSAMPROW *) &buffer, 1, &count ) );
485c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
4472c3 ¤   ¤   ¤   ¤   {
312c46 ¤   ¤   ¤   ¤   ¤   UInt32¤ *curPixel¤  = (UInt32 *) destBaseAddr;
2e484a ¤   ¤   ¤   ¤   ¤   char¤   *cur¤   ¤   = (char *) buffer;
7e4b92 ¤   ¤   ¤   ¤   ¤   char¤   *lastPlus1¤ = cur + bufferSize;
c42b85 ¤   ¤   ¤   ¤
6f682f ¤   ¤   ¤   ¤   ¤   // back up one byte to account for alpha channel.
082487 ¤   ¤   ¤   ¤   ¤   --cur;
eaf31e ¤   ¤   ¤   ¤   ¤   --lastPlus1;
f1ae30 ¤   ¤   ¤   ¤   ¤
e6c048 ¤   ¤   ¤   ¤   ¤   while( cur < lastPlus1 )
9c4859 ¤   ¤   ¤   ¤   ¤   {
9339fd ¤   ¤   ¤   ¤   ¤   ¤   // Clear the alpha channel
cb38da ¤   ¤   ¤   ¤   ¤   ¤   *curPixel++ = (( *(UInt32 *) cur ) & 0x00FFFFFF);
738449 ¤   ¤   ¤   ¤   ¤   ¤   cur += 3;
011c89 ¤   ¤   ¤   ¤   ¤   }
ecaf5a
5ac42a ¤   ¤   ¤   ¤   ¤   destBaseAddr += gWorldRowBytes;
402613 ¤   ¤   ¤   ¤   }
f12b85 ¤   ¤   ¤   ¤
919bb8 ¤   ¤   ¤   ¤   if( IsErr( err ) )
6014c3 ¤   ¤   ¤   ¤   ¤   break;
21a3a6 ¤   ¤   ¤   }
d587c7 ¤   ¤   ¤
7ee7e5 ¤   ¤   ¤   pgpAssert(¤ jpegContext->dInfo.output_scanline ==
060ce3 ¤   ¤   ¤   ¤   ¤   ¤   jpegContext->dInfo.output_height );
3087c7 ¤   ¤   ¤
76f40a ¤   ¤   ¤   pgpFreeMac( buffer );
ef0fe4 ¤   ¤   }
151b52 ¤   ¤
c9aa39 ¤   ¤   JPEGFinishDecompress( jpegContext );
4d9371 ¤   }
1e0e24 ¤   else
e8c7a1 ¤   {
ce2a06 ¤   ¤   err = memFullErr;
259371 ¤   }
3167c5 ¤
2edeb7 ¤   return( err );
61efe6 }
6faf5a
9285ea ¤   OSStatus
c93ab5 CPhotoUserID::SetPhotoData(
7a520e ¤   PGPContextRef¤  context,
631eb3 ¤   void¤   ¤   ¤   *data,
50bfe4 ¤   PGPSize¤¤   ¤   dataSize,
b8b45f ¤   Boolean¤¤   ¤   scaleToFit)
e1bb36 {
337cef ¤   OSStatus¤   ¤   ¤   ¤   err = noErr;
1aa1b5 ¤   FSSpec¤ ¤   ¤   ¤   ¤   fileSpec;
dbe8ca ¤   PGPFileSpecRef¤ ¤   ¤   fileSpecRef = kInvalidPGPFileSpecRef;
715309 ¤   PGPPhotoUserIDHeader¤   *header;
d242fa ¤   PGPByte¤¤   ¤   ¤   ¤   *dataStart;
45cdbf ¤   PGPUInt16¤  ¤   ¤   ¤   headerLength;
aa67c5 ¤
e87b82 ¤   // Save data to a temporary file
1b67c5 ¤
6899df ¤   pgpFixBeforeShip( "Reject invalid JPEG color spaces" );
b8af5a
2aa440 ¤   header ¤¤   ¤   = (PGPPhotoUserIDHeader *) data;
f8a75e ¤   headerLength¤   = PGPStorageToUInt16( (PGPByte *) &header->headerLength );
d2243d ¤   dataStart¤  ¤   = (PGPByte *) data + headerLength;
0267c5 ¤
93b74c ¤   if( header->headerVersion != kPGPPhotoIDHeaderVersion ||
72f7aa ¤   ¤   header->photoIDFormat != kPGPPhotoIDFormat_JPEG )
--a46b 000c28aadc6401201bd Page 14 of CPhotoUserID.cp
f7c7a1 ¤   {
f0a32e ¤   ¤   pgpDebugMsg( "SetPhotoData(): Invalid photo user ID data" );
1e6915 ¤   ¤   err = paramErr;
0b9371 ¤   }
f767c5 ¤
1dee03 ¤   if( IsntErr( err ) )
9fc7a1 ¤   {
214186 ¤   ¤   err = CreateTempJPEGFile( &fileSpec );
a5da5e ¤   ¤   if( IsntErr( err ) )
f45b34 ¤   ¤   {
e6a046 ¤   ¤   ¤   err = PGPErrorToMacError( PGPNewFileSpecFromFSSpec( context,
e67b2b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fileSpec, &fileSpecRef ) );
c90fe4 ¤   ¤   }
109371 ¤   }
0b67c5 ¤
28ee03 ¤   if( IsntErr( err ) )
2ac7a1 ¤   {
c1dc87 ¤   ¤   short¤  ¤   ¤   fileRef;
f41b52 ¤   ¤
5b61e0 ¤   ¤   err = FSpOpenDF( &fileSpec, fsRdWrPerm, &fileRef );
4ada5e ¤   ¤   if( IsntErr( err ) )
175b34 ¤   ¤   {
05de3d ¤   ¤   ¤   long¤   count = dataSize - headerLength;
0387c7 ¤   ¤   ¤
bd05d5 ¤   ¤   ¤   err = FSWrite( fileRef, &count, dataStart );
4187c7 ¤   ¤   ¤
dc01e0 ¤   ¤   ¤   FSClose( fileRef );
040fe4 ¤   ¤   }
bc87c7 ¤   ¤   ¤
13da5e ¤   ¤   if( IsntErr( err ) )
bd5b34 ¤   ¤   {
6b0c21 ¤   ¤   ¤   JPEGDecompressionContext¤   jpegContext;
23af5a
c0d2bd ¤   ¤   ¤   JPEGInitDecompressionContext( &jpegContext );
01af5a
ef3ea8 ¤   ¤   ¤   err = JPEGCreateDecompress( &jpegContext );
4e6108 ¤   ¤   ¤   if( IsntErr( err ) )
54f776 ¤   ¤   ¤   {
0ea054 ¤   ¤   ¤   ¤   err = JPEGOpenDecompressionFile( &jpegContext, fileSpecRef,
03e830 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TRUE );
515c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
2d72c3 ¤   ¤   ¤   ¤   {
b6d9c1 ¤   ¤   ¤   ¤   ¤   err = JPEGReadHeader( &jpegContext, TRUE );
d4598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
cb4859 ¤   ¤   ¤   ¤   ¤   {
9adbb9 ¤   ¤   ¤   ¤   ¤   ¤   Point¤  imageSize;
f3ae30 ¤   ¤   ¤   ¤   ¤
d56e9a ¤   ¤   ¤   ¤   ¤   ¤   imageSize.h = jpegContext.dInfo.image_width;
729fc9 ¤   ¤   ¤   ¤   ¤   ¤   imageSize.v = jpegContext.dInfo.image_height;
4d94aa ¤   ¤   ¤   ¤   ¤   ¤
fef657 ¤   ¤   ¤   ¤   ¤   ¤   if( scaleToFit )
0114c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   imageSize = CalcScaledImageSize( imageSize );
f6531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
4536b1 ¤   ¤   ¤   ¤   ¤   ¤   err = AllocateGWorld( imageSize );
e05f35 ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
338fec ¤   ¤   ¤   ¤   ¤   ¤   {
631311 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = JPEGToGWorld( &jpegContext );
1a531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
e9459f ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
578259 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FreeGWorld();¤
49db3c ¤   ¤   ¤   ¤   ¤   ¤   }
f21c89 ¤   ¤   ¤   ¤   ¤   }
6aae30 ¤   ¤   ¤   ¤   ¤
17fb82 ¤   ¤   ¤   ¤   ¤   JPEGCloseDecompressionFile( &jpegContext );
7b2613 ¤   ¤   ¤   ¤   }
532b85 ¤   ¤   ¤   ¤
adc774 ¤   ¤   ¤   ¤   JPEGDestroyDecompress( &jpegContext );
1fa3a6 ¤   ¤   ¤   }
8a87c7 ¤   ¤   ¤
e90fe4 ¤   ¤   }
1467c5 ¤
c24b53 ¤   ¤   FSpDelete( &fileSpec );
--f9d0 000f9780efa401201bd Page 15 of CPhotoUserID.cp
a19371 ¤   }
9967c5 ¤
948492 ¤   if( PGPFileSpecRefIsValid( fileSpecRef ) )
b34cd7 ¤   ¤   PGPFreeFileSpec( fileSpecRef );
1caf5a
7a4fc9 ¤   Refresh();
3daf5a
c5deb7 ¤   return( err );
51efe6 }
92af5a
8285ea ¤   OSStatus
408f6d CPhotoUserID::GWorldToJPEG(JPEGCompressionContext *jpegContext)
e1bb36 {
886792 ¤   OSStatus¤   err = noErr;
3e8280 ¤   UInt32¤ ¤   bufferSize;
fac194 ¤   void¤   ¤   *buffer;
b867c5 ¤
e83dd3 ¤   // specify image characteristics
2bd1a3 ¤   jpegContext->cInfo.image_width ¤¤   = mGWorldSize.h;
6ce0e9 ¤   jpegContext->cInfo.image_height ¤   = mGWorldSize.v;
a56b9b ¤   jpegContext->cInfo.input_components = 3;¤
db13ae ¤   jpegContext->cInfo.in_color_space ¤ = JCS_RGB;
6a67c5 ¤
834d02 ¤   // Create buffer for one scan line
324301 ¤   bufferSize = mGWorldSize.h * jpegContext->cInfo.input_components;
e8af5a
7c6253 ¤   buffer = pgpAllocMac( bufferSize, kMacMemory_PreferTempMem |
1f5f69 ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap );
b744f6 ¤   if( IsntNull( buffer ) )
96c7a1 ¤   {
c31865 ¤   ¤   err = JPEGSetDefaults( jpegContext );
74da5e ¤   ¤   if( IsntErr( err ) )
ee5b34 ¤   ¤   {
654079 ¤   ¤   ¤   err = JPEGSetQuality( jpegContext, kPGPDefaultJPEQQuality, TRUE );
640fe4 ¤   ¤   }
cb1b52 ¤   ¤
80da5e ¤   ¤   if( IsntErr( err ) )
335b34 ¤   ¤   {
4a6702 ¤   ¤   ¤   err = JPEGStartCompress( jpegContext, TRUE );
a4e4ad ¤   ¤   ¤   if( err == noErr )
d3f776 ¤   ¤   ¤   {
267d11 ¤   ¤   ¤   ¤   UInt32¤ ¤   remainingLines;
50f30f ¤   ¤   ¤   ¤   UInt16¤ ¤   gWorldRowBytes;
29d4d8 ¤   ¤   ¤   ¤   char¤   ¤   *sourceBaseAddr;
7476fd ¤   ¤   ¤   ¤   UInt32¤ ¤   scanLineIndex;
6a2b85 ¤   ¤   ¤   ¤
44d9ed ¤   ¤   ¤   ¤   sourceBaseAddr ¤= GetPixBaseAddr( mGWorld->portPixMap );
67257a ¤   ¤   ¤   ¤   gWorldRowBytes ¤= (**mGWorld->portPixMap).rowBytes & 0x7FFF;
afcf8b ¤   ¤   ¤   ¤   remainingLines ¤= mGWorldSize.v;
782b85 ¤   ¤   ¤   ¤
9c3fe3 ¤   ¤   ¤   ¤   for( scanLineIndex = 0; scanLineIndex < remainingLines;
3141f9 ¤   ¤   ¤   ¤   ¤   ¤   scanLineIndex++ )
b772c3 ¤   ¤   ¤   ¤   {
9a2717 ¤   ¤   ¤   ¤   ¤   JDIMENSION¤ count;
f84c08 ¤   ¤   ¤   ¤   ¤   char¤   ¤   *curPixel¤  ¤   = sourceBaseAddr;
100a5b ¤   ¤   ¤   ¤   ¤   char¤   ¤   *cur¤   ¤   ¤   = (char *) buffer;
81fa60 ¤   ¤   ¤   ¤   ¤   char¤   ¤   *lastPlusOne¤   = cur + bufferSize;
c9ae30 ¤   ¤   ¤   ¤   ¤
f8ace1 ¤   ¤   ¤   ¤   ¤   // Copy the GWorld row to the buffer.
72b820 ¤   ¤   ¤   ¤   ¤   while( cur < lastPlusOne )
d34859 ¤   ¤   ¤   ¤   ¤   {
fe160d ¤   ¤   ¤   ¤   ¤   ¤   curPixel++;¤¤   // Skip past the alpha channel
52ae30 ¤   ¤   ¤   ¤   ¤
0d8af7 ¤   ¤   ¤   ¤   ¤   ¤   *cur++ = *curPixel++;
198af7 ¤   ¤   ¤   ¤   ¤   ¤   *cur++ = *curPixel++;
d28af7 ¤   ¤   ¤   ¤   ¤   ¤   *cur++ = *curPixel++;
101c89 ¤   ¤   ¤   ¤   ¤   }
dfae30 ¤   ¤   ¤   ¤   ¤
2cbe8e ¤   ¤   ¤   ¤   ¤   sourceBaseAddr += gWorldRowBytes;
85af5a
532300 ¤   ¤   ¤   ¤   ¤   err = PGPErrorToMacError( JPEGWriteScanlines( jpegContext,
f9eafd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (JSAMPROW *) &buffer, 1, &count ) );
--8349 00089b96d6a401201bd Page 16 of CPhotoUserID.cp
80da4b ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
c900eb ¤   ¤   ¤   ¤   ¤   ¤   break;
492613 ¤   ¤   ¤   ¤   }
532b85 ¤   ¤   ¤   ¤
b32f44 ¤   ¤   ¤   ¤   JPEGFinishCompress( jpegContext );
e8a3a6 ¤   ¤   ¤   }
290fe4 ¤   ¤   }
e11b52 ¤   ¤
83c302 ¤   ¤   pgpFreeMac( buffer );
799371 ¤   }
3767c5 ¤
d0deb7 ¤   return( err );
33efe6 }
76af5a
ae85ea ¤   OSStatus
d11fdb CPhotoUserID::GetPhotoData(
f4520e ¤   PGPContextRef¤  context,
71c146 ¤   void ¤  ¤   ¤   **data,
7513f1 ¤   PGPSize¤¤   ¤   *dataSize)
3cbb36 {
a46b9d ¤   OSStatus¤   ¤   err = noErr;
04644f ¤   FSSpec¤ ¤   ¤   fileSpec;
a490b2 ¤   PGPFileSpecRef¤ fileSpecRef = kInvalidPGPFileSpecRef;
0c67c5 ¤
180c7f ¤   pgpAssert( HavePicture() );
a567c5 ¤
140c8e ¤   *data ¤ ¤   = NULL;
b52491 ¤   *dataSize¤  = 0;
a467c5 ¤
37ee6d ¤   // Compress to a temporary file
9067c5 ¤
1dd01e ¤   err = CreateTempJPEGFile( &fileSpec );
22ee03 ¤   if( IsntErr( err ) )
28c7a1 ¤   {
a8a730 ¤   ¤   err = PGPErrorToMacError( PGPNewFileSpecFromFSSpec( context,
7f7c5d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &fileSpec, &fileSpecRef ) );
9e9371 ¤   }
3eaf5a
8cee03 ¤   if( IsntErr( err ) )
bcc7a1 ¤   {
495f85 ¤   ¤   JPEGCompressionContext¤ jpegContext;
54af5a
2a12bf ¤   ¤   JPEGInitCompressionContext( &jpegContext );
90af5a
7b7413 ¤   ¤   err = JPEGCreateCompress( &jpegContext );
ffda5e ¤   ¤   if( IsntErr( err ) )
d15b34 ¤   ¤   {
a2f33c ¤   ¤   ¤   err = JPEGOpenCompressionFile( &jpegContext, fileSpecRef );
5a6108 ¤   ¤   ¤   if( IsntErr( err ) )
a2f776 ¤   ¤   ¤   {
3218f8 ¤   ¤   ¤   ¤   err = GWorldToJPEG( &jpegContext );
edae30 ¤   ¤   ¤   ¤   ¤
e1e520 ¤   ¤   ¤   ¤   JPEGCloseCompressionFile( &jpegContext );
81a3a6 ¤   ¤   ¤   }
5687c7 ¤   ¤   ¤
1c850b ¤   ¤   ¤   JPEGDestroyCompress( &jpegContext );
f20fe4 ¤   ¤   }
6a1b52 ¤   ¤
b1da5e ¤   ¤   if( IsntErr( err ) )
035b34 ¤   ¤   {
4b5b24 ¤   ¤   ¤   short¤  fileRef;
a01b52 ¤   ¤
2264de ¤   ¤   ¤   err = FSpOpenDF( &fileSpec, fsRdPerm, &fileRef );
176108 ¤   ¤   ¤   if( IsntErr( err ) )
08f776 ¤   ¤   ¤   {
bee84e ¤   ¤   ¤   ¤   long¤   fileSize;
662b85 ¤   ¤   ¤   ¤
e46e50 ¤   ¤   ¤   ¤   err = GetEOF( fileRef, &fileSize );
9d5c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
cf72c3 ¤   ¤   ¤   ¤   {
dc51da ¤   ¤   ¤   ¤   ¤   PGPPhotoUserIDHeader¤   *header;
89ae30 ¤   ¤   ¤   ¤   ¤
--d51a 0012866f298401201bd Page 17 of CPhotoUserID.cp
7398c0 ¤   ¤   ¤   ¤   ¤   *dataSize = fileSize + sizeof( *header );
cbae30 ¤   ¤   ¤   ¤   ¤
0a2deb ¤   ¤   ¤   ¤   ¤   *data = PGPNewData( PGPGetContextMemoryMgr( context ),
eef4b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *dataSize, 0 );
4fef40 ¤   ¤   ¤   ¤   ¤   if( IsntNull( *data ) )
464859 ¤   ¤   ¤   ¤   ¤   {
14adba ¤   ¤   ¤   ¤   ¤   ¤   PGPByte¤¤   *dataStart;
aae4b7 ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt16¤  headerLength;
6d94aa ¤   ¤   ¤   ¤   ¤   ¤
c586a0 ¤   ¤   ¤   ¤   ¤   ¤   header ¤¤   ¤   = (PGPPhotoUserIDHeader *) *data;
bd3616 ¤   ¤   ¤   ¤   ¤   ¤   headerLength ¤  = sizeof( *header );
3094aa ¤   ¤   ¤   ¤   ¤   ¤
2f9d2e ¤   ¤   ¤   ¤   ¤   ¤   pgpClearMemory( header, sizeof( *header ) );
dd94aa ¤   ¤   ¤   ¤   ¤   ¤
04e7de ¤   ¤   ¤   ¤   ¤   ¤   header->headerVersion ¤ = kPGPPhotoIDHeaderVersion;
322a37 ¤   ¤   ¤   ¤   ¤   ¤   header->photoIDFormat¤  = kPGPPhotoIDFormat_JPEG;
3e94aa ¤   ¤   ¤   ¤   ¤   ¤
c6c001 ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt16ToStorage( headerLength,
32c2ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPByte *) &header->headerLength );
7bda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
8f0eae ¤   ¤   ¤   ¤   ¤   ¤   dataStart = (PGPByte *) *data + headerLength;
15af5a
08d0fe ¤   ¤   ¤   ¤   ¤   ¤   err = FSRead( fileRef, &fileSize, dataStart );
d6d407 ¤   ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
698fec ¤   ¤   ¤   ¤   ¤   ¤   {
96a736 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeData( *data );
77531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
bc892a ¤   ¤   ¤   ¤   ¤   ¤   ¤   *data ¤ ¤   = NULL;
631021 ¤   ¤   ¤   ¤   ¤   ¤   ¤   *dataSize ¤ = 0;
03db3c ¤   ¤   ¤   ¤   ¤   ¤   }
931c89 ¤   ¤   ¤   ¤   ¤   }
764bd6 ¤   ¤   ¤   ¤   ¤   else
334859 ¤   ¤   ¤   ¤   ¤   {
65496c ¤   ¤   ¤   ¤   ¤   ¤   *dataSize = 0;
f194aa ¤   ¤   ¤   ¤   ¤   ¤
8a47c7 ¤   ¤   ¤   ¤   ¤   ¤   err = memFullErr;
351c89 ¤   ¤   ¤   ¤   ¤   }
f62613 ¤   ¤   ¤   ¤   }
e12b85 ¤   ¤   ¤   ¤
448a1c ¤   ¤   ¤   ¤   FSClose( fileRef );
a8a3a6 ¤   ¤   ¤   }
d73b90 ¤   ¤   }¤
df1b52 ¤   ¤
e14b53 ¤   ¤   FSpDelete( &fileSpec );
959371 ¤   }
ec67c5 ¤
cc8492 ¤   if( PGPFileSpecRefIsValid( fileSpecRef ) )
034cd7 ¤   ¤   PGPFreeFileSpec( fileSpecRef );
79af5a
cddeb7 ¤   return( err );
1cefe6 }
6daf5a
9e6d52 ¤   void
f90212 CPhotoUserID::SetStatus(PGPPhotoUserIDStatus status)
febb36 {
e74d9c ¤   if( status != mStatus )
0dc7a1 ¤   {
e2ba46 ¤   ¤   mStatus = status;
baad6a ¤   ¤   Refresh();
1a9371 ¤   }
28be43 }¶
--3c34 0005e051444401201be Page 1 of CPhotoUserID.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
d813ce ¤   $Id: CPhotoUserID.h,v 1.7.8.1 1998/11/12 03:08:11 heller Exp $
4ff7f7 ____________________________________________________________________________*/
58af5a
be2f94 #include <LCommander.h>
d31d80 #include <LDragAndDrop.h>
9460c3 #include <LPane.h>
05af5a
3b08c5 #include "pgpJPEG.h"
c30d08 #include "pgpMem.h"
77d379 #include "pgpClientShared.h"
caaf5a
8fba32 typedef enum PGPPhotoUserIDStatus
f0bb36 {
8ce606 ¤   kPGPPhotoUserIDStatus_Normal¤   = 1,
56f856 ¤   kPGPPhotoUserIDStatus_NoValidity,
a67c31 ¤   kPGPPhotoUserIDStatus_Revoked,
55cfe1 ¤   kPGPPhotoUserIDStatus_Expired
a867c5 ¤
b1b84b } PGPPhotoUserIDStatus;
d7af5a
f8c364 class CPhotoUserID : ¤  public LPane,
36a879 ¤   ¤   ¤   ¤   ¤   ¤   public LCommander,
240101 ¤   ¤   ¤   ¤   ¤   ¤   public LDragAndDrop
78bb36 {
f15ed4 public:
44af5a
1ac268 ¤   enum { class_ID = 'PhID' };
5d67c5 ¤
1f4c01 ¤   ¤   ¤   ¤   ¤   ¤   CPhotoUserID(LStream *inStream);
2def19 ¤   virtual¤¤   ¤   ¤   ~CPhotoUserID(void);
44af5a
6ddf0e ¤   OSStatus¤   ¤   ¤   AddPictureFromFile(const FSSpec *fileSpec);
f33e71 ¤   void¤   ¤   ¤   ¤   ClearPicture(void);
8c8fbd ¤   virtual void¤   ¤   ClickSelf(const SMouseDownEvent &inMouseDown);
fe48a0 ¤   virtual void¤   ¤   FindCommandStatus(CommandT inCommand,
2bdb44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
3ffcde ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName);
4b8ad8 ¤   OSStatus¤   ¤   ¤   GetPhotoData(PGPContextRef context, void **data,
8a7995 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize *dataSize);
bd4d69 ¤   OSStatus¤   ¤   ¤   GetPictureData(PicHandle *picture);
e35a31 ¤   Boolean¤¤   ¤   ¤   HavePicture(void) { return( IsntNull( mGWorld ) ); };
9fb397 ¤   virtual void¤   ¤   HiliteDropArea(¤DragReference¤  inDragRef);
c7fae6 ¤   Boolean¤¤   ¤   ¤   IsLocked(void) { return( mLocked ); };
99a00f ¤   virtual Boolean¤¤   ItemIsAcceptable(DragReference inDragRef,
50dbc1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ItemReference inItemRef);
ee5775 ¤   void¤   ¤   ¤   ¤   Lock(void) { mLocked = TRUE; };
c2c834 ¤   virtual Boolean¤¤   ObeyCommand(CommandT inCommand, void *ioParam);
a53528 ¤   virtual void¤   ¤   ReceiveDragItem(DragReference inDragRef,
64ad90 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragAttributes inDragAttrs,
f87ab5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ItemReference inItemRef,
d1bed2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect &inItemBounds);
8413e7 ¤   OSStatus¤   ¤   ¤   SetPhotoData(PGPContextRef context,
b05bc8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *data, PGPSize dataSize,
04ec6c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean scaleToFit);
d44b2b ¤   OSStatus¤   ¤   ¤   SetPictureData(PicHandle picture, Boolean scaleToFit);
824dc0 ¤   void¤   ¤   ¤   ¤   SetStatus(PGPPhotoUserIDStatus status);
9773eb ¤   virtual void¤   ¤   UnhiliteDropArea(DragReference inDragRef);
715da4 ¤   void¤   ¤   ¤   ¤   Unlock(void) { mLocked = FALSE; };
aeaf5a
43a2d3 protected:
29af5a
f2e40b ¤   virtual void¤   ¤   DrawSelf(void);
db67c5 ¤
990fb9 private:
3caf5a
ccd09d ¤   Boolean¤¤   ¤   ¤   ¤   mLocked;
a71423 ¤   Point¤  ¤   ¤   ¤   ¤   mGWorldSize;
5e1889 ¤   GWorldPtr¤  ¤   ¤   ¤   mGWorld;
--011c 00140b8fea3401201be Page 2 of CPhotoUserID.h
d26912 ¤   Rect¤   ¤   ¤   ¤   ¤   mImageRect;
c6196c ¤   PGPPhotoUserIDStatus¤   mStatus;
a267c5 ¤
d264b7 ¤   OSStatus¤   ¤   ¤   AllocateGWorld(Point imageSize);
04cf8a ¤   Point¤  ¤   ¤   ¤   CalcScaledImageSize(Point imageSize);
1db225 ¤   OSStatus¤   ¤   ¤   CreateTempJPEGFile(FSSpec *fileSpec);
a1b705 ¤   void¤   ¤   ¤   ¤   DoDropAreaHilite(DragReference inDragRef,
f34db6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean showHilite);
9be045 ¤   void¤   ¤   ¤   ¤   DrawPhoto(const Rect *photoRect, SInt16 inBitDepth);
ccf2e8 ¤   void¤   ¤   ¤   ¤   FreeGWorld(void);
f554e4 ¤   OSStatus¤   ¤   ¤   GWorldToJPEG(JPEGCompressionContext *jpegContext);
9c54f4 ¤   OSStatus¤   ¤   ¤   JPEGToGWorld(JPEGDecompressionContext *jpegContext);
40bf26 };¶
--59d4 00081273e78401201bf Page 1 of CRecessedCaption.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
aeb474 ¤   $Id: CRecessedCaption.cp,v 1.5.8.1 1998/11/12 03:08:11 heller Exp $
0ef7f7 ____________________________________________________________________________*/
538f92 #include <UGAColorRamp.h>
7d8708 #include <LCheckBox.h>
50ffe3 #include <UGraphicUtils.h>
e07e6d #include <UDrawingState.h>
dbe8ae #include <UDrawingUtils.h>
a3902e #include <UAttachments.h>
c7f8a6 #include <UTextTraits.h>
30af5a
ac7894 #include "CRecessedCaption.h"
01af5a
57af5a
c03fdf ¤   CRecessedCaption *
68a40c CRecessedCaption::CreateFromStream(
f7796d ¤   LStream * inStream)
7abb36 {
07b6f0 ¤   return new CRecessedCaption(inStream);
4fefe6 }
f0af5a
adaf5a
080338 CRecessedCaption::CRecessedCaption()
72bb36 {
a2efe6 }
69af5a
4baf5a
0133a0 CRecessedCaption::CRecessedCaption(
107453 ¤   const CRecessedCaption & inBorderCaption)
d4e446 ¤   : LCaption(inBorderCaption)
5fbb36 {
62efe6 }
0baf5a
6faf5a
0d33a0 CRecessedCaption::CRecessedCaption(
b3796d ¤   LStream * inStream)
8b5f28 ¤   : LCaption(inStream)
1abb36 {
07b5b3 ¤   // read the fields used to configure the border
01807b ¤   //inStream->ReadData(&mBackColor, sizeof(RGBColor));
afefe6 }
94af5a
acaf5a
d333a0 CRecessedCaption::CRecessedCaption(
be7008 ¤   const SPaneInfo&¤   inPaneInfo,
72defd ¤   ConstStringPtr¤ ¤   inString,
e0a5ec ¤   ResIDT¤ ¤   ¤   ¤   inTextTraitsID)
17502f ¤   : LCaption(inPaneInfo, inString, inTextTraitsID)
5fbb36 {
78138c ¤   //mBackColor = inBackColor;
ecefe6 }
9aaf5a
8caf5a
446d52 ¤   void
3b812b CRecessedCaption::FinishCreateSelf()
1cbb36 {
7cefe6 }
34af5a
9eaf5a
44e1ff // NOTE: this follows the philosophy of drawing the border WITHIN the
1d4d2c // pane boundaries it saves a lot of hassles (e.g. with clipping)
1d6d52 ¤   void
40a8d2 CRecessedCaption::DrawSelf()
44bb36 {
5b1fc0 ¤   Rect localFrame;
d1f118 ¤   CalcLocalFrameRect (localFrame);
81c94e ¤   ApplyForeAndBackColors();
--fe3a 000d81f8d72401201bf Page 2 of CRecessedCaption.cp
6a8b4d ¤   DrawBackground(¤localFrame);
af4f03 ¤   DrawBox(¤   ¤   localFrame);
dadbc4 ¤   DrawText(¤  ¤   localFrame);
75efe6 }
94af5a
f0af5a
b46d52 ¤   void
c3a330 CRecessedCaption::DrawBackground(
620530 ¤   const Rect & localFrame)
ffbb36 {
ada045 ¤   Rect frameCopy = localFrame;
2c3ec4 ¤   ::InsetRect(&frameCopy, 1, 1);
09a708 ¤   ::EraseRect(&frameCopy);
69efe6 }
57af5a
f2af5a
256d52 ¤   void
6c8ff4 CRecessedCaption::DrawBox(
6a0530 ¤   const Rect & localFrame)
1bbb36 {
fe3d18 ¤   StColorPenState¤theColorPenState;
1995c4 ¤   StDeviceLoop¤   theLoop (localFrame);
330d8e ¤   ::PenNormal();
91af5a
2917bb ¤   Int16¤  ¤   ¤   ¤   depth;
14d5be ¤   while (theLoop.NextDepth (depth))·
0bc7a1 ¤   {
7235f6 ¤   ¤   if (depth >= 8)¤// 256 colours
7f5b34 ¤   ¤   {
2f10c6 ¤   ¤   ¤   DrawGrayBox(localFrame);
9f0fe4 ¤   ¤   }
0a0e1d ¤   ¤   else
1b5b34 ¤   ¤   {
116748 ¤   ¤   ¤   ::PenPat(&qd.gray);
f64c95 ¤   ¤   ¤   ::FrameRect(&localFrame);
808d86 ¤   ¤   ¤   ::PenPat(&qd.black);
ab0fe4 ¤   ¤   }
3e9371 ¤   }
9defe6 }
9a67c5 ¤
68af5a
0b6d52 ¤   void
c5d447 CRecessedCaption::DrawGrayBox(
7e0530 ¤   const Rect & localFrame)
9ebb36 {
aea045 ¤   Rect frameCopy = localFrame;
c667c5 ¤
c6c525 ¤   // top left dark edges
dd2aec ¤   ::RGBForeColor (&(UGAColorRamp::GetColor(7)));
b186df ¤   UGraphicUtils::TopLeftSide (frameCopy, 0, 0, 1, 1);
aaaf5a
d68ae1 ¤   // bottom right light edges
ff01bb ¤   ::RGBForeColor (&(UGAColorRamp::GetWhiteColor()));
03fcc1 ¤   UGraphicUtils::BottomRightSide (frameCopy, 1, 1, 0, 0);
fcefe6 }
d9af5a
e4af5a
441c88 // this is mostly copied from LStaticText::DrawSelf
f96d52 ¤   void
cb3e5f CRecessedCaption::DrawText(
e90530 ¤   const Rect & localFrame)
3abb36 {
ddfca2 ¤   Rect frame = localFrame;¤   ¤   // added
a45b0e ¤   ::InsetRect(&frame, 4, 2);¤ // added
4fe826 ¤   frame.top--;¤   ¤   ¤   ¤   ¤   // added
6367c5 ¤
9c81ee ¤   Int16¤  just = UTextTraits::SetPortTextTraits(mTxtrID);
2a67c5 ¤
c4e8c9 ¤   RGBColor¤   textColor;
5c62c8 ¤   ::GetForeColor(&textColor);
8367c5 ¤
d8c94e ¤   ApplyForeAndBackColors();
--4dc0 00175eacb9b401201bf Page 3 of CRecessedCaption.cp
37cf16 ¤   ::RGBForeColor(&textColor);
7c67c5 ¤
0d4726 ¤   UTextDrawing::DrawWithJustification((Ptr)&mText[1], mText[0], frame, just);
80efe6 }
75af5a
--301d 00132a43bf0401201c0 Page 1 of CRecessedCaption.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
af4b7d ¤   $Id: CRecessedCaption.h,v 1.3.8.1 1998/11/12 03:08:12 heller Exp $
2af7f7 ____________________________________________________________________________*/
b87b7d #pragma once
8daf5a
8025ae #include <LCaption.h>
d7af5a
064412 class CRecessedCaption : public LCaption
f2bb36 {
515ed4 public:
e8d524 ¤   enum { class_ID = 'rCap' };
650c00 ¤   static CRecessedCaption * CreateFromStream(LStream * inStream);
16af5a
61306f ¤   // replicate all four of LCaption's constructors
6224d9 ¤   CRecessedCaption();
0226d4 ¤   CRecessedCaption(¤  const CRecessedCaption& inBorderCaption );
3f698b ¤   CRecessedCaption(¤  LStream * inStream );
1f64cb ¤   CRecessedCaption(¤  const SPaneInfo &¤  inPaneInfo,
33d59a ¤   ¤   ¤   ¤   ¤   ¤   ConstStringPtr¤ ¤   inString,
32637f ¤   ¤   ¤   ¤   ¤   ¤   ResIDT¤ ¤   ¤   ¤   inTextTraitsID );
c367c5 ¤
b9a2d3 protected:
b2552f ¤   virtual void FinishCreateSelf();
3e0f44 ¤   virtual void DrawSelf();
da429f ¤   virtual void DrawBackground(¤   const Rect & localFrame );
f8f0f8 ¤   virtual void DrawBox(¤  ¤   ¤   const Rect & localFrame );
f7b605 ¤   virtual void DrawGrayBox(¤  ¤   const Rect & localFrame );
9b49a6 ¤   virtual void DrawText(¤ ¤   ¤   const Rect & localFrame );
7c82f7 };
32af5a
--81ea 0008c05e168401201c1 Page 1 of CSearchPanel.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
3aaf5a
1f292c ¤   $Id: CSearchPanel.cp,v 1.23.8.1 1998/11/12 03:08:13 heller Exp $
bdf7f7 ____________________________________________________________________________*/
18138b #include "CSearchPanel.h"
beaf5a
a94d6a #include "CGADurationEditField.h"
32b8cb #include "CPGPKeys.h"
b3af5a
0c9dc2 #include "CWarningAlert.h"
f62b62 #include "pgpPFLErrors.h"
e185c2 #include "MacStrings.h"
20a076 #include "pgpKeys.h"
8a4919 #include "pgpUtilities.h"
23af5a
b27c09 #include <LEditText.h>
060aae #include <LPopupButton.h>
26af5a
89b805 const Int16¤kNumCategories¤ ¤   = 7;
5051a6 const Int16 kNumOperators¤  ¤   = 8;
fdaf5a
93f989 enum¤   {
56b737 ¤   ¤   ¤   kUserIDCategory¤¤   = 0,
e62373 ¤   ¤   ¤   kKeyIDCategory,
f840fc ¤   ¤   ¤   kKeyCategory,
261ec6 ¤   ¤   ¤   kKeyTypeCategory,
1b3cc6 ¤   ¤   ¤   kKeySizeCategory,
21a8a8 ¤   ¤   ¤   kCreationDateCategory,
10f81a ¤   ¤   ¤   kExpirationDateCategory
4ca105 ¤   ¤   };
fbf989 enum¤   {
aee801 ¤   ¤   ¤   kContainsOperator = 0,
c6cda8 ¤   ¤   ¤   kNotContainsOperator,
da3836 ¤   ¤   ¤   kIsOperator,
3d6a08 ¤   ¤   ¤   kIsNotOperator,
00f506 ¤   ¤   ¤   kIsAtLeastOperator,
3f9d3b ¤   ¤   ¤   kIsAtMostOperator,
5d7674 ¤   ¤   ¤   kIsSignedByOperator,
60fca6 ¤   ¤   ¤   kNotSignedByOperator
44a105 ¤   ¤   };
94b27e const Int16 kCategoryOperators[kNumCategories][kNumOperators] =
325b34 ¤   ¤   {
ad6be1 ¤   ¤   ¤   //kUserIDCategory
0d23e1 ¤   ¤   ¤   kContainsOperator, kNotContainsOperator,
fba8db ¤   ¤   ¤   kIsOperator, kIsNotOperator,
81732d ¤   ¤   ¤   kIsSignedByOperator, kNotSignedByOperator, -1, -1,
2e040b ¤   ¤   ¤   //kKeyCategory
9c23b2 ¤   ¤   ¤   kIsOperator, kIsNotOperator, -1, -1, -1, -1, -1, -1,
5e9281 ¤   ¤   ¤   //kKeyIDCategory
2423b2 ¤   ¤   ¤   kIsOperator, kIsNotOperator, -1, -1, -1, -1, -1, -1,
2c38e2 ¤   ¤   ¤   //kKeyTypeCategory
4596aa ¤   ¤   ¤   kIsOperator, -1, -1, -1, -1, -1, -1, -1,
9022f1 ¤   ¤   ¤   //kKeySizeCategory
238837 ¤   ¤   ¤   kIsOperator, kIsAtLeastOperator, kIsAtMostOperator,
d31a9d ¤   ¤   ¤   -1, -1, -1, -1, -1,
812ef8 ¤   ¤   ¤   //kCreationDateCategory
998837 ¤   ¤   ¤   kIsOperator, kIsAtLeastOperator, kIsAtMostOperator,
541a9d ¤   ¤   ¤   -1, -1, -1, -1, -1,
e283d6 ¤   ¤   ¤   //kExpirationDateCategory
708837 ¤   ¤   ¤   kIsOperator, kIsAtLeastOperator, kIsAtMostOperator,
501a9d ¤   ¤   ¤   -1, -1, -1, -1, -1,
f6a105 ¤   ¤   };
eb1b52 ¤   ¤
1b1b52 ¤   ¤
4d38c8 Int16 CSearchPanel::sLastCategory;
48af5a
ab17f4 CSearchPanel::CSearchPanel(LStream *inStream)
4bbf75 ¤   :¤  LView(inStream)
8cbb36 {
--3344 000c2bae0f8401201c1 Page 2 of CSearchPanel.cp
7aefe6 }
46af5a
edd9b1 CSearchPanel::~CSearchPanel()
03bb36 {
79efe6 }
9eaf5a
416d52 ¤   void
616635 CSearchPanel::FinishCreateSelf()
59bb36 {
871cbb ¤   UInt32¤ timeNow;
a167c5 ¤
3f358f ¤   LView::FinishCreateSelf();
f4c3f6 ¤   mNumCategories = kNumCategories;
54a893 ¤   mCategoryPopup = (LPopupButton *)FindPaneByID(kCategoryPopup);
84144a ¤   mOperatorPopup = (LPopupButton *)FindPaneByID(kOperatorPopup);
6a148a ¤   mEditBox = (LEditText *)FindPaneByID(kEditBox);
eebad3 ¤   mLittleArrows = (LLittleArrows *)FindPaneByID(kLittleArrows);
b3b71f ¤   mDurationEdit = (CGADurationEditField *)FindPaneByID(kDurationEdit);
1967c5 ¤
c80e88 ¤   mAlgorithmPopup = (LPopupButton *)FindPaneByID(kAlgorithmPopup);
0952cc ¤   mAlgorithmPopup->AddListener(this);
0faf5a
e81dce ¤   mKeyPopup = (LPopupButton *)FindPaneByID(kKeyPopup);
49ad5a ¤   mKeyPopup->AddListener(this);
72af5a
c5ec93 ¤   mDurationEdit->SetDurationType(kDateDurationType);
7000fd ¤   GetDateTime(&timeNow);
dde457 ¤   mDurationEdit->SetDurationValue(timeNow);
69030f ¤   mCategoryPopup->AddListener(this);
ff0967 ¤   mLastArrowValue = mLittleArrows->GetValue();
6315b8 ¤   mLittleArrows->AddListener(this);
aedfad ¤   AdjustOperatorMenu();
944640 ¤   AdjustDataFields();
ac8d13 ¤   mEditBox->SwitchTarget(mEditBox);
fbefe6 }
5baf5a
c46d52 ¤   void
48b5c9 CSearchPanel::AdjustCategory(Boolean first)
ddbb36 {
63a03a ¤   if(first)
dfa9ac ¤   ¤   sLastCategory = 0;
7c0e24 ¤   else
7ec7a1 ¤   {
7fda0d ¤   ¤   sLastCategory = (sLastCategory + 1) % mNumCategories;
1c726c ¤   ¤   mCategoryPopup->SetValue(sLastCategory + 1);
8156f9 ¤   ¤   AdjustOperatorMenu();
c9b025 ¤   ¤   AdjustDataFields();
459371 ¤   }
fbefe6 }
c6af5a
3e6d52 ¤   void
b77357 CSearchPanel::AdjustDataFields()
61bb36 {
5b4b47 ¤   switch(mCategoryPopup->GetValue() - 1)
09c7a1 ¤   {
6681c3 ¤   ¤   case kUserIDCategory:
b15d80 ¤   ¤   case kKeySizeCategory:
6b3556 ¤   ¤   case kKeyIDCategory:
442944 ¤   ¤   ¤   mLittleArrows->Hide();
9d8709 ¤   ¤   ¤   mDurationEdit->Hide();
85977b ¤   ¤   ¤   mAlgorithmPopup->Hide();
63011e ¤   ¤   ¤   mKeyPopup->Hide();
8c886e ¤   ¤   ¤   mEditBox->Show();
02cdcb ¤   ¤   ¤   break;
407e3b ¤   ¤   case kKeyCategory:
2c2944 ¤   ¤   ¤   mLittleArrows->Hide();
938709 ¤   ¤   ¤   mDurationEdit->Hide();
c6977b ¤   ¤   ¤   mAlgorithmPopup->Hide();
926442 ¤   ¤   ¤   mEditBox->Hide();
6eed32 ¤   ¤   ¤   mKeyPopup->Show();
33cdcb ¤   ¤   ¤   break;
c27f80 ¤   ¤   case kKeyTypeCategory:
--8d7c 000fe7388ea401201c1 Page 3 of CSearchPanel.cp
742944 ¤   ¤   ¤   mLittleArrows->Hide();
e78709 ¤   ¤   ¤   mDurationEdit->Hide();
ae6442 ¤   ¤   ¤   mEditBox->Hide();
ab011e ¤   ¤   ¤   mKeyPopup->Hide();
d57b57 ¤   ¤   ¤   mAlgorithmPopup->Show();
d0cdcb ¤   ¤   ¤   break;
00fb08 ¤   ¤   case kCreationDateCategory:
46e101 ¤   ¤   case kExpirationDateCategory:
8a6442 ¤   ¤   ¤   mEditBox->Hide();
39977b ¤   ¤   ¤   mAlgorithmPopup->Hide();
38011e ¤   ¤   ¤   mKeyPopup->Hide();
cac568 ¤   ¤   ¤   mLittleArrows->Show();
ea6b25 ¤   ¤   ¤   mDurationEdit->Show();
d6cdcb ¤   ¤   ¤   break;
c09371 ¤   }
43efe6 }
1daf5a
e8c744 ¤   PGPError
866cf4 CSearchPanel::MakeFilter(PGPFilterRef *outFilter)
9ebb36 {
768f52 ¤   PGPError¤   ¤   ¤   err;
1ce179 ¤   PGPFilterRef¤   ¤   filter;
8fa99e ¤   char¤   ¤   ¤   ¤   cstring[256];
641f8f ¤   Str255¤ ¤   ¤   ¤   pstring;
767265 ¤   Int16¤  ¤   ¤   ¤   op,
630a7e ¤   ¤   ¤   ¤   ¤   ¤   cat;
c66ffd ¤   Int32¤  ¤   ¤   ¤   value32;
c64f19 ¤   UInt32¤ ¤   ¤   ¤   valueU32;
f19df9 ¤   PGPMatchCriterion¤  match;
6e4081 ¤   Boolean¤¤   ¤   ¤   boolValue,
46f01e ¤   ¤   ¤   ¤   ¤   ¤   negate = FALSE;
80ea37 ¤   PGPPublicKeyAlgorithm¤  algorithm;
3267c5 ¤
68d51a ¤   *outFilter = filter = kInvalidPGPFilterRef;
41585c ¤   err = kPGPError_UnknownError;
8ba317 ¤   cat = mCategoryPopup->GetValue() - 1;
4e6bd4 ¤   op = mOperatorPopup->GetValue() - 1;
1239b2 ¤   mEditBox->GetDescriptor(pstring);
a91a35 ¤   PToCString(pstring, cstring);
fb0df5 ¤   valueU32 = mDurationEdit->GetDurationValue();
b674ed ¤   switch(kCategoryOperators[cat][op])
55c7a1 ¤   {
03b00f ¤   ¤   case kIsOperator:
954c96 ¤   ¤   ¤   match = kPGPMatchEqual;
e6cdcb ¤   ¤   ¤   break;
27dc45 ¤   ¤   case kIsAtLeastOperator:
5599df ¤   ¤   ¤   match = kPGPMatchGreaterOrEqual;
9bcdcb ¤   ¤   ¤   break;
ed2865 ¤   ¤   case kIsAtMostOperator:
d9b2a8 ¤   ¤   ¤   match = kPGPMatchLessOrEqual;
d2cdcb ¤   ¤   ¤   break;
5b9371 ¤   }
bb65f9 ¤   switch(cat)
e6c7a1 ¤   {
1c81c3 ¤   ¤   case kUserIDCategory:
149d10 ¤   ¤   ¤   if(cstring[0] == '\0')
d0f622 ¤   ¤   ¤   ¤   break;
27e4db ¤   ¤   ¤   switch(kCategoryOperators[cat][op])
b8f776 ¤   ¤   ¤   {
901ba0 ¤   ¤   ¤   ¤   case kNotContainsOperator:
542844 ¤   ¤   ¤   ¤   ¤   negate = TRUE;
ba9a05 ¤   ¤   ¤   ¤   case kContainsOperator:
776b49 ¤   ¤   ¤   ¤   ¤   err = PGPNewUserIDStringFilter(
c4ddce ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, cstring,
8a074a ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMatchSubString, &filter);
f26aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
83f266 ¤   ¤   ¤   ¤   ¤   if(negate && IsntPGPError(err))
a94859 ¤   ¤   ¤   ¤   ¤   {
1041ac ¤   ¤   ¤   ¤   ¤   ¤   err = PGPNegateFilter(filter, outFilter);
666c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
ea1c89 ¤   ¤   ¤   ¤   ¤   }
fe4bd6 ¤   ¤   ¤   ¤   ¤   else
--eb4c 0001f81201e401201c1 Page 4 of CSearchPanel.cp
6c8dd9 ¤   ¤   ¤   ¤   ¤   ¤   *outFilter = filter;
6d14c3 ¤   ¤   ¤   ¤   ¤   break;
93fa13 ¤   ¤   ¤   ¤   case kIsNotOperator:
5b2844 ¤   ¤   ¤   ¤   ¤   negate = TRUE;
8b0e53 ¤   ¤   ¤   ¤   case kIsOperator:
e16b49 ¤   ¤   ¤   ¤   ¤   err = PGPNewUserIDStringFilter(
cbddce ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, cstring,
191571 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPMatchEqual, &filter);
a96aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
7df266 ¤   ¤   ¤   ¤   ¤   if(negate && IsntPGPError(err))
ee4859 ¤   ¤   ¤   ¤   ¤   {
f441ac ¤   ¤   ¤   ¤   ¤   ¤   err = PGPNegateFilter(filter, outFilter);
856c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
871c89 ¤   ¤   ¤   ¤   ¤   }
814bd6 ¤   ¤   ¤   ¤   ¤   else
0f8dd9 ¤   ¤   ¤   ¤   ¤   ¤   *outFilter = filter;
5b14c3 ¤   ¤   ¤   ¤   ¤   break;
1dce71 ¤   ¤   ¤   ¤   case kNotSignedByOperator:
712844 ¤   ¤   ¤   ¤   ¤   negate = TRUE;
504752 ¤   ¤   ¤   ¤   case kIsSignedByOperator:
59aa69 ¤   ¤   ¤   ¤   ¤   err = PGPNewUserIDStringFilter(gPGPContext,
8679dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cstring, kPGPMatchSubString, &filter);
196aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
146d77 ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err) && PGPFilterRefIsValid(filter))
094859 ¤   ¤   ¤   ¤   ¤   {
7d359e ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   filterSet;
9594aa ¤   ¤   ¤   ¤   ¤   ¤
3730fb ¤   ¤   ¤   ¤   ¤   ¤   err = PGPFilterKeySet(
b8e1fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet(),
0ea654 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   filter, &filterSet);
db6c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
016231 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeFilter(filter);
51ac09 ¤   ¤   ¤   ¤   ¤   ¤   filter = kInvalidPGPFilterRef;
f29cd4 ¤   ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err))
e58fec ¤   ¤   ¤   ¤   ¤   ¤   {
97ede2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = KeyIDFilterFromKeySet(filterSet, &filter);
47956f ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet(filterSet);
be9644 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(!PGPFilterRefIsValid(filter))
6106b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
3fff22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(kWANoteAlertType,
978f63 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle, kSearchPanelStringListID,
fb34aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNoSignerKeyExtantErrorStringID);
fb5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
c5db3c ¤   ¤   ¤   ¤   ¤   ¤   }
dc1c89 ¤   ¤   ¤   ¤   ¤   }
8aa1b7 ¤   ¤   ¤   ¤   ¤   if(negate && IsntPGPError(err) && PGPFilterRefIsValid(filte¶
22a767 r))
1e4859 ¤   ¤   ¤   ¤   ¤   {
1941ac ¤   ¤   ¤   ¤   ¤   ¤   err = PGPNegateFilter(filter, outFilter);
6f6c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
c31c89 ¤   ¤   ¤   ¤   ¤   }
cf4bd6 ¤   ¤   ¤   ¤   ¤   else
6c8dd9 ¤   ¤   ¤   ¤   ¤   ¤   *outFilter = filter;
1e14c3 ¤   ¤   ¤   ¤   ¤   break;
faa3a6 ¤   ¤   ¤   }
9fcdcb ¤   ¤   ¤   break;
985d80 ¤   ¤   case kKeySizeCategory:
703c61 ¤   ¤   ¤   if(pstring[0] == 0)
0cf622 ¤   ¤   ¤   ¤   break;
f55173 ¤   ¤   ¤   ::StringToNum(pstring, &value32);
ddf7bb ¤   ¤   ¤   err = PGPNewKeyEncryptKeySizeFilter(
3de054 ¤   ¤   ¤   ¤   ¤   gPGPContext, value32, match, outFilter);
3f524f ¤   ¤   ¤   pgpAssertNoErr(err);
58cdcb ¤   ¤   ¤   break;
dd3556 ¤   ¤   case kKeyIDCategory:
82f776 ¤   ¤   ¤   {
137d01 ¤   ¤   ¤   ¤   PGPKeyID keyID;
692b85 ¤   ¤   ¤   ¤
f3e365 ¤   ¤   ¤   ¤   err = PGPGetKeyIDFromString( cstring, &keyID);
fd3ed2 ¤   ¤   ¤   ¤   if(IsPGPError(err))
0372c3 ¤   ¤   ¤   ¤   {
1f15a1 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(kWANoteAlertType, kWAOKStyle,
--200c 000ed2243c9401201c1 Page 5 of CSearchPanel.cp
57d0b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSearchPanelStringListID,
39f8de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kBadKeyIDErrorStringID);
272613 ¤   ¤   ¤   ¤   }
88fa07 ¤   ¤   ¤   ¤   else
f672c3 ¤   ¤   ¤   ¤   {
5c3fe8 ¤   ¤   ¤   ¤   ¤   err = PGPNewKeyIDFilter(gPGPContext, &keyID, &filter);
a46aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
086765 ¤   ¤   ¤   ¤   ¤   if((kCategoryOperators[cat][op] == kIsNotOperator) &&
6095e9 ¤   ¤   ¤   ¤   ¤   ¤   IsntPGPError(err) && PGPFilterRefIsValid(filter))
e04859 ¤   ¤   ¤   ¤   ¤   {
1341ac ¤   ¤   ¤   ¤   ¤   ¤   err = PGPNegateFilter(filter, outFilter);
636c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
da1c89 ¤   ¤   ¤   ¤   ¤   }
714bd6 ¤   ¤   ¤   ¤   ¤   else
568dd9 ¤   ¤   ¤   ¤   ¤   ¤   *outFilter = filter;
232613 ¤   ¤   ¤   ¤   }
32a3a6 ¤   ¤   ¤   }
3acdcb ¤   ¤   ¤   break;
cf7e3b ¤   ¤   case kKeyCategory:
3ae4db ¤   ¤   ¤   switch(kCategoryOperators[cat][op])
27f776 ¤   ¤   ¤   {
380e53 ¤   ¤   ¤   ¤   case kIsOperator:
e8a642 ¤   ¤   ¤   ¤   ¤   boolValue = TRUE;
5814c3 ¤   ¤   ¤   ¤   ¤   break;
23fa13 ¤   ¤   ¤   ¤   case kIsNotOperator:
6250f3 ¤   ¤   ¤   ¤   ¤   boolValue = FALSE;
9514c3 ¤   ¤   ¤   ¤   ¤   break;
9aa3a6 ¤   ¤   ¤   }
e063c9 ¤   ¤   ¤   switch(mKeyPopup->GetValue())
b8f776 ¤   ¤   ¤   {
995584 ¤   ¤   ¤   ¤   case 1:
1b28ce ¤   ¤   ¤   ¤   ¤   err = PGPNewKeyRevokedFilter(
3fc2d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, boolValue, outFilter);
546aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
d114c3 ¤   ¤   ¤   ¤   ¤   break;
72bae0 ¤   ¤   ¤   ¤   case 2:
44a034 ¤   ¤   ¤   ¤   ¤   err = PGPNewKeyDisabledFilter(
26c2d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, boolValue, outFilter);
426aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
3214c3 ¤   ¤   ¤   ¤   ¤   break;
e0a3a6 ¤   ¤   ¤   }
b9cdcb ¤   ¤   ¤   break;
b77f80 ¤   ¤   case kKeyTypeCategory:
f5b28d ¤   ¤   ¤   switch(mAlgorithmPopup->GetValue())
2ef776 ¤   ¤   ¤   {
a05584 ¤   ¤   ¤   ¤   case 1:
02b1ae ¤   ¤   ¤   ¤   ¤   algorithm = kPGPPublicKeyAlgorithm_ElGamal;
8514c3 ¤   ¤   ¤   ¤   ¤   break;
b9bae0 ¤   ¤   ¤   ¤   case 2:
5d07b5 ¤   ¤   ¤   ¤   ¤   algorithm = kPGPPublicKeyAlgorithm_RSA;
3d14c3 ¤   ¤   ¤   ¤   ¤   break;
2ba3a6 ¤   ¤   ¤   }
8a564e ¤   ¤   ¤   err = PGPNewKeyEncryptAlgorithmFilter(
f9e635 ¤   ¤   ¤   ¤   ¤   gPGPContext, algorithm, outFilter);
b3524f ¤   ¤   ¤   pgpAssertNoErr(err);
38cdcb ¤   ¤   ¤   break;
8ffb08 ¤   ¤   case kCreationDateCategory:
b9109b ¤   ¤   ¤   if(match == kPGPMatchEqual)
80f776 ¤   ¤   ¤   {
7bfbc1 ¤   ¤   ¤   ¤   PGPFilterRef¤   mergeFilter;
c11059 ¤   ¤   ¤   ¤   DateTimeRec¤¤   endOfDay;
aae66b ¤   ¤   ¤   ¤   UInt32¤ ¤   ¤   endOfDaySeconds;
be2b85 ¤   ¤   ¤   ¤
acfa99 ¤   ¤   ¤   ¤   err = PGPNewKeyCreationTimeFilter(
e247ee ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, PGPTimeFromMacTime(valueU32),
b8c46e ¤   ¤   ¤   ¤   ¤   ¤   kPGPMatchGreaterOrEqual, &mergeFilter);
ee6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
dc2b85 ¤   ¤   ¤   ¤
14c52c ¤   ¤   ¤   ¤   SecondsToDate(valueU32, &endOfDay);
c9c2a7 ¤   ¤   ¤   ¤   endOfDay.hour¤  ¤   = 23;
aa35dd ¤   ¤   ¤   ¤   endOfDay.minute¤¤   = 59;
eda9f6 ¤   ¤   ¤   ¤   endOfDay.second¤¤   = 59;
--b490 00083dd7700401201c1 Page 6 of CSearchPanel.cp
e4165d ¤   ¤   ¤   ¤   DateToSeconds(&endOfDay, &endOfDaySeconds);
ee2b85 ¤   ¤   ¤   ¤
1dfa99 ¤   ¤   ¤   ¤   err = PGPNewKeyCreationTimeFilter(
c42fd0 ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, PGPTimeFromMacTime(endOfDaySeconds),
cb7a03 ¤   ¤   ¤   ¤   ¤   ¤   kPGPMatchLessOrEqual, &filter);
ea6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
232b85 ¤   ¤   ¤   ¤
cfaa31 ¤   ¤   ¤   ¤   err = PGPIntersectFilters(filter, mergeFilter, outFilter);
7e6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
41a3a6 ¤   ¤   ¤   }
e7bb8c ¤   ¤   ¤   else
29f776 ¤   ¤   ¤   {
71fa99 ¤   ¤   ¤   ¤   err = PGPNewKeyCreationTimeFilter(
3347ee ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, PGPTimeFromMacTime(valueU32),
c156c1 ¤   ¤   ¤   ¤   ¤   ¤   match, outFilter);
d76f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
1ea3a6 ¤   ¤   ¤   }
05cdcb ¤   ¤   ¤   break;
7de101 ¤   ¤   case kExpirationDateCategory:
03109b ¤   ¤   ¤   if(match == kPGPMatchEqual)
22f776 ¤   ¤   ¤   {
b1fbc1 ¤   ¤   ¤   ¤   PGPFilterRef¤   mergeFilter;
f01059 ¤   ¤   ¤   ¤   DateTimeRec¤¤   endOfDay;
9be66b ¤   ¤   ¤   ¤   UInt32¤ ¤   ¤   endOfDaySeconds;
a32b85 ¤   ¤   ¤   ¤
6109ad ¤   ¤   ¤   ¤   err = PGPNewKeyExpirationTimeFilter(
2747ee ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, PGPTimeFromMacTime(valueU32),
4ec46e ¤   ¤   ¤   ¤   ¤   ¤   kPGPMatchGreaterOrEqual, &mergeFilter);
fa6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
3d2b85 ¤   ¤   ¤   ¤
81c52c ¤   ¤   ¤   ¤   SecondsToDate(valueU32, &endOfDay);
5cc2a7 ¤   ¤   ¤   ¤   endOfDay.hour¤  ¤   = 23;
cb35dd ¤   ¤   ¤   ¤   endOfDay.minute¤¤   = 59;
84a9f6 ¤   ¤   ¤   ¤   endOfDay.second¤¤   = 59;
d9165d ¤   ¤   ¤   ¤   DateToSeconds(&endOfDay, &endOfDaySeconds);
cd2b85 ¤   ¤   ¤   ¤
cd09ad ¤   ¤   ¤   ¤   err = PGPNewKeyExpirationTimeFilter(
e32fd0 ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, PGPTimeFromMacTime(endOfDaySeconds),
147a03 ¤   ¤   ¤   ¤   ¤   ¤   kPGPMatchLessOrEqual, &filter);
236f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
362b85 ¤   ¤   ¤   ¤
edaa31 ¤   ¤   ¤   ¤   err = PGPIntersectFilters(filter, mergeFilter, outFilter);
006f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
5ca3a6 ¤   ¤   ¤   }
cdbb8c ¤   ¤   ¤   else
f7f776 ¤   ¤   ¤   {
2509ad ¤   ¤   ¤   ¤   err = PGPNewKeyExpirationTimeFilter(
bd47ee ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, PGPTimeFromMacTime(valueU32),
7b56c1 ¤   ¤   ¤   ¤   ¤   ¤   match, outFilter);
816f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
afa3a6 ¤   ¤   ¤   }
82cdcb ¤   ¤   ¤   break;
fe9ae3 ¤   ¤   default:
f9b783 ¤   ¤   ¤   pgpAssert(0);
459371 ¤   }
de5ea8 ¤   return err;
ccefe6 }
06af5a
04c744 ¤   PGPError
7c9b3f CSearchPanel::KeyIDFilterFromKeySet(
6346a5 ¤   PGPKeySetRef¤   keySet,
5786d3 ¤   PGPFilterRef¤   *filter)
20bb36 {
a417eb ¤   PGPError¤   ¤   error¤  = kPGPError_NoErr;
9dcfc4 ¤   PGPKeyListRef¤  list¤   = kInvalidPGPKeyListRef;
4fa8da ¤   PGPKeyIterRef¤  iter¤   = kInvalidPGPKeyIterRef;
2ac3c8 ¤   PGPKeyRef¤  ¤   key¤¤   = kInvalidPGPKeyRef;
9ac0ff ¤   PGPKeyID¤   ¤   keyID;
c7a780 ¤   PGPFilterRef¤   aFilter = kInvalidPGPFilterRef;
5b369e ¤   PGPFilterRef¤   idFilter= kInvalidPGPFilterRef;
1aaf5a
83c5e9 ¤   error = PGPOrderKeySet(keySet, kPGPAnyOrdering, &list);
--9e23 00093dc3f9b401201c1 Page 7 of CSearchPanel.cp
3e3b6a ¤   if( IsntPGPError(error))
1cc7a1 ¤   {
b7d0bd ¤   ¤   error = PGPNewKeyIter(list, &iter);
b5e0b6 ¤   ¤   if(IsntPGPError(error))
dd5b34 ¤   ¤   {
955229 ¤   ¤   ¤   PGPError iterError = kPGPError_NoErr;
afaf5a
0d6da3 ¤   ¤   ¤   do
84f776 ¤   ¤   ¤   {
a311f1 ¤   ¤   ¤   ¤   iterError = PGPKeyIterNext(iter, &key);
8b4897 ¤   ¤   ¤   ¤   if(IsntPGPError(iterError))
9972c3 ¤   ¤   ¤   ¤   {
f48265 ¤   ¤   ¤   ¤   ¤   error = PGPGetKeyIDFromKey(key, &keyID);
272679 ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(error))
564859 ¤   ¤   ¤   ¤   ¤   {
e13d9a ¤   ¤   ¤   ¤   ¤   ¤   error = PGPNewSigKeyIDFilter(gPGPContext,·
b77707 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID, &aFilter);
e5f938 ¤   ¤   ¤   ¤   ¤   ¤   if(idFilter == kInvalidPGPFilterRef)
ac46b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   idFilter = aFilter;
c97f8b ¤   ¤   ¤   ¤   ¤   ¤   else
488fec ¤   ¤   ¤   ¤   ¤   ¤   {
6e3fcf ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFilterRef combinedFilter = NULL;
c4af5a
d9a6fa ¤   ¤   ¤   ¤   ¤   ¤   ¤   error = PGPUnionFilters(idFilter, aFilter,·
25bbca ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &combinedFilter);
122fe1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   idFilter = combinedFilter;
29db3c ¤   ¤   ¤   ¤   ¤   ¤   }
9b1c89 ¤   ¤   ¤   ¤   ¤   }
522613 ¤   ¤   ¤   ¤   }
6573f3 ¤   ¤   ¤   } while(IsntPGPError(iterError) && IsntPGPError(error));
a0fb3c ¤   ¤   ¤   PGPFreeKeyIter(iter);
f90fe4 ¤   ¤   }
85572d ¤   ¤   PGPFreeKeyList(list);
589371 ¤   }
404de8 ¤   if(IsntPGPError(error))
3c1470 ¤   ¤   *filter = idFilter;
bbc674 ¤   return error;
5befe6 }
99af5a
366d52 ¤   void
c1f4ea CSearchPanel::AdjustOperatorMenu()
52bb36 {
fb36e5 ¤   Int16¤  ¤   itemIndex;
e3e4b0 ¤   Str255¤ ¤   itemString;
7e552e ¤   Int16¤  ¤   cat;
8970e8 ¤   Int32¤  ¤   numItems;
e967c5 ¤
b5a317 ¤   cat = mCategoryPopup->GetValue() - 1;
55a4e5 ¤   numItems = mOperatorPopup->GetMaxValue();
626b12 ¤   while( numItems > 0 )
ebf746 ¤   ¤   mOperatorPopup->DeleteMenuItem( numItems-- );
6a4e01 ¤   for(itemIndex = 0 ; itemIndex < kNumOperators ; itemIndex++)
ecc7a1 ¤   {
019c1a ¤   ¤   if(kCategoryOperators[cat][itemIndex] != -1)
185b34 ¤   ¤   {
d4d479 ¤   ¤   ¤   GetIndString(¤  itemString, kOperatorStringListID,
c4d9db ¤   ¤   ¤   ¤   ¤   ¤   ¤   kCategoryOperators[cat][itemIndex] + 1);
3e6a2e ¤   ¤   ¤   mOperatorPopup->AppendMenu(itemString, true);
760fe4 ¤   ¤   }
af9371 ¤   }
35a652 ¤   mOperatorPopup->SetValue(1);
7dedfe ¤   mOperatorPopup->Refresh();
fbefe6 }
3eaf5a
d16d52 ¤   void
ea190d CSearchPanel::ListenToMessage(MessageT inMessage, void *ioParam)
52bb36 {
8b9d98 ¤   Int32 newValue;
be67c5 ¤
b926d0 ¤   switch(inMessage)
10c7a1 ¤   {
936583 ¤   ¤   case kCategoryPopup:
--b27a 00105f0032d401201c1 Page 8 of CSearchPanel.cp
8b61f1 ¤   ¤   ¤   AdjustOperatorMenu();
941d7b ¤   ¤   ¤   AdjustDataFields();
fecdcb ¤   ¤   ¤   break;
ab4da5 ¤   ¤   case kLittleArrows:
ee0e9f ¤   ¤   ¤   newValue = *(Int32 *)ioParam;
205914 ¤   ¤   ¤   if(newValue < mLastArrowValue)
75d387 ¤   ¤   ¤   ¤   mDurationEdit->AdjustValue(kDownAdjust);
96bb8c ¤   ¤   ¤   else
07c8b8 ¤   ¤   ¤   ¤   mDurationEdit->AdjustValue(kUpAdjust);
4c8d3d ¤   ¤   ¤   mLastArrowValue = newValue;
2fcdcb ¤   ¤   ¤   break;
739371 ¤   }
f0efe6 }
05af5a
--aeee 00150167b0b401201c2 Page 1 of CSearchPanel.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
be62e6 ¤   $Id: CSearchPanel.h,v 1.13.8.1 1998/11/12 03:08:13 heller Exp $
c7f7f7 ____________________________________________________________________________*/
737b7d #pragma once
23af5a
c62c73 #include <LView.h>
b9f1a9 #include <LListener.h>
e9ea2f #include <LBroadcaster.h>
74ec08 #include <LLittleArrows.h>
76af5a
e7e82c #include "pgpPubTypes.h"
e0af5a
5c69c2 class CGADurationEditField;
fe980f class LEditText;
5d95ce class LPopupButton;
c4af5a
839e8a class CSearchPanel¤ :¤  public LView,
388565 ¤   ¤   ¤   ¤   ¤   ¤   public LListener,
27d72c ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster
e5bb36 {
4e5ed4 public:
d73263 ¤   enum { class_ID = 'sPan' };
bec155 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CSearchPanel(LStream *inStream);
709616 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ~CSearchPanel();
0f9a35 ¤   void¤   ¤   ¤   ¤   ¤   ¤   FinishCreateSelf();
7da386 ¤   void¤   ¤   ¤   ¤   ¤   ¤   ListenToMessage(MessageT¤   inMessage,
30f65f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void¤   ¤   *ioParam);
4459fc ¤   PGPError¤   ¤   ¤   ¤   ¤   MakeFilter(PGPFilterRef *outFilter);
be67c5 ¤
7c4043 ¤   void¤   ¤   ¤   ¤   ¤   ¤   AdjustCategory(Boolean¤ first);
bf0fb9 private:
1816ec ¤   void¤   ¤   ¤   ¤   ¤   ¤   AdjustOperatorMenu();
9ada34 ¤   void¤   ¤   ¤   ¤   ¤   ¤   AdjustDataFields();
8b349a ¤   PGPError¤   ¤   ¤   ¤   ¤   KeyIDFilterFromKeySet(
c380ac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   keySet,
929092 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFilterRef¤   *filter);
0767c5 ¤
58f1fe ¤   LPopupButton¤   ¤   ¤   ¤   *mCategoryPopup,
415cf4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mAlgorithmPopup,
a396c1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mKeyPopup,
03585f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mOperatorPopup;
2d3132 ¤   LEditText¤  ¤   ¤   ¤   ¤   *mEditBox;
a3b935 ¤   LLittleArrows¤  ¤   ¤   ¤   *mLittleArrows;
8292a2 ¤   CGADurationEditField¤   ¤   *mDurationEdit;
483eda ¤   Int16¤  ¤   ¤   ¤   ¤   ¤   mNumCategories;
3e67c5 ¤
c364bd ¤   Int32¤  ¤   ¤   ¤   ¤   ¤   mLastArrowValue;
6867c5 ¤
0aca23 ¤   static Int16¤   ¤   ¤   ¤   sLastCategory;
5267c5 ¤
fa55cb ¤   enum¤   {
670d13 ¤   ¤   ¤   ¤   kCategoryPopup¤ ¤   ¤   = 'pCat',
4371dc ¤   ¤   ¤   ¤   kOperatorPopup¤ ¤   ¤   = 'pOpe',
06e4bf ¤   ¤   ¤   ¤   kAlgorithmPopup¤¤   ¤   = 'pAlg',
df6fb3 ¤   ¤   ¤   ¤   kLittleArrows¤  ¤   ¤   = 'lArr',
49f165 ¤   ¤   ¤   ¤   kEditBox¤   ¤   ¤   ¤   = 'eTxt',
0eff02 ¤   ¤   ¤   ¤   kDurationEdit¤  ¤   ¤   = 'eDur',
7b2fc1 ¤   ¤   ¤   ¤   kKeyPopup¤  ¤   ¤   ¤   = 'pKey'
10c0bf ¤   ¤   ¤   };
d455cb ¤   enum¤   {
e72eaf ¤   ¤   ¤   ¤   kSearchPanelStringListID¤   ¤   = 1014,
0b9888 ¤   ¤   ¤   ¤   kBadKeyIDErrorStringID¤ ¤   ¤   = 1,
c6125a ¤   ¤   ¤   ¤   kNoSignerKeyExtantErrorStringID,
7cc7df ¤   ¤   ¤   ¤   kOperatorStringListID¤  ¤   ¤   = 1016
abc0bf ¤   ¤   ¤   };
1382f7 };
50af5a
--a2ad 000c748d8ca401201c3 Page 1 of CSearchWindow.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
8efaa4 ¤   $Id: CSearchWindow.cp,v 1.66.8.1 1998/11/12 03:08:14 heller Exp $
65f7f7 ____________________________________________________________________________*/
feaf5a
d64d37 #include <LowMem.h>
c7af5a
10dd06 #include <UDesktop.h>
d98f92 #include <UGAColorRamp.h>
c917f9 #include <UReanimator.h>
19c660 #include <UKeyFilters.h>
99d797 #include <LPushButton.h>
8b8708 #include <LCheckBox.h>
33bce5 #include <LIconPane.h>
c9a94f #include <LTextGroupBox.h>
d7cffe #include <LPlacard.h>
c60aae #include <LPopupButton.h>
6bb125 #include <LBevelButton.h>
1826cc #include <LChasingArrows.h>
e5dd56 #include <PP_Messages.h>
3d7b32 #include <PP_KeyCodes.h>
5b324c #include <string.h>
c2af5a
045cd1 #include "CSearchWindow.h"
31af5a
2f138b #include "CSearchPanel.h"
98b409 #include "CKeyView.h"
db6ff8 #include "CKeyTable.h"
d7b8cb #include "CPGPKeys.h"
649dc2 #include "CWarningAlert.h"
c65dc0 #include "ResourceConstants.h"
0daf5a
b5bf4a #include "MacSecureMemory.h"
4585c2 #include "MacStrings.h"
c4c97b #include "pgpClientPrefs.h"
7deb5b #include "pgpKeyServer.h"
70a02f #include "pgpClientLib.h"
ff9f63 #include "pgpEncode.h"
0de684 #include "pgpUserInterface.h"
ea2f8d #include "pgpErrors.h"
98af5a
92ab17 const Int16¤¤   kKeyViewTopSlop¤¤   ¤   = 7;
e7b99c const Int16¤¤   kKeyViewSideSlop¤   ¤   = -1;
7cd3df const Int16¤¤   kSearchBoxBorderSlop¤   = 4;
741772 const ResIDT¤   kSearchPanelID¤ ¤   ¤   = 134;
2ab211 const Int16¤¤   kMaxSearches¤   ¤   ¤   = 7;
f5af5a
81f989 enum¤   {
8e56e3 ¤   ¤   ¤   kSWStringListID ¤   = 1013,
235bfd ¤   ¤   ¤   kLocalKeyringStringID¤  ¤   ¤   = 1,
ddc15b ¤   ¤   ¤   kCurrentResultsStringID,
46725c ¤   ¤   ¤   kCancelSearchStringID,
79ea96 ¤   ¤   ¤   kSearchStringID,
a04541 ¤   ¤   ¤   kKeysFoundStringID,
d283ff ¤   ¤   ¤   kUnsupportedHKPFilterErrorStringID,
c2c484 ¤   ¤   ¤   kVerifyingSignaturesStringID,
6dd211 ¤   ¤   ¤   kAuthenticatePhraseStringID,
8ff6f9 ¤   ¤   ¤   kAuthRemoteServerStringID,
0ffe76 ¤   ¤   ¤   kImportServerKeyStringID,
3bb689 ¤   ¤   ¤   kDeletedKeysStringID,
cafb77 ¤   ¤   ¤   kDisabledKeysStringID,
02d0a6 ¤   ¤   ¤   kServerKeyChangedStringID,
ff9e7f ¤   ¤   ¤   kServerLimitExceedStringID,
b27908 ¤   ¤   ¤   kTLSAuthStringID
25a105 ¤   ¤   };
2af989 enum¤   {
0af0f6 ¤   ¤   ¤   kKSStringListID¤¤   = 1009
c7a105 ¤   ¤   };
--a1b6 000e14c254e401201c3 Page 2 of CSearchWindow.cp
e0af5a
494aef static PGPError ServerCallback(¤PGPContextRef¤  context,
4050a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent¤   ¤   *event,
f47757 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue¤   userValue);
f687ef static PGPError SigCheckCallback(¤  PGPContextRef¤  ¤   context,
52e69a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent¤   ¤   ¤   *event,
1f1cb4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue¤   ¤   userValue);
3d726b static void ServerThreadProc(LThread& thread, void *arg);
feaf5a
b4b5d8 CSearchWindow::CSearchWindow()
01bb36 {
51efe6 }
87af5a
27a5ea CSearchWindow::CSearchWindow(LStream *inStream)
0e28bf ¤   :¤  LWindow(inStream)
1ebb36 {
23efe6 }
f1af5a
e43d27 CSearchWindow::~CSearchWindow()
17bb36 {
30de10 ¤   SearchPanelList¤¤   *panelWalk,
390d24 ¤   ¤   ¤   ¤   ¤   ¤   *panelNext;
3bff64 ¤   Int32¤  ¤   ¤   ¤   selection;
691b52 ¤   ¤
5c401d ¤   if( IsntNull( mServers ) )
810ba2 ¤   ¤   PGPDisposePrefData( gPrefRef, mServers );
ffaf5a
3dca08 ¤   panelWalk = mSearchPanelList;
6684a7 ¤   while(IsntNull(panelWalk))
c1c7a1 ¤   {
ea8953 ¤   ¤   panelNext = panelWalk->next;
3c2412 ¤   ¤   pgpFree(panelWalk);
a8f2ee ¤   ¤   panelWalk = panelNext;
2e9371 ¤   }
f34c43 ¤   selection = mServerPopup->GetValue() - 1;
ee727a ¤   PGPSetPrefNumber( gPrefRef, kPGPPrefLastSearchWindowSelection, selection );
fd67c5 ¤
d57203 ¤   if( PGPKeySetRefIsValid( mActionInfo.authKeySet ) )
e04adc ¤   ¤   PGPFreeKeySet( mActionInfo.authKeySet );
e8efe6 }
94af5a
f66d52 ¤   void
68f583 CSearchWindow::FinishCreateSelf()
44bb36 {
d80305 ¤   LWindow::FinishCreateSelf();
bf0b67 ¤   mServers¤   ¤   ¤   ¤   = NULL;
349d72 ¤   mNumSearches¤   ¤   ¤   = 0;
40cb04 ¤   mActionInfo.done¤   ¤   = TRUE;
9ac675 ¤   mActionInfo.actionKeys¤ = kInvalidPGPKeySetRef;
e768c0 ¤   mActionInfo.authKeySet¤ = kInvalidPGPKeySetRef;
561ced ¤   mWorking¤   ¤   ¤   ¤   = FALSE;
0473d8 ¤   mLastServerValid¤   ¤   = FALSE;
187dc9 ¤   mSearchPanelList¤   ¤   = NULL;
68fb32 ¤   mPanelHeight¤   ¤   ¤   = 0;
09848a ¤   mSearchButton¤  ¤   ¤   = (LPushButton *)FindPaneByID(kSearchButton);
60c71c ¤   mClearSearchButton¤ ¤   = (LPushButton *)FindPaneByID(kClearSearchButton);
b62671 ¤   mMoreButton¤¤   ¤   ¤   = (LPushButton *)FindPaneByID(kMoreButton);
44829a ¤   mFewerButton¤   ¤   ¤   = (LPushButton *)FindPaneByID(kFewerButton);
e148de ¤   mServerPopup¤   ¤   ¤   = (LPopupButton *)FindPaneByID(kServerPopup);
c0c42a ¤   mSearchesBox¤   ¤   ¤   = (LTextGroupBox *)FindPaneByID(kSearchesBox);
007306 ¤   mPendingCheckBox¤   ¤   = (LCheckBox *)FindPaneByID( kPendingCheckbox );
9b434b ¤   mProgressArrows¤¤   ¤   = (LChasingArrows *)FindPaneByID( kProgressArrows );
d553a8 ¤   mHeaderPlacard¤ ¤   ¤   = (LPlacard *)FindPaneByID( kHeaderPlaque );
18af5a
905159 ¤   FillServerPopup();
7f67c5 ¤
b8d4fe ¤   mSearchButton->SetDefaultButton(true);
4528df ¤   mSearchButton->AddListener(this);
9a552f ¤   mClearSearchButton->AddListener(this);
d6d09a ¤   mMoreButton->AddListener(this);
c2ce92 ¤   mFewerButton->AddListener(this);
e1b141 ¤   mFewerButton->Disable();
--46db 000c52e2ebb401201c3 Page 3 of CSearchWindow.cp
e0af5a
1a3606 ¤   if( !gIsAdminConfigured )
045a21 ¤   ¤   mPendingCheckBox->Show();
b367c5 ¤
e3b5eb ¤   LCommander::SetDefaultCommander( this );
bc4b20 ¤   LPane::SetDefaultView( this );
e4af5a
048773 ¤   mKeyView = (CKeyView *)UReanimator::ReadObjects( 'PPob', kKeyViewResID );
bedef1 ¤   pgpAssertAddrValid(mKeyView, CKeyView *);
43e9a9 ¤   mKeyView->FinishCreate();
2609cb ¤   mKeyView->ResizeFrameBy(1,0,false);
fdaf5a
4de9cc ¤   mStatusCaption¤ ¤   ¤   = mKeyView->GetCaptionPane();
d8cfc1 ¤   mLockButton¤¤   ¤   ¤   = mKeyView->GetLockButton();
954f7e ¤   mUnlockButton¤  ¤   ¤   = mKeyView->GetUnlockButton();
e80c91 ¤   mLockMessage¤   ¤   ¤   = mLockButton->GetValueMessage();
d8f380 ¤   mLockButton->AddListener(this);
ac67c5 ¤
8eda5c ¤   mUnlockButton->Show();
e2af5a
dbb1df ¤   AddEmptySearch(TRUE);
a767c5 ¤
d2d4e7 ¤   SetThemeWindowBackground( GetMacPort(),
eb74b6 ¤   ¤   ¤   ¤   kThemeActiveModelessDialogBackgroundBrush, FALSE );
7c60d9 ¤   Show();
f4efe6 }
78af5a
696d52 ¤   void
2eec01 CSearchWindow::ApplyForeAndBackColors(void) const
4ebb36 {
ddfd67 ¤   LWindow::ApplyForeAndBackColors();
e56fea ¤   if( IsActive() )
7accb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
2574b6 ¤   ¤   ¤   ¤   kThemeActiveModelessDialogBackgroundBrush, FALSE );
360e24 ¤   else
19ccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
86737f ¤   ¤   ¤   ¤   kThemeInactiveModelessDialogBackgroundBrush, FALSE );
62efe6 }
90af5a
a06d52 ¤   void
7f1a2d CSearchWindow::AttemptClose()
ecbb36 {
a7ac65 ¤   if(!mWorking)
e7c7a1 ¤   {
678f4b ¤   ¤   BroadcastMessage(kSearchWindowClosed, NULL);
51a4ea ¤   ¤   LWindow::AttemptClose();
5e9371 ¤   }
d40e24 ¤   else
759eb3 ¤   ¤   ::SysBeep(1);
edefe6 }
dfaf5a
a96d52 ¤   void
bbe606 CSearchWindow::AddEmptySearch(Boolean¤  first)
18bb36 {
f1a892 ¤   SearchPanelList *panelList,
3eb214 ¤   ¤   ¤   ¤   ¤   *panelWalk;
744c7a ¤   Rect¤   ¤   ¤   frame;
d667c5 ¤
4cff77 ¤   if(IsNull(mSearchPanelList))
146f23 ¤   ¤   panelList = mSearchPanelList =
4a3a80 ¤   ¤   ¤   (SearchPanelList *)pgpAlloc(sizeof(SearchPanelList));
f40e24 ¤   else
c3c7a1 ¤   {
a2b6f9 ¤   ¤   panelList = (SearchPanelList *)pgpAlloc(sizeof(SearchPanelList));
521de5 ¤   ¤   for(panelWalk = mSearchPanelList; IsntNull(panelWalk->next) ;
ae3960 ¤   ¤   ¤   panelWalk = panelWalk->next)
0bb110 ¤   ¤   ¤   ;
6da105 ¤   ¤   panelWalk->next = panelList;
4c9371 ¤   }
1994df ¤   panelList->next = nil;
1ffec5 ¤   mNumSearches++;
c5b5eb ¤   LCommander::SetDefaultCommander( this );
--15b5 0005c01ca69401201c3 Page 4 of CSearchWindow.cp
1f532c ¤   LPane::SetDefaultView( mSearchesBox );
7ae6b0 ¤   panelList->panel = (CSearchPanel *)
68caaa ¤   ¤   UReanimator::ReadObjects( 'PPob', kSearchPanelID );
d650f2 ¤   pgpAssertAddrValid(panelList->panel, LView *);
7e936f ¤   panelList->panel->FinishCreate();
447afa ¤   panelList->panel->AddListener(this);
eacd8c ¤   panelList->panel->AdjustCategory(first);
4df70e ¤   panelList->panel->CalcLocalFrameRect(frame);
196b1f ¤   mPanelHeight = frame.bottom - frame.top;
29dc4a ¤   mSearchesBox->ResizeFrameBy(0, mPanelHeight, true);
18c8d8 ¤   panelList->panel->PlaceInSuperFrameAt(frame.left,
0d5c49 ¤   ¤   mPanelHeight * (mNumSearches - 1), true);
e99687 ¤   AdjustSizeToSearches();
e6fe85 ¤   ResizeWindowBy(0, mPanelHeight);
3dabd2 ¤   panelList->panel->Show();
41bd16 ¤   GetMinMaxSize(frame);
b07013 ¤   frame.top += mPanelHeight;
ebcd3a ¤   SetMinMaxSize(frame);
c1efe6 }
88af5a
a16d52 ¤   void
66d6be CSearchWindow::RemoveLastSearch()
c7bb36 {
dcf2b2 ¤   SearchPanelList *panelLast,
bab214 ¤   ¤   ¤   ¤   ¤   *panelWalk;
f94c7a ¤   Rect¤   ¤   ¤   frame;
23ae30 ¤   ¤   ¤   ¤   ¤
50ff77 ¤   if(IsNull(mSearchPanelList))
1699bf ¤   ¤   return;
2a6693 ¤   for(panelWalk = panelLast = mSearchPanelList;
1e9b86 ¤   ¤   IsntNull(panelWalk->next) ;)
f0c7a1 ¤   {
cc8e84 ¤   ¤   panelLast = panelWalk;
7a9aac ¤   ¤   panelWalk = panelWalk->next;
709371 ¤   }
7f2e08 ¤   delete panelWalk->panel;
1f3c78 ¤   if(panelWalk == mSearchPanelList)
f79277 ¤   ¤   mSearchPanelList = NULL;
73748e ¤   panelLast->next = NULL;
76d277 ¤   pgpFree(panelWalk);
3da4c2 ¤   mSearchesBox->ResizeFrameBy(0, -mPanelHeight, true);
c89687 ¤   AdjustSizeToSearches();
806386 ¤   mNumSearches--;
570cf9 ¤   ResizeWindowBy(0, -mPanelHeight);
f3bd16 ¤   GetMinMaxSize(frame);
ae1031 ¤   frame.top -= mPanelHeight;
09cd3a ¤   SetMinMaxSize(frame);
acefe6 }
3faf5a
ea6d52 ¤   void
2c03d2 CSearchWindow::FillServerPopup()
3dbb36 {
96f1ae ¤   PGPSize¤¤   len;
2561e0 ¤   PGPError¤   err;
b9e4b0 ¤   Str255¤ ¤   itemString;
64dab5 ¤   PGPUInt32¤  selection = 0;
8e70e8 ¤   Int32¤  ¤   numItems;
6e67c5 ¤
bfc7da ¤   numItems = mServerPopup->GetMaxValue();
b24edf ¤   while( numItems > 3 )
d71e9f ¤   ¤   mServerPopup->DeleteMenuItem( numItems-- );
a167c5 ¤
aab0d2 ¤   mNumServers = 0;
e4677d ¤   err = PGPGetPrefData(¤  gPrefRef,·
174118 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefKeyServerList,·
b84210 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &len,·
7e851c ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mServers);
15dd44 ¤   pgpAssertNoErr(err);
ecc8d0 ¤   if(IsntPGPError(err))
fec7a1 ¤   {
a11ca2 ¤   ¤   char¤   url[kMaxServerNameLength + 1];
5c1b52 ¤   ¤
--8749 00039a033df401201c3 Page 5 of CSearchWindow.cp
c96d36 ¤   ¤   mNumServers = len / sizeof(PGPKeyServerEntry);
9b164f ¤   ¤   for(Int16 serverIndex = 0; serverIndex < mNumServers; serverIndex++)
715b34 ¤   ¤   {
8a3f14 ¤   ¤   ¤   if( IsKeyServerListed( mServers[serverIndex].flags ) )
f9f776 ¤   ¤   ¤   {
b21739 ¤   ¤   ¤   ¤   PGPGetKeyServerURL( &mServers[serverIndex], url );
a93917 ¤   ¤   ¤   ¤   CToPString( url, itemString );
ad783e ¤   ¤   ¤   ¤   mServerPopup->AppendMenu( itemString );
7da3a6 ¤   ¤   ¤   }
aa0fe4 ¤   ¤   }
049371 ¤   }
53d0bf ¤   PGPGetPrefNumber( gPrefRef, kPGPPrefLastSearchWindowSelection, &selection );
9a88fb ¤   mServerPopup->SetValue( selection + 1 );
fbefe6 }
66af5a
486d52 ¤   void
c888d9 CSearchWindow::AdjustSizeToSearches()
8cbb36 {
b3c758 ¤   Rect¤   frame,
d9e7bd ¤   ¤   ¤   sbFrame,
30c3fc ¤   ¤   ¤   mbFrame,
fc6a31 ¤   ¤   ¤   fbFrame,
c631ba ¤   ¤   ¤   pbFrame,
0e2a45 ¤   ¤   ¤   kvFrame,
5bd92e ¤   ¤   ¤   plFrame;
2467c5 ¤
eb0f4b ¤   CalcPortFrameRect( frame );
e45d1a ¤   mSearchesBox->CalcPortFrameRect(sbFrame);
958fac ¤   mMoreButton->CalcPortFrameRect(mbFrame);
0d8653 ¤   mFewerButton->CalcPortFrameRect(fbFrame);
aa37ad ¤   mPendingCheckBox->CalcPortFrameRect(pbFrame);
0ff394 ¤   mHeaderPlacard->CalcPortFrameRect(plFrame);
f3bac8 ¤   mMoreButton->PlaceInSuperFrameAt(mbFrame.left,
291e89 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sbFrame.bottom + kSearchBoxBorderSlop,
4a5b4d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true);
90b03e ¤   mFewerButton->PlaceInSuperFrameAt(fbFrame.left,
b21e89 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sbFrame.bottom + kSearchBoxBorderSlop,
715b4d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true);
4f599e ¤   mPendingCheckBox->PlaceInSuperFrameAt(pbFrame.left,
031e89 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sbFrame.bottom + kSearchBoxBorderSlop,
545b4d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true);
568fac ¤   mMoreButton->CalcPortFrameRect(mbFrame);
ec7914 ¤   mHeaderPlacard->ResizeFrameTo(plFrame.right - plFrame.left,
97ceb8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mbFrame.bottom + kKeyViewTopSlop,
8c14f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   true);
51f394 ¤   mHeaderPlacard->CalcPortFrameRect(plFrame);
f2a97e ¤   mKeyView->PlaceInSuperFrameAt(kKeyViewSideSlop,
ae97fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   plFrame.bottom - 1,
a85b4d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true);
3c5abb ¤   mKeyView->CalcPortFrameRect(kvFrame);
4230b6 ¤   mKeyView->ResizeFrameTo(kvFrame.right - kvFrame.left,
7ad7cc ¤   ¤   ¤   ¤   ¤   ¤   ¤   frame.bottom - kvFrame.top + 1,
0d14f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   true);
afefe6 }
65af5a
eac744 ¤   PGPError
d41d58 CSearchWindow::MakeFilterFromPanels(PGPFilterRef *outFilter)
dcbb36 {
49fb19 ¤   PGPError¤   ¤   err;
f1fadc ¤   PGPFilterRef¤   filter,
4151c8 ¤   ¤   ¤   ¤   ¤   filter2;
d28d75 ¤   SearchPanelList¤*walk;
4267c5 ¤
c2d51a ¤   *outFilter = filter = kInvalidPGPFilterRef;
dc585c ¤   err = kPGPError_UnknownError;
be8a90 ¤   walk = mSearchPanelList;
098270 ¤   while(IsntNull(walk))
17c7a1 ¤   {
9dc600 ¤   ¤   walk->panel->MakeFilter(&filter2);
07988e ¤   ¤   if(!PGPFilterRefIsValid(filter2))
d75b34 ¤   ¤   {
3939dd ¤   ¤   ¤   if(PGPFilterRefIsValid(filter))
--e421 00086db20bc401201c3 Page 6 of CSearchWindow.cp
a5fde5 ¤   ¤   ¤   ¤   PGPFreeFilter(filter);
d88bc1 ¤   ¤   ¤   err = kPGPError_UnknownError;
6dfef4 ¤   ¤   ¤   goto fatalErr;
0d0fe4 ¤   ¤   }
d7b1bb ¤   ¤   if(PGPFilterRefIsValid(filter))
5d5b34 ¤   ¤   {
90a8e4 ¤   ¤   ¤   if(PGPFilterRefIsValid(filter2))
77f776 ¤   ¤   ¤   {
64cadb ¤   ¤   ¤   ¤   err = PGPIntersectFilters(filter, filter2, &filter);
9a6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
343ed2 ¤   ¤   ¤   ¤   if(IsPGPError(err))
4366a3 ¤   ¤   ¤   ¤   ¤   goto fatalErr;
e4a3a6 ¤   ¤   ¤   }
1f0fe4 ¤   ¤   }
370e1d ¤   ¤   else
4b6592 ¤   ¤   ¤   filter = filter2;
b25f6c ¤   ¤   walk = walk->next;
709371 ¤   }
a33cef ¤   *outFilter = filter;
186493 ¤   err = kPGPError_NoErr;
0d0fa4 fatalErr:
f75ea8 ¤   return err;
b5efe6 }
c767c5 ¤
e66d52 ¤   void
757787 CSearchWindow::FindCommandStatus(
71ea24 ¤   CommandT¤   inCommand,
0aa472 ¤   Boolean¤¤   &outEnabled,
6a3a4d ¤   Boolean¤¤   &outUsesMark,
675dc0 ¤   Char16¤ ¤   &outMark,
7ad894 ¤   Str255¤ ¤   outName)
31bb36 {
fd836e ¤   switch(inCommand)·
efc7a1 ¤   {
90b581 ¤   ¤   case cmd_ServerDisable:
d89c90 ¤   ¤   case cmd_ServerDelete:
f55b34 ¤   ¤   {
48a05f ¤   ¤   ¤   PGPUInt32¤  numKeys,
5e450c ¤   ¤   ¤   ¤   ¤   ¤   numUserIDs,
357546 ¤   ¤   ¤   ¤   ¤   ¤   numSigs;
8e87c7 ¤   ¤   ¤
18afe8 ¤   ¤   ¤   mKeyView->GetKeyTable()->GetSelectionStats(
e64aa1 ¤   ¤   ¤   ¤   ¤   &numKeys, &numUserIDs, &numSigs );
6d152d ¤   ¤   ¤   if( !mWorking && mLastServerValid && numKeys > 0 )
280329 ¤   ¤   ¤   ¤   outEnabled = true;
b3bb8c ¤   ¤   ¤   else
7b8eb8 ¤   ¤   ¤   ¤   outEnabled = false;
f9cdcb ¤   ¤   ¤   break;
d00fe4 ¤   ¤   }
7ba4f3 ¤   ¤   case cmd_Close:
219d13 ¤   ¤   ¤   if(mWorking)
1bf776 ¤   ¤   ¤   {
078eb8 ¤   ¤   ¤   ¤   outEnabled = false;
75f622 ¤   ¤   ¤   ¤   break;
dca3a6 ¤   ¤   ¤   }
c89ae3 ¤   ¤   default:
79088f ¤   ¤   ¤   ·LWindow::FindCommandStatus(inCommand, outEnabled,
708186 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outUsesMark, outMark, outName);
d7cdcb ¤   ¤   ¤   break;
849371 ¤   }
a5efe6 }
42af5a
fb7e69 ¤   Boolean
317987 CSearchWindow::ObeyCommand(
e4ea24 ¤   CommandT¤   inCommand,
120597 ¤   void¤   ¤   *ioParam)
78bb36 {
e15b52 ¤   Boolean¤¤   cmdHandled = true;
0167c5 ¤
620617 ¤   switch( inCommand )
0ec7a1 ¤   {
869c90 ¤   ¤   case cmd_ServerDelete:
--f420 00003cc02a0401201c3 Page 7 of CSearchWindow.cp
46b581 ¤   ¤   case cmd_ServerDisable:
c65b34 ¤   ¤   {
5f9088 ¤   ¤   ¤   PGPKeySetRef¤   selKeys;
dd87c7 ¤   ¤   ¤
0451e4 ¤   ¤   ¤   mKeyView->GetKeyTable()->GetSelectedKeySet( &selKeys );
ca1005 ¤   ¤   ¤   if( PGPKeySetRefIsValid( selKeys ) )
10f776 ¤   ¤   ¤   {
c41ead ¤   ¤   ¤   ¤   Str255¤ str;
2b2b85 ¤   ¤   ¤   ¤
4ce3e6 ¤   ¤   ¤   ¤   mStatusCaption->SetDescriptor("\p");
a3bdcf ¤   ¤   ¤   ¤   ::GetIndString(str, kSWStringListID, kCancelSearchStringID);
7f807e ¤   ¤   ¤   ¤   mSearchButton->SetDescriptor(str);
9cf89c ¤   ¤   ¤   ¤   mSearchButton->Draw(NULL);
ad8be0 ¤   ¤   ¤   ¤   mClearSearchButton->Disable();
149a9d ¤   ¤   ¤   ¤   mProgressArrows->Show();
3561e7 ¤   ¤   ¤   ¤   mLockButton->Hide();
7c03f8 ¤   ¤   ¤   ¤   mUnlockButton->Show();
4f60cf ¤   ¤   ¤   ¤   StartServerThread(¤ inCommand, kInvalidPGPFilterRef,
91dc32 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   selKeys,
672fd4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mLastServer );
4ca3a6 ¤   ¤   ¤   }
94cdcb ¤   ¤   ¤   break;
3d0fe4 ¤   ¤   }
419ae3 ¤   ¤   default:
a916e6 ¤   ¤   ¤   cmdHandled = LWindow::ObeyCommand(inCommand, ioParam);
79cdcb ¤   ¤   ¤   break;
949371 ¤   }
f267c5 ¤
8c51a4 ¤   return cmdHandled;
19efe6 }
c2af5a
596d52 ¤   void
bf7283 CSearchWindow::ListenToMessage(MessageT inMessage, void *ioParam)
83bb36 {
b161e0 ¤   PGPError¤   err;
8967c5 ¤
8b1ae4 ¤   if( inMessage == mLockMessage )
56c7a1 ¤   {
704815 ¤   ¤   Str255¤ ¤   ¤   string;
376cc4 ¤   ¤   char¤   ¤   ¤   cstring[256],
4c81a6 ¤   ¤   ¤   ¤   ¤   ¤   serverURL[256];
ac3f50 ¤   ¤   PGPKeyRef¤  ¤   authKey;
8def13 ¤   ¤   PGPKeyListRef¤  keyList;
ecfd15 ¤   ¤   PGPKeyIterRef¤  keyIter;
eeaf5a
57fd54 ¤   ¤   if( PGPKeySetRefIsValid( mActionInfo.authKeySet ) )
6a5b34 ¤   ¤   {
003471 ¤   ¤   ¤   err = PGPOrderKeySet( mActionInfo.authKeySet, kPGPAnyOrdering,
ac3726 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyList );¤CKERR;
cd56fe ¤   ¤   ¤   err = PGPNewKeyIter( keyList, &keyIter );¤  CKERR;
dcec42 ¤   ¤   ¤   if( IsntPGPError( PGPKeyIterNext( keyIter, &authKey ) ) )
c3f776 ¤   ¤   ¤   {
6dd183 ¤   ¤   ¤   ¤   GetIndString( string, kSWStringListID, kTLSAuthStringID );
2e8a16 ¤   ¤   ¤   ¤   PToCString( string, cstring );
cf8e6a ¤   ¤   ¤   ¤   PGPGetKeyServerURL( &mLastServer, serverURL );
dc0800 ¤   ¤   ¤   ¤   PGPConfirmRemoteKeyDialog( cstring, serverURL, authKey,
d889ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mActionInfo.tlsCipher, FALSE );
61a3a6 ¤   ¤   ¤   }
145154 ¤   ¤   ¤   PGPFreeKeyIter( keyIter );
d22f08 ¤   ¤   ¤   PGPFreeKeyList( keyList );
e70fe4 ¤   ¤   }
719371 ¤   }
088e2d ¤   else switch(inMessage)
98c7a1 ¤   {
15bbdd ¤   ¤   case kMoreButton:
376bf8 ¤   ¤   ¤   if(mNumSearches < kMaxSearches)
3bf776 ¤   ¤   ¤   {
a8d3c8 ¤   ¤   ¤   ¤   AddEmptySearch(false);
aa1dbc ¤   ¤   ¤   ¤   mFewerButton->Enable();
79be74 ¤   ¤   ¤   ¤   if(mNumSearches == kMaxSearches)
5aa2c3 ¤   ¤   ¤   ¤   ¤   mMoreButton->Disable();
03a3a6 ¤   ¤   ¤   }
--2cdc 0005422a2d6401201c3 Page 8 of CSearchWindow.cp
7ecdcb ¤   ¤   ¤   break;
48dd4c ¤   ¤   case kFewerButton:
e4c80c ¤   ¤   ¤   if(mNumSearches > 1)
0bf776 ¤   ¤   ¤   {
3a3cc3 ¤   ¤   ¤   ¤   RemoveLastSearch();
6acf9e ¤   ¤   ¤   ¤   if(mNumSearches == kMaxSearches - 1)
6de568 ¤   ¤   ¤   ¤   ¤   mMoreButton->Enable();
b0dbd2 ¤   ¤   ¤   ¤   if(mNumSearches == 1)
dc342a ¤   ¤   ¤   ¤   ¤   mFewerButton->Disable();
16a3a6 ¤   ¤   ¤   }
b2cdcb ¤   ¤   ¤   break;
c705c5 ¤   ¤   case kSearchButton:
626049 ¤   ¤   ¤   if(mActionInfo.done)
174c32 ¤   ¤   ¤   ¤   Search();
3cbb8c ¤   ¤   ¤   else
f22ed3 ¤   ¤   ¤   ¤   mActionInfo.abort = TRUE;
abcdcb ¤   ¤   ¤   break;
5e0c27 ¤   ¤   case kClearSearchButton:
ea49cf ¤   ¤   ¤   while(mNumSearches > 0)
ea3cc3 ¤   ¤   ¤   ¤   RemoveLastSearch();
b70f83 ¤   ¤   ¤   AddEmptySearch(TRUE);
c0b0fd ¤   ¤   ¤   mStatusCaption->SetDescriptor("\p");
16377f ¤   ¤   ¤   mFewerButton->Disable();
7eaad7 ¤   ¤   ¤   mMoreButton->Enable();
60cdcb ¤   ¤   ¤   break;
6911ee ¤   ¤   case kRebuildServersMessage:
e18d91 ¤   ¤   ¤   if( IsntNull( mServers ) )
fba6d4 ¤   ¤   ¤   ¤   PGPDisposePrefData( gPrefRef, mServers );
74a790 ¤   ¤   ¤   FillServerPopup();
adcdcb ¤   ¤   ¤   break;
499371 ¤   }
d9b38c done:
72830f ¤   return;
46efe6 }
20af5a
ed66dd ¤   static PGPError
8fd922 ImportNewServerKey(
8cfb7a ¤   PGPKeyRef¤  ¤   ¤   key,
42f032 ¤   PGPInt32¤   ¤   ¤   keyAlg,
725cba ¤   PGPKeyID¤   ¤   ¤   *keyID,
33e2d6 ¤   PGPKeyServerEntry¤  *entry )
60bb36 {
8d3bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
5c9e3c ¤   PGPKeySetRef¤   keySet;
7067c5 ¤
947de0 ¤   err = PGPGetKeyIDString( keyID, kPGPKeyIDString_Full,
f013ed ¤   ¤   ¤   ¤   ¤   entry->authKeyIDString );¤  CKERR;
ae0ea4 ¤   entry->authAlg = (PGPPublicKeyAlgorithm) keyAlg;
26af5a
801a11 ¤   err = PGPNewSingletonKeySet( key, &keySet );¤   CKERR;
d30059 ¤   CPGPKeys::TheApp()->GetDefaultKeyView()->GetKeyTable()->
c67fc2 ¤   ¤   ImportKeysFromKeySet( keySet );
4367c5 ¤
4fb38c done:
0a5ea8 ¤   return err;
a1efe6 }
93af5a
06c744 ¤   PGPError
eb3de6 ServerCallback(
b4520e ¤   PGPContextRef¤  context,
c06fdc ¤   PGPEvent¤   ¤   *event,
3b4c20 ¤   PGPUserValue¤   userValue)
0cbb36 {
c63bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
89fddc ¤   KSCallbackInfo¤ *callbackInfo = (KSCallbackInfo *)userValue;
2b3888 ¤   Str255¤ ¤   ¤   caption,
d2d78e ¤   ¤   ¤   ¤   ¤   moreCaption;
890e87 ¤   char¤   ¤   ¤   cstr[256];
4867c5 ¤
c3a505 ¤   switch( event->type )
11c7a1 ¤   {
54fe34 ¤   ¤   case kPGPEvent_KeyServerEvent:
--8850 0004871c013401201c3 Page 9 of CSearchWindow.cp
235173 ¤   ¤   ¤   if(LMGetTicks() - callbackInfo->lastIncrement > 5)
4cf776 ¤   ¤   ¤   {
7e6084 ¤   ¤   ¤   ¤   callbackInfo->lastIncrement = LMGetTicks();
53eb23 ¤   ¤   ¤   ¤   if(callbackInfo->lastState != event->data.keyServerData.state)
7772c3 ¤   ¤   ¤   ¤   {
c7c7f8 ¤   ¤   ¤   ¤   ¤   char¤   ¤   url[kMaxServerNameLength + 1];
66ae30 ¤   ¤   ¤   ¤   ¤
d806c7 ¤   ¤   ¤   ¤   ¤   moreCaption[0] = 0;
f14311 ¤   ¤   ¤   ¤   ¤   PGPGetKeyServerURL( &callbackInfo->serverInfo, url );
e2e24d ¤   ¤   ¤   ¤   ¤   CToPString( url, moreCaption );
8f6f4f ¤   ¤   ¤   ¤   ¤   GetIndString(caption, kKSStringListID,
484d5e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   event->data.keyServerData.state);
f66028 ¤   ¤   ¤   ¤   ¤   AppendPString(moreCaption, caption);
3bf453 ¤   ¤   ¤   ¤   ¤   callbackInfo->statusCaption->SetDescriptor(caption);
470af7 ¤   ¤   ¤   ¤   ¤   callbackInfo->lastState = event->data.keyServerData.state;
7d2613 ¤   ¤   ¤   ¤   }
49a3a6 ¤   ¤   ¤   }
838afb ¤   ¤   ¤   if(callbackInfo->abort)
1a4067 ¤   ¤   ¤   ¤   err = kPGPError_UserAbort;
35cdcb ¤   ¤   ¤   break;
5e4315 ¤   ¤   case kPGPEvent_KeyServerSignEvent:
0a5b34 ¤   ¤   {
1f55fe ¤   ¤   ¤   PGPKeyRef¤  ¤   authKey = kInvalidPGPKeyRef;
1850f7 ¤   ¤   ¤   char¤   ¤   ¤   *passphrase = NULL;
e387c7 ¤   ¤   ¤
58456a ¤   ¤   ¤   GetIndString( caption, kSWStringListID,
aca0db ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAuthenticatePhraseStringID );
1601c1 ¤   ¤   ¤   PToCString( caption, cstr );
6084a8 ¤   ¤   ¤   err = PGPSigningPassphraseDialog( gPGPContext,
029725 ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet(),
61fdfd ¤   ¤   ¤   ¤   ¤   ¤   &authKey,
60326b ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt( gPGPContext, cstr ),
688fe7 ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( gPGPContext, &passphrase ),
5b537d ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
341de3 ¤   ¤   ¤   if( IsntPGPError( err ) && IsntNull( passphrase ) )
1af776 ¤   ¤   ¤   {
6ca755 ¤   ¤   ¤   ¤   err = PGPAddJobOptions( event->job,
a25b44 ¤   ¤   ¤   ¤   ¤   ¤   PGPOSignWithKey( gPGPContext, authKey,
2b3e70 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphraseBuffer( gPGPContext, passphrase,
e88482 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   strlen( passphrase ) ),
9aad51 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) ),
183f32 ¤   ¤   ¤   ¤   ¤   ¤   PGPOClearSign( gPGPContext, TRUE ),
15537d ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
b58ed9 ¤   ¤   ¤   ¤   PGPFreeData( passphrase );
f3a3a6 ¤   ¤   ¤   }
cecdcb ¤   ¤   ¤   break;
ee0fe4 ¤   ¤   }
330ff6 ¤   ¤   case kPGPEvent_KeyServerTLSEvent:
875b34 ¤   ¤   {
e759b6 ¤   ¤   ¤   PGPtlsSessionRef¤   tls = event->data.keyServerTLSData.tlsSession;
ac5864 ¤   ¤   ¤   PGPKeyRef¤  ¤   ¤   remoteKey;
9f2b8f ¤   ¤   ¤   PGPInt32¤   ¤   ¤   remoteKeyAlg;
1e7c15 ¤   ¤   ¤   PGPKeyID¤   ¤   ¤   keyID,
037763 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   expectedID;
36212a ¤   ¤   ¤   char¤   ¤   ¤   ¤   authUserID[256];
b4a476 ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   authUserIDLen;
31496f ¤   ¤   ¤   char¤   ¤   ¤   ¤   url[256];
7287c7 ¤   ¤   ¤
079b9e ¤   ¤   ¤   err = PGPtlsGetRemoteAuthenticatedKey( tls, &remoteKey );
9859df ¤   ¤   ¤   if( IsPGPError( err ) )
bcf622 ¤   ¤   ¤   ¤   break;
c384d0 ¤   ¤   ¤   err = PGPNewSingletonKeySet( remoteKey,
40c657 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &callbackInfo->authKeySet );
3959df ¤   ¤   ¤   if( IsPGPError( err ) )
d3f622 ¤   ¤   ¤   ¤   break;
130acd ¤   ¤   ¤   PGPtlsGetNegotiatedCipherSuite( tls, &callbackInfo->tlsCipher );
d69c9c ¤   ¤   ¤   PGPGetPrimaryUserIDNameBuffer( remoteKey, sizeof(authUserID),
a2de11 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   authUserID, &authUserIDLen );
ced501 ¤   ¤   ¤   GetIndString( caption, kSWStringListID, kAuthRemoteServerStringID );
5c15ea ¤   ¤   ¤   CToPString( authUserID, moreCaption );
a65c00 ¤   ¤   ¤   AppendPString(moreCaption, caption);
487960 ¤   ¤   ¤   callbackInfo->statusCaption->SetDescriptor(caption);
--f690 0007cc55417401201c3 Page 10 of CSearchWindow.cp
e587c7 ¤   ¤   ¤
b7bbb8 ¤   ¤   ¤   err = PGPGetKeyIDFromKey( remoteKey, &keyID );
a959df ¤   ¤   ¤   if( IsPGPError( err ) )
75f622 ¤   ¤   ¤   ¤   break;
4ccb26 ¤   ¤   ¤   err = PGPGetKeyNumber( remoteKey, kPGPKeyPropAlgID,
04599b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &remoteKeyAlg );
2359df ¤   ¤   ¤   if( IsPGPError( err ) )
3ff622 ¤   ¤   ¤   ¤   break;
d8c64d ¤   ¤   ¤   if( callbackInfo->serverInfo.authAlg !=
5a0e3b ¤   ¤   ¤   ¤   kPGPPublicKeyAlgorithm_Invalid )
10a092 ¤   ¤   ¤   ¤   err = PGPGetKeyIDFromString(
605c6b ¤   ¤   ¤   ¤   ¤   ¤   callbackInfo->serverInfo.authKeyIDString,
30611b ¤   ¤   ¤   ¤   ¤   ¤   &expectedID );
d859df ¤   ¤   ¤   if( IsPGPError( err ) )
c9f622 ¤   ¤   ¤   ¤   break;
fb2cc8 ¤   ¤   ¤   if( ( callbackInfo->serverInfo.authAlg ==
71e00c ¤   ¤   ¤   ¤   ¤   kPGPPublicKeyAlgorithm_Invalid ) ||
2a14e2 ¤   ¤   ¤   ¤   ¤   PGPCompareKeyIDs( &expectedID, &keyID ) )
b0f776 ¤   ¤   ¤   {
fe4a58 ¤   ¤   ¤   ¤   // Put up Authentication Confirmation Dialog
aea376 ¤   ¤   ¤   ¤   // with customized text stating that the
5b66ac ¤   ¤   ¤   ¤   // server key has changed. ·If the user does
6ea710 ¤   ¤   ¤   ¤   // not approve the key, return an error and
06420a ¤   ¤   ¤   ¤   // do not set lock icon. ·If the user does
0b0cb4 ¤   ¤   ¤   ¤   // approve the key, set the new key in the
1f998c ¤   ¤   ¤   ¤   // KeyServerEntry and save it
da2b85 ¤   ¤   ¤   ¤
2810c6 ¤   ¤   ¤   ¤   GetIndString( caption, kSWStringListID,
9dc394 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kServerKeyChangedStringID );
ea0779 ¤   ¤   ¤   ¤   PToCString( caption, cstr );
3c55a7 ¤   ¤   ¤   ¤   PGPGetKeyServerURL( &callbackInfo->serverInfo, url );
e918de ¤   ¤   ¤   ¤   UDesktop::Deactivate();
81817a ¤   ¤   ¤   ¤   err = PGPConfirmRemoteKeyDialog( cstr, url, remoteKey,
38621d ¤   ¤   ¤   ¤   ¤   ·callbackInfo->tlsCipher, TRUE );
25090b ¤   ¤   ¤   ¤   UDesktop::Activate();
7d5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
6f72c3 ¤   ¤   ¤   ¤   {
29196f ¤   ¤   ¤   ¤   ¤   err = ImportNewServerKey( remoteKey, remoteKeyAlg,
c69aa8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID, &callbackInfo->serverInfo );
63d277 ¤   ¤   ¤   ¤   ¤   callbackInfo->serverChanged = TRUE;
d32613 ¤   ¤   ¤   ¤   }
c7a3a6 ¤   ¤   ¤   }
9d698b ¤   ¤   ¤   if( IsntPGPError( err ) )
5df776 ¤   ¤   ¤   {
f64098 ¤   ¤   ¤   ¤   callbackInfo->unlockButton->Hide();
7736bd ¤   ¤   ¤   ¤   callbackInfo->lockButton->Show();
03a3a6 ¤   ¤   ¤   }
bacdcb ¤   ¤   ¤   break;
9d0fe4 ¤   ¤   }
39deeb ¤   ¤   case kPGPEvent_KeyServerIdleEvent:
7d8893 ¤   ¤   ¤   LThread::Yield();
f858ad ¤   ¤   ¤   if( callbackInfo->abort && IsntNull( callbackInfo->server ) )
6a437f ¤   ¤   ¤   ¤   PGPCancelKeyServerCall( callbackInfo->server );
40cdcb ¤   ¤   ¤   break;
dff828 ¤   }¤
a25ea8 ¤   return err;
75efe6 }
56af5a
806d52 ¤   void
f3af33 CSearchWindow::SpendTime(const EventRecord¤ &inMacEvent)
73bb36 {
37ef42 ¤   if(mActionInfo.done)
b0c7a1 ¤   {
367404 ¤   ¤   PGPUInt32¤  numKeys = 0;
22515a ¤   ¤   Str255¤ ¤   numStr,
cef14c ¤   ¤   ¤   ¤   ¤   str;
a2d031 ¤   ¤   PGPError¤   err;
eb1b52 ¤   ¤
7709b7 ¤   ¤   StopRepeating();
244e34 ¤   ¤   mProgressArrows->Hide();
4a1b52 ¤   ¤
7ccc32 ¤   ¤   str[0] = 0;
--5832 0001aea3d6b401201c3 Page 11 of CSearchWindow.cp
e57ac8 ¤   ¤   if( PGPKeySetRefIsValid( mActionInfo.actionKeys ) )
e85b34 ¤   ¤   {
8a1a31 ¤   ¤   ¤   err = PGPCountKeys(mActionInfo.actionKeys, &numKeys);
85524f ¤   ¤   ¤   pgpAssertNoErr(err);
a06f06 ¤   ¤   ¤   switch( mActionInfo.command )
8ef776 ¤   ¤   ¤   {
a80625 ¤   ¤   ¤   ¤   case cmd_Search:
97a253 ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( mActionInfo.result ) ||
362a39 ¤   ¤   ¤   ¤   ¤   ¤   ( numKeys > 0 ) )
d74859 ¤   ¤   ¤   ¤   ¤   {
1c9fb5 ¤   ¤   ¤   ¤   ¤   ¤   mKeyView->CloseKeys();
9d52b4 ¤   ¤   ¤   ¤   ¤   ¤   mKeyView->SetKeyDBInfo(mActionInfo.actionKeys,
3e3ece ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   false, false);
1f1c89 ¤   ¤   ¤   ¤   ¤   }
9f16cc ¤   ¤   ¤   ¤   ¤   GetIndString( str, kSWStringListID, kKeysFoundStringID );
b914c3 ¤   ¤   ¤   ¤   ¤   break;
2d6ab9 ¤   ¤   ¤   ¤   default:
6bdcf2 ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( mActionInfo.actionKeys );
f66720 ¤   ¤   ¤   ¤   ¤   mActionInfo.actionKeys = kInvalidPGPKeySetRef;
7b929c ¤   ¤   ¤   ¤   ¤   GetIndString( str, kSWStringListID,
f5d757 ¤   ¤   ¤   ¤   ¤   ¤   mActionInfo.command == cmd_ServerDelete ?
fc73c7 ¤   ¤   ¤   ¤   ¤   ¤   kDeletedKeysStringID : ·kDisabledKeysStringID );
0014c3 ¤   ¤   ¤   ¤   ¤   break;
05a3a6 ¤   ¤   ¤   }
6e0fe4 ¤   ¤   }
040993 ¤   ¤   if( mActionInfo.result != kPGPError_UserAbort )
155b34 ¤   ¤   {
aab7f0 ¤   ¤   ¤   if( mActionInfo.result == kPGPError_ServerPartialSearchResults )
90f776 ¤   ¤   ¤   {
bbc730 ¤   ¤   ¤   ¤   GetIndString( str, kSWStringListID,
55b14d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kServerLimitExceedStringID );
4d3c52 ¤   ¤   ¤   ¤   NumToString( numKeys, numStr );
4b18b2 ¤   ¤   ¤   ¤   PrintPString( str, str, numStr );
38a3a6 ¤   ¤   ¤   }
3e793a ¤   ¤   ¤   else if( IsPGPError( mActionInfo.result ) )
e5f776 ¤   ¤   ¤   {
2c7e4e ¤   ¤   ¤   ¤   if(mActionInfo.result == kPGPError_UnsupportedHKPFilter)
7172c3 ¤   ¤   ¤   ¤   {
a2c4ab ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType,
070c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
f3e6dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSWStringListID,
607be1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kUnsupportedHKPFilterErrorStringID);
1f2613 ¤   ¤   ¤   ¤   }
fdfa07 ¤   ¤   ¤   ¤   else
5ac6fd ¤   ¤   ¤   ¤   ¤   ReportPGPError(mActionInfo.result);
0240a3 ¤   ¤   ¤   ¤   str[0] = 0;
fba3a6 ¤   ¤   ¤   }
adbb8c ¤   ¤   ¤   else
08f776 ¤   ¤   ¤   {
b93c52 ¤   ¤   ¤   ¤   NumToString( numKeys, numStr );
6618b2 ¤   ¤   ¤   ¤   PrintPString( str, str, numStr );
11a3a6 ¤   ¤   ¤   }
a10fe4 ¤   ¤   }
880e1d ¤   ¤   else
a6b6c6 ¤   ¤   ¤   str[0] = 0;
2abe5c ¤   ¤   mStatusCaption->SetDescriptor( str );
6aa4f1 ¤   ¤   if( PGPFilterRefIsValid( mActionInfo.filter ) )
595b34 ¤   ¤   {
e5834e ¤   ¤   ¤   err = PGPFreeFilter( mActionInfo.filter );
cc524f ¤   ¤   ¤   pgpAssertNoErr(err);
a80fe4 ¤   ¤   }
5aaf3e ¤   ¤   GetIndString( str, kSWStringListID, kSearchStringID );
27c954 ¤   ¤   mSearchButton->SetDescriptor(str);
3981eb ¤   ¤   mClearSearchButton->Enable();
3c7a0b ¤   ¤   BroadcastMessage(kSearchComplete, NULL);
872e47 ¤   ¤   mWorking = FALSE;
6e1b52 ¤   ¤
be8198 ¤   ¤   if( mActionInfo.serverChanged )
e15b34 ¤   ¤   {
bae139 ¤   ¤   ¤   PGPUInt32¤  serverIndex;
2687c7 ¤   ¤   ¤
1aa6d4 ¤   ¤   ¤   for( serverIndex = 0; serverIndex < mNumServers; serverIndex++ )
--96d4 0000876c338401201c3 Page 12 of CSearchWindow.cp
99f776 ¤   ¤   ¤   {
d6a708 ¤   ¤   ¤   ¤   if( ( mServers[serverIndex].protocol ==
bfa1fe ¤   ¤   ¤   ¤   ¤   mActionInfo.serverInfo.protocol ) &&
d02985 ¤   ¤   ¤   ¤   ¤   ( mServers[serverIndex].serverPort ==
b43aba ¤   ¤   ¤   ¤   ¤   mActionInfo.serverInfo.serverPort ) &&
c283e4 ¤   ¤   ¤   ¤   ¤   !strcmp( mServers[serverIndex].domain,
3d3c11 ¤   ¤   ¤   ¤   ¤   mActionInfo.serverInfo.domain ) )
1472c3 ¤   ¤   ¤   ¤   {
5513ed ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( &mActionInfo.serverInfo,
083b40 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mServers[serverIndex],
444b4f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( PGPKeyServerEntry ) );
163809 ¤   ¤   ¤   ¤   ¤   PGPSetPrefData(¤gPrefRef, kPGPPrefKeyServerList,·
a873db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mNumServers * sizeof( PGPKeyServerEntry ),
ff57a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mServers);
2b14c3 ¤   ¤   ¤   ¤   ¤   break;
712613 ¤   ¤   ¤   ¤   }
d2a3a6 ¤   ¤   ¤   }
b50fe4 ¤   ¤   }
629371 ¤   }
d4c672 ¤   LThread::Yield();
19efe6 }
43af5a
75c744 ¤   PGPError
709244 SigCheckCallback(
70a1bc ¤   PGPContextRef¤  ¤   context,
d7b0a3 ¤   PGPEvent¤   ¤   ¤   *event,
35e84b ¤   PGPUserValue¤   ¤   userValue)
1abb36 {
83aeb2 ¤   KSCallbackInfo *callbackInfo = (KSCallbackInfo *)userValue;
fc67c5 ¤
bb56aa ¤   if(LMGetTicks() - callbackInfo->lastIncrement > 5)
15c7a1 ¤   {
e1ba7f ¤   ¤   callbackInfo->lastIncrement = LMGetTicks();
4601c7 ¤   ¤   LThread::Yield();
c49371 ¤   }
3b151e ¤   return kPGPError_NoErr;
54efe6 }
13af5a
816d52 ¤   void
4665a6 CSearchWindow::SearchServer(void *arg)
fdbb36 {
496f67 ¤   PGPKeyServerRef¤¤   ¤   ¤   ¤   server = kInvalidPGPKeyServerRef;
dddc13 ¤   PGPError¤   ¤   ¤   ¤   ¤   ¤   err;
790f00 ¤   PGPKeyServerAccessType¤ ¤   ¤   accessType = kPGPKeyServerAccessType_Admini¶
bcd8cd strator;
32cd21 ¤   PGPKeyServerKeySpace¤   ¤   ¤   keySpace = kPGPKeyServerKeySpace_Normal;
5152f8 ¤   PGPKeySetRef¤   ¤   ¤   ¤   ¤   failedKeys = kInvalidPGPKeySetRef;
c35a81 ¤   StPGPPreserveKeyServerStorage¤  keyserverStorage;
abaf5a
4e67c5 ¤
e01df3 ¤   /*if( !gIsAdminConfigured )
76266f ¤   ¤   accessType = kPGPKeyServerAccessType_Administrator;*/
75af5a
4a5d69 ¤   if( mPendingCheckBox->GetValue() )
336b46 ¤   ¤   keySpace = kPGPKeyServerKeySpace_Pending;
70af5a
4378ae ¤   err = PGPNewKeyServerFromHostName( gPGPContext,
084da2 ¤   ¤   ¤   ¤   mActionInfo.serverInfo.serverDNS,
ebb1ec ¤   ¤   ¤   ¤   mActionInfo.serverInfo.serverPort,
933243 ¤   ¤   ¤   ¤   mActionInfo.serverInfo.protocol,
a39ec2 ¤   ¤   ¤   ¤   accessType, keySpace, &server );
4ddd44 ¤   pgpAssertNoErr(err);
7fb1f0 ¤   if( IsntPGPError( err ) )
10c7a1 ¤   {
bc6a68 ¤   ¤   PGPtlsSessionRef¤   tls = kInvalidPGPtlsSessionRef;
131b52 ¤   ¤
f96bdc ¤   ¤   mActionInfo.server = server;
182e2f ¤   ¤   err = PGPSetKeyServerEventHandler( server,
f40e34 ¤   ¤   ¤   ¤   ¤   ServerCallback, &mActionInfo );
e49832 ¤   ¤   pgpAssertNoErr( err );
c52a6c ¤   ¤   err = PGPSetKeyServerIdleEventHandler( ServerCallback,
08f7fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mActionInfo );
--f0a5 000abbef2f5401201c3 Page 13 of CSearchWindow.cp
9b9832 ¤   ¤   pgpAssertNoErr( err );
090188 ¤   ¤   if( mActionInfo.serverInfo.protocol == kPGPKeyServerType_LDAPS )
835b34 ¤   ¤   {
1f995b ¤   ¤   ¤   err = PGPNewTLSSession( gTLSContext, &tls );
29144d ¤   ¤   ¤   pgpAssertNoErr( err );
e80fe4 ¤   ¤   }
b231b5 ¤   ¤   if( IsntPGPError( err ) && ( mActionInfo.command != cmd_Search ) &&
d14024 ¤   ¤   ¤   PGPtlsSessionRefIsValid( tls ) )
395b34 ¤   ¤   {
516a38 ¤   ¤   ¤   PGPKeyRef¤  ¤   authKey¤¤   = kInvalidPGPKeyRef;
ceabc5 ¤   ¤   ¤   char¤   ¤   ¤   *passphrase¤= NULL;
2a05e4 ¤   ¤   ¤   Str255¤ ¤   ¤   pstr;
c3c30b ¤   ¤   ¤   char¤   ¤   ¤   cstr[256];
3a87c7 ¤   ¤   ¤
5367b0 ¤   ¤   ¤   ::GetIndString( pstr, kSWStringListID,
eaa0db ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAuthenticatePhraseStringID );
f78622 ¤   ¤   ¤   PToCString( pstr, cstr );
2484a8 ¤   ¤   ¤   err = PGPSigningPassphraseDialog( gPGPContext,
079725 ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet(),
05fdfd ¤   ¤   ¤   ¤   ¤   ¤   &authKey,
50326b ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt( gPGPContext, cstr ),
bb8fe7 ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( gPGPContext, &passphrase ),
ae537d ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
ca698b ¤   ¤   ¤   if( IsntPGPError( err ) )
00cbe3 ¤   ¤   ¤   ¤   err = PGPtlsSetLocalPrivateKey( tls, authKey,
358fd7 ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, passphrase ),
8d537d ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
8312fc ¤   ¤   ¤   if( IsntNull( passphrase ) )
a78ed9 ¤   ¤   ¤   ¤   PGPFreeData( passphrase );
510fe4 ¤   ¤   }
303929 ¤   ¤   err = PGPKeyServerOpen( server, tls );
9a86f8 ¤   ¤   if( IsntPGPError( err ) )
165b34 ¤   ¤   {
9587c7 ¤   ¤   ¤
ab6f39 ¤   ¤   ¤   mLastServerValid = TRUE;
0ad642 ¤   ¤   ¤   pgpCopyMemory( &mActionInfo.serverInfo, &mLastServer,
2fed11 ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(PGPKeyServerEntry ) );
cb698b ¤   ¤   ¤   if( IsntPGPError( err ) )
3656c3 ¤   ¤   ¤   ¤   switch( mActionInfo.command )
dd72c3 ¤   ¤   ¤   ¤   {
543b4d ¤   ¤   ¤   ¤   ¤   case cmd_Search:
b6974c ¤   ¤   ¤   ¤   ¤   ¤   err = PGPQueryKeyServer( server, mActionInfo.filter,
7ec88a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mActionInfo.actionKeys );
8800eb ¤   ¤   ¤   ¤   ¤   ¤   break;
135f50 ¤   ¤   ¤   ¤   ¤   case cmd_ServerDelete:
c353df ¤   ¤   ¤   ¤   ¤   ¤   err = PGPDeleteFromKeyServer( server,
f057ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mActionInfo.actionKeys, &failedKeys );
af00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
04734e ¤   ¤   ¤   ¤   ¤   case cmd_ServerDisable:
5cde81 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPDisableFromKeyServer( server,
2c57ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mActionInfo.actionKeys, &failedKeys );
ff00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
1e2613 ¤   ¤   ¤   ¤   }
bce100 ¤   ¤   ¤   mActionInfo.result = err;
82409d ¤   ¤   ¤   PGPKeyServerClose( server );
5c0fe4 ¤   ¤   }
880e1d ¤   ¤   else
1ee100 ¤   ¤   ¤   mActionInfo.result = err;
5801c7 ¤   ¤   LThread::Yield();
5d5f5b ¤   ¤   if( IsntPGPError( err ) && mActionInfo.command == cmd_Search
f12fec ¤   ¤   ¤   && PGPKeySetRefIsValid( mActionInfo.actionKeys ) )
6e5b34 ¤   ¤   {
58758b ¤   ¤   ¤   PGPKeySetRef¤   combinedSet;
4f662f ¤   ¤   ¤   Str255¤ ¤   ¤   caption;
4187c7 ¤   ¤   ¤
f6a4c2 ¤   ¤   ¤   ::GetIndString(caption, kSWStringListID,
91a443 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kVerifyingSignaturesStringID);
d3c8da ¤   ¤   ¤   mStatusCaption->SetDescriptor(caption);
86ccdd ¤   ¤   ¤   err = PGPNewKeySet(gPGPContext, &combinedSet);
fc524f ¤   ¤   ¤   pgpAssertNoErr(err);
b1698b ¤   ¤   ¤   if( IsntPGPError( err ) )
abf776 ¤   ¤   ¤   {
--9403 0003f652940401201c3 Page 14 of CSearchWindow.cp
7c34b4 ¤   ¤   ¤   ¤   err = PGPAddKeys(mActionInfo.actionKeys, combinedSet);
fe6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
e190b1 ¤   ¤   ¤   ¤   err = PGPAddKeys(CPGPKeys::TheApp()->GetKeySet(), combinedSet);
776f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
5716f3 ¤   ¤   ¤   ¤   err = PGPCheckKeyRingSigs(¤ mActionInfo.actionKeys,
6bd1bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   combinedSet,
0c5f4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   FALSE, SigCheckCallback,
44682d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mActionInfo);
6d6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
50bf9b ¤   ¤   ¤   ¤   LThread::Yield();
e790c3 ¤   ¤   ¤   ¤   err = PGPPropagateTrust(combinedSet);
ae6f27 ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
0fbf9b ¤   ¤   ¤   ¤   LThread::Yield();
72fcde ¤   ¤   ¤   ¤   PGPFreeKeySet(combinedSet);
a5a3a6 ¤   ¤   ¤   }
fc0fe4 ¤   ¤   }
7fe7c3 ¤   ¤   err = PGPFreeKeyServer(server);
d8e919 ¤   ¤   pgpAssertNoErr(err);
831fab ¤   ¤   if( PGPtlsSessionRefIsValid( tls ) )
086a9b ¤   ¤   ¤   PGPFreeTLSSession( tls );
b79371 ¤   }
0f0e24 ¤   else
ad0e73 ¤   ¤   mActionInfo.result = err;
dbc672 ¤   LThread::Yield();
efda88 ¤   mActionInfo.done = TRUE;
999696 ¤   if( PGPKeySetRefIsValid( failedKeys ) )
9d008b ¤   ¤   PGPFreeKeySet( failedKeys );
81efe6 }
deaf5a
616d52 ¤   void
041493 ServerThreadProc(LThread& thread, void *arg)
44bb36 {
659d14 ¤   CSearchWindow *searchWindow = (CSearchWindow *)arg;
7b67c5 ¤
e9d41d ¤   searchWindow->SearchServer(NULL);
1fefe6 }
26af5a
206d52 ¤   void
94246a CSearchWindow::StartServerThread(
0a18df ¤   CommandT¤   ¤   ¤   inCommand,
9498ac ¤   PGPFilterRef¤   ¤   inFilter,
ed8bbe ¤   PGPKeySetRef¤   ¤   inKeys,
c89e09 ¤   PGPKeyServerEntry¤  *inServerInfo )
d1bb36 {
3e4c3e ¤   mWorking = TRUE;
e760b2 ¤   BroadcastMessage(kSearchInProgress, NULL);
94bcc2 ¤   mActionInfo.command¤¤   ¤   = inCommand;
49e589 ¤   mActionInfo.progressBar ¤   = mProgressArrows;
c8b9d8 ¤   mActionInfo.lockButton¤ ¤   = mLockButton;
58bcb2 ¤   mActionInfo.unlockButton¤   = mUnlockButton;
5b1b33 ¤   mActionInfo.statusCaption¤  = mStatusCaption;
526a9f ¤   mActionInfo.lastIncrement¤  = 0;
18d918 ¤   mActionInfo.lastState¤  ¤   = 0;
1defbd ¤   mActionInfo.filter¤ ¤   ¤   = inFilter;
881859 ¤   mActionInfo.actionKeys¤ ¤   = inKeys;
d039ee ¤   mActionInfo.server¤ ¤   ¤   = kInvalidPGPKeyServerRef;
1a7df1 ¤   mActionInfo.serverChanged¤  = FALSE;
33c843 ¤   mActionInfo.result¤ ¤   ¤   = kPGPError_NoErr;
572b38 ¤   mActionInfo.abort¤  ¤   ¤   = mActionInfo.done¤ = FALSE;
8e6370 ¤   pgpCopyMemory( inServerInfo, &mActionInfo.serverInfo,
0dc15a ¤   ¤   ¤   ¤   ¤   sizeof(PGPKeyServerEntry) );
f642e9 ¤   mServerThread = new LSimpleThread( ServerThreadProc, this );
771486 ¤   mServerThread->Resume();
c0f066 ¤   StartRepeating();
3fefe6 }
a3af5a
2a6d52 ¤   void
82e815 CSearchWindow::Search()
02bb36 {
93d386 ¤   PGPFilterRef¤   ¤   ¤   filter = NULL;
943af9 ¤   PGPKeySetRef¤   ¤   ¤   resultKeys = kInvalidPGPKeySetRef,
3fe0b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   indKeySet;
--83a4 000ad9eca4e401201c3 Page 15 of CSearchWindow.cp
3d5b78 ¤   Int16¤  ¤   ¤   ¤   ¤   targetValue;
a299b3 ¤   PGPKeyServerEntry¤  ¤   serverInfo;
594752 ¤   Str255¤ ¤   ¤   ¤   ¤   str;
763cbe ¤   PGPError¤   ¤   ¤   ¤   err = kPGPError_NoErr;
ee67c5 ¤
d34515 ¤   mLastServerValid = FALSE;
bfe4d8 ¤   mStatusCaption->SetDescriptor("\p");
8dad26 ¤   ::GetIndString(str, kSWStringListID, kCancelSearchStringID);
bfc718 ¤   mSearchButton->SetDescriptor(str);
233b5c ¤   mSearchButton->Draw(NULL);
8d55c7 ¤   mClearSearchButton->Disable();
80194e ¤   mProgressArrows->Show();
72d384 ¤   mLockButton->Hide();
3eda5c ¤   mUnlockButton->Show();
5367c5 ¤
017203 ¤   if( PGPKeySetRefIsValid( mActionInfo.authKeySet ) )
96c7a1 ¤   {
cd4adc ¤   ¤   PGPFreeKeySet( mActionInfo.authKeySet );
070a1e ¤   ¤   mActionInfo.authKeySet = kInvalidPGPKeySetRef;
999371 ¤   }
21af5a
665d8a ¤   pgpClearMemory( &mActionInfo, sizeof(KSCallbackInfo) );
5dcab8 ¤   err = MakeFilterFromPanels(&filter);
69d97d ¤   if( IsntPGPError( err ) && PGPFilterRefIsValid( filter ) )
36c7a1 ¤   {
bfa5e8 ¤   ¤   targetValue = mServerPopup->GetValue() - 1;
461fe2 ¤   ¤   switch(targetValue)
f35b34 ¤   ¤   {
6c9788 ¤   ¤   ¤   case 0:¤¤   // Local Keyring
d772c3 ¤   ¤   ¤   ¤   {
540d1c ¤   ¤   ¤   ¤   ¤   err = PGPFilterKeySet( CPGPKeys::TheApp()->GetKeySet(),
7bfc3e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   filter, &indKeySet );
216aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
c153d8 ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err) && PGPKeySetRefIsValid(indKeySet))
734859 ¤   ¤   ¤   ¤   ¤   {
d303c0 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPNewKeySet(gPGPContext, &resultKeys);
8a6c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
bee2b6 ¤   ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err) && PGPKeySetRefIsValid(resultKeys))
668fec ¤   ¤   ¤   ¤   ¤   ¤   {
88d585 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPAddKeys(indKeySet, resultKeys);
793eef ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
227d00 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPCommitKeyRingChanges(resultKeys);
e73eef ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
a3db3c ¤   ¤   ¤   ¤   ¤   ¤   }
bd7c04 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPFreeKeySet(indKeySet);
906c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
351c89 ¤   ¤   ¤   ¤   ¤   }
9a1246 ¤   ¤   ¤   ¤   ¤   mActionInfo.command¤¤   = cmd_Search;
9c4179 ¤   ¤   ¤   ¤   ¤   mActionInfo.filter¤ ¤   = filter;
2df406 ¤   ¤   ¤   ¤   ¤   mActionInfo.actionKeys¤ = resultKeys;
6cc038 ¤   ¤   ¤   ¤   ¤   mActionInfo.result¤ ¤   = err;
cb0826 ¤   ¤   ¤   ¤   ¤   mActionInfo.done¤   ¤   = TRUE;
d166fc ¤   ¤   ¤   ¤   ¤   StartRepeating();
6f0fce ¤   ¤   ¤   ¤   ¤   mWorking¤   ¤   ¤   ¤   = TRUE;
8caefe ¤   ¤   ¤   ¤   ¤   BroadcastMessage(kSearchInProgress, NULL);
8d2613 ¤   ¤   ¤   ¤   }
24f622 ¤   ¤   ¤   ¤   break;
2c806b ¤   ¤   ¤   case 1:¤¤   // Current Results
4972c3 ¤   ¤   ¤   ¤   {
53dd26 ¤   ¤   ¤   ¤   ¤   if(PGPKeySetRefIsValid(mKeyView->GetKeySet()))
894859 ¤   ¤   ¤   ¤   ¤   {
4a30fb ¤   ¤   ¤   ¤   ¤   ¤   err = PGPFilterKeySet(
f418de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mKeyView->GetKeySet(),
9160db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   filter, &indKeySet);
876c72 ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
a20688 ¤   ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err) && PGPKeySetRefIsValid(indKeySet))
888fec ¤   ¤   ¤   ¤   ¤   ¤   {
491576 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPNewKeySet(gPGPContext, &resultKeys);
763eef ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
6077bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err) &&
787299 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRefIsValid(resultKeys))
ad06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
--50aa 0009cda5e21401201c3 Page 16 of CSearchWindow.cp
aed2f3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPAddKeys(indKeySet, resultKeys);
9a6df4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
275268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
7ff353 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPFreeKeySet(indKeySet);
493eef ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
cedb3c ¤   ¤   ¤   ¤   ¤   ¤   }
d51c89 ¤   ¤   ¤   ¤   ¤   }
76887c ¤   ¤   ¤   ¤   ¤   mActionInfo.command¤¤   ¤   = cmd_Search;
d59d60 ¤   ¤   ¤   ¤   ¤   mActionInfo.filter¤ ¤   ¤   = filter;
0a6976 ¤   ¤   ¤   ¤   ¤   mActionInfo.actionKeys¤ ¤   = resultKeys;
bfd963 ¤   ¤   ¤   ¤   ¤   mActionInfo.result¤ ¤   ¤   = err;
899aa5 ¤   ¤   ¤   ¤   ¤   mActionInfo.done¤   ¤   ¤   = TRUE;
7766fc ¤   ¤   ¤   ¤   ¤   StartRepeating();
3347f2 ¤   ¤   ¤   ¤   ¤   mWorking¤   ¤   ¤   ¤   ¤   = TRUE;
a1ffb4 ¤   ¤   ¤   ¤   ¤   BroadcastMessage( kSearchInProgress, NULL );
d32613 ¤   ¤   ¤   ¤   }
20f622 ¤   ¤   ¤   ¤   break;
16db68 ¤   ¤   ¤   default:
f2f776 ¤   ¤   ¤   {
1431b8 ¤   ¤   ¤   ¤   Int16¤  serverInx,
4c23a1 ¤   ¤   ¤   ¤   ¤   ¤   listedServerInx;
a02b85 ¤   ¤   ¤   ¤
100d30 ¤   ¤   ¤   ¤   targetValue -= 2;
409a02 ¤   ¤   ¤   ¤   for( listedServerInx = serverInx = 0;
701c42 ¤   ¤   ¤   ¤   ¤   ¤   serverInx < mNumServers; serverInx++ )
2772c3 ¤   ¤   ¤   ¤   {
41830f ¤   ¤   ¤   ¤   ¤   if( IsKeyServerListed( mServers[serverInx].flags ) )
84c2a8 ¤   ¤   ¤   ¤   ¤   ¤   listedServerInx++;
df6d29 ¤   ¤   ¤   ¤   ¤   if( listedServerInx == targetValue )
6c00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
602613 ¤   ¤   ¤   ¤   }
562b85 ¤   ¤   ¤   ¤
0f8c67 ¤   ¤   ¤   ¤   pgpCopyMemory( &mServers[serverInx],
63961e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &serverInfo,
40dbc7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(PGPKeyServerEntry) );
322288 ¤   ¤   ¤   ¤   if( IsntPGPError(err) )
677207 ¤   ¤   ¤   ¤   ¤   StartServerThread(¤ cmd_Search,
aa0923 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   filter,
72e0ee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPKeySetRef,
42b190 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &serverInfo );
7bf622 ¤   ¤   ¤   ¤   break;
d1a3a6 ¤   ¤   ¤   }
640fe4 ¤   ¤   }
ce9371 ¤   }
e656a3 ¤   if( !mWorking )
7ec7a1 ¤   {
a11e35 ¤   ¤   if( IsntNull( filter ) )
6b7b9c ¤   ¤   ¤   PGPFreeFilter( filter );
e537d3 ¤   ¤   StartRepeating();
781f6e ¤   ¤   mActionInfo.result = kPGPError_UserAbort;
8361de ¤   ¤   mActionInfo.done = TRUE;
bfed50 ¤   ¤   mActionInfo.filter = kInvalidPGPFilterRef;
4a9371 ¤   }
b2b492 ¤   mKeyView->Empty();
15efe6 }
83af5a
0c7e69 ¤   Boolean
64f3bd CSearchWindow::HandleKeyPress(const EventRecord& inKeyEvent)
c6bb36 {
b739e6 ¤   Boolean¤¤   keyHandled = false;
e4af5a
2f7f42 ¤   if(inKeyEvent.modifiers & cmdKey)
def1fc ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
d0767b ¤   else if(UKeyFilters::IsActionKey(inKeyEvent.message))
fcc7a1 ¤   {
facbdf ¤   ¤   switch (inKeyEvent.message & charCodeMask)
fb5b34 ¤   ¤   {
10bce9 ¤   ¤   ¤   case char_Return:
85656b ¤   ¤   ¤   case char_Enter:·
84f5b2 ¤   ¤   ¤   ¤   mSearchButton->SimulateHotSpotClick(kControlButtonPart);
5fade2 ¤   ¤   ¤   ¤   keyHandled = true;
9cf622 ¤   ¤   ¤   ¤   break;
--af7b 001ed2a3c31401201c3 Page 17 of CSearchWindow.cp
b50fe4 ¤   ¤   }
6b9371 ¤   }
b4af5a
42c022 ¤   return keyHandled;
92efe6 }
edaf5a
--9d27 000c91df321401201c4 Page 1 of CSearchWindow.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
c4ce63 ¤   $Id: CSearchWindow.h,v 1.26.8.1 1998/11/12 03:08:15 heller Exp $
dbf7f7 ____________________________________________________________________________*/
c27b7d #pragma once
39af5a
8025ae #include <LCaption.h>
559c21 #include <LSimpleThread.h>
088fd4 #include <LWindow.h>
182f94 #include <LCommander.h>
11f1a9 #include <LListener.h>
29ea2f #include <LBroadcaster.h>
b10a93 #include <LPeriodical.h>
fcaf5a
a5e82c #include "pgpPubTypes.h"
e6ed82 #include "pgpKeyServerPrefs.h"
27ec82 #include "pgpTLS.h"
5daf5a
e32ed9 class CKeyView;
9595ce class LPopupButton;
8601f2 class CSearchPanel;
e588da class LPushButton;
86e276 class LCheckBox;
3f548d class LBevelButton;
ce7639 class LChasingArrows;
2e657c class LPlacard;
820c10 class LTextGroupBox;
5aaf5a
62e5ac const ResIDT¤   kSearchWindowID¤¤   = 133;
fbc5eb const MessageT¤ kSearchWindowClosed¤= 'SWcl';
a6fb0f const MessageT¤ kSearchInProgress¤  = 'SIPr';
b2fc87 const MessageT¤ kSearchComplete¤¤   = 'SCom';
70af5a
35c8aa typedef struct SearchPanelList
7dbb36 {
eaaada ¤   CSearchPanel *panel;
436485 ¤   SearchPanelList *next;
3d2405 } SearchPanelList;
2eaf5a
5440fe typedef struct KSCallbackInfo
58bb36 {
0f20ac ¤   CommandT¤   ¤   ¤   ¤   command;
a75546 ¤   LChasingArrows¤ ¤   ¤   *progressBar;
563362 ¤   LBevelButton¤   ¤   ¤   *lockButton;
b0a1eb ¤   LBevelButton¤   ¤   ¤   *unlockButton;
141816 ¤   LCaption¤   ¤   ¤   ¤   *statusCaption;
7323a9 ¤   ulong¤  ¤   ¤   ¤   ¤   lastIncrement;
7a76ce ¤   PGPUInt32¤  ¤   ¤   ¤   lastState;
c6df41 ¤   PGPFilterRef¤   ¤   ¤   filter;
1ab053 ¤   PGPKeySetRef¤   ¤   ¤   actionKeys;
86576f ¤   PGPKeySetRef¤   ¤   ¤   authKeySet;
f84624 ¤   PGPKeyServerRef¤¤   ¤   server;
4799b3 ¤   PGPKeyServerEntry¤  ¤   serverInfo;
835db6 ¤   PGPtlsCipherSuiteNum¤   tlsCipher;
29bf06 ¤   PGPBoolean¤ ¤   ¤   ¤   serverChanged;
1780f7 ¤   PGPError¤   ¤   ¤   ¤   result;
a943ad ¤   Boolean¤¤   ¤   ¤   ¤   done;
0f6885 ¤   Boolean¤¤   ¤   ¤   ¤   abort;
6bd94e } KSCallbackInfo;
23af5a
3baf5a
30d68e class¤  CSearchWindow¤  :¤  public LWindow,
8dbca0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener,
6b619d ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster,
b84c44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LPeriodical
22bb36 {
8e5ed4 public:
c93148 ¤   enum { class_ID = 'Swin' };
--c006 00072ad11ae401201c4 Page 2 of CSearchWindow.h
66b7ca ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CSearchWindow();
28a8fe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CSearchWindow(LStream *inStream);
676e9e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ~CSearchWindow();
8a9a35 ¤   void¤   ¤   ¤   ¤   ¤   ¤   FinishCreateSelf();
28dc9a ¤   virtual void¤   ¤   ¤   ¤   ApplyForeAndBackColors(void) const;
4261cb ¤   virtual void¤   ¤   ¤   ¤   AttemptClose();
bdafbd ¤   Boolean¤¤   ¤   ¤   ¤   ¤   HandleKeyPress(const EventRecord& inKeyEvent);
329143 ¤   virtual void¤   ¤   ¤   ¤   FindCommandStatus(CommandT inCommand,
2f3663 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
6de9fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName);
243f22 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   ObeyCommand(
de62fa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CommandT¤   inCommand,
d568cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void¤   ¤   *ioParam);
c4a386 ¤   void¤   ¤   ¤   ¤   ¤   ¤   ListenToMessage(MessageT¤   inMessage,
3704bb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *¤ ¤   ioParam);
94b7ab ¤   CKeyView¤   ¤   ¤   ¤   ¤   *GetKeyView()
9c17fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {¤  return mKeyView;¤   }
8567c5 ¤
2894d1 ¤   void¤   ¤   ¤   ¤   ¤   ¤   SpendTime(
3713fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord¤  ¤   &inMacEvent);
7967c5 ¤
fbd021 ¤   void¤   ¤   ¤   ¤   ¤   ¤   SearchServer(void *arg);
720fb9 private:
05487b ¤   virtual void¤   ¤   ¤   ¤   AdjustSizeToSearches();
5ee7b9 ¤   virtual void¤   ¤   ¤   ¤   AddEmptySearch(Boolean¤ first);
0c74e7 ¤   virtual void¤   ¤   ¤   ¤   RemoveLastSearch();
695b05 ¤   virtual void¤   ¤   ¤   ¤   FillServerPopup();
ae5c47 ¤   void¤   ¤   ¤   ¤   ¤   ¤   Search();
d73d97 ¤   void¤   ¤   ¤   ¤   ¤   ¤   StartServerThread(
d28548 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CommandT¤   ¤   ¤   inCommand,
61cea5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFilterRef¤   ¤   inFilter,
eadd87 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeySetRef¤   ¤   inKeys,
6b84dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyServerEntry¤  *inServerInfo );
0c3c52 ¤   PGPError¤   ¤   ¤   ¤   ¤   MakeFilterFromPanels(
a7f786 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPFilterRef *outFilter);
ba67c5 ¤
a679da ¤   CKeyView¤   ¤   ¤   ¤   ¤   *mKeyView;
d07976 ¤   LPushButton¤¤   ¤   ¤   ¤   *mSearchButton,
32d653 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mClearSearchButton,
fef057 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mMoreButton,
4fbcc1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mFewerButton;
e30899 ¤   LCaption¤   ¤   ¤   ¤   ¤   *mStatusCaption;
e6788b ¤   LPlacard¤   ¤   ¤   ¤   ¤   *mHeaderPlacard;
180c19 ¤   LChasingArrows¤ ¤   ¤   ¤   *mProgressArrows;
02a692 ¤   LBevelButton¤   ¤   ¤   ¤   *mLockButton;
411ec7 ¤   LBevelButton¤   ¤   ¤   ¤   *mUnlockButton;
e6c0d3 ¤   MessageT¤   ¤   ¤   ¤   ¤   mLockMessage;
490281 ¤   LCheckBox¤  ¤   ¤   ¤   ¤   *mPendingCheckBox;
6b87ad ¤   LPopupButton¤   ¤   ¤   ¤   *mServerPopup;
e98813 ¤   LTextGroupBox¤  ¤   ¤   ¤   *mSearchesBox;
dc71da ¤   Int16¤  ¤   ¤   ¤   ¤   ¤   mNumSearches;
327dc9 ¤   Int16¤  ¤   ¤   ¤   ¤   ¤   mPanelHeight;
fe4bfa ¤   SearchPanelList¤¤   ¤   ¤   *mSearchPanelList;
a672cd ¤   PGPKeyServerEntry¤  ¤   ¤   *mServers;
079e19 ¤   PGPKeyServerEntry¤  ¤   ¤   mLastServer;
129387 ¤   PGPBoolean¤ ¤   ¤   ¤   ¤   mLastServerValid;
703bfb ¤   Int32¤  ¤   ¤   ¤   ¤   ¤   mNumServers;
e198ad ¤   KSCallbackInfo¤ ¤   ¤   ¤   mActionInfo;
db858b ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mWorking;
68b11e ¤   LSimpleThread¤  ¤   ¤   ¤   *mServerThread;
9e67c5 ¤
9be23f ¤   enum¤   {¤
9a7db2 ¤   ¤   ¤   ¤   kSearchesBox¤   ·¤  ¤   = 'gPrm',
13c178 ¤   ¤   ¤   ¤   kMoreButton¤¤   ·¤  ¤   = 'bMor',
510020 ¤   ¤   ¤   ¤   kFewerButton¤   ¤   ¤   = 'bFew',
acfce3 ¤   ¤   ¤   ¤   kSearchButton¤  ¤   ¤   = 'bSea',
ede865 ¤   ¤   ¤   ¤   kClearSearchButton¤ ¤   = 'bCle',
7437e4 ¤   ¤   ¤   ¤   kServerPopup¤   ¤   ¤   = 'pKSS',
dc29a3 ¤   ¤   ¤   ¤   kBottomBar¤ ¤   ¤   ¤   = 'bBot',
78108a ¤   ¤   ¤   ¤   kPendingCheckbox¤   ¤   = 'xPnd',
28f8fe ¤   ¤   ¤   ¤   kProgressArrows¤¤   ¤   = 'chAr',
72bd07 ¤   ¤   ¤   ¤   kHeaderPlaque¤  ¤   ¤   = 'Plaq'
--24b8 0016caf16ed401201c4 Page 3 of CSearchWindow.h
0ac0bf ¤   ¤   ¤   };
a982f7 };
6caf5a
--68e8 00082d6f686401201c5 Page 1 of CSendKeyShares.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
ac4a78 ¤   $Id: CSendKeyShares.cp,v 1.22.8.1 1998/11/12 03:08:16 heller Exp $
d9f7f7 ____________________________________________________________________________*/
4d7c09 #include <LEditText.h>
e0dd06 #include <UDesktop.h>
427c99 #include <URegistrar.h>
b8e8ae #include <UDrawingUtils.h>
22dd56 #include <PP_Messages.h>
429c21 #include <LSimpleThread.h>
5990a3 #include <Threads.h>
fc324c #include <string.h>
37af5a
adc907 #include "CSendKeyShares.h"
ddaf5a
1d6ff8 #include "CKeyTable.h"
adb8cb #include "CPGPKeys.h"
21af5a
6ca02f #include "pgpClientLib.h"
4f894b #include "pgpFileSpec.h"
a8b869 #include "pgpSKEP.h"
45add5 #include "pgpShareFile.h"
45afda #include "pgpShare.h"
97e684 #include "pgpUserInterface.h"
b376f0 #include "CComboError.h"
7ed73a #include "CSecureMemory.h"
bf9dc2 #include "CWarningAlert.h"
e285c2 #include "MacStrings.h"
dbaf5a
8f0d08 #include "pgpMem.h"
6a2f8d #include "pgpErrors.h"
d9af5a
94af5a
a3cdf0 const ResIDT¤   window_SendKeyShares¤   ¤   = 153;
43af5a
d9f989 enum¤   {
1e446a ¤   ¤   ¤   kStringListID¤  ¤   = 1023,
0d769e ¤   ¤   ¤   kSharePhraseStringID = 1,
af8ddd ¤   ¤   ¤   kAuthPhraseStringID,
e6bf0d ¤   ¤   ¤   kSKEPConnectedStringID,
c8ca19 ¤   ¤   ¤   kSKEPAuthenticatedStringID,
c3ae94 ¤   ¤   ¤   kSKEPSendingStringID,
aac6fa ¤   ¤   ¤   kSKEPCloseStringID,
2d911c ¤   ¤   ¤   kConnectingStringID,
7ba2cd ¤   ¤   ¤   kDoneStringID,
78f349 ¤   ¤   ¤   kRemoteKeyConfirmID,
f2a2b9 ¤   ¤   ¤   kSelectShareFileID,
118caf ¤   ¤   ¤   kSelectShareTitleID
86a105 ¤   ¤   };
3caf5a
b89b3f static void SKEPThreadProc(LThread& thread, void *arg);
2baf5a
ee156f CSendKeyShares::CSendKeyShares(LStream *inStream)
be542f ¤   :¤  LGADialog(inStream)
92bb36 {
9b2e0a ¤   mShares¤¤   = NULL;
7b764b ¤   mSending¤   = FALSE;
d92c94 ¤   mAbort¤ ¤   = FALSE;
bfc88b ¤   mFinished¤  = FALSE;
f4efe6 }
c0af5a
45b52e CSendKeyShares::~CSendKeyShares()
2ebb36 {
a10ece ¤   if( IsntNull( mShares ) )
d91aab ¤   ¤   PGPFreeShares( mShares );
c4efe6 }
57af5a
826d52 ¤   void
--5a6a 00012d4b353401201c5 Page 2 of CSendKeyShares.cp
39ebcc CSendKeyShares::FinishCreateSelf()
8fbb36 {
88893a ¤   LGADialog::FinishCreateSelf();
3f67c5 ¤
b6ee42 ¤   mSendButton = (LPushButton *)FindPaneByID( kSendSharesButton );
1c26cb ¤   mStatusText = (LStaticText *)FindPaneByID( kStatusText );
b8b157 ¤   mAuthText¤  = (LStaticText *)FindPaneByID( kAuthenticatedText );
7067c5 ¤
e03575 ¤   SwitchTarget( (LEditText *) FindPaneByID( kRemoteAddressField ) );
3767c5 ¤
1b60d9 ¤   Show();
69efe6 }
9eaf5a
f0c744 ¤   PGPError
c4efce CSendKeyShares::SKEPHandler1(
98028d ¤   PGPskepEvent¤   ¤   *event )
4fbb36 {
308e12 ¤   PGPError¤   err = kPGPError_NoErr;
ccca71 ¤   Str255¤ ¤   pstr = "\p";
f17a0c ¤   Boolean¤¤   noString = FALSE;
5067c5 ¤
ac6075 ¤   if( mAbort )
740fd8 ¤   ¤   err = kPGPError_UserAbort;
4890b4 ¤   else switch( event->type )
cbc7a1 ¤   {
d3e538 ¤   ¤   case kPGPskepEvent_ConnectEvent:
1143a1 ¤   ¤   ¤   GetIndString( pstr, kStringListID, kSKEPConnectedStringID );
0ccdcb ¤   ¤   ¤   break;
82183d ¤   ¤   case kPGPskepEvent_AuthenticateEvent:
eb5b34 ¤   ¤   {
9b2f9f ¤   ¤   ¤   Str255¤ pstr2;
dce4d5 ¤   ¤   ¤   char¤   cstr[256];
512c65 ¤   ¤   ¤   PGPSize¤nameSize;
6987c7 ¤   ¤   ¤
8769d5 ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer( event->data.ad.remoteKey,
250ab9 ¤   ¤   ¤   ¤   ¤   ¤   sizeof(cstr), cstr, &nameSize );
6659df ¤   ¤   ¤   if( IsPGPError( err ) )
eaf622 ¤   ¤   ¤   ¤   break;
71b1ed ¤   ¤   ¤   CToPString( cstr, pstr2 );
13981a ¤   ¤   ¤   mAuthText->SetDescriptor( pstr2 );
0b5950 ¤   ¤   ¤   GetIndString( pstr2, kStringListID, kRemoteKeyConfirmID );
a3fdc1 ¤   ¤   ¤   PToCString( pstr2, cstr );
8ff2cf ¤   ¤   ¤   err = PGPConfirmRemoteKeyDialog( cstr, mRemoteAddress,
14d1e5 ¤   ¤   ¤   ¤   ¤   event->data.ad.remoteKey,
ef5ae7 ¤   ¤   ¤   ¤   ¤   event->data.ad.tlsCipher, TRUE );
d759df ¤   ¤   ¤   if( IsPGPError( err ) )
a4f622 ¤   ¤   ¤   ¤   break;
5aad05 ¤   ¤   ¤   GetIndString( pstr, kStringListID, kSKEPAuthenticatedStringID );
b3cdcb ¤   ¤   ¤   break;
930fe4 ¤   ¤   }
81be72 ¤   ¤   case kPGPskepEvent_ProgressEvent:
99a055 ¤   ¤   ¤   GetIndString( pstr, kStringListID, kSKEPSendingStringID );
25cdcb ¤   ¤   ¤   break;
7f5668 ¤   ¤   case kPGPskepEvent_CloseEvent:
f4e8db ¤   ¤   ¤   GetIndString( pstr, kStringListID, kSKEPCloseStringID );
dacdcb ¤   ¤   ¤   break;
be0b4c ¤   ¤   case kPGPskepEvent_NullEvent:
a98893 ¤   ¤   ¤   LThread::Yield();
fca960 ¤   ¤   ¤   noString = TRUE;
a1cdcb ¤   ¤   ¤   break;
1e9371 ¤   }
ab1e1d ¤   if( !noString )
127546 ¤   ¤   mStatusText->SetDescriptor( pstr );
645ea8 ¤   return err;
b8efe6 }
11af5a
83c744 ¤   PGPError
27c0fb CSendKeyShares::SKEPHandler(
e706a4 ¤   PGPskepRef¤ ¤   ¤   skepRef,
e22711 ¤   PGPskepEvent¤   ¤   *event,
5cc620 ¤   PGPUserValue¤   ¤   userValue )
12bb36 {
--b6ff 000952d6538401201c5 Page 3 of CSendKeyShares.cp
298712 ¤   return ( (CSendKeyShares *)userValue )->SKEPHandler1( event );
b9efe6 }
8eaf5a
1b6d52 ¤   void
7a3716 CSendKeyShares::SpendTime(const EventRecord¤&inMacEvent)
7dbb36 {
5f7be1 ¤   if( !mSending )
94c7a1 ¤   {
f609b7 ¤   ¤   StopRepeating();
b0526c ¤   ¤   if( !mFinished )
975b34 ¤   ¤   {
804749 ¤   ¤   ¤   mStatusText->SetDescriptor( "\p" );
8a39eb ¤   ¤   ¤   mAuthText->SetDescriptor( "\p" );
da0fe4 ¤   ¤   }
e30e1d ¤   ¤   else
665b34 ¤   ¤   {
2c1ad6 ¤   ¤   ¤   Str255¤ pstr;
bc87c7 ¤   ¤   ¤
a4842e ¤   ¤   ¤   GetIndString( pstr, kStringListID, kDoneStringID );
8e1651 ¤   ¤   ¤   mSendButton->SetDescriptor( pstr );
af7057 ¤   ¤   ¤   ( (LPushButton *)FindPaneByID( kCancelButton ) )->Disable();
140fe4 ¤   ¤   }
371272 ¤   ¤   mSendButton->Enable();
329371 ¤   }
4ec672 ¤   LThread::Yield();
99efe6 }
4eaf5a
766d52 ¤   void
8b2653 CSendKeyShares::SendSharesThread()
a0bb36 {
73b386 ¤   Str255¤ ¤   pstr;
a48e12 ¤   PGPError¤   err = kPGPError_NoErr;
bfec05 ¤   PGPskepRef¤ skepRef;
0987c7 ¤   ¤   ¤
da1064 ¤   GetIndString( pstr, kStringListID, kConnectingStringID );
f1fd20 ¤   mStatusText->SetDescriptor( pstr );
cb043b ¤   ( (LEditText *)FindPaneByID( kRemoteAddressField ) )->
ae5ef7 ¤   ¤   GetDescriptor( pstr );
db5778 ¤   PToCString( pstr, mRemoteAddress );
bf5ba6 ¤   err = PGPNewSKEP( gPGPContext, gTLSContext, &skepRef );
b0b1f0 ¤   if( IsntPGPError( err ) )
3fc7a1 ¤   {
f11d28 ¤   ¤   err = PGPskepSetEventHandler( skepRef,
6fc88c ¤   ¤   ¤   ¤   ¤   CSendKeyShares::SKEPHandler, this );
4886f8 ¤   ¤   if( IsntPGPError( err ) )
4b5b34 ¤   ¤   {
ffa11e ¤   ¤   ¤   err = PGPskepSendShares( skepRef, mAuthKey,
15b01c ¤   ¤   ¤   ¤   ¤   ¤   ¤   mAuthPhrase, mShares, mRemoteAddress );
c60fe4 ¤   ¤   }
08a63f ¤   ¤   PGPFreeSKEP( skepRef );
399371 ¤   }
bb7f7d ¤   if( IsPGPError( err ) )
b23822 ¤   ¤   ReportPGPError( err );
4b0e24 ¤   else
9d3a15 ¤   ¤   mFinished = TRUE;
02b476 ¤   mSending = mAbort = FALSE;
02efe6 }
4daf5a
ef6d52 ¤   void
f634f2 SKEPThreadProc(LThread& thread, void *arg)
9abb36 {
245da3 ¤   CSendKeyShares *sksWindow = (CSendKeyShares *)arg;
5067c5 ¤
cacd86 ¤   sksWindow->SendSharesThread();
6befe6 }
74af5a
486d52 ¤   void
a1dac7 CSendKeyShares::ListenToMessage(¤   MessageT¤   inMessage,
c9cd9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *¤ ¤   ioParam)
f7bb36 {
3126d0 ¤   switch(inMessage)
95c7a1 ¤   {
--0cac 000e46a4734401201c5 Page 4 of CSendKeyShares.cp
f2d8ba ¤   ¤   case msg_OK:
7b5b34 ¤   ¤   {
f56631 ¤   ¤   ¤   if( !mFinished )
9ff776 ¤   ¤   ¤   {
fd6486 ¤   ¤   ¤   ¤   mSending = TRUE;
8d5346 ¤   ¤   ¤   ¤   mSendButton->Disable();
f8af5a
24a836 ¤   ¤   ¤   ¤   mSKEPThread = new LSimpleThread( SKEPThreadProc, this );
65ef39 ¤   ¤   ¤   ¤   mSKEPThread->Resume();
39898f ¤   ¤   ¤   ¤   StartRepeating();
caf622 ¤   ¤   ¤   ¤   break;
38a3a6 ¤   ¤   ¤   }
e10fe4 ¤   ¤   }
a65686 ¤   ¤   case msg_Cancel:
807f07 ¤   ¤   ¤   if( mSending )
9f3f79 ¤   ¤   ¤   ¤   mAbort = TRUE;
c2bb8c ¤   ¤   ¤   else
33cbb8 ¤   ¤   ¤   ¤   delete this;
30cdcb ¤   ¤   ¤   break;
ca9371 ¤   }
a3efe6 }
5faf5a
476d52 ¤   void
0a88a2 CSendKeyShares::SetShareInfo(
1e1afc ¤   PGPShareRef¤¤   ¤   shares,
fc3f43 ¤   char¤   ¤   ¤   ¤   *name,
80e8d6 ¤   PGPUInt32¤  ¤   ¤   numShares,
bca4d9 ¤   PGPKeyRef¤  ¤   ¤   authKey,
f2a801 ¤   char const¤ ¤   ¤   *passphrase )
fabb36 {
cd0548 ¤   mShares¤¤   = shares;
f36a0b ¤   mNumShares¤ = numShares;
03adf9 ¤   mAuthKey¤   = authKey;
a914cf ¤   CopyCString( passphrase, mAuthPhrase );
e25928 ¤   CToPString( name, mName );
b867c5 ¤
a22907 ¤   ( (LStaticText *)FindPaneByID( kShareNameText ) )->
decb22 ¤   ¤   SetDescriptor( mName );
ffb978 ¤   ( (LStaticText *)FindPaneByID( kNumSharesText ) )->
d40b5e ¤   ¤   SetValue( mNumShares );
1367c5 ¤
0060d9 ¤   Show();
71efe6 }
49af5a
fe5ab8 typedef struct DecryptSharesData
d1bb36 {
a5642d ¤   PGPKeySetRef¤   ¤   recipientSet;
2ec1dd ¤   PGPKeyID¤   ¤   ¤   *keyIDList;
f22cf5 ¤   PGPUInt32¤  ¤   ¤   keyIDCount;
459fc5 ¤   PGPBoolean¤ ¤   ¤   conventional;
b40f6c ¤   PGPKeyRef¤  ¤   ¤   ownerKey;
3aae3b ¤   CSecureCString256¤  passphrase;
607bd3 } DecryptSharesData;
d5af5a
b5c744 ¤   PGPError
aa9163 CSendKeyShares::DecryptSharesHandler(
dfa1bc ¤   PGPContextRef¤  ¤   context,
78b0a3 ¤   PGPEvent¤   ¤   ¤   *event,
63b166 ¤   void¤   ¤   ¤   ¤   *userValue)
b6bb36 {
a57d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
418fa0 ¤   DecryptSharesData¤  *dsd;
9567c5 ¤
fcd2e7 ¤   dsd = (DecryptSharesData *) userValue;
0fa505 ¤   switch( event->type )
59c7a1 ¤   {
caa537 ¤   ¤   case kPGPEvent_PassphraseEvent:
495b34 ¤   ¤   {
cefd67 ¤   ¤   ¤   Str255¤ ¤   pstr;
c71ee0 ¤   ¤   ¤   char¤   ¤   cstr[256];
046301 ¤   ¤   ¤   char¤   ¤   *passphrase = NULL;
e487c7 ¤   ¤   ¤
--c2e9 000654ad338401201c5 Page 5 of CSendKeyShares.cp
c6a0a6 ¤   ¤   ¤   GetIndString( pstr, kStringListID, kSharePhraseStringID );
938622 ¤   ¤   ¤   PToCString( pstr, cstr );
21af5a
242941 ¤   ¤   ¤   if( event->data.passphraseData.fConventional )
fff776 ¤   ¤   ¤   {
ff0f99 ¤   ¤   ¤   ¤   err = PGPConventionalDecryptionPassphraseDialog( gPGPContext,
ea326b ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt( gPGPContext, cstr ),
9b8fe7 ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( gPGPContext, &passphrase ),
95537d ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
f1aa33 ¤   ¤   ¤   ¤   dsd->conventional = TRUE;
68a3a6 ¤   ¤   ¤   }
9bbb8c ¤   ¤   ¤   else
fef776 ¤   ¤   ¤   {
fca468 ¤   ¤   ¤   ¤   PGPKeySetRef¤   newKeys;
952b85 ¤   ¤   ¤   ¤
599971 ¤   ¤   ¤   ¤   err = PGPClientDecryptionPassphraseDialog( gPGPContext,
be3989 ¤   ¤   ¤   ¤   ¤   ¤   gTLSContext, cstr,
ed9093 ¤   ¤   ¤   ¤   ¤   ¤   dsd->recipientSet, dsd->keyIDList, dsd->keyIDCount,
f5b156 ¤   ¤   ¤   ¤   ¤   ¤   kInvalidPGPOptionListRef, &passphrase,
56af05 ¤   ¤   ¤   ¤   ¤   ¤   &dsd->ownerKey, &newKeys );
2b94aa ¤   ¤   ¤   ¤   ¤   ¤
1a7bad ¤   ¤   ¤   ¤   pgpFixBeforeShip( "Handle new kaey" );
892b85 ¤   ¤   ¤   ¤
3f131b ¤   ¤   ¤   ¤   if( PGPKeySetRefIsValid( newKeys ) )
666772 ¤   ¤   ¤   ¤   ¤   PGPFreeKeySet( newKeys );
8fa3a6 ¤   ¤   ¤   }
75698b ¤   ¤   ¤   if( IsntPGPError( err ) )
7ff776 ¤   ¤   ¤   {
9c1260 ¤   ¤   ¤   ¤   CopyCString( passphrase, dsd->passphrase );
838ed9 ¤   ¤   ¤   ¤   PGPFreeData( passphrase );
e62b85 ¤   ¤   ¤   ¤
79a755 ¤   ¤   ¤   ¤   err = PGPAddJobOptions( event->job,
59bbe0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, dsd->passphrase ),
6575c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
91a3a6 ¤   ¤   ¤   }
24cdcb ¤   ¤   ¤   break;
590fe4 ¤   ¤   }
f29dce ¤   ¤   case kPGPEvent_RecipientsEvent:
eaed49 ¤   ¤   {¤
8c84a1 ¤   ¤   ¤   dsd->recipientSet = event->data.recipientsData.recipientSet;
90e8f9 ¤   ¤   ¤   if( PGPKeySetRefIsValid( dsd->recipientSet ) )
54f776 ¤   ¤   ¤   {
82fe32 ¤   ¤   ¤   ¤   err = PGPIncKeySetRefCount( dsd->recipientSet );
13a3a6 ¤   ¤   ¤   }
5caf5a
6c55bc ¤   ¤   ¤   if( IsntPGPError( err ) &&
69790f ¤   ¤   ¤   ¤   IsntNull( event->data.recipientsData.keyIDArray ) )
9cf776 ¤   ¤   ¤   {
1fb207 ¤   ¤   ¤   ¤   PGPSize¤dataSize;
0e2b85 ¤   ¤   ¤   ¤
f05e92 ¤   ¤   ¤   ¤   dsd->keyIDCount ¤   = event->data.recipientsData.keyCount;
20217a ¤   ¤   ¤   ¤   dataSize¤   ¤   ¤   = dsd->keyIDCount * sizeof( PGPKeyID );
a02b85 ¤   ¤   ¤   ¤
bd9caf ¤   ¤   ¤   ¤   dsd->keyIDList = (PGPKeyID *) PGPNewData(
361ea9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( context ),
c97ab2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dataSize, 0 );
31be98 ¤   ¤   ¤   ¤   if( IsntNull( dsd->keyIDList ) )
0372c3 ¤   ¤   ¤   ¤   {
17af63 ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( event->data.recipientsData.keyIDArray,
43fb2f ¤   ¤   ¤   ¤   ¤   ¤   ¤   dsd->keyIDList, dataSize );
842613 ¤   ¤   ¤   ¤   }
cbfa07 ¤   ¤   ¤   ¤   else
2672c3 ¤   ¤   ¤   ¤   {
aced29 ¤   ¤   ¤   ¤   ¤   err = kPGPError_OutOfMemory;
202613 ¤   ¤   ¤   ¤   }
e8a3a6 ¤   ¤   ¤   }
ec87c7 ¤   ¤   ¤
40cdcb ¤   ¤   ¤   break;
1f0fe4 ¤   ¤   }
3e9371 ¤   }
055ea8 ¤   return err;
65efe6 }
--e5d1 000099faf9c401201c5 Page 6 of CSendKeyShares.cp
e0af5a
2c6d52 ¤   void
42226e CSendKeyShares::SendKeyShares(
149c7f ¤   FSSpec *¤   ¤   ¤   ¤   inFSSpec )
aebb36 {
e73cbe ¤   PGPError¤   ¤   ¤   ¤   err = kPGPError_NoErr;
e3d17a ¤   FSSpec¤ ¤   ¤   ¤   ¤   fsSpec;
98364c ¤   SFTypeList¤ ¤   ¤   ¤   typeList;
7525a9 ¤   PFLFileSpecRef¤ ¤   ¤   fsRef¤  = NULL;
8e88fe ¤   PGPShareFileRef¤¤   ¤   sfRef¤  = NULL;
8a47ae ¤   PGPShareRef¤¤   ¤   ¤   shares¤ = NULL;
d9b654 ¤   PGPOptionListRef¤   ¤   decodeOpt = kInvalidPGPOptionListRef;
2583e6 ¤   DecryptSharesData¤  ¤   dsd;
5faf5a
217818 ¤   dsd.recipientSet¤   = kInvalidPGPKeySetRef;
03286c ¤   dsd.keyIDList ¤ ¤   = NULL;
53f5aa ¤   dsd.keyIDCount ¤¤   = 0;
f5cf78 ¤   dsd.conventional¤   = FALSE;
296384 ¤   dsd.ownerKey¤   ¤   = kInvalidPGPKeyRef;
dc1a9c ¤   typeList[0] = kPGPMacFileCreator_SplitKey;
df67c5 ¤
bd07fc ¤   if( IsntNull( inFSSpec ) )
85d950 ¤   ¤   pgpCopyMemory( inFSSpec, &fsSpec, sizeof(FSSpec) );
4067c5 ¤
a08cf4 ¤   if( IsntNull( inFSSpec ) ||
be2565 ¤   ¤   CustomGetFileWithShowAll( 1, typeList, &fsSpec ) )
46c7a1 ¤   {
9279f2 ¤   ¤   CSendKeyShares¤ ¤   *sksDialog;
88fe0f ¤   ¤   char¤   ¤   ¤   ¤   name[256];
645399 ¤   ¤   PGPUInt32¤  ¤   ¤   numShares = 0;
810702 ¤   ¤   PGPSize¤¤   ¤   ¤   nameSize = 0;
c41b52 ¤   ¤
569e09 ¤   ¤   err = PFLNewFileSpecFromFSSpec( gPGPMemoryMgr, &fsSpec, &fsRef );
f8d223 ¤   ¤   if( IsPGPError( err ) )
d91dc4 ¤   ¤   ¤   goto done;
6a7cc7 ¤   ¤   err = PGPOpenShareFile( fsRef, &sfRef );
e0d223 ¤   ¤   if( IsPGPError( err ) )
9d1dc4 ¤   ¤   ¤   goto done;
971fb9 ¤   ¤   err = PGPGetShareFileUserID( sfRef, sizeof(name), name, &nameSize );
e3d223 ¤   ¤   if( IsPGPError( err ) )
1f1dc4 ¤   ¤   ¤   goto done;
378542 ¤   ¤   numShares = PGPGetNumSharesInFile( sfRef );
d2e76a ¤   ¤   err = PGPBuildOptionList( gPGPContext, &decodeOpt,
dc2c74 ¤   ¤   ¤   ¤   PGPOKeySetRef( gPGPContext, CPGPKeys::TheApp()->GetKeySet() ),
922724 ¤   ¤   ¤   ¤   PGPOEventHandler( gPGPContext, DecryptSharesHandler, &dsd ),
176f55 ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
43d223 ¤   ¤   if( IsPGPError( err ) )
041dc4 ¤   ¤   ¤   goto done;
6b41d2 ¤   ¤   err = PGPCopySharesFromFile( gPGPContext, sfRef, decodeOpt, &shares );
d4d223 ¤   ¤   if( IsPGPError( err ) )
d31dc4 ¤   ¤   ¤   goto done;
8cdaf0 ¤   ¤   if( dsd.conventional )
535b34 ¤   ¤   {
fffd67 ¤   ¤   ¤   Str255¤ ¤   pstr;
931ee0 ¤   ¤   ¤   char¤   ¤   cstr[256];
886301 ¤   ¤   ¤   char¤   ¤   *passphrase = NULL;
d087c7 ¤   ¤   ¤
fbb0c1 ¤   ¤   ¤   GetIndString( pstr, kStringListID, kAuthPhraseStringID );
508622 ¤   ¤   ¤   PToCString( pstr, cstr );
8984a8 ¤   ¤   ¤   err = PGPSigningPassphraseDialog( gPGPContext,
969725 ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet(),
843744 ¤   ¤   ¤   ¤   ¤   ¤   &dsd.ownerKey,
01326b ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt( gPGPContext, cstr ),
d98fe7 ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( gPGPContext, &passphrase ),
7c537d ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
4659df ¤   ¤   ¤   if( IsPGPError( err ) )
21ff25 ¤   ¤   ¤   ¤   goto done;
972b85 ¤   ¤   ¤   ¤
cdf7d2 ¤   ¤   ¤   CopyCString( passphrase, dsd.passphrase );
838095 ¤   ¤   ¤   PGPFreeData( passphrase );
160fe4 ¤   ¤   }
091b52 ¤   ¤
--772b 001f8353310401201c5 Page 7 of CSendKeyShares.cp
13e51d ¤   ¤   RegisterClass_( CSendKeyShares );¤
6f963f ¤   ¤   sksDialog = (CSendKeyShares *)
bd40be ¤   ¤   ¤   LWindow::CreateWindow( window_SendKeyShares, CPGPKeys::TheApp() );
77976c ¤   ¤   sksDialog->SetShareInfo( shares, name, numShares,
6fb252 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dsd.ownerKey, dsd.passphrase );
30cff5 ¤   ¤   shares = NULL;
199371 ¤   }
80b38c done:
d5e78d ¤   if( IsntNull( shares ) )
00028a ¤   ¤   PGPFreeShares( shares );
126d13 ¤   if( PGPOptionListRefIsValid( decodeOpt ) )
d95745 ¤   ¤   PGPFreeOptionList( decodeOpt );
da8899 ¤   if( IsntNull( sfRef ) )
998e0c ¤   ¤   PGPFreeShareFile( sfRef );
1a4bfc ¤   if( IsntNull( fsRef ) )
f11ac6 ¤   ¤   PFLFreeFileSpec( fsRef );
66b1d6 ¤   if( IsPGPError( err ) && ( err != kPGPError_UserAbort ) )
ff3822 ¤   ¤   ReportPGPError( err );
7b6e09 ¤   if( PGPKeySetRefIsValid( dsd.recipientSet ) )
1493bf ¤   ¤   PGPFreeKeySet( dsd.recipientSet );
3d75f4 ¤   if( IsntNull( dsd.keyIDList ) )
61a296 ¤   ¤   PGPFreeData( dsd.keyIDList );
8b830f ¤   return;
dcefe6 }
6daf5a
ff6d52 ¤   void
8169c8 CSendKeyShares::FindCommandStatus(
02ea24 ¤   CommandT¤   inCommand,
bca472 ¤   Boolean¤¤   &outEnabled,
343a4d ¤   Boolean¤¤   &outUsesMark,
555dc0 ¤   Char16¤ ¤   &outMark,
31d894 ¤   Str255¤ ¤   outName)
f3bb36 {
c35e7f ¤   outEnabled = false;
57efe6 }
f8af5a
--834a 0003947219d401201c6 Page 1 of CSendKeyShares.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
32d34b ¤   $Id: CSendKeyShares.h,v 1.8.8.1 1998/11/12 03:08:17 heller Exp $
3df7f7 ____________________________________________________________________________*/
517b7d #pragma once
b8af5a
e2f0a0 #include <LGADialog.h>
6ef1a9 #include <LListener.h>
ef2f94 #include <LCommander.h>
dd0a93 #include <LPeriodical.h>
4705c6 #include <LStaticText.h>
67d797 #include <LPushButton.h>
feaf5a
f59f63 #include "pgpEncode.h"
c4b869 #include "pgpSKEP.h"
fdaf5a
20bf4a #include "MacSecureMemory.h"
4baf5a
ec2c6b class LSimpleThread;
4baf5a
a6fbf4 class CSendKeyShares¤   ¤   :¤  ¤   ¤   ¤   public LGADialog,
1ef7ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LCommander,
2cbce8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener,
3e8208 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LPeriodical
5ebb36 {
fb5ed4 public:
70cc53 ¤   enum { class_ID = 'SKss' };
08500d ¤   ¤   ¤   ¤   ¤   CSendKeyShares();
a0f70a ¤   ¤   ¤   ¤   ¤   CSendKeyShares(LStream *inStream);
364906 ¤   ¤   ¤   ¤   ¤   ~CSendKeyShares();
ca2fb5 ¤   void¤   ¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
268182 ¤   void¤   ¤   ¤   FinishCreateSelf();
7e8219 ¤   void¤   ¤   ¤   SpendTime(
d613fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord¤  ¤   &inMacEvent);
5cfa2b ¤   virtual void¤   FindCommandStatus(CommandT inCommand,
c00bef ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
4d40c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName);
6c67c5 ¤
bf4e03 ¤   static void¤¤   SendKeyShares(¤ FSSpec *¤   ¤   ¤   inFSSpec );
8eed31 ¤   void¤   ¤   ¤   SendSharesThread();
2e0fb9 private:
0782c6 ¤   void¤   ¤   ¤   SetShareInfo(¤  PGPShareRef¤¤   ¤   shares,
c2a357 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   char¤   ¤   ¤   ¤   *name,
147541 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   numShares,
f808cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef¤  ¤   ¤   authKey,
09dee9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   char const¤ ¤   ¤   *passphrase );
e0af5a
45bf99 ¤   static PGPError¤DecryptSharesHandler(
300da8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPContextRef¤  ¤   context,
91e69a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEvent¤   ¤   ¤   *event,
de1d98 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void¤   ¤   ¤   ¤   *userValue);
80da54 ¤   static PGPError¤SKEPHandler(¤   PGPskepRef¤ ¤   ¤   skepRef,
b77128 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPskepEvent¤   ¤   *event,
8d3add ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue¤   ¤   userValue );
1e97bf ¤   PGPError¤   ¤   SKEPHandler1(¤  PGPskepEvent¤   ¤   *event¤ );
5267c5 ¤
8b990b ¤   PGPShareRef¤¤   ¤   mShares;
f170d4 ¤   Str255¤ ¤   ¤   ¤   mName;
aa0ddb ¤   PGPUInt32¤  ¤   ¤   mNumShares;
a84626 ¤   PGPKeyRef¤  ¤   ¤   mAuthKey;
891a7f ¤   CSecureCString256¤  mAuthPhrase;
e05439 ¤   char¤   ¤   ¤   ¤   mRemoteAddress[256];
9baa14 ¤   LPushButton¤¤   ¤   *mSendButton;
8d2b12 ¤   PGPBoolean¤ ¤   ¤   mSending;
a5e6c3 ¤   PGPBoolean¤ ¤   ¤   mAbort;
a6b365 ¤   PGPBoolean¤ ¤   ¤   mFinished;
2c2374 ¤   LStaticText¤¤   ¤   *mStatusText,
39efec ¤   ¤   ¤   ¤   ¤   ¤   *mAuthText;
--f4d1 0014afb210f401201c6 Page 2 of CSendKeyShares.h
8bea62 ¤   LSimpleThread¤  ¤   *mSKEPThread;
b667c5 ¤
62e23f ¤   enum¤   {¤
d69911 ¤   ¤   ¤   ¤   kCancelButton¤  ¤   ¤   = 'bCan',
8921ec ¤   ¤   ¤   ¤   kShareNameText¤ ¤   ¤   = 'cNam',
5192c1 ¤   ¤   ¤   ¤   kNumSharesText¤ ¤   ¤   = 'cSha',
08cdc9 ¤   ¤   ¤   ¤   kSendSharesButton¤  ¤   = 'bSnd',
3b015a ¤   ¤   ¤   ¤   kRemoteAddressField¤¤   = 'eAdd',
5ce790 ¤   ¤   ¤   ¤   kStatusText¤¤   ¤   ¤   = 'cSta',
500c69 ¤   ¤   ¤   ¤   kAuthenticatedText¤ ¤   = 'cAut'
5fc0bf ¤   ¤   ¤   };
2482f7 };
4aaf5a
--1fd0 0009f748496401201c7 Page 1 of CSignDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
6e491a ¤   $Id: CSignDialog.cp,v 1.48.8.1 1998/11/12 03:08:17 heller Exp $
04f7f7 ____________________________________________________________________________*/
7caf5a
c4255b #include <Fonts.h>
c8af5a
348708 #include <LCheckBox.h>
f1d797 #include <LPushButton.h>
bfa94f #include <LTextGroupBox.h>
468708 #include <LCheckBox.h>
3eec08 #include <LLittleArrows.h>
3640db #include <LRadioButton.h>
c3a787 #include <LTableView.h>
3a7c52 #include <LTableMonoGeometry.h>
8e2ab7 #include <LTableSingleSelector.h>
a17b38 #include <LTableArrayStorage.h>
8a8f92 #include <UGAColorRamp.h>
fc7c99 #include <URegistrar.h>
eddd06 #include <UDesktop.h>
5fe8ae #include <UDrawingUtils.h>
a0af5a
88324c #include <string.h>
f2af5a
4121d6 #include "CSignDialog.h"
7caf5a
036ff8 #include "CKeyTable.h"
fad49e #include "CKeyInfoWindow.h"
4f9dc2 #include "CWarningAlert.h"
de4d6a #include "CGADurationEditField.h"
345dc0 #include "ResourceConstants.h"
18b8cb #include "CPGPKeys.h"
39d73a #include "CSecureMemory.h"
7baf5a
fca02f #include "pgpClientLib.h"
f3e684 #include "pgpUserInterface.h"
a1af5a
b60d08 #include "pgpMem.h"
152f8d #include "pgpErrors.h"
5385c2 #include "MacStrings.h"
4ac97b #include "pgpClientPrefs.h"
dcaf5a
3b4165 const Int16¤¤   kUserIDColumnWidth¤ ¤   =¤  220;
7c541f const Int16¤¤   kFingerprintColumnWidth¤=¤  280;
c3fc7c const Int16¤¤   kUserIDStringLength¤¤   =¤  256;
a3af5a
0ff989 enum¤   {
45392e ¤   ¤   ¤   kStringListID¤  ¤   ¤   = 1019,
65862b ¤   ¤   ¤   kAdvancedOptionsStringID= 1,
f76c2b ¤   ¤   ¤   kFewerOptionsStringID,
eca1db ¤   ¤   ¤   kNameColumnStringID,
48b676 ¤   ¤   ¤   kFingerprintColumnStringID,
84f827 ¤   ¤   ¤   kDuplicateCertID,
feaf96 ¤   ¤   ¤   kEnterPassphrasePromptStringID,
029e1a ¤   ¤   ¤   kPhotographStringID,
2291d8 ¤   ¤   ¤   kUnknownStringID,
6ad4ca ¤   ¤   ¤   kBadExpirationStringID
65a105 ¤   ¤   };
17af5a
af3580 class CUserIDList¤  :¤  public LTableView
80bb36 {
a95ed4 public:
0eaa62 ¤   enum { class_ID = 'uidL' };
a921eb ¤   static CUserIDList*¤CreateFromStream(LStream *inStream);
6767c5 ¤
d40cab ¤   ¤   ¤   ¤   ¤   ¤   ¤   CUserIDList(LStream *inStream);
bdc520 ¤   void¤   ¤   ¤   ¤   ¤   DrawSelf();
9f700d ¤   void¤   ¤   ¤   ¤   ¤   DrawCell(
--d4ca 0000fedd971401201c7 Page 2 of CSignDialog.cp
1b6d8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &inCell,
3b8e01 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect¤ ¤   ¤   &inLocalRect);
84d291 ¤   void¤   ¤   ¤   ¤   ¤   HiliteCellActively(
ba6d8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &inCell,
3bffa6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   inHilite);
14b934 ¤   void¤   ¤   ¤   ¤   ¤   HiliteCellInactively(
e36d8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   &inCell,
89f05b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ·¤  inHilite);
c28023 ¤   void¤   ¤   ¤   ¤   ¤   ClickSelf(
7b098f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent &inMouseDown);
1082f7 };
b8af5a
b4af5a
5b6abb class¤  CUserIDHeaders¤ :¤  public LPane
6bbb36 {
b05ed4 public:
41bace ¤   enum { class_ID = 'uidH' };
e3af5a
210942 ¤   ¤   ¤   ¤   ¤   ¤   CUserIDHeaders(LStream *inStream);
f140ab ¤   virtual¤¤   ¤   ¤   ~CUserIDHeaders();
9de572 ¤   void¤   ¤   ¤   ¤   DrawSelf();
4e82f7 };
63af5a
cc8ce2 CSignDialog::CSignDialog()
b3bb36 {
fcb8a6 ¤   RegisterClass_(CUserIDList);
ac5afd ¤   RegisterClass_(CUserIDHeaders);
38efe6 }
76af5a
6028f2 CSignDialog::CSignDialog(LStream *inStream)
9f1fb6 ¤   : LGADialog(inStream)
0cbb36 {
d4b8a6 ¤   RegisterClass_(CUserIDList);
d65afd ¤   RegisterClass_(CUserIDHeaders);
77efe6 }
66af5a
e58bc7 CSignDialog::~CSignDialog()
35bb36 {
dab487 ¤   if(IsntNull(mUserIDs))
9288eb ¤   ¤   pgpFree(mUserIDs);
3befe6 }
6eaf5a
9f6d52 ¤   void
622d3c CSignDialog::FinishCreateSelf()
3cbb36 {
f3a43e ¤   LLittleArrows¤  *arrowsObj;
73d6af ¤   UInt32¤ ¤   ¤   timeNow;
96af5a
8d893a ¤   LGADialog::FinishCreateSelf();
cd67c5 ¤
d616a7 ¤   mUserIDs = NULL;
62b51f ¤   mAdvancedMode = FALSE;
361150 ¤   mExportCheckbox = (LCheckBox *) FindPaneByID(kExportCheckbox);
f6edfa ¤   mAdvancedButton = (LPushButton *) FindPaneByID(kAdvancedButton);
706b68 ¤   mAdvancedButton->AddListener(this);
48f581 ¤   mSignButton = (LPushButton *) FindPaneByID(kSignButton);
1e54c2 ¤   mCancelButton = (LPushButton *) FindPaneByID(kCancelButton);
c1722d ¤   mSignTypesGroup = (LTextGroupBox *) FindPaneByID(kSignTypesGroup);
029297 ¤   mExpireTypesGroup = (LTextGroupBox *) FindPaneByID(kExpireTypesGroup);
8b9781 ¤   mSignN0Radio = (LRadioButton *) FindPaneByID(kSignTypeN0Radio);
ede102 ¤   mSignE0Radio = (LRadioButton *) FindPaneByID(kSignTypeE0Radio);
e359b5 ¤   mSignE1Radio = (LRadioButton *) FindPaneByID(kSignTypeE1Radio);
03eefe ¤   mSignN2Radio = (LRadioButton *) FindPaneByID(kSignTypeN2Radio);
071a25 ¤   mNeverExpireRadio = (LRadioButton *) FindPaneByID(kNeverExpireRadio);
27c476 ¤   mExpirationRadio = (LRadioButton *) FindPaneByID(kExpirationRadio);
a0155e ¤   mScroller = (LActiveScroller *) FindPaneByID(kUserIDScroller);
61f13d ¤   mDomainEdit = (LEditText *) FindPaneByID(kDomainEdit);
d1b747 ¤   SwitchTarget(mDomainEdit);
1067c5 ¤
74e516 ¤   mExpirationDate = (CGADurationEditField *) FindPaneByID(kExpirationDate);
67243d ¤   mExpirationDate->SetDurationType(kDateDurationType);
0f10a3 ¤   GetDateTime( &timeNow );
--99df 00023ed8127401201c7 Page 3 of CSignDialog.cp
d74458 ¤   mExpirationDate->SetDurationValue( timeNow );
465bf6 ¤   arrowsObj = (LLittleArrows *) FindPaneByID(kExpirationArrows);
eeab92 ¤   mLastArrowValue = arrowsObj->GetValue();
ef0197 ¤   arrowsObj->AddListener(this);
35efe6 }
5caf5a
936d52 ¤   void
6e1adb CSignDialog::SetUserIDs(PGPKeyRef¤  ¤   signer,
2c052b ¤   ¤   ¤   ¤   ¤   ¤   KeyTableRef¤¤   *userIDs,
2b497d ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   ¤   numUserIDs)
dfbb36 {
cdca4e ¤   CUserIDList *uidList;
da67c5 ¤
a16b2c ¤   mSigner = signer;
cfbd18 ¤   mUserIDs = userIDs;
4e62bf ¤   mNumUserIDs = numUserIDs;
00cc0e ¤   uidList = (CUserIDList *)FindPaneByID(kUserIDList);
e73260 ¤   uidList->InsertCols(1, 1, NULL, 0, TRUE);
b3eb5e ¤   for(Int16 inx=0;inx<numUserIDs;inx++)
4bc7a1 ¤   {
5c6076 ¤   ¤   uidList->InsertRows(1, 32767,
95b710 ¤   ¤   ¤   &userIDs[inx],
207aaa ¤   ¤   ¤   sizeof(KeyTableRef),
2b55ad ¤   ¤   ¤   true);
909371 ¤   }
5e60d9 ¤   Show();
53efe6 }
b3af5a
a36d52 ¤   void
e62ad4 CSignDialog::DrawSelf()
a3bb36 {
471fc1 ¤   Rect¤   frame;
e767c5 ¤
3b1f29 ¤   LGADialog::DrawSelf();
039ecb ¤   FocusDraw();
9a3924 ¤   mScroller->CalcPortFrameRect(frame);
fb934c ¤   InsetRect(&frame, -1, -1);
359791 ¤   RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray7));
20af5b ¤   MoveTo(frame.left, frame.bottom-1);
0446af ¤   LineTo(frame.left, frame.top - 16);
8e5b32 ¤   LineTo(frame.right - 1, frame.top - 16);
1d9d77 ¤   RGBForeColor(&UGAColorRamp::GetColor(colorRamp_White));
6c2efc ¤   MoveTo(frame.left+1, frame.bottom - 1);
c13863 ¤   LineTo(frame.right - 1, frame.bottom - 1);
d095b3 ¤   LineTo(frame.right - 1, frame.top - 15);¤
29efe6 }
c1af5a
8ec744 ¤   PGPError
4cd5de CSignDialog::GetParams(
a993e4 ¤   PGPUInt32¤  ¤   *trustLevel,
05a7a9 ¤   PGPBoolean¤ ¤   *exportable,
8db333 ¤   PGPUInt32¤  ¤   *expireDays )
23bb36 {
6b8e12 ¤   PGPError¤   err = kPGPError_NoErr;
df67c5 ¤
8ed618 ¤   *expireDays = 0;
4c1931 ¤   if(mAdvancedMode)
8bc7a1 ¤   {
8a3038 ¤   ¤   if(mSignN0Radio->GetValue())
385b34 ¤   ¤   {
2d1a24 ¤   ¤   ¤   *trustLevel = 0;
d420ee ¤   ¤   ¤   *exportable = FALSE;
050fe4 ¤   ¤   }
eac7ae ¤   ¤   else if(mSignE0Radio->GetValue())
575b34 ¤   ¤   {
d41a24 ¤   ¤   ¤   *trustLevel = 0;
732401 ¤   ¤   ¤   *exportable = TRUE;
c20fe4 ¤   ¤   }
3218f8 ¤   ¤   else if(mSignE1Radio->GetValue())
8d5b34 ¤   ¤   {
c540f8 ¤   ¤   ¤   *trustLevel = 1;
232401 ¤   ¤   ¤   *exportable = TRUE;
--b517 0003e213d18401201c7 Page 4 of CSignDialog.cp
b50fe4 ¤   ¤   }
0e9bd6 ¤   ¤   else if(mSignN2Radio->GetValue())
525b34 ¤   ¤   {
9daf9c ¤   ¤   ¤   *trustLevel = 2;
3e20ee ¤   ¤   ¤   *exportable = FALSE;
780fe4 ¤   ¤   }
5cb13a ¤   ¤   if( mExpirationRadio->GetValue() > 0 )
145b34 ¤   ¤   {
59fa41 ¤   ¤   ¤   UInt32¤ ¤   expireDate,
8d0726 ¤   ¤   ¤   ¤   ¤   ¤   timeNow;
9587c7 ¤   ¤   ¤
6ac6ea ¤   ¤   ¤   expireDate = mExpirationDate->GetDurationValue();
3298aa ¤   ¤   ¤   GetDateTime(&timeNow);
d1775e ¤   ¤   ¤   if( timeNow > expireDate )
8bf776 ¤   ¤   ¤   {
494bb6 ¤   ¤   ¤   ¤   CWarningAlert::Display(kWAStopAlertType,
e70c1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
4aba2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
5efd29 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kBadExpirationStringID);
55566c ¤   ¤   ¤   ¤   err = kPGPError_BadParams;
bda3a6 ¤   ¤   ¤   }
9ebb8c ¤   ¤   ¤   else
458f32 ¤   ¤   ¤   ¤   *expireDays = ( ( expireDate - timeNow ) / 86400 ) + 1;
6d0fe4 ¤   ¤   }
d99371 ¤   }
a70e24 ¤   else
73c7a1 ¤   {
8b2e79 ¤   ¤   *trustLevel = 0;
00c861 ¤   ¤   if(mExportCheckbox->GetValue())
c82401 ¤   ¤   ¤   *exportable = TRUE;
c10e1d ¤   ¤   else
b620ee ¤   ¤   ¤   *exportable = FALSE;
fe9371 ¤   }
df5ea8 ¤   return err;
29efe6 }
45af5a
476d52 ¤   void
c0e826 CSignDialog::DomainToRegExp(
e23485 ¤   char¤   ¤   *domain,
6f0317 ¤   char¤   ¤   *regExp )
62bb36 {
534721 ¤   char ¤  ¤   *s = domain,
856c57 ¤   ¤   ¤   ¤   *d = regExp;
6967c5 ¤
7588e9 ¤   strcpy( d, "<[^>]+[@.]" );
f4eb8f ¤   d += strlen( d );
bf67c5 ¤
d9135d ¤   for( ; *s; s++ )
d9c7a1 ¤   {
4fcefc ¤   ¤   switch( *s )
2a5b34 ¤   ¤   {
1d7d84 ¤   ¤   ¤   case '*':
a7613f ¤   ¤   ¤   case '+':
d7d072 ¤   ¤   ¤   case '?':
9c0f68 ¤   ¤   ¤   case '.':
b5552d ¤   ¤   ¤   case '^':
46d3c6 ¤   ¤   ¤   case '$':
761578 ¤   ¤   ¤   case '\\':
4d3b7a ¤   ¤   ¤   case '[':
f270e0 ¤   ¤   ¤   case ']':
a62aa5 ¤   ¤   ¤   case '-':
08e284 ¤   ¤   ¤   ¤   *d++ = '\\';
819d25 ¤   ¤   ¤   ¤   *d++ = *s;
6bf622 ¤   ¤   ¤   ¤   break;
eedb68 ¤   ¤   ¤   default:
0a9d25 ¤   ¤   ¤   ¤   *d++ = *s;
32f622 ¤   ¤   ¤   ¤   break;
790fe4 ¤   ¤   }
f29371 ¤   }
13ac8a ¤   *d++ = '>';
02b385 ¤   *d++ = '$';
3e2853 ¤   *d++ = '\0';
--5cd0 00037aff5a1401201c7 Page 5 of CSignDialog.cp
7aefe6 }
46af5a
746d52 ¤   void
9cecc4 CSignDialog::Sign()
31bb36 {
9706ee ¤   PGPError¤   ¤   ¤   ¤   ¤   err;
d3d034 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   success = FALSE;
60acec ¤   PGPBoolean¤ ¤   ¤   ¤   ¤   ksSync,
86fdaf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   split = FALSE;
aed662 ¤   CSecureCString256¤  ¤   ¤   passphrase;
21aa27 ¤   PGPByte¤¤   ¤   ¤   ¤   ¤   *passKey = NULL;
55cb4b ¤   PGPSize¤¤   ¤   ¤   ¤   ¤   passKeySize;
c467c5 ¤
9f8cf5 ¤   Hide();
daaf5a
defcb8 ¤   err = PGPGetPrefBoolean(gPrefRef,
15e485 ¤   ¤   ¤   ¤   kPGPPrefKeyServerSyncOnKeySign, &ksSync);
65dd44 ¤   pgpAssertNoErr(err);
e867c5 ¤
3dfb29 ¤   UDesktop::Deactivate();
f5c7a1 ¤   {
cc1b7d ¤   ¤   PGPGetPassphraseSettings¤   signDialogFlags;
1d2058 ¤   ¤   char¤   ¤   ¤   ¤   ¤   ¤   promptCStr[256];
68e372 ¤   ¤   Str255¤ ¤   ¤   ¤   ¤   ¤   promptStr;
341b52 ¤   ¤
3993ff ¤   ¤   ::GetIndString(¤promptStr,
b8fd4b ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
31a638 ¤   ¤   ¤   ¤   ¤   ¤   kEnterPassphrasePromptStringID);
fddd94 ¤   ¤   PToCString(promptStr, promptCStr);
249720 ¤   ¤   err = PGPClientSigningPassphraseDialog
70c3b9 ¤   ¤   ¤   (¤  gPGPContext,
e9ab0d ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet(),
b37969 ¤   ¤   ¤   ¤   promptCStr,
a75d88 ¤   ¤   ¤   ¤   kPGPGetPassphraseOptionsHideFileOptions,
20038c ¤   ¤   ¤   ¤   0,
e5b4ee ¤   ¤   ¤   ¤   mSigner,
e08279 ¤   ¤   ¤   ¤   passphrase,
649b42 ¤   ¤   ¤   ¤   &signDialogFlags,
c07123 ¤   ¤   ¤   ¤   &mSigner );
f39371 ¤   }
8d67c5 ¤
01aa69 ¤   if( err == kPGPError_KeyUnusableForSignature )
95c7a1 ¤   {
72c023 ¤   ¤   PGPGetKeyBoolean( mSigner, kPGPKeyPropIsSecretShared, &split );
ddb363 ¤   ¤   if( split )
de28ba ¤   ¤   ¤   err = PGPReconstitutionDialog( mSigner,
ab8b19 ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet(), gTLSContext,
4bfcf7 ¤   ¤   ¤   ¤   &passKey, &passKeySize);
739371 ¤   }
485824 ¤   UDesktop::Activate();
0267c5 ¤
dab1f0 ¤   if( IsntPGPError( err ) )
adc7a1 ¤   {
d55054 ¤   ¤   Int32¤  ¤   ¤   uIndex;
d1ae2e ¤   ¤   PGPUserIDRef¤   userID;
44f3d1 ¤   ¤   Boolean¤¤   ¤   dupeWarning = FALSE;
9ce102 ¤   ¤   PGPUInt32¤  ¤   trustLevel,
c51deb ¤   ¤   ¤   ¤   ¤   ¤   expirationDays = 0;
3929e8 ¤   ¤   Boolean¤¤   ¤   exportable,
cd5d3f ¤   ¤   ¤   ¤   ¤   ¤   domainRestrict = FALSE;
ebfb75 ¤   ¤   char¤   ¤   ¤   domainRegExp[256];
741b52 ¤   ¤
93efdd ¤   ¤   if( IsntPGPError(
d47528 ¤   ¤   ¤   ¤   GetParams( &trustLevel, &exportable, &expirationDays ) ) )
5c7d57 ¤   ¤   ¤   for(uIndex = mNumUserIDs - 1; uIndex >= 0; uIndex--)·
c5f776 ¤   ¤   ¤   {
3561a0 ¤   ¤   ¤   ¤   if(mUserIDs[uIndex].type == kKey)
c072c3 ¤   ¤   ¤   ¤   {
5c2c43 ¤   ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserID(mUserIDs[uIndex].u.key,
c6b795 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &userID);
d16aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
372613 ¤   ¤   ¤   ¤   }
--84d9 000d881304a401201c7 Page 6 of CSignDialog.cp
563ad2 ¤   ¤   ¤   ¤   else if(mUserIDs[uIndex].type == kUserID)
be1049 ¤   ¤   ¤   ¤   ¤   userID = mUserIDs[uIndex].u.user;
1f6e57 ¤   ¤   ¤   ¤   if( ( trustLevel == 1 ) && exportable )
b472c3 ¤   ¤   ¤   ¤   {
0c1cc2 ¤   ¤   ¤   ¤   ¤   Str255¤ domainPString;
87193a ¤   ¤   ¤   ¤   ¤   char¤   domainCString[256];
46ae30 ¤   ¤   ¤   ¤   ¤
3a84a4 ¤   ¤   ¤   ¤   ¤   mDomainEdit->GetDescriptor( domainPString );
adddc6 ¤   ¤   ¤   ¤   ¤   if( domainPString[0] > 0 )
074859 ¤   ¤   ¤   ¤   ¤   {
c147e3 ¤   ¤   ¤   ¤   ¤   ¤   PToCString( domainPString, domainCString );
425e7b ¤   ¤   ¤   ¤   ¤   ¤   DomainToRegExp( domainCString, domainRegExp );
d2029f ¤   ¤   ¤   ¤   ¤   ¤   domainRestrict = TRUE;
e31c89 ¤   ¤   ¤   ¤   ¤   }
f92613 ¤   ¤   ¤   ¤   }
a7be63 ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetMinimumRandomData();
115272 ¤   ¤   ¤   ¤   err = PGPSignUserID( userID, mSigner,
2be35b ¤   ¤   ¤   ¤   ¤   PGPOExpiration( gPGPContext, expirationDays ),
6948a2 ¤   ¤   ¤   ¤   ¤   PGPOExportable( gPGPContext, exportable ),
f1acbd ¤   ¤   ¤   ¤   ¤   PGPOSigTrust( gPGPContext, trustLevel,
d7e719 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyTrust_Complete ),
77dc87 ¤   ¤   ¤   ¤   ¤   split ?
a1bcc1 ¤   ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, passKey, passKeySize ):
778fd7 ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, passphrase ),
00a623 ¤   ¤   ¤   ¤   ¤   domainRestrict ?
c3bbe1 ¤   ¤   ¤   ¤   ¤   ¤   PGPOSigRegularExpression( gPGPContext, domainRegExp ) :
bf55b4 ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( gPGPContext ),
e63c4e ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
cab1fe ¤   ¤   ¤   ¤   if( err == kPGPError_DuplicateCert )
6c72c3 ¤   ¤   ¤   ¤   {
c65a6b ¤   ¤   ¤   ¤   ¤   if( !dupeWarning )
bd4859 ¤   ¤   ¤   ¤   ¤   {
10f9c5 ¤   ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType,
529a5e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kWAOKStyle,
67ab0a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
76f02e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDuplicateCertID);
f1c373 ¤   ¤   ¤   ¤   ¤   ¤   dupeWarning = TRUE;
c81c89 ¤   ¤   ¤   ¤   ¤   }
bb2613 ¤   ¤   ¤   ¤   }
69fa07 ¤   ¤   ¤   ¤   else
2472c3 ¤   ¤   ¤   ¤   {
3a6aca ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
20a511 ¤   ¤   ¤   ¤   ¤   if(IsntPGPError(err))
993926 ¤   ¤   ¤   ¤   ¤   ¤   success = TRUE;
eebca1 ¤   ¤   ¤   ¤   ¤   if(ksSync && exportable)
9b4859 ¤   ¤   ¤   ¤   ¤   {
f106f3 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPSendKeyToServer(
4af594 ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, gTLSContext,
eef505 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mUserIDs[uIndex].ownerKey, NULL);
f7361f ¤   ¤   ¤   ¤   ¤   ¤   if(IsPGPError(err) &&
159637 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (err != kPGPError_UserAbort))
eb50ec ¤   ¤   ¤   ¤   ¤   ¤   ¤   ReportPGPError(err);
a31c89 ¤   ¤   ¤   ¤   ¤   }
a02613 ¤   ¤   ¤   ¤   }
f9a3a6 ¤   ¤   ¤   }
ef0d9a ¤   ¤   if(success)
9b5b34 ¤   ¤   {
0adf4a ¤   ¤   ¤   CPGPKeys::TheApp()->CommitDefaultKeyrings();
be6f1a ¤   ¤   ¤   BroadcastMessage(kKeyTableResyncMessage, NULL);
bb0fe4 ¤   ¤   }
a29371 ¤   }
566acd ¤   if( IsntNull( passKey ) )
674f51 ¤   ¤   PGPFreeData( passKey );
f7efe6 }
faaf5a
3f6d52 ¤   void
358889 CSignDialog::ListenToMessage(
cb7b08 ¤   MessageT¤   inMessage,
0eda2c ¤   void¤   ¤   *ioParam )
49bb36 {
d226d0 ¤   switch(inMessage)
d8c7a1 ¤   {
--402a 00064538b6b401201c7 Page 7 of CSignDialog.cp
bbb177 ¤   ¤   case kSignButton:
28b6b3 ¤   ¤   ¤   Sign();
c4be31 ¤   ¤   case kCancelButton:
36ffe5 ¤   ¤   ¤   delete this;
8acdcb ¤   ¤   ¤   break;
963fd0 ¤   ¤   case kAdvancedButton:
8ff776 ¤   ¤   ¤   {
a7d19f ¤   ¤   ¤   ¤   Rect¤   ¤   windBounds;
5a2e46 ¤   ¤   ¤   ¤   Str255¤ ¤   str;
1e2b85 ¤   ¤   ¤   ¤
9060d8 ¤   ¤   ¤   ¤   if(mAdvancedMode)
c672c3 ¤   ¤   ¤   ¤   {
5dc460 ¤   ¤   ¤   ¤   ¤   mSignTypesGroup->Hide();
111396 ¤   ¤   ¤   ¤   ¤   mExpireTypesGroup->Hide();
b6f00b ¤   ¤   ¤   ¤   ¤   mExportCheckbox->Show();
378889 ¤   ¤   ¤   ¤   ¤   GetMinMaxSize(windBounds);
06647c ¤   ¤   ¤   ¤   ¤   ResizeWindowTo(windBounds.right, windBounds.top);
6121fa ¤   ¤   ¤   ¤   ¤   GetIndString(¤  str,
42ba2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
26723b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAdvancedOptionsStringID);
062613 ¤   ¤   ¤   ¤   }
2bfa07 ¤   ¤   ¤   ¤   else
af72c3 ¤   ¤   ¤   ¤   {
7d1c27 ¤   ¤   ¤   ¤   ¤   mExportCheckbox->Hide();
c9284c ¤   ¤   ¤   ¤   ¤   mSignTypesGroup->Show();
08ffba ¤   ¤   ¤   ¤   ¤   mExpireTypesGroup->Show();
f98826 ¤   ¤   ¤   ¤   ¤   CalcStandardBounds(windBounds);
6cc85d ¤   ¤   ¤   ¤   ¤   DoSetBounds(windBounds);
a221fa ¤   ¤   ¤   ¤   ¤   GetIndString(¤  str,
73ba2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID,
e9bff9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kFewerOptionsStringID);
6a2613 ¤   ¤   ¤   ¤   }
ad0151 ¤   ¤   ¤   ¤   mAdvancedButton->SetDescriptor(str);
b382be ¤   ¤   ¤   ¤   mAdvancedMode = !mAdvancedMode;
2fa3a6 ¤   ¤   ¤   }
cfcdcb ¤   ¤   ¤   break;
df1ad7 ¤   ¤   case kExpirationArrows:
d05b34 ¤   ¤   {
2bbb9b ¤   ¤   ¤   Int32¤  newValue = *(Int32 *)ioParam;
99af5a
fc5914 ¤   ¤   ¤   if(newValue < mLastArrowValue)
938ad2 ¤   ¤   ¤   ¤   mExpirationDate->AdjustValue(kDownAdjust);
30bb8c ¤   ¤   ¤   else
df4bf4 ¤   ¤   ¤   ¤   mExpirationDate->AdjustValue(kUpAdjust);
178d3d ¤   ¤   ¤   mLastArrowValue = newValue;
aacdcb ¤   ¤   ¤   break;
fa0fe4 ¤   ¤   }
3e9ae3 ¤   ¤   default:
b11d75 ¤   ¤   ¤   LGADialog::ListenToMessage( inMessage, ioParam );
8bcdcb ¤   ¤   ¤   break;
239371 ¤   }
e2efe6 }
99af5a
1c6d52 ¤   void
efaf38 CSignDialog::FindCommandStatus(
4aea24 ¤   CommandT¤   inCommand,
1ba472 ¤   Boolean¤¤   &outEnabled,
a73a4d ¤   Boolean¤¤   &outUsesMark,
ca5dc0 ¤   Char16¤ ¤   &outMark,
51d894 ¤   Str255¤ ¤   outName)
29bb36 {
e7f320 ¤   #pragma unused( inCommand, outUsesMark, outMark, outName )
7a67c5 ¤
6f5465 ¤   outEnabled = FALSE;
15efe6 }
feaf5a
08545d CUserIDList*
cfd458 CUserIDList::CreateFromStream(
b76689 ¤   LStream¤*inStream)
18bb36 {
fbd44b ¤   return (new CUserIDList(inStream));
64efe6 }
--3fa1 0009c92021e401201c7 Page 8 of CSignDialog.cp
e0af5a
1aaf5a
82f65f CUserIDList::CUserIDList(
d96689 ¤   LStream¤*inStream)
dcba7e ¤   ¤   : LTableView(inStream)
f3bb36 {
ee7524 ¤   mTableGeometry = new LTableMonoGeometry(this, mFrameSize.width, 18);
9cf97f ¤   mTableSelector = new LTableSingleSelector(this);
bfbc47 ¤   mTableStorage = new LTableArrayStorage(this, sizeof(KeyTableRef));
30efe6 }
76af5a
e76d52 ¤   void
d22393 CUserIDList::DrawSelf()
82bb36 {
acd8a7 ¤   Rect frame;
f2af5a
3ea659 ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray1));
81ccbb ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
aa40bf ¤   CalcLocalFrameRect(frame);
4fc7a1 ¤   {
63296f ¤   ¤   StDeviceLoop¤   devLoop(frame);¤¤
0977ad ¤   ¤   SInt16¤ ¤   ¤   depth;
2baf5a
52eb96 ¤   ¤   while(devLoop.NextDepth(depth))
ce5b34 ¤   ¤   {
fdc776 ¤   ¤   ¤   if(depth > 1)
d448b8 ¤   ¤   ¤   ¤   ::PaintRect(&frame);
0dbb8c ¤   ¤   ¤   else
0330c1 ¤   ¤   ¤   ¤   ::EraseRect(&frame);
340fe4 ¤   ¤   }
979371 ¤   }
20de04 ¤   LTableView::DrawSelf();
12efe6 }
1daf5a
b16d52 ¤   void
4fa35b CUserIDList::DrawCell(
011bb3 ¤   const STableCell¤   &inCell,
dec050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
b5bb36 {
c7d02d ¤   StDeviceLoop¤   devLoop(inLocalRect);¤  ¤
176385 ¤   SInt16¤ ¤   ¤   depth;
182eac ¤   Uint32¤ ¤   ¤   dataSize = sizeof(KeyTableRef);
7ffb19 ¤   PGPError¤   ¤   err;
71e86c ¤   KeyTableRef¤¤   keyRef;
e10370 ¤   PGPUserIDRef¤   userID;
fc6e14 ¤   Str255¤ ¤   ¤   str;
d4811d ¤   size_t¤ ¤   ¤   len;
5d86a4 ¤   Rect¤   ¤   ¤   sortColumnRect;
ad29a4 ¤   PGPInt32¤   ¤   algorithm;
d91700 ¤   short¤  ¤   ¤   iconResID;
dbb69a ¤   PGPBoolean¤ ¤   isAttributeID;
b967c5 ¤
302ec3 ¤   while(devLoop.NextDepth(depth))
03c7a1 ¤   {
339af1 ¤   ¤   if(depth >= 8)
d75b34 ¤   ¤   {
fda97d ¤   ¤   ¤   // Draw MacOS8-like background for cells, selected column
8c0f63 ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray1));
4a989b ¤   ¤   ¤   ::PaintRect(&inLocalRect);
a012af ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray2));
78c530 ¤   ¤   ¤   sortColumnRect = inLocalRect;
9757fb ¤   ¤   ¤   sortColumnRect.right = inLocalRect.left + kUserIDColumnWidth;
dd4970 ¤   ¤   ¤   ::PaintRect(&sortColumnRect);
7f3e1d ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_White));
6ecba3 ¤   ¤   ¤   ::MoveTo(inLocalRect.left, inLocalRect.bottom - 1);
0663b0 ¤   ¤   ¤   ::LineTo(inLocalRect.right - 1, inLocalRect.bottom - 1);
1f447a ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
ef0fe4 ¤   ¤   }
480e1d ¤   ¤   else
e15b34 ¤   ¤   {
68447a ¤   ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
9c6581 ¤   ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
--fb44 000aa2eb371401201c7 Page 9 of CSignDialog.cp
44373a ¤   ¤   ¤   ::EraseRect(&inLocalRect);
930fe4 ¤   ¤   }
152318 ¤   ¤   GetCellData(inCell, &keyRef, dataSize);
7b71ed ¤   ¤   if(keyRef.type == kKey)
405b34 ¤   ¤   {
f1c208 ¤   ¤   ¤   err = PGPGetPrimaryUserID(keyRef.u.key, &userID);
51524f ¤   ¤   ¤   pgpAssertNoErr(err);
060fe4 ¤   ¤   }
feeb2a ¤   ¤   else if(keyRef.type == kUserID)
3929e4 ¤   ¤   ¤   userID = keyRef.u.user;
e95159 ¤   ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
ab70a2 ¤   ¤   ::RGBBackColor(&UGAColorRamp::GetColor(colorRamp_White));
901b52 ¤   ¤
cd1a58 ¤   ¤   err = PGPGetUserIDBoolean( userID, kPGPUserIDPropIsAttribute,
c3fd31 ¤   ¤   ¤   ¤   ¤   &isAttributeID );
629832 ¤   ¤   pgpAssertNoErr( err );
df1b52 ¤   ¤
49490f ¤   ¤   if( isAttributeID )
075b34 ¤   ¤   {
999071 ¤   ¤   ¤   PGPInt32¤   attributeType;
43bba5 ¤   ¤   ¤   short¤  ¤   strIndex;
7787c7 ¤   ¤   ¤
bfb4bf ¤   ¤   ¤   err = PGPGetUserIDNumber( userID,
b1be58 ¤   ¤   ¤   ¤   ¤   kPGPUserIDPropAttributeType, &attributeType );
53144d ¤   ¤   ¤   pgpAssertNoErr( err );
7587c7 ¤   ¤   ¤
e9bcb6 ¤   ¤   ¤   if( attributeType == kPGPAttribute_Image )
3ef776 ¤   ¤   ¤   {
ea0f3f ¤   ¤   ¤   ¤   strIndex ¤  = kPhotographStringID;
6437d8 ¤   ¤   ¤   ¤   iconResID¤  = kPhotoUserIDIconID;
d1a3a6 ¤   ¤   ¤   }
71bb8c ¤   ¤   ¤   else
0cf776 ¤   ¤   ¤   {
e58a3a ¤   ¤   ¤   ¤   strIndex ¤  = kUnknownStringID;
527bba ¤   ¤   ¤   ¤   iconResID¤  = kUnknowUserIDIconID;
f8a3a6 ¤   ¤   ¤   }
e4af5a
9b7e2a ¤   ¤   ¤   ::GetIndString(¤str, kStringListID, strIndex);
b60fe4 ¤   ¤   }
500e1d ¤   ¤   else
945b34 ¤   ¤   {
ffa252 ¤   ¤   ¤   err = PGPGetKeyNumber(keyRef.ownerKey, kPGPKeyPropAlgID,
78bc18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &algorithm);
32524f ¤   ¤   ¤   pgpAssertNoErr(err);
9187c7 ¤   ¤   ¤
1ed7aa ¤   ¤   ¤   if( algorithm == kPGPPublicKeyAlgorithm_DSA )
fbf776 ¤   ¤   ¤   {
dcb0f1 ¤   ¤   ¤   ¤   iconResID = kDHUserIDIconID;
c9a3a6 ¤   ¤   ¤   }
7dbb8c ¤   ¤   ¤   else
bdf776 ¤   ¤   ¤   {
550910 ¤   ¤   ¤   ¤   iconResID = kRSAUserIDIconID;
33a3a6 ¤   ¤   ¤   }
26af5a
4578dd ¤   ¤   ¤   err = PGPGetUserIDStringBuffer(userID, kPGPUserIDPropName,
0a6e4b ¤   ¤   ¤   ¤   ¤   sizeof(Str255) - 1, (char *)&str[1], &len);
80acbd ¤   ¤   ¤   str[0] = len;
590fe4 ¤   ¤   }
d51b52 ¤   ¤
3711fb ¤   ¤   CKeyTable::DrawIcon(iconResID, inLocalRect, -1);
63e919 ¤   ¤   pgpAssertNoErr(err);
3e0ea2 ¤   ¤   ::TextSize(9);
0fde3c ¤   ¤   ::TextFont(kFontIDGeneva);
b5a301 ¤   ¤   ::TextFace(0);
1b62f7 ¤   ¤   ::TruncString(¤ kUserIDColumnWidth - 22, str, truncMiddle);
3a829c ¤   ¤   ::MoveTo(inLocalRect.left + 22, inLocalRect.bottom - 5);
7fd759 ¤   ¤   ::DrawString(str);
ebc623 ¤   ¤   ::MoveTo(¤  inLocalRect.left + kUserIDColumnWidth + 4,
75c38a ¤   ¤   ¤   ¤   ¤   inLocalRect.bottom -5);
5080ef ¤   ¤   CKeyInfoWindow::GetFingerprintString(str, keyRef.ownerKey);
b6d759 ¤   ¤   ::DrawString(str);
aa9371 ¤   }
--874f 0017f3db469401201c7 Page 10 of CSignDialog.cp
7aefe6 }
46af5a
746d52 ¤   void
f6b24d CUserIDList::HiliteCellActively(
9b1bb3 ¤   const STableCell¤   &inCell,
86a368 ¤   Boolean¤¤   ¤   ¤   inHilite)
1bbb36 {
23c789 ¤   #pragma unused( inCell, inHilite )
37efe6 }
27af5a
5d6d52 ¤   void
2f2ca9 CUserIDList::HiliteCellInactively(
0e1bb3 ¤   const STableCell¤   &inCell,
372697 ¤   Boolean¤¤   ¤   ·¤  inHilite)
b6bb36 {
92c789 ¤   #pragma unused( inCell, inHilite )
caefe6 }
f3af5a
1f6d52 ¤   void
a6b743 CUserIDList::ClickSelf(
81c267 ¤   const SMouseDownEvent &inMouseDown)
0abb36 {
8a39f8 ¤   #pragma unused( inMouseDown )
34efe6 }
09af5a
fd12d0 CUserIDHeaders::CUserIDHeaders(LStream *inStream)
302411 ¤   ¤   : LPane(inStream)
b8bb36 {
67efe6 }
47af5a
12f986 CUserIDHeaders::~CUserIDHeaders()
36bb36 {
e1efe6 }
1eaf5a
236d52 ¤   void
903fe1 CUserIDHeaders::DrawSelf()
7cbb36 {
23c48f ¤   Rect¤   ¤   ¤   ¤   frame;
bb933a ¤   Str255¤ ¤   ¤   ¤   title;
9567c5 ¤
889ecb ¤   FocusDraw();
9240bf ¤   CalcLocalFrameRect(frame);
91c94e ¤   ApplyForeAndBackColors();
3ff277 ¤   ::FrameRect(&frame);
1c9727 ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_White));
db2b21 ¤   ::MoveTo(frame.left+1, frame.bottom-1);
82be5f ¤   ::LineTo(frame.left+1, frame.top+1);
62d97f ¤   ::LineTo(frame.right-2, frame.top+1);
9b9dc1 ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Gray7));
ff42ca ¤   ::MoveTo(frame.left+2, frame.bottom-1);
52f109 ¤   ::LineTo(frame.right-2, frame.bottom-1);
a7fcb2 ¤   ::LineTo(frame.right-2, frame.top+2);
29ed40 ¤   ::RGBForeColor(&UGAColorRamp::GetColor(colorRamp_Black));
505243 ¤   ::TextFont(kFontIDGeneva);
88354b ¤   ::TextSize(9);
5b57cc ¤   ::TextFace(bold);
9f1b52 ¤   ¤
225b81 ¤   ::GetIndString(title, kStringListID, kNameColumnStringID);
09e386 ¤   ::MoveTo(frame.left + 4, frame.top + 12);
3800df ¤   ::DrawString(title);
898c62 ¤   ::GetIndString(title, kStringListID, kFingerprintColumnStringID);
72d70a ¤   ::MoveTo(frame.left + kUserIDColumnWidth + 4, frame.top + 12);
dc00df ¤   ::DrawString(title);
57efe6 }
7faf5a
--f43b 00080f99926401201c8 Page 1 of CSignDialog.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
ab9af5 ¤   $Id: CSignDialog.h,v 1.11.8.1 1998/11/12 03:08:18 heller Exp $
c3f7f7 ____________________________________________________________________________*/
c47b7d #pragma once
a3af5a
e3f0a0 #include <LGADialog.h>
a5ea2f #include <LBroadcaster.h>
222f94 #include <LCommander.h>
d07c09 #include <LEditText.h>
2cac98 #include <LActiveScroller.h>
7aaf5a
006ff8 #include "CKeyTable.h"
c6af5a
3baa4b const MessageT¤ kSignSuccessful¤¤   =¤  'SSuc';
262a04 const ResIDT¤   kSignDialogResID¤   =¤  152;
3faf5a
3daf5a
50e276 class LCheckBox;
0d88da class LPushButton;
5b0c10 class LTextGroupBox;
31defe class LRadioButton;
6e69c2 class CGADurationEditField;
3eaf5a
25af5a
58bf0f class CSignDialog¤  ¤   :¤  ¤   ¤   ¤   ¤   public LGADialog,
21a129 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster,
6566ce ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LCommander
13bb36 {
f65ed4 public:
2f7072 ¤   enum { class_ID = 'SigD' };
9f361a ¤   ¤   ¤   ¤   ¤   CSignDialog();
896e96 ¤   ¤   ¤   ¤   ¤   CSignDialog(LStream *inStream);
5db8ba ¤   ¤   ¤   ¤   ¤   ~CSignDialog();
6f2fb5 ¤   void¤   ¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
0bfa2b ¤   virtual void¤   FindCommandStatus(CommandT inCommand,
fb0bef ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
5940c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName);
568182 ¤   void¤   ¤   ¤   FinishCreateSelf();
cc6029 ¤   void¤   ¤   ¤   DrawSelf();
9767c5 ¤
cb515f ¤   void¤   ¤   ¤   SetUserIDs(¤PGPKeyRef¤  ¤   signer,
40a85d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   KeyTableRef¤¤   *userIDs,
1be18d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   ¤   numUserIDs);
410fb9 private:
06bb60 ¤   void¤   ¤   ¤   Sign();
07ba2d ¤   PGPError¤   ¤   GetParams(
d5e5d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   *trustLevel,
d0d194 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   *exportable,
4313e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   *expireDays );
4409d6 ¤   void¤   ¤   ¤   DomainToRegExp( char¤   ¤   *domain,
75ecc3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   char¤   ¤   *regExp );
f5af5a
c299cc ¤   LCheckBox¤  ¤   *mExportCheckbox;
69fe44 ¤   LPushButton¤¤   *mAdvancedButton,
7310a5 ¤   ¤   ¤   ¤   ¤   *mSignButton,
d2f7da ¤   ¤   ¤   ¤   ¤   *mCancelButton;
650c0f ¤   LTextGroupBox¤  *mSignTypesGroup,
0265cd ¤   ¤   ¤   ¤   ¤   *mExpireTypesGroup;
d5d4f3 ¤   LRadioButton¤   *mSignN0Radio,
b0a5da ¤   ¤   ¤   ¤   ¤   *mSignE0Radio,
3f2465 ¤   ¤   ¤   ¤   ¤   *mSignE1Radio,
370778 ¤   ¤   ¤   ¤   ¤   *mSignN2Radio,
56b6cf ¤   ¤   ¤   ¤   ¤   *mNeverExpireRadio,
ddd1d7 ¤   ¤   ¤   ¤   ¤   *mExpirationRadio;
43c477 ¤   LEditText¤  ¤   *mDomainEdit;
ec2426 ¤   Boolean¤¤   ¤   mAdvancedMode;
809df1 ¤   LActiveScroller¤*mScroller;
--7787 001fdfd0dad401201c8 Page 2 of CSignDialog.h
f3a604 ¤   PGPKeyRef¤  ¤   mSigner;
cb8d2d ¤   KeyTableRef¤¤   *mUserIDs;
d7eaf9 ¤   Int32¤  ¤   ¤   mNumUserIDs;
a12db2 ¤   CGADurationEditField¤   *mExpirationDate;
73a1f3 ¤   Int32¤  ¤   ¤   mLastArrowValue;
35af5a
0ee23f ¤   enum¤   {¤
a99311 ¤   ¤   ¤   ¤   kSignButton¤¤   ¤   ¤   = 'sign',
476a81 ¤   ¤   ¤   ¤   kCancelButton¤  ¤   ¤   = 'canc',
c57212 ¤   ¤   ¤   ¤   kAdvancedButton¤¤   ¤   = 'adva',
61f346 ¤   ¤   ¤   ¤   kExportCheckbox¤¤   ¤   = 'xExp',
a10cc9 ¤   ¤   ¤   ¤   kSignTypeN0Radio¤   ¤   = 'rNor',
6ee233 ¤   ¤   ¤   ¤   kSignTypeE0Radio¤   ¤   = 'rEVA',
708c73 ¤   ¤   ¤   ¤   kSignTypeE1Radio¤   ¤   = 'rTru',
15b10e ¤   ¤   ¤   ¤   kSignTypeN2Radio¤   ¤   = 'rMet',
a4166c ¤   ¤   ¤   ¤   kSignTypesGroup¤¤   ¤   = 'sGrp',
706b51 ¤   ¤   ¤   ¤   kExpireTypesGroup¤  ¤   = 'sExp',
c4cf63 ¤   ¤   ¤   ¤   kUserIDScroller¤¤   ¤   = 'uSCR',
6abad0 ¤   ¤   ¤   ¤   kUserIDList¤¤   ¤   ¤   = 'lUID',
7822cf ¤   ¤   ¤   ¤   kNeverExpireRadio¤  ¤   = 'rNev',
bdd041 ¤   ¤   ¤   ¤   kExpirationRadio¤   ¤   = 'rExp',
e694cb ¤   ¤   ¤   ¤   kExpirationDate¤¤   ¤   = 'eExp',
e87409 ¤   ¤   ¤   ¤   kExpirationArrows¤  ¤   = 'lArD',
4c2a25 ¤   ¤   ¤   ¤   kDomainEdit¤¤   ¤   ¤   = 'eDom'
b9c0bf ¤   ¤   ¤   };
9f82f7 };
fdaf5a
--f8c8 000073fece0401201c9 Page 1 of CSplitWindow.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
a38395 ¤   $Id: CSplitWindow.cp,v 1.24.8.1 1998/11/12 03:08:19 heller Exp $
44f7f7 ____________________________________________________________________________*/
8faf5a
594d37 #include <LowMem.h>
6faf5a
5ba787 #include <LTableView.h>
b07c52 #include <LTableMonoGeometry.h>
2d2ab7 #include <LTableSingleSelector.h>
6d7b38 #include <LTableArrayStorage.h>
0ebce5 #include <LIconPane.h>
027c09 #include <LEditText.h>
9e8f92 #include <UGAColorRamp.h>
487c99 #include <URegistrar.h>
f9dd06 #include <UDesktop.h>
37e8ae #include <UDrawingUtils.h>
eadd56 #include <PP_Messages.h>
2490a3 #include <Threads.h>
e6324c #include <string.h>
f9af5a
3854e1 #include "CSplitWindow.h"
d8af5a
8e6ff8 #include "CKeyTable.h"
cdb8cb #include "CPGPKeys.h"
8e271e #include "CKeyDragTask.h"
ac5dc0 #include "ResourceConstants.h"
89af5a
77a02f #include "pgpClientLib.h"
6ae684 #include "pgpUserInterface.h"
23894b #include "pgpFileSpec.h"
1a3991 #include "pgpAdminPrefs.h"
b069be #include "CGAProgressDialog.h"
e359c5 #include "CPGPStDialogHandler.h"
f576f0 #include "CComboError.h"
f6d73a #include "CSecureMemory.h"
809dc2 #include "CWarningAlert.h"
e23b50 #include "GetPassphrase.h"
8daf5a
360d08 #include "pgpMem.h"
5f2f8d #include "pgpErrors.h"
28bbf4 #include "MacFiles.h"
9985c2 #include "MacStrings.h"
e0af5a
2c5d19 const Int32¤kMinimumRequiredShares¤ = 2;
4fca58 const Int32 kMaximumSplitShares¤¤   = 255;
bdaf5a
e6f989 enum¤   {
da1eb6 ¤   ¤   ¤   kStringListID¤  ¤   = 1022,
73d7aa ¤   ¤   ¤   kCreatingSharesStringID = 1,
0b3fac ¤   ¤   ¤   kSavingSharesStringID,
bb87cb ¤   ¤   ¤   kSplittingKeyStringID,
eb64ff ¤   ¤   ¤   kShareFileSuffixStringID,
a5b71a ¤   ¤   ¤   kSplitWarningStringID,
c99861 ¤   ¤   ¤   kNameRequiredStringID,
6e633d ¤   ¤   ¤   kNewHolderPassphraseStringID,
f25dfa ¤   ¤   ¤   kChooseShareFolderStringID
06cdb9 ¤   ¤   };¤
d3af5a
810056 const ResIDT¤   dialog_AddShareholder¤  ¤   = 145;
00af5a
e79faf PGPBoolean PGPGetDirectory(
9a9864 ¤   PGPBoolean¤ ¤   useWD,
717a3b ¤   Int32 *¤¤   ¤   aDir,
d06fff ¤   Int16 *¤¤   ¤   vref,
626792 ¤   PGPByte *¤  ¤   name );
d0af5a
07a14e CSplitWindow::CSplitWindow(LStream *inStream)
--a2bc 00073076dc3401201c9 Page 2 of CSplitWindow.cp
430118 ¤   :¤  LGADialog(inStream),
ed1dd9 ¤   ¤   LDragAndDrop( GetMacPort(), this )
6bbb36 {
7b7551 ¤   RegisterClass_(CShareholderList);
feefe6 }
eeaf5a
5f10d1 CSplitWindow::~CSplitWindow()
7fbb36 {
c9efe6 }
6baf5a
c76d52 ¤   void
f2d054 CSplitWindow::FinishCreateSelf()
0bbb36 {
7c893a ¤   LGADialog::FinishCreateSelf();
e5af5a
efdddb ¤   ( mHolderList = (CShareholderList *) FindPaneByID( kHolderList ) )->
1834cf ¤   ¤   AddListener(this);
16aea3 ¤   mHolderList->InsertCols(1, 1, NULL, 0, TRUE);
b1af5a
20abdb ¤   ( mSplitKeyButton = (LPushButton *) FindPaneByID( kSplitKeyButton ) )->
7834cf ¤   ¤   AddListener(this);
5c31bf ¤   ( mRemoveButton = (LPushButton *) FindPaneByID( kRemoveHolderButton ) )->
4634cf ¤   ¤   AddListener(this);
b72c82 ¤   ( (LPushButton *) FindPaneByID( kSplitCancelButton ) )->
afa7d7 ¤   ¤   AddListener( this );
798654 ¤   ( (LPushButton *) FindPaneByID( kAddHolderButton ) )->
6ca7d7 ¤   ¤   AddListener( this );
04fea2 ¤   ( mSelArrows = (LLittleArrows *) FindPaneByID( kShareArrows ) )->
87a7d7 ¤   ¤   AddListener( this );
d0f177 ¤   ( (LLittleArrows *) FindPaneByID( kReqdShareArrows ) )->
3ca7d7 ¤   ¤   AddListener( this );
73c54a ¤   mScroller = (LActiveScroller *) FindPaneByID( kHolderScroller );
460fdd ¤   mSplitName = (LStaticText *) FindPaneByID( kSplitKeyName );
aba4c4 ¤   mSelName = (LStaticText *) FindPaneByID( kSelectedShareName );
4fc728 ¤   mReqdShares = (LStaticText *) FindPaneByID( kRequiredShareNum );
f37157 ¤   mSelShares = (LStaticText *) FindPaneByID( kSelectedShareNum );
6b4733 ¤   mTotalShares = (LStaticText *) FindPaneByID( kTotalShareNum );
7f244e ¤   mActiveSelection = FALSE;
32efe6 }
7eaf5a
166d52 ¤   void
a163a4 CSplitWindow::SetSplitKey(
f9c9d3 ¤   PGPKeyRef¤  key )
a3bb36 {
59fb19 ¤   PGPError¤   ¤   err;
82bbb8 ¤   Str255¤ ¤   ¤   pstr;
73de55 ¤   PGPSize¤¤   ¤   len;
30f426 ¤   PGPInt32¤   ¤   alg;
460304 ¤   LIconPane *¤¤   skIcon;
9c67c5 ¤
57a4ba ¤   pgpAssert(PGPKeyRefIsValid(key));
2e3725 ¤   err = PGPGetKeyIDFromKey( key, &mKeyID );
4cdd44 ¤   pgpAssertNoErr(err);
dea5f3 ¤   err = PGPGetKeyNumber( key, kPGPKeyPropAlgID, (PGPInt32 *) &mAlgorithm );
37dd44 ¤   pgpAssertNoErr(err);
28af5a
de199a ¤   err = PGPGetPrimaryUserIDNameBuffer( key, sizeof( pstr ) - 1,
3f412b ¤   ¤   ¤   ¤   ¤   (char *) &pstr[1], &len);
918c1a ¤   pgpAssertNoErr( err );
13e272 ¤   pstr[0] = len - 1;
5975d7 ¤   mSplitName->SetDescriptor(pstr);
b90af2 ¤   err = PGPGetKeyNumber( key, kPGPKeyPropAlgID, &alg );
9e8c1a ¤   pgpAssertNoErr( err );
213e98 ¤   skIcon = (LIconPane *) FindPaneByID( kSplitKeyIcon );
b2c524 ¤   if( alg == kPGPPublicKeyAlgorithm_DSA )
1d7801 ¤   ¤   skIcon->SetIconID( kDSAKeyIconID );
810e24 ¤   else
7fe5da ¤   ¤   skIcon->SetIconID( kRSAKeyIconID );
2267c5 ¤
3360d9 ¤   Show();
dbefe6 }
73af5a
--6ca9 00070511ba7401201c9 Page 3 of CSplitWindow.cp
530f6b SFReply¤¤   sSFReply;
e33ae1 Int32¤  ¤   sGoodDirID;
cbaf5a
bd1a2a ¤   static pascal Boolean
02cd84 DirFilter(
423a37 ¤   ParmBlkPtr¤ ¤   ¤   ¤   pbp)
27bb36 {
c5c2e7 ¤   return TRUE;
71efe6 }
ddaf5a
176867 ¤   static pascal short
fcf87c DirFileHook(
8564a8 ¤   Int16¤  ¤   ¤   ¤   ¤   item,
0653fb ¤   DialogPtr¤  ¤   ¤   ¤   dialog)
53bb36 {
4ece8e ¤   Int16¤  ret,
15d6e4 ¤   ¤   ¤   iKind;
7ba5e6 ¤   Handle¤ iHandle;
cedf4e ¤   Rect¤   iRect;
fa67c5 ¤
e06357 ¤   ret = item;
5a1a97 ¤   switch( item )
c6c7a1 ¤   {
8456e8 ¤   ¤   case -1:
aacdcb ¤   ¤   ¤   break;
bb027d ¤   ¤   case 11:
ec2143 ¤   ¤   ¤   if(sSFReply.fType)
b1f776 ¤   ¤   ¤   {
a3bf44 ¤   ¤   ¤   ¤   sGoodDirID = sSFReply.fType;
ec8928 ¤   ¤   ¤   ¤   ret = 1;
81a3a6 ¤   ¤   ¤   }
26cdcb ¤   ¤   ¤   break;
65ed19 ¤   ¤   case 12:
d5e28f ¤   ¤   ¤   sGoodDirID = LMGetCurDirStore();
8a38f9 ¤   ¤   ¤   ret = 1;
7ccdcb ¤   ¤   ¤   break;
57de59 ¤   ¤   case 100:
b9be92 ¤   ¤   ¤   if( !sSFReply.fType )
4ef776 ¤   ¤   ¤   {
f22d28 ¤   ¤   ¤   ¤   GetDialogItem( dialog, 11, &iKind, &iHandle, &iRect );
4c291f ¤   ¤   ¤   ¤   HiliteControl( (ControlHandle) iHandle, 0xFF );
80a3a6 ¤   ¤   ¤   }
88bb8c ¤   ¤   ¤   else
07f776 ¤   ¤   ¤   {
972d28 ¤   ¤   ¤   ¤   GetDialogItem( dialog, 11, &iKind, &iHandle, &iRect );
ddc804 ¤   ¤   ¤   ¤   HiliteControl( (ControlHandle) iHandle, 0 );
94a3a6 ¤   ¤   ¤   }
4d8098 ¤   ¤   ¤   YieldToAnyThread();
e6cdcb ¤   ¤   ¤   break;
629371 ¤   }
99986d ¤   return ret;
0aefe6 }
75af5a
8316ea ¤   PGPBoolean
02999d PGPGetDirectory(
d49864 ¤   PGPBoolean¤ ¤   useWD,
137a3b ¤   Int32 *¤¤   ¤   aDir,
9f6fff ¤   Int16 *¤¤   ¤   vref,
b79424 ¤   PGPByte *¤  ¤   name )
c3bb36 {
3bce33 ¤   SFTypeList¤ ¤   typeList;
13902b ¤   FileFilterUPP¤  ffil;
2ea2ac ¤   DlgHookUPP¤ ¤   dirHook;
440880 ¤   static Point¤   where={0,0};
634973 ¤   WDPBRec¤¤   ¤   pb;
ad01ed ¤   PGPByte¤¤   ¤   s[32];
6f67c5 ¤
d24384 ¤   ffil¤   = NewFileFilterProc( DirFilter );
b6e73b ¤   dirHook = NewDlgHookProc( DirFileHook );
50fb29 ¤   UDesktop::Deactivate();
6acdc8 ¤   SFPGetFile(where, "\p", ffil, -1, typeList, dirHook,
70cae3 ¤   ¤   ¤   ¤   &sSFReply, 2003, NULL);
--a129 000fd88cd3a401201c9 Page 4 of CSplitWindow.cp
375824 ¤   UDesktop::Activate();
dbdb18 ¤   DisposeRoutineDescriptor(ffil);
0d6330 ¤   DisposeRoutineDescriptor(dirHook);
b6475c ¤   if( sSFReply.good )
07c7a1 ¤   {
ebac1b ¤   ¤   if(useWD)
675b34 ¤   ¤   {
6df20f ¤   ¤   ¤   *vref = -LMGetSFSaveDisk();
16084b ¤   ¤   ¤   *aDir = sGoodDirID;
fa0fe4 ¤   ¤   }
090e1d ¤   ¤   else
935b34 ¤   ¤   {
5963f5 ¤   ¤   ¤   pb.ioCompletion¤¤   = NULL;
a77f01 ¤   ¤   ¤   pb.ioNamePtr¤   ¤   = s;
79002a ¤   ¤   ¤   pb.ioVRefNum¤   ¤   = -LMGetSFSaveDisk();
69bc28 ¤   ¤   ¤   pb.ioWDIndex¤   ¤   = 0;
176287 ¤   ¤   ¤   pb.ioWDProcID¤  ¤   = 'ERIK';
6c3c8d ¤   ¤   ¤   pb.ioWDVRefNum¤ ¤   = -LMGetSFSaveDisk();
b296c0 ¤   ¤   ¤   if( !PBGetWDInfoSync( &pb ) )
3ef776 ¤   ¤   ¤   {
b4ab74 ¤   ¤   ¤   ¤   if( pb.ioNamePtr[0] < 28 )
ff72c3 ¤   ¤   ¤   ¤   {
03a758 ¤   ¤   ¤   ¤   ¤   CopyPString( pb.ioNamePtr, name );
a82aac ¤   ¤   ¤   ¤   ¤   CopyPString( "\p:", name );
852613 ¤   ¤   ¤   ¤   }
8183b7 ¤   ¤   ¤   ¤   *aDir = sGoodDirID;
1fa3a6 ¤   ¤   ¤   }
6e0fe4 ¤   ¤   }
aa836c ¤   ¤   return TRUE;
be9371 ¤   }
d60e24 ¤   else
e698aa ¤   ¤   return FALSE;
6aefe6 }
54af5a
4bc744 ¤   PGPError
f408c7 CSplitWindow::MakeShareFile(
d86c57 ¤   PGPShareRef¤¤   ¤   ¤   shareRef,
240513 ¤   ShareholderListEntry¤   *holder,
76c70f ¤   Int32¤  ¤   ¤   ¤   ¤   dirID,
91c12a ¤   Int16¤  ¤   ¤   ¤   ¤   vRefNum )
ffbb36 {
a5fd0a ¤   CComboError¤¤   ¤   ¤   err;
4dd42d ¤   char¤   ¤   ¤   ¤   ¤   rawstr[256];
cd99df ¤   short¤  ¤   ¤   ¤   ¤   strInx;
0a443a ¤   Str255¤ ¤   ¤   ¤   ¤   pstr,
db9e42 ¤   ¤   ¤   ¤   ¤   ¤   ¤   numstr,
f0fb82 ¤   ¤   ¤   ¤   ¤   ¤   ¤   suffix,
0e62ae ¤   ¤   ¤   ¤   ¤   ¤   ¤   prefix;
11d17a ¤   FSSpec¤ ¤   ¤   ¤   ¤   fsSpec;
9425a9 ¤   PFLFileSpecRef¤ ¤   ¤   fsRef¤  = NULL;
0788fe ¤   PGPShareFileRef¤¤   ¤   sfRef¤  = NULL;
cbdae1 ¤   PGPShareRef¤¤   ¤   ¤   splitShares = NULL;
220130 ¤   PGPKeyRef¤  ¤   ¤   ¤   holderKey;
58b08d ¤   PGPOptionListRef¤   ¤   encOptions = NULL;
ac67c5 ¤
adfd33 ¤   strcpy( rawstr, holder->name );
ed5be3 ¤   strInx = strcspn(rawstr, "\\/:*?""<>|[]");
93d359 ¤   rawstr[strInx] = '\0';
d3b7fe ¤   while( ( strInx > 0 ) && ( rawstr[strInx - 1] == ' ' ) )
8ac7a1 ¤   {
665208 ¤   ¤   strInx--;
6bc771 ¤   ¤   rawstr[strInx] = '\0';
b29371 ¤   }
64a178 ¤   GetIndString( pstr, kStringListID, kShareFileSuffixStringID );
dcc6b8 ¤   NumToString( holder->numShares, numstr );
b23357 ¤   PrintPString( suffix, pstr, numstr );
f9d7df ¤   CToPString( rawstr, prefix );
334258 ¤   while( prefix[0] + suffix[0] > 31 )
50a40b ¤   ¤   --prefix[0];
366b1b ¤   AppendPString( suffix, prefix );
a767c5 ¤
fd95d7 ¤   fsSpec.parID¤   ¤   = dirID;
--16a2 00051544da2401201c9 Page 5 of CSplitWindow.cp
6b5b0a ¤   fsSpec.vRefNum¤ ¤   = vRefNum;
4d9f0b ¤   CopyPString( prefix, fsSpec.name );
34cbd6 ¤   err.err = FSpGetUniqueSpec( &fsSpec, &fsSpec );
04b219 ¤   if( err.IsError() )
63262d ¤   ¤   goto done;
17b219 ¤   err.err = FSpCreate( &fsSpec, kPGPMacFileCreator_Keys,
091c83 ¤   ¤   ¤   ¤   ¤   ¤   kPGPMacFileCreator_SplitKey, smSystemScript );
88b219 ¤   if( err.IsError() )
36262d ¤   ¤   goto done;
8f3ca1 ¤   err.pgpErr = PFLNewFileSpecFromFSSpec( gPGPMemoryMgr, &fsSpec, &fsRef );
51b219 ¤   if( err.IsError() )
d3262d ¤   ¤   goto done;
ec7600 ¤   err.pgpErr = PGPNewShareFile( fsRef, &sfRef );
cfb219 ¤   if( err.IsError() )
f8262d ¤   ¤   goto done;
f930e4 ¤   err.pgpErr = PGPSetShareFileUserID( sfRef, holder->name );
a2b219 ¤   if( err.IsError() )
78262d ¤   ¤   goto done;
6964ab ¤   err.pgpErr = PGPSplitShares( shareRef, holder->numShares, &splitShares );
11b219 ¤   if( err.IsError() )
e4262d ¤   ¤   goto done;
a19f2e ¤   if( holder->hasKey )
eac7a1 ¤   {
c4c6ac ¤   ¤   err.pgpErr = PGPSetShareFileOwnerKeyID( sfRef, holder->keyID );
44447c ¤   ¤   if( err.IsError() )
581dc4 ¤   ¤   ¤   goto done;
b957ef ¤   ¤   err.pgpErr = PGPGetKeyByKeyID( CPGPKeys::TheApp()->GetKeySet(),
2475eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   &holder->keyID, holder->algorithm, &holderKey );
ab447c ¤   ¤   if( err.IsError() )
c21dc4 ¤   ¤   ¤   goto done;
748b9d ¤   ¤   err.pgpErr = PGPBuildOptionList( gPGPContext, &encOptions,
de5354 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOEncryptToKey( gPGPContext, holderKey ),
9675c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
b5447c ¤   ¤   if( err.IsError() )
811dc4 ¤   ¤   ¤   goto done;
1c9371 ¤   }
ab0e24 ¤   else
b6c7a1 ¤   {
188b9d ¤   ¤   err.pgpErr = PGPBuildOptionList( gPGPContext, &encOptions,
dc0b19 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOConventionalEncrypt( gPGPContext,
40b741 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, holder->phrase ),
ac7778 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) ),
4575c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
7f447c ¤   ¤   if( err.IsError() )
971dc4 ¤   ¤   ¤   goto done;
309371 ¤   }
ba3796 ¤   err.pgpErr = PGPCopySharesToFile( gPGPContext, sfRef, encOptions,
64add5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   splitShares );
35b219 ¤   if( err.IsError() )
20262d ¤   ¤   goto done;
0cad8a ¤   err.pgpErr = PGPSaveShareFile( sfRef );
45b219 ¤   if( err.IsError() )
22262d ¤   ¤   goto done;
2eb38c done:
99b0b7 ¤   if( IsntNull( encOptions ) )
96b7a4 ¤   ¤   PGPFreeOptionList( encOptions );
cac37c ¤   if( IsntNull( splitShares ) )
6be00f ¤   ¤   PGPFreeShares( splitShares );
2a8899 ¤   if( IsntNull( sfRef ) )
138e0c ¤   ¤   PGPFreeShareFile( sfRef );
064bfc ¤   if( IsntNull( fsRef ) )
191ac6 ¤   ¤   PFLFreeFileSpec( fsRef );
a21be7 ¤   return( err.ConvertToPGPError() );
24efe6 }
0daf5a
336d52 ¤   void
207efb CSplitWindow::Split()
73bb36 {
02e1e4 ¤   Int32¤  ¤   ¤   ¤   shareFileDirID;
366f0a ¤   Int16¤  ¤   ¤   ¤   shareFileVRef;
bb7d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
51d4d7 ¤   PGPByte¤¤   ¤   ¤   *passKey = NULL,
--c1f2 0007ca6f8f7401201c9 Page 6 of CSplitWindow.cp
75db4e ¤   ¤   ¤   ¤   ¤   ¤   *oldPassKey = NULL;
9a6986 ¤   PGPSize¤¤   ¤   ¤   passKeySize,
7be6eb ¤   ¤   ¤   ¤   ¤   ¤   oldPassKeySize;
24ae3b ¤   CSecureCString256¤  passphrase;
329fca ¤   Str255¤ ¤   ¤   ¤   pstr;
387ab7 ¤   PGPKeyRef¤  ¤   ¤   targetKey;
4d71e4 ¤   PGPBoolean¤ ¤   ¤   wasSplit = FALSE;
aa67c5 ¤
86da49 ¤   err = PGPGetKeyByKeyID( CPGPKeys::TheApp()->GetKeySet(),
52faf0 ¤   ¤   ¤   ¤   ¤   ¤   &mKeyID, mAlgorithm, &targetKey );¤ CKERR;
ea67c5 ¤
2d4f60 ¤   // Ask user for directory to save Share Files
dc44eb ¤   if( !PGPGetDirectory( TRUE, &shareFileDirID, &shareFileVRef, NULL ) )
19262d ¤   ¤   goto done;
2367c5 ¤
b1bb3a ¤   // Reconstitute or get passphrase for target key and validate it
85c7a1 ¤   {
059d27 ¤   ¤   err = GetPassForKey( targetKey, &wasSplit, passphrase,
14c761 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &oldPassKey, &oldPassKeySize );¤CKERR;
cb9371 ¤   }
6140a9 ¤   if( CWarningAlert::Display(kWACautionAlertType, kWAYesNoStyle,
d7d759 ¤   ¤   ¤   ¤   ¤   kStringListID, kSplitWarningStringID) != msg_OK )
64262d ¤   ¤   goto done;
63c7a1 ¤   {
436b4b ¤   ¤   CPGPStDialogHandler¤¤   ¤   dialogHandler( kProgressDialogResID, nil );
440daf ¤   ¤   CGAProgressDialog *¤¤   ¤   dialogObj;
255f8d ¤   ¤   Int32¤  ¤   ¤   ¤   ¤   ¤   totalValue,
1a64b9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   reqdValue;
713878 ¤   ¤   PGPShareRef¤¤   ¤   ¤   ¤   shareRef;
a28a57 ¤   ¤   PGPInt32¤   ¤   ¤   ¤   ¤   algorithm;
e91b52 ¤   ¤
ef2285 ¤   ¤   dialogObj = (CGAProgressDialog *)
8a3119 ¤   ¤   ¤   ¤   ¤   dialogHandler.GetDialog();
2af493 ¤   ¤   totalValue = mTotalShares->GetValue();
933144 ¤   ¤   reqdValue = mReqdShares->GetValue();
13af5a
a5826d ¤   ¤   // Create Shares
9eca06 ¤   ¤   GetIndString( pstr, kStringListID, kCreatingSharesStringID );
d9dae6 ¤   ¤   dialogObj->SetCaption( pstr );
dbf712 ¤   ¤   dialogObj->SetPercentComplete( 10 );
d20174 ¤   ¤   dialogObj->Show();
eccb9f ¤   ¤   for( short eventIndex = 0; eventIndex < 4; eventIndex++ )
19a66c ¤   ¤   ¤   dialogHandler.DoDialog();
5a1b52 ¤   ¤
acf52e ¤   ¤   err = PGPCreateShares( gPGPContext, targetKey, reqdValue, totalValue,
35bf53 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &shareRef );¤   CKERR;
1f36d5 ¤   ¤   err = PGPGetPasskeyFromShares( shareRef, &passKey, &passKeySize );CKERR;
7d1b52 ¤   ¤
460070 ¤   ¤   // Create each share file
d7dd3b ¤   ¤   dialogObj->SetPercentComplete( 25 );
b95b34 ¤   ¤   {
8db919 ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   ¤   dataSize = sizeof(ShareholderListEntry);
9049d6 ¤   ¤   ¤   ShareholderListEntry¤   holder;
7832d9 ¤   ¤   ¤   TableIndexT¤¤   ¤   ¤   rows,
bd21aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cols,
cb9c7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   rowIndex;
c27c0a ¤   ¤   ¤   STableCell¤ ¤   ¤   ¤   cell(1,1);
3eee0f ¤   ¤   ¤   Int32¤  ¤   ¤   ¤   ¤   cellPercent;
81f270 ¤   ¤   ¤   Str255¤ ¤   ¤   ¤   ¤   namestr,
8adaf3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   rawstr;
ac87c7 ¤   ¤   ¤
5fef87 ¤   ¤   ¤   mHolderList->GetTableSize( rows, cols );
2e41be ¤   ¤   ¤   cellPercent = 70 / rows;
ff858b ¤   ¤   ¤   for( rowIndex = rows; rowIndex > 0; rowIndex-- )
44f776 ¤   ¤   ¤   {
b54e20 ¤   ¤   ¤   ¤   cell.row = rowIndex;
d7416b ¤   ¤   ¤   ¤   mHolderList->GetCellData(cell, &holder, dataSize);
f62b85 ¤   ¤   ¤   ¤
2e607e ¤   ¤   ¤   ¤   GetIndString( rawstr, kStringListID, kSavingSharesStringID );
642176 ¤   ¤   ¤   ¤   CToPString( holder.name, namestr );
ca9abf ¤   ¤   ¤   ¤   PrintPString( pstr, rawstr, namestr );·
7c4532 ¤   ¤   ¤   ¤   dialogObj->SetCaption( pstr );
--1761 0003767f1a5401201c9 Page 7 of CSplitWindow.cp
9f2b85 ¤   ¤   ¤   ¤
ad6534 ¤   ¤   ¤   ¤   err = MakeShareFile( shareRef, &holder,
f9f5c9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   shareFileDirID, shareFileVRef );¤   CKERR;
c9a2b9 ¤   ¤   ¤   ¤   dialogObj->SetPercentComplete( 25 + ·cellPercent );
15f4e4 ¤   ¤   ¤   ¤   cellPercent *= 2;
ffa3a6 ¤   ¤   ¤   }
8c0fe4 ¤   ¤   }
1a87c7 ¤   ¤   ¤
2ae5ac ¤   ¤   // Lock target key with new split (always last)
644350 ¤   ¤   GetIndString( pstr, kStringListID, kSplittingKeyStringID );
e3dae6 ¤   ¤   dialogObj->SetCaption( pstr );
f0f01e ¤   ¤   dialogObj->SetPercentComplete( 95 );
d499fd ¤   ¤   err = PGPChangePassphrase( targetKey, wasSplit ?
15ce98 ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, oldPassKey, oldPassKeySize ¶
ec9183 ) :
38022b ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, passphrase ),
d528d0 ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, passKey, passKeySize ),
89ccb3 ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );¤   CKERR;
5f56c0 ¤   ¤   err = PGPGetKeyNumber(targetKey, kPGPKeyPropAlgID, &algorithm);¤CKERR;
b93599 ¤   ¤   if(algorithm == kPGPPublicKeyAlgorithm_DSA)
0b5b34 ¤   ¤   {
efe8d1 ¤   ¤   ¤   PGPKeyIterRef¤  ¤   keyIter;
a22ab4 ¤   ¤   ¤   PGPSubKeyRef¤   ¤   subKey;
3587c7 ¤   ¤   ¤
55ca56 ¤   ¤   ¤   err = PGPNewKeyIter( CPGPKeys::TheApp()->GetKeyList(), &keyIter );
7dc020 ¤   ¤   ¤   CKERR;
a129c9 ¤   ¤   ¤   PGPKeyIterSeek( keyIter, targetKey );
4b89a9 ¤   ¤   ¤   while( IsntPGPError ( err ) &&
5f8cc8 ¤   ¤   ¤   ¤   IsntPGPError( PGPKeyIterNextSubKey( keyIter, &subKey ) ) &&
82283e ¤   ¤   ¤   ¤   IsntNull( subKey ) )
6df776 ¤   ¤   ¤   {
3d4742 ¤   ¤   ¤   ¤   err = PGPChangeSubKeyPassphrase( subKey,wasSplit ?
26ce98 ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, oldPassKey, oldPassKeySize ¶
5d9183 ) :
aa022b ¤   ¤   ¤   ¤   ¤   PGPOPassphrase( gPGPContext, passphrase ),
e628d0 ¤   ¤   ¤   ¤   ¤   PGPOPasskeyBuffer( gPGPContext, passKey, passKeySize ),
963c4e ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
e6a3a6 ¤   ¤   ¤   }
655154 ¤   ¤   ¤   PGPFreeKeyIter( keyIter );
8f0fe4 ¤   ¤   }
98b079 ¤   ¤   CPGPKeys::TheApp()->CommitDefaultKeyrings();
fd4e4a ¤   ¤   dialogObj->SetPercentComplete( 100 );
2b9371 ¤   }
d9b65b ¤   BroadcastMessage( kKeyTableRedrawMessage, NULL );
56b38c done:
207f7d ¤   if( IsPGPError( err ) )
483822 ¤   ¤   ReportPGPError( err );
a76acd ¤   if( IsntNull( passKey ) )
a04f51 ¤   ¤   PGPFreeData( passKey );
ce0d8d ¤   if( IsntNull( oldPassKey ) )
420720 ¤   ¤   PGPFreeData( oldPassKey );
571b52 ¤   ¤
5b830f ¤   return;
1befe6 }
68af5a
396d52 ¤   void
c8491b CSplitWindow::ListenToMessage(
c07b08 ¤   MessageT¤   inMessage,
fe121e ¤   void *¤ ¤   ioParam)
51bb36 {
23aee2 ¤   STableCell¤ ¤   ¤   ¤   cell;
1c04e5 ¤   ShareholderListEntry¤   holder;
533847 ¤   Uint32¤ ¤   ¤   ¤   ¤   dataSize;
8f67c5 ¤
3226d0 ¤   switch(inMessage)
b5c7a1 ¤   {
3bd8ba ¤   ¤   case msg_OK:
610136 ¤   ¤   ¤   Hide();
29346a ¤   ¤   ¤   Split();
b95686 ¤   ¤   case msg_Cancel:
29ed49 ¤   ¤   {¤
3732d9 ¤   ¤   ¤   TableIndexT¤¤   ¤   ¤   rows,
--32dd 000a6f21b8a401201c9 Page 8 of CSplitWindow.cp
7221aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cols,
009c7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   rowIndex;
c17c0a ¤   ¤   ¤   STableCell¤ ¤   ¤   ¤   cell(1,1);
1387c7 ¤   ¤   ¤
e908ba ¤   ¤   ¤   dataSize = sizeof(ShareholderListEntry);
89ef87 ¤   ¤   ¤   mHolderList->GetTableSize( rows, cols );
94858b ¤   ¤   ¤   for( rowIndex = rows; rowIndex > 0; rowIndex-- )
96f776 ¤   ¤   ¤   {
b34e20 ¤   ¤   ¤   ¤   cell.row = rowIndex;
75416b ¤   ¤   ¤   ¤   mHolderList->GetCellData(cell, &holder, dataSize);
6690eb ¤   ¤   ¤   ¤   if( !holder.hasKey && IsntNull( holder.phrase ) )
4d7ab1 ¤   ¤   ¤   ¤   ¤   PGPFreeData( holder.phrase );
49a3a6 ¤   ¤   ¤   }
89ffe5 ¤   ¤   ¤   delete this;
35cdcb ¤   ¤   ¤   break;
2d0fe4 ¤   ¤   }
1e39f8 ¤   ¤   case kReqdShareArrows:
de5b34 ¤   ¤   {
6b38ba ¤   ¤   ¤   Int32¤  newValue = *(long *)ioParam,
6ca81a ¤   ¤   ¤   ¤   ¤   value,
1f52dc ¤   ¤   ¤   ¤   ¤   totalValue;
f687c7 ¤   ¤   ¤
f32c21 ¤   ¤   ¤   totalValue = mTotalShares->GetValue();
1d6796 ¤   ¤   ¤   value = mReqdShares->GetValue();
d236bc ¤   ¤   ¤   if( newValue >= kMinimumRequiredShares )
b1f776 ¤   ¤   ¤   {
e70adb ¤   ¤   ¤   ¤   value = newValue;
695c4d ¤   ¤   ¤   ¤   mReqdShares->SetValue(value);
5fa3a6 ¤   ¤   ¤   }
e7d52d ¤   ¤   ¤   if( totalValue >= value )
95010d ¤   ¤   ¤   ¤   mSplitKeyButton->Enable();
f8bb8c ¤   ¤   ¤   else
b4968c ¤   ¤   ¤   ¤   mSplitKeyButton->Disable();
60cdcb ¤   ¤   ¤   break;
0f0fe4 ¤   ¤   }
6560a4 ¤   ¤   case kShareArrows:
19d313 ¤   ¤   ¤   if( mActiveSelection )
82f776 ¤   ¤   ¤   {
ff83da ¤   ¤   ¤   ¤   Int32¤  oldValue,
2f33b4 ¤   ¤   ¤   ¤   ¤   ¤   newValue,
a301b9 ¤   ¤   ¤   ¤   ¤   ¤   totalValue,
deba9e ¤   ¤   ¤   ¤   ¤   ¤   reqdValue;
332b85 ¤   ¤   ¤   ¤
bc6789 ¤   ¤   ¤   ¤   dataSize = sizeof(ShareholderListEntry);
3fffc5 ¤   ¤   ¤   ¤   mHolderList->GetCellData( mSelectedCell, &holder, dataSize );
4e2b85 ¤   ¤   ¤   ¤
03e258 ¤   ¤   ¤   ¤   oldValue = holder.numShares;
2deb0b ¤   ¤   ¤   ¤   newValue = mSelArrows->GetValue();
d33d06 ¤   ¤   ¤   ¤   totalValue = mTotalShares->GetValue();
2d30c2 ¤   ¤   ¤   ¤   reqdValue = mReqdShares->GetValue();
372b85 ¤   ¤   ¤   ¤
eaf31c ¤   ¤   ¤   ¤   if( totalValue + ( newValue - oldValue ) > kMaximumSplitShares )
fa72c3 ¤   ¤   ¤   ¤   {
93fe20 ¤   ¤   ¤   ¤   ¤   mSelArrows->SetValue( oldValue );
517c97 ¤   ¤   ¤   ¤   ¤   SysBeep( 1 );
002613 ¤   ¤   ¤   ¤   }
3bfa07 ¤   ¤   ¤   ¤   else
2072c3 ¤   ¤   ¤   ¤   {
83eb4e ¤   ¤   ¤   ¤   ¤   mSelShares->SetValue( newValue );
fb0ff4 ¤   ¤   ¤   ¤   ¤   holder.numShares = newValue;
be2820 ¤   ¤   ¤   ¤   ¤   mHolderList->SetCellData( mSelectedCell, &holder, dataSize ¶
a56275 );
d43ece ¤   ¤   ¤   ¤   ¤   mHolderList->RefreshCell( mSelectedCell );
cef9ef ¤   ¤   ¤   ¤   ¤   totalValue += newValue - oldValue;
934a73 ¤   ¤   ¤   ¤   ¤   mTotalShares->SetValue( totalValue );
e0f334 ¤   ¤   ¤   ¤   ¤   if( totalValue >= reqdValue )
ab4827 ¤   ¤   ¤   ¤   ¤   ¤   mSplitKeyButton->Enable();
294bd6 ¤   ¤   ¤   ¤   ¤   else
72189d ¤   ¤   ¤   ¤   ¤   ¤   mSplitKeyButton->Disable();
502613 ¤   ¤   ¤   ¤   }
73a3a6 ¤   ¤   ¤   }
a6cdcb ¤   ¤   ¤   break;
--160b 00000523d28401201c9 Page 9 of CSplitWindow.cp
0214af ¤   ¤   case kRemoveHolderButton:
1b5b34 ¤   ¤   {
c4cafa ¤   ¤   ¤   cell = mHolderList->GetFirstSelectedCell();
0e4620 ¤   ¤   ¤   if( cell.row > 0 )
67f776 ¤   ¤   ¤   {
165186 ¤   ¤   ¤   ¤   ShareholderListEntry¤   holder;
eaebc9 ¤   ¤   ¤   ¤   Uint32¤ ¤   ¤   ¤   ¤   dataSize = sizeof(ShareholderListEntry);
e5b296 ¤   ¤   ¤   ¤   Int32¤  ¤   ¤   ¤   ¤   totalValue,
4ebc0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   reqdValue;
4d2b85 ¤   ¤   ¤   ¤
8a55c4 ¤   ¤   ¤   ¤   mHolderList->GetCellData( cell, &holder, dataSize );
5e3d06 ¤   ¤   ¤   ¤   totalValue = mTotalShares->GetValue();
0330c2 ¤   ¤   ¤   ¤   reqdValue = mReqdShares->GetValue();
a4e749 ¤   ¤   ¤   ¤   totalValue -= holder.numShares;
714904 ¤   ¤   ¤   ¤   mTotalShares->SetValue( totalValue );
238671 ¤   ¤   ¤   ¤   if( totalValue < kMinimumRequiredShares )
6337ef ¤   ¤   ¤   ¤   pgpClearMemory( &holder, sizeof( ShareholderListEntry ) );
1f8e8c ¤   ¤   ¤   ¤   mHolderList->SetCellData( cell, &holder, dataSize );
a247f0 ¤   ¤   ¤   ¤   mHolderList->RemoveRows(1, cell.row, true);
012b85 ¤   ¤   ¤   ¤
eeb2ac ¤   ¤   ¤   ¤   mRemoveButton->Disable();
663111 ¤   ¤   ¤   ¤   if( totalValue < reqdValue )
dd8edc ¤   ¤   ¤   ¤   ¤   mSplitKeyButton->Disable();
a4a3a6 ¤   ¤   ¤   }
d8cdcb ¤   ¤   ¤   break;
480fe4 ¤   ¤   }
56d4c8 ¤   ¤   case kAddHolderButton:
a85b34 ¤   ¤   {
a3c989 ¤   ¤   ¤   CPGPStDialogHandler addHolderDialog(dialog_AddShareholder,
cce7b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp());
7b84c4 ¤   ¤   ¤   LWindow¤¤   ¤   ¤   *window;
874415 ¤   ¤   ¤   MessageT¤   ¤   ¤   dialogMessage;
12ef12 ¤   ¤   ¤   Str255¤ ¤   ¤   ¤   stringValue;
1d87c7 ¤   ¤   ¤
5e400a ¤   ¤   ¤   window = addHolderDialog.GetDialog();
461fa4 ¤   ¤   tryAgain:
706da3 ¤   ¤   ¤   do
7bf776 ¤   ¤   ¤   {
9db907 ¤   ¤   ¤   ¤   dialogMessage = addHolderDialog.DoDialog();
8ac7b9 ¤   ¤   ¤   } while( dialogMessage != msg_OK && dialogMessage != msg_Cancel );
fcbbb1 ¤   ¤   ¤   if(dialogMessage == msg_OK)
29f776 ¤   ¤   ¤   {
51b19a ¤   ¤   ¤   ¤   ((LEditText *)window->FindPaneByID('eNam'))->
2aa6a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetDescriptor(stringValue);
abaf5a
84aee1 ¤   ¤   ¤   ¤   if (stringValue[ 0 ] == '\0')
f972c3 ¤   ¤   ¤   ¤   {
b8e427 ¤   ¤   ¤   ¤   ¤   CWarningAlert::Display(kWACautionAlertType, kWAOKStyle,
d0326f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kStringListID, kNameRequiredStringID);
815f54 ¤   ¤   ¤   ¤   ¤   goto tryAgain;
922613 ¤   ¤   ¤   ¤   }
c6fa07 ¤   ¤   ¤   ¤   else
a672c3 ¤   ¤   ¤   ¤   {
ba931a ¤   ¤   ¤   ¤   ¤   char¤   ¤   ¤   *passphrase = NULL;
aad679 ¤   ¤   ¤   ¤   ¤   Str255¤ ¤   ¤   pstr;
1e5cdf ¤   ¤   ¤   ¤   ¤   char¤   ¤   ¤   cstr[256];
6d4c97 ¤   ¤   ¤   ¤   ¤   PGPError¤   ¤   err;
fa99ea ¤   ¤   ¤   ¤   ¤   PGPInt32¤   ¤   totalValue,
ff64b9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   reqdValue;
30be29 #if PGP_BUSINESS_SECURITY
29f449 ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   enforceLength,
159595 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   enforceQuality;
72ca5d ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   minLength,
11c1e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   minQuality;
ec7454 #endif
20ae30 ¤   ¤   ¤   ¤   ¤
c5ae30 ¤   ¤   ¤   ¤   ¤
077a6a ¤   ¤   ¤   ¤   ¤   GetIndString( pstr, kStringListID,
097ce4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNewHolderPassphraseStringID );
e58309 ¤   ¤   ¤   ¤   ¤   PToCString( pstr, cstr );
02be29 #if PGP_BUSINESS_SECURITY
00328a ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefBoolean( gAdminPrefRef,
--ae41 000e7f0ce5b401201c9 Page 10 of CSplitWindow.cp
85b33e ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefEnforceMinChars, &enforceLength);
b25bf2 ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
49328a ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefBoolean( gAdminPrefRef,
4fe091 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefEnforceMinQuality, &enforceQuality);
325bf2 ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
c8b77a ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefNumber( gAdminPrefRef,
df6abf ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefMinChars, &minLength);
025bf2 ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
11b77a ¤   ¤   ¤   ¤   ¤   err = PGPGetPrefNumber( gAdminPrefRef,
3e4d89 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPrefMinQuality, &minQuality);
6d5bf2 ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
f77454 #endif
d4af5a
d70bba ¤   ¤   ¤   ¤   ¤   err = PGPConfirmationPassphraseDialog( gPGPContext,
2bb82e ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIDialogPrompt( gPGPContext, cstr ),
d6dab7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( gPGPContext, &passphrase ),
cdbe29 #if PGP_BUSINESS_SECURITY
786257 ¤   ¤   ¤   ¤   ¤   ¤   ¤   enforceLength ?
0bcd56 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIMinimumPassphraseLength(
680ff3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, minLength ) :
cf526d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( gPGPContext ),
bf0944 ¤   ¤   ¤   ¤   ¤   ¤   ¤   enforceQuality ?
8350d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOUIMinimumPassphraseQuality(
90e8ac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   gPGPContext, minQuality ) :
42526d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPONullOption( gPGPContext ),
377454 #endif
9475c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
36ae30 ¤   ¤   ¤   ¤   ¤
4314ec ¤   ¤   ¤   ¤   ¤   if( IsPGPError( err ) )
b900eb ¤   ¤   ¤   ¤   ¤   ¤   break;
e3ae30 ¤   ¤   ¤   ¤   ¤
ba01da ¤   ¤   ¤   ¤   ¤   pgpClearMemory( &holder, sizeof(ShareholderListEntry) );
9fbac7 ¤   ¤   ¤   ¤   ¤   PToCString( stringValue, holder.name );
c3e1eb ¤   ¤   ¤   ¤   ¤   holder.phrase¤  ¤   = passphrase;
186bf6 ¤   ¤   ¤   ¤   ¤   holder.hasKey¤  ¤   = FALSE;
368714 ¤   ¤   ¤   ¤   ¤   holder.numShares¤   = 1;
cc1176 ¤   ¤   ¤   ¤   ¤   holder.algorithm¤   = kPGPPublicKeyAlgorithm_Invalid;
4bfdbd ¤   ¤   ¤   ¤   ¤   mHolderList->InsertRows(1, 32767,
db07ef ¤   ¤   ¤   ¤   ¤   ¤   &holder,
606057 ¤   ¤   ¤   ¤   ¤   ¤   sizeof(ShareholderListEntry),
0c988d ¤   ¤   ¤   ¤   ¤   ¤   true);
ce9898 ¤   ¤   ¤   ¤   ¤   totalValue = mTotalShares->GetValue() + 1;
384a73 ¤   ¤   ¤   ¤   ¤   mTotalShares->SetValue( totalValue );
d45ff1 ¤   ¤   ¤   ¤   ¤   reqdValue = mReqdShares->GetValue();
a1f334 ¤   ¤   ¤   ¤   ¤   if( totalValue >= reqdValue )
7e4827 ¤   ¤   ¤   ¤   ¤   ¤   mSplitKeyButton->Enable();
f04bd6 ¤   ¤   ¤   ¤   ¤   else
89189d ¤   ¤   ¤   ¤   ¤   ¤   mSplitKeyButton->Disable();
fc2613 ¤   ¤   ¤   ¤   }
bfa3a6 ¤   ¤   ¤   }
e0cdcb ¤   ¤   ¤   break;
9f0fe4 ¤   ¤   }
d50331 ¤   ¤   case kSLSelectionChangedMessageID:
c95b34 ¤   ¤   {
84cafa ¤   ¤   ¤   cell = mHolderList->GetFirstSelectedCell();
b44620 ¤   ¤   ¤   if( cell.row > 0 )
f3f776 ¤   ¤   ¤   {
791f97 ¤   ¤   ¤   ¤   Uint32¤ ¤   dataSize = sizeof(ShareholderListEntry);
812e46 ¤   ¤   ¤   ¤   Str255¤ ¤   str;
1aaf5a
a90b78 ¤   ¤   ¤   ¤   mRemoveButton->Enable();
5cc0db ¤   ¤   ¤   ¤   mActiveSelection = FALSE;
3655c4 ¤   ¤   ¤   ¤   mHolderList->GetCellData( cell, &holder, dataSize );
18c631 ¤   ¤   ¤   ¤   mSelArrows->SetValue( holder.numShares );
7161f3 ¤   ¤   ¤   ¤   mSelShares->SetValue( holder.numShares );
c8c20d ¤   ¤   ¤   ¤   CToPString( holder.name, str );
fdf907 ¤   ¤   ¤   ¤   mSelName->SetDescriptor( str );
3e2796 ¤   ¤   ¤   ¤   mActiveSelection = TRUE;
35deb6 ¤   ¤   ¤   ¤   mSelectedCell = cell;
f5a3a6 ¤   ¤   ¤   }
08bb8c ¤   ¤   ¤   else
e7f776 ¤   ¤   ¤   {
--1708 00048ef1c41401201c9 Page 11 of CSplitWindow.cp
8fb2ac ¤   ¤   ¤   ¤   mRemoveButton->Disable();
0086d0 ¤   ¤   ¤   ¤   mSelShares->SetDescriptor( "\p" );
eba1af ¤   ¤   ¤   ¤   mSelName->SetDescriptor( "\p" );
eac0db ¤   ¤   ¤   ¤   mActiveSelection = FALSE;
c3a3a6 ¤   ¤   ¤   }
1dcdcb ¤   ¤   ¤   break;
ff0fe4 ¤   ¤   }
781b52 ¤   ¤
f19ae3 ¤   ¤   default:
511d75 ¤   ¤   ¤   LGADialog::ListenToMessage( inMessage, ioParam );
c0cdcb ¤   ¤   ¤   break;
009371 ¤   }
41efe6 }
57af5a
b17e69 ¤   Boolean
d7003f CSplitWindow::ItemIsAcceptable(
540ddf ¤   DragReference¤  ¤   inDragRef,
111f0b ¤   ItemReference¤  ¤   inItemRef)
44bb36 {
015ee0 ¤   Boolean¤¤   ¤   isAcceptable = FALSE;
463a61 ¤   ushort¤ ¤   ¤   numFlavors;
2925e4 ¤   OSStatus¤   ¤   status;
68686e ¤   DragAttributes¤ attributes;
5667c5 ¤
c220a7 ¤   GetDragAttributes(inDragRef, &attributes);
ad5ece ¤   status = CountDragItemFlavors(inDragRef, inItemRef, &numFlavors);
08115f ¤   if(IsntErr(status))
0cc7a1 ¤   {
7fabfe ¤   ¤   for(ushort flavorIndex = 1; flavorIndex <= numFlavors; flavorIndex++)
285b34 ¤   ¤   {
669a9f ¤   ¤   ¤   FlavorType¤ flavorType;
af87c7 ¤   ¤   ¤
de0895 ¤   ¤   ¤   status = GetFlavorType(inDragRef, inItemRef, flavorIndex,
67b4ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorType);
db4a64 ¤   ¤   ¤   if(IsntErr(status))
98f776 ¤   ¤   ¤   {
90829a ¤   ¤   ¤   ¤   switch(flavorType)
c972c3 ¤   ¤   ¤   ¤   {
54319e ¤   ¤   ¤   ¤   ¤   case kKeyDragFlavor:
164059 ¤   ¤   ¤   ¤   ¤   ¤   isAcceptable = TRUE;
d900eb ¤   ¤   ¤   ¤   ¤   ¤   break;
6d2613 ¤   ¤   ¤   ¤   }
49ae30 ¤   ¤   ¤   ¤   ¤
0a974b ¤   ¤   ¤   ¤   if(isAcceptable)
8a14c3 ¤   ¤   ¤   ¤   ¤   break;
18a3a6 ¤   ¤   ¤   }
010fe4 ¤   ¤   }
5f9371 ¤   }
9b7b24 ¤   return(isAcceptable);
4eefe6 }
90af5a
406d52 ¤   void
bb5106 CSplitWindow::ReceiveDragItem(
aa9701 ¤   DragReference¤  inDragRef,
bec31d ¤   DragAttributes¤ inDragAttrs,
5382a5 ¤   ItemReference¤  inItemRef,
f51a3a ¤   Rect¤   ¤   ¤   &/*inItemBounds*/)¤ // In Local coordinates
b2bb36 {
5be019 ¤   Boolean¤¤   ¤   received = FALSE;
923a61 ¤   ushort¤ ¤   ¤   numFlavors;
e125e4 ¤   OSStatus¤   ¤   status;
6d6f62 ¤   Size¤   ¤   ¤   dropSize;
3567c5 ¤
105ece ¤   status = CountDragItemFlavors(inDragRef, inItemRef, &numFlavors);
d4115f ¤   if(IsntErr(status))
74c7a1 ¤   {
ababfe ¤   ¤   for(ushort flavorIndex = 1; flavorIndex <= numFlavors; flavorIndex++)
e75b34 ¤   ¤   {
6f9a9f ¤   ¤   ¤   FlavorType¤ flavorType;
7487c7 ¤   ¤   ¤
cb99d4 ¤   ¤   ¤   status = GetFlavorType( inDragRef, inItemRef, flavorIndex,
48f531 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &flavorType );
--1f67 00027b31140401201c9 Page 12 of CSplitWindow.cp
72fb92 ¤   ¤   ¤   if( IsntErr( status ) )
89f776 ¤   ¤   ¤   {
192336 ¤   ¤   ¤   ¤   status = GetFlavorDataSize( inDragRef, inItemRef,
0a97df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, &dropSize );
65e4bb ¤   ¤   ¤   ¤   if(¤flavorType == kKeyDragFlavor &&
64138f ¤   ¤   ¤   ¤   ¤   dropSize == sizeof(PGPKeyRef) )
9d72c3 ¤   ¤   ¤   ¤   {
ceb705 ¤   ¤   ¤   ¤   ¤   PGPKeyRef¤  ¤   ¤   ¤   key;
42ae30 ¤   ¤   ¤   ¤   ¤
7ae964 ¤   ¤   ¤   ¤   ¤   status = GetFlavorData( inDragRef, inItemRef,
942a0f ¤   ¤   ¤   ¤   ¤   ¤   ¤   flavorType, &key, &dropSize, 0 );
3e8742 ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( status );
b5fdce ¤   ¤   ¤   ¤   ¤   if( PGPKeyRefIsValid( key ) )
984859 ¤   ¤   ¤   ¤   ¤   {
b685f2 ¤   ¤   ¤   ¤   ¤   ¤   PGPError¤   ¤   ¤   ¤   err;
ce926b ¤   ¤   ¤   ¤   ¤   ¤   ShareholderListEntry¤   holder;
f98a09 ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   ¤   ¤   expired,
960a95 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   revoked,
c1d860 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   disabled,
4275cc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   canEncrypt;
e028a9 ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyID¤   ¤   ¤   ¤   keyID;
1dcc2e ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   ¤   keyIDOK = FALSE;
a2686d ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   ¤   ¤   ¤   totalValue,
96aa17 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   reqdValue;
da482b ¤   ¤   ¤   ¤   ¤   ¤   PGPInt32¤   ¤   ¤   ¤   alg;
f2dabf ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤¤   ¤   ¤   ¤   nameLen;
aa94aa ¤   ¤   ¤   ¤   ¤   ¤
54c48b ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyBoolean( key, kPGPKeyPropIsRevoked,
e1daf5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &revoked );
0eca6a ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
a7964b ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyBoolean( key, kPGPKeyPropIsExpired,
8d61c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &expired );
81ca6a ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
302151 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyBoolean( key, kPGPKeyPropIsDisabled,
1ddb31 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &disabled );
9aca6a ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
8df77c ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyBoolean( key, kPGPKeyPropCanEncrypt,
98f1a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &canEncrypt );
5eca6a ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr( err );
93685d ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyIDFromKey( key, &keyID );
67239e ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
b68fec ¤   ¤   ¤   ¤   ¤   ¤   {
d6438b ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( PGPCompareKeyIDs( &keyID, &mKeyID ) )
0206b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
56d857 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   STableCell¤ ¤   cell(1,1);
9dfe7f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Uint32¤ ¤   ¤   dataSize =
68466e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(ShareholderListEntry¶
c76275 );
58f4a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TableIndexT¤¤   rows,
3af950 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cols,
837e35 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   rowIndex;
e3da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
f86551 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyIDOK = TRUE;
f6f11b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mHolderList->GetTableSize( rows, cols );
f31d9b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   for( rowIndex = rows; rowIndex > 0; rowIndex-- )
1731b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
6b23c0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cell.row = rowIndex;
4d1651 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mHolderList->GetCellData(cell, &holder,
bcdb05 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   dataSize);
6ab9b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( holder.hasKey &&
4b5530 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   !PGPCompareKeyIDs(¤ &holder.keyID,
4b26bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &keyID ) )
37dec3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
a44e02 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyIDOK = FALSE;
b552b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
a48a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
9e6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
155268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
73db3c ¤   ¤   ¤   ¤   ¤   ¤   }
e42159 ¤   ¤   ¤   ¤   ¤   ¤   if( !expired && !revoked && !disabled && canEncrypt &&
bf9335 ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyIDOK )
278fec ¤   ¤   ¤   ¤   ¤   ¤   {
--3057 0013a944d8f401201c9 Page 13 of CSplitWindow.cp
e7507b ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpClearMemory( &holder,
5c3089 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(ShareholderListEntry) );
558692 ¤   ¤   ¤   ¤   ¤   ¤   ¤   holder.numShares¤   = 1;
40b335 ¤   ¤   ¤   ¤   ¤   ¤   ¤   holder.hasKey¤  ¤   = TRUE;
b81ac7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyIDFromKey( key, &holder.keyID );
173eef ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
80a69a ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyNumber( key, kPGPKeyPropAlgID, &alg ¶
526275 );
5d3eef ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
0d34cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   holder.algorithm = (PGPPublicKeyAlgorithm) alg;
329153 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer( key,
d24a4f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMaxShareholderUserIDLength + 1,
95435b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   holder.name, &nameLen );
273eef ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpAssertNoErr(err);
c4af5a
191cca ¤   ¤   ¤   ¤   ¤   ¤   ¤   mHolderList->InsertRows(1, 32767,
4a3f6a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &holder,
818120 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof(ShareholderListEntry),
375501 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true);
d7531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
dfb723 ¤   ¤   ¤   ¤   ¤   ¤   ¤   totalValue = mTotalShares->GetValue();
93a36d ¤   ¤   ¤   ¤   ¤   ¤   ¤   reqdValue = mReqdShares->GetValue();
0851c2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mTotalShares->SetValue( ++totalValue );
1e5e42 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( totalValue >= reqdValue )
f35e3b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mSplitKeyButton->Enable();
28af5a
5535c8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   received = TRUE;
b1db3c ¤   ¤   ¤   ¤   ¤   ¤   }
081c89 ¤   ¤   ¤   ¤   ¤   }
262613 ¤   ¤   ¤   ¤   }
eff5bf ¤   ¤   ¤   ¤   if(received)
dd14c3 ¤   ¤   ¤   ¤   ¤   break;
d7a3a6 ¤   ¤   ¤   }
c90fe4 ¤   ¤   }
d29371 ¤   }
21efe6 }
3aaf5a
--878e 0001d2f2ed8401201ca Page 1 of CSplitWindow.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
e4d73a ¤   $Id: CSplitWindow.h,v 1.8.8.1 1998/11/12 03:08:20 heller Exp $
29f7f7 ____________________________________________________________________________*/
db7b7d #pragma once
64af5a
d0f0a0 #include <LGADialog.h>
6c1d80 #include <LDragAndDrop.h>
8fea2f #include <LBroadcaster.h>
d22f94 #include <LCommander.h>
5aac98 #include <LActiveScroller.h>
30ec08 #include <LLittleArrows.h>
6805c6 #include <LStaticText.h>
08d797 #include <LPushButton.h>
f0af5a
87a076 #include "pgpKeys.h"
d4add5 #include "pgpShareFile.h"
bf8ac0 #include "CShareholderList.h"
d8af5a
1f3611 const ResIDT¤   kSplitDialogResID¤  =¤  151;
feaf5a
faaf5a
3b7e4d class CSplitWindow¤ ¤   :¤  ¤   ¤   ¤   ¤   public LGADialog,
b6a129 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster,
5a91f7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LDragAndDrop
54bb36 {
a95ed4 public:
e5cc02 ¤   enum { class_ID = 'SplK' };
d72530 ¤   ¤   ¤   ¤   ¤   CSplitWindow();
ade49b ¤   ¤   ¤   ¤   ¤   CSplitWindow(LStream *inStream);
d280b4 ¤   ¤   ¤   ¤   ¤   ~CSplitWindow();
f72fb5 ¤   void¤   ¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
4b8182 ¤   void¤   ¤   ¤   FinishCreateSelf();
050c6c ¤   virtual Boolean¤ItemIsAcceptable(
8586e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragReference¤  inDragRef,
19a0ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ItemReference¤  inItemRef);
a4e148 ¤   virtual void¤   ReceiveDragItem(
c686e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragReference¤  inDragRef,
abe54c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragAttributes¤ inDragAttrs,
a6934d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ItemReference¤  inItemRef,
e4f608 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect¤   ¤   ¤   &inItemBounds);
4967c5 ¤
5cf3aa ¤   void¤   ¤   ¤   SetSplitKey(¤   ¤   PGPKeyRef¤  ¤   key );
79d071 ¤   void¤   ¤   ¤   Split();
390fb9 private:
e6472c ¤   PGPError¤   ¤   MakeShareFile(PGPShareRef¤  ¤   ¤   shareRef,
49afed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ShareholderListEntry *¤ holder,
d2d764 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   ¤   ¤   ¤   dirID,
e452dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   ¤   ¤   ¤   vRefNum );
94df9e ¤   void¤   ¤   ¤   DoDropAreaHilite(
742398 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragReference ¤ inDragRef,
c32d6d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   showHilite);
a8af5a
6aa6a6 ¤   CShareholderList *¤ ¤   mHolderList;
cbb05b ¤   PGPKeyID¤   ¤   ¤   ¤   mKeyID;
11d09e ¤   PGPPublicKeyAlgorithm¤  mAlgorithm;
f54ab2 ¤   LActiveScroller¤*¤  ¤   mScroller;
472cee ¤   LStaticText¤*¤  ¤   ¤   mSplitName,
1b1213 ¤   ¤   ¤   ¤   *¤  ¤   ¤   mReqdShares,
b4ab99 ¤   ¤   ¤   ¤   *¤  ¤   ¤   mSelShares,
606661 ¤   ¤   ¤   ¤   *¤  ¤   ¤   mTotalShares,
c07586 ¤   ¤   ¤   ¤   *¤  ¤   ¤   mSelName;
445f3d ¤   LPushButton *¤  ¤   ¤   mSplitKeyButton,
9ccc94 ¤   ¤   ¤   ¤   *¤  ¤   ¤   mRemoveButton;
853b13 ¤   PGPBoolean¤ ¤   ¤   ¤   mActiveSelection;
a276f7 ¤   STableCell¤ ¤   ¤   ¤   mSelectedCell;
981935 ¤   LLittleArrows *¤¤   ¤   mSelArrows;
1daf5a
--9fc5 001a7f3cd44401201ca Page 2 of CSplitWindow.h
92e23f ¤   enum¤   {¤
2ab5de ¤   ¤   ¤   ¤   kSplitKeyName¤  ¤   ¤   = 'cNam',
5cdb41 ¤   ¤   ¤   ¤   kSplitKeyIcon¤  ¤   ¤   = 'iSKI',
513ffd ¤   ¤   ¤   ¤   kHolderScroller¤¤   ¤   = 'sSCR',
5f6f6a ¤   ¤   ¤   ¤   kHolderList¤¤   ¤   ¤   = 'lSHA',
19f9f1 ¤   ¤   ¤   ¤   kSelectedShareName¤ ¤   = 'cSel',
133daf ¤   ¤   ¤   ¤   kSelectedShareNum¤  ¤   = 'cSSh',
36121d ¤   ¤   ¤   ¤   kTotalShareNum¤ ¤   ¤   = 'cTSh',
1e3a82 ¤   ¤   ¤   ¤   kRequiredShareNum¤  ¤   = 'cRSh',
ac50d2 ¤   ¤   ¤   ¤   kShareArrows¤   ¤   ¤   = 'aSha',
8976df ¤   ¤   ¤   ¤   kReqdShareArrows¤   ¤   = 'aRSh',
a4d133 ¤   ¤   ¤   ¤   kAddHolderButton¤   ¤   = 'bAdd',
9df8f9 ¤   ¤   ¤   ¤   kRemoveHolderButton¤¤   = 'bRmv',
f58e19 ¤   ¤   ¤   ¤   kSplitKeyButton¤¤   ¤   = 'bSpl',
27b688 ¤   ¤   ¤   ¤   kSplitCancelButton¤ ¤   = 'bCan'
45c0bf ¤   ¤   ¤   };
9482f7 };
a7af5a
--5a18 000bc030ac9401201cb Page 1 of GetPassphrase.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
3bdcf1 ¤   $Id: GetPassphrase.cp,v 1.10.8.1 1998/11/12 03:08:20 heller Exp $
e7f7f7 ____________________________________________________________________________*/
d8af5a
f6dd06 #include <UDesktop.h>
85af5a
1d85c2 #include "MacStrings.h"
82e684 #include "pgpUserInterface.h"
41a02f #include "pgpClientLib.h"
27af5a
7cb8cb #include "CPGPKeys.h"
373b50 #include "GetPassphrase.h"
47af5a
70c744 ¤   PGPError
37c43a DoPassphraseDialog(
58b4f6 ¤   PGPKeyRef¤  theKey,
7ffabd ¤   char ¤  ¤   *passphrase)
a9bb36 {
9061e0 ¤   PGPError¤   err;
ec3f28 ¤   char¤   ¤   *outputPassphrase;
7367c5 ¤
cc7db5 ¤   *passphrase = 0;
0867c5 ¤
8bfb29 ¤   UDesktop::Deactivate();
ad67c5 ¤
a236d1 ¤   err = PGPKeyPassphraseDialog( gPGPContext, theKey,
224f88 ¤   ¤   ¤   ¤   PGPOUIOutputPassphrase( gPGPContext, &outputPassphrase ),
266f55 ¤   ¤   ¤   ¤   PGPOLastOption( gPGPContext ) );
f367c5 ¤
265824 ¤   UDesktop::Activate();
4e67c5 ¤
6ab1f0 ¤   if( IsntPGPError( err ) )
d2c7a1 ¤   {
e6d504 ¤   ¤   CopyCString( outputPassphrase, passphrase );
8a5ee1 ¤   ¤   PGPFreeData( outputPassphrase );
b29371 ¤   }
1b67c5 ¤
e65ea8 ¤   return err;
36efe6 }
3eaf5a
bdc744 ¤   PGPError
cfe68d GetPassForKey(
27cd9b ¤   PGPKeyRef¤  ¤   key,
ecc158 ¤   PGPBoolean¤ ¤   *isSplit,
49203b ¤   char¤   ¤   ¤   *passphrase,
d975d5 ¤   PGPByte¤¤   ¤   **passKey,
363b28 ¤   PGPSize¤¤   ¤   *passKeySize )
20bb36 {
3c3bb5 ¤   PGPError¤   ¤   err = kPGPError_NoErr;
68f9ae ¤   PGPBoolean¤ ¤   split,
175153 ¤   ¤   ¤   ¤   ¤   needsPass;
9867c5 ¤
6c45c0 ¤   PGPValidatePtr( isSplit );
fcbed6 ¤   PGPValidatePtr( passphrase );
24c350 ¤   PGPValidatePtr( passKey );
25d5d4 ¤   PGPValidatePtr( passKeySize );
d267c5 ¤
4d5033 ¤   *isSplit = FALSE;
4bde7f ¤   *passphrase = '\0';
fd0fbe ¤   PGPGetKeyBoolean( key, kPGPKeyPropNeedsPassphrase, &needsPass );
8cc32f ¤   if( needsPass )
20c7a1 ¤   {
e7f198 ¤   ¤   PGPGetKeyBoolean( key, kPGPKeyPropIsSecretShared, &split );
82b363 ¤   ¤   if( split )
f45b34 ¤   ¤   {
e9dd8b ¤   ¤   ¤   UDesktop::Deactivate();
bceed2 ¤   ¤   ¤   ¤   err = PGPReconstitutionDialog( key,
--6bb2 001357ba0fa401201cb Page 2 of GetPassphrase.cp
e3b190 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeys::TheApp()->GetKeySet(),
c3f857 ¤   ¤   ¤   ¤   ¤   ¤   ¤   gTLSContext,
854cd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   passKey, passKeySize );
a2daa6 ¤   ¤   ¤   UDesktop::Activate();¤  CKERR;
96e3ce ¤   ¤   ¤   *isSplit = TRUE;
860fe4 ¤   ¤   }
ce0e1d ¤   ¤   else
a4f0b2 ¤   ¤   ¤   err = DoPassphraseDialog( key, passphrase );
7e9371 ¤   }
90b38c done:
e25ea8 ¤   return err;
ceefe6 }
35af5a
--6186 001d15ccbbf401201cc Page 1 of GetPassphrase.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
46f9b4 ¤   $Id: GetPassphrase.h,v 1.5.8.1 1998/11/12 03:08:21 heller Exp $
6ff7f7 ____________________________________________________________________________*/
a57b7d #pragma once
70af5a
16a076 #include "pgpKeys.h"
d0af5a
a6ff60 PGPError DoPassphraseDialog(PGPKeyRef theKey, char *passphrase);
9d0aee PGPError GetPassForKey(¤PGPKeyRef¤  ¤   key,
795336 ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean¤ ¤   *isSplit,
9c1f80 ¤   ¤   ¤   ¤   ¤   ¤   char¤   ¤   ¤   *passphrase,
89ff3f ¤   ¤   ¤   ¤   ¤   ¤   PGPByte¤¤   ¤   **passKey,
e73bdf ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤¤   ¤   *passKeySize );
d1af5a
--eba7 000be2065b8401201cd Page 1 of LMenuBar.h
8fc00f // ===========================================================================
c86c55 //¤ LMenuBar.h¤ ¤   ¤   ¤   ···(C)1993-1996 Metrowerks Inc. All rights reserved.
e2c00f // ===========================================================================
a0af5a
a1b310 #ifndef _H_LMenuBar
06ba97 #define _H_LMenuBar
357b7d #pragma once
52af5a
368466 #if defined(__CFM68K__) && !defined(__USING_STATIC_LIBS__)
49831b ¤   #pragma import on
417454 #endif
38af5a
e6332c #include <PP_Prefix.h>
86af5a
2c58fa #ifndef __EVENTS__
f1cd03 #include <Events.h>
867454 #endif
b5af5a
7c36c8 #ifndef __MENUS__
41ae6e #include <Menus.h>
d97454 #endif
2daf5a
0e232c class¤  LMenu;
75af5a
749e91 const ResIDT¤   InstallMenu_AtEnd¤  = 0;
25af5a
6daf5a
cf292b class¤  LMenuBar {
755ed4 public:
249b85 ¤   ¤   ¤   ¤   ¤   ¤   LMenuBar(
be58b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ResIDT¤ ¤   ¤   ¤   inMBARid);
9c3387 ¤   virtual ¤   ¤   ¤   ~LMenuBar();
ad67c5 ¤
89688f ¤   virtual CommandT¤   MenuCommandSelection(
6365da ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord¤  &inMouseEvent,
fd91a9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   ¤   ¤   &outMenuChoice) const;
e86fad ¤   virtual Boolean¤¤   CouldBeKeyCommand(
8ce340 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord¤  &inKeyEvent) const;
a38861 ¤   virtual CommandT¤   FindKeyCommand(
5edb33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord¤  &inKeyEvent,
9c91a9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   ¤   ¤   &outMenuChoice) const;
b967c5 ¤
06dc24 ¤   // **************************************************************
b297c6 ¤   // The following line declares the FindCommand function as virtual
3eb6da ¤   // which fixes a bug in PowerPlant -- the reason we use this
9cb6cd ¤   // replacement file
d0dc24 ¤   // **************************************************************
01399f ¤   virtual¤CommandT¤   FindCommand(
def90f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ResIDT¤ ¤   ¤   ¤   inMENUid,
e4e958 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   ¤   ¤   inItem) const;
b5efde ¤   ¤   ¤   void¤   ¤   FindMenuItem(
af08b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CommandT¤   ¤   ¤   inCommand,
1d00df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ResIDT¤ ¤   ¤   ¤   &outMENUid,
4c3316 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   MenuHandle¤ ¤   ¤   &outMenuHandle,
92e575 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   ¤   ¤   &outItem);
803d34 ¤   ¤   ¤   Boolean¤¤   FindNextCommand(
0f8512 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   ¤   ¤   &ioIndex,
d3fb3d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   MenuHandle¤ ¤   ¤   &ioMenuHandle,
b59953 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LMenu*¤ ¤   ¤   ¤   &ioMenu,
c6477a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CommandT¤   ¤   ¤   &outCommand);
4987c7 ¤   ¤   ¤
554e7b ¤   ¤   ¤   void¤   ¤   InstallMenu(
9d786e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LMenu¤  ¤   ¤   ¤   *inMenu,
e1ad2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ResIDT¤ ¤   ¤   ¤   inBeforeMENUid);
bdf0b9 ¤   ¤   ¤   void¤   ¤   RemoveMenu(
93b39d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LMenu¤  ¤   ¤   ¤   *inMenu);
ed87c7 ¤   ¤   ¤
b64a7c ¤   ¤   ¤   LMenu*¤ ¤   FetchMenu(
6909a6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ResIDT¤ ¤   ¤   ¤   inMENUid) const;
04c9d8 ¤   ¤   ¤   Boolean¤¤   FindNextMenu(
774d42 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LMenu*¤ ¤   ¤   ¤   &ioMenu) const;
be87c7 ¤   ¤   ¤
--5c29 001859b1f3c401201cd Page 2 of LMenuBar.h
0eaee6 ¤   static LMenuBar*¤   GetCurrentMenuBar()¤¤   { return sMenuBar; }
7caf5a
18a2d3 protected:
3d6305 ¤   static¤ LMenuBar¤   *sMenuBar;
9167c5 ¤
148432 ¤   LMenu¤  ¤   ¤   ¤   *mMenuListHead;
6c82f7 };
70af5a
6daf5a
df9133 // ---------------------------------------------------------------------------
75f006 //¤ StUnhiliteMenu
bf9133 // ---------------------------------------------------------------------------
535859 //¤ Stack-based class to unhilite the currently selected menu title
93af5a
9e9250 class¤  StUnhiliteMenu {
cc5ed4 public:
bd73c5 ¤   ¤   ¤   ¤   ¤   ¤   StUnhiliteMenu() { }
5c553d ¤   ¤   ¤   ¤   ¤   ¤   ~StUnhiliteMenu()
0d8fec ¤   ¤   ¤   ¤   ¤   ¤   {
26dca7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::HiliteMenu(0);
86db3c ¤   ¤   ¤   ¤   ¤   ¤   }
c782f7 };
b8af5a
858466 #if defined(__CFM68K__) && !defined(__USING_STATIC_LIBS__)
fc9d3c ¤   #pragma import reset
7e7454 #endif
26af5a
852841 #endif¶
--2280 0008d35d206401201ce Page 1 of PGPKeysMenuBar.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
012dcd ¤   $Id: PGPKeysMenuBar.cp,v 1.7.8.1 1998/11/12 03:08:22 heller Exp $
c6f7f7 ____________________________________________________________________________*/
fb43c8 #include <Balloons.h>
c0299a #include <ToolUtils.h>
49dd56 #include <PP_Messages.h>
07af5a
b4e0bd #include "PGPKeysMenuBar.h"
8db8cb #include "CPGPKeys.h"
d1af5a
3a0d08 #include "pgpMem.h"
aeaf5a
34b4a7 PGPKeysMenuBar::PGPKeysMenuBar(ResIDT inMBARid)
5237ac ¤   : LMenuBar(inMBARid)
86bb36 {
5aefe6 }
d7af5a
18af5a
478afa ¤   CommandT
b31206 PGPKeysMenuBar::MenuCommandSelection(
d5b9be ¤   const EventRecord¤  &inMouseEvent,
bd9701 ¤   Int32¤  ¤   ¤   ¤   &outMenuChoice) const
34bb36 {
8d25a6 ¤   outMenuChoice = ::MenuSelect(inMouseEvent.where);
3967c5 ¤
0167f5 ¤   Int32¤  menuCmd = cmd_Nothing;
0a5ce7 ¤   if (HiWord(outMenuChoice) != 0) {
3785fa ¤   ¤   menuCmd = FindCommand(HiWord(outMenuChoice), LoWord(outMenuChoice));
be9371 ¤   }
c501a5 ¤   menuCmd = ModifyMenuCommand(menuCmd, inMouseEvent);
4567c5 ¤
e04ad0 ¤   return menuCmd;
b2efe6 }
f8af5a
f2af5a
668afa ¤   CommandT
125dd1 PGPKeysMenuBar::ModifyMenuCommand(
ce46d2 ¤   CommandT menuCmd,·
3dae53 ¤   const EventRecord& inMacEvent) const
e3bb36 {
5ce31e ¤   if(menuCmd == cmd_Clear)
7ec7a1 ¤   {
1a7809 ¤   ¤   if(IsntNull(inMacEvent.modifiers & optionKey))
6ac42b ¤   ¤   ¤   menuCmd = cmd_OptionClear;
429371 ¤   }
bf45f3 ¤   else if (menuCmd == cmd_Revoke)
75c7a1 ¤   {
0d7809 ¤   ¤   if(IsntNull(inMacEvent.modifiers & optionKey))
518284 ¤   ¤   ¤   menuCmd = cmd_OptionRevoke;
1e9371 ¤   }
d467c5 ¤
f04ad0 ¤   return menuCmd;
cfefe6 }
72af5a
bd8afa ¤   CommandT
dfcac6 PGPKeysMenuBar::FindCommand(
df131f ¤   ResIDT¤ ¤   ¤   ¤   inMENUid,
05bf74 ¤   Int16¤  ¤   ¤   ¤   inItem) const
afbb36 {
39eb4b ¤   // This fixes a bug in PowerPlant. ·Since the ID of the
07968e ¤   // Help menu is a negative number, it is not correctly
7880d5 ¤   // viewed as a synthetic command after translation, so
050bed ¤   // we substitute a value for it here.
d567c5 ¤
26c08a ¤   if(inMENUid == kHMHelpMenuID)
f6bc3d ¤   ¤   inMENUid = kSubstituteHelpMenuID;
8d6cb4 ¤   return LMenuBar::FindCommand(inMENUid, inItem);
--f4da 0014613fa97401201ce Page 2 of PGPKeysMenuBar.cp
7aefe6 }
46af5a
--c87c 001a7dbbfbf401201cf Page 1 of PGPKeysMenuBar.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
cf758c ¤   $Id: PGPKeysMenuBar.h,v 1.4.16.1 1998/11/12 03:08:23 heller Exp $
3af7f7 ____________________________________________________________________________*/
b8c0a5 #include "LMenuBar.h"
b7af5a
f5ec63 class¤  PGPKeysMenuBar:¤public¤ LMenuBar
07bb36 {
2b5ed4 public:
9018a4 ¤   ¤   ¤   ¤   ¤   ¤   PGPKeysMenuBar(
b558b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ResIDT¤ ¤   ¤   ¤   inMBARid);
51da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
3a688f ¤   virtual CommandT¤   MenuCommandSelection(
b565da ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord¤  &inMouseEvent,
7291a9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int32¤  ¤   ¤   ¤   &outMenuChoice) const;
c8af5a
25430f ¤   ¤   ¤   CommandT¤   ModifyMenuCommand(·
ae3af1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CommandT menuCmd,·
bfab60 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord& inMacEvent ) const;
32399f ¤   virtual¤CommandT¤   FindCommand(
56f90f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ResIDT¤ ¤   ¤   ¤   inMENUid,
52e958 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16¤  ¤   ¤   ¤   inItem) const;
a782f7 };
--0b66 0013500e561401201d0 Page 1 of PGPkeysCommonHeaders.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
ec3ce6 ¤   $Id: PGPkeysCommonHeaders.h,v 1.11.8.1 1998/11/12 03:08:24 heller Exp $
bcf7f7 ____________________________________________________________________________*/
247b7d #pragma once
cfaf5a
2277e0 #if __POWERPC__
0dd4a3 ¤   #include "MacHeadersPPC++"
99fc58 #elif __CFM68K__
5b3665 ¤   #include "MacHeadersCFM68K++"
1adb21 #else
7816c4 ¤   #error Cannot compile in this environment
f37454 #endif
3baf5a
e2af2e #include <Sound.h>¤ // Needed for PP file LTextEditView.cp
eaaf5a
95ae08 #define PGP_MACINTOSH¤  ¤   ¤   ¤   1
88e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
c679b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
45af5a
cd66d3 #define USE_WHACKFREESPACE¤ ¤   ¤   0
85af5a
c70db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
c5af5a
efa662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
7fa6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
7f5cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
93af5a
7781a4 #include "pgpBuildFlags.h"
c5e2ff #include "pgpConfig.h"
3b94a0 #include "pgpLeaks.h"
4c46ad #include "MacDebug.h"
25af5a
c61665 // JPEG Library items
b57455 #define ALIGN_TYPE¤ ¤   ¤   ¤   ¤   long
35af5a
--ea46 00198c8a986401201d1 Page 1 of PGPkeysDebugHeaders.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
0aa65f ¤   $Id: PGPkeysDebugHeaders.prefix,v 1.3.8.1 1998/11/12 03:08:24 heller Exp $
def7f7 ____________________________________________________________________________*/
447b7d #pragma once
29af5a
49c964 #define PGP_DEBUG¤  ¤   1
55af5a
951e1e #define Debug_Throw¤¤   1¤  /* PowerPlant debugging */
236c50 #define Debug_Signal¤   1¤  /* PowerPlant debugging */
a7af5a
1ae038 #include "PGPkeysCommonHeaders.h"
98af5a
--0cc3 00170c0986d401201d2 Page 1 of PGPkeysHeaders.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
86540b ¤   $Id: PGPkeysHeaders.prefix,v 1.2.18.1 1998/11/12 03:08:25 heller Exp $
d0f7f7 ____________________________________________________________________________*/
ca7b7d #pragma once
b6af5a
0cb18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
f6af5a
aae038 #include "PGPkeysCommonHeaders.h"
70af5a
--8959 001471f6422401201d3 Page 1 of ResourceConstants.h
997b7d #pragma once
bdaf5a
c1b929 // many resource constants are within a class,
70c292 // but some are used by more than one component.
a3af5a
f6f989 enum¤   {
dd5234 ¤   ¤   ¤   kRSAKeyIconID = 3000,
f43c53 ¤   ¤   ¤   kRSAKeyPairIconID,
be96b1 ¤   ¤   ¤   kRSAUserIDIconID,
980ca4 ¤   ¤   ¤   kNoExportSignatureIconID,
d3a7fa ¤   ¤   ¤   kRSARevokedKeyID,
2300ed ¤   ¤   ¤   kRSAExpiredKeyID,
d18062 ¤   ¤   ¤   kDSADisabledKeyID,
3713e9 ¤   ¤   ¤   kDSAKeyIconID,
85c8ac ¤   ¤   ¤   kDSAKeyPairIconID,
c9945b ¤   ¤   ¤   kRevokedSigID,
0b749d ¤   ¤   ¤   kRSADisabledKeyID,
41be25 ¤   ¤   ¤   kBadSignatureID,
f7cf39 ¤   ¤   ¤   kDSARevokedKeyID,
d0682e ¤   ¤   ¤   kDSAExpiredKeyID,
ba8c98 ¤   ¤   ¤   kValidKeyIconID,
1db6a3 ¤   ¤   ¤   kKeyAttrOffIconID,
8294a3 ¤   ¤   ¤   kMRKActiveIconID,
377ae8 ¤   ¤   ¤   kAxiomaticIconID,
9244ca ¤   ¤   ¤   kDSASplitKeyPairIconID,
0ab457 ¤   ¤   ¤   kRSASplitKeyPairIconID,
787c7d ¤   ¤   ¤   kDHUserIDIconID,
0e65c2 ¤   ¤   ¤   kExportSignatureIconID,
c3dda7 ¤   ¤   ¤   kNoExportMetaSigIconID,
429c86 ¤   ¤   ¤   kExportMetaSigIconID,
08cc57 ¤   ¤   ¤   kPressedValidityIconID,
d0498c ¤   ¤   ¤   kPressedAxiomaticIconID,
fd7da8 ¤   ¤   ¤   kDHGroupIconID,
5524ed ¤   ¤   ¤   kPhotoUserIDIconID,
38cc8e ¤   ¤   ¤   kUnknowUserIDIconID,
ddc3fd ¤   ¤   ¤   kSecureConnectIconID,
d9532b ¤   ¤   ¤   kInsecureConnectIconID,
1064e0 ¤   ¤   ¤   kSignatureExpiredIconID,
82e46a ¤   ¤   ¤   kConventionalIconID
3aa105 ¤   ¤   };
8f1b52 ¤   ¤
7baf5a
ad9c15 const ResIDT¤   kSendToServerMENUID¤¤   =¤  133;
47af5a
--ffb7 000905825d4401201d4 Page 1 of UDragAndDropUtils.cp
74acc7 // ============================================================================
941584 //¤ UDragAndDropUtils.cp¤   ¤   (C)1996 Metrowerks Inc. All rights reserved.
2eacc7 // ============================================================================
f3cc5c #include <UMemoryMgr.h>
f40335 /*____________________________________________________________________________
10c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
864b0f ¤   All rights reserved.
2f67c5 ¤
4767c5 ¤
f0af5a
7f7e34 ¤   $Id: UDragAndDropUtils.cp,v 1.4.8.1 1998/11/12 03:08:26 heller Exp $
b2f7f7 ____________________________________________________________________________*/
0a1ef3 #include <Folders.h>
e0af5a
cd3852 #include "UDragAndDropUtils.h"
cbaf5a
b69133 // ---------------------------------------------------------------------------
089cde // ·DroppedInTrash
e39133 // ---------------------------------------------------------------------------
9eaf5a
c84769 Boolean
dd9d50 UDragAndDropUtils::DroppedInTrash(
0512bc ¤   DragReference¤  inDragRef )
5cbb36 {
ad1869 ¤   Boolean¤isTrash = false;
c167c5 ¤
ad8823 ¤   Try_ {
9aaf5a
5caa29 #ifdef¤ Debug_Throw
5eadbd ¤   ¤   // It's okay to fail here, so·
b88cd5 ¤   ¤   // temporarily turn off debug actions.
bd3386 ¤   ¤   StValueChanger<EDebugAction>
5b4104 ¤   ¤   ¤   theDebugAction( gDebugThrow, debugAction_Nothing );
3b7454 #endif
d3af5a
71c3c5 ¤   ¤   // Get the drop location from the drag ref.
f7f4e7 ¤   ¤   AEDesc¤ theDropDestination;
2939b3 ¤   ¤   ThrowIfOSErr_( ::GetDropLocation( inDragRef, &theDropDestination ) );
b4af5a
3b7cfa ¤   ¤   // Make sure we're dealing with an alias.
8b0d3d ¤   ¤   if(theDropDestination.descriptorType != typeAlias)
785f1f ¤   ¤   ¤   return FALSE;
4ffccc ¤   ¤   ThrowIf_( theDropDestination.descriptorType != typeAlias );
30af5a
3b0da9 ¤   ¤   // Get the file spec of the destination to
fd0d6d ¤   ¤   // which the user dragged the item.
d20630 ¤   ¤   FSSpec¤ theDestinationFSSpec;
255b34 ¤   ¤   {
7e7f2f ¤   ¤   ¤   // Lock the descriptor data handle.
cff125 ¤   ¤   ¤   StHandleLocker¤ theLock( theDropDestination.dataHandle );
ab87c7 ¤   ¤   ¤
21a962 ¤   ¤   ¤   // Attempt to resolve the alias.
633d30 ¤   ¤   ¤   Boolean¤isChanged;
93fe2a ¤   ¤   ¤   ThrowIfOSErr_( ::ResolveAlias( nil,
476e0e ¤   ¤   ¤   ¤   (AliasHandle) theDropDestination.dataHandle,
c5d225 ¤   ¤   ¤   ¤   &theDestinationFSSpec, &isChanged ) );
880fe4 ¤   ¤   }
121b52 ¤   ¤
040f36 ¤   ¤   // Get the file spec for the trash.
9c8c10 ¤   ¤   FSSpec¤ theTrashFSSpec;
ce1191 ¤   ¤   Int16¤  theTrashVRefNum;
18481c ¤   ¤   Int32¤  theTrashDirID;
a979ee ¤   ¤   ThrowIfOSErr_( ::FindFolder( kOnSystemDisk, kTrashFolderType,
9c3203 ¤   ¤   ¤   kDontCreateFolder, &theTrashVRefNum, &theTrashDirID ) );
905bd7 ¤   ¤   ThrowIfOSErr_( ::FSMakeFSSpec( theTrashVRefNum,
6ef257 ¤   ¤   ¤   theTrashDirID, nil, &theTrashFSSpec ) );
9baf5a
137348 ¤   ¤   // Compare the two file specs.
2cfa7c ¤   ¤   isTrash =
1df9d0 ¤   ¤   ¤   (theDestinationFSSpec.vRefNum == theTrashFSSpec.vRefNum ) &&
d69e73 ¤   ¤   ¤   (theDestinationFSSpec.parID¤ ==¤theTrashFSSpec.parID ) &&
906ab3 ¤   ¤   ¤   (::EqualString( theDestinationFSSpec.name,
--7a23 0018a6e04c3401201d4 Page 2 of UDragAndDropUtils.cp
cb4183 ¤   ¤   ¤   ¤   theTrashFSSpec.name, false, true ));
c567c5 ¤
db8293 ¤   } Catch_( inErr ) {
4967c5 ¤
d3e07e ¤   ¤   // Nothing to do here.
1e67c5 ¤
899371 ¤   }
7caf5a
d6ae69 ¤   return isTrash;
c2efe6 }
3caf5a
42af5a
e49133 // ---------------------------------------------------------------------------
25632a // ·CheckForOptionKey
009133 // ---------------------------------------------------------------------------
99af5a
ad4769 Boolean
75cb73 UDragAndDropUtils::CheckForOptionKey(
d312bc ¤   DragReference¤  inDragRef )
80bb36 {
0844fb ¤   // Get the drag modifiers.
32cc28 ¤   Int16¤  theModifiersNow;
4363f7 ¤   Int16¤  theModifiersAtMouseDown;
830f01 ¤   Int16¤  theModifiersAtMouseUp;
c126ec ¤   ::GetDragModifiers( inDragRef, &theModifiersNow,
5df481 ¤   ¤   &theModifiersAtMouseDown, &theModifiersAtMouseUp );
ff67c5 ¤
a01a6c ¤   // Return true if the option key was down at the
d264d9 ¤   // beginning or the end of the drag.
9210f9 ¤   return ( (theModifiersAtMouseDown & optionKey) != 0 ) ||
5eefbf ¤   ¤   ( (theModifiersAtMouseUp & optionKey) != 0 );
54efe6 }
25af5a
a6af5a
c19133 // ---------------------------------------------------------------------------
4cd5a7 // ·CheckIfViewIsAlsoSender
419133 // ---------------------------------------------------------------------------
75af5a
b74769 Boolean
64fe8e UDragAndDropUtils::CheckIfViewIsAlsoSender(
d012bc ¤   DragReference¤  inDragRef )
45bb36 {
7c5063 ¤   // Get the drag attributes.
fd76eb ¤   DragAttributes theDragAttributes;
981fe5 ¤   ::GetDragAttributes(inDragRef, &theDragAttributes);
fb67c5 ¤
8a88b9 ¤   // Return true if the drag is in the·
2536ef ¤   // same window as the originator of the drag.
16f685 ¤   return (theDragAttributes & kDragInsideSenderWindow) != 0;
8aefe6 }
--4117 001b6ec24d0401201d5 Page 1 of UDragAndDropUtils.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
99f8e3 ¤   $Id: UDragAndDropUtils.h,v 1.1.18.1 1998/11/12 03:08:26 heller Exp $
36f7f7 ____________________________________________________________________________*/
f47b7d #pragma once
1baf5a
2a0334 #include <Drag.h>
41af5a
1b4189 class UDragAndDropUtils {
055ed4 public:
fb44b3 ¤   static Boolean¤ DroppedInTrash( DragReference inDragRef );
3eef62 ¤   static Boolean¤ CheckForOptionKey( DragReference inDragRef );
22b707 ¤   static Boolean¤ CheckIfViewIsAlsoSender( DragReference inDragRef );
b682f7 };
--3e32 0001dc8ed24401201d6 Page 1 of InstallAdmin.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
3e5dbb ¤   $Id: InstallAdmin.cp,v 1.5.8.1 1998/11/12 03:10:58 heller Exp $
cff7f7 ____________________________________________________________________________*/
55af5a
3a6eab #define PGP_MACINTOSH¤  ¤   1
a7af5a
3ac5d5 #include "pgpBase.h"
646915 #include "MacResources.h"
0cbbf4 #include "MacFiles.h"
1aaf5a
882f2f #include "ExternCodeDefines.h"
f4af5a
859e3c static const ResType¤   kAdminType¤ ¤   ¤   ¤   =¤  'ADMN';
b51f2d static const SInt16¤¤   ADMN_AdminPrefs¤¤   ¤   =¤  5001;
cce3f5 static const SInt16¤¤   ADMN_ClientPrefs¤   ¤   =¤  5002;
8eaf5a
ab7669 static const ResType¤   kAdminConfiguredType¤   =¤  'PGPa';
d6ee82 static const SInt16¤¤   PGPa_Configured¤¤   ¤   =¤  0;
91af5a
084526 static const SInt32¤msg_AdminPrefs¤ ¤   ¤   ¤   =¤  ADMN_AdminPrefs;
a4253a static const SInt32¤msg_ClientPrefs¤¤   ¤   ¤   =¤  ADMN_ClientPrefs;
c70079 static const SInt32¤msg_InstallIfAdmin¤ ¤   ¤   =¤  1;
78e4bc static const SInt32¤msg_InstallIfClient¤¤   ¤   =¤  2;
2f25f4 static const SInt32¤msg_AddMarkerIfClient¤  ¤   =¤  3;
daaf5a
c325c4 static const unsigned char *¤   kSecretMessage¤ =¤  "\pWhat's this for?";
edaf5a
fcaf5a
896685 ¤   pascal void
982fe1 main(
8b0866 ¤   ExternParmBlock *¤  eInfo)
87bb36 {
08b990 ¤   switch (eInfo->selector) {
346962 ¤   ¤   case kSelectorBeforeFile:
025b34 ¤   ¤   {
e6ca72 ¤   ¤   ¤   switch (eInfo->refCon) {
f6c4e9 ¤   ¤   ¤   ¤   case msg_InstallIfAdmin:
dec781 ¤   ¤   ¤   ¤   case msg_InstallIfClient:
fb72c3 ¤   ¤   ¤   ¤   {
6d18a3 ¤   ¤   ¤   ¤   ¤   if (ResourceExists(kAdminType, ADMN_AdminPrefs, true)) {
17d64d ¤   ¤   ¤   ¤   ¤   ¤   if (eInfo->refCon == msg_InstallIfAdmin) {
0c1f41 ¤   ¤   ¤   ¤   ¤   ¤   ¤   eInfo->installFork = kDontInstallFile;
badb3c ¤   ¤   ¤   ¤   ¤   ¤   }
ec81a1 ¤   ¤   ¤   ¤   ¤   } else {
eb0581 ¤   ¤   ¤   ¤   ¤   ¤   if (eInfo->refCon == msg_InstallIfClient) {
5b1f41 ¤   ¤   ¤   ¤   ¤   ¤   ¤   eInfo->installFork = kDontInstallFile;
29db3c ¤   ¤   ¤   ¤   ¤   ¤   }
521c89 ¤   ¤   ¤   ¤   ¤   }
a72613 ¤   ¤   ¤   ¤   }
11f622 ¤   ¤   ¤   ¤   break;
36a3a6 ¤   ¤   ¤   }
050fe4 ¤   ¤   }
9b2f68 ¤   ¤   break;
891b52 ¤   ¤
701b52 ¤   ¤
3fec22 ¤   ¤   case kSelectorAfterFile:
995b34 ¤   ¤   {
6fca72 ¤   ¤   ¤   switch (eInfo->refCon) {
5f5de6 ¤   ¤   ¤   ¤   case msg_AdminPrefs:
779dee ¤   ¤   ¤   ¤   case msg_ClientPrefs:
1172c3 ¤   ¤   ¤   ¤   {
8b05d3 ¤   ¤   ¤   ¤   ¤   OSStatus¤   err = resNotFound;
ccf8eb ¤   ¤   ¤   ¤   ¤   FSSpec¤ ¤   theFile;
a6ae30 ¤   ¤   ¤   ¤   ¤
9d8cda ¤   ¤   ¤   ¤   ¤   // Create the FSSpec
7f4d34 ¤   ¤   ¤   ¤   ¤   ::FSMakeFSSpec(¤eInfo->theFile.af_vRefNum,
1d69f0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   eInfo->theFile.af_DirID,
--0450 000922a5dc2401201d6 Page 2 of InstallAdmin.cp
f7ed8f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   eInfo->theFile.af_Name,
b1c020 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theFile);
a0af5a
18b622 ¤   ¤   ¤   ¤   ¤   // Attempt to get the resource
04dec4 ¤   ¤   ¤   ¤   ¤   if (ResourceExists(kAdminType, eInfo->refCon, true)) {
4defd2 ¤   ¤   ¤   ¤   ¤   ¤   Handle¤ ¤   theAdminResource;
c9b0f4 ¤   ¤   ¤   ¤   ¤   ¤   SInt16¤ ¤   refNum;
5694aa ¤   ¤   ¤   ¤   ¤   ¤
e7b697 ¤   ¤   ¤   ¤   ¤   ¤   // Get a handle to the resource
d03073 ¤   ¤   ¤   ¤   ¤   ¤   ::SetResLoad(false);
76c660 ¤   ¤   ¤   ¤   ¤   ¤   theAdminResource = ::Get1Resource(¤ kAdminType,
80bebf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   eInfo->refCon);
c27c75 ¤   ¤   ¤   ¤   ¤   ¤   ::SetResLoad(true);
3694aa ¤   ¤   ¤   ¤   ¤   ¤
75ac68 ¤   ¤   ¤   ¤   ¤   ¤   // Open the new file
ae54ca ¤   ¤   ¤   ¤   ¤   ¤   err = ::FSpOpenDF(¤ &theFile,
5060fc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fsRdWrPerm,
4c9052 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &refNum);
85e4c8 ¤   ¤   ¤   ¤   ¤   ¤   if (err == noErr) {
bef174 ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32¤ ¤   total = ::GetResourceSizeOnDisk(
b290df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theAdminResource);
864619 ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32¤ ¤   offset = 0;
009bff ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32¤ ¤   blockSize = 1024;
f3f773 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Ptr¤¤   ¤   theData = ::NewPtr(blockSize);
2d531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
2b67de ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = MemError();
b2fc98 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (err == noErr) {
2ea615 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::SetEOF(¤  refNum,
da88aa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0);
61da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
03bd1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Copy the resource to the file
a878e4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   while (offset < total) {
e39d66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   blockSize = ((total - offset) > 1024) ?
e7341b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   1024 : (total - offset);
920321 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::ReadPartialResource(¤ theAdminResource,
d4c617 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   offset,
d47d63 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theData,
9d6deb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   blockSize);
8248e4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ResError();
3e3f75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (err == noErr) {
062b33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   offset += blockSize;
d88f3d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ::FSWrite(¤   refNum,
9a2a3a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &blockSize,
4b687d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theData);
778a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
192537 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if (err != noErr) {
8452b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
bf8a13 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
436560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
015268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
4ecd0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::DisposePtr(theData);
5bdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
ab0592 ¤   ¤   ¤   ¤   ¤   ¤   ::FSClose(refNum);
061c89 ¤   ¤   ¤   ¤   ¤   }
3eae30 ¤   ¤   ¤   ¤   ¤
6ccc75 ¤   ¤   ¤   ¤   ¤   // Delete the file if anything failed
ef76ec ¤   ¤   ¤   ¤   ¤   if (err != noErr) {
2c9f76 ¤   ¤   ¤   ¤   ¤   ¤   ::FSpDelete(&theFile);
ad1c89 ¤   ¤   ¤   ¤   ¤   }
822613 ¤   ¤   ¤   ¤   }
93f622 ¤   ¤   ¤   ¤   break;
342b85 ¤   ¤   ¤   ¤
8f2b85 ¤   ¤   ¤   ¤
6c8723 ¤   ¤   ¤   ¤   case msg_AddMarkerIfClient:
3572c3 ¤   ¤   ¤   ¤   {
a118a3 ¤   ¤   ¤   ¤   ¤   if (ResourceExists(kAdminType, ADMN_AdminPrefs, true)) {
1e8e0f ¤   ¤   ¤   ¤   ¤   ¤   SInt16¤ ¤   refNum = -1;
a4fe53 ¤   ¤   ¤   ¤   ¤   ¤   FSSpec¤ ¤   theFile;
62da1d ¤   ¤   ¤   ¤   ¤   ¤   OSStatus¤   err;
8d108b ¤   ¤   ¤   ¤   ¤   ¤   Handle¤ ¤   theMarker = nil;
0a3366 ¤   ¤   ¤   ¤   ¤   ¤   CInfoPBRec¤ catInfo;
9294aa ¤   ¤   ¤   ¤   ¤   ¤
--e62c 001d4e5a477401201d6 Page 3 of InstallAdmin.cp
efc0c8 ¤   ¤   ¤   ¤   ¤   ¤   ::FSMakeFSSpec(¤eInfo->theFile.af_vRefNum,
43b3d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   eInfo->theFile.af_DirID,
3f2993 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   eInfo->theFile.af_Name,
f81892 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theFile);
593073 ¤   ¤   ¤   ¤   ¤   ¤   ::SetResLoad(false);
4728ad ¤   ¤   ¤   ¤   ¤   ¤   refNum = ::FSpOpenResFile(&theFile, fsWrPerm);
337c75 ¤   ¤   ¤   ¤   ¤   ¤   ::SetResLoad(true);
85255e ¤   ¤   ¤   ¤   ¤   ¤   err = ::ResError();
e8e4c8 ¤   ¤   ¤   ¤   ¤   ¤   if (err == noErr) {
2b04c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theMarker = ::NewHandle(0);
6bf30b ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ::MemError();
8adb3c ¤   ¤   ¤   ¤   ¤   ¤   }
446cae ¤   ¤   ¤   ¤   ¤   if (err == noErr) {
896523 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::AddResource(¤ theMarker,
9ad6b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kAdminConfiguredType,
39fb87 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPa_Configured,
a2e365 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   "\p");
b6d608 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theMarker = nil;
7f3d0e ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ::ResError();
c2db3c ¤   ¤   ¤   ¤   ¤   ¤   }
33e4c8 ¤   ¤   ¤   ¤   ¤   ¤   if (err == noErr) {
78b7ac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::UpdateResFile(refNum);
583d0e ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ::ResError();
eddb3c ¤   ¤   ¤   ¤   ¤   ¤   }
0146bc ¤   ¤   ¤   ¤   ¤   ¤   if (theMarker != nil) {
027b86 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::DisposeHandle(theMarker);
42db3c ¤   ¤   ¤   ¤   ¤   ¤   }
0f3778 ¤   ¤   ¤   ¤   ¤   ¤   if (refNum != -1) {
541ae1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::CloseResFile(refNum);
10db3c ¤   ¤   ¤   ¤   ¤   ¤   }
98e4c8 ¤   ¤   ¤   ¤   ¤   ¤   if (err == noErr) {
6fd93b ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = FSpGetCatInfo(&theFile, &catInfo);
d1db3c ¤   ¤   ¤   ¤   ¤   ¤   }
91e4c8 ¤   ¤   ¤   ¤   ¤   ¤   if (err == noErr) {
c0b4dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   cpbModificationDate(&catInfo) =·
b3480a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   cpbCreationDate(&catInfo);
3e9983 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FSpSetCatInfo(&theFile, &catInfo);
fbdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
e91c89 ¤   ¤   ¤   ¤   ¤   }
442613 ¤   ¤   ¤   ¤   }
d9f622 ¤   ¤   ¤   ¤   break;
54a3a6 ¤   ¤   ¤   }
d90fe4 ¤   ¤   }
b52f68 ¤   ¤   break;
4a9371 ¤   }
d4efe6 }
--64f4 00132771f27401201d7 Page 1 of InstallAdmin.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
49322e ¤   $Id: InstallAdmin.prefix,v 1.1.8.1 1998/11/12 03:10:59 heller Exp $
94f7f7 ____________________________________________________________________________*/
c4af5a
553109 #include <ansi_prefix.mac.h>
b7af5a
28b18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
50af5a
7ee6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
3a6068 #define UNFINISHED_CODE_ALLOWED¤¤   0
c7af5a
8c049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
90af5a
c60db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
e6af5a
c0a662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
3ba6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
165cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
efaf5a
320438 #include "MacBasics.h"
--1b79 0016868a481401201d8 Page 1 of Make-template
54b0af #-----------------------------------------------------------------------------
0cdb1c # Copyright (c) 1994 Regents of the University of Michigan.
155a50 # All rights reserved.
1aa601 #
fb97d6 # Redistribution and use in source and binary forms are permitted
69d6ca # provided that this notice is preserved and that due credit is given
4e8ee9 # to the University of Michigan at Ann Arbor. The name of the University
0e3eb9 # may not be used to endorse or promote products derived from this
440baf # software without specific prior written permission. This software
d8feea # is provided ``as is'' without express or implied warranty.
49a601 #
2cd5e6 # ······LDAP libraries/macintosh Makefile
aca601 #
a9b0af #-----------------------------------------------------------------------------
38af5a
d168a2 ############################################################################
1d9b5c # ·········································································#
697fa4 # You should not have to edit anything below this point ···················#
3c9b5c # ·········································································#
a368a2 ############################################################################
1aaf5a
dda601 #
600942 # rules to make the software
25a601 #
34af5a
d73d8c all:¤   FORCE
cdaf5a
39a601 #
3ab0fb # rules to install the software
1fa601 #
4faf5a
d5423c install:¤   all
f8af5a
b1a601 #
93f215 # rules to make clean
faa601 #
48af5a
1cb5ca clean:¤ FORCE
35af5a
ad875c veryclean:¤ clean
5aaf5a
7ca601 #
761552 # rules to make depend
6ca601 #
c7a601 #
43adf8 depend:¤FORCE
48af5a
68a513 links:
--e33b 00039d96538401201d9 Page 1 of Makefile
2539de # --------------------------------------------------------
324229 # ·This file was automatically generated. ·Do not edit it.
c0e6af # ·Instead, edit the Make-common file (located in the root
eef11f # ·(of the LDAP distribution). ·See the LDAP INSTALL file
a05811 # ·for more information.
ee39de # --------------------------------------------------------
05a601 #
2db0af #-----------------------------------------------------------------------------
06db1c # Copyright (c) 1994 Regents of the University of Michigan.
d95a50 # All rights reserved.
aea601 #
8c97d6 # Redistribution and use in source and binary forms are permitted
c6d6ca # provided that this notice is preserved and that due credit is given
378ee9 # to the University of Michigan at Ann Arbor. The name of the University
a83eb9 # may not be used to endorse or promote products derived from this
b10baf # software without specific prior written permission. This software
8dfeea # is provided ``as is'' without express or implied warranty.
95a601 #
62d5e6 # ······LDAP libraries/macintosh Makefile
2fa601 #
c1b0af #-----------------------------------------------------------------------------
66af5a
6168a2 ############################################################################
2d9b5c # ·········································································#
a97fa4 # You should not have to edit anything below this point ···················#
b79b5c # ·········································································#
2168a2 ############################################################################
56af5a
31a601 #
a90942 # rules to make the software
14a601 #
95af5a
5e3d8c all:¤   FORCE
4eaf5a
dba601 #
e5b0fb # rules to install the software
8ca601 #
d1af5a
e2423c install:¤   all
fcaf5a
a8a601 #
e6f215 # rules to make clean
0ca601 #
00af5a
06b5ca clean:¤ FORCE
5faf5a
dc875c veryclean:¤ clean
1aaf5a
fda601 #
471552 # rules to make depend
7da601 #
dea601 #
56adf8 depend:¤FORCE
54af5a
d5a513 links:
baa601 #
d0ffdb # Do NOT edit this file -- it is automatically appended to all Makefiles
8b69dc # except the LDAP top-level Makefile. See the LDAP INSTALL file for more
c21fc7 # information.
eca601 #
4ab0af #-----------------------------------------------------------------------------
ecdb1c # Copyright (c) 1994 Regents of the University of Michigan.
615a50 # All rights reserved.
43a601 #
fa97d6 # Redistribution and use in source and binary forms are permitted
4cd6ca # provided that this notice is preserved and that due credit is given
4e8ee9 # to the University of Michigan at Ann Arbor. The name of the University
a93eb9 # may not be used to endorse or promote products derived from this
fc0baf # software without specific prior written permission. This software
39feea # is provided ``as is'' without express or implied warranty.
79a601 #
393287 # ······LDAP standard Make defines (appended to all but top-level Makefile)
--f4f3 0002806e004401201d9 Page 2 of Makefile
5ea601 #
eeb0af #-----------------------------------------------------------------------------
0aaf5a
40ad9f # DEFS are included in CFLAGS
4fd084 DEFS¤   = $(PLATFORMCFLAGS) $(LDAP_DEBUG) $(KERBEROS) $(AFSKERBEROS) \
ad0785 ¤   ¤   $(UOFM) $(UOFA) $(NO_USERINTERFACE) $(CLDAP) $(NO_CACHE) \
c6f00e ¤   ¤   $(LDAP_REFERRALS) $(LDAP_DNS) $(STR_TRANSLATION) \
71997b ¤   ¤   $(LIBLDAP_CHARSETS) $(LIBLDAP_DEF_CHARSET) \
b687f1 ¤   ¤   $(SLAPD_BACKENDS) $(LDBMBACKEND) $(LDBMINCLUDE) $(PHONETIC)
d9af5a
0240cd # SERVERDEFS are added to server builds CFLAGS (in addition to DEFS)
eab18b SERVERDEFS¤ = $(ISODEPACKAGE) $(ICRELEASE) $(LDAP_USE_PP) \
db14ba ¤   ¤   ¤   $(NO_SETPROCTITLE) $(PEPSY_DUMP)
d8af5a
a2a601 #
0c0ce2 # ISODELIBS are used in server/ldapd builds
96a601 #
cc4e01 ISODELIBS¤  = $(ISODEBASELIBS) -lm $(ISODETURBOLIBS)
4baf5a
f20558 # ACFLAGS are added to CFLAGS but not passed to mkdep, lint, etc
2717ce ACFLAGS¤¤   = $(EXTRACFLAGS) $(UNPROTOCFLAGS)
65af5a
8d2eb4 # ALDFLAGS are always placed near the beginning of all linker (cc -o) commands
6249dd ALDFLAGS¤   = $(EXTRALDFLAGS) $(PLATFORMLDFLAGS)
e2af5a
12233d # ALIBS are always placed at the end of all linker (cc -o) commands
871ec7 ALIBS¤  ¤   = $(PLATFORMLIBS) $(THREADSLIB) -lstdc++
34af5a
32a601 #
5bc229 # default definitions for Unix utilities (may be over-ridden in Make-platform)
e7fd75 CC¤ = cc
5b7e42 MAKE¤   = make
8e1a1a RANLIB¤ = ranlib
2585b9 AR¤ = ar
79ba00 RM¤ = rm -f
409865 MV¤ = mv -f
db9324 CP¤ = cp
80229f CHMOD¤  = chmod
0a65eb CAT¤= cat
62d1bd LN¤ = ln -s
c541b6 HARDLN¤ = ln
60c699 TAIL¤   = tail
04e675 SED¤= sed
fa01f7 LINT¤   = lint
ca3a04 5LINT¤  = lint
5dc291 MKDIR¤  = mkdir
d23f60 INSTALL¤= install
390106 INSTALLFLAGS = -c
7d735e BASENAME= basename
38d84e DIRNAME¤= dirname
b3720b MKDEP¤  = $(LDAPSRC)/build/mkdep -c gcc -s -f Make-template
54e392 PWD¤= pwd
7496d7 DATE¤   = date
36a7d0 HOSTNAME= hostname
5caf5a
76af5a
2ba601 #
6f592a # empty target used to force rules to be invoked
98a601 #
a72b40 FORCE:
aeaf5a
f9a601 #
19c8ac # LDAP SunOS5 GNU C Make-platform file
92a601 #
cfaf5a
61a601 #
eaa68c # add any platform-specific overrides below here
d2a601 #
b3af5a
4baf5a
f0a601 #
2895cf # -------------------------------------------------------------------------
--c3a5 000c037653e401201d9 Page 3 of Makefile
e7ba80 # you will probably not need to edit anything below this point
8295cf # -------------------------------------------------------------------------
5b4b2c CC¤ = gcc
aaaf5a
d11dfe # ranlib not needed under SunOS5
037716 RANLIB¤ = ""
25af5a
a29a13 # give full path to hostname since it may not be in user's path
61ea97 HOSTNAME=/usr/ucb/hostname
e2af5a
467720 # don't count on /usr/ucb/install being present or first in path
5710f3 INSTALL=$(LDAPSRC)/build/install.sh
97af5a
e5eaf0 PLATFORMCFLAGS=¤-Dsunos5 -D_REENTRANT
268289 PLATFORMLIBS= -lsocket -lnsl -lgen
0a1dc2 THREADS= -DTHREAD_SUNOS5_LWP
2b7e25 THREADSLIB=-lthread
cbb0af #-----------------------------------------------------------------------------
d035f2 # Copyright (c) 1997 PGP inc.
265a50 # All rights reserved.
59a601 #
aeb0af #-----------------------------------------------------------------------------
e4dd01 #############################################################################
aea917 ## Edit the following variables to have appropriate values for your system ##
62dd01 #############################################################################
14af5a
d0515b vpath %.a $(OUTDIR):$(LDIR):$(PGPCDKDIR)/unix:$(DBLDIR):$(PGPPFLDIR) \
8adc18 ¤   ··$(PGPCDKDIR)/priv/keyserver: \
90aacf ¤   ··$(PGPCDKDIR)/../network/pgpsockets/unix/src
96af5a
a2dd01 #############################################################################
0b736d ## LDAP install paths ·····················································##
e2dd01 #############################################################################
85a601 #
4cc05e # by default, everything is installed below INSTROOT
164f10 # servers, config files, etc. are put in ETCDIR
e854a5 # include files get put in INCLUDEDIR
0a48e9 # libraries are put in LIBDIR
88f935 # man pages are put under MANDIR
10d9d9 # programs end-users will run are put in BINDIR
7ea601 #
04b837 # Moved INSTROOT declaration to top-level Makefile
f337ce # useful for automation.
e8af5a
408fed ETCDIR= $(INSTROOT)/etc
134bf1 INCLUDEDIR= $(INSTROOT)/include
584e47 LIBDIR= $(INSTROOT)/unix
75e906 MANDIR= $(INSTROOT)/doc
db2d8f BINDIR= $(INSTROOT)/unix
28af5a
8ca601 #
efca77 # if you want things to run in a different directory from where they
f82c1a # are installed, set this accordingly (this path gets compiled into a
b38e97 # few binaries). otherwise, leave it alone.
de63ae RUNTIMEETCDIR= $(ETCDIR)
7daf5a
98dd01 #############################################################################
8f7145 ## General compiler options ···············································##
d5dd01 #############################################################################
0064cf # Passed to every compile (cc or gcc). ·This is where you put -O or -g, etc.
d4c073 # Added -D_REENTRANT per ldap doc. for Solaris builds <galileo>
e87adf OPT=-g
60255c DEBUG=1
03ab6e UNFINISHED=1
a1ed5a EXTRACFLAGS=-D_REENTRANT $(OPT) -fwritable-strings \
fd1d76 ············-DPGP_DEBUG=$(DEBUG) -DUNFINISHED_CODE_ALLOWED=$(UNFINISHED)
76af5a
cde6cd # Passed to every link (ld). ·Include -g here if you did in EXTRACFLAGS.
adaf5a
17b23e EXTRALDFLAGS=$(OPT)
d7af5a
c0dd01 #############################################################################
--dd39 0018ee599db401201d9 Page 4 of Makefile
0ace69 ## ISODE is required ONLY to build the ldap <-> X.500 server (ldapd) ······##
19b9e8 ## If you don't want to build it, you can skip this section. ··············##
d4dd01 #############################################################################
92a601 #
6811c2 # To build the ldap server, uncomment the HAVEISODE line,
825803 # and the section describing build settings for your version of isode.
0ba601 #
18a865 HAVEISODE = yes
61af5a
e2dd01 #############################################################################
33c146 ## If you don't want to run slapd, skip this section. ·····················##
46dd01 #############################################################################
fda601 #
44ac20 # To build slapd (the stand-alone ldap daemon), uncomment the MAKESLAPD
c98e0c # line and select the SLAPD_BACKENDS you want to use. If you enable the
832d3b # LDBM backend, also select one of the LDBM backends.
7e8fbf MAKESLAPD= yes
4da601 #
c74d71 # remove the defines for backends you don't want to enable
c3743e SLAPD_BACKENDS= -DLDAP_LDBM
65a601 #
549374 # If you have included -DLDAP_LDBM in the SLAPD_BACKENDS line you need
0acee2 # to specify which low-level database package to use. ·There are
2df92f # four choices: Berkeley db b-tree, Berkeley db hash, GNU dbm, or ndbm.
62a601 #
b0a9bd # berkeley db btree package
7b7e82 LDBMBACKEND=-DLDBM_USE_DBBTREE21
42b496 LDBMINCLUDE=
5328ff LDBMLIB=-ldb
f5b402 # berkeley db hash package
de9bc9 #LDBMBACKEND=-DLDBM_USE_DBHASH
fdd345 #LDBMINCLUDE=-I/usr/local/db/include
bc0e7e #LDBMLIB=-ldb
c52a77 # gnu dbm (gdbm)
7ded29 #LDBMBACKEND=-DLDBM_USE_GDBM
5f9187 #LDBMINCLUDE=-I$(INSTROOT)/servers/slapd/db
206c04 #LDBMLIB=-lgdbm
f01874 # standard unix ndbm
03bc4d #LDBMBACKEND=-DLDBM_USE_NDBM
d7a601 #
067ffd # if you want to use a non-default threads package change these lines
9742ab #THREADS=-DNO_THREADS
358180 #THREADSLIB=
1daf5a
5edd01 #############################################################################
a91692 ## General options ························································##
4fdd01 #############################################################################
9fc8ae # uncomment this line to enable debugging code (a good idea)
6b75d8 LDAP_DEBUG=-DLDAP_DEBUG
68af5a
99b923 # uncomment this line to turn on a few U of Michigan specific things
198cea #UOFM=-DUOFM
dbaf5a
81bce0 # uncomment this line to delete a few printfs in the lber and ldap libraries.
77d6e3 #NO_USERINTERFACE=-DNO_USERINTERFACE
f5af5a
802982 # uncomment this line to include Connectionless LDAP support
161910 #CLDAP=-DCLDAP
94af5a
cf021f # uncomment this line to eliminate local caching support in the libldap
43decc #NO_CACHE=-DNO_CACHE
f5af5a
78197d # uncomment this line to enable support for LDAP referrals in libldap
421c28 LDAP_REFERRALS=-DLDAP_REFERRALS
a4af5a
284c1c # uncomment this line to use soundex for approximate matches in slapd.
32856d # the default is to use the metaphone algorithm.
8e1fa8 #PHONETIC=-DSOUNDEX
--42e4 001275bf7ae401201da Page 1 of README
af1cb3 LDAP Macintosh README
bfaf5a
5d70a8 The lber and ldap client libraries have been ported to Macintosh.
feafdb Build testing was originally done with Think C 5.0.4 and MPW 3.2, both
93c8a7 running under System 7.1. ·Recently, it has been built using Metrowerks
b3ae6d CodeWarrior 8.0 and Symantec C++ 7.0.3. ·The libaries have been tested
72a992 under System 7.0, 7.1, and 7.5, and are believed to run under any
a31d98 System later than 6.0. ·None of the LDAP clients included in the
efb8d3 distribution have been tested on the Mac.
29af5a
92143f MAKING THE DISTRIBUTION
0338cd The instructions included here are for Symantec C 7.0.4, but the steps
60fb8a are very similar for the other environments.
2aaf5a
1b4034 To build the ldap and lber libraries (easiest to do as one project):
99af5a
47d621 ¤   1) create a new project that contains the following files:
0900e3 ¤   ¤   libraries/liblber/decode.c
39ea72 ¤   ¤   libraries/liblber/encode.c
f67f24 ¤   ¤   libraries/liblber/io.c
46f480 ¤   ¤   libraries/macintosh/tcp/dnr.c
0df332 ¤   ¤   libraries/macintosh/tcp/tcp.c
a21835 ¤   ¤   libraries/macintosh/macos-ip.c
4fd676 ¤   ¤   libraries/macintosh/strings.c
8592c8 ¤   ··plus all the .c files in libraries/libldap/, except test.c,
49e688 ··········tmpltest.c, and os-ip.c.
01af5a
4674d8 ¤   2) put all of the .h files in include/, libraries/macintosh/,·
797c20 ¤   ···libraries/libldap and libraries/macintosh/tcp somewhere
02117e ¤   ···in the same folder where the project is located.
f7af5a
5688df ¤   3) Add the MacTraps, MacTraps2, Unix, and ANSI-small libraries
3bbf9c ¤   ···(included with Symantec/ThinkC) to the project.
34af5a
98ad08 ¤   3) Bring up the Edit menu "Options..." dialog and set the following:
dc54be ¤   ·····Language Settings:
992fd4 ¤   ¤   Strict Prototype Enforcement/Require Prototypes
37d908 ¤   ·····Prefix:
bffe2a ¤   ¤   #define MACOS
34670b ¤   ¤   #define NEEDPROTOS
5b39f9 ¤   ¤   #define NEEDGETOPT
64820a ¤   ¤   #define NO_USERINTERFACE
b9622a ¤   ¤   #define FILTERFILE¤ "ldapfilter.conf"
005fc4 ¤   ¤   #define TEMPLATEFILE¤   "ldaptemplates.conf"
37af5a
601294 ¤   ·····If you want to build a version of the library that does
bbf7d9 ¤   ·····not have any global variables (such as for inclusion in a
640a1b ¤   ·····driver or other code module), add a "#define NO_GLOBALS"
722068 ¤   ·····to the Prefix. ·The only catch is that the tcp/dnr.c
eb385e ¤   ·····file needs changes to remove the global variables.
14af5a
0c85d0 ¤   ·····If you want support for referrals (optionally enabled
199dd3 ·············for each LDAP connection), add '#define LDAP_REFERRALS'
3d6f09 ¤   ·····to the prefix list. ·This is recommended.
feaf5a
7478d5 ¤   4) Compile the project (Bring Up To Date under the Project menu)
b7af5a
5cf96c ¤   5) If you would like to use the libldap/test.c program to test the
c7926c ¤   ···library in an ugly console window, you will need to add the
8fb6e5 ¤   ···test.c file itself and the full ANSI library (instead of
e4514c ¤   ···ANSI-small) to the project, and don't define NO_USERINTERFACE.
02af5a
c241fe BUG REPORTING
f5af5a
6bbe9a ····Bug reports should be sent to bug-ldap@terminator.cc.umich.edu.
d2af5a
27199f README Last updated 11 April 1996 by Mark Smith
--53bc 00023293ecf801201db Page 1 of getopt.c
bc38e5 /*
ff3548 ·* Copyright (c) 1987 Regents of the University of California.
fb599a ·* All rights reserved.
94775e ·*
8fb855 ·* Redistribution and use in source and binary forms are permitted
012102 ·* provided that: (1) source distributions retain this entire copyright
6395b3 ·* notice and comment, and (2) distributions including binaries display
206af6 ·* the following acknowledgement: ·``This product includes software
ec6538 ·* developed by the University of California, Berkeley and its contributors''
4e9fea ·* in the documentation or other materials provided with the distribution
0c9e0c ·* and in all advertising materials mentioning features or use of this
6cc79b ·* software. Neither the name of the University nor the names of its
a9a0e8 ·* contributors may be used to endorse or promote products derived
5f7889 ·* from this software without specific prior written permission.
0922a1 ·* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
f7cecc ·* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
f739a3 ·* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
46495d ·*/
a0af5a
de580e #if defined(LIBC_SCCS) && !defined(lint)
025740 static char sccsid[] = "@(#)getopt.c ···4.12 (Berkeley) 6/1/90";
314f88 #endif /* LIBC_SCCS and not lint */
50af5a
b8feb2 #include <stdio.h>
3d324c #include <string.h>
e4b779 #include "lber.h"
2f9b9c #define index strchr
a1f805 #define rindex strrchr
79af5a
8838e5 /*
68d3e2 ·* get option letter from argument vector
a5495d ·*/
5ef38c int ····opterr = 1, ············/* if error message should be printed */
98ae55 ¤       optind = 1, ············/* index into parent argv vector */
c328c4 ¤       optopt; ················/* character checked for validity */
fb8815 char ···*optarg; ···············/* argument associated with option */
12af5a
406dd9 #define BADCH ··(int)'?'
5d845f #define EMSG ···""
8eaf5a
ca1080 getopt(int nargc, char **nargv, char *ostr)
9abb36 {
4613f8 ¤       static char *place = EMSG; ·············/* option letter processing */
d4cce5 ¤       register char *oli; ····················/* option letter list index */
18e4bd ¤       char *p;
45af5a
6b3302 ¤       if (!*place) { ·························/* update scanning pointer */
afd086 ¤       ¤       if (optind >= nargc || *(place = nargv[optind]) != '-') {
5a65fe ¤       ¤       ¤       place = EMSG;
e49f49 ¤       ¤       ¤       return(EOF);
31467a ¤       ¤       }
14bd55 ¤       ¤       if (place[1] && *++place == '-') { ·····/* found "--" */
efdf01 ¤       ¤       ¤       ++optind;
3865fe ¤       ¤       ¤       place = EMSG;
2a9f49 ¤       ¤       ¤       return(EOF);
ee467a ¤       ¤       }
ea6977 ¤       } ······································/* option letter okay? */
ca6e22 ¤       if ((optopt = (int)*place++) == (int)':' ||
550885 ¤       ····!(oli = index(ostr, optopt))) {
b266a9 ¤       ¤       /*
9d0c3a ¤       ¤       ·* if the user didn't specify '-' as an option,
db9ae6 ¤       ¤       ·* assume it means EOF.
1cc16b ¤       ¤       ·*/
6eb82b ¤       ¤       if (optopt == (int)'-')
9c9f49 ¤       ¤       ¤       return(EOF);
ac1462 ¤       ¤       if (!*place)
83df01 ¤       ¤       ¤       ++optind;
8090b2 ¤       ¤       if (opterr) {
ab60d4 ¤       ¤       ¤       if (!(p = rindex(*nargv, '/')))
c8c9f9 ¤       ¤       ¤       ¤       p = *nargv;
b1bfc3 ¤       ¤       ¤       else
234c5e ¤       ¤       ¤       ¤       ++p;
--d2f9 001ee8af35c801201db Page 2 of getopt.c
38eb93 ¤       ¤       ¤       (void)fprintf(stderr, "%s: illegal option -- %c\n",
b4c329 ¤       ¤       ¤       ····p, optopt);
a5467a ¤       ¤       }
41396b ¤       ¤       return(BADCH);
6b1aea ¤       }
454cf3 ¤       if (*++oli != ':') { ···················/* don't need argument */
c831d1 ¤       ¤       optarg = NULL;
311462 ¤       ¤       if (!*place)
35df01 ¤       ¤       ¤       ++optind;
db1aea ¤       }
cad358 ¤       else { ·································/* need an argument */
fcee0e ¤       ¤       if (*place) ····················/* no white space */
11aa49 ¤       ¤       ¤       optarg = place;
3de06a ¤       ¤       else if (nargc <= ++optind) { ··/* no arg */
1165fe ¤       ¤       ¤       place = EMSG;
0660d4 ¤       ¤       ¤       if (!(p = rindex(*nargv, '/')))
35c9f9 ¤       ¤       ¤       ¤       p = *nargv;
31bfc3 ¤       ¤       ¤       else
6f4c5e ¤       ¤       ¤       ¤       ++p;
a41829 ¤       ¤       ¤       if (opterr)
9ead7a ¤       ¤       ¤       ¤       (void)fprintf(stderr,
aeda0d ¤       ¤       ¤       ¤       ····"%s: option requires an argument -- %c\n",
7675c3 ¤       ¤       ¤       ¤       ····p, optopt);
a36ce5 ¤       ¤       ¤       return(BADCH);
1e467a ¤       ¤       }
680872 ¤       ¤       else ···························/* white space */
bb5215 ¤       ¤       ¤       optarg = nargv[optind];
5456d9 ¤       ¤       place = EMSG;
4b1a01 ¤       ¤       ++optind;
1e1aea ¤       }
2c4c39 ¤       return(optopt); ························/* dump back option letter */
eeefe6 }
--32b8 0009125b642401201dc Page 1 of kerberos-macos.c
bc38e5 /*
e83103 ·* ·Copyright (c) 1992, 1994 Regents of the University of Michigan.
b6e4d4 ·* ·All rights reserved.
6d775e ·*
ba2e77 ·* ·kerberos-macos.c
11495d ·*/
9aaf5a
ad0c68 #ifndef lint·
602847 static char copyright[] = "@(#) Copyright (c) 1994 Regents of the University of¶
c94e1c ·Michigan.\nAll rights reserved.\n";
cc7454 #endif
6aaf5a
05b779 #include "lber.h"
1fe990 #include "ldap.h"
43af5a
bb5ffa #ifdef KERBEROS
fbaf5a
f2feb2 #include <stdio.h>
4d324c #include <string.h>
efbea3 #include <stdlib.h>
cffc7e #ifdef THINK_C
0bd924 #include <pascal.h>
a1b2b1 #else /* THINK_C */
b11549 #include <Strings.h>
8649cc #endif /* THINK_C */
66897a #ifdef AUTHMAN
dc3a79 #include <MixedMode.h>
abb2bf #include <Errors.h>
385f6e #include "authLibrary.h"
b0745c #include "ldap-int.h"
d0af5a
7d38e5 /*
f5b968 ·* get_kerberosv4_credentials - obtain kerberos v4 credentials for ldap.
4c495d ·*/
88af5a
900873 /* ARGSUSED */
dd11e4 char *
68ff9a get_kerberosv4_credentials( LDAP *ld, char *who, char *service, int *len )
05bb36 {
8a5808 ¤   static short¤   authman_refnum = 0;
6e2de4 ¤   char¤   ¤   *cred, ticket[ MAX_KTXT_LEN ];
1b498d ¤   short¤  ¤   version, ticketlen, err;
ca7f16 ¤   Str255¤ ¤   svcps, instps;
be67c5 ¤
5cd8af ¤   /*
1ad3bb ¤   ·* make sure RJC's Authentication Manager 2.0 or better is available
fba4e3 ¤   ·*/
41a65e ¤   if ( authman_refnum == 0 && (( err = openAuthMan( &authman_refnum, &version¶
0bef7e ·)) != noErr || version < 2 )) {
284e54 ¤   ¤   authman_refnum = 0;
ee6669 ¤   ¤   ld->ld_errno = LDAP_AUTH_UNKNOWN;
3eef86 ¤   ¤   return( NULL );
9b9371 ¤   }
6f67c5 ¤
65b7f3 ¤   strcpy( (char *)svcps, service );
963dde ¤   CtoPstr( (char *)svcps );
027f8d #ifdef LDAP_REFERRALS
9c82f7 ¤   strcpy( (char *)instps, ld->ld_defconn->lconn_krbinstance );
4b4267 #else /* LDAP_REFERRALS */
39cf73 ¤   strcpy( (char *)instps, ld->ld_host );
7090e2 #endif /* LDAP_REFERRALS */
95af5a
bec516 ¤   CtoPstr( (char *)instps );
7dbfd2 ¤   if (( err = getV4Ticket( authman_refnum, &ticket, &ticketlen, &svcps, &inst¶
481030 ps,
9095b5 ¤   ¤   ¤   NULL, INFINITE_LIFETIME, 1 )) != noErr ) {
c1b287 ¤   ¤   ld->ld_errno = ( err == userCanceledErr ) ?
86f7c3 ¤   ¤   ¤   LDAP_USER_CANCELLED : LDAP_INVALID_CREDENTIALS;
beef86 ¤   ¤   return( NULL );
299371 ¤   }
72af5a
91c0ce ¤   if (( cred = malloc( ticketlen )) == NULL ) {
--79c3 0017b06d5a6401201dc Page 2 of kerberos-macos.c
3b6f1c ¤   ¤   ld->ld_errno = LDAP_NO_MEMORY;
ffef86 ¤   ¤   return( NULL );
429371 ¤   }
00af5a
9b735e ¤   *len = ticketlen;
ed439a ¤   memcpy( cred, (char *)ticket, ticketlen );
07a766 ¤   return( cred );
55efe6 }
ceaf5a
4c7454 #endif
7b7454 #endif
--12f1 00018475807401201dd Page 1 of macos-ip.c
bc38e5 /*
5ce36d ·* ·Copyright (c) 1995 Regents of the University of Michigan.
a8e4d4 ·* ·All rights reserved.
42775e ·*
587cca ·* ·macos-ip.c -- Macintosh platform-specific TCP & UDP related code
36495d ·*/
b1af5a
1a0c68 #ifndef lint·
f95f25 static char copyright[] = "@(#) Copyright (c) 1995 Regents of the University of¶
fd4e1c ·Michigan.\nAll rights reserved.\n";
a87454 #endif
63af5a
2cb1cb #include <ctype.h>
6cfeb2 #include <stdio.h>
e0324c #include <string.h>
b7bea3 #include <stdlib.h>
f36b82 #include <Memory.h>
9865e0 #include "macos.h"
23b779 #include "lber.h"
74e990 #include "ldap.h"
9d745c #include "ldap-int.h"
c3af5a
f52a9a #include "portable.h"
3eb779 #include "lber.h"
6fe990 #include "ldap.h"
8eaf5a
d56eb6 #include "PGPSockets.h"
53af5a
e4af5a
2ec583 #ifdef MACOS
3416ed PGPSocketRef *¤ gCallbackDataSocket = NULL;
917454 #endif
ddaf5a
077f8d #ifdef LDAP_REFERRALS
64f375 #ifdef USE_SYSCONF
cd17c2 #include <unistd.h>
157d11 #endif /* USE_SYSCONF */
acb7e5 #ifdef notyet
6fecad #ifdef NEED_FILIO
29389f #include <sys/filio.h>
d3a180 #else /* NEED_FILIO */
1ac051 #include <sys/ioctl.h>
244687 #endif /* NEED_FILIO */
c3db56 #endif /* notyet */
4f90e2 #endif /* LDAP_REFERRALS */
8baf5a
acc583 #ifdef MACOS
cc93c8 #define tcp_close( s )¤ ¤   PGPCloseSocket( s )
b36c94 #else /* MACOS */
1a01b0 #ifdef DOS
aab3f5 #ifdef PCNFS
9afc34 #define tcp_close( s )¤ ¤   close( s )
941b77 #endif /* PCNFS */
1a6382 #ifdef NCSA
46d13d #define tcp_close( s )¤ ¤   netclose( s ); netshut()
788682 #endif /* NCSA */
acb3e6 #if defined(WINSOCK) || defined(WIN32)¤ ¤   /* marcd */
09cbc9 #define tcp_close( s )¤ ¤   closesocket( s ); WSACleanup();
0fd50d #endif /* WINSOCK */
70aad8 #else /* DOS */
9cfc34 #define tcp_close( s )¤ ¤   close( s )
4cbc39 #endif /* DOS */
44e962 #endif /* MACOS */
32af5a
7eaf5a
a795d7 /*·
47e131 ·* Check whether "cp" is a valid ascii representation
f2c2ad ·* of an Internet address and convert to a binary address.
fba0a3 ·* Returns 1 if the address is valid, 0 if not.
cc6da6 ·* This replaces inet_addr, the return value from which
e05a0e ·* cannot distinguish between failure and a local broadcast address.
18495d ·*/
--fe9c 000260ab111401201dd Page 2 of macos-ip.c
e0af5a
c3d63c static inet_aton(cp, addr)
63d4a8 ¤   register char *cp;
f9fe88 ¤   ulong *addr;
77bb36 {
8cbb50 ¤   register ulong val, base, n;
2700cd ¤   register char c;
53da75 ¤   ulong parts[4], *pp = parts;
37af5a
ff220e ¤   for (;;) {
151b17 ¤   ¤   /*
40125e ¤   ¤   ·* Collect number up to ``.''.
b657a6 ¤   ¤   ·* Values are specified as for C:
abc0ae ¤   ¤   ·* 0x=hex, 0=octal, other=decimal.
cc9de3 ¤   ¤   ·*/
28009d ¤   ¤   val = 0; base = 10;
c0f904 ¤   ¤   if (*cp == '0') {
f76853 ¤   ¤   ¤   if (*++cp == 'x' || *cp == 'X')
3f0c32 ¤   ¤   ¤   ¤   base = 16, cp++;
f4bb8c ¤   ¤   ¤   else
e564da ¤   ¤   ¤   ¤   base = 8;
710fe4 ¤   ¤   }
4d6591 ¤   ¤   while ((c = *cp) != '\0') {
489f31 ¤   ¤   ¤   if (isascii(c) && isdigit(c)) {
bff606 ¤   ¤   ¤   ¤   val = (val * base) + (c - '0');
26894c ¤   ¤   ¤   ¤   cp++;
2ad040 ¤   ¤   ¤   ¤   continue;
2ea3a6 ¤   ¤   ¤   }
692dd5 ¤   ¤   ¤   if (base == 16 && isascii(c) && isxdigit(c)) {
39648c ¤   ¤   ¤   ¤   val = (val << 4) +·
e4d1ba ¤   ¤   ¤   ¤   ¤   (c + 10 - (islower(c) ? 'a' : 'A'));
63894c ¤   ¤   ¤   ¤   cp++;
66d040 ¤   ¤   ¤   ¤   continue;
8da3a6 ¤   ¤   ¤   }
5acdcb ¤   ¤   ¤   break;
c90fe4 ¤   ¤   }
4b8216 ¤   ¤   if (*cp == '.') {
ef7aad ¤   ¤   ¤   /*
05a9b2 ¤   ¤   ¤   ·* Internet format:
036257 ¤   ¤   ¤   ·*¤ a.b.c.d
5a3c9b ¤   ¤   ¤   ·*¤ a.b.c¤  (with c treated as 16-bits)
3360db ¤   ¤   ¤   ·*¤ a.b¤(with b treated as 24 bits)
708753 ¤   ¤   ¤   ·*/
b4f96f ¤   ¤   ¤   if (pp >= parts + 3 || val > 0xff)
527d98 ¤   ¤   ¤   ¤   return (0);
f0932e ¤   ¤   ¤   *pp++ = val, cp++;
7d4a5d ¤   ¤   } else
45cdcb ¤   ¤   ¤   break;
3d9371 ¤   }
6ed8af ¤   /*
621399 ¤   ·* Check for trailing characters.
8ba4e3 ¤   ·*/
f7a5cf ¤   if (*cp && (!isascii(*cp) || !isspace(*cp)))
2ef109 ¤   ¤   return (0);
45d8af ¤   /*
10ef46 ¤   ·* Concoct the address according to
625397 ¤   ·* the number of parts specified.
a8a4e3 ¤   ·*/
e9ec3a ¤   n = pp - parts + 1;
ab750e ¤   switch (n) {
e9af5a
ce2e24 ¤   case 1:¤¤   ¤   ¤   /* a -- 32 bits */
fd2f68 ¤   ¤   break;
60af5a
61c60b ¤   case 2:¤¤   ¤   ¤   /* a.b -- 8.24 bits */
ce09ab ¤   ¤   if (val > 0xffffff)
778bfd ¤   ¤   ¤   return (0);
534bca ¤   ¤   val |= parts[0] << 24;
932f68 ¤   ¤   break;
6faf5a
724989 ¤   case 3:¤¤   ¤   ¤   /* a.b.c -- 8.8.16 bits */
26d149 ¤   ¤   if (val > 0xffff)
--201e 000ba14ab6b401201dd Page 3 of macos-ip.c
b08bfd ¤   ¤   ¤   return (0);
0b3108 ¤   ¤   val |= (parts[0] << 24) | (parts[1] << 16);
652f68 ¤   ¤   break;
8aaf5a
567c0f ¤   case 4:¤¤   ¤   ¤   /* a.b.c.d -- 8.8.8.8 bits */
9d16a6 ¤   ¤   if (val > 0xff)
c78bfd ¤   ¤   ¤   return (0);
01a888 ¤   ¤   val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
552f68 ¤   ¤   break;
ea9371 ¤   }
082078 ¤   if (addr)
1ddd2a ¤   ¤   *addr = htonl(val);
f97ac1 ¤   return (1);
daefe6 }
e8af5a
a4e1df #define¤INADDR_NONE¤0xffffffff¤ ¤   /* -1 return */
92af5a
5238e5 /*
6b072f ·* Ascii internet address interpretation routine.
ccd83b ·* The value returned is in network order.
0f495d ·*/
b477fd static long
61815a inet_addr(cp)
3d7629 ¤   register const char *cp;
e5bb36 {
7b64c6 ¤   ulong val;
1aaf5a
7208ab ¤   if (inet_aton(cp, &val))
bf230f ¤   ¤   return (val);
faaf5a
f009a4 ¤   return (INADDR_NONE);
78efe6 }
44af5a
c3af5a
c14d2f int
a9fba8 connect_to_host( Sockbuf *sb, char *host, unsigned long address,
974161 ¤   int port, int async )
7d38e5 /*
245f6a ·* if host == NULL, connect using address
614add ·* "address" and "port" must be in network byte order
ed7f4f ·* zero is returned upon success, -1 if fatal error, -2 EINPROGRESS
805732 ·* async is only used ifdef LDAP_REFERRALS (non-0 means don't wait for connect)
a36d2c ·* XXX async is not used yet!
ce495d ·*/
32bb36 {
77a46b ¤   int¤¤   ¤   ¤   ¤   ¤   ¤   rc, i, connected, use_hp;
412de6 ¤   PGPSocketAddressInternet¤   sin;
7483f7 ¤   PGPHostEntry¤   ¤   ¤   ¤   *hp;
5e9371 ¤   PGPSocketRef¤   ¤   ¤   ¤   socketRef;
332225 ¤   PGPInt32¤   ¤   ¤   ¤   ¤   connectResult;
fa67c5 ¤
cdc47e ¤   (void) async;
2267c5 ¤
2bb7e5 #ifdef notyet
c87f8d #ifdef LDAP_REFERRALS
05fc6e ¤   int¤¤   ¤   status;¤/* for ioctl call */
6090e2 #endif /* LDAP_REFERRALS */
1ddb56 #endif /* notyet */
74af5a
2e0c85 ¤   Debug( LDAP_DEBUG_TRACE, "connect_to_host: %s:%d\n",
38dba6 ¤   ····( host == NULL ) ? "(by address)" : host, ntohs( port ), 0 );
1eaf5a
34a393 ¤   connected = use_hp = 0;
5daf5a
7d7f4a ¤   if ( host != NULL && ( address = inet_addr( host )) == -1 ) {
8fc723 ¤   ¤   if ( (hp = PGPGetHostByName( host )) == NULL ) {
b38e4f ¤   ¤   ¤   return( -1 );
890fe4 ¤   ¤   }
76467e ¤   ¤   use_hp = 1;
bb9371 ¤   }
0baf5a
baf83f ¤   rc = -1;
--ccfc 00054bbbac3401201dd Page 4 of macos-ip.c
027366 ¤   for ( i = 0; !use_hp || ( hp->h_addr_list[ i ] != 0 ); i++ )
56c7a1 ¤   {
01844f ¤   ¤   socketRef = PGPOpenSocket( kPGPAddressFamilyInternet, kPGPSocketTypeStr¶
cf28a6 eam, kPGPTCPProtocol );
67c8c6 ¤   ¤   if( socketRef == kPGPInvalidSocket )
735b34 ¤   ¤   {
888e4f ¤   ¤   ¤   return( -1 );
cb0fe4 ¤   ¤   }
fcb7e5 #ifdef notyet
cd7f8d #ifdef LDAP_REFERRALS
9e46f6 ¤   ¤   status = 1;
5d6a96 ¤   ¤   if ( async && ioctl( s, FIONBIO, (caddr_t)&status ) == -1 ) {
801c37 ¤   ¤   ¤   Debug( LDAP_DEBUG_ANY, "FIONBIO ioctl failed on %d\n",
c81cf2 ¤   ¤   ¤   ····s, 0, 0 );
260fe4 ¤   ¤   }
c090e2 #endif /* LDAP_REFERRALS */
c9db56 #endif /* notyet */
32d9b3 ¤   ¤   (void)memset( (char *)&sin, 0, sizeof( sin ));
d78fbd ¤   ¤   sin.sin_family = kPGPAddressFamilyInternet;
d2d38c ¤   ¤   sin.sin_port = port;
a39de9 ¤   ¤   SAFEMEMCPY( (char *) &sin.sin_addr.s_addr,
8e8cb9 ¤   ¤   ····( use_hp ? (char *) hp->h_addr_list[ i ] :
3906a5 ¤   ¤   ····(char *) &address ), sizeof( sin.sin_addr.s_addr) );
61af5a
78c583 #ifdef MACOS
2f86a6 ¤   ¤   if (gCallbackDataSocket != NULL) {
78ee97 ¤   ¤   ¤   *gCallbackDataSocket = socketRef;
450fe4 ¤   ¤   }
4d7454 #endif
fe2438 ¤   ¤   connectResult = PGPConnect( socketRef, (PGPSocketAddress *)&sin,
9dcb33 ¤   ¤   ····sizeof( sin ));
acc583 #ifdef MACOS
4e86a6 ¤   ¤   if (gCallbackDataSocket != NULL) {
d5c251 ¤   ¤   ¤   *gCallbackDataSocket = NULL;
a80fe4 ¤   ¤   }
287454 #endif
663f1b ¤   ¤   if ( connectResult >= 0 ) {
02abec ¤   ¤   ¤   connected = 1;
d3e256 ¤   ¤   ¤   rc = 0;
aecdcb ¤   ¤   ¤   break;
9f45a6 ¤   ¤   } else {
86b7e5 #ifdef notyet
e37f8d #ifdef LDAP_REFERRALS
8a935b #ifdef EAGAIN
4f3e65 ¤   ¤   ¤   if ( errno == EINPROGRESS || errno == EAGAIN ) {
999760 #else /* EAGAIN */
06ff24 ¤   ¤   ¤   if ( errno == EINPROGRESS ) {
d9055c #endif /* EAGAIN */
60c3e3 ¤   ¤   ¤   ¤   Debug( LDAP_DEBUG_TRACE,
d9eab5 ¤   ¤   ¤   ¤   ¤   "connect would block...\n", 0, 0, 0 );
685290 ¤   ¤   ¤   ¤   rc = -2;
2bf622 ¤   ¤   ¤   ¤   break;
23a3a6 ¤   ¤   ¤   }
6190e2 #endif /* LDAP_REFERRALS */
f5db56 #endif /* notyet */
89af5a
eb4d30 ¤   ¤   ¤   PGPCloseSocket( socketRef );
de6860 ¤   ¤   ¤   if ( !use_hp ) {
95f622 ¤   ¤   ¤   ¤   break;
3fa3a6 ¤   ¤   ¤   }
1e0fe4 ¤   ¤   }
9f9371 ¤   }
f1af5a
ce69f9 ¤   sb->sb_sd = socketRef;
0be205 ¤   sb->sb_options |= LBER_NO_READ_AHEAD;
63af5a
c0b4aa ¤   if ( connected ) {
f5b7e5 #ifdef notyet
a77f8d #ifdef LDAP_REFERRALS
aa1c2a ¤   ¤   status = 0;
8aca15 ¤   ¤   if ( !async && ioctl( s, FIONBIO, (caddr_t)&on ) == -1 ) {
541c37 ¤   ¤   ¤   Debug( LDAP_DEBUG_ANY, "FIONBIO ioctl failed on %d\n",
--d8f8 0004348f270401201dd Page 5 of macos-ip.c
e11cf2 ¤   ¤   ¤   ····s, 0, 0 );
d90fe4 ¤   ¤   }
ec90e2 #endif /* LDAP_REFERRALS */
8edb56 #endif /* notyet */
3caf5a
409371 ¤   }
e0af5a
936d62 ¤   return( rc );
80efe6 }
daaf5a
f0af5a
4f314a void
02ff21 close_connection( Sockbuf *sb )
bebb36 {
b4c1d8 ····tcp_close( sb->sb_sd );
12efe6 }
9eaf5a
caaf5a
385ffa #ifdef KERBEROS
8711e4 char *
a3c805 host_connected_to( Sockbuf *sb )
7cbb36 {
30d676 ¤   struct hostent¤ ¤   *hp;
18d9ac ¤   char¤   ¤   ¤   *p;
ce4bd7 ¤   int¤¤   ¤   len;
f6dbaa ¤   struct sockaddr_in¤ sin;
c2af5a
652c9f ¤   (void)memset( (char *)&sin, 0, sizeof( struct sockaddr_in ));
34533a ¤   len = sizeof( sin );
9d648e ¤   if ( getpeername( sb->sb_sd, (struct sockaddr *)&sin, &len ) == -1 ) {
ffef86 ¤   ¤   return( NULL );
579371 ¤   }
18af5a
4fd8af ¤   /*
76cd84 ¤   ·* do a reverse lookup on the addr to get the official hostname.
2a1ce4 ¤   ·* this is necessary for kerberos to work right, since the official
396b28 ¤   ·* hostname is used as the kerberos instance.
74a4e3 ¤   ·*/
8f9833 ¤   if (( hp = gethostbyaddr( (char *) &sin.sin_addr,
654942 ¤   ····sizeof( sin.sin_addr ), kPGPAddressFamilyInternet )) != NULL ) {
d4236c ¤   ¤   if ( hp->h_name != NULL ) {
b8a2dd ¤   ¤   ¤   return( strdup( hp->h_name ));
6e0fe4 ¤   ¤   }
0a9371 ¤   }
17af5a
8b9572 ¤   return( NULL );
85efe6 }
e1999d #endif /* KERBEROS */
dcaf5a
53af5a
df7f8d #ifdef LDAP_REFERRALS
c1366d /* for UNIX */
14a5e2 struct selectinfo {
c6a01e ¤   fd_set¤ si_readfds;
c1a506 ¤   fd_set¤ si_writefds;
6a44a3 ¤   fd_set¤ si_use_readfds;
c3cb8c ¤   fd_set¤ si_use_writefds;
6a82f7 };
44af5a
82af5a
24314a void
2a4f32 mark_select_write( LDAP *ld, Sockbuf *sb )
64bb36 {
449edc ¤   struct selectinfo¤  *sip;
84af5a
ea0ea5 ¤   sip = (struct selectinfo *)ld->ld_selectinfo;
a5af5a
e9cc25 ¤   if ( !FD_ISSET( sb->sb_sd, &sip->si_writefds )) {
df185b ¤   ¤   FD_SET( sb->sb_sd, &sip->si_writefds );
e49371 ¤   }
21efe6 }
43af5a
--4144 00063a8c4f8401201dd Page 6 of macos-ip.c
e0af5a
12314a void
2ae00e mark_select_read( LDAP *ld, Sockbuf *sb )
2cbb36 {
9b9edc ¤   struct selectinfo¤  *sip;
c2af5a
970ea5 ¤   sip = (struct selectinfo *)ld->ld_selectinfo;
26af5a
dde84f ¤   if ( !FD_ISSET( sb->sb_sd, &sip->si_readfds )) {
e96d09 ¤   ¤   FD_SET( sb->sb_sd, &sip->si_readfds );
879371 ¤   }
21efe6 }
87af5a
dfaf5a
37314a void
907ba1 mark_select_clear( LDAP *ld, Sockbuf *sb )
6fbb36 {
919edc ¤   struct selectinfo¤  *sip;
38af5a
900ea5 ¤   sip = (struct selectinfo *)ld->ld_selectinfo;
a4af5a
3b35b4 ¤   FD_CLR( sb->sb_sd, &sip->si_writefds );
05e0e5 ¤   FD_CLR( sb->sb_sd, &sip->si_readfds );
65efe6 }
41af5a
11af5a
2d4d2f int
2964b3 is_write_ready( LDAP *ld, Sockbuf *sb )
4dbb36 {
769edc ¤   struct selectinfo¤  *sip;
cbaf5a
490ea5 ¤   sip = (struct selectinfo *)ld->ld_selectinfo;
3baf5a
97ae89 ¤   return( FD_ISSET( sb->sb_sd, &sip->si_use_writefds ));
4befe6 }
36af5a
0eaf5a
864d2f int
ce159b is_read_ready( LDAP *ld, Sockbuf *sb )
c6bb36 {
859edc ¤   struct selectinfo¤  *sip;
24af5a
290ea5 ¤   sip = (struct selectinfo *)ld->ld_selectinfo;
bcaf5a
23e8c0 ¤   return( FD_ISSET( sb->sb_sd, &sip->si_use_readfds ));
f6efe6 }
92af5a
76af5a
a69a44 void *
d56c17 new_select_info()
6dbb36 {
de9edc ¤   struct selectinfo¤  *sip;
15af5a
555ef6 ¤   if (( sip = (struct selectinfo *)calloc( 1,
5d7f07 ¤   ····sizeof( struct selectinfo ))) != NULL ) {
24e044 ¤   ¤   FD_ZERO( &sip->si_readfds );
e28137 ¤   ¤   FD_ZERO( &sip->si_writefds );
329371 ¤   }
10af5a
9f9683 ¤   return( (void *)sip );
f2efe6 }
d1af5a
f1af5a
69314a void
88d757 free_select_info( void *sip )
9bbb36 {
b58d35 ¤   free( sip );
90efe6 }
12af5a
5daf5a
764d2f int
63980b do_ldap_select( LDAP *ld, struct timeval *timeout )
--5dd5 0006414f0d1401201dd Page 7 of macos-ip.c
2cbb36 {
389edc ¤   struct selectinfo¤  *sip;
b0f437 ¤   static int¤ ¤   tblsize;
00af5a
dc10c3 ¤   Debug( LDAP_DEBUG_TRACE, "do_ldap_select\n", 0, 0, 0 );
fbaf5a
422a32 ¤   if ( tblsize == 0 ) {
94f375 #ifdef USE_SYSCONF
67ddf0 ¤   ¤   tblsize = sysconf( _SC_OPEN_MAX );
480949 #else /* USE_SYSCONF */
6bf88a ¤   ¤   tblsize = getdtablesize();
ea7d11 #endif /* USE_SYSCONF */
689371 ¤   }
fbaf5a
de0ea5 ¤   sip = (struct selectinfo *)ld->ld_selectinfo;
12112e ¤   sip->si_use_readfds = sip->si_readfds;
31035a ¤   sip->si_use_writefds = sip->si_writefds;
1767c5 ¤
755e0f ¤   return( select( tblsize, &sip->si_use_readfds, &sip->si_use_writefds,
a2d15f ¤   ····NULL, timeout ));
0aefe6 }
29af5a
e7b177 #if 0
804dee ¤   ¤   if ( sip->si_streaminfo[ i ].tcpsi_stream == (tcpstream *)sb->sb_sd ) {
fc2639 #ifdef LDAP_DEBUG
6f9dfa ¤   ¤   ¤   ¤   if ( sip->si_streaminfo[ i ].tcpsi_is_read_ready ) {
d101d8 ¤   ¤   ¤   ¤   ¤   Debug( LDAP_DEBUG_TRACE, "is_read_ready: stream %x READY\n",
c9ec2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   (tcpstream *)sb->sb_sd, 0, 0 );
acb5fc ¤   ¤   ¤   ¤   } else {
5086c7 ¤   ¤   ¤   ¤   ¤   Debug( LDAP_DEBUG_TRACE, "is_read_ready: stream %x Not Read¶
e346cc y\n",
47ec2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   (tcpstream *)sb->sb_sd, 0, 0 );
252613 ¤   ¤   ¤   ¤   }
bf9b45 #endif /* LDAP_DEBUG */
53ace0 ¤   ¤   ¤   ¤   return( sip->si_streaminfo[ i ].tcpsi_is_read_ready ? 1 : 0 );
21a3a6 ¤   ¤   ¤   }
c40fe4 ¤   ¤   }
9e9371 ¤   }
cfaf5a
c12da4 ¤   Debug( LDAP_DEBUG_TRACE, "is_read_ready: stream %x: NOT FOUND\n", (tcpstrea¶
afd100 m *)sb->sb_sd, 0, 0 );
4eea61 ¤   return( 0 );
17efe6 }
857454 #endif
17af5a
56af5a
c79a44 void *
3b6c17 new_select_info()
debb36 {
c4e662 ¤   return( (void *)calloc( 1, sizeof( struct selectinfo )));
ffefe6 }
beaf5a
16af5a
52314a void
d9d757 free_select_info( void *sip )
7abb36 {
c5ffad ¤   if ( sip != NULL )
38c7a1 ¤   {
19e064 ¤   ¤   // Fixes a leak:
e0c04a ¤   ¤   if( ((struct selectinfo *) sip )->si_streaminfo != NULL )
b15b34 ¤   ¤   {
da51fc ¤   ¤   ¤   free( ((struct selectinfo *) sip )->si_streaminfo );
a40fe4 ¤   ¤   }
aa1b52 ¤   ¤
d7ccbe ¤   ¤   free( sip );
e19371 ¤   }
38efe6 }
deaf5a
8baf5a
e24d2f int
32980b do_ldap_select( LDAP *ld, struct timeval *timeout )
64bb36 {
--5b82 0010a04b4de401201dd Page 8 of macos-ip.c
2a9edc ¤   struct selectinfo¤  *sip;
e35ce0 ¤   Boolean¤¤   ¤   ¤   ready, gotselecterr;
c7d2d6 ¤   long¤   ¤   ¤   ¤   ticks, endticks;
f78b99 ¤   short¤  ¤   ¤   ¤   i, err;
26af5a
2110c3 ¤   Debug( LDAP_DEBUG_TRACE, "do_ldap_select\n", 0, 0, 0 );
69af5a
95e00c ¤   if (( sip = (struct selectinfo *)ld->ld_selectinfo ) == NULL ) {
4249fa ¤   ¤   return( -1 );
2e9371 ¤   }
5eaf5a
0f1be0 ¤   if ( sip->si_count == 0 ) {
4fa0ae ¤   ¤   return( 1 );
769371 ¤   }
65af5a
fdbd53 ¤   if ( timeout != NULL ) {
14e553 ¤   ¤   endticks = 60 * timeout->tv_sec + ( 60 * timeout->tv_usec ) / 1000000 +¶
5755e9 ·TickCount();
a69371 ¤   }
e3af5a
14b57c ¤   for ( i = 0; i < sip->si_count; ++i ) {
a47314 ¤   ¤   if ( sip->si_streaminfo[ i ].tcpsi_check_read ) {
f59b4f ¤   ¤   ¤   sip->si_streaminfo[ i ].tcpsi_is_read_ready = false;
1d0fe4 ¤   ¤   }
219371 ¤   }
79af5a
acd3ea ¤   ready = gotselecterr = false;
4643ab ¤   do {
d9ad2c ¤   ¤   for ( i = 0; i < sip->si_count; ++i ) {
009545 ¤   ¤   ¤   if ( sip->si_streaminfo[ i ].tcpsi_check_read && !sip->si_streaminf¶
7b0a2f o[ i ].tcpsi_is_read_ready ) {
0b6c79 ¤   ¤   ¤   ¤   if (( err = tcpreadready( sip->si_streaminfo[ i ].tcpsi_stream ¶
85c249 )) > 0 ) {
37fef5 ¤   ¤   ¤   ¤   ¤   sip->si_streaminfo[ i ].tcpsi_is_read_ready = ready = true;
e820ce ¤   ¤   ¤   ¤   } else if ( err < 0 ) {
3f9e05 ¤   ¤   ¤   ¤   ¤   gotselecterr = true;
a02613 ¤   ¤   ¤   ¤   }
d4a3a6 ¤   ¤   ¤   }
570fe4 ¤   ¤   }
ac5898 ¤   ¤   if ( !ready && !gotselecterr ) {
4ec288 ¤   ¤   ¤   Delay( 2L, &ticks );
c46da6 ¤   ¤   ¤   SystemTask();
770fe4 ¤   ¤   }
23af28 ¤   } while ( !ready && !gotselecterr && ( timeout == NULL || ticks < endticks ¶
221445 ));
a1af5a
7d95e3 ¤   Debug( LDAP_DEBUG_TRACE, "do_ldap_select returns %d\n", ready ? 1 : ( gotse¶
7f41a3 lecterr ? -1 : 0 ), 0, 0 );
0e1837 ¤   return( ready ? 1 : ( gotselecterr ? -1 : 0 ));
bdefe6 }
0a90e2 #endif /* LDAP_REFERRALS */
--df58 001251c234a401201de Page 1 of macos.h
bc38e5 /*
c39bce ·* macos.h: bridge unix and Mac for ·LBER/LDAP
e9495d ·*/
658af8 #define ntohl( l )¤ (l)
adab45 #define htonl( l )¤ (l)
5eb1ba #define ntohs( s )¤ (s)
189007 #define htons( s )¤ (s)
6aaf5a
75bd85 #ifdef NO_GLOBALS
d2af5a
0097da #include "PGPldapLibUtils.h"
3daf5a
3fc6ca #ifdef macintosh¤   /* IUMagIDString declared in TextUtils.h under MPW */
c94b15 #include <TextUtils.h>
cb692b #else /* macintosh */¤  /* IUMagIDString declared in Packages.h under ThinkC */
33d351 #include <Packages.h>
952140 #endif /* macintosh */
0daf5a
e06982 #define strcasecmp( s1, s2 )¤   IUMagIDString( s1, s2, strlen( s1 ), \
7b5abe ¤   ¤   ¤   ¤   ¤   strlen( s2 ))
50ae56 #else /* NO_GLOBALS */
23060e int strcasecmp( char *s1, char *s2 );
3240b0 int strncasecmp( char *s1, char *s2, long n );
b031df #endif NO_GLOBALS
c0af5a
547c9d #include <Memory.h>¤/* to get BlockMove() */
42af5a
44daf9 #ifndef isascii
3bb978 #define isascii(c)¤ ((unsigned)(c)<=0177)¤  /* for those who don't have this in¶
a9eb48 ·ctype.h */
72308c #endif isascii
46af5a
259b53 #include "tcp.h"
--fe84 0000decd5cd401201df Page 1 of strings.c
bc38e5 /*
b6bf3b ·* strings.c
21495d ·*/
0e324c #include <string.h>
9bbea3 #include <stdlib.h>
3f65e0 #include "macos.h"
7daf5a
14af5a
749c53 #ifndef NO_GLOBALS
8b38e5 /*
a13548 ·* Copyright (c) 1987 Regents of the University of California.
c44cc6 ·* All rights reserved. ·The Berkeley software License Agreement
6d8568 ·* specifies the terms and conditions for redistribution.
d5495d ·*/
f838e5 /*
391bc9 ·* This array is designed for mapping upper and lower case letter
2ff24c ·* together for a case independent comparison. ·The mappings are
547778 ·* based upon ascii character sequences.
4c495d ·*/
54bb06 static char charmap[] = {
0243bd ¤   '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
89bcb2 ¤   '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
80b5b2 ¤   '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
b44abd ¤   '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
7fa7b2 ¤   '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
7058bd ¤   '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
f251bd ¤   '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
d0aeb2 ¤   '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
5a895b ¤   '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
8ea0b5 ¤   '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
bea9b5 ¤   '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
25b507 ¤   '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
095fba ¤   '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
96a0b5 ¤   '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
8ba9b5 ¤   '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
1456ba ¤   '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
e0bbbc ¤   '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
cf44b3 ¤   '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
664db3 ¤   '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
1bb2bc ¤   '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
325fb3 ¤   '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
67a0bc ¤   '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
eba9bc ¤   '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
e056b3 ¤   '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
85715a ¤   '\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
4958b4 ¤   '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
ad51b4 ¤   '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
204d06 ¤   '\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
c9a7bb ¤   '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
c858b4 ¤   '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
0951b4 ¤   '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
59aebb ¤   '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
4b82f7 };
acaf5a
b74d2f int
1923fb strcasecmp(char *s1, char *s2)
7bbb36 {
680cbf ¤   register char *cm = charmap;
abaf5a
6ed3e2 ¤   while (cm[*s1] == cm[*s2++])
969265 ¤   ¤   if (*s1++ == '\0')
516e8c ¤   ¤   ¤   return(0);
d62525 ¤   return(cm[*s1] - cm[*--s2]);
1eefe6 }
ffaf5a
404d2f int
db571e strncasecmp(char *s1, char *s2, long n)
abbb36 {
0c0cbf ¤   register char *cm = charmap;
d8af5a
27e169 ¤   while (--n >= 0 && cm[*s1] == cm[*s2++])
0d9265 ¤   ¤   if (*s1++ == '\0')
--6e8f 001f9bb8996401201df Page 2 of strings.c
6c6e8c ¤   ¤   ¤   return(0);
c43706 ¤   return(n < 0 ? 0 : cm[*s1] - cm[*--s2]);
dbefe6 }
c231df #endif NO_GLOBALS
a2af5a
a3af5a
8311e4 char *
c2f6cf strdup( char *p )
2bbb36 {
6ca005 ¤   char¤   *r;
a9af5a
b79e6d ¤   r = (char *) malloc( strlen( p ) + 1 );
6551ec ¤   if ( r != NULL ) {
e88228 ¤   ¤   strcpy( r, p );
7d9371 ¤   }
76af5a
3b3dcb ¤   return( r );
f9efe6 }
--265d 00107b12773401201e0 Page 1 of PGPCommonldapLib.prefix
bc38e5 /*
49bade ** Copyright (C) 1997 Network Associates, Inc. and its affiliates.
e0f124 ** All rights reserved.
2c7fe0 */
cbaf5a
bd7b7d #pragma once
10af5a
8a77e0 #if __POWERPC__
60e47e ¤   #include "MacHeadersPPC"
82fc58 #elif __CFM68K__
2f67e9 ¤   #include "MacHeadersCFM68K"
36db21 #else
16fc57 ¤   #error Cannot compile for this environment
ab7454 #endif
96af5a
1289aa // The following defines are for the umich ldap code
22af5a
80348a #define MACOS¤  ¤   ¤   ¤   ¤   ¤   1
74097a #define NEEDPROTOS¤ ¤   ¤   ¤   ¤   1
e56a13 #define NEEDGETOPT¤ ¤   ¤   ¤   ¤   1
1dd1b5 #define NO_USERINTERFACE¤   ¤   ¤   1
b8edfa #define FILTERFILE¤ ¤   ¤   ¤   ¤   "ldapfilter.conf"
1c999e #define TEMPLATEFILE¤   ¤   ¤   ¤   "ldaptemplates.conf"
54efeb #define¤NO_GLOBALS¤ ¤   ¤   ¤   ¤   1
5e8a75 // #define SUPPORT_OPENTRANSPORT¤   ¤   1
dff2bb #define NO_CACHE¤   ¤   ¤   ¤   ¤   1
e9de1e #define PGPSOCKETSLDAP¤ ¤   ¤   ¤   1
79af5a
275c98 #if PGP_DEBUG
990bf9 ¤   #define LDAP_DEBUG¤ ¤   ¤   ¤   1
537454 #endif
4caf5a
79abcd // PFL #defines
3aaf5a
a3ae08 #define PGP_MACINTOSH¤  ¤   ¤   ¤   1
c3e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
bb5a25 #define USE_MAC_DEBUG_PATCHES¤  ¤   0
d979b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
c3af5a
01049e #define USE_WHACKFREESPACE¤ ¤   ¤   PGP_DEBUG
1baf5a
9e0db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
21af5a
d6a662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
d15cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
efaf5a
cfaf5a
f6ef5a // Redefine Standard C memory functions to use our allocators
ffaf5a
6f2853 #define¤malloc¤ ¤   pgp_ldap_malloc
fec17a #define calloc¤ ¤   pgp_ldap_calloc
c47252 #define realloc¤¤   pgp_ldap_realloc
aa7e6f #define free¤   ¤   pgp_ldap_free
23af5a
bf71f4 // Common header files:
1be610 #include "pgpPFLConfig.h"
6994a0 #include "pgpLeaks.h"
f146ad #include "MacDebug.h"
8e1824 #include "PGPldapLibEntryMappings.h"
07b49e #include "pgpException.h"¶
--b942 00149cab4a9401201e1 Page 1 of PGPDebugldapLib.prefix
bc38e5 /*
49bade ** Copyright (C) 1997 Network Associates, Inc. and its affiliates.
e0f124 ** All rights reserved.
2c7fe0 */
cbaf5a
bd7b7d #pragma once
10af5a
5a7c09 #define PGP_DEBUG¤  1¤  // 1 is on, 0 off
aeaf5a
491215 #include "PGPCommonldapLib.prefix"
--fbc9 001030dbb3a401201e2 Page 1 of PGPldapLib.prefix
bc38e5 /*
49bade ** Copyright (C) 1997 Network Associates, Inc. and its affiliates.
e0f124 ** All rights reserved.
2c7fe0 */
cbaf5a
bd7b7d #pragma once
10af5a
4dd554 #define PGP_DEBUG¤  0¤  // 1 is on, 0 off
35af5a
031215 #include "PGPCommonldapLib.prefix"
--d9c5 000df141948401201e3 Page 1 of PGPldapLibEntry.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
07b3bb ¤   This file contains all of the exported entrypoints for this library. These ¶
b6aea5 entrypoints
388d4d ¤   are simple wrappers around the UMich code which perform parameter validatio¶
d11415 n and any
370218 ¤   other required pre and post processing. The C preprocessor is used to redef¶
26f190 ine the
d190e3 ¤   names of UMich entrypoints so that no name conflicts occur.
5e67c5 ¤
b167c5 ¤
31648d ¤   $Id: PGPldapLibEntry.c,v 1.3.10.1 1998/11/12 03:17:36 heller Exp $
0bf7f7 ____________________________________________________________________________*/
a5af5a
b30d08 #include "pgpMem.h"
d8af5a
1597a6 #include "proto-ldap.h"¤¤   ¤   ¤   ¤   ¤   // VERY IMPORTANT: Do not change th¶
3b4fa0 e #include
abe3c5 #include "PGPldapLibEntryUnmappings.h"¤ ¤   // order of these three files. The ¶
1f6265 two includes·
bc18bc #include "proto-ldap.h"¤¤   ¤   ¤   ¤   ¤   // of proto-ldap.h define two diffe¶
f87b18 rent sets of calls
49af5a
659b53 #include "tcp.h"
20af5a
e99222 #if DEBUG
51641e ¤   #define AssertLDAPIsValid(ld)¤  pgpAssertAddrValid( ld, LDAP );
8adb21 #else
d8c833 ¤   #define AssertLDAPIsValid(ld)
567454 #endif
9baf5a
eda091 ¤   int
c0423e ldap_abandon(
38bfad ¤   LDAP ¤  *ld,
4cd7d0 ¤   int ¤   msgid)
f4bb36 {
067baa ¤   AssertLDAPIsValid( ld );
3467c5 ¤
c9dab3 ¤   return( internal_ldap_abandon( ld, msgid ) );
0aefe6 }
c8af5a
83a091 ¤   int
5d51a4 ldap_add(
10bfad ¤   LDAP ¤  *ld,
9f9bdf ¤   char ¤  *dn,
e72c2a ¤   LDAPMod **attrs)
f1bb36 {
187baa ¤   AssertLDAPIsValid( ld );
6daa7c ¤   pgpAssertAddrValid( dn, char );
df359e ¤   pgpAssertAddrValid( attrs, LDAPMod * );
19af5a
68d0ca ¤   return( internal_ldap_add( ld, dn, attrs ) );
c8efe6 }
80af5a
e1a091 ¤   int
d2d898 ldap_add_s(
a8bfad ¤   LDAP ¤  *ld,
5d9bdf ¤   char ¤  *dn,
5d2c2a ¤   LDAPMod **attrs)
fdbb36 {
177baa ¤   AssertLDAPIsValid( ld );
12aa7c ¤   pgpAssertAddrValid( dn, char );
94359e ¤   pgpAssertAddrValid( attrs, LDAPMod * );
b3af5a
e53b31 ¤   return( internal_ldap_add_s( ld, dn, attrs ) );
55efe6 }
c0af5a
ad6d52 ¤   void
6d1296 ldap_add_result_entry(
dfe5bf ¤   LDAPMessage **list,
--cbb9 0003c297eeb401201e3 Page 2 of PGPldapLibEntry.c
c3a2f8 ¤   LDAPMessage *e)
3dbb36 {
2ff5d9 ¤   pgpAssertAddrValid( list, LDAPMessage * );
1059ed ¤   pgpAssertAddrValid( e, LDAPMessage );
db67c5 ¤
4baf28 ¤   internal_ldap_add_result_entry( list, e );
f7efe6 }
13af5a
0da091 ¤   int
d753d4 ldap_bind(
2fbfad ¤   LDAP ¤  *ld,
949bdf ¤   char ¤  *dn,
d1c9f2 ¤   char ¤  *passwd,
b68aaa ¤   int ¤   authmethod)
3dbb36 {
4e7baa ¤   AssertLDAPIsValid( ld );
de6906 ¤   AssertAddrNullOrValid( dn, char, "ldap_bind" );
2f465f ¤   AssertAddrNullOrValid( passwd, char, "ldap_bind" );
4167c5 ¤
daf3fc ¤   return( internal_ldap_bind( ld, dn, passwd, authmethod ) );
31efe6 }
05af5a
56a091 ¤   int
8b0b4e ldap_bind_s(
ddbfad ¤   LDAP ¤  *ld,
8a9bdf ¤   char ¤  *dn,
6ec9f2 ¤   char ¤  *passwd,
568aaa ¤   int ¤   authmethod)
0bbb36 {
a17baa ¤   AssertLDAPIsValid( ld );
038c5f ¤   AssertAddrNullOrValid( dn, char, "ldap_bind_s" );
305145 ¤   AssertAddrNullOrValid( passwd, char, "ldap_bind_s" );
e867c5 ¤
7a5904 ¤   return( internal_ldap_bind_s( ld, dn, passwd, authmethod ) );
99efe6 }
7daf5a
ce6d52 ¤   void
a4a0db ldap_build_filter(
6d3162 ¤   char ¤  ¤   ¤   *filtbuf,
c49215 ¤   unsigned long ¤ buflen,
3d8d4f ¤   char ¤  ¤   ¤   *pattern,
04234b ¤   char ¤  ¤   ¤   *prefix,
3262fe ¤   char ¤  ¤   ¤   *suffix,
94f961 ¤   char ¤  ¤   ¤   *attr,
7dad00 ¤   char ¤  ¤   ¤   *value,
6b5ed1 ¤   char ¤  ¤   ¤   **valwords)
87bb36 {
a2967a ¤   pgpAssertAddrValid( filtbuf, char );
bc7b9a ¤   pgpAssertAddrValid( pattern, char );
f35062 ¤   AssertAddrNullOrValid( prefix, char, "ldap_build_filter" );
f0dc07 ¤   AssertAddrNullOrValid( suffix, char, "ldap_build_filter" );
0073cf ¤   AssertAddrNullOrValid( attr, char, "ldap_build_filter" );
8bce2d ¤   AssertAddrNullOrValid( value, char, "ldap_build_filter" );
f08910 ¤   AssertAddrNullOrValid( valwords, char *, "ldap_build_filter" );
f267c5 ¤
f542c6 ¤   internal_ldap_build_filter( filtbuf, buflen, pattern, prefix, suffix,
686394 ¤   ¤   ¤   ¤   attr, value, valwords );
1defe6 }
5baf5a
8ea091 ¤   int
00ee4d ldap_compare(
af8fe7 ¤   LDAP *ld,
234df2 ¤   char *dn,
c5692b ¤   char *attr,
8b3e76 ¤   char *value)
18bb36 {
697baa ¤   AssertLDAPIsValid( ld );
1caa7c ¤   pgpAssertAddrValid( dn, char );
73e983 ¤   pgpAssertAddrValid( attr, char );
32850e ¤   pgpAssertAddrValid( value, char );
2467c5 ¤
3cc5c8 ¤   return( internal_ldap_compare( ld, dn, attr, value ) );
--d5dd 000db8b6b22401201e3 Page 3 of PGPldapLibEntry.c
7aefe6 }
46af5a
3fa091 ¤   int
77ab65 ldap_compare_s(
b98fe7 ¤   LDAP *ld,
fb4df2 ¤   char *dn,
50692b ¤   char *attr,
1c3e76 ¤   char *value)
cdbb36 {
9b7baa ¤   AssertLDAPIsValid( ld );
c4aa7c ¤   pgpAssertAddrValid( dn, char );
35e983 ¤   pgpAssertAddrValid( attr, char );
4a850e ¤   pgpAssertAddrValid( value, char );
9567c5 ¤
f845ad ¤   return( internal_ldap_compare_s( ld, dn, attr, value ) );
daefe6 }
8caf5a
9ba091 ¤   int
6c39bc ldap_count_entries(
7b1c86 ¤   LDAP ¤  ¤   *ld,
6abe54 ¤   LDAPMessage *chain)
8fbb36 {
b67baa ¤   AssertLDAPIsValid( ld );
a57158 ¤   pgpAssertAddrValid( chain, LDAPMessage );
96af5a
b157db ¤   return( internal_ldap_count_entries( ld, chain ) );
ccefe6 }
cbaf5a
e1a091 ¤   int
c70745 ldap_count_values(char **vals)
7cbb36 {
0ee32a ¤   AssertAddrNullOrValid( vals, char *, "ldap_count_values" );
8267c5 ¤
8ae58a ¤   return( internal_ldap_count_values( vals ) );
44efe6 }
3daf5a
a6a091 ¤   int
ba3456 ldap_count_values_len(struct berval **vals)
17bb36 {
004201 ¤   AssertAddrNullOrValid( vals, struct berval *, "ldap_count_values_len" );
5167c5 ¤
7f55fd ¤   return( internal_ldap_count_values_len( vals ) );
42efe6 }
84af5a
19a091 ¤   int
deb87d ldap_delete(
b98fe7 ¤   LDAP *ld,
2a334a ¤   char *dn)
73bb36 {
587baa ¤   AssertLDAPIsValid( ld );
6daa7c ¤   pgpAssertAddrValid( dn, char );
2467c5 ¤
171464 ¤   return( internal_ldap_delete( ld, dn ) );
c6efe6 }
50af5a
aba091 ¤   int
6a2a74 ldap_delete_s(
688fe7 ¤   LDAP *ld,
f5334a ¤   char *dn)
9cbb36 {
007baa ¤   AssertLDAPIsValid( ld );
14aa7c ¤   pgpAssertAddrValid( dn, char );
a167c5 ¤
f21e1d ¤   return( internal_ldap_delete_s( ld, dn ) );
0befe6 }
b8af5a
0f2ad4 ¤   LDAPMessage *
5b98d9 ldap_delete_result_entry(
4de5bf ¤   LDAPMessage **list,
77a2f8 ¤   LDAPMessage *e)
4bbb36 {
dbf5d9 ¤   pgpAssertAddrValid( list, LDAPMessage * );
--84da 0007f453c24401201e3 Page 4 of PGPldapLibEntry.c
4759ed ¤   pgpAssertAddrValid( e, LDAPMessage );
d267c5 ¤
f6b0f5 ¤   return( internal_ldap_delete_result_entry( list, e ) );
47efe6 }
d1af5a
e3d25c ¤   char *
3556d6 ldap_dn2ufn(char *dn)
b8bb36 {
6daa7c ¤   pgpAssertAddrValid( dn, char );
cdaf5a
cc73cb ¤   return( internal_ldap_dn2ufn( dn ) );
98efe6 }
40af5a
53d25c ¤   char *
48c0ac ldap_err2string(int err)
0cbb36 {
978ad8 ¤   return( internal_ldap_err2string( err ) );
e2efe6 }
7baf5a
d91452 ¤   char **
525cea ldap_explode_dn(
4f9bdf ¤   char ¤  *dn,
b94b67 ¤   int ¤   notypes)
2cbb36 {
8aaa7c ¤   pgpAssertAddrValid( dn, char );
74af5a
b8b138 ¤   return( internal_ldap_explode_dn( dn, notypes ) );
b6efe6 }
8daf5a
161452 ¤   char **
992e9d ldap_explode_dns(char *dn)
8cbb36 {
e3aa7c ¤   pgpAssertAddrValid( dn, char );
15af5a
7fbf9e ¤   return( internal_ldap_explode_dns( dn ) );
a0efe6 }
baaf5a
8fd25c ¤   char *
25c2e4 ldap_first_attribute(
b51c86 ¤   LDAP ¤  ¤   *ld,
6518eb ¤   LDAPMessage *entry,
875e0a ¤   BerElement ¤**ber)
2cbb36 {
d87baa ¤   AssertLDAPIsValid( ld );
5f7d9a ¤   pgpAssertAddrValid( entry, LDAPMessage );
f0fcfe ¤   pgpAssertAddrValid( ber, BerElement * );
2167c5 ¤
93c58c ¤   return( internal_ldap_first_attribute( ld, entry, ber ) );
ddefe6 }
03af5a
f72ad4 ¤   LDAPMessage *
c75bab ldap_first_entry(
9a1c86 ¤   LDAP ¤  ¤   *ld,
e5be54 ¤   LDAPMessage *chain)
68bb36 {
fc7baa ¤   AssertLDAPIsValid( ld );
4d7158 ¤   pgpAssertAddrValid( chain, LDAPMessage );
ac67c5 ¤
b86ca0 ¤   return( internal_ldap_first_entry( ld, chain ) );
32efe6 }
1eaf5a
6b6d52 ¤   void
381086 ldap_free_friendlymap(FriendlyMap **map)
c7bb36 {
9c795d ¤   AssertAddrNullOrValid( map, FriendlyMap *, "ldap_free_friendlymap" );
8b67c5 ¤
342dc7 ¤   internal_ldap_free_friendlymap( map );
6defe6 }
08af5a
d86d52 ¤   void
5e7952 ldap_free_urldesc(LDAPURLDesc *ludp)
7fbb36 {
--14bb 00067d12879401201e3 Page 5 of PGPldapLibEntry.c
0fa85f ¤   AssertAddrNullOrValid( ludp, LDAPURLDesc, "ldap_free_urldesc" );
dd67c5 ¤
127af4 ¤   internal_ldap_free_urldesc( ludp );
45efe6 }
11af5a
0dd25c ¤   char *
c27b1c ldap_friendly_name(
7253f4 ¤   char ¤  ¤   *filename,
c46fa6 ¤   char ¤  ¤   *uname,
1e367f ¤   FriendlyMap **map)
88bb36 {
1b24ca ¤   pgpAssertAddrValid( filename, char );
3fe3d1 ¤   pgpAssertAddrValid( uname, char );
296fe4 ¤   pgpAssertAddrValid( map, FriendlyMap * );
9a67c5 ¤
27faf4 ¤   return( internal_ldap_friendly_name( filename, uname, map ) );
d9efe6 }
3eaf5a
896d52 ¤   void
26b4fc ldap_getfilter_free(LDAPFiltDesc *lfdp)
8abb36 {
001212 ¤   pgpAssertAddrValid( lfdp, LDAPFiltDesc );
8c67c5 ¤
aca85a ¤   internal_ldap_getfilter_free( lfdp );
b9efe6 }
ef67c5 ¤
c52010 ¤   LDAPFiltInfo *
e9d16b ldap_getfirstfilter(
844d43 ¤   LDAPFiltDesc ¤  *lfdp,
a2efc7 ¤   char ¤  ¤   ¤   *tagpat,
ead3b8 ¤   char ¤  ¤   ¤   *value)
dfbb36 {
a31212 ¤   pgpAssertAddrValid( lfdp, LDAPFiltDesc );
3d6cdf ¤   pgpAssertAddrValid( tagpat, char );
f5850e ¤   pgpAssertAddrValid( value, char );
4c67c5 ¤
da3f12 ¤   return( internal_ldap_getfirstfilter( lfdp, tagpat, value ) );
82efe6 }
50af5a
d32010 ¤   LDAPFiltInfo *
ab8b5b ldap_getnextfilter(LDAPFiltDesc *lfdp)
acbb36 {
ca1212 ¤   pgpAssertAddrValid( lfdp, LDAPFiltDesc );
efaf5a
a62569 ¤   return( internal_ldap_getnextfilter( lfdp ) );
d4efe6 }
61af5a
85d25c ¤   char *
fb233b ldap_get_dn(
311c86 ¤   LDAP ¤  ¤   *ld,
416653 ¤   LDAPMessage *entry)
5fbb36 {
ed7baa ¤   AssertLDAPIsValid( ld );
2a7d9a ¤   pgpAssertAddrValid( entry, LDAPMessage );
19af5a
77e475 ¤   return( internal_ldap_get_dn( ld, entry ) );
f1efe6 }
ebaf5a
131452 ¤   char **
9a9e8f ldap_get_values(
831c86 ¤   LDAP ¤  ¤   *ld,
ba18eb ¤   LDAPMessage *entry,
63b95d ¤   char ¤  ¤   *target)
d9bb36 {
7d7baa ¤   AssertLDAPIsValid( ld );
cf7d9a ¤   pgpAssertAddrValid( entry, LDAPMessage );
1770be ¤   pgpAssertAddrValid( target, char );
9067c5 ¤
4416cf ¤   return( internal_ldap_get_values( ld, entry, target ) );
d9efe6 }
a7af5a
67c7ee ¤   struct berval **
--eeb1 0000966f4e7401201e3 Page 6 of PGPldapLibEntry.c
98e542 ldap_get_values_len(
361c86 ¤   LDAP ¤  ¤   *ld,
c418eb ¤   LDAPMessage *entry,
84b95d ¤   char ¤  ¤   *target)
84bb36 {
a77baa ¤   AssertLDAPIsValid( ld );
9d7d9a ¤   pgpAssertAddrValid( entry, LDAPMessage );
d170be ¤   pgpAssertAddrValid( target, char );
7d67c5 ¤
d8713a ¤   return( internal_ldap_get_values_len( ld, entry, target ) );
cbefe6 }
eeaf5a
25ca0b ¤   LDAP *
1d9c99 ldap_init(
f66a0d ¤   char¤   *defhost,
d4e8bc ¤   int ¤   defport)
d3bb36 {
ed2632 ¤   pgpAssertAddrValid( defhost, char );
baaf5a
e859bc ¤   return( internal_ldap_init( defhost, defport ) );
61efe6 }
afaf5a
c0265a ¤   LDAPFiltDesc *
0c0272 ldap_init_getfilter(char *fname)
c5bb36 {
5f994b ¤   pgpAssertAddrValid( fname, char );
b3af5a
b9db3a ¤   return( internal_ldap_init_getfilter( fname ) );
24efe6 }
a8af5a
ff265a ¤   LDAPFiltDesc *
f1fbe8 ldap_init_getfilter_buf(
b74149 ¤   char *buf,
4fcd95 ¤   long buflen)
25bb36 {
a80d35 ¤   pgpAssertAddrValid( buf, char );
2eaf5a
97c486 ¤   return( internal_ldap_init_getfilter_buf( buf, buflen ) );
81efe6 }
8eaf5a
83a091 ¤   int
95ca33 ldap_is_dns_dn(char *dn)
f6bb36 {
91aa7c ¤   pgpAssertAddrValid( dn, char );
01af5a
b2ef36 ¤   return( internal_ldap_is_dns_dn( dn ) );
33efe6 }
96af5a
64a091 ¤   int
8f0caf ldap_is_ldap_url(char *url)
cfbb36 {
efdab6 ¤   pgpAssertAddrValid( url, char );
61af5a
3351ee ¤   return( internal_ldap_is_ldap_url( url ) );
64efe6 }
9aaf5a
fba091 ¤   int
fc71a0 ldap_modify(
bcbfad ¤   LDAP ¤  *ld,
55bdd1 ¤   char¤   *dn,
fb26cc ¤   LDAPMod **mods)
3dbb36 {
227baa ¤   AssertLDAPIsValid( ld );
efaa7c ¤   pgpAssertAddrValid( dn, char );
046321 ¤   pgpAssertAddrValid( mods, LDAPMod * );
c9af5a
fe38f7 ¤   return( internal_ldap_modify( ld, dn, mods ) );
d6efe6 }
4daf5a
aca091 ¤   int
989efa ldap_modify_s(
09bfad ¤   LDAP ¤  *ld,
--cf63 0002471c558401201e3 Page 7 of PGPldapLibEntry.c
8b9bdf ¤   char ¤  *dn,
2626cc ¤   LDAPMod **mods)
16bb36 {
4c7baa ¤   AssertLDAPIsValid( ld );
f2aa7c ¤   pgpAssertAddrValid( dn, char );
336321 ¤   pgpAssertAddrValid( mods, LDAPMod * );
e4af5a
604b79 ¤   return( internal_ldap_modify_s( ld, dn, mods ) );
d8efe6 }
feaf5a
caa091 ¤   int
34b2ea ldap_modrdn(
ce8fe7 ¤   LDAP *ld,
504df2 ¤   char *dn,
9360bd ¤   char *newrdn)
e3bb36 {
137baa ¤   AssertLDAPIsValid( ld );
77aa7c ¤   pgpAssertAddrValid( dn, char );
5c9a78 ¤   pgpAssertAddrValid( newrdn, char );
faaf5a
4931d8 ¤   return( internal_ldap_modrdn( ld, dn, newrdn ) );
87efe6 }
f6af5a
4ca091 ¤   int
dbd17b ldap_modrdn_s(
5a8fe7 ¤   LDAP *ld,
4c4df2 ¤   char *dn,
5f60bd ¤   char *newrdn)
48bb36 {
9a7baa ¤   AssertLDAPIsValid( ld );
5daa7c ¤   pgpAssertAddrValid( dn, char );
259a78 ¤   pgpAssertAddrValid( newrdn, char );
afaf5a
b5712e ¤   return( internal_ldap_modrdn_s( ld, dn, newrdn ) );
98efe6 }
1faf5a
4aa091 ¤   int
1401d0 ldap_modrdn2(
31bfad ¤   LDAP ¤  *ld,
439bdf ¤   char ¤  *dn,
35430f ¤   char ¤  *newrdn,
6b00a2 ¤   int ¤   deleteoldrdn)
62bb36 {
707baa ¤   AssertLDAPIsValid( ld );
05aa7c ¤   pgpAssertAddrValid( dn, char );
299a78 ¤   pgpAssertAddrValid( newrdn, char );
a8af5a
eb59bd ¤   return( internal_ldap_modrdn2( ld, dn, newrdn, deleteoldrdn ) );
8cefe6 }
bcaf5a
5fa091 ¤   int
d81db9 ldap_modrdn2_s(
9abfad ¤   LDAP ¤  *ld,
ee9bdf ¤   char ¤  *dn,
96430f ¤   char ¤  *newrdn,
d200a2 ¤   int ¤   deleteoldrdn)
adbb36 {
b87baa ¤   AssertLDAPIsValid( ld );
6eaa7c ¤   pgpAssertAddrValid( dn, char );
529a78 ¤   pgpAssertAddrValid( newrdn, char );
88af5a
879a29 ¤   return( internal_ldap_modrdn2_s( ld, dn, newrdn, deleteoldrdn ) );
d0efe6 }
a8af5a
746d52 ¤   void
9c1fa4 ldap_mods_free(
af5874 ¤   LDAPMod **mods,
a6abd6 ¤   int ¤   freemods)
dbbb36 {
a16321 ¤   pgpAssertAddrValid( mods, LDAPMod * );
05af5a
249e30 ¤   internal_ldap_mods_free( mods, freemods );
--a96f 000c8661c08401201e3 Page 8 of PGPldapLibEntry.c
7aefe6 }
46af5a
3fa091 ¤   int
d748a7 ldap_msgdelete(
05bfad ¤   LDAP ¤  *ld,
abd7d0 ¤   int ¤   msgid)
b7bb36 {
b17baa ¤   AssertLDAPIsValid( ld );
27af5a
344f80 ¤   return( internal_ldap_msgdelete( ld, msgid ) );
d3efe6 }
f2af5a
c1a091 ¤   int
d6306e ldap_msgfree(LDAPMessage *lm)
c8bb36 {
b3408e ¤   pgpAssertAddrValid( lm, LDAPMessage * );
1caf5a
2be734 ¤   return( internal_ldap_msgfree( lm ) );
0aefe6 }
f7af5a
6fd25c ¤   char *
ad9983 ldap_next_attribute(
101c86 ¤   LDAP ¤  ¤   *ld,
2a18eb ¤   LDAPMessage *entry,
fb0ee3 ¤   BerElement ¤*ber)
56bb36 {
1d7baa ¤   AssertLDAPIsValid( ld );
ce4338 ¤   pgpAssertAddrValid( entry, LDAPMessage * );
43fcfe ¤   pgpAssertAddrValid( ber, BerElement * );
daaf5a
ab9bc9 ¤   return( internal_ldap_next_attribute( ld, entry, ber ) );
37efe6 }
02af5a
222ad4 ¤   LDAPMessage *
77071a ldap_next_entry(
841c86 ¤   LDAP ¤  ¤   *ld,
116653 ¤   LDAPMessage *entry)
34bb36 {
e97baa ¤   AssertLDAPIsValid( ld );
a04338 ¤   pgpAssertAddrValid( entry, LDAPMessage * );
d4af5a
ba7b51 ¤   return( internal_ldap_next_entry( ld, entry ) );
19efe6 }
02af5a
8dca0b ¤   LDAP *
1e3040 ldap_open(
841efc ¤   char ¤  *host,
90d34f ¤   int ¤   port)
23bb36 {
be76aa ¤   pgpAssertAddrValid( host, char );
3d67c5 ¤
08fb6d ¤   return( internal_ldap_open( host, port ) );
a8efe6 }
ceaf5a
84a091 ¤   int
d5ccfd ldap_result(
edb830 ¤   LDAP¤   ¤   ¤   *ld,
368021 ¤   int ¤   ¤   ¤   msgid,
551bdd ¤   int ¤   ¤   ¤   all,
ac6d76 ¤   struct timeval ¤*timeout,
3d345c ¤   LDAPMessage ¤   **result)
2fbb36 {
f47baa ¤   AssertLDAPIsValid( ld );
ca969e ¤   pgpAssertAddrValid( timeout, struct timeval );
391efc ¤   pgpAssertAddrValid( result, LDAPMessage * );
7aaf5a
599357 ¤   return( internal_ldap_result( ld, msgid, all, timeout, result ) );
84efe6 }
2eaf5a
23a091 ¤   int
d69b19 ldap_result2error(
c81c86 ¤   LDAP ¤  ¤   *ld,
--7d52 0005c531618401201e3 Page 9 of PGPldapLibEntry.c
a7d5d0 ¤   LDAPMessage *r,
becfec ¤   int ¤   ¤   freeit)
3fbb36 {
107baa ¤   AssertLDAPIsValid( ld );
e708ef ¤   pgpAssertAddrValid( r, LDAPMessage * );
feaf5a
e3d647 ¤   return( internal_ldap_result2error( ld, r, freeit ) );
18efe6 }
d6af5a
bea091 ¤   int
f9a5b7 ldap_search(
a2bfad ¤   LDAP ¤  *ld,
d98903 ¤   char ¤  *base,
95e20e ¤   int ¤   scope,
9db7a9 ¤   char ¤  *filter,
be9a62 ¤   char ¤  **attrs,
3da5c1 ¤   int ¤   attrsonly)
25bb36 {
357baa ¤   AssertLDAPIsValid( ld );
13704f ¤   pgpAssertAddrValid( base, char );
5802fc ¤   pgpAssertAddrValid( filter, char );
07a49b ¤   AssertAddrNullOrValid( attrs, char, "ldap_search" );
2967c5 ¤
26213f ¤   return( internal_ldap_search( ld, base, scope, filter, attrs, attrsonly ) );
dcefe6 }
e4af5a
fda091 ¤   int
3bd6ca ldap_search_s(
7d1c86 ¤   LDAP ¤  ¤   *ld,
721d64 ¤   char ¤  ¤   *base,
44e1f1 ¤   int ¤   ¤   scope,
794d59 ¤   char ¤  ¤   *filter,
e36092 ¤   char ¤  ¤   **attrs,
19f1cf ¤   int ¤   ¤   attrsonly,
20c4bf ¤   LDAPMessage **res)
4ebb36 {
3d7baa ¤   AssertLDAPIsValid( ld );
88704f ¤   pgpAssertAddrValid( base, char );
2a02fc ¤   pgpAssertAddrValid( filter, char );
f9a49b ¤   AssertAddrNullOrValid( attrs, char, "ldap_search" );
602355 ¤   pgpAssertAddrValid( res, LDAPMessage * );
b667c5 ¤
e1e6db ¤   return( internal_ldap_search_s( ld, base, scope, filter, attrs, attrsonly, ¶
30d1c5 res ) );
f4efe6 }
49af5a
9da091 ¤   int
5cf019 ldap_search_st(
abb373 ¤   LDAP ¤  ¤   ¤   *ld,
6539b9 ¤   char ¤  ¤   ¤   *base,
19cb47 ¤   int ¤   ¤   ¤   scope,
cac53c ¤   char ¤  ¤   ¤   *filter,
29e8f7 ¤   char ¤  ¤   ¤   **attrs,
93ab88 ¤   int ¤   ¤   ¤   attrsonly,
2e6d76 ¤   struct timeval ¤*timeout,
b19384 ¤   LDAPMessage ¤   **res)
8abb36 {
ba7baa ¤   AssertLDAPIsValid( ld );
67704f ¤   pgpAssertAddrValid( base, char );
5b02fc ¤   pgpAssertAddrValid( filter, char );
18fddb ¤   pgpAssertAddrValid( attrs, char * );
5b7d85 ¤   pgpAssertAddrValid( timeout, struct timeval * );
c22355 ¤   pgpAssertAddrValid( res, LDAPMessage * );
5867c5 ¤
deed7c ¤   return( internal_ldap_search_st( ld, base, scope, filter, attrs, attrsonly,
2da158 ¤   ¤   ¤   ¤   timeout, res ) );
4fefe6 }
e2af5a
756d52 ¤   void
01806d ldap_setfilteraffixes(
564d43 ¤   LDAPFiltDesc ¤  *lfdp,
5c234b ¤   char ¤  ¤   ¤   *prefix,
--14a7 000b61b6818401201e3 Page 10 of PGPldapLibEntry.c
9b1c46 ¤   char ¤  ¤   ¤   *suffix)
68bb36 {
f81212 ¤   pgpAssertAddrValid( lfdp, LDAPFiltDesc );
27dac9 ¤   AssertAddrNullOrValid( prefix, char, "ldap_setfilteraffixes" );
b78435 ¤   AssertAddrNullOrValid( suffix, char, "ldap_setfilteraffixes" );
91af5a
bfd3e5 ¤   internal_ldap_setfilteraffixes( lfdp, prefix, suffix );
dbefe6 }
28af5a
b1af5a
7a8789 #ifdef LDAP_REFERRALS¤  /* [ */
806d52 ¤   void
556d07 ldap_set_rebind_proc(
34bfad ¤   LDAP ¤  *ld,
6adc87 ¤   int ¤   (*rebindproc)( LDAP *ld, char **dnp, char **passwdp, int *authmetho¶
1d51da dp, int freeit))
80bb36 {
ca7baa ¤   AssertLDAPIsValid( ld );
0a1923 ¤   pgpAssertAddrValid( rebindproc, VoidAlign );
14af5a
19749a ¤   internal_ldap_set_rebind_proc( ld, rebindproc );
10efe6 }
ee56a5 #endif¤ */ ] */
89af5a
73a091 ¤   int
3ba8a5 ldap_simple_bind(
6f8fe7 ¤   LDAP *ld,
d94df2 ¤   char *dn,
9fea40 ¤   char *passwd)
4dbb36 {
8c7baa ¤   AssertLDAPIsValid( ld );
921d94 ¤   AssertAddrNullOrValid( dn, char, "ldap_simple_bind" );
3f968b ¤   AssertAddrNullOrValid( passwd, char, "ldap_simple_bind" );
6467c5 ¤
b64c3f ¤   return( internal_ldap_simple_bind( ld, dn, passwd ) );
4eefe6 }
40af5a
78a091 ¤   int
aaab0e ldap_simple_bind_s(
f38fe7 ¤   LDAP *ld,
7b4df2 ¤   char *dn,
43ea40 ¤   char *passwd)
66bb36 {
c67baa ¤   AssertLDAPIsValid( ld );
199311 ¤   AssertAddrNullOrValid( dn, char, "ldap_simple_bind_s" );
60bf93 ¤   AssertAddrNullOrValid( passwd, char, "ldap_simple_bind_s" );
f567c5 ¤
e4cd6e ¤   return( internal_ldap_simple_bind_s( ld, dn, passwd ) );
00efe6 }
37af5a
1aa091 ¤   int
e0f1cb ldap_sort_entries(
821c86 ¤   LDAP ¤  ¤   *ld,
20d1d7 ¤   LDAPMessage **chain,
36ddbc ¤   char ¤  ¤   *attr,
2fce62 ¤   int ¤   ¤   (*cmp)())
f3bb36 {
007baa ¤   AssertLDAPIsValid( ld );
e0704e ¤   pgpAssertAddrValid( chain, LDAPMessage * );
253c75 ¤   AssertAddrNullOrValid( attr, char, "ldap_sort_entries" );
381874 ¤   pgpAssertAddrValid( cmp, VoidAlign );
37af5a
eb6ec5 ¤   return( internal_ldap_sort_entries( ld, chain, attr, cmp ) );
4befe6 }
28af5a
79a091 ¤   int
757807 ldap_sort_strcasecmp(
f1d1ce ¤   const char¤ **a,
724012 ¤   const char¤ **b)
3abb36 {
02edf6 ¤   pgpAssertAddrValid( a, char * );
b6e301 ¤   pgpAssertAddrValid( b, char * );
--dbbb 000b78ffeb3401201e3 Page 11 of PGPldapLibEntry.c
2a67c5 ¤
0ceb7a ¤   return( internal_ldap_sort_strcasecmp( (char **) a, (char **) b ) );
3befe6 }
edaf5a
03a091 ¤   int
8c1ec3 ldap_sort_values(
94bfad ¤   LDAP ¤  *ld,
2c3faf ¤   char ¤  **vals,
0f22f9 ¤   int ¤   (*cmp)())
15bb36 {
fd7baa ¤   AssertLDAPIsValid( ld );
f33eb9 ¤   pgpAssertAddrValid( vals, char * );
7e1874 ¤   pgpAssertAddrValid( cmp, VoidAlign );
07af5a
e57eff ¤   return( internal_ldap_sort_values( ld, vals, cmp ) );
dcefe6 }
b8af5a
baa091 ¤   int
2aa9db ldap_ufn_search_c(
041c86 ¤   LDAP ¤  ¤   *ld,
dbf1da ¤   char ¤  ¤   *ufn,
a66092 ¤   char ¤  ¤   **attrs,
35f1cf ¤   int ¤   ¤   attrsonly,
04ba07 ¤   LDAPMessage **res,
ccccc4 ¤   int ¤   ¤   (*cancelproc)( void *cl ),
9d5ffe ¤   void ¤  ¤   *cancelparm)
63bb36 {
f17baa ¤   AssertLDAPIsValid( ld );
cb613a ¤   pgpAssertAddrValid( ufn, char );
7dfddb ¤   pgpAssertAddrValid( attrs, char * );
2f2355 ¤   pgpAssertAddrValid( res, LDAPMessage * );
fbb00e ¤   AssertAddrNullOrValid( cancelproc, VoidAlign, "ldap_ufn_search_c" );
d70d31 ¤   AssertAddrNullOrValid( cancelparm, VoidAlign, "ldap_ufn_search_c" );
beaf5a
17b5f9 ¤   return( internal_ldap_ufn_search_c( ld, ufn, attrs, attrsonly,
0b49cb ¤   ¤   ¤   ¤   res, cancelproc, cancelparm ) );
5eefe6 }
3caf5a
4fa091 ¤   int
56f16e ldap_ufn_search_ct(
9f1c86 ¤   LDAP ¤  ¤   *ld,
79f1da ¤   char ¤  ¤   *ufn,
ae6092 ¤   char ¤  ¤   **attrs,
52f1cf ¤   int ¤   ¤   attrsonly,
5fba07 ¤   LDAPMessage **res,
8accc4 ¤   int ¤   ¤   (*cancelproc)( void *cl ),
442146 ¤   void ¤  ¤   *cancelparm,
0016e1 ¤   char ¤  ¤   *tag1,
21f985 ¤   char ¤  ¤   *tag2,
8ddde1 ¤   char ¤  ¤   *tag3)
62bb36 {
db7baa ¤   AssertLDAPIsValid( ld );
82613a ¤   pgpAssertAddrValid( ufn, char );
00fddb ¤   pgpAssertAddrValid( attrs, char * );
012355 ¤   pgpAssertAddrValid( res, LDAPMessage * );
666eb3 ¤   AssertAddrNullOrValid( cancelproc, VoidAlign, "ldap_ufn_search_ct" );
02a77a ¤   AssertAddrNullOrValid( cancelparm, VoidAlign, "ldap_ufn_search_ct" );
76c83a ¤   AssertAddrNullOrValid( tag1, char, "ldap_ufn_search_ct" );
3e089f ¤   AssertAddrNullOrValid( tag2, char, "ldap_ufn_search_ct" );
fb48fc ¤   AssertAddrNullOrValid( tag3, char, "ldap_ufn_search_ct" );
44af5a
cd3e30 ¤   return( internal_ldap_ufn_search_ct( ld, ufn, attrs, attrsonly,
65c475 ¤   ¤   ¤   ¤   res, cancelproc, cancelparm, tag1, tag2, tag3 ) );
01efe6 }
13af5a
6ba091 ¤   int
3d2c4e ldap_ufn_search_s(
1b1c86 ¤   LDAP ¤  ¤   *ld,
c4f1da ¤   char ¤  ¤   *ufn,
e96092 ¤   char ¤  ¤   **attrs,
98f1cf ¤   int ¤   ¤   attrsonly,
b7c4bf ¤   LDAPMessage **res)
--4552 000b7250ce2401201e3 Page 12 of PGPldapLibEntry.c
2cbb36 {
8b7baa ¤   AssertLDAPIsValid( ld );
25613a ¤   pgpAssertAddrValid( ufn, char );
30fddb ¤   pgpAssertAddrValid( attrs, char * );
932355 ¤   pgpAssertAddrValid( res, LDAPMessage * );
c5af5a
526b96 ¤   return( internal_ldap_ufn_search_s( ld, ufn, attrs, attrsonly, res ) );
faefe6 }
bbaf5a
ca265a ¤   LDAPFiltDesc *
227281 ldap_ufn_setfilter(
898fe7 ¤   LDAP *ld,
5dec3b ¤   char *fname)
5fbb36 {
7c7baa ¤   AssertLDAPIsValid( ld );
0f994b ¤   pgpAssertAddrValid( fname, char );
e3af5a
93257f ¤   return( internal_ldap_ufn_setfilter( ld, fname ) );
ddefe6 }
ccaf5a
946d52 ¤   void
bd94f6 ldap_ufn_setprefix(
188fe7 ¤   LDAP *ld,
2b726c ¤   char *prefix)
e1bb36 {
457baa ¤   AssertLDAPIsValid( ld );
236cde ¤   pgpAssertAddrValid( prefix, char );
2967c5 ¤
755e49 ¤   internal_ldap_ufn_setprefix( ld, prefix );
03efe6 }
c4af5a
53a091 ¤   int
38f932 ldap_ufn_timeout(void *tvparam)
08bb36 {
d74273 ¤   pgpAssertAddrValid( tvparam, VoidAlign );
9b67c5 ¤
764df0 ¤   return( internal_ldap_ufn_timeout( tvparam ) );
02efe6 }
24af5a
fba091 ¤   int
505a49 ldap_unbind(LDAP *ld)
82bb36 {
667baa ¤   AssertLDAPIsValid( ld );
6baf5a
ad7168 ¤   return( internal_ldap_unbind( ld ) );
44efe6 }
b9af5a
48a091 ¤   int
91b991 ldap_unbind_s(LDAP *ld)
d0bb36 {
337baa ¤   AssertLDAPIsValid( ld );
edaf5a
a2fdf8 ¤   return( internal_ldap_unbind_s( ld ) );
72efe6 }
afaf5a
8aa091 ¤   int
08e94e ldap_url_parse(
73f52f ¤   char ¤  ¤   *url,
b226b5 ¤   LDAPURLDesc **ludpp)
2fbb36 {
3cdab6 ¤   pgpAssertAddrValid( url, char );
e49855 ¤   pgpAssertAddrValid( ludpp, LDAPURLDesc * );
5767c5 ¤
ea319d ¤   return( internal_ldap_url_parse( url, ludpp ) );
d5efe6 }
12af5a
11a091 ¤   int
7af989 ldap_url_search(
56bfad ¤   LDAP ¤  *ld,
291bbf ¤   char ¤  *url,
82a5c1 ¤   int ¤   attrsonly)
b7bb36 {
--124f 001cf4288cb401201e3 Page 13 of PGPldapLibEntry.c
497baa ¤   AssertLDAPIsValid( ld );
e5dab6 ¤   pgpAssertAddrValid( url, char );
9667c5 ¤
4b8e1f ¤   return( internal_ldap_url_search( ld, url, attrsonly ) );
e1efe6 }
98af5a
d7a091 ¤   int
3c6291 ldap_url_search_s(
6f1c86 ¤   LDAP ¤  ¤   *ld,
99f52f ¤   char ¤  ¤   *url,
ddf1cf ¤   int ¤   ¤   attrsonly,
edc4bf ¤   LDAPMessage **res)
c5bb36 {
0b7baa ¤   AssertLDAPIsValid( ld );
91dab6 ¤   pgpAssertAddrValid( url, char );
8f2355 ¤   pgpAssertAddrValid( res, LDAPMessage * );
4567c5 ¤
6c8efb ¤   return( internal_ldap_url_search_s( ld, url, attrsonly, res ) );
80efe6 }
8baf5a
0da091 ¤   int
171cfb ldap_url_search_st(
e6b373 ¤   LDAP ¤  ¤   ¤   *ld,
ce025a ¤   char ¤  ¤   ¤   *url,
5bab88 ¤   int ¤   ¤   ¤   attrsonly,
b26d76 ¤   struct timeval ¤*timeout,
879384 ¤   LDAPMessage ¤   **res)
67bb36 {
797baa ¤   AssertLDAPIsValid( ld );
7bdab6 ¤   pgpAssertAddrValid( url, char );
0b969e ¤   pgpAssertAddrValid( timeout, struct timeval );
3f2355 ¤   pgpAssertAddrValid( res, LDAPMessage * );
1467c5 ¤
503f45 ¤   return( internal_ldap_url_search_st( ld, url, attrsonly, timeout, res ) );
cdefe6 }
93af5a
9a6d52 ¤   void
002b83 ldap_value_free(char **vals)
6bbb36 {
4e3eb9 ¤   pgpAssertAddrValid( vals, char * );
4e67c5 ¤
ef51bc ¤   internal_ldap_value_free( vals );
49efe6 }
e5af5a
506d52 ¤   void
c0a861 ldap_value_free_len(struct berval **vals)
e3bb36 {
253022 ¤   pgpAssertAddrValid( vals, struct berval * );
9daf5a
9b5824 ¤   internal_ldap_value_free_len( vals );
65efe6 }
99af5a
5c6d52 ¤   void
7e4cad pgp_ldap_free(void *ptr)
4fbb36 {
12b9de ¤   pgpFree( ptr );
51efe6 }
96af5a
7faf5a
f8af5a
cfaf5a
--ccc8 00053b4f336401201e4 Page 1 of PGPldapLibEntryMappings.h
bc38e5 /*
49bade ** Copyright (C) 1997 Network Associates, Inc. and its affiliates.
e0f124 ** All rights reserved.
510158 **
cc0d58 ** Note: This file contains ALL of the LDAP entrypoints, not just the ones
3069d8 ** implemented in the PGP library. This is done so that any items added to
019886 ** the export list will generate link errors until a wrapper entrypoint is
d2797d ** added to PGPldapLibEntry.c
c97fe0 */
8eaf5a
fa7b7d #pragma once
e9af5a
aa4896 #define cldap_close¤¤   ¤   ¤   ¤   ¤   internal_cldap_close
e0fc49 #define cldap_open¤ ¤   ¤   ¤   ¤   ¤   internal_cldap_open
b8c847 #define cldap_search_s¤ ¤   ¤   ¤   ¤   internal_cldap_search_s
90d87c #define cldap_setretryinfo¤ ¤   ¤   ¤   internal_cldap_setretryinfo
5baa8c #define ldap_8859_to_t61¤   ¤   ¤   ¤   internal_ldap_8859_to_t61
9dfcf7 #define ldap_abandon¤   ¤   ¤   ¤   ¤   internal_ldap_abandon
17c36e #define ldap_add¤   ¤   ¤   ¤   ¤   ¤   internal_ldap_add
3cbe2b #define ldap_add_result_entry¤  ¤   ¤   internal_ldap_add_result_entry
018af5 #define ldap_add_s¤ ¤   ¤   ¤   ¤   ¤   internal_ldap_add_s
1df3d7 #define ldap_bind¤  ¤   ¤   ¤   ¤   ¤   internal_ldap_bind
675600 #define ldap_bind_s¤¤   ¤   ¤   ¤   ¤   internal_ldap_bind_s
47f665 #define ldap_build_filter¤  ¤   ¤   ¤   internal_ldap_build_filter
0b4104 #define ldap_compare¤   ¤   ¤   ¤   ¤   internal_ldap_compare
04b5ca #define ldap_compare_s¤ ¤   ¤   ¤   ¤   internal_ldap_compare_s
dbb9a9 #define ldap_count_entries¤ ¤   ¤   ¤   internal_ldap_count_entries
46e466 #define ldap_count_values¤  ¤   ¤   ¤   internal_ldap_count_values
0e50e1 #define ldap_count_values_len¤  ¤   ¤   internal_ldap_count_values_len
7df1c2 #define ldap_delete¤¤   ¤   ¤   ¤   ¤   internal_ldap_delete
05cec0 #define ldap_delete_result_entry¤   ¤   internal_ldap_delete_result_entry
aa786c #define ldap_delete_s¤  ¤   ¤   ¤   ¤   internal_ldap_delete_s
c19e05 #define ldap_destroy_cache¤ ¤   ¤   ¤   internal_ldap_destroy_cache
bdd2c2 #define ldap_disable_cache¤ ¤   ¤   ¤   internal_ldap_disable_cache
521de2 #define ldap_dn2ufn¤¤   ¤   ¤   ¤   ¤   internal_ldap_dn2ufn
0dfd2a #define ldap_enable_cache¤  ¤   ¤   ¤   internal_ldap_enable_cache
1b8026 #define ldap_enable_translation¤¤   ¤   internal_ldap_enable_translation
43bba5 #define ldap_err2string¤¤   ¤   ¤   ¤   internal_ldap_err2string
5b8218 #define ldap_explode_dn¤¤   ¤   ¤   ¤   internal_ldap_explode_dn
d0a65b #define ldap_explode_dns¤   ¤   ¤   ¤   internal_ldap_explode_dns
5a4bd6 #define ldap_first_attribute¤   ¤   ¤   internal_ldap_first_attribute
8268cf #define ldap_first_entry¤   ¤   ¤   ¤   internal_ldap_first_entry
831641 #define ldap_flush_cache¤   ¤   ¤   ¤   internal_ldap_flush_cache
1e09a5 #define ldap_free_friendlymap¤  ¤   ¤   internal_ldap_free_friendlymap
bf6868 #define ldap_free_urldesc¤  ¤   ¤   ¤   internal_ldap_free_urldesc
d948a1 #define ldap_friendly_name¤ ¤   ¤   ¤   internal_ldap_friendly_name
996d97 #define ldap_getfilter_free¤¤   ¤   ¤   internal_ldap_getfilter_free
9f678f #define ldap_getfirstfilter¤¤   ¤   ¤   internal_ldap_getfirstfilter
2047ef #define ldap_getnextfilter¤ ¤   ¤   ¤   internal_ldap_getnextfilter
12b722 #define ldap_get_dn¤¤   ¤   ¤   ¤   ¤   internal_ldap_get_dn
344ea6 #define ldap_get_values¤¤   ¤   ¤   ¤   internal_ldap_get_values
f8ed05 #define ldap_get_values_len¤¤   ¤   ¤   internal_ldap_get_values_len
40ef20 #define ldap_init¤  ¤   ¤   ¤   ¤   ¤   internal_ldap_init
4737c1 #define ldap_init_getfilter¤¤   ¤   ¤   internal_ldap_init_getfilter
67f5a9 #define ldap_init_getfilter_buf¤¤   ¤   internal_ldap_init_getfilter_buf
fab56a #define ldap_is_dns_dn¤ ¤   ¤   ¤   ¤   internal_ldap_is_dns_dn
99d4a1 #define ldap_is_ldap_url¤   ¤   ¤   ¤   internal_ldap_is_ldap_url
3e7961 #define ldap_kerberos_bind1¤¤   ¤   ¤   internal_ldap_kerberos_bind1
69f5bb #define ldap_kerberos_bind1_s¤  ¤   ¤   internal_ldap_kerberos_bind1_s
bee345 #define ldap_kerberos_bind2¤¤   ¤   ¤   internal_ldap_kerberos_bind2
ef8a3b #define ldap_kerberos_bind2_s¤  ¤   ¤   internal_ldap_kerberos_bind2_s
98f46c #define ldap_kerberos_bind_s¤   ¤   ¤   internal_ldap_kerberos_bind_s
fc6787 #define ldap_memfree¤   ¤   ¤   ¤   ¤   internal_ldap_memfree
f13df1 #define ldap_modify¤¤   ¤   ¤   ¤   ¤   internal_ldap_modify
a5e8c6 #define ldap_modify_s¤  ¤   ¤   ¤   ¤   internal_ldap_modify_s
830897 #define ldap_modrdn¤¤   ¤   ¤   ¤   ¤   internal_ldap_modrdn
03c2ff #define ldap_modrdn2¤   ¤   ¤   ¤   ¤   internal_ldap_modrdn2
0f9bf9 #define ldap_modrdn2_s¤ ¤   ¤   ¤   ¤   internal_ldap_modrdn2_s
7dbf6d #define ldap_modrdn_s¤  ¤   ¤   ¤   ¤   internal_ldap_modrdn_s
74a7a5 #define ldap_mods_free¤ ¤   ¤   ¤   ¤   internal_ldap_mods_free
974363 #define ldap_msgdelete¤ ¤   ¤   ¤   ¤   internal_ldap_msgdelete
53cbe2 #define ldap_msgfree¤   ¤   ¤   ¤   ¤   internal_ldap_msgfree
--3f1c 001f6c7efaa401201e4 Page 2 of PGPldapLibEntryMappings.h
6cbbc0 #define ldap_next_attribute¤¤   ¤   ¤   internal_ldap_next_attribute
2f1c92 #define ldap_next_entry¤¤   ¤   ¤   ¤   internal_ldap_next_entry
457f51 #define ldap_open¤  ¤   ¤   ¤   ¤   ¤   internal_ldap_open
73de5c #define ldap_perror¤¤   ¤   ¤   ¤   ¤   internal_ldap_perror
357954 #define ldap_result¤¤   ¤   ¤   ¤   ¤   internal_ldap_result
e54bd2 #define ldap_result2error¤  ¤   ¤   ¤   internal_ldap_result2error
22acde #define ldap_search¤¤   ¤   ¤   ¤   ¤   internal_ldap_search
1ccd3d #define ldap_search_s¤  ¤   ¤   ¤   ¤   internal_ldap_search_s
dbcb0f #define ldap_search_st¤ ¤   ¤   ¤   ¤   internal_ldap_search_st
6d4e6a #define ldap_setfilteraffixes¤  ¤   ¤   internal_ldap_setfilteraffixes
abd6c6 #define ldap_set_cache_options¤ ¤   ¤   internal_ldap_set_cache_options
3167f3 #define ldap_set_rebind_proc¤   ¤   ¤   internal_ldap_set_rebind_proc
9d6927 #define ldap_set_string_translators¤¤   internal_ldap_set_string_translators
eea72e #define ldap_simple_bind¤   ¤   ¤   ¤   internal_ldap_simple_bind
6ae9b1 #define ldap_simple_bind_s¤ ¤   ¤   ¤   internal_ldap_simple_bind_s
35765e #define ldap_sort_entries¤  ¤   ¤   ¤   internal_ldap_sort_entries
f32955 #define ldap_sort_strcasecmp¤   ¤   ¤   internal_ldap_sort_strcasecmp
58573f #define ldap_sort_values¤   ¤   ¤   ¤   internal_ldap_sort_values
fcc92c #define ldap_t61_to_8859¤   ¤   ¤   ¤   internal_ldap_t61_to_8859
49c34d #define ldap_translate_from_t61¤¤   ¤   internal_ldap_translate_from_t61
dd9a21 #define ldap_translate_to_t61¤  ¤   ¤   internal_ldap_translate_to_t61
ecb340 #define ldap_ufn_search_c¤  ¤   ¤   ¤   internal_ldap_ufn_search_c
b26313 #define ldap_ufn_search_ct¤ ¤   ¤   ¤   internal_ldap_ufn_search_ct
b6eaf7 #define ldap_ufn_search_s¤  ¤   ¤   ¤   internal_ldap_ufn_search_s
0c1151 #define ldap_ufn_setfilter¤ ¤   ¤   ¤   internal_ldap_ufn_setfilter
c92cbe #define ldap_ufn_setprefix¤ ¤   ¤   ¤   internal_ldap_ufn_setprefix
8a3882 #define ldap_ufn_timeout¤   ¤   ¤   ¤   internal_ldap_ufn_timeout
d76b0e #define ldap_unbind¤¤   ¤   ¤   ¤   ¤   internal_ldap_unbind
6120b5 #define ldap_unbind_s¤  ¤   ¤   ¤   ¤   internal_ldap_unbind_s
ecb825 #define ldap_uncache_entry¤ ¤   ¤   ¤   internal_ldap_uncache_entry
c99b5c #define ldap_uncache_request¤   ¤   ¤   internal_ldap_uncache_request
f9892b #define ldap_url_parse¤ ¤   ¤   ¤   ¤   internal_ldap_url_parse
ed896e #define ldap_url_search¤¤   ¤   ¤   ¤   internal_ldap_url_search
7381fc #define ldap_url_search_s¤  ¤   ¤   ¤   internal_ldap_url_search_s
e71cc6 #define ldap_url_search_st¤ ¤   ¤   ¤   internal_ldap_url_search_st
442835 #define ldap_value_free¤¤   ¤   ¤   ¤   internal_ldap_value_free
f6f593 #define ldap_value_free_len¤¤   ¤   ¤   internal_ldap_value_free_len
--f302 0006c06b6b1401201e5 Page 1 of PGPldapLibEntryUnmappings.h
bc38e5 /*
49bade ** Copyright (C) 1997 Network Associates, Inc. and its affiliates.
e0f124 ** All rights reserved.
2c7fe0 */
cbaf5a
bd7b7d #pragma once
10af5a
773227 #undef cldap_close
2a52ce #undef cldap_open
6efc69 #undef cldap_search_s
ea82dc #undef cldap_setretryinfo
24e57b #undef ldap_8859_to_t61
0fc8b6 #undef ldap_abandon
fab360 #undef ldap_add
9cd311 #undef ldap_add_result_entry
792ded #undef ldap_add_s
43d693 #undef ldap_bind
5e4f26 #undef ldap_bind_s
36d012 #undef ldap_build_filter
1bf98f #undef ldap_compare
d4aae2 #undef ldap_compare_s
ac51e3 #undef ldap_count_entries
dd6da2 #undef ldap_count_values
8b5070 #undef ldap_count_values_len
1ec7f0 #undef ldap_delete
74231d #undef ldap_delete_result_entry
cd0113 #undef ldap_delete_s
91bad1 #undef ldap_destroy_cache
f19fc3 #undef ldap_disable_cache
6de92b #undef ldap_dn2ufn
eba824 #undef ldap_enable_cache
d8bf25 #undef ldap_enable_translation
f308c2 #undef ldap_err2string
8fcdae #undef ldap_explode_dn
0fc43f #undef ldap_explode_dns
fd7e4e #undef ldap_first_attribute
a3cb59 #undef ldap_first_entry
18482a #undef ldap_flush_cache
508ccb #undef ldap_free_friendlymap
fb468b #undef ldap_free_urldesc
e6f5a3 #undef ldap_friendly_name
9835ae #undef ldap_getfilter_free
668f1c #undef ldap_getfirstfilter
ac16d9 #undef ldap_getnextfilter
07709f #undef ldap_get_dn
75842a #undef ldap_get_values
ec0d79 #undef ldap_get_values_len
17dfca #undef ldap_init
2f0ac6 #undef ldap_init_getfilter
2dd727 #undef ldap_init_getfilter_buf
863416 #undef ldap_is_dns_dn
cb6058 #undef ldap_is_ldap_url
649ada #undef ldap_kerberos_bind1
935630 #undef ldap_kerberos_bind1_s
12b0b2 #undef ldap_kerberos_bind2
bc73fd #undef ldap_kerberos_bind2_s
4ce49d #undef ldap_kerberos_bind_s
7940f1 #undef ldap_memfree
516ecf #undef ldap_modify
d20cb2 #undef ldap_modify_s
f3005a #undef ldap_modrdn
072ae7 #undef ldap_modrdn2
f3e561 #undef ldap_modrdn2_s
04e12f #undef ldap_modrdn_s
8ce843 #undef ldap_mods_free
df4646 #undef ldap_msgdelete
6884fb #undef ldap_msgfree
0333f6 #undef ldap_next_attribute
dff067 #undef ldap_next_entry
ac44f3 #undef ldap_open
a2289d #undef ldap_perror
6cf8f7 #undef ldap_result
--9bba 0014296699b401201e5 Page 2 of PGPldapLibEntryUnmappings.h
52c188 #undef ldap_result2error
2ce43d #undef ldap_search
886858 #undef ldap_search_s
651b2b #undef ldap_search_st
8a91e7 #undef ldap_setfilteraffixes
100bdc #undef ldap_set_cache_options
a8c744 #undef ldap_set_rebind_proc
e0cde4 #undef ldap_set_string_translators
176aed #undef ldap_simple_bind
fc5a15 #undef ldap_simple_bind_s
5c5d71 #undef ldap_sort_entries
fa6e01 #undef ldap_sort_strcasecmp
359f6e #undef ldap_sort_values
a6d5ca #undef ldap_t61_to_8859
02fe43 #undef ldap_translate_from_t61
1f2add #undef ldap_translate_to_t61
cd988b #undef ldap_ufn_search_c
87ffcd #undef ldap_ufn_search_ct
5a0d1a #undef ldap_ufn_search_s
5f203a #undef ldap_ufn_setfilter
bd51cb #undef ldap_ufn_setprefix
ef2e28 #undef ldap_ufn_timeout
d1d972 #undef ldap_unbind
594790 #undef ldap_unbind_s
6e05ff #undef ldap_uncache_entry
fc4d6f #undef ldap_uncache_request
5f85a2 #undef ldap_url_parse
4ca40e #undef ldap_url_search
6db696 #undef ldap_url_search_s
043487 #undef ldap_url_search_st
ec3902 #undef ldap_value_free
4212cf #undef ldap_value_free_len
--09e6 001bceb030e401201e6 Page 1 of PGPldapLibMain.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
249e5e ¤   $Id: PGPldapLibMain.c,v 1.7.10.1 1998/11/12 03:17:38 heller Exp $
cef7f7 ____________________________________________________________________________*/
bbaf5a
f28f22 #include <CodeFragments.h>
c990a3 #include <Threads.h>
e6af5a
c79ad2 ThreadID¤   ¤   gMainThreadID;
43af5a
5a671b pascal OSErr¤   INIT_PGPldapLib(const CFragInitBlock *theInitBlock);
e1e0e9 pascal void¤¤   TERM_PGPldapLib(void);
647c4a pascal OSErr ¤  __initialize(const CFragInitBlock *theInitBlock);
ffaeb2 pascal void ¤   __terminate(void);
59af5a
f248f4 ¤   pascal OSErr
3dafd9 INIT_PGPldapLib(const CFragInitBlock *theInitBlock)
2bbb36 {
f09c1a ¤   OSErr¤  err = noErr;
7f67c5 ¤
0076dd ¤   #pragma unused( theInitBlock )
e867c5 ¤
fb976b ¤   err = __initialize( theInitBlock );
b467c5 ¤
3a0d1f ¤   pgpLeaksBeginSession( "PGPsdkNetworkLib" );
d367c5 ¤
a0793c ¤   if (err == noErr) {
8a17d6 ¤   ¤   err = GetCurrentThread(&gMainThreadID);
309371 ¤   }
d5deb7 ¤   return( err );
bcefe6 }
56af5a
646685 ¤   pascal void
acfab0 TERM_PGPldapLib(void)
f6bb36 {
acd29d ¤   pgpLeaksEndSession();
82af5a
884a4b ¤   __terminate();
bcefe6 }
--900c 000016a7367401201e7 Page 1 of PGPldapLibUtils.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
472d5e ¤   $Id: PGPldapLibUtils.c,v 1.2.10.1 1998/11/12 03:17:38 heller Exp $
dcf7f7 ____________________________________________________________________________*/
e6af5a
8db1cb #include <ctype.h>
56bea3 #include <stdlib.h>
b0324c #include <string.h>
53af5a
5297da #include "PGPldapLibUtils.h"
c4a146 #include "pgpDebug.h"
870d08 #include "pgpMem.h"
b5af5a
f6a091 ¤   int
e0bdcc strncasecmp(const char *str1, const char *str2, unsigned nchars)
f4bb36 {
460fb1 ¤   // Taken from the MSL BeOS source
bd67c5 ¤
9bae36 ····int i;
1613b9 ····int diff;
f7af5a
056438 ····for (i = 0; i < nchars && *str1 && *str2; i++, str1++, str2++) {
6c4fe7 ········diff = toupper(*str1) - toupper(*str2);
20cee1 ········if (diff != 0) {
c43fe8 ············return (diff);
4a7fb0 ········}
096fe7 ····}
0caa7f ····if (i == nchars) {
f92c72 ········return (0);
536fe7 ····}
88ad6e ····if (*str1 == 0) {
f38ef9 ········return (-1);
596a79 ····} else {
7130c9 ········return (1);
aa6fe7 ····}
9defe6 }
3baf5a
cbeae2 // This implementation is from "getdn.c"
85af5a
d3d25c ¤   char *
7c376d strdup(char *str)
ffbb36 {
1015bd ¤   char¤   *p;
76af5a
a198e2 ¤   if ( (p = (char *) malloc( strlen( str ) + 1 )) == NULL )
7fef86 ¤   ¤   return( NULL );
f8af5a
8e0d84 ¤   strcpy( p, str );
cbaf5a
f02b43 ¤   return( p );
c5efe6 }
4faf5a
9c9007 // Replacements for Standard C memory allocation functions.
7bb654 // Prototypes are inherently define in <stdlib.h> because of
25f375 // our macro substitution in the prefix file.
75af5a
0059fc ¤   void *
601bc5 pgp_ldap_malloc(size_t size)
44bb36 {
3d6a2f ¤   return( pgpMemAlloc( size ) );
75efe6 }
39af5a
5759fc ¤   void *
157f19 pgp_ldap_calloc(size_t nmemb, size_t size)
bcbb36 {
1fd032 ¤   void¤   *result;
b667c5 ¤
013936 ¤   result = pgpMemAlloc( nmemb * size );
--8bac 001b8bacae5401201e7 Page 2 of PGPldapLibUtils.c
13e206 ¤   if( IsntNull( result ) )
65c7a1 ¤   {
aa4679 ¤   ¤   pgpClearMemory( result, nmemb * size );
eb9371 ¤   }
0a67c5 ¤
184c6e ¤   return( result );
bcefe6 }
40af5a
7459fc ¤   void *
6db37d pgp_ldap_realloc(void * ptr, size_t size)
9dbb36 {
02c5d8 ¤   return( pgpMemRealloc( ptr, size ) );
b8efe6 }
--93a9 0013066f01d401201e8 Page 1 of PGPldapLibUtils.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
36a7bb ¤   $Id: PGPldapLibUtils.h,v 1.2.10.1 1998/11/12 03:17:39 heller Exp $
38f7f7 ____________________________________________________________________________*/
94af5a
2dfd7f #ifndef Included_PGPldapLibUtils_h
0ca344 #define Included_PGPldapLibUtils_h
4baf5a
236bcf int¤¤   strncasecmp(const char *str1, const char *str2, unsigned nchars);
aa9c05 char ¤  *strdup(char *str);
b5af5a
07af5a
daaf5a
302841 #endif¶
--82a8 00085c6b797401201e9 Page 1 of AddressXlation.h
bc38e5 /*
8b92d5 ¤   File:¤  ¤   AddressXlation.h
4faf5a
994973 ¤   Copyright:¤ (C) 1984-1993 by Apple Computer, Inc., all rights reserved.
53af5a
757674 ¤   WARNING
68c0d9 ¤   This file was auto generated by the interfacer tool. Modifications
65ea11 ¤   must be made to the master file.
1dd83c ·
f07fe0 */
d9af5a
e47efd #ifndef __ADDRESSXLATION__
491a8b #define __ADDRESSXLATION__
5baf5a
89827b #ifndef __MACTCPCOMMONTYPES__
063205 #include "MacTCP.h"
d97454 #endif
a8af5a
2abf2d #define NUM_ALT_ADDRS 4
95af5a
95a9a8 #if defined(powerc) || defined (__powerc)
e7af46 #pragma options align=mac68k
ab7454 #endif
2f560f struct hostInfo {
433d1f ¤   long¤   ¤   ¤   ¤   ¤   ¤   rtnCode;
d03ea3 ¤   char¤   ¤   ¤   ¤   ¤   ¤   cname[255];
89516f ¤   unsigned long¤  ¤   ¤   ¤   addr[NUM_ALT_ADDRS];
ad82f7 };
451cbc #if defined(powerc) || defined(__powerc)
0b7c46 #pragma options align=reset
e27454 #endif
e6af5a
cd5ec6 typedef struct hostInfo hostInfo;
f0af5a
817fc4 enum AddrClasses {
0065b0 ¤   A¤  ¤   ¤   ¤   ¤   ¤   ¤   = 1,
1a1c05 ¤   NS,
0e795e ¤   CNAME¤  ¤   ¤   ¤   ¤   ¤   = 5,
f084e8 ¤   HINFO¤  ¤   ¤   ¤   ¤   ¤   = 13,
02c02a ¤   MX¤ ¤   ¤   ¤   ¤   ¤   ¤   = 15,
0e3614 ¤   lastClass¤  ¤   ¤   ¤   ¤   = 32767
9f82f7 };
98af5a
832d1d typedef enum AddrClasses AddrClasses;
91af5a
99a9a8 #if defined(powerc) || defined (__powerc)
70af46 #pragma options align=mac68k
9a7454 #endif
fc1521 struct HInfoRec {
4bc40b ¤   char¤   ¤   ¤   ¤   ¤   ¤   cpuType[30];
63be40 ¤   char¤   ¤   ¤   ¤   ¤   ¤   osType[30];
f782f7 };
351cbc #if defined(powerc) || defined(__powerc)
e47c46 #pragma options align=reset
6c7454 #endif
69af5a
149502 typedef struct HInfoRec HInfoRec;
e8af5a
89a9a8 #if defined(powerc) || defined (__powerc)
13af46 #pragma options align=mac68k
bc7454 #endif
4400e1 struct MXRec {
69c9c0 ¤   unsigned short¤ ¤   ¤   ¤   preference;
e148a3 ¤   char¤   ¤   ¤   ¤   ¤   ¤   exchange[255];
8382f7 };
9e1cbc #if defined(powerc) || defined(__powerc)
ec7c46 #pragma options align=reset
707454 #endif
4baf5a
ce5f2a typedef struct MXRec MXRec;
e2af5a
85a9a8 #if defined(powerc) || defined (__powerc)
--ca06 000a5ab2274401201e9 Page 2 of AddressXlation.h
2baf46 #pragma options align=mac68k
517454 #endif
0175e7 struct returnRec {
523d1f ¤   long¤   ¤   ¤   ¤   ¤   ¤   rtnCode;
6c3ea3 ¤   char¤   ¤   ¤   ¤   ¤   ¤   cname[255];
73e29a ¤   union {
b13e5c ¤   ¤   unsigned long¤  ¤   ¤   ¤   addr[NUM_ALT_ADDRS];
0da492 ¤   ¤   struct HInfoRec¤¤   ¤   ¤   hinfo;
6095a7 ¤   ¤   struct MXRec¤   ¤   ¤   ¤   mx;
49c4a0 ¤   } rdata;
0f82f7 };
6f1cbc #if defined(powerc) || defined(__powerc)
3c7c46 #pragma options align=reset
1d7454 #endif
6aaf5a
d20670 typedef struct returnRec returnRec;
98af5a
4fa9a8 #if defined(powerc) || defined (__powerc)
51af46 #pragma options align=mac68k
8f7454 #endif
1e7318 struct cacheEntryRecord {
1a9952 ¤   char¤   ¤   ¤   ¤   ¤   ¤   *cname;
7bb4e2 ¤   unsigned short¤ ¤   ¤   ¤   type;
b971fa ¤   unsigned short¤ ¤   ¤   ¤   cacheClass;
0066a1 ¤   unsigned long¤  ¤   ¤   ¤   ttl;
74e29a ¤   union {
68da33 ¤   ¤   char¤   ¤   ¤   ¤   ¤   ¤   *name;
79aa70 ¤   ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   addr;
04c4a0 ¤   } rdata;
b782f7 };
041cbc #if defined(powerc) || defined(__powerc)
287c46 #pragma options align=reset
ab7454 #endif
64af5a
4bc790 typedef struct cacheEntryRecord cacheEntryRecord;
e3af5a
d43379 #ifdef __cplusplus
396dad extern "C" {
df7454 #endif
cbaf5a
b9b7e1 typedef pascal void (*EnumResultProcPtr)(struct cacheEntryRecord *cacheEntryRec¶
6c9368 ordPtr, char *userDataPtr);
01af5a
ad73f4 enum {
ba3e31 ¤   uppEnumResultProcInfo = kPascalStackBased
011248 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(struct cacheEntryRecord*¶
10b264 )))
8f75d0 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char*)))
4382f7 };
e9af5a
d1fdb7 #if TARGET_RT_MAC_CFM
480cfb typedef UniversalProcPtr EnumResultUPP;
8faf5a
1176e9 #define CallEnumResultProc(userRoutine, cacheEntryRecordPtr, userDataPtr)¤  ¶
44a99a ¤   \
5f4706 ¤   ¤   CallUniversalProc((UniversalProcPtr)userRoutine, uppEnumResultProcInfo,¶
7bf34b ·cacheEntryRecordPtr, userDataPtr)
859629 #define NewEnumResultProc(userRoutine)¤ ¤   \
b52af5 ¤   ¤   (EnumResultUPP) NewRoutineDescriptor((ProcPtr)userRoutine, uppEnumResul¶
7a0e0e tProcInfo, GetCurrentISA())
25db21 #else
43ae7c typedef EnumResultProcPtr EnumResultUPP;
d7af5a
9976e9 #define CallEnumResultProc(userRoutine, cacheEntryRecordPtr, userDataPtr)¤  ¶
93a99a ¤   \
109c1c ¤   ¤   (*userRoutine)(cacheEntryRecordPtr, userDataPtr)
6d9629 #define NewEnumResultProc(userRoutine)¤ ¤   \
9a8697 ¤   ¤   (EnumResultUPP)(userRoutine)
707454 #endif
07af5a
42865e typedef pascal void (*ResultProcPtr)(struct hostInfo *hostInfoPtr, char *userDa¶
a5dc33 taPtr);
--d796 001111f9408401201e9 Page 3 of AddressXlation.h
e0af5a
9673f4 enum {
a91169 ¤   uppResultProcInfo = kPascalStackBased
2295fd ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(struct hostInfo*)))
cc75d0 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char*)))
ba82f7 };
e7af5a
f4fdb7 #if TARGET_RT_MAC_CFM
79f6a4 typedef UniversalProcPtr ResultUPP;
21af5a
aa2e03 #define CallResultProc(userRoutine, hostInfoPtr, userDataPtr)¤  ¤   \
aa83fa ¤   ¤   CallUniversalProc((UniversalProcPtr)userRoutine, uppResultProcInfo, hos¶
6497f0 tInfoPtr, userDataPtr)
e95435 #define NewResultProc(userRoutine)¤ ¤   \
b7fa16 ¤   ¤   (ResultUPP) NewRoutineDescriptor((ProcPtr)userRoutine, uppResultProcInf¶
1b47e7 o, GetCurrentISA())
97db21 #else
0832c4 typedef ResultProcPtr ResultUPP;
f1af5a
572e03 #define CallResultProc(userRoutine, hostInfoPtr, userDataPtr)¤  ¤   \
11bbaa ¤   ¤   (*userRoutine)(hostInfoPtr, userDataPtr)
bd5435 #define NewResultProc(userRoutine)¤ ¤   \
f6e45a ¤   ¤   (ResultUPP)(userRoutine)
a47454 #endif
9aaf5a
48a9c4 typedef pascal void (*ResultProc2ProcPtr)(struct returnRec *returnRecPtr, char ¶
6bdb15 *userDataPtr);
81af5a
b173f4 enum {
5495c8 ¤   uppResultProc2ProcInfo = kPascalStackBased
1cf46d ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(struct returnRec*)))
6f75d0 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char*)))
0c82f7 };
49af5a
21fdb7 #if TARGET_RT_MAC_CFM
26e51f typedef UniversalProcPtr ResultProc2UPP;
14af5a
776c71 #define CallResultProc2Proc(userRoutine, returnRecPtr, userDataPtr)¤¤   \
c73eb9 ¤   ¤   CallUniversalProc((UniversalProcPtr)userRoutine, uppResultProc2ProcInfo¶
4c0f78 , returnRecPtr, userDataPtr)
24ac9d #define NewResultProc2Proc(userRoutine)¤¤   \
61a9f5 ¤   ¤   (ResultProc2UPP) NewRoutineDescriptor((ProcPtr)userRoutine, uppResultPr¶
cd6ac4 oc2ProcInfo, GetCurrentISA())
bbdb21 #else
9034c4 typedef ResultProc2ProcPtr ResultProc2UPP;
68af5a
316c71 #define CallResultProc2Proc(userRoutine, returnRecPtr, userDataPtr)¤¤   \
b5dcfa ¤   ¤   (*userRoutine)(returnRecPtr, userDataPtr)
85ac9d #define NewResultProc2Proc(userRoutine)¤¤   \
1d9405 ¤   ¤   (ResultProc2UPP)(userRoutine)
1b7454 #endif
0baf5a
2959ac typedef ResultProc2ProcPtr ResultProc2Ptr;
2daf5a
bc1ec7 extern OSErr OpenResolver(char *fileName);
407eaa extern OSErr StrToAddr(char *hostName, struct hostInfo *hostInfoPtr, ResultUPP ¶
96f573 ResultProc, char *userDataPtr);
3d9a74 extern OSErr AddrToStr(unsigned long addr, char *addrStr);
01a7c8 extern OSErr EnumCache(EnumResultUPP enumResultProc, char *userDataPtr);
cf2dab extern OSErr AddrToName(ip_addr addr, struct hostInfo *hostInfoPtr, ResultUPP R¶
c764ad esultProc, char *userDataPtr);
7a64a3 extern OSErr HInfo(char *hostName, struct returnRec *returnRecPtr, ResultProc2P¶
c31022 tr resultProc, char *userDataPtr);
2307df extern OSErr MXInfo(char *hostName, struct returnRec *returnRecPtr, ResultProc2¶
6dc532 Ptr resultProc, char *userDataPtr);
7bb397 extern OSErr CloseResolver(void);
9c3379 #ifdef __cplusplus
11efe6 }
577454 #endif
aaaf5a
1e7454 #endif
11af5a
--fddd 001aa12f973401201ea Page 1 of GetMyIPAddr.h
bc38e5 /*
03df36 ¤   File:¤  ¤   GetMyIPAddr.h
96af5a
d14973 ¤   Copyright:¤ (C) 1984-1993 by Apple Computer, Inc., all rights reserved.
0baf5a
797674 ¤   WARNING
6dc0d9 ¤   This file was auto generated by the interfacer tool. Modifications
9fea11 ¤   must be made to the master file.
d5af5a
717fe0 */
41af5a
c44501 #ifndef __GETMYIPADDR__
b8a350 #define __GETMYIPADDR__
49af5a
d0827b #ifndef __MACTCPCOMMONTYPES__
86fcc5 #include <MacTCPCommonTypes.h>
447454 #endif
7eaf5a
662c58 #define ipctlGetAddr 15¤¤   ¤   /* csCode to get our IP address */
89af5a
e092f7 #define GetIPParamBlockHeader ¤ \
4cd067 ¤   struct QElem *qLink; ¤  ¤   \
51121a ¤   short qType; ¤  ¤   ¤   ¤   \
afdfda ¤   short ioTrap; ¤ ¤   ¤   ¤   \
0bf239 ¤   Ptr ioCmdAddr; ¤¤   ¤   ¤   \
c582df ¤   ProcPtr ioCompletion; ¤ ¤   \
12f715 ¤   OSErr ioResult; ¤   ¤   ¤   \
358f89 ¤   StringPtr ioNamePtr; ¤  ¤   \
c6dcca ¤   short ioVRefNum;¤   ¤   ¤   \
0d05bb ¤   short ioCRefNum;¤   ¤   ¤   \
1d824e ¤   short csCode
0baf5a
60a9a8 #if defined(powerc) || defined (__powerc)
14af46 #pragma options align=mac68k
857454 #endif
69bfb3 struct GetAddrParamBlock {
bab053 ¤   GetIPParamBlockHeader;¤ ¤   /* standard I/O header */¤
e14268 ¤   ip_addr¤¤   ourAddress;¤¤   /* our IP address */
167c04 ¤   long¤   ¤   ourNetMask;¤¤   /* our IP net mask */
7b82f7 };
b91cbc #if defined(powerc) || defined(__powerc)
df7c46 #pragma options align=reset
c17454 #endif
dbaf5a
187454 #endif
aaaf5a
--31c0 000cb71af29401201eb Page 1 of MacTCPCommonTypes.h
bc38e5 /*
fdd865 ¤   File:¤  ¤   MacTCPCommonTypes.h
20af5a
c14973 ¤   Copyright:¤ (C) 1984-1993 by Apple Computer, Inc., all rights reserved.
f8af5a
687674 ¤   WARNING
2fc0d9 ¤   This file was auto generated by the interfacer tool. Modifications
4dea11 ¤   must be made to the master file.
64af5a
687fe0 */
9baf5a
9fcad3 #error wrong file--see note in MacTCP.h
7baf5a
afaf5a
1e827b #ifndef __MACTCPCOMMONTYPES__
03d64f #define __MACTCPCOMMONTYPES__
96af5a
280ab2 #ifndef __TYPES__
00728f #include <Types.h>
e37454 #endif
51af5a
168b17 /* MacTCP return Codes in the range -23000 through -23049 */
2068ad #define inProgress¤ ¤   ¤   ¤   1¤  ¤   ¤   /* I/O in progress */
e5af5a
452bd5 #define ipBadLapErr¤¤   ¤   ¤   -23000¤ ¤   /* bad network configuration */
16e27a #define ipBadCnfgErr¤   ¤   ¤   -23001¤ ¤   /* bad IP configuration error */
28366b #define ipNoCnfgErr¤¤   ¤   ¤   -23002¤ ¤   /* missing IP or LAP configuration ¶
068f53 error */
4d3bdc #define ipLoadErr¤  ¤   ¤   ¤   -23003¤ ¤   /* error in MacTCP load */
2d0879 #define ipBadAddr¤  ¤   ¤   ¤   -23004¤ ¤   /* error in getting address */
dd383e #define connectionClosing¤  ¤   -23005¤ ¤   /* connection is closing */
46fa22 #define invalidLength¤  ¤   ¤   -23006
f506cc #define connectionExists¤   ¤   -23007¤ ¤   /* request conflicts with existing ¶
71c624 connection */
ce4b30 #define connectionDoesntExist¤  -23008¤ ¤   /* connection does not exist */
384e94 #define insufficientResources¤  -23009¤ ¤   /* insufficient resources to perfor¶
33be8c m request */
fe046e #define invalidStreamPtr¤   ¤   -23010
a4a9c1 #define streamAlreadyOpen¤  ¤   -23011
6cb819 #define connectionTerminated¤   -23012
f5a6ff #define invalidBufPtr¤  ¤   ¤   -23013
de9d37 #define invalidRDS¤ ¤   ¤   ¤   -23014
c7a372 #define invalidWDS¤ ¤   ¤   ¤   -23014
b0d404 #define openFailed¤ ¤   ¤   ¤   -23015
179af6 #define commandTimeout¤ ¤   ¤   -23016
b46f0d #define duplicateSocket¤¤   ¤   -23017
c4af5a
87db79 /* Error codes from internal IP functions */
31fb73 #define ipDontFragErr¤  ¤   ¤   -23032¤ ¤   /* Packet too large to send w/o fra¶
126987 gmenting */
d1a540 #define ipDestDeadErr¤  ¤   ¤   -23033¤ ¤   /* destination not responding */
c99244 #define icmpEchoTimeoutErr¤ ¤   -23035¤ ¤   /* ICMP echo timed-out */
912c07 #define ipNoFragMemErr¤ ¤   ¤   -23036¤ ¤   /* no memory to send fragmented pkt¶
08495d ·*/
07ddf6 #define ipRouteErr¤ ¤   ¤   ¤   -23037¤ ¤   /* can't route packet off-net */
a6af5a
c30679 #define nameSyntaxErr¤  ¤   ¤   -23041
71caca #define cacheFault¤ ¤   ¤   ¤   -23042
8c43e9 #define noResultProc¤   ¤   ¤   -23043
cca619 #define noNameServer¤   ¤   ¤   -23044
bc4e26 #define authNameErr¤¤   ¤   ¤   -23045
5f4db2 #define noAnsErr¤   ¤   ¤   ¤   -23046
e71105 #define dnrErr¤ ¤   ¤   ¤   ¤   -23047
095056 #define outOfMemory¤¤   ¤   ¤   -23048
b2af5a
08fe39 #define BYTES_16WORD¤   ¤   ¤   2¤  ¤   ¤   /* bytes per 16 bit ip word */
e1acfb #define BYTES_32WORD¤   ¤   ¤   4¤  ¤   ¤   /* bytes per 32 bit ip word */
fde566 #define BYTES_64WORD¤   ¤   ¤   8¤  ¤   ¤   /* bytes per 64 bit ip word */
c5af5a
c8d91a typedef unsigned char b_8;¤ ¤   ¤   ¤   ¤   /* 8-bit quantity */
42d6ad typedef unsigned short b_16;¤   ¤   ¤   ¤   /* 16-bit quantity */
cb038c typedef unsigned long b_32;¤¤   ¤   ¤   ¤   /* 32-bit quantity */
--70c7 0009f091b00401201eb Page 2 of MacTCPCommonTypes.h
7ce744 typedef b_32 ip_addr;¤  ¤   ¤   ¤   ¤   ¤   /* IP address is 32-bits */
99af5a
eea9a8 #if defined(powerc) || defined (__powerc)
e5af46 #pragma options align=mac68k
e17454 #endif
9de1c7 struct ip_addrbytes {
1ee29a ¤   union {
fad835 ¤   ¤   b_32¤   ¤   ¤   ¤   ¤   ¤   addr;
812ad6 ¤   ¤   char¤   ¤   ¤   ¤   ¤   ¤   byte[4];
f1180d ¤   } a;
7d82f7 };
ad1cbc #if defined(powerc) || defined(__powerc)
bb7c46 #pragma options align=reset
427454 #endif
37af5a
6b9c02 typedef struct ip_addrbytes ip_addrbytes;
c8af5a
66a9a8 #if defined(powerc) || defined (__powerc)
92af46 #pragma options align=mac68k
527454 #endif
77943f struct wdsEntry {
a8df60 ¤   unsigned short¤ ¤   ¤   ¤   length;
c43c49 ¤   char¤   ¤   ¤   ¤   ¤   ¤   *ptr;
f482f7 };
0a1cbc #if defined(powerc) || defined(__powerc)
9b7c46 #pragma options align=reset
a47454 #endif
99af5a
aad96a typedef struct wdsEntry wdsEntry;
56af5a
58a9a8 #if defined(powerc) || defined (__powerc)
e7af46 #pragma options align=mac68k
667454 #endif
239ffb struct rdsEntry {
4fdf60 ¤   unsigned short¤ ¤   ¤   ¤   length;
8f3c49 ¤   char¤   ¤   ¤   ¤   ¤   ¤   *ptr;
fa82f7 };
de1cbc #if defined(powerc) || defined(__powerc)
6e7c46 #pragma options align=reset
b37454 #endif
38af5a
d58b9e typedef struct rdsEntry rdsEntry;
e4af5a
f919cd typedef unsigned long BufferPtr;
c2af5a
944bd0 typedef unsigned long StreamPtr;
42af5a
49b2a9 enum ICMPMsgType {
bd1db0 ¤   netUnreach,
4c486f ¤   hostUnreach,
e26510 ¤   protocolUnreach,
c06a46 ¤   portUnreach,
d13782 ¤   fragReqd,
725359 ¤   sourceRouteFailed,
8e909b ¤   timeExceeded,
d06b3d ¤   parmProblem,
b8a78e ¤   missingOption,
95141f ¤   lastICMPMsgType¤¤   ¤   ¤   = 32767
9882f7 };
40af5a
7d8a98 typedef enum ICMPMsgType ICMPMsgType;
49af5a
09bad9 typedef b_16 ip_port;
35af5a
54a9a8 #if defined(powerc) || defined (__powerc)
e2af46 #pragma options align=mac68k
1e7454 #endif
7be032 struct ICMPReport {
f75818 ¤   StreamPtr¤  ¤   ¤   ¤   ¤   streamPtr;
dc7de2 ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   localHost;
671426 ¤   ip_port¤¤   ¤   ¤   ¤   ¤   localPort;
9feb47 ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   remoteHost;
--7605 0000819810c401201eb Page 3 of MacTCPCommonTypes.h
707434 ¤   ip_port¤¤   ¤   ¤   ¤   ¤   remotePort;
9691dc ¤   short¤  ¤   ¤   ¤   ¤   ¤   reportType;
d1d093 ¤   unsigned short¤ ¤   ¤   ¤   optionalAddlInfo;
d97c07 ¤   unsigned long¤  ¤   ¤   ¤   optionalAddlInfoPtr;
3482f7 };
451cbc #if defined(powerc) || defined(__powerc)
cf7c46 #pragma options align=reset
867454 #endif
3caf5a
2d1365 typedef struct ICMPReport ICMPReport;
adaf5a
542671 typedef OSErr (*OSErrProcPtr)();
dcaf5a
a973f4 enum {
cd7dc7 ¤   uppOSErrProcInfo = kCStackBased
41ac1e ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
5582f7 };
9baf5a
27fdb7 #if TARGET_RT_MAC_CFM
ad40df typedef UniversalProcPtr OSErrUPP;
93af5a
a39af5 #define CallOSErrProc(userRoutine)¤ ¤   \
afa3db ¤   ¤   CallUniversalProc((UniversalProcPtr)userRoutine, uppOSErrProcInfo)
256f19 #define NewOSErrProc(userRoutine)¤  ¤   \
be47c6 ¤   ¤   (OSErrUPP) NewRoutineDescriptor((ProcPtr)userRoutine, uppOSErrProcInfo,¶
ee4b03 ·GetCurrentISA())
9ddb21 #else
61ae98 typedef OSErrProcPtr OSErrUPP;
09af5a
b29af5 #define CallOSErrProc(userRoutine)¤ ¤   \
4c169b ¤   ¤   (*userRoutine)()
326f19 #define NewOSErrProc(userRoutine)¤  ¤   \
ae2f66 ¤   ¤   (OSErrUPP)(userRoutine)
7b7454 #endif
4baf5a
8e2c39 typedef Ptr (*PtrProcPtr)();
e2af5a
5373f4 enum {
377399 ¤   uppPtrProcInfo = kCStackBased
21bbc9 ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(Ptr)))
3682f7 };
a3af5a
53fdb7 #if TARGET_RT_MAC_CFM
553a81 typedef UniversalProcPtr PtrUPP;
3eaf5a
44ec75 #define CallPtrProc(userRoutine)¤   ¤   \
95f215 ¤   ¤   CallUniversalProc((UniversalProcPtr)userRoutine, uppPtrProcInfo)
dbcef0 #define NewPtrProc(userRoutine)¤¤   \
69c809 ¤   ¤   (PtrUPP) NewRoutineDescriptor((ProcPtr)userRoutine, uppPtrProcInfo, Get¶
705af5 CurrentISA())
18db21 #else
95b2f6 typedef PtrProcPtr PtrUPP;
55af5a
b0ec75 #define CallPtrProc(userRoutine)¤   ¤   \
5a169b ¤   ¤   (*userRoutine)()
e7cef0 #define NewPtrProc(userRoutine)¤¤   \
c3ef60 ¤   ¤   (PtrUPP)(userRoutine)
cd7454 #endif
c8af5a
ac9f8c typedef Boolean (*BooleanProcPtr)();
c1af5a
7173f4 enum {
121234 ¤   uppBooleanProcInfo = kCStackBased
441f2f ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(Boolean)))
5c82f7 };
66af5a
89fdb7 #if TARGET_RT_MAC_CFM
b62ecf typedef UniversalProcPtr BooleanUPP;
f9af5a
02c09a #define CallBooleanProc(userRoutine)¤   ¤   \
6e2b6a ¤   ¤   CallUniversalProc((UniversalProcPtr)userRoutine, uppBooleanProcInfo)
088f56 #define NewBooleanProc(userRoutine)¤¤   \
--9046 00191095e79401201eb Page 4 of MacTCPCommonTypes.h
636fcf ¤   ¤   (BooleanUPP) NewRoutineDescriptor((ProcPtr)userRoutine, uppBooleanProcI¶
3998ca nfo, GetCurrentISA())
e0db21 #else
482c23 typedef BooleanProcPtr BooleanUPP;
b6af5a
7fc09a #define CallBooleanProc(userRoutine)¤   ¤   \
68169b ¤   ¤   (*userRoutine)()
1e8f56 #define NewBooleanProc(userRoutine)¤¤   \
0d64e2 ¤   ¤   (BooleanUPP)(userRoutine)
b97454 #endif
37af5a
ce16a5 typedef void (*voidProcPtr)();
f4af5a
6d7454 #endif
91af5a
--4eee 000477df704401201ec Page 1 of MiscIPPB.h
bc38e5 /*
a59c70 ¤   File:¤  ¤   MiscIPPB.h
83af5a
914973 ¤   Copyright:¤ (C) 1984-1993 by Apple Computer, Inc., all rights reserved.
85af5a
b37674 ¤   WARNING
29c0d9 ¤   This file was auto generated by the interfacer tool. Modifications
17ea11 ¤   must be made to the master file.
a7af5a
617fe0 */
1daf5a
208dd5 #ifndef __MISCIPPB__
287d6b #define __MISCIPPB__
f5af5a
f1827b #ifndef __MACTCPCOMMONTYPES__
f5fcc5 #include <MacTCPCommonTypes.h>
347454 #endif
f2af5a
103467 #ifndef __APPLETALK__
b31e27 #include <AppleTalk.h>
ce7454 #endif
78af5a
8c564b #define ipctlEchoICMP 17¤   ¤   ¤   /* send icmp echo */
101b22 #define ipctlLAPStats 19¤   ¤   ¤   /* get lap stats */
53af5a
85f9e0 #define IPParamBlockHeader ¤¤   \
cad067 ¤   struct QElem *qLink; ¤  ¤   \
d6121a ¤   short qType; ¤  ¤   ¤   ¤   \
3cdfda ¤   short ioTrap; ¤ ¤   ¤   ¤   \
9cf239 ¤   Ptr ioCmdAddr; ¤¤   ¤   ¤   \
8882df ¤   ProcPtr ioCompletion; ¤ ¤   \
a0f715 ¤   OSErr ioResult; ¤   ¤   ¤   \
dd8f89 ¤   StringPtr ioNamePtr; ¤  ¤   \
2cdcca ¤   short ioVRefNum;¤   ¤   ¤   \
f605bb ¤   short ioCRefNum;¤   ¤   ¤   \
62824e ¤   short csCode
98af5a
e21832 typedef void (*ICMPEchoNotifyProcPtr)(struct ICMPParamBlock *iopb);
7baf5a
2473f4 enum {
6026d5 ¤   uppICMPEchoNotifyProcInfo = kCStackBased
1f28ad ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(struct ICMPParamBlock*)))
5282f7 };
1eaf5a
0bfdb7 #if TARGET_RT_MAC_CFM
241cbb typedef UniversalProcPtr ICMPEchoNotifyUPP;
acaf5a
3daa5f #define CallICMPEchoNotifyProc(userRoutine, iopb)¤  ¤   \
b777a5 ¤   ¤   CallUniversalProc((UniversalProcPtr)userRoutine, uppICMPEchoNotifyProcI¶
e3c261 nfo, iopb)
ea78ae #define NewICMPEchoNotifyProc(userRoutine)¤ ¤   \
166668 ¤   ¤   (ICMPEchoNotifyUPP) NewRoutineDescriptor((ProcPtr)userRoutine, uppICMPE¶
1de765 choNotifyProcInfo, GetCurrentISA())
35db21 #else
00c5c6 typedef ICMPEchoNotifyProcPtr ICMPEchoNotifyUPP;
66af5a
c8aa5f #define CallICMPEchoNotifyProc(userRoutine, iopb)¤  ¤   \
794961 ¤   ¤   (*userRoutine)(iopb)
2578ae #define NewICMPEchoNotifyProc(userRoutine)¤ ¤   \
ba37e6 ¤   ¤   (ICMPEchoNotifyUPP)(userRoutine)
147454 #endif
6faf5a
677a6b typedef ICMPEchoNotifyProcPtr ICMPEchoNotifyProc;
ecaf5a
6da9a8 #if defined(powerc) || defined (__powerc)
f4af46 #pragma options align=mac68k
0c7454 #endif
78cc51 struct IPParamBlock {
53ed94 ¤   IPParamBlockHeader;¤¤   ¤   ¤   ¤   ¤   ¤   ¤   /* standard I/O header */
62e29a ¤   union {
f8c86c ¤   ¤   struct {
478972 ¤   ¤   ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   dest;¤  ¤   /* echo to IP address */
--65f7 00085d14e20401201ec Page 2 of MiscIPPB.h
3f8c12 ¤   ¤   ¤   wdsEntry¤   ¤   ¤   ¤   ¤   data;
0269a3 ¤   ¤   ¤   short¤  ¤   ¤   ¤   ¤   ¤   timeout;
28d2ce ¤   ¤   ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   options;
e2d09a ¤   ¤   ¤   unsigned short¤ ¤   ¤   ¤   optLength;
a70a44 ¤   ¤   ¤   ICMPEchoNotifyProc¤ ¤   ¤   icmpCompletion;
3e7c4b ¤   ¤   ¤   unsigned long¤  ¤   ¤   ¤   userDataPtr;
b08959 ¤   ¤   } IPEchoPB;
58c86c ¤   ¤   struct {
378e2a ¤   ¤   ¤   struct LAPStats¤¤   ¤   ¤   *lapStatsPtr;
d637e2 ¤   ¤   } LAPStatsPB;
7e914c ¤   } csParam;
9282f7 };
0c1cbc #if defined(powerc) || defined(__powerc)
887c46 #pragma options align=reset
477454 #endif
52af5a
7ba9a8 #if defined(powerc) || defined (__powerc)
50af46 #pragma options align=mac68k
8e7454 #endif
52f4fe struct ICMPParamBlock {
d2ed94 ¤   IPParamBlockHeader;¤¤   ¤   ¤   ¤   ¤   ¤   ¤   /* standard I/O header */
2d8f90 ¤   short¤  ¤   ¤   ¤   ¤   ¤   params[11];
937dfd ¤   struct {
973366 ¤   ¤   unsigned long¤  ¤   ¤   echoRequestOut;¤¤   /* time in ticks of when th¶
1c8937 e echo request went out */
62a9d6 ¤   ¤   unsigned long¤  ¤   ¤   echoReplyIn;¤   ¤   /* time in ticks of when th¶
da8841 e reply was received */
d68be9 ¤   ¤   struct rdsEntry¤¤   ¤   echoedData;¤¤   ¤   /* data received in responc¶
ab7754 e */
3020f0 ¤   ¤   Ptr¤¤   ¤   ¤   ¤   ¤   options;
415679 ¤   ¤   unsigned long¤  ¤   ¤   userDataPtr;
899941 ¤   } icmpEchoInfo;
a382f7 };
5a1cbc #if defined(powerc) || defined(__powerc)
ce7c46 #pragma options align=reset
b97454 #endif
43af5a
94a9a8 #if defined(powerc) || defined (__powerc)
a4af46 #pragma options align=mac68k
937454 #endif
e7ff8f struct LAPStats {
9aad1d ¤   short¤  ¤   ¤   ¤   ¤   ¤   ifType;
69063f ¤   char¤   ¤   ¤   ¤   ¤   ¤   *ifString;
12c3d8 ¤   short¤  ¤   ¤   ¤   ¤   ¤   ifMaxMTU;
770236 ¤   long¤   ¤   ¤   ¤   ¤   ¤   ifSpeed;
b629bc ¤   short¤  ¤   ¤   ¤   ¤   ¤   ifPhyAddrLength;
6486e0 ¤   char¤   ¤   ¤   ¤   ¤   ¤   *ifPhysicalAddress;
19e29a ¤   union {
89711c ¤   ¤   struct arp_entry¤   ¤   ¤   *arp_table;
fd2b57 ¤   ¤   struct nbp_entry¤   ¤   ¤   *nbp_table;
a3484f ¤   } AddrXlation;
ef2833 ¤   short¤  ¤   ¤   ¤   ¤   ¤   slotNumber;
9982f7 };
5a1cbc #if defined(powerc) || defined(__powerc)
527c46 #pragma options align=reset
d67454 #endif
11af5a
f9dbef typedef struct LAPStats LAPStats;
83af5a
59a166 #define NBP_TABLE_SIZE 20
70af5a
16eb24 #define NBP_MAX_NAME_SIZE 16+10+2
cbaf5a
b9a9a8 #if defined(powerc) || defined (__powerc)
54af46 #pragma options align=mac68k
487454 #endif
40ada9 struct nbp_entry {
e591dc ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   ip_address;¤¤   /* IP address */
4138ed ¤   AddrBlock¤  ¤   ¤   ¤   ¤   at_address;¤¤   /* matching AppleTalk address */
87dff7 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   gateway;¤   ¤   /* TRUE if entry for a gateway ¶
b67fe0 */
851922 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   valid;¤ ¤   ¤   /* TRUE if LAP address is valid¶
--89e2 001fe47075f401201ec Page 3 of MiscIPPB.h
47495d ·*/
03f507 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   probing;¤   ¤   /* TRUE if NBP lookup pending */
1be181 ¤   long¤   ¤   ¤   ¤   ¤   ¤   age;¤   ¤   ¤   /* ticks since cache entry veri¶
23c42a fied */
dc347b ¤   long¤   ¤   ¤   ¤   ¤   ¤   access;¤¤   ¤   /* ticks since last access */
f9b038 ¤   char¤   ¤   ¤   ¤   ¤   ¤   filler[116];¤   /* for internal use only !!! */
a882f7 };
e91cbc #if defined(powerc) || defined(__powerc)
b27c46 #pragma options align=reset
c37454 #endif
e6af5a
e8bb23 #define ARP_TABLE_SIZE 20¤  ¤   ¤   ¤   ¤   ¤   /* number of ARP table entries ¶
de7fe0 */
dfaf5a
d1a9a8 #if defined(powerc) || defined (__powerc)
e2af46 #pragma options align=mac68k
377454 #endif
98262b struct Enet_addr {
81c1d4 ¤   b_16¤   ¤   ¤   ¤   ¤   ¤   en_hi;
a330be ¤   b_32¤   ¤   ¤   ¤   ¤   ¤   en_lo;
4682f7 };
561cbc #if defined(powerc) || defined(__powerc)
4d7c46 #pragma options align=reset
537454 #endif
87af5a
7691f3 typedef struct Enet_addr Enet_addr;
70af5a
5da9a8 #if defined(powerc) || defined (__powerc)
06af46 #pragma options align=mac68k
8c7454 #endif
da5498 struct arp_entry {
6810db ¤   short¤  ¤   ¤   ¤   ¤   ¤   age;¤   ¤   ¤   /* cache aging field */
992cfb ¤   b_16¤   ¤   ¤   ¤   ¤   ¤   protocol;¤  ¤   /* Protocol type */
d091dc ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   ip_address;¤¤   /* IP address */
37d125 ¤   Enet_addr¤  ¤   ¤   ¤   ¤   en_address;¤¤   /* matching Ethernet address */
8082f7 };
da1cbc #if defined(powerc) || defined(__powerc)
117c46 #pragma options align=reset
bb7454 #endif
a6af5a
ca34f9 typedef struct arp_entry arp_entry;
d8af5a
937454 #endif
feaf5a
--e4a3 000881cc6d4401201ed Page 1 of TCPPB.h
bc38e5 /*
b93067 ¤   File:¤  ¤   TCPPB.h
59af5a
444973 ¤   Copyright:¤ (C) 1984-1993 by Apple Computer, Inc., all rights reserved.
3eaf5a
617674 ¤   WARNING
68c0d9 ¤   This file was auto generated by the interfacer tool. Modifications
d9ea11 ¤   must be made to the master file.
f4af5a
787fe0 */
51af5a
e21b22 #ifndef __TCPPB__
16c67b #define __TCPPB__
4daf5a
b8827b #ifndef __MACTCPCOMMONTYPES__
b8fcc5 #include <MacTCPCommonTypes.h>
517454 #endif
d8af5a
4a257e #define TCPCreate¤  ¤   ¤   30
13c393 #define TCPPassiveOpen¤ ¤   31
c76d7f #define TCPActiveOpen¤  ¤   32
296737 #define TCPSend¤¤   ¤   ¤   34
7a4768 #define TCPNoCopyRcv¤   ¤   35
3c22ee #define TCPRcvBfrReturn¤¤   36
9a80b7 #define TCPRcv¤ ¤   ¤   ¤   37
aac643 #define TCPClose¤   ¤   ¤   38
169f38 #define TCPAbort¤   ¤   ¤   39
307027 #define TCPStatus¤  ¤   ¤   40
0a9c88 #define TCPExtendedStat¤¤   41
0575cf #define TCPRelease¤ ¤   ¤   42
ec75f2 #define TCPGlobalInfo¤  ¤   43
284f37 #define TCPCtlMax¤  ¤   ¤   49
40af5a
9cea34 enum TCPEventCode {
ea2169 ¤   TCPClosing¤ ¤   ¤   ¤   = 1,
ef1d15 ¤   TCPULPTimeout,
8293ea ¤   TCPTerminate,
ec8157 ¤   TCPDataArrival,
26dd04 ¤   TCPUrgent,
e64c25 ¤   TCPICMPReceived,
e89662 ¤   lastEvent¤  ¤   ¤   ¤   = 32767
4282f7 };
f6af5a
aa29b6 typedef enum TCPEventCode TCPEventCode;
ecaf5a
061bcf enum TCPTerminationReason {
e5a36b ¤   TCPRemoteAbort¤ ¤   ¤   = 2,
21fa64 ¤   TCPNetworkFailure,
7b2a66 ¤   TCPSecPrecMismatch,
96027b ¤   TCPULPTimeoutTerminate,
aac805 ¤   TCPULPAbort,
1505ee ¤   TCPULPClose,
c3f507 ¤   TCPServiceError,
4413f6 ¤   lastReason¤ ¤   ¤   ¤   = 32767
f182f7 };
c2af5a
dbc037 // typedef TCPTerminationReason TCPTerminationReason;
beaf5a
bed7fb typedef pascal void (*TCPNotifyProcPtr)(StreamPtr tcpStream, unsigned short eve¶
98054f ntCode, Ptr userDataPtr, unsigned short terminReason, struct ICMPReport *icmpMs¶
50acb0 g);
cbaf5a
4d73f4 enum {
587233 ¤   uppTCPNotifyProcInfo = kPascalStackBased
cc0926 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(StreamPtr)))
eb116f ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(unsigned short)))
852557 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(Ptr)))
1af7ec ¤   ¤   ·| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(unsigned short)))
50de88 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(struct ICMPReport*)))
0082f7 };
7daf5a
88fdb7 #if TARGET_RT_MAC_CFM
--2396 00087d867e2401201ed Page 2 of TCPPB.h
a5a4d2 typedef UniversalProcPtr TCPNotifyUPP;
5faf5a
2772ab #define CallTCPNotifyProc(userRoutine, tcpStream, eventCode, userDataPtr, termi¶
a6e6a5 nReason, icmpMsg)¤  ¤   \
2ac4bd ¤   ¤   CallUniversalProc((UniversalProcPtr)userRoutine, uppTCPNotifyProcInfo, ¶
997484 tcpStream, eventCode, userDataPtr, terminReason, icmpMsg)
352435 #define NewTCPNotifyProc(userRoutine)¤  ¤   \
6b92c3 ¤   ¤   (TCPNotifyUPP) NewRoutineDescriptor((ProcPtr)userRoutine, uppTCPNotifyP¶
0f8e33 rocInfo, GetCurrentISA())
fadb21 #else
581bdd typedef TCPNotifyProcPtr TCPNotifyUPP;
89af5a
9a72ab #define CallTCPNotifyProc(userRoutine, tcpStream, eventCode, userDataPtr, termi¶
24e6a5 nReason, icmpMsg)¤  ¤   \
7e0f3d ¤   ¤   (*userRoutine)(tcpStream, eventCode, userDataPtr, terminReason, icmpMsg)
e32435 #define NewTCPNotifyProc(userRoutine)¤  ¤   \
ee1495 ¤   ¤   (TCPNotifyUPP)(userRoutine)
bc7454 #endif
4baf5a
33d4e7 typedef TCPNotifyProcPtr TCPNotifyProc;
4eaf5a
357afd typedef void (*TCPIOCompletionProcPtr)(struct TCPiopb *iopb);
e7af5a
9673f4 enum {
082140 ¤   uppTCPIOCompletionProcInfo = kCStackBased
013eb1 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(struct TCPiopb*)))
0d82f7 };
cfaf5a
21fdb7 #if TARGET_RT_MAC_CFM
677be8 typedef UniversalProcPtr TCPIOCompletionUPP;
04af5a
fd3c93 #define CallTCPIOCompletionProc(userRoutine, iopb)¤ ¤   \
8f2613 ¤   ¤   CallUniversalProc((UniversalProcPtr)userRoutine, uppTCPIOCompletionProc¶
ea1ab8 Info, iopb)
6bbbe3 #define NewTCPIOCompletionProc(userRoutine)¤¤   \
8ddc20 ¤   ¤   (TCPIOCompletionUPP) NewRoutineDescriptor((ProcPtr)userRoutine, uppTCPI¶
3fa0bf OCompletionProcInfo, GetCurrentISA())
12db21 #else
3de6fb typedef TCPIOCompletionProcPtr TCPIOCompletionUPP;
edaf5a
483c93 #define CallTCPIOCompletionProc(userRoutine, iopb)¤ ¤   \
804961 ¤   ¤   (*userRoutine)(iopb)
5fbbe3 #define NewTCPIOCompletionProc(userRoutine)¤¤   \
220bfc ¤   ¤   (TCPIOCompletionUPP)(userRoutine)
747454 #endif
97af5a
63902e typedef TCPIOCompletionProcPtr TCPIOCompletionProc;
09af5a
3c5296 typedef unsigned short tcp_port;
53af5a
66f85f typedef unsigned char byte;
82af5a
acf183 enum ·{¤¤   ¤   ¤   ¤   /* ValidityFlags */
a504a8 ¤   timeoutValue¤   ¤   ¤   ¤   = 0x80,
c54f9b ¤   timeoutAction¤  ¤   ¤   ¤   = 0x40,
ba8b94 ¤   typeOfService¤  ¤   ¤   ¤   = 0x20,
1f7d11 ¤   precedence¤ ¤   ¤   ¤   ¤   = 0x10
3a82f7 };
1faf5a
05e07d enum ·{¤¤   ¤   ¤   ¤   /* TOSFlags */
c1325d ¤   lowDelay¤   ¤   ¤   ¤   ¤   = 0x01,
e9eefb ¤   throughPut¤ ¤   ¤   ¤   ¤   = 0x02,
992a05 ¤   reliability¤¤   ¤   ¤   ¤   = 0x04
df82f7 };
e6af5a
72a9a8 #if defined(powerc) || defined (__powerc)
d8af46 #pragma options align=mac68k
d57454 #endif
245c3f struct TCPCreatePB {
7b9be3 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   rcvBuff;
35ffcd ¤   unsigned long¤  ¤   ¤   ¤   rcvBuffLen;
87d2bd ¤   TCPNotifyUPP¤   ¤   ¤   ¤   notifyProc;
--8a43 0008e2abaed401201ed Page 3 of TCPPB.h
ca2602 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   userDataPtr;
7782f7 };
441cbc #if defined(powerc) || defined(__powerc)
ad7c46 #pragma options align=reset
257454 #endif
66af5a
8d4caa typedef struct TCPCreatePB TCPCreatePB;
e0af5a
80a9a8 #if defined(powerc) || defined (__powerc)
11af46 #pragma options align=mac68k
117454 #endif
155477 struct TCPOpenPB {
83db71 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   ulpTimeoutValue;
9f5450 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   ulpTimeoutAction;
2a2892 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   validityFlags;
cc2627 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   commandTimeoutValue;
6beb47 ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   remoteHost;
8a1c79 ¤   tcp_port¤   ¤   ¤   ¤   ¤   remotePort;
0b7de2 ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   localHost;
9707fd ¤   tcp_port¤   ¤   ¤   ¤   ¤   localPort;
02e0ab ¤   byte¤   ¤   ¤   ¤   ¤   ¤   tosFlags;
9ece73 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   precedence;
679f7a ¤   Boolean¤¤   ¤   ¤   ¤   ¤   dontFrag;
a812e3 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   timeToLive;
a35116 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   security;
cb6592 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   optionCnt;
2de8da ¤   byte¤   ¤   ¤   ¤   ¤   ¤   options[40];
922602 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   userDataPtr;
3e82f7 };
261cbc #if defined(powerc) || defined(__powerc)
d17c46 #pragma options align=reset
447454 #endif
fcaf5a
2a985c typedef struct TCPOpenPB TCPOpenPB;
89af5a
dfa9a8 #if defined(powerc) || defined (__powerc)
b7af46 #pragma options align=mac68k
777454 #endif
527859 struct TCPSendPB {
f3db71 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   ulpTimeoutValue;
9c5450 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   ulpTimeoutAction;
f52892 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   validityFlags;
e1d61e ¤   Boolean¤¤   ¤   ¤   ¤   ¤   pushFlag;
b7d30d ¤   Boolean¤¤   ¤   ¤   ¤   ¤   urgentFlag;
e94d99 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   wdsPtr;
aa237b ¤   unsigned long¤  ¤   ¤   ¤   sendFree;
3966ab ¤   unsigned short¤ ¤   ¤   ¤   sendLength;
022602 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   userDataPtr;
1982f7 };
051cbc #if defined(powerc) || defined(__powerc)
c87c46 #pragma options align=reset
8c7454 #endif
03af5a
0c7ddf typedef struct TCPSendPB TCPSendPB;
8caf5a
9ca9a8 #if defined(powerc) || defined (__powerc)
14af46 #pragma options align=mac68k
ca7454 #endif
0b9e3d struct TCPReceivePB {
7d2627 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   commandTimeoutValue;
8c006b ¤   byte¤   ¤   ¤   ¤   ¤   ¤   filler;
a6187e ¤   Boolean¤¤   ¤   ¤   ¤   ¤   markFlag;
b1d30d ¤   Boolean¤¤   ¤   ¤   ¤   ¤   urgentFlag;
4e9be3 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   rcvBuff;
3c18d7 ¤   unsigned short¤ ¤   ¤   ¤   rcvBuffLen;
59daf8 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   rdsPtr;
b8d4b7 ¤   unsigned short¤ ¤   ¤   ¤   rdsLength;
f02859 ¤   unsigned short¤ ¤   ¤   ¤   secondTimeStamp;
8c2602 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   userDataPtr;
d982f7 };
081cbc #if defined(powerc) || defined(__powerc)
8e7c46 #pragma options align=reset
--7053 000f8c5992c401201ed Page 4 of TCPPB.h
a07454 #endif
e0af5a
9f0ca7 typedef struct TCPReceivePB TCPReceivePB;
83af5a
e0a9a8 #if defined(powerc) || defined (__powerc)
fcaf46 #pragma options align=mac68k
e97454 #endif
37e139 struct TCPClosePB {
8fdb71 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   ulpTimeoutValue;
e65450 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   ulpTimeoutAction;
382892 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   validityFlags;
392602 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   userDataPtr;
b482f7 };
d21cbc #if defined(powerc) || defined(__powerc)
897c46 #pragma options align=reset
9e7454 #endif
44af5a
bf40c9 typedef struct TCPClosePB TCPClosePB;
a7af5a
72a9a8 #if defined(powerc) || defined (__powerc)
edaf46 #pragma options align=mac68k
4f7454 #endif
0850f4 struct HistoBucket {
bb03f2 ¤   unsigned short¤ ¤   ¤   ¤   value;
e76cae ¤   unsigned long¤  ¤   ¤   ¤   counter;
2582f7 };
f31cbc #if defined(powerc) || defined(__powerc)
2f7c46 #pragma options align=reset
e67454 #endif
f6af5a
8c23d4 typedef struct HistoBucket HistoBucket;
3daf5a
a733e5 #define NumOfHistoBuckets 7
bbaf5a
3aa9a8 #if defined(powerc) || defined (__powerc)
44af46 #pragma options align=mac68k
027454 #endif
f3d730 struct TCPConnectionStats {
dbc8f6 ¤   unsigned long¤  ¤   ¤   ¤   dataPktsRcvd;
2a54a9 ¤   unsigned long¤  ¤   ¤   ¤   dataPktsSent;
6ff340 ¤   unsigned long¤  ¤   ¤   ¤   dataPktsResent;
f1cf26 ¤   unsigned long¤  ¤   ¤   ¤   bytesRcvd;
9876bb ¤   unsigned long¤  ¤   ¤   ¤   bytesRcvdDup;
42497a ¤   unsigned long¤  ¤   ¤   ¤   bytesRcvdPastWindow;
9e5379 ¤   unsigned long¤  ¤   ¤   ¤   bytesSent;
58d8c4 ¤   unsigned long¤  ¤   ¤   ¤   bytesResent;
90832b ¤   unsigned short¤ ¤   ¤   ¤   numHistoBuckets;
b48471 ¤   struct HistoBucket¤ ¤   ¤   sentSizeHisto[NumOfHistoBuckets];
736f29 ¤   unsigned short¤ ¤   ¤   ¤   lastRTT;
9cd271 ¤   unsigned short¤ ¤   ¤   ¤   tmrSRTT;
a687a1 ¤   unsigned short¤ ¤   ¤   ¤   rttVariance;
b7f6e4 ¤   unsigned short¤ ¤   ¤   ¤   tmrRTO;
90aa1d ¤   byte¤   ¤   ¤   ¤   ¤   ¤   sendTries;
56f36b ¤   byte¤   ¤   ¤   ¤   ¤   ¤   sourchQuenchRcvd;
1282f7 };
2c1cbc #if defined(powerc) || defined(__powerc)
4e7c46 #pragma options align=reset
8b7454 #endif
03af5a
acfaab typedef struct TCPConnectionStats TCPConnectionStats;
37af5a
9ea9a8 #if defined(powerc) || defined (__powerc)
b2af46 #pragma options align=mac68k
847454 #endif
fff3cb struct TCPStatusPB {
62db71 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   ulpTimeoutValue;
835450 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   ulpTimeoutAction;
5b3261 ¤   long¤   ¤   ¤   ¤   ¤   ¤   unused;
a0eb47 ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   remoteHost;
691c79 ¤   tcp_port¤   ¤   ¤   ¤   ¤   remotePort;
037de2 ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   localHost;
f807fd ¤   tcp_port¤   ¤   ¤   ¤   ¤   localPort;
--e4dd 000378adbbe401201ed Page 5 of TCPPB.h
2ae0ab ¤   byte¤   ¤   ¤   ¤   ¤   ¤   tosFlags;
3cce73 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   precedence;
255998 ¤   byte¤   ¤   ¤   ¤   ¤   ¤   connectionState;
60fa0f ¤   unsigned short¤ ¤   ¤   ¤   sendWindow;
67fefe ¤   unsigned short¤ ¤   ¤   ¤   rcvWindow;
ec46cb ¤   unsigned short¤ ¤   ¤   ¤   amtUnackedData;
6888da ¤   unsigned short¤ ¤   ¤   ¤   amtUnreadData;
59b8ea ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   securityLevelPtr;
225b23 ¤   unsigned long¤  ¤   ¤   ¤   sendUnacked;
cf11d8 ¤   unsigned long¤  ¤   ¤   ¤   sendNext;
dc8920 ¤   unsigned long¤  ¤   ¤   ¤   congestionWindow;
ede958 ¤   unsigned long¤  ¤   ¤   ¤   rcvNext;
72f944 ¤   unsigned long¤  ¤   ¤   ¤   srtt;
f6275a ¤   unsigned long¤  ¤   ¤   ¤   lastRTT;
206331 ¤   unsigned long¤  ¤   ¤   ¤   sendMaxSegSize;
4870f5 ¤   struct TCPConnectionStats¤  *connStatPtr;
d12602 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   userDataPtr;
3e82f7 };
3b1cbc #if defined(powerc) || defined(__powerc)
c57c46 #pragma options align=reset
417454 #endif
40af5a
fdd3bb typedef struct TCPStatusPB TCPStatusPB;
ecaf5a
75a9a8 #if defined(powerc) || defined (__powerc)
5aaf46 #pragma options align=mac68k
807454 #endif
37bbec struct TCPAbortPB {
742602 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   userDataPtr;
dc82f7 };
451cbc #if defined(powerc) || defined(__powerc)
f47c46 #pragma options align=reset
807454 #endif
80af5a
d310b2 typedef struct TCPAbortPB TCPAbortPB;
38af5a
1fa9a8 #if defined(powerc) || defined (__powerc)
43af46 #pragma options align=mac68k
2b7454 #endif
7714ae struct TCPParam {
05f259 ¤   unsigned long¤  ¤   ¤   ¤   tcpRtoA;
0ed05e ¤   unsigned long¤  ¤   ¤   ¤   tcpRtoMin;
1266ca ¤   unsigned long¤  ¤   ¤   ¤   tcpRtoMax;
380616 ¤   unsigned long¤  ¤   ¤   ¤   tcpMaxSegSize;
0fd41b ¤   unsigned long¤  ¤   ¤   ¤   tcpMaxConn;
0a9d5e ¤   unsigned long¤  ¤   ¤   ¤   tcpMaxWindow;
9982f7 };
ad1cbc #if defined(powerc) || defined(__powerc)
637c46 #pragma options align=reset
aa7454 #endif
0caf5a
71f796 typedef struct TCPParam TCPParam;
34af5a
0fa9a8 #if defined(powerc) || defined (__powerc)
18af46 #pragma options align=mac68k
637454 #endif
136a2e struct TCPStats {
0f6438 ¤   unsigned long¤  ¤   ¤   ¤   tcpConnAttempts;
635b95 ¤   unsigned long¤  ¤   ¤   ¤   tcpConnOpened;
5239cd ¤   unsigned long¤  ¤   ¤   ¤   tcpConnAccepted;
8c859e ¤   unsigned long¤  ¤   ¤   ¤   tcpConnClosed;
7bb815 ¤   unsigned long¤  ¤   ¤   ¤   tcpConnAborted;
9da8b3 ¤   unsigned long¤  ¤   ¤   ¤   tcpOctetsIn;
fdf305 ¤   unsigned long¤  ¤   ¤   ¤   tcpOctetsOut;
84ee22 ¤   unsigned long¤  ¤   ¤   ¤   tcpOctetsInDup;
13c08e ¤   unsigned long¤  ¤   ¤   ¤   tcpOctetsRetrans;
2ac35f ¤   unsigned long¤  ¤   ¤   ¤   tcpInputPkts;
dd7212 ¤   unsigned long¤  ¤   ¤   ¤   tcpOutputPkts;
9e735e ¤   unsigned long¤  ¤   ¤   ¤   tcpDupPkts;
96cf1d ¤   unsigned long¤  ¤   ¤   ¤   tcpRetransPkts;
6482f7 };
371cbc #if defined(powerc) || defined(__powerc)
--36b0 0017621775a401201ed Page 6 of TCPPB.h
247c46 #pragma options align=reset
7f7454 #endif
52af5a
ccc4b4 typedef struct TCPStats TCPStats;
7baf5a
dca9a8 #if defined(powerc) || defined (__powerc)
feaf46 #pragma options align=mac68k
067454 #endif
b87a98 struct TCPGlobalInfoPB {
ae93ce ¤   struct TCPParam¤¤   ¤   ¤   *tcpParamPtr;
6603f4 ¤   struct TCPStats¤¤   ¤   ¤   *tcpStatsPtr;
671dbf ¤   StreamPtr¤  ¤   ¤   ¤   ¤   *tcpCDBTable[1];
6a2602 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   userDataPtr;
9c9f43 ¤   unsigned short¤ ¤   ¤   ¤   maxTCPConnections;
cd82f7 };
761cbc #if defined(powerc) || defined(__powerc)
897c46 #pragma options align=reset
ae7454 #endif
3faf5a
193331 typedef struct TCPGlobalInfoPB TCPGlobalInfoPB;
8eaf5a
61a9a8 #if defined(powerc) || defined (__powerc)
b7af46 #pragma options align=mac68k
987454 #endif
443e92 struct TCPiopb {
25b311 ¤   char¤   ¤   ¤   ¤   ¤   ¤   fill12[12];
06d242 ¤   TCPIOCompletionProc¤¤   ¤   ioCompletion;
aa274a ¤   short¤  ¤   ¤   ¤   ¤   ¤   ioResult;
9ae6a7 ¤   char¤   ¤   ¤   ¤   ¤   ¤   *ioNamePtr;
c33f6b ¤   short¤  ¤   ¤   ¤   ¤   ¤   ioVRefNum;
b0b2e7 ¤   short¤  ¤   ¤   ¤   ¤   ¤   ioCRefNum;
c2ae50 ¤   short¤  ¤   ¤   ¤   ¤   ¤   csCode;
df2fe8 ¤   StreamPtr¤  ¤   ¤   ¤   ¤   tcpStream;
3fe29a ¤   union {
5faede ¤   ¤   struct TCPCreatePB¤ ¤   ¤   create;
171ffc ¤   ¤   struct TCPOpenPB¤   ¤   ¤   open;
f650e0 ¤   ¤   struct TCPSendPB¤   ¤   ¤   send;
42ee9c ¤   ¤   struct TCPReceivePB¤¤   ¤   receive;
b829ad ¤   ¤   struct TCPClosePB¤  ¤   ¤   close;
ae05f9 ¤   ¤   struct TCPAbortPB¤  ¤   ¤   abort;
5dbfe2 ¤   ¤   struct TCPStatusPB¤ ¤   ¤   status;
62e5aa ¤   ¤   struct TCPGlobalInfoPB¤ ¤   globalInfo;
d0914c ¤   } csParam;
be82f7 };
541cbc #if defined(powerc) || defined(__powerc)
fb7c46 #pragma options align=reset
d17454 #endif
51af5a
f58df1 typedef struct TCPiopb TCPiopb;
1caf5a
fd7454 #endif
76af5a
--2000 000d3925a27401201ee Page 1 of UDPPB.h
bc38e5 /*
b076c0 ¤   File:¤  ¤   UDPPB.h
44af5a
124973 ¤   Copyright:¤ (C) 1984-1993 by Apple Computer, Inc., all rights reserved.
96af5a
987674 ¤   WARNING
95c0d9 ¤   This file was auto generated by the interfacer tool. Modifications
6dea11 ¤   must be made to the master file.
49af5a
287fe0 */
aaaf5a
3d5d85 #ifndef __UDPPB__
0680dc #define __UDPPB__
b1af5a
e4827b #ifndef __MACTCPCOMMONTYPES__
1efcc5 #include <MacTCPCommonTypes.h>
517454 #endif
40af5a
b5962b #define UDPCreate¤  ¤   20
f0e675 #define UDPRead¤¤   ¤   21
9b8851 #define UDPBfrReturn¤   22
f9e8d2 #define UDPWrite¤   ¤   23
4f3e9c #define UDPRelease¤ ¤   24
24322b #define UDPMaxMTUSize¤  25
156089 #define UDPStatus¤  ¤   26
43eb20 #define UDPMultiCreate¤ 27
107467 #define UDPMultiSend¤   28
69ae06 #define UDPMultiRead¤   29
6bb5fb #define UDPCtlMax¤  ¤   29
a3af5a
17d299 enum UDPEventCode {
5807c8 ¤   UDPDataArrival¤ ¤   = 1,
23ee69 ¤   UDPICMPReceived,
b252ba ¤   lastUDPEvent¤   ¤   = 32767
2382f7 };
9caf5a
0b6fc5 typedef enum UDPEventCode UDPEventCode;
d5af5a
cac769 typedef pascal void (*UDPNotifyProcPtr)(StreamPtr udpStream, unsigned short eve¶
9b8b4a ntCode, Ptr userDataPtr, struct ICMPReport *icmpMsg);
adaf5a
cc73f4 enum {
ebe755 ¤   uppUDPNotifyProcInfo = kPascalStackBased
6c0926 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(StreamPtr)))
37116f ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(unsigned short)))
ac2557 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(Ptr)))
db7c24 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(struct ICMPReport*)))
3882f7 };
54af5a
08fdb7 #if TARGET_RT_MAC_CFM
64c27b typedef UniversalProcPtr UDPNotifyUPP;
0daf5a
bf06aa #define CallUDPNotifyProc(userRoutine, udpStream, eventCode, userDataPtr, icmpM¶
439acc sg)¤¤   \
25ff51 ¤   ¤   CallUniversalProc((UniversalProcPtr)userRoutine, uppUDPNotifyProcInfo, ¶
6b3acc udpStream, eventCode, userDataPtr, icmpMsg)
e8940e #define NewUDPNotifyProc(userRoutine)¤  ¤   \
03b28a ¤   ¤   (UDPNotifyUPP) NewRoutineDescriptor((ProcPtr)userRoutine, uppUDPNotifyP¶
d28e33 rocInfo, GetCurrentISA())
15db21 #else
b95a99 typedef UDPNotifyProcPtr UDPNotifyUPP;
3baf5a
6606aa #define CallUDPNotifyProc(userRoutine, udpStream, eventCode, userDataPtr, icmpM¶
219acc sg)¤¤   \
7e306d ¤   ¤   (*userRoutine)(udpStream, eventCode, userDataPtr, icmpMsg)
8b940e #define NewUDPNotifyProc(userRoutine)¤  ¤   \
8e344f ¤   ¤   (UDPNotifyUPP)(userRoutine)
db7454 #endif
74af5a
d6d086 typedef UDPNotifyProcPtr UDPNotifyProc;
8caf5a
d3b694 typedef void (*UDPIOCompletionProcPtr)(struct UDPiopb *iopb);
--7a01 0009b1f680b401201ee Page 2 of UDPPB.h
e0af5a
9673f4 enum {
6a27e5 ¤   uppUDPIOCompletionProcInfo = kCStackBased
c71b02 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(struct UDPiopb*)))
f782f7 };
a8af5a
77fdb7 #if TARGET_RT_MAC_CFM
f34472 typedef UniversalProcPtr UDPIOCompletionUPP;
eeaf5a
c03154 #define CallUDPIOCompletionProc(userRoutine, iopb)¤ ¤   \
321dff ¤   ¤   CallUniversalProc((UniversalProcPtr)userRoutine, uppUDPIOCompletionProc¶
fc1ab8 Info, iopb)
74bd46 #define NewUDPIOCompletionProc(userRoutine)¤¤   \
7ded2d ¤   ¤   (UDPIOCompletionUPP) NewRoutineDescriptor((ProcPtr)userRoutine, uppUDPI¶
63a0bf OCompletionProcInfo, GetCurrentISA())
0edb21 #else
50c3d2 typedef UDPIOCompletionProcPtr UDPIOCompletionUPP;
58af5a
4a3154 #define CallUDPIOCompletionProc(userRoutine, iopb)¤ ¤   \
2b4961 ¤   ¤   (*userRoutine)(iopb)
edbd46 #define NewUDPIOCompletionProc(userRoutine)¤¤   \
3407a0 ¤   ¤   (UDPIOCompletionUPP)(userRoutine)
207454 #endif
f6af5a
b52cc8 typedef UDPIOCompletionProcPtr UDPIOCompletionProc;
7daf5a
ed9753 typedef unsigned short udp_port;
88af5a
c6a9a8 #if defined(powerc) || defined (__powerc)
83af46 #pragma options align=mac68k
347454 #endif
ffe58c struct UDPCreatePB {¤   ¤   /* for create and release calls */
069be3 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   rcvBuff;
83ffcd ¤   unsigned long¤  ¤   ¤   ¤   rcvBuffLen;
bccc34 ¤   UDPNotifyProc¤  ¤   ¤   ¤   notifyProc;
198c11 ¤   unsigned short¤ ¤   ¤   ¤   localPort;
ee2602 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   userDataPtr;
fc9080 ¤   udp_port¤   ¤   ¤   ¤   ¤   endingPort;
6082f7 };
981cbc #if defined(powerc) || defined(__powerc)
c87c46 #pragma options align=reset
c57454 #endif
beaf5a
ff4729 typedef struct UDPCreatePB UDPCreatePB;
94af5a
9ea9a8 #if defined(powerc) || defined (__powerc)
89af46 #pragma options align=mac68k
0f7454 #endif
005dea struct UDPSendPB {
d990c8 ¤   unsigned short¤ ¤   ¤   ¤   reserved;
dbeb47 ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   remoteHost;
e1eed8 ¤   udp_port¤   ¤   ¤   ¤   ¤   remotePort;
564d99 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   wdsPtr;
c27e8d ¤   Boolean¤¤   ¤   ¤   ¤   ¤   checkSum;
f466ab ¤   unsigned short¤ ¤   ¤   ¤   sendLength;
122602 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   userDataPtr;
230158 ¤   udp_port¤   ¤   ¤   ¤   ¤   localPort;
a282f7 };
5b1cbc #if defined(powerc) || defined(__powerc)
747c46 #pragma options align=reset
9b7454 #endif
44af5a
bad757 typedef struct UDPSendPB UDPSendPB;
00af5a
81a9a8 #if defined(powerc) || defined (__powerc)
e9af46 #pragma options align=mac68k
8c7454 #endif
1203d8 struct UDPReceivePB {¤  ¤   /* for receive and buffer return calls */
ecef5f ¤   unsigned short¤ ¤   ¤   ¤   timeOut;
adeb47 ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   remoteHost;
09eed8 ¤   udp_port¤   ¤   ¤   ¤   ¤   remotePort;
9b9be3 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   rcvBuff;
--d835 001bc9c6d7b401201ee Page 3 of UDPPB.h
d118d7 ¤   unsigned short¤ ¤   ¤   ¤   rcvBuffLen;
532859 ¤   unsigned short¤ ¤   ¤   ¤   secondTimeStamp;
0b2602 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   userDataPtr;
6609b4 ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   destHost;¤  ¤   /* only for use with multi rcv ¶
7e7fe0 */
e077ee ¤   udp_port¤   ¤   ¤   ¤   ¤   destPort;¤  ¤   /* only for use with multi rcv ¶
577fe0 */
7282f7 };
441cbc #if defined(powerc) || defined(__powerc)
5d7c46 #pragma options align=reset
8c7454 #endif
2eaf5a
b64ad4 typedef struct UDPReceivePB UDPReceivePB;
42af5a
4ba9a8 #if defined(powerc) || defined (__powerc)
04af46 #pragma options align=mac68k
4e7454 #endif
063908 struct UDPMTUPB {
b841ef ¤   unsigned short¤ ¤   ¤   ¤   mtuSize;
99eb47 ¤   ip_addr¤¤   ¤   ¤   ¤   ¤   remoteHost;
c32602 ¤   Ptr¤¤   ¤   ¤   ¤   ¤   ¤   userDataPtr;
c582f7 };
e31cbc #if defined(powerc) || defined(__powerc)
087c46 #pragma options align=reset
797454 #endif
deaf5a
d41e15 typedef struct UDPMTUPB UDPMTUPB;
59af5a
66a9a8 #if defined(powerc) || defined (__powerc)
eeaf46 #pragma options align=mac68k
917454 #endif
d5fb57 struct UDPiopb {
91b311 ¤   char¤   ¤   ¤   ¤   ¤   ¤   fill12[12];
24b0f8 ¤   UDPIOCompletionProc¤¤   ¤   ioCompletion;
5d274a ¤   short¤  ¤   ¤   ¤   ¤   ¤   ioResult;
fce6a7 ¤   char¤   ¤   ¤   ¤   ¤   ¤   *ioNamePtr;
e33f6b ¤   short¤  ¤   ¤   ¤   ¤   ¤   ioVRefNum;
b4b2e7 ¤   short¤  ¤   ¤   ¤   ¤   ¤   ioCRefNum;
69ae50 ¤   short¤  ¤   ¤   ¤   ¤   ¤   csCode;
12be8c ¤   StreamPtr¤  ¤   ¤   ¤   ¤   udpStream;
fae29a ¤   union {
a5e6c0 ¤   ¤   struct UDPCreatePB¤ ¤   create;
17d41c ¤   ¤   struct UDPSendPB¤   ¤   send;
2e61dc ¤   ¤   struct UDPReceivePB¤¤   receive;
743e89 ¤   ¤   struct UDPMTUPB¤¤   ¤   mtu;
12914c ¤   } csParam;
5482f7 };
af1cbc #if defined(powerc) || defined(__powerc)
e67c46 #pragma options align=reset
a27454 #endif
e0af5a
13fe4e typedef struct UDPiopb UDPiopb;
a0af5a
fa7454 #endif
bcaf5a
--c15d 0000b1d2e9b401201ef Page 1 of dnr.c
bc38e5 /*
0ecc02 ¤   DNR.c - DNR library for MPW
19af5a
e2bf76 ¤   (C) Copyright 1988 by Apple Computer. ·All rights reserved
5767c5 ¤
5a7fe0 */
0baf5a
d2de79 #define MPW3.0
81af5a
bafbf0 #include <OSUtils.h>
a0b2bf #include <Errors.h>
0049ca #include <Files.h>
f1fd5c #include <Resources.h>
9c6b82 #include <Memory.h>
9da9c8 #include <Traps.h>
c56c79 #include <Gestalt.h>
ae1ef3 #include <Folders.h>
4e7623 #include <MixedMode.h>¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
4bf32e #include <ToolUtils.h>¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
4c1a71 #include "AddressXlation.h"
06af5a
7f38e5 /*
1cb248 ·* function prototypes
d3495d ·*/
ed5a2f static void GetSystemFolder(short *vRefNumP, long *dirIDP);
501de5 static void GetCPanelFolder(short *vRefNumP, long *dirIDP);
3de577 static short SearchFolderForDNRP(long targetType, long targetCreator, short vRe¶
abd438 fNum,
d23e9f ¤   ¤   long dirID);
827afa static short OpenOurRF( void );
19af5a
67af5a
2eea0e #define OPENRESOLVER¤   1L
8267a9 #define CLOSERESOLVER¤  2L
dd006e #define STRTOADDR¤  ¤   3L
e44994 #define¤ADDRTOSTR¤  ¤   4L
7c3123 #define¤ENUMCACHE¤  ¤   5L
344095 #define ADDRTONAME¤ ¤   6L
60b8e1 #define¤HINFO¤  ¤   ¤   7L
987f32 #define MXINFO¤ ¤   ¤   8L
52af5a
1dc7c6 Handle ¤¤   ¤   ¤   codeHndl = nil;
8793f7 UniversalProcPtr¤   dnr = nil;
2eaf5a
dbaf5a
51f12b static TrapType GetTrapType(unsigned long theTrap)
63bb36 {
7bddb5 ¤   if (BitAnd(theTrap, 0x0800) > 0)
516238 ¤   ¤   return(ToolTrap);
fa0e24 ¤   else
902105 ¤   ¤   return(OSTrap);
6c9371 ¤   }
d867c5 ¤
7e01e9 static Boolean TrapAvailable(unsigned long trap)
9abb36 {
d55d02 TrapType trapType = ToolTrap;
569b71 unsigned long numToolBoxTraps;
30af5a
340491 ¤   if (NGetTrapAddress(_InitGraf, ToolTrap) == NGetTrapAddress(0xAA6E, ToolTra¶
d09e11 p))
f54d4a ¤   ¤   numToolBoxTraps = 0x200;
0d0e24 ¤   else
2376d2 ¤   ¤   numToolBoxTraps = 0x400;
02af5a
829e51 ¤   trapType = GetTrapType(trap);
e4c752 ¤   if (trapType == ToolTrap) {
4ad604 ¤   ¤   trap = BitAnd(trap, 0x07FF);
06d11e ¤   ¤   if (trap >= numToolBoxTraps)
84833e ¤   ¤   ¤   trap = _Unimplemented;
480fe4 ¤   ¤   }
2077fb ¤   return(NGetTrapAddress(trap, trapType) != NGetTrapAddress(_Unimplemented, T¶
0bbe28 oolTrap));
--8b54 000041501eb401201ef Page 2 of dnr.c
e0af5a
77efe6 }
29af5a
bacad8 static void GetSystemFolder(short *vRefNumP, long *dirIDP)
4ebb36 {
a5ce28 ¤   SysEnvRec info;
1662fe ¤   long wdProcID;
9167c5 ¤
94a449 ¤   SysEnvirons(1, &info);
38ef8f ¤   if (GetWDInfo(info.sysVRefNum, vRefNumP, dirIDP, &wdProcID) != noErr) {
f6f122 ¤   ¤   *vRefNumP = 0;
5aa394 ¤   ¤   *dirIDP = 0;
a80fe4 ¤   ¤   }
289371 ¤   }
d2af5a
9d2ccd static void GetCPanelFolder(short *vRefNumP, long *dirIDP)
5dbb36 {
e71f7d ¤   Boolean hasFolderMgr = false;
6440a4 ¤   long feature;
7367c5 ¤
bc322a ¤   if (Gestalt(gestaltFindFolderAttr, &feature) == noErr)·
0d63b5 ¤   ¤   hasFolderMgr = true;
20cbbe ¤   if (!hasFolderMgr) {
b78335 ¤   ¤   GetSystemFolder(vRefNumP, dirIDP);
3599bf ¤   ¤   return;
be0fe4 ¤   ¤   }
06665a ¤   else {
104a88 ¤   ¤   if (FindFolder(kOnSystemDisk, kControlPanelFolderType, kDontCreateFolde¶
29b4d7 r, vRefNumP, dirIDP) != noErr) {
ed13c3 ¤   ¤   ¤   *vRefNumP = 0;
511245 ¤   ¤   ¤   *dirIDP = 0;
95a3a6 ¤   ¤   ¤   }
c50fe4 ¤   ¤   }
f49371 ¤   }
de67c5 ¤
fe60f2 /* SearchFolderForDNRP is called to search a folder for files that might·
df60d9 ¤   contain the 'dnrp' resource */
6ae577 static short SearchFolderForDNRP(long targetType, long targetCreator, short vRe¶
ab1e14 fNum, long dirID)
9dbb36 {
383850 ¤   HParamBlockRec fi;
1e89c2 ¤   Str255 filename;
671f60 ¤   short refnum;
a167c5 ¤
6bda7a ¤   fi.fileParam.ioCompletion = nil;
4b9749 ¤   fi.fileParam.ioNamePtr = filename;
d90c22 ¤   fi.fileParam.ioVRefNum = vRefNum;
449df7 ¤   fi.fileParam.ioDirID = dirID;
6eef7a ¤   fi.fileParam.ioFDirIndex = 1;
9367c5 ¤
02e104 ¤   while (PBHGetFInfoSync(&fi) == noErr) {
e07eac ¤   ¤   /* scan system folder for driver resource files of specific type & crea¶
e537ca tor */
f012f3 ¤   ¤   if (fi.fileParam.ioFlFndrInfo.fdType == targetType &&
804562 ¤   ¤   ¤   fi.fileParam.ioFlFndrInfo.fdCreator == targetCreator) {
baaba3 ¤   ¤   ¤   /* found the MacTCP driver file? */
487c33 ¤   ¤   ¤   refnum = HOpenResFile(vRefNum, dirID, filename, fsRdPerm);
507aa3 ¤   ¤   ¤   if (GetIndResource('dnrp', 1) == NULL)
87d3ec ¤   ¤   ¤   ¤   CloseResFile(refnum);
92bb8c ¤   ¤   ¤   else
421681 ¤   ¤   ¤   ¤   return refnum;
e8a3a6 ¤   ¤   ¤   }
594705 ¤   ¤   /* check next file in system folder */
962f92 ¤   ¤   fi.fileParam.ioFDirIndex++;
7d43a0 ¤   ¤   fi.fileParam.ioDirID = dirID;¤  /* PBHGetFInfo() clobbers ioDirID */
a50fe4 ¤   ¤   }
f57dcd ¤   return(-1);
6ef828 ¤   }¤
24af5a
bfaf5a
a6af5a
041c42 /* OpenOurRF is called to open the MacTCP driver resources */
--c6d8 0001488f1e2401201ef Page 3 of dnr.c
e0af5a
2a4646 static short OpenOurRF()
42bb36 {
3f1f60 ¤   short refnum;
1a4412 ¤   short vRefNum;
08759d ¤   long dirID;
c367c5 ¤
2656dd ¤   /* first search Control Panels for MacTCP 1.1 */
321eea ¤   GetCPanelFolder(&vRefNum, &dirID);
b9160d ¤   refnum = SearchFolderForDNRP('cdev', 'ztcp', vRefNum, dirID);
56dbd9 ¤   if (refnum != -1) return(refnum);
851b52 ¤   ¤
9c1e04 ¤   /* next search System Folder for MacTCP 1.0.x */
fb0788 ¤   GetSystemFolder(&vRefNum, &dirID);
0b02d5 ¤   refnum = SearchFolderForDNRP('cdev', 'mtcp', vRefNum, dirID);
03dbd9 ¤   if (refnum != -1) return(refnum);
5c1b52 ¤   ¤
84683e ¤   /* finally, search Control Panels for MacTCP 1.0.x */
6a1eea ¤   GetCPanelFolder(&vRefNum, &dirID);
6702d5 ¤   refnum = SearchFolderForDNRP('cdev', 'mtcp', vRefNum, dirID);
1ddbd9 ¤   if (refnum != -1) return(refnum);
701b52 ¤   ¤
38e69f ¤   return -1;
bcf828 ¤   }¤
faaf5a
6faf5a
14af5a
9aaf5a
8bdc74 typedef OSErr (*OpenResolverProcPtr)(long selector, char* fileName);
16af5a
5073f4 enum {
1fb7ae ¤   uppOpenResolverProcInfo = kCStackBased
6e1f34 ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(short)))
281bfd ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
ec443b ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char *)))
a382f7 };
e9af5a
2bfdb7 #if TARGET_RT_MAC_CFM
c3df25 typedef UniversalProcPtr OpenResolverUPP;
91af5a
639225 #define¤NewOpenResolverProc(userRoutine)¤   ¤   ¤   ¤   ¤   ¤   \
21ed8d ¤   ¤   (OpenResolverUPP) NewRoutineDescriptor(userRoutine, uppOpenResolverProc¶
ce175c Info, GetCurrentISA())
a2a26a #define¤CallOpenResolverProc(userRoutine, selector, filename)¤  \
dade16 ¤   ¤   CallUniversalProc(userRoutine, uppOpenResolverProcInfo, selector, filen¶
ccdf1d ame)
64db21 #else
d74403 typedef OpenResolverProcPtr OpenResolverUPP;
28af5a
8e6650 #define¤NewOpenResolverProc(userRoutine)¤   ¤   ¤   ¤   ¤   \
2677d0 ¤   ¤   (OpenResolverUPP)(userRoutine)
30a26a #define¤CallOpenResolverProc(userRoutine, selector, filename)¤  \
4f6516 ¤   ¤   (*(OpenResolverProcPtr)userRoutine)(selector, filename)
1f7454 #endif
c5af5a
dcaf5a
5caf5a
afa1ef OSErr OpenResolver(char *fileName)
d9bb36 {
c7ea18 ¤   short ¤ ¤   ¤   refnum;
4cd893 ¤   OSErr ¤ ¤   ¤   rc;
d967c5 ¤
bb4973 ¤   if (dnr != nil)
2ee7d3 ¤   ¤   /* resolver already loaded in */
de6e94 ¤   ¤   return(noErr);
b61b52 ¤   ¤
b7aabc ¤   /* open the MacTCP driver to get DNR resources. Search for it based on
e8cd18 ¤   ···creator & type rather than simply file name */¤
cd880b ¤   refnum = OpenOurRF();
32af5a
03cf9b ¤   /* ignore failures since the resource may have been installed in the·
148e68 ¤   ···System file if running on a Mac 512Ke */
--9500 0001199e958401201ef Page 4 of dnr.c
2c0578 ¤   ···
6a714a ¤   /* load in the DNR resource package */
743b51 ¤   codeHndl = GetIndResource('dnrp', 1);
543349 ¤   if (codeHndl == nil) {
4d11d6 ¤   ¤   /* can't open DNR */
616a03 ¤   ¤   return(ResError());
f49371 ¤   }
4967c5 ¤
aa341f ¤   DetachResource(codeHndl);
bf1f2c ¤   if (refnum != -1) {
4be13f ¤   ¤   CloseWD(refnum);
fe0b97 ¤   ¤   CloseResFile(refnum);
d69371 ¤   }
b61b52 ¤   ¤
47f8dd ¤   /* lock the DNR resource since it cannot be relocated while opened */
8b66df ¤   HLock(codeHndl);
ab5e8f ¤   dnr = (UniversalProcPtr) *codeHndl;
8567c5 ¤
824cd4 ¤   /* call open resolver */
f2ac23 ¤   rc = CallOpenResolverProc(dnr, OPENRESOLVER, fileName);
a8b010 ¤   if (rc != noErr) {
db3034 ¤   ¤   /* problem with open resolver, flush it */
7cb14c ¤   ¤   HUnlock(codeHndl);
65416b ¤   ¤   DisposeHandle(codeHndl);
7dcd65 ¤   ¤   dnr = nil;
9e9371 ¤   }
8f8e33 ¤   return(rc);
34efe6 }
c6af5a
deaf5a
e1af5a
d16939 typedef OSErr (*CloseResolverProcPtr)(long selector);
8baf5a
2573f4 enum {
825238 ¤   uppCloseResolverProcInfo = kCStackBased
471f34 ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(short)))
3d1bfd ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
3e82f7 };
a3af5a
7ffdb7 #if TARGET_RT_MAC_CFM
06472c typedef UniversalProcPtr CloseResolverUPP;
5caf5a
462549 #define¤NewCloseResolverProc(userRoutine)¤  ¤   ¤   ¤   ¤   ¤   \
a6ac0c ¤   ¤   (CloseResolverUPP) NewRoutineDescriptor(userRoutine, uppCloseResolverPr¶
770dd5 ocInfo, GetCurrentISA())
4f9547 #define¤CallCloseResolverProc(userRoutine, selector)¤   \
537402 ¤   ¤   CallUniversalProc(userRoutine, uppCloseResolverProcInfo, selector)
56db21 #else
94b19f typedef CloseResolverProcPtr CloseResolverUPP;
b2af5a
06bcea #define¤NewCloseResolverProc(userRoutine) ¤ ¤   ¤   ¤   ¤   ¤   \
99c7bf ¤   ¤   (CloseResolverUPP)(userRoutine)
a89547 #define¤CallCloseResolverProc(userRoutine, selector)¤   \
d20902 ¤   ¤   (*(CloseResolverProcPtr)userRoutine)(selector)
577454 #endif
2daf5a
91af5a
d4af5a
5520cf OSErr CloseResolver()
98bb36 {
7f2969 ¤   if (dnr == nil)
ef3c45 ¤   ¤   /* resolver not loaded error */
0d13e8 ¤   ¤   return(notOpenErr);
c11b52 ¤   ¤
eaf360 ¤   /* call close resolver */
cc9dff ¤   CallCloseResolverProc(dnr, CLOSERESOLVER);
38af5a
af6d87 ¤   /* release the DNR resource package */
6953ad ¤   HUnlock(codeHndl);
8cfa3d ¤   DisposeHandle(codeHndl);
d22fc6 ¤   dnr = nil;
11557d ¤   return(noErr);
--4dcc 000d6b94427401201ef Page 5 of dnr.c
7aefe6 }
46af5a
8eaf5a
79af5a
85af5a
9128a6 typedef OSErr (*StrToAddrProcPtr)(long selector, char* hostName, struct hostInf¶
e32fbb o* rtnStruct,
a52690 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   long resultProc, char* userData);
9ded43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
c473f4 enum {
91d513 ¤   uppStrToAddrProcInfo = kCStackBased
f91f34 ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(short)))
121bfd ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
41443b ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char *)))
5b8b83 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(struct hostInfo *)))
c13c19 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(long)))
89a6e2 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(char *)))
a782f7 };
d4af5a
affdb7 #if TARGET_RT_MAC_CFM
2cb656 typedef UniversalProcPtr StrToAddrUPP;
bfaf5a
c1c202 #define¤NewStrToAddrProc(userRoutine)¤  ¤   ¤   ¤   ¤   ¤   \
7cf633 ¤   ¤   (StrToAddrUPP) NewRoutineDescriptor(userRoutine, uppStrToAddrProcInfo, ¶
aa2e1b GetCurrentISA())
3979e5 #define¤CallStrToAddrProc(userRoutine, selector, hostName, rtnStruct, resultPro¶
d1ffcd c, userData)¤   \
3106bf ¤   ¤   CallUniversalProc(userRoutine, uppStrToAddrProcInfo, selector, hostName¶
38ad55 , rtnStruct, resultProc, userData)
30db21 #else
bdbbd4 typedef StrToAddrProcPtr StrToAddrUPP;
61af5a
dfc202 #define¤NewStrToAddrProc(userRoutine)¤  ¤   ¤   ¤   ¤   ¤   \
94d3e0 ¤   ¤   (StrToAddrUPP)(userRoutine)
1979e5 #define¤CallStrToAddrProc(userRoutine, selector, hostName, rtnStruct, resultPro¶
00ffcd c, userData)¤   \
e54a96 ¤   ¤   (*(StrToAddrProcPtr)userRoutine)(selector, hostName, rtnStruct, resultP¶
33fef3 roc, userData)
697454 #endif
d2af5a
2baf5a
48af5a
e13997 OSErr StrToAddr(char *hostName, struct hostInfo *rtnStruct, ResultUPP resultupp¶
f032c9 , char *userDataPtr)
c2bb36 {
a12969 ¤   if (dnr == nil)
dd3c45 ¤   ¤   /* resolver not loaded error */
2813e8 ¤   ¤   return(notOpenErr);
9d1b52 ¤   ¤
6fc380 ¤   return(CallStrToAddrProc(dnr, STRTOADDR, hostName, rtnStruct, (long)resultu¶
d44f28 pp, userDataPtr));
3fefe6 }
e5af5a
a3af5a
fa6321 typedef OSErr (*AddrToStrProcPtr)(long selector, long address, char* hostName);
e1af5a
bc73f4 enum {
795390 ¤   uppAddrToStrProcInfo = kCStackBased
bf1f34 ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(short)))
8a1bfd ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
ba10e6 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(unsigned long)))
a964c8 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(char *)))
ee82f7 };
65af5a
42fdb7 #if TARGET_RT_MAC_CFM
9e4969 typedef UniversalProcPtr AddrToStrUPP;
b8af5a
a6681f #define¤NewAddrToStrProc(userRoutine)¤  ¤   ¤   ¤   ¤   ¤   \
c07155 ¤   ¤   (AddrToStrUPP) NewRoutineDescriptor(userRoutine, uppAddrToStrProcInfo, ¶
c02e1b GetCurrentISA())
f84cfd #define¤CallAddrToStrProc(userRoutine, selector, address, hostName)¤\
d630d3 ¤   ¤   CallUniversalProc(userRoutine, uppAddrToStrProcInfo, selector, address,¶
--10e1 0000248370b401201ef Page 6 of dnr.c
bf2a5a ·hostName)
24db21 #else
5a1784 typedef AddrToStrProcPtr AddrToStrUPP;
36af5a
b0681f #define¤NewAddrToStrProc(userRoutine)¤  ¤   ¤   ¤   ¤   ¤   \
fc4607 ¤   ¤   (AddrToStrUPP)(userRoutine)
994cfd #define¤CallAddrToStrProc(userRoutine, selector, address, hostName)¤\
e0e6df ¤   ¤   (*(AddrToStrProcPtr)userRoutine)(selector, address, hostName)
d57454 #endif
37af5a
b567c5 ¤
8fa269 OSErr AddrToStr(unsigned long addr, char *addrStr)
27bb36 {
a12969 ¤   if (dnr == nil)
4a3c45 ¤   ¤   /* resolver not loaded error */
be13e8 ¤   ¤   return(notOpenErr);
e21b52 ¤   ¤
c006d2 ¤   CallAddrToStrProc(dnr, ADDRTOSTR, addr, addrStr);
b8af5a
84557d ¤   return(noErr);
07efe6 }
34af5a
e0af5a
79af5a
c99cf7 typedef OSErr (*EnumCacheProcPtr)(long selector, long result, char* userData);
74af5a
7173f4 enum {
c97e4d ¤   uppEnumCacheProcInfo = kCStackBased
711f34 ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(short)))
6c1bfd ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
5d887f ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
7c64c8 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(char *)))
6782f7 };
96af5a
befdb7 #if TARGET_RT_MAC_CFM
d01bae typedef UniversalProcPtr EnumCacheUPP;
d4af5a
95ed1e #define¤NewEnumCacheProc(userRoutine)¤  ¤   ¤   ¤   ¤   ¤   \
99ff9c ¤   ¤   (EnumCacheUPP) NewRoutineDescriptor(userRoutine, uppEnumCacheProcInfo, ¶
ed2e1b GetCurrentISA())
3a67a1 #define¤CallEnumCacheProc(userRoutine, selector, result, userData)¤ \
436061 ¤   ¤   CallUniversalProc(userRoutine, uppEnumCacheProcInfo, selector, result, ¶
f07dba userData)
f1db21 #else
b17259 typedef EnumCacheProcPtr EnumCacheUPP;
2caf5a
19ed1e #define¤NewEnumCacheProc(userRoutine)¤  ¤   ¤   ¤   ¤   ¤   \
14bbb4 ¤   ¤   (EnumCacheUPP)(userRoutine)
5467a1 #define¤CallEnumCacheProc(userRoutine, selector, result, userData)¤ \
2a3b3c ¤   ¤   (*(EnumCacheProcPtr)userRoutine)(selector, result, userData)
6e7454 #endif
15af5a
77af5a
3c67c5 ¤
28f1cb OSErr EnumCache(EnumResultUPP resultupp, char *userDataPtr)
3ebb36 {
8c2969 ¤   if (dnr == nil)
743c45 ¤   ¤   /* resolver not loaded error */
0913e8 ¤   ¤   return(notOpenErr);
4a1b52 ¤   ¤
27aa22 ¤   return(CallEnumCacheProc(dnr, ENUMCACHE, (long)resultupp, userDataPtr));
28efe6 }
73af5a
6daf5a
72af5a
d5d890 typedef OSErr (*AddrToNameProcPtr)(long selector, unsigned long addr, struct ho¶
baa89e stInfo* rtnStruct,
ef2690 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   long resultProc, char* userData);
36af5a
5673f4 enum {
39bf79 ¤   uppAddrToNameProcInfo = kCStackBased
021f34 ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(short)))
--8634 0001692c274401201ef Page 7 of dnr.c
a11bfd ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
5810e6 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(unsigned long)))
388b83 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(struct hostInfo *)))
df3c19 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(long)))
47a6e2 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(char *)))
5aaf5a
a782f7 };
04af5a
75fdb7 #if TARGET_RT_MAC_CFM
21a1a3 typedef UniversalProcPtr AddrToNameUPP;
2daf5a
40786b #define¤NewAddrToNameProc(userRoutine)¤ ¤   ¤   ¤   ¤   ¤   \
1e3a66 ¤   ¤   (AddrToNameUPP) NewRoutineDescriptor(userRoutine, uppAddrToNameProcInfo¶
07d40c , GetCurrentISA())
85904f #define¤CallAddrToNameProc(userRoutine, selector, addr, rtnStruct, resultProc, ¶
d2108c userData)¤  \
c5d9a4 ¤   ¤   CallUniversalProc(userRoutine, uppAddrToNameProcInfo, selector, addr, r¶
9047c8 tnStruct, resultProc, userData)
cedb21 #else
6a4e6a typedef AddrToNameProcPtr AddrToNameUPP;
f9af5a
91786b #define¤NewAddrToNameProc(userRoutine)¤ ¤   ¤   ¤   ¤   ¤   \
059dc1 ¤   ¤   (AddrToNameUPP)(userRoutine)
f3904f #define¤CallAddrToNameProc(userRoutine, selector, addr, rtnStruct, resultProc, ¶
16108c userData)¤  \
d07a8a ¤   ¤   (*(AddrToNameProcPtr)userRoutine)(selector, addr, rtnStruct, resultProc¶
52bb1a , userData)
287454 #endif
aeaf5a
3067c5 ¤
be67c5 ¤
529b14 OSErr AddrToName(unsigned long addr, struct hostInfo *rtnStruct, ResultUPP resu¶
480c41 ltupp,
a8896c ¤   char *userDataPtr)
fcbb36 {
c82969 ¤   if (dnr == nil)
333c45 ¤   ¤   /* resolver not loaded error */
6313e8 ¤   ¤   return(notOpenErr);
b81b52 ¤   ¤
d24009 ¤   return(CallAddrToNameProc(dnr, ADDRTONAME, addr, rtnStruct, (long)resultupp¶
9de289 , userDataPtr));
45efe6 }
7faf5a
d1af5a
559cc6 typedef OSErr (*HInfoProcPtr)(long selector, char* hostName, struct returnRec* ¶
f72b78 returnRecPtr,
d533b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   long resultProc, char* userData);
8eaf5a
da73f4 enum {
8553b5 ¤   uppHInfoProcInfo = kCStackBased
ce1f34 ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(short)))
dd1bfd ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
83443b ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char *)))
3b679d ¤   ¤   ·| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(struct returnRec *)))
443c19 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(long)))
20a6e2 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(char *)))
31af5a
9882f7 };
deaf5a
7ffdb7 #if TARGET_RT_MAC_CFM
5e23c2 typedef UniversalProcPtr HInfoUPP;
8aaf5a
b88566 #define¤NewHInfoProc(userRoutine)¤  ¤   ¤   ¤   ¤   ¤   \
04b952 ¤   ¤   (HInfoUPP) NewRoutineDescriptor(userRoutine, uppHInfoProcInfo, GetCurre¶
dffab2 ntISA())
9a358b #define¤CallHInfoProc(userRoutine, selector, hostName, returnRecPtr, resultProc¶
efa978 , userData)¤\
6da62d ¤   ¤   CallUniversalProc(userRoutine, uppHInfoProcInfo, selector, hostName, re¶
21a851 turnRecPtr, resultProc, userData)
76db21 #else
fe521a typedef HInfoProcPtr HInfoUPP;
16af5a
--ad5c 001b5614454401201ef Page 8 of dnr.c
478566 #define¤NewHInfoProc(userRoutine)¤  ¤   ¤   ¤   ¤   ¤   \
23b0f9 ¤   ¤   (HInfoUPP)(userRoutine)
5e358b #define¤CallHInfoProc(userRoutine, selector, hostName, returnRecPtr, resultProc¶
b6a978 , userData)¤\
ad07b5 ¤   ¤   (*(HInfoProcPtr)userRoutine)( selector, hostName, returnRecPtr, resultP¶
2bfef3 roc, userData)
db7454 #endif
fdaf5a
c664a3 extern OSErr HInfo(char *hostName, struct returnRec *returnRecPtr, ResultProc2P¶
2d9d20 tr resultProc,
11896c ¤   char *userDataPtr)
0fbb36 {
792969 ¤   if (dnr == nil)
cd3c45 ¤   ¤   /* resolver not loaded error */
1613e8 ¤   ¤   return(notOpenErr);
f11b52 ¤   ¤
3c19b6 ¤   return(CallHInfoProc(dnr, HINFO, hostName, returnRecPtr, (long)resultProc, ¶
34780e userDataPtr));
97efe6 }
b0af5a
3faf5a
b7af5a
2e595f typedef OSErr (*MXInfoProcPtr)(long selector, char* hostName, struct returnRec*¶
9a0bf7 ·returnRecPtr,
3d33b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   long resultProc, char* userData);
a5af5a
ef73f4 enum {
679b07 ¤   uppMXInfoProcInfo = kCStackBased
361f34 ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(short)))
b81bfd ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
1b443b ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char *)))
1a679d ¤   ¤   ·| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(struct returnRec *)))
e03c19 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(long)))
5aa6e2 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(char *)))
11af5a
b282f7 };
3daf5a
32fdb7 #if TARGET_RT_MAC_CFM
f18693 typedef UniversalProcPtr MXInfoUPP;
54af5a
5ccacb #define¤NewMXInfoProc(userRoutine)¤ ¤   ¤   ¤   ¤   ¤   \
b91607 ¤   ¤   (MXInfoUPP) NewRoutineDescriptor(userRoutine, uppMXInfoProcInfo, GetCur¶
2b6e2f rentISA())
d1366d #define¤CallMXInfoProc(userRoutine, selector, hostName, returnRecPtr, resultPro¶
85ffcd c, userData)¤   \
745b54 ¤   ¤   CallUniversalProc(userRoutine, selector, hostName, returnRecPtr, result¶
eec979 Proc, userData)
a8db21 #else
30cd3d typedef MXInfoProcPtr MXInfoUPP;
8daf5a
32cacb #define¤NewMXInfoProc(userRoutine)¤ ¤   ¤   ¤   ¤   ¤   \
3d7a61 ¤   ¤   (MXInfoUPP)(userRoutine)
d9366d #define¤CallMXInfoProc(userRoutine, selector, hostName, returnRecPtr, resultPro¶
52ffcd c, userData)¤   \
d0331b ¤   ¤   (*(MXInfoProcPtr)userRoutine)(selector, hostName, returnRecPtr, resultP¶
38fef3 roc, userData)
547454 #endif
1667c5 ¤
2d67c5 ¤
7907df extern OSErr MXInfo(char *hostName, struct returnRec *returnRecPtr, ResultProc2¶
5daaaa Ptr resultProc,
df896c ¤   char *userDataPtr)
58bb36 {
752969 ¤   if (dnr == nil)
413c45 ¤   ¤   /* resolver not loaded error */
5d13e8 ¤   ¤   return(notOpenErr);
881b52 ¤   ¤
5a0ece ¤   return(CallMXInfoProc(dnr, MXINFO, hostName, returnRecPtr, (long)resultProc¶
80e289 , userDataPtr));
b5efe6 }
--bbb2 000af6fa6c6401201f0 Page 1 of tcp.c
bc38e5 /*
37d5a8 ·*¤ Copyright (c) 1990-92 Regents of the University of Michigan.
c69b18 ·*¤ All rights reserved.
1a775e ·*
5d6462 ·*¤ tcp.c -- TCP communication related routines
4d495d ·*/
b6b779 #include "lber.h"
5ce990 #include "ldap.h"
f49b53 #include "tcp.h"
e2af5a
462363 #include <Devices.h>
9dae6e #include <Menus.h>
04a8e3 #include <Events.h>¤
b83f75 #include <AddressXLation.h>
996b82 #include <Memory.h>
27b2bf #include <Errors.h>
626c79 #include <Gestalt.h>
adaf5a
be38e5 /*
3b7499 ·* local prototypes
b2495d ·*/
9f504c #ifdef NEEDPROTOS
f2d664 void¤   ¤   bzero( char *buf, unsigned long count );
709b99 pascal void setdoneflag( struct hostInfo *hip, char *donep );
267746 pascal void tcp_asynchnotify( StreamPtr tstream, unsigned short event, Ptr user¶
3950c4 datap,
8b3164 ¤   ¤   ¤   ¤   ¤   ¤   ¤   unsigned short term_reason, struct ICMPReport *icmp¶
983fff msg );
9bbb3e OSErr¤  ¤   kick_mactcp( short *drefnump );
e99f19 #ifdef SUPPORT_OPENTRANSPORT
50c3b7 pascal void EventHandler(tcpstream *tsp, OTEventCode event, OTResult result, vo¶
3d11a8 id * /* cookie */);
92fda2 #endif /* SUPPORT_OPENTRANSPORT */
666133 #else /* NEEDPROTOS */
9b1ee4 void¤   ¤   bzero();
5665d6 pascal void setdoneflag();
3316c7 pascal void tcp_asynchnotify();
f42983 OSErr¤  ¤   kick_mactcp();
309f19 #ifdef SUPPORT_OPENTRANSPORT
31cf39 pascal void EventHandler();
10fda2 #endif /* SUPPORT_OPENTRANSPORT */
378634 #endif /* NEEDPROTOS */
e0af5a
639f19 #ifdef SUPPORT_OPENTRANSPORT
2d6fad static Boolean gHaveOT = false;
dbfda2 #endif /* SUPPORT_OPENTRANSPORT */
15af5a
acaf5a
dc9f19 #ifdef SUPPORT_OPENTRANSPORT
b138e5 /*
396902 ·* Initialize the tcp module. ·This mainly consists of seeing if we have
8a0090 ·* Open Transport and initializing it and setting our global saying so.
86ac65 ·*/·
eb85d3 OSStatus
981b34 tcp_init( void )
dcbb36 {
045c25 ¤   long¤   ¤   result;
00dc42 ¤   OSStatus¤   err;
60af5a
37d9b3 ¤   gHaveOT = (( err = Gestalt( gestaltOpenTpt, &result )) == noErr &&
970b3b ¤   ¤   ¤   result & ( gestaltOpenTptPresentMask | gestaltOpenTptTCPPresentMask¶
83cc6d ·) != 0 );
54af5a
84c063 ¤   if ( gHaveOT ) {
d04d74 ¤   ¤   return( InitOpenTransport());
d8f037 ¤   } else {
169004 ¤   ¤   return( kOTNoError );¤  /* assume we have MacTCP */
f39371 ¤   }
a5efe6 }
c6af5a
1eaf5a
af314a void
--99d7 0006a61f47f401201f0 Page 2 of tcp.c
9dc45c tcp_shutdown( void )
11bb36 {
6dc063 ¤   if ( gHaveOT ) {
686a2b ¤   ¤   CloseOpenTransport();
fd9371 ¤   }
47efe6 }
68af5a
214769 Boolean
74704e tcp_have_opentransport( void )
e6bb36 {
d71d6d ¤   return( gHaveOT );
ceefe6 }
8afda2 #endif /* SUPPORT_OPENTRANSPORT */
64af5a
61af5a
3838e5 /*
df9419 ·* open and return an pointer to a TCP stream (return NULL if error)
07fbf1 ·* "buf" is a buffer for receives of length "buflen."
a5495d ·*/
984bcf tcpstream *
ff29fa tcpopen( unsigned char * buf, long buflen ) {
fac15d ¤   TCPiopb¤¤   ¤   pb;
0a156f ¤   OSStatus¤   ¤   err;
532e93 ¤   tcpstream *¤¤   tsp;
39049d ¤   short¤  ¤   ¤   drefnum;
f99f19 #ifdef SUPPORT_OPENTRANSPORT
747544 ¤   TEndpointInfo¤  info;
d8fda2 #endif /* SUPPORT_OPENTRANSPORT */
25af5a
bd20e7 ¤   if (nil == (tsp = (tcpstream *)NewPtrClear(sizeof(tcpstream)))) {
9929b1 ¤   ¤   return( nil );
019371 ¤   }
4167c5 ¤
279f19 #ifdef SUPPORT_OPENTRANSPORT
f3c063 ¤   if ( gHaveOT ) {
1667c5 ¤
4065af ¤   ¤   //
9f824d ¤   ¤   // Now create a TCP
8365af ¤   ¤   //
206b0b ¤   ¤   tsp->tcps_ep = OTOpenEndpoint( OTCreateConfiguration( kTCPName ), 0, &i¶
62f0fd nfo, &err );
91af5a
73827c ¤   ¤   if ( !tsp->tcps_ep ) {
3bcb06 ¤   ¤   ¤   if ( err == kOTNoError ) {
a8976c ¤   ¤   ¤   ¤   err = -1;
9fa3a6 ¤   ¤   ¤   }
f10fe4 ¤   ¤   }
8667c5 ¤
3c61e4 ¤   ¤   if ( !err ) {
359c7a ¤   ¤   ¤   err = OTSetSynchronous( tsp->tcps_ep );
700fe4 ¤   ¤   }
a567c5 ¤
2ae07f ¤   ¤   tsp->tcps_data = 0;
44b7f9 ¤   ¤   tsp->tcps_terminated = tsp->tcps_connected = false;
161b52 ¤   ¤
f665af ¤   ¤   //
b9cd13 ¤   ¤   // Install notifier we're going to use
6965af ¤   ¤   //
f961e4 ¤   ¤   if ( !err ) {
633641 ¤   ¤   ¤   err = OTInstallNotifier( tsp->tcps_ep, (OTNotifyProcPtr) EventHandl¶
0c8eda er, 0 );
110fe4 ¤   ¤   }
f967c5 ¤
04789a ¤   ¤   if ( err != kOTNoError ) {
159e7e ¤   ¤   ¤   if ( tsp->tcps_ep ) {
919252 ¤   ¤   ¤   ¤   OTCloseProvider( tsp->tcps_ep );
e6a3a6 ¤   ¤   ¤   }
4d6359 ¤   ¤   ¤   DisposePtr( (Ptr)tsp );
cf3bf3 ¤   ¤   ¤   tsp = nil;
730fe4 ¤   ¤   }
98f037 ¤   } else {
6afda2 #endif /* SUPPORT_OPENTRANSPORT */
--c1c5 000caff3282401201f0 Page 3 of tcp.c
e0af5a
774a0f ¤   ¤   if ( kick_mactcp( &drefnum ) != noErr ) {
5bbdb2 ¤   ¤   ¤   return ( nil );
c70fe4 ¤   ¤   }
3d67c5 ¤
4e9e9f ¤   ¤   if (( tsp->tcps_notifyupp = NewTCPNotifyProc( tcp_asynchnotify )) == NU¶
30eb15 LL ) {
b56359 ¤   ¤   ¤   DisposePtr( (Ptr)tsp );
a8cb50 ¤   ¤   ¤   return( nil );
c30fe4 ¤   ¤   }
881b52 ¤   ¤
ddb7f4 ¤   ¤   tsp->drefnum = drefnum;
a21b52 ¤   ¤
48ac2e ¤   ¤   if ( buflen == 0 ) {
212262 ¤   ¤   ¤   buflen = TCP_BUFSIZ;
8e0fe4 ¤   ¤   }
d81b52 ¤   ¤
acdeb0 ¤   ¤   if ( buf == NULL &&·
72251c ¤   ¤   ¤   ·(nil == ( buf = tsp->tcps_buffer = (unsigned char *)NewPtr( buflen¶
5bc705 ·)))) {
752932 ¤   ¤   ¤   DisposeRoutineDescriptor( tsp->tcps_notifyupp );
206359 ¤   ¤   ¤   DisposePtr( (Ptr)tsp );
56cb50 ¤   ¤   ¤   return( nil );
2d0fe4 ¤   ¤   }
978dea ¤   ¤   bzero( (char *)&pb, sizeof( pb ));¤
60dd26 ¤   ¤   pb.csCode = TCPCreate;
3d488c ¤   ¤   pb.ioCRefNum = tsp->drefnum;
cf1173 ¤   ¤   pb.csParam.create.rcvBuff = (Ptr) buf;
17d1e8 ¤   ¤   pb.csParam.create.rcvBuffLen = buflen;
1c8226 ¤   ¤   pb.csParam.create.notifyProc = tsp->tcps_notifyupp;
c668f1 ¤   ¤   pb.csParam.create.userDataPtr = (Ptr)tsp;
5c87c7 ¤   ¤   ¤
357334 ¤   ¤   if (( err = PBControlSync( (ParmBlkPtr)&pb )) != noErr || pb.ioResult !¶
cc1af6 = noErr ) {
722932 ¤   ¤   ¤   DisposeRoutineDescriptor( tsp->tcps_notifyupp );
e3d0aa ¤   ¤   ¤   DisposePtr( (Ptr)tsp->tcps_buffer );
626359 ¤   ¤   ¤   DisposePtr( (Ptr)tsp );
a8cb50 ¤   ¤   ¤   return( nil );
680fe4 ¤   ¤   }
fcaf5a
1ce07f ¤   ¤   tsp->tcps_data = 0;
bfb7f9 ¤   ¤   tsp->tcps_terminated = tsp->tcps_connected = false;
385be0 ¤   ¤   tsp->tcps_sptr = pb.tcpStream;
35af5a
b39f19 #ifdef SUPPORT_OPENTRANSPORT
3b9371 ¤   }
13fda2 #endif /* SUPPORT_OPENTRANSPORT */
78af5a
7ce608 ¤   return( tsp );
abefe6 }
46af5a
6b38e5 /*
6a8f0b ·* connect to remote host at IP address "addr", TCP port "port"
1a27c1 ·* return local port assigned, 0 if error
f8495d ·*/
d99f19 #ifdef SUPPORT_OPENTRANSPORT
a3e532 InetPort
504d4c tcpconnect( tcpstream * tsp, InetHost addr, InetPort port ) {
8fc689 #else /* SUPPORT_OPENTRANSPORT */
1a20d6 ip_port
c240c8 tcpconnect( tcpstream * tsp, ip_addr addr, ip_port port ) {
28fda2 #endif /* SUPPORT_OPENTRANSPORT */
e35960 ¤   TCPiopb¤¤   pb;
c2dc42 ¤   OSStatus¤   err;
d09f19 #ifdef SUPPORT_OPENTRANSPORT
19213d ¤   struct InetAddress sndsin, rcvsin, retsin;
89c4e8 ¤   TCall¤  ¤   sndcall, rcvcall;
d1d849 ¤   TBind¤  ¤   ret;
acfda2 #endif /* SUPPORT_OPENTRANSPORT */
8aaf5a
f19f19 #ifdef SUPPORT_OPENTRANSPORT
cac063 ¤   if ( gHaveOT ) {
--5b3e 000b68ba23b401201f0 Page 4 of tcp.c
2a67c5 ¤
fae2f8 ¤   ¤   if ( tsp->tcps_ep == NULL ) {
781a3b ¤   ¤   ¤   return( 0 );
670fe4 ¤   ¤   }
6067c5 ¤
3b8d82 ¤   ¤   bzero( (char *)&sndsin, sizeof( struct InetAddress ));
862957 ¤   ¤   bzero( (char *)&rcvsin, sizeof( struct InetAddress ));
51b37b ¤   ¤   bzero( (char *)&retsin, sizeof( struct InetAddress ));
c5dddf ¤   ¤   bzero( (char *)&sndcall, sizeof( TCall ));
f1a4ab ¤   ¤   bzero( (char *)&rcvcall, sizeof( TCall));
47b650 ¤   ¤   bzero( (char *)&ret, sizeof( TBind ));
7c1b52 ¤   ¤
75c51c ¤   ¤   // Bind TCP to an address and port. ·We don't care which one, so we pas¶
61eb4a s null for
ba3b2a ¤   ¤   // the requested address.
444cb6 ¤   ¤   ret.addr.maxlen = sizeof( struct InetAddress );
a446ea ¤   ¤   ret.addr.buf = (unsigned char *)&retsin;
1cd35b ¤   ¤   err = OTBind( tsp->tcps_ep, NULL, &ret );
de789a ¤   ¤   if ( err != kOTNoError ) {
f41a3b ¤   ¤   ¤   return( 0 );
f80fe4 ¤   ¤   }
0667c5 ¤
496390 ¤   ¤   OTInitInetAddress( &sndsin, port, addr );
30e901 ¤   ¤   sndcall.addr.len = sizeof( struct InetAddress );
830f61 ¤   ¤   sndcall.addr.buf = (UInt8 *)&sndsin;
b267c5 ¤
a738e9 ¤   ¤   rcvcall.addr.maxlen = sizeof( struct InetAddress );
7501a9 ¤   ¤   rcvcall.addr.buf = (unsigned char *)&rcvsin;
2767c5 ¤
89a2a7 ¤   ¤   err = OTConnect( tsp->tcps_ep, &sndcall, &rcvcall );
03789a ¤   ¤   if ( err != kOTNoError ) {
a88144 ¤   ¤   ¤   return 0;
940fe4 ¤   ¤   }
a067c5 ¤
665869 ¤   ¤   tsp->tcps_connected = true;
0cdfba ¤   ¤   tsp->tcps_remoteport = rcvsin.fPort;
6a57b7 ¤   ¤   tsp->tcps_remoteaddr = rcvsin.fHost;
49e7b1 ¤   ¤   return( retsin.fPort );
5167c5 ¤
caf037 ¤   } else {
e2fda2 #endif /* SUPPORT_OPENTRANSPORT */
1067c5 ¤
dd73de ¤   ¤   if ( tsp->tcps_sptr == (StreamPtr)NULL ) {
5d1a3b ¤   ¤   ¤   return( 0 );
8b0fe4 ¤   ¤   }
d187c7 ¤   ¤   ¤
f48dea ¤   ¤   bzero( (char *)&pb, sizeof( pb ));¤
cf8b45 ¤   ¤   pb.csCode = TCPActiveOpen;
37488c ¤   ¤   pb.ioCRefNum = tsp->drefnum;
ef4e11 ¤   ¤   pb.tcpStream = tsp->tcps_sptr;
795910 ¤   ¤   pb.csParam.open.remoteHost = addr;
3124ac ¤   ¤   pb.csParam.open.remotePort = port;
cd473c ¤   ¤   pb.csParam.open.ulpTimeoutValue = 15;
04da92 ¤   ¤   pb.csParam.open.validityFlags = timeoutValue;
ed87c7 ¤   ¤   ¤
5f7334 ¤   ¤   if (( err = PBControlSync( (ParmBlkPtr)&pb )) != noErr || pb.ioResult !¶
871af6 = noErr ) {
701a3b ¤   ¤   ¤   return( 0 );
aa0fe4 ¤   ¤   }
ba1b52 ¤   ¤
d15869 ¤   ¤   tsp->tcps_connected = true;
da1a0c ¤   ¤   return( pb.csParam.open.localPort );
7667c5 ¤
e99f19 #ifdef SUPPORT_OPENTRANSPORT
a59371 ¤   }
36fda2 #endif /* SUPPORT_OPENTRANSPORT */
ba67c5 ¤
37efe6 }
ecaf5a
57af5a
2b38e5 /*
b6dc03 ·* close and release a TCP stream
--1ca9 0000fbd2206401201f0 Page 5 of tcp.c
e09641 ·* returns 0 if no error, -1 if any error occurs
b0495d ·*/
88146c short
d409f4 tcpclose( tcpstream * tsp ) {
055960 ¤   TCPiopb¤¤   pb;
5a3cf2 ¤   OSStatus¤   ¤   rc;
ce67c5 ¤
a29f19 #ifdef SUPPORT_OPENTRANSPORT
95c063 ¤   if ( gHaveOT ) {
a267c5 ¤
f967c5 ¤
4ee2f8 ¤   ¤   if ( tsp->tcps_ep == NULL ) {
088e4f ¤   ¤   ¤   return( -1 );
810fe4 ¤   ¤   }
9767c5 ¤
dd59ea #ifdef notdef
881b17 ¤   ¤   /*
8228e1 ¤   ¤   ·* if connected execute a close
249de3 ¤   ¤   ·*/
d3fe61 ¤   ¤   if ( tcp->tcps_connected ) {
0f4b57 ¤   ¤   ¤   Call OTSndOrderlyDisconnect and wait for the other end to respond. ¶
62f61b ·This requires
9104b6 ¤   ¤   ¤   waiting for and reading any data that comes in in the meantime. ·Th¶
c294e7 is code was ifdefed
faa7ff ¤   ¤   ¤   out in the MacTCP so it is here too.
a90fe4 ¤   ¤   }
88e218 #endif /* notdef */
ec1b52 ¤   ¤
d82a49 ¤   ¤   rc = OTSndDisconnect( tsp->tcps_ep, NULL );
4b67c5 ¤
6bc677 ¤   ¤   OTCloseProvider( tsp->tcps_ep );
8ce8a5 ¤   ¤   DisposePtr( (Ptr)tsp );
fc1b52 ¤   ¤
fcf0ca ¤   ¤   if ( rc != 0 ) {
790c25 ¤   ¤   ¤   rc = -1;
950fe4 ¤   ¤   }
f8af5a
89f037 ¤   } else {
30fda2 #endif /* SUPPORT_OPENTRANSPORT */
cd67c5 ¤
a873de ¤   ¤   if ( tsp->tcps_sptr == (StreamPtr)NULL ) {
cc8e4f ¤   ¤   ¤   return( -1 );
be0fe4 ¤   ¤   }
881b52 ¤   ¤
ea59ea #ifdef notdef
b41b17 ¤   ¤   /*
bb28e1 ¤   ¤   ·* if connected execute a close
619de3 ¤   ¤   ·*/
8efe61 ¤   ¤   if ( tcp->tcps_connected ) {
c677ff ¤   ¤   ¤   bzero( (char *)&pb, sizeof( pb ));
c4bfa0 ¤   ¤   ¤   pb.csCode = TCPClose;
ca4d61 ¤   ¤   ¤   pb.ioCRefNum = tsp->drefnum;
a8fd41 ¤   ¤   ¤   pb.tcpStream = sp;
a4eba7 ¤   ¤   ¤   pb.csParam.close.validityFlags = 0;
5d5e09 ¤   ¤   ¤   PBControlSync( (ParmBlkPtr)&pb );
5e0fe4 ¤   ¤   }
d7e218 #endif /* notdef */
2887c7 ¤   ¤   ¤
f8e667 ¤   ¤   bzero( (char *)&pb, sizeof( pb ));
a8e994 ¤   ¤   pb.csCode = TCPRelease;
2c488c ¤   ¤   pb.ioCRefNum = tsp->drefnum;
bb4e11 ¤   ¤   pb.tcpStream = tsp->tcps_sptr;
0bf3f7 ¤   ¤   pb.csParam.close.validityFlags = 0;
dc7525 ¤   ¤   rc = 0;
dc1b52 ¤   ¤
efaf26 ¤   ¤   if ( PBControlSync( (ParmBlkPtr)&pb ) != noErr || pb.ioResult != noErr ¶
c6ce3d ) {
e10c25 ¤   ¤   ¤   rc = -1;
ad0fe4 ¤   ¤   }
8c1b52 ¤   ¤
c30f87 ¤   ¤   DisposeRoutineDescriptor( tsp->tcps_notifyupp );
0f8237 ¤   ¤   DisposePtr( (Ptr)tsp->tcps_buffer );
--3cd1 000fe236e4b401201f0 Page 6 of tcp.c
7ee8a5 ¤   ¤   DisposePtr( (Ptr)tsp );
f667c5 ¤
799f19 #ifdef SUPPORT_OPENTRANSPORT
529371 ¤   }
2bfda2 #endif /* SUPPORT_OPENTRANSPORT */
711b52 ¤   ¤
15dacc ¤   return( rc );¤
95efe6 }
9faf5a
54af5a
3138e5 /*
6ca572 ·* wait for new data to arrive
35775e ·*
30da4f ·* if "timeout" is NULL, wait until data arrives or connection goes away
616cd8 ·* if "timeout" is a pointer to a zero'ed struct, poll
f01d1f ·* else wait for "timeout->tv_sec + timeout->tv_usec" seconds
e2495d ·*/
77146c short
e1d55a tcpselect( tcpstream * tsp, struct timeval * timeout )
72bb36 {
52e3a9 ¤   long¤   ticks, endticks;
b9c7a1 ¤   short¤  rc;
8eaf5a
2dbd53 ¤   if ( timeout != NULL ) {
ebe553 ¤   ¤   endticks = 60 * timeout->tv_sec + ( 60 * timeout->tv_usec ) / 1000000 +¶
b255e9 ·TickCount();
679371 ¤   }
cbf6c1 ¤   ticks = 0;¤
4faf5a
993b86 ¤   while (( rc = tcpreadready( tsp )) == 0 && ( timeout == NULL || ticks < end¶
6fc8e5 ticks )) {
0c79de ¤   ¤   Delay( 2L, &ticks );
a5aa13 ¤   ¤   SystemTask();
719371 ¤   }
d1af5a
210460 ¤   return ( rc );
39efe6 }
b3af5a
11af5a
67146c short
1a17f4 tcpreadready( tcpstream *tsp )
31bb36 {
5b9f19 #ifdef SUPPORT_OPENTRANSPORT
1164ae ¤   size_t ¤dataAvail;
f0af5a
7dd2b4 ¤   if (gHaveOT) {
4be2f8 ¤   ¤   if ( tsp->tcps_ep == NULL ) {
868e4f ¤   ¤   ¤   return( -1 );
fe0fe4 ¤   ¤   }
c967c5 ¤
7b0e42 ¤   ¤   OTCountDataBytes( tsp->tcps_ep, &dataAvail );
fe4676 ¤   ¤   tsp->tcps_data = ( dataAvail != 0 );¤
81f037 ¤   } else {
51fda2 #endif /* SUPPORT_OPENTRANSPORT */
6b73de ¤   ¤   if ( tsp->tcps_sptr == (StreamPtr)NULL ) {
808e4f ¤   ¤   ¤   return( -1 );
060fe4 ¤   ¤   }
f267c5 ¤
71ec74 ¤   ¤   /* tsp->tcps_data is set in async. notify proc, so nothing for us to do¶
c03500 ·here */
4f9f19 #ifdef SUPPORT_OPENTRANSPORT
119371 ¤   }
30fda2 #endif /* SUPPORT_OPENTRANSPORT */
babac1 ¤   return ( tsp->tcps_terminated ? -1 : ( tsp->tcps_data < 1 ) ? 0 : 1 );
54efe6 }
f7af5a
99af5a
5638e5 /*
cca3b4 ·* read up to "rbuflen" bytes into "rbuf" from a connected TCP stream
eb6b92 ·* wait up to "timeout" seconds for data (if timeout == 0, wait "forever")
10495d ·*/
fe6fcf long
--9611 00083bb51a8401201f0 Page 7 of tcp.c
aaf5a4 tcpread( tcpstream * tsp, byte timeout, unsigned char * rbuf,
225920 ¤   ¤   ¤   ¤   ¤   ¤   ··unsigned short rbuflen, DialogPtr dlp ) {
e1c15d ¤   TCPiopb¤¤   ¤   pb;
df2659 ¤   unsigned long¤  time, end_time;
4b9f19 #ifdef SUPPORT_OPENTRANSPORT
11db58 ¤   OTFlags¤¤   ¤   flags;
b315ef ¤   OTResult¤   ¤   result;
b818db ¤   size_t ¤¤   ¤   dataAvail;
e4fda2 #endif /* SUPPORT_OPENTRANSPORT */
2267c5 ¤
1d9f19 #ifdef SUPPORT_OPENTRANSPORT
cec063 ¤   if ( gHaveOT ) {
3b67c5 ¤
6ce2f8 ¤   ¤   if ( tsp->tcps_ep == NULL ) {
f38e4f ¤   ¤   ¤   return( -1 );
240fe4 ¤   ¤   }
8e1b52 ¤   ¤
2f35f1 ¤   ¤   // Try to read data. ·Since we're in non-blocking mode, this will fail ¶
ec7670 with kOTNoDataErr
821fbb ¤   ¤   // if no data is available.
7b8136 ¤   ¤   result = OTRcv( tsp->tcps_ep, rbuf, rbuflen, &flags );
9b7e5d ¤   ¤   if ( result == kOTNoDataErr ) {
aec524 ¤   ¤   ¤   // Nothing available, wait for some. ·The ugly spin loop below is t¶
3064ea he way the old
a916d8 ¤   ¤   ¤   // MacTCP code worked. ·I should fix it, but I don't have time righ¶
a00ae8 t now.
7b4d21 ¤   ¤   ¤   tsp->tcps_data = 0;
2c10e2 ¤   ¤   ¤   GetDateTime( &time );
de95bb ¤   ¤   ¤   end_time = time + timeout;
001b52 ¤   ¤
09e88e ¤   ¤   ¤   while (( timeout <= 0 || end_time > time ) && tsp->tcps_data < 1 &&¶
b182de ·!tsp->tcps_terminated ) {
01ef35 ¤   ¤   ¤   ¤   OTCountDataBytes( tsp->tcps_ep, &dataAvail );
b41b75 ¤   ¤   ¤   ¤   if ( dataAvail > 0 ) {
e05954 ¤   ¤   ¤   ¤   ¤   tsp->tcps_data = 1;
182613 ¤   ¤   ¤   ¤   }
fbff91 ¤   ¤   ¤   ¤   GetDateTime( &time );
d4e4f2 ¤   ¤   ¤   ¤   SystemTask();
c1a3a6 ¤   ¤   ¤   }
bd87c7 ¤   ¤   ¤
f2f215 ¤   ¤   ¤   if ( tsp->tcps_data < 1 ) {
ee694d ¤   ¤   ¤   ¤   return( tsp->tcps_terminated ? -3 : -1 );
21a3a6 ¤   ¤   ¤   }
ca87c7 ¤   ¤   ¤
f8321f ¤   ¤   ¤   // Should have data available now, try again.
140cca ¤   ¤   ¤   result = OTRcv( tsp->tcps_ep, rbuf, rbuflen, &flags );
e20fe4 ¤   ¤   }
351b52 ¤   ¤
e21d43 ¤   ¤   if ( result < 0 ) {
fa8e4f ¤   ¤   ¤   return( -1 );
7f0fe4 ¤   ¤   }
1c1b52 ¤   ¤
510e42 ¤   ¤   OTCountDataBytes( tsp->tcps_ep, &dataAvail );
92ee47 ¤   ¤   if ( dataAvail == 0 ) {
db4d21 ¤   ¤   ¤   tsp->tcps_data = 0;
770fe4 ¤   ¤   }
0baf5a
a38bdb ¤   ¤   return( result );
6e67c5 ¤
19f037 ¤   } else {
3dfda2 #endif /* SUPPORT_OPENTRANSPORT */
4c67c5 ¤
0973de ¤   ¤   if ( tsp->tcps_sptr == (StreamPtr)NULL ) {
218e4f ¤   ¤   ¤   return( -1 );
150fe4 ¤   ¤   }
e61b52 ¤   ¤
e827ea ¤   ¤   GetDateTime( &time );
02d448 ¤   ¤   end_time = time + timeout;
4b67c5 ¤
f74b87 ¤   ¤   while(( timeout <= 0 || end_time > time ) && tsp->tcps_data < 1 &&
422b21 ¤   ¤   ¤   ¤   !tsp->tcps_terminated ) {
8310e2 ¤   ¤   ¤   GetDateTime( &time );
--fa47 0006caa4e64401201f0 Page 8 of tcp.c
326da6 ¤   ¤   ¤   SystemTask();
d70fe4 ¤   ¤   }
281b52 ¤   ¤
fe3740 ¤   ¤   if ( tsp->tcps_data < 1 ) {
3a6a3a ¤   ¤   ¤   return( tsp->tcps_terminated ? -3 : -1 );
6b0fe4 ¤   ¤   }
2287c7 ¤   ¤   ¤
ec8dea ¤   ¤   bzero( (char *)&pb, sizeof( pb ));¤
917dbc ¤   ¤   pb.csCode = TCPRcv;
ef488c ¤   ¤   pb.ioCRefNum = tsp->drefnum;
484e11 ¤   ¤   pb.tcpStream = tsp->tcps_sptr;
63090e ¤   ¤   pb.csParam.receive.commandTimeoutValue = timeout;
465320 ¤   ¤   pb.csParam.receive.rcvBuff = (char *)rbuf;¤
88a54e ¤   ¤   pb.csParam.receive.rcvBuffLen = rbuflen;
9d1b52 ¤   ¤
6faf26 ¤   ¤   if ( PBControlSync( (ParmBlkPtr)&pb ) != noErr || pb.ioResult != noErr ¶
c5ce3d ) {
598e4f ¤   ¤   ¤   return( -1 );
130fe4 ¤   ¤   }
5f1b52 ¤   ¤
1ae03d ¤   ¤   if ( --(tsp->tcps_data) < 0 ) {
de4d21 ¤   ¤   ¤   tsp->tcps_data = 0;
4c0fe4 ¤   ¤   }
481b52 ¤   ¤
257971 ¤   ¤   return( pb.csParam.receive.rcvBuffLen );
b2af5a
7a8b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
2af828 ¤   }¤
43fda2 #endif /* SUPPORT_OPENTRANSPORT */
1e4bf6 #pragma unused (dlp)
74efe6 }
c4af5a
ee38e5 /*
dbb16a ·* send TCP data
0ca178 ·* "sp" is the stream to write to
deca42 ·* "wbuf" is "wbuflen" bytes of data to send
ec209d ·* returns < 0 if error, number of bytes written if no error
1a495d ·*/
bd6fcf long
b2ea87 tcpwrite( tcpstream * tsp, unsigned char * wbuf, unsigned short wbuflen ) {
085960 ¤   TCPiopb¤¤   pb;
3d6c54 ¤   wdsEntry¤   wds[ 2 ];
5b5745 ¤   OSErr ¤ ¤   err;
c08b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
040e54 ¤   OTResult ¤  ¤   result;
d41f4f ¤   unsigned short¤ nwritten;
37fda2 #endif /* SUPPORT_OPENTRANSPORT */
3367c5 ¤
1e8b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
75c063 ¤   if ( gHaveOT ) {
be67c5 ¤
03e2f8 ¤   ¤   if ( tsp->tcps_ep == NULL ) {
bd8e4f ¤   ¤   ¤   return( -1 );
bc0fe4 ¤   ¤   }
93af5a
ea1b17 ¤   ¤   /*
b9699b ¤   ¤   ·* We used to do a single call to OTSnd() here, framed with OTSetBlocki¶
8d1851 ng() and OTSetNonBlocking()
45b2aa ¤   ¤   ·* this caused crashes deep inside OpenTransport when writes were large¶
34a65d ·or done in
b67999 ¤   ¤   ·* rapid succession, so now we never turn on blocking mode
c29de3 ¤   ¤   ·*/
297013 ¤   ¤   nwritten = 0;
c7042f ¤   ¤   while ( wbuflen > 0 ) {
592aa3 ¤   ¤   ¤   if (( result = OTSnd( tsp->tcps_ep, wbuf, wbuflen, 0 )) < 0 ) {
eb4fbe ¤   ¤   ¤   ¤   if ( result != kOTFlowErr ) {
1814c3 ¤   ¤   ¤   ¤   ¤   break;
572613 ¤   ¤   ¤   ¤   }
59042d ¤   ¤   ¤   } else {
26bf9b ¤   ¤   ¤   ¤   nwritten += result;
f657d0 ¤   ¤   ¤   ¤   if (( wbuflen -= result ) > 0 ) {
6cd3fa ¤   ¤   ¤   ¤   ¤   SystemTask();
--b72c 0004586bc08401201f0 Page 9 of tcp.c
700941 ¤   ¤   ¤   ¤   ¤   wbuf += result;
de2613 ¤   ¤   ¤   ¤   }
eba3a6 ¤   ¤   ¤   }
7b0fe4 ¤   ¤   }
4a34c5 ¤   ¤   return(( wbuflen == 0 ) ? nwritten : result );
88af5a
f1f037 ¤   } else {
67fda2 #endif /* SUPPORT_OPENTRANSPORT */
7f67c5 ¤
fc73de ¤   ¤   if ( tsp->tcps_sptr == (StreamPtr)NULL ) {
7c8e4f ¤   ¤   ¤   return( -1 );
c40fe4 ¤   ¤   }
671b52 ¤   ¤
453ce1 ¤   ¤   wds[ 0 ].length = wbuflen;
08c2f2 ¤   ¤   wds[ 0 ].ptr = (char *)wbuf;
cf9e83 ¤   ¤   wds[ 1 ].length = 0;
611b52 ¤   ¤
ad8dea ¤   ¤   bzero( (char *)&pb, sizeof( pb ));¤
90af54 ¤   ¤   pb.csCode = TCPSend;
07488c ¤   ¤   pb.ioCRefNum = tsp->drefnum;
dd4e11 ¤   ¤   pb.tcpStream = tsp->tcps_sptr;
3d251a ¤   ¤   pb.csParam.send.wdsPtr = (Ptr)wds;
54093d ¤   ¤   pb.csParam.send.validityFlags = 0;
811b52 ¤   ¤
257334 ¤   ¤   if (( err = PBControlSync( (ParmBlkPtr)&pb )) != noErr || pb.ioResult !¶
eb1af6 = noErr ) {
328e4f ¤   ¤   ¤   return( -1 );
cb0fe4 ¤   ¤   }
fd1b52 ¤   ¤
52fd3c ¤   ¤   return( wbuflen );
03af5a
c78b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
af9371 ¤   }
46fda2 #endif /* SUPPORT_OPENTRANSPORT */
39efe6 }
76af5a
8dfe2c static pascal void
be4631 tcp_asynchnotify(
250ff7 ¤   StreamPtr¤  ¤   ¤   tstream,
3f481b ¤   unsigned short¤ ¤   event,
cd31f1 ¤   Ptr¤¤   ¤   ¤   ¤   userdatap,
7babd7 ¤   unsigned short¤ ¤   term_reason,¤
7bc572 ¤   struct ICMPReport¤  *icmpmsg
295b71 )
4fbb36 {
b74716 ¤   tcpstream¤  *tsp;
7e67c5 ¤
6a3316 ¤   tsp = (tcpstream *)userdatap;
c19486 ¤   switch( event ) {
011be3 ¤   ¤   case TCPDataArrival:
981646 ¤   ¤   ¤   ++(tsp->tcps_data);
7bcdcb ¤   ¤   ¤   break;
f02226 ¤   ¤   case TCPClosing:
a35002 ¤   ¤   case TCPTerminate:
efe49d ¤   ¤   case TCPULPTimeout:
f6336f ¤   ¤   ¤   tsp->tcps_terminated = true;
53cdcb ¤   ¤   ¤   break;
0b9ae3 ¤   ¤   default:
04cdcb ¤   ¤   ¤   break;
f09371 ¤   }
ac2271 #pragma unused (tstream, term_reason, icmpmsg)
faefe6 }
d3af5a
b2af5a
31146c short
eaca60 tcpgetpeername( tcpstream *tsp, ip_addr *addrp, tcp_port *portp ) {
095960 ¤   TCPiopb¤¤   pb;
4030bd ¤   OSErr¤  ¤   err;
86af5a
cc8b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
53c063 ¤   if ( gHaveOT ) {
4567c5 ¤
--9e58 0001f214972401201f0 Page 10 of tcp.c
56e2f8 ¤   ¤   if ( tsp->tcps_ep == NULL ) {
728e4f ¤   ¤   ¤   return( -1 );
960fe4 ¤   ¤   }
ed87c7 ¤   ¤   ¤
1815ce ¤   ¤   if ( addrp != NULL ) {
39df68 ¤   ¤   ¤   *addrp = tsp->tcps_remoteaddr;
f60fe4 ¤   ¤   }
3867c5 ¤
408ef9 ¤   ¤   if ( portp != NULL ) {
e89d4a ¤   ¤   ¤   *portp = tsp->tcps_remoteport;
b90fe4 ¤   ¤   }
911b52 ¤   ¤
98f037 ¤   } else {
13fda2 #endif /* SUPPORT_OPENTRANSPORT */
3767c5 ¤
e873de ¤   ¤   if ( tsp->tcps_sptr == (StreamPtr)NULL ) {
2f8e4f ¤   ¤   ¤   return( -1 );
1d0fe4 ¤   ¤   }
5387c7 ¤   ¤   ¤
858dea ¤   ¤   bzero( (char *)&pb, sizeof( pb ));¤
1913dc ¤   ¤   pb.csCode = TCPStatus;
f7488c ¤   ¤   pb.ioCRefNum = tsp->drefnum;
5c4e11 ¤   ¤   pb.tcpStream = tsp->tcps_sptr;
091b52 ¤   ¤
567334 ¤   ¤   if (( err = PBControlSync( (ParmBlkPtr)&pb )) != noErr || pb.ioResult !¶
d81af6 = noErr ) {
8e07bf ¤   ¤   ¤   return( err );
a30fe4 ¤   ¤   }
9767c5 ¤
0315ce ¤   ¤   if ( addrp != NULL ) {
97b596 ¤   ¤   ¤   *addrp = pb.csParam.status.remoteHost;
700fe4 ¤   ¤   }
fe67c5 ¤
4c8ef9 ¤   ¤   if ( portp != NULL ) {
66eb27 ¤   ¤   ¤   *portp = pb.csParam.status.remotePort;
960fe4 ¤   ¤   }
d9af5a
348b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
fb9371 ¤   }
41af5a
dccaeb ¤   return( kOTNoError );
70c689 #else /* SUPPORT_OPENTRANSPORT */
0179ad ¤   return( noErr );
e7fda2 #endif /* SUPPORT_OPENTRANSPORT */
d5efe6 }
39af5a
2caf5a
8838e5 /*
16ef2b ·* bzero -- set "len" bytes starting at "p" to zero
ec495d ·*/
7f2978 static void
3c0795 bzero( char *p, unsigned long len )
d3bb36 {
3c1d57 ¤   unsigned long¤  i;
1567c5 ¤
5a1942 ¤   for ( i = 0; i < len; ++i ) {
b97976 ¤   ¤   *p++ = '\0';
4d9371 ¤   }
03efe6 }
46af5a
86af5a
807c35 pascal void
2c3caa setdoneflag( struct hostInfo *hip, char *donep )
72bb36 {
5bb36e ¤   ++(*donep);
195291 #pragma unused (hip)
c7efe6 }
ceaf5a
76af5a
7438e5 /*
90e8af ·* return a hostInfo structure for "host" (return != noErr if error)
1f495d ·*/
--ecef 00082a33556401201f0 Page 11 of tcp.c
bb146c short
408b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
8ca794 gethostinfobyname( char *host, InetHostInfo *hip ) {
74c689 #else /* SUPPORT_OPENTRANSPORT */
510b4f gethostinfobyname( char *host, struct hostInfo *hip ) {
84fda2 #endif /* SUPPORT_OPENTRANSPORT */
b25dba ¤   char¤   ¤   ¤   ¤   ¤   done = 0;
d08b38 ¤   OSStatus¤   ¤   ¤   ¤   err;
5256eb ¤   long¤   ¤   ¤   ¤   ¤   time;
7be250 ¤   ResultUPP¤  ¤   ¤   ¤   rupp;
c659ea #ifdef notdef
f0ee8d ¤   struct dnr_struct¤  ¤   dnr_global = {nil, 0};
e2e218 #endif /* notdef */
e68b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
86d1ca ¤   hostInfo¤   ¤   ¤   ¤   hi;¤¤   ¤   ¤   /* Old MacTCP version of hostinfo */
6b1a8b ¤   InetSvcRef¤ ¤   ¤   ¤   inetsvc;¤   ¤   /* Internet services reference */
3dfda2 #endif /* SUPPORT_OPENTRANSPORT */
04af5a
698b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
f8c063 ¤   if ( gHaveOT ) {
3c67c5 ¤
912f28 ¤   ¤   // Get an Internet Services reference
b6a7f3 ¤   ¤   inetsvc = OTOpenInternetServices( kDefaultInternetServicesPath, 0, &err¶
1754c8 ·);
62bc22 ¤   ¤   if ( !inetsvc || err != kOTNoError ) {
b7cb06 ¤   ¤   ¤   if ( err == kOTNoError ) {
0c976c ¤   ¤   ¤   ¤   err = -1;
47a3a6 ¤   ¤   ¤   }
30cc1d ¤   ¤   ¤   inetsvc = nil;
840fe4 ¤   ¤   }
251b52 ¤   ¤
453bfe ¤   ¤   if ( !err ) {¤
809502 ¤   ¤   ¤   err = OTInetStringToAddress( inetsvc, host, hip );
1d0fe4 ¤   ¤   }
661b52 ¤   ¤
1e4ab3 ¤   ¤   if ( inetsvc ) {
a39a01 ¤   ¤   ¤   OTCloseProvider(inetsvc);
1c0fe4 ¤   ¤   }
8f1b52 ¤   ¤
7df037 ¤   } else {
a5fda2 #endif /* SUPPORT_OPENTRANSPORT */
3067c5 ¤
d1ce74 ¤   ¤   if (( err = kick_mactcp( NULL )) != noErr
bc7d07 ¤   ¤   ¤   ¤   || ( err = OpenResolver( /* &dnr_global, */ NULL )) != noErr ) {
af07bf ¤   ¤   ¤   return( err );
4d0fe4 ¤   ¤   }
4067c5 ¤
92f9a1 ¤   ¤   if (( rupp = NewResultProc( setdoneflag )) == NULL ) {
10a352 ¤   ¤   ¤   err = memFullErr;
d745a6 ¤   ¤   } else {
738b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
9c31dd ¤   ¤   ¤   bzero( (char *)&hi, sizeof( hostInfo ));
6a6166 ¤   ¤   ¤   if (( err = StrToAddr( /* &dnr_global, */ host, &hi, rupp, &done ))¶
5716ee ··== cacheFault ) {
aec689 #else /* SUPPORT_OPENTRANSPORT */
c11984 ¤   ¤   ¤   bzero((char *) hip, sizeof( hostInfo ));
6e58b8 ¤   ¤   ¤   if (( err = StrToAddr( /* &dnr_global, */ host, hip, rupp, &done ))¶
eb16ee ··== cacheFault ) {
10fda2 #endif /* SUPPORT_OPENTRANSPORT */
8a58bb ¤   ¤   ¤   ¤   while( !done ) {
d83bb6 ¤   ¤   ¤   ¤   ¤   Delay( 2L, &time );¤¤   ¤   // querying DN servers; wait fo¶
34d808 r reply
04d3fa ¤   ¤   ¤   ¤   ¤   SystemTask();
f12613 ¤   ¤   ¤   ¤   }
c28b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
e547a3 ¤   ¤   ¤   ¤   err = hi.rtnCode;
23c689 #else /* SUPPORT_OPENTRANSPORT */
ab6d61 ¤   ¤   ¤   ¤   err = hip->rtnCode;
20fda2 #endif /* SUPPORT_OPENTRANSPORT */
7da3a6 ¤   ¤   ¤   }
447854 ¤   ¤   ¤   DisposeRoutineDescriptor( rupp );
820fe4 ¤   ¤   }
--3051 00013f882ad401201f0 Page 12 of tcp.c
2a67c5 ¤
5401f6 ¤   ¤   CloseResolver( /* &dnr_global */ );
171b52 ¤   ¤
f88b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
4e2c4a ¤   ¤   /* Copy the results to the InetHostInfo area passed in by caller */
5e3156 ¤   ¤   BlockMove(hi.cname, hip->name, kMaxHostNameLen);
51c4bf ¤   ¤   BlockMove(hi.addr, hip->addrs, 4*NUM_ALT_ADDRS);
d553e4 ¤   ¤   hip->addrs[NUM_ALT_ADDRS] = 0;
a31b52 ¤   ¤
090f45 ¤   ¤   /* Convert the return code to an OT style return code */
d7df8a ¤   ¤   if ( err == nameSyntaxErr ) {
a60584 ¤   ¤   ¤   err = kOTBadNameErr;
eb3e43 ¤   ¤   } else if ( err == noNameServer || err == authNameErr || err == noAnsEr¶
9663fb r ) {
790584 ¤   ¤   ¤   err = kOTBadNameErr;
3ffeff ¤   ¤   } else if (err != noErr) {
15c1c9 ¤   ¤   ¤   err = kOTSysErrorErr;
8e0fe4 ¤   ¤   }
1867c5 ¤
cd9371 ¤   }
95af5a
98e3ea ¤   if (( err == kOTNoError ) && ( hip->addrs[ 0 ] == 0 )) {
f8bed2 ¤   ¤   err = kOTBadNameErr;
8f9371 ¤   }
6bdeb7 ¤   return( err );
57af5a
a7c689 #else /* SUPPORT_OPENTRANSPORT */
5e1fc7 ¤   if ( err != noErr || (( err == noErr ) && ( hip->addr[ 0 ] == 0 ))) {
7ab3ba ¤   ¤   return( err == noErr ? noAnsErr : err );
068cf7 ··¤ }
1179ad ¤   return( noErr );
88fda2 #endif /* SUPPORT_OPENTRANSPORT */
eaefe6 }
88af5a
8f38e5 /*
173b7b ·* return a hostInfo structure for "addr" (return != noErr if error)
0a495d ·*/
69146c short
d38b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
189384 gethostinfobyaddr( InetHost addr, InetHostInfo *hip )
78c689 #else /* SUPPORT_OPENTRANSPORT */
801cf6 gethostinfobyaddr( ip_addr addr, struct hostInfo *hip )
fffda2 #endif /* SUPPORT_OPENTRANSPORT */
6bbb36 {
a367c5 ¤
ec5dba ¤   char¤   ¤   ¤   ¤   ¤   done = 0;
848b38 ¤   OSStatus¤   ¤   ¤   ¤   err;
2956eb ¤   long¤   ¤   ¤   ¤   ¤   time;
0fe250 ¤   ResultUPP¤  ¤   ¤   ¤   rupp;
ad59ea #ifdef notdef
10ee8d ¤   struct dnr_struct¤  ¤   dnr_global = {nil, 0};
a3e218 #endif /* notdef */
de8b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
96d1ca ¤   hostInfo¤   ¤   ¤   ¤   hi;¤¤   ¤   ¤   /* Old MacTCP version of hostinfo */
401a8b ¤   InetSvcRef¤ ¤   ¤   ¤   inetsvc;¤   ¤   /* Internet services reference */
54fda2 #endif /* SUPPORT_OPENTRANSPORT */
7eaf5a
ef8b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
46c063 ¤   if ( gHaveOT ) {
522f28 ¤   ¤   // Get an Internet Services reference
b3a7f3 ¤   ¤   inetsvc = OTOpenInternetServices( kDefaultInternetServicesPath, 0, &err¶
8654c8 ·);
77bc22 ¤   ¤   if ( !inetsvc || err != kOTNoError ) {
a9cb06 ¤   ¤   ¤   if ( err == kOTNoError ) {
10976c ¤   ¤   ¤   ¤   err = -1;
dca3a6 ¤   ¤   ¤   }
c8cc1d ¤   ¤   ¤   inetsvc = nil;
dd0fe4 ¤   ¤   }
af1b52 ¤   ¤
d661e4 ¤   ¤   if ( !err ) {
50d6b0 ¤   ¤   ¤   err = OTInetAddressToName( inetsvc, addr, hip->name );
130fe4 ¤   ¤   }
--c3c0 000cde10a7f401201f0 Page 13 of tcp.c
f11b52 ¤   ¤
df4ab3 ¤   ¤   if ( inetsvc ) {
c250b6 ¤   ¤   ¤   OTCloseProvider( inetsvc );
920fe4 ¤   ¤   }
4b67c5 ¤
08f037 ¤   } else {
5afda2 #endif /* SUPPORT_OPENTRANSPORT */
f767c5 ¤
6233bb ¤   ¤   if (( err = kick_mactcp( NULL )) != noErr ||
64b25e ¤   ¤   ¤   ¤   ( err = OpenResolver( /* &dnr_global, */ NULL )) != noErr )
bf07bf ¤   ¤   ¤   return( err );
3967c5 ¤
5cf9a1 ¤   ¤   if (( rupp = NewResultProc( setdoneflag )) == NULL ) {
99a352 ¤   ¤   ¤   err = memFullErr;
7245a6 ¤   ¤   } else {
218b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
fb07ef ¤   ¤   ¤   bzero( (char *) &hi, sizeof( hostInfo ));
ef86ca ¤   ¤   ¤   if (( err = AddrToName( /* &dnr_global, */ addr, &hi, rupp, &done )¶
1b1384 ) ·== cacheFault ) {
8ac689 #else /* SUPPORT_OPENTRANSPORT */
c81ac3 ¤   ¤   ¤   bzero( (char *)hip, sizeof( hostInfo ));
059b72 ¤   ¤   ¤   if (( err = AddrToName( /* &dnr_global, */ addr, hip, rupp, &done )¶
481384 ) ·== cacheFault ) {
d1fda2 #endif /* SUPPORT_OPENTRANSPORT */
1e58bb ¤   ¤   ¤   ¤   while( !done ) {
573bb6 ¤   ¤   ¤   ¤   ¤   Delay( 2L, &time );¤¤   ¤   // querying DN servers; wait fo¶
e6d808 r reply
82d3fa ¤   ¤   ¤   ¤   ¤   SystemTask();
392613 ¤   ¤   ¤   ¤   }
788b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
4147a3 ¤   ¤   ¤   ¤   err = hi.rtnCode;
d2c689 #else /* SUPPORT_OPENTRANSPORT */
876d61 ¤   ¤   ¤   ¤   err = hip->rtnCode;
24fda2 #endif /* SUPPORT_OPENTRANSPORT */
95a3a6 ¤   ¤   ¤   }
cc7854 ¤   ¤   ¤   DisposeRoutineDescriptor( rupp );
a30fe4 ¤   ¤   }
8267c5 ¤
6601f6 ¤   ¤   CloseResolver( /* &dnr_global */ );
da67c5 ¤
b58b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
972c4a ¤   ¤   /* Copy the results to the InetHostInfo area passed in by caller */
7e3156 ¤   ¤   BlockMove(hi.cname, hip->name, kMaxHostNameLen);
dbc4bf ¤   ¤   BlockMove(hi.addr, hip->addrs, 4*NUM_ALT_ADDRS);
0a53e4 ¤   ¤   hip->addrs[NUM_ALT_ADDRS] = 0;
331b52 ¤   ¤
130f45 ¤   ¤   /* Convert the return code to an OT style return code */
242a58 ¤   ¤   if (err == nameSyntaxErr) {
650584 ¤   ¤   ¤   err = kOTBadNameErr;
31993e ¤   ¤   } else if (err == noNameServer || err == authNameErr || err == noAnsErr¶
c8ce3d ) {
060584 ¤   ¤   ¤   err = kOTBadNameErr;
03feff ¤   ¤   } else if (err != noErr) {
69c1c9 ¤   ¤   ¤   err = kOTSysErrorErr;
bf0fe4 ¤   ¤   }
a567c5 ¤
9c9371 ¤   }
f9fda2 #endif /* SUPPORT_OPENTRANSPORT */
ad67c5 ¤
bbdeb7 ¤   return( err );
42efe6 }
33af5a
b638e5 /*
db66e4 ·* return a ASCII equivalent of ipaddr. ·addrstr must be at large enough to hol¶
63a81d d the
47e2f9 ·* result which is of the form "AAA.BBB.CCC.DDD" and can be a maximum of 16 byt¶
a37fec es in size
25495d ·*/
ce146c short
8e8b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
84422c ipaddr2str( InetHost ipaddr, char *addrstr )
cdc689 #else /* SUPPORT_OPENTRANSPORT */
--0c63 00089f76e73401201f0 Page 14 of tcp.c
54014c ipaddr2str( ip_addr ipaddr, char *addrstr )
a5fda2 #endif /* SUPPORT_OPENTRANSPORT */
54bb36 {
dd8b38 ¤   OSStatus¤   ¤   ¤   ¤   err;
2959ea #ifdef notdef
a7ee8d ¤   struct dnr_struct¤  ¤   dnr_global = {nil, 0};
d4e218 #endif /* notdef */
f3af5a
1b8b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
2ac063 ¤   if ( gHaveOT ) {
f767c5 ¤
dad308 ¤   ¤   OTInetHostToString( ipaddr, addrstr );
9e14ca ¤   ¤   err = kOTNoError;
fa67c5 ¤
93f037 ¤   } else {
ddfda2 #endif /* SUPPORT_OPENTRANSPORT */
a967c5 ¤
e633bb ¤   ¤   if (( err = kick_mactcp( NULL )) != noErr ||
d1b25e ¤   ¤   ¤   ¤   ( err = OpenResolver( /* &dnr_global, */ NULL )) != noErr )
c407bf ¤   ¤   ¤   return( err );
4b67c5 ¤
2b80b0 ¤   ¤   err = AddrToStr( ipaddr, addrstr );
a667c5 ¤
1c01f6 ¤   ¤   CloseResolver( /* &dnr_global */ );
cc1b52 ¤   ¤
578b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
f89371 ¤   }
86fda2 #endif /* SUPPORT_OPENTRANSPORT */
8967c5 ¤
e8deb7 ¤   return( err );
69efe6 }
79af5a
74af5a
718b4e #ifdef SUPPORT_OPENTRANSPORT¤   ¤
1ba2ad /*******************************************************************************
faaecf ** EventHandler
290af0 *******************************************************************************¶
ae7fe0 */
e6c3b7 pascal void EventHandler(tcpstream *tsp, OTEventCode event, OTResult result, vo¶
780101 id * /* cookie */)
2abb36 {
b7825b ¤   (void) result;
1167c5 ¤
abac37 ¤   switch(event)
89c7a1 ¤   {
45b0bd ¤   ¤   case T_ORDREL:
f622aa ¤   ¤   case T_DISCONNECT:
c3336f ¤   ¤   ¤   tsp->tcps_terminated = true;
a4cdcb ¤   ¤   ¤   break;
c46703 ¤   ¤   case T_DATA:
bff6d0 ¤   ¤   case T_EXDATA:
171243 ¤   ¤   ¤   tsp->tcps_data += 1;
3bcdcb ¤   ¤   ¤   break;
7b9ae3 ¤   ¤   default:
a3cdcb ¤   ¤   ¤   break;
ff9371 ¤   }
78830f ¤   return;
cfefe6 }
f0fda2 #endif /* SUPPORT_OPENTRANSPORT */
38af5a
a5af5a
0264d1 static OSErr
f8e42a kick_mactcp( short *drefnump )
c8bb36 {
dc8595 ¤   short¤  ¤   ¤   ¤   ¤   ¤   dref;
c2b6ae ¤   OSErr¤  ¤   ¤   ¤   ¤   ¤   err;
3a9f36 ¤   struct GetAddrParamBlock¤   gapb;
69af5a
5938e5 /*
20473d ·* we make sure the MacTCP driver is open and issue a "Get My Address" call
d96231 ·* so that adevs like MacPPP are initialized (MacTCP is dumb)
89495d ·*/
--917a 00112e5aa45401201f0 Page 15 of tcp.c
561341 ¤   if (( err = OpenDriver( "\p.IPP", &dref )) != noErr ) {
19e55e ¤   ¤   return( err );
fd9371 ¤   }
d2af5a
ae437d ¤   if ( drefnump != NULL ) {
2e6cea ¤   ¤   *drefnump = dref;
309371 ¤   }
8caf5a
bad0f4 ¤   bzero( (char *)&gapb, sizeof( gapb ));
8b13b6 ¤   gapb.csCode = ipctlGetAddr;
ea0504 ¤   gapb.ioCRefNum = dref;
a3af5a
60e051 ¤   err = PBControlSync( (ParmBlkPtr)&gapb );
5faf5a
2b79ad ¤   return( noErr );
12efe6 }
--d587 000c8064f92401201f1 Page 1 of tcp.h
bc38e5 /*
79591e ·* tcp.h ·interface to MCS's TCP routines
c0495d ·*/
a1d83c ·
72c20d #include <Dialogs.h>
af9f19 #ifdef SUPPORT_OPENTRANSPORT
c36331 #include <OpenTransport.h>
8f31f3 #include <OpenTptInternet.h>
21fda2 #endif /* SUPPORT_OPENTRANSPORT */
b936ac #include <MacTCP.h>
a0af5a
34173a #ifndef TCP_BUFSIZ
392137 #define TCP_BUFSIZ¤ 8192
68b866 #endif /* TCP_BUFSIZ */
6baf5a
d311e4 typedef struct tcpstream {
096165 ¤   StreamPtr¤  ¤   ¤   tcps_sptr;¤ ¤   ¤   /* stream pointer for MacTCP TCP PB¶
7fd6d1 ·calls */
f09f19 #ifdef SUPPORT_OPENTRANSPORT
66224f ¤   EndpointRef¤¤   ¤   tcps_ep;¤   ¤   ¤   /* OpenTransport end point */
78fda2 #endif /* SUPPORT_OPENTRANSPORT */
221066 ¤   short¤  ¤   ¤   ¤   tcps_data;¤ ¤   ¤   /* count of packets on read queue */
94d3aa ¤   short¤  ¤   ¤   ¤   drefnum;¤   ¤   ¤   /* driver ref num, for convenience ¶
e77fe0 */
38663b ¤   Boolean¤¤   ¤   ¤   tcps_connected;¤¤   /* true if connection was made */
c65f5f ¤   Boolean¤¤   ¤   ¤   tcps_terminated;¤   /* true if connection no longer exi¶
749403 sts */
7e9f19 #ifdef SUPPORT_OPENTRANSPORT
15871a ¤   InetHost¤   ¤   ¤   tcps_remoteaddr;¤   /* Address of our peer */
7ce457 ¤   InetPort¤   ¤   ¤   tcps_remoteport;¤   /* Port number of our peer */
bffda2 #endif /* SUPPORT_OPENTRANSPORT */
73fb32 ¤   unsigned char¤  ¤   *tcps_buffer;¤  ¤   /* buffer given over to system to u¶
42be28 se */
def8ec ¤   struct tcpstream¤   *tcps_next;¤¤   ¤   /* next one in chain */
b280de ¤   TCPNotifyUPP¤   ¤   tcps_notifyupp;¤¤   /* universal proc pointer for notif¶
080424 y routine */
95fba4 } tcpstream, *tcpstreamptr;
90af5a
3f38e5 /*
fb2c81 ·* the Unix-y struct timeval
3f495d ·*/
a01164 struct timeval {
bbdb21 ¤   long¤   tv_sec;¤¤   /* seconds */
b5e8a2 ¤   long¤   tv_usec;¤   /* and microseconds */
7e82f7 };
deaf5a
ad99a8 typedef¤¤   UInt8 byte;
aaaf5a
1d3126 #define TCP_IS_TERMINATED( tsp )¤   ¤   (tsp)->tcps_terminated
47af5a
3d38e5 /*
66b248 ·* function prototypes
6f495d ·*/
379f19 #ifdef SUPPORT_OPENTRANSPORT
3c2e0c OSStatus¤   tcp_init(void);
7f700e void¤   ¤   tcp_shutdown(void);
208d73 Boolean¤¤   tcp_have_opentransport( void );
95fda2 #endif /* SUPPORT_OPENTRANSPORT */
408948 tcpstream ¤ *tcpopen( unsigned char * buf, long buflen );
9f981c tcp_port¤   tcpconnect( tcpstream *s, ip_addr addr, tcp_port port );
273e4f short¤  ¤   tcpclose( tcpstream *s );
e89ed4 long¤   ¤   tcpread( ·tcpstream *s, byte timeout, unsigned char * rbuf,
1f6e39 ¤   ¤   ¤   ¤   unsigned short rbuflen, DialogPtr dlp );
4c1eb1 long¤   ¤   tcpwrite( tcpstream *s, unsigned char * wbuf, unsigned short wbufle¶
712d2d n );
a669cb short¤  ¤   tcpselect( tcpstream *s, struct timeval * timeout );
635064 short¤  ¤   tcpreadready( tcpstream *tsp );
1f8557 short¤  ¤   tcpgetpeername( tcpstream * tsp, ip_addr *addrp, tcp_port *portp );
06af5a
a89f19 #ifdef SUPPORT_OPENTRANSPORT
9939d0 short¤  ¤   gethostinfobyname( char *host, InetHostInfo *hip );
c85796 short¤  ¤   gethostinfobyaddr(InetHost addr, InetHostInfo *hip );
--099b 001e9140e1a401201f1 Page 2 of tcp.h
efa748 short¤  ¤   ipaddr2str( InetHost ipaddr, char *addrstr );
c4c689 #else /* SUPPORT_OPENTRANSPORT */
438393 short¤  ¤   gethostinfobyname( char *host, struct hostInfo *hip );
25891b short¤  ¤   gethostinfobyaddr( ip_addr addr, struct hostInfo *hip );
2cb8e7 short¤  ¤   ipaddr2str( ip_addr ipaddr, char *addrstr );
e9fda2 #endif /* SUPPORT_OPENTRANSPORT */
--54ff 0015cd68a5e401201f2 Page 1 of pgpPFLConfig.h
a70335 /*____________________________________________________________________________
c6b1e5 ¤   pgpPFLConfig.h ·(Macintosh version)
6467c5 ¤
86c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
0d4b0f ¤   All rights reserved.
ff67c5 ¤
c44405 ¤   This file contains the Macintosh version of the configuration file
ffa17a ¤   normally generated by the automatic configure script on Unix.
f8af5a
3da991 ¤   $Id: pgpPFLConfig.h,v 1.7.14.1 1998/11/12 03:18:46 heller Exp $
18f7f7 ____________________________________________________________________________*/
2cebfc #ifndef Included_pgpPFLConfig_h¤/* [ */
4b0204 #define Included_pgpPFLConfig_h
eaaf5a
d201a3 #define HAVE_STDARG_H¤  1
ab3509 #define HAVE_STDLIB_H¤  1
f7af5a
e208a1 #if ! defined( HAVE_UNISTD_H )
7f127f #define HAVE_UNISTD_H¤  1
ab7454 #endif
aaaf5a
7745ad #define NO_POPEN¤   ¤   1
73af5a
59391a #define PATH_MAX¤   ¤   255
b9af5a
6756c2 #define PGP_WORDSBIGENDIAN¤ 1
dcaf5a
f1af5a
67af5a
e0519e #endif /* ] Included_pgpPFLConfig_h */
dcaf5a
397e4d /*__Editor_settings____
2baf5a
ac4126 ¤   Local Variables:
2d7b17 ¤   tab-width: 4
d90e6c ¤   End:
675f8c ¤   vi: ts=4 sw=4
4b9e9b ¤   vim: si
5cd062 _____________________*/

--e732 0001f204c87401201f3 Page 1 of MacDebug.cp
a70335 /*____________________________________________________________________________
68abae ¤   MacDebug.c
1b67c5 ¤
bdc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
ab4b0f ¤   All rights reserved.
9667c5 ¤
9a67c5 ¤
2daf5a
d5b7be ¤   $Id: MacDebug.cp,v 1.15.18.1 1998/11/12 03:18:48 heller Exp $
52f7f7 ____________________________________________________________________________*/
dbaf5a
adbbf4 #include "MacFiles.h"
8285c2 #include "MacStrings.h"
c00d08 #include "pgpMem.h"
c8af5a
cb46ad #include "MacDebug.h"
adaf5a
9aad95 // trick to force inclusion of MacNew.cp by causing link error if missing
df1fe7 #if USE_PGP_OPERATOR_NEW
bcd9b8 ¤   #include "MacNew.h"
8d474c ¤   static MacNewDummy¤ sMacNewDummy;
c97454 #endif
4eaf5a
dd9ba8 #if PGP_DEBUG¤  // [
a8af5a
71a19a // avoid recursive calls with DebugTraps
18f406 #include "MacDebugTrapsOff.h"
ecaf5a
f2af5a
0d3138 static Boolean¤ DebugGetErrorString( OSStatus err, char errString[]);
f4af5a
ceaf5a
77af5a
257997 #define kHStatePurgeableMask¤   0x40
2e17f5 #define kHStateLockedMask¤  ¤   0x80
afe706 #define kHStateResourceMask¤¤   0x20
cbaf5a
8c5fe9 #define HStateIsPurgeable(hState)¤  ( ((hState) & kHStatePurgeableMask) != 0 )
bd3630 #define HStateIsLocked(hState)¤ ¤   ( ((hState) & kHStateLockedMask) != 0 )
1a6194 #define HStateIsResource(hState)¤   ( ((hState) & kHStateResourceMask) != 0 )
45af5a
a5af5a
a3af5a
c0f66a #if PRAGMA_MARK_SUPPORTED
930ff9 #pragma mark --- Utilities ---
207454 #endif
86af5a
540335 /*____________________________________________________________________________
94d023 ¤   Convert a number to a pascal string.
1f67c5 ¤
156fde ¤   This version doesn't move memory, unlike the system version of NumToString,
3dc95f ¤   so it can be used safely anywhere.
58f7f7 ____________________________________________________________________________*/
1533c8 ¤   static void
88cb30 NumToStringBase(
a39dfd ¤   long¤   ¤   num,·
037530 ¤   StringPtr¤  outString,·
1211a7 ¤   UInt16¤ ¤   base,
7ebce6 ¤   Boolean¤¤   isSigned)
87c7a1 ¤   {
021d5b ¤   pgpAssertMsg( base >= 2 && base <= 16, "NumToStringBase: illegal base");
9b7bc7 ¤   pgpAssertMsg( ( ! isSigned ) || base == 10,
51b0af ¤   ¤   "NumToStringBase: signed only applies to base 10");
c4af5a
a8aef9 ¤   if (num == 0)
225b34 ¤   ¤   {
10709e ¤   ¤   outString[ 0 ] = 1;
ffeb82 ¤   ¤   outString[ 1 ] = '0';
a70fe4 ¤   ¤   }
280e24 ¤   else
d45b34 ¤   ¤   {
1ff889 ¤   ¤   Boolean¤¤   isNegative = FALSE;
--722b 00005fddfad401201f3 Page 2 of MacDebug.cp
5a2028 ¤   ¤   UInt32¤ ¤   ulNum;
2edd0a ¤   ¤   UInt8¤  ¤   digitIndex;
da014d ¤   ¤   UInt8¤  ¤   tempBuffer[ 64 ];¤  // not a pascal string
22c4d7 ¤   ¤   UInt8¤  ¤   *outPtr;
12af5a
e10424 ¤   ¤   // only base 10 is treated as signed. If so, convert using positive
ba369a ¤   ¤   // number and remember that it's negative for later.
33a15c ¤   ¤   if (num < 0 &&
6e7251 ¤   ¤   ¤   base == 10 &&
6b5304 ¤   ¤   ¤   isSigned)
3ff776 ¤   ¤   ¤   {
eb18ea ¤   ¤   ¤   isNegative = TRUE;
2e112e ¤   ¤   ¤   num¤¤   = -num;
36a3a6 ¤   ¤   ¤   }
631b52 ¤   ¤
1563e3 ¤   ¤   ulNum = (UInt32) num;
8667c5 ¤
e6887a ¤   ¤   // add digits in convenient (reverse) order
31ff17 ¤   ¤   outPtr¤ = &tempBuffer[ 0 ];
bc014d ¤   ¤   while ( ulNum > 0 )
f9f776 ¤   ¤   ¤   {
70f6b4 ¤   ¤   ¤   UInt32¤ temp;
d8aa5f ¤   ¤   ¤   UInt8¤  digitVal;
4716a6 ¤   ¤   ¤   static unsigned char¤   sDigits[] = "0123456789ABCDEF";
8467c5 ¤
c3ba04 ¤   ¤   ¤   temp¤   ¤   = ulNum/base;
7c706e ¤   ¤   ¤   digitVal¤   = ulNum - (temp * base);
8667c5 ¤
9a8c7f ¤   ¤   ¤   *outPtr++¤  = sDigits[ digitVal ];
e767c5 ¤
19d1b6 ¤   ¤   ¤   ulNum = temp;
24a3a6 ¤   ¤   ¤   }
d967c5 ¤
b67fe5 ¤   ¤   if ( isNegative )
63f776 ¤   ¤   ¤   {
243ff9 ¤   ¤   ¤   *outPtr++ = '-';
bda3a6 ¤   ¤   ¤   }
4367c5 ¤
c191a6 ¤   ¤   // reverse the digits so they're in the correct order
6285d0 ¤   ¤   outString[0] = outPtr - &tempBuffer[ 0 ];
6667c5 ¤
1a7ca5 ¤   ¤   for (digitIndex = 1; digitIndex <= outString[0]; ++digitIndex)
09f776 ¤   ¤   ¤   {
d06eef ¤   ¤   ¤   outString[ digitIndex ] = *--outPtr;
32a3a6 ¤   ¤   ¤   }
7a0fe4 ¤   ¤   }
2a9371 ¤   }
14af5a
78af5a
d70335 /*____________________________________________________________________________
809209 ¤   Convert a number to a string (same as NumToString).
6b67c5 ¤
fbe3bc ¤   Unlike the system version, does not move memory.
28f7f7 ____________________________________________________________________________*/
8e33c8 ¤   static void
470464 DebugNumToPString(
08526d ¤   long¤   ¤   num,
27615f ¤   StringPtr¤  string)
41c7a1 ¤   {
76937b ¤   NumToStringBase( num, string, 10, TRUE);
4a9371 ¤   }
57af5a
5eaf5a
78f66a #if PRAGMA_MARK_SUPPORTED
5bdacc #pragma mark -
187454 #endif
eaaf5a
18af5a
310335 /*____________________________________________________________________________
b1aec3 ¤   Build an assert message using several strings.
1567c5 ¤
051dd1 ¤   Output is a pascal string, since it will usually be used to call
--21b9 000cdb76964401201f3 Page 3 of MacDebug.cp
76f514 ¤   DebugStr().
c4f7f7 ____________________________________________________________________________*/
c433c8 ¤   static void
6eb0d0 BuildBadAddressMsg(
e608f8 ¤   StringPtr¤  ¤   ¤   result,
79d690 ¤   const char *¤   ¤   prefix,
ae8206 ¤   const char *¤   ¤   varName,
bbe99d ¤   const char *¤   ¤   suffix)
2dc7a1 ¤   {
31598b ¤   pgpFormatPStr255( result, TRUE,
f26889 ¤   ¤   "%s: '%s' [%s]", prefix, varName, suffix );
049371 ¤   }
27af5a
0faf5a
e933c8 ¤   static void
36872c MemoryDummy(short¤  dummy)
a0c7a1 ¤   {
177b1e ¤   ++dummy;
ca9371 ¤   }
71af5a
04af5a
0eaf5a
3daf5a
e90335 /*____________________________________________________________________________
23b3ba ¤   Assert (and possibly crash) if the handle is invalid
e370b3 ¤   This routine expressly does not return a value because part of its
19da4d ¤   checks may result in a crash if a handle is "extra" bogus.
6df7f7 ____________________________________________________________________________*/
dd6d52 ¤   void
ebeed0 _AssertHandleIsValid(
bc2f88 ¤   const void *¤   ¤   theHandle,¤ // void * avoids need to cast
30e427 ¤   const char *¤   ¤   varName,¤   // a null terminated C string
9ef9d6 ¤   const char *¤   ¤   msg,
06de88 ¤   const char *¤   ¤   fileName,
fe8845 ¤   const UInt32¤   ¤   ¤   lineNumber)
5fc7a1 ¤   {
7f4351 ¤   OSErr¤  err;
0a1d63 ¤   Str255¤ result;
6567c5 ¤
55f509 ¤   result[0]¤  = 0;
2567c5 ¤
0f7e98 ¤   if ( IsNull( msg ) )
675b34 ¤   ¤   {
a50e65 ¤   ¤   msg¤= "AssertHandleIsValid()";
ef0fe4 ¤   ¤   }
0067c5 ¤
e64338 ¤   char¤   compositeMsg[ 512 ];
228ce5 ¤   pgpFormatStr( compositeMsg, sizeof(compositeMsg), TRUE,
be820c ¤   ¤   "AssertHandleIsValid: %s: %s\rin: %s line #%lu",
a4ee51 ¤   ¤   msg, varName, fileName, (UInt32)lineNumber);
190fba ¤   pgpAssertAddrValidMsg( theHandle, long, compositeMsg);
56af5a
5667c5 ¤
7d3ffc ¤   /*_____________________________________________________________________
a31f29 ¤   make a memory reference to force a crash here if the handle is invalid
888817 ¤   It is better to force a crash here,·
16930b ¤   rather than crashing in some obscure place in the ROM later
1067c5 ¤
39bbf9 ¤   call a dummy routine to hopefully prevent compiler from simply
b67ae6 ¤   optimizing out our dereference.
aeaedc ¤   _______________________________________________________________________*/
1d5297 ¤   MemoryDummy( *(short *)theHandle );
281b52 ¤   ¤
8427b4 ¤   (void)HandleZone( (Handle) theHandle );
42e3a3 ¤   err¤= MemError();
087a91 ¤   if ( IsErr( err ) )
a75b34 ¤   ¤   {
525b29 ¤   ¤   char¤   errString[ 256 ];
0b1b52 ¤   ¤
478ba0 ¤   ¤   DebugGetErrorString( err, errString );
8a1b52 ¤   ¤
cd9cde ¤   ¤   pgpFormatPStr255( result, TRUE,
--2ab6 0000ae7d0ae401201f3 Page 4 of MacDebug.cp
091ef2 ¤   ¤   "error '%s' from HandleZone for '%s'\r%s", errString, varName, msg);
b15a1b ¤   ¤   pgpDebugPStr( result );
890fe4 ¤   ¤   }
fc67c5 ¤
5534df ¤   if ( IsntNull( *(Handle)theHandle ) ·)
924370 ¤   ¤   // check to see if we can get its size (if it has a master pointer)
d15b34 ¤   ¤   {
68f0d8 ¤   ¤   (void)GetHandleSize( (Handle) theHandle );
c22416 ¤   ¤   err¤= MemError();
b38cf4 ¤   ¤   if ( IsErr( err ) )
adf776 ¤   ¤   ¤   {
a1b45a ¤   ¤   ¤   char¤   errString[ 256 ];
981b52 ¤   ¤
5e5312 ¤   ¤   ¤   DebugGetErrorString( err, errString );
841b52 ¤   ¤
0a14b8 ¤   ¤   ¤   pgpFormatPStr255( result, TRUE,
29bec7 ¤   ¤   ¤   ¤   "error '%s' (%ld) from GetHandleSize for '%s'\r[%s]",
a4d6c7 ¤   ¤   ¤   ¤   errString, (long)err, varName, msg);
9f87c7 ¤   ¤   ¤
acd1e7 ¤   ¤   ¤   pgpDebugPStr( result );
99a3a6 ¤   ¤   ¤   }
6a0fe4 ¤   ¤   }
909371 ¤   }
5d67c5 ¤
3f67c5 ¤
250335 /*____________________________________________________________________________
be7e25 ¤   A resource should be a valid Handle and be a resource
7df7f7 ____________________________________________________________________________*/
9e6d52 ¤   void
4d241c _AssertResourceIsValid(
212f88 ¤   const void *¤   ¤   theHandle,¤ // void * avoids need to cast
0ee427 ¤   const char *¤   ¤   varName,¤   // a null terminated C string
f0f9d6 ¤   const char *¤   ¤   msg,
31de88 ¤   const char *¤   ¤   fileName,
8b8845 ¤   const UInt32¤   ¤   ¤   lineNumber)
f7c7a1 ¤   {
87ea05 ¤   _AssertHandleIsValid( theHandle, varName, msg, fileName, lineNumber);
0aaf5a
8ef2f2 ¤   if ( ! HStateIsResource( HGetState( (Handle)theHandle ) ) )
285b34 ¤   ¤   {
acb97b ¤   ¤   pgpDebugFmtMsg( ( pgpaFmtPrefix,
b394e5 ¤   ¤   ¤   "AssertResourceIsValid: "
a1536a ¤   ¤   ¤   "not a resource '%s'\r[%s]\rin: %s line #%lu",
695165 ¤   ¤   varName, msg, fileName, (UInt32)lineNumber) );
850fe4 ¤   ¤   }
219371 ¤   }
2f67c5 ¤
deaf5a
89af5a
df67c5 ¤
00af5a
75f66a #if PRAGMA_MARK_SUPPORTED
1adacc #pragma mark -
e77454 #endif
a7af5a
aeaf5a
90af5a
27af5a
520335 /*____________________________________________________________________________
2e8545 ¤   A table consists of an array of entries.
52f7f7 ____________________________________________________________________________*/
a5533a typedef struct OSErrStringTable
5fc7a1 ¤   {
113ef8 ¤   UInt16¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   numEntries;
19de41 ¤   const DebugOSErrStringTableEntry¤   *entries;
d28a1e ¤   } OSErrStringTable;
70af5a
ccaf5a
b70335 /*____________________________________________________________________________
ee82b0 ¤   Add an error string table to the list of tables. If the table is already
694dc7 ¤   in our list, do nothing.
0af7f7 ____________________________________________________________________________*/
--5d68 00097bc4770401201f3 Page 5 of MacDebug.cp
769da0 #define kMaxErrStringTables¤¤   20
aad643 static OSErrStringTable¤¤   sOSErrStringTables[ kMaxErrStringTables ] = {0,};
72dd0c static UInt16¤  ¤   ¤   ¤   sNumOSErrStringTables¤  = 0;
6d6d52 ¤   void
651515 DebugAddOSErrStringTable(
ff06d8 ¤   const DebugOSErrStringTableEntry¤   *entries,
ac866a ¤   UInt16 numEntries)
5dc7a1 ¤   {
ddc6be ¤   Boolean¤alreadyInList¤  = FALSE;
7642c4 ¤   UInt16¤ tableIndex;
95af5a
4997f7 ¤   // see if we already have the table in our list
f160cd ¤   for( tableIndex = 0; tableIndex < sNumOSErrStringTables; ++tableIndex)
ea5b34 ¤   ¤   {
8351ec ¤   ¤   if ( sOSErrStringTables[tableIndex].entries == entries )
abf776 ¤   ¤   ¤   {
53bddf ¤   ¤   ¤   alreadyInList¤  = TRUE;
9dcdcb ¤   ¤   ¤   break;
47a3a6 ¤   ¤   ¤   }
dd0fe4 ¤   ¤   }
bfaf5a
3fe069 ¤   if ( ! alreadyInList )
275b34 ¤   ¤   {
1f3c53 ¤   ¤   if ( sNumOSErrStringTables < kMaxErrStringTables )
23f776 ¤   ¤   ¤   {
8026ed ¤   ¤   ¤   OSErrStringTable *table¤=
87c2d0 ¤   ¤   ¤   ¤   &sOSErrStringTables[ sNumOSErrStringTables ];
d787c7 ¤   ¤   ¤
42e015 ¤   ¤   ¤   table->entries¤ ¤   = entries;
34239f ¤   ¤   ¤   table->numEntries¤  = numEntries;
f03e64 ¤   ¤   ¤   ++sNumOSErrStringTables;
0ca3a6 ¤   ¤   ¤   }
8e0e1d ¤   ¤   else
71f776 ¤   ¤   ¤   {
e4ff8a ¤   ¤   ¤   pgpDebugPStr("\pDebugAddOSErrStringTable(): "
78b659 ¤   ¤   ¤   "no more tables available");
2ca3a6 ¤   ¤   ¤   }
0b0fe4 ¤   ¤   }
b09371 ¤   }
b3af5a
76af5a
44af5a
140335 /*____________________________________________________________________________
8391b2 ¤   search an error table for an error code.
9faf5a
3ffa04 ¤   return TRUE if found, FALSE otherwise.
e72dad ¤   If found, return the index in 'foundIndex'
77f7f7 ____________________________________________________________________________*/
77cd8d ¤   static Boolean
2776fe SearchErrorTable(
184376 ¤   OSErr¤  ¤   ¤   ¤   ¤   err,
386f12 ¤   const OSErrStringTable¤ *table,
9e2412 ¤   UInt16 *¤   ¤   ¤   ¤   foundIndex)
1cc7a1 ¤   {
0400d6 ¤   UInt16¤ ¤   pairIndex;
9418ac ¤   Boolean¤¤   foundIt¤= FALSE;
24af5a
927536 ¤   *foundIndex¤= 0;
46af5a
613e21 ¤   for( pairIndex = 0; pairIndex < table->numEntries; ++pairIndex)
325b34 ¤   ¤   {
b69820 ¤   ¤   if ( table->entries[ pairIndex ].err == err )
00f776 ¤   ¤   ¤   {
3766f7 ¤   ¤   ¤   foundIt¤= TRUE;
52549e ¤   ¤   ¤   *foundIndex¤= pairIndex;
19cdcb ¤   ¤   ¤   break;
d4a3a6 ¤   ¤   ¤   }
3a9371 ¤   }
c071b7 ¤   return( foundIt );
f59371 ¤   }
6eaf5a
97af5a
--4865 0003932dbf6401201f3 Page 6 of MacDebug.cp
02ed6b // include standard error table
7c218b #include "MacDebugErrStrings.h"
04af5a
5f33c8 ¤   static void
c54689 AddDefaultErrorStringTables()
58c7a1 ¤   {
4f01d5 ¤   static Boolean sAddedDefaultTables¤ = FALSE;
5daf5a
1ee84b ¤   // add the default table to the list if it has not yet been added
097a88 ¤   if ( ! sAddedDefaultTables )
735b34 ¤   ¤   {
b4755a ¤   ¤   sAddedDefaultTables¤= TRUE;
b4af5a
dba1a6 ¤   ¤   DebugAddOSErrStringTable( sSystemErrorsTable,
fcbc7b ¤   ¤   ¤   sizeof( sSystemErrorsTable ) / sizeof( sSystemErrorsTable[0] ));
7a0fe4 ¤   ¤   }
289371 ¤   }
79af5a
23af5a
89af5a
bd0335 /*____________________________________________________________________________
21c515 ¤   Get a pascal string corresponding to an error code.
b967c5 ¤
c74fd8 ¤   If a string was found, return TRUE,
174524 ¤   otherwise return false and use a numeric code.
b4f7f7 ____________________________________________________________________________*/
a9cd8d ¤   static Boolean
feae73 DebugGetErrorString(
e804db ¤   OSStatus¤   err,
f8d731 ¤   char¤   ¤   errStringOut[])
5ac7a1 ¤   {
302593 ¤   UInt16¤ ¤   tableIndex;
454e77 ¤   Boolean¤¤   haveString¤ = FALSE;
f7af5a
4595d0 ¤   AddDefaultErrorStringTables();
feaf5a
66e0ae ¤   errStringOut[0]¤= 0;
8067c5 ¤
a59e36 ¤   // search all error tables one-by-one until we find a match
5160cd ¤   for( tableIndex = 0; tableIndex < sNumOSErrStringTables; ++tableIndex)
575b34 ¤   ¤   {
cc72de ¤   ¤   const OSErrStringTable¤ *table;
cb7ad7 ¤   ¤   UInt16¤ ¤   entryIndex;
9aaf5a
8fb28f ¤   ¤   table¤  = &sOSErrStringTables[tableIndex];
7eaf5a
ad7d39 ¤   ¤   if ( SearchErrorTable( err, table, &entryIndex) )
3ef776 ¤   ¤   ¤   {
76976f ¤   ¤   ¤   haveString¤ = TRUE;
ac5fbc ¤   ¤   ¤   CopyCString( table->entries[entryIndex].cString, errStringOut);
06cdcb ¤   ¤   ¤   break;
81a3a6 ¤   ¤   ¤   }
740fe4 ¤   ¤   }
1067c5 ¤
2322b4 ¤   if ( errStringOut[ 0 ] == '\0' )
165b34 ¤   ¤   {
760bb4 ¤   ¤   Str255¤ errStringTemp;
041b52 ¤   ¤
86c876 ¤   ¤   // just return the numeric code
360e5e ¤   ¤   DebugNumToPString( err, errStringTemp);
d155e6 ¤   ¤   PToCString( errStringTemp, errStringOut );
740fe4 ¤   ¤   }
2e67c5 ¤
abf21d ¤   return( haveString );
cc9371 ¤   }
75af5a
b5af5a
bcaf5a
29af5a
680335 /*____________________________________________________________________________
97a88f ¤   drop into the debugger with an assert if 'err' is not 'noErr'
39f7f7 ____________________________________________________________________________*/
--59e0 000fdfbfd93401201f3 Page 7 of MacDebug.cp
3b6d52 ¤   void
d2a04a _AssertNoErr(
565fae ¤   OSStatus¤   ¤   ¤   err,
129334 ¤   const char *¤   ¤   optionalMsg,
6ea283 ¤   const char *¤   ¤   srcFileName,
ae8845 ¤   const UInt32¤   ¤   ¤   lineNumber)
a5c7a1 ¤   {
85c3b2 #define IsCancelErr( err )¤ ¤   ( (err) == userCanceledErr )
5eaf5a
bb8de1 ¤   // don't report cancel errors·
a6802c ¤   if ( IsErr( err ) && ! IsCancelErr( err ) )
2c5b34 ¤   ¤   {
e4a5d0 ¤   ¤   Str255¤ msg;
6e5b29 ¤   ¤   char¤   errString[ 256 ];
631b52 ¤   ¤
852ff6 ¤   ¤   if ( IsNull( optionalMsg ) )
fc6ac7 ¤   ¤   ¤   optionalMsg¤= "";
9967c5 ¤
e770e8 ¤   ¤   if ( ! DebugGetErrorString( err, errString) )
48f776 ¤   ¤   ¤   {
f6f7f8 ¤   ¤   ¤   CopyCString( "unknown error", errString );
c4a3a6 ¤   ¤   ¤   }
e11b52 ¤   ¤
1a9833 ¤   ¤   pgpFormatPStr255( msg, TRUE,
70b55d ¤   ¤   ¤   "AssertNoErr: %ld (%s) [%s]\rin: %s line #%lu",
e16139 ¤   ¤   ¤   (long)err, errString, optionalMsg,
7225d6 ¤   ¤   ¤   srcFileName, (UInt32)lineNumber);
d13a9d ¤   ¤   pgpDebugPStr( msg );
2b0fe4 ¤   ¤   }
849371 ¤   }
28af5a
1d67c5 ¤
9b67c5 ¤
a40335 /*____________________________________________________________________________
e65caa ¤   If refNum is not valid, assert and display it
12f7f7 ____________________________________________________________________________*/
756d52 ¤   void
f86ef8 _AssertFileRefNumIsValid(
9f8c0e ¤   short¤  ¤   ¤   ¤   refNum,
eb8206 ¤   const char *¤   ¤   varName,
779334 ¤   const char *¤   ¤   optionalMsg,
25a283 ¤   const char *¤   ¤   srcFileName,
a88845 ¤   const UInt32¤   ¤   ¤   lineNumber)
46c7a1 ¤   {
319834 ¤   #define kFCBSize ·94
6767c5 ¤
32bd7a ¤   if ( refNum <= 0 || ((refNum - 2) % kFCBSize) != 0)
dc5b34 ¤   ¤   {
9da5d0 ¤   ¤   Str255¤ msg;
7a1b52 ¤   ¤
b82ff6 ¤   ¤   if ( IsNull( optionalMsg ) )
c66ac7 ¤   ¤   ¤   optionalMsg¤= "";
831b52 ¤   ¤
109833 ¤   ¤   pgpFormatPStr255( msg, TRUE,
d0df3c ¤   ¤   ¤   "AssertFileRefNumIsValid: "
886089 ¤   ¤   ¤   "invalid refNum '%s' = %ld [%s]\rin: %s line #%lu",
ca09fb ¤   ¤   ¤   varName, (long)refNum, optionalMsg, srcFileName,
f3e379 ¤   ¤   ¤   (UInt32)lineNumber);
853a9d ¤   ¤   pgpDebugPStr( msg );
7e0fe4 ¤   ¤   }
729371 ¤   }
86af5a
ebaf5a
04cd8d ¤   static Boolean
6d15f6 IsValidSpec( const FSSpec *spec )
9fc7a1 ¤   {
ab4574 ¤   Boolean¤isValid¤= TRUE;
7f67c5 ¤
f2f8c3 ¤   if (¤   spec->vRefNum >= 0 ||
c9f840 ¤   ¤   ¤   spec->parID <= 0 ||
9da102 ¤   ¤   ¤   StrLength( spec->name ) == 0 ||
fde76c ¤   ¤   ¤   StrLength( spec->name ) > kMaxHFSFileNameLength·
--36e9 0000e5e4b34401201f3 Page 8 of MacDebug.cp
6bbb73 ¤   ¤   )
875b34 ¤   ¤   {
95d2ed ¤   ¤   isValid¤= FALSE;
500fe4 ¤   ¤   }
2d67c5 ¤
5d195c ¤   return( isValid );
4e9371 ¤   }
81af5a
93af5a
4f67c5 ¤
960335 /*____________________________________________________________________________
a5e272 ¤   If spec is not valid, assert and display the spec
5bf7f7 ____________________________________________________________________________*/
726d52 ¤   void
56ce22 _AssertSpecIsValid(
f6f251 ¤   const FSSpec *¤ ¤   spec,
978206 ¤   const char *¤   ¤   varName,
f69334 ¤   const char *¤   ¤   optionalMsg,
6da283 ¤   const char *¤   ¤   srcFileName,
748845 ¤   const UInt32¤   ¤   ¤   lineNumber)
39c7a1 ¤   {
b18383 ¤   pgpAssertAddrValid( spec, FSSpec);
ad67c5 ¤
f96967 ¤   if ( ! IsValidSpec( spec ) )
885b34 ¤   ¤   {
faa5d0 ¤   ¤   Str255¤ msg;
7913fe ¤   ¤   FSSpec¤ tempSpec;
421b52 ¤   ¤
2d3756 ¤   ¤   // limit name length to kMaxHFSFileNameLength chars to
0d2a3e ¤   ¤   // avoid overflowing available space
3ea351 ¤   ¤   tempSpec¤   = *spec;
ae962d ¤   ¤   if ( StrLength( tempSpec.name ) > kMaxHFSFileNameLength )
77fd30 ¤   ¤   ¤   tempSpec.name[ 0 ]¤ = kMaxHFSFileNameLength;
bc1b52 ¤   ¤
f22ff6 ¤   ¤   if ( IsNull( optionalMsg ) )
2c6ac7 ¤   ¤   ¤   optionalMsg¤= "";
511b52 ¤   ¤
d59833 ¤   ¤   pgpFormatPStr255( msg, TRUE,
fc47a5 ¤   ¤   ¤   "AssertSpecIsValid: "
a6928b ¤   ¤   ¤   "invalid spec '%s'\r in: %s line #%lu\r[%s]\r vRefNum: "
85533e ¤   ¤   ¤   "%ld\rparID: %ld\r name: %S\r",
02506d ¤   ¤   ¤   varName,
42aadc ¤   ¤   ¤   srcFileName, (UInt32)lineNumber,
2e13be ¤   ¤   ¤   optionalMsg, (long)spec->vRefNum, spec->parID, tempSpec.name);
2287c7 ¤   ¤   ¤
2f3a9d ¤   ¤   pgpDebugPStr( msg );
ea0fe4 ¤   ¤   }
969371 ¤   }
c4af5a
cdaf5a
4ccd8d ¤   static Boolean
5d3cee IsValidAEDesc( const AEDesc *desc )
b8c7a1 ¤   {
10a79c ¤   Boolean¤isValid¤= IsntNull( desc );
5167c5 ¤
1b195c ¤   return( isValid );
019371 ¤   }
7967c5 ¤
ddae30 ¤   ¤   ¤   ¤   ¤
4c6d52 ¤   void
5e3292 _AssertAEDescIsValid(
27ea3e ¤   const AEDesc *¤ desc,
cc0f4e ¤   const char *¤   varName,
7293c8 ¤   const char *¤   optionalMsg,
131049 ¤   const char *¤   fileName,
3552e2 ¤   const UInt32¤   ¤   lineNumber)
dfc7a1 ¤   {
d3c90f ¤   pgpAssertAddrValid( desc, AEDesc);
3b67c5 ¤
d584e2 ¤   if ( ! IsValidAEDesc( desc ) )
ce5b34 ¤   ¤   {
0ea5d0 ¤   ¤   Str255¤ msg;
--d9be 0002aa12367401201f3 Page 9 of MacDebug.cp
f11b52 ¤   ¤
632ff6 ¤   ¤   if ( IsNull( optionalMsg ) )
776ac7 ¤   ¤   ¤   optionalMsg¤= "";
d91b52 ¤   ¤
ed9833 ¤   ¤   pgpFormatPStr255( msg, TRUE,
5ae5eb ¤   ¤   ¤   "AssertAEDescIsValid: "
d8bb84 ¤   ¤   ¤   "invalid AEDesc '%s' from %s line #%lu\r[%s]",
b3506d ¤   ¤   ¤   varName,
619eac ¤   ¤   ¤   fileName, (UInt32)lineNumber,
8fb2c0 ¤   ¤   ¤   optionalMsg );
7787c7 ¤   ¤   ¤
f73a9d ¤   ¤   pgpDebugPStr( msg );
9d0fe4 ¤   ¤   }
af67c5 ¤
669371 ¤   }
0667c5 ¤
a067c5 ¤
6b67c5 ¤
276d52 ¤   void
3af9a0 _AssertUPPIsValid(
9ec43f ¤   const UniversalProcPtr¤ upp,
2282fa ¤   const char *¤   ¤   ¤   varName,
6a732b ¤   const char *¤   ¤   ¤   optionalMsg,
5ce36b ¤   const char *¤   ¤   ¤   fileName,
6c812c ¤   const UInt32¤   ¤   ¤   ¤   lineNumber)
8dc7a1 ¤   {
b78e97 ¤   pgpAssertAddrValid( upp, short);
f667c5 ¤
46fdb7 #if TARGET_RT_MAC_CFM
fe7ece ¤   const RoutineDescriptor *descriptor¤= (const RoutineDescriptor *)upp;
9c67c5 ¤
094690 ¤   if ( descriptor->goMixedModeTrap != _MixedModeMagic )
fe5b34 ¤   ¤   {
76a5d0 ¤   ¤   Str255¤ msg;
f81b52 ¤   ¤
9c9833 ¤   ¤   pgpFormatPStr255( msg, TRUE,
4eede1 ¤   ¤   ¤   "AssertUPPIsValid: invalid upp '%s' from %s line #%lu\r[%s]",
ce506d ¤   ¤   ¤   varName,
fd9eac ¤   ¤   ¤   fileName, (UInt32)lineNumber,
6eb2c0 ¤   ¤   ¤   optionalMsg );
2687c7 ¤   ¤   ¤
803a9d ¤   ¤   pgpDebugPStr( msg );
fc0fe4 ¤   ¤   }
2ddb21 #else
a80774 ¤   // avoid compiler complaints about unused args
c605b8 ¤   varName¤¤   = varName;
08e968 ¤   optionalMsg¤= optionalMsg;
904708 ¤   fileName¤   = fileName;
204735 ¤   UInt32 dummy¤   = lineNumber;
e3af5a
8b7454 #endif
2167c5 ¤
e49371 ¤   }
58ae30 ¤   ¤   ¤   ¤   ¤
5daf5a
c20d08 #include "pgpMem.h"
6f6d52 ¤   void
b38fdd MacDebug_FillWithGarbage(
ddc7be ¤   void¤   *ptr,
09d7dc ¤   UInt32¤ byteCount)
8cc7a1 ¤   {
9d563a ¤   //ptr¤  = ptr;
25f969 ¤   //byteCount¤= byteCount;
55e545 ¤   pgpFillMemory( ptr, byteCount, 0xDD );
279371 ¤   }
53af5a
6faf5a
30af5a
00af5a
f4af5a
590335 /*____________________________________________________________________________
2a0b45 ¤   Allocate a Handle which takes most of the remaining heap space or at least
--745a 000a51fac9d401201f3 Page 10 of MacDebug.cp
59db13 ¤   a large chunk of it.
56f7f7 ____________________________________________________________________________*/
f63944 ¤   static Handle
cd902e AllocLargeHandle( )
60c7a1 ¤   {
d2387f ¤   Handle¤ theHandle¤  = nil;
45ea8f ¤   UInt32¤ attemptSize = 128UL * 1024UL;
0a67c5 ¤
1d1ad9 ¤   while ( attemptSize >= 4 )
1c5b34 ¤   ¤   {
6c10d9 ¤   ¤   theHandle¤  = NewHandle( attemptSize );
5bb2f7 ¤   ¤   if ( IsntNull( theHandle ) )
bdcdcb ¤   ¤   ¤   break;
931b52 ¤   ¤
d5b1e1 ¤   ¤   attemptSize¤/= 2;
0a0fe4 ¤   ¤   }
381b52 ¤   ¤
bf89fb ¤   return( theHandle );
789371 ¤   }
9567c5 ¤
8c0335 /*____________________________________________________________________________
b8a983 ¤   Allocate all free space in the current heap, whack the bytes,
a6e67b ¤   then free all allocated space.
bdf7f7 ____________________________________________________________________________*/
746d52 ¤   void
914127 MacDebug_WhackAllFreeSpace()
e1c7a1 ¤   {
814cf6 ¤   typedef struct ListItem
05c7a1 ¤   {
3032fb ¤   ¤   ListItem **¤next;
7b6592 ¤   } ListItem, **ListItemHandle;
226996 ¤   ListItemHandle¤ nextHandle;
b0fd1a ¤   ListItemHandle¤ listHead¤   = nil;
c767c5 ¤
48af0e ¤   // allocate all free space and link it into a singly linked list
a9e4a0 ¤   while ( ( nextHandle = (ListItemHandle)AllocLargeHandle() ) != nil )
9e5b34 ¤   ¤   {
5d6607 ¤   ¤   // safety check:
b9d505 ¤   ¤   // could a Handle ever be less than the size of our link?
1ea4a1 ¤   ¤   if ( GetHandleSize( (Handle)nextHandle ) < sizeof( **nextHandle ) )
a2f776 ¤   ¤   ¤   {
b1879a ¤   ¤   ¤   DisposeHandle( (Handle)nextHandle );
9fcdcb ¤   ¤   ¤   break;
01a3a6 ¤   ¤   ¤   }
7987c7 ¤   ¤   ¤
b98785 ¤   ¤   ¤   (**nextHandle).next¤= listHead;
be7f34 ¤   ¤   ¤   listHead¤   = nextHandle;
ae0fe4 ¤   ¤   }
ab67c5 ¤
dc5588 ¤   // we've now allocated all the space in the heap
8888e3 ¤   // whack all the bytes and free the space
6e2e62 ¤   while ( IsntNull( listHead ) )
fd5b34 ¤   ¤   {
390c11 ¤   ¤   nextHandle¤ = (**listHead).next;
191b52 ¤   ¤
a45afe ¤   ¤   MacDebug_FillWithGarbage( *listHead,
59e6af ¤   ¤   ¤   GetHandleSize( (Handle)listHead ) );
d2bfc0 ¤   ¤   DisposeHandle( (Handle)listHead );
981b52 ¤   ¤
e79047 ¤   ¤   listHead¤   = nextHandle;
370fe4 ¤   ¤   }
bc9371 ¤   }
67af5a
02af5a
32ea9f #endif¤ // ] PGP_DEBUG
3daf5a
9caf5a
e7af5a
d7af5a
c3af5a
15af5a
a5af5a
--e437 00132a07c87401201f3 Page 11 of MacDebug.cp
e0af5a
1aaf5a
17af5a
78af5a
32af5a
--745c 00015e76fd0401201f4 Page 1 of MacDebug.h
a70335 /*____________________________________________________________________________
8b4f06 ¤   MacDebug.h
cc67c5 ¤
e4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
2e4b0f ¤   All rights reserved.
9467c5 ¤
7f67c5 ¤
9aaf5a
1deb9f ¤   $Id: MacDebug.h,v 1.15.12.1 1998/11/12 03:18:48 heller Exp $
a6f7f7 ____________________________________________________________________________*/
f27b7d #pragma once
c6af5a
bc4918 #include <AppleEvents.h>
ee49ca #include <Files.h>
e2fd5c #include <Resources.h>
0daf5a
d00438 #include "MacBasics.h"
0faf5a
dfaf5a
30a146 #include "pgpDebug.h"
fdaf5a
95af5a
f9af5a
4199c6 PGP_BEGIN_C_DECLARATIONS
f4af5a
5baf5a
e10335 /*____________________________________________________________________________
803352 ¤   some compilers don't support #pragma mark, which allows nice markers in the
8acd71 ¤   source file routine name popup menu.
2bf7f7 ____________________________________________________________________________*/
892aa1 #ifdef __MWERKS__
a7af5a
b112db #if ! PGP_DEBUG
3b6a19 ¤   #if powerc
d78616 ¤   ¤   #pragma traceback off
2047b4 ¤   #else
939c3f ¤   ¤   #pragma macsbug off
9fb7ec ¤   #endif
3d7454 #endif
4467c5 ¤
6c7454 #endif
99af5a
60af5a
37af5a
37e85e #if PGP_DEBUG¤  /* [ */
bc0335 /*____________________________________________________________________________
844d56 ¤   OSErrString tables
6ff7f7 ____________________________________________________________________________*/
2caf5a
e9434b /* a single entry in an error table. ·An array of these constitutes a table. */
79d968 typedef struct DebugOSErrStringTableEntry
f4bb36 {
d3dc42 ¤   OSStatus¤   err;
4368b1 ¤   const char¤ *cString;¤  /* a C string */
097443 } DebugOSErrStringTableEntry;
f4af5a
14f721 void¤   DebugAddOSErrStringTable( const DebugOSErrStringTableEntry * entries,
2d97c1 ¤   ¤   ¤   UInt16 numEntries);
9567c5 ¤
e83167 #endif¤ /* ] */
2baf5a
1aaf5a
aaaf5a
f8af5a
da0335 /*____________________________________________________________________________
b3710f ¤   basic asserts and their variants...
e0f7f7 ____________________________________________________________________________*/
3c5a45 #if¤PGP_DEBUG¤  /* [ */
a1af5a
70c79f ¤   #define DebugMsgIf( cond, failStr)¤ ¤   \
9a0f2a ¤   ¤   do {if ( (cond) ) { pgpDebugMsg(failStr);}} while ( FALSE )
1567c5 ¤
--0ce5 000da53ec95401201f4 Page 2 of MacDebug.h
cef624 #else¤  /* ] PGP_DEBUG [ */
76af5a
bd375a ¤   #define DebugMsgIf( cond, failStr)
8a67c5 ¤
9fab79 #endif¤ /* ] PGP_DEBUG */
3aaf5a
d3af5a
38af5a
1daf5a
e00335 /*____________________________________________________________________________
90fc40 ¤   more complex asserts
34f7f7 ____________________________________________________________________________*/
345a45 #if¤PGP_DEBUG¤  /* [ */
a8af5a
dd028d #ifdef _cplusplus
bd04a5 ¤   #define EQ_NIL¤ = nil
e4db21 #else
67bddb ¤   #define EQ_NIL
527454 #endif
2baf5a
14aa64 ¤   void¤   _AssertHandleIsValid(const void *theHandle,
add40e ¤   ¤   ¤   ¤   ¤   const char *varName, const char * optionalMsg,
91eb47 ¤   ¤   ¤   ¤   ¤   const char *fileName, const UInt32 lineNumber);
5aae30 ¤   ¤   ¤   ¤   ¤
814407 ¤   void¤   _AssertResourceIsValid(const void *theHandle,
e1d40e ¤   ¤   ¤   ¤   ¤   const char *varName, const char * optionalMsg,
83eb47 ¤   ¤   ¤   ¤   ¤   const char *fileName, const UInt32 lineNumber);
f9ae30 ¤   ¤   ¤   ¤   ¤
434c91 ¤   void¤   _AssertFileRefNumIsValid( short refNum, const char *varName,
aa07f5 ¤   ¤   ¤   ¤   ¤   const char * optionalMsg EQ_NIL,
3ceb47 ¤   ¤   ¤   ¤   ¤   const char *fileName, const UInt32 lineNumber);
22ae30 ¤   ¤   ¤   ¤   ¤
b26c93 ¤   void¤   _AssertAEDescIsValid( const AEDesc *desc, const char *varName,
b807f5 ¤   ¤   ¤   ¤   ¤   const char * optionalMsg EQ_NIL,
29eb47 ¤   ¤   ¤   ¤   ¤   const char *fileName, const UInt32 lineNumber);
1cae30 ¤   ¤   ¤   ¤   ¤
ca5d54 ¤   void¤   _AssertSpecIsValid( const FSSpec * spec, const char *varName,
0807f5 ¤   ¤   ¤   ¤   ¤   const char * optionalMsg EQ_NIL,
24eb47 ¤   ¤   ¤   ¤   ¤   const char *fileName, const UInt32 lineNumber);
0cae30 ¤   ¤   ¤   ¤   ¤
4de8c1 ¤   void¤   _AssertUPPIsValid( UniversalProcPtr upp, const char *varName,
5907f5 ¤   ¤   ¤   ¤   ¤   const char * optionalMsg EQ_NIL,
98eb47 ¤   ¤   ¤   ¤   ¤   const char *fileName, const UInt32 lineNumber);
f9ae30 ¤   ¤   ¤   ¤   ¤
9d7cf6 ¤   void¤   _AssertNoErr( OSStatus err, const char * optionalMsg,
46eb47 ¤   ¤   ¤   ¤   ¤   const char *fileName, const UInt32 lineNumber);
62af5a
c267c5 ¤
19882f #define AssertHandleIsValid(h, msg)¤¤   ¤   ¤   \
ff0203 ¤   _AssertHandleIsValid( (h), #h, msg, __FILE__, __LINE__)
e767c5 ¤
94ac8b #define AssertResourceIsValid(r, msg)¤  ¤   ¤   \
2c1d54 ¤   _AssertResourceIsValid( (r), #r, msg, __FILE__, __LINE__)
7b67c5 ¤
41538c #define AssertFileRefNumIsValid( r, msg)¤   ¤   \
b26038 ¤   _AssertFileRefNumIsValid( r, #r, msg, __FILE__, __LINE__)
c967c5 ¤
f71a9d #define AssertAEDescIsValid( d, msg )¤  ¤   ¤   \
fcc992 ¤   _AssertAEDescIsValid( d, #d, msg, __FILE__, __LINE__)
1667c5 ¤
8717d3 #define AssertSpecIsValid( s, msg)¤ ¤   ¤   ¤   \
58cde6 ¤   _AssertSpecIsValid( s, #s, msg, __FILE__, __LINE__)
c567c5 ¤
4c4928 #define AssertUPPIsNullOrValid( upp, msg )¤ ¤   \
d39c31 ¤   do\
9c9c39 ¤   {\
dde16a ¤   ¤   if ( IsntNull( upp ) )\
6ef994 ¤   ¤   ¤   _AssertUPPIsValid( (UniversalProcPtr)upp, \
0c0fb0 ¤   ¤   ¤   #upp, msg, __FILE__, __LINE__ );\
2ba21b ¤   } while ( FALSE )
5e67c5 ¤
da13e0 #define AssertNoErr( err, msg)¤ ¤   ¤   ¤   ¤   \
--a55f 0009341d6ae401201f4 Page 3 of MacDebug.h
512a2e ¤   _AssertNoErr( err, msg, __FILE__, __LINE__)
6aaf5a
443e81 #define AssertAddrNullOrValid( addr, type, msg)¤\
179c31 ¤   do\
349c39 ¤   {\
71729b ¤   ¤   if ( IsntNull( addr ) ) \
d09952 ¤   ¤   pgpAssertAddrValidMsg( addr, type, msg );\
4aa21b ¤   } while ( FALSE )
70af5a
56d522 #undef EQ_NIL
afaf5a
13f624 #else¤  /* ] PGP_DEBUG [ */
90af5a
3aba0f ¤   #define AssertHandleIsValid(h, msg)¤
7e98db ¤   #define AssertResourceIsValid(r, msg)¤  ¤   ¤
17233a ¤   #define AssertNoErr(err, msg)¤  ¤   ¤   ¤   ¤
a7328e ¤   #define AssertFileRefNumIsValid( r, msg)
a4ab36 ¤   #define AssertAEDescIsValid( d, msg )
aba28f ¤   #define AssertUPPIsNullOrValid( upp, msg )¤
dafeb5 ¤   #define AssertSpecIsValid( r, msg)
9a67c5 ¤
22d080 ¤   #define AssertAddrNullOrValid( addr, type, msg)
7c67c5 ¤
4dab79 #endif¤ /* ] PGP_DEBUG */
a8af5a
0baf5a
3baf5a
b8af5a
82af5a
940335 /*____________________________________________________________________________
dba652 ¤   'USE_MAC_DEBUG_TRAPS' controls whether debugging traps are used.
c40790 ¤   It can be set before including this file. ·Otherwise, it defaults
c9a8cb ¤   to the same status as PGP_DEBUG
0af7f7 ____________________________________________________________________________*/
2e6994 #ifndef USE_MAC_DEBUG_TRAPS
842b47 ¤   #define USE_MAC_DEBUG_TRAPS¤¤   ( PGP_DEBUG )
537454 #endif
b3af5a
facaa1 #if USE_MAC_DEBUG_TRAPS
c87eff ¤   #include "MacDebugTraps.h"
067454 #endif
80af5a
910335 /*____________________________________________________________________________
90e5fa ¤   'USE_MAC_DEBUG_LEAKS' controls whether leaks code compiles in.
27d1df ¤   it can be set before #including this file. Otherwise, it defaults
392045 ¤   to the same status as USE_MAC_DEBUG_TRAPS.
28f7f7 ____________________________________________________________________________*/
81d205 #if ! USE_MAC_DEBUG_TRAPS
e4990a ¤   #undef USE_MAC_DEBUG_LEAKS
0a7454 #endif
6ad83c ·
9c22d3 #ifndef USE_MAC_DEBUG_LEAKS
08d967 ¤   #define USE_MAC_DEBUG_LEAKS¤¤   ( USE_MAC_DEBUG_TRAPS )
67db21 #else
51fe5e ¤   /* USE_MAC_DEBUG_LEAKS must be off if USE_MAC_DEBUG_TRAPS is off */
1d1016 ¤   #if ! USE_MAC_DEBUG_LEAKS
4f1575 ¤   ¤   #undef USE_MAC_DEBUG_LEAKS
6bfd38 ¤   ¤   #define USE_MAC_DEBUG_LEAKS¤0
65b7ec ¤   #endif
cc7454 #endif
8baf5a
cd426a #include "MacDebugLeaks.h"
a2af5a
f6af5a
62e85e #if PGP_DEBUG¤  /* [ */
8aaf5a
b176e0 /* routines used by PGP_DEBUG code */
cd5265 void¤   MacDebug_FillWithGarbage( void¤ *ptr, UInt32 byteCount);
74ab11 void¤   MacDebug_WhackAllFreeSpace( void );
5eaf5a
48db21 #else
93af5a
--3681 001d63ceaa2401201f4 Page 4 of MacDebug.h
16c026 #define MacDebug_FillWithGarbage( ptr, cnt)
93af5a
7cab79 #endif¤ /* ] PGP_DEBUG */
d0af5a
3baf5a
e0af5a
35af5a
4e1254 PGP_END_C_DECLARATIONS
04af5a
9caf5a
eaaf5a
d6af5a
--53b0 0009608b6d3401201f5 Page 1 of MacDebugErrStrings.h
a70335 /*____________________________________________________________________________
e5f4de ¤   DebugOSErrStrings.inc
5c67c5 ¤
04eb19 ¤   this file is #included in Debug.c
667187 ¤   because of its size, it is kept in this separate file
1faf5a
b4cd06 ¤   Define a table consisting of the OSErr code and a corresponding string.
fcede4 ¤   For convenience, the string is generated using the macro preprocessor,
b3e828 ¤   which generates a C string (null terminated string).
9368a9 ¤   A table could also be generated manually, but this method guarantees
72c5d9 ¤   that the string is identical to the error as seen in the header file.
ccf7f7 ____________________________________________________________________________*/
ae4a7b #define DefineIt(err)¤  {err, #err}
81af5a
0b7200 static const DebugOSErrStringTableEntry¤sSystemErrorsTable[]¤   =
a9c7a1 ¤   {
8bae5a ¤   DefineIt( prWrErr ),
dbce62 ¤   DefineIt( prInitErr ),
d941c9 ¤   DefineIt( rcvrErr ),
54a83a ¤   DefineIt( breakRecd ),
6867c5 ¤
b77fbc ¤   DefineIt( pmBusyErr ),
c84a0d ¤   DefineIt( pmReplyTOErr ),
82ec13 ¤   DefineIt( pmSendStartErr ),
a7cae7 ¤   DefineIt( pmSendEndErr ),
1c51b9 ¤   DefineIt( pmRecvStartErr ),
44e4a5 ¤   DefineIt( pmRecvEndErr ),
2267c5 ¤
ceebeb ¤   DefineIt( noScrapErr ),
9cfccb ¤   DefineIt( noTypeErr ),
8e749e ¤   DefineIt( memROZWarn ),
dfb7e3 ¤   DefineIt( memROZError ),
fef3d5 ¤   DefineIt( memROZErr ),
c83ddd ¤   DefineIt( memFullErr ),
064d37 ¤   DefineIt( nilHandleErr ),
13f971 ¤   DefineIt( memWZErr ),
5edc4a ¤   DefineIt( memPurErr ),
5a9056 ¤   DefineIt( memAdrErr ),
1daf5a
d49a89 ¤   DefineIt( paramErr ),
50c439 ¤   DefineIt( noHardwareErr ),
2829b0 ¤   DefineIt( notEnoughHardwareErr ),
6cd8ec ¤   DefineIt( userCanceledErr ),
58a209 ¤   DefineIt( qErr ),
cd38c9 ¤   DefineIt( vTypErr ),
e4fd5c ¤   DefineIt( corErr ),
55687e ¤   DefineIt( unimpErr ),
340803 ¤   DefineIt( SlpTypeErr ),
3e9cfb ¤   DefineIt( seNoDB ),
7e5710 ¤   DefineIt( controlErr ),
d859f8 ¤   DefineIt( statusErr ),
c0f9a4 ¤   DefineIt( readErr ),
f0c075 ¤   DefineIt( writErr ),
8b7f0c ¤   DefineIt( badUnitErr ),
e8dd9d ¤   DefineIt( unitEmptyErr ),
556850 ¤   DefineIt( openErr ),
9384dd ¤   DefineIt( closErr ),
3972da ¤   DefineIt( dRemovErr ),
2e4cf5 ¤   DefineIt( dInstErr ),
070d9f ¤   DefineIt( abortErr ),
762788 ¤   DefineIt( iIOAbortErr ),
074e68 ¤   DefineIt( notOpenErr ),
9d5973 ¤   DefineIt( unitTblFullErr ),
f31162 ¤   DefineIt( dceExtErr ),
a9372c ¤   DefineIt( slotNumErr ),
26c5f8 ¤   DefineIt( gcrOnMFMErr ),
d7c7e9 ¤   DefineIt( dirFulErr ),
b14218 ¤   DefineIt( dskFulErr ),
dda1ab ¤   DefineIt( nsvErr ),
19e7c1 ¤   DefineIt( ioErr ),
19217c ¤   DefineIt( bdNamErr ),
96271c ¤   DefineIt( fnOpnErr ),
--444c 00090bf3d19401201f5 Page 2 of MacDebugErrStrings.h
485828 ¤   DefineIt( eofErr ),
58dad8 ¤   DefineIt( posErr ),
7ca1bc ¤   DefineIt( mFulErr ),
2a2b74 ¤   DefineIt( tmfoErr ),
3861bc ¤   DefineIt( fnfErr ),
330117 ¤   DefineIt( wPrErr ),
4f6b3e ¤   DefineIt( fLckdErr ),
ea7ee6 ¤   DefineIt( vLckdErr ),
d93b3f ¤   DefineIt( fBsyErr ),
04df82 ¤   DefineIt( dupFNErr ),
af9b1d ¤   DefineIt( opWrErr ),
1a5ff7 ¤   DefineIt( rfNumErr ),
8a7498 ¤   DefineIt( gfpErr ),
a9320f ¤   DefineIt( volOffLinErr ),
35d716 ¤   DefineIt( permErr ),
c328ac ¤   DefineIt( volOnLinErr ),
6d1ba5 ¤   DefineIt( nsDrvErr ),
d41f24 ¤   DefineIt( noMacDskErr ),
f5bc80 ¤   DefineIt( extFSErr ),
89144d ¤   DefineIt( fsRnErr ),
d98a34 ¤   DefineIt( badMDBErr ),
c9f23d ¤   DefineIt( wrPermErr ),
cb4600 ¤   DefineIt( dirNFErr ),
df98cc ¤   DefineIt( tmwdoErr ),
522f96 ¤   DefineIt( badMovErr ),
a786f9 ¤   DefineIt( wrgVolTypErr ),
14a56d ¤   DefineIt( volGoneErr ),
b4a43f ¤   DefineIt( fidNotFound ),
c33b62 ¤   DefineIt( fidExists ),
b51af9 ¤   DefineIt( notAFileErr ),
3df6db ¤   DefineIt( diffVolErr ),
9baddc ¤   DefineIt( catChangedErr ),
ec551d ¤   DefineIt( desktopDamagedErr ),
413421 ¤   DefineIt( sameFileErr ),
d7c6de ¤   DefineIt( badFidErr ),
262877 ¤   DefineIt( envNotPresent ),
f68936 ¤   DefineIt( envBadVers ),
c3fd8e ¤   DefineIt( envVersTooBig ),
f8c55c ¤   DefineIt( fontDecError ),
1caa3e ¤   DefineIt( fontNotDeclared ),
7f7178 ¤   DefineIt( fontSubErr ),
a389f0 ¤   DefineIt( fontNotOutlineErr ),
aa5ca0 ¤   DefineIt( firstDskErr ),
2dd2e5 ¤   DefineIt( lastDskErr ),
684d02 ¤   DefineIt( noDriveErr ),
f2c6a1 ¤   DefineIt( offLinErr ),
b25d13 ¤   DefineIt( noNybErr ),
62176c ¤   DefineIt( noAdrMkErr ),
55e373 ¤   DefineIt( dataVerErr ),
768b5a ¤   DefineIt( badCksmErr ),
24e476 ¤   DefineIt( badBtSlpErr ),
714031 ¤   DefineIt( noDtaMkErr ),
6370c1 ¤   DefineIt( badDCksum ),
261b82 ¤   DefineIt( badDBtSlp ),
45b84e ¤   DefineIt( wrUnderrun ),
61abd0 ¤   DefineIt( cantStepErr ),
22a4f4 ¤   DefineIt( tk0BadErr ),
2fe11d ¤   DefineIt( initIWMErr ),
f88b1d ¤   DefineIt( twoSideErr ),
81f004 ¤   DefineIt( spdAdjErr ),
452262 ¤   DefineIt( seekErr ),
33b9de ¤   DefineIt( sectNFErr ),
3a9bf9 ¤   DefineIt( fmt1Err ),
d51129 ¤   DefineIt( fmt2Err ),
ba5785 ¤   DefineIt( verErr ),
0c5a24 ¤   DefineIt( clkRdErr ),
676ef5 ¤   DefineIt( clkWrErr ),
c8a2fa ¤   DefineIt( memAZErr ),
30e7e8 ¤   DefineIt( memPCErr ),
038386 ¤   DefineIt( memBCErr ),
8431ef ¤   DefineIt( memSCErr ),
906298 ¤   DefineIt( memLockedErr ),
--3694 0006cd8e0b4401201f5 Page 3 of MacDebugErrStrings.h
7ceabf ¤   DefineIt( resourceInMemory ),
83ca97 ¤   DefineIt( writingPastEnd ),
eea035 ¤   DefineIt( inputOutOfBounds ),
f6702b ¤   DefineIt( resNotFound ),
0aaf6c ¤   DefineIt( resFNotFound ),
41ffc5 ¤   DefineIt( addResFailed ),
2a8544 ¤   DefineIt( addRefFailed ),
01f637 ¤   DefineIt( rmvResFailed ),
c38cb6 ¤   DefineIt( rmvRefFailed ),
460bfd ¤   DefineIt( resAttrErr ),
136952 ¤   DefineIt( mapReadErr ),
4d449d ¤   DefineIt( CantDecompress ),
3d3f4f ¤   DefineIt( badExtResource ),
bc69d2 ¤   DefineIt( evtNotEnb ),
7d1c7e ¤   DefineIt( noMemForPictPlaybackErr ),
e6e0f5 ¤   DefineIt( rgnOverflowErr ),
317740 ¤   DefineIt( rgnTooBigError ),
3e78be ¤   DefineIt( pixMapTooDeepErr ),
383cc4 ¤   DefineIt( insufficientStackErr ),
3b9a91 ¤   DefineIt( nsStackErr ),
263051 ¤   DefineIt( notEnoughMemoryErr ),
14b483 ¤   DefineIt( notHeldErr ),
ca07bf ¤   DefineIt( cannotMakeContiguousErr ),
2e7ec1 ¤   DefineIt( notLockedErr ),
17c6d0 ¤   DefineIt( interruptsMaskedErr ),
c9164f ¤   DefineIt( cannotDeferErr ),
f47e5b ¤   DefineIt( errAEImpossibleRange ),
22bfca ¤   DefineIt( errAEWrongNumberArgs ),
9e5299 ¤   DefineIt( errAEAccessorNotFound ),
1b5a42 ¤   DefineIt( errAENoSuchLogical ),
5b61b6 ¤   DefineIt( errAEBadTestKey ),
431a1e ¤   DefineIt( errAENotAnObjSpec ),
6a402b ¤   DefineIt( errAENoSuchObject ),
28653b ¤   DefineIt( errAENegativeCount ),
0ba30d ¤   DefineIt( errAEEmptyListContainer ),
d84f5a ¤   DefineIt( errAECoercionFail ),
d42eac ¤   DefineIt( errAEDescNotFound ),
582e8d ¤   DefineIt( errAECorruptData ),
e0a9d5 ¤   DefineIt( errAEWrongDataType ),
f3524d ¤   DefineIt( errAENotAEDesc ),
58da11 ¤   DefineIt( errAEBadListItem ),
e52aff ¤   DefineIt( errAENewerVersion ),
14f25e ¤   DefineIt( errAENotAppleEvent ),
0d4e06 ¤   DefineIt( errAEEventNotHandled ),
198d3f ¤   DefineIt( errAEReplyNotValid ),
031fe3 ¤   DefineIt( errAEUnknownSendMode ),
79e14f ¤   DefineIt( errAEWaitCanceled ),
f20c55 ¤   DefineIt( errAETimeout ),
1c842b ¤   DefineIt( errAENoUserInteraction ),
7855da ¤   DefineIt( errAENotASpecialFunction ),
6200c8 ¤   DefineIt( errAEParamMissed ),
3f88d4 ¤   DefineIt( errAEUnknownAddressType ),
ad50e4 ¤   DefineIt( errAEHandlerNotFound ),
d24e8e ¤   DefineIt( errAEReplyNotArrived ),
6310ee ¤   DefineIt( errAEIllegalIndex ),
689333 ¤   DefineIt( errAEUnknownObjectType ),
0c5b01 ¤   DefineIt( errAERecordingIsAlreadyOn ),
dac5ac ¤   DefineIt( errAEBadKeyForm ),
78f3da ¤   DefineIt( errAECantHandleClass ),
8b1614 ¤   DefineIt( errAECantSupplyType ),
2b11d7 ¤   DefineIt( errAECantUndo ),
45856a ¤   DefineIt( errAEEventFailed ),
17291c ¤   DefineIt( errAEIndexTooLarge ),
c83eed ¤   DefineIt( errAEInTransaction ),
eeb730 ¤   DefineIt( errAELocalOnly ),
1bb8d3 ¤   DefineIt( errAENoSuchTransaction ),
3b2b13 ¤   DefineIt( errAENotAnElement ),
68070c ¤   DefineIt( errAENotASingleObject ),
e5ee56 ¤   DefineIt( errAENotModifiable ),
53f84b ¤   DefineIt( errAENoUserSelection ),
dc873c ¤   DefineIt( errAEPrivilegeError ),
6c8887 ¤   DefineIt( errAEReadDenied ),
--4bee 001b8393a78401201f5 Page 4 of MacDebugErrStrings.h
15306e ¤   DefineIt( errAETypeError ),
204de2 ¤   DefineIt( errAEWriteDenied ),
bf67c5 ¤
54eea3 ¤   DefineIt( cfragContextIDErr ),
d163eb ¤   DefineIt( cfragConnectionIDErr ),
7fa92d ¤   DefineIt( cfragNoSymbolErr ),
1157c7 ¤   DefineIt( cfragNoSectionErr ),
c70913 ¤   DefineIt( cfragNoLibraryErr ),
29434c ¤   DefineIt( cfragDupRegistrationErr ),
00ad39 ¤   DefineIt( cfragFragmentFormatErr ),
032b40 ¤   DefineIt( cfragUnresolvedErr ),
81a5ad ¤   DefineIt( cfragNoPositionErr ),
1ca1df ¤   DefineIt( cfragNoPrivateMemErr ),
401520 ¤   DefineIt( cfragNoClientMemErr ),
fe9514 ¤   DefineIt( cfragNoIDsErr¤ ),
e233e9 ¤   DefineIt( cfragInitOrderErr ),
f29d4d ¤   DefineIt( cfragImportTooOldErr ),
0d52f5 ¤   DefineIt( cfragImportTooNewErr ),
81461e ¤   DefineIt( cfragInitLoopErr ),
cb9f83 ¤   DefineIt( cfragInitAtBootErr ),
5d3297 ¤   DefineIt( cfragLibConnErr¤  ·),
0aac4d ¤   DefineIt( cfragCFMStartupErr ),
3c1846 ¤   DefineIt( cfragCFMInternalErr ),
fe1776 ¤   DefineIt( cfragFragmentCorruptErr ),
1f97d7 ¤   DefineIt( cfragInitFunctionErr ),
61f74d ¤   DefineIt( cfragNoApplicationErr ),
404928 ¤   DefineIt( cfragArchitectureErr ),
fefe17 ¤   DefineIt( cfragFragmentUsageErr ),
2fd0f6 ¤   DefineIt( cfragFileSizeErr ),
b8efb5 ¤   DefineIt( cfragNotClosureErr ),
856fa5 ¤   DefineIt( cfragNoRegistrationErr ),
0329b3 ¤   DefineIt( cfragContainerIDErr ),
4eac51 ¤   DefineIt( cfragClosureIDErr ),
6e8dcd ¤   DefineIt( cfragAbortClosureErr ),
8aaf5a
73af5a
8e135a ¤   DefineIt( badDragRefErr ),
f91771 ¤   DefineIt( badDragItemErr ),
b5103a ¤   DefineIt( badDragFlavorErr ),
dd281d ¤   DefineIt( duplicateFlavorErr ),
98e174 ¤   DefineIt( cantGetFlavorErr ),
793f66 ¤   DefineIt( duplicateHandlerErr ),
5ee726 ¤   DefineIt( handlerNotFoundErr ),
7647b2 ¤   DefineIt( dragNotAcceptedErr ),
7cd877 ¤   DefineIt( dsBadLibrary ),
165fd9 ¤   DefineIt( dsMixedModeFailure ),
ce62bd ¤   };
d8af5a
21de5b #undef DefineIt
84af5a
b8af5a
--eefa 0000330c1c1401201f6 Page 1 of MacDebugLeaks.cp
a70335 /*____________________________________________________________________________
ff6753 ¤   MacDebugLeaks.cp
2e67c5 ¤
e1c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
464b0f ¤   All rights reserved.
c567c5 ¤
c267c5 ¤
6caf5a
91c731 ¤   $Id: MacDebugLeaks.cp,v 1.9.28.1 1998/11/12 03:18:49 heller Exp $
9cf7f7 ____________________________________________________________________________*/
ecaf5a
8d426a #include "MacDebugLeaks.h"
ecf406 #include "MacDebugTrapsOff.h"
6eaf5a
770d08 #include "pgpMem.h"
9194a0 #include "pgpLeaks.h"
96324c #include <string.h>
6eaf5a
6ee91a #if ! USE_PGP_LEAKS
9d990a ¤   #undef USE_MAC_DEBUG_LEAKS
847454 #endif
17af5a
383432 #if USE_MAC_DEBUG_LEAKS¤// [
6faf5a
46af5a
387cb1 extern DECLARE_LEAKDEALLOCTYPE( kMacLeaks_OperatorDeleteDeallocType,
ea4ed5 ¤   ¤   "operator delete" );
6eaf5a
02743a extern DECLARE_LEAKDEALLOCTYPE( kMacLeaks_DisposeHandleDeallocType,
f8b33c ¤   ¤   "DisposeHandle" );
2aaf5a
e1b44c extern DECLARE_LEAKDEALLOCTYPE( kMacLeaks_DisposePtrDeallocType,
af8094 ¤   ¤   "DisposePtr" );
acaf5a
c210ea extern DECLARE_LEAKDEALLOCTYPE( kMacLeaks_DisposeRgnDeallocType,
12e518 ¤   ¤   "DisposeRgn" );
22af5a
3c8433 extern DECLARE_LEAKDEALLOCTYPE( kMacLeaks_DisposeIconSuiteDeallocType,
f4c064 ¤   ¤   "DisposeIconSuite" );
60af5a
257157 extern DECLARE_LEAKDEALLOCTYPE( kMacLeaks_DisposeAEDescDeallocType,
cc605f ¤   ¤   "DisposeAEDesc" );
8baf5a
af5ec1 extern DECLARE_LEAKDEALLOCTYPE( kMacLeaks_DisposeWindowDeallocType,
715594 ¤   ¤   "DisposeWindow" );
d0af5a
83e944 extern DECLARE_LEAKDEALLOCTYPE( kMacLeaks_DisposeDialogDeallocType,
352346 ¤   ¤   "DisposeDialog" );
a3af5a
a0e318 extern DECLARE_LEAKDEALLOCTYPE( kMacLeaks_CloseWindowDeallocType,
f431bc ¤   ¤   "CloseWindow" );
91af5a
10549d extern DECLARE_LEAKDEALLOCTYPE( kMacLeaks_CloseDialogDeallocType,
4d476e ¤   ¤   "CloseDialog" );
22af5a
bcaf5a
27af5a
91f043 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_OperatorNewAllocType,
34db53 ¤   ¤   "operator new",¤¤   ¤   kMacLeaks_OperatorDeleteDeallocType );
c3af5a
2236a1 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewHandleAllocType,
e66dac ¤   ¤   "NewHandle",¤   ¤   ¤   kMacLeaks_DisposeHandleDeallocType );
53af5a
edce81 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewHandleClearAllocType,
fd091b ¤   ¤   "NewHandleClear",¤  ¤   kMacLeaks_DisposeHandleDeallocType );
7daf5a
ff6d82 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewHandleSysAllocType,
4d751c ¤   ¤   "NewHandleSys",¤¤   ¤   kMacLeaks_DisposeHandleDeallocType );
a7af5a
e1a6df extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewHandleSysClearAllocType,
868a21 ¤   ¤   "NewHandleSysClear",¤   kMacLeaks_DisposeHandleDeallocType );
03af5a
--7ac5 000f88f11eb401201f6 Page 2 of MacDebugLeaks.cp
d30c4e extern DECLARE_LEAKALLOCTYPE( kMacLeaks_PtrToHandAllocType,
c1f94b ¤   ¤   "PtrToHand",¤   ¤   ¤   kMacLeaks_DisposeHandleDeallocType );
5eaf5a
576814 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_HandToHandAllocType,
03a14c ¤   ¤   "HandToHand",¤  ¤   ¤   kMacLeaks_DisposeHandleDeallocType );
17af5a
e14a19 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_TempNewHandleAllocType,
4a665c ¤   ¤   "TempNewHandle",¤   ¤   kMacLeaks_DisposeHandleDeallocType );
54af5a
0aa94a extern DECLARE_LEAKALLOCTYPE( kMacLeaks_DetachResourceAllocType,
a1a6c5 ¤   ¤   "DetachResource",¤  ¤   kMacLeaks_DisposeHandleDeallocType );
94af5a
0caf5a
cfe05f extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewRgnAllocType,
dcf4f2 ¤   ¤   "NewRgn",¤  ¤   kMacLeaks_DisposeRgnDeallocType );
d3af5a
d3af5a
11c826 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewMenuAllocType,
e924e8 ¤   ¤   "NewMenu",¤ ¤   kMacLeaks_DisposeHandleDeallocType );
c4af5a
ea6874 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_GetMenuBarAllocType,
f7d686 ¤   ¤   "GetMenuBar",¤  kMacLeaks_DisposeHandleDeallocType );
bbaf5a
9da85f extern DECLARE_LEAKALLOCTYPE( kMacLeaks_GetNewMBarAllocType,
c72aec ¤   ¤   "GetNewMBar",¤  kMacLeaks_DisposeHandleDeallocType );
d2af5a
03af5a
2c2387 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewIconSuiteAllocType,
9c09bb ¤   ¤   "NewIconSuite",¤kMacLeaks_DisposeIconSuiteDeallocType );
b7af5a
7c9df6 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_GetIconSuiteAllocType,
849289 ¤   ¤   "GetIconSuite",¤kMacLeaks_DisposeIconSuiteDeallocType );
a4af5a
76af5a
69af5a
f9821d extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewAliasAllocType,
3c00c4 ¤   ¤   "NewAlias",¤kMacLeaks_DisposeHandleDeallocType );
3aaf5a
169c7f extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewAliasMinimalAllocType,
dc98b4 ¤   ¤   "NewAliasMinimal",¤ kMacLeaks_DisposeHandleDeallocType );
3caf5a
a1f865 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewAliasMinimalFromFullPathAllocType,
1039fe ¤   ¤   "NewAliasMinimalFromFullPath",¤ kMacLeaks_DisposeHandleDeallocType );
7daf5a
4faf5a
2253ee extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewPtrAllocType,
7a0553 ¤   ¤   "NewPtr",¤  kMacLeaks_DisposePtrDeallocType );
dbaf5a
b292ec extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewPtrClearAllocType,
61fb9b ¤   ¤   "NewPtrClear", kMacLeaks_DisposePtrDeallocType );
f0af5a
653ade extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewPtrSysAllocType,
5e0d21 ¤   ¤   "NewPtrSys",¤   ¤   kMacLeaks_DisposePtrDeallocType );
50af5a
ea26ba extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewPtrSysClearAllocType,
731f6b ¤   ¤   "NewPtrSysClear",¤  kMacLeaks_DisposePtrDeallocType );
06af5a
b5af5a
0faf5a
a4ebef extern DECLARE_LEAKALLOCTYPE( kMacLeaks_GetNewWindowAllocType,
0833a5 ¤   ¤   "GetNewWindow",¤¤   kMacLeaks_DisposeWindowDeallocType );
00af5a
888745 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewWindowAllocType,
dab775 ¤   ¤   "NewWindow",¤   ¤   kMacLeaks_DisposeWindowDeallocType );
78af5a
191d41 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_GetNewCWindowAllocType,
9ec14f ¤   ¤   "GetNewCWindow",¤   kMacLeaks_DisposeWindowDeallocType );
51af5a
c2177d extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewCWindowAllocType,
d79ed1 ¤   ¤   "NewCWindow",¤  ¤   kMacLeaks_DisposeWindowDeallocType );
99af5a
f8e4bb extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewDialogAllocType,
--9926 000917519f1401201f6 Page 3 of MacDebugLeaks.cp
9156ba ¤   ¤   "NewDialog",¤   ¤   kMacLeaks_DisposeDialogDeallocType );
fdaf5a
748811 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_GetNewDialogAllocType,
304bcf ¤   ¤   "GetNewDialog",¤¤   kMacLeaks_DisposeDialogDeallocType );
56af5a
4eaf5a
906638 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_GetNewWindowStorageAllocType,
9b3aea ¤   ¤   "GetNewWindow",¤kMacLeaks_CloseWindowDeallocType );
f3af5a
d9dcb4 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewWindowStorageAllocType,
d4da01 ¤   ¤   "NewWindow",¤   kMacLeaks_CloseWindowDeallocType );
c9af5a
dcddde extern DECLARE_LEAKALLOCTYPE( kMacLeaks_GetNewCWindowStorageAllocType,
253b1f ¤   ¤   "GetNewCWindow", kMacLeaks_CloseWindowDeallocType );
84af5a
d69300 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewCWindowStorageAllocType,
30e6e3 ¤   ¤   "NewCWindow",¤  kMacLeaks_CloseWindowDeallocType );
81af5a
334608 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_NewDialogStorageAllocType,
fc53b1 ¤   ¤   "NewDialog",¤   kMacLeaks_CloseDialogDeallocType );
e9af5a
74fc84 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_GetNewDialogStorageAllocType,
9897af ¤   ¤   "GetNewDialog",¤kMacLeaks_CloseDialogDeallocType );
bdaf5a
18af5a
8faf5a
9f5dc8 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_AECreateDescAllocType,
d6a9a3 ¤   ¤   "AECreateDesc",¤¤   kMacLeaks_DisposeAEDescDeallocType );
49af5a
0d95b2 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_AECoercePtrAllocType,
f6dad4 ¤   ¤   "AECoercePtr",¤ ¤   kMacLeaks_DisposeAEDescDeallocType );
68af5a
8f3fe5 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_AECoerceDescAllocType,
29f172 ¤   ¤   "AECoerceDesc", ¤   kMacLeaks_DisposeAEDescDeallocType );
5baf5a
16d621 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_AEDuplicateDescAllocType,
8f42f3 ¤   ¤   "AEDuplicateDesc",¤ kMacLeaks_DisposeAEDescDeallocType );
78af5a
4c8720 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_AECreateListAllocType,
6939a7 ¤   ¤   "AECreateList",¤¤   kMacLeaks_DisposeAEDescDeallocType );
6eaf5a
efe864 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_AEGetNthDescAllocType,
a8afec ¤   ¤   "AEGetNthDesc",¤¤   kMacLeaks_DisposeAEDescDeallocType );
cbaf5a
07360c extern DECLARE_LEAKALLOCTYPE( kMacLeaks_AEGetAttributeDescAllocType,
2b7a68 ¤   ¤   "AEGetAttributeDesc",¤  kMacLeaks_DisposeAEDescDeallocType );
52af5a
d3b1e2 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_AECreateAppleEventAllocType,
0af2b0 ¤   ¤   "AECreateAppleEvent",¤  kMacLeaks_DisposeAEDescDeallocType );
48af5a
e9e26b extern DECLARE_LEAKALLOCTYPE( kMacLeaks_AEGetTheCurrentEventAllocType,
72f4f9 ¤   ¤   "AEGetTheCurrentEvent",¤kMacLeaks_DisposeAEDescDeallocType );
fbaf5a
8e4139 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_AEResolveAllocType,
9826da ¤   ¤   "AEResolve", kMacLeaks_DisposeAEDescDeallocType );
ffaf5a
ca297a extern DECLARE_LEAKALLOCTYPE( kMacLeaks_CreateOffsetDescriptorAllocType,
a2ca12 ¤   ¤   "CreateOffsetDescriptor",¤  kMacLeaks_DisposeAEDescDeallocType );
20af5a
41acfd extern DECLARE_LEAKALLOCTYPE( kMacLeaks_CreateCompDescriptorAllocType,
6638a9 ¤   ¤   "CreateCompDescriptor",¤¤   kMacLeaks_DisposeAEDescDeallocType );
2daf5a
cb5f4a extern DECLARE_LEAKALLOCTYPE( kMacLeaks_CreateLogicalDescriptorAllocType,
5e3b19 ¤   ¤   "CreateLogicalDescriptor",¤ kMacLeaks_DisposeAEDescDeallocType );
bfaf5a
c7ff5d extern DECLARE_LEAKALLOCTYPE( kMacLeaks_CreateObjSpecifierAllocType,
d34fc3 ¤   ¤   "CreateObjSpecifier",¤  ¤   kMacLeaks_DisposeAEDescDeallocType );
08af5a
5e28d7 extern DECLARE_LEAKALLOCTYPE( kMacLeaks_CreateRangeDescriptorAllocType,
74e808 ¤   ¤   "CreateRangeDescriptor",¤   kMacLeaks_DisposeAEDescDeallocType );
11af5a
91af5a
--8b6d 0007d754eae401201f6 Page 4 of MacDebugLeaks.cp
e0af5a
7e0335 /*____________________________________________________________________________
2d063a ¤   Maintain a list of leaks items.
f3fb9b ¤   Each allocated Handle, Ptr, etc needs to be
ce1eee ¤   tracked with with a separately allocated leak item. ·The strategy here is
afd881 ¤   to allocate arrays of leaks items and link them together into a free list.
1ef7f7 ____________________________________________________________________________*/
3caf5a
c63392 typedef struct MacLeakItem
37c7a1 ¤   {
fa623e ¤   LeakItem¤   ¤   leak;
ce60f4 ¤   MacLeakItem *¤  next;¤  // used while in free list
c7f34e ¤   } MacLeakItem;
dae428 inline MacLeakItem *¤   PGPLeakToMacLeak( const LeakItem *pgpLeak )
370822 ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( (MacLeakItem *)pgpLeak ); }
60af5a
3fefde static MacLeakItem *¤   sFreeLeakList = nil;
3caf5a
11af5a
232442 static void¤CreateMoreLeakItems( void );
e8af5a
18af5a
7e8f06 ¤   static MacLeakItem *
30da68 GetNextAvailLeakItem( void )
2dc7a1 ¤   {
429931 ¤   MacLeakItem¤*¤  nextAvail¤  = nil;
6167c5 ¤
040ebd ¤   if ( IsNull( sFreeLeakList ) )
d55b34 ¤   ¤   {
afc6d4 ¤   ¤   CreateMoreLeakItems();
7e0fe4 ¤   ¤   }
7f67c5 ¤
4eb6ae ¤   nextAvail¤  ¤   = sFreeLeakList;
25f5f3 ¤   if ( IsntNull( nextAvail ) )
5f5b34 ¤   ¤   {
8e9c42 ¤   ¤   sFreeLeakList¤  = nextAvail->next;
8d0fe4 ¤   ¤   }
4f67c5 ¤
c02a12 ¤   return( nextAvail );
b39371 ¤   }
46af5a
20af5a
38af5a
1333c8 ¤   static void
c70c1c ReturnLeakItemToFreeList( MacLeakItem *leak )
f4c7a1 ¤   {
7c3f8f ¤   MacDebug_FillWithGarbage( leak, sizeof( *leak ) );
ed67c5 ¤
efd575 ¤   leak->next¤ ¤   = sFreeLeakList;
4ab927 ¤   sFreeLeakList¤  = leak;
fb9371 ¤   }
d0af5a
93af5a
4467c5 ¤
d60335 /*____________________________________________________________________________
1679cc ¤   Allocate another large chunk of leak items and link them together
77f264 ¤   into the free list
e4f7f7 ____________________________________________________________________________*/
d533c8 ¤   static void
31112f CreateMoreLeakItems( void )
acc7a1 ¤   {
fa13d1 ¤   MacLeakItem *¤  moreLeaks¤  ¤   ·= nil;
74b895 ¤   const UInt32¤   ¤   kLeaksPerChunk¤ = 128;
5767c5 ¤
40c455 ¤   moreLeaks¤  = (MacLeakItem *)
2261ab ¤   ¤   NewPtrClear( kLeaksPerChunk * sizeof( MacLeakItem ) );
2867c5 ¤
e2e8ff ¤   if ( IsntNull( moreLeaks ) )
8a5b34 ¤   ¤   {
5df83e ¤   ¤   MacLeakItem *¤  curLeak;
2aeedf ¤   ¤   MacLeakItem *¤  lastLeak;
7d1b52 ¤   ¤
--d93d 0008c5feb0d401201f6 Page 5 of MacDebugLeaks.cp
6b70e3 ¤   ¤   // link all leak items together in a linked list
c38476 ¤   ¤   curLeak¤¤   = moreLeaks;
b4a89e ¤   ¤   lastLeak¤   = moreLeaks + ( kLeaksPerChunk - 1);
68cc2f ¤   ¤   while ( curLeak <= lastLeak )
96f776 ¤   ¤   ¤   {
fbc16b ¤   ¤   ¤   MacLeakItem *¤  nextLeak;
5a87c7 ¤   ¤   ¤
408e48 ¤   ¤   ¤   nextLeak¤   ¤   = curLeak + 1;
301c4c ¤   ¤   ¤   curLeak->next¤  = nextLeak;
ac8435 ¤   ¤   ¤   curLeak¤¤   ¤   = nextLeak;
11a3a6 ¤   ¤   ¤   }
c11b52 ¤   ¤
485ca9 ¤   ¤   // add this new list to the main list
ebebea ¤   ¤   lastLeak->next¤ = sFreeLeakList;
028534 ¤   ¤   sFreeLeakList¤  = moreLeaks;
ea0fe4 ¤   ¤   }
639371 ¤   }
8baf5a
03af5a
9aaf5a
80dacc #pragma mark -
d1af5a
5a0335 /*____________________________________________________________________________
259c78 ¤   Note:
03e34f ¤   ¤   Some of the routines in this file would normally be called only from
05bae4 ¤   DebugTraps, usually not from general program code.
22f7f7 ____________________________________________________________________________*/
a0af5a
72f66a #if PRAGMA_MARK_SUPPORTED
c6f0c3 #pragma mark --- Rare Public Use ---
537454 #endif
efaf5a
967bbd static UInt16¤  sSuspendCount¤  = 0;
cc6d52 ¤   void
dc6686 MacLeaks_Suspend( void )
75c7a1 ¤   {
c5553a ¤   ++sSuspendCount;
2b67c5 ¤
025415 ¤   pgpLeaksSuspend();
289371 ¤   }
41af5a
5baf5a
f96d52 ¤   void
29c0bb MacLeaks_Resume( void )
05c7a1 ¤   {
f42a3f ¤   pgpAssertMsg( sSuspendCount >= 1,
9405cc ¤   ¤   "MacLeaks_Resume: not currently suspended" );
fd094b ¤   --sSuspendCount;
b367c5 ¤
cdb8ec ¤   pgpLeaksResume();
539371 ¤   }
78af5a
dbaf5a
48009c ¤   static inline Boolean
ab1232 LeaksSuspended( void )
c4c7a1 ¤   {
89632e ¤   return( sSuspendCount != 0 );
389371 ¤   }
4caf5a
09af5a
3c33c8 ¤   static void
0a7c96 IgnoreIfSuspended( LeakItem *¤  leak )
dbc7a1 ¤   {
7c3eee ¤   if ( LeaksSuspended() )
495b34 ¤   ¤   {
9c16fb ¤   ¤   pgpLeaksIgnoreItem( leak );
230fe4 ¤   ¤   }
5b9371 ¤   }
24af5a
12af5a
976077 // we can avoid using ANSI if we write this routine here
8ccd8d ¤   static Boolean
--ef0c 0004e0ef24d401201f6 Page 6 of MacDebugLeaks.cp
5446cc CStringsEqual(
c0a2c2 ¤   const char *¤   str1,
47331e ¤   const char *¤   str2)
e9c7a1 ¤   {
ade217 ¤   Boolean¤¤   ¤   stringsEqual¤   = FALSE;
f5640c ¤   register char¤  theChar;
0b67c5 ¤
6637d4 ¤   while ( ( theChar = *str1++ ) == *str2++ )
bb5b34 ¤   ¤   {
d33f9c ¤   ¤   if ( theChar == '\0' )
58f776 ¤   ¤   ¤   {
e3e31b ¤   ¤   ¤   stringsEqual¤   = TRUE;
f9cdcb ¤   ¤   ¤   break;
d6a3a6 ¤   ¤   ¤   }
fb0fe4 ¤   ¤   }
bd1b52 ¤   ¤
3cabe4 ¤   return( stringsEqual );
359371 ¤   }
7daf5a
a00335 /*____________________________________________________________________________
56b321 ¤   Ignore an leak if it happens to be in a certain file and allocated with
59faf2 ¤   a certain allocator.
4a67c5 ¤
64bc82 ¤   This is ugly, but necessary to deal with PowerPlant staticallly
7ea408 ¤   allocated items that are never disposed of, without modifying PowerPlant.
0ff7f7 ____________________________________________________________________________*/
7033c8 ¤   static void
a75b84 PossibleIgnoreFromFile(
f44244 ¤   LeakItem *¤ ¤   leak,
d8e121 ¤   const char *¤   srcFile,
31738c ¤   UInt32¤ ¤   ¤   lineNumber)
072ef1 ¤   {¤
833649 ¤   const UInt32¤   kMaxLine¤   = 0xFFFFFFFF;
3db022 ¤   typedef struct IgnoreDesc
bf5b34 ¤   ¤   {
b382ee ¤   ¤   const char *¤   srcFile;
bdaeba ¤   ¤   const char *¤   allocator;
c8d843 ¤   ¤   const UInt32¤   ¤   startLine;
6022cd ¤   ¤   const UInt32¤   ¤   endLine;
9fde14 ¤   ¤   } IgnoreDesc;
fd67c5 ¤
574ede ¤   // good for CodeWarrior release 10
7c0c62 ¤   static IgnoreDesc sIgnoreListCW10[] =
8f5b34 ¤   ¤   {
531dcf ¤   ¤   { "LGrowZone.cp", "NewHandle", 0, kMaxLine},
a0b338 ¤   ¤   { "UScreenPort.cp", "NewPtr", 0, kMaxLine},
7ca105 ¤   ¤   };
083cfb ¤   const UInt16 kNumIgnores¤   =
bc0d5b ¤   ¤   sizeof( sIgnoreListCW10 ) / sizeof( sIgnoreListCW10[ 0 ] );
89f8fb ¤   const IgnoreDesc *¤ desc;
1b67c5 ¤
9bd7b0 ¤   desc¤   = &sIgnoreListCW10[ 0 ];
a3a356 ¤   for( UInt16 index = 0; index < kNumIgnores; ++index, ++desc)
625b34 ¤   ¤   {
b38935 ¤   ¤   if ( CStringsEqual( desc->srcFile, srcFile ) )
dcf776 ¤   ¤   ¤   {
81268f ¤   ¤   ¤   if ( CStringsEqual( desc->allocator, leak->allocType->name ) )
fe72c3 ¤   ¤   ¤   ¤   {
f2574f ¤   ¤   ¤   ¤   if ( lineNumber >= desc->startLine &&
17fb58 ¤   ¤   ¤   ¤   lineNumber <= desc->endLine )
a34859 ¤   ¤   ¤   ¤   ¤   {
f24398 ¤   ¤   ¤   ¤   ¤   pgpLeaksIgnoreItem( leak );
741c89 ¤   ¤   ¤   ¤   ¤   }
95f622 ¤   ¤   ¤   ¤   break;
162613 ¤   ¤   ¤   ¤   }
7fa3a6 ¤   ¤   ¤   }
ee0fe4 ¤   ¤   }
759371 ¤   }
a9af5a
c0af5a
eb0335 /*____________________________________________________________________________
4e385d ¤   Remember an item of any kind.
--490e 0007f96e8b8401201f6 Page 7 of MacDebugLeaks.cp
eaf7f7 ____________________________________________________________________________*/
a833c8 ¤   static void
fdec40 RememberHandleOrPtr(
1f6b77 ¤   const void *¤   ¤   ¤   theItem,
fd13da ¤   LeakAllocType *¤¤   ¤   allocType,
1580e9 ¤   UInt32¤ ¤   ¤   ¤   ¤   size,
9a6c95 ¤   const char *¤   ¤   ¤   srcFile,
ff7b87 ¤   long¤   ¤   ¤   ¤   ¤   srcLine)
33c7a1 ¤   {
4e0b4b ¤   pgpAssertAddrValid( theItem, VoidAlign );
e84018 ¤   pgpAssertAddrValid( allocType, LeakAllocType );
f8cd81 ¤   pgpAssertAddrValid( srcFile, char );
2c67c5 ¤
8ba3fe ¤   MacLeakItem *leak;
c467c5 ¤
600aae ¤   leak¤   = GetNextAvailLeakItem();
9022d7 ¤   pgpAssertMsg( IsntNull( leak ),
db6088 ¤   ¤   "RememberHandleOrPtr: no leak items available");
a867c5 ¤
82f203 ¤   if ( IsntNull( leak ) )
025b34 ¤   ¤   {
320989 ¤   ¤   pgpLeaksRememberItem( &leak->leak, allocType,
f4f347 ¤   ¤   ¤   ¤   theItem, size, srcFile, srcLine);
8f2b85 ¤   ¤   ¤   ¤
f81ace ¤   ¤   IgnoreIfSuspended( &leak->leak );
e0df56 ¤   ¤   PossibleIgnoreFromFile( &leak->leak, srcFile, srcLine);
8e0fe4 ¤   ¤   }
8667c5 ¤
5f9371 ¤   }
f767c5 ¤
2367c5 ¤
1caf5a
030335 /*____________________________________________________________________________
d200b6 ¤   Forget an item; it has been disposed of properly.
75f7f7 ____________________________________________________________________________*/
f533c8 ¤   static void
448637 ForgetItem(
5e5dfa ¤   const void¤ *¤  ¤   handleOrPtr,
86620b ¤   LeakDeallocType *¤  deallocType)
03c7a1 ¤   {
28976c ¤   pgpAssertAddrValid( handleOrPtr, VoidAlign );
d59351 ¤   pgpAssertAddrValid( deallocType, LeakDeallocType );
5667c5 ¤
5322d9 ¤   LeakItem *¤ ¤   pgpLeak¤= pgpLeaksFindItem( handleOrPtr );
4467c5 ¤
a0962c ¤   if ( IsntNull( pgpLeak ) )
7a5b34 ¤   ¤   {
ff4737 ¤   ¤   MacLeakItem *¤  macLeak¤= PGPLeakToMacLeak( pgpLeak );
9a1b52 ¤   ¤
fec0f0 ¤   ¤   pgpLeaksForgetItem( pgpLeak, deallocType );
571b52 ¤   ¤
6e1948 ¤   ¤   ReturnLeakItemToFreeList( macLeak );
6c0fe4 ¤   ¤   }
2b9371 ¤   }
5867c5 ¤
0967c5 ¤
730335 /*____________________________________________________________________________
8281fb ¤   A Handle has been allocated. Remember it.
51f7f7 ____________________________________________________________________________*/
266d52 ¤   void
f83a69 MacLeaks_RememberHandle(
3ca479 ¤   const void *¤   ¤   ¤   theHandle,
6639bc ¤   LeakAllocType *¤¤   ¤   howAllocated,
c145ac ¤   const char *¤   ¤   ¤   srcFileNameCString,
9b01c6 ¤   long¤   ¤   ¤   ¤   ¤   lineNumber)
1ac7a1 ¤   {
769c5e ¤   AssertHandleIsValid( theHandle, "MacLeaks_RememberHandle" );
9567c5 ¤
906bde ¤   RememberHandleOrPtr( theHandle, howAllocated,
fe1756 ¤   ¤   ¤   GetHandleSize( (Handle)theHandle ),
bd3b8e ¤   ¤   ¤   srcFileNameCString, lineNumber);
7f9371 ¤   }
--16e4 00065799d68401201f6 Page 8 of MacDebugLeaks.cp
e0af5a
1aaf5a
17af5a
c90335 /*____________________________________________________________________________
8f280f ¤   A Handle has been deallocated. Forget it.
e9f7f7 ____________________________________________________________________________*/
3f6d52 ¤   void
3d4686 MacLeaks_ForgetHandle(
b2f38d ¤   const void *¤   ¤   theHandle,
b684ae ¤   LeakDeallocType *¤  deallocType )
a6c7a1 ¤   {
d59c5e ¤   AssertHandleIsValid( theHandle, "MacLeaks_RememberHandle" );
3a67c5 ¤
5920ec ¤   ForgetItem( theHandle, deallocType);
8a9371 ¤   }
80af5a
9daf5a
c3af5a
690335 /*____________________________________________________________________________
24a944 ¤   A memory manager 'Ptr' has been allocated. Remember it.
8ef7f7 ____________________________________________________________________________*/
1a6d52 ¤   void
bafe30 MacLeaks_RememberPtr(
5cc6dc ¤   const void *¤   ¤   ¤   thePtr,
aa39bc ¤   LeakAllocType *¤¤   ¤   howAllocated,
5c80e9 ¤   UInt32¤ ¤   ¤   ¤   ¤   size,
1545ac ¤   const char *¤   ¤   ¤   srcFileNameCString,
da01c6 ¤   long¤   ¤   ¤   ¤   ¤   lineNumber)
aac7a1 ¤   {
d95120 ¤   // Ptr types always aligned to 4 PGPByte boundaries;
5a7f99 ¤   // check for that instead of VoidAlign
d05abf ¤   pgpAssertAddrValid( thePtr, long);
1367c5 ¤
38a8fe ¤   RememberHandleOrPtr( thePtr, howAllocated, size,
3f3d36 ¤   ¤   srcFileNameCString, lineNumber);
bb9371 ¤   }
9aaf5a
e9af5a
4b0335 /*____________________________________________________________________________
5a45bd ¤   A Ptr has been deallocated. Forget it.
14f7f7 ____________________________________________________________________________*/
846d52 ¤   void
f99ede MacLeaks_ForgetPtr(
f4d0e2 ¤   const void *¤   ¤   thePtr,
cb620b ¤   LeakDeallocType *¤  deallocType)
c4c7a1 ¤   {
a15120 ¤   // Ptr types always aligned to 4 PGPByte boundaries;
467f99 ¤   // check for that instead of VoidAlign
835abf ¤   pgpAssertAddrValid( thePtr, long);
fc67c5 ¤
979370 ¤   ForgetItem( thePtr, deallocType);
c49371 ¤   }
c3af5a
b0af5a
ebaf5a
280335 /*____________________________________________________________________________
6f0c50 ¤   A AEDesc has been allocated. Remember it.
80f7f7 ____________________________________________________________________________*/
a06d52 ¤   void
539a34 MacLeaks_RememberAEDesc(
7495d3 ¤   const AEDesc *¤ ¤   ¤   theAEDesc,
3f39bc ¤   LeakAllocType *¤¤   ¤   howAllocated,
ad45ac ¤   const char *¤   ¤   ¤   srcFileNameCString,
b501c6 ¤   long¤   ¤   ¤   ¤   ¤   lineNumber)
38c7a1 ¤   {
5cf7c7 ¤   pgpAssertAddrValidMsg( theAEDesc, AEDesc, "MacLeaks_RememberAEDesc");
21af5a
7973b1 ¤   if ( theAEDesc->descriptorType != typeNull &&
c2dfec ¤   ¤   ·IsntNull( theAEDesc->dataHandle ))
545b34 ¤   ¤   {
04012a ¤   ¤   RememberHandleOrPtr( theAEDesc->dataHandle,
65da1f ¤   ¤   ¤   howAllocated, 0, srcFileNameCString, lineNumber);
--8df3 000bfa25cce401201f6 Page 9 of MacDebugLeaks.cp
b50fe4 ¤   ¤   }
6b9371 ¤   }
b4af5a
0caf5a
c8af5a
960335 /*____________________________________________________________________________
77a5a4 ¤   A AEDesc has been deallocated. Forget it.
2ef7f7 ____________________________________________________________________________*/
d76d52 ¤   void
28e6db MacLeaks_ForgetAEDesc(
f6572e ¤   const AEDesc¤   *¤  theAEDesc,
66620b ¤   LeakDeallocType *¤  deallocType)
1fc7a1 ¤   {
642e06 ¤   pgpAssertAddrValidMsg( theAEDesc, AEDesc, "MacLeaks_ForgetAEDesc");
fbaf5a
b973b1 ¤   if ( theAEDesc->descriptorType != typeNull &&
50e901 ¤   ¤   ·IsntNull( theAEDesc->dataHandle ) &&
c3960f ¤   ¤   ·MacLeaks_ItemIsRemembered( theAEDesc->dataHandle ))
955b34 ¤   ¤   {
749909 ¤   ¤   ForgetItem( theAEDesc->dataHandle, deallocType);
fe0fe4 ¤   ¤   }
f79371 ¤   }
65af5a
b0af5a
30af5a
240335 /*____________________________________________________________________________
b6209d ¤   An object has been allocated. Remember it.
3a67c5 ¤
2a88d2 ¤   Override operator new() so you can remember objects.
64f7f7 ____________________________________________________________________________*/
b66d52 ¤   void
8c7851 MacLeaks_RememberObject(
0b2b1f ¤   const void¤ *¤  object,
0dfece ¤   UInt32¤ ¤   ¤   size,
d8e121 ¤   const char *¤   srcFile,
027c18 ¤   long¤   ¤   ¤   lineNumber)
57c7a1 ¤   {
12a3fe ¤   MacLeakItem *leak;
6967c5 ¤
5a0aae ¤   leak¤   = GetNextAvailLeakItem();
8322d7 ¤   pgpAssertMsg( IsntNull( leak ),
1f6284 ¤   ¤   "MacLeaks_RememberObject: no leak items available");
c467c5 ¤
71f203 ¤   if ( IsntNull( leak ) )
335b34 ¤   ¤   {
16e0ea ¤   ¤   // file, line not available for original caller, so·
36134b ¤   ¤   pgpLeaksRememberItem( &leak->leak, kMacLeaks_OperatorNewAllocType,
0bfefd ¤   ¤   ¤   ¤   object, size, srcFile, lineNumber );
4167c5 ¤
9c1ace ¤   ¤   IgnoreIfSuspended( &leak->leak );
7a0fe4 ¤   ¤   }
559371 ¤   }
d3af5a
2baf5a
330335 /*____________________________________________________________________________
bc8969 ¤   An object has been deallocated. Forget it.
7167c5 ¤
4b090b ¤   Note: you will need to override operator delete() so
59d5b2 ¤   you can call this routine.
7df7f7 ____________________________________________________________________________*/
f26d52 ¤   void
838f20 MacLeaks_ForgetObject( const void *object )
36c7a1 ¤   {
b16c6b ¤   ForgetItem( object, kMacLeaks_OperatorDeleteDeallocType);
1c9371 ¤   }
bb67c5 ¤
b767c5 ¤
3baf5a
220335 /*____________________________________________________________________________
1b1ed7 ¤   Return TRUE if an item is remembered.
d4f7f7 ____________________________________________________________________________*/
bf7e69 ¤   Boolean
--4960 0013afa7442401201f6 Page 10 of MacDebugLeaks.cp
5e5c19 MacLeaks_ItemIsRemembered( const void¤  *handleOrPtr )
01c7a1 ¤   {
de7527 ¤   return( IsntNull( pgpLeaksFindItem( handleOrPtr ) ) );
789371 ¤   }
e5af5a
8aaf5a
db0335 /*____________________________________________________________________________
437003 ¤   Ignore this item (Ptr, Handle or object). ·It will not be reported as a·
6512fa ¤   leak.
6c38d3 ¤   However, the item should remain in the list of remembered items until it
66be72 ¤   has been disposed. This allows stricter assertions in some cases
8fa88c ¤   (e.g. an attempt to dispose of it twice).
02f7f7 ____________________________________________________________________________*/
296d52 ¤   void
d4cb9c MacLeaks_IgnoreItem( const void *mem)
0dc7a1 ¤   {
3247ca ¤   pgpAssertAddrValidMsg( mem, VoidAlign, "MacLeaks_IgnoreItem" );
8267c5 ¤
5cfed7 ¤   pgpLeaksIgnoreItem( pgpLeaksFindItem( mem ) );
d99371 ¤   }
f1af5a
ccaf5a
4faf5a
488474 #endif // ] USE_MAC_DEBUG_LEAKS
23af5a
edaf5a
9faf5a
b5af5a
71af5a
faaf5a
4faf5a
3aaf5a
--4ca7 0004484a810401201f7 Page 1 of MacDebugLeaks.h
a70335 /*____________________________________________________________________________
e24d5b ¤   MacDebugLeaks.h
a167c5 ¤
4ac97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
844b0f ¤   All rights reserved.
3c67c5 ¤
8d67c5 ¤
02af5a
f3c342 ¤   $Id: MacDebugLeaks.h,v 1.8.28.1 1998/11/12 03:18:50 heller Exp $
b6f7f7 ____________________________________________________________________________*/
66af5a
697b7d #pragma once
66af5a
e594a0 #include "pgpLeaks.h"
b6af5a
ce99c6 PGP_BEGIN_C_DECLARATIONS
5faf5a
bcaf5a
a1e91a #if ! USE_PGP_LEAKS
c6990a ¤   #undef USE_MAC_DEBUG_LEAKS
541d65 ¤   #define USE_MAC_DEBUG_LEAKS ····0
437454 #endif
93d83c ·
deaf5a
403e6a #if USE_MAC_DEBUG_LEAKS¤/* [ */
63af5a
c5d1f7 /* stack crawl requires A6 frames */
942aa1 #ifdef __MWERKS__
4651b9 ¤   #if GENERATING68K
1629d8 ¤   ¤   #pragma a6frames on
1cb7ec ¤   #endif
457454 #endif
7eaf5a
db94a0 #include "pgpLeaks.h"
e6af5a
4eaf5a
432a1c extern LeakDeallocType *¤   kMacLeaks_DisposeHandleDeallocType;
9d0db8 extern LeakDeallocType *¤   kMacLeaks_DisposePtrDeallocType;
a9a91e extern LeakDeallocType *¤   kMacLeaks_DisposeRgnDeallocType;
784433 extern LeakDeallocType *¤   kMacLeaks_DisposeIconSuiteDeallocType;
882f71 extern LeakDeallocType *¤   kMacLeaks_DisposeAEDescDeallocType;
0300e7 extern LeakDeallocType *¤   kMacLeaks_DisposeWindowDeallocType;
818303 extern LeakDeallocType *¤   kMacLeaks_CloseWindowDeallocType;
3bb762 extern LeakDeallocType *¤   kMacLeaks_DisposeDialogDeallocType;
ff3486 extern LeakDeallocType *¤   kMacLeaks_CloseDialogDeallocType;
c1af5a
91af5a
80af5a
e9369f extern LeakAllocType *¤ ¤   kMacLeaks_NewPtrAllocType;
efd1a0 extern LeakAllocType *¤ ¤   kMacLeaks_NewPtrClearAllocType;
e3a732 extern LeakAllocType *¤ ¤   kMacLeaks_NewPtrSysAllocType;
58b564 extern LeakAllocType *¤ ¤   kMacLeaks_NewPtrSysClearAllocType;
f5ab4d extern LeakAllocType *¤ ¤   kMacLeaks_NewHandleAllocType;
395d5f extern LeakAllocType *¤ ¤   kMacLeaks_NewHandleClearAllocType;
3134a0 extern LeakAllocType *¤ ¤   kMacLeaks_NewHandleSysAllocType;
c656fb extern LeakAllocType *¤ ¤   kMacLeaks_NewHandleSysClearAllocType;
ea91a2 extern LeakAllocType *¤ ¤   kMacLeaks_PtrToHandAllocType;
8094e2 extern LeakAllocType *¤ ¤   kMacLeaks_HandToHandAllocType;
469959 extern LeakAllocType *¤ ¤   kMacLeaks_TempNewHandleAllocType;
17af5a
c83a94 extern LeakAllocType *¤ ¤   kMacLeaks_DetachResourceAllocType;
14af5a
7f852e extern LeakAllocType *¤ ¤   kMacLeaks_NewRgnAllocType;
5daf5a
867b44 extern LeakAllocType *¤ ¤   kMacLeaks_NewMenuAllocType;
d49482 extern LeakAllocType *¤ ¤   kMacLeaks_GetMenuBarAllocType;
4a54a9 extern LeakAllocType *¤ ¤   kMacLeaks_GetNewMBarAllocType;
fbaf5a
f37aa5 extern LeakAllocType *¤ ¤   kMacLeaks_NewIconSuiteAllocType;
40c4d4 extern LeakAllocType *¤ ¤   kMacLeaks_GetIconSuiteAllocType;
dfaf5a
44b2cd extern LeakAllocType *¤ ¤   kMacLeaks_GetNewWindowAllocType;
--4dbd 000ea582c7a401201f7 Page 2 of MacDebugLeaks.h
201aa9 extern LeakAllocType *¤ ¤   kMacLeaks_NewWindowAllocType;
bece01 extern LeakAllocType *¤ ¤   kMacLeaks_GetNewCWindowAllocType;
9aeb8b extern LeakAllocType *¤ ¤   kMacLeaks_NewCWindowAllocType;
b47957 extern LeakAllocType *¤ ¤   kMacLeaks_NewDialogAllocType;
4fd133 extern LeakAllocType *¤ ¤   kMacLeaks_GetNewDialogAllocType;
f299fd extern LeakAllocType *¤ ¤   kMacLeaks_GetNewWindowStorageAllocType;
ecf394 extern LeakAllocType *¤ ¤   kMacLeaks_NewWindowStorageAllocType;
5f9d89 extern LeakAllocType *¤ ¤   kMacLeaks_GetNewCWindowStorageAllocType;
146324 extern LeakAllocType *¤ ¤   kMacLeaks_NewCWindowStorageAllocType;
b26928 extern LeakAllocType *¤ ¤   kMacLeaks_NewDialogStorageAllocType;
350341 extern LeakAllocType *¤ ¤   kMacLeaks_GetNewDialogStorageAllocType;
66af5a
1713b3 extern LeakAllocType *¤ ¤   kMacLeaks_NewAliasAllocType;
f87216 extern LeakAllocType *¤ ¤   kMacLeaks_NewAliasMinimalAllocType;
5f818c extern LeakAllocType *¤ ¤   kMacLeaks_NewAliasMinimalFromFullPathAllocType;
5daf5a
39af5a
ac04ea extern LeakAllocType *¤ ¤   kMacLeaks_AECreateDescAllocType;
fe04ea extern LeakAllocType *¤ ¤   kMacLeaks_AECreateDescAllocType;
e4d6fe extern LeakAllocType *¤ ¤   kMacLeaks_AECoercePtrAllocType;
9666c7 extern LeakAllocType *¤ ¤   kMacLeaks_AECoerceDescAllocType;
4e3848 extern LeakAllocType *¤ ¤   kMacLeaks_AEDuplicateDescAllocType;
c5de02 extern LeakAllocType *¤ ¤   kMacLeaks_AECreateListAllocType;
82b146 extern LeakAllocType *¤ ¤   kMacLeaks_AEGetNthDescAllocType;
ef80d3 extern LeakAllocType *¤ ¤   kMacLeaks_AEGetAttributeDescAllocType;
8a073d extern LeakAllocType *¤ ¤   kMacLeaks_AECreateAppleEventAllocType;
c7a23c extern LeakAllocType *¤ ¤   kMacLeaks_AEGetTheCurrentEventAllocType;
0edcd5 extern LeakAllocType *¤ ¤   kMacLeaks_AEResolveAllocType;
d7b998 extern LeakAllocType *¤ ¤   kMacLeaks_CreateOffsetDescriptorAllocType;
d3ecaa extern LeakAllocType *¤ ¤   kMacLeaks_CreateCompDescriptorAllocType;
144acf extern LeakAllocType *¤ ¤   kMacLeaks_CreateLogicalDescriptorAllocType;
8e4982 extern LeakAllocType *¤ ¤   kMacLeaks_CreateObjSpecifierAllocType;
5cdfa4 extern LeakAllocType *¤ ¤   kMacLeaks_CreateRangeDescriptorAllocType;
75af5a
7daf5a
5baf5a
a5bcf7 void¤   MacLeaks_RememberHandle( const void * theHandle,
7c1633 ¤   ¤   ¤   LeakAllocType *allocType,
bec6bd ¤   ¤   ¤   const char *srcFileName, long lineNumber);
2a87c7 ¤   ¤   ¤
145e80 void¤   MacLeaks_ForgetHandle( const void * theHandle,
cb65d5 ¤   ¤   ¤   LeakDeallocType *deallocType );
7daf5a
a59ce9 void¤   MacLeaks_RememberPtr( const void *thePtr,
0eb23e ¤   ¤   ¤   LeakAllocType *allocType, UInt32 size,
4dc6bd ¤   ¤   ¤   const char *srcFileName, long lineNumber);
05361e void¤   MacLeaks_ForgetPtr( const void *thePtr, LeakDeallocType *deallocType);
acaf5a
365830 void¤   MacLeaks_RememberAEDesc( const AEDesc *theAEDesc, LeakAllocType *,
3fc6bd ¤   ¤   ¤   const char *srcFileName, long lineNumber);
6227c4 void¤   MacLeaks_ForgetAEDesc( const AEDesc *theAEDesc, LeakDeallocType *);
bdaf5a
c35795 void¤   MacLeaks_RememberObject( const void *object, UInt32 size,
4ac6bd ¤   ¤   ¤   const char *srcFileName, long lineNumber);
848aed void¤   MacLeaks_ForgetObject( const void *object );
74af5a
8ef70f Boolean¤MacLeaks_ItemIsRemembered( const void *handleOrPtr );
02af5a
e2d11c void¤   MacLeaks_IgnoreItem( const void *item);
d4af5a
f4df3b void¤   MacLeaks_Suspend( void );
5bb377 void¤   MacLeaks_Resume( void );
c4af5a
7daf5a
4eaf5a
34443f #else /* ] USE_MAC_DEBUG_LEAKS [ */
ed67c5 ¤
81af5a
7df0b7 #define MacLeaks_RememberHandle(h, y, file, line)
1e0525 #define MacLeaks_ForgetHandle(h, d)¤¤   ¤   ¤
e17047 #define MacLeaks_RememberPtr(ptr, typ, sz, file, line)¤
ea8919 #define MacLeaks_ForgetPtr( x, d)¤  ¤   ¤   ¤
--268f 001da779ae5401201f7 Page 3 of MacDebugLeaks.h
879202 #define MacLeaks_RememberAEDesc(x, y, file, line)
138f7b #define MacLeaks_ForgetAEDesc(x, d)¤¤   ¤   ¤
9afd56 #define MacLeaks_RememberObject( x, y )
df7e58 #define MacLeaks_ForgetObject( x )¤ ¤   ¤
c87da7 #define MacLeaks_ItemIsRemembered( x )
cdaf5a
5186f4 #define MacLeaks_DisposingHandle( x )¤  ¤   ¤
423194 #define MacLeaks_DisposingPtr( x )¤ ¤   ¤
79af5a
c590dc #define MacLeaks_IgnoreItem( x )
c7af5a
5f3fde #define MacLeaks_Suspend()¤ ¤
1ab0a2 #define MacLeaks_Resume()¤  ¤
e9af5a
1aaf5a
d33771 #endif /* ] USE_MAC_DEBUG_LEAKS */
3aaf5a
47af5a
3eaf5a
da1254 PGP_END_C_DECLARATIONS
--98e3 00041ebd857401201f8 Page 1 of MacDebugPatches.cp
a70335 /*____________________________________________________________________________
5f8856 ¤   MacDebugPatches.cp
8f67c5 ¤
c5c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
944b0f ¤   All rights reserved.
c967c5 ¤
6667c5 ¤
1daf5a
f65428 ¤   $Id: MacDebugPatches.cp,v 1.9.12.1 1998/11/12 03:18:51 heller Exp $
64f7f7 ____________________________________________________________________________*/
f4af5a
b0a9c8 #include <Traps.h>
adaf5a
fb46ad #include "MacDebug.h"
685bf6 #include "MacTraps.h"
bb0d08 #include "pgpMem.h"
2eaf5a
59fd2e #include "MacDebugPatches.h"
b6af5a
1f5f39 #include "SetupA5.h"
e1af5a
c0af5a
4771a1 #if USE_MAC_DEBUG_PATCHES¤  // [
42af5a
6e4a93 #ifndef MAC_DEBUG_PATCHES_WHACK_FREE_SPACE
082c64 ¤   #ifdef USE_WHACKFREESPACE
3fb57a ¤   ¤   #define MAC_DEBUG_PATCHES_WHACK_FREE_SPACE¤ USE_WHACKFREESPACE
aa47b4 ¤   #else
49e054 ¤   ¤   #define MAC_DEBUG_PATCHES_WHACK_FREE_SPACE¤ 1
3ab7ec ¤   #endif
e97454 #endif
f5af5a
89137c static PGPUInt32¤   gWhackFreeSpaceDisableCount = 0;
e9af5a
ed7353 enum
f4bb36 {
837a68 ¤   uppDisposePtrProcInfo¤  = kRegisterBased
110ab2 ¤   ·| REGISTER_ROUTINE_PARAMETER( 1, kRegisterD0, SIZE_CODE(sizeof(short)))
91701c ¤   ·| REGISTER_ROUTINE_PARAMETER( 2, kRegisterA0, SIZE_CODE(sizeof(Ptr)))
4a82f7 };
4467c5 ¤
3f7353 enum
a7bb36 {
a87ae3 ¤   uppDisposeHandleProcInfo¤   = kRegisterBased
5e0ab2 ¤   ·| REGISTER_ROUTINE_PARAMETER( 1, kRegisterD0, SIZE_CODE(sizeof(short)))
caa1d8 ¤   ·| REGISTER_ROUTINE_PARAMETER( 2, kRegisterA0, SIZE_CODE(sizeof(Handle)))
8882f7 };
0e67c5 ¤
fcaf5a
96ef0f typedef UniversalProcPtr¤   DisposeHandleUPP;
f95ecd typedef UniversalProcPtr¤   DisposePtrUPP;
2caf5a
16ce53 #define NewDisposeHandleProc( userRoutine ) \
ac6ed7 ¤   NewRoutineDescriptor((ProcPtr)(userRoutine),\
3b1abf ¤   uppDisposeHandleProcInfo, GetCurrentArchitecture())
a167c5 ¤
bddacb #define NewDisposePtrProc( userRoutine ) \
636ed7 ¤   NewRoutineDescriptor((ProcPtr)(userRoutine),\
20559e ¤   uppDisposePtrProcInfo, GetCurrentArchitecture())
5967c5 ¤
3aaf5a
196aa6 static DisposePtrUPP¤   sRealDisposePtrPatch¤   = nil;
62f3c3 static DisposeHandleUPP¤sRealDisposeHandlePatch¤= nil;
6faf5a
81ae25 // Filling a block which is itself a heap zone will cause a crash. This
40d717 // function attempts to guess that a block is a heap zone.
04af5a
6ccd8d ¤   static Boolean
3740c6 BlockMayBeHeapZone(LogicalAddress address, UInt32 blockSize)
25bb36 {
77c440 ¤   Boolean¤¤   mayBeHeapZone = FALSE;
4167c5 ¤
--af2f 0002659ccbd401201f8 Page 2 of MacDebugPatches.cp
044ddc ¤   if( blockSize > sizeof( Zone ) )
3cc7a1 ¤   {
fa0308 ¤   ¤   THz¤¤   zoneHeader ¤= (THz) address;
325372 ¤   ¤   char¤   *zoneStart¤ = (char *) &zoneHeader->heapData;
545b97 ¤   ¤   char¤   *zoneEnd¤   = (char *) address + blockSize - 1;
501b52 ¤   ¤
a941eb ¤   ¤   // Try to guess that the block is a heap zone by validating
41db93 ¤   ¤   // some fields in the "zone header" WITHOUT dereferencing
8891cb ¤   ¤   // any pointers. We're declaring it a zone iff:
ac65af ¤   ¤   //
48d40d ¤   ¤   // 1) bkLim is within 32 bytes of the end of the block.
429d8f ¤   ¤   // 2) purgePtr is within the block or is nil.
dd57b5 ¤   ¤   // 3) hFstFree is within the block or is nil.
9376ca ¤   ¤   // 4) zcbFree is less than the size of the block.
8d67c5 ¤
ccc290 ¤   ¤   if( ( zoneHeader->bkLim > zoneEnd - 32 ) &&¤¤
6615ef ¤   ¤   ¤   ( zoneHeader->bkLim < zoneEnd ) &&
e087c7 ¤   ¤   ¤
ce330c ¤   ¤   ¤   ( IsNull( zoneHeader->purgePtr ) ||
afd757 ¤   ¤   ¤   ( ( zoneHeader->purgePtr > zoneStart ) &&·
7213ee ¤   ¤   ¤   ··( zoneHeader->purgePtr < zoneEnd ) ) ) &&
f59c33 ¤   ¤   ¤   ··
68fd95 ¤   ¤   ¤   ( IsNull( zoneHeader->hFstFree ) ||
c99761 ¤   ¤   ¤   ( ( zoneHeader->hFstFree > zoneStart ) &&·
02471b ¤   ¤   ¤   ··( zoneHeader->hFstFree < zoneEnd ) ) ) &&
8487c7 ¤   ¤   ¤
09b787 ¤   ¤   ¤   ( zoneHeader->zcbFree < blockSize ) )
6c5b34 ¤   ¤   {
82eda1 ¤   ¤   ¤   mayBeHeapZone = TRUE;
e50fe4 ¤   ¤   }
c99371 ¤   }
f7af5a
c8fcbe ¤   return( mayBeHeapZone );
75efe6 }
85af5a
fe358b // called by "glue" routine
c2c5c5 ¤   static pascal void
bde30c DisposeHandlePatchImpl(
6536b7 ¤   short¤  /*trapWord*/,
4b98fc ¤   Handle¤ h)
95bb36 {
5ca5d4 ¤   #if ! TARGET_RT_MAC_CFM
ca4c68 ¤   static ulong¤   kMagicTest¤ = 'DSPS';
68f884 ¤   pgpDebugMsgIf( kMagicTest != 'DSPS',
f58a20 ¤   ¤   "DisposeHandlePatchImpl: A5/A4 is not be set up" );
bfb7ec ¤   #endif
a9af5a
e1fcf7 ¤   if ( IsntNull( h ) && IsntNull( *h ) )
7dc7a1 ¤   {
4de068 ¤   ¤   if( DebugTraps_HandleZone( h ) != SystemZone() )
385b34 ¤   ¤   {
b49efe ¤   ¤   ¤   Size¤   hSize¤  = DebugTraps_GetHandleSize( h );
191b52 ¤   ¤
8efab6 ¤   ¤   #if MAC_DEBUG_PATCHES_WHACK_FREE_SPACE
859cdb ¤   ¤   ¤   if( gWhackFreeSpaceDisableCount == 0 &&
5f3464 ¤   ¤   ¤   ¤   ! BlockMayBeHeapZone( *h, hSize ) )
a2f776 ¤   ¤   ¤   {
1ef67a ¤   ¤   ¤   ¤   MacDebug_FillWithGarbage( *h, hSize );
08a3a6 ¤   ¤   ¤   }
0ad656 ¤   ¤   #endif
0b0fe4 ¤   ¤   }
819371 ¤   }
0cefe6 }
5c67c5 ¤
e5af5a
e0358b // called by "glue" routine
5ec5c5 ¤   static pascal void
9815b9 DisposePtrPatchImpl(
c736b7 ¤   short¤  /*trapWord*/,
a867e1 ¤   Ptr¤¤   p)
e5bb36 {
26a5d4 ¤   #if ! TARGET_RT_MAC_CFM
--8b5b 000e31d46f2401201f8 Page 3 of MacDebugPatches.cp
584c68 ¤   static ulong¤   kMagicTest¤ = 'DSPS';
86f884 ¤   pgpDebugMsgIf( kMagicTest != 'DSPS',
60a51c ¤   ¤   "DisposePtrPatchImpl: A5/A4 is not be set up" );
17b7ec ¤   #endif
0d67c5 ¤
da5e04 ¤   if ( IsntNull( p ) )
e6c7a1 ¤   {
74f800 ¤   ¤   if( DebugTraps_PtrZone( p ) != SystemZone() )
c45b34 ¤   ¤   {
4bfe14 ¤   ¤   ¤   Size¤   ptrSize¤= DebugTraps_GetPtrSize( p );
281b52 ¤   ¤
b4fab6 ¤   ¤   #if MAC_DEBUG_PATCHES_WHACK_FREE_SPACE
ea9cdb ¤   ¤   ¤   if( gWhackFreeSpaceDisableCount == 0 &&
db12ba ¤   ¤   ¤   ¤   ! BlockMayBeHeapZone( p, ptrSize ) )
99f776 ¤   ¤   ¤   {
acabe5 ¤   ¤   ¤   ¤   MacDebug_FillWithGarbage( p, ptrSize );
52a3a6 ¤   ¤   ¤   }
49d656 ¤   ¤   #endif
a10fe4 ¤   ¤   }
d19371 ¤   }
98efe6 }
fcaf5a
cfaf5a
25af5a
1c6536 #if TARGET_RT_MAC_CFM¤  // [
68af5a
edc5c5 ¤   static pascal void
e723a3 DisposeHandlePatchGlue(
1df291 ¤   short¤  trapWord,
1b98fc ¤   Handle¤ h)
8fbb36 {
160d61 ¤   DisposeHandlePatchImpl( trapWord, h );
884b85 ¤   CallOSTrapUniversalProc( sRealDisposeHandlePatch,
5fbb36 ¤   ¤   uppDisposeHandleProcInfo, trapWord, h);
05efe6 }
6667c5 ¤
2367c5 ¤
0bc5c5 ¤   static pascal void
3ed516 DisposePtrPatchGlue(
88f291 ¤   short¤  trapWord,
2a67e1 ¤   Ptr¤¤   p)
dbbb36 {
f72077 ¤   DisposePtrPatchImpl( trapWord, p );
837a31 ¤   CallOSTrapUniversalProc( sRealDisposePtrPatch,
92537c ¤   ¤   uppDisposePtrProcInfo, trapWord, p);
3fefe6 }
a667c5 ¤
3b411a #else¤  // ] [
e9af5a
76af5a
4faf5a
01af5a
8a102c ¤   static pascal asm void
0b31b3 DisposeHandlePatchGlue()
70c7a1 ¤   {
2b017d ¤   movem.l¤D1/A0, -(sp)
7b67c5 ¤
162129 ¤   jsr¤¤   SetUpA5¤¤
e144b8 ¤   // A5 now valid, save old value on stack
5a37ca ¤   move.l¤ D0, -(sp)
5267c5 ¤
36afcd ¤   move.w¤ d1, -(sp)
3cab71 ¤   move.l¤ A0, -(sp)
bb3a26 ¤   jsr¤¤   DisposeHandlePatchImpl
9767c5 ¤
71571b ¤   move.l¤ sRealDisposeHandlePatch, D0
094275 ¤   move.l¤ (sp)+, A5
3d4006 ¤   movem.l¤(sp)+, D1/A0
9367c5 ¤
1b37ca ¤   move.l¤ D0, -(sp)
2618c2 ¤   rts
e39371 ¤   }
--d1bb 000931379d1401201f8 Page 4 of MacDebugPatches.cp
2a67c5 ¤
5c102c ¤   static pascal asm void
62d363 DisposePtrPatchGlue()
e2c7a1 ¤   {
d4017d ¤   movem.l¤D1/A0, -(sp)
4767c5 ¤
432129 ¤   jsr¤¤   SetUpA5¤¤
b244b8 ¤   // A5 now valid, save old value on stack
7b37ca ¤   move.l¤ D0, -(sp)
de67c5 ¤
28afcd ¤   move.w¤ d1, -(sp)
57ab71 ¤   move.l¤ A0, -(sp)
4eefae ¤   jsr¤¤   DisposePtrPatchImpl
7067c5 ¤
124155 ¤   move.l¤ sRealDisposePtrPatch, D0
3d4275 ¤   move.l¤ (sp)+, A5
ba4006 ¤   movem.l¤(sp)+, D1/A0
8c67c5 ¤
5737ca ¤   move.l¤ D0, -(sp)
0a18c2 ¤   rts
0b9371 ¤   }
aa67c5 ¤
5a76d8 #endif¤ // ]
9caf5a
beaf5a
be7e69 ¤   Boolean
8290e4 DebugPatches_DisposeTrapsPatched( )
5bbb36 {
4c00ad ¤   return( IsntNull( sRealDisposePtrPatch ) );
a7efe6 }
e8af5a
d9af5a
396d52 ¤   void
6ba63f DebugPatches_PatchDisposeTraps()
64bb36 {
909b9b ¤   if ( ! DebugPatches_DisposeTrapsPatched() )
a9c7a1 ¤   {
ae9306 ¤   ¤   DisposeHandleUPP¤   disposeHandlePatch;
e2fc07 ¤   ¤   Boolean¤¤   ¤   ¤   patchedOK;
cf1b52 ¤   ¤
5be6b4 ¤   ¤   PrepareCallbackA5();
6b1b52 ¤   ¤
284307 ¤   ¤   disposeHandlePatch¤ = NewDisposeHandleProc( DisposeHandlePatchGlue );
3fb45b ¤   ¤   patchedOK ¤ ¤   ¤   = PFLPatchTrap( _DisposeHandle,
e3f1f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   disposeHandlePatch, &sRealDisposeHandlePatch);
aede84 ¤   ¤   pgpAssert( patchedOK );
8daf5a
b15bea ¤   ¤   DisposeHandle( NewHandle( 10 ) );¤  // test it right now
481b52 ¤   ¤
449032 ¤   ¤   DisposePtrUPP¤  ¤   disposePtrPatch;
505f74 ¤   ¤   disposePtrPatch¤= NewDisposePtrProc( DisposePtrPatchGlue );
898007 ¤   ¤   patchedOK ¤ ¤   = PFLPatchTrap( _DisposePtr,
eba976 ¤   ¤   ¤   ¤   ¤   ¤   ¤   disposePtrPatch, &sRealDisposePtrPatch);
9ede84 ¤   ¤   pgpAssert( patchedOK );
ad1b52 ¤   ¤
ebbad5 ¤   ¤   DisposePtr( NewPtr( 10 ) );¤// test it right now
039371 ¤   }
f8efe6 }
bdaf5a
d26d52 ¤   void
62dfbf DebugPatches_EnableWhackFreeSpace(void)
0bbb36 {
dd37cd ¤   if( gWhackFreeSpaceDisableCount != 0 )
bf124f ¤   ¤   --gWhackFreeSpaceDisableCount;
49efe6 }
f0af5a
fb6d52 ¤   void
f6c8e8 DebugPatches_DisableWhackFreeSpace(void)
15bb36 {
2b1f0c ¤   ++gWhackFreeSpaceDisableCount;
1aefe6 }
93af5a
--b076 00141c71f42401201f8 Page 5 of MacDebugPatches.cp
0fdb21 #else
d7af5a
2dc4ab #define DisposeTrapsPatched()¤  ¤   ( FALSE )
e1af5a
c376d8 #endif¤ // ]
41af5a
--403e 0014ebd8f27401201f9 Page 1 of MacDebugPatches.h
a70335 /*____________________________________________________________________________
5f0633 ¤   MacDebugPatches.h
7a67c5 ¤
6ec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
574b0f ¤   All rights reserved.
7a67c5 ¤
9460e7 ¤   $Id: MacDebugPatches.h,v 1.4.12.1 1998/11/12 03:18:51 heller Exp $
b4f7f7 ____________________________________________________________________________*/
95af5a
557b7d #pragma once
1faf5a
6c46ad #include "MacDebug.h"
a3af5a
396df8 #ifndef USE_MAC_DEBUG_PATCHES
8d4d8e ¤   #define USE_MAC_DEBUG_PATCHES¤  ¤   USE_MAC_DEBUG_TRAPS
d37454 #endif
99af5a
313273 #if USE_MAC_DEBUG_PATCHES
daaf5a
ef938f ¤   void¤   DebugPatches_PatchDisposeTraps(void);
62e0b7 ¤   Boolean¤DebugPatches_DisposeTrapsPatched(void);
06af5a
eacf32 ¤   void¤   DebugPatches_EnableWhackFreeSpace(void);
42cf2e ¤   void¤   DebugPatches_DisableWhackFreeSpace(void);
7067c5 ¤
9edb21 #else
34af5a
c7af7b ¤   #define DebugPatches_PatchDisposeTraps()
67be64 ¤   #define DebugPatches_DisposeTrapsPatched()¤ ( FALSE )
b7af5a
a8f9cf ¤   #define¤DebugPatches_EnableWhackFreeSpace()
491d29 ¤   #define¤DebugPatches_DisableWhackFreeSpace()
3067c5 ¤
4e2841 #endif¶
--9d87 0000796b8a6401201fa Page 1 of MacDebugTraps.cp
a70335 /*____________________________________________________________________________
f74fee ¤   MacDebugTraps.cp
de67c5 ¤
99c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
3b4b0f ¤   All rights reserved.
b067c5 ¤
5a67c5 ¤
38af5a
5158df ¤   $Id: MacDebugTraps.cp,v 1.17.12.1 1998/11/12 03:18:52 heller Exp $
36f7f7 ____________________________________________________________________________*/
1eaf5a
7eee38 #include <AEObjects.h>
08c746 #include <AEPackObject.h>
554d37 #include <LowMem.h>
c7af5a
2346ad #include "MacDebug.h"
fc0d08 #include "pgpMem.h"
59af5a
ebfd2e #include "MacDebugPatches.h"
02f406 #include "MacDebugTrapsOff.h"
9eaf5a
197c7a #include <Icons.h>
b6af5a
be136e #if USE_MAC_DEBUG_TRAPS¤// [
5aaf5a
02426a #include "MacDebugLeaks.h"
dcaf5a
377997 #define kHStatePurgeableMask¤   0x40
9b17f5 #define kHStateLockedMask¤  ¤   0x80
82e706 #define kHStateResourceMask¤¤   0x20
f4af5a
08ec20 inline Boolean HStateIsPurgeable( SInt8 hState )
5cc74f ¤   { return( ( hState & kHStatePurgeableMask ) != 0 ); }
bd67c5 ¤
f11d4a inline Boolean HStateIsLocked( SInt8 hState )
1109ab ¤   { return( ( hState & kHStateLockedMask ) != 0 ); }
dc67c5 ¤
dd7f50 inline Boolean HStateIsResource( SInt8 hState )
f6532a ¤   { return( ( hState & kHStateResourceMask ) != 0 ); }
7d67c5 ¤
4be86e inline Boolean HandleIsPurged( Handle theHandle )
7d7364 ¤   { return( IsNull( *( theHandle ) ) ); }
7faf5a
27af5a
815e9b /*__________________________________________________________________________
78e503 ¤   Errors such as 'noErr' and 'memFullErr' are normal because they can occur
e0aa04 ¤   in normal usage with no adverse consequences.
641b44 ¤   Other errors, which indicate a bad handle, heap, etc are not normal.
e2f7f7 ____________________________________________________________________________*/
0dcd8d ¤   static Boolean
d27b71 MemErrIsNormal( OSErr¤  err )
cdc7a1 ¤   {
bf5f6c ¤   return( IsntErr( err ) || err == memFullErr );
5f9371 ¤   }
0caf5a
5baf5a
3e33c8 ¤   static void
c5fc05 AssertMemErrIsNormal( const char * msg )
3ec7a1 ¤   {
9d4351 ¤   OSErr¤  err;
ad67c5 ¤
df12b8 ¤   err¤= LMGetMemErr();
bd2287 ¤   if ( ! MemErrIsNormal( err ) )
265b34 ¤   ¤   {
3e2945 ¤   ¤   AssertNoErr( err, msg );
fb0fe4 ¤   ¤   }
ae9371 ¤   }
22af5a
55af5a
e5af5a
52cd8d ¤   static Boolean
07cc25 HandleIsPurgeable( Handle¤  h )
--4605 000e7fbd349401201fa Page 2 of MacDebugTraps.cp
f7c7a1 ¤   {
d6d6fa ¤   SInt8¤  hState;
d667c5 ¤
5ec75d ¤   hState¤ = HGetState( h );
de67c5 ¤
3feb90 ¤   return( HStateIsPurgeable( hState ) );
8b9371 ¤   }
11af5a
34af5a
30cd8d ¤   static Boolean
7db374 HandleIsLocked( Handle¤ h )
64c7a1 ¤   {
6cd6fa ¤   SInt8¤  hState;
ab7c7a ¤   #define kHStatePurgeableMask¤   0x40
ad1218 ¤   #define kHStateLockedMask¤  ¤   0x80
2667c5 ¤
1bc75d ¤   hState¤ = HGetState( h );
5967c5 ¤
2345d4 ¤   return( HStateIsLocked( hState ) );
de9371 ¤   }
beaf5a
2eaf5a
88cd8d ¤   static Boolean
8ff9c6 HandleIsPurgeableAndNotLocked( Handle h )
7cc7a1 ¤   {
64baa2 ¤   return( HandleIsPurgeable( h ) && ! HandleIsLocked( h ) );
d89371 ¤   }
7faf5a
94af5a
20af5a
f2cd8d ¤   static Boolean
54fd38 IsValidMemoryAllocationSize( Size¤  theSize )
20c7a1 ¤   {
0c5323 ¤   // choose the highest value that you anticipate
c422b0 ¤   #define kMaxReasonableAllocation¤   ¤   (128 * 1024UL * 1024UL )
96af5a
ae126b ¤   return( theSize >= 0 && theSize <= kMaxReasonableAllocation );
839371 ¤   }
11af5a
2daf5a
9b33c8 ¤   static void
1df290 AssertValidMemoryAllocationSize(
e4a1de ¤   Size¤   ¤   ¤   byteCount,
c0e50b ¤   const char *¤   msg )
43c7a1 ¤   {
38399c ¤   if ( ! IsValidMemoryAllocationSize( byteCount ) )
565b34 ¤   ¤   {
759233 ¤   ¤   Str255¤ out;
e51b52 ¤   ¤
12dd3f ¤   ¤   pgpFormatPStr( out, sizeof( out ), TRUE,
c4f47a ¤   ¤   ¤   "%s: invalid memory allocation size: %ld bytes",
f9f017 ¤   ¤   ¤   msg, ( long )byteCount );
dfbc50 ¤   ¤   pgpDebugPStr( out );
120fe4 ¤   ¤   }
379371 ¤   }
41af5a
fcaf5a
3ef66a #if PRAGMA_MARK_SUPPORTED
b0dacc #pragma mark -
5afb79 #pragma mark --- Memory Manager ---
dd7454 #endif
43af5a
e5af5a
2e6685 ¤   pascal void
19413e DebugTraps_DisposeHandle( Handle h )
44c7a1 ¤   {
3c285f ¤   AssertHandleIsValid( h, "DebugTraps_DisposeHandle");
9267c5 ¤
13934e ¤   UInt32¤ hSize;
96d6fa ¤   SInt8¤  hState;
4367c5 ¤
e74761 ¤   MacLeaks_ForgetHandle( h, kMacLeaks_DisposeHandleDeallocType );
--bccc 0001986c2ce401201fa Page 3 of MacDebugTraps.cp
2a67c5 ¤
abc75d ¤   hState¤ = HGetState( h );
1fc20c ¤   pgpAssertMsg( ! HStateIsResource( hState ),
b42fb3 ¤   ¤   "DebugTraps_DisposeHandle: this Handle is a resource. "
236f7d ¤   ¤   "Use ReleaseResource");
8f67c5 ¤
5737f6 ¤   // fill the handle with junk prior to disposing it
f9f9a3 ¤   hSize¤  = GetHandleSize( h );
e3e900 ¤   if ( MemError() == noErr )
c65b34 ¤   ¤   {
180dda ¤   ¤   if ( ! DebugPatches_DisposeTrapsPatched() )
c9f776 ¤   ¤   ¤   {
0ce75d ¤   ¤   ¤   MacDebug_FillWithGarbage( *h, hSize );
90a3a6 ¤   ¤   ¤   }
6d0fe4 ¤   ¤   }
5267c5 ¤
d0e5de ¤   DisposeHandle( h );
399c3b ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_DisposeHandle");
5a9371 ¤   }
53af5a
27af5a
9467c5 ¤
d86d49 #define kMaxReasonableBlockMove¤¤   (64 * 1024UL * 1024UL )
0daf5a
136685 ¤   pascal void
37881c DebugTraps_BlockMove(
217c7a ¤   const void¤ *srcPtr,
ead949 ¤   void¤   ¤   *destPtr,
42a5ed ¤   Size¤   ¤   byteCount )
17c7a1 ¤   {
1dda7b ¤   const void¤ *sysZone;
3267c5 ¤
168789 ¤   pgpAssertAddrValidMsg( srcPtr, VoidAlign, "DebugTraps_BlockMove");
9175fb ¤   pgpAssertAddrValidMsg( destPtr, VoidAlign, "DebugTraps_BlockMove");
7367c5 ¤
140ec2 ¤   pgpAssertMsg( byteCount >= 0,
6c9fe3 ¤   ¤   "DebugTraps_BlockMove: negative PGPByte count");
30e3ee ¤   pgpAssertMsg( byteCount <= kMaxReasonableBlockMove,
43d8c8 ¤   ¤   "DebugTraps_BlockMove: count is huge...is this correct?");
6c67c5 ¤
6401b1 ¤   sysZone¤= SystemZone();
52b379 ¤   pgpAssertMsg( srcPtr >= ( void *)sysZone || srcPtr == (void *) 0x0910,
5611c2 ¤   ¤   "DebugTraps_BlockMove: srcPtr below system zone");
34cfcd ¤   pgpAssertMsg( destPtr >= ( void *)sysZone,
95607d ¤   "DebugTraps_BlockMove: destPtr below system zone");
8967c5 ¤
7b67c5 ¤
c20965 ¤   BlockMove( srcPtr, destPtr, byteCount );
8b9371 ¤   }
11af5a
0eaf5a
c36685 ¤   pascal void
20fb30 DebugTraps_BlockMoveData(
4e7c7a ¤   const void¤ *srcPtr,
e0d949 ¤   void¤   ¤   *destPtr,
93a5ed ¤   Size¤   ¤   byteCount )
7bc7a1 ¤   {
e6da7b ¤   const void¤ *sysZone;
6667c5 ¤
6b8ee9 ¤   pgpAssertAddrValidMsg( srcPtr, VoidAlign, "DebugTraps_BlockMoveData");
a3d456 ¤   pgpAssertAddrValidMsg( destPtr, VoidAlign, "DebugTraps_BlockMoveData");
1e67c5 ¤
120ec2 ¤   pgpAssertMsg( byteCount >= 0,
371b68 ¤   ¤   "DebugTraps_BlockMoveData: negative PGPByte count");
61e3ee ¤   pgpAssertMsg( byteCount <= kMaxReasonableBlockMove,
ac9c4c ¤   ¤   "DebugTraps_BlockMoveData: count is huge...is this correct?");
75af5a
3001b1 ¤   sysZone¤= SystemZone();
4db379 ¤   pgpAssertMsg( srcPtr >= ( void *)sysZone || srcPtr == (void *) 0x0910,
cbbb8a ¤   ¤   "DebugTraps_BlockMoveData: srcPtr below system zone");
73cfcd ¤   pgpAssertMsg( destPtr >= ( void *)sysZone,
1921cc ¤   ¤   "DebugTraps_BlockMoveData: destPtr below system zone");
--67d1 000c7df2ce8401201fa Page 4 of MacDebugTraps.cp
2a67c5 ¤
e567c5 ¤
4c066c ¤   BlockMoveData( srcPtr, destPtr, byteCount );
6a9371 ¤   }
c7af5a
08af5a
70ca72 ¤   pascal Handle
0f8686 DebugTraps_NewHandle(
ac5d93 ¤   Size¤   ¤   byteCount,
cffd37 ¤   MDT_FileAndLineParams )
c0c7a1 ¤   {
c93edd ¤   Handle¤ h;
eb67c5 ¤
16782f ¤   pgpAssertMsg( byteCount >= 0, "DebugTraps_NewHandle: negative count");
c47517 #if MEMORY_ALLOC_MUST_BE_APP
42f12b ¤   pgpAssertMsg( GetZone() == ApplicationZone(),
b79e51 ¤   ¤   "DebugTraps_NewHandle: MEMORY_ALLOC_MUST_BE_APP");
aa4175 #elif MEMORY_ALLOC_MUST_BE_SYS
d4905a ¤   pgpAssertMsg( GetZone() == SystemZone(),
5e249c ¤   ¤   "DebugTraps_NewHandle: MEMORY_ALLOC_MUST_BE_SYS");
2f372b #elif MEMORY_ALLOC_MUST_BE_APP_OR_SYS
eb1696 ¤   pgpAssertMsg( GetZone() == ApplicationZone() ||
5dbac8 ¤   ¤   GetZone() == SystemZone(),
10e6da ¤   ¤   "DebugTraps_NewHandle: MEMORY_ALLOC_MUST_BE_APP_OR_SYS");
567454 #endif
da1b52 ¤   ¤
b3f042 ¤   h¤  = NewHandle( byteCount );
865fe1 ¤   AssertMemErrIsNormal( "DebugTraps_NewHandle" );
e767c5 ¤
982142 ¤   // byteCount is tested as well, because the memory manager has a bug that
d6ee2c ¤   // causes it to succeed in creating a valid handle for small
8b34e8 ¤   // negative sizes. ·This bug may be fixed in 7.5.3 update 3.0
50e686 ¤   if ( IsntNull( h ) && byteCount > 0 && LMGetMemErr() == noErr )
8a5b34 ¤   ¤   {
5effd1 ¤   ¤   MacDebug_FillWithGarbage( *h, byteCount );
311b52 ¤   ¤
164198 ¤   ¤   MacLeaks_RememberHandle( h,
2be108 ¤   ¤   ¤   kMacLeaks_NewHandleAllocType, srcFile_, srcLine_);
2d0fe4 ¤   ¤   }
2367c5 ¤
abc523 ¤   return( h );
019371 ¤   }
43af5a
64af5a
1eaf5a
38af5a
a9ca72 ¤   pascal Handle
b6ef04 DebugTraps_NewHandleClear(
d05d93 ¤   Size¤   ¤   byteCount,
98a2d6 ¤   MDT_FileAndLineParams¤  )
2bc7a1 ¤   {
6e3edd ¤   Handle¤ h;
d967c5 ¤
664f27 ¤   AssertValidMemoryAllocationSize( byteCount, "DebugTraps_NewHandleClear");
1f7517 #if MEMORY_ALLOC_MUST_BE_APP
44f12b ¤   pgpAssertMsg( GetZone() == ApplicationZone(),
980b0d ¤   ¤   "DebugTraps_NewHandleClear: MEMORY_ALLOC_MUST_BE_APP");
004175 #elif MEMORY_ALLOC_MUST_BE_SYS
89905a ¤   pgpAssertMsg( GetZone() == SystemZone(),
b8b1c0 ¤   ¤   "DebugTraps_NewHandleClear: MEMORY_ALLOC_MUST_BE_SYS");
69372b #elif MEMORY_ALLOC_MUST_BE_APP_OR_SYS
6179bf ¤   pgpAssertMsg( GetZone() == ApplicationZone() || GetZone() == SystemZone(),
f9761a ¤   ¤   "DebugTraps_NewHandleClear: MEMORY_ALLOC_MUST_BE_APP_OR_SYS");
277454 #endif
0a1b52 ¤   ¤
7fdd6f ¤   h¤  = NewHandleClear( byteCount );
1d8a85 ¤   AssertMemErrIsNormal( "DebugTraps_NewHandleClear" );
d467c5 ¤
dc3dec ¤   if ( IsntNull( h ) )
f52ef1 ¤   {¤
bd4198 ¤   ¤   MacLeaks_RememberHandle( h,
c784ec ¤   ¤   ¤   kMacLeaks_NewHandleClearAllocType, srcFile_, srcLine_);
--749b 000e08d3c61401201fa Page 5 of MacDebugTraps.cp
a19371 ¤   }
9967c5 ¤
81c523 ¤   return( h );
fc9371 ¤   }
45af5a
20ca72 ¤   pascal Handle
1a02ab DebugTraps_NewHandleSys(
5a5d93 ¤   Size¤   ¤   byteCount,
45a2d6 ¤   MDT_FileAndLineParams¤  )
bfc7a1 ¤   {
613edd ¤   Handle¤ h;
be67c5 ¤
cf7feb ¤   AssertValidMemoryAllocationSize( byteCount, "DebugTraps_NewHandleSys");
417517 #if MEMORY_ALLOC_MUST_BE_APP
58f12b ¤   pgpAssertMsg( GetZone() == ApplicationZone(),
dd8fe9 ¤   ¤   "DebugTraps_NewHandleSys: MEMORY_ALLOC_MUST_BE_APP");
267454 #endif
451b52 ¤   ¤
c9ac7e ¤   h¤  = NewHandleSys( byteCount );
eb84b1 ¤   AssertMemErrIsNormal( "DebugTraps_NewHandleSys" );
8a67c5 ¤
4a33f5 ¤   if ( IsntNull( h ) && LMGetMemErr() == noErr )
fd5b34 ¤   ¤   {
94ffd1 ¤   ¤   MacDebug_FillWithGarbage( *h, byteCount );
971b52 ¤   ¤
394198 ¤   ¤   MacLeaks_RememberHandle( h,
0d0228 ¤   ¤   ¤   kMacLeaks_NewHandleSysAllocType, srcFile_, srcLine_);
0d0fe4 ¤   ¤   }
5e67c5 ¤
22c523 ¤   return( h );
7a9371 ¤   }
55af5a
6eaf5a
f0ca72 ¤   pascal Handle
dfac63 DebugTraps_NewHandleSysClear(
125d93 ¤   Size¤   ¤   byteCount,
aca2d6 ¤   MDT_FileAndLineParams¤  )
96c7a1 ¤   {
f23edd ¤   Handle¤ h;
2e67c5 ¤
bf6198 ¤   AssertValidMemoryAllocationSize( byteCount,
a31951 ¤   ¤   "DebugTraps_NewHandleSysClear");
3a7517 #if MEMORY_ALLOC_MUST_BE_APP
94f12b ¤   pgpAssertMsg( GetZone() == ApplicationZone(),
69d0b3 ¤   ¤   "DebugTraps_NewHandleSysClear: MEMORY_ALLOC_MUST_BE_APP");
2c7454 #endif
6c1b52 ¤   ¤
1a3cac ¤   h¤  = NewHandleSysClear( byteCount );
3ac78a ¤   AssertMemErrIsNormal( "DebugTraps_NewHandleSysClear" );
b767c5 ¤
633dec ¤   if ( IsntNull( h ) )
39c7a1 ¤   {
2c7fac ¤   ¤   MacLeaks_RememberHandle( h, kMacLeaks_NewHandleSysClearAllocType,
49edc2 ¤   ¤   ¤   srcFile_, srcLine_);
a19371 ¤   }
ea67c5 ¤
76c523 ¤   return( h );
689371 ¤   }
79af5a
eaaf5a
9118f3 ¤   pascal Size
910787 DebugTraps_GetHandleSize(
be0c62 ¤   Handle h )
f3c7a1 ¤   {
35070b ¤   Size¤   theSize;
c84351 ¤   OSErr¤  err;
3467c5 ¤
8ef6b8 ¤   AssertHandleIsValid( h, "DebugTraps_GetHandleSize");
2467c5 ¤
e18d33 ¤   theSize¤= GetHandleSize( h );
e567c5 ¤
e012b8 ¤   err¤= LMGetMemErr();
--5736 000cebfbbdd401201fa Page 6 of MacDebugTraps.cp
6cb5f5 ¤   if ( err == nilHandleErr && IsNull( *h ) )
dd5b34 ¤   ¤   {
32fa6e ¤   ¤   // normal to get this on purged Handle
260fe4 ¤   ¤   }
440e24 ¤   else
ac5b34 ¤   ¤   {
15e4c2 ¤   ¤   AssertNoErr( err, "DebugTraps_GetHandleSize");
610fe4 ¤   ¤   }
7f67c5 ¤
e59d02 ¤   return( theSize );
db9371 ¤   }
82af5a
d7af5a
7eaf5a
9848f4 ¤   pascal OSErr
d50c2c DebugTraps_PtrToHand(
d37c7a ¤   const void¤ *srcPtr,
fd4533 ¤   Handle¤ ¤   *dstHndl,
82daff ¤   long¤   ¤   size,
50a2d6 ¤   MDT_FileAndLineParams¤  )
c2c7a1 ¤   {
b54351 ¤   OSErr¤  err;
8b67c5 ¤
5bf307 ¤   pgpAssertAddrValidMsg( srcPtr, VoidAlign, "DebugTraps_PtrToHand");
701a56 ¤   pgpAssertAddrValidMsg( dstHndl, Ptr, "DebugTraps_PtrToHand");
4fab30 ¤   pgpAssertMsg( IsValidMemoryAllocationSize( size ), "DebugTraps_PtrToHand");
047517 #if MEMORY_ALLOC_MUST_BE_APP
62f12b ¤   pgpAssertMsg( GetZone() == ApplicationZone(),
cb29dd ¤   ¤   "DebugTraps_PtrToHand: MEMORY_ALLOC_MUST_BE_APP");
a14175 #elif MEMORY_ALLOC_MUST_BE_SYS
ff905a ¤   pgpAssertMsg( GetZone() == SystemZone(),
249310 ¤   ¤   "DebugTraps_PtrToHand: MEMORY_ALLOC_MUST_BE_SYS");
4d372b #elif MEMORY_ALLOC_MUST_BE_APP_OR_SYS
c879bf ¤   pgpAssertMsg( GetZone() == ApplicationZone() || GetZone() == SystemZone(),
280ffe ¤   ¤   "DebugTraps_PtrToHand: MEMORY_ALLOC_MUST_BE_APP_OR_SYS");
cc7454 #endif
fa67c5 ¤
d14aec ¤   err¤= PtrToHand( srcPtr, dstHndl, size );
9223a6 ¤   AssertNoErr( err, "DebugTraps_PtrToHand");
aa67c5 ¤
ad3850 ¤   if ( IsntErr( err ) && IsntNull( *dstHndl ) )
dd5b34 ¤   ¤   {
1eacb3 ¤   ¤   MacLeaks_RememberHandle( *dstHndl,
e80550 ¤   ¤   ¤   kMacLeaks_PtrToHandAllocType, srcFile_, srcLine_);
020fe4 ¤   ¤   }
b767c5 ¤
89deb7 ¤   return( err );
aa9371 ¤   }
dbaf5a
51af5a
5e3884 ¤   pascal Ptr
1c0f61 DebugTraps_NewPtr(
ed5d93 ¤   Size¤   ¤   byteCount,
5ea2d6 ¤   MDT_FileAndLineParams¤  )
83c7a1 ¤   {
42d84f ¤   Ptr¤newPtr;
e167c5 ¤
c1b11d ¤   AssertValidMemoryAllocationSize( byteCount, "DebugTraps_NewPtr");
e37517 #if MEMORY_ALLOC_MUST_BE_APP
abf12b ¤   pgpAssertMsg( GetZone() == ApplicationZone(),
007170 ¤   ¤   "DebugTraps_NewPtr: MEMORY_ALLOC_MUST_BE_APP");
bb4175 #elif MEMORY_ALLOC_MUST_BE_SYS
7f905a ¤   pgpAssertMsg( GetZone() == SystemZone(),
fbcbbd ¤   ¤   "DebugTraps_NewPtr: MEMORY_ALLOC_MUST_BE_SYS");
50372b #elif MEMORY_ALLOC_MUST_BE_APP_OR_SYS
0a79bf ¤   pgpAssertMsg( GetZone() == ApplicationZone() || GetZone() == SystemZone(),
87a516 ¤   ¤   "DebugTraps_NewPtr: MEMORY_ALLOC_MUST_BE_APP_OR_SYS");
077454 #endif
3baf5a
a53e07 ¤   newPtr¤ = NewPtr( byteCount );
e4ad1e ¤   AssertMemErrIsNormal( "DebugTraps_NewPtr" );
ce67c5 ¤
--865e 0003ec55531401201fa Page 7 of MacDebugTraps.cp
6f102c ¤   if ( IsntNull( newPtr ) && LMGetMemErr() == noErr )
a85b34 ¤   ¤   {
6bbbe6 ¤   ¤   MacDebug_FillWithGarbage( newPtr, byteCount );
dc1b52 ¤   ¤
d89c4a ¤   ¤   MacLeaks_RememberPtr( newPtr, kMacLeaks_NewPtrAllocType,
9e62d6 ¤   ¤   ¤   byteCount, srcFile_, srcLine_);
da0fe4 ¤   ¤   }
1867c5 ¤
7a9a07 ¤   return( newPtr );
589371 ¤   }
a2af5a
84af5a
733884 ¤   pascal Ptr
a52033 DebugTraps_NewPtrClear(
6a5d93 ¤   Size¤   ¤   byteCount,
07a2d6 ¤   MDT_FileAndLineParams¤  )
d5c7a1 ¤   {
1dd84f ¤   Ptr¤newPtr;
0267c5 ¤
919275 ¤   AssertValidMemoryAllocationSize( byteCount, "DebugTraps_NewPtrClear");
7c7517 #if MEMORY_ALLOC_MUST_BE_APP
3df12b ¤   pgpAssertMsg( GetZone() == ApplicationZone(),
9266ab ¤   ¤   "DebugTraps_NewPtrClear: MEMORY_ALLOC_MUST_BE_APP");
084175 #elif MEMORY_ALLOC_MUST_BE_SYS
43905a ¤   pgpAssertMsg( GetZone() == SystemZone(),
5cdc66 ¤   ¤   "DebugTraps_NewPtrClear: MEMORY_ALLOC_MUST_BE_SYS");
c5372b #elif MEMORY_ALLOC_MUST_BE_APP_OR_SYS
2c79bf ¤   pgpAssertMsg( GetZone() == ApplicationZone() || GetZone() == SystemZone(),
667927 ¤   ¤   "DebugTraps_NewPtrClear: MEMORY_ALLOC_MUST_BE_APP_OR_SYS");
6e7454 #endif
f91b52 ¤   ¤
fdaf82 ¤   newPtr¤ = NewPtrClear( byteCount );
5c3182 ¤   AssertMemErrIsNormal( "DebugTraps_NewPtrClear" );
f267c5 ¤
801f75 ¤   if ( IsntNull( newPtr ) )
55c7a1 ¤   {
36dc18 ¤   ¤   MacLeaks_RememberPtr( newPtr, kMacLeaks_NewPtrClearAllocType,
d162d6 ¤   ¤   ¤   byteCount, srcFile_, srcLine_);
9c9371 ¤   }
3067c5 ¤
619a07 ¤   return( newPtr );
da9371 ¤   }
0caf5a
09af5a
b63884 ¤   pascal Ptr
eadcdb DebugTraps_NewPtrSys(
0d5d93 ¤   Size¤   ¤   byteCount,
b9a2d6 ¤   MDT_FileAndLineParams¤  )
e5c7a1 ¤   {
67d84f ¤   Ptr¤newPtr;
9867c5 ¤
720458 ¤   AssertValidMemoryAllocationSize( byteCount, "DebugTraps_NewPtrSys");
e57517 #if MEMORY_ALLOC_MUST_BE_APP
7ef12b ¤   pgpAssertMsg( GetZone() == ApplicationZone(),
5abc5f ¤   ¤   "DebugTraps_NewPtrSys: MEMORY_ALLOC_MUST_BE_APP");
5a7454 #endif
37af5a
c2c30f ¤   newPtr¤ = NewPtrSys( byteCount );
910dfa ¤   AssertMemErrIsNormal( "DebugTraps_NewPtrSys" );
8767c5 ¤
3c102c ¤   if ( IsntNull( newPtr ) && LMGetMemErr() == noErr )
fe5b34 ¤   ¤   {
a7bbe6 ¤   ¤   MacDebug_FillWithGarbage( newPtr, byteCount );
df1b52 ¤   ¤
6f1f0a ¤   ¤   MacLeaks_RememberPtr( newPtr, kMacLeaks_NewPtrSysAllocType,
9e62d6 ¤   ¤   ¤   byteCount, srcFile_, srcLine_);
cb0fe4 ¤   ¤   }
f767c5 ¤
f89a07 ¤   return( newPtr );
f39371 ¤   }
abaf5a
3eaf5a
--bd36 0001a8cc6d4401201fa Page 8 of MacDebugTraps.cp
8b3884 ¤   pascal Ptr
12efaa DebugTraps_NewPtrSysClear(
da5d93 ¤   Size¤   ¤   byteCount,
5ba2d6 ¤   MDT_FileAndLineParams¤  )
74c7a1 ¤   {
84d84f ¤   Ptr¤newPtr;
8267c5 ¤
f47ac8 ¤   AssertValidMemoryAllocationSize( byteCount, "DebugTraps_NewPtrSysClear");
947517 #if MEMORY_ALLOC_MUST_BE_APP
22f12b ¤   pgpAssertMsg( GetZone() == ApplicationZone(),
45dc90 ¤   ¤   "DebugTraps_NewPtrSysClear: MEMORY_ALLOC_MUST_BE_APP");
137454 #endif
da67c5 ¤
180906 ¤   newPtr¤ = NewPtrSysClear( byteCount );
0767c5 ¤
439549 ¤   AssertMemErrIsNormal( "DebugTraps_NewPtrSysClear" );
c767c5 ¤
541f75 ¤   if ( IsntNull( newPtr ) )
f1c7a1 ¤   {
491599 ¤   ¤   MacLeaks_RememberPtr( newPtr, kMacLeaks_NewPtrSysClearAllocType,
8862d6 ¤   ¤   ¤   byteCount, srcFile_, srcLine_);
139371 ¤   }
f767c5 ¤
6c9a07 ¤   return( newPtr );
c59371 ¤   }
3baf5a
85af5a
7818f3 ¤   pascal Size
5c67b1 DebugTraps_GetPtrSize( Ptr newPtr )
abc7a1 ¤   {
8a070b ¤   Size¤   theSize;
7967c5 ¤
5eee61 ¤   theSize¤= GetPtrSize( newPtr );
17a1dd ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_GetPtrSize" );
5567c5 ¤
339d02 ¤   return( theSize );
b19371 ¤   }
89af5a
aaaf5a
df6685 ¤   pascal void
fc880f DebugTraps_SetPtrSize(
195730 ¤   Ptr¤¤   thePtr,
350a16 ¤   Size¤   newSize )
83c7a1 ¤   {
228a0e ¤   AssertValidMemoryAllocationSize( newSize, "DebugTraps_SetPtrSize");
fa67c5 ¤
feb59d ¤   SetPtrSize( thePtr, newSize );
a667c5 ¤
f31e8d ¤   AssertMemErrIsNormal( "DebugTraps_SetPtrSize" );
579371 ¤   }
eeaf5a
38af5a
bda7a5 ¤   pascal THz
f47e34 DebugTraps_PtrZone( Ptr thePtr )
a4c7a1 ¤   {
30f35a ¤   THz¤zone;
bd67c5 ¤
4c3bec ¤   zone¤   = PtrZone( thePtr );
188455 ¤   AssertMemErrIsNormal( "DebugTraps_PtrZone" );
3267c5 ¤
7cedfa ¤   return( zone );
6c9371 ¤   }
d4af5a
a6af5a
e06685 ¤   pascal void
e48bda DebugTraps_DisposePtr( Ptr thePtr )
06c7a1 ¤   {
217c7a ¤   UInt32¤ ptrSize;
8567c5 ¤
178a81 ¤   pgpAssertAddrValidMsg( thePtr, long, "DebugTraps_DisposePtr");
c367c5 ¤
1a37f6 ¤   // fill the handle with junk prior to disposing it
--7176 000d48ad2a5401201fa Page 9 of MacDebugTraps.cp
715e6a ¤   ptrSize¤= GetPtrSize( thePtr );
c9dd1d ¤   if ( LMGetMemErr() == noErr )
a35b34 ¤   ¤   {
d80dda ¤   ¤   if ( ! DebugPatches_DisposeTrapsPatched() )
e2f776 ¤   ¤   ¤   {
985b02 ¤   ¤   ¤   MacDebug_FillWithGarbage( thePtr, ptrSize );
38a3a6 ¤   ¤   ¤   }
0b0fe4 ¤   ¤   }
4567c5 ¤
88594e ¤   DisposePtr( thePtr );
0431a9 ¤   MacLeaks_ForgetPtr( thePtr, kMacLeaks_DisposePtrDeallocType );
3767c5 ¤
b96db0 ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_DisposePtr");
3c9371 ¤   }
e8af5a
d1af5a
26af5a
06af5a
036685 ¤   pascal void
d48dda DebugTraps_SetHandleSize(
2fe644 ¤   Handle¤ h,
ec0a16 ¤   Size¤   newSize )
7bc7a1 ¤   {
d3d859 ¤   Size¤   oldSize;
b6d6fa ¤   SInt8¤  hState;
e78e70 ¤   OSErr¤  err¤= noErr;
4e06e2 ¤   Boolean¤success¤= FALSE;
eb67c5 ¤
b1dc33 ¤   AssertValidMemoryAllocationSize( newSize, "DebugTraps_SetHandleSize");
a0be65 ¤   AssertHandleIsValid( h, "DebugTraps_SetHandleSize");
c367c5 ¤
2bf0a2 ¤   hState¤ = DebugTraps_HGetState( h );
0ab177 #if 0
378bc4 ¤   pgpAssertMsg( ( hState & kHStateLockedMask ) == 0,
176b6b ¤   ¤   "DebugTraps_SetHandleSize: "
b36dfc ¤   ¤   "changing size of locked Handle is a bug on System 8");
837454 #endif
c6af5a
a4ce54 ¤   oldSize¤= GetHandleSize( h );
ab67c5 ¤
c72a95 ¤   SetHandleSize( h, newSize );
d412b8 ¤   err¤= LMGetMemErr();
6fef88 ¤   AssertMemErrIsNormal( "DebugTraps_SetHandleSize" );
8d67c5 ¤
8712b1 ¤   success¤= GetHandleSize( h ) == newSize;
0967c5 ¤
086037 ¤   // we should either have the correct size Handle or an error
722ff5 ¤   pgpAssertMsg( IsErr( err ) || success,
ce4bfd ¤   ¤   "DebugTraps_SetHandleSize: inconsistent results");
f867c5 ¤
83770a ¤   if ( success && ( newSize > oldSize ) )
695b34 ¤   ¤   {
9b1749 ¤   ¤   MacDebug_FillWithGarbage( (( char *)*h ) + oldSize,
4fd167 ¤   ¤   ¤   newSize - oldSize );
270fe4 ¤   ¤   }
8c9371 ¤   }
b1af5a
b2af5a
506685 ¤   pascal void
039904 DebugTraps_ReallocateHandle(
8fe644 ¤   Handle¤ h,
1e682a ¤   Size¤   byteCount )
dcc7a1 ¤   {
1aed05 ¤   AssertValidMemoryAllocationSize( byteCount, "DebugTraps_ReallocateHandle");
2105a0 ¤   AssertHandleIsValid( h, "DebugTraps_ReallocateHandle");
7667c5 ¤
fa9ac9 ¤   ReallocateHandle( h, byteCount );
1667c5 ¤
a8dd1d ¤   if ( LMGetMemErr() == noErr )
255b34 ¤   ¤   {
64ffd1 ¤   ¤   MacDebug_FillWithGarbage( *h, byteCount );
d40fe4 ¤   ¤   }
--36b7 000cccf4c28401201fa Page 10 of MacDebugTraps.cp
060e24 ¤   else
505b34 ¤   ¤   {
dba9f2 ¤   ¤   AssertMemErrIsNormal( "DebugTraps_ReallocateHandle" );
8c0fe4 ¤   ¤   }
a19371 ¤   }
63af5a
21af5a
166685 ¤   pascal void
a585b1 DebugTraps_HLock(
600c62 ¤   Handle h )
e0c7a1 ¤   {
84438b ¤   AssertHandleIsValid( h, "stdHLock");
93ccd4 ¤   pgpAssertMsg( ! HandleIsPurged( h ),
71389e ¤   ¤   "DebugTraps_HLock: locking purged Handle");
4167c5 ¤
51a55e ¤   HLock( h );
932fcc ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_HLock");
f09371 ¤   }
0faf5a
01af5a
c36685 ¤   pascal void
3943be DebugTraps_HUnlock(
fc0c62 ¤   Handle h )
edc7a1 ¤   {
c0e603 ¤   AssertHandleIsValid( h, "stdHUnlock");
df67c5 ¤
247238 ¤   HUnlock( h );
c74407 ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_HUnlock");
059371 ¤   }
c1af5a
6daf5a
33e1d1 ¤   pascal SInt8
7abfec DebugTraps_HGetState(
460c62 ¤   Handle h )
0ac7a1 ¤   {
c7d6fa ¤   SInt8¤  hState;
a34351 ¤   OSErr¤  err;
9467c5 ¤
99fd81 ¤   AssertHandleIsValid( h, "DebugTraps_HGetState");
bb67c5 ¤
13c75d ¤   hState¤ = HGetState( h );
ca67c5 ¤
1312b8 ¤   err¤= LMGetMemErr();
8ab5f5 ¤   if ( err == nilHandleErr && IsNull( *h ) )
125b34 ¤   ¤   {
9efa6e ¤   ¤   // normal to get this on purged Handle
7e0fe4 ¤   ¤   }
130e24 ¤   else
bc5b34 ¤   ¤   {
38b6ae ¤   ¤   AssertNoErr( err, "DebugTraps_HGetState");
d10fe4 ¤   ¤   }
a767c5 ¤
8a99b4 ¤   return( hState );
0f9371 ¤   }
78af5a
a9af5a
426685 ¤   pascal void
20dd22 DebugTraps_HSetState(
75e644 ¤   Handle¤ h,
028a2d ¤   SInt8¤  flags )
c6c7a1 ¤   {
b14351 ¤   OSErr¤  err;
fd67c5 ¤
13ed2f ¤   AssertHandleIsValid( h, "DebugTraps_HSetState");
5d67c5 ¤
0b1864 ¤   HSetState( h, flags );
7d67c5 ¤
2912b8 ¤   err¤= LMGetMemErr();
15b5f5 ¤   if ( err == nilHandleErr && IsNull( *h ) )
085b34 ¤   ¤   {
0afa6e ¤   ¤   // normal to get this on purged Handle
cc0fe4 ¤   ¤   }
--40b8 0004bfe5f52401201fa Page 11 of MacDebugTraps.cp
060e24 ¤   else
505b34 ¤   ¤   {
f1a600 ¤   ¤   AssertNoErr( err, "DebugTraps_HSetState");
ae0fe4 ¤   ¤   }
979371 ¤   }
d6af5a
32af5a
2948f4 ¤   pascal OSErr
ac89f3 DebugTraps_HandAndHand(
2b123d ¤   Handle¤ hand1,
aa83e1 ¤   Handle¤ hand2)
c0c7a1 ¤   {
454351 ¤   OSErr¤  err;
6167c5 ¤
c9f767 ¤   AssertHandleIsValid( hand1, "DebugTraps_HandAndHand");
b29672 ¤   AssertHandleIsValid( hand2, "DebugTraps_HandAndHand");
b8bb93 ¤   pgpAssertMsg( ! HandleIsPurgeableAndNotLocked( hand1 ),
e3a3f2 ¤   ¤   "DebugTraps_HandAndHand: purgeable hand1");
2ca65f ¤   pgpAssertMsg( ! HandleIsPurgeableAndNotLocked( hand2 ),
82be3e ¤   ¤   "DebugTraps_HandAndHand: purgeable hand2");
0167c5 ¤
61e794 ¤   err¤= HandAndHand( hand1, hand2 );
1b43ff ¤   AssertMemErrIsNormal( "DebugTraps_HandAndHand" );
8267c5 ¤
d7deb7 ¤   return( err );
749371 ¤   }
3aaf5a
39af5a
b148f4 ¤   pascal OSErr
6b69af DebugTraps_HandToHand(
44dae4 ¤   Handle¤ ¤   *theHandlePtr,
f7a2d6 ¤   MDT_FileAndLineParams¤  )
8ac7a1 ¤   {
564351 ¤   OSErr¤  err;
0a8811 ¤   Handle¤ temp;
0667c5 ¤
ae9ff2 ¤   AssertHandleIsValid( *theHandlePtr, "DebugTraps_HandToHand");
9cbd1b ¤   pgpAssertMsg( ! HandleIsPurgeableAndNotLocked( *theHandlePtr ),
83ca0a ¤   ¤   "DebugTraps_HandToHand: attempt to duplicate purgeable Handle");
a67517 #if MEMORY_ALLOC_MUST_BE_APP
86f12b ¤   pgpAssertMsg( GetZone() == ApplicationZone(),
706829 ¤   ¤   "DebugTraps_HandToHand: MEMORY_ALLOC_MUST_BE_APP");
ac4175 #elif MEMORY_ALLOC_MUST_BE_SYS
ea905a ¤   pgpAssertMsg( GetZone() == SystemZone(),
2fd2e4 ¤   ¤   "DebugTraps_HandToHand: MEMORY_ALLOC_MUST_BE_SYS");
35372b #elif MEMORY_ALLOC_MUST_BE_APP_OR_SYS
ca79bf ¤   pgpAssertMsg( GetZone() == ApplicationZone() || GetZone() == SystemZone(),
46f123 ¤   ¤   "DebugTraps_HandToHand: MEMORY_ALLOC_MUST_BE_APP_OR_SYS");
627454 #endif
4567c5 ¤
fbe040 ¤   temp¤   = *theHandlePtr;
01a420 ¤   err¤= HandToHand( theHandlePtr );
a4e11b ¤   AssertMemErrIsNormal( "DebugTraps_HandToHand" );
a667c5 ¤
795ecc ¤   if ( IsntErr( err ) )
60c7a1 ¤   {
2abeac ¤   ¤   pgpAssertMsg( GetHandleSize( temp ) == GetHandleSize( *theHandlePtr ),
d05f96 ¤   ¤   ¤   "DebugTraps_HandToHand: different size");
d887c7 ¤   ¤   ¤
6d0e6a ¤   ¤   pgpAssertMsg( temp != *theHandlePtr,
c4a0f7 ¤   ¤   ¤   "DebugTraps_HandToHand: handle the same");
2f1b52 ¤   ¤
c71d58 ¤   ¤   MacLeaks_RememberHandle( *theHandlePtr,
d4a0ad ¤   ¤   ¤   kMacLeaks_HandToHandAllocType, srcFile_, srcLine_);
1c9371 ¤   }
0e67c5 ¤
e5deb7 ¤   return( err );
a19371 ¤   }
35af5a
f7af5a
6b6685 ¤   pascal void
4ba58a DebugTraps_HPurge(
--7dec 0000081c338401201fa Page 12 of MacDebugTraps.cp
0f0c62 ¤   Handle h )
97c7a1 ¤   {
194351 ¤   OSErr¤  err;
7067c5 ¤
12fa69 ¤   AssertHandleIsValid( h, "DebugTraps_HPurge");
6267c5 ¤
a609ae ¤   HPurge( h );
7667c5 ¤
e112b8 ¤   err¤= LMGetMemErr();
88b5f5 ¤   if ( err == nilHandleErr && IsNull( *h ) )
d25b34 ¤   ¤   {
cde9e2 ¤   ¤   // normal to get error on purged Handle
f50fe4 ¤   ¤   }
440e24 ¤   else
065b34 ¤   ¤   {
1b5f20 ¤   ¤   AssertNoErr( err, "DebugTraps_HPurge");
9c0fe4 ¤   ¤   }
7c9371 ¤   }
dfaf5a
81af5a
d06685 ¤   pascal void
e1a633 DebugTraps_EmptyHandle(
cb0764 ¤   Handle¤ h )
11c7a1 ¤   {
334351 ¤   OSErr¤  err;
40934e ¤   UInt32¤ hSize;
0267c5 ¤
1160dc ¤   AssertHandleIsValid( h, "DebugTraps_EmptyHandle");
3c67c5 ¤
acf9a3 ¤   hSize¤  = GetHandleSize( h );
ccdd1d ¤   if ( LMGetMemErr() == noErr )
cc5b34 ¤   ¤   {
fbc780 ¤   ¤   pgpAssertMsg( IsntNull( *h ),
394bd6 ¤   ¤   ¤   "DebugTraps_EmptyHandle: master pointer is nil");
3c3fef ¤   ¤   MacDebug_FillWithGarbage( *h, hSize );
800fe4 ¤   ¤   }
1e67c5 ¤
733ff0 ¤   EmptyHandle( h );
f412b8 ¤   err¤= LMGetMemErr();
a26feb ¤   AssertNoErr( err, "DebugTraps_EmptyHandle");
9f9371 ¤   }
2aaf5a
a1af5a
7b6685 ¤   pascal void
28e9de DebugTraps_HNoPurge(
9b0c62 ¤   Handle h )
dec7a1 ¤   {
e6f4b9 ¤   AssertHandleIsValid( h, "DebugTraps_HNoPurge");
fbccd4 ¤   pgpAssertMsg( ! HandleIsPurged( h ),
00660a ¤   ¤   "DebugTraps_HNoPurge: handle already purged");
2d67c5 ¤
a89bde ¤   HNoPurge( h );
fa44a7 ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_HNoPurge");
0a9371 ¤   }
aeaf5a
caaf5a
6ea7a5 ¤   pascal THz
26314e DebugTraps_HandleZone(
690c62 ¤   Handle h )
5fc7a1 ¤   {
41afc5 ¤   THz¤¤   zone;
e0054b ¤   AssertHandleIsValid( h, "DebugTraps_HandleZone");
b367c5 ¤
beebf8 ¤   zone¤   = HandleZone( h );
14bf41 ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_HandleZone");
63ccb4 ¤   pgpAssertMsg( IsntNull( zone ), "DebugTraps_HandleZone");
8f67c5 ¤
15edfa ¤   return( zone );
5b9371 ¤   }
f5af5a
dfaf5a
00ca72 ¤   pascal Handle
--6e2e 00089ad0ed5401201fa Page 13 of MacDebugTraps.cp
842606 DebugTraps_RecoverHandle( Ptr thePtr )
27c7a1 ¤   {
023edd ¤   Handle¤ h;
1167c5 ¤
24aec9 ¤   pgpAssertAddrValidMsg( thePtr, long, "DebugTraps_RecoverHandle");
9667c5 ¤
aec33f ¤   h¤  = RecoverHandle( thePtr );
6467c5 ¤
34d62a ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_RecoverHandle");
cd624e ¤   AssertHandleIsValid( h, "DebugTraps_RecoverHandle");
fc67c5 ¤
17c523 ¤   return( h );
b39371 ¤   }
c1af5a
fcaf5a
e5ca72 ¤   pascal Handle
201afa DebugTraps_RecoverHandleSys( Ptr thePtr )
a9c7a1 ¤   {
983edd ¤   Handle¤ h;
1467c5 ¤
8cfe6f ¤   pgpAssertAddrValidMsg( thePtr, long, "DebugTraps_RecoverHandleSys");
9b67c5 ¤
dafd23 ¤   h¤  = RecoverHandleSys( thePtr );
a367c5 ¤
bf26ae ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_RecoverHandleSys");
811d8c ¤   AssertHandleIsValid( h, "DebugTraps_RecoverHandleSys");
1467c5 ¤
32c523 ¤   return( h );
379371 ¤   }
2eaf5a
75af5a
3c6685 ¤   pascal void
9ac36c DebugTraps_SetZone( THz hz )
51c7a1 ¤   {
2c2301 ¤   pgpAssertAddrValidMsg( hz, long, "DebugTraps_SetZone");
4067c5 ¤
b57e9d ¤   SetZone( hz );
80b646 ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_SetZone");
f99371 ¤   }
2faf5a
c0af5a
19a7a5 ¤   pascal THz
177edc DebugTraps_GetZone()
73c7a1 ¤   {
9051a8 ¤   THz¤hz;
ed67c5 ¤
87874c ¤   hz¤ = GetZone();
909956 ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_GetZone");
7167c5 ¤
aee3f8 ¤   return( hz );
619371 ¤   }
f8af5a
4eaf5a
86ca72 ¤   pascal Handle
cb3881 DebugTraps_TempNewHandle(
8b33b5 ¤   Size¤   ¤   logicalSize,
652c1b ¤   OSErr¤  ¤   *resultCode,
32a2d6 ¤   MDT_FileAndLineParams¤  )
cec7a1 ¤   {
453edd ¤   Handle¤ h;
f467c5 ¤
e0c4ce ¤   AssertValidMemoryAllocationSize( logicalSize, "DebugTraps_TempNewHandle");
207517 #if MEMORY_ALLOC_MUST_BE_APP
f33eaa ¤   pgpDebugPStr( "\pDebugTraps_TempNewHandle: MEMORY_ALLOC_MUST_BE_APP");
4e4175 #elif MEMORY_ALLOC_MUST_BE_SYS
4b8467 ¤   pgpDebugPStr( "\pDebugTraps_TempNewHandle: MEMORY_ALLOC_MUST_BE_SYS");
6c372b #elif MEMORY_ALLOC_MUST_BE_APP_OR_SYS
b79f50 ¤   pgpDebugPStr( "\pDebugTraps_TempNewHandle: "
cfc6f2 ¤   "MEMORY_ALLOC_MUST_BE_APP_OR_SYS");
5f7454 #endif
5767c5 ¤
896cab ¤   pgpAssertAddrValidMsg( resultCode, OSErr, "DebugTraps_TempNewHandle");
--669c 000e3594703401201fa Page 14 of MacDebugTraps.cp
2a67c5 ¤
df68b1 ¤   h¤  = TempNewHandle( logicalSize, resultCode );
9daf5a
8652dd ¤   if ( ! MemErrIsNormal( *resultCode ) )
f85b34 ¤   ¤   {
94c8b3 ¤   ¤   AssertNoErr( *resultCode, "DebugTraps_TempNewHandle");
880fe4 ¤   ¤   }
4e67c5 ¤
5d951c ¤   if ( IsntNull( h ) && *resultCode == noErr )
115b34 ¤   ¤   {
398cc4 ¤   ¤   MacDebug_FillWithGarbage( *h, logicalSize );
4d1b52 ¤   ¤
184198 ¤   ¤   MacLeaks_RememberHandle( h,
541bcf ¤   ¤   ¤   kMacLeaks_TempNewHandleAllocType, srcFile_, srcLine_);
2b0fe4 ¤   ¤   }
c767c5 ¤
01c523 ¤   return( h );
db9371 ¤   }
e7af5a
49af5a
436685 ¤   pascal void
57c864 DebugTraps_TempDisposeHandle(
cce644 ¤   Handle¤ h,
02fec7 ¤   OSErr¤  *err )
76c7a1 ¤   {
0d684c ¤   AssertHandleIsValid( h , "DebugTraps_TempDisposeHandle");
4745ca ¤   pgpAssertAddrValid( err, OSErr );
3f67c5 ¤
982334 ¤   TempDisposeHandle( h, err );
47e012 ¤   AssertNoErr( *err, "DebugTraps_TempDisposeHandle");
6067c5 ¤
984761 ¤   MacLeaks_ForgetHandle( h, kMacLeaks_DisposeHandleDeallocType );
689371 ¤   }
0baf5a
2aaf5a
276685 ¤   pascal void
561e18 DebugTraps_MoveHHi(
f60c62 ¤   Handle h )
3fc7a1 ¤   {
7cb178 ¤   AssertHandleIsValid( h , "DebugTraps_MoveHHi");
ed67c5 ¤
ecfdfd ¤   MoveHHi( h );
ef67c5 ¤
9b3648 ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_MoveHHi");
ee9371 ¤   }
56af5a
f8af5a
5e48f4 ¤   pascal OSErr
ae3f05 DebugTraps_PtrAndHand(
1df761 ¤   const void¤ *ptr,
fdd373 ¤   Handle¤ ¤   hand,
480c00 ¤   long¤   ¤   size )
13c7a1 ¤   {
4f4351 ¤   OSErr¤  err;
ea67c5 ¤
89b0a5 ¤   AssertHandleIsValid( hand , "DebugTraps_PtrAndHand");
4b4d0d ¤   pgpAssertAddrValidMsg( ptr , VoidAlign, "DebugTraps_PtrAndHand");
937c04 ¤   AssertValidMemoryAllocationSize( size, "DebugTraps_PtrAndHand");
bd67c5 ¤
f16c45 ¤   err¤= PtrAndHand( ptr, hand, size );
9767c5 ¤
a22287 ¤   if ( ! MemErrIsNormal( err ) )
185b34 ¤   ¤   {
e59745 ¤   ¤   AssertNoErr( err, "DebugTraps_PtrAndHand");
9a0fe4 ¤   ¤   }
0967c5 ¤
74deb7 ¤   return( err );
2a9371 ¤   }
f9af5a
f9af5a
3aaf5a
e3af5a
--0db0 00026eb0d82401201fa Page 15 of MacDebugTraps.cp
e0af5a
9acd8b //____________________________Resource Manager _______________________________
a9af5a
6bf66a #if PRAGMA_MARK_SUPPORTED
eadacc #pragma mark -
5bc818 #pragma mark --- Resource Manager ---
e47454 #endif
cdaf5a
bbaf5a
ee6685 ¤   pascal void
cd4a15 DebugTraps_CloseResFile( short refNum )
39c7a1 ¤   {
0fcb41 ¤   AssertFileRefNumIsValid( refNum, "DebugTraps_CloseResFile");
2067c5 ¤
bd800f ¤   CloseResFile( refNum );
9e9371 ¤   }
feaf5a
b8af5a
fe6685 ¤   pascal void
f7a4d7 DebugTraps_UseResFile( short refNum )
35c7a1 ¤   {
f27646 ¤   AssertFileRefNumIsValid( refNum, "DebugTraps_UseResFile");
e867c5 ¤
f7c294 ¤   UseResFile( refNum );
cb9371 ¤   }
b667c5 ¤
4a67c5 ¤
6d2ac0 ¤   pascal short
46aa40 DebugTraps_HomeResFile(
547ca5 ¤   Handle¤ theResource )
32c7a1 ¤   {
6aeda3 ¤   AssertHandleIsValid( theResource , "DebugTraps_HomeResFile");
2067c5 ¤
e3ca28 ¤   short¤  refNum;
9767c5 ¤
9dba8f ¤   refNum¤ = HomeResFile( theResource );
08a258 ¤   return( refNum );
df9371 ¤   }
6867c5 ¤
6067c5 ¤
3a6685 ¤   pascal void
b53cfd DebugTraps_CreateResFile( ConstStr255Param fileName )
6ac7a1 ¤   {
7681a7 ¤   pgpAssertAddrValidMsg( fileName, uchar, "DebugTraps_CreateResFile");
f767c5 ¤
eb2a5a ¤   CreateResFile( fileName );
889371 ¤   }
2e67c5 ¤
9767c5 ¤
1e2ac0 ¤   pascal short
bfb1ac DebugTraps_OpenResFile( ConstStr255Param fileName )
e6c7a1 ¤   {
e79f0a ¤   pgpAssertAddrValidMsg( fileName, uchar, "DebugTraps_OpenResFile");
6d67c5 ¤
20d0a0 ¤   short refNum¤   = OpenResFile( fileName );
fa67c5 ¤
57a258 ¤   return( refNum );
ce9371 ¤   }
6d67c5 ¤
f167c5 ¤
7f6685 ¤   pascal void
36b192 DebugTraps_GetIndType(
d3e067 ¤   ResType *theType,
5fbb32 ¤   short¤  index )
08c7a1 ¤   {
ad1cd6 ¤   pgpAssertAddrValidMsg( theType, ResType, "DebugTraps_GetIndType");
7637cb ¤   pgpAssertMsg( index > 0, "DebugTraps_GetIndType: illegal index");
3e67c5 ¤
ae51b3 ¤   GetIndType( theType, index );
b59371 ¤   }
e567c5 ¤
2667c5 ¤
--6f47 000217a6feb401201fa Page 16 of MacDebugTraps.cp
406685 ¤   pascal void
ca1520 DebugTraps_Get1IndType(
53e067 ¤   ResType *theType,
a3bb32 ¤   short¤  index )
55c7a1 ¤   {
641cd6 ¤   pgpAssertAddrValidMsg( theType, ResType, "DebugTraps_GetIndType");
1137cb ¤   pgpAssertMsg( index > 0, "DebugTraps_GetIndType: illegal index");
4067c5 ¤
90f881 ¤   Get1IndType( theType, index );
5d9371 ¤   }
f467c5 ¤
6c67c5 ¤
09ca72 ¤   pascal Handle
7dcbd4 DebugTraps_GetIndResource(
bb92f5 ¤   ResType theType,
88bb32 ¤   short¤  index )
0fc7a1 ¤   {
70d345 ¤   pgpAssertMsg( index > 0, "DebugTraps_GetIndResource: illegal index");
d467c5 ¤
7c420a ¤   Handle¤ theResource¤= GetIndResource( theType, index );
406311 ¤   return( theResource );
4d9371 ¤   }
2967c5 ¤
8167c5 ¤
c1ca72 ¤   pascal Handle
5fff88 DebugTraps_Get1IndResource(
0692f5 ¤   ResType theType,
28bb32 ¤   short¤  index )
04c7a1 ¤   {
41dfbe ¤   pgpAssertMsg( index > 0, "DebugTraps_Get1IndResource: illegal index");
c067c5 ¤
1bcf10 ¤   Handle¤ theResource¤= Get1IndResource( theType, index );
ba6311 ¤   return( theResource );
429371 ¤   }
b767c5 ¤
68af5a
c4b177 #if 0
0bca72 ¤   pascal Handle
ea9c7d DebugTraps_GetResource(
34809f ¤   ResType¤theType,
d6ca16 ¤   short¤  theID )
63c7a1 ¤   {
f0f228 ¤   Handle¤ theResource¤= GetResource( theType, theID );
686311 ¤   return( theResource );
999371 ¤   }
817454 #endif
0767c5 ¤
1d67c5 ¤
bfca72 ¤   pascal Handle
e10a40 DebugTraps_Get1Resource(
777fb8 ¤   ResType¤¤   theType,
8aa519 ¤   short¤  ¤   theID )
31c7a1 ¤   {
9af752 ¤   Handle¤ theResource¤= Get1Resource( theType, theID );
136311 ¤   return( theResource );
579371 ¤   }
ed67c5 ¤
4d67c5 ¤
c5ca72 ¤   pascal Handle
5a09c1 DebugTraps_GetNamedResource(
e1659d ¤   ResType¤¤   ¤   ¤   theType,·
27d6f1 ¤   ConstStr255Param¤   name )
b2c7a1 ¤   {
e1e5d8 ¤   pgpAssertAddrValidMsg( name, uchar, "DebugTraps_GetNamedResource");
2667c5 ¤
c8ed7a ¤   Handle¤ theResource¤= GetNamedResource( theType, name );
3e6311 ¤   return( theResource );
d79371 ¤   }
f967c5 ¤
7a67c5 ¤
2bca72 ¤   pascal Handle
210431 DebugTraps_Get1NamedResource(
--5d76 000f61d4bbd401201fa Page 17 of MacDebugTraps.cp
39c562 ¤   ResType¤¤   ¤   ¤   theType,
dad6f1 ¤   ConstStr255Param¤   name )
cac7a1 ¤   {
144dcf ¤   pgpAssertAddrValidMsg( name, uchar, "DebugTraps_Get1NamedResource");
6667c5 ¤
13522c ¤   Handle¤ theResource¤= Get1NamedResource( theType, name );
7a6311 ¤   return( theResource );
149371 ¤   }
a067c5 ¤
bf67c5 ¤
776685 ¤   pascal void
fa6250 DebugTraps_LoadResource(
267ca5 ¤   Handle¤ theResource )
23c7a1 ¤   {
f49a2c ¤   AssertHandleIsValid( theResource, "DebugTraps_LoadResource");
7567c5 ¤
27f9d1 ¤   LoadResource( theResource );
c09371 ¤   }
e867c5 ¤
3c6685 ¤   pascal void
656083 DebugTraps_ReleaseResource(
117ca5 ¤   Handle¤ theResource )
33c7a1 ¤   {
3596f3 ¤   AssertHandleIsValid( theResource , "DebugTraps_ReleaseResource");
3367c5 ¤
6eb402 ¤   SInt8¤  hState¤ = HGetState( theResource );
fe85b4 ¤   pgpAssertMsg( HStateIsResource( hState ) || IsNull( *theResource ),
1fb58a ¤   ¤   "DebugTraps_ReleaseResource: not a resource");
ab67c5 ¤
eab097 ¤   ReleaseResource( theResource );
ba67c5 ¤
240e8a ¤   AssertNoErr( LMGetResErr(), "DebugTraps_ReleaseResource");
799371 ¤   }
34af5a
6067c5 ¤
c767c5 ¤
e56685 ¤   pascal void
cba10d DebugTraps_DetachResource(
66fc77 ¤   Handle ¤¤   ¤   theResource,
cca2d6 ¤   MDT_FileAndLineParams¤  )
f2c7a1 ¤   {
4cb637 ¤   AssertHandleIsValid( theResource, "DebugTraps_DetachResource");
2c310c ¤   pgpAssertMsg( ! HandleIsPurgeableAndNotLocked( theResource ),
f5960d ¤   ¤   "DebugTraps_DetachResource: "
321428 ¤   ¤   "detaching a purgeable, non-locked resource");
5267c5 ¤
88393d ¤   if ( IsntNull( theResource ) )
bd2ef1 ¤   {¤
8ac2da ¤   ¤   MacLeaks_RememberHandle( theResource,
b5eb62 ¤   ¤   ¤   kMacLeaks_DetachResourceAllocType, srcFile_, srcLine_);
3f9371 ¤   }
be67c5 ¤
280f52 ¤   DetachResource( theResource );
939371 ¤   }
0067c5 ¤
bf67c5 ¤
a567c5 ¤
872ac0 ¤   pascal short
54ca3a DebugTraps_GetResAttrs(
2b7ca5 ¤   Handle¤ theResource )
11c7a1 ¤   {
5f9dc7 ¤   AssertHandleIsValid( theResource, "DebugTraps_GetResAttrs");
f367c5 ¤
7b32d1 ¤   short¤  attrs¤  = GetResAttrs( theResource );
c6514a ¤   return( attrs );
4a9371 ¤   }
9767c5 ¤
3a67c5 ¤
f06685 ¤   pascal void
7c3ac4 DebugTraps_GetResInfo(
95f0b7 ¤   Handle¤ ¤   theResource,
f65170 ¤   short *¤¤   theID,
--b12d 00025d088f5401201fa Page 18 of MacDebugTraps.cp
3c574d ¤   ResType *¤  theType,
4ae315 ¤   Str255¤ ¤   name )
67c7a1 ¤   {
3793d3 ¤   AssertHandleIsValid( theResource, "DebugTraps_GetResInfo");
d95c29 ¤   pgpAssertAddrValidMsg( theID, short, "DebugTraps_GetResInfo");
89a12a ¤   pgpAssertAddrValidMsg( theType, ResType, "DebugTraps_GetResInfo");
dbd97e ¤   pgpAssertAddrValidMsg( name, uchar, "DebugTraps_GetResInfo");
3b67c5 ¤
457ef1 ¤   GetResInfo( theResource, theID, theType, name );
2c9371 ¤   }
8067c5 ¤
9667c5 ¤
126685 ¤   pascal void
c92a6a DebugTraps_SetResInfo(
f0a792 ¤   Handle¤ ¤   ¤   ¤   theResource,
9ba605 ¤   short¤  ¤   ¤   ¤   theID,
74d6f1 ¤   ConstStr255Param¤   name )
f9c7a1 ¤   {
e4b6bd ¤   AssertHandleIsValid( theResource, "DebugTraps_SetResInfo");
09d97e ¤   pgpAssertAddrValidMsg( name, uchar, "DebugTraps_GetResInfo");
f167c5 ¤
a199da ¤   SetResInfo( theResource, theID, name );
fe9371 ¤   }
3f67c5 ¤
df67c5 ¤
5c6685 ¤   pascal void
467583 DebugTraps_AddResource(
419c37 ¤   Handle¤ ¤   ¤   ¤   theData,
7ec562 ¤   ResType¤¤   ¤   ¤   theType,
f2a605 ¤   short¤  ¤   ¤   ¤   theID,
a5d6f1 ¤   ConstStr255Param¤   name )
8ac7a1 ¤   {
443196 ¤   AssertHandleIsValid( theData, "DebugTraps_AddResource");
7b4368 ¤   pgpAssertAddrValidMsg( name, uchar, "DebugTraps_AddResource");
f467c5 ¤
258ae2 ¤   AddResource( theData, theType, theID, name );
708d46 ¤   if ( LMGetResErr() == noErr )
4f5b34 ¤   ¤   {
b1dadd ¤   ¤   #if USE_MAC_DEBUG_LEAKS
3cafe2 ¤   ¤   if ( MacLeaks_ItemIsRemembered( theData ) )
a8f776 ¤   ¤   ¤   {
69d25e ¤   ¤   ¤   MacLeaks_ForgetHandle( theData,
714c7c ¤   ¤   ¤   ¤   kMacLeaks_DisposeHandleDeallocType);
d1a3a6 ¤   ¤   ¤   }
afd656 ¤   ¤   #endif
fc0fe4 ¤   ¤   }
e89371 ¤   }
2567c5 ¤
b767c5 ¤
943800 ¤   pascal long
c4ec6a DebugTraps_GetResourceSizeOnDisk(
eb7ca5 ¤   Handle¤ theResource )
fac7a1 ¤   {
a20aa4 ¤   AssertHandleIsValid( theResource, "DebugTraps_GetResourceSizeOnDisk");
7567c5 ¤
e0c985 ¤   long¤   resSize¤= GetResourceSizeOnDisk( theResource );
59c66c ¤   return( resSize );
349371 ¤   }
e667c5 ¤
7a67c5 ¤
bd3800 ¤   pascal long
cd7cd5 DebugTraps_GetMaxResourceSize(
5f7ca5 ¤   Handle¤ theResource )
dac7a1 ¤   {
8e8dbd ¤   AssertHandleIsValid( theResource, "DebugTraps_GetMaxResourceSize");
c867c5 ¤
2203eb ¤   long¤   resSize¤= GetMaxResourceSize( theResource );
59c66c ¤   return( resSize );
039371 ¤   }
4767c5 ¤
c867c5 ¤
253800 ¤   pascal long
--fb39 0006d6e3a9e401201fa Page 19 of MacDebugTraps.cp
a4ed1b DebugTraps_RsrcMapEntry(
d77ca5 ¤   Handle¤ theResource )
ecc7a1 ¤   {
8e441d ¤   AssertHandleIsValid( theResource, "DebugTraps_RsrcMapEntry");
e167c5 ¤
c92098 ¤   long¤   offset¤ = RsrcMapEntry( theResource );
cf0c0e ¤   return( offset );
ce9371 ¤   }
7067c5 ¤
3b67c5 ¤
c76685 ¤   pascal void
5c865e DebugTraps_SetResAttrs(
09e0bc ¤   Handle¤ theResource,
27cc29 ¤   short¤  attrs )
2dc7a1 ¤   {
c6179a ¤   AssertHandleIsValid( theResource, "DebugTraps_SetResAttrs");
a967c5 ¤
33799f ¤   SetResAttrs( theResource, attrs );
0b9371 ¤   }
f567c5 ¤
bb67c5 ¤
b06685 ¤   pascal void
97890d DebugTraps_ChangedResource(
5f7ca5 ¤   Handle¤ theResource )
2dc7a1 ¤   {
badc8c ¤   AssertHandleIsValid( theResource, "DebugTraps_ChangedResource");
d667c5 ¤
4597fa ¤   ChangedResource( theResource );
b49371 ¤   }
3e67c5 ¤
9567c5 ¤
ac6685 ¤   pascal void
6f699b DebugTraps_RemoveResource(
107ca5 ¤   Handle¤ theResource )
ddc7a1 ¤   {
b8b1fe ¤   AssertHandleIsValid( theResource, "DebugTraps_RemoveResource");
6667c5 ¤
b800fc ¤   RemoveResource( theResource );
359371 ¤   }
9a67c5 ¤
f667c5 ¤
5f6685 ¤   pascal void
d405a4 DebugTraps_UpdateResFile( short refNum )
e6c7a1 ¤   {
9c0341 ¤   AssertFileRefNumIsValid( refNum, "DebugTraps_UpdateResFile");
eb67c5 ¤
bf206b ¤   UpdateResFile( refNum );
529371 ¤   }
2a67c5 ¤
8967c5 ¤
af6685 ¤   pascal void
fdb5f3 DebugTraps_WriteResource(
f37ca5 ¤   Handle¤ theResource )
c8c7a1 ¤   {
73f35b ¤   AssertHandleIsValid( theResource, "DebugTraps_WriteResource");
3767c5 ¤
5a51cd ¤   WriteResource( theResource );
209371 ¤   }
5067c5 ¤
2967c5 ¤
d72ac0 ¤   pascal short
c85db8 DebugTraps_GetResFileAttrs( short refNum )
76c7a1 ¤   {
0af033 ¤   AssertFileRefNumIsValid( refNum, "DebugTraps_GetResFileAttrs");
b767c5 ¤
f58f86 ¤   short¤  attrs¤  = GetResFileAttrs( refNum );
7d514a ¤   return( attrs );
109371 ¤   }
c467c5 ¤
0f67c5 ¤
f46685 ¤   pascal void
6dcb66 DebugTraps_SetResFileAttrs(
--227f 000cf67bfa2401201fa Page 20 of MacDebugTraps.cp
7112b1 ¤   short¤  refNum,
2ecc29 ¤   short¤  attrs )
09c7a1 ¤   {
71d13c ¤   AssertFileRefNumIsValid( refNum, "DebugTraps_SetResFileAttrs");
1b67c5 ¤
5d2c07 ¤   SetResFileAttrs( refNum, attrs );
6b9371 ¤   }
c367c5 ¤
6567c5 ¤
2c2ac0 ¤   pascal short
f68feb DebugTraps_OpenRFPerm(
b7b8b2 ¤   ConstStr255Param¤   fileName,
a09a90 ¤   short¤  ¤   ¤   ¤   vRefNum,
aead53 ¤   SInt8¤  ¤   ¤   ¤   permission )
3bc7a1 ¤   {
e58718 ¤   pgpAssertAddrValidMsg( fileName, uchar, "DebugTraps_OpenRFPerm");
4b67c5 ¤
0e7b53 ¤   short¤  refNum¤ = OpenRFPerm( fileName, vRefNum, permission );
0267c5 ¤
95a258 ¤   return( refNum );
939371 ¤   }
a167c5 ¤
f267c5 ¤
6e67c5 ¤
e72ac0 ¤   pascal short
336f2a DebugTraps_HOpenResFile(
bd9a90 ¤   short¤  ¤   ¤   ¤   vRefNum,
e7b491 ¤   long¤   ¤   ¤   ¤   dirID,
3fb8b2 ¤   ConstStr255Param¤   fileName,
05ad53 ¤   SInt8¤  ¤   ¤   ¤   permission )
99c7a1 ¤   {
f4ba8f ¤   pgpAssertAddrValidMsg( fileName, uchar, "DebugTraps_HOpenResFile");
7067c5 ¤
890129 ¤   short¤  refNum¤ = HOpenResFile( vRefNum, dirID, fileName, permission );
94a258 ¤   return( refNum );
5d9371 ¤   }
0067c5 ¤
8167c5 ¤
186685 ¤   pascal void
9c3678 DebugTraps_HCreateResFile(
159a90 ¤   short¤  ¤   ¤   ¤   vRefNum,
56b491 ¤   long¤   ¤   ¤   ¤   dirID,
839583 ¤   ConstStr255Param¤   fileName )
c7c7a1 ¤   {
c6057c ¤   pgpAssertAddrValidMsg( fileName, uchar, "DebugTraps_HCreateResFile");
2167c5 ¤
4fa8b4 ¤   HCreateResFile( vRefNum, dirID, fileName );
7d9371 ¤   }
2767c5 ¤
a367c5 ¤
3c2ac0 ¤   pascal short
193f54 DebugTraps_FSpOpenResFile(
8dfbb6 ¤   const FSSpec *¤ spec,
68cf79 ¤   SignedByte¤ ¤   permission )
7bc7a1 ¤   {
b8b678 ¤   AssertSpecIsValid( spec, "DebugTraps_FSpOpenResFile");
1b67c5 ¤
e28e6c ¤   short¤  refNum¤ = FSpOpenResFile( spec, permission );
e0a258 ¤   return( refNum );
c99371 ¤   }
1f67c5 ¤
6d67c5 ¤
2b6685 ¤   pascal void
0b0e29 DebugTraps_FSpCreateResFile(
66fbb6 ¤   const FSSpec *¤ spec,
b27d53 ¤   OSType¤ ¤   ¤   creator,
711551 ¤   OSType ¤¤   ¤   fileType,
e74da6 ¤   ScriptCode¤ ¤   scriptTag )
f4c7a1 ¤   {
b8fe10 ¤   AssertSpecIsValid( spec, "DebugTraps_FSpCreateResFile");
8767c5 ¤
cf21e7 ¤   FSpCreateResFile( spec, creator, fileType, scriptTag );
--940c 0002c3c6933401201fa Page 21 of MacDebugTraps.cp
a19371 ¤   }
9967c5 ¤
0c67c5 ¤
ab6685 ¤   pascal void
822226 DebugTraps_ReadPartialResource(
6ce0bc ¤   Handle¤ theResource,
61ead0 ¤   long ¤  offset,
9c5bc6 ¤   void *¤ buffer,
5030aa ¤   long¤   count )
b2c7a1 ¤   {
608d29 ¤   AssertHandleIsValid( theResource, "DebugTraps_ReadPartialResource");
31fcd8 ¤   pgpAssertAddrValidMsg( buffer, VoidAlign,
6142ae ¤   ¤   "DebugTraps_ReadPartialResource");
573903 ¤   pgpAssertMsg( count > 0, "DebugTraps_ReadPartialResource: count <= 0");
9b35c5 ¤   pgpAssertMsg( offset >= 0, "DebugTraps_ReadPartialResource: offset < 0");
6867c5 ¤
309061 ¤   ReadPartialResource( theResource, offset, buffer, count );
f59371 ¤   }
0c67c5 ¤
ca67c5 ¤
bd6685 ¤   pascal void
d12445 DebugTraps_WritePartialResource(
2db537 ¤   Handle¤ ¤   ¤   theResource,
3a736d ¤   long ¤  ¤   ¤   offset,
876e92 ¤   const void *¤   buffer,
bfc355 ¤   long¤   ¤   ¤   count )
a1c7a1 ¤   {
675f38 ¤   AssertHandleIsValid( theResource, "DebugTraps_WritePartialResource");
b9fcd8 ¤   pgpAssertAddrValidMsg( buffer, VoidAlign,
5baf40 ¤   ¤   "DebugTraps_WritePartialResource");
cdfaf5 ¤   pgpAssertMsg( count > 0, "DebugTraps_WritePartialResource: count <= 0");
f9147e ¤   pgpAssertMsg( offset >= 0, "DebugTraps_WritePartialResource: offset < 0");
af67c5 ¤
1fb802 ¤   WritePartialResource( theResource, offset, buffer, count );
f59371 ¤   }
bf67c5 ¤
f367c5 ¤
ba6685 ¤   pascal void
b51924 DebugTraps_SetResourceSize(
02e0bc ¤   Handle¤ theResource,
6565d2 ¤   long¤   newSize )
43c7a1 ¤   {
a9bc2e ¤   AssertHandleIsValid( theResource, "DebugTraps_SetResourceSize");
1e9948 ¤   pgpAssertMsg( newSize >= 0, "DebugTraps_SetResourceSize: newSize < 0");
0d67c5 ¤
fbec8a ¤   SetResourceSize( theResource, newSize );
db9371 ¤   }
c967c5 ¤
e067c5 ¤
bbca72 ¤   pascal Handle
17f420 DebugTraps_GetNextFOND( Handle¤ fondHandle )
00c7a1 ¤   {
3c7976 ¤   AssertHandleIsValid( fondHandle, "DebugTraps_GetNextFOND");
0a67c5 ¤
fa73a5 ¤   Handle¤ nextFOND¤   = GetNextFOND( fondHandle );
f77c56 ¤   return( nextFOND );
9e9371 ¤   }
25af5a
d2af5a
21af5a
f9f66a #if PRAGMA_MARK_SUPPORTED
12dacc #pragma mark -
07c1b5 #pragma mark --- Quickdraw ---
9c7454 #endif
e2af5a
5daf5a
4eaf5a
83c645 ¤   pascal RgnHandle
9f1a4c DebugTraps_NewRgn( MDT_FileAndLineParams¤   )
ebc7a1 ¤   {
2202c2 ¤   RgnHandle¤  theRgn¤ = NewRgn();
2c67c5 ¤
--aa37 0009bcf02e1401201fa Page 22 of MacDebugTraps.cp
1b8dc8 ¤   if ( IsntNull( theRgn ) )
202ef1 ¤   {¤
26437d ¤   ¤   MacLeaks_RememberHandle( (Handle )theRgn,
9f67aa ¤   ¤   ¤   kMacLeaks_NewRgnAllocType, srcFile_, srcLine_);
309371 ¤   }
9667c5 ¤
ed9ef1 ¤   return( theRgn );
7e9371 ¤   }
4aaf5a
6eaf5a
9b6685 ¤   pascal void
68f57e DebugTraps_DisposeRgn( RgnHandle¤   theRgn )
29c7a1 ¤   {
be0b89 ¤   AssertHandleIsValid( theRgn, "Debug_TrapsDisposeRgn" );
0667c5 ¤
5fd15c ¤   MacLeaks_ForgetHandle( (Handle)theRgn,
8cfd6a ¤   ¤   kMacLeaks_DisposeRgnDeallocType );
001b52 ¤   ¤
2647f9 ¤   DisposeRgn( theRgn );
f29371 ¤   }
56af5a
5caf5a
98f66a #if PRAGMA_MARK_SUPPORTED
1edacc #pragma mark -
6daa79 #pragma mark --- Menu Mgr ---
1b7454 #endif
eeaf5a
229653 ¤   pascal MenuRef
9e2d3b DebugTraps_NewMenu(
709042 ¤   short¤  ¤   ¤   ¤   menuID,
0bee5f ¤   ConstStr255Param¤   menuTitle,
8ca2d6 ¤   MDT_FileAndLineParams¤  )
e0c7a1 ¤   {
24211a ¤   MenuHandle¤ theMenu¤= nil;
e48209 ¤   pgpAssertAddrValidMsg( menuTitle, uchar, "DebugTraps_NewMenu");
be67c5 ¤
8b16f4 ¤   theMenu¤= NewMenu( menuID, menuTitle );
7ee374 ¤   DebugMsgIf( IsNull( theMenu ), "DebugTraps_NewMenu: NewMenu failed");
5067c5 ¤
a9eee4 ¤   if ( IsntNull( theMenu ) )
022ef1 ¤   {¤
5206d4 ¤   ¤   MacLeaks_RememberHandle( (Handle )theMenu,
77d866 ¤   ¤   ¤   kMacLeaks_NewMenuAllocType, srcFile_, srcLine_);
b49371 ¤   }
5767c5 ¤
85a1b1 ¤   return( theMenu );
2f9371 ¤   }
adaf5a
8b6685 ¤   pascal void
ddf723 DebugTraps_DisposeMenu(MenuHandle h)
fdbb36 {
4e175d ¤   AssertHandleIsValid( h, "DebugTraps_DisposeMenu");
fb67c5 ¤
15934e ¤   UInt32¤ hSize;
7cd6fa ¤   SInt8¤  hState;
bb67c5 ¤
3a4761 ¤   MacLeaks_ForgetHandle( h, kMacLeaks_DisposeHandleDeallocType );
1467c5 ¤
4eac89 ¤   hState¤ = HGetState( (Handle) h );
90c20c ¤   pgpAssertMsg( ! HStateIsResource( hState ),
319067 ¤   ¤   "DebugTraps_DisposeMenu: this Handle is a resource. "
e76f7d ¤   ¤   "Use ReleaseResource");
f267c5 ¤
bb37f6 ¤   // fill the handle with junk prior to disposing it
7780c0 ¤   hSize¤  = GetHandleSize( (Handle) h );
23e900 ¤   if ( MemError() == noErr )
31c7a1 ¤   {
5a0dda ¤   ¤   if ( ! DebugPatches_DisposeTrapsPatched() )
f35b34 ¤   ¤   {
ebe75d ¤   ¤   ¤   MacDebug_FillWithGarbage( *h, hSize );
f90fe4 ¤   ¤   }
9b9371 ¤   }
--0b7a 000fb666802401201fa Page 23 of MacDebugTraps.cp
2a67c5 ¤
7ad40c ¤   DisposeMenu( h );
31b8bd ¤   AssertNoErr( LMGetMemErr(), "DebugTraps_DisposeMenu");
82efe6 }
7caf5a
02af5a
60ca72 ¤   pascal Handle
531d78 DebugTraps_GetMenuBar( MDT_FileAndLineParams¤   )
92c7a1 ¤   {
b7a332 ¤   Handle¤ theMenuBar¤ = nil;
ce67c5 ¤
dc27af ¤   theMenuBar¤ = GetMenuBar( );
fe805b ¤   DebugMsgIf( IsNull( theMenuBar ), "DebugTraps_GetMenuBar: failed");
3c67c5 ¤
d6334a ¤   if ( IsntNull( theMenuBar ) )
032ef1 ¤   {¤
0bcbb9 ¤   ¤   MacLeaks_RememberHandle( (Handle)theMenuBar,
8fce96 ¤   ¤   ¤   kMacLeaks_GetMenuBarAllocType, srcFile_, srcLine_);
449371 ¤   }
f267c5 ¤
7e77c0 ¤   return( theMenuBar );
af9371 ¤   }
6067c5 ¤
f767c5 ¤
e967c5 ¤
2caf5a
6bca72 ¤   pascal Handle
e6c0cf DebugTraps_GetNewMBar(
8c66d6 ¤   short¤  ¤   ¤   menuBarID,
82a2d6 ¤   MDT_FileAndLineParams¤  )
8bc7a1 ¤   {
03a332 ¤   Handle¤ theMenuBar¤ = nil;
9e67c5 ¤
0b2f7f ¤   theMenuBar¤ = GetNewMBar( menuBarID );
2d1f4a ¤   DebugMsgIf( IsNull( theMenuBar ), "DebugTraps_GetNewMBar: failed");
c667c5 ¤
9e334a ¤   if ( IsntNull( theMenuBar ) )
f82ef1 ¤   {¤
8531ed ¤   ¤   MacLeaks_RememberHandle( (Handle )theMenuBar,
f252cf ¤   ¤   ¤   kMacLeaks_GetNewMBarAllocType, srcFile_, srcLine_);
3f9371 ¤   }
f667c5 ¤
da77c0 ¤   return( theMenuBar );
659371 ¤   }
feaf5a
89af5a
71af5a
64af5a
78f66a #if PRAGMA_MARK_SUPPORTED
18dacc #pragma mark -
7fdfa4 #pragma mark --- Icons ---
387454 #endif
a4af5a
9e48f4 ¤   pascal OSErr
87a9ee DebugTraps_NewIconSuite(
85869d ¤   Handle *¤   ¤   theIconSuite,
81a2d6 ¤   MDT_FileAndLineParams¤  )
e8c7a1 ¤   {
ff8e70 ¤   OSErr¤  err¤= noErr;
d767c5 ¤
918841 ¤   err¤= NewIconSuite( theIconSuite );
2fedbf ¤   DebugMsgIf( IsNull( *theIconSuite ), "DebugTraps_NewIconSuite: failed");
4f67c5 ¤
0d77f0 ¤   if ( IsntNull( *theIconSuite ) )
1c2ef1 ¤   {¤
25c8f4 ¤   ¤   MacLeaks_RememberHandle( (Handle )*theIconSuite,
d5c759 ¤   ¤   ¤   kMacLeaks_NewIconSuiteAllocType,
33edc2 ¤   ¤   ¤   srcFile_, srcLine_);
819371 ¤   }
5f67c5 ¤
32deb7 ¤   return( err );
fb9371 ¤   }
--8fd1 00000e0b6ce401201fa Page 24 of MacDebugTraps.cp
e0af5a
1aaf5a
0a48f4 ¤   pascal OSErr
c4bf89 DebugTraps_GetIconSuite(
358bd7 ¤   Handle *¤   ¤   ¤   theIconSuite,
003ff5 ¤   SInt16¤ ¤   ¤   ¤   theResID,
a3504a ¤   IconSelectorValue¤  selector,
452cd1 ¤   MDT_FileAndLineParams)
31c7a1 ¤   {
438e70 ¤   OSErr¤  err¤= noErr;
c567c5 ¤
9a39e0 ¤   err¤= GetIconSuite( theIconSuite, theResID, selector );
2bd94b ¤   AssertNoErr( err, "DebugTraps_GetIconSuite" );
bf67c5 ¤
3e5ecc ¤   if ( IsntErr( err ) )
be2ef1 ¤   {¤
efc8f4 ¤   ¤   MacLeaks_RememberHandle( (Handle )*theIconSuite,
a5dafc ¤   ¤   ¤   kMacLeaks_GetIconSuiteAllocType, srcFile_, srcLine_);
6f9371 ¤   }
4367c5 ¤
51deb7 ¤   return( err );
869371 ¤   }
2daf5a
69af5a
8448f4 ¤   pascal OSErr
3bf549 DebugTraps_DisposeIconSuite(
757af9 ¤   Handle theIconSuite, Boolean disposeData )
11c7a1 ¤   {
b88e70 ¤   OSErr¤  err¤= noErr;
9f67c5 ¤
1f1e05 ¤   AssertHandleIsValid( theIconSuite, "DebugTraps_DisposeIconSuite" );
0a67c5 ¤
f3b84d ¤   MacLeaks_ForgetHandle( theIconSuite,
6a4571 ¤   ¤   kMacLeaks_DisposeIconSuiteDeallocType );
8f67c5 ¤
6f0c94 ¤   err¤= DisposeIconSuite( theIconSuite, disposeData );
d6e860 ¤   AssertNoErr( err, "DebugTraps_DisposeIconSuite" );
0f67c5 ¤
26deb7 ¤   return( err );
a99371 ¤   }
66af5a
e2af5a
6eaf5a
46f66a #if PRAGMA_MARK_SUPPORTED
1adacc #pragma mark -
72bcd8 #pragma mark --- Alias Mgr ---
387454 #endif
c6af5a
87af5a
61af5a
4c48f4 ¤   pascal OSErr
948f99 DebugTraps_NewAlias(
59a31b ¤   ConstFSSpecPtr¤ fromFile,
3db85f ¤   const FSSpec *¤ target,
6e0666 ¤   AliasHandle *¤  alias,
49a2d6 ¤   MDT_FileAndLineParams¤  )
b0c7a1 ¤   {
b35c98 #if PGP_DEBUG
209b72 ¤   if ( IsntNull( fromFile ) )
9e5b34 ¤   ¤   {
9e692c ¤   ¤   AssertSpecIsValid( fromFile, "DebugTraps_NewAlias");
970fe4 ¤   ¤   }
dd02fc ¤   AssertSpecIsValid( target, "DebugTraps_NewAlias");
09025a ¤   pgpAssertAddrValidMsg( alias, AliasHandle, "DebugTraps_NewAlias");
7a7454 #endif
cfaf5a
b78e70 ¤   OSErr¤  err¤= noErr;
4467c5 ¤
bc9198 ¤   err¤= NewAlias( fromFile, target, alias );
77d500 ¤   AssertNoErr( err, "DebugTraps_NewAlias");
e467c5 ¤
006a2a ¤   if ( IsntNull( *alias ) )
--0128 000d745479b401201fa Page 25 of MacDebugTraps.cp
a72ef1 ¤   {¤
165563 ¤   ¤   MacLeaks_RememberHandle( (Handle)*alias,
3e371a ¤   ¤   ¤   kMacLeaks_NewAliasAllocType,
d5edc2 ¤   ¤   ¤   srcFile_, srcLine_);
719371 ¤   }
a167c5 ¤
a3deb7 ¤   return( err );
fe9371 ¤   }
7967c5 ¤
6867c5 ¤
9248f4 ¤   pascal OSErr
6f4aec DebugTraps_NewAliasMinimal(
f2b85f ¤   const FSSpec *¤ target,
b00666 ¤   AliasHandle *¤  alias,
d3a2d6 ¤   MDT_FileAndLineParams¤  )
8ec7a1 ¤   {
557598 ¤   AssertSpecIsValid( target, "DebugTraps_NewAliasMinimal");
01c8cb ¤   pgpAssertAddrValidMsg( alias, AliasHandle, "DebugTraps_NewAliasMinimal");
4967c5 ¤
138e70 ¤   OSErr¤  err¤= noErr;
0567c5 ¤
7ae4fe ¤   err¤= NewAliasMinimal( target, alias );
f60a41 ¤   AssertNoErr( err, "DebugTraps_NewAliasMinimal");
a467c5 ¤
7e6a2a ¤   if ( IsntNull( *alias ) )
ad2ef1 ¤   {¤
0a5563 ¤   ¤   MacLeaks_RememberHandle( (Handle)*alias,
7b8d92 ¤   ¤   ¤   kMacLeaks_NewAliasMinimalAllocType,
7cedc2 ¤   ¤   ¤   srcFile_, srcLine_);
2c9371 ¤   }
4f67c5 ¤
eedeb7 ¤   return( err );
8d9371 ¤   }
ae67c5 ¤
9967c5 ¤
5b48f4 ¤   pascal OSErr
d656cf DebugTraps_NewAliasMinimalFromFullPath(
565ba5 ¤   short ¤ ¤   ¤   fullPathLength,
e500a4 ¤   const void *¤   fullPath,
7fd126 ¤   ConstStr32Param zoneName,
a57f11 ¤   ConstStr31Param serverName,
1f0666 ¤   AliasHandle *¤  alias,
35a2d6 ¤   MDT_FileAndLineParams¤  )
35c7a1 ¤   {
3a5e68 ¤   pgpa((
736527 ¤   ¤   pgpaAssert( fullPathLength >= 1 ),
20ac84 ¤   ¤   pgpaAddrValid( fullPath, VoidAlign ),
cde86f ¤   ¤   pgpaAddrValid( alias, AliasHandle ),
311a3d ¤   ¤   pgpaMsg(( pgpaFmtPrefix, "DebugTraps_NewAliasMinimalFromFullPath")) ) );
e967c5 ¤
a1d4f8 ¤   AssertAddrNullOrValid( zoneName, uchar,
f1b58f ¤   ¤   "DebugTraps_NewAliasMinimalFromFullPath");
30d5c3 ¤   AssertAddrNullOrValid( serverName, uchar,
19b58f ¤   ¤   "DebugTraps_NewAliasMinimalFromFullPath");
4267c5 ¤
6f8e70 ¤   OSErr¤  err¤= noErr;
5867c5 ¤
33d409 ¤   err¤= NewAliasMinimalFromFullPath( fullPathLength, fullPath, zoneName,
a066e4 ¤   ¤   ¤   serverName, alias );
2a0a41 ¤   AssertNoErr( err, "DebugTraps_NewAliasMinimal");
3d67c5 ¤
e86a2a ¤   if ( IsntNull( *alias ) )
4e2ef1 ¤   {¤
505563 ¤   ¤   MacLeaks_RememberHandle( (Handle)*alias,
02846e ¤   ¤   ¤   kMacLeaks_NewAliasMinimalFromFullPathAllocType,
a9edc2 ¤   ¤   ¤   srcFile_, srcLine_);
269371 ¤   }
3a67c5 ¤
7edeb7 ¤   return( err );
e59371 ¤   }
2767c5 ¤
d767c5 ¤
--f6d2 0004c968c45401201fa Page 26 of MacDebugTraps.cp
4bdacc #pragma mark -
dfaf5a
2aaf5a
abaf5a
2d2b61 // __________________________ Apple Event Related ____________________________
42af5a
77f66a #if PRAGMA_MARK_SUPPORTED
3adacc #pragma mark -
069cbd #pragma mark --- Apple Event related ---
997454 #endif
d2af5a
60af5a
74af5a
f848f4 ¤   pascal OSErr
d29c7a DebugTraps_AECreateDesc(
454c63 ¤   DescType¤   typeCode,
56bc69 ¤   const void *dataPtr,
4ad22b ¤   Size¤   ¤   dataSize,
ceac02 ¤   AEDesc *¤   result,
2ca2d6 ¤   MDT_FileAndLineParams¤  )
99c7a1 ¤   {
844351 ¤   OSErr¤  err;
1c67c5 ¤
205947 ¤   err¤= AECreateDesc( typeCode, dataPtr, dataSize, result );
cf67c5 ¤
315ecc ¤   if ( IsntErr( err ) )
dd5b34 ¤   ¤   {
86ef12 ¤   ¤   MacLeaks_RememberAEDesc( result,
9cc28a ¤   ¤   ¤   kMacLeaks_AECreateDescAllocType, srcFile_, srcLine_);
790fe4 ¤   ¤   }
c767c5 ¤
4edeb7 ¤   return( err );
3f9371 ¤   }
d067c5 ¤
eb1b52 ¤   ¤
9a48f4 ¤   pascal OSErr
b38be3 DebugTraps_AECoercePtr(
52fa76 ¤   DescType¤   ¤   typeCode,
e732b1 ¤   const void *¤   dataPtr,
f94860 ¤   Size¤   ¤   ¤   dataSize,
1f3443 ¤   DescType¤   ¤   toType,
e6a9f7 ¤   AEDesc *¤   ¤   result,
9efd37 ¤   MDT_FileAndLineParams )
7cc7a1 ¤   {
224351 ¤   OSErr¤  err;
9467c5 ¤
98151e ¤   err¤= AECoercePtr( typeCode, dataPtr, dataSize, toType, result );
2567c5 ¤
cd5ecc ¤   if ( IsntErr( err ) )
b65b34 ¤   ¤   {
b2ef12 ¤   ¤   MacLeaks_RememberAEDesc( result,
95bb3c ¤   ¤   ¤   kMacLeaks_AECoercePtrAllocType, srcFile_, srcLine_);
390fe4 ¤   ¤   }
9567c5 ¤
b8deb7 ¤   return( err );
699371 ¤   }
4faf5a
911b52 ¤   ¤
3f48f4 ¤   pascal OSErr
49b4b4 DebugTraps_AECoerceDesc(
d4507a ¤   const AEDesc *¤ ¤   theAEDesc,
150fd7 ¤   DescType¤   ¤   ¤   toType,
328936 ¤   AEDesc *¤   ¤   ¤   result,
7fa2d6 ¤   MDT_FileAndLineParams¤  )
31c7a1 ¤   {
bf4351 ¤   OSErr¤  err;
2367c5 ¤
cf2e9f ¤   err¤= AECoerceDesc( theAEDesc, toType, result );
2967c5 ¤
f25ecc ¤   if ( IsntErr( err ) )
1e5b34 ¤   ¤   {
4cef12 ¤   ¤   MacLeaks_RememberAEDesc( result,
--2114 0009614e044401201fa Page 27 of MacDebugTraps.cp
c3a5c1 ¤   ¤   ¤   kMacLeaks_AECoerceDescAllocType, srcFile_, srcLine_);
4b0fe4 ¤   ¤   }
9a67c5 ¤
95deb7 ¤   return( err );
b29371 ¤   }
2667c5 ¤
be2b85 ¤   ¤   ¤   ¤
a948f4 ¤   pascal OSErr
874ce3 DebugTraps_AEDisposeDesc( AEDesc *¤ ¤   theAEDesc )
fcc7a1 ¤   {
034351 ¤   OSErr¤  err;
1567c5 ¤
6d781b ¤   MacLeaks_ForgetAEDesc( theAEDesc, kMacLeaks_DisposeAEDescDeallocType);
6d1b52 ¤   ¤
f1e20b ¤   err¤= AEDisposeDesc( theAEDesc );
9b5079 ¤   AssertNoErr( err, "DebugTraps_AEDisposeDesc" );
0e67c5 ¤
92deb7 ¤   return( err );
259371 ¤   }
3567c5 ¤
da67c5 ¤
ca48f4 ¤   pascal OSErr
6eb343 DebugTraps_AEDuplicateDesc(
d656ce ¤   const AEDesc *¤ theAEDesc,
15a9f7 ¤   AEDesc *¤   ¤   result,
5ba2d6 ¤   MDT_FileAndLineParams¤  )
54c7a1 ¤   {
8d4351 ¤   OSErr¤  err;
ee67c5 ¤
2e10c5 ¤   err¤= AEDuplicateDesc( theAEDesc, result );
4967c5 ¤
de5ecc ¤   if ( IsntErr( err ) )
6c5b34 ¤   ¤   {
64ef12 ¤   ¤   MacLeaks_RememberAEDesc( result,
4b7ca6 ¤   ¤   ¤   kMacLeaks_AEDuplicateDescAllocType, srcFile_, srcLine_);
600fe4 ¤   ¤   }
7e67c5 ¤
36deb7 ¤   return( err );
f29371 ¤   }
5d67c5 ¤
85af5a
5248f4 ¤   pascal OSErr
adc382 DebugTraps_AECreateList(
40b4d0 ¤   const void *¤   factoringPtr,
8e1674 ¤   Size¤   ¤   ¤   factoredSize,
da9bde ¤   Boolean¤¤   ¤   isRecord,
7fc052 ¤   AEDescList *¤   resultList,
08a2d6 ¤   MDT_FileAndLineParams¤  )
d2c7a1 ¤   {
014351 ¤   OSErr¤  err;
7767c5 ¤
89152e ¤   err¤= AECreateList( factoringPtr, factoredSize, isRecord, resultList );
9667c5 ¤
925ecc ¤   if ( IsntErr( err ) )
085b34 ¤   ¤   {
ea3b87 ¤   ¤   MacLeaks_RememberAEDesc( resultList,
8b3ac7 ¤   ¤   ¤   kMacLeaks_AECreateListAllocType, srcFile_, srcLine_);
3a0fe4 ¤   ¤   }
3e67c5 ¤
28deb7 ¤   return( err );
459371 ¤   }
6c67c5 ¤
5baf5a
8548f4 ¤   pascal OSErr
86f984 DebugTraps_AEGetNthDesc(
72f433 ¤   const AEDescList *¤ theAEDescList,
1232bd ¤   long¤   ¤   ¤   ¤   index,
8c4393 ¤   DescType¤   ¤   ¤   desiredType,
a021d6 ¤   AEKeyword *¤¤   ¤   theAEKeyword,
7a8936 ¤   AEDesc *¤   ¤   ¤   result,
1ea2d6 ¤   MDT_FileAndLineParams¤  )
96c7a1 ¤   {
--7e6f 000c5f85d9e401201fa Page 28 of MacDebugTraps.cp
124351 ¤   OSErr¤  err;
fd67c5 ¤
209ab6 ¤   err¤= AEGetNthDesc( theAEDescList,
4af53e ¤   ¤   index, desiredType, theAEKeyword, result );
4167c5 ¤
bd5ecc ¤   if ( IsntErr( err ) )
d75b34 ¤   ¤   {
5fef12 ¤   ¤   MacLeaks_RememberAEDesc( result,
cac741 ¤   ¤   ¤   kMacLeaks_AEGetNthDescAllocType, srcFile_, srcLine_);
b70fe4 ¤   ¤   }
2b67c5 ¤
0adeb7 ¤   return( err );
889371 ¤   }
4a67c5 ¤
6faf5a
5d48f4 ¤   pascal OSErr
1f9fd9 DebugTraps_AEGetAttributeDesc(
c3dee0 ¤   const AppleEvent *¤ theAppleEvent,
ec86b2 ¤   AEKeyword¤  ¤   ¤   theAEKeyword,
29da30 ¤   DescType ¤  ¤   ¤   desiredType,
2f8936 ¤   AEDesc *¤   ¤   ¤   result,
58a2d6 ¤   MDT_FileAndLineParams¤  )
b5c7a1 ¤   {
4d4351 ¤   OSErr¤  err;
5967c5 ¤
480331 ¤   err¤= AEGetAttributeDesc( theAppleEvent,
11d67d ¤   ¤   ¤   ¤   theAEKeyword, desiredType, result );
c967c5 ¤
0d5ecc ¤   if ( IsntErr( err ) )
135b34 ¤   ¤   {
8eef12 ¤   ¤   MacLeaks_RememberAEDesc( result,
6a4b1d ¤   ¤   ¤   kMacLeaks_AEGetAttributeDescAllocType, srcFile_, srcLine_);
490fe4 ¤   ¤   }
1d67c5 ¤
badeb7 ¤   return( err );
519371 ¤   }
3967c5 ¤
fcaf5a
1148f4 ¤   pascal OSErr
2e70bd DebugTraps_AECreateAppleEvent(
0371f3 ¤   AEEventClass¤   ¤   ¤   theAEEventClass,
d16dc9 ¤   AEEventID¤  ¤   ¤   ¤   theAEEventID,
0160f1 ¤   const AEAddressDesc *¤  target,
9b9d9f ¤   short¤  ¤   ¤   ¤   ¤   returnID,
24ab72 ¤   long¤   ¤   ¤   ¤   ¤   transactionID,
ba34d9 ¤   AppleEvent *¤   ¤   ¤   result,
a4a2d6 ¤   MDT_FileAndLineParams¤  )
2cc7a1 ¤   {
7757b0 ¤   AssertAEDescIsValid( target, "DebugTraps_AECreateAppleEvent");
8a67c5 ¤
d14351 ¤   OSErr¤  err;
1167c5 ¤
a37a92 ¤   err¤= AECreateAppleEvent( theAEEventClass,
2f7589 ¤   ¤   ¤   theAEEventID, target, returnID, transactionID, result );
5567c5 ¤
a85ecc ¤   if ( IsntErr( err ) )
565b34 ¤   ¤   {
d8ef12 ¤   ¤   MacLeaks_RememberAEDesc( result,
d28bb8 ¤   ¤   ¤   kMacLeaks_AECreateAppleEventAllocType, srcFile_, srcLine_);
9f0fe4 ¤   ¤   }
141b52 ¤   ¤
07deb7 ¤   return( err );
e29371 ¤   }
1b67c5 ¤
57af5a
cb48f4 ¤   pascal OSErr
25f65a DebugTraps_AESend(
abdee0 ¤   const AppleEvent *¤ theAppleEvent,
59a636 ¤   AppleEvent *¤   ¤   reply,
0f8bef ¤   AESendMode¤ ¤   ¤   sendMode,
3c1096 ¤   AESendPriority¤ ¤   sendPriority,
c5710b ¤   long¤   ¤   ¤   ¤   timeOutInTicks,
--7beb 00074a2e77d401201fa Page 29 of MacDebugTraps.cp
00c965 ¤   AEIdleUPP¤  ¤   ¤   idleProc,
a0f463 ¤   AEFilterUPP¤¤   ¤   filterProc )
31c7a1 ¤   {
ffc248 ¤   AssertAEDescIsValid( theAppleEvent, "DebugTraps_AESend");
1e67c5 ¤
204351 ¤   OSErr¤  err;
bc67c5 ¤
d46fc9 ¤   err¤= AESend( theAppleEvent, reply, sendMode,
5cff2b ¤   ¤   ¤   sendPriority, timeOutInTicks, idleProc, filterProc );
cb67c5 ¤
c6deb7 ¤   return( err );
c99371 ¤   }
1caf5a
65af5a
5b48f4 ¤   pascal OSErr
b32f34 DebugTraps_AEGetTheCurrentEvent(
d43fd1 ¤   AppleEvent *¤   theAppleEvent,
9da2d6 ¤   MDT_FileAndLineParams¤  )
c4c7a1 ¤   {
d44351 ¤   OSErr¤  err;
6367c5 ¤
2e13ae ¤   err¤= AEGetTheCurrentEvent( theAppleEvent );
9967c5 ¤
1a5ecc ¤   if ( IsntErr( err ) )
1a5b34 ¤   ¤   {
58a08c ¤   ¤   MacLeaks_RememberAEDesc( theAppleEvent,
7e1819 ¤   ¤   ¤   kMacLeaks_AEGetTheCurrentEventAllocType, srcFile_, srcLine_);
390fe4 ¤   ¤   }
3967c5 ¤
7fdeb7 ¤   return( err );
4a9371 ¤   }
71af5a
aaaf5a
7e48f4 ¤   pascal OSErr
7b7c05 DebugTraps_AEResolve(
020b23 ¤   const AEDesc *¤ objectSpecifier,
e85192 ¤   short¤  ¤   ¤   callbackFlags,
3f28a4 ¤   AEDesc *¤   ¤   theToken,
6ea2d6 ¤   MDT_FileAndLineParams¤  )
a3c7a1 ¤   {
74f91d ¤   AssertAEDescIsValid( objectSpecifier, "DebugTraps_AEResolve");
b2072c ¤   AssertAEDescIsValid( theToken, "DebugTraps_AEResolve");
0167c5 ¤
7d4351 ¤   OSErr¤  err;
2067c5 ¤
25dfe1 ¤   err¤= AEResolve( objectSpecifier, callbackFlags, theToken );
8967c5 ¤
cb5ecc ¤   if ( IsntErr( err ) )
e95b34 ¤   ¤   {
d698b7 ¤   ¤   MacLeaks_RememberAEDesc( theToken,
9597a1 ¤   ¤   ¤   kMacLeaks_AEResolveAllocType, srcFile_, srcLine_);
f20fe4 ¤   ¤   }
1d67c5 ¤
90deb7 ¤   return( err );
149371 ¤   }
fc67c5 ¤
5faf5a
db48f4 ¤   pascal OSErr
e44693 DebugTraps_CreateOffsetDescriptor(
69053a ¤   long¤   ¤   theOffset,
e07bf9 ¤   AEDesc *¤   theDescriptor,
fea2d6 ¤   MDT_FileAndLineParams¤  )
b5c7a1 ¤   {
c993fe ¤   AssertAEDescIsValid( theDescriptor, "DebugTraps_CreateOffsetDescriptor");
3b67c5 ¤
9a4351 ¤   OSErr¤  err;
2767c5 ¤
aceb01 ¤   err¤= CreateOffsetDescriptor( theOffset, theDescriptor );
8967c5 ¤
d95ecc ¤   if ( IsntErr( err ) )
a95b34 ¤   ¤   {
747b69 ¤   ¤   MacLeaks_RememberAEDesc( theDescriptor,·
--d212 000d5899baf401201fa Page 30 of MacDebugTraps.cp
6d55c0 ¤   ¤   ¤   kMacLeaks_CreateOffsetDescriptorAllocType, srcFile_, srcLine_);
d00fe4 ¤   ¤   }
d367c5 ¤
70deb7 ¤   return( err );
329371 ¤   }
e71b52 ¤   ¤
d5ae30 ¤   ¤   ¤   ¤   ¤
fa48f4 ¤   pascal OSErr
d25a86 DebugTraps_CreateCompDescriptor( DescType comparisonOperator,
19c3d2 ¤   AEDesc *¤   operand1,
782cb6 ¤   AEDesc *¤   operand2,
30be7c ¤   Boolean ¤   disposeInputs,
517bf9 ¤   AEDesc *¤   theDescriptor,
aaa2d6 ¤   MDT_FileAndLineParams¤  )
c6c7a1 ¤   {
e24be4 ¤   AssertAEDescIsValid( operand1, "DebugTraps_CreateCompDescriptor");
4694d6 ¤   AssertAEDescIsValid( operand2, "DebugTraps_CreateCompDescriptor");
b3b037 ¤   AssertAEDescIsValid( theDescriptor, "DebugTraps_CreateCompDescriptor");
7467c5 ¤
754351 ¤   OSErr¤  err;
e367c5 ¤
1033ca ¤   err¤= CreateCompDescriptor( comparisonOperator,
b03fd6 ¤   ¤   ¤   operand1, operand2, disposeInputs, theDescriptor );
0f67c5 ¤
945ecc ¤   if ( IsntErr( err ) )
215b34 ¤   ¤   {
dec09c ¤   ¤   MacLeaks_RememberAEDesc( theDescriptor,
b0d5ff ¤   ¤   ¤   kMacLeaks_CreateCompDescriptorAllocType, srcFile_, srcLine_);
4b0fe4 ¤   ¤   }
c067c5 ¤
f9deb7 ¤   return( err );
dc9371 ¤   }
7d1b52 ¤   ¤
35ae30 ¤   ¤   ¤   ¤   ¤
6f48f4 ¤   pascal OSErr
913483 DebugTraps_CreateLogicalDescriptor(
bd4ef0 ¤   AEDescList *¤   theLogicalTerms,
202aed ¤   DescType¤   ¤   theLogicOperator,
ccdea8 ¤   Boolean¤¤   ¤   disposeInputs,
e5088c ¤   AEDesc *¤   ¤   theDescriptor,
b6a2d6 ¤   MDT_FileAndLineParams¤  )
c8c7a1 ¤   {
6cc225 ¤   AssertAEDescIsValid( theDescriptor, "DebugTraps_CreateLogicalDescriptor");
6967c5 ¤
424351 ¤   OSErr¤  err;
b267c5 ¤
b94003 ¤   err¤= CreateLogicalDescriptor( theLogicalTerms,
c6dc0c ¤   ¤   ¤   theLogicOperator, disposeInputs, theDescriptor );
a567c5 ¤
765ecc ¤   if ( IsntErr( err ) )
985b34 ¤   ¤   {
75c09c ¤   ¤   MacLeaks_RememberAEDesc( theDescriptor,
e08ee6 ¤   ¤   ¤   kMacLeaks_CreateLogicalDescriptorAllocType, srcFile_, srcLine_);
4d0fe4 ¤   ¤   }
0067c5 ¤
22deb7 ¤   return( err );
cf9371 ¤   }
ef1b52 ¤   ¤
54ae30 ¤   ¤   ¤   ¤   ¤
1048f4 ¤   pascal OSErr
8896cf DebugTraps_CreateObjSpecifier( DescType desiredClass,
05fa3f ¤   AEDesc *¤   theContainer,
d5c0fd ¤   DescType¤   keyForm,
0d9975 ¤   AEDesc *¤   keyData,
d116bb ¤   Boolean¤¤   disposeInputs,
b55d3a ¤   AEDesc *¤   objSpecifier,
60a2d6 ¤   MDT_FileAndLineParams¤  )
e2c7a1 ¤   {
7899f0 ¤   AssertAEDescIsValid( theContainer, "DebugTraps_CreateObjSpecifier");
d983ff ¤   AssertAEDescIsValid( keyData, "DebugTraps_CreateObjSpecifier");
b93929 ¤   AssertAEDescIsValid( objSpecifier, "DebugTraps_CreateObjSpecifier");
d567c5 ¤
--6c00 00007b2b0a5401201fa Page 31 of MacDebugTraps.cp
124351 ¤   OSErr¤  err;
fd67c5 ¤
fb7d5b ¤   err¤= CreateObjSpecifier( desiredClass,
c3764b ¤   ¤   ¤   theContainer, keyForm, keyData, disposeInputs, objSpecifier );
b867c5 ¤
495ecc ¤   if ( IsntErr( err ) )
f15b34 ¤   ¤   {
a7c364 ¤   ¤   MacLeaks_RememberAEDesc( objSpecifier,
ac1fa5 ¤   ¤   ¤   kMacLeaks_CreateObjSpecifierAllocType, srcFile_, srcLine_);
cb0fe4 ¤   ¤   }
0167c5 ¤
16f65d ¤   if ( disposeInputs )
005b34 ¤   ¤   {
a6a10b ¤   ¤   // forget the inputs MacLeaks_ForgetAEDesc(...)
9e0fe4 ¤   ¤   }
dc67c5 ¤
7cdeb7 ¤   return( err );
d89371 ¤   }
4aaf5a
79af5a
5848f4 ¤   pascal OSErr
62e30a DebugTraps_CreateRangeDescriptor(
e0a444 ¤   AEDesc *¤   rangeStart,
650442 ¤   AEDesc *¤   rangeStop,
8716bb ¤   Boolean¤¤   disposeInputs,
927bf9 ¤   AEDesc *¤   theDescriptor,
89a2d6 ¤   MDT_FileAndLineParams¤  )
7dc7a1 ¤   {
c309b4 ¤   AssertAEDescIsValid( rangeStart, "DebugTraps_CreateRangeDescriptor");
1efd80 ¤   AssertAEDescIsValid( rangeStop, "DebugTraps_CreateRangeDescriptor");
a0f98c ¤   AssertAEDescIsValid( theDescriptor, "DebugTraps_CreateRangeDescriptor");
b467c5 ¤
3c4351 ¤   OSErr¤  err;
5667c5 ¤
3b6f3d ¤   err¤= CreateRangeDescriptor( rangeStart,
7b2c24 ¤   ¤   ¤   rangeStop, disposeInputs, theDescriptor );
7267c5 ¤
305ecc ¤   if ( IsntErr( err ) )
cb5b34 ¤   ¤   {
02c09c ¤   ¤   MacLeaks_RememberAEDesc( theDescriptor,
c10306 ¤   ¤   ¤   kMacLeaks_CreateRangeDescriptorAllocType, srcFile_, srcLine_);
380fe4 ¤   ¤   }
9967c5 ¤
11deb7 ¤   return( err );
249371 ¤   }
3167c5 ¤
a767c5 ¤
7d67c5 ¤
bf6a33 // _____________________________ Window Mgr _________________________________
7eaf5a
9cf66a #if PRAGMA_MARK_SUPPORTED
52dacc #pragma mark -
03bdc6 #pragma mark --- Window Mgr ---
b77454 #endif
75af5a
5faf5a
a33eaa ¤   pascal WindowRef
c7290d DebugTraps_GetNewWindow(
abd267 ¤   short¤  ¤   ¤   windowID,
4ed146 ¤   void *¤ ¤   ¤   wStorage,
7d90c5 ¤   WindowRef¤  ¤   behind,
cfa2d6 ¤   MDT_FileAndLineParams¤  )
a5c7a1 ¤   {
e086c6 ¤   AssertAddrNullOrValid( wStorage, VoidAlign, "DebugTraps_GetNewWindow" );
d567c5 ¤
53d940 ¤   WindowRef¤  theRef;
b367c5 ¤
ec3c90 ¤   theRef¤ = GetNewWindow( windowID, wStorage, behind );
3d153d ¤   pgpAssertMsg( IsntNull( theRef ), "DebugTraps_GetNewWindow: failure");
0d67c5 ¤
be9b2b ¤   if ( IsntNull( theRef ) )
075b34 ¤   ¤   {
--4b41 0007cc39a7f401201fa Page 32 of MacDebugTraps.cp
7462b9 ¤   ¤   if ( IsNull( wStorage ) )
e81e98 ¤   ¤   ¤   MacLeaks_RememberPtr( theRef,
398bea ¤   ¤   ¤   ¤   kMacLeaks_GetNewWindowAllocType, 0, srcFile_, srcLine_);
710e1d ¤   ¤   else
e81e98 ¤   ¤   ¤   MacLeaks_RememberPtr( theRef,
b4b09c ¤   ¤   ¤   ¤   kMacLeaks_GetNewWindowStorageAllocType, 0, srcFile_, srcLine_);
030fe4 ¤   ¤   }
6c67c5 ¤
79cc87 ¤   return( theRef );
cf9371 ¤   }
2daf5a
24af5a
9e3eaa ¤   pascal WindowRef
3ea740 DebugTraps_NewWindow(
a97384 ¤   void *¤ ¤   ¤   ¤   wStorage,
ccfd74 ¤   const Rect *¤   ¤   boundsRect,
7af603 ¤   ConstStr255Param¤   title,
f255f7 ¤   Boolean¤¤   ¤   ¤   visible,
b0b9ee ¤   short¤  ¤   ¤   ¤   theProc,
4c76ab ¤   WindowRef¤  ¤   ¤   behind,
c8b899 ¤   Boolean¤¤   ¤   ¤   goAwayFlag,
464862 ¤   long¤   ¤   ¤   ¤   refCon,
dca2d6 ¤   MDT_FileAndLineParams¤  )
4ac7a1 ¤   {
de96ab ¤   AssertAddrNullOrValid( wStorage, VoidAlign, "DebugTraps_NewWindow" );
67b80b ¤   AssertAddrNullOrValid( title, uchar, "DebugTraps_NewWindow" );
fcc512 ¤   pgpAssertAddrValid( boundsRect, Rect );
0967c5 ¤
c2d940 ¤   WindowRef¤  theRef;
c667c5 ¤
efd1b9 ¤   theRef¤ = NewWindow( wStorage, boundsRect,
602068 ¤   ¤   ¤   title,visible, theProc, behind, goAwayFlag, refCon );
22f57b ¤   pgpAssertMsg( IsntNull( theRef ), "DebugTraps_NewWindow: failure");
bbaf5a
bf9b2b ¤   if ( IsntNull( theRef ) )
cc5b34 ¤   ¤   {
3a62b9 ¤   ¤   if ( IsNull( wStorage ) )
8a1e98 ¤   ¤   ¤   MacLeaks_RememberPtr( theRef,
c5c1aa ¤   ¤   ¤   ¤   kMacLeaks_NewWindowAllocType, 0, srcFile_, srcLine_);
c20e1d ¤   ¤   else
1e1e98 ¤   ¤   ¤   MacLeaks_RememberPtr( theRef,
c85c45 ¤   ¤   ¤   ¤   kMacLeaks_NewWindowStorageAllocType, 0, srcFile_, srcLine_);
8e0fe4 ¤   ¤   }
0867c5 ¤
97cc87 ¤   return( theRef );
4d9371 ¤   }
cdaf5a
34af5a
dc67c5 ¤
51af5a
873eaa ¤   pascal WindowRef
553f46 DebugTraps_GetNewCWindow(
f824a1 ¤   short¤  ¤   windowID,
68630b ¤   void *¤ ¤   wStorage,
5bba10 ¤   WindowRef¤  behind,
2ba2d6 ¤   MDT_FileAndLineParams¤  )
7ac7a1 ¤   {
ba0e8c ¤   AssertAddrNullOrValid( wStorage, VoidAlign, "DebugTraps_GetNewCWindow" );
2567c5 ¤
e1d940 ¤   WindowRef¤  theRef;
2167c5 ¤
883034 ¤   theRef¤ = GetNewCWindow( windowID, wStorage, behind );
f6e596 ¤   pgpAssertMsg( IsntNull( theRef ), "DebugTraps_GetNewCWindow: failure");
9faf5a
e29b2b ¤   if ( IsntNull( theRef ) )
ee5b34 ¤   ¤   {
3962b9 ¤   ¤   if ( IsNull( wStorage ) )
b91e98 ¤   ¤   ¤   MacLeaks_RememberPtr( theRef,
7e2248 ¤   ¤   ¤   ¤   kMacLeaks_GetNewCWindowAllocType, 0, srcFile_, srcLine_);
420e1d ¤   ¤   else
e01e98 ¤   ¤   ¤   MacLeaks_RememberPtr( theRef,
7c95d8 ¤   ¤   ¤   kMacLeaks_GetNewCWindowStorageAllocType, 0, srcFile_, srcLine_);
--c109 00080cf768f401201fa Page 33 of MacDebugTraps.cp
b50fe4 ¤   ¤   }
3b1b52 ¤   ¤
27cc87 ¤   return( theRef );
fb9371 ¤   }
bcaf5a
edaf5a
be67c5 ¤
6daf5a
483eaa ¤   pascal WindowRef
4fa629 DebugTraps_NewCWindow(
ce7384 ¤   void *¤ ¤   ¤   ¤   wStorage,
f7fd74 ¤   const Rect *¤   ¤   boundsRect,
f9f603 ¤   ConstStr255Param¤   title,
e855f7 ¤   Boolean¤¤   ¤   ¤   visible,
0d88c5 ¤   short¤  ¤   ¤   ¤   procID,
a676ab ¤   WindowRef¤  ¤   ¤   behind,
e9b899 ¤   Boolean¤¤   ¤   ¤   goAwayFlag,
890a2f ¤   long ¤  ¤   ¤   ¤   refCon,
b1a2d6 ¤   MDT_FileAndLineParams¤  )
77c7a1 ¤   {
b6b67f ¤   AssertAddrNullOrValid( wStorage, VoidAlign, "DebugTraps_NewCWindow" );
0e806b ¤   AssertAddrNullOrValid( title, VoidAlign, "DebugTraps_NewCWindow" );
b467c5 ¤
6cd940 ¤   WindowRef¤  theRef;
1767c5 ¤
2ec7a7 ¤   theRef¤ = NewCWindow( wStorage, boundsRect,
9fa8b8 ¤   ¤   title,visible, procID, behind, goAwayFlag, refCon );
78c244 ¤   pgpAssertMsg( IsntNull( theRef ), "DebugTraps_NewCWindow: failure");
ec67c5 ¤
d69b2b ¤   if ( IsntNull( theRef ) )
6f5b34 ¤   ¤   {
fe62b9 ¤   ¤   if ( IsNull( wStorage ) )
851e98 ¤   ¤   ¤   MacLeaks_RememberPtr( theRef,
626006 ¤   ¤   ¤   ¤   kMacLeaks_NewCWindowAllocType, 0, srcFile_, srcLine_);
170e1d ¤   ¤   else
0e1e98 ¤   ¤   ¤   MacLeaks_RememberPtr( theRef,
b08ca8 ¤   ¤   ¤   ¤   kMacLeaks_NewCWindowStorageAllocType, 0, srcFile_, srcLine_);
570fe4 ¤   ¤   }
6e67c5 ¤
06cc87 ¤   return( theRef );
329371 ¤   }
3faf5a
edaf5a
4f6685 ¤   pascal void
a5eef2 DebugTraps_DisposeWindow(WindowRef theWindow)
81c7a1 ¤   {
1c3bf7 ¤   pgpAssertAddrValidMsg( theWindow, WindowRecord, "DebugTraps_DisposeWindow");
8f67c5 ¤
a131ed ¤   MacLeaks_ForgetPtr( theWindow, kMacLeaks_DisposeWindowDeallocType );
8667c5 ¤
95ab37 ¤   DisposeWindow( theWindow );
b19371 ¤   }
e467c5 ¤
2067c5 ¤
1d6685 ¤   pascal void
f63d8f DebugTraps_CloseWindow(WindowRef theWindow)
7fc7a1 ¤   {
053bf7 ¤   pgpAssertAddrValidMsg( theWindow, WindowRecord, "DebugTraps_DisposeWindow");
8767c5 ¤
29b881 ¤   MacLeaks_ForgetPtr( theWindow, kMacLeaks_CloseWindowDeallocType );
f267c5 ¤
e7e2f1 ¤   CloseWindow( theWindow );
2a9371 ¤   }
dbaf5a
33af5a
52f436 // _____________________________ Dialog Mgr _________________________________
e3af5a
c5f66a #if PRAGMA_MARK_SUPPORTED
eddacc #pragma mark -
f72ac9 #pragma mark --- Dialog Mgr ---
aa7454 #endif
80af5a
--dcce 000e5ed8a99401201fa Page 34 of MacDebugTraps.cp
e0af5a
34438f ¤   pascal DialogRef
5694d4 DebugTraps_NewDialog(
5a7384 ¤   void *¤ ¤   ¤   ¤   wStorage,
dffd74 ¤   const Rect *¤   ¤   boundsRect,
7cf603 ¤   ConstStr255Param¤   title,
de55f7 ¤   Boolean¤¤   ¤   ¤   visible,
1788c5 ¤   short¤  ¤   ¤   ¤   procID,
3d76ab ¤   WindowRef¤  ¤   ¤   behind,
97b899 ¤   Boolean¤¤   ¤   ¤   goAwayFlag,
814862 ¤   long¤   ¤   ¤   ¤   refCon,
153537 ¤   Handle¤ ¤   ¤   ¤   itmLstHndl,
faa2d6 ¤   MDT_FileAndLineParams¤  )
82c7a1 ¤   {
1ce079 ¤   AssertAddrNullOrValid( wStorage, VoidAlign, "DebugTraps_NewDialog" );
11ced9 ¤   AssertAddrNullOrValid( title, uchar, "DebugTraps_NewDialog" );
df67c5 ¤
080a52 ¤   DialogRef¤  theRef;
0b67c5 ¤
779216 ¤   theRef¤ = NewDialog( wStorage, boundsRect, title,
3926de ¤   ¤   ¤   ¤   visible, procID, behind, goAwayFlag, refCon, itmLstHndl );
0c42fe ¤   pgpAssertMsg( IsntNull( theRef ), "DebugTraps_NewDialog: failure");
6867c5 ¤
b39b2b ¤   if ( IsntNull( theRef ) )
4c5b34 ¤   ¤   {
fc174b ¤   ¤   if ( IsNull( wStorage ) ·)
621e98 ¤   ¤   ¤   MacLeaks_RememberPtr( theRef,
319ead ¤   ¤   ¤   ¤   kMacLeaks_NewDialogAllocType, 0, srcFile_, srcLine_);
700e1d ¤   ¤   else
ad1e98 ¤   ¤   ¤   MacLeaks_RememberPtr( theRef,
43e6b5 ¤   ¤   ¤   ¤   kMacLeaks_NewDialogStorageAllocType, 0, srcFile_, srcLine_);
200fe4 ¤   ¤   }
c267c5 ¤
accc87 ¤   return( theRef );
929371 ¤   }
c967c5 ¤
d967c5 ¤
3e94aa ¤   ¤   ¤   ¤   ¤   ¤
e2438f ¤   pascal DialogRef
8e1a99 DebugTraps_GetNewDialog(
f1b59e ¤   short ¤ ¤   ¤   dialogID,
e1777d ¤   void *¤ ¤   ¤   dStorage,
4390c5 ¤   WindowRef¤  ¤   behind,
5aa2d6 ¤   MDT_FileAndLineParams¤  )
bac7a1 ¤   {
3074b9 ¤   AssertAddrNullOrValid( dStorage, uchar, "DebugTraps_GetNewDialog" );
7367c5 ¤
380a52 ¤   DialogRef¤  theRef;
a667c5 ¤
271ad1 ¤   theRef¤ = GetNewDialog( dialogID, dStorage, behind );
90a2b8 ¤   pgpAssertMsg( IsntNull( theRef ), "DebugTraps_GetNewDialog: failure");
3367c5 ¤
a89b2b ¤   if ( IsntNull( theRef ) )
975b34 ¤   ¤   {
1142a2 ¤   ¤   if ( IsNull( dStorage ) ·)
991e98 ¤   ¤   ¤   MacLeaks_RememberPtr( theRef,
d4d4ed ¤   ¤   ¤   ¤   kMacLeaks_GetNewDialogAllocType, 0, srcFile_, srcLine_);
f80e1d ¤   ¤   else
691e98 ¤   ¤   ¤   MacLeaks_RememberPtr( theRef,
420a6c ¤   ¤   ¤   ¤   kMacLeaks_GetNewDialogStorageAllocType, 0, srcFile_, srcLine_);
3b0fe4 ¤   ¤   }
3e67c5 ¤
a2cc87 ¤   return( theRef );
059371 ¤   }
8567c5 ¤
4367c5 ¤
b7af5a
deaf5a
4f6685 ¤   pascal void
3e77c7 DebugTraps_ModalDialog(
3a0c33 ¤   ModalFilterUPP¤ modalFilter,
e5c205 ¤   short *¤¤   ¤   itemHit)
--a6fe 000578794f8401201fa Page 35 of MacDebugTraps.cp
f7c7a1 ¤   {
56d480 ¤   AssertUPPIsNullOrValid( modalFilter, "DebugTraps_ModalDialog" );
a54d9f ¤   pgpAssertAddrValid( itemHit, short );
d367c5 ¤
049098 ¤   ModalDialog( modalFilter, itemHit );
1a9371 ¤   }
5faf5a
28af5a
d9af5a
27af5a
48af5a
616685 ¤   pascal void
90443d DebugTraps_DisposeDialog( DialogRef theDialog)
fac7a1 ¤   {
9b5053 ¤   pgpAssertAddrValidMsg( theDialog, DialogRecord,
0ad66b ¤   ¤   "DebugTraps_DisposeDialog");
bb67c5 ¤
0f559e ¤   MacLeaks_ForgetPtr( theDialog, kMacLeaks_DisposeDialogDeallocType );
841b52 ¤   ¤
dfd612 ¤   DisposeWindow( theDialog );
f99371 ¤   }
b967c5 ¤
8967c5 ¤
5e6685 ¤   pascal void
2bec8c DebugTraps_CloseDialog( DialogRef theDialog)
3bc7a1 ¤   {
deea82 ¤   pgpAssertAddrValidMsg( theDialog, DialogRecord, "DebugTraps_DisposeDialog");
9c67c5 ¤
d457fb ¤   MacLeaks_ForgetPtr( theDialog, kMacLeaks_CloseDialogDeallocType );
d51b52 ¤   ¤
88d612 ¤   DisposeWindow( theDialog );
679371 ¤   }
edaf5a
58af5a
0e2ac0 ¤   pascal short
2e1d08 DebugTraps_Alert(
632b7e ¤   short¤  ¤   ¤   alertID,
a7728b ¤   ModalFilterUPP¤ modalFilter)
9ec7a1 ¤   {
6f6904 ¤   AssertUPPIsNullOrValid( modalFilter, "DebugTraps_Alert" );
3e946f ¤   pgpAssert( IsntNull( GetResource( 'ALRT', alertID ) ) );
9667c5 ¤
3902d4 ¤   short itemHit¤  = Alert( alertID, modalFilter );
7e80d4 ¤   return( itemHit );
bc9371 ¤   }
edaf5a
0eaf5a
92af5a
312ac0 ¤   pascal short
fe2c89 DebugTraps_StopAlert(
0e2b7e ¤   short¤  ¤   ¤   alertID,
80728b ¤   ModalFilterUPP¤ modalFilter)
86c7a1 ¤   {
c7d589 ¤   AssertUPPIsNullOrValid( modalFilter, "DebugTraps_StopAlert" );
3c946f ¤   pgpAssert( IsntNull( GetResource( 'ALRT', alertID ) ) );
0267c5 ¤
ab1281 ¤   short itemHit¤  = StopAlert( alertID, modalFilter );
4f80d4 ¤   return( itemHit );
e29371 ¤   }
91af5a
7eaf5a
c72ac0 ¤   pascal short
7dbff0 DebugTraps_NoteAlert(
022b7e ¤   short¤  ¤   ¤   alertID,
16728b ¤   ModalFilterUPP¤ modalFilter)
fcc7a1 ¤   {
5dfa7a ¤   AssertUPPIsNullOrValid( modalFilter, "DebugTraps_NoteAlert" );
4d946f ¤   pgpAssert( IsntNull( GetResource( 'ALRT', alertID ) ) );
bf67c5 ¤
f9d16b ¤   short itemHit¤  = NoteAlert( alertID, modalFilter );
9480d4 ¤   return( itemHit );
579371 ¤   }
--e2a7 000a6f2a2af401201fa Page 36 of MacDebugTraps.cp
e0af5a
1aaf5a
362ac0 ¤   pascal short
11cc45 DebugTraps_CautionAlert(
6f2b7e ¤   short¤  ¤   ¤   alertID,
cd728b ¤   ModalFilterUPP¤ modalFilter)
87c7a1 ¤   {
d9e467 ¤   AssertUPPIsNullOrValid( modalFilter, "DebugTraps_CautionAlert" );
6a946f ¤   pgpAssert( IsntNull( GetResource( 'ALRT', alertID ) ) );
9167c5 ¤
e2bd10 ¤   short itemHit¤  = CautionAlert( alertID, modalFilter );
1380d4 ¤   return( itemHit );
3c9371 ¤   }
7267c5 ¤
44af5a
78af5a
bfe159 // _____________________________ File Mgr _________________________________
e8af5a
3f48f4 ¤   pascal OSErr
9cd238 DebugTraps_FSpCreate(
65fbb6 ¤   const FSSpec *¤ spec,
4a7d53 ¤   OSType¤ ¤   ¤   creator,
6718eb ¤   OSType¤ ¤   ¤   fileType,
a04da6 ¤   ScriptCode¤ ¤   scriptTag )
efbb36 {
c94351 ¤   OSErr¤  err;
7767c5 ¤
630d14 ¤   AssertSpecIsValid( spec, "DebugTraps_FSpCreate");
7667c5 ¤
2444c6 ¤   err¤= FSpCreate( spec, creator, fileType, scriptTag );
78deb7 ¤   return( err );
b4efe6 }
29af5a
21af5a
48af5a
88af5a
e8af5a
7aa3b6 // _____________________________ Graphics _________________________________
6faf5a
166685 ¤   pascal void
3d52dc DebugTraps_DisposeGDevice( GDHandle¤device )
21bb36 {
34ada7 ¤   AssertHandleIsValid( device, "DebugTraps_DisposeGDevice" );
5167c5 ¤
1bd020 ¤   MacLeaks_ForgetHandle( device, kMacLeaks_DisposeHandleDeallocType );
1df884 ¤   MacLeaks_ForgetHandle( (**device).gdITable,
0091f6 ¤   ¤   kMacLeaks_DisposeHandleDeallocType );
37af5a
e067c5 ¤
1cf578 ¤   DisposeGDevice( device );
b5efe6 }
5daf5a
8e6685 ¤   pascal void
316efd DebugTraps_DisposeCTable(CTabHandle cTable)
fbbb36 {
d04495 ¤   AssertHandleIsValid( cTable, "DebugTraps_DisposeCTable" );
9c9d9c ¤   MacLeaks_ForgetHandle( cTable, kMacLeaks_DisposeHandleDeallocType );
8f67c5 ¤
26eb05 ¤   DisposeCTable( cTable );
a8efe6 }
86af5a
d5af5a
67cf33 #endif // ] USE_MAC_DEBUG_TRAPS
5aaf5a
2faf5a
4baf5a
f2af5a
a6af5a
9faf5a
f1af5a
4eaf5a
a6af5a
--2ea5 0010ecad80a401201fa Page 37 of MacDebugTraps.cp
e0af5a
1aaf5a
17af5a
78af5a
32af5a
93af5a
37af5a
a6af5a
33af5a
24af5a
c6af5a
2caf5a
16af5a
c4af5a
a3af5a
57af5a
65af5a
77af5a
0aaf5a
5daf5a
9caf5a
0baf5a
e6af5a
edaf5a
51af5a
11af5a
0eaf5a
--755b 0003fcbd5eb401201fb Page 1 of MacDebugTraps.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
9ab95f ¤   $Id: MacDebugTraps.h,v 1.12.14.1 1998/11/12 03:18:53 heller Exp $
b3f7f7 ____________________________________________________________________________*/
03af5a
dd7b7d #pragma once
d0af5a
9baf5a
55af5a
1b12db #if ! PGP_DEBUG
4b89bc /* debug traps should not compile into a non-DEBUG version */
a9d24d ¤   #undef USE_MAC_DEBUG_TRAPS
ea67c5 ¤
4bd2fa #define USE_MAC_DEBUG_TRAPS¤0
997454 #endif
a4af5a
9caf5a
177611 #if USE_MAC_DEBUG_TRAPS¤/* [ */
91af5a
30ee38 #include <AEObjects.h>
6dc746 #include <AEPackObject.h>
029c60 #include <Aliases.h>
35c20d #include <Dialogs.h>
877c7a #include <Icons.h>
6dae6e #include <Menus.h>
8eaf5a
88af5a
1699c6 PGP_BEGIN_C_DECLARATIONS
3baf5a
eeaf5a
960335 /*____________________________________________________________________________
189c78 ¤   Note:
ffce5d ¤   The MDT_FALArgs directive can be used to record the file name
b3f1b9 ¤   in which a memory allocation is made.
256c3f ¤   This information can be used by the DebugLeaks code.
94479c ¤   MDT_FALArgs generates a null-terminated C-string.
24f7f7 ____________________________________________________________________________*/
d2af5a
b394fa #define MDT_FALArgs¤ ¤  __FILE__, __LINE__
cdaf5a
478591 #define MDT_FileAndLineParams¤  const char *srcFile_, long srcLine_
24af5a
c7af5a
bdaf5a
12d37e /*_____________________________ Memory Manager _____________________________*/
93af5a
2daf5a
33e122 #define BlockMove¤  ¤   ¤   ¤   DebugTraps_BlockMove
98af5a
4c1c32 #define BlockMoveData¤  ¤   ¤   DebugTraps_BlockMoveData
9caf5a
9aa778 #define NewPtr(sz)¤ ¤   ¤   ¤   DebugTraps_NewPtr( sz, MDT_FALArgs)
4baf5a
906445 #define NewPtrClear(sz)¤¤   DebugTraps_NewPtrClear( sz, MDT_FALArgs)
9daf5a
dd988c #define NewPtrSys(sz)¤  ¤   ¤   DebugTraps_NewPtrSys( sz, MDT_FALArgs)
a7af5a
244a77 #define NewPtrSysClear(sz)¤ ¤   \
d75966 ¤   DebugTraps_NewPtrSysClear( sz, MDT_FALArgs)
ecaf5a
1faaea #define GetPtrSize¤ ¤   ¤   ¤   DebugTraps_GetPtrSize
18af5a
701ea8 #define SetPtrSize¤ ¤   ¤   ¤   DebugTraps_SetPtrSize
e0af5a
ae4673 #define PtrZone¤¤   ¤   ¤   ¤   DebugTraps_PtrZone
28af5a
7e84d3 #define DisposePtr¤ ¤   ¤   ¤   DebugTraps_DisposePtr
3faf5a
--1170 000b4f02266401201fb Page 2 of MacDebugTraps.h
c88156 #define PtrToHand(s,d,z)¤   ¤   \
8cf40c ¤   ¤   ¤   DebugTraps_PtrToHand( s, d, z, MDT_FALArgs)
92af5a
aaa2f4 #define NewHandle(sz)¤  ¤   ¤   DebugTraps_NewHandle( sz, MDT_FALArgs)
f4af5a
0dc5cf #define NewHandleClear(sz)¤ ¤   \
a02c1b ¤   ¤   ¤   DebugTraps_NewHandleClear( sz, MDT_FALArgs)
edaf5a
21a372 #define NewHandleSys(sz)¤   ¤   \
118663 ¤   ¤   ¤   DebugTraps_NewHandleSys( sz, MDT_FALArgs)
3eaf5a
b5a439 #define NewHandleSysClear(sz)¤  \
007740 ¤   ¤   ¤   DebugTraps_NewHandleSysClear( sz, MDT_FALArgs)
c3af5a
2be997 #define GetHandleSize¤  ¤   ¤   DebugTraps_GetHandleSize
97af5a
740757 #define SetHandleSize¤  ¤   ¤   DebugTraps_SetHandleSize
c7af5a
f414d3 #define ReallocateHandle¤   ¤   DebugTraps_ReallocateHandle
e4af5a
1a1f62 #define DisposeHandle¤  ¤   ¤   DebugTraps_DisposeHandle
d9af5a
31ac42 #define HLock¤  ¤   ¤   ¤   ¤   DebugTraps_HLock
99af5a
6ec94b #define HUnlock¤¤   ¤   ¤   ¤   DebugTraps_HUnlock
f8af5a
e82d72 #define HGetState¤  ¤   ¤   ¤   DebugTraps_HGetState
beaf5a
3eb8c5 #define HSetState¤  ¤   ¤   ¤   DebugTraps_HSetState
96af5a
36b8b2 #define HandAndHand¤¤   ¤   ¤   DebugTraps_HandAndHand
4faf5a
3c9bc1 #define HandToHand(h)¤  ¤   ¤   DebugTraps_HandToHand( h, MDT_FALArgs)
97af5a
46e8bf #define HPurge¤ ¤   ¤   ¤   ¤   DebugTraps_HPurge
89af5a
4f4b26 #define HNoPurge¤   ¤   ¤   ¤   DebugTraps_HNoPurge
f6af5a
c6eebb #define EmptyHandle¤¤   ¤   ¤   DebugTraps_EmptyHandle
49af5a
6a3169 #define HandleZone¤ ¤   ¤   ¤   DebugTraps_HandleZone
4eaf5a
a7e3ce #define RecoverHandle¤  ¤   ¤   DebugTraps_RecoverHandle
5baf5a
1c924d #define RecoverHandleSys¤   ¤   DebugTraps_RecoverHandleSys
78af5a
cac80e #define SetZone¤¤   ¤   ¤   ¤   DebugTraps_SetZone
a1af5a
10fe8f #define GetZone¤¤   ¤   ¤   ¤   DebugTraps_GetZone
46af5a
7c9e7b #define TempNewHandle(sz, err)¤ \
10109b ¤   ¤   ¤   DebugTraps_TempNewHandle( sz, err, MDT_FALArgs)
ddaf5a
2c0042 #define TempDisposeHandle¤  ¤   DebugTraps_TempDisposeHandle
16af5a
815468 #define MoveHHi¤¤   ¤   ¤   ¤   DebugTraps_MoveHHi
e8af5a
012a5f #define PtrAndHand¤ ¤   ¤   ¤   DebugTraps_PtrAndHand
24af5a
16af5a
acaf5a
26af5a
4c9056 pascal void ¤   DebugTraps_BlockMove(const void *srcPtr,
5f6e72 ¤   ¤   ¤   ¤   ¤   void *destPtr, Size byteCount);
6cd098 pascal void ¤   DebugTraps_BlockMoveData(const void *srcPtr,
0f6e72 ¤   ¤   ¤   ¤   ¤   void *destPtr, Size byteCount);
5caf5a
c60e7d pascal Ptr¤ ¤   DebugTraps_NewPtr(Size byteCount, MDT_FileAndLineParams);
6b9be4 pascal Ptr¤ ¤   DebugTraps_NewPtrSys(Size byteCount, MDT_FileAndLineParams);
e10e30 pascal Ptr¤ ¤   DebugTraps_NewPtrClear(Size byteCount, MDT_FileAndLineParams);
38aff6 pascal Ptr¤ ¤   DebugTraps_NewPtrSysClear(Size byteCount,
b4ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
--3df1 000ea876b4b401201fb Page 3 of MacDebugTraps.h
4e38a3 pascal Size¤¤   DebugTraps_GetPtrSize(Ptr p);
e7631b pascal void¤¤   DebugTraps_SetPtrSize(Ptr p, Size newSize);
76c1db pascal THz¤ ¤   DebugTraps_PtrZone(Ptr p);
48fefb pascal void¤¤   DebugTraps_DisposePtr(Ptr p);
eaaf5a
3d81fb pascal OSErr¤   DebugTraps_PtrToHand(const void *srcPtr,
b0e25f ¤   ¤   ¤   ¤   ¤   Handle *dstHndl, long size, MDT_FileAndLineParams);
8d0e4f pascal Handle¤  DebugTraps_NewHandle(Size byteCount, MDT_FileAndLineParams);
308a50 pascal Handle¤  DebugTraps_NewHandleClear(Size byteCount,
edac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
6d36e3 pascal Handle¤  DebugTraps_NewHandleSys(Size byteCount,
b4ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
db6c86 pascal Handle¤  DebugTraps_NewHandleSysClear(Size byteCount,
a9ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
b71508 pascal Size ¤   DebugTraps_GetHandleSize(Handle h );
79d613 pascal void ¤   DebugTraps_SetHandleSize(Handle h, Size newSize);
adcafe pascal void¤¤   DebugTraps_ReallocateHandle(Handle h, Size byteCount);
5693d2 pascal void ¤   DebugTraps_DisposeHandle(Handle h);
418b5f pascal void ¤   DebugTraps_HLock(Handle h);
c56fbe pascal void ¤   DebugTraps_HUnlock(Handle h);
58f769 pascal SInt8¤   DebugTraps_HGetState(Handle h);
653cde pascal void¤¤   DebugTraps_HSetState(Handle h, SInt8 flags);
081a10 pascal OSErr ¤  DebugTraps_HandAndHand(Handle hand1, Handle hand2);
ae78b0 pascal OSErr¤   DebugTraps_HandToHand(Handle *theHndl, MDT_FileAndLineParams);
472214 pascal void¤¤   DebugTraps_HPurge(Handle h);
bd8e4b pascal void¤¤   DebugTraps_HNoPurge(Handle h);
067ffc pascal void¤¤   DebugTraps_EmptyHandle(Handle h);
6add3d pascal THz¤ ¤   DebugTraps_HandleZone(Handle h);
ad670f pascal Handle¤  DebugTraps_RecoverHandle(Ptr p);
6a296a pascal Handle¤  DebugTraps_RecoverHandleSys(Ptr p);
f90508 pascal void¤¤   DebugTraps_MoveHHi(Handle h);
462213 pascal OSErr¤   DebugTraps_PtrAndHand(const void *ptr1,
748945 ¤   ¤   ¤   ¤   ¤   Handle hand2, long size);
adaf5a
3ca127 pascal void¤¤   DebugTraps_SetZone(THz hz);
b152b7 pascal THz¤ ¤   DebugTraps_GetZone(void);
89af5a
f63e62 pascal Handle¤  DebugTraps_TempNewHandle(Size logicalSize,
d428f9 ¤   ¤   ¤   ¤   ¤   OSErr *resultCode, MDT_FileAndLineParams);
c912bd pascal void¤¤   DebugTraps_TempDisposeHandle( Handle h, OSErr *err);
9daf5a
9eaf5a
8aaf5a
43af5a
65771b /*_________________________ Resource Manager _______________________________*/
88af5a
3caf5a
77af5a
1043b3 #define ReleaseResource¤DebugTraps_ReleaseResource
29af5a
e2af5a
da240e #define CloseResFile¤   ¤   DebugTraps_CloseResFile
66af5a
187583 #define HomeResFile¤¤   ¤   DebugTraps_HomeResFile
7caf5a
61d95b #define CreateResFile¤  ¤   DebugTraps_CreateResFile
2eaf5a
34daf1 #define OpenResFile¤¤   ¤   DebugTraps_OpenResFile
f7af5a
7de2e3 #define UseResFile¤ ¤   ¤   DebugTraps_UseResFile
13af5a
efaa46 #define GetIndType¤ ¤   ¤   DebugTraps_GetIndType
7aaf5a
0ad190 #define Get1IndType¤¤   ¤   DebugTraps_Get1IndType
0faf5a
2c5597 #define GetIndResource¤ ¤   DebugTraps_GetIndResource
83af5a
973c55 #define Get1IndResource¤¤   DebugTraps_Get1IndResource
aaaf5a
ef5958 /* #define GetResource(t, i)¤   DebugTraps_GetResource(t, i) */
77af5a
ea4823 #define Get1Resource¤   ¤   DebugTraps_Get1Resource
--24e7 0004fdd90ba401201fb Page 4 of MacDebugTraps.h
e0af5a
1f6fe9 #define GetNamedResource¤   DebugTraps_GetNamedResource
ddaf5a
dded1b #define Get1NamedResource¤  DebugTraps_Get1NamedResource
27af5a
568055 #define LoadResource¤   ¤   DebugTraps_LoadResource
dcaf5a
5e0a48 #define ReleaseResource¤¤   DebugTraps_ReleaseResource
95af5a
e39cd6 #define DetachResource(r)¤  \
64b15f ¤   ¤   ¤   DebugTraps_DetachResource( r, MDT_FALArgs )
8aaf5a
206a81 #define GetResAttrs¤¤   ¤   DebugTraps_GetResAttrs
d3af5a
cdb8fb #define GetResInfo¤ ¤   ¤   DebugTraps_GetResInfo
2caf5a
387713 #define SetResInfo¤ ¤   ¤   DebugTraps_SetResInfo
a8af5a
8da322 #define AddResource¤¤   ¤   DebugTraps_AddResource
4caf5a
d873e3 #define GetResourceSizeOnDisk¤  DebugTraps_GetResourceSizeOnDisk
deaf5a
6de63c #define GetMaxResourceSize¤ DebugTraps_GetMaxResourceSize
d0af5a
37e0ff #define RsrcMapEntry¤   ¤   DebugTraps_RsrcMapEntry
33af5a
c60108 #define SetResAttrs¤¤   ¤   DebugTraps_SetResAttrs
01af5a
bcc8f4 #define ChangedResource¤¤   DebugTraps_ChangedResource
beaf5a
f8fbeb #define RemoveResource¤ ¤   DebugTraps_RemoveResource
34af5a
b827ac #define UpdateResFile¤  ¤   DebugTraps_UpdateResFile
c4af5a
c4b16f #define WriteResource¤  ¤   DebugTraps_WriteResource
79af5a
353e5e #define GetResFileAttrs¤¤   DebugTraps_GetResFileAttrs
17af5a
3fc6b8 #define SetResFileAttrs¤¤   DebugTraps_SetResFileAttrs
09af5a
d899d6 #define OpenRFPerm¤ ¤   ¤   DebugTraps_OpenRFPerm
35af5a
6a75a0 #define HOpenResFile¤   ¤   DebugTraps_HOpenResFile
59af5a
b67ca5 #define HCreateResFile¤ ¤   DebugTraps_HCreateResFile
a7af5a
d5a293 #define FSpOpenResFile¤ ¤   DebugTraps_FSpOpenResFile
55af5a
0df55e #define FSpCreateResFile¤   DebugTraps_FSpCreateResFile
ddaf5a
9cd15f #define ReadPartialResource¤DebugTraps_ReadPartialResource
8eaf5a
d6b898 #define WritePartialResource¤   DebugTraps_WritePartialResource
28af5a
5ed59e #define SetResourceSize¤¤   DebugTraps_SetResourceSize
daaf5a
134329 #define GetNextFOND¤¤   ¤   DebugTraps_GetNextFOND
85af5a
c667c5 ¤
7367c5 ¤
b5cb11 pascal void¤¤   DebugTraps_ReleaseResource(Handle theResource);
5a77b5 pascal void¤¤   DebugTraps_CloseResFile(short refNum);
8b6c8d pascal short¤   DebugTraps_HomeResFile(Handle theResource);
35ad6b pascal void¤¤   DebugTraps_CreateResFile(ConstStr255Param fileName);
6a20d9 pascal short¤   DebugTraps_OpenResFile(ConstStr255Param fileName);
76041c pascal void¤¤   DebugTraps_UseResFile(short refNum);
d7b816 pascal void¤¤   DebugTraps_GetIndType(ResType *theType, short index);
f4819f pascal void¤¤   DebugTraps_Get1IndType(ResType *theType, short index);
2d1da1 pascal Handle¤  DebugTraps_GetIndResource(ResType theType, short index);
a09d9e pascal Handle¤  DebugTraps_Get1IndResource(ResType theType, short index);
10e52f /*pascal Handle¤DebugTraps_GetResource(ResType theType, short theID);*/
4f10b2 pascal Handle¤  DebugTraps_Get1Resource(ResType theType, short theID);
--fd85 000ddec95a7401201fb Page 5 of MacDebugTraps.h
9b8dbf pascal Handle¤  DebugTraps_GetNamedResource(ResType theType,
05d415 ¤   ¤   ¤   ¤   ¤   ConstStr255Param name);
034424 pascal Handle¤  DebugTraps_Get1NamedResource(ResType theType,
1cd415 ¤   ¤   ¤   ¤   ¤   ConstStr255Param name);
f3b754 pascal void¤¤   DebugTraps_LoadResource(Handle theResource);
0acb11 pascal void¤¤   DebugTraps_ReleaseResource(Handle theResource);
de06cd pascal void¤¤   DebugTraps_DetachResource(Handle theResource,
82ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
72d8c1 pascal short¤   DebugTraps_GetResAttrs(Handle theResource);
415cac pascal void¤¤   DebugTraps_GetResInfo(Handle theResource,
d901d9 ¤   ¤   ¤   ¤   ¤   short *theID, ResType *theType, Str255 name);
37c02c pascal void¤¤   DebugTraps_SetResInfo(Handle theResource, short theID,
27d415 ¤   ¤   ¤   ¤   ¤   ConstStr255Param name);
0d681f pascal void¤¤   DebugTraps_AddResource(Handle theData, ResType theType,
6b10bc ¤   ¤   ¤   ¤   ¤   short theID, ConstStr255Param name);
ea86b2 pascal long¤¤   DebugTraps_GetResourceSizeOnDisk(Handle theResource);
3e4a26 pascal long¤¤   DebugTraps_GetMaxResourceSize(Handle theResource);
acace2 pascal long¤¤   DebugTraps_RsrcMapEntry(Handle theResource);
a33253 pascal void¤¤   DebugTraps_SetResAttrs(Handle theResource, short attrs);
4ecea4 pascal void¤¤   DebugTraps_ChangedResource(Handle theResource);
5f1df7 pascal void¤¤   DebugTraps_RemoveResource(Handle theResource);
cb221e pascal void¤¤   DebugTraps_UpdateResFile(short refNum);
8db3ac pascal void¤¤   DebugTraps_WriteResource(Handle theResource);
bcb306 pascal short¤   DebugTraps_GetResFileAttrs(short refNum);
dcfdc6 pascal void¤¤   DebugTraps_SetResFileAttrs(short refNum, short attrs);
b3ea17 pascal short¤   DebugTraps_OpenRFPerm(ConstStr255Param fileName,
366243 ¤   ¤   ¤   ¤   ¤   short vRefNum, SInt8 permission);
a32b6b pascal short¤   DebugTraps_HOpenResFile(short vRefNum, long dirID,
dc7791 ¤   ¤   ¤   ¤   ¤   ConstStr255Param fileName, SInt8 permission);
bf216d pascal void¤¤   DebugTraps_HCreateResFile(short vRefNum, long dirID,
88d7bd ¤   ¤   ¤   ¤   ¤   ConstStr255Param fileName);
af657d pascal short¤   DebugTraps_FSpOpenResFile(const FSSpec *spec,
4d5981 ¤   ¤   ¤   ¤   ¤   SignedByte permission);
9464bf pascal void¤¤   DebugTraps_FSpCreateResFile(const FSSpec *spec,
f5b065 ¤   ¤   ¤   ¤   ¤   OSType creator, OSType fileType, ScriptCode scriptTag);
10bc38 pascal void¤¤   DebugTraps_ReadPartialResource(Handle theResource,
a11556 ¤   ¤   ¤   ¤   ¤   long offset, void *buffer, long count);
c114b1 pascal void¤¤   DebugTraps_WritePartialResource(Handle theResource,
13b0a8 ¤   ¤   ¤   ¤   ¤   long offset, const void¤*buffer, long count);
9b95d2 pascal void¤¤   DebugTraps_SetResourceSize(Handle theResource, long newSize);
5a13ca pascal Handle¤  DebugTraps_GetNextFOND(Handle fondHandle);
b7af5a
a4af5a
1aaf5a
6caf5a
1baf5a
10af5a
d9af5a
5b8145 /*_____________________________ Quickdraw _________________________________*/
79af5a
84af5a
aad379 #define NewRgn()¤   ¤   ¤   DebugTraps_NewRgn( MDT_FALArgs )
69af5a
eb8dc1 #define DisposeRgn¤ ¤   ¤   DebugTraps_DisposeRgn
55af5a
486e5f pascal RgnHandle¤   ¤   ¤   DebugTraps_NewRgn( MDT_FileAndLineParams );
1f1a29 pascal void¤¤   ¤   ¤   ¤   DebugTraps_DisposeRgn( RgnHandle theRgn );
1caf5a
ccaf5a
96af5a
57726b /*_____________________________ Menu Manager _________________________________*/
21af5a
a1af5a
c748eb #define NewMenu( id, title )¤   DebugTraps_NewMenu( id, title,\
9cbf55 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   MDT_FALArgs )
d90da7 #define DisposeMenu¤¤   ¤   ¤   DebugTraps_DisposeMenu
9eaf5a
7098b0 #define GetMenuBar( )¤  ¤   ¤   DebugTraps_GetMenuBar( MDT_FALArgs )
e6af5a
c5a8b4 #define GetNewMBar( id )¤   ¤   DebugTraps_GetNewMBar( id, MDT_FALArgs)
94af5a
ddce20 pascal MenuRef¤ ¤   ¤   ¤   DebugTraps_NewMenu( short menuID,
--756d 000c4b20ad8401201fb Page 6 of MacDebugTraps.h
b2dae4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param menuTitle,
777724 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
827d0d pascal void¤¤   ¤   ¤   ¤   DebugTraps_DisposeMenu(MenuHandle theMenu);
767318 pascal Handle¤  ¤   ¤   ¤   DebugTraps_GetMenuBar( MDT_FileAndLineParams );
ed357b pascal Handle¤  ¤   ¤   ¤   DebugTraps_GetNewMBar(short menuBarID,
2a7724 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
d5af5a
16af5a
03af5a
74af5a
7365fb /*_____________________________ Icons _________________________________*/
4aaf5a
0faf5a
9bf307 #define NewIconSuite( suite )¤  ¤   ¤   ¤   \
875a88 ¤   ¤   ¤   DebugTraps_NewIconSuite( suite, MDT_FALArgs )
e0af5a
23383f #define GetIconSuite( suite, resID, sel, ·)¤\
5bc187 ¤   ¤   ¤   DebugTraps_GetIconSuite( suite, resID, sel, MDT_FALArgs )
25af5a
15ecff #define DisposeIconSuite¤   ¤   ¤   ¤   ¤   DebugTraps_DisposeIconSuite
80af5a
5eaf5a
4158ff pascal OSErr¤   ¤   DebugTraps_NewIconSuite(Handle *theIconSuite,
e4b4c9 ¤   ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
b80ed3 pascal OSErr¤   ¤   DebugTraps_GetIconSuite( Handle *theIconSuite,
27d6b2 ¤   ¤   ¤   ¤   ¤   ¤   SInt16 theResID, IconSelectorValue selector,
65b4c9 ¤   ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
1a0799 pascal OSErr¤   ¤   DebugTraps_DisposeIconSuite(Handle theIconSuite,
3f90ec ¤   ¤   ¤   ¤   ¤   ¤   Boolean disposeData);
67af5a
eeaf5a
ebaf5a
22af5a
65041d /*_____________________________ Alias Manager ______________________________*/
92af5a
6f2ae4 #define NewAlias(from, targ, al)¤   ¤   \
2d5f4a ¤   ¤   ¤   DebugTraps_NewAlias( from, targ, al, MDT_FALArgs )
b9af5a
d1215a #define NewAliasMinimal( targ, al )¤¤   \
ab714f ¤   ¤   ¤   DebugTraps_NewAliasMinimal( targ, al, MDT_FALArgs )
13af5a
07bac8 #define NewAliasMinimalFromFullPath( pl, fp, zn, sn, al)¤   \
fcbde6 ¤   ¤   ¤   DebugTraps_NewAliasMinimalFromFullPath( pl, fp, zn, sn, al,\
8ba93a ¤   ¤   ¤   MDT_FALArgs)
d6af5a
741c3f pascal OSErr¤   DebugTraps_NewAlias(ConstFSSpecPtr fromFile,
35b2e8 ¤   ¤   ¤   ¤   ¤   const FSSpec *target,
8097f8 ¤   ¤   ¤   ¤   ¤   AliasHandle *alias, MDT_FileAndLineParams);
30e3a0 pascal OSErr¤   DebugTraps_NewAliasMinimal(const FSSpec *target,
f5e93a ¤   ¤   ¤   ¤   ¤   ¤   AliasHandle *alias,
5ab4c9 ¤   ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
3c3516 pascal OSErr¤   DebugTraps_NewAliasMinimalFromFullPath(
adf453 ¤   ¤   ¤   ¤   ¤   short fullPathLength,
d93436 ¤   ¤   ¤   ¤   ¤   const void *fullPath, ConstStr32Param zoneName,
6b49f9 ¤   ¤   ¤   ¤   ¤   ConstStr31Param serverName, AliasHandle *alias,
07ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
43af5a
b1af5a
41af5a
deaf5a
c3af5a
3302f8 /*______________________ Apple Event Related _______________________________*/
91af5a
08af5a
bf9820 #define AECreateDesc( type, data, size, result )¤   ¤   ¤   ¤   ¤   \
4269c3 ¤   DebugTraps_AECreateDesc( type, data, size, result, MDT_FALArgs)¤
5daf5a
9fc3e1 #define AECoercePtr( type, data, size, toType, result )¤¤   ¤   ¤   \
d97339 ¤   DebugTraps_AECoercePtr( type, data, size, toType, result, MDT_FALArgs)¤
16af5a
fc7635 #define AECoerceDesc( desc, toType, result )¤   ¤   ¤   ¤   ¤   ¤   \
c4bb21 ¤   DebugTraps_AECoerceDesc( desc, toType, result, MDT_FALArgs)
--ce72 000d0127264401201fb Page 7 of MacDebugTraps.h
e0af5a
0899bb #define AEDisposeDesc¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
68c5e4 ¤   DebugTraps_AEDisposeDesc
fbaf5a
46a793 #define AEDuplicateDesc( desc, result )¤¤   ¤   ¤   ¤   ¤   ¤   ¤   \
577164 ¤   DebugTraps_AEDuplicateDesc( desc, result, MDT_FALArgs)
afaf5a
a15bbb #define AECreateList( facPtr, facSize, isRec, result)¤  ¤   ¤   ¤   \
de0512 ¤   DebugTraps_AECreateList( facPtr, facSize, isRec, result, MDT_FALArgs)
59af5a
76c19e #define AEGetNthDesc( aeList, index, desType, keyw, res )¤  ¤   \
27014a ¤   DebugTraps_AEGetNthDesc( aeList, index, desType, keyw, res, MDT_FALArgs)
40af5a
2c21cc #define AEGetAttributeDesc( event, keyw, desType, result )¤ ¤   ¤   \
d4cb99 ¤   DebugTraps_AEGetAttributeDesc( event, keyw, desType, result, MDT_FALArgs)
f3af5a
141990 #define AECreateAppleEvent( aeClass, id, targ, retID, tranID, result )¤ \
10f5a7 ¤   DebugTraps_AECreateAppleEvent( aeClass, id, targ, retID, tranID,\
67f8d5 ¤   result, MDT_FALArgs)
d5af5a
fc4b3d #define AESend¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
a2e561 ¤   DebugTraps_AESend
fbaf5a
3552b8 #define AEGetTheCurrentEvent( event )¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
2d39d9 ¤   DebugTraps_AEGetTheCurrentEvent( event, MDT_FALArgs)
00af5a
de6a49 #define AEResolve( objSpec, flags, desc )¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
dfa4dd ¤   DebugTraps_AEResolve( objSpec, flags, desc, MDT_FALArgs)
49af5a
647df3 #define CreateOffsetDescriptor( offset, desc )¤ ¤   ¤   ¤   ¤   ¤   ¤   \
c373cf ¤   DebugTraps_CreateOffsetDescriptor( offset, desc, MDT_FALArgs)
d6af5a
234f74 #define CreateCompDescriptor(compare, op1, op2, dispose, desc )¤¤   ¤   \
38349b ¤   DebugTraps_CreateCompDescriptor(compare, op1, op2, dispose, desc,\
1b5960 ¤   MDT_FALArgs)
bbaf5a
e741cd #define CreateLogicalDescriptor( terms, operator, dispose, desc )¤  ¤   \
3c1a58 ¤   DebugTraps_CreateLogicalDescriptor( terms, operator, dispose, desc,\
775960 ¤   MDT_FALArgs)
15af5a
c0aa77 #define CreateObjSpecifier( desClass, cont, keyForm, keyData,\
f828fa ¤   ¤   dispose, objSpec )¤ ¤   \
bd509c ¤   ¤   DebugTraps_CreateObjSpecifier( desClass, cont, keyForm, \
bf3a65 ¤   ¤   keyData, dispose, objSpec, MDT_FALArgs)
2faf5a
2c3868 #define CreateRangeDescriptor( start, stop, dispose, desc )¤¤   ¤   ¤   \
ada072 ¤   DebugTraps_CreateRangeDescriptor( start, stop, dispose, desc, MDT_FALArgs)
f9af5a
a467c5 ¤
8367c5 ¤
45af5a
e1d6b3 pascal OSErr¤   DebugTraps_AECreateDesc(DescType typeCode,
ce0be7 ¤   ¤   ¤   ¤   ¤   const void *dataPtr,
cf78b5 ¤   ¤   ¤   ¤   ¤   Size dataSize, AEDesc *result,
17ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
662b85 ¤   ¤   ¤   ¤
7fa95c pascal OSErr¤   DebugTraps_AECoercePtr(DescType typeCode, const void *dataPtr,
508ad8 ¤   ¤   ¤   ¤   ¤   Size dataSize, DescType toType, AEDesc *result,
fcac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
872b85 ¤   ¤   ¤   ¤
dab9df pascal OSErr¤   DebugTraps_AECoerceDesc(const AEDesc *theAEDesc,
944449 ¤   ¤   ¤   ¤   ¤   DescType toType, AEDesc *result,
57ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
ce2b85 ¤   ¤   ¤   ¤
d3282b pascal OSErr¤   DebugTraps_AEDisposeDesc( AEDesc *theAEDesc );
dbaf5a
7b9cd1 pascal OSErr¤   DebugTraps_AEDuplicateDesc(const AEDesc *theAEDesc,
96ce60 ¤   ¤   ¤   ¤   ¤   AEDesc *result,
68ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
05af5a
701866 pascal OSErr¤   DebugTraps_AECreateList(const void *factoringPtr,
d0fc77 ¤   ¤   ¤   ¤   ¤   Size factoredSize,
--c51d 000357a201d401201fb Page 8 of MacDebugTraps.h
2d8819 ¤   ¤   ¤   ¤   ¤   Boolean isRecord, AEDescList *resultList,
48ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
33af5a
e0b2db pascal OSErr¤   DebugTraps_AEGetNthDesc(const AEDescList *theAEDescList,
0a9d94 ¤   ¤   ¤   ¤   ¤   long index,
7ab960 ¤   ¤   ¤   ¤   ¤   DescType desiredType, AEKeyword *theAEKeyword,
a03f12 ¤   ¤   ¤   ¤   ¤   AEDesc *result, MDT_FileAndLineParams);
22af5a
f04da1 pascal OSErr¤   DebugTraps_AEGetAttributeDesc(const AppleEvent *theAppleEvent,
348535 ¤   ¤   ¤   ¤   ¤   ·AEKeyword theAEKeyword,
3292ba ¤   ¤   ¤   ¤   ¤   DescType desiredType, AEDesc *result,
98ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
4caf5a
9d0c7f pascal OSErr¤   DebugTraps_AECreateAppleEvent(AEEventClass theAEEventClass,
557381 ¤   ¤   ¤   ¤   ¤   AEEventID theAEEventID,
f778f9 ¤   ¤   ¤   ¤   ¤   const AEAddressDesc *target, short returnID,
ee731b ¤   ¤   ¤   ¤   ¤   long transactionID, AppleEvent *result,
daac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
d8af5a
af7260 pascal OSErr¤   DebugTraps_AESend(const AppleEvent *theAppleEvent,
d3705f ¤   ¤   ¤   ¤   ¤   AppleEvent *reply, AESendMode sendMode,
45375f ¤   ¤   ¤   ¤   ¤   AESendPriority sendPriority, long timeOutInTicks,
6c4899 ¤   ¤   ¤   ¤   ¤   AEIdleUPP idleProc,
aa46e2 ¤   ¤   ¤   ¤   ¤   AEFilterUPP filterProc);
25af5a
3f22a2 pascal OSErr¤   DebugTraps_AEGetTheCurrentEvent(AppleEvent *theAppleEvent,
9dac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
75af5a
3b1ce0 pascal OSErr¤   DebugTraps_AEResolve(const AEDesc *objectSpecifier,
834375 ¤   ¤   ¤   ¤   ¤   short callbackFlags, AEDesc *theToken,
83ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
a2af5a
4aa6b5 pascal OSErr¤   DebugTraps_CreateOffsetDescriptor(long theOffset,
a66720 ¤   ¤   ¤   ¤   ¤   AEDesc *theDescriptor,
3dac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
27ae30 ¤   ¤   ¤   ¤   ¤
c62e4c pascal OSErr¤   DebugTraps_CreateCompDescriptor(DescType comparisonOperator,
d0d523 ¤   ¤   ¤   ¤   ¤   AEDesc *operand1,
3a1b05 ¤   ¤   ¤   ¤   ¤   AEDesc *operand2, Boolean disposeInputs,
c36720 ¤   ¤   ¤   ¤   ¤   AEDesc *theDescriptor,
a9ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
83ae30 ¤   ¤   ¤   ¤   ¤
6a912e pascal OSErr¤   DebugTraps_CreateLogicalDescriptor(AEDescList *theLogicalTerms,
f51df6 ¤   ¤   ¤   ¤   ¤   DescType theLogicOperator, Boolean disposeInputs,
806720 ¤   ¤   ¤   ¤   ¤   AEDesc *theDescriptor,
9aac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
49ae30 ¤   ¤   ¤   ¤   ¤
91f85b pascal OSErr¤   DebugTraps_CreateObjSpecifier(DescType desiredClass,
7dc2e3 ¤   ¤   ¤   ¤   ¤   AEDesc *theContainer,
b88dc5 ¤   ¤   ¤   ¤   ¤   DescType keyForm, AEDesc *keyData,
6bab17 ¤   ¤   ¤   ¤   ¤   Boolean disposeInputs, AEDesc *objSpecifier,
69ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
50af5a
b8b54e pascal OSErr¤   DebugTraps_CreateRangeDescriptor(AEDesc *rangeStart,
99e252 ¤   ¤   ¤   ¤   ¤   AEDesc *rangeStop,
f681e8 ¤   ¤   ¤   ¤   ¤   Boolean disposeInputs, AEDesc *theDescriptor,
65ac99 ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
13af5a
3baf5a
edaf5a
0c75c6 /*_____________________________ Window Mgr _________________________________*/
bbaf5a
bcaf5a
c776b5 #define GetNewWindow( id, stor, behind )¤   ¤   ¤   \
091217 ¤   ¤   DebugTraps_GetNewWindow( id, stor, behind, MDT_FALArgs )
e0af5a
edf220 #define NewWindow( stor, rect, title, vis, proc, behind, goAway, ref)\
49bcd0 ¤   ¤   ¤   DebugTraps_NewWindow( stor, rect, title, vis, proc,\
a997d5 ¤   ¤   ¤   behind, goAway, ref, MDT_FALArgs )
d2af5a
0efa6c #define GetNewCWindow( id, stor, behind )¤  ¤   \
35136f ¤   ¤   ¤   DebugTraps_GetNewCWindow( id, stor, behind, MDT_FALArgs )
--caef 000c144b68e401201fb Page 9 of MacDebugTraps.h
e0af5a
c756c7 #define NewCWindow( stor, rect, title, vis, proc, behind, goAway, ref)\
0f2738 ¤   ¤   ¤   DebugTraps_NewCWindow( stor, rect, title, vis, proc,\
d597d5 ¤   ¤   ¤   behind, goAway, ref, MDT_FALArgs )
06af5a
a922ed #define DisposeWindow¤  DebugTraps_DisposeWindow
29af5a
569955 #define CloseWindow¤¤   DebugTraps_CloseWindow
1baf5a
91fa95 pascal WindowRef¤   DebugTraps_GetNewWindow(short windowID,
b20622 ¤   ¤   ¤   ¤   ¤   ¤   void *wStorage, WindowRef behind,
cab4c9 ¤   ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
79af5a
67af5a
1d4859 pascal WindowRef¤   DebugTraps_NewWindow(void *wStorage,
2f5a0b ¤   ¤   ¤   ¤   ¤   ¤   const Rect *boundsRect,
2fc282 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param title, Boolean visible,
1b17a5 ¤   ¤   ¤   ¤   ¤   ¤   short theProc, WindowRef behind,
fb183e ¤   ¤   ¤   ¤   ¤   ¤   Boolean goAwayFlag, long refCon,
87b4c9 ¤   ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
4daf5a
f785f6 pascal WindowRef¤   DebugTraps_GetNewCWindow(short windowID,
4e0622 ¤   ¤   ¤   ¤   ¤   ¤   void *wStorage, WindowRef behind,
1eb4c9 ¤   ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
35af5a
9aa471 pascal WindowRef¤   DebugTraps_NewCWindow(void *wStorage,
a75a0b ¤   ¤   ¤   ¤   ¤   ¤   const Rect *boundsRect,
38d688 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param title,
ae929a ¤   ¤   ¤   ¤   ¤   ¤   Boolean visible, short procID, WindowRef behind,
33183e ¤   ¤   ¤   ¤   ¤   ¤   Boolean goAwayFlag, long refCon,
aab4c9 ¤   ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
c5af5a
bdc2ce pascal void¤¤   ¤   DebugTraps_DisposeWindow(WindowRef theWindow);
be601f pascal void¤¤   ¤   DebugTraps_CloseWindow(WindowRef theWindow);
0daf5a
b2af5a
2c7689 /*_____________________________ Dialog Mgr _________________________________*/
20af5a
baaf5a
eeca84 #define NewDialog( stor, rect, title, vis, procID, \
9ea65f ¤   ¤   ¤   behind, goAway, ref, itemList )\
90deaa ¤   ¤   ¤   DebugTraps_NewDialog( stor, rect, title, vis, procID,\
1d4824 ¤   ¤   ¤   behind, goAway, ref, itemList, MDT_FALArgs)
97af5a
5f1c74 #define GetNewDialog( id, stor, behind )¤   ¤   \
dc6d98 ¤   DebugTraps_GetNewDialog( id, stor, behind, MDT_FALArgs)
f2af5a
8e091b #define DisposeDialog¤  ¤   DebugTraps_DisposeDialog
c3af5a
52bacb #define CloseDialog¤¤   ¤   DebugTraps_CloseDialog
daaf5a
4ff2f7 #define ModalDialog¤¤   ¤   DebugTraps_ModalDialog
93af5a
4c336a #define Alert¤  ¤   ¤   ¤   DebugTraps_Alert
c1af5a
4ad07f #define StopAlert¤  ¤   ¤   DebugTraps_StopAlert
45af5a
5fe53e #define NoteAlert¤  ¤   ¤   DebugTraps_NoteAlert
cbaf5a
e034d8 #define CautionAlert¤   ¤   DebugTraps_CautionAlert
3caf5a
f86bfe pascal DialogRef¤   DebugTraps_NewDialog(void *wStorage,
081168 ¤   ¤   ¤   ¤   ¤   ¤   const Rect *boundsRect, ConstStr255Param title,
28e199 ¤   ¤   ¤   ¤   ¤   ¤   Boolean visible, short procID,
d39f16 ¤   ¤   ¤   ¤   ¤   ¤   WindowRef behind, Boolean goAwayFlag,
0412f2 ¤   ¤   ¤   ¤   ¤   ¤   long refCon, Handle itmLstHndl,
9ab4c9 ¤   ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
2b94aa ¤   ¤   ¤   ¤   ¤   ¤
71e05a pascal DialogRef¤   DebugTraps_GetNewDialog(short dialogID,
6bdd3d ¤   ¤   ¤   ¤   ¤   ¤   void *dStorage, WindowRef behind,
a2b4c9 ¤   ¤   ¤   ¤   ¤   ¤   MDT_FileAndLineParams);
c194aa ¤   ¤   ¤   ¤   ¤   ¤
--c7a8 0018721f8ca401201fb Page 10 of MacDebugTraps.h
91a578 pascal void¤¤   ¤   DebugTraps_DisposeDialog( DialogRef theDialog);
ab62de pascal void¤¤   ¤   DebugTraps_CloseDialog( DialogRef theDialog);
29af5a
67af5a
ae178a pascal void¤¤   DebugTraps_ModalDialog( ModalFilterUPP modalFilter,
bd05a1 ¤   ¤   ¤   ¤   ¤   short *itemHit);
46f3d4 pascal short¤   DebugTraps_Alert( short alertID, ModalFilterUPP modalFilter);
3d3a4d pascal short¤   DebugTraps_StopAlert( short alertID, ModalFilterUPP mf);
8417b5 pascal short¤   DebugTraps_NoteAlert( short alertID, ModalFilterUPP mf);
791d02 pascal short¤   DebugTraps_CautionAlert( short alertID, ModalFilterUPP mf);
b2af5a
a735f9 /*_____________________________ Graphics _________________________________*/
dbaf5a
aa560a #define DisposeGDevice( d )¤DebugTraps_DisposeGDevice( d )
79af5a
2163d6 #define DisposeCTable( t )¤ DebugTraps_DisposeCTable( t )
75af5a
dcd4f2 pascal void¤DebugTraps_DisposeGDevice( GDHandle¤device );
28779e pascal void DebugTraps_DisposeCTable( CTabHandle cTable );
c1af5a
cbaf5a
b33ebe /*_____________________________ File Mgr _________________________________*/
b1af5a
17af5a
089f82 #define FSpCreate(spec, cr, ty, sc)¤¤   \
49145a ¤   ¤   ¤   DebugTraps_FSpCreate(spec, cr, ty, sc)
8caf5a
377833 pascal OSErr¤   DebugTraps_FSpCreate(const FSSpec *spec,
8cfd75 ¤   ¤   ¤   ¤   ¤   OSType creator, OSType fileType, ScriptCode scriptTag );
42af5a
d61254 PGP_END_C_DECLARATIONS
faaf5a
fc3167 #endif¤ /* ] */
55af5a
fdaf5a
3aaf5a
9caf5a
ebaf5a
c7af5a
5caf5a
21af5a
d9af5a
82af5a
29af5a
87af5a
--d727 000959820a3401201fc Page 1 of MacDebugTrapsOff.h
a70335 /*____________________________________________________________________________
3b7d46 ¤   DebugTrapsOff.h
aaf7f7 ____________________________________________________________________________*/
b0af5a
82af5a
d97b7d #pragma once
2faf5a
18136e #if USE_MAC_DEBUG_TRAPS¤// [
1daf5a
4c38e5 /*
fbf990 This file defeats the debugging traps mechanism for all debugging traps.
22fb4c To turn off debugging traps in an individual file, #include this file
a7e3a5 after #including DebugTraps.h
8e2674 (which is typically #included in a global prefix file).
fbaf5a
5b35b7 This may be necessary in a few rare circumstances where mutual recursion
7b078e between DebugTraps and other debugging code occurs.
d1af5a
fa047e You can also #undef an individual routine if it's a single routine
0baffb that's a problem.
1faf5a
301022 How to generate this file:
3dc2b1 ¤   This file is derived from DebugTraps.h. If you change DebugTraps.h,
037c7f ¤   do not edit this file. Instead, generate a new file as follows:
0fd5bb ¤   1. Copy all #defines from DebugTraps.h to a scratch window
f5157f ¤   2. globally replace all #define with #undef
122b4e ¤   3. using grep, strip text after the #undef'd symbol
e6c0a4 ¤   3. strip any other extraneous stuff from this file
f4cd42 ¤   4. save
857fe0 */
34af5a
cfaf5a
0b0055 // ___________________________ Memory Manager ______________________________
22af5a
c7c4d6 #undef BlockMove¤   ¤   ¤   ¤
251d7e #undef BlockMoveData¤   ¤   ¤
e376ed #undef NewPtr
767360 #undef NewPtrClear
892329 #undef NewPtrSys¤   ¤   ¤
594104 #undef NewPtrSysClear
fa3017 #undef GetPtrSize¤  ¤   ¤   ¤
25db09 #undef SetPtrSize¤  ¤   ¤   ¤
30cd5a #undef PtrZone¤ ¤   ¤   ¤   ¤
374362 #undef DisposePtr¤  ¤   ¤   ¤
515d39 #undef PtrToHand
f08f57 #undef NewHandle
4cef04 #undef NewHandleClear
e945a7 #undef NewHandleSys
b197d5 #undef NewHandleSysClear
6f81d1 #undef GetHandleSize¤   ¤   ¤
8b6acf #undef SetHandleSize¤   ¤   ¤
b0e74a #undef ReallocateHandle¤¤
db819c #undef DisposeHandle¤   ¤   ¤
7fbc32 #undef HLock¤   ¤   ¤   ¤   ¤
673599 #undef HUnlock¤ ¤   ¤   ¤   ¤
673037 #undef HGetState¤   ¤   ¤   ¤
09401b #undef HSetState¤   ¤   ¤   ¤
946b32 #undef HandAndHand¤ ¤   ¤   ¤
85e43a #undef HandToHand
0a09cb #undef HPurge¤  ¤   ¤   ¤   ¤
aae65c #undef HNoPurge¤¤   ¤   ¤
82f9ae #undef EmptyHandle¤ ¤   ¤   ¤
40da82 #undef HandleZone¤  ¤   ¤   ¤
ff4a8d #undef RecoverHandle¤   ¤   ¤
420ad2 #undef RecoverHandleSys¤¤
34805f #undef SetZone¤ ¤   ¤   ¤   ¤
d56b41 #undef GetZone¤ ¤   ¤   ¤   ¤
042431 #undef TempNewHandle
4763dc #undef TempDisposeHandle¤   ¤
421f65 #undef MoveHHi¤ ¤   ¤   ¤   ¤
27d465 #undef PtrAndHand¤  ¤   ¤   ¤
95af5a
--b463 000111e449f401201fc Page 2 of MacDebugTrapsOff.h
e0af5a
fd2226 // __________________________ Resource Manager _______________________________
c52b85 ¤   ¤   ¤   ¤
46af5a
2f895f #undef ReleaseResource
a8af5a
6bc3ac #undef CloseResFile
41780e #undef HomeResFile
ac36cf #undef CreateResFile
38577b #undef OpenResFile
43e322 #undef UseResFile
1d2404 #undef GetIndType
59c314 #undef Get1IndType
c51571 #undef GetIndResource
605374 #undef Get1IndResource
23fe49 #undef GetResource
3fee2f #undef Get1Resource
1afe22 #undef GetNamedResource
1ea7a8 #undef Get1NamedResource
eaa0f4 #undef LoadResource
b6895f #undef ReleaseResource
e18288 #undef DetachResource
161c5d #undef GetResAttrs
98027b #undef GetResInfo
7e2d6b #undef SetResInfo
af7e47 #undef AddResource
89ebd3 #undef GetResourceSizeOnDisk
9fba98 #undef GetMaxResourceSize
52bbcf #undef RsrcMapEntry
b50cf3 #undef SetResAttrs
a17951 #undef ChangedResource
af68a6 #undef RemoveResource
10607a #undef UpdateResFile
fe1628 #undef WriteResource
b09ffb #undef GetResFileAttrs
731611 #undef SetResFileAttrs
fba6cb #undef OpenRFPerm
8ab229 #undef HOpenResFile
fe662b #undef HCreateResFile
3b02b2 #undef FSpOpenResFile
d82e55 #undef FSpCreateResFile
32e57e #undef ReadPartialResource
bf6a8c #undef WritePartialResource
fff985 #undef SetResourceSize
ed902a #undef GetNextFOND
6caf5a
b0af5a
ebaf5a
9faf5a
6cb88d // _____________________________ Quickdraw _________________________________
f6af5a
37195b #undef NewRgn
3d1734 #undef DisposeRgn
01af5a
3daf5a
2baf5a
657534 // _____________________________ Menu Manager _________________________________
6daf5a
3ad7d3 #undef NewMenu
914c2c #undef DisposeMenu
198db4 #undef GetMenuBar
d8ee56 #undef GetNewMBar
a0af5a
96af5a
231482 // _____________________________ Icons _________________________________
24af5a
677ae9 #undef NewIconSuite
10a169 #undef DisposeIconSuite
f4ac9f #undef GetIconSuite
87af5a
70af5a
11ec8c // _____________________________ Alias Manager _____________________________
--9929 00184b652a4401201fc Page 3 of MacDebugTrapsOff.h
11bd02 #undef NewAlias
debcc4 #undef NewAliasMinimal
1efe29 #undef NewAliasMinimalFromFullPath
8baf5a
cdaf5a
b45f7e // _____________________________ Apple Event related _________________________
434d9d #undef AECreateDesc
b1d92e #undef AECoercePtr
76c924 #undef AECoerceDesc
3b9d3b #undef AEDisposeDesc
45ecda #undef AEDuplicateDesc
815810 #undef AECreateList
65859b #undef AEGetNthDesc
98983c #undef AEGetAttributeDesc
50b254 #undef AECreateAppleEvent
41b2f3 #undef AESend
7a4337 #undef AEGetTheCurrentEvent
c9eb7a #undef AEResolve
380250 #undef CreateOffsetDescriptor
2582e7 #undef CreateCompDescriptor
9f81b2 #undef CreateLogicalDescriptor
4b0e9e #undef CreateObjSpecifier
c1f32c #undef CreateRangeDescriptor
a1af5a
08af5a
b4af5a
d26a33 // _____________________________ Window Mgr _________________________________
0eaf5a
ecb12d #undef GetNewWindow
b74b77 #undef NewWindow
52db46 #undef GetNewCWindow
042663 #undef NewCWindow
659eed #undef DisposeWindow
7c0bc8 #undef CloseWindow
b2af5a
29af5a
17f436 // _____________________________ Dialog Mgr _________________________________
49af5a
e64c65 #undef NewDialog
bcb63f #undef GetNewDialog
f299ff #undef DisposeDialog
3f0cda #undef CloseDialog
062a65 #undef ModalDialog
219d59 #undef Alert
d8f208 #undef StopAlert
153aef #undef NoteAlert
f8e7ef #undef CautionAlert
2aaf5a
f7a3b6 // _____________________________ Graphics _________________________________
d84185 #undef DisposeGDevice
8bde7e #undef DisposeCTable
beaf5a
41af5a
97e159 // _____________________________ File Mgr _________________________________
e88461 #undef FSpCreate
26af5a
5d67c5 ¤
843f43 #endif // ] USE_MAC_DEBUG_TRAPS¶
--d041 001d0481613401201fd Page 1 of PowerPlantLeaks.h
a70335 /*____________________________________________________________________________
92f7f7 ____________________________________________________________________________*/
93af5a
e07b7d #pragma once
00af5a
1e3432 #if USE_MAC_DEBUG_LEAKS¤// [
1daf5a
360a93 #include <LPeriodical.h>
c2af5a
d40335 /*____________________________________________________________________________
138e1e ¤   instantiating this class forces two lists in LPeriodical to be created
75c336 ¤   typical use example:
e67783 ¤   #if USE_MAC_DEBUG_LEAKS
49f1b8 ¤   {CForceInitLPeriodical¤ dummy;}
c6b7ec ¤   #endif
bef7f7 ____________________________________________________________________________*/
eae030 // instantiating this class forces two lists in LPeriodical to be created
c9f997 // typical use example:
f6651d class CForceInitLPeriodical : LPeriodical
87bb36 {
1a5ed4 public:
0a7f67 ¤   CForceInitLPeriodical( void )
faa41d ¤   ¤   { StartIdling(); StartRepeating();}
c8695d ¤   virtual void¤   SpendTime(const EventRecord &/*inMacEvent*/)¤   {}
df82f7 };
a2af5a
4d76d8 #endif¤ // ]
1eaf5a
0baf5a
5baf5a
eaaf5a
65af5a
8caf5a
31af5a
02af5a
28af5a
d0af5a
--d0e6 0000e2dd3ca401201fe Page 1 of CGAProgressDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
4f4a9a ¤   $Id: CGAProgressDialog.cp,v 1.11.12.1 1998/11/12 03:18:55 heller Exp $
54f7f7 ____________________________________________________________________________*/
2eaf5a
43b980 #include <Appearance.h>
d549f7 #include <LProgressBar.h>
fcd797 #include <LPushButton.h>
7605c6 #include <LStaticText.h>
2eafac #include <UModalDialogs.h>
9faf5a
edc110 #include "pgpMacMemory.h"
af8bd8 #include "MacEnvirons.h"
ad85c2 #include "MacStrings.h"
91af5a
7e69be #include "CGAProgressDialog.h"
f9af5a
43cebe const PaneIDT¤  kCancelButtonPaneID¤¤   = 'bCan';
34b251 const PaneIDT¤  kProgressCaptionPaneID¤ = 'Capt';
0d4507 const PaneIDT¤  kProgressBarPaneID¤ ¤   = 'PBar';
0aaf5a
ceaf5a
91af5a
ef7d58 CGAProgressDialog::CGAProgressDialog()
f4bb36 {
fece6b ¤   mTotalOps ¤ ¤   = 0;
9549ab ¤   mCompletedOps¤  = 0;
42efe6 }
20af5a
3a0031 CGAProgressDialog::CGAProgressDialog(LStream *inStream)
431fb6 ¤   : LGADialog(inStream)
c7bb36 {
2bce6b ¤   mTotalOps ¤ ¤   = 0;
0149ab ¤   mCompletedOps¤  = 0;
d1efe6 }
5baf5a
3e5dd8 CGAProgressDialog::~CGAProgressDialog()
1abb36 {
64efe6 }
eaaf5a
51af5a
ac6d52 ¤   void
4e0490 CGAProgressDialog::FinishCreateSelf(void)
c5bb36 {
c7893a ¤   LGADialog::FinishCreateSelf();
cd67c5 ¤
5d5627 ¤   if( HaveAppearanceMgr() )
54c7a1 ¤   {
ccccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
604594 ¤   ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
439371 ¤   }
531b52 ¤   ¤
6388d2 ¤   mProgressBarObj = (LProgressBar *) FindPaneByID( kProgressBarPaneID );
d6886b ¤   pgpAssertAddrValid( mProgressBarObj, VoidAlign );·
fdefe6 }
d2af5a
ed6d52 ¤   void
55203d CGAProgressDialog::ApplyForeAndBackColors(void) const
fdbb36 {
635627 ¤   if( HaveAppearanceMgr() )
8fc7a1 ¤   {
b6ccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
818188 ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
929371 ¤   }
010e24 ¤   else
35c7a1 ¤   {
49c77b ¤   ¤   LGADialog::ApplyForeAndBackColors();
0e9371 ¤   }
--721e 000e4eaeab5401201fe Page 2 of CGAProgressDialog.cp
7aefe6 }
46af5a
d8220f //¤ Sets the text of the description above the progress bar.
77af5a
6b6d52 ¤   void
b416f8 CGAProgressDialog::SetCaption(ConstStr255Param caption)
abbb36 {
4a2905 ¤   LStaticText¤*captionObj;
da67c5 ¤
e4c591 ¤   pgpAssertAddrValid( caption, uchar );
a267c5 ¤
fb722c ¤   captionObj = (LStaticText *) FindPaneByID( kProgressCaptionPaneID );
01301f ¤   pgpAssertAddrValid( captionObj, VoidAlign );
0567c5 ¤
48499a ¤   captionObj->SetDescriptor( caption );
50efe6 }
c6af5a
03af5a
f797aa //¤ Sets the title of the "Cancel" button.
b4af5a
b36d52 ¤   void
863cbe CGAProgressDialog::SetButtonTitle(ConstStr255Param title)
55bb36 {
a7fa1e ¤   LPushButton¤*buttonObj;
4567c5 ¤
08be8e ¤   pgpAssertAddrValid( title, uchar );
7267c5 ¤
7a255b ¤   buttonObj = (LPushButton *) FindPaneByID( kCancelButtonPaneID );
59f1ca ¤   pgpAssertAddrValid( buttonObj, VoidAlign );
af67c5 ¤
25aef7 ¤   buttonObj->SetDescriptor( title );
ccefe6 }
27af5a
91af5a
f36d52 ¤   void
3f843a CGAProgressDialog::SetPercentComplete(UInt32 percentComplete)
c7bb36 {
106d28 ¤   pgpAssertAddrValid( mProgressBarObj, VoidAlign );
7467c5 ¤
49e88c ¤   mProgressBarObj->SetValue( percentComplete );
36efe6 }
9daf5a
83af5a
e26d52 ¤   void
fd01ec CGAProgressDialog::SetTotalOperations(UInt32 totalOps)
44bb36 {
39918c ¤   mTotalOps = totalOps;
63efe6 }
a3af5a
d2af5a
0c6d52 ¤   void
1c7543 CGAProgressDialog::SetCompletedOperations(UInt32 completedOps)
62bb36 {
02d8e6 ¤   UInt32¤ percentComplete;
9067c5 ¤
54d19a ¤   pgpAssert( mTotalOps != 0 );
4e67c5 ¤
242ec9 ¤   mCompletedOps = completedOps;
af72f9 ¤   if( mCompletedOps > mTotalOps )
51dff1 ¤   ¤   mCompletedOps = mTotalOps;
b41b52 ¤   ¤
de862f ¤   percentComplete = (UInt32)
7f19ba ¤   ¤   (( (float) mCompletedOps * 100.0 ) / (float) mTotalOps);
6967c5 ¤
c389c6 ¤   SetPercentComplete( percentComplete );
87efe6 }
4caf5a
806d52 ¤   void
012c8a CGAProgressDialog::AddCompletedOperations(UInt32 completedOps)
d6bb36 {
2b69a7 ¤   SetCompletedOperations( mCompletedOps + completedOps );
e4efe6 }
--5595 00157b89dc9401201fe Page 3 of CGAProgressDialog.cp
e0af5a
2c6d52 ¤   void
3376e9 CGAProgressDialog::SetIndeterminateFlag(Boolean inIsIndeterminate)
d5bb36 {
a36d28 ¤   pgpAssertAddrValid( mProgressBarObj, VoidAlign );
f9af5a
be0dc4 ¤   mProgressBarObj->SetIndeterminateFlag( inIsIndeterminate );
a5efe6 }
48af5a
45af5a
3e7e69 ¤   Boolean
c3c0fc CGAProgressDialog::IsIndeterminate(void) const
3dbb36 {
0e6d28 ¤   pgpAssertAddrValid( mProgressBarObj, VoidAlign );
e467c5 ¤
489d55 ¤   return( mProgressBarObj->IsIndeterminate() );
57efe6 }
--2081 001fe15008f401201ff Page 1 of CGAProgressDialog.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
3c7480 ¤   $Id: CGAProgressDialog.h,v 1.6.12.1 1998/11/12 03:18:56 heller Exp $
9bf7f7 ____________________________________________________________________________*/
687b7d #pragma once
5faf5a
c5f0a0 #include <LGADialog.h>
2caf5a
e791ec const short¤¤   kProgressDialogResID = 31600;
acaf5a
6579e9 class LProgressBar;
dfaf5a
5b09b0 class CGAProgressDialog : public LGADialog
79bb36 {
565ed4 public:
45af5a
3b5a61 ¤   enum { class_ID = 'PrgD' };
4b67c5 ¤
6b3a2b ¤   ¤   ¤   ¤   ¤   CGAProgressDialog();
1248c5 ¤   virtual¤¤   ¤   ~CGAProgressDialog();
7d1f1c ¤   ¤   ¤   ¤   ¤   CGAProgressDialog(LStream *inStream);
ba67c5 ¤
f6cae0 ¤   virtual¤void¤   AddCompletedOperations(UInt32 completedOps);
0c6bbe ¤   virtual void¤   ApplyForeAndBackColors() const;
eda98e ¤   virtual Boolean¤IsIndeterminate(void) const;
abd60f ¤   virtual¤void¤   SetButtonTitle(ConstStr255Param title);
70cccb ¤   virtual¤void¤   SetCaption(ConstStr255Param caption);
009174 ¤   virtual¤void¤   SetCompletedOperations(UInt32 completedOps);
791efb ¤   virtual¤void¤   SetPercentComplete(UInt32 percentComplete);
748cd1 ¤   virtual¤void¤   SetTotalOperations(UInt32 totalOps);
7f41c8 ¤   virtual void¤   SetIndeterminateFlag(Boolean inIsIndeterminate);
1c67c5 ¤
9ba2d3 protected:
d9af5a
8fa2f8 ¤   virtual void¤   FinishCreateSelf(void);
85af5a
580fb9 private:
0caf5a
ee7790 ¤   LProgressBar¤   *mProgressBarObj;
130275 ¤   UInt32¤ ¤   ¤   mTotalOps;
8e23ab ¤   UInt32¤ ¤   ¤   mCompletedOps;
fe82f7 };
--30db 000cd5d609540120200 Page 1 of CPGPModalGrafPortView.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
dc6ab2 ¤   This class implements a PowerPlant hierarchy inside a ModalDialog.
2ab1d3 ¤   Note that the modal dialog can be moveable and/or resizeable.
1867c5 ¤
fdc0b0 ¤   $Id: CPGPModalGrafPortView.cp,v 1.19.12.1 1998/11/12 03:18:57 heller Exp $
21f7f7 ____________________________________________________________________________*/
05af5a
7e4d37 #include <LowMem.h>
07299a #include <ToolUtils.h>
3eb4df #include <Windows.h>
e143c8 #include <Balloons.h>
50af5a
30b1cb #include <ctype.h>
12af5a
27a85e #include <LArrayIterator.h>
a10a93 #include <LPeriodical.h>
b4d797 #include <LPushButton.h>
d07b32 #include <PP_KeyCodes.h>
85dd56 #include <PP_Messages.h>
1de8ae #include <UDrawingUtils.h>
d78f92 #include <UGAColorRamp.h>
1575de #include <UWindows.h>
8b6173 #include <LUndoer.h>
6daf5a
0b8bd8 #include "MacEnvirons.h"
43090b #include "MacEvents.h"
8a85c2 #include "MacStrings.h"
8d5c50 #include "MacMenus.h"
1faf5a
15fcb1 #include "CPGPModalGrafPortView.h"
b80d08 #include "pgpMem.h"
48af5a
410814 #ifndef CreateRootControl
e0a258 ¤   #error CreateRootControl must be overriden for this class to work correctly
107454 #endif
a8af5a
70cecb const PaneIDT¤  kOKButtonPaneID¤¤   ¤   ¤   = 'bOK ';
89a3c2 const PaneIDT¤  kCancelButtonPaneID¤¤   ¤   = 'bCAN';
f6af5a
ec9250 class¤  StUnhiliteMenu {
535ed4 public:
f073c5 ¤   ¤   ¤   ¤   ¤   ¤   StUnhiliteMenu() { }
0736b2 ¤   ¤   ¤   ¤   ¤   ¤   ~StUnhiliteMenu() { ::HiliteMenu(0); }
dc82f7 };
c5af5a
d3af5a
f3c68c struct EnabledItem {
e2b578 ¤   MenuHandle¤ menu;
223a86 ¤   SInt16¤ ¤   item;
0a82f7 };
13af5a
20af5a
0411d2 typedef struct SavedWindowBitsInfo
c2bb36 {
05b621 ¤   SavedWindowBitsInfo¤*next;
969f19 ¤   WindowRef¤  ¤   ¤   windowRef;
9c5284 ¤   ushort¤ ¤   ¤   ¤   bitDepth;
6756f7 ¤   Rect¤   ¤   ¤   ¤   bitsRect;¤  // In window coordinates
7536bf ¤   GWorldPtr¤  ¤   ¤   gWorld;
40af5a
c90c9d } SavedWindowBitsInfo;
0aaf5a
beaf5a
9faf9a static CPGPModalGrafPortView¤   *sViewList ¤¤   ¤   ¤   = NULL;
fdaf5a
0afe81 CPGPModalGrafPortView::CPGPModalGrafPortView(LStream *inStream)
f7df4f ¤   ¤   : LGrafPortView(inStream), LListener()
99bb36 {
cdac8a ¤   mDismissMessage ¤   ¤   ¤   = msg_Nothing;
--ff53 00064706b7540120200 Page 2 of CPGPModalGrafPortView.cp
73bba1 ¤   mInvalidWindowList¤ ¤   ¤   = new LArray( sizeof( WindowRef ) );
e0eb88 ¤   mWindowIsMoveable¤  ¤   ¤   = FALSE;
6760fc ¤   mWindowIsResizeable¤¤   ¤   = FALSE;
205dd2 ¤   mSaveRestoreWindowBits¤ ¤   = FALSE;
7d1063 ¤   mMinMaxSize.top¤¤   ¤   ¤   = 0;
6e0689 ¤   mMinMaxSize.left¤   ¤   ¤   = 0;
7ed3df ¤   mMinMaxSize.bottom¤ ¤   ¤   = 32767;
4f8494 ¤   mMinMaxSize.right¤  ¤   ¤   = 32767;
ecc728 ¤   mSavedWindowBitsList¤   ¤   = NULL;
28e0e9 ¤   mMoveOnlyUserZoom¤  ¤   ¤   = FALSE;
738661 ¤   mLastIdleTicks¤ ¤   ¤   ¤   = 0;
ea7515 ¤   mDialogError¤   ¤   ¤   ¤   = kPGPError_NoErr;
852c47 ¤   mEnabledMenuItems¤  ¤   ¤   = new LArray( sizeof( EnabledItem ) );
c5fdc2 ¤   mEditMenu¤  ¤   ¤   ¤   ¤   = nil;
a3c44e ¤   mCutItem¤   ¤   ¤   ¤   ¤   = -1;
a10dbd ¤   mCopyItem¤  ¤   ¤   ¤   ¤   = -1;
5cd2ce ¤   mPasteItem¤ ¤   ¤   ¤   ¤   = -1;
be8155 //¤ mUndoItem¤  ¤   ¤   ¤   ¤   = -1;
2e3532 ¤   mSelectAllItem¤ ¤   ¤   ¤   = -1;
6639ce ¤   mModalFilterProc¤   ¤   ¤   = NewModalFilterProc( ModalFilterProcHandler );
9167c5 ¤
94dc10 ¤   SaveAndDisableEnabledMenus();¤
2667c5 ¤
cfd56e ¤   /* Link this view into the global view list */
44216c ¤   mNextView = sViewList;
bddfe2 ¤   sViewList = this;
0e67c5 ¤
6614df //¤ AddAttachment(new LUndoer);
1aefe6 }
22af5a
e72768 CPGPModalGrafPortView::~CPGPModalGrafPortView(void)
bebb36 {
727e90 ¤   CPGPModalGrafPortView¤  *curView;
fcab90 ¤   CPGPModalGrafPortView¤  *prevView;
f267c5 ¤
d2fe18 ¤   if( IsntNull( mInvalidWindowList ) )
ffc7a1 ¤   {
16bb79 ¤   ¤   WindowRef¤  ¤   windowRef;
64e837 ¤   ¤   GrafPtr¤¤   ¤   savePort;¤
72072f ¤   ¤   LArrayIterator¤ iterator( *mInvalidWindowList );
a01b52 ¤   ¤
607e66 ¤   ¤   GetPort( &savePort );
0b1b52 ¤   ¤
55c220 ¤   ¤   while( iterator.Next( &windowRef ) )
9c5b34 ¤   ¤   {
b66ff3 ¤   ¤   ¤   SetPort( (GrafPtr) GetWindowPort( windowRef ) );
a0a53f ¤   ¤   ¤   InvalRect( &GetWindowPort( windowRef )->portRect );
6b0fe4 ¤   ¤   }
fa1b52 ¤   ¤
bf5943 ¤   ¤   SetPort( savePort );
009371 ¤   }
acaf5a
989883 ¤   delete( mInvalidWindowList );
2567c5 ¤
f4a947 ¤   if( IsntNull( mModalFilterProc ) )
098526 ¤   ¤   DisposeRoutineDescriptor( mModalFilterProc );
b667c5 ¤
4add52 ¤   // Fix PowerPlant bug:
eaf9ce ¤   DeleteAllSubPanes();
5867c5 ¤
5d046e ¤   /* Remove this view from the global view list */
6880ea ¤   curView ¤   = sViewList;
d81f0a ¤   prevView¤   = NULL;
1b67c5 ¤
71fcff ¤   while( IsntNull( curView ) )
ddc7a1 ¤   {
d6fff9 ¤   ¤   if( curView == this )
245b34 ¤   ¤   {
33596f ¤   ¤   ¤   if( IsntNull( prevView ) )
3df776 ¤   ¤   ¤   {
7ab423 ¤   ¤   ¤   ¤   prevView->mNextView = mNextView;
64a3a6 ¤   ¤   ¤   }
--825e 00038e6387d40120200 Page 3 of CPGPModalGrafPortView.cp
b1bb8c ¤   ¤   ¤   else
89f776 ¤   ¤   ¤   {
70cc9f ¤   ¤   ¤   ¤   sViewList = mNextView;
03a3a6 ¤   ¤   ¤   }
d087c7 ¤   ¤   ¤
dfcdcb ¤   ¤   ¤   break;
da0fe4 ¤   ¤   }
251b52 ¤   ¤
badd14 ¤   ¤   prevView ¤  = curView;
027976 ¤   ¤   curView ¤   = curView->mNextView;
fd9371 ¤   }
a867c5 ¤
eb0eda ¤   if( IsntNull( mSavedWindowBitsList ) )
31c7a1 ¤   {
607ae4 ¤   ¤   SavedWindowBitsInfo¤*curInfo;
8b1b52 ¤   ¤
dfca32 ¤   ¤   curInfo = mSavedWindowBitsList;
8effa3 ¤   ¤   while( IsntNull( curInfo ) )
df5b34 ¤   ¤   {
af3153 ¤   ¤   ¤   SavedWindowBitsInfo¤*nextInfo = curInfo->next;
6487c7 ¤   ¤   ¤
e06373 ¤   ¤   ¤   if( IsntNull( curInfo->gWorld ) )
4c124b ¤   ¤   ¤   ¤   DisposeGWorld( curInfo->gWorld );
f02b85 ¤   ¤   ¤   ¤
64d8ef ¤   ¤   ¤   pgpFree( curInfo );
0e87c7 ¤   ¤   ¤
8d3275 ¤   ¤   ¤   curInfo = nextInfo;
e10fe4 ¤   ¤   }
039371 ¤   }
c967c5 ¤
34c530 ¤   if ( IsntNull (mEnabledMenuItems ) )
fbc7a1 ¤   {
a32295 ¤   ¤   RestoreEnabledMenus();
d49371 ¤   }
89d402 ¤   delete ( mEnabledMenuItems );
19efe6 }
c1af5a
256d52 ¤   void
465239 CPGPModalGrafPortView::FinishCreateSelf(void)
57bb36 {
b71733 ¤   LGrafPortView::FinishCreateSelf();
f2af5a
809b60 ¤   mOKButton = (LPushButton *) FindPaneByID( kOKButtonPaneID );
7a69ff ¤   if( IsntNull( mOKButton ) )
d0c7a1 ¤   {
e2762f ¤   ¤   mOKButton->SetDefaultButton( TRUE );
c66dd6 ¤   ¤   mOKButton->AddListener( this );
ac9371 ¤   }
31af5a
af73a9 ¤   mCancelButton = (LPushButton *) FindPaneByID( kCancelButtonPaneID );
7ac5d1 ¤   if( IsntNull( mCancelButton ) )
bcc7a1 ¤   {
16ac9a ¤   ¤   mCancelButton->AddListener(this);
0e9371 ¤   }
2e67c5 ¤
6cbb54 ¤   mSaveRestoreWindowBits = mWindowIsMoveable || mWindowIsResizeable;
98f92e ¤   if( mSaveRestoreWindowBits )
e2c7a1 ¤   {
6c4612 ¤   ¤   // This only works if the window is not visible at creation time.
731acd ¤   ¤   pgpAssert( ! IsWindowVisible( GetMacPort() ) );
c71b52 ¤   ¤
208bc0 ¤   ¤   SaveAllWindowBits();
459371 ¤   }
45af5a
747353 ¤   CalcPortFrameRect( mUserBounds );¤
358b51 ¤   PortToGlobalPoint( topLeft( mUserBounds ) );
7d3431 ¤   PortToGlobalPoint( botRight(mUserBounds ) );
b4af5a
8c58c3 ¤   mStandardSize.width ¤   = mMinMaxSize.right;
b835a4 ¤   mStandardSize.height ¤  = mMinMaxSize.bottom;
9b67c5 ¤
385627 ¤   if( HaveAppearanceMgr() )
--3ffc 000cf7e17ed40120200 Page 4 of CPGPModalGrafPortView.cp
f7c7a1 ¤   {
e6ccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
338188 ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
629371 ¤   }
e4efe6 }
edaf5a
276d52 ¤   void
506c01 CPGPModalGrafPortView::GetForeAndBackColors(
5c404d ¤   RGBColor¤   *outForeColor,
36ec95 ¤   RGBColor¤   *outBackColor) const
e6bb36 {
360a34 ¤   if( IsntNull( outForeColor ) )
54c7a1 ¤   {
d3971e ¤   ¤   *outForeColor = mForeColor;
129371 ¤   }
5e67c5 ¤
84105b ¤   if( IsntNull( outBackColor ) )
d5c7a1 ¤   {
118162 ¤   ¤   *outBackColor = mBackColor;
c69371 ¤   }
c1efe6 }
69af5a
7b6d52 ¤   void
3163c3 CPGPModalGrafPortView::ApplyForeAndBackColors(void) const
abbb36 {
395627 ¤   if( HaveAppearanceMgr() )
b3c7a1 ¤   {
91ccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
0f8188 ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
6b9371 ¤   }
770e24 ¤   else
e6c7a1 ¤   {
d3e980 ¤   ¤   LGrafPortView::ApplyForeAndBackColors();
7c9371 ¤   }
ceefe6 }
b6af5a
246d52 ¤   void
7e67e5 CPGPModalGrafPortView::SaveWindowBits(WindowRef theWindow)
b2bb36 {
08a9da ¤   Rect¤   ¤   ¤   ¤   visRect;
433c88 ¤   StColorPortState¤   portState( theWindow );
cf67c5 ¤
e07145 ¤   portState.Normalize();
8551e1 ¤   SetOrigin( 0, 0 );
5a67c5 ¤
4a2a8c ¤   visRect = (**theWindow->visRgn).rgnBBox;
5267c5 ¤
fbc7a1 ¤   {
f9c984 ¤   ¤   StDeviceLoop¤   devLoop( visRect );¤¤
d577ad ¤   ¤   SInt16¤ ¤   ¤   depth;
1b1b52 ¤   ¤
db3977 ¤   ¤   while( devLoop.NextDepth( depth ) )
935b34 ¤   ¤   {
3de140 ¤   ¤   ¤   SavedWindowBitsInfo¤*info;
8787c7 ¤   ¤   ¤
fd2726 ¤   ¤   ¤   info = (SavedWindowBitsInfo *) pgpAlloc( sizeof( *info ) );
01947d ¤   ¤   ¤   if( IsntNull( info ) )
daf776 ¤   ¤   ¤   {
baaadd ¤   ¤   ¤   ¤   QDErr¤  qdErr;
de39f9 ¤   ¤   ¤   ¤   Boolean¤addToList = FALSE;
c62b85 ¤   ¤   ¤   ¤
75fc18 ¤   ¤   ¤   ¤   // Clipping region is setup for the part of this window at
712e87 ¤   ¤   ¤   ¤   // this depth. Copy away the bits.
742b85 ¤   ¤   ¤   ¤
925888 ¤   ¤   ¤   ¤   pgpClearMemory( info, sizeof( *info ) );
c52b85 ¤   ¤   ¤   ¤
30e6c3 ¤   ¤   ¤   ¤   info->windowRef¤= theWindow;
153828 ¤   ¤   ¤   ¤   info->bitDepth ¤= depth;
bba084 ¤   ¤   ¤   ¤   info->bitsRect¤ = (**theWindow->clipRgn).rgnBBox;
9baf5a
f9054e ¤   ¤   ¤   ¤   qdErr = NewGWorld( &info->gWorld, depth, &info->bitsRect,
cfa60a ¤   ¤   ¤   ¤   ¤   ¤   ¤   NULL, devLoop.GetCurrentDevice(),
--ffc6 000080e947040120200 Page 5 of CPGPModalGrafPortView.cp
3e5157 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pixPurge | noNewDevice | useTempMem );
52a5da ¤   ¤   ¤   ¤   if( qdErr == noErr )
2072c3 ¤   ¤   ¤   ¤   {
8a3fc9 ¤   ¤   ¤   ¤   ¤   if( LockPixels( info->gWorld->portPixMap ) )
6e4859 ¤   ¤   ¤   ¤   ¤   {
1abe5a ¤   ¤   ¤   ¤   ¤   ¤   CopyBits( ¤ &theWindow->portBits,
be1171 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &((GrafPtr) info->gWorld)->portBits,
3a8df2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &info->bitsRect, &info->bitsRect,
7aec39 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   srcCopy, NULL );
4494aa ¤   ¤   ¤   ¤   ¤   ¤
be07b5 ¤   ¤   ¤   ¤   ¤   ¤   UnlockPixels( info->gWorld->portPixMap );
3b94aa ¤   ¤   ¤   ¤   ¤   ¤
76bd46 ¤   ¤   ¤   ¤   ¤   ¤   addToList = TRUE;
d51c89 ¤   ¤   ¤   ¤   ¤   }
022613 ¤   ¤   ¤   ¤   }
262b85 ¤   ¤   ¤   ¤
e309bf ¤   ¤   ¤   ¤   if( addToList )
b372c3 ¤   ¤   ¤   ¤   {
0f2ed2 ¤   ¤   ¤   ¤   ¤   info->next ¤¤   ¤   ¤   = mSavedWindowBitsList;
a1cbfd ¤   ¤   ¤   ¤   ¤   mSavedWindowBitsList¤   = info;
0d2613 ¤   ¤   ¤   ¤   }
2cfa07 ¤   ¤   ¤   ¤   else
7572c3 ¤   ¤   ¤   ¤   {
22a7b1 ¤   ¤   ¤   ¤   ¤   pgpFree( info );
05bb43 ¤   ¤   ¤   ¤   ¤   info = NULL;
db2613 ¤   ¤   ¤   ¤   }
17a3a6 ¤   ¤   ¤   }
c60fe4 ¤   ¤   }
dd9371 ¤   }
92efe6 }
9aaf5a
536d52 ¤   void
b3155f CPGPModalGrafPortView::SaveAllWindowBits(void)
51bb36 {
919056 ¤   WindowRef¤  theWindow;
2d67c5 ¤
e7d088 ¤   // Walk the window list of the current app and remember contents
f227ec ¤   // of the visible windows.
3baf5a
fc55b0 ¤   theWindow = LMGetWindowList();
553667 ¤   while( IsntNull( theWindow ) )
60c7a1 ¤   {
f54cdf ¤   ¤   if( IsWindowVisible( theWindow ) &&
83c01b ¤   ¤   ¤   theWindow != GetMacPort() &&
8e5cd8 ¤   ¤   ¤   IsntNull( theWindow->visRgn ) &&
5c4dce ¤   ¤   ¤   ! EmptyRgn( theWindow->visRgn ) )
b65b34 ¤   ¤   {
aa1ef6 ¤   ¤   ¤   SaveWindowBits( theWindow );
790fe4 ¤   ¤   }
2a1b52 ¤   ¤
b616d0 ¤   ¤   theWindow = (WindowRef) ((WindowPeek) theWindow)->nextWindow;
b99371 ¤   }
4fefe6 }
deaf5a
2e6d52 ¤   void
85791c CPGPModalGrafPortView::RestoreWindowBits(WindowRef theWindow)
8cbb36 {
33f92e ¤   if( mSaveRestoreWindowBits )
04c7a1 ¤   {
1b48eb ¤   ¤   CGrafPtr¤   savePort;
3b4046 ¤   ¤   GDHandle¤   saveGDevice;
981a7e ¤   ¤   Rect¤   ¤   visRect;
451b52 ¤   ¤
65e1ce ¤   ¤   GetGWorld( &savePort, &saveGDevice );
ecaf5a
c17811 ¤   ¤   visRect = (**theWindow->visRgn).rgnBBox;
d85b34 ¤   ¤   {
1b86ba ¤   ¤   ¤   StDeviceLoop¤   devLoop( visRect );¤¤
f2fbd2 ¤   ¤   ¤   SInt16¤ ¤   ¤   depth;
5287c7 ¤   ¤   ¤
742127 ¤   ¤   ¤   while( devLoop.NextDepth( depth ) )
08f776 ¤   ¤   ¤   {
--f1c0 000fdb0e4f840120200 Page 6 of CPGPModalGrafPortView.cp
adef0c ¤   ¤   ¤   ¤   SavedWindowBitsInfo¤*info;
d62b85 ¤   ¤   ¤   ¤
e5824a ¤   ¤   ¤   ¤   // Find an info record for this window at this depth
5e2b85 ¤   ¤   ¤   ¤
e5a591 ¤   ¤   ¤   ¤   info = mSavedWindowBitsList;
a0d694 ¤   ¤   ¤   ¤   while( IsntNull( info ) )
5872c3 ¤   ¤   ¤   ¤   {
0f153a ¤   ¤   ¤   ¤   ¤   if( info->windowRef == theWindow &&
74dbde ¤   ¤   ¤   ¤   ¤   ¤   info->bitDepth == depth )
274859 ¤   ¤   ¤   ¤   ¤   {
ef00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
ce1c89 ¤   ¤   ¤   ¤   ¤   }
38ae30 ¤   ¤   ¤   ¤   ¤
e8b4a3 ¤   ¤   ¤   ¤   ¤   info = info->next;
a92613 ¤   ¤   ¤   ¤   }
7e2b85 ¤   ¤   ¤   ¤
68d58e ¤   ¤   ¤   ¤   if( IsntNull( info ) )
5f72c3 ¤   ¤   ¤   ¤   {
f03fc9 ¤   ¤   ¤   ¤   ¤   if( LockPixels( info->gWorld->portPixMap ) )
af4859 ¤   ¤   ¤   ¤   ¤   {
5eec14 ¤   ¤   ¤   ¤   ¤   ¤   CopyBits( ¤ &((GrafPtr) info->gWorld)->portBits,
3b595b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theWindow->portBits,·
318df2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &info->bitsRect, &info->bitsRect,
73ec39 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   srcCopy, NULL );
8994aa ¤   ¤   ¤   ¤   ¤   ¤
7d07b5 ¤   ¤   ¤   ¤   ¤   ¤   UnlockPixels( info->gWorld->portPixMap );
d81c89 ¤   ¤   ¤   ¤   ¤   }
452613 ¤   ¤   ¤   ¤   }
14a3a6 ¤   ¤   ¤   }
3b0fe4 ¤   ¤   }
beaf5a
56ad56 ¤   ¤   SetGWorld( savePort, saveGDevice );
6f9371 ¤   }
05efe6 }
abaf5a
036d52 ¤   void
2a4a65 CPGPModalGrafPortView::ListenToMessage(MessageT inMessage, void *ioParam)
afbb36 {
34c58e ¤   #pragma unused( ioParam )
4667c5 ¤
d8769e ¤   switch( inMessage )
dec7a1 ¤   {
c8d8ba ¤   ¤   case msg_OK:
ad5686 ¤   ¤   case msg_Cancel:
1c2e38 ¤   ¤   ¤   SetDismissMessage( inMessage );
f5cdcb ¤   ¤   ¤   break;
8a9371 ¤   }
06efe6 }
13af5a
167e69 ¤   Boolean
34dfed CPGPModalGrafPortView::HandleKeyPress(const EventRecord&¤   inKeyEvent)
08bb36 {
9faf22 ¤   Boolean¤¤   keyHandled = TRUE;
3fbea0 ¤   Int16¤  ¤   theKey = inKeyEvent.message & charCodeMask;
6e67c5 ¤
bcadaf ¤   if( (inKeyEvent.modifiers & cmdKey) != 0 )
18c7a1 ¤   {
68d103 ¤   ¤   // Handle Cmd-. to abort the dialog.
134cc9 ¤   ¤   switch( theKey )
105b34 ¤   ¤   {
090f68 ¤   ¤   ¤   case '.':
d7f776 ¤   ¤   ¤   {
6290b2 ¤   ¤   ¤   ¤   if( IsntNull( mCancelButton ) )
3272c3 ¤   ¤   ¤   ¤   {
86c30d ¤   ¤   ¤   ¤   ¤   mCancelButton->SimulateHotSpotClick( kControlButtonPart );
7c37ea ¤   ¤   ¤   ¤   ¤   SetDismissMessage( msg_Cancel );
c62613 ¤   ¤   ¤   ¤   }
452b85 ¤   ¤   ¤   ¤
01f622 ¤   ¤   ¤   ¤   break;
a1a3a6 ¤   ¤   ¤   }
282b85 ¤   ¤   ¤   ¤
fddb68 ¤   ¤   ¤   default:
--08fd 000a4a2864e40120200 Page 7 of CPGPModalGrafPortView.cp
4f4463 ¤   ¤   ¤   ¤   keyHandled = LGrafPortView::HandleKeyPress( inKeyEvent );
64f622 ¤   ¤   ¤   ¤   break;
730fe4 ¤   ¤   }
249371 ¤   }
5a0e24 ¤   else
4ac7a1 ¤   {
5f4cc9 ¤   ¤   switch( theKey )
9a5b34 ¤   ¤   {
f7bce9 ¤   ¤   ¤   case char_Return:
783362 ¤   ¤   ¤   case char_Enter:
0cf776 ¤   ¤   ¤   {
5b2fff ¤   ¤   ¤   ¤   if( IsntNull( mOKButton ) && mOKButton->IsEnabled() )
4a72c3 ¤   ¤   ¤   ¤   {
add669 ¤   ¤   ¤   ¤   ¤   mOKButton->SimulateHotSpotClick( kControlButtonPart );
c8d444 ¤   ¤   ¤   ¤   ¤   SetDismissMessage( msg_OK );
7b2613 ¤   ¤   ¤   ¤   }
58f622 ¤   ¤   ¤   ¤   break;
faa3a6 ¤   ¤   ¤   }
e82b85 ¤   ¤   ¤   ¤
23417a ¤   ¤   ¤   case char_Escape:
6af776 ¤   ¤   ¤   {
4d90b2 ¤   ¤   ¤   ¤   if( IsntNull( mCancelButton ) )
8f72c3 ¤   ¤   ¤   ¤   {
45c30d ¤   ¤   ¤   ¤   ¤   mCancelButton->SimulateHotSpotClick( kControlButtonPart );
2937ea ¤   ¤   ¤   ¤   ¤   SetDismissMessage( msg_Cancel );
5b2613 ¤   ¤   ¤   ¤   }
38f622 ¤   ¤   ¤   ¤   break;
6da3a6 ¤   ¤   ¤   }
9887c7 ¤   ¤   ¤
40db68 ¤   ¤   ¤   default:
774463 ¤   ¤   ¤   ¤   keyHandled = LGrafPortView::HandleKeyPress( inKeyEvent );
e6f622 ¤   ¤   ¤   ¤   break;
990fe4 ¤   ¤   }
ea9371 ¤   }
3b67c5 ¤
c2c022 ¤   return keyHandled;
9fefe6 }
66af5a
286d52 ¤   void
00c974 CPGPModalGrafPortView::GlobalToPortPoint(Point &ioPoint) const
9fbb36 {
147819 ¤   // This is stolen from LWindow. Apparently the CodeWarrior folks never
11e417 ¤   // tried to do dragging from a GrafPortView.
4067c5 ¤
d19da7 ¤   // Windows have a reference to the pixel image of the main screen--
4896f3 ¤   // portBits for B&W and portPixMap for color windows. The bounds
4e5201 ¤   // of the pixel image specify the alignment of the *local* Window
596674 ¤   // coordinates with *global* coordinates:
125dbe ¤   //¤ ¤   localPt = globalPt + topLeft(imageBounds)
f3a617 ¤   //
5ed08f ¤   // To convert from *local* to *port* coordinates, we offset by
12b483 ¤   // the top left of the Window's port rectangle:
a25bb5 ¤   //¤ ¤   portPt = localPt - topLeft(portRect)
faa617 ¤   //
91f85b ¤   // Therefore,
cba702 ¤   //¤ ¤   portPt = globalPt + topLeft(imageBounds) - topLeft(portRect)
17a617 ¤   //
ef4259 ¤   // Note: We don't use the Toolbox routine GlobalToLocal because
664c3d ¤   // that routine depends on the current port and the current port
fd7121 ¤   // origin. To use GlobalToLocal we would have to do the following:
19c5f5 ¤   //¤ ¤   GrafPtr savePort;
f07bdd ¤   //¤ ¤   GetPort(&savePort);
0cdf12 ¤   //¤ ¤   Point¤  saveOrigin = topLeft(mMacWindowP->portRect);
f89b47 ¤   //¤ ¤   SetPort(mMacWindowP);
810033 ¤   //¤ ¤   SetOrigin(0,0);
fa95e8 ¤   //¤ ¤   GlobalToLocal(ioPoint);
ddc6e9 ¤   //¤ ¤   SetOrigin(saveOrigin.h, saveOrigin.v);
5d6412 ¤   //¤ ¤   SetPort(savePort);
40ceee ¤   // The equation above avoids all this saving/setting/restoring
278c4b ¤   // of the current port and port origin.
6aaf5a
a46db6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Assume a B&W Window
--2041 000989927d140120200 Page 8 of CPGPModalGrafPortView.cp
536c30 ¤   Point¤  localOffset = topLeft(mGrafPtr->portBits.bounds);
427170 ¤   if (UDrawingUtils::IsColorGrafPort(mGrafPtr))
76c7a1 ¤   {
575f33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Nope, it's a color Window
868e11 ¤   ¤   CGrafPtr¤   colorPortP = (CGrafPtr) mGrafPtr;
6e8909 ¤   ¤   localOffset = topLeft((**(colorPortP->portPixMap)).bounds);
2e9371 ¤   }
9b67c5 ¤
15b99b ¤   ioPoint.h += (localOffset.h - mGrafPtr->portRect.left);
0d78a4 ¤   ioPoint.v += (localOffset.v - mGrafPtr->portRect.top);
a4efe6 }
3aaf5a
296d52 ¤   void
1b144e CPGPModalGrafPortView::PortToGlobalPoint(Point &ioPoint) const
19bb36 {
2a6db6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Assume a B&W Window
156c30 ¤   Point¤  localOffset = topLeft(mGrafPtr->portBits.bounds);
8059bd ¤   if (UDrawingUtils::IsColorGrafPort(mGrafPtr)) {
765f33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Nope, it's a color Window
018e11 ¤   ¤   CGrafPtr¤   colorPortP = (CGrafPtr) mGrafPtr;
0f8909 ¤   ¤   localOffset = topLeft((**(colorPortP->portPixMap)).bounds);
449371 ¤   }
bb67c5 ¤
f282fc ¤   ioPoint.h -= (localOffset.h - mGrafPtr->portRect.left);
cfcc3e ¤   ioPoint.v -= (localOffset.v - mGrafPtr->portRect.top);
27efe6 }
78af5a
426d52 ¤   void
919464 CPGPModalGrafPortView::DoIdle(const EventRecord &inMacEvent)
80bb36 {
6d11bf ¤   UInt32¤ ticks = TickCount();
9167c5 ¤
5d9e2a ¤   if( mLastIdleTicks < ticks )
68c7a1 ¤   {
764502 ¤   ¤   Point¤  portMouse;
ebfe54 ¤   ¤   Rect¤   viewRect;
621b52 ¤   ¤
785a37 ¤   ¤   LGrafPortView::DoIdle( inMacEvent );
411b52 ¤   ¤
a67492 ¤   ¤   portMouse = inMacEvent.where;
d3362a ¤   ¤   GlobalToPortPoint( portMouse );
cb8142 ¤   ¤   CalcLocalFrameRect( viewRect );
e31b52 ¤   ¤
5c787e ¤   ¤   if( PtInRect( portMouse, &viewRect) )
755b34 ¤   ¤   {
d01ca7 ¤   ¤   ¤   AdjustCursor( portMouse, inMacEvent );
7f0fe4 ¤   ¤   }
541b52 ¤   ¤
12c30b ¤   ¤   mLastIdleTicks = ticks;
8d9371 ¤   }
e5efe6 }
37af5a
0c6d52 ¤   void
dc2a40 CPGPModalGrafPortView::RememberInvalidWindow(WindowRef theWindow)
45bb36 {
cbeded ¤   if( IsntNull( theWindow ) && IsntNull( mInvalidWindowList ) )
30c7a1 ¤   {
77f653 ¤   ¤   if( mInvalidWindowList->FetchIndexOf( &theWindow ) ==
2d0f26 ¤   ¤   ¤   ¤   ¤   LArray::index_Bad )
ad5b34 ¤   ¤   {
cc5f5d ¤   ¤   ¤   mInvalidWindowList->InsertItemsAt( 1, max_Int32, &theWindow );
7d0fe4 ¤   ¤   }
109371 ¤   }
3eefe6 }
1baf5a
5e6d52 ¤   void
4428a3 CPGPModalGrafPortView::Draw(RgnHandle¤  inSuperDrawRgnH)
92bb36 {
039ecb ¤   FocusDraw();
91c94e ¤   ApplyForeAndBackColors();
d7af5a
983db3 ¤   LGrafPortView::Draw(inSuperDrawRgnH);
--d594 000ee1e720040120200 Page 9 of CPGPModalGrafPortView.cp
e0af5a
75e59e ¤   if( mWindowIsResizeable )
f4c7a1 ¤   {
e826d9 ¤   ¤   Rect¤   sizeBox;
191b52 ¤   ¤
8823d2 ¤   ¤   sizeBox ¤   ¤   = GetMacPort()->portRect;
f021a9 ¤   ¤   sizeBox.left ¤  = sizeBox.right - 15;
371eb4 ¤   ¤   sizeBox.top ¤   = sizeBox.bottom - 15;
571b52 ¤   ¤
878698 ¤   ¤   /* Draw the window grow icon without the scroll bar borders */
271b52 ¤   ¤
9380cf ¤   ¤   StClipRgnState¤ saveClip( sizeBox );
d6ca86 ¤   ¤   DrawGrowIcon( GetMacPort() );
599371 ¤   }
b8efe6 }
7baf5a
4c6d52 ¤   void
299c6f CPGPModalGrafPortView::UpdatePort(void)
0abb36 {
c19ecb ¤   FocusDraw();
2dc94e ¤   ApplyForeAndBackColors();
a267c5 ¤
96dcde ¤   LGrafPortView::UpdatePort();
8defe6 }
fcaf5a
514c71 ¤   DialogRef
66056b CPGPModalGrafPortView::GetDialog(void)
c6bb36 {
94a1ac ¤   return( (DialogRef) GetUserCon() );
5cefe6 }
eeaf5a
7d4c71 ¤   DialogRef
5f3900 CPGPModalGrafPortView::CreateDialog(ResIDT dialogResID)
50bb36 {
9900ff ¤   DialogRef¤  ¤   theDialog;
19e622 ¤   MenuHandle¤ ¤   appleMenu;
c6b38c ¤   Boolean¤¤   ¤   appleMenuEnabled = FALSE;
3267c5 ¤
d3ca97 ¤   FlushEvents( everyEvent, 0 );
d8af5a
c3872b ¤   // Take control of menu handling
0daf5a
e58e1e ¤   appleMenu = GetIndMenuInMenuBar(0);
6f750c ¤   if( IsntNull( appleMenu ) )
c8c7a1 ¤   {
327abe ¤   ¤   appleMenuEnabled = IsMenuItemEnabled(appleMenu, 0);
12af5a
696d91 ¤   ¤   ::HiliteMenu(0);
4f2a3e ¤   ¤   ::DisableItem( appleMenu, 0 );
699371 ¤   }
7367c5 ¤
8fa37e ¤   theDialog = GetNewDialog( dialogResID, NULL, (WindowRef) -1L );
e3af5a
aef672 ¤   // Reenable apple menu for the moment
2dd9ae ¤   if (appleMenuEnabled)
abc7a1 ¤   {
48736c ¤   ¤   ::EnableItem( appleMenu, 0 );
f89371 ¤   }
3967c5 ¤
018578 ¤   if( IsntNull( theDialog ) )
c858c8 ¤   {¤  ¤
6b4809 ¤   ¤   CPGPModalGrafPortView¤  *dialogObj;
7a0ee7 ¤   ¤   RGBColor¤   ¤   ¤   ¤   backColor;
1d532d ¤   ¤   RGBColor¤   ¤   ¤   ¤   foreColor;
baaf5a
b98622 ¤   ¤   SetPort( theDialog );
ceaf5a
911b17 ¤   ¤   /*
931cdf ¤   ¤   ** LGrafPortView::CreateGrafPortView() preserves the background
fa444f ¤   ¤   ** color of the window, but it calls LGrafPortView::FinishCreate()
2200d5 ¤   ¤   ** while the background color is whacked. So, grab the color here
ee3a06 ¤   ¤   ** and pass to the dialog object after calling CreateGrafPortView
--5e56 000e419c79f40120200 Page 10 of CPGPModalGrafPortView.cp
675c12 ¤   ¤   */
d51b52 ¤   ¤
0a3ff5 ¤   ¤   GetForeColor( &foreColor );
1d51b9 ¤   ¤   GetBackColor( &backColor );
94af5a
b5b1b0 ¤   ¤   ++gPGPDisableCreateRootControlCount;
c31b52 ¤   ¤
8f4b37 ¤   ¤   dialogObj = (CPGPModalGrafPortView *)
61f39d ¤   ¤   ¤   ¤   ¤   LGrafPortView::CreateGrafPortView( dialogResID, NULL );
94edd5 ¤   ¤   if( IsntNull( dialogObj ) )
445b34 ¤   ¤   {
3c6e62 ¤   ¤   ¤   dialogObj->SetForeAndBackColors( &foreColor, &backColor );
0087c7 ¤   ¤   ¤
440d92 ¤   ¤   ¤   SetWRefCon( theDialog, (long) dialogObj );
356eac ¤   ¤   ¤   dialogObj->SetUserCon( (SInt32) theDialog );
c487c7 ¤   ¤   ¤
9fc7fd ¤   ¤   ¤   LPane::SetDefaultView( dialogObj );
130fe4 ¤   ¤   }
f90e1d ¤   ¤   else
e75b34 ¤   ¤   {
cfabfb ¤   ¤   ¤   DisposeDialog( theDialog );
ac8d04 ¤   ¤   ¤   theDialog = NULL;
0f0fe4 ¤   ¤   }
221b52 ¤   ¤
39c5d0 ¤   ¤   --gPGPDisableCreateRootControlCount;
759371 ¤   }
3d67c5 ¤
8c5a2f ¤   return( theDialog );
50efe6 }
a7af5a
326d52 ¤   void
9f5623 CPGPModalGrafPortView::ResizeWindowTo(
2f510f ¤   Int16¤  newWidth,
38dc85 ¤   Int16¤  newHeight)
c8bb36 {
aa59e9 ¤   SDimension16¤   frameSize;
8067c5 ¤
805457 ¤   SizeWindow( GetMacPort(), newWidth, newHeight, TRUE );
1574aa ¤   ResizeFrameTo( newWidth, newHeight, TRUE);
2faf5a
ff6ede ¤   GetFrameSize( frameSize );
f0a48f ¤   ResizeImageTo( frameSize.width, frameSize.height, FALSE );
e9af5a
727353 ¤   CalcPortFrameRect( mUserBounds );¤
1b8b51 ¤   PortToGlobalPoint( topLeft( mUserBounds ) );
bb3431 ¤   PortToGlobalPoint( botRight(mUserBounds ) );
4846f6 ¤   mMoveOnlyUserZoom = false;
24efe6 }
1eaf5a
e87e69 ¤   Boolean
5a82db CPGPModalGrafPortView::ClickInGrow(
0a1c19 ¤   const EventRecord &inMacEvent)
92bb36 {
a18fff ¤   Boolean¤handled = FALSE;
e367c5 ¤
cbe59e ¤   if( mWindowIsResizeable )
e1c7a1 ¤   {
adf242 ¤   ¤   long¤   result;
231b52 ¤   ¤
aa7432 ¤   ¤   result = GrowWindow( GetMacPort(), inMacEvent.where, &mMinMaxSize );
c653fc ¤   ¤   if( result != 0 )
965b34 ¤   ¤   {
f4f6a0 ¤   ¤   ¤   ResizeWindowTo( LoWord( result ), HiWord( result ) );
900fe4 ¤   ¤   }
621b52 ¤   ¤
8caadb ¤   ¤   handled = TRUE;
099371 ¤   }
2f67c5 ¤
c91723 ¤   return( handled );
94efe6 }
ccaf5a
e47e69 ¤   Boolean
--7862 00019e2b2ce40120200 Page 11 of CPGPModalGrafPortView.cp
12a571 CPGPModalGrafPortView::ClickInDrag(
5f1c19 ¤   const EventRecord &inMacEvent)
72bb36 {
8c8fff ¤   Boolean¤handled = FALSE;
fb67c5 ¤
9ac37d ¤   if( mWindowIsMoveable )
53c7a1 ¤   {
1a65eb ¤   ¤   Rect¤   limitRect;
261b52 ¤   ¤
264a24 ¤   ¤   limitRect = (**GetGrayRgn()).rgnBBox;
ed1b52 ¤   ¤
8c939a ¤   ¤   DragWindow( GetMacPort(), inMacEvent.where, &limitRect );
031b52 ¤   ¤
ff7d1f ¤   ¤   CalcPortFrameRect( mUserBounds );¤
6ad84a ¤   ¤   PortToGlobalPoint( topLeft( mUserBounds ) );
f1672a ¤   ¤   PortToGlobalPoint( botRight(mUserBounds ) );
d7c093 ¤   ¤   mMoveOnlyUserZoom = FALSE;
781b52 ¤   ¤
2baadb ¤   ¤   handled = TRUE;
ad9371 ¤   }
e467c5 ¤
901723 ¤   return( handled );
5aefe6 }
d0af5a
92fbce // From PowerPlant:
686d52 ¤   void
3bd8fd CPGPModalGrafPortView::CalcStandardBoundsForScreen(
54121b ¤   const Rect¤ &inScreenBounds,
b692b6 ¤   Rect¤   ¤   &outStdBounds) const
8fbb36 {
ed6b2d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Structure and Content regions are
f825f9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··in global coordinates
0d9218 ¤   Rect¤   strucRect = UWindows::GetWindowStructureRect( GetMacPort() );
f4f670 ¤   Rect¤   contRect = UWindows::GetWindowContentRect( GetMacPort() );
4e67c5 ¤
234b3e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Structure can be (and usually is)
84e249 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··larger than Content
c2df23 ¤   Rect¤   border;
dbe2c2 ¤   border.left = contRect.left - strucRect.left;
716376 ¤   border.right = strucRect.right - contRect.right;
778e36 ¤   border.top = contRect.top - strucRect.top;
4a96bc ¤   border.bottom = strucRect.bottom - contRect.bottom;
96ece6 ¤   ¤   ¤   ¤   ¤   ¤   ·
90d1b3 ¤   ¤   ¤   ¤   ¤   ¤   ·¤  ¤   ¤   // Don't zoom too close to edge of screen
cf7488 ¤   Int16¤  screenWidth = inScreenBounds.right - inScreenBounds.left - 4;
a18058 ¤   Int16¤  screenHeight = inScreenBounds.bottom - inScreenBounds.top - 4;
9267c5 ¤
7f5b59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Standard dimensions are the minimum
3bdac3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··of mStandardSize and the size of
8ed695 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··the screen
05146a ¤   Int16¤  stdWidth = mStandardSize.width;
3c0f34 ¤   if (stdWidth > screenWidth - (border.left + border.right)) {
6b542b ¤   ¤   stdWidth = screenWidth - (border.left + border.right);
329371 ¤   }
d367c5 ¤
27a731 ¤   Int16¤  stdHeight = mStandardSize.height;
2d89f7 ¤   if (stdHeight > screenHeight - (border.top + border.bottom)) {
8bdf40 ¤   ¤   stdHeight = screenHeight - (border.top + border.bottom);
429371 ¤   }
eaaf5a
422e2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Standard position is the point closest
906340 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··to the current position at which
608dcf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··the Window will be all on screen
f4ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
ef9809 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Move window horizontally so that left
0f4a1f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··or right edge of Struction region is
1f8fad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··2 pixels from the edge of the screen
13de5e ¤   Int16¤  stdLeft = contRect.left;
3f555e ¤   if (stdLeft < inScreenBounds.left + border.left + 2) {
94440c ¤   ¤   stdLeft = inScreenBounds.left + border.left + 2;
278afd ¤   } else if (stdLeft > inScreenBounds.right - stdWidth - border.right - 2) {
19e5a0 ¤   ¤   stdLeft = inScreenBounds.right - stdWidth - border.right - 2;
--0324 000f6ba163340120200 Page 12 of CPGPModalGrafPortView.cp
a19371 ¤   }
9967c5 ¤
0c6745 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Move window vertically so that top
42196e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··or bottom edge of Struction region is
7b8fad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··2 pixels from the edge of the screen
e899ce ¤   Int16¤  stdTop = contRect.top;
aeb668 ¤   if (stdTop < inScreenBounds.top + border.top + 2) {
c3739f ¤   ¤   stdTop = inScreenBounds.top + border.top + 2;
800f0a ¤   } else if (stdTop > inScreenBounds.bottom - stdHeight - border.bottom - 2) {
4d4820 ¤   ¤   stdTop = inScreenBounds.bottom - stdHeight - border.bottom - 2;
6b9371 ¤   }
ca67c5 ¤
f8c937 ¤   outStdBounds.left = stdLeft;
41246c ¤   outStdBounds.right = stdLeft + stdWidth;
6d098a ¤   outStdBounds.top = stdTop;
c61fd0 ¤   outStdBounds.bottom = stdTop + stdHeight;
25efe6 }
faaf5a
a1fbce // From PowerPlant:
5baf5a
197e69 ¤   Boolean
01f775 CPGPModalGrafPortView::CalcStandardBounds(Rect &outStdBounds) const
eebb36 {
406a28 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Find GDevice containing largest
fe8b53 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··portion of Window
55b484 ¤   GDHandle¤   dominantDevice = UWindows::FindDominantDevice(
3b3c66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UWindows::GetWindowStructureRect( GetMacPort()));
55af5a
68543c ¤   if (dominantDevice == nil) {¤   // Window is offscreen, so use the
48ada3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··main scren
9e5179 ¤   ¤   dominantDevice = ::GetMainDevice();
2e9371 ¤   }
46a947 ¤   Rect¤   ¤   screenRect = (**dominantDevice).gdRect;
bc67c5 ¤
831750 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Must compensate for MenuBar on the
a113f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··main screen
bd3564 ¤   if (dominantDevice == ::GetMainDevice()) {
b6e5a4 ¤   ¤   screenRect.top += GetMBarHeight();
ff9371 ¤   }
0b67c5 ¤
ee9dae ¤   CalcStandardBoundsForScreen(screenRect, outStdBounds);
7d67c5 ¤
432a13 ¤   Rect¤   ¤   contentRect = UWindows::GetWindowContentRect( GetMacPort() );
06757a ¤   return ::EqualRect(&outStdBounds, &contentRect);
48efe6 }
36af5a
61fbce // From PowerPlant:
4caf5a
ab6d52 ¤   void
a52b11 CPGPModalGrafPortView::DoSetZoom(Boolean inZoomToStdState)
c5bb36 {
84035f ¤   Rect¤   currBounds = UWindows::GetWindowContentRect( GetMacPort() );
d51ad9 ¤   Rect¤   zoomBounds;
63af5a
41dfa5 ¤   if (inZoomToStdState) {¤¤   ¤   // Zoom to Standard state
e045e1 ¤   ¤   if (CalcStandardBounds(zoomBounds)) {
5dace9 ¤   ¤   ¤   return;¤¤   ¤   ¤   ¤   // Already at Standard state
380fe4 ¤   ¤   }
841b52 ¤   ¤
2e9f8f ¤   } else {¤   ¤   ¤   ¤   ¤   ¤   // Zoom to User state
00ac14 ¤   ¤   zoomBounds = mUserBounds;
581b52 ¤   ¤
030f11 ¤   ¤   if (mMoveOnlyUserZoom) {¤   // Special case for zooming a Window
f11942 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··that is at standard size, but
68c596 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // ··is partially offscreen
e281ff ¤   ¤   ¤   zoomBounds.right = zoomBounds.left +
fccd4a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (currBounds.right - currBounds.left);
5bd19b ¤   ¤   ¤   zoomBounds.bottom = zoomBounds.top +
fcd688 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (currBounds.bottom - currBounds.top);
6e0fe4 ¤   ¤   }
869371 ¤   }
f667c5 ¤
--8561 00027e8e29340120200 Page 13 of CPGPModalGrafPortView.cp
acbbd6 ¤   Int16¤  zoomWidth = zoomBounds.right - zoomBounds.left;
8fdf33 ¤   Int16¤  zoomHeight = zoomBounds.bottom - zoomBounds.top;
0546f6 ¤   mMoveOnlyUserZoom = false;
2b67c5 ¤
1317ec ¤   ¤   // To avoid unnecessary redraws, we check to see if the
352f60 ¤   ¤   // current and zoom states are either the same size
6eb83f ¤   ¤   // or at the same location
591b52 ¤   ¤
779d58 ¤   if ( ((currBounds.right - currBounds.left) == zoomWidth) &&
c378e1 ¤   ¤   ·((currBounds.bottom - currBounds.top) == zoomHeight) ) {
2fb870 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Same size, just move
7ec833 ¤   ¤   ::MoveWindow( GetMacPort() , zoomBounds.left, zoomBounds.top, false);
d8060f ¤   ¤   mMoveOnlyUserZoom = true;
2b67c5 ¤
8fb297 ¤   } else if (::EqualPt(topLeft(currBounds), topLeft(zoomBounds))) {
621530 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Same location, just resize
67637b ¤   ¤   ResizeWindowTo( zoomWidth, zoomHeight );
6c1b52 ¤   ¤
981a6c ¤   } else {¤   ¤   ¤   ¤   ¤   ¤   // Different size and location
5aacc2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Zoom appropriately
45df40 ¤   ¤   FocusDraw();
4cfe46 ¤   ¤   ApplyForeAndBackColors();
02ff9f ¤   ¤   ::EraseRect(&GetMacPort()->portRect);
59d81b ¤   ¤   if (inZoomToStdState) {
90d15a ¤   ¤   ¤   SetWindowStandardState(GetMacPort(), &zoomBounds);
5ef279 ¤   ¤   ¤   ::ZoomWindow(GetMacPort(), inZoomOut, false);
6f45a6 ¤   ¤   } else {
0c0765 ¤   ¤   ¤   SetWindowStandardState(GetMacPort(), &currBounds);
44f432 ¤   ¤   ¤   SetWindowUserState(GetMacPort(), &zoomBounds);
d7b9ef ¤   ¤   ¤   ::ZoomWindow(GetMacPort(), inZoomIn, false);
180fe4 ¤   ¤   }
7ebb33 ¤   ¤   ResizeFrameTo(zoomWidth, zoomHeight, false);
219371 ¤   }
32efe6 }
f9af5a
c67e69 ¤   Boolean
03cb6f CPGPModalGrafPortView::ClickInZoom(
bbe0d3 ¤   const EventRecord¤  &inMacEvent,
62e72d ¤   Int16¤  ¤   ¤   ¤   inZoomDirection)
51bb36 {
808fff ¤   Boolean¤handled = FALSE;
f667c5 ¤
dde59e ¤   if( mWindowIsResizeable )
31c7a1 ¤   {
1cf7fd ¤   ¤   if( TrackBox( GetMacPort(), inMacEvent.where, inZoomDirection ) )
135b34 ¤   ¤   {
fcde93 ¤   ¤   ¤   Rect¤   stdBounds;
575c98 ¤   ¤   ¤   Boolean¤zoomToStdState = ! CalcStandardBounds( stdBounds );
7aaf5a
fcb57a ¤   ¤   ¤   DoSetZoom( zoomToStdState );
bb87c7 ¤   ¤   ¤
6d5cbe ¤   ¤   ¤   handled = TRUE;
8d0fe4 ¤   ¤   }
439371 ¤   }
6467c5 ¤
4a1723 ¤   return( handled );
1cefe6 }
abaf5a
1a99cb ¤   pascal Boolean
fa2091 CPGPModalGrafPortView::ModalFilterProcHandler(
591e8f ¤   DialogPtr ¤ theDialog,
ad1ddb ¤   EventRecord *theEvent,
4b7a19 ¤   short ¤ ¤   *itemHit)
7fbb36 {
209631 ¤   Boolean¤¤   ¤   ¤   ¤   handled = FALSE;
670f43 ¤   CPGPModalGrafPortView ¤ *grafPortObj;
4067c5 ¤
c0cd19 ¤   *itemHit = 0;
bf67c5 ¤
a528f9 ¤   LPeriodical::DevoteTimeToRepeaters( *theEvent );
b8af5a
27811b ¤   grafPortObj¤= GetWindowGrafPortView( theDialog );
--8e31 0003da44d9840120200 Page 14 of CPGPModalGrafPortView.cp
e0af5a
66fb25 ¤   switch( theEvent->what )
d8c7a1 ¤   {
e87382 ¤   ¤   case updateEvt:
fd5b34 ¤   ¤   {
4852a6 ¤   ¤   ¤   WindowPtr¤  ¤   ¤   ¤   theWindow = (WindowPtr) theEvent->message;
a9e009 ¤   ¤   ¤   CPGPModalGrafPortView¤  *updateObj;
3c87c7 ¤   ¤   ¤
2a82e7 ¤   ¤   ¤   /* Determine if the window is one of ours */
9187c7 ¤   ¤   ¤
385cbe ¤   ¤   ¤   handled = TRUE;
bdaf5a
2d829b ¤   ¤   ¤   updateObj = GetWindowGrafPortView( theWindow );
a3910d ¤   ¤   ¤   if( IsntNull( updateObj ) )
66f776 ¤   ¤   ¤   {
250b32 ¤   ¤   ¤   ¤   updateObj->UpdatePort();
f6a3a6 ¤   ¤   ¤   }
5d55f0 ¤   ¤   ¤   else if( IsntNull( grafPortObj ) )
a1f776 ¤   ¤   ¤   {
4d4f65 ¤   ¤   ¤   ¤   // Eat the update event for another window so we do not keep
3833ab ¤   ¤   ¤   ¤   // getting it. Restore the bits if we can. Remember the
4b3017 ¤   ¤   ¤   ¤   // window so we can invalidate it later.
a72b85 ¤   ¤   ¤   ¤
bc7032 ¤   ¤   ¤   ¤   StColorPortState¤   portState( theWindow );
352b85 ¤   ¤   ¤   ¤
b7a8e1 ¤   ¤   ¤   ¤   portState.Normalize();
4e2b57 ¤   ¤   ¤   ¤   SetOrigin( 0, 0 );
b167c5 ¤
8b23e4 ¤   ¤   ¤   ¤   grafPortObj->RememberInvalidWindow( theWindow );
662b85 ¤   ¤   ¤   ¤
09625a ¤   ¤   ¤   ¤   BeginUpdate( theWindow );
3fdc3a ¤   ¤   ¤   ¤   ¤   grafPortObj->RestoreWindowBits( theWindow );
7ad865 ¤   ¤   ¤   ¤   EndUpdate( theWindow );
bda3a6 ¤   ¤   ¤   }
30bb8c ¤   ¤   ¤   else
63f776 ¤   ¤   ¤   {
09d6bc ¤   ¤   ¤   ¤   handled = FALSE;
28a3a6 ¤   ¤   ¤   }
c787c7 ¤   ¤   ¤
dbcdcb ¤   ¤   ¤   break;
b10fe4 ¤   ¤   }
ad87c7 ¤   ¤   ¤
239875 ¤   ¤   case activateEvt:
1a5b34 ¤   ¤   {
1552a6 ¤   ¤   ¤   WindowPtr¤  ¤   ¤   ¤   theWindow = (WindowPtr) theEvent->message;
1b55b8 ¤   ¤   ¤   CPGPModalGrafPortView¤  *activateObj;
33af5a
7582e7 ¤   ¤   ¤   /* Determine if the window is one of ours */
df87c7 ¤   ¤   ¤
b83d10 ¤   ¤   ¤   activateObj = GetWindowGrafPortView( theWindow );
7c1fac ¤   ¤   ¤   if( IsntNull( activateObj ) )
3ef776 ¤   ¤   ¤   {
fc6e95 ¤   ¤   ¤   ¤   if( ( theEvent->modifiers & activeFlag ) != 0 )
5872c3 ¤   ¤   ¤   ¤   {
68847b ¤   ¤   ¤   ¤   ¤   activateObj->Activate();
412613 ¤   ¤   ¤   ¤   }
66fa07 ¤   ¤   ¤   ¤   else
7472c3 ¤   ¤   ¤   ¤   {
acb7f7 ¤   ¤   ¤   ¤   ¤   activateObj->Deactivate();
842613 ¤   ¤   ¤   ¤   }
582b85 ¤   ¤   ¤   ¤
39f1e0 ¤   ¤   ¤   ¤   handled = TRUE;
cfa3a6 ¤   ¤   ¤   }
0caf5a
adcdcb ¤   ¤   ¤   break;
030fe4 ¤   ¤   }
241b52 ¤   ¤
56610b ¤   ¤   case autoKey:
cbe68f ¤   ¤   case keyDown:
fa5b34 ¤   ¤   {
509885 ¤   ¤   ¤   if( IsntNull( grafPortObj ) )
3df776 ¤   ¤   ¤   {
--3048 0008f5d9bfd40120200 Page 15 of CPGPModalGrafPortView.cp
c98b20 ¤   ¤   ¤   ¤   handled = grafPortObj->ModalFilterProc( theDialog, theEvent,
d5b03e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   itemHit );
b5a3a6 ¤   ¤   ¤   }
f5bb8c ¤   ¤   ¤   else
7af776 ¤   ¤   ¤   {
d23754 ¤   ¤   ¤   ¤   handled = StdFilterProc( theDialog, theEvent, itemHit );
6ba3a6 ¤   ¤   ¤   }
fc1b52 ¤   ¤
39cdcb ¤   ¤   ¤   break;
f70fe4 ¤   ¤   }
cc1b52 ¤   ¤
509ae3 ¤   ¤   default:
925b34 ¤   ¤   {
d29885 ¤   ¤   ¤   if( IsntNull( grafPortObj ) )
e9f776 ¤   ¤   ¤   {
588b20 ¤   ¤   ¤   ¤   handled = grafPortObj->ModalFilterProc( theDialog, theEvent,
b6b03e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   itemHit );
f8a3a6 ¤   ¤   ¤   }
2f87c7 ¤   ¤   ¤
bccdcb ¤   ¤   ¤   break;
660fe4 ¤   ¤   }
3b9371 ¤   }
fa87c7 ¤   ¤   ¤
c01723 ¤   return( handled );
0defe6 }
a5af5a
78371f ¤   CPGPModalGrafPortView *
c856ab CPGPModalGrafPortView::GetWindowGrafPortView(WindowPtr theWindow)
91bb36 {
9fcbdf ¤   CPGPModalGrafPortView¤  *targetObj = NULL;
8caf5a
deae63 ¤   targetObj = sViewList;
529080 ¤   while( IsntNull( targetObj ) )
76c7a1 ¤   {
e84c22 ¤   ¤   if( targetObj->GetDialog() == theWindow )
65cdcb ¤   ¤   ¤   break;
7687c7 ¤   ¤   ¤
1a1d18 ¤   ¤   targetObj = targetObj->mNextView;
129371 ¤   }
77af5a
85d299 ¤   return( targetObj );
26efe6 }
88af5a
c67e69 ¤   Boolean
c4ec2b CPGPModalGrafPortView::ModalFilterProc(
901e8f ¤   DialogPtr ¤ theDialog,
a61ddb ¤   EventRecord *theEvent,
e67a19 ¤   short ¤ ¤   *itemHit)
73bb36 {
bb6b90 ¤   Boolean¤¤   handled;
7ed34e ¤   MessageT¤   dismissMessage;
cb67c5 ¤
9f42e1 ¤   (void) theDialog;
2d67c5 ¤
8fe866 ¤   handled = FALSE;
5467c5 ¤
25fb25 ¤   switch( theEvent->what )
1ac7a1 ¤   {
d74ea7 ¤   ¤   case mouseDown:
a55b34 ¤   ¤   {
a6ce19 ¤   ¤   ¤   WindowPtr¤  macWindowP;
97b53c ¤   ¤   ¤   Int16¤  ¤   thePart;
ad87c7 ¤   ¤   ¤
fc902a ¤   ¤   ¤   thePart = FindWindow( theEvent->where, &macWindowP );
c58fb6 ¤   ¤   ¤   if( macWindowP == GetMacPort() )
3bf776 ¤   ¤   ¤   {
34ec33 ¤   ¤   ¤   ¤   switch( thePart )
9872c3 ¤   ¤   ¤   ¤   {
2b116d ¤   ¤   ¤   ¤   ¤   case inContent:
044859 ¤   ¤   ¤   ¤   ¤   {
b783d9 ¤   ¤   ¤   ¤   ¤   ¤   SetPort( GetMacPort() );
8f7007 ¤   ¤   ¤   ¤   ¤   ¤   ClickInContent( *theEvent );
--8e52 000f26f1f3140120200 Page 16 of CPGPModalGrafPortView.cp
e694aa ¤   ¤   ¤   ¤   ¤   ¤
7dbf49 ¤   ¤   ¤   ¤   ¤   ¤   handled = TRUE;
1694aa ¤   ¤   ¤   ¤   ¤   ¤
3600eb ¤   ¤   ¤   ¤   ¤   ¤   break;
751c89 ¤   ¤   ¤   ¤   ¤   }
38ae30 ¤   ¤   ¤   ¤   ¤
cf7949 ¤   ¤   ¤   ¤   ¤   case inDrag:
6f4859 ¤   ¤   ¤   ¤   ¤   {
98dbc7 ¤   ¤   ¤   ¤   ¤   ¤   handled = ClickInDrag( *theEvent );
6a00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
ba1c89 ¤   ¤   ¤   ¤   ¤   }
65ae30 ¤   ¤   ¤   ¤   ¤
115ee3 ¤   ¤   ¤   ¤   ¤   case inGrow:
324859 ¤   ¤   ¤   ¤   ¤   {
7927df ¤   ¤   ¤   ¤   ¤   ¤   handled = ClickInGrow( *theEvent );
ff00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
a31c89 ¤   ¤   ¤   ¤   ¤   }
dcae30 ¤   ¤   ¤   ¤   ¤
8507ed ¤   ¤   ¤   ¤   ¤   case inZoomIn:
5f0b55 ¤   ¤   ¤   ¤   ¤   case inZoomOut:
184859 ¤   ¤   ¤   ¤   ¤   {
d6e3bc ¤   ¤   ¤   ¤   ¤   ¤   handled = ClickInZoom( *theEvent,
2a2ea2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   thePart );
4f00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
5c1c89 ¤   ¤   ¤   ¤   ¤   }
532613 ¤   ¤   ¤   ¤   }
daa3a6 ¤   ¤   ¤   }
f9fdba ¤   ¤   ¤   else if (thePart == inMenuBar)
86f776 ¤   ¤   ¤   {
c0d7fc ¤   ¤   ¤   ¤   SetPort( GetMacPort() );
fcc2a7 ¤   ¤   ¤   ¤   ClickMenuBar(*theEvent);
01f1e0 ¤   ¤   ¤   ¤   handled = TRUE;
15a3a6 ¤   ¤   ¤   }
92af5a
ad87c7 ¤   ¤   ¤
81cdcb ¤   ¤   ¤   break;
690fe4 ¤   ¤   }
461b52 ¤   ¤
bf610b ¤   ¤   case autoKey:
1ae68f ¤   ¤   case keyDown:
7b5b34 ¤   ¤   {
dc0a9f ¤   ¤   ¤   LCommander *¤   theTarget;
cdf310 ¤   ¤   ¤   CommandT¤   ¤   theCommand = cmd_Nothing;
071b52 ¤   ¤
e709b0 ¤   ¤   ¤   theTarget = LCommander::GetTarget();
c087c7 ¤   ¤   ¤
3dfad8 ¤   ¤   ¤   if( IsntNull( theTarget ) )
e2f776 ¤   ¤   ¤   {
feb347 ¤   ¤   ¤   ¤   SInt32¤ menuChoice;
3dae30 ¤   ¤   ¤   ¤   ¤
ec98f1 ¤   ¤   ¤   ¤   if ((theEvent->modifiers & cmdKey) != 0)
f172c3 ¤   ¤   ¤   ¤   {
bd6c01 ¤   ¤   ¤   ¤   ¤   menuChoice = ::MenuKey((char) (theEvent->message
db70e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   & charCodeMask));
380230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
bd922b ¤   ¤   ¤   ¤   ¤   if (HiWord(menuChoice) != 0)
1b4859 ¤   ¤   ¤   ¤   ¤   {
b973e9 ¤   ¤   ¤   ¤   ¤   ¤   theCommand = FindCommand(HiWord(menuChoice),
fb025f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LoWord(menuChoice));
4c1c89 ¤   ¤   ¤   ¤   ¤   }
bbae30 ¤   ¤   ¤   ¤   ¤
2c2613 ¤   ¤   ¤   ¤   }
10acf1 ¤   ¤   ¤   ¤   if (theCommand != cmd_Nothing)
4c72c3 ¤   ¤   ¤   ¤   {
559f97 ¤   ¤   ¤   ¤   ¤   StUnhiliteMenu unhiliter;
0aae30 ¤   ¤   ¤   ¤   ¤
6bcf12 ¤   ¤   ¤   ¤   ¤   theTarget->ProcessCommand(theCommand, &menuChoice);
730770 ¤   ¤   ¤   ¤   }·
36fa07 ¤   ¤   ¤   ¤   else
c272c3 ¤   ¤   ¤   ¤   {
99ae30 ¤   ¤   ¤   ¤   ¤
f27527 ¤   ¤   ¤   ¤   ¤   theTarget->ProcessKeyPress( *theEvent );
--15eb 0000be1eb0d40120200 Page 17 of CPGPModalGrafPortView.cp
862613 ¤   ¤   ¤   ¤   }
a6f1e0 ¤   ¤   ¤   ¤   handled = TRUE;
e9a3a6 ¤   ¤   ¤   }
96cdcb ¤   ¤   ¤   break;
6f0fe4 ¤   ¤   }
381b52 ¤   ¤
8d58c8 ¤   ¤   case nullEvent:
9d5b34 ¤   ¤   {
357d35 ¤   ¤   ¤   // Fix for a bug? with ModalDialog. If a library dialog is
7cc5a8 ¤   ¤   ¤   // shown while the process is in the background,
052aa7 ¤   ¤   ¤   // then we never get an activate event and this everything draws
b3432b ¤   ¤   ¤   // disabled. Explicitly call Activate() if we see ourselves come
85b3e7 ¤   ¤   ¤   // to the front.
fd87c7 ¤   ¤   ¤
1fde98 ¤   ¤   ¤   if( IsWindowHilited( GetMacPort() ) &&
655bdb ¤   ¤   ¤   ¤   ! IsActive() )
def776 ¤   ¤   ¤   {
274a1a ¤   ¤   ¤   ¤   Activate();
16a3a6 ¤   ¤   ¤   }
0faf5a
69cd1b ¤   ¤   ¤   DoIdle( *theEvent );
b7cdcb ¤   ¤   ¤   break;
5c0fe4 ¤   ¤   }
3c9371 ¤   }
1967c5 ¤
37bb90 ¤   dismissMessage = GetDismissMessage();
948aaa ¤   if( dismissMessage != msg_Nothing )
58c7a1 ¤   {
d93e0c ¤   ¤   // User has hit an item which dismisses the dialog. Set itemHit to 1
4f8770 ¤   ¤   // to force ModalDialog to exit.
9c1b52 ¤   ¤
95e5e6 ¤   ¤   *itemHit ¤  = 1;
e00c78 ¤   ¤   handled¤¤   = TRUE;
589371 ¤   }
011b52 ¤   ¤
da1723 ¤   return( handled );
b6efe6 }
4daf5a
449cb9 ¤   MessageT
8fe276 CPGPModalGrafPortView::HandleMessage(MessageT theMessage)
48bb36 {
09cfbc ¤   return( theMessage );
d8efe6 }
67af5a
22c744 ¤   PGPError
e7666d CPGPModalGrafPortView::DoDialog(void)
21bb36 {
c278a8 ¤   PGPError¤   ¤   err = kPGPError_NoErr;¤
f300ff ¤   DialogRef¤  ¤   theDialog;
8a6cf8 ¤   MessageT¤   ¤   message;
06af5a
3a4902 ¤   theDialog = GetDialog();
1eb5e2 ¤   pgpAssert( IsntNull( theDialog ) );
f867c5 ¤
4b024e ¤   if( ! IsWindowVisible( theDialog ) )
8ac7a1 ¤   {
f04a05 ¤   ¤   InitCursor();
2f651f ¤   ¤   ShowWindow( theDialog );
ac5770 ¤   ¤   SelectWindow( theDialog );
b99371 ¤   }
4167c5 ¤
180e59 ¤   message = msg_Nothing;
87d6e7 ¤   while( message == msg_Nothing )
bec7a1 ¤   {
0e1b03 ¤   ¤   short¤  itemHit = 0;
a5af5a
732941 ¤   ¤   while( itemHit == 0 )
7c5b34 ¤   ¤   {
811915 ¤   ¤   ¤   ModalDialog( mModalFilterProc, &itemHit );
8f5671 ¤   ¤   ¤   UpdateMenus();
3a0fe4 ¤   ¤   }
0baf5a
--2f54 000ca22cc5c40120200 Page 18 of CPGPModalGrafPortView.cp
44c74a ¤   ¤   message = HandleMessage( GetDismissMessage() );
03683b ¤   ¤   if( message == msg_Cancel )
7b5b34 ¤   ¤   {
0e4e2b ¤   ¤   ¤   err = kPGPError_UserAbort;
f40fe4 ¤   ¤   }
542355 ¤   ¤   else if( message != msg_Nothing )
585b34 ¤   ¤   {
ca7a46 ¤   ¤   ¤   err = mDialogError;
420fe4 ¤   ¤   }
cd1b52 ¤   ¤
6046ac ¤   ¤   SetDismissMessage( message );
df9371 ¤   }
4387c7 ¤   ¤   ¤
eedeb7 ¤   return( err );
5defe6 }
86af5a
d5af5a
75af5a
f96d6b ¤   ¤   void
484fd6 CPGPModalGrafPortView::SaveAndDisableEnabledMenus()
2dbb36 {
cec49d ¤   UInt16¤ ¤   numMenus = GetNumMenusInMenuBar();
203b2a ¤   MenuHandle¤ helpMenu = nil;
65d1f9 ¤   MenuHandle¤ currentMenu;
798915 ¤   SInt16¤ ¤   menuItemCount;
df227c ¤   SInt16¤ ¤   cmdKey;
0a1b52 ¤   ¤
b367c5 ¤
c31d9b ¤   ::HMGetHelpMenuHandle(&helpMenu);
3667c5 ¤
a1dfad ¤   // Walk through all menus
c56d7f ¤   for (UInt16 i = 0; i < numMenus; i++) {
00cc76 ¤   ¤   currentMenu = GetIndMenuInMenuBar(i);
101b52 ¤   ¤
56b47c ¤   ¤   // Look for edit menu items
9237ca ¤   ¤   if (mEditMenu == nil) {
890ce9 ¤   ¤   ¤   menuItemCount = ::CountMItems(currentMenu);
828023 ¤   ¤   ¤   for (SInt16 x = 1; x <= menuItemCount; x++) {
fb3a1c ¤   ¤   ¤   ¤   ::GetItemCmd(currentMenu, x, &cmdKey);
d3226f ¤   ¤   ¤   ¤   switch (toupper(cmdKey)) {
395056 ¤   ¤   ¤   ¤   ¤   case 'X':
0353e2 ¤   ¤   ¤   ¤   ¤   case 'C':
0dfe14 ¤   ¤   ¤   ¤   ¤   case 'V':
a6f809 //¤ ¤   ¤   ¤   ¤   case 'Z':
886a94 ¤   ¤   ¤   ¤   ¤   case 'A':
804859 ¤   ¤   ¤   ¤   ¤   {
86b231 ¤   ¤   ¤   ¤   ¤   ¤   mEditMenu = currentMenu;
2a6b45 ¤   ¤   ¤   ¤   ¤   ¤   switch (toupper(cmdKey)) {
16882d ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 'X':
f006b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
353e44 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCutItem = x;
2f5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
418c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
f7531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
238b99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 'C':
49a370 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {¤
96750b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mCopyItem = x;
3d5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
488c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
97531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
82266f ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 'V':
c906b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
3c3a31 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPasteItem = x;
805268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
598c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
93531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
f144a8 /*¤ ¤   ¤   ¤   ¤   ¤   ¤   case 'Z':
be06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
6d3c80 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mUndoItem = x;
165268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
8a8c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
caab5a */¤ ¤   ¤   ¤   ¤   ¤   ¤
--20be 0008bf6ec2040120200 Page 19 of CPGPModalGrafPortView.cp
9eb2ef ¤   ¤   ¤   ¤   ¤   ¤   ¤   case 'A':
4e06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
abdfcf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mSelectAllItem = x;
705268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
868c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
4fdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
391c89 ¤   ¤   ¤   ¤   ¤   }
6014c3 ¤   ¤   ¤   ¤   ¤   break;
ac2613 ¤   ¤   ¤   ¤   }
d5a3a6 ¤   ¤   ¤   }
c40fe4 ¤   ¤   }
1e1b52 ¤   ¤
85a3b0 ¤   ¤   // Save enabled ones
43e618 ¤   ¤   if (IsMenuItemEnabled(currentMenu, 0) && (currentMenu != helpMenu))¤{
ea7057 ¤   ¤   ¤   EnabledItem¤enabledItem = {currentMenu, 0};
6887c7 ¤   ¤   ¤
d61311 ¤   ¤   ¤   mEnabledMenuItems->InsertItemsAt(¤  1,
0a19c0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LArray::index_Last,
f690f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &enabledItem);
3de918 ¤   ¤   ¤   ::DisableItem(currentMenu, 0);
db0fe4 ¤   ¤   }
079371 ¤   }
4067c5 ¤
f63d26 ¤   // Save and disable edit menu
769173 ¤   if (mEditMenu != nil) {
ff5681 ¤   ¤   menuItemCount = ::CountMItems(mEditMenu);
2e8354 ¤   ¤   for (SInt16 x = 1; x <= menuItemCount; x++) {
bb3b51 ¤   ¤   ¤   if (IsMenuItemEnabled(mEditMenu, x)) {
d04d2c ¤   ¤   ¤   ¤   EnabledItem enabledItem = {mEditMenu, x};
b10236 ¤   ¤   ¤   ¤   mEnabledMenuItems->InsertItemsAt(¤  1,
c457b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LArray::index_Last,
211d0e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &enabledItem);
523b49 ¤   ¤   ¤   ¤   ::DisableItem(mEditMenu, x);
aba3a6 ¤   ¤   ¤   }
dd0fe4 ¤   ¤   }
879371 ¤   }
c9efe6 }
40af5a
b0af5a
fcaf5a
386d6b ¤   ¤   void
b04c2e CPGPModalGrafPortView::RestoreEnabledMenus()
21bb36 {
2ea768 ¤   LArrayIterator¤ iterator(*mEnabledMenuItems);
887a39 ¤   EnabledItem¤¤   enabledItem;
1367c5 ¤
e103db ¤   while(iterator.Next(&enabledItem)) {
f410fb ¤   ¤   ::EnableItem(enabledItem.menu, enabledItem.item);
789371 ¤   }
6defe6 }
19af5a
0aaf5a
7daf5a
d06d52 ¤   void
e50f46 CPGPModalGrafPortView::UpdateMenus()
fabb36 {
78a61c ¤   // By default we handle cut, copy and paste in the same fashion
71c319 ¤   // as the Menu Manager and Dialog Manager according to
61bb30 ¤   // IM: Mac Toolbox Essentials 3-85
1d9bf7 ¤   LCommander *¤   theTarget = LCommander::GetTarget();
7485c1 ¤   Boolean¤¤   ¤   isEnabled;
4fdea0 ¤   Boolean¤¤   ¤   usesMark;¤  // unused
f50114 ¤   Char16¤ ¤   ¤   mark;¤  ¤   // unused
260378 ¤   Str255¤ ¤   ¤   itemName;¤  // unused
a00db0 ¤   Boolean¤¤   ¤   editMenuEnabled;
e467c5 ¤
d89173 ¤   if (mEditMenu != nil) {
c92b46 ¤   ¤   editMenuEnabled = IsMenuItemEnabled(mEditMenu, 0);
14cb73 ¤   ¤   ::DisableItem(mEditMenu, 0);
241ba2 ¤   ¤   if (theTarget != nil) {
f3f5f1 ¤   ¤   ¤   if (mCutItem > 0) {
8b97ab ¤   ¤   ¤   ¤   isEnabled = false;
--85fd 000ad83621840120200 Page 20 of CPGPModalGrafPortView.cp
a9b0e7 ¤   ¤   ¤   ¤   usesMark = false;
fb300d ¤   ¤   ¤   ¤   itemName[0] = 0;
51fed3 ¤   ¤   ¤   ¤   theTarget->ProcessCommandStatus(cmd_Cut, isEnabled, usesMark,
ccb0e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mark, itemName);
add16d ¤   ¤   ¤   ¤   if (isEnabled) {
5862c8 ¤   ¤   ¤   ¤   ¤   ::EnableItem(mEditMenu, mCutItem);
3c252b ¤   ¤   ¤   ¤   ¤   ::EnableItem(mEditMenu, 0);
b2b5fc ¤   ¤   ¤   ¤   } else {
79aee7 ¤   ¤   ¤   ¤   ¤   ::DisableItem(mEditMenu, mCutItem);
f42613 ¤   ¤   ¤   ¤   }
78a3a6 ¤   ¤   ¤   }
23617a ¤   ¤   ¤   if (mCopyItem > 0) {
1797ab ¤   ¤   ¤   ¤   isEnabled = false;
82b0e7 ¤   ¤   ¤   ¤   usesMark = false;
5e300d ¤   ¤   ¤   ¤   itemName[0] = 0;
14fc26 ¤   ¤   ¤   ¤   theTarget->ProcessCommandStatus(cmd_Copy, isEnabled, usesMark,
36b0e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mark, itemName);
27d16d ¤   ¤   ¤   ¤   if (isEnabled) {
3dcb96 ¤   ¤   ¤   ¤   ¤   ::EnableItem(mEditMenu, mCopyItem);
3d252b ¤   ¤   ¤   ¤   ¤   ::EnableItem(mEditMenu, 0);
dcb5fc ¤   ¤   ¤   ¤   } else {
5812af ¤   ¤   ¤   ¤   ¤   ::DisableItem(mEditMenu, mCopyItem);
1b2613 ¤   ¤   ¤   ¤   }
87a3a6 ¤   ¤   ¤   }
7c446b ¤   ¤   ¤   if (mPasteItem > 0) {
a397ab ¤   ¤   ¤   ¤   isEnabled = false;
00b0e7 ¤   ¤   ¤   ¤   usesMark = false;
5d300d ¤   ¤   ¤   ¤   itemName[0] = 0;
3bd615 ¤   ¤   ¤   ¤   theTarget->ProcessCommandStatus(cmd_Paste, isEnabled, usesMark,
03b0e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mark, itemName);
68d16d ¤   ¤   ¤   ¤   if (isEnabled) {
da6e5e ¤   ¤   ¤   ¤   ¤   ::EnableItem(mEditMenu, mPasteItem);
84252b ¤   ¤   ¤   ¤   ¤   ::EnableItem(mEditMenu, 0);
00b5fc ¤   ¤   ¤   ¤   } else {
0fc2c5 ¤   ¤   ¤   ¤   ¤   ::DisableItem(mEditMenu, mPasteItem);
702613 ¤   ¤   ¤   ¤   }
5aa3a6 ¤   ¤   ¤   }
2beb80 /*¤ ¤   ¤   if (mUndoItem > 0) {
6697ab ¤   ¤   ¤   ¤   isEnabled = false;
1fb0e7 ¤   ¤   ¤   ¤   usesMark = false;
8c300d ¤   ¤   ¤   ¤   itemName[0] = 0;
1ec1c2 ¤   ¤   ¤   ¤   theTarget->ProcessCommandStatus(cmd_Undo, isEnabled, usesMark,
f1b0e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mark, itemName);
5ed16d ¤   ¤   ¤   ¤   if (isEnabled) {
13e53b ¤   ¤   ¤   ¤   ¤   ::EnableItem(mEditMenu, mUndoItem);
13252b ¤   ¤   ¤   ¤   ¤   ::EnableItem(mEditMenu, 0);
33b5fc ¤   ¤   ¤   ¤   } else {
693c02 ¤   ¤   ¤   ¤   ¤   ::DisableItem(mEditMenu, mUndoItem);
3a2613 ¤   ¤   ¤   ¤   }
42a3a6 ¤   ¤   ¤   }
69bcdd */¤ ¤   ¤   if (mSelectAllItem > 0) {
3897ab ¤   ¤   ¤   ¤   isEnabled = false;
b3b0e7 ¤   ¤   ¤   ¤   usesMark = false;
41300d ¤   ¤   ¤   ¤   itemName[0] = 0;
67a685 ¤   ¤   ¤   ¤   theTarget->ProcessCommandStatus(cmd_SelectAll, isEnabled,
ce06d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   usesMark, mark, itemName);
77d16d ¤   ¤   ¤   ¤   if (isEnabled) {
9998e0 ¤   ¤   ¤   ¤   ¤   ::EnableItem(mEditMenu, mSelectAllItem);
68252b ¤   ¤   ¤   ¤   ¤   ::EnableItem(mEditMenu, 0);
40b5fc ¤   ¤   ¤   ¤   } else {
581c4e ¤   ¤   ¤   ¤   ¤   ::DisableItem(mEditMenu, mSelectAllItem);
1b2613 ¤   ¤   ¤   ¤   }
2fa3a6 ¤   ¤   ¤   }
9f0fe4 ¤   ¤   }
3e0b9c ¤   ¤   if (IsMenuItemEnabled(mEditMenu, 0) != editMenuEnabled) {
f22301 ¤   ¤   ¤   ::DrawMenuBar();
940fe4 ¤   ¤   }
689371 ¤   }
9fefe6 }
e4af5a
e4af5a
adaf5a
--e008 001ab7579c540120200 Page 21 of CPGPModalGrafPortView.cp
3b6d52 ¤   void
5a15a0 CPGPModalGrafPortView::ClickMenuBar(
f87f53 ¤   const EventRecord &¤inMacEvent)
45bb36 {
f6976e ¤   StUnhiliteMenu¤ unhiliter;
0c1374 ¤   SInt32¤ ¤   ¤   menuChoice = ::MenuSelect(inMacEvent.where);
4df486 ¤   CommandT¤   ¤   menuCmd = cmd_Nothing;
9267c5 ¤
c5bde2 ¤   if (HiWord(menuChoice) != 0) {
d803f2 ¤   ¤   menuCmd = FindCommand(HiWord(menuChoice), LoWord(menuChoice));
f99371 ¤   }
a967c5 ¤
8ecf69 ¤   if ((menuCmd != cmd_Nothing) && (LCommander::GetTarget() != nil)) {
bcea3b ¤   ¤   LCommander::GetTarget()->ProcessCommand(menuCmd, &menuChoice);
ac9371 ¤   }
a3efe6 }
d9af5a
c7af5a
9faf5a
8a8afa ¤   CommandT
4a8d86 CPGPModalGrafPortView::FindCommand(
5f1c3c ¤   ResIDT¤ menuID,
569325 ¤   SInt16¤ item)
23bb36 {
aa30f7 ¤   CommandT¤   theCommand = cmd_Nothing;
2667c5 ¤
769c8d ¤   if (mEditMenu == ::GetMenuHandle(menuID)) {
258461 ¤   ¤   if (item == mCutItem) {
ab0e5f ¤   ¤   ¤   theCommand = cmd_Cut;
2356b3 ¤   ¤   } else if (item == mCopyItem) {
389396 ¤   ¤   ¤   theCommand = cmd_Copy;
cec734 ¤   ¤   } else if (item == mPasteItem) {
58d0b2 ¤   ¤   ¤   theCommand = cmd_Paste;
a2b777 //¤ ¤   } else if (item == mUndoItem) {
81e318 //¤ ¤   ¤   theCommand = cmd_Undo;
3fd8d7 ¤   ¤   } else if (item == mSelectAllItem) {
f49884 ¤   ¤   ¤   theCommand = cmd_SelectAll;
460fe4 ¤   ¤   }
a79371 ¤   }
e267c5 ¤
9549bb ¤   return theCommand;
abefe6 }
--daef 0005950313340120201 Page 1 of CPGPModalGrafPortView.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
48f24b ¤   $Id: CPGPModalGrafPortView.h,v 1.10.12.1 1998/11/12 03:18:57 heller Exp $
94f7f7 ____________________________________________________________________________*/
9caf5a
417b7d #pragma once
c5af5a
84c20d #include <Dialogs.h>
40af5a
dd10f5 #include <LGrafPortView.h>
01f1a9 #include <LListener.h>
04af5a
bbb5ea #include "PGPPubTypes.h"
83af5a
8b88da class LPushButton;
40d156 class LArray;
9abc77 struct SavedWindowBitsInfo;
b0af5a
3b669e class CPGPModalGrafPortView : public LGrafPortView,
a1758a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   public LListener
32bb36 {
b85ed4 public:
87b0bf ¤   enum { class_ID = 'Ppvw' };
a3af5a
05fd9b ¤   ¤   ¤   ¤   ¤   ¤   CPGPModalGrafPortView(LStream *inStream);
d53275 ¤   virtual¤¤   ¤   ¤   ~CPGPModalGrafPortView(void);
9e67c5 ¤
b842ec ¤   virtual void¤   ¤   ApplyForeAndBackColors(void) const;
85ec39 ¤   virtual PGPError¤   DoDialog(void);
300b44 ¤   virtual void¤   ¤   DoIdle(const EventRecord &inMacEvent);
6a6d0b ¤   virtual void¤   ¤   Draw(RgnHandle¤ inSuperDrawRgnH);
c4febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
9f2e0c ¤   DialogRef¤  ¤   ¤   GetDialog(void);
50bbbf ¤   virtual void¤   ¤   GetForeAndBackColors(RGBColor *outForeColor,
251e7c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   RGBColor *outBackColor) const;
1291bd ¤   virtual void¤   ¤   GlobalToPortPoint(Point &ioPoint) const;
134a40 ¤   virtual Boolean¤¤   HandleKeyPress(const EventRecord &inKeyEvent);
4fe629 ¤   virtual void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
c40dde ¤   virtual Boolean¤¤   ModalFilterProc(DialogPtr theDialog,
46d7db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord *theEvent, short *itemHit);
620fb9 ¤   virtual void¤   ¤   PortToGlobalPoint(Point &ioPoint) const;
ab95c7 ¤   void¤   ¤   ¤   ¤   RememberInvalidWindow(WindowRef theWindow);
eb3375 ¤   virtual¤void ¤  ¤   UpdatePort(void);
c367c5 ¤
3fa215 ¤   MessageT¤   ¤   ¤   GetDismissMessage(void)
9ff342 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return( mDismissMessage ); };
d7e8be ¤   void¤   ¤   ¤   ¤   SetDismissMessage(MessageT message)
c23239 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { mDismissMessage = message; };
21af5a
006e1e ¤   static DialogRef ¤  ¤   CreateDialog(ResIDT dialogResID);
dfb0eb ¤   static CPGPModalGrafPortView *GetWindowGrafPortView(WindowPtr theWindow);
b235d8 ¤   static pascal Boolean¤  ModalFilterProcHandler(DialogPtr theDialog,
2095e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   EventRecord *theEvent,
706841 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   short *itemHit);
f767c5 ¤
cca2d3 protected:
07af5a
4af073 ¤   MessageT¤   ¤   ¤   mDismissMessage;
834b0b ¤   LPushButton¤¤   ¤   *mOKButton;
e4f9d0 ¤   LPushButton¤¤   ¤   *mCancelButton;
1a9036 ¤   LArray¤ ¤   ¤   ¤   *mInvalidWindowList;
f1953b ¤   Boolean¤¤   ¤   ¤   mWindowIsMoveable;
12c97c ¤   Boolean¤¤   ¤   ¤   mWindowIsResizeable;
aa4ed2 ¤   Rect¤   ¤   ¤   ¤   mMinMaxSize;
ee92db ¤   Boolean¤¤   ¤   ¤   mSaveRestoreWindowBits;
57cb85 ¤   SavedWindowBitsInfo¤*mSavedWindowBitsList;
99fdac ¤   SDimension16¤   ¤   mStandardSize;
2b69f6 ¤   Rect¤   ¤   ¤   ¤   mUserBounds;
b605e6 ¤   Boolean¤¤   ¤   ¤   mMoveOnlyUserZoom;
590d95 ¤   UInt32¤ ¤   ¤   ¤   mLastIdleTicks;
--c9aa 00105ce5d0240120201 Page 2 of CPGPModalGrafPortView.h
631177 ¤   PGPError¤   ¤   ¤   mDialogError;
829f66 ¤   LArray¤ ¤   ¤   ¤   *mEnabledMenuItems;
66a748 ¤   MenuHandle¤ ¤   ¤   mEditMenu;
874df8 ¤   SInt16¤ ¤   ¤   ¤   mCutItem;
7a5d73 ¤   SInt16¤ ¤   ¤   ¤   mCopyItem;
170c46 ¤   SInt16¤ ¤   ¤   ¤   mPasteItem;
50492d //¤ SInt16¤ ¤   ¤   ¤   mUndoItem;
435293 ¤   SInt16¤ ¤   ¤   ¤   mSelectAllItem;
9ea6c3 ¤   ModalFilterUPP¤ ¤   mModalFilterProc;
e567c5 ¤
1c489f ¤   virtual void¤   ¤   ClickMenuBar(const EventRecord &inMacEvent);
db4863 ¤   Boolean¤¤   ¤   ¤   ClickInDrag(const EventRecord &inMacEvent);
adfc48 ¤   Boolean¤¤   ¤   ¤   ClickInGrow(const EventRecord &inMacEvent);
7624d8 ¤   Boolean¤¤   ¤   ¤   ClickInZoom(const EventRecord &inMacEvent,
ab2fdd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Int16 inZoomDirection);
59b338 ¤   void¤   ¤   ¤   ¤   SaveAllWindowBits(void);
c4c9e6 ¤   void¤   ¤   ¤   ¤   SaveWindowBits(WindowRef theWindow);
4c48d0 ¤   void¤   ¤   ¤   ¤   RestoreWindowBits(WindowRef theWindow);
d39ee6 ¤   Boolean¤¤   ¤   ¤   CalcStandardBounds(Rect &outStdBounds) const;
a729ca ¤   void¤   ¤   ¤   ¤   CalcStandardBoundsForScreen(
09046f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect &inScreenBounds,
aed441 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect &outStdBounds) const;
2c7801 ¤   void¤   ¤   ¤   ¤   DoSetZoom(Boolean inZoomToStdState);
c16736 ¤   virtual MessageT¤   HandleMessage(MessageT theMessage);
ab99d7 ¤   void¤   ¤   ¤   ¤   ResizeWindowTo(Int16 newWidth, Int16 newHeight);
6a67c5 ¤
6142d4 ¤   CommandT¤   ¤   ¤   FindCommand(ResIDT menuID, SInt16 item);
9ef619 ¤   void¤   ¤   ¤   ¤   SaveAndDisableEnabledMenus();
7ad293 ¤   void¤   ¤   ¤   ¤   RestoreEnabledMenus();
6a6723 ¤   void¤   ¤   ¤   ¤   UpdateMenus();
ec67c5 ¤
130fb9 private:
80af5a
9e4525 ¤   CPGPModalGrafPortView¤  *mNextView;
0582f7 };
--f788 00173f759e240120202 Page 1 of CPGPStDialogHandler.cp
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
e51af7 ¤   This is an implementation of StDialogHandler which does not enable
915f12 ¤   the About menu command
6967c5 ¤
9e5344 ¤   $Id: CPGPStDialogHandler.cp,v 1.4.16.1 1998/11/12 03:18:58 heller Exp $
dff7f7 ____________________________________________________________________________*/
90af5a
038fd4 #include <LWindow.h>
d1af5a
d659c5 #include "CPGPStDialogHandler.h"
16af5a
0d2619 CPGPStDialogHandler::CPGPStDialogHandler(
cb79bd ¤   ResIDT¤ ¤   inDialogResID,¤ ¤   ¤   // 'PPob' and 'RidL' Resource ID
def2da ¤   LCommander¤ *inSuper)
562f62 ¤   ¤   : StDialogHandler( inDialogResID, inSuper )
46bb36 {
49efe6 }
3baf5a
fa9136 CPGPStDialogHandler::~CPGPStDialogHandler(void)
eebb36 {
7ed8af ¤   /*
efc7a0 ¤   ** PowerPlant 1.8 has a bug where LEditText typing actions are deleted
e11737 ¤   ** after the parent control has been deleted. Fix this race condition
92a91e ¤   ** here by calling RemoveAllAttachments() before the destructor to·
28eecc ¤   ** LAttachable() is called.
d29faa ¤   */
0d67c5 ¤
ae139d ¤   mDialog->RemoveAllAttachments();
ceefe6 }
deaf5a
206d52 ¤   void
7bda1a CPGPStDialogHandler::FindCommandStatus(
89ea24 ¤   CommandT¤   inCommand,
c2a472 ¤   Boolean¤¤   &outEnabled,
2dc1cc ¤   Boolean&¤   outUsesMark,
f89476 ¤   Char16&¤¤   outMark,
c2d894 ¤   Str255¤ ¤   outName)
efbb36 {
9af320 ¤   #pragma unused( inCommand, outUsesMark, outMark, outName )
f067c5 ¤
2b74a3 ¤   // Don't enable any commands at all. StDialogHandler enables
4cb72a ¤   // the About command which is generally an error for most movable,
d98459 ¤   // modal dialogs. This function purposely does not
899901 ¤   // call the inherited FindCommandStatus, thereby suppressing
973770 ¤   // commands that are handled by SuperCommanders. Only those
97d5c0 ¤   // commands enabled by SubCommanders will be active.
f8a617 ¤   //
82d0d7 ¤   // This is usually what you want for a moveable modal dialog.
e53f15 ¤   // Commands such as "New", "Open" and "Quit" that are handled
a05adb ¤   // by the Applcation are disabled, but items within the dialog
bb94f4 ¤   // can enable commands. For example, an EditField would enable
ab37d3 ¤   // items in the "Edit" menu.
b61b52 ¤   ¤
fb5465 ¤   outEnabled = FALSE;
73efe6 }
--b2f2 001a3d7b7c840120203 Page 1 of CPGPStDialogHandler.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
b8a6a2 ¤   $Id: CPGPStDialogHandler.h,v 1.2.16.1 1998/11/12 03:18:59 heller Exp $
b5f7f7 ____________________________________________________________________________*/
8eaf5a
b3afac #include <UModalDialogs.h>
7aaf5a
74c36d class CPGPStDialogHandler : public StDialogHandler
98bb36 {
af5ed4 public:
db1626 ¤   ¤   ¤   ¤   ¤   ¤   CPGPStDialogHandler(ResIDT inDialogResID,·
8d4634 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LCommander *inSuper);
a933d4 ¤   virtual¤¤   ¤   ¤   ~CPGPStDialogHandler(void);
2daf5a
bad21c ·¤  virtual void¤   ¤   FindCommandStatus(CommandT inCommand,
cf0bef ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean &outEnabled, Boolean &outUsesMark,
ff40c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Char16 &outMark, Str255 outName);
6b82f7 };
a3af5a
--3b0b 00000e5887540120204 Page 1 of CPassphraseEdit.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ccaa11 ¤   $Id: CPassphraseEdit.cp,v 1.19.2.1.4.1 1998/11/12 03:19:00 heller Exp $
9cf7f7 ____________________________________________________________________________*/
e4af5a
e784be #include <Sound.h>
16af5a
1d2c73 #include <LView.h>
f67b32 #include <PP_KeyCodes.h>
77dd56 #include <PP_Messages.h>
17e8ae #include <UDrawingUtils.h>
3d8f92 #include <UGAColorRamp.h>
f2ffe3 #include <UGraphicUtils.h>
23af5a
0d8bd8 #include "MacEnvirons.h"
f385c2 #include "MacStrings.h"
49c110 #include "pgpMacMemory.h"
6c0d08 #include "pgpMem.h"
e7afa7 #include "pgpPassphraseUtils.h"
acaf5a
e9829c #include "CPassphraseEdit.h"
8daf5a
2d6eea UInt32¤ CPassphraseEdit::mNumActiveFields = 0;
011890 UInt8¤  CPassphraseEdit::mSpaceCountList[kMaxPassphraseLength];
9daf5a
0eef52 const uchar¤kOptionSpaceCharacter = 0xCA;¤  // <<<--- This is an option-Space!
9aaf5a
122c7c CPassphraseEdit::CPassphraseEdit(LStream¤   *inStream)
e50613 ¤   ¤   : LEditText(inStream)
f1bb36 {
c2ae05 ¤   // This must be TRUE for GetDescriptor to work
324bc9 ¤   pgpAssert( kMaxPassphraseLength < sizeof( Str255 ) );
e867c5 ¤
4e87e6 ¤   mKeyFilter = sPassphraseKeyFilter;
b267c5 ¤
308004 ¤   mPassphraseHidden ¤ ¤   = TRUE;
16cfac ¤   mPassphraseLength¤  ¤   = 0;
f19b71 ¤   mSpacePassphraseLength¤ = 0;
04af5a
ece6c8 ¤   pgpClearMemory( mPassphrase, sizeof( mPassphrase ) );
b4af5a
4f5757 ¤   if( VirtualMemoryIsOn() )
2fc7a1 ¤   {
5200f3 ¤   ¤   HoldMemory( mPassphrase, sizeof( mPassphrase ) );
369371 ¤   }
e41b52 ¤   ¤
6d4165 ¤   // Pre-fill an array of space characters for simple showing and
cf123d ¤   // hiding of the passphrase
9d0563 ¤   pgpFillMemory( mSpacePassphrase,
2c802f ¤   ¤   ¤   sizeof( mSpacePassphrase ), kOptionSpaceCharacter );
b267c5 ¤
f675dc ¤   SetMaxChars( kMaxPassphraseLength );
c467c5 ¤
087a34 ¤   ++mNumActiveFields;
a7f24e ¤   if( mNumActiveFields == 1 )
b6c7a1 ¤   {
205c58 ¤   ¤   // Generate a "random" amount of Space characters to represent the
492440 ¤   ¤   // entered character. This is stored so that backspacing appears to
c1c15c ¤   ¤   // work "correctly". The number of Spaces is derived using the crappy
89e5c5 ¤   ¤   // Macintosh Random() routine.
1b87c7 ¤   ¤   ¤
e8af6c ¤   ¤   for( short index = 0; index < kMaxPassphraseLength; index++ )
205b34 ¤   ¤   {
92e4e1 ¤   ¤   ¤   mSpaceCountList[index] =
b2f786 ¤   ¤   ¤   ¤   ( (ulong) Random() % kMaxSpacesPerCharacter ) + 1;
c20fe4 ¤   ¤   }
d59371 ¤   }
efefe6 }
fdaf5a
006839 CPassphraseEdit::~CPassphraseEdit()
--71d0 000b1a2279640120204 Page 2 of CPassphraseEdit.cp
2cbb36 {
de1323 ¤   // For security reasons, clear the passphrase items
f967c5 ¤
de3da8 ¤   mPassphraseLength = 0;
9867c5 ¤
37b0e2 ¤   pgpAssert( mNumActiveFields > 0 );
09da67 ¤   --mNumActiveFields;
5d67c5 ¤
8be6c8 ¤   pgpClearMemory( mPassphrase, sizeof( mPassphrase ) );
9a67c5 ¤
465757 ¤   if( VirtualMemoryIsOn() )
3ec7a1 ¤   {
7fc356 ¤   ¤   UnholdMemory( mPassphrase, sizeof( mPassphrase ) );
e29371 ¤   }
1aefe6 }
d5af5a
dd9133 // ---------------------------------------------------------------------------
87568e //¤ SetHideStatus
119133 // ---------------------------------------------------------------------------
5feb2c //¤ Show or hide the passphrase text
21af5a
666d52 ¤   void
cca3aa CPassphraseEdit::SetHideTyping(Boolean hide)
c5bb36 {
5f1395 ¤   if( mPassphraseHidden != hide )
3ec7a1 ¤   {
f0df40 ¤   ¤   FocusDraw();
471b52 ¤   ¤
989543 ¤   ¤   if( hide )
0b5b34 ¤   ¤   {
9cc8a2 ¤   ¤   ¤   ::TESetText( mSpacePassphrase, mSpacePassphraseLength, mTextEditH);
430fe4 ¤   ¤   }
200e1d ¤   ¤   else
4a5b34 ¤   ¤   {
e655e4 ¤   ¤   ¤   ::TESetText( mPassphrase, mPassphraseLength, mTextEditH);
7e0fe4 ¤   ¤   }
8b1b52 ¤   ¤
201b17 ¤   ¤   /*
2e2719 ¤   ¤   ** The passphrase edit field may be hidden when this is called. Do not
cef9ad ¤   ¤   ** arbitrarily show it.
4a5c12 ¤   ¤   */
b11b52 ¤   ¤
26381a ¤   ¤   if( IsVisible() )
8c42e3 ¤   ¤   ¤   DrawSelf();
b8af5a
a755ab ¤   ¤   mPassphraseHidden = hide;
269371 ¤   }
8defe6 }
d0af5a
0d9133 // ---------------------------------------------------------------------------
7fd0d0 //¤ FindCommandStatus
839133 // ---------------------------------------------------------------------------
3d9b24 //¤ Disable the Edit menu options for the password field.
9caf5a
9c6d52 ¤   void
6bd567 CPassphraseEdit::FindCommandStatus(
47ea24 ¤   CommandT¤   inCommand,
b6ca4e ¤   Boolean&¤   outEnabled,
e6c1cc ¤   Boolean&¤   outUsesMark,
9b9476 ¤   Char16&¤¤   outMark,
53d894 ¤   Str255¤ ¤   outName)
08bb36 {
daf912 ¤   switch (inCommand) {
1baf5a
4798d2 ¤   ¤   case cmd_Cut:
7a8fe9 ¤   ¤   case cmd_Copy:
a218da ¤   ¤   case cmd_Paste:
b31b1c ¤   ¤   case cmd_Clear:
093513 ¤   ¤   case cmd_SelectAll:
f20f5e ¤   ¤   ¤   outEnabled = FALSE;
57cdcb ¤   ¤   ¤   break;
b187c7 ¤   ¤   ¤
--37a6 000d53ed64540120204 Page 3 of CPassphraseEdit.cp
d39ae3 ¤   ¤   default:
8f5aa3 ¤   ¤   ¤   LEditText::FindCommandStatus(inCommand,
d685b2 ¤   ¤   ¤   ¤   outEnabled, outUsesMark, outMark, outName);
5acdcb ¤   ¤   ¤   break;
019371 ¤   }
6fefe6 }
c4af5a
459133 // ---------------------------------------------------------------------------
60d46a //¤ ClickSelf
a09133 // ---------------------------------------------------------------------------
0fcfd6 //¤ Disallow mouse selection within the password field. The user can backspace,
c1caa4 //¤ but keyboard and mouse navigation are not allowed. Clicking in the field
98a351 //¤ will target it and set the insertion point to just beyond the last character
165753 //¤ in the field.
49af5a
cd6d52 ¤   void
8fea39 CPassphraseEdit::ClickSelf( const SMouseDownEvent &inMouseDown)
c0bb36 {
2539f8 ¤   #pragma unused( inMouseDown )
5baf5a
7e2d9b ¤   BroadcastMessage('ckUI', (void *)mPaneID);
1faf5a
6cfcea ¤   if( !IsTarget() )
41c7a1 ¤   {
bbdf40 ¤   ¤   FocusDraw();
b42d42 ¤   ¤   ::TESetSelect( max_Int16, max_Int16, mTextEditH );
66eb7d ¤   ¤   SwitchTarget( this );
c19371 ¤   }
6befe6 }
f3af5a
689133 // ---------------------------------------------------------------------------
b026f9 // ·AdjustCursorSelf
939133 // ---------------------------------------------------------------------------
02acdc //¤ Do not let LEditField change the cursor to the I-beam.
ceaf5a
f0314a void
1bd4fd CPassphraseEdit::AdjustCursorSelf(Point inPortPt, const EventRecord &inMacEvent)
f3bb36 {
0fbebf #pragma unused( inPortPt, inMacEvent )
b8efe6 }
7aaf5a
ee9133 // ---------------------------------------------------------------------------
47bf71 //¤ GetPassphraseLength
5c9133 // ---------------------------------------------------------------------------
58af5a
6d108d ¤   PGPUInt32
549374 CPassphraseEdit::GetPassphraseLength(void)
b3bb36 {
6065b4 ¤   return( mPassphraseLength );
96efe6 }
4baf5a
2e9133 // ---------------------------------------------------------------------------
660e9c //¤ EstimatePassphraseQuality
c99133 // ---------------------------------------------------------------------------
0daf5a
07108d ¤   PGPUInt32
0a899e CPassphraseEdit::EstimatePassphraseQuality(void)
e0bb36 {
fe2f2b ¤   return( pgpEstimatePassphraseQuality( mPassphrase ) );
19efe6 }
3baf5a
a19133 // ---------------------------------------------------------------------------
d99867 //¤ GetDescriptor
329133 // ---------------------------------------------------------------------------
3baf5a
d4997e ¤   StringPtr
3d0e03 CPassphraseEdit::GetDescriptor(Str255 outDescriptor) const
6bbb36 {
cec0ec ¤   BlockMoveData( mPassphrase, &outDescriptor[1], mPassphraseLength );
21e4a8 ¤   outDescriptor[0] = mPassphraseLength;
3667c5 ¤
d53f75 ¤   return outDescriptor;
--4a04 0005956875a40120204 Page 4 of CPassphraseEdit.cp
7aefe6 }
46af5a
e69133 // ---------------------------------------------------------------------------
222cd2 //¤ GetPassphrase
d19133 // ---------------------------------------------------------------------------
38af5a
d76d52 ¤   void
143395 CPassphraseEdit::GetPassphrase(char passphrase[256])
a0bb36 {
393437 ¤   CopyCString( mPassphrase, passphrase );
2fefe6 }
b7af5a
3f9133 // ---------------------------------------------------------------------------
1cfd3c //¤ PassphraseKeyFilter
5b9133 // ---------------------------------------------------------------------------
17af5a
52edb9 ¤   EKeyStatus
1041e8 CPassphraseEdit::sPassphraseKeyFilter(
1c1367 ¤   TEHandle¤   inMacTEH,
1eae56 ¤   Char16¤ inKeyCode,
5a3f4c ¤   Char16¤ &ioCharCode,
9a4c35 ¤   UInt16¤ inModifiers)
9bbb36 {
5f7a21 ¤   EKeyStatus¤ keyStatus;
3067c5 ¤
a3beb1 ¤   if( UKeyFilters::IsNavigationKey( inKeyCode ) ||
95f47c ¤   ¤   UKeyFilters::IsExtraEditKey( inKeyCode ))
05c7a1 ¤   {
955ed7 ¤   ¤   keyStatus = keyStatus_Reject;
f09371 ¤   }
3b0e24 ¤   else
31c7a1 ¤   {
c50e2e ¤   ¤   keyStatus = UKeyFilters::PrintingCharField( inMacTEH,
698fc0 ¤   ¤   ¤   ¤   ¤   inKeyCode, ioCharCode, inModifiers );
67ae30 ¤   ¤   ¤   ¤   ¤
e048c8 ¤   ¤   if( keyStatus == keyStatus_PassUp )
275b34 ¤   ¤   {
6651da ¤   ¤   ¤   // Reject all non-pringing pass up characters except action keys
7bbfb9 ¤   ¤   ¤   if( ! UKeyFilters::IsActionKey( inKeyCode ) )
f1f776 ¤   ¤   ¤   {
1b5bfc ¤   ¤   ¤   ¤   keyStatus = keyStatus_Reject;
0ea3a6 ¤   ¤   ¤   }
180fe4 ¤   ¤   }
279371 ¤   }
0eaf5a
fc518b ¤   return( keyStatus );
95efe6 }
22af5a
299133 // ---------------------------------------------------------------------------
da8b84 //¤ HandleKeyPress
8d9133 // ---------------------------------------------------------------------------
be3b49 //¤ This is the total logic (and most of the code) from
c15848 //¤ LEditField::HandleKeyPress. We copy the code here to address security
de43c7 //¤ concerns. LEditField posts LTETypingAction objects to support
5392a5 //¤ undo/redo. The objects contain copies of the current edit text and are
1b6141 //¤ uncontrolled. Since we support no undo, this functionality is eliminated.
791393 //¤
fa08c9 //¤ Because we have copied the code from PowerPlant, it is important to keep
d31833 //¤ in sync with future developments of the LBroadcasterEditField and
112704 //¤ LGAEditText classes. We do this by breaking compilation if the
070c00 //¤ PowerPlant version changes
57af5a
b676cf #if __PowerPlant__ > 0x01908000¤// Version 1.9
4d96cb ¤   !!! Recheck code copied from parent classes. See comment above!
667454 #endif
5eaf5a
a07e69 ¤   Boolean
9e5e7c CPassphraseEdit::HandleKeyPress(
c4a506 ¤   const EventRecord& inKeyEvent)
aebb36 {
45af5a
59107d ¤   // Intercept Enter and Return key for immediate value change.
--bdc8 00092a349a440120204 Page 5 of CPassphraseEdit.cp
e0af5a
a0d97f ¤   EKeyStatus¤ theKeyStatus ¤  = keyStatus_Input;
8a973a ¤   Boolean¤¤   keyHandled ¤¤   = TRUE;
c1ba93 ¤   Int16¤  ¤   theKey ¤¤   ¤   = inKeyEvent.message;
4267c5 ¤
737f32 ¤   if (inKeyEvent.modifiers & cmdKey)
479f42 ¤   {¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Always pass up when the command
7aecdc ¤   ¤   theKeyStatus = keyStatus_PassUp;¤   // ··key is down
6a9371 ¤   }
ddd99d ¤   else if( mKeyFilter != nil )
75c7a1 ¤   {
404031 ¤   ¤   Char16¤ newCharCode¤= inKeyEvent.message & charCodeMask;
661b52 ¤   ¤
435abf ¤   ¤   theKeyStatus = (*mKeyFilter)( mTextEditH,
2a217a ¤   ¤   ¤   ¤   ¤   ¤   ¤   theKey,
d91ef4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   newCharCode,
63c010 ¤   ¤   ¤   ¤   ¤   ¤   ¤   inKeyEvent.modifiers );
9a9371 ¤   }
6367c5 ¤
08b8ef ¤   StFocusAndClipIfHidden¤ focus(this);
2daf5a
82dff3 ¤   switch (theKeyStatus)
31c7a1 ¤   {
a41a5b ¤   ¤   case keyStatus_Input:
be5b34 ¤   ¤   {
6705aa ¤   ¤   ¤   UInt32¤ numSpaces;
1387c7 ¤   ¤   ¤
3ce705 ¤   ¤   ¤   // Check if we are at the character limit
16864e ¤   ¤   ¤   // ### Not two-PGPByte char compatible
7887c7 ¤   ¤   ¤
c9377c ¤   ¤   ¤   if( TooManyCharacters( 1 ) )
9af776 ¤   ¤   ¤   {
0e8853 ¤   ¤   ¤   ¤   SysBeep(1);
bcf622 ¤   ¤   ¤   ¤   break;
32a3a6 ¤   ¤   ¤   }
8087c7 ¤   ¤   ¤
a07806 ¤   ¤   ¤   numSpaces ¤ ¤   ¤   ¤   = mSpaceCountList[mPassphraseLength];
259d1e ¤   ¤   ¤   mSpacePassphraseLength¤ += numSpaces;
9e87c7 ¤   ¤   ¤
f3f7be ¤   ¤   ¤   mPassphrase[mPassphraseLength++] ¤  = theKey;
6feb0d ¤   ¤   ¤   mPassphrase[mPassphraseLength]¤ ¤   = 0;
7a87c7 ¤   ¤   ¤
85da94 ¤   ¤   ¤   if( mPassphraseHidden )
5bf776 ¤   ¤   ¤   {
67c136 ¤   ¤   ¤   ¤   UInt32¤ SpaceIndex;
042b85 ¤   ¤   ¤   ¤
40907a ¤   ¤   ¤   ¤   // If the passphrase is hidden, add the Spaces
f608ac ¤   ¤   ¤   ¤   for( SpaceIndex = 0; SpaceIndex < numSpaces; SpaceIndex++ )
3172c3 ¤   ¤   ¤   ¤   {
aa18fb ¤   ¤   ¤   ¤   ¤   TEKey( kOptionSpaceCharacter, mTextEditH );
7e2613 ¤   ¤   ¤   ¤   }
01a3a6 ¤   ¤   ¤   }
e1bb8c ¤   ¤   ¤   else
73f776 ¤   ¤   ¤   {
e21555 ¤   ¤   ¤   ¤   TEKey(theKey, mTextEditH);
a4a3a6 ¤   ¤   ¤   }
c887c7 ¤   ¤   ¤
6add6f ¤   ¤   ¤   UserChangedText();
24cdcb ¤   ¤   ¤   break;
7e0fe4 ¤   ¤   }
2c1b52 ¤   ¤
0fa506 ¤   ¤   case keyStatus_TEDelete:
cf5b34 ¤   ¤   {
bccabe ¤   ¤   ¤   if ((**mTextEditH).selEnd > 0)
cbf776 ¤   ¤   ¤   {
26835f ¤   ¤   ¤   ¤   UInt32¤ backspaceCount;
184472 ¤   ¤   ¤   ¤   UInt32¤ index;
a589d5 ¤   ¤   ¤   ¤   UInt32¤ numSpaces;
482b85 ¤   ¤   ¤   ¤
545acc ¤   ¤   ¤   ¤   FocusDraw();
6c2b85 ¤   ¤   ¤   ¤
92c00a ¤   ¤   ¤   ¤   pgpAssert( mPassphraseLength > 0 );
--ae4b 00072ec7b9740120204 Page 6 of CPassphraseEdit.cp
e0af5a
393db4 ¤   ¤   ¤   ¤   --mPassphraseLength;
b5e428 ¤   ¤   ¤   ¤   mPassphrase[mPassphraseLength] = 0;
b72b85 ¤   ¤   ¤   ¤
52f66a ¤   ¤   ¤   ¤   numSpaces = mSpaceCountList[mPassphraseLength];
4f3d72 ¤   ¤   ¤   ¤   mSpacePassphraseLength¤ -= numSpaces;
232b85 ¤   ¤   ¤   ¤
101fc1 ¤   ¤   ¤   ¤   if( mPassphraseHidden )
d072c3 ¤   ¤   ¤   ¤   {
d49ec0 ¤   ¤   ¤   ¤   ¤   backspaceCount = numSpaces;
1f2613 ¤   ¤   ¤   ¤   }
5bfa07 ¤   ¤   ¤   ¤   else
5972c3 ¤   ¤   ¤   ¤   {
7c7405 ¤   ¤   ¤   ¤   ¤   backspaceCount = 1;
142613 ¤   ¤   ¤   ¤   }
b52b85 ¤   ¤   ¤   ¤
7df01a ¤   ¤   ¤   ¤   for( index = 0; index < backspaceCount; index++ )
1672c3 ¤   ¤   ¤   ¤   {
301baa ¤   ¤   ¤   ¤   ¤   ::TEKey(char_Backspace, mTextEditH);
242613 ¤   ¤   ¤   ¤   }
11af5a
0b5110 ¤   ¤   ¤   ¤   UserChangedText();
2da3a6 ¤   ¤   ¤   }
0c87c7 ¤   ¤   ¤
98cdcb ¤   ¤   ¤   break;
3f0fe4 ¤   ¤   }
df87c7 ¤   ¤   ¤
a9722f ¤   ¤   case keyStatus_TECursor:
56ed96 ¤   ¤   ¤   pgpDebugMsg( "CPassphraseEdit::HandleKeyPress: "
150c09 ¤   ¤   ¤   ¤   "Cursor key was not filtered!" );
04cdcb ¤   ¤   ¤   break;
c787c7 ¤   ¤   ¤
558227 ¤   ¤   case keyStatus_ExtraEdit:
61ed96 ¤   ¤   ¤   pgpDebugMsg( "CPassphraseEdit::HandleKeyPress: "
f48503 ¤   ¤   ¤   ¤   "Edit key was not filtered!" );
c0cdcb ¤   ¤   ¤   break;
c387c7 ¤   ¤   ¤
742231 ¤   ¤   case keyStatus_Reject:
b47e36 ¤   ¤   ¤   SysBeep(1);
2dcdcb ¤   ¤   ¤   break;
2c87c7 ¤   ¤   ¤
1bca3a ¤   ¤   case keyStatus_PassUp:
c6f473 ¤   ¤   ¤   // Skip all parent classes up to LCommander
522bd5 ¤   ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
b3cdcb ¤   ¤   ¤   break;
df9371 ¤   }
e467c5 ¤
b3c022 ¤   return keyHandled;
e0efe6 }
ddaf5a
ff9133 // ---------------------------------------------------------------------------
308a79 //¤ SelectAll
8f9133 // ---------------------------------------------------------------------------
21a225 //¤ Don't allow select all text. Instead, position the insertion point at the
7f9b6b //¤ end of the text.
4daf5a
ad6d52 ¤   void
601adb CPassphraseEdit::SelectAll(void)
9fbb36 {
21b8ef ¤   StFocusAndClipIfHidden¤ focus(this);
d7367d ¤   ::TESetSelect(max_Int16, max_Int16, mTextEditH);
80efe6 }
d5af5a
159133 // ---------------------------------------------------------------------------
eb6878 //¤ TooManyCharacters
599133 // ---------------------------------------------------------------------------
d92c83 //¤ The default implementation uses the onscreen representation to get the
34563a //¤ length of the text. This does not work when Spaces are being displayed.
fcaf5a
66af5a
d37e69 ¤   Boolean
7210f2 CPassphraseEdit::TooManyCharacters(Int32 inCharsToAdd)
--4336 001f3eda67340120204 Page 7 of CPassphraseEdit.cp
2cbb36 {
93c274 ¤   return( mPassphraseLength + inCharsToAdd > mMaxChars );
0befe6 }
c6af5a
9a9133 // ---------------------------------------------------------------------------
34bd09 //¤ SetDescriptor
579133 // ---------------------------------------------------------------------------
e920d2 //¤ Don't allow this call for passphrase fields. They always start out empty.
ecaf5a
d26d52 ¤   void
b2262f CPassphraseEdit::SetDescriptor(ConstStr255Param inDescriptor)
c4bb36 {
061b69 ¤   #pragma unused( inDescriptor )
1767c5 ¤
4c5196 ¤   pgpDebugMsg( "CPassphraseEdit::SetDescriptor(): "
0416be ¤   ¤   "This should never be called" );
95efe6 }
5caf5a
c19133 // ---------------------------------------------------------------------------
89192e //¤ ClearPassphrase
9e9133 // ---------------------------------------------------------------------------
3bd968 //¤ Clear out the passphrase and redraw.
c6af5a
a16d52 ¤   void
c133bb CPassphraseEdit::ClearPassphrase(void)
aebb36 {
1dcfac ¤   mPassphraseLength¤  ¤   = 0;
e59b71 ¤   mSpacePassphraseLength¤ = 0;
69af5a
c579a5 ¤   LEditText::SetDescriptor( "\p" );
d967c5 ¤
7de6c8 ¤   pgpClearMemory( mPassphrase, sizeof( mPassphrase ) );
0967c5 ¤
27bf70 ¤   Draw( nil );
67d16a ¤   BroadcastValueMessage();
1aefe6 }
a9af5a
0e9133 // ---------------------------------------------------------------------------
b0192e //¤ ClearPassphrase
829133 // ---------------------------------------------------------------------------
b1ba79 //¤ Identical to LEditText::ObeyCommand for the supported command, however
ffbed5 //¤ our SelectAll() implementation is used instead.
5daf5a
1f7e69 ¤   Boolean
ae163e CPassphraseEdit::ObeyCommand(CommandT inCommand, void *ioParam)
b5bb36 {
3d5b52 ¤   Boolean¤¤   cmdHandled = true;
2967c5 ¤
270617 ¤   switch( inCommand )
72c7a1 ¤   {
fa593e ¤   ¤   case msg_TabSelect:
e814e1 ¤   ¤   ¤   if( ! IsEnabled() )
4cf776 ¤   ¤   ¤   {
eb8c9b ¤   ¤   ¤   ¤   cmdHandled = false;
acf622 ¤   ¤   ¤   ¤   break;
582470 ¤   ¤   ¤   } // else FALL THRU to SelectAll()
d787c7 ¤   ¤   ¤
9d3513 ¤   ¤   case cmd_SelectAll:
864b5a ¤   ¤   ¤   SelectAll();
51cdcb ¤   ¤   ¤   break;
661b52 ¤   ¤
209ae3 ¤   ¤   default:
23a0ba ¤   ¤   ¤   cmdHandled = LEditText::ObeyCommand( inCommand, ioParam);
cacdcb ¤   ¤   ¤   break;
199371 ¤   }
8167c5 ¤
da51a4 ¤   return cmdHandled;
54efe6 }
f3af5a
--d458 001985af1ae40120205 Page 1 of CPassphraseEdit.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
273a05 ¤   $Id: CPassphraseEdit.h,v 1.10.16.1 1998/11/12 03:19:00 heller Exp $
11f7f7 ____________________________________________________________________________*/
ff7b7d #pragma once
afaf5a
ed7c09 #include <LEditText.h>
dcaf5a
044651 #define¤kMaxSpacesPerCharacter¤ ¤   2
2e42b4 #define kMaxPassphraseLength¤   ¤   255
3faf5a
209559 class CPassphraseEdit : public LEditText
aebb36 {
205ed4 public:
3a5d73 ¤   enum { class_ID = 'PPef' };
4445ce ¤   ¤   ¤   ¤   ¤   ¤   CPassphraseEdit(LStream *inStream);
be3867 ¤   virtual¤¤   ¤   ¤   ~CPassphraseEdit();
beaf5a
6e67b2 ¤   virtual¤void¤   ¤   ClearPassphrase(void);
4553d0 ¤   virtual¤PGPUInt32¤  EstimatePassphraseQuality(void);
4548a0 ¤   virtual void¤   ¤   FindCommandStatus(CommandT inCommand,
28eacc ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean& outEnabled,
c2ab0a ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean& outUsesMark, Char16& outMark,
8b1ce1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   Str255 outName);
05a86c ¤   virtual StringPtr¤  GetDescriptor(Str255 outDescriptor) const;
f02674 ¤   virtual void¤   ¤   GetPassphrase(char passphrase[256]);
5cf307 ¤   virtual¤PGPUInt32¤  GetPassphraseLength(void);
16c834 ¤   virtual Boolean¤¤   ObeyCommand(CommandT inCommand, void *ioParam);
833ee5 ¤   virtual void¤   ¤   SelectAll(void);
dc6615 ¤   virtual void¤   ¤   SetDescriptor(ConstStr255Param inDescriptor);
108843 ¤   void¤   ¤   ¤   ¤   SetHideTyping(Boolean hide);
07af5a
c88a01 ¤   static EKeyStatus¤  sPassphraseKeyFilter(TEHandle¤  inMacTEH,
fceafe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ···Char16¤  inKeyCode,
685a53 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ···Char16¤  &ioCharCode,
76c409 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ···UInt16¤  inModifiers);
e267c5 ¤
7ba2d3 protected:
6b6475 ¤   virtual void¤   ¤   AdjustCursorSelf(Point inPortPt,
9c94a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const EventRecord &inMacEvent);
978fbd ¤   virtual void¤   ¤   ClickSelf(const SMouseDownEvent &inMouseDown);
cefcc0 ¤   virtual Boolean¤¤   HandleKeyPress(const EventRecord& inKeyEvent);
843dab ¤   virtual Boolean¤¤   TooManyCharacters(Int32 inCharsToAdd);
f5af5a
510fb9 private:
3eaf5a
77295a ¤   Boolean mPassphraseHidden;
553df1 ¤   char¤   mPassphrase[kMaxPassphraseLength];
e963f3 ¤   char¤   mSpacePassphrase[kMaxPassphraseLength * kMaxSpacesPerCharacter];
8f2442 ¤   UInt32¤ mPassphraseLength;
1e7dd1 ¤   UInt32¤ mSpacePassphraseLength;
3e67c5 ¤
827132 ¤   static UInt32¤  mNumActiveFields;
9e912a ¤   static UInt8¤   mSpaceCountList[kMaxPassphraseLength];
9882f7 };
--46c4 000dd494bc740120206 Page 1 of CPicture.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
a58631 ¤   This class implements the PowerPlant LPicture class with one addition:
7121ac ¤   when the bit depth is less than 8 bits, the picture drawn is the one
56dcaa ¤   referenced by mPICTid + 1, if present. It is assumed that the two
0b1e99 ¤   pictures are the same size.
38af5a
df9a37 ¤   $Id: CPicture.cp,v 1.7.16.1 1998/11/12 03:19:01 heller Exp $
02f7f7 ____________________________________________________________________________*/
cbaf5a
5cc857 #include <LowMEm.h>
86af5a
5df38b #include <LStream.h>
23e8ae #include <UDrawingUtils.h>
8caf5a
5e0d08 #include "pgpMem.h"
aeaf5a
4f0021 #include "CPicture.h"
3baf5a
0a9133 // ---------------------------------------------------------------------------
04743b //¤ Constructors/Destructors
609133 // ---------------------------------------------------------------------------
9eaf5a
46799a CPicture::CPicture(LStream *inStream)
6a04bd ¤   ¤   : LPicture(inStream)
5bbb36 {
125a8a ¤   SPictureInfo¤   pictInfo;
b567c5 ¤
d62145 ¤   inStream->ReadData( &pictInfo, sizeof(pictInfo) );
6e6353 ¤   InitCPicture( &pictInfo );
5cefe6 }
34af5a
07fca8 CPicture::~CPicture(void)
f1bb36 {
b1efe6 }
24af5a
a69133 // ---------------------------------------------------------------------------
4e39d1 //¤ InitCPicture
479133 // ---------------------------------------------------------------------------
1faf5a
5b6d52 ¤   void
aff2f4 CPicture::InitCPicture(const SPictureInfo *pictInfo)
67bb36 {
e42b53 ¤   Handle¤ thePicture;
c370ef ¤   Boolean¤saveResLoad;
0f67c5 ¤
a6617d ¤   pgpAssertAddrValid( pictInfo, SPictureInfo );
21af5a
661d9a ¤   mBWResID¤   = pictInfo->bwResID;
3639eb ¤   m4BitResID¤ = pictInfo->color4BitResID;
f32001 ¤   // 8 bit Resource ID comes from LPicture
45d36c ¤   m16BitResID¤= pictInfo->color16BitResID;
c07832 ¤   m24BitResID¤= pictInfo->color24BitResID;
9767c5 ¤
234758 ¤   pgpAssert( mBWResID != 0 );
098e32 ¤   pgpAssert( m4BitResID != 0 );
22f4fc ¤   pgpAssert( m16BitResID != 0 );
adb0e9 ¤   pgpAssert( m24BitResID != 0 );
e367c5 ¤
08f85d ¤   // Determine if we have pictures available. If not, we revert to the
2aff56 ¤   // next lowest bit depth
954407 ¤   saveResLoad = LMGetResLoad();
8ee7a3 ¤   SetResLoad( FALSE );
4967c5 ¤
24d872 ¤   thePicture = GetResource( 'PICT', mBWResID );
952852 ¤   if( IsNull( thePicture ) )
18c7a1 ¤   {
823d7a ¤   ¤   // Special case: BW Res ID becomes the 8-bit resource ID if not present.
dd6021 ¤   ¤   mBWResID = mPICTid;
--3e8f 0002a4416c440120206 Page 2 of CPicture.cp
a19371 ¤   }
9967c5 ¤
16f99c ¤   thePicture = GetResource( 'PICT', m4BitResID );
722852 ¤   if( IsNull( thePicture ) )
f6c7a1 ¤   {
ea563c ¤   ¤   m4BitResID = mBWResID;
4f9371 ¤   }
beaf5a
b785ad ¤   thePicture = GetResource( 'PICT', m16BitResID );
082852 ¤   if( IsNull( thePicture ) )
08c7a1 ¤   {
3212a9 ¤   ¤   m16BitResID = mPICTid;
bd9371 ¤   }
8daf5a
ea0dc9 ¤   thePicture = GetResource( 'PICT', m24BitResID );
2a2852 ¤   if( IsNull( thePicture ) )
5bc7a1 ¤   {
e48bda ¤   ¤   m24BitResID = m16BitResID;
6e9371 ¤   }
9d67c5 ¤
4de5c7 ¤   SetResLoad( TRUE );
1befe6 }
62af5a
8a9133 // ---------------------------------------------------------------------------
23b802 //¤ DrawSelf
4a9133 // ---------------------------------------------------------------------------
a3af5a
3d6d52 ¤   void
65678f CPicture::DrawSelf(void)
9dbb36 {
da4cd0 ¤   Rect¤   ¤   paneRect;
773866 ¤   ResIDT¤ ¤   savePictID;
a167c5 ¤
7e72f7 ¤   savePictID = mPICTid;
c467c5 ¤
3e865e ¤   CalcLocalFrameRect( paneRect );
d5af5a
6ac7a1 ¤   {
88f476 ¤   ¤   StDeviceLoop¤   devLoop( paneRect );¤   ¤
3b77ad ¤   ¤   SInt16¤ ¤   ¤   depth;
9b5a9b ¤   ¤   RGBColor¤   ¤   saveBackColor;
c444a2 ¤   ¤   static RGBColor¤sRGBWhiteColor = {0xFFFF, 0xFFFF, 0xFFFF};
08af5a
758a85 ¤   ¤   GetBackColor( &saveBackColor );
13fe4f ¤   ¤   RGBBackColor( &sRGBWhiteColor );
f51b52 ¤   ¤
ba3977 ¤   ¤   while( devLoop.NextDepth( depth ) )
b85b34 ¤   ¤   {
a28e8e ¤   ¤   ¤   if( depth >= 24 )
48f776 ¤   ¤   ¤   {
ea7cfa ¤   ¤   ¤   ¤   mPICTid = m24BitResID;
45a3a6 ¤   ¤   ¤   }
b7d47f ¤   ¤   ¤   else if( depth >= 16 )
14f776 ¤   ¤   ¤   {
f95036 ¤   ¤   ¤   ¤   mPICTid = m16BitResID;
35a3a6 ¤   ¤   ¤   }
a08c56 ¤   ¤   ¤   else if( depth >= 8 )
53f776 ¤   ¤   ¤   {
851930 ¤   ¤   ¤   ¤   // Nothing special to do
f2a3a6 ¤   ¤   ¤   }
f51b62 ¤   ¤   ¤   else if( depth >= 4 )
4cf776 ¤   ¤   ¤   {
f2db5f ¤   ¤   ¤   ¤   mPICTid = m4BitResID;
efa3a6 ¤   ¤   ¤   }
4dbb8c ¤   ¤   ¤   else
92f776 ¤   ¤   ¤   {
f285f8 ¤   ¤   ¤   ¤   mPICTid = mBWResID;
1ea3a6 ¤   ¤   ¤   }
62af5a
850098 ¤   ¤   ¤   LPicture::DrawSelf();
890fe4 ¤   ¤   }
2a67c5 ¤
--8d63 0014ef0de7840120206 Page 3 of CPicture.cp
fe6054 ¤   ¤   RGBBackColor( &saveBackColor );
b49371 ¤   }
f267c5 ¤
898399 ¤   mPICTid = savePictID;
4eefe6 }
--f296 001ee09c4b440120207 Page 1 of CPicture.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
c56285 ¤   $Id: CPicture.h,v 1.5.16.1 1998/11/12 03:19:02 heller Exp $
caf7f7 ____________________________________________________________________________*/
9caf5a
047b7d #pragma once
b2af5a
ddde32 #include <LPicture.h>
d2af5a
57af46 #pragma options align=mac68k
5eaf5a
523a28 typedef struct SPictureInfo
95bb36 {
995d1e ¤   ResIDT¤ ¤   bwResID;
769830 ¤   ResIDT¤ ¤   color4BitResID;
f2cb84 ¤   ResIDT¤ ¤   color16BitResID;
a3e748 ¤   ResIDT¤ ¤   color24BitResID;
ea5877 ¤   UInt32¤ ¤   reserved[3];
8567c5 ¤
91995d } SPictureInfo;
92af5a
8a7c46 #pragma options align=reset
00af5a
44d368 class CPicture : public LPicture
4ebb36 {
455ed4 public:
4b0ed3 ¤   enum { class_ID = 'Pict' };
baaf5a
95c8e6 ¤   ¤   ¤   ¤   ¤   ¤   CPicture(LStream *inStream);
c73335 ¤   virtual¤¤   ¤   ¤   ~CPicture(void);
6767c5 ¤
f0a2d3 protected:
22af5a
21bc52 ¤   ResIDT¤ ¤   ¤   ¤   mBWResID;
102592 ¤   ResIDT¤ ¤   ¤   ¤   m4BitResID;
7a4d21 ¤   ResIDT¤ ¤   ¤   ¤   m16BitResID;
4661ed ¤   ResIDT¤ ¤   ¤   ¤   m24BitResID;
fc67c5 ¤
6ee40b ¤   virtual void¤   ¤   DrawSelf(void);
2e67c5 ¤
a20fb9 private:
26af5a
febe73 ¤   void¤   ¤   ¤   ¤   InitCPicture(const SPictureInfo *pictInfo);
eebf26 };¶
--3ada 0004627a32640120208 Page 1 of CProgressBar.cp
a70335 /*____________________________________________________________________________
bdcfc2 ¤   Copyright (C) 1996 Network Associates, Inc. and its affiliates.
994b0f ¤   All rights reserved.
dc67c5 ¤
06226e ¤   $Id: CProgressBar.cp,v 1.2.28.1 1998/11/12 03:19:02 heller Exp $
24f7f7 ____________________________________________________________________________*/
b2af5a
c8af5a
62e8ae #include <UDrawingUtils.h>
95af5a
d17ffa #include "CProgressBar.h"
1faf5a
778e7e static RGBColor¤sRGBBlackColor ¤= {0, 0, 0};
659cb2 static RGBColor¤sRGBWhiteColor ¤= {0xFFFF, 0xFFFF, 0xFFFF};
c9af5a
3422a4 // Remove dependency on qd:
687d22 static Pattern¤ sBlackPattern¤  =·
0ef3df ¤   {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
a0af5a
d8af5a
54af5a
b3b848 CProgressBar::CProgressBar(LStream *inStream) : LPane(inStream)
2fbb36 {
44f936 ¤   InitProgressBar();
b9efe6 }
11af5a
632a81 CProgressBar::CProgressBar() : LPane()
b7bb36 {
e4f936 ¤   InitProgressBar();
efefe6 }
04af5a
7675ee CProgressBar::~CProgressBar()
51bb36 {
f6efe6 }
b9af5a
9caf5a
41af5a
2d6d52 ¤   void
8238df CProgressBar::InitProgressBar(void)
abbb36 {
68a1ab ¤   mPercentComplete¤   = 0;
5967c5 ¤
fd48e9 ¤   mForeColor.red¤ ¤   = 0x4444;¤  ¤   // Dark gray
83f840 ¤   mForeColor.green¤   = 0x4444;
6c50bf ¤   mForeColor.blue¤¤   = 0x4444;
1667c5 ¤
6a14f4 ¤   mBackColor.red¤ ¤   = 0xCCCC;¤  ¤   // Blue/purple
60b6b8 ¤   mBackColor.green¤   = 0xCCCC;
307b7e ¤   mBackColor.blue¤¤   = 0xFFFF;
6fefe6 }
e8af5a
3faf5a
7d6d52 ¤   void
56276e CProgressBar::DrawSelf(void)
fbbb36 {
096fea ¤   Rect¤   barRect;
211dcb ¤   Rect¤   backFillRect;
4207a4 ¤   Rect¤   foreFillRect;
4567c5 ¤
5acd4a ¤   pgpAssert( mPercentComplete <= 100 );
3667c5 ¤
549ecb ¤   FocusDraw();
e21578 ¤   PenNormal();
0d67c5 ¤
b86209 ¤   CalcLocalFrameRect( barRect );
6bdff5 ¤   FrameRect( &barRect );¤
6ca6dd ¤   InsetRect( &barRect, 1, 1 );
6167c5 ¤
fdd080 ¤   foreFillRect ¤  ¤   = barRect;
5fec17 ¤   foreFillRect.right ¤= foreFillRect.left +
19fbe5 ¤   ¤   ·( ( ( barRect.right - barRect.left ) * mPercentComplete ) / 100 );
4667c5 ¤
--957b 0009eec3e2440120208 Page 2 of CProgressBar.cp
a82533 ¤   backFillRect¤   ¤   = barRect;
04bde0 ¤   backFillRect.left¤  = foreFillRect.right;
b867c5 ¤
29c7a1 ¤   {
50da9d ¤   ¤   StDeviceLoop¤   devLoop( barRect );¤¤
1677ad ¤   ¤   SInt16¤ ¤   ¤   depth;
d20751 ¤   ¤   RGBColor¤   ¤   saveForeColor;
975a9b ¤   ¤   RGBColor¤   ¤   saveBackColor;
931b52 ¤   ¤
a68781 ¤   ¤   GetForeColor( &saveForeColor );
a4af5a
de8a85 ¤   ¤   GetBackColor( &saveBackColor );
aefe4f ¤   ¤   RGBBackColor( &sRGBWhiteColor );
901b52 ¤   ¤
0c3977 ¤   ¤   while( devLoop.NextDepth( depth ) )
9fed49 ¤   ¤   {¤
5f5f1b ¤   ¤   ¤   if( foreFillRect.left != foreFillRect.right )
93f776 ¤   ¤   ¤   {
1593ad ¤   ¤   ¤   ¤   if( depth >= 8 )
2072c3 ¤   ¤   ¤   ¤   {
f7c2ee ¤   ¤   ¤   ¤   ¤   RGBForeColor( &mForeColor );
172613 ¤   ¤   ¤   ¤   }
62fa07 ¤   ¤   ¤   ¤   else
ce72c3 ¤   ¤   ¤   ¤   {
a3b2b3 ¤   ¤   ¤   ¤   ¤   RGBForeColor( &sRGBBlackColor );
942613 ¤   ¤   ¤   ¤   }
e82b85 ¤   ¤   ¤   ¤
261104 ¤   ¤   ¤   ¤   FillRect( &foreFillRect, &sBlackPattern );
5da3a6 ¤   ¤   ¤   }
8faf5a
e887c6 ¤   ¤   ¤   if( backFillRect.left != backFillRect.right )
e1f776 ¤   ¤   ¤   {
a693ad ¤   ¤   ¤   ¤   if( depth >= 8 )
0072c3 ¤   ¤   ¤   ¤   {
597c54 ¤   ¤   ¤   ¤   ¤   RGBForeColor( &mBackColor );
e12613 ¤   ¤   ¤   ¤   }
1ffa07 ¤   ¤   ¤   ¤   else
2472c3 ¤   ¤   ¤   ¤   {
4ca537 ¤   ¤   ¤   ¤   ¤   RGBForeColor( &sRGBWhiteColor );
0e2613 ¤   ¤   ¤   ¤   }
372b85 ¤   ¤   ¤   ¤
f99b5b ¤   ¤   ¤   ¤   FillRect( &backFillRect, &sBlackPattern );
5ca3a6 ¤   ¤   ¤   }
a40fe4 ¤   ¤   }
1f67c5 ¤
896d50 ¤   ¤   RGBForeColor( &saveForeColor );
496054 ¤   ¤   RGBBackColor( &saveBackColor );
929371 ¤   }
0fefe6 }
93af5a
32af5a
a86d52 ¤   void
1c6c4f CProgressBar::SetPercentComplete(UInt32 percentComplete)
22bb36 {
8a884b ¤   pgpAssert( percentComplete <= 100 );
4767c5 ¤
9604d3 ¤   if( percentComplete > 100 )
3ea66f ¤   ¤   percentComplete = 100;
ef1b52 ¤   ¤
db8346 ¤   if( percentComplete != mPercentComplete )
2dc7a1 ¤   {
97b9cd ¤   ¤   mPercentComplete = percentComplete;
34fefb ¤   ¤   Draw( nil );
c29371 ¤   }
20efe6 }
d5af5a
343ac2 //¤ Sprecify the foreground and/or background colors of a Window
e4465d //
c8055a //¤ Specify nil for inForeColor and/or inBackColor to leave that
837d33 //¤ color trait unchanged
8aaf5a
9e6d52 ¤   void
--bbff 001ad60b2b240120208 Page 3 of CProgressBar.cp
551112 CProgressBar::SetForeAndBackColors(
ee820c ¤   const RGBColor¤ *foreColor,
aca17e ¤   const RGBColor¤ *backColor)
a1bb36 {
bfc052 ¤   if ( foreColor != nil )
3d5925 ¤   ¤   mForeColor = *foreColor;
f567c5 ¤
58e8fb ¤   if( backColor != nil )
574f59 ¤   ¤   mBackColor = *backColor;
adefe6 }
--e70c 00157da04a240120209 Page 1 of CProgressBar.h
a70335 /*____________________________________________________________________________
7bf254 ¤   Copyright (C) 1996,1997 Network Associates, Inc. and its affiliates.
754b0f ¤   All rights reserved.
0967c5 ¤
f70c7f ¤   $Id: CProgressBar.h,v 1.2.34.1 1998/11/12 03:19:03 heller Exp $
01f7f7 ____________________________________________________________________________*/
8caf5a
e87b7d #pragma once
00af5a
1860c3 #include <LPane.h>
1aaf5a
10f078 class CProgressBar : public LPane
62bb36 {
9d5ed4 public:
07af5a
68300e ¤   enum { class_ID = 'PBar' };
9baf5a
90cb7e ¤   ¤   ¤   ¤   ¤   ¤   CProgressBar();
5bb2c4 ¤   ¤   ¤   ¤   ¤   ¤   CProgressBar(LStream *inStream);
9767c5 ¤
4ea6cb ¤   virtual¤¤   ¤   ¤   ~CProgressBar();
07af5a
3e8abf ¤   virtual void¤   ¤   SetForeAndBackColors(const RGBColor *inForeColor,
45bd9d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const RGBColor *inBackColor);
c55759 ¤   void¤   ¤   ¤   ¤   SetPercentComplete(UInt32 percentComplete);
50af5a
e5a2d3 protected:
50af5a
58f350 ¤   RGBColor¤   ¤   mForeColor;
a8ae9a ¤   RGBColor¤   ¤   mBackColor;
a0ae21 ¤   UInt32¤ ¤   ¤   mPercentComplete;
3667c5 ¤
083d8c ¤   void¤   ¤   ¤   InitProgressBar(void);
3a7761 ¤   virtual¤void¤   DrawSelf(void);
5782f7 };
--8f56 0012532d19f4012020a Page 1 of CVersionCaption.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
c526d8 ¤   This class implements a caption field which displays the version
9e5c21 ¤   number found in the 'vers' 1 resource.
abaf5a
1f7bbd ¤   $Id: CVersionCaption.cp,v 1.4.26.1 1998/11/12 03:19:04 heller Exp $
18f7f7 ____________________________________________________________________________*/
d10d08 #include "pgpMem.h"
c2af5a
fe85c2 #include "MacStrings.h"
c7af5a
6ae7cd #include "CVersionCaption.h"
53af5a
ed626f CVersionCaption::CVersionCaption(LStream *inStream)
456b75 ¤   ¤   : LCaption(inStream)
83bb36 {
43efe6 }
e3af5a
6216db CVersionCaption::~CVersionCaption(void)
bbbb36 {
67efe6 }
b4af5a
f26d52 ¤   void
9411d8 CVersionCaption::FinishCreateSelf(void)
24bb36 {
c53c5b ¤   Str255¤ ¤   versionString;
c27be7 ¤   VersRec¤¤   **versionResource;
0a67c5 ¤
bfe2e9 ¤   LCaption::FinishCreateSelf();
4467c5 ¤
68db2a ¤   versionString[0] = 0;
c567c5 ¤
f00732 ¤   versionResource = (VersRec **) GetResource( 'vers', 1 );
131970 ¤   if( IsntNull( versionResource ) )
08c7a1 ¤   {
15090a ¤   ¤   NumVersion numVersionCopy;
9b1b52 ¤   ¤
6783d3 ¤   ¤   // NumVersionToString will move memory.
159635 ¤   ¤   // Copy the numVersion field from
a170a9 ¤   ¤   // the resource to a local variable.
9b8a49 ¤   ¤   numVersionCopy = (**versionResource).numericVersion;
457876 ¤   ¤   ReleaseResource( (Handle) versionResource );
a81b52 ¤   ¤
93721a ¤   ¤   NumVersionToString( &numVersionCopy, versionString );
949371 ¤   }
c50e24 ¤   else
64c7a1 ¤   {
50345d ¤   ¤   pgpDebugMsg( "CVersionCaption: No 'vers' resource found" );
529371 ¤   }
fbaf5a
6bb75b ¤   SetDescriptor( versionString );
25efe6 }
--bfbc 001f0798a6f4012020b Page 1 of CVersionCaption.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
c698f3 ¤   $Id: CVersionCaption.h,v 1.2.16.1 1998/11/12 03:19:05 heller Exp $
bdf7f7 ____________________________________________________________________________*/
03af5a
607b7d #pragma once
63af5a
3425ae #include <LCaption.h>
4baf5a
fca71a class CVersionCaption : public LCaption
f4bb36 {
7d5ed4 public:
40af5a
dc2748 ¤   enum { class_ID = 'VCpt' };
60af5a
1f05d5 ¤   ¤   ¤   ¤   ¤   ¤   CVersionCaption(LStream *inStream);
f37500 ¤   virtual¤¤   ¤   ¤   ~CVersionCaption(void);
5a67c5 ¤
8fa2d3 protected:
b7af5a
51febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
f0bf26 };¶
--6677 000f0c19d8d4012020c Page 1 of CWarningAlert.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
ee3fb8 ¤   $Id: CWarningAlert.cp,v 1.11.12.1 1998/11/12 03:19:05 heller Exp $
eaf7f7 ____________________________________________________________________________*/
84af5a
a0b980 #include <Appearance.h>
6276ae #include <LIconControl.h>
c1d797 #include <LPushButton.h>
6a05c6 #include <LStaticText.h>
23dd56 #include <PP_Messages.h>
56afac #include <UModalDialogs.h>
6075de #include <UWindows.h>
f7af5a
d759c5 #include "CPGPStDialogHandler.h"
44af5a
518bd8 #include "MacEnvirons.h"
b285c2 #include "MacStrings.h"
620d08 #include "pgpMem.h"
5eaf5a
1b9dc2 #include "CWarningAlert.h"
4baf5a
029e67 const ResIDT¤   kWarningAlertStringsResID¤  = 31500;
9eaf5a
c38d67 const PaneIDT¤  kOKButtonPaneID¤¤   ¤   = 31501;
5bcc3b const PaneIDT¤  kCancelButtonPaneID ¤   = 31502;
694044 const PaneIDT¤  kMessageCaptionPaneID ¤ = 31503;
aef4a5 const PaneIDT¤  kStopIconPaneID ¤   ¤   = 31504;
af1356 const PaneIDT¤  kNoteIconPaneID ¤   ¤   = 31505;
84e516 const PaneIDT¤  kCautionIconPaneID ¤¤   = 31506;
d7af5a
6c7353 enum
e0bb36 {
53f168 ¤   kOKStrIndex¤= 1,
ea3a0f ¤   kCancelStrIndex,
94c764 ¤   kYesStrIndex,
cce907 ¤   kNoStrIndex
8782f7 };
6eaf5a
b0af5a
e5af5a
237e69 ¤   Boolean
2b2931 CWarningAlert::SetupDialog(
7ec44d ¤   WarningAlertType ¤  alertType,
563cf3 ¤   WarningAlertStyle ¤ alertStyle,
03ae39 ¤   ConstStr255Param ¤  baseMessage,
8eb242 ¤   ConstStr255Param¤   str1,
375d26 ¤   ConstStr255Param¤   str2,
165b70 ¤   ConstStr255Param¤   str3 )
34bb36 {
743929 ¤   Boolean¤¤   valid = FALSE;
bbaf5a
db9394 ¤   pgpAssertAddrValid( this, CWarningAlert );
5f8ffa ¤   pgpAssertAddrValid( baseMessage, uchar );
6aaf5a
1f04ed ¤   if( alertType != kWACustomAlertType )
15c7a1 ¤   {
32c4e9 ¤   ¤   PaneIDT¤¤   ¤   iconPaneID;
614b90 ¤   ¤   LIconControl¤   *iconObj;
831b52 ¤   ¤
7b2d3e ¤   ¤   switch( alertType )
575b34 ¤   ¤   {
afdb68 ¤   ¤   ¤   default:
98749a ¤   ¤   ¤   ¤   pgpDebugMsg( "WarningAlertString: Invalid alert type" );
f9f05f ¤   ¤   ¤   ¤   /* fall thru */
e11bb7 ¤   ¤   ¤   case kWANoteAlertType:
932dbd ¤   ¤   ¤   ¤   iconPaneID = kNoteIconPaneID;
cef622 ¤   ¤   ¤   ¤   break;
f0af5a
--4378 0000f2b39bf4012020c Page 2 of CWarningAlert.cp
94dc1f ¤   ¤   ¤   case kWACautionAlertType:
029593 ¤   ¤   ¤   ¤   iconPaneID = kCautionIconPaneID;
57f622 ¤   ¤   ¤   ¤   break;
40af5a
bdde8c ¤   ¤   ¤   case kWAStopAlertType:
68a228 ¤   ¤   ¤   ¤   iconPaneID = kStopIconPaneID;
77f622 ¤   ¤   ¤   ¤   break;
e10fe4 ¤   ¤   }
9e1b52 ¤   ¤
b7af5a
e86922 ¤   ¤   iconObj = (LIconControl *) FindPaneByID( iconPaneID );
355e50 ¤   ¤   pgpAssertAddrValid( iconObj, VoidAlign );
5eaf5a
35a6d9 ¤   ¤   iconObj->Show();
139371 ¤   }
a1af5a
c27c78 ¤   if( alertStyle != kWACustomAlertStyle )
7ec7a1 ¤   {
0b4ea5 ¤   ¤   short¤  ¤   okButtonStrIndex;
3a79ee ¤   ¤   short¤  ¤   cancelButtonStrIndex;
4fa8eb ¤   ¤   Boolean¤¤   hideCancelButton;
06f1b9 ¤   ¤   PaneIDT¤¤   defaultButtonPaneID;
4efe2e ¤   ¤   PaneIDT¤¤   cancelButtonPaneID;
abbc40 ¤   ¤   Str255¤ ¤   tempStr;
88af5a
bada67 ¤   ¤   okButtonStrIndex ¤  ¤   = kOKStrIndex;
2bb454 ¤   ¤   cancelButtonStrIndex¤   = kCancelStrIndex;
adac8a ¤   ¤   hideCancelButton¤   ¤   = FALSE;
004ed3 ¤   ¤   defaultButtonPaneID¤¤   = kOKButtonPaneID;
b06aab ¤   ¤   cancelButtonPaneID¤ ¤   = kCancelButtonPaneID;
79af5a
305c79 ¤   ¤   switch( alertStyle )
3e5b34 ¤   ¤   {
95db68 ¤   ¤   ¤   default:
a8de5c ¤   ¤   ¤   ¤   pgpDebugMsg( "WarningAlertString: Invalid alert style" );
baf05f ¤   ¤   ¤   ¤   /* fall thru */
70585c ¤   ¤   ¤   case kWAOKStyle:
427ed4 ¤   ¤   ¤   ¤   hideCancelButton = TRUE;
61f622 ¤   ¤   ¤   ¤   break;
66af5a
98f9e6 ¤   ¤   ¤   case kWACancelStyle:
708d55 ¤   ¤   ¤   ¤   okButtonStrIndex¤   = kCancelStrIndex;
0acd90 ¤   ¤   ¤   ¤   hideCancelButton ¤  = TRUE;
53f622 ¤   ¤   ¤   ¤   break;
e8af5a
70badf ¤   ¤   ¤   case kWAOKCancelStyle:
e80c23 ¤   ¤   ¤   ¤   // Nothing to do.
32f622 ¤   ¤   ¤   ¤   break;
c5af5a
0e2b44 ¤   ¤   ¤   case kWACancelOKStyle:
4f1d83 ¤   ¤   ¤   ¤   defaultButtonPaneID = kCancelButtonPaneID;
405478 ¤   ¤   ¤   ¤   cancelButtonPaneID¤ = kOKButtonPaneID;
c3f622 ¤   ¤   ¤   ¤   break;
e2af5a
89db19 ¤   ¤   ¤   case kWAYesNoStyle:
9cf6dd ¤   ¤   ¤   ¤   okButtonStrIndex ¤  ¤   = kYesStrIndex;
0165f9 ¤   ¤   ¤   ¤   cancelButtonStrIndex¤   = kNoStrIndex;
b4f622 ¤   ¤   ¤   ¤   break;
33af5a
f4f8ed ¤   ¤   ¤   case kWANoYesStyle:
16b060 ¤   ¤   ¤   ¤   defaultButtonPaneID ¤   = kCancelButtonPaneID;
c1cab0 ¤   ¤   ¤   ¤   cancelButtonPaneID¤ ¤   = kOKButtonPaneID;
ae2a78 ¤   ¤   ¤   ¤   okButtonStrIndex ¤  ¤   = kNoStrIndex;
d86313 ¤   ¤   ¤   ¤   cancelButtonStrIndex¤   = kYesStrIndex;
f0f622 ¤   ¤   ¤   ¤   break;
710fe4 ¤   ¤   }
62af5a
aea199 ¤   ¤   GetIndString( tempStr, kWarningAlertStringsResID, okButtonStrIndex );
edd703 ¤   ¤   SetButtonTitle( kOKButtonPaneID, tempStr );
09af5a
ccccf3 ¤   ¤   if( hideCancelButton )
0f5b34 ¤   ¤   {
--cdb9 000eb5dc59b4012020c Page 3 of CWarningAlert.cp
ea61fd ¤   ¤   ¤   HideCancelButton();
4b0fe4 ¤   ¤   }
fd0e1d ¤   ¤   else
f45b34 ¤   ¤   {
d3e158 ¤   ¤   ¤   GetIndString( tempStr, kWarningAlertStringsResID,
b17d5f ¤   ¤   ¤   ¤   cancelButtonStrIndex );
d57d81 ¤   ¤   ¤   SetButtonTitle( kCancelButtonPaneID, tempStr );
c20fe4 ¤   ¤   }
55af5a
a84849 ¤   ¤   if( defaultButtonPaneID != kOKButtonPaneID )
d25b34 ¤   ¤   {
5314dd ¤   ¤   ¤   SetDefaultButton( defaultButtonPaneID );
b80fe4 ¤   ¤   }
d2af5a
3a8bd8 ¤   ¤   if( cancelButtonPaneID != kCancelButtonPaneID )
765b34 ¤   ¤   {
c61929 ¤   ¤   ¤   SetCancelButton( cancelButtonPaneID );
d60fe4 ¤   ¤   }
ec9371 ¤   }
62af5a
1fdd16 ¤   Str255¤ ¤   realMessage;
548737 ¤   InsertPStrings( baseMessage, str1, str2, str3, realMessage );
941454 ¤   SetMessage( realMessage );
38af5a
58193d ¤   valid = TRUE;
fdaf5a
5a0b09 ¤   return( valid );
faaf5a
87efe6 }
d7af5a
ffaf5a
51af5a
86af5a
fa9cb9 ¤   MessageT
0a80d0 CWarningAlert::DisplayCustom(
74704c ¤   short¤  ¤   ¤   ¤   dialogResID,
11c44d ¤   WarningAlertType ¤  alertType,
3c3cf3 ¤   WarningAlertStyle ¤ alertStyle,
0067c0 ¤   ConstStr255Param¤   message,
a5b242 ¤   ConstStr255Param¤   str1,
4d5d26 ¤   ConstStr255Param¤   str2,
1c7942 ¤   ConstStr255Param¤   str3)
21bb36 {
e5f050 ¤   CPGPStDialogHandler¤dialogHandler( dialogResID, nil );
b8cc27 ¤   CWarningAlert¤  *dialogObj;
f7df54 ¤   MessageT¤   ¤   result;
f3af5a
275d7d ¤   pgpAssertAddrValid( message, uchar );
05af5a
0f4277 ¤   dialogObj = (CWarningAlert *) dialogHandler.GetDialog();
1875ef ¤   if( IsNull( dialogObj ) )
6dc7a1 ¤   {
e20a3c ¤   ¤   pgpDebugMsg( "WarningAlertString: Nil dialog object" );
f80f00 ¤   ¤   return( msg_Cancel );
3d9371 ¤   }
3daf5a
18d413 ¤   if( dialogObj->SetupDialog( alertType, alertStyle,
af3081 ¤   ¤   ¤   message, str1, str2, str3 ) )
e1c7a1 ¤   {
970174 ¤   ¤   dialogObj->Show();
c8af5a
e4708a ¤   ¤   while (TRUE)
185b34 ¤   ¤   {
4049b8 ¤   ¤   ¤   result = dialogHandler.DoDialog();
4d70ae ¤   ¤   ¤   if( result > 0 )
1af622 ¤   ¤   ¤   ¤   break;
250fe4 ¤   ¤   }
87af5a
71ed58 ¤   ¤   dialogObj->Hide();
829371 ¤   }
810e24 ¤   else
ebc7a1 ¤   {
--0e82 00085d7edf14012020c Page 4 of CWarningAlert.cp
b7c467 ¤   ¤   result = msg_Cancel;
cb9371 ¤   }
ebaf5a
dd4c6e ¤   return( result );
98efe6 }
3faf5a
08af5a
6caf5a
779cb9 ¤   MessageT
1302a2 CWarningAlert::Display(
94c44d ¤   WarningAlertType ¤  alertType,
e03cf3 ¤   WarningAlertStyle ¤ alertStyle,
9367c0 ¤   ConstStr255Param¤   message,
b2b242 ¤   ConstStr255Param¤   str1,
865d26 ¤   ConstStr255Param¤   str2,
fc7942 ¤   ConstStr255Param¤   str3)
dfbb36 {
8c614a ¤   return( DisplayCustom( kWarningAlertDialogResID, alertType,
6d4f28 ¤   ¤   ¤   ¤   alertStyle, message, str1, str2, str3 ) );
0aefe6 }
2aaf5a
85af5a
79af5a
699cb9 ¤   MessageT
6202a2 CWarningAlert::Display(
45c44d ¤   WarningAlertType ¤  alertType,
e43cf3 ¤   WarningAlertStyle ¤ alertStyle,
618b94 ¤   ResIDT¤ ¤   ¤   ¤   stringListResID,
b71a16 ¤   short¤  ¤   ¤   ¤   stringListIndex,
6ab242 ¤   ConstStr255Param¤   str1,
615d26 ¤   ConstStr255Param¤   str2,
957942 ¤   ConstStr255Param¤   str3)
aebb36 {
552906 ¤   Str255¤ message;
e6af5a
481658 ¤   GetIndString( message, stringListResID, stringListIndex );
e593b9 ¤   pgpAssert( message[0] != 0 );
7daf5a
1833c3 ¤   return( Display( alertType, alertStyle, message, str1, str2, str3) );
d9efe6 }
d0af5a
11af5a
eeaf5a
26a244 CWarningAlert::CWarningAlert(LStream *inStream)
e51fb6 ¤   : LGADialog(inStream)
b5bb36 {
64efe6 }
0aaf5a
96db51 CWarningAlert::~CWarningAlert()
9fbb36 {
11efe6 }
25af5a
306d52 ¤   void
345994 CWarningAlert::FinishCreateSelf(void)
67bb36 {
94893a ¤   LGADialog::FinishCreateSelf();
e267c5 ¤
495627 ¤   if( HaveAppearanceMgr() )
7ac7a1 ¤   {
f0ccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
f64594 ¤   ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
499371 ¤   }
c4efe6 }
48af5a
ce6d52 ¤   void
272e65 CWarningAlert::ApplyForeAndBackColors(void) const
40bb36 {
305627 ¤   if( HaveAppearanceMgr() )
69c7a1 ¤   {
52ccb7 ¤   ¤   SetThemeWindowBackground( GetMacPort(),
d38188 ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
859371 ¤   }
--a103 000e8ea85254012020c Page 5 of CWarningAlert.cp
060e24 ¤   else
c2c7a1 ¤   {
ffc77b ¤   ¤   LGADialog::ApplyForeAndBackColors();
359371 ¤   }
74efe6 }
84af5a
3e6d52 ¤   void
bd4008 CWarningAlert::SetMessage(ConstStr255Param message)
33bb36 {
1b2905 ¤   LStaticText¤*captionObj;
cdaf5a
575d7d ¤   pgpAssertAddrValid( message, uchar );
e1af5a
8a10ad ¤   captionObj = (LStaticText *) FindPaneByID( kMessageCaptionPaneID );
ed301f ¤   pgpAssertAddrValid( captionObj, VoidAlign );
2eaf5a
cfaed4 ¤   if( IsntNull( captionObj ) )
4cc7a1 ¤   {
e81968 ¤   ¤   Rect¤   ¤   oldCaptionRect;
b0dbc9 ¤   ¤   Rect¤   ¤   newCaptionRect;
f92628 ¤   ¤   Rect¤   ¤   textRect;
003d3e ¤   ¤   FontInfo¤   fontInfo;
07f001 ¤   ¤   short¤  ¤   lineHeight;
45d6f9 ¤   ¤   TERec¤  ¤   **textTEH;
fb0afb ¤   ¤   short¤  ¤   numTextLines;
c49b03 ¤   ¤   short¤  ¤   heightDiff;
bbaf5a
2d5c82 ¤   ¤   // Resize the dialog vertically to account for large messages
3aaf5a
ebdf40 ¤   ¤   FocusDraw();
d6af5a
df9b80 ¤   ¤   captionObj->CalcPortFrameRect( oldCaptionRect );
59af5a
a7b716 ¤   ¤   // Calculate the height of the text by overlaying a TERecord on
b3e012 ¤   ¤   // top of the caption
b589b2 ¤   ¤   // pane and calculating the number of lines of text as calculated
5983d5 ¤   ¤   // by TECalText().
a80b1e ¤   ¤   // Then delete the TERecord and set the size of the dialog
c085a6 ¤   ¤   // appropriately.
2caf5a
5cef19 ¤   ¤   textRect¤   ¤   = oldCaptionRect;
d8b03d ¤   ¤   textRect.bottom = 32767;
a89f0a ¤   ¤   numTextLines¤   = 0;
a7af5a
4153a1 ¤   ¤   TextFont( 0 );
71db44 ¤   ¤   TextSize( 0 );
9faf5a
502014 ¤   ¤   textTEH = TENew( &textRect, &textRect );
6fe1e0 ¤   ¤   AssertHandleIsValid( textTEH, "SetMessage" );
feaf5a
d4b8f6 ¤   ¤   if( IsntNull( textTEH ) )
4b5b34 ¤   ¤   {
71c11b ¤   ¤   ¤   TESetText( &message[1], message[0], textTEH );
82b43d ¤   ¤   ¤   TECalText( textTEH );
d6af5a
6fe7d1 ¤   ¤   ¤   numTextLines = (**textTEH).nLines;
e0af5a
12c5dc ¤   ¤   ¤   TEDispose( textTEH );
cc0fe4 ¤   ¤   }
4faf5a
35a617 ¤   ¤   if( numTextLines < 3 )
d3cec5 ¤   ¤   ¤   numTextLines = 3;
04af5a
48c25e ¤   ¤   GetFontInfo( &fontInfo );
57bebe ¤   ¤   lineHeight = fontInfo.leading + fontInfo.ascent + fontInfo.descent;
daaf5a
15d17c ¤   ¤   newCaptionRect ¤¤   ¤   = oldCaptionRect;
9590da ¤   ¤   newCaptionRect.bottom¤  = newCaptionRect.top +
303245 ¤   ¤   ¤   (numTextLines * lineHeight );
9aaf5a
9f39a2 ¤   ¤   heightDiff = newCaptionRect.bottom - oldCaptionRect.bottom;
e822df ¤   ¤   if( heightDiff != 0 )
--25f1 001d10b0ef44012020c Page 6 of CWarningAlert.cp
e35b34 ¤   ¤   {
fc423b ¤   ¤   ¤   Rect¤   windowRect;
b2af5a
edc02b ¤   ¤   ¤   windowRect ¤¤   ¤   =
d09a2e ¤   ¤   ¤   ¤   UWindows::GetWindowContentRect( mMacWindowP );
8ab1f5 ¤   ¤   ¤   windowRect.bottom ¤ += heightDiff;
1baf5a
04c466 ¤   ¤   ¤   DoSetBounds( windowRect );
150fe4 ¤   ¤   }
b6af5a
a57b4f ¤   ¤   captionObj->SetDescriptor( message );
6a9371 ¤   }
58efe6 }
63af5a
c4af5a
f16d52 ¤   void
df4167 CWarningAlert::SetButtonTitle(PaneIDT buttonPaneID, ConstStr255Param
341f01 descriptor)
8dbb36 {
35fa1e ¤   LPushButton¤*buttonObj;
0faf5a
403e93 ¤   pgpAssertAddrValid( descriptor, uchar );
b4af5a
454506 ¤   buttonObj = (LPushButton *) FindPaneByID( buttonPaneID );
13f1ca ¤   pgpAssertAddrValid( buttonObj, VoidAlign );
34af5a
0d636b ¤   if( IsntNull( buttonObj ) )
ba3b6a ¤   ¤   buttonObj->SetDescriptor( descriptor );
b4efe6 }
8aaf5a
a0af5a
456d52 ¤   void
6ac67f CWarningAlert::HideCancelButton(void)
8fbb36 {
492ee7 ¤   LPushButton¤*controlObj;
01af5a
c0abc7 ¤   controlObj = (LPushButton *) FindPaneByID( kCancelButtonPaneID );
761db0 ¤   pgpAssertAddrValid( controlObj, VoidAlign );
1baf5a
a68d2a ¤   if( IsntNull( controlObj ) )
fb8056 ¤   ¤   controlObj->Hide();
b0efe6 }
d1af5a
--e097 00094db41094012020d Page 1 of CWarningAlert.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
d3bed7 ¤   $Id: CWarningAlert.h,v 1.6.12.1 1998/11/12 03:19:06 heller Exp $
1ff7f7 ____________________________________________________________________________*/
be7b7d #pragma once
0eaf5a
64f0a0 #include <LGADialog.h>
61af5a
f88a7b const ResIDT¤   kWarningAlertDialogResID = 31500;
e6af5a
1ffdf0 #include "WarningAlertTypes.h"
fcaf5a
7caf5a
ee7775 class CWarningAlert : public LGADialog
b6bb36 {
435ed4 public:
83af5a
b98b2f ¤   enum { class_ID = 'Warn' };
82af5a
da2711 ¤   ¤   ¤   ¤   ¤   CWarningAlert();
b80dd3 ¤   virtual¤¤   ¤   ~CWarningAlert();
05f167 ¤   ¤   ¤   ¤   ¤   CWarningAlert(LStream *inStream);
ceaf5a
7d6bbe ¤   virtual void¤   ApplyForeAndBackColors() const;
88159e ¤   void¤   ¤   ¤   HideCancelButton(void);
c5cfbf ¤   void¤   ¤   ¤   SetMessage(ConstStr255Param message);
8452b4 ¤   void¤   ¤   ¤   SetButtonTitle(PaneIDT buttonPaneID,
7cbb7c ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param descriptor);
e3af5a
026eaa ¤   Boolean¤¤   ¤   SetupDialog(
c1b154 ¤   ¤   ¤   ¤   ¤   ¤   WarningAlertType¤   alertType,
22c8d6 ¤   ¤   ¤   ¤   ¤   ¤   WarningAlertStyle¤  alertStyle,
34587b ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param¤   message,
a46a89 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param¤   str1 = NULL,
661ee0 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param¤   str2 = NULL,
d68b1c ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param¤   str3 = NULL);
b92b85 ¤   ¤   ¤   ¤
60af5a
53b017 ¤   static MessageT¤Display(WarningAlertType alertType,
b151cd ¤   ¤   ¤   ¤   ¤   ¤   WarningAlertStyle alertStyle,·
492ea6 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param message,
cb4f7f ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param str1 = NULL,
6e3b16 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param str2 = NULL,
4c1980 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param str3 = NULL);
a8ae30 ¤   ¤   ¤   ¤   ¤
dfb017 ¤   static MessageT¤Display(WarningAlertType alertType,
3351cd ¤   ¤   ¤   ¤   ¤   ¤   WarningAlertStyle alertStyle,·
ef8dc9 ¤   ¤   ¤   ¤   ¤   ¤   ResIDT stringListResID,
48f8bf ¤   ¤   ¤   ¤   ¤   ¤   short stringListIndex,
204f7f ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param str1 = NULL,
533b16 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param str2 = NULL,
671980 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param str3 = NULL);
22ae30 ¤   ¤   ¤   ¤   ¤
2bdc39 ¤   static MessageT¤DisplayCustom(
949028 ¤   ¤   ¤   ¤   ¤   ¤   short dialogResID,
1b1954 ¤   ¤   ¤   ¤   ¤   ¤   WarningAlertType alertType,
e93e07 ¤   ¤   ¤   ¤   ¤   ¤   WarningAlertStyle alertStyle,
852ea6 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param message,
cc4f7f ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param str1 = NULL,
473b16 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param str2 = NULL,
8d1980 ¤   ¤   ¤   ¤   ¤   ¤   ConstStr255Param str3 = NULL);
fcaf5a
48a2d3 protected:
fbaf5a
eaa2f8 ¤   virtual void¤   FinishCreateSelf(void);
aa82f7 };
bfaf5a
94af5a
--b2a0 0012c1fb6d54012020d Page 2 of CWarningAlert.h
e0af5a
1aaf5a
17af5a
78af5a
32af5a
93af5a
37af5a
a6af5a
33af5a
24af5a
c6af5a
2caf5a
--268a 00190b3f1654012020e Page 1 of CPGPAMEditTextImp.cp
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
358124 ¤   $Id: CPGPAMEditTextImp.cp,v 1.1.16.1 1998/11/12 03:19:08 heller Exp $
8ff7f7 ____________________________________________________________________________*/
c0af5a
29b980 #include <Appearance.h>
1e7c09 #include <LEditText.h>
2eaf5a
3fe213 #include "CPGPAMEditTextImp.h"
a5af5a
ceaf5a
365187 CPGPAMEditTextImp::CPGPAMEditTextImp(LControlPane *inControlPane)
1b1cc7 ¤   ¤   : LAMEditTextImp( inControlPane )
08bb36 {
02efe6 }
faaf5a
08b4bc CPGPAMEditTextImp::CPGPAMEditTextImp(LStream *inStream)
e8d730 ¤   ¤   : LAMEditTextImp( inStream )
c1bb36 {
dbefe6 }
06af5a
34649c CPGPAMEditTextImp::~CPGPAMEditTextImp(void)
8abb36 {
6eefe6 }
3eaf5a
116d52 ¤   void
09ae50 CPGPAMEditTextImp::DrawSelf(void)
8dbb36 {
2ba85a ¤   // Current PowerPlant implementation does not redraw frame correctly
a6ded8 ¤   // when erasing the focus. Do so here.
32af5a
ddc1e9 ¤   LAMEditTextImp::DrawSelf();
f567c5 ¤
f59473 ¤   if( ! ( (LEditText *) mControlPane )->HasFocusRing() )
e6c7a1 ¤   {
d15852 ¤   ¤   Rect¤   ¤   ¤   frame;
1a2cd6 ¤   ¤   ThemeDrawState¤ state = kThemeStateDisabled;
271b52 ¤   ¤
a8c072 ¤   ¤   if ( IsActive() && IsEnabled() )
4f5b34 ¤   ¤   {
777117 ¤   ¤   ¤   state = kThemeStateActive;
480fe4 ¤   ¤   }
cf1b52 ¤   ¤
6c5ad1 ¤   ¤   CalcLocalFrameRect( frame );
b5f643 ¤   ¤   InsetRect( &frame, 3, 3 );
78cf73 ¤   ¤   DrawThemeEditTextFrame( &frame, state );
ea9371 ¤   }
90be43 }¶
--5938 001020f446c4012020f Page 1 of CPGPAMEditTextImp.h
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
a43e36 ¤   $Id: CPGPAMEditTextImp.h,v 1.1.16.1 1998/11/12 03:19:09 heller Exp $
1cf7f7 ____________________________________________________________________________*/
9faf5a
a67b7d #pragma once
98af5a
f2f0f6 #include <LAMEditTextImp.h>
95af5a
850ef8 class CPGPAMEditTextImp : public LAMEditTextImp
e0bb36 {
525ed4 public:
42af5a
00eb24 ¤   enum { class_ID = 'IETX' };
62af5a
f092d2 ¤   ¤   ¤   ¤   ¤   ¤   CPGPAMEditTextImp(LControlPane *inControlPane);
05c27e ¤   ¤   ¤   ¤   ¤   ¤   CPGPAMEditTextImp(LStream *inStream);¤  ¤
f33dbd ¤   virtual¤¤   ¤   ¤   ~CPGPAMEditTextImp(void);
91af5a
f8a2d3 protected:
2367c5 ¤
09e40b ¤   virtual void¤   ¤   DrawSelf(void);
6282f7 };
02af5a
--bc45 001d8afa9b740120210 Page 1 of CPGPAMTabsControlImp.cp
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
a0af5a
350fc7 ¤   $Id: CPGPAMTabsControlImp.cp,v 1.3.12.1 1998/11/12 03:19:10 heller Exp $
adf7f7 ____________________________________________________________________________*/
43af5a
08b980 #include <Appearance.h>
fa8f92 #include <UGAColorRamp.h>
43af5a
110d08 #include "pgpMem.h"
3c4b88 #include "CPGPAMTabsControlImp.h"
f8af5a
0ece21 CPGPAMTabsControlImp::CPGPAMTabsControlImp(LStream *inStream)
41faf1 ¤   ¤   : LAMTabsControlImp(inStream)
a7bb36 {
a0baed ¤   long¤   gestaltResult;
c067c5 ¤
fad531 ¤   mRunningKaleidoscope = IsntErr( Gestalt( 'Copl', &gestaltResult ) );
0aefe6 }
54af5a
92af5a
5e2f0a CPGPAMTabsControlImp::~CPGPAMTabsControlImp()
68bb36 {
bfefe6 }
73af5a
8baf5a
f7ec1b ¤   bool
99d391 CPGPAMTabsControlImp::ApplyForeAndBackColors() const
0bbb36 {
314f7a ¤   SetThemeWindowBackground( (**mMacControlH).contrlOwner,
f68188 ¤   ¤   ¤   ¤   kThemeActiveDialogBackgroundBrush, FALSE );
c72b85 ¤   ¤   ¤   ¤
0ec3f2 ¤   if( ! mRunningKaleidoscope )
d7c7a1 ¤   {
16ff2b ¤   ¤   CGrafPtr¤   controlPort;
331b52 ¤   ¤
4c7300 ¤   ¤   controlPort = (CGrafPtr) (**mMacControlH).contrlOwner;
771b52 ¤   ¤
5e340a ¤   ¤   if( controlPort->rgbBkColor.red == 0xDDDD &&
62ed57 ¤   ¤   ¤   controlPort->rgbBkColor.green == 0xDDDD &&
445624 ¤   ¤   ¤   controlPort->rgbBkColor.blue == 0xDDDD )
e05b34 ¤   ¤   {
13f8a3 ¤   ¤   ¤   RGBColor¤   backColor;
8187c7 ¤   ¤   ¤
eb0f12 ¤   ¤   ¤   backColor = UGAColorRamp::GetColor( colorRamp_Gray1 );
7f2f28 ¤   ¤   ¤   RGBBackColor( &backColor );
d60fe4 ¤   ¤   }
169371 ¤   }
8daf5a
c929e4 ¤   return( true );
a2efe6 }
d8af5a
--2570 001839f103440120211 Page 1 of CPGPAMTabsControlImp.h
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
a0af5a
5e6acf ¤   $Id: CPGPAMTabsControlImp.h,v 1.2.12.1 1998/11/12 03:19:10 heller Exp $
e1f7f7 ____________________________________________________________________________*/
1daf5a
417b7d #pragma once
48af5a
dc22f4 #include <LAMTabsControlImp.h>
62af5a
cb984f class¤  CPGPAMTabsControlImp : public LAMTabsControlImp
89bb36 {
005ed4 public:
0b1f37 ¤   enum { class_ID = 'ITAB' };
7baf5a
b1aa65 ¤   ¤   ¤   ¤   ¤   ¤   CPGPAMTabsControlImp(LStream *inStream = nil);
7067c5 ¤
b8cfe8 ¤   virtual¤¤   ¤   ¤   ~CPGPAMTabsControlImp();
9967c5 ¤
770a5f ¤   virtual bool¤   ¤   ApplyForeAndBackColors(void) const;
3ada4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
3ea2d3 protected:
80af5a
5a0d78 ¤   Boolean¤¤   ¤   ¤   mRunningKaleidoscope;
8382f7 };
--f236 00024cc621b40120212 Page 1 of CPGPActiveScroller.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
2b2b0e ¤   $Id: CPGPActiveScroller.cp,v 1.5.16.1 1998/11/12 03:19:11 heller Exp $
0cf7f7 ____________________________________________________________________________*/
c4af5a
e6ffe3 #include <UGraphicUtils.h>
9eaf5a
dd8bd8 #include "MacEnvirons.h"
f40d08 #include "pgpMem.h"
b3af5a
50002e #include "CPGPActiveScroller.h"
e7af5a
2c70c3 CPGPActiveScroller::CPGPActiveScroller(LStream *inStream)
561d4a ¤   ¤   : LActiveScroller(inStream)
24bb36 {
8fefe6 }
01af5a
a39c7a CPGPActiveScroller::~CPGPActiveScroller(void)
42bb36 {
19efe6 }
57af5a
b26d52 ¤   void
48cf9b CPGPActiveScroller::AdjustScrollBarsVisibility(void)
24bb36 {
0f5627 ¤   if( HaveAppearanceMgr() )
acc7a1 ¤   {
b702da ¤   ¤   OSErr¤  err;
1caf5a
bcf337 ¤   ¤   if( IsntNull( mHorizontalBar ) )
a85b34 ¤   ¤   {
d36bea ¤   ¤   ¤   err = SetControlVisibility( mHorizontalBar->GetMacControl(),
d0e55a ¤   ¤   ¤   ¤   ¤   ¤   ¤   mHorizontalBar->IsVisible(), FALSE );
8c144d ¤   ¤   ¤   pgpAssertNoErr( err );
b60fe4 ¤   ¤   }
abaf5a
23e624 ¤   ¤   if( IsntNull( mVerticalBar ) )
745b34 ¤   ¤   {
dccc6c ¤   ¤   ¤   err = SetControlVisibility( mVerticalBar->GetMacControl(),
8a2a2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   mVerticalBar->IsVisible(), FALSE );
93144d ¤   ¤   ¤   pgpAssertNoErr( err );
200fe4 ¤   ¤   }
209371 ¤   }
13efe6 }
3daf5a
6f6d52 ¤   void
a5b0a1 CPGPActiveScroller::Show(void)
9ebb36 {
766d4b ¤   LActiveScroller::Show();
ffaf5a
950ce1 ¤   AdjustScrollBarsVisibility();
2cefe6 }
c2af5a
d36d52 ¤   void
dbe4f6 CPGPActiveScroller::SuperShow(void)
1dbb36 {
18db8c ¤   LActiveScroller::SuperShow();
6eaf5a
880ce1 ¤   AdjustScrollBarsVisibility();
2fefe6 }
f0af5a
3a6d52 ¤   void
255600 CPGPActiveScroller::Hide(void)
42bb36 {
3a8167 ¤   LActiveScroller::Hide();
a7af5a
710ce1 ¤   AdjustScrollBarsVisibility();
d4efe6 }
adaf5a
306d52 ¤   void
240257 CPGPActiveScroller::SuperHide(void)
--0b3b 0018894a82b40120212 Page 2 of CPGPActiveScroller.cp
2cbb36 {
3a37a0 ¤   LActiveScroller::SuperHide();
9baf5a
350ce1 ¤   AdjustScrollBarsVisibility();
5fefe6 }
eeaf5a
01af5a
2d6d52 ¤   void
d443cf CPGPActiveScroller::ActivateSelf(void)
0dbb36 {
0f7b62 ¤   LScroller::ActivateSelf();
9b67c5 ¤
780ce1 ¤   AdjustScrollBarsVisibility();
85efe6 }
33af5a
2e6d52 ¤   void
7113ba CPGPActiveScroller::DeactivateSelf(void)
d0bb36 {
dd162f ¤   if( IsntNull( mHorizontalBar ) &&
e28d79 ¤   ¤   mHorizontalBar->IsVisible() )
96c7a1 ¤   {
f75c73 ¤   ¤   mHorizontalBar->Hide();¤¤   ¤   // Hide horizontal ScrollBar
4370c5 ¤   ¤   mHorizontalBar->DontRefresh( true );
e09371 ¤   }
7faf5a
97cd9b ¤   if( IsntNull( mVerticalBar ) &&
a9debc ¤   ¤   mVerticalBar->IsVisible() )
40c7a1 ¤   {
d61b31 ¤   ¤   mVerticalBar->Hide();¤  ¤   ¤   // Hide horizontal ScrollBar
6c8d61 ¤   ¤   mVerticalBar->DontRefresh( true );
399371 ¤   }
efaf5a
ba0ce1 ¤   AdjustScrollBarsVisibility();
8caf5a
1f6081 ¤   LScroller::DeactivateSelf();
9cefe6 }
88af5a
--08b1 001be6a51a740120213 Page 1 of CPGPActiveScroller.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ce8931 ¤   $Id: CPGPActiveScroller.h,v 1.2.16.1 1998/11/12 03:19:12 heller Exp $
0ff7f7 ____________________________________________________________________________*/
60af5a
637b7d #pragma once
48af5a
4bac98 #include <LActiveScroller.h>
82af5a
a0d8cc class CPGPActiveScroller : public LActiveScroller
35bb36 {
625ed4 public:
3367c5 ¤
9189f8 ¤   enum { class_ID = 'ASCR' };
2367c5 ¤
203fd8 ¤   ¤   ¤   ¤   ¤   ¤   CPGPActiveScroller(LStream *inStream);
b84263 ¤   virtual¤¤   ¤   ¤   ~CPGPActiveScroller(void);
1967c5 ¤
8bc277 ¤   virtual void¤   ¤   Hide(void);
8a7612 ¤   virtual void¤   ¤   Show(void);
a5af5a
7aa2d3 protected:
81af5a
f2c987 ¤   virtual void¤   ¤   ActivateSelf(void);
898f8b ¤   virtual void¤   ¤   DeactivateSelf(void);
402ff3 ¤   virtual void¤   ¤   SuperHide(void);
ae9b96 ¤   virtual void¤   ¤   SuperShow(void);
dc67c5 ¤
8f0fb9 private:
a9af5a
824795 ¤   void¤   ¤   ¤   ¤   AdjustScrollBarsVisibility(void);
bebf26 };¶
--cadf 001bd6ab32340120214 Page 1 of CPGPGAPopupButtonImp.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
cac205 ¤   $Id: CPGPGAPopupButtonImp.cp,v 1.1.18.1 1998/11/12 03:19:13 heller Exp $
34f7f7 ____________________________________________________________________________*/
54af5a
997e6d #include <UDrawingState.h>
c7f8a6 #include <UTextTraits.h>
c8af5a
5e6915 #include "CPGPGAPopupButtonImp.h"
0aaf5a
ddaf5a
6971b9 CPGPGAPopupButtonImp::CPGPGAPopupButtonImp(LControlPane *inControlPane)
9b4fae ¤   ¤   : LGAPopupButtonImp( inControlPane )
56bb36 {
a0efe6 }
56af5a
f6a47d CPGPGAPopupButtonImp::CPGPGAPopupButtonImp(LStream *inStream)
861c0d ¤   ¤   : LGAPopupButtonImp( inStream )
94bb36 {
76efe6 }
f1af5a
d05aa8 CPGPGAPopupButtonImp::~CPGPGAPopupButtonImp(void)
07bb36 {
b0efe6 }
d6af5a
a86d52 ¤   void
266532 CPGPGAPopupButtonImp::SetDescriptor(ConstStringPtr inDescriptor)
88bb36 {
c27cb5 ¤   LGAPopupButtonImp::SetDescriptor( inDescriptor );
e2af5a
2f90b0 ¤   // Stupid PP does not support dynamically changing the popup's title.
b809c6 ¤   // Recompute the width here and call SetLabelWidth().
1767c5 ¤
145694 ¤   if( HasLabel() )
66c7a1 ¤   {
e24725 ¤   ¤   StTextState¤¤   theTextState;
5a0df7 ¤   ¤   StColorPenState¤thePenState;
f567c5 ¤
f5d21c ¤   ¤   // Get the port setup with the text traits
2030bc ¤   ¤   UTextTraits::SetPortTextTraits ( GetTextTraitsID() );
c2fedb ¤   ¤   SetLabelWidth( StringWidth( inDescriptor ) + 5 );
4c9371 ¤   }
bdefe6 }
--9c5b 001a6f1ec8840120215 Page 1 of CPGPGAPopupButtonImp.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
724c01 ¤   $Id: CPGPGAPopupButtonImp.h,v 1.1.18.1 1998/11/12 03:19:14 heller Exp $
23f7f7 ____________________________________________________________________________*/
28af5a
eb7b7d #pragma once
74af5a
e50069 #include <LGAPopupButtonImp.h>
d5af5a
17a3d2 class CPGPGAPopupButtonImp : public LGAPopupButtonImp
dfbb36 {
e75ed4 public:
b5af5a
e91efb ¤   enum { class_ID = 'GPOP' };
08af5a
59bb43 ¤   ¤   ¤   ¤   ¤   ¤   CPGPGAPopupButtonImp(LControlPane *inControlPane);
8515f4 ¤   ¤   ¤   ¤   ¤   ¤   CPGPGAPopupButtonImp(LStream *inStream);¤   ¤
46cc38 ¤   virtual¤¤   ¤   ¤   ~CPGPGAPopupButtonImp(void);
9d67c5 ¤
6399c7 ¤   virtual void¤   ¤   SetDescriptor(ConstStringPtr inDescriptor);
4d82f7 };
a6af5a
--501a 00188fbe6d340120216 Page 1 of CPGPHierarchyTable.cp
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
44f3c8 ¤   $Id: CPGPHierarchyTable.cp,v 1.1.2.1.4.1 1998/11/12 03:19:14 heller Exp $
3ff7f7 ____________________________________________________________________________*/
77af5a
6e1a11 #include "CPGPHierarchyTable.h"
52af5a
953d2d // The following code "generates" the source to the class CPGPHierarchyTable
93f4de // which is a peer to LHierarchyTable by using the preprocessor to redefine
17248f // LHierarchyTable to be CPGPHierarchyTable. The real purpose in this is to
d32d22 // create a "subclass" of LHierarchyTable which uses CPGPNodeArrayTree as
3b1e18 // a helper class instead of LNodeArrayTree due to bugs in LNodeArrayTree.
e20832 // Since LHierarchyTable does not use a class factory, we have to 1) use
cf9c9f // this method of creating CPGPHierarchyTable or 2) really sublcass
ec107d // LHierarchyTable and override all methods which instantiate a·
eb9033 // LNodeArrayTree and change the code to instantiate CPGPNodeArrayTree
cb9d6b // instead. The disadvantages to method 1 are no real code for the CW debugger
dd8a24 // to display and method 1 does not work if additional types of bugs in·
e981ee // LHierarchyTable need to be fixed. The disadvantage of method 2 is a
6354d9 // dependency on the explicit version of PowerPlant since all methods which
9f28d1 // would be overidden would need to be exact copies of the methods in·
8ef042 // LHierarchyTable with the code replaced.
d3af5a
176d71 #define LHierarchyTable¤CPGPHierarchyTable
109099 #define LNodeArrayTree¤ CPGPNodeArrayTree
33af5a
882b38 #include "LHierarchyTable.cp"
--5a42 001a358f44640120217 Page 1 of CPGPHierarchyTable.h
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
021c45 ¤   $Id: CPGPHierarchyTable.h,v 1.1.2.1.4.1 1998/11/12 03:19:15 heller Exp $
44f7f7 ____________________________________________________________________________*/
2caf5a
c07b7d #pragma once
1eaf5a
5aaba1 // See CPGPHierarchyTable.cp for a note on the method used in this file for
d2a8d8 // generating CPGPHierarchyTable.h
57af5a
c46d71 #define LHierarchyTable¤CPGPHierarchyTable
589099 #define LNodeArrayTree¤ CPGPNodeArrayTree
86af5a
e4b6a7 #include <LHierarchyTable.h>
a3af5a
--5caf 00118be6a9340120218 Page 1 of CPGPNodeArrayTree.cp
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
590660 ¤   $Id: CPGPNodeArrayTree.cp,v 1.1.2.1.4.1 1998/11/12 03:19:16 heller Exp $
dff7f7 ____________________________________________________________________________*/
a8af5a
97e682 #include "CPGPNodeArrayTree.h"
ceaf5a
6eb15e CPGPNodeArrayTree::CPGPNodeArrayTree()
44dbe0 ¤   ··: LNodeArrayTree()
eebb36 {
c0efe6 }
8daf5a
a6db25 CPGPNodeArrayTree::~CPGPNodeArrayTree()
e2bb36 {
abefe6 }
54af5a
1973ec // The PowerPlant implementation of this function has a bug where it returns
e8b66e // only the number of rows revealed by the root node. If the root is already
80e3a5 // revealed, the PP implementation always returns zero even though some
1a2573 // subnodes may have been expanded in the process.
f1af5a
5f4836 ¤   Uint32
786649 CPGPNodeArrayTree::DeepExpandNode(Uint32 inWideOpenIndex)
f8bb36 {
1a348c ¤   SHierarchyNode¤ *expandedNode;
633221 ¤   Uint32¤ ¤   ¤   revealedRows = 0;
6baf5a
c8992c ¤   if (!mHierarchyArray.FetchItemAt((Int32) inWideOpenIndex, &expandedNode)) {
4cdbb7 ¤   ¤   SignalPStr_("\pInvalid index for Node to Deep Expand");
b8bbde ¤   ¤   return 0;
5e9371 ¤   }
fa67c5 ¤
aef744 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // Expand all descendents
c9c205 ¤   Uint32¤ lastDescendent = inWideOpenIndex +
a33177 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CountAllDescendents(inWideOpenIndex);
d0c243 ¤   for (Uint32 i = inWideOpenIndex + 1; i <= lastDescendent; i++) {
8256d8 ¤   ¤   revealedRows += ExpandNode(i);
649371 ¤   }
de67c5 ¤
a71b69 ¤   revealedRows += ExpandNode(inWideOpenIndex);¤   // Expand this Node
0c67c5 ¤
9b7410 ¤   return revealedRows;
18efe6 }
--e001 0011fe4eeb540120219 Page 1 of CPGPNodeArrayTree.h
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
c54617 ¤   $Id: CPGPNodeArrayTree.h,v 1.1.2.1.4.1 1998/11/12 03:19:17 heller Exp $
c5f7f7 ____________________________________________________________________________*/
c8af5a
cd7b7d #pragma once
94af5a
7bf467 #include <LNodeArrayTree.h>
05af5a
cde7cf class CPGPNodeArrayTree : public LNodeArrayTree
b9bb36 {
635ed4 public:
53af5a
de298b ¤   ¤   ¤   ¤   ¤   CPGPNodeArrayTree(void);
5c0623 ¤   virtual¤¤   ¤   ~CPGPNodeArrayTree(void);
a3af5a
3a870b ¤   virtual Uint32¤ DeepExpandNode(Uint32 inWideOpenIndex);
1fbf26 };¶
--861b 000009bb3b24012021a Page 1 of CLog.cp
a70335 /*____________________________________________________________________________
bdcfc2 ¤   Copyright (C) 1996 Network Associates, Inc. and its affiliates.
994b0f ¤   All rights reserved.
82f7f7 ____________________________________________________________________________*/
f51504 #include¤   "CLog.h"
070d6e #include¤   "UInt64.h"
aa4787 #include¤   "CMacQueue.h"
8d772f #include¤   "pgpMacMemory.h"
a344fb #include¤   "MacStrings.h"
7faf5a
09af5a
e57295 #define MAX( a, b ) ¤   ( (a) >= (b) ? (a) : (b) )
01da50 #define MIN( a, b ) ¤   ( (a) <= (b) ? (a) : (b) )
46af5a
4eaf5a
580335 /*____________________________________________________________________________
28a361 ¤   Used to make interrupt level logging possible
f3f7f7 ____________________________________________________________________________*/
58811f class CLog::CAppendQueue
69c7a1 ¤   {
135ed4 public:
bbf73e ¤   enum { kMaxQueuedSize = 64 };
59a2d3 protected:
3e67c5 ¤
cdf5e2 ¤   typedef struct
235b34 ¤   ¤   {
fcaebe ¤   ¤   QElem¤  qElem;
eccd6a ¤   ¤   UInt16¤ numBytes;
e454c4 ¤   ¤   uchar¤  buffer[ kMaxQueuedSize ];
d88062 ¤   ¤   } AppendElem;
b867c5 ¤
f46086 ¤   AppendElem *¤   mElemsArray;
07d312 ¤   CMacQueue¤  ¤   mAvailQueue;
b10f19 ¤   CMacQueue¤  ¤   mReadyQueue;
a7af5a
f5ad4f ¤   ¤   AppendElem *
ade31f ¤   QElemToAppendElem( QElem *elem)
22c7a1 ¤   {
0ce0d6 ¤   ¤   return( (AppendElem *)elem );
a79371 ¤   }
d667c5 ¤
f8fac8 ¤   ¤   QElem *
ef9515 ¤   AppendElemToQElem( AppendElem *elem)
48c7a1 ¤   {
318569 ¤   ¤   return( (QElem *)elem );
6c9371 ¤   }
f967c5 ¤
ed5ed4 public:
4b4e36 ¤   ¤   ¤   ¤   CAppendQueue( UInt16 numBuffers = 64);
0a51e5 ¤   virtual¤¤   ~CAppendQueue( void );
6367c5 ¤
f92d60 ¤   OSErr¤  ¤   AddData( const void *data, UInt32 numBytes );
d54098 ¤   Boolean¤¤   RemoveData( void *data, UInt32 * numBytes );
6e62bd ¤   };
16af5a
6daf5a
dda884 CLog::CAppendQueue::CAppendQueue( UInt16 numBuffers )
cdc7a1 ¤   {
61e780 ¤   AppendElem *¤   elems;
fe67c5 ¤
f7b403 ¤   pgpAssert( mReadyQueue.IsEmpty() );
59f5a5 ¤   pgpAssert( mAvailQueue.IsEmpty() );
d867c5 ¤
368b6d ¤   elems¤  = (AppendElem *)NewPtr( numBuffers * sizeof( AppendElem ) );
ec8b88 ¤   pgpAssert( IsntNull( elems ) );
e3a279 ¤   mElemsArray¤= elems;
cb67c5 ¤
56d547 ¤   if ( IsntNull( elems ) )
de5b34 ¤   ¤   {
462eeb ¤   ¤   // place all available buffers in our avi
c46e4b ¤   ¤   for( UInt16 index = 0; index < numBuffers; ++index )
00f776 ¤   ¤   ¤   {
--79ac 000666827e14012021a Page 2 of CLog.cp
e63d85 ¤   ¤   ¤   mAvailQueue.Enqueue( AppendElemToQElem( &elems[ index ] ) );
8ca3a6 ¤   ¤   ¤   }
d287c7 ¤   ¤   ¤
f1d56f ¤   ¤   pgpAssert( ! mAvailQueue.IsEmpty() );
840fe4 ¤   ¤   }
7d9371 ¤   }
f367c5 ¤
f067c5 ¤
b8af5a
0df68a CLog::CAppendQueue::~CAppendQueue( )
98c7a1 ¤   {
2eb403 ¤   pgpAssert( mReadyQueue.IsEmpty() );
3e67c5 ¤
45d65c ¤   if ( IsntNull( mElemsArray ) )
5e5b34 ¤   ¤   {
14d56f ¤   ¤   pgpAssert( ! mAvailQueue.IsEmpty() );
c8af5a
190d97 ¤   ¤   DisposePtr( (Ptr)mElemsArray );
89afc7 ¤   ¤   mElemsArray¤= nil;
b00fe4 ¤   ¤   }
259371 ¤   }
e5af5a
ceaf5a
10eacd ¤   OSErr
008c7e CLog::CAppendQueue::AddData(
7cf9ae ¤   const void *¤   data,
e8dc08 ¤   UInt32¤ ¤   ¤   numBytes )
05c7a1 ¤   {
445aef ¤   QElem *¤¤   ¤   qElem;
f94d47 ¤   OSErr¤  ¤   ¤   err¤= -1;
af67c5 ¤
a37c80 ¤   pgpAssert( numBytes <= kMaxQueuedSize );
bb6bc9 ¤   pgpAssert( offsetof( AppendElem, qElem ) == 0 );
fe67c5 ¤
3a0750 ¤   while ( ! mAvailQueue.IsEmpty() )
955b34 ¤   ¤   {
43a655 ¤   ¤   qElem¤  = mAvailQueue.PeekHead();
c2f564 ¤   ¤   err¤¤   = mAvailQueue.Dequeue( qElem );
b4d798 ¤   ¤   if ( IsntErr( err ) )
b5f776 ¤   ¤   ¤   {
80981a ¤   ¤   ¤   AppendElem *¤   elem;
031b52 ¤   ¤
a4438d ¤   ¤   ¤   elem¤   = QElemToAppendElem( qElem );
aa87c7 ¤   ¤   ¤
87ded1 ¤   ¤   ¤   elem->numBytes¤ = MIN( numBytes, sizeof( elem->buffer ) );
58ec3d ¤   ¤   ¤   BlockMoveData( data, elem->buffer, elem->numBytes );
9a87c7 ¤   ¤   ¤
7006fc ¤   ¤   ¤   mReadyQueue.Enqueue( qElem );
1b87c7 ¤   ¤   ¤
5e0719 ¤   ¤   ¤   // ok, we did it, let's get out of here
c7cdcb ¤   ¤   ¤   break;
bfa3a6 ¤   ¤   ¤   }
e10e1d ¤   ¤   else
8ff776 ¤   ¤   ¤   {
f10430 ¤   ¤   ¤   // somebody else may have taken it...try again
89a3a6 ¤   ¤   ¤   }
5c0fe4 ¤   ¤   }
6267c5 ¤
be80c9 ¤   AssertNoErr( err, "CLog::CAppendQueue::AddData: couldn't get buffer" );
97deb7 ¤   return( err );
469371 ¤   }
11af5a
ccaf5a
e27e69 ¤   Boolean
c76c06 CLog::CAppendQueue::RemoveData(
24025e ¤   void *¤ data,
e5c38b ¤   UInt32 *¤   numBytes )
9fc7a1 ¤   {
1afcb8 ¤   Boolean¤¤   haveData¤   = FALSE;
b267c5 ¤
1573ea ¤   QElem *¤qElem¤  = mReadyQueue.PeekHead();
667b7a ¤   if ( IsntNull( qElem ) )
--b24c 000d3faab3d4012021a Page 3 of CLog.cp
e35b34 ¤   ¤   {
ace535 ¤   ¤   if ( mReadyQueue.Dequeue( qElem ) == noErr )
adf776 ¤   ¤   ¤   {
83055d ¤   ¤   ¤   AppendElem *elem¤   = QElemToAppendElem( qElem );
c287c7 ¤   ¤   ¤
62a9c7 ¤   ¤   ¤   *numBytes¤  = elem->numBytes;
cccd26 ¤   ¤   ¤   BlockMoveData( elem->buffer, data, elem->numBytes );
a7eba8 ¤   ¤   ¤   haveData¤   = TRUE;
0e87c7 ¤   ¤   ¤
efddac ¤   ¤   ¤   mAvailQueue.Enqueue( qElem );
b3a3a6 ¤   ¤   ¤   }
f60e1d ¤   ¤   else
74f776 ¤   ¤   ¤   {
326bc3 ¤   ¤   ¤   pgpDebugPStr( "\pCLog::CAppendQueue::RemoveData: impossible" );
29a3a6 ¤   ¤   ¤   }
ca0fe4 ¤   ¤   }
bc1b52 ¤   ¤
7d508a ¤   return( haveData );
f39371 ¤   }
1467c5 ¤
4867c5 ¤
cedacc #pragma mark -
2567c5 ¤
496d52 ¤   void
54c5c3 CLog::Init( UInt32 logSize )
abc7a1 ¤   {
658c79 ¤   AllocateBuffer( logSize );
5767c5 ¤
d1d59c ¤   mBytesInBuffer¤ = 0;
e79371 ¤   }
5667c5 ¤
f667c5 ¤
272f3c CLog::CLog( UInt32 logSize )
19c7a1 ¤   {
bc4ee8 ¤   Init( logSize );
9f67c5 ¤
c1da97 ¤   mAppendQueue¤   = new CAppendQueue();
9c2b36 ¤   pgpAssert( IsntNull( mAppendQueue ) );
6c9371 ¤   }
8967c5 ¤
a867c5 ¤
b4e5f1 CLog::~CLog( ·)
04c7a1 ¤   {
76abcd ¤   DisposeBuffer();
b767c5 ¤
9d97be ¤   delete mAppendQueue;
e80612 ¤   mAppendQueue¤   = nil;
8d9371 ¤   }
b9af5a
9aaf5a
3f6d52 ¤   void
096c6a CLog::AllocateBuffer( UInt32 logSize )
19c7a1 ¤   {
b4ba05 ¤   mBufferSize¤= logSize;
837112 ¤   mBuffer¤¤   = NewPtr( logSize);
3d76c1 ¤   pgpAssert( IsntNull( mBuffer ) );
459371 ¤   }
5967c5 ¤
7baf5a
a26d52 ¤   void
a678fc CLog::DisposeBuffer( void )
1ac7a1 ¤   {
6676ae ¤   pgpAssertAddrValid( mBuffer, VoidAlign );
8feda2 ¤   if ( IsntNull( mBuffer ) )
945b34 ¤   ¤   {
f5c62b ¤   ¤   DisposePtr( (Ptr)mBuffer );
63417c ¤   ¤   mBuffer¤= nil;
b00fe4 ¤   ¤   }
6b9371 ¤   }
b1af5a
2c1b52 ¤   ¤
d3af5a
--97bf 0002dfc76e34012021a Page 4 of CLog.cp
de41fd ¤   CLog &
c8b42b CLog::Append( const char *theString )
51c7a1 ¤   {
63c69b ¤   const char *cur¤= theString;
8b444a ¤   UInt32¤ ¤   len;
af67c5 ¤
e35539 ¤   while ( *cur++ != '\0' )
3b5b34 ¤   ¤   {
850fe4 ¤   ¤   }
aa5983 ¤   len¤= ( cur - theString ) - 1;
c567c5 ¤
4907c8 ¤   Append( theString, len );
417522 ¤   return( *this );
9e9371 ¤   }
cb67c5 ¤
c967c5 ¤
5c41fd ¤   CLog &
98aef1 CLog::Append( ConstStr255Param¤ theString )
f6c7a1 ¤   {
07f947 ¤   Append( &theString[ 1 ], theString[ 0 ] );
c77522 ¤   return( *this );
289371 ¤   }
bf67c5 ¤
7967c5 ¤
c067c5 ¤
e341fd ¤   CLog &
d0bd8c CLog::AppendBoolean( Boolean¤   theBool )
90c7a1 ¤   {
193ea0 ¤   return( Append( theBool ? "true" : "false" ) );
399371 ¤   }
cb67c5 ¤
5767c5 ¤
4c41fd ¤   CLog &
b40e68 CLog::AppendNewline( )
f7c7a1 ¤   {
8cf1a8 ¤   const char¤ newline¤= (char)'\r';
6067c5 ¤
526dcc ¤   return( Append( &newline, sizeof(newline) ) );
b19371 ¤   }
ceaf5a
b4af5a
5167c5 ¤
9f0335 /*____________________________________________________________________________
c9699f ¤   We have exclusive access to the buffer (guaranteed by caller)
c0e85c ¤   Append the data to it.
bcf7f7 ____________________________________________________________________________*/
f16d52 ¤   void
7edae6 CLog::Append_ItsSafeNow(
12e272 ¤   const char *¤   text,
31d1a8 ¤   const UInt32¤   ¤   length )
0cc7a1 ¤   {
525956 ¤   const char *¤   cur¤= text;
0667c5 ¤
4f8ab0 ¤   pgpAssert( IsntNull( mBuffer ) && mBufferSize != 0 );
791b52 ¤   ¤
bd8617 ¤   UInt32¤ remaining¤  = length;
fc0589 ¤   while ( remaining != 0 )
915b34 ¤   ¤   {
ac8575 ¤   ¤   UInt32¤ count;
84a68b ¤   ¤   UInt32¤ free;
821b52 ¤   ¤
4254e1 ¤   ¤   count¤  = remaining;
6a1c47 ¤   ¤   free¤   = GetFree();
d41b52 ¤   ¤
368724 ¤   ¤   // make sure we have at least some space available
24458f ¤   ¤   if ( free == 0 )
d1f776 ¤   ¤   ¤   {
4085c2 ¤   ¤   ¤   Flush();
3ffbc7 ¤   ¤   ¤   pgpAssert( GetFree() != 0 );
57a711 ¤   ¤   ¤   free¤   = GetFree();
80a3a6 ¤   ¤   ¤   }
2d1b52 ¤   ¤
--a55d 0001c5abb2f4012021a Page 5 of CLog.cp
93c9f1 ¤   ¤   if ( count > free )
c5f776 ¤   ¤   ¤   {
6cf7fe ¤   ¤   ¤   count¤  = free;
b5a3a6 ¤   ¤   ¤   }
a91b52 ¤   ¤
1acb77 ¤   ¤   BlockMoveData( cur, &mBuffer[ GetUsed() ], count );
131b52 ¤   ¤
2d0f0b ¤   ¤   pgpAssert( count <= remaining );
b8c02a ¤   ¤   remaining¤  ¤   -= count;
6b1ecd ¤   ¤   cur¤¤   ¤   ¤   += count;
955e41 ¤   ¤   mBytesInBuffer¤ += count;
7c0fe4 ¤   ¤   }
259371 ¤   }
8d67c5 ¤
a367c5 ¤
900335 /*____________________________________________________________________________
61db9b ¤   Append any queueud items to the buffer if we can obtain control of it.
85f7f7 ____________________________________________________________________________*/
5b6d52 ¤   void
34ca90 CLog::AppendAnyQueueItems()
c2c7a1 ¤   {
17815e ¤   QElem¤  ¤   ¤   qElem;
1d1b52 ¤   ¤
d9b841 ¤   mWinnerQueue.Enqueue( &qElem );
d580cd ¤   if ( mWinnerQueue.PeekHead() == &qElem )
6e5b34 ¤   ¤   {
2531e1 ¤   ¤   // we have exclusive acccess to buffer
271b52 ¤   ¤
b9c481 ¤   ¤   UInt32¤ bufferSize;
12dada ¤   ¤   char¤   buffer[ CAppendQueue::kMaxQueuedSize ];
321b52 ¤   ¤
e5479e ¤   ¤   while ( mAppendQueue->RemoveData( buffer, &bufferSize) )
bef776 ¤   ¤   ¤   {
ad9157 ¤   ¤   ¤   Append_ItsSafeNow( buffer, bufferSize );
b9a3a6 ¤   ¤   ¤   }
b90fe4 ¤   ¤   }
1e0e24 ¤   else
675b34 ¤   ¤   {
0de98c ¤   ¤   // someone else has exclusive acccess to buffer
f10fe4 ¤   ¤   }
051b52 ¤   ¤
1dd57f ¤   mWinnerQueue.Dequeue( &qElem );
a39371 ¤   }
cf67c5 ¤
b567c5 ¤
b66d52 ¤   void
17be97 CLog::AppendToQueue(
1de272 ¤   const char *¤   text,
f9d1a8 ¤   const UInt32¤   ¤   length )
32c7a1 ¤   {
d78617 ¤   UInt32¤ remaining¤  = length;
8c67c5 ¤
b2514f ¤   const char *cur¤= text;
e60589 ¤   while ( remaining != 0 )
4d5b34 ¤   ¤   {
608575 ¤   ¤   UInt32¤ count;
481b52 ¤   ¤
46d973 ¤   ¤   count¤  = MIN( remaining, CAppendQueue::kMaxQueuedSize );
dbd2ae ¤   ¤   (void)mAppendQueue->AddData( cur, count );
501b52 ¤   ¤
8cde0e ¤   ¤   remaining¤  -= count;
f67c59 ¤   ¤   cur¤¤   ¤   += count;
d60fe4 ¤   ¤   }
cd9371 ¤   }
b6af5a
8aaf5a
420335 /*____________________________________________________________________________
fe078f ¤   All appends *MUST* be routed to this routine; it ensures proper logging
684121 ¤   under interrupt conditions.
99f7f7 ____________________________________________________________________________*/
8f41fd ¤   CLog &
1c4d98 CLog::AppendBottleneck(
--d88c 0001d15f6f04012021a Page 6 of CLog.cp
35e272 ¤   const char *¤   text,
11d1a8 ¤   const UInt32¤   ¤   length )
13c7a1 ¤   {
335956 ¤   const char *¤   cur¤= text;
bb61bd ¤   QElem¤  ¤   ¤   winnerElem;
6367c5 ¤
cc4c26 ¤   AppendAnyQueueItems();
fe1b52 ¤   ¤
f0b2d8 ¤   mWinnerQueue.Enqueue( &winnerElem );
8c9875 ¤   if ( mWinnerQueue.PeekHead() == &winnerElem )
c25b34 ¤   ¤   {
e25754 ¤   ¤   // we got there first. Just use buffer directly
ba9dea ¤   ¤   Append_ItsSafeNow( text, length );
cd0fe4 ¤   ¤   }
fb0e24 ¤   else
df5b34 ¤   ¤   {
5a4300 ¤   ¤   AppendToQueue( text, length );
d10fe4 ¤   ¤   }
b31b52 ¤   ¤
878dae ¤   // all done--someone else can use it now
cf15da ¤   mWinnerQueue.Dequeue( &winnerElem );
ea67c5 ¤
b93409 ¤   // someone else could have appended while we had exclusive access
784c26 ¤   AppendAnyQueueItems();
4e67c5 ¤
707522 ¤   return( *this );
3a9371 ¤   }
3367c5 ¤
8d67c5 ¤
2b6d52 ¤   void
050363 CLog::Flush( void )
13c7a1 ¤   {
0365aa ¤   if ( GetUsed() != 0 )
085b34 ¤   ¤   {
3177f9 ¤   ¤   const char *¤   buffer¤ = GetBuffer();
521b52 ¤   ¤
16709c ¤   ¤   if ( IsntNull( buffer ) )
00f776 ¤   ¤   ¤   {
eb2d19 ¤   ¤   ¤   WriteToStore( buffer, GetUsed() );
9ea3a6 ¤   ¤   ¤   }
7987c7 ¤   ¤   ¤
f2b196 ¤   ¤   Clear();
f10fe4 ¤   ¤   }
c69371 ¤   }
1867c5 ¤
a267c5 ¤
db6d52 ¤   void
f3a2ba CLog::Clear( void )
dfc7a1 ¤   {
2cd59c ¤   mBytesInBuffer¤ = 0;
8d9371 ¤   }
8a67c5 ¤
ae67c5 ¤
19dacc #pragma mark -
78af5a
aeaf5a
046d52 ¤   void
176e97 CLogToFile::InitCLogToFile(
7ea226 ¤   UInt32¤ logSize,
a108de ¤   short¤  fileRefNum,
d30e64 ¤   Boolean¤closeFileWhenDeleted)
dec7a1 ¤   {
5146b6 ¤   mFileRefNum¤¤   ¤   ¤   = fileRefNum;
b089c2 ¤   mCloseFileWhenDeleted¤  = closeFileWhenDeleted;
1967c5 ¤
2061e7 ¤   pgpClearMemory( &mWritePB, sizeof(mWritePB) );
9867c5 ¤
ccc0fd ¤   mWriteBuffer¤   = NewPtr( logSize );
dcaeed ¤   pgpAssert( IsntNull( mWriteBuffer ) );
a09371 ¤   }
8167c5 ¤
1d67c5 ¤
--09ae 0006a45d2da4012021a Page 7 of CLog.cp
3b6d52 ¤   void
796e97 CLogToFile::InitCLogToFile(
d06832 ¤   UInt32¤ ¤   ¤   logSize,
bc850e ¤   const FSSpec *¤ spec)
96c7a1 ¤   {
4b7cbf ¤   OSErr¤  ¤   ¤   err;
fc67c5 ¤
001317 ¤   AssertSpecIsValid( spec, "CLogToFile::CLogToFile" );
c267c5 ¤
fc994c ¤   err¤= OpenLogFile( spec, &mFileRefNum );
0d8d0b ¤   AssertFileRefNumIsValid( mFileRefNum, "CLogToFile::CLogToFile" );
1f5aa4 ¤   AssertNoErr( err, "CLogToFile::CLogToFile" );
a367c5 ¤
e57820 ¤   InitCLogToFile( logSize, mFileRefNum, TRUE );
1a9371 ¤   }
3f67c5 ¤
c7af5a
8feacd ¤   OSErr
07ab44 CLogToFile::OpenLogFile(
c7fbb6 ¤   const FSSpec *¤ spec,
a55aac ¤   short *¤¤   ¤   refNum)
5ec7a1 ¤   {
8d9816 ¤   HParamBlockRec¤ pb;
f86920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
5f67c5 ¤
157eef ¤   (void)FSpCreate( spec, 'CWIE', 'TEXT', smSystemScript );
6167c5 ¤
2ed2e1 ¤   // open the file asynchronously so it's not tracked by the Process Mgr
bf2ccb ¤   pb.fileParam.ioCompletion¤  = nil;
4d862b ¤   pb.fileParam.ioNamePtr¤ ¤   = (StringPtr)spec->name;
def134 ¤   pb.fileParam.ioVRefNum¤ ¤   = spec->vRefNum;
e62c3c ¤   pb.fileParam.ioDirID¤   ¤   = spec->parID;
5321ce ¤   err¤= PBHOpenDFAsync( &pb );
505aa4 ¤   AssertNoErr( err, "CLogToFile::CLogToFile" );
5b2ebd ¤   while ( pb.ioParam.ioResult == 1 )
365b34 ¤   ¤   {
0e0fe4 ¤   ¤   }
00bd03 ¤   err¤= pb.ioParam.ioResult;
f58298 ¤   *refNum¤= pb.ioParam.ioRefNum;
fa67c5 ¤
e85ecc ¤   if ( IsntErr( err ) )
a75b34 ¤   ¤   {
b56cdc ¤   ¤   long¤   eof;
421b52 ¤   ¤
ad4b9b ¤   ¤   GetEOF( *refNum, &eof );
1d219b ¤   ¤   SetFPos( *refNum, fsFromStart, eof );
190fe4 ¤   ¤   }
8067c5 ¤
a3deb7 ¤   return( err );
6b9371 ¤   }
16af5a
61af5a
7db81b CLogToFile::CLogToFile(
21fbb6 ¤   const FSSpec *¤ spec,
74168a ¤   UInt32¤ ¤   ¤   logSize)
f2c685 ¤   : CLog( logSize )
6dc7a1 ¤   {
ee7cbf ¤   OSErr¤  ¤   ¤   err;
2467c5 ¤
751317 ¤   AssertSpecIsValid( spec, "CLogToFile::CLogToFile" );
9667c5 ¤
7a994c ¤   err¤= OpenLogFile( spec, &mFileRefNum );
c78d0b ¤   AssertFileRefNumIsValid( mFileRefNum, "CLogToFile::CLogToFile" );
bd5aa4 ¤   AssertNoErr( err, "CLogToFile::CLogToFile" );
3867c5 ¤
aa8f22 ¤   InitCLogToFile( GetSize(), mFileRefNum, TRUE );
509371 ¤   }
bdaf5a
5baf5a
6ab81b CLogToFile::CLogToFile(
1bc6e3 ¤   ConstStr255Param¤   name,
6afbb5 ¤   UInt32¤ ¤   ¤   ¤   logSize)
--df5f 000a8ad00444012021a Page 8 of CLog.cp
f7c7a1 ¤   {
ebf67f ¤   FSSpec¤ spec;
6b67c5 ¤
e71a01 ¤   spec.vRefNum¤   = -1;
093827 ¤   spec.parID¤ ¤   = 2;
4d035b ¤   CopyPString( name, spec.name );
43810a ¤   InitCLogToFile( logSize, &spec );
859371 ¤   }
d867c5 ¤
dc67c5 ¤
b5b81b CLogToFile::CLogToFile(
c6f5ad ¤   short¤  ¤   fileRefNum,
4b1e47 ¤   Boolean¤¤   closeFileWhenDeleted,
583318 ¤   UInt32¤ ¤   logSize)
d6c685 ¤   : CLog( logSize )
ccc7a1 ¤   {
7d1295 ¤   InitCLogToFile( GetSize(), fileRefNum, closeFileWhenDeleted );
f69371 ¤   }
7967c5 ¤
f667c5 ¤
6567c5 ¤
a3823e CLogToFile::~CLogToFile()
9ec7a1 ¤   {
9971d8 ¤   Flush();
c1db4a ¤   WaitIODone();
0e67c5 ¤
a90388 ¤   if ( mFileRefNum != 0 && mCloseFileWhenDeleted )
2a5b34 ¤   ¤   {
cf4986 ¤   ¤   FSClose( mFileRefNum );
d30fe4 ¤   ¤   }
d6ec50 ¤   mFileRefNum¤= 0;
4867c5 ¤
ffa262 ¤   if ( IsntNull( mWriteBuffer ) )
365b34 ¤   ¤   {
9c0563 ¤   ¤   DisposePtr( mWriteBuffer );
170fe4 ¤   ¤   }
1a9371 ¤   }
1d67c5 ¤
b1af5a
1eaf5a
d567c5 ¤
1aaf5a
ae6d52 ¤   void
ffce43 CLogToFile::WaitIODone( )
b3c7a1 ¤   {
c7effb ¤   while ( mWritePB.ioParam.ioResult == 1 )
565b34 ¤   ¤   {
e70fe4 ¤   ¤   }
0a9371 ¤   }
47af5a
5daf5a
950335 /*____________________________________________________________________________
ac486b ¤   Write asynchronously so that caller may proceed.
a5fb82 ¤   If IO already going, then·
f4f7f7 ____________________________________________________________________________*/
ac6d52 ¤   void
18c7cc CLogToFile::WriteToStore(
bba6ce ¤   const char *¤   data,
34d1a8 ¤   const UInt32¤   ¤   length )
40c7a1 ¤   {
1a8e70 ¤   OSErr¤  err¤= noErr;
181247 ¤   AssertFileRefNumIsValid( mFileRefNum, "CLogToFile::WriteToStore" );
2867c5 ¤
d717fd ¤   WaitIODone();¤  // in case other IO is in progress
b867c5 ¤
4c263c ¤   BlockMoveData( data, mWriteBuffer, length );
c267c5 ¤
acb750 ¤   mWritePB.ioParam.ioCompletion¤  = nil;
797278 ¤   mWritePB.ioParam.ioBuffer¤  ¤   = (Ptr)mWriteBuffer;
98ba43 ¤   mWritePB.ioParam.ioReqCount¤¤   = length;
72f842 ¤   mWritePB.ioParam.ioRefNum¤  ¤   = mFileRefNum;
a8e02d ¤   mWritePB.ioParam.ioPosMode¤ ¤   = fsAtMark;
--d9d8 0017d6a08a24012021a Page 9 of CLog.cp
5a5504 ¤   mWritePB.ioParam.ioPosOffset¤   = 0;
5307d6 ¤   err¤= PBWriteAsync( &mWritePB );
a79c42 ¤   AssertNoErr( err, "CLogToFile::WriteToStore" );
8d9371 ¤   }
2aaf5a
76af5a
8f6d52 ¤   void
a3f956 CLogToFile::sTest( )
3cc7a1 ¤   {
b8496c ¤   FSSpec¤ ¤   spec;
9367c5 ¤
e51a01 ¤   spec.vRefNum¤   = -1;
693827 ¤   spec.parID¤ ¤   = 2;
bc6c11 ¤   CopyPString( "\pTest Log File\r\r\r", spec.name );
b4ae4a ¤   (void)FSpDelete( &spec );
6267c5 ¤
4e3eb9 ¤   CLogToFile¤ log( &spec, 4 * 1024UL);
6067c5 ¤
b048d2 ¤   UInt32¤ size;
f967c5 ¤
0ed711 ¤   size¤   = log.GetSize();
55a77a ¤   size¤   = log.GetFree();
71e243 ¤   size¤   = log.GetUsed();
da67c5 ¤
290a01 ¤   log.Clear();
567fde ¤   log.Flush();
6c6758 ¤   log.AppendBoolean( TRUE );
0ccb92 ¤   log.AppendNewline();
df915f ¤   log.Append( "\phello world\r" );
87cf03 ¤   log.Append( "hello world\r" );
2667c5 ¤
9a7fde ¤   log.Flush();
6667c5 ¤
17f777 ¤   for( UInt32 index = 0; index < 2 * log.GetSize(); ++index )
045b34 ¤   ¤   {
fda5d0 ¤   ¤   Str255¤ msg;
171b52 ¤   ¤
83d3cd ¤   ¤   NumToString( index, msg );
141b52 ¤   ¤
bfc0b1 ¤   ¤   log.Append( msg );
5f0fe4 ¤   ¤   }
a567c5 ¤
3e9371 ¤   }
b467c5 ¤
5b67c5 ¤
95af5a
5daf5a
7caf5a
98af5a
d1af5a
8baf5a
42af5a
c3af5a
62af5a
a3af5a
45af5a
3aaf5a
9faf5a
03af5a
f3af5a
4baf5a
6daf5a
7daf5a
--84c0 000efe1f9ee4012021b Page 1 of CLog.h
a70335 /*____________________________________________________________________________
bdcfc2 ¤   Copyright (C) 1996 Network Associates, Inc. and its affiliates.
994b0f ¤   All rights reserved.
82f7f7 ____________________________________________________________________________*/
a27b7d #pragma once
66af5a
4e4a30 #include "CMacQueue.h"
a8af5a
af02eb class CLog
38c7a1 ¤   {
0e6e2e ¤   class CAppendQueue;
4c67c5 ¤
e0f7f9 ¤   CAppendQueue *¤ mAppendQueue;
b267c5 ¤
b67e01 protected:¤
787104 ¤   ¤   UInt32¤ ¤   mBufferSize;
2e4c07 ¤   ¤   UInt32¤ ¤   mBytesInBuffer;
bfdee9 ¤   ¤   char *¤ ¤   mBuffer;
2a1b52 ¤   ¤
6d47de ¤   ¤   CMacQueue¤  mWinnerQueue;
c51b52 ¤   ¤
e3f5f5 ¤   virtual void¤   AllocateBuffer( UInt32¤ bufSize );
5ca3bd ¤   virtual void¤   DisposeBuffer( void );
0591da ¤   virtual void¤   Init( UInt32 logSize );
7767c5 ¤
cbad0f ¤   virtual void¤   AppendToQueue( const char *data, UInt32 length );
78a5e4 ¤   virtual void¤   AppendAnyQueueItems( void );
adcf57 ¤   virtual void¤   Append_ItsSafeNow( const char *text, UInt32 length );
5e3709 ¤   virtual CLog &¤ AppendBottleneck( const char *text, UInt32 length );
6f7289 ¤   virtual void¤   WriteToStore( const char *text, UInt32 length )¤= 0;
dd67c5 ¤
de716b ¤   virtual char *¤ GetBuffer( void )¤  { return( mBuffer ); }
7d5ed4 public:
878196 ¤   enum¤   ¤   { kDefaultLogSize¤  = 32UL * 1024UL };
0967c5 ¤
62284c ¤   ¤   ¤   ¤   ¤   CLog( UInt32 logSize = kDefaultLogSize);
4e2fed ¤   virtual¤¤   ¤   ~CLog( void );
8867c5 ¤
ad710f ¤   virtual CLog &¤ Append( const char * theString );
c55791 ¤   virtual CLog &¤ Append( ConstStr255Param theString );
2b0c00 ¤   virtual CLog &¤ Append( const char *text, UInt32 length )
72c0ab ¤   ¤   ¤   ¤   ¤   ¤   { return( AppendBottleneck( text, length) ); }
53268b ¤   virtual CLog &¤ Append( const uchar *text, UInt32 length )
198888 ¤   ¤   ¤   ¤   ¤   ¤   { Append( (char *)text, length ); return( *this ); }
4f67c5 ¤
6b8fae ¤   virtual CLog &¤ AppendBoolean( Boolean¤ value );
427bdd ¤   virtual CLog &¤ AppendNewline( void );
e567c5 ¤
535f0b ¤   virtual UInt32¤ GetSize( void )
64c7a1 ¤   {
ee23ff ¤   ¤   return( mBufferSize );
4e9371 ¤   }
8967c5 ¤
b1e311 ¤   virtual UInt32¤ GetFree( void )
aec7a1 ¤   {
aeefb4 ¤   ¤   return( mBufferSize - mBytesInBuffer );
c09371 ¤   }
8467c5 ¤
109e8b ¤   virtual UInt32¤ GetUsed( void )¤
0dc7a1 ¤   {
44903c ¤   ¤   return( GetSize() - GetFree() );
729371 ¤   }
9a67c5 ¤
d6ad7a ¤   virtual void¤   Flush( void );
64e697 ¤   virtual void¤   Clear( void );
1962bd ¤   };
9a67c5 ¤
5faf5a
3faf5a
3aef6c class CLogToMemory : public CLog
46c7a1 ¤   {
efa2d3 protected:
--9416 001c36001024012021b Page 2 of CLog.h
7ec6c7 ¤   virtual void¤   WriteToStore( const char */*text*/, UInt32 /*length*/ )¤{};
b467c5 ¤
db5ed4 public:
146ee2 ¤   ¤   ¤   ¤   CLogToMemory( UInt32 logSize = kDefaultLogSize );
6e68fb ¤   virtual¤¤   ~CLogToMemory( void );
f267c5 ¤
f6d578 ¤   // caller may want to do something with it
2f6e2b ¤   const char *¤   GetBufferPtr( void )¤   { return( mBuffer ); }
5c62bd ¤   };
99af5a
8767c5 ¤
d7af5a
f04b24 class CLogToFile : public CLog
e2c7a1 ¤   {
95a2d3 protected:
c067c5 ¤
633141 ¤   short¤  ¤   ¤   mFileRefNum;
973194 ¤   Boolean¤¤   ¤   mCloseFileWhenDeleted;
726e56 ¤   ParamBlockRec¤  mWritePB;
95c35a ¤   char *¤ ¤   ¤   mWriteBuffer;
7b67c5 ¤
1cd59f ¤   void¤   ¤   ¤   InitCLogToFile( UInt32 logSize,
42c615 ¤   ¤   ¤   ¤   ¤   ¤   short fileRefNum, Boolean¤  closeFileWhenDeleted);
20080a ¤   void¤   ¤   ¤   InitCLogToFile( UInt32 logSize, const FSSpec *spec);
ce67c5 ¤
f46ebd ¤   void¤   ¤   ¤   WaitIODone( void );
fa67c5 ¤
f38f5d ¤   virtual void¤   WriteToStore( const char *text, UInt32 length );
bf67c5 ¤
1c4d1c ¤   virtual OSErr¤  OpenLogFile( const FSSpec *spec, short *refNum);
6267c5 ¤
b25ed4 public:
c003dc ¤   CLogToFile( const FSSpec *spec, UInt32 bufferSize = kDefaultLogSize);
869645 ¤   CLogToFile( ConstStr255Param, UInt32 bufferSize = kDefaultLogSize);
cf62f7 ¤   CLogToFile( short fileRefNum, Boolean closeFileWhenDeleted,
34fdae ¤   ¤   ¤   UInt32 bufferSize = kDefaultLogSize);
f62bec ¤   virtual¤¤   ¤   ~CLogToFile( void );
e3af5a
a0af5a
f095a4 ¤   static void¤¤   sTest( void );
fe62bd ¤   };
77af5a
37af5a
1baf5a
52af5a
cfaf5a
e8af5a
16af5a
c9af5a
21af5a
8aaf5a
0eaf5a
e4af5a
e5af5a
89af5a
6caf5a
c3af5a
--9c2c 0003be0a3984012021c Page 1 of CMacFSWiper.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
0f7446 ¤   $Id: CMacFSWiper.cp,v 1.10.2.1.4.1 1998/11/12 03:19:22 heller Exp $
b8f7f7 ____________________________________________________________________________*/
87af5a
18b2bf #include <Errors.h>
52af5a
91bbf4 #include "MacFiles.h"
b2c110 #include "pgpMacMemory.h"
7985c2 #include "MacStrings.h"
a5371b #include "CMacFSWiper.h"
ceaf5a
9ecd1d #define MIN(a, b )¤ ¤   ( (a) <= (b) ? (a) : (b) )
7aaf5a
8185ea ¤   OSStatus
71b453 CMacFSWiper::FSWipeInternal(
1637b9 ¤   short¤  ¤   ¤   ¤   ¤   refNum,
4596c7 ¤   UInt32¤ ¤   ¤   ¤   ¤   wipeLength,
88306a ¤   PGPUInt32¤  ¤   ¤   ¤   numPasses,
a1c1cc ¤   PGPUInt32 ¤ ¤   ¤   ¤   numPatterns,
839d09 ¤   const PGPWipingPattern ¤patternList[],
0dab97 ¤   void ¤  ¤   ¤   ¤   ¤   *wipeBuffer,
3d817c ¤   PGPSize ¤   ¤   ¤   ¤   wipeBufferLength)
7dbb36 {
a03e2e ¤   AssertFileRefNumIsValid( refNum, "FSWipeInternal" );
2fdd2e ¤   pgpAssertAddrValid( patternList, PGPWipingPattern );
1324e4 ¤   pgpAssert( wipeBufferLength != 0 );
2dcdd1 ¤   pgpAssert( wipeBufferLength % sizeof( PGPWipingPattern ) == 0 );
c267c5 ¤
2b75f8 ¤   OSStatus¤   err¤= noErr;
5f67c5 ¤
817b53 ¤   if ( wipeLength != 0 )
cbc7a1 ¤   {
70e869 ¤   ¤   PGPUInt32¤  passIndex;
201b52 ¤   ¤
3db42c ¤   ¤   (void) FlushFile( refNum );
fa1b52 ¤   ¤
a43b7f ¤   ¤   for( passIndex = 0; passIndex < numPasses; passIndex++ )
d65b34 ¤   ¤   {
1226c7 ¤   ¤   ¤   const PGPWipingPattern¤ *curPattern;
9d3356 ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   ¤   bytesRemaining;
3987c7 ¤   ¤   ¤
5be1cd ¤   ¤   ¤   curPattern = &patternList[ passIndex % numPatterns ];
8c87c7 ¤   ¤   ¤
abadc5 ¤   ¤   ¤   pgpCopyPattern( &curPattern->bytes[0], sizeof( *curPattern ),
1d3fea ¤   ¤   ¤   ¤   ¤   wipeBuffer, wipeBufferLength );
e7ae30 ¤   ¤   ¤   ¤   ¤
fa5cf6 ¤   ¤   ¤   SetFPos( refNum, fsFromStart, 0 );
681b52 ¤   ¤
fdda3b ¤   ¤   ¤   bytesRemaining = wipeLength;
c1a252 ¤   ¤   ¤   while( bytesRemaining != 0 )
a9f776 ¤   ¤   ¤   {
afe087 ¤   ¤   ¤   ¤   long¤   count¤  = MIN( wipeBufferLength, bytesRemaining );
1f2b85 ¤   ¤   ¤   ¤
e01a58 ¤   ¤   ¤   ¤   err¤= FSWriteUncached( refNum, &count, wipeBuffer );
a4aa56 ¤   ¤   ¤   ¤   if ( IsErr( err ) )
0d14c3 ¤   ¤   ¤   ¤   ¤   break;
832b85 ¤   ¤   ¤   ¤
850f5e ¤   ¤   ¤   ¤   bytesRemaining -= count;
3e2b85 ¤   ¤   ¤   ¤
e62eea ¤   ¤   ¤   ¤   err¤= Progress( mWipeSpec.name, count );
43aa56 ¤   ¤   ¤   ¤   if ( IsErr( err ) )
fb14c3 ¤   ¤   ¤   ¤   ¤   break;
53a3a6 ¤   ¤   ¤   }
7a87c7 ¤   ¤   ¤
8bf7b1 ¤   ¤   ¤   FlushFile( refNum );
950fe4 ¤   ¤   }
e59371 ¤   }
3f67c5 ¤
3bdeb7 ¤   return( err );
--1a8c 000a7e6ca324012021c Page 2 of CMacFSWiper.cp
7aefe6 }
46af5a
8eaf5a
79af5a
e585ea ¤   OSStatus
08157a CMacFSWiper::FSWipe(
6737b9 ¤   short¤  ¤   ¤   ¤   ¤   refNum,
0f306a ¤   PGPUInt32¤  ¤   ¤   ¤   numPasses,
58c1cc ¤   PGPUInt32 ¤ ¤   ¤   ¤   numPatterns,
f29d09 ¤   const PGPWipingPattern ¤patternList[],
c3ab97 ¤   void ¤  ¤   ¤   ¤   ¤   *wipeBuffer,
6d817c ¤   PGPSize ¤   ¤   ¤   ¤   wipeBufferLength)
ebbb36 {
8975f8 ¤   OSStatus¤   err¤= noErr;
c67e70 ¤   long¤   ¤   originalEOF;
9c4074 ¤   UInt32¤ ¤   allocBlockSize;
0867c5 ¤
d2a6de ¤   err¤= GetVolumeBlockCounts( mWipeSpec.vRefNum, nil, nil, &allocBlockSize );
205ecc ¤   if ( IsntErr( err ) )
e348b6 ¤   ¤   err¤= GetEOF( refNum, &originalEOF );
ee1b52 ¤   ¤
3a8e84 ¤   if ( IsntErr( err ) && originalEOF != 0 )
56c7a1 ¤   {
f684ef ¤   ¤   UInt32¤ wipeLength;
981b52 ¤   ¤
f5841d ¤   ¤   // wipe length should round up to next allocation block
e9c29c ¤   ¤   wipeLength = ( originalEOF + allocBlockSize - 1 ) / allocBlockSize *
6fdb56 ¤   ¤   ¤   ¤   ¤   ¤   ¤   allocBlockSize;
a31b52 ¤   ¤
a8df54 ¤   ¤   err¤= FSWipeInternal( refNum, wipeLength, numPasses, numPatterns,
ca6179 ¤   ¤   ¤   ¤   ¤   patternList, wipeBuffer, wipeBufferLength );
571b52 ¤   ¤
151061 ¤   ¤   (void)SetEOF( refNum, originalEOF );
0e9371 ¤   }
5067c5 ¤
d2deb7 ¤   return( err );
67efe6 }
48af5a
00af5a
e5af5a
5b85ea ¤   OSStatus
cf5435 CMacFSWiper::FSpWipeFork(
c88de4 ¤   const FSSpec *¤ ¤   ¤   spec,
5e9450 ¤   ForkKind¤   ¤   ¤   ¤   whichFork,
8d306a ¤   PGPUInt32¤  ¤   ¤   ¤   numPasses,
29c1cc ¤   PGPUInt32 ¤ ¤   ¤   ¤   numPatterns,
cd9d09 ¤   const PGPWipingPattern ¤patternList[],
a3ab97 ¤   void ¤  ¤   ¤   ¤   ¤   *wipeBuffer,
0a817c ¤   PGPSize ¤   ¤   ¤   ¤   wipeBufferLength)
04bb36 {
3475f8 ¤   OSStatus¤   err¤= noErr;
b32630 ¤   short¤  ¤   fileRef;
d867c5 ¤
cceca5 ¤   err¤= FSpOpenFork( spec, fsRdWrPerm, &fileRef, whichFork );
8a5ecc ¤   if ( IsntErr( err ) )
5cc7a1 ¤   {
cc8cac ¤   ¤   err¤= FSWipe( fileRef, numPasses, numPatterns, patternList, wipeBuffer,
8f12d6 ¤   ¤   ¤   ¤   ¤   ¤   ·wipeBufferLength );
c61b52 ¤   ¤
579999 ¤   ¤   (void) SetEOF( fileRef, 0 );
6890b1 ¤   ¤   (void) FSClose( fileRef );
769371 ¤   }
5e67c5 ¤
d0deb7 ¤   return( err );
d1efe6 }
3baf5a
faaf5a
3185ea ¤   OSStatus
fc8823 CMacFSWiper::FSpWipe(
118de4 ¤   const FSSpec *¤ ¤   ¤   spec,
ab306a ¤   PGPUInt32¤  ¤   ¤   ¤   numPasses,
a7c1cc ¤   PGPUInt32 ¤ ¤   ¤   ¤   numPatterns,
--5ec9 00062e0488c4012021c Page 3 of CMacFSWiper.cp
0e9d09 ¤   const PGPWipingPattern ¤patternList[],
c0ab97 ¤   void ¤  ¤   ¤   ¤   ¤   *wipeBuffer,
1d817c ¤   PGPSize ¤   ¤   ¤   ¤   wipeBufferLength)
c5bb36 {
1175f8 ¤   OSStatus¤   err¤= noErr;
b94f27 ¤   CInfoPBRec¤ cpb;
7767c5 ¤
6c9547 ¤   err = FSpGetCatInfo( spec, &cpb );
b8ee03 ¤   if( IsntErr( err ) )
87c7a1 ¤   {
8cab8b ¤   ¤   if( ( cpbFileAttributes( &cpb ) & kFileAttributeFileLockedMask ) != 0 )
b75b34 ¤   ¤   {
ee49f8 ¤   ¤   ¤   err = fLckdErr;
f50fe4 ¤   ¤   }
a3fd59 ¤   ¤   else if( ( cpbFileAttributes( &cpb ) & kFileAttributeFileOpenMask ) == ¶
3814b8 0 )
ad5b34 ¤   ¤   {
1c5462 ¤   ¤   ¤   Boolean¤allocatedBuffer = FALSE;
9a67c5 ¤
93cf48 ¤   ¤   ¤   if( IsNull( wipeBuffer ) ||
a2c357 ¤   ¤   ¤   ¤   wipeBufferLength < sizeof( PGPWipingPattern ) )
cbf776 ¤   ¤   ¤   {
8387e8 ¤   ¤   ¤   ¤   UInt32¤ bufferSize = 512L * 1024L;
ae2b85 ¤   ¤   ¤   ¤
a0c9fa ¤   ¤   ¤   ¤   wipeBuffer = pgpNewPtrMost( bufferSize,
f65402 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( PGPWipingPattern ),
8e1725 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap |
e3c913 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseTempMem |
253ca2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_PreferTempMem, &bufferSize );
72e735 ¤   ¤   ¤   ¤   if( IsntNull( wipeBuffer ) )
4672c3 ¤   ¤   ¤   ¤   {
64a753 ¤   ¤   ¤   ¤   ¤   allocatedBuffer ¤   = TRUE;
861211 ¤   ¤   ¤   ¤   ¤   wipeBufferLength¤   = bufferSize;
402613 ¤   ¤   ¤   ¤   }
69fa07 ¤   ¤   ¤   ¤   else
5a72c3 ¤   ¤   ¤   ¤   {
be7b29 ¤   ¤   ¤   ¤   ¤   err = memFullErr;
d62613 ¤   ¤   ¤   ¤   }
8da3a6 ¤   ¤   ¤   }
7887c7 ¤   ¤   ¤
ab6108 ¤   ¤   ¤   if( IsntErr( err ) )
5ef776 ¤   ¤   ¤   {
4ab640 ¤   ¤   ¤   ¤   // The wiping buffer must be a multiple of the pattern size
cd2b85 ¤   ¤   ¤   ¤
8d9202 ¤   ¤   ¤   ¤   wipeBufferLength = ( wipeBufferLength /·
ef30d3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( PGPWipingPattern ) ) *
2375e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( PGPWipingPattern );
d7af5a
68412a ¤   ¤   ¤   ¤   err¤= FSpWipeFork( spec, kDataFork, numPasses, numPatterns,
f47190 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   patternList, wipeBuffer, wipeBufferLength );
d50fe3 ¤   ¤   ¤   ¤   if ( IsntErr( err ) )
ef72c3 ¤   ¤   ¤   ¤   {
d8a3a5 ¤   ¤   ¤   ¤   ¤   err¤= FSpWipeFork( spec, kResourceFork, numPasses,
fe6590 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numPatterns, patternList, wipeBuffer,
afd31c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ·wipeBufferLength);
532613 ¤   ¤   ¤   ¤   }
63a3a6 ¤   ¤   ¤   }
f987c7 ¤   ¤   ¤
6a109c ¤   ¤   ¤   if( allocatedBuffer )
0c251d ¤   ¤   ¤   ¤   pgpFreeMac( wipeBuffer );
160fe4 ¤   ¤   }
100e1d ¤   ¤   else
045b34 ¤   ¤   {
59aaa1 ¤   ¤   ¤   err = fBsyErr;
010fe4 ¤   ¤   }
e29371 ¤   }
6767c5 ¤
9cdeb7 ¤   return( err );
e2efe6 }
36af5a
a1af5a
6285ea ¤   OSStatus
--87e6 0000c6f62964012021c Page 4 of CMacFSWiper.cp
b22262 CMacFSWiper::FSpWipeAndDelete(
33a5ae ¤   const FSSpec ¤  ¤   ¤   *spec,
91306a ¤   PGPUInt32¤  ¤   ¤   ¤   numPasses,
1ac1cc ¤   PGPUInt32 ¤ ¤   ¤   ¤   numPatterns,
029d09 ¤   const PGPWipingPattern ¤patternList[],
77ab97 ¤   void ¤  ¤   ¤   ¤   ¤   *wipeBuffer,
e8817c ¤   PGPSize ¤   ¤   ¤   ¤   wipeBufferLength)
e2bb36 {
844486 ¤   OSStatus¤   err;·
1667c5 ¤
43bdb6 ¤   mTotalDone¤ ¤   = 0;
dc7c9f ¤   mWipeSpec¤  ¤   = *spec;
1b67c5 ¤
f9fddb ¤   /* wipe the data */
b1a274 ¤   err¤= FSpWipe( spec, numPasses, numPatterns, patternList, wipeBuffer,
cf146e ¤   ¤   ¤   ¤   ¤   ·wipeBufferLength );
74ee03 ¤   if( IsntErr( err ) )
05c7a1 ¤   {
ad17d8 ¤   ¤   FSSpec¤ ¤   tempSpec = *spec;
43fef6 ¤   ¤   CInfoPBRec¤ cpb;
5a1b52 ¤   ¤
88ada1 ¤   ¤   /* Clear the catalog information on the file */
261b52 ¤   ¤
2f908e ¤   ¤   err = FSpGetCatInfo( &tempSpec, &cpb );
15da5e ¤   ¤   if( IsntErr( err ) )
485b34 ¤   ¤   {
917ce2 ¤   ¤   ¤   pgpClearMemory( &cpb, sizeof( cpb ) );
3887c7 ¤   ¤   ¤
8939a0 ¤   ¤   ¤   err = FSpSetCatInfo( &tempSpec, &cpb );
b487c7 ¤   ¤   ¤
6aa304 ¤   ¤   ¤   FlushVol( NULL, tempSpec.vRefNum );
930fe4 ¤   ¤   }
551b52 ¤   ¤
0cda5e ¤   ¤   if( IsntErr( err ) )
c55b34 ¤   ¤   {
c7ed6a ¤   ¤   ¤   uchar¤  bogusName[ kMaxHFSFileNameLength + 1 ];
d71b52 ¤   ¤
165013 ¤   ¤   ¤   /* wipe the name (50/50 chance of this doing what we want) */
da3998 ¤   ¤   ¤   pgpFillMemory( bogusName, sizeof( bogusName ), 'x' );
a250d2 ¤   ¤   ¤   bogusName[0] = kMaxHFSFileNameLength;
c2af5a
8bda8f ¤   ¤   ¤   if ( IsntErr( FSpRename( &tempSpec, bogusName ) ) )
20f776 ¤   ¤   ¤   {
07fa40 ¤   ¤   ¤   ¤   CopyPString( bogusName, tempSpec.name );
0f3545 ¤   ¤   ¤   ¤   FlushVol( NULL, tempSpec.vRefNum );
74a3a6 ¤   ¤   ¤   }
d687c7 ¤   ¤   ¤
12ee4c ¤   ¤   ¤   err¤= FSpDelete( &tempSpec );
ac0fe4 ¤   ¤   }
be9371 ¤   }
1067c5 ¤
f33c39 ¤   /* caller is responsible for flushing volume */
6b67c5 ¤
fcdeb7 ¤   return( err );
e4efe6 }
b1af5a
0caf5a
99af5a
2a07c9 CMacFSWiper::CMacFSWiper()
3fbb36 {
eaa5cd ¤   MacDebug_FillWithGarbage( &mWipeSpec, sizeof( mWipeSpec ) );
2667c5 ¤
cf72aa ¤   mTotalDone = 0;
c2efe6 }
ffaf5a
c70335 /*____________________________________________________________________________
21bf4a ¤   To get progress while wiping, subclass and override Progress().
09f7f7 ____________________________________________________________________________*/
4d85ea ¤   OSStatus
0bcff3 CMacFSWiper::Progress(
c3b8b2 ¤   ConstStr255Param¤   fileName,
0c0bf7 ¤   PGPUInt64¤  ¤   ¤   additionalDone )
--5ba6 0017d2937864012021c Page 5 of CMacFSWiper.cp
2cbb36 {
bd7db8 ¤   (void)fileName;
9e67c5 ¤
7b38f6 ¤   mTotalDone¤ += additionalDone;
f467c5 ¤
5879ad ¤   return( noErr );
a7efe6 }
11af5a
9faf5a
b3af5a
a4af5a
52af5a
77af5a
14af5a
b2af5a
acaf5a
b8af5a
1baf5a
66af5a
57af5a
a8af5a
23af5a
4aaf5a
14af5a
87af5a
5eaf5a
a9af5a
c2af5a
8baf5a
c3af5a
33af5a
63af5a
0faf5a
1eaf5a
31af5a
477e4d /*__Editor_settings____
a0af5a
224126 ¤   Local Variables:
8d7b17 ¤   tab-width: 4
b40e6c ¤   End:
6a5f8c ¤   vi: ts=4 sw=4
fe9e9b ¤   vim: si
7d7c50 _____________________*/¶
--0593 001cebb7f1f4012021d Page 1 of CMacFSWiper.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3167c5 ¤
d7e983 ¤   $Id: CMacFSWiper.h,v 1.3.12.1 1998/11/12 03:19:23 heller Exp $
25f7f7 ____________________________________________________________________________*/
98af5a
63d1aa #ifndef Included_CMacFSWiper_h¤ /* [ */
7a6872 #define Included_CMacFSWiper_h
8baf5a
077dde #include "pgpMacWiping.h"
e6af5a
8b950d class CMacFSWiper
babb36 {
d52286 ¤   FSSpec¤ ¤   ¤   mWipeSpec;
f19bd8 ¤   PGPUInt64¤  ¤   mTotalDone;
d167c5 ¤
eba2d3 protected:
9641bc ¤   virtual OSStatus¤   FSWipeInternal( short refNum, UInt32 wipeLength,
de3a06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32 numPasses, PGPUInt32 numPatterns,
7f2994 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPWipingPattern patternList[],
f6f44c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *wipeBuffer, PGPSize wipeBufferLength);
cbda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
d3c57e ¤   virtual OSStatus¤   FSWipe(short refNum, PGPUInt32 numPasses,
1590d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32 numPatterns,
172994 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPWipingPattern patternList[],
96f44c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *wipeBuffer, PGPSize wipeBufferLength);
d8ae30 ¤   ¤   ¤   ¤   ¤
f656d0 ¤   virtual OSStatus¤   FSpWipeFork(const FSSpec *spec, ForkKind whichFork,
b03a06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32 numPasses, PGPUInt32 numPatterns,
2e5cad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPWipingPattern ¤patternList[],
2df44c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *wipeBuffer, PGPSize wipeBufferLength);
092b85 ¤   ¤   ¤   ¤
f27bae ¤   virtual OSStatus¤   FSpWipe( const FSSpec *spec,
673a06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32 numPasses, PGPUInt32 numPatterns,
595cad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPWipingPattern ¤patternList[],
82f44c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *wipeBuffer, PGPSize wipeBufferLength);
9067c5 ¤
a00335 /*____________________________________________________________________________
78f636 ¤   To get progress while wiping, subclass and override Progress()
41f69b ¤   Progress ·is called periodically with the number of *additional* bytes
10d03a ¤   it has done. ·It doesn't tell you the total nor does it tell you
1f6cd7 ¤   the cumulative number.
a867c5 ¤
2e09b8 ¤   This places a burden on the client to know what the total job size is.
81f7f7 ____________________________________________________________________________*/
7d479b ¤   virtual OSStatus¤   Progress( ·ConstStr255Param fileName,
3d1df8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt64 additionalDone );
3b67c5 ¤
0e5ed4 public:
1f4541 ¤   ¤   ¤   ¤   ¤   ¤   CMacFSWiper( void );
b90fcf ¤   virtual OSStatus¤   FSpWipeAndDelete(const FSSpec *spec,
4f3a06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32 numPasses, PGPUInt32 numPatterns,
062994 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPWipingPattern patternList[],
b799a3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   void *wipeBuffer = NULL,
ce9395 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize wipeBufferLength = 0 );
0f82f7 };
78af5a
e5af5a
108204 #endif /* ] Included_CMacFSWiper_h */
b4af5a
fdaf5a
f47e4d /*__Editor_settings____
3aaf5a
584126 ¤   Local Variables:
e47b17 ¤   tab-width: 4
790e6c ¤   End:
ff5f8c ¤   vi: ts=4 sw=4
819e9b ¤   vim: si
ced062 _____________________*/
--cfe8 001cc77079c4012021e Page 1 of CMacQueue.h
997b7d #pragma once
bdaf5a
700d08 #include "pgpMem.h"
93af5a
5f0335 /*____________________________________________________________________________
f2eb59 ¤   A wrapper class for the Macintosh Enqueue/Dequeue routines which implement
5682ba ¤   an atomic queueing mechanism.
b7f7f7 ____________________________________________________________________________*/
eeaf5a
9fe378 class CMacQueue
2dc7a1 ¤   {
67a2d3 protected:
6b9dee ¤   QHdr¤   ¤   mQHeader;
b467c5 ¤
785ed4 public:
841c40 ¤   ¤   ¤   ¤   CMacQueue( void )
a84859 ¤   ¤   ¤   ¤   ¤   {
fe17a9 ¤   ¤   ¤   ¤   ¤   MakeEmpty();
e91c89 ¤   ¤   ¤   ¤   ¤   }
faae30 ¤   ¤   ¤   ¤   ¤
2f954c ¤   virtual void¤   MakeEmpty( void )
074859 ¤   ¤   ¤   ¤   ¤   {
b9a3e7 ¤   ¤   ¤   ¤   ¤   mQHeader.qHead¤ = nil;
a9121e ¤   ¤   ¤   ¤   ¤   mQHeader.qTail¤ = nil;
76cc18 ¤   ¤   ¤   ¤   ¤   mQHeader.qFlags¤= 0;
c31c89 ¤   ¤   ¤   ¤   ¤   }
7d67c5 ¤
f067c5 ¤
5067c5 ¤
a92059 ¤   virtual void¤   ¤   Enqueue( QElem *elem )
5f06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
39e8b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::Enqueue( elem, &mQHeader );
195268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
06531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
3410e5 ¤   virtual OSErr¤  ¤   Dequeue( QElem *elem )
e106b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
1d936e ¤   ¤   ¤   ¤   ¤   ¤   ¤   return( ::Dequeue( elem, &mQHeader ) );
a15268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
cf531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
0583d5 ¤   virtual Boolean¤¤   IsEmpty( void )
b006b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
c8f4ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   return( IsNull( mQHeader.qHead ) ·);
0a5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
83531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
7c531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
7252a8 ¤   virtual QElem *¤¤   PeekHead( void )
9206b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
f1675b ¤   ¤   ¤   ¤   ¤   ¤   ¤   return( mQHeader.qHead );
615268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
bf531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
86531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
bce351 ¤   virtual QElem *¤¤   PeekTail( void )
d506b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
c1134f ¤   ¤   ¤   ¤   ¤   ¤   ¤   return( mQHeader.qTail );
dd5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
4362bd ¤   };
c1af5a
7baf5a
ccaf5a
--693d 00061af6d5b4012021f Page 1 of MacBTree.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ef2641 ¤   macintosh B*-Tree utilities (read-only)
0caf5a
a57f62 ¤   $Id: MacBTree.cp,v 1.6.28.1 1998/11/12 03:19:24 heller Exp $
6ff7f7 ____________________________________________________________________________*/
8faf5a
040d08 #include "pgpMem.h"
b46f74 #include "MacBTree.h"
87bbf4 #include "MacFiles.h"
0eaf5a
fcaf5a
12af5a
c94b0c typedef struct ExtentKeyRecord
91bb36 {
a80c0f ¤   SInt8¤  xkrKeyLen;¤ // key length
988735 ¤   SInt8¤  xkrFkType;¤ // fork type
189505 ¤   UInt32¤ xkrFNum;¤   // file number
a4c043 ¤   UInt16¤ xkrFABN;¤   // starting file allocation block
6ee4ba } ExtentKeyRecord;
a6af5a
abaf5a
b166bc CMacBTree::CMacBTree()
7cbb36 {
b9f95e ¤   mFileRefNum = 0;
45efe6 }
5faf5a
f4035d CMacBTree::~CMacBTree()
77bb36 {
eff95e ¤   mFileRefNum = 0;
6aefe6 }
abaf5a
ab85ea ¤   OSStatus
e730fd CMacBTree::VerifyHeaderNode(const BTreeHeaderNode *headerNode)
1ebb36 {
b195e0 ¤   if( headerNode->descriptor.ndType != kBTreeHeaderNodeType )
e8c7a1 ¤   {
82b4e8 ¤   ¤   pgpDebugMsg( "VerifyHeaderNode: Wrong node type" );
01bc49 ¤   ¤   return( kBTreeBadHeaderNodeError );
ea9371 ¤   }
0767c5 ¤
fa79ad ¤   return( noErr );
54efe6 }
46af5a
6585ea ¤   OSStatus
b116f2 CMacBTree::Setup(void)
cebb36 {
2025e4 ¤   OSStatus¤   ¤   status;
da31d5 ¤   BTreeHeaderNode¤headerNode;
6467c5 ¤
300478 ¤   pgpAssert( mFileRefNum != 0 );
f267c5 ¤
a97398 ¤   // Read and verify the header node
81af5a
4bcad4 ¤   status = FSReadAtOffset( mFileRefNum, 0,
88369e ¤   ¤   ¤   ¤   sizeof( headerNode ), &headerNode, nil, TRUE );
5edd30 ¤   if( IsntErr( status ) )
ffc7a1 ¤   {
25a4e3 ¤   ¤   status = VerifyHeaderNode( &headerNode );
7f706e ¤   ¤   if( IsntErr( status ) )
a85b34 ¤   ¤   {
8c760c ¤   ¤   ¤   // Allocate a buffer to store a single node.
1587c7 ¤   ¤   ¤
b1a6db ¤   ¤   ¤   mNodeSize = headerNode.record.bthNodeSize;
e887c7 ¤   ¤   ¤
0291c4 ¤   ¤   ¤   mNodeBuffer = (NodeDescriptor *) NewPtr( mNodeSize );
9a55e5 ¤   ¤   ¤   if( IsntNull( mNodeBuffer ) )
a9f776 ¤   ¤   ¤   {
df87c7 ¤   ¤   ¤
6187c7 ¤   ¤   ¤
--bef4 000aa87a0dc4012021f Page 2 of MacBTree.cp
cfa3a6 ¤   ¤   ¤   }
41bb8c ¤   ¤   ¤   else
e6f776 ¤   ¤   ¤   {
a743b7 ¤   ¤   ¤   ¤   status = memFullErr;
cca3a6 ¤   ¤   ¤   }
730fe4 ¤   ¤   }
d29371 ¤   }
8b67c5 ¤
5b4afd ¤   return( status );
00efe6 }
c0af5a
f585ea ¤   OSStatus
ddc835 CMacBTree::GetNode(UInt32 nodeNumber, NodeDescriptor *nodeData)
d8bb36 {
a2c412 ¤   OSStatus¤   status;
ba67c5 ¤
9f503b ¤   pgpAssert( IsntNull( mNodeBuffer ) );
3067c5 ¤
516123 ¤   status = FSReadAtOffset( mFileRefNum, nodeNumber * mNodeSize, mNodeSize,
488f16 ¤   ¤   ¤   nodeData, nil, TRUE);
6287c7 ¤   ¤   ¤
6c4afd ¤   return( status );
4eefe6 }
76af5a
3faf5a
330335 /*____________________________________________________________________________
be34ab ¤   Returns TRUE if the search key was found. If key was not found,
1c26f4 ¤   foundRecordIndex indicates the record offset for record insertion.·
1bf7f7 ____________________________________________________________________________*/
dcaf5a
4f7e69 ¤   Boolean
0c8954 CMacBTree::SearchNode(
c32593 ¤   const BTreeKey ¤*searchKey,
4e6568 ¤   NodeDescriptor ¤*nodeData,
27a250 ¤   UInt16¤ ¤   ¤   *foundRecordIndex)
91bb36 {
b4849c ¤   UInt16¤ recordIndex;
b4578c ¤   UInt16¤ *curRecordOffsetPtr;
5d67c5 ¤
22debf ¤   pgpAssertAddrValid( searchKey, BTreeKey );
4fd74d ¤   pgpAssertAddrValid( nodeData, NodeDescriptor );
8310f4 ¤   pgpAssertAddrValid( foundRecordIndex, UInt16 );
1867c5 ¤
9b0ac5 ¤   curRecordOffsetPtr = (UInt16 *)
023f53 ¤   ¤   ((uchar *) nodeData + mNodeSize - sizeof( UInt16 ));
3167c5 ¤
f82c3e ¤   for( recordIndex = 0; recordIndex < nodeData->ndNRecs; recordIndex++)
99c7a1 ¤   {
be5734 ¤   ¤   BTreeKey¤   *trialKey;
8d45f7 ¤   ¤   SInt32¤ ¤   compareResult;
231b52 ¤   ¤
bf76cb ¤   ¤   trialKey = (BTreeKey *) ((uchar *) nodeData + *curRecordOffsetPtr);
cc1b52 ¤   ¤
8ef74d ¤   ¤   compareResult = CompareKeys( searchKey, trialKey );
e4fb09 ¤   ¤   if( compareResult < 0 )
555b34 ¤   ¤   {
d19439 ¤   ¤   ¤   *foundRecordIndex = recordIndex;
94d650 ¤   ¤   ¤   return( FALSE );
f20fe4 ¤   ¤   }
2f74df ¤   ¤   else if( compareResult == 0 )
2a5b34 ¤   ¤   {
6e9439 ¤   ¤   ¤   *foundRecordIndex = recordIndex;
7695f7 ¤   ¤   ¤   return( TRUE );
fc0fe4 ¤   ¤   }
341b52 ¤   ¤
710ea1 ¤   ¤   --curRecordOffsetPtr;
259371 ¤   }
e067c5 ¤
3b3700 ¤   *foundRecordIndex = recordIndex;¤   // Not a real index
8053dc ¤   return( FALSE );
8defe6 }
aaaf5a
--be9a 000cd7fb31e4012021f Page 3 of MacBTree.cp
c5cd56 ¤   UInt32
a86b53 CMacBTree::GetRecordOffset(NodeDescriptor *nodeData, UInt16 recordIndex)
ffbb36 {
4bccf1 ¤   LogicalAddress¤ offsetPtr;
251b52 ¤   ¤
56b30b ¤   offsetPtr = (uchar *)
8340e4 ¤   ¤   nodeData + mNodeSize - ( recordIndex * 2 ) - sizeof( UInt16 );
2367c5 ¤
7b60a6 ¤   return( *((UInt16 *) offsetPtr) );
94efe6 }
8baf5a
166d52 ¤   void
d9b75f CMacBTree::GetRecordKeyAndData(
16ae0d ¤   NodeDescriptor ¤*nodeBuffer,
96f123 ¤   UInt16¤ ¤   ¤   recordIndex,
c5daa6 ¤   BTreeKey¤   ¤   **keyPtr,
0bc152 ¤   LogicalAddress¤ *dataPtr)
babb36 {
c08010 ¤   BTreeKey¤   *recordKey;
7c2a65 ¤   uchar ¤ ¤   *recordData;
ab1050 ¤   UInt32¤ ¤   recordOffset;
c287c7 ¤   ¤   ¤
9c851d ¤   pgpAssertAddrValid( nodeBuffer, NodeDescriptor );
3f87c7 ¤   ¤   ¤
054967 ¤   recordOffset¤   = GetRecordOffset( nodeBuffer, recordIndex );¤  ¤   ¤
485c1b ¤   recordKey ¤ ¤   = (BTreeKey *) ((uchar *) nodeBuffer + recordOffset);
c78c0e ¤   recordData ¤¤   = (uchar *) recordKey + recordKey->keyLength;
cdaf5a
55e9df ¤   if( ( recordKey->keyLength & 1 ) != 0 )
95c7a1 ¤   {
2d1450 ¤   ¤   recordData += 1;
169371 ¤   }
c90e24 ¤   else
bac7a1 ¤   {
65fb34 ¤   ¤   recordData += 2;
b59371 ¤   }
db67c5 ¤
d88b7a ¤   *keyPtr = recordKey;
328c5e ¤   *dataPtr¤   = recordData;
9befe6 }
e4af5a
8585ea ¤   OSStatus
d33665 CMacBTree::SearchTree(
562593 ¤   const BTreeKey ¤*searchKey,
18ae0d ¤   NodeDescriptor ¤*nodeBuffer,
265f9a ¤   UInt32¤ ¤   ¤   *nodeNumber,
233608 ¤   UInt16¤ ¤   ¤   *recordIndex)
7cbb36 {
9ec412 ¤   OSStatus¤   status;
7567c5 ¤
31debf ¤   pgpAssertAddrValid( searchKey, BTreeKey );
0a851d ¤   pgpAssertAddrValid( nodeBuffer, NodeDescriptor );
beab55 ¤   pgpAssertAddrValid( nodeNumber, UInt32 );
29bd50 ¤   pgpAssertAddrValid( recordIndex, UInt16 );
a967c5 ¤
4f809b ¤   // Always start at the header node.
96ac66 ¤   // This isn't the most efficient implementation,
bee092 ¤   // but it is always correct.
6167c5 ¤
157ae1 ¤   status = GetNode( 0, nodeBuffer );
6edd30 ¤   if( IsntErr( status ) )
0cc7a1 ¤   {
018a2b ¤   ¤   UInt32¤ curNodeNumber;
63db06 ¤   ¤   Boolean¤foundKey;
4caf5a
71cf98 ¤   ¤   // Check for empty BTree
8795ea ¤   ¤   if( ((BTreeHeaderNode *) nodeBuffer)->record.bthDepth == 0 )
0f9733 ¤   ¤   ¤   return( kBTreeRecordNotFoundError );
7467c5 ¤
b4cce8 ¤   ¤   curNodeNumber = ((BTreeHeaderNode *) nodeBuffer)->record.bthRoot;
9767c5 ¤
cd434b ¤   ¤   while( TRUE )
--0057 00017e9d6974012021f Page 4 of MacBTree.cp
e35b34 ¤   ¤   {
77e353 ¤   ¤   ¤   LogicalAddress¤ recordData;
e587c7 ¤   ¤   ¤
28a627 ¤   ¤   ¤   status = GetNode( curNodeNumber, nodeBuffer );
2f1fdb ¤   ¤   ¤   if( IsErr( status ) )
92f776 ¤   ¤   ¤   {
b8729a ¤   ¤   ¤   ¤   goto Exit;
f2a3a6 ¤   ¤   ¤   }
6eaf5a
55172f ¤   ¤   ¤   foundKey = SearchNode( searchKey, nodeBuffer, recordIndex );
efaf5a
3f1e29 ¤   ¤   ¤   if( ((NodeDescriptor *) nodeBuffer)->ndType == kBTreeLeafNodeType)
e7f776 ¤   ¤   ¤   {
eb75d9 ¤   ¤   ¤   ¤   // If the current node type is a leaf node, then we're done
3ff622 ¤   ¤   ¤   ¤   break;
49a3a6 ¤   ¤   ¤   }
5887c7 ¤   ¤   ¤
65a7fa ¤   ¤   ¤   // If we didn't find the record, back up one index and
f0c284 ¤   ¤   ¤   // get that record
5e76b9 ¤   ¤   ¤   if( ( ! foundKey ) && ( *recordIndex != 0 ) )
95ba3b ¤   ¤   ¤   ¤   *recordIndex -= 1;
2a87c7 ¤   ¤   ¤
7c0666 ¤   ¤   ¤   GetRecordKeyAndData( nodeBuffer, *recordIndex, nil, &recordData );
c24806 ¤   ¤   ¤   curNodeNumber = *(UInt32 *) recordData;
290fe4 ¤   ¤   }
731b52 ¤   ¤
43b7f8 ¤   ¤   *nodeNumber = curNodeNumber;
bd1b52 ¤   ¤
cffc2e ¤   ¤   if( ! foundKey )
378078 ¤   ¤   ¤   status = kBTreeRecordNotFoundError;
9e9371 ¤   }
96af5a
443e33 Exit:
67af5a
784afd ¤   return( status );
03efe6 }
2eaf5a
04dacc #pragma mark -
c3af5a
f36afd CMacExtentsBTree::CMacExtentsBTree()
febb36 {
aea6c2 ¤   mVRefNum¤   = 0;
678e8b ¤   mNodeBuffer¤= nil;
d1efe6 }
eeaf5a
373805 CMacExtentsBTree::~CMacExtentsBTree()
4cbb36 {
b38678 ¤   if( IsntNull( mNodeBuffer ) )
66c7a1 ¤   {
9a2703 ¤   ¤   DisposePtr( (Ptr) mNodeBuffer );
2fb156 ¤   ¤   mNodeBuffer = nil;
079371 ¤   }
eaefe6 }
f3af5a
c585ea ¤   OSStatus
0b2c3c CMacExtentsBTree::OpenVolume(short vRefNum)
2ebb36 {
a060cd ¤   const VCB¤  *vcb;
57323e ¤   OSStatus¤   status = noErr;
2967c5 ¤
49ef0f ¤   pgpAssert( mVRefNum == 0 );
6567c5 ¤
fb4fd4 ¤   vcb = GetVCBForVolume( vRefNum );
974f27 ¤   if( IsNull( vcb ) )
90da16 ¤   ¤   return( nsvErr );
431b52 ¤   ¤
73307c ¤   mVRefNum ¤  = vRefNum;
a85aad ¤   mFileRefNum¤= vcb->vcbXTRef;
87af5a
703a94 ¤   status = Setup();
9067c5 ¤
174afd ¤   return( status );
--4d85 0001a2b75b84012021f Page 5 of MacBTree.cp
7aefe6 }
46af5a
cf85ea ¤   OSStatus
4f8eff CMacExtentsBTree::CompareKeys(
434294 ¤   const BTreeKey *searchKey, const BTreeKey *trialKey)
74bb36 {
b447f0 ¤   SInt32¤ ¤   ¤   result;
3504a9 ¤   ExtentKeyRecord¤*searchExtKey¤  = (ExtentKeyRecord *) searchKey;
003ba7 ¤   ExtentKeyRecord¤*trialExtKey¤   = (ExtentKeyRecord *) trialKey;
6667c5 ¤
d1debf ¤   pgpAssertAddrValid( searchKey, BTreeKey );
d82a8d ¤   pgpAssertAddrValid( trialKey, BTreeKey );
6667c5 ¤
48edcc ¤   // Compare the file numbers first.
a8b842 ¤   if( searchExtKey->xkrFNum > trialExtKey->xkrFNum )
8fc7a1 ¤   {
1110f5 ¤   ¤   result = 1;
1f9371 ¤   }
5f7f9a ¤   else if( searchExtKey->xkrFNum < trialExtKey->xkrFNum )
93c7a1 ¤   {
7787fd ¤   ¤   result = -1;
d49371 ¤   }
5b0e24 ¤   else
59c7a1 ¤   {
8dc23a ¤   ¤   // If the file numbers are equal, then we check the fork tpy.
6ef016 ¤   ¤   // Data forks come before resource forks in the extents BTree.
991b52 ¤   ¤
317599 ¤   ¤   if( searchExtKey->xkrFkType == trialExtKey->xkrFkType )
125b34 ¤   ¤   {
24cc6e ¤   ¤   ¤   // Same fork type. Compare starting FABN's
d687c7 ¤   ¤   ¤
32f3fb ¤   ¤   ¤   if (searchExtKey->xkrFABN > trialExtKey->xkrFABN)
48f776 ¤   ¤   ¤   {
4e9c64 ¤   ¤   ¤   ¤   result = 1;
c3a3a6 ¤   ¤   ¤   }
f04343 ¤   ¤   ¤   else if (searchExtKey->xkrFABN < trialExtKey->xkrFABN)
00f776 ¤   ¤   ¤   {
2b0271 ¤   ¤   ¤   ¤   result = -1;
f3a3a6 ¤   ¤   ¤   }
09bb8c ¤   ¤   ¤   else
f9f776 ¤   ¤   ¤   {
a1c6b8 ¤   ¤   ¤   ¤   result = 0;
52a3a6 ¤   ¤   ¤   }
ae0fe4 ¤   ¤   }
2161f9 ¤   ¤   else if( searchExtKey->xkrFkType == kBTreeDataForkRecordType &&
c8a2bf ¤   ¤   ¤   ¤   ·trialExtKey->xkrFkType == kBTreeResourceForkRecordType )
c15b34 ¤   ¤   {
f7362c ¤   ¤   ¤   result = -1;
bf0fe4 ¤   ¤   }
c2cb6e ¤   ¤   else if( searchExtKey->xkrFkType == kBTreeResourceForkRecordType &&
c44d79 ¤   ¤   ¤   ¤   ·trialExtKey->xkrFkType == kBTreeDataForkRecordType )
e35b34 ¤   ¤   {
466a01 ¤   ¤   ¤   result = 1;
340fe4 ¤   ¤   }
8b0e1d ¤   ¤   else
bc5b34 ¤   ¤   {
27f4b4 ¤   ¤   ¤   pgpDebugMsg( "CMacExtentsBTree::CompareKeys: Unknown fork type!");
e02394 ¤   ¤   ¤   result = 1;¤// Arbitrary result;
4e3b90 ¤   ¤   }¤
509371 ¤   }
0faf5a
d6d512 ¤   return (result);
d2efe6 }
b6af5a
2f85ea ¤   OSStatus
1814fc CMacExtentsBTree::GetExtent(
285fad ¤   UInt32 ¤¤   ¤   ¤   fileNumber,
3ba637 ¤   SInt8 ¤ ¤   ¤   ¤   forkType,
fd6c8c ¤   UInt32 ¤¤   ¤   ¤   startingFABN,
ff0ebd ¤   ExtentDataRecord¤   *extentRecord)
9cbb36 {
1a25e4 ¤   OSStatus¤   ¤   status;
--fdd1 001f00ff1024012021f Page 6 of MacBTree.cp
c11306 ¤   UInt32¤ ¤   ¤   nodeNumber;
0829ba ¤   UInt16¤ ¤   ¤   recordIndex;
db6e59 ¤   ExtentKeyRecord¤searchKey;
7667c5 ¤
a3b9c4 ¤   pgpAssertAddrValid( extentRecord, ExtentDataRecord );
3067c5 ¤
c36e26 ¤   searchKey.xkrKeyLen = sizeof( searchKey ) - 1;
377e99 ¤   searchKey.xkrFkType = forkType;
a79a64 ¤   searchKey.xkrFNum ¤ = fileNumber;
64e50a ¤   searchKey.xkrFABN ¤ = startingFABN;
d267c5 ¤
b9296f ¤   status = SearchTree( (BTreeKey *) &searchKey,
9ebb98 ¤   ¤   mNodeBuffer, &nodeNumber, &recordIndex );
f6dd30 ¤   if( IsntErr( status ) )
e4c7a1 ¤   {
802606 ¤   ¤   LogicalAddress¤ recordData;
731b52 ¤   ¤
ef1b8a ¤   ¤   GetRecordKeyAndData( mNodeBuffer, recordIndex, nil, &recordData );
ff06a4 ¤   ¤   BlockMoveData( recordData, extentRecord, sizeof( *extentRecord ) );
499371 ¤   }
0767c5 ¤
624afd ¤   return( status );
f0efe6 }
--b599 00026919d8f40120220 Page 1 of MacBTree.h
a70335 /*____________________________________________________________________________
7bf254 ¤   Copyright (C) 1996,1997 Network Associates, Inc. and its affiliates.
754b0f ¤   All rights reserved.
0967c5 ¤
a42911 ¤   $Id: MacBTree.h,v 1.4.28.1 1998/11/12 03:19:24 heller Exp $
a0f7f7 ____________________________________________________________________________*/
10af5a
1c7b7d #pragma once
8baf5a
23af5a
e57353 enum
00bb36 {
2e511f ¤   kBTreeBadHeaderNodeError¤   = 10000,
a6f27d ¤   kBTreeRecordNotFoundError
5982f7 };
b5af5a
47de3b const SInt8¤kBTreeLeafNodeType¤ ¤   = -1;
6fec3d const SInt8¤kBTreeIndexNodeType¤¤   = 0;
acab00 const SInt8¤kBTreeHeaderNodeType¤   = 1;
838dbe const SInt8¤kBTreeMapNodeType¤  ¤   = 2;
a5af5a
984d7f const SInt8¤kBTreeDataForkRecordType¤   ¤   = 0;
c4b1c1 const SInt8¤kBTreeResourceForkRecordType¤   = -1;
fcaf5a
34af46 #pragma options align=mac68k
f0af5a
e34465 typedef struct NodeDescriptor
6abb36 {
5b6797 ¤   SInt32¤ ndFLink;¤   // forward link
4e34f8 ¤   SInt32¤ ndBLink;¤   // backward link
30a5b5 ¤   SInt8¤  ndType;¤¤   // node type
fd9a63 ¤   SInt8¤  ndNHeight;¤ // node level
5502dc ¤   SInt16¤ ndNRecs;¤   // number of records in node
b3a450 ¤   SInt16¤ ndResv2;¤   // Reserved
dfaf5a
32f310 } NodeDescriptor;
a4af5a
7c770c typedef struct BTreeHeaderRecord
abbb36 {
7c7598 ¤   SInt16¤ bthDepth;¤  ¤   // current depth of tree
756fe0 ¤   SInt32¤ bthRoot;¤   ¤   // number of root node
767f84 ¤   SInt32¤ bthNRecs;¤  ¤   // number of leaf records in tree
fc67d3 ¤   SInt32¤ bthFNode;¤  ¤   // number of first leaf node
e33bb2 ¤   SInt32¤ bthLNode;¤  ¤   // number of last leaf node
89de61 ¤   SInt16¤ bthNodeSize;¤   // size of a node
62cfa7 ¤   SInt16¤ bthKeyLen;¤ ¤   // maximum length of a key
311f90 ¤   SInt32¤ bthNNodes;¤ ¤   // total number of nodes in tree
7e9911 ¤   SInt32¤ bthFree;¤   ¤   // number of free nodes
d01c2e ¤   SInt8¤  bthResv[76];¤   ¤   // reserved
f3af5a
f78851 } BTreeHeaderRecord;
93af5a
7cd54e typedef struct BTreeHeaderNode
66bb36 {
95909d ¤   NodeDescriptor¤ ¤   descriptor;
21cb08 ¤   BTreeHeaderRecord¤  record;
9daf5a
9f8532 } BTreeHeaderNode;
30af5a
3cf406 typedef struct BTreeKey
cebb36 {
7d21ea ¤   UInt8¤  keyLength;
9603d0 ¤   char¤   keyData;
e4af5a
1dfa87 } BTreeKey;
9faf5a
3d286d typedef struct ExtentDescriptor
8abb36 {
4c6673 ¤   UInt16¤ xdrStABN;¤  ¤   // first allocation block
b12cde ¤   UInt16¤ xdrNumABlks;¤   // number of allocation blocks
a5af5a
268dad } ExtDescriptor;
--aa3a 001991a88c640120220 Page 2 of MacBTree.h
e0af5a
a13998 typedef struct ExtentDataRecord
46bb36 {
fbf510 ¤   ExtentDescriptor¤   extents[3];
a5af5a
9e7698 } ExtentDataRecord;
16af5a
80af5a
487c46 #pragma options align=reset
2baf5a
ced775 class CMacBTree
edbb36 {
0b5ed4 public:
4edb0e ¤   ¤   ¤   ¤   ¤   ¤   CMacBTree();
f63c51 ¤   virtual¤¤   ¤   ¤   ~CMacBTree();
04af5a
38719b ¤   virtual¤OSStatus¤   VerifyHeaderNode(const BTreeHeaderNode *headerNode);
aaaf5a
46a2d3 protected:
c1af5a
f6799c ¤   short¤  ¤   ¤   ¤   mFileRefNum;¤   // file refnum for access
cc9b5d ¤   NodeDescriptor¤ ¤   *mNodeBuffer;
acf27d ¤   UInt32¤ ¤   ¤   ¤   mNodeSize;
8b67c5 ¤
644802 ¤   virtual¤SInt32¤ ¤   CompareKeys(const BTreeKey *searchKey,
0864da ¤   ¤   ¤   ¤   ¤   ¤   ¤   const BTreeKey *trialKey) = 0;
7670e8 ¤   OSStatus¤   ¤   ¤   GetNode(UInt32 nodeNumber, NodeDescriptor *nodeData);
e91ff7 ¤   void¤   ¤   ¤   ¤   GetRecordKeyAndData(NodeDescriptor *nodeBuffer,
ec3386 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt16 recordIndex,
a0ae39 ¤   ¤   ¤   ¤   ¤   ¤   ¤   BTreeKey **keyPtr, LogicalAddress *dataPtr);
99f058 ¤   UInt32¤ ¤   ¤   ¤   GetRecordOffset(NodeDescriptor *nodeData,
47d890 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt16 recordIndex);
4c21ed ¤   Boolean¤¤   ¤   ¤   SearchNode(const BTreeKey *searchKey,
85497c ¤   ¤   ¤   ¤   ¤   ¤   ¤   NodeDescriptor *nodeData,
f3481f ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt16 *foundRecordIndex);
be2a66 ¤   OSStatus¤   ¤   ¤   SearchTree(const BTreeKey *searchKey,
2cb792 ¤   ¤   ¤   ¤   ¤   ¤   ¤   NodeDescriptor *nodeBuffer,
191e4a ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 *nodeNumber, UInt16 *recordIndex);
3d6b0b ¤   OSStatus¤   ¤   ¤   Setup(void);
c682f7 };
43af5a
eca217 class CMacExtentsBTree : public CMacBTree
a8bb36 {
5b5ed4 public:
41af5a
ecefad ¤   ¤   ¤   ¤   ¤   ¤   CMacExtentsBTree();
59089b ¤   ¤   ¤   ¤   ¤   ¤   ~CMacExtentsBTree();
d6af5a
66401a ¤   virtual¤OSStatus¤   GetExtent(UInt32 fileNumber, SInt8 forkType,
18ba16 ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 startingFABN,
8e6ae0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ExtentDataRecord *extentRecord);
d20ea8 ¤   virtual¤OSStatus¤   OpenVolume(short vRefNum);
5aaf5a
6aa2d3 protected:
4faf5a
8f4802 ¤   virtual¤SInt32¤ ¤   CompareKeys(const BTreeKey *searchKey,
6e1cc0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const BTreeKey *trialKey);
e1af5a
c70fb9 private:
8eaf5a
e4f0fa ¤   short¤  ¤   ¤   ¤   mVRefNum;
3482f7 };
b5af5a
13af5a
99af5a
--8f27 00007792e1140120221 Page 1 of MacBasics.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
8d1a7a ¤   $Id: MacBasics.h,v 1.8.18.1 1998/11/12 03:19:25 heller Exp $
e2f7f7 ____________________________________________________________________________*/
557b7d #pragma once
18af5a
41f892 #define PGP_MACINTOSH¤  1
48af5a
8ec5d5 #include "pgpBase.h"
3aaf5a
cb99c6 PGP_BEGIN_C_DECLARATIONS
7daf5a
e6af5a
a4af5a
d29966 #ifdef __MWERKS__¤  /* [ */
4aaf5a
177465 ¤   /* used around #pragma mark xyz */
630d23 ¤   #define PRAGMA_MARK_SUPPORTED¤  1
2d67c5 ¤
723167 #endif¤ /* ] */
10af5a
d5af5a
86af5a
b8af5a
db0335 /*____________________________________________________________________________
f1a333 ¤   utility macros·
6af7f7 ____________________________________________________________________________*/
b137a3 #define IsntErr( e )¤   ( (e) == noErr )
e2d0c3 #define IsErr( e )¤ ¤   ( (e) != noErr )
61af5a
dfaf5a
b1af5a
78af5a
a1c6f8 #if ! powerc¤   /* [ */
02af5a
504a30 #pragma parameter __D0 GetD0
19549c long¤   GetD0( void )¤  ¤   ONEWORDINLINE( 0x4E71 );
33af5a
affb06 #pragma parameter SetD0( __D0 )
d6368b void¤   SetD0( long d0 )¤   ¤   ONEWORDINLINE( 0x4E71 );
16af5a
d7af5a
1c53e8 #pragma parameter __D0 GetD1
5a2ac4 long¤   GetD1( void )¤  ¤   ONEWORDINLINE( 0x2001 );
d4af5a
e5d721 #pragma parameter SetD1( __D0 )
4e708f void¤   SetD1( long d1 )¤   ¤   ONEWORDINLINE( 0x2200 );
c7af5a
18af5a
59738d #pragma parameter __D0 GetA0
afc57a void *¤ GetA0( void )¤  ¤   ONEWORDINLINE( 0x02008 );
feaf5a
926a55 #pragma parameter __D0 GetA1
bc6c92 void *¤ GetA1( void )¤  ¤   ONEWORDINLINE( 0x02009 );
24af5a
2014ed #pragma parameter __D0 GetA4
5e6d66 void *¤ GetA4( void )¤  ¤   ONEWORDINLINE( 0x0200c );
8eaf5a
e70d35 #pragma parameter __D0 GetA5
a4ff16 void *¤ GetA5( void )¤  ¤   ONEWORDINLINE( 0x0200d );
8eaf5a
88af5a
bfd919 #pragma parameter __D0 SetA0( __D0 )
4868e2 void *¤ SetA0( const void * a0 )¤   ¤   ONEWORDINLINE( 0xC188 );
49f53a /* returns old A0 */
a1af5a
aef53e #pragma parameter __D0 SetA1( __D0 )
0782c1 void *¤ SetA1( const void *a0 )¤¤   ONEWORDINLINE( 0xC189 );
--79c2 001f4f58e8640120221 Page 2 of MacBasics.h
d1fe7e /* returns old A1 */
a9af5a
bf3167 #endif¤ /* ] */
79af5a
08af5a
feaf5a
5e1254 PGP_END_C_DECLARATIONS
46af5a
8faf5a
21af5a
f4af5a
--8184 00020fcade140120222 Page 1 of MacCursors.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
8785d0 ¤   $Id: MacCursors.c,v 1.8.18.1 1998/11/12 03:19:26 heller Exp $
80f7f7 ____________________________________________________________________________*/
e4af5a
9e4d37 #include <LowMem.h>
a6af5a
cd6ce9 #include "MacCursors.h"
0e6915 #include "MacResources.h"
0d0d08 #include "pgpMem.h"
1caf5a
d77353 enum
c4bb36 {
cd5dd6 ¤   kCursorListResType ¤¤   ¤   = 'acur',
2f42c4 ¤   kDefaultCursorIntervalTicks¤= 30,
23bb30 ¤   kDefaultCursorInitalTicks¤  = kDefaultCursorIntervalTicks
4482f7 };
bfaf5a
ec3456 typedef struct AnimatedCursorResource
e1bb36 {
b10a94 ¤   UInt16¤ numFrames;
33b687 ¤   short¤  usedFrameCounter;
1267c5 ¤
344a89 ¤   struct
e2c7a1 ¤   {
3228dd ¤   ¤   short ¤ resID;
b3e627 ¤   ¤   short¤  reserved;
f2ec88 ¤   } cursorInfo[1];
19af5a
47f57d } AnimatedCursorResource;
0caf5a
a14b8b typedef struct AnimatedCursorInfo
babb36 {
10fa6c ¤   short¤  resID;
a30a94 ¤   UInt16¤ numFrames;
6babf3 ¤   UInt16¤ currentFrame;
bfae99 ¤   UInt32¤ nextAnimateTicks;
57839e ¤   UInt32¤ intervalTicks;
8acea5 ¤   UInt32¤ initialTicks;
339ac9 ¤   Cursor¤ theCursors[1];
ebaf5a
f6f6ae } AnimatedCursorInfo;
7eaf5a
4faf5a
4baf5a
612473 ¤   static OSStatus
bac386 FetchAnimatedCursor(
3b3b4e ¤   ResID ¤ ¤   ¤   ¤   resID,
3384a0 ¤   AnimatedCursorRef ¤ *cursorRef,
774f80 ¤   Boolean ¤   ¤   ¤   currentResFileOnly)
04bb36 {
950f49 ¤   AnimatedCursorResource¤ **acurRes;
07e692 ¤   AnimatedCursorInfo¤ ¤   **acurInfo;
6ca94f ¤   OSStatus¤   ¤   ¤   ¤   status;
6c67c5 ¤
6c5e7c ¤   pgpAssertAddrValid( cursorRef, AnimatedCursorRef );
7867c5 ¤
9c019e ¤   if( IsNull( cursorRef ) )
5191d2 ¤   ¤   return( paramErr );
3b1b52 ¤   ¤
7cabd5 ¤   acurInfo ¤  = nil;
d56a24 ¤   *cursorRef¤ = nil;
5ce843 ¤   status¤ ¤   = noErr;
4567c5 ¤
b37e10 ¤   if( currentResFileOnly )
e3c7a1 ¤   {
962861 ¤   ¤   acurRes = (AnimatedCursorResource **)
bbfcf8 ¤   ¤   ¤   Get1Resource( kCursorListResType, resID );
af9371 ¤   }
200e24 ¤   else
--4b7a 000ceab768840120222 Page 2 of MacCursors.c
f7c7a1 ¤   {
db2861 ¤   ¤   acurRes = (AnimatedCursorResource **)
82712b ¤   ¤   ¤   GetResource( kCursorListResType, resID );
4b9371 ¤   }
271b52 ¤   ¤
989281 ¤   if( acurRes != nil )
f9c7a1 ¤   {
b8ba30 ¤   ¤   HNoPurge( (Handle) acurRes );
c21b52 ¤   ¤
e42c5e ¤   ¤   acurInfo = (AnimatedCursorInfo **)
6fa945 ¤   ¤   ¤   ¤   NewHandleClear( sizeof( AnimatedCursorInfo ) +
8569ec ¤   ¤   ¤   ¤   ¤   ¤   ( ((**acurRes).numFrames - 1) * sizeof( Cursor ) ) );
b273e7 ¤   ¤   if( acurInfo != nil )
c15b34 ¤   ¤   {
e8b8fe ¤   ¤   ¤   UInt16¤ frameIndex;
03fc5d ¤   ¤   ¤   UInt16¤ numFrames;
5187c7 ¤   ¤   ¤
100f5c ¤   ¤   ¤   (**acurInfo).resID ¤¤   ¤   ¤   = resID;
b4fda3 ¤   ¤   ¤   (**acurInfo).numFrames ¤¤   ¤   = (**acurRes).numFrames;
bf1198 ¤   ¤   ¤   (**acurInfo).intervalTicks ¤¤   = kDefaultCursorIntervalTicks;
27317f ¤   ¤   ¤   (**acurInfo).initialTicks ¤ ¤   = kDefaultCursorInitalTicks;
d3af5a
04b2b0 ¤   ¤   ¤   numFrames = (**acurRes).numFrames;
a9450e ¤   ¤   ¤   for( frameIndex = 0; frameIndex < numFrames; frameIndex++ )
e7f776 ¤   ¤   ¤   {
8bb7df ¤   ¤   ¤   ¤   CursHandle¤ theCursor;
cfe976 ¤   ¤   ¤   ¤   short¤  ¤   resID;
ae2b85 ¤   ¤   ¤   ¤
e2ac7d ¤   ¤   ¤   ¤   resID = (**acurRes).cursorInfo[frameIndex].resID;
412b85 ¤   ¤   ¤   ¤
26fdc3 ¤   ¤   ¤   ¤   if( currentResFileOnly )
4272c3 ¤   ¤   ¤   ¤   {
397c27 ¤   ¤   ¤   ¤   ¤   theCursor = (CursHandle) Get1Resource( 'CURS', resID );
c72613 ¤   ¤   ¤   ¤   }
a9fa07 ¤   ¤   ¤   ¤   else
7a72c3 ¤   ¤   ¤   ¤   {
770dda ¤   ¤   ¤   ¤   ¤   theCursor = (CursHandle) GetResource( 'CURS', resID );
442613 ¤   ¤   ¤   ¤   }
112b85 ¤   ¤   ¤   ¤
40ce50 ¤   ¤   ¤   ¤   if( theCursor != nil )
d972c3 ¤   ¤   ¤   ¤   {
724bbf ¤   ¤   ¤   ¤   ¤   (**acurInfo).theCursors[frameIndex] = **theCursor;
f82613 ¤   ¤   ¤   ¤   }
22fa07 ¤   ¤   ¤   ¤   else
db72c3 ¤   ¤   ¤   ¤   {
bd6dbb ¤   ¤   ¤   ¤   ¤   pgpDebugMsg("FetchAnimatedCursor(): "
a5a93b ¤   ¤   ¤   ¤   ¤   "Failed to get a cursor");
97a6e7 ¤   ¤   ¤   ¤   ¤   status = ForceResError( resNotFound );
cb14c3 ¤   ¤   ¤   ¤   ¤   break;
5b2613 ¤   ¤   ¤   ¤   }
0f2b85 ¤   ¤   ¤   ¤
527132 ¤   ¤   ¤   ¤   ReleaseResource( (Handle) theCursor );
63a3a6 ¤   ¤   ¤   }
8e0fe4 ¤   ¤   }
6b0e1d ¤   ¤   else
765b34 ¤   ¤   {
b37edf ¤   ¤   ¤   status = memFullErr;
7c0fe4 ¤   ¤   }
59af5a
a9312e ¤   ¤   ReleaseResource( (Handle) acurRes );
fc9371 ¤   }
a60e24 ¤   else
7cc7a1 ¤   {
4e9b47 ¤   ¤   pgpDebugMsg("FetchAnimatedCursor(): Cursor list resource not found");
056849 ¤   ¤   status = ForceResError( resNotFound );
689371 ¤   }
2d67c5 ¤
c3c668 ¤   if( status == noErr )
c6c7a1 ¤   {
0bd09e ¤   ¤   *cursorRef = (AnimatedCursorRef) acurInfo;
695e5c ¤   ¤   ResetAnimatedCursor( *cursorRef );
ce9371 ¤   }
--b6ea 000f00d07c440120222 Page 3 of MacCursors.c
060e24 ¤   else
c2c7a1 ¤   {
042881 ¤   ¤   if( IsntNull( acurInfo ) )
63c3fd ¤   ¤   ¤   DisposeHandle( (Handle) acurInfo );
1a9371 ¤   }
a567c5 ¤
9a4afd ¤   return( status );
8befe6 }
aeaf5a
2caf5a
6e85ea ¤   OSStatus
474586 GetAnimatedCursor(short resID, AnimatedCursorRef *cursorRef)
16bb36 {
1b4c9e ¤   return( FetchAnimatedCursor( resID, cursorRef, FALSE ) );
07efe6 }
63af5a
7885ea ¤   OSStatus
311c95 Get1AnimatedCursor(short resID, AnimatedCursorRef *cursorRef)
60bb36 {
ef7250 ¤   return( FetchAnimatedCursor( resID, cursorRef, TRUE ) );
16efe6 }
8eaf5a
8faf5a
5c6d52 ¤   void
960d34 ResetAnimatedCursor(AnimatedCursorRef cursorRef)
ddbb36 {
f7bb6a ¤   AnimatedCursorInfo¤ **cursorInfo = (AnimatedCursorInfo **) cursorRef;
5c67c5 ¤
5784be ¤   AssertHandleIsValid( cursorInfo, "ResetAnimatedCursor" );
a267c5 ¤
e5cf1f ¤   if( cursorInfo != nil )
82c7a1 ¤   {
af6fd8 ¤   ¤   (**cursorInfo).currentFrame¤¤   = 0;
f460f5 ¤   ¤   (**cursorInfo).nextAnimateTicks =
1b57a4 ¤   ¤   ¤   LMGetTicks() + (**cursorInfo).initialTicks;
cc9371 ¤   }
0cefe6 }
8eaf5a
78af5a
fb6d52 ¤   void
5f7626 SetAnimatedCursorDelay(AnimatedCursorRef cursorRef, UInt32 delayTicks)
a0bb36 {
38bb6a ¤   AnimatedCursorInfo¤ **cursorInfo = (AnimatedCursorInfo **) cursorRef;
b767c5 ¤
7b6e5e ¤   AssertHandleIsValid( cursorInfo, "SetAnimatedCursorDelay" );
9367c5 ¤
a0cf1f ¤   if( cursorInfo != nil )
9fc7a1 ¤   {
25f138 ¤   ¤   (**cursorInfo).intervalTicks¤   = delayTicks;
4472e0 ¤   ¤   (**cursorInfo).nextAnimateTicks = LMGetTicks() + delayTicks;
b19371 ¤   }
6aefe6 }
18af5a
1caf5a
a56d52 ¤   void
2e8e30 SetAnimatedCursorInitialDelay(
ba6320 ¤   AnimatedCursorRef¤  cursorRef,
13978b ¤   UInt32¤ ¤   ¤   ¤   initialTicks)
e5bb36 {
5ebb6a ¤   AnimatedCursorInfo¤ **cursorInfo = (AnimatedCursorInfo **) cursorRef;
7b67c5 ¤
946e5e ¤   AssertHandleIsValid( cursorInfo, "SetAnimatedCursorDelay" );
5967c5 ¤
81cf1f ¤   if( cursorInfo != nil )
3dc7a1 ¤   {
976d8b ¤   ¤   (**cursorInfo).initialTicks¤= initialTicks;
99d09e ¤   ¤   ResetAnimatedCursor( cursorRef );
109371 ¤   }
96efe6 }
53af5a
37af5a
f07e69 ¤   Boolean
--e0e1 00130442a9e40120222 Page 4 of MacCursors.c
ac4246 AnimateCursor(AnimatedCursorRef cursorRef)
69bb36 {
faa043 ¤   AnimatedCursorInfo¤ **cursorInfo ¤  = (AnimatedCursorInfo **) cursorRef;
04c559 ¤   Boolean¤¤   ¤   ¤   didAnimate¤ ¤   = FALSE;
dd67c5 ¤
afd6fc ¤   AssertHandleIsValid( cursorInfo, "AnimateCursor" );
3b67c5 ¤
9c82aa ¤   if( IsntNull( cursorInfo ) )
5bc7a1 ¤   {
a05e30 ¤   ¤   UInt32 curTicks;
8b1b52 ¤   ¤
3558be ¤   ¤   curTicks = LMGetTicks();
4a1b52 ¤   ¤
3cc976 ¤   ¤   if( curTicks >= (**cursorInfo).nextAnimateTicks )
bc5b34 ¤   ¤   {
f33db5 ¤   ¤   ¤   UInt16¤ curFrame;
aaaf5a
ab5261 ¤   ¤   ¤   curFrame = (**cursorInfo).currentFrame;
98a256 ¤   ¤   ¤   (**cursorInfo).currentFrame += 1;
2787c7 ¤   ¤   ¤
dd03c7 ¤   ¤   ¤   if( (**cursorInfo).currentFrame >= (**cursorInfo).numFrames )
f0f776 ¤   ¤   ¤   {
e4a959 ¤   ¤   ¤   ¤   (**cursorInfo).currentFrame = 0;
4ca3a6 ¤   ¤   ¤   }
441b52 ¤   ¤
86cf0f ¤   ¤   ¤   SetCursor( &(**cursorInfo).theCursors[curFrame] );
306b91 ¤   ¤   ¤   didAnimate = TRUE;
8587c7 ¤   ¤   ¤
e15930 ¤   ¤   ¤   (**cursorInfo).nextAnimateTicks =
9b3c17 ¤   ¤   ¤   ¤   curTicks + (**cursorInfo).intervalTicks;
c90fe4 ¤   ¤   }
e19371 ¤   }
b867c5 ¤
9b5830 ¤   return( didAnimate );
20efe6 }
f3af5a
03af5a
626d52 ¤   void
6fd245 DisposeAnimatedCursor(AnimatedCursorRef cursorRef)
e2bb36 {
f5e00b ¤   AssertHandleIsValid( cursorRef, "DisposeAnimatedCursor" );
db67c5 ¤
6e1258 ¤   if( IsntNull( cursorRef ) )
017b60 ¤   ¤   DisposeHandle( (Handle) cursorRef );
30efe6 }
--a24c 001bc65e47e40120223 Page 1 of MacCursors.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
273843 ¤   $Id: MacCursors.h,v 1.8.16.1 1998/11/12 03:19:26 heller Exp $
09f7f7 ____________________________________________________________________________*/
d6af5a
307b7d #pragma once
56af5a
2b0438 #include "MacBasics.h"
64af5a
af4f59 typedef struct OpaqueAnimatedCursorRef¤ *AnimatedCursorRef;
7baf5a
ca99c6 PGP_BEGIN_C_DECLARATIONS
c03ffd #if PRAGMA_IMPORT
34b981 #pragma import on
5c7454 #endif
36af5a
a4af5a
86af5a
ad15e0 OSStatus¤   GetAnimatedCursor(ResID resID, AnimatedCursorRef *cursorRef);
831dfc OSStatus¤   Get1AnimatedCursor(short resID, AnimatedCursorRef *cursorRef);
019ef1 void¤   ¤   DisposeAnimatedCursor(AnimatedCursorRef cursorRef);
ebaf5a
67fdac Boolean¤¤   AnimateCursor(AnimatedCursorRef cursorRef);
2ee596 void¤   ¤   ResetAnimatedCursor(AnimatedCursorRef cursorRef);
fcaf5a
5e3584 void¤   ¤   SetAnimatedCursorDelay(AnimatedCursorRef cursorRef,
21719c ¤   ¤   ¤   ¤   UInt32 delayTicks);
9318f8 void¤   ¤   SetAnimatedCursorInitialDelay(AnimatedCursorRef cursorRef,
47d9eb ¤   ¤   ¤   ¤   UInt32 initialTicks);
64af5a
b2af5a
cdaf5a
603ffd #if PRAGMA_IMPORT
0b2ced #pragma import reset
4e7454 #endif
bc1254 PGP_END_C_DECLARATIONS
--b94f 00030d99e1740120224 Page 1 of MacDesktop.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
f428b1 ¤   $Id: MacDesktop.c,v 1.7.18.1 1998/11/12 03:19:27 heller Exp $
02f7f7 ____________________________________________________________________________*/
a8af5a
d8b2bf #include <Errors.h>
efaf5a
ed8c8c #include "MacDesktop.h"
88bbf4 #include "MacFiles.h"
6e74e2 #include "MacProcesses.h"
d30d08 #include "pgpMem.h"
00af5a
8b5731 /* applicationType is usually 'APPL',
f8a475 but could be different. Use '****' to wildcard*/
3d7e69 ¤   Boolean
eee8b3 FindApplicationOnVolume(
cfb08a ¤   short ¤ vRefNum,
cc83f2 ¤   OSType ¤applicationType,¤
48aaaa ¤   OSType ¤applicationCreator,
a6c900 ¤   FSSpec ¤*appSpec)
83bb36 {
8d08fa ¤   DTPBRec¤¤   dtpb;
14323e ¤   OSStatus¤   status = noErr;
d3590e ¤   Str255¤ ¤   name;
3167c5 ¤
b35d33 ¤   /* Note: If multiple copies are present,
0b53d7 ¤   this function will return the application
df7a6c ¤   ¤   ·with the latest creation date. */
fc67c5 ¤
26e22c ¤   pgpAssertAddrValid( appSpec, FSSpec );
dd67c5 ¤
1572e0 ¤   pgpClearMemory( &dtpb, sizeof( dtpb ) );
9f67c5 ¤
1d8bad ¤   name[0] = 0;
1767c5 ¤
4c9dff ¤   dtpb.ioNamePtr¤ = name;
87ebda ¤   dtpb.ioVRefNum¤ = vRefNum;
b167c5 ¤
3fb48d ¤   status = PBDTGetPath( &dtpb );
02dd30 ¤   if( IsntErr( status ) )
64c7a1 ¤   {
3cdad3 ¤   ¤   short¤  dtRefNum;
64aac1 ¤   ¤   UInt32¤ bestCreationDate = 0;
cbb092 ¤   ¤   FSSpec¤ bestAppSpec;
c928db ¤   ¤   UInt32¤ dtIndex;
361b52 ¤   ¤
3824c0 ¤   ¤   dtRefNum ¤  ¤   ¤   = dtpb.ioDTRefNum;
26c405 ¤   ¤   dtIndex¤¤   ¤   ¤   = 1;
6c5ef5 ¤   ¤   bestCreationDate ¤  = 0;
1a1b52 ¤   ¤
00434b ¤   ¤   while( TRUE )
e65b34 ¤   ¤   {
472ea9 ¤   ¤   ¤   dtpb.ioCompletion¤  = nil;
b5da9c ¤   ¤   ¤   dtpb.ioNamePtr¤ ¤   = name;
29ad0f ¤   ¤   ¤   dtpb.ioDTRefNum¤¤   = dtRefNum;
f8cf5d ¤   ¤   ¤   dtpb.ioIndex¤   ¤   = dtIndex;
61cb4a ¤   ¤   ¤   dtpb.ioFileCreator¤ = applicationCreator;
5587c7 ¤   ¤   ¤
2625fd ¤   ¤   ¤   if( IsErr( PBDTGetAPPLSync( &dtpb ) ) )
f9f622 ¤   ¤   ¤   ¤   break;
a12b85 ¤   ¤   ¤   ¤
2d0254 ¤   ¤   ¤   if( dtpb.ioTagInfo > bestCreationDate )
caf776 ¤   ¤   ¤   {
1611d2 ¤   ¤   ¤   ¤   FSSpec¤ checkSpec;
832b85 ¤   ¤   ¤   ¤
1ea627 ¤   ¤   ¤   ¤   /* check that the file truly exists and is the correct type */
d2b5c3 ¤   ¤   ¤   ¤   if( IsntErr( FSMakeFSSpec( vRefNum,
302857 ¤   ¤   ¤   ¤   ¤   ¤   ¤   dtpb.ioAPPLParID, name, &checkSpec ) ) )
--4b43 00011fe250140120224 Page 2 of MacDesktop.c
d072c3 ¤   ¤   ¤   ¤   {
444c95 ¤   ¤   ¤   ¤   ¤   CInfoPBRec¤ cpb;
e5ae30 ¤   ¤   ¤   ¤   ¤
6eb568 ¤   ¤   ¤   ¤   ¤   if( IsntErr( FSpGetCatInfo( &checkSpec, &cpb ) ) )
274859 ¤   ¤   ¤   ¤   ¤   {
baab39 ¤   ¤   ¤   ¤   ¤   ¤   if( cpbIsFile( &cpb ) &&
42d9e7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   cpbFileCreator( &cpb ) == applicationCreator &&
e46d3b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ( cpbFileType( &cpb ) == applicationType ||
e06cca ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   applicationType == '****' ) )
c48fec ¤   ¤   ¤   ¤   ¤   ¤   {
2550ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   bestCreationDate ¤  = dtpb.ioTagInfo;
f13928 ¤   ¤   ¤   ¤   ¤   ¤   ¤   bestAppSpec¤¤   ¤   = checkSpec;
00db3c ¤   ¤   ¤   ¤   ¤   ¤   }
7f1c89 ¤   ¤   ¤   ¤   ¤   }
692613 ¤   ¤   ¤   ¤   }
68a3a6 ¤   ¤   ¤   }
e42b85 ¤   ¤   ¤   ¤
f9e1f8 ¤   ¤   ¤   ++dtIndex;
620fe4 ¤   ¤   }
c61b52 ¤   ¤
126cd1 ¤   ¤   if( bestCreationDate != 0 )
955b34 ¤   ¤   {
dd9728 ¤   ¤   ¤   *appSpec ¤  = bestAppSpec;
9c6748 ¤   ¤   ¤   status¤ ¤   = noErr;
f60fe4 ¤   ¤   }
ca0e1d ¤   ¤   else
d55b34 ¤   ¤   {
7a1795 ¤   ¤   ¤   status = fnfErr;
660fe4 ¤   ¤   }
419371 ¤   }
ae67c5 ¤
e103ae ¤   return( IsntErr( status ) );
d5efe6 }
baaf5a
5ecd8d ¤   static Boolean
96eb25 RealFindApplication(
a08e89 ¤   OSType ¤applicationType,
fbaaaa ¤   OSType ¤applicationCreator,
89c81f ¤   Boolean¤doLocalVolumes,
32c900 ¤   FSSpec ¤*appSpec)
e0bb36 {
82cf26 ¤   Boolean¤¤   ¤   foundApp;
229816 ¤   HParamBlockRec¤ pb;
1452a8 ¤   short¤  ¤   ¤   volIndex;
11e0aa ¤   Str255¤ ¤   ¤   volumeName;
7779f7 ¤   OSStatus¤   ¤   err¤= noErr;
dc67c5 ¤
20de75 ¤   pgpClearMemory( &pb, sizeof( pb ) );
2267c5 ¤
84558f ¤   volIndex = 1;
f07efa ¤   foundApp = FALSE;
aa67c5 ¤
b979d1 ¤   while( TRUE )
ecc7a1 ¤   {
cf9f66 ¤   ¤   pb.volumeParam.ioNamePtr¤   = volumeName;
5dbb91 ¤   ¤   pb.volumeParam.ioVolIndex¤  = volIndex;
af383e ¤   ¤   ·
9161ba ¤   ¤   if( IsntErr( PBHGetVInfoSync( &pb ) ) )
c95b34 ¤   ¤   {
3e8b97 ¤   ¤   ¤   Boolean¤isRemote;
61af5a
875b7c ¤   ¤   ¤   err¤= VolumeIsRemote( pb.volumeParam.ioVRefNum, &isRemote );
b66108 ¤   ¤   ¤   if( IsntErr( err ) )
78f776 ¤   ¤   ¤   {
614146 ¤   ¤   ¤   ¤   if( ( isRemote && ! doLocalVolumes ) ||
ebc7fa ¤   ¤   ¤   ¤   ¤   ( doLocalVolumes && ! isRemote ) )
df72c3 ¤   ¤   ¤   ¤   {
afc417 ¤   ¤   ¤   ¤   ¤   foundApp = FindApplicationOnVolume(
6308fb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pb.volumeParam.ioVRefNum,
948673 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   applicationType, applicationCreator,
a5c057 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   appSpec );
1118cf ¤   ¤   ¤   ¤   ¤   if( foundApp )
--9dad 0002a4aeac140120224 Page 3 of MacDesktop.c
e04859 ¤   ¤   ¤   ¤   ¤   {
cf00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
321c89 ¤   ¤   ¤   ¤   ¤   }
e62613 ¤   ¤   ¤   ¤   }
03a3a6 ¤   ¤   ¤   }
420fe4 ¤   ¤   }
f00e1d ¤   ¤   else
7f5b34 ¤   ¤   {
a8c5c1 ¤   ¤   ¤   /* No more volumes */
ffcdcb ¤   ¤   ¤   break;
7a0fe4 ¤   ¤   }
931b52 ¤   ¤
43dbcb ¤   ¤   ++volIndex;
4a9371 ¤   }
f067c5 ¤
6fb309 ¤   return( foundApp );
64efe6 }
e8af5a
437e69 ¤   Boolean
7e07dd FindApplication(
e856f3 ¤   OSType ¤¤   ¤   ¤   applicationType,¤   /* **** wildcards */
26331d ¤   OSType ¤¤   ¤   ¤   applicationCreator,
d1c6c5 ¤   FindAppSearchType¤  searchType,
4cddf9 ¤   FSSpec ¤¤   ¤   ¤   *appSpec)
11bb36 {
6e18fb ¤   Boolean¤¤   foundApp = FALSE;
99af5a
71e21d ¤   /* Always try local volumes first. */
d54c47 ¤   if( searchType == kFindAppOnLocalVolumes ||
439706 ¤   ¤   searchType == kFindAppOnAllVolumes )
58c7a1 ¤   {
12a2d7 ¤   ¤   foundApp = RealFindApplication( applicationType,
6cbb75 ¤   ¤   ¤   applicationCreator, TRUE, appSpec );
6e9371 ¤   }
8b67c5 ¤
440f86 ¤   if( ! foundApp )
a6c7a1 ¤   {
541f93 ¤   ¤   if( searchType == kFindAppOnRemoteVolumes ||
f19680 ¤   ¤   ¤   ¤   searchType == kFindAppOnAllVolumes )
215b34 ¤   ¤   {
788462 ¤   ¤   ¤   foundApp = RealFindApplication( applicationType,
92370f ¤   ¤   ¤   ¤   applicationCreator, FALSE, appSpec );
380fe4 ¤   ¤   }
f69371 ¤   }
5367c5 ¤
a4b309 ¤   return( foundApp );
89efe6 }
abaf5a
daaf5a
1a85ea ¤   OSStatus
d185d8 BringAppToFront(
828b2a ¤   OSType¤ ¤   ¤   ¤   type,
3c34a1 ¤   OSType¤ ¤   ¤   ¤   creator,
bac6c5 ¤   FindAppSearchType¤  searchType,
a56bdc ¤   Boolean¤¤   ¤   ¤   launch,
d6ca2d ¤   AppParametersPtr¤   params,
1c9e47 ¤   Boolean¤¤   ¤   ¤   *wasLaunched)
f7bb36 {
4dec9a ¤   ProcessSerialNumber¤psn;
7df7fe ¤   OSStatus¤   ¤   ¤   err = fnfErr;
c4af5a
34b1ee ¤   if ( wasLaunched != nil )
95c7a1 ¤   {
a62167 ¤   ¤   *wasLaunched = false;
779371 ¤   }
7394d1 ¤   if( FindProcess(type, creator, &psn, nil, nil, nil ))
6ec7a1 ¤   {
446f29 ¤   ¤   err = SetFrontProcess( &psn );
059371 ¤   }
824b22 ¤   else if ( launch )
49c7a1 ¤   {
2a0f68 ¤   ¤   FSSpec¤ appSpec;
--37ed 0015de4cdfe40120224 Page 4 of MacDesktop.c
f11b52 ¤   ¤
b3e457 ¤   ¤   if( FindApplication(type, creator, searchType, &appSpec) )
4d5b34 ¤   ¤   {
3b6e3f ¤   ¤   ¤   LaunchParamBlockRec¤launchParams = {¤   0,
470320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
2e1fb2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   extendedBlock,
dc9392 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   extendedBlockLen,
800320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
9871c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   launchContinue | launchNoFileFlags,
f00320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
740320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
660320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
4d0320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
dc0320 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
331500 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil };
c1ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
7cdcba ¤   ¤   ¤   launchParams.launchAppSpec = &appSpec;
581c77 ¤   ¤   ¤   launchParams.launchAppParameters = params;
5387c7 ¤   ¤   ¤
d7af4f ¤   ¤   ¤   err = LaunchApplication(&launchParams);
306fe3 ¤   ¤   ¤   if( (wasLaunched != nil) && (err == noErr) )
03f776 ¤   ¤   ¤   {
1e001d ¤   ¤   ¤   ¤   *wasLaunched = true;
59a3a6 ¤   ¤   ¤   }
b60fe4 ¤   ¤   }
6c9371 ¤   }
e367c5 ¤
805ea8 ¤   return err;
5dbe43 }¶
--a450 001f7ff35da40120225 Page 1 of MacDesktop.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
5961db ¤   $Id: MacDesktop.h,v 1.9.16.1 1998/11/12 03:19:28 heller Exp $
b9f7f7 ____________________________________________________________________________*/
9faf5a
347b7d #pragma once
ecaf5a
49e0ab #include <Processes.h>
82af5a
d237bc typedef enum FindAppSearchType
f3bb36 {
452a5a ¤   kFindAppOnLocalVolumes¤ = 1,
a50dec ¤   kFindAppOnRemoteVolumes,
f9d745 ¤   kFindAppOnAllVolumes
6c67c5 ¤
336012 } FindAppSearchType;
f2af5a
a1af5a
7299c6 PGP_BEGIN_C_DECLARATIONS
653ffd #if PRAGMA_IMPORT
39b981 #pragma import on
db7454 #endif
38af5a
d8af5a
4818b3 Boolean¤¤   FindApplicationOnVolume(short vRefNum, OSType applicationType,
ecace7 ¤   ¤   ¤   ¤   ¤   ¤   OSType applicationCreator, FSSpec *appSpec);
787e74 Boolean¤¤   FindApplication(OSType applicationType, OSType applicationCreator,
9ae6fc ¤   ¤   ¤   ¤   ¤   ¤   FindAppSearchType searchType, FSSpec *appSpec);
9594aa ¤   ¤   ¤   ¤   ¤   ¤
c6abd8 OSStatus¤   BringAppToFront(OSType type, OSType creator,
4ed069 ¤   ¤   ¤   ¤   ¤   ¤   FindAppSearchType searchType, Boolean launch,
2367a3 ¤   ¤   ¤   ¤   ¤   ¤   AppParametersPtr params, Boolean * wasLaunched);
d8af5a
cdaf5a
533ffd #if PRAGMA_IMPORT
9f2ced #pragma import reset
3b7454 #endif
9d1254 PGP_END_C_DECLARATIONS
f7af5a
--98b3 000eac3b76840120226 Page 1 of MacDialogs.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
6f598f ¤   $Id: MacDialogs.c,v 1.9.12.1 1998/11/12 03:19:28 heller Exp $
e2f7f7 ____________________________________________________________________________*/
aa0d08 #include "pgpMem.h"
1aaf5a
e65286 #include "MacDialogs.h"
feaf5a
10231f #define AssertDialogRefIsValid(theDialog)¤  \
21558b ¤   pgpAssertAddrValid( (theDialog), DialogRecord )
35af5a
f8e5dc #define¤RectWidth(x)¤   ((UInt16) ((x)->right - (x)->left))
0ee94e #define¤RectHeight(x)¤  ((UInt16) ((x)->bottom - (x)->top))
09af5a
ee878e PGPUInt32¤  gPGPDisableCreateRootControlCount = 0;
4faf5a
0a6d52 ¤   void
77b8de SetUserItemProc(DialogRef theDialog, short theItem, UserItemUPP theProc)
febb36 {
1fc480 ¤   short¤  itemType;
32a218 ¤   Handle¤ itemData;
ede8b7 ¤   Rect¤   itemRect;
b167c5 ¤
f1a86e ¤   AssertDialogRefIsValid( theDialog );
508200 ¤   AssertUPPIsNullOrValid( theProc, nil );
35af5a
a49149 ¤   GetDialogItem( theDialog, theItem, &itemType, &itemData, &itemRect );
3eb5e4 ¤   pgpAssertMsg( (itemType & ~itemDisable) == userItem,
3e4ad7 ¤   ¤   "SetUserItemProc(): Not a user item" );
e20e39 ¤   SetDialogItem( theDialog, theItem, itemType, (Handle) theProc, &itemRect );
0eefe6 }
29af5a
cdaf5a
046692 ¤   Handle
20c91a GetIndDialogItem(DialogRef theDialog, short theItem)
b7bb36 {
41c480 ¤   short¤  itemType;
a2a218 ¤   Handle¤ itemData;
33e8b7 ¤   Rect¤   itemRect;
4167c5 ¤
aba86e ¤   AssertDialogRefIsValid( theDialog );
cfaf5a
999699 ¤   itemData = nil;
634f45 ¤   GetDialogItem(theDialog, theItem, &itemType, &itemData, &itemRect);
de67c5 ¤
7e8e2e ¤   return ( itemData );
8aefe6 }
c7af5a
eeaf5a
a46d52 ¤   void
eeba31 GetDialogItemRect(DialogRef theDialog, short theItem, Rect *itemRect)
54bb36 {
f4a218 ¤   Handle¤ itemData;
73c480 ¤   short¤  itemType;
5967c5 ¤
14a86e ¤   AssertDialogRefIsValid( theDialog );
d9575b ¤   pgpAssertAddrValid( itemRect, Rect );
0daf5a
0a1c7d ¤   pgpAssertMsg( theItem > 0 && theItem <= CountDITL( theDialog ),
f9f003 ¤   ¤   "GetDialogItemRect(): Invalid item");
c967c5 ¤
711c8e ¤   GetDialogItem( theDialog, theItem, &itemType, &itemData, itemRect );
40efe6 }
33af5a
53af5a
926d52 ¤   void
9c362c SetDialogItemRect(DialogRef theDialog, short theItem, const Rect *newItemRect)
eabb36 {
--db4e 000186603e940120226 Page 2 of MacDialogs.c
43a218 ¤   Handle¤ itemData;
5fc480 ¤   short¤  itemType;
994855 ¤   Rect¤   oldItemRect;
f45f3c ¤   GrafPtr¤savePort;
b767c5 ¤
92a86e ¤   AssertDialogRefIsValid( theDialog );
350849 ¤   pgpAssertAddrValid( newItemRect, Rect );
03af5a
b0f732 ¤   GetPort( &savePort );
00f895 ¤   SetGrafPortOfDialog( theDialog );
8567c5 ¤
37d19a ¤   GetDialogItem( theDialog, theItem, &itemType, &itemData, &oldItemRect );
3b67c5 ¤
c24adf ¤   if( ! EqualRect( &oldItemRect, newItemRect ) )
dac7a1 ¤   {
fdd75c ¤   ¤   InvalRect( &oldItemRect );
02348a ¤   ¤   ¤   SetDialogItem( theDialog, theItem,
e47ff8 ¤   ¤   ¤   ¤   itemType, itemData, newItemRect );
58fabb ¤   ¤   InvalRect( newItemRect );¤
b29371 ¤   }
0a67c5 ¤
f40eb5 ¤   if( ( itemType & ctrlItem ) != 0 )·
28c7a1 ¤   {
707e6b ¤   ¤   ControlHandle¤  theControl = (ControlHandle) itemData;
641b52 ¤   ¤
9291ac ¤   ¤   MoveControl( theControl, newItemRect->left, newItemRect->top );
208860 ¤   ¤   SizeControl( theControl,
f3769e ¤   ¤   ¤   RectWidth( newItemRect ), RectHeight( newItemRect ) );
879371 ¤   }
3267c5 ¤
1a6d1e ¤   SetPort( savePort );
d8efe6 }
9faf5a
3caf5a
1588f9 ¤   short
609b30 GetDialogItemType(DialogRef theDialog, short theItem)
79bb36 {
b8a218 ¤   Handle¤ itemData;
9fc480 ¤   short¤  itemType;
dce8b7 ¤   Rect¤   itemRect;
1767c5 ¤
b8a86e ¤   AssertDialogRefIsValid( theDialog );
911c7d ¤   pgpAssertMsg( theItem > 0 && theItem <= CountDITL( theDialog ),
37c98b ¤   ¤   "GetDialogItemType(): Invalid item");
ee67c5 ¤
e49149 ¤   GetDialogItem( theDialog, theItem, &itemType, &itemData, &itemRect );
ed67c5 ¤
1df6e9 ¤   return( itemType & ~itemDisable );
efefe6 }
f5af5a
b8af5a
e06d52 ¤   void
eb6c7d OffsetDialogItem(
ae3e25 ¤   DialogRef¤  theDialog,
b59c7a ¤   short¤  ¤   theItem,
3a30ef ¤   short¤  ¤   hOffset,
d26a16 ¤   short¤  ¤   vOffset)
39bb36 {
ebe8b7 ¤   Rect¤   itemRect;
7167c5 ¤
93a86e ¤   AssertDialogRefIsValid( theDialog );
19af5a
4fe520 ¤   GetDialogItemRect( theDialog, theItem, &itemRect );
01a9b6 ¤   MoveDialogItem( theDialog, theItem,
978ecc ¤   ¤   itemRect.left + hOffset, itemRect.top + vOffset );
cdefe6 }
8daf5a
43af5a
c66d52 ¤   void
5180d4 InvalDialogItem(DialogRef theDialog, short theItem, short inset)
6dbb36 {
185f3c ¤   GrafPtr¤savePort;
--7b68 000ff1f088140120226 Page 3 of MacDialogs.c
84e8b7 ¤   Rect¤   itemRect;
d367c5 ¤
5da86e ¤   AssertDialogRefIsValid( theDialog );
60af5a
b4f732 ¤   GetPort( &savePort );
98f895 ¤   SetGrafPortOfDialog( theDialog );
a567c5 ¤
7ae520 ¤   GetDialogItemRect( theDialog, theItem, &itemRect );
8f629c ¤   InsetRect( &itemRect, inset, inset );
d8e391 ¤   InvalRect( &itemRect );
7367c5 ¤
506d1e ¤   SetPort( savePort );
28efe6 }
47af5a
9faf5a
5c6d52 ¤   void
89042f EraseDialogItem(DialogRef theDialog, short theItem, short inset)
55bb36 {
545f3c ¤   GrafPtr¤savePort;
b2e8b7 ¤   Rect¤   itemRect;
d967c5 ¤
f6a86e ¤   AssertDialogRefIsValid( theDialog );
c0af5a
61f732 ¤   GetPort( &savePort );
99f895 ¤   SetGrafPortOfDialog( theDialog );
ab67c5 ¤
ace520 ¤   GetDialogItemRect( theDialog, theItem, &itemRect );
03629c ¤   InsetRect( &itemRect, inset, inset );
e95ff1 ¤   EraseRect( &itemRect );
1967c5 ¤
576d1e ¤   SetPort( savePort );
e9efe6 }
48af5a
0eaf5a
266d52 ¤   void
9a56f2 ShowHideDialogItem(DialogRef theDialog, short theItem, Boolean show)
c4bb36 {
29a86e ¤   AssertDialogRefIsValid( theDialog );
f9af5a
2c0dbb ¤   if( show )
9bc7a1 ¤   {
1f0943 ¤   ¤   ShowDialogItem( theDialog, theItem );
c39371 ¤   }
bc0e24 ¤   else
30c7a1 ¤   {
deb965 ¤   ¤   HideDialogItem( theDialog, theItem );
3b9371 ¤   }
84efe6 }
eaaf5a
c3af5a
fb6ab9 ¤   ControlHandle
fc84ed GetDialogControlItem(DialogRef theDialog, short theItem)
98bb36 {
21c480 ¤   short¤  itemType;
0c3a4d ¤   Handle¤ controlHandle = nil;
c9e8b7 ¤   Rect¤   itemRect;
8967c5 ¤
42a86e ¤   AssertDialogRefIsValid( theDialog );
c3af5a
c14273 ¤   GetDialogItem(theDialog, theItem, &itemType, &controlHandle, &itemRect);
21f8a0 ¤   if( (itemType & ctrlItem) == 0 )
49c7a1 ¤   {
a68e47 ¤   ¤   pgpDebugMsg( "GetDialogControlItem(): item not a control");
4a461e ¤   ¤   controlHandle = nil;
6f9371 ¤   }
250e24 ¤   else
41c7a1 ¤   {
9a6677 ¤   ¤   AssertHandleIsValid( controlHandle, nil );
1d9371 ¤   }
9067c5 ¤
b8b564 ¤   return ( (ControlHandle) controlHandle );
ffefe6 }
--7ccf 000983efa9740120226 Page 4 of MacDialogs.c
e0af5a
1aaf5a
a788f9 ¤   short
8d0e89 GetDialogControlValue(DialogRef theDialog, short theItem)
adbb36 {
4083c1 ¤   return( GetControlValue( GetDialogControlItem( theDialog, theItem ) ) );
d6efe6 }
59af5a
42af5a
c26d52 ¤   void
278e56 SetDialogControlValue(DialogRef theDialog, short theItem, short value)
f2bb36 {
11b133 ¤   SetControlValue( GetDialogControlItem( theDialog, theItem ), value );
00efe6 }
1eaf5a
d6af5a
897e69 ¤   Boolean
1b8074 ToggleDialogCheckbox(DialogRef theDialog, short theItem)
92bb36 {
b66dd7 ¤   short¤  newValue;
2a67c5 ¤
909c8d ¤   newValue = ( GetDialogControlValue( theDialog, theItem ) == 0 ? 1 : 0 );
3364b1 ¤   SetDialogControlValue( theDialog, theItem, newValue );
c767c5 ¤
65a11a ¤   return( newValue == 1 );
94efe6 }
ddaf5a
9faf5a
8d6d52 ¤   void
98907a GetIndDialogItemText(DialogRef theDialog, short theItem, uchar *itemText)
54bb36 {
7c9b2c ¤   Handle¤ itemHandle;
54c480 ¤   short¤  itemType;
28e8b7 ¤   Rect¤   itemRect;
f567c5 ¤
37a86e ¤   AssertDialogRefIsValid( theDialog );
e4a4f8 ¤   pgpAssertAddrValid( itemText, uchar );
f2af5a
faa288 ¤   GetDialogItem( theDialog, theItem, &itemType, &itemHandle, &itemRect );
1c67c5 ¤
96ab8a ¤   if( ( itemType & ctrlItem ) != 0 )
0dc7a1 ¤   {
cef1ba ¤   ¤   GetControlTitle( (ControlHandle) itemHandle, itemText );
b09371 ¤   }
ba3016 ¤   else if( ( itemType & ( statText | editText ) ) != 0 )
b5c7a1 ¤   {
7ad4cb ¤   ¤   GetDialogItemText( itemHandle, itemText );
439371 ¤   }
a10e24 ¤   else
f3c7a1 ¤   {
3078f2 ¤   ¤   pgpDebugMsg("GetIndDialogItemText(): Item type has no text" );
1bf828 ¤   }¤
e7efe6 }
77af5a
0caf5a
636d52 ¤   void
13d634 SetIndDialogItemText(
7b135e ¤   DialogRef theDialog,
8e3c80 ¤   short theItem, const uchar *itemText)
dbbb36 {
de9b2c ¤   Handle¤ itemHandle;
48c480 ¤   short¤  itemType;
d3e8b7 ¤   Rect¤   itemRect;
7667c5 ¤
5aa86e ¤   AssertDialogRefIsValid( theDialog );
0ca4f8 ¤   pgpAssertAddrValid( itemText, uchar );
37af5a
e0a288 ¤   GetDialogItem( theDialog, theItem, &itemType, &itemHandle, &itemRect );
d367c5 ¤
25ab8a ¤   if( ( itemType & ctrlItem ) != 0 )
5ec7a1 ¤   {
988b3c ¤   ¤   SetControlTitle( (ControlHandle) itemHandle, itemText );
--59c9 0017d48da6640120226 Page 5 of MacDialogs.c
a19371 ¤   }
2a3016 ¤   else if( ( itemType & ( statText | editText ) ) != 0 )
51c7a1 ¤   {
aeafec ¤   ¤   SetDialogItemText( itemHandle, itemText );
4a9371 ¤   }
170e24 ¤   else
dcc7a1 ¤   {
2e344d ¤   ¤   pgpDebugMsg("SetIndDialogItemText(): Item type has no text" );
1df828 ¤   }¤
52efe6 }
5daf5a
4f38e5 /*
9acda5 **¤ Keep! We may have #defined CreateRootControl to be
1b1438 ** ¤PGPCreateRootControl
607fe0 */
08af5a
c7785a #undef CreateRootControl
d6af5a
06eacd ¤   OSErr
7b6a2c PGPCreateRootControl(
95fea6 ¤   WindowPtr ¤ ¤   inWindow,
f11636 ¤   ControlHandle ¤ *outControl)
13bb36 {
b89c1a ¤   OSErr¤  err = noErr;
5267c5 ¤
2490b0 ¤   if( gPGPDisableCreateRootControlCount == 0 )
7dc7a1 ¤   {
b4c8ee ¤   ¤   err = CreateRootControl( inWindow, outControl );
f49371 ¤   }
730e24 ¤   else
dac7a1 ¤   {
eddf3b ¤   ¤   *outControl = NULL;
a69371 ¤   }
eeaf5a
41deb7 ¤   return( err );
7dbe43 }¶
--bda5 0019e2089ed40120227 Page 1 of MacDialogs.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
1ed36a ¤   $Id: MacDialogs.h,v 1.9.12.1 1998/11/12 03:19:29 heller Exp $
06f7f7 ____________________________________________________________________________*/
767b7d #pragma once
06af5a
eec20d #include <Dialogs.h>
c8af5a
0699c6 PGP_BEGIN_C_DECLARATIONS
0f3ffd #if PRAGMA_IMPORT
24b981 #pragma import on
cf7454 #endif
b8af5a
e1e9b5 extern PGPUInt32¤   gPGPDisableCreateRootControlCount;
3daf5a
b7c23b Handle¤ ¤   ¤   GetIndDialogItem(DialogRef dlg, short item);
1f8a80 void¤   ¤   ¤   SetUserItemProc(DialogRef dlg, short item,
d71eae ¤   ¤   ¤   ¤   ¤   ¤   UserItemUPP theProc);
c9efa8 void¤   ¤   ¤   GetDialogItemRect(DialogRef dlg, short item, Rect *itemRect);
30aa14 void¤   ¤   ¤   SetDialogItemRect(DialogRef dlg, short item,
391649 ¤   ¤   ¤   ¤   ¤   ¤   const Rect *itemRect);
ed1bb0 void¤   ¤   ¤   OffsetDialogItem(DialogRef dlg, short item,
8f992d ¤   ¤   ¤   ¤   ¤   ¤   short hOffset, short vOffset);
2adcc9 void¤   ¤   ¤   InvalDialogItem(DialogRef dlg, short item, short inset);
92cf28 void¤   ¤   ¤   EraseDialogItem(DialogRef dlg, short item, short inset);
93871a void¤   ¤   ¤   ShowHideDialogItem(DialogRef dlg, short item, Boolean show);
355bc4 short¤  ¤   ¤   GetDialogItemType(DialogRef dlg, short item);
2e263e ControlHandle¤  GetDialogControlItem(DialogRef dlg, short item);
99f42b short¤  ¤   ¤   GetDialogControlValue(DialogRef dlg, short item);
41b85b void¤   ¤   ¤   SetDialogControlValue(DialogRef dlg, short item,
80b6dc ¤   ¤   ¤   ¤   ¤   ¤   short value);
870614 Boolean¤¤   ¤   ToggleDialogCheckbox(DialogRef dlg, short item);
03b64e void¤   ¤   ¤   GetIndDialogItemText(DialogRef dlg, short item,
37d0c6 ¤   ¤   ¤   ¤   ¤   ¤   uchar *itemText);
917c53 void¤   ¤   ¤   SetIndDialogItemText(DialogRef dlg, short item,
676544 ¤   ¤   ¤   ¤   ¤   ¤   const uchar *itemText);
20cc91 OSErr¤  ¤   ¤   PGPCreateRootControl(WindowPtr inWindow,
0cb850 ¤   ¤   ¤   ¤   ¤   ¤   ControlHandle *outControl);
7baf5a
3d3ffd #if PRAGMA_IMPORT
c12ced #pragma import reset
f67454 #endif
9e2827 PGP_END_C_DECLARATIONS¶
--48f5 0006bac293940120228 Page 1 of MacDriverUtils.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
2213d4 ¤   $Id: MacDriverUtils.cp,v 1.10.16.1 1998/11/12 03:19:30 heller Exp $
71f7f7 ____________________________________________________________________________*/
eeaf5a
864293 #include <FSM.h>
dd4d37 #include <LowMem.h>
0acb2f #include <Math64.h>
e48500 #include <StringCompare.h>
abaf5a
db0d08 #include "pgpMem.h"
2075a9 #include "MacDriverUtils.h"
b385c2 #include "MacStrings.h"
b8af5a
2faf5a
b4af5a
e6af5a
a3af5a
1367b1 const UInt32¤   kDiskBlockSize¤ = 512L;
6c67c5 ¤
0a67c5 ¤
caaf5a
17af5a
0c0335 /*____________________________________________________________________________
620cf4 ¤   Allocates and switches to a larger unit table. ·If the current unit table
be6a9c ¤   has less than kMinUnitNum entries, the unit table is increased to
24a623 ¤   kMinUnitNum + 16. ·If the current unit table has more than kMinUnitNum
3a6e23 ¤   entries, the unit table is increased by 4 entries up to
9d18c4 ¤   kMaxUnitTableEntries.
e6f7f7 ____________________________________________________________________________*/
13d140 ¤   static OSErr
68682d GrowUnitTable(void)
04bb36 {
6a9c1a ¤   OSErr¤  err = noErr;
16d107 ¤   Ptr¤¤   oldUnitTableBase;
59eec0 ¤   short¤  oldUnitEntryCount;
9a823e ¤   Ptr¤¤   newUnitTableBase;
5242d1 ¤   short¤  newUnitEntryCount;
5767c5 ¤
fcd034 ¤   oldUnitTableBase = LMGetUTableBase();
9cae26 ¤   oldUnitEntryCount = LMGetUnitTableEntryCount();
80f697 ¤   if (oldUnitEntryCount < kMinUnitNum)
eb1d23 ¤   ¤   newUnitEntryCount = 64;
c50e24 ¤   else
cd085c ¤   ¤   newUnitEntryCount = oldUnitEntryCount + 4;
961b52 ¤   ¤
5d59c8 ¤   /* The unit table cannot grow past kMaxUnitTableEntries (128) */
86e4a7 ¤   if(newUnitEntryCount <= kMaxUnitTableEntries)
abc7a1 ¤   {
ef23d7 ¤   ¤   /* Allocate the new unit table */
0f3e46 ¤   ¤   newUnitTableBase = NewPtrSysClear(newUnitEntryCount * sizeof(long));
ee8dfd ¤   ¤   if (newUnitTableBase != nil)
7c5b34 ¤   ¤   {
04a44b ¤   ¤   ¤   MacLeaks_IgnoreItem( newUnitTableBase );
2487c7 ¤   ¤   ¤
1fbba5 ¤   /*¤ Copy the old unit table into the new. Although the·
8eda71 ¤   **¤ "Driver Education" Tech Note says that you need to disable
50eadf ¤   **¤ interrupts around this operations, you don't.
7019c3 ¤   ** ·You only need to
b9d03d ¤   **¤ perform the steps in the right order because anything that uses
5c902f ¤   **¤ the unit table at interrupt time shouldn't be saving the UTableBase
953f07 ¤   **¤ or UnitNtryCnt values between calls (if they do, they'll break even
345d6b ¤   **¤ if we do disable interrupts around these steps).
9b9faa ¤   */
eb1b52 ¤   ¤
44cce0 ¤   ¤   ¤   /* First, copy the current unit table into the new unit table */
37a431 ¤   ¤   ¤   BlockMoveData(oldUnitTableBase,
6b6a4a ¤   ¤   ¤   ¤   newUnitTableBase, oldUnitEntryCount * 4);
--be7a 000cd85114240120228 Page 2 of MacDriverUtils.cp
f11b52 ¤   ¤
9c628d ¤   ¤   ¤   /* Now, switch to the new unit table. After this step, the */
9cddc9 ¤   ¤   ¤   /* Device Manager will be using the new unit table. */
e1c0ab ¤   ¤   ¤   LMSetUTableBase(newUnitTableBase);
761b52 ¤   ¤
48c4c5 ¤   ¤   ¤   /* Now, tell the system the table is larger. */
2d3651 ¤   ¤   ¤   LMSetUnitTableEntryCount(newUnitEntryCount);
e81b52 ¤   ¤
2e1b52 ¤   ¤
541a3e ¤   ¤   ¤   /* Everything is switched, so we can get
65783d ¤   ¤   ¤   ¤   rid of the old unit table */
15cead ¤   ¤   ¤   MacLeaks_RememberPtr( oldUnitTableBase,
2b44a5 ¤   ¤   ¤   ¤   kMacLeaks_NewPtrSysClearAllocType, 0, "dummy", 0);
322b85 ¤   ¤   ¤   ¤
13268f ¤   ¤   ¤   /* Everything switched, so we can get rid of the old unit table */
175fc9 ¤   ¤   ¤   DisposePtr(oldUnitTableBase);
aa0fe4 ¤   ¤   }
8f0e1d ¤   ¤   else
ad5b34 ¤   ¤   {
70830d ¤   ¤   ¤   pgpDebugPStr("\pGrowUnitTable: "
9c26b2 ¤   ¤   ¤   "New unit table could not be allocated");
c2a1b4 ¤   ¤   ¤   err = unitTblFullErr;
690fe4 ¤   ¤   }
3a1b52 ¤   ¤
879371 ¤   }
bf0e24 ¤   else
e2c7a1 ¤   {
4e85b5 ¤   ¤   pgpDebugPStr("\pGrowUnitTable: "
80f573 ¤   ¤   ¤   "Unit table cannot grow past kMaxUnitTableEntries (128)");
5f96bc ¤   ¤   err = unitTblFullErr;
4c9371 ¤   }
4867c5 ¤
c19337 ¤   return (err);
7fefe6 }
a1af5a
ddaf5a
e50335 /*____________________________________________________________________________
71b939 ¤   Finds the first unused unit table entry >= kMinUnitNum. Returns 0 if no
821266 ¤   unused entry is found.
32f7f7 ____________________________________________________________________________*/
c6cd8d ¤   static Boolean
9239c5 FindUnusedDriverRefNum( short *refNum )
32bb36 {
5bb7d8 ¤   const AuxDCEPtr¤*unitTable;
ef1490 ¤   short¤  ¤   unitEntryCount;
31d292 ¤   short¤  ¤   unitNumber;
d10033 ¤   Boolean¤¤   foundOne¤   = FALSE;
67af5a
0518e5 ¤   *refNum¤= 0;
1a67c5 ¤
689aa8 ¤   unitTable¤  ¤   = (const AuxDCEPtr *)LMGetUTableBase();
109430 ¤   unitEntryCount¤ = LMGetUnitTableEntryCount();
d967c5 ¤
f1a679 ¤   unitNumber¤ = kMinUnitNum;
9ffbda ¤   while ( unitNumber < unitEntryCount )
5fc7a1 ¤   {
6ef271 ¤   ¤   if ( ·IsNull( unitTable[ unitNumber ] ))
805b34 ¤   ¤   {
90b172 ¤   ¤   ¤   // empty entry, calculate its driver reference number·
e93469 ¤   ¤   ¤   *refNum¤= -1 * (unitNumber +1);
ddb7e3 ¤   ¤   ¤   foundOne¤   = TRUE;
38cdcb ¤   ¤   ¤   break;
5f0fe4 ¤   ¤   }
b31b52 ¤   ¤
5c88a5 ¤   ¤   ++unitNumber;
ce9371 ¤   }
1267c5 ¤
38dc2e ¤   return( foundOne );
59efe6 }
7faf5a
52af5a
cdaf5a
--99fb 0004518388540120228 Page 3 of MacDriverUtils.cp
a70335 /*____________________________________________________________________________
005937 ¤   Gets a reference number for our driver to use. ·Grows the unit table if
2be411 ¤   if is less than kMinUnitNum or if there are no empty entries in the
762410 ¤   unit table.
4af7f7 ____________________________________________________________________________*/
41eacd ¤   OSErr
60e32f GetUnusedDriverRefNum(short *driverRefNum)
b7c7a1 ¤   {
fb9c1a ¤   OSErr¤  err = noErr;
b467c5 ¤
6f8e9f ¤   pgpAssertAddrValid( driverRefNum, short );
3267c5 ¤
c1b277 ¤   *driverRefNum = 0;
ed67c5 ¤
1dfa09 ¤   /* See if we need to resize before we even look for an empty entry */
34a597 ¤   if (LMGetUnitTableEntryCount() < kMinUnitNum)
666d58 ¤   ¤   /* yep, so do it */
e318e9 ¤   ¤   err = GrowUnitTable();
4e67c5 ¤
62300f ¤   if (err == noErr)
e65b34 ¤   ¤   {
9fc8e6 ¤   ¤   Boolean¤foundOne¤   = FALSE;
1c1b52 ¤   ¤
177ba4 ¤   ¤   foundOne¤   = FindUnusedDriverRefNum( driverRefNum );
a41b52 ¤   ¤
b08822 ¤   ¤   if ( ! foundOne )
d3f776 ¤   ¤   ¤   {
293c51 ¤   ¤   ¤   err¤= GrowUnitTable();
df87c7 ¤   ¤   ¤
b9e090 ¤   ¤   ¤   if ( IsntErr( err ) )
0c72c3 ¤   ¤   ¤   ¤   {
13d29e ¤   ¤   ¤   ¤   foundOne¤   = FindUnusedDriverRefNum( driverRefNum );
c42613 ¤   ¤   ¤   ¤   }
e6a3a6 ¤   ¤   ¤   }
bf87c7 ¤   ¤   ¤
a18822 ¤   ¤   if ( ! foundOne )
71f776 ¤   ¤   ¤   {
1ea1b4 ¤   ¤   ¤   err = unitTblFullErr;
d0a3a6 ¤   ¤   ¤   }
7a0fe4 ¤   ¤   }
9967c5 ¤
11fdcc ¤   return ( err );
949371 ¤   }
a1af5a
85af5a
96af5a
caaf5a
dc0335 /*____________________________________________________________________________
8d7504 ¤   Find the drive queue element for driveNum in the drive queue and Dequeue it.
4ca7ad ¤   Return pointer to the drive queue element removed in *drivePtr.
67f7f7 ____________________________________________________________________________*/
71af5a
49eacd ¤   OSErr
da6d10 RemoveDriveQEl(
b322e7 ¤   short¤  ¤   driveNum,
e3cc7e ¤   DrvQEl¤ **¤ drivePtr)
86bb36 {
024208 ¤   QHdr *¤ ¤   driveQHdr;
f3969a ¤   DrvQEl *¤   curDrive;
1218ac ¤   Boolean¤¤   foundIt¤= FALSE;
dbbfd4 ¤   OSErr¤  ¤   err¤= nsDrvErr;
d7af5a
4484ff ¤   pgpAssert( driveNum > 0 );
704afa ¤   pgpAssertAddrValid( drivePtr, DrvQEl *);
5767c5 ¤
cbea02 ¤   *drivePtr¤  = nil;
f067c5 ¤
c5d1e4 ¤   driveQHdr = GetDrvQHdr();
1d67c5 ¤
0367d8 ¤   curDrive = (DrvQEl *)driveQHdr->qHead;
c58b78 ¤   while ( IsntNull( curDrive ) )
455b34 ¤   ¤   {
--31c6 0003262dbe040120228 Page 4 of MacDriverUtils.cp
914d36 ¤   ¤   if ( driveNum == curDrive->dQDrive )
fcf776 ¤   ¤   ¤   {
d466f7 ¤   ¤   ¤   foundIt¤= TRUE;
5fcdcb ¤   ¤   ¤   break;
33a3a6 ¤   ¤   ¤   }
c687c7 ¤   ¤   ¤
0bb3c6 ¤   ¤   curDrive = (DrvQEl *)( curDrive->qLink );
b50fe4 ¤   ¤   }
d367c5 ¤
cc6b31 ¤   if ( foundIt )
535b34 ¤   ¤   {
a63ee7 ¤   ¤   *drivePtr¤  = curDrive;
246243 ¤   ¤   err¤¤   ¤   = Dequeue( (QElem *)curDrive, driveQHdr);
3c0fe4 ¤   ¤   }
820e24 ¤   else
695b34 ¤   ¤   {
020ccf ¤   ¤   err¤= nsDrvErr;
fb0fe4 ¤   ¤   }
be67c5 ¤
88deb7 ¤   return( err );
e7efe6 }
2aaf5a
7aaf5a
1caf5a
7bb203 ¤   const VCB *
341b66 GetVCBForDrive( short driveNumber )
00c7a1 ¤   {
506c9b ¤   pgpAssert( driveNumber > 0 );
4767c5 ¤
e782bc ¤   const VCB *¤vcb¤= (const VCB *)GetVCBQHdr()->qHead;
dc67c5 ¤
6294ad ¤   while ( IsntNull( vcb ) )
935b34 ¤   ¤   {
64551f ¤   ¤   if ( vcb->vcbDrvNum == driveNumber )
b3cdcb ¤   ¤   ¤   break;
6b87c7 ¤   ¤   ¤
18d6c0 ¤   ¤   vcb¤= (const VCB *)vcb->qLink;
c40fe4 ¤   ¤   }
3367c5 ¤
b331cb ¤   return( vcb );
b09371 ¤   }
4567c5 ¤
2baf5a
5eaf5a
e8af5a
51af5a
6aaf5a
9dcd56 ¤   UInt32
a85c9d GetPBStartBlock( const IOParam ·*ioPB )
20c7a1 ¤   {
5b3021 ¤   pgpAssertAddrValid( ioPB, IOParam );
1167c5 ¤
c814e9 ¤   UInt32¤ startBlock;
ba67c5 ¤
041960 ¤   if ( PBUsesWidePositioning( ioPB ) )
115b34 ¤   ¤   {
05f437 ¤   ¤   pgpAssert( kDiskBlockSize == 512 );¤// 2^9
6be114 ¤   ¤   startBlock¤ = UnsignedWideToUInt64(
9ebf3b ¤   ¤   ¤   ¤   ¤   ¤   ((XIOParam *)ioPB)->ioWPosOffset ) >> 9;
2f0fe4 ¤   ¤   }
4c0e24 ¤   else
615b34 ¤   ¤   {
9c0a39 ¤   ¤   startBlock¤ = ioPB->ioPosOffset / kDiskBlockSize;
2a0fe4 ¤   ¤   }
9c1b52 ¤   ¤
aff218 ¤   return( startBlock );
889371 ¤   }
13af5a
64af5a
57cd56 ¤   UInt32
36ed49 GetPBNumBlocks( const IOParam ·*ioPB )
32c7a1 ¤   {
--82c8 00091af934540120228 Page 5 of MacDriverUtils.cp
c93021 ¤   pgpAssertAddrValid( ioPB, IOParam );
9b67c5 ¤
f76da3 ¤   return( ioPB->ioReqCount / kDiskBlockSize );
979371 ¤   }
daaf5a
ecaf5a
131f8e ¤   UInt16
000c25 GetNumDCtlEntries( void )
2bc7a1 ¤   {
cfe537 ¤   return( LMGetUnitTableEntryCount() );
f39371 ¤   }
17af5a
efaf5a
a04b9a ¤   DCtlHandle
7e5fd6 GetIndDCtlEntry( UInt16¤unitNum)
70c7a1 ¤   {
16a20f ¤   const DCtlHandle *¤ unitTable;
b667c5 ¤
9a44db ¤   unitTable¤  = (const DCtlHandle *)LMGetUTableBase();
5c67c5 ¤
cb8e6e ¤   return( unitTable[ unitNum ] );
f79371 ¤   }
3baf5a
44af5a
18f555 ¤   DRVRHeader *
445c09 GetDriverHeaderPtrFromDCtlHdl( DCtlHandle¤  dCtl)
27c7a1 ¤   {
d49f01 ¤   DRVRHeader *¤   drvrPtr;
af67c5 ¤
25b664 ¤   if ( ((**dCtl).dCtlFlags & dRAMBasedMask) != 0 )
615b34 ¤   ¤   {
db11e6 ¤   ¤   drvrPtr¤= (DRVRHeader *) *(Handle) ((**dCtl).dCtlDriver);
660fe4 ¤   ¤   }
cf0e24 ¤   else
535b34 ¤   ¤   {
74bbe5 ¤   ¤   drvrPtr¤= (DRVRHeader ·*) ((*dCtl)->dCtlDriver);
9c0fe4 ¤   ¤   }
571b52 ¤   ¤
633be3 ¤   return( drvrPtr );
2c9371 ¤   }
ce67c5 ¤
3567c5 ¤
906d52 ¤   void
ba964f GetDriverNameFromDCtlHdl(
9c3d96 ¤   DCtlHandle¤ dCtl,
af96df ¤   StringPtr¤  name)
8ac7a1 ¤   {
97eacc ¤   AssertHandleIsValid( dCtl, "GetDriverNameFromDCtlHdl");
fe67c5 ¤
d58433 ¤   const DRVRHeader *¤ drvrPtr;
8c67c5 ¤
19ad07 ¤   drvrPtr¤= GetDriverHeaderPtrFromDCtlHdl( dCtl );
b59fe9 ¤   if ( IsntNull( drvrPtr ) )
925b34 ¤   ¤   {
e9dbe5 ¤   ¤   CopyPString( drvrPtr->drvrName, name );
660fe4 ¤   ¤   }
d99371 ¤   }
96af5a
42af5a
06af5a
e77e69 ¤   Boolean
85c716 DriverIsInstalled(
60c6e3 ¤   ConstStr255Param¤   name,
1c9f1b ¤   short *¤¤   ¤   ¤   refNum)
70bb36 {
fcf089 ¤   pgpAssertAddrValid( name, uchar );
bf67c5 ¤
de18e5 ¤   *refNum¤= 0;
9767c5 ¤
6a784e ¤   UInt16 numDCtlEntries¤  = GetNumDCtlEntries();
f467c5 ¤
91c115 ¤   for( UInt16 unitNum = 0; unitNum < numDCtlEntries; unitNum++)
--770e 000973cbe2940120228 Page 6 of MacDriverUtils.cp
e35b34 ¤   ¤   {
4c876a ¤   ¤   DCtlHandle¤ ¤   curDCtlHndl¤= GetIndDCtlEntry( unitNum );
7d1b52 ¤   ¤
11d5a8 ¤   ¤   if( IsntNull( curDCtlHndl ) && IsntNull( (**curDCtlHndl).dCtlDriver ))
4df776 ¤   ¤   ¤   {
da7ba0 ¤   ¤   ¤   Str255¤ driverName;
5e87c7 ¤   ¤   ¤
0c6163 ¤   ¤   ¤   GetDriverNameFromDCtlHdl( curDCtlHndl, driverName );
1687c7 ¤   ¤   ¤
16177b ¤   ¤   ¤   if( EqualString( name, driverName, 0, 1) )
8872c3 ¤   ¤   ¤   ¤   {
60f5a7 ¤   ¤   ¤   ¤   *refNum¤= -( unitNum + 1 );
3838a9 ¤   ¤   ¤   ¤   return( TRUE );
ca2613 ¤   ¤   ¤   ¤   }
e3a3a6 ¤   ¤   ¤   }
490fe4 ¤   ¤   }
1a67c5 ¤
d9a230 ¤   return FALSE;
23efe6 }
87af5a
b5af5a
96af5a
11eacd ¤   OSErr
558096 GetDriverNameUsingRefNum(
5e6e16 ¤   const short¤driverRefNum,
4a4dae ¤   StringPtr¤  driverName )
a7c7a1 ¤   {
1b9e89 ¤   pgpAssert( driverRefNum < 0 );
ae67c5 ¤
8e14d3 ¤   OSErr¤  ¤   err¤= noErr;
54af5a
220e86 ¤   driverName[ 0 ]¤= 0;
c587c7 ¤   ¤   ¤
ad20e7 ¤   if ( driverRefNum < 0 )
d05b34 ¤   ¤   {
b4eb94 ¤   ¤   DCtlHandle¤ entry;
7967c5 ¤
830431 ¤   ¤   entry¤  = GetIndDCtlEntry( DriverRefNumToUnitNum( driverRefNum ) );
d31b52 ¤   ¤
ceaa1f ¤   ¤   if ( IsntNull( entry ) )
86f776 ¤   ¤   ¤   {
a550d1 ¤   ¤   ¤   GetDriverNameFromDCtlHdl( entry, driverName);
dba3a6 ¤   ¤   ¤   }
0e0e1d ¤   ¤   else
17f776 ¤   ¤   ¤   {
c9dbbf ¤   ¤   ¤   err¤¤   = paramErr;
1fa3a6 ¤   ¤   ¤   }
c20fe4 ¤   ¤   }
8c0e24 ¤   else
405b34 ¤   ¤   {
fcb903 ¤   ¤   err¤= paramErr;
180fe4 ¤   ¤   }
5d67c5 ¤
77deb7 ¤   return( err );
099371 ¤   }
8267c5 ¤
5e67c5 ¤
5ceacd ¤   OSErr
f7daf0 SetDriverName(
f647b2 ¤   DRVRHeader *¤   ¤   header,
2b13d3 ¤   ConstStr255Param¤   newName )
24c7a1 ¤   {
473f82 ¤   pgpAssertAddrValid( header, DRVRHeader );
7467c5 ¤
2614d3 ¤   OSErr¤  ¤   err¤= noErr;
7f67c5 ¤
0560c3 ¤   if ( IsntNull( header ) )
885b34 ¤   ¤   {
44a3b4 ¤   ¤   if ( StrLength( newName ) <= StrLength( header->drvrName ) )
91f776 ¤   ¤   ¤   {
59c07e ¤   ¤   ¤   CopyPString( newName, header->drvrName );
97a3a6 ¤   ¤   ¤   }
--03a7 000c4456dd340120228 Page 7 of MacDriverUtils.cp
040e1d ¤   ¤   else
aaf776 ¤   ¤   ¤   {
0f4f66 ¤   ¤   ¤   err¤= paramErr;
efa3a6 ¤   ¤   ¤   }
9b0fe4 ¤   ¤   }
100e24 ¤   else
125b34 ¤   ¤   {
9176e1 ¤   ¤   err¤¤   = paramErr;
290fe4 ¤   ¤   }
e967c5 ¤
34deb7 ¤   return( err );
b99371 ¤   }
8daf5a
17af5a
9beacd ¤   OSErr
14daf0 SetDriverName(
3b8a76 ¤   DCtlHandle¤ ¤   ¤   dCtlHdl,
0813d3 ¤   ConstStr255Param¤   newName )
6ec7a1 ¤   {
a12924 ¤   AssertHandleIsValid( dCtlHdl, "SetDriverName" );
f967c5 ¤
9c14d3 ¤   OSErr¤  ¤   err¤= noErr;
4a67c5 ¤
1f9da7 ¤   if ( IsntNull( dCtlHdl ) )
245b34 ¤   ¤   {
cc15b7 ¤   ¤   DRVRHeader *¤   header¤ = GetDriverHeaderPtrFromDCtlHdl( dCtlHdl );
021b52 ¤   ¤
13b34a ¤   ¤   err¤= SetDriverName( header, newName );
450fe4 ¤   ¤   }
560e24 ¤   else
265b34 ¤   ¤   {
c776e1 ¤   ¤   err¤¤   = paramErr;
5c0fe4 ¤   ¤   }
2f67c5 ¤
bbdeb7 ¤   return( err );
0e9371 ¤   }
e367c5 ¤
7167c5 ¤
7e67c5 ¤
2067c5 ¤
69eacd ¤   OSErr
d2daf0 SetDriverName(
b0932c ¤   short¤  ¤   ¤   ¤   driverRefNum,
8913d3 ¤   ConstStr255Param¤   newName )
50c7a1 ¤   {
099e89 ¤   pgpAssert( driverRefNum < 0 );
0114d3 ¤   OSErr¤  ¤   err¤= noErr;
e70975 ¤   DCtlHandle¤ entry;
cdaf5a
e61f38 ¤   entry¤  = GetIndDCtlEntry( DriverRefNumToUnitNum( driverRefNum ) );
d267c5 ¤
2b3242 ¤   err¤= SetDriverName( entry, newName );
d267c5 ¤
96deb7 ¤   return( err );
e39371 ¤   }
f267c5 ¤
e7af5a
9d85ea ¤   OSStatus
b5e976 GetDriverRefNumForDrive(
d34fe8 ¤   short¤  driveNumber,
2719cf ¤   short *¤driverRefNum)
d5c7a1 ¤   {
e10aa3 ¤   OSStatus¤   ¤   err¤= nsDrvErr;
b0bac1 ¤   const DrvQEl¤   *driveQEl = nil;
6867c5 ¤
051aab ¤   *driverRefNum¤  = 0;
cd67c5 ¤
af9d9c ¤   driveQEl = (const DrvQEl *)(GetDrvQHdr()->qHead);
5cf103 ¤   while( IsntNull( driveQEl ) )
325b34 ¤   ¤   {
d585e0 ¤   ¤   if( driveQEl->dQDrive == driveNumber )
c4f776 ¤   ¤   ¤   {
--0172 001e99dcfb740120228 Page 8 of MacDriverUtils.cp
a060a0 ¤   ¤   ¤   *driverRefNum¤  = driveQEl->dQRefNum;
33c7c1 ¤   ¤   ¤   err¤= noErr;
9dcdcb ¤   ¤   ¤   break;
6ba3a6 ¤   ¤   ¤   }
7987c7 ¤   ¤   ¤
50a545 ¤   ¤   driveQEl¤   = (const DrvQEl *)(driveQEl->qLink);
100fe4 ¤   ¤   }
431b52 ¤   ¤
bddeb7 ¤   return( err );
969371 ¤   }
4467c5 ¤
5caf5a
d60335 /*____________________________________________________________________________
7f2918 ¤   Return TRUE if the proposed disk drive request needs
eebb8a ¤   to use wide positioning.
96f7f7 ____________________________________________________________________________*/
b47e69 ¤   Boolean
00f70a NeedWidePositioning(
12cc70 ¤   UInt32¤ startBlock,
1e6eb6 ¤   UInt32¤ numBlocks )
a9c7a1 ¤   {
fcb87f ¤   // comparison should be strictly '>',
181b40 ¤   // but who knows if this will derange some driver
73f90e ¤   // when the sum equals 4GB
d52c7a ¤   return( startBlock + numBlocks >= kMaximumBlocksIn4GB );
029371 ¤   }
73af5a
dfaf5a
1ffde6 ¤   const DrvQEl *
947854 GetDriveQElem( short driveNumber )
11c7a1 ¤   {
dc4124 ¤   const DrvQEl *¤ drvQElem¤   = (const DrvQEl *)GetDrvQHdr()->qHead;
2867c5 ¤
944bce ¤   while ( IsntNull( drvQElem ) )
595b34 ¤   ¤   {
9ace75 ¤   ¤   if ( drvQElem->dQDrive == driveNumber )
7bf776 ¤   ¤   ¤   {
0fcdcb ¤   ¤   ¤   break;
72a3a6 ¤   ¤   ¤   }
1887c7 ¤   ¤   ¤
97d227 ¤   ¤   drvQElem¤   = (const DrvQEl *)drvQElem->qLink;
bd0fe4 ¤   ¤   }
7867c5 ¤
5079f5 ¤   return( drvQElem );
869371 ¤   }
94af5a
41af5a
c9af5a
1aaf5a
05af5a
edaf5a
aaaf5a
92af5a
4daf5a
b1af5a
b8af5a
92af5a
beaf5a
feaf5a
e9af5a
--11e5 0001b798db240120229 Page 1 of MacDriverUtils.h
a70335 /*____________________________________________________________________________
7bf254 ¤   Copyright (C) 1996,1997 Network Associates, Inc. and its affiliates.
754b0f ¤   All rights reserved.
0967c5 ¤
7d754b ¤   $Id: MacDriverUtils.h,v 1.9.28.1 1998/11/12 03:19:30 heller Exp $
b4f7f7 ____________________________________________________________________________*/
3caf5a
947b7d #pragma once
0daf5a
ca2363 #include <Devices.h>
acaf5a
ec1ce0 /* A DrvQEl with flags */
c8af46 #pragma options align=mac68k
19f8a4 typedef struct FlagsDrvQEl
f9bb36 {
5403d7 ¤   long¤   ¤   ¤   flags;
2e476a ¤   DrvQEl¤ ¤   ¤   el;
b44593 } FlagsDrvQEl;
427c46 #pragma options align=reset
83af5a
01feda // flags for FlagsDrvQEl.flags
b43acc const long¤ kDriveLockedMask¤   ¤   ¤   = 0x80000000;¤  // see Files 2-85
539ea9 const long¤ kDiskInDriveMask¤   ¤   ¤   = 0x00010000;¤  // see Files 2-85
e3f00a const long¤ kDriveIsNotEjectableMask¤   = 0x00080000;¤  // see Files 2-85
61e114 const long¤ kDriveWantsEjectCallMask¤   = 0x00400000;¤  // see Files 2-85
54af5a
e6af5a
99af5a
5b48a7 const UInt16¤   kMaxUnitTableEntries¤   = 128;
487e85 const UInt16¤   kMinUnitNum = 48;
1baf5a
adf24b const OSErr¤kAsyncIOInProgress¤ = 1;
c0af5a
852695 struct FCBRec;
f294e8 struct VCB;
23af5a
260716 const VCB *¤¤   GetVCBForDrive( short driveNumber );
fcaf5a
74e83f OSStatus¤   ¤   GetDriverRefNumForDrive( short driveNumber,
c63438 ¤   ¤   ¤   ¤   ¤   short *driverRefNum );
31af5a
8b7a3d const DrvQEl *¤ GetDriveQElem( short driveNumber );
04af5a
7aaf5a
c50d5f const short¤kWidePosOffsetMask¤ = ( (short)1 << kWidePosOffsetBit );
cdaf5a
a6e493 Boolean¤¤   ¤   NeedWidePositioning( UInt32 startBlock,¤UInt32 numBlocks );
93af5a
2abf37 inline Boolean¤ PBUsesWidePositioning( const IOParam *pb )
fd2cdb ¤   ¤   ¤   ¤   ¤   { return( ( pb->ioPosMode & kWidePosOffsetMask ) != 0 ); }
ccae30 ¤   ¤   ¤   ¤   ¤
9b3d9d inline Boolean¤ PBUsesWidePositioning( const ParamBlockRec *pb )
2c9598 ¤   ¤   ¤   ¤   ¤   { return( PBUsesWidePositioning( &pb->ioParam) ); }
86af5a
00af5a
a3e716 UInt32¤ ¤   ¤   GetPBStartBlock( const IOParam ·*ioPB );
114a62 inline UInt32¤  GetPBStartBlock( const ParamBlockRec ·*pb )
c4bb36 {
35738c ¤   return( GetPBStartBlock( &pb->ioParam ) );
d4efe6 }
52af5a
23bb75 UInt32¤ ¤   ¤   GetPBNumBlocks( const IOParam ·*ioPB );
91aa99 inline UInt32¤  GetPBNumBlocks( const ParamBlockRec ·*pb )
6bbb36 {
336ed5 ¤   return( GetPBNumBlocks( &pb->ioParam ) );
15efe6 }
ccaf5a
74af5a
98b9f6 inline Boolean¤ PBIsAsync( const IOParam *pb )
98bb36 {
2f2bec ¤   return( ( pb->ioTrap & 0x0400) != 0 );
1befe6 }
--10c4 0018033101540120229 Page 2 of MacDriverUtils.h
e0af5a
816093 inline Boolean¤ PBIsSync( const IOParam *pb )
fabb36 {
334bf6 ¤   return( ( pb->ioTrap & 0x0400) == 0 );
40efe6 }
84af5a
95055d inline Boolean¤ PBIsAsync( const ParamBlockRec *pb )
efbb36 {
7b8571 ¤   return( PBIsAsync( &pb->ioParam ) );
87efe6 }
41af5a
8b3838 inline Boolean¤ PBIsSync( const ParamBlockRec *pb )
91bb36 {
a32fa8 ¤   return( PBIsSync( &pb->ioParam ) );
17efe6 }
76af5a
b1af5a
270a43 OSErr¤  ¤   GetDriverNameUsingRefNum( short driverRefNum, StringPtr name);
8faf5a
acda40 OSErr¤  ¤   SetDriverName( DRVRHeader * header, ConstStr255Param name);
7bbe22 OSErr¤  ¤   SetDriverName( DCtlHandle, ConstStr255Param name);
487b11 OSErr¤  ¤   SetDriverName( short driverRefNum, ConstStr255Param name);
f5af5a
a02e59 Boolean¤DriverIsInstalled( ConstStr255Param name, short * refNum);
a8af5a
eaaf5a
fb633e void¤   ¤   ¤   GetDriverNameFromDCtlHdl( DCtlHandle dCtl, StringPtr name);
e294ba DRVRHeader *¤   GetDriverHeaderPtrFromDCtlHdl( DCtlHandle dCtl );
0baf5a
1350d2 inline short¤   DriverRefNumToUnitNum( short driverRefNum )
38bb36 {
bb4e37 ¤   return( -1 * ( driverRefNum + 1 ) );
7aefe6 }
4bae30 ¤   ¤   ¤   ¤   ¤
f7300c DCtlHandle¤ ¤   GetIndDCtlEntry( UInt16¤unitNum);
b9a0c2 UInt16¤ ¤   ¤   GetNumDCtlEntries( void );
8eaf5a
92af5a
ce7207 OSErr¤  ¤   GetUnusedDriverRefNum (short *drvrRefNum);
2baf5a
566f05 OSErr¤  ¤   RemoveDriveQEl( short driveNumber, DrvQEl¤  **¤ drivePtr);
80af5a
--488a 0002f3841844012022a Page 1 of MacEnvirons.c
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
e255ea ¤   $Id: MacEnvirons.c,v 1.11.16.1 1998/11/12 03:19:31 heller Exp $
71f7f7 ____________________________________________________________________________*/
abaf5a
40b980 #include <Appearance.h>
e4c20d #include <Dialogs.h>
dc255b #include <Fonts.h>
9d6c79 #include <Gestalt.h>
fbae6e #include <Menus.h>
06dc1d #include <Scrap.h>
6c27b4 #include <TextEdit.h>
25a9c8 #include <Traps.h>
49b4df #include <Windows.h>
e9af5a
d20d08 #include "pgpMem.h"
ec0438 #include "MacBasics.h"
5b8bd8 #include "MacEnvirons.h"
fcaf5a
4785c2 #include "MacStrings.h"
535bf6 #include "MacTraps.h"
ccaf5a
2e1f8e ¤   UInt16
696f44 GetSystemVersion( void )
6dbb36 {
cd51ec ¤   static UInt16¤  sSystemVersion¤ ·= 0;
6867c5 ¤
0b652e ¤   if ( sSystemVersion == 0 )
10c7a1 ¤   {
40aec5 ¤   ¤   long¤   gestaltResult;
b91b52 ¤   ¤
e64f89 ¤   ¤   if( TrapAvailable( _Gestalt ) &&
0327f9 ¤   ¤   ¤   Gestalt( gestaltSystemVersion, &gestaltResult ) == noErr )
905b34 ¤   ¤   {
6b1a3f ¤   ¤   ¤   sSystemVersion¤ = (UInt16)gestaltResult;
270fe4 ¤   ¤   }
630e1d ¤   ¤   else
0c5b34 ¤   ¤   {
c6c87f ¤   ¤   ¤   pgpDebugPStr( "\pGetSystemVersion: "
82d366 ¤   ¤   ¤   "gestaltSystemVersion undefined" );
278b07 ¤   ¤   ¤   sSystemVersion¤ = 0x0600;
490fe4 ¤   ¤   }
7e9371 ¤   }
d867c5 ¤
1cf258 ¤   return( sSystemVersion );
45efe6 }
93af5a
68af5a
e3af5a
577e69 ¤   Boolean
4e7969 VirtualMemoryIsOn( void )
6ebb36 {
0bbf5b ¤   static Boolean¤ sVirtualMemoryIsOn = 99;
7467c5 ¤
d15d63 ¤   if ( sVirtualMemoryIsOn == 99 )
4ac7a1 ¤   {
55aec5 ¤   ¤   long¤   gestaltResult;
58ba2d ¤   ¤   OSErr¤  err¤= noErr;
ff67c5 ¤
0ce7d5 ¤   ¤   err¤= Gestalt( gestaltVMAttr, &gestaltResult );
1cd798 ¤   ¤   if ( IsntErr( err ) )
265b34 ¤   ¤   {
a57f23 ¤   ¤   ¤   sVirtualMemoryIsOn¤ =
213f95 ¤   ¤   ¤   ¤   (gestaltResult & (1UL << gestaltVMPresent)) != 0;
a40fe4 ¤   ¤   }
d10e1d ¤   ¤   else
da5b34 ¤   ¤   {
57be25 ¤   ¤   ¤   sVirtualMemoryIsOn¤ = FALSE;
ff0fe4 ¤   ¤   }
2f9371 ¤   }
--129a 000f68b5d654012022a Page 2 of MacEnvirons.c
f11b52 ¤   ¤
b737f3 ¤   return( sVirtualMemoryIsOn );
75efe6 }
f7af5a
1f6d52 ¤   void
00639a GetMachineOwnerName(StringPtr owner)
57bb36 {
263ba2 ¤   short¤  saveResFile;
5c11ff ¤   uchar¤  **ownerNameRes;
0367c5 ¤
91e57d ¤   pgpAssertAddrValid( owner, uchar );
38af5a
7e92d1 ¤   owner[0] = 0;
e667c5 ¤
93ba16 ¤   saveResFile = CurResFile();
f5ab3a ¤   UseResFile( 2 );
e367c5 ¤
24abc7 ¤   ownerNameRes = (uchar **) Get1Resource( 'STR ', -16096 );
3d722b ¤   if( IsntNull( ownerNameRes ) && IsntNull( *ownerNameRes ) )
1dc7a1 ¤   {
c262b6 ¤   ¤   CopyPString( *ownerNameRes, owner );
d99371 ¤   }
d167c5 ¤
7960a3 ¤   UseResFile( saveResFile );
b5efe6 }
f6af5a
40af5a
669ea8 #if ! powerc
84af5a
d17e69 ¤   Boolean
80d946 RunningOnPowerPC( void )
89c7a1 ¤   {
5a7438 ¤   long¤   ¤   gestaltResult;
122e6e ¤   Boolean¤¤   onPowerPC¤  = false;
8467c5 ¤
241225 ¤   if ( Gestalt( gestaltSysArchitecture, &gestaltResult ) == noErr )
e15b34 ¤   ¤   {
60d66f ¤   ¤   onPowerPC¤  = (gestaltResult == gestaltPowerPC);
b60fe4 ¤   ¤   }
28bbfc ¤   return( onPowerPC );
aa9371 ¤   }
e9af5a
ff7454 #endif
6767c5 ¤
16af5a
f86d52 ¤   void
081bcf InitMacToolbox(void)
e9bb36 {
9cbc3c ¤   UnloadScrap();
4a67c5 ¤
df2363 ¤   InitGraf( &qd.thePort);
f60147 ¤   InitFonts();
2a3a8b ¤   InitWindows();
cb8a72 ¤   InitMenus();
d67205 ¤   TEInit();
9c3b83 ¤   InitDialogs( nil );
96709f ¤   InitCursor();
cc17b4 ¤   MaxApplZone();
7defe6 }
2daf5a
651f8e ¤   UInt16
0c86ee GetAppearanceMgrVersion(void)
f9bb36 {
8d032e ¤   static UInt16¤  version = 99;
e267c5 ¤
51f234 ¤   if( version == 99 )
70c7a1 ¤   {
1daec5 ¤   ¤   long¤   gestaltResult;
ea1b52 ¤   ¤
c88d29 ¤   ¤   version = 0;
e61b52 ¤   ¤
f6b919 ¤   ¤   if( Gestalt( gestaltAppearanceAttr, &gestaltResult ) == noErr &&
--43ee 00120ce40cc4012022a Page 3 of MacEnvirons.c
300558 ¤   ¤   ¤   ¤   ( gestaltResult & (1L << gestaltAppearanceExists) ) != 0 )
475b34 ¤   ¤   {
6a776f ¤   ¤   ¤   version = 0x0100;
3a87c7 ¤   ¤   ¤
6317f7 ¤   ¤   ¤   if( Gestalt( gestaltAppearanceVersion, &gestaltResult ) == noErr )
5bf776 ¤   ¤   ¤   {
220832 ¤   ¤   ¤   ¤   version = (UInt16) gestaltResult;
11a3a6 ¤   ¤   ¤   }
dc0fe4 ¤   ¤   }
2267c5 ¤
f667c5 ¤
c43a02 ¤   #if TARGET_RT_MAC_CFM
4f2764 ¤   ¤   /* Check for waek link failure */
4ae1a3 ¤   ¤   if( (void *) RegisterAppearanceClient ==
c4f476 ¤   ¤   ¤   ¤   (void *) kUnresolvedCFragSymbolAddress )
315b34 ¤   ¤   {
8a3cf8 ¤   ¤   ¤   version = 0;
b50fe4 ¤   ¤   }
2bb7ec ¤   #endif
599371 ¤   }
f467c5 ¤
ed72ef ¤   return( version );
a1efe6 }
20af5a
--b6b5 00164dff9c24012022b Page 1 of MacEnvirons.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
b5b3ad ¤   $Id: MacEnvirons.h,v 1.11.16.1 1998/11/12 03:19:32 heller Exp $
c9f7f7 ____________________________________________________________________________*/
55af5a
46675a #include "pgpTypes.h"
d4af5a
0c99c6 PGP_BEGIN_C_DECLARATIONS
a93ffd #if PRAGMA_IMPORT
06b981 #pragma import on
857454 #endif
78af5a
66be8e #define¤HaveAppearanceMgr()¤¤   (GetAppearanceMgrVersion() >= 0x0101)
86af5a
43af5a
7541e8 UInt16¤ ¤   GetSystemVersion( void );
f167b7 Boolean¤¤   VirtualMemoryIsOn( void );
cd0dff void¤   ¤   GetMachineOwnerName(StringPtr owner);
18c736 void¤   ¤   InitMacToolbox(void);
5accbf UInt16¤ ¤   GetAppearanceMgrVersion(void);
f7af5a
220ba3 #if powerc
838711 ¤   #define¤¤   RunningOnPowerPC()¤ ¤   ( true )
0adb21 #else
c9d368 ¤   Boolean¤¤   RunningOnPowerPC( void );
5b7454 #endif
d5af5a
c0af5a
6aaf5a
cd3ffd #if PRAGMA_IMPORT
c02ced #pragma import reset
107454 #endif
642827 PGP_END_C_DECLARATIONS¶
--3609 000b5e953174012022c Page 1 of MacErrors.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
d9af5a
6811b5 ¤   $Id: MacErrors.c,v 1.13.2.1.4.1 1998/11/12 03:19:32 heller Exp $
2cf7f7 ____________________________________________________________________________*/
47af5a
c4b2bf #include <Errors.h>
434b15 #include <TextUtils.h>
39af5a
f22b62 #include "pgpPFLErrors.h"
180d08 #include "pgpMem.h"
6976b7 #include "MacErrors.h"
aeaf5a
e57353 enum
f3bb36 {
244f85 ¤   paramErrStrIndex¤   = 1,
211b96 ¤   dskFulErrStrIndex,
46dffd ¤   nsvErrStrIndex,
1d3f25 ¤   ioErrStrIndex,
001d8a ¤   bdNamErrStrIndex,
14a1a3 ¤   fnOpnErrStrIndex,
0218e0 ¤   eofErrStrIndex,
24449e ¤   posErrStrIndex,
5fcaeb ¤   fnfErrStrIndex,
f2c6bf ¤   wPrErrStrIndex,
099a87 ¤   fLckdErrStrIndex,
ec6c08 ¤   vLckdErrStrIndex,
e6f722 ¤   fBsyErrStrIndex,
fa1a95 ¤   dupFNErrStrIndex,
6c0be7 ¤   permErrStrIndex,
04d4f5 ¤   wrPermErrStrIndex,
62a374 ¤   memFullErrStrIndex
9882f7 };
5daf5a
965bd0 typedef struct OSErrorMapping
52bb36 {
457587 ¤   OSStatus¤   error;
5205f9 ¤   short¤  ¤   strIndex;
faaf5a
5a1129 } OSErrorMapping;
2eaf5a
e70ad1 static OSErrorMapping¤  sErrorMappings[] = {
d87d94 ¤   { paramErr, ¤   ¤   paramErrStrIndex ¤  },
a20e4d ¤   { dskFulErr, ¤  ¤   dskFulErrStrIndex ¤ },
bbff8f ¤   { nsvErr, ¤ ¤   ¤   nsvErrStrIndex ¤¤   },
50de2f ¤   { ioErr, ¤  ¤   ¤   ioErrStrIndex ¤ ¤   },
e1769f ¤   { bdNamErr,¤ ¤  ¤   bdNamErrStrIndex ¤  },
203929 ¤   { fnOpnErr, ¤   ¤   fnOpnErrStrIndex ¤  },
eaff73 ¤   { eofErr,¤  ¤   ¤   eofErrStrIndex ¤¤   },
19ae28 ¤   { posErr,¤  ¤   ¤   posErrStrIndex ¤¤   },
256136 ¤   { fnfErr,¤  ¤   ¤   fnfErrStrIndex ¤¤   },
fba2f5 ¤   { wPrErr,¤  ¤   ¤   wPrErrStrIndex ¤¤   },
2a1ebf ¤   { fLckdErr,¤¤   ¤   fLckdErrStrIndex ¤  },
9f674e ¤   { vLckdErr,¤¤   ¤   vLckdErrStrIndex ¤  },
a4b4ea ¤   { fBsyErr,¤ ¤   ¤   fBsyErrStrIndex ¤   },
2f4d34 ¤   { dupFNErr,¤¤   ¤   dupFNErrStrIndex ¤  },
e35c91 ¤   { permErr,¤ ¤   ¤   permErrStrIndex ¤   },
4aea02 ¤   { afpAccessDenied,¤ permErrStrIndex ¤   },
de863c ¤   { wrPermErr,¤   ¤   wrPermErrStrIndex ¤ },
a8e68a ¤   { memFullErr,¤  ¤   memFullErrStrIndex¤ } };
d8af5a
b6af5a
150335 /*____________________________________________________________________________
5f11eb ¤   Get the textual representation of a system error. Returns TRUE if a
422800 ¤   specific error string was found.
7abe56 ______________________________________________________________________________
887fe0 */
68af5a
db7e69 ¤   Boolean
50e214 GetOSErrorString(
b5733a ¤   OSStatus ¤  error,
--65bb 0007c03930f4012022c Page 2 of MacErrors.c
935635 ¤   StringPtr ¤ errorStr)
a6bb36 {
f61dc0 ¤   short¤  strIndex;
c9d410 ¤   Boolean¤foundString;
8bf6fd ¤   UInt32¤ numMappings;
c7cd28 ¤   UInt32¤ mappingIndex;
8eaf5a
0c995f ¤   pgpAssertAddrValid( errorStr, uchar );
eff33c ¤   pgpAssert( error != noErr && error != userCanceledErr );
9bdfc5 ¤   pgpAssert( IsntNull( GetResource( 'STR#', kOSErrorStringListResID ) ) );
f2af5a
573b91 ¤   errorStr[0] = 0;
50d4d6 ¤   strIndex¤   = 0;
251299 ¤   numMappings = sizeof( sErrorMappings ) / sizeof( sErrorMappings[0] );
e7c99c ¤   foundString¤= FALSE;
0caf5a
b8d293 ¤   for( mappingIndex = 0; mappingIndex < numMappings; mappingIndex++ )
7dc7a1 ¤   {
82f8d5 ¤   ¤   if( sErrorMappings[mappingIndex].error == error )
bf5b34 ¤   ¤   {
8f7e67 ¤   ¤   ¤   strIndex = sErrorMappings[mappingIndex].strIndex;
06cdcb ¤   ¤   ¤   break;
810fe4 ¤   ¤   }
219371 ¤   }
16af5a
0842e8 ¤   if( strIndex != 0 )
25c7a1 ¤   {
2b0418 ¤   ¤   GetIndString( errorStr, kOSErrorStringListResID, strIndex );
61fccc ¤   ¤   pgpAssert( errorStr[0] != 0 );
f9af5a
572558 ¤   ¤   foundString = TRUE;
1d9371 ¤   }
57af5a
597c5f ¤   if( errorStr[0] == 0 )
fac7a1 ¤   {
90826e ¤   ¤   NumToString( error, errorStr );
ffefab ¤   ¤   foundString = FALSE;
619371 ¤   }
5daf5a
53996b ¤   return( foundString );
7defe6 }
43af5a
c7af5a
04af5a
840335 /*____________________________________________________________________________
bbec92 ¤   This table maps a PGPError to a mac error.
8aaf5a
ac6933 ¤   The table could be used in either direction, though it may be well-defined
fe9fa3 ¤   in ·all cases which error should be used·
4af7f7 ____________________________________________________________________________*/
731741 typedef struct
e2bb36 {
dff7ef ¤   PGPError¤   pgpErr;
893033 ¤   OSStatus¤   macErr;
c67eb3 } ErrorMappingEntry;
06af5a
8fb175 static const ErrorMappingEntry¤ sErrorMap[] =
01bb36 {
1aa96d ¤   { kPGPError_NoErr,¤ ¤   ¤   ¤   noErr },
47d658 ¤   { kPGPError_FileNotFound,¤  ¤   fnfErr },
531015 ¤   { kPGPError_OutOfMemory,¤   ¤   memFullErr },
7cd9ac ¤   { kPGPError_DiskFull,¤  ¤   ¤   dskFulErr },
547605 ¤   { kPGPError_FileLocked,¤¤   ¤   fLckdErr },
971dc5 ¤   { kPGPError_FileLocked,¤¤   ¤   opWrErr },
98762d ¤   { kPGPError_FilePermissions,¤   permErr },
61f4f1 ¤   { kPGPError_FilePermissions,¤   afpAccessDenied },
63db5f ¤   { kPGPError_EOF,¤   ¤   ¤   ¤   eofErr },
139112 ¤   { kPGPError_UserAbort,¤ ¤   ¤   userCanceledErr },
cc45be ¤   { kPGPError_BadParams,¤ ¤   ¤   paramErr },
4fe823 ¤   { kPGPError_ItemNotFound,¤  ¤   nsvErr },
a782f7 };
7c995b #define kNumErrorMappings¤  ( sizeof( sErrorMap ) / sizeof( sErrorMap[ 0 ] ) )
--78c8 0018ebbbc9f4012022c Page 3 of MacErrors.c
e0af5a
01c744 ¤   PGPError
e233d6 MacErrorToPGPError( OSStatus macErr )
e8bb36 {
f7cfa9 ¤   PGPError¤   ¤   ¤   ¤   ¤   pgpErr;
aabf61 ¤   const ErrorMappingEntry *¤  map¤= sErrorMap;
ff2746 ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   mapIndex;
2767c5 ¤
a96ad0 ¤   /* by default, if we don't find one */
a605d8 ¤   pgpErr¤ = kPGPError_UnknownError;
3a67c5 ¤
feb99a ¤   for( mapIndex = 0; mapIndex < kNumErrorMappings; ++mapIndex)
85c7a1 ¤   {
5ea4bc ¤   ¤   ErrorMappingEntry const¤*¤  entry;
2c1b52 ¤   ¤
95e196 ¤   ¤   entry¤  = &map[ mapIndex ];
591b52 ¤   ¤
2d02de ¤   ¤   if ( entry->macErr == macErr )
305b34 ¤   ¤   {
e594c2 ¤   ¤   ¤   pgpErr¤ = entry->pgpErr;
9bcdcb ¤   ¤   ¤   break;
710fe4 ¤   ¤   }
1c9371 ¤   }
6b67c5 ¤
b093ca ¤   return( pgpErr );
45efe6 }
e9af5a
16af5a
d585ea ¤   OSStatus
1f5d62 PGPErrorToMacError( PGPError¤   pgpErr )
f7bb36 {
94756e ¤   OSStatus¤   ¤   ¤   ¤   ¤   macErr;
56bf61 ¤   const ErrorMappingEntry *¤  map¤= sErrorMap;
f62746 ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   mapIndex;
0b67c5 ¤
e86ad0 ¤   /* by default, if we don't find one */
82523f ¤   macErr¤ = -1;
6a67c5 ¤
dd0175 ¤   for( mapIndex = 0; mapIndex < kNumErrorMappings; ++mapIndex )
03c7a1 ¤   {
f9a4bc ¤   ¤   ErrorMappingEntry const¤*¤  entry;
af1b52 ¤   ¤
b5e196 ¤   ¤   entry¤  = &map[ mapIndex ];
f01b52 ¤   ¤
c1c244 ¤   ¤   if ( entry->pgpErr == pgpErr )
ff5b34 ¤   ¤   {
b08f43 ¤   ¤   ¤   macErr¤ = entry->macErr;
b9cdcb ¤   ¤   ¤   break;
4d0fe4 ¤   ¤   }
519371 ¤   }
3e67c5 ¤
27c1bd ¤   return( macErr );
0defe6 }
c0af5a
6caf5a
d3af5a
1faf5a
82af5a
53af5a
05af5a
8eaf5a
--46c0 0018a351c224012022d Page 1 of MacErrors.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
c2af5a
68419d ¤   $Id: MacErrors.h,v 1.8.16.1 1998/11/12 03:19:33 heller Exp $
79f7f7 ____________________________________________________________________________*/
9baf5a
4d7b7d #pragma once
7baf5a
43b2bf #include <Errors.h>
b6af5a
ae7353 enum
f7bb36 {
be8242 ¤   kOSErrorStringListResID¤¤   = 31600
0382f7 };
d7af5a
3299c6 PGP_BEGIN_C_DECLARATIONS
ea3ffd #if PRAGMA_IMPORT
a9b981 #pragma import on
f47454 #endif
3daf5a
f5af5a
7caf5a
6f367a Boolean¤¤   GetOSErrorString(OSStatus error, StringPtr errorStr);
412efe PGPError¤   MacErrorToPGPError( OSStatus macErr );
17d4dd OSStatus¤   PGPErrorToMacError( PGPError pgpErr );
c5af5a
76af5a
b8af5a
6b3ffd #if PRAGMA_IMPORT
ef2ced #pragma import reset
657454 #endif
501254 PGP_END_C_DECLARATIONS
8aaf5a
--c4c9 000ca81893e4012022e Page 1 of MacEvents.c
a70335 /*____________________________________________________________________________
bdcfc2 ¤   Copyright (C) 1996 Network Associates, Inc. and its affiliates.
994b0f ¤   All rights reserved.
dc67c5 ¤
2549c2 ¤   $Id: MacEvents.c,v 1.4.28.1 1998/11/12 03:19:34 heller Exp $
48f7f7 ____________________________________________________________________________*/
6baf5a
5a090b #include "MacEvents.h"
38af5a
2620b4 #define¤¤   kCommandKeyCode¤¤   ((short) 0x37)
f0ac3a #define¤¤   kShiftKeyCode¤  ¤   ((short) 0x38)
da514d #define¤¤   kCapsLockKeyCode¤   ((short) 0x39)
05e6ad #define¤¤   kOptionKeyCode¤ ¤   ((short) 0x3A)
5b28a9 #define¤¤   kControlKeyCode¤¤   ((short) 0x3B)
ceaf5a
d0ae77 #define¤¤   KeyIsDown(theKeys, keyCode)¤¤   \
88fb3b ¤   ((((const uchar *)(theKeys))[(keyCode) >> 3]) & (1 << ((keyCode) & 7)))
f7af5a
8e0335 /*____________________________________________________________________________
343641 __
8ee25f ¤   Return the state of all keyboard modifier keys
c1be56 ______________________________________________________________________________
a47fe0 */
57af5a
601f8e ¤   UInt16
7c791e GetAllModifiers(void)
90bb36 {
d2f9f6 ¤   UInt16¤ modifiers = 0;
fe3fd3 ¤   KeyMap¤ theKeys;
3faf5a
97150a ¤   GetKeys( theKeys );
78af5a
5832a5 ¤   if( KeyIsDown( theKeys, kCommandKeyCode ) )
7bcb12 ¤   ¤   modifiers |= cmdKey;
89af5a
a9e651 ¤   if( KeyIsDown( theKeys, kShiftKeyCode ) )
26e4df ¤   ¤   modifiers |= shiftKey;
57af5a
8a18df ¤   if( KeyIsDown( theKeys, kCapsLockKeyCode ) )
ad3014 ¤   ¤   modifiers |= alphaLock;
aeaf5a
f222ee ¤   if( KeyIsDown( theKeys, kOptionKeyCode ) )
76f155 ¤   ¤   modifiers |= optionKey;
7eaf5a
d754f0 ¤   if( KeyIsDown( theKeys, kControlKeyCode ) )
9a77aa ¤   ¤   modifiers |= controlKey;
0caf5a
82b286 ¤   return( modifiers );
c1efe6 }
22af5a
1d0335 /*____________________________________________________________________________
193641 __
748180 ¤   Return the state of all keyboard modifier keys except the caps lock key
20be56 ______________________________________________________________________________
c57fe0 */
fbaf5a
fd1f8e ¤   UInt16
51e75d GetModifiers(void)
92bb36 {
d47004 ¤   return( GetAllModifiers() & ~alphaLock );
7eefe6 }
58af5a
260335 /*____________________________________________________________________________
a03641 __
2acb13 ¤   Return TRUE if the caps lock key is down
cfbe56 ______________________________________________________________________________
9a7fe0 */
f1af5a
dd7e69 ¤   Boolean
efe0d6 CapsLockIsDown(void)
65bb36 {
caa2cb ¤   return( ( GetAllModifiers() & alphaLock ) != 0 );
--6c42 0018ef8fc034012022e Page 2 of MacEvents.c
7aefe6 }
46af5a
8eaf5a
--44f7 0016508f7e54012022f Page 1 of MacEvents.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
c2af5a
101156 ¤   $Id: MacEvents.h,v 1.7.16.1 1998/11/12 03:19:34 heller Exp $
74f7f7 ____________________________________________________________________________*/
2faf5a
c57b7d #pragma once
63af5a
d3af5a
bd99c6 PGP_BEGIN_C_DECLARATIONS
2d3ffd #if PRAGMA_IMPORT
b8b981 #pragma import on
9d7454 #endif
26af5a
50af5a
9baf5a
cffbcc UInt16¤ ¤   GetAllModifiers(void);
443eed UInt16¤ ¤   GetModifiers(void);
9e5492 Boolean¤¤   CapsLockIsDown(void);
26af5a
04af5a
2faf5a
7e3ffd #if PRAGMA_IMPORT
9d2ced #pragma import reset
577454 #endif
651254 PGP_END_C_DECLARATIONS
--a157 0005416df0940120230 Page 1 of MacFiles.cp
a70335 /*____________________________________________________________________________
b71368 ¤   MacFiles.cp
6e67c5 ¤
eac97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
cd4b0f ¤   All rights reserved.
9b67c5 ¤
2767c5 ¤
a2af5a
e61ba8 ¤   $Id: MacFiles.cp,v 1.33.12.1 1998/11/12 03:19:35 heller Exp $
cbf7f7 ____________________________________________________________________________*/
e74293 #include <FSM.h>
201ef3 #include <Folders.h>
bc4b15 #include <TextUtils.h>
e4af5a
2f46ad #include "MacDebug.h"
59bbf4 #include "MacFiles.h"
0474e2 #include "MacProcesses.h"
44c110 #include "pgpMacMemory.h"
4e85c2 #include "MacStrings.h"
bb85f6 #include "UInt64.h"
956f74 #include "MacBTree.h"
743eab #include "CWrappers.h"
1d75a9 #include "MacDriverUtils.h"
dcaf5a
8bcd1d #define MIN(a, b )¤ ¤   ( (a) <= (b) ? (a) : (b) )
97af5a
30af5a
303635 const short¤kCacheDisable¤  = 32;
35af5a
65af5a
052b85 ¤   ¤   ¤   ¤
ef0335 /*____________________________________________________________________________
d31566 ¤   Get the catalog information for itemSpec in itemCatalogInfo
84f7f7 ____________________________________________________________________________*/
c085ea ¤   OSStatus
29cb53 FSpGetCatInfo(const FSSpec *itemSpec, CInfoPBRec *itemCatalogInfo)
aebb36 {
00c412 ¤   OSStatus¤   status;
a767c5 ¤
8f28dc ¤   AssertSpecIsValid( itemSpec, "FSpGetCatInfo" );
f46298 ¤   pgpAssertAddrValid( itemCatalogInfo, CInfoPBRec );
5467c5 ¤
254339 ¤   pgpClearMemory( itemCatalogInfo, sizeof( *itemCatalogInfo ) );
b867c5 ¤
f0a679 ¤   itemCatalogInfo->hFileInfo.ioVRefNum¤   = itemSpec->vRefNum;
8f26f2 ¤   itemCatalogInfo->hFileInfo.ioDirID¤ ¤   = itemSpec->parID;
6b7850 ¤   itemCatalogInfo->hFileInfo.ioNamePtr¤   = (uchar *) itemSpec->name;
2267c5 ¤
6fe59e ¤   status = PBGetCatInfoSync( itemCatalogInfo );
2d67c5 ¤
b94afd ¤   return( status );
1defe6 }
ecaf5a
8f0335 /*____________________________________________________________________________
7c324a ¤   Set the catalog information for itemSpec to itemCatalogInfo
54f7f7 ____________________________________________________________________________*/
48af5a
9485ea ¤   OSStatus
a4f98c FSpSetCatInfo(const FSSpec *itemSpec, CInfoPBRec *itemCatalogInfo)
59bb36 {
cec412 ¤   OSStatus¤   status;
e667c5 ¤
ffa281 ¤   AssertSpecIsValid( itemSpec, "FSpSetCatInfo" );
196298 ¤   pgpAssertAddrValid( itemCatalogInfo, CInfoPBRec );
a367c5 ¤
83a679 ¤   itemCatalogInfo->hFileInfo.ioVRefNum¤   = itemSpec->vRefNum;
3226f2 ¤   itemCatalogInfo->hFileInfo.ioDirID¤ ¤   = itemSpec->parID;
377850 ¤   itemCatalogInfo->hFileInfo.ioNamePtr¤   = (uchar *) itemSpec->name;
b667c5 ¤
7502ea ¤   status = PBSetCatInfoSync( itemCatalogInfo );
7667c5 ¤
544afd ¤   return( status );
--5853 000c540fd1240120230 Page 2 of MacFiles.cp
7aefe6 }
46af5a
8eaf5a
79af5a
d07e69 ¤   Boolean
0cb475 FSpExists( const FSSpec *spec )
21bb36 {
1d4f27 ¤   CInfoPBRec¤ cpb;
c367c5 ¤
0557e9 ¤   return( FSpGetCatInfo( spec, &cpb ) == noErr );
57efe6 }
1caf5a
7eaf5a
b56d52 ¤   void
8defb5 GetAllVRefNums(
270deb ¤   short *¤¤   vRefNums,
3de28b ¤   UInt16¤ ¤   maxVRefNums,
8c5f72 ¤   UInt16 *¤   numVRefNums )
7fbb36 {
331acf ¤   UInt16¤ volIndex¤   = 1;
ec8e70 ¤   OSErr¤  err¤= noErr;
1667c5 ¤
4bdb04 ¤   *numVRefNums¤   = 0;
9167c5 ¤
7e9908 ¤   while ( *numVRefNums < maxVRefNums )
22c7a1 ¤   {
fb168e ¤   ¤   XVolumeParam¤   xpb;
071b52 ¤   ¤
58344b ¤   ¤   xpb.ioNamePtr¤  = nil;
31f866 ¤   ¤   xpb.ioVRefNum¤  = 0;
e54e8e ¤   ¤   xpb.ioVolIndex¤ = volIndex;
c31b52 ¤   ¤
5a091e ¤   ¤   err¤= pgpPBXGetVolInfo( &xpb );
3b8cf4 ¤   ¤   if ( IsErr( err ) )
e4cdcb ¤   ¤   ¤   break;
461b52 ¤   ¤
2206c4 ¤   ¤   vRefNums[ volIndex - 1 ] = xpb.ioVRefNum;
011b52 ¤   ¤
499d65 ¤   ¤   *numVRefNums += 1;
011b52 ¤   ¤
31dbcb ¤   ¤   ++volIndex;
d39371 ¤   }
99efe6 }
10af5a
79af5a
ffaf5a
d86d52 ¤   void
e506fa FlushAllVolumes( void )
cebb36 {
14936f ¤   enum { kMaxVRefNums¤ = 200 };
d1ba00 ¤   short¤  vRefNums[ kMaxVRefNums ];
4795cf ¤   UInt16¤ numVRefNums¤= 0;
7a67c5 ¤
df8443 ¤   GetAllVRefNums( vRefNums, kMaxVRefNums, &numVRefNums );
3667c5 ¤
7ae387 ¤   for( UInt16 index = 0; index < numVRefNums; ++index )
a5c7a1 ¤   {
e9647c ¤   ¤   FlushVol( nil, vRefNums[ index ] );
dc9371 ¤   }
efefe6 }
f7af5a
cdaf5a
3baf5a
c60335 /*____________________________________________________________________________
147bdf ¤   GetVolumeBlockCounts: Get the total and free block counts for a volume.
2298fd ¤   All output parameters are optional.
ccf7f7 ____________________________________________________________________________*/
7caf5a
0485ea ¤   OSStatus
f64cb7 GetVolumeBlockCounts(
36b08a ¤   short ¤ vRefNum,
c52d62 ¤   UInt32 ¤*freeBlocks,
--5000 000cec58aa840120230 Page 3 of MacFiles.cp
c344a3 ¤   UInt32 ¤*totalBlocks,
31578a ¤   UInt32 ¤*blockSize)
9cbb36 {
2c25e4 ¤   OSStatus¤   ¤   status;
cf22d3 ¤   XVolumeParam¤   xpb;
67e0aa ¤   Str255¤ ¤   ¤   volumeName;
b867c5 ¤
a06a5c ¤   AssertAddrNullOrValid( freeBlocks, UInt32, "GetVolumeBlockCounts" );
d7a910 ¤   AssertAddrNullOrValid( totalBlocks, UInt32, "GetVolumeBlockCounts" );
fa7365 ¤   AssertAddrNullOrValid( blockSize, UInt32, "GetVolumeBlockCounts" );
4567c5 ¤
2337a0 ¤   pgpClearMemory( &xpb, sizeof( xpb ) );
6c67c5 ¤
c85a1c ¤   xpb.ioVRefNum¤  = vRefNum;
bb0718 ¤   xpb.ioNamePtr¤  = volumeName;
1867c5 ¤
ada0e8 ¤   status = pgpPBXGetVolInfo( &xpb );
c3dd30 ¤   if( IsntErr( status ) )
11c7a1 ¤   {
503087 ¤   ¤   UInt64¤ value64;
c91b52 ¤   ¤
072671 ¤   ¤   if( freeBlocks != nil )
115b34 ¤   ¤   {
66100c ¤   ¤   ¤   value64 = *((UInt64 *) &xpb.ioVFreeBytes);
d8704a ¤   ¤   ¤   *freeBlocks = value64 / xpb.ioVAlBlkSiz;
9f0fe4 ¤   ¤   }
171b52 ¤   ¤
5b4bb8 ¤   ¤   if( totalBlocks != nil )
a85b34 ¤   ¤   {
862818 ¤   ¤   ¤   value64 = *((UInt64 *) &xpb.ioVTotalBytes);
7db31b ¤   ¤   ¤   *totalBlocks = value64 / xpb.ioVAlBlkSiz;
620fe4 ¤   ¤   }
d81b52 ¤   ¤
84b40c ¤   ¤   if( blockSize != nil )
4da80b ¤   ¤   ¤   *blockSize = xpb.ioVAlBlkSiz;
d99371 ¤   }
1e67c5 ¤
ab4afd ¤   return( status );
53efe6 }
f5af5a
33af5a
906d02 ¤   const FCBRec *
12cac8 GetFCBForFile( short fileRefNum )
febb36 {
e7cb6a ¤   return( (const FCBRec *)(LMGetFCBSPtr() + fileRefNum) );
a8efe6 }
a167c5 ¤
5767c5 ¤
2ab203 ¤   const VCB *
41f944 GetVCBForFile( short fileRefNum )
7abb36 {
c429c2 ¤   const FCBRec *¤ fcb¤= GetFCBForFile( fileRefNum);
c256c8 ¤   const VCB *¤¤   vcb¤ = nil;
9467c5 ¤
3bf1fe ¤   if ( IsntNull( fcb ) )
2ee587 ¤   ¤   vcb¤= fcb->fcbVPtr;
6a1b52 ¤   ¤
3a31cb ¤   return( vcb );
20efe6 }
a667c5 ¤
6faf5a
0267c5 ¤
91cd56 ¤   UInt32
4df4de GetVolumeFreeAllocBlocks( short vRefNum )
a0bb36 {
6ddc42 ¤   OSStatus¤   err;
bb5b72 ¤   UInt32¤ ¤   freeBlocks = 0;
c267c5 ¤
923e2b ¤   err = GetVolumeBlockCounts( vRefNum, &freeBlocks, NULL, NULL );
13446c ¤   pgpAssert( IsntErr( err ) );
d567c5 ¤
ce2e0c ¤   return( freeBlocks );
--7601 000a7ec76d440120230 Page 4 of MacFiles.cp
7aefe6 }
be67c5 ¤
1867c5 ¤
be67c5 ¤
b185ea ¤   OSStatus
261120 GetVolumeDriveNumberAndRefNum(
842fea ¤   short¤  ¤   vRefNum,
c845e1 ¤   short *¤¤   driveNumber,
cca70e ¤   short *¤¤   driverRefNum )
b1bb36 {
295f30 ¤   const VCB *¤vcb¤= GetVCBForVolume( vRefNum );
1bb169 ¤   pgpAssert( IsntNull( vcb ) );
a575f8 ¤   OSStatus¤   err¤= noErr;
d567c5 ¤
63aa86 ¤   if ( IsntNull( vcb ) )
99c7a1 ¤   {
7a35fe ¤   ¤   GetDriveNumberAndRefNumForVCB( vcb, driveNumber, driverRefNum );
9a7610 ¤   ¤   err¤= noErr;
219371 ¤   }
8f0e24 ¤   else
80c7a1 ¤   {
eea14c ¤   ¤   err¤= nsvErr;
fa9371 ¤   }
4d67c5 ¤
9edeb7 ¤   return( err );
eeefe6 }
3d67c5 ¤
6667c5 ¤
df67c5 ¤
b9cd56 ¤   UInt32
42c86e GetVolumeAllocBlockSize( short vRefNum )
89bb36 {
dcdc42 ¤   OSStatus¤   err;
9201a2 ¤   UInt32¤ ¤   blockSize = 0;
e067c5 ¤
1b6e1a ¤   err = GetVolumeBlockCounts( vRefNum, NULL, NULL, &blockSize );
b6446c ¤   pgpAssert( IsntErr( err ) );
8e67c5 ¤
73aaae ¤   return( blockSize );
ecefe6 }
b067c5 ¤
c9af5a
4388f9 ¤   short
32b005 GetVolumeForFile( short fileRefNum )
3cbb36 {
b19b46 ¤   const VCB *¤vcb¤= GetVCBForFile( fileRefNum );
2f1582 ¤   short¤  ¤   vRefNum¤= 0;
1f67c5 ¤
98aa86 ¤   if ( IsntNull( vcb ) )
615b34 ¤   ¤   {
88f8b9 ¤   ¤   vRefNum¤= vcb->vcbVRefNum;
600fe4 ¤   ¤   }
1a1b52 ¤   ¤
061b52 ¤   ¤
45c07b ¤   return( vRefNum );
c1efe6 }
4167c5 ¤
fb67c5 ¤
4baf5a
560335 /*____________________________________________________________________________
3341bb ¤   Convert an allocation block number into a disk block number.
da67c5 ¤
3e374b ¤   Allocation blocks start at 'vcb->alBlkStart' disk blocks into the drive.
2df7f7 ____________________________________________________________________________*/
43cd56 ¤   UInt32
083998 AllocBlockNumberToDiskBlockNumber(
fc2fdc ¤   const VCB *¤¤   vcb,
780745 ¤   UInt32¤ ¤   ¤   allocBlockNumber )
2cbb36 {
ff7c73 ¤   pgpAssertAddrValid( vcb, VCB );
6967c5 ¤
a76e7e ¤   UInt32¤ diskBlockNumber;
--7f22 000ae9ad45a40120230 Page 5 of MacFiles.cp
f87d44 ¤   UInt32¤ numDiskBlocksPerAllocBlock;
6167c5 ¤
2fdbef ¤   numDiskBlocksPerAllocBlock¤ = GetVCBAllocBlockSize( vcb ) / kDiskBlockSize;
8d67c5 ¤
d96d28 ¤   diskBlockNumber¤=
6c14ca ¤   ¤   vcb->vcbAlBlSt + allocBlockNumber * numDiskBlocksPerAllocBlock;
c2af5a
0c8028 ¤   return( diskBlockNumber );
37efe6 }
7daf5a
9aaf5a
c5615b typedef struct HFSExtent
f3bb36 {
d42861 ¤   UInt16¤ startBlock;
d0d9fa ¤   UInt16¤ numBlocks;
9467c5 ¤
22d823 } HFSExtent;
a9af5a
bbaf5a
4ed140 ¤   static OSErr
9b18a8 GetHFSExtentsForFork(
0942d9 ¤   short¤  ¤   ¤   ¤   fileRefNum,
491154 ¤   HFSExtent **¤   ¤   extentsListPtr,
680025 ¤   PGPUInt32 *¤¤   ¤   numExtentsPtr)
f7bb36 {
4b5df4 ¤   const FCBRec *¤ ¤   fcb¤= nil;
002159 ¤   const VCB *¤¤   ¤   vcb = nil;
eebc2f ¤   const HFSExtent *¤  fcbExtents;
20441f ¤   const UInt16¤   ¤   kNumFCBExtents¤ = 3;
4eec2a ¤   UInt32¤ ¤   ¤   ¤   numFileAllocBlocks;
848593 ¤   UInt32¤ ¤   ¤   ¤   numFoundAllocBlocks;
714461 ¤   OSErr¤  ¤   ¤   ¤   err¤= noErr;
5bdd68 ¤   UInt32¤ ¤   ¤   ¤   allocationBlockSize;
7dee36 ¤   UInt32¤ ¤   ¤   ¤   numExtents;
608fb0 ¤   HFSExtent¤  ¤   ¤   **extentList;
e567c5 ¤
2a1563 ¤   AssertFileRefNumIsValid( fileRefNum, "GetHFSExtentsForFile" );
9ba46e ¤   pgpAssertAddrValid( numExtentsPtr, UInt32 );
6167c5 ¤
ea1565 ¤   numExtents¤ ¤   ¤   = 0;
c36aab ¤   fcb¤¤   ¤   ¤   ¤   = GetFCBForFile( fileRefNum );
5684a7 ¤   vcb¤¤   ¤   ¤   ¤   = GetVCBForFile( fileRefNum );
c9024f ¤   allocationBlockSize¤= vcb->vcbAlBlkSiz;
8667c5 ¤
429351 ¤   // Use a handle here so we can dynamically grow the list
73a428 ¤   extentList = (HFSExtent **) NewHandle( 0 );
368d0f ¤   if( IsNull( extentList ) )
87f848 ¤   ¤   return( memFullErr );
c567c5 ¤
800633 ¤   FlushFile( fileRefNum );
d167c5 ¤
b2b7b4 ¤   // The physical length should always be a multiple of the
5377fe ¤   // allocation block size, but it doesn't hurt to compensate
022114 ¤   numFileAllocBlocks =
1cbef1 ¤   ¤   ( fcb->fcbPLen + allocationBlockSize - 1 ) / allocationBlockSize;
b4fa48 ¤   pgpAssert( numFileAllocBlocks * allocationBlockSize == fcb->fcbPLen );
5967c5 ¤
ce4fe4 ¤   fcbExtents¤ ¤   ¤   = (const HFSExtent *) &fcb->fcbExtRec[0];
6832a9 ¤   numFoundAllocBlocks = 0;
9267c5 ¤
8f5ac0 ¤   for( UInt32 index = 0; index < kNumFCBExtents; ++index )
c0c7a1 ¤   {
247111 ¤   ¤   const HFSExtent *extent;
ea1b52 ¤   ¤
dda5fa ¤   ¤   extent = &fcbExtents[ index ];
72b268 ¤   ¤   if( extent->numBlocks != 0 )
305b34 ¤   ¤   {
2bb402 ¤   ¤   ¤   err = PtrAndHand( extent, (Handle) extentList, sizeof( *extent ));
ae17c7 ¤   ¤   ¤   if( IsErr( err ) )
f7f622 ¤   ¤   ¤   ¤   break;
ff94aa ¤   ¤   ¤   ¤   ¤   ¤
aead18 ¤   ¤   ¤   ++numExtents;
--95b0 00041131ff740120230 Page 6 of MacFiles.cp
f11b52 ¤   ¤
9b06a5 ¤   ¤   ¤   numFoundAllocBlocks += extent->numBlocks;
ba0fe4 ¤   ¤   }
8c9371 ¤   }
7c1b52 ¤   ¤
2798c5 ¤   if( IsntErr( err ) && numFoundAllocBlocks < numFileAllocBlocks )
8cc7a1 ¤   {
ebc4c6 ¤   ¤   CMacExtentsBTree¤   bTreeObj;
911b52 ¤   ¤
ff6e43 ¤   ¤   err = bTreeObj.OpenVolume( vcb->vcbVRefNum );
26da5e ¤   ¤   if( IsntErr( err ) )
7f5b34 ¤   ¤   {
64ba17 ¤   ¤   ¤   while( IsntErr( err ) )
34f776 ¤   ¤   ¤   {
a39f6c ¤   ¤   ¤   ¤   ExtentDataRecord¤   extentRecord;
41af5a
5bc3c9 ¤   ¤   ¤   ¤   err = bTreeObj.GetExtent( fcb->fcbFlNm,
1a930f ¤   ¤   ¤   ¤   ¤   ¤   ¤   kBTreeDataForkRecordType,
d528cc ¤   ¤   ¤   ¤   ¤   ¤   ¤   numFoundAllocBlocks, &extentRecord );
7a5c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
d472c3 ¤   ¤   ¤   ¤   {
389000 ¤   ¤   ¤   ¤   ¤   for( UInt32 index = 0; index < kNumFCBExtents; ++index )
f84859 ¤   ¤   ¤   ¤   ¤   {
521db1 ¤   ¤   ¤   ¤   ¤   ¤   const HFSExtent *extent;
8294aa ¤   ¤   ¤   ¤   ¤   ¤
c90a81 ¤   ¤   ¤   ¤   ¤   ¤   extent = (HFSExtent *) &extentRecord.extents[index];
8cb0bb ¤   ¤   ¤   ¤   ¤   ¤   if( extent->numBlocks != 0 )
e28fec ¤   ¤   ¤   ¤   ¤   ¤   {
fae216 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PtrAndHand( extent,
055687 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (Handle) extentList, sizeof( *extent ) );
6b459f ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
3fcd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
2f0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
59c0d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ++numExtents;
ae94aa ¤   ¤   ¤   ¤   ¤   ¤
5c4ee8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   numFoundAllocBlocks += extent->numBlocks;
71db3c ¤   ¤   ¤   ¤   ¤   ¤   }
e81c89 ¤   ¤   ¤   ¤   ¤   }
222613 ¤   ¤   ¤   ¤   }
9ca3a6 ¤   ¤   ¤   }
4e0fe4 ¤   ¤   }
9887c7 ¤   ¤   ¤
39bb4e ¤   ¤   if( err == kBTreeRecordNotFoundError )
c9d5ab ¤   ¤   ¤   err = noErr;
dc9371 ¤   }
4b67c5 ¤
c2ee03 ¤   if( IsntErr( err ) )
e1c7a1 ¤   {
b91d04 ¤   ¤   if( numFoundAllocBlocks != numFileAllocBlocks )
445b34 ¤   ¤   {
d28dab ¤   ¤   ¤   // Didn't get all of the extents.
fdbfc3 ¤   ¤   ¤   pgpDebugFmtMsg( ( pgpaFmtPrefix,
74abbf ¤   ¤   ¤   ¤   "GetHFSExtentsForFile:"
dd57b1 ¤   ¤   ¤   ¤   "Missing or extra extents found=%lu num=%lu",
1fbaa9 ¤   ¤   ¤   ¤   numFoundAllocBlocks, numFileAllocBlocks) ··);
ce4b38 ¤   ¤   ¤   err = eofErr;
1e0fe4 ¤   ¤   }
a10e1d ¤   ¤   else
725b34 ¤   ¤   {
73013b ¤   ¤   ¤   HFSExtent¤  *extents;
0387c7 ¤   ¤   ¤
0dffa2 ¤   ¤   ¤   extents = (HFSExtent *) NewPtr( numExtents * sizeof( *extents ) );
16572e ¤   ¤   ¤   if ( IsntNull( extents ) )
f2f776 ¤   ¤   ¤   {
e02baf ¤   ¤   ¤   ¤   // Copy the data from our handle to an allocated pointer
de5f77 ¤   ¤   ¤   ¤   BlockMoveData( *extentList,
a06624 ¤   ¤   ¤   ¤   ¤   extents, numExtents * sizeof( *extents ) );
e62b85 ¤   ¤   ¤   ¤
87a554 ¤   ¤   ¤   ¤   *extentsListPtr¤= extents;
d41890 ¤   ¤   ¤   ¤   *numExtentsPtr ¤= numExtents;
4aa3a6 ¤   ¤   ¤   }
41bb8c ¤   ¤   ¤   else
--19c1 000becdc07c40120230 Page 7 of MacFiles.cp
99f776 ¤   ¤   ¤   {
3a945a ¤   ¤   ¤   ¤   err = memFullErr;
a9a3a6 ¤   ¤   ¤   }
250fe4 ¤   ¤   }
f7f828 ¤   }¤
ff1b52 ¤   ¤
4d3e33 Exit:
71af5a
aa7ca7 ¤   DisposeHandle( (Handle) extentList );
2267c5 ¤
d1deb7 ¤   return( err );
6aefe6 }
a2af5a
cd33c8 ¤   static void
9d3b2e FreeHFSExtentList(HFSExtent *theList)
3abb36 {
d847c1 ¤   if( IsntNull( theList ) )
216149 ¤   ¤   DisposePtr( (Ptr) theList );
83efe6 }
e9af5a
5137be #if 0¤  /* KEEP! [ */
21af5a
0638e5 /*
5b505d ** The following code was provided to us by Apple. We store the Lg2Phys
3070ff ** function as object code only because we want to call it from PPC code.
b67fe0 */
f8af5a
5206b9 /* Structure for parameters passed on the stack to Lg2Phys function: */
a4af5a
caa74b struct Lg2PhysStack
1cbb36 {
786a5b ¤   long¤   returnAddress;
834a15 ¤   long¤   registers[6];
e9cf06 ¤   long¤   fileRefNum;
53ab6a ¤   long¤   filePosition;
bb32fd ¤   long¤   reqCount;
06de05 ¤   long¤   volOffset;
478841 ¤   long¤   contiguousBytes;
9c82f7 };
2baf5a
2f8c33 /* Some system private low memory locations: */
f2af5a
ac7353 enum
a5bb36 {
568224 ¤   FCBSPtr¤¤   = 0x034E,
eeeb2f ¤   FSBusy¤ ¤   = 0x0360,
d87100 ¤   HFSStkTop¤  = 0x036A,
fcb230 ¤   FSCallAsync¤= 0x0342,
b925d1 ¤   JLg2Phys¤   = 0x06FC
fa82f7 };
ccaf5a
9caf5a
cc4085 static asm OSErr Lg2Phys(
67179f ¤   long¤   fileRefNum,
4073f3 ¤   long¤   filePosition,
c8ea64 ¤   long¤   reqCount,
f5d3f1 ¤   long *¤ volOffset,
96456d ¤   long *¤ contiguousBytes)
3cbb36 {
2c6740 ¤   movem.l¤d3-d6/a2/a6,-(sp)¤  ¤   ¤   ¤   ¤   ¤   ¤   // save registers
6867c5 ¤
c4a49c ¤   move.l¤ struct(Lg2PhysStack.fileRefNum)(sp),d1¤ ¤   // d1 = fileRefNum
5030fd ¤   move.l¤ struct(Lg2PhysStack.reqCount)(sp),d4¤   ¤   // d4 = reqCount
2128f4 ¤   move.l¤ struct(Lg2PhysStack.filePosition)(sp),d5¤   // d5 = filePosition
2067c5 ¤
ee6e9f GrabFSLoop:
97de5d ¤   bset¤   #0,FSBusy¤  ¤   ¤   ¤   ¤   ¤   // grab control of the File Manager
aca89c ¤   bne.s¤  GrabFSLoop
8e67c5 ¤
20bd40 ¤   move.l¤ HFSStkTop,a6¤   ¤   ¤   ¤   ¤   // use the File Manager's stack
dcc03f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // (an a6 stack)
be67c5 ¤
--ca35 000f947f49e40120230 Page 8 of MacFiles.cp
427fec ¤   move.l¤ FCBSPtr,a1¤ ¤   ¤   ¤   ¤   ¤   // a1 = pointer to FCB table
4a5e13 ¤   move.l¤ struct(FCBRec.fcbVPtr)(a1,d1.w),a2¤ // a2 = get VCB pointer
9b67c5 ¤
15334c ¤   clr.b¤  FSCallAsync¤¤   ¤   ¤   ¤   ¤   // tell the File Manager it's
a35ac9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // doing a synchronous operation
5767c5 ¤
d03d04 ¤   movea.l¤JLg2Phys,a0¤¤   ¤   ¤   ¤   ¤   // let the FS do the mapping
abdeaa ¤   jsr¤¤   (a0)
8367c5 ¤
d28ed7 ¤   bclr¤   #0,FSBusy¤  ¤   ¤   ¤   ¤   ¤   // all done with the File Manager
6267c5 ¤
373bcf ¤   movea.l¤struct(Lg2PhysStack.volOffset)(sp),a0
c0dcec ¤   move.l¤ d3,(a0)¤¤   ¤   ¤   ¤   ¤   ¤   // return volOffset from d3
794a4b ¤   movea.l¤struct(Lg2PhysStack.contiguousBytes)(sp),a0
23d3a7 ¤   move.l¤ d6,(a0)¤¤   ¤   ¤   ¤   ¤   ¤   // return contiguousBytes from d6
e3af5a
2c1c64 ¤   movem.l¤(sp)+,d3-d6/a2/a6¤  ¤   ¤   ¤   // restore registers
5567c5 ¤
1f40a6 ¤   tst.w¤  d0¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   // set up condition codes
20f5cd ¤   rts¤¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   // and return
ecefe6 }
b5af5a
4d3167 #endif¤ /* ] */
f9af5a
2fda4e typedef OSErr¤  (*Lg2PhysProc)(long fileRefNum, long filePosition,
737244 ¤   ¤   ¤   ¤   ¤   long reqCount, long *volOffset, long *contiguousBytes);
8eaf5a
64fa47 static UInt16 gLg2PhysProcData[] =
e0cebb {¤
a72237 ¤   0x48E7, 0x1E22,¤¤   ¤   ¤   // MOVEM.L ··D3-D6/A2/A6,-(A7)
673b5a ¤   0x222F, 0x001C,¤¤   ¤   ¤   // MOVE.L ···$001C(A7),D1
565e60 ¤   0x282F, 0x0024,¤¤   ¤   ¤   // MOVE.L ···$0024(A7),D4
7cb02e ¤   0x2A2F, 0x0020,¤¤   ¤   ¤   // MOVE.L ···$0020(A7),D5
e16d84 ¤   0x08F8, 0x0000, 0x0360,¤¤   // BSET ·····#$00,$0360
15b441 ¤   0x66F8,¤¤   ¤   ¤   ¤   ¤   // BNE.S ····*-$0006
207373 ¤   0x2C78, 0x036A,¤¤   ¤   ¤   // MOVEA.L ··$036A,A6
daa29c ¤   0x2278, 0x034E,¤¤   ¤   ¤   // MOVEA.L ··$034E,A1
6cf841 ¤   0x2471, 0x1014,¤¤   ¤   ¤   // MOVEA.L ··$14(A1,D1.W),A2
308b06 ¤   0x4238, 0x0342,¤¤   ¤   ¤   // CLR.B ····$0342
1ce595 ¤   0x2078, 0x06FC,¤¤   ¤   ¤   // MOVEA.L ··$06FC,A0
c84072 ¤   0x4E90,¤¤   ¤   ¤   ¤   ¤   // JSR ······(A0)
61e6f5 ¤   0x08B8, 0x0000, 0x0360,¤¤   // BCLR ·····#$00,$0360
6dd062 ¤   0x206F, 0x0028,¤¤   ¤   ¤   // MOVEA.L ··$0028(A7),A0
07e04d ¤   0x2083,¤¤   ¤   ¤   ¤   ¤   // MOVE.L ···D3,(A0)
be8b59 ¤   0x206F, 0x002C,¤¤   ¤   ¤   // MOVEA.L ··$002C(A7),A0
e68197 ¤   0x2086,¤¤   ¤   ¤   ¤   ¤   // MOVE.L ···D6,(A0)
e6ebe8 ¤   0x4CDF, 0x4478,¤¤   ¤   ¤   // MOVEM.L ··(A7)+,D3-D6/A2/A6
e97a88 ¤   0x4A40,¤¤   ¤   ¤   ¤   ¤   // TST.W ····D0
3a6978 ¤   0x4E75¤ ¤   ¤   ¤   ¤   ¤   // RTS
1082f7 };
ebaf5a
249724 #if TARGET_RT_MAC_CFM¤  /* [ */
a4af5a
aee05c /* Note: FSM.h defines a conflicting UPP to call Lg2Phys. Do not use it */
05af5a
4c73f4 enum {
12b3fc ¤   kLg2PhysProcInfo = kCStackBased
47ac1e ¤   ¤   ·| RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
111bfd ¤   ¤   ·| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
28887f ¤   ¤   ·| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
514661 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(long)))
733c19 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(long)))
b6f207 ¤   ¤   ·| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(long)))
2982f7 };
3aaf5a
6ad140 ¤   static OSErr
51405b CallLg2Phys(
3b179f ¤   long¤   fileRefNum,
c273f3 ¤   long¤   filePosition,
db4f15 ¤   long ¤  reqCount,
b944cd ¤   long ¤  *volOffset,
f9bd80 ¤   long ¤  *contiguousBytes)
--bca7 000df69269e40120230 Page 9 of MacFiles.cp
2cbb36 {
d24351 ¤   OSErr¤  err;
dc67c5 ¤
1319b1 ¤   err = CallUniversalProc( (UniversalProcPtr) &gLg2PhysProcData[0],
f84a37 ¤   ¤   ¤   ¤   kLg2PhysProcInfo, fileRefNum, filePosition, reqCount,
138b67 ¤   ¤   ¤   ¤   volOffset, contiguousBytes );
c5af5a
39deb7 ¤   return( err );
92efe6 }
54af5a
3668d8 #else¤  /* ][ */
8caf5a
e0d140 ¤   static OSErr
5a405b CallLg2Phys(
48179f ¤   long¤   fileRefNum,
4a73f3 ¤   long¤   filePosition,
7d4f15 ¤   long ¤  reqCount,
4344cd ¤   long ¤  *volOffset,
9ebd80 ¤   long ¤  *contiguousBytes)
b6bb36 {
560880 ¤   static Boolean¤ inited = FALSE;
c4b7da ¤   Lg2PhysProc¤¤   procPtr;
b27cbf ¤   OSErr¤  ¤   ¤   err;
2067c5 ¤
b2a92e ¤   if( ! inited )
1fc7a1 ¤   {
2e63e6 ¤   ¤   inited = TRUE;
f81b52 ¤   ¤
1cc984 ¤   ¤   FlushInstructionCache();
54aa3e ¤   ¤   FlushDataCache();
2a9371 ¤   }
6daf5a
8937cf ¤   procPtr = (Lg2PhysProc) &gLg2PhysProcData[0];
1867c5 ¤
341b21 ¤   err = (*procPtr)( fileRefNum, filePosition, reqCount,
03b2a2 ¤   ¤   ¤   volOffset, contiguousBytes );
2267c5 ¤
34deb7 ¤   return( err );
96efe6 }
cdaf5a
e97454 #endif
7faf5a
bd38e5 /*
287676 ** Because of a requirement for PGPDisk, GetDiskExtentsForFork always
59d773 ** allocates the list in the System Heap. This is an implementation
7a613c ** detail. Clients should call FreeDiskExtentList to dispose of the list
047fe0 */
5eaf5a
e8d140 ¤   static OSErr
59cb49 GetLg2PhysExtentsForFork(
79f5ad ¤   short¤  ¤   fileRefNum,
3f4f55 ¤   DiskExtent ¤**extentsListPtr,
ed97f1 ¤   PGPUInt32 ¤ *numExtents)
c5bb36 {
ef14d3 ¤   OSErr¤  ¤   err¤= noErr;
042d1f ¤   DiskExtent¤ **extentsHandle;¤
81af5a
db62ed ¤   pgpAssertAddrValid( extentsListPtr, DiskExtent * );
01dec9 ¤   pgpAssertAddrValid( numExtents, PGPUInt32 );
9767c5 ¤
dd6632 ¤   *extentsListPtr = NULL;
1d68b7 ¤   *numExtents¤¤   = 0;
af67c5 ¤
3ddc19 ¤   extentsHandle = (DiskExtent **) NewHandle( 0 );
1d9251 ¤   if ( IsntNull( extentsHandle ) )
39c7a1 ¤   {
49687e ¤   ¤   SInt32¤ bytesRemaining;
b71b52 ¤   ¤
66e46d ¤   ¤   err = GetEOF( fileRefNum, &bytesRemaining );
f7da5e ¤   ¤   if( IsntErr( err ) )
bb5b34 ¤   ¤   {
df4357 ¤   ¤   ¤   SInt32¤ ¤   ¤   filePosition;
--3b27 0004fd7efd040120230 Page 10 of MacFiles.cp
e587c7 ¤   ¤   ¤
b872cb ¤   ¤   ¤   // Lg2Phys requires bytesRemaining up to nearest 512.
153514 ¤   ¤   ¤   bytesRemaining ¤= ( ( bytesRemaining + kDiskBlockSize - 1 ) /
1d36c6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDiskBlockSize ) * kDiskBlockSize;·
e2af8c ¤   ¤   ¤   filePosition ¤  = 0;
7f87c7 ¤   ¤   ¤
ccf7d1 ¤   ¤   ¤   while( bytesRemaining > 0 && IsntErr( err ) )
71f776 ¤   ¤   ¤   {
c46cab ¤   ¤   ¤   ¤   SInt32¤ ¤   contiguousBytes;
ba7534 ¤   ¤   ¤   ¤   DiskExtent¤ curExtent;
032b85 ¤   ¤   ¤   ¤
20be3d ¤   ¤   ¤   ¤   err = CallLg2Phys( fileRefNum, filePosition, bytesRemaining,
4fa6b4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (long *) &curExtent.diskBlockIndex,
486bd8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   &contiguousBytes );
cc5c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
6e72c3 ¤   ¤   ¤   ¤   {
106214 ¤   ¤   ¤   ¤   ¤   curExtent.numBlocks = contiguousBytes / kDiskBlockSize;
47ae30 ¤   ¤   ¤   ¤   ¤
85668e ¤   ¤   ¤   ¤   ¤   err = PtrAndHand( &curExtent, (Handle) extentsHandle,
6e11e9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( curExtent ) );
85598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
694859 ¤   ¤   ¤   ¤   ¤   {
603090 ¤   ¤   ¤   ¤   ¤   ¤   *numExtents¤+= 1;
6a1c89 ¤   ¤   ¤   ¤   ¤   }
402613 ¤   ¤   ¤   ¤   }
12af5a
ead2da ¤   ¤   ¤   ¤   bytesRemaining ¤-= contiguousBytes;
a3269e ¤   ¤   ¤   ¤   filePosition ¤  += contiguousBytes;
13a3a6 ¤   ¤   ¤   }
750fe4 ¤   ¤   }
9c1b52 ¤   ¤
88cdc4 ¤   ¤   if( IsntErr( err ) && *numExtents > 0 )
465b34 ¤   ¤   {
e6a9bd ¤   ¤   ¤   UInt32¤ extentListSize;
a387c7 ¤   ¤   ¤
5d8f8a ¤   ¤   ¤   extentListSize = ( *numExtents * sizeof( DiskExtent ) );
3087c7 ¤   ¤   ¤
e18f16 ¤   ¤   ¤   *extentsListPtr = (DiskExtent *) NewPtrSys( extentListSize );
a16f20 ¤   ¤   ¤   if( IsntNull( *extentsListPtr ) )
73f776 ¤   ¤   ¤   {
0474ba ¤   ¤   ¤   ¤   pgpCopyMemory( *extentsHandle, *extentsListPtr,
978b5d ¤   ¤   ¤   ¤   ¤   ¤   ¤   extentListSize );
11a3a6 ¤   ¤   ¤   }
0abb8c ¤   ¤   ¤   else
79f776 ¤   ¤   ¤   {
22945a ¤   ¤   ¤   ¤   err = memFullErr;
f6a3a6 ¤   ¤   ¤   }
600fe4 ¤   ¤   }
7d1b52 ¤   ¤
3c058b ¤   ¤   DisposeHandle( (Handle) extentsHandle );
729371 ¤   }
3c0e24 ¤   else
a3c7a1 ¤   {
8c3dca ¤   ¤   err¤= memFullErr;
c89371 ¤   }
2d1b52 ¤   ¤
a8deb7 ¤   return( err );
60efe6 }
0baf5a
6fd140 ¤   static OSErr
4f8768 ConvertHFSExtentsToDiskExtents(
379c26 ¤   const HFSExtent *¤  hfsExtents,
d71d9d ¤   UInt32¤ ¤   ¤   ¤   numHFSExtents,
a2e990 ¤   UInt32¤ ¤   ¤   ¤   allocBlockStart,
b27517 ¤   UInt32¤ ¤   ¤   ¤   allocBlockSize,
b9bb3d ¤   DiskExtent **¤  ¤   diskExtentsListPtr)
b8bb36 {
5c14d3 ¤   OSErr¤  ¤   err¤= noErr;
01b16a ¤   DiskExtent *diskExtents;¤
9faf5a
b26b74 ¤   pgpAssertAddrValid( hfsExtents, HFSExtent );
4f62f5 ¤   pgpAssertAddrValid( diskExtentsListPtr, DiskExtent * );
--0a25 000e400c28640120230 Page 11 of MacFiles.cp
2a67c5 ¤
988fe3 ¤   diskExtents¤= (DiskExtent *)NewPtrSysClear( numHFSExtents *
4b21ff ¤   ¤   ¤   ¤   ¤   ¤   sizeof( diskExtents[ 0 ] ) );
08de3e ¤   if ( IsntNull( diskExtents ) )
79c7a1 ¤   {
f90536 ¤   ¤   const UInt32¤   kNumDiskBlocksPerAllocBlock¤= allocBlockSize /
587deb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDiskBlockSize;
1081bc ¤   ¤   DiskExtent¤ ¤   *curDiskExtent;
0904d8 ¤   ¤   const HFSExtent *curHFSExtent;
6902dc ¤   ¤   const HFSExtent *lastHFSExtent;
571b52 ¤   ¤
3e43fb ¤   ¤   curDiskExtent ¤ = &diskExtents[0];
c9a929 ¤   ¤   curHFSExtent ¤  = &hfsExtents[0];
757bfb ¤   ¤   lastHFSExtent ¤ = curHFSExtent + numHFSExtents - 1;
901b52 ¤   ¤
d6c420 ¤   ¤   while( curHFSExtent <= lastHFSExtent )
bd5b34 ¤   ¤   {
c5a1ba ¤   ¤   ¤   UInt32¤ numDiskBlocksInThisExtent;
5387c7 ¤   ¤   ¤
261a05 ¤   ¤   ¤   numDiskBlocksInThisExtent = curHFSExtent->numBlocks *
cf1b67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNumDiskBlocksPerAllocBlock;
29af5a
3d2520 ¤   ¤   ¤   curDiskExtent->numBlocks¤   ¤   = numDiskBlocksInThisExtent;
ad1bde ¤   ¤   ¤   curDiskExtent->diskBlockIndex¤  = allocBlockStart +
05baf1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   curHFSExtent->startBlock *
ddf712 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNumDiskBlocksPerAllocBlock;
98e187 ¤   ¤   ¤   ++curDiskExtent;
138e75 ¤   ¤   ¤   ++curHFSExtent;
de0fe4 ¤   ¤   }
219371 ¤   }
b40e24 ¤   else
80c7a1 ¤   {
893dca ¤   ¤   err¤= memFullErr;
149371 ¤   }
9c1b52 ¤   ¤
e13c0e ¤   *diskExtentsListPtr¤= diskExtents;
d8af5a
e5deb7 ¤   return( err );
95efe6 }
afaf5a
3ceacd ¤   OSErr
b21878 GetDiskExtentsForFork(
68f5ad ¤   short¤  ¤   fileRefNum,
c04f55 ¤   DiskExtent ¤**extentsListPtr,
de97f1 ¤   PGPUInt32 ¤ *numExtents)
b1bb36 {
c74351 ¤   OSErr¤  err;
a367c5 ¤
4b0d04 ¤   err = GetLg2PhysExtentsForFork( fileRefNum, extentsListPtr, numExtents );
ffe10e ¤   if( IsErr( err ) )
a4c7a1 ¤   {
a2a778 ¤   ¤   const VCB¤  *vcb;
3d1b52 ¤   ¤
6b8b87 ¤   ¤   // Revert to the old way of getting the extents if the volume
912fd1 ¤   ¤   // is HFS only
5512fb ¤   ¤   pgpDebugMsg( "Lg2Phys failed!" );
6d1b52 ¤   ¤
198333 ¤   ¤   vcb¤= GetVCBForFile( fileRefNum );
245e1a ¤   ¤   pgpAssert( IsntNull( vcb ) );
3b1b52 ¤   ¤
aaf26c ¤   ¤   if( vcb->vcbSigWord == kHFSVolumeSignature )
d15b34 ¤   ¤   {
481e15 ¤   ¤   ¤   HFSExtent¤  *hfsExtents;
8d1b52 ¤   ¤
16215b ¤   ¤   ¤   err¤= GetHFSExtentsForFork( fileRefNum, &hfsExtents,
1d6d5d ¤   ¤   ¤   ¤   ¤   ¤   numExtents);
f46108 ¤   ¤   ¤   if( IsntErr( err ) )
d1f776 ¤   ¤   ¤   {
6b82ae ¤   ¤   ¤   ¤   err¤= ConvertHFSExtentsToDiskExtents( hfsExtents,
55f76a ¤   ¤   ¤   ¤   ¤   ¤   ¤   *numExtents, vcb->vcbAlBlSt,
fa3bff ¤   ¤   ¤   ¤   ¤   ¤   ¤   vcb->vcbAlBlkSiz, extentsListPtr);
e42b85 ¤   ¤   ¤   ¤
--2069 00096465ff040120230 Page 12 of MacFiles.cp
fd227c ¤   ¤   ¤   ¤   FreeHFSExtentList( hfsExtents );
c3a3a6 ¤   ¤   ¤   }
700fe4 ¤   ¤   }
ed9371 ¤   }
a367c5 ¤
72deb7 ¤   return( err );
57efe6 }
f8af5a
716d52 ¤   void
d6c4b4 FreeDiskExtentList(DiskExtent *theList)
efbb36 {
1d47c1 ¤   if( IsntNull( theList ) )
eb6149 ¤   ¤   DisposePtr( (Ptr) theList );
30efe6 }
5eaf5a
8feacd ¤   OSErr
729434 GetVolumeName(
192fea ¤   short¤  ¤   vRefNum,
7f14f3 ¤   StringPtr¤  name )
d5bb36 {
f822d3 ¤   XVolumeParam¤   xpb;
c76920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
7f67c5 ¤
6d5a1c ¤   xpb.ioVRefNum¤  = vRefNum;
1e1235 ¤   xpb.ioVolIndex¤ = 0;
6284fe ¤   xpb.ioNamePtr¤  = name;
8467c5 ¤
26cc4b ¤   err¤= pgpPBXGetVolInfo( &xpb );
3a67c5 ¤
71deb7 ¤   return( err );
a2efe6 }
81af5a
f4af5a
aeeacd ¤   OSErr
d06edc GetVolumeDates(
f3d772 ¤   short¤  vRefNum,
342564 ¤   long *¤ creationDate,
582341 ¤   long *¤ modificationDate )
76bb36 {
0e22d3 ¤   XVolumeParam¤   xpb;
516920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
305130 ¤   Str255¤ ¤   ¤   name;
b367c5 ¤
fb5a1c ¤   xpb.ioVRefNum¤  = vRefNum;
cc1235 ¤   xpb.ioVolIndex¤ = 0;
fb84fe ¤   xpb.ioNamePtr¤  = name;
c967c5 ¤
24cc4b ¤   err¤= pgpPBXGetVolInfo( &xpb );
a25ecc ¤   if ( IsntErr( err ) )
6bc7a1 ¤   {
92c682 ¤   ¤   if ( IsntNull( creationDate ) )
a05fd1 ¤   ¤   ¤   *creationDate = xpb.ioVCrDate;
5187c7 ¤   ¤   ¤
fc066f ¤   ¤   if ( IsntNull( modificationDate ) )
2a64ca ¤   ¤   ¤   *modificationDate = xpb.ioVLsMod;
2e9371 ¤   }
2967c5 ¤
0cdeb7 ¤   return( err );
28efe6 }
a9af5a
1267c5 ¤
d0af5a
aaaf5a
cb0335 /*____________________________________________________________________________
87c32d ¤   Read specified number of bytes at specified offset in the file. The file
954622 ¤   position is preserved. bytesRead is optional
b0f7f7 ____________________________________________________________________________*/
cfaf5a
4a85ea ¤   OSStatus
732b09 FSReadAtOffset(
356a75 ¤   short ¤ fileRefNum,
967540 ¤   UInt32¤ writeOffset,
--80c1 000fd820ef640120230 Page 13 of MacFiles.cp
5da205 ¤   UInt32 ¤bytesToRead,
a9361b ¤   void¤   *buffer,
62c814 ¤   UInt32¤ *bytesRead,
950eda ¤   Boolean¤restoreFilePos )
acc7a1 ¤   {
d5c412 ¤   OSStatus¤   status;
45dd16 ¤   UInt32¤ ¤   saveFilePos;
6d67c5 ¤
74aeaa ¤   AssertFileRefNumIsValid( fileRefNum, "FSReadAtOffset" );
d71741 ¤   pgpAssertAddrValid( buffer, uchar );
eb027d ¤   AssertAddrNullOrValid( bytesRead, UInt32, "FSReadAtOffset" );
cf67c5 ¤
7f8742 ¤   status = GetFPos( fileRefNum, (long *) &saveFilePos );
75dd30 ¤   if( IsntErr( status ) )
6f5b34 ¤   ¤   {
641793 ¤   ¤   status = SetFPos( fileRefNum, fsFromStart, writeOffset );
c5706e ¤   ¤   if( IsntErr( status ) )
9cf776 ¤   ¤   ¤   {
2016d8 ¤   ¤   ¤   UInt32¤ readCount = bytesToRead;
b387c7 ¤   ¤   ¤
8a858c ¤   ¤   ¤   status = FSRead( fileRefNum, (long *) &readCount, buffer );
1187c7 ¤   ¤   ¤
2d7040 ¤   ¤   ¤   if( IsntNull( bytesRead ) )
a177d2 ¤   ¤   ¤   ¤   *bytesRead = readCount;
d387c7 ¤   ¤   ¤
845cd6 ¤   ¤   ¤   if ( restoreFilePos )
2a72c3 ¤   ¤   ¤   ¤   {
e28788 ¤   ¤   ¤   ¤   (void) SetFPos( fileRefNum, fsFromStart, saveFilePos );
192613 ¤   ¤   ¤   ¤   }
27a3a6 ¤   ¤   ¤   }
2a0fe4 ¤   ¤   }
c51b52 ¤   ¤
174afd ¤   return( status );
9d9371 ¤   }
eaaf5a
d40335 /*____________________________________________________________________________
aa3e0b ¤   Write specified number of bytes at specified offset in the file. The file
1b9485 ¤   position is preserved. bytesWritten is optional
59f7f7 ____________________________________________________________________________*/
b1af5a
9085ea ¤   OSStatus
ea19e5 FSWriteAtOffset(
692770 ¤   short ¤ ¤   fileRefNum,
4d50d2 ¤   UInt32¤ ¤   writeOffset,
578322 ¤   UInt32 ¤¤   bytesToWrite,
3a4571 ¤   const void¤ *buffer,
d0a32e ¤   UInt32¤ ¤   *bytesWritten,
b1968f ¤   Boolean¤¤   restoreFilePos)
6fc7a1 ¤   {
11c412 ¤   OSStatus¤   status;
00dd16 ¤   UInt32¤ ¤   saveFilePos;
2c67c5 ¤
4af7ca ¤   AssertFileRefNumIsValid( fileRefNum, "FSWriteAtOffset" );
e81741 ¤   pgpAssertAddrValid( buffer, uchar );
6a1a40 ¤   AssertAddrNullOrValid( bytesWritten, UInt32, "FSWriteAtOffset" );
cb67c5 ¤
f4b838 ¤   if( IsntNull( bytesWritten ) )
97edf0 ¤   ¤   *bytesWritten = 0;
9daf5a
138742 ¤   status = GetFPos( fileRefNum, (long *) &saveFilePos );
0bdd30 ¤   if( IsntErr( status ) )
f35b34 ¤   ¤   {
111793 ¤   ¤   status = SetFPos( fileRefNum, fsFromStart, writeOffset );
a9706e ¤   ¤   if( IsntErr( status ) )
30f776 ¤   ¤   ¤   {
19a3e0 ¤   ¤   ¤   UInt32¤ writeCount = bytesToWrite;
a987c7 ¤   ¤   ¤
052dca ¤   ¤   ¤   status = FSWrite( fileRefNum, (long *) &writeCount, buffer );
8b87c7 ¤   ¤   ¤
c0f787 ¤   ¤   ¤   if( IsntNull( bytesWritten ) )
d6e786 ¤   ¤   ¤   ¤   *bytesWritten = writeCount;
fd2b85 ¤   ¤   ¤   ¤
--b7ab 00091bd1b4140120230 Page 14 of MacFiles.cp
b55cd6 ¤   ¤   ¤   if ( restoreFilePos )
7072c3 ¤   ¤   ¤   ¤   {
da8788 ¤   ¤   ¤   ¤   (void) SetFPos( fileRefNum, fsFromStart, saveFilePos );
482613 ¤   ¤   ¤   ¤   }
bea3a6 ¤   ¤   ¤   }
fd0fe4 ¤   ¤   }
b91b52 ¤   ¤
274afd ¤   return( status );
bb9371 ¤   }
2aaf5a
18af5a
c4af5a
4caf5a
6f7e69 ¤   Boolean
32691b FSpEqual(const FSSpec *spec1, const FSSpec *spec2)
fcbb36 {
fed3a3 ¤   AssertSpecIsValid( spec1, "FSpEqual" );
cbe3b2 ¤   AssertSpecIsValid( spec2, "FSpEqual" );
1867c5 ¤
aa655b ¤   if( spec1->parID == spec2->parID )
38c7a1 ¤   {
3e7384 ¤   ¤   if( spec1->vRefNum == spec2->vRefNum )
955b34 ¤   ¤   {
8cca46 ¤   ¤   ¤   if( EqualString( spec1->name, spec2->name, FALSE, TRUE ) )
eaf776 ¤   ¤   ¤   {
6738a9 ¤   ¤   ¤   ¤   return( TRUE );
30a3a6 ¤   ¤   ¤   }
a60fe4 ¤   ¤   }
909371 ¤   }
8e67c5 ¤
e853dc ¤   return( FALSE );
09efe6 }
3aaf5a
4aaf5a
2c85ea ¤   OSStatus
07a39a FlushFile(short fileRefNum)
eabb36 {
4f2ece ¤   ParamBlockRec¤  pb;
4825e4 ¤   OSStatus¤   ¤   status;
4b67c5 ¤
f83f60 ¤   AssertFileRefNumIsValid( fileRefNum, "FlushFile" );
3a67c5 ¤
f7fa21 ¤   pb.ioParam.ioCompletion¤= nil;
05e754 ¤   pb.ioParam.ioNamePtr¤   = nil;
234faf ¤   pb.ioParam.ioRefNum¤¤   = fileRefNum;
c367c5 ¤
91152d ¤   status = PBFlushFileSync( &pb );
a0af5a
734afd ¤   return( status );
73efe6 }
10af5a
82af5a
7aaf5a
2daf5a
1c85ea ¤   OSStatus
8917cc GetSpecFromRefNum(
d57dbe ¤   short¤  ¤   refNum,
4a5373 ¤   FSSpec *¤   spec)
e9c7a1 ¤   {
6475f8 ¤   OSStatus¤   err¤= noErr;
dfe71b ¤   FCBPBRec¤   pb;
c167c5 ¤
82db05 ¤   pb.ioFCBIndx¤   = 0;
5fb42f ¤   pb.ioRefNum¤¤   = refNum;
a54291 ¤   pb.ioNamePtr¤   = spec->name;
b6135b ¤   err¤= PBGetFCBInfoSync( &pb );
b85ecc ¤   if ( IsntErr( err ) )
3f5b34 ¤   ¤   {
1dd753 ¤   ¤   spec->vRefNum¤  = pb.ioFCBVRefNum;
4b6f41 ¤   ¤   spec->parID¤¤   = pb.ioFCBParID;
a10fe4 ¤   ¤   }
9167c5 ¤
--9f28 00080d005bf40120230 Page 15 of MacFiles.cp
afdeb7 ¤   return( err );
049371 ¤   }
c4af5a
7aaf5a
6185ea ¤   OSStatus
6d9bf4 GetSpecFromFCBTable(
9e7dbe ¤   short¤  ¤   refNum,
6f5373 ¤   FSSpec *¤   spec)
19c7a1 ¤   {
7475f8 ¤   OSStatus¤   err¤= noErr;
fd67c5 ¤
58f2bc ¤   const FCBRec *¤ fcb¤= (const FCBRec *)( (Ptr)LMGetFCBSPtr() + refNum );
f967c5 ¤
3ba547 ¤   spec->vRefNum¤  = fcb->fcbVPtr->vcbVRefNum;
00fb9e ¤   spec->parID¤¤   = fcb->fcbDirID;
93133c ¤   CopyPString( fcb->fcbCName, spec->name );
a267c5 ¤
bedeb7 ¤   return( err );
ab9371 ¤   }
9faf5a
e0af5a
d30335 /*____________________________________________________________________________
8eee8e ¤   Find the refnum for open file.
1bf7f7 ____________________________________________________________________________*/
4eaf5a
2f85d3 OSStatus
8df951 FSpFindOpenForkRef(
20bf4e ¤   FSSpec *¤   inSpec,
b502b8 ¤   Boolean¤¤   inResFork,
ad2233 ¤   SInt16 *¤   outRefNum)
64bb36 {
a814d9 ¤   OSErr¤  ¤   result = noErr;
3ec23c ¤   FCBPBRec¤   paramBlock;
24f6a1 ¤   FSSpec¤ ¤   testSpec;
02f8be ¤   Str32¤  ¤   fileName;
4067c5 ¤
bef523 ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
880fd6 ¤   paramBlock.ioVRefNum = inSpec->vRefNum;
850869 ¤   paramBlock.ioFCBIndx = 1;
25c2b7 ¤   paramBlock.ioNamePtr = fileName;
4467c5 ¤
9d220e ¤   for (;;) {
bc7c1b ¤   ¤   result = ::PBGetFCBInfoSync(&paramBlock);
794b8b ¤   ¤   if (result != noErr) {
85cdcb ¤   ¤   ¤   break;
c60fe4 ¤   ¤   }
5d1b52 ¤   ¤
37b8e0 ¤   ¤   if ((inResFork && (paramBlock.ioFCBFlags & 0x0200))
60ee80 ¤   ¤   || (!inResFork && !(paramBlock.ioFCBFlags & 0x0200))) {
cde813 ¤   ¤   ¤   result = ::FSMakeFSSpec(¤   paramBlock.ioVRefNum,
6c557e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   paramBlock.ioFCBParID,
467cfe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   paramBlock.ioNamePtr,
694930 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &testSpec);
28725f ¤   ¤   ¤   if ((result != noErr) || FSpEqual(inSpec, &testSpec)) {
90f622 ¤   ¤   ¤   ¤   break;
0aa3a6 ¤   ¤   ¤   }
2a0fe4 ¤   ¤   }
4300fd ¤   ¤   paramBlock.ioFCBIndx++;
879371 ¤   }
ed67c5 ¤
f945e1 ¤   if (result == noErr) {
26ddf8 ¤   ¤   *outRefNum = paramBlock.ioRefNum;
4af037 ¤   } else {
064c61 ¤   ¤   *outRefNum = -1;
8b9371 ¤   }
2e67c5 ¤
a65d73 ¤   return result;
5defe6 }
41af5a
b2af5a
97af5a
806d52 ¤   void
--b6a1 0007974e2c740120230 Page 16 of MacFiles.cp
9e7c50 GetDriveNumberAndRefNumForVCB(
9afb38 ¤   const VCB *¤vcb,
b145e1 ¤   short *¤¤   driveNumber,
e0a70e ¤   short *¤¤   driverRefNum )
7fc7a1 ¤   {
a77c73 ¤   pgpAssertAddrValid( vcb, VCB );
0867c5 ¤
355ee1 ¤   *driveNumber¤   = vcb->vcbDrvNum;
ef26c8 ¤   *driverRefNum¤  = vcb->vcbDRefNum;
b89371 ¤   }
22af5a
ddaf5a
e0af5a
68af5a
21af5a
65b203 ¤   const VCB *
42106b GetVCBForVolume( short vRefNum )
99c7a1 ¤   {
6cc052 ¤   pgpAssert( vRefNum < 0 );
5567c5 ¤
df82bc ¤   const VCB *¤vcb¤= (const VCB *)GetVCBQHdr()->qHead;
6e67c5 ¤
ff94ad ¤   while ( IsntNull( vcb ) )
5c5b34 ¤   ¤   {
466e04 ¤   ¤   if ( vcb->vcbVRefNum == vRefNum )
f7cdcb ¤   ¤   ¤   break;
9e87c7 ¤   ¤   ¤
8bd6c0 ¤   ¤   vcb¤= (const VCB *)vcb->qLink;
280fe4 ¤   ¤   }
7167c5 ¤
cab169 ¤   pgpAssert( IsntNull( vcb ) );
2d67c5 ¤
8531cb ¤   return( vcb );
909371 ¤   }
96af5a
1baf5a
bb85ea ¤   OSStatus
527ddc FSGetUniqueName(
d7d8dd ¤   short ¤ ¤   ¤   ¤   vRefNum,
a5fdd1 ¤   long ¤  ¤   ¤   ¤   dirID,
4e385f ¤   ConstStr255Param ¤  baseName,
cfc015 ¤   StringPtr ¤ ¤   ¤   uniqueName)
9fbb36 {
94fc44 ¤   FSSpec¤ ¤   fileSpec;
702384 ¤   OSStatus¤   status ¤¤   = noErr;
f067c5 ¤
5027c1 ¤   pgpAssertAddrValid( baseName, uchar );
dcea50 ¤   pgpAssertAddrValid( uniqueName, uchar );
5567c5 ¤
3a727e ¤   fileSpec.vRefNum¤   = vRefNum;
dc9182 ¤   fileSpec.parID¤ ¤   = dirID;
cfc13e ¤   CopyPString( baseName, fileSpec.name );
be60cf ¤   if ( FSpExists( &fileSpec ) )
91c7a1 ¤   {
0ffe81 ¤   ¤   UInt32¤ ¤   uniqueID ¤  = 1;
1967c5 ¤
27434b ¤   ¤   while( TRUE )
925b34 ¤   ¤   {
fdecbe ¤   ¤   ¤   Str32¤  ¤   uniqueIDStr;
aecaab ¤   ¤   ¤   CInfoPBRec¤ cpb;
0887c7 ¤   ¤   ¤
7b4f2f ¤   ¤   ¤   CopyPString( baseName, fileSpec.name );
11f771 ¤   ¤   ¤   NumToString( uniqueID, uniqueIDStr );
2387c7 ¤   ¤   ¤
2ed88d ¤   ¤   ¤   if( fileSpec.name[0] > kMaxHFSFileNameLength - uniqueIDStr[0] - 1)
1aa0fd ¤   ¤   ¤   ¤   fileSpec.name[0] = kMaxHFSFileNameLength - uniqueIDStr[0] - 1;
832b85 ¤   ¤   ¤   ¤
4cba32 ¤   ¤   ¤   AppendPString( "\p ", fileSpec.name );
0a8d0a ¤   ¤   ¤   AppendPString( uniqueIDStr, fileSpec.name );
471b52 ¤   ¤
a70b94 ¤   ¤   ¤   status = FSpGetCatInfo( &fileSpec, &cpb );
791fdb ¤   ¤   ¤   if( IsErr( status ) )
--4ded 0003d3de3cf40120230 Page 17 of MacFiles.cp
99f776 ¤   ¤   ¤   {
850eca ¤   ¤   ¤   ¤   if( status == fnfErr )
eb07f2 ¤   ¤   ¤   ¤   ¤   status = noErr;
8aae30 ¤   ¤   ¤   ¤   ¤
94f622 ¤   ¤   ¤   ¤   break;
4da3a6 ¤   ¤   ¤   }
4f87c7 ¤   ¤   ¤
b558d7 ¤   ¤   ¤   ++uniqueID;
c00fe4 ¤   ¤   }
c19371 ¤   }
ae67c5 ¤
ec01fb ¤   CopyPString( fileSpec.name, uniqueName );
3b67c5 ¤
e14afd ¤   return( status );
bbefe6 }
08af5a
8baf5a
0d85ea ¤   OSStatus
5dcf3b FSpGetUniqueSpec(
eefbb6 ¤   const FSSpec *¤ spec,
a24551 ¤   FSSpec *¤   ¤   outSpec )
72bb36 {
90dc42 ¤   OSStatus¤   err;
fb67c5 ¤
6dc163 ¤   outSpec->vRefNum¤   = spec->vRefNum;
5c3d39 ¤   outSpec->parID¤ ¤   = spec->parID;
7967c5 ¤
fdef8b ¤   err¤= FSGetUniqueName( spec->vRefNum, spec->parID,
41b53f ¤   ¤   ¤   spec->name, outSpec->name );
5067c5 ¤
f3deb7 ¤   return( err );
2cefe6 }
6caf5a
f5af5a
b9af5a
2e2473 ¤   static OSStatus
80f362 GetDirFullPath(short vRefNum, long callerDirID, StringPtr path)
91bb36 {
a2c412 ¤   OSStatus¤   status;
cf4f27 ¤   CInfoPBRec¤ cpb;
811821 ¤   long¤   ¤   dirIDList[40];
cce856 ¤   long¤   ¤   dirIDIndex;
9ffc9b ¤   long¤   ¤   dirID;
c7af5a
634328 ¤   pgpAssertAddrValid( path, uchar );
9f67c5 ¤
6afe47 ¤   path[0] ¤   = 0;
303996 ¤   dirID¤  ¤   = callerDirID;
88e945 ¤   dirIDIndex ¤= 0;
d21b52 ¤   ¤
a1d990 ¤   // Build up a list of directory ID's from the file spec to the root.
b967c5 ¤
5ccfa1 ¤   do
2dc7a1 ¤   {
e920f6 ¤   ¤   Str255¤ dirName;
a21b52 ¤   ¤
3be8a1 ¤   ¤   dirIDList[dirIDIndex++] = dirID;
9967c5 ¤
966d68 ¤   ¤   cpb.dirInfo.ioVRefNum ¤ = vRefNum;
b42c2f ¤   ¤   cpb.dirInfo.ioDrDirID ¤ = dirID;
d81edd ¤   ¤   cpb.dirInfo.ioNamePtr¤  = dirName;
0530c6 ¤   ¤   cpb.dirInfo.ioFDirIndex¤= -1;
681b52 ¤   ¤
475fbb ¤   ¤   status = PBGetCatInfoSync( &cpb );
3d28d3 ¤   ¤   if( IsErr( status ) )
55cdcb ¤   ¤   ¤   break;
5a1b52 ¤   ¤
916744 ¤   ¤   dirID = cpb.dirInfo.ioDrParID;
b51b52 ¤   ¤
8d3a5d ¤   } while( dirID != fsRtParID );
9aaf5a
3ddd30 ¤   if( IsntErr( status ) )
--5860 0005c812a5740120230 Page 18 of MacFiles.cp
f7c7a1 ¤   {
7664bc ¤   ¤   --dirIDIndex;
5c1b52 ¤   ¤
1f4fb7 ¤   ¤   // Use the list of directory ids to get the path items.
d91b52 ¤   ¤
b4cb65 ¤   ¤   while( dirIDIndex >= 0 )
a85b34 ¤   ¤   {
1c14ab ¤   ¤   ¤   Str255¤ dirName;
dbaf5a
03fcf0 ¤   ¤   ¤   cpb.dirInfo.ioVRefNum ¤ = vRefNum;
441fdd ¤   ¤   ¤   cpb.dirInfo.ioDrDirID ¤ = dirIDList[dirIDIndex];
948f45 ¤   ¤   ¤   cpb.dirInfo.ioNamePtr¤  = dirName;
9a0c28 ¤   ¤   ¤   cpb.dirInfo.ioFDirIndex¤= -1;
1f87c7 ¤   ¤   ¤
5cce23 ¤   ¤   ¤   status = PBGetCatInfoSync( &cpb );
7f1fdb ¤   ¤   ¤   if( IsErr( status ) )
89f622 ¤   ¤   ¤   ¤   break;
6d87c7 ¤   ¤   ¤
e7221d ¤   ¤   ¤   AppendPString( dirName, path );
96c49d ¤   ¤   ¤   AppendPString( "\p:", path );
0687c7 ¤   ¤   ¤
00a309 ¤   ¤   ¤   --dirIDIndex;
990fe4 ¤   ¤   }
579371 ¤   }
ddaf5a
a24afd ¤   return( status );
86efe6 }
21af5a
fa85ea ¤   OSStatus
ef8745 FSpGetFullPath(const FSSpec *fileSpec, StringPtr path)
a8bb36 {
87c412 ¤   OSStatus¤   status;
8daf5a
e62aea ¤   AssertSpecIsValid( fileSpec, "FSpGetPath" );
3b4328 ¤   pgpAssertAddrValid( path, uchar );
6367c5 ¤
b91b37 ¤   status = GetDirFullPath( fileSpec->vRefNum, fileSpec->parID, path );
62dd30 ¤   if( IsntErr( status ) )
0cc7a1 ¤   {
abfef6 ¤   ¤   CInfoPBRec¤ cpb;
03af5a
dbfc0a ¤   ¤   // Append the file name to the directory path
2f1b52 ¤   ¤
c44c37 ¤   ¤   AppendPString( fileSpec->name, path );
fa1b52 ¤   ¤
374627 ¤   ¤   if( IsntErr( FSpGetCatInfo( fileSpec, &cpb ) ) )
755b34 ¤   ¤   {
0776e4 ¤   ¤   ¤   if( cpbIsFolder( &cpb ) )
3ef776 ¤   ¤   ¤   {
94421c ¤   ¤   ¤   ¤   // If the item exists and is a folder, append a ":"
9cfd58 ¤   ¤   ¤   ¤   AppendPString( "\p:", path );
26a3a6 ¤   ¤   ¤   }
f90fe4 ¤   ¤   }
879371 ¤   }
6faf5a
5c4afd ¤   return( status );
bdefe6 }
b2af5a
5faf5a
7aaf5a
7185ea ¤   OSStatus
669398 FSpDeleteResourceFork( const FSSpec *spec )
44bb36 {
ff8e70 ¤   OSErr¤  err¤= noErr;
9edea8 ¤   short¤  fileRef;
db67c5 ¤
00c45b ¤   AssertSpecIsValid( spec, "DeleteResourceFork" );
825ef5 ¤   err¤= FSpOpenRF( spec, fsRdWrPerm, &fileRef );
655ecc ¤   if ( IsntErr( err ) )
30c7a1 ¤   {
e32348 ¤   ¤   err¤= SetEOF( fileRef, 0 );
5cacbe ¤   ¤   FSClose( fileRef );
--4549 0000bdcf27140120230 Page 19 of MacFiles.cp
a19371 ¤   }
9967c5 ¤
fd5aff ¤   AssertNoErr( err, "DeleteResourceFork" );
84deb7 ¤   return( err );
6fefe6 }
24af5a
fbaf5a
c9af5a
910335 /*____________________________________________________________________________
b8e057 ¤   Copy the specified number of bytes at the specified offset to the output
730737 ¤   file at the specified offset.
daf7f7 ____________________________________________________________________________*/
1085ea ¤   OSStatus
7ee073 FSCopyBytes(
750185 ¤   PGPMemoryMgrRef¤memoryMgr,
4aca6a ¤   short¤  ¤   ¤   fromRef,
f0bd32 ¤   UInt32¤ ¤   ¤   fromOffset,
7153f1 ¤   short¤  ¤   ¤   toRef,
fbe552 ¤   UInt32¤ ¤   ¤   toOffset,
5f2158 ¤   const UInt32¤   requestCount )
d2bb36 {
8179f7 ¤   OSStatus¤   ¤   err¤= noErr;
d9ecb9 ¤   const UInt32¤   kMinBufferSize = kDiskBlockSize * 4L;
71e6d0 ¤   const UInt32¤   kMaxBuffer¤ = kDiskBlockSize * 1024UL;
28a314 ¤   void *¤ ¤   ¤   buffer¤ = nil;
91e3ca ¤   UInt32¤ ¤   ¤   bufferSize;
2d67c5 ¤
a7a58a ¤   AssertFileRefNumIsValid( fromRef, "CopyData" );
84796e ¤   AssertFileRefNumIsValid( toRef, "CopyData" );
9b9a02 ¤   pgpAssert( (fromOffset & 0x80000000) == 0 &&
8e7f2a ¤   ¤   (toOffset & 0x80000000) == 0 && (requestCount & 0x80000000) == 0 );
4c67c5 ¤
57ce91 ¤   if ( requestCount != 0 )
38c7a1 ¤   {
16e678 ¤   ¤   bufferSize = MIN( requestCount, kMaxBuffer );
c11b52 ¤   ¤
800b31 ¤   ¤   buffer = PGPNewData( memoryMgr, bufferSize, 0 );
739196 ¤   ¤   if( IsNull( buffer ) )
28ed49 ¤   ¤   {¤
bf03f5 ¤   ¤   ¤   bufferSize = bufferSize / 2;
6687c7 ¤   ¤   ¤
d92d84 ¤   ¤   ¤   buffer = PGPNewData( memoryMgr, bufferSize, 0 );
c61de9 ¤   ¤   ¤   if( IsNull( buffer ) )
9df776 ¤   ¤   ¤   {
b80763 ¤   ¤   ¤   ¤   bufferSize = kMinBufferSize;
452b85 ¤   ¤   ¤   ¤
fbf7ad ¤   ¤   ¤   ¤   buffer = PGPNewData( memoryMgr, bufferSize, 0 );
4fa3a6 ¤   ¤   ¤   }
e60fe4 ¤   ¤   }
8967c5 ¤
44709c ¤   ¤   if ( IsntNull( buffer ) )
ba5b34 ¤   ¤   {
110ee1 ¤   ¤   ¤   // read whole blocks, for efficiency,
c50d52 ¤   ¤   ¤   // unless we have a buffer same size as whole request
569cfe ¤   ¤   ¤   if ( bufferSize != requestCount )
80f776 ¤   ¤   ¤   {
b31e3e ¤   ¤   ¤   ¤   pgpAssert( bufferSize >= kDiskBlockSize );
85d235 ¤   ¤   ¤   ¤   bufferSize¤ = ( bufferSize / kDiskBlockSize ) * kDiskBlockSize;
33a3a6 ¤   ¤   ¤   }
3687c7 ¤   ¤   ¤
c155dd ¤   ¤   ¤   err¤= SetFPos( fromRef, fsFromStart, fromOffset );
8de090 ¤   ¤   ¤   if ( IsntErr( err ) )
19f776 ¤   ¤   ¤   {
8bbdaf ¤   ¤   ¤   ¤   err¤= SetFPos( toRef, fsFromStart, toOffset );
f0a3a6 ¤   ¤   ¤   }
f287c7 ¤   ¤   ¤
bfe090 ¤   ¤   ¤   if ( IsntErr( err ) )
6df776 ¤   ¤   ¤   {
8fc349 ¤   ¤   ¤   ¤   UInt32¤ remaining¤  = requestCount;
832b85 ¤   ¤   ¤   ¤
62865a ¤   ¤   ¤   ¤   while ( remaining != 0 )
0b72c3 ¤   ¤   ¤   ¤   {
--ba09 0006c44a9d540120230 Page 20 of MacFiles.cp
a602d4 ¤   ¤   ¤   ¤   ¤   long¤   count;
beae30 ¤   ¤   ¤   ¤   ¤
4fb057 ¤   ¤   ¤   ¤   ¤   count¤  = MIN( bufferSize, remaining );
e6ae30 ¤   ¤   ¤   ¤   ¤
f400b7 ¤   ¤   ¤   ¤   ¤   err¤= FSRead( fromRef, &count, buffer );
2d330d ¤   ¤   ¤   ¤   ¤   if ( IsntErr( err ) )
394859 ¤   ¤   ¤   ¤   ¤   {
32a02a ¤   ¤   ¤   ¤   ¤   ¤   err¤= FSWrite( toRef, &count, buffer );
b01c89 ¤   ¤   ¤   ¤   ¤   }
246f03 ¤   ¤   ¤   ¤   ¤   if ( IsErr( err ) )
d700eb ¤   ¤   ¤   ¤   ¤   ¤   break;
07ae30 ¤   ¤   ¤   ¤   ¤
be3a9b ¤   ¤   ¤   ¤   ¤   remaining¤  -= count;
162613 ¤   ¤   ¤   ¤   }
5ea3a6 ¤   ¤   ¤   }
5a1b52 ¤   ¤
bf7ce8 ¤   ¤   ¤   PGPFreeData( buffer );
b60fe4 ¤   ¤   }
200e1d ¤   ¤   else
c55b34 ¤   ¤   {
19a352 ¤   ¤   ¤   err = memFullErr;
b60fe4 ¤   ¤   }
c09371 ¤   }
8967c5 ¤
cedeb7 ¤   return( err );
faefe6 }
5caf5a
e6af5a
a2af5a
1d85ea ¤   OSStatus
344d9b FSpOpenFork(
bffbb6 ¤   const FSSpec *¤ spec,
292e82 ¤   SInt8¤  ¤   ¤   permission,
6ef4a0 ¤   short *¤¤   ¤   fileRef,
e1bd42 ¤   ForkKind¤   ¤   whichFork )
bbbb36 {
9275f8 ¤   OSStatus¤   err¤= noErr;
d067c5 ¤
2f62b8 ¤   if ( whichFork == kDataFork )
7bd1ba ¤   ¤   err¤= FSpOpenDF( spec, permission, fileRef );
b00e24 ¤   else
ce7e95 ¤   ¤   err¤= FSpOpenRF( spec, permission, fileRef );
fb67c5 ¤
acdeb7 ¤   return( err );
38efe6 }
f4af5a
73af5a
9085ea ¤   OSStatus
70435a FSpCopyFork(
b70185 ¤   PGPMemoryMgrRef¤memoryMgr,
8863f5 ¤   const FSSpec *¤ fromSpec,
fb3239 ¤   const FSSpec *¤ toSpec,
f109dc ¤   ForkKind¤   ¤   forkKind )
74bb36 {
6c75f8 ¤   OSStatus¤   err¤= noErr;
375312 ¤   short¤  ¤   fromRef;
b267c5 ¤
291fec ¤   err¤= FSpOpenFork( fromSpec, fsRdPerm, &fromRef, forkKind );
c25ecc ¤   if ( IsntErr( err ) )
86c7a1 ¤   {
e07577 ¤   ¤   short¤  toRef;
661b52 ¤   ¤
1264b8 ¤   ¤   err¤= FSpOpenFork( toSpec, fsRdWrPerm, &toRef, forkKind );
05d798 ¤   ¤   if ( IsntErr( err ) )
3a5b34 ¤   ¤   {
54dd0d ¤   ¤   ¤   long¤   eof;
5287c7 ¤   ¤   ¤
399e56 ¤   ¤   ¤   err¤= GetEOF( fromRef, &eof );
6ee090 ¤   ¤   ¤   if ( IsntErr( err ) )
8af776 ¤   ¤   ¤   {
dadc6f ¤   ¤   ¤   ¤   err¤= SetEOF( toRef, 0 );
6ca3a6 ¤   ¤   ¤   }
--3c94 000d3aec06740120230 Page 21 of MacFiles.cp
e587c7 ¤   ¤   ¤
6d3138 ¤   ¤   ¤   if ( IsntErr( err ) && eof != 0 )
4bf776 ¤   ¤   ¤   {
8fbf54 ¤   ¤   ¤   ¤   err¤= FSCopyBytes( memoryMgr, fromRef, 0, toRef, 0, eof );
b2a3a6 ¤   ¤   ¤   }
8487c7 ¤   ¤   ¤
cbeba0 ¤   ¤   ¤   FSClose( toRef );
660fe4 ¤   ¤   }
df67c5 ¤
b69817 ¤   ¤   FSClose( fromRef );
789371 ¤   }
f867c5 ¤
bedeb7 ¤   return( err );
1defe6 }
50af5a
baaf5a
3d85ea ¤   OSStatus
da8b40 FSpCopyFiles(
c50185 ¤   PGPMemoryMgrRef¤memoryMgr,
9a63f5 ¤   const FSSpec *¤ fromSpec,
ecafd2 ¤   const FSSpec *¤ toSpec )
59bb36 {
b575f8 ¤   OSStatus¤   err¤= noErr;
294f27 ¤   CInfoPBRec¤ cpb;
de67c5 ¤
52fd1c ¤   (void)FSpDelete( toSpec );
c467c5 ¤
c5c123 ¤   err¤= FSpGetCatInfo( fromSpec, &cpb );
d35ecc ¤   if ( IsntErr( err ) )
d3c7a1 ¤   {
307fb0 ¤   ¤   err¤= FSpCreate( toSpec,
1528aa ¤   ¤   ¤   cpbFileCreator( &cpb ), cpbFileType( &cpb ), smSystemScript );
389371 ¤   }
41af5a
ad5ecc ¤   if ( IsntErr( err ) )
e0c7a1 ¤   {
e3e87d ¤   ¤   err¤= FSpCopyFork( memoryMgr, fromSpec, toSpec, kDataFork );
d4d798 ¤   ¤   if ( IsntErr( err ) )
695b34 ¤   ¤   {
be1d15 ¤   ¤   ¤   err¤= FSpCopyFork( memoryMgr, fromSpec, toSpec, kResourceFork );
870fe4 ¤   ¤   }
a99371 ¤   }
be67c5 ¤
4067c5 ¤
175ecc ¤   if ( IsntErr( err ) )
82c7a1 ¤   {
2a50bb ¤   ¤   err¤= FSpGetCatInfo( fromSpec, &cpb );
8fd798 ¤   ¤   if ( IsntErr( err ) )
5e5b34 ¤   ¤   {
66a78e ¤   ¤   ¤   /* if the files are in the same directory, make sure they
c534cc ¤   ¤   ¤   don't have the same icon position */
a9597d ¤   ¤   ¤   if ( fromSpec->vRefNum == toSpec->vRefNum &&
72ae9f ¤   ¤   ¤   ¤   ¤   fromSpec->parID == toSpec->parID )
26f776 ¤   ¤   ¤   {
926188 ¤   ¤   ¤   ¤   cpbFInfo( &cpb ).fdLocation.v¤  += 32;
8e5910 ¤   ¤   ¤   ¤   cpbFInfo( &cpb ).fdLocation.h¤  += 32;
90a3a6 ¤   ¤   ¤   }
1a87c7 ¤   ¤   ¤
34ccf1 ¤   ¤   ¤   err¤= FSpSetCatInfo( toSpec, &cpb );
400fe4 ¤   ¤   }
0c9371 ¤   }
1667c5 ¤
21deb7 ¤   return( err );
bdefe6 }
8aaf5a
85af5a
e7af5a
d0af5a
b6af5a
14af5a
30af5a
d3eacd ¤   OSErr
--3a48 000e88cc0b240120230 Page 22 of MacFiles.cp
f74efa FSWriteString(
114bd3 ¤   short¤  ¤   ¤   ¤   fileRef,
ba428f ¤   ConstStr255Param¤   string)
6bbb36 {
398e70 ¤   OSErr¤  err¤= noErr;
c967c5 ¤
2b31fd ¤   long¤   count¤  = StrLength( string );
fa67c5 ¤
961b27 ¤   err¤= FSWrite( fileRef, &count, &string[ 1 ] );
2367c5 ¤
4fdeb7 ¤   return( err );
c7efe6 }
55af5a
0caf5a
fbaf5a
8feacd ¤   OSErr
0c4dcf FSpCreateAndOpenFile(
12fbb6 ¤   const FSSpec *¤ spec,
787d53 ¤   OSType¤ ¤   ¤   creator,
e0fa46 ¤   OSType¤ ¤   ¤   type,
b4f6bf ¤   SInt8¤  ¤   ¤   script,
8f2eaa ¤   ForkKind¤   ¤   forkKind,
db94af ¤   SInt8¤  ¤   ¤   perm,
8ea65c ¤   short *¤¤   ¤   fileRef )
9dbb36 {
1b8e70 ¤   OSErr¤  err¤= noErr;
e467c5 ¤
4ccef8 ¤   err¤= FSpCreate( spec, creator, type, script );
d95ecc ¤   if ( IsntErr( err ) )
0dc7a1 ¤   {
84365a ¤   ¤   err¤= FSpOpenFork( spec, perm, fileRef, forkKind );
c29371 ¤   }
a867c5 ¤
f6deb7 ¤   return( err );
32efe6 }
5eaf5a
60af5a
a0af5a
43eacd ¤   OSErr
930e99 FSpReadBytes(
a2fbb6 ¤   const FSSpec *¤ spec,
f82903 ¤   void *¤ ¤   ¤   buffer,
8e7715 ¤   UInt32¤ ¤   ¤   requestCount,
1dc882 ¤   UInt32 *¤   ¤   ¤   actualCountPtr )
e8bb36 {
258e70 ¤   OSErr¤  err¤= noErr;
00dea8 ¤   short¤  fileRef;
1967c5 ¤
28a68d ¤   AssertSpecIsValid( spec, "FSpReadBytes" );
4267c5 ¤
e06162 ¤   MacDebug_FillWithGarbage( buffer, requestCount );
3b67c5 ¤
192b25 ¤   err¤= FSpOpenDF( spec, fsRdPerm, &fileRef );
ee5ecc ¤   if ( IsntErr( err ) )
20c7a1 ¤   {
614a60 ¤   ¤   long¤   ¤   eof;
98af98 ¤   ¤   long¤   ¤   count;
4a1b52 ¤   ¤
a36f9d ¤   ¤   GetEOF( fileRef, &eof );
731b52 ¤   ¤
c747e3 ¤   ¤   count¤  = MIN( eof, requestCount );
891b52 ¤   ¤
116c6e ¤   ¤   err¤= FSRead( fileRef, &count, buffer );
e11b52 ¤   ¤
4aa302 ¤   ¤   if ( IsntNull( actualCountPtr ) )
4f5b34 ¤   ¤   {
1f0937 ¤   ¤   ¤   *actualCountPtr¤= count;
840fe4 ¤   ¤   }
851b52 ¤   ¤
0dacbe ¤   ¤   FSClose( fileRef );
7a9371 ¤   }
e867c5 ¤
--3ec7 00031593f9340120230 Page 23 of MacFiles.cp
a766ab ¤   AssertNoErr( err, "ReadBytesFromFile" );
bfdeb7 ¤   return( err );
32efe6 }
09af5a
60af5a
bc7e69 ¤   Boolean
959d8c FSSpecIsValid( const FSSpec *spec )
12bb36 {
c34c09 ¤   Boolean¤¤   isValid¤= FALSE;
7567c5 ¤
0a4c94 ¤   isValid¤= IsntNull( spec );
756dc6 ¤   if ( isValid )·
5ac7a1 ¤   {
4c9ab2 ¤   ¤   const uchar¤length¤ = StrLength( spec->name );
8c1b52 ¤   ¤
23dbb0 ¤   ¤   isValid¤= spec->vRefNum < 0 && spec->parID != 0 &&
c0adf4 ¤   ¤   ¤   ¤   ¤   length >= 1 && length <= 31;
879371 ¤   }
ee67c5 ¤
05195c ¤   return( isValid );
1defe6 }
5baf5a
adeacd ¤   OSErr
ef925b FSpGetForkSizes(
a0fbb6 ¤   const FSSpec *¤ spec,
729e63 ¤   UInt32 *¤   ¤   ¤   dataForkSize,¤  // may be nil
9d1567 ¤   UInt32 *¤   ¤   ¤   resForkSize¤¤   // may be nil
5827e6 ¤   )
85bb36 {
2614d3 ¤   OSErr¤  ¤   err¤= noErr;
274f27 ¤   CInfoPBRec¤ cpb;
aa67c5 ¤
842244 ¤   err¤= FSpGetCatInfo( spec, &cpb );
cc5ecc ¤   if ( IsntErr( err ) )
dec7a1 ¤   {
ec6354 ¤   ¤   if ( IsntNull( dataForkSize ) )
1e5c17 ¤   ¤   ¤   *dataForkSize¤  = cpbDataForkSize( &cpb );
bd87c7 ¤   ¤   ¤
81573a ¤   ¤   if ( IsntNull( resForkSize ) )
d1af13 ¤   ¤   ¤   *resForkSize¤   = cpbResForkSize( &cpb );
bd9371 ¤   }
b667c5 ¤
bddeb7 ¤   return( err );
72efe6 }
d8af5a
44af5a
39af5a
10af5a
f66999 // Called just like FindFolder()
27a735 // except the folder is always created if not present.
35af5a
5b85ea ¤   OSStatus
047335 FindPGPPreferencesFolder(
f6b08a ¤   short ¤ vRefNum,
c96ac2 ¤   short ¤ *foundVRefNum,
eb376b ¤   long ¤  *foundDirID)
a2bb36 {
81dc42 ¤   OSStatus¤   err;
f70a1c ¤   FSSpec¤ ¤   folderSpec;
0a67c5 ¤
d6f460 ¤   pgpAssertAddrValid( foundVRefNum, short );
75fa8c ¤   pgpAssertAddrValid( foundDirID, long );
8367c5 ¤
9fb286 ¤   err = FindFolder( vRefNum, kPreferencesFolderType, kCreateFolder,
9e59de ¤   ¤   ¤   ¤   &folderSpec.vRefNum, &folderSpec.parID );
1fee03 ¤   if( IsntErr( err ) )
64c7a1 ¤   {
ddfef6 ¤   ¤   CInfoPBRec¤ cpb;
dd1b52 ¤   ¤
5c9a0e ¤   ¤   *foundVRefNum = folderSpec.vRefNum;
771b52 ¤   ¤
31a5e5 ¤   ¤   // This string should _not_ be internationalized.
--0604 00014d921f640120230 Page 24 of MacFiles.cp
ce387b ¤   ¤   CopyPString( "\pPretty Good Preferences", folderSpec.name );
a11b52 ¤   ¤
5860d9 ¤   ¤   err = FSpGetCatInfo( &folderSpec, &cpb );
66da5e ¤   ¤   if( IsntErr( err ) )
4c5b34 ¤   ¤   {
8076e4 ¤   ¤   ¤   if( cpbIsFolder( &cpb ) )
50f776 ¤   ¤   ¤   {
7cc23a ¤   ¤   ¤   ¤   *foundDirID = cpb.dirInfo.ioDrDirID;
37a3a6 ¤   ¤   ¤   }
9fbb8c ¤   ¤   ¤   else
72f776 ¤   ¤   ¤   {
130235 ¤   ¤   ¤   ¤   pgpDebugMsg( "Pretty Good Preferences is a file!" );
34b678 ¤   ¤   ¤   ¤   err = dupFNErr;
91a3a6 ¤   ¤   ¤   }
710fe4 ¤   ¤   }
250e1d ¤   ¤   else
495b34 ¤   ¤   {
338d77 ¤   ¤   ¤   err = FSpDirCreate( &folderSpec, smSystemScript, foundDirID );
1d0fe4 ¤   ¤   }
979371 ¤   }
f9af5a
04deb7 ¤   return( err );
c1efe6 }
01af5a
13af5a
67af5a
d4eacd ¤   OSErr
45bd1c FSpChangeFileType(
aefbb6 ¤   const FSSpec *¤ spec,
f18938 ¤   OSType¤ ¤   ¤   newType )
34bb36 {
a614d3 ¤   OSErr¤  ¤   err¤= noErr;
a24f27 ¤   CInfoPBRec¤ cpb;
0e67c5 ¤
ce2244 ¤   err¤= FSpGetCatInfo( spec, &cpb );
e25ecc ¤   if ( IsntErr( err ) )
b2c7a1 ¤   {
959946 ¤   ¤   if ( cpbIsFile( &cpb ) )
735b34 ¤   ¤   {
2c6a71 ¤   ¤   ¤   cpbFileType( &cpb )¤= newType;
8c87c7 ¤   ¤   ¤
d3252f ¤   ¤   ¤   err¤= FSpSetCatInfo( spec, &cpb );
970fe4 ¤   ¤   }
e50e1d ¤   ¤   else
af5b34 ¤   ¤   {
1f9586 ¤   ¤   ¤   err¤= notAFileErr;
080fe4 ¤   ¤   }
6d9371 ¤   }
5367c5 ¤
b4deb7 ¤   return( err );
25efe6 }
87af5a
4aaf5a
6eaf5a
e7eacd ¤   OSErr
4047ab FSWipeBytes(
d50631 ¤   short¤  fileRef,
118228 ¤   UInt32¤ startOffset,
453926 ¤   UInt32¤ numBytes,
f550c3 ¤   uchar¤  wipeChar )
dfbb36 {
f875f8 ¤   OSStatus¤   err¤= noErr;
bc67c5 ¤
594287 ¤   err¤= SetFPos( fileRef, fsFromStart, startOffset );
955ecc ¤   if ( IsntErr( err ) )
80c7a1 ¤   {
0bcad7 ¤   ¤   void *¤ ¤   buffer¤ = nil;
912fde ¤   ¤   UInt32¤ ¤   bufferSize;
e4c406 ¤   ¤   uchar¤  ¤   emergencyBuffer[ kDiskBlockSize ];
75c33b ¤   ¤   Boolean¤¤   disposeBuffer¤  = FALSE;
912491 ¤   ¤   UInt32¤ ¤   remaining;
141b52 ¤   ¤
--b8fa 0009646a65440120230 Page 25 of MacFiles.cp
c2c833 ¤   ¤   buffer¤ = pgpNewPtrMost( numBytes, MIN( kDiskBlockSize, numBytes ),
9990fc ¤   ¤   ¤   ¤   ¤   kMacMemory_PreferTempMem |
964d69 ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap, &bufferSize );
f6709c ¤   ¤   if ( IsntNull( buffer ) )
025b34 ¤   ¤   {
3eef61 ¤   ¤   ¤   disposeBuffer¤  = TRUE;
e50fe4 ¤   ¤   }
f40e1d ¤   ¤   else
555b34 ¤   ¤   {
da37db ¤   ¤   ¤   buffer¤ ¤   = &emergencyBuffer[ 0 ];
b90470 ¤   ¤   ¤   bufferSize¤ = sizeof( emergencyBuffer );
8c0fe4 ¤   ¤   }
a01b52 ¤   ¤
f01b52 ¤   ¤
ac65b9 ¤   ¤   pgpFillMemory( buffer, bufferSize, wipeChar );
4f1b52 ¤   ¤
222385 ¤   ¤   remaining¤  = numBytes;
89ba61 ¤   ¤   while( remaining != 0 )
155b34 ¤   ¤   {
d59a83 ¤   ¤   ¤   long¤   count;
bf87c7 ¤   ¤   ¤
29c291 ¤   ¤   ¤   count¤  = MIN( remaining, bufferSize );
c98f81 ¤   ¤   ¤   err¤= FSWrite( fileRef, &count, buffer );
b121aa ¤   ¤   ¤   if ( IsErr( err ) )
82f622 ¤   ¤   ¤   ¤   break;
e32b85 ¤   ¤   ¤   ¤
69e906 ¤   ¤   ¤   remaining¤  -= count;
6e0fe4 ¤   ¤   }
331b52 ¤   ¤
eb97af ¤   ¤   if ( disposeBuffer )
915b34 ¤   ¤   {
53f40a ¤   ¤   ¤   pgpFreeMac( buffer );
ed0fe4 ¤   ¤   }
f59371 ¤   }
fe67c5 ¤
fbdeb7 ¤   return( err );
9aefe6 }
09af5a
f6af5a
07af5a
45eacd ¤   OSErr
c46e4d FSpGetFileVersion(
92fbb6 ¤   const FSSpec *¤ spec,
245096 ¤   UInt16 *¤   ¤   version )
96bb36 {
7c79f7 ¤   OSStatus¤   ¤   err¤= noErr;
212e5c ¤   CSaveResFile¤   saveRes;
ca93cd ¤   CSaveResLoad¤   saveResLoad;
d867d1 ¤   short¤  ¤   ¤   fileRef;
0767c5 ¤
e1f585 ¤   *version¤   = 0;
4367c5 ¤
d9e7a3 ¤   SetResLoad( FALSE );
7b7334 ¤   fileRef¤= FSpOpenResFile( spec, fsRdPerm );
c9e5c7 ¤   SetResLoad( TRUE );
a05ecc ¤   if ( IsntErr( err ) )
06c7a1 ¤   {
e2bab7 ¤   ¤   Handle¤ versResource;
861b52 ¤   ¤
5140b3 ¤   ¤   versResource¤   = Get1Resource( 'vers', 1 );
cf0adb ¤   ¤   if ( IsntNull( versResource ) )
a15b34 ¤   ¤   {
f18a51 ¤   ¤   ¤   *version¤   = **(const UInt16 **)versResource;
170fe4 ¤   ¤   }
b50e1d ¤   ¤   else
305b34 ¤   ¤   {
42a59e ¤   ¤   ¤   err¤= resNotFound;
220fe4 ¤   ¤   }
de1b52 ¤   ¤
39f63f ¤   ¤   CloseResFile( fileRef );
d19371 ¤   }
9667c5 ¤
--03b5 00082efb08940120230 Page 26 of MacFiles.cp
2a67c5 ¤
4fdeb7 ¤   return( err );
29efe6 }
02af5a
b385ea ¤   OSStatus
48dc72 VolumeIsRemote(short vRefNum, Boolean *isRemote)
65bb36 {
33029d ¤   HParamBlockRec¤ ¤   ¤   pb;
0447cb ¤   GetVolParmsInfoBuffer¤  parmsBuffer;
8edf72 ¤   Str255¤ ¤   ¤   ¤   ¤   volumeName;
59a94f ¤   OSStatus¤   ¤   ¤   ¤   status;
6367c5 ¤
bcf464 ¤   pgpAssertAddrValid( isRemote, Boolean );
3067c5 ¤
e0de75 ¤   pgpClearMemory( &pb, sizeof( pb ) );
82362c ¤   pgpClearMemory( &parmsBuffer, sizeof( parmsBuffer ) );
2367c5 ¤
ff39f4 ¤   volumeName[0] = 0;
5f67c5 ¤
8c5cb5 ¤   parmsBuffer.vMVersion = 2;¤ // See IM-Files, Page 2-109
2267c5 ¤
cb9ef3 ¤   pb.volumeParam.ioNamePtr¤   = &volumeName[0];
299a44 ¤   pb.volumeParam.ioVRefNum¤   = vRefNum;
153d91 ¤   pb.ioParam.ioBuffer¤¤   ¤   = (Ptr) &parmsBuffer;
76ffa8 ¤   pb.ioParam.ioReqCount¤  ¤   = sizeof( parmsBuffer );
d767c5 ¤
0b16ca ¤   status = PBHGetVolParmsSync( &pb );
cc67c5 ¤
1f04c8 ¤   *isRemote = ( parmsBuffer.vMServerAdr != 0 );
eb67c5 ¤
6b4afd ¤   return( status );
75efe6 }
e3af5a
daaf5a
ddaf5a
b02473 ¤   static OSStatus
f354bb ReadWriteFileBlocksUsingDriver(
12ce06 ¤   short ¤ ¤   ¤   ¤   fileRefNum,
3c82c9 ¤   Boolean¤¤   ¤   ¤   doRead,
8bf5be ¤   const DiskExtent¤   *extentList,
5036af ¤   UInt32¤ ¤   ¤   ¤   numExtents,
4988d6 ¤   UInt32¤ ¤   ¤   ¤   startBlock,
971e9c ¤   UInt32 ¤¤   ¤   ¤   blocksToReadWrite,
42e474 ¤   void¤   ¤   ¤   ¤   *buffer,
c2a4db ¤   UInt32¤ ¤   ¤   ¤   *blocksReadWritten)
05bb36 {
51323e ¤   OSStatus¤   status = noErr;
d867c5 ¤
722d82 ¤   pgpAssertAddrValid( extentList, DiskExtent );
fed4d9 ¤   AssertFileRefNumIsValid( fileRefNum, "ReadFileBlocksUsingDriver" );
cd2954 ¤   pgpAssertAddrValid( buffer, VoidAlign );
fef387 ¤   pgpAssertAddrValid( blocksReadWritten, UInt32 );
7167c5 ¤
5315de ¤   *blocksReadWritten = 0;
e167c5 ¤
b61105 ¤   if( blocksToReadWrite != 0 )
5ec7a1 ¤   {
59a778 ¤   ¤   const VCB¤  *vcb;
a9cba7 ¤   ¤   UInt32¤ ¤   extentIndex;
9c1b3f ¤   ¤   uchar¤  ¤   *curBuffer;
240c31 ¤   ¤   UInt32¤ ¤   curFileBlock;
0a102d ¤   ¤   UInt32¤ ¤   blocksRemaining;
3e1b52 ¤   ¤
d63c91 ¤   ¤   vcb ¤   ¤   ¤   = GetVCBForFile( fileRefNum );
587510 ¤   ¤   curFileBlock¤   = 0;
4c933e ¤   ¤   curBuffer¤  ¤   = (uchar *) buffer;
924da1 ¤   ¤   blocksRemaining¤= blocksToReadWrite;
4d1b52 ¤   ¤
9d34f1 ¤   ¤   for( extentIndex = 0; extentIndex < numExtents; extentIndex++ )
075b34 ¤   ¤   {
15f8ae ¤   ¤   ¤   const DiskExtent¤   *curExtent;
8287c7 ¤   ¤   ¤
--60db 000525ed06f40120230 Page 27 of MacFiles.cp
6520f0 ¤   ¤   ¤   curExtent = &extentList[extentIndex];
3387c7 ¤   ¤   ¤
314b10 ¤   ¤   ¤   if( curFileBlock + curExtent->numBlocks > startBlock )
5cf776 ¤   ¤   ¤   {
8c1701 ¤   ¤   ¤   ¤   UInt32¤ readWriteStartBlock;
035c65 ¤   ¤   ¤   ¤   UInt32¤ numReadWrittenBlocks;
be06f9 ¤   ¤   ¤   ¤   UInt32¤ bytesReadWritten;
938f15 ¤   ¤   ¤   ¤   UInt32¤ numBlocksReadWritten;
4b2b85 ¤   ¤   ¤   ¤
2e22aa ¤   ¤   ¤   ¤   readWriteStartBlock ¤   = curExtent->diskBlockIndex;
720088 ¤   ¤   ¤   ¤   numReadWrittenBlocks¤   = curExtent->numBlocks;
1caf5a
d6afb3 ¤   ¤   ¤   ¤   if( curFileBlock < startBlock )
9f72c3 ¤   ¤   ¤   ¤   {
d635d6 ¤   ¤   ¤   ¤   ¤   // File offset starts in this extent.
c542cc ¤   ¤   ¤   ¤   ¤   readWriteStartBlock ¤   += ( startBlock - curFileBlock );
085fd8 ¤   ¤   ¤   ¤   ¤   numReadWrittenBlocks¤   -= ( startBlock - curFileBlock );
8b2613 ¤   ¤   ¤   ¤   }
ee2b85 ¤   ¤   ¤   ¤
2bdd2a ¤   ¤   ¤   ¤   if( numReadWrittenBlocks > blocksRemaining )
19c20a ¤   ¤   ¤   ¤   ¤   numReadWrittenBlocks = blocksRemaining;
50ae30 ¤   ¤   ¤   ¤   ¤
c079f6 ¤   ¤   ¤   ¤   if( NeedWidePositioning( readWriteStartBlock,
684ed4 ¤   ¤   ¤   ¤   ¤   ¤   numReadWrittenBlocks ) )
7a72c3 ¤   ¤   ¤   ¤   {
de06bc ¤   ¤   ¤   ¤   ¤   XIOParam¤   pb;
74c342 ¤   ¤   ¤   ¤   ¤   UInt64¤ ¤   startOffset;
2dae30 ¤   ¤   ¤   ¤   ¤
ccb678 ¤   ¤   ¤   ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
e02b85 ¤   ¤   ¤   ¤
433ddf ¤   ¤   ¤   ¤   ¤   pb.ioVRefNum¤   = vcb->vcbDrvNum;
48ce22 ¤   ¤   ¤   ¤   ¤   pb.ioRefNum¤¤   = vcb->vcbDRefNum;
5aa310 ¤   ¤   ¤   ¤   ¤   pb.ioBuffer¤¤   = (Ptr) curBuffer;
fa243f ¤   ¤   ¤   ¤   ¤   pb.ioReqCount¤  = numReadWrittenBlocks * kDiskBlockSize;
a657d2 ¤   ¤   ¤   ¤   ¤   startOffset¤¤   = UInt64( readWriteStartBlock ) << 9;
16f97c ¤   ¤   ¤   ¤   ¤   pb.ioWPosOffset.hi¤ = startOffset >> 32;
a9c78e ¤   ¤   ¤   ¤   ¤   pb.ioWPosOffset.lo¤ = startOffset;
b0d6c9 ¤   ¤   ¤   ¤   ¤   pb.ioPosMode¤   = fsFromStart | kWidePosOffsetMask;
f0ae30 ¤   ¤   ¤   ¤   ¤
d4d5c5 ¤   ¤   ¤   ¤   ¤   if( doRead )·
414859 ¤   ¤   ¤   ¤   ¤   {
37dba0 ¤   ¤   ¤   ¤   ¤   ¤   status = PBReadSync( (ParamBlockRec *) &pb );
e71c89 ¤   ¤   ¤   ¤   ¤   }
344bd6 ¤   ¤   ¤   ¤   ¤   else
d14859 ¤   ¤   ¤   ¤   ¤   {
06695c ¤   ¤   ¤   ¤   ¤   ¤   status = PBWriteSync( (ParamBlockRec *) &pb );
3a1c89 ¤   ¤   ¤   ¤   ¤   }
faae30 ¤   ¤   ¤   ¤   ¤
44d3f0 ¤   ¤   ¤   ¤   ¤   bytesReadWritten = pb.ioActCount;
a42613 ¤   ¤   ¤   ¤   }
dffa07 ¤   ¤   ¤   ¤   else
7972c3 ¤   ¤   ¤   ¤   {
5a3b5c ¤   ¤   ¤   ¤   ¤   ParamBlockRec¤  pb;
3aae30 ¤   ¤   ¤   ¤   ¤
21b678 ¤   ¤   ¤   ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
d62b85 ¤   ¤   ¤   ¤
4d400c ¤   ¤   ¤   ¤   ¤   pb.ioParam.ioVRefNum¤   = vcb->vcbDrvNum;
0f2a49 ¤   ¤   ¤   ¤   ¤   pb.ioParam.ioRefNum¤¤   = vcb->vcbDRefNum;
4b477b ¤   ¤   ¤   ¤   ¤   pb.ioParam.ioBuffer¤¤   = (Ptr) curBuffer;
2aad1d ¤   ¤   ¤   ¤   ¤   pb.ioParam.ioReqCount¤  =
6af30b ¤   ¤   ¤   ¤   ¤   ¤   numReadWrittenBlocks * kDiskBlockSize;
f242b0 ¤   ¤   ¤   ¤   ¤   pb.ioParam.ioPosOffset¤ =
3b3528 ¤   ¤   ¤   ¤   ¤   ¤   readWriteStartBlock * kDiskBlockSize;
ff3c1b ¤   ¤   ¤   ¤   ¤   pb.ioParam.ioPosMode¤   = fsFromStart;
03ae30 ¤   ¤   ¤   ¤   ¤
e43e87 ¤   ¤   ¤   ¤   ¤   if( doRead )
874859 ¤   ¤   ¤   ¤   ¤   {
953ede ¤   ¤   ¤   ¤   ¤   ¤   status = PBReadSync( &pb );
461c89 ¤   ¤   ¤   ¤   ¤   }
594bd6 ¤   ¤   ¤   ¤   ¤   else
484859 ¤   ¤   ¤   ¤   ¤   {
5228b0 ¤   ¤   ¤   ¤   ¤   ¤   status = PBWriteSync( &pb );
--3bc6 0002311f2b540120230 Page 28 of MacFiles.cp
b61c89 ¤   ¤   ¤   ¤   ¤   }
2cae30 ¤   ¤   ¤   ¤   ¤
d2ea08 ¤   ¤   ¤   ¤   ¤   bytesReadWritten = pb.ioParam.ioActCount;
7d2613 ¤   ¤   ¤   ¤   }
052b85 ¤   ¤   ¤   ¤
8e50b0 ¤   ¤   ¤   ¤   numBlocksReadWritten¤   = bytesReadWritten / kDiskBlockSize;
04f23b ¤   ¤   ¤   ¤   *blocksReadWritten ¤¤   += numBlocksReadWritten;
7addf1 ¤   ¤   ¤   ¤   blocksRemaining¤¤   ¤   -= numBlocksReadWritten;
5b5fbe ¤   ¤   ¤   ¤   curBuffer ¤ ¤   ¤   ¤   += bytesReadWritten;
b92b85 ¤   ¤   ¤   ¤
bca83b ¤   ¤   ¤   ¤   if( IsErr( status ) || blocksRemaining == 0 )
9814c3 ¤   ¤   ¤   ¤   ¤   break;
e0a3a6 ¤   ¤   ¤   }
f087c7 ¤   ¤   ¤
0774f6 ¤   ¤   ¤   curFileBlock += curExtent->numBlocks;
8b0fe4 ¤   ¤   }
6c9371 ¤   }
b567c5 ¤
f0c571 ¤   if( IsntErr( status ) && *blocksReadWritten != blocksToReadWrite )
afc7a1 ¤   {
9236cd ¤   ¤   status = eofErr;
9c9371 ¤   }
0b67c5 ¤
424afd ¤   return( status );
72efe6 }
82af5a
9185ea ¤   OSStatus
bb3728 FSReadFileUsingDriver(
156a75 ¤   short ¤ fileRefNum,
031edd ¤   UInt32¤ readOffset,
b9a205 ¤   UInt32 ¤bytesToRead,
8e361b ¤   void¤   *buffer,
02444f ¤   UInt32¤ *callerBytesRead)
a6bb36 {
e0323e ¤   OSStatus¤   status = noErr;
36e682 ¤   UInt32¤ ¤   bytesRead = 0;
cf67c5 ¤
d27e7d ¤   AssertFileRefNumIsValid( fileRefNum, "FSReadFileUsingDriver" );
572954 ¤   pgpAssertAddrValid( buffer, VoidAlign );
d6d692 ¤   AssertAddrNullOrValid( callerBytesRead, UInt32, "FSReadFileUsingDriver" );
5c67c5 ¤
f567b4 ¤   if( bytesToRead != 0 )
63c7a1 ¤   {
cbbb99 ¤   ¤   DiskExtent¤ *extentsList;
f01213 ¤   ¤   PGPUInt32¤  numExtents;
a81b52 ¤   ¤
39b44e ¤   ¤   status = GetDiskExtentsForFork( fileRefNum, &extentsList, &numExtents );
bd706e ¤   ¤   if( IsntErr( status ) )
f75b34 ¤   ¤   {
bfb7f3 ¤   ¤   ¤   uchar¤  *curBuffer;
1e32db ¤   ¤   ¤   UInt32¤ curFileBlock;
2a431c ¤   ¤   ¤   UInt32¤ blocksRead;
bf1f3c ¤   ¤   ¤   UInt32¤ partialBytes;
13300b ¤   ¤   ¤   UInt32¤ bytesRemaining;
b39f80 ¤   ¤   ¤   uchar¤  tempBuffer[kDiskBlockSize];
eb87c7 ¤   ¤   ¤
af07b1 ¤   ¤   ¤   curBuffer ¤ ¤   = (uchar *) buffer;
a051d5 ¤   ¤   ¤   curFileBlock¤   = readOffset / kDiskBlockSize;
0122c8 ¤   ¤   ¤   bytesRemaining¤ = bytesToRead;
f387c7 ¤   ¤   ¤
8c2b04 ¤   ¤   ¤   // Do initial partial block, if any
811b52 ¤   ¤
c9fb09 ¤   ¤   ¤   partialBytes = readOffset % kDiskBlockSize;
00ada5 ¤   ¤   ¤   if( partialBytes != 0 )
9ef776 ¤   ¤   ¤   {
823bb0 ¤   ¤   ¤   ¤   status = ReadWriteFileBlocksUsingDriver( fileRefNum, TRUE,
c39d84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   extentsList, numExtents, curFileBlock, 1,
86b0e4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   tempBuffer, &blocksRead );
1d3ec7 ¤   ¤   ¤   ¤   if( IsntErr( status ) )
7c72c3 ¤   ¤   ¤   ¤   {
a4007a ¤   ¤   ¤   ¤   ¤   UInt32¤ bytesToCopy;
237362 ¤   ¤   ¤   ¤   ¤   UInt32¤ blockOffset;
--e363 0004795106b40120230 Page 29 of MacFiles.cp
d6ae30 ¤   ¤   ¤   ¤   ¤
6fa418 ¤   ¤   ¤   ¤   ¤   bytesToCopy = kDiskBlockSize - partialBytes;
d6b1b1 ¤   ¤   ¤   ¤   ¤   if( bytesToCopy > bytesRemaining )
be3891 ¤   ¤   ¤   ¤   ¤   ¤   bytesToCopy = bytesRemaining;
2f94aa ¤   ¤   ¤   ¤   ¤   ¤
afacce ¤   ¤   ¤   ¤   ¤   blockOffset = partialBytes;
cbae30 ¤   ¤   ¤   ¤   ¤
89eceb ¤   ¤   ¤   ¤   ¤   BlockMoveData( &tempBuffer[partialBytes],
19f897 ¤   ¤   ¤   ¤   ¤   ¤   curBuffer, bytesToCopy );
c2ae30 ¤   ¤   ¤   ¤   ¤
6188c7 ¤   ¤   ¤   ¤   ¤   curBuffer ¤ ¤   += bytesToCopy;
3bd6e4 ¤   ¤   ¤   ¤   ¤   curFileBlock¤   += 1;
a4f72e ¤   ¤   ¤   ¤   ¤   bytesRemaining¤ -= bytesToCopy;
3aa029 ¤   ¤   ¤   ¤   ¤   bytesRead¤  ¤   += bytesToCopy;
352613 ¤   ¤   ¤   ¤   }
d7a3a6 ¤   ¤   ¤   }
1b87c7 ¤   ¤   ¤
b17f17 ¤   ¤   ¤   // Do remaining whole blocks
ac7929 ¤   ¤   ¤   if( IsntErr( status ) && bytesRemaining > 0 )
661efe ¤   ¤   ·¤  {
adacc7 ¤   ¤   ¤   ¤   UInt32¤ wholeBlocks;
c92b85 ¤   ¤   ¤   ¤
d825c8 ¤   ¤   ¤   ¤   wholeBlocks = bytesRemaining / kDiskBlockSize;
fe9efa ¤   ¤   ¤   ¤   if( wholeBlocks > 0 )
4e72c3 ¤   ¤   ¤   ¤   {
814917 ¤   ¤   ¤   ¤   ¤   status = ReadWriteFileBlocksUsingDriver( fileRefNum,
9e8b06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   TRUE,
ee753b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   extentsList, numExtents, curFileBlock,
c8889e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wholeBlocks, curBuffer, &blocksRead );
e7b6a1 ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
784859 ¤   ¤   ¤   ¤   ¤   {
34a3b2 ¤   ¤   ¤   ¤   ¤   ¤   UInt32¤ numBytesRead;
4694aa ¤   ¤   ¤   ¤   ¤   ¤
fd429e ¤   ¤   ¤   ¤   ¤   ¤   numBytesRead¤   = blocksRead * kDiskBlockSize;
899ba2 ¤   ¤   ¤   ¤   ¤   ¤   curBuffer ¤ ¤   += numBytesRead;
ad33cf ¤   ¤   ¤   ¤   ¤   ¤   bytesRemaining ¤-= numBytesRead;
b295fa ¤   ¤   ¤   ¤   ¤   ¤   bytesRead¤  ¤   += numBytesRead;
7470f1 ¤   ¤   ¤   ¤   ¤   ¤   curFileBlock¤   += blocksRead;
821c89 ¤   ¤   ¤   ¤   ¤   }
192613 ¤   ¤   ¤   ¤   }
b8a3a6 ¤   ¤   ¤   }
8387c7 ¤   ¤   ¤
09f203 ¤   ¤   ¤   // Do last partial block, if any
087929 ¤   ¤   ¤   if( IsntErr( status ) && bytesRemaining > 0 )
ef1efe ¤   ¤   ·¤  {
861069 ¤   ¤   ¤   ¤   pgpAssert( bytesRemaining < kDiskBlockSize );
142b85 ¤   ¤   ¤   ¤
d0cba8 ¤   ¤   ¤   ¤   status = ReadWriteFileBlocksUsingDriver(
733002 ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileRefNum, TRUE, extentsList,
052c20 ¤   ¤   ¤   ¤   ¤   ¤   ¤   numExtents, curFileBlock, 1, tempBuffer,
64915e ¤   ¤   ¤   ¤   ¤   ¤   ¤   &blocksRead );
4f3ec7 ¤   ¤   ¤   ¤   if( IsntErr( status ) )
5f72c3 ¤   ¤   ¤   ¤   {
5505ed ¤   ¤   ¤   ¤   ¤   BlockMoveData( &tempBuffer[0], curBuffer, bytesRemaining);
abae30 ¤   ¤   ¤   ¤   ¤
3cb262 ¤   ¤   ¤   ¤   ¤   bytesRead += bytesRemaining;
dc2613 ¤   ¤   ¤   ¤   }
54a3a6 ¤   ¤   ¤   }
ce1b52 ¤   ¤
f55f52 ¤   ¤   ¤   FreeDiskExtentList( extentsList );
7a0fe4 ¤   ¤   }
789371 ¤   }
bc67c5 ¤
e9a16e ¤   if( IsntNull( callerBytesRead ) )
86908a ¤   ¤   *callerBytesRead = bytesRead;
171b52 ¤   ¤
f671e1 ¤   pgpAssert( bytesRead == bytesToRead );
c167c5 ¤
5a4afd ¤   return( status );
ddefe6 }
27af5a
47af5a
--97c9 000933876e840120230 Page 30 of MacFiles.cp
e0af5a
7e85ea ¤   OSStatus
4c6bac FSWriteFileUsingDriver(
7b2770 ¤   short ¤ ¤   fileRefNum,
1650d2 ¤   UInt32¤ ¤   writeOffset,
ed8322 ¤   UInt32 ¤¤   bytesToWrite,
374571 ¤   const void¤ *buffer,
20207c ¤   UInt32¤ ¤   *callerBytesWritten)
1dbb36 {
dd323e ¤   OSStatus¤   status = noErr;
eccb97 ¤   UInt32¤ ¤   bytesWritten = 0;
5567c5 ¤
93bfea ¤   AssertFileRefNumIsValid( fileRefNum, "FSWriteFileUsingDriver" );
0e2954 ¤   pgpAssertAddrValid( buffer, VoidAlign );
88f70b ¤   AssertAddrNullOrValid( callerBytesWritten, UInt32,
1eee6f ¤   ¤   "FSWriteFileUsingDriver" );
7467c5 ¤
3f326f ¤   if( bytesToWrite != 0 )
77c7a1 ¤   {
6bbb99 ¤   ¤   DiskExtent¤ *extentsList;
5d1213 ¤   ¤   PGPUInt32¤  numExtents;
0f1b52 ¤   ¤
71d79e ¤   ¤   status = GetDiskExtentsForFork( fileRefNum, &extentsList, &numExtents);
81706e ¤   ¤   if( IsntErr( status ) )
035b34 ¤   ¤   {
8a9a26 ¤   ¤   ¤   const uchar¤*curBuffer;
58e342 ¤   ¤   ¤   UInt32¤ ¤   curFileBlock;
4b0456 ¤   ¤   ¤   UInt32¤ ¤   blocksWritten;
56cea5 ¤   ¤   ¤   UInt32¤ ¤   partialBytes;
3f394a ¤   ¤   ¤   UInt32¤ ¤   bytesRemaining;
4fc817 ¤   ¤   ¤   uchar¤  ¤   tempBuffer[kDiskBlockSize];
7b87c7 ¤   ¤   ¤
d3b721 ¤   ¤   ¤   curBuffer ¤ ¤   = (const uchar *) buffer;
1ee7c6 ¤   ¤   ¤   curFileBlock¤   = writeOffset / kDiskBlockSize;
2eeefd ¤   ¤   ¤   bytesRemaining¤ = bytesToWrite;
0b87c7 ¤   ¤   ¤
e52b04 ¤   ¤   ¤   // Do initial partial block, if any
526992 ¤   ¤   ¤   partialBytes = writeOffset % kDiskBlockSize;
21ada5 ¤   ¤   ¤   if( partialBytes != 0 )
f1f776 ¤   ¤   ¤   {
28c8e0 ¤   ¤   ¤   ¤   UInt32¤ blocksRead;
f22b85 ¤   ¤   ¤   ¤
ce3bb0 ¤   ¤   ¤   ¤   status = ReadWriteFileBlocksUsingDriver( fileRefNum, TRUE,
2c1879 ¤   ¤   ¤   ¤   ¤   ¤   ¤   extentsList, numExtents,
947ef6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   curFileBlock, 1, tempBuffer,
72915e ¤   ¤   ¤   ¤   ¤   ¤   ¤   &blocksRead );
003ec7 ¤   ¤   ¤   ¤   if( IsntErr( status ) )
ac72c3 ¤   ¤   ¤   ¤   {
ec007a ¤   ¤   ¤   ¤   ¤   UInt32¤ bytesToCopy;
1d7362 ¤   ¤   ¤   ¤   ¤   UInt32¤ blockOffset;
8bae30 ¤   ¤   ¤   ¤   ¤
e4a418 ¤   ¤   ¤   ¤   ¤   bytesToCopy = kDiskBlockSize - partialBytes;
65b1b1 ¤   ¤   ¤   ¤   ¤   if( bytesToCopy > bytesRemaining )
c63891 ¤   ¤   ¤   ¤   ¤   ¤   bytesToCopy = bytesRemaining;
4e94aa ¤   ¤   ¤   ¤   ¤   ¤
16acce ¤   ¤   ¤   ¤   ¤   blockOffset = partialBytes;
fbae30 ¤   ¤   ¤   ¤   ¤
99836e ¤   ¤   ¤   ¤   ¤   BlockMoveData( curBuffer,
87e234 ¤   ¤   ¤   ¤   ¤   ¤   &tempBuffer[partialBytes], bytesToCopy );
afae30 ¤   ¤   ¤   ¤   ¤
644917 ¤   ¤   ¤   ¤   ¤   status = ReadWriteFileBlocksUsingDriver( fileRefNum,
2bc404 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FALSE,
e79d84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   extentsList, numExtents, curFileBlock, 1,
50255d ¤   ¤   ¤   ¤   ¤   ¤   ¤   tempBuffer, &blocksWritten );
fab6a1 ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
cc4859 ¤   ¤   ¤   ¤   ¤   {
a5dd6b ¤   ¤   ¤   ¤   ¤   ¤   curBuffer ¤ ¤   += bytesToCopy;
61ef21 ¤   ¤   ¤   ¤   ¤   ¤   curFileBlock¤   += 1;
efa282 ¤   ¤   ¤   ¤   ¤   ¤   bytesRemaining¤ -= bytesToCopy;
e35896 ¤   ¤   ¤   ¤   ¤   ¤   bytesWritten¤   += bytesToCopy;
e51c89 ¤   ¤   ¤   ¤   ¤   }
932613 ¤   ¤   ¤   ¤   }
--0fec 000443424b640120230 Page 31 of MacFiles.cp
cfa3a6 ¤   ¤   ¤   }
7987c7 ¤   ¤   ¤
9a7f17 ¤   ¤   ¤   // Do remaining whole blocks
8c7929 ¤   ¤   ¤   if( IsntErr( status ) && bytesRemaining > 0 )
711efe ¤   ¤   ·¤  {
38acc7 ¤   ¤   ¤   ¤   UInt32¤ wholeBlocks;
652b85 ¤   ¤   ¤   ¤
2525c8 ¤   ¤   ¤   ¤   wholeBlocks = bytesRemaining / kDiskBlockSize;
409efa ¤   ¤   ¤   ¤   if( wholeBlocks > 0 )
9572c3 ¤   ¤   ¤   ¤   {
624917 ¤   ¤   ¤   ¤   ¤   status = ReadWriteFileBlocksUsingDriver( fileRefNum,
e8b131 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FALSE, extentsList, numExtents, curFileBlock,
01f49e ¤   ¤   ¤   ¤   ¤   ¤   ¤   wholeBlocks, (uchar *)curBuffer, &blocksWritten );
efb6a1 ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
514859 ¤   ¤   ¤   ¤   ¤   {
8ffb9a ¤   ¤   ¤   ¤   ¤   ¤   UInt32¤ numBytesWritten;
4e94aa ¤   ¤   ¤   ¤   ¤   ¤
9d5dea ¤   ¤   ¤   ¤   ¤   ¤   numBytesWritten¤= blocksWritten * kDiskBlockSize;
5d066d ¤   ¤   ¤   ¤   ¤   ¤   curBuffer ¤ ¤   += numBytesWritten;
629d60 ¤   ¤   ¤   ¤   ¤   ¤   bytesRemaining ¤-= numBytesWritten;
cbcf98 ¤   ¤   ¤   ¤   ¤   ¤   bytesWritten¤   += numBytesWritten;
a867db ¤   ¤   ¤   ¤   ¤   ¤   curFileBlock¤   += blocksWritten;
941c89 ¤   ¤   ¤   ¤   ¤   }
f12613 ¤   ¤   ¤   ¤   }
86a3a6 ¤   ¤   ¤   }
ea87c7 ¤   ¤   ¤
2ff203 ¤   ¤   ¤   // Do last partial block, if any
347929 ¤   ¤   ¤   if( IsntErr( status ) && bytesRemaining > 0 )
bd1efe ¤   ¤   ·¤  {
cc1069 ¤   ¤   ¤   ¤   pgpAssert( bytesRemaining < kDiskBlockSize );
732b85 ¤   ¤   ¤   ¤
7c4e61 ¤   ¤   ¤   ¤   status = ReadWriteFileBlocksUsingDriver( fileRefNum,
c40170 ¤   ¤   ¤   ¤   ¤   ¤   ¤   TRUE, extentsList,
38fcbd ¤   ¤   ¤   ¤   ¤   ¤   ¤   numExtents, curFileBlock,
2bcb8b ¤   ¤   ¤   ¤   ¤   ¤   ¤   1, tempBuffer, &blocksWritten );
083ec7 ¤   ¤   ¤   ¤   if( IsntErr( status ) )
f072c3 ¤   ¤   ¤   ¤   {
7b7e95 ¤   ¤   ¤   ¤   ¤   BlockMoveData( curBuffer, &tempBuffer[0], bytesRemaining);
b0ae30 ¤   ¤   ¤   ¤   ¤
d04917 ¤   ¤   ¤   ¤   ¤   status = ReadWriteFileBlocksUsingDriver( fileRefNum,
c50d8c ¤   ¤   ¤   ¤   ¤   ¤   ¤   FALSE, extentsList,
2b2c20 ¤   ¤   ¤   ¤   ¤   ¤   ¤   numExtents, curFileBlock, 1, tempBuffer,
93e68e ¤   ¤   ¤   ¤   ¤   ¤   ¤   &blocksWritten );
83af5a
0d47a9 ¤   ¤   ¤   ¤   ¤   bytesWritten += bytesRemaining;
d72613 ¤   ¤   ¤   ¤   }
63a3a6 ¤   ¤   ¤   }
171b52 ¤   ¤
305f52 ¤   ¤   ¤   FreeDiskExtentList( extentsList );
b80fe4 ¤   ¤   }
6b9371 ¤   }
4767c5 ¤
aba244 ¤   if( IsntNull( callerBytesWritten ) )
3d736f ¤   ¤   *callerBytesWritten = bytesWritten;
431b52 ¤   ¤
4d14c2 ¤   pgpAssert( bytesWritten == bytesToWrite );
6367c5 ¤
fc4afd ¤   return( status );
1befe6 }
ebaf5a
52af5a
01af5a
2085ea ¤   OSStatus
3f7a57 FSReadUncached(
a8f96e ¤   short¤  ¤   ¤   fileRefNum,
ca6f7f ¤   long *¤ ¤   ¤   count,
b63110 ¤   void *¤ ¤   ¤   buffer )
f0bb36 {
5e2ece ¤   ParamBlockRec¤  pb;
916920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
9367c5 ¤
444faf ¤   pb.ioParam.ioRefNum¤¤   = fileRefNum;
--ba48 000b73b5ba840120230 Page 32 of MacFiles.cp
9960df ¤   pb.ioParam.ioBuffer¤¤   = (Ptr)buffer;
60e171 ¤   pb.ioParam.ioReqCount¤  = *count;
1546d8 ¤   pb.ioParam.ioPosMode¤   = fsFromMark | kCacheDisable;
72bb37 ¤   pb.ioParam.ioPosOffset¤ = 0;
3367c5 ¤
9bc839 ¤   err¤= PBReadSync( &pb );
8667c5 ¤
eddeb7 ¤   return( err );
6eefe6 }
e2af5a
d5af5a
4585ea ¤   OSStatus
8848bb FSWriteUncached(
18f96e ¤   short¤  ¤   ¤   fileRefNum,
716f7f ¤   long *¤ ¤   ¤   count,
79b457 ¤   const void *¤   buffer )
a6bb36 {
e92ece ¤   ParamBlockRec¤  pb;
e36920 ¤   OSErr¤  ¤   ¤   err¤= noErr;
ba67c5 ¤
124faf ¤   pb.ioParam.ioRefNum¤¤   = fileRefNum;
d660df ¤   pb.ioParam.ioBuffer¤¤   = (Ptr)buffer;
bde171 ¤   pb.ioParam.ioReqCount¤  = *count;
4446d8 ¤   pb.ioParam.ioPosMode¤   = fsFromMark | kCacheDisable;
87bb37 ¤   pb.ioParam.ioPosOffset¤ = 0;
7367c5 ¤
ebbbf7 ¤   err¤= PBWriteSync( &pb );
0467c5 ¤
b7deb7 ¤   return( err );
d8efe6 }
87af5a
19af5a
997e69 ¤   Boolean
33ab8e FSIsTrashFolder(
c8d772 ¤   short¤  vRefNum,
87f407 ¤   long¤   dirID )
b8bb36 {
4ff794 ¤   short¤  ¤   trashVRefNum;
2f8fca ¤   long¤   ¤   trashDirID;
1967c5 ¤
1dd182 ¤   (void)FindFolder( vRefNum,
29ece1 ¤   ¤   kTrashFolderType, FALSE, &trashVRefNum, &trashDirID);
fe67c5 ¤
6965c9 ¤   return( dirID == trashDirID );
deefe6 }
73af5a
0f85ea ¤   OSStatus
b6a664 DirContainsFSSpec(
4ed05e ¤   short ¤ ¤   ¤   containingVRefNum,
caf6b3 ¤   long¤   ¤   ¤   containingDirID,
e8d4f3 ¤   const FSSpec ¤  *childSpec,
24da0f ¤   Boolean¤¤   ¤   *isContained)
99bb36 {
8b3033 ¤   OSStatus¤   macErr;
794f27 ¤   CInfoPBRec¤ cpb;
deaf5a
dab707 ¤   pgpAssertAddrValid( isContained, Boolean );
e7af5a
b55746 ¤   *isContained = FALSE;
1867c5 ¤
6180a1 ¤   macErr = FSpGetCatInfo( childSpec, &cpb );
a29fbf ¤   if( IsntErr( macErr ) )
c1c7a1 ¤   {
dcf300 ¤   ¤   if( containingVRefNum == cpb.hFileInfo.ioVRefNum )
4b5b34 ¤   ¤   {
6672e7 ¤   ¤   ¤   // Iterate through childs parents until we reaching the
5f53ba ¤   ¤   ¤   // containing dirID or the root.
f587c7 ¤   ¤   ¤
2784fe ¤   ¤   ¤   while( TRUE )
78f776 ¤   ¤   ¤   {
0c7e69 ¤   ¤   ¤   ¤   if( cpb.hFileInfo.ioFlParID == containingDirID )
b772c3 ¤   ¤   ¤   ¤   {
--55e7 000cdb5cb8040120230 Page 33 of MacFiles.cp
8a9cbb ¤   ¤   ¤   ¤   ¤   *isContained = TRUE;
1414c3 ¤   ¤   ¤   ¤   ¤   break;
672613 ¤   ¤   ¤   ¤   }
0e5a66 ¤   ¤   ¤   ¤   else if( cpb.hFileInfo.ioFlParID == fsRtParID )
1172c3 ¤   ¤   ¤   ¤   {
db14c3 ¤   ¤   ¤   ¤   ¤   break;
aa2613 ¤   ¤   ¤   ¤   }
aafa07 ¤   ¤   ¤   ¤   else
d272c3 ¤   ¤   ¤   ¤   {
cb9295 ¤   ¤   ¤   ¤   ¤   Str255¤ dirName;
2887c7 ¤   ¤   ¤
0eb32c ¤   ¤   ¤   ¤   ¤   cpb.dirInfo.ioVRefNum ¤ = containingVRefNum;
bdbe13 ¤   ¤   ¤   ¤   ¤   cpb.dirInfo.ioDrDirID ¤ = cpb.hFileInfo.ioFlParID;
9a46d0 ¤   ¤   ¤   ¤   ¤   cpb.dirInfo.ioNamePtr¤  = dirName;
837ad3 ¤   ¤   ¤   ¤   ¤   cpb.dirInfo.ioFDirIndex¤= -1;
08ae30 ¤   ¤   ¤   ¤   ¤
13f645 ¤   ¤   ¤   ¤   ¤   macErr = PBGetCatInfoSync( &cpb );
488ec9 ¤   ¤   ¤   ¤   ¤   if( IsErr( macErr ) )
0800eb ¤   ¤   ¤   ¤   ¤   ¤   break;
af2613 ¤   ¤   ¤   ¤   }
d5a3a6 ¤   ¤   ¤   }
090fe4 ¤   ¤   }
079371 ¤   }
e367c5 ¤
a3c1bd ¤   return( macErr );
64efe6 }
1eaf5a
ca85ea ¤   OSStatus
95974b FSSpecContainsFSSpec(
3aab0f ¤   const FSSpec ¤  *containingSpec,
95d4f3 ¤   const FSSpec ¤  *childSpec,
59da0f ¤   Boolean¤¤   ¤   *isContained)
fabb36 {
b03033 ¤   OSStatus¤   macErr;
b74f27 ¤   CInfoPBRec¤ cpb;
6067c5 ¤
f5b10c ¤   AssertSpecIsValid( containingSpec, "FSSpecContainsFSSpec" );
ce42c8 ¤   AssertSpecIsValid( childSpec, "FSSpecContainsFSSpec" );
f1b707 ¤   pgpAssertAddrValid( isContained, Boolean );
3467c5 ¤
c35746 ¤   *isContained = FALSE;
03af5a
dd13bb ¤   macErr = FSpGetCatInfo( containingSpec, &cpb );
e042fb ¤   if( IsntErr( macErr ) && cpbIsFolder( &cpb ) )
87c7a1 ¤   {
641bec ¤   ¤   macErr = DirContainsFSSpec( cpb.dirInfo.ioVRefNum,
476044 ¤   ¤   ¤   ¤   ¤   cpb.dirInfo.ioDrDirID, childSpec,
e24c14 ¤   ¤   ¤   ¤   ¤   isContained );
179371 ¤   }
dc67c5 ¤
6ac1bd ¤   return( macErr );
2eefe6 }
57af5a
68e944 #define¤kFileSharingProcessType¤¤   ¤   'INIT'
755810 #define¤kFileSharingProcessSignature¤   'hhgg'
3eaf5a
044ae1 #define¤kAppleShareProcessType¤ ¤   ¤   'APPL'
ff61a9 #define¤kAppleShareProcessSignature¤¤   'hgfd'
29af5a
3b7e69 ¤   Boolean
111060 FileSharingIsActive(void)
c4bb36 {
d479c0 ¤   return( FindProcess( kFileSharingProcessType, kFileSharingProcessSignature,
788c1b ¤   ¤   ¤   ¤   ¤   NULL, NULL, NULL, NULL ) ||
f6ee65 ¤   ¤   ¤   FindProcess( kAppleShareProcessType, kAppleShareProcessSignature,
263d2b ¤   ¤   ¤   ¤   ¤   NULL, NULL, NULL, NULL ) );
b7efe6 }
87af5a
80fdb7 #if TARGET_RT_MAC_CFM
cdaf5a
62603b #define¤kPBXGetVolInfoFSDispatchSelector¤   0x12
cdaf5a
--5001 000183130f140120230 Page 34 of MacFiles.cp
e87353 enum
32bb36 {
63678f ¤   uppPBXGetVolInfoProcInfo = kRegisterBased
4f492c ¤   ¤   | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
976b3c ¤   ¤   | REGISTER_RESULT_LOCATION(kRegisterD0)
97316f ¤   ¤   | REGISTER_ROUTINE_PARAMETER(1, kRegisterD0, SIZE_CODE(sizeof(long)))
001e53 ¤   ¤   | REGISTER_ROUTINE_PARAMETER(2, kRegisterD1, SIZE_CODE(sizeof(short)))
2bca0b ¤   ¤   | REGISTER_ROUTINE_PARAMETER(3, kRegisterA0,·
fec286 ¤   ¤   ¤   SIZE_CODE(sizeof(XVolumeParam *)))
d582f7 };
3eaf5a
faff23 #endif¤ // TARGET_RT_MAC_CFM
9aaf5a
82eacd ¤   OSErr
a2481c pgpPBXGetVolInfo(XVolumeParam *xpb)
8dbb36 {
877b4a ¤   OSErr¤  ¤   ¤   err = noErr;
b66ff5 ¤   static Boolean¤ have2TBVolumeSupport = FALSE;
e20880 ¤   static Boolean¤ inited = FALSE;
a3af5a
40c4bd ¤   pgpAssertAddrValid( xpb, XVolumeParam );
6367c5 ¤
0b7250 ¤   if( xpb == nil )
8391d2 ¤   ¤   return( paramErr );
8567c5 ¤
15a92e ¤   if( ! inited )
8ec7a1 ¤   {
c7aec5 ¤   ¤   long¤   gestaltResult;
14af5a
213cc1 ¤   ¤   if( Gestalt( gestaltFSAttr, &gestaltResult ) == noErr )
275b34 ¤   ¤   {
fed235 ¤   ¤   ¤   have2TBVolumeSupport =
0b8e4e ¤   ¤   ¤   ¤   ( gestaltResult & ( 1L << gestaltFSSupports2TBVols ) ) != 0;
d00fe4 ¤   ¤   }
951b52 ¤   ¤
1d63e6 ¤   ¤   inited = TRUE;
739371 ¤   }
dfaf5a
aa3354 ¤   if( have2TBVolumeSupport )
71c7a1 ¤   {
8ec7cb ¤   ¤   // PBXGetVolInfo is available only as an A-Trap. Call via UPP
53b9b7 ¤   ¤   // from CFM code.
e71b52 ¤   ¤
fc3a02 ¤   #if TARGET_RT_MAC_CFM
ba67c5 ¤
c17677 ¤   ¤   err = CallOSTrapUniversalProc(
5e2c3d ¤   ¤   ¤   ¤   ¤   NGetTrapAddress( _FSDispatch, OSTrap ),·
f0d4ae ¤   ¤   ¤   ¤   ¤   uppPBXGetVolInfoProcInfo,
3cf20e ¤   ¤   ¤   ¤   ¤   kPBXGetVolInfoFSDispatchSelector,
3bbb69 ¤   ¤   ¤   ¤   ¤   _FSDispatch, xpb );
6147b4 ¤   #else
ce67c5 ¤
536b1f ¤   ¤   err = PBXGetVolInfoSync( xpb );
bd1b52 ¤   ¤
aeb7ec ¤   #endif
819371 ¤   }
010e24 ¤   else
61c7a1 ¤   {
04f2cf ¤   ¤   // PBXGetVolInfo() is not available. Call PBHGetVInfoSync and
9358db ¤   ¤   // compute byte calculations.
081b52 ¤   ¤
20bbc9 ¤   ¤   err = PBHGetVInfoSync( (HParamBlockRec *) xpb );
7a1b52 ¤   ¤
04b626 ¤   ¤   xpb->ioVFreeBytes.hi¤   = 0;
3bf960 ¤   ¤   xpb->ioVFreeBytes.lo¤   = xpb->ioVFrBlk * xpb->ioVAlBlkSiz;
60af5a
7c6eda ¤   ¤   xpb->ioVTotalBytes.hi¤  = 0;
6cdb10 ¤   ¤   xpb->ioVTotalBytes.lo¤  = xpb->ioVNmAlBlks * xpb->ioVAlBlkSiz;
229371 ¤   }
dd67c5 ¤
a4deb7 ¤   return( err );
18efe6 }
--4061 0010a77ccf040120230 Page 35 of MacFiles.cp
e0af5a
1aaf5a
17af5a
78af5a
32af5a
93af5a
37af5a
a6af5a
33af5a
24af5a
c6af5a
2caf5a
16af5a
c4af5a
a3af5a
57af5a
65af5a
77af5a
0aaf5a
--7537 00048441dd440120231 Page 1 of MacFiles.h
a70335 /*____________________________________________________________________________
7bf254 ¤   Copyright (C) 1996,1997 Network Associates, Inc. and its affiliates.
754b0f ¤   All rights reserved.
0967c5 ¤
75c2ac ¤   $Id: MacFiles.h,v 1.28.12.1 1998/11/12 03:19:36 heller Exp $
86f7f7 ____________________________________________________________________________*/
32af5a
907b7d #pragma once
7caf5a
d149ca #include <Files.h>
a9af5a
d8c5d5 #include "pgpBase.h"
50675a #include "pgpTypes.h"
596773 #include "pgpMemoryMgr.h"
97af5a
d199c6 PGP_BEGIN_C_DECLARATIONS
fb3ffd #if PRAGMA_IMPORT
58b981 #pragma import on
5b7454 #endif
3faf5a
56af5a
a8233f typedef enum
a7bb36 {
9fa615 ¤   kDataFork = 0,
f17b06 ¤   kResourceFork
a267c5 ¤
f41d7e } ForkKind;
4caf5a
48fa23 #if PRAGMA_ALIGN_SUPPORTED
12af46 #pragma options align=mac68k
267454 #endif
aaaf5a
3c452c /* A block in an extent is always 512 bytes */
43af5a
e7fbe4 typedef struct DiskExtent
eebb36 {
95ba3e ¤   PGPUInt32¤  diskBlockIndex;
15ce52 ¤   PGPUInt32¤  numBlocks;
5f67c5 ¤
5bd662 } DiskExtent;
b3af5a
28fa23 #if PRAGMA_ALIGN_SUPPORTED
747c46 #pragma options align=reset
b67454 #endif
66af5a
18af5a
7f184d #define kDiskBlockSize¤ ¤   ¤   ¤   512UL
8da0a9 #define¤kMaxHFSFileNameLength¤  ¤   31
2daf5a
b9a580 #define¤kHFSVolumeSignature¤¤   ¤   0x4244¤ /* 'BD' */
fe7aa8 #define¤kHFSPlusVolumeSignature¤¤   0x482B¤ /* 'H+' */
59af5a
85414c #define¤kFileAttributeDataForkOpenMask¤ ¤   0x08
23e03e #define¤kFileAttributeResourceForkOpenMask¤ 0x04
dbe1a1 #define¤kFileAttributeFileOpenMask¤ \
51abd2 ¤   ¤   ¤   ( kFileAttributeDataForkOpenMask |¤ \
63d12c ¤   ¤   ¤   ·kFileAttributeResourceForkOpenMask | 0x80 )
fbe1e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··
29b282 #define¤kFileAttributeFileLockedMask¤   ¤   0x01
3baf5a
78af5a
a13c18 #define¤kVolumeAttributeSoftwareLockMask¤   0x8000
19f7f8 #define¤kVolumeAttributeHardwareLockMask¤   0x0080
77b48f #define¤kVolumeAttributeLockMask¤   ( kVolumeAttributeSoftwareLockMask | \
2d89a3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kVolumeAttributeHardwareLockMask )
1de1e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··
d4e1e8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··
2733be #define cpbFileAttributes(cpb)¤ ¤   ( (cpb)->hFileInfo.ioFlAttrib )
e31f9c #define cpbFolderAttributes(cpb)¤   ( (cpb)->hFileInfo.ioFlAttrib )
0add32 #define cpbAttributes(cpb)¤ ¤   ¤   ( (cpb)->hFileInfo.ioFlAttrib )
d2fc36 #define cpbFileType(cpb)¤   ¤   ¤   ( (cpb)->hFileInfo.ioFlFndrInfo.fdType )
48487a #define cpbFileCreator(cpb)¤¤   ¤   ( (cpb)->hFileInfo.ioFlFndrInfo.fdCreator )
--0992 00057973b7840120231 Page 2 of MacFiles.h
86784a #define cpbFileFlags(cpb)¤  ¤   ¤   ( (cpb)->hFileInfo.ioFlFndrInfo.fdFlags )
03f357 #define cpbCreationDate(cpb)¤   ¤   ( (cpb)->hFileInfo.ioFlCrDat )
6fb838 #define cpbModificationDate(cpb)¤   ( (cpb)->hFileInfo.ioFlMdDat )
4b6b67 #define cpbDataForkSize(cpb)¤   ¤   ( (cpb)->hFileInfo.ioFlLgLen )
59efcb #define cpbResForkSize(cpb)¤¤   ¤   ( (cpb)->hFileInfo.ioFlRLgLen )
a3c237 #define cpbFInfo(cpb)¤  ¤   ¤   ¤   ( (cpb)->hFileInfo.ioFlFndrInfo )
beaf5a
062e60 #define¤cpbIsFile(cpb)¤ ¤   ¤   ¤   \
8a2e6a ¤   ( ( cpbAttributes( cpb ) & ioDirMask ) == 0 )
9e16f6 #define¤cpbIsFolder(cpb)¤   ¤   ¤   \
d02a39 ¤   ( ( cpbAttributes( cpb ) & ioDirMask ) != 0 )
5eaf5a
1fea8c #define cpbIsOpen(cpb)¤ ¤   ¤   ¤   \
de1d6d ¤   ( ( cpbAttributes( cpb ) & kFileAttributeFileOpenMask ) != 0 )
d0047c #define cpbIsLocked(cpb)¤   ¤   ¤   \
89bc80 ¤   ( ( cpbFileAttributes( cpb ) & kFileAttributeFileLockedMask ) != 0 )
4aaf5a
84af5a
1caf5a
4e3039 OSStatus¤   FSpGetCatInfo(const FSSpec *itemSpec, CInfoPBRec *itemCatalogInfo);
fe1e71 OSStatus¤   FSpSetCatInfo(const FSSpec *itemSpec, CInfoPBRec *itemCatalogInfo);
9bcb67 Boolean¤¤   FSpEqual(const FSSpec *spec1, const FSSpec *spec2);
59ebdc Boolean¤¤   FSpExists( const FSSpec *spec );
c6ca7a OSStatus¤   FlushFile(short fileRefNum);
5caf5a
54af5a
0e75a8 OSStatus¤   GetVolumeBlockCounts(short vRefNum, UInt32 *freeBlocks,
3bce32 ¤   ¤   ¤   ¤   UInt32 *totalBlocks, UInt32 *blockSize);
0794aa ¤   ¤   ¤   ¤   ¤   ¤
4033aa void¤   ¤   GetAllVRefNums( short * vRefNums,
9049cd ¤   ¤   ¤   ¤   UInt16 maxVRefNums, UInt16 * numVRefNums );
5ea90e void¤   ¤   FlushAllVolumes( void );
44af5a
2116c8 OSStatus¤   FSReadUncached( short fileRefNum, long *count, void *buffer );
3d16b5 OSStatus¤   FSWriteUncached( short fileRefNum,
f1e585 ¤   ¤   ¤   ¤   long *count, const void *buffer );
1aaf5a
af12b6 OSStatus¤   FSReadAtOffset(short fileRefNum,
b34b5a ¤   ¤   ¤   ¤   UInt32 readOffset, UInt32 bytesToRead,
49f0ab ¤   ¤   ¤   ¤   void *buffer, UInt32 *bytesRead, Boolean restoreFilePos);
309bb8 OSStatus¤   FSWriteAtOffset(short fileRefNum,
d3bd6f ¤   ¤   ¤   ¤   UInt32 writeOffset, UInt32 bytesToWrite,
ca6a82 ¤   ¤   ¤   ¤   const void *buffer, UInt32 *bytesWritten,
f6c096 ¤   ¤   ¤   ¤   Boolean restoreFilePos);
9594aa ¤   ¤   ¤   ¤   ¤   ¤
22777d OSErr¤  ¤   GetVolumeName( short vRefNum, StringPtr name );
c3089e OSErr¤  ¤   GetVolumeDates( short vRefNum,
e70ccd ¤   ¤   ¤   ¤   long * creationDate, long * modificationDate );
c1af5a
a55196 OSErr¤  ¤   GetDiskExtentsForFork(short fileRefNum, DiskExtent **extentsListPtr,
21fccb ¤   ¤   ¤   ¤   PGPUInt32 *numExtents);
4e5eb3 void¤   ¤   FreeDiskExtentList(DiskExtent *theList);
bf67c5 ¤
3f2695 struct FCBRec;
deaf5a
4e8054 const struct FCBRec *¤  GetFCBForFile( short fileRefNum );
d4bcbc const VCB *¤¤   GetVCBForFile( short fileRefNum );
8301b3 OSStatus¤   ¤   GetVolumeDriveNumberAndRefNum( short vRefNum,
c0a165 ¤   ¤   ¤   ¤   ¤   short *driveNumber, short *driverRefNum );
287b88 const VCB *¤¤   GetVCBForVolume( short vRefNum );
964f35 void¤   ¤   ¤   GetDriveNumberAndRefNumForVCB( const VCB *vcb,
39a165 ¤   ¤   ¤   ¤   ¤   short *driveNumber, short *driverRefNum );
42af5a
c317e0 short¤  ¤   ¤   GetVolumeForFile( short fileRefNum );
caaf5a
373ca0 /* direct VCB access...avoid if possible */
b22d02 inline UInt32¤  GetVCBAllocBlockSize( const VCB *vcb )
261b01 ¤   ¤   ¤   ¤   ¤   { return( vcb->vcbAlBlkSiz ); }
65f0fc UInt32¤ ¤   ¤   AllocBlockNumberToDiskBlockNumber( const VCB *vcb,
71ff1b ¤   ¤   ¤   ¤   ¤   UInt32 allocBlockIndex );
a5af5a
57ba3e /* use of these routines is encouraged over direct VCB access */
--0c27 000a849a50240120231 Page 3 of MacFiles.h
ff42b5 UInt32¤ ¤   ¤   GetVolumeFreeAllocBlocks( short vRefNum );
02ef0e UInt32¤ ¤   ¤   GetVolumeAllocBlockSize( short vRefNum );
4c01b3 OSStatus¤   ¤   GetVolumeDriveNumberAndRefNum( short vRefNum,
92a165 ¤   ¤   ¤   ¤   ¤   short *driveNumber, short *driverRefNum );
c2af5a
23ae16 Boolean¤¤   FSSpecIsValid( const FSSpec *spec );
70af5a
8b3aa7 OSStatus¤   FSGetUniqueName(short vRefNum,
6de34a ¤   ¤   ¤   ¤   long dirID, ConstStr255Param baseName, StringPtr uniqueName);
2894aa ¤   ¤   ¤   ¤   ¤   ¤
be8570 OSStatus¤   FSpGetUniqueSpec(const FSSpec *spec, FSSpec *outSpec);
56af5a
857064 OSStatus¤   FSpGetFullPath(const FSSpec *fileSpec, StringPtr path);
aeaf5a
c5af5a
487bf9 OSStatus¤   GetSpecFromRefNum( short refNum, FSSpec *spec);
e7e490 OSStatus¤   GetSpecFromFCBTable( short refNum, FSSpec *spec);
72b08d OSStatus¤   FSpFindOpenForkRef(FSSpec * inSpec,
6ad5fb ¤   ¤   ¤   ¤   Boolean inResFork, SInt16 * outRefNum);
74af5a
cdaf5a
f71456 OSStatus¤   FSpDeleteResourceFork( const FSSpec *spec );
02af5a
2c3ba5 OSStatus¤   FSpOpenFork( const FSSpec *spec, SInt8 permission,
79ceef ¤   ¤   ¤   ¤   short * fileRef, ForkKind whichFork );
8caf5a
3daf5a
4f5d8f OSStatus¤   FSpCopyFork(PGPMemoryMgrRef memoryMgr, const FSSpec *fromSpec,
5ab722 ¤   ¤   ¤   ¤   const FSSpec * toSpec, ForkKind forkKind );
212b85 ¤   ¤   ¤   ¤
d1dc97 OSStatus¤   FSCopyBytes( PGPMemoryMgrRef memoryMgr, short fromRef,
33ef6e ¤   ¤   ¤   ¤   UInt32 fromOffset, short toRef, UInt32 toOffset,
9b3974 ¤   ¤   ¤   ¤   UInt32 numBytes );
9b2b85 ¤   ¤   ¤   ¤
616a28 OSStatus¤   FSpCopyFiles( PGPMemoryMgrRef memoryMgr,
7e58fd ¤   ¤   ¤   ¤   const FSSpec *fromSpec, const FSSpec *toSpec );
ecaf5a
19af5a
cc99b4 OSErr¤  ¤   FSWriteString( short fileRef, ConstStr255Param¤ string);
9eaf5a
22af5a
f9fd9d OSErr¤  ¤   FSpCreateAndOpenFile( const FSSpec *spec,
ed7488 ¤   ¤   ¤   ¤   OSType creator, OSType type,
7d438c ¤   ¤   ¤   ¤   SInt8 script, ForkKind, SInt8 perm, short *fileRef );
b2af5a
f99b45 OSErr¤  ¤   FSpReadBytes( const FSSpec *spec, void * buffer,
5087a2 ¤   ¤   ¤   ¤   UInt32 requestCount, UInt32 *actualCount );
e6af5a
961c31 OSErr¤  ¤   FSpGetForkSizes( const FSSpec *spec,
b47740 ¤   ¤   ¤   ¤   UInt32 *dataForkSize, UInt32 *resForkSize );
6caf5a
ad97ac OSStatus¤   FindPGPPreferencesFolder(short vRefNum,
397748 ¤   ¤   ¤   ¤   short *foundVRefNum, long *foundDirID);
80af5a
1faf5a
b163ee OSErr¤  ¤   FSpChangeFileType( const FSSpec *spec, OSType newType );
af8adc OSStatus¤   VolumeIsRemote(short vRefNum, Boolean *isRemote);
fbaf5a
c7ab86 OSErr¤  ¤   FSWipeBytes( short fileRefNum, UInt32 startOffset,
4c4bf5 ¤   ¤   ¤   ¤   UInt32 numBytes, uchar wipeChar );
f7af5a
49de43 OSErr¤  ¤   FSpGetFileVersion( const FSSpec *spec, UInt16 *version );
85af5a
a91b0f OSStatus¤   FSReadFileUsingDriver(short fileRefNum,
be4b5a ¤   ¤   ¤   ¤   UInt32 readOffset, UInt32 bytesToRead,
c1ee9e ¤   ¤   ¤   ¤   void *buffer, UInt32 *bytesRead);
abbdff OSStatus¤   FSWriteFileUsingDriver(short fileRefNum,
f18806 ¤   ¤   ¤   ¤   UInt32 readOffset, UInt32 bytesToWrite,
2acfef ¤   ¤   ¤   ¤   const void *buffer, UInt32 *callerBytesWritten);
b894aa ¤   ¤   ¤   ¤   ¤   ¤
dfaf5a
a8150d Boolean¤¤   FSIsTrashFolder( short vRefNum, long dirID );
--3e26 001929c787440120231 Page 4 of MacFiles.h
e0af5a
a4736a OSStatus¤   FSSpecContainsFSSpec(const FSSpec *containingSpec,
c00628 ¤   ¤   ¤   ¤   const FSSpec *childSpec, Boolean *isContained);
23af5a
2abdf4 OSStatus¤   DirContainsFSSpec(short containingVRefNum,
5ed5e3 ¤   ¤   ¤   ¤   long containingDirID, const FSSpec *childSpec,
2cf8c2 ¤   ¤   ¤   ¤   Boolean *isContained);
b5af5a
7cfa1f Boolean¤¤   FileSharingIsActive(void);
edaf5a
c7046c OSErr¤  ¤   pgpPBXGetVolInfo(XVolumeParam *xpb);
9daf5a
163ffd #if PRAGMA_IMPORT
1d2ced #pragma import reset
de7454 #endif
011254 PGP_END_C_DECLARATIONS
39af5a
feaf5a
47ae30 ¤   ¤   ¤   ¤   ¤
49af5a
0eaf5a
f2af5a
4eaf5a
92af5a
--e873 000310e058340120232 Page 1 of MacIcons.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
1bf7f7 ____________________________________________________________________________*/
a27c7a #include <Icons.h>
0caf5a
bb0d08 #include "pgpMem.h"
a18e44 #include "MacIcons.h"
63af5a
bdeacd ¤   OSErr
140528 DuplicateIconSuite(
45acee ¤   Handle¤ ¤   inFromSuite,
8408ff ¤   Handle *¤   outToSuite)
03bb36 {
cc0b03 ¤   OSErr ¤ ¤   err = noErr;
cdd6b0 ¤   static const OSType sIconTypes[] =
ca5b34 ¤   ¤   {
c21868 ¤   ¤   kLarge1BitMask,
1d85fb ¤   ¤   kLarge4BitData,
765c4e ¤   ¤   kLarge8BitData,
4c37fd ¤   ¤   kSmall1BitMask,
bdaa6e ¤   ¤   kSmall4BitData,
c673db ¤   ¤   kSmall8BitData,
a32b31 ¤   ¤   kMini1BitMask,
3ab6a2 ¤   ¤   kMini4BitData,
0d3592 ¤   ¤   kMini8BitData
82a105 ¤   ¤   };
4d9030 ¤   const PGPUInt16¤kNumTypes¤  =
8ede96 ¤   ¤   sizeof( sIconTypes ) / sizeof( sIconTypes[ 0 ] );
bbaf5a
3cf106 ¤   *outToSuite = nil;
3d67c5 ¤
c1c6cf ¤   // Create new icon suite
6a6a7f ¤   err = NewIconSuite(outToSuite);
bc5ecc ¤   if ( IsntErr( err ) )
c5c7a1 ¤   {
ca374e ¤   ¤   PGPUInt16 index;
031b52 ¤   ¤
64cf8b ¤   ¤   // Duplicate icons and add them to the new suite
fbe490 ¤   ¤   for ( index = 0; index < kNumTypes; ++index )
a05b34 ¤   ¤   {
87bcc5 ¤   ¤   ¤   Handle ¤¤   theDataH;
c667c5 ¤
10e880 ¤   ¤   ¤   if ( GetIconFromSuite( &theDataH,
4a1a8c ¤   ¤   ¤   ¤   ¤   inFromSuite, sIconTypes[ index ]) == noErr )
a3f776 ¤   ¤   ¤   {
398e05 ¤   ¤   ¤   ¤   if ( IsntNull( theDataH ) )
c472c3 ¤   ¤   ¤   ¤   {
7c5317 ¤   ¤   ¤   ¤   ¤   err¤= HandToHand( &theDataH );
476f03 ¤   ¤   ¤   ¤   ¤   if ( IsErr( err ) )
6200eb ¤   ¤   ¤   ¤   ¤   ¤   break;
30af5a
97f3fd ¤   ¤   ¤   ¤   ¤   AddIconToSuite( theDataH,
eadbe5 ¤   ¤   ¤   ¤   ¤   ¤   *outToSuite, sIconTypes[ index ]);
ed2613 ¤   ¤   ¤   ¤   }
f3a3a6 ¤   ¤   ¤   }
c40fe4 ¤   ¤   }
729371 ¤   }
9a67c5 ¤
c55ecc ¤   if ( IsntErr( err ) )
ffc7a1 ¤   {
790281 ¤   ¤   SetSuiteLabel( *outToSuite, GetSuiteLabel(inFromSuite) );
949371 ¤   }
730e24 ¤   else
c1c7a1 ¤   {
bbac9d ¤   ¤   if ( IsntNull( *outToSuite ) )
005b34 ¤   ¤   {
1a0daf ¤   ¤   ¤   DisposeIconSuite( *outToSuite, TRUE );
c40fe4 ¤   ¤   }
309371 ¤   }
3667c5 ¤
315ea8 ¤   return err;
--5143 0018ef8fc0340120232 Page 2 of MacIcons.cp
7aefe6 }
46af5a
8eaf5a
--feee 001f35a520f40120233 Page 1 of MacIcons.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
1bf7f7 ____________________________________________________________________________*/
bb7b7d #pragma once
77af5a
0599c6 PGP_BEGIN_C_DECLARATIONS
cc3ffd #if PRAGMA_IMPORT
78b981 #pragma import on
1b7454 #endif
08af5a
dcaf5a
49af5a
639bd4 OSErr¤  DuplicateIconSuite( Handle inFromSuite, Handle * outToSuite);
b0af5a
e6af5a
42af5a
94af5a
283ffd #if PRAGMA_IMPORT
cd2ced #pragma import reset
107454 #endif
f32827 PGP_END_C_DECLARATIONS¶
--3258 000cc43aed240120234 Page 1 of MacInternet.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
059ea4 ¤   $Id: MacInternet.c,v 1.5.18.1 1998/11/12 03:19:38 heller Exp $
55f7f7 ____________________________________________________________________________*/
3eaf5a
9d4918 #include <AppleEvents.h>
d2b2bf #include <Errors.h>
4caf5a
d08c8c #include "MacDesktop.h"
00bbf4 #include "MacFiles.h"
2c1e0f #include "MacInternet.h"
0074e2 #include "MacProcesses.h"
890d08 #include "pgpMem.h"
29af5a
c97353 enum
a8bb36 {
ab8053 ¤   kOpenURLEventClass¤ = 'WWW!',¤  ¤   /* These are Mac "standards" */
608b60 ¤   kOpenURLEventID¤¤   = 'OURL'
0582f7 };
beaf5a
0ec34b static OSType¤  sBrowserCreators[] = {¤ 'MOSS',¤¤   /* Netscape */
7fef06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   'MSIE' };¤  /* Internet Explorer */
eeaf5a
a32473 ¤   static OSStatus
1da160 SendURLToProcess(
9dcf49 ¤   ConstStr255Param ¤  theURL,
4d34b7 ¤   ProcessSerialNumber¤appPSN)
2dbb36 {
df552f ¤   AEDesc¤ ¤   addressDesc;
fdc412 ¤   OSStatus¤   status;
6f67c5 ¤
a993f7 ¤   status = AECreateDesc( typeProcessSerialNumber, &appPSN, sizeof( appPSN ),
7a51b5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &addressDesc );
11dd30 ¤   if( IsntErr( status ) )
ddc7a1 ¤   {
ef3e8a ¤   ¤   AppleEvent¤ theAppleEvent;
ab1b52 ¤   ¤
b3ff39 ¤   ¤   status = AECreateAppleEvent( kOpenURLEventClass,
8f6e7f ¤   ¤   ¤   ¤   ¤   kOpenURLEventID, &addressDesc,
2e1cc1 ¤   ¤   ¤   ¤   ¤   kAutoGenerateReturnID, kAnyTransactionID, &theAppleEvent );
22706e ¤   ¤   if( IsntErr( status ) )
a95b34 ¤   ¤   {
8dc1b6 ¤   ¤   ¤   status = AEPutParamPtr( &theAppleEvent, keyDirectObject, typeChar,
f91ff9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theURL[1], theURL[0] );
9cfb92 ¤   ¤   ¤   if( IsntErr( status ) )
35f776 ¤   ¤   ¤   {
d5d143 ¤   ¤   ¤   ¤   AppleEvent¤ replyEvent;
282b85 ¤   ¤   ¤   ¤
12e70b ¤   ¤   ¤   ¤   status = AESend( &theAppleEvent,
271e8f ¤   ¤   ¤   ¤   ¤   ¤   &replyEvent, kAENoReply | kAECanInteract,
13e965 ¤   ¤   ¤   ¤   ¤   ¤   kAENormalPriority, kAEDefaultTimeout, nil, nil );
ed3ec7 ¤   ¤   ¤   ¤   if( IsntErr( status ) )
c172c3 ¤   ¤   ¤   ¤   {
0a8d84 ¤   ¤   ¤   ¤   ¤   SetFrontProcess( &appPSN );
782613 ¤   ¤   ¤   ¤   }
0fa3a6 ¤   ¤   ¤   }
d487c7 ¤   ¤   ¤
f18d4b ¤   ¤   ¤   (void) AEDisposeDesc( &theAppleEvent );
fe0fe4 ¤   ¤   }
8b1b52 ¤   ¤
92dc76 ¤   ¤   (void) AEDisposeDesc( &addressDesc );
8a9371 ¤   }
2baf5a
f54afd ¤   return( status );
d7efe6 }
7eaf5a
712473 ¤   static OSStatus
cc54b4 SendURLToActiveBrowser(ConstStr255Param theURL)
--3a55 00014adeae840120234 Page 2 of MacInternet.c
2cbb36 {
c8424f ¤   UInt32¤ ¤   ¤   ¤   browserIndex;
301ebc ¤   UInt32¤ ¤   ¤   ¤   numBrowsers;
d47272 ¤   ProcessSerialNumber¤browserPSN;
a24a28 ¤   OSStatus¤   ¤   ¤   status;
dc67c5 ¤
e2c4ee ¤   pgpAssertAddrValid( theURL, uchar );
0aaf5a
4a2c23 ¤   numBrowsers ¤   = sizeof( sBrowserCreators )/sizeof( sBrowserCreators[0] );
633676 ¤   status¤ ¤   ¤   = fnfErr;
6d1b52 ¤   ¤
07415c ¤   for( browserIndex = 0; browserIndex < numBrowsers; browserIndex++ )
69c7a1 ¤   {
ce11ca ¤   ¤   if( FindProcess( 'APPL', sBrowserCreators[browserIndex], &browserPSN,
e1ab3c ¤   ¤   ¤   ¤   nil, nil, nil ) )
2a5b34 ¤   ¤   {
386763 ¤   ¤   ¤   status = SendURLToProcess( theURL, browserPSN );
e2cdcb ¤   ¤   ¤   break;
c80fe4 ¤   ¤   }
a79371 ¤   }
af67c5 ¤
6e4afd ¤   return( status );
4cefe6 }
4caf5a
e82473 ¤   static OSStatus
6d8c07 SendURLToInactiveBrowser(ConstStr255Param theURL)
0fbb36 {
320afe ¤   UInt32¤ ¤   browserIndex;
65fb56 ¤   UInt32¤ ¤   numBrowsers;
bdd2de ¤   Boolean¤¤   foundBrowser;
12c412 ¤   OSStatus¤   status;
b47ef5 ¤   FSSpec¤ ¤   browserSpec;
69e2c1 ¤   OSType¤ ¤   browserCreator;
6b67c5 ¤
c5c4ee ¤   pgpAssertAddrValid( theURL, uchar );
3daf5a
8aea3e ¤   numBrowsers = sizeof( sBrowserCreators ) / sizeof( sBrowserCreators[0] );
7c0f44 ¤   foundBrowser ¤  = FALSE;
f83bcc ¤   status ¤¤   ¤   = fnfErr;
3d67c5 ¤
301672 ¤   /* Try the full browser list on local volumes only,
7320de ¤   ¤   then retry the list for all volumes (local and remote).
9fc1e2 ¤   ¤   This means well find a locat Internet Explorer before
491d43 ¤   ¤   a remote Navigator. */
5e415c ¤   for( browserIndex = 0; browserIndex < numBrowsers; browserIndex++ )
d1c7a1 ¤   {
b7205c ¤   ¤   if( FindApplication( 'APPL', sBrowserCreators[browserIndex],
080f32 ¤   ¤   ¤   ¤   ¤   ¤   kFindAppOnLocalVolumes, &browserSpec ) )
845b34 ¤   ¤   {
91da6d ¤   ¤   ¤   foundBrowser ¤  = TRUE;
6339f2 ¤   ¤   ¤   browserCreator¤ = sBrowserCreators[browserIndex];
b4cdcb ¤   ¤   ¤   break;
eb0fe4 ¤   ¤   }
469371 ¤   }
2aaf5a
6005e4 ¤   if( ! foundBrowser )
bec7a1 ¤   {
fb5a55 ¤   ¤   for( browserIndex = 0; browserIndex < numBrowsers; browserIndex++ )
6e5b34 ¤   ¤   {
e3272a ¤   ¤   ¤   if( FindApplication( 'APPL', sBrowserCreators[browserIndex],
eed3f9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kFindAppOnRemoteVolumes, &browserSpec ) )
7cf776 ¤   ¤   ¤   {
161f38 ¤   ¤   ¤   ¤   foundBrowser ¤  = TRUE;
7a85eb ¤   ¤   ¤   ¤   browserCreator¤ = sBrowserCreators[browserIndex];
9ef622 ¤   ¤   ¤   ¤   break;
86a3a6 ¤   ¤   ¤   }
c40fe4 ¤   ¤   }
ab9371 ¤   }
ca67c5 ¤
97d8e5 ¤   if( foundBrowser )
afc7a1 ¤   {
14fc74 ¤   ¤   LaunchParamBlockRec¤launchPB;
--aae8 001fe3bf56140120234 Page 3 of MacInternet.c
e0af5a
9ff1b2 ¤   ¤   pgpClearMemory( &launchPB, sizeof( launchPB ) );
1667c5 ¤
7483b2 ¤   ¤   launchPB.launchBlockID¤ ¤   ¤   = extendedBlock;
ab1ff1 ¤   ¤   launchPB.launchEPBLength¤   ¤   = extendedBlockLen;
ca6a93 ¤   ¤   launchPB.launchFileFlags¤   ¤   = 0;
fde623 ¤   ¤   launchPB.launchControlFlags¤¤   = launchContinue | launchNoFileFlags;
c08d82 ¤   ¤   launchPB.launchAppSpec¤ ¤   ¤   = &browserSpec;
bf591b ¤   ¤   launchPB.launchAppParameters¤   = nil;
8f1b52 ¤   ¤
712ff3 ¤   ¤   status = LaunchApplication( &launchPB );
1b706e ¤   ¤   if( IsntErr( status ) )
865b34 ¤   ¤   {
3df56e ¤   ¤   ¤   status = SendURLToProcess( theURL, launchPB.launchProcessSN );
120fe4 ¤   ¤   }
959371 ¤   }
5567c5 ¤
8e4afd ¤   return( status );
c8efe6 }
6aaf5a
5d85ea ¤   OSStatus
f1d152 OpenURL(ConstStr255Param theURL)
8bbb36 {
2fc412 ¤   OSStatus¤   status;
4367c5 ¤
3ac4ee ¤   pgpAssertAddrValid( theURL, uchar );
9e67c5 ¤
6631ed ¤   status = SendURLToActiveBrowser( theURL );
91a187 ¤   if( IsErr( status ) )
3dc7a1 ¤   {
d0bc5b ¤   ¤   status = SendURLToInactiveBrowser( theURL );
319371 ¤   }
7eaf5a
694afd ¤   return( status );
febe43 }¶
--88bb 00123e6d4d840120235 Page 1 of MacInternet.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
b16b1d ¤   $Id: MacInternet.h,v 1.5.16.1 1998/11/12 03:19:39 heller Exp $
53f7f7 ____________________________________________________________________________*/
89af5a
207b7d #pragma once
7aaf5a
4399c6 PGP_BEGIN_C_DECLARATIONS
4a3ffd #if PRAGMA_IMPORT
3db981 #pragma import on
ab7454 #endif
11af5a
7faf5a
12af5a
aa4f38 OSStatus¤   ¤   OpenURL(ConstStr255Param theURL);
eaaf5a
acaf5a
88af5a
d73ffd #if PRAGMA_IMPORT
552ced #pragma import reset
5d7454 #endif
3f1254 PGP_END_C_DECLARATIONS
23af5a
--9f12 001f8456d9b40120236 Page 1 of MacInterrupts.c
a70335 /*____________________________________________________________________________
bdcfc2 ¤   Copyright (C) 1996 Network Associates, Inc. and its affiliates.
994b0f ¤   All rights reserved.
82f7f7 ____________________________________________________________________________*/
59af5a
a7f359 #include "MacInterrupts.h"
69af5a
630335 /*____________________________________________________________________________
a3f5b7 ¤   This is deliberately not an inline because as an inline MetroWerks
22576b ¤   optimizes out the memory access.
45f7f7 ____________________________________________________________________________*/
f37e69 ¤   Boolean
8890fd TestAndSet( volatile Boolean *value )
9ac7a1 ¤   {
313d86 ¤   Boolean¤result;
4167c5 ¤
7e4b54 ¤   EnterCriticalSection();
18855f ¤   result¤ = *value;
32db5f ¤   *value¤ = TRUE;
ef2778 ¤   ExitCriticalSection();
9067c5 ¤
494c6e ¤   return( result );
259371 ¤   }
88af5a
6daf5a
d2af5a
c1af5a
27af5a
f8af5a
--626c 001c8e7880840120237 Page 1 of MacInterrupts.h
a70335 /*____________________________________________________________________________
bdcfc2 ¤   Copyright (C) 1996 Network Associates, Inc. and its affiliates.
994b0f ¤   All rights reserved.
82f7f7 ____________________________________________________________________________*/
59af5a
fdaf5a
1cf521 #pragma parameter __D0 GetInterruptMask( )
990752 extern pascal short¤GetInterruptMask( void )¤   \
27bdb4 ¤   THREEWORDINLINE( 0x40C0, 0x0240, 0x0700 );
8aaf5a
e9af5a
a2837d ¤   inline Boolean
679714 InterruptsAreEnabled()
38c7a1 ¤   {
134747 ¤   return( GetInterruptMask() == 0 );
2f9371 ¤   }
b167c5 ¤
bb67c5 ¤
198d19 #if ! TARGET_CPU_PPC¤   // [
dcd83c ·
774995 #pragma parameter __D0 InterruptsOff( )
de470a extern pascal short¤InterruptsOff( void )¤  \
8e2c08 ¤   THREEWORDINLINE( 0x40C0, 0x007C, 0x0700 );
7567c5 ¤
1b67c5 ¤
dbf794 #pragma parameter RestoreInterrupts( __D0 )
0802d4 extern pascal void¤ ¤   RestoreInterrupts( short sr )
0687b9 ¤   ONEWORDINLINE( 0x46C0 );
5caf5a
89af5a
a68b0d #define EnterCriticalSection()¤ { short saveSR¤ = InterruptsOff()
39b29a #define ExitCriticalSection()¤  ·RestoreInterrupts( saveSR ); }
94af5a
0daf5a
cc0537 Boolean¤TestAndSet( volatile Boolean *value );
f1af5a
9daf5a
7176d8 #endif¤ // ]
6caf5a
30af5a
c8af5a
--ebb7 0001445a24640120238 Page 1 of MacMenus.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
c68e68 ¤   $Id: MacMenus.c,v 1.5.12.1 1998/11/12 03:19:41 heller Exp $
c0f7f7 ____________________________________________________________________________*/
022194 #include "pgpPFLConfig.h"¤  /* or pgpConfig.h in the CDK */
b2af5a
f9a146 #include "pgpDebug.h"
ba0d08 #include "pgpMem.h"
1e5c50 #include "MacMenus.h"
4eaf5a
92af5a
de69ed ¤   static ushort
e9b87e _GetNumMenusInMenuBar( const MenuList ** menuBar )
b9bb36 {
1297da ¤   ushort¤ ¤   ¤   ¤   numMenus¤   = 0;
34ea89 ¤   char *¤ ¤   ¤   ¤   firstMenu = (char *) &((**menuBar).menus[0]);
fc28a2 ¤   char *¤ ¤   ¤   ¤   lastMenu = (char *) *menuBar + (**menuBar).lastMenu
9d8e87 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   + sizeof(MenuRec);
6c67c5 ¤
04e80c ¤   numMenus¤   = (lastMenu - firstMenu) / sizeof( (**menuBar).menus[ 0 ] );
9a67c5 ¤
8eb7ee ¤   return( numMenus );
c3efe6 }
12af5a
c6363b ¤   ushort
5deb73 GetNumMenusInMenuBar( void )
53bb36 {
888ece ¤   const MenuList **¤  menuBar¤= NULL;
3a97da ¤   ushort¤ ¤   ¤   ¤   numMenus¤   = 0;
1767c5 ¤
c3b93e ¤   menuBar¤= (MenuList **)GetMenuBar();
7b948c ¤   pgpAssert( IsntNull( menuBar ) );
dc8617 ¤   if ( IsntNull( menuBar ) )
e9c7a1 ¤   {
b6d386 ¤   ¤   numMenus¤   = _GetNumMenusInMenuBar( menuBar );
03cad4 ¤   ¤   DisposeHandle( (Handle)menuBar );
739371 ¤   }
7767c5 ¤
8cb7ee ¤   return( numMenus );
f8efe6 }
92af5a
adaf5a
aa0a19 ¤   MenuHandle
60e4b6 GetIndMenuInMenuBar( ushort index )
c0bb36 {
c98ece ¤   const MenuList **¤  menuBar¤= NULL;
1e97da ¤   ushort¤ ¤   ¤   ¤   numMenus¤   = 0;
b0c1d8 ¤   MenuHandle¤ ¤   ¤   menu¤   = NULL;
9967c5 ¤
79b93e ¤   menuBar¤= (MenuList **)GetMenuBar();
fd948c ¤   pgpAssert( IsntNull( menuBar ) );
418617 ¤   if ( IsntNull( menuBar ) )
4dc7a1 ¤   {
0ab4e9 ¤   ¤   if ( index >= _GetNumMenusInMenuBar( menuBar ) )
945b34 ¤   ¤   {
cca4dc ¤   ¤   ¤   menu¤   = NULL;
460fe4 ¤   ¤   }
a30e1d ¤   ¤   else
755b34 ¤   ¤   {
900f1e ¤   ¤   ¤   menu¤   = (MenuHandle)((**menuBar).menus[ index ].menuRef);
4f0fe4 ¤   ¤   }
a21b52 ¤   ¤
8ecad4 ¤   ¤   DisposeHandle( (Handle)menuBar );
709371 ¤   }
0e67c5 ¤
2b779b ¤   return( menu );
44efe6 }
14af5a
--d873 001aa955d6840120238 Page 2 of MacMenus.c
e0af5a
1aaf5a
17af5a
78af5a
32af5a
93af5a
37af5a
a6af5a
33af5a
24af5a
c6af5a
2caf5a
16af5a
c4af5a
a3af5a
57af5a
65af5a
77af5a
0aaf5a
5daf5a
9caf5a
0baf5a
e6af5a
edaf5a
51af5a
11af5a
0eaf5a
00af5a
68af5a
727e4d /*__Editor_settings____
28af5a
8e4126 ¤   Local Variables:
127b17 ¤   tab-width: 4
120e6c ¤   End:
385f8c ¤   vi: ts=4 sw=4
ff9e9b ¤   vim: si
aad062 _____________________*/
--d90c 0014792eee840120239 Page 1 of MacMenus.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
5b683b ¤   $Id: MacMenus.h,v 1.3.12.1 1998/11/12 03:19:41 heller Exp $
e4f7f7 ____________________________________________________________________________*/
2a9cd1 #ifndef Included_MacMenus_h¤/* [ */
521964 #define Included_MacMenus_h
7eaf5a
bfc1f6 #include "Menus.h"
14af5a
88af46 #pragma options align=mac68k
739094 typedef struct MenuRec {
ee7072 ¤   MenuRef¤¤   menuRef;
c38394 ¤   SInt16¤ ¤   menuLeft;
659ac2 } MenuRec;
bdaf5a
c42f98 typedef struct MenuList {
6e0bd6 ¤   SInt16¤ lastMenu;
c77ba2 ¤   SInt16¤ lastRight;
48597a ¤   SInt16¤ notUsed;
94bc3b ¤   MenuRec¤menus[ 1 ];¤/* dynamic */
fe6696 } MenuList;
d87c46 #pragma options align=reset
9caf5a
ecaf5a
3199c6 PGP_BEGIN_C_DECLARATIONS
57af5a
d6af5a
cd49d4 ushort¤ ¤   GetNumMenusInMenuBar( void );
7e6cc8 MenuHandle¤ GetIndMenuInMenuBar( ushort index );
cbaf5a
4148c6 #define IsMenuItemEnabled(menuHandle, item)¤¤   ¤   ¤   ¤   ¤   \
dc72e3 ¤   ¤   ¤   (((**(menuHandle)).enableFlags & (0x00000001 << (item))) != 0)
60af5a
6eaf5a
dc1254 PGP_END_C_DECLARATIONS
3baf5a
6a14cf #endif /* ] Included_MacMenus_h */
9caf5a
c5af5a
da7e4d /*__Editor_settings____
f5af5a
dd4126 ¤   Local Variables:
997b17 ¤   tab-width: 4
6e0e6c ¤   End:
b45f8c ¤   vi: ts=4 sw=4
a59e9b ¤   vim: si
47d062 _____________________*/
--8e80 00143b85e7f4012023a Page 1 of MacNew.cp
a70335 /*____________________________________________________________________________
8bf76a ¤   MacNew.c
d167c5 ¤
74c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
894b0f ¤   All rights reserved.
0667c5 ¤
7967c5 ¤
2daf5a
003383 ¤   $Id: MacNew.cp,v 1.9.14.1 1998/11/12 03:19:42 heller Exp $
a7f7f7 ____________________________________________________________________________*/
cfaf5a
04a34c #include "MacNew.h"
690d08 #include "pgpMem.h"
c8af5a
298184 #if USE_MAC_OPERATOR_NEW
fb001b #error use 'USE_PGP_OPERATOR_NEW'
567454 #endif
fdaf5a
47af5a
933c01 #if USE_PGP_OPERATOR_NEW¤   // [
b1af5a
1dc615 #include <new>
4caf5a
84af5a
1affe3 MacNewDummy::MacNewDummy()
b4c7a1 ¤   {
949371 ¤   }
b5af5a
570335 /*____________________________________________________________________________
cf6c38 ¤   With the modern memory manager, NewPtr() is substantially faster
89b2b0 ¤   than MetroWerks operator new().
3cf7f7 ____________________________________________________________________________*/
8559fc ¤   void *
656816 operator new(size_t size)
11c7a1 ¤   {
7e4620 ¤   void *ptr;
5567c5 ¤
2c7517 #if MEMORY_ALLOC_MUST_BE_APP
77f12b ¤   pgpAssertMsg( GetZone() == ApplicationZone(),
777466 ¤   ¤   "operator new: MEMORY_ALLOC_MUST_BE_APP");
b14175 #elif MEMORY_ALLOC_MUST_BE_SYS
ba905a ¤   pgpAssertMsg( GetZone() == SystemZone(),
f9ceab ¤   ¤   "operator new: MEMORY_ALLOC_MUST_BE_SYS");
ad372b #elif MEMORY_ALLOC_MUST_BE_APP_OR_SYS
e779bf ¤   pgpAssertMsg( GetZone() == ApplicationZone() || GetZone() == SystemZone(),
095c95 ¤   ¤   "operator new: MEMORY_ALLOC_MUST_BE_APP_OR_SYS");
6f7454 #endif
9aaf5a
520d5a ¤   ptr¤= pgpAlloc( size );
fb67c5 ¤
018726 ¤   return ptr;
8e9371 ¤   }
1c67c5 ¤
5867c5 ¤
b36d52 ¤   void
a382aa operator delete(void *ptr)
62c7a1 ¤   {
008756 ¤   if ( IsntNull( ptr ) )
c45b34 ¤   ¤   {
e3c32a ¤   ¤   pgpFree( ptr );
e40fe4 ¤   ¤   }
169371 ¤   }
b5af5a
436627 #endif¤ // ]¶
--cb5f 001c52d2eeb4012023b Page 1 of MacNew.h
a70335 /*____________________________________________________________________________
d8843a ¤   Debug.c: general purpose debugging code.
ecf7f7 ____________________________________________________________________________*/
2a7b7d #pragma once
b2af5a
d00335 /*____________________________________________________________________________
4f90cd ¤   'USE_PGP_OPERATOR_NEW' controls whether we use our own operator new() and
f2f90a ¤   operator delete(). ·By default, this flag is set.
a867c5 ¤
301350 ¤   The dummy class is referenced elsewhere in order to ensure that MacNew.cp
49655a ¤   has been linked in.
b1f7f7 ____________________________________________________________________________*/
70af5a
90796a #ifndef USE_PGP_OPERATOR_NEW
48ede7 ¤   #error you must define 'USE_PGP_OPERATOR_NEW' as 0 or 1
f37454 #endif
f3af5a
83af5a
6baf5a
9034f9 #if USE_PGP_OPERATOR_NEW¤   // [·
7caf5a
ededd0 class MacNewDummy
9abb36 {
0567d4 ¤   public:
a0b51d ¤   ¤   MacNewDummy( void );
3e82f7 };
baaf5a
c56627 #endif¤ // ]¶
--102f 0007e6512904012023c Page 1 of MacNumerics.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
144e63 ¤   $Id: MacNumerics.c,v 1.5.28.1 1998/11/12 03:19:43 heller Exp $
e9f7f7 ____________________________________________________________________________*/
65af5a
a2af5a
e4af5a
edd7a9 #include "MacNumerics.h"
44af5a
e90335 /*____________________________________________________________________________
525a20 ¤   BCDToDecimal: Convert a 32 bit BCD value to decimal form
50f7f7 ____________________________________________________________________________*/
43af5a
4f6d52 ¤   void
97eda7 BCDToDecimal(UInt32 bcdValue, UInt32 *decimalValue)
f0bb36 {
8befa3 ¤   UInt32¤ ¤   value;
c1d1b5 ¤   UInt32¤ ¤   multiplier;
2d1031 ¤   UInt32¤ ¤   curBCD;
95f9dc ¤   ItemCount¤  iteration;
6367c5 ¤
a4a87d ¤   pgpAssertAddrValid( decimalValue, UInt32 );
c067c5 ¤
3136d0 ¤   value ¤ ¤   = 0;
071ee5 ¤   multiplier¤ = 1;
7e74fe ¤   curBCD¤ ¤   = bcdValue;
7e67c5 ¤
180081 ¤   /* Get each nibble of the BCD value,
9de7c3 ¤   multiply by the appropriate multiple of
437404 ¤   ¤   10 and add to the result.*/
ba67c5 ¤
7edcd2 ¤   for( iteration = 1; iteration <= 8; iteration++ )
08c7a1 ¤   {
af7713 ¤   ¤   UInt32¤ curNibble;
f51b52 ¤   ¤
95c166 ¤   ¤   curNibble = curBCD & 0x0000000F;
2829e7 ¤   ¤   pgpAssertMsg( curNibble <= 9, "BCDToDecimal: Invalid BCD value" );
501b52 ¤   ¤
a18e05 ¤   ¤   value ¤ ¤   += curNibble * multiplier;
f9c4a1 ¤   ¤   multiplier ¤*= 10;
001b52 ¤   ¤
b7d134 ¤   ¤   curBCD = curBCD >> 4;
451afa ¤   ¤   if( curBCD == 0 )
29cdcb ¤   ¤   ¤   break;
2e9371 ¤   }
6967c5 ¤
f86e3d ¤   *decimalValue = value;¤
49efe6 }
74af5a
2053f3 ¤   CRC16
74acdb ContinueCRC16(const void *theBytes, UInt32 numBytes, CRC16 startCRC)
0fbb36 {
8d3bfe ¤   register CRC16¤ crc ¤   = startCRC;
9bf602 ¤   register uchar¤ *cur ¤  = (uchar *) theBytes;
33b6bc ¤   register uchar¤ *last¤  = cur + numBytes - 1;
9a0a63 ¤   register SInt16¤k1021¤  = 0x1021;
2567c5 ¤
d44b22 ¤   while(cur <= last)
2ec7a1 ¤   {
658570 ¤   ¤   register SInt16¤check;
6d1b52 ¤   ¤
2c2ff4 ¤   ¤   crc ^= ((SInt16) *cur) << 8;
ef5f1b ¤   ¤   ++cur;
681b52 ¤   ¤
d22680 ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k1021;
2d2680 ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k1021;
be2680 ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k1021;
aa2680 ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k1021;
4f2680 ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k1021;
7e2680 ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k1021;
--10b1 001a2c0dc124012023c Page 2 of MacNumerics.c
a32680 ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k1021;
ae2680 ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k1021;
584032 ¤   }¤  ¤
f067c5 ¤
e9397e ¤   return( crc );
5aefe6 }
3baf5a
b353f3 ¤   CRC16
6f58a8 ComputeCRC16(const void *theBytes, UInt32 numBytes)
babb36 {
ac5a1f ¤   return( ContinueCRC16( theBytes, numBytes, 0 ) );
0eefe6 }
ceaf5a
da812b ¤   CRC32
e50f09 ContinueCRC32(const void *theBytes, UInt32 numBytes, CRC32 startCRC)
48bb36 {
8a508e ¤   register CRC32 ¤crc ¤   ¤   = startCRC;
c6b494 ¤   register uchar¤ *cur ¤  ¤   = (uchar *) theBytes;
98328c ¤   register uchar¤ *last¤  ¤   = cur + numBytes - 1;
6df9dc ¤   register SInt32¤k4C11DB7¤   = 0x04C11DB7;
0b67c5 ¤
cd4b22 ¤   while(cur <= last)
7cc7a1 ¤   {
03e2db ¤   ¤   register SInt32¤check;
971b52 ¤   ¤
839d22 ¤   ¤   crc ^= ((SInt32 ) *cur) << 8;
1f5f1b ¤   ¤   ++cur;
09af5a
ced84b ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
1dd84b ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
52d84b ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
aed84b ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
efd84b ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
22d84b ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
5fd84b ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
e9d84b ¤   ¤   check = crc; crc <<= 1; if( check < 0 ) crc ^= k4C11DB7;
1b9371 ¤   }
e367c5 ¤
fc397e ¤   return( crc );
61efe6 }
881b52 ¤   ¤
c8812b ¤   CRC32
5f7e9f ComputeCRC32(const void *theBytes, UInt32 numBytes)
f4bb36 {
ca5baa ¤   return( ContinueCRC32( theBytes, numBytes, 0 ) );
a2efe6 }
--79aa 001127a3c464012023d Page 1 of MacNumerics.h
a70335 /*____________________________________________________________________________
7bf254 ¤   Copyright (C) 1996,1997 Network Associates, Inc. and its affiliates.
754b0f ¤   All rights reserved.
0967c5 ¤
bd3ce7 ¤   $Id: MacNumerics.h,v 1.8.18.1 1998/11/12 03:19:43 heller Exp $
2bf7f7 ____________________________________________________________________________*/
6daf5a
fb7b7d #pragma once
d9af5a
45c5d5 #include "pgpBase.h"
63675a #include "pgpTypes.h"
83af5a
8c6804 typedef SInt16¤ CRC16;
6529ad typedef SInt32¤ CRC32;
9caf5a
3399c6 PGP_BEGIN_C_DECLARATIONS
773ffd #if PRAGMA_IMPORT
0eb981 #pragma import on
907454 #endif
84af5a
49af5a
fdaf5a
492795 void¤   BCDToDecimal(UInt32 bcdValue, UInt32 *decimalValue);
68af5a
f46bec CRC16¤  ComputeCRC16(const void *theBytes, UInt32 numBytes);
d3e6ae CRC16¤  ContinueCRC16(const void *theBytes, UInt32 numBytes, CRC16 startCRC);
36af5a
6b8308 CRC32¤  ComputeCRC32(const void *theBytes, UInt32 numBytes);
b417c5 CRC32¤  ContinueCRC32(const void *theBytes, UInt32 numBytes, CRC32 startCRC);
b0af5a
0aaf5a
9baf5a
1d3ffd #if PRAGMA_IMPORT
072ced #pragma import reset
4c7454 #endif
122827 PGP_END_C_DECLARATIONS¶
--be29 001220ea3d74012023e Page 1 of MacProcesses.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
72ed6d ¤   $Id: MacProcesses.c,v 1.5.28.1 1998/11/12 03:19:44 heller Exp $
d2f7f7 ____________________________________________________________________________*/
5caf5a
020d08 #include "pgpMem.h"
62af5a
1474e2 #include "MacProcesses.h"
53af5a
377e69 ¤   Boolean
17dff0 FindProcess(
28d10d ¤   OSType ¤¤   ¤   ¤   type,¤  ¤   ¤   ¤
aec334 ¤   OSType ¤¤   ¤   ¤   creator,¤   ¤
434ed4 ¤   ProcessSerialNumber *psn,¤  ¤   ¤   ¤
7b5b7c ¤   ProcessInfoRec¤ ¤   *processInfo,¤  ¤
a48888 ¤   FSSpec¤ ¤   ¤   ¤   *processSpec,¤  ¤
43b902 ¤   StringPtr¤  ¤   ¤   processName)¤   ¤
7dbb36 {
f242f9 ¤   ProcessSerialNumber¤tempPSN;
c22af1 ¤   ProcessInfoRec¤ ¤   tempProcessInfo;
61b809 ¤   Str255¤ ¤   ¤   ¤   tempProcessName;
0fac17 ¤   FSSpec¤ ¤   ¤   ¤   tempProcessSpec;
c5a034 ¤   Boolean¤¤   ¤   ¤   foundProcess = FALSE;
5267c5 ¤
649593 ¤   AssertAddrNullOrValid( psn, ProcessSerialNumber, "FindProcess" );
b16f3d ¤   AssertAddrNullOrValid( processInfo, ProcessInfoRec, "FindProcess" );
ee2e8a ¤   AssertAddrNullOrValid( processSpec, FSSpec, "FindProcess" );
28b60f ¤   AssertAddrNullOrValid( processName, uchar, "FindProcess" );
f167c5 ¤
c5d6ab ¤   if( IsNull( psn ) )
2229cd ¤   ¤   psn = &tempPSN;
ea67c5 ¤
545eb3 ¤   if( IsNull( processInfo ) )
434516 ¤   ¤   processInfo = &tempProcessInfo;
281b52 ¤   ¤
0eb7f8 ¤   if( IsNull( processSpec ) )
37d79f ¤   ¤   processSpec = &tempProcessSpec;
3a1b52 ¤   ¤
e9596f ¤   if( IsNull( processName ) )
e9bdb7 ¤   ¤   processName = &tempProcessName[0];
8567c5 ¤
b21ee6 ¤   pgpClearMemory( processInfo, sizeof( *processInfo ) );
cb67c5 ¤
1f9ca2 ¤   psn->lowLongOfPSN ¤ = kNoProcess;
4c24f6 ¤   psn->highLongOfPSN ¤= 0;
fb67c5 ¤
cedd02 ¤   processInfo->processInfoLength¤ = sizeof( *processInfo );
55e2cd ¤   processInfo->processName¤   ¤   = processName;
ba5a7d ¤   processInfo->processAppSpec¤¤   = processSpec;
8567c5 ¤
1a4e2f ¤   while( IsntErr( GetNextProcess( psn ) ) )
86c7a1 ¤   {
358b22 ¤   ¤   if( IsntErr( GetProcessInformation( psn, processInfo ) ) )
c15b34 ¤   ¤   {
ecf0e7 ¤   ¤   ¤   if( processInfo->processType == type &&
1ece97 ¤   ¤   ¤   ¤   processInfo->processSignature == creator )
69f776 ¤   ¤   ¤   {
05ab20 ¤   ¤   ¤   ¤   foundProcess = TRUE;
86f622 ¤   ¤   ¤   ¤   break;
4aa3a6 ¤   ¤   ¤   }
ae0fe4 ¤   ¤   }
919371 ¤   }
99af5a
039ae6 ¤   return( foundProcess );
22efe6 }
--7d2d 0013ff3cc3b4012023f Page 1 of MacProcesses.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
4da7b7 ¤   $Id: MacProcesses.h,v 1.5.16.1 1998/11/12 03:19:44 heller Exp $
5ff7f7 ____________________________________________________________________________*/
57af5a
b57b7d #pragma once
19af5a
21e0ab #include <Processes.h>
beaf5a
9199c6 PGP_BEGIN_C_DECLARATIONS
ba3ffd #if PRAGMA_IMPORT
68b981 #pragma import on
aa7454 #endif
a5af5a
75af5a
55af5a
15cc64 Boolean¤¤   FindProcess(OSType type, OSType creator, ProcessSerialNumber *psn,
e31c8b ¤   ¤   ¤   ¤   ¤   ¤   ProcessInfoRec *processInfo, FSSpec *processSpec,
c7d9cd ¤   ¤   ¤   ¤   ¤   ¤   StringPtr processName);
00af5a
7daf5a
afaf5a
433ffd #if PRAGMA_IMPORT
5c2ced #pragma import reset
0b7454 #endif
461254 PGP_END_C_DECLARATIONS
3faf5a
--9ea1 00065bfe1b440120240 Page 1 of MacQuickdraw.c
a70335 /*____________________________________________________________________________
30c3af ¤   MacQuickdraw.c
b467c5 ¤
57c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
474b0f ¤   All rights reserved.
34af5a
ca7c7a ¤   $Id: MacQuickdraw.c,v 1.6.12.1 1998/11/12 03:19:45 heller Exp $
48f7f7 ____________________________________________________________________________*/
9daf5a
b5b86a #include "MacQuickdraw.h"
bca146 #include "pgpDebug.h"
bcaf5a
060335 /*____________________________________________________________________________
3cb56d ¤   Align one rectangle inside another
ecf7f7 ____________________________________________________________________________*/
9aaf5a
ba6d52 ¤   void
8a475f AlignRect(const Rect *staticRect, Rect *alignRect, RectAlignment howToAlign)
c7bb36 {
838a3e ¤   short¤  vOffset = 0;
7ae068 ¤   short¤  hOffset = 0;
e9af5a
630dc3 ¤   pgpAssertAddrValid( staticRect, Rect );
d88e96 ¤   pgpAssertAddrValid( alignRect, Rect );
9f67c5 ¤
7cebb6 ¤   if( ( howToAlign & kAlignAtTop ) != 0 )
e2c7a1 ¤   {
c72b55 ¤   ¤   vOffset = staticRect->top - alignRect->top;
d69371 ¤   }
92ed55 ¤   else if( ( howToAlign & kAlignAtBottom ) != 0 )
05c7a1 ¤   {
a90e62 ¤   ¤   vOffset = staticRect->bottom - alignRect->bottom;
209371 ¤   }
58258a ¤   else if( ( howToAlign & kAlignAtVerticalCenter ) != 0 )
d0c7a1 ¤   {
38a162 ¤   ¤   vOffset = ( ( staticRect->top + staticRect->bottom ) -
4dc004 ¤   ¤   ¤   ¤   ¤   ¤   ( alignRect->top + alignRect->bottom ) ) / 2;
de9371 ¤   }
4aaf5a
1bf794 ¤   if( ( howToAlign & kAlignAtLeft ) != 0 )
08c7a1 ¤   {
502f5d ¤   ¤   hOffset = staticRect->left - alignRect->left;
249371 ¤   }
7a463d ¤   else if( ( howToAlign & kAlignAtRight ) != 0 )
e1c7a1 ¤   {
b50fe7 ¤   ¤   hOffset = staticRect->right - alignRect->right;
479371 ¤   }
018ef0 ¤   else if( ( howToAlign & kAlignAtHorizontalCenter ) != 0 )
edc7a1 ¤   {
874132 ¤   ¤   hOffset = ( ( staticRect->left + staticRect->right ) -
09f894 ¤   ¤   ¤   ¤   ¤   ¤   ( alignRect->left + alignRect->right ) ) / 2;
3b9371 ¤   }
4d67c5 ¤
07e53a ¤   OffsetRect( alignRect, hOffset, vOffset );
c1efe6 }
a7af5a
c438e5 /*
545c57 ** ¤The following three routines have been liberally borrowed from Apple's
97fbec **¤ Appearance Manager SDK sample code.
070158 **
4293a1 **¤ Gets the current drawing environment and stores the data in state.
673217 **¤ We copy pen and back pix pats only if they are not type 0 (plain ol
1ce4fd **¤ expanded black and white patterns).
b47fe0 */
20af5a
8c6d52 ¤   void
20279e GetColorAndPenState( ColorPenState* state )
efbb36 {
e079ec ¤   GrafPtr¤¤   ¤   curPort;
dc67c5 ¤
38d5fb ¤   GetPort( &curPort );
6567c5 ¤
--cffe 000f49acce440120240 Page 2 of MacQuickdraw.c
6690c4 ¤   state->pnPixPat = nil;
5945ee ¤   state->bkPixPat = nil;
4baf5a
cd9ede ¤   state->colorPort = IsColorGrafPort( curPort );
7faf5a
ab823b ¤   state->bkPat = curPort->bkPat;
80fe7d ¤   state->bkColor = curPort->bkColor;
ce19e2 ¤   state->fgColor = curPort->fgColor;
f9af5a
597ce8 ¤   if ( state->colorPort )
9ac7a1 ¤   {
3d8605 ¤   ¤   GetForeColor( &state->foreColor );
c0b2e0 ¤   ¤   GetBackColor( &state->backColor );
991b52 ¤   ¤
0f7aad ¤   ¤   ¤   /*
58ccbd ¤   ¤   ¤   ** If the pen pattern is not an old style pattern,
faae31 ¤   ¤   ¤   ** copy the handle. If it is an old style pattern,
817977 ¤   ¤   ¤   ** GetPenState below will save the right thing.
4e3da8 ¤   ¤   ¤   */
b187c7 ¤   ¤   ¤
f30548 ¤   ¤   if ( (**((CGrafPtr)curPort)->pnPixPat).patType != 0 )
2d5b34 ¤   ¤   {
caf10c ¤   ¤   ¤   state->pnPixPat = ((CGrafPtr)curPort)->pnPixPat;
e80fe4 ¤   ¤   }
081b52 ¤   ¤
c77aad ¤   ¤   ¤   /*
5accbd ¤   ¤   ¤   ** If the pen pattern is not an old style pattern,
2e6a9b ¤   ¤   ¤   ** copy the handle, else get the old pattern into
b9734d ¤   ¤   ¤   ** bkPat for restoring that way.
5a3da8 ¤   ¤   ¤   */
3c87c7 ¤   ¤   ¤
82744b ¤   ¤   if ( (**((CGrafPtr)curPort)->bkPixPat).patType != 0 )
215b34 ¤   ¤   {
3bcb82 ¤   ¤   ¤   state->bkPixPat = ((CGrafPtr)curPort)->bkPixPat;
e40fe4 ¤   ¤   }
050e1d ¤   ¤   else
fe5b34 ¤   ¤   {
fb273f ¤   ¤   ¤   state->bkPat =
ea919d ¤   ¤   ¤   ¤   *(PatPtr)(*(**((CGrafPtr)curPort)->bkPixPat).patData);
6e0fe4 ¤   ¤   }
449371 ¤   }
e31b52 ¤   ¤
0d1c54 ¤   GetPenState( &state->pen );
8c1889 ¤   state->textMode = curPort->txMode;
03efe6 }
d9af5a
d896ab /* Sets the current drawing environment based on the data in state. */
fdaf5a
006d52 ¤   void
677258 SetColorAndPenState( ColorPenState* state )
eebb36 {
c00d5b ¤   GrafPtr¤¤   curPort;
b867c5 ¤
1bd5fb ¤   GetPort( &curPort );
d7af5a
90bd33 ¤   SetPenState( &state->pen );
bbaf5a
103fc4 ¤   if ( IsColorGrafPort( curPort ) && state->colorPort )
9ac7a1 ¤   {
c7473f ¤   ¤   RGBForeColor( &state->foreColor );
5873da ¤   ¤   RGBBackColor( &state->backColor );
26af5a
e21239 ¤   ¤   if ( state->pnPixPat )
28e38f ¤   ¤   ¤   PenPixPat( state->pnPixPat );
5aaf5a
7954e5 ¤   ¤   if ( state->bkPixPat )
f77d20 ¤   ¤   ¤   BackPixPat( state->bkPixPat );
f50e1d ¤   ¤   else
8edefa ¤   ¤   ¤   BackPat( &state->bkPat );
d09371 ¤   }
e40e24 ¤   else
f4c7a1 ¤   {
--33c2 0014bc4687f40120240 Page 3 of MacQuickdraw.c
ae3189 ¤   ¤   BackPat( &state->bkPat );
6c1e45 ¤   ¤   ForeColor( state->fgColor );
c72a1b ¤   ¤   BackColor( state->bkColor );
d69371 ¤   }
b4af5a
be134c ¤   TextMode( state->textMode );
4aefe6 }
30af5a
203eff /* Sets up our environment to standard drawing fare. */
5aaf5a
766d52 ¤   void
08af9f NormalizeColorAndPen()
28bb36 {
81db08 ¤   RGBColor¤   ¤   black, white;
166994 ¤   Pattern¤¤   ¤   whitePat ={ 0x00, };
ec79ec ¤   GrafPtr¤¤   ¤   curPort;
db67c5 ¤
e7d5fb ¤   GetPort( &curPort );
d067c5 ¤
9aba16 ¤   black.red = black.green = black.blue = 0x0000;
6eaa30 ¤   white.red = white.green = white.blue = 0xFFFF;
2d67c5 ¤
b97613 ¤   if ( IsColorGrafPort( curPort ) )
9fc7a1 ¤   {
b34d6d ¤   ¤   RGBForeColor( &black );
8fe1c5 ¤   ¤   RGBBackColor( &white );
a99371 ¤   }
db1578 ¤   PenNormal();
6ad0f1 ¤   BackPat( &whitePat );
e353d8 ¤   TextMode( srcOr );
c2efe6 }
f3af5a
d37e69 ¤   Boolean
ab7787 IsColorGrafPort(GrafPtr thePort)
10bb36 {
e289c4 ¤   return( (thePort->portBits.rowBytes & 0xC000) == 0xC000 );
c0efe6 }
4baf5a
--16e3 001bcfed31040120241 Page 1 of MacQuickdraw.h
a70335 /*____________________________________________________________________________
7bf254 ¤   Copyright (C) 1996,1997 Network Associates, Inc. and its affiliates.
754b0f ¤   All rights reserved.
0967c5 ¤
7d66cb ¤   $Id: MacQuickdraw.h,v 1.6.12.1 1998/11/12 03:19:46 heller Exp $
10f7f7 ____________________________________________________________________________*/
e7af5a
657b7d #pragma once
c3af5a
c29ad3 #include <QuickDraw.h>
7daf5a
9ac5d5 #include "pgpBase.h"
84af5a
390478 typedef enum RectAlignment
93bb36 {
8df07f ¤   kAlignAtNone¤   ¤   ¤   ¤   = 0x00,
aaaf5a
d190d4 ¤   kAlignAtTop¤¤   ¤   ¤   ¤   = 0x01,
63e2a3 ¤   kAlignAtVerticalCenter¤ ¤   = 0x02,
055cb7 ¤   kAlignAtBottom¤ ¤   ¤   ¤   = 0x04,
0367c5 ¤
094736 ¤   kAlignAtLeft¤   ¤   ¤   ¤   = 0x10,
78cb0d ¤   kAlignAtHorizontalCenter¤   = 0x20,
3bfc15 ¤   kAlignAtRight¤  ¤   ¤   ¤   = 0x40,
bbaf5a
90be29 ¤   kAlignAtTopLeft¤¤   ¤   ¤   = (kAlignAtTop | kAlignAtLeft),
7c61ce ¤   kAlignAtTopCenter¤  ¤   ¤   = (kAlignAtTop | kAlignAtHorizontalCenter),
f1a5d8 ¤   kAlignAtTopRight¤   ¤   ¤   = (kAlignAtTop | kAlignAtRight),
8baf5a
08c700 ¤   kAlignAtCenterLeft¤ ¤   ¤   = (kAlignAtVerticalCenter | kAlignAtLeft),
4ae572 ¤   kAlignAtAbsoluteCenter¤ ¤   =
1c953b ¤   ¤   (kAlignAtVerticalCenter | kAlignAtHorizontalCenter),
6f0f60 ¤   kAlignAtCenterRight¤¤   ¤   =
cd1e4f ¤   ¤   (kAlignAtVerticalCenter | kAlignAtRight),
6faf5a
4aa104 ¤   kAlignAtBottomLeft¤ ¤   ¤   = (kAlignAtBottom | kAlignAtLeft),
23d164 ¤   kAlignAtBottomCenter¤   ¤   = (kAlignAtBottom | kAlignAtHorizontalCenter),
64af6f ¤   kAlignAtBottomRight¤¤   ¤   = (kAlignAtBottom | kAlignAtRight)
5baf5a
d039fb } RectAlignment;
2baf5a
973ea4 typedef struct ColorPenState
8abb36 {
d703e7 ¤   Boolean¤¤   ¤   colorPort;
e41d69 ¤   RGBColor¤   ¤   foreColor;
5e40a3 ¤   RGBColor¤   ¤   backColor;
d13733 ¤   PenState¤   ¤   pen;
14ba11 ¤   SInt16¤ ¤   ¤   textMode;
a9100d ¤   PixPatHandle¤   pnPixPat;
57e809 ¤   PixPatHandle¤   bkPixPat;
c406f4 ¤   Pattern¤¤   ¤   bkPat;
5301c4 ¤   UInt32¤ ¤   ¤   fgColor;
9c0543 ¤   UInt32¤ ¤   ¤   bkColor;
a4af5a
b838e1 } ColorPenState;
baaf5a
7199c6 PGP_BEGIN_C_DECLARATIONS
77af5a
d6a975 void¤   ¤   AlignRect(const Rect *staticRect,
ee7c06 ¤   ¤   ¤   ¤   Rect *alignRect, RectAlignment howToAlign);
0f1fab void¤   ¤   GetColorAndPenState( ColorPenState* state );
5cb03b Boolean¤¤   IsColorGrafPort(GrafPtr thePort);
6abcc4 void¤   ¤   SetColorAndPenState( ColorPenState* state );
df2e67 void¤   ¤   NormalizeColorAndPen();
caaf5a
bc2827 PGP_END_C_DECLARATIONS¶
--1230 00002c096cb40120242 Page 1 of MacResources.c
a70335 /*____________________________________________________________________________
e00908 ¤   MacResources.c
a967c5 ¤
abc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
324b0f ¤   All rights reserved.
5267c5 ¤
fd67c5 ¤
40af5a
b22be6 ¤   $Id: MacResources.c,v 1.10.16.1 1998/11/12 03:19:46 heller Exp $
fff7f7 ____________________________________________________________________________*/
7aaf5a
294d37 #include <LowMem.h>
cffd5c #include <Resources.h>
0caf5a
ca46ad #include "MacDebug.h"
fac110 #include "pgpMacMemory.h"
006915 #include "MacResources.h"
1aaf5a
f50335 /*____________________________________________________________________________
ec2252 ¤   AddWriteResource: Add a non-resource handle to a the current resource file
c7eeb5 ¤   and write the data to the file. The resource handle is detached if an error
7717db ¤   occurs. resourceName can be nil
cef7f7 ____________________________________________________________________________*/
98af5a
0285ea ¤   OSStatus
8e18c0 AddWriteResource(
bd2b4d ¤   Handle ¤¤   ¤   ¤   theResource,
fdbcbf ¤   OSType ¤¤   ¤   ¤   resourceType,
c188df ¤   short ¤ ¤   ¤   ¤   resourceID,
18e697 ¤   ConstStr255Param¤   resourceName)
7dbb36 {
7bc412 ¤   OSStatus¤   status;
f367c5 ¤
e8e719 ¤   AssertHandleIsValid( theResource, "AddWriteResource" );
709c29 ¤   AssertAddrNullOrValid( resourceName, ConstStr255Param, "AddWriteResource" );
c367c5 ¤
188285 ¤   AddResource( theResource, resourceType, resourceID,
f6646a ¤   ¤   ¤   ¤   ¤   IsntNull( resourceName ) ? resourceName : "\p" );
b2af5a
d6260d ¤   status = ResError();
02edc6 ¤   AssertNoErr( status, nil );
6daf5a
7cdd30 ¤   if( IsntErr( status ) )
9cc7a1 ¤   {
2ebebe ¤   ¤   WriteResource( theResource );
251b52 ¤   ¤
0c1250 ¤   ¤   status = ResError();
3c663a ¤   ¤   AssertNoErr( status, nil );
691b52 ¤   ¤
8b28d3 ¤   ¤   if( IsErr( status ) )
105b34 ¤   ¤   {
4f7aad ¤   ¤   ¤   /*
110ea7 ¤   ¤   ¤   ** Detach theResource in this case so the state of the Handle
028a7b ¤   ¤   ¤   ** is known upon function exit.
f33da8 ¤   ¤   ¤   */
3287c7 ¤   ¤   ¤
0f40ed ¤   ¤   ¤   DetachResource( theResource );
830fe4 ¤   ¤   }
779371 ¤   }
2f67c5 ¤
af4afd ¤   return( status );
5befe6 }
b0af5a
ad0335 /*____________________________________________________________________________
859b82 ¤   AddWriteResourcePtr: Add a data to a the current resource file
167a20 ¤   and write the data to the file.·
d1f7f7 ____________________________________________________________________________*/
e6af5a
7785ea ¤   OSStatus
149dd6 AddWriteResourcePtr(
587796 ¤   const void *¤   ¤   resourceData,
029a7f ¤   ByteCount¤  ¤   ¤   resourceDataSize,
--1dcc 000edb1cbce40120242 Page 2 of MacResources.c
b3bcbf ¤   OSType ¤¤   ¤   ¤   resourceType,
9c88df ¤   short ¤ ¤   ¤   ¤   resourceID,
d7e697 ¤   ConstStr255Param¤   resourceName)
dcbb36 {
f9c412 ¤   OSStatus¤   status;
e6282e ¤   Handle¤ ¤   theResource;
de67c5 ¤
444183 ¤   pgpAssertAddrValid( resourceData, char );
d6d6ec ¤   AssertAddrNullOrValid( resourceName, ConstStr255Param, nil );
0067c5 ¤
01b521 ¤   theResource = pgpNewHandle( resourceDataSize, kMacMemory_UseCurrentHeap |
a1da36 ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap | kMacMemory_UseSystemHeap );
94abcb ¤   if( IsntNull( theResource ) )
b0c7a1 ¤   {
1722e8 ¤   ¤   BlockMoveData( resourceData, *theResource, resourceDataSize );
411b52 ¤   ¤
b0b4fb ¤   ¤   status = AddWriteResource( theResource,
271574 ¤   ¤   ¤   resourceType, resourceID, resourceName );
dd706e ¤   ¤   if( IsntErr( status ) )
875b34 ¤   ¤   {
eabe87 ¤   ¤   ¤   UpdateResFile( CurResFile() );
d340ed ¤   ¤   ¤   DetachResource( theResource );
510fe4 ¤   ¤   }
2c1b52 ¤   ¤
ff6b69 ¤   ¤   pgpDisposeHandle( theResource );
e49371 ¤   }
ec0e24 ¤   else
13c7a1 ¤   {
aac589 ¤   ¤   status = memFullErr;
1a9371 ¤   }
ea67c5 ¤
e64afd ¤   return( status );
a9efe6 }
35af5a
440335 /*____________________________________________________________________________
1d2c3e ¤   ForceResError: GetResource can sometimes return a nil handle and set
a21444 ¤   ResErr to noErr. This is a replacement function for ResError()
590f13 ¤   which returns ResError() is is is not noErr and defaultError if it is.
40f7f7 ____________________________________________________________________________*/
e1af5a
bb85ea ¤   OSStatus
af7340 ForceResError(OSStatus defaultError)
abbb36 {
24c412 ¤   OSStatus¤   status;
a967c5 ¤
b0260d ¤   status = ResError();
b4dd30 ¤   if( IsntErr( status ) )
bcfee6 ¤   ¤   status = defaultError;
161b52 ¤   ¤
084afd ¤   return( status );
3fefe6 }
33af5a
5c0335 /*____________________________________________________________________________
62bc63 ¤   Remove1Resource: Delete the specified resource from the current resource
28d750 ¤   file.
e5f7f7 ____________________________________________________________________________*/
62af5a
0185ea ¤   OSStatus
ba52a6 Remove1Resource(
3e4ab0 ¤   OSType ¤resourceType,
b02cac ¤   short ¤ resourceID,
76f5d5 ¤   Boolean removeProtectedResources)
7cbb36 {
e2c412 ¤   OSStatus¤   status;
c6282e ¤   Handle¤ ¤   theResource;
03bb1e ¤   Boolean¤¤   saveResLoad;
5767c5 ¤
4b4407 ¤   saveResLoad = LMGetResLoad();
95af5a
e0e7a3 ¤   SetResLoad( FALSE );
ad9ab3 ¤   ¤   theResource = Get1Resource( resourceType, resourceID );
ed0e99 ¤   SetResLoad( saveResLoad );
--bf00 000daf975a540120242 Page 3 of MacResources.c
2a67c5 ¤
c4abcb ¤   if( IsntNull( theResource ) )
cbc7a1 ¤   {
5c77f6 ¤   ¤   if( removeProtectedResources )
4e5b34 ¤   ¤   {
9411a1 ¤   ¤   ¤   short¤  resourceAttributes;
e767c5 ¤
b7c711 ¤   ¤   ¤   resourceAttributes = GetResAttrs( theResource );
c172c1 ¤   ¤   ¤   if( ( resourceAttributes & resProtected ) != 0 )
c1f776 ¤   ¤   ¤   {
bbbd12 ¤   ¤   ¤   ¤   SetResAttrs( theResource, resourceAttributes &= ~resProtected );
14a3a6 ¤   ¤   ¤   }
ba0fe4 ¤   ¤   }
8f1b52 ¤   ¤
f4410f ¤   ¤   RemoveResource( theResource );
daaf5a
751250 ¤   ¤   status = ResError();
aa663a ¤   ¤   AssertNoErr( status, nil );
301b52 ¤   ¤
6503a3 ¤   ¤   DisposeHandle( theResource );
689371 ¤   }
d90e24 ¤   else
27c7a1 ¤   {
d16849 ¤   ¤   status = ForceResError( resNotFound );
f89371 ¤   }
3f1b52 ¤   ¤
974afd ¤   return( status );
afefe6 }
84af5a
c90335 /*____________________________________________________________________________
5b6fc0 ¤   CopyResource: Copy one resource from sourceResFile to destResFile.
c467c5 ¤
279c78 ¤   Note:
ce4063 ¤   ¤   - The copied resource may be decompressed if the source resource is
613239 ¤   ¤   compressed.
a85794 ¤   ¤   - If a resource with the same type and ID already exists in the
338fab ¤   ¤   ·destination, ·it is blown away silently.
4deb3f ¤   ¤   - The resource will be detached from the source file only if it was
343857 ¤   ¤   in a purged ·state. In this case, outstanding handles will be
6f27e3 ¤   ¤   left dangling.
a1f7f7 ____________________________________________________________________________*/
e5af5a
e485ea ¤   OSStatus
baea02 CopyResource(
9ce764 ¤   short¤  ¤   sourceResFile,
02314b ¤   OSType¤ ¤   sourceResourceType,
eaaf59 ¤   short¤  ¤   sourceResourceID,
b7108e ¤   short¤  ¤   destResFile,
74d0ff ¤   OSType¤ ¤   destResourceType,
d69a3a ¤   short¤  ¤   destResourceID)
77bb36 {
b17a43 ¤   short¤  ¤   saveResFile;
fabb1e ¤   Boolean¤¤   saveResLoad;
c1c412 ¤   OSStatus¤   status;
35282e ¤   Handle¤ ¤   theResource;
e267c5 ¤
1dd033 ¤   AssertFileRefNumIsValid( sourceResFile, "CopyResource" );
d701d2 ¤   AssertFileRefNumIsValid( destResFile, "CopyResource" );
b167c5 ¤
0eba16 ¤   saveResFile = CurResFile();
c74407 ¤   saveResLoad = LMGetResLoad();
cde843 ¤   status¤ ¤   = noErr;
4faf5a
be0df8 ¤   UseResFile( sourceResFile );¤
97af5a
cae7a3 ¤   SetResLoad( FALSE );
e57f93 ¤   ¤   theResource = Get1Resource( sourceResourceType, sourceResourceID );
e2e5c7 ¤   SetResLoad( TRUE );
7c67c5 ¤
11abcb ¤   if( IsntNull( theResource ) )
2bc7a1 ¤   {
da957b ¤   ¤   Boolean¤wasLoaded;
--2b69 00035fa4a1640120242 Page 4 of MacResources.c
f11b52 ¤   ¤
901b17 ¤   ¤   /*
9b63c3 ¤   ¤   ** Check to see if the resource was already loaded. If it was, we will
5991fb ¤   ¤   ** not release the original resource.
0e5c12 ¤   ¤   */
061b52 ¤   ¤
8a7cb6 ¤   ¤   if( IsNull( *theResource ) )
d25b34 ¤   ¤   {
6bcae6 ¤   ¤   ¤   wasLoaded = FALSE;
c087c7 ¤   ¤   ¤
12c154 ¤   ¤   ¤   LoadResource( theResource );
7c0fe4 ¤   ¤   }
950e1d ¤   ¤   else
705b34 ¤   ¤   {
e44a3c ¤   ¤   ¤   wasLoaded = TRUE;
d60fe4 ¤   ¤   }
091b52 ¤   ¤
f76397 ¤   ¤   if( IsntNull( *theResource ) )
79ed49 ¤   ¤   {¤
48d846 ¤   ¤   ¤   OSType¤ dummyResType;
24a965 ¤   ¤   ¤   short¤  dummyResID;
444421 ¤   ¤   ¤   Str255¤ resourceName;
76c69c ¤   ¤   ¤   SInt8¤  saveHandleState;
d887c7 ¤   ¤   ¤
6f15ad ¤   ¤   ¤   saveHandleState = HGetState( theResource );¤
405ff5 ¤   ¤   ¤   HNoPurge( theResource );
26af5a
cdb9fd ¤   ¤   ¤   GetResInfo( theResource, &dummyResID, &dummyResType, resourceName );
1f87c7 ¤   ¤   ¤
f4a906 ¤   ¤   ¤   status = ResError();
5fa36f ¤   ¤   ¤   AssertNoErr( status, nil );
0687c7 ¤   ¤   ¤
44fb92 ¤   ¤   ¤   if( IsntErr( status ) )
2df776 ¤   ¤   ¤   {
c691be ¤   ¤   ¤   ¤   Handle¤ ¤   resourceCopy;
bfcda0 ¤   ¤   ¤   ¤   ByteCount¤  resourceSize;
39b1dc ¤   ¤   ¤   ¤   short¤  ¤   resourceAttributes;
602b85 ¤   ¤   ¤   ¤
6654ed ¤   ¤   ¤   ¤   resourceSize ¤  ¤   = GetHandleSize( theResource );
89940d ¤   ¤   ¤   ¤   resourceAttributes¤ = GetResAttrs( theResource );
942b85 ¤   ¤   ¤   ¤
81168b ¤   ¤   ¤   ¤   resourceCopy = pgpNewHandle( resourceSize,
0b39c3 ¤   ¤   ¤   ¤   ¤   kMacMemory_UseCurrentHeap |
7dda36 ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap | kMacMemory_UseSystemHeap );
8a18ec ¤   ¤   ¤   ¤   if( IsntNull( resourceCopy ) )
0972c3 ¤   ¤   ¤   ¤   {
57178d ¤   ¤   ¤   ¤   ¤   BlockMoveData( *theResource, *resourceCopy, resourceSize );
262b85 ¤   ¤   ¤   ¤
0810f5 ¤   ¤   ¤   ¤   ¤   UseResFile( destResFile );
b3ae30 ¤   ¤   ¤   ¤   ¤
752a7d ¤   ¤   ¤   ¤   ¤   (void) Remove1Resource( destResourceType,
7ed1c5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   destResourceID, TRUE );
c7ae30 ¤   ¤   ¤   ¤   ¤
583f03 ¤   ¤   ¤   ¤   ¤   status = AddWriteResource( resourceCopy,
233b65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   destResourceType, destResourceID, resourceName );
a3b6a1 ¤   ¤   ¤   ¤   ¤   if( IsntErr( status ) )
ae4859 ¤   ¤   ¤   ¤   ¤   {
0f5dfa ¤   ¤   ¤   ¤   ¤   ¤   SetResAttrs( resourceCopy, resourceAttributes );
0894aa ¤   ¤   ¤   ¤   ¤   ¤
be973b ¤   ¤   ¤   ¤   ¤   ¤   status = ResError();
3aa518 ¤   ¤   ¤   ¤   ¤   ¤   AssertNoErr( status, nil );
c694aa ¤   ¤   ¤   ¤   ¤   ¤
3789f5 ¤   ¤   ¤   ¤   ¤   ¤   ReleaseResource( resourceCopy );
721c89 ¤   ¤   ¤   ¤   ¤   }
ba4bd6 ¤   ¤   ¤   ¤   ¤   else
0f4859 ¤   ¤   ¤   ¤   ¤   {
cd4106 ¤   ¤   ¤   ¤   ¤   ¤   /*
470d5b ¤   ¤   ¤   ¤   ¤   ¤   ** If AddWriteResource returns an error,
411e2f ¤   ¤   ¤   ¤   ¤   ¤   ** then the handle is not in the ·resource map.
580603 ¤   ¤   ¤   ¤   ¤   ¤   */
1a94aa ¤   ¤   ¤   ¤   ¤   ¤
3521b2 ¤   ¤   ¤   ¤   ¤   ¤   pgpDisposeHandle( resourceCopy );
--975b 000fb10feca40120242 Page 5 of MacResources.c
b61c89 ¤   ¤   ¤   ¤   ¤   }
7c2613 ¤   ¤   ¤   ¤   }
aafa07 ¤   ¤   ¤   ¤   else
e272c3 ¤   ¤   ¤   ¤   {
39465a ¤   ¤   ¤   ¤   ¤   status = memFullErr;
b52613 ¤   ¤   ¤   ¤   }
9da3a6 ¤   ¤   ¤   }
aeaf5a
2a7368 ¤   ¤   ¤   HSetState( theResource, saveHandleState );
640fe4 ¤   ¤   }
360e1d ¤   ¤   else
f35b34 ¤   ¤   {
806ddc ¤   ¤   ¤   status = ForceResError( memFullErr );
130fe4 ¤   ¤   }
311b52 ¤   ¤
8f2166 ¤   ¤   if( ! wasLoaded )
195b34 ¤   ¤   {
30fda4 ¤   ¤   ¤   ReleaseResource( theResource );
c60fe4 ¤   ¤   }
249371 ¤   }
320e24 ¤   else
a0c7a1 ¤   {
d46849 ¤   ¤   status = ForceResError( resNotFound );
c9f828 ¤   }¤
9267c5 ¤
f760a3 ¤   UseResFile( saveResFile );
810e99 ¤   SetResLoad( saveResLoad );
ecaf5a
ea4afd ¤   return( status );
34efe6 }
beaf5a
78af5a
83af5a
020335 /*____________________________________________________________________________
5daf5a
2f437f ¤   ResourceExists: Checks to see if a resource exists in the current chain¤¤
98f7f7 ____________________________________________________________________________*/
fc640c ¤   Boolean¤
0ea1f7 ResourceExists(
792db1 ¤   ResType¤resourceType,
224e07 ¤   short¤  resourceID,
34faca ¤   Boolean¤inCurResOnly)
05bb36 {
03a9f8 ¤   Boolean¤resourceExists = FALSE;
2670ef ¤   Boolean¤saveResLoad;
a83825 ¤   Handle¤ theResource;
e467c5 ¤
f64407 ¤   saveResLoad = LMGetResLoad();
90e7a3 ¤   SetResLoad( FALSE );
bb67c5 ¤
a938d5 ¤   if ( inCurResOnly )
7bc7a1 ¤   {
729ab3 ¤   ¤   theResource = Get1Resource( resourceType, resourceID );
829371 ¤   }
a10e24 ¤   else
d8c7a1 ¤   {
a9ffca ¤   ¤   theResource = GetResource( resourceType, resourceID );
349371 ¤   }
4a67c5 ¤
40abcb ¤   if( IsntNull( theResource ) )
19c7a1 ¤   {
91b57a ¤   ¤   resourceExists = TRUE;
e41b52 ¤   ¤
d10bba ¤   ¤   if( *theResource == NULL )
5d5b34 ¤   ¤   {
ea7aad ¤   ¤   ¤   /*
446712 ¤   ¤   ¤   ** Probably OK to release the resource because there is no loaded
5aa493 ¤   ¤   ¤   ** data. One possible problem is a purged resource. This could
1c7e34 ¤   ¤   ¤   ** leave another holder of theResource with a bad handle. Oh well.
a33da8 ¤   ¤   ¤   */
f487c7 ¤   ¤   ¤
fbfda4 ¤   ¤   ¤   ReleaseResource( theResource );
--10d3 001a13d370640120242 Page 6 of MacResources.c
b50fe4 ¤   ¤   }
6b9371 ¤   }
3c67c5 ¤
6a0e99 ¤   SetResLoad( saveResLoad );
fd67c5 ¤
c70d27 ¤   return resourceExists;
a1efe6 }
--1e1a 001bc86c14040120243 Page 1 of MacResources.h
a70335 /*____________________________________________________________________________
7bf254 ¤   Copyright (C) 1996,1997 Network Associates, Inc. and its affiliates.
754b0f ¤   All rights reserved.
0967c5 ¤
c7414b ¤   $Id: MacResources.h,v 1.7.18.1 1998/11/12 03:19:47 heller Exp $
d2f7f7 ____________________________________________________________________________*/
3faf5a
077b7d #pragma once
5faf5a
1d99c6 PGP_BEGIN_C_DECLARATIONS
f63ffd #if PRAGMA_IMPORT
05b981 #pragma import on
f17454 #endif
18af5a
d4af5a
20af5a
b6937a OSStatus¤   ForceResError(OSStatus defaultError);
2baf5a
f07479 OSStatus¤   AddWriteResource(Handle theResource,
05befb ¤   ¤   ¤   ¤   OSType resourceType, short resourceID,
072c10 ¤   ¤   ¤   ¤   ConstStr255Param resourceName);
22aef6 OSStatus¤   AddWriteResourcePtr(const void * resourceData,
615b14 ¤   ¤   ¤   ¤   ByteCount resourceDataSize,
c8befb ¤   ¤   ¤   ¤   OSType resourceType, short resourceID,
792c10 ¤   ¤   ¤   ¤   ConstStr255Param resourceName);
5694aa ¤   ¤   ¤   ¤   ¤   ¤
9817f0 OSStatus¤   CopyResource(short sourceResFile, OSType sourceResourceType,
58bcb3 ¤   ¤   ¤   ¤   short sourceResourceID,
c08a41 ¤   ¤   ¤   ¤   short destResFile,
9b8cab ¤   ¤   ¤   ¤   OSType destResourceType, short destResourceID);
c094aa ¤   ¤   ¤   ¤   ¤   ¤
b1c528 OSStatus¤   Remove1Resource(OSType resourceType, short resourceID,
2ed08f ¤   ¤   ¤   ¤   ¤   ¤   Boolean removeProtectedResources);
0e94aa ¤   ¤   ¤   ¤   ¤   ¤
0c7e67 Boolean¤¤   ResourceExists(ResType resourceType, short resourceID,
abbc5f ¤   ¤   ¤   ¤   Boolean inCurResOnly);
e1af5a
c7af5a
aaaf5a
65af5a
7d3ffd #if PRAGMA_IMPORT
ed2ced #pragma import reset
017454 #endif
bc2827 PGP_END_C_DECLARATIONS¶
--6848 00007421e2940120244 Page 1 of MacSecureMemory.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
6a86c4 ¤   $Id: MacSecureMemory.h,v 1.2.26.1 1998/11/12 03:19:48 heller Exp $
2df7f7 ____________________________________________________________________________*/
e41e1f #ifndef Included_MacSecureMemory_h¤ /* [ */
ee79fd #define Included_MacSecureMemory_h
62af5a
21af5a
ee0d08 #include "pgpMem.h"
468bd8 #include "MacEnvirons.h"
ffaf5a
dfaf5a
1c0335 /*____________________________________________________________________________
f137cf ¤   Class to automatically clear a block of memory upon destruction/exit scope
4ef7f7 ____________________________________________________________________________*/
c9af5a
eb3d53 class CMemoryWiper
96bb36 {
cba2d3 protected:
5932c9 ¤   void *¤ mMemoryToWipe;
08de56 ¤   size_t¤ mNumBytes;
3e67c5 ¤
7a5ed4 public:
6faf5a
ac09e3 ¤   CMemoryWiper( void *memory, size_t numBytes )
2e3ecb ¤   ¤   ¤   { mMemoryToWipe¤= memory; ·mNumBytes = numBytes; }
9487c7 ¤   ¤   ¤
76b685 ¤   ~CMemoryWiper()
738236 ¤   ¤   ¤   { pgpClearMemory( mMemoryToWipe, mNumBytes ); }
ae82f7 };
d2af5a
1e0335 /*____________________________________________________________________________
ab54c7 ¤   Can be used exactly like a char[256]
aff7f7 ____________________________________________________________________________*/
28aa50 class CSecureCString256
0fbb36 {
155ed4 public:
fed578 ¤   char¤   mString[ 256 ];
cb67c5 ¤
58675f ¤   CSecureCString256( void )
6dc7a1 ¤   {
039b3f ¤   ¤   if ( VirtualMemoryIsOn() )
085b34 ¤   ¤   {
68074f ¤   ¤   ¤   HoldMemory( mString, sizeof( mString ) );
210fe4 ¤   ¤   }
4f29e0 ¤   ¤   mString[ 0 ]¤   = '\0';
2e9371 ¤   }
bc67c5 ¤
30bbcb ¤   ~CSecureCString256( void )
41c7a1 ¤   {
e20953 ¤   ¤   pgpClearMemory( mString, sizeof( mString ) );
459b3f ¤   ¤   if ( VirtualMemoryIsOn() )
375b34 ¤   ¤   {
b388c0 ¤   ¤   ¤   UnholdMemory( mString, sizeof( mString ) );
9b0fe4 ¤   ¤   }
209371 ¤   }
8d67c5 ¤
a98b35 ¤   operator char *( void )
86c7a1 ¤   {
f64588 ¤   ¤   return( mString );
0b9371 ¤   }
f482f7 };
8baf5a
070335 /*____________________________________________________________________________
b20cff ¤   Can be used exactly like a Str255
c3f7f7 ____________________________________________________________________________*/
010fce class CSecurePString255
66bb36 {
f25ed4 public:
070cf7 ¤   Str255¤ mString;
--7ab7 0011fcb82ee40120244 Page 2 of MacSecureMemory.h
2a67c5 ¤
35d2f5 ¤   CSecurePString255( void )
48c7a1 ¤   {
b29b3f ¤   ¤   if ( VirtualMemoryIsOn() )
2e5b34 ¤   ¤   {
87074f ¤   ¤   ¤   HoldMemory( mString, sizeof( mString ) );
3e0fe4 ¤   ¤   }
878b51 ¤   ¤   mString[ 0 ] = 0;
479371 ¤   }
4167c5 ¤
960e61 ¤   ~CSecurePString255( void )
c0c7a1 ¤   {
6b0953 ¤   ¤   pgpClearMemory( mString, sizeof( mString ) );
3d9b3f ¤   ¤   if ( VirtualMemoryIsOn() )
7a5b34 ¤   ¤   {
8488c0 ¤   ¤   ¤   UnholdMemory( mString, sizeof( mString ) );
170fe4 ¤   ¤   }
829371 ¤   }
fc67c5 ¤
726853 ¤   operator unsigned char *( void )
12c7a1 ¤   {
944588 ¤   ¤   return( mString );
b69371 ¤   }
7c82f7 };
d7af5a
6baf5a
e6dd9a #endif /* ] Included_MacSecureMemory_h */
e5af5a
e5af5a
3a7e4d /*__Editor_settings____
bfaf5a
b34126 ¤   Local Variables:
a47b17 ¤   tab-width: 4
d80e6c ¤   End:
405f8c ¤   vi: ts=4 sw=4
9e9e9b ¤   vim: si
1fd062 _____________________*/
--9020 0005f4b7f1a40120245 Page 1 of MacStrings.c
a70335 /*____________________________________________________________________________
20237a ¤   MacStrings.c
5b67c5 ¤
bdc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
f04b0f ¤   All rights reserved.
d367c5 ¤
3667c5 ¤
52af5a
29b129 ¤   $Id: MacStrings.c,v 1.21.12.1 1998/11/12 03:19:48 heller Exp $
52f7f7 ____________________________________________________________________________*/
26b1cb #include <ctype.h>
cfa7a0 #include <limits.h>
3d324c #include <string.h>
3caf5a
f149ca #include <Files.h>
0d4b15 #include <TextUtils.h>
25af5a
0fd7a9 #include "MacNumerics.h"
1585c2 #include "MacStrings.h"
53c110 #include "pgpMacMemory.h"
d8af5a
610335 /*____________________________________________________________________________
dbaef9 ¤   NumVersionToString: Convert a Macintosh numeric version to a Pascal string
c5f7f7 ____________________________________________________________________________*/
86af5a
2e6d52 ¤   void
08b538 NumVersionToString(const NumVersion *version, StringPtr versionString)
22bb36 {
1964e6 ¤   Str255¤ tempString;
17cbf4 ¤   UInt32¤ majorRev;
8aa2e0 ¤   UInt32¤ minorRev;
5e4cae ¤   UInt32¤ bugFixRev;
7a2429 ¤   uchar¤  stageChar;
da67c5 ¤
dc8df6 ¤   pgpAssertAddrValid( versionString, StringPtr );
0967c5 ¤
28db2a ¤   versionString[0] = 0;
2867c5 ¤
41ce39 ¤   BCDToDecimal( version->majorRev, &majorRev );
430c90 ¤   BCDToDecimal( version->minorAndBugRev >> 4, &minorRev );
452e62 ¤   BCDToDecimal( version->minorAndBugRev & 0x0F, &bugFixRev );
46af5a
f39cf9 ¤   NumToString( majorRev, versionString );
de2153 ¤   AppendPString( "\p.", versionString );
fa9029 ¤   NumToString( minorRev, tempString );
e95cf8 ¤   AppendPString( tempString, versionString );
7e67c5 ¤
bab414 ¤   if( bugFixRev != 0 )
87c7a1 ¤   {
a8b0cb ¤   ¤   AppendPString( "\p.", versionString );
94702e ¤   ¤   NumToString( bugFixRev, tempString );
48cab9 ¤   ¤   AppendPString( tempString, versionString );
ed9371 ¤   }
eb1b52 ¤   ¤
bd3c00 ¤   switch( version->stage )
5ac7a1 ¤   {
f28525 ¤   ¤   case developStage:
8bb26e ¤   ¤   ¤   stageChar = 'd';
43cdcb ¤   ¤   ¤   break;
9787c7 ¤   ¤   ¤
9647cd ¤   ¤   case alphaStage:
fedc39 ¤   ¤   ¤   stageChar = 'a';
88cdcb ¤   ¤   ¤   break;
35af5a
53bc8e ¤   ¤   case betaStage:
6ff9f4 ¤   ¤   ¤   stageChar = 'b';
e4cdcb ¤   ¤   ¤   break;
401b52 ¤   ¤
139ae3 ¤   ¤   default:
9cbb18 ¤   ¤   ¤   stageChar = 0;
9bcdcb ¤   ¤   ¤   break;
5f9371 ¤   }
--d94e 0007c5dda0d40120245 Page 2 of MacStrings.c
2a67c5 ¤
64c2da ¤   if( stageChar != 0 )
3bc7a1 ¤   {
aab322 ¤   ¤   UInt32¤ nonReleaseRev;
8c1b52 ¤   ¤
7eb434 ¤   ¤   /* Append the stage character to the version string */
3eb82e ¤   ¤   versionString[0] += 1;
d98c8f ¤   ¤   versionString[versionString[0]] = stageChar;
3867c5 ¤
a553fb ¤   ¤   BCDToDecimal( version->nonRelRev, &nonReleaseRev );
e1af5a
a461ad ¤   ¤   NumToString( nonReleaseRev, tempString );
e7cab9 ¤   ¤   AppendPString( tempString, versionString );
829371 ¤   }
b6efe6 }
9daf5a
9f0335 /*____________________________________________________________________________
dc70de ¤   VersionToString: Convert a Macintosh BCD version UInt16 to a Pascal string
4cf7f7 ____________________________________________________________________________*/
b4af5a
996d52 ¤   void
89e5c6 VersionToString(UInt16 version, StringPtr versionString)
20bb36 {
c264e6 ¤   Str255¤ tempString;
11cbf4 ¤   UInt32¤ majorRev;
8aa2e0 ¤   UInt32¤ minorRev;
284cae ¤   UInt32¤ bugFixRev;
4b67c5 ¤
428df6 ¤   pgpAssertAddrValid( versionString, StringPtr );
a767c5 ¤
34db2a ¤   versionString[0] = 0;
3467c5 ¤
a256e5 ¤   BCDToDecimal( version >> 8, &majorRev );
ac329e ¤   BCDToDecimal( ( version >> 4 ) & 0x000F, &minorRev );
d40f12 ¤   BCDToDecimal( version & 0x000F, &bugFixRev );
34af5a
a09cf9 ¤   NumToString( majorRev, versionString );
182153 ¤   AppendPString( "\p.", versionString );
ce9029 ¤   NumToString( minorRev, tempString );
cc5cf8 ¤   AppendPString( tempString, versionString );
3d67c5 ¤
81b414 ¤   if( bugFixRev != 0 )
bac7a1 ¤   {
f7b0cb ¤   ¤   AppendPString( "\p.", versionString );
ff702e ¤   ¤   NumToString( bugFixRev, tempString );
1ecab9 ¤   ¤   AppendPString( tempString, versionString );
389371 ¤   }
76efe6 }
8eaf5a
f90335 /*____________________________________________________________________________
72bdd9 ¤   CopyPString: Copy a Pascal string
79f7f7 ____________________________________________________________________________*/
a7af5a
c06d52 ¤   void
a3f2b3 CopyPString(ConstStr255Param srcStr, StringPtr destStr)
86bb36 {
51a583 ¤   pgpAssertAddrValidMsg( srcStr, uchar,
e131b0 ¤   ¤   "CopyPString: invalid source string" );
3f07c8 ¤   pgpAssertAddrValidMsg( destStr, uchar,
7ca9cb ¤   ¤   "CopyPString: invalid destination string" );
3067c5 ¤
4e4d8d ¤   BlockMoveData( srcStr, destStr, 1UL + srcStr[ 0 ] );
e9efe6 }
e8af5a
300335 /*____________________________________________________________________________
e48ae6 ¤   AppendPString: Append one Pascal string to the end of another
b2f7f7 ____________________________________________________________________________*/
1c67c5 ¤
1910d1 #define kMaxStringLength¤   (UInt16)255
d36d52 ¤   void
8b0ce5 AppendPString(ConstStr255Param appendStr, StringPtr destStr)
7cbb36 {
--91be 0004c4d50f140120245 Page 3 of MacStrings.c
7fb3cd ¤   AppendPStringMax( appendStr, destStr, kMaxStringLength );
bdefe6 }
0aaf5a
d40335 /*____________________________________________________________________________
951c3d ¤   CopyPString: Copy a Pascal string up to a maximum number of characters
d1f7f7 ____________________________________________________________________________*/
3caf5a
366d52 ¤   void
07ff1d CopyPStringMax(
097ec7 ¤   ConstStr255Param ¤  srcStr,
c2dcb9 ¤   StringPtr ¤ ¤   ¤   destStr,
97a355 ¤   UInt32¤ ¤   ¤   ¤   maxBytesToCopy)¤/* Does not include length PGPByte */
07bb36 {
73b39c ¤   UInt32¤ lengthToCopy;
ad67c5 ¤
23a583 ¤   pgpAssertAddrValidMsg( srcStr, uchar,
edfa32 ¤   ¤   "CopyPStringMax: invalid source string" );
2c07c8 ¤   pgpAssertAddrValidMsg( destStr, uchar,
9aceda ¤   ¤   "CopyPStringMax: invalid destination string" );
8067c5 ¤
dfa33f ¤   lengthToCopy = srcStr[0];
2a49c0 ¤   if( lengthToCopy > maxBytesToCopy )
a57c18 ¤   ¤   lengthToCopy = maxBytesToCopy;
c31b52 ¤   ¤
a6efae ¤   BlockMoveData( srcStr, destStr, 1UL + lengthToCopy );
bc67c5 ¤
19789b ¤   destStr[0] = lengthToCopy;
25efe6 }
56af5a
8b0335 /*____________________________________________________________________________
708ae6 ¤   AppendPString: Append one Pascal string to the end of another
4ff7f7 ____________________________________________________________________________*/
ca67c5 ¤
736d52 ¤   void
9b1da4 AppendPStringMax(
fa2abd ¤   ConstStr255Param ¤  appendStr,
badcb9 ¤   StringPtr ¤ ¤   ¤   destStr,
e6b15e ¤   UInt32 ¤¤   ¤   ¤   maxBytesToAppend)
8ebb36 {
210088 ¤   UInt32¤ lengthToAppend;
a8af5a
5c3472 ¤   pgpAssertAddrValidMsg( appendStr, uchar,
7944f8 ¤   ¤   "AppendPStringMax: invalid appendStr string" );
c207c8 ¤   pgpAssertAddrValidMsg( destStr, uchar,
500148 ¤   ¤   "AppendPStringMax: invalid destination string" );
46af5a
bbd8af ¤   /*
79f713 ¤   ** if the new length would exceed the maximum string length, then
66b0fe ¤   ** just append as much as possible
1c9faa ¤   */
4067c5 ¤
f4065f ¤   lengthToAppend¤ = appendStr[0];
2a262d ¤   if ( lengthToAppend + (UInt32)destStr[0] > kMaxStringLength )
5918b9 ¤   ¤   lengthToAppend¤ = kMaxStringLength - destStr[0];
7aaf5a
7d710d ¤   if( lengthToAppend > maxBytesToAppend )
233465 ¤   ¤   lengthToAppend = maxBytesToAppend;
841b52 ¤   ¤
817e84 ¤   BlockMoveData( &appendStr[1], &destStr[destStr[0]+1], lengthToAppend);
55022b ¤   destStr[0]¤ += lengthToAppend;
87efe6 }
88af5a
ff0335 /*____________________________________________________________________________
4d16f5 ¤   DeleteFromPString: Delete 'count' characters from a pascal string,
cffa45 ¤   beginning at 'offset' >= 1
e2f7f7 ____________________________________________________________________________*/
2caf5a
d16d52 ¤   void
11544c DeleteFromPString(uchar *string, uchar offset, uchar count)
5dbb36 {
f4c0c9 ¤   uchar¤  trailing;
4c67c5 ¤
--9345 000ef529c2140120245 Page 4 of MacStrings.c
c12262 ¤   pgpAssertAddrValid( string, uchar );
44af5a
9cd850 ¤   if ( (offset < 1) ||
7bd3ee ¤   ¤   (UInt16) offset + (UInt16) count - 1 ·> (UInt16) string[0] ·)
76c7a1 ¤   {
13748c ¤   ¤   pgpDebugMsg( "DeleteFromPString: Invalid offset/count combination" );
9399bf ¤   ¤   return;
999371 ¤   }
5e67c5 ¤
2d5d5b ¤   trailing = string[0] - (offset -1) - count;
3a9ae5 ¤   BlockMoveData( &string[offset + count], &string[offset], trailing );
45af5a
656331 ¤   string[0]¤  -= count;
b4efe6 }
62af5a
fb0335 /*____________________________________________________________________________
9e7b6b ¤   InsertInPString: Insert one pascal string into another beginning at
afe456 ¤   'offset' >= 1
7bf7f7 ____________________________________________________________________________*/
212b85 ¤   ¤   ¤   ¤
526d52 ¤   void
c3ac0f InsertInPString(const uchar *source, uchar offset, uchar *dest)
06bb36 {
bdae7f ¤   uchar¤  temp[256];
539a72 ¤   UInt32¤ sourceLength¤   = source[0];
11d5c2 ¤   UInt32¤ destLength¤ ¤   = dest[0];
8767c5 ¤
5f3f88 ¤   pgpAssertAddrValid( source, uchar );
8838cd ¤   pgpAssertAddrValid( dest, uchar );
36af5a
96204e ¤   if( ( destLength + sourceLength > 255 ) ||
1e0c49 ¤   ¤   ( (UInt16) offset > destLength + 1 ) )
2ac7a1 ¤   {
d43a32 ¤   ¤   pgpDebugMsg( "InsertInPString: Resulting string too big" );
eb99bf ¤   ¤   return;
249371 ¤   }
0a67c5 ¤
f926c1 ¤   temp[0]¤= destLength + 1 - offset;
deeb08 ¤   BlockMoveData( &dest[offset], &temp[1], temp[0]);
b367c5 ¤
1f1bdb ¤   dest[0]¤= offset - 1;
963819 ¤   AppendPString( source, dest );
d1f4ba ¤   AppendPString( temp, dest );
63efe6 }
d2af5a
9f0335 /*____________________________________________________________________________
ab41b3 ¤   PrintPString: Insert a pascal string into another at the best location,
a45943 ¤   which is as follows:
12af5a
1e8507 ¤   The first occurrence of the sequence %s. If no %s sequences are found,·
dabade ¤   then any '%' character followed by a digit 0-9.
cb3b70 ¤   The first occurrence of the lowest %digit sequence is replaced first.
a2f7f7 ____________________________________________________________________________*/
99af5a
316d52 ¤   void
e3a2bf PrintPString(uchar *dest, const uchar *formatStr, const uchar *stringToPut)
17bb36 {
2aae5c ¤   uchar¤  *cur;
e86cb4 ¤   uchar¤  *last;
32d41d ¤   uchar¤  *insertAt;
39c322 ¤   uchar¤  minChar;
6067c5 ¤
a738cd ¤   pgpAssertAddrValid( dest, uchar );
0c4e56 ¤   pgpAssertAddrValid( formatStr, uchar );
83756f ¤   pgpAssertAddrValid( stringToPut, uchar );
46af5a
b5ebfe ¤   CopyPString( formatStr, dest );
db67c5 ¤
78469a ¤   cur ¤   ¤   = &dest[1];
21985d ¤   last ¤  ¤   = &dest[dest[0]];
6cd77b ¤   insertAt¤   = nil;
efe99b ¤   minChar¤¤   = '9' + 1;
--4e60 000a9b7c60640120245 Page 5 of MacStrings.c
2a67c5 ¤
431df6 ¤   while( cur <= last )
63c7a1 ¤   {
414b33 ¤   ¤   if( *cur++ == '%' )
645b34 ¤   ¤   {
cc8cba ¤   ¤   ¤   register uchar¤ curChar = *cur;
de87c7 ¤   ¤   ¤
7272fc ¤   ¤   ¤   if( curChar == 's' )
c9f776 ¤   ¤   ¤   {
25b0dd ¤   ¤   ¤   ¤   insertAt = cur;
3ff622 ¤   ¤   ¤   ¤   break;
a8a3a6 ¤   ¤   ¤   }
f8bc4c ¤   ¤   ¤   else if( curChar >= '0' && curChar <= '9' )
9af776 ¤   ¤   ¤   {
5a809d ¤   ¤   ¤   ¤   if( curChar < minChar )
cd72c3 ¤   ¤   ¤   ¤   {
dc8341 ¤   ¤   ¤   ¤   ¤   minChar ¤   = curChar;
358f75 ¤   ¤   ¤   ¤   ¤   insertAt ¤  = cur;
c22613 ¤   ¤   ¤   ¤   }
32a3a6 ¤   ¤   ¤   }
db0fe4 ¤   ¤   }
3a9371 ¤   }
3aaf5a
0b4264 ¤   if( insertAt != nil )
8ac7a1 ¤   {
d48a32 ¤   ¤   DeleteFromPString( dest, insertAt - dest - 1, 2 );
785c7f ¤   ¤   InsertInPString( stringToPut, insertAt - dest - 1, dest );
1b9371 ¤   }
96efe6 }
d6af5a
2faf5a
66640c ¤   Boolean¤
64bee1 PStringsAreEqual(
ebb242 ¤   ConstStr255Param¤   str1,
e347cb ¤   ConstStr255Param¤   str2 )
d7bb36 {
82ff8e ¤   Boolean¤¤   equal¤  = FALSE;
9067c5 ¤
8f05c0 ¤   if ( StrLength( str1 ) == StrLength( str2 ) )
61c7a1 ¤   {
846786 ¤   ¤   equal¤  = pgpMemoryEqual( &str1[ 1 ], &str2[ 1 ], StrLength( str1 ) );
589371 ¤   }
aa67c5 ¤
4cf66a ¤   return( equal );
7fefe6 }
79af5a
1d7e69 ¤   Boolean
b85ccd PStringHasSuffix(
6f9010 ¤   ConstStr255Param¤   str,
190371 ¤   ConstStr255Param¤   suffix,
7cadd9 ¤   Boolean¤¤   ¤   ¤   caseSensitive )
fcbb36 {
a7042a ¤   Boolean¤hasSuffix = FALSE;
7067c5 ¤
fb828a ¤   pgpAssertAddrValid( str, uchar );
1c3c24 ¤   pgpAssertAddrValid( suffix, uchar );
eaaf5a
0adef6 ¤   if( suffix[0] < str[0] ·)
72c7a1 ¤   {
2ce516 ¤   ¤   /* The name is at lease as long as the suffix, and the last
0330d4 ¤   ¤   character matches. ·Search for the suffix. */
0267c5 ¤
f06400 ¤   ¤   Str255¤ testStr;
1f76ab ¤   ¤   UInt32¤ suffixLength;
f65e22 ¤   ¤   UInt32¤ strLength;
f51b52 ¤   ¤
aaa5b6 ¤   ¤   suffixLength ¤  = suffix[0];
68a797 ¤   ¤   strLength¤  ¤   = str[0];
9a1b52 ¤   ¤
74f0fb ¤   ¤   pgpCopyMemory( &str[strLength - suffixLength + 1], &testStr[1],
fd5558 ¤   ¤   ¤   ¤   ¤   suffixLength );
a9b452 ¤   ¤   testStr[0] = suffixLength;
--2eb1 000b1c0200c40120245 Page 6 of MacStrings.c
f11b52 ¤   ¤
ef22ae ¤   ¤   hasSuffix = EqualString( testStr, suffix, caseSensitive, TRUE );
449371 ¤   }
6eaf5a
2f2aab ¤   return( hasSuffix );
08efe6 }
21af5a
ceaf5a
b60335 /*____________________________________________________________________________
8ca15f ¤   A temporary string is used so that source and dest strings may be
fe39ea ¤   the same string.
36f7f7 ____________________________________________________________________________*/
f86d52 ¤   void
1c70da CToPString(
b1df35 ¤   const char¤ *cString,
a21861 ¤   StringPtr¤  pString)
f7c7a1 ¤   {
2a9c80 ¤   UInt32¤ ¤   length;
5ec7cc ¤   UInt8¤  ¤   *curOut;
2d881d ¤   Str255¤ ¤   tempStr;
3667c5 ¤
2f7b1a ¤   pgpAssertAddrValid( cString, char );
101180 ¤   pgpAssertAddrValid( pString, uchar );
3567c5 ¤
0f0f93 ¤   length¤ ¤   = 0;
32af03 ¤   curOut¤ ¤   = &tempStr[1];
dd4e05 ¤   #define kMaxPascalStringLength¤ 255
6b8f41 ¤   while ( length < kMaxPascalStringLength )
f25b34 ¤   ¤   {
268499 ¤   ¤   if ( (curOut[length] = cString[length]) == 0)
42cdcb ¤   ¤   ¤   break;
ac43b9 ¤   ¤   ++length;
360fe4 ¤   ¤   }
ff67c5 ¤
d59dec ¤   tempStr[0]¤ = length;
5c67c5 ¤
6bc977 ¤   CopyPString( tempStr, pString );
149371 ¤   }
7467c5 ¤
2467c5 ¤
ab6d52 ¤   void
ffcb7f PToCString(
50b077 ¤   ConstStr255Param¤   pString,
d242fe ¤   char *¤ ¤   ¤   ¤   cString)
42c7a1 ¤   {
c594f6 ¤   short¤  length;
2267c5 ¤
331180 ¤   pgpAssertAddrValid( pString, uchar );
1e7b1a ¤   pgpAssertAddrValid( cString, char );
07af5a
24b4b2 ¤   length¤ = StrLength( pString );
7e67c5 ¤
92c03b ¤   BlockMoveData( &pString[ 1 ], cString, length);
c4ee58 ¤   cString[ length ]¤  = '\0';
e59371 ¤   }
cdaf5a
98af5a
58af5a
79af5a
5cd25c ¤   char *
9b969a CopyCString(
8b05d3 ¤   const char *¤   src,
da0718 ¤   char *¤ ¤   ¤   dest)
eebb36 {
474c42 ¤   pgpAssertAddrValid( dest, char );
154c42 ¤   pgpAssertAddrValid( dest, char );
0d67c5 ¤
492702 ¤   while ( ( *dest++ = *src++ ) != '\0' )
2ac7a1 ¤   {
559371 ¤   }
f81b52 ¤   ¤
b1a7b3 ¤   return( dest );
--77dc 001102a58aa40120245 Page 7 of MacStrings.c
7aefe6 }
46af5a
8eaf5a
79af5a
85af5a
c2eacd ¤   OSErr
7cb362 AppendStringToHandle(
70af33 ¤   Handle¤ ¤   ¤   ¤   theHandle,
7c46a2 ¤   ConstStr255Param¤   string )
31bb36 {
a68e70 ¤   OSErr¤  err¤= noErr;
1f67c5 ¤
46734b ¤   err¤= PtrAndHand( &string[ 1 ], theHandle, StrLength( string ) );
5c67c5 ¤
1ddeb7 ¤   return( err );
d5efe6 }
e9af5a
1faf5a
326d52 ¤   void
ab527a GetIndCString(
ac6380 ¤   char ¤  theString[256],
0c237e ¤   ResID ¤ stringListResID,
d593d1 ¤   short ¤ stringListIndex)
77bb36 {
71feb1 ¤   Str255¤ pString;
5267c5 ¤
467747 ¤   GetIndString( pString, stringListResID, stringListIndex );
a9050f ¤   PToCString( pString, theString );
a7efe6 }
1caf5a
d7af5a
9aaf5a
a6af5a
c10335 /*____________________________________________________________________________
3cbdbf ¤   Insert strings using PrintPString into baseString.
d967c5 ¤
25263e ¤   PrintPString looks for occurences of %1, %2, %3, etc
81f7f7 ____________________________________________________________________________*/
266d52 ¤   void
b51f4f InsertPStrings(
a5aab3 ¤   ConstStr255Param¤   baseString,
28b242 ¤   ConstStr255Param¤   str1,
035d26 ¤   ConstStr255Param¤   str2,
bf07fa ¤   ConstStr255Param¤   str3,
5a7ac6 ¤   StringPtr¤  ¤   ¤   resultString )
19bb36 {
abe5c8 ¤   Str255¤ finalMessage;
5267c5 ¤
bcccaa ¤   CopyPString( baseString, finalMessage );
0e67c5 ¤
f135b0 ¤   if ( IsntNull( str1 ) )
78c7a1 ¤   {
846c3b ¤   ¤   PrintPString( finalMessage, finalMessage, str1 );
aa9371 ¤   }
1f67c5 ¤
4739cd ¤   if ( IsntNull( str2 ) )
3fc7a1 ¤   {
e571f7 ¤   ¤   PrintPString( finalMessage, finalMessage, str2 );
559371 ¤   }
4d67c5 ¤
7f3de6 ¤   if ( IsntNull( str3 ) )
55c7a1 ¤   {
5e7ab3 ¤   ¤   PrintPString( finalMessage, finalMessage, str3 );
b79371 ¤   }
8d67c5 ¤
29e25d ¤   CopyPString( finalMessage, resultString );
cfefe6 }
1eaf5a
09af5a
2aaf5a
14af5a
101b52 ¤   ¤
--0242 00037b65e7a40120246 Page 1 of MacStrings.h
a70335 /*____________________________________________________________________________
7bf254 ¤   Copyright (C) 1996,1997 Network Associates, Inc. and its affiliates.
754b0f ¤   All rights reserved.
0967c5 ¤
2d13b8 ¤   $Id: MacStrings.h,v 1.18.12.1 1998/11/12 03:19:49 heller Exp $
d4f7f7 ____________________________________________________________________________*/
34af5a
627b7d #pragma once
46af5a
7efd5c #include <Resources.h>
59af5a
bbc5d5 #include "pgpBase.h"
c3675a #include "pgpTypes.h"
85af5a
2199c6 PGP_BEGIN_C_DECLARATIONS
be3ffd #if PRAGMA_IMPORT
5fb981 #pragma import on
2d7454 #endif
dcaf5a
f43379 #ifdef __cplusplus
ae4db1 ¤   inline unsigned char
c7d978 StrSize(ConstStr255Param string)·
71bb36 {
55a0cf ¤   return ( 1UL + string[ 0 ] );
ebefe6 }
82db21 #else
b6d676 #define StrSize(string) ( 1UL + string[ 0 ] )
8c7454 #endif
1faf5a
486eb1 void¤   NumVersionToString(const NumVersion *version, StringPtr versionString);
17c8dc void¤   VersionToString(UInt16 version, StringPtr versionString);
81af5a
c7e22a void¤   CopyPString(ConstStr255Param srcStr, StringPtr destStr);
e90567 void¤   CopyPStringMax(ConstStr255Param srcStr, StringPtr destStr,
c112f6 ¤   ¤   ¤   UInt32 maxBytesToCopy);
73301c void¤   AppendPString(ConstStr255Param¤ appendStr, StringPtr destStr);
372e05 void¤   AppendPStringMax(ConstStr255Param¤  appendStr, StringPtr destStr,
ad9e21 ¤   ¤   ¤   UInt32 maxBytesToAppend);
489902 void¤   InsertInPString(const uchar *source, uchar offset, uchar *dest);
06e5be void¤   DeleteFromPString(uchar *string, uchar offset, uchar count);
8894c6 void¤   PrintPString(uchar *dest, const uchar *formatStr,
7e78d0 ¤   ¤   ¤   const uchar *stringToPut);
1fd569 Boolean¤PStringsAreEqual(const uchar *str1, const uchar *str2);
18af5a
04302c Boolean¤PStringHasSuffix( ConstStr255Param str,
d4c501 ¤   ¤   ¤   ConstStr255Param suffix, Boolean caseSensitive );
7167c5 ¤
c730b9 void¤   CToPString(const char *cString, StringPtr pString);
88686e void¤   PToCString(ConstStr255Param pString, char * cString);
6caf5a
fa8782 void¤   GetIndCString(char theString[256], ResID stringListResID,
8b6c49 ¤   ¤   ¤   ¤   ¤   short stringListIndex);
3faf5a
98af5a
bdaf5a
3da867 /* Use this if you don't want to link in ANSI */
7aa14b char *¤ CopyCString( const char *¤  src, char *¤ dest );
74af5a
155a79 OSErr¤  AppendStringToHandle( Handle theHandle, ConstStr255Param¤   string );
35af5a
1daf5a
714c65 /* str1, str2 and str3 may be null */
6ab5b8 void¤   InsertPStrings( ConstStr255Param baseString,
4a5d44 ¤   ¤   ¤   ConstStr255Param str1, ConstStr255Param str2,
bcb7f2 ¤   ¤   ¤   ConstStr255Param str3, StringPtr resultString );
ecaf5a
903ffd #if PRAGMA_IMPORT
0c2ced #pragma import reset
017454 #endif
0e1254 PGP_END_C_DECLARATIONS
6eaf5a
37af5a
--58ab 00117ad844240120246 Page 2 of MacStrings.h
e0af5a
1aaf5a
17af5a
--6492 000640fa4c840120247 Page 1 of MacTraps.c
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
4cebd6 ¤   $Id: MacTraps.c,v 1.4.28.1 1998/11/12 03:19:50 heller Exp $
30f7f7 ____________________________________________________________________________*/
94af5a
e6a9c8 #include <Traps.h>
63af5a
6b5bf6 #include "MacTraps.h"
f8af5a
5a8e39 #define kToolTrapMask 0x0800
04af5a
6a88f9 ¤   short
8f3466 NumToolboxTraps(void)
f9bb36 {
ecaf3b ¤   if( NGetTrapAddress( _InitGraf, ToolTrap ) ==
3a7b29 ¤   ¤   ¤   NGetTrapAddress( 0xAA6E, ToolTrap ) )
e9c7a1 ¤   {
2a0230 ¤   ¤   return( 0x0200 );
209371 ¤   }
fe0e24 ¤   else
58c7a1 ¤   {
365afd ¤   ¤   return( 0x0400 );
af9371 ¤   }
89efe6 }
a9af5a
b89457 ¤   TrapType
083b6d GetTrapType(short theTrap)
7bbb36 {
def569 ¤   if( (theTrap & kToolTrapMask) != 0 )
1bc7a1 ¤   {
28eefe ¤   ¤   return ( ToolTrap );
5c9371 ¤   }
610e24 ¤   else
89c7a1 ¤   {
b7dc44 ¤   ¤   return ( OSTrap );
e09371 ¤   }
8eefe6 }
4daf5a
a07e69 ¤   Boolean
ced3a6 TrapAvailable(short theTrap)
43bb36 {
1f0720 ¤   TrapType¤   trapType;
48af5a
26ebed ¤   trapType = GetTrapType(theTrap);
b5f355 ¤   if(trapType == ToolTrap)
b4c7a1 ¤   {
720aa5 ¤   ¤   theTrap = theTrap & 0x07FF;
f49371 ¤   }
7e67c5 ¤
292d8c ¤   if ( theTrap >= NumToolboxTraps() )
7cc7a1 ¤   {
6a1fb0 ¤   ¤   theTrap = _Unimplemented;
189371 ¤   }
9f67c5 ¤
1722e9 ¤   return ( NGetTrapAddress( theTrap, trapType ) !=
0d8541 ¤   ¤   NGetTrapAddress( _Unimplemented, ToolTrap ) );
69efe6 }
b2af5a
4c7e69 ¤   Boolean
35dc70 PFLPatchTrap(short trapNum, UniversalProcPtr newAddr, UniversalProcPtr *oldAddr)
3fbb36 {
c76152 ¤   TrapType¤   ¤   ¤   trapType;
b267c5 ¤
f6d47f ¤   trapType¤   = GetTrapType( trapNum );
3254e3 ¤   *oldAddr¤   = NGetTrapAddress( trapNum, trapType );
9c4fd3 ¤   newAddr¤¤   = (UniversalProcPtr) StripAddress( newAddr );
c067c5 ¤
f1fa44 ¤   if ( newAddr != *oldAddr )
4cc7a1 ¤   {
6444fb ¤   ¤   NSetTrapAddress( newAddr, trapNum, trapType );
--0709 00131d3ab9e40120247 Page 2 of MacTraps.c
266392 ¤   ¤   return( TRUE );
d09371 ¤   }
d667c5 ¤
9853dc ¤   return( FALSE );
31efe6 }
--efa2 001a18924de40120248 Page 1 of MacTraps.h
a70335 /*____________________________________________________________________________
7bf254 ¤   Copyright (C) 1996,1997 Network Associates, Inc. and its affiliates.
754b0f ¤   All rights reserved.
0967c5 ¤
dd2723 ¤   $Id: MacTraps.h,v 1.5.28.1 1998/11/12 03:19:50 heller Exp $
49f7f7 ____________________________________________________________________________*/
edaf5a
197b7d #pragma once
cdaf5a
19fbf0 #include <OSUtils.h>
a4af5a
7dc5d5 #include "pgpBase.h"
dfaf5a
5199c6 PGP_BEGIN_C_DECLARATIONS
80af5a
b4fe7b short¤  ¤   NumToolboxTraps(void);
ac027b TrapType¤   GetTrapType(short theTrap);
4291af Boolean¤¤   TrapAvailable(short theTrap);
c9d326 Boolean¤¤   PFLPatchTrap(short trapNum,
962053 ¤   ¤   ¤   ¤   UniversalProcPtr newAddr, UniversalProcPtr *oldAddr);
3aaf5a
581254 PGP_END_C_DECLARATIONS
a1af5a
--6425 001551936c240120249 Page 1 of SetupA5.h
a70335 /*____________________________________________________________________________
7bf254 ¤   Copyright (C) 1996,1997 Network Associates, Inc. and its affiliates.
754b0f ¤   All rights reserved.
0967c5 ¤
7c31eb ¤   Adapted from MetroWerks SetupA4.h
1caf5a
be383e ¤   $Id: SetupA5.h,v 1.4.28.1 1998/11/12 03:19:51 heller Exp $
83f7f7 ____________________________________________________________________________*/
8aaf5a
1aa729 #ifndef __SETUPA5__
63aeae #define __SETUPA5__
dfaf5a
1f99c6 PGP_BEGIN_C_DECLARATIONS
4baf5a
5739dd #if !defined(__POWERPC__) && !defined(__CFM68K__)
e2af5a
7955ca ¤   #define PrepareCallbackA5()¤RememberA5()·
e0ed24 ¤   #define EnterCallbackA5()¤  long oldA5 = SetUpA5()
0b6d4b ¤   #define ExitCallbackA5()¤   RestoreA5(oldA5)
d2af5a
b38061 ¤   static void RememberA5(void);
5467c5 ¤
408c34 ¤   static asm long SetUpA5(void)
ccc7a1 ¤   {
a7f043 ¤   ¤   move.l¤ a5,d0
a124bc ¤   ¤   lea¤¤   __storage,a5
7a8a61 ¤   ¤   move.l¤ (a5),a5
b621c2 ¤   ¤   rts
2a1b52 ¤   ¤
ecd806 ¤   /* this storage is only referenced thru data cache */
c2b080 ¤   __storage:¤ dc.l¤   0
b567c5 ¤
771f0d ¤   ¤   entry¤  static RememberA5
fb5a04 ¤   ¤   lea¤¤   __storage,a0
f74a9b ¤   ¤   move.l¤ a5,(a0)
2321c2 ¤   ¤   rts
639371 ¤   }
5467c5 ¤
1de11d ¤   static long RestoreA5(long:__D0):__D0 = 0xC18D;
41af5a
d2db21 #else
52af5a
802e4d ¤   #define PrepareCallbackA5()·
4ad36b ¤   #define EnterCallbackA5()
d02f09 ¤   #define ExitCallbackA5()
2c91fc ¤   #define RememberA5() ¤  0
79ae70 ¤   #define SetUpA5() ¤ ¤   0L
027a75 ¤   #define RestoreA5(x)¤   0L
7867c5 ¤
877454 #endif
5aaf5a
0f1254 PGP_END_C_DECLARATIONS
1baf5a
557454 #endif
--b40a 000c4d004ce4012024a Page 1 of UInt64.cp
a70335 /*____________________________________________________________________________
bdcfc2 ¤   Copyright (C) 1996 Network Associates, Inc. and its affiliates.
994b0f ¤   All rights reserved.
82f7f7 ____________________________________________________________________________*/
be85f6 #include "UInt64.h"
89af5a
89af5a
7eaf5a
caaf5a
ed53b1 #if ! TARGET_RT_MAC_CFM
deaf5a
a2bd7c ¤   #pragma parameter __D0 PrimAdd32WithCarry(__D0, __A0)
15dbd4 ¤   UInt32¤ ¤   PrimAdd32WithCarry(UInt32 src, UInt32 * result)
f0d14f ¤   ·THREEWORDINLINE(0xD190, 0x7000, 0xD180);
28a4ab ¤   ·
5aa4ab ¤   ·
8b426f ¤   #pragma parameter PrimAdd64(__A0, __A1)
950932 ¤   void¤   ¤   PrimAdd64(const CUInt64 * src, CUInt64 * result)
aff183 ¤   ·NINEWORDINLINE(0x2028, 0x0004, 0xD0A9,\
b833d9 ¤   ¤   ·0x0004, 0x2210, 0x2411, 0xD382, 0x22C1, 0x2280);
9f67c5 ¤
1167c5 ¤
80db21 #else
82af5a
80d7fb ¤   static inline UInt32
af1cbb PrimAdd32WithCarry(
1a2990 ¤   UInt32¤ ¤   src,
f1425c ¤   UInt32 *¤   ¤   dest)
91c7a1 ¤   {
04ec75 ¤   UInt32¤ result;
89badb ¤   UInt32¤ carry = 0;
cd67c5 ¤
a22942 ¤   result¤ = src + *dest;
fe5253 ¤   *dest¤  = result;
c4ac3e ¤   if ( result < src )
ec00a1 ¤   ¤   carry¤  = 1;
2c1b52 ¤   ¤
c012cc ¤   return( carry );
ec9371 ¤   }
ab67c5 ¤
d567c5 ¤
6a28dd ¤   static inline void
786240 PrimAdd64(
f8f530 ¤   const CUInt64 *¤src,
d79d57 ¤   CUInt64 *¤  ¤   result)
60c7a1 ¤   {
c67a08 ¤   result->hi¤ += src->hi + PrimAdd32WithCarry( src->lo, &result->lo );
c39371 ¤   }
0a67c5 ¤
f27454 #endif
6aaf5a
eaaf5a
f3af5a
f3dacc #pragma mark -
6daf5a
bdaf5a
33b5a2 ¤   CUInt64
489e8e operator -( const CUInt64 &lhs )
4ec7a1 ¤   {
d762a1 ¤   CUInt64¤result( ~lhs.hi, ~lhs.lo );
c67c90 ¤   result.hi¤  += PrimAdd32WithCarry( 1, &result.lo );
154c6e ¤   return( result );
c69371 ¤   }
2567c5 ¤
d567c5 ¤
ddb5a2 ¤   CUInt64
551a56 operator -(
6a5789 ¤   const CUInt64 &lhs,
f1fcc9 ¤   const CUInt64 &rhs)
32c7a1 ¤   {
44528e ¤   // form negative first
c4bea2 ¤   CUInt64¤result( ~rhs.hi,~rhs.lo );
--6ad4 0008367aa644012024a Page 2 of UInt64.cp
9a7c90 ¤   result.hi¤  += PrimAdd32WithCarry( 1, &result.lo );
1567c5 ¤
e624dc ¤   // now add together
286275 ¤   PrimAdd64( &lhs, &result );
2c67c5 ¤
d14c6e ¤   return( result );
fe9371 ¤   }
fd67c5 ¤
7567c5 ¤
5ab5a2 ¤   CUInt64
31cc8f operator +(
d05789 ¤   const CUInt64 &lhs,
6efcc9 ¤   const CUInt64 &rhs)
26c7a1 ¤   {
23057e ¤   CUInt64¤result¤ = rhs;
d967c5 ¤
006275 ¤   PrimAdd64( &lhs, &result );
1467c5 ¤
b74c6e ¤   return( result );
419371 ¤   }
6baf5a
edaf5a
68af5a
c26d52 ¤   void
927fc2 operator +=(
25ba0e ¤   CUInt64 &¤  lhs,
2e8135 ¤   CUInt64¤¤   rhs)
01c7a1 ¤   {
75a31d ¤   PrimAdd64( &rhs, &lhs );
879371 ¤   }
9167c5 ¤
3967c5 ¤
83a091 ¤   int
e1c51f operator <(
c2008c ¤   const CUInt64 &¤lhs,
8aabcc ¤   const CUInt64 &¤rhs)
a9c7a1 ¤   {
b7fe6b ¤   if ( lhs.hi < rhs.hi )
635b34 ¤   ¤   {
fca0ae ¤   ¤   return( 1 );
0a0fe4 ¤   ¤   }
ef1b52 ¤   ¤
dc3aa6 ¤   if ( lhs.hi == rhs.hi )
6d5b34 ¤   ¤   {
16efa4 ¤   ¤   return( lhs.lo < rhs.lo );
a80fe4 ¤   ¤   }
351b52 ¤   ¤
6bea61 ¤   return( 0 );
e59371 ¤   }
8167c5 ¤
5567c5 ¤
7fa091 ¤   int
1aeb42 operator <=(
f0008c ¤   const CUInt64 &¤lhs,
8cabcc ¤   const CUInt64 &¤rhs)
20c7a1 ¤   {
10fe6b ¤   if ( lhs.hi < rhs.hi )
105b34 ¤   ¤   {
b5a0ae ¤   ¤   return( 1 );
d90fe4 ¤   ¤   }
731b52 ¤   ¤
0a3aa6 ¤   if ( lhs.hi == rhs.hi )
835b34 ¤   ¤   {
617f47 ¤   ¤   return( lhs.hi <= rhs.hi );
050fe4 ¤   ¤   }
ff1b52 ¤   ¤
c3ea61 ¤   return( 0 );
7d9371 ¤   }
84af5a
1eaf5a
38af5a
836d52 ¤   void
--c422 000aaa927d14012024a Page 3 of UInt64.cp
df7eb7 operator <<=(
c5057e ¤   CUInt64 &¤  ¤   lhs,
4bcb76 ¤   UInt32¤ ¤   ¤   count)
75c7a1 ¤   {
ebde62 ¤   if ( count < 32 )
0b5b34 ¤   ¤   {
36bcda ¤   ¤   lhs.hi¤ <<= count;
6d59cd ¤   ¤   lhs.hi¤ |= lhs.lo >> ( 32 - count );
b89a0e ¤   ¤   lhs.lo¤ <<= count;
830fe4 ¤   ¤   }
c00e24 ¤   else
2d5b34 ¤   ¤   {
4977bd ¤   ¤   lhs.hi¤ = lhs.lo << ( count - 32 );
9c827a ¤   ¤   lhs.lo¤ = 0;
0d0fe4 ¤   ¤   }
759371 ¤   }
0daf5a
88af5a
c767c5 ¤
e1b5a2 ¤   CUInt64
e2b19e operator <<(
aa008c ¤   const CUInt64 &¤lhs,
4ccb76 ¤   UInt32¤ ¤   ¤   count)
a5c7a1 ¤   {
9fd086 ¤   CUInt64¤result¤ = lhs;
e167c5 ¤
1a768d ¤   result¤ <<= count;
ac4c6e ¤   return( result );
849371 ¤   }
2d67c5 ¤
7567c5 ¤
e867c5 ¤
3b6d52 ¤   void
8d5149 operator >>=(
b3057e ¤   CUInt64 &¤  ¤   lhs,
1bcb76 ¤   UInt32¤ ¤   ¤   count)
f7c7a1 ¤   {
bfde62 ¤   if ( count < 32 )
c75b34 ¤   ¤   {
0b6962 ¤   ¤   lhs.lo¤ >>= count;
2cba6f ¤   ¤   lhs.lo¤ |= lhs.hi << ( 32 - count );
5b4fb6 ¤   ¤   lhs.hi¤ >>= count;
830fe4 ¤   ¤   }
f60e24 ¤   else
2f5b34 ¤   ¤   {
acfddc ¤   ¤   lhs.lo¤ = lhs.hi >> ( count - 32 );
41a02e ¤   ¤   lhs.hi¤ = 0;
390fe4 ¤   ¤   }
a49371 ¤   }
3967c5 ¤
9567c5 ¤
4c67c5 ¤
b9b5a2 ¤   CUInt64
043d50 operator >>(
c3008c ¤   const CUInt64 &¤lhs,
a6cb76 ¤   UInt32¤ ¤   ¤   count)
22c7a1 ¤   {
70d086 ¤   CUInt64¤result¤ = lhs;
9467c5 ¤
5685e1 ¤   result¤ >>= count;
564c6e ¤   return( result );
049371 ¤   }
9567c5 ¤
3267c5 ¤
31af5a
3c9ba8 #if PGP_DEBUG¤  // [
56af5a
8033c8 ¤   static void
51c5bf DebugCString( const char *cString)
bfc7a1 ¤   {
67886f ¤   pgpDebugMsg( cString );
aa9371 ¤   }
--f00a 000476eb6b24012024a Page 4 of UInt64.cp
2a67c5 ¤
c4af5a
b56d52 ¤   void
3c6dc7 CUInt64::sTest( void )
64c7a1 ¤   {
f755ec ¤   const CUInt64¤  zero¤   = 0UL;
f725d4 ¤   CUInt64¤¤   ¤   negOne¤ = -1;
f0af5a
8f0c96 #define TestAssert( cond ) \
490a4c ¤   do { if ( ! (cond ) ) {DebugCString( #cond ); } } while ( FALSE )
76af5a
4065fc ¤   pgpAssert( zero.hi == 0 && zero.lo == 0 );
b367c5 ¤
0f9126 ¤   // test for assignment of negative char, short int, long
f5dc2e ¤   negOne¤ = (char)-1;
4d8702 ¤   TestAssert( negOne.hi == -1 && negOne.lo == -1 );
486677 ¤   negOne¤ = (int)-1;
f98702 ¤   TestAssert( negOne.hi == -1 && negOne.lo == -1 );
c2559e ¤   negOne¤ = (short)-1;
3b8702 ¤   TestAssert( negOne.hi == -1 && negOne.lo == -1 );
5f99cb ¤   negOne¤ = (long)-1;
a88702 ¤   TestAssert( negOne.hi == -1 && negOne.lo == -1 );
4b67c5 ¤
4e67c5 ¤
195dd5 ¤   // test for assignment of unsigned char, short int, long
68ae52 ¤   CUInt64¤temp;
335f09 ¤   temp¤   = (uchar)-1;
3f3776 ¤   TestAssert( temp.hi == 0 && temp.lo == (uchar)-1 );
f37180 ¤   temp¤   = (uint)-1;
598e83 ¤   TestAssert( temp.hi == 0 && temp.lo == (uint)-1 );
5a904e ¤   temp¤   = (UInt16)-1;
d28ba9 ¤   TestAssert( temp.hi == 0 && temp.lo == (UInt16)-1 );
1ab759 ¤   temp¤   = (UInt32)-1;
35068d ¤   TestAssert( temp.hi == 0 && temp.lo == (UInt32)-1 );
3667c5 ¤
1167c5 ¤
03b761 ¤   // test addition
2eeae8 ¤   TestAssert( CUInt64( 0, 0 ) + CUInt64( 0, 0 ) == zero );
6b1265 ¤   TestAssert( CUInt64( 0, 0 ) + CUInt64( 0, 0 ) == 0 );
7c7250 ¤   TestAssert( negOne + 1 == zero );
4603a6 ¤   TestAssert( 1 + negOne == zero );
de26e8 ¤   TestAssert( CUInt64( 0, -1) + 1 == CUInt64( 1, 0) );
a0cc6f ¤   TestAssert( CUInt64( 1 ) + CUInt64( 1 ) == CUInt64( 2 ) );
6ee7ab ¤   TestAssert( CUInt64( 1, 0) + CUInt64( 1, 0) == CUInt64( 2, 0) );
e95704 ¤   TestAssert( CUInt64( 100, 0) + CUInt64( 0, 100) == CUInt64( 100, 100) );
b6af5a
44af5a
35a829 ¤   // test subtraction
40909b ¤   TestAssert( CUInt64( 1 ) - CUInt64( 1 ) == zero );
967f97 ¤   TestAssert( CUInt64( 2 ) - CUInt64( 1 ) == CUInt64( 1 ) );
52a6e1 ¤   TestAssert( CUInt64( 1, 0) - (CUInt64( 1, 0) - 1) == CUInt64( 1 ) );
0167c5 ¤
c667c5 ¤
3ea877 ¤   // test comparisons
73e1af ¤   TestAssert( CUInt64( 0 ) == CUInt64( 0 ) );
71f7b3 ¤   TestAssert( CUInt64( 1 ) == CUInt64( 1 ) );
28eeb2 ¤   TestAssert( CUInt64( 1, 1) == CUInt64( 1, 1) );
38c4de ¤   TestAssert( CUInt64( 1 ) != CUInt64( 2 ) );
b434fa ¤   TestAssert( CUInt64( 1, 1) != CUInt64( 2, 2) );
ebe2fd ¤   TestAssert( CUInt64( 1, 1) != CUInt64( 1, 2) );
273887 ¤   TestAssert( CUInt64( 1, 1) != CUInt64( 2, 1) );
e667c5 ¤
5af861 ¤   TestAssert( CUInt64( 1, 1) < CUInt64( 1, 2) );
3a221b ¤   TestAssert( CUInt64( 1, 1) < CUInt64( 2, 1) );
e7d9de ¤   TestAssert( CUInt64( 1, 1) <= CUInt64( 1, 1) );
ccd5a3 ¤   TestAssert( CUInt64( 1, 1) <= CUInt64( 1, 2) );
140fd9 ¤   TestAssert( CUInt64( 1, 1) <= CUInt64( 2, 1) );
9967c5 ¤
d25e02 ¤   // test shifts
df813e ¤   TestAssert( CUInt64( 0, 1 ) << 1 == CUInt64( 0, 2 ) );
f5576a ¤   TestAssert( CUInt64( 0, 1 ) << 32 == CUInt64( 1, 0 ) );
470eca ¤   TestAssert( CUInt64( 0, 0x80000000 ) << 1 == CUInt64( 1, 0 ) );
--bbbd 001670e47124012024a Page 5 of UInt64.cp
73c0ad ¤   TestAssert( CUInt64( -1, -1 ) << 64 == CUInt64( 0, 0 ) );
48751a ¤   TestAssert( CUInt64( -1, -1 ) << 32 == CUInt64( -1, 0 ) );
aab82c ¤   TestAssert( CUInt64( -1, -1 ) << 63 == CUInt64( 0x80000000, 0 ) );
f2c0ad ¤   TestAssert( CUInt64( -1, -1 ) << 64 == CUInt64( 0, 0 ) );
6e67c5 ¤
29583c ¤   TestAssert( CUInt64( 0, 2 ) >> 1 == CUInt64( 0, 1 ) );
e8ae7e ¤   TestAssert( CUInt64( 1, 0 ) >> 32 == CUInt64( 0, 1 ) );
ebcfc0 ¤   TestAssert( CUInt64( 1, 1 ) >> 1 == CUInt64( 0, 0x80000000 ) );
96f010 ¤   TestAssert( CUInt64( -1, -1 ) >> 64 == CUInt64( 0, 0 ) );
0c9f88 ¤   TestAssert( CUInt64( -1, -1 ) >> 32 == CUInt64( 0, -1 ) );
d8e708 ¤   TestAssert( CUInt64( -1, -1 ) >> 63 == CUInt64( 0, 1 ) );
7d9371 ¤   }
a5af5a
b9af5a
46af5a
8548b8 class TestCUInt64
7fc7a1 ¤   {
8c67d4 ¤   public:
805d30 ¤   ¤   TestCUInt64( void )
e4f776 ¤   ¤   ¤   {
dac718 ¤   ¤   ¤   CUInt64::sTest();
4ea3a6 ¤   ¤   ¤   }
1c62bd ¤   };
e6acc1 static TestCUInt64¤ sTest;
c1af5a
0776d8 #endif¤ // ]
5367c5 ¤
67bd73 ¤   ¶
--15fa 00027710ef04012024b Page 1 of UInt64.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
8ff08a ¤   $Id: UInt64.h,v 1.10.18.1 1998/11/12 03:19:52 heller Exp $
35f7f7 ____________________________________________________________________________*/
9daf5a
e77b7d #pragma once
deaf5a
fcaf5a
a7675a #include "pgpTypes.h"
aaaf5a
79f151 class CUInt64
efc7a1 ¤   {
cfc369 ¤   protected:
f6e274 ¤   ¤   ¤   void¤   InitLong( long num )
128fec ¤   ¤   ¤   ¤   ¤   ¤   {
d86bc1 ¤   ¤   ¤   ¤   ¤   ¤   lo¤ = num;
04db46 ¤   ¤   ¤   ¤   ¤   ¤   if ( num < 0 )
c032e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   hi = -1;
2e7f8b ¤   ¤   ¤   ¤   ¤   ¤   else
e7dc99 ¤   ¤   ¤   ¤   ¤   ¤   ¤   hi = 0;
7bdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
1694aa ¤   ¤   ¤   ¤   ¤   ¤
3fac15 ¤   ¤   ¤   void¤   InitULong( unsigned long num )
a78fec ¤   ¤   ¤   ¤   ¤   ¤   {
c66bc1 ¤   ¤   ¤   ¤   ¤   ¤   lo¤ = num;
e288eb ¤   ¤   ¤   ¤   ¤   ¤   hi¤ = 0;
d3db3c ¤   ¤   ¤   ¤   ¤   ¤   }
9767d4 ¤   public:
ec0ce7 ¤   unsigned long¤  hi;
45a8d2 ¤   unsigned long¤  lo;
5aaf5a
8bec9e ¤   void¤   ¤   ¤   Init( unsigned long hiArg, unsigned long loArg )
a78fec ¤   ¤   ¤   ¤   ¤   ¤   {
a0cb40 ¤   ¤   ¤   ¤   ¤   ¤   hi¤ = hiArg;
34adb5 ¤   ¤   ¤   ¤   ¤   ¤   lo¤ = loArg;
95db3c ¤   ¤   ¤   ¤   ¤   ¤   }
7d9a26 // constructors
dffd84 ¤   CUInt64( void )¤¤   {¤  }
d82ecc ¤   CUInt64( const UnsignedWide &num )
375b34 ¤   ¤   {
e75a37 ¤   ¤   Init( num.hi, num.lo );
960fe4 ¤   ¤   }
c309a6 ¤   CUInt64( const wide &num )
ac5b34 ¤   ¤   {
1c5a37 ¤   ¤   Init( num.hi, num.lo );
c10fe4 ¤   ¤   }
bb0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
9c09ab ¤   CUInt64( unsigned long hiNum, unsigned long loNum)
4852b0 ¤   ¤   {·
bb8655 ¤   ¤   hi¤ = hiNum;
53e0a0 ¤   ¤   lo¤ = loNum;
200fe4 ¤   ¤   }
f11b52 ¤   ¤
ec04c4 ¤   CUInt64( unsigned long¤ num)¤   ¤   {¤  InitULong( num ); }
4c1c6d ¤   CUInt64( unsigned char¤ num)¤   ¤   {¤  InitULong( (unsigned long)num ); }
74a4b8 ¤   CUInt64( unsigned short¤num)¤   ¤   {¤  InitULong( (unsigned long)num ); }
0a36fa ¤   CUInt64( unsigned int¤  num)¤   ¤   {¤  InitULong( (unsigned long)num ); }
3667c5 ¤
8867c5 ¤
7858b7 ¤   CUInt64( long theLong)¤ ¤   {¤  InitLong( (long)theLong ); }
5f0357 ¤   CUInt64( char¤  theChar)¤   {¤  InitLong( (long)theChar ); }
ae9488 ¤   CUInt64( short¤ theShort)¤  {¤  InitLong( (long)theShort ); }
cc07da ¤   CUInt64( int¤   ¤   theInt)¤¤   {¤  InitLong( (long)theInt ); }
a4af5a
dbb38b ¤   operator¤   UnsignedWide( void ) const
134859 ¤   ¤   ¤   ¤   ¤   {
76fa65 ¤   ¤   ¤   ¤   ¤   return( *(const UnsignedWide *)this );
901c89 ¤   ¤   ¤   ¤   ¤   }
4cae30 ¤   ¤   ¤   ¤   ¤
27a248 ¤   operator¤   wide( void ) const
--9c58 0003b83e4c74012024b Page 2 of UInt64.h
e04859 ¤   ¤   ¤   ¤   ¤   {
345dec ¤   ¤   ¤   ¤   ¤   return( *(const wide *)this );
021c89 ¤   ¤   ¤   ¤   ¤   }
2fba6b #if TYPE_LONGLONG
1dff24 ¤   operator¤   unsigned long long( void ) const
394859 ¤   ¤   ¤   ¤   ¤   {
5ec855 ¤   ¤   ¤   ¤   ¤   unsigned long long¤ temp;
23ae30 ¤   ¤   ¤   ¤   ¤
f57e71 ¤   ¤   ¤   ¤   ¤   temp¤   = hi;
6a6a4d ¤   ¤   ¤   ¤   ¤   temp¤   <<= 32;
f0583b ¤   ¤   ¤   ¤   ¤   temp¤   |= lo;
0500fa ¤   ¤   ¤   ¤   ¤   return( temp );
fe1c89 ¤   ¤   ¤   ¤   ¤   }
dd7454 #endif
acaf5a
125c98 #if PGP_DEBUG
7d6abc ¤   static void¤¤   ¤   sTest( void );
767454 #endif
a562bd ¤   };
7aaf5a
80af5a
6daf5a
ee6f3a inline CUInt64¤ operator ~( const CUInt64 &lhs )
fb4859 ¤   ¤   ¤   ¤   ¤   {
84a4fd ¤   ¤   ¤   ¤   ¤   return( CUInt64( ~lhs.hi, ~lhs.lo ) );
ce1c89 ¤   ¤   ¤   ¤   ¤   }
4cae30 ¤   ¤   ¤   ¤   ¤
411231 CUInt64¤¤   ¤   operator +( const CUInt64 &lhs, const CUInt64 &rhs);
2caf5a
e722d4 void¤   ¤   ¤   operator +=( CUInt64 &lhs, CUInt64 rhs);
86ae30 ¤   ¤   ¤   ¤   ¤
84b9a5 CUInt64¤¤   ¤   operator -( const CUInt64 &lhs );
99ae30 ¤   ¤   ¤   ¤   ¤
620b90 CUInt64¤¤   ¤   operator -( const CUInt64 &lhs, const CUInt64 &rhs);
f7af5a
43ae30 ¤   ¤   ¤   ¤   ¤
27ae30 ¤   ¤   ¤   ¤   ¤
b8cacb inline int¤ ¤   operator ==( const CUInt64 &lhs, const CUInt64 &rhs)
0b4859 ¤   ¤   ¤   ¤   ¤   {
5cf5ee ¤   ¤   ¤   ¤   ¤   return( lhs.lo == rhs.lo && lhs.hi == rhs.hi );
fe1c89 ¤   ¤   ¤   ¤   ¤   }
29ae30 ¤   ¤   ¤   ¤   ¤
75bd71 inline int¤ ¤   operator !=( const CUInt64 &lhs, const CUInt64 &rhs)
7b4859 ¤   ¤   ¤   ¤   ¤   {
539942 ¤   ¤   ¤   ¤   ¤   return( lhs.lo != rhs.lo || lhs.hi != rhs.hi );
571c89 ¤   ¤   ¤   ¤   ¤   }
6fae30 ¤   ¤   ¤   ¤   ¤
cbae30 ¤   ¤   ¤   ¤   ¤
f3ad98 int¤¤   ¤   ¤   operator <( const CUInt64 &lhs, const CUInt64 &rhs);
cea60d int¤¤   ¤   ¤   operator <=( const CUInt64 &lhs, const CUInt64 &rhs);
36af5a
d6ea27 inline int¤ ¤   operator >( const CUInt64 &lhs, const CUInt64 &rhs )
fd26f6 ¤   ¤   ¤   ¤   ¤   { return( ! ( lhs <= rhs ) ); }
8f4213 inline int¤ ¤   operator >=( const CUInt64 &lhs, const CUInt64 &rhs)
b74260 ¤   ¤   ¤   ¤   ¤   { return( ! ( lhs < rhs ) ); }
00af5a
afae30 ¤   ¤   ¤   ¤   ¤
e6ae30 ¤   ¤   ¤   ¤   ¤
cec3b4 void¤   ¤   ¤   operator >>=( CUInt64 &lhs, const unsigned long rhs);
94c4a6 CUInt64¤¤   ¤   operator >>( const CUInt64 &lhs, const unsigned long count);
76af5a
66a75d void¤   ¤   ¤   operator <<=( CUInt64 &lhs, const unsigned long rhs);
85301a CUInt64¤¤   ¤   operator <<( const CUInt64 &lhs, const unsigned long count);
f5af5a
82af5a
18af5a
99af5a
e0af5a
50af5a
7caf5a
edaf5a
3baf5a
--ff0e 001374b00af4012024b Page 3 of UInt64.h
e0af5a
1aaf5a
17af5a
78af5a
32af5a
93af5a
37af5a
--9897 000a956b0ee4012024c Page 1 of WarningAlert.cp
bc38e5 /*
ec682d ·* Copyright (C) 1994-1996 Network Associates, Inc. and its affiliates.
f7599a ·* All rights reserved.
9b775e ·*
36495d ·*/
86d83c ·
5bc20d #include <Dialogs.h>
914b15 #include <TextUtils.h>
a8af5a
d485c2 #include "MacStrings.h"
b70d08 #include "pgpMem.h"
4faf5a
133a2c #include "WarningAlert.h"
b6af5a
eeaf5a
d9af5a
ed223b const ResID¤kOKAlertResID¤  ¤   = 9940;
d7f30c const ResID¤kCancelAlertResID¤  = 9941;
4fe189 const ResID¤kOKCancelAlertResID¤= 9942;
d73b80 const ResID¤kCancelOKAlertResID¤= 9943;
098c17 const ResID¤kYesNoAlertResID¤   = 9944;
789309 const ResID¤kNoYesAlertResID¤   = 9945;
98af5a
a6b374 ¤   static short
8691da ShowWarningAlert(
93a6e6 ¤   WarningAlertType¤   alertType,
d85e58 ¤   WarningAlertStyle¤  alertStyle,
041978 ¤   ConstStr255Param¤   message)
fcbb36 {
e73463 ¤   short¤  ¤   itemHit = 1;
d993c0 ¤   short¤  ¤   resID;
596b37 ¤   const uchar¤kEmptyString[]¤ = "\p";
72fb29 ¤   GrafPtr¤¤   savePort;
bc67c5 ¤
be709f ¤   InitCursor();
01f732 ¤   GetPort( &savePort );
df67c5 ¤
036824 ¤   switch( alertStyle )
c4c7a1 ¤   {
d059bb ¤   ¤   case kWAOKStyle:¤   ¤   ¤   resID¤  = kOKAlertResID;¤   ¤   break;
186587 ¤   ¤   case kWACancelStyle:¤   ¤   resID¤  = kCancelAlertResID;¤   break;
c618b2 ¤   ¤   case kWAOKCancelStyle:¤ ¤   resID¤  = kOKCancelAlertResID;¤ break;
93b218 ¤   ¤   case kWACancelOKStyle:¤ ¤   resID¤  = kCancelOKAlertResID;¤ break;
ee43fe ¤   ¤   case kWAYesNoStyle:¤¤   ¤   resID¤  = kYesNoAlertResID;¤¤   break;
321c51 ¤   ¤   case kWANoYesStyle:¤¤   ¤   resID¤  = kNoYesAlertResID;¤¤   break;
389371 ¤   }
4d67c5 ¤
a85d49 ¤   ParamText( message, kEmptyString, kEmptyString, kEmptyString );
4c67c5 ¤
b326de ¤   if ( alertType == kWANoteAlertType )
52c7a1 ¤   {
51b79b ¤   ¤   itemHit¤= NoteAlert( resID, nil );
8b9371 ¤   }
b72e08 ¤   else if ( alertType == kWACautionAlertType )
8bc7a1 ¤   {
b7b7fd ¤   ¤   itemHit¤= CautionAlert( resID, nil );
779371 ¤   }
97cf12 ¤   else if ( alertType == kWAStopAlertType )
91c7a1 ¤   {
0f8490 ¤   ¤   itemHit¤= StopAlert( resID, nil );
859371 ¤   }
3967c5 ¤
8267c5 ¤
b76d1e ¤   SetPort( savePort );
b167c5 ¤
b680d4 ¤   return( itemHit );
b9efe6 }
98af5a
2caf5a
55af5a
4888f9 ¤   short
a9ad90 WarningAlert(
--d3ee 0014a565d0d4012024c Page 2 of WarningAlert.cp
bfa6e6 ¤   WarningAlertType¤   alertType,
9c5e58 ¤   WarningAlertStyle¤  alertStyle,
0567c0 ¤   ConstStr255Param¤   message,
4bb242 ¤   ConstStr255Param¤   str1,
b75d26 ¤   ConstStr255Param¤   str2,
b88649 ¤   ConstStr255Param¤   str3
d527e6 ¤   )
7cbb36 {
dbe5c8 ¤   Str255¤ finalMessage;
5267c5 ¤
0e86c2 ¤   InsertPStrings( message, str1, str2, str3, finalMessage );
da67c5 ¤
f195b0 ¤   return( ShowWarningAlert( alertType, alertStyle, finalMessage ) );
57efe6 }
8caf5a
adaf5a
8188f9 ¤   short
82ad90 WarningAlert(
1ba6e6 ¤   WarningAlertType¤   alertType,
b95e58 ¤   WarningAlertStyle¤  alertStyle,
949228 ¤   ResID¤  ¤   ¤   ¤   stringListResID,
3da2e0 ¤   short¤  ¤   ¤   ¤   stringIndex,
93b242 ¤   ConstStr255Param¤   str1,
d95d26 ¤   ConstStr255Param¤   str2,
e87942 ¤   ConstStr255Param¤   str3)
66bb36 {
f42906 ¤   Str255¤ message;
3267c5 ¤
037403 ¤   GetIndString( message, stringListResID, stringIndex );
e667c5 ¤
2ce6b3 ¤   return( WarningAlert( alertType, alertStyle, message, str1, str2, str3 ) );
e3efe6 }
03af5a
89af5a
94af5a
bdaf5a
c3af5a
ccaf5a
28af5a
85af5a
a6af5a
69af5a
47af5a
0aaf5a
98af5a
02af5a
d3af5a
2baf5a
89af5a
4aaf5a
--9536 001677781674012024d Page 1 of WarningAlert.h
bc38e5 /*
ec682d ·* Copyright (C) 1994-1996 Network Associates, Inc. and its affiliates.
f7599a ·* All rights reserved.
9b775e ·*
36495d ·*/
5aaf5a
967b7d #pragma once
37af5a
89fdf0 #include "WarningAlertTypes.h"
3aaf5a
a687c7 ¤   ¤   ¤
5a70a8 short¤  WarningAlert( WarningAlertType alertType, WarningAlertStyle alertStyle,
2ba3b3 ¤   ¤   ¤   ConstStr255Param message, ConstStr255Param str1 = NULL,
b0a091 ¤   ¤   ¤   ConstStr255Param str2 = NULL, ConstStr255Param str3 = NULL);
79af5a
b587c7 ¤   ¤   ¤
3070a8 short¤  WarningAlert( WarningAlertType alertType, WarningAlertStyle alertStyle,
fcd2e2 ¤   ¤   ¤   ResID stringListResID, short stringListIndex,
c89785 ¤   ¤   ¤   ConstStr255Param str1 = NULL,
c1a091 ¤   ¤   ¤   ConstStr255Param str2 = NULL, ConstStr255Param str3 = NULL);
aaaf5a
67af5a
--3dd1 0014855628c4012024e Page 1 of WarningAlertTypes.h
a70335 /*____________________________________________________________________________
89d32d ¤   Copyright (C) 1996-1998 Network Associates, Inc. and its affiliates.
774b0f ¤   All rights reserved.
c2af5a
0ede15 ¤   $Id: WarningAlertTypes.h,v 1.3.16.1 1998/11/12 03:19:54 heller Exp $
33f7f7 ____________________________________________________________________________*/
5baf5a
bf7b7d #pragma once
a5af5a
e56413 typedef enum WarningAlertType
f1bb36 {
c0e326 ¤   kWAInvalidAlertType¤= 0,
d6b86f ¤   kWANoteAlertType,
5b5edc ¤   kWACautionAlertType,
da7d54 ¤   kWAStopAlertType,
8fc86a ¤   kWACustomAlertType
f1af5a
8439b1 } WarningAlertType;
4eaf5a
636e61 typedef enum WarningAlertStyle
d3bb36 {
7290a2 ¤   kWAInvalidAlertStyle¤   = 0,
a0643c ¤   kWAOKStyle,
f7d804 ¤   kWACancelStyle,
4e1907 ¤   kWAOKCancelStyle,
9e889c ¤   kWACancelOKStyle,
098fcf ¤   kWAYesNoStyle,
edac3b ¤   kWANoYesStyle,
ef808b ¤   kWACustomAlertStyle
7caf5a
e76d23 } WarningAlertStyle;
48af5a
--7e6f 0002445a5224012024f Page 1 of pgpMacMemory.c
a70335 /*____________________________________________________________________________
17f89f ¤   MacMemory.c
8467c5 ¤
9ec97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
394b0f ¤   All rights reserved.
8f67c5 ¤
df67c5 ¤
3caf5a
787c9c ¤   $Id: pgpMacMemory.c,v 1.3.14.1 1998/11/12 03:19:55 heller Exp $
1bf7f7 ____________________________________________________________________________*/
0daf5a
c846ad #include "MacDebug.h"
a1c110 #include "pgpMacMemory.h"
690d08 #include "pgpMem.h"
c3af5a
d37517 #if MEMORY_ALLOC_MUST_BE_APP
5caf5a
8582e0 ¤   #if MEMORY_ALLOC_MUST_BE_SYS
f14041 ¤   #error illegal combination of flags
44b7ec ¤   #endif
f167c5 ¤
4aff52 ¤   #if MEMORY_ALLOC_MUST_BE_APP_OR_SYS
8f4041 ¤   #error illegal combination of flags
29b7ec ¤   #endif
6667c5 ¤
894175 #elif MEMORY_ALLOC_MUST_BE_SYS
e0ce41 ¤   #if MEMORY_ALLOC_MUST_BE_APP
56c827 ¤   ¤   #error illegal combination of flags
48b7ec ¤   #endif
9767c5 ¤
cbff52 ¤   #if MEMORY_ALLOC_MUST_BE_APP_OR_SYS
d2c827 ¤   ¤   #error illegal combination of flags
75b7ec ¤   #endif
193200 ¤   ¤   #elif MEMORY_ALLOC_MUST_BE_APP_OR_SYS
a2ce41 ¤   #if MEMORY_ALLOC_MUST_BE_APP
f9c827 ¤   ¤   #error illegal combination of flags
d5b7ec ¤   #endif
8967c5 ¤
5482e0 ¤   #if MEMORY_ALLOC_MUST_BE_SYS
1ec827 ¤   ¤   #error illegal combination of flags
50b7ec ¤   #endif
ed7454 #endif
d2af5a
4daf5a
07cd1d #define MIN(a, b )¤ ¤   ( (a) <= (b) ? (a) : (b) )
29af5a
f4af5a
ae0335 /*____________________________________________________________________________
904a93 ¤   Allocate a Handle, based on desired flags.
f88514 ¤   Flags have an implicit order as follows:
56f15b ¤   ¤   - temp mem ( kMacMemory_PreferTempMem )
00c4e1 ¤   ¤   - current heap
7f3695 ¤   ¤   - app heap
0b94b5 ¤   ¤   - temp mem
8c592c ¤   ¤   - system heap
07f7f7 ____________________________________________________________________________*/
e46692 ¤   Handle
194418 pgpNewHandle(
c78a52 ¤   const size_t¤   ¤   ¤   ¤   requestedSize,
a81975 ¤   const MacMemoryAllocFlags¤  flags )
d0c7a1 ¤   {
a1387f ¤   Handle¤ theHandle¤  = nil;
f98e70 ¤   OSErr¤  err¤= noErr;
377368 ¤   THz¤¤   saveZone¤   = GetZone();
eb67c5 ¤
e7ea5f ¤   #define HaveFlag( flag )¤   ( ((flags) & flag) == flag )
6367c5 ¤
18a44a ¤   if ( HaveFlag( kMacMemory_PreferTempMem ) )
0d5b34 ¤   ¤   {
8b07c0 ¤   ¤   theHandle¤  = TempNewHandle ( requestedSize, &err );
d20fe4 ¤   ¤   }
2467c5 ¤
--bd6e 000e55409744012024f Page 2 of pgpMacMemory.c
9e6cfb ¤   if ( IsNull( theHandle ) && HaveFlag( kMacMemory_UseCurrentHeap ))
985b34 ¤   ¤   {
a26e40 ¤   ¤   theHandle¤  = NewHandle( requestedSize );
cf0fe4 ¤   ¤   }
ef67c5 ¤
d34a6b ¤   if ( IsNull( theHandle ) && HaveFlag( kMacMemory_UseApplicationHeap ))
895b34 ¤   ¤   {
06318d ¤   ¤   SetZone( ApplicationZone() );
266e40 ¤   ¤   theHandle¤  = NewHandle( requestedSize );
5586a0 ¤   ¤   SetZone( saveZone );
7b0fe4 ¤   ¤   }
7967c5 ¤
ecf446 ¤   if ( IsNull( theHandle ) && HaveFlag( kMacMemory_UseTempMem ))
e15b34 ¤   ¤   {
008f66 ¤   ¤   theHandle¤  = TempNewHandle( requestedSize, &err);
390fe4 ¤   ¤   }
9867c5 ¤
1da0a4 ¤   if ( IsNull( theHandle ) && HaveFlag( kMacMemory_UseSystemHeap ))
6d5b34 ¤   ¤   {
214d4b ¤   ¤   theHandle¤  = NewHandleSys( requestedSize );
570fe4 ¤   ¤   }
bd67c5 ¤
42e39c ¤   if ( IsntNull( theHandle ) && HaveFlag( kMacMemory_ClearBytes ) )
d95b34 ¤   ¤   {
dbb018 ¤   ¤   pgpFillMemory( *theHandle, requestedSize, 0 );
040fe4 ¤   ¤   }
be67c5 ¤
cf89fb ¤   return( theHandle );
b99371 ¤   }
0167c5 ¤
e3af5a
c2af5a
c46d52 ¤   void
03ee77 pgpDisposeHandle( Handle¤   theHandle)
5ac7a1 ¤   {
93133e ¤   DisposeHandle( theHandle );
7b9371 ¤   }
3baf5a
d6af5a
25af5a
070335 /*____________________________________________________________________________
1f932e ¤   Allocate a pointer, based on desired flags.
e27a5f ¤   Flags have an implicit order as
bc398a ¤   follows:
27f15b ¤   ¤   - temp mem ( kMacMemory_PreferTempMem )
6dc4e1 ¤   ¤   - current heap
a53695 ¤   ¤   - app heap
3194b5 ¤   ¤   - temp mem
96592c ¤   ¤   - system heap
ba67c5 ¤
770e40 ¤   Because the memory may be allocated via either NewPtr or TempNewHandle,
bd1185 ¤   we must prepend a header to it so we know how to dispose of it.
f0f7f7 ____________________________________________________________________________*/
80af5a
3ab4cb #define kMacMemHeaderMagic¤ 0x89ABCDEF
4606a7 typedef struct MacMemHeader
d6bb36 {
c5e948 ¤   UInt32¤ ¤   magic;
273190 ¤   Handle¤ ¤   tempHandle;
2a11f5 ¤   size_t¤ ¤   userSize;
671218 ¤   PGPUInt32¤  reserved;
e067c5 ¤
d4e59e } MacMemHeader;
bdaf5a
8ce2d5 #define UserPtrToMacMemHeader( u )¤ ¤   ( ((MacMemHeader *)u) - 1 )
c8c48e #define MacMemHeaderToUserPtr( m )¤ ¤   ( ((MacMemHeader *)m) + 1 )
35af5a
da59fc ¤   void *
8c4edd pgpAllocMac(
608a52 ¤   const size_t¤   ¤   ¤   ¤   requestedSize,
093a4f ¤   const MacMemoryAllocFlags¤  userFlags )
e5bb36 {
--049d 0004b75409b4012024f Page 3 of pgpMacMemory.c
f01449 ¤   MacMemHeader *¤ memHeader¤  ¤   = nil;
97e88d ¤   void *¤ ¤   result¤ = nil;
d714d3 ¤   OSErr¤  ¤   err¤= noErr;
8cabdc ¤   THz¤¤   ¤   saveZone¤   = GetZone();
15b486 ¤   size_t¤ ¤   totalSize¤  ·= sizeof( MacMemHeader ) + requestedSize;
750d93 ¤   Handle¤ ¤   tempHandle = nil;
02088d ¤   MacMemoryAllocFlags¤flags = userFlags;
a9af5a
c15c98 #if PGP_DEBUG
5b0183 const MacMemoryAllocFlags¤  kAllFlags =
3ae15f ¤   kMacMemory_UseCurrentHeap | kMacMemory_UseApplicationHeap |
bbfa53 ¤   kMacMemory_UseSystemHeap |
ef9ccf ¤   kMacMemory_UseTempMem | kMacMemory_PreferTempMem | kMacMemory_ClearBytes;
d667c5 ¤
11b8ee ¤   pgpAssertMsg( ( userFlags & ~kAllFlags ) == 0,
6ef876 ¤   ¤   "pgpAllocMac: unknown flag" );
8ed699 ¤   pgpAssert( ( requestedSize & 0x80000000) == 0 );
0e7454 #endif
f667c5 ¤
55cef9 ¤   /* Check alignment */
29d963 ¤   pgpAssert( sizeof( MacMemHeader ) == 16 );
c6af5a
93ea5f ¤   #define HaveFlag( flag )¤   ( ((flags) & flag) == flag )
47af5a
667517 #if MEMORY_ALLOC_MUST_BE_APP
5520cc ¤   flags = flags & ~( kMacMemory_UseSystemHeap | kMacMemory_UseTempMem |
7c173b ¤   ¤   ¤   kMacMemory_PreferTempMem );
4667c5 ¤
6e4cc3 ¤   if( HaveFlag( kMacMemory_UseCurrentHeap ) )
67c7a1 ¤   {
1fd823 ¤   ¤   pgpAssert( GetZone() == ApplicationZone() );
d29371 ¤   }
728966 ¤   else if( ! HaveFlag( kMacMemory_UseApplicationHeap ) )
4cc7a1 ¤   {
cee21a ¤   ¤   pgpDebugPStr( "\ppgpAllocMac: "
a4a267 ¤   ¤   "Unable to satisfy MEMORY_ALLOC_MUST_BE_APP" );
899371 ¤   }
a04175 #elif MEMORY_ALLOC_MUST_BE_SYS
10c9e8 ¤   flags = flags & ~( kMacMemory_UseApplicationHeap |
302c4e ¤   ¤   ¤   kMacMemory_UseTempMem | kMacMemory_PreferTempMem );
4667c5 ¤
044cc3 ¤   if( HaveFlag( kMacMemory_UseCurrentHeap ) )
69c7a1 ¤   {
67d619 ¤   ¤   pgpAssert( GetZone() == SystemZone() );
339371 ¤   }
ab47e7 ¤   else if( ! HaveFlag( kMacMemory_UseSystemHeap ) )
97c7a1 ¤   {
a7e21a ¤   ¤   pgpDebugPStr( "\ppgpAllocMac: "
553063 ¤   ¤   ¤   "Unable to satisfy MEMORY_ALLOC_MUST_BE_SYS" );
0f9371 ¤   }
87372b #elif MEMORY_ALLOC_MUST_BE_APP_OR_SYS
771019 ¤   flags = flags & ~( kMacMemory_UseTempMem | kMacMemory_PreferTempMem );
dc67c5 ¤
904cc3 ¤   if( HaveFlag( kMacMemory_UseCurrentHeap ) )
24c7a1 ¤   {
786913 ¤   ¤   pgpAssert( GetZone() == ApplicationZone() ||
839d6d ¤   ¤   ¤   GetZone() == SystemZone() );
db9371 ¤   }
00c528 ¤   else if( ( ! HaveFlag( kMacMemory_UseSystemHeap ) ) &&
70011d ¤   ¤   ¤   ( ! HaveFlag( kMacMemory_UseApplicationHeap ) ) )
70c7a1 ¤   {
88e21a ¤   ¤   pgpDebugPStr( "\ppgpAllocMac: "
b05131 ¤   ¤   "Unable to satisfy MEMORY_ALLOC_MUST_BE_APP_OR_SYS" );
f29371 ¤   }
cf8e60 #endif¤
0867c5 ¤
4ea44a ¤   if ( HaveFlag( kMacMemory_PreferTempMem ) )
aac7a1 ¤   {
aa1b17 ¤   ¤   /*
010f81 ¤   ¤   ¤   allocate a Handle with a special header, lock it, and use the
cd871c ¤   ¤   ¤   dereferenced Handle as our pointer
4b5c12 ¤   ¤   */
--3f03 0006ea9fc254012024f Page 4 of pgpMacMemory.c
9a34fc ¤   ¤   tempHandle¤ = TempNewHandle( totalSize, &err);
5952c8 ¤   ¤   if ( IsntNull( tempHandle ) )
d95b34 ¤   ¤   {
1561fc ¤   ¤   ¤   HLock( tempHandle );
abd4ce ¤   ¤   ¤   memHeader¤  = (MacMemHeader *)*tempHandle;
670fe4 ¤   ¤   }
fd9371 ¤   }
6367c5 ¤
7a00e0 ¤   if ( IsNull( memHeader ) && HaveFlag( kMacMemory_UseCurrentHeap ))
edc7a1 ¤   {
18ae34 ¤   ¤   memHeader¤  = (MacMemHeader *)NewPtr( totalSize );
609371 ¤   }
7567c5 ¤
0ce931 ¤   if ( IsNull( memHeader ) && HaveFlag( kMacMemory_UseApplicationHeap ))
7cc7a1 ¤   {
ab318d ¤   ¤   SetZone( ApplicationZone() );
2dae34 ¤   ¤   memHeader¤  = (MacMemHeader *)NewPtr( totalSize );
e286a0 ¤   ¤   SetZone( saveZone );
829371 ¤   }
1567c5 ¤
d452e1 ¤   if ( IsNull( memHeader ) &&
02fd37 ¤   ¤   ¤   HaveFlag( kMacMemory_UseTempMem ) &&
4ce79e ¤   ¤   ¤   ! HaveFlag( kMacMemory_PreferTempMem ) )
88c7a1 ¤   {
551b17 ¤   ¤   /*
5b0f81 ¤   ¤   ¤   allocate a Handle with a special header, lock it, and use the
18871c ¤   ¤   ¤   dereferenced Handle as our pointer
625c12 ¤   ¤   */
2334fc ¤   ¤   tempHandle¤ = TempNewHandle( totalSize, &err);
8752c8 ¤   ¤   if ( IsntNull( tempHandle ) )
e25b34 ¤   ¤   {
cd61fc ¤   ¤   ¤   HLock( tempHandle );
58d4ce ¤   ¤   ¤   memHeader¤  = (MacMemHeader *)*tempHandle;
330fe4 ¤   ¤   }
039371 ¤   }
c367c5 ¤
b7c53b ¤   if ( IsNull( memHeader ) && HaveFlag( kMacMemory_UseSystemHeap ))
5cc7a1 ¤   {
1e5a5c ¤   ¤   memHeader¤  = (MacMemHeader *)NewPtrSys( totalSize );
689371 ¤   }
c167c5 ¤
c0c5b0 ¤   if ( IsntNull( memHeader ) )
fcc7a1 ¤   {
5f5c75 ¤   ¤   pgpClearMemory( memHeader, sizeof( *memHeader ) );
5be3d9 ¤   ¤   memHeader->magic¤   ¤   = kMacMemHeaderMagic;
34381d ¤   ¤   memHeader->tempHandle¤  = tempHandle;
821a3d ¤   ¤   memHeader->userSize¤¤   = requestedSize;
951b52 ¤   ¤
908545 ¤   ¤   /* point just beyond our header for user bytes */
ef25b0 ¤   ¤   result¤ = MacMemHeaderToUserPtr( memHeader );
f41b52 ¤   ¤
c92c3b ¤   ¤   if ( HaveFlag( kMacMemory_ClearBytes ) )
275b34 ¤   ¤   {
64e270 ¤   ¤   ¤   pgpClearMemory( result, requestedSize );
a00fe4 ¤   ¤   }
799371 ¤   }
d667c5 ¤
5e4c6e ¤   return( result );
11efe6 }
8baf5a
cc6d52 ¤   void
a6eda8 pgpFreeMac( void *¤ memory )
0dbb36 {
642572 ¤   const MacMemHeader *memHeader¤  = UserPtrToMacMemHeader( memory );
5067c5 ¤
017b5a ¤   pgpAssertAddrValidMsg( memHeader, MacMemHeader, "pgpFreeMac" );
9943bd ¤   pgpAssertMsg( memHeader->magic == kMacMemHeaderMagic, "pgpFreeMac" );
fe87c7 ¤   ¤   ¤
93e39a ¤   if ( memHeader->magic == kMacMemHeaderMagic )
aac7a1 ¤   {
59db5b ¤   ¤   if ( IsntNull( memHeader->tempHandle ) )
6e5b34 ¤   ¤   {
--862a 0009eb8f1ef4012024f Page 5 of pgpMacMemory.c
05ba02 ¤   ¤   ¤   AssertHandleIsValid( memHeader->tempHandle, "pgpFreeMac" );
db0feb ¤   ¤   ¤   DisposeHandle( memHeader->tempHandle );
630fe4 ¤   ¤   }
030e1d ¤   ¤   else
6d5b34 ¤   ¤   {
cb0a78 ¤   ¤   ¤   DisposePtr( (Ptr)memHeader );
0f0fe4 ¤   ¤   }
4d9371 ¤   }
5befe6 }
d5af5a
3785ea ¤   OSStatus
7cc47a pgpReallocMac(
6764a6 ¤   void **¤¤   ¤   ¤   ¤   ¤   userPtr,
fa8a52 ¤   const size_t¤   ¤   ¤   ¤   requestedSize,
d35000 ¤   const MacMemoryAllocFlags¤  userFlags)
dcbb36 {
c36792 ¤   OSStatus¤   err = noErr;
3d67c5 ¤
607254 ¤   if( IsNull( userPtr ) )
fd91d2 ¤   ¤   return( paramErr );
1767c5 ¤
ce9c0d ¤   if( IsntNull( *userPtr ) )
08c7a1 ¤   {
ae2ffb ¤   ¤   MacMemHeader *memHeader¤= UserPtrToMacMemHeader( *userPtr );
bdaf5a
f872ad ¤   ¤   pgpAssertAddrValidMsg( memHeader, MacMemHeader, "pgpReallocMac" );
a20d10 ¤   ¤   pgpAssertMsg( memHeader->magic == kMacMemHeaderMagic, "pgpReallocMac" );
a8af5a
22263e ¤   ¤   if( requestedSize > memHeader->userSize )
225b34 ¤   ¤   {
cac35b ¤   ¤   ¤   void¤   *newData;
7b87c7 ¤   ¤   ¤
7ed474 ¤   ¤   ¤   newData = pgpAllocMac( requestedSize, userFlags );
5e7c1e ¤   ¤   ¤   if( IsntNull( newData ) )
bdf776 ¤   ¤   ¤   {
c08645 ¤   ¤   ¤   ¤   pgpCopyMemory( *userPtr, newData, memHeader->userSize );
82af5a ¤   ¤   ¤   ¤   pgpFreeMac( *userPtr );
d33944 ¤   ¤   ¤   ¤   *userPtr = newData;
4da3a6 ¤   ¤   ¤   }
60bb8c ¤   ¤   ¤   else
73f776 ¤   ¤   ¤   {
00945a ¤   ¤   ¤   ¤   err = memFullErr;
1da3a6 ¤   ¤   ¤   }
b60fe4 ¤   ¤   }
260e1d ¤   ¤   else
b45b34 ¤   ¤   {
0461a4 ¤   ¤   ¤   /* Shrinking the block. Just adjust the allocated size */
c67c8a ¤   ¤   ¤   memHeader->userSize = requestedSize;
8d0fe4 ¤   ¤   }
4d9371 ¤   }
0c0e24 ¤   else
27c7a1 ¤   {
d3ac74 ¤   ¤   *userPtr = pgpAllocMac( requestedSize, userFlags );
257878 ¤   ¤   if( IsNull( *userPtr ) )
41a352 ¤   ¤   ¤   err = memFullErr;
929371 ¤   }
2a67c5 ¤
19deb7 ¤   return( err );
34efe6 }
8eaf5a
03af5a
7dcd56 ¤   UInt32
bdd85f pgpMaxBlock( MacMemoryAllocFlags userFlags )
f1bb36 {
d97368 ¤   THz¤¤   saveZone¤   = GetZone();
0a80b5 ¤   UInt32¤ tempMax¤¤   = 0;
199216 ¤   UInt32¤ maxSoFar¤   = 0;
43a04a ¤   MacMemoryAllocFlags flags = userFlags;
d867c5 ¤
247517 #if MEMORY_ALLOC_MUST_BE_APP
e220cc ¤   flags = flags & ~( kMacMemory_UseSystemHeap | kMacMemory_UseTempMem |
9e173b ¤   ¤   ¤   kMacMemory_PreferTempMem );
--6514 000b2327e104012024f Page 6 of pgpMacMemory.c
2a67c5 ¤
974cc3 ¤   if( HaveFlag( kMacMemory_UseCurrentHeap ) )
b6c7a1 ¤   {
c3d823 ¤   ¤   pgpAssert( GetZone() == ApplicationZone() );
b39371 ¤   }
168966 ¤   else if( ! HaveFlag( kMacMemory_UseApplicationHeap ) )
20c7a1 ¤   {
707537 ¤   ¤   pgpDebugPStr( "\ppgpMaxBlock: "
b6a267 ¤   ¤   "Unable to satisfy MEMORY_ALLOC_MUST_BE_APP" );
d29371 ¤   }
f54175 #elif MEMORY_ALLOC_MUST_BE_SYS
e5c9e8 ¤   flags = flags & ~( kMacMemory_UseApplicationHeap |
282c4e ¤   ¤   ¤   kMacMemory_UseTempMem | kMacMemory_PreferTempMem );
b867c5 ¤
364cc3 ¤   if( HaveFlag( kMacMemory_UseCurrentHeap ) )
a2c7a1 ¤   {
7bd619 ¤   ¤   pgpAssert( GetZone() == SystemZone() );
c89371 ¤   }
a947e7 ¤   else if( ! HaveFlag( kMacMemory_UseSystemHeap ) )
ccc7a1 ¤   {
7b7537 ¤   ¤   pgpDebugPStr( "\ppgpMaxBlock: "
04bf34 ¤   ¤   "Unable to satisfy MEMORY_ALLOC_MUST_BE_SYS" );
599371 ¤   }
52372b #elif MEMORY_ALLOC_MUST_BE_APP_OR_SYS
0f1019 ¤   flags = flags & ~( kMacMemory_UseTempMem | kMacMemory_PreferTempMem );
0667c5 ¤
4a4cc3 ¤   if( HaveFlag( kMacMemory_UseCurrentHeap ) )
a0c7a1 ¤   {
ea6913 ¤   ¤   pgpAssert( GetZone() == ApplicationZone() ||
e59bd5 ¤   ¤   ¤   ¤   GetZone() == SystemZone() );
4e9371 ¤   }
3fc528 ¤   else if( ( ! HaveFlag( kMacMemory_UseSystemHeap ) ) &&
3b011d ¤   ¤   ¤   ( ! HaveFlag( kMacMemory_UseApplicationHeap ) ) )
75c7a1 ¤   {
e47537 ¤   ¤   pgpDebugPStr( "\ppgpMaxBlock: "
fb5131 ¤   ¤   "Unable to satisfy MEMORY_ALLOC_MUST_BE_APP_OR_SYS" );
549371 ¤   }
d28e60 #endif¤
8aaf5a
125cea ¤   if ( HaveFlag( kMacMemory_PreferTempMem ) ||
2780f6 ¤   ¤   ¤   HaveFlag( kMacMemory_UseTempMem ) )
83c7a1 ¤   {
5ee02c ¤   ¤   long¤   dummyGrow;
bc1b52 ¤   ¤
62458b ¤   ¤   tempMax¤= TempMaxMem( &dummyGrow );
f97863 ¤   ¤   if ( tempMax > maxSoFar )
a3155b ¤   ¤   ¤   maxSoFar¤   = tempMax;
b99371 ¤   }
e867c5 ¤
c59deb ¤   if ( HaveFlag( kMacMemory_UseCurrentHeap ))
fcc7a1 ¤   {
dc0e6d ¤   ¤   tempMax¤= MaxBlock();
a47863 ¤   ¤   if ( tempMax > maxSoFar )
66155b ¤   ¤   ¤   maxSoFar¤   = tempMax;
549371 ¤   }
f967c5 ¤
a95f22 ¤   if ( HaveFlag( kMacMemory_UseApplicationHeap ))
fdc7a1 ¤   {
4c318d ¤   ¤   SetZone( ApplicationZone() );
1a0e6d ¤   ¤   tempMax¤= MaxBlock();
3286a0 ¤   ¤   SetZone( saveZone );
0d1b52 ¤   ¤
877863 ¤   ¤   if ( tempMax > maxSoFar )
7f155b ¤   ¤   ¤   maxSoFar¤   = tempMax;
b59371 ¤   }
cd67c5 ¤
170f32 ¤   if ( HaveFlag( kMacMemory_UseSystemHeap ))
64c7a1 ¤   {
5208df ¤   ¤   tempMax¤= MaxBlockSys();
b07863 ¤   ¤   if ( tempMax > maxSoFar )
2b155b ¤   ¤   ¤   maxSoFar¤   = tempMax;
b29371 ¤   }
--5f40 000abb4e5d94012024f Page 7 of pgpMacMemory.c
2a67c5 ¤
98b75c ¤   return( maxSoFar );
eaefe6 }
10af5a
65af5a
6259fc ¤   void *
bd78e4 pgpNewPtrMost(
7f50f1 ¤   const UInt32¤   ¤   ¤   desiredSize,
e81e21 ¤   const UInt32¤   ¤   ¤   minSize,
2934cd ¤   MacMemoryAllocFlags¤allocFlags,
f9030d ¤   UInt32 *¤   ¤   ¤   ¤   actualSizePtr )
75c7a1 ¤   {
bcc85c ¤   void *¤ memory¤ = nil;
1f67c5 ¤
a96286 ¤   pgpAssert( desiredSize != 0 && minSize != 0 );
0367c5 ¤
326da7 ¤   if( desiredSize != 0 )
1d5b34 ¤   ¤   {
215914 ¤   ¤   *actualSizePtr¤ = desiredSize;
f187c7 ¤   ¤   ¤
f6fee3 ¤   ¤   while ( IsNull( memory ) )
fef776 ¤   ¤   ¤   {
11295d ¤   ¤   ¤   memory¤ = pgpAllocMac( desiredSize, allocFlags );
030bcb ¤   ¤   ¤   if ( IsntNull( memory ) )
6df622 ¤   ¤   ¤   ¤   break;
9187c7 ¤   ¤   ¤
99c9a6 ¤   ¤   ¤   /* reduce size by 1/8 */
d5da2e ¤   ¤   ¤   *actualSizePtr¤ -= *actualSizePtr / 8;
20fc8b ¤   ¤   ¤   if ( *actualSizePtr < minSize )
b6f622 ¤   ¤   ¤   ¤   break;
bea3a6 ¤   ¤   ¤   }
e50fe4 ¤   ¤   }
be67c5 ¤
55036d ¤   return( memory );
f79371 ¤   }
39af5a
72af5a
baaf5a
f9af5a
33af5a
1eaf5a
adb177 #if 0
8933c8 ¤   static void
30ba4c TestFillMemory()
6dc7a1 ¤   {
2e9e5c ¤   void *mem;
df67c5 ¤
57dc5f ¤   const UInt32 kTestSize¤ ¤   ¤   = 20;
f3d276 ¤   const UInt32 kTestIterations¤   = 1 *1024UL * 1024UL;
731d41 ¤   mem¤= pgpAllocMac( kTestSize, kMacMemory_UseTempMem );
a033d6 ¤   if ( IsntNull( mem ) )
d95b34 ¤   ¤   {
e21cbd ¤   ¤   UInt32¤ startTicks¤ = TickCount();
511b52 ¤   ¤
c29eee ¤   ¤   UInt32¤ iter¤   = kTestIterations;
f6d052 ¤   ¤   while ( iter-- != 0 )
16f776 ¤   ¤   ¤   {
b8fef3 ¤   ¤   ¤   pgpClearMemory( mem, kTestSize );
c8fef3 ¤   ¤   ¤   pgpClearMemory( mem, kTestSize );
b9fef3 ¤   ¤   ¤   pgpClearMemory( mem, kTestSize );
5cfef3 ¤   ¤   ¤   pgpClearMemory( mem, kTestSize );
8ba3a6 ¤   ¤   ¤   }
681b52 ¤   ¤
73d945 ¤   ¤   UInt32¤ elapsed¤= TickCount() - startTicks;
171b52 ¤   ¤
044744 ¤   ¤   Str255¤ tempStr;
c100ab ¤   ¤   NumToString( elapsed, tempStr );
152115 ¤   ¤   DebugStr( tempStr );
e20fe4 ¤   ¤   }
b29371 ¤   }
d267c5 ¤
ab791e ¤   pgpFreeMac( mem );
--8ddf 001e075b7df4012024f Page 8 of pgpMacMemory.c
a07454 #endif
e0af5a
--53ef 00189e9c74440120250 Page 1 of pgpMacMemory.h
a70335 /*____________________________________________________________________________
92f7f7 ____________________________________________________________________________*/
db7b7d #pragma once
16af5a
687cab #include <stddef.h>
43c5d5 #include "pgpBase.h"
6baf5a
0e99c6 PGP_BEGIN_C_DECLARATIONS
a83ffd #if PRAGMA_IMPORT
42b981 #pragma import on
0b7454 #endif
06af5a
cfaf5a
950d08 #include "pgpMem.h"
0faf5a
ec24dd #define kMacMemory_UseCurrentHeap¤  ¤   ( 1UL << 0 )
141fab #define kMacMemory_UseApplicationHeap¤  ( 1UL << 1 )
c0129f #define kMacMemory_UseSystemHeap¤   ¤   ( 1UL << 2 )
4f633e #define kMacMemory_UseTempMem¤  ¤   ¤   ( 1UL << 3 )
ca6749 #define kMacMemory_PreferTempMem¤   ¤   ( 1UL << 4 )
9e8a2a #define kMacMemory_ClearBytes¤  ¤   ¤   ( 1UL << 5 )
26af5a
d36faf typedef PGPUInt16¤  MacMemoryAllocFlags;
2eaf5a
cd49e2 Handle¤ ¤   pgpNewHandle( const size_t size, const MacMemoryAllocFlags flags );
ee55ce void¤   ¤   pgpDisposeHandle( Handle theHandle );
51af5a
e1af5a
4c36d1 void *¤ ¤   pgpAllocMac( const size_t size, const MacMemoryAllocFlags flags );
27b986 OSStatus¤   pgpReallocMac(void **userPtr, const size_t requestedSize,
922734 ¤   ¤   ¤   ¤   ¤   const MacMemoryAllocFlags userFlags);
40d6b6 void¤   ¤   pgpFreeMac( void *memory );
f3af5a
54f63e UInt32¤ ¤   pgpMaxBlock( MacMemoryAllocFlags allocFlags );
9dd593 void *¤ ¤   pgpNewPtrMost( UInt32 desiredSize, UInt32 minSize,
9e1a91 ¤   ¤   ¤   ¤   ¤   MacMemoryAllocFlags allocFlags, UInt32 * actualSize );
a4af5a
a8af5a
27af5a
0c67c5 ¤
553ffd #if PRAGMA_IMPORT
692ced #pragma import reset
c57454 #endif
892827 PGP_END_C_DECLARATIONS¶
--11fd 000cce2760a40120251 Page 1 of pgpMacVolumeWiping.c
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
cb4fd6 ¤   Note: In this file, the term "block" refers to an HFS or HFS+ allocation
a019c3 ¤   block. The term "sector" is used to refer to the 512 byte disk block
9dcdac ¤   construct used by Mac disk drivers. The exception is the DiskExtent data
19ed4f ¤   structure which uses the term "block" but really means sectors
eb67c5 ¤
932836 ¤   $Id: pgpMacVolumeWiping.c,v 1.13.12.1 1998/11/12 03:19:56 heller Exp $
33f7f7 ____________________________________________________________________________*/
aeaf5a
f9324c #include <string.h>
aaaf5a
3cbbaf #include "HFSVolumes.h"
edaf5a
936f74 #include "MacBTree.h"
9375a9 #include "MacDriverUtils.h"
5abbf4 #include "MacFiles.h"
d585c2 #include "MacStrings.h"
4170d6 #include "pgpBitUtils.h"
d3c110 #include "pgpMacMemory.h"
d9c88f #include "pgpMacVolumeWiping.h"
400d08 #include "pgpMem.h"
39af5a
03a303 #define¤kResourceForkType¤  0xFF
4e01e4 #define¤kDataForkType¤  ¤   0
7b9b38 #define¤kDiskSectorSize¤¤   512L
01af5a
b03ac2 typedef PGPUInt8¤   ForkType;
d3af5a
59ee6a #define kMemoryAllocationFlags¤ ( kMacMemory_PreferTempMem |¤   ¤   \
0c8704 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_UseApplicationHeap )
7ded43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
410f5b pgpFixBeforeShip( "Handle slow volumes" )
e5a096 pgpFixBeforeShip( "Compute total blocks in extent during scan" )
68f8b1 pgpFixBeforeShip( "Sort problem fork info and implement binary search" )
a9eb37 pgpFixBeforeShip( "Handle Problem files" )
25cbb7 pgpFixBeforeShip( "Flush after each pass on mounted volumes" )
ceaf5a
0ba214 #define¤kMaxIOBufferSize¤   ¤   (2L * 1024L * 1024L)
f44fb5 #define¤kMinIOBufferSize¤   ¤   (64L * 1024L)
4aaf5a
1c5b71 #define MacValidateParam( expr )¤   \
b59e64 ¤   if ( ! (expr ) )¤   \
909c39 ¤   {\
61080e ¤   ¤   pgpAssert( expr );\
f4dd73 ¤   ¤   return( paramErr );\
659371 ¤   }
28af5a
7cc874 #define MacValidatePtr( ptr )¤  \
c5775d ¤   ¤   ¤   MacValidateParam( (ptr) != NULL )
b4af5a
f35c98 #if PGP_DEBUG
dcecd9 ¤   #define ASSERT(x)¤  AssertProc(x)
dcaf5a
7233c8 ¤   static void
34366e AssertProc(const char *msg)
b9bb36 {
1ad8af ¤   /*
0cd0dc ¤   ** A separate proc is used here because #defining ASSERT to be
adf1ac ¤   ** pgpAssert would consume lots of stack space
f69faa ¤   */
8167c5 ¤
deeb91 ¤   pgpDebugMsg( msg );
56efe6 }
82db21 #else
881503 ¤   #define ASSERT(x)¤  {}
a57454 #endif
a9af5a
44e818 #define¤Require(condition)¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
cc1ca1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
--786b 0000d10446740120251 Page 2 of pgpMacVolumeWiping.c
e1c294 ¤   if( ! (condition) ) {¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   \
189e46 ¤   ¤   ASSERT( "Catalog validation failure: " #condition );¤   ¤   \
963962 ¤   ¤   return( kWipingError_InvalidVolumeDataStructure );¤ ¤   ¤   \
3df828 ¤   }¤
41af5a
acaf46 #pragma options align=mac68k
b4af5a
e1b9f5 typedef struct ExtentRecord
bfbb36 {
43f20a ¤   union
1ac7a1 ¤   {
8d1eea ¤   ¤   HFSExtentRecord¤¤   hfs;
83eb94 ¤   ¤   HFSPlusExtentRecord¤hfsPlus;
0f62bd ¤   };
e9af5a
0494b6 } ExtentRecord;
b7af5a
773df3 typedef union HFSCatalogRecord
77bb36 {
4fdd0f ¤   SInt16¤ ¤   ¤   ¤   type;
8267c5 ¤
5302c6 ¤   HFSCatalogFile¤ ¤   file;
a28f77 ¤   HFSCatalogFolder¤   folder;
db0741 ¤   HFSCatalogThread¤   thread;
abaf5a
369784 } HFSCatalogRecord;
acaf5a
ad490c typedef union HFSPlusCatalogRecord
24bb36 {
106d38 ¤   SInt16¤ ¤   ¤   ¤   ¤   type;
6967c5 ¤
a934c0 ¤   HFSPlusCatalogFile¤ ¤   file;
c68f12 ¤   HFSPlusCatalogFolder¤   folder;
3f0724 ¤   HFSPlusCatalogThread¤   thread;
f1af5a
2b5abf } HFSPlusCatalogRecord;
67af5a
6356dd typedef struct HFSCatalogFileIndexRecord
cdbb36 {
2cbe00 ¤   HFSCatalogKey¤  key;
6dfa7f ¤   UInt32¤ ¤   ¤   nodeIndex;
6967c5 ¤
170871 } HFSCatalogFileIndexRecord;
7faf5a
47050a typedef struct HFSPlusCatalogFileIndexRecord
76bb36 {
5d6ca3 ¤   HFSPlusCatalogKey¤  key;
8ff3fe ¤   UInt32¤ ¤   ¤   ¤   nodeIndex;
7d67c5 ¤
7fbddf } HFSPlusCatalogFileIndexRecord;
8faf5a
957f0f typedef struct HFSExtentsFileIndexRecord
2fbb36 {
a50190 ¤   HFSExtentKey¤   key;
4cfa7f ¤   UInt32¤ ¤   ¤   nodeIndex;
2caf5a
b6fdc7 } HFSExtentsFileIndexRecord;
85af5a
99ca0e typedef struct BTreeFileInfo
62bb36 {
8be18c ¤   short¤  ¤   fileRefNum;¤¤   ¤   ¤   /* 0 = unmounted */
04e938 ¤   PGPUInt32¤  fileSize;¤  ¤   ¤   ¤   /* in bytes */
99042b ¤   PGPUInt32¤  numDiskExtents;
3fd1c9 ¤   DiskExtent¤ *diskExtents;
c74eca ¤   PGPUInt32¤  nodeSize;
b14428 ¤   PGPUInt32¤  numNodes;
ecd497 ¤   PGPUInt32¤  numFreeNodes;
b3d9d8 ¤   PGPUInt32¤  treeDepth;
172a7b ¤   PGPByte¤¤   *nodeBitmap;
1ff808 ¤   PGPByte¤¤   *nodeBuffer;¤   ¤   ¤   /* nodeSize bytes */
1867c5 ¤
0d3245 } BTreeFileInfo;
--fb4c 0000f3ce44740120251 Page 3 of pgpMacVolumeWiping.c
e0af5a
d6f5e9 typedef struct ForkExtent
80bb36 {
d37eb6 ¤   struct ForkExtent¤  *next;
f067c5 ¤
398ccc ¤   PGPUInt32¤  ¤   firstExtentBlock;
7a413b ¤   ExtentRecord¤   extents;
03af5a
b60d89 } ForkExtent;
d9af5a
b24219 typedef struct ProblemForkInfo
14bb36 {
11a70d ¤   PGPUInt32¤  fileID;
344a8f ¤   ForkType¤   forkType;
d2c989 ¤   PGPUInt32¤  forkLogicalLength;
db02b0 ¤   PGPUInt32¤  forkPhysicalLength;
2d4186 ¤   ForkExtent¤ *extentList;
8167c5 ¤
41a39f } ProblemForkInfo;
d1af5a
67ce5f typedef struct WipeRange
16bb36 {
e0b194 ¤   PGPUInt32¤  startSector;
187848 ¤   PGPUInt16¤  firstSectorOffset;
16798b ¤   PGPUInt16¤  numSectors;
f167c5 ¤
d79ea8 } WipeRange;
50af5a
39d513 typedef struct WipeControlBlock
aebb36 {
d335d5 ¤   PGPInt16¤   ¤   ¤   vRefNum;¤   ¤   ¤   ¤   /* 0 = unmounted */
a95d47 ¤   PGPInt16¤   ¤   ¤   driveNumber;
acbf9c ¤   PGPInt16¤   ¤   ¤   driverRefNum;
9a2f76 ¤   PGPUInt16¤  ¤   ¤   signature;
4b67c5 ¤
16ad1a ¤   PGPUInt32¤  ¤   ¤   numBlocks;
689af8 ¤   PGPUInt32¤  ¤   ¤   numFreeBlocks;
adff55 ¤   PGPUInt32¤  ¤   ¤   blockSize;¤ ¤   ¤   ¤   /* Allocation block size */
0595bb ¤   PGPUInt32¤  ¤   ¤   numSectorsPerBlock;
80dc00 ¤   PGPUInt32¤  ¤   ¤   numVolumeSectors;
2a9369 ¤   PGPUInt32¤  ¤   ¤   firstSectorBias;
1b67c5 ¤
6051f4 ¤   PGPUInt32¤  ¤   ¤   numSectorsToWipe;
49919d ¤   PGPUInt32¤  ¤   ¤   numSectorsWiped;
cb9f09 ¤   PGPUInt32¤  ¤   ¤   passIndex;
3fa56a ¤   PGPUInt32¤  ¤   ¤   totalPasses;
1067c5 ¤
d4654e ¤   PGPByte¤¤   ¤   ¤   *volumeBitmap;
ae67c5 ¤
2093ff ¤   PGPByte¤¤   ¤   ¤   *sectorBuffer;
3bb9d5 ¤   PGPWipingPattern¤   *patternBuffer;¤¤   /* Holds current wipe pattern */
ac278a ¤   PGPByte¤¤   ¤   ¤   *ioBuffer;
93e29e ¤   PGPUInt32¤  ¤   ¤   ioBufferSize;
8267c5 ¤
151c3d ¤   BTreeFileInfo¤  ¤   catalogFileInfo;
be4c6a ¤   BTreeFileInfo¤  ¤   extentsFileInfo;
c367c5 ¤
09514e ¤   PGPUInt32¤  ¤   ¤   numProblemForks;
3029ba ¤   ProblemForkInfo¤¤   *problemForkList;
8967c5 ¤
f1858e ¤   PGPUInt32¤  ¤   ¤   numWipeRanges;
ed2bab ¤   PGPUInt32¤  ¤   ¤   numAllocatedWipeRanges;
cdd7d7 ¤   WipeRange¤  ¤   ¤   *wipeRangeList;
6267c5 ¤
5c01fc ¤   PGPVolumeWipingEventHandler¤eventHandler;
2af358 ¤   PGPUserValue¤   ¤   ¤   ¤   eventUserValue;
e867c5 ¤
d1f20a ¤   union
81c7a1 ¤   {
ed2b33 ¤   ¤   struct
135b34 ¤   ¤   {
0f6522 ¤   ¤   ¤   HFSMasterDirectoryBlock¤mdb;
--b503 0008da8c21840120251 Page 4 of pgpMacVolumeWiping.c
f11b52 ¤   ¤
2da360 ¤   ¤   } hfs;
e81b52 ¤   ¤
e12b33 ¤   ¤   struct
565b34 ¤   ¤   {
bddd9d ¤   ¤   ¤   HFSPlusVolumeHeader ¤   vh;
9d1b52 ¤   ¤
17ef16 ¤   ¤   } hfsPlus;
bc62bd ¤   };
44af5a
ff5c98 #if PGP_DEBUG
fb1061 ¤   PGPUInt32¤  ¤   ¤   readCount;
73bb1e ¤   PGPUInt32¤  ¤   ¤   readSectorCount;
cd0776 ¤   PGPUInt32¤  ¤   ¤   writeCount;
b861e3 ¤   PGPUInt32¤  ¤   ¤   writeSectorCount;
907454 #endif
ed1b52 ¤   ¤
4c4caf } WipeControlBlock;
dbaf5a
97c7a5 typedef union
5fbb36 {
4f2ece ¤   ParamBlockRec¤  pb;
eb6eed ¤   XIOParam¤   ¤   xpb;
c967c5 ¤
0846d3 } IOPB;
82af5a
5082c2 typedef void¤   (*WipeBTreeNodeProcPtr)(WipeControlBlock *wcb,
09bb8e ¤   ¤   ¤   ¤   ¤   NodeDescriptor *nodeDesc, PGPUInt32 nodeSize );
40af5a
6c7c46 #pragma options align=reset
c5af5a
57af5a
9585ea ¤   OSStatus
60f8fc pgpCanWipeVolumeFreeSpace(short volRefNum)
7dbb36 {
096b9d ¤   OSStatus¤   ¤   err = noErr;
8b22d3 ¤   XVolumeParam¤   xpb;
f9478b ¤   Str32¤  ¤   ¤   volumeName;
9067c5 ¤
53d967 ¤   if( volRefNum >= 0)
48c7a1 ¤   {
76fb0f ¤   ¤   pgpDebugMsg( "pgpWipeVolumeFreeSpace(): Bad vRefNum" );
6891d2 ¤   ¤   return( paramErr );
a09371 ¤   }
1faf5a
8c87b2 ¤   if( FileSharingIsActive() )
c6c7a1 ¤   {
d56f5d ¤   ¤   pgpDebugMsg( "pgpWipeVolumeFreeSpace(): Filesharing active" );
c275bd ¤   ¤   return( vLckdErr );
ee9371 ¤   }
8e67c5 ¤
9b37a0 ¤   pgpClearMemory( &xpb, sizeof( xpb ) );
c667c5 ¤
7f23c5 ¤   xpb.ioVRefNum = volRefNum;
a062c9 ¤   xpb.ioNamePtr = volumeName;
3c67c5 ¤
1257b3 ¤   err = pgpPBXGetVolInfo( &xpb );
48ee03 ¤   if( IsntErr( err ) )
ccc7a1 ¤   {
7e1173 ¤   ¤   if( ( xpb.ioVAtrb & kVolumeAttributeLockMask ) != 0 )
545b34 ¤   ¤   {
d850bf ¤   ¤   ¤   /* Volume is locked */
bf9baa ¤   ¤   ¤   err = vLckdErr;
ca0fe4 ¤   ¤   }
86cc74 ¤   ¤   else if( xpb.ioVDrvInfo <= 0 || xpb.ioVDRefNum >= 0 )
155b34 ¤   ¤   {
ae70a7 ¤   ¤   ¤   /* Volume is offline */
8a87c7 ¤   ¤   ¤
cc6235 ¤   ¤   ¤   err = volOffLinErr;
6c0fe4 ¤   ¤   }
996c84 ¤   ¤   else if( xpb.ioVFSID != 0 )
8d5b34 ¤   ¤   {
--788d 00080e6860740120251 Page 5 of pgpMacVolumeWiping.c
35bfd4 ¤   ¤   ¤   /* Volume is not HFS or HFS Plus or is remote */
e95b62 ¤   ¤   ¤   err = extFSErr;
ae0fe4 ¤   ¤   }
f10e1d ¤   ¤   else
875b34 ¤   ¤   {
dc05e9 ¤   ¤   ¤   const VCB *vcb;
c887c7 ¤   ¤   ¤
026fa7 ¤   ¤   ¤   vcb = GetVCBForVolume( volRefNum );
ed2a91 ¤   ¤   ¤   if( IsntNull( vcb ) )
38f776 ¤   ¤   ¤   {
810fd7 ¤   ¤   ¤   ¤   if( vcb->vcbSigWord != kHFSSigWord &&
535059 ¤   ¤   ¤   ¤   ¤   vcb->vcbSigWord != kHFSPlusSigWord )
fb72c3 ¤   ¤   ¤   ¤   {
a53a8a ¤   ¤   ¤   ¤   ¤   err = wrgVolTypErr;
bc2613 ¤   ¤   ¤   ¤   }
b9f07f ¤   ¤   ¤   ¤   else if( vcb->vcbXTRef <= 0 || vcb->vcbCTRef <= 0 )
c872c3 ¤   ¤   ¤   ¤   {
d51497 ¤   ¤   ¤   ¤   ¤   /* No catalog or BTree files. */
ac3a8a ¤   ¤   ¤   ¤   ¤   err = wrgVolTypErr;
5b2613 ¤   ¤   ¤   ¤   }
49a3a6 ¤   ¤   ¤   }
d1bb8c ¤   ¤   ¤   else
34f776 ¤   ¤   ¤   {
a7ffdf ¤   ¤   ¤   ¤   err = wrgVolTypErr;
29a3a6 ¤   ¤   ¤   }
f00fe4 ¤   ¤   }
229371 ¤   }
8a67c5 ¤
a3deb7 ¤   return( err );
aeefe6 }
74af5a
9b2473 ¤   static OSStatus
22d7d9 SendEvent(
d0ebb3 ¤   const WipeControlBlock ¤*wcb,
d1a389 ¤   const VolumeWipeEvent¤  *event)
8dbb36 {
f16792 ¤   OSStatus¤   err = noErr;
f067c5 ¤
86fa8f ¤   if( IsntNull( wcb->eventHandler ) )
3c9c07 ¤   ¤   err = (*wcb->eventHandler)( event, wcb->eventUserValue );
6067c5 ¤
c8deb7 ¤   return( err );
d2efe6 }
71af5a
052473 ¤   static OSStatus
f72bc5 DoProgressEvent(const WipeControlBlock *wcb)
97bb36 {
256792 ¤   OSStatus¤   err = noErr;
4a67c5 ¤
92fa8f ¤   if( IsntNull( wcb->eventHandler ) )
57c7a1 ¤   {
5a7b3d ¤   ¤   VolumeWipeEvent¤event;
821b52 ¤   ¤
d11a30 ¤   ¤   event.type = kVolumeWipeEvent_WipeProgress;
a5af5a
5f7b79 ¤   ¤   event.progress.passIndex ¤  ¤   ¤   = wcb->passIndex;
92b6f3 ¤   ¤   event.progress.numSectorsWiped ¤¤   = wcb->numSectorsWiped;
1f76f1 ¤   ¤   event.progress.totalSectorsToWipe ¤ = wcb->numSectorsToWipe;
73af5a
c263ca ¤   ¤   if( event.progress.numSectorsWiped >
18be6e ¤   ¤   ¤   ¤   event.progress.totalSectorsToWipe )
725b34 ¤   ¤   {
3c162d ¤   ¤   ¤   event.progress.numSectorsWiped =
90dfa1 ¤   ¤   ¤   ¤   event.progress.totalSectorsToWipe;
a10fe4 ¤   ¤   }
231b52 ¤   ¤
94a2e9 ¤   ¤   err = SendEvent( wcb, &event );
6b9371 ¤   }
de67c5 ¤
91deb7 ¤   return( err );
83efe6 }
80af5a
--7adc 000e341662340120251 Page 6 of pgpMacVolumeWiping.c
e62473 ¤   static OSStatus
cd58de WCBFillIOPB(
40ebb3 ¤   const WipeControlBlock ¤*wcb,
08c28b ¤   PGPUInt32¤  ¤   ¤   ¤   startingSector,
6de423 ¤   PGPUInt32¤  ¤   ¤   ¤   numSectors,
c67739 ¤   PGPByte¤¤   ¤   ¤   ¤   *buffer,
63184b ¤   IOPB¤   ¤   ¤   ¤   ¤   *iopb)
cabb36 {
b96792 ¤   OSStatus¤   err = noErr;
8d67c5 ¤
beff8a ¤   if( wcb->numVolumeSectors != 0 &&
1a2f9a ¤   ¤   startingSector + numSectors > wcb->numVolumeSectors )
41c7a1 ¤   {
53cfd6 ¤   ¤   return( fileBoundsErr );
7c9371 ¤   }
7e67c5 ¤
66c629 ¤   pgpClearMemory( iopb, sizeof( *iopb ) );
fd67c5 ¤
569d76 ¤   iopb->pb.ioParam.ioCompletion¤  = NULL;
7beae1 ¤   iopb->pb.ioParam.ioVRefNum¤ ¤   = wcb->driveNumber;
bcb5b3 ¤   iopb->pb.ioParam.ioRefNum¤  ¤   = wcb->driverRefNum;
53b26d ¤   iopb->pb.ioParam.ioBuffer¤  ¤   = (Ptr) buffer;
f8d2e9 ¤   iopb->pb.ioParam.ioReqCount¤¤   = numSectors * kDiskSectorSize;
866d21 ¤   iopb->pb.ioParam.ioPosMode¤ ¤   = fsFromStart;
9967c5 ¤
36256f ¤   if( NeedWidePositioning( startingSector, numSectors ) )
d6c7a1 ¤   {
533342 ¤   ¤   UInt64¤ startingOffset;
821b52 ¤   ¤
93d16e ¤   ¤   iopb->xpb.ioPosMode ¤   |= kWidePosOffsetMask;
794633 ¤   ¤   startingOffset¤ ¤   ¤   = ( wcb->firstSectorBias +
10e395 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (UInt64) startingSector ) *
f04df3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (UInt64) kDiskSectorSize;
39fe40 ¤   ¤   iopb->xpb.ioWPosOffset¤ = *((wide *) &startingOffset);
369371 ¤   }
310e24 ¤   else
adc7a1 ¤   {
7e20fb ¤   ¤   iopb->pb.ioParam.ioPosOffset = (wcb->firstSectorBias + startingSector) *
ef603b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDiskSectorSize;
409371 ¤   }
1e67c5 ¤
25deb7 ¤   return( err );
edefe6 }
9caf5a
532473 ¤   static OSStatus
015665 WCBReadSectors(
2a49f8 ¤   WipeControlBlock ¤  *wcb,
b68191 ¤   PGPUInt32¤  ¤   ¤   startingSector,
216741 ¤   PGPUInt32¤  ¤   ¤   numSectors,
3abbd4 ¤   PGPByte¤¤   ¤   ¤   *buffer)
b2bb36 {
c85e3a ¤   IOPB¤   ¤   iopb;
2fdc42 ¤   OSStatus¤   err;
2067c5 ¤
50b7a5 ¤   err = WCBFillIOPB( wcb, startingSector, numSectors, buffer, &iopb );
f4ee03 ¤   if( IsntErr( err ) )
f4c7a1 ¤   {
065c98 #if PGP_DEBUG
ed117a ¤   ¤   wcb->readCount¤ ¤   ¤   += 1;
6511ed ¤   ¤   wcb->readSectorCount¤   += numSectors;
847454 #endif
c7af5a
04d6a0 ¤   ¤   err = PBReadSync( &iopb.pb );
4e9371 ¤   }
2567c5 ¤
06446c ¤   pgpAssert( IsntErr( err ) );
baaf5a
e3deb7 ¤   return( err );
99efe6 }
caaf5a
532473 ¤   static OSStatus
e37bf5 WCBWriteSectors(
--6aee 000c0022bc840120251 Page 7 of pgpMacVolumeWiping.c
b949f8 ¤   WipeControlBlock ¤  *wcb,
a68191 ¤   PGPUInt32¤  ¤   ¤   startingSector,
dd6741 ¤   PGPUInt32¤  ¤   ¤   numSectors,
99bbd4 ¤   PGPByte¤¤   ¤   ¤   *buffer)
cabb36 {
0d5e3a ¤   IOPB¤   ¤   iopb;
3fdc42 ¤   OSStatus¤   err;
8e67c5 ¤
6fb7a5 ¤   err = WCBFillIOPB( wcb, startingSector, numSectors, buffer, &iopb );
0bee03 ¤   if( IsntErr( err ) )
33c7a1 ¤   {
425c98 #if PGP_DEBUG
3805b1 ¤   ¤   wcb->writeCount¤¤   ¤   += 1;
59e24a ¤   ¤   wcb->writeSectorCount¤  += numSectors;
507454 #endif
feaf5a
1c0391 ¤   ¤   err = PBWriteSync( &iopb.pb );
2c9371 ¤   }
c867c5 ¤
f9446c ¤   pgpAssert( IsntErr( err ) );
6eaf5a
9adeb7 ¤   return( err );
b9efe6 }
bcaf5a
1c2473 ¤   static OSStatus
de65b1 ValidateHFSMasterDirectoryBlock(const HFSMasterDirectoryBlock *mdb)
81bb36 {
57d35a ¤   Require( mdb->drSigWord == kHFSSigWord );
559885 ¤   Require( mdb->drCrDate != 0 );
e4e905 ¤   Require( mdb->drLsMod != 0 );
0cd292 ¤   Require( mdb->drLsMod >= mdb->drCrDate );
e993dc ¤   Require( mdb->drVBMSt >= 3 );
948ac4 ¤   Require( mdb->drAllocPtr <= mdb->drNmAlBlks );
a7f827 ¤   Require( mdb->drNmAlBlks != 0 );
ad3363 ¤   Require( ( mdb->drAlBlkSiz % 512L ) == 0 );
218861 ¤   Require( ( mdb->drClpSiz % mdb->drAlBlkSiz ) == 0 );
707e7a ¤   Require( mdb->drAlBlSt > mdb->drVBMSt );
f23f7d ¤   Require( mdb->drNxtCNID >= kHFSFirstUserCatalogNodeID );
86e14b ¤   Require( mdb->drFreeBks < mdb->drNmAlBlks );
847594 ¤   Require( mdb->drVN[0] != 0 );
4d57a3 ¤   Require( mdb->drVN[0] < sizeof( mdb->drVN ) );
e81d25 ¤   Require(( mdb->drXTFlSize % mdb->drAlBlkSiz ) == 0 );
e4dc33 ¤   Require(( mdb->drCTFlSize % mdb->drAlBlkSiz ) == 0 );
fb67c5 ¤
a379ad ¤   return( noErr );
42efe6 }
48af5a
6c2473 ¤   static OSStatus
3db8a1 ValidateHFSPlusVolumeHeader(const HFSPlusVolumeHeader *vh)
59bb36 {
2d2a60 ¤   Require( vh->signature == kHFSPlusSigWord );
17471b ¤   Require( vh->createDate != 0 );
ae3c6c ¤   Require( vh->modifyDate != 0 );
54d3b5 ¤   Require( vh->modifyDate >= vh->createDate );
c585e1 ¤   Require( vh->nextAllocation <= vh->totalBlocks );
22af20 ¤   Require( vh->totalBlocks != 0 );
eefe22 ¤   Require( vh->freeBlocks < vh->totalBlocks );
241956 ¤   Require( ( vh->blockSize % 512L ) == 0 );
02ae07 ¤   Require( vh->nextCatalogID >= kHFSFirstUserCatalogNodeID );
d7af5a
4e044c ¤   pgpAssertMsg( kHFSPlusVersion == 4,
189ccb ¤   ¤   ¤   ¤   "HFSPlus volume format changed. Check all code" );
6467c5 ¤
0c1fff ¤   if( vh->version != kHFSPlusVersion ||
93ce85 ¤   ¤   vh->attributesFile.logicalSize != 0 )
1ac7a1 ¤   {
1c8134 ¤   ¤   return( kWipingError_UnsupportedVolumeFormat );
a29371 ¤   }
2967c5 ¤
cf79ad ¤   return( noErr );
b8efe6 }
c0af5a
--f661 000b456198a40120251 Page 8 of pgpMacVolumeWiping.c
e62473 ¤   static OSStatus
3f65ed WCBReadWriteFileSectors(
9349f8 ¤   WipeControlBlock ¤  *wcb,
e69f7a ¤   PGPBoolean¤ ¤   ¤   doRead,
20a9fb ¤   PGPUInt32¤  ¤   ¤   numExtents,
2cf5be ¤   const DiskExtent¤   *extentList,
5a8191 ¤   PGPUInt32¤  ¤   ¤   startingSector,
086ae8 ¤   PGPSize¤¤   ¤   ¤   numSectorsToReadWrite,
e8bbd4 ¤   PGPByte¤¤   ¤   ¤   *buffer)
13bb36 {
716792 ¤   OSStatus¤   err = noErr;
db67c5 ¤
832d82 ¤   pgpAssertAddrValid( extentList, DiskExtent );
f92954 ¤   pgpAssertAddrValid( buffer, VoidAlign );
da67c5 ¤
56cfda ¤   if( numSectorsToReadWrite != 0 )
8ac7a1 ¤   {
30632c ¤   ¤   PGPUInt32¤  ¤   extentIndex;
1e965a ¤   ¤   uchar¤  ¤   ¤   *curBuffer;
89a712 ¤   ¤   PGPUInt32¤  ¤   curFileSector;
1d9f45 ¤   ¤   PGPUInt32¤  ¤   sectorsRemaining;
e31b52 ¤   ¤
ebb714 ¤   ¤   curFileSector¤  ¤   = 0;
1e9761 ¤   ¤   curBuffer¤  ¤   ¤   = buffer;
64f4c4 ¤   ¤   sectorsRemaining¤   = numSectorsToReadWrite;
271b52 ¤   ¤
1234f1 ¤   ¤   for( extentIndex = 0; extentIndex < numExtents; extentIndex++ )
435b34 ¤   ¤   {
dbf8ae ¤   ¤   ¤   const DiskExtent¤   *curExtent;
6f87c7 ¤   ¤   ¤
dc20f0 ¤   ¤   ¤   curExtent = &extentList[extentIndex];
7887c7 ¤   ¤   ¤
d295d0 ¤   ¤   ¤   if( curFileSector + curExtent->numBlocks > startingSector )
ecf776 ¤   ¤   ¤   {
832e20 ¤   ¤   ¤   ¤   PGPUInt32¤  readWriteStartSector;
b87ac4 ¤   ¤   ¤   ¤   PGPUInt32¤  numReadWrittenSectors;
0b2b85 ¤   ¤   ¤   ¤
1c09aa ¤   ¤   ¤   ¤   readWriteStartSector ¤  = curExtent->diskBlockIndex;
e6a297 ¤   ¤   ¤   ¤   numReadWrittenSectors¤  = curExtent->numBlocks;
42af5a
5f735c ¤   ¤   ¤   ¤   if( curFileSector < startingSector )
bb72c3 ¤   ¤   ¤   ¤   {
db35d6 ¤   ¤   ¤   ¤   ¤   // File offset starts in this extent.
d2f227 ¤   ¤   ¤   ¤   ¤   readWriteStartSector ·+= ( startingSector - curFileSector );
5e13fe ¤   ¤   ¤   ¤   ¤   numReadWrittenSectors -= ( startingSector - curFileSector );
b32613 ¤   ¤   ¤   ¤   }
522b85 ¤   ¤   ¤   ¤
e14f9a ¤   ¤   ¤   ¤   if( numReadWrittenSectors > sectorsRemaining )
3a2018 ¤   ¤   ¤   ¤   ¤   numReadWrittenSectors = sectorsRemaining;
c22b85 ¤   ¤   ¤   ¤
6585d1 ¤   ¤   ¤   ¤   if( doRead )
0a72c3 ¤   ¤   ¤   ¤   {
229a69 ¤   ¤   ¤   ¤   ¤   err = WCBReadSectors( wcb, readWriteStartSector,·
f82fa1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numReadWrittenSectors, curBuffer );
972613 ¤   ¤   ¤   ¤   }
65fa07 ¤   ¤   ¤   ¤   else
8972c3 ¤   ¤   ¤   ¤   {
65bf20 ¤   ¤   ¤   ¤   ¤   err = WCBWriteSectors( wcb, readWriteStartSector,·
ba2fa1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numReadWrittenSectors, curBuffer );
762613 ¤   ¤   ¤   ¤   }
0c2b85 ¤   ¤   ¤   ¤
c1cd01 ¤   ¤   ¤   ¤   sectorsRemaining¤   -= numReadWrittenSectors;
a4ef1d ¤   ¤   ¤   ¤   curBuffer ¤ ¤   ¤   += ( numReadWrittenSectors *
e823b7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDiskSectorSize );
582b85 ¤   ¤   ¤   ¤
7d4d6d ¤   ¤   ¤   ¤   if( IsErr( err ) || sectorsRemaining == 0 )
7a14c3 ¤   ¤   ¤   ¤   ¤   break;
a5a3a6 ¤   ¤   ¤   }
a287c7 ¤   ¤   ¤
8b8c3f ¤   ¤   ¤   curFileSector += curExtent->numBlocks;
a90fe4 ¤   ¤   }
b49371 ¤   }
--e729 0004a1f835c40120251 Page 9 of pgpMacVolumeWiping.c
2a67c5 ¤
4fdeb7 ¤   return( err );
29efe6 }
02af5a
f667c5 ¤
f72473 ¤   static OSStatus
c29d5f WCBReadBTreeFile(
6c49f8 ¤   WipeControlBlock ¤  *wcb,
481d22 ¤   const BTreeFileInfo¤*fileInfo,
878191 ¤   PGPUInt32¤  ¤   ¤   startingSector,
5a6f1c ¤   PGPUInt32¤  ¤   ¤   numSectorsToRead,
3abbd4 ¤   PGPByte¤¤   ¤   ¤   *buffer)
63bb36 {
efdc42 ¤   OSStatus¤   err;
cc67c5 ¤
72cde9 ¤   if( fileInfo->fileRefNum != 0 )
a6c7a1 ¤   {
a13475 ¤   ¤   UInt32¤ bytesRead;
091b52 ¤   ¤
c3e523 ¤   ¤   /* Go through the File Manager because of caching issues */
6aaf5a
9291fb ¤   ¤   err = FSReadAtOffset( fileInfo->fileRefNum, startingSector *
21577f ¤   ¤   ¤   ¤   ¤   ¤   kDiskSectorSize, numSectorsToRead * kDiskSectorSize,
7c198d ¤   ¤   ¤   ¤   ¤   ¤   buffer, &bytesRead, TRUE );
3b9371 ¤   }
7b0e24 ¤   else
7cc7a1 ¤   {
09bf45 ¤   ¤   err = WCBReadWriteFileSectors( wcb, TRUE, fileInfo->numDiskExtents,
921d69 ¤   ¤   ¤   ¤   ¤   ¤   fileInfo->diskExtents, startingSector,
8b341b ¤   ¤   ¤   ¤   ¤   ¤   numSectorsToRead, buffer );
cb9371 ¤   }
f2af5a
0cdeb7 ¤   return( err );
b0efe6 }
0aaf5a
752473 ¤   static OSStatus
577ee5 WCBWriteBTreeFile(
2949f8 ¤   WipeControlBlock ¤  *wcb,
af1d22 ¤   const BTreeFileInfo¤*fileInfo,
038191 ¤   PGPUInt32¤  ¤   ¤   startingSector,
fd6f1c ¤   PGPUInt32¤  ¤   ¤   numSectorsToRead,
c8bbd4 ¤   PGPByte¤¤   ¤   ¤   *buffer)
41bb36 {
42dc42 ¤   OSStatus¤   err;
6c67c5 ¤
616d73 ¤   err = WCBReadWriteFileSectors( wcb, FALSE, fileInfo->numDiskExtents,
e01d69 ¤   ¤   ¤   ¤   ¤   ¤   fileInfo->diskExtents, startingSector,
94341b ¤   ¤   ¤   ¤   ¤   ¤   numSectorsToRead, buffer );
14af5a
9ddeb7 ¤   return( err );
93efe6 }
7eaf5a
722473 ¤   static OSStatus
602345 WCBReadBTreeNodes(
5249f8 ¤   WipeControlBlock ¤  *wcb,
071d22 ¤   const BTreeFileInfo¤*fileInfo,
2154b6 ¤   PGPUInt32¤  ¤   ¤   startingNode,
8f50de ¤   PGPUInt32¤  ¤   ¤   numNodesToRead,
7abbd4 ¤   PGPByte¤¤   ¤   ¤   *buffer)
8dbb36 {
1b11a0 ¤   PGPUInt32¤  sectorsPerNode;
2567c5 ¤
ca1155 ¤   sectorsPerNode = fileInfo->nodeSize / kDiskSectorSize;
af67c5 ¤
49e7b1 ¤   return( WCBReadBTreeFile( wcb, fileInfo, startingNode * sectorsPerNode,
51aad7 ¤   ¤   ¤   ¤   ¤   numNodesToRead * sectorsPerNode, buffer ) );
f4efe6 }
a0af5a
dd2473 ¤   static OSStatus
653977 WCBWriteBTreeNodes(
4349f8 ¤   WipeControlBlock ¤  *wcb,
4a1d22 ¤   const BTreeFileInfo¤*fileInfo,
--a730 0006f736fce40120251 Page 10 of pgpMacVolumeWiping.c
ed54b6 ¤   PGPUInt32¤  ¤   ¤   startingNode,
c18941 ¤   PGPUInt32¤  ¤   ¤   numNodesToWrute,
25bbd4 ¤   PGPByte¤¤   ¤   ¤   *buffer)
34bb36 {
bb11a0 ¤   PGPUInt32¤  sectorsPerNode;
ed67c5 ¤
bd1155 ¤   sectorsPerNode = fileInfo->nodeSize / kDiskSectorSize;
1667c5 ¤
ca6006 ¤   return( WCBWriteBTreeFile( wcb, fileInfo, startingNode * sectorsPerNode,
507a7b ¤   ¤   ¤   ¤   ¤   numNodesToWrute * sectorsPerNode, buffer ) );
4fefe6 }
85af5a
1f2473 ¤   static OSStatus
636d7d ValidateBTreeHeaderNode(
74cbd7 ¤   const BTreeHeaderNode¤  *header,
718363 ¤   PGPSize¤¤   ¤   ¤   ¤   bTreeFileSize)
5cbb36 {
56598c ¤   Require( header->descriptor.ndType == kBTreeHeaderNodeType )
4ea422 ¤   Require( header->record.bthFree < header->record.bthNNodes );
5bfcdd ¤   Require( ( header->record.bthNodeSize % 512L ) == 0 );
587f4d ¤   Require( header->record.bthNNodes * header->record.bthNodeSize ==
4f0332 ¤   ¤   ¤   ¤   ¤   bTreeFileSize );
37af5a
6483fd ¤   if( header->record.bthNRecs == 0 )
73c7a1 ¤   {
5a5c58 ¤   ¤   /* Verify as the header of an empty tree */
d7af5a
fecf9e ¤   ¤   Require( header->record.bthDepth == 0 );
f89a84 ¤   ¤   Require( header->record.bthRoot == 0 );
abbd0e ¤   ¤   Require( header->record.bthFNode == 0 );
08afb9 ¤   ¤   Require( header->record.bthLNode == 0 );
d0b101 ¤   ¤   Require( header->record.bthFree < header->record.bthNNodes );
051b52 ¤   ¤
b49371 ¤   }
2a0e24 ¤   else
fcc7a1 ¤   {
32af84 ¤   ¤   Require( header->record.bthDepth != 0 );
8aa08f ¤   ¤   Require( header->record.bthRoot > 0 &&
626e8f ¤   ¤   ¤   ¤   ¤   ¤   header->record.bthRoot < header->record.bthNNodes );
3318c9 ¤   ¤   Require( header->record.bthFNode > 0 &&
64b306 ¤   ¤   ¤   ¤   ¤   ¤   header->record.bthFNode < header->record.bthNNodes );
773efb ¤   ¤   Require( header->record.bthLNode > 0 &&
caa9a4 ¤   ¤   ¤   ¤   ¤   ¤   header->record.bthLNode < header->record.bthNNodes );
739371 ¤   }
8467c5 ¤
d879ad ¤   return( noErr );
f0efe6 }
01af5a
522473 ¤   static OSStatus
af4b3d WCBOpenBTreeFile(
cb49f8 ¤   WipeControlBlock ¤  *wcb,
dc42d9 ¤   short¤  ¤   ¤   ¤   fileRefNum,
1838b9 ¤   PGPUInt32¤  ¤   ¤   fileSize,
694c1d ¤   BTreeFileInfo¤  ¤   *fileInfo)
06bb36 {
aa6792 ¤   OSStatus¤   err = noErr;
fd67c5 ¤
f444f1 ¤   MacValidateParam( fileRefNum > 0 );
5d67c5 ¤
4264d7 ¤   pgpClearMemory( fileInfo, sizeof( *fileInfo ) );
dd67c5 ¤
5b8d96 ¤   fileInfo->fileRefNum ¤  = fileRefNum;
d6fa63 ¤   fileInfo->fileSize¤ ¤   = fileSize;
6267c5 ¤
70b442 ¤   err = GetDiskExtentsForFork( fileRefNum, &fileInfo->diskExtents,
eb76cf ¤   ¤   ¤   ¤   ¤   &fileInfo->numDiskExtents );
61ee03 ¤   if( IsntErr( err ) )
cac7a1 ¤   {
b7eb2f ¤   ¤   PGPUInt32¤  calcFileSize = 0;
fce348 ¤   ¤   PGPUInt32¤  extentIndex;
691b52 ¤   ¤
6f82a5 ¤   ¤   for( extentIndex = 0; extentIndex < fileInfo->numDiskExtents;
--c8d3 000dec291b440120251 Page 11 of pgpMacVolumeWiping.c
dd6352 ¤   ¤   ¤   ¤   ¤   ++extentIndex)
ba5b34 ¤   ¤   {
0a15d3 ¤   ¤   ¤   calcFileSize += fileInfo->diskExtents[extentIndex].numBlocks *
38a08f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDiskSectorSize;
3cda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
867aad ¤   ¤   ¤   /*
054b57 ¤   ¤   ¤   ** The extents already have the first sector bias added because
593a2d ¤   ¤   ¤   ** they were obtained using Lg2Phys. Compensate.
9e3da8 ¤   ¤   ¤   */
3487c7 ¤   ¤   ¤
2125df ¤   ¤   ¤   Require( fileInfo->diskExtents[extentIndex].diskBlockIndex >=
927e66 ¤   ¤   ¤   ¤   ¤   ¤   wcb->firstSectorBias );
b687c7 ¤   ¤   ¤
476eb5 ¤   ¤   ¤   fileInfo->diskExtents[extentIndex].diskBlockIndex -=
17e198 ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->firstSectorBias;¤
b10fe4 ¤   ¤   }
b81b52 ¤   ¤
a83dcd ¤   ¤   if( calcFileSize != fileSize )
675b34 ¤   ¤   {
514013 ¤   ¤   ¤   pgpDebugMsg(
251ec5 ¤   ¤   ¤   ¤   "WCBOpenBTreeFile(): Missing or extra extents" );
674b38 ¤   ¤   ¤   err = eofErr;
c30fe4 ¤   ¤   }
8b1b52 ¤   ¤
33da5e ¤   ¤   if( IsntErr( err ) )
945b34 ¤   ¤   {
c70015 ¤   ¤   ¤   err = WCBReadBTreeFile( wcb, fileInfo, 0, 1, wcb->ioBuffer );
826108 ¤   ¤   ¤   if( IsntErr( err ) )
a1f776 ¤   ¤   ¤   {
e14119 ¤   ¤   ¤   ¤   BTreeHeaderNode¤¤   header;
402b85 ¤   ¤   ¤   ¤
bc2cef ¤   ¤   ¤   ¤   header = *((BTreeHeaderNode *) wcb->ioBuffer);
58af5a
5a64f7 ¤   ¤   ¤   ¤   fileInfo->nodeSize ¤= (PGPUInt16) header.record.bthNodeSize;
f8fe0d ¤   ¤   ¤   ¤   fileInfo->numNodes ¤¤   = (PGPUInt16) header.record.bthNNodes;
68087c ¤   ¤   ¤   ¤   fileInfo->numFreeNodes¤ = (PGPUInt16) header.record.bthFree;
a9a9fe ¤   ¤   ¤   ¤   fileInfo->treeDepth¤¤   = header.record.bthDepth;
062b85 ¤   ¤   ¤   ¤
7fccae ¤   ¤   ¤   ¤   if( fileInfo->nodeSize < wcb->ioBufferSize )
d972c3 ¤   ¤   ¤   ¤   {
be8cbb ¤   ¤   ¤   ¤   ¤   err = ValidateBTreeHeaderNode( &header, fileSize );
822613 ¤   ¤   ¤   ¤   }
f9fa07 ¤   ¤   ¤   ¤   else
e772c3 ¤   ¤   ¤   ¤   {
c104a3 ¤   ¤   ¤   ¤   ¤   /* We need to have a buffer which holds one complete node */
1b7b29 ¤   ¤   ¤   ¤   ¤   err = memFullErr;
d72613 ¤   ¤   ¤   ¤   }
672b85 ¤   ¤   ¤   ¤
ff5c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
f972c3 ¤   ¤   ¤   ¤   {
0f1928 ¤   ¤   ¤   ¤   ¤   PGPSize¤allocationSize;
a5ae30 ¤   ¤   ¤   ¤   ¤
11d5f5 ¤   ¤   ¤   ¤   ¤   /* Allocate BTree bitmap and node buffers */
29ae30 ¤   ¤   ¤   ¤   ¤
448ce3 ¤   ¤   ¤   ¤   ¤   allocationSize = ( fileInfo->numNodes + 7 ) / 8;
beae30 ¤   ¤   ¤   ¤   ¤
d2b019 ¤   ¤   ¤   ¤   ¤   fileInfo->nodeBitmap = (PGPByte *) pgpAllocMac(
ac5ba5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   allocationSize,
7a0007 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMemoryAllocationFlags |
9581b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_ClearBytes);
8bae30 ¤   ¤   ¤   ¤   ¤
7d0b6d ¤   ¤   ¤   ¤   ¤   fileInfo->nodeBuffer = (PGPByte *) pgpAllocMac(
ffea8b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileInfo->nodeSize,
ddcec1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMemoryAllocationFlags );
17ae30 ¤   ¤   ¤   ¤   ¤
3f590f ¤   ¤   ¤   ¤   ¤   if( IsNull( fileInfo->nodeBitmap ) ||
979955 ¤   ¤   ¤   ¤   ¤   ¤   IsNull( fileInfo->nodeBuffer ) )
394859 ¤   ¤   ¤   ¤   ¤   {
9147c7 ¤   ¤   ¤   ¤   ¤   ¤   err = memFullErr;
c61c89 ¤   ¤   ¤   ¤   ¤   }
352613 ¤   ¤   ¤   ¤   }
de2b85 ¤   ¤   ¤   ¤
--5d93 0001bc2e83340120251 Page 12 of pgpMacVolumeWiping.c
8f5c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
7772c3 ¤   ¤   ¤   ¤   {
4ff7ad ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  remainingBytes;
b3c275 ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  nodeIndex;
e5c430 ¤   ¤   ¤   ¤   ¤   PGPByte¤¤   *curBitmapByte;
92ae30 ¤   ¤   ¤   ¤   ¤
adefd0 ¤   ¤   ¤   ¤   ¤   remainingBytes ¤= ( fileInfo->numNodes + 7 ) / 8;
24827f ¤   ¤   ¤   ¤   ¤   curBitmapByte ¤ = fileInfo->nodeBitmap;
347aa9 ¤   ¤   ¤   ¤   ¤   nodeIndex¤  ¤   = 0;
1fae30 ¤   ¤   ¤   ¤   ¤
5c4fe1 ¤   ¤   ¤   ¤   ¤   while( remainingBytes != 0 && IsntErr( err ) )
214859 ¤   ¤   ¤   ¤   ¤   {
63338a ¤   ¤   ¤   ¤   ¤   ¤   err = WCBReadBTreeNodes( wcb, fileInfo, nodeIndex,
d5b121 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   1, fileInfo->nodeBuffer );
c43df2 ¤   ¤   ¤   ¤   ¤   ¤   if( IsntErr( ·err ) )
7a8fec ¤   ¤   ¤   ¤   ¤   ¤   {
57ec5b ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   bytesToCopy;
bd2fbb ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   copyOffset;
459215 ¤   ¤   ¤   ¤   ¤   ¤   ¤   NodeDescriptor¤ *nodeDesc;
d2531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
a6552e ¤   ¤   ¤   ¤   ¤   ¤   ¤   /*
d00f14 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ** The B-Tree header node contains first map bits
6ca078 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ** at offset 0xF8. Additional map nodes contain
01823d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ** map bits at offset 0x0e. See IM Files for
27ab8c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ** details. Note that IM Files claims there are 494
984672 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ** bytes in a map node. This is incorrect.
3e122b ¤   ¤   ¤   ¤   ¤   ¤   ¤   */
59531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
4092f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( nodeIndex == 0 )
3406b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
0b5485 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   bytesToCopy = fileInfo->nodeSize - 256;
31edd9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   copyOffset¤ = 0xF8;
fd5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
54c4dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   else
9a06b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
2f99f3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   bytesToCopy = fileInfo->nodeSize - 20;
ff83a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   copyOffset¤ = 0x0E;
475268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
96531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
65b2b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( bytesToCopy > remainingBytes )
da29a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   bytesToCopy = remainingBytes;
bbda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
8c78a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpCopyMemory( &fileInfo->nodeBuffer[copyOffset],
832fd1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   curBitmapByte, bytesToCopy );
7fed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
8da8db ¤   ¤   ¤   ¤   ¤   ¤   ¤   remainingBytes ¤-= bytesToCopy;
2c0674 ¤   ¤   ¤   ¤   ¤   ¤   ¤   curBitmapByte¤  += bytesToCopy;
1f531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
e2de90 ¤   ¤   ¤   ¤   ¤   ¤   ¤   nodeDesc = (NodeDescriptor *) fileInfo->nodeBuffer;
4140d2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   nodeIndex = nodeDesc->ndFLink;
f8db3c ¤   ¤   ¤   ¤   ¤   ¤   }
c81c89 ¤   ¤   ¤   ¤   ¤   }
b7ae30 ¤   ¤   ¤   ¤   ¤
16598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
974859 ¤   ¤   ¤   ¤   ¤   {
623b24 ¤   ¤   ¤   ¤   ¤   ¤   PGPBitCount¤numFreeNodes;
fd94aa ¤   ¤   ¤   ¤   ¤   ¤
4a3444 ¤   ¤   ¤   ¤   ¤   ¤   /* Validate the bitmap count */
21c24f ¤   ¤   ¤   ¤   ¤   ¤   numFreeNodes = pgpCountClearBitsInRange(
8d4e85 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileInfo->nodeBitmap, 0,
c0c65b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   fileInfo->numNodes );
2cbdd6 ¤   ¤   ¤   ¤   ¤   ¤   if( numFreeNodes != fileInfo->numFreeNodes )
a08fec ¤   ¤   ¤   ¤   ¤   ¤   {
9bbd7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDebugMsg( "BTree node map inconsistent" );
a8ef1d ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
01db3c ¤   ¤   ¤   ¤   ¤   ¤   }
8d1c89 ¤   ¤   ¤   ¤   ¤   }
362613 ¤   ¤   ¤   ¤   }
fba3a6 ¤   ¤   ¤   }
d60fe4 ¤   ¤   }
c39371 ¤   }
1baf5a
--467a 000e7f7671540120251 Page 13 of pgpMacVolumeWiping.c
afdeb7 ¤   return( err );
b7efe6 }
35af5a
7b33c8 ¤   static void
a2aa5a WCBCloseBTreeFile(
52ebb3 ¤   const WipeControlBlock ¤*wcb,
2458ac ¤   BTreeFileInfo¤  ¤   ¤   *fileInfo)
e2bb36 {
bc5588 ¤   (void) wcb;
8f67c5 ¤
2a9f60 ¤   if( IsntNull( fileInfo->diskExtents) )
0292a4 ¤   ¤   FreeDiskExtentList( fileInfo->diskExtents );
8a87c7 ¤   ¤   ¤
d70d40 ¤   if( IsntNull( fileInfo->nodeBitmap ) )
2cf5a1 ¤   ¤   pgpFreeMac( fileInfo->nodeBitmap );
ebaf5a
ee1621 ¤   if( IsntNull( fileInfo->nodeBuffer) )
ac6aab ¤   ¤   pgpFreeMac( fileInfo->nodeBuffer );
c41b52 ¤   ¤
0364d7 ¤   pgpClearMemory( fileInfo, sizeof( *fileInfo ) );
5aefe6 }
70af5a
d61964 ¤   static PGPUInt32
36606c WCBBlockToSector(
68ebb3 ¤   const WipeControlBlock ¤*wcb,
8a3403 ¤   PGPUInt32¤  ¤   ¤   ¤   block)
eebb36 {
5b6f1c ¤   if( wcb->signature == kHFSSigWord )
99c7a1 ¤   {
1776e9 ¤   ¤   pgpAssert( block < wcb->numBlocks );
f21b52 ¤   ¤
f3ca23 ¤   ¤   return( ( block * wcb->numSectorsPerBlock ) + wcb->hfs.mdb.drAlBlSt );
e19371 ¤   }
6e45c9 ¤   else if( wcb->signature == kHFSPlusSigWord )
fac7a1 ¤   {
1d76e9 ¤   ¤   pgpAssert( block < wcb->numBlocks );
081b52 ¤   ¤
58708f ¤   ¤   return( block * wcb->numSectorsPerBlock );
2d9371 ¤   }
da0e24 ¤   else
25c7a1 ¤   {
219321 ¤   ¤   pgpDebugMsg( "\pWCBBlockToSector(): Unknown volume format" );
99c2a4 ¤   ¤   return( 0xFFFFFFFF );
499371 ¤   }
bcefe6 }
14af5a
e44582 #pragma mark [ --- Wipe Ranges --- ]
83af5a
db9cb9 #define¤kWipeRangeGrowQuantum¤  2000
bbaf5a
cd2473 ¤   static OSStatus
48fdef RememberWipeRange(
a4a0a0 ¤   WipeControlBlock¤   *wcb,
74b036 ¤   PGPUInt32¤  ¤   ¤   startSector,
c165f9 ¤   PGPUInt32¤  ¤   ¤   firstSectorOffset,
1119f9 ¤   PGPUInt32¤  ¤   ¤   numSectors)
e9bb36 {
166792 ¤   OSStatus¤   err = noErr;
1767c5 ¤
cc4778 ¤   pgpAssert( firstSectorOffset < kDiskSectorSize );
a2e12f ¤   pgpAssert( numSectors < (1L << 16) );
9767c5 ¤
81a0d0 ¤   if( wcb->numWipeRanges == wcb->numAllocatedWipeRanges )
a3c7a1 ¤   {
bc36df ¤   ¤   /* Grow/allocate the list */
4167c5 ¤
76d78f ¤   ¤   wcb->numAllocatedWipeRanges += kWipeRangeGrowQuantum;
751b52 ¤   ¤
95998b ¤   ¤   err = pgpReallocMac( &wcb->wipeRangeList, wcb->numAllocatedWipeRanges *
93cc1f ¤   ¤   ¤   ¤   ¤   sizeof( WipeRange ), kMemoryAllocationFlags );
4f9371 ¤   }
e7af5a
--7515 000231ef8ad40120251 Page 14 of pgpMacVolumeWiping.c
31ee03 ¤   if( IsntErr( err ) )
01c7a1 ¤   {
07e6ef ¤   ¤   WipeRange¤  *range;
6187c7 ¤   ¤   ¤
5d6e78 ¤   ¤   range = &wcb->wipeRangeList[wcb->numWipeRanges];
c11b52 ¤   ¤
39442c ¤   ¤   range->startSector ¤¤   ¤   = startSector;
08e1d5 ¤   ¤   range->firstSectorOffset ¤  = firstSectorOffset;
a1ecb9 ¤   ¤   range->numSectors ¤ ¤   ¤   = numSectors;
f11b52 ¤   ¤
75eeb6 ¤   ¤   ++wcb->numWipeRanges;
ed9371 ¤   }
be67c5 ¤
88deb7 ¤   return( err );
82efe6 }
b4af5a
a73f40 #define HeapSortName¤   SortWipeRanges
9b8aa4 #define HeapSortItem¤   WipeRange
2caf5a
1e684b #include "pgpHeapSort.h"
32af5a
8c22fd #undef HeapSortName
ccb7d5 #undef HeapSortItem
76af5a
9adf0d ¤   static int
5bdefd CompareWipeRanges(
f78081 ¤   WipeRange¤  *range1,
956fe5 ¤   WipeRange¤  *range2,
c56c6a ¤   void ¤  ¤   *userValue)
c6bb36 {
9b4d52 ¤   (void) userValue;
e867c5 ¤
ae4775 ¤   if( range1->startSector < range2->startSector )
4cc7a1 ¤   {
5f49fa ¤   ¤   return( -1 );
679371 ¤   }
dab19a ¤   else if( range1->startSector > range2->startSector )
cfc7a1 ¤   {
18a0ae ¤   ¤   return( 1 );
209371 ¤   }
ef0e24 ¤   else
4bc7a1 ¤   {
23a8f8 ¤   ¤   pgpDebugMsg( "CompareWipeRanges(): Overlaping wipe ranges" );
2c9371 ¤   }
1467c5 ¤
8eea61 ¤   return( 0 );
03efe6 }
0167c5 ¤
bd8039 #pragma mark [ --- Problem Forks --- ]
31af5a
0cc33d ¤   static ProblemForkInfo *
74a48d FindProblemForkInfo(
c8dfe4 ¤   const WipeControlBlock¤ *wcb,
447799 ¤   PGPUInt32¤  ¤   ¤   ¤   fileID,
e6d3ef ¤   ForkType¤   ¤   ¤   ¤   forkType)
bebb36 {
a6442a ¤   ProblemForkInfo¤*forkInfo = NULL;
9b67c5 ¤
ae3469 ¤   if( IsntNull( wcb->problemForkList ) )
64c7a1 ¤   {
9dd699 ¤   ¤   PGPUInt32¤  forkIndex;
7a1b52 ¤   ¤
47bd82 ¤   ¤   for( forkIndex = 0; forkIndex < wcb->numProblemForks; forkIndex++ )
ab5b34 ¤   ¤   {
1aaf16 ¤   ¤   ¤   if( wcb->problemForkList[forkIndex].fileID == fileID &&
48c2ed ¤   ¤   ¤   ¤   wcb->problemForkList[forkIndex].forkType == forkType )
65f776 ¤   ¤   ¤   {
213290 ¤   ¤   ¤   ¤   forkInfo = &wcb->problemForkList[forkIndex];
41f622 ¤   ¤   ¤   ¤   break;
8fa3a6 ¤   ¤   ¤   }
940fe4 ¤   ¤   }
239371 ¤   }
--8d3a 000dc7d752840120251 Page 15 of pgpMacVolumeWiping.c
2a67c5 ¤
cb8300 ¤   pgpAssert( IsntNull( forkInfo ) );
f667c5 ¤
84f748 ¤   return( forkInfo );
4cefe6 }
17af5a
232473 ¤   static OSStatus
86b831 RememberProblemForkExtents(
0ea52e ¤   ProblemForkInfo¤¤   *forkInfo,
2cb423 ¤   PGPUInt32¤  ¤   ¤   firstExtentBlock,
464328 ¤   const ExtentRecord¤ *extents)
05bb36 {
196418 ¤   ForkExtent¤ *extentInfo;
fe6792 ¤   OSStatus¤   err = noErr;
3667c5 ¤
2cdeb5 ¤   extentInfo = (ForkExtent *) pgpAllocMac( sizeof( *extentInfo ),
a3cec1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMemoryAllocationFlags );
b2eacf ¤   if( IsntNull( extentInfo ) )
1cc7a1 ¤   {
6fa6bc ¤   ¤   ForkExtent¤ *cur;
d06cf9 ¤   ¤   ForkExtent¤ *prev;
d687c7 ¤   ¤   ¤
049b0a ¤   ¤   extentInfo->firstExtentBlock ¤  = firstExtentBlock;
36832d ¤   ¤   extentInfo->extents¤¤   ¤   ¤   = *extents;
8fbe2e ¤   ¤   extentInfo->next¤   ¤   ¤   ¤   = NULL;
1b1b52 ¤   ¤
d51b17 ¤   ¤   /*
2b7473 ¤   ¤   ** Add the extent list record to the forkInfo in sorted
73c637 ¤   ¤   ** firstExtenBlock order.
c15c12 ¤   ¤   */
521b52 ¤   ¤
e3f00c ¤   ¤   cur ¤   = forkInfo->extentList;
c8350e ¤   ¤   prev¤   = NULL;
ed1b52 ¤   ¤
419cf9 ¤   ¤   while( IsntNull( cur ) )
465b34 ¤   ¤   {
217263 ¤   ¤   ¤   if( cur->firstExtentBlock > firstExtentBlock )
a8f776 ¤   ¤   ¤   {
40946b ¤   ¤   ¤   ¤   /* Insert at prev */
37f622 ¤   ¤   ¤   ¤   break;
eba3a6 ¤   ¤   ¤   }
e187c7 ¤   ¤   ¤
8bcbbb ¤   ¤   ¤   prev = cur;
3eb1dd ¤   ¤   ¤   cur ·= cur->next;
ab0fe4 ¤   ¤   }
911b52 ¤   ¤
ca7a16 ¤   ¤   if( IsntNull( prev ) )
c85b34 ¤   ¤   {
14f430 ¤   ¤   ¤   prev->next = extentInfo;
830fe4 ¤   ¤   }
c60e1d ¤   ¤   else
e95b34 ¤   ¤   {
e3868a ¤   ¤   ¤   forkInfo->extentList = extentInfo;
c30fe4 ¤   ¤   }
691b52 ¤   ¤
0e9995 ¤   ¤   extentInfo->next = cur;
0c9371 ¤   }
420e24 ¤   else
81c7a1 ¤   {
2e2a06 ¤   ¤   err = memFullErr;
8c9371 ¤   }
2faf5a
6adeb7 ¤   return( err );
a3efe6 }
a1af5a
b12473 ¤   static OSStatus
8cdbf5 RememberProblemFork(
3d49f8 ¤   WipeControlBlock ¤  *wcb,
cbd3d0 ¤   PGPUInt32¤  ¤   ¤   fileID,
de3120 ¤   ForkType¤   ¤   ¤   forkType,
3255b6 ¤   PGPUInt32¤  ¤   ¤   forkLogicalLength,
dc1a51 ¤   PGPUInt32¤  ¤   ¤   forkPhysicalLength,
--08fd 0005d8dc1ec40120251 Page 16 of pgpMacVolumeWiping.c
30dffb ¤   const ExtentRecord¤ *firstExtentRecord)
0abb36 {
db6792 ¤   OSStatus¤   err = noErr;
e33439 ¤   PGPUInt32¤  newDataSize;
7867c5 ¤
62527f ¤   newDataSize¤= (wcb->numProblemForks + 1) * sizeof( ProblemForkInfo );
5a67c5 ¤
9ac888 ¤   err = pgpReallocMac( &wcb->problemForkList, newDataSize,
e148c0 ¤   ¤   ¤   ¤   kMemoryAllocationFlags );
78ee03 ¤   if( IsntErr( err ) )
29c7a1 ¤   {
9be3e9 ¤   ¤   ProblemForkInfo¤*info;
beaf5a
7a7e4c ¤   ¤   info = &wcb->problemForkList[wcb->numProblemForks];
b41b52 ¤   ¤
e7fc2f ¤   ¤   info->fileID¤   ¤   ¤   ¤   = fileID;
4dc3c8 ¤   ¤   info->forkType¤ ¤   ¤   ¤   = forkType;
059905 ¤   ¤   info->forkLogicalLength¤¤   = forkLogicalLength;
776fd5 ¤   ¤   info->forkPhysicalLength¤   = forkPhysicalLength;
2f4cd3 ¤   ¤   info->extentList¤   ¤   ¤   = NULL;
feaf5a
9750f3 ¤   ¤   err = RememberProblemForkExtents( info, 0, firstExtentRecord );
ed1b52 ¤   ¤
9cf4f9 ¤   ¤   ++wcb->numProblemForks;
759371 ¤   }
4b67c5 ¤
3ddeb7 ¤   return( err );
97efe6 }
51af5a
032473 ¤   static OSStatus
c60ef6 ValidateHFSProblemForkList(WipeControlBlock *wcb)
b7bb36 {
a1c2b1 ¤   PGPUInt32¤  forkIndex;
2b6792 ¤   OSStatus¤   err = noErr;
cc67c5 ¤
0ad8af ¤   /*
87f750 ¤   ** Validate the integrity of the problem forks. We check to make sure
4a772b ¤   ** that all allocation blocks are accounted for and none overlap.
c29faa ¤   */
6667c5 ¤
c5a68b ¤   for( forkIndex = 0; forkIndex < wcb->numProblemForks; forkIndex++ )
11c7a1 ¤   {
bd488d ¤   ¤   ProblemForkInfo¤*forkInfo;
d88670 ¤   ¤   PGPUInt32¤  ¤   foundBlocks;
1a6534 ¤   ¤   ForkExtent¤ ¤   *curExtent;
a71b52 ¤   ¤
db55ca ¤   ¤   forkInfo ¤  = &wcb->problemForkList[forkIndex];
6d40f0 ¤   ¤   foundBlocks¤= 0;
c31b52 ¤   ¤
e3e338 ¤   ¤   curExtent = forkInfo->extentList;
d80f84 ¤   ¤   while( IsntNull( curExtent ) )
715b34 ¤   ¤   {
cbde20 ¤   ¤   ¤   PGPUInt32¤  extentIndex;
1587c7 ¤   ¤   ¤
5bd5c6 ¤   ¤   ¤   Require( curExtent->firstExtentBlock == foundBlocks );
6187c7 ¤   ¤   ¤
32294a ¤   ¤   ¤   for( extentIndex = 0; extentIndex < kHFSExtentDensity;
4b4a8a ¤   ¤   ¤   ¤   ¤   ¤   extentIndex++ )
99f776 ¤   ¤   ¤   {
cca3cf ¤   ¤   ¤   ¤   foundBlocks += curExtent->extents.hfs[extentIndex].blockCount;
83a3a6 ¤   ¤   ¤   }
5987c7 ¤   ¤   ¤
658513 ¤   ¤   ¤   curExtent = curExtent->next;
af0fe4 ¤   ¤   }
781b52 ¤   ¤
13ddf2 ¤   ¤   Require( forkInfo->forkPhysicalLength == foundBlocks *
27d91a ¤   ¤   ¤   ¤   ¤   wcb->blockSize );
199371 ¤   }
2aaf5a
53ef75 ¤   /* Compute the wiping range(s) for each of the forks in the list */
73af5a
5da68b ¤   for( forkIndex = 0; forkIndex < wcb->numProblemForks; forkIndex++ )
--d3ca 0003cb77cca40120251 Page 17 of pgpMacVolumeWiping.c
f7c7a1 ¤   {
2e488d ¤   ¤   ProblemForkInfo¤*forkInfo;
48482e ¤   ¤   PGPUInt32¤  ¤   remainingBytes;
216534 ¤   ¤   ForkExtent¤ ¤   *curExtent;
341b52 ¤   ¤
5c8fbc ¤   ¤   forkInfo¤   ¤   = &wcb->problemForkList[forkIndex];
2cce5b ¤   ¤   remainingBytes¤ = forkInfo->forkLogicalLength;
651b52 ¤   ¤
12e338 ¤   ¤   curExtent = forkInfo->extentList;
24ad2d ¤   ¤   while( IsntNull( curExtent ) &&
efebdf ¤   ¤   ¤   ¤   IsntErr( err ) )
7b5b34 ¤   ¤   {
8ede20 ¤   ¤   ¤   PGPUInt32¤  extentIndex;
a587c7 ¤   ¤   ¤
7e294a ¤   ¤   ¤   for( extentIndex = 0; extentIndex < kHFSExtentDensity;
ef4a8a ¤   ¤   ¤   ¤   ¤   ¤   extentIndex++ )
44f776 ¤   ¤   ¤   {
8634f8 ¤   ¤   ¤   ¤   HFSExtentDescriptor¤*desc;
356d4a ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   startSector¤¤   ¤   = 0;
48f91f ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   firstSectorOffset ¤ = 0;
1839a4 ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   numSectors ¤¤   ¤   = 0;
232b85 ¤   ¤   ¤   ¤
22d185 ¤   ¤   ¤   ¤   desc = &curExtent->extents.hfs[extentIndex];
fc2b85 ¤   ¤   ¤   ¤
c5f5b6 ¤   ¤   ¤   ¤   if( remainingBytes != 0 )
4f72c3 ¤   ¤   ¤   ¤   {
195a58 ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  descBytes;
43ae30 ¤   ¤   ¤   ¤   ¤
99530e ¤   ¤   ¤   ¤   ¤   Require( desc->blockCount != 0 );
c0ae30 ¤   ¤   ¤   ¤   ¤
18ae4f ¤   ¤   ¤   ¤   ¤   descBytes = (PGPUInt32) desc->blockCount *
b5cad1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->blockSize;
6d4336 ¤   ¤   ¤   ¤   ¤   if( descBytes <= remainingBytes )
c94859 ¤   ¤   ¤   ¤   ¤   {
136fcf ¤   ¤   ¤   ¤   ¤   ¤   /* All bytes in this range are in use */
c494aa ¤   ¤   ¤   ¤   ¤   ¤
d5986f ¤   ¤   ¤   ¤   ¤   ¤   remainingBytes -= descBytes;
9d1c89 ¤   ¤   ¤   ¤   ¤   }
ac4bd6 ¤   ¤   ¤   ¤   ¤   else
704859 ¤   ¤   ¤   ¤   ¤   {
7fcaf2 ¤   ¤   ¤   ¤   ¤   ¤   /* The logical eof is in this extent descriptor */
882b85 ¤   ¤   ¤   ¤
0894d1 ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  usedSectors;
2994aa ¤   ¤   ¤   ¤   ¤   ¤
5c54ea ¤   ¤   ¤   ¤   ¤   ¤   startSector¤= WCBBlockToSector( wcb, desc->startBlock );
d8c414 ¤   ¤   ¤   ¤   ¤   ¤   numSectors¤ = (PGPUInt32) desc->blockCount *
3b7828 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsPerBlock;
a28dd2 ¤   ¤   ¤   ¤   ¤   ¤   usedSectors¤= remainingBytes / kDiskSectorSize;
a294aa ¤   ¤   ¤   ¤   ¤   ¤
a85c90 ¤   ¤   ¤   ¤   ¤   ¤   startSector ¤   ¤   += usedSectors;
b50c79 ¤   ¤   ¤   ¤   ¤   ¤   numSectors¤ ¤   ¤   -= usedSectors;
ddef6c ¤   ¤   ¤   ¤   ¤   ¤   firstSectorOffset¤  = remainingBytes % kDiskSectorSize;
83ae30 ¤   ¤   ¤   ¤   ¤
cf046a ¤   ¤   ¤   ¤   ¤   ¤   remainingBytes = 0;
641c89 ¤   ¤   ¤   ¤   ¤   }
b62613 ¤   ¤   ¤   ¤   }
37c8c4 ¤   ¤   ¤   ¤   else if( desc->blockCount != 0 )
1672c3 ¤   ¤   ¤   ¤   {
e1a3e7 ¤   ¤   ¤   ¤   ¤   /*
fbf73c ¤   ¤   ¤   ¤   ¤   ** Entire extent descriptor is in free space. Wipe
dc1166 ¤   ¤   ¤   ¤   ¤   ** the whole thing
a3e4e2 ¤   ¤   ¤   ¤   ¤   */
41ae30 ¤   ¤   ¤   ¤   ¤
5fdc54 ¤   ¤   ¤   ¤   ¤   startSector ¤   ¤   = WCBBlockToSector( wcb,
c4cf2c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   desc->startBlock );
87c97f ¤   ¤   ¤   ¤   ¤   firstSectorOffset ¤ = 0;
2cf6d3 ¤   ¤   ¤   ¤   ¤   numSectors¤ ¤   ¤   = (PGPUInt32) desc->blockCount *·
b17f5e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsPerBlock;
8f2613 ¤   ¤   ¤   ¤   }
0bfa07 ¤   ¤   ¤   ¤   else
b772c3 ¤   ¤   ¤   ¤   {
3c0aeb ¤   ¤   ¤   ¤   ¤   /* All remaining descriptors should have no counts */
--afa3 0003eb8679040120251 Page 18 of pgpMacVolumeWiping.c
d6ae30 ¤   ¤   ¤   ¤   ¤
d014c3 ¤   ¤   ¤   ¤   ¤   break;
c02613 ¤   ¤   ¤   ¤   }
b62b85 ¤   ¤   ¤   ¤
691b2d ¤   ¤   ¤   ¤   if( numSectors != 0 )
c272c3 ¤   ¤   ¤   ¤   {
f78793 ¤   ¤   ¤   ¤   ¤   err = RememberWipeRange( wcb, startSector,
2b0fc0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   firstSectorOffset, numSectors );
13ae30 ¤   ¤   ¤   ¤   ¤
ee7f66 ¤   ¤   ¤   ¤   ¤   wcb->numSectorsToWipe += numSectors;
c9ae30 ¤   ¤   ¤   ¤   ¤
b1da4b ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
234859 ¤   ¤   ¤   ¤   ¤   {
9500eb ¤   ¤   ¤   ¤   ¤   ¤   break;
921c89 ¤   ¤   ¤   ¤   ¤   }
cc2613 ¤   ¤   ¤   ¤   }
41a3a6 ¤   ¤   ¤   }
b787c7 ¤   ¤   ¤
eb8513 ¤   ¤   ¤   curExtent = curExtent->next;
7f0fe4 ¤   ¤   }
849371 ¤   }
831b52 ¤   ¤
d8deb7 ¤   return( err );
e2efe6 }
14af5a
e32473 ¤   static OSStatus
77df8b ValidateHFSPlusProblemForkList(WipeControlBlock *wcb)
22bb36 {
61c2b1 ¤   PGPUInt32¤  forkIndex;
596792 ¤   OSStatus¤   err = noErr;
0767c5 ¤
1ad8af ¤   /*
2cf750 ¤   ** Validate the integrity of the problem forks. We check to make sure
52772b ¤   ** that all allocation blocks are accounted for and none overlap.
de9faa ¤   */
b467c5 ¤
a4a68b ¤   for( forkIndex = 0; forkIndex < wcb->numProblemForks; forkIndex++ )
c4c7a1 ¤   {
25488d ¤   ¤   ProblemForkInfo¤*forkInfo;
228670 ¤   ¤   PGPUInt32¤  ¤   foundBlocks;
2e6534 ¤   ¤   ForkExtent¤ ¤   *curExtent;
a61b52 ¤   ¤
2655ca ¤   ¤   forkInfo ¤  = &wcb->problemForkList[forkIndex];
f140f0 ¤   ¤   foundBlocks¤= 0;
651b52 ¤   ¤
6be338 ¤   ¤   curExtent = forkInfo->extentList;
ed0f84 ¤   ¤   while( IsntNull( curExtent ) )
c95b34 ¤   ¤   {
adde20 ¤   ¤   ¤   PGPUInt32¤  extentIndex;
2687c7 ¤   ¤   ¤
b5d5c6 ¤   ¤   ¤   Require( curExtent->firstExtentBlock == foundBlocks );
7587c7 ¤   ¤   ¤
1e9030 ¤   ¤   ¤   for( extentIndex = 0; extentIndex < kHFSPlusExtentDensity;
464a8a ¤   ¤   ¤   ¤   ¤   ¤   extentIndex++ )
f9f776 ¤   ¤   ¤   {
c10b09 ¤   ¤   ¤   ¤   foundBlocks +=·
b8efae ¤   ¤   ¤   ¤   ¤   curExtent->extents.hfsPlus[extentIndex].blockCount;
c3a3a6 ¤   ¤   ¤   }
3d87c7 ¤   ¤   ¤
7d8513 ¤   ¤   ¤   curExtent = curExtent->next;
960fe4 ¤   ¤   }
e31b52 ¤   ¤
97ddf2 ¤   ¤   Require( forkInfo->forkPhysicalLength == foundBlocks *
d9d91a ¤   ¤   ¤   ¤   ¤   wcb->blockSize );
c89371 ¤   }
19af5a
beef75 ¤   /* Compute the wiping range(s) for each of the forks in the list */
5daf5a
dfa68b ¤   for( forkIndex = 0; forkIndex < wcb->numProblemForks; forkIndex++ )
39c7a1 ¤   {
99488d ¤   ¤   ProblemForkInfo¤*forkInfo;
3e482e ¤   ¤   PGPUInt32¤  ¤   remainingBytes;
--c95b 000c202915540120251 Page 19 of pgpMacVolumeWiping.c
bc6534 ¤   ¤   ForkExtent¤ ¤   *curExtent;
6f1b52 ¤   ¤
498fbc ¤   ¤   forkInfo¤   ¤   = &wcb->problemForkList[forkIndex];
a7ce5b ¤   ¤   remainingBytes¤ = forkInfo->forkLogicalLength;
411b52 ¤   ¤
32e338 ¤   ¤   curExtent = forkInfo->extentList;
a5ad2d ¤   ¤   while( IsntNull( curExtent ) &&
f7ebdf ¤   ¤   ¤   ¤   IsntErr( err ) )
775b34 ¤   ¤   {
f4de20 ¤   ¤   ¤   PGPUInt32¤  extentIndex;
4987c7 ¤   ¤   ¤
dc9030 ¤   ¤   ¤   for( extentIndex = 0; extentIndex < kHFSPlusExtentDensity;
0b4a8a ¤   ¤   ¤   ¤   ¤   ¤   extentIndex++ )
a0f776 ¤   ¤   ¤   {
a54c1f ¤   ¤   ¤   ¤   HFSPlusExtentDescriptor¤*desc;
1a10fd ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   ¤   startSector¤¤   ¤   = 0;
5084a8 ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   ¤   firstSectorOffset ¤ = 0;
774413 ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   ¤   ¤   numSectors ¤¤   ¤   = 0;
382b85 ¤   ¤   ¤   ¤
c64afa ¤   ¤   ¤   ¤   desc = &curExtent->extents.hfsPlus[extentIndex];
972b85 ¤   ¤   ¤   ¤
2df5b6 ¤   ¤   ¤   ¤   if( remainingBytes != 0 )
5072c3 ¤   ¤   ¤   ¤   {
495a58 ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  descBytes;
f8ae30 ¤   ¤   ¤   ¤   ¤
60530e ¤   ¤   ¤   ¤   ¤   Require( desc->blockCount != 0 );
60ae30 ¤   ¤   ¤   ¤   ¤
82dcd0 ¤   ¤   ¤   ¤   ¤   descBytes = desc->blockCount * wcb->blockSize;
be4336 ¤   ¤   ¤   ¤   ¤   if( descBytes <= remainingBytes )
1d4859 ¤   ¤   ¤   ¤   ¤   {
7c6fcf ¤   ¤   ¤   ¤   ¤   ¤   /* All bytes in this range are in use */
fb94aa ¤   ¤   ¤   ¤   ¤   ¤
34986f ¤   ¤   ¤   ¤   ¤   ¤   remainingBytes -= descBytes;
1f1c89 ¤   ¤   ¤   ¤   ¤   }
8c4bd6 ¤   ¤   ¤   ¤   ¤   else
204859 ¤   ¤   ¤   ¤   ¤   {
66caf2 ¤   ¤   ¤   ¤   ¤   ¤   /* The logical eof is in this extent descriptor */
1b2b85 ¤   ¤   ¤   ¤
c894d1 ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  usedSectors;
5594aa ¤   ¤   ¤   ¤   ¤   ¤
d854ea ¤   ¤   ¤   ¤   ¤   ¤   startSector¤= WCBBlockToSector( wcb, desc->startBlock );
f27340 ¤   ¤   ¤   ¤   ¤   ¤   numSectors¤ = desc->blockCount *
dc7828 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsPerBlock;
ea8dd2 ¤   ¤   ¤   ¤   ¤   ¤   usedSectors¤= remainingBytes / kDiskSectorSize;
9794aa ¤   ¤   ¤   ¤   ¤   ¤
185c90 ¤   ¤   ¤   ¤   ¤   ¤   startSector ¤   ¤   += usedSectors;
bd0c79 ¤   ¤   ¤   ¤   ¤   ¤   numSectors¤ ¤   ¤   -= usedSectors;
d9ef6c ¤   ¤   ¤   ¤   ¤   ¤   firstSectorOffset¤  = remainingBytes % kDiskSectorSize;
09ae30 ¤   ¤   ¤   ¤   ¤
58046a ¤   ¤   ¤   ¤   ¤   ¤   remainingBytes = 0;
481c89 ¤   ¤   ¤   ¤   ¤   }
982613 ¤   ¤   ¤   ¤   }
bbc8c4 ¤   ¤   ¤   ¤   else if( desc->blockCount != 0 )
8972c3 ¤   ¤   ¤   ¤   {
b7a3e7 ¤   ¤   ¤   ¤   ¤   /*
5cf73c ¤   ¤   ¤   ¤   ¤   ** Entire extent descriptor is in free space. Wipe
571166 ¤   ¤   ¤   ¤   ¤   ** the whole thing
d4e4e2 ¤   ¤   ¤   ¤   ¤   */
46ae30 ¤   ¤   ¤   ¤   ¤
0fdc54 ¤   ¤   ¤   ¤   ¤   startSector ¤   ¤   = WCBBlockToSector( wcb,
c2cf2c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   desc->startBlock );
dcc97f ¤   ¤   ¤   ¤   ¤   firstSectorOffset ¤ = 0;
8348fc ¤   ¤   ¤   ¤   ¤   numSectors¤ ¤   ¤   = desc->blockCount *·
fe7f5e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsPerBlock;
772613 ¤   ¤   ¤   ¤   }
d2fa07 ¤   ¤   ¤   ¤   else
6a72c3 ¤   ¤   ¤   ¤   {
cf0aeb ¤   ¤   ¤   ¤   ¤   /* All remaining descriptors should have no counts */
67ae30 ¤   ¤   ¤   ¤   ¤
9114c3 ¤   ¤   ¤   ¤   ¤   break;
912613 ¤   ¤   ¤   ¤   }
c22b85 ¤   ¤   ¤   ¤
--8d5f 0009a4405c440120251 Page 20 of pgpMacVolumeWiping.c
401b2d ¤   ¤   ¤   ¤   if( numSectors != 0 )
a072c3 ¤   ¤   ¤   ¤   {
c38793 ¤   ¤   ¤   ¤   ¤   err = RememberWipeRange( wcb, startSector,
f00fc0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   firstSectorOffset, numSectors );
0eae30 ¤   ¤   ¤   ¤   ¤
777f66 ¤   ¤   ¤   ¤   ¤   wcb->numSectorsToWipe += numSectors;
9aae30 ¤   ¤   ¤   ¤   ¤
20da4b ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
054859 ¤   ¤   ¤   ¤   ¤   {
7800eb ¤   ¤   ¤   ¤   ¤   ¤   break;
871c89 ¤   ¤   ¤   ¤   ¤   }
902613 ¤   ¤   ¤   ¤   }
d2a3a6 ¤   ¤   ¤   }
9287c7 ¤   ¤   ¤
988513 ¤   ¤   ¤   curExtent = curExtent->next;
0f0fe4 ¤   ¤   }
309371 ¤   }
031b52 ¤   ¤
69deb7 ¤   return( err );
d1efe6 }
aeaf5a
8e2473 ¤   static OSStatus
447651 ValidateProblemForkList(WipeControlBlock *wcb)
78bb36 {
c66792 ¤   OSStatus¤   err = noErr;
5b67c5 ¤
566f1c ¤   if( wcb->signature == kHFSSigWord )
cac7a1 ¤   {
f2b4a5 ¤   ¤   err = ValidateHFSProblemForkList( wcb );
189371 ¤   }
9845c9 ¤   else if( wcb->signature == kHFSPlusSigWord )
7dc7a1 ¤   {
09eba6 ¤   ¤   err = ValidateHFSPlusProblemForkList( wcb );
8c9371 ¤   }
a70e24 ¤   else
bbc7a1 ¤   {
99b445 ¤   ¤   pgpDebugMsg( "\pValidateProblemForkList(): Unknown volume format" );
839b60 ¤   ¤   err = kWipingError_UnsupportedVolumeFormat;
bf9371 ¤   }
3167c5 ¤
c1deb7 ¤   return( err );
49efe6 }
60af5a
6b0164 #pragma mark [ --- HFS Scanning --- ]
81af5a
542473 ¤   static OSStatus
3af5b3 ScanHFSExtentRecord(
85ebb3 ¤   const WipeControlBlock ¤*wcb,
1c7a95 ¤   const HFSExtentRecord¤  record,
a7d312 ¤   PGPUInt32¤  ¤   ¤   ¤   *foundForkBlocks)
c8bb36 {
46581e ¤   PGPUInt32¤  extentIndex;
fc67c5 ¤
c0d72b ¤   *foundForkBlocks = 0;
7667c5 ¤
51268f ¤   for( extentIndex = 0; extentIndex < kHFSExtentDensity; extentIndex++)
3cc7a1 ¤   {
92f0da ¤   ¤   const HFSExtentDescriptor¤  *extent = &record[extentIndex];
562204 ¤   ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   overlappingBlockCount;
ca1b52 ¤   ¤
e3151e ¤   ¤   if( extent->blockCount != 0 )
895b34 ¤   ¤   {
2f29e5 ¤   ¤   ¤   Require( (PGPUInt32) extent->startBlock +
453366 ¤   ¤   ¤   ¤   ¤   ¤   (PGPUInt32) extent->blockCount <=
9c4920 ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numBlocks );
3d87c7 ¤   ¤   ¤
4e3e42 ¤   ¤   ¤   *foundForkBlocks += extent->blockCount;
ad87c7 ¤   ¤   ¤
30c23a ¤   ¤   ¤   overlappingBlockCount = pgpCountAndSetBitRange(
b7714f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->volumeBitmap,
090f65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   extent->startBlock,
9a9c0f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   extent->blockCount );
--2e00 0002297323840120251 Page 21 of pgpMacVolumeWiping.c
b9f808 ¤   ¤   ¤   Require( overlappingBlockCount == 0 );
1e0fe4 ¤   ¤   }
0f9371 ¤   }
6167c5 ¤
5379ad ¤   return( noErr );
f8efe6 }
2faf5a
f62473 ¤   static OSStatus
0c633a ScanHFSFileFork(
9e9c77 ¤   WipeControlBlock ¤  ¤   *wcb,
9d7799 ¤   PGPUInt32¤  ¤   ¤   ¤   fileID,
c7ad57 ¤   ForkType¤   ¤   ¤   ¤   forkType,
b3d9d4 ¤   const HFSExtentRecord¤  extentRecord,
14cf57 ¤   PGPUInt32¤  ¤   ¤   ¤   forkLogicalLength,
d992f4 ¤   PGPUInt32¤  ¤   ¤   ¤   forkPhysicalLength)
ddbb36 {
1d6792 ¤   OSStatus¤   err = noErr;
983119 ¤   PGPInt32¤   extentIndex;
f967c5 ¤
3654c8 ¤   Require( forkLogicalLength <= forkPhysicalLength );
6344e1 ¤   Require( ( forkPhysicalLength % wcb->blockSize ) == 0 );
d5af5a
d40b0c ¤   if( forkPhysicalLength != 0 )
90c7a1 ¤   {
561992 ¤   ¤   PGPUInt32¤  foundForkBlocks;
67af5a
44fed9 ¤   ¤   err = ScanHFSExtentRecord( wcb, extentRecord, &foundForkBlocks );
bdda5e ¤   ¤   if( IsntErr( err ) )
085b34 ¤   ¤   {
a8ce26 ¤   ¤   ¤   PGPUInt32¤  totalForkBlocks;
3faf5a
7d7cfe ¤   ¤   ¤   totalForkBlocks = forkPhysicalLength / wcb->blockSize;
d5af5a
4935a7 ¤   ¤   ¤   if( foundForkBlocks == totalForkBlocks )
d5f776 ¤   ¤   ¤   {
36980e ¤   ¤   ¤   ¤   /*
83b9be ¤   ¤   ¤   ¤   ** Simplest case. All of the files allocation blocks are
c78279 ¤   ¤   ¤   ¤   ** accounted for in the catalog. We now check to see if
0819c1 ¤   ¤   ¤   ¤   ** the file's logical EOF is in the last allocation block of
703164 ¤   ¤   ¤   ¤   ** the file. If so, we remember the remainder of the last
3c3b73 ¤   ¤   ¤   ¤   ** allocation block for wiping later
46df0b ¤   ¤   ¤   ¤   */
e02b85 ¤   ¤   ¤   ¤
aaf664 ¤   ¤   ¤   ¤   if( forkPhysicalLength - forkLogicalLength <
63cc7a ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->blockSize )
9772c3 ¤   ¤   ¤   ¤   {
2a730c ¤   ¤   ¤   ¤   ¤   if( forkPhysicalLength != forkLogicalLength )
f04859 ¤   ¤   ¤   ¤   ¤   {
ee4106 ¤   ¤   ¤   ¤   ¤   ¤   /*
bc27d9 ¤   ¤   ¤   ¤   ¤   ¤   ** Get the last allocation block and remember
9be67f ¤   ¤   ¤   ¤   ¤   ¤   ** the range.
5f0603 ¤   ¤   ¤   ¤   ¤   ¤   */
3bae30 ¤   ¤   ¤   ¤   ¤
ec14c7 ¤   ¤   ¤   ¤   ¤   ¤   for( extentIndex = kHFSExtentDensity - 1;
154e39 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   extentIndex >= 0; --extentIndex )
4e8fec ¤   ¤   ¤   ¤   ¤   ¤   {
aa8b31 ¤   ¤   ¤   ¤   ¤   ¤   ¤   HFSExtentDescriptor¤desc;
86531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
012449 ¤   ¤   ¤   ¤   ¤   ¤   ¤   desc = extentRecord[extentIndex];
03531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
0ee048 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( desc.blockCount != 0 )
2906b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
c76443 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  lastBlock;
a2db84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  usedBytes;
f05a4a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  startSector;
952a12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  skipSectors;
e1e6c3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  byteOffset;
a7c1db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  numSectors;
9ada4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
25adb6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lastBlock ¤ = desc.startBlock +
683670 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   desc.blockCount - 1;
22c02f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   usedBytes¤  = wcb->blockSize - (
--ec56 0004ac57f4340120251 Page 22 of pgpMacVolumeWiping.c
6eded7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   forkPhysicalLength -
7e13d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   forkLogicalLength );
1a6f06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   skipSectors¤= usedBytes / kDiskSectorSize;
325a04 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   byteOffset¤ = usedBytes % kDiskSectorSize;
7b1fcd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numSectors¤ = wcb->numSectorsPerBlock -
b84e97 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   skipSectors;
37da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
addb8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   startSector¤= WCBBlockToSector( wcb,
8ae53b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lastBlock );
f4c8bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   startSector¤+= skipSectors;
d5da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
06ebc9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = RememberWipeRange( wcb, startSector,·
78fa34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   byteOffset, numSectors );
6eda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
6909bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsToWipe += numSectors;
a9ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
1bcd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
8f5268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
2cdb3c ¤   ¤   ¤   ¤   ¤   ¤   }
871c89 ¤   ¤   ¤   ¤   ¤   }
c34bd6 ¤   ¤   ¤   ¤   ¤   else
174859 ¤   ¤   ¤   ¤   ¤   {
c34106 ¤   ¤   ¤   ¤   ¤   ¤   /*
a4148a ¤   ¤   ¤   ¤   ¤   ¤   ** Fork uses all of the allocation block.
bbff86 ¤   ¤   ¤   ¤   ¤   ¤   ** No wiping needed
650603 ¤   ¤   ¤   ¤   ¤   ¤   */
2f1c89 ¤   ¤   ¤   ¤   ¤   }
262613 ¤   ¤   ¤   ¤   }
edfa07 ¤   ¤   ¤   ¤   else
f172c3 ¤   ¤   ¤   ¤   {
11a3e7 ¤   ¤   ¤   ¤   ¤   /*
f68588 ¤   ¤   ¤   ¤   ¤   ** This is a problem file. The logical EOF is more than one
6b911f ¤   ¤   ¤   ¤   ¤   ** allocation block from the physical EOF. Add it to our
a4c6ea ¤   ¤   ¤   ¤   ¤   ** problem file list
69e4e2 ¤   ¤   ¤   ¤   ¤   */
84ae30 ¤   ¤   ¤   ¤   ¤
982804 ¤   ¤   ¤   ¤   ¤   err = RememberProblemFork( wcb, fileID, forkType,
a29c22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   forkLogicalLength, forkPhysicalLength,
5213d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (ExtentRecord *) extentRecord );
ef2613 ¤   ¤   ¤   ¤   }
eba3a6 ¤   ¤   ¤   }
259b74 ¤   ¤   ¤   else if( foundForkBlocks < totalForkBlocks )
c7f776 ¤   ¤   ¤   {
35980e ¤   ¤   ¤   ¤   /*
cbe1d7 ¤   ¤   ¤   ¤   ** Not all of the allocation blocks are in the catalog.
053aa2 ¤   ¤   ¤   ¤   ** Remember this file for later analysis when we scan
7d1f57 ¤   ¤   ¤   ¤   ** the extents file.
51df0b ¤   ¤   ¤   ¤   */
8c2b85 ¤   ¤   ¤   ¤
443d27 ¤   ¤   ¤   ¤   err = RememberProblemFork( wcb, fileID, forkType,
859c22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   forkLogicalLength, forkPhysicalLength,
7813d0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (ExtentRecord *) extentRecord );
f2a3a6 ¤   ¤   ¤   }
b7bb8c ¤   ¤   ¤   else
d3f776 ¤   ¤   ¤   {
2d9a47 ¤   ¤   ¤   ¤   /* Too many blocks. Damaged. */
b9a1c6 ¤   ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
54a3a6 ¤   ¤   ¤   }
f60fe4 ¤   ¤   }
8c9371 ¤   }
d40e24 ¤   else
35c7a1 ¤   {
54abe1 ¤   ¤   for( extentIndex = 0; extentIndex < kHFSExtentDensity; extentIndex++ )
185b34 ¤   ¤   {
490d1b ¤   ¤   ¤   const HFSExtentDescriptor¤  *extent = &extentRecord[extentIndex];
31af5a
8fdd1a ¤   ¤   ¤   Require( extent->startBlock == 0 );
84527b ¤   ¤   ¤   Require( extent->blockCount == 0 );
e90fe4 ¤   ¤   }
bf9371 ¤   }
f467c5 ¤
4adeb7 ¤   return( err );
--1ba7 000efbb00c840120251 Page 23 of pgpMacVolumeWiping.c
7aefe6 }
46af5a
2d2473 ¤   static OSStatus
1bc8c1 ScanHFSCatalogFileRecord(
379c77 ¤   WipeControlBlock ¤  ¤   *wcb,
8e2e08 ¤   const HFSCatalogFile¤   *file)
bdcebb {¤
3a6792 ¤   OSStatus¤   err = noErr;
6e67c5 ¤
a8d818 ¤   Require( file->recordType == kHFSFileRecord );
902c45 ¤   Require( file->fileID < wcb->hfs.mdb.drNxtCNID );
44af5a
c6d8af ¤   /*
496e65 ¤   ** Validate that we do not have too many extents and mark the used
e70746 ¤   ** extents in our volume bitmap.
2a9faa ¤   */
3767c5 ¤
39627e ¤   err = ScanHFSFileFork( wcb, file->fileID, kDataForkType, file->dataExtents,
5d9f55 ¤   ¤   ¤   ¤   file->dataLogicalSize, file->dataPhysicalSize );
b7ee03 ¤   if( IsntErr( err ) )
20c7a1 ¤   {
63f227 ¤   ¤   err = ScanHFSFileFork( wcb, file->fileID, kResourceForkType,
3aedc0 ¤   ¤   ¤   ¤   ¤   file->rsrcExtents, file->rsrcLogicalSize,
7d5494 ¤   ¤   ¤   ¤   ¤   file->rsrcPhysicalSize );
9c9371 ¤   }
081b52 ¤   ¤
78deb7 ¤   return( err );
9defe6 }
5caf5a
d82473 ¤   static OSStatus
02bda1 ScanHFSCatalogFileLeafNode(
599c77 ¤   WipeControlBlock ¤  ¤   *wcb,
707102 ¤   const NodeDescriptor ¤  *nodeDesc)
bebb36 {
fd7ad4 ¤   PGPUInt16¤  *recordOffsetPtr;
6d819d ¤   PGPUInt32¤  recordIndex;
4067c5 ¤
f143be ¤   Require( nodeDesc->ndType == kBTreeLeafNodeType );
59b2e9 ¤   Require( nodeDesc->ndNHeight == 1 );
f0806c ¤   Require( nodeDesc->ndNRecs != 0 );
a0af5a
e25e08 ¤   recordOffsetPtr = (PGPUInt16 *) ((PGPByte *) nodeDesc +
793d9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->catalogFileInfo.nodeSize - 2 );
5767c5 ¤
110a9a ¤   for( recordIndex = 0; recordIndex < nodeDesc->ndNRecs; recordIndex++ )
ddc7a1 ¤   {
c71627 ¤   ¤   HFSCatalogKey¤  ¤   *key;
a1a852 ¤   ¤   PGPUInt32¤  ¤   ¤   dataOffset;
f90c71 ¤   ¤   HFSCatalogRecord¤   *data;
de1b52 ¤   ¤
9fbb16 ¤   ¤   key = (HFSCatalogKey *) ((PGPByte *) nodeDesc + *recordOffsetPtr);
f91b52 ¤   ¤
66d350 ¤   ¤   Require( key->parentID < wcb->hfs.mdb.drNxtCNID );
f43e07 ¤   ¤   Require( key->nodeName[0] <= kHFSMaxFileNameChars );
2a1114 ¤   ¤   Require( key->keyLength >= kHFSCatalogKeyMinimumLength );
f1f863 ¤   ¤   Require( key->keyLength <= kHFSCatalogKeyMaximumLength );
5667c5 ¤
c303f5 ¤   ¤   /* Data is padded to an even boundary */
4500bf ¤   ¤   dataOffset = key->keyLength + 1;
8562e6 ¤   ¤   if( ( dataOffset & 1 ) != 0 )
a8b17d ¤   ¤   ¤   ++dataOffset;
4e87c7 ¤   ¤   ¤
bb6c25 ¤   ¤   data = (HFSCatalogRecord *) ( (PGPByte *) key + dataOffset );
8cc62c ¤   ¤   switch( data->type )
755b34 ¤   ¤   {
0a59ce ¤   ¤   ¤   OSStatus¤   err;
9687c7 ¤   ¤   ¤
50c176 ¤   ¤   ¤   case kHFSFileRecord:
c9836a ¤   ¤   ¤   ¤   err = ScanHFSCatalogFileRecord( wcb, &data->file );
ae9bb8 ¤   ¤   ¤   ¤   if( IsErr( err ) )
2e9fe8 ¤   ¤   ¤   ¤   ¤   return( err );
eff622 ¤   ¤   ¤   ¤   break;
--af9c 0008c6bc22240120251 Page 24 of pgpMacVolumeWiping.c
9f2b85 ¤   ¤   ¤   ¤
d2112c ¤   ¤   ¤   case kHFSFolderRecord:
cd9043 ¤   ¤   ¤   ¤   Require( data->folder.folderID < wcb->hfs.mdb.drNxtCNID );
e9f622 ¤   ¤   ¤   ¤   break;
8c2b85 ¤   ¤   ¤   ¤
c6f86a ¤   ¤   ¤   case kHFSFolderThreadRecord:
766e32 ¤   ¤   ¤   case kHFSFileThreadRecord:
683bd4 ¤   ¤   ¤   ¤   Require( data->thread.parentID < wcb->hfs.mdb.drNxtCNID );
8fbeed ¤   ¤   ¤   ¤   Require( data->thread.nodeName[0] <= kHFSMaxFileNameChars );
31f622 ¤   ¤   ¤   ¤   break;
8c2b85 ¤   ¤   ¤   ¤
f5db68 ¤   ¤   ¤   default:
e4fffa ¤   ¤   ¤   ¤   pgpDebugMsg( "Invalid leaf record type" );
b4b3b7 ¤   ¤   ¤   ¤   return( kWipingError_InvalidVolumeDataStructure );
2bf622 ¤   ¤   ¤   ¤   break;
590fe4 ¤   ¤   }
cd87c7 ¤   ¤   ¤
23c3ac ¤   ¤   --recordOffsetPtr;
709371 ¤   }
0467c5 ¤
2179ad ¤   return( noErr );
2befe6 }
0baf5a
772473 ¤   static OSStatus
1b4839 ScanHFSCatalogFileIndexNode(
6aebb3 ¤   const WipeControlBlock ¤*wcb,
337102 ¤   const NodeDescriptor ¤  *nodeDesc)
d4bb36 {
9b7ad4 ¤   PGPUInt16¤  *recordOffsetPtr;
61819d ¤   PGPUInt32¤  recordIndex;
9367c5 ¤
7c67e3 ¤   Require( nodeDesc->ndType == kBTreeIndexNodeType );
76d2f3 ¤   Require( nodeDesc->ndNHeight != 1 );
f5806c ¤   Require( nodeDesc->ndNRecs != 0 );
b4af5a
6f5e08 ¤   recordOffsetPtr = (PGPUInt16 *) ((PGPByte *) nodeDesc +
943d9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->catalogFileInfo.nodeSize - 2 );
0c67c5 ¤
510a9a ¤   for( recordIndex = 0; recordIndex < nodeDesc->ndNRecs; recordIndex++ )
9dc7a1 ¤   {
1c3be4 ¤   ¤   HFSCatalogFileIndexRecord¤  ¤   *record;
4c1b52 ¤   ¤
6ad74e ¤   ¤   record = (HFSCatalogFileIndexRecord *) ((PGPByte *) nodeDesc +
e97e95 ¤   ¤   ¤   ¤   ¤   ¤   *recordOffsetPtr);
ba1b52 ¤   ¤
321c0d ¤   ¤   Require( record->key.parentID < wcb->hfs.mdb.drNxtCNID );
316373 ¤   ¤   Require( record->key.nodeName[0] <= kHFSMaxFileNameChars );
9bcfc4 ¤   ¤   Require( record->key.keyLength == kHFSCatalogKeyMaximumLength );
4c2817 ¤   ¤   Require( record->nodeIndex > 0 );
35628f ¤   ¤   Require( record->nodeIndex < wcb->catalogFileInfo.numNodes );
450b87 ¤   ¤   Require( pgpTestBit( wcb->catalogFileInfo.nodeBitmap,
970a95 ¤   ¤   ¤   ¤   ¤   record->nodeIndex ) );
0b2b85 ¤   ¤   ¤   ¤
59c3ac ¤   ¤   --recordOffsetPtr;
ed9371 ¤   }
4467c5 ¤
a379ad ¤   return( noErr );
6fefe6 }
06af5a
8d2473 ¤   static OSStatus
154e86 ScanHFSCatalogFile(WipeControlBlock *wcb)
4bbb36 {
a36792 ¤   OSStatus¤   err = noErr;
b367c5 ¤
5644ef ¤   /* Account for catalog allocation blocks. */
f767c5 ¤
274a16 ¤   err = ScanHFSFileFork( wcb, kHFSCatalogFileID, kDataForkType,
807399 ¤   ¤   ¤   ¤   wcb->hfs.mdb.drCTExtRec, wcb->hfs.mdb.drCTFlSize,
ef3d0c ¤   ¤   ¤   ¤   wcb->hfs.mdb.drCTFlSize );
79ee03 ¤   if( IsntErr( err ) )
17c7a1 ¤   {
8cfd5e ¤   ¤   PGPUInt32¤  remainingNodes;
--f467 000a335d58140120251 Page 25 of pgpMacVolumeWiping.c
907f46 ¤   ¤   PGPUInt32¤  btNodeIndex;
e1f706 ¤   ¤   PGPUInt32¤  readStartNode;
329861 ¤   ¤   PGPUInt32¤  numHeaderNodes;
441b52 ¤   ¤
db1b17 ¤   ¤   /*
826e85 ¤   ¤   ** Loop over all records in the catalog. For each record, we validate
7e56de ¤   ¤   ** the format of each record and set bits in the volume bit map. Error
be5baa ¤   ¤   ** if there are already any bits set in the volume bit map.
795c12 ¤   ¤   */
541b52 ¤   ¤
6ed746 ¤   ¤   btNodeIndex¤¤   = 0;
855bf2 ¤   ¤   readStartNode¤  = 0;
12e540 ¤   ¤   numHeaderNodes¤ = 0;
3b1b52 ¤   ¤
18f845 ¤   ¤   remainingNodes = wcb->catalogFileInfo.numNodes;
ece636 ¤   ¤   while( remainingNodes != 0 && IsntErr( err ) )
185b34 ¤   ¤   {
ffcbf8 ¤   ¤   ¤   PGPUInt32¤  nodesToRead;
ac87c7 ¤   ¤   ¤
e110d4 ¤   ¤   ¤   nodesToRead = wcb->ioBufferSize / wcb->catalogFileInfo.nodeSize;
982277 ¤   ¤   ¤   if( nodesToRead > remainingNodes )
2a4f76 ¤   ¤   ¤   ¤   nodesToRead = remainingNodes;
2587c7 ¤   ¤   ¤
46786e ¤   ¤   ¤   err = WCBReadBTreeNodes( wcb, &wcb->catalogFileInfo,·
032731 ¤   ¤   ¤   ¤   ¤   ¤   readStartNode, nodesToRead, wcb->ioBuffer );
506108 ¤   ¤   ¤   if( IsntErr( err ) )
27f776 ¤   ¤   ¤   {
f4fea4 ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   nodeIndex;
52c564 ¤   ¤   ¤   ¤   NodeDescriptor¤ *nodeDesc = (NodeDescriptor *) wcb->ioBuffer;
f42b85 ¤   ¤   ¤   ¤
161c40 ¤   ¤   ¤   ¤   for( nodeIndex = 0; nodeIndex < nodesToRead; nodeIndex++ )
bf72c3 ¤   ¤   ¤   ¤   {
9982d5 ¤   ¤   ¤   ¤   ¤   if( pgpTestBit( wcb->catalogFileInfo.nodeBitmap,
7d04c0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   btNodeIndex ) )
0e4859 ¤   ¤   ¤   ¤   ¤   {
69618c ¤   ¤   ¤   ¤   ¤   ¤   switch( nodeDesc->ndType )
e78fec ¤   ¤   ¤   ¤   ¤   ¤   {
c52713 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeLeafNodeType:
6b7291 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ScanHFSCatalogFileLeafNode( wcb,
7e6270 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nodeDesc );
37c0ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ++wcb->numSectorsToWipe;
68cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
8ada4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
30a132 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeIndexNodeType:
cbe1e4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ScanHFSCatalogFileIndexNode( wcb,
c06270 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nodeDesc );
c1c0ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ++wcb->numSectorsToWipe;
40cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
a2531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
dfb94b ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeMapNodeType:
4a0253 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* Don't wipe or validate map nodes */
f0cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
28da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
1b0e7b ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeHeaderNodeType:
daf14a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* Already validated header node */
0c0a9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ++numHeaderNodes;
8978b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( numHeaderNodes > 1 )
a231b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
eaf125 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDebugMsg(
f104e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   "Found multiple catalogB-Tree header nodes" );
f0023a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
2d6560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
9fcd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
b794aa ¤   ¤   ¤   ¤   ¤   ¤
acd8da ¤   ¤   ¤   ¤   ¤   ¤   ¤   default:
ef9e37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDebugMsg( "Unknown catalog node type" );
10023a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
91cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
c2db3c ¤   ¤   ¤   ¤   ¤   ¤   }
451c89 ¤   ¤   ¤   ¤   ¤   }
234bd6 ¤   ¤   ¤   ¤   ¤   else
a34859 ¤   ¤   ¤   ¤   ¤   {
--8b30 0002d93348940120251 Page 26 of pgpMacVolumeWiping.c
cad6a8 ¤   ¤   ¤   ¤   ¤   ¤   /* Free B-Tree node */
35fcc5 ¤   ¤   ¤   ¤   ¤   ¤   ++wcb->numSectorsToWipe;
1d1c89 ¤   ¤   ¤   ¤   ¤   }
dcae30 ¤   ¤   ¤   ¤   ¤
b9598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
3a4859 ¤   ¤   ¤   ¤   ¤   {
702965 ¤   ¤   ¤   ¤   ¤   ¤   VolumeWipeEvent¤event;
d01b52 ¤   ¤
6e1d06 ¤   ¤   ¤   ¤   ¤   ¤   event.type = kVolumeWipeEvent_GatheringInfo;
0667c5 ¤
65f132 ¤   ¤   ¤   ¤   ¤   ¤   err = SendEvent( wcb, &event );
8e1c89 ¤   ¤   ¤   ¤   ¤   }
f4ae30 ¤   ¤   ¤   ¤   ¤
aeda4b ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
0800eb ¤   ¤   ¤   ¤   ¤   ¤   break;
322b85 ¤   ¤   ¤   ¤
e1597d ¤   ¤   ¤   ¤   ¤   ++btNodeIndex;
a1ae30 ¤   ¤   ¤   ¤   ¤
3bab9b ¤   ¤   ¤   ¤   ¤   nodeDesc = (NodeDescriptor *) ((PGPByte *) nodeDesc +
a7ed08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->catalogFileInfo.nodeSize);
002613 ¤   ¤   ¤   ¤   }
60a3a6 ¤   ¤   ¤   }
1a87c7 ¤   ¤   ¤
b21600 ¤   ¤   ¤   remainingNodes ¤-= nodesToRead;
09132d ¤   ¤   ¤   readStartNode¤  += nodesToRead;
030fe4 ¤   ¤   }
f19371 ¤   }
1e67c5 ¤
3cdeb7 ¤   return( err );
acefe6 }
8caf5a
4e2473 ¤   static OSStatus
abbc75 ScanHFSExtentsFileLeafNode(
a7ebb3 ¤   const WipeControlBlock ¤*wcb,
057102 ¤   const NodeDescriptor ¤  *nodeDesc)
7abb36 {
c87ad4 ¤   PGPUInt16¤  *recordOffsetPtr;
29819d ¤   PGPUInt32¤  recordIndex;
476792 ¤   OSStatus¤   err = noErr;
5467c5 ¤
0543be ¤   Require( nodeDesc->ndType == kBTreeLeafNodeType );
f2b2e9 ¤   Require( nodeDesc->ndNHeight == 1 );
19806c ¤   Require( nodeDesc->ndNRecs != 0 );
5caf5a
945e08 ¤   recordOffsetPtr = (PGPUInt16 *) ((PGPByte *) nodeDesc +
7a61b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->extentsFileInfo.nodeSize - 2 );
0067c5 ¤
c50a9a ¤   for( recordIndex = 0; recordIndex < nodeDesc->ndNRecs; recordIndex++ )
96c7a1 ¤   {
27fb57 ¤   ¤   HFSExtentKey¤   ¤   *key;
c5b4ce ¤   ¤   HFSExtentDescriptor¤*data;
93bdb4 ¤   ¤   PGPUInt32¤  ¤   ¤   foundForkBlocks;
593c44 ¤   ¤   ProblemForkInfo¤¤   *forkInfo;
e41b52 ¤   ¤
09969d ¤   ¤   key = (HFSExtentKey *) ((PGPByte *) nodeDesc + *recordOffsetPtr);
041b52 ¤   ¤
0ac776 ¤   ¤   Require( key->keyLength == kHFSExtentKeyMaximumLength );
79920a ¤   ¤   Require( key->forkType == kDataForkType ||
d80ac4 ¤   ¤   ¤   ¤   ¤   key->forkType == kResourceForkType );
4246ba ¤   ¤   Require( key->fileID < wcb->hfs.mdb.drNxtCNID );
8e67c5 ¤
79aabd ¤   ¤   data = (HFSExtentDescriptor *) ( (PGPByte *) key + key->keyLength + 1 );
e61b52 ¤   ¤
b4faa9 ¤   ¤   /* Find the fork in the problem file list. */
52f9ec ¤   ¤   forkInfo = FindProblemForkInfo( wcb, key->fileID, key->forkType );
6f08e2 ¤   ¤   if( IsntNull( forkInfo ) )
a65b34 ¤   ¤   {
146837 ¤   ¤   ¤   err = ScanHFSExtentRecord( wcb, data, &foundForkBlocks );
636108 ¤   ¤   ¤   if( IsntErr( err ) )
76f776 ¤   ¤   ¤   {
c5be96 ¤   ¤   ¤   ¤   /* Accumulate these extents into the problem fork list */
2deead ¤   ¤   ¤   ¤   err = RememberProblemForkExtents( forkInfo, key->startBlock,
--4a10 000fd73bc9340120251 Page 27 of pgpMacVolumeWiping.c
da00be ¤   ¤   ¤   ¤   ¤   ¤   ¤   (ExtentRecord *) data );
dea3a6 ¤   ¤   ¤   }
1f0fe4 ¤   ¤   }
d90e1d ¤   ¤   else
c25b34 ¤   ¤   {
82f273 ¤   ¤   ¤   pgpDebugMsg("\pFound extent record with no matching catalog entry");
4aa124 ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
fc0fe4 ¤   ¤   }
331b52 ¤   ¤
ac03ef ¤   ¤   if( IsErr( err ) )
36cdcb ¤   ¤   ¤   break;
e187c7 ¤   ¤   ¤
97c3ac ¤   ¤   --recordOffsetPtr;
799371 ¤   }
bf67c5 ¤
08deb7 ¤   return( err );
11efe6 }
9aaf5a
7d2473 ¤   static OSStatus
62d891 ScanHFSExtentsFileIndexNode(
8aebb3 ¤   const WipeControlBlock ¤*wcb,
857102 ¤   const NodeDescriptor ¤  *nodeDesc)
1ebb36 {
237ad4 ¤   PGPUInt16¤  *recordOffsetPtr;
15819d ¤   PGPUInt32¤  recordIndex;
a667c5 ¤
fc67e3 ¤   Require( nodeDesc->ndType == kBTreeIndexNodeType );
23d2f3 ¤   Require( nodeDesc->ndNHeight != 1 );
e5806c ¤   Require( nodeDesc->ndNRecs != 0 );
2baf5a
485e08 ¤   recordOffsetPtr = (PGPUInt16 *) ((PGPByte *) nodeDesc +
c761b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->extentsFileInfo.nodeSize - 2 );
7667c5 ¤
ed0a9a ¤   for( recordIndex = 0; recordIndex < nodeDesc->ndNRecs; recordIndex++ )
04c7a1 ¤   {
5b99a5 ¤   ¤   HFSExtentsFileIndexRecord¤  ¤   *record;
4c1b52 ¤   ¤
5edec8 ¤   ¤   record = (HFSExtentsFileIndexRecord *) ((PGPByte *) nodeDesc +
747e95 ¤   ¤   ¤   ¤   ¤   ¤   *recordOffsetPtr);
771b52 ¤   ¤
6b9343 ¤   ¤   Require( record->key.keyLength == kHFSExtentKeyMaximumLength );
ba70a1 ¤   ¤   Require( record->key.forkType == kDataForkType ||
e0a014 ¤   ¤   ¤   ¤   ¤   record->key.forkType == kResourceForkType );
c8d633 ¤   ¤   Require( record->key.fileID < wcb->hfs.mdb.drNxtCNID );
1b2817 ¤   ¤   Require( record->nodeIndex > 0 );
21fd00 ¤   ¤   Require( record->nodeIndex < wcb->extentsFileInfo.numNodes );
749408 ¤   ¤   Require( pgpTestBit( wcb->extentsFileInfo.nodeBitmap,
590a95 ¤   ¤   ¤   ¤   ¤   record->nodeIndex ) );
39ae30 ¤   ¤   ¤   ¤   ¤
d6c3ac ¤   ¤   --recordOffsetPtr;
669371 ¤   }
8367c5 ¤
9a79ad ¤   return( noErr );
36efe6 }
01af5a
db2473 ¤   static OSStatus
f7abf4 ScanHFSExtentsFile(WipeControlBlock *wcb)
5bbb36 {
f56792 ¤   OSStatus¤   err = noErr;
8f67c5 ¤
088dc2 ¤   /* Account for extents file allocation blocks. */
9d67c5 ¤
ba296c ¤   err = ScanHFSFileFork( wcb, kHFSExtentsFileID, kDataForkType,
351198 ¤   ¤   ¤   ¤   wcb->hfs.mdb.drXTExtRec, wcb->hfs.mdb.drXTFlSize,
31a5d6 ¤   ¤   ¤   ¤   wcb->hfs.mdb.drXTFlSize );
c767c5 ¤
c7ee03 ¤   if( IsntErr( err ) )
41c7a1 ¤   {
cdfd5e ¤   ¤   PGPUInt32¤  remainingNodes;
a07f46 ¤   ¤   PGPUInt32¤  btNodeIndex;
c6f706 ¤   ¤   PGPUInt32¤  readStartNode;
fd9861 ¤   ¤   PGPUInt32¤  numHeaderNodes;
--4d52 00065f95a8c40120251 Page 28 of pgpMacVolumeWiping.c
f11b52 ¤   ¤
901b17 ¤   ¤   /*
696e85 ¤   ¤   ** Loop over all records in the catalog. For each record, we validate
ed56de ¤   ¤   ** the format of each record and set bits in the volume bit map. Error
865baa ¤   ¤   ** if there are already any bits set in the volume bit map.
a85c12 ¤   ¤   */
db1b52 ¤   ¤
42d746 ¤   ¤   btNodeIndex¤¤   = 0;
d85bf2 ¤   ¤   readStartNode¤  = 0;
c3e540 ¤   ¤   numHeaderNodes¤ = 0;
9b1b52 ¤   ¤
3d36d9 ¤   ¤   remainingNodes = wcb->extentsFileInfo.numNodes;
17e636 ¤   ¤   while( remainingNodes != 0 && IsntErr( err ) )
b35b34 ¤   ¤   {
7acbf8 ¤   ¤   ¤   PGPUInt32¤  nodesToRead;
d587c7 ¤   ¤   ¤
60de48 ¤   ¤   ¤   nodesToRead = wcb->ioBufferSize / wcb->extentsFileInfo.nodeSize;
b42277 ¤   ¤   ¤   if( nodesToRead > remainingNodes )
e54f76 ¤   ¤   ¤   ¤   nodesToRead = remainingNodes;
a32b85 ¤   ¤   ¤   ¤
0b5e04 ¤   ¤   ¤   err = WCBReadBTreeNodes( wcb, &wcb->extentsFileInfo,·
712731 ¤   ¤   ¤   ¤   ¤   ¤   readStartNode, nodesToRead, wcb->ioBuffer );
976108 ¤   ¤   ¤   if( IsntErr( err ) )
e9f776 ¤   ¤   ¤   {
d8fea4 ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   nodeIndex;
eac564 ¤   ¤   ¤   ¤   NodeDescriptor¤ *nodeDesc = (NodeDescriptor *) wcb->ioBuffer;
ce2b85 ¤   ¤   ¤   ¤
c51c40 ¤   ¤   ¤   ¤   for( nodeIndex = 0; nodeIndex < nodesToRead; nodeIndex++ )
a472c3 ¤   ¤   ¤   ¤   {
9f1d5a ¤   ¤   ¤   ¤   ¤   if( pgpTestBit( wcb->extentsFileInfo.nodeBitmap,
ca1c90 ¤   ¤   ¤   ¤   ¤   ¤   ¤   btNodeIndex ) )
ba4859 ¤   ¤   ¤   ¤   ¤   {
65618c ¤   ¤   ¤   ¤   ¤   ¤   switch( nodeDesc->ndType )
ed8fec ¤   ¤   ¤   ¤   ¤   ¤   {
f72713 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeLeafNodeType:
ffbc0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ScanHFSExtentsFileLeafNode( wcb,
4a6270 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nodeDesc );
c0c0ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ++wcb->numSectorsToWipe;
86cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
b6da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
90a132 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeIndexNodeType:
e9bfcf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ScanHFSExtentsFileIndexNode( wcb,
5c6270 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nodeDesc );
29c0ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ++wcb->numSectorsToWipe;
1ecd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
50531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
4eb94b ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeMapNodeType:
e30253 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* Don't wipe or validate map nodes */
d0cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
aeda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
960e7b ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeHeaderNodeType:
b9f14a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* Already validated header node */
430a9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ++numHeaderNodes;
5e78b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( numHeaderNodes > 1 )
ac31b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
d8f125 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDebugMsg(
a9d892 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   "Found multiple extents-Tree header nodes" );
8a023a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
976560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
31cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
0a94aa ¤   ¤   ¤   ¤   ¤   ¤
19d8da ¤   ¤   ¤   ¤   ¤   ¤   ¤   default:
5c9e37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDebugMsg( "Unknown catalog node type" );
70023a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
2ccd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
cddb3c ¤   ¤   ¤   ¤   ¤   ¤   }
de1c89 ¤   ¤   ¤   ¤   ¤   }
dd4bd6 ¤   ¤   ¤   ¤   ¤   else
ab4859 ¤   ¤   ¤   ¤   ¤   {
3bd6a8 ¤   ¤   ¤   ¤   ¤   ¤   /* Free B-Tree node */
88fcc5 ¤   ¤   ¤   ¤   ¤   ¤   ++wcb->numSectorsToWipe;
651c89 ¤   ¤   ¤   ¤   ¤   }
--cbd6 000d6d7a3b240120251 Page 29 of pgpMacVolumeWiping.c
d6ae30 ¤   ¤   ¤   ¤   ¤
be598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
c74859 ¤   ¤   ¤   ¤   ¤   {
842965 ¤   ¤   ¤   ¤   ¤   ¤   VolumeWipeEvent¤event;
121b52 ¤   ¤
701d06 ¤   ¤   ¤   ¤   ¤   ¤   event.type = kVolumeWipeEvent_GatheringInfo;
7b67c5 ¤
fdf132 ¤   ¤   ¤   ¤   ¤   ¤   err = SendEvent( wcb, &event );
a71c89 ¤   ¤   ¤   ¤   ¤   }
fbae30 ¤   ¤   ¤   ¤   ¤
e7da4b ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
2d00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
2a2b85 ¤   ¤   ¤   ¤
d1597d ¤   ¤   ¤   ¤   ¤   ++btNodeIndex;
4fae30 ¤   ¤   ¤   ¤   ¤
feab9b ¤   ¤   ¤   ¤   ¤   nodeDesc = (NodeDescriptor *) ((PGPByte *) nodeDesc +
deb323 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->extentsFileInfo.nodeSize);
962613 ¤   ¤   ¤   ¤   }
28a3a6 ¤   ¤   ¤   }
ad87c7 ¤   ¤   ¤
be1600 ¤   ¤   ¤   remainingNodes ¤-= nodesToRead;
25132d ¤   ¤   ¤   readStartNode¤  += nodesToRead;
f80fe4 ¤   ¤   }
699371 ¤   }
fc67c5 ¤
72deb7 ¤   return( err );
0aefe6 }
bfaf5a
082473 ¤   static OSStatus
9317f5 GatherHFSVolumeInfo(WipeControlBlock *wcb)
dcbb36 {
94dc42 ¤   OSStatus¤   err;
a667c5 ¤
f7fcaa ¤   /* Read the MDB (Sector 2) */
aa9d78 ¤   err = WCBReadSectors( wcb, 2, 1, wcb->ioBuffer );
24ee03 ¤   if( IsntErr( err ) )
d4c7a1 ¤   {
92939d ¤   ¤   wcb->hfs.mdb = *((HFSMasterDirectoryBlock *) wcb->ioBuffer);
d81b52 ¤   ¤
420ca4 ¤   ¤   err = ValidateHFSMasterDirectoryBlock( &wcb->hfs.mdb );
81da5e ¤   ¤   if( IsntErr( err ) )
6d5b34 ¤   ¤   {
8d8cef ¤   ¤   ¤   /* Compute some common values based on MDB */
5487c7 ¤   ¤   ¤
965501 ¤   ¤   ¤   wcb->numBlocks¤ ¤   ¤   = wcb->hfs.mdb.drNmAlBlks;
7ce7fd ¤   ¤   ¤   wcb->numFreeBlocks¤ ¤   = (UInt16) wcb->hfs.mdb.drFreeBks;
ec647c ¤   ¤   ¤   wcb->blockSize ¤¤   ¤   = wcb->hfs.mdb.drAlBlkSiz;
1fa4a3 ¤   ¤   ¤   wcb->numSectorsPerBlock¤= wcb->blockSize / kDiskSectorSize;
b0fb35 ¤   ¤   ¤   wcb->numVolumeSectors ¤ = ( wcb->numBlocks *
dcc935 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsPerBlock ) +
3b85ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->hfs.mdb.drAlBlSt;
310fe4 ¤   ¤   }
db9371 ¤   }
3967c5 ¤
d5ee03 ¤   if( IsntErr( err ) )
20c7a1 ¤   {
0a72ab ¤   ¤   /* "Open" BTree files and get extent info for each */
9241a3 ¤   ¤   err = WCBOpenBTreeFile( wcb, wcb->catalogFileInfo.fileRefNum,
c5564f ¤   ¤   ¤   ¤   ¤   ¤   wcb->hfs.mdb.drCTFlSize,
2c4d84 ¤   ¤   ¤   ¤   ¤   ¤   &wcb->catalogFileInfo );
36da5e ¤   ¤   if( IsntErr( err ) )
7f5b34 ¤   ¤   {
66c89a ¤   ¤   ¤   err = WCBOpenBTreeFile( wcb, wcb->extentsFileInfo.fileRefNum,
34631a ¤   ¤   ¤   ¤   ¤   ¤   wcb->hfs.mdb.drXTFlSize, &wcb->extentsFileInfo );
010fe4 ¤   ¤   }
209371 ¤   }
fb67c5 ¤
6ddeb7 ¤   return( err );
5befe6 }
f4af5a
01103b #pragma mark [ --- HFS+ Scanning --- ]
d6af5a
--0547 000992ecf9e40120251 Page 30 of pgpMacVolumeWiping.c
e62473 ¤   static OSStatus
7063d3 ScanHFSPlusExtentRecord(
f2f0ba ¤   const WipeControlBlock ¤¤   *wcb,
84598a ¤   const HFSPlusExtentRecord¤  record,
a06442 ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   *foundForkBlocks)
53bb36 {
ac581e ¤   PGPUInt32¤  extentIndex;
cc67c5 ¤
38d72b ¤   *foundForkBlocks = 0;
fb67c5 ¤
fb9d04 ¤   for( extentIndex = 0; extentIndex < kHFSPlusExtentDensity; extentIndex++)
82c7a1 ¤   {
ecd773 ¤   ¤   const HFSPlusExtentDescriptor¤  *extent = &record[extentIndex];
cb864e ¤   ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   ¤   overlappingBlockCount;
531b52 ¤   ¤
f8151e ¤   ¤   if( extent->blockCount != 0 )
e75b34 ¤   ¤   {
4154b2 ¤   ¤   ¤   Require( extent->startBlock + extent->blockCount <=
b670e5 ¤   ¤   ¤   ¤   ¤   ¤   wcb->numBlocks );
b987c7 ¤   ¤   ¤
cd3e42 ¤   ¤   ¤   *foundForkBlocks += extent->blockCount;
0687c7 ¤   ¤   ¤
32c23a ¤   ¤   ¤   overlappingBlockCount = pgpCountAndSetBitRange(
cc714f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->volumeBitmap,
7c0f65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   extent->startBlock,
819c0f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   extent->blockCount );
223ede ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
caf808 ¤   ¤   ¤   Require( overlappingBlockCount == 0 );
9e0fe4 ¤   ¤   }
de9371 ¤   }
2a67c5 ¤
e179ad ¤   return( noErr );
06efe6 }
9eaf5a
f22473 ¤   static OSStatus
1cd24b ScanHFSPlusFileFork(
cb9c77 ¤   WipeControlBlock ¤  ¤   *wcb,
347799 ¤   PGPUInt32¤  ¤   ¤   ¤   fileID,
68ad57 ¤   ForkType¤   ¤   ¤   ¤   forkType,
a4c1bc ¤   const HFSPlusForkData¤  *forkData)
04bb36 {
e36792 ¤   OSStatus¤   err = noErr;
9a3119 ¤   PGPInt32¤   extentIndex;
c0c4ae ¤   PGPUInt64¤  forkPhysicalLength;
8267c5 ¤
d74b38 ¤   forkPhysicalLength = (PGPUInt64) forkData->totalBlocks * wcb->blockSize;
8067c5 ¤
ae91e7 ¤   Require( forkData->logicalSize <= forkPhysicalLength );
32af5a
a0c92c ¤   if( forkData->totalBlocks != 0 )
97c7a1 ¤   {
a11992 ¤   ¤   PGPUInt32¤  foundForkBlocks;
7eaf5a
55ec3a ¤   ¤   err = ScanHFSPlusExtentRecord( wcb, forkData->extents,
d62a1b ¤   ¤   ¤   ¤   ¤   &foundForkBlocks );
06da5e ¤   ¤   if( IsntErr( err ) )
665b34 ¤   ¤   {
5ba094 ¤   ¤   ¤   if( foundForkBlocks == forkData->totalBlocks )
57f776 ¤   ¤   ¤   {
1c980e ¤   ¤   ¤   ¤   /*
93b9be ¤   ¤   ¤   ¤   ** Simplest case. All of the files allocation blocks are
b58279 ¤   ¤   ¤   ¤   ** accounted for in the catalog. We now check to see if
8d19c1 ¤   ¤   ¤   ¤   ** the file's logical EOF is in the last allocation block of
ee3164 ¤   ¤   ¤   ¤   ** the file. If so, we remember the remainder of the last
083b73 ¤   ¤   ¤   ¤   ** allocation block for wiping later
ebdf0b ¤   ¤   ¤   ¤   */
7a2b85 ¤   ¤   ¤   ¤
af2920 ¤   ¤   ¤   ¤   if( forkPhysicalLength - forkData->logicalSize <
99cc7a ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->blockSize )
6b72c3 ¤   ¤   ¤   ¤   {
56dd53 ¤   ¤   ¤   ¤   ¤   if( forkPhysicalLength != forkData->logicalSize )
994859 ¤   ¤   ¤   ¤   ¤   {
--c0de 000a1f81ae840120251 Page 31 of pgpMacVolumeWiping.c
894106 ¤   ¤   ¤   ¤   ¤   ¤   /*
6efd8d ¤   ¤   ¤   ¤   ¤   ¤   ** Get the last allocation block and remember the
3dd385 ¤   ¤   ¤   ¤   ¤   ¤   ** range.
660603 ¤   ¤   ¤   ¤   ¤   ¤   */
6eae30 ¤   ¤   ¤   ¤   ¤
aa374d ¤   ¤   ¤   ¤   ¤   ¤   for( extentIndex = kHFSPlusExtentDensity - 1;
744e39 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   extentIndex >= 0; --extentIndex )
008fec ¤   ¤   ¤   ¤   ¤   ¤   {
c98948 ¤   ¤   ¤   ¤   ¤   ¤   ¤   HFSPlusExtentDescriptor¤desc;
76531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
8cfe0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   desc = forkData->extents[extentIndex];
27531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
abe048 ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( desc.blockCount != 0 )
6706b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
6c6443 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  lastBlock;
c8db84 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  usedBytes;
e95a4a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  startSector;
5c2a12 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  skipSectors;
e2e6c3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  byteOffset;
68c1db ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  numSectors;
ddda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
8dadb6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lastBlock ¤ = desc.startBlock +
713670 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   desc.blockCount - 1;
11c02f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   usedBytes¤  = wcb->blockSize - (
84ded7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   forkPhysicalLength -
a19059 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   forkData->logicalSize );
666f06 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   skipSectors¤= usedBytes / kDiskSectorSize;
485a04 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   byteOffset¤ = usedBytes % kDiskSectorSize;
151fcd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   numSectors¤ = wcb->numSectorsPerBlock -
654e97 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   skipSectors;
87da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
c3db8e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   startSector¤= WCBBlockToSector( wcb,
28e53b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   lastBlock );
9dc8bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   startSector¤+= skipSectors;
f5da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
99ebc9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = RememberWipeRange( wcb, startSector,·
9ffa34 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   byteOffset, numSectors );
a6da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
9c09bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsToWipe += numSectors;
74ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
40cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
235268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
14db3c ¤   ¤   ¤   ¤   ¤   ¤   }
8d1c89 ¤   ¤   ¤   ¤   ¤   }
3a4bd6 ¤   ¤   ¤   ¤   ¤   else
1e4859 ¤   ¤   ¤   ¤   ¤   {
e34106 ¤   ¤   ¤   ¤   ¤   ¤   /*
c6148a ¤   ¤   ¤   ¤   ¤   ¤   ** Fork uses all of the allocation block.
f1ff86 ¤   ¤   ¤   ¤   ¤   ¤   ** No wiping needed
ea0603 ¤   ¤   ¤   ¤   ¤   ¤   */
591c89 ¤   ¤   ¤   ¤   ¤   }
a32613 ¤   ¤   ¤   ¤   }
15fa07 ¤   ¤   ¤   ¤   else
9d72c3 ¤   ¤   ¤   ¤   {
d2a3e7 ¤   ¤   ¤   ¤   ¤   /*
148588 ¤   ¤   ¤   ¤   ¤   ** This is a problem file. The logical EOF is more than one
ac911f ¤   ¤   ¤   ¤   ¤   ** allocation block from the physical EOF. Add it to our
f6c6ea ¤   ¤   ¤   ¤   ¤   ** problem file list
b6e4e2 ¤   ¤   ¤   ¤   ¤   */
07ae30 ¤   ¤   ¤   ¤   ¤
312804 ¤   ¤   ¤   ¤   ¤   err = RememberProblemFork( wcb, fileID, forkType,
27ade2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   forkData->logicalSize, forkPhysicalLength,
f14292 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (ExtentRecord *) forkData->extents );
f92613 ¤   ¤   ¤   ¤   }
caa3a6 ¤   ¤   ¤   }
dc6256 ¤   ¤   ¤   else if( foundForkBlocks < forkData->totalBlocks )
ebf776 ¤   ¤   ¤   {
1a980e ¤   ¤   ¤   ¤   /*
55e1d7 ¤   ¤   ¤   ¤   ** Not all of the allocation blocks are in the catalog.
dc3aa2 ¤   ¤   ¤   ¤   ** Remember this file for later analysis when we scan
ed1f57 ¤   ¤   ¤   ¤   ** the extents file.
a1df0b ¤   ¤   ¤   ¤   */
--ea65 00016beaa9140120251 Page 32 of pgpMacVolumeWiping.c
9f2b85 ¤   ¤   ¤   ¤
053d27 ¤   ¤   ¤   ¤   err = RememberProblemFork( wcb, fileID, forkType,
dfade2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   forkData->logicalSize, forkPhysicalLength,
394292 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (ExtentRecord *) forkData->extents );
e0a3a6 ¤   ¤   ¤   }
c8bb8c ¤   ¤   ¤   else
2df776 ¤   ¤   ¤   {
979a47 ¤   ¤   ¤   ¤   /* Too many blocks. Damaged. */
8fa1c6 ¤   ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
76a3a6 ¤   ¤   ¤   }
540fe4 ¤   ¤   }
e89371 ¤   }
310e24 ¤   else
d7c7a1 ¤   {
0a83bc ¤   ¤   for( extentIndex = 0; extentIndex < kHFSPlusExtentDensity;
e50423 ¤   ¤   ¤   ¤   extentIndex++ )
645b34 ¤   ¤   {
638638 ¤   ¤   ¤   const HFSPlusExtentDescriptor¤  *extent;
c6af5a
cd1c83 ¤   ¤   ¤   extent = &forkData->extents[extentIndex];
2387c7 ¤   ¤   ¤
18dd1a ¤   ¤   ¤   Require( extent->startBlock == 0 );
0d527b ¤   ¤   ¤   Require( extent->blockCount == 0 );
f10fe4 ¤   ¤   }
0d9371 ¤   }
7167c5 ¤
4adeb7 ¤   return( err );
9aefe6 }
c4af5a
e32473 ¤   static OSStatus
00cc27 ScanHFSPlusCatalogFileRecord(
85b552 ¤   WipeControlBlock ¤  ¤   ¤   *wcb,
2f230a ¤   const HFSPlusCatalogFile¤   *file)
ddcebb {¤
a06792 ¤   OSStatus¤   err = noErr;
5f67c5 ¤
ffb44e ¤   Require( file->recordType == kHFSPlusFileRecord );
f307cb ¤   Require( file->fileID < wcb->hfsPlus.vh.nextCatalogID );
e4af5a
a2d8af ¤   /*
286e65 ¤   ** Validate that we do not have too many extents and mark the used
9e0746 ¤   ** extents in our volume bitmap.
db9faa ¤   */
8267c5 ¤
18fb6d ¤   err = ScanHFSPlusFileFork( wcb, file->fileID, kDataForkType,
bf85ad ¤   ¤   ¤   ¤   &file->dataFork );
afee03 ¤   if( IsntErr( err ) )
e5c7a1 ¤   {
e9e1f4 ¤   ¤   err = ScanHFSPlusFileFork( wcb, file->fileID, kResourceForkType,
6f8cc9 ¤   ¤   ¤   ¤   ¤   &file->resourceFork );
979371 ¤   }
a41b52 ¤   ¤
d6deb7 ¤   return( err );
a0efe6 }
f6af5a
542473 ¤   static OSStatus
ea9447 ValidateHFSPlusCatalogKey(
60ebb3 ¤   const WipeControlBlock ¤*wcb,
25025e ¤   const HFSPlusCatalogKey¤*key)
42bb36 {
5e0392 ¤   Require( key->parentID < wcb->hfsPlus.vh.nextCatalogID );
a191d4 ¤   Require( key->nodeName.length <= kHFSPlusMaxFileNameChars );
2ec9bd ¤   Require( key->keyLength >= kHFSPlusCatalogKeyMinimumLength );
ccdef1 ¤   Require( key->keyLength <= kHFSPlusCatalogKeyMaximumLength );
2caf5a
d779ad ¤   return( noErr );
8cefe6 }
4daf5a
f62473 ¤   static OSStatus
5046cc ScanHFSPlusCatalogFileLeafNode(
709c77 ¤   WipeControlBlock ¤  ¤   *wcb,
167102 ¤   const NodeDescriptor ¤  *nodeDesc)
--b251 000c444635440120251 Page 33 of pgpMacVolumeWiping.c
2cbb36 {
b87ad4 ¤   PGPUInt16¤  *recordOffsetPtr;
fa819d ¤   PGPUInt32¤  recordIndex;
8467c5 ¤
bc43be ¤   Require( nodeDesc->ndType == kBTreeLeafNodeType );
8db2e9 ¤   Require( nodeDesc->ndNHeight == 1 );
8a806c ¤   Require( nodeDesc->ndNRecs != 0 );
06af5a
275e08 ¤   recordOffsetPtr = (PGPUInt16 *) ((PGPByte *) nodeDesc +
a53d9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->catalogFileInfo.nodeSize - 2 );
7367c5 ¤
4e0a9a ¤   for( recordIndex = 0; recordIndex < nodeDesc->ndNRecs; recordIndex++ )
9ec7a1 ¤   {
1bf85a ¤   ¤   HFSPlusCatalogKey¤  ¤   *key;
b66603 ¤   ¤   PGPUInt32¤  ¤   ¤   ¤   dataOffset;
45a4fd ¤   ¤   HFSPlusCatalogRecord¤   *data;
cdb650 ¤   ¤   OSStatus¤   ¤   ¤   ¤   err;
f01b52 ¤   ¤
b1f5ea ¤   ¤   key = (HFSPlusCatalogKey *) ((PGPByte *) nodeDesc + *recordOffsetPtr);
4e1b52 ¤   ¤
45f8a5 ¤   ¤   err = ValidateHFSPlusCatalogKey( wcb, key );
e103ef ¤   ¤   if( IsErr( err ) )
2507bf ¤   ¤   ¤   return( err );
de87c7 ¤   ¤   ¤
d003f5 ¤   ¤   /* Data is padded to an even boundary */
0600bf ¤   ¤   dataOffset = key->keyLength + 1;
de62e6 ¤   ¤   if( ( dataOffset & 1 ) != 0 )
35b17d ¤   ¤   ¤   ++dataOffset;
3587c7 ¤   ¤   ¤
1df5d3 ¤   ¤   data = (HFSPlusCatalogRecord *) ( (PGPByte *) key + dataOffset );
f0c62c ¤   ¤   switch( data->type )
615b34 ¤   ¤   {
b859ce ¤   ¤   ¤   OSStatus¤   err;
d987c7 ¤   ¤   ¤
4e2d4b ¤   ¤   ¤   case kHFSPlusFileRecord:
dba69b ¤   ¤   ¤   ¤   err = ScanHFSPlusCatalogFileRecord( wcb, &data->file );
d59bb8 ¤   ¤   ¤   ¤   if( IsErr( err ) )
639fe8 ¤   ¤   ¤   ¤   ¤   return( err );
93f622 ¤   ¤   ¤   ¤   break;
b02b85 ¤   ¤   ¤   ¤
813a94 ¤   ¤   ¤   case kHFSPlusFolderRecord:
5a6345 ¤   ¤   ¤   ¤   Require( data->folder.folderID <
7c212a ¤   ¤   ¤   ¤   ¤   wcb->hfsPlus.vh.nextCatalogID );
45f622 ¤   ¤   ¤   ¤   break;
7d2b85 ¤   ¤   ¤   ¤
293c3d ¤   ¤   ¤   case kHFSPlusFolderThreadRecord:
0cc0eb ¤   ¤   ¤   case kHFSPlusFileThreadRecord:
73e3c5 ¤   ¤   ¤   ¤   Require( data->thread.parentID <
7e212a ¤   ¤   ¤   ¤   ¤   wcb->hfsPlus.vh.nextCatalogID );
0e6ea3 ¤   ¤   ¤   ¤   Require( data->thread.nodeName.length <=
18305d ¤   ¤   ¤   ¤   ¤   kHFSPlusMaxFileNameChars );
16f622 ¤   ¤   ¤   ¤   break;
462b85 ¤   ¤   ¤   ¤
e4db68 ¤   ¤   ¤   default:
cbfffa ¤   ¤   ¤   ¤   pgpDebugMsg( "Invalid leaf record type" );
51b3b7 ¤   ¤   ¤   ¤   return( kWipingError_InvalidVolumeDataStructure );
2bf622 ¤   ¤   ¤   ¤   break;
660fe4 ¤   ¤   }
8a87c7 ¤   ¤   ¤
b5c3ac ¤   ¤   --recordOffsetPtr;
dd9371 ¤   }
8267c5 ¤
8c79ad ¤   return( noErr );
15efe6 }
10af5a
af2473 ¤   static OSStatus
88f021 ScanHFSPlusCatalogFileIndexNode(
1cebb3 ¤   const WipeControlBlock ¤*wcb,
ce7102 ¤   const NodeDescriptor ¤  *nodeDesc)
68bb36 {
9a7ad4 ¤   PGPUInt16¤  *recordOffsetPtr;
c4819d ¤   PGPUInt32¤  recordIndex;
--c26f 000be94a19b40120251 Page 34 of pgpMacVolumeWiping.c
2a67c5 ¤
ce67e3 ¤   Require( nodeDesc->ndType == kBTreeIndexNodeType );
e2d2f3 ¤   Require( nodeDesc->ndNHeight != 1 );
71806c ¤   Require( nodeDesc->ndNRecs != 0 );
c0af5a
5b5e08 ¤   recordOffsetPtr = (PGPUInt16 *) ((PGPByte *) nodeDesc +
1e3d9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->catalogFileInfo.nodeSize - 2 );
0567c5 ¤
460a9a ¤   for( recordIndex = 0; recordIndex < nodeDesc->ndNRecs; recordIndex++ )
edc7a1 ¤   {
fa20cc ¤   ¤   HFSPlusCatalogKey¤  *key;
793c61 ¤   ¤   OSStatus¤   ¤   ¤   err;
1a8c01 ¤   ¤   PGPUInt32¤  ¤   ¤   nodeIndexOffset;
e99e9d ¤   ¤   UInt32¤ ¤   ¤   ¤   *nodeIndexPtr;
8f1b52 ¤   ¤
57f5ea ¤   ¤   key = (HFSPlusCatalogKey *) ((PGPByte *) nodeDesc + *recordOffsetPtr);
4f1b52 ¤   ¤
1ff8a5 ¤   ¤   err = ValidateHFSPlusCatalogKey( wcb, key );
1303ef ¤   ¤   if( IsErr( err ) )
b507bf ¤   ¤   ¤   return( err );
841b52 ¤   ¤
5d03f5 ¤   ¤   /* Data is padded to an even boundary */
088978 ¤   ¤   nodeIndexOffset = key->keyLength + 1;
cfbdf9 ¤   ¤   if( ( nodeIndexOffset & 1 ) != 0 )
f5bcae ¤   ¤   ¤   ++nodeIndexOffset;
8e87c7 ¤   ¤   ¤
46848f ¤   ¤   nodeIndexPtr = (UInt32 *) ( (PGPByte *) key + nodeIndexOffset );
ff1b52 ¤   ¤
204410 ¤   ¤   Require( *nodeIndexPtr > 0 );
12f15a ¤   ¤   Require( *nodeIndexPtr < wcb->catalogFileInfo.numNodes );
2e0b87 ¤   ¤   Require( pgpTestBit( wcb->catalogFileInfo.nodeBitmap,
8ce059 ¤   ¤   ¤   ¤   ¤   *nodeIndexPtr ) );
e62b85 ¤   ¤   ¤   ¤
6bc3ac ¤   ¤   --recordOffsetPtr;
449371 ¤   }
1d67c5 ¤
9179ad ¤   return( noErr );
d8efe6 }
0baf5a
a72473 ¤   static OSStatus
80a37a ScanHFSPlusCatalogFile(WipeControlBlock *wcb)
d4bb36 {
3e6792 ¤   OSStatus¤   err = noErr;
0a67c5 ¤
5444ef ¤   /* Account for catalog allocation blocks. */
0d67c5 ¤
08ad86 ¤   err = ScanHFSPlusFileFork( wcb, kHFSCatalogFileID, kDataForkType,
d69168 ¤   ¤   ¤   ¤   &wcb->hfsPlus.vh.catalogFile );
2eee03 ¤   if( IsntErr( err ) )
f8c7a1 ¤   {
0dfd5e ¤   ¤   PGPUInt32¤  remainingNodes;
d97f46 ¤   ¤   PGPUInt32¤  btNodeIndex;
00f706 ¤   ¤   PGPUInt32¤  readStartNode;
159861 ¤   ¤   PGPUInt32¤  numHeaderNodes;
8b9a5c ¤   ¤   PGPUInt32¤  sectorsPerNode;
6b1b52 ¤   ¤
e81b17 ¤   ¤   /*
366e85 ¤   ¤   ** Loop over all records in the catalog. For each record, we validate
4856de ¤   ¤   ** the format of each record and set bits in the volume bit map. Error
f15baa ¤   ¤   ** if there are already any bits set in the volume bit map.
a95c12 ¤   ¤   */
7d1b52 ¤   ¤
57d746 ¤   ¤   btNodeIndex¤¤   = 0;
745bf2 ¤   ¤   readStartNode¤  = 0;
65e540 ¤   ¤   numHeaderNodes¤ = 0;
157b84 ¤   ¤   sectorsPerNode¤ = wcb->catalogFileInfo.nodeSize / kDiskSectorSize;
811b52 ¤   ¤
f2f845 ¤   ¤   remainingNodes = wcb->catalogFileInfo.numNodes;
dde636 ¤   ¤   while( remainingNodes != 0 && IsntErr( err ) )
845b34 ¤   ¤   {
2ccbf8 ¤   ¤   ¤   PGPUInt32¤  nodesToRead;
be87c7 ¤   ¤   ¤
--17ec 0002c0512ac40120251 Page 35 of pgpMacVolumeWiping.c
6d10d4 ¤   ¤   ¤   nodesToRead = wcb->ioBufferSize / wcb->catalogFileInfo.nodeSize;
d92277 ¤   ¤   ¤   if( nodesToRead > remainingNodes )
804f76 ¤   ¤   ¤   ¤   nodesToRead = remainingNodes;
4d2b85 ¤   ¤   ¤   ¤
5e786e ¤   ¤   ¤   err = WCBReadBTreeNodes( wcb, &wcb->catalogFileInfo,·
992731 ¤   ¤   ¤   ¤   ¤   ¤   readStartNode, nodesToRead, wcb->ioBuffer );
876108 ¤   ¤   ¤   if( IsntErr( err ) )
0ef776 ¤   ¤   ¤   {
fefea4 ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   nodeIndex;
0cc564 ¤   ¤   ¤   ¤   NodeDescriptor¤ *nodeDesc = (NodeDescriptor *) wcb->ioBuffer;
de2b85 ¤   ¤   ¤   ¤
e51c40 ¤   ¤   ¤   ¤   for( nodeIndex = 0; nodeIndex < nodesToRead; nodeIndex++ )
6c72c3 ¤   ¤   ¤   ¤   {
5982d5 ¤   ¤   ¤   ¤   ¤   if( pgpTestBit( wcb->catalogFileInfo.nodeBitmap,
4104c0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   btNodeIndex ) )
8b4859 ¤   ¤   ¤   ¤   ¤   {
f8618c ¤   ¤   ¤   ¤   ¤   ¤   switch( nodeDesc->ndType )
538fec ¤   ¤   ¤   ¤   ¤   ¤   {
342713 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeLeafNodeType:
7d4ca3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ScanHFSPlusCatalogFileLeafNode( wcb,
216270 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nodeDesc );
6ba4d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsToWipe += sectorsPerNode;
a1cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
9ada4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
3fa132 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeIndexNodeType:
ebf34b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ScanHFSPlusCatalogFileIndexNode( wcb,
2f6270 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nodeDesc );
a7a4d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsToWipe += sectorsPerNode;
0bcd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
13531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
1db94b ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeMapNodeType:
400253 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* Don't wipe or validate map nodes */
94cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
03da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
040e7b ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeHeaderNodeType:
8af14a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* Already validated header node */
0e0a9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ++numHeaderNodes;
0a78b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( numHeaderNodes > 1 )
8031b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
4ef125 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDebugMsg(
2e04e0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   "Found multiple catalogB-Tree header nodes" );
bc023a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
c16560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
3ecd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
8294aa ¤   ¤   ¤   ¤   ¤   ¤
1ed8da ¤   ¤   ¤   ¤   ¤   ¤   ¤   default:
499e37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDebugMsg( "Unknown catalog node type" );
ce023a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
e3cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
cedb3c ¤   ¤   ¤   ¤   ¤   ¤   }
f61c89 ¤   ¤   ¤   ¤   ¤   }
9d4bd6 ¤   ¤   ¤   ¤   ¤   else
204859 ¤   ¤   ¤   ¤   ¤   {
dcd6a8 ¤   ¤   ¤   ¤   ¤   ¤   /* Free B-Tree node */
6629e6 ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsToWipe += sectorsPerNode;
891c89 ¤   ¤   ¤   ¤   ¤   }
76ae30 ¤   ¤   ¤   ¤   ¤
7c598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
834859 ¤   ¤   ¤   ¤   ¤   {
642965 ¤   ¤   ¤   ¤   ¤   ¤   VolumeWipeEvent¤event;
d71b52 ¤   ¤
bc1d06 ¤   ¤   ¤   ¤   ¤   ¤   event.type = kVolumeWipeEvent_GatheringInfo;
ce67c5 ¤
36f132 ¤   ¤   ¤   ¤   ¤   ¤   err = SendEvent( wcb, &event );
f61c89 ¤   ¤   ¤   ¤   ¤   }
73ae30 ¤   ¤   ¤   ¤   ¤
a7da4b ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
b200eb ¤   ¤   ¤   ¤   ¤   ¤   break;
fd2b85 ¤   ¤   ¤   ¤
d2597d ¤   ¤   ¤   ¤   ¤   ++btNodeIndex;
19ae30 ¤   ¤   ¤   ¤   ¤
2cab9b ¤   ¤   ¤   ¤   ¤   nodeDesc = (NodeDescriptor *) ((PGPByte *) nodeDesc +
--983b 000cc4ae4e340120251 Page 36 of pgpMacVolumeWiping.c
b8ed08 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->catalogFileInfo.nodeSize);
0f2613 ¤   ¤   ¤   ¤   }
97a3a6 ¤   ¤   ¤   }
e087c7 ¤   ¤   ¤
d51600 ¤   ¤   ¤   remainingNodes ¤-= nodesToRead;
9f132d ¤   ¤   ¤   readStartNode¤  += nodesToRead;
bb0fe4 ¤   ¤   }
6c9371 ¤   }
1167c5 ¤
96deb7 ¤   return( err );
1befe6 }
29af5a
0d2473 ¤   static OSStatus
7f4718 ScanHFSPlusExtentsFileLeafNode(
a6ebb3 ¤   const WipeControlBlock ¤*wcb,
e97102 ¤   const NodeDescriptor ¤  *nodeDesc)
62bb36 {
b87ad4 ¤   PGPUInt16¤  *recordOffsetPtr;
f4819d ¤   PGPUInt32¤  recordIndex;
4b6792 ¤   OSStatus¤   err = noErr;
7d67c5 ¤
4a43be ¤   Require( nodeDesc->ndType == kBTreeLeafNodeType );
bcb2e9 ¤   Require( nodeDesc->ndNHeight == 1 );
c2806c ¤   Require( nodeDesc->ndNRecs != 0 );
48af5a
8d5e08 ¤   recordOffsetPtr = (PGPUInt16 *) ((PGPByte *) nodeDesc +
6d61b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->extentsFileInfo.nodeSize - 2 );
0f67c5 ¤
b90a9a ¤   for( recordIndex = 0; recordIndex < nodeDesc->ndNRecs; recordIndex++ )
a7c7a1 ¤   {
82152a ¤   ¤   HFSPlusExtentKey¤   ¤   *key;
271c42 ¤   ¤   HFSPlusExtentDescriptor¤*data;
915609 ¤   ¤   PGPUInt32¤  ¤   ¤   ¤   foundForkBlocks;
8c1d47 ¤   ¤   ProblemForkInfo¤¤   ¤   *forkInfo;
f11b52 ¤   ¤
b00e11 ¤   ¤   key = (HFSPlusExtentKey *) ((PGPByte *) nodeDesc + *recordOffsetPtr);
091b52 ¤   ¤
f01f58 ¤   ¤   Require( key->keyLength == kHFSPlusExtentKeyMaximumLength );
0b920a ¤   ¤   Require( key->forkType == kDataForkType ||
c30ac4 ¤   ¤   ¤   ¤   ¤   key->forkType == kResourceForkType );
8527d1 ¤   ¤   Require( key->fileID < wcb->hfsPlus.vh.nextCatalogID );
af67c5 ¤
ab4c57 ¤   ¤   data = (HFSPlusExtentDescriptor *) ( (PGPByte *) key +
9287ba ¤   ¤   ¤   ¤   ¤   key->keyLength + 2 );
d01b52 ¤   ¤
0bfaa9 ¤   ¤   /* Find the fork in the problem file list. */
37f9ec ¤   ¤   forkInfo = FindProblemForkInfo( wcb, key->fileID, key->forkType );
ca08e2 ¤   ¤   if( IsntNull( forkInfo ) )
9b5b34 ¤   ¤   {
628586 ¤   ¤   ¤   err = ScanHFSPlusExtentRecord( wcb, data, &foundForkBlocks );
dc6108 ¤   ¤   ¤   if( IsntErr( err ) )
eef776 ¤   ¤   ¤   {
6fbe96 ¤   ¤   ¤   ¤   /* Accumulate these extents into the problem fork list */
c4eead ¤   ¤   ¤   ¤   err = RememberProblemForkExtents( forkInfo, key->startBlock,
7e00be ¤   ¤   ¤   ¤   ¤   ¤   ¤   (ExtentRecord *) data );
23a3a6 ¤   ¤   ¤   }
d40fe4 ¤   ¤   }
fc0e1d ¤   ¤   else
b85b34 ¤   ¤   {
18f273 ¤   ¤   ¤   pgpDebugMsg("\pFound extent record with no matching catalog entry");
c8a124 ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
4d0fe4 ¤   ¤   }
861b52 ¤   ¤
bc03ef ¤   ¤   if( IsErr( err ) )
79cdcb ¤   ¤   ¤   break;
6e87c7 ¤   ¤   ¤
6cc3ac ¤   ¤   --recordOffsetPtr;
d29371 ¤   }
c667c5 ¤
c7deb7 ¤   return( err );
46efe6 }
ccaf5a
--b9bc 00014e93c4b40120251 Page 37 of pgpMacVolumeWiping.c
e62473 ¤   static OSStatus
e66089 ScanHFSPlusExtentsFileIndexNode(
d0ebb3 ¤   const WipeControlBlock ¤*wcb,
3f7102 ¤   const NodeDescriptor ¤  *nodeDesc)
18bb36 {
887ad4 ¤   PGPUInt16¤  *recordOffsetPtr;
14819d ¤   PGPUInt32¤  recordIndex;
fd67c5 ¤
0367e3 ¤   Require( nodeDesc->ndType == kBTreeIndexNodeType );
ead2f3 ¤   Require( nodeDesc->ndNHeight != 1 );
95806c ¤   Require( nodeDesc->ndNRecs != 0 );
94af5a
915e08 ¤   recordOffsetPtr = (PGPUInt16 *) ((PGPByte *) nodeDesc +
ce61b6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->extentsFileInfo.nodeSize - 2 );
0e67c5 ¤
460a9a ¤   for( recordIndex = 0; recordIndex < nodeDesc->ndNRecs; recordIndex++ )
b0c7a1 ¤   {
62b4fa ¤   ¤   HFSPlusExtentKey¤   *key;
448c01 ¤   ¤   PGPUInt32¤  ¤   ¤   nodeIndexOffset;
b99e9d ¤   ¤   UInt32¤ ¤   ¤   ¤   *nodeIndexPtr;
c81b52 ¤   ¤
1d0e11 ¤   ¤   key = (HFSPlusExtentKey *) ((PGPByte *) nodeDesc + *recordOffsetPtr);
0b1b52 ¤   ¤
f0c776 ¤   ¤   Require( key->keyLength == kHFSExtentKeyMaximumLength );
11920a ¤   ¤   Require( key->forkType == kDataForkType ||
5a0ac4 ¤   ¤   ¤   ¤   ¤   key->forkType == kResourceForkType );
3e27d1 ¤   ¤   Require( key->fileID < wcb->hfsPlus.vh.nextCatalogID );
07ae30 ¤   ¤   ¤   ¤   ¤
d903f5 ¤   ¤   /* Data is padded to an even boundary */
a68978 ¤   ¤   nodeIndexOffset = key->keyLength + 1;
e4bdf9 ¤   ¤   if( ( nodeIndexOffset & 1 ) != 0 )
d8bcae ¤   ¤   ¤   ++nodeIndexOffset;
6587c7 ¤   ¤   ¤
41848f ¤   ¤   nodeIndexPtr = (UInt32 *) ( (PGPByte *) key + nodeIndexOffset );
2c1b52 ¤   ¤
254410 ¤   ¤   Require( *nodeIndexPtr > 0 );
cf6ed5 ¤   ¤   Require( *nodeIndexPtr < wcb->extentsFileInfo.numNodes );
b09408 ¤   ¤   Require( pgpTestBit( wcb->extentsFileInfo.nodeBitmap,
53e059 ¤   ¤   ¤   ¤   ¤   *nodeIndexPtr ) );
03ae30 ¤   ¤   ¤   ¤   ¤
37c3ac ¤   ¤   --recordOffsetPtr;
079371 ¤   }
be67c5 ¤
5979ad ¤   return( noErr );
e9efe6 }
baaf5a
f12473 ¤   static OSStatus
914608 ScanHFSPlusExtentsFile(WipeControlBlock *wcb)
20bb36 {
816792 ¤   OSStatus¤   err = noErr;
a167c5 ¤
028dc2 ¤   /* Account for extents file allocation blocks. */
0267c5 ¤
b8cefc ¤   err = ScanHFSPlusFileFork( wcb, kHFSExtentsFileID, kDataForkType,
51cfec ¤   ¤   ¤   ¤   &wcb->hfsPlus.vh.extentsFile );
3967c5 ¤
f4ee03 ¤   if( IsntErr( err ) )
4ec7a1 ¤   {
a3fd5e ¤   ¤   PGPUInt32¤  remainingNodes;
b47f46 ¤   ¤   PGPUInt32¤  btNodeIndex;
6df706 ¤   ¤   PGPUInt32¤  readStartNode;
3b9861 ¤   ¤   PGPUInt32¤  numHeaderNodes;
779a5c ¤   ¤   PGPUInt32¤  sectorsPerNode;
9c1b52 ¤   ¤
141b17 ¤   ¤   /*
856e85 ¤   ¤   ** Loop over all records in the catalog. For each record, we validate
3056de ¤   ¤   ** the format of each record and set bits in the volume bit map. Error
b35baa ¤   ¤   ** if there are already any bits set in the volume bit map.
f65c12 ¤   ¤   */
621b52 ¤   ¤
35d746 ¤   ¤   btNodeIndex¤¤   = 0;
145bf2 ¤   ¤   readStartNode¤  = 0;
--20da 0004eaed94640120251 Page 38 of pgpMacVolumeWiping.c
17e540 ¤   ¤   numHeaderNodes¤ = 0;
988132 ¤   ¤   sectorsPerNode¤ = wcb->extentsFileInfo.nodeSize / kDiskSectorSize;
021b52 ¤   ¤
6c36d9 ¤   ¤   remainingNodes = wcb->extentsFileInfo.numNodes;
88e636 ¤   ¤   while( remainingNodes != 0 && IsntErr( err ) )
b75b34 ¤   ¤   {
48cbf8 ¤   ¤   ¤   PGPUInt32¤  nodesToRead;
ca87c7 ¤   ¤   ¤
7dde48 ¤   ¤   ¤   nodesToRead = wcb->ioBufferSize / wcb->extentsFileInfo.nodeSize;
832277 ¤   ¤   ¤   if( nodesToRead > remainingNodes )
044f76 ¤   ¤   ¤   ¤   nodesToRead = remainingNodes;
f42b85 ¤   ¤   ¤   ¤
d95e04 ¤   ¤   ¤   err = WCBReadBTreeNodes( wcb, &wcb->extentsFileInfo,·
6a2731 ¤   ¤   ¤   ¤   ¤   ¤   readStartNode, nodesToRead, wcb->ioBuffer );
ce6108 ¤   ¤   ¤   if( IsntErr( err ) )
fff776 ¤   ¤   ¤   {
5dfea4 ¤   ¤   ¤   ¤   PGPUInt32¤  ¤   nodeIndex;
1ec564 ¤   ¤   ¤   ¤   NodeDescriptor¤ *nodeDesc = (NodeDescriptor *) wcb->ioBuffer;
c12b85 ¤   ¤   ¤   ¤
281c40 ¤   ¤   ¤   ¤   for( nodeIndex = 0; nodeIndex < nodesToRead; nodeIndex++ )
2072c3 ¤   ¤   ¤   ¤   {
211d5a ¤   ¤   ¤   ¤   ¤   if( pgpTestBit( wcb->extentsFileInfo.nodeBitmap,
9b1c90 ¤   ¤   ¤   ¤   ¤   ¤   ¤   btNodeIndex ) )
c04859 ¤   ¤   ¤   ¤   ¤   {
c5618c ¤   ¤   ¤   ¤   ¤   ¤   switch( nodeDesc->ndType )
4e8fec ¤   ¤   ¤   ¤   ¤   ¤   {
ce2713 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeLeafNodeType:
90823f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ScanHFSPlusExtentsFileLeafNode( wcb,
4b6270 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nodeDesc );
18a4d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsToWipe += sectorsPerNode;
eecd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
e6da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
8fa132 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeIndexNodeType:
a7ad60 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = ScanHFSPlusExtentsFileIndexNode( wcb,
9c6270 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nodeDesc );
5ca4d5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsToWipe += sectorsPerNode;
7dcd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
33531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
e0b94b ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeMapNodeType:
230253 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* Don't wipe or validate map nodes */
5ccd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
49da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
c80e7b ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeHeaderNodeType:
cdf14a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* Already validated header node */
c40a9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ++numHeaderNodes;
4078b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( numHeaderNodes > 1 )
b631b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
34f125 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDebugMsg(
4fd892 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   "Found multiple extents-Tree header nodes" );
b9023a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
636560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
13cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
e694aa ¤   ¤   ¤   ¤   ¤   ¤
51d8da ¤   ¤   ¤   ¤   ¤   ¤   ¤   default:
149e37 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDebugMsg( "Unknown catalog node type" );
90023a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
f7cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
31db3c ¤   ¤   ¤   ¤   ¤   ¤   }
2e1c89 ¤   ¤   ¤   ¤   ¤   }
a14bd6 ¤   ¤   ¤   ¤   ¤   else
894859 ¤   ¤   ¤   ¤   ¤   {
43d6a8 ¤   ¤   ¤   ¤   ¤   ¤   /* Free B-Tree node */
7d29e6 ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsToWipe += sectorsPerNode;
871c89 ¤   ¤   ¤   ¤   ¤   }
8bae30 ¤   ¤   ¤   ¤   ¤
9b598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
584859 ¤   ¤   ¤   ¤   ¤   {
fb2965 ¤   ¤   ¤   ¤   ¤   ¤   VolumeWipeEvent¤event;
421b52 ¤   ¤
dd1d06 ¤   ¤   ¤   ¤   ¤   ¤   event.type = kVolumeWipeEvent_GatheringInfo;
d167c5 ¤
4ef132 ¤   ¤   ¤   ¤   ¤   ¤   err = SendEvent( wcb, &event );
--3c68 000f60e487d40120251 Page 39 of pgpMacVolumeWiping.c
b61c89 ¤   ¤   ¤   ¤   ¤   }
2cae30 ¤   ¤   ¤   ¤   ¤
26da4b ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
5100eb ¤   ¤   ¤   ¤   ¤   ¤   break;
382b85 ¤   ¤   ¤   ¤
a9597d ¤   ¤   ¤   ¤   ¤   ++btNodeIndex;
69ae30 ¤   ¤   ¤   ¤   ¤
9aab9b ¤   ¤   ¤   ¤   ¤   nodeDesc = (NodeDescriptor *) ((PGPByte *) nodeDesc +
78b323 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->extentsFileInfo.nodeSize);
152613 ¤   ¤   ¤   ¤   }
e2a3a6 ¤   ¤   ¤   }
1887c7 ¤   ¤   ¤
2b1600 ¤   ¤   ¤   remainingNodes ¤-= nodesToRead;
3c132d ¤   ¤   ¤   readStartNode¤  += nodesToRead;
c90fe4 ¤   ¤   }
e89371 ¤   }
8e67c5 ¤
41deb7 ¤   return( err );
f3efe6 }
13af5a
fa2473 ¤   static OSStatus
aef541 GatherHFSPlusVolumeInfo(WipeControlBlock *wcb)
0abb36 {
7d6792 ¤   OSStatus¤   err = noErr;
6767c5 ¤
abd8af ¤   /*
9bed7c ¤   ** The volume may be an HFS+ volume in an HFS wrapper or an entire
273872 ¤   ** HFS+ volume. Read the MDB (Sector 2)
869faa ¤   */
5967c5 ¤
5c9d78 ¤   err = WCBReadSectors( wcb, 2, 1, wcb->ioBuffer );
76ee03 ¤   if( IsntErr( err ) )
42c7a1 ¤   {
e125b8 ¤   ¤   HFSMasterDirectoryBlock¤*mdb;
d71b52 ¤   ¤
60ecd4 ¤   ¤   mdb = (HFSMasterDirectoryBlock *) wcb->ioBuffer;
2d1b52 ¤   ¤
cf88e7 ¤   ¤   if( mdb->drSigWord == kHFSSigWord )
825b34 ¤   ¤   {
ecdbd7 ¤   ¤   ¤   err = ValidateHFSMasterDirectoryBlock( mdb );
416108 ¤   ¤   ¤   if( IsntErr( err ) )
7df776 ¤   ¤   ¤   {
2ba974 ¤   ¤   ¤   ¤   PGPUInt32¤  sectorsPerBlock;
7a2b85 ¤   ¤   ¤   ¤
b0980e ¤   ¤   ¤   ¤   /*
7dcff7 ¤   ¤   ¤   ¤   ** The MDB on an HFS+ wrapped volume will tell us where
2d7b18 ¤   ¤   ¤   ¤   ** the HFS+ volume starts
21df0b ¤   ¤   ¤   ¤   */
562b85 ¤   ¤   ¤   ¤
0e07e7 ¤   ¤   ¤   ¤   Require( mdb->drEmbedSigWord == kHFSPlusSigWord );
de2b85 ¤   ¤   ¤   ¤
c7273d ¤   ¤   ¤   ¤   sectorsPerBlock = mdb->drAlBlkSiz / kDiskSectorSize;
f32b85 ¤   ¤   ¤   ¤
91994a ¤   ¤   ¤   ¤   wcb->firstSectorBias = ( mdb->drEmbedExtent.startBlock *
350e22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sectorsPerBlock ) + mdb->drAlBlSt;
b1a3a6 ¤   ¤   ¤   }
1487c7 ¤   ¤   ¤
b16108 ¤   ¤   ¤   if( IsntErr( err ) )
cff776 ¤   ¤   ¤   {
5d980e ¤   ¤   ¤   ¤   /*
9b5be5 ¤   ¤   ¤   ¤   ** Now that wcb->firstSectorBias is set up correctly,
cabe29 ¤   ¤   ¤   ¤   ** read sector 2 again to get the HFSPlusVolumeHeader
dadf0b ¤   ¤   ¤   ¤   */
f42b85 ¤   ¤   ¤   ¤
1bc016 ¤   ¤   ¤   ¤   err = WCBReadSectors( wcb, 2, 1, wcb->ioBuffer );
b8a3a6 ¤   ¤   ¤   }
840fe4 ¤   ¤   }
cf1b52 ¤   ¤
f2da5e ¤   ¤   if( IsntErr( err ) )
505b34 ¤   ¤   {
88b33e ¤   ¤   ¤   wcb->hfsPlus.vh = *((HFSPlusVolumeHeader *) wcb->ioBuffer);
f687c7 ¤   ¤   ¤
--cc3e 00082adc92640120251 Page 40 of pgpMacVolumeWiping.c
cdcbef ¤   ¤   ¤   err = ValidateHFSPlusVolumeHeader( &wcb->hfsPlus.vh );
776108 ¤   ¤   ¤   if( IsntErr( err ) )
79f776 ¤   ¤   ¤   {
c56eef ¤   ¤   ¤   ¤   /* Compute some common values based on MDB */
3b2b85 ¤   ¤   ¤   ¤
e02713 ¤   ¤   ¤   ¤   wcb->numBlocks¤ ¤   ¤   = wcb->hfsPlus.vh.totalBlocks;
d035fd ¤   ¤   ¤   ¤   wcb->numFreeBlocks¤ ¤   = wcb->hfsPlus.vh.freeBlocks;
c3477a ¤   ¤   ¤   ¤   wcb->blockSize ¤¤   ¤   = wcb->hfsPlus.vh.blockSize;
a0bfaa ¤   ¤   ¤   ¤   wcb->numSectorsPerBlock¤= wcb->blockSize / kDiskSectorSize;
c265b4 ¤   ¤   ¤   ¤   wcb->numVolumeSectors ¤ = wcb->numSectorsPerBlock *
5f38fe ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numBlocks;
9fa3a6 ¤   ¤   ¤   }
de0fe4 ¤   ¤   }
3a9371 ¤   }
e4af5a
6eee03 ¤   if( IsntErr( err ) )
46c7a1 ¤   {
e372ab ¤   ¤   /* "Open" BTree files and get extent info for each */
fa41a3 ¤   ¤   err = WCBOpenBTreeFile( wcb, wcb->catalogFileInfo.fileRefNum,
9adb06 ¤   ¤   ¤   ¤   ¤   ¤   wcb->hfsPlus.vh.catalogFile.logicalSize,
054d84 ¤   ¤   ¤   ¤   ¤   ¤   &wcb->catalogFileInfo );
f6da5e ¤   ¤   if( IsntErr( err ) )
a05b34 ¤   ¤   {
bbc89a ¤   ¤   ¤   err = WCBOpenBTreeFile( wcb, wcb->extentsFileInfo.fileRefNum,
a50b4e ¤   ¤   ¤   ¤   ¤   ¤   wcb->hfsPlus.vh.extentsFile.logicalSize,
1581fe ¤   ¤   ¤   ¤   ¤   ¤   &wcb->extentsFileInfo );
600fe4 ¤   ¤   }
3a9371 ¤   }
95af5a
7adeb7 ¤   return( err );
0befe6 }
62af5a
e1edde #pragma mark [ --- Common Wiping --- ]
2eaf5a
5933c8 ¤   static void
c6853d WipeMemory(
4ea0a0 ¤   WipeControlBlock¤   *wcb,
36295f ¤   PGPUInt32¤  ¤   ¤   wipeCount,
630070 ¤   PGPByte¤¤   ¤   ¤   *memory,
fc923d ¤   PGPUInt32¤  ¤   ¤   patternOffset)
33bb36 {
4cd976 ¤   PGPUInt32¤  bytesRemaining;
5bf855 ¤   PGPByte¤¤   *cur;
400828 ¤   PGPByte¤¤   *curPattern;
8ef33b ¤   PGPUInt32¤  bytesToWipe;
7b67c5 ¤
dc19cc ¤   pgpAssertAddrValid( wcb, WipeControlBlock );
6dfbca ¤   pgpAssertAddrValid( memory, PGPByte );
9331e7 ¤   pgpAssert( kNumPGPWipingPatternBytes == sizeof( PGPWipingPattern ) );
8767c5 ¤
39851d ¤   if( wipeCount == 0 )
1999bf ¤   ¤   return;
e967c5 ¤
3a517d ¤   if( patternOffset != 0 )
e5f939 ¤   ¤   patternOffset = patternOffset % kNumPGPWipingPatternBytes;
671b52 ¤   ¤
053db6 ¤   cur¤¤   ¤   ¤   = memory;
63dc79 ¤   curPattern¤ ¤   = &wcb->patternBuffer->bytes[patternOffset];
8949ce ¤   bytesToWipe¤¤   = kNumPGPWipingPatternBytes - patternOffset;
c57f3b ¤   bytesRemaining¤ = wipeCount;
c567c5 ¤
ea9ad7 ¤   while( bytesRemaining != 0 )
2cc7a1 ¤   {
073c1f ¤   ¤   if( bytesToWipe > bytesRemaining )
eed688 ¤   ¤   ¤   bytesToWipe = bytesRemaining;
9a87c7 ¤   ¤   ¤
28df9b ¤   ¤   pgpCopyMemory( curPattern, cur, bytesToWipe );
c667c5 ¤
6950c8 ¤   ¤   cur¤¤   ¤   ¤   += bytesToWipe;
aab8eb ¤   ¤   bytesRemaining¤ -= bytesToWipe;
43ff9b ¤   ¤   curPattern¤ ¤   = &wcb->patternBuffer->bytes[0];
8256c4 ¤   ¤   bytesToWipe ¤   = kNumPGPWipingPatternBytes;
--3a01 000e84da7e840120251 Page 41 of pgpMacVolumeWiping.c
a19371 ¤   }
c9efe6 }
a0af5a
3b5ceb /* This procedure assumes that wcb->ioBuffer contains the wiping pattern */
d1af5a
032473 ¤   static OSStatus
ff3aab WipeSectors(
eda0a0 ¤   WipeControlBlock¤   *wcb,
0a8191 ¤   PGPUInt32¤  ¤   ¤   startingSector,
186741 ¤   PGPUInt32¤  ¤   ¤   numSectors,
8c1b41 ¤   PGPUInt32¤  ¤   ¤   firstSectorOffset)
a7bb36 {
026792 ¤   OSStatus¤   err = noErr;
661c8f ¤   PGPUInt32¤  sectorsPerBuffer;
481626 ¤   PGPUInt32¤  curSector;
4967c5 ¤
d14e51 ¤   if( numSectors == 0 )
c9c87c ¤   ¤   return( noErr );
da67c5 ¤
b8df39 ¤   curSector ¤ ¤   ¤   = startingSector;
79c3e3 ¤   sectorsPerBuffer ¤  = wcb->ioBufferSize / kDiskSectorSize;
9067c5 ¤
0dd89d ¤   if( firstSectorOffset != 0 )
62c7a1 ¤   {
da440f ¤   ¤   pgpAssert( firstSectorOffset < kDiskSectorSize );
391b52 ¤   ¤
903605 ¤   ¤   err = WCBReadSectors( wcb, curSector, 1, wcb->sectorBuffer );
87da5e ¤   ¤   if( IsntErr( err ) )
a15b34 ¤   ¤   {
a6e2ed ¤   ¤   ¤   WipeMemory( wcb, kDiskSectorSize - firstSectorOffset,
d07ac7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->sectorBuffer + firstSectorOffset,
38aa72 ¤   ¤   ¤   ¤   ¤   ¤   ¤   firstSectorOffset );
6e87c7 ¤   ¤   ¤
8675b2 ¤   ¤   ¤   err = WCBWriteSectors( wcb, startingSector, 1, wcb->sectorBuffer );
226108 ¤   ¤   ¤   if( IsntErr( err ) )
1af776 ¤   ¤   ¤   {
4e7a83 ¤   ¤   ¤   ¤   ++wcb->numSectorsWiped;
43f975 ¤   ¤   ¤   ¤   --numSectors;
c7e649 ¤   ¤   ¤   ¤   ++curSector;
bd87c7 ¤   ¤   ¤
1d1411 ¤   ¤   ¤   ¤   err = DoProgressEvent( wcb );
fca3a6 ¤   ¤   ¤   }
600fe4 ¤   ¤   }
6b9371 ¤   }
e367c5 ¤
76ee03 ¤   if( IsntErr( err ) )
7fc7a1 ¤   {
53219b ¤   ¤   while( numSectors != 0 )
655b34 ¤   ¤   {
1498cd ¤   ¤   ¤   PGPUInt32¤  sectorsToWipe;
fd87c7 ¤   ¤   ¤
4ba4c5 ¤   ¤   ¤   sectorsToWipe = numSectors;
ace214 ¤   ¤   ¤   if( sectorsToWipe > sectorsPerBuffer )
aa4554 ¤   ¤   ¤   ¤   sectorsToWipe = sectorsPerBuffer;
302b85 ¤   ¤   ¤   ¤
d272e7 ¤   ¤   ¤   err = WCBWriteSectors( wcb, curSector, sectorsToWipe,
3c0858 ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->ioBuffer );
f26108 ¤   ¤   ¤   if( IsntErr( err ) )
0df776 ¤   ¤   ¤   {
02aa8b ¤   ¤   ¤   ¤   wcb->numSectorsWiped += sectorsToWipe;
722b85 ¤   ¤   ¤   ¤
7c1411 ¤   ¤   ¤   ¤   err = DoProgressEvent( wcb );
8ea3a6 ¤   ¤   ¤   }
ee87c7 ¤   ¤   ¤
8717c7 ¤   ¤   ¤   if( IsErr( err ) )
7ff622 ¤   ¤   ¤   ¤   break;
ae87c7 ¤   ¤   ¤
2bee1d ¤   ¤   ¤   numSectors ¤-= sectorsToWipe;
6c68e5 ¤   ¤   ¤   curSector¤  += sectorsToWipe;
0b0fe4 ¤   ¤   }
7c9371 ¤   }
e867c5 ¤
--8a16 00069f0b02740120251 Page 42 of pgpMacVolumeWiping.c
afdeb7 ¤   return( err );
b7efe6 }
35af5a
fc2473 ¤   static OSStatus
8fd0a7 WipeFreeBlocks(WipeControlBlock *wcb)
52bb36 {
526792 ¤   OSStatus¤   err = noErr;
fb9d5d ¤   PGPUInt32¤  blockIndex;
fd67c5 ¤
1b8a99 ¤   /* Fill the ioBuffer with the wiping pattern */
f39985 ¤   pgpCopyPattern( &wcb->patternBuffer->bytes[0],
ad0946 ¤   ¤   ¤   ¤   kNumPGPWipingPatternBytes, wcb->ioBuffer,
e642f8 ¤   ¤   ¤   ¤   wcb->ioBufferSize );
2767c5 ¤
567fad ¤   for( blockIndex = 0; blockIndex < wcb->numBlocks; ++blockIndex )
09c7a1 ¤   {
02185b ¤   ¤   if( ! pgpTestBit( wcb->volumeBitmap, blockIndex ) )
ab5b34 ¤   ¤   {
23555c ¤   ¤   ¤   PGPUInt32¤  usedBlockIndex;
20308a ¤   ¤   ¤   PGPUInt32¤  startingSector;
445755 ¤   ¤   ¤   PGPUInt32¤  numSectors;
cb87c7 ¤   ¤   ¤
347536 ¤   ¤   ¤   /* Find next used block */¤
7f67c5 ¤
1b287c ¤   ¤   ¤   usedBlockIndex = blockIndex + 1;
b4e9d6 ¤   ¤   ¤   while( usedBlockIndex < wcb->numBlocks )
4ef776 ¤   ¤   ¤   {
541d55 ¤   ¤   ¤   ¤   if( pgpTestBit( wcb->volumeBitmap, usedBlockIndex ) )
8072c3 ¤   ¤   ¤   ¤   {
c214c3 ¤   ¤   ¤   ¤   ¤   break;
9a2613 ¤   ¤   ¤   ¤   }
30fa07 ¤   ¤   ¤   ¤   else
6772c3 ¤   ¤   ¤   ¤   {
d848e2 ¤   ¤   ¤   ¤   ¤   ++usedBlockIndex;
ce2613 ¤   ¤   ¤   ¤   }
77a3a6 ¤   ¤   ¤   }
7787c7 ¤   ¤   ¤
6ece0d ¤   ¤   ¤   /* Convert alloc blocks to disk blocks */
6e87c7 ¤   ¤   ¤
711c3e ¤   ¤   ¤   startingSector ¤= WCBBlockToSector( wcb, blockIndex );
53b467 ¤   ¤   ¤   numSectors¤ ¤   = ( usedBlockIndex - blockIndex ) *
002844 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsPerBlock;
6887c7 ¤   ¤   ¤
d89fd9 ¤   ¤   ¤   err = WipeSectors( wcb, startingSector, numSectors, 0 );
6817c7 ¤   ¤   ¤   if( IsErr( err ) )
52f622 ¤   ¤   ¤   ¤   break;
db87c7 ¤   ¤   ¤
a94d84 ¤   ¤   ¤   /* for() loop will increment blockIndex */
914fb0 ¤   ¤   ¤   blockIndex = usedBlockIndex;·
8a0fe4 ¤   ¤   }
0f9371 ¤   }
5d67c5 ¤
cfdeb7 ¤   return( err );
00efe6 }
bfaf5a
802473 ¤   static OSStatus
721e22 WipeRanges(WipeControlBlock *wcb)
0bbb36 {
c06792 ¤   OSStatus¤   err = noErr;
671c24 ¤   PGPUInt32¤  rangeIndex;
d667c5 ¤
008a99 ¤   /* Fill the ioBuffer with the wiping pattern */
289985 ¤   pgpCopyPattern( &wcb->patternBuffer->bytes[0],
9c0946 ¤   ¤   ¤   ¤   kNumPGPWipingPatternBytes, wcb->ioBuffer,
ee42f8 ¤   ¤   ¤   ¤   wcb->ioBufferSize );
3f67c5 ¤
a9fd77 ¤   /* Sort the range list for better seeking performance */
e8ef93 ¤   if( IsntNull( wcb->wipeRangeList ) )
99c7a1 ¤   {
722016 ¤   ¤   SortWipeRanges( wcb->wipeRangeList, wcb->numWipeRanges,
75d1d1 ¤   ¤   ¤   ¤   ¤   CompareWipeRanges, NULL );
699371 ¤   }
--d5a1 000613c71d640120251 Page 43 of pgpMacVolumeWiping.c
2a67c5 ¤
4efc9f ¤   for( rangeIndex = 0; rangeIndex < wcb->numWipeRanges; ++rangeIndex )
26c7a1 ¤   {
f05a8f ¤   ¤   WipeRange¤  *range = &wcb->wipeRangeList[rangeIndex];
d81b52 ¤   ¤
258fe4 ¤   ¤   err = WipeSectors( wcb, range->startSector, range->numSectors,
49f9ff ¤   ¤   ¤   ¤   ¤   range->firstSectorOffset );
3c03ef ¤   ¤   if( IsErr( err ) )
4ecdcb ¤   ¤   ¤   break;
2a9371 ¤   }
1caf5a
b9deb7 ¤   return( err );
38efe6 }
11af5a
ee33c8 ¤   static void
1b95b5 WipeBTreeNodeFreeSpace(
ce49f8 ¤   WipeControlBlock ¤  *wcb,
e84ea5 ¤   NodeDescriptor ¤¤   *nodeDesc,
baa68b ¤   PGPUInt32¤  ¤   ¤   nodeSize)
5dbb36 {
047ad4 ¤   PGPUInt16¤  *recordOffsetPtr;
e4819d ¤   PGPUInt32¤  recordIndex;
85119f ¤   PGPByte¤¤   *wipeStart;
f6851a ¤   PGPByte¤¤   *wipeEndPlusOne;
4c928e ¤   PGPUInt32¤  wipeCount;
6b2d5a ¤   PGPUInt32¤  patternOffset;
6467c5 ¤
cefc89 ¤   /* Index past the last record so we can wipe the remaining free space */
7c67c5 ¤
e740b7 ¤   recordOffsetPtr = (PGPUInt16 *) ((PGPByte *) nodeDesc + nodeSize - 2);
6767c5 ¤
c30a9a ¤   for( recordIndex = 0; recordIndex < nodeDesc->ndNRecs; recordIndex++ )
a2c7a1 ¤   {
8ec3ac ¤   ¤   --recordOffsetPtr;
d79371 ¤   }
9767c5 ¤
4dd8af ¤   /*
324dcd ¤   ** Wipe remaining free bytes in node, if any. *recordOffsetPtr points to
4f58c5 ¤   ** start of free space in node or itself if there is no free space
f79faa ¤   */
6167c5 ¤
93a3f3 ¤   wipeStart ¤ ¤   = (PGPByte *) nodeDesc + *recordOffsetPtr;
fd0a31 ¤   wipeEndPlusOne¤ = (PGPByte *) recordOffsetPtr;
9e67c5 ¤
a33c85 ¤   if( wipeStart < wipeEndPlusOne )
a3c7a1 ¤   {
b54343 ¤   ¤   wipeCount ¤ ¤   = wipeEndPlusOne - wipeStart;
81a442 ¤   ¤   patternOffset¤  = wipeStart - (PGPByte *) nodeDesc;
c31b52 ¤   ¤
53ed3f ¤   ¤   WipeMemory( wcb, wipeCount, wipeStart, patternOffset );
2b9371 ¤   }
00efe6 }
acaf5a
962473 ¤   static OSStatus
7b648f WipeBTreeFile(
229c77 ¤   WipeControlBlock ¤  ¤   *wcb,
2cf981 ¤   const BTreeFileInfo¤¤   *bTreeInfo,
c6051c ¤   WipeBTreeNodeProcPtr¤   wipeNodeProc)
10bb36 {
166792 ¤   OSStatus¤   err = noErr;
9776a2 ¤   PGPUInt32¤  remainingNodes;
65c410 ¤   PGPUInt32¤  btNodeIndex;
f07b79 ¤   PGPUInt32¤  readStartNode;
4311a0 ¤   PGPUInt32¤  sectorsPerNode;
a367c5 ¤
87d8af ¤   /*
6def36 ¤   ** Loop over all records in the catalog. For each record, we call the
abc3bf ¤   ** node wiping proc for leaf and index nodes.
b99faa ¤   */
1e67c5 ¤
7ae31b ¤   btNodeIndex¤¤   = 0;
616faf ¤   readStartNode¤  = 0;
--196b 0004b0710b540120251 Page 44 of pgpMacVolumeWiping.c
66049c ¤   sectorsPerNode¤ = bTreeInfo->nodeSize / kDiskSectorSize;
5867c5 ¤
045040 ¤   remainingNodes = bTreeInfo->numNodes;
29f711 ¤   while( remainingNodes != 0 && IsntErr( err ) )
f5c7a1 ¤   {
9af690 ¤   ¤   PGPUInt32¤  nodesToRead;
d11b52 ¤   ¤
a57222 ¤   ¤   nodesToRead = wcb->ioBufferSize / bTreeInfo->nodeSize;
1fb3ef ¤   ¤   if( nodesToRead > remainingNodes )
5376b3 ¤   ¤   ¤   nodesToRead = remainingNodes;
7687c7 ¤   ¤   ¤
e59d8b ¤   ¤   err = WCBReadBTreeNodes( wcb, bTreeInfo, readStartNode, nodesToRead,
110ee0 ¤   ¤   ¤   ¤   ¤   ¤   wcb->ioBuffer );
eeda5e ¤   ¤   if( IsntErr( err ) )
415b34 ¤   ¤   {
67f0e8 ¤   ¤   ¤   PGPUInt32¤  ¤   nodeIndex;
a7bc2e ¤   ¤   ¤   NodeDescriptor¤ *nodeDesc = (NodeDescriptor *) wcb->ioBuffer;
3e87c7 ¤   ¤   ¤
c0cceb ¤   ¤   ¤   for( nodeIndex = 0; nodeIndex < nodesToRead; nodeIndex++ )
a8f776 ¤   ¤   ¤   {
704cc8 ¤   ¤   ¤   ¤   if( pgpTestBit( bTreeInfo->nodeBitmap, btNodeIndex ) )
7272c3 ¤   ¤   ¤   ¤   {
81b93e ¤   ¤   ¤   ¤   ¤   switch( nodeDesc->ndType )
8e4859 ¤   ¤   ¤   ¤   ¤   {
f47408 ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeLeafNodeType:
010f33 ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeIndexNodeType:
74fbd3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   (*wipeNodeProc)( wcb, nodeDesc,
a22716 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   bTreeInfo->nodeSize );
890e2c ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsWiped += sectorsPerNode;
7f8c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
a694aa ¤   ¤   ¤   ¤   ¤   ¤
052f0a ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeMapNodeType:
381f5c ¤   ¤   ¤   ¤   ¤   ¤   case kBTreeHeaderNodeType:
39211d ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* Don't wipe header or map nodes */
dd8c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
bdae30 ¤   ¤   ¤   ¤   ¤
5fe5b2 ¤   ¤   ¤   ¤   ¤   ¤   default:
962271 ¤   ¤   ¤   ¤   ¤   ¤   ¤   pgpDebugMsg( "Unknown wipe node type" );
d38c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
7e1c89 ¤   ¤   ¤   ¤   ¤   }
de2613 ¤   ¤   ¤   ¤   }
b0fa07 ¤   ¤   ¤   ¤   else
9272c3 ¤   ¤   ¤   ¤   {
043380 ¤   ¤   ¤   ¤   ¤   WipeMemory( wcb, bTreeInfo->nodeSize,
918d75 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPByte *) nodeDesc, 0 );
c7f75e ¤   ¤   ¤   ¤   ¤   wcb->numSectorsWiped += sectorsPerNode;
ef2613 ¤   ¤   ¤   ¤   }
212b85 ¤   ¤   ¤   ¤
a61411 ¤   ¤   ¤   ¤   err = DoProgressEvent( wcb );
b49bb8 ¤   ¤   ¤   ¤   if( IsErr( err ) )
e114c3 ¤   ¤   ¤   ¤   ¤   break;
2d87c7 ¤   ¤   ¤
20d502 ¤   ¤   ¤   ¤   ++btNodeIndex;
c02b85 ¤   ¤   ¤   ¤
3bbd2d ¤   ¤   ¤   ¤   nodeDesc = (NodeDescriptor *) ((PGPByte *) nodeDesc +
737543 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   bTreeInfo->nodeSize);
6ca3a6 ¤   ¤   ¤   }
5487c7 ¤   ¤   ¤
486108 ¤   ¤   ¤   if( IsntErr( err ) )
66f776 ¤   ¤   ¤   {
887405 ¤   ¤   ¤   ¤   err = WCBWriteBTreeNodes( wcb, bTreeInfo, readStartNode,
fbc92c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nodesToRead, wcb->ioBuffer );
cfa3a6 ¤   ¤   ¤   }
630fe4 ¤   ¤   }
4d1b52 ¤   ¤
789e66 ¤   ¤   remainingNodes ¤-= nodesToRead;
789b4b ¤   ¤   readStartNode¤  += nodesToRead;
f49371 ¤   }
0b67c5 ¤
17deb7 ¤   return( err );
03efe6 }
4baf5a
--c152 000760c7a0240120251 Page 45 of pgpMacVolumeWiping.c
e0af5a
c33c62 #pragma mark [ --- HFS Wiping --- ]
e0af5a
0a33c8 ¤   static void
9eecd1 WipeHFSCatalogFileLeafNode(
52a0a0 ¤   WipeControlBlock¤   *wcb,
084ea5 ¤   NodeDescriptor ¤¤   *nodeDesc,
28a68b ¤   PGPUInt32¤  ¤   ¤   nodeSize)
1cbb36 {
977ad4 ¤   PGPUInt16¤  *recordOffsetPtr;
56819d ¤   PGPUInt32¤  recordIndex;
d4119f ¤   PGPByte¤¤   *wipeStart;
78928e ¤   PGPUInt32¤  wipeCount;
942d5a ¤   PGPUInt32¤  patternOffset;
8967c5 ¤
ba081a ¤   recordOffsetPtr = (PGPUInt16 *) ((PGPByte *) nodeDesc + nodeSize - 2 );
c067c5 ¤
780a9a ¤   for( recordIndex = 0; recordIndex < nodeDesc->ndNRecs; recordIndex++ )
39c7a1 ¤   {
081627 ¤   ¤   HFSCatalogKey¤  ¤   *key;
98a852 ¤   ¤   PGPUInt32¤  ¤   ¤   dataOffset;
130c71 ¤   ¤   HFSCatalogRecord¤   *data;
441b52 ¤   ¤
16bb16 ¤   ¤   key = (HFSCatalogKey *) ((PGPByte *) nodeDesc + *recordOffsetPtr);
4b1b52 ¤   ¤
fd03f5 ¤   ¤   /* Data is padded to an even boundary */
0900bf ¤   ¤   dataOffset = key->keyLength + 1;
5a62e6 ¤   ¤   if( ( dataOffset & 1 ) != 0 )
99b17d ¤   ¤   ¤   ++dataOffset;
2c87c7 ¤   ¤   ¤
ac6c25 ¤   ¤   data = (HFSCatalogRecord *) ( (PGPByte *) key + dataOffset );
a7c62c ¤   ¤   switch( data->type )
275b34 ¤   ¤   {
c3c176 ¤   ¤   ¤   case kHFSFileRecord:
19112c ¤   ¤   ¤   case kHFSFolderRecord:
750e62 ¤   ¤   ¤   ¤   /* No free space to wipe in these records */
98f622 ¤   ¤   ¤   ¤   break;
7e2b85 ¤   ¤   ¤   ¤
a5f86a ¤   ¤   ¤   case kHFSFolderThreadRecord:
3f6e32 ¤   ¤   ¤   case kHFSFileThreadRecord:
aaf776 ¤   ¤   ¤   {
6085ab ¤   ¤   ¤   ¤   PGPUInt32¤  nameLength;
ac2b85 ¤   ¤   ¤   ¤
a404cf ¤   ¤   ¤   ¤   nameLength¤ = data->thread.nodeName[0];
22289d ¤   ¤   ¤   ¤   wipeCount ¤ = kHFSMaxFileNameChars - nameLength;
752b85 ¤   ¤   ¤   ¤
b48ba0 ¤   ¤   ¤   ¤   if( wipeCount > 0 )
ea72c3 ¤   ¤   ¤   ¤   {
ab7b28 ¤   ¤   ¤   ¤   ¤   wipeStart ¤ ¤   = &data->thread.nodeName[nameLength] + 1;
161347 ¤   ¤   ¤   ¤   ¤   patternOffset¤  = wipeStart - (PGPByte *) nodeDesc;
d2ae30 ¤   ¤   ¤   ¤   ¤
4b852f ¤   ¤   ¤   ¤   ¤   WipeMemory( wcb, wipeCount, wipeStart, patternOffset );
8c2613 ¤   ¤   ¤   ¤   }
2487c7 ¤   ¤   ¤
eaf622 ¤   ¤   ¤   ¤   break;
16a3a6 ¤   ¤   ¤   }
af2b85 ¤   ¤   ¤   ¤
28db68 ¤   ¤   ¤   default:
31fffa ¤   ¤   ¤   ¤   pgpDebugMsg( "Invalid leaf record type" );
93f622 ¤   ¤   ¤   ¤   break;
fa0fe4 ¤   ¤   }
1887c7 ¤   ¤   ¤
9dc3ac ¤   ¤   --recordOffsetPtr;
099371 ¤   }
b267c5 ¤
35096f ¤   WipeBTreeNodeFreeSpace( wcb, nodeDesc, nodeSize );
70efe6 }
4caf5a
8733c8 ¤   static void
ae3bef WipeHFSCatalogFileIndexNode(
a349f8 ¤   WipeControlBlock ¤  *wcb,
764ea5 ¤   NodeDescriptor ¤¤   *nodeDesc,
--74f2 0003cbd4a0140120251 Page 46 of pgpMacVolumeWiping.c
14a68b ¤   PGPUInt32¤  ¤   ¤   nodeSize)
4dbb36 {
0e7ad4 ¤   PGPUInt16¤  *recordOffsetPtr;
6d819d ¤   PGPUInt32¤  recordIndex;
e467c5 ¤
28081a ¤   recordOffsetPtr = (PGPUInt16 *) ((PGPByte *) nodeDesc + nodeSize - 2 );
1567c5 ¤
d10a9a ¤   for( recordIndex = 0; recordIndex < nodeDesc->ndNRecs; recordIndex++ )
ddc7a1 ¤   {
6409d3 ¤   ¤   HFSCatalogKey¤  *key;
5d87c6 ¤   ¤   PGPUInt32¤  ¤   nameLength;
0a3608 ¤   ¤   PGPUInt32¤  ¤   wipeCount;
4a1b52 ¤   ¤
5dbb16 ¤   ¤   key = (HFSCatalogKey *) ((PGPByte *) nodeDesc + *recordOffsetPtr);
171b52 ¤   ¤
43a803 ¤   ¤   nameLength¤ = key->nodeName[0];
2cd401 ¤   ¤   wipeCount ¤ = kHFSMaxFileNameChars - nameLength;
f71b52 ¤   ¤
97ad02 ¤   ¤   if( wipeCount > 0 )
9c5b34 ¤   ¤   {
24373d ¤   ¤   ¤   PGPByte¤¤   *wipeStart;
43e0d6 ¤   ¤   ¤   PGPUInt32¤  patternOffset;
1aaf5a
453f96 ¤   ¤   ¤   wipeStart ¤ ¤   = &key->nodeName[nameLength] + 1;
26605e ¤   ¤   ¤   patternOffset¤  = wipeStart - (PGPByte *) nodeDesc;
cd87c7 ¤   ¤   ¤
e8d051 ¤   ¤   ¤   WipeMemory( wcb, wipeCount, wipeStart, patternOffset );
f90fe4 ¤   ¤   }
5d87c7 ¤   ¤   ¤
93c3ac ¤   ¤   --recordOffsetPtr;
f49371 ¤   }
f767c5 ¤
57096f ¤   WipeBTreeNodeFreeSpace( wcb, nodeDesc, nodeSize );
67efe6 }
b2af5a
ef33c8 ¤   static void
b9c634 WipeHFSCatalogFileNode(
4049f8 ¤   WipeControlBlock ¤  *wcb,
db45e6 ¤   NodeDescriptor¤ ¤   *nodeDesc,
daa68b ¤   PGPUInt32¤  ¤   ¤   nodeSize)
49bb36 {
88e96d ¤   if( nodeDesc->ndType == kBTreeLeafNodeType )
20c7a1 ¤   {
13f2bf ¤   ¤   WipeHFSCatalogFileLeafNode( wcb, nodeDesc, nodeSize );
449371 ¤   }
04fbc0 ¤   else if( nodeDesc->ndType == kBTreeIndexNodeType )
aec7a1 ¤   {
4a4ae8 ¤   ¤   WipeHFSCatalogFileIndexNode( wcb, nodeDesc, nodeSize );
c29371 ¤   }
b40e24 ¤   else
dfc7a1 ¤   {
71977e ¤   ¤   pgpDebugMsg( "WipeHFSCatalogNode(): Invalid node type" );
789371 ¤   }
a0efe6 }
19af5a
f027a1 #pragma mark [ --- Processing --- ]
c1af5a
bc2473 ¤   static OSStatus
969998 BeginWipe(WipeControlBlock *wcb)
c7bb36 {
2b6792 ¤   OSStatus¤   err = noErr;
908280 ¤   UInt32¤ ¤   bufferSize;
fe1b52 ¤   ¤
7c3b80 ¤   /* Allocate our working buffer */
756907 ¤   wcb->ioBuffer = (PGPByte *) pgpNewPtrMost( kMaxIOBufferSize,
0e3866 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMinIOBufferSize,
5bcb02 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMemoryAllocationFlags,
0fa7c9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &bufferSize );
361831 ¤   if( IsntNull( wcb->ioBuffer ) )
f5c7a1 ¤   {
d4af25 ¤   ¤   wcb->ioBufferSize = bufferSize;
3c9371 ¤   }
--de85 0007a717ff740120251 Page 47 of pgpMacVolumeWiping.c
060e24 ¤   else
c2c7a1 ¤   {
a72a06 ¤   ¤   err = memFullErr;
cf9371 ¤   }
b467c5 ¤
45ee03 ¤   if( IsntErr( err ) )
f7c7a1 ¤   {
36e77a ¤   ¤   if( wcb->signature == kHFSSigWord )
785b34 ¤   ¤   {
c8e66a ¤   ¤   ¤   err = GatherHFSVolumeInfo( wcb );
bf0fe4 ¤   ¤   }
fb16d2 ¤   ¤   else if( wcb->signature == kHFSPlusSigWord )
ae5b34 ¤   ¤   {
11bd5e ¤   ¤   ¤   err = GatherHFSPlusVolumeInfo( wcb );
cf0fe4 ¤   ¤   }
150e1d ¤   ¤   else
e25b34 ¤   ¤   {
88382f ¤   ¤   ¤   pgpDebugMsg( "Unknown volume signature" );
cbcecc ¤   ¤   ¤   err = kWipingError_UnsupportedVolumeFormat;
0a0fe4 ¤   ¤   }
679371 ¤   }
9867c5 ¤
f6ee03 ¤   if( IsntErr( err ) )
5cc7a1 ¤   {
43dfe7 ¤   ¤   PGPSize¤allocationSize;
411b52 ¤   ¤
3305ea ¤   ¤   /* Allocate volume bit map */
ff1b52 ¤   ¤
87f14e ¤   ¤   allocationSize = ( wcb->numBlocks + 7 ) / 8;
791b52 ¤   ¤
65aa74 ¤   ¤   wcb->volumeBitmap = (PGPByte *) pgpAllocMac( allocationSize,
e80007 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMemoryAllocationFlags |
2d81b2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMacMemory_ClearBytes);
199eb7 ¤   ¤   if( IsNull( wcb->volumeBitmap ) )
fba352 ¤   ¤   ¤   err = memFullErr;
209371 ¤   }
5d67c5 ¤
1dee03 ¤   if( IsntErr( err ) )
68c7a1 ¤   {
8432e6 ¤   ¤   /* Try to unmount volume. An error is fatal if the volume is HFS+ */
b21b52 ¤   ¤
b5cf73 ¤   ¤   err = UnmountVol( NULL, wcb->vRefNum );
f5da5e ¤   ¤   if( IsntErr( err ) )
f15b34 ¤   ¤   {
11ebcf ¤   ¤   ¤   wcb->vRefNum = 0;
7687c7 ¤   ¤   ¤
114a0a ¤   ¤   ¤   wcb->catalogFileInfo.fileRefNum¤= 0;
f01623 ¤   ¤   ¤   wcb->extentsFileInfo.fileRefNum¤= 0;
680fe4 ¤   ¤   }
930e1d ¤   ¤   else
8f5b34 ¤   ¤   {
4df742 ¤   ¤   ¤   VolumeWipeEvent¤event;
eee700 ¤   ¤   ¤   OSStatus¤   ¤   tempErr;
6587c7 ¤   ¤   ¤
c86526 ¤   ¤   ¤   event.type = kVolumeWipeEvent_VolumeUnmountFailure;
7a00e3 ¤   ¤   ¤   event.unmountFailure.vRefNum¤   ¤   = wcb->vRefNum;
4cf28f ¤   ¤   ¤   event.unmountFailure.unmountError¤  = err;
ad87c7 ¤   ¤   ¤
2e7f99 ¤   ¤   ¤   tempErr = SendEvent( wcb, &event );
1c87c7 ¤   ¤   ¤
40ff2a ¤   ¤   ¤   if( wcb->signature == kHFSSigWord )
b5f776 ¤   ¤   ¤   {
ccc198 ¤   ¤   ¤   ¤   /* Not fatal if we cannot unmount HFS volume*/
6fe682 ¤   ¤   ¤   ¤   err = tempErr;
cca3a6 ¤   ¤   ¤   }
0cbb8c ¤   ¤   ¤   else
04f776 ¤   ¤   ¤   {
3448b4 ¤   ¤   ¤   ¤   /* Propogate error */
1ea3a6 ¤   ¤   ¤   }
670fe4 ¤   ¤   }
249371 ¤   }
7a67c5 ¤
--1b44 00058d2511540120251 Page 48 of pgpMacVolumeWiping.c
31ee03 ¤   if( IsntErr( err ) )
01c7a1 ¤   {
9ce77a ¤   ¤   if( wcb->signature == kHFSSigWord )
f25b34 ¤   ¤   {
f70dad ¤   ¤   ¤   err = ScanHFSCatalogFile( wcb );
cc6108 ¤   ¤   ¤   if( IsntErr( err ) )
6ef776 ¤   ¤   ¤   {
248321 ¤   ¤   ¤   ¤   err = ScanHFSExtentsFile( wcb );
39a3a6 ¤   ¤   ¤   }
f30fe4 ¤   ¤   }
1316d2 ¤   ¤   else if( wcb->signature == kHFSPlusSigWord )
9b5b34 ¤   ¤   {
479384 ¤   ¤   ¤   err = ScanHFSPlusCatalogFile( wcb );
ca6108 ¤   ¤   ¤   if( IsntErr( err ) )
fcf776 ¤   ¤   ¤   {
1b1c8e ¤   ¤   ¤   ¤   err = ScanHFSPlusExtentsFile( wcb );
97a3a6 ¤   ¤   ¤   }
bc87c7 ¤   ¤   ¤
ae7aad ¤   ¤   ¤   /*
398a0c ¤   ¤   ¤   ** Account for extra HFS+ volume format files. Note that the
f7db6d ¤   ¤   ¤   ** attributes file is not accounted for because
950ead ¤   ¤   ¤   ** GatherHFSPlusVolumeInfo*() should have already rejected a·
911dca ¤   ¤   ¤   ** non-empty attributes file
7d3da8 ¤   ¤   ¤   */
3987c7 ¤   ¤   ¤
cf6108 ¤   ¤   ¤   if( IsntErr( err ) )
d9f776 ¤   ¤   ¤   {
1e8f8f ¤   ¤   ¤   ¤   err = ScanHFSPlusFileFork( wcb, kHFSAllocationFileID,
2d65c0 ¤   ¤   ¤   ¤   ¤   ¤   kDataForkType, &wcb->hfsPlus.vh.allocationFile );
e75c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
d472c3 ¤   ¤   ¤   ¤   {
2d462e ¤   ¤   ¤   ¤   ¤   err = ScanHFSPlusFileFork( wcb, kHFSStartupFileID,
a1b198 ¤   ¤   ¤   ¤   ¤   ¤   kDataForkType, &wcb->hfsPlus.vh.startupFile );
f52613 ¤   ¤   ¤   ¤   }
66a3a6 ¤   ¤   ¤   }
df87c7 ¤   ¤   ¤
ea7aad ¤   ¤   ¤   /*
50c052 ¤   ¤   ¤   ** Finally, account for volume header and alternate header.
b03759 ¤   ¤   ¤   ** These items are in the allocation block space but are
38c7c8 ¤   ¤   ¤   ** not actually noted in the volume header
833da8 ¤   ¤   ¤   */
e087c7 ¤   ¤   ¤
536108 ¤   ¤   ¤   if( IsntErr( err ) )
73f776 ¤   ¤   ¤   {
d4121e ¤   ¤   ¤   ¤   PGPUInt32¤  numHeaderBlocks;
e08f7f ¤   ¤   ¤   ¤   PGPUInt32¤  numAltHeaderBlocks;
872b85 ¤   ¤   ¤   ¤
979506 ¤   ¤   ¤   ¤   numHeaderBlocks = (2 + wcb->numSectorsPerBlock ) /·
5ef26d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsPerBlock;
7d12c4 ¤   ¤   ¤   ¤   pgpSetBitRange( wcb->volumeBitmap, 0,·
f9af4b ¤   ¤   ¤   ¤   ¤   ¤   numHeaderBlocks );
fc94aa ¤   ¤   ¤   ¤   ¤   ¤
915f58 ¤   ¤   ¤   ¤   numAltHeaderBlocks = (wcb->numSectorsPerBlock + 1) /·
13f26d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsPerBlock;
2e9abc ¤   ¤   ¤   ¤   pgpSetBitRange( wcb->volumeBitmap,
60deec ¤   ¤   ¤   ¤   ¤   ¤   wcb->numBlocks - numAltHeaderBlocks,
9b3445 ¤   ¤   ¤   ¤   ¤   ¤   numAltHeaderBlocks );
5ea3a6 ¤   ¤   ¤   }
d30fe4 ¤   ¤   }
759371 ¤   }
fcaf5a
7d626f ¤   if( IsntErr( err ) && wcb->numProblemForks != 0 )
21c7a1 ¤   {
5862cf ¤   ¤   err = ValidateProblemForkList( wcb );
919371 ¤   }
20af5a
a7ee03 ¤   if( IsntErr( err ) )
98c7a1 ¤   {
e702d4 ¤   ¤   PGPBitCount¤numFreeBlocks;
511b52 ¤   ¤
831b17 ¤   ¤   /*
58c207 ¤   ¤   ** Verify that the number of free blocks matches the count from our
--a5cc 000e5ad359340120251 Page 49 of pgpMacVolumeWiping.c
113eb2 ¤   ¤   ** volume bitmap
515c12 ¤   ¤   */
471b52 ¤   ¤
31afd4 ¤   ¤   numFreeBlocks = pgpCountClearBitsInRange( wcb->volumeBitmap,
257f3d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0, wcb->numBlocks );
3b36e9 ¤   ¤   if( numFreeBlocks == wcb->numFreeBlocks )
2e5b34 ¤   ¤   {
39213e ¤   ¤   ¤   /* Account for the free allocation blocks in our wipe count */
e9b43a ¤   ¤   ¤   wcb->numSectorsToWipe += numFreeBlocks *·
07f26d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   wcb->numSectorsPerBlock;
bc0fe4 ¤   ¤   }
0f0e1d ¤   ¤   else
b25b34 ¤   ¤   {
a32bc4 ¤   ¤   ¤   pgpDebugMsg( "Volume bitmap mismatch" );
c1a124 ¤   ¤   ¤   err = kWipingError_InvalidVolumeDataStructure;
4a0fe4 ¤   ¤   }
399371 ¤   }
1367c5 ¤
a2deb7 ¤   return( err );
c6efe6 }
b6af5a
4533c8 ¤   static void
7083a2 EndWipe(WipeControlBlock *wcb)
a6bb36 {
b2156f ¤   OSStatus¤   ¤   err;
9faf5a
c166ec ¤   /* Try to mount volume, even if there was an error */
4be75d ¤   if( wcb->vRefNum == 0 )
f8c7a1 ¤   {
2dd8ab ¤   ¤   ParamBlockRec¤  pb;
f91b52 ¤   ¤
50d8cd ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
6b1b52 ¤   ¤
d0d067 ¤   ¤   pb.volumeParam.ioVRefNum = wcb->driveNumber;
f11b52 ¤   ¤
2e0f4e ¤   ¤   err = PBMountVol( &pb );
4a03ef ¤   ¤   if( IsErr( err ) )
9c5b34 ¤   ¤   {
23f742 ¤   ¤   ¤   VolumeWipeEvent¤event;
f387c7 ¤   ¤   ¤
ecfd7b ¤   ¤   ¤   event.type = kVolumeWipeEvent_VolumeMountFailure;
b287c7 ¤   ¤   ¤
92965d ¤   ¤   ¤   event.mountFailure.driveNumber¤ = wcb->driveNumber;
883fac ¤   ¤   ¤   event.mountFailure.driverRefNum¤= wcb->driverRefNum;
112abc ¤   ¤   ¤   event.mountFailure.mountError¤  = err;
e287c7 ¤   ¤   ¤
b82a8f ¤   ¤   ¤   err = SendEvent( wcb, &event );
0c0fe4 ¤   ¤   }
419371 ¤   }
17efe6 }
e0af5a
b12473 ¤   static OSStatus
132f2c InitWipeControlBlock(WipeControlBlock *wcb)
44bb36 {
5f6792 ¤   OSStatus¤   err = noErr;
4267c5 ¤
63ce98 ¤   if( IsNull( wcb ) )
3f91d2 ¤   ¤   return( paramErr );
a61b52 ¤   ¤
0cc95d ¤   pgpClearMemory( wcb, sizeof( *wcb ) );
2b67c5 ¤
eb7b22 ¤   wcb->sectorBuffer = (PGPByte *) pgpAllocMac( kDiskSectorSize,
abe6d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMemoryAllocationFlags);
7ff41a ¤   if( IsntNull( wcb->sectorBuffer ) )
17c7a1 ¤   {
4c2565 ¤   ¤   wcb->patternBuffer = (PGPWipingPattern *) pgpAllocMac(
62cb83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNumPGPWipingPatternBytes,
77e6d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMemoryAllocationFlags);
ae9371 ¤   }
f60e24 ¤   else
abc7a1 ¤   {
e52a06 ¤   ¤   err = memFullErr;
--7913 000afa4bd5e40120251 Page 50 of pgpMacVolumeWiping.c
a19371 ¤   }
9967c5 ¤
c7deb7 ¤   return( err );
6aefe6 }
baaf5a
fc33c8 ¤   static void
5fb942 CleanupWipeControlBlock(WipeControlBlock *wcb)
cbbb36 {
941572 ¤   if( IsntNull( wcb ) )
5ec7a1 ¤   {
347c7c ¤   ¤   if( IsntNull( wcb->sectorBuffer ) )
70bbb0 ¤   ¤   ¤   pgpFreeMac( wcb->sectorBuffer );
921b52 ¤   ¤
076af9 ¤   ¤   if( IsntNull( wcb->patternBuffer ) )
19162d ¤   ¤   ¤   pgpFreeMac( wcb->patternBuffer );
961b52 ¤   ¤
86843a ¤   ¤   if( IsntNull( wcb->volumeBitmap ) )
380abf ¤   ¤   ¤   pgpFreeMac( wcb->volumeBitmap );
e51b52 ¤   ¤
0cdd64 ¤   ¤   if( IsntNull( wcb->ioBuffer ) )
8e1c2f ¤   ¤   ¤   pgpFreeMac( wcb->ioBuffer );
131b52 ¤   ¤
ebe92b ¤   ¤   if( IsntNull( wcb->wipeRangeList ) )
f5f4da ¤   ¤   ¤   pgpFreeMac( wcb->wipeRangeList );
c487c7 ¤   ¤   ¤
13a5f1 ¤   ¤   if( IsntNull( wcb->problemForkList ) )
3a5b34 ¤   ¤   {
0b3130 ¤   ¤   ¤   PGPUInt32¤  index;
8287c7 ¤   ¤   ¤
e8b9ba ¤   ¤   ¤   for( index = 0; index < wcb->numProblemForks; index++ )
a3f776 ¤   ¤   ¤   {
2118e0 ¤   ¤   ¤   ¤   ForkExtent¤ *cur;
9a2b85 ¤   ¤   ¤   ¤
3bfedd ¤   ¤   ¤   ¤   cur = wcb->problemForkList[index].extentList;
8ba47c ¤   ¤   ¤   ¤   while( IsntNull( cur ) )
b072c3 ¤   ¤   ¤   ¤   {
cdb745 ¤   ¤   ¤   ¤   ¤   ForkExtent¤ *next;
f8af5a
d0e8d4 ¤   ¤   ¤   ¤   ¤   next = cur->next;
a85876 ¤   ¤   ¤   ¤   ¤   pgpFreeMac( cur );
eb2e81 ¤   ¤   ¤   ¤   ¤   cur = next;
ba2613 ¤   ¤   ¤   ¤   }
d9a3a6 ¤   ¤   ¤   }
3987c7 ¤   ¤   ¤
990749 ¤   ¤   ¤   pgpFreeMac( wcb->problemForkList );
5c0fe4 ¤   ¤   }
fd87c7 ¤   ¤   ¤
c417fa ¤   ¤   WCBCloseBTreeFile( wcb, &wcb->catalogFileInfo );
dadb80 ¤   ¤   WCBCloseBTreeFile( wcb, &wcb->extentsFileInfo );
9e87c7 ¤   ¤   ¤
b958c5 ¤   ¤   pgpClearMemory( wcb, sizeof( *wcb ) );
f79371 ¤   }
dbefe6 }
c9af5a
d02473 ¤   static OSStatus
206130 DoWipePass(
7e49f8 ¤   WipeControlBlock ¤  *wcb,
fc3928 ¤   PGPUInt32¤  ¤   ¤   passIndex)
fcbb36 {
b86b9d ¤   OSStatus¤   ¤   err = noErr;
bf613e ¤   OSStatus¤   ¤   tempErr;
156f15 ¤   VolumeWipeEvent¤event;
cc67c5 ¤
20414b ¤   wcb->passIndex = passIndex;
4a67c5 ¤
7a01e5 ¤   event.type ¤¤   ¤   ¤   ¤   ¤   ¤   = kVolumeWipeEvent_BeginPass;
717ad5 ¤   event.beginPass.passIndex¤  ¤   ¤   = passIndex;
2627f6 ¤   event.beginPass.totalPasses¤¤   ¤   = wcb->totalPasses;
d09dc9 ¤   event.beginPass.totalSectorsToWipe¤ = wcb->numSectorsToWipe;
0f67c5 ¤
e267bc ¤   err = SendEvent( wcb, &event );
afee03 ¤   if( IsntErr( err ) )
--2ad0 0002239159440120251 Page 51 of pgpMacVolumeWiping.c
f7c7a1 ¤   {
d33dff ¤   ¤   wcb->numSectorsWiped = 0;¤  /* Reset our count */
3667c5 ¤
f8e77a ¤   ¤   if( wcb->signature == kHFSSigWord )
c95b34 ¤   ¤   {
c26eca ¤   ¤   ¤   err = WipeBTreeFile( wcb, &wcb->catalogFileInfo,
a43314 ¤   ¤   ¤   ¤   ¤   ¤   ¤   WipeHFSCatalogFileNode );
ea6108 ¤   ¤   ¤   if( IsntErr( err ) )
c1f776 ¤   ¤   ¤   {
14e4b4 ¤   ¤   ¤   ¤   err = WipeBTreeFile( wcb, &wcb->extentsFileInfo,
04c569 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   WipeBTreeNodeFreeSpace );
40a3a6 ¤   ¤   ¤   }
2d0fe4 ¤   ¤   }
3916d2 ¤   ¤   else if( wcb->signature == kHFSPlusSigWord )
0b5b34 ¤   ¤   {
976eca ¤   ¤   ¤   err = WipeBTreeFile( wcb, &wcb->catalogFileInfo,
9bc61e ¤   ¤   ¤   ¤   ¤   ¤   ¤   WipeBTreeNodeFreeSpace );
bc6108 ¤   ¤   ¤   if( IsntErr( err ) )
17f776 ¤   ¤   ¤   {
51e4b4 ¤   ¤   ¤   ¤   err = WipeBTreeFile( wcb, &wcb->extentsFileInfo,
fbc569 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   WipeBTreeNodeFreeSpace );
a8a3a6 ¤   ¤   ¤   }
700fe4 ¤   ¤   }
370e1d ¤   ¤   else
fb5b34 ¤   ¤   {
79824d ¤   ¤   ¤   pgpDebugMsg( "DoWipePass(): Unknown volume type" );
fdcecc ¤   ¤   ¤   err = kWipingError_UnsupportedVolumeFormat;
240fe4 ¤   ¤   }
731b52 ¤   ¤
7cda5e ¤   ¤   if( IsntErr( err ) )
755b34 ¤   ¤   {
4d6afb ¤   ¤   ¤   err = WipeRanges( wcb );
1f6108 ¤   ¤   ¤   if( IsntErr( err ) )
35f776 ¤   ¤   ¤   {
9e2a39 ¤   ¤   ¤   ¤   err = WipeFreeBlocks( wcb );
39a3a6 ¤   ¤   ¤   }
d20fe4 ¤   ¤   }
b99371 ¤   }
44af5a
72e30e ¤   if( wcb->vRefNum != 0 )
77197a ¤   ¤   (void) FlushVol( NULL, wcb->vRefNum );
4767c5 ¤
c3c14b ¤   event.type ¤¤   ¤   ¤   ¤   = kVolumeWipeEvent_EndPass;
5d4671 ¤   event.endPass.passIndex¤¤   = passIndex;
35dcc3 ¤   event.endPass.totalPasses¤  = wcb->totalPasses;
741a02 ¤   event.endPass.passError¤¤   = err;
dd67c5 ¤
caefaf ¤   tempErr = SendEvent( wcb, &event );
2eee03 ¤   if( IsntErr( err ) )
9a104b ¤   ¤   err = tempErr;
2a67c5 ¤
a8deb7 ¤   return( err );
cfaf5a
b8efe6 }
ccaf5a
e885ea ¤   OSStatus
d4d7b2 pgpWipeVolumeFreeSpace(
e9bf16 ¤   short ¤ ¤   ¤   ¤   ¤   ¤   volRefNum,
f05ea1 ¤   ConstStr255Param¤   ¤   ¤   volName,¤   /* Double check (optional)*/
c7c69f ¤   PGPUInt32 ¤ ¤   ¤   ¤   ¤   numPasses,
c550a2 ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   numPatterns,
54d146 ¤   const PGPWipingPattern ¤¤   patternList[],
e4d965 ¤   PGPVolumeWipingEventHandler¤eventHandler,
9b5579 ¤   PGPUserValue¤   ¤   ¤   ¤   eventUserValue)
cbbb36 {
dc6b9d ¤   OSStatus¤   ¤   err = noErr;
6a67c5 ¤
693a4d ¤   if( volRefNum >= 0 ||
fceea9 ¤   ¤   numPasses == 0 ||·
7b8886 ¤   ¤   numPatterns == 0 ||
ed75ee ¤   ¤   IsNull( patternList ) )
22c7a1 ¤   {
--ecf4 000d8d9a38a40120251 Page 52 of pgpMacVolumeWiping.c
6e85f2 ¤   ¤   pgpDebugMsg( "pgpWipeVolumeFreeSpace(): Parameter error" );
9e91d2 ¤   ¤   return( paramErr );
3c9371 ¤   }
1baf5a
6d98f9 ¤   if( IsntNull( eventHandler ) )
11c7a1 ¤   {
877b3d ¤   ¤   VolumeWipeEvent¤event;
5c1b52 ¤   ¤
c484c5 ¤   ¤   event.type = kVolumeWipeEvent_Begin;
f31b52 ¤   ¤
0f58d0 ¤   ¤   err = (*eventHandler)( &event, eventUserValue );
799371 ¤   }
1367c5 ¤
feee03 ¤   if( IsntErr( err ) )
832ef1 ¤   {¤
e3d908 ¤   ¤   err = pgpCanWipeVolumeFreeSpace( volRefNum );
afda5e ¤   ¤   if( IsntErr( err ) )
1a5b34 ¤   ¤   {
cbadd8 ¤   ¤   ¤   XVolumeParam¤   xpb;
310922 ¤   ¤   ¤   Str32¤  ¤   ¤   volumeName;
33af5a
387e8a ¤   ¤   ¤   pgpClearMemory( &xpb, sizeof( xpb ) );
9087c7 ¤   ¤   ¤
33ee49 ¤   ¤   ¤   xpb.ioVRefNum = volRefNum;
592c60 ¤   ¤   ¤   xpb.ioNamePtr = volumeName;
d387c7 ¤   ¤   ¤
6c1a80 ¤   ¤   ¤   err = pgpPBXGetVolInfo( &xpb );
ea4aa2 ¤   ¤   ¤   if( IsntErr( err ) && IsntNull( volName ) )
16f776 ¤   ¤   ¤   {
23ef6a ¤   ¤   ¤   ¤   if( ! PStringsAreEqual( volName, volumeName ) )
4172c3 ¤   ¤   ¤   ¤   {
1e14eb ¤   ¤   ¤   ¤   ¤   err = nsvErr;
662613 ¤   ¤   ¤   ¤   }
71a3a6 ¤   ¤   ¤   }
072b85 ¤   ¤   ¤   ¤
856108 ¤   ¤   ¤   if( IsntErr( err ) )
7af776 ¤   ¤   ¤   {
8ea370 ¤   ¤   ¤   ¤   WipeControlBlock¤   wcb;
84af5a
70fcd8 ¤   ¤   ¤   ¤   err = InitWipeControlBlock( &wcb );
fa5c60 ¤   ¤   ¤   ¤   if( IsntErr( err ) )
d272c3 ¤   ¤   ¤   ¤   {
baf657 ¤   ¤   ¤   ¤   ¤   const VCB¤  *vcb;
95ae30 ¤   ¤   ¤   ¤   ¤
597c90 ¤   ¤   ¤   ¤   ¤   wcb.vRefNum¤¤   ¤   = volRefNum;
f3621b ¤   ¤   ¤   ¤   ¤   wcb.driveNumber¤¤   = xpb.ioVDrvInfo;
52d320 ¤   ¤   ¤   ¤   ¤   wcb.driverRefNum¤   = xpb.ioVDRefNum;
2d5e7a ¤   ¤   ¤   ¤   ¤   wcb.eventHandler¤   = eventHandler;
c2029b ¤   ¤   ¤   ¤   ¤   wcb.eventUserValue¤ = eventUserValue;
72c1a0 ¤   ¤   ¤   ¤   ¤   wcb.totalPasses¤¤   = numPasses;
16ae30 ¤   ¤   ¤   ¤   ¤
3bac4a ¤   ¤   ¤   ¤   ¤   vcb = GetVCBForVolume( volRefNum );
ba140f ¤   ¤   ¤   ¤   ¤   pgpAssert( IsntNull( vcb ) );
52ae30 ¤   ¤   ¤   ¤   ¤
d64e6e ¤   ¤   ¤   ¤   ¤   wcb.catalogFileInfo.fileRefNum¤ = vcb->vcbCTRef;
865d62 ¤   ¤   ¤   ¤   ¤   wcb.extentsFileInfo.fileRefNum¤ = vcb->vcbXTRef;
29325b ¤   ¤   ¤   ¤   ¤   wcb.signature¤  ¤   ¤   ¤   ¤   = vcb->vcbSigWord;
54ae30 ¤   ¤   ¤   ¤   ¤
b2ce43 ¤   ¤   ¤   ¤   ¤   (void) FlushVol( NULL, volRefNum );
4aae30 ¤   ¤   ¤   ¤   ¤
7b4780 ¤   ¤   ¤   ¤   ¤   err = BeginWipe( &wcb );
44598d ¤   ¤   ¤   ¤   ¤   if( IsntErr( err ) )
764859 ¤   ¤   ¤   ¤   ¤   {
96e330 ¤   ¤   ¤   ¤   ¤   ¤   PGPUInt32¤  wipeIndex;
9294aa ¤   ¤   ¤   ¤   ¤   ¤
276337 ¤   ¤   ¤   ¤   ¤   ¤   for(wipeIndex = 1; wipeIndex <= numPasses; wipeIndex++)
578fec ¤   ¤   ¤   ¤   ¤   ¤   {
62853d ¤   ¤   ¤   ¤   ¤   ¤   ¤   *wcb.patternBuffer =
f62314 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   patternList[(wipeIndex - 1) % numPatterns];
cf531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
efe4e4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = DoWipePass( &wcb, wipeIndex );
d8459f ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsErr( err ) )
--b9ce 00157eb60b840120251 Page 53 of pgpMacVolumeWiping.c
62cd67 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
18db3c ¤   ¤   ¤   ¤   ¤   ¤   }
261c89 ¤   ¤   ¤   ¤   ¤   }
54ae30 ¤   ¤   ¤   ¤   ¤
fdb6e1 ¤   ¤   ¤   ¤   ¤   EndWipe( &wcb );
ec2613 ¤   ¤   ¤   ¤   }
072b85 ¤   ¤   ¤   ¤
6faf0a ¤   ¤   ¤   ¤   CleanupWipeControlBlock( &wcb );
25a3a6 ¤   ¤   ¤   }
2f0fe4 ¤   ¤   }
0d9371 ¤   }
0567c5 ¤
6398f9 ¤   if( IsntNull( eventHandler ) )
dcc7a1 ¤   {
4d7b3d ¤   ¤   VolumeWipeEvent¤event;
12da68 ¤   ¤   OSStatus¤   ¤   tempErr;
881b52 ¤   ¤
92b064 ¤   ¤   event.type ¤¤   ¤   = kVolumeWipeEvent_End;
e8dc0e ¤   ¤   event.end.wipeError¤= err;
f41b52 ¤   ¤
e75d77 ¤   ¤   tempErr = (*eventHandler)( &event, eventUserValue );
24da5e ¤   ¤   if( IsntErr( err ) )
22f2aa ¤   ¤   ¤   err = tempErr;
339371 ¤   }
ba67c5 ¤
35446c ¤   pgpAssert( IsntErr( err ) );
3f1b52 ¤   ¤
aedeb7 ¤   return( err );
57be43 }¶
--2973 00057df9fd540120252 Page 1 of pgpMacVolumeWiping.h
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
1bb956 ¤   $Id: pgpMacVolumeWiping.h,v 1.6.12.1 1998/11/12 03:19:57 heller Exp $
09f7f7 ____________________________________________________________________________*/
64af5a
c5527f #ifndef Included_pgpMacVolumeWiping_h¤  /* [ */
99fe4c #define Included_pgpMacVolumeWiping_h
4faf5a
777dde #include "pgpMacWiping.h"
70af5a
f97353 enum
adbb36 {
becab9 ¤   kWipingError_InvalidVolumeDataStructure¤= 13456789,
8c613a ¤   kWipingError_UnsupportedVolumeFormat
7082f7 };
c5af5a
6872d2 enum VolumeWipeEventType_
b6bb36 {
abee3a ¤   kVolumeWipeEvent_Begin¤ = 1,
0457c7 ¤   kVolumeWipeEvent_End,
44d3b5 ¤   kVolumeWipeEvent_BeginPass,
c74449 ¤   kVolumeWipeEvent_EndPass,
d67862 ¤   kVolumeWipeEvent_GatheringInfo,
3ed718 ¤   kVolumeWipeEvent_WipeProgress,
f067c5 ¤
c59b1c ¤   kVolumeWipeEvent_VolumeUnmountFailure,
b493af ¤   kVolumeWipeEvent_VolumeMountFailure,
93af5a
09c2af ¤   PGP_ENUM_FORCE( VolumeWipeEventType_ )
6baf5a
a082f7 };
78da5a PGPENUM_TYPEDEF( VolumeWipeEventType_, VolumeWipeEventType );
1aaf5a
456a3c typedef struct VolumeWipeEvent
80bb36 {
230131 ¤   VolumeWipeEventType¤type;
4167c5 ¤
bcf20a ¤   union
2ac7a1 ¤   {
422b33 ¤   ¤   struct
ff5b34 ¤   ¤   {
68692f ¤   ¤   ¤   OSStatus¤   wipeError;
8f87c7 ¤   ¤   ¤
73335c ¤   ¤   } end;
7faf5a
4f2b33 ¤   ¤   struct
ac5b34 ¤   ¤   {
007878 ¤   ¤   ¤   short¤  ¤   vRefNum;
1e6f45 ¤   ¤   ¤   OSStatus¤   unmountError;
3887c7 ¤   ¤   ¤
4b8124 ¤   ¤   } unmountFailure;
291b52 ¤   ¤
472b33 ¤   ¤   struct
f15b34 ¤   ¤   {
8e50ae ¤   ¤   ¤   short¤  ¤   driveNumber;
bac55e ¤   ¤   ¤   short¤  ¤   driverRefNum;
746325 ¤   ¤   ¤   OSStatus¤   mountError;
851b52 ¤   ¤
918f2f ¤   ¤   } mountFailure;
8e1b52 ¤   ¤
1b2b33 ¤   ¤   struct
f35b34 ¤   ¤   {
256416 ¤   ¤   ¤   PGPUInt32¤  passIndex;
67fa6f ¤   ¤   ¤   PGPUInt32¤  totalPasses;
f38122 ¤   ¤   ¤   PGPUInt32¤  totalSectorsToWipe;
bb1b52 ¤   ¤
052ace ¤   ¤   } beginPass;
611b52 ¤   ¤
b92b33 ¤   ¤   struct
575b34 ¤   ¤   {
--b00f 001570346f840120252 Page 2 of pgpMacVolumeWiping.h
436416 ¤   ¤   ¤   PGPUInt32¤  passIndex;
f3fa6f ¤   ¤   ¤   PGPUInt32¤  totalPasses;
05302e ¤   ¤   ¤   OSStatus¤   passError;
9787c7 ¤   ¤   ¤
118a47 ¤   ¤   } endPass;
261b52 ¤   ¤
cd2b33 ¤   ¤   struct
025b34 ¤   ¤   {
0c6416 ¤   ¤   ¤   PGPUInt32¤  passIndex;
c136ee ¤   ¤   ¤   PGPUInt32¤  numSectorsWiped;
888122 ¤   ¤   ¤   PGPUInt32¤  totalSectorsToWipe;
751b52 ¤   ¤
ce70dc ¤   ¤   } progress;
c162bd ¤   };
34af5a
22d518 } VolumeWipeEvent;
59af5a
a2f900 typedef OSStatus¤   (*PGPVolumeWipingEventHandler)(
3ef221 ¤   ¤   ¤   ¤   ¤   ¤   ¤   const VolumeWipeEvent *event,
27a3a6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue userValue);
4faf5a
d299c6 PGP_BEGIN_C_DECLARATIONS
f0af5a
a1cbcf #if PRAGMA_IMPORT_SUPPORTED
56b981 #pragma import on
827454 #endif
12af5a
d879f7 OSStatus¤   pgpCanWipeVolumeFreeSpace(short volRefNum);
3d719d OSStatus¤   pgpWipeVolumeFreeSpace(short volRefNum, ConstStr255Param volName,
685216 ¤   ¤   ¤   ¤   ¤   PGPUInt32 numPasses, PGPUInt32 numPatterns,
be62ae ¤   ¤   ¤   ¤   ¤   const PGPWipingPattern patternList[],
1bd92d ¤   ¤   ¤   ¤   ¤   PGPVolumeWipingEventHandler¤eventHandler,
b278ed ¤   ¤   ¤   ¤   ¤   PGPUserValue eventUserValue );
46af5a
b3af5a
00cbcf #if PRAGMA_IMPORT_SUPPORTED
fe2ced #pragma import reset
df7454 #endif
57af5a
921254 PGP_END_C_DECLARATIONS
c6af5a
843d02 #endif /* ] Included_pgpMacVolumeWiping_h */
3faf5a
ac7e4d /*__Editor_settings____
79af5a
da4126 ¤   Local Variables:
f87b17 ¤   tab-width: 4
180e6c ¤   End:
ee5f8c ¤   vi: ts=4 sw=4
249e9b ¤   vim: si
57d062 _____________________*/
--97bc 001a291787b40120253 Page 1 of pgpMacWiping.h
a70335 /*____________________________________________________________________________
ecedb8 ¤   Copyright (C) 1998 Network Associates, Inc. and its affiliates.
bb4b0f ¤   All rights reserved.
b567c5 ¤
5e832a ¤   $Id: pgpMacWiping.h,v 1.1.12.1 1998/11/12 03:19:58 heller Exp $
a7f7f7 ____________________________________________________________________________*/
adaf5a
f646f1 #ifndef Included_pgpMacWiping_h¤/* [ */
6e3d6b #define Included_pgpMacWiping_h
0caf5a
a2c5d5 #include "pgpBase.h"
37af5a
119e00 #define kNumPGPWipingPatternBytes¤  512L
45af5a
89bfcc typedef struct PGPWipingPattern
19bb36 {
7d7600 ¤   PGPByte¤bytes[kNumPGPWipingPatternBytes];
90af5a
0262bf } PGPWipingPattern;
0faf5a
bbaf5a
9f2b7e #endif /* ] Included_pgpMacWiping_h */
4baf5a
477e4d /*__Editor_settings____
e7af5a
f24126 ¤   Local Variables:
9f7b17 ¤   tab-width: 4
330e6c ¤   End:
dd5f8c ¤   vi: ts=4 sw=4
1d9e9b ¤   vim: si
a2d062 _____________________*/
--1b7c 0015abb057c40120254 Page 1 of strlen.c
e0af5a
ae465d //
c4b27e // A replacement for strlen() so we don't have to include ANSI library.
f4465d //
0d324c #include <string.h>
b0af5a
aa876a ¤   size_t
05e5e1 strlen(const char* str)
b5bb36 {
8077e8 ¤   size_t¤ count = 0;
9167c5 ¤
933d8e ¤   while ( *str++ )
305b34 ¤   ¤   {
52efd2 ¤   ¤   count++;
180fe4 ¤   ¤   }
201b52 ¤   ¤
cc1368 ¤   return count;
5abe43 }¶
--b805 001761ffa9f40120255 Page 1 of CFSCloser.h
a70335 /*____________________________________________________________________________
eb5a3d ¤   CFSCloser.h
2167c5 ¤
3cc97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
d34b0f ¤   All rights reserved.
f767c5 ¤
6167c5 ¤
0caf5a
4dd2fc ¤   $Id: CFSCloser.h,v 1.2.34.1 1998/11/12 03:20:05 heller Exp $
4af7f7 ____________________________________________________________________________*/
1e7b7d #pragma once
49af5a
251001 class CFSCloser
70bb36 {
51a2d3 protected:
f5e5e8 ¤   short¤  mFileRef;
bc67c5 ¤
795ed4 public:
6a6272 ¤   CFSCloser( short fileRef )
7257ca ¤   ¤   ¤   { mFileRef¤ = fileRef; }
6487c7 ¤   ¤   ¤
44c0dc ¤   ~CFSCloser()
b4a453 ¤   ¤   ¤   { if ( mFileRef > 0 )¤  FSClose( mFileRef ); }
c382f7 };
76af5a
--ac11 0012757922e40120256 Page 1 of CFree.h
a70335 /*____________________________________________________________________________
8de306 ¤   CFree.h
3467c5 ¤
c3c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
ee4b0f ¤   All rights reserved.
6067c5 ¤
cb67c5 ¤
06af5a
892d0a ¤   $Id: CFree.h,v 1.3.28.1 1998/11/12 03:20:05 heller Exp $
34f7f7 ____________________________________________________________________________*/
ce7b7d #pragma once
12af5a
5eaf5a
caa126 class CFree
dcbb36 {
10a2d3 protected:
3286e0 ¤   void *¤ mMemory;
b167c5 ¤
6a5ed4 public:
dd1192 ¤   ¤   ¤   CFree( void * memory )¤ ¤   { mMemory¤  = memory; }
d55ebe ¤   virtual ~CFree()
1cc7a1 ¤   {
0c1f52 ¤   ¤   /* subclass should provide destructor which frees */
039371 ¤   }
8387c7 ¤   ¤   ¤
464021 ¤   ·void¤  Forget( void )¤ ¤   ¤   ¤   { mMemory¤  = nil;}
5582f7 };
27af5a
--1d8c 00196975a8340120257 Page 1 of CFreePGPFileSpec.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
5a828b ¤   $Id: CFreePGPFileSpec.h,v 1.2.16.1 1998/11/12 03:20:06 heller Exp $
03f7f7 ____________________________________________________________________________*/
18af5a
45ef38 #include "CFree.h"
1baf5a
79894b #include "pgpFileSpec.h"
72af5a
82af5a
b11c8f class CFreePGPFileSpec : public CFree
acbb36 {
f73958 public:¤¤   ¤
1f9b55 ¤   ¤   ¤   ¤   CFreePGPFileSpec( PFLFileSpecRef spec )
156f22 ¤   ¤   ¤   ¤   ¤   : CFree( spec )
8972c3 ¤   ¤   ¤   ¤   {
bd2613 ¤   ¤   ¤   ¤   }
6daf5a
010f16 ¤   virtual¤¤   ~CFreePGPFileSpec( void )
b572c3 ¤   ¤   ¤   ¤   {
7a2bde ¤   ¤   ¤   ¤   ¤   if ( IsntNull( mMemory ) )
a68ee7 ¤   ¤   ¤   ¤   ¤   ¤   PFLFreeFileSpec( (PFLFileSpecRef)mMemory );
802613 ¤   ¤   ¤   ¤   }
9682f7 };
9eaf5a
96af5a
--1e31 0018f82efda40120258 Page 1 of CFreePGPIO.h
a70335 /*____________________________________________________________________________
e0accf ¤   Copyright (C) 1997-1998 Network Associates, Inc. and its affiliates.
b64b0f ¤   All rights reserved.
3faf5a
cbab2d ¤   $Id: CFreePGPIO.h,v 1.2.16.1 1998/11/12 03:20:07 heller Exp $
80f7f7 ____________________________________________________________________________*/
f2af5a
bfef38 #include "CFree.h"
86af5a
78a9cb #include "pgpIO.h"
42af5a
06af5a
828822 class CFreePGPIO : public CFree
babb36 {
de3958 public:¤¤   ¤
4e4ec1 ¤   ¤   ¤   ¤   CFreePGPIO( PGPIORef io )
b5113a ¤   ¤   ¤   ¤   ¤   : CFree( io )
a072c3 ¤   ¤   ¤   ¤   {
2b2613 ¤   ¤   ¤   ¤   }
d9af5a
482fdb ¤   virtual¤¤   ~CFreePGPIO( void )
4072c3 ¤   ¤   ¤   ¤   {
ee2bde ¤   ¤   ¤   ¤   ¤   if ( IsntNull( mMemory ) )
bb3024 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeIO( (PGPIORef)mMemory );
cb2613 ¤   ¤   ¤   ¤   }
c982f7 };
e7af5a
8faf5a
--df38 001fef8ec8840120259 Page 1 of CPGPFree.h
a70335 /*____________________________________________________________________________
4ed50a ¤   CPGPFree.h
4c67c5 ¤
51c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
8f4b0f ¤   All rights reserved.
8367c5 ¤
5567c5 ¤
f6af5a
409fd4 ¤   $Id: CPGPFree.h,v 1.4.28.1 1998/11/12 03:20:07 heller Exp $
e4f7f7 ____________________________________________________________________________*/
07ef38 #include "CFree.h"
88af5a
e6af5a
a28ac1 class CPGPFree : public CFree
49bb36 {
033958 public:¤¤   ¤
4347f8 ¤   ¤   ¤   ¤   CPGPFree( void *memory ) : CFree( memory ) {}
a2af5a
2d7286 ¤   virtual¤¤   ~CPGPFree( void )
edc7a1 ¤   {
e90789 ¤   ¤   if ( mMemory != NULL ) pgpFree( mMemory );
0f9371 ¤   }
2e82f7 };
2caf5a
feaf5a
--34e2 00180ed62cc4012025a Page 1 of CResFileCloser.h
a70335 /*____________________________________________________________________________
cf0a86 ¤   CResFileCloser.h
c367c5 ¤
c4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
104b0f ¤   All rights reserved.
ba67c5 ¤
6267c5 ¤
5caf5a
f177ea ¤   $Id: CResFileCloser.h,v 1.3.28.1 1998/11/12 03:20:08 heller Exp $
19f7f7 ____________________________________________________________________________*/
a17b7d #pragma once
13af5a
e767dc class CResFileCloser
aebb36 {
1da2d3 protected:
94e5e8 ¤   short¤  mFileRef;
1867c5 ¤
9d5ed4 public:
af1b0d ¤   CResFileCloser( short fileRef )¤{ mFileRef¤ = fileRef; }
dc83e1 ¤   CResFileCloser()
9bc7a1 ¤   {
2197eb ¤   ¤   if ( mFileRef > 0 )¤CloseResFile( mFileRef );
a69371 ¤   }
8882f7 };
80af5a
--501d 00100e2a2914012025b Page 1 of CSaveResFile.h
a70335 /*____________________________________________________________________________
a99f61 ¤   CSaveResFile.h
fb67c5 ¤
33c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
6e4b0f ¤   All rights reserved.
8767c5 ¤
1a67c5 ¤
e3af5a
b25578 ¤   $Id: CSaveResFile.h,v 1.2.34.1 1998/11/12 03:20:09 heller Exp $
42f7f7 ____________________________________________________________________________*/
14af5a
b57b7d #pragma once
02af5a
61af5a
af039a class CSaveResFile
07bb36 {
7ba2d3 protected:
f4821d ¤   short¤  mSaveResFile;
e967c5 ¤
d75ed4 public:
39258f ¤   ¤   ¤   CSaveResFile( void )¤   ¤   { mSaveResFile¤ = CurResFile(); }
a42f94 ¤   virtual ~CSaveResFile()¤¤   ¤   ¤   { UseResFile( mSaveResFile ); }
e282f7 };
00af5a
--7dfb 00107c291f84012025c Page 1 of CSaveResLoad.h
a70335 /*____________________________________________________________________________
9b0e03 ¤   CSaveResLoad.h
0267c5 ¤
92c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
684b0f ¤   All rights reserved.
f067c5 ¤
3167c5 ¤
97af5a
43b0f5 ¤   $Id: CSaveResLoad.h,v 1.4.28.1 1998/11/12 03:20:09 heller Exp $
3ff7f7 ____________________________________________________________________________*/
5aaf5a
2e7b7d #pragma once
47af5a
cf4d37 #include <LowMem.h>
a3af5a
d3e20f class CSaveResLoad
8abb36 {
17a2d3 protected:
1e438b ¤   SInt8¤  mSaveResLoad;
9867c5 ¤
695ed4 public:
272d51 ¤   ¤   ¤   CSaveResLoad( void )¤   ¤   { mSaveResLoad¤ = LMGetResLoad(); }
c5882d ¤   virtual ~CSaveResLoad()¤¤   ¤   ¤   { LMSetResLoad( mSaveResLoad ); }
af82f7 };
07af5a
--59e4 001ac9768c44012025d Page 1 of CWrappers.h
a70335 /*____________________________________________________________________________
8d9cf2 ¤   CWrappers.h
8867c5 ¤
c8c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
864b0f ¤   All rights reserved.
9567c5 ¤
bf67c5 ¤
4daf5a
571bef ¤   $Id: CWrappers.h,v 1.4.32.1 1998/11/12 03:20:10 heller Exp $
5ff7f7 ____________________________________________________________________________*/
ecaf5a
b57b7d #pragma once
55af5a
d0fe67 #include "CSaveResLoad.h"
d5bee2 #include "CSaveResFile.h"
f40096 #include "CFSCloser.h"
a88c5b #include "CPGPFree.h"
76f9b4 #include "CResFileCloser.h"
4cf3dd #include "CFreePGPFileSpec.h"
acb1b0 #include "CFreePGPIO.h"¶
--f27d 0000dc443c64012025e Page 1 of PGPsdk.prj.exp
50c9d2 PGPCompareKeys
8ebb91 PGPCompareUserIDStrings
5b5858 PGPCountAdditionalRecipientRequests
6acc32 PGPGetIndexedAdditionalRecipientRequestKey
fb31cf PGPCountRevocationKeys
7ed162 PGPGetIndexedRevocationKey
f43e3d PGPGetTime
4fd114 PGPTimeToMacTime
bff60d PGPTimeFromMacTime
e97e40 PGPGetStdTimeFromPGPTime
4aaba5 PGPGetPGPTimeFromStdTime
09a8ad PGPGetYMDFromPGPTime
f9af5a
21657c PGPNewKeySet
6ddaf0 PGPNewEmptyKeySet
1ace16 PGPNewSingletonKeySet
98a885 PGPOpenDefaultKeyRings
60cf0f PGPOpenKeyRingPair
f7feee PGPOpenKeyRing
e2571d PGPCommitKeyRingChanges
494ee1 PGPRevertKeyRingChanges
5ccb11 PGPPropagateTrust
4494a4 PGPReloadKeyRings
d50205 PGPCountKeys
752665 PGPIncKeySetRefCount
cf5660 PGPFreeKeySet
a4b19c PGPUnionKeySets
4bcea4 PGPKeySetIsMutable
c15710 PGPKeySetNeedsCommit
3e90d4 PGPAddKeys
0066c4 PGPRemoveKeys
678f02 PGPRevokeKey
3eaf5a
a32dbd PGPDisableKey
6fc580 PGPEnableKey
635fdd PGPChangePassphrase
fa7544 PGPChangeSubKeyPassphrase
851fe5 PGPRemoveSubKey
407add PGPRemoveUserID
1cdeff PGPRevokeSubKey
0e2b4c PGPAddKeyOptions
ad7df5 PGPAddUserID
afb7b3 PGPGetSigCertifierKey
830359 PGPRevokeSig
ed8822 PGPRemoveSig
21267f PGPSetKeyTrust
17d9f5 PGPGetKeyBoolean
43f810 PGPGetKeyNumber
e21dd1 PGPGetKeyPropertyBuffer
d9bf36 PGPGetKeyPasskeyBuffer
9c7116 PGPGetKeyTime
1b21d0 PGPGetSubKeyBoolean
7f2a1f PGPGetSubKeyNumber
766f0a PGPGetSubKeyPropertyBuffer
1fd7c1 PGPGetSubKeyTime
ae4b70 PGPGetUserIDNumber
896741 PGPGetUserIDStringBuffer
c8ba40 PGPGetUserIDBoolean
3de9ee PGPGetSigBoolean
1fcd5a PGPGetSigTime
376831 PGPGetSigNumber
ea3868 PGPGetKeyIDOfCertifier
51a93d PGPSetPrimaryUserID
d7e1e0 PGPGetPrimaryUserID
bce4a9 PGPGetPrimaryUserIDNameBuffer
579e0e PGPGetPrimaryUserIDValidity
e50f27 PGPGetHashAlgUsed
83bf76 PGPGetKeyByKeyID
0b23cf PGPSetKeyAxiomatic
af299f PGPUnsetKeyAxiomatic
122635 PGPOrderKeySet
0d347b PGPIncKeyListRefCount
--e22d 000476385b34012025e Page 2 of PGPsdk.prj.exp
5c6353 PGPFreeKeyList
f4d06b PGPNewKeyIter
09bdef PGPCopyKeyIter
320ab5 PGPFreeKeyIter
6ac44d PGPKeyIterIndex
fd4aa0 PGPKeyIterRewind
903ad7 PGPKeyIterRewindSubKey
bef94c PGPKeyIterSeek
3300fb PGPKeyIterMove
0d5dcb PGPKeyIterNext
4c55e9 PGPKeyIterPrev
e014df PGPKeyIterNextSubKey
03c3c9 PGPKeyIterPrevSubKey
a9dbd3 PGPKeyIterKey
ecbfbb PGPKeyIterSubKey
02da83 PGPKeyIterUserID
f45788 PGPKeyIterSig
e371e7 PGPKeyIterNextUserID
3ca6f1 PGPKeyIterPrevUserID
ef5fef PGPKeyIterRewindUserID
7f6d64 PGPKeyIterNextUIDSig
18ba72 PGPKeyIterPrevUIDSig
5f436c PGPKeyIterRewindUIDSig
216e96 PGPGetDefaultPrivateKey
fdddd5 PGPSetDefaultPrivateKey
659198 PGPGetTrustModel
0e99c7 PGPSetKeyUserVal
5e97c1 PGPSetUserIDUserVal
b00c51 PGPSetSubKeyUserVal
34a9dc PGPSetSigUserVal
10bca9 PGPGetKeyUserVal
e9df1c PGPGetUserIDUserVal
4c448c PGPGetSubKeyUserVal
288cb2 PGPGetSigUserVal
f74bdf PGPCheckKeyRingSigs
142b03 PGPAddAttributeUserID
1b0d77 PGPGetPrimaryAttributeUserID
76af5a
023136 PGPCopyFileSpec
78cc5e PGPFreeFileSpec
ac9c5a PGPNewFileSpecFromFSSpec
0c1e3f PGPGetFSSpecFromFileSpec
6aaf5a
7e74cb PGPMacBinaryToLocal
6faf5a
631364 PGPNewContext
597c43 PGPNewContextCustom
02c9ba PGPFreeContext
726e6a PGPGetContextUserValue
6e3850 PGPGetContextMemoryMgr
5896bc PGPSetContextUserValue
9a382b PGPContextGetRandomBytes
48af5a
1e2c26 PGPNewSymmetricCipherContext
9ec24b PGPFreeSymmetricCipherContext
6cbf0a PGPCopySymmetricCipherContext
5f6b70 PGPInitSymmetricCipher
e5e6c8 PGPWipeSymmetricCipher
648db7 PGPWashSymmetricCipher
0550d1 PGPSymmetricCipherEncrypt
14a7ec PGPSymmetricCipherDecrypt
d46792 PGPGetSymmetricCipherSizes
35af5a
a4101a PGPNewCFBContext
f82d45 PGPFreeCFBContext
88aaba PGPCopyCFBContext
b67817 PGPInitCFB
e71817 PGPCFBEncrypt
b9ef2a PGPCFBDecrypt
8ccced PGPCFBGetSymmetricCipher
ee74ed PGPCFBSync
472210 PGPCFBGetRandom
--c2ad 0004349aa7e4012025e Page 3 of PGPsdk.prj.exp
1f54c3 PGPCFBRandomCycle
22b011 PGPCFBRandomWash
b5af5a
95ed7b PGPNewCBCContext
60d024 PGPFreeCBCContext
0f57db PGPCopyCBCContext
d402ae PGPInitCBC
c3e576 PGPCBCEncrypt
72124b PGPCBCDecrypt
95ce0b PGPCBCGetSymmetricCipher
86af5a
4e9f7c PGPNewPublicKeyContext
cf4a31 PGPFreePublicKeyContext
707204 PGPGetPublicKeyOperationSizes
3beea2 PGPPublicKeyEncrypt
82098e PGPPublicKeyVerifySignature
5450ac PGPPublicKeyVerifyRaw
1649cc PGPNewPrivateKeyContext
45d0f8 PGPFreePrivateKeyContext
f672a4 PGPGetPrivateKeyOperationSizes
68aaba PGPPrivateKeyDecrypt
92153c PGPPrivateKeySign
03b5ed PGPPrivateKeySignRaw
92ddc0 PGPDiscreteLogExponentBits
2baf5a
fd926f PGPNewHashContext
453820 PGPFreeHashContext
ff37df PGPCopyHashContext
321e10 PGPResetHash
906e81 PGPContinueHash
94c35e PGPFinalizeHash
bcc66c PGPGetHashSize
8daf5a
b0ea47 PGPNewHMACContext
164008 PGPFreeHMACContext
d6f2fa PGPResetHMAC
ba826b PGPContinueHMAC
272fb4 PGPFinalizeHMAC
32af5a
5d9285 PGPGlobalRandomPoolAddKeystroke
213fbf PGPGlobalRandomPoolAddMouse
c24c9a PGPGlobalRandomPoolGetEntropy
730215 PGPGlobalRandomPoolGetSize
1dd8f1 PGPGlobalRandomPoolGetMinimumEntropy
312f56 PGPGlobalRandomPoolHasMinimumEntropy
f0af5a
46576d PGPFreeFilter
68036d PGPIncFilterRefCount
e8af5a
09af5a
49af5a
10db9b PGPsdkLoadPrefs
36ca8c PGPsdkLoadDefaultPrefs
492763 PGPsdkSavePrefs
6ac38c PGPsdkPrefSetFileSpec
11d322 PGPsdkPrefGetFileSpec
f45e42 PGPsdkPrefGetData
f713e4 PGPsdkPrefSetData
41af5a
95af5a
33657c PGPGetErrorString
4baf5a
2d2eec PGPMemoryMgrIsValid
477ad7 PGPNewMemoryMgr
fd429b PGPNewMemoryMgrCustom
efc62b PGPFreeMemoryMgr
4aece8 PGPGetMemoryMgrCustomValue
7a15fc PGPSetMemoryMgrCustomValue
cdb130 PGPNewData
d1ad6a PGPNewSecureData
e45036 PGPReallocData
43f30b PGPFreeData
--2933 000cfc520c94012025e Page 4 of PGPsdk.prj.exp
3e07b2 PGPGetMemoryMgrDataInfo
d25324 PGPCheckMemoryMgrIntegrity
184c00 PGPGetDefaultMemoryMgr
52b4d6 PGPSetDefaultMemoryMgr
39af5a
b6af5a
434f85 PGPGetKeyIDFromString
ef5b65 PGPGetKeyIDFromKey
bf6fec PGPGetKeyIDFromSubKey
2307a1 PGPGetKeyIDString
324cdf PGPExportKeyID
0739c4 PGPImportKeyID
f4c481 PGPCompareKeyIDs
e1af5a
b9af5a
b7af5a
5cac6d PGPNewKeyEncryptAlgorithmFilter
d97d52 PGPNewKeyIDFilter
2a8123 PGPNewSubKeyIDFilter
85fafc PGPNewKeyFingerPrintFilter
86315a PGPNewKeyCreationTimeFilter
42ab4f PGPNewKeyExpirationTimeFilter
7f189f PGPNewKeyRevokedFilter
ddef9e PGPNewKeyDisabledFilter
477aab PGPNewKeySigAlgorithmFilter
05ec67 PGPNewKeyEncryptKeySizeFilter
9b70be PGPNewKeySigKeySizeFilter
c86f07 PGPNewUserIDStringFilter
74fa14 PGPNewUserIDEmailFilter
18d9c9 PGPNewUserIDNameFilter
c65837 PGPNewSigKeyIDFilter
6f3e55 PGPNegateFilter
ba53e5 PGPIntersectFilters
436a78 PGPUnionFilters
bd6445 PGPFilterKeySet
1ecaf7 PGPLDAPQueryFromFilter
b5f41a PGPHKSQueryFromFilter
5eaf5a
f3726e PGPKeySetIsMember
66af5a
3ca864 pgpContextMemAlloc
9efd9b pgpContextMemRealloc
1bc4e1 pgpContextMemFree
d5af5a
ac541b pgpContextIsValid
47af5a
7c5523 PGPGenerateKey
842553 PGPGenerateSubKey
d3f665 PGPSignUserID
812d51 PGPGetKeyEntropyNeeded
07ad50 PGPExportKeySet
290377 PGPImportKeySet
513502 PGPPassphraseIsValid
4b02df PGPVerifyX509CertificateChain
7eaf5a
887e6e PGPEncode
44cc9e PGPDecode
b5af5a
48af5a
5a6822 PGPNewOptionList
6b19e3 PGPAddJobOptions
5bca86 PGPAppendOptionList
e43075 PGPBuildOptionList
77d282 PGPCopyOptionList
a1557d PGPFreeOptionList
5fe854 PGPOLastOption
a13ec0 PGPONullOption
8091fe PGPOInputFile
7735eb PGPOInputBuffer
0d18ac PGPOInputFileFSSpec
266d31 PGPOOutputFile
cf416a PGPOOutputBuffer
--7919 00034e2ff104012025e Page 5 of PGPsdk.prj.exp
c9cac0 PGPOOutputFileFSSpec
e47a1f PGPOAllocatedOutputBuffer
4196d7 PGPODiscardOutput
f59e42 PGPOEncryptToKey
5818f8 PGPOEncryptToKeySet
c731f8 PGPOEncryptToUserID
6764ba PGPOSignWithKey
ab80f3 PGPOConventionalEncrypt
245168 PGPOPassphrase
a20828 PGPOPassphraseBuffer
1df865 PGPODetachedSig
8b77d0 PGPOCipherAlgorithm
911ab1 PGPOHashAlgorithm
d5e784 PGPOFailBelowValidity
d212d5 PGPOWarnBelowValidity
e16282 PGPOEventHandler
1ab487 PGPOSendNullEvents
cb5891 PGPOArmorOutput
05fd20 PGPODataIsASCII
a16a25 PGPOClearSign
0b4ae8 PGPOForYourEyesOnly
27a396 PGPOSendEventIfKeyFound
824963 PGPOKeySetRef
280c40 PGPOKeyGenParams
5fa631 PGPOKeyGenName
d68a66 PGPOCreationDate
b21f0f PGPOExpiration
f61f8c PGPOAdditionalRecipientRequestKeySet
e2d8a5 PGPOKeyGenMasterKey
8be5d6 PGPOKeyGenFast
c02562 PGPOPreferredAlgorithms
3e0d44 PGPOExportable
6f63d3 PGPOExportPrivateKeys
592f83 PGPOExportPrivateSubkeys
6a4f17 PGPOSigTrust
659153 PGPOSigRegularExpression
3dec2d PGPOCommentString
c7f383 PGPOCompression
b0dd4c PGPOVersionString
6555e4 PGPOFileNameString
61cc41 PGPOLocalEncoding
990529 PGPOOutputLineEndType
7e02d1 PGPOImportKeysTo
59fd0c PGPOAskUserForEntropy
0c434d PGPOPassThroughIfUnrecognized
034007 PGPOPGPMIMEEncoding
3427e6 PGPORecursivelyDecode
dae0f9 PGPORawPGPInput
fa5e9d PGPORevocationKeySet
f37e67 PGPOOmitMIMEVersion
3222f3 PGPOPassThroughClearSigned
1b7a8d PGPOPassThroughKeys
ddfcd9 PGPOPasskeyBuffer
9157ac PGPOX509Encoding
2b4f92 PGPOExportFormat
ecaf5a
eb9e4c pgpEventKeyServer
4f8537 pgpEventKeyServerSign
7aaedc pgpEventKeyServerTLS
c74f12 pgpEventNull
35af5a
f1a9fe PGPGetKeyListContext
5600cd PGPGetKeySetContext
dd7169 PGPGetKeyIterContext
37c36b PGPGetKeyContext
b93b4e PGPGetSubKeyContext
54a0de PGPGetUserIDContext
edaf5a
168dd2 PGPGetSDKVersion
485cc3 PGPGetSDKString
345f3b PGPGetFeatureFlags
340314 PGPCountPublicKeyAlgorithms
--e9d7 0003b193d5a4012025e Page 6 of PGPsdk.prj.exp
d70356 PGPGetIndexedPublicKeyAlgorithmInfo
1d41c9 PGPCountSymmetricCiphers
405335 PGPGetIndexedSymmetricCipherInfo
26af5a
9e55ba PGPsdkInit
5aeb0c PGPsdkCleanup
84af5a
56a71a PGPNewGroupSet
73fb0c PGPNewGroupSetFromFile
d5b214 PGPNewGroupSetFromFSSpec
45122b PGPSaveGroupSetToFile
61ee72 PGPExportGroupSetToBuffer
fce1f5 PGPImportGroupSetFromBuffer
239833 PGPFreeGroupSet
20b624 PGPGroupSetNeedsCommit
b4a2fd PGPGetGroupSetContext
81af5a
b6d36d PGPNewGroup
d5bca7 PGPCountGroupsInSet
04c25e PGPGetIndGroupID
d41847 PGPDeleteGroup
7187da PGPDeleteIndItemFromGroup
f59457 PGPDeleteItemFromGroup
85d56d PGPGetGroupInfo
a2cffa PGPSetGroupName
1b765f PGPSetGroupUserValue
bc27c1 PGPSetGroupDescription
f0b617 PGPAddItemToGroup
0b4dd7 PGPMergeGroupIntoDifferentSet
2963be PGPMergeGroupSets
23655b PGPCopyGroupSet
e6af5a
b52f40 PGPCountGroupItems
30d5f6 PGPGetIndGroupItem
753f95 PGPSetIndGroupItemUserValue
53d79b PGPSortGroupItems
62613b PGPSortGroupSet
a5af5a
3095da PGPNewGroupItemIter
705a24 PGPFreeGroupItemIter
bdfb48 PGPGroupItemIterNext
e6af5a
be1956 PGPGetGroupLowestValidity
ab2f9f PGPNewKeySetFromGroup
2c8cc1 PGPNewFlattenedGroupFromGroup
ffb126 PGPSortGroupSetStd
bcaf5a
ceaf5a
38af5a
52af5a
7d4f7b PGPNewBigNum
6a7c67 PGPFreeBigNum
14bdf5 PGPCopyBigNum
e9faa7 PGPAssignBigNum
b369a1 PGPSwapBigNum
4ba3e0 PGPBigNumExtractBigEndianBytes
4d4e30 PGPBigNumInsertBigEndianBytes
e40079 PGPBigNumExtractLittleEndianBytes
fbd697 PGPBigNumInsertLittleEndianBytes
45cacc PGPBigNumGetLSWord
49085d PGPBigNumGetSignificantBits
bfb947 PGPBigNumAdd
bb2735 PGPBigNumSubtract
5268e0 PGPBigNumCompareQ
3a95e1 PGPBigNumSetQ
b2ae07 PGPBigNumAddQ
dffe0c PGPBigNumSubtractQ
e65287 PGPBigNumCompare
ffd462 PGPBigNumSquare
15535c PGPBigNumMultiply
5d00bf PGPBigNumMultiplyQ
3b6e03 PGPBigNumDivide
--f5f8 001396633ad4012025e Page 7 of PGPsdk.prj.exp
6007d5 PGPBigNumMod
171922 PGPBigNumModQ
074114 PGPBigNumExpMod
ea0707 PGPBigNumDoubleExpMod
918173 PGPBigNumTwoExpMod
c05ed0 PGPBigNumGCD
a789c4 PGPBigNumInv
6e09ef PGPBigNumLeftShift
7dd14a PGPBigNumRightShift
0c05c0 PGPBigNumMakeOdd
b1af5a
bbb5c7 PGPSecretShareData
c5359f PGPSecretReconstructData
24af5a
78af5a
ddaf5a
c7af5a
d7af5a
5faf5a
66af5a
03af5a
30af5a
65af5a
39af5a
--809a 0016bdc03e84012025f Page 1 of PGPLibCommonHeaders.h
a70335 /*____________________________________________________________________________
9f5175 ¤   PGPLibCommonHeaders.h
ce67c5 ¤
63c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
434b0f ¤   All rights reserved.
6567c5 ¤
eaaf5a
1bd47e ¤   $Id: PGPLibCommonHeaders.h,v 1.7.10.1 1998/11/12 03:20:20 heller Exp $
52f7f7 ____________________________________________________________________________*/
72af5a
323051 #include "pgpSDKBuildFlags.h"
e8af5a
cfe2ff #include "pgpConfig.h"
51af5a
79c21c #if PGP_MACINTOSH¤  /* [ */
88af5a
15af5a
5ee28e #include <ConditionalMacros.h>
2baf5a
40eadc #if GENERATINGPOWERPC
84ba7a #define BNINCLUDE bnippc.h
4b7454 #endif
b9af5a
f16b23 #if GENERATING68K
72adf8 #define BNINCLUDE bni68020.h
5e7454 #endif
8aaf5a
520335 /*____________________________________________________________________________
e17ec4 ¤   We use pgpLeaks and so do clients. ·With the same magic field, if we
dc1e32 ¤   allocate a pointer, and a client deallocates it with the clients pgpFree,
fa6035 ¤   the problem may not be detected. By changing the magic field here, our
f04ecc ¤   version of leaks will use a different magic than the clients thus
51cd82 ¤   forcing a clearer error message.
ccf7f7 ____________________________________________________________________________*/
c4b2f0 #define kLeakItemMagic¤ ¤   ¤   'CMem'
aaaf5a
46af5a
c046ad #include "MacDebug.h"
99af5a
6bde56 #endif¤ /* ] PGP_MACINTOSH ·*/¶
--9e53 001ae97477840120260 Page 1 of PGPLibDebugHeaders.prefix
5d6916 note used
64af5a
ba77e0 #if __POWERPC__
f60dd9 ¤   #include "PGPLibDebugHeadersPPC"
2d67c5 ¤
99fc58 #elif __CFM68K__
47daba ¤   #include "PGPLibDebugHeadersCFM68K"
ac67c5 ¤
bcdb21 #else
b82d0c ¤   #include "PGPLibDebugHeaders68K"
877454 #endif
38af5a
f16eab #define PGP_MACINTOSH¤  ¤   1
095ee2 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1¤  // 1 is on, 0 off
beaf5a
10a32d #define UNFINISHED_CODE_ALLOWED¤¤   1¤  // XXX Turn this off before shipping!!!
e4af5a
a07f0b #define USE_WHACKFREESPACE¤ ¤   ¤   1
c1af5a
4adcd4 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   1
adaf5a
b836c8 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   1
04c7dc #define DEBUG_FIND_LEAKS¤   ¤   ¤   1
08af5a
26e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
0daf5a
ae5e9f #include "PGPLibCommonHeaders.h"
--c5ec 0012a26046540120261 Page 1 of PGPLibHeaders.prefix
d377e0 #if __POWERPC__
2fe47e ¤   #include "MacHeadersPPC"
08fc58 #elif __CFM68K__
aa67e9 ¤   #include "MacHeadersCFM68K"
79db21 #else
0cc4ab ¤   #include "MacHeaders68K"
997454 #endif
f3af5a
3c3b40 // unfortunate, but needed
4dbea2 #define MSL_USE_PRECOMPILED_HEADERS¤0
bb8985 #include "ansi_prefix.mac.h"
88af5a
7baf5a
df6eab #define PGP_MACINTOSH¤  ¤   1
07af5a
d2af5a
52f7bf #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0¤  // 1 is on, 0 off
f9af5a
f2a32d #define UNFINISHED_CODE_ALLOWED¤¤   1¤  // XXX Turn this off before shipping!!!
b0af5a
8b66d3 #define USE_WHACKFREESPACE¤ ¤   ¤   0
c7af5a
b3c50c #define USE_MAC_DEBUG_TRAPS¤¤   ¤   0
7daf5a
382f10 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   0
c8e97e #define PGP_DEBUG_FIND_LEAKS¤   ¤   0
32af5a
23e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
69af5a
2a5e9f #include "PGPLibCommonHeaders.h"
--a428 001d354ab4640120262 Page 1 of PGPLibHeadersDEBUG.prefix
d377e0 #if __POWERPC__
2fe47e ¤   #include "MacHeadersPPC"
08fc58 #elif __CFM68K__
aa67e9 ¤   #include "MacHeadersCFM68K"
79db21 #else
0cc4ab ¤   #include "MacHeaders68K"
997454 #endif
f3af5a
34af5a
427da7 /* unfortunate, but needed */
80bea2 #define MSL_USE_PRECOMPILED_HEADERS¤0
a58985 #include "ansi_prefix.mac.h"
29af5a
4e6eab #define PGP_MACINTOSH¤  ¤   1
43af5a
5baf5a
37af5a
4263de #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1¤  /* 1 is on, 0 off */
aeaf5a
c1b5ad /* XXX Turn this off before shipping!!! */
8f6068 #define UNFINISHED_CODE_ALLOWED¤¤   0
51af5a
48dcd4 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   1
835a25 #define USE_MAC_DEBUG_PATCHES¤  ¤   0
eaaf5a
f836c8 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   1
f1f0a6 #define PGP_DEBUG_FIND_LEAKS¤   ¤   1
c6af5a
45e6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
a1af5a
d35e9f #include "PGPLibCommonHeaders.h"
--df88 00168ba698240120263 Page 1 of PGPsdkHeaders.pch++
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
e7b613 ¤   $Id: PGPsdkHeaders.pch++,v 1.3.24.1 1998/11/12 03:20:20 heller Exp $
2ef7f7 ____________________________________________________________________________*/
5baf5a
dcaf5a
3677e0 #if __POWERPC__
f33053 #pragma precompile_target "PGPsdkHeadersPPC++"
5efc58 #elif __CFM68K__
de34a8 #pragma precompile_target "PGPsdkHeadersCFM68K++"
24db21 #else
9430d2 #pragma precompile_target "PGPsdkHeaders68K++"
5c7454 #endif
b9af5a
d9af5a
10a836 #define OLDROUTINENAMES ····0
86c8df #define OLDROUTINELOCATIONS 0
47af5a
86af5a
65af5a
0f27a3 #pragma once on
b7af5a
67d2b6 #include "MacHeaders.c"
68af5a
--96fa 001c714007640120264 Page 1 of PGPsdkWin32.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
adaf5a
f3655e ¤   $Id: PGPsdkWin32.prefix,v 1.4.12.1 1998/11/12 03:20:21 heller Exp $
90f7f7 ____________________________________________________________________________*/
eaaf5a
89af5a
e8515c #include <ansi_prefix.win32.h>
ebaf5a
6f23af #define¤_DEBUG
f7814f #define _AFX_PORTABLE
02af5a
ac93b3 #define _AFX_NO_DAO_SUPPORT
0f738d #define _AFX_NO_DEBUG_CRT
8faf5a
2ce610 #include "pgpPFLConfig.h"
d0af5a
f0af5a
81c114 #define PGP_WIN32¤  ¤   1
2ee14a #define PGP_MACINTOSH¤  0
40af5a
1bb18b #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0
3faf5a
b3b5ad /* XXX Turn this off before shipping!!! */
b82f47 #define UNFINISHED_CODE_ALLOWED¤¤   1¤
27af5a
3c66d3 #define USE_WHACKFREESPACE¤ ¤   ¤   0
0eaf5a
14af5a
2a2f10 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   0
0ae97e #define PGP_DEBUG_FIND_LEAKS¤   ¤   0
10af5a
01ff62 #define USE_PGP_OPERATOR_NEW¤   ¤   0
f1af5a
10af5a
57af5a
c75e9f #include "PGPLibCommonHeaders.h"
--c86a 000e560682140120265 Page 1 of main.c
a70335 /*____________________________________________________________________________
5dfede ¤   main.c
e167c5 ¤
34c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
474b0f ¤   All rights reserved.
dd67c5 ¤
2f67c5 ¤
6faf5a
b9c53e ¤   $Id: main.c,v 1.7.12.1 1998/11/12 03:20:22 heller Exp $
70f7f7 ____________________________________________________________________________*/
1caf5a
9bd224 #include "pgpConfig.h"¤ /* or pgpConfig.h in the CDK */
eeaf5a
18c21c #if PGP_MACINTOSH¤  /* [ */
7aaf5a
20af5a
968f22 #include <CodeFragments.h>
936c79 #include <Gestalt.h>
18af5a
700438 #include "MacBasics.h"
5ba146 #include "pgpDebug.h"
681b87 #include "pgpErrorsPriv.h"
360d08 #include "pgpMem.h"
5e5430 #include "pgpUtilitiesPriv.h"
c3af5a
ad99c6 PGP_BEGIN_C_DECLARATIONS
f5af5a
563d9b pascal OSErr ¤  INIT_PGPsdk(CFragInitBlock *initBlock);
af9e4c pascal void¤¤   TERM_PGPsdk(void);
71af5a
5213d1 pascal OSErr __initialize(const CFragInitBlock *theInitBlock);
91b65c pascal OSErr __terminate(void);
64af5a
e71254 PGP_END_C_DECLARATIONS
2baf5a
03d5a4 /* Disable 68020 code generation for the 68020 check itself */
c36b23 #if GENERATING68K
348d08 ¤   #pragma code68020 off
c07454 #endif
a2af5a
1948f4 ¤   pascal OSErr
0c303a INIT_PGPsdk(CFragInitBlock *initBlock)
afbb36 {
b5baed ¤   long¤   gestaltResult;
839c1a ¤   OSErr¤  err = noErr;
7d67c5 ¤
92d8af ¤   /*
9a896a ¤   ** Check for a 68020 or later processor and bail immediately if
51048d ¤   ** none is available.
94ad28 ¤   ** It is assumed that all clients of this library are doing a
955fd6 ¤   ** similar chack and refusing to run.
4c9faa ¤   */
6067c5 ¤
5cc3ca ¤   if( Gestalt( gestaltProcessorType, &gestaltResult ) == noErr &&
c48237 ¤   ¤   gestaltResult >= gestalt68020 )
3ec7a1 ¤   {
eba3e8 ¤   ¤   err = __initialize( initBlock );
d1af5a
e0d798 ¤   ¤   if ( IsntErr( err ) )
057385 ¤   ¤   ¤   err¤= PGPsdkInit();
295f9a ¤   ¤   pgpAssert( IsntPGPError( err ) );
ad9371 ¤   }
52af5a
2ddeb7 ¤   return( err );
39efe6 }
6caf5a
5b6685 ¤   pascal void
5c9833 TERM_PGPsdk(void)
d9bb36 {
e89193 ¤   (void)pgpsdkCleanupForce();
1767c5 ¤
e54a4b ¤   __terminate();
--83b0 00176c5595640120265 Page 2 of main.c
7aefe6 }
46af5a
b06b23 #if GENERATING68K
7a210c ¤   #pragma code68020 reset
6c7454 #endif
91af5a
86af5a
3c14ea #elif PGP_WIN32
1aaf5a
59af5a
d4af5a
63afb9 #if PGP_WIN32
61af5a
dffeb2 #include <stdio.h>
ddaf5a
a5460b #include <crtdbg.h>
ccaf5a
61bb71 _CRTIMP int __cdecl _CrtDbgReport(
245d20 ¤   ¤   int,
5ef928 ¤   ¤   const char *,
2e5d20 ¤   ¤   int,
87f928 ¤   ¤   const char *,
fff928 ¤   ¤   const char *,
743448 ¤   ¤   ...)
b3bb36 {
f37af4 ¤   // Bogus function to prevent link errors
ee585c ¤   printf( "_CrtDbgReport called\n" );
02efe6 }
cdaf5a
92db21 #else
69af5a
d6ad1c #error unknown target
00af5a
2f7454 #endif
e1af5a
f1af5a
377454 #endif
10af5a
0baf5a
c4af5a
edaf5a
41af5a
74af5a
19af5a
76af5a
--4b97 000dd1ca46d40120266 Page 1 of PGPsdkNetworkLib.prj.exp
156e45 PGPSetKeyServerIdleEventHandler
dc795d PGPGetKeyServerIdleEventHandler
9f665f PGPKeyServerInit
5447da PGPKeyServerCleanup
6cce1c PGPNewKeyServerFromURL
2baba5 PGPNewKeyServerFromHostName
26ac94 PGPNewKeyServerFromHostAddress
2c245d PGPFreeKeyServer
b715ef PGPIncKeyServerRefCount
1f122d PGPSetKeyServerEventHandler
394471 PGPGetKeyServerEventHandler
827e64 PGPCancelKeyServerCall
16fd66 PGPKeyServerOpen
8b1bca PGPKeyServerClose
573411 PGPGetKeyServerTLSSession
313aa7 PGPGetKeyServerType
54e27f PGPGetKeyServerAccessType
6415e7 PGPGetKeyServerKeySpace
01a67d PGPGetKeyServerPort
e230a7 PGPGetKeyServerHostName
417848 PGPGetKeyServerAddress
7f85cf PGPQueryKeyServer
4ec0cc PGPUploadToKeyServer
c9a180 PGPUploadPrivateKeysToKeyServer
0bea9d PGPDeleteFromKeyServer
636e59 PGPDisableFromKeyServer
d6d8f4 PGPSendGroupsToServer
ec6039 PGPRetrieveGroupsFromServer
8dcb40 PGPNewServerMonitor
2804be PGPFreeServerMonitor
1f4178 PGPGetLastKeyServerErrorString
1d8b56 PGPKeyServerCreateThreadStorage
72291e PGPKeyServerDisposeThreadStorage
bdaf5a
0912ac PGPSetSocketsIdleEventHandler
8d5f48 PGPGetSocketsIdleEventHandler
a301f1 PGPSocketsInit
cb704b PGPSocketsCleanup
085390 PGPOpenSocket
868363 PGPCloseSocket
bcfcbc PGPBindSocket
453915 PGPConnect
9559d2 PGPSend
1ffa85 PGPWrite
9a79f0 PGPSendTo
ebdfe3 PGPReceive
d11851 PGPRead
d2b453 PGPReceiveFrom
1c2a06 PGPListen
6e92d4 PGPAccept
290851 PGPSelect
465050 PGPGetHostByName
f481bd PGPGetHostByAddress
f7a159 PGPGetHostName
44e89b PGPGetProtocolByName
e7b02a PGPGetProtocolByNumber
6ef0ee PGPGetServiceByName
b8c84f PGPGetServiceByPort
b59081 PGPGetLastSocketsError
c3e716 PGPGetSocketName
b0f22a PGPGetPeerName
16ca3b PGPDottedToInternetAddress
079bb2 PGPInternetAddressToDottedString
802e2f PGPIOControlSocket
03db9e PGPGetSocketOptions
899343 PGPSetSocketOptions
e7d246 PGPSocketsEstablishTLSSession
2e8632 PGPSocketsCreateThreadStorage
4b0c31 PGPSocketsDisposeThreadStorage
f0af5a
fd42b7 PGPNewTLSContext
dd7fe8 PGPFreeTLSContext
--ec38 001bf391f9f40120266 Page 2 of PGPsdkNetworkLib.prj.exp
b25324 PGPtlsSetCache
55998b PGPtlsClearCache
a3416e PGPNewTLSSession
337c31 PGPFreeTLSSession
5f8b70 PGPtlsSetProtocolOptions
cc0421 PGPtlsClose
bae307 PGPtlsHandshake
d1208c PGPtlsSetPreferredCipherSuite
afdf7f PGPtlsSetRemoteUniqueID
600377 PGPtlsSetDHPrime
156345 PGPtlsGetRemoteAuthenticatedKey
671ecc PGPtlsSetLocalPrivateKey
6627f9 PGPtlsGetNegotiatedCipherSuite
9f5ab1 PGPtlsGetState
eb5fe5 PGPtlsReceive
9d55d9 PGPtlsSend
ec0f39 PGPtlsSetReceiveCallback
a9036f PGPtlsSetSendCallback
b01dee PGPtlsSendQueueIdle
bfd64b PGPtlsGetAlert
--3bb9 00173de744840120267 Page 1 of pgpConfig.h
a70335 /*____________________________________________________________________________
56088e ¤   pgpConfig.h ·(Macintosh version)
9167c5 ¤
3ff254 ¤   Copyright (C) 1996,1997 Network Associates, Inc. and its affiliates.
5c4b0f ¤   All rights reserved.
7267c5 ¤
d4bce0 ¤   This file contains the Macintosh version of the configuration file.
f0af5a
e410e1 ¤   $Id: pgpConfig.h,v 1.9.22.1 1998/11/12 03:20:23 heller Exp $
81f7f7 ____________________________________________________________________________*/
a5ae33 #ifndef Included_pgpConfig_h¤   /* [ */
65d3cd #define Included_pgpConfig_h
e0af5a
30af5a
d7e610 #include "pgpPFLConfig.h"
4daf5a
5faf5a
f4af5a
22af5a
1bab8f #endif /* ] Included_pgpConfig_h */
e6af5a
377e4d /*__Editor_settings____
caaf5a
f24126 ¤   Local Variables:
fe7b17 ¤   tab-width: 4
e50e6c ¤   End:
295f8c ¤   vi: ts=4 sw=4
119e9b ¤   vim: si
73d062 _____________________*/
--7998 001debd901240120268 Page 1 of PGPsdkUILib.prj.exp
4f65a1 PGPRecipientDialog
077401 PGPPassphraseDialog
305ca9 PGPKeyPassphraseDialog
d90bdc PGPConfirmationPassphraseDialog
6ea5d3 PGPSigningPassphraseDialog
2d9cb4 PGPConventionalEncryptionPassphraseDialog
e8cbfb PGPConventionalDecryptionPassphraseDialog
b7708a PGPDecryptionPassphraseDialog
1c323e PGPOptionsDialog
3da58e PGPCollectRandomDataDialog
a8ca9f PGPSearchKeyServerDialog
f49a7f PGPSendToKeyServerDialog
d9af5a
831bea PGPEstimatePassphraseQuality
2faf5a
eca669 PGPOUIDialogPrompt
9045c8 PGPOUIWindowTitle
8b2656 PGPOUIOutputPassphrase
bcc6f0 PGPOUICheckbox
b25083 PGPOUIPopupList
186ea4 PGPOUIDialogOptions
d4dd79 PGPOUIMinimumPassphraseLength
23dd7c PGPOUIMinimumPassphraseQuality
2e517f PGPOUIShowPassphraseQuality
0700fb PGPOUIDefaultKey
233e13 PGPOUIVerifyPassphrase
f32961 PGPOUIFindMatchingKey
d3ae58 PGPOUIDefaultRecipients
3afb1d PGPOUIDisplayMarginalValidity
c046ef PGPOUIIgnoreMarginalValidity
d9719f PGPOUIRecipientGroups
bd5fa4 PGPOUIEnforceAdditionalRecipientRequests
db9352 PGPOUIKeyServerSearchFilter
04925f PGPOUIKeyServerSearchKeySet
025b86 PGPOUIKeyServerSearchKeyIDList
e6ad0c PGPOUIKeyServerSearchKey
2c715b PGPOUIKeyServerUpdateParams
fbb990 PGPOUIRecipientList
def69b PGPOUITextUI¶
--9d3d 00060f1503240120269 Page 1 of CPGPCheckboxOptionView.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
37c241 ¤   $Id: CPGPCheckboxOptionView.cp,v 1.3.12.1 1998/11/12 03:20:26 heller Exp $
d8f7f7 ____________________________________________________________________________*/
aaaf5a
b207ea // Public includes:
e88708 #include <LCheckBox.h>
76dd56 #include <PP_Messages.h>
23af5a
9c85c2 #include "MacStrings.h"
510d08 #include "pgpMem.h"
e6af5a
3e05c5 // Private includes:
157026 #include "CPGPCheckboxOptionView.h"
f7af5a
67d1b3 const ResIDT¤   kCheckboxOptionViewResourceID ¤ = 4800;
5b5b61 const PaneIDT¤  kCheckboxPaneID ¤   ¤   ¤   ¤   = 4800;
4eaf5a
cc6560 CPGPCheckboxOptionView::CPGPCheckboxOptionView(LStream *inStream) :
6c3c22 ¤   ¤   ¤   ¤   ¤   CPGPOptionView(inStream)
03bb36 {
820be1 ¤   mCheckbox ¤ = NULL;
b50760 ¤   mResultPtr¤ = NULL;
93efe6 }
d6af5a
7891ca CPGPCheckboxOptionView::~CPGPCheckboxOptionView()
bebb36 {
25efe6 }
58af5a
f66d52 ¤   void
e1294e CPGPCheckboxOptionView::FinishCreateSelf(void)
3ebb36 {
aa6bef ¤   CPGPOptionView::FinishCreateSelf();
9367c5 ¤
c300e0 ¤   mCheckbox = (LCheckBox *) FindPaneByID( kCheckboxPaneID );
2ea5bf ¤   pgpAssertAddrValid( mCheckbox, VoidAlign );
b2efe6 }
e8af5a
f66d52 ¤   void
0bb103 CPGPCheckboxOptionView::ListenToMessage(
b019a3 ¤   MessageT ¤  inMessage,
af7503 ¤   void ¤  ¤   *ioParam)
90bb36 {
87769e ¤   switch( inMessage )
29c7a1 ¤   {
add8ba ¤   ¤   case msg_OK:
4b5b34 ¤   ¤   {
e36652 ¤   ¤   ¤   pgpAssertAddrValid( mCheckbox, VoidAlign );
9c11dd ¤   ¤   ¤   pgpAssertAddrValid( mResultPtr, PGPUInt32 );
d887c7 ¤   ¤   ¤
a8994b ¤   ¤   ¤   *mResultPtr = mCheckbox->GetValue();
44cdcb ¤   ¤   ¤   break;
e90fe4 ¤   ¤   }
0d1b52 ¤   ¤
069ae3 ¤   ¤   default:
2191c4 ¤   ¤   ¤   CPGPOptionView::ListenToMessage( inMessage, ioParam );
03cdcb ¤   ¤   ¤   break;
d19371 ¤   }
a9efe6 }
9caf5a
366d52 ¤   void
e00216 CPGPCheckboxOptionView::SetInfo(const PGPOUICheckboxDesc *info)
c1bb36 {
7ae020 ¤   Str255¤ pTitle;
0a67c5 ¤
0cec56 ¤   pgpAssertAddrValid( info, PGPOUICheckboxDesc );
8d47d0 ¤   pgpAssertAddrValid( info->title, char );
36daa5 ¤   pgpAssertAddrValid( info->description, char );
daa303 ¤   pgpAssertAddrValid( info->valuePtr, PGPBoolean );
6067c5 ¤
--d107 001a2d27bb440120269 Page 2 of CPGPCheckboxOptionView.cp
1aadad ¤   mItemID ¤   = info->itemID;
41c19d ¤   mResultPtr ¤= info->valuePtr;
7567c5 ¤
d34ff1 ¤   CToPString( info->title, pTitle );
23bca8 ¤   mCheckbox->SetDescriptor( pTitle );
a667c5 ¤
834246 ¤   mCheckbox->SetValue( *mResultPtr > 0 ? 1 : 0 );
2826f6 ¤   SetDescription( info->description );
1667c5 ¤
faefe6 }
96af5a
ce3a1b ¤   CPGPCheckboxOptionView *
1cfb95 CPGPCheckboxOptionView::CreateCheckboxOptionView(
e678f7 ¤   LView ¤ ¤   ¤   ¤   ¤   ¤   *superView,
8d2fa6 ¤   const PGPOUICheckboxDesc¤   *info)
bdbb36 {
f8a727 ¤   CPGPCheckboxOptionView¤ *checkboxView;
8267c5 ¤
9ec97f ¤   pgpAssertAddrValid( superView, VoidAlign );
f0ec56 ¤   pgpAssertAddrValid( info, PGPOUICheckboxDesc );
fc67c5 ¤
cf2012 ¤   checkboxView = (CPGPCheckboxOptionView *)
9ef800 ¤   ¤   ¤   ¤   ¤   ¤   CPGPOptionView::CreateOptionView(
ebaaff ¤   ¤   ¤   ¤   ¤   ¤   ¤   superView, kCheckboxOptionViewResourceID );
6b7804 ¤   if( IsntNull( checkboxView ) )
4bc7a1 ¤   {
67e69a ¤   ¤   checkboxView->SetInfo( info );
c89371 ¤   }
2867c5 ¤
6962d0 ¤   return ( checkboxView );
a2be43 }¶
--8649 0013132b99a4012026a Page 1 of CPGPCheckboxOptionView.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
842156 ¤   $Id: CPGPCheckboxOptionView.h,v 1.3.12.1 1998/11/12 03:20:27 heller Exp $
86f7f7 ____________________________________________________________________________*/
1daf5a
fb7b7d #pragma once
09af5a
f70141 #include "pgpOptionListPriv.h"
06af5a
20d8d1 #include "CPGPOptionView.h"
06af5a
42e276 class LCheckBox;
18af5a
327a6e class CPGPCheckboxOptionView : public CPGPOptionView
d2bb36 {
905ed4 public:
8091a6 ¤   enum { class_ID = 'COpt' };
e1af5a
e9299e ¤   ¤   ¤   ¤   ¤   ¤   CPGPCheckboxOptionView(LStream *inStream);
3e6ab8 ¤   virtual¤¤   ¤   ¤   ~CPGPCheckboxOptionView();
4eaf5a
77dad0 ¤   virtual¤void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
ecaf5a
420215 ¤   static CPGPCheckboxOptionView *CreateCheckboxOptionView(
857f5f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LView *inSuperView,
c2a60b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPOUICheckboxDesc *desc );
40a2d3 protected:
f9af5a
8b80fd ¤   virtual void¤   ¤   FinishCreateSelf();
7167c5 ¤
8b0fb9 private:
61af5a
b63bfe ¤   LCheckBox¤  ¤   ¤   *mCheckbox;
ac8b9f ¤   PGPUInt32¤  ¤   ¤   *mResultPtr;
4d67c5 ¤
30f1f3 ¤   void¤   ¤   ¤   ¤   SetInfo(const PGPOUICheckboxDesc *info);
5c82f7 };
31af5a
--5f17 0008152c55b4012026b Page 1 of CPGPConfPassphraseGrafPort.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
eebf3f ¤   $Id: CPGPConfPassphraseGrafPort.cp,v 1.4.12.1 1998/11/12 03:20:28 heller Ex¶
46b277 p $
71f7f7 ____________________________________________________________________________*/
33af5a
4f324c #include <string.h>
5caf5a
c6e48b #include <LCheckbox.h>
c449f7 #include <LProgressBar.h>
7edd56 #include <PP_Messages.h>
40af5a
95bf4a #include "MacSecureMemory.h"
c7af5a
f2829c #include "CPassphraseEdit.h"
e0d780 #include "CPGPConfPassphraseGrafPort.h"
1efaae #include "PGPsdkUILibDialogs.h"
25af5a
e00ada CPGPConfPassphraseGrafPortView::
53ed2d ¤   CPGPConfPassphraseGrafPortView(LStream *inStream)
f06b3b ¤   : CPGPPassphraseGrafPortView(inStream)
49bb36 {
2476f4 ¤   mOptions ¤  ¤   ¤   = NULL;
8dbe07 ¤   mPassphraseQualityBar¤  = NULL;
c8efe6 }
eaaf5a
5318fe CPGPConfPassphraseGrafPortView::~CPGPConfPassphraseGrafPortView()
59bb36 {
a2efe6 }
7eaf5a
486d52 ¤   void
a7e079 CPGPConfPassphraseGrafPortView::FinishCreateSelf()
7fbb36 {
ed2071 ¤   CPGPPassphraseGrafPortView::FinishCreateSelf();
2667c5 ¤
aa1670 ¤   mConfirmationEdit =
8f7adf ¤   ¤   (CPassphraseEdit *) FindPaneByID( kConfirmationEditFieldPaneID );
e8ad39 ¤   mPassphraseQualityBar =·
6317f5 ¤   ¤   (LProgressBar *) FindPaneByID( kPassphraseQualityBarPaneID );
961b52 ¤   ¤
1df1d2 ¤   pgpAssertAddrValid( mConfirmationEdit, VoidAlign );¤
3ca105 ¤   pgpAssertAddrValid( mPassphraseQualityBar, VoidAlign );
f167c5 ¤
5b2a8c ¤   SwitchTarget( mPassphraseEdit );
76af5a
337167 ¤   mPassphraseQualityBar->SetValue ( 0 );
42efe6 }
e3af5a
3b6d52 ¤   void
6f7a88 CPGPConfPassphraseGrafPortView::ListenToMessage(
7619a3 ¤   MessageT ¤  inMessage,
2e7503 ¤   void ¤  ¤   *ioParam)
62bb36 {
d5e509 ¤   if( inMessage == msg_HideTyping )
a4c7a1 ¤   {
13d43e ¤   ¤   mConfirmationEdit->SetHideTyping(
4a690b ¤   ¤   ¤   ¤   ¤   mHideTypingCheckbox->GetValue() == 1 );
c09371 ¤   }
ee4364 ¤   else if( inMessage == msg_ChangedPassphrase )
59c7a1 ¤   {
e71896 ¤   ¤   if( mPassphraseQualityBar->IsVisible() )
cd5b34 ¤   ¤   {
b0b694 ¤   ¤   ¤   PGPUInt32¤  quality;
921b52 ¤   ¤
10bfd3 ¤   ¤   ¤   quality = mPassphraseEdit->EstimatePassphraseQuality();
e25e81 ¤   ¤   ¤   mPassphraseQualityBar->SetValue( quality );
d30fe4 ¤   ¤   }
859371 ¤   }
5167c5 ¤
816d59 ¤   CPGPPassphraseGrafPortView::ListenToMessage( inMessage, ioParam );
--ebf6 001f40634374012026b Page 2 of CPGPConfPassphraseGrafPort.cp
7aefe6 }
46af5a
b0c744 ¤   PGPError
848bc8 CPGPConfPassphraseGrafPortView::SetOptions(
ed520e ¤   PGPContextRef¤  context,
b83e17 ¤   CPGPConfirmationPassphraseDialogOptions *options)
a4bb36 {
9f8e12 ¤   PGPError¤   err = kPGPError_NoErr;
f367c5 ¤
75a80e ¤   err = CPGPPassphraseGrafPortView::SetOptions( context, options );
9fb1f0 ¤   if( IsntPGPError( err ) )
97c7a1 ¤   {
124f75 ¤   ¤   mOptions = options;
f61b52 ¤   ¤
ad6265 ¤   ¤   if( ! mOptions->mShowPassphraseQuality )
475b34 ¤   ¤   {
7715d1 ¤   ¤   ¤   LPane¤  *qualityCaption;
4f87c7 ¤   ¤   ¤
251a68 ¤   ¤   ¤   qualityCaption = FindPaneByID( kPassphraseQualityCaptionPaneID );
befc9e ¤   ¤   ¤   pgpAssertAddrValid( qualityCaption, VoidAlign );
3f87c7 ¤   ¤   ¤
1cfeff ¤   ¤   ¤   mPassphraseQualityBar->Hide();
ddc80a ¤   ¤   ¤   qualityCaption->Hide();
b40fe4 ¤   ¤   }
329371 ¤   }
4b1b52 ¤   ¤
d0deb7 ¤   return( err );
e9efe6 }
94af5a
576d52 ¤   void
9ab232 CPGPConfPassphraseGrafPortView::ClearPassphrase(void)
6cbb36 {
c43548 ¤   CPGPPassphraseGrafPortView::ClearPassphrase();
b167c5 ¤
a61973 ¤   mConfirmationEdit->ClearPassphrase();
692a8c ¤   SwitchTarget( mPassphraseEdit );
0fefe6 }
44af5a
b29cb9 ¤   MessageT
e4b3a8 CPGPConfPassphraseGrafPortView::HandleMessage(MessageT theMessage)
8cbb36 {
838337 ¤   if( theMessage == msg_OK )
4ac7a1 ¤   {
fe525d ¤   ¤   CSecureCString256¤  testPassphrase;
77a3b4 ¤   ¤   CSecureCString256¤  testConfirmation;
e61b52 ¤   ¤
f0750b ¤   ¤   mPassphraseEdit->GetPassphrase( testPassphrase );
0fe3fe ¤   ¤   mConfirmationEdit->GetPassphrase( testConfirmation );
d61b52 ¤   ¤
8456d7 ¤   ¤   if( strcmp( testPassphrase, testConfirmation ) != 0 )
d25b34 ¤   ¤   {
24c2cb ¤   ¤   ¤   SysBeep( 1 );
4287c7 ¤   ¤   ¤
91c687 ¤   ¤   ¤   PGPUIWarningAlert( kPGPUIGenericOKAlert,
7bbb30 ¤   ¤   ¤   ¤   ¤   ¤   kPGPLibDialogsStringListResID,
0d0f8b ¤   ¤   ¤   ¤   ¤   ¤   kConvEncryptionPassphraseNotConfirmedStrIndex );
bf87c7 ¤   ¤   ¤
dec9d6 ¤   ¤   ¤   ClearPassphrase();
3987c7 ¤   ¤   ¤
00e5f3 ¤   ¤   ¤   theMessage = msg_Nothing;
380fe4 ¤   ¤   }
4b0e1d ¤   ¤   else
c25b34 ¤   ¤   {
103f58 ¤   ¤   ¤   theMessage = CPGPPassphraseGrafPortView::HandleMessage(theMessage);
0b0fe4 ¤   ¤   }
2f9371 ¤   }
da67c5 ¤
30cfbc ¤   return( theMessage );
f4be43 }¶
--2d1f 0011e29c5104012026c Page 1 of CPGPConfPassphraseGrafPort.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
adb7bb ¤   $Id: CPGPConfPassphraseGrafPort.h,v 1.4.10.1 1998/11/12 03:20:29 heller Exp¶
feed4e ·$
79f7f7 ____________________________________________________________________________*/
0daf5a
ed7b7d #pragma once
14af5a
bdd1c7 #include "CPGPPassphraseGrafPortView.h"
ebaf5a
3779e9 class LProgressBar;
69af5a
3f1c92 class CPGPConfPassphraseGrafPortView : public CPGPPassphraseGrafPortView
fdbb36 {
735ed4 public:
04af5a
062f4b ¤   enum
6ac7a1 ¤   {
c429e7 ¤   ¤   class_ID = 'CPGP',
501b52 ¤   ¤
2b7884 ¤   ¤   kConfirmationEditFieldPaneID ¤  = 'eCnf',
3434ed ¤   ¤   kPassphraseQualityBarPaneID¤¤   = 'Qual',
21f980 ¤   ¤   kPassphraseQualityCaptionPaneID¤= 'QCap',
f81b52 ¤   ¤
233d68 ¤   ¤   msg_ChangedConfirmation¤¤   ¤   = kConfirmationEditFieldPaneID
0b62bd ¤   };
34af5a
ddb328 ¤   ¤   ¤   ¤   ¤   ¤   CPGPConfPassphraseGrafPortView(LStream *inStream);
079f01 ¤   virtual¤¤   ¤   ¤   ~CPGPConfPassphraseGrafPortView();
92af5a
904438 ¤   virtual void¤   ¤   ClearPassphrase(void);
0bdad0 ¤   virtual¤void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
83af5a
119160 ¤   PGPError¤   ¤   ¤   SetOptions(PGPContextRef context,
a1c005 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPConfirmationPassphraseDialogOptions *options);
67af5a
09a2d3 protected:
a0af5a
20a919 ¤   CPassphraseEdit¤¤   *mConfirmationEdit;
d1e0fb ¤   LProgressBar¤   ¤   *mPassphraseQualityBar;
72af5a
bdfebc ¤   virtual void¤   ¤   FinishCreateSelf(void);
012bf8 ¤   virtual¤MessageT¤   HandleMessage(MessageT theMessage);
beaf5a
570fb9 private:
ecaf5a
75abda ¤   const CPGPConfirmationPassphraseDialogOptions¤  *mOptions;
1e82f7 };
--c36c 0000f58b6094012026d Page 1 of CPGPDecrPassphraseGrafPort.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
c3ad89 ¤   $Id: CPGPDecrPassphraseGrafPort.cp,v 1.14.10.1 1998/11/12 03:20:29 heller E¶
c7fda4 xp $
e0f7f7 ____________________________________________________________________________*/
53af5a
28d797 #include <LPushButton.h>
ff05c6 #include <LStaticText.h>
5add56 #include <PP_Messages.h>
3daf5a
8985c2 #include "MacStrings.h"
262f8d #include "pgpErrors.h"
c90d08 #include "pgpMem.h"
cbafa7 #include "pgpPassphraseUtils.h"
f0af5a
4d829c #include "CPassphraseEdit.h"
069165 #include "CPGPDecrPassphraseGrafPort.h"
4bfe54 #include "CPrivateKeysPopup.h"
0aebab #include "CPGPRecipientTable.h"
8efaae #include "PGPsdkUILibDialogs.h"
929fda #include "PGPsdkUILibUtils.h"
13af5a
679948 CPGPDecryptionPassphraseGrafPortView::
99bc30 ¤   CPGPDecryptionPassphraseGrafPortView(LStream *inStream)
a33045 ¤   : CPGPKeySetPassphraseGrafPortView(inStream)
f5bb36 {
930c36 ¤   mOptions¤   ¤   = NULL;
0822dc ¤   mRecipientTable¤= NULL;
d6efe6 }
8daf5a
640806 CPGPDecryptionPassphraseGrafPortView::~CPGPDecryptionPassphraseGrafPortView()
16bb36 {
f4efe6 }
f4af5a
f76d52 ¤   void
181cde CPGPDecryptionPassphraseGrafPortView::FinishCreateSelf()
c8bb36 {
ac8b81 ¤   CPGPKeySetPassphraseGrafPortView::FinishCreateSelf();
6d67c5 ¤
a309ad ¤   mRecipientTable =
3b2d7b ¤   ¤   (CPGPRecipientTable *) FindPaneByID( kRecipientUserIDTablePaneID );
2d685c ¤   pgpAssertAddrValid( mRecipientTable, VoidAlign );
81af5a
cd8214 ¤   mRecipientTable->InsertCols(1, 1, NULL, 0, TRUE);
7d7bae ¤   mRecipientTable->AddListener( this );
50efe6 }
89af5a
d6c744 ¤   PGPError
0d0010 CPGPDecryptionPassphraseGrafPortView::AddKeySetToRecipientsTable(
1f0f78 ¤   PGPKeySetRef keySet)
31bb36 {
22fb19 ¤   PGPError¤   ¤   err;
9e5445 ¤   PGPKeyListRef¤  keyList;
de67c5 ¤
952bbd ¤   err = PGPOrderKeySet( keySet, kPGPAnyOrdering, &keyList );
42b1f0 ¤   if( IsntPGPError( err ) )
e8c7a1 ¤   {
5720b4 ¤   ¤   PGPKeyIterRef¤  keyIterator;
cd1b52 ¤   ¤
3646e0 ¤   ¤   err = PGPNewKeyIter( keyList, &keyIterator );
8e86f8 ¤   ¤   if( IsntPGPError( err ) )
fc5b34 ¤   ¤   {
9d3754 ¤   ¤   ¤   PGPKeyRef¤  theKey;
95af5a
72a048 ¤   ¤   ¤   err = PGPKeyIterNext( keyIterator, &theKey );
408f5a ¤   ¤   ¤   while( IsntPGPError( err ) )
89f776 ¤   ¤   ¤   {
15498d ¤   ¤   ¤   ¤   mRecipientTable->AddKey( theKey );
732b85 ¤   ¤   ¤   ¤
0f4248 ¤   ¤   ¤   ¤   err = PGPKeyIterNext( keyIterator, &theKey );
--394b 0006b8aa7834012026d Page 2 of CPGPDecrPassphraseGrafPort.cp
cfa3a6 ¤   ¤   ¤   }
511b52 ¤   ¤
206ae1 ¤   ¤   ¤   if( err == kPGPError_EndOfIteration )
a5bd37 ¤   ¤   ¤   ¤   err = kPGPError_NoErr;
f52b85 ¤   ¤   ¤   ¤
ab3433 ¤   ¤   ¤   PGPFreeKeyIter( keyIterator );
c90fe4 ¤   ¤   }
82af5a
816efb ¤   ¤   PGPFreeKeyList( keyList );
389371 ¤   }
7d67c5 ¤
27deb7 ¤   return( err );
85efe6 }
47af5a
a3c744 ¤   PGPError
5230e1 CPGPDecryptionPassphraseGrafPortView::BuildRecipientsTable(void)
0dbb36 {
a2fb19 ¤   PGPError¤   ¤   err;
7f563a ¤   TableIndexT¤¤   numRows, numColumns;
7a67c5 ¤
816fad ¤   mRecipientTable->GetTableSize( numRows, numColumns );
dfeb80 ¤   if( numRows != 0 )
e759e1 ¤   ¤   mRecipientTable->RemoveRows( numRows, 1, TRUE );
2267c5 ¤
9a6e4d ¤   if( IsntNull( mOptions->mMissingKeyIDList ) )
4ac7a1 ¤   {
661ba1 ¤   ¤   Str255¤ userID;
471b52 ¤   ¤
b8bd71 ¤   ¤   if( mOptions->mMissingKeyIDCount == 1 )
925b34 ¤   ¤   {
9301dd ¤   ¤   ¤   GetIndString( userID, kPGPLibDialogsStringListResID,
d036f6 ¤   ¤   ¤   ¤   kUnknownRecipientStrIndex );
aa0fe4 ¤   ¤   }
470e1d ¤   ¤   else
135b34 ¤   ¤   {
afb70a ¤   ¤   ¤   Str32¤  numStr;
bb87c7 ¤   ¤   ¤
c301dd ¤   ¤   ¤   GetIndString( userID, kPGPLibDialogsStringListResID,
2216c1 ¤   ¤   ¤   ¤   kXUnknownRecipientsStrIndex );
03c0dd ¤   ¤   ¤   NumToString( mOptions->mMissingKeyIDCount, numStr );
2e2227 ¤   ¤   ¤   PrintPString( userID, userID, numStr );
9b0fe4 ¤   ¤   }
4c1b52 ¤   ¤
9bf252 ¤   ¤   PToCString( userID, (char *) userID );
02a769 ¤   ¤   mRecipientTable->AddMissingUserID( (char *) userID );
0b9371 ¤   }
1867c5 ¤
96caf3 ¤   err = AddKeySetToRecipientsTable( mOptions->mKeySet );
159830 ¤   if( IsntPGPError( err ) &&
49fcbc ¤   ¤   IsntNull( mOptions->mNewKeys ) &&
d779d2 ¤   ¤   PGPKeySetRefIsValid( *mOptions->mNewKeys ) )
7ec7a1 ¤   {
37434f ¤   ¤   err = AddKeySetToRecipientsTable( *mOptions->mNewKeys );
c19371 ¤   }
8b67c5 ¤
58deb7 ¤   return( err );
66efe6 }
75af5a
e7c744 ¤   PGPError
13c779 CPGPDecryptionPassphraseGrafPortView::SetOptions(
2211f0 ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   context,
1c6899 ¤   CPGPDecryptionPassphraseDialogOptions *options)
c5bb36 {
948e12 ¤   PGPError¤   err = kPGPError_NoErr;
1e67c5 ¤
f72207 ¤   err = CPGPKeySetPassphraseGrafPortView::SetOptions( context, options );
e7b1f0 ¤   if( IsntPGPError( err ) )
2dc7a1 ¤   {
759fbc ¤   ¤   Str255¤ ¤   msg;
161b52 ¤   ¤
a24f75 ¤   ¤   mOptions = options;
6b1b52 ¤   ¤
--896a 000cf3e74b14012026d Page 3 of CPGPDecrPassphraseGrafPort.cp
0df533 ¤   ¤   pgpAssert( PGPKeySetRefIsValid( mOptions->mKeySet ) );
bdaf5a
93d575 ¤   ¤   if( PGPKeyRefIsValid( options->mDefaultKey ) )
485b34 ¤   ¤   {
e8061b ¤   ¤   ¤   LStaticText¤*keyCaption;
aa7422 ¤   ¤   ¤   PGPSize¤¤   len;
c987c7 ¤   ¤   ¤
1bec06 ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer( options->mDefaultKey,
8896a7 ¤   ¤   ¤   ¤   sizeof( msg ) - 1, (char *) &msg[1], &len );
163c6b ¤   ¤   ¤   if ( IsntPGPError( err ) )
55f776 ¤   ¤   ¤   {
903d9a ¤   ¤   ¤   ¤   keyCaption = (LStaticText *) FindPaneByID(
e90de6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeyIDTextPaneID );
d095eb ¤   ¤   ¤   ¤   pgpAssertAddrValid( keyCaption, VoidAlign );
5187c7 ¤   ¤   ¤
b79f88 ¤   ¤   ¤   ¤   msg[0] = len;
722b85 ¤   ¤   ¤   ¤
61df97 ¤   ¤   ¤   ¤   keyCaption->SetDescriptor( msg );
6ba3a6 ¤   ¤   ¤   }
660fe4 ¤   ¤   }
2d0e1d ¤   ¤   else
9e5b34 ¤   ¤   {
b21401 ¤   ¤   ¤   Str255¤ msg;
3f87c7 ¤   ¤   ¤
7b66a1 ¤   ¤   ¤   GetIndString( msg, kPGPLibDialogsStringListResID,
e2c0db ¤   ¤   ¤   ¤   ¤   ¤   kNoDecryptionKeysFoundStrIndex );
b891ed ¤   ¤   ¤   SetDescriptor( msg );
2a87c7 ¤   ¤   ¤
6abace ¤   ¤   ¤   mPassphraseEdit->Hide();
e1c03c ¤   ¤   ¤   mOKButton->Disable();
990fe4 ¤   ¤   }
6baf5a
d286f8 ¤   ¤   if( IsntPGPError( err ) )
ac5b34 ¤   ¤   {
53283f ¤   ¤   ¤   err = BuildRecipientsTable();
5e0fe4 ¤   ¤   }
169371 ¤   }
3b67c5 ¤
98deb7 ¤   return( err );
2defe6 }
3b67c5 ¤
dd3609 ¤   PGPKeyRef
e78a0e CPGPDecryptionPassphraseGrafPortView::FindKeyForPassphrase(
f8215d ¤   PGPKeySetRef ¤  keySet,
fd3940 ¤   const char ¤¤   *passphrase)
4bbb36 {
129916 ¤   return( GetKeyForPassphrase( keySet, passphrase, FALSE ) );
7cefe6 }
43af5a
683609 ¤   PGPKeyRef
1a7c48 CPGPDecryptionPassphraseGrafPortView::GetPassphraseKey(void)
a5bb36 {
0c4bd1 ¤   pgpAssert( PGPKeyRefIsValid( mOptions->mDefaultKey ) );
5467c5 ¤
cb7777 ¤   return( mOptions->mDefaultKey );
ebefe6 }
24af5a
636d52 ¤   void
aaaecb CPGPDecryptionPassphraseGrafPortView::ListenToMessage(
8319a3 ¤   MessageT ¤  inMessage,
cb7503 ¤   void ¤  ¤   *ioParam)
dabb36 {
ba769e ¤   switch( inMessage )
4bc7a1 ¤   {
04c2cf ¤   ¤   case kUpdateMissingRecipientsMsg:
205b34 ¤   ¤   {
cc73ba ¤   ¤   ¤   PGPBoolean¤ haveNewKeys;
2e87c7 ¤   ¤   ¤
6eead4 ¤   ¤   ¤   (void) mOptions->SearchForMissingKeys( NULL, &haveNewKeys );
db2698 ¤   ¤   ¤   if( haveNewKeys )
fbf776 ¤   ¤   ¤   {
cfb027 ¤   ¤   ¤   ¤   BuildRecipientsTable();
--9b8a 0016cb300874012026d Page 4 of CPGPDecrPassphraseGrafPort.cp
cfa3a6 ¤   ¤   ¤   }
45cdcb ¤   ¤   ¤   break;
850fe4 ¤   ¤   }
671b52 ¤   ¤
299ae3 ¤   ¤   default:
fb4dc0 ¤   ¤   ¤   CPGPKeySetPassphraseGrafPortView::ListenToMessage(
e8488a ¤   ¤   ¤   ¤   ¤   ¤   inMessage, ioParam );
2ccdcb ¤   ¤   ¤   break;
459371 ¤   }
6cefe6 }
--75f0 0010061f8624012026e Page 1 of CPGPDecrPassphraseGrafPort.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
3d5aee ¤   $Id: CPGPDecrPassphraseGrafPort.h,v 1.10.10.1 1998/11/12 03:20:30 heller Ex¶
6bb277 p $
2ef7f7 ____________________________________________________________________________*/
92af5a
cd7b7d #pragma once
42af5a
4e1c4f #include "CPGPKeyPassphraseGrafPort.h"
2baf5a
68436e class CPGPRecipientTable;
69af5a
dea6ab class CPGPDecryptionPassphraseGrafPortView :·
b60371 ¤   ¤   ¤   public CPGPKeySetPassphraseGrafPortView
7abb36 {
b35ed4 public:
eeaf5a
b02f4b ¤   enum
b7c7a1 ¤   {
aceeff ¤   ¤   class_ID = 'DPGP',
ce1b52 ¤   ¤
013978 ¤   ¤   kRecipientUserIDTablePaneID¤= 'tUsr'
e162bd ¤   };
6eaf5a
48a90f ¤   ¤   ¤   ¤   ¤   ¤   CPGPDecryptionPassphraseGrafPortView(LStream *inStream);
c91c75 ¤   virtual¤¤   ¤   ¤   ~CPGPDecryptionPassphraseGrafPortView();
ddaf5a
4fe629 ¤   virtual void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
cd9160 ¤   PGPError¤   ¤   ¤   SetOptions(PGPContextRef context,
958a46 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPDecryptionPassphraseDialogOptions *options);
8c531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
47a2d3 protected:
c1af5a
e5cf71 ¤   CPGPRecipientTable¤ *mRecipientTable;
bbaf5a
4efebc ¤   virtual void¤   ¤   FinishCreateSelf(void);
5257b4 ¤   virtual PGPKeyRef¤  FindKeyForPassphrase(PGPKeySetRef keySet,
28e628 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const char *passphrase);
f74e86 ¤   virtual PGPKeyRef¤  GetPassphraseKey(void);
af67c5 ¤
b30fb9 private:
dcaf5a
a8c2b7 ¤   CPGPDecryptionPassphraseDialogOptions¤  ¤   *mOptions;
6667c5 ¤
1a3a3e ¤   PGPError¤   ¤   ¤   AddKeySetToRecipientsTable(PGPKeySetRef keySet);
94cdea ¤   PGPError¤   ¤   ¤   BuildRecipientsTable(void);
0082f7 };
--d1d2 00033f23b214012026f Page 1 of CPGPKeyPassphraseGrafPort.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
5dfb3b ¤   $Id: CPGPKeyPassphraseGrafPort.cp,v 1.10.10.1 1998/11/12 03:20:31 heller Ex¶
e4b277 p $
b1f7f7 ____________________________________________________________________________*/
f8af5a
7905c6 #include <LStaticText.h>
b0dd56 #include <PP_Messages.h>
0eaf5a
d085c2 #include "MacStrings.h"
8d2f8d #include "pgpErrors.h"
a8a076 #include "pgpKeys.h"
aa0d08 #include "pgpMem.h"
5faf5a
e9829c #include "CPassphraseEdit.h"
391c4f #include "CPGPKeyPassphraseGrafPort.h"
a7faae #include "PGPsdkUILibDialogs.h"
0d9fda #include "PGPsdkUILibUtils.h"
76af5a
152a1a CPGPKeyPassphraseGrafPortView::
103fba ¤   CPGPKeyPassphraseGrafPortView(LStream *inStream)
bc6b3b ¤   : CPGPPassphraseGrafPortView(inStream)
cebb36 {
ff23a9 ¤   mOptions = NULL;
31efe6 }
9eaf5a
66a008 CPGPKeyPassphraseGrafPortView::~CPGPKeyPassphraseGrafPortView()
ffbb36 {
8cefe6 }
10af5a
7ec744 ¤   PGPError
c47863 CPGPKeyPassphraseGrafPortView::SetOptions(
24284d ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   context,
bd5d0e ¤   CPGPKeyPassphraseDialogOptions ¤*options)
bfbb36 {
518e12 ¤   PGPError¤   err = kPGPError_NoErr;
0667c5 ¤
49a80e ¤   err = CPGPPassphraseGrafPortView::SetOptions( context, options );
5bb1f0 ¤   if( IsntPGPError( err ) )
1bc7a1 ¤   {
064f75 ¤   ¤   mOptions = options;
751b52 ¤   ¤
9a6e9d ¤   ¤   if( PGPKeyRefIsValid( mOptions->mDefaultKey ) )
e65b34 ¤   ¤   {
79061b ¤   ¤   ¤   LStaticText¤*keyCaption;
b087c7 ¤   ¤   ¤
afc3fc ¤   ¤   ¤   keyCaption = (LStaticText *) FindPaneByID( kKeyIDTextPaneID );
7ded8d ¤   ¤   ¤   if( IsntNull( keyCaption ) )
bff776 ¤   ¤   ¤   {
1b6b0d ¤   ¤   ¤   ¤   Str255¤ ¤   buf;
30cf74 ¤   ¤   ¤   ¤   PGPSize¤¤   len;
022b85 ¤   ¤   ¤   ¤
4bca16 ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer( mOptions->mDefaultKey,
1f51a5 ¤   ¤   ¤   ¤   ¤   sizeof( buf ) - 1, (char *) &buf[1], &len );
3b3227 ¤   ¤   ¤   ¤   if ( IsntPGPError( err ) )
a372c3 ¤   ¤   ¤   ¤   {
8fafdf ¤   ¤   ¤   ¤   ¤   buf[0] = len;
a52b85 ¤   ¤   ¤   ¤
cf7bdc ¤   ¤   ¤   ¤   ¤   keyCaption->SetDescriptor( buf );
2d2613 ¤   ¤   ¤   ¤   }
f6a3a6 ¤   ¤   ¤   }
820fe4 ¤   ¤   }
d09371 ¤   }
6667c5 ¤
badeb7 ¤   return( err );
54efe6 }
34af5a
ab3609 ¤   PGPKeyRef
f26b48 CPGPKeyPassphraseGrafPortView::GetPassphraseKey(void)
33bb36 {
--ddd5 0000036a39c4012026f Page 2 of CPGPKeyPassphraseGrafPort.cp
ef7777 ¤   return( mOptions->mDefaultKey );
feefe6 }
7eaf5a
207e69 ¤   Boolean
b63bf5 CPGPKeyPassphraseGrafPortView::VerifyPassphrase(void)
81bb36 {
003929 ¤   Boolean¤¤   valid = FALSE;
c467c5 ¤
ce2e29 ¤   if( mOptions->mVerifyPassphrase &&
2ef3ed ¤   ¤   IsntNull( *mOptions->mPassphrasePtr ) )
80c7a1 ¤   {
16d3f3 ¤   ¤   PGPKeyRef¤  passphraseKey;
a81b52 ¤   ¤
074515 ¤   ¤   passphraseKey = GetPassphraseKey();
7a2451 ¤   ¤   pgpAssert( PGPKeyRefIsValid( passphraseKey ) );
5faf5a
c0e592 ¤   ¤   if ( PGPPassphraseIsValid( passphraseKey,
a67bc5 ¤   ¤   ¤   ¤   PGPOPassphrase( mContext, *mOptions->mPassphrasePtr ),
b0d9c3 ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) ) )
655b34 ¤   ¤   {
a1e412 ¤   ¤   ¤   valid = TRUE;
2f0fe4 ¤   ¤   }
920e1d ¤   ¤   else
845b34 ¤   ¤   {
fcc2cb ¤   ¤   ¤   SysBeep( 1 );
6e87c7 ¤   ¤   ¤
9ec687 ¤   ¤   ¤   PGPUIWarningAlert( kPGPUIGenericOKAlert,
05bb30 ¤   ¤   ¤   ¤   ¤   ¤   kPGPLibDialogsStringListResID,
9236a9 ¤   ¤   ¤   ¤   ¤   ¤   kIncorrectPassphraseStrIndex );
ee0fe4 ¤   ¤   }
a99371 ¤   }
180e24 ¤   else
b5c7a1 ¤   {
a723a7 ¤   ¤   valid = TRUE;
6d9371 ¤   }
f3af5a
b30b09 ¤   return( valid );
03efe6 }
f9af5a
c99cb9 ¤   MessageT
4f8d6d CPGPKeyPassphraseGrafPortView::HandleMessage(MessageT theMessage)
78bb36 {
7d7f9c ¤   theMessage = CPGPPassphraseGrafPortView::HandleMessage( theMessage );
d48337 ¤   if( theMessage == msg_OK )
6ac7a1 ¤   {
b04388 ¤   ¤   if( ! VerifyPassphrase() )
505b34 ¤   ¤   {
34c9d6 ¤   ¤   ¤   ClearPassphrase();
54af5a
e570da ¤   ¤   ¤   /* Force dialog to stick around */
7ee5f3 ¤   ¤   ¤   theMessage = msg_Nothing;
f40fe4 ¤   ¤   }
da9371 ¤   }
7f67c5 ¤
f6cfbc ¤   return( theMessage );
8fefe6 }
f5af5a
2cb111 CPGPKeySetPassphraseGrafPortView::
9bc61c ¤   CPGPKeySetPassphraseGrafPortView(LStream *inStream)
d5d4ec ¤   : CPGPKeyPassphraseGrafPortView(inStream)
e8bb36 {
9e23a9 ¤   mOptions = NULL;
9cefe6 }
37af5a
cb1fac CPGPKeySetPassphraseGrafPortView::~CPGPKeySetPassphraseGrafPortView()
47bb36 {
48efe6 }
5faf5a
a4c744 ¤   PGPError
f7579e CPGPKeySetPassphraseGrafPortView::SetOptions(
8f6164 ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   ¤   context,
002bdc ¤   CPGPKeySetPassphraseDialogOptions ¤ *options)
--5364 001a9d1f0844012026f Page 3 of CPGPKeyPassphraseGrafPort.cp
2cbb36 {
e88e12 ¤   PGPError¤   err = kPGPError_NoErr;
fb67c5 ¤
e3aec5 ¤   err = CPGPKeyPassphraseGrafPortView::SetOptions( context, options );
8fb1f0 ¤   if( IsntPGPError( err ) )
32c7a1 ¤   {
4c4f75 ¤   ¤   mOptions = options;
fd9371 ¤   }
5a67c5 ¤
22deb7 ¤   return( err );
42efe6 }
75af5a
8eaf5a
f87e69 ¤   Boolean
df4123 CPGPKeySetPassphraseGrafPortView::VerifyPassphrase(void)
cbbb36 {
3a3929 ¤   Boolean¤¤   valid = FALSE;
4c67c5 ¤
772e29 ¤   if( mOptions->mVerifyPassphrase &&
32f3ed ¤   ¤   IsntNull( *mOptions->mPassphrasePtr ) )
83c7a1 ¤   {
99d3f3 ¤   ¤   PGPKeyRef¤  passphraseKey;
18af5a
f34515 ¤   ¤   passphraseKey = GetPassphraseKey();
d02451 ¤   ¤   pgpAssert( PGPKeyRefIsValid( passphraseKey ) );
4867c5 ¤
33e592 ¤   ¤   if ( PGPPassphraseIsValid( passphraseKey,
ec7bc5 ¤   ¤   ¤   ¤   PGPOPassphrase( mContext, *mOptions->mPassphrasePtr ),
25d9c3 ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) ) )
735b34 ¤   ¤   {
e6e412 ¤   ¤   ¤   valid = TRUE;
290fe4 ¤   ¤   }
810e1d ¤   ¤   else
d65b34 ¤   ¤   {
29f593 ¤   ¤   ¤   Boolean¤badPassphrase = TRUE;
e787c7 ¤   ¤   ¤
20081f ¤   ¤   ¤   if( mOptions->mFindMatchingKey )
66f776 ¤   ¤   ¤   {
b4a43b ¤   ¤   ¤   ¤   passphraseKey = FindKeyForPassphrase( mOptions->mKeySet,
4d7b66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mOptions->mPassphrasePtr );
e9af4b ¤   ¤   ¤   ¤   if ( PGPKeyRefIsValid( passphraseKey ) )
9272c3 ¤   ¤   ¤   ¤   {
aed143 ¤   ¤   ¤   ¤   ¤   badPassphrase ¤ = FALSE;
b0a582 ¤   ¤   ¤   ¤   ¤   valid¤  ¤   ¤   = TRUE;
0d2613 ¤   ¤   ¤   ¤   }
6da3a6 ¤   ¤   ¤   }
aa87c7 ¤   ¤   ¤
027298 ¤   ¤   ¤   if( badPassphrase )
13f776 ¤   ¤   ¤   {
774b9f ¤   ¤   ¤   ¤   SysBeep( 1 );
c62b85 ¤   ¤   ¤   ¤
0ba9b4 ¤   ¤   ¤   ¤   PGPUIWarningAlert( kPGPUIGenericOKAlert,
a8bc0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPLibDialogsStringListResID,
10b9fe ¤   ¤   ¤   ¤   ¤   ¤   ¤   kIncorrectPassphraseStrIndex );
94a3a6 ¤   ¤   ¤   }
7a0fe4 ¤   ¤   }
53af5a
9acdbf ¤   ¤   if( valid )
f25b34 ¤   ¤   {
c28541 ¤   ¤   ¤   *mOptions->mPassphraseKeyPtr = passphraseKey;
750fe4 ¤   ¤   }
7d9371 ¤   }
200e24 ¤   else
93c7a1 ¤   {
0f23a7 ¤   ¤   valid = TRUE;
169371 ¤   }
24af5a
e00b09 ¤   return( valid );
6defe6 }
a9af5a
--b212 001d165343a40120270 Page 1 of CPGPKeyPassphraseGrafPort.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
b67293 ¤   $Id: CPGPKeyPassphraseGrafPort.h,v 1.6.10.1 1998/11/12 03:20:32 heller Exp $
14f7f7 ____________________________________________________________________________*/
50af5a
8a7b7d #pragma once
2daf5a
7dd1c7 #include "CPGPPassphraseGrafPortView.h"
9daf5a
78734b class CPGPKeyPassphraseGrafPortView : public CPGPPassphraseGrafPortView
e8bb36 {
bc5ed4 public:
fdaf5a
452f4b ¤   enum
f1c7a1 ¤   {
4b37a9 ¤   ¤   class_ID ¤  ¤   ¤   = 'KPGP',
94af5a
cb678c ¤   ¤   kKeyIDTextPaneID¤   = 'cKey'
7162bd ¤   };
15af5a
ef4435 ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeyPassphraseGrafPortView(LStream *inStream);
1b5ad2 ¤   virtual¤¤   ¤   ¤   ~CPGPKeyPassphraseGrafPortView();
50af5a
dc9160 ¤   PGPError¤   ¤   ¤   SetOptions(PGPContextRef context,
900bb6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeyPassphraseDialogOptions *options);
4e531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
07a2d3 protected:
e1af5a
e84e86 ¤   virtual PGPKeyRef¤  GetPassphraseKey(void);
406736 ¤   virtual MessageT¤   HandleMessage(MessageT theMessage);
aafa89 ¤   virtual Boolean¤¤   VerifyPassphrase(void);
7767c5 ¤
6b0fb9 private:
a4af5a
3a9142 ¤   const CPGPKeyPassphraseDialogOptions¤   ¤   *mOptions;
2c82f7 };
31af5a
00d850 class CPGPKeySetPassphraseGrafPortView : public CPGPKeyPassphraseGrafPortView
b0bb36 {
065ed4 public:
05af5a
912f4b ¤   enum
2ec7a1 ¤   {
bd4012 ¤   ¤   class_ID = 'KSPG'
e162bd ¤   };
22af5a
fd367e ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeySetPassphraseGrafPortView(LStream *inStream);
c32545 ¤   virtual¤¤   ¤   ¤   ~CPGPKeySetPassphraseGrafPortView();
02af5a
ea9160 ¤   PGPError¤   ¤   ¤   SetOptions(PGPContextRef context,
a40bd5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeySetPassphraseDialogOptions *options);
8f531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
b5a2d3 protected:
a8af5a
a257b4 ¤   virtual PGPKeyRef¤  FindKeyForPassphrase(PGPKeySetRef keySet,
6dcac6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const char *passphrase) = 0;
63fa89 ¤   virtual Boolean¤¤   VerifyPassphrase(void);
0167c5 ¤
c20fb9 private:
49af5a
edf873 ¤   const CPGPKeySetPassphraseDialogOptions¤¤   *mOptions;
d182f7 };
--d4d2 0005f9acd6c40120271 Page 1 of CPGPKeyServerGrafPort.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
d1a7e3 ¤   $Id: CPGPKeyServerGrafPort.cp,v 1.9.10.1 1998/11/12 03:20:32 heller Exp $
7bf7f7 ____________________________________________________________________________*/
aeaf5a
92d797 #include <LPushButton.h>
c105c6 #include <LStaticText.h>
c1dd56 #include <PP_Messages.h>
f1af5a
d485c2 #include "MacStrings.h"
42cc06 #include "pgpDialogs.h"
250d08 #include "pgpMem.h"
d7af5a
200fa0 #include "CPGPKeyServerGrafPort.h"
5ef76a #include "pgpKeyServerDialogCommon.h"
effaae #include "PGPsdkUILibDialogs.h"
ccaf5a
07af5a
3e895f CPGPKeyServerGrafPortView::CPGPKeyServerGrafPortView(LStream *inStream)
1ea5e4 ¤   : CPGPUIGrafPortView(inStream)
2ebb36 {
a1418e ¤   mLastEventTicks¤¤   = 0;
a06f98 ¤   mServerNameText¤¤   = NULL;
1a72d4 ¤   mServerStatusText¤  = NULL;
a91e8d ¤   mKeyNameText¤   ¤   = NULL;
1be7fd ¤   mFilterUPP¤ ¤   ¤   = NULL;
71e7d2 ¤   mLastKeyServerState¤= kPGPKeyServerState_Invalid;
bba773 ¤   mLastKeyServer¤ ¤   = kInvalidPGPKeyServerRef;
fcefe6 }
7eaf5a
87174f CPGPKeyServerGrafPortView::~CPGPKeyServerGrafPortView()
3ebb36 {
53c521 ¤   if( IsntNull( mFilterUPP ) )
35c725 ¤   ¤   DisposeRoutineDescriptor( mFilterUPP );
bdefe6 }
b6af5a
8b6d52 ¤   void
072f69 CPGPKeyServerGrafPortView::FinishCreateSelf()
7fbb36 {
50ab55 ¤   CPGPUIGrafPortView::FinishCreateSelf();
8667c5 ¤
c4b454 ¤   mServerNameText = (LStaticText *) FindPaneByID( kServerNamePaneID );
ff9f26 ¤   pgpAssertAddrValid( mServerNameText, VoidAlign );
36af5a
2919cd ¤   mServerStatusText = (LStaticText *) FindPaneByID( kStatusPaneID );
bb208f ¤   pgpAssertAddrValid( mServerStatusText, VoidAlign );
bb67c5 ¤
74ce3a ¤   mKeyNameText = (LStaticText *) FindPaneByID( kKeyNamePaneID );
760e6d ¤   /* mKeyNameText may be NULL */
7367c5 ¤
ce79ef ¤   mOKButton->Hide();
c1efe6 }
deaf5a
afc744 ¤   PGPError
f1baab CPGPKeyServerGrafPortView::SetOptions(
dfca71 ¤   PGPContextRef ¤ ¤   ¤   ¤   context,
2abca1 ¤   CPGPKeyServerDialogOptions ¤*options)
18bb36 {
138e12 ¤   PGPError¤   err = kPGPError_NoErr;
3067c5 ¤
ea6f55 ¤   err = CPGPUIGrafPortView::SetOptions( context, options );
38b1f0 ¤   if( IsntPGPError( err ) )
91c7a1 ¤   {
614f75 ¤   ¤   mOptions = options;
cc9371 ¤   }
8a67c5 ¤
08deb7 ¤   return( err );
33efe6 }
03af5a
5f6d52 ¤   void
--e1a7 000e4010bd440120271 Page 2 of CPGPKeyServerGrafPort.cp
15f68e CPGPKeyServerGrafPortView::DoIdle(const EventRecord &inMacEvent)
86bb36 {
6164da ¤   (void) inMacEvent;
ce67c5 ¤
8b210c ¤   CPGPUIGrafPortView::DoIdle(inMacEvent);
b767c5 ¤
46a95e ¤   // Force ModalDialog to exit.
ebb8e4 ¤   SetDismissMessage( msg_OK );
2aefe6 }
9aaf5a
95c744 ¤   PGPError
22edf8 CPGPKeyServerGrafPortView::KeyServerCallbackProc(
0735f6 ¤   PGPContextRef ¤ context,
fb12c1 ¤   struct PGPEvent *event,
6a2e8b ¤   PGPUserValue ¤  userValue)
50bb36 {
ade87a ¤   CPGPKeyServerGrafPortView¤  *grafPortObj;
04af5a
246d02 ¤   (void) context;
9367c5 ¤
a3dc04 ¤   grafPortObj = (CPGPKeyServerGrafPortView *) userValue;
a727d4 ¤   pgpAssertAddrValid( grafPortObj, VoidAlign );
a867c5 ¤
46e909 ¤   return( grafPortObj->KeyServerCallback( event ) );
c1efe6 }
2daf5a
9ac744 ¤   PGPError
4d24b6 CPGPKeyServerGrafPortView::KeyServerCallback(PGPEvent *event)
56bb36 {
e0764c ¤   PGPError¤   err ¤   ¤   = kPGPError_NoErr;
dc228e ¤   DialogPtr¤  theDialog ¤ = GetMacPort();
59bcdf ¤   short¤  ¤   saveWindowKind;
4b67c5 ¤
e6419c ¤   /* Whack the window type back to kDialogWindowKind for the callback */
9267c5 ¤
3dd38d ¤   saveWindowKind = GetWindowKind( theDialog );
2574ff ¤   SetWindowKind( theDialog, kDialogWindowKind );
6baf5a
8f024e ¤   if( ! IsWindowVisible( theDialog ) )
64c7a1 ¤   {
974c91 ¤   ¤   Str255¤ statusStr;
1e1b52 ¤   ¤
25f688 ¤   ¤   GetIndString( statusStr, kPGPLibDialogsStringListResID,
811576 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeyServerConnectingStrIndex );
7e48fe ¤   ¤   mServerStatusText->SetDescriptor( statusStr );
4baf5a
db4a05 ¤   ¤   InitCursor();
3e651f ¤   ¤   ShowWindow( theDialog );
d35770 ¤   ¤   SelectWindow( theDialog );
11aaad ¤   ¤   UpdatePort();
1baf5a
b2d8b2 ¤   ¤   mFilterUPP = NewModalFilterProc( ModalFilterProcHandler );
049371 ¤   }
8a67c5 ¤
f0a505 ¤   switch( event->type )
b6c7a1 ¤   {
65deeb ¤   ¤   case kPGPEvent_KeyServerIdleEvent:
525b34 ¤   ¤   {
d22448 ¤   ¤   ¤   if( IsWindowVisible( theDialog ) )
5df776 ¤   ¤   ¤   {
b78d20 ¤   ¤   ¤   ¤   PGPUInt32¤  ticks;
c92b85 ¤   ¤   ¤   ¤
221061 ¤   ¤   ¤   ¤   ticks = TickCount();
454930 ¤   ¤   ¤   ¤   if( ticks >= mLastEventTicks + 3 )
1172c3 ¤   ¤   ¤   ¤   {
57d9a3 ¤   ¤   ¤   ¤   ¤   short¤  ¤   itemHit;
945424 ¤   ¤   ¤   ¤   ¤   MessageT¤   theMessage;
afae30 ¤   ¤   ¤   ¤   ¤
144362 ¤   ¤   ¤   ¤   ¤   SetDismissMessage( msg_Nothing );
4dae30 ¤   ¤   ¤   ¤   ¤
0fbf1f ¤   ¤   ¤   ¤   ¤   ModalDialog( mFilterUPP, &itemHit );
e4af5a
--7f00 0003aedbf5a40120271 Page 3 of CPGPKeyServerGrafPort.cp
d73215 ¤   ¤   ¤   ¤   ¤   theMessage = HandleMessage( GetDismissMessage() );
31d9ef ¤   ¤   ¤   ¤   ¤   if( theMessage == msg_Cancel )
474859 ¤   ¤   ¤   ¤   ¤   {
aa094d ¤   ¤   ¤   ¤   ¤   ¤   err = kPGPError_UserAbort;
be1c89 ¤   ¤   ¤   ¤   ¤   }
eaae30 ¤   ¤   ¤   ¤   ¤
5fce8a ¤   ¤   ¤   ¤   ¤   mLastEventTicks = ticks;
462613 ¤   ¤   ¤   ¤   }
6aa3a6 ¤   ¤   ¤   }
1f94aa ¤   ¤   ¤   ¤   ¤   ¤
0ccdcb ¤   ¤   ¤   break;
a80fe4 ¤   ¤   }
2b87c7 ¤   ¤   ¤
7ffe34 ¤   ¤   case kPGPEvent_KeyServerEvent:
e15b34 ¤   ¤   {
2c9387 ¤   ¤   ¤   if( PGPKeyServerRefIsValid(
7a3b29 ¤   ¤   ¤   ¤   ¤   ¤   event->data.keyServerData.keyServerRef ) &&
fd9e3b ¤   ¤   ¤   ¤   event->data.keyServerData.keyServerRef != mLastKeyServer )
def776 ¤   ¤   ¤   {
63af00 ¤   ¤   ¤   ¤   const char¤ *hostName ¤ ¤   = NULL;
f076e4 ¤   ¤   ¤   ¤   PGPBoolean¤ freeHostName ¤  = FALSE;
15bd4f ¤   ¤   ¤   ¤   PGPUInt32¤  index;
7d2b85 ¤   ¤   ¤   ¤
5f7674 ¤   ¤   ¤   ¤   mLastKeyServer = event->data.keyServerData.keyServerRef;
baaf5a
78c467 ¤   ¤   ¤   ¤   // Set the server name:
052b85 ¤   ¤   ¤   ¤
1e2c12 ¤   ¤   ¤   ¤   for( index = 0; index < mOptions->mServerCount; index++ )
0472c3 ¤   ¤   ¤   ¤   {
5e74eb ¤   ¤   ¤   ¤   ¤   if( mOptions->mServerList[index].server ==·
60a80f ¤   ¤   ¤   ¤   ¤   ¤   ¤   event->data.keyServerData.keyServerRef )
0c4859 ¤   ¤   ¤   ¤   ¤   {
a5a66c ¤   ¤   ¤   ¤   ¤   ¤   hostName = mOptions->mServerList[index].serverName;
4300eb ¤   ¤   ¤   ¤   ¤   ¤   break;
c11c89 ¤   ¤   ¤   ¤   ¤   }
ae2613 ¤   ¤   ¤   ¤   }
862b85 ¤   ¤   ¤   ¤
2d4528 ¤   ¤   ¤   ¤   if( IsNull( hostName ) )
4872c3 ¤   ¤   ¤   ¤   {
184b9e ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( PGPGetKeyServerHostName(
4cdb03 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mLastKeyServer, (char **) &hostName ) ) )
7b4859 ¤   ¤   ¤   ¤   ¤   {
3360ca ¤   ¤   ¤   ¤   ¤   ¤   freeHostName = TRUE;
8b1c89 ¤   ¤   ¤   ¤   ¤   }
5c2613 ¤   ¤   ¤   ¤   }
662b85 ¤   ¤   ¤   ¤
005a18 ¤   ¤   ¤   ¤   if( IsntNull( hostName ) )
f872c3 ¤   ¤   ¤   ¤   {
f0f85e ¤   ¤   ¤   ¤   ¤   Str255¤ serverStr;
bfae30 ¤   ¤   ¤   ¤   ¤
b44263 ¤   ¤   ¤   ¤   ¤   CToPString( hostName, serverStr );
2bde48 ¤   ¤   ¤   ¤   ¤   mServerNameText->SetDescriptor( serverStr );
9dae30 ¤   ¤   ¤   ¤   ¤
d37b1b ¤   ¤   ¤   ¤   ¤   if( freeHostName )
c89435 ¤   ¤   ¤   ¤   ¤   ¤   PGPFreeData( (char *) hostName );
3b2613 ¤   ¤   ¤   ¤   }
a3a3a6 ¤   ¤   ¤   }
0387c7 ¤   ¤   ¤
da4c73 ¤   ¤   ¤   if( event->data.keyServerData.state != mLastKeyServerState )
2ef776 ¤   ¤   ¤   {
618331 ¤   ¤   ¤   ¤   short¤  newStateStrIndex = 0;
c387c7 ¤   ¤   ¤
45b56b ¤   ¤   ¤   ¤   switch( event->data.keyServerData.state )
5272c3 ¤   ¤   ¤   ¤   {
1da356 ¤   ¤   ¤   ¤   ¤   case kPGPKeyServerState_Opening:
2f2422 ¤   ¤   ¤   ¤   ¤   ¤   newStateStrIndex = kKeyServerConnectingStrIndex;
fa00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
8c94aa ¤   ¤   ¤   ¤   ¤   ¤
a7fc99 ¤   ¤   ¤   ¤   ¤   case kPGPKeyServerState_Querying:
1d12ba ¤   ¤   ¤   ¤   ¤   ¤   newStateStrIndex = kKeyServerSearchingStrIndex;
5800eb ¤   ¤   ¤   ¤   ¤   ¤   break;
3aaf5a
--38d0 00182b55ae140120271 Page 4 of CPGPKeyServerGrafPort.cp
d6d0fc ¤   ¤   ¤   ¤   ¤   case kPGPKeyServerState_ProcessingResults:
d822f1 ¤   ¤   ¤   ¤   ¤   ¤   newStateStrIndex = kKeyServerProcessingStrIndex;
ab00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
40af5a
e4eae9 ¤   ¤   ¤   ¤   ¤   case kPGPKeyServerState_Uploading:
0880c0 ¤   ¤   ¤   ¤   ¤   ¤   newStateStrIndex = kKeyServerSendingStrIndex;
f700eb ¤   ¤   ¤   ¤   ¤   ¤   break;
c3af5a
58a6e9 ¤   ¤   ¤   ¤   ¤   case kPGPKeyServerState_Deleting:
f5e3de ¤   ¤   ¤   ¤   ¤   ¤   newStateStrIndex = kKeyServerDeletingSendingStrIndex;
6b00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
b6af5a
9e89e6 ¤   ¤   ¤   ¤   ¤   case kPGPKeyServerState_Disabling:
0202ad ¤   ¤   ¤   ¤   ¤   ¤   newStateStrIndex = kKeyServerDisablingSendingStrIndex;
7c00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
e9af5a
431d5b ¤   ¤   ¤   ¤   ¤   case kPGPKeyServerState_Closing:
0168c0 ¤   ¤   ¤   ¤   ¤   ¤   newStateStrIndex = kKeyServerClosingSendingStrIndex;
d100eb ¤   ¤   ¤   ¤   ¤   ¤   break;
602613 ¤   ¤   ¤   ¤   }
6daf5a
8906fb ¤   ¤   ¤   ¤   if( kPGPLibDialogsStringListResID != 0 )
3472c3 ¤   ¤   ¤   ¤   {
e59535 ¤   ¤   ¤   ¤   ¤   Str255¤ statusStr;
39ae30 ¤   ¤   ¤   ¤   ¤
909e98 ¤   ¤   ¤   ¤   ¤   GetIndString( statusStr, kPGPLibDialogsStringListResID,
9fb2de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   newStateStrIndex );
d8c2db ¤   ¤   ¤   ¤   ¤   mServerStatusText->SetDescriptor( statusStr );
742613 ¤   ¤   ¤   ¤   }
9fae30 ¤   ¤   ¤   ¤   ¤
108a8c ¤   ¤   ¤   ¤   mLastKeyServerState = (PGPKeyServerState)
d23e32 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   event->data.keyServerData.state;
44a3a6 ¤   ¤   ¤   }
2887c7 ¤   ¤   ¤
14cdcb ¤   ¤   ¤   break;
1b0fe4 ¤   ¤   }
299371 ¤   }
59af5a
f3ffa9 ¤   SetWindowKind( theDialog, saveWindowKind );
0d67c5 ¤
13deb7 ¤   return( err );
82efe6 }
--c788 00176e9b98740120272 Page 1 of CPGPKeyServerGrafPort.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
e27258 ¤   $Id: CPGPKeyServerGrafPort.h,v 1.5.10.1 1998/11/12 03:20:33 heller Exp $
b4f7f7 ____________________________________________________________________________*/
6caf5a
e17b7d #pragma once
a2af5a
e8eb5b #include "pgpKeyServer.h"
52e684 #include "pgpUserInterface.h"
bcaf5a
7761a9 #include "CPGPUIGrafPortView.h"
faaf5a
1e95be class CPGPKeyServerDialogOptions;
ebcb91 class LStaticText;
0baf5a
347c22 class CPGPKeyServerGrafPortView : public CPGPUIGrafPortView
c4bb36 {
1d5ed4 public:
5caf5a
3b2f4b ¤   enum
87c7a1 ¤   {
b4666c ¤   ¤   class_ID = 'KGPV',
441b52 ¤   ¤
6e9fbd ¤   ¤   kServerNamePaneID¤  = 'Srvr',
108ca4 ¤   ¤   kStatusPaneID¤  ¤   = 'Stat',
15cc9f ¤   ¤   kKeyNamePaneID¤ ¤   = 'Key ',
9914c7 ¤   ¤   kProgressBarPaneID¤ = 'Prog'
e51b52 ¤   ¤
f262bd ¤   };
a5af5a
848d6f ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeyServerGrafPortView(LStream *inStream);
dce703 ¤   virtual¤¤   ¤   ¤   ~CPGPKeyServerGrafPortView();
4daf5a
760b44 ¤   virtual void¤   ¤   DoIdle(const EventRecord &inMacEvent);
0b46db ¤   PGPError¤   ¤   ¤   SetOptions(PGPContextRef context,·
abd3dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPKeyServerDialogOptions *options);
1a67c5 ¤
a6ef2f ¤   static PGPError¤¤   KeyServerCallbackProc(PGPContextRef context,
e9a2ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   struct PGPEvent *event,
43cc95 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue userValue);
4d1b52 ¤   ¤
34a2d3 protected:
4faf5a
c48475 ¤   LStaticText¤¤   ¤   *mServerNameText;
834d28 ¤   LStaticText¤¤   ¤   *mServerStatusText;
3e6bbb ¤   LStaticText¤¤   ¤   *mKeyNameText;
5967c5 ¤
11febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
9a91fc ¤   virtual PGPError¤   KeyServerCallback(PGPEvent *event);
d167c5 ¤
b50fb9 private:
8e67c5 ¤
bc6e16 ¤   ModalFilterUPP¤ ¤   ¤   ¤   ¤   ¤   mFilterUPP;
d70986 ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   ¤   ¤   mLastEventTicks;
0e181e ¤   PGPKeyServerState¤  ¤   ¤   ¤   ¤   mLastKeyServerState;
40b57e ¤   PGPKeyServerRef¤¤   ¤   ¤   ¤   ¤   mLastKeyServer;
bc9f45 ¤   const CPGPKeyServerDialogOptions ¤  *mOptions;
3582f7 };
76af5a
--d3e4 000e9d6c72d40120273 Page 1 of CPGPOptionView.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
eb616a ¤   $Id: CPGPOptionView.cp,v 1.3.12.1 1998/11/12 03:20:34 heller Exp $
fff7f7 ____________________________________________________________________________*/
f6af5a
7307ea // Public includes:
1e324c #include <string.h>
a4af5a
c8775b #include <LTextEditView.h>
4d7e6d #include <UDrawingState.h>
4917f9 #include <UReanimator.h>
87af5a
450d08 #include "pgpMem.h"
8daf5a
fdaf5a
1e05c5 // Private includes:
2fd8d1 #include "CPGPOptionView.h"
3faf5a
5b5a09 CPGPOptionView::CPGPOptionView(LStream *inStream) :
7a013e ¤   ¤   ¤   ¤   ¤   LView(inStream), LListener()
42bb36 {
327b8e ¤   mItemID ¤   ¤   ¤   = 0;
6abacc ¤   mDescriptionPane¤   = NULL;
87efe6 }
85af5a
a02f2d CPGPOptionView::~CPGPOptionView()
cbbb36 {
48efe6 }
bcaf5a
4f6d52 ¤   void
dc6839 CPGPOptionView::FinishCreateSelf(void)
b8bb36 {
a5358f ¤   LView::FinishCreateSelf();
4267c5 ¤
9c08c6 ¤   mDescriptionPane = (LTextEditView *) FindPaneByID( kDescriptionPaneID );
2856ee ¤   pgpAssertAddrValid( mDescriptionPane, VoidAlign );
73efe6 }
9caf5a
456d52 ¤   void
eebd34 CPGPOptionView::SetDescription(
2ae56b ¤   const char *description)
0fbb36 {
7c5627 ¤   SInt16¤ ¤   ¤   newDescHeight;
cc13d4 ¤   SDimension16¤   oldDescSize;
ed67c5 ¤
176817 ¤   pgpAssertAddrValid( description, char );
cf67c5 ¤
240e3b ¤   mDescriptionPane->SetTextPtr( (Ptr) description,
cfad91 ¤   ¤   ¤   ¤   ¤   strlen( description ) );
35af5a
2c62fd ¤   if( *description == 0 )
cfc7a1 ¤   {
8fd549 ¤   ¤   mDescriptionPane->Hide();
a61b52 ¤   ¤
8e7d93 ¤   ¤   newDescHeight = 0;
c49371 ¤   }
040e24 ¤   else
5fc7a1 ¤   {
d44e20 ¤   ¤   SDimension32¤   descImageSize;
b31b52 ¤   ¤
ef3965 ¤   ¤   mDescriptionPane->Show();
08ae30 ¤   ¤   ¤   ¤   ¤
ddae2e ¤   ¤   mDescriptionPane->GetImageSize( descImageSize );
b1d62c ¤   ¤   newDescHeight = descImageSize.height;
639371 ¤   }
d367c5 ¤
ddb55b ¤   mDescriptionPane->GetFrameSize( oldDescSize );
8d67c5 ¤
eade71 ¤   // Adjust the frame to account for the changed text
e9c21a ¤   ResizeFrameBy( 0, newDescHeight - oldDescSize.height, TRUE );
--5f06 0010887db0740120273 Page 2 of CPGPOptionView.cp
5a052a ¤   ResizeImageBy( 0, newDescHeight - oldDescSize.height, TRUE );
19efe6 }
e6af5a
fe6d52 ¤   void
648931 CPGPOptionView::ListenToMessage(
5719a3 ¤   MessageT ¤  inMessage,
257503 ¤   void ¤  ¤   *ioParam)
d7bb36 {
3ae9c8 ¤   (void) inMessage;
0f28bb ¤   (void) ioParam;
f3efe6 }
53af5a
54086b ¤   CPGPOptionView *
82f010 CPGPOptionView::CreateOptionView(
fafe48 ¤   LView ¤ *inSuperView,
003657 ¤   ResIDT ¤ppobResID)
c0bb36 {
253e1e ¤   StColorPortState¤   mSavePort( UQDGlobals::GetCurrentPort() );
589b7a ¤   CPGPOptionView¤ ¤   *optionView;
6e67c5 ¤
107f0f ¤   SetDefaultView( inSuperView );
4567c5 ¤
48bb55 ¤   optionView = (CPGPOptionView *) UReanimator::ReadObjects(
fe6a93 ¤   ¤   ¤   'PPob', ppobResID );
63af5a
e16f8f ¤   optionView->FinishCreate();
0667c5 ¤
3a36af ¤   OutOfFocus( NULL );
4e67c5 ¤
6e56cd ¤   return ( optionView );
eaefe6 }
08af5a
--1caf 001f6d5ec1e40120274 Page 1 of CPGPOptionView.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
b49510 ¤   $Id: CPGPOptionView.h,v 1.2.12.1 1998/11/12 03:20:35 heller Exp $
cbf7f7 ____________________________________________________________________________*/
16af5a
5c7b7d #pragma once
7daf5a
5407ea // Public includes:
0cf1a9 #include <LListener.h>
ae2c73 #include <LView.h>
9caf5a
8969ad const PaneIDT¤  kDescriptionPaneID¤ = 'Desc';
59af5a
d8a13f class LTextEditView;
0caf5a
324207 class CPGPOptionView : public LView, public LListener
e2bb36 {
dc5ed4 public:
68af5a
6c6ff3 ¤   enum { class_ID = 'OptV' };
1eaf5a
f7d3e6 ¤   ¤   ¤   ¤   ¤   ¤   CPGPOptionView(LStream *inStream);
1d8100 ¤   virtual¤¤   ¤   ¤   ~CPGPOptionView();
3267c5 ¤
08febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
5edad0 ¤   virtual¤void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
ec415f ¤   void¤   ¤   ¤   ¤   SetDescription(const char *description);
8067c5 ¤
f0a2d3 protected:
f1af5a
4ca9dc ¤   LTextEditView¤  ¤   *mDescriptionPane;
40a7e7 ¤   PGPUInt32¤  ¤   ¤   mItemID;
6367c5 ¤
20218a ¤   static CPGPOptionView *CreateOptionView(LView *inSuperView,
933853 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ResIDT ppobResID);
6c82f7 };
f6af5a
--81f4 000e654fc5a40120275 Page 1 of CPGPOptionsGrafPort.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
e37b6e ¤   $Id: CPGPOptionsGrafPort.cp,v 1.7.12.1 1998/11/12 03:20:35 heller Exp $
e6f7f7 ____________________________________________________________________________*/
49af5a
ac07ea // Public includes:
ef8708 #include <LCheckBox.h>
c10aae #include <LPopupButton.h>
cdd797 #include <LPushButton.h>
c57e6d #include <UDrawingState.h>
c38f92 #include <UGAColorRamp.h>
a4af5a
5b76f0 #include "CComboError.h"
c285c2 #include "MacStrings.h"
000d08 #include "pgpMem.h"
7daf5a
2205c5 // Private includes:
757026 #include "CPGPCheckboxOptionView.h"
332c9c #include "CPGPPopupMenuOptionView.h"
a9b3f1 #include "CPGPOptionsGrafPort.h"
65e50c #include "CPGPOptionsListView.h"
c3cc06 #include "pgpDialogs.h"
b40141 #include "pgpOptionListPriv.h"
35af5a
f48fa0 const PaneIDT¤  kOptionsListViewPaneID = 'OLST';
87af5a
ed0706 CPGPOptionsGrafPort::CPGPOptionsGrafPort(LStream *inStream)
bba5e4 ¤   : CPGPUIGrafPortView(inStream)
71bb36 {
ba23a9 ¤   mOptions = NULL;
66efe6 }
01af5a
2522b3 CPGPOptionsGrafPort::~CPGPOptionsGrafPort()
9abb36 {
92efe6 }
5aaf5a
c36d52 ¤   void
cb1004 CPGPOptionsGrafPort::UpdatePort(void)
04bb36 {
8049d6 ¤   StColorPortState¤   savePortState( GetMacPort() );
319c65 ¤   RGBColor¤   ¤   ¤   foreColor;
24c1af ¤   RGBColor¤   ¤   ¤   backColor;
ae67c5 ¤
0765e5 ¤   // Revert to dark gray to erase the window background
9fb405 ¤   foreColor = UGAColorRamp::GetBlackColor();
539fc0 ¤   backColor = UGAColorRamp::GetColor( colorRamp_Gray2 );
07af5a
890fcd ¤   RGBForeColor( &foreColor );
226181 ¤   RGBBackColor( &backColor );
a367c5 ¤
535641 ¤   CPGPUIGrafPortView::UpdatePort();
7cefe6 }
89af5a
a56d52 ¤   void
c65c93 CPGPOptionsGrafPort::DrawSelf(void)
d2bb36 {
3bc0aa ¤   StColorState¤   saveColors;
591d69 ¤   RGBColor¤   ¤   foreColor;
5640a3 ¤   RGBColor¤   ¤   backColor;
3d67c5 ¤
06c824 ¤   // Revert to dark gray to draw the window background
f8b405 ¤   foreColor = UGAColorRamp::GetBlackColor();
929fc0 ¤   backColor = UGAColorRamp::GetColor( colorRamp_Gray2 );
84af5a
820fcd ¤   RGBForeColor( &foreColor );
2f6181 ¤   RGBBackColor( &backColor );
7caf5a
67a08d ¤   CPGPUIGrafPortView::DrawSelf();
37efe6 }
e6af5a
--0ddd 000b39b35ab40120275 Page 2 of CPGPOptionsGrafPort.cp
3b6d52 ¤   void
9205c8 CPGPOptionsGrafPort::FinishCreateSelf(void)
15bb36 {
523d3e ¤   RGBColor¤   foreColor;
6960f4 ¤   RGBColor¤   backColor;
5567c5 ¤
d0ab55 ¤   CPGPUIGrafPortView::FinishCreateSelf();
9e67c5 ¤
0e807f ¤   mOptionsListView = (CPGPOptionsListView *)
e07229 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FindPaneByID( kOptionsListViewPaneID );
891fbe ¤   pgpAssertAddrValid( mOptionsListView, VoidAlign );
3baf5a
5ab405 ¤   foreColor = UGAColorRamp::GetBlackColor();
8b820c ¤   backColor = UGAColorRamp::GetColor( colorRamp_Gray1 );
3caf5a
8ea5cf ¤   SetForeAndBackColors( &foreColor, &backColor );
5cc94e ¤   ApplyForeAndBackColors();
3defe6 }
44af5a
1e6d52 ¤   void
608158 CPGPOptionsGrafPort::AppendOptionView(
10ef03 ¤   CPGPOptionView ¤*theView,
c84c6e ¤   Boolean¤¤   ¤   inRefresh)
a5bb36 {
671fbe ¤   pgpAssertAddrValid( mOptionsListView, VoidAlign );
d13a88 ¤   mOptionsListView->AppendOptionView( theView, inRefresh );
34efe6 }
50af5a
34c744 ¤   PGPError
0ff7cb CPGPOptionsGrafPort::SetOptions(
f8ca71 ¤   PGPContextRef ¤ ¤   ¤   ¤   context,
b1feb3 ¤   CPGPOptionsDialogOptions ¤  *options)
40bb36 {
628e12 ¤   PGPError¤   err = kPGPError_NoErr;
f267c5 ¤
da6f55 ¤   err = CPGPUIGrafPortView::SetOptions( context, options );
91b1f0 ¤   if( IsntPGPError( err ) )
07c7a1 ¤   {
1b8bcb ¤   ¤   PGPUInt32¤  optionIndex¤= 0;
eab2b5 ¤   ¤   PGPOption¤  optionData;
731b52 ¤   ¤
d44f75 ¤   ¤   mOptions = options;
bd1b52 ¤   ¤
94de04 ¤   ¤   /* Build list of checkboxes and/or popups */
541b52 ¤   ¤
253f9f ¤   ¤   while( IsntPGPError( pgpGetIndexedOption( options->mClientOptions,
646b2e ¤   ¤   ¤   ¤   ¤   ¤   optionIndex, FALSE, &optionData ) ) )
cc5b34 ¤   ¤   {
ec56a0 ¤   ¤   ¤   if( optionData.type == kPGPOptionType_Checkbox )
3af776 ¤   ¤   ¤   {
2ec7b9 ¤   ¤   ¤   ¤   PGPOUICheckboxDesc¤ ¤   *descriptor;
a1ff2a ¤   ¤   ¤   ¤   CPGPCheckboxOptionView¤ *checkboxView;
9c2b85 ¤   ¤   ¤   ¤
55904f ¤   ¤   ¤   ¤   descriptor = (PGPOUICheckboxDesc *) optionData.value.asPtr;
64af5a
9dd668 ¤   ¤   ¤   ¤   checkboxView = CPGPCheckboxOptionView::
2d56a2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CreateCheckboxOptionView(mOptionsListView,
7cd463 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   descriptor );
07a623 ¤   ¤   ¤   ¤   if( IsntNull( checkboxView ) )
6372c3 ¤   ¤   ¤   ¤   {
0af52f ¤   ¤   ¤   ¤   ¤   mOKButton->AddListener( checkboxView );
aaaf5a
835010 ¤   ¤   ¤   ¤   ¤   AppendOptionView( checkboxView, FALSE );
7d2613 ¤   ¤   ¤   ¤   }
1ffa07 ¤   ¤   ¤   ¤   else
6372c3 ¤   ¤   ¤   ¤   {
28ed29 ¤   ¤   ¤   ¤   ¤   err = kPGPError_OutOfMemory;
0b14c3 ¤   ¤   ¤   ¤   ¤   break;
c72613 ¤   ¤   ¤   ¤   }
15a3a6 ¤   ¤   ¤   }
015f9b ¤   ¤   ¤   else if( optionData.type == kPGPOptionType_PopupList )
b3f776 ¤   ¤   ¤   {
--1486 001394ceddd40120275 Page 3 of CPGPOptionsGrafPort.cp
bcda51 ¤   ¤   ¤   ¤   PGPOUIPopupListDesc¤¤   *descriptor;
101499 ¤   ¤   ¤   ¤   CPGPPopupMenuOptionView¤*popupView;
c82b85 ¤   ¤   ¤   ¤
af54bf ¤   ¤   ¤   ¤   descriptor = (PGPOUIPopupListDesc *) optionData.value.asPtr;
e1af5a
4392ad ¤   ¤   ¤   ¤   popupView = CPGPPopupMenuOptionView::
9c112e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CreatePopupMenuOptionView(
81b7d9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mOptionsListView, descriptor );
bdb17d ¤   ¤   ¤   ¤   if( IsntNull( popupView ) )
ae72c3 ¤   ¤   ¤   ¤   {
224b88 ¤   ¤   ¤   ¤   ¤   mOKButton->AddListener( popupView );
0daf5a
47c4f7 ¤   ¤   ¤   ¤   ¤   AppendOptionView( popupView, FALSE );
bb2613 ¤   ¤   ¤   ¤   }
64fa07 ¤   ¤   ¤   ¤   else
5c72c3 ¤   ¤   ¤   ¤   {
e9ed29 ¤   ¤   ¤   ¤   ¤   err = kPGPError_OutOfMemory;
2c14c3 ¤   ¤   ¤   ¤   ¤   break;
3f2613 ¤   ¤   ¤   ¤   }
8ea3a6 ¤   ¤   ¤   }
a187c7 ¤   ¤   ¤
8a9819 ¤   ¤   ¤   ++optionIndex;
da0fe4 ¤   ¤   }
869371 ¤   }
9167c5 ¤
53deb7 ¤   return( err );
39be43 }¶
--5f75 0018773707340120276 Page 1 of CPGPOptionsGrafPort.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
dcf345 ¤   $Id: CPGPOptionsGrafPort.h,v 1.7.12.1 1998/11/12 03:20:36 heller Exp $
d1f7f7 ____________________________________________________________________________*/
08af5a
fd7b7d #pragma once
98af5a
ca07ea // Public includes:
a876f0 #include "CComboError.h"
abe82c #include "pgpPubTypes.h"
c1af5a
1d05c5 // Private includes:
e861a9 #include "CPGPUIGrafPortView.h"
d3af5a
c11a82 class CPGPOptionView;
8f55ed class CPGPOptionsListView;
7bbc2c class CPGPOptionsDialogOptions;
d7af5a
69bab4 class CPGPOptionsGrafPort : public CPGPUIGrafPortView
7cbb36 {
ab5ed4 public:
29af5a
83dfc7 ¤   enum { class_ID = 'OLGP' };
7167c5 ¤
47af06 ¤   ¤   ¤   ¤   ¤   ¤   CPGPOptionsGrafPort(LStream *inStream);
b58aef ¤   virtual¤¤   ¤   ¤   ~CPGPOptionsGrafPort();
7aaf5a
4913b2 ¤   virtual void¤   ¤   UpdatePort();
c4febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
e267c5 ¤
209160 ¤   PGPError¤   ¤   ¤   SetOptions(PGPContextRef context,
729a77 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPOptionsDialogOptions *options);
c167c5 ¤
07a2d3 protected:
4caf5a
67e40b ¤   virtual void¤   ¤   DrawSelf(void);
56af5a
b00fb9 private:
38af5a
58e035 ¤   CPGPOptionsListView¤*mOptionsListView;
2f67c5 ¤
28acf2 ¤   const CPGPOptionsDialogOptions¤ *mOptions;
4f67c5 ¤
5c5f32 ¤   void¤   ¤   ¤   ¤   AppendOptionView(CPGPOptionView *theView,
402410 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inRefresh);
7b82f7 };
87af5a
--a834 000a131140c40120277 Page 1 of CPGPOptionsListView.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
d4944d ¤   $Id: CPGPOptionsListView.cp,v 1.1.14.1 1998/11/12 03:20:37 heller Exp $
c8f7f7 ____________________________________________________________________________*/
45af5a
7407ea // Public includes:
dc0aae #include <LPopupButton.h>
c8775b #include <LTextEditView.h>
4a7e6d #include <UDrawingState.h>
098f92 #include <UGAColorRamp.h>
517c99 #include <URegistrar.h>
b2f8a6 #include <UTextTraits.h>
62af5a
d905c5 // Private includes:
4e7026 #include "CPGPCheckboxOptionView.h"
3ae50c #include "CPGPOptionsListView.h"
942c9c #include "CPGPPopupMenuOptionView.h"
f4af5a
b49133 // ---------------------------------------------------------------------------
97b80e //¤ class CPGPOptionTextEdit
e29133 // ---------------------------------------------------------------------------
9baf5a
0a0549 class CPGPOptionTextEdit : public LTextEditView
0ebb36 {
c85ed4 public:
57af5a
daf371 ¤   enum { class_ID = 'OTxt' };
a2af5a
72375a ¤   ¤   ¤   ¤   ¤   ¤   CPGPOptionTextEdit(LStream *inStream);
95f3a4 ¤   virtual¤¤   ¤   ¤   ~CPGPOptionTextEdit();
b167c5 ¤
3d8b9c ¤   virtual Boolean¤¤   FocusDraw(LPane *inSubPane = nil);¤
5782f7 };
fbaf5a
db6b3b CPGPOptionTextEdit::CPGPOptionTextEdit(LStream *inStream) :
6f101c ¤   ¤   ¤   ¤   ¤   LTextEditView(inStream)
ebbb36 {
8eefe6 }
4baf5a
2dd154 CPGPOptionTextEdit::~CPGPOptionTextEdit()
99bb36 {
faefe6 }
6aaf5a
ef7e69 ¤   Boolean
05a751 CPGPOptionTextEdit::FocusDraw(LPane *inSubPane)
38bb36 {
f27aca ¤   Boolean¤focused;
2967c5 ¤
060223 ¤   // Stupid PP whacks the background color to white for TextEdit classes.
b567c5 ¤
8736b5 ¤   focused = LTextEditView::FocusDraw( inSubPane );
562dac ¤   if( focused )
37c7a1 ¤   {
c7fce1 ¤   ¤   RGBColor¤   textColor;
0067c5 ¤
d58fd5 ¤   ¤   GetForeColor( &textColor );
d6fe46 ¤   ¤   ApplyForeAndBackColors();
623411 ¤   ¤   RGBForeColor( &textColor );
119371 ¤   }
6f67c5 ¤
c5a42d ¤   return( focused );
efefe6 }
08af5a
509133 // ---------------------------------------------------------------------------
1a685a //¤ class CPGPOptionsListView
149133 // ---------------------------------------------------------------------------
10af5a
838544 CPGPOptionsListView::CPGPOptionsListView(LStream *inStream)
5280d6 ¤   : LView(inStream)
a1bb36 {
--e877 0011adf8a3140120277 Page 2 of CPGPOptionsListView.cp
c1ddbf ¤   mNewViewImageOffset = 0;
dbefe6 }
d2af5a
dc64d4 CPGPOptionsListView::~CPGPOptionsListView()
95bb36 {
91efe6 }
83af5a
aa6d52 ¤   void
cb1bbb CPGPOptionsListView::FinishCreateSelf(void)
6ebb36 {
1b358f ¤   LView::FinishCreateSelf();
6067c5 ¤
c1d246 ¤   RegisterClass_( CPGPCheckboxOptionView );
238287 ¤   RegisterClass_( CPGPOptionTextEdit );
668d66 ¤   RegisterClass_( CPGPPopupMenuOptionView );
f1efe6 }
c2af5a
956d52 ¤   void
dcaecb CPGPOptionsListView::AppendOptionView(
1fef03 ¤   CPGPOptionView ¤*theView,
114c6e ¤   Boolean¤¤   ¤   inRefresh)
4cbb36 {
201484 ¤   SDimension32¤   imageSize;
c267c5 ¤
67c277 ¤   pgpAssertAddrValid( theView, VoidAlign );
3567c5 ¤
c3cae8 ¤   theView->PlaceInSuperImageAt( 0, mNewViewImageOffset, inRefresh );
1c0d9c ¤   theView->GetImageSize( imageSize );
7caf5a
4bfd32 ¤   mNewViewImageOffset += imageSize.height;
5eb243 ¤   ResizeImageBy( 0, imageSize.height, inRefresh );
1aefe6 }
--e877 0016ab2d4a340120278 Page 1 of CPGPOptionsListView.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
576cef ¤   $Id: CPGPOptionsListView.h,v 1.1.14.1 1998/11/12 03:20:38 heller Exp $
b0f7f7 ____________________________________________________________________________*/
c4af5a
af7b7d #pragma once
f8af5a
1107ea // Public includes:
992c73 #include <LView.h>
e3af5a
f91a82 class CPGPOptionView;
d7af5a
72e694 class CPGPOptionsListView : public LView
babb36 {
575ed4 public:
f1af5a
41f337 ¤   enum { class_ID = 'OLst' };
7f67c5 ¤
e3093b ¤   ¤   ¤   ¤   ¤   ¤   CPGPOptionsListView(LStream *inStream);
bfdc12 ¤   virtual¤¤   ¤   ¤   ~CPGPOptionsListView();
57af5a
ef5f32 ¤   void¤   ¤   ¤   ¤   AppendOptionView(CPGPOptionView *theView,
762410 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inRefresh);
01febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
8067c5 ¤
bf0fb9 private:
72af5a
cb6062 ¤   SInt32¤ ¤   ¤   ¤   mNewViewImageOffset;
6a82f7 };
--0fa5 000d2facfaf40120279 Page 1 of CPGPPassphraseGrafPortView.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
b47e77 ¤   $Id: CPGPPassphraseGrafPortView.cp,v 1.9.10.1 1998/11/12 03:20:38 heller Ex¶
e4b277 p $
ddf7f7 ____________________________________________________________________________*/
45af5a
a88708 #include <LCheckBox.h>
b349f7 #include <LProgressBar.h>
8bd797 #include <LPushButton.h>
9905c6 #include <LStaticText.h>
f2dd56 #include <PP_Messages.h>
a08f92 #include <UGAColorRamp.h>
4daf5a
14090b #include "MacEvents.h"
0fbf4a #include "MacSecureMemory.h"
0e85c2 #include "MacStrings.h"
02af5a
4f0d08 #include "pgpMem.h"
a94919 #include "pgpUtilities.h"
51af5a
e5829c #include "CPassphraseEdit.h"
82d1c7 #include "CPGPPassphraseGrafPortView.h"
0afe54 #include "CPrivateKeysPopup.h"
61faae #include "PGPsdkUILibDialogs.h"
f8af5a
beaf5a
77c907 CPGPPassphraseGrafPortView::CPGPPassphraseGrafPortView(LStream *inStream)
fca5e4 ¤   : CPGPUIGrafPortView(inStream)
13bb36 {
112602 ¤   mPassphraseEdit ¤   ¤   = NULL;
f0ecf6 ¤   mHideTypingCheckbox¤¤   = NULL;
45b290 ¤   mOptionsButton¤ ¤   ¤   = NULL;
b5c80e ¤   mOptions¤   ¤   ¤   ¤   = NULL;
744b82 ¤   mCapsLockMessage¤   ¤   = NULL;
b4347d ¤   mShowingCapsLockMessage¤= FALSE;
fcefe6 }
ddaf5a
7d3c3d CPGPPassphraseGrafPortView::~CPGPPassphraseGrafPortView()
66bb36 {
18efe6 }
1faf5a
bb6d52 ¤   void
508383 CPGPPassphraseGrafPortView::FinishCreateSelf()
20bb36 {
a6ab55 ¤   CPGPUIGrafPortView::FinishCreateSelf();
9867c5 ¤
d4f6eb ¤   mPassphraseEdit =
c54b9f ¤   ¤   (CPassphraseEdit *) FindPaneByID( kPassphraseEditFieldPaneID );
82c361 ¤   mHideTypingCheckbox =
dedaac ¤   ¤   (LCheckBox *) FindPaneByID( kHideTypingCheckboxPaneID );
237609 ¤   mOptionsButton =·
0ce7f7 ¤   ¤   (LPushButton *) FindPaneByID( kOptionsButtonPaneID );
2f6793 ¤   mCapsLockMessage =
f242b4 ¤   ¤   (LStaticText *) FindPaneByID( kCapsLockDownTextPaneID );
0f1b52 ¤   ¤
b0e86c ¤   pgpAssertAddrValid( mPassphraseEdit, VoidAlign );
0f089c ¤   pgpAssertAddrValid( mHideTypingCheckbox, VoidAlign );
490c61 ¤   pgpAssertAddrValid( mOptionsButton, VoidAlign );
8467c5 ¤
102a8c ¤   SwitchTarget( mPassphraseEdit );
4467c5 ¤
136794 ¤   mPassphraseEdit->SetHideTyping( TRUE );
24103b ¤   mPassphraseEdit->AddListener( this );
d967c5 ¤
986156 ¤   mHideTypingCheckbox->SetValue( 1 );
30eba8 ¤   mHideTypingCheckbox->AddListener( this );
6267c5 ¤
e0e213 ¤   if( IsntNull( mCapsLockMessage ) )
288761 ¤   ¤   mCapsLockMessage->Hide();
d2efe6 }
--a855 000f2c5ddfc40120279 Page 2 of CPGPPassphraseGrafPortView.cp
e0af5a
01c744 ¤   PGPError
08c45c CPGPPassphraseGrafPortView::SetOptions(
1406bb ¤   PGPContextRef ¤ ¤   ¤   ¤   ¤   context,
d4497f ¤   CPGPPassphraseDialogOptions ¤   *options)
e4bb36 {
4e8e12 ¤   PGPError¤   err = kPGPError_NoErr;
5067c5 ¤
df6f55 ¤   err = CPGPUIGrafPortView::SetOptions( context, options );
73b1f0 ¤   if( IsntPGPError( err ) )
3dc7a1 ¤   {
df4f75 ¤   ¤   mOptions = options;
aa1b52 ¤   ¤
c7ed97 ¤   ¤   if( IsntNull( options->mPrompt ) )
665b34 ¤   ¤   {
cef44d ¤   ¤   ¤   Str255¤ pPrompt;
ec87c7 ¤   ¤   ¤
a86011 ¤   ¤   ¤   CToPString( options->mPrompt, pPrompt );
01b571 ¤   ¤   ¤   SetDescriptor( pPrompt );
be0fe4 ¤   ¤   }
a1af5a
535e28 ¤   ¤   // Hide the options button unless the client has asked for options
911b52 ¤   ¤
678302 ¤   ¤   if( IsntNull( options->mDialogOptions ) &&
58c81c ¤   ¤   ¤   pgpGetOptionListCount( options->mDialogOptions ) > 0 )
385b34 ¤   ¤   {
11a5c7 ¤   ¤   ¤   LPane ¤ ¤   *positioningPane;
479f5d ¤   ¤   ¤   SPoint32¤   loc;
2e87c7 ¤   ¤   ¤
8a8b20 ¤   ¤   ¤   mOptionsButton->AddListener( this );
3b87c7 ¤   ¤   ¤
bb3fd3 ¤   ¤   ¤   /* Move Hide Typing checkbox above the options button */
6587c7 ¤   ¤   ¤
3111a8 ¤   ¤   ¤   positioningPane = FindPaneByID( kHideTypingPositioningPaneID );
ecad48 ¤   ¤   ¤   pgpAssertAddrValid( positioningPane, VoidAlign );
af87c7 ¤   ¤   ¤
540c66 ¤   ¤   ¤   positioningPane->GetFrameLocation( loc );
01359d ¤   ¤   ¤   mHideTypingCheckbox->PlaceInSuperFrameAt( loc.h, loc.v, FALSE );
ed0fe4 ¤   ¤   }
ea0e1d ¤   ¤   else
5c5b34 ¤   ¤   {
b2a83c ¤   ¤   ¤   mOptionsButton->Disable();
16e8e9 ¤   ¤   ¤   mOptionsButton->Hide();
d50fe4 ¤   ¤   }
45af5a
e0eb2e ¤   ¤   AdjustButtons();
d09371 ¤   }
0d67c5 ¤
4ddeb7 ¤   return( err );
2cefe6 }
7eaf5a
379cb9 ¤   MessageT
95a1d6 CPGPPassphraseGrafPortView::HandleMessage(MessageT theMessage)
f5bb36 {
638337 ¤   if( theMessage == msg_OK )
d4c7a1 ¤   {
433fb6 ¤   ¤   PGPUInt32¤  passphraseLength;
d01b52 ¤   ¤
314755 ¤   ¤   pgpAssert( IsntNull( mOptions->mPassphrasePtr ) );
d71b52 ¤   ¤
09b1d9 ¤   ¤   passphraseLength = mPassphraseEdit->GetPassphraseLength();
b51b52 ¤   ¤
97a985 ¤   ¤   *mOptions->mPassphrasePtr = (char *) PGPNewSecureData(
3741bb ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( mContext ),
b9d917 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mPassphraseEdit->GetPassphraseLength() + 1, 0 );
7987ad ¤   ¤   if( IsntNull( *mOptions->mPassphrasePtr ) )
185b34 ¤   ¤   {
a052ee ¤   ¤   ¤   mPassphraseEdit->GetPassphrase( *mOptions->mPassphrasePtr );
780fe4 ¤   ¤   }
960e1d ¤   ¤   else
c45b34 ¤   ¤   {
f2c2e1 ¤   ¤   ¤   mDialogError = kPGPError_OutOfMemory;
--9d6a 0007c790e8b40120279 Page 3 of CPGPPassphraseGrafPortView.cp
b50fe4 ¤   ¤   }
6b9371 ¤   }
3c67c5 ¤
b6cfbc ¤   return( theMessage );
d8efe6 }
9caf5a
5b6d52 ¤   void
aefceb CPGPPassphraseGrafPortView::AdjustButtons(void)
2abb36 {
dfedff ¤   PGPBoolean¤ ¤   ¤   disableOKButton = FALSE;
7967c5 ¤
15fde8 ¤   pgpAssert( IsntNull( mOptions ) );
52af5a
71b575 ¤   if( mOptions->mMinPassphraseLength > 0 &&
6cefc1 ¤   ¤   ¤   mPassphraseEdit->GetPassphraseLength() <
9edd92 ¤   ¤   ¤   ¤   mOptions->mMinPassphraseLength )
a8c7a1 ¤   {
c898cb ¤   ¤   disableOKButton = TRUE;
719371 ¤   }
9b67c5 ¤
411660 ¤   if( ! disableOKButton )
7cc7a1 ¤   {
e627e4 ¤   ¤   if( mOptions->mMinPassphraseQuality > 0 &&
a6a996 ¤   ¤   ¤   mPassphraseEdit->EstimatePassphraseQuality() <
cf0a57 ¤   ¤   ¤   ¤   mOptions->mMinPassphraseQuality )
9f5b34 ¤   ¤   {
bf1337 ¤   ¤   ¤   disableOKButton = TRUE;
8e0fe4 ¤   ¤   }
799371 ¤   }
d167c5 ¤
8ea3ff ¤   if( disableOKButton )
78c7a1 ¤   {
a0f734 ¤   ¤   mOKButton->Disable();
699371 ¤   }
970e24 ¤   else
32c7a1 ¤   {
8caf4f ¤   ¤   mOKButton->Enable();
e49371 ¤   }
58efe6 }
35af5a
2b6d52 ¤   void
ea66bd CPGPPassphraseGrafPortView::ListenToMessage(MessageT inMessage, void *ioParam)
c7bb36 {
d5d22a ¤   switch (inMessage)
33c7a1 ¤   {
e57385 ¤   ¤   case msg_HideTyping:
2689e4 ¤   ¤   ¤   mPassphraseEdit->SetHideTyping(
d6ad17 ¤   ¤   ¤   ¤   ¤   ¤   mHideTypingCheckbox->GetValue() == 1 );
97cdcb ¤   ¤   ¤   break;
caaf5a
30648b ¤   ¤   case msg_ChangedPassphrase:
a6df73 ¤   ¤   ¤   AdjustButtons();
d2cdcb ¤   ¤   ¤   break;
631b52 ¤   ¤
21f85e ¤   ¤   case msg_Options:
5c5a2e ¤   ¤   ¤   DoOptionsDialog();
becdcb ¤   ¤   ¤   break;
1187c7 ¤   ¤   ¤
6f9ae3 ¤   ¤   default:
2f2445 ¤   ¤   ¤   CPGPUIGrafPortView::ListenToMessage( inMessage, ioParam );
91cdcb ¤   ¤   ¤   break;
5b9371 ¤   }
cdefe6 }
07af5a
187e69 ¤   Boolean
b15d28 CPGPPassphraseGrafPortView::HandleKeyPress(const EventRecord& inKeyEvent)
bbbb36 {
44af22 ¤   Boolean¤¤   keyHandled = TRUE;
8967c5 ¤
6dadaf ¤   if( (inKeyEvent.modifiers & cmdKey) != 0 )
7ac7a1 ¤   {
7ccbda ¤   ¤   Int16¤  theKey = inKeyEvent.message & charCodeMask;
--33ee 0000a816ace40120279 Page 4 of CPGPPassphraseGrafPortView.cp
e0af5a
262b6b ¤   ¤   switch(theKey)
275b34 ¤   ¤   {
c4dd16 ¤   ¤   ¤   case 'H':
855245 ¤   ¤   ¤   case 'h':
46f776 ¤   ¤   ¤   {
45dcad ¤   ¤   ¤   ¤   mHideTypingCheckbox->SetValue(
8c95b9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   !mHideTypingCheckbox->GetValue());
5a91b4 ¤   ¤   ¤   ¤   mPassphraseEdit->SetHideTyping(
cf9079 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mHideTypingCheckbox->GetValue() == 1 );
0cf622 ¤   ¤   ¤   ¤   break;
aba3a6 ¤   ¤   ¤   }
e787c7 ¤   ¤   ¤
768a37 ¤   ¤   ¤   case 'O':
700564 ¤   ¤   ¤   case 'o':
96f776 ¤   ¤   ¤   {
40c8a5 ¤   ¤   ¤   ¤   if( mOptionsButton->IsEnabled() )
8272c3 ¤   ¤   ¤   ¤   {
9055d7 ¤   ¤   ¤   ¤   ¤   mOptionsButton->SimulateHotSpotClick( kControlButtonPart );
c42613 ¤   ¤   ¤   ¤   }
6d2b85 ¤   ¤   ¤   ¤
7ff622 ¤   ¤   ¤   ¤   break;
f9a3a6 ¤   ¤   ¤   }
a4af5a
59db68 ¤   ¤   ¤   default:
15563a ¤   ¤   ¤   ¤   keyHandled = CPGPUIGrafPortView::HandleKeyPress(
f75876 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inKeyEvent );
eaf622 ¤   ¤   ¤   ¤   break;
1f0fe4 ¤   ¤   }
2f9371 ¤   }
540e24 ¤   else
e0c7a1 ¤   {
77cf15 ¤   ¤   keyHandled = CPGPUIGrafPortView::HandleKeyPress( inKeyEvent );
d49371 ¤   }
d5af5a
c0c022 ¤   return keyHandled;
bfefe6 }
7daf5a
4e6d52 ¤   void
a20241 CPGPPassphraseGrafPortView::ClearPassphrase(void)
66bb36 {
a2e8ca ¤   mPassphraseEdit->ClearPassphrase();
1567c5 ¤
9a11ec ¤   if( IsntNull( *mOptions->mPassphrasePtr ) )
37c7a1 ¤   {
4d48e4 ¤   ¤   PGPFreeData( *mOptions->mPassphrasePtr );
88806c ¤   ¤   *mOptions->mPassphrasePtr = NULL;
6f9371 ¤   }
e9efe6 }
b9af5a
1a6d52 ¤   void
4f87c2 CPGPPassphraseGrafPortView::SetDescriptor(ConstStringPtr prompt)
43bb36 {
af2905 ¤   LStaticText¤*captionObj;
7a67c5 ¤
8c2568 ¤   pgpAssertAddrValid( prompt, char );
53af5a
a42e80 ¤   captionObj = (LStaticText *) FindPaneByID( kPromptTextPaneID );
25301f ¤   pgpAssertAddrValid( captionObj, VoidAlign );
1767c5 ¤
5961cc ¤   captionObj->SetDescriptor( prompt );
68efe6 }
7faf5a
316d52 ¤   void
fd7b82 CPGPPassphraseGrafPortView::DoOptionsDialog(void)
71bb36 {
723a4c ¤   pgpAssertAddrValid( mOptions->mDialogOptions, VoidAlign );
7167c5 ¤
86d8af ¤   /*
30ac2b ¤   ** mOptions->dialogOptions is probably a volatile PGPOptionList i.e.
0fd003 ¤   ** passing it to PGPOptionsDialog() will dispose of it. Make a copy
0a5a62 ¤   ** here for our purposes.
--1313 0013e7ff89e40120279 Page 5 of CPGPPassphraseGrafPortView.cp
129faa ¤   */
c1af5a
c99a3e ¤   (void) PGPOptionsDialog( mContext,
6650aa ¤   ¤   ¤   ¤   ¤   pgpCopyOptionList( mOptions->mDialogOptions ),
641bbb ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) );
75efe6 }
13af5a
056d52 ¤   void
3af7bd CPGPPassphraseGrafPortView::DoIdle(const EventRecord &inMacEvent)
6fbb36 {
5412ed ¤   CPGPUIGrafPortView::DoIdle( inMacEvent );
7767c5 ¤
bce213 ¤   if( IsntNull( mCapsLockMessage ) )
edc7a1 ¤   {
95e29d ¤   ¤   if( mPassphraseEdit->IsVisible() )
785b34 ¤   ¤   {
a934c0 ¤   ¤   ¤   if( CapsLockIsDown() )
e1f776 ¤   ¤   ¤   {
dee9a4 ¤   ¤   ¤   ¤   if( ! mShowingCapsLockMessage )
6572c3 ¤   ¤   ¤   ¤   {
d52e45 ¤   ¤   ¤   ¤   ¤   mShowingCapsLockMessage = TRUE;
3c8115 ¤   ¤   ¤   ¤   ¤   mCapsLockMessage->Show();
412613 ¤   ¤   ¤   ¤   }
cba3a6 ¤   ¤   ¤   }
6123f3 ¤   ¤   ¤   else if( mShowingCapsLockMessage )
0ef776 ¤   ¤   ¤   {
e877df ¤   ¤   ¤   ¤   mShowingCapsLockMessage = FALSE;
cd54fc ¤   ¤   ¤   ¤   mCapsLockMessage->Hide();
8ba3a6 ¤   ¤   ¤   }
360fe4 ¤   ¤   }
3bb26b ¤   ¤   else if( mShowingCapsLockMessage )
9b5b34 ¤   ¤   {
1e2542 ¤   ¤   ¤   mShowingCapsLockMessage = FALSE;
f76812 ¤   ¤   ¤   mCapsLockMessage->Hide();
ec0fe4 ¤   ¤   }
8e9371 ¤   }
3eefe6 }
--21d6 001d264fb804012027a Page 1 of CPGPPassphraseGrafPortView.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
528753 ¤   $Id: CPGPPassphraseGrafPortView.h,v 1.10.10.1 1998/11/12 03:20:39 heller Ex¶
f1b277 p $
f9f7f7 ____________________________________________________________________________*/
0eaf5a
7e7b7d #pragma once
5faf5a
d1cc06 #include "pgpDialogs.h"
53e684 #include "pgpUserInterface.h"
5ee82c #include "pgpPubTypes.h"
d3af5a
b761a9 #include "CPGPUIGrafPortView.h"
fcaf5a
b72647 class CPassphraseEdit;
89e276 class LCheckBox;
8b88da class LPushButton;
0bcb91 class LStaticText;
d6af5a
408325 class CPGPPassphraseGrafPortView : public CPGPUIGrafPortView
96bb36 {
0b5ed4 public:
71af5a
6e2f4b ¤   enum
7fc7a1 ¤   {
4ca527 ¤   ¤   class_ID = 'PGPV',
861b52 ¤   ¤
e8c5f7 ¤   ¤   kPassphraseEditFieldPaneID¤ ¤   = 'ePwd',
4317ad ¤   ¤   kHideTypingCheckboxPaneID¤  ¤   = 'HTyp',
bdb66b ¤   ¤   kHideTypingPositioningPaneID¤   = 'TypP',
b8aa77 ¤   ¤   kPromptTextPaneID¤  ¤   ¤   ¤   = 'cTxt',
b0b4c3 ¤   ¤   kCapsLockDownTextPaneID¤¤   ¤   = 'cCLD',
a9564d ¤   ¤   kOptionsButtonPaneID¤   ¤   ¤   = 'bOpt',
ce1b52 ¤   ¤
f0ea73 ¤   ¤   msg_HideTyping¤ ¤   ¤   ¤   = kHideTypingCheckboxPaneID,
e96af4 ¤   ¤   msg_Options¤¤   ¤   ¤   ¤   = kOptionsButtonPaneID,
6c7cf2 ¤   ¤   msg_ChangedPassphrase¤  ¤   = kPassphraseEditFieldPaneID
b762bd ¤   };
edaf5a
88d8cb ¤   ¤   ¤   ¤   ¤   ¤   CPGPPassphraseGrafPortView(LStream *inStream);
d310bd ¤   virtual¤¤   ¤   ¤   ~CPGPPassphraseGrafPortView();
dfaf5a
980b44 ¤   virtual void¤   ¤   DoIdle(const EventRecord &inMacEvent);
5f4438 ¤   virtual void¤   ¤   ClearPassphrase(void);
86dad0 ¤   virtual¤void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
d5d44d ¤   virtual¤Boolean¤¤   HandleKeyPress(const EventRecord &inKeyEvent);
ab2ebf ¤   virtual void¤   ¤   SetDescriptor(ConstStringPtr prompt);
3eaf5a
8146db ¤   PGPError¤   ¤   ¤   SetOptions(PGPContextRef context,·
cfbb4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPPassphraseDialogOptions *options);
1f67c5 ¤
dba2d3 protected:
dcaf5a
64676f ¤   CPassphraseEdit¤¤   *mPassphraseEdit;
82e463 ¤   LCheckBox¤  ¤   ¤   *mHideTypingCheckbox;
dac29b ¤   LPushButton¤¤   ¤   *mOptionsButton;
3be6a3 ¤   LStaticText¤¤   ¤   *mCapsLockMessage;
7f3882 ¤   PGPBoolean¤ ¤   ¤   mShowingCapsLockMessage;
dd67c5 ¤
3baf82 ¤   virtual¤void¤   ¤   AdjustButtons(void);
b3febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
a32bf8 ¤   virtual¤MessageT¤   HandleMessage(MessageT theMessage);
62b0d6 ¤   virtual void¤   ¤   DoOptionsDialog(void);
c067c5 ¤
b60fb9 private:
5b67c5 ¤
a65657 ¤   const CPGPPassphraseDialogOptions ¤ *mOptions;
6982f7 };
d2af5a
--44d9 0007d13bc0f4012027b Page 1 of CPGPPopupMenuOptionView.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
9fbe69 ¤   $Id: CPGPPopupMenuOptionView.cp,v 1.3.12.1 1998/11/12 03:20:40 heller Exp $
24f7f7 ____________________________________________________________________________*/
cfaf5a
5507ea // Public includes:
d40aae #include <LPopupButton.h>
e6dd56 #include <PP_Messages.h>
27af5a
c785c2 #include "MacStrings.h"
de0d08 #include "pgpMem.h"
69af5a
7b05c5 // Private includes:
5b2c9c #include "CPGPPopupMenuOptionView.h"
540141 #include "pgpOptionListPriv.h"
84af5a
057f5b const ResIDT¤   kPopupMenuOptionViewResourceID ¤= 4801;
e5d50f const PaneIDT¤  kPopupMenuPaneID ¤  ¤   ¤   ¤   = 4801;
c6af5a
aa04bf CPGPPopupMenuOptionView::CPGPPopupMenuOptionView(LStream *inStream) :
f73c22 ¤   ¤   ¤   ¤   ¤   CPGPOptionView(inStream)
39bb36 {
698ef4 ¤   mPopupMenu ¤= NULL;
7d0760 ¤   mResultPtr¤ = NULL;
66efe6 }
f8af5a
cee21c CPGPPopupMenuOptionView::~CPGPPopupMenuOptionView()
1cbb36 {
f4efe6 }
85af5a
f56d52 ¤   void
a7e2ca CPGPPopupMenuOptionView::FinishCreateSelf(void)
30bb36 {
ff6bef ¤   CPGPOptionView::FinishCreateSelf();
a667c5 ¤
8cdda7 ¤   mPopupMenu = (LPopupButton *) FindPaneByID( kPopupMenuPaneID );
ae216c ¤   pgpAssertAddrValid( mPopupMenu, VoidAlign );
0a67c5 ¤
1f4dd1 ¤   mPopupMenu->AddListener( this );
87efe6 }
efaf5a
736d52 ¤   void
05d198 CPGPPopupMenuOptionView::ListenToMessage(
7c19a3 ¤   MessageT ¤  inMessage,
677503 ¤   void ¤  ¤   *ioParam)
51bb36 {
3b769e ¤   switch( inMessage )
78c7a1 ¤   {
6ad8ba ¤   ¤   case msg_OK:
855b34 ¤   ¤   {
241d44 ¤   ¤   ¤   pgpAssertAddrValid( mPopupMenu, VoidAlign );
a611dd ¤   ¤   ¤   pgpAssertAddrValid( mResultPtr, PGPUInt32 );
9887c7 ¤   ¤   ¤
dc8462 ¤   ¤   ¤   *mResultPtr = mPopupMenu->GetValue();
32cdcb ¤   ¤   ¤   break;
e00fe4 ¤   ¤   }
2e1b52 ¤   ¤
659ae3 ¤   ¤   default:
4e91c4 ¤   ¤   ¤   CPGPOptionView::ListenToMessage( inMessage, ioParam );
30cdcb ¤   ¤   ¤   break;
379371 ¤   }
c5efe6 }
e5af5a
fa6d52 ¤   void
d74736 CPGPPopupMenuOptionView::SetInfo(const PGPOUIPopupListDesc *info)
9fbb36 {
23878d ¤   Str255¤ ¤   pTitle;
6f5e5f ¤   MenuHandle¤ theMenu;
23348d ¤   PGPUInt32¤  numMenuItems;
7d67c5 ¤
--393f 001d480c2f34012027b Page 2 of CPGPPopupMenuOptionView.cp
bb951e ¤   pgpAssertAddrValid( info, PGPOUIPopupListDesc );
0e47d0 ¤   pgpAssertAddrValid( info->title, char );
a5daa5 ¤   pgpAssertAddrValid( info->description, char );
ace3e9 ¤   pgpAssert( info->numListItems > 0 );
bc82df ¤   pgpAssertAddrValid( info->listItems, char * );
7c0422 ¤   pgpAssertAddrValid( info->valuePtr, PGPUInt32 );
0567c5 ¤
41adad ¤   mItemID ¤   = info->itemID;
5fc19d ¤   mResultPtr ¤= info->valuePtr;
0967c5 ¤
e14ff1 ¤   CToPString( info->title, pTitle );
8bddd9 ¤   mPopupMenu->SetDescriptor( pTitle );
a1af5a
f8ec52 ¤   // PP calls DisposeHandle on theMenu, not DisposeMenu
dd32f4 ¤   MacLeaks_Suspend();
dbf79a ¤   ¤   theMenu = NewMenu( mPopupMenu->GetMenuID(), pTitle );
cc77d9 ¤   MacLeaks_Resume();
2e67c5 ¤
18e9a7 ¤   AssertHandleIsValid( theMenu, "" );
74af5a
49bee2 ¤   numMenuItems = 0;
7567c5 ¤
7c9bda ¤   // Build the popup
3dd9c9 ¤   for( PGPUInt32 itemIndex = 0; itemIndex < info->numListItems; itemIndex++)
b2c7a1 ¤   {
470804 ¤   ¤   if( IsntNull( info->listItems[itemIndex] ) )
5b5b34 ¤   ¤   {
89aa51 ¤   ¤   ¤   ++numMenuItems;
4a87c7 ¤   ¤   ¤
8f1e60 ¤   ¤   ¤   CToPString( info->listItems[itemIndex], pTitle );
71c97b ¤   ¤   ¤   AppendMenu( theMenu, "\px" );
2038fe ¤   ¤   ¤   SetMenuItemText( theMenu, numMenuItems, pTitle );
b00fe4 ¤   ¤   }
b09371 ¤   }
8e67c5 ¤
cb365e ¤   mPopupMenu->SetMacMenuH( theMenu );
1e67c5 ¤
18e88e ¤   // Need to set this before calling SetValue()!
62af5a
214d6e ¤   mPopupMenu->SetMinValue( 1 );
4f6b5d ¤   mPopupMenu->SetMaxValue( numMenuItems );
e625df ¤   mPopupMenu->SetValue( *mResultPtr );
3c26f6 ¤   SetDescription( info->description );
edefe6 }
00af5a
77bf1b ¤   CPGPPopupMenuOptionView *
12e003 CPGPPopupMenuOptionView::CreatePopupMenuOptionView(
9678f7 ¤   LView ¤ ¤   ¤   ¤   ¤   ¤   *superView,
c2af34 ¤   const PGPOUIPopupListDesc¤  *info)
d9bb36 {
453d20 ¤   CPGPPopupMenuOptionView¤*popupMenuView;
8167c5 ¤
69c97f ¤   pgpAssertAddrValid( superView, VoidAlign );
4c951e ¤   pgpAssertAddrValid( info, PGPOUIPopupListDesc );
4a67c5 ¤
5c4aaf ¤   popupMenuView = (CPGPPopupMenuOptionView *)
46f800 ¤   ¤   ¤   ¤   ¤   ¤   CPGPOptionView::CreateOptionView(
20eb3d ¤   ¤   ¤   ¤   ¤   ¤   ¤   superView, kPopupMenuOptionViewResourceID );
fe5bb0 ¤   if( IsntNull( popupMenuView ) )
65c7a1 ¤   {
f9cde0 ¤   ¤   popupMenuView->SetInfo( info );
859371 ¤   }
8167c5 ¤
38bbba ¤   return ( popupMenuView );
d4be43 }¶
--36e4 0015b429f474012027c Page 1 of CPGPPopupMenuOptionView.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
a1cadd ¤   $Id: CPGPPopupMenuOptionView.h,v 1.2.12.1 1998/11/12 03:20:41 heller Exp $
b9f7f7 ____________________________________________________________________________*/
5caf5a
617b7d #pragma once
88af5a
b5d8d1 #include "CPGPOptionView.h"
59af5a
b295ce class LPopupButton;
83704c struct PGPOUIPopupListDesc;
56af5a
8913f9 class CPGPPopupMenuOptionView : public CPGPOptionView
f9bb36 {
755ed4 public:
b8b835 ¤   enum { class_ID = 'POpt' };
72af5a
84c8dd ¤   ¤   ¤   ¤   ¤   ¤   CPGPPopupMenuOptionView(LStream *inStream);
942cd7 ¤   virtual¤¤   ¤   ¤   ~CPGPPopupMenuOptionView();
4baf5a
60dad0 ¤   virtual¤void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
d6af5a
1ddd5c ¤   static CPGPPopupMenuOptionView *CreatePopupMenuOptionView(
3e7f5f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   LView *inSuperView,
2d3ac1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPOUIPopupListDesc *info );
c0a2d3 protected:
7daf5a
0f80fd ¤   virtual void¤   ¤   FinishCreateSelf();
3767c5 ¤
330fb9 private:
2baf5a
3b31c8 ¤   LPopupButton¤   ¤   *mPopupMenu;
cd8b9f ¤   PGPUInt32¤  ¤   ¤   *mResultPtr;
c267c5 ¤
60476c ¤   void¤   ¤   ¤   ¤   SetInfo(const PGPOUIPopupListDesc *info);
9c82f7 };
5baf5a
--4e94 000914ea2c64012027d Page 1 of CPGPRandomDataGrafPort.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
eab549 ¤   $Id: CPGPRandomDataGrafPort.cp,v 1.4.12.1 1998/11/12 03:20:42 heller Exp $
d3f7f7 ____________________________________________________________________________*/
70af5a
0ed797 #include <LPushButton.h>
d549f7 #include <LProgressBar.h>
e105c6 #include <LStaticText.h>
3add56 #include <PP_Messages.h>
07af5a
7985c2 #include "MacStrings.h"
30cc06 #include "pgpDialogs.h"
032f8d #include "pgpErrors.h"
ed0d08 #include "pgpMem.h"
32c9be #include "pgpRandomPool.h"
daaf5a
5dd83d #include "CPGPRandomDataGrafPort.h"
eeaf5a
32af5a
954056 CPGPRandomDataGrafPortView::CPGPRandomDataGrafPortView(LStream *inStream)
52a5e4 ¤   : CPGPUIGrafPortView(inStream)
42bb36 {
ca0294 ¤   mProgressBar ¤  ¤   = NULL;
9e2e94 ¤   mEntropyCollected¤  = 0;
b6fed5 ¤   mLastMouseLoc.v¤¤   = 0;
adc64d ¤   mLastMouseLoc.h¤¤   = 0;
cbefe6 }
7aaf5a
88a86a CPGPRandomDataGrafPortView::~CPGPRandomDataGrafPortView()
9ebb36 {
edefe6 }
c6af5a
006d52 ¤   void
00d1e1 CPGPRandomDataGrafPortView::FinishCreateSelf()
aabb36 {
2cab55 ¤   CPGPUIGrafPortView::FinishCreateSelf();
2567c5 ¤
00b380 ¤   mProgressBar = (LProgressBar *) FindPaneByID( kProgressBarPaneID );
84c30e ¤   pgpAssertAddrValid( mProgressBar, VoidAlign );
d367c5 ¤
d679ef ¤   mOKButton->Hide();
ceefe6 }
a6af5a
bec744 ¤   PGPError
457ea1 CPGPRandomDataGrafPortView::SetOptions(
6606bb ¤   PGPContextRef ¤ ¤   ¤   ¤   ¤   context,
ac9fde ¤   CPGPRandomDataDialogOptions ¤   *options)
e8bb36 {
038e12 ¤   PGPError¤   err = kPGPError_NoErr;
6567c5 ¤
d36f55 ¤   err = CPGPUIGrafPortView::SetOptions( context, options );
c4b1f0 ¤   if( IsntPGPError( err ) )
e0c7a1 ¤   {
ac4f75 ¤   ¤   mOptions = options;
971b52 ¤   ¤
19ed97 ¤   ¤   if( IsntNull( options->mPrompt ) )
b15b34 ¤   ¤   {
60f44d ¤   ¤   ¤   Str255¤ pPrompt;
5687c7 ¤   ¤   ¤
7c6011 ¤   ¤   ¤   CToPString( options->mPrompt, pPrompt );
d7b571 ¤   ¤   ¤   SetDescriptor( pPrompt );
330fe4 ¤   ¤   }
851b52 ¤   ¤
aa2cfc ¤   ¤   mProgressBar->SetMaxValue( options->mNeededEntropyBits );
a79371 ¤   }
e767c5 ¤
24deb7 ¤   return( err );
39efe6 }
d1af5a
917e69 ¤   Boolean
--ff7c 00128347b2a4012027d Page 2 of CPGPRandomDataGrafPort.cp
5d3329 CPGPRandomDataGrafPortView::HandleKeyPress(const EventRecord& inKeyEvent)
51bb36 {
d9490e ¤   Boolean¤¤   keyHandled;
2e86c8 ¤   Char16¤ ¤   theChar = inKeyEvent.message & charCodeMask;
7067c5 ¤
92dc99 ¤   keyHandled = CPGPUIGrafPortView::HandleKeyPress( inKeyEvent );
f567c5 ¤
666bcd ¤   mEntropyCollected += PGPGlobalRandomPoolAddKeystroke( theChar );
efb0bf ¤   if( mEntropyCollected >= mOptions->mNeededEntropyBits )
c7c7a1 ¤   {
399af4 ¤   ¤   mEntropyCollected = mOptions->mNeededEntropyBits;
df858c ¤   ¤   SetDismissMessage( msg_OK );
2f4032 ¤   }¤  ¤
2667c5 ¤
578595 ¤   mProgressBar->SetValue( mEntropyCollected );
e7af5a
8dc022 ¤   return keyHandled;
c9efe6 }
70af5a
8e6d52 ¤   void
f35266 CPGPRandomDataGrafPortView::SetDescriptor(ConstStringPtr prompt)
23bb36 {
b02905 ¤   LStaticText¤*captionObj;
5667c5 ¤
1a2568 ¤   pgpAssertAddrValid( prompt, char );
b9af5a
572e80 ¤   captionObj = (LStaticText *) FindPaneByID( kPromptTextPaneID );
b5301f ¤   pgpAssertAddrValid( captionObj, VoidAlign );
e267c5 ¤
ce61cc ¤   captionObj->SetDescriptor( prompt );
b1efe6 }
49af5a
116d52 ¤   void
811446 CPGPRandomDataGrafPortView::DoIdle(const EventRecord &inMacEvent)
98bb36 {
cbfb29 ¤   GrafPtr¤¤   savePort;
7254b5 ¤   GrafPtr¤¤   wMgrPort;
1779d1 ¤   Point¤  ¤   mouseLoc;
6aaf5a
1512ed ¤   CPGPUIGrafPortView::DoIdle( inMacEvent );
efaf5a
f8f732 ¤   GetPort( &savePort );
a099fd ¤   GetWMgrPort( &wMgrPort );¤
ee67c5 ¤
a8801e ¤   SetPort( wMgrPort );
06089c ¤   GetMouse( &mouseLoc );
6972b1 ¤   SetPort( savePort);
0167c5 ¤
6316b9 ¤   if( mouseLoc.v != mLastMouseLoc.v ||
1c227d ¤   ¤   mouseLoc.h != mLastMouseLoc.h )
7dc7a1 ¤   {
c55a38 ¤   ¤   mEntropyCollected +=
4b2434 ¤   ¤   ¤   PGPGlobalRandomPoolAddMouse( mouseLoc.h, mouseLoc.v );
beb0a9 ¤   ¤   mLastMouseLoc = mouseLoc;
d7af5a
4674a3 ¤   ¤   if( mEntropyCollected >= mOptions->mNeededEntropyBits )
6c5b34 ¤   ¤   {
ba78f4 ¤   ¤   ¤   mEntropyCollected = mOptions->mNeededEntropyBits;
7c8061 ¤   ¤   ¤   SetDismissMessage( msg_OK );
ceec70 ¤   ¤   }¤  ¤
57af5a
b0d68e ¤   ¤   mProgressBar->SetValue( mEntropyCollected );
c09371 ¤   }
28efe6 }
--bc35 0015614bd634012027e Page 1 of CPGPRandomDataGrafPort.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
a23d5e ¤   $Id: CPGPRandomDataGrafPort.h,v 1.5.10.1 1998/11/12 03:20:42 heller Exp $
89f7f7 ____________________________________________________________________________*/
c0af5a
d87b7d #pragma once
58af5a
9661a9 #include "CPGPUIGrafPortView.h"
f8af5a
08a016 class CPGPRandomDataDialogOptions;
4179e9 class LProgressBar;
baaf5a
261e3f class CPGPRandomDataGrafPortView : public CPGPUIGrafPortView
e7bb36 {
c35ed4 public:
c2af5a
512f4b ¤   enum
88c7a1 ¤   {
76eeb7 ¤   ¤   class_ID = 'CRPV',
d71b52 ¤   ¤
686a1e ¤   ¤   kProgressBarPaneID¤ = 'Prog',
fa2c7d ¤   ¤   kPromptTextPaneID¤  = 'cTxt'
b462bd ¤   };
8faf5a
598aa9 ¤   ¤   ¤   ¤   ¤   ¤   CPGPRandomDataGrafPortView(LStream *inStream);
945f1a ¤   virtual¤¤   ¤   ¤   ~CPGPRandomDataGrafPortView();
09af5a
8c0b44 ¤   virtual void¤   ¤   DoIdle(const EventRecord &inMacEvent);
72d44d ¤   virtual¤Boolean¤¤   HandleKeyPress(const EventRecord &inKeyEvent);
8f2ebf ¤   virtual void¤   ¤   SetDescriptor(ConstStringPtr prompt);
be46db ¤   PGPError¤   ¤   ¤   SetOptions(PGPContextRef context,·
4db503 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPRandomDataDialogOptions *options);
1367c5 ¤
68a2d3 protected:
44af5a
70febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
cc67c5 ¤
bf0fb9 private:
af67c5 ¤
88fe0e ¤   LProgressBar¤   ¤   *mProgressBar;
88805e ¤   PGPUInt32¤  ¤   ¤   mEntropyCollected;
96cdd3 ¤   Point¤  ¤   ¤   ¤   mLastMouseLoc;
c367c5 ¤
717a87 ¤   const CPGPRandomDataDialogOptions ¤ *mOptions;
a782f7 };
56af5a
--3cb6 0000c4ad1914012027f Page 1 of CPGPRecipientGrafPort.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
495eb7 ¤   $Id: CPGPRecipientGrafPort.cp,v 1.22.10.1 1998/11/12 03:20:43 heller Exp $
d0f7f7 ____________________________________________________________________________*/
a0af5a
468708 #include <LCheckBox.h>
1ea4c1 #include <LGAFocusBorder.h>
0f0aae #include <LPopupButton.h>
a7d797 #include <LPushButton.h>
e605c6 #include <LStaticText.h>
957b32 #include <PP_KeyCodes.h>
5add56 #include <PP_Messages.h>
c5e8ae #include <UDrawingUtils.h>
644b3b #include <UEnvironment.h>
208f92 #include <UGAColorRamp.h>
e2af5a
cea146 #include "pgpDebug.h"
632f8d #include "pgpErrors.h"
609f63 #include "pgpEncode.h"
1bc2ae #include "pgpGroups.h"
98a076 #include "pgpKeys.h"
38eb5b #include "pgpKeyServer.h"
300d08 #include "pgpMem.h"
85af5a
48324c #include <string.h>
d485c2 #include "MacStrings.h"
3eaf5a
85829c #include "CPassphraseEdit.h"
13204e #include "CPGPRecipientGrafPort.h"
ac1f02 #include "CUserIDTable.h"
27faae #include "PGPsdkUILibDialogs.h"
d49fda #include "PGPsdkUILibUtils.h"
9bcc06 #include "pgpDialogs.h"
63af5a
bf7353 enum
07bb36 {
4b58ec ¤   kMacBinaryPopupNoneMenuItem¤= 1,
077abe ¤   kMacBinaryPopupSmartMenuItem,
f00182 ¤   kMacBinaryPopupYesMenuItem
8582f7 };
f0af5a
d335d0 CPGPRecipientGrafPortView::CPGPRecipientGrafPortView(LStream *inStream)
43a5e4 ¤   : CPGPUIGrafPortView(inStream)
c3bb36 {
bdeb67 ¤   mUpdateFromServerButton¤¤   = NULL;
b7261c ¤   mWindowIsMoveable¤  ¤   ¤   = TRUE;
242263 ¤   mWindowIsResizeable¤¤   ¤   = TRUE;
cb0d41 ¤   mMinMaxSize.top¤¤   ¤   ¤   = 300;¤ // Minimum resize height
d33d92 ¤   mMinMaxSize.bottom¤ ¤   ¤   = 32000;// Maximum resize height
8c24dd ¤   mMinMaxSize.left¤   ¤   ¤   = 440;¤ // Minimum resize width
47bf02 ¤   mMinMaxSize.right¤  ¤   ¤   = 640;¤ // Maximum resize width
5908b0 ¤   mOptionsButton¤ ¤   ¤   ¤   = NULL;
bcbb9f ¤   mOptions¤   ¤   ¤   ¤   ¤   = NULL;
6067c5 ¤
f32a6c ¤   pgpClearMemory( &mRecipients, sizeof( mRecipients ) );
78efe6 }
95af5a
47d77f CPGPRecipientGrafPortView::~CPGPRecipientGrafPortView()
74cebb {¤
f13f43 ¤   PGPDisposeRecipientsList( &mRecipients );
a2efe6 }
faaf5a
066d52 ¤   void
0ddbdd CPGPRecipientGrafPortView::FinishCreateSelf()
48bb36 {
51ce4b ¤   LGAFocusBorder¤ *userIDBorder;
46af5a
b7ab55 ¤   CPGPUIGrafPortView::FinishCreateSelf();
d567c5 ¤
0c09ad ¤   mRecipientTable =
--79e5 00040d965e64012027f Page 2 of CPGPRecipientGrafPort.cp
af122c ¤   ¤   (CUserIDTable *) FindPaneByID( kRecipientTablePaneID );
e24c97 ¤   mUserIDTable =
3c9e76 ¤   ¤   (CUserIDTable *) FindPaneByID( kUserIDTablePaneID );
987609 ¤   mOptionsButton =·
c2e7f7 ¤   ¤   (LPushButton *) FindPaneByID( kOptionsButtonPaneID );
0e01c5 ¤   mUpdateFromServerButton =
f45848 ¤   ¤   (LPushButton *) FindPaneByID( kUpdateFromServerButtonPaneID );
2767c5 ¤
8bbba2 ¤   mUserIDTable->InsertCols( 1, 1, NULL, 0, TRUE );
fb9f69 ¤   mUserIDTable->AddListener( this );
2b67c5 ¤
8c0873 ¤   mRecipientTable->InsertCols( 1, 1, NULL, 0, TRUE );
f47bae ¤   mRecipientTable->AddListener( this );
0a4d23 ¤   mRecipientTable->SetAllowDeleteKeyToSend( TRUE );
fbaf5a
600d69 ¤   userIDBorder = (LGAFocusBorder *)
9bcabc ¤   ¤   ¤   ¤   ¤   FindPaneByID( kUserIDFocusBorderPaneID );
0faf5a
1a99f9 ¤   SwitchTarget( mUserIDTable );
6e5aff ¤   AdjustButtons();
51efe6 }
a0af5a
d9108d ¤   PGPUInt32
f4cf0d CPGPRecipientGrafPortView::MoveSelectedUsers(
269948 ¤   PGPRecipientUserLocation destinationList)
80bb36 {
6b3146 ¤   PGPError¤   ¤   ¤   ¤   ¤   err = kPGPError_NoErr;
66ea41 ¤   PGPRecipientUser¤   ¤   ¤   **userList;
aeb576 ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   numMovedUsers;
b4d855 ¤   PGPUInt32¤  ¤   ¤   ¤   ¤   numExtraMovedUsers;
1e2a1f ¤   TableIndexT¤¤   ¤   ¤   ¤   numRows;
754fd7 ¤   TableIndexT¤¤   ¤   ¤   ¤   numColumns;
de2e92 ¤   CUserIDTable¤   ¤   ¤   ¤   *sourceTable;
a0167d ¤   CUserIDTable¤   ¤   ¤   ¤   *destTable;
06a38e ¤   PGPRecipientUserLocation¤   sourceList;
4c67c5 ¤
e38360 ¤   numMovedUsers ¤ ¤   = 0;
d863af ¤   numExtraMovedUsers¤ = 0;
ff67c5 ¤
fa595b ¤   if( destinationList == kPGPRecipientUserLocation_UserList )
66c7a1 ¤   {
c64812 ¤   ¤   sourceTable = mRecipientTable;
c0f888 ¤   ¤   destTable¤  = mUserIDTable;
7568ec ¤   ¤   sourceList¤ = kPGPRecipientUserLocation_RecipientList;
bc9371 ¤   }
a50e24 ¤   else
72c7a1 ¤   {
771659 ¤   ¤   sourceTable = mUserIDTable;
ccee48 ¤   ¤   destTable¤  = mRecipientTable;
d3cf56 ¤   ¤   sourceList¤ = kPGPRecipientUserLocation_UserList;
d49371 ¤   }
b567c5 ¤
7a84e3 ¤   sourceTable->GetTableSize( numRows, numColumns );
4067c5 ¤
90e129 ¤   /* Fast and dirty: Allocate list assuming all cells selected */
7a67c5 ¤
f53ba1 ¤   userList = (PGPRecipientUser **) PGPNewData(
9985a7 ¤   ¤   ¤   ¤   ¤   ¤   PGPGetContextMemoryMgr( mContext ),
cafeb6 ¤   ¤   ¤   ¤   ¤   ¤   numRows * sizeof( PGPRecipientUser * ), 0 );
7f5875 ¤   if( userList != NULL )
b7c7a1 ¤   {
6c82f2 ¤   ¤   PGPUInt32¤  numSelectedUsers;
7e08f1 ¤   ¤   STableCell¤ cell(0, 0);
161b52 ¤   ¤
d80a9a ¤   ¤   numSelectedUsers = 0;
5d1b52 ¤   ¤
68a051 ¤   ¤   while( sourceTable->GetNextSelectedCell( cell ) )
fd5b34 ¤   ¤   {
05aef6 ¤   ¤   ¤   sourceTable->GetCellUser( cell, &userList[numSelectedUsers] );
cf1dd0 ¤   ¤   ¤   numSelectedUsers++;
880fe4 ¤   ¤   }
401b52 ¤   ¤
--c5ec 000811007474012027f Page 3 of CPGPRecipientGrafPort.cp
3cf3b4 ¤   ¤   if( numSelectedUsers != 0 )
1b5b34 ¤   ¤   {
c9b83b ¤   ¤   ¤   PGPBoolean¤ movedARRs;
f687c7 ¤   ¤   ¤
f188a8 ¤   ¤   ¤   err = PGPMoveRecipients( &mRecipients, destinationList,
a7d542 ¤   ¤   ¤   ¤   ¤   ¤   numSelectedUsers, userList, &numMovedUsers,
7b7620 ¤   ¤   ¤   ¤   ¤   ¤   &movedARRs );
485d5d ¤   ¤   ¤   if( IsntPGPError( err ) && numMovedUsers != 0 )
59f776 ¤   ¤   ¤   {
6a7e4f ¤   ¤   ¤   ¤   sourceTable->GetStorageArray()->SetKeepSorted( FALSE );
cf8294 ¤   ¤   ¤   ¤   destTable->GetStorageArray()->SetKeepSorted( FALSE );
b7af5a
f93b35 ¤   ¤   ¤   ¤   /* Move items between tables */
972b85 ¤   ¤   ¤   ¤
94f1f9 ¤   ¤   ¤   ¤   cell.col = 1;
68bc5d ¤   ¤   ¤   ¤   for( cell.row = numRows; cell.row >= 1; cell.row-- )
db72c3 ¤   ¤   ¤   ¤   {
d30044 ¤   ¤   ¤   ¤   ¤   PGPRecipientUser¤   *curUser;
4194aa ¤   ¤   ¤   ¤   ¤   ¤
9cc1e8 ¤   ¤   ¤   ¤   ¤   sourceTable->GetCellUser( cell, &curUser );
d745e7 ¤   ¤   ¤   ¤   ¤   if( curUser->location != sourceList )
964859 ¤   ¤   ¤   ¤   ¤   {
d270c0 ¤   ¤   ¤   ¤   ¤   ¤   sourceTable->RemoveRows( 1, cell.row, FALSE );
0f1c89 ¤   ¤   ¤   ¤   ¤   }
1bae30 ¤   ¤   ¤   ¤   ¤
655af2 ¤   ¤   ¤   ¤   ¤   if( curUser->location == destinationList )
ae4859 ¤   ¤   ¤   ¤   ¤   {
5b0d3c ¤   ¤   ¤   ¤   ¤   ¤   destTable->InsertRows( 1, 30000, &curUser,
f521a1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( curUser ), FALSE );
e11c89 ¤   ¤   ¤   ¤   ¤   }
172613 ¤   ¤   ¤   ¤   }
b12b85 ¤   ¤   ¤   ¤
14e88a ¤   ¤   ¤   ¤   sourceTable->GetStorageArray()->SetKeepSorted( TRUE );
5de4c1 ¤   ¤   ¤   ¤   destTable->GetStorageArray()->SetKeepSorted( TRUE );
e82b85 ¤   ¤   ¤   ¤
e39bc9 ¤   ¤   ¤   ¤   sourceTable->Refresh();
35de4a ¤   ¤   ¤   ¤   destTable->Refresh();
f92b85 ¤   ¤   ¤   ¤
f46425 ¤   ¤   ¤   ¤   AdjustButtons();
1ea3a6 ¤   ¤   ¤   }
a60fe4 ¤   ¤   }
481b52 ¤   ¤
3cfbfc ¤   ¤   PGPFreeData( userList );
d59371 ¤   }
7a0e24 ¤   else
97c7a1 ¤   {
0cbce1 ¤   ¤   err = kPGPError_OutOfMemory;
9f9371 ¤   }
4567c5 ¤
b47f7d ¤   if( IsPGPError( err ) )
07c7a1 ¤   {
1c057e ¤   ¤   SysBeep( 1 );
f39371 ¤   }
c567c5 ¤
ea82eb ¤   return( numMovedUsers + numExtraMovedUsers );
e6efe6 }
54af5a
62108d ¤   PGPUInt32
1c5729 CPGPRecipientGrafPortView::SendSelectedToRecipients(void)
f5bb36 {
24be65 ¤   return( MoveSelectedUsers( kPGPRecipientUserLocation_RecipientList ) );
3befe6 }
3baf5a
b0af5a
62108d ¤   PGPUInt32
033817 CPGPRecipientGrafPortView::SendSelectedToUserIDs(void)
18bb36 {
bf8954 ¤   return( MoveSelectedUsers( kPGPRecipientUserLocation_UserList ) );
6cefe6 }
8aaf5a
0e6d52 ¤   void
8165a3 CPGPRecipientGrafPortView::ListenToMessage(MessageT inMessage, void *ioParam)
--d670 000eb319a134012027f Page 4 of CPGPRecipientGrafPort.cp
2cbb36 {
fa769e ¤   switch( inMessage )
d0c7a1 ¤   {
7ac070 ¤   ¤   case 'Send':
6b5b34 ¤   ¤   {
a200be ¤   ¤   ¤   TableIndexT¤numRows;
98c49f ¤   ¤   ¤   TableIndexT¤numColumns;
7987c7 ¤   ¤   ¤
2c8bfc ¤   ¤   ¤   // Send the selected cells from the table object in ioParam to
9ca7c6 ¤   ¤   ¤   // the other table.
3f87c7 ¤   ¤   ¤
d5a2c1 ¤   ¤   ¤   if( (CUserIDTable *) ioParam == mUserIDTable )
4ef776 ¤   ¤   ¤   {
e4f374 ¤   ¤   ¤   ¤   SendSelectedToRecipients();
b6a3a6 ¤   ¤   ¤   }
1d59f1 ¤   ¤   ¤   else if( (CUserIDTable *) ioParam == mRecipientTable )·
f7f776 ¤   ¤   ¤   {
813a9e ¤   ¤   ¤   ¤   SendSelectedToUserIDs();
b8a3a6 ¤   ¤   ¤   }
deda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
6531b4 ¤   ¤   ¤   mRecipientTable->GetTableSize( numRows, numColumns );
bf87c7 ¤   ¤   ¤
92cdcb ¤   ¤   ¤   break;
f90fe4 ¤   ¤   }
131b52 ¤   ¤
23d906 ¤   ¤   case 'Recv':
cd5b34 ¤   ¤   {
c900be ¤   ¤   ¤   TableIndexT¤numRows;
0bc49f ¤   ¤   ¤   TableIndexT¤numColumns;
da87c7 ¤   ¤   ¤
2cdb00 ¤   ¤   ¤   // Send the selected cells to the table object in ioParam from
50a7c6 ¤   ¤   ¤   // the other table.
5287c7 ¤   ¤   ¤
86ef6c ¤   ¤   ¤   if( (CUserIDTable *)ioParam == mUserIDTable )
70f776 ¤   ¤   ¤   {
733a9e ¤   ¤   ¤   ¤   SendSelectedToUserIDs();
7fa3a6 ¤   ¤   ¤   }
2e428f ¤   ¤   ¤   else if( (CUserIDTable *) ioParam == mRecipientTable )
b4f776 ¤   ¤   ¤   {
9ff374 ¤   ¤   ¤   ¤   SendSelectedToRecipients();
ffa3a6 ¤   ¤   ¤   }
0dda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
1831b4 ¤   ¤   ¤   mRecipientTable->GetTableSize( numRows, numColumns );
61af5a
cecdcb ¤   ¤   ¤   break;
470fe4 ¤   ¤   }
d41b52 ¤   ¤
d41813 ¤   ¤   case kUpdateFromServerButtonPaneID:
295b34 ¤   ¤   {
f7e46c ¤   ¤   ¤   PGPError¤   err;
f873ba ¤   ¤   ¤   PGPBoolean¤ haveNewKeys;
a287c7 ¤   ¤   ¤
251915 ¤   ¤   ¤   err = PGPUpdateMissingRecipients( NULL, &mRecipients,
698c09 ¤   ¤   ¤   ¤   ¤   ¤   &haveNewKeys );
de3938 ¤   ¤   ¤   if( IsntPGPError( err ) && haveNewKeys )
e3f776 ¤   ¤   ¤   {
4db7a1 ¤   ¤   ¤   ¤   err = BuildTables();
7fa3a6 ¤   ¤   ¤   }
5d87c7 ¤   ¤   ¤
1fdf73 ¤   ¤   ¤   AdjustButtons();
ea87c7 ¤   ¤   ¤
95cdcb ¤   ¤   ¤   break;
b20fe4 ¤   ¤   }
3caf5a
47f85e ¤   ¤   case msg_Options:
4b5a2e ¤   ¤   ¤   DoOptionsDialog();
64cdcb ¤   ¤   ¤   break;
92af5a
0e9ae3 ¤   ¤   default:
442445 ¤   ¤   ¤   CPGPUIGrafPortView::ListenToMessage( inMessage, ioParam );
12cdcb ¤   ¤   ¤   break;
eb9371 ¤   }
--49fa 000629e791d4012027f Page 5 of CPGPRecipientGrafPort.cp
7aefe6 }
46af5a
cf7e69 ¤   Boolean
5c2d52 CPGPRecipientGrafPortView::HandleKeyPress(const EventRecord& inKeyEvent)
cebb36 {
1eef30 ¤   Boolean¤¤   keyHandled ¤= TRUE;
c07906 ¤   Int16¤  ¤   theKey ¤¤   = inKeyEvent.message & charCodeMask;
8e67c5 ¤
5b4682 ¤   if( ( inKeyEvent.modifiers & cmdKey ) != 0 )
80c7a1 ¤   {
5a4cc9 ¤   ¤   switch( theKey )
5f5b34 ¤   ¤   {
178a37 ¤   ¤   ¤   case 'O':
910564 ¤   ¤   ¤   case 'o':
46f776 ¤   ¤   ¤   {
7ec8a5 ¤   ¤   ¤   ¤   if( mOptionsButton->IsEnabled() )
3e72c3 ¤   ¤   ¤   ¤   {
2e55d7 ¤   ¤   ¤   ¤   ¤   mOptionsButton->SimulateHotSpotClick( kControlButtonPart );
782613 ¤   ¤   ¤   ¤   }
b72b85 ¤   ¤   ¤   ¤
eff622 ¤   ¤   ¤   ¤   break;
81a3a6 ¤   ¤   ¤   }
8daf5a
5cdb68 ¤   ¤   ¤   default:
48563a ¤   ¤   ¤   ¤   keyHandled = CPGPUIGrafPortView::HandleKeyPress(
0da88c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inKeyEvent );
2ef622 ¤   ¤   ¤   ¤   break;
d50fe4 ¤   ¤   }
459371 ¤   }
680e24 ¤   else
bac7a1 ¤   {
cecf15 ¤   ¤   keyHandled = CPGPUIGrafPortView::HandleKeyPress( inKeyEvent );
019371 ¤   }
a467c5 ¤
20c022 ¤   return keyHandled;
4befe6 }
58af5a
606d52 ¤   void
6a4748 CPGPRecipientGrafPortView::AdjustButtons(void)
4dbb36 {
af7412 ¤   PGPBoolean¤ haveMissingRecipients;
13a5af ¤   STableCell¤ cell(0, 0);
4a67c5 ¤
646982 ¤   haveMissingRecipients = FALSE;
3f67c5 ¤
827896 ¤   while( mRecipientTable->GetNextCell( cell ) )
22c7a1 ¤   {
724a51 ¤   ¤   PGPRecipientUser¤   *curUser;
1b1b52 ¤   ¤
8fc777 ¤   ¤   mRecipientTable->GetCellUser( cell, &curUser );
061b52 ¤   ¤
3f1c09 ¤   ¤   if( curUser->kind == kPGPRecipientUserKind_MissingRecipient )
c75b34 ¤   ¤   {
cfc767 ¤   ¤   ¤   haveMissingRecipients = TRUE;
f9cdcb ¤   ¤   ¤   break;
e80fe4 ¤   ¤   }
a59ae0 ¤   ¤   else if( curUser->kind == kPGPRecipientUserKind_Group &&
5b2c7a ¤   ¤   ¤   ¤   ·curUser->groupInfo.numMissingKeys != 0 )
425b34 ¤   ¤   {
c6c767 ¤   ¤   ¤   haveMissingRecipients = TRUE;
67cdcb ¤   ¤   ¤   break;
300fe4 ¤   ¤   }
4c9371 ¤   }
1daf5a
3047e0 ¤   if( haveMissingRecipients && mUpdateFromServerButton->IsVisible() )
72c7a1 ¤   {
5b65d7 ¤   ¤   mUpdateFromServerButton->Enable();
759371 ¤   }
ee0e24 ¤   else
74c7a1 ¤   {
baef3f ¤   ¤   mUpdateFromServerButton->Disable();
629371 ¤   }
--33a3 000cbc8957f4012027f Page 6 of CPGPRecipientGrafPort.cp
7aefe6 }
46af5a
4967c5 ¤
b1c744 ¤   PGPError
b74525 CPGPRecipientGrafPortView::BuildTable(
c0c51c ¤   CUserIDTable ¤  ¤   ¤   ¤   *whichTable,
da75bf ¤   PGPRecipientUserLocation ¤  location)
5fbb36 {
4c7d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
ba479d ¤   Boolean¤¤   ¤   ¤   keepListSorted;
50576f ¤   PGPRecipientKey¤¤   *curKey;
8eb095 ¤   PGPRecipientUser¤   *curGroup;
6167c5 ¤
2c6993 ¤   keepListSorted = whichTable->GetStorageArray()->IsKeptSorted();
dc3795 ¤   whichTable->GetStorageArray()->SetKeepSorted( FALSE );
7267c5 ¤
d06b0b ¤   curKey = mRecipients.keys;
85ef78 ¤   while( IsntNull( curKey ) )
dcc7a1 ¤   {
164a51 ¤   ¤   PGPRecipientUser¤   *curUser;
6c1b52 ¤   ¤
13791a ¤   ¤   curUser = curKey->users;
3b7ebc ¤   ¤   while( IsntNull( curUser ) )
d35b34 ¤   ¤   {
10dee7 ¤   ¤   ¤   if( curUser->location == location )
08f776 ¤   ¤   ¤   {
6d9d3b ¤   ¤   ¤   ¤   whichTable->InsertRows( 1, 10000, &curUser,
ba6aea ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( curUser ), FALSE );
2ca3a6 ¤   ¤   ¤   }
0287c7 ¤   ¤   ¤
1c09b3 ¤   ¤   ¤   curUser = curUser->nextUser;
bb0fe4 ¤   ¤   }
a567c5 ¤
f3cf46 ¤   ¤   curKey = curKey->nextKey;
8d9371 ¤   }
df67c5 ¤
e194bf ¤   curGroup = mRecipients.groups;
1264b9 ¤   while( IsntNull( curGroup ) )
89c7a1 ¤   {
65fa2f ¤   ¤   pgpAssert( curGroup->kind == kPGPRecipientUserKind_Group );
be1b52 ¤   ¤
87f598 ¤   ¤   if( curGroup->location == location )
c05b34 ¤   ¤   {
003ae0 ¤   ¤   ¤   whichTable->InsertRows( 1, 10000, &curGroup, sizeof( curGroup ),
cf6173 ¤   ¤   ¤   ¤   ¤   ¤   ¤   FALSE );
b50fe4 ¤   ¤   }
bbaf5a
17908a ¤   ¤   curGroup = curGroup->nextUser;
649371 ¤   }
fa67c5 ¤
4b7f28 ¤   whichTable->GetStorageArray()->SetKeepSorted( keepListSorted );
8767c5 ¤
afdeb7 ¤   return( err );
74efe6 }
3daf5a
15c744 ¤   PGPError
c7f022 CPGPRecipientGrafPortView::BuildTables(void)
10bb36 {
da61e0 ¤   PGPError¤   err;
8d8fb5 ¤   TableIndexT¤numRows;
2ce23d ¤   TableIndexT¤numColumns;
2667c5 ¤
b9ae5e ¤   mUserIDTable->GetTableSize( numRows, numColumns );
52eb80 ¤   if( numRows != 0 )
5a2982 ¤   ¤   mUserIDTable->RemoveRows( numRows, 1, FALSE );
fcaf5a
4f6fad ¤   mRecipientTable->GetTableSize( numRows, numColumns );
edeb80 ¤   if( numRows != 0 )
08a32b ¤   ¤   mRecipientTable->RemoveRows( numRows, 1, FALSE );
9767c5 ¤
a44612 ¤   err = BuildTable( mUserIDTable, kPGPRecipientUserLocation_UserList );
cbb1f0 ¤   if( IsntPGPError( err ) )
--30b6 000293762a74012027f Page 7 of CPGPRecipientGrafPort.cp
f7c7a1 ¤   {
a071fe ¤   ¤   err = BuildTable( mRecipientTable,
93763d ¤   ¤   ¤   ¤   ¤   kPGPRecipientUserLocation_RecipientList );
2386f8 ¤   ¤   if( IsntPGPError( err ) )
775b34 ¤   ¤   {
3676bf ¤   ¤   ¤   PGPRecipientUser¤   *curUser;
2987c7 ¤   ¤   ¤
6a2d58 ¤   ¤   ¤   // Add missing users
0787c7 ¤   ¤   ¤
b6d196 ¤   ¤   ¤   curUser = mRecipients.missingRecipients;
f17b51 ¤   ¤   ¤   while( IsntNull( curUser ) )
84f776 ¤   ¤   ¤   {
75f308 ¤   ¤   ¤   ¤   pgpAssert( curUser->kind ==
e6240d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPRecipientUserKind_MissingRecipient );
4caf5a
6db081 ¤   ¤   ¤   ¤   if( curUser->location ==
c174e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPRecipientUserLocation_RecipientList )
a372c3 ¤   ¤   ¤   ¤   {
008a40 ¤   ¤   ¤   ¤   ¤   mRecipientTable->InsertRows( 1, 10000, &curUser,
c3e5bd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( curUser ), FALSE );
242613 ¤   ¤   ¤   ¤   }
002b85 ¤   ¤   ¤   ¤
e70f0b ¤   ¤   ¤   ¤   curUser = curUser->nextUser;
23a3a6 ¤   ¤   ¤   }
920fe4 ¤   ¤   }
5d9371 ¤   }
3d67c5 ¤
5d9279 ¤   mUserIDTable->Refresh();
dd4982 ¤   mRecipientTable->Refresh();
0b67c5 ¤
ccdeb7 ¤   return( err );
b7efe6 }
f8af5a
bcc744 ¤   PGPError
2fbb20 CPGPRecipientGrafPortView::SetOptions(
f0ca71 ¤   PGPContextRef ¤ ¤   ¤   ¤   context,
574108 ¤   CPGPRecipientDialogOptions ¤*options,
bcb1be ¤   PGPBoolean¤ ¤   ¤   ¤   ¤   *showDialog)
4fbb36 {
798e12 ¤   PGPError¤   err = kPGPError_NoErr;
1d67c5 ¤
1e2f2e ¤   *showDialog = options->mAlwaysDisplay;
6e67c5 ¤
a16f55 ¤   err = CPGPUIGrafPortView::SetOptions( context, options );
95b1f0 ¤   if( IsntPGPError( err ) )
38c7a1 ¤   {
b64f75 ¤   ¤   mOptions = options;
ad1b52 ¤   ¤
a8ed97 ¤   ¤   if( IsntNull( options->mPrompt ) )
165b34 ¤   ¤   {
6bf44d ¤   ¤   ¤   Str255¤ pPrompt;
8a87c7 ¤   ¤   ¤
2e6011 ¤   ¤   ¤   CToPString( options->mPrompt, pPrompt );
d1b571 ¤   ¤   ¤   SetDescriptor( pPrompt );
0c0fe4 ¤   ¤   }
3aaf5a
c55e28 ¤   ¤   // Hide the options button unless the client has asked for options
541b52 ¤   ¤
718302 ¤   ¤   if( IsntNull( options->mDialogOptions ) &&
48c81c ¤   ¤   ¤   pgpGetOptionListCount( options->mDialogOptions ) > 0 )
2b5b34 ¤   ¤   {
de8b20 ¤   ¤   ¤   mOptionsButton->AddListener( this );
1f0fe4 ¤   ¤   }
bf0e1d ¤   ¤   else
b65b34 ¤   ¤   {
a1a83c ¤   ¤   ¤   mOptionsButton->Disable();
0fe8e9 ¤   ¤   ¤   mOptionsButton->Hide();
4b0fe4 ¤   ¤   }
a9af5a
5db891 ¤   ¤   // Hide the "Update From Server" button if client requests it
c9c6ee ¤   ¤   if( IsntNull( options->mServerList ) )
295b34 ¤   ¤   {
--9376 0005d96b8004012027f Page 8 of CPGPRecipientGrafPort.cp
39f3bf ¤   ¤   ¤   mUpdateFromServerButton->AddListener( this );
1a0fe4 ¤   ¤   }
250e1d ¤   ¤   else
ea5b34 ¤   ¤   {
9e0675 ¤   ¤   ¤   mUpdateFromServerButton->Hide();
030fe4 ¤   ¤   }
f21b52 ¤   ¤
607955 ¤   ¤   // If the options button is hidden and the update button is not,
bb85fe ¤   ¤   // move the update button to the options button location.
ee1b52 ¤   ¤
17755f ¤   ¤   if( mUpdateFromServerButton->IsVisible() &&
1f3539 ¤   ¤   ¤   ! mOptionsButton->IsVisible() )
935b34 ¤   ¤   {
e00753 ¤   ¤   ¤   SPoint32¤   optionsButtonLoc;
0fc8f8 ¤   ¤   ¤   SPoint32¤   updateButtonLoc;
8787c7 ¤   ¤   ¤
3c33be ¤   ¤   ¤   mOptionsButton->GetFrameLocation( optionsButtonLoc );
99cfe9 ¤   ¤   ¤   mUpdateFromServerButton->GetFrameLocation( updateButtonLoc );
3f1b52 ¤   ¤
81fa6f ¤   ¤   ¤   mUpdateFromServerButton->MoveBy(
627e06 ¤   ¤   ¤   ¤   ¤   ¤   optionsButtonLoc.h - updateButtonLoc.h,
617519 ¤   ¤   ¤   ¤   ¤   ¤   optionsButtonLoc.v - updateButtonLoc.v,
f2a699 ¤   ¤   ¤   ¤   ¤   ¤   TRUE );
3f0fe4 ¤   ¤   }
0c1b52 ¤   ¤
6aaf06 ¤   ¤   mRecipientTable->SetPreferences( mOptions->mDisplayMarginalValidity,
c08190 ¤   ¤   ¤   ¤   ¤   mOptions->mIgnoreMarginalValidity );
b30cb5 ¤   ¤   mUserIDTable->SetPreferences( mOptions->mDisplayMarginalValidity,
3e8190 ¤   ¤   ¤   ¤   ¤   mOptions->mIgnoreMarginalValidity );
b0af5a
db86f8 ¤   ¤   if( IsntPGPError( err ) )
0e5b34 ¤   ¤   {
c304ee ¤   ¤   ¤   PGPBoolean¤ haveDefaultARRs;
b6af5a
1a6789 ¤   ¤   ¤   err = PGPBuildRecipientsList( NULL, context, options->mClientKeySet,
ebfbb7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   options->mGroupSet, options->mNumDefaultRecipients,
353f19 ¤   ¤   ¤   ¤   ¤   ¤   ¤   options->mDefaultRecipients, options->mServerCount,
79225f ¤   ¤   ¤   ¤   ¤   ¤   ¤   options->mServerList, options->mTLSContext,
1d6642 ¤   ¤   ¤   ¤   ¤   ¤   ¤   options->mSearchBeforeDisplay,
d60918 ¤   ¤   ¤   ¤   ¤   ¤   ¤   options->mEnforcement, EventHandler, 0,
b8874b ¤   ¤   ¤   ¤   ¤   ¤   ¤   &mRecipients, &haveDefaultARRs );
3d698b ¤   ¤   ¤   if( IsntPGPError( err ) )
74f776 ¤   ¤   ¤   {
b9b7a1 ¤   ¤   ¤   ¤   err = BuildTables();
9fa3a6 ¤   ¤   ¤   }
ac87c7 ¤   ¤   ¤
0c1570 ¤   ¤   ¤   if( haveDefaultARRs &&
9ce1ba ¤   ¤   ¤   ¤   mOptions->mAlwaysDisplayWithARRs )
08f776 ¤   ¤   ¤   {
6917ed ¤   ¤   ¤   ¤   *showDialog = TRUE;
f0a3a6 ¤   ¤   ¤   }
ee87c7 ¤   ¤   ¤
862b9a ¤   ¤   ¤   if( IsntPGPError( err ) && *showDialog == FALSE )
1ef776 ¤   ¤   ¤   {
fd200f ¤   ¤   ¤   ¤   STableCell¤ cell(0,0);
9b4421 ¤   ¤   ¤   ¤   PGPBoolean¤ haveRecipients = FALSE;
86d469 ¤   ¤   ¤   ¤   PGPInt32¤   minimumValidity;
002b85 ¤   ¤   ¤   ¤
373d3d ¤   ¤   ¤   ¤   if( options->mIgnoreMarginalValidity )
0972c3 ¤   ¤   ¤   ¤   {
846abe ¤   ¤   ¤   ¤   ¤   minimumValidity = (PGPInt32) kPGPValidity_Complete;
8d2613 ¤   ¤   ¤   ¤   }
b9fa07 ¤   ¤   ¤   ¤   else
4d72c3 ¤   ¤   ¤   ¤   {
c1ca08 ¤   ¤   ¤   ¤   ¤   minimumValidity = (PGPInt32) kPGPValidity_Marginal;
992613 ¤   ¤   ¤   ¤   }
a32b85 ¤   ¤   ¤   ¤
1e980e ¤   ¤   ¤   ¤   /*
89dfdc ¤   ¤   ¤   ¤   ** Check to see if the dialog needs to be displayed.
97510e ¤   ¤   ¤   ¤   ** Show the dialog there are missing, ambiguous, invalid,
7b727f ¤   ¤   ¤   ¤   ** or no default recipients
5ddf0b ¤   ¤   ¤   ¤   */
--abcd 000bdc018944012027f Page 9 of CPGPRecipientGrafPort.cp
e0af5a
5637e0 ¤   ¤   ¤   ¤   while( mRecipientTable->GetNextCell( cell ) )
d872c3 ¤   ¤   ¤   ¤   {
c88f86 ¤   ¤   ¤   ¤   ¤   PGPRecipientUser¤   *user;
fbae30 ¤   ¤   ¤   ¤   ¤
9913f4 ¤   ¤   ¤   ¤   ¤   haveRecipients = TRUE;
b1ae30 ¤   ¤   ¤   ¤   ¤
747138 ¤   ¤   ¤   ¤   ¤   mRecipientTable->GetCellUser( cell, &user );
ddae30 ¤   ¤   ¤   ¤   ¤
712472 ¤   ¤   ¤   ¤   ¤   if( user->multipleMatch ||
53b5b4 ¤   ¤   ¤   ¤   ¤   ¤   user->kind == kPGPRecipientUserKind_MissingRecipient ||
23157e ¤   ¤   ¤   ¤   ¤   ¤   user->validity < minimumValidity )
484859 ¤   ¤   ¤   ¤   ¤   {
135ade ¤   ¤   ¤   ¤   ¤   ¤   *showDialog = TRUE;
7700eb ¤   ¤   ¤   ¤   ¤   ¤   break;
a11c89 ¤   ¤   ¤   ¤   ¤   }
5e2613 ¤   ¤   ¤   ¤   }
812b85 ¤   ¤   ¤   ¤
f83259 ¤   ¤   ¤   ¤   if( ! haveRecipients )
301c5d ¤   ¤   ¤   ¤   ¤   *showDialog = TRUE;·
1fa3a6 ¤   ¤   ¤   }
8b0fe4 ¤   ¤   }
6d1b52 ¤   ¤
ffeb2e ¤   ¤   AdjustButtons();
a59371 ¤   }
361b52 ¤   ¤
23deb7 ¤   return( err );
54efe6 }
8baf5a
646d52 ¤   void
8af54d CPGPRecipientGrafPortView::DoOptionsDialog(void)
5ebb36 {
3b3a4c ¤   pgpAssertAddrValid( mOptions->mDialogOptions, VoidAlign );
cc67c5 ¤
5cd8af ¤   /*
54ac2b ¤   ** mOptions->dialogOptions is probably a volatile PGPOptionList i.e.
b0d003 ¤   ** passing it to PGPOptionsDialog() will dispose of it. Make a copy
0b5a62 ¤   ** here for our purposes.
eb9faa ¤   */
4eaf5a
779a3e ¤   (void) PGPOptionsDialog( mContext,
9e50aa ¤   ¤   ¤   ¤   ¤   pgpCopyOptionList( mOptions->mDialogOptions ),
c21bbb ¤   ¤   ¤   ¤   ¤   PGPOLastOption( mContext ) );
9eefe6 }
47af5a
a99cb9 ¤   MessageT
8592ef CPGPRecipientGrafPortView::HandleMessage(MessageT theMessage)
74bb36 {
8e8337 ¤   if( theMessage == msg_OK )
68c7a1 ¤   {
42a948 ¤   ¤   mDialogError = PGPGetRecipientKeys( &mRecipients,
b0d3b0 ¤   ¤   ¤   ¤   ¤   mOptions->mRecipientKeysPtr, mOptions->mNewKeys,
1d48f6 ¤   ¤   ¤   ¤   ¤   mOptions->mRecipientCount, mOptions->mRecipientList );
ce9371 ¤   }
d567c5 ¤
a6cfbc ¤   return( theMessage );
acefe6 }
7baf5a
87c744 ¤   PGPError
aba72e CPGPRecipientGrafPortView::EventHandler(
25dad6 ¤   PGPRecipientsList ¤ *recipients,
f900f8 ¤   PGPRecipientEvent ¤ *event,
543a96 ¤   PGPUserValue ¤  ¤   userValue)
9ebb36 {
05764c ¤   PGPError¤   err ¤   ¤   = kPGPError_NoErr;
666342 ¤   short¤  ¤   strIndex ¤  = 0;
2d667d ¤   const char¤ *userName¤  = NULL;
9c67c5 ¤
9e7507 ¤   (void) recipients;
6c4d52 ¤   (void) userValue;
ac67c5 ¤
bda505 ¤   switch( event->type )
--181d 00107ea94284012027f Page 10 of CPGPRecipientGrafPort.cp
f7c7a1 ¤   {
d7bdb7 ¤   ¤   case kPGPRecipientEvent_MoveUserFailedEvent:
c55b34 ¤   ¤   {
08b433 ¤   ¤   ¤   if( event->user->kind == kPGPRecipientUserKind_Key )
d7f776 ¤   ¤   ¤   {
263804 ¤   ¤   ¤   ¤   strIndex = kKeyADKNotFoundErrorStrIndex;
fea3a6 ¤   ¤   ¤   }
80bb8c ¤   ¤   ¤   else
08f776 ¤   ¤   ¤   {
7fbe76 ¤   ¤   ¤   ¤   strIndex = kGroupADKNotFoundErrorStrIndex;
35a3a6 ¤   ¤   ¤   }
dc1b52 ¤   ¤
3c2d0c ¤   ¤   ¤   userName = PGPGetRecipientUserNamePtr( event->user );
43cdcb ¤   ¤   ¤   break;
a30fe4 ¤   ¤   }
701b52 ¤   ¤
32bdc9 ¤   ¤   case kPGPRecipientEvent_MoveUserWarningEvent:
015b34 ¤   ¤   {
64b433 ¤   ¤   ¤   if( event->user->kind == kPGPRecipientUserKind_Key )
b3f776 ¤   ¤   ¤   {
b70003 ¤   ¤   ¤   ¤   strIndex = kKeyADKNotFoundWarningStrIndex;
a9a3a6 ¤   ¤   ¤   }
2cbb8c ¤   ¤   ¤   else
7cf776 ¤   ¤   ¤   {
532249 ¤   ¤   ¤   ¤   strIndex = kGroupADKNotFoundWarningStrIndex;
f3a3a6 ¤   ¤   ¤   }
e91b52 ¤   ¤
cf2d0c ¤   ¤   ¤   userName = PGPGetRecipientUserNamePtr( event->user );
98cdcb ¤   ¤   ¤   break;
ff0fe4 ¤   ¤   }
821b52 ¤   ¤
827a80 ¤   ¤   case kPGPRecipientEvent_MovedARRWarningEvent:
445b34 ¤   ¤   {
709852 ¤   ¤   ¤   strIndex = kRemoveADKViolatesPolicyStrIndex;
bd2d0c ¤   ¤   ¤   userName = PGPGetRecipientUserNamePtr( event->user );
b687c7 ¤   ¤   ¤
05cdcb ¤   ¤   ¤   break;
dd0fe4 ¤   ¤   }
319371 ¤   }
5767c5 ¤
5342e8 ¤   if( strIndex != 0 )
aec7a1 ¤   {
a69b21 ¤   ¤   Str255¤ str;
f41b52 ¤   ¤
4df2c6 ¤   ¤   CToPString( userName, str );
bf057e ¤   ¤   SysBeep( 1 );
7e07d1 ¤   ¤   PGPUIWarningAlert( kPGPUIGenericOKAlert, kPGPLibDialogsStringListResID,
825440 ¤   ¤   ¤   ¤   ¤   strIndex, str );
fe9371 ¤   }
0667c5 ¤
a7deb7 ¤   return( err );
c1efe6 }
a5af5a
be6d52 ¤   void
3ae560 CPGPRecipientGrafPortView::SetDescriptor(ConstStringPtr prompt)
e7bb36 {
a92905 ¤   LStaticText¤*captionObj;
e367c5 ¤
8e2568 ¤   pgpAssertAddrValid( prompt, char );
6daf5a
b72e80 ¤   captionObj = (LStaticText *) FindPaneByID( kPromptTextPaneID );
54301f ¤   pgpAssertAddrValid( captionObj, VoidAlign );
5b67c5 ¤
5861cc ¤   captionObj->SetDescriptor( prompt );
07efe6 }
--ae55 000ca0007d340120280 Page 1 of CPGPRecipientGrafPort.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
a0d6d2 ¤   $Id: CPGPRecipientGrafPort.h,v 1.11.12.1 1998/11/12 03:20:44 heller Exp $
e4f7f7 ____________________________________________________________________________*/
efaf5a
857b7d #pragma once
2aaf5a
99fd99 #include <UTables.h>
58af5a
0261a9 #include "CPGPUIGrafPortView.h"
7ee684 #include "pgpUserInterface.h"
e8a076 #include "pgpKeys.h"
09c2ae #include "pgpGroups.h"
57a45e #include "pgpRecipientDialogCommon.h"
b4af5a
0fb3fc class CUserIDTable;
962cff class CPGPRecipientDialogOptions;
5aaf5a
771c37 class CPGPRecipientGrafPortView¤:¤  public CPGPUIGrafPortView
01bb36 {
9c5ed4 public:
9baf5a
7c2f4b ¤   enum
dfc7a1 ¤   {
9cc625 ¤   ¤   class_ID = 'CPgp',
131b52 ¤   ¤
214447 ¤   ¤   kUserIDFocusBorderPaneID¤   ¤   = 1,
dc6bcb ¤   ¤   kUserIDScrollerPaneID¤  ¤   ¤   = 3,
33b544 ¤   ¤   kUserIDTablePaneID¤ ¤   ¤   ¤   = 4,
b8af5a
901fa9 ¤   ¤   kRecipientsFocusBorderPaneID¤   = 5,
4fbaac ¤   ¤   kRecipientScrollerPaneID¤   ¤   = 7,
97e0a3 ¤   ¤   kRecipientTablePaneID¤  ¤   ¤   = 8,
45af5a
0e7455 ¤   ¤   kPromptTextPaneID¤  ¤   ¤   = 15,
9999c7 ¤   ¤   kUpdateFromServerButtonPaneID¤  = 16,
8f1b52 ¤   ¤
104ab6 ¤   ¤   kOptionsButtonPaneID ¤  ¤   ¤   = 'bOpt',
eb1b52 ¤   ¤
c0e049 ¤   ¤   msg_Options¤¤   ¤   ¤   ¤   ¤   = kOptionsButtonPaneID
c462bd ¤   };
7eaf5a
f779db ¤   ¤   ¤   ¤   ¤   ¤   CPGPRecipientGrafPortView(LStream *inStream);
71b437 ¤   virtual¤¤   ¤   ¤   ~CPGPRecipientGrafPortView();
e4af5a
ab9160 ¤   PGPError¤   ¤   ¤   SetOptions(PGPContextRef context,
1006ca ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPRecipientDialogOptions *options,
798580 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPBoolean *showDialog);
c567c5 ¤
17febc ¤   virtual void¤   ¤   FinishCreateSelf(void);
22b2ee ¤   virtual Boolean¤¤   HandleKeyPress( const EventRecord&¤ inKeyEvent);
312bf8 ¤   virtual¤MessageT¤   HandleMessage(MessageT theMessage);
79e629 ¤   virtual void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
67af5a
23a2d3 protected:
62af5a
682ebf ¤   virtual void¤   ¤   SetDescriptor(ConstStringPtr prompt);
6e67c5 ¤
400fb9 private:
b8af5a
7c8403 ¤   const CPGPRecipientDialogOptions¤   *mOptions;
7194f9 ¤   PGPRecipientsList¤  ¤   ¤   ¤   ¤   mRecipients;
9b67c5 ¤
dd5f96 ¤   LPushButton¤¤   ¤   ¤   *mUpdateFromServerButton;
3e8ac8 ¤   LPushButton¤¤   ¤   ¤   *mOptionsButton;
5d67c5 ¤
965e56 ¤   CUserIDTable¤   ¤   ¤   *mRecipientTable;
90ba57 ¤   CUserIDTable¤   ¤   ¤   *mUserIDTable;
2667c5 ¤
ca104c ¤   PGPError¤   ¤   ¤   ¤   BuildTable(CUserIDTable *whichTable,
--9ee5 00187ad208840120280 Page 2 of CPGPRecipientGrafPort.h
64a1b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPRecipientUserLocation location);
a9735f ¤   PGPError¤   ¤   ¤   ¤   BuildTables(void);
6218d2 ¤   void¤   ¤   ¤   ¤   ¤   DoOptionsDialog(void);
8c67c5 ¤
8117eb ¤   void¤   ¤   ¤   ¤   ¤   AdjustButtons(void);
d7f13d ¤   PGPUInt32¤  ¤   ¤   ¤   MoveSelectedUsers(
11a345 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPRecipientUserLocation destinationList);
6767c5 ¤
4f608d ¤   PGPUInt32¤  ¤   ¤   ¤   SendSelectedToRecipients(void);
f1c9b9 ¤   PGPUInt32¤  ¤   ¤   ¤   SendSelectedToUserIDs(void);
8f67c5 ¤
0231ca ¤   static PGPError¤¤   ¤   EventHandler(PGPRecipientsList *recipients,
018bfb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPRecipientEvent *event,
d8ea20 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue userValue);
a582f7 };
87af5a
--2d8b 0005e94c5a840120281 Page 1 of CPGPRecipientTable.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
a70d08 ¤   $Id: CPGPRecipientTable.cp,v 1.4.10.1 1998/11/12 03:20:45 heller Exp $
80f7f7 ____________________________________________________________________________*/
55af5a
df15dd #include <LComparator.h>
997b38 #include <LTableArrayStorage.h>
d57c52 #include <LTableMonoGeometry.h>
68e8ae #include <UDrawingUtils.h>
7b8f92 #include <UGAColorRamp.h>
b5af5a
1bb86a #include "MacQuickdraw.h"
0785c2 #include "MacStrings.h"
1fa076 #include "pgpKeys.h"
910d08 #include "pgpMem.h"
d9af5a
ecebab #include "CPGPRecipientTable.h"
67af5a
d15c91 const ResID kRSAUserIDIconResID ¤   = 3002;
d901c8 const ResID kDSSDHUserIDIconResID ¤ = 3020;
503bd5 const ResID kUnknownUserIDIconResID = 4752;
cfaf5a
8d29eb const short kUserIDLeftMargin¤  ¤   = 3;
8bb3c1 const short kUserIDRightMargin¤ ¤   = 3;
f5af5a
2fcd25 const short¤kIconColumnWidth¤   ¤   = 16;
354f28 const short¤kIconLeftMargin¤¤   ¤   = 3;
7d7aae const short¤kIconRightMargin¤   ¤   = 3;
84af5a
db5bd4 class CRecipientComparator : public LComparator
afbb36 {
ccfaea ¤   virtual¤¤   ¤   ~CRecipientComparator(void);
3ddf25 ¤   virtual Int32¤  Compare(const void *inItemOne, const void *inItemTwo,
34b9bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Uint32 inSizeOne, Uint32 inSizeTwo) const;
3882f7 };
71af5a
e256b0 CRecipientComparator::~CRecipientComparator(void)
4dbb36 {
98efe6 }
f5af5a
6d1017 ¤   Int32
acfe95 CRecipientComparator::Compare(
72a61a ¤   const void*¤¤   inItemOne,
2d1c0e ¤   const void*¤¤   inItemTwo,
f1d900 ¤   Uint32¤ ¤   ¤   inSizeOne,
add3b1 ¤   Uint32¤ ¤   ¤   inSizeTwo) const
87bb36 {
41967a ¤   Int32¤  ¤   ¤   ¤   ¤   ¤   result;
c0767b ¤   const RecipientTableItem¤   *tableItemOne;
96cc6f ¤   const RecipientTableItem¤   *tableItemTwo;
7e67c5 ¤
29c296 ¤   tableItemOne = (RecipientTableItem *) inItemOne;
f95830 ¤   tableItemTwo = (RecipientTableItem *) inItemTwo;
a3af5a
bb279b ¤   pgpAssertAddrValid( tableItemOne, RecipientTableItem );
5f56a0 ¤   pgpAssertAddrValid( tableItemTwo, RecipientTableItem );
3867c5 ¤
345c98 #if PGP_DEBUG
b538a8 ¤   pgpAssert( inSizeOne == sizeof(RecipientTableItem) );
77f83c ¤   pgpAssert( inSizeTwo == sizeof(RecipientTableItem) );
17db21 #else
477e56 ¤   #pragma unused( inSizeOne, inSizeTwo )
357454 #endif
0367c5 ¤
9b4fe2 ¤   result = tableItemOne->sortGrouping - tableItemTwo->sortGrouping;
dc901a ¤   if( result == 0 )
c7c7a1 ¤   {
a732e1 ¤   ¤   result = PGPCompareUserIDStrings( tableItemOne->description,
2f0b2e ¤   ¤   ¤   ¤   ¤   tableItemTwo->description );
5e9371 ¤   }
--44f2 0008dcb4cbb40120281 Page 2 of CPGPRecipientTable.cp
2a67c5 ¤
554c6e ¤   return( result );
7eefe6 }
59af5a
f36b8a CPGPRecipientTable::CPGPRecipientTable(LStream¤ *inStream)
95da03 ¤   ¤   : LTableView( inStream )
3cbb36 {
c3302b ¤   mTableGeometry¤ = new LTableMonoGeometry(this, mFrameSize.width, 18);
bdb31e ¤   mTableSelector¤ = NULL;
4f67c5 ¤
c3e8e4 ¤   // Note: We own this array and need to dispose of it ourselves.
65c4a1 ¤   mStorageArray ¤ = new LArray( sizeof(RecipientTableItem),
d67ed0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   new CRecipientComparator, TRUE );
384b28 ¤   mTableStorage¤  = new LTableArrayStorage(this, mStorageArray);
0befe6 }
5baf5a
648e5b CPGPRecipientTable::~CPGPRecipientTable()
07bb36 {
73bbd4 ¤   delete mStorageArray;
3cefe6 }
7daf5a
df6d52 ¤   void
d3ab97 CPGPRecipientTable::PrepareToDraw(void)
b7bb36 {
e9739b ¤   RGBColor¤   tempColor;
5e67c5 ¤
06b1a6 ¤   tempColor = UGAColorRamp::GetBlackColor();
7075f0 ¤   RGBForeColor( &tempColor );
1daf5a
4fd7fd ¤   tempColor = UGAColorRamp::GetColor( colorRamp_Gray1 );
9ca506 ¤   RGBBackColor( &tempColor );
0befe6 }
35af5a
876d52 ¤   void
2c8537 CPGPRecipientTable::GetCellColumnRects(
55aca1 ¤   const Rect¤ *cellRect,
cf7ba7 ¤   Rect¤   ¤   *iconColumnRect,
d648b3 ¤   Rect¤   ¤   *userIDColumnRect)
e5bb36 {
221db6 ¤   // Calculate all of the column rectangles
f867c5 ¤
9dcecc ¤   *iconColumnRect ¤   ¤   = *cellRect;
70e1f7 ¤   iconColumnRect->left ¤  = cellRect->left + kIconLeftMargin;
01c410 ¤   iconColumnRect->right¤  = iconColumnRect->left + kIconColumnWidth;
dcaf5a
6b67c5 ¤
bb0534 ¤   *userIDColumnRect¤  ¤   = *cellRect;
d0c5bb ¤   userIDColumnRect->left ¤= iconColumnRect->right + kIconRightMargin;
8defe6 }
1caf5a
8d6d52 ¤   void
f7079c CPGPRecipientTable::DrawCellContents(
bc1bb3 ¤   const STableCell¤   &inCell,
ccc050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
59bb36 {
fadd82 ¤   Rect¤   ¤   ¤   ¤   iconRect;
32762f ¤   Rect¤   ¤   ¤   ¤   userIDRect;
c3747d ¤   Rect¤   ¤   ¤   ¤   userIDColumnRect;
2d9df0 ¤   RecipientTableItem¤ tableItem;
ef3661 ¤   Str255¤ ¤   ¤   ¤   str;
3b223a ¤   IconTransformType¤  iconTransform;
1ad97b ¤   short¤  ¤   ¤   ¤   textMode;
599f09 ¤   short¤  ¤   ¤   ¤   textHeight;
796f1b ¤   PGPUInt16¤  ¤   ¤   maxUserIDWidth;
3bd2c0 ¤   RGBColor¤   ¤   ¤   tempColor;
77f14f ¤   short¤  ¤   ¤   ¤   iconID;
b32a48 ¤   Uint32¤ ¤   ¤   ¤   dataSize;
a167c5 ¤
0e4566 ¤   dataSize = sizeof( tableItem );
15ac8e ¤   GetCellData( inCell, &tableItem, dataSize );
4d575b ¤   PrepareToDraw();
8d67c5 ¤
--5ba7 0009ee8711c40120281 Page 3 of CPGPRecipientTable.cp
3d7442 ¤   textHeight = 12;
9d67c5 ¤
09db5f ¤   GetCellColumnRects( &inLocalRect, &iconRect, &userIDColumnRect );
e91b52 ¤   ¤
bda696 ¤   // Adjust column rectangles to fit enclosed content.
8d67c5 ¤
edebea ¤   userIDRect¤ ¤   ¤   = userIDColumnRect;
ea3619 ¤   userIDRect.left¤¤   = userIDRect.left + kUserIDLeftMargin;
5dafd4 ¤   userIDRect.right¤   = userIDRect.right - kUserIDRightMargin;
ab89a5 ¤   userIDRect.bottom ¤ = userIDRect.top + textHeight;
5567c5 ¤
52937f ¤   AlignRect( &inLocalRect, &userIDRect, kAlignAtVerticalCenter );
39af5a
259bb1 ¤   if( IsEnabled() )
8bc7a1 ¤   {
5079e5 ¤   ¤   textMode ¤  ¤   = 0;
7f2b9d ¤   ¤   iconTransform¤  = ttNone;
2a9371 ¤   }
d90e24 ¤   else
42c7a1 ¤   {
7c4bad ¤   ¤   textMode¤   ¤   = grayishTextOr;
24ccc3 ¤   ¤   iconTransform ¤ = ttDisabled;
e89371 ¤   }
5667c5 ¤
8cca76 ¤   if( tableItem.itemKind == kTableItemKindMissingKey )
1bc7a1 ¤   {
324bad ¤   ¤   textMode¤   ¤   = grayishTextOr;
aec780 ¤   ¤   iconTransform¤  = ttDisabled;
c89371 ¤   }
e967c5 ¤
bbd2f7 ¤   // Draw Icon
fcaf5a
7ecfb9 ¤   if( tableItem.itemKind == kTableItemKindKey )
13c7a1 ¤   {
54b88a ¤   ¤   if( tableItem.algorithm == kPGPPublicKeyAlgorithm_RSA )
095b34 ¤   ¤   {
58875e ¤   ¤   ¤   iconID = kRSAUserIDIconResID;
c60fe4 ¤   ¤   }
9d0e1d ¤   ¤   else
585b34 ¤   ¤   {
70a9d1 ¤   ¤   ¤   iconID = kDSSDHUserIDIconResID;
d40fe4 ¤   ¤   }
499371 ¤   }
2c4dae ¤   else if( tableItem.itemKind == kTableItemKindMissingKey )
57c7a1 ¤   {
e9e968 ¤   ¤   iconID = kUnknownUserIDIconResID;
b49371 ¤   }
6f0e24 ¤   else
c7c7a1 ¤   {
de4989 ¤   ¤   pgpDebugMsg( "DrawCellContents: Unknown item status" );
079371 ¤   }
8baf5a
31d391 ¤   iconRect.bottom = iconRect.top + 16;
90cf79 ¤   AlignRect( &inLocalRect, &iconRect, kAlignAtVerticalCenter );
a1af5a
31430e ¤   PlotIconID( &iconRect, atNone, iconTransform, iconID );
5314de ¤   // Draw User ID
f867c5 ¤
baca31 ¤   tempColor = UGAColorRamp::GetColor( colorRamp_Gray2 );
f5a506 ¤   RGBBackColor( &tempColor );
4167c5 ¤
384dc1 ¤   EraseRect( &userIDColumnRect );
3867c5 ¤
f72dbd ¤   TextSize(9);
17c47c ¤   TextFont(1);
2e1d8f ¤   TextMode( textMode );
66af5a
19fe63 ¤   MoveTo( userIDRect.left, userIDRect.bottom - 2 );
be3747 ¤   CToPString( tableItem.description, str );
9067c5 ¤
f1fcc7 ¤   maxUserIDWidth = userIDRect.right - userIDRect.left;
9eedc0 ¤   if( StringWidth( str ) > maxUserIDWidth )
--931f 000f9a1cc8240120281 Page 4 of CPGPRecipientTable.cp
f7c7a1 ¤   {
d62791 ¤   ¤   TextFace( condense );
d71b52 ¤   ¤
62a2fe ¤   ¤   if( StringWidth( str ) > maxUserIDWidth )
dd5b34 ¤   ¤   {
265279 ¤   ¤   ¤   // will not fit condensed. Resort to the default face and
b7908d ¤   ¤   ¤   // truncate in the middle
b3e7ae ¤   ¤   ¤   TextFace( 0 );
a049b0 ¤   ¤   ¤   TruncString( maxUserIDWidth, str, smTruncMiddle );
400fe4 ¤   ¤   }
f99371 ¤   }
d367c5 ¤
cdef37 ¤   DrawString( str );
a2af5a
583ea6 ¤   TextFace( 0 );
a167c5 ¤
edd7fd ¤   tempColor = UGAColorRamp::GetColor( colorRamp_Gray1 );
b5a506 ¤   RGBBackColor( &tempColor );
cf67c5 ¤
c467c5 ¤
ee53d8 ¤   TextMode( srcOr );
a567c5 ¤
976f2d ¤   ForeColor( whiteColor );
2f2672 ¤   MoveTo( inLocalRect.left, inLocalRect.bottom - 1 );
1d2da6 ¤   LineTo( inLocalRect.right, inLocalRect.bottom - 1 );
7978a9 ¤   ForeColor( blackColor );
2aefe6 }
20af5a
2e6d52 ¤   void
7bd44f CPGPRecipientTable::DrawCell(
491bb3 ¤   const STableCell¤   &inCell,
fac050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
a9bb36 {
8e78bf ¤   StDeviceLoop ¤  devLoop( inLocalRect );¤¤
876385 ¤   SInt16¤ ¤   ¤   depth;
c7af5a
31b111 ¤   while( devLoop.NextDepth( depth ) )
c2c7a1 ¤   {
76e9d6 ¤   ¤   DrawCellContents( inCell, inLocalRect );
fc9371 ¤   }
feefe6 }
fcaf5a
b66d52 ¤   void
d17541 CPGPRecipientTable::DrawSelf()
04bb36 {
026b2a ¤   Rect ¤  ¤   frame;
59739b ¤   RGBColor¤   tempColor;
d667c5 ¤
ccd7fd ¤   tempColor = UGAColorRamp::GetColor( colorRamp_Gray1 );
7e75f0 ¤   RGBForeColor( &tempColor );
7c67c5 ¤
8ca622 ¤   tempColor = UGAColorRamp::GetWhiteColor();
c6a506 ¤   RGBBackColor( &tempColor );
9367c5 ¤
0f67b9 ¤   CalcLocalFrameRect( frame );
ecc7a1 ¤   {
e344fe ¤   ¤   StDeviceLoop¤   devLoop( frame );¤  ¤
2377ad ¤   ¤   SInt16¤ ¤   ¤   depth;
39af5a
f93977 ¤   ¤   while( devLoop.NextDepth( depth ) )
d65b34 ¤   ¤   {
8b214b ¤   ¤   ¤   if( depth > 1 )
02e594 ¤   ¤   ¤   ¤   PaintRect( &frame );
a3bb8c ¤   ¤   ¤   else
633d87 ¤   ¤   ¤   ¤   EraseRect( &frame );
1a0fe4 ¤   ¤   }
199371 ¤   }
0067c5 ¤
eede04 ¤   LTableView::DrawSelf();
81efe6 }
23af5a
f96d52 ¤   void
--2ff0 000df613c5240120281 Page 5 of CPGPRecipientTable.cp
a2fa8e CPGPRecipientTable::AddTableItem(
6515d3 ¤   RecipientTableItem ¤*inTableItem,
24847d ¤   Boolean¤¤   ¤   ¤   inRefresh)
32bb36 {
a9021e ¤   pgpAssertAddrValid( inTableItem, RecipientTableItem );
91af5a
111f14 ¤   InsertRows( 1, 100000, inTableItem, sizeof( *inTableItem ), inRefresh );
70efe6 }
5eaf5a
02c744 ¤   PGPError
476226 CPGPRecipientTable::AddMissingUserID(const char *userID)
c5bb36 {
bd9df0 ¤   RecipientTableItem¤ tableItem;
b9af5a
0fd8c4 ¤   pgpClearMemory( &tableItem, sizeof( tableItem ) );
e467c5 ¤
7fc519 ¤   CopyCString( userID, tableItem.description );
d067c5 ¤
23321e ¤   tableItem.itemKind ¤¤   ¤   ¤   = kTableItemKindMissingKey;
54bbf4 ¤   tableItem.sortGrouping ¤¤   ¤   = -1;¤  /* Force to top of list */
25ead9 ¤   tableItem.isMissingRecipients¤  = TRUE;
7267c5 ¤
6fcce3 ¤   AddTableItem( &tableItem, TRUE );
0067c5 ¤
362d68 ¤   return( kPGPError_NoErr );
27efe6 }
f3af5a
a6c744 ¤   PGPError
58eb5f CPGPRecipientTable::AddKey(PGPKeyRef theKey)
91bb36 {
5b3cbe ¤   PGPError¤   ¤   ¤   ¤   err = kPGPError_NoErr;
4f9df0 ¤   RecipientTableItem¤ tableItem;
e464b5 ¤   PGPInt32¤   ¤   ¤   ¤   algorithm;
06e451 ¤   PGPSize¤¤   ¤   ¤   ¤   stringSize;
4167c5 ¤
13d8c4 ¤   pgpClearMemory( &tableItem, sizeof( tableItem ) );
cf67c5 ¤
5d4c5b ¤   tableItem.keyRef ¤  ¤   = theKey;
f3a3ea ¤   tableItem.itemKind¤ ¤   = kTableItemKindKey;
8baf5a
a8fe0b ¤   err = PGPGetPrimaryUserIDNameBuffer( theKey, 255,
920425 ¤   ¤   ¤   ¤   tableItem.description, &stringSize );
b4b1f0 ¤   if( IsntPGPError( err ) )
16c7a1 ¤   {
3d475e ¤   ¤   err = PGPGetKeyNumber( theKey, kPGPKeyPropAlgID, &algorithm );
c4af5a
d2f247 ¤   ¤   tableItem.algorithm = (PGPPublicKeyAlgorithm)algorithm;
489371 ¤   }
f067c5 ¤
d5b1f0 ¤   if( IsntPGPError( err ) )
cec7a1 ¤   {
eef00d ¤   ¤   AddTableItem( &tableItem, TRUE );
139371 ¤   }
e867c5 ¤
c1deb7 ¤   return( err );
b4efe6 }
abaf5a
4f6d52 ¤   void
3ad05b CPGPRecipientTable::ClickCell(
e6df40 ¤   const STableCell&¤  ¤   inCell,
e0067a ¤   const SMouseDownEvent&¤ inMouseDown)
fcbb36 {
825be1 ¤   (void) inMouseDown;
0467c5 ¤
c8f1ae ¤   if ( GetClickCount() == 2)
8ec7a1 ¤   {
27dc03 ¤   ¤   RecipientTableItem¤ tableItem;
3ceb51 ¤   ¤   Uint32¤ ¤   ¤   ¤   dataSize = sizeof( tableItem );
901b52 ¤   ¤
efff95 ¤   ¤   GetCellData( inCell, &tableItem, dataSize );
83fc65 ¤   ¤   if( tableItem.isMissingRecipients )
df7a29 ¤   ¤   ¤   BroadcastMessage( kUpdateMissingRecipientsMsg, NULL );
--de4d 00186a4ce2440120281 Page 6 of CPGPRecipientTable.cp
f11b52 ¤   ¤
1b9371 ¤   }
86efe6 }
--26e9 0012c437abd40120282 Page 1 of CPGPRecipientTable.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
24c18b ¤   $Id: CPGPRecipientTable.h,v 1.2.12.1 1998/11/12 03:20:46 heller Exp $
00f7f7 ____________________________________________________________________________*/
f2af5a
f97b7d #pragma once
9caf5a
20ea2f #include <LBroadcaster.h>
94a787 #include <LTableView.h>
0faf5a
ed24d7 const MessageT¤ kUpdateMissingRecipientsMsg = 'URcp';
88af5a
d54edc typedef enum TableItemKind
efbb36 {
1759db ¤   kTableItemKindKey¤  = 1,
4c68f6 ¤   kTableItemKindMissingKey
1767c5 ¤
87da9f } TableItemKind;
9faf5a
7fdf7e typedef struct RecipientTableItem
1fbb36 {
cbee56 ¤   TableItemKind¤  ¤   ¤   itemKind;
2861fe ¤   char¤   ¤   ¤   ¤   ¤   description[256];
1b7979 ¤   PGPInt8¤¤   ¤   ¤   ¤   sortGrouping;
49dd4e ¤   PGPBoolean¤ ¤   ¤   ¤   isMissingRecipients;
e878f7 ¤   PGPKeyRef¤  ¤   ¤   ¤   keyRef;
84ea37 ¤   PGPPublicKeyAlgorithm¤  algorithm;
e667c5 ¤
705618 } RecipientTableItem;
f2af5a
ddaf5a
ce4e36 class CPGPRecipientTable : public LTableView, public LBroadcaster
b9bb36 {
4f5ed4 public:
17af5a
b63e41 ¤   enum { class_ID = 'RTbl' };
b167c5 ¤
fb1b10 ¤   ¤   ¤   ¤   ¤   ¤   CPGPRecipientTable(LStream *inStream);
ff678d ¤   virtual¤¤   ¤   ¤   ~CPGPRecipientTable();
c2af5a
b84324 ¤   PGPError¤   ¤   ¤   AddKey(PGPKeyRef theKey);
e9210e ¤   PGPError¤   ¤   ¤   AddMissingUserID(const char *userID);
87c6c5 ¤   void¤   ¤   ¤   ¤   AddTableItem(RecipientTableItem *inTableItem,
932410 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inRefresh);
e8e572 ¤   void¤   ¤   ¤   ¤   DrawSelf();
1e67c5 ¤
97a2d3 protected:
58af5a
8df49f ¤   virtual void¤   ¤   ClickCell(
050b7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   ¤   &inCell,
9b2291 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent¤  &inMouseDown);
173a3a ¤   virtual void¤   ¤   DrawCell(
c70b7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   ¤   &inCell,
c67ee5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect¤ ¤   ¤   ¤   &inLocalRect);
2caf5a
a10fb9 private:
63af5a
5c8b69 ¤   LArray¤ ¤   ¤   ¤   *mStorageArray;
2967c5 ¤
4644d4 ¤   void¤   ¤   ¤   ¤   DrawCellContents(const STableCell &inCell,
759191 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect &inLocalRect);
23585a ¤   void¤   ¤   ¤   ¤   GetCellColumnRects(const Rect *cellRect,
221a26 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect *iconColumnRect,
8cadc5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect *userIDColumnRect);
720cb8 ¤   void¤   ¤   ¤   ¤   PrepareToDraw(void);
9a82f7 };
2caf5a
--27b1 001da981ed240120283 Page 1 of CPGPSearchKeyServerGrafPort.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
71dbe3 ¤   $Id: CPGPSearchKeyServerGrafPort.cp,v 1.3.12.1 1998/11/12 03:20:47 heller E¶
8ffda4 xp $
8df7f7 ____________________________________________________________________________*/
0baf5a
1805c6 #include <LStaticText.h>
e7af5a
c685c2 #include "MacStrings.h"
3acc06 #include "pgpDialogs.h"
650d08 #include "pgpMem.h"
7aaf5a
9832bf #include "CPGPSearchKeyServerGrafPort.h"
19af5a
e3af5a
ba3da2 CPGPSearchKeyServerGrafPortView::
adb01e ¤   CPGPSearchKeyServerGrafPortView(LStream *inStream)
14e289 ¤   ¤   : CPGPKeyServerGrafPortView(inStream)
59bb36 {
7defe6 }
88af5a
83f091 CPGPSearchKeyServerGrafPortView::~CPGPSearchKeyServerGrafPortView()
50bb36 {
27efe6 }
8aaf5a
08c744 ¤   PGPError
b5d3ba CPGPSearchKeyServerGrafPortView::SetOptions(
7c4ef5 ¤   PGPContextRef ¤ ¤   ¤   ¤   ¤   ¤   context,
8fdf40 ¤   CPGPSearchKeyServerDialogOptions ¤  *options)
abbb36 {
5c8e12 ¤   PGPError¤   err = kPGPError_NoErr;
db67c5 ¤
a57e07 ¤   err = CPGPKeyServerGrafPortView::SetOptions( context, options );
90b1f0 ¤   if( IsntPGPError( err ) )
e3c7a1 ¤   {
ed4f75 ¤   ¤   mOptions = options;
611b52 ¤   ¤
cde008 ¤   ¤   if( IsntNull( mKeyNameText ) &&
b9d91a ¤   ¤   ¤   options->mKeyDescription[0] != 0 )
9b5b34 ¤   ¤   {
ddf05e ¤   ¤   ¤   Str255¤ name;
e087c7 ¤   ¤   ¤
cffe10 ¤   ¤   ¤   CToPString( options->mKeyDescription, name );
ed4b94 ¤   ¤   ¤   mKeyNameText->SetDescriptor( name );
c90fe4 ¤   ¤   }
299371 ¤   }
4b67c5 ¤
c4deb7 ¤   return( err );
daefe6 }
--0fcb 001cdd710a140120284 Page 1 of CPGPSearchKeyServerGrafPort.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
9f4574 ¤   $Id: CPGPSearchKeyServerGrafPort.h,v 1.4.10.1 1998/11/12 03:20:47 heller Ex¶
bdb277 p $
d6f7f7 ____________________________________________________________________________*/
d4af5a
587b7d #pragma once
90af5a
fe0fa0 #include "CPGPKeyServerGrafPort.h"
b0af5a
b52325 class CPGPSearchKeyServerDialogOptions;
56af5a
696947 class CPGPSearchKeyServerGrafPortView : public CPGPKeyServerGrafPortView
48bb36 {
1e5ed4 public:
2faf5a
7e2f4b ¤   enum
f0c7a1 ¤   {
926db5 ¤   ¤   class_ID = 'QGPV'
861b52 ¤   ¤
d562bd ¤   };
15af5a
e7c13d ¤   ¤   ¤   ¤   ¤   CPGPSearchKeyServerGrafPortView(LStream *inStream);
f507ea ¤   virtual¤¤   ¤   ~CPGPSearchKeyServerGrafPortView();
e2af5a
5f2b57 ¤   PGPError¤   ¤   SetOptions(PGPContextRef context,·
3ddba0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPSearchKeyServerDialogOptions *options);
81af5a
2e0fb9 private:
4b67c5 ¤
ee10dd ¤   const CPGPSearchKeyServerDialogOptions ¤*mOptions;
0082f7 };
cdaf5a
--16c7 001e6be72ba40120285 Page 1 of CPGPSendToKeyServerGrafPort.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
5a4500 ¤   $Id: CPGPSendToKeyServerGrafPort.cp,v 1.2.12.1 1998/11/12 03:20:48 heller E¶
9ffda4 xp $
7bf7f7 ____________________________________________________________________________*/
6eaf5a
37cc06 #include "pgpDialogs.h"
04af5a
11cc4f #include "CPGPSendToKeyServerGrafPort.h"
e0af5a
dc578e CPGPSendToKeyServerGrafPortView::
37f86e ¤   CPGPSendToKeyServerGrafPortView(LStream *inStream)
e4e289 ¤   ¤   : CPGPKeyServerGrafPortView(inStream)
ddbb36 {
63efe6 }
62af5a
7666dc CPGPSendToKeyServerGrafPortView::~CPGPSendToKeyServerGrafPortView()
0abb36 {
7aefe6 }
2aaf5a
83c744 ¤   PGPError
4b1f66 CPGPSendToKeyServerGrafPortView::SetOptions(
094ef5 ¤   PGPContextRef ¤ ¤   ¤   ¤   ¤   ¤   context,
f5c36d ¤   CPGPSendToKeyServerDialogOptions ¤  *options)
bcbb36 {
918e12 ¤   PGPError¤   err = kPGPError_NoErr;
1b67c5 ¤
317e07 ¤   err = CPGPKeyServerGrafPortView::SetOptions( context, options );
63b1f0 ¤   if( IsntPGPError( err ) )
a2c7a1 ¤   {
d54f75 ¤   ¤   mOptions = options;
029371 ¤   }
f067c5 ¤
23deb7 ¤   return( err );
e6efe6 }
--e560 001e195f70e40120286 Page 1 of CPGPSendToKeyServerGrafPort.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
aa9571 ¤   $Id: CPGPSendToKeyServerGrafPort.h,v 1.3.10.1 1998/11/12 03:20:49 heller Ex¶
70b277 p $
6df7f7 ____________________________________________________________________________*/
51af5a
427b7d #pragma once
acaf5a
430fa0 #include "CPGPKeyServerGrafPort.h"
95af5a
fa4909 class CPGPSendToKeyServerDialogOptions;
27af5a
dbdf0c class CPGPSendToKeyServerGrafPortView : public CPGPKeyServerGrafPortView
05bb36 {
545ed4 public:
caaf5a
f32f4b ¤   enum
16c7a1 ¤   {
e67d19 ¤   ¤   class_ID = 'UGPV'
951b52 ¤   ¤
8862bd ¤   };
9faf5a
c3a9fb ¤   ¤   ¤   ¤   ¤   ¤   CPGPSendToKeyServerGrafPortView(LStream *inStream);
468486 ¤   virtual¤¤   ¤   ¤   ~CPGPSendToKeyServerGrafPortView();
7eaf5a
0da94b ¤   ·PGPError¤  ¤   ¤   SetOptions(PGPContextRef context,·
f35bca ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPSendToKeyServerDialogOptions *options);
4eaf5a
1c0fb9 private:
f967c5 ¤
2edc01 ¤   const CPGPSendToKeyServerDialogOptions ¤*mOptions;
9b82f7 };
e1af5a
--9694 000039c444440120287 Page 1 of CPGPSignPassphraseGrafPort.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
8c63f3 ¤   $Id: CPGPSignPassphraseGrafPort.cp,v 1.10.10.1 1998/11/12 03:20:50 heller E¶
8dfda4 xp $
aff7f7 ____________________________________________________________________________*/
8caf5a
2305c6 #include <LStaticText.h>
badd56 #include <PP_Messages.h>
7faf5a
4285c2 #include "MacStrings.h"
7b2f8d #include "pgpErrors.h"
5d0d08 #include "pgpMem.h"
66afa7 #include "pgpPassphraseUtils.h"
11af5a
83829c #include "CPassphraseEdit.h"
00841c #include "CPGPSignPassphraseGrafPort.h"
f0fe54 #include "CPrivateKeysPopup.h"
8efaae #include "PGPsdkUILibDialogs.h"
c29fda #include "PGPsdkUILibUtils.h"
d2af5a
5547b9 CPGPSigningPassphraseGrafPortView::
ea4efc ¤   CPGPSigningPassphraseGrafPortView(LStream *inStream)
dc3045 ¤   : CPGPKeySetPassphraseGrafPortView(inStream)
e0bb36 {
f976f4 ¤   mOptions ¤  ¤   ¤   = NULL;
20891f ¤   mShowingSplitKey¤   = FALSE;
33efe6 }
ecaf5a
2c7635 CPGPSigningPassphraseGrafPortView::~CPGPSigningPassphraseGrafPortView()
f1bb36 {
5cefe6 }
61af5a
eb6d52 ¤   void
21358e CPGPSigningPassphraseGrafPortView::FinishCreateSelf()
04bb36 {
348b81 ¤   CPGPKeySetPassphraseGrafPortView::FinishCreateSelf();
c267c5 ¤
c7d609 ¤   mKeysPopup = (CPrivateKeysPopup *) FindPaneByID( kKeysPopupPaneID );
df9977 ¤   pgpAssertAddrValid( mKeysPopup, VoidAlign );
3267c5 ¤
1697d6 ¤   mPassphraseEdit = (CPassphraseEdit *) FindPaneByID(
a3d0bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPassphraseEditPaneID );
efe86c ¤   pgpAssertAddrValid( mPassphraseEdit, VoidAlign );
9667c5 ¤
1115f0 ¤   mSplitMsgText = (LStaticText *) FindPaneByID( kSplitMsgCaptionPaneID );
b63847 ¤   pgpAssertAddrValid( mSplitMsgText, VoidAlign );
3c67c5 ¤
203f7e ¤   mKeysPopup->AddListener( this );
98efe6 }
33af5a
83c744 ¤   PGPError
47fe1d CPGPSigningPassphraseGrafPortView::SetOptions(
076164 ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   ¤   context,
482aaf ¤   CPGPSigningPassphraseDialogOptions¤ *options)
85bb36 {
a08e12 ¤   PGPError¤   err = kPGPError_NoErr;
4f67c5 ¤
faa91d ¤   PGPValidatePtr( options );
4467c5 ¤
d62207 ¤   err = CPGPKeySetPassphraseGrafPortView::SetOptions( context, options );
7eb1f0 ¤   if( IsntPGPError( err ) )
30c7a1 ¤   {
4c4f75 ¤   ¤   mOptions = options;
a51b52 ¤   ¤
b24c46 ¤   ¤   pgpAssertAddrValid( mOptions->mPassphraseKeyPtr, PGPKeyRef );
7ff533 ¤   ¤   pgpAssert( PGPKeySetRefIsValid( mOptions->mKeySet ) );
251b52 ¤   ¤
ddd370 ¤   ¤   mKeysPopup->BuildKeyList( mOptions->mKeySet,
59d696 ¤   ¤   ¤   ¤   ¤   ¤   mOptions->mDefaultKey );
032f61 ¤   ¤   SwitchTarget( mPassphraseEdit );
--b668 000cc8869a640120287 Page 2 of CPGPSignPassphraseGrafPort.cp
c333cd ¤   ¤   AdjustDisplay();
449371 ¤   }
4e67c5 ¤
4ddeb7 ¤   return( err );
d6efe6 }
cbaf5a
8faf5a
4a3609 ¤   PGPKeyRef
fdfdc6 CPGPSigningPassphraseGrafPortView::FindKeyForPassphrase(
9b215d ¤   PGPKeySetRef ¤  keySet,
c53940 ¤   const char ¤¤   *passphrase)
f1bb36 {
6c5f8c ¤   PGPKeyRef¤  passphraseKey;
e067c5 ¤
aaee2b ¤   passphraseKey = GetKeyForPassphrase( keySet, passphrase, TRUE );
f2c1fe ¤   if ( PGPKeyRefIsValid( passphraseKey ) )
cbc7a1 ¤   {
7bdc79 ¤   ¤   char¤   ¤   cName[256];
7c2899 ¤   ¤   PGPError¤   err¤= kPGPError_NoErr;
da407f ¤   ¤   PGPSize¤¤   len;
b5af5a
aece52 ¤   ¤   /* Confirm the matching key */
411b52 ¤   ¤
38d444 ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer( passphraseKey,
91a2f8 ¤   ¤   ¤   ¤   ¤   sizeof( cName ), cName, &len );
e086f8 ¤   ¤   if( IsntPGPError( err ) )
a55b34 ¤   ¤   {
3a1640 ¤   ¤   ¤   MessageT¤   result;
e795df ¤   ¤   ¤   Str255¤ ¤   pName;
7387c7 ¤   ¤   ¤
fcc2cb ¤   ¤   ¤   SysBeep( 1 );
6887c7 ¤   ¤   ¤
343cfd ¤   ¤   ¤   CToPString( cName, pName );
330c2e ¤   ¤   ¤   result¤ = PGPUIWarningAlert(
30ded4 ¤   ¤   ¤   ¤   ¤   ¤   kPGPUIGenericOKCancelAlert,
babb30 ¤   ¤   ¤   ¤   ¤   ¤   kPGPLibDialogsStringListResID,
ed7eb7 ¤   ¤   ¤   ¤   ¤   ¤   kConfirmMatchingKeyStrIndex, pName );
2aae30 ¤   ¤   ¤   ¤   ¤
bc46a5 ¤   ¤   ¤   if ( result != msg_OK )
5bf776 ¤   ¤   ¤   {
29c34f ¤   ¤   ¤   ¤   passphraseKey = kInvalidPGPKeyRef;
9aa3a6 ¤   ¤   ¤   }
8b0fe4 ¤   ¤   }
999371 ¤   }
d967c5 ¤
a433f7 ¤   return( passphraseKey );
01efe6 }
82af5a
233609 ¤   PGPKeyRef
4d367b CPGPSigningPassphraseGrafPortView::GetPassphraseKey(void)
65bb36 {
7e3aa2 ¤   return( mKeysPopup->GetSigningKey() );
65efe6 }
6aaf5a
306d52 ¤   void
5597f9 CPGPSigningPassphraseGrafPortView::ListenToMessage(
8c19a3 ¤   MessageT ¤  inMessage,
b27503 ¤   void ¤  ¤   *ioParam)
16bb36 {
e2769e ¤   switch( inMessage )
84c7a1 ¤   {
5ca719 ¤   ¤   case kKeysPopupPaneID:
cc0790 ¤   ¤   ¤   AdjustDisplay();
dfcdcb ¤   ¤   ¤   break;
3887c7 ¤   ¤   ¤
b19ae3 ¤   ¤   default:
efc015 ¤   ¤   ¤   CPGPKeySetPassphraseGrafPortView::ListenToMessage( inMessage,
858a25 ¤   ¤   ¤   ¤   ¤   ¤   ioParam );
dacdcb ¤   ¤   ¤   break;
789371 ¤   }
84efe6 }
ccaf5a
--c801 000ce10407a40120287 Page 3 of CPGPSignPassphraseGrafPort.cp
3b6d52 ¤   void
da5086 CPGPSigningPassphraseGrafPortView::AdjustDisplay(void)
8abb36 {
e465f0 ¤   PGPKeyRef¤  signingKey;
de67c5 ¤
876fd5 ¤   signingKey = GetPassphraseKey();
10bbd2 ¤   if( PGPKeyRefIsValid( signingKey ) )
86c7a1 ¤   {
eafce2 ¤   ¤   PGPBoolean¤ isSplitKey;
9ad031 ¤   ¤   PGPError¤   err;
d21b52 ¤   ¤
dbbafd ¤   ¤   err = PGPGetKeyBoolean( signingKey, kPGPKeyPropIsSecretShared,
f82a69 ¤   ¤   ¤   ¤   ¤   &isSplitKey );
8f9832 ¤   ¤   pgpAssertNoErr( err );
b11b52 ¤   ¤
f3fdde ¤   ¤   if( isSplitKey && ! mShowingSplitKey )
e35b34 ¤   ¤   {
f7bace ¤   ¤   ¤   mPassphraseEdit->Hide();
be9007 ¤   ¤   ¤   mSplitMsgText->Show();
4387c7 ¤   ¤   ¤
39f99d ¤   ¤   ¤   mShowingSplitKey = TRUE;
b587c7 ¤   ¤   ¤
590fe4 ¤   ¤   }
3cb21f ¤   ¤   else if( ! isSplitKey )
9d5b34 ¤   ¤   {
b3291e ¤   ¤   ¤   PGPBoolean¤ needsPassphrase;
73af5a
9621eb ¤   ¤   ¤   err = PGPGetKeyBoolean( signingKey, kPGPKeyPropNeedsPassphrase,
898332 ¤   ¤   ¤   ¤   ¤   ¤   &needsPassphrase );
9e144d ¤   ¤   ¤   pgpAssertNoErr( err );
efaf5a
ee7c2b ¤   ¤   ¤   mSplitMsgText->Hide();
ed7ed6 ¤   ¤   ¤   mShowingSplitKey = FALSE;
f7af5a
00464b ¤   ¤   ¤   if( needsPassphrase )
26f776 ¤   ¤   ¤   {
b0523d ¤   ¤   ¤   ¤   if( ! mPassphraseEdit->IsVisible() )
ab72c3 ¤   ¤   ¤   ¤   {
0855b7 ¤   ¤   ¤   ¤   ¤   mPassphraseEdit->Show();
87285f ¤   ¤   ¤   ¤   ¤   SwitchTarget( mPassphraseEdit );
b82613 ¤   ¤   ¤   ¤   }
97a3a6 ¤   ¤   ¤   }
1bbb8c ¤   ¤   ¤   else
e4f776 ¤   ¤   ¤   {
eabf23 ¤   ¤   ¤   ¤   mPassphraseEdit->Hide();
c0a3a6 ¤   ¤   ¤   }
da0fe4 ¤   ¤   }
499371 ¤   }
91efe6 }
22af5a
ab7e69 ¤   Boolean
3366c6 CPGPSigningPassphraseGrafPortView::VerifyPassphrase(void)
79bb36 {
b2b363 ¤   Boolean¤valid;
e767c5 ¤
05a97c ¤   if( mShowingSplitKey )
8dc7a1 ¤   {
9623a7 ¤   ¤   valid = TRUE;
0f1b52 ¤   ¤
ce8069 ¤   ¤   *mOptions->mPassphraseKeyPtr = GetPassphraseKey();
359371 ¤   }
df0e24 ¤   else
53c7a1 ¤   {
fb3113 ¤   ¤   valid = CPGPKeySetPassphraseGrafPortView::VerifyPassphrase();
1d9371 ¤   }
14af5a
4a0b09 ¤   return( valid );
82efe6 }
ecaf5a
d69cb9 ¤   MessageT
153fc5 CPGPSigningPassphraseGrafPortView::HandleMessage(MessageT theMessage)
cebb36 {
--0c63 0016b66789b40120287 Page 4 of CPGPSignPassphraseGrafPort.cp
198c3b ¤   theMessage = CPGPKeySetPassphraseGrafPortView::HandleMessage(theMessage);
2d2ab1 ¤   if( theMessage == msg_OK &&
c1a4fa ¤   ¤   mShowingSplitKey &&
ea51be ¤   ¤   IsntPGPError( mDialogError ) )
8dc7a1 ¤   {
75996b ¤   ¤   mDialogError = kPGPError_KeyUnusableForSignature;
5a9371 ¤   }
c367c5 ¤
01cfbc ¤   return( theMessage );
6bbe43 }¶
--2f34 00193b115c740120288 Page 1 of CPGPSignPassphraseGrafPort.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
cedc80 ¤   $Id: CPGPSignPassphraseGrafPort.h,v 1.6.10.1 1998/11/12 03:20:50 heller Exp¶
71ed4e ·$
f7f7f7 ____________________________________________________________________________*/
28af5a
437b7d #pragma once
d0af5a
9a1c4f #include "CPGPKeyPassphraseGrafPort.h"
4aaf5a
f716e4 class CPrivateKeysPopup;
ce2647 class CPassphraseEdit;
39cb91 class LStaticText;
43af5a
e0ea86 class CPGPSigningPassphraseGrafPortView :
c70371 ¤   ¤   ¤   public CPGPKeySetPassphraseGrafPortView
87bb36 {
715ed4 public:
25af5a
d42f4b ¤   enum
06c7a1 ¤   {
e14498 ¤   ¤   class_ID¤   ¤   ¤   ¤   = 'SPGP',
631b52 ¤   ¤
5f7ea0 ¤   ¤   kKeysPopupPaneID¤   ¤   = 'pKey',
daed05 ¤   ¤   kPassphraseEditPaneID¤  = 'ePwd',
50c89e ¤   ¤   kSplitMsgCaptionPaneID¤ = 'cSpl'
b862bd ¤   };
afaf5a
2f194b ¤   ¤   ¤   ¤   ¤   ¤   CPGPSigningPassphraseGrafPortView(LStream *inStream);
35e06a ¤   virtual¤¤   ¤   ¤   ~CPGPSigningPassphraseGrafPortView();
cbaf5a
ede629 ¤   virtual void¤   ¤   ListenToMessage(MessageT inMessage, void *ioParam);
8146db ¤   PGPError¤   ¤   ¤   SetOptions(PGPContextRef context,·
0e4267 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPSigningPassphraseDialogOptions *options);
1e531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
e6a2d3 protected:
9faf5a
52a1a0 ¤   CPrivateKeysPopup¤  *mKeysPopup;
37676f ¤   CPassphraseEdit¤¤   *mPassphraseEdit;
c9fd8e ¤   LStaticText¤¤   ¤   *mSplitMsgText;
4c67c5 ¤
3757b4 ¤   virtual PGPKeyRef¤  FindKeyForPassphrase(PGPKeySetRef keySet,
0de628 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const char *passphrase);
5efebc ¤   virtual void¤   ¤   FinishCreateSelf(void);
da4e86 ¤   virtual PGPKeyRef¤  GetPassphraseKey(void);
f22bf8 ¤   virtual¤MessageT¤   HandleMessage(MessageT theMessage);
a8fa89 ¤   virtual Boolean¤¤   VerifyPassphrase(void);
5967c5 ¤
750fb9 private:
a5af5a
af8260 ¤   const CPGPSigningPassphraseDialogOptions¤   *mOptions;
673395 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   mShowingSplitKey;
1967c5 ¤
97fb9c ¤   void¤   ¤   ¤   ¤   AdjustDisplay(void);
9382f7 };
--e393 001cd7c83b340120289 Page 1 of CPGPUIGrafPortView.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
cf1dfa ¤   $Id: CPGPUIGrafPortView.cp,v 1.3.12.1 1998/11/12 03:20:51 heller Exp $
b1f7f7 ____________________________________________________________________________*/
dbaf5a
3b85c2 #include "MacStrings.h"
b1cc06 #include "pgpDialogs.h"
190d08 #include "pgpMem.h"
f6af5a
4d61a9 #include "CPGPUIGrafPortView.h"
4eaf5a
a053e5 CPGPUIGrafPortView::CPGPUIGrafPortView(LStream *inStream)
cba3c8 ¤   : CPGPModalGrafPortView(inStream)
c1bb36 {
fa7a2f ¤   mOptions ¤  = NULL;
55d924 ¤   mContext¤   = kInvalidPGPContextRef;
47efe6 }
1faf5a
912e7c CPGPUIGrafPortView::~CPGPUIGrafPortView()
ecbb36 {
b4efe6 }
48af5a
88c744 ¤   PGPError
b3158e CPGPUIGrafPortView::SetOptions(
13ba07 ¤   PGPContextRef ¤ ¤   context,
df0e9f ¤   CPGPDialogOptions ¤ *options)
07bb36 {
a18e12 ¤   PGPError¤   err = kPGPError_NoErr;
0567c5 ¤
162c8d ¤   PGPValidateParam( PGPContextRefIsValid( context ) );
a0a91d ¤   PGPValidatePtr( options );
5067c5 ¤
309aa9 ¤   mContext = context;
4fb910 ¤   mOptions = options;
0867c5 ¤
f51745 ¤   if( IsntNull( options->mWindowTitle ) )
27c7a1 ¤   {
53abb3 ¤   ¤   Str255¤ title;
35af5a
446121 ¤   ¤   CToPString( options->mWindowTitle, title );
265f8b ¤   ¤   SetWTitle( GetMacPort(), title );
5e9371 ¤   }
c3af5a
c3deb7 ¤   return( err );
cdbe43 }¶
--7aaa 0010e95bae44012028a Page 1 of CPGPUIGrafPortView.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
560d8f ¤   $Id: CPGPUIGrafPortView.h,v 1.3.12.1 1998/11/12 03:20:52 heller Exp $
1cf7f7 ____________________________________________________________________________*/
2faf5a
467b7d #pragma once
64af5a
39fcb1 #include "CPGPModalGrafPortView.h"
f2af5a
f9d943 class CPGPDialogOptions;
37af5a
42ba36 class CPGPUIGrafPortView : public CPGPModalGrafPortView
e1bb36 {
685ed4 public:
3caf5a
915302 ¤   enum { class_ID = 'UIGP' };
6367c5 ¤
365bee ¤   ¤   ¤   ¤   ¤   ¤   CPGPUIGrafPortView(LStream *inStream);
56ed8f ¤   virtual¤¤   ¤   ¤   ~CPGPUIGrafPortView();
eeaf5a
279160 ¤   PGPError¤   ¤   ¤   SetOptions(PGPContextRef context,
a0510b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPGPDialogOptions *options);
2fa2d3 protected:
97af5a
f9c810 ¤   PGPContextRef¤  ¤   mContext;
691b52 ¤   ¤
e90fb9 private:
cfaf5a
af7b48 ¤   const CPGPDialogOptions¤*mOptions;
4e82f7 };
0eaf5a
--5a29 000b564bb1f4012028b Page 1 of CPrivateKeysPopup.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
997027 ¤   $Id: CPrivateKeysPopup.cp,v 1.16.12.1 1998/11/12 03:20:53 heller Exp $
e5f7f7 ____________________________________________________________________________*/
2caf5a
b9a85e #include <LArrayIterator.h>
4315dd #include <LComparator.h>
28af5a
7485c2 #include "MacStrings.h"
322f8d #include "pgpErrors.h"
45a076 #include "pgpKeys.h"
350d08 #include "pgpMem.h"
75e684 #include "pgpUserInterface.h"
55af5a
59fe54 #include "CPrivateKeysPopup.h"
c8faae #include "PGPsdkUILibDialogs.h"
45af5a
b0fa40 const ResIDT¤   kSigningPopupMenuResID¤ = 4747;
2faf5a
de0013 typedef struct PopupKeyItem
66bb36 {
f5f1d8 ¤   PGPKeyRef¤  keyRef;
6d8de4 ¤   Str255¤ ¤   userID;¤¤   // Pascal string
e1d41e ¤   UInt16¤ ¤   algorithm;
04da09 ¤   UInt16¤ ¤   keyBits;
430fd2 ¤   Boolean¤¤   isDefaultPrivateKey;
e9af5a
986066 } PopupKeyItem;·
65af5a
6a78a0 class CComparator : public LComparator
61bb36 {
d2be2d ¤   virtual¤¤   ¤   ~CComparator(void);
2cdf25 ¤   virtual Int32¤  Compare(const void *inItemOne, const void *inItemTwo,
9cb9bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Uint32 inSizeOne, Uint32 inSizeTwo) const;
7282f7 };
d5af5a
ebdfa3 CComparator::~CComparator(void)
d0bb36 {
16efe6 }
b1af5a
f51017 ¤   Int32
a5dc67 CComparator::Compare(
e5a61a ¤   const void*¤¤   inItemOne,
4a1c0e ¤   const void*¤¤   inItemTwo,
91d900 ¤   Uint32¤ ¤   ¤   inSizeOne,
9bd3b1 ¤   Uint32¤ ¤   ¤   inSizeTwo) const
e8bb36 {
a01935 ¤   Int32¤  ¤   ¤   ¤   result;
d81bba ¤   const PopupKeyItem¤ *keyItemOne = (PopupKeyItem *) inItemOne;
51c04c ¤   const PopupKeyItem¤ *keyItemTwo = (PopupKeyItem *) inItemTwo;
9567c5 ¤
8451ed ¤   pgpAssertAddrValid( keyItemOne, PopupKeyItem );
85c969 ¤   pgpAssertAddrValid( keyItemTwo, PopupKeyItem );
0767c5 ¤
0d5c98 #if PGP_DEBUG
3eff5a ¤   pgpAssert( inSizeOne == sizeof( PopupKeyItem ) );
b00b18 ¤   pgpAssert( inSizeTwo == sizeof( PopupKeyItem ) );
3bdb21 #else
9d7e56 ¤   #pragma unused( inSizeOne, inSizeTwo )
497454 #endif
3b67c5 ¤
567587 ¤   result = CompareText( &keyItemOne->userID[1], &keyItemTwo->userID[1],
f1230a ¤   ¤   ¤   ¤   ¤   keyItemOne->userID[0], keyItemTwo->userID[0], nil );
0daf5a
3c4c6e ¤   return( result );
93efe6 }
81af5a
deda24 CPrivateKeysPopup::CPrivateKeysPopup(LStream *inStream)
7fb072 ¤   : LPopupButton( inStream )
b5bb36 {
--897d 00073a449254012028b Page 2 of CPrivateKeysPopup.cp
2d28b3 ¤   mKeyItemList = new( LArray )( sizeof(PopupKeyItem),
f468f1 ¤   ¤   ¤   ¤   ¤   ¤   new( CComparator ), TRUE );
50efe6 }
78af5a
4ccabf CPrivateKeysPopup::~CPrivateKeysPopup()
ccbb36 {
b2e566 ¤   delete( mKeyItemList );
96efe6 }
69af5a
8a7e69 ¤   Boolean
39668c CPrivateKeysPopup::BuildKeyList(
257de2 ¤   PGPKeySetRef ¤  allKeys,
b0a402 ¤   PGPKeyRef¤  ¤   defaultKey)
3ebb36 {
78fb19 ¤   PGPError¤   ¤   err;
c6f664 ¤   MenuHandle¤ ¤   menuH;
535445 ¤   PGPKeyListRef¤  keyList;
70a466 ¤   Boolean¤¤   ¤   haveSecretKeys;
0667c5 ¤
7f3ba1 ¤   pgpAssert( PGPKeyRefIsValid( defaultKey ) );
3067c5 ¤
d9f5aa ¤   haveSecretKeys = FALSE;
1867c5 ¤
f2bb1e ¤   // Find and add the private keys.
3967c5 ¤
02ffdf ¤   err = PGPOrderKeySet( allKeys, kPGPAnyOrdering, &keyList );
a0b1f0 ¤   if( IsntPGPError( err ) )
78c7a1 ¤   {
5320b4 ¤   ¤   PGPKeyIterRef¤  keyIterator;
211b52 ¤   ¤
4446e0 ¤   ¤   err = PGPNewKeyIter( keyList, &keyIterator );
cc86f8 ¤   ¤   if( IsntPGPError( err ) )
5b5b34 ¤   ¤   {
ea3754 ¤   ¤   ¤   PGPKeyRef¤  theKey;
ca2ab9 ¤   ¤   ¤   PGPKeyRef¤  defaultPrivateKey;
8d87c7 ¤   ¤   ¤
ad2bc4 ¤   ¤   ¤   if( IsPGPError( PGPGetDefaultPrivateKey( allKeys,
440f13 ¤   ¤   ¤   ¤   ¤   ¤   &defaultPrivateKey ) ) )
a1f776 ¤   ¤   ¤   {
934934 ¤   ¤   ¤   ¤   defaultPrivateKey = (PGPKeyRef) kInvalidPGPKeyRef;
baa3a6 ¤   ¤   ¤   }
aa87c7 ¤   ¤   ¤
2ba048 ¤   ¤   ¤   err = PGPKeyIterNext( keyIterator, &theKey );
528f5a ¤   ¤   ¤   while( IsntPGPError( err ) )
6cf776 ¤   ¤   ¤   {
083f01 ¤   ¤   ¤   ¤   PGPBoolean¤ canSign;
cd2b85 ¤   ¤   ¤   ¤
1b15d7 ¤   ¤   ¤   ¤   err = PGPGetKeyBoolean( theKey, kPGPKeyPropCanSign, &canSign );
ff5565 ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
6a72c3 ¤   ¤   ¤   ¤   {
4b09ba ¤   ¤   ¤   ¤   ¤   if( canSign )
da4859 ¤   ¤   ¤   ¤   ¤   {
50b928 ¤   ¤   ¤   ¤   ¤   ¤   PopupKeyItem¤   keyItem;
41f205 ¤   ¤   ¤   ¤   ¤   ¤   PGPInt32¤   ¤   tempInt32;
6794aa ¤   ¤   ¤   ¤   ¤   ¤
f0ff31 ¤   ¤   ¤   ¤   ¤   ¤   pgpClearMemory( &keyItem, sizeof( keyItem ) );
4b94aa ¤   ¤   ¤   ¤   ¤   ¤
dd7bba ¤   ¤   ¤   ¤   ¤   ¤   keyItem.keyRef = theKey;
f694aa ¤   ¤   ¤   ¤   ¤   ¤
508267 ¤   ¤   ¤   ¤   ¤   ¤   if( theKey == defaultPrivateKey )
00139c ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyItem.isDefaultPrivateKey = TRUE;
a694aa ¤   ¤   ¤   ¤   ¤   ¤
3ade29 ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyNumber( theKey,
8891a8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropAlgID, &tempInt32 );
6c239e ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
f18fec ¤   ¤   ¤   ¤   ¤   ¤   {
51215b ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyItem.algorithm = tempInt32;
07af5a
0dd912 ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetKeyNumber( theKey,
528914 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPropBits, &tempInt32 );
918d9f ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
7306b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
--a7a7 0008a04cb524012028b Page 3 of CPrivateKeysPopup.cp
80be0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSize¤nameSize;
b1da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
9bf503 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyItem.keyBits = tempInt32;
5bda4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
509230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err = PGPGetPrimaryUserIDNameBuffer(
74e258 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theKey,
8adb6f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sizeof( keyItem.userID ) - 1,
7acd00 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (char *)&keyItem.userID[1],
4285dc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &nameSize );
0a8ee8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
bf31b0 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
34dc7a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   /* nameSize includes the 0 terminator */
cde70f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   keyItem.userID[0] = nameSize - 1;
106560 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
d05268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
28db3c ¤   ¤   ¤   ¤   ¤   ¤   }
ad94aa ¤   ¤   ¤   ¤   ¤   ¤
818f30 ¤   ¤   ¤   ¤   ¤   ¤   // Add the key info to our array
4d239e ¤   ¤   ¤   ¤   ¤   ¤   if( IsntPGPError( err ) )
df8fec ¤   ¤   ¤   ¤   ¤   ¤   {
014a32 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mKeyItemList->InsertItemsAt( 1, 10000, &keyItem );
38db3c ¤   ¤   ¤   ¤   ¤   ¤   }
641c89 ¤   ¤   ¤   ¤   ¤   }
c0ae30 ¤   ¤   ¤   ¤   ¤
2cfe51 ¤   ¤   ¤   ¤   ¤   err = PGPKeyIterNext( keyIterator, &theKey );
612613 ¤   ¤   ¤   ¤   }
63a3a6 ¤   ¤   ¤   }
ce87c7 ¤   ¤   ¤
a26ae1 ¤   ¤   ¤   if( err == kPGPError_EndOfIteration )
71bd37 ¤   ¤   ¤   ¤   err = kPGPError_NoErr;
412b85 ¤   ¤   ¤   ¤
cd3433 ¤   ¤   ¤   PGPFreeKeyIter( keyIterator );
540fe4 ¤   ¤   }
931b52 ¤   ¤
e86efb ¤   ¤   PGPFreeKeyList( keyList );
9b9371 ¤   }
a5af5a
4a3dcc ¤   // Walk our sorted array and setup the popup menu handle
faaf5a
20d066 ¤   menuH = GetMenu( kSigningPopupMenuResID );
b0175a ¤   AssertHandleIsValid( menuH, "" );
62d2d6 ¤   if( IsntNull( menuH ) )
aec7a1 ¤   {
1d0b44 ¤   ¤   Str255¤ menuItemStr;
9bc064 ¤   ¤   UInt32¤ value;
1499d1 ¤   ¤   UInt32¤ maxValue;
6e1b52 ¤   ¤
f05805 ¤   ¤   DetachResource( (Handle) menuH );
9b1b52 ¤   ¤
22dddd ¤   ¤   value ¤ ¤   = 1;
e46b11 ¤   ¤   maxValue¤   = 0;
7c1b52 ¤   ¤
2a1957 ¤   ¤   haveSecretKeys = ( mKeyItemList->GetCount() > 0 );
6cd975 ¤   ¤   if( haveSecretKeys )
495b34 ¤   ¤   {
b81628 ¤   ¤   ¤   LArrayIterator¤ iterator( *mKeyItemList );
fae8e0 ¤   ¤   ¤   PopupKeyItem¤   keyItem;
0487c7 ¤   ¤   ¤
766e91 ¤   ¤   ¤   FocusDraw();
5387c7 ¤   ¤   ¤
6e22d3 ¤   ¤   ¤   while( iterator.Next( &keyItem ) )
c7f776 ¤   ¤   ¤   {
4bc84f ¤   ¤   ¤   ¤   Str255¤ tempStr;
6b6429 ¤   ¤   ¤   ¤   short¤  strIndex;
dd2b85 ¤   ¤   ¤   ¤
ba30f1 ¤   ¤   ¤   ¤   GetIndString( menuItemStr, kPGPLibDialogsStringListResID,
9c86ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPrivateKeyPopupFormatStrIndex );
79616e ¤   ¤   ¤   ¤   CopyPString( keyItem.userID, tempStr );
162b85 ¤   ¤   ¤   ¤
13fe32 ¤   ¤   ¤   ¤   /* Truncate the string so we can add our key bits info */
641307 ¤   ¤   ¤   ¤   if( tempStr[0] > 225 )
8af65f ¤   ¤   ¤   ¤   ¤   tempStr[0] = 225;
--ab00 0000a6d1a984012028b Page 4 of CPrivateKeysPopup.cp
d6ae30 ¤   ¤   ¤   ¤   ¤
5814c7 ¤   ¤   ¤   ¤   PrintPString( menuItemStr, menuItemStr, tempStr );
9c2b85 ¤   ¤   ¤   ¤
c4c3f4 ¤   ¤   ¤   ¤   switch( keyItem.algorithm )
0072c3 ¤   ¤   ¤   ¤   {
9ef3ec ¤   ¤   ¤   ¤   ¤   case kPGPPublicKeyAlgorithm_RSA:
a3eda9 ¤   ¤   ¤   ¤   ¤   ¤   strIndex = kRSAAlgorithmStringIndex;
ce00eb ¤   ¤   ¤   ¤   ¤   ¤   break;
a394aa ¤   ¤   ¤   ¤   ¤   ¤
ca6f7d ¤   ¤   ¤   ¤   ¤   case kPGPPublicKeyAlgorithm_ElGamal:
2c7c34 ¤   ¤   ¤   ¤   ¤   case kPGPPublicKeyAlgorithm_DSA:
fcb303 ¤   ¤   ¤   ¤   ¤   ¤   strIndex = kDSAAlgorithmStringIndex;
5300eb ¤   ¤   ¤   ¤   ¤   ¤   break;
c194aa ¤   ¤   ¤   ¤   ¤   ¤
605ee4 ¤   ¤   ¤   ¤   ¤   default:
60a2e1 ¤   ¤   ¤   ¤   ¤   ¤   strIndex = kUnknownAlgorithmStringIndex;
9000eb ¤   ¤   ¤   ¤   ¤   ¤   break;
162613 ¤   ¤   ¤   ¤   }
632b85 ¤   ¤   ¤   ¤
1ac578 ¤   ¤   ¤   ¤   GetIndString( tempStr, kPGPLibDialogsStringListResID,
17b666 ¤   ¤   ¤   ¤   ¤   ¤   ¤   strIndex );
fb14c7 ¤   ¤   ¤   ¤   PrintPString( menuItemStr, menuItemStr, tempStr );
b92b85 ¤   ¤   ¤   ¤
50f5dd ¤   ¤   ¤   ¤   NumToString( keyItem.keyBits, tempStr );
fa14c7 ¤   ¤   ¤   ¤   PrintPString( menuItemStr, menuItemStr, tempStr );
652b85 ¤   ¤   ¤   ¤
265353 ¤   ¤   ¤   ¤   #define kMaxPopupTextWidth¤ 400
6a2b85 ¤   ¤   ¤   ¤
90d5ce ¤   ¤   ¤   ¤   if( StringWidth( menuItemStr ) > kMaxPopupTextWidth )
b672c3 ¤   ¤   ¤   ¤   {
10d978 ¤   ¤   ¤   ¤   ¤   TruncString( kMaxPopupTextWidth, menuItemStr,
658417 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   smTruncMiddle );
3b2613 ¤   ¤   ¤   ¤   }
332b85 ¤   ¤   ¤   ¤
ea7ce4 ¤   ¤   ¤   ¤   ++maxValue;
322b85 ¤   ¤   ¤   ¤
c241bd ¤   ¤   ¤   ¤   ::AppendMenu( menuH, "\pxx" );
6c7b01 ¤   ¤   ¤   ¤   ::SetMenuItemText( menuH, maxValue, menuItemStr );
312b85 ¤   ¤   ¤   ¤
1e7176 ¤   ¤   ¤   ¤   if( keyItem.isDefaultPrivateKey )
fe72c3 ¤   ¤   ¤   ¤   {
611f96 ¤   ¤   ¤   ¤   ¤   value = maxValue;
7e77fa ¤   ¤   ¤   ¤   ¤   SetItemStyle( menuH, maxValue, bold );
202613 ¤   ¤   ¤   ¤   }
59a3a6 ¤   ¤   ¤   }
140fe4 ¤   ¤   }
850e1d ¤   ¤   else
185b34 ¤   ¤   {
1c57fe ¤   ¤   ¤   // Set the popup to the "no signing keys" found and disable
8f6f92 ¤   ¤   ¤   // ourselves
a42647 ¤   ¤   ¤   GetIndString( menuItemStr, kPGPLibDialogsStringListResID,
598a50 ¤   ¤   ¤   ¤   ¤   ¤   kNoSigningKeysFoundStrIndex );
b7a4a4 ¤   ¤   ¤   ::AppendMenu( menuH, menuItemStr );
2487c7 ¤   ¤   ¤
164de3 ¤   ¤   ¤   maxValue = 1;
ad0fe4 ¤   ¤   }
b21b52 ¤   ¤
909cd3 ¤   ¤   // Recalculate the popup dimensions
e631a1 ¤   ¤   SetMacMenuH( menuH );
c1af5a
820c6c ¤   ¤   SetMinValue( 1 );
1765f4 ¤   ¤   SetMaxValue( maxValue );
43f6d6 ¤   ¤   SetValue( value );
251b52 ¤   ¤
f3d975 ¤   ¤   if( haveSecretKeys )
ae5b34 ¤   ¤   {
acceb0 ¤   ¤   ¤   if( PGPKeyRefIsValid( defaultKey ) )
9ef776 ¤   ¤   ¤   {
a2ee49 ¤   ¤   ¤   ¤   SetSigningKey( defaultKey );
51a3a6 ¤   ¤   ¤   }
460fe4 ¤   ¤   }
0a0e1d ¤   ¤   else
--f085 001b7a9d9804012028b Page 5 of CPrivateKeysPopup.cp
e35b34 ¤   ¤   {
0a5375 ¤   ¤   ¤   Disable();
690fe4 ¤   ¤   }
5f9371 ¤   }
4967c5 ¤
43181a ¤   return( haveSecretKeys );
1eefe6 }
e0af5a
cd3609 ¤   PGPKeyRef
4c1a8f CPrivateKeysPopup::GetSigningKey(void)
3dbb36 {
dc65f0 ¤   PGPKeyRef¤  signingKey;
da67c5 ¤
cc7125 ¤   if( mKeyItemList->GetCount() > 0 )
a3c7a1 ¤   {
8bd588 ¤   ¤   PopupKeyItem¤   keyItem;
131b52 ¤   ¤
4966ec ¤   ¤   mKeyItemList->FetchItemAt( GetValue(), &keyItem );
a1af5a
a35e47 ¤   ¤   signingKey = keyItem.keyRef;
519371 ¤   }
690e24 ¤   else
b7c7a1 ¤   {
c7039b ¤   ¤   pgpDebugMsg( "GetSigningKey(): No signing keys!" );
251b52 ¤   ¤
7cd5ab ¤   ¤   signingKey = kInvalidPGPKeyRef;
3e9371 ¤   }
a467c5 ¤
c283b3 ¤   return( signingKey );
deefe6 }
0eaf5a
4b6d52 ¤   void
8fa5f2 CPrivateKeysPopup::SetSigningKey(PGPKeyRef signingKey)
57bb36 {
f17125 ¤   if( mKeyItemList->GetCount() > 0 )
a12ef1 ¤   {¤
19070f ¤   ¤   LArrayIterator¤ iterator( *mKeyItemList );
18d588 ¤   ¤   PopupKeyItem¤   keyItem;
520b4f ¤   ¤   Int32¤  ¤   ¤   newValue;
6229ee ¤   ¤   Int32¤  ¤   ¤   itemIndex;
c11b52 ¤   ¤
7bf4d9 ¤   ¤   newValue ¤  = 0;
1904af ¤   ¤   itemIndex¤  = 1;
5caf5a
11d4f7 ¤   ¤   // Walk the items and try to match the deault key spec. Note
db006f ¤   ¤   // that the user ID must be a fully expanded user ID.
111b52 ¤   ¤
07b34b ¤   ¤   while( iterator.Next( &keyItem ) )
915b34 ¤   ¤   {
d2e2aa ¤   ¤   ¤   if( keyItem.keyRef == signingKey )
6bf776 ¤   ¤   ¤   {
38968c ¤   ¤   ¤   ¤   newValue = itemIndex;
c5f622 ¤   ¤   ¤   ¤   break;
14a3a6 ¤   ¤   ¤   }
7a87c7 ¤   ¤   ¤
6ade1a ¤   ¤   ¤   ++itemIndex;
9e0fe4 ¤   ¤   }
72af5a
185bd0 ¤   ¤   if( newValue != GetValue() )
095b34 ¤   ¤   {
c2ddce ¤   ¤   ¤   SetValue( newValue );
2f0fe4 ¤   ¤   }
f99371 ¤   }
59efe6 }
84af5a
14af5a
b7af5a
--9e93 001e4615b444012028c Page 1 of CPrivateKeysPopup.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
6a3214 ¤   $Id: CPrivateKeysPopup.h,v 1.6.12.1 1998/11/12 03:20:54 heller Exp $
cdf7f7 ____________________________________________________________________________*/
b4af5a
7b7b7d #pragma once
eaaf5a
040aae #include <LPopupButton.h>
a8af5a
55a076 #include "pgpKeys.h"
6aaf5a
251d63 struct PGPKeySpec;
7eaf5a
22ea8c class CPrivateKeysPopup : public LPopupButton
efbb36 {
0d5ed4 public:
b758a4 ¤   enum { class_ID = 'PKPP' };
c3a3f3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CPrivateKeysPopup(LStream *inStream);
ad6b49 ¤   virtual¤¤   ¤   ¤   ¤   ~CPrivateKeysPopup();
04af5a
bf4728 ¤   PGPKeyRef¤  ¤   ¤   ¤   GetSigningKey(void);
935891 ¤   void¤   ¤   ¤   ¤   ¤   SetSigningKey(PGPKeyRef signingKey);
078a5c ¤   Boolean¤¤   ¤   ¤   ¤   BuildKeyList(PGPKeySetRef allKeys,
c67ade ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPKeyRef defaultKey);
8e67c5 ¤
9a0fb9 private:
2067c5 ¤
8cedba ¤   LArray¤ ¤   ¤   ¤   ¤   *mKeyItemList;
e482f7 };
--2b88 000073444a84012028d Page 1 of CUserIDTable.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
aa69e6 ¤   $Id: CUserIDTable.cp,v 1.17.10.1 1998/11/12 03:20:55 heller Exp $
6cf7f7 ____________________________________________________________________________*/
27af5a
6bb1cb #include <ctype.h>
df7c7a #include <Icons.h>
204d37 #include <LowMem.h>
97324c #include <string.h>
02af5a
4f15dd #include <LComparator.h>
27a13b #include <LDragTask.h>
547b38 #include <LTableArrayStorage.h>
f07c52 #include <LTableMonoGeometry.h>
f08848 #include <LTableMultiSelector.h>
617b32 #include <PP_KeyCodes.h>
d9dd56 #include <PP_Messages.h>
097e6d #include <UDrawingState.h>
6f8f92 #include <UGAColorRamp.h>
02ffe3 #include <UGraphicUtils.h>
87e8ae #include <UDrawingUtils.h>
63af5a
0d0438 #include "MacBasics.h"
8a426a #include "MacDebugLeaks.h"
6cbbf4 #include "MacFiles.h"
02b86a #include "MacQuickdraw.h"
3185c2 #include "MacStrings.h"
222f8d #include "pgpErrors.h"
63a076 #include "pgpKeys.h"
580d08 #include "pgpMem.h"
cbe684 #include "pgpUserInterface.h"
39a45e #include "pgpRecipientDialogCommon.h"
a6af5a
f81f02 #include "CUserIDTable.h"
79faae #include "PGPsdkUILibDialogs.h"
f89fda #include "PGPsdkUILibUtils.h"
7ac2ae #include "pgpGroups.h"
76af5a
d65c91 const ResID kRSAUserIDIconResID ¤   = 3002;
0901c8 const ResID kDSSDHUserIDIconResID ¤ = 3020;
e63bd5 const ResID kUnknownUserIDIconResID = 4752;
8eaf5a
8d9260 const ResID kValidKeyIconResID ¤¤   = 3014;
64a015 const ResID kInvalidKeyIconResID ¤  = 3015;
5ee09c const ResID kAxiomaticKeyIconResID ¤= 3017;
5cff08 const ResID kLockedKeyIconResID ¤   = 4753;
987199 const ResID kGroupIconResID¤¤   ¤   = 3026;
89af5a
5cf645 const ResID kBarberPatternResID ¤   = 4747;
c8af5a
b7d5bc const short¤kBarHeight¤ ¤   = 10;
2c95c6 const short¤kMaxValidity¤   = 3;
9daf5a
2929e0 // Column and gutter widths, from right to left
214f6a const short¤kKeySizeRightMargin¤¤   = 5;
a7654f const short¤kKeySizeColumnWidth¤¤   = 70;
000d53 const short¤kKeySizeLeftMargin¤ ¤   = 10;
a8af5a
6a33c1 const short¤kValidityBarColumnWidth¤= 40;
801401 const short¤kValidityBarLeftMargin¤ = 10;
53af5a
1729eb const short kUserIDLeftMargin¤  ¤   = 3;
ecaf5a
a8cd25 const short¤kIconColumnWidth¤   ¤   = 16;
0c4f28 const short¤kIconLeftMargin¤¤   ¤   = 3;
2a7aae const short¤kIconRightMargin¤   ¤   = 3;
edaf5a
4d5f3c class CUserIDComparator : public LComparator
53bb36 {
0777b8 ¤   virtual¤¤   ¤   ~CUserIDComparator(void);
--f279 000fb526dbe4012028d Page 2 of CUserIDTable.cp
28df25 ¤   virtual Int32¤  Compare(const void *inItemOne, const void *inItemTwo,
54b9bf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Uint32 inSizeOne, Uint32 inSizeTwo) const;
bf322c ¤   virtual¤Int32¤  CompareToKey(const void *inItem, Uint32 inSize,
bda2e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const void *inKey) const;
5882f7 };
32af5a
fc46f6 CUserIDComparator::~CUserIDComparator(void)
83bb36 {
45efe6 }
64af5a
d11017 ¤   Int32
20cf48 CUserIDComparator::Compare(
e2a61a ¤   const void*¤¤   inItemOne,
711c0e ¤   const void*¤¤   inItemTwo,
e1d900 ¤   Uint32¤ ¤   ¤   inSizeOne,
72d3b1 ¤   Uint32¤ ¤   ¤   inSizeTwo) const
b1bb36 {
038723 ¤   Int32¤  ¤   ¤   ¤   ¤   result;
d32096 ¤   const PGPRecipientUser¤ *tableItemOne;
209a82 ¤   const PGPRecipientUser¤ *tableItemTwo;
0d67c5 ¤
93dbe5 ¤   tableItemOne = *(PGPRecipientUser **) inItemOne;
a44143 ¤   tableItemTwo = *(PGPRecipientUser **) inItemTwo;
65af5a
d8be13 ¤   pgpAssertAddrValid( tableItemOne, PGPRecipientUser );
bcae2a ¤   pgpAssertAddrValid( tableItemTwo, PGPRecipientUser );
4167c5 ¤
c85c98 #if PGP_DEBUG
00df6d ¤   pgpAssert( inSizeOne == sizeof(PGPRecipientUser *) );
ed1ff9 ¤   pgpAssert( inSizeTwo == sizeof(PGPRecipientUser *) );
53db21 #else
ab7e56 ¤   #pragma unused( inSizeOne, inSizeTwo )
a97454 #endif
f967c5 ¤
ca1742 ¤   result = PGPCompareUserIDStrings(
802501 ¤   ¤   ¤   ¤   ¤   PGPGetRecipientUserNamePtr( tableItemOne ),
64a139 ¤   ¤   ¤   ¤   ¤   PGPGetRecipientUserNamePtr( tableItemTwo ) );
3f2b85 ¤   ¤   ¤   ¤
77901a ¤   if( result == 0 )
b6c7a1 ¤   {
fe15ef ¤   ¤   // Same User ID text. Use the pointer values to force
abc99e ¤   ¤   // a consistent sorting order.
55d57e ¤   ¤   result = (Uint32) tableItemOne - (Uint32) tableItemTwo;
8c9371 ¤   }
7167c5 ¤
7a4c6e ¤   return( result );
30efe6 }
caaf5a
491017 ¤   Int32
710ed0 CUserIDComparator::CompareToKey(
c67189 ¤   const void*¤inItem,
109f62 ¤   Uint32¤ ¤   inSize,
aabcff ¤   const void*¤inKey) const
12cebb {¤
158723 ¤   Int32¤  ¤   ¤   ¤   ¤   result;
843646 ¤   const PGPRecipientUser¤ *tableItem;
b2ddc2 ¤   const char *¤   ¤   ¤   searchUserID;
3f67c5 ¤
9d19af ¤   (void) inSize;
e067c5 ¤
2ea534 ¤   tableItem ¤ ¤   = *(PGPRecipientUser **) inItem;
a99c7f ¤   searchUserID¤   = (const char *) inKey;
e9af5a
790a7a ¤   pgpAssertAddrValid( tableItem, PGPRecipientUser );
2c67c5 ¤
591742 ¤   result = PGPCompareUserIDStrings(
5c1789 ¤   ¤   ¤   ¤   ¤   PGPGetRecipientUserNamePtr( tableItem ), searchUserID );
ad67c5 ¤
ea4c6e ¤   return( result );
f2efe6 }
86af5a
fbaf5a
--118b 0003f369f134012028d Page 3 of CUserIDTable.cp
e0af5a
d3a5be CUserIDTable::CUserIDTable(LStream¤ *inStream)
cf42fa ¤   ¤   : LTableView(inStream),
ede42c ¤   ¤   LDragAndDrop( UQDGlobals::GetCurrentPort(), this )
62bb36 {
8d67c5 ¤
db302b ¤   mTableGeometry¤ = new LTableMonoGeometry(this, mFrameSize.width, 18);
97ce41 ¤   mTableSelector¤ = new LTableMultiSelector(this);
af67c5 ¤
dfe8e4 ¤   // Note: We own this array and need to dispose of it ourselves.
3f40bc ¤   mStorageArray ¤ = new LArray( sizeof(PGPRecipientUser *),
f9d8d7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   new CUserIDComparator, TRUE );
a74b28 ¤   mTableStorage¤  = new LTableArrayStorage(this, mStorageArray);
f467c5 ¤
983c6d ¤   mDeleteSendsMessage¤¤   = FALSE;
9a399b ¤   mBarberPixPat¤  ¤   ¤   = nil;
c08887 ¤   mShowMarginalValidity¤  = FALSE;
10182e ¤   mMarginalIsInvalid¤ ¤   = FALSE;
f0efe6 }
4eaf5a
201cf6 CUserIDTable::~CUserIDTable()
8fbb36 {
24bbd4 ¤   delete mStorageArray;
78af5a
63b4fc ¤   if( IsntNull( mBarberPixPat ) )
f57790 ¤   ¤   DisposePixPat( mBarberPixPat );
8defe6 }
19af5a
9a6e9c CUserIDTable *CUserIDTable::CreateFromStream(LStream *inStream)
3bbb36 {
54b73c ¤   CUserIDTable¤   *table;
0f67c5 ¤
f2a604 ¤   // LDropArea leaks like a sieve. Need to suspend leaks when we create one.
af67c5 ¤
7732f4 ¤   MacLeaks_Suspend();
6979cb ¤   table = new CUserIDTable(inStream);
6777d9 ¤   MacLeaks_Resume();
8367c5 ¤
a30911 ¤   return( table );
3eefe6 }
4faf5a
986d52 ¤   void
d9c9ec CUserIDTable::FinishCreateSelf()
88bb36 {
b84c3d ¤   mLastKeypress¤  = 0;
8edadd ¤   mLastClickTime¤ = 0;
113335 ¤   mLastClickCell¤ = 0;
45af5a
36cf0c ¤   mBarberPixPat = GetPixPat( kBarberPatternResID );
e278f4 ¤   pgpAssertAddrValid( mBarberPixPat, VoidAlign);
0c67c5 ¤
582434 ¤   SetCustomHilite( TRUE );
ebefe6 }
6baf5a
db6d52 ¤   void
30396b CUserIDTable::DisallowSelections(void)
59bb36 {
2135f7 ¤   delete mTableSelector;
a9ce76 ¤   mTableSelector = NULL;
4cefe6 }
07af5a
436d52 ¤   void
494573 CUserIDTable::ApplyForeAndBackColors(void) const
4bbb36 {
d8739b ¤   RGBColor¤   tempColor;
dc67c5 ¤
70b1a6 ¤   tempColor = UGAColorRamp::GetBlackColor();
9375f0 ¤   RGBForeColor( &tempColor );
34af5a
7bd7fd ¤   tempColor = UGAColorRamp::GetColor( colorRamp_Gray1 );
4aa506 ¤   RGBBackColor( &tempColor );
3fefe6 }
--a600 00035fb58f94012028d Page 4 of CUserIDTable.cp
e0af5a
2c6d52 ¤   void
6793aa CUserIDTable::DrawValidity(
80eedf ¤   const PGPRecipientUser¤ *tableItem,
53cbb3 ¤   const Rect ¤¤   ¤   ¤   *columnRect,
6d2e62 ¤   UInt16 ¤¤   ¤   ¤   ¤   bitDepth)
09bb36 {
b3cc19 ¤   Rect¤   ¤   drawRect = *columnRect;
08739b ¤   RGBColor¤   tempColor;
879a64 ¤   RGBColor¤   saveBackColor;
9667c5 ¤
794fd0 ¤   GetBackColor( &saveBackColor );
8c67c5 ¤
01b1a6 ¤   tempColor = UGAColorRamp::GetBlackColor();
6a75f0 ¤   RGBForeColor( &tempColor );
86af5a
84e49f ¤   if( mShowMarginalValidity )
c7c7a1 ¤   {
028c87 ¤   ¤   RGBColor¤   trustColor = { 52223, 52223, 65535 };
c71b52 ¤   ¤
139c75 ¤   ¤   drawRect.bottom = drawRect.top + kBarHeight;
0af850 ¤   ¤   AlignRect( columnRect, &drawRect, kAlignAtVerticalCenter );
d4af5a
b4a509 ¤   ¤   FrameRect( &drawRect );
260991 ¤   ¤   InsetRect( &drawRect, 1, 1);
ef1b52 ¤   ¤
cf0cdb ¤   ¤   if( tableItem->kind == kPGPRecipientUserKind_Key &&
670e7b ¤   ¤   ¤   IsntNull( tableItem->userInfo.key ) &&
9417fd ¤   ¤   ¤   tableItem->userInfo.key->isAxiomaticKey &&
ff6c85 ¤   ¤   ¤   IsntNull( mBarberPixPat ) )
c75b34 ¤   ¤   {
9da9fc ¤   ¤   ¤   PenPixPat( mBarberPixPat );
b156d9 ¤   ¤   ¤   PaintRect( &drawRect );
76e522 ¤   ¤   ¤   PenNormal();
190fe4 ¤   ¤   }
960e1d ¤   ¤   else
c95b34 ¤   ¤   {
3dee12 ¤   ¤   ¤   short ¤ width;
4b312e ¤   ¤   ¤   short¤  barPercent;
3587c7 ¤   ¤   ¤
3b4d81 ¤   ¤   ¤   switch( tableItem->validity )
e7f776 ¤   ¤   ¤   {
aa6ab9 ¤   ¤   ¤   ¤   default:
e4f09b ¤   ¤   ¤   ¤   case kPGPValidity_Unknown:
b1ea7a ¤   ¤   ¤   ¤   case kPGPValidity_Invalid:
ed39c1 ¤   ¤   ¤   ¤   ¤   barPercent = 0;
a714c3 ¤   ¤   ¤   ¤   ¤   break;
0cae30 ¤   ¤   ¤   ¤   ¤
aab25e ¤   ¤   ¤   ¤   case kPGPValidity_Marginal:
54906d ¤   ¤   ¤   ¤   ¤   barPercent = 50;
cd14c3 ¤   ¤   ¤   ¤   ¤   break;
c7ae30 ¤   ¤   ¤   ¤   ¤
a712e8 ¤   ¤   ¤   ¤   case kPGPValidity_Complete:
95bce5 ¤   ¤   ¤   ¤   ¤   barPercent = 100;
3314c3 ¤   ¤   ¤   ¤   ¤   break;
cea3a6 ¤   ¤   ¤   }
b387c7 ¤   ¤   ¤
9a7f44 ¤   ¤   ¤   if( bitDepth >= 8 )
eff776 ¤   ¤   ¤   {
969882 ¤   ¤   ¤   ¤   RGBForeColor( &trustColor );
a1938c ¤   ¤   ¤   ¤   PaintRect( &drawRect );
77a3a6 ¤   ¤   ¤   }
7b87c7 ¤   ¤   ¤
932806 ¤   ¤   ¤   width ¤ ¤   ¤   = drawRect.right - drawRect.left;
6d6331 ¤   ¤   ¤   drawRect.right ¤-= (width * (100 - barPercent)) / 100;
9f87c7 ¤   ¤   ¤
4f00c3 ¤   ¤   ¤   tempColor = UGAColorRamp::GetColor( colorRamp_Gray9 );
7c3b59 ¤   ¤   ¤   RGBForeColor( &tempColor );
5e56d9 ¤   ¤   ¤   PaintRect( &drawRect );
b40fe4 ¤   ¤   }
bbaf5a
359371 ¤   }
--5c57 00023182adc4012028d Page 5 of CUserIDTable.cp
060e24 ¤   else
c2c7a1 ¤   {
c86adf ¤   ¤   ResID¤  iconResID;
881b52 ¤   ¤
a60cdb ¤   ¤   if( tableItem->kind == kPGPRecipientUserKind_Key &&
680e7b ¤   ¤   ¤   IsntNull( tableItem->userInfo.key ) &&
c12ccb ¤   ¤   ¤   tableItem->userInfo.key->isAxiomaticKey )
935b34 ¤   ¤   {
d62665 ¤   ¤   ¤   iconResID = kAxiomaticKeyIconResID;
410fe4 ¤   ¤   }
239f08 ¤   ¤   else if( tableItem->validity == kPGPValidity_Complete )
b15b34 ¤   ¤   {
b4cafd ¤   ¤   ¤   iconResID = kValidKeyIconResID;
b50fe4 ¤   ¤   }
6b4f15 ¤   ¤   else if( tableItem->validity == kPGPValidity_Marginal )
a45b34 ¤   ¤   {
e8bfa5 ¤   ¤   ¤   if( mMarginalIsInvalid )
0ff776 ¤   ¤   ¤   {
a28c91 ¤   ¤   ¤   ¤   iconResID = kInvalidKeyIconResID;
39a3a6 ¤   ¤   ¤   }
adbb8c ¤   ¤   ¤   else
7ff776 ¤   ¤   ¤   {
add2ad ¤   ¤   ¤   ¤   iconResID = kValidKeyIconResID;
3ba3a6 ¤   ¤   ¤   }
530fe4 ¤   ¤   }
380e1d ¤   ¤   else
2c5b34 ¤   ¤   {
3fc3af ¤   ¤   ¤   iconResID = kInvalidKeyIconResID;
490fe4 ¤   ¤   }
921b52 ¤   ¤
810c71 ¤   ¤   drawRect.bottom = drawRect.top + 16;
a5dd22 ¤   ¤   drawRect.right ¤= drawRect.left + 16;
cf9730 ¤   ¤   AlignRect( columnRect, &drawRect, kAlignAtAbsoluteCenter );
861b52 ¤   ¤
357e90 ¤   ¤   tempColor = UGAColorRamp::GetWhiteColor();
f42efa ¤   ¤   RGBBackColor( &tempColor );
e0af5a
4b0c8a ¤   ¤   PlotIconID( &drawRect, kAlignNone,
42dd30 ¤   ¤   ¤   ¤   IsEnabled() ? kTransformNone : kTransformDisabled,
f06293 ¤   ¤   ¤   ¤   iconResID );
569371 ¤   }
6f67c5 ¤
08b1a6 ¤   tempColor = UGAColorRamp::GetBlackColor();
c975f0 ¤   RGBForeColor( &tempColor );
9467c5 ¤
0aa501 ¤   RGBBackColor( &saveBackColor );
bcefe6 }
eeaf5a
366d52 ¤   void
07953e CUserIDTable::GetCellColumnRects(
c9aca1 ¤   const Rect¤ *cellRect,
977ba7 ¤   Rect¤   ¤   *iconColumnRect,
63360b ¤   Rect¤   ¤   *userIDColumnRect,
534976 ¤   Rect¤   ¤   *validityColumnRect,
96327d ¤   Rect¤   ¤   *keySizeColumnRect)
2ebb36 {
c81db6 ¤   // Calculate all of the column rectangles
c867c5 ¤
89807a ¤   *keySizeColumnRect ¤¤   ¤   = *cellRect;
254131 ¤   keySizeColumnRect->right ¤  = cellRect->right - kKeySizeRightMargin;
eda702 ¤   keySizeColumnRect->left¤¤   = keySizeColumnRect->right -
df4225 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeySizeColumnWidth;
8467c5 ¤
20f246 ¤   *validityColumnRect ¤   ¤   = *cellRect;
2f8745 ¤   validityColumnRect->right ¤ = keySizeColumnRect->left -
313982 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kKeySizeLeftMargin;
a9035e ¤   validityColumnRect->left ¤  = validityColumnRect->right -
8a84ad ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kValidityBarColumnWidth;
7b67c5 ¤
995ffe ¤   *iconColumnRect ¤   ¤   ¤   = *cellRect;
7f2590 ¤   iconColumnRect->left ¤  ¤   = cellRect->left + kIconLeftMargin;
2327fc ¤   iconColumnRect->right¤  ¤   = iconColumnRect->left + kIconColumnWidth;
--bd37 000a76c470f4012028d Page 6 of CUserIDTable.cp
2a67c5 ¤
66ee31 ¤   *userIDColumnRect¤  ¤   ¤   = *cellRect;
f5f752 ¤   userIDColumnRect->left ¤¤   = iconColumnRect->right + kIconRightMargin;
41a8f0 ¤   userIDColumnRect->right ¤   = validityColumnRect->left -
39bd42 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kValidityBarLeftMargin;
3fefe6 }
eaaf5a
bb6d52 ¤   void
b07fd0 CUserIDTable::DrawCellContents(
a21bb3 ¤   const STableCell¤   &inCell,
50bee8 ¤   const Rect¤ ¤   ¤   &inLocalRect,
7adb4f ¤   UInt32¤ ¤   ¤   ¤   inBitDepth)
0abb36 {
ffdd82 ¤   Rect¤   ¤   ¤   ¤   iconRect;
2db18e ¤   Rect¤   ¤   ¤   ¤   keySizeRect;
c9c06d ¤   Rect¤   ¤   ¤   ¤   validityColumnRect;
fc762f ¤   Rect¤   ¤   ¤   ¤   userIDRect;
2f747d ¤   Rect¤   ¤   ¤   ¤   userIDColumnRect;
3c8212 ¤   PGPRecipientUser¤   *tableItem;
f83661 ¤   Str255¤ ¤   ¤   ¤   str;
b2223a ¤   IconTransformType¤  iconTransform;
f5d97b ¤   short¤  ¤   ¤   ¤   textMode;
249f09 ¤   short¤  ¤   ¤   ¤   textHeight;
3e6f1b ¤   PGPUInt16¤  ¤   ¤   maxUserIDWidth;
add2c0 ¤   RGBColor¤   ¤   ¤   tempColor;
e2f14f ¤   short¤  ¤   ¤   ¤   iconID;
7867c5 ¤
2c261e ¤   GetCellUser( inCell, &tableItem );
4467c5 ¤
bdc94e ¤   ApplyForeAndBackColors();
9a67c5 ¤
727442 ¤   textHeight = 12;
7067c5 ¤
167b67 ¤   GetCellColumnRects( &inLocalRect, &iconRect,
cb90b9 ¤   ¤   &userIDColumnRect, &validityColumnRect, &keySizeRect );
a31b52 ¤   ¤
28a696 ¤   // Adjust column rectangles to fit enclosed content.
0867c5 ¤
50ebea ¤   userIDRect¤ ¤   ¤   = userIDColumnRect;
dc3619 ¤   userIDRect.left¤¤   = userIDRect.left + kUserIDLeftMargin;
5589a5 ¤   userIDRect.bottom ¤ = userIDRect.top + textHeight;
44937f ¤   AlignRect( &inLocalRect, &userIDRect, kAlignAtVerticalCenter );
5caf5a
309bb1 ¤   if( IsEnabled() )
d7c7a1 ¤   {
8279e5 ¤   ¤   textMode ¤  ¤   = 0;
cb2b9d ¤   ¤   iconTransform¤  = ttNone;
fe9371 ¤   }
0d0e24 ¤   else
9ac7a1 ¤   {
d54bad ¤   ¤   textMode¤   ¤   = grayishTextOr;
93ccc3 ¤   ¤   iconTransform ¤ = ttDisabled;
289371 ¤   }
1067c5 ¤
464948 ¤   if( tableItem->kind == kPGPRecipientUserKind_MissingRecipient )
dac7a1 ¤   {
ca4bad ¤   ¤   textMode¤   ¤   = grayishTextOr;
e9c780 ¤   ¤   iconTransform¤  = ttDisabled;
f09371 ¤   }
c967c5 ¤
d8d2f7 ¤   // Draw Icon
161b52 ¤   ¤
69d45b ¤   if( tableItem->kind == kPGPRecipientUserKind_Key )
23c7a1 ¤   {
398cf9 ¤   ¤   if( tableItem->userInfo.key->algorithm == kPGPPublicKeyAlgorithm_RSA )
1d5b34 ¤   ¤   {
26875e ¤   ¤   ¤   iconID = kRSAUserIDIconResID;
bc0fe4 ¤   ¤   }
ff0e1d ¤   ¤   else
6f5b34 ¤   ¤   {
f8a9d1 ¤   ¤   ¤   iconID = kDSSDHUserIDIconResID;
a70fe4 ¤   ¤   }
--8b41 00091b8a9ec4012028d Page 7 of CUserIDTable.cp
a19371 ¤   }
e7bdba ¤   else if( tableItem->kind == kPGPRecipientUserKind_MissingRecipient )
9fc7a1 ¤   {
8ae968 ¤   ¤   iconID = kUnknownUserIDIconResID;
909371 ¤   }
cdc610 ¤   else if ( tableItem->kind == kPGPRecipientUserKind_Group )
31c7a1 ¤   {
5cb3e6 ¤   ¤   iconID = kGroupIconResID;
9d9371 ¤   }
4e0e24 ¤   else
e7c7a1 ¤   {
014989 ¤   ¤   pgpDebugMsg( "DrawCellContents: Unknown item status" );
309371 ¤   }
2caf5a
a9d391 ¤   iconRect.bottom = iconRect.top + 16;
f6cf79 ¤   AlignRect( &inLocalRect, &iconRect, kAlignAtVerticalCenter );
e8af5a
64430e ¤   PlotIconID( &iconRect, atNone, iconTransform, iconID );
4b67c5 ¤
a114de ¤   // Draw User ID
0b67c5 ¤
acca31 ¤   tempColor = UGAColorRamp::GetColor( colorRamp_Gray2 );
43a506 ¤   RGBBackColor( &tempColor );
ef67c5 ¤
754dc1 ¤   EraseRect( &userIDColumnRect );
d167c5 ¤
ed2dbd ¤   TextSize(9);
6ec47c ¤   TextFont(1);
5a1d8f ¤   TextMode( textMode );
c5af5a
d8d45b ¤   if( tableItem->kind == kPGPRecipientUserKind_Key )
36c7a1 ¤   {
f7b5b8 ¤   ¤   if( tableItem->userInfo.key->isDefaultKey )
d15b34 ¤   ¤   {
326809 ¤   ¤   ¤   TextFace( bold );
b30fe4 ¤   ¤   }
520e1d ¤   ¤   else
d05b34 ¤   ¤   {
74e7ae ¤   ¤   ¤   TextFace( 0 );
db0fe4 ¤   ¤   }
679371 ¤   }
c91ba2 ¤   else if ( tableItem->kind == kPGPRecipientUserKind_MissingRecipient ||
a84291 ¤   ¤   ¤   ¤   tableItem->kind == kPGPRecipientUserKind_Group )
11c7a1 ¤   {
81054f ¤   ¤   TextFace( 0 );
259371 ¤   }
50af5a
d55d92 ¤   if( tableItem->kind == kPGPRecipientUserKind_Key ||
8840c1 ¤   ¤   tableItem->kind == kPGPRecipientUserKind_MissingRecipient )
1dc7a1 ¤   {
0903e8 ¤   ¤   if( tableItem->lockRefCount != 0 )
895b34 ¤   ¤   {
b0fbaf ¤   ¤   ¤   Rect¤   lockedIconRect;
3787c7 ¤   ¤   ¤
ad32ab ¤   ¤   ¤   lockedIconRect ¤¤   ¤   = userIDRect;
8c9105 ¤   ¤   ¤   lockedIconRect.left ¤   = lockedIconRect.right - 16;
cbbe56 ¤   ¤   ¤   lockedIconRect.bottom ¤ = lockedIconRect.top + 16;
c51b52 ¤   ¤
e13306 ¤   ¤   ¤   AlignRect( &userIDRect, &lockedIconRect, kAlignAtCenterRight );
7ea8db ¤   ¤   ¤   PlotIconID( &lockedIconRect, atNone, iconTransform,
cf836a ¤   ¤   ¤   ¤   ¤   ¤   kLockedKeyIconResID );
b294aa ¤   ¤   ¤   ¤   ¤   ¤
bf454e ¤   ¤   ¤   userIDRect.right -= 16;
610fe4 ¤   ¤   }
399371 ¤   }
a867c5 ¤
18fe63 ¤   MoveTo( userIDRect.left, userIDRect.bottom - 2 );
b71e0f ¤   CToPString( PGPGetRecipientUserNamePtr( tableItem ), str );
a967c5 ¤
b6fcc7 ¤   maxUserIDWidth = userIDRect.right - userIDRect.left;
deedc0 ¤   if( StringWidth( str ) > maxUserIDWidth )
91c7a1 ¤   {
--7b70 000425224ef4012028d Page 8 of CUserIDTable.cp
3e2791 ¤   ¤   TextFace( condense );
231b52 ¤   ¤
c6a2fe ¤   ¤   if( StringWidth( str ) > maxUserIDWidth )
865b34 ¤   ¤   {
ee5279 ¤   ¤   ¤   // will not fit condensed. Resort to the default face and
71908d ¤   ¤   ¤   // truncate in the middle
11e7ae ¤   ¤   ¤   TextFace( 0 );
ff49b0 ¤   ¤   ¤   TruncString( maxUserIDWidth, str, smTruncMiddle );
f90fe4 ¤   ¤   }
999371 ¤   }
4167c5 ¤
47ef37 ¤   DrawString( str );
39af5a
043ea6 ¤   TextFace( 0 );
6067c5 ¤
b1d7fd ¤   tempColor = UGAColorRamp::GetColor( colorRamp_Gray1 );
a0a506 ¤   RGBBackColor( &tempColor );
6c67c5 ¤
253f46 ¤   DrawValidity( tableItem, &validityColumnRect, inBitDepth );
2167c5 ¤
8c1588 ¤   keySizeRect.bottom = keySizeRect.top + textHeight;
c3b0a5 ¤   AlignRect( &inLocalRect, &keySizeRect, kAlignAtVerticalCenter );
adaf5a
d35d92 ¤   if( tableItem->kind == kPGPRecipientUserKind_Key ||
31be0d ¤   ¤   tableItem->kind == kPGPRecipientUserKind_Group )
d9c7a1 ¤   {
2d5afe ¤   ¤   PGPBoolean¤ ¤   drawIt¤ = FALSE;
ea38ff ¤   ¤   Str63¤  ¤   ¤   theString;
231b52 ¤   ¤
d26f6c ¤   ¤   // Draw key size
6661ab ¤   ¤   if ( tableItem->kind == kPGPRecipientUserKind_Key )
635b34 ¤   ¤   {
4f2fcf ¤   ¤   ¤   if( tableItem->userInfo.key->keyBits != 0 )
3af776 ¤   ¤   ¤   {
761662 ¤   ¤   ¤   ¤   drawIt = TRUE;
602b85 ¤   ¤   ¤   ¤
fec8dd ¤   ¤   ¤   ¤   if( tableItem->userInfo.key->subKeyBits != 0 )
6872c3 ¤   ¤   ¤   ¤   {
62618d ¤   ¤   ¤   ¤   ¤   Str32¤  tempStr;
942b85 ¤   ¤   ¤   ¤
6ef4b0 ¤   ¤   ¤   ¤   ¤   GetIndString( theString,
9dbc0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPLibDialogsStringListResID,
c4043e ¤   ¤   ¤   ¤   ¤   ¤   ¤   kDSSDHKeySizeFormatStrIndex );
8c531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
3d53dd ¤   ¤   ¤   ¤   ¤   NumToString( tableItem->userInfo.key->subKeyBits, tempStr );
998098 ¤   ¤   ¤   ¤   ¤   PrintPString( theString, theString, tempStr);
34af5a
23eedd ¤   ¤   ¤   ¤   ¤   NumToString( tableItem->userInfo.key->keyBits, tempStr );
7e8098 ¤   ¤   ¤   ¤   ¤   PrintPString( theString, theString, tempStr);
6e2613 ¤   ¤   ¤   ¤   }
c1fa07 ¤   ¤   ¤   ¤   else
c672c3 ¤   ¤   ¤   ¤   {
a246f9 ¤   ¤   ¤   ¤   ¤   NumToString( tableItem->userInfo.key->keyBits, theString );
d32613 ¤   ¤   ¤   ¤   }
c2a3a6 ¤   ¤   ¤   }
1e0fe4 ¤   ¤   }
140e1d ¤   ¤   else
785b34 ¤   ¤   {
80e7b3 ¤   ¤   ¤   Str32¤  tempStr;
ff87c7 ¤   ¤   ¤
30269e ¤   ¤   ¤   pgpAssert( tableItem->kind == kPGPRecipientUserKind_Group );
c987c7 ¤   ¤   ¤
39024a ¤   ¤   ¤   drawIt = TRUE;
c587c7 ¤   ¤   ¤
7b8348 ¤   ¤   ¤   if( tableItem->groupInfo.numMissingKeys != 0 )
aaf776 ¤   ¤   ¤   {
b80c7a ¤   ¤   ¤   ¤   GetIndString( theString, kPGPLibDialogsStringListResID,
9da8cd ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNumMissingGroupKeysFormatStrIndex );
8e531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
56d59d ¤   ¤   ¤   ¤   NumToString( tableItem->groupInfo.numKeys -
39f813 ¤   ¤   ¤   ¤   ¤   ¤   ¤   tableItem->groupInfo.numMissingKeys, tempStr );
425cd3 ¤   ¤   ¤   ¤   PrintPString( theString, theString, tempStr );
--1f08 0006754fe8f4012028d Page 9 of CUserIDTable.cp
cfa3a6 ¤   ¤   ¤   }
41bb8c ¤   ¤   ¤   else
e6f776 ¤   ¤   ¤   {
130c7a ¤   ¤   ¤   ¤   GetIndString( theString, kPGPLibDialogsStringListResID,
9f4e78 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kNumGroupKeysFormatStrIndex );
7ea3a6 ¤   ¤   ¤   }
2587c7 ¤   ¤   ¤
8b8dfc ¤   ¤   ¤   NumToString( tableItem->groupInfo.numKeys, tempStr );
845c31 ¤   ¤   ¤   PrintPString( theString, theString, tempStr );
a60fe4 ¤   ¤   }
291b52 ¤   ¤
7675c0 ¤   ¤   if ( drawIt )
715b34 ¤   ¤   {
0c5fbc ¤   ¤   ¤   MoveTo( keySizeRect.left, keySizeRect.bottom - 2 );
148714 ¤   ¤   ¤   DrawString( theString );
970fe4 ¤   ¤   }
5c9371 ¤   }
8867c5 ¤
1c53d8 ¤   TextMode( srcOr );
f367c5 ¤
036f2d ¤   ForeColor( whiteColor );
ec2672 ¤   MoveTo( inLocalRect.left, inLocalRect.bottom - 1 );
f92da6 ¤   LineTo( inLocalRect.right, inLocalRect.bottom - 1 );
2078a9 ¤   ForeColor( blackColor );
65efe6 }
dbaf5a
0c6d52 ¤   void
72aa0c CUserIDTable::DrawCell(
3a1bb3 ¤   const STableCell¤   &inCell,
6cc050 ¤   const Rect¤ ¤   ¤   &inLocalRect)
57bb36 {
2a78bf ¤   StDeviceLoop ¤  devLoop( inLocalRect );¤¤
256385 ¤   SInt16¤ ¤   ¤   depth;
98af5a
bfb111 ¤   while( devLoop.NextDepth( depth ) )
4bc7a1 ¤   {
3693b6 ¤   ¤   DrawCellContents( inCell, inLocalRect, depth );
0f9371 ¤   }
3fefe6 }
1aaf5a
466d52 ¤   void
0fdc9c CUserIDTable::DragSelectedCells(const EventRecord& inMacEvent)
63bb36 {
427b90 ¤   RgnHandle¤  dragRgn;
53ac89 ¤   RgnHandle¤  tempRgn;
647830 ¤   Point¤  ¤   localPt;
944ea0 ¤   Point¤  ¤   globalPt;
c067c5 ¤
b605a8 ¤   // This routine does not actually add the real cell data to the
a5ffcf ¤   // drag. Instead, a token value (the pane ID) is added to the drag which
0ae106 ¤   // is checked for by the reveiving pane. If the token is presnet and the
655afb ¤   // destination pane is not the source pane, a message is broadcast to the
a47574 ¤   // PGPRecipientGrafPort to move the selected cells to the receiving pane.
7867c5 ¤
209ecb ¤   FocusDraw();
2ec94e ¤   ApplyForeAndBackColors();
d967c5 ¤
57d513 ¤   dragRgn = NewRgn();
437851 ¤   tempRgn¤= NewRgn();
5c67c5 ¤
222bd6 ¤   GetHiliteRgn( dragRgn );
24f3e6 ¤   CopyRgn( dragRgn, tempRgn );
315dfa ¤   InsetRgn( tempRgn, 1, 1 );
0c3f12 ¤   DiffRgn( dragRgn, tempRgn, dragRgn );
9567c5 ¤
126ae8 ¤   // Need to convert the reqion to global coordinates.
ddf1bf ¤   localPt.v = (**dragRgn).rgnBBox.top;
7b74d6 ¤   localPt.h = (**dragRgn).rgnBBox.left;
0a67c5 ¤
970595 ¤   globalPt = localPt;
67932c ¤   LocalToGlobal( &globalPt );
6767c5 ¤
--6ce3 00078b107364012028d Page 10 of CUserIDTable.cp
575038 ¤   OffsetRgn( dragRgn, globalPt.h - localPt.h, globalPt.v - localPt.v );
5867c5 ¤
aa18a4 ¤   LDragTask¤  theDragTask( inMacEvent, dragRgn, 1, 'User', &mPaneID,
492b6d ¤   ¤   ¤   ¤   ¤   ¤   sizeof( mPaneID ), flavorSenderOnly );
3eaf5a
ad290b ¤   // Invalidate LView's focus cache. The port may have changed during the
598be1 ¤   // drag.
76a88c ¤   LView::OutOfFocus( nil );
a4af5a
5ad71b ¤   DisposeRgn( dragRgn );
c437a0 ¤   DisposeRgn( tempRgn );
9eefe6 }
d1af5a
466d52 ¤   void
8ea0ba CUserIDTable::ClickCell(
d5df40 ¤   const STableCell&¤  ¤   inCell,
e4067a ¤   const SMouseDownEvent&¤ inMouseDown)
62bb36 {
0938fd ¤   if((inMouseDown.macEvent.when - mLastClickTime > LMGetDoubleTime()) ||
fcbc7a ¤   ¤   (mLastClickCell != inCell))
21c7a1 ¤   {
6b69e5 ¤   ¤   mLastClickTime = inMouseDown.macEvent.when;
9ca895 ¤   ¤   mLastClickCell = inCell;
841b52 ¤   ¤
35fe1a ¤   ¤   if( DragAndDropIsPresent() &&
22c33f ¤   ¤   ¤   WaitMouseMoved( inMouseDown.macEvent.where ) &&
0ff763 ¤   ¤   ¤   CellIsSelected( inCell ) )
d75b34 ¤   ¤   {
6a9126 ¤   ¤   ¤   DragSelectedCells( inMouseDown.macEvent );
8e0fe4 ¤   ¤   }
b99371 ¤   }
be0e24 ¤   else
1bc7a1 ¤   {
9b1250 ¤   ¤   mLastClickTime = 0;
89283b ¤   ¤   BroadcastMessage( 'Send', this);
819371 ¤   }
1eefe6 }
ddaf5a
467e69 ¤   Boolean
a471b6 CUserIDTable::ItemIsAcceptable(
799701 ¤   DragReference¤  inDragRef,
04f187 ¤   ItemReference¤  inItemRef )
dbbb36 {
fc61b3 ¤   FlavorFlags¤theFlags;
9767c5 ¤
d95477 ¤   return IsEnabled() && IsntErr( GetFlavorFlags( inDragRef,
6430d7 ¤   ¤   inItemRef, 'User', &theFlags ) );
01efe6 }
b7af5a
2e6d52 ¤   void
a7bacb CUserIDTable::UnhiliteDropArea(
7fe9b9 ¤   DragReference¤  inDragRef)
dcbb36 {
e6c94e ¤   ApplyForeAndBackColors();
13dba5 ¤   LDragAndDrop::UnhiliteDropArea( inDragRef );
5cefe6 }
48af5a
906d52 ¤   void
6d4f54 CUserIDTable::ReceiveDragItem(
599701 ¤   DragReference¤  inDragRef,
48c31d ¤   DragAttributes¤ inDragAttrs,
3f82a5 ¤   ItemReference¤  inItemRef,
9562eb ¤   Rect¤   ¤   ¤   &inItemBounds )
15bb36 {
0afbec #pragma unused( inDragAttrs, inItemBounds )
3baf5a
394acc ¤   PaneIDT¤¤   sourcePaneID;
07bf50 ¤   Size¤   ¤   theDataSize = sizeof( sourcePaneID );
f230bd ¤   OSErr¤  ¤   err;
da67c5 ¤
a6adcd ¤   err = GetFlavorData( inDragRef, inItemRef,
783afd ¤   ¤   'User', &sourcePaneID, &theDataSize, 0 );
--af12 000978da4a84012028d Page 11 of CUserIDTable.cp
2c869e ¤   if( IsntErr( err ) && sourcePaneID != mPaneID )
bbc7a1 ¤   {
f449e6 ¤   ¤   // Unhilite manually because the result of BroadcastMessage may
99cb60 ¤   ¤   // display a dialog which will mess up the hilighting.
341b52 ¤   ¤
10574b ¤   ¤   FocusDropArea();
40cf2d ¤   ¤   mIsHilited = false;
dfc8ab ¤   ¤   UnhiliteDropArea( inDragRef );
961b52 ¤   ¤
06272e ¤   ¤   BroadcastMessage( 'Recv', this );
f59371 ¤   }
cdefe6 }
32af5a
b46d52 ¤   void
83c7a6 CUserIDTable::HiliteCellActively(
611bb3 ¤   const STableCell¤   &inCell,
7ca368 ¤   Boolean¤¤   ¤   ¤   inHilite)
0ebb36 {
7fa0e5 ¤   Rect¤   cellFrame;
6b67c5 ¤
90591d ¤   #pragma unused( inHilite )
ca67c5 ¤
ec8654 ¤   if( GetLocalCellRect( inCell, cellFrame ) &&
82f57b ¤   ¤   FocusExposed() )
b4c7a1 ¤   {
aa65b7 ¤   ¤   StDeviceLoop¤   devLoop( cellFrame );¤  ¤
4177ad ¤   ¤   SInt16¤ ¤   ¤   depth;
60af5a
ee3977 ¤   ¤   while( devLoop.NextDepth( depth ) )
3b5b34 ¤   ¤   {
a8c87d ¤   ¤   ¤   StColorPenState saveColorPen; ··// Preserve color & pen state
aa9f24 ¤   ¤   ¤   Rect¤   ¤   ¤   iconColumnRect;
e37d9c ¤   ¤   ¤   Rect¤   ¤   ¤   userIDColumnRect;
d9aded ¤   ¤   ¤   Rect¤   ¤   ¤   validityColumnRect;
647db1 ¤   ¤   ¤   Rect¤   ¤   ¤   keySizeColumnRect;
01af5a
6cc514 ¤   ¤   ¤   StColorPenState::Normalize();
1d87c7 ¤   ¤   ¤
0e28fb ¤   ¤   ¤   if( depth >= 8 )
92f776 ¤   ¤   ¤   {
1eaa3f ¤   ¤   ¤   ¤   RGBColor¤   tempColor;
42af5a
c17f08 ¤   ¤   ¤   ¤   tempColor = UGAColorRamp::GetBlackColor();
92b33f ¤   ¤   ¤   ¤   RGBForeColor( &tempColor );
92af5a
7b54a3 ¤   ¤   ¤   ¤   tempColor = UGAColorRamp::GetColor( colorRamp_Gray2 );
9163c9 ¤   ¤   ¤   ¤   RGBBackColor( &tempColor );
17a3a6 ¤   ¤   ¤   }
aabb8c ¤   ¤   ¤   else
19f776 ¤   ¤   ¤   {
06fb7a ¤   ¤   ¤   ¤   ForeColor( blackColor );
cd3c08 ¤   ¤   ¤   ¤   BackColor( whiteColor );
67a3a6 ¤   ¤   ¤   }
9387c7 ¤   ¤   ¤
214580 ¤   ¤   ¤   GetCellColumnRects( &cellFrame, &iconColumnRect,
8d199b ¤   ¤   ¤   ¤   &userIDColumnRect, &validityColumnRect,
47244d ¤   ¤   ¤   ¤   &keySizeColumnRect );
a31b52 ¤   ¤
3d01a6 ¤   ········UDrawingUtils::SetHiliteModeOn();
55ad8e ¤   ¤   ¤   InvertRect( &userIDColumnRect );
a70fe4 ¤   ¤   }
cd9371 ¤   }
ceefe6 }
59af5a
1c6d52 ¤   void
1b05b2 CUserIDTable::HiliteCellInactively(
9f1bb3 ¤   const STableCell¤   &inCell,
902697 ¤   Boolean¤¤   ¤   ·¤  inHilite)
b4bb36 {
eba0e5 ¤   Rect¤   cellFrame;
3367c5 ¤
97591d ¤   #pragma unused( inHilite )
--a896 000945787b14012028d Page 12 of CUserIDTable.cp
e0af5a
e38654 ¤   if( GetLocalCellRect( inCell, cellFrame ) &&
09f57b ¤   ¤   FocusExposed() )
57c7a1 ¤   {
8465b7 ¤   ¤   StDeviceLoop¤   devLoop( cellFrame );¤  ¤
eb77ad ¤   ¤   SInt16¤ ¤   ¤   depth;
86af5a
223977 ¤   ¤   while( devLoop.NextDepth( depth ) )
ca5b34 ¤   ¤   {
86ad33 ¤   ········StColorPenState saveColorPen; ··// Preserve color & pen state
069f24 ¤   ¤   ¤   Rect¤   ¤   ¤   iconColumnRect;
497d9c ¤   ¤   ¤   Rect¤   ¤   ¤   userIDColumnRect;
62aded ¤   ¤   ¤   Rect¤   ¤   ¤   validityColumnRect;
997db1 ¤   ¤   ¤   Rect¤   ¤   ¤   keySizeColumnRect;
9750b7 ¤   ········
4e56ca ¤   ········StColorPenState::Normalize();
3550b7 ¤   ········
d40913 ¤   ········if( depth >= 8 )
e28722 ¤   ········{
82be05 ¤   ········¤   ApplyForeAndBackColors();
d3a3a6 ¤   ¤   ¤   }
61bb8c ¤   ¤   ¤   else
eaf776 ¤   ¤   ¤   {
02fb7a ¤   ¤   ¤   ¤   ForeColor( blackColor );
0f3c08 ¤   ¤   ¤   ¤   BackColor( whiteColor );
e4a3a6 ¤   ¤   ¤   }
b887c7 ¤   ¤   ¤
af4580 ¤   ¤   ¤   GetCellColumnRects( &cellFrame, &iconColumnRect,
8d199b ¤   ¤   ¤   ¤   &userIDColumnRect, &validityColumnRect,
9f244d ¤   ¤   ¤   ¤   &keySizeColumnRect );
a41b52 ¤   ¤
eaed17 ¤   ¤   ¤   PenMode(srcXor);
a23181 ¤   ¤   ¤   UDrawingUtils::SetHiliteModeOn();
e385c0 ¤   ¤   ¤   FrameRect( &userIDColumnRect );
890fe4 ¤   ¤   }
f39371 ¤   }
55efe6 }
c5af5a
727e69 ¤   Boolean
909d0e CUserIDTable::HandleKeyPress(const EventRecord&¤inKeyEvent)
23bb36 {
530668 ¤   Boolean¤¤   keyHandled¤ = TRUE;
2f1639 ¤   Int16¤  ¤   theKey¤ ¤   = inKeyEvent.message & charCodeMask,
6896bf ¤   ¤   ¤   ¤   charInx;
7867c5 ¤
c4a501 ¤   if( inKeyEvent.modifiers & cmdKey )
efc7a1 ¤   {
ec7c90 ¤   ¤   keyHandled = LCommander::HandleKeyPress( inKeyEvent );
f49371 ¤   }
bc334c ¤   else if( IsEnabled() )
1ac7a1 ¤   {
712b6b ¤   ¤   switch(theKey)
365b34 ¤   ¤   {
8edb68 ¤   ¤   ¤   default:
c2f776 ¤   ¤   ¤   {
eda5ab ¤   ¤   ¤   ¤   if(inKeyEvent.when - kMaxKeypressInterval <= mLastKeypress)
b172c3 ¤   ¤   ¤   ¤   {
96c27d ¤   ¤   ¤   ¤   ¤   if((charInx = strlen(mSearchString)) <
e62647 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMaxSearchStringSize - 1)
d64859 ¤   ¤   ¤   ¤   ¤   {
7a759b ¤   ¤   ¤   ¤   ¤   ¤   mSearchString[charInx]¤ ¤   = theKey;
e3a4c9 ¤   ¤   ¤   ¤   ¤   ¤   mSearchString[charInx+1]¤   = 0;
cf1c89 ¤   ¤   ¤   ¤   ¤   }
cb2613 ¤   ¤   ¤   ¤   }
79fa07 ¤   ¤   ¤   ¤   else
7d72c3 ¤   ¤   ¤   ¤   {
e3e028 ¤   ¤   ¤   ¤   ¤   mSearchString[0] = theKey;
e85440 ¤   ¤   ¤   ¤   ¤   mSearchString[1] = 0;
4c2613 ¤   ¤   ¤   ¤   }
7161c0 ¤   ¤   ¤   ¤   mLastKeypress = inKeyEvent.when;
7c4aab ¤   ¤   ¤   ¤   SelectSearchString();
94f622 ¤   ¤   ¤   ¤   break;
--a57b 000760f75ff4012028d Page 13 of CUserIDTable.cp
cfa3a6 ¤   ¤   ¤   }
7987c7 ¤   ¤   ¤
a852bc ¤   ¤   ¤   case char_LeftArrow:
801c5e ¤   ¤   ¤   case char_RightArrow:
fcf622 ¤   ¤   ¤   ¤   break;
142b85 ¤   ¤   ¤   ¤
6e99fa ¤   ¤   ¤   case char_UpArrow:
5bf776 ¤   ¤   ¤   {
ec0598 ¤   ¤   ¤   ¤   STableCell¤ firstSelectedCell(0, 0);
802b85 ¤   ¤   ¤   ¤
03b77c ¤   ¤   ¤   ¤   if( GetNextSelectedCell( firstSelectedCell ) )
6c72c3 ¤   ¤   ¤   ¤   {
3a55db ¤   ¤   ¤   ¤   ¤   UnselectAllCells();
aeaf5a
9a8b05 ¤   ¤   ¤   ¤   ¤   if( firstSelectedCell.row != 1 )
864859 ¤   ¤   ¤   ¤   ¤   {
7d3b0d ¤   ¤   ¤   ¤   ¤   ¤   firstSelectedCell.row -= 1;
b51c89 ¤   ¤   ¤   ¤   ¤   }
3d2613 ¤   ¤   ¤   ¤   }
5cfa07 ¤   ¤   ¤   ¤   else
3472c3 ¤   ¤   ¤   ¤   {
1c2f26 ¤   ¤   ¤   ¤   ¤   // There are no cells selected. Select the first cell
08732c ¤   ¤   ¤   ¤   ¤   firstSelectedCell.SetCell( 1, 1 );
852613 ¤   ¤   ¤   ¤   }
d82b85 ¤   ¤   ¤   ¤
608bb3 ¤   ¤   ¤   ¤   ScrollCellIntoFrame( firstSelectedCell );
28dfbc ¤   ¤   ¤   ¤   SelectCell( firstSelectedCell );
61f622 ¤   ¤   ¤   ¤   break;
51a3a6 ¤   ¤   ¤   }
c887c7 ¤   ¤   ¤
c410b3 ¤   ¤   ¤   case char_DownArrow:
39f776 ¤   ¤   ¤   {
fba86e ¤   ¤   ¤   ¤   STableCell¤ lastSelectedCell(0, 0);
0ba799 ¤   ¤   ¤   ¤   STableCell¤ curSelectedCell(0, 0);
9b3dd6 ¤   ¤   ¤   ¤   TableIndexT¤numRows;
4701ca ¤   ¤   ¤   ¤   TableIndexT¤numColumns;
9d2b85 ¤   ¤   ¤   ¤
7d2c49 ¤   ¤   ¤   ¤   while( GetNextSelectedCell( curSelectedCell ) )
d772c3 ¤   ¤   ¤   ¤   {
1e82cb ¤   ¤   ¤   ¤   ¤   lastSelectedCell = curSelectedCell;
882613 ¤   ¤   ¤   ¤   }
782b85 ¤   ¤   ¤   ¤
b4908e ¤   ¤   ¤   ¤   UnselectAllCells();
3bb39c ¤   ¤   ¤   ¤   GetTableSize( numRows, numColumns );
f22b85 ¤   ¤   ¤   ¤
e4e802 ¤   ¤   ¤   ¤   if( lastSelectedCell.row == 0 )
1c72c3 ¤   ¤   ¤   ¤   {
7578d8 ¤   ¤   ¤   ¤   ¤   // No row selected. Select the last data row.
35ae30 ¤   ¤   ¤   ¤   ¤
be3e81 ¤   ¤   ¤   ¤   ¤   lastSelectedCell.SetCell( numRows, 1 );
4f2613 ¤   ¤   ¤   ¤   }
96ae02 ¤   ¤   ¤   ¤   else if( lastSelectedCell.row == numRows )
8d72c3 ¤   ¤   ¤   ¤   {
61223e ¤   ¤   ¤   ¤   ¤   // Last row is already selected. Select again
462613 ¤   ¤   ¤   ¤   }
88fa07 ¤   ¤   ¤   ¤   else
0c72c3 ¤   ¤   ¤   ¤   {
75afe0 ¤   ¤   ¤   ¤   ¤   ++lastSelectedCell.row;
d32613 ¤   ¤   ¤   ¤   }
0d2b85 ¤   ¤   ¤   ¤
1b5095 ¤   ¤   ¤   ¤   ScrollCellIntoFrame( lastSelectedCell );
37eaa3 ¤   ¤   ¤   ¤   SelectCell( lastSelectedCell );
3bf622 ¤   ¤   ¤   ¤   break;
c3a3a6 ¤   ¤   ¤   }
7587c7 ¤   ¤   ¤
0d4c64 ¤   ¤   ¤   case char_Home:
0cf36a ¤   ¤   ¤   ¤   // Using min_Int32 here causes overflow problems in
c22c5f ¤   ¤   ¤   ¤   // ScrollPinnedImageBy(). Use a "large" negative arbritray
2195f6 ¤   ¤   ¤   ¤   // number instead.
61a5a3 ¤   ¤   ¤   ¤   ScrollPinnedImageBy( 0, -100000, TRUE );
f0f622 ¤   ¤   ¤   ¤   break;
762b85 ¤   ¤   ¤   ¤
--0682 000af250e8c4012028d Page 14 of CUserIDTable.cp
4a8dc9 ¤   ¤   ¤   case char_End:
323577 ¤   ¤   ¤   ¤   // Using max_Int32 here causes overflow problems in
221e1f ¤   ¤   ¤   ¤   // ScrollPinnedImageBy(). Use a "large" arbritray number
5c2ee6 ¤   ¤   ¤   ¤   // instead.
14f01b ¤   ¤   ¤   ¤   ScrollPinnedImageBy( 0, 100000, TRUE );
38f622 ¤   ¤   ¤   ¤   break;
feaf5a
6b6f81 ¤   ¤   ¤   case char_PageUp:
9ff776 ¤   ¤   ¤   {
0159cb ¤   ¤   ¤   ¤   Rect¤   frameRect;
f22b85 ¤   ¤   ¤   ¤
c04da1 ¤   ¤   ¤   ¤   CalcLocalFrameRect( frameRect );
667632 ¤   ¤   ¤   ¤   ScrollPinnedImageBy( 0, -UGraphicUtils::RectHeight(
3d201d ¤   ¤   ¤   ¤   ¤   ¤   ¤   frameRect ), TRUE );
24f622 ¤   ¤   ¤   ¤   break;
cfa3a6 ¤   ¤   ¤   }
6daf5a
c9895e ¤   ¤   ¤   case char_PageDown:
c9f776 ¤   ¤   ¤   {
8d59cb ¤   ¤   ¤   ¤   Rect¤   frameRect;
0a2b85 ¤   ¤   ¤   ¤
014da1 ¤   ¤   ¤   ¤   CalcLocalFrameRect( frameRect );
c6d4de ¤   ¤   ¤   ¤   ScrollPinnedImageBy( 0, UGraphicUtils::RectHeight(
de201d ¤   ¤   ¤   ¤   ¤   ¤   ¤   frameRect ), TRUE );
3df622 ¤   ¤   ¤   ¤   break;
e5a3a6 ¤   ¤   ¤   }
562b85 ¤   ¤   ¤   ¤
18bce9 ¤   ¤   ¤   case char_Return:
459e3f ¤   ¤   ¤   ¤   if( GetFirstSelectedCell().row > 0 )
7872c3 ¤   ¤   ¤   ¤   {
fb2f05 ¤   ¤   ¤   ¤   ¤   BroadcastMessage( 'Send', this);
982613 ¤   ¤   ¤   ¤   }
eff622 ¤   ¤   ¤   ¤   break;
cf2b85 ¤   ¤   ¤   ¤
a2d41d ¤   ¤   ¤   case char_Backspace:
d8f776 ¤   ¤   ¤   {
abe341 ¤   ¤   ¤   ¤   if( mDeleteSendsMessage && GetFirstSelectedCell().row > 0 )
d172c3 ¤   ¤   ¤   ¤   {
ff2f05 ¤   ¤   ¤   ¤   ¤   BroadcastMessage( 'Send', this);
092613 ¤   ¤   ¤   ¤   }
232b85 ¤   ¤   ¤   ¤
a3f622 ¤   ¤   ¤   ¤   break;
55a3a6 ¤   ¤   ¤   }
9587c7 ¤   ¤   ¤
5c56ed ¤   ¤   ¤   case char_Tab:
223362 ¤   ¤   ¤   case char_Enter:
dc417a ¤   ¤   ¤   case char_Escape:
5ba190 ¤   ¤   ¤   ¤   keyHandled = LCommander::HandleKeyPress(inKeyEvent);
9ef622 ¤   ¤   ¤   ¤   break;
5c0fe4 ¤   ¤   }
1b9371 ¤   }
de67c5 ¤
a6c022 ¤   return keyHandled;
95efe6 }
e4af5a
d76d52 ¤   void
c814d6 CUserIDTable::SelectSearchString()
19bb36 {
e2aee2 ¤   STableCell¤ ¤   ¤   ¤   cell;
a064b4 ¤   TableIndexT¤¤   ¤   ¤   rows, cols;
2d67c5 ¤
c09ecb ¤   FocusDraw();
b3c94e ¤   ApplyForeAndBackColors();
a267c5 ¤
034049 ¤   UnselectAllCells();
61af5a
637190 ¤   GetTableSize(rows, cols);
36af5a
568582 ¤   cell.col = 1;
aa8c07 ¤   cell.row = mStorageArray->FetchInsertIndexOfKey( mSearchString );
5f67c5 ¤
af6548 ¤   if( cell.row <= 0 || cell.row > rows )
--1edf 000928eccd64012028d Page 15 of CUserIDTable.cp
a2b096 ¤   ¤   cell.row = rows;
e41b52 ¤   ¤
e8b0e9 ¤   if( cell.row > 0 )
a5c7a1 ¤   {
5147db ¤   ¤   ScrollCellIntoFrame( cell );
9483c9 ¤   ¤   SelectCell( cell );
8b9371 ¤   }
43efe6 }
a7af5a
c06d52 ¤   void
e79170 CUserIDTable::ClickSelf(
5dc267 ¤   const SMouseDownEvent &inMouseDown)
3dbb36 {
2ca82a ¤   if( IsntNull( mTableSelector ) )
2ec7a1 ¤   {
27fe46 ¤   ¤   ApplyForeAndBackColors();
bceb7d ¤   ¤   SwitchTarget( this );
0caf5a
c540a4 ¤   ¤   LTableView::ClickSelf(inMouseDown);
409371 ¤   }
b6efe6 }
4aaf5a
576d52 ¤   void
bb05a0 CUserIDTable::DrawSelf()
e8bb36 {
cb6b2a ¤   Rect ¤  ¤   frame;
9b739b ¤   RGBColor¤   tempColor;
0867c5 ¤
dcd7fd ¤   tempColor = UGAColorRamp::GetColor( colorRamp_Gray1 );
7975f0 ¤   RGBForeColor( &tempColor );
a467c5 ¤
28a622 ¤   tempColor = UGAColorRamp::GetWhiteColor();
65a506 ¤   RGBBackColor( &tempColor );
1867c5 ¤
7467b9 ¤   CalcLocalFrameRect( frame );
57c7a1 ¤   {
e244fe ¤   ¤   StDeviceLoop¤   devLoop( frame );¤  ¤
c077ad ¤   ¤   SInt16¤ ¤   ¤   depth;
64af5a
753977 ¤   ¤   while( devLoop.NextDepth( depth ) )
695b34 ¤   ¤   {
d3214b ¤   ¤   ¤   if( depth > 1 )
96e594 ¤   ¤   ¤   ¤   PaintRect( &frame );
d0bb8c ¤   ¤   ¤   else
583d87 ¤   ¤   ¤   ¤   EraseRect( &frame );
ec0fe4 ¤   ¤   }
f19371 ¤   }
c167c5 ¤
f2de04 ¤   LTableView::DrawSelf();
7aefe6 }
deaf5a
68af5a
c86c2c ¤   static PGPBoolean
8fd5e2 sRemoveAngleBrackets(
ab45fc ¤   const char *¤   in,
5429de ¤   char *¤ ¤   ¤   out )
cdbb36 {
a84f7f ¤   PGPUInt32¤  length;
8d6bcb ¤   PGPBoolean¤ haveBrackets¤   = FALSE;
0367c5 ¤
cb6816 ¤   /* remove brackets if present */
8b973b ¤   length¤ ¤   ¤   = strlen( in );
f8a984 ¤   haveBrackets¤   = in[ 0 ] == '<' && in[ length - 1 ] == '>';
8167c5 ¤
744e53 ¤   if ( haveBrackets )
14c7a1 ¤   {
65f8e4 ¤   ¤   CopyCString( in + 1, out );
9e6648 ¤   ¤   out[ length -1 - 1 ]¤   = '\0';
0f9371 ¤   }
7d0e24 ¤   else
5cc7a1 ¤   {
921629 ¤   ¤   CopyCString( in, out );
--b395 0001ac618854012028d Page 16 of CUserIDTable.cp
a19371 ¤   }
c90de3 ¤   return( haveBrackets );
52efe6 }
3baf5a
c76d52 ¤   void
c6e59b CUserIDTable::SetPreferences(
9e5133 ¤   Boolean showMarginalValidity,
6b5d45 ¤   Boolean¤marginalIsInvalid)
00bb36 {
f09829 ¤   mShowMarginalValidity ¤ = showMarginalValidity;
3dcf1a ¤   mMarginalIsInvalid¤ ¤   = marginalIsInvalid;
22efe6 }
eeaf5a
906d52 ¤   void
aea9bd CUserIDTable::GetCellUser(
8e1bb3 ¤   const STableCell¤   &inCell,
c1cab4 ¤   PGPRecipientUser¤   **tableItemPtr) const
4abb36 {
5b7bb3 ¤   Uint32¤ dataSize;
cf67c5 ¤
89a305 ¤   dataSize = sizeof( *tableItemPtr );
32ecdb ¤   GetCellData( inCell, (void *) tableItemPtr, dataSize );
e967c5 ¤
7c8fff ¤   pgpAssert( dataSize == sizeof( *tableItemPtr ) );
8aefe6 }
c3af5a
736d52 ¤   void
1ae5d9 CUserIDTable::SetCellUser(
949a02 ¤   const STableCell¤   ¤   &inCell,
869067 ¤   const PGPRecipientUser¤ *tableItem)
51bb36 {
a5c95a ¤   SetCellData( inCell, &tableItem, sizeof( &tableItem ) );
c8efe6 }
4867c5 ¤
376d52 ¤   void
7cfa24 CUserIDTable::DisableSelf(void)
23bb36 {
21b688 ¤   LTableView::DisableSelf();
6767c5 ¤
214049 ¤   UnselectAllCells();
8b3895 ¤   Draw( NULL );
f7efe6 }
8faf5a
e16d52 ¤   void
080711 CUserIDTable::EnableSelf(void)
ccbb36 {
33545b ¤   LTableView::EnableSelf();
4267c5 ¤
8d3895 ¤   Draw( NULL );
60efe6 }
32af5a
3c6d52 ¤   void
88d39f CUserIDTable::DontBeTarget(void)
19bb36 {
224049 ¤   UnselectAllCells();
39efe6 }
6daf5a
b27e69 ¤   Boolean
052ede CUserIDTable::AllowTargetSwitch(LCommander *inNewTarget)
30bb36 {
b418f0 ¤   Boolean¤allowSwitch;
ab67c5 ¤
5a66bb ¤   allowSwitch = LCommander::AllowTargetSwitch( inNewTarget );
323ea9 ¤   if( IsNull( mTableSelector ) )
1ac7a1 ¤   {
9907c9 ¤   ¤   allowSwitch = FALSE;
1b9371 ¤   }
95af5a
d27c92 ¤   return( allowSwitch );
1aefe6 }
4daf5a
1a7e69 ¤   Boolean
--b7fd 00168dd83764012028d Page 17 of CUserIDTable.cp
77fc23 CUserIDTable::ObeyCommand(
89ea24 ¤   CommandT¤   inCommand,
b4ed36 ¤   void*¤  ¤   ioParam)
74bb36 {
cd49ae ¤   Boolean¤¤   cmdHandled = FALSE;
f867c5 ¤
830617 ¤   switch( inCommand )
20c7a1 ¤   {
31593e ¤   ¤   case msg_TabSelect:
95d5ed ¤   ¤   ¤   cmdHandled = TRUE;
92cdcb ¤   ¤   ¤   break;
841b52 ¤   ¤
739ae3 ¤   ¤   default:
65c10e ¤   ¤   ¤   LCommander::ObeyCommand( inCommand, ioParam );
93cdcb ¤   ¤   ¤   break;
cf9371 ¤   }
2867c5 ¤
9b51a4 ¤   return cmdHandled;
cdefe6 }
dcaf5a
ae6d52 ¤   void
571517 CUserIDTable::ResizeFrameBy(
b7f533 ¤   Int16¤  ¤   inWidthDelta,
962452 ¤   Int16¤  ¤   inHeightDelta,
ff5161 ¤   Boolean¤¤   inRefresh)
f3bb36 {
d8610d ¤   LTableView::ResizeFrameBy(inWidthDelta, inHeightDelta, inRefresh);
82af5a
3b9a26 ¤   SetColWidth( mFrameSize.width, 1, 1 );
00efe6 }
68af5a
--9d05 0004dee7fc74012028e Page 1 of CUserIDTable.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
639dea ¤   $Id: CUserIDTable.h,v 1.9.12.1 1998/11/12 03:20:56 heller Exp $
8bf7f7 ____________________________________________________________________________*/
55af5a
ea7b7d #pragma once
36af5a
d1324c #include <string.h>
84af5a
24ea2f #include <LBroadcaster.h>
c62f94 #include <LCommander.h>
ef1d80 #include <LDragAndDrop.h>
9aa787 #include <LTableView.h>
8eaf5a
4a0d08 #include "pgpMem.h"
61af5a
dde684 #include "pgpUserInterface.h"
07a076 #include "pgpKeys.h"
49c2ae #include "pgpGroups.h"
3aaf5a
a97912 const short ¤   kMaxKeypressInterval¤   = 60;
5deb5e const short¤¤   kMaxSearchStringSize¤   = 64;
feaf5a
a192ec struct PGPRecipientUser;
18af5a
60661d class¤  CUserIDTable :¤ public LTableView,
db3300 ¤   ¤   ¤   ¤   ¤   ¤   public LBroadcaster,
07a879 ¤   ¤   ¤   ¤   ¤   ¤   public LCommander,
d60101 ¤   ¤   ¤   ¤   ¤   ¤   public LDragAndDrop
41bb36 {
f25ed4 public:
6aaf5a
8db0bc ¤   enum { class_ID = 'UItv' };
a967c5 ¤
a79210 ¤   ¤   ¤   ¤   ¤   ¤   CUserIDTable(LStream *inStream);
b0c633 ¤   virtual¤¤   ¤   ¤   ~CUserIDTable();
1ee876 ¤   static CUserIDTable *CreateFromStream(LStream *inStream);
acaf5a
531fe5 ¤   virtual Boolean¤¤   AllowTargetSwitch(LCommander *inNewTarget);
cfdbc4 ¤   virtual void¤   ¤   ApplyForeAndBackColors() const;
2d4915 ¤   void¤   ¤   ¤   ¤   DisallowSelections(void);
08e572 ¤   void¤   ¤   ¤   ¤   DrawSelf();
896ed9 ¤   void¤   ¤   ¤   ¤   FinishCreateSelf();
a68b03 ¤   void¤   ¤   ¤   ¤   GetCellUser(const STableCell &inCell,
70d203 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPRecipientUser **tableItemPtr) const;
4ec7bf ¤   LArray¤ ¤   ¤   ¤   *GetStorageArray(void) { return( mStorageArray ); };
88622a ¤   Boolean¤¤   ¤   ¤   HandleKeyPress(const EventRecord&¤  inKeyEvent);
5dc834 ¤   virtual Boolean¤¤   ObeyCommand(CommandT inCommand, void *ioParam);
985cda ¤   virtual void¤   ¤   ResizeFrameBy(Int16 inWidthDelta, Int16 inHeightDelta,
e871bc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean inRefresh);
20f983 ¤   void¤   ¤   ¤   ¤   SetAllowDeleteKeyToSend(Boolean allowSend)
9bae6d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { mDeleteSendsMessage = allowSend; };
29cc2b ¤   void¤   ¤   ¤   ¤   SetCellUser(const STableCell &inCell,
edf1de ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPRecipientUser *tableItemPtr);
245b8e ¤   void¤   ¤   ¤   ¤   SetPreferences(Boolean showMarginalValidity,
9243ed ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤marginalIsInvalid);
bdaf5a
b0a2d3 protected:
22af5a
d4f49f ¤   virtual void¤   ¤   ClickCell(
ea0285 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell&¤  ¤   inCell,
2b4c4c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent&¤ inMouseDown);
d5c555 ¤   virtual void¤   ¤   ClickSelf(
f12291 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const SMouseDownEvent¤  &inMouseDown);
d35bd4 ¤   virtual void¤   ¤   DisableSelf(void);
27da43 ¤   virtual void¤   ¤   DontBeTarget();
783a3a ¤   virtual void¤   ¤   DrawCell(
110b7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   ¤   &inCell,
3c7ee5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect¤ ¤   ¤   ¤   &inLocalRect);
4dc2c2 ¤   virtual void¤   ¤   EnableSelf(void);
--25ce 00123b04c944012028e Page 2 of CUserIDTable.h
de6ad0 ¤   virtual void¤   ¤   HiliteCellActively(
6f0b7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   ¤   &inCell,
0e199d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   ¤   inHilite);
aedf49 ¤   virtual void¤   ¤   HiliteCellInactively(
280b7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const STableCell¤   ¤   &inCell,
46199d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Boolean¤¤   ¤   ¤   ¤   inHilite);
4acb60 ¤   virtual Boolean¤¤   ItemIsAcceptable( DragReference inDragRef,
97d44b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ItemReference ¤ ¤   ¤   inItemRef );
519e48 ¤   virtual void¤   ¤   ReceiveDragItem( DragReference inDragRef,
37ad90 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   DragAttributes inDragAttrs,
4f7ab5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ItemReference inItemRef,
8a3c4f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect &inItemBounds );
04c6b7 ¤   virtual void¤   ¤   UnhiliteDropArea(DragReference¤ inDragRef);
1daf5a
530fb9 private:
d6af5a
4bc98f ¤   PGPUInt32¤  ¤   ¤   mLastClickTime,
d1da8e ¤   ¤   ¤   ¤   ¤   ¤   mLastKeypress;
25c84c ¤   STableCell¤ ¤   ¤   mLastClickCell;
99f30d ¤   char¤   ¤   ¤   ¤   mSearchString[kMaxSearchStringSize];
148b69 ¤   LArray¤ ¤   ¤   ¤   *mStorageArray;
70d53d ¤   Boolean¤¤   ¤   ¤   mDeleteSendsMessage;
9c75f6 ¤   PixPatHandle¤   ¤   mBarberPixPat;
b58659 ¤   Boolean¤¤   ¤   ¤   mShowMarginalValidity;
4a7c98 ¤   Boolean¤¤   ¤   ¤   mMarginalIsInvalid;
fd67c5 ¤
80c868 ¤   void¤   ¤   ¤   ¤   DragSelectedCells(const EventRecord& inMacEvent);
8c44d4 ¤   void¤   ¤   ¤   ¤   DrawCellContents(const STableCell &inCell,
a26e7d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect &inLocalRect,
9ab746 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 inBitDepth);
aa9a63 ¤   void¤   ¤   ¤   ¤   DrawValidity(const PGPRecipientUser *tableItem,
4dea33 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const Rect *columnRect,
7472c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt16 bitDepth);
48585a ¤   void¤   ¤   ¤   ¤   GetCellColumnRects(const Rect *cellRect,
621a26 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect *iconColumnRect,
c8d190 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect *userIDColumnRect,
112732 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect *validityColumnRect,
6fc634 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Rect *keySizeColumnRect);
e2609c ¤   void¤   ¤   ¤   ¤   SelectSearchString(void);
6982f7 };
23af5a
--8fb4 001bd7313cd4012028f Page 1 of PGPCollectRandomDataDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
e689cc ¤   $Id: PGPCollectRandomDataDialog.cp,v 1.2.12.1 1998/11/12 03:20:57 heller Ex¶
75b277 p $
d2f7f7 ____________________________________________________________________________*/
0caf5a
167c99 #include <URegistrar.h>
7baf5a
920d08 #include "pgpMem.h"
03af5a
53d83d #include "CPGPRandomDataGrafPort.h"
15cc06 #include "pgpDialogs.h"
fb9fda #include "PGPsdkUILibUtils.h"
f3af5a
bf3fdd const ResIDT kPGPRandomDataDialogID = 4754;
4baf5a
e8c744 ¤   PGPError
4b51fc pgpCollectRandomDataDialogPlatform(
7c284d ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   context,
9f9fde ¤   CPGPRandomDataDialogOptions ¤   *options)
a9bb36 {
3795be ¤   PGPsdkUILibState¤   state;
008f52 ¤   PGPError¤   ¤   ¤   err;
4867c5 ¤
50a91d ¤   PGPValidatePtr( options );
ac67c5 ¤
d05fc2 ¤   err = EnterPGPsdkUILib( context, &state );
0db1f0 ¤   if( IsntPGPError( err ) )
3ac7a1 ¤   {
9ff294 ¤   ¤   DialogRef¤  theDialog;
5d1b52 ¤   ¤
2fac96 ¤   ¤   RegisterClass_( CPGPRandomDataGrafPortView );
af1b52 ¤   ¤
a5db6a ¤   ¤   // Create standard Macintosh window and overlay PowerPlant onto it
8f60fb ¤   ¤   theDialog = CPGPRandomDataGrafPortView::CreateDialog(
290047 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPRandomDataDialogID );
680e84 ¤   ¤   if( IsntNull( theDialog ) )
4d5b34 ¤   ¤   {
d5864e ¤   ¤   ¤   CPGPRandomDataGrafPortView¤ *grafPortView;
781b52 ¤   ¤
346f45 ¤   ¤   ¤   grafPortView = (CPGPRandomDataGrafPortView *)
4c5602 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetWRefCon( theDialog );
1e8706 ¤   ¤   ¤   pgpAssertAddrValid( grafPortView, VoidAlign );
1e87c7 ¤   ¤   ¤
3ba0c3 ¤   ¤   ¤   err = grafPortView->SetOptions( context, options );
1d698b ¤   ¤   ¤   if( IsntPGPError( err ) )
c6f776 ¤   ¤   ¤   {
e7b3ad ¤   ¤   ¤   ¤   err = grafPortView->DoDialog();
a8a3a6 ¤   ¤   ¤   }
af87c7 ¤   ¤   ¤
d3a502 ¤   ¤   ¤   delete( grafPortView );
aaabfb ¤   ¤   ¤   DisposeDialog( theDialog );
a20fe4 ¤   ¤   }
6a0e1d ¤   ¤   else
945b34 ¤   ¤   {
58b90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
080fe4 ¤   ¤   }
709371 ¤   }
b91b52 ¤   ¤
27b1b4 ¤   ExitPGPsdkUILib( &state );
a567c5 ¤
50deb7 ¤   return( err );
ceefe6 }
bdaf5a
--d604 00047ad4a7f40120290 Page 1 of PGPKeyServerDialogs.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ab1aad ¤   $Id: PGPKeyServerDialogs.cp,v 1.8.10.1 1998/11/12 03:20:57 heller Exp $
c5f7f7 ____________________________________________________________________________*/
52af5a
5a7c99 #include <URegistrar.h>
1faf5a
90cc06 #include "pgpDialogs.h"
8cf76a #include "pgpKeyServerDialogCommon.h"
9c0d08 #include "pgpMem.h"
49af5a
2d32bf #include "CPGPSearchKeyServerGrafPort.h"
d9cc4f #include "CPGPSendToKeyServerGrafPort.h"
4f9fda #include "PGPsdkUILibUtils.h"
15af5a
665e94 const ResIDT¤   kSearchKeyServerDialogResID ¤   ¤   ¤   = 4757;
971f53 const ResIDT¤   kSearchKeyServerSpecificKeyDialogResID ¤= 4758;
4a06ff const ResIDT¤   kSendToKeyServerDialogResID ¤   ¤   ¤   = 4759;
5eaf5a
9fc744 ¤   PGPError
b8def4 pgpSearchKeyServerDialogPlatform(
db6164 ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   ¤   context,
e2df40 ¤   CPGPSearchKeyServerDialogOptions ¤  *options)
6bbb36 {
4395be ¤   PGPsdkUILibState¤   state;
898f52 ¤   PGPError¤   ¤   ¤   err;
5867c5 ¤
f7a91d ¤   PGPValidatePtr( options );
a767c5 ¤
165fc2 ¤   err = EnterPGPsdkUILib( context, &state );
5ab1f0 ¤   if( IsntPGPError( err ) )
a7c7a1 ¤   {
5bf294 ¤   ¤   DialogRef¤  theDialog;
c7a9d9 ¤   ¤   ResIDT¤ ¤   dialogID;
d81b52 ¤   ¤
2a783f ¤   ¤   if( options->mKeyDescription[0] == 0 )
6b5b34 ¤   ¤   {
5760aa ¤   ¤   ¤   dialogID = kSearchKeyServerDialogResID;
750fe4 ¤   ¤   }
850e1d ¤   ¤   else
665b34 ¤   ¤   {
a8187e ¤   ¤   ¤   dialogID = kSearchKeyServerSpecificKeyDialogResID;
570fe4 ¤   ¤   }
201b52 ¤   ¤
ba5a13 ¤   ¤   RegisterClass_( CPGPSearchKeyServerGrafPortView );
a11b52 ¤   ¤
20db6a ¤   ¤   // Create standard Macintosh window and overlay PowerPlant onto it
226b68 ¤   ¤   theDialog = CPGPSearchKeyServerGrafPortView::CreateDialog( dialogID );
7c0e84 ¤   ¤   if( IsntNull( theDialog ) )
585b34 ¤   ¤   {
6a3e5c ¤   ¤   ¤   CPGPSearchKeyServerGrafPortView¤*grafPortView;
4934e6 ¤   ¤   ¤   SInt16¤ ¤   ¤   ¤   ¤   ¤   ¤   saveWindowKind;
121b52 ¤   ¤
297aad ¤   ¤   ¤   /*
b2c638 ¤   ¤   ¤   **¤ OT/PPP has a bug which will cause any dialog in the
fddfda ¤   ¤   ¤   ** ¤foreground to be disposed within OT/PPP if the user cancels
36a969 ¤   ¤   ¤   **¤ the connection. Our fix is to whack the windowKind of the
69d6a3 ¤   ¤   ¤   **¤ foreground window if it is dialogKind.
4c3da8 ¤   ¤   ¤   */
e787c7 ¤   ¤   ¤
a5efa5 ¤   ¤   ¤   saveWindowKind = GetWindowKind( theDialog );
e90ad8 ¤   ¤   ¤   SetWindowKind( theDialog, kApplicationWindowKind );
4e2b85 ¤   ¤   ¤   ¤
d1e71b ¤   ¤   ¤   grafPortView = (CPGPSearchKeyServerGrafPortView *)
0b8c2b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetWRefCon( theDialog );
f38706 ¤   ¤   ¤   pgpAssertAddrValid( grafPortView, VoidAlign );
1787c7 ¤   ¤   ¤
81a0c3 ¤   ¤   ¤   err = grafPortView->SetOptions( context, options );
cb698b ¤   ¤   ¤   if( IsntPGPError( err ) )
47f776 ¤   ¤   ¤   {
--0fe3 000c84acf4f40120290 Page 2 of PGPKeyServerDialogs.cp
f8149a ¤   ¤   ¤   ¤   err = PGPSearchKeyServerDialogCommon( context,
3606be ¤   ¤   ¤   ¤   ¤   ¤   options->mServerList, options->mServerCount,
6eada4 ¤   ¤   ¤   ¤   ¤   ¤   options->mTLSContext, options->mFilter,
ab6087 ¤   ¤   ¤   ¤   ¤   ¤   CPGPSearchKeyServerGrafPortView::KeyServerCallbackProc,
770cc3 ¤   ¤   ¤   ¤   ¤   ¤   (PGPUserValue) grafPortView,
628653 ¤   ¤   ¤   ¤   ¤   ¤   options->mSearchAllServers, options->mNewKeys );
08a3a6 ¤   ¤   ¤   }
bb87c7 ¤   ¤   ¤
413c44 ¤   ¤   ¤   SetWindowKind( theDialog, saveWindowKind );
c6af5a
53a502 ¤   ¤   ¤   delete( grafPortView );
30abfb ¤   ¤   ¤   DisposeDialog( theDialog );
340fe4 ¤   ¤   }
500e1d ¤   ¤   else
a75b34 ¤   ¤   {
4eb90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
ee0fe4 ¤   ¤   }
2d9371 ¤   }
bc1b52 ¤   ¤
66b1b4 ¤   ExitPGPsdkUILib( &state );
c467c5 ¤
8cdeb7 ¤   return( err );
0fefe6 }
a2af5a
c1c744 ¤   PGPError
4735f0 pgpSendToKeyServerDialogPlatform(
606164 ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   ¤   context,
06c36d ¤   CPGPSendToKeyServerDialogOptions ¤  *options)
21bb36 {
ab95be ¤   PGPsdkUILibState¤   state;
818f52 ¤   PGPError¤   ¤   ¤   err;
fa67c5 ¤
76a91d ¤   PGPValidatePtr( options );
8767c5 ¤
265fc2 ¤   err = EnterPGPsdkUILib( context, &state );
f7b1f0 ¤   if( IsntPGPError( err ) )
8fc7a1 ¤   {
11f294 ¤   ¤   DialogRef¤  theDialog;
c7af5a
35b117 ¤   ¤   RegisterClass_( CPGPSendToKeyServerGrafPortView );
331b52 ¤   ¤
77db6a ¤   ¤   // Create standard Macintosh window and overlay PowerPlant onto it
0cd5f2 ¤   ¤   theDialog = CPGPSearchKeyServerGrafPortView::CreateDialog(
2b0abe ¤   ¤   ¤   ¤   ¤   ¤   ¤   kSendToKeyServerDialogResID );
010e84 ¤   ¤   if( IsntNull( theDialog ) )
9e5b34 ¤   ¤   {
b8c4a7 ¤   ¤   ¤   CPGPSendToKeyServerGrafPortView¤*grafPortView;
d034e6 ¤   ¤   ¤   SInt16¤ ¤   ¤   ¤   ¤   ¤   ¤   saveWindowKind;
a11b52 ¤   ¤
aa7aad ¤   ¤   ¤   /*
1ac638 ¤   ¤   ¤   **¤ OT/PPP has a bug which will cause any dialog in the
6edfda ¤   ¤   ¤   ** ¤foreground to be disposed within OT/PPP if the user cancels
52a969 ¤   ¤   ¤   **¤ the connection. Our fix is to whack the windowKind of the
32d6a3 ¤   ¤   ¤   **¤ foreground window if it is dialogKind.
983da8 ¤   ¤   ¤   */
7d87c7 ¤   ¤   ¤
c7efa5 ¤   ¤   ¤   saveWindowKind = GetWindowKind( theDialog );
f00ad8 ¤   ¤   ¤   SetWindowKind( theDialog, kApplicationWindowKind );
4d2b85 ¤   ¤   ¤   ¤
080c1f ¤   ¤   ¤   grafPortView = (CPGPSendToKeyServerGrafPortView *)
218c2b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetWRefCon( theDialog );
be8706 ¤   ¤   ¤   pgpAssertAddrValid( grafPortView, VoidAlign );
5d87c7 ¤   ¤   ¤
42a0c3 ¤   ¤   ¤   err = grafPortView->SetOptions( context, options );
79698b ¤   ¤   ¤   if( IsntPGPError( err ) )
f4f776 ¤   ¤   ¤   {
d3d4da ¤   ¤   ¤   ¤   err = PGPSendToKeyServerDialogCommon( context,
746c28 ¤   ¤   ¤   ¤   ¤   ¤   options->mServerList, options->mTLSContext,
511df5 ¤   ¤   ¤   ¤   ¤   ¤   options->mKeysToSend, CPGPSearchKeyServerGrafPortView::
45fa76 ¤   ¤   ¤   ¤   ¤   ¤   KeyServerCallbackProc, (PGPUserValue) grafPortView,
fed0ca ¤   ¤   ¤   ¤   ¤   ¤   options->mFailedKeys );
c8a3a6 ¤   ¤   ¤   }
--887c 001a05205ad40120290 Page 3 of PGPKeyServerDialogs.cp
e587c7 ¤   ¤   ¤
603c44 ¤   ¤   ¤   SetWindowKind( theDialog, saveWindowKind );
5daf5a
32a502 ¤   ¤   ¤   delete( grafPortView );
d3abfb ¤   ¤   ¤   DisposeDialog( theDialog );
6a0fe4 ¤   ¤   }
db0e1d ¤   ¤   else
e95b34 ¤   ¤   {
0cb90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
ba0fe4 ¤   ¤   }
c49371 ¤   }
f61b52 ¤   ¤
beb1b4 ¤   ExitPGPsdkUILib( &state );
8f67c5 ¤
fcdeb7 ¤   return( err );
a0be43 }¶
--a83a 001cda1e96640120291 Page 1 of PGPOptionsDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
c1c133 ¤   $Id: PGPOptionsDialog.cp,v 1.6.12.1 1998/11/12 03:20:58 heller Exp $
51f7f7 ____________________________________________________________________________*/
26af5a
4b07ea // Public includes:
3add56 #include <PP_Messages.h>
387c99 #include <URegistrar.h>
11af5a
8176f0 #include "CComboError.h"
66e82c #include "pgpPubTypes.h"
f40d08 #include "pgpMem.h"
96e684 #include "pgpUserInterface.h"
3baf5a
7405c5 // Private includes:
9fb3f1 #include "CPGPOptionsGrafPort.h"
bfe50c #include "CPGPOptionsListView.h"
aefaae #include "PGPsdkUILibDialogs.h"
db9fda #include "PGPsdkUILibUtils.h"
3dcc06 #include "pgpDialogs.h"
c2af5a
b9eec9 const ResIDT kPGPOptionsListDialogID¤   = 4752;
14af5a
10c744 ¤   PGPError
15a95e pgpOptionsDialogPlatform(
6b883c ¤   PGPContextRef¤  ¤   ¤   ¤   context,
67feb3 ¤   CPGPOptionsDialogOptions ¤  *options)
82bb36 {
4d95be ¤   PGPsdkUILibState¤   state;
268f52 ¤   PGPError¤   ¤   ¤   err;
1467c5 ¤
5316bb ¤   pgpAssertAddrValid( options, CPGPOptionsDialogOptions );
92af5a
615fc2 ¤   err = EnterPGPsdkUILib( context, &state );
50b1f0 ¤   if( IsntPGPError( err ) )
37c7a1 ¤   {
69f294 ¤   ¤   DialogRef¤  theDialog;
a01b52 ¤   ¤
36b767 ¤   ¤   RegisterClass_( CPGPOptionsGrafPort );
06e19a ¤   ¤   RegisterClass_( CPGPOptionsListView );
741b52 ¤   ¤
9b5e5e ¤   ¤   theDialog = CPGPOptionsGrafPort::CreateDialog(
f69676 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPOptionsListDialogID );
4d0e84 ¤   ¤   if( IsntNull( theDialog ) )
b65b34 ¤   ¤   {
e7ba72 ¤   ¤   ¤   CPGPOptionsGrafPort¤*optionsGrafPortView;
7087c7 ¤   ¤   ¤
24041f ¤   ¤   ¤   optionsGrafPortView = (CPGPOptionsGrafPort *)
d65602 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetWRefCon( theDialog );
cbfe29 ¤   ¤   ¤   pgpAssertAddrValid( optionsGrafPortView, VoidAlign );
1c87c7 ¤   ¤   ¤
dbb4d8 ¤   ¤   ¤   err = optionsGrafPortView->SetOptions( context, options );
d9698b ¤   ¤   ¤   if( IsntPGPError( err ) )
52f776 ¤   ¤   ¤   {
0bedd7 ¤   ¤   ¤   ¤   err = optionsGrafPortView->DoDialog();
83a3a6 ¤   ¤   ¤   }
4687c7 ¤   ¤   ¤
ce799a ¤   ¤   ¤   delete optionsGrafPortView;
65abfb ¤   ¤   ¤   DisposeDialog( theDialog );
970fe4 ¤   ¤   }
bc0e1d ¤   ¤   else
d35b34 ¤   ¤   {
c1b90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
e80fe4 ¤   ¤   }
419371 ¤   }
a81b52 ¤   ¤
45b1b4 ¤   ExitPGPsdkUILib( &state );
6d67c5 ¤
33deb7 ¤   return( err );
cdefe6 }
--fab2 000e8496ee340120292 Page 1 of PGPPassphraseDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
303c73 ¤   $Id: PGPPassphraseDialog.cp,v 1.9.12.1 1998/11/12 03:20:59 heller Exp $
eff7f7 ____________________________________________________________________________*/
47af5a
2e324c #include <string.h>
a3af5a
c4dd56 #include <PP_Messages.h>
8a7c99 #include <URegistrar.h>
f5af5a
b646ad #include "MacDebug.h"
bf6915 #include "MacResources.h"
95bf4a #include "MacSecureMemory.h"
9585c2 #include "MacStrings.h"
062f8d #include "pgpErrors.h"
83a076 #include "pgpKeys.h"
6c0d08 #include "pgpMem.h"
2de684 #include "pgpUserInterface.h"
704919 #include "pgpUtilities.h"
34af5a
91d1c7 #include "CPGPPassphraseGrafPortView.h"
58ebab #include "CPGPRecipientTable.h"
a9d780 #include "CPGPConfPassphraseGrafPort.h"
2a841c #include "CPGPSignPassphraseGrafPort.h"
e49165 #include "CPGPDecrPassphraseGrafPort.h"
df9fda #include "PGPsdkUILibUtils.h"
16faae #include "PGPsdkUILibDialogs.h"
00cc06 #include "pgpDialogs.h"
e1af5a
1122c8 const ResIDT kPGPPassphraseDialogID¤¤   ¤   ¤   ¤   = 4748;
e0894b const ResIDT kPGPSigningPassphraseDialogID¤ ¤   ¤   = 4749;
712b77 const ResIDT kPGPConfirmationPassphraseDialogID¤¤   = 4750;
5f38b4 const ResIDT kPGPDecryptionPassphraseDialogID¤  ¤   = 4751;
9d485b const ResIDT kPGPKeyPassphraseDialogID¤ ¤   ¤   ¤   = 4753;
24af5a
fdaf5a
c0c744 ¤   PGPError
195f65 pgpPassphraseDialogPlatform(
ce284d ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   context,
ae497f ¤   CPGPPassphraseDialogOptions ¤   *options)
81bb36 {
e395be ¤   PGPsdkUILibState¤   state;
198f52 ¤   PGPError¤   ¤   ¤   err;
2f67c5 ¤
33a91d ¤   PGPValidatePtr( options );
1667c5 ¤
8a5fc2 ¤   err = EnterPGPsdkUILib( context, &state );
a1b1f0 ¤   if( IsntPGPError( err ) )
19c7a1 ¤   {
e8f294 ¤   ¤   DialogRef¤  theDialog;
391b52 ¤   ¤
16e331 ¤   ¤   RegisterClass_( CPGPPassphraseGrafPortView );
c31b52 ¤   ¤
42db6a ¤   ¤   // Create standard Macintosh window and overlay PowerPlant onto it
8eb65a ¤   ¤   theDialog = CPGPPassphraseGrafPortView::CreateDialog(
2138f2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPPassphraseDialogID );
520e84 ¤   ¤   if( IsntNull( theDialog ) )
ba5b34 ¤   ¤   {
439914 ¤   ¤   ¤   CPGPPassphraseGrafPortView¤ *passphraseGrafPortView;
b91b52 ¤   ¤
f98a09 ¤   ¤   ¤   passphraseGrafPortView =
f75611 ¤   ¤   ¤   ¤   ¤   (CPGPPassphraseGrafPortView *) GetWRefCon( theDialog );
21f71e ¤   ¤   ¤   pgpAssertAddrValid( passphraseGrafPortView, VoidAlign );
2987c7 ¤   ¤   ¤
37bf47 ¤   ¤   ¤   err = passphraseGrafPortView->SetOptions( context, options );
53698b ¤   ¤   ¤   if( IsntPGPError( err ) )
c6f776 ¤   ¤   ¤   {
4b0c9b ¤   ¤   ¤   ¤   err = passphraseGrafPortView->DoDialog();
64a3a6 ¤   ¤   ¤   }
e887c7 ¤   ¤   ¤
--077c 0003a6aaa4240120292 Page 2 of PGPPassphraseDialog.cp
d0f5b2 ¤   ¤   ¤   delete( passphraseGrafPortView );
f4abfb ¤   ¤   ¤   DisposeDialog( theDialog );
5a0fe4 ¤   ¤   }
b60e1d ¤   ¤   else
c45b34 ¤   ¤   {
edb90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
4d0fe4 ¤   ¤   }
989371 ¤   }
101b52 ¤   ¤
40b1b4 ¤   ExitPGPsdkUILib( &state );
9967c5 ¤
e2deb7 ¤   return( err );
e8efe6 }
a5af5a
0dc744 ¤   PGPError
7781b3 pgpKeyPassphraseDialogPlatform(
0e284d ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   context,
575d0e ¤   CPGPKeyPassphraseDialogOptions ¤*options)
54bb36 {
a095be ¤   PGPsdkUILibState¤   state;
808f52 ¤   PGPError¤   ¤   ¤   err;
8467c5 ¤
52a91d ¤   PGPValidatePtr( options );
e567c5 ¤
285fc2 ¤   err = EnterPGPsdkUILib( context, &state );
a7b1f0 ¤   if( IsntPGPError( err ) )
2dc7a1 ¤   {
12f294 ¤   ¤   DialogRef¤  theDialog;
7c1b52 ¤   ¤
dd9ec9 ¤   ¤   RegisterClass_( CPGPKeyPassphraseGrafPortView );
901b52 ¤   ¤
a0db6a ¤   ¤   // Create standard Macintosh window and overlay PowerPlant onto it
4720d6 ¤   ¤   theDialog = CPGPKeyPassphraseGrafPortView::CreateDialog(
7f8719 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPKeyPassphraseDialogID );
8e0e84 ¤   ¤   if( IsntNull( theDialog ) )
df5b34 ¤   ¤   {
62ba1f ¤   ¤   ¤   CPGPKeyPassphraseGrafPortView¤  *passphraseGrafPortView;
0b1b52 ¤   ¤
ac8a09 ¤   ¤   ¤   passphraseGrafPortView =
0506c7 ¤   ¤   ¤   ¤   (CPGPKeyPassphraseGrafPortView *) GetWRefCon( theDialog );
b4f71e ¤   ¤   ¤   pgpAssertAddrValid( passphraseGrafPortView, VoidAlign );
f4af5a
47bf47 ¤   ¤   ¤   err = passphraseGrafPortView->SetOptions( context, options );
5d698b ¤   ¤   ¤   if( IsntPGPError( err ) )
50f776 ¤   ¤   ¤   {
d40c9b ¤   ¤   ¤   ¤   err = passphraseGrafPortView->DoDialog();
05a3a6 ¤   ¤   ¤   }
da87c7 ¤   ¤   ¤
2ff5b2 ¤   ¤   ¤   delete( passphraseGrafPortView );
e3abfb ¤   ¤   ¤   DisposeDialog( theDialog );
7c0fe4 ¤   ¤   }
630e1d ¤   ¤   else
bc5b34 ¤   ¤   {
98b90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
550fe4 ¤   ¤   }
289371 ¤   }
df1b52 ¤   ¤
f8b1b4 ¤   ExitPGPsdkUILib( &state );
4867c5 ¤
49deb7 ¤   return( err );
f8efe6 }
d2af5a
2cc744 ¤   PGPError
5e45d9 pgpSigningPassphraseDialogPlatform(
106164 ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   ¤   context,
4b4d57 ¤   CPGPSigningPassphraseDialogOptions ¤*options)
82bb36 {
a895be ¤   PGPsdkUILibState¤   state;
a08f52 ¤   PGPError¤   ¤   ¤   err;
1067c5 ¤
9ba91d ¤   PGPValidatePtr( options );
3a67c5 ¤
--4e9a 0005a5a4af840120292 Page 3 of PGPPassphraseDialog.cp
a45fc2 ¤   err = EnterPGPsdkUILib( context, &state );
2bb1f0 ¤   if( IsntPGPError( err ) )
92c7a1 ¤   {
73f294 ¤   ¤   DialogRef¤  theDialog;
a51b52 ¤   ¤
204241 ¤   ¤   RegisterClass_( CPGPSigningPassphraseGrafPortView );
7e1b52 ¤   ¤
4adb6a ¤   ¤   // Create standard Macintosh window and overlay PowerPlant onto it
080ef9 ¤   ¤   theDialog = CPGPSigningPassphraseGrafPortView::CreateDialog(
6051b3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSigningPassphraseDialogID );
4f0e84 ¤   ¤   if( IsntNull( theDialog ) )
f95b34 ¤   ¤   {
d29199 ¤   ¤   ¤   CPGPSigningPassphraseGrafPortView¤  *passphraseGrafPortView;
8c1b52 ¤   ¤
be8a09 ¤   ¤   ¤   passphraseGrafPortView =
c97f25 ¤   ¤   ¤   ¤   (CPGPSigningPassphraseGrafPortView *) GetWRefCon( theDialog );
8af71e ¤   ¤   ¤   pgpAssertAddrValid( passphraseGrafPortView, VoidAlign );
a0af5a
d1bf47 ¤   ¤   ¤   err = passphraseGrafPortView->SetOptions( context, options );
4b698b ¤   ¤   ¤   if( IsntPGPError( err ) )
30f776 ¤   ¤   ¤   {
400c9b ¤   ¤   ¤   ¤   err = passphraseGrafPortView->DoDialog();
0da3a6 ¤   ¤   ¤   }
d287c7 ¤   ¤   ¤
2cf5b2 ¤   ¤   ¤   delete( passphraseGrafPortView );
37abfb ¤   ¤   ¤   DisposeDialog( theDialog );
960fe4 ¤   ¤   }
700e1d ¤   ¤   else
fe5b34 ¤   ¤   {
4bb90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
f20fe4 ¤   ¤   }
3b9371 ¤   }
241b52 ¤   ¤
d9b1b4 ¤   ExitPGPsdkUILib( &state );
2b67c5 ¤
30deb7 ¤   return( err );
0defe6 }
75af5a
bdc744 ¤   PGPError
75e3bb pgpConfirmationPassphraseDialogPlatform(
5411f0 ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   ¤   ¤   ¤   context,
369c10 ¤   CPGPConfirmationPassphraseDialogOptions ¤   *options)
86bb36 {
dc95be ¤   PGPsdkUILibState¤   state;
a18f52 ¤   PGPError¤   ¤   ¤   err;
0467c5 ¤
62a91d ¤   PGPValidatePtr( options );
5967c5 ¤
775fc2 ¤   err = EnterPGPsdkUILib( context, &state );
2bb1f0 ¤   if( IsntPGPError( err ) )
52c7a1 ¤   {
fbf294 ¤   ¤   DialogRef¤  theDialog;
341b52 ¤   ¤
c08e6f ¤   ¤   RegisterClass_( CPGPConfPassphraseGrafPortView );
6b1b52 ¤   ¤
42db6a ¤   ¤   // Create standard Macintosh window and overlay PowerPlant onto it
343d47 ¤   ¤   theDialog = CPGPConfPassphraseGrafPortView::CreateDialog(
ed6f52 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPConfirmationPassphraseDialogID );
2b0e84 ¤   ¤   if( IsntNull( theDialog ) )
535b34 ¤   ¤   {
e929b0 ¤   ¤   ¤   CPGPConfPassphraseGrafPortView¤ *passphraseGrafPortView;
751b52 ¤   ¤
188a09 ¤   ¤   ¤   passphraseGrafPortView =
e78424 ¤   ¤   ¤   ¤   (CPGPConfPassphraseGrafPortView *) GetWRefCon( theDialog );
bdf71e ¤   ¤   ¤   pgpAssertAddrValid( passphraseGrafPortView, VoidAlign );
c187c7 ¤   ¤   ¤
f7bf47 ¤   ¤   ¤   err = passphraseGrafPortView->SetOptions( context, options );
54698b ¤   ¤   ¤   if( IsntPGPError( err ) )
c1f776 ¤   ¤   ¤   {
650c9b ¤   ¤   ¤   ¤   err = passphraseGrafPortView->DoDialog();
83a3a6 ¤   ¤   ¤   }
5a87c7 ¤   ¤   ¤
--fd75 0012d1b77f140120292 Page 4 of PGPPassphraseDialog.cp
d0f5b2 ¤   ¤   ¤   delete( passphraseGrafPortView );
f4abfb ¤   ¤   ¤   DisposeDialog( theDialog );
5a0fe4 ¤   ¤   }
b60e1d ¤   ¤   else
c45b34 ¤   ¤   {
edb90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
4d0fe4 ¤   ¤   }
989371 ¤   }
101b52 ¤   ¤
40b1b4 ¤   ExitPGPsdkUILib( &state );
9967c5 ¤
e2deb7 ¤   return( err );
e8efe6 }
a5af5a
0dc744 ¤   PGPError
abff16 pgpDecryptionPassphraseDialogPlatform(
828d3c ¤   PGPContextRef¤  ¤   ¤   ¤   ¤   ¤   ¤   context,
6d5a04 ¤   CPGPDecryptionPassphraseDialogOptions ¤ *options)
eebb36 {
9b95be ¤   PGPsdkUILibState¤   state;
2d8f52 ¤   PGPError¤   ¤   ¤   err;
9167c5 ¤
faa91d ¤   PGPValidatePtr( options );
0e67c5 ¤
3f5fc2 ¤   err = EnterPGPsdkUILib( context, &state );
fdb1f0 ¤   if( IsntPGPError( err ) )
23c7a1 ¤   {
0df294 ¤   ¤   DialogRef¤  theDialog;
e81b52 ¤   ¤
b99193 ¤   ¤   RegisterClass_( CPGPDecryptionPassphraseGrafPortView );
672f6b ¤   ¤   RegisterClass_( CPGPRecipientTable );
4d1b52 ¤   ¤
1fdb6a ¤   ¤   // Create standard Macintosh window and overlay PowerPlant onto it
120ef9 ¤   ¤   theDialog = CPGPSigningPassphraseGrafPortView::CreateDialog(
ed99c7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPDecryptionPassphraseDialogID );
060e84 ¤   ¤   if( IsntNull( theDialog ) )
a75b34 ¤   ¤   {
6e8399 ¤   ¤   ¤   CPGPDecryptionPassphraseGrafPortView¤   *passphraseGrafPortView;
971b52 ¤   ¤
38e321 ¤   ¤   ¤   passphraseGrafPortView = (CPGPDecryptionPassphraseGrafPortView *)
03dc47 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetWRefCon( theDialog );
6ff71e ¤   ¤   ¤   pgpAssertAddrValid( passphraseGrafPortView, VoidAlign );
3baf5a
9ebf47 ¤   ¤   ¤   err = passphraseGrafPortView->SetOptions( context, options );
62698b ¤   ¤   ¤   if( IsntPGPError( err ) )
96f776 ¤   ¤   ¤   {
dd0c9b ¤   ¤   ¤   ¤   err = passphraseGrafPortView->DoDialog();
f3a3a6 ¤   ¤   ¤   }
9687c7 ¤   ¤   ¤
a1f5b2 ¤   ¤   ¤   delete( passphraseGrafPortView );
1eabfb ¤   ¤   ¤   DisposeDialog( theDialog );
530fe4 ¤   ¤   }
c20e1d ¤   ¤   else
2e5b34 ¤   ¤   {
04b90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
ae0fe4 ¤   ¤   }
6c9371 ¤   }
a11b52 ¤   ¤
deb1b4 ¤   ExitPGPsdkUILib( &state );
7f67c5 ¤
e5deb7 ¤   return( err );
f1efe6 }
5daf5a
55af5a
9eaf5a
f4af5a
19af5a
2daf5a
--395f 000d95ce6fe40120293 Page 1 of PGPRecipientDialog.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
48f616 ¤   $Id: PGPRecipientDialog.cp,v 1.22.10.1 1998/11/12 03:21:00 heller Exp $
61f7f7 ____________________________________________________________________________*/
e7af5a
23dd56 #include <PP_Messages.h>
ac7c99 #include <URegistrar.h>
10af5a
6c85c2 #include "MacStrings.h"
8e0d08 #include "pgpMem.h"
25af5a
f3204e #include "CPGPRecipientGrafPort.h"
05cc06 #include "pgpDialogs.h"
effaae #include "PGPsdkUILibDialogs.h"
e49fda #include "PGPsdkUILibUtils.h"
80af5a
b32cb7 const ResIDT kPGPRecipientDialogID = 4747;
74af5a
66af5a
1ac744 ¤   PGPError
440a0a pgpRecipientDialogPlatform(
42883c ¤   PGPContextRef¤  ¤   ¤   ¤   context,
063fb0 ¤   CPGPRecipientDialogOptions ¤*options)
8ebb36 {
6095be ¤   PGPsdkUILibState¤   state;
088f52 ¤   PGPError¤   ¤   ¤   err;
8967c5 ¤
a5a91d ¤   PGPValidatePtr( options );
1067c5 ¤
db5fc2 ¤   err = EnterPGPsdkUILib( context, &state );
bab1f0 ¤   if( IsntPGPError( err ) )
31c7a1 ¤   {
7ef294 ¤   ¤   DialogRef¤  theDialog;
ad1b52 ¤   ¤
4eb499 ¤   ¤   RegisterClass_( CPGPRecipientGrafPortView );
c51b52 ¤   ¤
c0db6a ¤   ¤   // Create standard Macintosh window and overlay PowerPlant onto it
b007d2 ¤   ¤   theDialog = CPGPRecipientGrafPortView::CreateDialog(
cb1fdf ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPRecipientDialogID );
870e84 ¤   ¤   if( IsntNull( theDialog ) )
9b5b34 ¤   ¤   {
a49324 ¤   ¤   ¤   CPGPRecipientGrafPortView¤  *grafPortView;
e2dc60 ¤   ¤   ¤   PGPBoolean¤ ¤   ¤   ¤   ¤   showDialog;
e687c7 ¤   ¤   ¤
4b13b2 ¤   ¤   ¤   grafPortView = (CPGPRecipientGrafPortView *)
b75602 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   GetWRefCon( theDialog );
098706 ¤   ¤   ¤   pgpAssertAddrValid( grafPortView, VoidAlign );
db87c7 ¤   ¤   ¤
9ab024 ¤   ¤   ¤   err = grafPortView->SetOptions( context, options, &showDialog );
66698b ¤   ¤   ¤   if( IsntPGPError( err ) )
faf776 ¤   ¤   ¤   {
dddf35 ¤   ¤   ¤   ¤   if( showDialog )
7b72c3 ¤   ¤   ¤   ¤   {
a525ec ¤   ¤   ¤   ¤   ¤   err = grafPortView->DoDialog();
e92613 ¤   ¤   ¤   ¤   }
54fa07 ¤   ¤   ¤   ¤   else
3972c3 ¤   ¤   ¤   ¤   {
e7164f ¤   ¤   ¤   ¤   ¤   grafPortView->HandleMessage( msg_OK );
0d2613 ¤   ¤   ¤   ¤   }
84a3a6 ¤   ¤   ¤   }
9487c7 ¤   ¤   ¤
a8a502 ¤   ¤   ¤   delete( grafPortView );
80abfb ¤   ¤   ¤   DisposeDialog( theDialog );
180fe4 ¤   ¤   }
7e0e1d ¤   ¤   else
f75b34 ¤   ¤   {
31b90c ¤   ¤   ¤   err = kPGPError_OutOfMemory;
000fe4 ¤   ¤   }
c79371 ¤   }
d91b52 ¤   ¤
--7617 0019327369b40120293 Page 2 of PGPRecipientDialog.cp
88b1b4 ¤   ExitPGPsdkUILib( &state );
9867c5 ¤
09deb7 ¤   return( err );
56efe6 }
43af5a
e9c744 ¤   PGPError
1758d0 pgpGetMissingRecipientKeyIDStringPlatform(
0e520e ¤   PGPContextRef¤  context,
16e337 ¤   const PGPKeyID¤ *keyID,
c57125 ¤   char¤   ¤   ¤   keyIDString[256])
32bb36 {
0161e0 ¤   PGPError¤   err;
7c67c5 ¤
836d02 ¤   (void) context;
1f67c5 ¤
0a591f ¤   err = PGPGetKeyIDString( keyID, kPGPKeyIDString_Abbreviated, keyIDString );
1ab1f0 ¤   if( IsntPGPError( err ) )
4cc7a1 ¤   {
244f60 ¤   ¤   Str255¤ pString;
104744 ¤   ¤   Str255¤ tempStr;
cb1b52 ¤   ¤
3b1b68 ¤   ¤   CToPString( keyIDString, tempStr );
890830 ¤   ¤   GetIndString( pString, kPGPLibDialogsStringListResID,
e2a1ed ¤   ¤   ¤   ¤   kUnknownKeyIDStrIndex );
3ad7e6 ¤   ¤   PrintPString( pString, pString, tempStr );
c0cf93 ¤   ¤   PToCString( pString, keyIDString );
ad9371 ¤   }
7567c5 ¤
0cdeb7 ¤   return( err );
93be43 }¶
--8832 001c82ad38c40120294 Page 1 of PGPsdkUILibCommon.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
d9af5a
2be393 ¤   $Id: PGPsdkUILibCommon.h,v 1.3.10.1 1998/11/12 03:21:01 heller Exp $
09f7f7 ____________________________________________________________________________*/
cbaf5a
147b7d #pragma once
33af5a
bb3379 #ifdef __cplusplus
2f3c47 ¤   #if __POWERPC__¤
1758dc ¤   ¤   #include "MacHeadersPPC++"
fbbdd3 ¤   #elif __CFM68K__
59d916 ¤   ¤   #include "MacHeadersCFM68K++"
98b7ec ¤   #endif
9bdb21 #else
cd3c47 ¤   #if __POWERPC__¤
ea5f28 ¤   ¤   #include "MacHeadersPPC"
4ebdd3 ¤   #elif __CFM68K__
ceec15 ¤   ¤   #include "MacHeadersCFM68K"
b5b7ec ¤   #endif
c17454 #endif
d9af5a
b2e399 #include <Sound.h>¤ /* Needed for LTextEditView.cp */
58af5a
7f9789 /* Common flags: */
3279b0 #define UNFINISHED_CODE_ALLOWED¤¤   1
e9af5a
7a5a25 #define USE_MAC_DEBUG_PATCHES¤  ¤   0
41af5a
8a0db7 #define USE_MAC_DEBUG_TRAPS¤¤   ¤   PGP_DEBUG
aaa6c2 #define USE_MAC_DEBUG_LEAKS¤¤   ¤   PGP_DEBUG
afaf5a
09a662 #define USE_PGP_LEAKS¤  ¤   ¤   ¤   PGP_DEBUG
815cb8 #define PGP_DEBUG_FIND_LEAKS¤   ¤   PGP_DEBUG
42af5a
cee6ba #define USE_PGP_OPERATOR_NEW¤   ¤   1
d9af5a
79ae08 #define PGP_MACINTOSH¤  ¤   ¤   ¤   1
e3af5a
56bea2 #define MSL_USE_PRECOMPILED_HEADERS¤0
7caf5a
7c90e3 /* Common headers: */
d1af5a
548985 #include "ansi_prefix.mac.h"
53af5a
d8e2ff #include "pgpConfig.h"
c146ad #include "MacDebug.h"
62af5a
3a24ea #define CreateRootControl¤  PGPCreateRootControl
c85286 #include "MacDialogs.h"
--95e5 0010eaa1bd940120295 Page 1 of PGPsdkUILibDebugHeader.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
d9af5a
4f2d5b ¤   $Id: PGPsdkUILibDebugHeader.prefix,v 1.1.14.1 1998/11/12 03:21:02 heller Ex¶
56b277 p $
9ff7f7 ____________________________________________________________________________*/
5aaf5a
d863de #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   1¤  /* 1 is on, 0 off */
d9af5a
3e093f #define Debug_Throw¤¤   ¤   ¤   ¤   1¤  /* PowerPlant debugging */
61a696 #define Debug_Signal¤   ¤   ¤   ¤   1¤  /* PowerPlant debugging */
abaf5a
0e4474 #include "PGPsdkUILibCommon.h"
--d710 000d517ecc840120296 Page 1 of PGPsdkUILibDialogs.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
076d44 ¤   $Id: PGPsdkUILibDialogs.cp,v 1.5.12.1 1998/11/12 03:21:02 heller Exp $
0df7f7 ____________________________________________________________________________*/
d1af5a
2c6c79 #include <Gestalt.h>
e24d37 #include <LowMem.h>
c384be #include <Sound.h>
e0af5a
ab05c6 #include <LStaticText.h>
cbdd56 #include <PP_Messages.h>
c78f92 #include <UGAColorRamp.h>
ee67c5 ¤
ba426a #include "MacDebugLeaks.h"
308bd8 #include "MacEnvirons.h"
ef0d08 #include "pgpMem.h"
8485c2 #include "MacStrings.h"
a1af5a
aefcb1 #include "CPGPModalGrafPortView.h"
3efaae #include "PGPsdkUILibDialogs.h"
2baf5a
2eaf5a
ae3d20 ¤   static MessageT
149208 PGPUIWarningAlertInternal(
28b176 ¤   ResIDT¤ ¤   ¤   ¤   dialogResID,
bf428f ¤   ConstStr255Param¤   string)
58bb36 {
fcd8a0 ¤   MessageT¤   ¤   dismissMessage = msg_Nothing;
7c3a69 ¤   GrafPtr¤¤   ¤   savePort;
8c5d69 ¤   DialogRef¤  ¤   warnDialog;
2567c5 ¤
cbf732 ¤   GetPort( &savePort );
9867c5 ¤
900bc1 ¤   // Create standard Macintosh window and overlay PowerPlant onto it
e746e5 ¤   warnDialog = CPGPModalGrafPortView::CreateDialog( dialogResID);
cc3ef2 ¤   if( IsntNull( warnDialog ) )
6fc7a1 ¤   {
9dd94c ¤   ¤   CPGPModalGrafPortView¤  *warnGrafPortView;
951b52 ¤   ¤
ec6c48 ¤   ¤   warnGrafPortView = (CPGPModalGrafPortView *) GetWRefCon( warnDialog );
b81b52 ¤   ¤
632919 ¤   ¤   if ( IsntNull( string ) )
d65b34 ¤   ¤   {
ab0a5d ¤   ¤   ¤   LStaticText *¤  caption¤= NULL;
4087c7 ¤   ¤   ¤
8c5a36 ¤   ¤   ¤   #define kMessagePaneID¤ 'cMSG'
a087c7 ¤   ¤   ¤
965158 ¤   ¤   ¤   caption¤= (LStaticText *) warnGrafPortView->FindPaneByID(
00ef59 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMessagePaneID );
8de242 ¤   ¤   ¤   if ( IsntNull( caption ) )
d5f776 ¤   ¤   ¤   {
c6c9df ¤   ¤   ¤   ¤   caption->SetDescriptor( string );
7ca3a6 ¤   ¤   ¤   }
3b0fe4 ¤   ¤   }
bf1b52 ¤   ¤
2db331 ¤   ¤   (void) warnGrafPortView->DoDialog();
551b52 ¤   ¤
d8258c ¤   ¤   dismissMessage = warnGrafPortView->GetDismissMessage();
371b52 ¤   ¤
662f0d ¤   ¤   delete warnGrafPortView;
c4a835 ¤   ¤   DisposeDialog( warnDialog );
d59371 ¤   }
6d0e24 ¤   else
e8c7a1 ¤   {
e8b803 ¤   ¤   pgpDebugMsg( "PGPUIWarningAlert(): Failed to get dialog" );
f69bd8 ¤   ¤   dismissMessage = msg_Nothing;
209371 ¤   }
8667c5 ¤
776d1e ¤   SetPort( savePort );
d5af5a
--486f 00014f95d0c40120296 Page 2 of PGPsdkUILibDialogs.cp
786552 ¤   return( dismissMessage );
27efe6 }
90af5a
3ae268 #if 0¤  // Keep
b13d20 ¤   static MessageT
049208 PGPUIWarningAlertInternal(
90b176 ¤   ResIDT¤ ¤   ¤   ¤   dialogResID,
0d428f ¤   ConstStr255Param¤   string)
5bbb36 {
2dd8a0 ¤   MessageT¤   ¤   dismissMessage = msg_Nothing;
943a69 ¤   GrafPtr¤¤   ¤   savePort;
94a07e ¤   Boolean¤¤   ¤   showPPAlert = TRUE;
8c67c5 ¤
b3f732 ¤   GetPort( &savePort );
711b52 ¤   ¤
1a3ae5 ¤   if( HaveAppearanceMgr() &&
644977 ¤   ¤   ( dialogResID == kPGPUIGenericOKCancelAlert ||
a051ae ¤   ¤   ¤   dialogResID == kPGPUIGenericOKAlert ) )
55c7a1 ¤   {
ac1915 ¤   ¤   AlertStdAlertParamRec¤  alertParams;
9d16fa ¤   ¤   SInt16¤ ¤   ¤   ¤   ¤   itemHit;
171b52 ¤   ¤
8207e7 ¤   ¤   pgpClearMemory( &alertParams, sizeof( alertParams ) );
ff1b52 ¤   ¤
329abd ¤   ¤   alertParams.defaultText¤¤   = (StringPtr) kAlertDefaultOKText;
fb1074 ¤   ¤   alertParams.defaultButton¤  = kAlertStdAlertOKButton;
987073 ¤   ¤   alertParams.position¤   ¤   = kWindowAlertPositionMainScreen;
0a1b52 ¤   ¤
9ac39c ¤   ¤   if( dialogResID == kPGPUIGenericOKCancelAlert )
a75b34 ¤   ¤   {
c161de ¤   ¤   ¤   alertParams.cancelText¤ ¤   =(StringPtr) ·kAlertDefaultCancelText;
37d245 ¤   ¤   ¤   alertParams.cancelButton¤   = kAlertStdAlertCancelButton;
ea0fe4 ¤   ¤   }
c2af5a
cd8214 ¤   ¤   if( StandardAlert( kAlertCautionAlert, (StringPtr) string, NULL,
034284 ¤   ¤   ¤   ¤   ¤   &alertParams, &itemHit ) == noErr )
a65b34 ¤   ¤   {
4410d2 ¤   ¤   ¤   showPPAlert = FALSE;
2a0fe4 ¤   ¤   }
072b85 ¤   ¤   ¤   ¤
d028ab ¤   ¤   if( itemHit == kAlertStdAlertOKButton )
dc5b34 ¤   ¤   {
a616e1 ¤   ¤   ¤   dismissMessage = msg_OK;
610fe4 ¤   ¤   }
6f0e1d ¤   ¤   else
235b34 ¤   ¤   {
1e44f7 ¤   ¤   ¤   dismissMessage = msg_Cancel;
290fe4 ¤   ¤   }
bf9371 ¤   }
9267c5 ¤
47d743 ¤   if( showPPAlert )
7ac7a1 ¤   {
a6d695 ¤   ¤   DialogRef¤  ¤   warnDialog;
f51b52 ¤   ¤
ebdb6a ¤   ¤   // Create standard Macintosh window and overlay PowerPlant onto it
c90892 ¤   ¤   warnDialog = CPGPModalGrafPortView::CreateDialog( dialogResID);
35039a ¤   ¤   if( IsntNull( warnDialog ) )
375b34 ¤   ¤   {
99c86b ¤   ¤   ¤   CPGPModalGrafPortView¤  *warnGrafPortView;
9287c7 ¤   ¤   ¤
dccc05 ¤   ¤   ¤   warnGrafPortView = (CPGPModalGrafPortView *) GetWRefCon(
0d13b1 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   warnDialog );
6087c7 ¤   ¤   ¤
43c66a ¤   ¤   ¤   if ( IsntNull( string ) )
81f776 ¤   ¤   ¤   {
a7120d ¤   ¤   ¤   ¤   LStaticText *¤  caption¤= NULL;
772b85 ¤   ¤   ¤   ¤
becbae ¤   ¤   ¤   ¤   #define kMessagePaneID¤ 'cMSG'
732b85 ¤   ¤   ¤   ¤
cd47ee ¤   ¤   ¤   ¤   caption¤= (LStaticText *) warnGrafPortView->FindPaneByID(
024158 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kMessagePaneID );
14ec0e ¤   ¤   ¤   ¤   if ( IsntNull( caption ) )
--59b9 000d78deab840120296 Page 3 of PGPsdkUILibDialogs.cp
d072c3 ¤   ¤   ¤   ¤   {
eb67de ¤   ¤   ¤   ¤   ¤   caption->SetDescriptor( string );
0d2613 ¤   ¤   ¤   ¤   }
a1a3a6 ¤   ¤   ¤   }
f587c7 ¤   ¤   ¤
b8e1ac ¤   ¤   ¤   (void) warnGrafPortView->DoDialog();
a487c7 ¤   ¤   ¤
4f18e2 ¤   ¤   ¤   dismissMessage = warnGrafPortView->GetDismissMessage();
7787c7 ¤   ¤   ¤
0c1265 ¤   ¤   ¤   delete warnGrafPortView;
74add8 ¤   ¤   ¤   DisposeDialog( warnDialog );
570fe4 ¤   ¤   }
350e1d ¤   ¤   else
ca5b34 ¤   ¤   {
64f674 ¤   ¤   ¤   pgpDebugMsg( "PGPUIWarningAlert(): Failed to get dialog" );
bba736 ¤   ¤   ¤   dismissMessage = msg_Nothing;
2e0fe4 ¤   ¤   }
d11b52 ¤   ¤
389371 ¤   }
3d67c5 ¤
d46d1e ¤   SetPort( savePort );
1e67c5 ¤
bd6552 ¤   return( dismissMessage );
ecefe6 }
797454 #endif
68af5a
a7af5a
f79cb9 ¤   MessageT
189b02 PGPUIWarningAlert(ResIDT dialogResID)
3abb36 {
6bb5dd ¤   return( PGPUIWarningAlertInternal( dialogResID, NULL ) );
0fefe6 }
86af5a
3baf5a
e9af5a
aa9cb9 ¤   MessageT
c32943 PGPUIWarningAlert(
a8b176 ¤   ResIDT¤ ¤   ¤   ¤   dialogResID,
edaab3 ¤   ConstStr255Param¤   baseString,
92b242 ¤   ConstStr255Param¤   str1,
e95d26 ¤   ConstStr255Param¤   str2,
f75b70 ¤   ConstStr255Param¤   str3 )
7fbb36 {
fe2e6d ¤   Str255¤ ¤   msg;
9a67c5 ¤
88e2fd ¤   InsertPStrings( baseString, str1, str2, str3, msg );
6467c5 ¤
71cdb3 ¤   return( PGPUIWarningAlertInternal( dialogResID, msg ) );
cfefe6 }
d5af5a
44af5a
ef67c5 ¤
599cb9 ¤   MessageT
e52943 PGPUIWarningAlert(
5ab176 ¤   ResIDT¤ ¤   ¤   ¤   dialogResID,
d79228 ¤   ResID¤  ¤   ¤   ¤   stringListResID,
d21a16 ¤   short¤  ¤   ¤   ¤   stringListIndex,
aab242 ¤   ConstStr255Param¤   str1,
0c3973 ¤   ConstStr255Param¤   str2 ,
eb5b70 ¤   ConstStr255Param¤   str3 )
a1bb36 {
8f5679 ¤   Str255¤ ¤   baseString;
792e6d ¤   Str255¤ ¤   msg;
7a67c5 ¤
95ef9b ¤   GetIndString( baseString, stringListResID, stringListIndex );
e7e2fd ¤   InsertPStrings( baseString, str1, str2, str3, msg );
2e67c5 ¤
a8cdb3 ¤   return( PGPUIWarningAlertInternal( dialogResID, msg ) );
59efe6 }
5daf5a
80af5a
d7af5a
--4467 0011640d0f340120296 Page 4 of PGPsdkUILibDialogs.cp
e0af5a
1aaf5a
17af5a
78af5a
32af5a
93af5a
37af5a
a6af5a
33af5a
24af5a
c6af5a
2caf5a
16af5a
--a5b1 000262d85b140120297 Page 1 of PGPsdkUILibDialogs.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
4e6aba ¤   $Id: PGPsdkUILibDialogs.h,v 1.12.10.1 1998/11/12 03:21:03 heller Exp $
36f7f7 ____________________________________________________________________________*/
44af5a
027b7d #pragma once
d4af5a
c6c20d #include <Dialogs.h>
c7af5a
9b28cd #include <PP_Types.h>
91af5a
600438 #include "MacBasics.h"
e0e82c #include "pgpPubTypes.h"
e5c2ae #include "pgpGroups.h"
4ae8b2 #include "pflPrefs.h"
52fdf0 #include "WarningAlertTypes.h"
90af5a
d179ef const ResID¤¤   kPGPLibDialogsStringListResID¤  = 4747;
62af5a
207353 enum
e2bb36 {
40e1e3 ¤   kPrivateKeyPopupFormatStrIndex¤ = 1,
5648f2 ¤   kRSAAlgorithmStringIndex,
5d1658 ¤   kDSAAlgorithmStringIndex,
dd0770 ¤   kUnknownAlgorithmStringIndex,
3eab00 ¤   kNoSigningKeysFoundStrIndex,
1767c5 ¤
1e6f9e ¤   kConfirmMatchingKeyStrIndex,
336838 ¤   kConvEncryptionPassphraseNotConfirmedStrIndex,
8867c5 ¤
745574 ¤   kDSSDHKeySizeFormatStrIndex,
dd8d56 ¤   kNumGroupKeysFormatStrIndex,
888f98 ¤   kNumMissingGroupKeysFormatStrIndex,
b567c5 ¤
226109 ¤   kKeyADKNotFoundErrorStrIndex,
433326 ¤   kKeyADKNotFoundWarningStrIndex,
cf8d53 ¤   kGroupADKNotFoundErrorStrIndex,
1930c3 ¤   kGroupADKNotFoundWarningStrIndex,
df67c5 ¤
04487d ¤   kUnknownRecipientStrIndex,
1f677c ¤   kXUnknownRecipientsStrIndex,
6067c5 ¤
c4ac6d ¤   kRemoveADKViolatesPolicyStrIndex,
8b6d57 ¤   kIncorrectPassphraseStrIndex,
2e67c5 ¤
db385b ¤   kKeyServerConnectingStrIndex,
e936c1 ¤   kKeyServerSearchingStrIndex,
bb3e88 ¤   kKeyServerProcessingStrIndex,
17b02d ¤   kKeyServerSendingStrIndex,
365994 ¤   kKeyServerDeletingSendingStrIndex,
883e40 ¤   kKeyServerDisablingSendingStrIndex,
226d28 ¤   kKeyServerClosingSendingStrIndex,
3c67c5 ¤
c48e6c ¤   kNoDecryptionKeysFoundStrIndex,
8b5363 ¤   kUnknownKeyIDStrIndex
d582f7 };
32af5a
d40cb7 #define kPGPUIGenericOKCancelAlert¤ ¤   (ResIDT)4755
a0a61f #define kPGPUIGenericOKAlert¤   ¤   ¤   (ResIDT)4756
5eaf5a
c53fab MessageT¤   ¤   PGPUIWarningAlert( ResIDT dialogResID);
caaf5a
6508aa MessageT¤   ¤   PGPUIWarningAlert(
ce51ef ¤   ¤   ¤   ¤   ¤   ResIDT dialogResID,
b1f6cd ¤   ¤   ¤   ¤   ¤   ConstStr255Param message, ConstStr255Param str1 = NULL,
e54dab ¤   ¤   ¤   ¤   ¤   ConstStr255Param str2=NULL, ConstStr255Param str3 = NULL);
8367c5 ¤
e408aa MessageT¤   ¤   PGPUIWarningAlert(
b051ef ¤   ¤   ¤   ¤   ¤   ResIDT dialogResID,
268cfb ¤   ¤   ¤   ¤   ¤   ResID stringListResID, short stringListIndex,
--efc5 00175fc89a740120297 Page 2 of PGPsdkUILibDialogs.h
56e17e ¤   ¤   ¤   ¤   ¤   ConstStr255Param str1 = NULL,
e49517 ¤   ¤   ¤   ¤   ¤   ConstStr255Param str2 = NULL,
7508a7 ¤   ¤   ¤   ¤   ¤   ConstStr255Param str3 = NULL);
--a299 001a063c5bd40120298 Page 1 of PGPsdkUILibHeader.prefix
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
d9af5a
473a19 ¤   $Id: PGPsdkUILibHeader.prefix,v 1.1.14.1 1998/11/12 03:21:04 heller Exp $
8af7f7 ____________________________________________________________________________*/
f3af5a
a767a5 #define PGP_DEBUG¤  ¤   ¤   ¤   ¤   0¤  /* 1 is on, 0 off */
59af5a
c338e5 /*
c5069c ** Note: Do NOT define the PP symbols Debug_Throw or Debug_Signal here as
50636b ** PP does #ifdef checking of the symbol, not #if
b47fe0 */
20af5a
a04474 #include "PGPsdkUILibCommon.h"
--1911 0001335425e40120299 Page 1 of PGPsdkUILibInitAndTerm.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
d9af5a
505da2 ¤   $Id: PGPsdkUILibInitAndTerm.cp,v 1.1.14.1 1998/11/12 03:21:05 heller Exp $
0bf7f7 ____________________________________________________________________________*/
9caf5a
cee2ff #include "pgpConfig.h"
c2af5a
c38f22 #include <CodeFragments.h>
946c79 #include <Gestalt.h>
29af5a
980438 #include "MacBasics.h"
1b9fda #include "PGPsdkUILibUtils.h"
eea146 #include "pgpDebug.h"
2b0d08 #include "pgpMem.h"
44af5a
e199c6 PGP_BEGIN_C_DECLARATIONS
09af5a
e3722c pascal OSErr ¤  INIT_PGPsdkUILib(CFragInitBlock *initBlock);
a6c89f pascal void¤¤   TERM_PGPsdkUILib(void);
0daf5a
5313d1 pascal OSErr __initialize(const CFragInitBlock *theInitBlock);
33b65c pascal OSErr __terminate(void);
01af5a
cf1254 PGP_END_C_DECLARATIONS
5eaf5a
26d5a4 /* Disable 68020 code generation for the 68020 check itself */
056b23 #if GENERATING68K
ab8d08 ¤   #pragma code68020 off
7b7454 #endif
4caf5a
6248f4 ¤   pascal OSErr
9d8fb2 INIT_PGPsdkUILib(CFragInitBlock *initBlock)
9abb36 {
60baed ¤   long¤   gestaltResult;
779c1a ¤   OSErr¤  err = noErr;
b467c5 ¤
0bd8af ¤   /*
d2896a ¤   ** Check for a 68020 or later processor and bail immediately if
e5dcce ¤   ** none is available. It is assumed that all clients of this
bb540a ¤   ** library are doing a similar chack and refusing to run.
439faa ¤   */
4e67c5 ¤
2fc3ca ¤   if( Gestalt( gestaltProcessorType, &gestaltResult ) == noErr &&
4f8237 ¤   ¤   gestaltResult >= gestalt68020 )
f3c7a1 ¤   {
a2a3e8 ¤   ¤   err = __initialize( initBlock );
a1da5e ¤   ¤   if( IsntErr( err ) )
675b34 ¤   ¤   {
8f7aad ¤   ¤   ¤   /*
a811a2 ¤   ¤   ¤   ** Remember the FSSpec of the library file se we can open it's
7f202e ¤   ¤   ¤   ** resource fork later.
853da8 ¤   ¤   ¤   */
1287c7 ¤   ¤   ¤
004814 ¤   ¤   ¤   if( IsntNull( initBlock ) )
7ff776 ¤   ¤   ¤   {
9cda41 ¤   ¤   ¤   ¤   err = SetLibraryFSSpec(
7ed5bb ¤   ¤   ¤   ¤   ¤   initBlock->fragLocator.u.onDisk.fileSpec );
72a3a6 ¤   ¤   ¤   }
adbb8c ¤   ¤   ¤   else
c2f776 ¤   ¤   ¤   {
eb7177 ¤   ¤   ¤   ¤   /* Actual error is not important here */
062b85 ¤   ¤   ¤   ¤
f657c6 ¤   ¤   ¤   ¤   pgpDebugMsg( "INIT_PGPsdkUILib: No initBlock" );
0b976c ¤   ¤   ¤   ¤   err = -1;
59a3a6 ¤   ¤   ¤   }
770fe4 ¤   ¤   }
f5af5a
6e6f11 ¤   ¤   pgpLeaksBeginSession( "PGPsdkUILib" );
699371 ¤   }
1367c5 ¤
--4eb2 0015c23573140120299 Page 2 of PGPsdkUILibInitAndTerm.cp
ce99a2 ¤   pgpAssert( err == noErr );
95af5a
6ddeb7 ¤   return( err );
d0efe6 }
36af5a
6c6685 ¤   pascal void
779696 TERM_PGPsdkUILib(void)
edbb36 {
d3baed ¤   long¤   gestaltResult;
23af5a
93c3ca ¤   if( Gestalt( gestaltProcessorType, &gestaltResult ) == noErr &&
008237 ¤   ¤   gestaltResult >= gestalt68020 )
c7c7a1 ¤   {
2c5bc9 ¤   ¤   pgpLeaksEndSession();
959371 ¤   }
4a67c5 ¤
7c4a4b ¤   __terminate();
feefe6 }
89af5a
996b23 #if GENERATING68K
47210c ¤   #pragma code68020 reset
627454 #endif
efaf5a
0faf5a
54af5a
33af5a
f5af5a
b67e4d /*__Editor_settings____
a3af5a
054126 ¤   Local Variables:
6a7b17 ¤   tab-width: 4
fd0e6c ¤   End:
ed5f8c ¤   vi: ts=4 sw=4
699e9b ¤   vim: si
5cd062 _____________________*/
--d798 0004b53383c4012029a Page 1 of PGPsdkUILibUtils.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
7e292d ¤   $Id: PGPsdkUILibUtils.cp,v 1.18.10.1 1998/11/12 03:21:05 heller Exp $
75f7f7 ____________________________________________________________________________*/
d8af5a
354d37 #include <LowMem.h>
1eaf5a
9ea4c1 #include <LGAFocusBorder.h>
8710f5 #include <LGrafPortView.h>
ae10f0 #include <LStdScrollBarImp.h>
ca7e73 #include <LTabGroup.h>
60dd56 #include <PP_Messages.h>
80902e #include <UAttachments.h>
117e6d #include <UDrawingState.h>
158f92 #include <UGAColorRamp.h>
bc4b3b #include <UEnvironment.h>
1dffe3 #include <UGraphicUtils.h>
0c7c99 #include <URegistrar.h>
80af5a
fcc38f // Appearance classes
178708 #include <LCheckBox.h>
637c09 #include <LEditText.h>
2376ae #include <LIconControl.h>
460aae #include <LPopupButton.h>
db49f7 #include <LProgressBar.h>
d5d797 #include <LPushButton.h>
9d62c6 #include <LScrollBar.h>
ea7304 #include <LScrollerView.h>
f805c6 #include <LStaticText.h>
22a94f #include <LTextGroupBox.h>
3df1ac #include <LWindowHeader.h>
c1af5a
4aa055 // Appearance Manager Implementations
7ffd90 #include <LAMControlImp.h>
0734b5 #include <LAMPopupButtonImp.h>
d7ef3e #include <LAMPushButtonImp.h>
225a8a #include <LAMStaticTextImp.h>
8ca389 #include <LAMTrackActionImp.h>
70e64c #include <LAMWindowHeaderImp.h>
e6af5a
86d386 // Grayscale Implementations
9086bb #include <LGACheckboxImp.h>
97e872 #include <LGAEditTextImp.h>
5d590d #include <LGAIconControlImp.h>
51739a #include <LGAProgressBarImp.h>
94985b #include <LGAPushButtonImp.h>
2e2def #include <LGAStaticTextImp.h>
2d016b #include <LGATextGroupBoxImp.h>
c7fa99 #include <LGAWindowHeaderImp.h>
60af5a
ef0438 #include "MacBasics.h"
ac46ad #include "MacDebug.h"
468bd8 #include "MacEnvirons.h"
0b76b7 #include "MacErrors.h"
77bbf4 #include "MacFiles.h"
36e8b2 #include "pflPrefs.h"
a6c5d5 #include "pgpBase.h"
a4a146 #include "pgpDebug.h"
760d08 #include "pgpMem.h"
19afa7 #include "pgpPassphraseUtils.h"
16e684 #include "pgpUserInterface.h"
d0aa66 #include "PowerPlantLeaks.h"
e1af5a
5376f0 #include "CComboError.h"
53829c #include "CPassphraseEdit.h"
7ee213 #include "CPGPAMEditTextImp.h"
026915 #include "CPGPGAPopupButtonImp.h"
abfcb1 #include "CPGPModalGrafPortView.h"
0efe54 #include "CPrivateKeysPopup.h"
4b1f02 #include "CUserIDTable.h"
--6343 000135674fc4012029a Page 2 of PGPsdkUILibUtils.cp
059fda #include "PGPsdkUILibUtils.h"
44cc06 #include "pgpDialogs.h"
5deb5b #include "pgpKeyServer.h"
6caf5a
08f660 static FSSpec¤  ¤   sLibraryFileSpec¤   ¤   = {0, };
021ce3 static long¤¤   ¤   sLibraryFileID¤ ¤   ¤   = 0;
0c87d8 static short¤   ¤   sLibraryFileRefNum¤ ¤   = -1;
9639d9 static PGPUInt32¤   sLibraryFileRefCount¤   = 0;
03af5a
56e6b4 class CSysFileAMControlImp : public LAMControlImp
febb36 {
8e5ed4 public:
acaf5a
754e1a ¤   enum { class_ID = 'SFCI' };
88af5a
239f0b ¤   ¤   ¤   ¤   ¤   CSysFileAMControlImp(LStream *inStream = nil);
103895 ¤   virtual¤¤   ¤   ~CSysFileAMControlImp();
7eaf5a
20a2d3 protected:
4daf5a
e61846 ¤   virtual void¤   MakeMacControl(ConstStringPtr inTitle, Int32 inRefCon);
3d82f7 };
b7af5a
af5fd8 CSysFileAMControlImp::CSysFileAMControlImp(LStream *inStream) :
e93dae ¤   LAMControlImp( inStream )
e4bb36 {
b8efe6 }
bbaf5a
d3d5ee CSysFileAMControlImp::~CSysFileAMControlImp(void)
f6bb36 {
08efe6 }
08af5a
8e6d52 ¤   void
7a231c CSysFileAMControlImp::MakeMacControl(
810498 ¤   ConstStringPtr ¤inTitle,
159222 ¤   Int32 ¤ ¤   ¤   inRefCon)
29bb36 {
f63ba2 ¤   short¤  saveResFile;
7c67c5 ¤
d5ba16 ¤   saveResFile = CurResFile();
14ab3a ¤   UseResFile( 2 );
9767c5 ¤
497355 ¤   LAMControlImp::MakeMacControl( inTitle, inRefCon );
8767c5 ¤
e060a3 ¤   UseResFile( saveResFile );
80efe6 }
73af5a
a633c8 ¤   static void
9dc8cc RegisterPowerPlantClasses(void)
4ebb36 {
338ab7 ¤   RegisterClass_( LBorderAttachment );
e846ab ¤   RegisterClass_( LColorEraseAttachment );
c69725 ¤   RegisterClass_( LGAFocusBorder );
6ef3bf ¤   RegisterClass_( LGrafPortView );
c87e8d ¤   RegisterClass_( LPane );
69a301 ¤   RegisterClass_( LTabGroup );
e2323d ¤   RegisterClass_( LView );
3067c5 ¤
488725 ¤   // Appearance classes:
7667c5 ¤
fb5a7a ¤   RegisterClass_( LCheckBox );
b5a17b ¤   RegisterClass_( LEditText );
7e8652 ¤   RegisterClass_( LIconControl );
b5fa52 ¤   RegisterClass_( LPopupButton );
8cb90b ¤   RegisterClass_( LProgressBar );
5c0848 ¤   RegisterClass_( LPushButton );
89ecd7 ¤   RegisterClass_( LScrollBar );
b6904e ¤   RegisterClass_( LScrollerView );
f9da19 ¤   RegisterClass_( LStaticText );
3a4a05 ¤   RegisterClass_( LTextGroupBox );
5912e6 ¤   RegisterClass_( LWindowHeader );
1367c5 ¤
--d247 00003803a864012029a Page 3 of PGPsdkUILibUtils.cp
985627 ¤   if( HaveAppearanceMgr() )
51c7a1 ¤   {
642f9a ¤   ¤   // Register Appearance Manager implementations
d20789 ¤   ¤   // Note: Do NOT call RegisterAppearanceClient here. That is the
12d7dd ¤   ¤   // client's responsibility.
dc1b52 ¤   ¤
9f47b0 ¤   ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LCheckBox::imp_class_ID );
fd0972 ¤   ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LIconControl::imp_class_ID );
242ad9 ¤   ¤   RegisterClassID_( CSysFileAMControlImp, LProgressBar::imp_class_ID );
953015 ¤   ¤   RegisterClassID_( LAMControlImp, ¤  ¤   LTextGroupBox::imp_class_ID );
f3d553 ¤   ¤   RegisterClassID_( CPGPAMEditTextImp, ¤  LEditText::imp_class_ID );¤ ¤
b77d5f ¤   ¤   RegisterClassID_( LAMPopupButtonImp,¤   LPopupButton::imp_class_ID );
252aa3 ¤   ¤   RegisterClassID_( LAMPushButtonImp,¤¤   LPushButton::imp_class_ID );
128317 ¤   ¤   RegisterClassID_( LAMStaticTextImp,¤¤   LStaticText::imp_class_ID );
f634fb ¤   ¤   RegisterClassID_( LAMTrackActionImp, ¤  LScrollBar::imp_class_ID);
05df1e ¤   ¤   RegisterClassID_( LAMWindowHeaderImp,¤  LWindowHeader::imp_class_ID );
7d9371 ¤   }
a30e24 ¤   else
6ac7a1 ¤   {
6d9526 ¤   ¤   // Register Grayscale implementations
e6af5a
9d4583 ¤   ¤   RegisterClassID_( LGACheckboxImp,¤  ¤   LCheckBox::imp_class_ID );
93cb3b ¤   ¤   RegisterClassID_( LGAEditTextImp, ¤ ¤   LEditText::imp_class_ID );¤ ¤
6efd5b ¤   ¤   RegisterClassID_( LGAIconControlImp,¤   LIconControl::imp_class_ID );
a6998a ¤   ¤   RegisterClassID_( CPGPGAPopupButtonImp,¤LPopupButton::imp_class_ID );
7cbf29 ¤   ¤   RegisterClassID_( LGAProgressBarImp,¤   LProgressBar::imp_class_ID );
95f5fb ¤   ¤   RegisterClassID_( LGAPushButtonImp,¤¤   LPushButton::imp_class_ID );
f45c4f ¤   ¤   RegisterClassID_( LGAStaticTextImp,¤¤   LStaticText::imp_class_ID );
515c54 ¤   ¤   RegisterClassID_( LGATextGroupBoxImp,¤  LTextGroupBox::imp_class_ID );
a4ec53 ¤   ¤   RegisterClassID_( LGAWindowHeaderImp,¤  LWindowHeader::imp_class_ID );
b9baf3 ¤   ¤   RegisterClassID_( LStdScrollBarImp, ¤   LScrollBar::imp_class_ID);
4b9371 ¤   }
b567c5 ¤
9adce2 ¤   RegisterClass_( CPGPModalGrafPortView );
954550 ¤   RegisterClass_( CPassphraseEdit );
e2568a ¤   RegisterClass_( CPrivateKeysPopup );
92af5a
88e22b ¤   // LDragAndDrop leaks like a sieve. This is fixed by not using
53b95a ¤   // the default RegisterClass behavior for those classes which
bc370e ¤   // inherit from LDragAndDrop.
b567c5 ¤
a98f2d ¤   URegistrar::RegisterClass( CUserIDTable::class_ID,
f53b2b ¤   ¤   ¤   ¤   (ClassCreatorFunc) CUserIDTable::CreateFromStream);
49efe6 }
4eaf5a
d033c8 ¤   static void
04a029 InitializePowerPlant(void)
38bb36 {
e70d84 ¤   static Boolean¤ firstTime = TRUE;
0267c5 ¤
5da40e ¤   if( firstTime )
a3c7a1 ¤   {
0f5c98 #if PGP_DEBUG
a4d222 ¤   ¤   gDebugThrow ¤   = debugAction_LowLevelDebugger;
90e9d3 ¤   ¤   gDebugSignal ¤  = debugAction_LowLevelDebugger;
707454 #endif
f8af5a
b26e86 ¤   ¤   UEnvironment::InitEnvironment();
16609d ¤   ¤   UGraphicUtils::InitGraphicsUtilities();
3daf5a
487424 ¤   ¤   UQDGlobals::SetQDGlobals((QDGlobals*)(*((long*)::LMGetCurrentA5()) -·
e32087 ¤   ¤   ¤   ¤   (sizeof(QDGlobals) - sizeof(GrafPtr))));
a61b52 ¤   ¤
f4c491 ¤   ¤   MacLeaks_Suspend();
ecaf5a
b9dadd ¤   ¤   #if USE_MAC_DEBUG_LEAKS
a837ed ¤   ¤   { CForceInitLPeriodical¤temp; }
68d656 ¤   ¤   #endif
d8af5a
2c76c7 ¤   ¤   RegisterPowerPlantClasses();
faaf5a
039538 ¤   ¤   MacLeaks_Resume();
--d4dc 000ed75df3c4012029a Page 4 of PGPsdkUILibUtils.cp
f11b52 ¤   ¤
bbfbe2 ¤   ¤   LCommander::SetDefaultCommander( NULL );
3d1647 ¤   ¤   LPane::SetDefaultView( NULL );
e4af5a
fd621f ¤   ¤   firstTime = FALSE;
af9371 ¤   }
d8efe6 }
01af5a
0a85ea ¤   OSStatus
9219de SetLibraryFSSpec(const FSSpec *fileSpec)
d4bb36 {
dcc412 ¤   OSStatus¤   status;
c04f27 ¤   CInfoPBRec¤ cpb;
1d67c5 ¤
7623bd ¤   // This routine should be called once ONLY from the library INIT routine.
01293a ¤   pgpAssert( sLibraryFileSpec.name[0] == 0 );
1be929 ¤   pgpAssert( sLibraryFileID == 0 );
2867c5 ¤
3d494d ¤   status = FSpGetCatInfo( fileSpec, &cpb );
f8dd30 ¤   if( IsntErr( status ) )
08c7a1 ¤   {
9b6e73 ¤   ¤   HParamBlockRec¤ pb;
a51b52 ¤   ¤
1118f7 ¤   ¤   sLibraryFileSpec = *fileSpec;
031b52 ¤   ¤
070680 ¤   ¤   // Create a file ID so we can track this file later.
ca1b52 ¤   ¤
c4d8cd ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
0d1b52 ¤   ¤
f8980e ¤   ¤   pb.fidParam.ioVRefNum¤  = sLibraryFileSpec.vRefNum;
785678 ¤   ¤   pb.fidParam.ioNamePtr¤  = sLibraryFileSpec.name;
fa685e ¤   ¤   pb.fidParam.ioSrcDirID¤ = sLibraryFileSpec.parID;
ed1b52 ¤   ¤
f73cf2 ¤   ¤   if( IsntErr( PBCreateFileIDRefSync( &pb ) ) )
835b34 ¤   ¤   {
e66b03 ¤   ¤   ¤   sLibraryFileID = pb.fidParam.ioFileID;
4b0fe4 ¤   ¤   }
409371 ¤   }
fc67c5 ¤
a34afd ¤   return( status );
79efe6 }
9eaf5a
8d2473 ¤   static OSStatus
7cc2e9 GetLibraryFSSpec(FSSpec *fileSpec)
85bb36 {
c7c412 ¤   OSStatus¤   status;
e34f27 ¤   CInfoPBRec¤ cpb;
8c67c5 ¤
009dd5 ¤   pgpAssertAddrValid( fileSpec, FSSpec );
2cbf7e ¤   AssertSpecIsValid( &sLibraryFileSpec, "PGPGetPGPLibraryFSSpec" );
ef67c5 ¤
4e1736 ¤   status = FSpGetCatInfo( &sLibraryFileSpec, &cpb );
39b443 ¤   if( IsErr( status ) && sLibraryFileID != 0 )
cec7a1 ¤   {
91fe52 ¤   ¤   // Find the library using the file ID.
d41b52 ¤   ¤
a36e73 ¤   ¤   HParamBlockRec¤ pb;
97e3d6 ¤   ¤   FSSpec¤ ¤   ¤   specCopy;
b81b52 ¤   ¤
07d8cd ¤   ¤   pgpClearMemory( &pb, sizeof( pb ) );
871b52 ¤   ¤
e206f6 ¤   ¤   specCopy = sLibraryFileSpec;
f31b52 ¤   ¤
033b1f ¤   ¤   pb.fidParam.ioVRefNum¤  = specCopy.vRefNum;
4e0f0f ¤   ¤   pb.fidParam.ioNamePtr¤  = specCopy.name;
24b9ea ¤   ¤   pb.fidParam.ioFileID¤   = sLibraryFileID;
9e1b52 ¤   ¤
fa5a56 ¤   ¤   status = PBResolveFileIDRefSync( &pb );
1a706e ¤   ¤   if( IsntErr( status ) )
a85b34 ¤   ¤   {
ef8ea7 ¤   ¤   ¤   specCopy.parID = pb.fidParam.ioSrcDirID;
ed87c7 ¤   ¤   ¤
--37d7 000cee230674012029a Page 5 of PGPsdkUILibUtils.cp
674ae6 ¤   ¤   ¤   status = FSpGetCatInfo( &specCopy, &cpb );
27fb92 ¤   ¤   ¤   if( IsntErr( status ) )
3df776 ¤   ¤   ¤   {
02a98d ¤   ¤   ¤   ¤   sLibraryFileSpec = specCopy;
b1a3a6 ¤   ¤   ¤   }
7a0fe4 ¤   ¤   }
759371 ¤   }
6baf5a
b36141 ¤   AssertNoErr( status, "GetPGPLibFileSpec" );
7367c5 ¤
344f3f ¤   *fileSpec = sLibraryFileSpec;
a767c5 ¤
6e4afd ¤   return( status );
2fefe6 }
6aaf5a
4ac744 ¤   PGPError
89ec80 EnterPGPsdkUILib(
98bc3b ¤   PGPContextRef context,
5016bf ¤   PGPsdkUILibState *state)
50bb36 {
ca865f ¤   CComboError¤¤   err;
0567c5 ¤
9d6d02 ¤   (void) context;
aa67c5 ¤
1a10bf ¤   pgpAssertAddrValid( state, PGPsdkUILibState );
0d67c5 ¤
6c52ad ¤   InitializePowerPlant();
3daf5a
a9621e ¤   pgpClearMemory( state, sizeof( *state ) );
de67c5 ¤
7231fb ¤   GetPort( &state->savedPort );
cd67c5 ¤
016435 ¤   state->savedResLoad ¤   = LMGetResLoad();
e99448 ¤   state->savedZone¤   ¤   = GetZone();
76f146 ¤   state->savedResFile¤¤   = CurResFile();
31d985 ¤   state->savedView ¤  ¤   = LPane::GetDefaultView();
241636 ¤   state->savedCommander ¤ = LCommander::GetDefaultCommander();
2faf5a
bee5c7 ¤   SetResLoad( TRUE );
fba97f ¤   LCommander::SetDefaultCommander( NULL );
ae57b4 ¤   LPane::SetDefaultView( NULL );
6367c5 ¤
1d1abe ¤   if( sLibraryFileRefCount == 0 )
6dc7a1 ¤   {
596f7d ¤   ¤   FSSpec¤ ¤   libraryFileSpec;
cf1b52 ¤   ¤
690eca ¤   ¤   /* Library not yet open */
0b1b52 ¤   ¤
c46ed2 ¤   ¤   pgpAssert( sLibraryFileRefNum == -1 );
421b52 ¤   ¤
aa43d8 ¤   ¤   err.err¤= GetLibraryFSSpec( &libraryFileSpec );
8b5a9f ¤   ¤   if( err.IsntError() )
2d5b34 ¤   ¤   {
273dd6 ¤   ¤   ¤   sLibraryFileRefNum = FSpOpenResFile( &libraryFileSpec, fsRdPerm );
817adb ¤   ¤   ¤   if( sLibraryFileRefNum > 0 )
daf776 ¤   ¤   ¤   {
c11659 ¤   ¤   ¤   ¤   ++sLibraryFileRefCount;
130274 ¤   ¤   ¤   ¤   UseResFile( sLibraryFileRefNum );
88a3a6 ¤   ¤   ¤   }
2abb8c ¤   ¤   ¤   else
edf776 ¤   ¤   ¤   {
5c5bed ¤   ¤   ¤   ¤   err.pgpErr = kPGPError_FileNotFound;
68a3a6 ¤   ¤   ¤   }
830fe4 ¤   ¤   }
349371 ¤   }
220e24 ¤   else
dac7a1 ¤   {
46c165 ¤   ¤   /* Library already open. Just increment the count */
761b52 ¤   ¤
c1b52b ¤   ¤   pgpAssert( sLibraryFileRefNum > 0 );
5f1b52 ¤   ¤
ce58f0 ¤   ¤   ++sLibraryFileRefCount;
--48ae 0016f525a1f4012029a Page 6 of PGPsdkUILibUtils.cp
b0748f ¤   ¤   UseResFile( sLibraryFileRefNum );
919371 ¤   }
4067c5 ¤
301be7 ¤   return( err.ConvertToPGPError() );
61efe6 }
ddaf5a
7f6d52 ¤   void
c30c0c ExitPGPsdkUILib(const PGPsdkUILibState *state)
ecbb36 {
f110bf ¤   pgpAssertAddrValid( state, PGPsdkUILibState );
5daf5a
f70aa2 ¤   --sLibraryFileRefCount;
d41abe ¤   if( sLibraryFileRefCount == 0 )
2dc7a1 ¤   {
1bb52b ¤   ¤   pgpAssert( sLibraryFileRefNum > 0 );
7e67c5 ¤
72903a ¤   ¤   CloseResFile( sLibraryFileRefNum );
1b794a ¤   ¤   sLibraryFileRefNum = -1;
c39371 ¤   }
62af5a
944e9c ¤   LCommander::SetDefaultCommander( state->savedCommander );
860d7a ¤   LPane::SetDefaultView( state->savedView );
9baf5a
a366ea ¤   SetPort( state->savedPort );
27b2f2 ¤   SetResLoad( state->savedResLoad );
9622e9 ¤   SetZone( state->savedZone );
08800d ¤   UseResFile( state->savedResFile );
2befe6 }
5caf5a
5a108d ¤   PGPUInt32
57035b PGPEstimatePassphraseQuality(const char *passphrase)
ddbb36 {
5a1b3e ¤   return( pgpEstimatePassphraseQuality( passphrase ) );
e4efe6 }
b0af5a
687e69 ¤   Boolean
fe658e HaveNetworkLib(void)
e7bb36 {
fd8269 ¤   return( CFM_AddressIsResolved_( PGPQueryKeyServer ) );
1befe6 }
c6af5a
9cc744 ¤   PGPError
c431d3 pgpCheckNetworklibAvailability(void)
41bb36 {
09e86d ¤   if( HaveNetworkLib() )
d6c7a1 ¤   {
7aa117 ¤   ¤   return( kPGPError_NoErr );
579371 ¤   }
9d0e24 ¤   else
8ac7a1 ¤   {
13b21f ¤   ¤   return( kPGPError_FeatureNotAvailable );
ec9371 ¤   }
95efe6 }
e2af5a
6faf5a
--9731 00104bee2354012029b Page 1 of PGPsdkUILibUtils.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
e927be ¤   $Id: PGPsdkUILibUtils.h,v 1.8.10.1 1998/11/12 03:21:06 heller Exp $
52f7f7 ____________________________________________________________________________*/
98af5a
097b7d #pragma once
d4af5a
d349ca #include <Files.h>
f76b82 #include <Memory.h>
7b2c23 #include <Quickdraw.h>
3eaf5a
cc2f94 #include <LCommander.h>
872c73 #include <LView.h>
c9af5a
98e8b2 #include "pflPrefs.h"
61c5d5 #include "pgpBase.h"
51e82c #include "pgpPubTypes.h"
9676f0 #include "CComboError.h"
acaf5a
0e382c typedef struct PGPsdkUILibState
5ebb36 {
b872a7 ¤   GrafPtr¤¤   ¤   savedPort;
56cf91 ¤   THz¤¤   ¤   ¤   savedZone;
8ab917 ¤   short¤  ¤   ¤   savedResFile;
9bfcf3 ¤   PGPBoolean¤ ¤   savedResLoad;
0567c5 ¤
9044a9 ¤   LView¤  ¤   ¤   *savedView;
4a82e6 ¤   LCommander¤ ¤   *savedCommander;
7b67c5 ¤
3c8536 } PGPsdkUILibState;
80af5a
7499c6 PGP_BEGIN_C_DECLARATIONS
4baf5a
b20543 PGPError¤   EnterPGPsdkUILib(PGPContextRef context, PGPsdkUILibState *state);
1936e0 void¤   ¤   ExitPGPsdkUILib(const PGPsdkUILibState *state);
1d8ada Boolean¤¤   HaveNetworkLib(void);
e1eec5 OSStatus¤   SetLibraryFSSpec(const FSSpec *fileSpec);
deaf5a
041254 PGP_END_C_DECLARATIONS
--7403 00125922f9b4012029c Page 1 of CInternetSocket.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
614164 ¤   $Id: CInternetSocket.cp,v 1.2.12.1 1998/11/12 03:22:22 heller Exp $
30f7f7 ____________________________________________________________________________*/
7faf5a
b3d92d #include <stdarg.h>
e7af5a
fded9b #include "CInternetSocket.h"
25af5a
--25b7 001af4c8ed64012029d Page 1 of CInternetSocket.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
7c60fa ¤   $Id: CInternetSocket.h,v 1.1.12.1 1998/11/12 03:22:23 heller Exp $
daf7f7 ____________________________________________________________________________*/
51af5a
348d55 #pragma once·
28af5a
6b3438 #include "CSocket.h"
02af5a
8caf5a
8051f7 class CInternetSocket : public CSocket {
afbf26 };¶
--3d3c 001c198f5624012029e Page 1 of CInternetUtilities.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
950d23 ¤   $Id: CInternetUtilities.cp,v 1.2.12.1 1998/11/12 03:22:23 heller Exp $
87f7f7 ____________________________________________________________________________*/
77af5a
f92556 #include "CInternetUtilities.h"
c1af5a
--2231 001b23397d24012029f Page 1 of CInternetUtilities.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
0e9704 ¤   $Id: CInternetUtilities.h,v 1.4.10.1 1998/11/12 03:22:24 heller Exp $
b0f7f7 ____________________________________________________________________________*/
54af5a
907b7d #pragma once
9faf5a
103438 #include "CSocket.h"
383205 #include "MacTCP.h"
65af5a
01d106 class CInternetUtilities {
905ed4 public:
b12515 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CInternetUtilities() { }
123066 ¤   virtual¤¤   ¤   ¤   ¤   ~CInternetUtilities() { }
d58046 ¤   virtual PGPHostEntry *¤ GetHostByName(const char * inName) = 0;
0a4b35 ¤   virtual¤PGPHostEntry *¤ GetHostByAddress(PGPInternetAddress inAddress) = 0;
59d24e ¤   virtual void¤   ¤   ¤   GetHostName(char * outName,
eba8ae ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inNameLength) = 0;
b2bf26 };¶
--e2c1 0001fc89408401202a0 Page 1 of CMacTCPInternetSocket.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
17337a ¤   $Id: CMacTCPInternetSocket.cp,v 1.7.12.1 1998/11/12 03:22:25 heller Exp $
cef7f7 ____________________________________________________________________________*/
1aaf5a
2e2363 #include <Devices.h>
32d92d #include <stdarg.h>
58af5a
2a0d08 #include "pgpMem.h"
02af5a
64781d #include "CMacTCPInternetSocket.h"
a9af5a
b4af5a
2caf5a
1569c6 SInt16¤ CMacTCPInternetSocket::sRefNum;
deaf5a
5baf5a
f4fd87 CMacTCPInternetSocket::CMacTCPInternetSocket()
d26a3d ¤   : mBoundPort(0), mBoundAddress(0), mAbort(false),
ba4fe4 ¤   ··mBound(false), mConnected(false)
8dbb36 {
81156f ¤   OSStatus¤   ¤   err;
5aaa00 ¤   static Boolean¤ sRefInitialized = false;
8967c5 ¤
f9086a ¤   if (! sRefInitialized) {
abbe59 ¤   ¤   ParamBlockRec theParamBlock;
1f1b52 ¤   ¤
e1097b ¤   ¤   theParamBlock.ioParam.ioNamePtr = "\p.IPP";
8d50d2 ¤   ¤   theParamBlock.ioParam.ioPermssn = fsCurPerm;
7d1b52 ¤   ¤
e77608 ¤   ¤   err = ::PBOpenSync(&theParamBlock);
8e951b ¤   ¤   if (err != noErr) {
90cf94 ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNetworkDown);
e60fe4 ¤   ¤   }
9734e1 ¤   ¤   sRefNum = theParamBlock.ioParam.ioRefNum;
000aaf ¤   ¤   sRefInitialized = true;
769371 ¤   }
f4efe6 }
7faf5a
7baf5a
60af5a
bacfd5 CMacTCPInternetSocket::~CMacTCPInternetSocket()
afbb36 {
62efe6 }
c9af5a
a7af5a
74af5a
6e6d52 ¤   void
d0f640 CMacTCPInternetSocket::Close()
53bb36 {
4a71e9 ¤   if (mInCallback) {
00a029 ¤   ¤   mAbort = true;
0ef037 ¤   } else {
f24b07 ¤   ¤   Cleanup();
c64e34 ¤   ¤   delete this;
af9371 ¤   }
6eefe6 }
6caf5a
b4af5a
eaaf5a
bd6d52 ¤   void
ca2ca2 CMacTCPInternetSocket::Bind(
869d9f ¤   const PGPSocketAddressInternet *¤   inAddress)
02bb36 {
577dd0 ¤   mBoundPort = inAddress->sin_port;
6119a3 ¤   mBoundAddress = inAddress->sin_addr.s_addr;
a07ae8 ¤   mBound = true;
1fefe6 }
--3d69 001ca198be2401202a0 Page 2 of CMacTCPInternetSocket.cp
e0af5a
1aaf5a
17af5a
246d52 ¤   void
f995ca CMacTCPInternetSocket::Cleanup()
e3bb36 {
efefe6 }
efaf5a
ffaf5a
fdaf5a
686d52 ¤   void
bf3385 CMacTCPInternetSocket::GetSocketName(
2fd657 ¤   PGPSocketAddressInternet *¤ outName)
05bb36 {
9c4677 ¤   if (mBound) {
6966c8 ¤   ¤   pgpClearMemory(outName, sizeof(PGPSocketAddressInternet));
d41d5e ¤   ¤   outName->sin_family = kPGPAddressFamilyInternet;
ff18e0 ¤   ¤   outName->sin_port = mBoundPort;
67f15f ¤   ¤   outName->sin_addr.s_addr = mBoundAddress;
8df037 ¤   } else {
993e64 ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotBound);
a19371 ¤   }
c7efe6 }
d0af5a
24af5a
6daf5a
c86d52 ¤   void
8bfbef CMacTCPInternetSocket::ProcessCommand(
613b58 ¤   SInt16¤ ¤   ¤   inCSCode,
5ad5a9 ¤   IPParamBlock *¤ inParamBlock)
33bb36 {
77dc42 ¤   OSStatus¤   err;
1667c5 ¤
f6172c ¤   inParamBlock->csCode = inCSCode;
869e97 ¤   inParamBlock->ioCRefNum = sRefNum;
be67c5 ¤
b63280 ¤   err = ::PBControlAsync((ParmBlkPtr) inParamBlock);
d2637e ¤   if (err != noErr) {
b781ab ¤   ¤   ThrowPGPError_(err);
489371 ¤   }
51e49c ¤   while ((inParamBlock->ioResult == inProgress) && (! mAbort)) {
1542b3 ¤   ¤   mInCallback = true;
0c9f44 ¤   ¤   if (CallIdleEventHandler() != kPGPError_NoErr) {
05d730 ¤   ¤   ¤   Close();
95a105 ¤   ¤   };
9eb52a ¤   ¤   mInCallback = false;
359371 ¤   }
bab137 ¤   if (mAbort) {
6296bb ¤   ¤   Close();
91176e ¤   ¤   ThrowPGPError_(kPGPError_UserAbort);
229371 ¤   }
576122 ¤   if (inParamBlock->ioResult != noErr) {
316de3 ¤   ¤   ThrowPGPError_(inParamBlock->ioResult);
f59371 ¤   }
caefe6 }
--7fb3 0010c0208fb401202a1 Page 1 of CMacTCPInternetSocket.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
ce6664 ¤   $Id: CMacTCPInternetSocket.h,v 1.4.12.1 1998/11/12 03:22:25 heller Exp $
36f7f7 ____________________________________________________________________________*/
65af5a
958d55 #pragma once·
03af5a
0e36ac #include <MacTCP.h>
68af5a
49ed9b #include "CInternetSocket.h"
1faf5a
18af5a
551f16 class CMacTCPInternetSocket : public CInternetSocket {
f75ed4 public:
25e29c ¤   ¤   ¤   ¤   ¤   ¤   ¤   CMacTCPInternetSocket();
6a11b8 ¤   virtual ¤   ¤   ¤   ¤   ~CMacTCPInternetSocket();
64af5a
dc4333 ¤   virtual void¤   ¤   ¤   Bind(const PGPSocketAddressInternet *
6bd197 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress);
18234c ¤   virtual void¤   ¤   ¤   Close();
e0af5a
780af8 ¤   virtual void¤   ¤   ¤   GetSocketName(PGPSocketAddressInternet * outName);
7b67c5 ¤
5ea2d3 protected:
1a5927 ¤   static SInt16¤  ¤   ¤   sRefNum;
b467c5 ¤
5fa8ac ¤   Boolean¤¤   ¤   ¤   ¤   mConnected;
a76dfb ¤   Boolean¤¤   ¤   ¤   ¤   mBound;
438d5a ¤   SInt16¤ ¤   ¤   ¤   ¤   mBoundPort;
3b5cd1 ¤   SInt32¤ ¤   ¤   ¤   ¤   mBoundAddress;
00d9a2 ¤   Boolean¤¤   ¤   ¤   ¤   mAbort;
b6af5a
369821 ¤   virtual void¤   ¤   ¤   Cleanup();
d767c5 ¤
54ff52 ¤   virtual void¤   ¤   ¤   ProcessCommand(SInt16 inCSCode,
0ba510 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   IPParamBlock * inParamBlock);
0cbf26 };¶
--d4d0 000e38dfac3401202a2 Page 1 of CMacTCPInternetUtilities.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
be9e3a ¤   $Id: CMacTCPInternetUtilities.cp,v 1.11.10.1 1998/11/12 03:22:26 heller Exp¶
81ed4e ·$
f9f7f7 ____________________________________________________________________________*/
2caf5a
e32363 #include <Devices.h>
bd324c #include <string.h>
f8af5a
660d08 #include "pgpMem.h"
41af5a
8f9886 #include "CMacTCPInternetUtilities.h"
3aaf5a
f5af5a
41af5a
e4ed91 class StResolverBusy {
205ed4 public:
02e051 ¤   ¤   ¤   ¤   ¤   StResolverBusy();
750565 ¤   virtual¤¤   ¤   ~StResolverBusy();
81af5a
69a2d3 protected:
97cd47 ¤   static Boolean¤ sResolverBusy;
0582f7 };
9caf5a
39af5a
e8af5a
d10169 UniversalProcPtr¤   CMacTCPInternetUtilities::sResultProc = nil;
c8095d PGPInternetAddress¤ CMacTCPInternetUtilities::sLocalAddress;
f64c0e Boolean¤¤   ¤   ¤   StResolverBusy::sResolverBusy = false;
f2af5a
a0af5a
7663e5 StResolverBusy::StResolverBusy()
c5bb36 {
3f827f ¤   while (sResolverBusy) {
80ee20 ¤   ¤   ThrowIfPGPError_(CSocket::CallIdleEventHandler());
e19371 ¤   }
4867c5 ¤
eaa3fc ¤   sResolverBusy = true;
58efe6 }
dbaf5a
beaf5a
bfaf5a
62d5af StResolverBusy::~StResolverBusy()
97bb36 {
060f38 ¤   sResolverBusy = false;
91efe6 }
64af5a
a6af5a
4139b0 CMacTCPInternetUtilities::CMacTCPInternetUtilities()
7fbb36 {
16dc42 ¤   OSStatus¤   err;
4b67c5 ¤
c7d5f0 ¤   sLocalAddress.s_addr = 0;
e767c5 ¤
15870b ¤   sResultProc = NewResultProc(ResultProc);
162a01 ¤   if (sResultProc == nil) {
e416b3 ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
0f9371 ¤   }
2caf5a
47ab97 ¤   err = ::OpenResolver(nil);
50637e ¤   if (err != noErr) {
0481ab ¤   ¤   ThrowPGPError_(err);
169371 ¤   }
c0efe6 }
75af5a
12af5a
29af5a
e3288f CMacTCPInternetUtilities::~CMacTCPInternetUtilities()
--e017 0008c4e786a401202a2 Page 2 of CMacTCPInternetUtilities.cp
2cbb36 {
8706ce ¤   StResolverBusy busyResolver;
0567c5 ¤
e708cc ¤   ::CloseResolver();
0e21e6 ¤   if (sResultProc != nil) {
d96533 ¤   ¤   ::DisposeRoutineDescriptor(sResultProc);
769371 ¤   }
77efe6 }
f3af5a
3daf5a
3daf5a
a4e2eb ¤   PGPHostEntry *
a6d2a0 CMacTCPInternetUtilities::GetHostByName(
64c386 ¤   const char *¤   inName)
7fbb36 {
58386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
5c470e ¤   PGPHostEntry *¤ ¤   result = nil;
c38737 ¤   OSStatus¤   ¤   ¤   err;
c71cff ¤   Boolean¤¤   ¤   ¤   done = false;
3d1894 ¤   struct hostInfo¤¤   hInfo;¤
914a9b ¤   StResolverBusy¤ ¤   busyResolver;
2daf5a
38b983 ¤   err = ::StrToAddr(¤ (char *) inName,
8a1bb0 ¤   ¤   ¤   ¤   ¤   ¤   &hInfo,
53e7ab ¤   ¤   ¤   ¤   ¤   ¤   sResultProc,
7e4663 ¤   ¤   ¤   ¤   ¤   ¤   (char *) &done);
7a67c5 ¤
e1b869 ¤   // Delay if we have to query the name server
b982ee ¤   if (err == cacheFault) {
894a9a ¤   ¤   while (! done) {
37eec2 ¤   ¤   ¤   ThrowIfPGPError_(CSocket::CallIdleEventHandler());
470fe4 ¤   ¤   }
c4ba79 ¤   ¤   err = hInfo.rtnCode;
ec9371 ¤   }
1d637e ¤   if (err != noErr) {
3081ab ¤   ¤   ThrowPGPError_(err);
6b9371 ¤   }
a9af5a
ed5b45 ¤   // Insert the name
9c1853 ¤   strncpy(theContext->hostEntry.h_name, hInfo.cname, kMaxHostNameLen);
bb05be ¤   theContext->hostEntry.h_name[kMaxHostNameLen] = 0;
082ade ¤   ::BlockMoveData(¤   hInfo.addr,
88c7ef ¤   ¤   ¤   ¤   ¤   ¤   theContext->hAddressesBuffer,
aafc77 ¤   ¤   ¤   ¤   ¤   ¤   sizeof(theContext->hAddressesBuffer));
e773b3 ¤   pgpClearMemory(¤theContext->hAddressesListBuffer,
cbcfd7 ¤   ¤   ¤   ¤   ¤   sizeof(theContext->hAddressesListBuffer));
9b1161 ¤   for (UInt8 i = 0; (i < kMaxHostAddrs)
301cf4 ¤   ··&& (theContext->hAddressesBuffer[i] != 0); i++) {
b1a12d ¤   ¤   theContext->hAddressesListBuffer[i] =
e8e10b ¤   ¤   ¤   &theContext->hAddressesBuffer[i];
e99371 ¤   }
347d2b ¤   result = &theContext->hostEntry;
72af5a
465d73 ¤   return result;
60efe6 }
69af5a
6caf5a
e5af5a
81e2eb ¤   PGPHostEntry *
b64e28 CMacTCPInternetUtilities::GetHostByAddress(
5e6cbf ¤   PGPInternetAddress¤ inAddress)
f9bb36 {
6b386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
79470e ¤   PGPHostEntry *¤ ¤   result = nil;
148737 ¤   OSStatus¤   ¤   ¤   err;
551cff ¤   Boolean¤¤   ¤   ¤   done = false;
5a19e6 ¤   struct hostInfo¤¤   hInfo;
274a9b ¤   StResolverBusy¤ ¤   busyResolver;
3767c5 ¤
b0262b ¤   err = ::AddrToName(¤inAddress.s_addr,
091bb0 ¤   ¤   ¤   ¤   ¤   ¤   &hInfo,
8ce7ab ¤   ¤   ¤   ¤   ¤   ¤   sResultProc,
--ae56 000cc3587e9401202a2 Page 3 of CMacTCPInternetUtilities.cp
ad4663 ¤   ¤   ¤   ¤   ¤   ¤   (char *) &done);
ab94aa ¤   ¤   ¤   ¤   ¤   ¤
09b869 ¤   // Delay if we have to query the name server
6b82ee ¤   if (err == cacheFault) {
0c4a9a ¤   ¤   while (! done) {
f3eec2 ¤   ¤   ¤   ThrowIfPGPError_(CSocket::CallIdleEventHandler());
3a0fe4 ¤   ¤   }
bfba79 ¤   ¤   err = hInfo.rtnCode;
9d9371 ¤   }
28637e ¤   if (err != noErr) {
db81ab ¤   ¤   ThrowPGPError_(err);
589371 ¤   }
64af5a
885b45 ¤   // Insert the name
8b1853 ¤   strncpy(theContext->hostEntry.h_name, hInfo.cname, kMaxHostNameLen);
3205be ¤   theContext->hostEntry.h_name[kMaxHostNameLen] = 0;
b23327 ¤   theContext->hAddressesBuffer[0] = inAddress.s_addr;
d6a656 ¤   theContext->hAddressesBuffer[1] = 0;
3873b3 ¤   pgpClearMemory(¤theContext->hAddressesListBuffer,
22cfd7 ¤   ¤   ¤   ¤   ¤   sizeof(theContext->hAddressesListBuffer));
c975f2 ¤   for (UInt8 i = 0; (i < NUM_ALT_ADDRS)
e31cf4 ¤   ··&& (theContext->hAddressesBuffer[i] != 0); i++) {
a3a12d ¤   ¤   theContext->hAddressesListBuffer[i] =
d1e10b ¤   ¤   ¤   &theContext->hAddressesBuffer[i];
ee9371 ¤   }
387d2b ¤   result = &theContext->hostEntry;
93af5a
a45d73 ¤   return result;
03efe6 }
86af5a
96af5a
beaf5a
846d52 ¤   void
9f43b1 CMacTCPInternetUtilities::GetHostName(
2ef539 ¤   char *¤ outName,
e3c86c ¤   SInt32¤ inNameLength)
cdbb36 {
a90144 ¤   PGPInternetAddress¤ localAddress = GetLocalAddress();
418737 ¤   OSStatus¤   ¤   ¤   err;
db1cff ¤   Boolean¤¤   ¤   ¤   done = false;
8419e6 ¤   struct hostInfo¤¤   hInfo;
434a9b ¤   StResolverBusy¤ ¤   busyResolver;
4067c5 ¤
03ec7d ¤   err = ::AddrToName(¤localAddress.s_addr,
a91bb0 ¤   ¤   ¤   ¤   ¤   ¤   &hInfo,
89e7ab ¤   ¤   ¤   ¤   ¤   ¤   sResultProc,
e24663 ¤   ¤   ¤   ¤   ¤   ¤   (char *) &done);
f794aa ¤   ¤   ¤   ¤   ¤   ¤
ccb869 ¤   // Delay if we have to query the name server
9882ee ¤   if (err == cacheFault) {
c64a9a ¤   ¤   while (! done) {
a9eec2 ¤   ¤   ¤   ThrowIfPGPError_(CSocket::CallIdleEventHandler());
d20fe4 ¤   ¤   }
faba79 ¤   ¤   err = hInfo.rtnCode;
399371 ¤   }
80637e ¤   if (err != noErr) {
c981ab ¤   ¤   ThrowPGPError_(err);
989371 ¤   }
8eaf5a
675b45 ¤   // Insert the name
97041d ¤   strncpy(outName, hInfo.cname, inNameLength - 1);
d70b1d ¤   outName[inNameLength - 1] = 0;
64efe6 }
2aaf5a
58af5a
a5af5a
5936c1 ¤   PGPInternetAddress
421f22 CMacTCPInternetUtilities::GetLocalAddress()
edbb36 {
59e1aa ¤   if (sLocalAddress.s_addr == 0) {
cafaea ¤   ¤   GetAddrParamBlock paramBlock;
cc1b52 ¤   ¤
--db0b 0012a712910401202a2 Page 4 of CMacTCPInternetUtilities.cp
679a10 ¤   ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
87dd22 ¤   ¤   paramBlock.ioCRefNum = GetMacTCPDriverRef();¤   ¤   ¤
320217 ¤   ¤   paramBlock.csCode = ipctlGetAddr;
1c157d ¤   ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
1cef81 ¤   ¤   sLocalAddress.s_addr = paramBlock.ourAddress;
a29371 ¤   }
2d67c5 ¤
514a59 ¤   return sLocalAddress;
88efe6 }
cfaf5a
08af5a
6baf5a
784743 ¤   SInt16
d008b5 CMacTCPInternetUtilities::GetMacTCPDriverRef()
61bb36 {
05bee3 ¤   static SInt16¤  sDriverRef;
9ef6ec ¤   static Boolean¤ sInitialized = false;
5b156f ¤   OSStatus¤   ¤   err;
2267c5 ¤
0fc22a ¤   if (! sInitialized) {
d1be59 ¤   ¤   ParamBlockRec theParamBlock;
0e1b52 ¤   ¤
3e097b ¤   ¤   theParamBlock.ioParam.ioNamePtr = "\p.IPP";
1750d2 ¤   ¤   theParamBlock.ioParam.ioPermssn = fsCurPerm;
c41b52 ¤   ¤
ba7608 ¤   ¤   err = ::PBOpenSync(&theParamBlock);
55951b ¤   ¤   if (err != noErr) {
f53afd ¤   ¤   ¤   ThrowPGPError_(err);
130fe4 ¤   ¤   }
e72fe3 ¤   ¤   sDriverRef = theParamBlock.ioParam.ioRefNum;
a34d5e ¤   ¤   sInitialized = true;
999371 ¤   }
4867c5 ¤
0624e6 ¤   return sDriverRef;
8cefe6 }
a7af5a
ebaf5a
b1af5a
a16685 ¤   pascal void
03d898 CMacTCPInternetUtilities::ResultProc(
e4db89 ¤   struct hostInfo *¤  hostInfoPtr,
6328f8 ¤   char *¤ ¤   ¤   ¤   userDataPtr)
b7bb36 {
f3dcc3 ¤   (void) hostInfoPtr;
3d67c5 ¤
034f0f ¤   (*(Boolean *) userDataPtr) = true;
2aefe6 }
--f326 001b6e16a96401202a3 Page 1 of CMacTCPInternetUtilities.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
58587d ¤   $Id: CMacTCPInternetUtilities.h,v 1.4.10.1 1998/11/12 03:22:27 heller Exp $
a9f7f7 ____________________________________________________________________________*/
13af5a
928d55 #pragma once·
b3af5a
ccaf5a
1593c0 #include <AddressXlation.h>
712556 #include "CInternetUtilities.h"
88af5a
96af5a
fdf51b class CMacTCPInternetUtilities : public CInternetUtilities {
ff5ed4 public:
ba4b66 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CMacTCPInternetUtilities();
33af82 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ~CMacTCPInternetUtilities();
2c67c5 ¤
24aa54 ¤   virtual PGPHostEntry *¤ ¤   GetHostByName(const char * inName);
6849f5 ¤   virtual¤PGPHostEntry *¤ ¤   GetHostByAddress(PGPInternetAddress inAddress);
71dee7 ¤   virtual void¤   ¤   ¤   ¤   GetHostName(char * outName,
849616 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inNameLength);
7aaf5a
45a2d3 protected:
2aa949 ¤   static UniversalProcPtr¤¤   sResultProc;
9549bd ¤   static PGPInternetAddress¤  sLocalAddress;
64e56d ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mDone;
0d67c5 ¤
c060d0 ¤   PGPInternetAddress¤ ¤   ¤   GetLocalAddress();
32f20d ¤   SInt16¤ ¤   ¤   ¤   ¤   ¤   GetMacTCPDriverRef();
0867c5 ¤
1a2430 ¤   static pascal void¤ ¤   ¤   ResultProc(struct hostInfo * hostInfoPtr,
d7798d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   char * userDataPtr);
b682f7 };
--1845 000f6539723401202a4 Page 1 of CMacTCPTCPSocket.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
cf27f2 ¤   $Id: CMacTCPTCPSocket.cp,v 1.17.10.1 1998/11/12 03:22:27 heller Exp $
8df7f7 ____________________________________________________________________________*/
74af5a
602363 #include <Devices.h>
38324c #include <string.h>
baaf5a
4d0d08 #include "pgpMem.h"
18af5a
c5aaea #include "CMacTCPTCPSocket.h"
5aaf5a
4daf5a
fbaf5a
a355ba const SInt32¤   kReceiveBufferSize¤ =¤  16*1024;
a9af5a
7caf5a
5daf5a
0e0dff CMacTCPTCPSocket::CMacTCPTCPSocket()
9c5ed7 ¤   ¤   : mStream(nil), mReceiveBuffer(nil), mConnectionAborted(false),
229177 ¤   ¤   ··mIsListening(false), mNotifyProcUPP(nil), mFirstListenQ(nil),
a2f824 ¤   ¤   ··mLastListenQ(nil), mNext(nil)
47bb36 {
08b399 ¤   TCPiopb¤paramBlock;
9b67c5 ¤
b9f523 ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
e56f12 ¤   paramBlock.csParam.create.rcvBuff =
08fb96 ¤   ¤   mReceiveBuffer = new char[kReceiveBufferSize];
c7f252 ¤   if (mReceiveBuffer == nil) {
ff16b3 ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
bb9371 ¤   }
64a0d6 ¤   paramBlock.csParam.create.rcvBuffLen = kReceiveBufferSize;
ddbb4c ¤   mNotifyProcUPP = NewTCPNotifyProc(TCPNotifyProc);
286c77 ¤   if (mNotifyProcUPP == nil) {
1b16b3 ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
c69371 ¤   }
f92b4e ¤   paramBlock.csParam.create.notifyProc = mNotifyProcUPP;
a79273 ¤   paramBlock.csParam.create.userDataPtr = (Ptr) this;
cdb595 ¤   ProcessCommand(TCPCreate, (IPParamBlock *) &paramBlock);
deec39 ¤   mStream = paramBlock.tcpStream;
65ea9b ¤   mSocketType = kPGPSocketTypeStream;
29efe6 }
a3af5a
97af5a
5eaf5a
8b690e CMacTCPTCPSocket::~CMacTCPTCPSocket()
4dbb36 {
e95883 ¤   if (mStream != nil) {
6045fc ¤   ¤   TCPiopb¤paramBlock;
001b52 ¤   ¤
8b9a10 ¤   ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
382a9f ¤   ¤   paramBlock.ioCRefNum = sRefNum;
a0483b ¤   ¤   paramBlock.tcpStream = mStream;
cb8bad ¤   ¤   if (mAbort) {
7e0ec0 ¤   ¤   ¤   paramBlock.csCode = TCPAbort;
0845a6 ¤   ¤   } else {
3fc32b ¤   ¤   ¤   paramBlock.csCode = TCPClose;
060fe4 ¤   ¤   }
c1157d ¤   ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
c49a10 ¤   ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
172a9f ¤   ¤   paramBlock.ioCRefNum = sRefNum;
33483b ¤   ¤   paramBlock.tcpStream = mStream;
873b81 ¤   ¤   paramBlock.csCode = TCPRelease;
80157d ¤   ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
389371 ¤   }
301b52 ¤   ¤
64595e ¤   CMacTCPTCPSocket * nextSocket;
f667c5 ¤
--fd5b 000c1652a8b401202a4 Page 2 of CMacTCPTCPSocket.cp
81aa88 ¤   for (CMacTCPTCPSocket * theSocket = mFirstListenQ;
eb66ce ¤   theSocket != nil; theSocket = nextSocket) {
1f4380 ¤   ¤   nextSocket = theSocket->mNext;
64c088 ¤   ¤   theSocket->mAbort = true;
353f8c ¤   ¤   theSocket->Close();
eb9371 ¤   }
9d1da3 ¤   delete [] mReceiveBuffer;
97c300 ¤   ::DisposeRoutineDescriptor(mNotifyProcUPP);
9eefe6 }
a0af5a
beaf5a
bcaf5a
e66d52 ¤   void
f841a6 CMacTCPTCPSocket::Connect(
739d9f ¤   const PGPSocketAddressInternet *¤   inAddress)
a5bb36 {
fe3796 ¤   if (mIsListening) {
b6ba80 ¤   ¤   ThrowPGPError_(kPGPError_SocketsAddressInUse);
ae9371 ¤   }
33af5a
e1b399 ¤   TCPiopb¤paramBlock;
4c67c5 ¤
7de633 ¤   mConnectionAborted = false;
1df523 ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
b98d6e ¤   paramBlock.tcpStream = mStream;
0c7eb6 ¤   paramBlock.csParam.open.userDataPtr = (Ptr) this;
839857 ¤   paramBlock.csParam.open.remoteHost = inAddress->sin_addr.s_addr;
5ab27a ¤   paramBlock.csParam.open.remotePort = inAddress->sin_port;
2132df ¤   paramBlock.csParam.open.localPort = mBoundPort;
24ec1b ¤   ProcessCommand(TCPActiveOpen, (IPParamBlock *) &paramBlock);
5796a0 ¤   mConnected = true;
74efe6 }
b6af5a
b2af5a
89959b ¤   SInt32
966aa1 CMacTCPTCPSocket::Send(
3a4f2f ¤   const void *¤   inBuffer,
315537 ¤   SInt32¤ ¤   ¤   inLength,
24bb7a ¤   SInt32¤ ¤   ¤   inFlags)
a7bb36 {
7abc46 ¤   SInt32¤ ¤   ¤   toSend = inLength;
8b4107 ¤   char *¤ ¤   ¤   next = (char *) inBuffer;
738132 ¤   TCPiopb¤¤   ¤   paramBlock;
7ba710 ¤   wdsEntry¤   ¤   wds[2] = {¤ {0, 0},
eb8862 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {0, 0}};
bc0647 ¤   (void) inFlags;
6767c5 ¤
8a7fcf ¤   while (toSend > 0) {
430b7b ¤   ¤   wds[0].length = (toSend > USHRT_MAX) ? USHRT_MAX : toSend;
34b625 ¤   ¤   wds[0].ptr = next;
e84a4d ¤   ¤   toSend -= wds[0].length;
34104c ¤   ¤   next += wds[0].length;
059a10 ¤   ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
03483b ¤   ¤   paramBlock.tcpStream = mStream;
7d0e54 ¤   ¤   paramBlock.csParam.send.wdsPtr = (Ptr) wds;
332077 ¤   ¤   ProcessCommand(TCPSend, (IPParamBlock *) &paramBlock);
599371 ¤   }
fcaf5a
6294d1 ¤   return inLength;
a7efe6 }
22af5a
d5af5a
c0af5a
a3959b ¤   SInt32
41c953 CMacTCPTCPSocket::SendTo(
f83074 ¤   const void *¤   ¤   ¤   ¤   ¤   ¤   inBuffer,
3bc1ca ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   inLength,
b79d9f ¤   const PGPSocketAddressInternet *¤   inAddress)
c5bb36 {
8091b3 ¤   (void) inAddress;
6a67c5 ¤
c1d617 ¤   return Send(inBuffer, inLength, kPGPSendFlagNone);
--cb2a 0000345e288401202a4 Page 3 of CMacTCPTCPSocket.cp
7aefe6 }
46af5a
8eaf5a
79af5a
15959b ¤   SInt32
a6d3f9 CMacTCPTCPSocket::Receive(
ecc9d9 ¤   void *¤ outBuffer,
35beea ¤   SInt32¤ inLength,
f60856 ¤   SInt32¤ inFlags)
0fbb36 {
cd34f3 ¤   SInt32¤ result = 0;
feb399 ¤   TCPiopb¤paramBlock;
ce67c5 ¤
e40647 ¤   (void) inFlags;
9d67c5 ¤
4ef523 ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
7c8d6e ¤   paramBlock.tcpStream = mStream;
e85bfd ¤   paramBlock.csParam.receive.rcvBuff = (Ptr) outBuffer;
1f1124 ¤   paramBlock.csParam.receive.rcvBuffLen =
16c7ca ¤   ¤   (inLength > USHRT_MAX) ? USHRT_MAX : inLength;
405168 ¤   try {
36c4fa ¤   ¤   ProcessCommand(TCPRcv, (IPParamBlock *) &paramBlock);
68ec80 ¤   ¤   result = paramBlock.csParam.receive.rcvBuffLen;
879371 ¤   }
7167c5 ¤
608170 ¤   catch (PGPError exception) {
5d29c5 ¤   ¤   if (exception != connectionClosing) {
564199 ¤   ¤   ¤   throw;
1f0fe4 ¤   ¤   }
459371 ¤   }
49af5a
935d73 ¤   return result;
d1efe6 }
e3af5a
cfaf5a
cfaf5a
d0959b ¤   SInt32
f28c65 CMacTCPTCPSocket::ReceiveFrom(
99d5b1 ¤   void *¤ ¤   ¤   ¤   ¤   ¤   outBuffer,
40aa35 ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   inSize,
10455d ¤   PGPSocketAddressInternet *¤ outAddress,
0eb450 ¤   SInt32 *¤   ¤   ¤   ¤   ¤   ioAddressLength)
7dbb36 {
602844 ¤   (void) outAddress;
3daf5a
66d1a5 ¤   if (ioAddressLength != NULL) {
be6241 ¤   ¤   *ioAddressLength = 0;
829371 ¤   }
c8af5a
a20d48 ¤   return Receive(outBuffer, inSize, kPGPReceiveFlagNone);¤
22efe6 }
a7af5a
a3af5a
deaf5a
537e69 ¤   Boolean
71db43 CMacTCPTCPSocket::IsReadable()
febb36 {
9ea182 ¤   Boolean¤result = false;
58b399 ¤   TCPiopb¤paramBlock;
1a67c5 ¤
0af523 ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
3eefca ¤   paramBlock.ioCRefNum = sRefNum;
8deabb ¤   paramBlock.csCode = TCPStatus;
c63796 ¤   if (mIsListening) {
3ff976 ¤   ¤   paramBlock.tcpStream = mFirstListenQ->mStream;
2d157d ¤   ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
51a6db ¤   ¤   if (paramBlock.csParam.status.connectionState != 2) {
626df5 ¤   ¤   ¤   result = true;
6c0fe4 ¤   ¤   }
cff037 ¤   } else {
ad483b ¤   ¤   paramBlock.tcpStream = mStream;
03157d ¤   ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
--cf2f 000025159db401202a4 Page 4 of CMacTCPTCPSocket.cp
e0af5a
68e377 ¤   ¤   if ((paramBlock.csParam.status.amtUnreadData > 0)
c8fc9c ¤   ¤   || (paramBlock.csParam.status.connectionState >= 10)) {
2e6df5 ¤   ¤   ¤   result = true;
880fe4 ¤   ¤   }
f29371 ¤   }
7667c5 ¤
ac5d73 ¤   return result;
18efe6 }
68af5a
1daf5a
b4af5a
d77e69 ¤   Boolean
0700ea CMacTCPTCPSocket::IsWriteable()
66bb36 {
eea182 ¤   Boolean¤result = false;
c9b399 ¤   TCPiopb¤paramBlock;
c767c5 ¤
f8f523 ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
60efca ¤   paramBlock.ioCRefNum = sRefNum;
378d6e ¤   paramBlock.tcpStream = mStream;
0aeabb ¤   paramBlock.csCode = TCPStatus;
d4cdcf ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
60af5a
9abf16 ¤   if ((paramBlock.csParam.status.connectionState == 8)
a95c45 ¤   || (paramBlock.csParam.status.connectionState == 14)) {
248f14 ¤   ¤   result = true;
9e9371 ¤   }
6d67c5 ¤
485d73 ¤   return result;
20efe6 }
4aaf5a
f2af5a
aaaf5a
646d52 ¤   void
96e7fd CMacTCPTCPSocket::PushListenQ()
9abb36 {
8cd59a ¤   CMacTCPTCPSocket *¤ childSocket;
ae8737 ¤   OSStatus¤   ¤   ¤   err;
dcaf5a
f5d8dd ¤   childSocket = new CMacTCPTCPSocket;
af45af ¤   if (childSocket == nil) {
5116b3 ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
f39371 ¤   }
1c90be ¤   childSocket->mBoundPort = mBoundPort;
a2fcee ¤   childSocket->mBoundAddress = mBoundAddress;
019b77 ¤   childSocket->mBound = true;
9167c5 ¤
939855 ¤   pgpClearMemory(&childSocket->mListenParams,
624c28 ¤   ¤   ¤   sizeof(childSocket->mListenParams));
a76b07 ¤   childSocket->mListenParams.ioCRefNum = sRefNum;
6deb2d ¤   childSocket->mListenParams.csCode = TCPPassiveOpen;
c146f7 ¤   childSocket->mListenParams.tcpStream = childSocket->mStream;
3661b2 ¤   childSocket->mListenParams.csParam.open.localPort = mBoundPort;
f0c8c7 ¤   err = ::PBControlAsync((ParmBlkPtr) &childSocket->mListenParams);
44637e ¤   if (err != noErr) {
489bbf ¤   ¤   delete childSocket;
9281ab ¤   ¤   ThrowPGPError_(err);
b59371 ¤   }
9ba141 ¤   if (mFirstListenQ == nil) {
63c930 ¤   ¤   mFirstListenQ = childSocket;
229371 ¤   }
6e56fd ¤   if (mLastListenQ != nil) {
384d6b ¤   ¤   mLastListenQ->mNext = childSocket;
209371 ¤   }
798e3b ¤   mLastListenQ = childSocket;
47efe6 }
25af5a
31af5a
976d52 ¤   void
735bb9 CMacTCPTCPSocket::Listen(
025148 ¤   SInt32¤ inMaxBacklog)
--ff47 000db6b7335401202a4 Page 5 of CMacTCPTCPSocket.cp
2cbb36 {
91812e ¤   if (! mBound) {
c83e64 ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotBound);
9a9371 ¤   }
0867c5 ¤
f7e9e6 ¤   if (mIsListening || mConnected) {
0dba80 ¤   ¤   ThrowPGPError_(kPGPError_SocketsAddressInUse);
f09371 ¤   }
26af5a
2b7c1a ¤   // Free up this sockets resources
dfb399 ¤   TCPiopb¤paramBlock;
7b1b52 ¤   ¤
8df523 ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
a6efca ¤   paramBlock.ioCRefNum = sRefNum;
6b8d6e ¤   paramBlock.tcpStream = mStream;
d6fed4 ¤   paramBlock.csCode = TCPRelease;
4bcdcf ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
3b3d04 ¤   mStream = nil;
dab2e9 ¤   delete[] mReceiveBuffer;
7b057f ¤   mReceiveBuffer = nil;
8467c5 ¤
dcaf5c ¤   while (inMaxBacklog > 0) {
1b041b ¤   ¤   PushListenQ();
267f3d ¤   ¤   inMaxBacklog--;
b19371 ¤   }
d267c5 ¤
2d2bc8 ¤   mIsListening = true;
3eefe6 }
b7af5a
f05f00 ¤   CSocket *
adae9e CMacTCPTCPSocket::Accept(
cd455d ¤   PGPSocketAddressInternet *¤ outAddress,
b6b450 ¤   SInt32 *¤   ¤   ¤   ¤   ¤   ioAddressLength)
d1bb36 {
30292f ¤   if (! mIsListening) {
f2afa7 ¤   ¤   ThrowPGPError_(kPGPError_SocketsOperationNotSupported);
7b9371 ¤   }
1467c5 ¤
a93b5f ¤   TCPiopb¤¤   paramBlock;
e4f5d1 ¤   PGPError¤   pgpError;
d0af5a
25f523 ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
a1efca ¤   paramBlock.ioCRefNum = sRefNum;
92eabb ¤   paramBlock.csCode = TCPStatus;
dee851 ¤   paramBlock.tcpStream = mFirstListenQ->mStream;
cfcdcf ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
ae5f8f ¤   while ((paramBlock.csParam.status.connectionState == 2)
93dabd ¤   && (! mAbort)) {
9542b3 ¤   ¤   mInCallback = true;
9642ba ¤   ¤   pgpError = CallIdleEventHandler();
e1d823 ¤   ¤   if (IsPGPError(pgpError)) {
76d730 ¤   ¤   ¤   Close();
b50e7c ¤   ¤   ¤   mInCallback = false;
a0cdcb ¤   ¤   ¤   break;
060fe4 ¤   ¤   }
66b52a ¤   ¤   mInCallback = false;
3baf5a
249a10 ¤   ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
be2a9f ¤   ¤   paramBlock.ioCRefNum = sRefNum;
07ab48 ¤   ¤   paramBlock.csCode = TCPStatus;
d7f976 ¤   ¤   paramBlock.tcpStream = mFirstListenQ->mStream;
ff157d ¤   ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
6f9371 ¤   }
6ab137 ¤   if (mAbort) {
5296bb ¤   ¤   Close();
54176e ¤   ¤   ThrowPGPError_(kPGPError_UserAbort);
7a9371 ¤   }
0d67c5 ¤
26a37d ¤   CMacTCPTCPSocket *¤ theSocket = mFirstListenQ;
d567c5 ¤
6ec45b ¤   mFirstListenQ = mFirstListenQ->mNext;
dbaa62 ¤   outAddress->sin_family = kPGPAddressFamilyInternet;
--b957 000fcc1cd63401202a4 Page 6 of CMacTCPTCPSocket.cp
bc88e3 ¤   outAddress->sin_port = paramBlock.csParam.status.remotePort;
c78860 ¤   outAddress->sin_addr.s_addr = paramBlock.csParam.status.remoteHost;
751421 ¤   *ioAddressLength = sizeof(PGPSocketAddressInternet);
5320f9 ¤   theSocket->mConnected = true;
a716a8 ¤   theSocket->mBound = true;
d2d5b8 ¤   theSocket->mBoundPort = mBoundPort;
680362 ¤   theSocket->mBoundAddress = mBoundAddress;
b7af5a
ac5168 ¤   try {
8f041b ¤   ¤   PushListenQ();
8b9371 ¤   }
4967c5 ¤
10e0a3 ¤   catch (...) {
bd0795 ¤   ¤   delete theSocket;
a7a33a ¤   ¤   throw;
879371 ¤   }
3667c5 ¤
234a85 ¤   return theSocket;
aeefe6 }
14af5a
c5af5a
13af5a
b96d52 ¤   void
5e82be CMacTCPTCPSocket::IOControlSocket(
952017 ¤   SInt32¤ ¤   inCommand,
90ac75 ¤   UInt32 *¤   ioParam)
27bb36 {
fef912 ¤   switch (inCommand) {
3d3be5 ¤   ¤   case kPGPSocketCommandGetUnreadData:
dd5b34 ¤   ¤   {
a8e8a2 ¤   ¤   ¤   TCPiopb¤paramBlock;
ab87c7 ¤   ¤   ¤
80bca5 ¤   ¤   ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
dfa2f9 ¤   ¤   ¤   paramBlock.ioCRefNum = sRefNum;
d6c05d ¤   ¤   ¤   paramBlock.tcpStream = mStream;
86a504 ¤   ¤   ¤   paramBlock.csCode = TCPStatus;
3e045a ¤   ¤   ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
b687c7 ¤   ¤   ¤
406614 ¤   ¤   ¤   *ioParam = paramBlock.csParam.status.amtUnreadData;
da0fe4 ¤   ¤   }
662f68 ¤   ¤   break;
cf9371 ¤   }
bbefe6 }
bdaf5a
b56685 ¤   pascal void
64926e CMacTCPTCPSocket::TCPNotifyProc(
e7a1bb ¤   StreamPtr¤  ¤   ¤   inTCPStream,
cd6377 ¤   UInt16¤ ¤   ¤   ¤   inEventCode,
7701d0 ¤   Ptr¤¤   ¤   ¤   ¤   inUserData,
b64268 ¤   UInt16¤ ¤   ¤   ¤   inTermReason,
7d67ec ¤   struct ICMPReport *¤inICMPMsg)
1dbb36 {
8e5b8f ¤   (void) inTCPStream;
61b74e ¤   (void) inICMPMsg;
0caf5a
c5acee ¤   if ((inEventCode == TCPTerminate)
0f48ee ¤   && ((inTermReason == TCPRemoteAbort)
238f61 ¤   || (inTermReason == TCPULPTimeoutTerminate))
054500 ¤   && (inUserData != NULL)) {
61f2e4 ¤   ¤   ((CMacTCPTCPSocket *) inUserData)->mConnectionAborted = true;
249371 ¤   }
60efe6 }
e1af5a
a4af5a
8aaf5a
a36d52 ¤   void
2c6bd6 CMacTCPTCPSocket::GetSocketName(
5ad657 ¤   PGPSocketAddressInternet *¤ outName)
50bb36 {
51b399 ¤   TCPiopb¤paramBlock;
59af5a
fcf523 ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
--4bd0 00104741795401202a4 Page 7 of CMacTCPTCPSocket.cp
8fefca ¤   paramBlock.ioCRefNum = sRefNum;
f78d6e ¤   paramBlock.tcpStream = mStream;
e7eabb ¤   paramBlock.csCode = TCPStatus;
9fcdcf ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
13af5a
6ab36b ¤   if ((paramBlock.csParam.status.connectionState >= 8)
33d7e4 ¤   && (paramBlock.csParam.status.connectionState <= 18)) {
0566c8 ¤   ¤   pgpClearMemory(outName, sizeof(PGPSocketAddressInternet));
1b1d5e ¤   ¤   outName->sin_family = kPGPAddressFamilyInternet;
8e55c8 ¤   ¤   outName->sin_port = paramBlock.csParam.status.localPort;
0f4f45 ¤   ¤   outName->sin_addr.s_addr = paramBlock.csParam.status.localHost;
f2f037 ¤   } else {
eff1ba ¤   ¤   CMacTCPInternetSocket::GetSocketName(outName);
649371 ¤   }
a2efe6 }
d0af5a
8baf5a
1faf5a
a56d52 ¤   void
816265 CMacTCPTCPSocket::GetPeerName(
bad657 ¤   PGPSocketAddressInternet *¤ outName)
13bb36 {
6cb399 ¤   TCPiopb¤paramBlock;
a2af5a
c1f523 ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
28efca ¤   paramBlock.ioCRefNum = sRefNum;
788d6e ¤   paramBlock.tcpStream = mStream;
80eabb ¤   paramBlock.csCode = TCPStatus;
34cdcf ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
87af5a
69b36b ¤   if ((paramBlock.csParam.status.connectionState >= 8)
47d7e4 ¤   && (paramBlock.csParam.status.connectionState <= 18)) {
6d66c8 ¤   ¤   pgpClearMemory(outName, sizeof(PGPSocketAddressInternet));
3b1d5e ¤   ¤   outName->sin_family = kPGPAddressFamilyInternet;
657a05 ¤   ¤   outName->sin_port = paramBlock.csParam.status.remotePort;
123ac0 ¤   ¤   outName->sin_addr.s_addr = paramBlock.csParam.status.remoteHost;
a4f037 ¤   } else {
ede57e ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotConnected);
3b9371 ¤   }
04efe6 }
--2efb 0014682e49e401202a5 Page 1 of CMacTCPTCPSocket.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
9f6aa5 ¤   $Id: CMacTCPTCPSocket.h,v 1.7.10.1 1998/11/12 03:22:28 heller Exp $
23f7f7 ____________________________________________________________________________*/
0baf5a
d58d55 #pragma once·
f8af5a
f4781d #include "CMacTCPInternetSocket.h"
0eaf5a
41af5a
bbaf5a
62af5a
325f8d class CMacTCPTCPSocket : public CMacTCPInternetSocket {
e35ed4 public:
487303 ¤   ¤   ¤   ¤   ¤   ¤   ¤   CMacTCPTCPSocket();
4467f5 ¤   virtual¤¤   ¤   ¤   ¤   ~CMacTCPTCPSocket();
4667c5 ¤
e0c3e4 ¤   virtual void¤   ¤   ¤   Connect(const PGPSocketAddressInternet *
06d197 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress);
b5eba8 ¤   virtual SInt32¤ ¤   ¤   Send(const void * inBuffer, SInt32 inLength,
2a93df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inFlags);
c82c9e ¤   virtual SInt32¤ ¤   ¤   SendTo(const void * inBuffer, SInt32 inLength,
54670a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPSocketAddressInternet * inAddress);
0dc6f0 ¤   virtual SInt32¤ ¤   ¤   Receive(void * outBuffer, SInt32 inLength,
7393df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inFlags);
d9a4bd ¤   virtual SInt32¤ ¤   ¤   ReceiveFrom(void * outBuffer, SInt32 inSize,
a1fcb3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSocketAddressInternet * outAddress,
7a7eee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * ioAddressLength);
c360a3 ¤   virtual void¤   ¤   ¤   Listen(SInt32 inMaxBacklog);
83b420 ¤   virtual CSocket *¤  ¤   Accept(PGPSocketAddressInternet * outAddress,
467eee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * ioAddressLength);
86da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
597b46 ¤   virtual void¤   ¤   ¤   IOControlSocket(SInt32 inCommand,
4dae0c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 * ioParam);
a4af5a
b90af8 ¤   virtual void¤   ¤   ¤   GetSocketName(PGPSocketAddressInternet * outName);
893bda ¤   virtual void¤   ¤   ¤   GetPeerName(PGPSocketAddressInternet * outName);
adaf5a
8ca2d3 protected:
fa34a6 ¤   StreamPtr¤  ¤   ¤   ¤   mStream;
05c5a3 ¤   Boolean¤¤   ¤   ¤   ¤   mIsListening;
850bde ¤   char *¤ ¤   ¤   ¤   ¤   mReceiveBuffer;
f59cd9 ¤   Boolean¤¤   ¤   ¤   ¤   mConnectionAborted;
aa7a1c ¤   TCPNotifyUPP¤   ¤   ¤   mNotifyProcUPP;
958ae0 ¤   TCPiopb¤¤   ¤   ¤   ¤   mListenParams;
b398b8 ¤   CMacTCPTCPSocket *¤ ¤   mFirstListenQ;
48f102 ¤   CMacTCPTCPSocket *¤ ¤   mLastListenQ;
2db9af ¤   CMacTCPTCPSocket *¤ ¤   mNext;
78af5a
5eb812 ¤   virtual Boolean¤¤   ¤   IsReadable();
305e0d ¤   virtual Boolean¤¤   ¤   IsWriteable();
d70910 ¤   virtual Boolean¤¤   ¤   IsError() { return mConnectionAborted; }
cfaf5a
5e0f00 ¤   virtual Boolean¤¤   ¤   IsListening() { return mIsListening; }
d467c5 ¤
4fc2c0 ¤   void¤   ¤   ¤   ¤   ¤   PushListenQ();
0767c5 ¤
0e3a59 ¤   static pascal void¤ ¤   TCPNotifyProc(StreamPtr inTCPStream,
0e8889 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt16 inEventCode,
0e305b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   Ptr inUserData, UInt16 inTermReason,
cd20f6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   struct ICMPReport * inICMPMsg);
eb82f7 };
46af5a
--831f 000f7fd2570401202a6 Page 1 of CMacTCPUDPSocket.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
7626a7 ¤   $Id: CMacTCPUDPSocket.cp,v 1.11.10.1 1998/11/12 03:22:29 heller Exp $
31f7f7 ____________________________________________________________________________*/
ebaf5a
c72363 #include <Devices.h>
b2af5a
1d0d08 #include "pgpMem.h"
30af5a
4f2ddf #include "CMacTCPUDPSocket.h"
81af5a
41af5a
f355ba const SInt32¤   kReceiveBufferSize¤ =¤  16*1024;
0daf5a
c1af5a
92f70a CMacTCPUDPSocket::CMacTCPUDPSocket()
248a96 ¤   : mCreated(false), mReceiveBuffer(nil),
c96804 ¤   ··mSending(false), mDataAvailable(false), mNotifyProcUPP(nil)
64bb36 {
36044e ¤   mExcessReceiveHandle = ::NewHandle(0);
c3fd0c ¤   if (mExcessReceiveHandle == nil) {
e216b3 ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
f39371 ¤   }
ef1add ¤   mNotifyProcUPP = NewUDPNotifyProc(UDPNotifyProc);
7b6c77 ¤   if (mNotifyProcUPP == nil) {
2316b3 ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
769371 ¤   }
5fe7ab ¤   mSocketType = kPGPSocketTypeDatagram;
6fefe6 }
7faf5a
4caf5a
07af5a
d66b50 CMacTCPUDPSocket::~CMacTCPUDPSocket()
c1bb36 {
be2e70 ¤   ::DisposeHandle(mExcessReceiveHandle);
07c300 ¤   ::DisposeRoutineDescriptor(mNotifyProcUPP);
83eb40 ¤   if (mCreated) {
c77a66 ¤   ¤   UDPiopb¤paramBlock;
a21b52 ¤   ¤
38cf8a ¤   ¤   while (mSending) {
e10429 ¤   ¤   ¤   CallIdleEventHandler();
210fe4 ¤   ¤   }
381b52 ¤   ¤
159a10 ¤   ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
2b2a9f ¤   ¤   paramBlock.ioCRefNum = sRefNum;
5b1e32 ¤   ¤   paramBlock.csCode = UDPRelease;
e173d7 ¤   ¤   paramBlock.udpStream = mStream;
56157d ¤   ¤   ::PBControlSync((ParmBlkPtr) &paramBlock);
1c9371 ¤   }
2e1da3 ¤   delete [] mReceiveBuffer;
41efe6 }
a1af5a
a2af5a
6faf5a
286d52 ¤   void
4d7e3c CMacTCPUDPSocket::Connect(
9d9d9f ¤   const PGPSocketAddressInternet *¤   inAddress)
bbbb36 {
1b96a0 ¤   mConnected = true;
4cec82 ¤   ::BlockMoveData(inAddress, &mConnectAddress,
938cb4 ¤   ¤   ¤   sizeof(PGPSocketAddressInternet));
f1efe6 }
d7af5a
4caf5a
b9af5a
e8959b ¤   SInt32
adc8ed CMacTCPUDPSocket::Send(
f74f2f ¤   const void *¤   inBuffer,
--09b1 000d6564db3401202a6 Page 2 of CMacTCPUDPSocket.cp
195537 ¤   SInt32¤ ¤   ¤   inLength,
babb7a ¤   SInt32¤ ¤   ¤   inFlags)
92bb36 {
ca087b ¤   SInt16¤ result = 0;
f167c5 ¤
130647 ¤   (void) inFlags;
3d67c5 ¤
bb8d78 ¤   if (mConnected) {
bb99bb ¤   ¤   result = SendTo(inBuffer, inLength, &mConnectAddress);
04f037 ¤   } else {
91e57e ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotConnected);
2c9371 ¤   }
e667c5 ¤
b55d73 ¤   return result;
d6efe6 }
8baf5a
87af5a
faaf5a
ce959b ¤   SInt32
f3a08d CMacTCPUDPSocket::SendTo(
903074 ¤   const void *¤   ¤   ¤   ¤   ¤   ¤   inBuffer,
eac1ca ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   inLength,
ce9d9f ¤   const PGPSocketAddressInternet *¤   inAddress)
e9bb36 {
24bc46 ¤   SInt32¤ ¤   ¤   toSend = inLength;
874107 ¤   char *¤ ¤   ¤   next = (char *) inBuffer;
07f8c5 ¤   UDPiopb¤¤   ¤   paramBlock;
91a710 ¤   wdsEntry¤   ¤   wds[2] = {¤ {0, 0},
cc8862 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {0, 0}};
a767c5 ¤
14334a ¤   CreateUDPStream((mBound) ? mBoundPort : 0);
7567c5 ¤
3c7fcf ¤   while (toSend > 0) {
fd0b7b ¤   ¤   wds[0].length = (toSend > USHRT_MAX) ? USHRT_MAX : toSend;
c4b625 ¤   ¤   wds[0].ptr = next;
a04a4d ¤   ¤   toSend -= wds[0].length;
15104c ¤   ¤   next += wds[0].length;
039a10 ¤   ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
0c73d7 ¤   ¤   paramBlock.udpStream = mStream;
86d96c ¤   ¤   paramBlock.csParam.send.remoteHost = inAddress->sin_addr.s_addr;
692f23 ¤   ¤   paramBlock.csParam.send.remotePort = inAddress->sin_port;
6c0e54 ¤   ¤   paramBlock.csParam.send.wdsPtr = (Ptr) wds;
e08214 ¤   ¤   mSending = true;
a9fd2a ¤   ¤   try {
26a183 ¤   ¤   ¤   ProcessCommand(UDPWrite, (IPParamBlock *) &paramBlock);
00ed0b ¤   ¤   ¤   mSending = false;
e30fe4 ¤   ¤   }
db1b52 ¤   ¤
efda39 ¤   ¤   catch (...) {
54ed0b ¤   ¤   ¤   mSending = false;
234199 ¤   ¤   ¤   throw;
1a0fe4 ¤   ¤   }
d29371 ¤   }
9767c5 ¤
2b94d1 ¤   return inLength;
21efe6 }
4daf5a
c1af5a
a5af5a
30af5a
10959b ¤   SInt32
36ec63 CMacTCPUDPSocket::Receive(
6bc9d9 ¤   void *¤ outBuffer,
12beea ¤   SInt32¤ inLength,
040856 ¤   SInt32¤ inFlags)
2cbb36 {
5b34f3 ¤   SInt32¤ result = 0;
f267c5 ¤
cf0647 ¤   (void) inFlags;
9a67c5 ¤
244677 ¤   if (mBound) {
d62637 ¤   ¤   result = ReceiveFrom(outBuffer, inLength, nil, nil);
--a864 000f5f3aa64401202a6 Page 3 of CMacTCPUDPSocket.cp
faf037 ¤   } else {
423e64 ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotBound);
4e9371 ¤   }
cf67c5 ¤
2f5d73 ¤   return result;
29efe6 }
40af5a
7daf5a
cfaf5a
ca959b ¤   SInt32
72726d CMacTCPUDPSocket::ReceiveFrom(
e6d5b1 ¤   void *¤ ¤   ¤   ¤   ¤   ¤   outBuffer,
0faa35 ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   inSize,
d3455d ¤   PGPSocketAddressInternet *¤ outAddress,
e7b450 ¤   SInt32 *¤   ¤   ¤   ¤   ¤   ioAddressLength)
ddbb36 {
1bc557 ¤   UDPiopb¤¤   paramBlock;
7f2c92 ¤   Byte *¤ ¤   theBuffer = (Byte *) outBuffer;
a0386c ¤   UInt16¤ ¤   theSize = (inSize > USHRT_MAX) ? USHRT_MAX : inSize;
f46da6 ¤   UInt16¤ ¤   excessReceiveHandleSize =
ee50fb ¤   ¤   ¤   ¤   ¤   ¤   ::GetHandleSize(mExcessReceiveHandle);
4ecfdd ¤   UInt16¤ ¤   amountToCopy;
b267c5 ¤
7e812e ¤   if (! mBound) {
1e3e64 ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotBound);
f79371 ¤   }
e02eb8 ¤   CreateUDPStream(mBoundPort);
f467c5 ¤
ca70ce ¤   if (excessReceiveHandleSize > 0) {
cb28ee ¤   ¤   amountToCopy = (theSize > excessReceiveHandleSize) ?
06d9a9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   excessReceiveHandleSize : theSize;
900230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
9952ff ¤   ¤   ::BlockMoveData(¤   *mExcessReceiveHandle,
6c1984 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theBuffer,
1d4010 ¤   ¤   ¤   ¤   ¤   ¤   ¤   amountToCopy);
0b63aa ¤   ¤   theBuffer += amountToCopy;
7ff51e ¤   ¤   theSize -= amountToCopy;
b2fed3 ¤   ¤   excessReceiveHandleSize -= amountToCopy;
3b852e ¤   ¤   ::BlockMoveData(¤   *mExcessReceiveHandle + amountToCopy,
bfb4e3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   *mExcessReceiveHandle,
c0693a ¤   ¤   ¤   ¤   ¤   ¤   ¤   excessReceiveHandleSize);
0f4bfc ¤   ¤   ::SetHandleSize(¤   mExcessReceiveHandle,
08693a ¤   ¤   ¤   ¤   ¤   ¤   ¤   excessReceiveHandleSize);
049371 ¤   }
e467c5 ¤
4aaadd ¤   if (theSize > 0) {
0b9a10 ¤   ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
e073d7 ¤   ¤   paramBlock.udpStream = mStream;
5a22ee ¤   ¤   ProcessCommand(UDPRead, (IPParamBlock *) &paramBlock);
43fdfa ¤   ¤   mDataAvailable = false;
ffff2b ¤   ¤   if (outAddress != nil) {
f3e129 ¤   ¤   ¤   outAddress->sin_family = kPGPAddressFamilyInternet;
bc7fc8 ¤   ¤   ¤   outAddress->sin_port = paramBlock.csParam.receive.remotePort;
e2bfa9 ¤   ¤   ¤   outAddress->sin_addr.s_addr =·
07902c ¤   ¤   ¤   ¤   ¤   paramBlock.csParam.receive.remoteHost;
2c0fe4 ¤   ¤   }
e63414 ¤   ¤   if (ioAddressLength != nil) {
e1e8bd ¤   ¤   ¤   *ioAddressLength = sizeof(PGPSocketAddressInternet);
640fe4 ¤   ¤   }
72ee4d ¤   ¤   amountToCopy = (theSize > paramBlock.csParam.receive.rcvBuffLen) ?
045ffa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   paramBlock.csParam.receive.rcvBuffLen
3f253b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   : theSize;
354912 ¤   ¤   ::BlockMoveData(¤   paramBlock.csParam.receive.rcvBuff,
781984 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theBuffer,
e44010 ¤   ¤   ¤   ¤   ¤   ¤   ¤   amountToCopy);
784bfc ¤   ¤   ::SetHandleSize(¤   mExcessReceiveHandle,
1cad3d ¤   ¤   ¤   ¤   ¤   ¤   ¤   excessReceiveHandleSize
46490c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   + (paramBlock.csParam.receive.rcvBuffLen
2ebe60 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   - amountToCopy));
24384b ¤   ¤   if (MemError() != noErr) {
ebce01 ¤   ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
f50fe4 ¤   ¤   }
--fe64 000420afb71401202a6 Page 4 of CMacTCPUDPSocket.cp
44e75b ¤   ¤   ::BlockMoveData(¤   paramBlock.csParam.receive.rcvBuff + amountToCopy,
a25d32 ¤   ¤   ¤   ¤   ¤   ¤   ¤   mExcessReceiveHandle + excessReceiveHandleSize,
d74ad9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   paramBlock.csParam.receive.rcvBuffLen
bb352a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   - amountToCopy);
f0f51e ¤   ¤   theSize -= amountToCopy;
179371 ¤   }
8a1b52 ¤   ¤
c5169b ¤   return inSize - theSize;
50efe6 }
e3af5a
36af5a
846d52 ¤   void
763267 CMacTCPUDPSocket::Listen(
a85148 ¤   SInt32¤ inMaxBacklog)
d9bb36 {
37645d ¤   (void) inMaxBacklog;
0867c5 ¤
b06bbb ¤   ThrowPGPError_(kPGPError_SocketsOperationNotSupported);
f1efe6 }
c5af5a
1baf5a
e5af5a
8b5f00 ¤   CSocket *
17c740 CMacTCPUDPSocket::Accept(
24455d ¤   PGPSocketAddressInternet *¤ outAddress,
d2b450 ¤   SInt32 *¤   ¤   ¤   ¤   ¤   ioAddressLength)
c5bb36 {
a92844 ¤   (void) outAddress;
7a67c5 ¤
d5eb15 ¤   *ioAddressLength = 0;
e467c5 ¤
5b6bbb ¤   ThrowPGPError_(kPGPError_SocketsOperationNotSupported);
f967c5 ¤
2b7409 ¤   return (CSocket *) kInvalidPGPSocketRef;
d3efe6 }
23af5a
55af5a
24af5a
ea6d52 ¤   void
828b51 CMacTCPUDPSocket::CreateUDPStream(
fabc69 ¤   SInt16¤ inPort)
32bb36 {
645d1c ¤   if (! mCreated) {
087a66 ¤   ¤   UDPiopb¤paramBlock;
381b52 ¤   ¤
9a9a10 ¤   ¤   pgpClearMemory(&paramBlock, sizeof(paramBlock));
641008 ¤   ¤   paramBlock.csParam.create.rcvBuff =·
aafc4f ¤   ¤   ¤   ¤   mReceiveBuffer = new char[kReceiveBufferSize];
edcf3a ¤   ¤   if (mReceiveBuffer == nil) {
e3ce01 ¤   ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
570fe4 ¤   ¤   }
c52d2a ¤   ¤   paramBlock.csParam.create.rcvBuffLen = kReceiveBufferSize;
e665d7 ¤   ¤   paramBlock.csParam.create.localPort = inPort;
1b2bac ¤   ¤   paramBlock.csParam.create.notifyProc = mNotifyProcUPP;
821d24 ¤   ¤   paramBlock.csParam.create.userDataPtr = (Ptr) this;
d70d06 ¤   ¤   ProcessCommand(UDPCreate, (IPParamBlock *) &paramBlock);
48b808 ¤   ¤   mStream = paramBlock.udpStream;
21a79c ¤   ¤   mCreated = true;
1a9371 ¤   }
62efe6 }
38af5a
f3af5a
587e69 ¤   Boolean
8c254b CMacTCPUDPSocket::IsReadable()
d0bb36 {
c720c2 ¤   return (mDataAvailable || (::GetHandleSize(mExcessReceiveHandle) > 0));
bbefe6 }
a3af5a
10af5a
9baf5a
2c7c35 pascal void
427af2 CMacTCPUDPSocket::UDPNotifyProc(
--bfc4 001b3f42623401202a6 Page 5 of CMacTCPUDPSocket.cp
4030df ¤   StreamPtr¤  ¤   ¤   inUDPStream,
956377 ¤   UInt16¤ ¤   ¤   ¤   inEventCode,
8701d0 ¤   Ptr¤¤   ¤   ¤   ¤   inUserData,
d867ec ¤   struct ICMPReport *¤inICMPMsg)
9cbb36 {
88caeb ¤   (void) inUDPStream;
a5b74e ¤   (void) inICMPMsg;
be67c5 ¤
326586 ¤   if (inEventCode == UDPDataArrival) {
a475f3 ¤   ¤   ((CMacTCPUDPSocket *) inUserData)->mDataAvailable = true;
889371 ¤   }
7defe6 }
c2af5a
a3af5a
46af5a
dd6d52 ¤   void
7d9c6d CMacTCPUDPSocket::GetPeerName(
b5d657 ¤   PGPSocketAddressInternet *¤ outName)
e6bb36 {
798d78 ¤   if (mConnected) {
666a59 ¤   ¤   *outName = mConnectAddress;
9df037 ¤   } else {
09e57e ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotConnected);
3d9371 ¤   }
b3be43 }¶
--e509 0018d7f6abc401202a7 Page 1 of CMacTCPUDPSocket.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
7a161f ¤   $Id: CMacTCPUDPSocket.h,v 1.6.10.1 1998/11/12 03:22:29 heller Exp $
52f7f7 ____________________________________________________________________________*/
62af5a
588d55 #pragma once·
09af5a
13781d #include "CMacTCPInternetSocket.h"
f5af5a
ae453e class CMacTCPUDPSocket : public CMacTCPInternetSocket {
255ed4 public:
006277 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CMacTCPUDPSocket();
829705 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ~CMacTCPUDPSocket();
7567c5 ¤
5797b9 ¤   virtual void¤   ¤   ¤   ¤   Connect(const PGPSocketAddressInternet *
d547d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress);
006bd1 ¤   virtual SInt32¤ ¤   ¤   ¤   Send(const void * inBuffer, SInt32 inLength,
fac0c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inFlags);
7a8f4a ¤   virtual SInt32¤ ¤   ¤   ¤   SendTo(const void * inBuffer, SInt32 inLength,
9b3f0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPSocketAddressInternet *
d047d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress);
c59f93 ¤   virtual SInt32¤ ¤   ¤   ¤   Receive(void * outBuffer, SInt32 inLength,
9ac0c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inFlags);
4724c4 ¤   virtual SInt32¤ ¤   ¤   ¤   ReceiveFrom(void * outBuffer, SInt32 inSize,
f12c18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSocketAddressInternet * outAddress,
617e0c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * ioAddressLength);
2f5864 ¤   virtual void¤   ¤   ¤   ¤   Listen(SInt32 inMaxBacklog);
cf4028 ¤   virtual CSocket *¤  ¤   ¤   Accept(PGPSocketAddressInternet * outAddress,
b57e0c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * ioAddressLength);
7367c5 ¤
c4a9c7 ¤   virtual void¤   ¤   ¤   ¤   IOControlSocket(SInt32 inCommand,
7dd01a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 * ioParam)
9a6c7e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { ¤ (void) inCommand; (void) ioParam;
d0fc5e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ThrowPGPError_(
0b6877 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPError_SocketsOperationNotSupported); }
3caf5a
55a237 ¤   virtual void¤   ¤   ¤   ¤   GetPeerName(PGPSocketAddressInternet * outName);
bdaf5a
1fa2d3 protected:
8a1318 ¤   typedef CMacTCPInternetSocket¤  ¤   inherited;
4867c5 ¤
2e475b ¤   PGPSocketAddressInternet¤   mConnectAddress;
9f18c5 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mCreated;
ea35e0 ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   mStream;
1e7074 ¤   char *¤ ¤   ¤   ¤   ¤   ¤   mReceiveBuffer;
4fa567 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mSending;
18ea5f ¤   Handle¤ ¤   ¤   ¤   ¤   ¤   mExcessReceiveHandle;
3f7990 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mDataAvailable;
eff36f ¤   UDPNotifyUPP¤   ¤   ¤   ¤   mNotifyProcUPP;
8967c5 ¤
1067c5 ¤
9e2787 ¤   virtual Boolean¤¤   ¤   ¤   IsReadable();
b2060c ¤   virtual Boolean¤¤   ¤   ¤   IsWriteable() { return mBound; }
144293 ¤   virtual Boolean¤¤   ¤   ¤   IsError() { return false; }
dbaf5a
cd31a7 ¤   virtual void¤   ¤   ¤   ¤   CreateUDPStream(SInt16¤ inPort);
f367c5 ¤
88fbd5 ¤   static pascal void¤ ¤   ¤   UDPNotifyProc(StreamPtr inUDPStream,
484256 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt16 inEventCode, Ptr inUserData,
011d98 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   struct ICMPReport * inICMPMsg);
8dbf26 };¶
--2047 00056faa479401202a8 Page 1 of COTInternetSocket.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
fdefcc ¤   $Id: COTInternetSocket.cp,v 1.12.10.1 1998/11/12 03:22:30 heller Exp $
3bf7f7 ____________________________________________________________________________*/
03af5a
bcd92d #include <stdarg.h>
19af5a
1e0d08 #include "pgpMem.h"
55af5a
95bcb4 #include "COTInternetSocket.h"
f2af5a
7daf5a
32d875 COTInternetSocket::COTInternetSocket()
a4b296 ¤   : mEndpointRef(nil), mCanceled(false)
febb36 {
3f4a0c ¤   // Set up the binding address to default
54d3e1 ¤   mBoundAddress.fAddressType = AF_INET;
98a0a6 ¤   mBoundAddress.fPort = 0;
2a9a62 ¤   mBoundAddress.fHost = 0;
a6efe6 }
b8af5a
95af5a
baaf5a
84ed73 COTInternetSocket::~COTInternetSocket()
5dbb36 {
7cefe6 }
e1af5a
02af5a
a8af5a
d96d52 ¤   void
aca71f COTInternetSocket::Close()
e9bb36 {
b271e9 ¤   if (mInCallback) {
fd35fd ¤   ¤   ::OTCancelSynchronousCalls(mEndpointRef, kOTCanceledErr);
a00384 ¤   ¤   mCanceled = true;
7af037 ¤   } else {
db4b07 ¤   ¤   Cleanup();
ce1b52 ¤   ¤
c15811 ¤   ¤   ::OTUnbind(mEndpointRef);
f58f05 ¤   ¤   ::OTCloseProvider(mEndpointRef);
6f4e34 ¤   ¤   delete this;
729371 ¤   }
0cefe6 }
f4af5a
e3af5a
61af5a
406d52 ¤   void
696326 COTInternetSocket::Bind(
239d9f ¤   const PGPSocketAddressInternet *¤   inAddress)
f3bb36 {
ed6302 ¤   mBoundAddress.fPort = inAddress->sin_port;
9c161f ¤   mBoundAddress.fHost = inAddress->sin_addr.s_addr;
0fefe6 }
53af5a
d9af5a
efaf5a
226d52 ¤   void
67a130 COTInternetSocket::DoBind(
cf84eb ¤   OTQLen¤ inQLen)
95bb36 {
7adc42 ¤   OSStatus¤   err;
f96210 ¤   TBind¤  ¤   theBind;
f967c5 ¤
12a207 ¤   theBind.addr.len = sizeof(mBoundAddress);
b206ac ¤   theBind.addr.buf = (UInt8 *) &mBoundAddress;
2f2441 ¤   theBind.addr.maxlen = sizeof(mBoundAddress);
099208 ¤   theBind.qlen = inQLen;
5667c5 ¤
--4394 000326b156f401202a8 Page 2 of COTInternetSocket.cp
8f18a3 ¤   err = ::OTBind(¤mEndpointRef,
0cec48 ¤   ¤   ¤   ¤   ¤   &theBind,
f2f73d ¤   ¤   ¤   ¤   ¤   &theBind);
6faf5a
59bc4c ¤   ThrowIfOTError(err);
6fefe6 }
2faf5a
75af5a
f7af5a
f16d52 ¤   void
6086f9 COTInternetSocket::Cleanup()
01bb36 {
e8efe6 }
6aaf5a
cdaf5a
bfaf5a
ab7e69 ¤   Boolean
d3efd2 COTInternetSocket::IsReadable()
30bb36 {
14fcfd ¤   Boolean¤¤   isReadable = false;
66c740 ¤   size_t¤ ¤   numBytes;
ac3a9f ¤   OTResult¤   result;
9aaf5a
d49b03 ¤   result = ::OTCountDataBytes(mEndpointRef, &numBytes);
01af5a
f4133c ¤   if ((result == kOTNoError) && (numBytes > 0)) {
9c3a46 ¤   ¤   isReadable = true;
4cf037 ¤   } else {
28f6ca ¤   ¤   result = ::OTLook(mEndpointRef);
821b52 ¤   ¤
166459 ¤   ¤   switch (result) {
923682 ¤   ¤   ¤   case T_DISCONNECT:
31525c ¤   ¤   ¤   case T_ORDREL:
28f776 ¤   ¤   ¤   {
f2a211 ¤   ¤   ¤   ¤   isReadable = true;
31a3a6 ¤   ¤   ¤   }
2ccdcb ¤   ¤   ¤   break;
e187c7 ¤   ¤   ¤
5f87c7 ¤   ¤   ¤
b3cb86 ¤   ¤   ¤   case T_LISTEN:
58f776 ¤   ¤   ¤   {
2e030e ¤   ¤   ¤   ¤   if (IsListening()) {
9ae3e2 ¤   ¤   ¤   ¤   ¤   isReadable = true;
f12613 ¤   ¤   ¤   ¤   }
88a3a6 ¤   ¤   ¤   }
7fcdcb ¤   ¤   ¤   break;
510fe4 ¤   ¤   }
829371 ¤   }
a867c5 ¤
cb3262 ¤   return isReadable;
dcefe6 }
a2af5a
f8af5a
35af5a
d0af5a
d37e69 ¤   Boolean
0785de COTInternetSocket::IsWriteable()
e5bb36 {
0a70e1 ¤   OTResult¤   result = ::OTGetEndpointState(mEndpointRef);
e88716 ¤   Boolean¤¤   isWriteable = false;
1767c5 ¤
2f9014 ¤   switch (mSocketType) {
eeb501 ¤   ¤   case kPGPSocketTypeStream:
405b34 ¤   ¤   {
0095d5 ¤   ¤   ¤   if (result == T_DATAXFER) {
122a9f ¤   ¤   ¤   ¤   isWriteable = true;
8ea3a6 ¤   ¤   ¤   }
020fe4 ¤   ¤   }
392f68 ¤   ¤   break;
af1b52 ¤   ¤
811b52 ¤   ¤
32ac97 ¤   ¤   case kPGPSocketTypeDatagram:
--91e2 0001f1c6bb8401202a8 Page 3 of COTInternetSocket.cp
e35b34 ¤   ¤   {
521f39 ¤   ¤   ¤   if (result == T_IDLE) {
512a9f ¤   ¤   ¤   ¤   isWriteable = true;
84a3a6 ¤   ¤   ¤   }
320fe4 ¤   ¤   }
109371 ¤   }
7467c5 ¤
cd11ff ¤   return isWriteable;
72efe6 }
39af5a
70af5a
69af5a
9b7e69 ¤   Boolean
49c7af COTInternetSocket::IsError()
07bb36 {
090413 ¤   if (::OTLook(mEndpointRef) == T_DISCONNECT) {
48eaf5 ¤   ¤   return true;
87f037 ¤   } else {
0e92b0 ¤   ¤   return false;
a89371 ¤   }
bfefe6 }
edaf5a
3eaf5a
92af5a
d26685 ¤   pascal void
0f19b6 COTInternetSocket::NotifyProc(
ccbd14 ¤   void *¤ ¤   contextPtr,
7c5b19 ¤   OTEventCode¤code,·
87e206 ¤   OTResult¤   result,
8a4d50 ¤   void *¤ ¤   cookie)
abbb36 {
20825b ¤   (void) result;
c0a669 ¤   (void) cookie;
ad67c5 ¤
7e08a1 ¤   if (code == kOTSyncIdleEvent) {
af23bd ¤   ¤   ((COTInternetSocket *) contextPtr)->mInCallback = true;
e19f44 ¤   ¤   if (CallIdleEventHandler() != kPGPError_NoErr) {
fca23b ¤   ¤   ¤   ((COTInternetSocket *) contextPtr)->Close();
530fe4 ¤   ¤   }
955c35 ¤   ¤   ((COTInternetSocket *) contextPtr)->mInCallback = false;
289371 ¤   }
91efe6 }
c7af5a
f9af5a
1daf5a
326d52 ¤   void
0aae7e COTInternetSocket::ThrowIfOTError(
72bd5b ¤   OSStatus¤   inErr)
9bbb36 {
9c00a1 ¤   if (inErr < 0) {
e27c8e ¤   ¤   if (inErr == kOTCanceledErr) {
c9d730 ¤   ¤   ¤   Close();
8bfeda ¤   ¤   } else if (inErr == kOTLookErr) {
29c923 ¤   ¤   ¤   // Clean up on an unexpected look
e661a4 ¤   ¤   ¤   OTResult¤   result;
4987c7 ¤   ¤   ¤
fff072 ¤   ¤   ¤   result = ::OTLook(mEndpointRef);
35ed0d ¤   ¤   ¤   switch (result) {
56bafd ¤   ¤   ¤   ¤   case T_DISCONNECT:
a972c3 ¤   ¤   ¤   ¤   {
6a4a35 ¤   ¤   ¤   ¤   ¤   ::OTRcvDisconnect(mEndpointRef, nil);
2f6f5b ¤   ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotConnected);
422613 ¤   ¤   ¤   ¤   }
27f622 ¤   ¤   ¤   ¤   break;
c62b85 ¤   ¤   ¤   ¤
b52b85 ¤   ¤   ¤   ¤
1ddfae ¤   ¤   ¤   ¤   case T_LISTEN:
d772c3 ¤   ¤   ¤   ¤   {
a21885 ¤   ¤   ¤   ¤   ¤   TEndpointInfo¤  info;
3b2160 ¤   ¤   ¤   ¤   ¤   TCall¤  ¤   ¤   call;
649cab ¤   ¤   ¤   ¤   ¤   InetAddress¤¤   address;
1fa47a ¤   ¤   ¤   ¤   ¤   UInt8 *¤¤   ¤   options;
--7a52 00015905867401202a8 Page 4 of COTInternetSocket.cp
d6ae30 ¤   ¤   ¤   ¤   ¤
4e8366 ¤   ¤   ¤   ¤   ¤   inErr = ::OTGetEndpointInfo(mEndpointRef, &info);
12eeea ¤   ¤   ¤   ¤   ¤   if (inErr == kOTNoError) {
232dbf ¤   ¤   ¤   ¤   ¤   ¤   options = (UInt8 *) ::NewPtr(info.options);
323e18 ¤   ¤   ¤   ¤   ¤   ¤   call.addr.buf = (UInt8 *) &address;
b5cf70 ¤   ¤   ¤   ¤   ¤   ¤   call.addr.maxlen = sizeof(address);
08e399 ¤   ¤   ¤   ¤   ¤   ¤   call.opt.buf = options;
a2bb5f ¤   ¤   ¤   ¤   ¤   ¤   call.opt.maxlen = (options == nil) ? 0 : info.options;
39309c ¤   ¤   ¤   ¤   ¤   ¤   call.udata.buf = nil;
449542 ¤   ¤   ¤   ¤   ¤   ¤   call.udata.maxlen = 0;
ac94aa ¤   ¤   ¤   ¤   ¤   ¤
128d23 ¤   ¤   ¤   ¤   ¤   ¤   inErr = ::OTListen(mEndpointRef, &call);
de3658 ¤   ¤   ¤   ¤   ¤   ¤   if (inErr == kOTNoError) {
fc56d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ::OTSndDisconnect(mEndpointRef, &call);
bddb3c ¤   ¤   ¤   ¤   ¤   ¤   }
9f7411 ¤   ¤   ¤   ¤   ¤   ¤   ::DisposePtr((Ptr) options);
db1c89 ¤   ¤   ¤   ¤   ¤   }
f9ae30 ¤   ¤   ¤   ¤   ¤
227680 ¤   ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_UnknownError);
d72613 ¤   ¤   ¤   ¤   }
69f622 ¤   ¤   ¤   ¤   break;
f92b85 ¤   ¤   ¤   ¤
462b85 ¤   ¤   ¤   ¤
594674 ¤   ¤   ¤   ¤   case T_ORDREL:
c072c3 ¤   ¤   ¤   ¤   {
6b5504 ¤   ¤   ¤   ¤   ¤   ::OTRcvOrderlyDisconnect(mEndpointRef);
de6f5b ¤   ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotConnected);
bc2613 ¤   ¤   ¤   ¤   }
4ff622 ¤   ¤   ¤   ¤   break;
152b85 ¤   ¤   ¤   ¤
1e2b85 ¤   ¤   ¤   ¤
c8c199 ¤   ¤   ¤   ¤   case T_UDERR:
df72c3 ¤   ¤   ¤   ¤   {
561e72 ¤   ¤   ¤   ¤   ¤   inErr = ::OTRcvUDErr(mEndpointRef, nil);
502613 ¤   ¤   ¤   ¤   }
59f622 ¤   ¤   ¤   ¤   break;
76a3a6 ¤   ¤   ¤   }
250fe4 ¤   ¤   }
861b52 ¤   ¤
52f6b3 ¤   ¤   ThrowPGPError_(inErr);
c65ad3 ¤   } else if (mCanceled) {
1896bb ¤   ¤   Close();
e25dbe ¤   ¤   ThrowPGPError_(kOTCanceledErr);
b19371 ¤   }
36efe6 }
99af5a
c4af5a
48af5a
de6d52 ¤   void
951cf4 COTInternetSocket::GetSocketName(
86d657 ¤   PGPSocketAddressInternet *¤ outName)
b2bb36 {
d6dc42 ¤   OSStatus¤   err;
b96210 ¤   TBind¤  ¤   theBind;
3c992d ¤   InetAddress¤theBoundAddress;
7367c5 ¤
92bc5c ¤   pgpClearMemory(&theBind, sizeof(theBind));
109813 ¤   theBind.addr.buf = (UInt8 *) &theBoundAddress;
575548 ¤   theBind.addr.maxlen = sizeof(theBoundAddress);
c867c5 ¤
1db733 ¤   err = ::OTGetProtAddress(¤  mEndpointRef,
4008dd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theBind,
fd3b03 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil);
e0bc4c ¤   ThrowIfOTError(err);
305b9b ¤   if (theBind.addr.len == 0) {
143e64 ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotBound);
f79371 ¤   }
e2eb34 ¤   pgpClearMemory(outName, sizeof(PGPSocketAddressInternet));
f7726d ¤   outName->sin_family = kPGPAddressFamilyInternet;
74cbdd ¤   outName->sin_port = theBoundAddress.fPort;
aae02c ¤   outName->sin_addr.s_addr = theBoundAddress.fHost;
15efe6 }
--a6ce 001504d8187401202a8 Page 5 of COTInternetSocket.cp
e0af5a
1aaf5a
17af5a
246d52 ¤   void
7a9505 COTInternetSocket::IOControlSocket(
722017 ¤   SInt32¤ ¤   inCommand,
d7ac75 ¤   UInt32 *¤   ioParam)
d6bb36 {
0df912 ¤   switch (inCommand) {
2e3be5 ¤   ¤   case kPGPSocketCommandGetUnreadData:
c85b34 ¤   ¤   {
3e86e0 ¤   ¤   ¤   ::OTCountDataBytes(mEndpointRef, ioParam);¤
370fe4 ¤   ¤   }
f42f68 ¤   ¤   break;
429371 ¤   }
50efe6 }
--482e 001b43da805401202a9 Page 1 of COTInternetSocket.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
fedc61 ¤   $Id: COTInternetSocket.h,v 1.7.12.1 1998/11/12 03:22:31 heller Exp $
0ef7f7 ____________________________________________________________________________*/
16af5a
348d55 #pragma once·
17af5a
14ed9b #include "CInternetSocket.h"
97af5a
f0af5a
356178 class COTInternetSocket : public CInternetSocket {
e15ed4 public:
68bb04 ¤   ¤   ¤   ¤   ¤   ¤   ¤   COTInternetSocket();
c45f64 ¤   virtual ¤   ¤   ¤   ¤   ~COTInternetSocket();
6daf5a
9a4333 ¤   virtual void¤   ¤   ¤   Bind(const PGPSocketAddressInternet *
e9d197 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress);
14234c ¤   virtual void¤   ¤   ¤   Close();
0b67c5 ¤
9b0af8 ¤   virtual void¤   ¤   ¤   GetSocketName(PGPSocketAddressInternet * outName);
68af5a
977b46 ¤   virtual void¤   ¤   ¤   IOControlSocket(SInt32 inCommand,
abae0c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 * ioParam);
91af5a
10a2d3 protected:
ff39e0 ¤   EndpointRef¤¤   ¤   ¤   mEndpointRef;
e7478e ¤   InetAddress¤¤   ¤   ¤   mBoundAddress;
51a4e2 ¤   Boolean¤¤   ¤   ¤   ¤   mCanceled;
c567c5 ¤
6d9821 ¤   virtual void¤   ¤   ¤   Cleanup();
92cb62 ¤   virtual void¤   ¤   ¤   DoBind(OTQLen inQLen);
0967c5 ¤
2eb812 ¤   virtual Boolean¤¤   ¤   IsReadable();
705e0d ¤   virtual Boolean¤¤   ¤   IsWriteable();
6ea63c ¤   virtual Boolean¤¤   ¤   IsError();
6faf5a
5293f2 ¤   virtual void¤   ¤   ¤   ThrowIfOTError(OSStatus inErr);
fd67c5 ¤
ba6333 ¤   static pascal void¤ ¤   NotifyProc(void* contextPtr, OTEventCode code,·
4a5256 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ···OTResult result, void* cookie);
b4bf26 };¶
--ff9a 00008b7aa7d401202aa Page 1 of COTInternetUtilities.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
7ee519 ¤   $Id: COTInternetUtilities.cp,v 1.9.10.1 1998/11/12 03:22:31 heller Exp $
ddf7f7 ____________________________________________________________________________*/
ecaf5a
a3324c #include <string.h>
fbaf5a
ae0d08 #include "pgpMem.h"
64af5a
67a685 #include "COTInternetUtilities.h"
deaf5a
60af5a
d7af5a
536fe9 COTInternetUtilities::COTInternetUtilities()
598809 ¤   : mInetSvcRef(nil)
aabb36 {
acdc42 ¤   OSStatus¤   err;
7caf5a
c28ebd ¤   mInetSvcRef = ::OTOpenInternetServices(¤kDefaultInternetServicesPath,
109cf4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
b2ad2e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &err);
d04d36 ¤   if (err != kOTNoError) {
1681ab ¤   ¤   ThrowPGPError_(err);
099371 ¤   }
8c0c8c ¤   err = ::OTInstallNotifier(¤ mInetSvcRef,
4b860e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NotifyProc,
4475f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   this);
504d36 ¤   if (err != kOTNoError) {
5981ab ¤   ¤   ThrowPGPError_(err);
999371 ¤   }
d91601 ¤   err = ::OTUseSyncIdleEvents(¤   mInetSvcRef,
e85b4d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true);
0f4d36 ¤   if (err != kOTNoError) {
c981ab ¤   ¤   ThrowPGPError_(err);
f19371 ¤   }
7befe6 }
9eaf5a
dfaf5a
48af5a
a75acb COTInternetUtilities::~COTInternetUtilities()
42bb36 {
ea5472 ¤   ::OTCloseProvider(mInetSvcRef);
72efe6 }
03af5a
1caf5a
82e2eb ¤   PGPHostEntry *
2aa85f COTInternetUtilities::GetHostByName(
3bb3d6 ¤   const char * inName)
5ebb36 {
a5386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
59f334 ¤   InetHostInfo¤   ¤   hInfo;
0f4c16 ¤   PGPHostEntry *¤ ¤   result = NULL;
478737 ¤   OSStatus¤   ¤   ¤   err;
b967c5 ¤
34ff1f ¤   // Get the info
1c1b1d ¤   err = ::OTInetStringToAddress(¤ mInetSvcRef,
6b096a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (char *) inName,
a0b230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &hInfo);
254d36 ¤   if (err != kOTNoError) {
d981ab ¤   ¤   ThrowPGPError_(err);
829371 ¤   }
860230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
915b45 ¤   // Insert the name
ba6a4b ¤   strncpy(theContext->hostEntry.h_name, hInfo.name, kMaxHostNameLen);
bd05be ¤   theContext->hostEntry.h_name[kMaxHostNameLen] = 0;
0b2e44 ¤   ::BlockMoveData(¤   hInfo.addrs,
cec7ef ¤   ¤   ¤   ¤   ¤   ¤   theContext->hAddressesBuffer,
08fc77 ¤   ¤   ¤   ¤   ¤   ¤   sizeof(theContext->hAddressesBuffer));
--989d 0006ed178c4401202aa Page 2 of COTInternetUtilities.cp
ea73b3 ¤   pgpClearMemory(¤theContext->hAddressesListBuffer,
72cfd7 ¤   ¤   ¤   ¤   ¤   sizeof(theContext->hAddressesListBuffer));
971161 ¤   for (UInt8 i = 0; (i < kMaxHostAddrs)
a71cf4 ¤   ··&& (theContext->hAddressesBuffer[i] != 0); i++) {
610b9a ¤   ¤   theContext->hAddressesListBuffer[i] = &theContext->hAddressesBuffer[i];
819371 ¤   }
8b7d2b ¤   result = &theContext->hostEntry;
88af5a
ab5d73 ¤   return result;
83efe6 }
49af5a
5baf5a
6baf5a
30e2eb ¤   PGPHostEntry *
6d856f COTInternetUtilities::GetHostByAddress(
d46cbf ¤   PGPInternetAddress¤ inAddress)
7cbb36 {
c6386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
f1971f ¤   InetDomainName¤ ¤   domainName;
8f4c16 ¤   PGPHostEntry *¤ ¤   result = NULL;
288737 ¤   OSStatus¤   ¤   ¤   err;
79af5a
aeff1f ¤   // Get the info
bb5e2f ¤   err = ::OTInetAddressToName(¤   mInetSvcRef,
5778eb ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress.s_addr,
709154 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   domainName);
6b4d36 ¤   if (err != kOTNoError) {
3e81ab ¤   ¤   ThrowPGPError_(err);
749371 ¤   }
710230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
ab1e98 ¤   return GetHostByName(domainName);
d6efe6 }
57af5a
0faf5a
44af5a
e36d52 ¤   void
2d2190 COTInternetUtilities::GetHostName(
60f539 ¤   char *¤ outName,
0fc86c ¤   SInt32¤ inNameLength)
4cbb36 {
30cbd6 ¤   InetInterfaceInfo¤  info;
37907a ¤   PGPHostEntry *¤ ¤   result;
808737 ¤   OSStatus¤   ¤   ¤   err;
d467c5 ¤
f55012 ¤   err = ::OTInetGetInterfaceInfo(&info, kDefaultInetInterface);
234d36 ¤   if (err != kOTNoError) {
6581ab ¤   ¤   ThrowPGPError_(err);
8e9371 ¤   }
8567c5 ¤
96c246 ¤   result = GetHostByAddress(*((PGPInternetAddress *) &info.fAddress));
f17a40 ¤   strncpy(outName, result->h_name, inNameLength - 1);
470b1d ¤   outName[inNameLength - 1] = 0;
15efe6 }
2baf5a
f0af5a
2faf5a
f16685 ¤   pascal void
0389f1 COTInternetUtilities::NotifyProc(
6fbd14 ¤   void *¤ ¤   contextPtr,
5a5b19 ¤   OTEventCode¤code,·
99e206 ¤   OTResult¤   result,
644d50 ¤   void *¤ ¤   cookie)
a1bb36 {
43825b ¤   (void) result;
a2a669 ¤   (void) cookie;
e467c5 ¤
0008a1 ¤   if (code == kOTSyncIdleEvent) {
bcf039 ¤   ¤   if (CSocket::CallIdleEventHandler() != kPGPError_NoErr) {
5e2a1c ¤   ¤   ¤   ::OTCancelSynchronousCalls(
9ab4a0 ¤   ¤   ¤   ¤   ((COTInternetUtilities *) contextPtr)->mInetSvcRef,
66802c ¤   ¤   ¤   ¤   kOTCanceledErr);
6e0fe4 ¤   ¤   }
--166c 001c951e9ea401202aa Page 3 of COTInternetUtilities.cp
a19371 ¤   }
c9efe6 }
--a045 0014db3a1cf401202ab Page 1 of COTInternetUtilities.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
00ba51 ¤   $Id: COTInternetUtilities.h,v 1.3.10.1 1998/11/12 03:22:32 heller Exp $
d4f7f7 ____________________________________________________________________________*/
eeaf5a
988d55 #pragma once·
b4af5a
b62556 #include "CInternetUtilities.h"
94af5a
773f43 class COTInternetUtilities : public CInternetUtilities {
9d5ed4 public:
268f65 ¤   ¤   ¤   ¤   ¤   ¤   ¤   COTInternetUtilities();
095520 ¤   virtual¤¤   ¤   ¤   ¤   ~COTInternetUtilities();
7667c5 ¤
39f394 ¤   virtual PGPHostEntry *¤ GetHostByName(const char * inName);
787492 ¤   virtual¤PGPHostEntry *¤ GetHostByAddress(PGPInternetAddress inAddress);
efd24e ¤   virtual void¤   ¤   ¤   GetHostName(char * outName,
8b9616 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inNameLength);
79af5a
9ba2d3 protected:
79eb95 ¤   InetSvcRef¤ ¤   ¤   ¤   mInetSvcRef;
5eaf5a
235b04 ¤   static pascal void¤ ¤   NotifyProc(void* contextPtr, OTEventCode code,
e79b53 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   OTResult result, void* cookie);
4d82f7 };
--81ce 0002d0755af401202ac Page 1 of COTTCPSocket.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
22da5e ¤   $Id: COTTCPSocket.cp,v 1.17.10.1 1998/11/12 03:22:33 heller Exp $
53f7f7 ____________________________________________________________________________*/
99af5a
23af5a
07324c #include <string.h>
feaf5a
3c0d08 #include "pgpMem.h"
31af5a
ae0780 #include "COTTCPSocket.h"
9faf5a
11af5a
429f16 COTTCPSocket::COTTCPSocket()
711227 ¤   : mIsListening(false)
71bb36 {
9cdc42 ¤   OSStatus¤   err;
ba67c5 ¤
72922a ¤   // Create the endpoint
ead73e ¤   mEndpointRef = ::OTOpenEndpoint(¤   ::OTCreateConfiguration(kTCPName),
e50d6c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
f77393 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NULL,
0a759c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &err);
b3bc4c ¤   ThrowIfOTError(err);
630b3a ¤   err = ::OTSetBlocking(mEndpointRef);
0fbc4c ¤   ThrowIfOTError(err);
96ed51 ¤   err = ::OTInstallNotifier(¤ mEndpointRef,
72860e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NotifyProc,
a275f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   this);
16bc4c ¤   ThrowIfOTError(err);
3cb2a6 ¤   err = ::OTUseSyncIdleEvents(¤   mEndpointRef,
605b4d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true);
9ebc4c ¤   ThrowIfOTError(err);
39ea9b ¤   mSocketType = kPGPSocketTypeStream;
75efe6 }
11af5a
41af5a
4faf5a
6c53dc COTTCPSocket::~COTTCPSocket()
18bb36 {
b7efe6 }
58af5a
e4af5a
29af5a
f96d52 ¤   void
b1366f COTTCPSocket::Cleanup()
8dbb36 {
02e41f ¤   if (! mCanceled) {
dbbd31 ¤   ¤   // Make sure we disconnect in an orderly fashion
1cec17 ¤   ¤   switch (::OTLook(mEndpointRef)) {
993682 ¤   ¤   ¤   case T_DISCONNECT:
4bf776 ¤   ¤   ¤   {
b04942 ¤   ¤   ¤   ¤   ::OTRcvDisconnect(mEndpointRef, nil);
2ba3a6 ¤   ¤   ¤   }
4ecdcb ¤   ¤   ¤   break;
21af5a
abaf5a
b5525c ¤   ¤   ¤   case T_ORDREL:
8ff776 ¤   ¤   ¤   {
bdda53 ¤   ¤   ¤   ¤   ::OTRcvOrderlyDisconnect(mEndpointRef);
8ab036 ¤   ¤   ¤   ¤   ::OTSndOrderlyDisconnect(mEndpointRef);
20a3a6 ¤   ¤   ¤   }
75cdcb ¤   ¤   ¤   break;
3687c7 ¤   ¤   ¤
0c87c7 ¤   ¤   ¤
66db68 ¤   ¤   ¤   default:
32f776 ¤   ¤   ¤   {
2db036 ¤   ¤   ¤   ¤   ::OTSndOrderlyDisconnect(mEndpointRef);
--244e 000f714f048401202ac Page 2 of COTTCPSocket.cp
1ada53 ¤   ¤   ¤   ¤   ::OTRcvOrderlyDisconnect(mEndpointRef);
63a3a6 ¤   ¤   ¤   }
12cdcb ¤   ¤   ¤   break;
320fe4 ¤   ¤   }
3e9371 ¤   }
d5efe6 }
1aaf5a
e7af5a
16af5a
176d52 ¤   void
38aab9 COTTCPSocket::Connect(
489d9f ¤   const PGPSocketAddressInternet *¤   inAddress)
a1bb36 {
17dc42 ¤   OSStatus¤   err;
3fb4d4 ¤   TCall¤  ¤   sndCall;
df6c13 ¤   InetAddress¤theAddress;
1567c5 ¤
4d49fe ¤   // Bind the endpoint
da01ec ¤   DoBind(0);
3367c5 ¤
ff055b ¤   // Create the TCall
0b9fd4 ¤   theAddress.fAddressType = AF_INET;
1b1004 ¤   theAddress.fPort = inAddress->sin_port;
1387ae ¤   theAddress.fHost = inAddress->sin_addr.s_addr;
273ee8 ¤   sndCall.addr.len = sizeof(theAddress);
7ae8ad ¤   sndCall.addr.buf = (UInt8 *) &theAddress;
6a7c48 ¤   sndCall.addr.maxlen = sizeof(theAddress);
601f21 ¤   sndCall.opt.len = 0;
18e0a6 ¤   sndCall.opt.buf = nil;
290b4b ¤   sndCall.opt.maxlen = 0;
e9a8cd ¤   sndCall.udata.len = 0;
fc61ab ¤   sndCall.udata.buf = nil;
d4d02f ¤   sndCall.udata.maxlen = 0;
7cf9ed ¤   sndCall.sequence = 0;
2caf5a
0db35c ¤   err = ::OTSetAsynchronous(mEndpointRef);
cfbc4c ¤   ThrowIfOTError(err);
0c67c5 ¤
e06000 ¤   // Connect
26632e ¤   err = ::OTConnect(¤ mEndpointRef,
6d1179 ¤   ¤   ¤   ¤   ¤   ¤   &sndCall,
28e378 ¤   ¤   ¤   ¤   ¤   ¤   nil);
3f94aa ¤   ¤   ¤   ¤   ¤   ¤
a9a49d // Perhaps I should just set this sync and do the rcvconnect?
176630 ¤   while (err == kOTNoDataErr) {
2b992d ¤   ¤   err = ::OTRcvConnect(mEndpointRef, nil);
9b33bc ¤   ¤   if (err == kOTNoDataErr) {
e8efed ¤   ¤   ¤   mInCallback = true;
54b9f1 ¤   ¤   ¤   if (CallIdleEventHandler() != kPGPError_NoErr) {
09c2c6 ¤   ¤   ¤   ¤   ::OTSetSynchronous(mEndpointRef);
b90c16 ¤   ¤   ¤   ¤   err = ::OTSndDisconnect(mEndpointRef, &sndCall);
180e2f ¤   ¤   ¤   ¤   ThrowIfOTError(err);
8f66e1 ¤   ¤   ¤   ¤   Close();
19a3a6 ¤   ¤   ¤   }
640e7c ¤   ¤   ¤   mInCallback = false;
b70fe4 ¤   ¤   }
5ccd91 ¤   ¤   if (mCanceled) {
193d34 ¤   ¤   ¤   err = ::OTSetSynchronous(mEndpointRef);
383347 ¤   ¤   ¤   ThrowIfOTError(err);
e1d730 ¤   ¤   ¤   Close();
97d5d8 ¤   ¤   ¤   ThrowPGPError_(kOTCanceledErr);
dc0fe4 ¤   ¤   }
f862bd ¤   };
9fb325 ¤   err = ::OTSetSynchronous(mEndpointRef);
44bc4c ¤   ThrowIfOTError(err);
a01b52 ¤   ¤
b5aee9 ¤   // Handle disconnects and listens
33b398 ¤   while (err == kOTLookErr) {
b5b0e3 ¤   ¤   OTResult¤   event;
711b52 ¤   ¤
93dfda ¤   ¤   event = ::OTLook(mEndpointRef);
f74835 ¤   ¤   if (event == T_LISTEN) {
--947d 000ca0ba1f1401202ac Page 3 of COTTCPSocket.cp
eecb18 ¤   ¤   ¤   TEndpointInfo¤  info;
55f2fd ¤   ¤   ¤   TCall¤  ¤   ¤   call;
799ffe ¤   ¤   ¤   InetAddress¤¤   address;
d1a72f ¤   ¤   ¤   UInt8 *¤¤   ¤   options;
8687c7 ¤   ¤   ¤
17271f ¤   ¤   ¤   err = ::OTGetEndpointInfo(mEndpointRef, &info);
bfcb08 ¤   ¤   ¤   if (err != kOTNoError) {
69f9d7 ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_UnknownError);
5c042d ¤   ¤   ¤   } else {
f3d4cd ¤   ¤   ¤   ¤   options = (UInt8 *) ::NewPtr(info.options);
f2ceca ¤   ¤   ¤   ¤   if (options == nil) {
8ad81d ¤   ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
cc2613 ¤   ¤   ¤   ¤   }
63e4e3 ¤   ¤   ¤   ¤   call.addr.buf = (UInt8 *) &address;
48158b ¤   ¤   ¤   ¤   call.addr.maxlen = sizeof(address);
3c73af ¤   ¤   ¤   ¤   call.opt.buf = options;
8b86d3 ¤   ¤   ¤   ¤   call.opt.maxlen = (options == nil) ? 0 : info.options;
1535b7 ¤   ¤   ¤   ¤   call.udata.buf = nil;
9f0a96 ¤   ¤   ¤   ¤   call.udata.maxlen = 0;
3f2b85 ¤   ¤   ¤   ¤
b3da6a ¤   ¤   ¤   ¤   err = ::OTListen(mEndpointRef, &call);
6c0640 ¤   ¤   ¤   ¤   if (err == kOTNoError) {
a9afaa ¤   ¤   ¤   ¤   ¤   ::OTSndDisconnect(mEndpointRef, &call);
b22613 ¤   ¤   ¤   ¤   }
627597 ¤   ¤   ¤   ¤   ::DisposePtr((Ptr) options);
90a3a6 ¤   ¤   ¤   }
aaca36 ¤   ¤   ¤   err = ::OTRcvConnect(mEndpointRef, nil);
ec45a6 ¤   ¤   } else {
3acdcb ¤   ¤   ¤   break;
8b0fe4 ¤   ¤   }
dc9371 ¤   }
fcbc4c ¤   ThrowIfOTError(err);
50efe6 }
d1af5a
e5af5a
ccaf5a
58cff0 /*¤ void
71aab9 COTTCPSocket::Connect(
829d9f ¤   const PGPSocketAddressInternet *¤   inAddress)
b3bb36 {
9adc42 ¤   OSStatus¤   err;
81b4d4 ¤   TCall¤  ¤   sndCall;
fb6c13 ¤   InetAddress¤theAddress;
cb67c5 ¤
b649fe ¤   // Bind the endpoint
6e01ec ¤   DoBind(0);
0f67c5 ¤
1b055b ¤   // Create the TCall
479fd4 ¤   theAddress.fAddressType = AF_INET;
661004 ¤   theAddress.fPort = inAddress->sin_port;
2987ae ¤   theAddress.fHost = inAddress->sin_addr.s_addr;
6e3ee8 ¤   sndCall.addr.len = sizeof(theAddress);
9ee8ad ¤   sndCall.addr.buf = (UInt8 *) &theAddress;
9b7c48 ¤   sndCall.addr.maxlen = sizeof(theAddress);
621f21 ¤   sndCall.opt.len = 0;
c3e0a6 ¤   sndCall.opt.buf = nil;
860b4b ¤   sndCall.opt.maxlen = 0;
91a8cd ¤   sndCall.udata.len = 0;
bb61ab ¤   sndCall.udata.buf = nil;
aad02f ¤   sndCall.udata.maxlen = 0;
f4f9ed ¤   sndCall.sequence = 0;
951b52 ¤   ¤
5d6000 ¤   // Connect
fd632e ¤   err = ::OTConnect(¤ mEndpointRef,
4a1179 ¤   ¤   ¤   ¤   ¤   ¤   &sndCall,
26e378 ¤   ¤   ¤   ¤   ¤   ¤   nil);
85b398 ¤   while (err == kOTLookErr) {
89b0e3 ¤   ¤   OTResult¤   event;
6e1b52 ¤   ¤
badfda ¤   ¤   event = ::OTLook(mEndpointRef);
b14835 ¤   ¤   if (event == T_LISTEN) {
cacb18 ¤   ¤   ¤   TEndpointInfo¤  info;
--f24c 00061069674401202ac Page 4 of COTTCPSocket.cp
e6f2fd ¤   ¤   ¤   TCall¤  ¤   ¤   call;
9f9ffe ¤   ¤   ¤   InetAddress¤¤   address;
b9a72f ¤   ¤   ¤   UInt8 *¤¤   ¤   options;
5987c7 ¤   ¤   ¤
39271f ¤   ¤   ¤   err = ::OTGetEndpointInfo(mEndpointRef, &info);
16cb08 ¤   ¤   ¤   if (err != kOTNoError) {
45f9d7 ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_UnknownError);
84042d ¤   ¤   ¤   } else {
cdd4cd ¤   ¤   ¤   ¤   options = (UInt8 *) ::NewPtr(info.options);
53ceca ¤   ¤   ¤   ¤   if (options == nil) {
9ed81d ¤   ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
412613 ¤   ¤   ¤   ¤   }
3ae4e3 ¤   ¤   ¤   ¤   call.addr.buf = (UInt8 *) &address;
60158b ¤   ¤   ¤   ¤   call.addr.maxlen = sizeof(address);
3b73af ¤   ¤   ¤   ¤   call.opt.buf = options;
5d86d3 ¤   ¤   ¤   ¤   call.opt.maxlen = (options == nil) ? 0 : info.options;
7c35b7 ¤   ¤   ¤   ¤   call.udata.buf = nil;
fe0a96 ¤   ¤   ¤   ¤   call.udata.maxlen = 0;
282b85 ¤   ¤   ¤   ¤
56da6a ¤   ¤   ¤   ¤   err = ::OTListen(mEndpointRef, &call);
ef0640 ¤   ¤   ¤   ¤   if (err == kOTNoError) {
23afaa ¤   ¤   ¤   ¤   ¤   ::OTSndDisconnect(mEndpointRef, &call);
782613 ¤   ¤   ¤   ¤   }
407597 ¤   ¤   ¤   ¤   ::DisposePtr((Ptr) options);
03a3a6 ¤   ¤   ¤   }
a2ca36 ¤   ¤   ¤   err = ::OTRcvConnect(mEndpointRef, nil);
2945a6 ¤   ¤   } else {
24cdcb ¤   ¤   ¤   break;
be0fe4 ¤   ¤   }
509371 ¤   }
c4bc4c ¤   ThrowIfOTError(err);
52efe6 }
a97fe0 */
b7af5a
48959b ¤   SInt32
57c3ff COTTCPSocket::Send(
334f2f ¤   const void *¤   inBuffer,
135537 ¤   SInt32¤ ¤   ¤   inLength,
95bb7a ¤   SInt32¤ ¤   ¤   inFlags)
f3bb36 {
bb7922 ¤   OSStatus¤   ¤   result;
24e952 ¤   OTFlags¤¤   ¤   flags = 0;
a3af5a
ee0647 ¤   (void) inFlags;
a367c5 ¤
9ce994 ¤   result = ::OTSnd(¤  mEndpointRef,
1bcffd ¤   ¤   ¤   ¤   ¤   ¤   (void *) inBuffer,
39f3ed ¤   ¤   ¤   ¤   ¤   ¤   inLength,
3841ab ¤   ¤   ¤   ¤   ¤   ¤   flags);
13dc97 ¤   ThrowIfOTError(result);
7baf5a
b35d73 ¤   return result;
2cefe6 }
15af5a
4aaf5a
6daf5a
f7959b ¤   SInt32
4eb87f COTTCPSocket::SendTo(
bf3074 ¤   const void *¤   ¤   ¤   ¤   ¤   ¤   inBuffer,
adc1ca ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   inLength,
969d9f ¤   const PGPSocketAddressInternet *¤   inAddress)
87bb36 {
de91b3 ¤   (void) inAddress;
e667c5 ¤
71d617 ¤   return Send(inBuffer, inLength, kPGPSendFlagNone);
9cefe6 }
85af5a
fdaf5a
1faf5a
3f959b ¤   SInt32
0a38e6 COTTCPSocket::Receive(
61c9d9 ¤   void *¤ outBuffer,
--8907 0007edbc471401202ac Page 5 of COTTCPSocket.cp
d6beea ¤   SInt32¤ inLength,
080856 ¤   SInt32¤ inFlags)
c2bb36 {
aa7922 ¤   OSStatus¤   ¤   result;
07ebcb ¤   OTFlags¤¤   ¤   flags = 0;¤
b6105e ¤   size_t¤ ¤   ¤   numBytes;
b6af5a
e20647 ¤   (void) inFlags;
1f67c5 ¤
6643ab ¤   do {
cb7903 ¤   ¤   result = ::OTCountDataBytes(mEndpointRef, &numBytes);
997c09 ¤   ¤   if (result == kOTNoDataErr) {
2aefed ¤   ¤   ¤   mInCallback = true;
c3b9f1 ¤   ¤   ¤   if (CallIdleEventHandler() != kPGPError_NoErr) {
db66e1 ¤   ¤   ¤   ¤   Close();
0ca3a6 ¤   ¤   ¤   }
f40e7c ¤   ¤   ¤   mInCallback = false;
7c0fe4 ¤   ¤   }
dfcd91 ¤   ¤   if (mCanceled) {
b9d730 ¤   ¤   ¤   Close();
ded5d8 ¤   ¤   ¤   ThrowPGPError_(kOTCanceledErr);
360fe4 ¤   ¤   }
cee578 ¤   } while (result == kOTNoDataErr);
fd15b3 ¤   if (result != kOTNoError) {
1d8fa2 ¤   ¤   numBytes = inLength;
eb73f0 ¤   } else if (numBytes > inLength) {
698fa2 ¤   ¤   numBytes = inLength;
149371 ¤   }
1067c5 ¤
c6fc99 ¤   result = ::OTRcv(¤  mEndpointRef,
0ffe82 ¤   ¤   ¤   ¤   ¤   ¤   outBuffer,
117651 ¤   ¤   ¤   ¤   ¤   ¤   numBytes,
524d78 ¤   ¤   ¤   ¤   ¤   ¤   &flags);
cd67c5 ¤
8703aa ¤   // Handle disconnects
b0253a ¤   if ((result == kOTLookErr) && (::OTLook(mEndpointRef) == T_ORDREL)) {
5b4a29 ¤   ¤   result = 0;
279371 ¤   }
51dc97 ¤   ThrowIfOTError(result);
afaf5a
025d73 ¤   return result;
f8efe6 }
9aaf5a
64af5a
e3af5a
8a959b ¤   SInt32
67dd3a COTTCPSocket::ReceiveFrom(
64d5b1 ¤   void *¤ ¤   ¤   ¤   ¤   ¤   outBuffer,
63aa35 ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   inSize,
e2455d ¤   PGPSocketAddressInternet *¤ outAddress,
f5b450 ¤   SInt32 *¤   ¤   ¤   ¤   ¤   ioAddressLength)
ccbb36 {
892844 ¤   (void) outAddress;
2867c5 ¤
e6d1a5 ¤   if (ioAddressLength != NULL) {
bf6241 ¤   ¤   *ioAddressLength = 0;
7e9371 ¤   }
0daf5a
e80d48 ¤   return Receive(outBuffer, inSize, kPGPReceiveFlagNone);¤
80efe6 }
d3af5a
95af5a
6daf5a
8a6d52 ¤   void
2c2a95 COTTCPSocket::Listen(
7a5148 ¤   SInt32¤ inMaxBacklog)
71bb36 {
d2ed29 ¤   DoBind(inMaxBacklog);
762bc8 ¤   mIsListening = true;
08efe6 }
6aaf5a
7eaf5a
--59ce 0000b80c7f3401202ac Page 6 of COTTCPSocket.cp
e0af5a
f05f00 ¤   CSocket *
49dfb2 COTTCPSocket::Accept(
95455d ¤   PGPSocketAddressInternet *¤ outAddress,
66b450 ¤   SInt32 *¤   ¤   ¤   ¤   ¤   ioAddressLength)
99bb36 {
cb98d4 ¤   OSStatus¤   result;
47df52 ¤   TCall¤  ¤   theCall;
096c13 ¤   InetAddress¤theAddress;
d567c5 ¤
b8055b ¤   // Create the TCall
9ccd21 ¤   theCall.addr.buf = (UInt8 *) &theAddress;
3e59c4 ¤   theCall.addr.maxlen = sizeof(theAddress);
499d7b ¤   theCall.opt.buf = nil;
33065e ¤   theCall.opt.maxlen = 0;
7f268a ¤   theCall.udata.buf = nil;
a8e0e3 ¤   theCall.udata.maxlen = 0;
50af5a
6d7f58 ¤   result = ::OTListen(¤   mEndpointRef,
db776c ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theCall);
56dc97 ¤   ThrowIfOTError(result);
0a67c5 ¤
084d18 ¤   // Accept the connection
798a0e ¤   COTTCPSocket *¤ theNewSocket = new COTTCPSocket;
f80b04 ¤   if (theNewSocket == nil) {
d216b3 ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
a29371 ¤   }
d867c5 ¤
92c9fa ¤   result = ::OTAccept(¤   mEndpointRef,·
c80a83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   theNewSocket->mEndpointRef,
35776c ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theCall);
1515b3 ¤   if (result != kOTNoError) {
c6fd65 ¤   ¤   delete theNewSocket;
cf71c9 ¤   ¤   ThrowIfOTError(result);
bb9371 ¤   }
7667c5 ¤
f9a3a4 ¤   // Fill in the parms
6d1421 ¤   *ioAddressLength = sizeof(PGPSocketAddressInternet);
11aa62 ¤   outAddress->sin_family = kPGPAddressFamilyInternet;
bebaa2 ¤   outAddress->sin_port = theAddress.fPort;
e1687e ¤   outAddress->sin_addr.s_addr = theAddress.fHost;
ff67c5 ¤
fc8eee ¤   return theNewSocket;
e6efe6 }
4daf5a
f9af5a
62af5a
f66d52 ¤   void
9b333a COTTCPSocket::GetPeerName(
5bd657 ¤   PGPSocketAddressInternet *¤ outName)
51bb36 {
12dc42 ¤   OSStatus¤   err;
7c6210 ¤   TBind¤  ¤   theBind;
96992d ¤   InetAddress¤theBoundAddress;
d367c5 ¤
b1bc5c ¤   pgpClearMemory(&theBind, sizeof(theBind));
169813 ¤   theBind.addr.buf = (UInt8 *) &theBoundAddress;
535548 ¤   theBind.addr.maxlen = sizeof(theBoundAddress);
fc67c5 ¤
a7b733 ¤   err = ::OTGetProtAddress(¤  mEndpointRef,
978e22 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
0534fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theBind);
ffbc4c ¤   ThrowIfOTError(err);
905b9b ¤   if (theBind.addr.len == 0) {
6ce57e ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotConnected);
be9371 ¤   }
c4eb34 ¤   pgpClearMemory(outName, sizeof(PGPSocketAddressInternet));
cc726d ¤   outName->sin_family = kPGPAddressFamilyInternet;
cfcbdd ¤   outName->sin_port = theBoundAddress.fPort;
70e02c ¤   outName->sin_addr.s_addr = theBoundAddress.fHost;
5befe6 }
0baf5a
--946f 00178106426401202ac Page 7 of COTTCPSocket.cp
e0af5a
1aaf5a
17af5a
78af5a
--4d28 001ef948351401202ad Page 1 of COTTCPSocket.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
a7c4e3 ¤   $Id: COTTCPSocket.h,v 1.5.10.1 1998/11/12 03:22:33 heller Exp $
d8f7f7 ____________________________________________________________________________*/
a2af5a
718d55 #pragma once·
bbaf5a
0abcb4 #include "COTInternetSocket.h"
e0af5a
4faf5a
efaf5a
7eaf5a
1b4d4e class COTTCPSocket : public COTInternetSocket {
d55ed4 public:
df3b62 ¤   ¤   ¤   ¤   ¤   ¤   ¤   COTTCPSocket();
94c24f ¤   virtual¤¤   ¤   ¤   ¤   ~COTTCPSocket();
ac67c5 ¤
e3c3e4 ¤   virtual void¤   ¤   ¤   Connect(const PGPSocketAddressInternet *
fcd197 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress);
58eba8 ¤   virtual SInt32¤ ¤   ¤   Send(const void * inBuffer, SInt32 inLength,
9c93df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inFlags);
a82c9e ¤   virtual SInt32¤ ¤   ¤   SendTo(const void * inBuffer, SInt32 inLength,
69670a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPSocketAddressInternet * inAddress);
93c6f0 ¤   virtual SInt32¤ ¤   ¤   Receive(void * outBuffer, SInt32 inLength,
ff93df ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inFlags);
f3a4bd ¤   virtual SInt32¤ ¤   ¤   ReceiveFrom(void * outBuffer, SInt32 inSize,
24fcb3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSocketAddressInternet * outAddress,
927eee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * ioAddressLength);
7760a3 ¤   virtual void¤   ¤   ¤   Listen(SInt32 inMaxBacklog);
3cb420 ¤   virtual CSocket *¤  ¤   Accept(PGPSocketAddressInternet * outAddress,
5b7eee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * ioAddressLength);
89da4b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
d73bda ¤   virtual void¤   ¤   ¤   GetPeerName(PGPSocketAddressInternet * outName);
7faf5a
bda2d3 protected:
60c5a3 ¤   Boolean¤¤   ¤   ¤   ¤   mIsListening;
3daf5a
2a9821 ¤   virtual void¤   ¤   ¤   Cleanup();
260f00 ¤   virtual Boolean¤¤   ¤   IsListening() { return mIsListening; }
4182f7 };
efaf5a
--e76c 00033db68a8401202ae Page 1 of COTUDPSocket.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
42cc69 ¤   $Id: COTUDPSocket.cp,v 1.10.10.1 1998/11/12 03:22:34 heller Exp $
76f7f7 ____________________________________________________________________________*/
74af5a
f580b5 #include "COTUDPSocket.h"
6daf5a
ddaf5a
42af5a
956a94 COTUDPSocket::COTUDPSocket()
7172a6 ¤   : mConnected(false), mBound(false)
8cbb36 {
24dc42 ¤   OSStatus¤   err;
5c67c5 ¤
1e922a ¤   // Create the endpoint
1212fb ¤   mEndpointRef = ::OTOpenEndpoint(¤   ::OTCreateConfiguration(kUDPName),
270d6c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
737393 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NULL,
da759c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &err);
41bc4c ¤   ThrowIfOTError(err);
ee0b3a ¤   err = ::OTSetBlocking(mEndpointRef);
26bc4c ¤   ThrowIfOTError(err);
8ded51 ¤   err = ::OTInstallNotifier(¤ mEndpointRef,
34860e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   NotifyProc,
7875f4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   this);
80bc4c ¤   ThrowIfOTError(err);
3cb2a6 ¤   err = ::OTUseSyncIdleEvents(¤   mEndpointRef,
4a5b4d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   true);
4bbc4c ¤   ThrowIfOTError(err);
cde7ab ¤   mSocketType = kPGPSocketTypeDatagram;
55efe6 }
c0af5a
06af5a
30af5a
de56b5 COTUDPSocket::~COTUDPSocket()
56bb36 {
91efe6 }
42af5a
37af5a
1aaf5a
d16d52 ¤   void
9d5018 COTUDPSocket::Bind(
119d9f ¤   const PGPSocketAddressInternet *¤   inAddress)
8cbb36 {
9ef05c ¤   COTInternetSocket::Bind(inAddress);
f87ae8 ¤   mBound = true;
15efe6 }
8aaf5a
a7af5a
5baf5a
df6d52 ¤   void
c59523 COTUDPSocket::Connect(
5a9d9f ¤   const PGPSocketAddressInternet *¤   inAddress)
1cbb36 {
b096a0 ¤   mConnected = true;
0382ba ¤   ::BlockMoveData(inAddress, &mConnectAddress,·
3f1d2c ¤   ¤   sizeof(PGPSocketAddressInternet));
1defe6 }
faaf5a
60af5a
b9af5a
6b959b ¤   SInt32
9361b3 COTUDPSocket::Send(
e34f2f ¤   const void *¤   inBuffer,
cf5537 ¤   SInt32¤ ¤   ¤   inLength,
39bb7a ¤   SInt32¤ ¤   ¤   inFlags)
20bb36 {
3334f3 ¤   SInt32¤ result = 0;
--0115 000d22bb1de401202ae Page 2 of COTUDPSocket.cp
2a67c5 ¤
5f0647 ¤   (void) inFlags;
fc67c5 ¤
ec8d78 ¤   if (mConnected) {
fc99bb ¤   ¤   result = SendTo(inBuffer, inLength, &mConnectAddress);
e4f037 ¤   } else {
eae57e ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotConnected);
5d9371 ¤   }
0667c5 ¤
f85d73 ¤   return result;
5fefe6 }
bfaf5a
e0af5a
92af5a
b7959b ¤   SInt32
19d1a1 COTUDPSocket::SendTo(
3b3074 ¤   const void *¤   ¤   ¤   ¤   ¤   ¤   inBuffer,
dac1ca ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   ¤   ¤   inLength,
9c9d9f ¤   const PGPSocketAddressInternet *¤   inAddress)
bcbb36 {
d7156f ¤   OSStatus¤   ¤   err;
202aa8 ¤   TUnitData¤  ¤   theDataUnit;
a11fcf ¤   InetAddress¤¤   theAddress;
6767c5 ¤
2a2655 ¤   // Fill out the data unit structure
579fd4 ¤   theAddress.fAddressType = AF_INET;
2b1004 ¤   theAddress.fPort = inAddress->sin_port;
d487ae ¤   theAddress.fHost = inAddress->sin_addr.s_addr;
c7569f ¤   theDataUnit.addr.len = sizeof(theAddress);
e64fe5 ¤   theDataUnit.addr.buf = (UInt8 *) &theAddress;
fd6fc3 ¤   theDataUnit.opt.len = 0;
204908 ¤   theDataUnit.opt.buf = nil;
9cb064 ¤   theDataUnit.udata.len = inLength;
7236ea ¤   theDataUnit.udata.buf = (UInt8 *) inBuffer;
1767c5 ¤
dd7ba4 ¤   // Bind the thing
9401ec ¤   DoBind(0);
86af5a
ab7800 ¤   err = ::OTSndUData(¤¤   mEndpointRef,
7c9afb ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theDataUnit);
43bc4c ¤   ThrowIfOTError(err);
7f94d1 ¤   return inLength;
bdefe6 }
bfaf5a
96af5a
82af5a
e7af5a
56959b ¤   SInt32
fd077c COTUDPSocket::Receive(
47c9d9 ¤   void *¤ outBuffer,
c2beea ¤   SInt32¤ inLength,
c90856 ¤   SInt32¤ inFlags)
44bb36 {
840647 ¤   (void) inFlags;
ef67c5 ¤
0d16a4 ¤   return ReceiveFrom(outBuffer, inLength, nil, nil);
33efe6 }
b9af5a
3faf5a
26af5a
b8959b ¤   SInt32
792332 COTUDPSocket::ReceiveFrom(
a8d5b1 ¤   void *¤ ¤   ¤   ¤   ¤   ¤   outBuffer,
e3aa35 ¤   SInt32¤ ¤   ¤   ¤   ¤   ¤   inSize,
27455d ¤   PGPSocketAddressInternet *¤ outAddress,
5fb450 ¤   SInt32 *¤   ¤   ¤   ¤   ¤   ioAddressLength)
20bb36 {
30156f ¤   OSStatus¤   ¤   err;
2a2aa8 ¤   TUnitData¤  ¤   theDataUnit;
e71fcf ¤   InetAddress¤¤   theAddress;
26db58 ¤   OTFlags¤¤   ¤   flags;
d2af5a
--051b 00152b7a290401202ae Page 3 of COTUDPSocket.cp
756bbf ¤   // Make sure that we have been bound
7cecde ¤   if (!mBound) {
943e64 ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotBound);
cd9371 ¤   }
f867c5 ¤
ff2655 ¤   // Fill out the data unit structure
85db00 ¤   theDataUnit.addr.maxlen = sizeof(theAddress);
ed4fe5 ¤   theDataUnit.addr.buf = (UInt8 *) &theAddress;
1d4796 ¤   theDataUnit.opt.maxlen = 0;
194908 ¤   theDataUnit.opt.buf = nil;
59d9c5 ¤   theDataUnit.udata.maxlen = inSize;
fba190 ¤   theDataUnit.udata.buf = (UInt8 *) outBuffer;
d667c5 ¤
9f7ba4 ¤   // Bind the thing
8601ec ¤   DoBind(0);
0aaf5a
c33950 ¤   err = ::OTRcvUData(¤mEndpointRef,
4d6028 ¤   ¤   ¤   ¤   ¤   ¤   &theDataUnit,
554d78 ¤   ¤   ¤   ¤   ¤   ¤   &flags);
e6bc4c ¤   ThrowIfOTError(err);
61447d ¤   if (outAddress != nil) {
c92535 ¤   ¤   outAddress->sin_family = kPGPAddressFamilyInternet;
d3e83f ¤   ¤   outAddress->sin_port = theAddress.fPort;
673dd2 ¤   ¤   outAddress->sin_addr.s_addr = theAddress.fHost;
cc9371 ¤   }
3767c5 ¤
05db67 ¤   if (ioAddressLength != nil) {
f63294 ¤   ¤   *ioAddressLength = sizeof(PGPSocketAddressInternet);
629371 ¤   }
8b67c5 ¤
5bef4d ¤   return theDataUnit.udata.len;
3befe6 }
4daf5a
71af5a
346d52 ¤   void
d5434b COTUDPSocket::Listen(
605148 ¤   SInt32¤ inMaxBacklog)
ffbb36 {
91645d ¤   (void) inMaxBacklog;
3a67c5 ¤
826bbb ¤   ThrowPGPError_(kPGPError_SocketsOperationNotSupported);
3aefe6 }
80af5a
38af5a
b9af5a
a05f00 ¤   CSocket *
93b66c COTUDPSocket::Accept(
7c455d ¤   PGPSocketAddressInternet *¤ outAddress,
b7b450 ¤   SInt32 *¤   ¤   ¤   ¤   ¤   ioAddressLength)
bcbb36 {
662844 ¤   (void) outAddress;
b267c5 ¤
8eeb15 ¤   *ioAddressLength = 0;
ce67c5 ¤
726bbb ¤   ThrowPGPError_(kPGPError_SocketsOperationNotSupported);
bf67c5 ¤
897409 ¤   return (CSocket *) kInvalidPGPSocketRef;
7eefe6 }
b4af5a
64af5a
3aaf5a
406d52 ¤   void
a7cd32 COTUDPSocket::GetPeerName(
80d657 ¤   PGPSocketAddressInternet *¤ outName)
07bb36 {
4d8d78 ¤   if (mConnected) {
e06a59 ¤   ¤   *outName = mConnectAddress;
0ff037 ¤   } else {
65e57e ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotConnected);
269371 ¤   }
52be43 }¶
--156d 001cee25597401202af Page 1 of COTUDPSocket.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
d9489e ¤   $Id: COTUDPSocket.h,v 1.4.10.1 1998/11/12 03:22:35 heller Exp $
4ef7f7 ____________________________________________________________________________*/
23af5a
cb8d55 #pragma once·
f8af5a
1abcb4 #include "COTInternetSocket.h"
4eaf5a
814beb class COTUDPSocket : public COTInternetSocket {
24a2d3 protected:
47b805 ¤   typedef COTInternetSocket¤  inherited;
aa67c5 ¤
225ed4 public:
a3a407 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   COTUDPSocket();
44bc25 ¤   virtual¤¤   ¤   ¤   ¤   ¤   ~COTUDPSocket();
ec67c5 ¤
3f4851 ¤   virtual void¤   ¤   ¤   ¤   Bind(const PGPSocketAddressInternet *
c447d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress);
de97b9 ¤   virtual void¤   ¤   ¤   ¤   Connect(const PGPSocketAddressInternet *
9547d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress);
c56bd1 ¤   virtual SInt32¤ ¤   ¤   ¤   Send(const void * inBuffer, SInt32 inLength,
1ec0c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inFlags);
a68f4a ¤   virtual SInt32¤ ¤   ¤   ¤   SendTo(const void * inBuffer, SInt32 inLength,
ea3f0d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPSocketAddressInternet *
b047d6 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress);
e89f93 ¤   virtual SInt32¤ ¤   ¤   ¤   Receive(void * outBuffer, SInt32 inLength,
91c0c4 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inFlags);
ab24c4 ¤   virtual SInt32¤ ¤   ¤   ¤   ReceiveFrom(void * outBuffer, SInt32 inSize,
c92c18 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSocketAddressInternet * outAddress,
617eee ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * ioAddressLength);
4b5864 ¤   virtual void¤   ¤   ¤   ¤   Listen(SInt32 inMaxBacklog);
8a4028 ¤   virtual CSocket *¤  ¤   ¤   Accept(PGPSocketAddressInternet * outAddress,
527e0c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * ioAddressLength);
9767c5 ¤
caa237 ¤   virtual void¤   ¤   ¤   ¤   GetPeerName(PGPSocketAddressInternet * outName);
9aaf5a
f0a2d3 protected:
4f0290 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mConnected;
01475b ¤   PGPSocketAddressInternet¤   mConnectAddress;
a21a76 ¤   Boolean¤¤   ¤   ¤   ¤   ¤   mBound;
cebf26 };¶
--82c2 000a59e9160401202b0 Page 1 of CSocket.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
b292b7 ¤   $Id: CSocket.cp,v 1.32.10.1 1998/11/12 03:22:35 heller Exp $
aaf7f7 ____________________________________________________________________________*/
5daf5a
026c79 #include <Gestalt.h>
7daf5a
4d0d08 #include "pgpMem.h"
4b9f63 #include "pgpEncode.h"
12af5a
8aa685 #include "COTInternetUtilities.h"
8480b5 #include "COTUDPSocket.h"
be0780 #include "COTTCPSocket.h"
ca9886 #include "CMacTCPInternetUtilities.h"
0f2ddf #include "CMacTCPUDPSocket.h"
91aaea #include "CMacTCPTCPSocket.h"
413438 #include "CSocket.h"
e9af5a
ffb210 Boolean¤¤   ¤   ¤   ¤   ¤   ¤   CSocket::sInitialized = false;
22f2f9 Boolean¤¤   ¤   ¤   ¤   ¤   ¤   CSocket::sUseOT = false;
1fb4e9 CInternetUtilities *¤   ¤   ¤   CSocket::sInternetUtilities = nil;
fc9492 set<CSocket *>¤ ¤   ¤   ¤   ¤   CSocket::sSocketsSet;
f56009 map<ThreadID, SThreadContext>¤  CSocket::sThreadContextMap;
cbaf5a
7f6404 const UInt32¤   ¤   ¤   ¤   ¤   kMinimumOTVersion = 0x01300000;
fa675a extern ThreadID¤¤   ¤   ¤   ¤   gMainThreadID;
fbaf5a
f96d52 ¤   void
646121 CSocket::Initialize()
28bb36 {
58c22a ¤   if (! sInitialized) {
c7b7f6 ¤   ¤   SInt32¤ ¤   theGestaltResult;
ad792a ¤   ¤   OSStatus¤   ¤   ¤   err = noErr;
31af5a
1a7ac3 ¤   ¤   // Determine whether or not to use MacTCP or OT
a7c49e ¤   ¤   if ((((UniversalProcPtr) InitOpenTransport) !=
2ac278 ¤   ¤   (UniversalProcPtr) kUnresolvedCFragSymbolAddress)
b0dda5 ¤   ¤   && (::Gestalt(gestaltOpenTpt, &theGestaltResult) == noErr)
768d6c ¤   ¤   && (theGestaltResult & gestaltOpenTptTCPPresentMask)
92d279 ¤   ¤   && (::Gestalt(gestaltOpenTptVersions, &theGestaltResult) == noErr)
cbad7d ¤   ¤   && (((NumVersionVariant *) &theGestaltResult)->whole >=
a39292 ¤   ¤   kMinimumOTVersion)) {
b2f3e3 ¤   ¤   ¤   sUseOT = true;
1445a6 ¤   ¤   } else {
59e71e ¤   ¤   ¤   sUseOT = false;
400fe4 ¤   ¤   }
d0af5a
4a3f00 ¤   ¤   // Perform initialization
abb97b ¤   ¤   if (sUseOT) {
2a7843 ¤   ¤   ¤   err = ::InitOpenTransport();
21cb08 ¤   ¤   ¤   if (err != kOTNoError) {
360795 ¤   ¤   ¤   ¤   ThrowPGPError_(err);
75a3a6 ¤   ¤   ¤   }
bd7e5b ¤   ¤   ¤   sInternetUtilities = new CMacTCPInternetUtilities;
1ff0c0 //¤ ¤   ¤   sInternetUtilities = new COTInternetUtilities;
5145a6 ¤   ¤   } else {
bc34e5 ¤   ¤   ¤   if (::Gestalt('mtcp', &theGestaltResult) != noErr) {
a32d94 ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNetworkDown);
d4a3a6 ¤   ¤   ¤   }
117e5b ¤   ¤   ¤   sInternetUtilities = new CMacTCPInternetUtilities;
1e0fe4 ¤   ¤   }
23c48b ¤   ¤   if (sInternetUtilities == nil) {
9bce01 ¤   ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
ab0fe4 ¤   ¤   }
9eaf5a
1f4d5e ¤   ¤   sInitialized = true;
409371 ¤   }
a5efe6 }
--0783 000ee5e100c401202b0 Page 2 of CSocket.cp
e0af5a
2767c5 ¤
abaf5a
8f6d52 ¤   void
13d78d CSocket::CleanupSockets()
edbb36 {
3011ff ¤   sSocketsSet.erase(sSocketsSet.begin(), sSocketsSet.end());
a1af5a
d7abfc ¤   sThreadContextMap.erase(¤   sThreadContextMap.begin(),
1cae52 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   sThreadContextMap.end());
8924a3 ¤   delete sInternetUtilities;
d8bc1e ¤   sInternetUtilities = NULL;
3e67c5 ¤
0e83e1 ¤   if (sUseOT) {
96b6e3 ¤   ¤   ::CloseOpenTransport();
2b9371 ¤   }
43009a ¤   sInitialized = false;
f9efe6 }
29af5a
2caf5a
217e69 ¤   Boolean
aa0ce5 CSocket::VerifyPGPSocketRef(
9a529a ¤   CSocket *¤  inSocketRef)
76bb36 {
40b708 ¤   return (sSocketsSet.find(inSocketRef) != sSocketsSet.end());
72efe6 }
4baf5a
c5af5a
bdaf5a
a96d52 ¤   void
c1b383 CSocket::CreateThreadStorage(
4b694b ¤   SThreadContext **¤  outContext)
96bb36 {
584cd1 ¤   OSStatus¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err;
7746ba ¤   ThreadID¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theThreadID;
d9348d ¤   map<ThreadID, SThreadContext>::iterator¤¤   theIterator;
4ea4a3 ¤   SThreadContext *¤   ¤   ¤   ¤   ¤   ¤   ¤   theResult = nil;
53af5a
345168 ¤   try {
174d98 ¤   ¤   err = ::GetCurrentThread(&theThreadID);
af951b ¤   ¤   if (err != noErr) {
ee3afd ¤   ¤   ¤   ThrowPGPError_(err);
ec0fe4 ¤   ¤   }
076c46 ¤   ¤   theIterator = sThreadContextMap.find(theThreadID);
ced9d4 ¤   ¤   if (theIterator != sThreadContextMap.end()) {
7f4206 ¤   ¤   ¤   theResult = new SThreadContext;
5f8173 ¤   ¤   ¤   if (theResult == NULL) {
41df26 ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
e2a3a6 ¤   ¤   ¤   }
488503 ¤   ¤   ¤   *theResult = (*theIterator).second;
c945a6 ¤   ¤   } else {
99dc85 ¤   ¤   ¤   SThreadContext¤ tempContext = {0, };
8caf5a
9ea2dc ¤   ¤   ¤   pgpLeaksSuspend();
785e53 ¤   ¤   ¤   sThreadContextMap[theThreadID] = tempContext;
60f60d ¤   ¤   ¤   pgpLeaksResume();
ee87c7 ¤   ¤   ¤
a46ca4 ¤   ¤   ¤   theIterator = sThreadContextMap.find(theThreadID);
c049f4 ¤   ¤   ¤   if (theIterator == sThreadContextMap.end()) {
a0df26 ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
15a3a6 ¤   ¤   ¤   }
9e0fe4 ¤   ¤   }
c7b18e ¤   ¤   (*theIterator).second.isBusy = false;
72acdd ¤   ¤   (*theIterator).second.lastError = kPGPError_NoErr;
7498d5 ¤   ¤   (*theIterator).second.hNameBuffer[0] = 0;
e70217 ¤   ¤   (*theIterator).second.hAliasesBuffer = NULL;
4ca4ca ¤   ¤   (*theIterator).second.hostEntry.h_name =
d8e605 ¤   ¤   ¤   ¤   (*theIterator).second.hNameBuffer;
2ef58d ¤   ¤   (*theIterator).second.hostEntry.unused =
b660f3 ¤   ¤   ¤   ¤   (*theIterator).second.hAliasesBuffer;
1c4603 ¤   ¤   (*theIterator).second.hostEntry.h_addrtype = kPGPAddressFamilyInternet;
eec863 ¤   ¤   (*theIterator).second.hostEntry.h_length = sizeof(PGPUInt32);
--1e3d 000962db1bc401202b0 Page 3 of CSocket.cp
95b727 ¤   ¤   (*theIterator).second.hostEntry.h_addr_list =·
289332 ¤   ¤   ¤   ¤   (char **) (*theIterator).second.hAddressesListBuffer;
60e581 ¤   ¤   (*theIterator).second.idleEventHandler = NULL;
71fec3 ¤   ¤   (*theIterator).second.idleEventHandlerData = NULL;
669371 ¤   }
af67c5 ¤
7fe0a3 ¤   catch (...) {
480156 ¤   ¤   delete theResult;
a2a33a ¤   ¤   throw;
5a9371 ¤   }
9967c5 ¤
446c30 ¤   *outContext = theResult;
7befe6 }
25af5a
c0af5a
77af5a
a56d52 ¤   void
fe0620 CSocket::DisposeThreadStorage(
b03e01 ¤   SThreadContext *¤   inContext)
15bb36 {
fc6cde ¤   ThreadID¤   theThreadID;
eda21f ¤   OSStatus¤   err;¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
8967c5 ¤
5255c8 ¤   err = ::GetCurrentThread(&theThreadID);
9d637e ¤   if (err != noErr) {
df81ab ¤   ¤   ThrowPGPError_(err);
d49371 ¤   }
7f91cf ¤   if (inContext != NULL) {
7810d4 ¤   ¤   sThreadContextMap[theThreadID] = *inContext;
174482 ¤   ¤   delete inContext;
caf037 ¤   } else {
c31e37 ¤   ¤   map<ThreadID, SThreadContext>::iterator¤theIterator;
c0af5a
ca6c46 ¤   ¤   theIterator = sThreadContextMap.find(theThreadID);
6ed9d4 ¤   ¤   if (theIterator != sThreadContextMap.end()) {
6dba9a ¤   ¤   ¤   sThreadContextMap.erase(theThreadID);
700fe4 ¤   ¤   }
2f9371 ¤   }
941b52 ¤   ¤
21efe6 }
aaaf5a
49af5a
2faf5a
0efb52 ¤   SThreadContext *
46c72b CSocket::GetThreadContext()
31bb36 {
e34cd1 ¤   OSStatus¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   err;
cc46ba ¤   ThreadID¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theThreadID;
b3348d ¤   map<ThreadID, SThreadContext>::iterator¤¤   theIterator;
70a4a3 ¤   SThreadContext *¤   ¤   ¤   ¤   ¤   ¤   ¤   theResult = nil;
7067c5 ¤
cd5168 ¤   try {
804d98 ¤   ¤   err = ::GetCurrentThread(&theThreadID);
2a951b ¤   ¤   if (err != noErr) {
653afd ¤   ¤   ¤   ThrowPGPError_(err);
2a0fe4 ¤   ¤   }
516c46 ¤   ¤   theIterator = sThreadContextMap.find(theThreadID);
674a83 ¤   ¤   if (theIterator == sThreadContextMap.end()) {
b134da ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNoStaticStorage);
980fe4 ¤   ¤   }
60af5a
694e3b ¤   ¤   theResult = &(*theIterator).second;
c99371 ¤   }
6567c5 ¤
e9e0a3 ¤   catch (...) {
6c9371 ¤   }
2b67c5 ¤
944c46 ¤   return theResult;
f6efe6 }
adaf5a
24af5a
96af5a
--720e 00061dd743d401202b0 Page 4 of CSocket.cp
975f00 ¤   CSocket *
a9729e CSocket::CreateSocket(
9399cc ¤   SInt32¤ inType)
5ebb36 {
de1a50 ¤   CSocket *¤  theSocket = (CSocket *) kInvalidPGPSocketRef;
ab67c5 ¤
660315 ¤   // Create a socket of the correct type
489217 ¤   switch (inType) {
4cb501 ¤   ¤   case kPGPSocketTypeStream:
da5b34 ¤   ¤   {
b97ece ¤   ¤   ¤   if (sUseOT) {
501613 ¤   ¤   ¤   ¤   theSocket = new COTTCPSocket;
b4042d ¤   ¤   ¤   } else {
c27e43 ¤   ¤   ¤   ¤   theSocket = new CMacTCPTCPSocket;
11a3a6 ¤   ¤   ¤   }
a37117 ¤   ¤   ¤   if (theSocket == nil) {
ecdf26 ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
d6a3a6 ¤   ¤   ¤   }
840fe4 ¤   ¤   }
5d2f68 ¤   ¤   break;
741b52 ¤   ¤
e61b52 ¤   ¤
ffac97 ¤   ¤   case kPGPSocketTypeDatagram:
795b34 ¤   ¤   {
797ece ¤   ¤   ¤   if (sUseOT) {
278777 ¤   ¤   ¤   ¤   theSocket = new COTUDPSocket;
89042d ¤   ¤   ¤   } else {
14ef27 ¤   ¤   ¤   ¤   theSocket = new CMacTCPUDPSocket;
d7a3a6 ¤   ¤   ¤   }
9e7117 ¤   ¤   ¤   if (theSocket == nil) {
f6df26 ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
e4a3a6 ¤   ¤   ¤   }
be0fe4 ¤   ¤   }
5a2f68 ¤   ¤   break;
3c1b52 ¤   ¤
3f1b52 ¤   ¤
219ae3 ¤   ¤   default:
e25b34 ¤   ¤   {
f17464 ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsProtocolNotSupported);
8a0fe4 ¤   ¤   }
e42f68 ¤   ¤   break;
889371 ¤   }
bf67c5 ¤
a24a85 ¤   return theSocket;
9befe6 }
56af5a
3caf5a
29af5a
fbf697 CSocket::CSocket()
cbd538 ¤   : mTLSSession(kInvalidPGPtlsSessionRef), mInCallback(false)
cdbb36 {
2a5415 ¤   pgpLeaksSuspend();
74c004 ¤   sSocketsSet.insert(this);
bfb8ec ¤   pgpLeaksResume();
bdefe6 }
d2af5a
d4af5a
54af5a
138366 CSocket::~CSocket()
04bb36 {
1938a0 ¤   sSocketsSet.erase(this);
e3efe6 }
6aaf5a
f5af5a
dfaf5a
c0959b ¤   SInt32
1acaf5 CSocket::Select(
0aa8a5 ¤   PGPSocketSet *¤ ¤   ¤   ¤   ioReadSet,
269256 ¤   PGPSocketSet *¤ ¤   ¤   ¤   ioWriteSet,
b77974 ¤   PGPSocketSet *¤ ¤   ¤   ¤   ioErrorSet,
ed91d1 ¤   const PGPSocketsTimeValue *¤inTimeout)
61bb36 {
--f931 000aebc278f401202b0 Page 5 of CSocket.cp
1236b4 ¤   UInt32¤ ¤   ¤   ¤   ticks;
5098de ¤   SInt32¤ ¤   ¤   ¤   result = 0;
7a9009 ¤   UInt16¤ ¤   ¤   ¤   i;
097e41 ¤   PGPSocketSet *¤ ¤   readSet = nil;
1c8576 ¤   PGPSocketSet *¤ ¤   writeSet = nil;
f5644a ¤   PGPSocketSet *¤ ¤   errorSet = nil;
0f67c5 ¤
045168 ¤   try {
acb047 ¤   ¤   readSet = new PGPSocketSet;
9afe06 ¤   ¤   writeSet = new PGPSocketSet;
217def ¤   ¤   errorSet = new PGPSocketSet;
b06bf5 ¤   ¤   if ((readSet == nil) || (writeSet == nil) || (errorSet == nil)) {
d9ce01 ¤   ¤   ¤   ThrowPGPError_(kPGPError_OutOfMemory);
b30fe4 ¤   ¤   }
801b52 ¤   ¤
67541e ¤   ¤   PGPSOCKETSET_ZERO(readSet);
6c4047 ¤   ¤   PGPSOCKETSET_ZERO(writeSet);
4842bc ¤   ¤   PGPSOCKETSET_ZERO(errorSet);
d8af5a
bd6a81 ¤   ¤   // Set the timeout
279b09 ¤   ¤   if (inTimeout == NULL) {
6d5e4f ¤   ¤   ¤   ticks = 0xFFFFFFFF;
7b45a6 ¤   ¤   } else {
00fb1a ¤   ¤   ¤   ticks = ::TickCount() + (60 * inTimeout->tv_sec)
5e6980 ¤   ¤   ¤   ¤   ¤   ¤   + ((1000 * inTimeout->tv_usec) / 60);
340fe4 ¤   ¤   }
061b52 ¤   ¤
8295f7 ¤   ¤   // Check the sets
d8d1e1 ¤   ¤   Boolean¤socketClosed = false;
e2af5a
434392 ¤   ¤   do {
cd939d ¤   ¤   ¤   if (ioReadSet != NULL) {
d98ef1 ¤   ¤   ¤   ¤   for (i = 0; i < ioReadSet->fd_count; i++) {
c12d65 ¤   ¤   ¤   ¤   ¤   if (VerifyPGPSocketRef(
31c083 ¤   ¤   ¤   ¤   ¤   (CSocket *) ioReadSet->fd_array[i])) {
8058d7 ¤   ¤   ¤   ¤   ¤   ¤   if (((CSocket *) ioReadSet->fd_array[i])->
388515 ¤   ¤   ¤   ¤   ¤   ¤   IsReadable()) {
e6380d ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSOCKETSET_SET(¤  ioReadSet->fd_array[i],
c16e6e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   readSet);
f1640c ¤   ¤   ¤   ¤   ¤   ¤   ¤   result++;
9edb3c ¤   ¤   ¤   ¤   ¤   ¤   }
a281a1 ¤   ¤   ¤   ¤   ¤   } else {
59a51e ¤   ¤   ¤   ¤   ¤   ¤   socketClosed = true;
111c89 ¤   ¤   ¤   ¤   ¤   }
122613 ¤   ¤   ¤   ¤   }
b2a3a6 ¤   ¤   ¤   }
e4f968 ¤   ¤   ¤   if (ioWriteSet != NULL) {
894036 ¤   ¤   ¤   ¤   for (i = 0; i < ioWriteSet->fd_count; i++) {
dc2d65 ¤   ¤   ¤   ¤   ¤   if (VerifyPGPSocketRef(
397285 ¤   ¤   ¤   ¤   ¤   (CSocket *) ioWriteSet->fd_array[i])) {
64c748 ¤   ¤   ¤   ¤   ¤   ¤   if (((CSocket *) ioWriteSet->fd_array[i])->
af1a8a ¤   ¤   ¤   ¤   ¤   ¤   ¤   IsWriteable()) {
16cc5d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSOCKETSET_SET(ioWriteSet->fd_array[i],
20fd54 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   writeSet);
b558e2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   result++;
905268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
ea81a1 ¤   ¤   ¤   ¤   ¤   } else {
96a51e ¤   ¤   ¤   ¤   ¤   ¤   socketClosed = true;
101c89 ¤   ¤   ¤   ¤   ¤   }
892613 ¤   ¤   ¤   ¤   }
7aa3a6 ¤   ¤   ¤   }
2a71d3 ¤   ¤   ¤   if (ioErrorSet != NULL) {
b44219 ¤   ¤   ¤   ¤   for (i = 0; i < ioErrorSet->fd_count; i++) {
602d65 ¤   ¤   ¤   ¤   ¤   if (VerifyPGPSocketRef(
a04da7 ¤   ¤   ¤   ¤   ¤   (CSocket *) ioErrorSet->fd_array[i])) {
fd6034 ¤   ¤   ¤   ¤   ¤   ¤   if (((CSocket *) ioErrorSet->fd_array[i])->IsError()) {
075d3d ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSOCKETSET_SET(ioErrorSet->fd_array[i], errorSet);
88640c ¤   ¤   ¤   ¤   ¤   ¤   ¤   result++;
05db3c ¤   ¤   ¤   ¤   ¤   ¤   }
a581a1 ¤   ¤   ¤   ¤   ¤   } else {
7ba51e ¤   ¤   ¤   ¤   ¤   ¤   socketClosed = true;
ae1c89 ¤   ¤   ¤   ¤   ¤   }
--a0db 0009cdbb24b401202b0 Page 6 of CSocket.cp
862613 ¤   ¤   ¤   ¤   }
2ba3a6 ¤   ¤   ¤   }
0987c7 ¤   ¤   ¤
46a883 ¤   ¤   ¤   if ((result > 0) || socketClosed) {
06f622 ¤   ¤   ¤   ¤   break;
40a3a6 ¤   ¤   ¤   }
4187c7 ¤   ¤   ¤
12233d ¤   ¤   ¤   // Give time to callback
28da84 ¤   ¤   ¤   ThrowIfPGPError_(CallIdleEventHandler());
d5bec4 ¤   ¤   } while (::TickCount() < ticks);
e31b52 ¤   ¤
5baef5 ¤   ¤   if (ioReadSet != NULL) {
8a36f4 ¤   ¤   ¤   *ioReadSet = *readSet;
590fe4 ¤   ¤   }
64161b ¤   ¤   if (ioWriteSet != NULL) {
297ac0 ¤   ¤   ¤   *ioWriteSet = *writeSet;
050fe4 ¤   ¤   }
789ea0 ¤   ¤   if (ioErrorSet != NULL) {
2b4764 ¤   ¤   ¤   *ioErrorSet = *errorSet;
260fe4 ¤   ¤   }
7c1b52 ¤   ¤
7f6991 ¤   ¤   delete readSet;
d63439 ¤   ¤   delete writeSet;
3edf1b ¤   ¤   delete errorSet;
7c9371 ¤   }
4c67c5 ¤
46e0a3 ¤   catch (...) {
1c6991 ¤   ¤   delete readSet;
563439 ¤   ¤   delete writeSet;
20df1b ¤   ¤   delete errorSet;
12a33a ¤   ¤   throw;
769371 ¤   }
4567c5 ¤
8b5d73 ¤   return result;
40efe6 }
2567c5 ¤
19af5a
246d52 ¤   void
ffabdb CSocket::GetSocketOptions(
1f1640 ¤   SInt32¤ ¤   inOptionName,
9f0b83 ¤   SInt32 *¤   outOptionValue)
d0bb36 {
96d47f ¤   switch (inOptionName) {
e66de0 ¤   ¤   case kPGPSocketOptionAcceptingConnections:
c65b34 ¤   ¤   {
9b3086 ¤   ¤   ¤   *outOptionValue = IsListening();
b70fe4 ¤   ¤   }
b72f68 ¤   ¤   break;
281b52 ¤   ¤
3e1b52 ¤   ¤
32f915 ¤   ¤   case kPGPSocketOptionType:
175b34 ¤   ¤   {
94b83c ¤   ¤   ¤   *outOptionValue = mSocketType;
140fe4 ¤   ¤   }
8b2f68 ¤   ¤   break;
9d9371 ¤   }
93efe6 }
32af5a
03af5a
5daf5a
926d52 ¤   void
4fc407 CSocket::SetIdleEventHandler(
f1d261 ¤   PGPEventHandlerProcPtr¤ inCallback,
60dbfa ¤   PGPUserValue¤   ¤   ¤   inUserData)
9cbb36 {
d5386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
e267c5 ¤
78dd13 ¤   if (theContext == nil) {
4f3a3a ¤   ¤   ThrowPGPError_(kPGPError_UnknownError);
b5f037 ¤   } else {
575bff ¤   ¤   theContext->idleEventHandler = inCallback;
9c7410 ¤   ¤   theContext->idleEventHandlerData = inUserData;
--a2a9 001b8a18bc1401202b0 Page 7 of CSocket.cp
a19371 ¤   }
c9efe6 }
a0af5a
67af5a
20af5a
986d52 ¤   void
eb7744 CSocket::GetIdleEventHandler(
6f286e ¤   PGPEventHandlerProcPtr *¤   outCallback,
b370d3 ¤   PGPUserValue *¤ ¤   ¤   ¤   outUserData)
e3bb36 {
10386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
09af5a
6fdd13 ¤   if (theContext == nil) {
063a3a ¤   ¤   ThrowPGPError_(kPGPError_UnknownError);
edf037 ¤   } else {
4722a0 ¤   ¤   *outCallback = theContext->idleEventHandler;
f2d685 ¤   ¤   *outUserData = theContext->idleEventHandlerData;
0f9371 ¤   }
5befe6 }
ceaf5a
d8c744 ¤   PGPError
23b751 CSocket::CallIdleEventHandler()
96bb36 {
d5386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
a7a8ad ¤   PGPError¤   result;
c967c5 ¤
c28982 ¤   if ((theContext != nil) && (theContext->idleEventHandler != nil)) {
ccfcfa ¤   ¤   PGPEvent¤   ¤   ¤   theEvent;
34af5a
77249d ¤   ¤   pgpClearMemory(&theEvent, sizeof(theEvent));
f87f8b ¤   ¤   theEvent.type = kPGPEvent_SocketsIdleEvent;
c0afbb ¤   ¤   result = theContext->idleEventHandler(
528bcf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   nil,
002203 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &theEvent,
7827ea ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theContext->idleEventHandlerData);
9af037 ¤   } else {
663130 ¤   ¤   result = kPGPError_NoErr;
559371 ¤   }
2c67c5 ¤
425d73 ¤   return result;
b8efe6 }
--e67a 0000810b244401202b1 Page 1 of CSocket.h
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
abc5b9 ¤   $Id: CSocket.h,v 1.15.10.1 1998/11/12 03:22:36 heller Exp $
5af7f7 ____________________________________________________________________________*/
42af5a
bc8d55 #pragma once·
9aaf5a
912530 #include <map>
89e145 #include <set>
03af5a
266331 #include <OpenTransport.h>
c731f3 #include <OpenTptInternet.h>
1290a3 #include <Threads.h>
31af5a
965eab #define PGP_MACINTOSH 1
382b46 #include "pgpBinaryTree.h"
9c6eb6 #include "PGPSockets.h"
9b2556 #include "CInternetUtilities.h"
83ec82 #include "pgpTLS.h"
51af5a
f1a09a class CInternetUtilities;
156084 struct SThreadContext {
1cb0c1 ¤   Boolean¤¤   ¤   ¤   ¤   isBusy;
b210c3 ¤   PGPError¤   ¤   ¤   ¤   lastError;
7cdd91 ¤   char¤   ¤   ¤   ¤   ¤   hNameBuffer[kMaxHostNameLen + 1];
0f1a86 ¤   char **¤¤   ¤   ¤   ¤   hAliasesBuffer;
9c7773 ¤   UInt32 *¤   ¤   ¤   ¤   hAddressesListBuffer[kMaxHostAddrs];
a3ce8e ¤   UInt32¤ ¤   ¤   ¤   ¤   hAddressesBuffer[kMaxHostAddrs];
15d4d1 ¤   PGPHostEntry¤   ¤   ¤   hostEntry;
0af087 ¤   PGPProtocolEntry¤   ¤   protocolEntry;
55d8fd ¤   PGPServiceEntry¤¤   ¤   serviceEntry;
54e3e5 ¤   char¤   ¤   ¤   ¤   ¤   dottedStringBuffer[17];
72c027 ¤   PGPEventHandlerProcPtr¤ idleEventHandler;
a79d65 ¤   PGPUserValue¤   ¤   ¤   idleEventHandlerData;
be82f7 };
b4af5a
5ac76f class CSocket {
185ed4 public:
e88958 ¤   static void¤¤   ¤   ¤   ¤   ¤   Initialize();
1caf5a
712769 ¤   static void¤¤   ¤   ¤   ¤   ¤   SetIdleEventHandler(
9b604d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEventHandlerProcPtr inCallback,
0d4015 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue inUserData);
b0942a ¤   static void¤¤   ¤   ¤   ¤   ¤   GetIdleEventHandler(
9fab0b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPEventHandlerProcPtr * outCallback,
519225 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPUserValue * outUserData);
b79367 ¤   static PGPError¤¤   ¤   ¤   ¤   CallIdleEventHandler();
7467c5 ¤
5350ed ¤   static void¤¤   ¤   ¤   ¤   ¤   CreateThreadStorage(
50c40c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SThreadContext ** outContext);
3b8cbb ¤   static void¤¤   ¤   ¤   ¤   ¤   DisposeThreadStorage(
35475c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SThreadContext * inContext);
daaf5a
e38e22 ¤   static CSocket *¤   ¤   ¤   ¤   CreateSocket(SInt32 inType);
aff470 ¤   static Boolean¤ ¤   ¤   ¤   ¤   VerifyPGPSocketRef(CSocket * inSocketRef);
459eff ¤   static void¤¤   ¤   ¤   ¤   ¤   CleanupSockets();
e8af5a
48c037 ¤   static SInt32¤  ¤   ¤   ¤   ¤   Select(PGPSocketSet * ioReadSet,
b19fd7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSocketSet * ioWriteSet,
e774f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSocketSet * ioErrorSet,
4fba15 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPSocketsTimeValue * inTimeout);
29ed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
0ef20e ¤   static SThreadContext *¤¤   ¤   GetThreadContext();
cf67c5 ¤
a07718 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   CSocket();
739bbf ¤   virtual¤¤   ¤   ¤   ¤   ¤   ¤   ~CSocket();
ef67c5 ¤
08c165 ¤   virtual void¤   ¤   ¤   ¤   ¤   Bind(const PGPSocketAddressInternet *
--9138 0014ee5590c401202b1 Page 2 of CSocket.h
92c9f3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress) = 0;
f129a2 ¤   virtual void¤   ¤   ¤   ¤   ¤   Connect(const PGPSocketAddressInternet *
10c9f3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress) = 0;
6e6b32 ¤   virtual SInt32¤ ¤   ¤   ¤   ¤   Send(const void * inBuffer,
5d2686 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inLength,
541a2f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inFlags) = 0;
4febd5 ¤   virtual SInt32¤ ¤   ¤   ¤   ¤   SendTo(const void * inBuffer,
fa2686 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inLength,
06387b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   const PGPSocketAddressInternet *
410def ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inAddress) = 0;
643c47 ¤   virtual SInt32¤ ¤   ¤   ¤   ¤   Receive(void * outBuffer, SInt32 inLength,
bc1a2f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inFlags) = 0;
9436a7 ¤   virtual SInt32¤ ¤   ¤   ¤   ¤   ReceiveFrom(void * outBuffer,
96cfda ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 inSize,
fec13f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSocketAddressInternet * outAddress,
c36b4e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * ioAddressLength) = 0;
dfeba7 ¤   virtual void¤   ¤   ¤   ¤   ¤   Listen(SInt32 inMaxBacklog) = 0;
1c1d63 ¤   virtual CSocket *¤  ¤   ¤   ¤   Accept(
72c13f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSocketAddressInternet * outAddress,
2d6b4e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * ioAddressLength) = 0;
534bd0 ¤   virtual void¤   ¤   ¤   ¤   ¤   Close() = 0;
7a67c5 ¤
548f60 ¤   virtual void¤   ¤   ¤   ¤   ¤   GetSocketName(PGPSocketAddressInternet *
adb1d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outName) = 0;
ee8db4 ¤   virtual void¤   ¤   ¤   ¤   ¤   GetPeerName(PGPSocketAddressInternet *
edb1d8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outName) = 0;
3b67c5 ¤
17a2a5 ¤   virtual void¤   ¤   ¤   ¤   ¤   IOControlSocket(SInt32 inCommand,
bdf014 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   UInt32 * ioParam) = 0;
785ea8 ¤   virtual void¤   ¤   ¤   ¤   ¤   GetSocketOptions(SInt32 inOptionName,
a97182 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   SInt32 * outOptionValue);
160230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
af1812 ¤   virtual SInt16¤ ¤   ¤   ¤   ¤   GetSocketType() { return mSocketType; }
1e0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
23ee0d ¤   virtual Boolean¤¤   ¤   ¤   ¤   HasTLSSession()
cea6f5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return mTLSSession !=·
ba3686 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··kInvalidPGPtlsSessionRef; }
03c59c ¤   virtual void¤   ¤   ¤   ¤   ¤   SetTLSSession(PGPtlsSessionRef inSession)
4afaaf ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { mTLSSession = inSession; }
199136 ¤   virtual PGPtlsSessionRef¤   ¤   GetTLSSession()
4696f9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return mTLSSession; }
ac0230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
235b14 ¤   virtual Boolean¤¤   ¤   ¤   ¤   IsInCallback()
138ee8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   { return mInCallback; }
d60230 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
e42c03 ¤   static CInternetUtilities *¤¤   sInternetUtilities;
1baf5a
dca2d3 protected:
c2bfe0 ¤   static Boolean¤ ¤   ¤   ¤   ¤   sInitialized;
85793d ¤   static Boolean¤ ¤   ¤   ¤   ¤   sUseOT;
5467c5 ¤
e7425c ¤   static set<CSocket *>¤  ¤   ¤   sSocketsSet;
17b68c ¤   static map<ThreadID, SThreadContext>¤   sThreadContextMap;
6267c5 ¤
aee154 ¤   SInt16¤ ¤   ¤   ¤   ¤   ¤   ¤   mSocketType;
90cd7f ¤   Boolean¤¤   ¤   ¤   ¤   ¤   ¤   mInCallback;
f767c5 ¤
73219a ¤   PGPtlsSessionRef¤   ¤   ¤   ¤   mTLSSession;
bf67c5 ¤
25a79f ¤   virtual Boolean¤¤   ¤   ¤   ¤   IsReadable() = 0;
c14b46 ¤   virtual Boolean¤¤   ¤   ¤   ¤   IsWriteable() = 0;
29fa31 ¤   virtual Boolean¤¤   ¤   ¤   ¤   IsError() = 0;
ff67c5 ¤
71606c ¤   virtual Boolean¤¤   ¤   ¤   ¤   IsListening() { return false; }
4ebf26 };¶
--0919 000edcbaa46401202b2 Page 1 of PGPSockets.cp
a70335 /*____________________________________________________________________________
d4c97d ¤   Copyright (C) 1997 Network Associates, Inc. and its affiliates.
374b0f ¤   All rights reserved.
3b67c5 ¤
ea67c5 ¤
0767c5 ¤
4784d9 ¤   $Id: PGPSockets.cp,v 1.27.10.1 1998/11/12 03:22:37 heller Exp $
56f7f7 ____________________________________________________________________________*/
53af5a
448f22 #include <CodeFragments.h>
a0eef1 #include <NumberFormatting.h>
0baf5a
ff324c #include <string.h>
94b1cb #include <ctype.h>
cfaf5a
1a3438 #include "CSocket.h"
fe2556 #include "CInternetUtilities.h"
a5af5a
435eab #define PGP_MACINTOSH 1
bbaf5a
8f6eb6 #include "PGPSockets.h"
6eaf5a
59af5a
30af5a
eb6e95 PGPSocketAddressInternet¤   kPGPAddressAny = {¤ kPGPAddressFamilyInternet,
604446 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   0,
c6eefd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {kPGPInternetAddressAny},
617515 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {0,0,0,0,0,0,0,0}};
a1071b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
07c859 static SInt32¤  ¤   ¤   ¤   ¤   sNumberOfInits = 0;
a7924a static map<PGPError, PGPError>¤ sErrorMap;
4f06f0 static char *¤  ¤   ¤   ¤   ¤   sNull[] = {NULL};
f4870f static char *¤  ¤   ¤   ¤   ¤   sDiscardAliases[] = {"sink", "null", NULL};
d5c924 static char *¤  ¤   ¤   ¤   ¤   sSystatAliases[] = {"users", NULL};
2ec9fd static char *¤  ¤   ¤   ¤   ¤   sQotdAliases[] = {"quote", NULL};
60c329 static char *¤  ¤   ¤   ¤   ¤   sChargenAliases[] = {"ttytst", "source", NULL};
0e0bca static char *¤  ¤   ¤   ¤   ¤   sSMTPAliases[] = {"mail", NULL};
6297a0 static char *¤  ¤   ¤   ¤   ¤   sTimeAliases[] = {"timserver", NULL};
7d68ce static char *¤  ¤   ¤   ¤   ¤   sNameServerAliases[] = {"name", NULL};
91cd59 static char *¤  ¤   ¤   ¤   ¤   sWhoisAliases[] = {"nicname", NULL};
c95409 static char *¤  ¤   ¤   ¤   ¤   sRJEAliases[] = {"netrjs", NULL};
a4da59 static char *¤  ¤   ¤   ¤   ¤   sWWWAliases[] = {"http", NULL};
93efda static char *¤  ¤   ¤   ¤   ¤   sLinkAliases[] = {"ttylink", NULL};
67f6dd static char *¤  ¤   ¤   ¤   ¤   sKerberosAliases[] = {"krb5", NULL};
9c4979 static char *¤  ¤   ¤   ¤   ¤   sHostnamesAliases[] = {"hostname", NULL};
a63fcc static char *¤  ¤   ¤   ¤   ¤   sISO_TSAPAliases[] = {"tsap", NULL};
8b8448 static char *¤  ¤   ¤   ¤   ¤   sCSNET_NSAliases[] = {"cso-ns", NULL};
2e890e static char *¤  ¤   ¤   ¤   ¤   sPOP2Aliases[] = {"postoffice", NULL};
aad031 static char *¤  ¤   ¤   ¤   ¤   sAuthAliases[] = {"tap", "ident",·
2bb9c3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··"authentication", NULL};
672db7 static char *¤  ¤   ¤   ¤   ¤   sNNTPAliases[] = {"readnews", "untp",
5f468a ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··"usenet", NULL};
8273f5 static char *¤  ¤   ¤   ¤   ¤   sSNMP_TrapAliases[] = {"snmptrap", NULL};
8a3816 static char *¤  ¤   ¤   ¤   ¤   sNextstepAliases[] = {"NeXTStep", "NextStep",
19839f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··NULL};
0a8592 static char *¤  ¤   ¤   ¤   ¤   sZ3950Aliases[] = {"wais", NULL};
1e39cb static char *¤  ¤   ¤   ¤   ¤   sBiffAliases[] = {"comsat", NULL};
0b4c15 static char *¤  ¤   ¤   ¤   ¤   sWhoAliases[] = {"whod", NULL};
3656cd static char *¤  ¤   ¤   ¤   ¤   sShellAliases[] = {"cmd", NULL};
472ad2 static char *¤  ¤   ¤   ¤   ¤   sPrinterAliases[] = {"spooler", NULL};
70a85a static char *¤  ¤   ¤   ¤   ¤   sRouteAliases[] = {"router", "routed", NULL};
f60074 static char *¤  ¤   ¤   ¤   ¤   sTimedAliases[] = {"timeserver", NULL};
0bf5db static char *¤  ¤   ¤   ¤   ¤   sTempoAliases[] = {"newdate", NULL};
53ea24 static char *¤  ¤   ¤   ¤   ¤   sCourierAliases[] = {"rpc", NULL};
f15133 static char *¤  ¤   ¤   ¤   ¤   sConferenceAliases[] = {"chat", NULL};
aaa13c static char *¤  ¤   ¤   ¤   ¤   sUUCPAliases[] = {"uucpd", NULL};
764789 static char *¤  ¤   ¤   ¤   ¤   sRemotefsAliases[] = {"rfs_server", "rfs",
33839f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ··NULL};
6148a2 static char *¤  ¤   ¤   ¤   ¤   sKrbupdateAliases[] = {"kreg", NULL};
2f327a static char *¤  ¤   ¤   ¤   ¤   sKpasswdAliases[] = {"kpwd", NULL};
663019 static PGPProtocolEntry¤¤   ¤   sProtocolArray[] = {
ed1d14 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {"tcp", sNull, 6},
--1e66 0002e4ace79401202b2 Page 2 of PGPSockets.cp
89f930 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   {"udp", sNull, 17}};
2aed43 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
0457c1 static PGPServiceEntry¤ ¤   ¤   sServiceArray[] = {
8d256f ¤   ¤   {"tcpmux", ¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   1,¤ ¤   "tcp"},
a19afd ¤   ¤   {"echo",¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   7,¤ ¤   "tcp"},
4719f9 ¤   ¤   {"echo",¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   7,¤ ¤   "udp"},
97e452 ¤   ¤   {"discard",¤¤   ¤   sDiscardAliases,¤   ¤   9,¤ ¤   "tcp"},
b92b98 ¤   ¤   {"discard", ¤   ¤   sDiscardAliases,¤   ¤   9,¤ ¤   "udp"},
8ecdc1 ¤   ¤   {"systat",¤ ¤   ¤   sSystatAliases,¤¤   ¤   11,¤¤   "tcp"},
01eab9 ¤   ¤   {"daytime",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   13,¤¤   "tcp"},
4f69bd ¤   ¤   {"daytime",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   13,¤¤   "udp"},
0177f7 ¤   ¤   {"netstat",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   15,¤¤   "tcp"},
0fde95 ¤   ¤   {"qotd",¤   ¤   ¤   sQotdAliases,¤  ¤   ¤   17,¤¤   "tcp"},
c7ef80 ¤   ¤   {"msp",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   18,¤¤   "tcp"},
086c84 ¤   ¤   {"msp",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   18,¤¤   "udp"},
4709ef ¤   ¤   {"chargen",¤¤   ¤   sChargenAliases,¤   ¤   19,¤¤   "tcp"},
f48aeb ¤   ¤   {"chargen",¤¤   ¤   sChargenAliases,¤   ¤   19,¤¤   "udp"},
7ed00d ¤   ¤   {"ftp",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   21,¤¤   "tcp"},
309273 ¤   ¤   {"telnet",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   23,¤¤   "tcp"},
b8ff55 ¤   ¤   {"smtp",¤   ¤   ¤   sSMTPAliases,¤  ¤   ¤   25,¤¤   "tcp"},
da79b1 ¤   ¤   {"time",¤   ¤   ¤   sTimeAliases,¤  ¤   ¤   37,¤¤   "tcp"},
2dfab5 ¤   ¤   {"time",¤   ¤   ¤   sTimeAliases,¤  ¤   ¤   37,¤¤   "udp"},
09c624 ¤   ¤   {"rlp",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   39,¤¤   "udp"},
e8e892 ¤   ¤   {"nameserver",¤ ¤   sNameServerAliases,¤¤   42,¤¤   "tcp"},
d71ae2 ¤   ¤   {"whois",¤  ¤   ¤   sWhoisAliases,¤ ¤   ¤   43,¤¤   "tcp"},
b72182 ¤   ¤   {"domain",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   53,¤¤   "tcp"},
14a286 ¤   ¤   {"domain",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   53,¤¤   "udp"},
624784 ¤   ¤   {"bootps",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   67,¤¤   "tcp"},
14c480 ¤   ¤   {"bootps",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   67,¤¤   "udp"},
b1c0cd ¤   ¤   {"bootpc",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   68,¤¤   "tcp"},
6d43c9 ¤   ¤   {"bootpc",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   68,¤¤   "udp"},
156d41 ¤   ¤   {"tftp",¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   69,¤¤   "udp"},
4cb74b ¤   ¤   {"gopher",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   70,¤¤   "tcp"},
cd344f ¤   ¤   {"gopher",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   70,¤¤   "udp"},
3d435b ¤   ¤   {"rje",¤¤   ¤   ¤   sRJEAliases,¤   ¤   ¤   77,¤¤   "tcp"},
556b05 ¤   ¤   {"finger",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   79,¤¤   "tcp"},
6bf20c ¤   ¤   {"www",¤¤   ¤   ¤   sWWWAliases,¤   ¤   ¤   80,¤¤   "tcp"},
9c2f1c ¤   ¤   {"www",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   80,¤¤   "udp"},
f3a6b4 ¤   ¤   {"link", ¤  ¤   ¤   sLinkAliases,¤  ¤   ¤   87,¤¤   "tcp"},
6768f7 ¤   ¤   {"kerberos",¤   ¤   sKerberosAliases,¤  ¤   88,¤¤   "tcp"},
aa62d4 ¤   ¤   {"kerberos",¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   88,¤¤   "udp"},
0e830e ¤   ¤   {"supdup",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   95,¤¤   "tcp"},
c07857 ¤   ¤   {"hostnames",¤  ¤   sHostnamesAliases,¤ ¤   101,¤   "tcp"},
104ea8 ¤   ¤   {"iso-tsap", ¤  ¤   sISO_TSAPAliases,¤  ¤   102,¤   "tcp"},
8d3d73 ¤   ¤   {"csnet-ns",¤   ¤   sCSNET_NSAliases,¤  ¤   105,¤   "tcp"},
ecbe77 ¤   ¤   {"csnet-ns",¤   ¤   sCSNET_NSAliases,¤  ¤   105,¤   "udp"},
2264c6 ¤   ¤   {"rtelnet",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   107,¤   "tcp"},
86e7c2 ¤   ¤   {"rtelnet",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   107,¤   "udp"},
719caa ¤   ¤   {"pop2",¤   ¤   ¤   sPOP2Aliases,¤  ¤   ¤   109,¤   "tcp"},
bd27df ¤   ¤   {"pop2",¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   109,¤   "udp"},
26b26d ¤   ¤   {"pop3",¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   110,¤   "tcp"},
ca3169 ¤   ¤   {"pop3",¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   110,¤   "udp"},
dd10ef ¤   ¤   {"sunrpc",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   111,¤   "tcp"},
ce93eb ¤   ¤   {"sunrpc",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   111,¤   "udp"},
6136e0 ¤   ¤   {"auth",¤   ¤   ¤   sAuthAliases,¤  ¤   ¤   113,¤   "tcp"},
727b34 ¤   ¤   {"sftp",¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   115,¤   "tcp"},
3aec69 ¤   ¤   {"uucp-path",¤  ¤   sNull,¤ ¤   ¤   ¤   ¤   117,¤   "tcp"},
2f5a35 ¤   ¤   {"nntp",¤   ¤   ¤   sNNTPAliases,¤  ¤   ¤   119,¤   "tcp"},
c5a28c ¤   ¤   {"ntp",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   123,¤   "tcp"},
962188 ¤   ¤   {"ntp",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   123,¤   "udp"},
7c1e27 ¤   ¤   {"netbios-ns",¤ ¤   sNull,¤ ¤   ¤   ¤   ¤   137,¤   "tcp"},
1b9d23 ¤   ¤   {"netbios-ns",¤ ¤   sNull,¤ ¤   ¤   ¤   ¤   137,¤   "udp"},
fe44c0 ¤   ¤   {"netbios-dgm",¤¤   sNull,¤ ¤   ¤   ¤   ¤   138,¤   "tcp"},
18c7c4 ¤   ¤   {"netbios-dgm",¤¤   sNull,¤ ¤   ¤   ¤   ¤   138,¤   "udp"},
86de5b ¤   ¤   {"netbios-ssn",¤¤   sNull,¤ ¤   ¤   ¤   ¤   139,¤   "tcp"},
1b5d5f ¤   ¤   {"netbios-ssn",¤¤   sNull,¤ ¤   ¤   ¤   ¤   139,¤   "udp"},
b23550 ¤   ¤   {"imap2",¤  ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   143,¤   "tcp"},
eab654 ¤   ¤   {"imap2",¤  ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   143,¤   "udp"},
145315 ¤   ¤   {"snmp",¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   161,¤   "udp"},
f188f2 ¤   ¤   {"snmp-trap",¤  ¤   sSNMP_TrapAliases,¤ ¤   162,¤   "udp"},
1f591a ¤   ¤   {"cmip-man",¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   163,¤   "tcp"},
2eda1e ¤   ¤   {"cmip-man",¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   163,¤   "udp"},
--d114 0003dbf5c20401202b2 Page 3 of PGPSockets.cp
fab307 ¤   ¤   {"cmip-agent",¤ ¤   sNull,¤ ¤   ¤   ¤   ¤   164,¤   "tcp"},
8f3003 ¤   ¤   {"cmip-agent",¤ ¤   sNull,¤ ¤   ¤   ¤   ¤   164,¤   "udp"},
8e2915 ¤   ¤   {"xdmcp",¤  ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   177,¤   "tcp"},
99aa11 ¤   ¤   {"xdmcp",¤  ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   177,¤   "udp"},
b7be1b ¤   ¤   {"nextstep",¤   ¤   sNextstepAliases,¤  ¤   178,¤   "tcp"},
dc3d1f ¤   ¤   {"nextstep",¤   ¤   sNextstepAliases,¤  ¤   178,¤   "udp"},
8fcc0e ¤   ¤   {"bgp",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   179,¤   "tcp"},
594f0a ¤   ¤   {"bgp",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   179,¤   "udp"},
d2712d ¤   ¤   {"prospero",¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   191,¤   "tcp"},
e6f229 ¤   ¤   {"prospero",¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   191,¤   "udp"},
2afb4c ¤   ¤   {"irc",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   194,¤   "tcp"},
fd7848 ¤   ¤   {"irc",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   194,¤   "udp"},
7cd120 ¤   ¤   {"smux",¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   199,¤   "tcp"},
755224 ¤   ¤   {"smux",¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   199,¤   "udp"},
ef1f95 ¤   ¤   {"at-rtmp",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   201,¤   "tcp"},
119c91 ¤   ¤   {"at-rtmp",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   201,¤   "udp"},
e2e33c ¤   ¤   {"at-nbp",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   202,¤   "tcp"},
9b6038 ¤   ¤   {"at-nbp",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   202,¤   "udp"},
0f665f ¤   ¤   {"at-echo",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   204,¤   "tcp"},
92e55b ¤   ¤   {"at-echo",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   204,¤   "udp"},
2588cb ¤   ¤   {"at-zis",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   206,¤   "tcp"},
8f0bcf ¤   ¤   {"at-zis",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   206,¤   "udp"},
ae76fc ¤   ¤   {"z3950",¤  ¤   ¤   sZ3950Aliases,¤ ¤   ¤   210,¤   "tcp"},
2df5f8 ¤   ¤   {"z3950",¤  ¤   ¤   sZ3950Aliases,¤ ¤   ¤   210,¤   "udp"},
925a46 ¤   ¤   {"ipx",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   213,¤   "tcp"},
28d942 ¤   ¤   {"ipx",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   213,¤   "udp"},
98c5fb ¤   ¤   {"imap3",¤  ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   220,¤   "tcp"},
de46ff ¤   ¤   {"imap3",¤  ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   220,¤   "udp"},
2b0bc2 ¤   ¤   {"ulistserv",¤  ¤   sNull,¤ ¤   ¤   ¤   ¤   372,¤   "tcp"},
c688c6 ¤   ¤   {"ulistserv",¤  ¤   sNull,¤ ¤   ¤   ¤   ¤   372,¤   "udp"},
abb0f6 ¤   ¤   {"https",¤  ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   443,¤   "tcp"},
ffb6f0 ¤   ¤   {"exec",¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   512,¤   "tcp"},
e2e7a4 ¤   ¤   {"biff",¤   ¤   ¤   sBiffAliases,¤  ¤   ¤   512,¤   "udp"},
1f7517 ¤   ¤   {"login",¤  ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   513,¤   "tcp"},
be4564 ¤   ¤   {"who",¤¤   ¤   ¤   sWhoAliases,¤   ¤   ¤   513,¤   "udp"},
ca78f1 ¤   ¤   {"shell",¤  ¤   ¤   sShellAliases,¤ ¤   ¤   514,¤   "tcp"},
23bd67 ¤   ¤   {"syslog",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   514,¤   "udp"},
1dd66d ¤   ¤   {"printer",¤¤   ¤   sPrinterAliases,¤   ¤   515,¤   "tcp"},
0b3f7c ¤   ¤   {"talk",¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   517,¤   "udp"},
dacaa2 ¤   ¤   {"ntalk",¤  ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   518,¤   "udp"},
b41199 ¤   ¤   {"route",¤  ¤   ¤   sRouteAliases,¤ ¤   ¤   520,¤   "udp"},
1d4338 ¤   ¤   {"timed",¤  ¤   ¤   sTimedAliases,¤ ¤   ¤   525,¤   "udp"},
17a3ff ¤   ¤   {"tempo",¤  ¤   ¤   sTempoAliases,¤ ¤   ¤   526,¤   "tcp"},
c6218a ¤   ¤   {"courier",¤¤   ¤   sCourierAliases,¤   ¤   530,¤   "tcp"},
40a655 ¤   ¤   {"conference",¤ ¤   sConferenceAliases,¤¤   531,¤   "tcp"},
75bdfc ¤   ¤   {"netnews",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   532,¤   "tcp"},
8d3cdd ¤   ¤   {"netwall",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   533,¤   "udp"},
53d70d ¤   ¤   {"uucp",¤   ¤   ¤   sUUCPAliases,¤  ¤   ¤   540,¤   "tcp"},
9ea083 ¤   ¤   {"remotefs",¤   ¤   sRemotefsAliases,¤  ¤   556,¤   "tcp"},
fa70b2 ¤   ¤   {"klogin",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   543,¤   "tcp"},
ee475a ¤   ¤   {"kshell",¤ ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   544,¤   "tcp"},
7cf193 ¤   ¤   {"kerberos-adm",¤   sNull,¤ ¤   ¤   ¤   ¤   749,¤   "tcp"},
dab3b1 ¤   ¤   {"webster",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   765,¤   "tcp"},
1830b5 ¤   ¤   {"webster",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   765,¤   "udp"},
88f23f ¤   ¤   {"ingreslock",¤ ¤   sNull,¤ ¤   ¤   ¤   ¤   1524,¤  "tcp"},
81713b ¤   ¤   {"ingreslock",¤ ¤   sNull,¤ ¤   ¤   ¤   ¤   1524,¤  "udp"},
052d22 ¤   ¤   {"prospero-np",¤¤   sNull,¤ ¤   ¤   ¤   ¤   1525,¤  "tcp"},
1dae26 ¤   ¤   {"prospero-np",¤¤   sNull,¤ ¤   ¤   ¤   ¤   1525,¤  "udp"},
a57091 ¤   ¤   {"rfe",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   5002,¤  "tcp"},
d4f395 ¤   ¤   {"rfe",¤¤   ¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   5002,¤  "udp"},
e86674 ¤   ¤   {"krbupdate",¤  ¤   sKrbupdateAliases,¤ ¤   760,¤   "tcp"},
3578f4 ¤   ¤   {"kpasswd",¤¤   ¤   sKpasswdAliases,¤   ¤   761,¤   "tcp"},
b18694 ¤   ¤   {"eklogin",¤¤   ¤   sNull,¤ ¤   ¤   ¤   ¤   2105,¤  "tcp"},
9f98be ¤   ¤   {"supfilesrv",¤ ¤   sNull,¤ ¤   ¤   ¤   ¤   871,¤   "tcp"},
20786a ¤   ¤   {"supfiledbg",¤ ¤   sNull,¤ ¤   ¤   ¤   ¤   1127,¤  "tcp"}};
8e071b ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤
e7ff55 class StSocketsThreadBusy {
b55ed4 public:
6d515e ¤   ¤   ¤   StSocketsThreadBusy(SThreadContext * inContext, CSocket * inSocket);
97d261 ¤   virtual ~StSocketsThreadBusy();
66af5a
3da2d3 protected:
--4c4c 0005de9597f401202b2 Page 4 of PGPSockets.cp
904df5 ¤   SThreadContext *¤   mContext;
ce82f7 };
3faf5a
417dc7 void¤   ¤   ¤   InitErrorMap();
eefee9 PGPError¤   ¤   MapPGPSocketsError(PGPError inErr);
fa370f PGPInt32¤   ¤   PGPSocketsTLSReceive(void *inData, void *outBuffer,
628c7b ¤   ¤   ¤   ¤   ¤   PGPInt32 inBufferSize);
765861 PGPInt32¤   ¤   PGPSocketsTLSSend(void *inData, const void *inBuffer,
798eac ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPInt32 inBufferLength);
17af5a
22af5a
fcaf5a
a7a939 StSocketsThreadBusy::StSocketsThreadBusy(
7040b9 ¤   SThreadContext *¤   inContext,
4dd7a9 ¤   CSocket *¤  ¤   ¤   inSocket)
cfece6 ¤   : mContext(inContext)
32bb36 {
dde530 ¤   if (mContext == nil) {
8c3a3a ¤   ¤   ThrowPGPError_(kPGPError_UnknownError);
329371 ¤   }
cac60d ¤   if ((mContext->isBusy) || ((inSocket != nil) && inSocket->IsInCallback())) {
200e23 ¤   ¤   ThrowPGPError_(kPGPError_SocketsInProgress);
ce0fa6 ·¤  } else {
564234 ·¤  ·¤  mContext->isBusy = true;
d37af9 ·¤  }
3befe6 }
9faf5a
8baf5a
99af5a
72473d StSocketsThreadBusy::~StSocketsThreadBusy()
2abb36 {
e8e530 ¤   if (mContext == nil) {
f33a3a ¤   ¤   ThrowPGPError_(kPGPError_UnknownError);
fd9371 ¤   }
e562a4 ¤   mContext->isBusy = false;
87efe6 }
0baf5a
ccaf5a
3fc744 ¤   PGPError
0fadce PGPSocketsCreateThreadStorage(
38a081 ¤   PGPSocketsThreadStorageRef *¤   outPreviousStorage)
cabb36 {
528e12 ¤   PGPError¤   err = kPGPError_NoErr;
be67c5 ¤
3b5168 ¤   try {
7be2d3 ¤   ¤   if (outPreviousStorage == NULL) {
70fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
290fe4 ¤   ¤   }
3a15df ¤   ¤   *outPreviousStorage = kInvalidPGPSocketsThreadStorageRef;
87ae30 ¤   ¤   ¤   ¤   ¤
996bf8 ¤   ¤   CSocket::CreateThreadStorage(
d47216 ¤   ¤   ¤   ¤   ¤   (SThreadContext **) outPreviousStorage);
439371 ¤   }
6b67c5 ¤
248170 ¤   catch (PGPError exception) {
adcdc7 ¤   ¤   err = MapPGPSocketsError(exception);
ff9371 ¤   }
a167c5 ¤
20e0a3 ¤   catch (...) {
5bb72f ¤   ¤   err = kPGPError_UnknownError;
589371 ¤   }
7eaf5a
255ea8 ¤   return err;
baefe6 }
48af5a
bfaf5a
c1af5a
9cc744 ¤   PGPError
679fdf PGPSocketsDisposeThreadStorage(
1ecc9a ¤   PGPSocketsThreadStorageRef¤ inPreviousStorage)
10bb36 {
5d8e12 ¤   PGPError¤   err = kPGPError_NoErr;
--b7b4 00008645061401202b2 Page 5 of PGPSockets.cp
2a67c5 ¤
9c5168 ¤   try {
55cbac ¤   ¤   CSocket::DisposeThreadStorage(
b6ae79 ¤   ¤   ¤   ¤   ¤   (SThreadContext *) inPreviousStorage);
359371 ¤   }
dc67c5 ¤
e98170 ¤   catch (PGPError exception) {
22cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
b29371 ¤   }
7367c5 ¤
06e0a3 ¤   catch (...) {
3fb72f ¤   ¤   err = kPGPError_UnknownError;
f79371 ¤   }
35af5a
c95ea8 ¤   return err;
7eefe6 }
2daf5a
e3af5a
fcc744 ¤   PGPError
a299ab PGPSocketsInit()
8dbb36 {
268e12 ¤   PGPError¤   err = kPGPError_NoErr;
5167c5 ¤
6a5168 ¤   try {
72845b ¤   ¤   if (sNumberOfInits == 0) {
c3a7cf ¤   ¤   ¤   InitErrorMap();
d50fe4 ¤   ¤   }
3f1b52 ¤   ¤
b835c2 ¤   ¤   sNumberOfInits++;
4d9371 ¤   }
3167c5 ¤
0be0a3 ¤   catch (...) {
d9b72f ¤   ¤   err = kPGPError_UnknownError;
079371 ¤   }
f8af5a
2b5ea8 ¤   return err;
a1efe6 }
17af5a
17af5a
99af5a
876d52 ¤   void
333cbb PGPSocketsCleanup()
d9bb36 {
e05168 ¤   try {
cca881 ¤   ¤   sNumberOfInits--;
35845b ¤   ¤   if (sNumberOfInits == 0) {
ca86be ¤   ¤   ¤   CSocket::CleanupSockets();
5e6058 ¤   ¤   ¤   sErrorMap.erase(sErrorMap.begin(), sErrorMap.end());
8a881d ¤   ¤   } else if (sNumberOfInits < 0) {
589ba7 ¤   ¤   ¤   sNumberOfInits = 0;
730fe4 ¤   ¤   }
0a9371 ¤   }
4eaf5a
2be0a3 ¤   catch (...) {
de9371 ¤   }
b5efe6 }
26af5a
d3af5a
d1af5a
cffbd6 ¤   PGPSocketRef
632b03 PGPOpenSocket(
9b41bc ¤   PGPInt32¤   inAddressFamily,
b78f2e ¤   PGPInt32¤   inSocketType,
1e9044 ¤   PGPInt32¤   inSocketProtocol)
2bbb36 {
60beb1 ¤   PGPSocketRef¤   ¤   theSocket = kInvalidPGPSocketRef;
b57d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
09386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
2a67c5 ¤
2d5168 ¤   try {
db7f75 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, nil);
081b52 ¤   ¤
--d72f 00009ce6db3401202b2 Page 6 of PGPSockets.cp
36c603 ¤   ¤   CSocket::Initialize();
cdaf5a
619e00 ¤   ¤   // Switch on the family. Currently we only support the AF_INET family
75678a ¤   ¤   switch (inAddressFamily) {
057f0c ¤   ¤   ¤   case kPGPAddressFamilyInternet:
45f776 ¤   ¤   ¤   {
c4d093 ¤   ¤   ¤   ¤   // Switch on the type
b7e53e ¤   ¤   ¤   ¤   switch (inSocketType) {
b66b26 ¤   ¤   ¤   ¤   ¤   case kPGPSocketTypeStream:
b7fd5f ¤   ¤   ¤   ¤   ¤   case kPGPSocketTypeDatagram:
ff4859 ¤   ¤   ¤   ¤   ¤   {
755732 ¤   ¤   ¤   ¤   ¤   ¤   // Switch on the protocol
a9c717 ¤   ¤   ¤   ¤   ¤   ¤   switch (inSocketProtocol) {
33f8a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kPGPTCPProtocol:
f17f92 ¤   ¤   ¤   ¤   ¤   ¤   ¤   case kPGPUDPProtocol:
7506b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
96fa24 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   theSocket =
ba3796 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPSocketRef) CSocket::CreateSocket(
1484fd ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inSocketType);
475268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
608c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
33531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
74531f ¤   ¤   ¤   ¤   ¤   ¤   ¤
91d8da ¤   ¤   ¤   ¤   ¤   ¤   ¤   default:
c006b8 ¤   ¤   ¤   ¤   ¤   ¤   ¤   {
4b3fb3 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ThrowPGPError_(
f1605f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPError_SocketsProtocolNotSupported);
345268 ¤   ¤   ¤   ¤   ¤   ¤   ¤   }
f78c94 ¤   ¤   ¤   ¤   ¤   ¤   ¤   break;
d9db3c ¤   ¤   ¤   ¤   ¤   ¤   }
ec1c89 ¤   ¤   ¤   ¤   ¤   }
f314c3 ¤   ¤   ¤   ¤   ¤   break;
0cae30 ¤   ¤   ¤   ¤   ¤
3dae30 ¤   ¤   ¤   ¤   ¤
b35ee4 ¤   ¤   ¤   ¤   ¤   default:
f84859 ¤   ¤   ¤   ¤   ¤   {
275a64 ¤   ¤   ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsProtocolNotSupported);
551c89 ¤   ¤   ¤   ¤   ¤   }
4a14c3 ¤   ¤   ¤   ¤   ¤   break;
032613 ¤   ¤   ¤   ¤   }
1fa3a6 ¤   ¤   ¤   }
90cdcb ¤   ¤   ¤   break;
8787c7 ¤   ¤   ¤
0187c7 ¤   ¤   ¤
eedb68 ¤   ¤   ¤   default:
91f776 ¤   ¤   ¤   {
18b886 ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsAddressFamilyNotSupported);
7ba3a6 ¤   ¤   ¤   }
25cdcb ¤   ¤   ¤   break;
450fe4 ¤   ¤   }
b69371 ¤   }
b367c5 ¤
df8170 ¤   catch (PGPError exception) {
b6cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
1d9371 ¤   }
1967c5 ¤
e3e0a3 ¤   catch (...) {
ddb72f ¤   ¤   err = kPGPError_UnknownError;
b99371 ¤   }
3467c5 ¤
95d6f4 ¤   if (theContext != nil) {
54d6ee ¤   ¤   theContext->lastError = err;
239371 ¤   }
a167c5 ¤
a84a85 ¤   return theSocket;
acefe6 }
48af5a
36af5a
52af5a
43af5a
6f1e7c ¤   PGPInt32
09eec7 PGPCloseSocket(
--0a98 000cf2d926f401202b2 Page 7 of PGPSockets.cp
5d4bee ¤   PGPSocketRef¤   inSocketRef)
3bbb36 {
83efa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
547d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
3c386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
f667c5 ¤
505168 ¤   try {
941acb ¤   ¤   // Make sure that the parameters are correct
22c0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
9de42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
6e0fe4 ¤   ¤   }
c51b52 ¤   ¤
c6a6b6 ¤   ¤   // Everything is good, so close the object
e19e2e ¤   ¤   ((CSocket *) inSocketRef)->Close();
7b4a29 ¤   ¤   result = 0;
879371 ¤   }
1367c5 ¤
f38170 ¤   catch (PGPError exception) {
b0cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
129371 ¤   }
c367c5 ¤
c7e0a3 ¤   catch (...) {
e7b72f ¤   ¤   err = kPGPError_UnknownError;
9e9371 ¤   }
2967c5 ¤
1cd6f4 ¤   if (theContext != nil) {
c6d6ee ¤   ¤   theContext->lastError = err;
8a9371 ¤   }
55af5a
455d73 ¤   return result;
e8efe6 }
f5af5a
a8af5a
3eaf5a
4d1e7c ¤   PGPInt32
fdc0c2 PGPBindSocket(
ac8b44 ¤   PGPSocketRef¤   ¤   ¤   ¤   inSocketRef,
467351 ¤   const PGPSocketAddress *¤   inAddress,
30e238 ¤   PGPInt32¤   ¤   ¤   ¤   ¤   inAddressLength)
51bb36 {
c0efa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
387d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
e2386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
aa67c5 ¤
745168 ¤   try {
a71acb ¤   ¤   // Make sure that the parameters are correct
74c0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
0ce42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
610fe4 ¤   ¤   }
8b81fc ¤   ¤   if (inAddress == NULL) {
bcfb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
fa0fe4 ¤   ¤   }
a167a0 ¤   ¤   if ((inAddressLength != sizeof(PGPSocketAddressInternet))
ba5cd8 ¤   ¤   || (inAddress->sa_family != kPGPAddressFamilyInternet)) {
f6a38f ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsAddressFamilyNotSupported);
a80fe4 ¤   ¤   }
1a1b52 ¤   ¤
0320dd ¤   ¤   // Everything is good, so bind the object
d38034 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, (CSocket *) inSocketRef);
9c1b52 ¤   ¤
6d0e4d ¤   ¤   ((CSocket *) inSocketRef)->
798adc ¤   ¤   ¤   ¤   Bind((const PGPSocketAddressInternet *) inAddress);
234a29 ¤   ¤   result = 0;
7b9371 ¤   }
c067c5 ¤
088170 ¤   catch (PGPError exception) {
81cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
379371 ¤   }
8667c5 ¤
5ee0a3 ¤   catch (...) {
7bb72f ¤   ¤   err = kPGPError_UnknownError;
cf9371 ¤   }
--8295 0007cb0c617401202b2 Page 8 of PGPSockets.cp
2a67c5 ¤
d1d6f4 ¤   if (theContext != nil) {
97d6ee ¤   ¤   theContext->lastError = err;
a79371 ¤   }
d467c5 ¤
605d73 ¤   return result;
afefe6 }
53af5a
23af5a
dbaf5a
661e7c ¤   PGPInt32
2df8cc PGPConnect(
778b44 ¤   PGPSocketRef¤   ¤   ¤   ¤   inSocketRef,
78e8b3 ¤   const PGPSocketAddress *¤   inServerAddress,
cee238 ¤   PGPInt32¤   ¤   ¤   ¤   ¤   inAddressLength)
e7bb36 {
a7efa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
e77d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
2a386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
fc67c5 ¤
da5168 ¤   try {
411acb ¤   ¤   // Make sure that the parameters are correct
36c0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
c1e42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
a90fe4 ¤   ¤   }
71a046 ¤   ¤   if (inServerAddress == NULL) {
cbfb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
c20fe4 ¤   ¤   }
6b67a0 ¤   ¤   if ((inAddressLength != sizeof(PGPSocketAddressInternet))
a06877 ¤   ¤   || (inServerAddress->sa_family != kPGPAddressFamilyInternet)) {
f5a38f ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsAddressFamilyNotSupported);
460fe4 ¤   ¤   }
4c1b52 ¤   ¤
4320dd ¤   ¤   // Everything is good, so bind the object
508034 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, (CSocket *) inSocketRef);
6c1b52 ¤   ¤
e50e4d ¤   ¤   ((CSocket *) inSocketRef)->
4c38da ¤   ¤   ¤   ¤   Connect((const PGPSocketAddressInternet *) inServerAddress);
5d4a29 ¤   ¤   result = 0;
ce9371 ¤   }
ef67c5 ¤
7c8170 ¤   catch (PGPError exception) {
ddcdc7 ¤   ¤   err = MapPGPSocketsError(exception);
e99371 ¤   }
6467c5 ¤
1fe0a3 ¤   catch (...) {
b1b72f ¤   ¤   err = kPGPError_UnknownError;
a49371 ¤   }
b267c5 ¤
efd6f4 ¤   if (theContext != nil) {
2cd6ee ¤   ¤   theContext->lastError = err;
559371 ¤   }
3f67c5 ¤
2a5d73 ¤   return result;
82efe6 }
7aaf5a
faaf5a
02af5a
6c1e7c ¤   PGPInt32
5d4a1f PGPSend(
7b3556 ¤   PGPSocketRef¤   inSocketRef,
0f4f2f ¤   const void *¤   inBuffer,
7ac775 ¤   PGPInt32¤   ¤   inBufferLength,
67e388 ¤   PGPInt32¤   ¤   inFlags)
40bb36 {
6aefa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
707d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
1e386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
ec67c5 ¤
215168 ¤   try {
961acb ¤   ¤   // Make sure that the parameters are correct
7cc0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
--5d5c 000c09be2cc401202b2 Page 9 of PGPSockets.cp
70e42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
1a0fe4 ¤   ¤   }
091b52 ¤   ¤
c7d68b ¤   ¤   if (inBuffer == NULL) {
f7fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
6a0fe4 ¤   ¤   }
951b52 ¤   ¤
486f94 ¤   ¤   if ((inBufferLength < 0) ||
726434 ¤   ¤   (inFlags != kPGPSendFlagNone)) {
83fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
140fe4 ¤   ¤   }
781b52 ¤   ¤
249d80 ¤   ¤   // Everything is good, so send through the object
e28034 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, (CSocket *) inSocketRef);
a51b52 ¤   ¤
574a19 ¤   ¤   if (((CSocket *) inSocketRef)->HasTLSSession()) {
bb847c ¤   ¤   ¤   err = PGPtlsSend(¤  ((CSocket *) inSocketRef)->GetTLSSession(),
7da65d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inBuffer,
b2283f ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inBufferLength);
bc6f41 ¤   ¤   ¤   if (err == kPGPError_NoErr) {
18ff63 ¤   ¤   ¤   ¤   result = inBufferLength;
50d13b ¤   ¤   ¤   } else if (err == kPGPError_TLSUnexpectedClose) {
d3e62e ¤   ¤   ¤   ¤   err = theContext->lastError;
61a3a6 ¤   ¤   ¤   }
3445a6 ¤   ¤   } else {
9e98f2 ¤   ¤   ¤   result = ((CSocket *) inSocketRef)->Send(¤  inBuffer,
b6d0be ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inBufferLength,
762c95 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inFlags);
880fe4 ¤   ¤   }
e49371 ¤   }
7e67c5 ¤
988170 ¤   catch (PGPError exception) {
49cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
519371 ¤   }
b667c5 ¤
ede0a3 ¤   catch (...) {
f2b72f ¤   ¤   err = kPGPError_UnknownError;
8a9371 ¤   }
ff67c5 ¤
afd6f4 ¤   if (theContext != nil) {
17d6ee ¤   ¤   theContext->lastError = err;
dc9371 ¤   }
ec67c5 ¤
ac5d73 ¤   return result;
e3efe6 }
43af5a
e2af5a
50af5a
0b1e7c ¤   PGPInt32
026c86 PGPWrite(
eb3556 ¤   PGPSocketRef¤   inSocketRef,
b04f2f ¤   const void *¤   inBuffer,
06b9cd ¤   PGPInt32¤   ¤   inBufferLength)
a9bb36 {
d754f9 ¤   return PGPSend(inSocketRef, inBuffer, inBufferLength, kPGPSendFlagNone);
9defe6 }
f4af5a
35af5a
6aaf5a
cb1e7c ¤   PGPInt32
ff482f PGPSendTo(
2282aa ¤   PGPSocketRef¤   ¤   inSocketRef,
d86914 ¤   const void *¤   ¤   inBuffer,
b339eb ¤   PGPInt32¤   ¤   ¤   inBufferLength,
873c1f ¤   PGPInt32¤   ¤   ¤   inFlags,
dc1abb ¤   PGPSocketAddress *¤ inAddress,
76f7fc ¤   PGPInt32¤   ¤   ¤   inAddressLength)
11bb36 {
86efa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
5d7d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
3a386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
c067c5 ¤
--b26f 0007dc58db7401202b2 Page 10 of PGPSockets.cp
055168 ¤   try {
ff1acb ¤   ¤   // Make sure that the parameters are correct
fcc0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
34e42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
700fe4 ¤   ¤   }
b81b52 ¤   ¤
20d68b ¤   ¤   if (inBuffer == NULL) {
c4fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
8f0fe4 ¤   ¤   }
f11b52 ¤   ¤
765c6c ¤   ¤   if ((inBufferLength < 0) || (inFlags != kPGPSendFlagNone)) {
1afb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
940fe4 ¤   ¤   }
9081fc ¤   ¤   if (inAddress == NULL) {
4afb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
d50fe4 ¤   ¤   }
4a67a0 ¤   ¤   if ((inAddressLength != sizeof(PGPSocketAddressInternet))
f05cd8 ¤   ¤   || (inAddress->sa_family != kPGPAddressFamilyInternet)) {
7ba38f ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsAddressFamilyNotSupported);
640fe4 ¤   ¤   }
971b52 ¤   ¤
f59d80 ¤   ¤   // Everything is good, so send through the object
798034 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, (CSocket *) inSocketRef);
d31b52 ¤   ¤
3bcbc4 ¤   ¤   result = ((CSocket *) inSocketRef)->SendTo(inBuffer, inBufferLength,
a509b1 ¤   ¤   ¤   ¤   ¤   (const PGPSocketAddressInternet *) inAddress);
bb9371 ¤   }
6567c5 ¤
a58170 ¤   catch (PGPError exception) {
94cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
aa9371 ¤   }
9a67c5 ¤
bbe0a3 ¤   catch (...) {
0cb72f ¤   ¤   err = kPGPError_UnknownError;
819371 ¤   }
8b67c5 ¤
ccd6f4 ¤   if (theContext != nil) {
bcd6ee ¤   ¤   theContext->lastError = err;
7f9371 ¤   }
78af5a
795d73 ¤   return result;
fbefe6 }
ccaf5a
a1af5a
44af5a
7b1e7c ¤   PGPInt32
176a93 PGPReceive(
2e3556 ¤   PGPSocketRef¤   inSocketRef,
9e398a ¤   void *¤ ¤   ¤   outBuffer,
8c1da1 ¤   PGPInt32¤   ¤   inBufferSize,
e9e388 ¤   PGPInt32¤   ¤   inFlags)
c3bb36 {
cbefa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
a37d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
08386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
8a67c5 ¤
a75168 ¤   try {
831acb ¤   ¤   // Make sure that the parameters are correct
55c0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
4be42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
9b0fe4 ¤   ¤   }
cb1b52 ¤   ¤
733552 ¤   ¤   if (outBuffer == NULL) {
97fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
a80fe4 ¤   ¤   }
e11b52 ¤   ¤
1393ef ¤   ¤   if ((inBufferSize < 0) || (inFlags != kPGPReceiveFlagNone)) {
bcfb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
920fe4 ¤   ¤   }
ab1b52 ¤   ¤
b19d80 ¤   ¤   // Everything is good, so send through the object
7d8034 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, (CSocket *) inSocketRef);
--c1e1 00059f81ab0401202b2 Page 11 of PGPSockets.cp
f11b52 ¤   ¤
ce4a19 ¤   ¤   if (((CSocket *) inSocketRef)->HasTLSSession()) {
c48b59 ¤   ¤   ¤   PGPSize¤bufferSize = inBufferSize;
8787c7 ¤   ¤   ¤
b0ac63 ¤   ¤   ¤   err = PGPtlsReceive(((CSocket *) inSocketRef)->GetTLSSession(),
26b13d ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   outBuffer,
1b2882 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   &bufferSize);
ca6f41 ¤   ¤   ¤   if (err == kPGPError_NoErr) {
e7cce0 ¤   ¤   ¤   ¤   result = bufferSize;
3ad13b ¤   ¤   ¤   } else if (err == kPGPError_TLSUnexpectedClose) {
dbe62e ¤   ¤   ¤   ¤   err = theContext->lastError;
56a3a6 ¤   ¤   ¤   }
ea45a6 ¤   ¤   } else {
92ecba ¤   ¤   ¤   result = ((CSocket *) inSocketRef)->
effbec ¤   ¤   ¤   ¤   ¤   ¤   ¤   Receive(outBuffer, inBufferSize, inFlags);
6a0fe4 ¤   ¤   }
f59371 ¤   }
7967c5 ¤
448170 ¤   catch (PGPError exception) {
9ccdc7 ¤   ¤   err = MapPGPSocketsError(exception);
519371 ¤   }
7667c5 ¤
42e0a3 ¤   catch (...) {
abb72f ¤   ¤   err = kPGPError_UnknownError;
f19371 ¤   }
e467c5 ¤
fdd6f4 ¤   if (theContext != nil) {
fed6ee ¤   ¤   theContext->lastError = err;
2a9371 ¤   }
0caf5a
025d73 ¤   return result;
c3efe6 }
4baf5a
f3af5a
14af5a
421e7c ¤   PGPInt32
6ffccd PGPRead(
823556 ¤   PGPSocketRef¤   inSocketRef,
2d398a ¤   void *¤ ¤   ¤   outBuffer,
926319 ¤   PGPInt32¤   ¤   inBufferSize)
61bb36 {
237342 ¤   return PGPReceive(¤ inSocketRef,
f8fe82 ¤   ¤   ¤   ¤   ¤   ¤   outBuffer,
565999 ¤   ¤   ¤   ¤   ¤   ¤   inBufferSize,
8e5b66 ¤   ¤   ¤   ¤   ¤   ¤   kPGPReceiveFlagNone);
98efe6 }
4faf5a
24af5a
ffaf5a
d61e7c ¤   PGPInt32
0fdf73 PGPReceiveFrom(
9882aa ¤   PGPSocketRef¤   ¤   inSocketRef,
7adc36 ¤   void *¤ ¤   ¤   ¤   outBuffer,
83a94a ¤   PGPInt32¤   ¤   ¤   inBufferSize,
ab3c1f ¤   PGPInt32¤   ¤   ¤   inFlags,
c3758e ¤   PGPSocketAddress *¤ outAddress,
851136 ¤   PGPInt32 *¤ ¤   ¤   ioAddressLength)
fdbb36 {
5cefa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
207d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
9d386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
f767c5 ¤
4b5168 ¤   try {
de1acb ¤   ¤   // Make sure that the parameters are correct
e9c0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
9de42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
190fe4 ¤   ¤   }
b51b52 ¤   ¤
233552 ¤   ¤   if (outBuffer == NULL) {
b5fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
830fe4 ¤   ¤   }
591b52 ¤   ¤
--f1c3 000f7703afd401202b2 Page 12 of PGPSockets.cp
3b93ef ¤   ¤   if ((inBufferSize < 0) || (inFlags != kPGPReceiveFlagNone)) {
a4fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
5a0fe4 ¤   ¤   }
8ccac0 ¤   ¤   if ((outAddress != NULL)
658f4a ¤   ¤   && (*ioAddressLength < sizeof(PGPSocketAddressInternet))) {
33fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
640fe4 ¤   ¤   }
561b52 ¤   ¤
789d80 ¤   ¤   // Everything is good, so send through the object
1c8034 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, (CSocket *) inSocketRef);
d41b52 ¤   ¤
c3be27 ¤   ¤   result = ((CSocket *) inSocketRef)->
941a2d ¤   ¤   ¤   ¤   ¤   ¤   ReceiveFrom(outBuffer,
4d138c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inBufferSize,
423892 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (PGPSocketAddressInternet *) outAddress,
091d8c ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (SInt32 *) ioAddressLength);
e39371 ¤   }
1667c5 ¤
4b8170 ¤   catch (PGPError exception) {
19cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
d19371 ¤   }
0d67c5 ¤
33e0a3 ¤   catch (...) {
39b72f ¤   ¤   err = kPGPError_UnknownError;
029371 ¤   }
8067c5 ¤
fad6f4 ¤   if (theContext != nil) {
28d6ee ¤   ¤   theContext->lastError = err;
7a9371 ¤   }
46af5a
cf5d73 ¤   return result;
76efe6 }
40af5a
e3af5a
cbaf5a
3b1e7c ¤   PGPInt32
79dac5 PGPListen(
373556 ¤   PGPSocketRef¤   inSocketRef,
95bb58 ¤   PGPInt32¤   ¤   inMaxBacklog)
e4bb36 {
d8efa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
fd7d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
b1386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
3967c5 ¤
ac5168 ¤   try {
bd1acb ¤   ¤   // Make sure that the parameters are correct
9bc0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
cce42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
890fe4 ¤   ¤   }
1f1b52 ¤   ¤
92aa56 ¤   ¤   if (inMaxBacklog < 0) {
18fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
c00fe4 ¤   ¤   }
fd1b52 ¤   ¤
119d80 ¤   ¤   // Everything is good, so send through the object
e78034 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, (CSocket *) inSocketRef);
a61b52 ¤   ¤
ea17f4 ¤   ¤   ((CSocket *) inSocketRef)->Listen(inMaxBacklog);
d44a29 ¤   ¤   result = 0;
529371 ¤   }
eb67c5 ¤
c88170 ¤   catch (PGPError exception) {
54cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
269371 ¤   }
8367c5 ¤
d8e0a3 ¤   catch (...) {
6ab72f ¤   ¤   err = kPGPError_UnknownError;
329371 ¤   }
a367c5 ¤
63d6f4 ¤   if (theContext != nil) {
10d6ee ¤   ¤   theContext->lastError = err;
f79371 ¤   }
--edd9 000857bf2b5401202b2 Page 13 of PGPSockets.cp
e0af5a
985d73 ¤   return result;
96efe6 }
d0af5a
9baf5a
2bfbd6 ¤   PGPSocketRef
8f2fe2 PGPAccept(
7482aa ¤   PGPSocketRef¤   ¤   inSocketRef,
53758e ¤   PGPSocketAddress *¤ outAddress,
931136 ¤   PGPInt32 *¤ ¤   ¤   ioAddressLength)
82bb36 {
e40e40 ¤   PGPSocketRef¤   ¤   result = kInvalidPGPSocketRef;
f07d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
84386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
7067c5 ¤
7c5168 ¤   try {
8e1acb ¤   ¤   // Make sure that the parameters are correct
0dc0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
38e42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
f40fe4 ¤   ¤   }
6aca53 ¤   ¤   if (outAddress == NULL) {
a0fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
ea0fe4 ¤   ¤   }
c41e04 ¤   ¤   if (*ioAddressLength < sizeof(PGPSocketAddressInternet)) {
5fa38f ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsAddressFamilyNotSupported);
050fe4 ¤   ¤   }
c91b52 ¤   ¤
116e83 ¤   ¤   // Everything is good, so accept a connection
668034 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, (CSocket *) inSocketRef);
ec1b52 ¤   ¤
ac5dd6 ¤   ¤   result = (PGPSocketRef) ((CSocket *) inSocketRef)->
e9c404 ¤   ¤   ¤   ¤   ¤   ¤   Accept(¤(PGPSocketAddressInternet *) outAddress,
ddc7a5 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   (SInt32 *) ioAddressLength);
8a9371 ¤   }
3867c5 ¤
488170 ¤   catch (PGPError exception) {
49cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
b79371 ¤   }
9c67c5 ¤
20e0a3 ¤   catch (...) {
b1b72f ¤   ¤   err = kPGPError_UnknownError;
969371 ¤   }
7a67c5 ¤
43d6f4 ¤   if (theContext != nil) {
09d6ee ¤   ¤   theContext->lastError = err;
ff9371 ¤   }
a3af5a
925d73 ¤   return result;
49efe6 }
eaaf5a
73af5a
d4af5a
471e7c ¤   PGPInt32
abfcdd PGPSelect(
abc213 ¤   PGPInt32¤   ¤   ¤   ¤   ¤   inNumSetCount,
73a8a5 ¤   PGPSocketSet *¤ ¤   ¤   ¤   ioReadSet,
b29256 ¤   PGPSocketSet *¤ ¤   ¤   ¤   ioWriteSet,
b27974 ¤   PGPSocketSet *¤ ¤   ¤   ¤   ioErrorSet,
ea91d1 ¤   const PGPSocketsTimeValue *¤inTimeout)
d0bb36 {
34efa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
427d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
4e386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
c467c5 ¤
4b1732 ¤   (void) inNumSetCount;
e867c5 ¤
a75168 ¤   try {
e67f75 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, nil);
c81b52 ¤   ¤
393b86 ¤   ¤   SInt16¤ i;
a267c5 ¤
857960 ¤   ¤   // Make sure arguments are valid
--4b37 000ffb74d82401202b2 Page 14 of PGPSockets.cp
dd0212 ¤   ¤   if ((ioReadSet == NULL) && (ioWriteSet == NULL)
db6b7b ¤   ¤   && (ioErrorSet == NULL)) {
19fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
370fe4 ¤   ¤   }
87aef5 ¤   ¤   if (ioReadSet != NULL) {
970fe5 ¤   ¤   ¤   if (ioReadSet->fd_count > PGPSOCKETSET_SETSIZE) {
4aa82d ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
800b49 ¤   ¤   ¤   }¤  ¤   ¤
2e01a6 ¤   ¤   ¤   for (i = 0; i < ioReadSet->fd_count; i++) {
881ab4 ¤   ¤   ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) ioReadSet->
7c155a ¤   ¤   ¤   ¤   fd_array[i])) {
7e18b2 ¤   ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
372613 ¤   ¤   ¤   ¤   }
cca3a6 ¤   ¤   ¤   }
190fe4 ¤   ¤   }
73161b ¤   ¤   if (ioWriteSet != NULL) {
a8c516 ¤   ¤   ¤   if (ioWriteSet->fd_count > PGPSOCKETSET_SETSIZE) {
aba82d ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
e8a3a6 ¤   ¤   ¤   }
656683 ¤   ¤   ¤   for (i = 0; i < ioWriteSet->fd_count; i++) {
5c1cd1 ¤   ¤   ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) ioWriteSet->
1f155a ¤   ¤   ¤   ¤   fd_array[i])) {
2418b2 ¤   ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
082613 ¤   ¤   ¤   ¤   }
fda3a6 ¤   ¤   ¤   }
580fe4 ¤   ¤   }
149ea0 ¤   ¤   if (ioErrorSet != NULL) {
ec05df ¤   ¤   ¤   if (ioErrorSet->fd_count > PGPSOCKETSET_SETSIZE) {
6ea82d ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
a4a3a6 ¤   ¤   ¤   }
7164ac ¤   ¤   ¤   for (i = 0; i < ioErrorSet->fd_count; i++) {
e11e2a ¤   ¤   ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) ioErrorSet->
ca155a ¤   ¤   ¤   ¤   fd_array[i])) {
da18b2 ¤   ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
6c2613 ¤   ¤   ¤   ¤   }
c5a3a6 ¤   ¤   ¤   }
1f0fe4 ¤   ¤   }
be08b3 ¤   ¤   if (inTimeout != NULL) {
ccacfa ¤   ¤   ¤   if ((inTimeout->tv_sec < 0) || (inTimeout->tv_usec < 0)) {
55a82d ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
b8a3a6 ¤   ¤   ¤   }
ef0fe4 ¤   ¤   }
181b52 ¤   ¤
58a42c ¤   ¤   result = CSocket::Select(¤  ioReadSet,
ba4bb2 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ioWriteSet,
91a090 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ioErrorSet,
fa09c9 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inTimeout);
9b9371 ¤   }
c867c5 ¤
228170 ¤   catch (PGPError exception) {
06cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
f19371 ¤   }
3167c5 ¤
06e0a3 ¤   catch (...) {
3eb72f ¤   ¤   err = kPGPError_UnknownError;
b89371 ¤   }
b567c5 ¤
3fd6f4 ¤   if (theContext != nil) {
7fd6ee ¤   ¤   theContext->lastError = err;
939371 ¤   }
54af5a
ff5d73 ¤   return result;
c9efe6 }
79af5a
50af5a
69af5a
bf1e7c ¤   PGPInt32
49799b __PGPSocketsIsSet(
a13556 ¤   PGPSocketRef¤   inSocketRef,
24f48c ¤   PGPSocketSet *¤ inSocketSet)
fbbb36 {
ffb889 ¤   PGPInt32 ¤  result = 0;
--acc2 0007924a771401202b2 Page 15 of PGPSockets.cp
aa74ba ¤   PGPUInt16 i;
e867c5 ¤
a076ec ¤   for (i = 0; i < inSocketSet->fd_count; i++) {
34fc58 ¤   ¤   if (inSocketSet->fd_array[i] == inSocketRef) {
ed6a01 ¤   ¤   ¤   result = 1;
9bcdcb ¤   ¤   ¤   break;
fc0fe4 ¤   ¤   }
039371 ¤   }
ed67c5 ¤
c95d73 ¤   return result;
6fefe6 }
47af5a
41af5a
0baf5a
81e2eb ¤   PGPHostEntry *
bbed0c PGPGetHostByName(
e3b3d6 ¤   const char * inName)
52bb36 {
f04c16 ¤   PGPHostEntry *¤ ¤   result = NULL;
e27d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
eb386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
f267c5 ¤
f35168 ¤   try {
437f75 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, nil);
701b52 ¤   ¤
e5c603 ¤   ¤   CSocket::Initialize();
39af5a
471acb ¤   ¤   // Make sure that the parameters are correct
fb9eb6 ¤   ¤   if (inName == NULL) {
eafb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
640fe4 ¤   ¤   }
e8af5a
3ad68a ¤   ¤   result = CSocket::sInternetUtilities->GetHostByName(inName);
e89371 ¤   }
4867c5 ¤
f48170 ¤   catch (PGPError exception) {
97cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
a99371 ¤   }
e067c5 ¤
c1e0a3 ¤   catch (...) {
aeb72f ¤   ¤   err = kPGPError_UnknownError;
c59371 ¤   }
fa67c5 ¤
85d6f4 ¤   if (theContext != nil) {
add6ee ¤   ¤   theContext->lastError = err;
f99371 ¤   }
25af5a
d05d73 ¤   return result;
ccefe6 }
a7af5a
9baf5a
f2af5a
f6e2eb ¤   PGPHostEntry *
cdd136 PGPGetHostByAddress(
6e7ba7 ¤   const char *¤   inAddress,
4e81f2 ¤   PGPInt32¤   ¤   inLength,
1829e0 ¤   PGPInt32¤   ¤   inType)
7cbb36 {
744c16 ¤   PGPHostEntry *¤ ¤   result = NULL;
5c7d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
c8386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
1f67c5 ¤
fa5168 ¤   try {
a07f75 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, nil);
c81b52 ¤   ¤
afc603 ¤   ¤   CSocket::Initialize();
fdaf5a
dd1acb ¤   ¤   // Make sure that the parameters are correct
8c81fc ¤   ¤   if (inAddress == NULL) {
e4fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
610fe4 ¤   ¤   }
7947da ¤   ¤   if (inLength != sizeof(PGPInternetAddress)) {
--d344 0000894c781401202b2 Page 16 of PGPSockets.cp
ddfb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
090fe4 ¤   ¤   }
a69ee0 ¤   ¤   if (inType != kPGPProtocolFamilyInternet) {
18fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
0a0fe4 ¤   ¤   }
deaf5a
421b0b ¤   ¤   result = CSocket::sInternetUtilities->GetHostByAddress(
8efe39 ¤   ¤   ¤   ¤   ¤   ¤   ¤   *(PGPInternetAddress *) inAddress);
209371 ¤   }
ca67c5 ¤
f98170 ¤   catch (PGPError exception) {
3ccdc7 ¤   ¤   err = MapPGPSocketsError(exception);
8c9371 ¤   }
f567c5 ¤
26e0a3 ¤   catch (...) {
76b72f ¤   ¤   err = kPGPError_UnknownError;
939371 ¤   }
0167c5 ¤
11d6f4 ¤   if (theContext != nil) {
9bd6ee ¤   ¤   theContext->lastError = err;
7f9371 ¤   }
ccaf5a
055d73 ¤   return result;
1fefe6 }
15af5a
41af5a
afaf5a
511e7c ¤   PGPInt32
e2703c PGPGetHostName(
9d3f28 ¤   char *¤ ¤   outName,
d5fb28 ¤   PGPInt32¤   inNameLength)
b4bb36 {
d0efa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
c27d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
00386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
9067c5 ¤
955168 ¤   try {
507f75 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, nil);
491b52 ¤   ¤
bbc603 ¤   ¤   CSocket::Initialize();
41af5a
dd1acb ¤   ¤   // Make sure that the parameters are correct
d3b546 ¤   ¤   if (outName == NULL) {
64fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
a60fe4 ¤   ¤   }
fc5baf ¤   ¤   if (inNameLength < 1) {
98fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
b40fe4 ¤   ¤   }
04af5a
d9c5b9 ¤   ¤   CSocket::sInternetUtilities->GetHostName(outName, inNameLength);
864a29 ¤   ¤   result = 0;
f79371 ¤   }
3e67c5 ¤
488170 ¤   catch (PGPError exception) {
91cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
ad9371 ¤   }
5b67c5 ¤
ace0a3 ¤   catch (...) {
b8b72f ¤   ¤   err = kPGPError_UnknownError;
849371 ¤   }
7767c5 ¤
b4d6f4 ¤   if (theContext != nil) {
b4d6ee ¤   ¤   theContext->lastError = err;
f39371 ¤   }
daaf5a
c85d73 ¤   return result;
f8efe6 }
4eaf5a
fbaf5a
32af5a
fc6fc1 ¤   PGPProtocolEntry *
08956b PGPGetProtocolByName(
--1f21 000eeea0d84401202b2 Page 17 of PGPSockets.cp
96c386 ¤   const char *¤   inName)
aebb36 {
297431 ¤   PGPProtocolEntry *¤ result = NULL;
d37d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
8c386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
5667c5 ¤
b45168 ¤   try {
296645 ¤   ¤   if (theContext == nil) {
08ac7b ¤   ¤   ¤   ThrowPGPError_(kPGPError_UnknownError);
ab0fe4 ¤   ¤   }
9a1b52 ¤   ¤
a11acb ¤   ¤   // Make sure that the parameters are correct
949eb6 ¤   ¤   if (inName == NULL) {
65fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
810fe4 ¤   ¤   }
4e1b52 ¤   ¤
51b93a ¤   ¤   for (UInt16 x = 0;
84b788 ¤   ¤   ··x < (sizeof(sProtocolArray)/sizeof(PGPProtocolEntry)); x++) {
3ba769 ¤   ¤   ··¤ if (strcmp(inName, sProtocolArray[x].p_name) == 0) {
95bf9a ¤   ¤   ··¤ ¤   theContext->protocolEntry = sProtocolArray[x];
63c4a3 ¤   ¤   ··¤ ¤   result = &theContext->protocolEntry;
647c20 ¤   ¤   ··¤ ¤   break;
d1bc20 ¤   ¤   ··¤ }
bc0fe4 ¤   ¤   }
299371 ¤   }
3f67c5 ¤
d78170 ¤   catch (PGPError exception) {
53cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
959371 ¤   }
8a67c5 ¤
0fe0a3 ¤   catch (...) {
f2b72f ¤   ¤   err = kPGPError_UnknownError;
309371 ¤   }
2c67c5 ¤
a9d6f4 ¤   if (theContext != nil) {
20d6ee ¤   ¤   theContext->lastError = err;
ee9371 ¤   }
1daf5a
295d73 ¤   return result;
1fefe6 }
8aaf5a
a2af5a
71af5a
036fc1 ¤   PGPProtocolEntry *
7b3131 PGPGetProtocolByNumber(
114b5a ¤   PGPInt32¤   inNumber)
1abb36 {
ab7431 ¤   PGPProtocolEntry *¤ result = NULL;
967d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
24386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
a167c5 ¤
4b5168 ¤   try {
836645 ¤   ¤   if (theContext == nil) {
56ac7b ¤   ¤   ¤   ThrowPGPError_(kPGPError_UnknownError);
570fe4 ¤   ¤   }
af1b52 ¤   ¤
5cb93a ¤   ¤   for (UInt16 x = 0;
71b788 ¤   ¤   ··x < (sizeof(sProtocolArray)/sizeof(PGPProtocolEntry)); x++) {
5e84aa ¤   ¤   ··¤ if (inNumber == sProtocolArray[x].p_proto) {
adbf9a ¤   ¤   ··¤ ¤   theContext->protocolEntry = sProtocolArray[x];
e3c4a3 ¤   ¤   ··¤ ¤   result = &theContext->protocolEntry;
f47c20 ¤   ¤   ··¤ ¤   break;
a1bc20 ¤   ¤   ··¤ }
f30fe4 ¤   ¤   }
609371 ¤   }
6667c5 ¤
9d8170 ¤   catch (PGPError exception) {
c3cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
c09371 ¤   }
4667c5 ¤
93e0a3 ¤   catch (...) {
eeb72f ¤   ¤   err = kPGPError_UnknownError;
--56de 00059d4c1bb401202b2 Page 18 of PGPSockets.cp
a19371 ¤   }
9967c5 ¤
2bd6f4 ¤   if (theContext != nil) {
9dd6ee ¤   ¤   theContext->lastError = err;
d69371 ¤   }
88af5a
ea5d73 ¤   return result;
22efe6 }
abaf5a
e5af5a
9baf5a
3af29b ¤   PGPServiceEntry *
10b159 PGPGetServiceByName(
e9bd3e ¤   const char *¤   inName,
15e23d ¤   const char *¤   inProtocol)
1bbb36 {
f7bfaa ¤   PGPServiceEntry *¤  result = NULL;
b47d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
8d386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
6067c5 ¤
655168 ¤   try {
2f6645 ¤   ¤   if (theContext == nil) {
64ac7b ¤   ¤   ¤   ThrowPGPError_(kPGPError_UnknownError);
9f0fe4 ¤   ¤   }
0d1b52 ¤   ¤
471acb ¤   ¤   // Make sure that the parameters are correct
e49eb6 ¤   ¤   if (inName == NULL) {
7bfb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
d10fe4 ¤   ¤   }
748d06 ¤   ¤   if (PGPGetProtocolByName(inProtocol) == NULL) {
effb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
ac0fe4 ¤   ¤   }
8b1b52 ¤   ¤
06ad19 ¤   ¤   // Walk the list looking for the service
0eb93a ¤   ¤   for (UInt16 x = 0;
8777ed ¤   ¤   x < (sizeof(sServiceArray)/sizeof(PGPServiceEntry)); x++) {
cc3776 ¤   ¤   ¤   if (strcmp(inProtocol, sServiceArray[x].s_proto) == 0) {
af688f ¤   ¤   ¤   ··¤ if (strcmp(inName, sServiceArray[x].s_name) == 0) {
e5d4bc ¤   ¤   ¤   ··¤ ¤   theContext->serviceEntry = sServiceArray[x];
df942a ¤   ¤   ¤   ··¤ ¤   result = &theContext->serviceEntry;
319ec1 ¤   ¤   ¤   ··¤ ¤   break;
d81415 ¤   ¤   ¤   ··¤ } else {
cbd044 ¤   ¤   ¤   ··¤ ¤   // Walk aliases
c6dd51 ¤   ¤   ¤   ··¤ ¤   for (char ** alias = sServiceArray[x].s_aliases;
67b385 ¤   ¤   ¤   ··¤ ¤   *alias != NULL; alias++) {
6d1e56 ¤   ¤   ¤   ··¤ ¤   ··¤ if (strcmp(inName, *alias) == 0) {
f7598f ¤   ¤   ¤   ¤   ¤   ··¤ ¤   theContext->serviceEntry = sServiceArray[x];
8adf61 ¤   ¤   ¤   ¤   ¤   ··¤ ¤   result = &theContext->serviceEntry;
350696 ¤   ¤   ¤   ¤   ¤   ··¤ ¤   break;
a1c4ba ¤   ¤   ¤   ¤   ¤   ··¤ }
f11c89 ¤   ¤   ¤   ¤   ¤   }
252613 ¤   ¤   ¤   ¤   }
86a3a6 ¤   ¤   ¤   }
ea0fe4 ¤   ¤   }
619371 ¤   }
2567c5 ¤
658170 ¤   catch (PGPError exception) {
3ecdc7 ¤   ¤   err = MapPGPSocketsError(exception);
349371 ¤   }
8267c5 ¤
1be0a3 ¤   catch (...) {
96b72f ¤   ¤   err = kPGPError_UnknownError;
f89371 ¤   }
5267c5 ¤
7fd6f4 ¤   if (theContext != nil) {
d3d6ee ¤   ¤   theContext->lastError = err;
549371 ¤   }
c5af5a
265d73 ¤   return result;
21efe6 }
67af5a
59af5a
--e424 00070eaa9d6401202b2 Page 19 of PGPSockets.cp
e0af5a
75f29b ¤   PGPServiceEntry *
4805e2 PGPGetServiceByPort(
e42e13 ¤   PGPInt32¤   ¤   inPort,
b9e23d ¤   const char *¤   inProtocol)
bcbb36 {
e4bfaa ¤   PGPServiceEntry *¤  result = NULL;
267d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
54386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
d067c5 ¤
6c5168 ¤   try {
6e6645 ¤   ¤   if (theContext == nil) {
0bac7b ¤   ¤   ¤   ThrowPGPError_(kPGPError_UnknownError);
0a0fe4 ¤   ¤   }
5b1b52 ¤   ¤
801acb ¤   ¤   // Make sure that the parameters are correct
3d8d06 ¤   ¤   if (PGPGetProtocolByName(inProtocol) == NULL) {
94fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
330fe4 ¤   ¤   }
941b52 ¤   ¤
56ad19 ¤   ¤   // Walk the list looking for the service
98b93a ¤   ¤   for (UInt16 x = 0;
5677ed ¤   ¤   x < (sizeof(sServiceArray)/sizeof(PGPServiceEntry)); x++) {
80a10a ¤   ¤   ¤   if ((strcmp(inProtocol, sServiceArray[x].s_proto) == 0)
41881c ¤   ¤   ¤   && (sServiceArray[x].s_port == inPort)) {
800e95 ¤   ¤   ··¤ ¤   theContext->serviceEntry = sServiceArray[x];
35c186 ¤   ¤   ··¤ ¤   result = &theContext->serviceEntry;
977c20 ¤   ¤   ··¤ ¤   break;
6ca3a6 ¤   ¤   ¤   }
c50fe4 ¤   ¤   }
f39371 ¤   }
1267c5 ¤
4f8170 ¤   catch (PGPError exception) {
08cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
c69371 ¤   }
bc67c5 ¤
61e0a3 ¤   catch (...) {
8eb72f ¤   ¤   err = kPGPError_UnknownError;
eb9371 ¤   }
c467c5 ¤
f9d6f4 ¤   if (theContext != nil) {
06d6ee ¤   ¤   theContext->lastError = err;
fa9371 ¤   }
a6af5a
e05d73 ¤   return result;
c3efe6 }
0daf5a
c6af5a
951e7c ¤   PGPInt32
71ca89 PGPGetSocketName(
ba82aa ¤   PGPSocketRef¤   ¤   inSocketRef,
72c52c ¤   PGPSocketAddress *¤ outName,
a5b6bf ¤   PGPInt32 *¤ ¤   ¤   ioNameLength)
3bbb36 {
4eefa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
a37d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
2f386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
1567c5 ¤
e15168 ¤   try {
e71acb ¤   ¤   // Make sure that the parameters are correct
7cc0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
b6e42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
940fe4 ¤   ¤   }
041b52 ¤   ¤
4fb546 ¤   ¤   if (outName == NULL) {
44fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
dd0fe4 ¤   ¤   }
d1dfb6 ¤   ¤   if (*ioNameLength != sizeof(PGPSocketAddressInternet)) {
cbfb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
f60fe4 ¤   ¤   }
b31b52 ¤   ¤
7057b7 ¤   ¤   // Everything is good, so get the address
--3ad0 000dc6274a3401202b2 Page 20 of PGPSockets.cp
768034 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, (CSocket *) inSocketRef);
611b52 ¤   ¤
f64ad5 ¤   ¤   ((CSocket *) inSocketRef)->GetSocketName(
443dbe ¤   ¤   ¤   ¤   ¤   ¤   (PGPSocketAddressInternet *) outName);
dc4a29 ¤   ¤   result = 0;
799371 ¤   }
b467c5 ¤
bf8170 ¤   catch (PGPError exception) {
4dcdc7 ¤   ¤   err = MapPGPSocketsError(exception);
b79371 ¤   }
d267c5 ¤
87e0a3 ¤   catch (...) {
c0b72f ¤   ¤   err = kPGPError_UnknownError;
169371 ¤   }
9a67c5 ¤
b3d6f4 ¤   if (theContext != nil) {
e2d6ee ¤   ¤   theContext->lastError = err;
1b9371 ¤   }
37af5a
db5d73 ¤   return result;
78efe6 }
6aaf5a
7aaf5a
e1af5a
d71e7c ¤   PGPInt32
ef3173 PGPGetPeerName(
2682aa ¤   PGPSocketRef¤   ¤   inSocketRef,
4bc52c ¤   PGPSocketAddress *¤ outName,
b8b6bf ¤   PGPInt32 *¤ ¤   ¤   ioNameLength)
a3bb36 {
7befa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
d47d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
87386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
9e67c5 ¤
265168 ¤   try {
231acb ¤   ¤   // Make sure that the parameters are correct
47c0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
60e42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
a20fe4 ¤   ¤   }
691b52 ¤   ¤
54b546 ¤   ¤   if (outName == NULL) {
45fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
480fe4 ¤   ¤   }
20dfb6 ¤   ¤   if (*ioNameLength != sizeof(PGPSocketAddressInternet)) {
0efb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
110fe4 ¤   ¤   }
e61b52 ¤   ¤
e557b7 ¤   ¤   // Everything is good, so get the address
ca8034 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, (CSocket *) inSocketRef);
701b52 ¤   ¤
c34a74 ¤   ¤   ((CSocket *) inSocketRef)->GetPeerName(
dd3dbe ¤   ¤   ¤   ¤   ¤   ¤   (PGPSocketAddressInternet *) outName);
144a29 ¤   ¤   result = 0;
c99371 ¤   }
8d67c5 ¤
d78170 ¤   catch (PGPError exception) {
88cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
2e9371 ¤   }
f967c5 ¤
92e0a3 ¤   catch (...) {
89b72f ¤   ¤   err = kPGPError_UnknownError;
bb9371 ¤   }
6e67c5 ¤
26d6f4 ¤   if (theContext != nil) {
ead6ee ¤   ¤   theContext->lastError = err;
8d9371 ¤   }
90af5a
335d73 ¤   return result;
d5efe6 }
72af5a
b4af5a
dcaf5a
--0d84 000d7af6bee401202b2 Page 21 of PGPSockets.cp
9c108d ¤   PGPUInt32
1f3043 PGPDottedToInternetAddress(
b8051f ¤   const char *¤   inAddress)
85bb36 {
c60e37 ¤   PGPUInt32¤  ¤   ¤   result = kPGPSockets_Error;
c67d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
15386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
7f67c5 ¤
335168 ¤   try {
691acb ¤   ¤   // Make sure that the parameters are correct
6581fc ¤   ¤   if (inAddress == NULL) {
7cfb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
820fe4 ¤   ¤   }
281b52 ¤   ¤
25f7af ¤   ¤   size_t¤ inAddressLength = strlen(inAddress);
851b52 ¤   ¤
57a61f ¤   ¤   if ((inAddressLength == 0) || (inAddressLength > 16)) {
67fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
520fe4 ¤   ¤   }
351b52 ¤   ¤
9ce3de ¤   ¤   for (const char * c = inAddress; *c != '\0'; c++) {
7a2a30 ¤   ¤   ¤   if ((*c != '.') && (! isdigit(*c))) {
baa82d ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
0aa3a6 ¤   ¤   ¤   }
0e8469 ¤   ¤   }·
021b52 ¤   ¤
3bceea ¤   ¤   // Translate
aeb729 ¤   ¤   PGPInternetAddress¤ theAddress;
a5e5a8 ¤   ¤   UInt32¤ ¤   ¤   ¤   temp;
e8d663 ¤   ¤   char¤   ¤   ¤   ¤   theString[20];
b27763 ¤   ¤   char *¤ ¤   ¤   ¤   first;
aa7f89 ¤   ¤   char *¤ ¤   ¤   ¤   second;
689bb8 ¤   ¤   char *¤ ¤   ¤   ¤   third;
8a7215 ¤   ¤   char *¤ ¤   ¤   ¤   fourth;
2a1b52 ¤   ¤
500540 ¤   ¤   strcpy(theString, inAddress);
ab7708 ¤   ¤   first = strtok(theString, ".");
767890 ¤   ¤   if (first == NULL) {
27fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
050fe4 ¤   ¤   }
a3bf17 ¤   ¤   if ((second = strtok(NULL, ".")) == NULL) {
b3dc7c ¤   ¤   ¤   theAddress.s_addr = strtoul(first, NULL, 10);
02c195 ¤   ¤   } else if ((third = strtok(NULL, ".")) == NULL) {
4d686a ¤   ¤   ¤   theAddress.s_addr = 0;
b3dd38 ¤   ¤   ¤   temp = strtoul(first, NULL, 10);
4738bd ¤   ¤   ¤   if (temp > 255) {
9c6609 ¤   ¤   ¤   ¤   ThrowPGPError_ (kPGPError_BadParams);
49a3a6 ¤   ¤   ¤   }
10a913 ¤   ¤   ¤   theAddress.S_un.S_un_b.s_b1 = temp;
9fce18 ¤   ¤   ¤   temp = strtoul(second, NULL, 10);
68dfae ¤   ¤   ¤   if (temp > 0x00FFFFFF) {
f26609 ¤   ¤   ¤   ¤   ThrowPGPError_ (kPGPError_BadParams);
69a3a6 ¤   ¤   ¤   }
91e2c3 ¤   ¤   ¤   theAddress.s_addr |= temp;
7e70ed ¤   ¤   } else if ((fourth = strtok(NULL, ".")) == NULL) {
19dd38 ¤   ¤   ¤   temp = strtoul(first, NULL, 10);
d538bd ¤   ¤   ¤   if (temp > 255) {
9c6609 ¤   ¤   ¤   ¤   ThrowPGPError_ (kPGPError_BadParams);
7ba3a6 ¤   ¤   ¤   }
4fa913 ¤   ¤   ¤   theAddress.S_un.S_un_b.s_b1 = temp;
22ce18 ¤   ¤   ¤   temp = strtoul(second, NULL, 10);
c238bd ¤   ¤   ¤   if (temp > 255) {
b96609 ¤   ¤   ¤   ¤   ThrowPGPError_ (kPGPError_BadParams);
5ca3a6 ¤   ¤   ¤   }
ebdd7a ¤   ¤   ¤   theAddress.S_un.S_un_b.s_b2 = temp;
d837f7 ¤   ¤   ¤   temp = strtoul(third, NULL, 10);
982405 ¤   ¤   ¤   if (temp > 0xFFFF) {
2f6609 ¤   ¤   ¤   ¤   ThrowPGPError_ (kPGPError_BadParams);
1ea3a6 ¤   ¤   ¤   }
c6658c ¤   ¤   ¤   theAddress.S_un.S_un_w.s_w2 = temp;
20d5a7 ¤   ¤   } else if (strtok(NULL, ".") != NULL) {
d7c808 ¤   ¤   ¤   ThrowPGPError_ (kPGPError_BadParams);
--cd8b 000e86e3f49401202b2 Page 22 of PGPSockets.cp
4f45a6 ¤   ¤   } else {
dadd38 ¤   ¤   ¤   temp = strtoul(first, NULL, 10);
0338bd ¤   ¤   ¤   if (temp > 255) {
886609 ¤   ¤   ¤   ¤   ThrowPGPError_ (kPGPError_BadParams);
e8a3a6 ¤   ¤   ¤   }
6ba913 ¤   ¤   ¤   theAddress.S_un.S_un_b.s_b1 = temp;
f7ce18 ¤   ¤   ¤   temp = strtoul(second, NULL, 10);
b838bd ¤   ¤   ¤   if (temp > 255) {
056609 ¤   ¤   ¤   ¤   ThrowPGPError_ (kPGPError_BadParams);
aaa3a6 ¤   ¤   ¤   }
15dd7a ¤   ¤   ¤   theAddress.S_un.S_un_b.s_b2 = temp;
c937f7 ¤   ¤   ¤   temp = strtoul(third, NULL, 10);
7438bd ¤   ¤   ¤   if (temp > 255) {
186609 ¤   ¤   ¤   ¤   ThrowPGPError_ (kPGPError_BadParams);
68a3a6 ¤   ¤   ¤   }
05f15d ¤   ¤   ¤   theAddress.S_un.S_un_b.s_b3 = temp;
123a2b ¤   ¤   ¤   temp = strtoul(fourth, NULL, 10);
9638bd ¤   ¤   ¤   if (temp > 255) {
736609 ¤   ¤   ¤   ¤   ThrowPGPError_ (kPGPError_BadParams);
11a3a6 ¤   ¤   ¤   }
5735a8 ¤   ¤   ¤   theAddress.S_un.S_un_b.s_b4 = temp;
160fe4 ¤   ¤   }
3c870b ¤   ¤   result = theAddress.s_addr;
a59371 ¤   }
5967c5 ¤
6e8170 ¤   catch (PGPError exception) {
b8cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
799371 ¤   }
d567c5 ¤
48e0a3 ¤   catch (...) {
87b72f ¤   ¤   err = kPGPError_UnknownError;
279371 ¤   }
e367c5 ¤
80d6f4 ¤   if (theContext != nil) {
27d6ee ¤   ¤   theContext->lastError = err;
549371 ¤   }
7aaf5a
775d73 ¤   return result;
05efe6 }
87af5a
2aaf5a
97af5a
d5d25c ¤   char *
e729db PGPInternetAddressToDottedString(
7e6cbf ¤   PGPInternetAddress¤ inAddress)
86bb36 {
efb4fa ¤   char *¤ ¤   ¤   ¤   result = NULL;
e87d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
e2386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
8e67c5 ¤
2e5168 ¤   try {
bd6645 ¤   ¤   if (theContext == nil) {
b7ac7b ¤   ¤   ¤   ThrowPGPError_(kPGPError_UnknownError);
8d0fe4 ¤   ¤   }
eb1b52 ¤   ¤
46f78b ¤   ¤   Str32¤  temp;
268689 ¤   ¤   char *¤ curr = theContext->dottedStringBuffer;
2d1b52 ¤   ¤
ddb293 ¤   ¤   ::NumToString(inAddress.S_un.S_un_b.s_b1, temp);
48a634 ¤   ¤   ::BlockMoveData(&temp[1], curr, temp[0]);
e4bfca ¤   ¤   curr += temp[0];
1a169e ¤   ¤   *curr++ = '.';
5dc6fa ¤   ¤   ::NumToString(inAddress.S_un.S_un_b.s_b2, temp);
2da634 ¤   ¤   ::BlockMoveData(&temp[1], curr, temp[0]);
b2bfca ¤   ¤   curr += temp[0];
66169e ¤   ¤   *curr++ = '.';
4aeadd ¤   ¤   ::NumToString(inAddress.S_un.S_un_b.s_b3, temp);
7ca634 ¤   ¤   ::BlockMoveData(&temp[1], curr, temp[0]);
6bbfca ¤   ¤   curr += temp[0];
1c169e ¤   ¤   *curr++ = '.';
d22e28 ¤   ¤   ::NumToString(inAddress.S_un.S_un_b.s_b4, temp);
e8a634 ¤   ¤   ::BlockMoveData(&temp[1], curr, temp[0]);
--b13f 00096dc492a401202b2 Page 23 of PGPSockets.cp
c1bfca ¤   ¤   curr += temp[0];
07dda0 ¤   ¤   *curr = '\0';
3a5ebd ¤   ¤   result = theContext->dottedStringBuffer;
5e9371 ¤   }
5167c5 ¤
9f8170 ¤   catch (PGPError exception) {
fdcdc7 ¤   ¤   err = MapPGPSocketsError(exception);
a09371 ¤   }
a367c5 ¤
afe0a3 ¤   catch (...) {
25b72f ¤   ¤   err = kPGPError_UnknownError;
d49371 ¤   }
a567c5 ¤
6ed6f4 ¤   if (theContext != nil) {
85d6ee ¤   ¤   theContext->lastError = err;
5e9371 ¤   }
5faf5a
005d73 ¤   return result;
02efe6 }
2baf5a
07af5a
81af5a
201e7c ¤   PGPInt32
e36602 PGPIOControlSocket(
223556 ¤   PGPSocketRef¤   inSocketRef,
682404 ¤   PGPInt32¤   ¤   inCommand,
3b1c45 ¤   PGPUInt32 *¤¤   ioParam)
d5bb36 {
16efa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
927d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
47386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
1767c5 ¤
f05168 ¤   try {
8f1acb ¤   ¤   // Make sure that the parameters are correct
28c0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
49e42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
c80fe4 ¤   ¤   }
e81b52 ¤   ¤
fdcb0d ¤   ¤   if (inCommand != kPGPSocketCommandGetUnreadData) {
93fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
a30fe4 ¤   ¤   }
034751 ¤   ¤   if (ioParam == nil) {
abfb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
100fe4 ¤   ¤   }
201b52 ¤   ¤
4057b7 ¤   ¤   // Everything is good, so get the address
df8034 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext, (CSocket *) inSocketRef);
8e1b52 ¤   ¤
912bfc ¤   ¤   ((CSocket *) inSocketRef)->IOControlSocket(inCommand,
970f1d ¤   ¤   ¤   ¤   (UInt32 *) ioParam);
304a29 ¤   ¤   result = 0;
619371 ¤   }
b767c5 ¤
308170 ¤   catch (PGPError exception) {
90cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
c69371 ¤   }
5c67c5 ¤
42e0a3 ¤   catch (...) {
58b72f ¤   ¤   err = kPGPError_UnknownError;
dc9371 ¤   }
c667c5 ¤
a4d6f4 ¤   if (theContext != nil) {
92d6ee ¤   ¤   theContext->lastError = err;
f49371 ¤   }
f1af5a
e45d73 ¤   return result;
64efe6 }
19af5a
47af5a
e7af5a
ec1e7c ¤   PGPInt32
96c2f5 PGPGetSocketOptions(
--9721 000b96c1630401202b2 Page 24 of PGPSockets.cp
203556 ¤   PGPSocketRef¤   inSocketRef,
cf23ac ¤   PGPInt32¤   ¤   inLevel,
9d1bd1 ¤   PGPInt32¤   ¤   inOptionName,
0bd268 ¤   char *¤ ¤   ¤   outOptionValue,
a97bbf ¤   PGPInt32 *¤ ¤   ioOptionLength)
8ebb36 {
82efa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
e47d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
16386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
9d67c5 ¤
6b5168 ¤   try {
4d1acb ¤   ¤   // Make sure that the parameters are correct
1bc0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
f4e42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
c70fe4 ¤   ¤   }
551b52 ¤   ¤
2d1d16 ¤   ¤   if (inLevel != kPGPSocketOptionLevelSocket) {
61fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
600fe4 ¤   ¤   }
05c550 ¤   ¤   if ((inOptionName != kPGPSocketOptionAcceptingConnections)
357a27 ¤   ¤   && (inOptionName != kPGPSocketOptionType)) {
2ffb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
fe0fe4 ¤   ¤   }
171983 ¤   ¤   if (outOptionValue == nil) {
b2fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
d60fe4 ¤   ¤   }
8e440d ¤   ¤   if (*ioOptionLength < sizeof(PGPInt16)) {
09fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
2f0fe4 ¤   ¤   }
061b52 ¤   ¤
fa57b7 ¤   ¤   // Everything is good, so get the address
ccf674 ¤   ¤   *ioOptionLength = sizeof(PGPInt32);
8fb633 ¤   ¤   ((CSocket *) inSocketRef)->GetSocketOptions(inOptionName,
2ddb0d ¤   ¤   ¤   ¤   (SInt32 *) outOptionValue);
c24a29 ¤   ¤   result = 0;
9e9371 ¤   }
0a67c5 ¤
838170 ¤   catch (PGPError exception) {
5acdc7 ¤   ¤   err = MapPGPSocketsError(exception);
689371 ¤   }
2267c5 ¤
5de0a3 ¤   catch (...) {
18b72f ¤   ¤   err = kPGPError_UnknownError;
f79371 ¤   }
ef67c5 ¤
f6d6f4 ¤   if (theContext != nil) {
9ad6ee ¤   ¤   theContext->lastError = err;
049371 ¤   }
b6af5a
9c5d73 ¤   return result;
25efe6 }
3caf5a
dcaf5a
f0af5a
a71e7c ¤   PGPInt32
94cfd5 PGPSetSocketOptions(
ac3556 ¤   PGPSocketRef¤   inSocketRef,
6523ac ¤   PGPInt32¤   ¤   inLevel,
981bd1 ¤   PGPInt32¤   ¤   inOptionName,
20d4a6 ¤   const char *¤   inOptionValue,
e64d17 ¤   PGPInt32¤   ¤   inOptionLength)
febb36 {
34efa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
b97d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
80386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
8a67c5 ¤
981d56 ¤   (void) inSocketRef;
03b8db ¤   (void) inLevel;
39ba6c ¤   (void) inOptionName;
6d99c8 ¤   (void) inOptionValue;
c24123 ¤   (void) inOptionLength;
b967c5 ¤
--a601 00074a5abd2401202b2 Page 25 of PGPSockets.cp
055168 ¤   try {
fb47a6 ¤   ¤   ThrowPGPError_ (kPGPError_SocketsOperationNotSupported);
d79371 ¤   }
fd67c5 ¤
288170 ¤   catch (PGPError exception) {
d6cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
b19371 ¤   }
3a67c5 ¤
d1e0a3 ¤   catch (...) {
f0b72f ¤   ¤   err = kPGPError_UnknownError;
e79371 ¤   }
dc67c5 ¤
44d6f4 ¤   if (theContext != nil) {
dfd6ee ¤   ¤   theContext->lastError = err;
179371 ¤   }
6faf5a
615d73 ¤   return result;
f1efe6 }
e9af5a
c2af5a
50c744 ¤   PGPError
279839 PGPSocketsEstablishTLSSession(
7282aa ¤   PGPSocketRef¤   ¤   inSocketRef,
668bfc ¤   PGPtlsSessionRef¤   inTLSSession)
88bb36 {
be7d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
f0386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
9467c5 ¤
6f5168 ¤   try {
241acb ¤   ¤   // Make sure that the parameters are correct
4dc0c8 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inSocketRef)) {
ece42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
2f0fe4 ¤   ¤   }
e71b52 ¤   ¤
9c4a16 ¤   ¤   StSocketsThreadBusy¤theBusyThread(theContext,
8ad9b2 ¤   ¤   ¤   (CSocket *) inSocketRef);
751b52 ¤   ¤
8717bc ¤   ¤   if (((CSocket *) inSocketRef)->GetSocketType() !=
ca20f0 ¤   ¤   ¤   kPGPSocketTypeStream) {
80dcbe ¤   ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsOperationNotSupported);
580fe4 ¤   ¤   }
bb1b52 ¤   ¤
0e1f66 ¤   ¤   err = PGPtlsSetReceiveCallback(¤inTLSSession,
cd5010 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSocketsTLSReceive,
7cdeab ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inSocketRef);
8f53af ¤   ¤   if (err == kPGPError_NoErr) {
9a3158 ¤   ¤   ¤   err = PGPtlsSetSendCallback(¤   inTLSSession,
9c3601 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   PGPSocketsTLSSend,
a9dddc ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inSocketRef);
1b6f41 ¤   ¤   ¤   if (err == kPGPError_NoErr) {
293207 ¤   ¤   ¤   ¤   PGPSocketAddressInternet¤   address;
df2b85 ¤   ¤   ¤   ¤
aa59b5 ¤   ¤   ¤   ¤   ((CSocket *) inSocketRef)->GetPeerName(&address);
6c905c ¤   ¤   ¤   ¤   err = PGPtlsSetRemoteUniqueID(¤ inTLSSession,
d44e1e ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   address.sin_addr.s_addr);
875684 ¤   ¤   ¤   ¤   if (err == kPGPError_NoErr) {
83c1de ¤   ¤   ¤   ¤   ¤   err = PGPtlsHandshake(inTLSSession);
2f19ba ¤   ¤   ¤   ¤   ¤   if (err == kPGPError_NoErr) {
80cd6f ¤   ¤   ¤   ¤   ¤   ¤   ((CSocket *) inSocketRef)->
c22849 ¤   ¤   ¤   ¤   ¤   ¤   ¤   SetTLSSession(inTLSSession);
fc7801 ¤   ¤   ¤   ¤   ¤   } else if (err == kPGPError_TLSUnexpectedClose) {
f0e7a8 ¤   ¤   ¤   ¤   ¤   ¤   err = theContext->lastError;
4b1c89 ¤   ¤   ¤   ¤   ¤   }
432613 ¤   ¤   ¤   ¤   }
c5a3a6 ¤   ¤   ¤   }
410fe4 ¤   ¤   }
3d9371 ¤   }
6a67c5 ¤
8c8170 ¤   catch (PGPError exception) {
eecdc7 ¤   ¤   err = MapPGPSocketsError(exception);
789371 ¤   }
7467c5 ¤
--0a58 000808661c6401202b2 Page 26 of PGPSockets.cp
fbe0a3 ¤   catch (...) {
c1b72f ¤   ¤   err = kPGPError_UnknownError;
df9371 ¤   }
1067c5 ¤
e0af5a
345ea8 ¤   return err;
16efe6 }
82af5a
edaf5a
68af5a
b51e7c ¤   PGPInt32
b1a489 PGPSocketsTLSReceive(
c1454c ¤   void *¤ ¤   inData,
26a0d9 ¤   void *¤ ¤   outBuffer,
69ba4d ¤   PGPInt32¤   inBufferSize)
aabb36 {
78efa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
d87d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
30386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
5067c5 ¤
155168 ¤   try {
231acb ¤   ¤   // Make sure that the parameters are correct
9f10c6 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inData)) {
d3e42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
b60fe4 ¤   ¤   }
871b52 ¤   ¤
9a3552 ¤   ¤   if (outBuffer == NULL) {
befb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
1f0fe4 ¤   ¤   }
d71b52 ¤   ¤
5109bb ¤   ¤   if (inBufferSize < 0) {
3afb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
bc0fe4 ¤   ¤   }
e41b52 ¤   ¤
243936 ¤   ¤   result = ((CSocket *) inData)->Receive(¤outBuffer,
265cfa ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inBufferSize,
69f214 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPReceiveFlagNone);
9e9371 ¤   }
d167c5 ¤
6f8170 ¤   catch (PGPError exception) {
f6cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
ce9371 ¤   }
3c67c5 ¤
b9e0a3 ¤   catch (...) {
46b72f ¤   ¤   err = kPGPError_UnknownError;
c69371 ¤   }
d567c5 ¤
7cd6f4 ¤   if (theContext != nil) {
92d6ee ¤   ¤   theContext->lastError = err;
c99371 ¤   }
93af5a
165d73 ¤   return result;
91efe6 }
b1af5a
30af5a
2baf5a
731e7c ¤   PGPInt32
5e0055 PGPSocketsTLSSend(
194525 ¤   void *¤ ¤   ¤   inData,
ef4f2f ¤   const void *¤   inBuffer,
d4b9cd ¤   PGPInt32¤   ¤   inBufferLength)
bebb36 {
35efa5 ¤   PGPInt32¤   ¤   ¤   result = kPGPSockets_Error;
537d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
e7386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
7d67c5 ¤
c85168 ¤   try {
5a1acb ¤   ¤   // Make sure that the parameters are correct
df10c6 ¤   ¤   if (! CSocket::VerifyPGPSocketRef((CSocket *) inData)) {
f5e42e ¤   ¤   ¤   ThrowPGPError_(kPGPError_SocketsNotASocket);
f30fe4 ¤   ¤   }
801b52 ¤   ¤
--ff95 0008af751a5401202b2 Page 27 of PGPSockets.cp
f9d68b ¤   ¤   if (inBuffer == NULL) {
9efb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
400fe4 ¤   ¤   }
1c1b52 ¤   ¤
55987d ¤   ¤   if (inBufferLength < 0) {
22fb36 ¤   ¤   ¤   ThrowPGPError_(kPGPError_BadParams);
4c0fe4 ¤   ¤   }
13af5a
9e83c3 ¤   ¤   result = ((CSocket *) inData)->Send(¤   inBuffer,
0ba3a7 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inBufferLength,
9c3f83 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   kPGPSendFlagNone);
0c9371 ¤   }
ae67c5 ¤
808170 ¤   catch (PGPError exception) {
c3cdc7 ¤   ¤   err = MapPGPSocketsError(exception);
289371 ¤   }
0b67c5 ¤
d0e0a3 ¤   catch (...) {
26b72f ¤   ¤   err = kPGPError_UnknownError;
179371 ¤   }
9a67c5 ¤
58d6f4 ¤   if (theContext != nil) {
10d6ee ¤   ¤   theContext->lastError = err;
df9371 ¤   }
2367c5 ¤
135d73 ¤   return result;
4fefe6 }
a5af5a
6caf5a
c9af5a
b9c744 ¤   PGPError
0f20ca PGPGetLastSocketsError(void)
71bb36 {
b3386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
faaf5a
3bd6f4 ¤   if (theContext != nil) {
4819aa ¤   ¤   return theContext->lastError;
cdf037 ¤   } else {
a270d7 ¤   ¤   return kPGPError_UnknownError;
579371 ¤   }
42efe6 }
7aaf5a
8faf5a
44af5a
e8c744 ¤   PGPError
8fd0ad PGPSetSocketsIdleEventHandler(
87d261 ¤   PGPEventHandlerProcPtr¤ inCallback,
c2dbfa ¤   PGPUserValue¤   ¤   ¤   inUserData)
b1bb36 {
e97d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
8d386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
8a67c5 ¤
7a5168 ¤   try {
6c1eaf ¤   ¤   CSocket::SetIdleEventHandler(inCallback, inUserData);
aa9371 ¤   }
c367c5 ¤
d48170 ¤   catch (PGPError exception) {
c657ae ¤   ¤   err = exception;
c89371 ¤   }
a567c5 ¤
5ee0a3 ¤   catch (...) {
90b72f ¤   ¤   err = kPGPError_UnknownError;
9a9371 ¤   }
5867c5 ¤
36d6f4 ¤   if (theContext != nil) {
24d6ee ¤   ¤   theContext->lastError = err;
2f9371 ¤   }
5367c5 ¤
985ea8 ¤   return err;
4aefe6 }
92af5a
8aaf5a
--31bd 000c1c37950401202b2 Page 28 of PGPSockets.cp
e0af5a
01c744 ¤   PGPError
7171ca PGPGetSocketsIdleEventHandler(
81286e ¤   PGPEventHandlerProcPtr *¤   outCallback,
4670d3 ¤   PGPUserValue *¤ ¤   ¤   ¤   outUserData)
48bb36 {
337d56 ¤   PGPError¤   ¤   ¤   err = kPGPError_NoErr;
11386e ¤   SThreadContext *¤   theContext = CSocket::GetThreadContext();
6367c5 ¤
7e5168 ¤   try {
aa3909 ¤   ¤   CSocket::GetIdleEventHandler(outCallback, outUserData);
159371 ¤   }
9567c5 ¤
bf8170 ¤   catch (PGPError exception) {
3457ae ¤   ¤   err = exception;
279371 ¤   }
b167c5 ¤
cae0a3 ¤   catch (...) {
deb72f ¤   ¤   err = kPGPError_UnknownError;
109371 ¤   }
d067c5 ¤
ecd6f4 ¤   if (theContext != nil) {
1ad6ee ¤   ¤   theContext->lastError = err;
1a9371 ¤   }
ef67c5 ¤
9f5ea8 ¤   return err;
0defe6 }
c3af5a
62af5a
1aaf5a
6fc744 ¤   PGPError
9516f0 MapPGPSocketsError(
634f7a ¤   PGPError¤   inErr)
55bb36 {
3cfbcb ¤   PGPError¤   result = kPGPError_UnknownError;
2167c5 ¤
7595e9 ¤   if ((inErr > kPGPPFLErrorBase) && (inErr < kPGPError_Last)) {
f364f1 ¤   ¤   result = inErr;
1ff037 ¤   } else {
92d625 ¤   ¤   map<PGPError, PGPError>::iterator¤  theIterator = sErrorMap.find(
cbb796 ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   ¤   inErr);
b71b52 ¤   ¤
81c514 ¤   ¤   if (theIterator != sErrorMap.end()) {
b71122 ¤   ¤   ¤   result = (*theIterator).second;
250fe4 ¤   ¤   }
389371 ¤   }
2f67c5 ¤
3b5d73 ¤   return result;
9befe6 }
66af5a
b86d52 ¤   void
e1ce29 InitErrorMap()
57bb36 {
635415 ¤   pgpLeaksSuspend();
da67c5 ¤
f45064 ¤   sErrorMap[insufficientResources] = kPGPError_OutOfMemory;
3598f7 ¤   sErrorMap[kOTAddressBusyErr] = kPGPError_SocketsAddressInUse;
0c0403 ¤   sErrorMap[kOTNoAddressErr] = kPGPError_OutOfMemory;
e1c566 ¤   sErrorMap[kOTBadAddressErr] = kPGPError_BadParams;
ccd8d6 ¤   sErrorMap[kOTBadOptionErr] = kPGPError_BadParams;
fed7da ¤   sErrorMap[kOTBadDataErr] = kPGPError_SocketsBufferOverflow;
8def7a ¤   sErrorMap[kOTBufferOverflowErr] = kPGPError_SocketsBufferOverflow;
8c1caa ¤   sErrorMap[kOTBadFlagErr] = kPGPError_BadParams;
1ddcd0 ¤   sErrorMap[kOTNotSupportedErr] = kPGPError_SocketsOperationNotSupported;
83f2d8 ¤   sErrorMap[kOTBadQLenErr] = kPGPError_BadParams;
5c3657 ¤   sErrorMap[kOTQFullErr] = kPGPError_SocketsListenQueueFull;
2c4554 ¤   sErrorMap[kENOMEMErr] = kPGPError_OutOfMemory;
0cbd12 ¤   sErrorMap[kOTOutOfMemoryErr] = kPGPError_OutOfMemory;
95b989 ¤   sErrorMap[kOTDuplicateFoundErr] = kPGPError_SocketsAddressInUse;
02eabb ¤   sErrorMap[kEINVALErr] = kPGPError_BadParams;
1b93d6 ¤   sErrorMap[kEADDRINUSEErr] = kPGPError_SocketsAddressInUse;
c156d5 ¤   sErrorMap[kEADDRNOTAVAILErr] = kPGPError_SocketsAddressInUse;
--4536 0019a604cb4401202b2 Page 29 of PGPSockets.cp
66d36a ¤   sErrorMap[kENETDOWNErr] = kPGPError_SocketsNetworkDown;
60d4c0 ¤   sErrorMap[kENETUNREACHErr] = kPGPError_SocketsNetworkDown;
caedb0 ¤   sErrorMap[kECONNREFUSEDErr] = kPGPError_SocketsNotConnected;
329436 ¤   sErrorMap[kEHOSTDOWNErr] = kPGPError_SocketsNetworkDown;
d5f9ee ¤   sErrorMap[kEHOSTUNREACHErr] = kPGPError_SocketsNetworkDown;
4fcd7a ¤   sErrorMap[kENOSRErr] = kPGPError_OutOfMemory;
b3aaef ¤   sErrorMap[kOTUserRequestedErr] = kPGPError_SocketsNotConnected;
ec3e2e ¤   sErrorMap[kOTPortLostConnection] = kPGPError_SocketsNotConnected;
12e884 ¤   sErrorMap[kOTCanceledErr] = kPGPError_UserAbort;
30af5a
6631c0 ¤   sErrorMap[kOTBadNameErr] = kPGPError_SocketsHostNotFound;
73a9c8 ¤   sErrorMap[noNameServer] = kPGPError_SocketsHostNotFound;
aa4918 ¤   sErrorMap[authNameErr] = kPGPError_SocketsHostNotFound;
2a3f0d ¤   sErrorMap[noAnsErr] = kPGPError_SocketsDomainServerError;
08dcae ¤   sErrorMap[dnrErr] = kPGPError_SocketsDomainServerError;
2f0fa8 ¤   sErrorMap[outOfMemory] = kPGPError_OutOfMemory;
3f67c5 ¤
9fb8ec ¤   pgpLeaksResume();
9aefe6 }

-AVPH$ 000119836f7001202b3 Page 1 of binaries1.zip
!Dp:!h WE5DBBRAAkAIAQNWdTYGQA^A@m+AAABZAkA5AAAAa&^ybY=$e!>pcZN4L&%la!>\et>1bYN$e!>DcZBw
QWV:&B bZJRet>nLuB!cm=mcY:6QRiaFFZT4!h5apHCm8mlnwnlF%&FW$RM5C#bZZbqTTc<aZbaFna$M:5Imw1K
bVha?L Pa5=uI1JR\\wBlRXFSVD1ae=l#N\Sw^u9Q&4?6ZM/?uy:ltaEXtt*u/%W%QhW@*/9ZyX>cyj9Sch!89%
/:m!&X ciFIhcR=XKyHyw5NLbYX%bH!mcPGca4pthAFQ?=<49K?yji<4n9<<PTV=*WTI6Ve*ABj9EJw8\9QRX&E
RIXYti =?ADlPn^Pu\9%D!KcZq#dZlmMBKyd++EwK:V\/EYpXQFb<I$KpLpccK6LZck4a&wR8!k^b98!m8FGNTG
k^qEMw j$D!aF8Z*C?$6K/ymRK<uwbah1/9meK<!8ctaKnb@X=*F$Zc+===<e?pmtF>@MHT+?y%\eYqHDG1PnC/
?HZ!DL dEJb9PiL/EBSjuW\NCNaF*d/bRe/Zl1h$&l*9GQNuGlL8LG<ISmNl1QJ^@PG6DdXNwVhyC6%<YwGKGpC
iPVcSw VcFq*Cki+FKWyRdYDDq5duXVS+QnA>kZ@^!9ZckXiw/*GY?^q8t+Ai$WP$5Vew!d!LYi9dRd9HhkJZ4i
$khE@B KMR%lVkMWSZIynYG6^<kH/AAB:V%1q4&%A<Qj^:?QQ!hl:@<y:Hey8&e^BXj::%#9D&!bC/P<8!uZit>
c^NF^? D:<a=mJQ#R@/D#l$IQuike4/cEkpHlwTcV+&Gw=a1MN1/%8c4eVl#W$6F6Lw+K^k*LNQQFRb4K5QBe1D
%QQ669 i5DRNwH!=pc>9mHyT81$m91tGT/H:c<!5d=ydLpV:>pD?kh\CnIm*GS#^Qb/iMDljmLqS?4/$REH59%%
R<Pi/Q aphlE6SW*%RZ6S!8cY/NlMI%\cql8Gl+18XwhVAcCna+*S\hhiAe/@Fl5%5mRi9B<6bwT*Nn+ND\uGPd
j^S5T% I:ZYw&YlWBn/1#4aM5%/cEl4jWP6QW<Al#dAI$Q4w&l^G1ep*\ei68$KQGDjFiX:q@jy+>R8<1BD5=RQ
!R/d96 4+RQc%6Xq#6WHa?+XB$Q&%ahD%RQG&=H6d$lPFIYdaRtd\w*YA/NDS@uhKjnkyG/eE8kJ6#TauP4\?EZ
lPFtmm ke1k4q8P\dYe>AEiT6aHTE*TB$m$/AMpPikDQJTGQpk<LcqqE\@dZ<XSH?BBi*$RP&J:QZ6>aNRpYS?a
bt\X6c !jdZehEHiNlbH^m>=1kQVEehPD91A##w4A@\1IM?MIVFZl@kIZ6>ED9mMKlml&&:\q+jGQX*$kj1wEP#
1%ujlQ JPpDw/%5>WH5mE9XdjXB:ECmQwlVdY@IRS@kIRh>kIie>aE^YlQ$ki:mIPn&HwJ8/!LwNn/C:8Ip/Gq/
C4HJ<p CZwKN$FQ=Tjw4w/C:8\y/I/8k8:5K?kP#wL8:m*wKh\F*h%j$N$hB6*ha>BhZRdh*YjRZb\G*eX4$J*h
EZuM^c Bn&F*/A:Pk//5?ik8:wP8199wN5/D:1#>/CueB>$S@>B6*ekhGeQRuh^IZRZH$J*h!J$N!>Ch*EnhH5@
c*V<pd R4h%JHRdV$J*eTZ$NH$JQaW#wcj!JuSZh$J*>mh$S+hCh@awhAiZRuj*KjRWVwZ8:qZw:t/F:8=Z/K/P
^n!X5C li:8Yik84wZ8+q9w#5/Fu5K:$B*hC>*b9>BhHR#h%eQRdX$M*huH$FM+Gd1nq/Hd8^t/5=?l8#kc8w8u
*KR:e: wd8:G41d4^EVEaNcWS>6EZcmpTRQh6i^aY+XFc6<&A1FSSK5*Y@V=#ahdiyhSEiNDXVyLjYN>ejS/bZB
MEAu@F WFXNwDIM6$A6dP%=&?/&>LG=a/&>thTFTj%tb:1V:LYhHWlY@ptt*G1@da&&^XJd#dPNVda^^Cd4m&lC
lyPTdA T$99#>4TX565c++6N6l5iK*YN5uEJ6qX+<:DW%44:N1dnqlduek&dW>Hpu1A/Nb?ILKqN$^W/*&dD1t:
14/\+t N^FN>^&:1/SiTnlk:19akZmQEeHcd$T&:V$/b8qDE>ZlnlL:$$TpZnXVp8:S&5NEV8lu+>1&@c!PYQYa
%FCuKd R#?4I$p/#c/jFhtm*=#/PjGR$me&@Y!/1!T>b>@QykN^HYnZ#+y51\>6?ntS/uBHmS4T$5<YT6I>YuYt
6jX6b$ ZV?ZNVRp>VDTE9wYChbiSXymj!IqwTiSaP:D&QiEi+$S/T=nZ&N*a>R95c<WKh=LBpu&D/IJQaPE=D=B
GwEPcH 14p*a6?V/td1khlZdQ5+d1yuRu5n\WF#Yq*SyCM&Y5dmw15Db8<<pb1pH<\?8WqKLLXJPtI#Fm!%WRjM
FbuhDD 6WtpJpt^8Vb&$*1:8d^NmMMc%:AEM/\SDL8ykJ*@d#M655/FLBMk//#HpAnLqW!$BNt%ZAqJ=m9F9y9p
$?dXBy $NJ/%KdG@:y\JCBH1>uEn16PW9nIa>n5WBmGTuNVNEqQYJtb>HmeYYJ*JnHD%4iyW&J6HP6lX+QEc>9@
HenV\5 FN9H?qNDZeX@Gt9ByJ>!+eKqQbW%AE<DQAQ\LMA1kKeAukQ+J<D#AE<IwRZk<$u+*Ap?Z\B+EZAQkBj\
<PFdVK j\G5BZkJ+GYAX\BiBZkNaDYe+\Q\A@RC!AQIB@w>AM5A:kZAFRq*A6\NeD@AA\DLAi/Ae*iF#/Z\8S6<
pi6Rq$ Qkn\EPChALaCjAZA\\CQAD\K5BLkMaDHAi/Ce#wDhDFYH\86K$A*wH<L<B*A>\A@AH\F<A*An\D@BjkJ
@SX^R# +E5+h$@+ZA?ji<Hu#\C@AL+h\F<A@^ZkN+DjAj/H1?Qpck6nKhQZ<NpVaH8AWwAhAHaEiuiAdRB/AG\L
Dh&uLY WEJLNLaGAL+C?eL9SDhc64GLZDq64Cu!+=w4AG!*aqwPAt$k+Q+EL5jiHyjqAiB%5J?\n/C6SXj1+=$B
!D6Fn\ 5L%/C&E54CuESYK+Dk#kIICDAR+BGAR\EADd?pBc*FRGMAVkAABwS*Ew\Q<B:AHRB\DdCh8wH<BjAjaF
mny@<J /A?\Q!:5BlkKMA^kPMAIkJEAA\C\Z$eB:Ae\GkDcT8A!u*$A?kJMARkB%ALkT4P@+Zy$kCDAXIA/kGpA
1Ge4#! ^\CMAbkJWAXRDZAa\FmAGwBJAIjncntAw\CPB1kH\NZ\M\DRb8Em8CcA!RAXALmC<WkAZIA+DtA<\ATA
Q#<8<N mRBuAy\FeDdAPRCuA?AT8VMA#kW+D?B<kNMAePHa=RC6ALMAnkYaDVAH+ETAp\B\AiRyAKeCZAB\IeBF
XJe^1F ABeDLAC+BGA?RAVkWq^cD*Ab\HEA8MS5L5AJAP<A9A9\H5D:AG<A9A*\AeCHAQ<G\JZ*KA69+bw1?Q\I
w>a8S8 +GQAC*BFQ8CjAH\K5A:kQ\CjAZ\P<AZAt*AP!I\GM1PBdGwkl^4K+h<B4kP+H8AGkK5A4kXaCHAn\E&+
XYwdGV VlVPSbt=Bn=Sdt+G8AX\GAMc!9?6AI5A@kG\GPA&kCWA6\NeDijA&NFk:Gkkd^1MH\*H#^XbYtpGM1jl
#jwdpS <6uD=NDB:@Q\?n@FElR$MY>J\6MPITQqWVG<8dYyNwn8n?plctY\91p$JKyHXMNWcMc\yqBpn6+!NG^<
5N*T<M AD$WnLd5X^4T>hkb=WAwH#+ETMKabbW&%E>B#HDApK4Z/aRnYlq8BATPA>IetXN1YbklKt51A8YqkJXY
^i<PFw AJ>SVT*l!NSkKF\lta+JH&8\VL\j?c&<GW/i*YI=H8Nb$%JdQ4c%CTcFaaQ#\ARYybFwJCTAHlnX1DhH
CnT4Rj YkLI64J/w9u4pGBDR*N#W&Bp8AF8hYJAVpH^CE##BM\J#TeQVKlBEu8nXnEY?EXPHeYp<14l\<$uthnT
ce@^y! cTIl&KReeQSy^jD/TBVu/HYN+caYMXA8@l^w8XubG$cXE16yPmAGNp?b:9!#^IPJQ#WP&9#i/ciKd5mH
TWTX?t TVLp4N$WHJAE$+^<VHNVYCTFL<!lC&9aInFppSC85J5<Je!54cE+$\R:95DB5pdD5myDlmnWQCRlWJEW
aHbCXS j$8aTF9nR/d=hC\YbJ4n1nlE4QRlt*wR&XP##h!hdGaJ&ec@pH*5c:J4i=J6&+65+!:pD\\$&Xp@&hw8
piBKHt <RZS$6:*J*6<ANqND>uYVtSj6!djwaB5?qatY=^Q9phH<m%/pL?\H@pQZeu@CJBjpEe?S#@!EZam&>*d
G@N%61 bL>Hpe*ikj!BdeuGc&Vdh@\D@FRQeP@y6y\e#6nh=Vm&R/EtK%tWBn?nLV&!5a6Vu8?nyh&:8b%F=@k<
K^RQ>\ 5RY/Y8J/Z8@i<jQ\\9+$#pMJ!W9nQP#S@DVPR\p5WPh=E/y9Pk>d5!l?u5iSu&#F:J&HQjhZy@6RwtJM
:j5#d$ VV\AZk?&N:aq6lQiG$mBX$=dQAA?AL>ZTn*iP?La1Qp?PY*^+Ky?#EeB!QQJ?<b#EehGLVD1AKDF9w8E
eF!LNV ^hh&H4#=N\XyTGKF>H/>9%KCAZ!jh/9FR%tEKV+c6akY##dkqIN$*eBeV#H\yKtdQGu1Jp?c85tVyt:!
&mGPmD !DHW!WE*te@DedbXG8eXJPk\=?5YJ8mt#M>DC>$=njPK$>F%N9wtythmi5eju@F:bewiVD#dLQ?hWkMV
$:9c5a 6I4L:+8yiq$TM5:DW?6uP^nBBN8ypk=SL!bWwXA?hKy1*emW<EFR!114K+^:<A&6GDEyNKP?Fn&>mVW\
MAlqHm GhDm1lm9/l%dXVW8wVhGnB%jHc6Mjt#iB+!Gn/wa=qPjGu*//hNn?y*H1$>FN>KD^>B$$tiB/S^9IW^8
uDp41T I5FIjRL*&JpGX+@mu6iw6<K<d5@A1KbRcTAAE=hAJP/BcIJVPntqp%M/PcYVW#y#IKY#&nNYP<@:pp4y
Lti?lm 6LD6bQyJh*IRBE*4a$cmH#pJk1d%MS:n!JERFHKQVY=$emkElb>nk@MMCn<ICtMZE*/N/ZaZW=$EQidb
^hN\b& m9DXFI+R>HkyFkJ=%@Ra+&5KaRl/:FJC6>1XRmCCHlh%J*\@C4EkQySCH+kjSmEL^ChV?AQ^KST/RZ\t
FCb4*1 lXRRQ+%CJwljRtEQ^G>RwR=6EaXREF>P:a9+GkwdIj+ela+Rj=FCKwm@TiEk^D?mEA@m/!m5lQmQFGbC
qP4+tk @HeKM!HiS1Et:PaiFKbC9C?FuBD9S&Eu^K5wJIX+A+YtEI>RiA4^5!q$ljlCpk@Ed/Y\E8L*WZkJ<cew
nRZTHP uIV+/^T8R9\hCuWl@mYFllD@lWJbKI=FFAJD9AiF8SDjlWJ6mP>H+VdE!!n5bul4FH=D@Pma+kc<u5Jy
+>l/kh mM?tpB4mb%DaDQH#KZTG?BWW9pL<bky*IZ+*ld\Rj+SCZ+m@RCE\^N?pMaQ+l^RPR@\4t4nua9GTV5DQ
RI\>W& A6\q11*6XI@%JD?dSC=?hy@IT=d#WK@ZHJAB<KVJwSN=w<d@w9HXw^^t*+uilJaGj#>6JYVqpGjEBVRS
d*^IJ* >@byCy%tHMtdbl#JK>&W9DVP</eVS/Jad<wa6$Me%$4#!^q&l9$jm==$X>EV?WA\1SM*JHwmyWyLpCwX
tZcb5d ::D&c&EcM/N$a!%Ct#hyZ8dDA9uF9>nN\PA/YS/J?cdR?WcY^tB>p@#*=+X!m<bWnTt4HFa/dNK\#Pc+
<VNE9n /W@9+w<$#CLI?u$nhLpujedPAhq<yR!$LIbu=cjeNW+#%hb4mn4/$nRB9nSNkC>NE?BL$\V+yApwTjYI
<+@kl8 kB:*yZ!WaA1&d6Ceuw6dPicacE5\<1h8BI5lK??GDele<h8Fy/9NImS#Gh4eYni&bt#=l4I8Mqd8GL\*
Y6cYP8 5uLq%Z4I8<=a?PuLT9nbq#X=&yJL:P:?alw^jW$S^?EtVZt+KRDRaww+Zt&KPD=wmnm?caw+@qhFHHF^
::$/GV h!#mcC\5LVbF?!nm1B&yIw:cHBX^%K=REWj6QlX^%F=YEWj6Y^X^>G!qIw/i9XVE$VNTSS\>ISX^>J!k
EbudPL Iw/ic%VE$ZP9mnl/ZqASS<<ZK8LwLXRSS?<PK8LwNT&8<p=WEWi94mKP*6NX^NF:9aw+il>TEWj91!4m
-Ab$A= 00096193bf5001202b3 Page 2 of binaries1.zip
MBw9at /Q%iSS^>uXZE$hhHSS^>bT4m/J8kIw/?ilX^>M%ZEWjjdT4m/H6GSS^>u/tIw#>jSS#>P/tIw*?kmnn/
54$ayW ^/tIw*?Gmnn/#%ISS@<mFZH$Q/pmn9/QXMRSX@:EIw==P/1Ia>:BK8KaN$qFHQPmK8Kah=/KPPa6WSHH
d4>itS 9NW1+yn*uww+=9&tIw:=&/1Ia*/ymnntn%RS^@\/FZHMu/emn9tZ1aln@q$1+yn@4Iw+=u?mIw+FQlX^
?DHHWC LEC=1CRe:&pM+dkk9wy\:D6/@q!A5uwa+ilQnmWep!q1CMiF=QS\9BDde##liK$JlGNdVmRen$<mZKe^
l/pp+l n#k8wD?CeI\wH$p+SyGQIl#9/&m!B/kuJlPP<u5M+hnGj!Mep\KClPP>VCEe:+ZMWlEtt>RTntPeuuWY
Qe<cnY acS&15R:+Lm4I^#H\VVC5c@1Cej/$qd/HZBS@\#C5d>w8YkH:C>/DN5B:+9tkl$\Rp#Q$n9kE\^/HF/M
nl4X$u ?tAt+TmubQ1K5X*yaY%^lHRq+mn@4aVn+96blGNT#dGEw&+l>:+ahiaemZhE@ZRe+Vk?cMLZEc<%q*C5
=RaYFZ !\tEa=LDmaVjItVTA8IaEcjyh$iM>J>MPD/hPIYmW1nQVmWebYM?+hn@y^GPhV!heE!YPIN\9Je#Ceh:
t=yhTc Pa6\%CFuT*\46AQuEI/!eT:lPEdQI^#q/H#C<X+9IB!VLC+pHMj%SaVnW=1LCWe=ZEA+*6eqE8?Mi9%T
cmp&Jp \qEuZWa+n1jLCeh?ymTF#qm9K\uHlIt4CL?ddB:mV\n=yA^^VJ!/quBM^Qk:+jnp=D1Jh<F:9==\%Gp*
dQSdbV EI=/bmHl1Lh8JB#H>$&E+#m+tZC5=!&Ea*@iTnni$!LC<jk@CEe:5yl\%P&*Ea+&bRul&G/*E+/!h+jE
+mTY?I 8/I>9=N\qI&:CEhd5bS\%KN*E+//=^:C5e:LCMh^eC@lKBj*Ea:6jV@lYQeHCMe/L!j<ijI6EMeptaeI
RHwHMW S:qcIZHD=D>MPN4ES\lHt@pw+hn9K\qHP@Aa+TkDn^PPP8pJ\uH<4mIe=YE%+hk@V^KP%*!KeE!mY$M+
wE%9bV ?kbQT:\Ehi<#lKPQ<C#lcDPjI^#6^n<J^#w<V#mP?^eI^*H#I8EwL@<mHP>%LiGwJ%<mHJ??9m#^4hHY
FuVwFA 9EI+?n/9Ew:&@#ZC$i/>VnmP>#eId!F@DuG5\%8Ew#!?VVm&\#8E+#ZjJS#:/D&Jh$i:<D:l1D<@IB^>
/V&y=S mk<JS=9=d<LSJu^EPP4Wn\qHZjIJ+Tnuu^KP54CPeL!u@^CPjjEb+cnDQ=j+N8kdjpE+?pSjEw=&/m9C
dLYt9D Weh?VVnctjYEw%:/luDWY><Tn8Q?P<J^DH%QPM4WD+SnZ@%I?IjpH!PP^*?TiA<eh#<Vn5L>C?GwM*<q
#Bk%J6 HH&m*\lH@?J*\6Hi@w>\6GP$kK#Hee4q:*G&ik#R+&1=?64Aq+l+$KVHp*JF6aG@L^NCDj^utSTKbh86
DI:d*C KDpW<h+!Me*AB%KCG8LnbCKckVjJlDRDQ$MtySu+6bTel9nhMtHW\NhR+mnmd<5EWRNjV*MJhM&>6KIA
ICA6G\ <Y/WNIy+L=t\b8D>KHEN<iE!Re*An=CJckdiKJQXDQ\ETqyD@F!bTG4k%%BCKiJ*!eSSA%<qE$kN@DYb
Hi@4:F SG4ku%I!KiI@WqI8VmH!KDEZ<aBM6DZ\jTulD@EcT9yD9FEt<Su+!dS1A9H4KhEY<YW!ehdAH/eEQ5Vj
IkIQ=X w4pY+q@LyD\D@=&TbuEc$=$Tb^HjR!dCG9kAtYC*lSYR&KVMKm=ee1lkatXPF$%wMuGVT$+Zn/kYtwkq
HjwRIV FPS$Kht69G4w5N$C8\$6G%eGH>Yn!5j6^lJmZ*n=BV%D?IMVj4cEBS:t+9WpL^%Vm*!e%\ia<=++#YeV
!W5!:\ q*mc#?cV*5PyP%\e&y%Vhe^Tp+/eC66WuatiB8$T4^EYNFJ%MNCFRdDit9qW8YSl4/Z*9Pb4c#89niW9
SIVq/n b<58utT=KAY=GNDY6tw>N$@Pqy&>bqWp=YIjpI8ydY*L9?Lt!huT!=e5F*%BL4+BE:Pet!hu!/:?bLua
=&^K<M e?uWITPEPJL%Sc+YjLTcJ@iI<et<F+&D%#p?$^P+K$^d&&D=SS6I:\Sn8el6iSB!n#1RB!kN>XPmA@Yy
BWAKR@ DRND#a&N#W$5G#tyH:SpiYkMlqkaeqWi4Q1lVk@X#nBERt?h\tKSe@dCG=MHpITB$YuBTLmYyTCH=eGH
L*l%J% GwJiI%dV18PG:ANHlwP%+WmW=TIH:aZZSl:mY&C!SPTeQNnyB@nGKmJH=eE9=THeEtp?Nl!bER*W6ATd
yRhYby cwPS&wDWEuNaJHJKH9J+RTYZ8FB\+eIqXhqcL8c#:M8!EiX9ANFyDXNTubj\D1<b>8hEY%1#\khLcY%#
nAyC%@ S9iGtd1hJ>a*@dXj\QS&aE9yMG:ayHGqKc+Vj^eb<HE/S@Ly$!e:jQR5%WjZ5<JHD$*LlM<<E^?*Fp1d
#tRL6Z V\1lB#:GK/Qh#yF<\qH^&J$4lijBM$ZJ489F/h1qGu:9>8/Lw58#QbBJPE4CC4?=M/I>B5jZ>*?\/\46
tBqWdZ %M=uJpm1C^@nFZlaP4=nyKRt<8t=JQciCPQqkC:F>Iw<q^+DQ9m&PJhTNYX/Tn/FqTtTHd8XX+!9kX5Q
eEpCuw V+%GX\y9^Y#SdZ=6@GlJH:pbBN^=YdVSiC%k:JDuHJqd/^p=h<Bk:K*K<yHbWImXqSXDnK=\1a@qHacY
YaD\=N ?8lG\u^qheZ\dQCyGnI/pI1Q=TYK6u#T$qDqe8TpqHnWWG:%Md?+WdnXJ!V/bIXQR#VXjiGmh@ZtQ\iN
mM5VGT ABw#P@WBnbpNQnA5MyXu!Te#G>k=^thcbuYJ<>EF1uC*>1pPSpQBBqMD&dcQHw!K4QBJabqTnA8Lbh4w
cA6MX* jw@#caqt4Me/nA:PC44y*w=GA6TE1ue>==R+c%/da6c</QYX/ZyDN9mWN$TnAwb!$H*p+H$Ji$6Atuhm
9&d1Ak ?hB5%MjatDALjI\iuVJN8QFJiP?6t/SP^:59!cl>yM<m/uYZhpbZ\^AkF#/awCR\n!9D@kLq%J1Nhnb&
PF<t*& q<\CH<Q*MeSRbHSjBl>Me<8\ja#*::yGP!w41#QiVML\wc#9A4cYHnJ%NQPbw1E#55DH<NbTFD59K$uD
hH\<Eq w:iYDV/wi:J\Z+dZq<yV6jH/4GXnNqi%1$>Ml:pXP^%t:#&tPW>&9K5NuCiu=BQKWu*$dQHS5<IuQD9n
Rb:Yh? FN6$9L=W>it<wjN@B#+dQQ>Q^TiF#w^N6%P&V#Seq&p:G#a\C?M$cajqVSZJP#SLpd^D@>lIu4S\^8+B
bHFM*\ >mjqd&+Yd4QW+FpaPb6TW6PK?/VcuK8>?#/P8!>6wP@n#ChL9p?:>qqe>4ncIJ<qJb>Rq81nb+8QulW?
#qL<T6 t>yuecnQB955Du\&&GhJ^Th4Qp5KY%qhZlb6hD>uWuqXT4&B=\^QwVuc8i@nKNEd/Q8+:w/ZDh<u%WNM
u:Z!4d $Yu#jIwb!qJ>N4PuwhtK:W@L4L<&YNP%^/i#L5Z/hQcQHIEGu<*w/Y!:iWWQd=kaL#t@aTLtyQ8MuHR9
d4jwDR =/S#\bKep^:quHTYB<=J=&LXD=!V#mW^J=%#VqpiBPiee4GXB<+==eI=y%!e=CFQ9hnJbh$eF!=deHFh
l*$4lu 6yMdCwFj:MRFb=NFuXM6JN1P%^G%#*XEdlq+cih9<D1mVdiP/IdFK+ZuwRLSdh8XlyLG:>%u+P6j9dGF
=&j#aq MqyDDd&?6&R>HAi+@Ta66M*ePJ?54TNK!ae!%b^9LJ:^qlW?:Y6hE@BJ8dTJ%nXNe^8u6K/y!T*jl6e%
#/!W%e 6c>%Vb%VVd?&+/!q*M=c&1TYt:PYM8PV!uLQ9Q%8bdp>4&b58XNtLcX48b%9dMM5h!w?:T8LKu*LHc+V
Gb&KmT KjaAee=Iun6kC:C+9B>Tbl1V>$QKnA@9l<V:ITZ*P8?H^Q5l<Z=I>4+l:+ep$4BM9B<T:+epiD?phP9D
$?+QcX ?!H^jpkeYY\jpWY*\95l<Z=I:q+j:+jpXHk@JN+Q!b+Q:+iW8cTtFjjl@bA!=eQ:IjE/yp#=<H=I9B>T
we^54l ?@J>iD?p#DRh:+i$cVRh:+hpY*J:Q!TN*^$HyVBlY!malJb85C&^dB6XlEHWVHcDK1@8Q<C:#8mdTYK<
=E>%KQ h1FY/Du?D&+Fu=ZApyF=PicacE9RXdH<+eZaSK#RmHpE1qw*5m1DwBkVaH^@ut>w^alJwSu%6VBeyp?5
=M@n$Z AeeqZ\yLJlLVGK^9p9@?yFIk9C#%hpbm5>+$d/m8i>eb%6Wn=Qat/SZiam>iiI5>\X95eWu!jSK*&K9l
qlt@cC LjbaHumLQT=Y@eBd:HHlLjc+PMpDd:HHldja+?IpD:#FHljiaw<LF%NB!S<cu6Jcq:5Kkdja+<Jd:QEY
Y>>cRP i:#FZ1b<iI5>6@9mLjcEc:@#Fu8PjHmL9Zb1eVpS6n%bdp/E#a\Qd:HHY?#^Fu8bYF#iam<#Vehd:Du^
R41dFA +T*&ZAy95ehd:QEYi:#F*pd\+T*&iI5>*tJ9a&dq9MYia#9#Fu8bFMPH+m*&PLLwGqq$K:#FHt?^=?:%
8+@Ymc <Sb:VwY*&PM6>8#=<Bb:tW61YuEj*tI9W#/<^S/9a<1WD&?^^%956T@jl:ja!$#V<Sb:t$dV<Sb:6wY*
6AE5HI &BM=Z@I$VYm+h=lGnWH:L8WdyNntaaZC5$*CSu^GC6AG:ec*BY#EX$^6%F$%lY\HQSKiYn@dhGc!dQt$
@y&4<> YDG?YXt#JGbiNw<6@VVN*Kq@<Qb?Zk?NZc>ZZbXG5<cd@&*BlVj@&<JL#t@?l#I8SG>NtKVHb<nFZp99
^VeHt$ ie*Z%ubiG/8BuC&:iJLqwlVpapBd&/4%*D\=Y*d&ty$FKSj:kF^MdY6d@lW*V</YZ4=p8ik4=iL4^:l=
Kpd#PG e4d5/p?Ym#&ZVl$!RwknYX@pc5GNy@PMKI&jN=:tEw6A<MdVZK#!IHnncT/CN=:t+mkQX9%Ry+h1b^km
Dm5QBD wdhPadHIPZ9lnepDTMLA/LSkJF#LWyDD<8Dnnit=<Md$ZB#pkVit=<Id$*N^pwi<&CwbLncN=Fmk!W+!
6G:+K= qlAp@T<R5ZYRu9n$nS8Vl%55@P6liYB=MIZ:<ttuCu+9CJeeLYWNDdt8EQm>IF\+4+lKuwM#Hp>P\A\n
qNA!Sa I@hIWIcS<AhLt%5#TN?I=$wIdh/pibujA9KLj:HNMNLtbduXmpq$mqX+^!HJMXuEjC:jBM6pNpw8blnS
A*\RyE pE&wk<w\$nLPMDLc>M>5&AKYc*6Dqqwnt#W8cWPaD$%c?eiQAyN8=k!nnT\=u&GWYtdRtjN1b181biG1
CuaGDF 9m#GIPAim5bWnTt4HFa/dNI\?@MG^^$CZ@\#&b@^J?S+X%iZJ?h+@+pblhX/!L6PVAK$p*IpkjQ+/qHJ
9/\L=< /hhJdw>=6KjZGm\d*B4eG8t$Bq6TL8/VAJ/Ld1q#$i^yEi9W\\Dk:?e6\J*=<Bdk9AX+=u^+C*BZQ4\F
*WN9Na 8H9:<Bdk9AZ+H&dliA9\#CW%ueJdkGjMl:eA=!*AM?ZDY+D#F8D6!@jlLeA#$*T<Bjmt$ZT<Bdl6!ip6
?tLTV: \DpM#aXLPtX4YuQG1&jmJihZ#&^?#:R*^^HDI+WL?^ye8G!+=uRiT#!c8LBP=eIqi#4X8iDiI95C:AiA
mEy+9M 5bV8AQ9VnmMDKH@tAE!Cl#KRX5eiKBh\maPI<<GWEZkIjS>E=\@G#D<wbcLa?B^CM+J!?l^K=\?n#?HE
66ADXW j\Shj!VSS^G@$XTjR?u/FYqul4Tu54F4+D&Jp/?WW:#+M8dNd:KubY*yIVetN!a*JnhtPw&bu<bTGT=e
=4STI& 68CCpt?pB8d86JN*i8GCl1/we!yn5B$9t&!j!!bD$ilK+c&aLd4N4+&jWNJu9nFH6Xp&/Vquc@p=Wu>S
ql1!Q/ CF+&8etZVh/\iKZ\QFRk8t&:$qDT?L*:nGInjEH4A4YGtuZWpi9lPMD6N&tldidG?YS6&YSKQ6ZBcCna
-A9Xt% 000774629dd001202b3 Page 3 of binaries1.zip
mn@M#6 +HJnpp<\tl$?:Y5bJ@BJ8bKVquFPe^8u6I#VGKlP+=TZedc9bb!hW&Xyd5hJt4thyLqJLVeucYdGJ=Zq
QLBW6c uuu:*ey!i%:N&HKuVNJM%*I:*>mGYi=WjNyZ$tn/qn6eJ%#GKZy5w+P#k9cYi?/ALeDm>l<\I!5Y%=FQ
!q@!Bj %m^815!JDy6u+5Stq9C\JTeaQHaucQAH#^Rq8/+Zy&8Zc9m>&:59mm:Q>4AtGN\b$S/D+?9:Q>l%lZb1
=eKld! =#MVJNYFV#!*1?M:1K\6jHw8&S\VDAw4W#\n/FbiMd=GaC=MCq$I$=ktJ%$+&QA^!$htI/Sq?K4aFT:%
j/XHJF 5jM^4V/W+c6tka@la/dka?hndySQX!=HVp1JS\*qXl<dY&yju=Dwp^W?DhFW>>WRnEaD=e&Niu%DpnDP
cRDY*h M&uM:NRHNGa&?GR4ST^DG>k=VS<#dV//RBZ8%n=J91F6?/CQtSW?KT^VmuFl5W\d*i>^Qm*SnQXaB<N=
pjlpjh hNG>Ha$w\aT1h#*uqDl4Z48k9$u#^1MEYiBV*lCNClnKRjiSk@eq*PJb^8\?C@W^b8Xb+BPdqd9^TZ6Y
Y%=4MX Ql*99mTn>1FbVL*8$5:wcnnQQmTjI$bXk&W/#yXQP9W^bnFbcGhnFyMFQwd9a+ml!Pm?DD:RQCLD>8H6
QKc/R! *#m!8LqEF6$Kd@@G&:?=i*&<@b6V+i*jiQ5*i#/<@X9tpyyY*Ii*j<8WD&@@^88aM8ZD&:@^>t@6!@jl
1JAQZ: :h<!$*T<@h8t$ZT<@b66!iu6*:lNdKKy9KpCF<Fdc*Dlpq:lnh/+5Pdp\tXnNTju$YcDD?jSe9\=W#/e
JQAHP> S<6=6J^Ht<CH<&nd1eZq%Y:6!ZL#c4jM?HAiLijSel=6JlcZ<&k#$*TeS?9El@NwZR4u$ZIiLijSel:6
@LGlI! S9DlQF4Pw?W<&w&bqZMi4YM:e^=6J5Z\wVmQqmPL4yFF6<J=6J^H/?:%eS/6W?E<Y5/n6ijDidTbT&yc
he6?4Y eS@Pw<&WD?jS<n1tVQq\Hm*u$da9*+j#cDQVhJ^H8&p$HijS&yde#1Q65FCIkGmM6qm$\iGjC4EX$m&i
ldCAGE cl<+*+@$ypV/QpAZ8\P>*pJ@B6@wKQq:%!u/MND+9utT9=t?L=!9#bQ<#ZV@4jC9CN@/KQKj:mZm8V4?
YDNIYm yjC9YNIj^:4TK^@>D?QFJZ*jeWLRK+iF@$9+N%4TF>\5SP!Fq*u:A$5/@=Dj<WTcD8LM*mjyW%DY<wk?
+j#CJT R>G:%\lB4#AY?e*\:&^J9&kP+AXE@^u?>bd$?^+BZL+/YSS5D@?/T9w=c@Aimd+*@L6R$kQh5KPI@1m1
udu&qa @^MaHbc9ZlcF\E<4qjT45C+hJd%wj@!SyIiPSl%Q>EGKjqTy\M/Y>BHA^!Qyn#^P/kE9Q\4?DbD$qSeD
yG?8aJ *wZwJ?P%JH*N8Zk9SD<j@yXI?1Fa@&/T*u<$lywdY/INImHjcu?+nnc65WY*$Q$+hu5&6nR$J>L:u+%%
V^lRXC k@Q4E?tDnqN!<6wT\Hen?u\qJ>?m:P=P>A8XuJ!E<9b@SF?y&uuFe5D*wCl=pbKV^WjkkJD$5wFKHp+<
DYDn9T DQA>mZ/Iwy<\C@C>mD=E!WuFb#memj/epyP9L\X<d/K9X*J!#e6ab=1@iJTe*HWP+H&Jj4G1@%5wd@&I
9^Z*cy @4cTp*#5*:>K?6AmJR?9I:+9$d51?lewW@5SjV5qJ:iZCjq!eS#ZQbYejHE6hm#S^!p=8SHddADSk$yP
W5!ckl H6yF+M9Ibj>iBj<CJCit%:kiCH&1QWB!a1IQtC*QN?VESP@@wEqPVHS6pbKVC%BYK+q?6=KVP$+CjA#S
DRk&pR H%F!<nLY9a4wZ/q&99\cyia>A=TeSFBQH!dy*tqKH8bl@++qiwPmH+?!YpN$ZeuJK\ilTTQ/L$yPB8N9
!j@F&h ^$8/d\eqJ>N\nE\k?n=KVuwl#+qEN<u=!@nK*WtTj5BeJThQjI5GkecnTW:KL\L<CKKd=PS6%LXHT94A
*iY*!\ ^WyP65b#n/L#6%N!ekYP8/PJQqdJ!jGwQ!eV@SkqJ#9jD@k^%L@QtPVEc@IP9wh@c$lPVQRBX!AjplM#
\C@jP/ jaqJVp^$dZeqJ=jnMjIq6H=KVw:@AHB!HdSDqJ\<5^y\t6qEd%Z6@NN>kM<m?nhKVubBY*M5<YqT<nD=
t8iT#C JeDyZehcSNG*@S#\PbLi8yPTp\N@A=!tkhw5JTh4<S^/4ZL4dWyP65G&tE9$l=Ye>Mi?PEHTb%Y1?u@<
M5Eb&E Z<BQJQ4qTp:PSdp/mc=:qbKHL\<u6\:%cpVSA/eBj4KpH:6c!eqmQQ<WTb@>qJIVHjZJ1WS9W*K!D<wW
MeN$#k Qh&hW/#p=N/#AD?N=Lt*TW=ML:t8\Z6bV*Jmwk>akSE@plM#@YYVuJnwe\IkJuMdY?w5@5!wH$AZ:Ntw
w51aJ6 S?5V/aik9K&54wm&mQ\^iK$41b=DqS>qQu<A!uN98G+$$h+hnE?W>!T/Td<bQE8IdyLuMT@K?#Lwy9wj
?Ja>dY nQV6nHa4/IQ?#%YTjm4w6JK:bH9?6nMR4yd$ciAj=pu=L^n?QBC8pY19I<nn*m9q?bj<BJS4!c5F&hQ!
*\WlRk =jp>wW*E*&qeZ+D%pii@l#:JhZT@H/q^N^Q>9i8yjdCjPpp?@dD9dmB9F?%CH5p=*6hC8m?$4RhJ?mLW
bj+tQF =VhT???1?I#B86>EM\c+L?%Nij=%d\Llbny@*@l+L/lCj?AYwk?Gj%QI4$Qi6=L?&V$8l\YD:kX<Eb&@
i$XhP9 MH=jBeNSH@/Dbkhwh%bJQ1hlG!!Y>AtQRZ&wji4Sb:!Nbm%9IE>JZ+n>6aT8m#cC^8M+>I%9q@Tt:/B#
HSB*FN TF@>kL:4HTV@\Zm@=:?L686PTZ<e:EXu1ReK6pjhjyip4%&y?4$Z?mbLJj*%=%T@j+F6i:hWA\Zu^95>
n?mICN @#V$Gi?li4/6?9%X%DQLJQ&\#%Y@H+uZ9bj1iZ!<9@J9Zk9+jbJ@+aJ+9^eM\nc?u<+@T@Z:G^<D@kDS
\4:KKk X!5?j$ejj:upW*Tq/9jQWW+iyQ4<wQV<\u<B@yA<9#m1?u$b$qiRQk<y@dQkceAjJ91^/4:iSD@@EiL#
bk*?Nq m84*n>GQiqVTP%/y?9$WHI54Jd*VW6Z94?F+jE#T6#ye>j5T>E<iJ@wb16?@Bq\<RjW=YjZ:WyVbXjL<
GG9qJV Lk6W9\@A<dlc$u96HP@*@H8R>mTb^:*n@X+\DG*^W=I?<Y9X:<8\9>bI?1Rj+@%i$Bq%#6NWu/6X?>!A
:BCww& P8Ebij:luXS@LdkE<GiJ*qPN>+Z9A?W=TV?mX:#jC#ykQj>J>MtK#&uw?#^Q>AdX:/@n*QAFTV>18B49
>@RW/l k*C<9En$5jF?L!nBN9\Z$biyju<jdeNcw1>S>:WEjjmZmL=Y>j9^PHh+YhKQ9p#%?>Qa=/>I?8R:+9%i
T$X1P& 5AQc<Xeq@bkJ16<9\@b=nin#Xd?jn*P9%$pjZ1n$jDHc$njp?R*FT5>Q^nH^y1R@6+91>:9R:4\q/Y9:
=WtFAK 1u:j?l&k9E*^b$*%?*V$=h?l/!=Y+*$X#1ZiJZ*iR:ZQlcnQ*/Q#H#jyidTJ:$9/#D/1*:>FHl?R@6>h
XAhqb/ njibPKj=pPm%y9GP89Hj59:ZHlH9>+I!>JE?w9Mnc4#Z+Z4!n?qybX<%*1jn@PWVP9>E%i<@ww*/qPkZ
aLqH#Y K#*jB@8cdHqpki4*%dnM/#?!Q9NY1H=@AMjmb=J?8XD>*kHq=*QTa\Y1*@@&K?Bj!QQ9:/*/@e&bRQuT
nF!kG6 HI$lQ<h9nRKSQ&Cm>%>9<yeWZd6895u@5iFn?E8t<$@?S5qdX=^ujTZyy*VAPatpH+C/<G6JQ@%AbX@/
$lw>MV aP^lQX$ZbL6p51RjlL4lG$p@h+V!K@4ktQlY$5<dw@SMB^!#*^F>181Z$ckL9!i/48S6A64pH+l?wyK*
PcVN4N i#BG<1Ppu#>j!h6!jE:!Z/K9XQL&QP1ju+n?9JK**nnQ@XuTL%!p>E\H6BG@EH&bp4hu5G>?qjTL8m8@
qm$>4l a5!&kQ>G>D*WPLwI=!C@E**j8L\XVEIj?H>E@$uJ&#udAKXN$lh$X9dqyCF^X%Nd<ICT6\Z+Y>w=ceEu
RE>?ju T6/cA8nDp*!?beS6wm%/wn\<8TV8#&5@RX61Z1J@FQjuQb?NBwL$VdXL5V>:Tjw1<NM$!W8:4AVqWNLF
HpSteQ GhlHSMh:9FnTL:wWbaQw><ZuL>y*a>A^wjG%KF+j##KMAe1+uLct4/4Q\^?kk$D*%X@Xy&=HwFNe48wc
:H*>wp Xb<#$SiXeVq6?V/1Q9=^cNlJu9iN%<e#EPp!L1e>QX#X=:TbcMCJj1K1#&Zkt&k!L1hh$WuXb<k<NPBE
5MKVRA *$jXb\ZaRK$4$RjH//N>B:bI/$d$6cw?b+JP%p4IV=88/6MN?pTVT%P%b==X>Vu8ImB$y@MZ19w5&R*w
:FIdMj &^B>qc4QEaNS>8n=+Mt1jjbA*d+6?X&#XH$8AN84dTi9??#:1n:VwG:cZ<lP>VC%D>kR4ThNR@hR>dpF
^:M%tX :Lm&QhE4XH$1wP:cDpR@T6ZuY4kZdWim1#mQ=&L\idTAyF<N9ybH#tj>V+Hh$ZcT>H6Ad4*>JH*b6ilA
:@Z4X6 ph$bHNiH@tdp9:PeN^WMWu\c$Qj4Lipan+*^tRh#eY$Z$159K#=%MAc%ZTZ>\RtK#?h+Z#L?1c&a4Qk5
>%ZKnd @=#mG9D^1QIH@JhmLILmu%hWKD:hRba%mu>iNW:^CaC>$!n?PYch+uMS!4PMj*1<@nkj*+<wl#L?/jF*
PY4tkX XH#G4MWak1#Q19<yQq:\$#Rb@>SY>#D5V4Al<ZtE6l49a%qnMQMXNStW@\hRT\MEFAACAAkA<%S6JWK6
&@wB^d #8?4HAAAkC+BAC$AAABndGqqduS#L&Sye&59dYFnL*B!d&yqa*S#L$hqe*SldHSRet>nLuB!cm=mcY:5
1XlLhk ZR6$Y<Ybum8@uRetMTE<w=JAAppet9AIlpIe&W=C:FmNuSi9SJaXS+q5ZTTbKECZWGl=W%kc&yV!KwFq
$q\hTk kjBiZ1Y:aR@d56DhF61#y/e6LG^yt=:h5+i#$N%Dq&%&@yqQ8uPqi/>pT+Ea#b@+%/@@Z9&ctj<%>:>#
hI=+DE S?!\bbFpKlSLBSQ^eI8b&MyGCh*h\WSk*awP\&Ib<*>GL$@<8Q96y#a9Ziu!\c89d41b5ZA<H8N919mu
<1QXlJ =nDn8A?bMiMa^mc@\Hq*G#=LcCA?EFpZTmTm<aTjN*X4JJ^mFRZXCtWAGK5%&IEDtRMHDwDL&QFGh8l&
RFe:Dd :&d59AQ$n:MM%qDdHS<PliQi*#YHNSy@:>8bje$BR:TuJ6S!ihSpGn#kklXB@@q6c>8an/!<?ZuYmAPN
E4ljAD heFRiF6wMPL&!Rp+*yLeMiS$jFL9ntR1MlTIlbLJTDL@iP*TpiGBYMT>cWaS#c<!^J>qVh^VnbIH^eiq
?VG6<R NJbykA%ll@ES4*C\JP6A%huZNeb6SwQ9m9\SMXkbiqkJaLB/^a/MYR51jD\tneK951Mt9MHG*8/dcn^d
<1=AX% >W%/e?\DnH&*XpuR4Wl>@8=wM5#WA$5V<i*JTMLG/^mIy8J&Xth<PGXnuB?/LJSN1P1B:6BkNP\QlE!@
A9/4bA mDD?RH#InMb!95E/1T5/9M*%wJQ<hhHl%RFu1iuFb@ky*!?LDPj^Hd/H&I+>TAR8NM&L@a=MJ@tba*!i
^E9=j# MS\hHp#cD9dGS^LlTG>we+S@YYT#:Xk\qA!Ha5/h\VFHtSq6h1SVmbD>WGAptawQ?XhGht!QJ\d5^>4C
?$dm@4 +RnZTDCW&tI@5HRpGl6\pudG+yYPQTb?i#SJGYTwQ:jqhNBl8Iu6NN!BBaG=e=*HRB=!HIJAb#eZcB?X
?VEy$* aMC^5eS*dT\hhGk55aMhujp<l\=\jq6!mA@4eCStP:A/e4q#9@yCmeFI!6<dTcZ!P6dJ#@b*l$^VHDFh
h$Ba1! uhl$<tLV\a*NQD<&ZS*bLM1VVW>ZN4%>&jS\b6QNt$$Zh#dh@Nq$hGnV!/NNV=e&9Z#c>HJ1$<84VR?*
-A@:NH 0004d3ae123001202b3 Page 4 of binaries1.zip
&mXA/9 N4*<&uS%dNQX5$$*%#a>jh6$eY:V#d6ND@e&Qj#dhHB\$<*DVW<ZN%%<*HS!e6QN!$%ZN#hh@h#$euVV
@+J+GE *hM#!lje4tk!Sb!BpZA1Gl@P$:=!!Kb:lb@:%e1l9C@PHLBbm<JZdTYHdS9%uGMa<^^8buDX:6q6JP>I
j1%@I6 %pLWI>I?FM/K%j+iM^Whmq=8q>EhC9j$?45njD!kQiYkcqI=dLi8KicW\!Xn!tZq>>btTA4jbpd6pj/S
T^R+*m \V!>T/=N=bKX1&*J6T6c<t\/qm^X9SdH%u&Lnb=dnE\Q$YK:KqXtXw6kTkZKN#dhTXc?&mSj%bnFeYm6
#RdAa4 wmiLRTyT*6ucdqPMbNq$pubYT6yBK&qu6cTh>JJ&WE\/Z#NyF>Yp<*TV#qhP&qE:cWj%yG*/TV5wKP&t
/%ZQ+H wZT?m6I8Pp4uKTq6%%I/Z$%yB#&qHSVXFw9qcaq+NlWSI%e@^LM4l#k&#SBDXW9t9c%#GTb/qutd/ahw
eF&CyF u%$XFm84B<GTTmDTykFm=A<@ehY^#:#Qc=5!/yt*NPSbYttuddCJ+SCte1e<Nt/P&?hM?TSVui6bHJ9#
IPhV4? 14M:NbntjHZ?IcjpphMI=ancpl^&j5^Z&!VGK1e^C5?t%b!9J=d/9bu*mwdWd=LnIjBkJPGZNy!J?H%B
jeNMQS Y@!m#*Yp\^GV&y9M##t=W6SbRqbWVw@#=FEDe\WJV<yK!HRl:/McNGk+!PXYCWeyJeQ=<6bb65mh8Wu$
CR$nhe bj=ZA=48/NYC@kd@1\Q>GQ?4B@$/@&5A@X8/PRH/@?k?BL/?tcPJwPhb=W/nncQJwC@t/DDRq*QWBQyP
u#9G@> nk+H@VSHW$D@M$hVRj?Bw&deH/C&H\H/iI/tkV/Vw!NB>*A$HZRM+$L$NS\hDjw8nw+B@S\XXEG@!hF^
LHeRBp wN?u&&YkQ?FwB8=#pD\@/FM=?kLwhw=PAH$SS#NBn*A$C@T6HJ$I?lGPVkL>Kpi#Rd@D$S#RH*J$M8/>
AZIy<Q pZ=PAW%6tA6/EWj#RG?A:wui#qELcByuqPG4cb^QBj$GS%<E@S8PFwKt@m/ThA*y=DVRJPN$$N$euRGc
PRZQ\S dPqM$Nh^6Bn$Hw:PA4&Qw%dRd*N$N8n@+ike*JwmY@kTcP448cCZe*Ri/E&bG#ie*5FSG?lhHC$F@SVh
BiAAKL GRd>D^!%k/c^:RBNji!WhB*b%#LRNN:LRbP<FcBJy?iD9w\n*L?88+PnL6CQ$+%9$NVjXcB@^XEQcNJy
XYLRS4 WNL%p?GVSJQ?X+Pt99cCZ56SH?kES&6AZ<@SY6D*e4RP>I5e4RhN>>5*kCd@9RA$?i?Fpt+ku:kINNuC
S?k5Ya ^cCyH=iADuP$EVV%jSQwY#kKkZ/Rw*:RQ?AwDJ4cMAD/h^#l#tMDnj>t*QPpiDAIt9^tC&m!6TnwL5R5
E8+EaA w1tN&$DVHY6MNB19=Rk*SS6*e#RM?mGPeGi:peaHN/ed!h<9BW*&u\D>J+=\/*RC^VueSJ^AjneCt9#9
E+NHSW M6Bpy>6Bp#:VwKpjP$Bj!hHqwMqteI6^\5MeZRu/ba/?A9wuHQ$F/N>#hBZwn#uCnjiJFHi9Bp&^=/8k
=^Lkn/ !j?8AW$&jm%w$9@ZRFQ@9k/cZ1<DjR>H%+N?p1MdRQ<hS#iCjw8nt$CVVt<GViN&C?=/pY*jCuwGek#S
LQZKRZ FFh8A$&?iD6w58Y@BE%&eRhwG1h9k1d9*\Z/P^#hCZw9S><CVZ:*dhAW**cD@nXH*\H>Z^#hJiuJqDP@
R>J++^ C=y!!N&kKVdjA=4m+4&kKTdeB=y<>H:RbPQjA$%/jkA$>ZWQcQKSB$E@#>FDwF@n/K>A@=Knl$H@pcP@
Z6mmG@ q9Sl=CPQkKda?CnwN8S5wmpG:AXN69<+cLKLJ$DVtD$JttR@Bb4<+tuR%J=uRQ?Cw&hB@!hHj\Q/#^\>
VTYZB+ J?pt<w9uRXP8iAE$^e+ZRbMj9\TcdQ#:wMtPZl:n*Ph&&M\h5JFdaF8:aB9jkt&?CQ6:Cdc^G?Q$PG#m
LVPMwC L6nA*hD=9hD^4Sm*J>Hiy#BGk+lSWeTpMGLbN5TmIeVCb^D9upW5m5Ni9weahCqmVlI^bkR^bRD&5\jn
Rj<\di @TB5bS4tPhM^4&uG@P<I#G&P\X^tK8cCJ&IiYI%=Z!*tiSM^V=8M8hnltQeen*tPH@PcE/\=tbnQHIc=
eedjR! VD*tla&aB=/D9H$8<uR4=nNuI%i*IVijlduNT5^4V5E<bl:tLR5^:#kNe+5#pejdpde:pciZa+=^E9L#
E@<aMm /enNLbnuuIy=#Y4p$V:p#XZI6&8SL>enZ#?HuQ\<<8WF<MiHpTe9Rq/<BHq\E@JiD@##Ehn<w@DFL5V$
^>&/&L 4!CGZ+YeeAXm>>YI%h8SE/=BnQ+ca9J%mME*IPdibPWSG=Dj<HnZ6AhV=JhJI$aX%5ebBmuHWP=JMHqu
EAIQN: K<p/+!QDA!G/Wqh9V4cEtTk/6eTm@WTJm@/Y5MuMRdM:MmRQ4+y5J^cuiqMJKuqI>8yIW54td@uy?Kn6
954lP9 nkmh^5ZEE#9+kXd%i^QJSJl%Sj9>K+dMiCLqy=yah*Ch?ubyKBcL^+j>!!M^@8Z4@LKaSphYS!=u\a=P
S=4M!H >YT4wmH4JKkm&4=W6qB<e%55^n1nmTSXCkiHI5My%m1ZDuE:dw**d*Z=YP+llT8\HE!@WmleFS?P5L#K
/tZu6j yX1%#K%a&18X?eX>yTTnXm*#KybKI>SKbW/XM1hCmi1pXii^%Tl6lWINl#I5puHaF$EyaBH:pP&<y<wi
K4nw+K K$RPMVLZ\p/4<=nB@/4+Z:XQ=lPSX*#!YI%%t5k=l9m4pk6NiRk<pIN4Gc$jNFl&EcGBhZcTqeWp$cNX
TQHZ5Q +66<tT6t^@IICcuP>FNh5!k?9CB:up@$Ju6iqW&Mel+h1M&i=*PXS/NVX<S=NHL%Sb^H&d8lmQMw\#eY
#Kt?%j eS=q<RtF#pP&4#i5#*n4w$:w$FD/ym=w!=?NVISCy6kZuEe&S>QP1qRZJB9Yp8j56<4t?&BdXbacnc^y
G&Z*IX =SP<hV/quPa4$ty<5piNSb^ZZa^%\a@1myBZ%Hp=NeKJTw&\YcpS#qB1lQPXG8GbTw$\wNRI8=Rc+X1q
PeGmDl SllYcwRJ1$aw=pGwEa4=VGbJ=J%YnXDM6XAnFQM\%AnbD/$cIj8bMl>>%/wS59i6GmH:$KwS5n>dNWKn
XBmJuu &1wSGlP5G1F^kqWnNE/!cwVGcXcN$Dnd1lEcZ:J1lMc=Xw*R&GDXCI&+XTM$S1\cwcl>wpbw*GVXCI*d
j?nud? 4B1leb>XI#V&YnXC+\hYnhB+\/wSG4?\cwVGj16GcH^p%RlF*SR%Rq?VXTQ$HY9XCH%#4S1l4>Y1Ej4c
G$Nw9L 4B1ld/XXI@T66&1El#Re/*C6eR#$QAp&+aj8nwh8b<E?tnDt<=X4m=t\4#uRVcd8jtw&G<u^tk\@tkm@
\^61!= ?RJ<4AG?e^n5?kVa<RV+Vm%5iR4G&wA>VB6V:&9$59ZMyMSuZ%H6PcF\t:TwKRbVF=><FILuInuc6bTB
NdY%Y* Scc5M>SM1B@WGbikH>S^hCj>wM:u+e/^jqDH=yCn<K6SQKlVl$uBNEM>6Xy<>Hk<CQ6#da$XC$j+XJPV
\i<SmR hnFD&5Z&a@V\XC\eXbX9F<iSZS\+<J8biuk1F1y\wWm9>hIidt>!PpqDlWP>mB5$Z//1ymIE9\=w%cNT
=lqdmW +ZN?KnMePLBE9nFc<dCn6w9K6ketd?6\i?ARm@auY<*N5hb\jGkwQ1^6w!Lnk=F9D$Pl5DcGT4WH1y<d
:Fk/hX iC16h<Tp^Vc6!!PlkWkm1a&mA8&l!5Ei81L>mXAmG6EYWZu&WP%kD@!hDlEXck<%$l+m1WS<i!T^Liu9
^8qX9w VaYGB$KJAd?MEn8$TXTWQhVTMwm<JdEcNFRRKC9VK#WkGHKF9IcKlkdtc<y:htJ$$B+jGX#h8#yR4ma6
IRTSQk /?n61>w9d4t6h%^ieqDTa+Qe+cXubI\dX=@HwT$a:BJ4jK4d8=c6D&?LD6ADH86/k\FS>Yiq4akbCpYH
mFqJAS Jj1M\P%Ske#T<TQ#u5@JZV>icPt+>*L^Y8h=nX#<5d1uy$<>+q8&ip$\e%bh=wE4@wYhK:ywN*RD4#/<
#uG1PD %8G%Y9te4%F=RM9/cBXic@Bcm>h/61V&w&@M5\*b?>9iLVm8%a/>$qATdN#IdVH^ti=CV\8:14R?HaBj
leRDa9 p$+JSM$6pRVFmtA\pJ>*^yyXG5ZPZEL&GB5ZcDjN19*mRXRj^\d?XVk$#\:$6HjM>5>8d?64+!@BFaG?
mBpiIa &SXq5*yBK!cMS#k@l%6JE$ch5n?9Kj9kZ\wwD#9tRBZ?iN=ydJIqPtWL!S\+Yu^FmdCJ@:Ybb1\ee41:
hTNCM> 8=aYPp@bZID*#Qte:tBZb%up4A8$q/Nj=RlXJKi9a*%jT@<YFp+t>:G14nTdi8&AqX:um5&BdN54bK=C
A5Ve+< dyLQWj1Yt#>qGVpF\t%&b\dZ$euItV8*QHLCbY1QYT+=bqupSNIt8@?Sje#*@Zw&>cl>IpdR?&udJkyu
euMn1* yX$9mBj4*R>Fj5CQ<:?>i+#\pXht=Y\yVX>NGVqtRVuaChY>a%JPKFpiPiE6yjS4y!LH!^KLqyMwPD:R
hj?\^S tD5IPWt&^e6Q=Zc>VDm1t=?8D@RWnGN$VtiBTDaRD+?WI@/MwdVuKCi=Jhbj/D^qI^lZA$1tS5wml/CF
*>=\Xu D%Iy@cKL9cbCN<ZGi<cqVYVKpZHh=bRy+@a5Qh>j/L!ejapeaX^ud6hinVJ#F=RVLqN:#HLJMe5my%Dt
Bt^<F5 9uV9$%dt>9%L!budyV&n#>#8HS6h=m+py<nM:TJt%Jt:pJ!!bi:IIQQ\W=1^mS>ne5#eX!:?HGVeM^b9
n5DeLN K$9GhbXV6w!:Ln1<cKFj&aR@B!cMKtJ!PYYJtAZqtGX1V=GS4yCean*bSe/wQdtRuEVBnCJ?tcGkJ!em
:KZ*VL TjdKE#!C9*R>c#:yA@b%a=hB:/i?<%N&?B9VTWkpCYQqu*pmad#Cn*>\^p6VZnc8cd4ib1pienLZeG#T
dF:<m< &?L=Qd8ea^@L*A$W&#EYN$Q!$BmZR*5TipBQ@>cCel1/A>+46/aG86d$<1=HNliIlj\!b6k6Fm+Se<#A
TnwjIn <uJW%5SeqXVl$S/uPYd8HE4MXe5kS<\^C<l^ttPPcW+ZpJ=V$PIyRut%^!GZP4eu#PcYSW+5Yclj>6<5
F4W4+i hIpIQGKYy#$<aybDDuiLW8%b!mp6B#aXPee5Yw:JKIS:nW@i*NB^jGmPYSa=BVJVAd@I!W^n%u6YVmyb
yaum*Y el!dICcQH4F*p1kT4P%=^*hV5*9phRA%<tc4BGYRE+kqp+!:e5nde/lj#K8iJc:8!>AieXXiBntb1*I9
u?k:l9 PWXjqY?q*niZND/+mwtcH8NMW\**1\<yl:c/a4RnYIu/Eqe^bSlueSXVBnqm:mQMpJZWL!GHNp\4eZ#E
G@k>DW L6BiaHS*B$6iGT@tWIXY&$@ZqeZK4m^/kXMMe=+>/54my%bbLMj55Y!X^jFX!T6a^qM4iTZC8K@p4T^V
hu>8P5 JY@q\c*pKV?T/u^T*cGY+R:JCF+G#@p$LdYw8p?BbW#nj8=V5i8aQ6W=m%:HXJ1eV*9PWuAh$@lcN%V<
9CJ959 uKXA4yV4ln^B4^5cZ?8GC6*EbJMQ#d8a+VK%=^C:G%18&9/Y$9R%/pk*H8@PipD8*htD/aFC#mF$h%d9
=*jAwE ?KplF@TPu^1e:IHyHV<%ML*ny\bZi>A:jt4RP*=1eLMH9iPuB4*ny\a*i>A:jt1wiBAd%XS&RNA:jt4R
Ka<tnE i<9w9YZ$*nKq!6F:!*n%T?<6\##%49iYebYn>=aby^qZQ\E!unK*jkKpNDq/d^t>6+#iY/cWnK9*qmp6
J#8pIE $8t>bh#p/L%qQED9LcQ*q6F:!?m>beakS?<6w@iY$Z9LnPY1ZP<6+#4Pit?bWpDMwjViM41!/Fqb>AK>
VVP\tM 6+#iY<b:%1j*quED9diM*q9GYa:iY/b$T!&1:1Q*qmqXn6=dS1>nKqYP*q6G:!$#98a?it?b$mKh*q9t
-AX+$k 000b63a43cc001202b3 Page 5 of binaries1.zip
A>SucK $+q$it<bS/nw9YZ1=C@Hq9KD\$Pl/LBEu^HW!=?=%V?cuAM%#DhF@ua>@da&#!:=9/\>%l@Qd1VLJCq:
B19!IB nI$L6J6t%Z:lFD+th!WwDu#<M\d?XVk$#\:$6HjM>5>8d?64+!@BFaG?&bW$AN#94/I>d@J^QeQQd#Qj
uj$yDG p5!iPDwmXDVa>5#!cZ9R>1D5pXTH8/#/tZaNFRy65XmqB\V>VL5Gtl9W/BW*:uL$ml8>+1b$PZ4Fncee
:j$IP* 9iLGi*#$ml8>+8ckbVm>+1b$T!$G>I1dp8ZwFVh/^W&ye9TKG:*mbu#NjjTKt>ImuX=^<?qEP4*m^lE1
Kq4/?H i5XNncGZ16BFu<EM<X?M^pRM!WS4y*pZJ<5j8t4:eeP\$+c!WGR!Xn5J*Lkt8KLFVER&S>QM+/9w+:c%
SeHFi4 KR%el/GY?El1:J$@n+P<6DF&46>b?tCT9P!dNeb6SwQ9my!?:C!:B55!tAd6EEKqAZ@QYAe$P=nWp84&
QXYcdC 4tZ4\>8mA<FEjP8/Zy:j1&RVdZa#&lXHlaB<85ww=SNqGe#1\5/madT\eYM!FW1pQ55tGD^cq4^MW@Vn
R:Gqc* 5?^M9daq=%BRPJ?w?RK^jAt@$N6*<C%Q!T^/+YWYKu:lbZWbdMCZu/@GHB>F!t%e%dP14d8nyYN>l@N=
mlM^>p T:JJ5n4:tn>d?n#*djRVp<@#cPlIypFQp#XwKBcPMI\CH1Nn1kahW#Xw$DFXk+/yGnRemnFX%pJP+H<#
Z?\CWC td\nQ$68I<BPSKZ/JHwwpMN5XE*tWKYY\<tRik14Fc>#<Z+i#y>Qh\k=6LCJ+uWB1l?u+9YLPH<lZlhJ
I6lnW! ?ZY<He%5KJuKYTS!#E!/=en=PR5ab<&p==<=Q&jjlhuWu#teH<*l4/RmmJSj6h@mL%kGPVE:j?E!Gn+y
lbun\P Z?Wde#l1yL6V4P/6J/$^Nlb!NFH!*@kV!>ccnHPy:=L@yZ>nDKQMDG4*?bJ@>!KY9Z6q9MD@eQ:!t^nD
p$kFZl 1DMj6cFc<4i>!SlGu@u?\?LQiI<GE9\QPLyS<8<mH8+@XNF14XtT9+<Yq#cAj\>HW!S@%%41I@nW^>5p
Hp$!dP @?V:PV%B<18ZYP*@y$8w:?Dj!N9jI9pQ:PKMTbJj<\K%RjJn@<:wqy@p::Q+pbe=jSn+4*E=Q5q@LRkd
Yp@Wl/ yY/@#6Fm!Z@h#?uDJd?P^u5T>HI$>RX<p6e5?Z*W@1tTQ+@/9YRwqa#b@YViC9/Y<<$e@tpQePRjT5Zm
eJeEN< h9:<G/l6@Q^w#9q9Yud!Z19\I<u@qYWu@@8J<C9J@:%qJ#heJ9^M\PqHY8Q<\&ZC:!R@bNuJM@8FH\w+
8M$aca +*dLH1::X?GZp4>L+XeLQ=Z<*bch4E$L9^X\=p#LVn/iKj^a<yhbh9JR9@B4!h>k&eqLS\p@q@\@YP*@
N?NZtW dbj\i\GLF%q&eulR^AEBb+W5i*n9&#R\+Ee6@l@9wkEA@%LLVy::CZXI<q8Vqy*<N+*NtiA@c6uJa!@T
kSW4KK PiC@aNuJ1<?RaPl*6>T:5BPqj6^!FWi9\W+W@6\:yD$IP%H=D!l&w9Bdj<^68t5wNbkVj>1t<>QtDbuJ
VbT@9@ 1J%@$S/P>kY:pmqY6@6aVuhD@pw4:1uu#@>H&Z+#cdjQ8hVHb9DXh9/Iw/QlS&>#iyZp$$L4J1uj?l41
Q1!=6> a+@p>@/e6%@ce@&F>FAKXl$Nel6i5E@!V#?HM:+5?a5w46bJ@9BHuLEc*$8^c:4p9$L*Au9B@>n!w^>N
$qGh%C +*Rj?pY/t!#Q*$9n5Ed!N:#L=hhK@qEQe<bcuE>&iI:p**A#y>hBn!hce6d?t6Q4Jj@mAT:uq&kQ&j<G
I:Tm#B uL@I<6>Q!N+8pQ\Lj5hS9##@$j5+jTHPQ!>4X@X@T&N\Ejm>T4>t$ShK@wZ$I!/9!9MZW6!+SQI*<n^m
CdKlNy aH^8IH9iKQtd1H<QT@/h6Dl&E?IJ/R*?>Sd=WRnu@*>y=^ITXSnFeb$:$@m+N*1wacIW%TywEbIXpTW%
=Iy6h9 /\1K1Ppl=4VTTS^5+!LNSR5%6XK#56LW*qcY&Y6XCTEFFYEEySmIaC$TkmCK94@ju*Mtchj8+<h\:4uj
AN%d:? ?b@Hbd/b?>8Et@Fclq#k$dDeTwq:Wkk%qWjQYqby*EN+ES9@\4%uWPQim6#l4%689NG+h\D\!GFSm5R>
@MNKR! ?B%>pD>kC45c>@RY5?c=y^X:bH?Tuk&dNj6=:qPN%%4+#CNyB?bK*IP9i\#kK:HCT#Z8MhR1#lHl@Yyu
jK/qe# A&wpn^+ZL>C+d$ZN+*!S&/^^H/+*//nqpY<c><Ejb5&nt8FT4Th91<&/nL^c:!9nk%q#*9uayHFjnd>\
@%MnWd +SHCV#5$:wE/A@k>?Wmy^4$!#c^=wHp$R?Ki6PmuYXiRd>K+:$L9QS\@HdGPPVPHSNcHPL/<QK+i^9GD
lY?SXJ pdn/>k<:$@W\nw>6Ed%=YimJhiRtuu:d%>\c&K!*jL^N>Pdqw:<j6@^L6>ut9jd##dmuBn6GJjyFd>=m
&A?R+n =FAn>:>Y>PdYVyq%E@*ZjQVYX=u%CY9Hq!w/<cLIm=Qp#$X9d6e4R$/Sb+4i9Al!9=q<8>l^G/G4F55D
\*u>lW ?$S9Zlqt9Xb?9pn$=p=k#$>d:y<uiuPHwN5&<ynw#Y&HJ5@RVqV8!*$HZ<=cHq\ni9PKwdh#=L>Ed%+c
44d\H8 ipT:=euywni*AZQyiX:*tPnNC?F?L@D#V$S9Zk\>=TL#Pn16p@Lawd@$pPk:I9*c<YMt:CAjpH:6G<E>
WDm8\G hjK/@Zl?5d\C@q<mj\@:qphMd$*w5n\XjdDJ&p>G*im&*N$6<+t9H:H65h^=1j/E<b^$tjaD+w?#D1?\
khRFKm 8EI?Ij++aeV/K8PdI9++GjDlG1@dyj:5SN?=d4tZJ@++BcMw1LT#WQ$Jbb9%VjJ68n?V1D?>6FPq?#PG
G4>/!\ ti+Yicj/5\Sc9W*iy@:Mku:8YD=:5?=QFYc*QuKVj#+:n\Y?aw/>c@pew&6uyiXHl\!=b@u<F=L9kZGV
1!Lp6K P\u>=J@X#pd#:JB\*@L$TdW#lZ+^aHqt66yJSc+<IM>VP:*I>+iYb?Y4uRL$4piY==TyuRE<E#\tl:dh
4/A1\8 p5Ib@\cTtIN<4Tpy@I<j$9$BWE5DBBRAAkAIAQSWdTZFM$H4P5\AAAA=B\A5AAAAa&^ybY=$e!>pcZN4
:/9WR> L&%la!>\et>1bYN$e!>RS%BpcZN4RZB\LuB!cm=mcY:6ZRhkHMZX*n%X!#+ZZHC**H9BHhE5!^Xd64Be
ql8eHM cAHP$6p?Y=cPP<pFCL%DRkm>B9klqIVRIhTaEn1llwSRR?<%>PL@i:99h9d&h9ii4AN56G8@uhtbV*P:
ADMMt/ 5&>t*5/<iW>4Z#Y:1ncYZFMin+?JJ%b4#V$1K/5TFe9t#6SXW6HWIk18iZVB\P5Q@MN*Hu>+^BGuQ/hy
F/IP4R NR$NhdnI$#S>tFbWiI%YXQR9VS5*V6NCIV&pC1%w1I$8m!RT5abEcXYmaZY$yqF4XWi?XSj=t5/HylZ1
b5h/<t &8dN1a#Nt#qX$@41F9!ee#S66<*$D$pl18586&m//Dh%4XnVT8n6/F9??%4?=l?5*>i%NwYXDjYStkdj
VF&#^> b>YGcTZ/QcHD4VDn^wDSCmJnDw4F6iD\PjciY%Y/i@uTe89Nq*BGTXFXyGbNbGZW/!@de9/a=Mc%d9ul
+PpZTJ /w*J^8ncm4yIMlqNb8aZVt?14/&L?uFZ>mNQN<nGVZqC*9W:RmmqJCjX1>QhkA<dt9!/w&ptW=5uDyjw
w</Z\5 9>QdlA:PdG>Y#aTdWW<yqK/bdh!YQDI$NjS6*lX$$j9@NP%<>M*$5>Twhq%l*y6^Zc1%M?1t9*tHwRFG
cWYH6t 4i9$lH4R@IQtH#V@H:@=t!e>+F8yeKI/9pFnY*q>=G!+PCV$ah:jW<QFlZ>G=E:Re:4J:!Vc*\b/MGV<
LJY:bL 4V+R\aYWqtiK<j>F<AjR>jpt9*<D%CHteLQL&V#e+F4nu1FkKE+48Gpdk+YtHYaMKdb#umuF88RWtE&\
1^btCi 6S?Fi5dLN&JFS6?yt/>Pc<j>cDh<<5$\Q@qtSJe*4eS*Z*SFdIPhDZT8X#Z1/&4Wy@!$H6tAG?@Q?98W
LGuT*^ /FBk>8Dy^&YkF=Db&:iV%4VTNnm%MW5GlV1D8wDKVNK&S>nN@N*R>tb*EP18GS?jwS+ta+h/kpew:GW?
C\?kXB T/m*XtmEjjm/L?Q:$R?=mpFtPJD^k#ke#PWQ+h<j!8uD8L#ljD<n?QhHMu+uA=ju\59t8Vk%4Gl=$+\G
$4+dT: y8qqAaP*<yGPlG6D$A+SS\V<EQAD<eM$#j\&M*9caC#p5VCpecZ\8Mi%wm4KGBX%+cm+Ra&PtcNmTDB9
CAnh=J y&qQBK?GZ+&HHPwRW?RNIjW!dJMV/jqy<qA:u8w&Z8<Y*H=<bZ^GiXZXjKQa@Bu#b?>b5!bYT:QS!/14
AYZT#5 K4V&m5@\jd&pct/tZPWmkP6KYEJ\B?l&Fyqw!1ZAbFi6GNRGXAJ1c#A6BH=Ri%BH$KYkG$A*kY+B*Rt/
qBEFSi C@R*$CdRQcB:RjiB:ke>AHwR>DDwEhBnwH?AHke>CZwc>A#wYh&W@J<H9RB/EjRT/GZRK/DZRG?C*kK>
NkM@pl DZwH>C:wQhD:wA>AH+I?AZ$G?l@we>AZwC>BZ+G?Bu$D?ld$Hil:$A?k#dyXQdRTwNNEAPyEL/C9EPS9
ij9=VV B?wM/kL1C6wi%AQWE>RL%B9WS/jJKE*4B!wF>ReNAA$EDRINBk$BDRWNB+$AnRTNAw$GnRGNBa$D:RAc
ma?jIN D=wAtkmcBJwMtkKcC6wNNA%WDywP1kDNANHT!C#RdNAe$F#R:1B=wAYklcA1$B/kScB1$GLRE6BT$DLR
dBaDGV u1C>RH8D>kH6C@wXcD@RAcAIcDtwFlRF4RC6BK$C^WCNwCdRP6B/$AdRS6BBwINBl+APBS$PPkJ$JPkw
C#AqNM $NGka$DHkw+DHR</AZRm/CVR!cDjkE+B@R=$K8k$$PtkM$Fuke+GuRM/F*R?j#*?t+VpIp$jTXJ*B&/Z
XIakHp p/jP&/KttY1ZJD#98cuq*hS8PK\L6+pcuuuI+iH&iYYNNY$1w+tX$hKFVa%d@n^G@dn*Y*qY:?Q&AciG
$+>+<H #S@@Vwy$ZV/D+Z:59*?!MYKeEn@QAtGIyZR=&9>\jEBV@<e5k:<>#bkC\jEa/A5pjFHA:@FS$JhI?DKX
w#LBEL <A:wK!&F^@Ei/G6:\9PcMX6nJ8BQV?e=Gi$D$LhI?CyX%pik:@#?>A#:u*/QlK@6j@1D*=?icj@V#Wn+
DKSR&G ^9cub5V%V?q9T^a5ZFBiPZQM#D%u6tRt%w@@cG446tKnC>BD#Z#bhJ6b=w16B1Lyl=6E>=!LVm&dKGZ4
pJ^elB >LbWpDHPNF$D$p9\9MdTedEYHP+jBq9ZTwbn&LG/jZPcX?98<<h=RA##jhR<*@\Ca<uQ?!nCq+NjjnER
8YBaGy j9q6kQDLL\HCL:<6EH:=:aAa=n5%*<+*9#$Rj9phkQDL:\mEZ*+uIL##$#?H9?Z**h9udZ9N$!8&>Q9:
iAa8X5 hFuu:\F@diQ<bb6\$i\VLm%bdtmGVJwVPT#dikSG6QD5PVN+6S5jKm&RjZFVQ<%ZmmE?=Fm&#bGI6cWm
4A*GkD lqMcNk5INW?p%4ikc:N?/ij61a1#>FS659SWJXq/14bbi1y&YZ11eJci1u&Yu1yDqy/1a=ci1yN9V:ZF
VC@e:Z ZBhM*^whjY1iMu%tZY<L9t>4N4^<6KBn$n=K:S>5^piyQeH+KMYjuJH/^nM?TyF\bmwl:S5QGeitjbVc
Skqyek !#I?TyF%q6ijHyj&Wi4<$^?RhddZu^/j>qH1?FQh$E>\@XP$Ju$:u6&1tFY=SSNeQ>j5qt:%=m*@8Ql=
WwW%*y byM$&!JR=k!dhYZ@%LG9GIVTliS6j&4KVckK!X<i#eZRXA:NBIZM&TYcek1B<pLtjBTJkpWpJaDck61B
6n+b/8 \1D&wI/k:WChRX%AZWHhRN8D8wN/kH1CiwF/k@1A?wL/k\cABwIGkRcDlwCGkwcBlwNGkEcCSwFGk<cA
-AX$=9 000f3dee71b001202b3 Page 6 of binaries1.zip
y8m@ES ^wLGkecDJwHKRD8BhkH6CywGKkhNB%YAbwBtktcBbwQtkPcChkjNA<$HLRA6BFYBFwEYk=cAqwKYkjaE
6C^GLH LRjXkGyBWhAK$E4RKqAM6B1$BqRHckDFRRiCE1Ap1BHWBFwHYk@cANwIPkl$MPnZwENBl+GPAB$JPly$
qPL#Wk DPla$HGk+$EukE+EuR!/FuRh/H4RDcCdRDiDdkHhC4wNhD9wV6BhwE&k8$H*kP+D*R>/AQRR/FHRQ$CQ
H5=$Za k=+AQRq/C9R$/FuRe/D@kJ+H9RB/EjRT/GZRK/D@kq+F9RF/C@R&/B*R8/D*RP?DQkB>CQwI>AuwW>Bu
K&9%?p wQ?BQk?b5=Hjle!y^S>C^n!lV4IbiFRHQ?4kS^*<1BiA\JM/iFI9BwEuhjCeD4:TT$EDTIGNR9D=@+G8
k9/H4L D^5!nDFI*RX/5L$yNbS!&6@5cRk&bYB?Cj&E?XF8j<=$wen@<%=%y>=1i<*VX?8pQmA>BLdMD<l6bc:X
uW>6eV :!pd/1Ny#=8^*E&/BcDHRj<AQRb/FBRC=hHZF/kRXAR1B4WBqaDck61B\1D&wA/kn1BPwC/k41D6Rh%B
u^Hq^a QWC>RH%AA$GDRENAR$HDRTNAI$GnRKNBa$BnRiNAP+DGk!cAJwEtk/cAhkV6BNwb6A6wX>B8wLtk*WH#
^i=yhL RQNBqcAFwIYkK6AiwEYkc6BT$DLRu1C>RH8D>kH6C@wXcD@R@1ADRBHReqA6KAycAXwFmwHYkPyAc$H%
kKqN8* wAbRHHRkKAE/GjSd$Ctk*+FPBb$GPl%$B8k5$Ntke$Duke+HZRn/A?km$CYkT$GZkT+HZRZ/M?l1$F>A
J5i5up %+C8BX$H8lF$C?m9wF6B6+F8B>$B8lN$F?l9wE&ki$H*kj+PikD$IPkl$MPkS$BQky+CQR*/J?lb$L>A
ecnRSR @\a>B@wQ/HuRC/AZRT?D*kX>C9wj/HQRF/A9RX<dc4!=?@mu<4=1ei@k4bF1p%mM*89QcV&:u#J^wH8j
nImcPk k<:byh5TK^Q@FK9h#B==idbbGjEMWZA$T+^J@K!:hHXjZ56hl/ct:#K$*bW$XC#<*kwP=!9<<V8FLb$a
lkWTh6 hP6M%GSH<=ak65d%+BV9Nq9QwaRu9cyR8hpt6dly@QT!h/Cb+QQ&6>IYy\5tGi&#Za+@CKY*8GDa@&WP
Z+6qG@ ?/JbVb6aaG\&K#HY^>B:Pd+#Am:=^R1HtRLbA&p#Z<HCu*EE&k@&mV19nWJ<8H:^=pnjkWT4Dp1$eq%M
1Lq=8j *CyE1/%QtQ*qHeF$qZEWch9?mw9LL9uk:ib+ptbL6L/M#akF:e#?LHkd\jGn:?@JIeN:1G5=>GLW:6N<
5<P@?8 9lpdw&<41/mPTX=VJe9D\Eb?bqG$$@cQtq%4nddlyt&qw4&=Y:mXCu>$8YdZY1P>84K6XMBeaj>V&ly:
t8\*%W p&\4FVBZ&9?W#K@hI6^K%WbN+G&S5K@>I9bp@nJWPd#t\w\+cRk$ce%V%!Rqk#S%VhI<eNX?SMa/#Xhh
qAEwpL p^RZ9Q=$9ic44pq/D%=@8pH#Xhep6Rq*he&6::PqYVw\Yt+?Pn*MNJ!9BTd1t9Z/Y4%J8tD1>Ee+6w1y
@nQ?%M W/ikGC!q?R&<Z99a5u<h6MRYVuN*\IX$&4!66#i&eL8aZ5&NBjLABQBQjARtkH>pIT$\Aj##nWPBCiC$
d$N\F\ B6p5Me9HBQCINI9^lRBW<j^S1&jMLpM4F5/aPdS$/I#!^iWI18bYLB:c8lyh$DpFl/FGV%6tcee6dhmq
STXpjD Zd!kw<qPM+kWItp#eCGwCFRMckM1AdWF6RPFRS%AS+DPBb$HPl>$AilC$EYkm$GZkC+FZRd/I?kK$JYk
G8X@N? Q+H?DLwchA*wP6D%wB6B6+B8#VQNp6<P8kN$J?k8$N&k?$B@B>$QikD$IPkl$MPkS$CQkl+HQRF/E9RW
Z*8jV= /GuRM/BuRj<C@S9$HPk@wPhBL+BiA4$MiwXMwaM/kn1B6kN%BuWFhRN%B@WA>RV%A9WG>RH%BjWDqaL/
mC1WTc k\cABwEGk+cAlwKGkacDSwBGkpcBSwQGkMcC^wGtkKcChkTXkZaC:R#cBdR4cB1wHDRhNAM$E#RLNB5$
aXq%L8 B#RZ6Bm$BLRW6A!$J&k9$N/kjWD:k9aDHRCKkJcDcpC%wClwBYkqcBXwNYkN1A/$FqRQmwMPBCXAncAt
Myd5+\ $H4RB6BG$MGkR*<EVeHtjSkF@X%\KL/SmFTiHcd^!WFlMjqF&:#=pyPhwQbBLRhH$N<ES*BIn1//Hw#S
RAHDWa \dGNHq9jc4NVGeu@@6/!G@aJS4QkCI+enYa@>8+:*dhH<Vj?t8H6!?kE66^thCmQdEZulR&L$eFM5#yc
@5L:$p @W##%41J=GjqVMppSDDpB5hQMa#pYljih<w&b>6Ak6aSHN8TkVlNLhLLG%9/H9bkA/>SJ:?EuaLdmG&X
%dIAY? kPQMX9mL&WImPjL$nC@J\Fm?>@H#G55QBKHkMA?SK@c&B5PnSibu6GLd89b%#^?=hQQtM@?R!e4B$h1Q
bS*C>! Ip&dDbwDtk9cHVRQ6AC$EFRF&kP$CFRNYk^cAqwKYkdcE:RZcG@RQ1B>Rd<C:Re/ABRBLRjXk1KkFcCX
9n4#Nu wFYkGKkS%AScB%wQ&kDcCDwIhDDwENClwMNBS+CPBB$FPly$DPla$HGk+$EukE+EuRR/GjRd$Ctk*+FP
ZZ#SAY Bb$GPl%$J8k5j9#W:P/QaHd!S=Hkeutjcy&wnccH$^^mNQ<tj\EPMd^*y?6yi+YPBB%FYTCTVa<AZRyc
6Dl#K< =9k8#PQZRB?%lYbVM&//DjjNdVX#K%Ga8?IPluSA:uI$dV6Rb%AZ+qFRN>D&IJLeiwB/ku1BcIVwA?wL
hM*/MH /penA1k@mG#uD\RNAk$GDRHSNDXJH5NBI$AnRcNAw$FnRKTwQ\/$A&k<cAJwItkTcDJwCtk1cEhRGYku
qhp5pR $M/kZWC:$m9nN%EPtk/mD/EbIGLVYcDbwDtk8cDhReSq+Bi6E4RA6BBWBhwD6AlWDXyMd^?$FLRucC@R
+tVE#W *1B>RQ8CjkZcn\S!$AE$iRBcD1wB%aJwu<5KEBqpYkYKkXcD%wD1RLTFyl=E?==w!>KBwATIN5/RbE@:
@^hHZL 5Gt:NP%:ytYVncCDRMTLl+B?4bE&JQwn#ZT^R==\!KZNhb4yu?aE$Itkp$CpX@ad$G>By+B?B#wX>H9R
F!$#1B u#VVd!^bB!AZ4?T4>XdNhL^/qYd&X&iD!Ed&8cD#NHQ4:\YkY$AZc1bSAl4nL\JhDLyEM@$uZKcbllVI
SDZaQK *kFb*d+c>BjRNcB4RhiDdkDhCLwJhDQw4=4yE9y&$B&kP#ZV>\L=Y6n$E\%Nd8&wtN6SG&=V9dp6ldp6
<X#bd% 6iY&bG>HHS^6/WKj>yS1#/p&j4T6jR*k>6YQ&%l#&6eGS^8d=6HPyuBd!>dPY6LGW8&4!1YN&Zp+^d@L
uH:>WW Y6n&#ui$9%P=Db/ZyS&i\t*^ZI@&/NWYD@Nwe:@n6ucc4a&h/YldF*m$wW5h:ikKd16Zeh6%c%jZdaX4
%VLdua beHt:^@l&H45bw4/#QHeb/bpn%Tj&e<tP=St/h>8FekR1jHyRq8d555+udq@dw/Mp&y#1V=#K9iZ1d/#
&w<Z+< PdLJd^^>=%KQ@4PT?>B5MpyL?$p9GeY6H*L&q?e%W*a=k@9M$&#>=nZeh=:8MR/t^wc4iZ#+9aiM+=S9
%9t?5T #uTSZ?#>cK4@@I9Xd!1b=K<P8iRY=n$@&iS8$D&ki$H*ccdjyQ9SAP+A*R:KA?YDCpBFwGJRt!Lciw&&
cRTiuQ AGwHCwQck#1CdkDhBLwFhCjwL6DjRJ6A>+D8Bh%ZbQ:GA/AHRR?DHkE>B9wH/HHRp/CuRe?AukW>B*wi
w8K:Kk >ALwShBLwJhB4+BiA:$Jik9$N8kh$L8k>$D9k#+AjRn/BQRb/H?k#$FjkL+EjRZ/G9RN/F9RD/DN6NRC
+u?C66 $pElEPyAS^*wlTDWk+=/$FEQP8yBS#*w1Aeh>cCnH9RPINTF*kuWGhRZNAR$DDRCNBLqd\hCu6aF%BY$
5:V!tC QckH1CiwF/k*1A<Ij/9%A=YCBwAGkXCGStYMBw$BnRQ6ABwQtkCcCJwEtk!cAywK&k$$DXRPt6Xc=#F5
&*MLn9 qJctBea1$?aJAlej4YSqDM^jGcqbYF$/ii1<$9t^?nZSSQBmk/M%HVTBY=Xw1G&1ca\%%LjCC6A%9T\T
<H#<i$ n!jLAq+Inlb<Vd88EykG8WJ$D4X9XyqF9MdTjHjn/Y5581jmb//MFH6WmhQAZGA&:Ce?LLNlY+?=5MD\
ktwRmY X*Dai<*A+NiQbQC41K$BCW*N%%%@\PyYDaWkLVR/G!++kmM+k8MZIyn@?EjkiM++&kkp4C!HjSQQ68y+
9Nda@R V5/$GWck!XQ:n@568PY?p#N<WyTaB4QdbSMunJ*mYtlKIHaES*AE^!@9CMb@c=\In8DI*Z!#6Yb4YEdR
F%//Ft knZd+Gl6^/#!^cXd?m*\T^qXknZd%m=aGEJY%6tF4eIETGBdMVmCw&YH&u$d&Bjpw>ZdF:T?Bc11KkL>
4E^=iW #iBwlRjbpA4$N+N9kXb@BHJBIBipn5Cb5hhB?!Fyn&l1j*y1H/l>j!n6<=^u?#+N:JNp6=*RHN5pQ>di
F5Lj:8 Z>Lbhi:u9WnLdw@Edy8G>69TQq:cj=9c!$6:jYp@L?*Hhhy:5P@qyd&?6E?c>lP/&T&^&%Gk9eq&8!Ty
CcYuY5 jh?y9e6ihlQe>9$/>@^t5$jm88eZ>ADwRhBDwIhBn+AidW:nA9PQA?$AGk?cAJwEtk!cA6wS6BNwb>A8
:bGF8\ wF%B8+HtkuaH#RQNB%YCFwAYk1yAi+AYkcyBT$HLRH8C>kL6DhwH6C@wX/D>RQ8DDkBFRM6B6cAwcAXw
8au/iN FTkGYkP1A/$F%aMcRHHRkcAE/GVRd$GukH+HPlX$G8l$$Btk5$Buk<+BuRe/H*Rl/A?km$CZkC+FZRc/
<IHQmG HHRX/M?k1$F@AX$D8lb$HilG$C&k9+J8Bh$G8l%$B?lP$F&k9+E&ki+F*Rj/P?kB$IPkl$AQk^+BQRq/
ZlPP=C C9R$/J?kb$H@A9$d>B#wBhCLwJhAL+NiAj$Z>C4wNhD4wDhAd+LiB4$Dilj$H8l>$AikD$EjkV+GjRL/
\Ql>cw FQR@$PikL$BjBya#jw^n1:CeEY\Rhn<kF*SRXw%hF/i&C19GLbh1:BJNS+hWe/GQbFQKWp%K\8uQpwDV
yhR5&B Yqp8yJ%D6J@ZI69^LCYe\FKEW\y11eS#9pQ1PbWq&QM$j?65y:BWhK/HXGTZmI:X$m&dyK!cdB*Yw4JQ
ZJpMT\ nLybjVnL\:yq#mTk*H#I//Yk@wFF4GBe@<uG>b\Y<@N^SdAkEl!6@CDPD=TnkkYSXu<E5pq\BIjpCJ!R
d=C6pn B<iYHS5PY@H<l5PPi&*DaXi<6?G\l#:daE\jtZ!WN<%$wKRHA*E\EG@Gwbu8@\J?CQnB+IhyY1C8El^<
BF$?wc =MCe1uH<@LNy8jayuMY>YV6nYnc:KaF&y5tBmaHJkiAIn8D+lRpWQ?hl8Jh5q?yn9X&nBVaSnMQLa14q
pe/?5y am@V>*hkR/qFNyV!HjtKCX%5GCqjl:H/&kbTE\mFhLKuYKRd%lIhlt%jQ@Z\e1*LIaj%&uDac><G*@@B
>Ql9#i EZ#@B+j<?@?Z<>**!*pT6NN<ud+4m@X&yyQ/4W#k?mWeY+ZcV:By#Dyc?/a^CG:ukM+GuRW/E*RGKAVK
ek8cR5 K/c?AII:1AlWDGwDKkG%BdWDlWEhRPiC#kPhD:wAhCHwI6DFwE6Aq+I8A@$ShAZwT6CjRH<GZR&/BuRh
uAAuGm /H4RncBdRLiCdkQhD4wDhCjwL6DhwQ6Aj\jhD*wA>CDwIhDDwEhAn+IiB#$BilL$FPly$DPkj+KiBj$L
w4cpkw >G@Re/D@kJ+H9Rl/CjR!/BZRj$G9kq+D9R=/A@RY/FQRN/D9RN?DjkB6Lwd+DKK//\n1BNwP%BuWFhRN
<>X$iR %B*WA>RV%B9WF#RINBk$FDRMNAI$EnRKNBw$BnRYNA+$BVRX6CPwDLRVcGjRL1BhRhNA=cDywBtktcBb
-Aa9b% 0005271626c001202b3 Page 7 of binaries1.zip
EY+i8= wNtkPcC=wMYkJcCqwGYkQWF:kjaG:RQcF:Rj/ABRBLReXAP1BWXBK$A4Rc6A1$F4RHYk6cB/WB^$ICkB
+/8T%$ ckR%khcDN6nILe$mLd8c<JcwBnjdeb!lZE&@IqG8yn9/5bY4TYq=T=YySdZ$5^\yQaSkp+u:5jWylKjN
ZPh?jQ kiZI\PGYttMPbJqAq4G%qdDbK>QYJ8$^$Bhc/pw#N*X<cW>+B@RX@8VSA8/D*kN>naVHWkuQk:=J@Wua
ZSK&iI :Pyy@=V&Aildi%pjkd+D+l>ij:4i@1jjP@@$B!Ai>@4VDja@*i#+W=$RV:n?/a@e?y$=RS5Mn6!NYQp=
9dBy1R uHq1*81<+tn/@ntttj$JjWKq>Tj$ZiZcQI6NphCuQ/HQM1<@Qe/@Q/G9P1<@Qh/@Q/GQR9j?JDBDHB!6
@%GY9a @JlX94l%X$C\$/dXH<dREC#RY^?&MlE=PKVHXtV$JDme^:bmju#4@A4b$8@44c!ZTj%?L$$>%k/y4\4N
95Lkwl 6J&T141>dN<Z^DRyVdD##A<K+:lNW@aL@&MPL5bBu%e<hcGVDb1&HCh:MK\dye@RLI?!P6qaabjnPp*D
tn>Rt# h?A+&TQy!HG!tNcJ+<>wyq$dmu?1tjb6/JHw::y\uP#NhPW+&aLy^uG!%:I>^&tc9#9H!W=LD+/Vldci
qXqS#X HH?e/+9m:&6cT4p:n=/%D<jJSp=jnyQhtu+eJ=5=yS!uyan?HKj9^\Ee9$k#dilRuK#ADiL+5=yyW+jm
GL4a$5 @>NM&#4$i1k?iH+\u&#4DPM+&eIb#uG!$#PC+&THbmVHciqmFMhymYE$^<q?!lmP9/8bNu4w>hN:H5j^
=q!nRW @5\4FCelen#HTc/i\HG!e#PS+&SQb^LHcYqnM5jJh55Wn4?8tZb?mL&IH*jpPNWjC/1FbQNuJ+/V:cGh
S?!B5Z PW:LPd6\uJbjh8W+Lb6\b%L+h+$u5lF@YVQ6BXH<P<&$G$T5VP?<k8NWB#M+Vn#De?NFK:q6WJ!/^hpe
qC#BIL J:5=e#lPT#X#PW/&cHdu?J8cbcG!tN4YjI+VZ%S!uJ=yAejJ>6BCn6P:1?I+<iwiHCedQa5+VlaC1#u?
@BXwDR Z<&$Y$SNpiy#Cejy6=b!uPy!Geeyj$?P^:uNW=^tG9dtPC%N:eN^54t#L<jy8Z=q^p8wu>mQ+<T@?*Pe
d\?1b+ /9kAnyP>yAnH/XtYe=!iyadnbB&^q8QW^6p>i<tHttqdmdwTcuh5L/E66aNXHKh*FiM+*i>1n6Qe:^1P
Ndt&@W $@81+#m>L@ae*=cim?%S6*%XM=ePKj/Dbm+lW4hF@eGBHCe?=TtWhqT9:F??ZaL:TwwV@#h^uJd@%uGe
w1EEYp 4EC8=#n%Ld^Y$w:/#I%tQE#>$$Eey@dB+uCaj85Rn6P>@J4n6A^=KMhyPjE\nyMqTSch\!>1=lIt^Yui
D<Dd8P /Wk#*y:/5/M+V4^^NMjy@S@Ded4Ha#qP!=uHeb!i=ZmP$:Pe\HH1R$+$+^%wHDmJ+<RdJ*Pe&8l9PE=<
=jSKmd >F8P$:Pi\uG!qjW:nqP:QyZnNIZ*i++VH=:GeZ18$<%+S?4Z#?A+>Wquey#c$%pey@h<N5jy95:lPNqG
Y%j\$E P=jnj?W^n?L$nPh#uGaNL#DnuYle9bDn>L6@+Dn%J^h^uQ1Gm#qPdiWTnlP@@B@H1V+8=Vm>^<5+VybC
IlhV1u @<n^j&ntenHF1b/9MPQGeHkq^&t<8w4n%H@@miQWH9@MeY4*X*Pe/8E9HKj*jA*H/h/9=VnhA!>Fd@ip
*Ca4FB bqw$yVnX\\%t*BmGd?R+nde*eb#Gnb5=V9*wLS!u98T9HKi&em9Hj<8!BeYyLt@uPJX^B<ij$p^41SS@
J/%Wb: Y#P6y6L\V:LM*#lP:+LF%!+$H6:NeSwV:8E+>aZ*ey#/kQ5+Vu#>h+:VQh#Qed4HB#lP>jAk^?piH8I+
^Zd5PQ >S5Qt@G8NL+<\9E^ttYn4P5Muy8tPQH@Q#lP@eVnHKh&>kVHmd?i=DnX#XMey@!uPW+V%<?aeWQe?TjH
ih!XdG mVti=VnJC@@mPLZBj*Pe?yduPN:E<l#FV?ZybIwVL:#Aed4*F#qPQQCTGh?i^4mZPW:6@SYP$@n<Z+:V
!PZ9M! PQM1^/p9jI*n%F=j=#n^:B5ey@y?p?NW#&?b<i:$46@tPMqR:*Ce=IJ*PW:n+Z5eJ#=@u?QWJ**AeYyQ
/l=*h8 H*Ke*9NHHKh:@NmM>/A&@kuHThd:qPMpy*#GeSyQ@<h^15QQPW:>&See9+4qa+wV:*#FeZ1?4#qP<5p*
IjC/+J b4\u<jC*HKh^=#8P$*N>#*H1R*:kPLYh#S!@VIu<QViqq8pS^#9WYj:9mh@ZYj:9Bhqeb@t@F&SduiZ@
ByHX4J Ztm@P59@9TA4/T#@><I>/C#@><K+4dQ<*\9ntM:!j!?$I=*q@%=up:>qn8Q>/m#@>$Ld%Xu?:+W&yLQ<
!/mRyb *\5<1LQ<*?6n@ybkEX^u?d<*bH!h=j@i+Dih=j@i/Qh$q9>:w:*4LQ@*lk!q5@#jG#KI#9J@d+!NP59@
wed#>T 9hG9/!#@>$b@w:Q<*^96R&j=9#ji4e:!j^@ew<:!j^@/Zbd@?$AG%Fu?:\NbStj=9\@GY=*q@#+aE*TY
<%9>bu @@8kZ>Sb@8?DN1&#@N<HQKY#@N<ZhcP#@N<Ze44P<u>jnC</!@>>D?B9LaynQNXb@8?LeW>u?d<9?t!h
e8>SJ4 =j??/JN$q9@:k8h%q9@:kp>%q9@:+X*yLQ@*\:*wLQ@*k?!15@#jn?1Y=j>?pNF$q9@:Ra:RYj:9l#FF
l1ZYcN b@t@H@w^uiZ@j8m4hJd@?/E>yZaiqII9hJd@T@G5P59@yeTHLQ?Zw9@WYj+9ZW@#CS^H*/Y#@F>K@Md!
Y19%PA j!u/by*q@%L$GV4L@@&L?d8W+1lnuiZ@@9l>uiZ@@yDNhbd@?^Q@5Q#jH:Kj#9J@j?Iqq9@:$#&\@N?j
wR4S9L :wHq@@+aw*TY@@8n:>Sb@8>Q:bHq@\HWHqu?H+B*1LQ<Q+D+m8Z@AbChhbd@B&C<$Fu?H\B=RYj=j\D>
u6uw%$ F59@A>DZ/m#@D/D*!@L@RLS%uiZ@kiBquiZ@kV9#>#uF<Ze/!@<D$d@yLQ<QyGhp?Z<k=A8h=j?BXM<5
muX*9T @\>E9//#@D?IhnK^@D<I:Wqu?Z<RiESu?Z<Rupqu?Z<RbHCh=j>B^E55@\?mh54!@!DIEV4L@+M\y8p5
YMM@1^ @\>C9/8#@D?a&muL@+Py:dD<Q^n9WGj=j#CiR&j=j#DpZy*q@<GRMZYY@\hDX6Jb@l?M5X%u?Z<\^m8h
KD>4MV =j<l^E55@\>B8>hb@l>C9MV!@^DmJbd@l^#Ae^<WS^p/!@>DII@yLQ<QwjdL<9<R+mYY@+hAQ6Jb@l<C
C1L$ZA iWBu?Z@I!&41jAm6EdQ<Q^S>9<:!@%D1Q%u?H+1?Ttj=j!n/A=*q@/FwV#4L@$QBW#4L@$NS*#4L@$Py
QJGtPZ #&j=j!nGIJ*q@/H$nqn?H\4=XGj=j!npKJ*q@/HEJ!#@D+Y5wdQ<Q^Sn55:!@%CMd#4L@<QRj?55@\?n
MK!TZD 9wnq@&HEQ!#@D/M&\9L@MQC9#9L@ML^duiZ@aWj\HBQFWb:P<9<\cn55@\?D#Kt#@D?M*nZL@<NwdGL=
Ma1w^I j^lpDb*q@&Eap*YY@+eV9:H<Q^^nmM:!@*D$$#4L@<QS#?p5@\>HY>hb@l>P+!uL@<PJH%n?H++/%qu?
SIl1Hd H$:nKe9@\@F*P59@\!GD/!#@D+eM1:Q<Q^\!wM:!@*D1>%n?H\/=R&j=j\VGXb*q@^HE6!#@n!AbkPZ@
ed>?Cd EVVY5Q\@k6wL!@<n\PM/!@<n<J=%q9>HZM##h^Tu><:!@\nIpD4L@!Mk@?k5@+?k?&H=j!TNP!#@n/V^
J#lecS uiZ@phTPYQ+jTi?c=j?S/J>$q9>Hw4*1LQ?QBA@1LQ?QSH*4LQ?QyDGZ=j?S%Hba@l>J@TVL@!NyQGL=
wQ:d9c j^SpH=*q@%HWh:H<Q+41l?Z@WhTj5Q\@m8/H=j>S%Eba@l>F>eQ!@!kcE%u?H$XnI59@w!D9/!#@n+IM
Q+GC+Q 1:Q<Q=4/V=d@S$NP$Xu?H#&S=$ayVuZC<9>wpn%a@l?NjpXu?Z<$&ydP<9>wcy55@+>G*ik5@+<tPaVq
R$9d94 @>GR8*YY@$hVi&V=j\#hA<9@a?kiYQ+jR@jA<9<a8kiY@<jRQdD<Q+d1kiZ@MYkVP59@a+lQYQ+jR??F
w9B5:# =j<^^Le5@+?BuK8#@D?Y^m!Y@<hCH6Fb@l>L9M4!@%mTE%n?H+9?Ztj=j!#/Ry*q@:HwQ*TY@<iT@M#!
n#TZi+ @%m/H=d@^#:E<<+Wy:Gd=j?^KE>u?Z<5>RM5@+?njwDq@*GR>ZTY@<hSH<9!@#kcb%u?H\i=RGj=j^!N
:PLe+Q :!#@n!Qbl8Z@eVVY5@\@Du&T#9L@PBwZYQ+jh+8c=l<Huk&^@D@8*:SQtPPw5^DL@?P?w>%p9C\A&TQE
%XZiTc <9<PpENDLQ@9MJF&F*N<l4uu^IlnQA?^@L<D^1WR!@<:wP<M5j!@A>$Q!@<:kH>DLQ@9kDwP5j\@9wVu
>HN?e4 <TtPjnLE<9>+!G5lq9@Hw$&FYQ+jn#aXa9q@QQ4+EM9@+%EQIbd@^/N>l%n?H+@*FYL=j##1LMV!@\T$
SN>HWT =SDL@^M\nwSa@y?A<T:E<9<E<E!I=j<JGChDLQ>QRN<ja9q@A9kp^QL@BLVFEM9@E<A:Ibd@J>IPdbd@
Rq?*Kh J+IHRm#@V+SeGYL=j!JpySDL@^QyGXu?u+l^M5V!@$TMCTGY@!imZ\!^@D<S@WTI=j?J>H=b@y<Ijkt^
*+YlEd @D?yG/?SWJ#1tiZ@TbCyR!#@V+I5GYL=j^Jp1BDL@=QRjpM5@$>C?\&^@D@yanJc\*H$&TGY@!ilD\t^
6qLkbM @D@yLVKAa<ayKeV!@&T<\^DL@=NSH!GY@!eDG&L=j#Jp=^DL@=Pyjqn?u\\bK5V!@&T/H=d@J/NQC:H<
yta%1e Q=u1l?Z@!ilQRm#@V/d*\9L@FQBhmPZ@KZn8EM9@W!CulXn?u\KbMeV!@=Vj<6wT^aujYQ/jku+>^QL@
eCcD=c FKy@q9?uwk&FYQ/jm9eba9q@K5wP5j\@FiNymPZ@1jViYj/jCypq^QL@XI\SIbd@y/J9D4H<Q^X>Tanq
Z+n>=* @^*B9!GY@*epjtd=j$h/Fyd@h+R5HGL=j$jIc!GY@*iEVBFm?Z>HnG<lq9>*SH<ea9t@nHma=j<!<GPI
yla!db =j<!/lNa@m<nutH=9\\!Zanq@#LIAmGY@<8i=#W=m1QjC4H<9^QXD<9@P/FiR!#@:+R^QeV!@$/R?$I5
9*M*D8 @?>EbdL<9^QG1BDL@#8nu\8^@L<#&tKI=j?h\R5lq9>*^8?EYQ:jth+y!@<:R*+J5j!@M@YbLQ<V&+Xa
BKt68> @6<F:VnE<9<8XCdL@:9kPWI5@?<CGVuE<9<8pL>CLQ@9Ru$k!@?:aK\I5j!@K@1JEM9@8+I*uiw\#V>I
WC+w&c %=^W%WuVuSVqTZ5?dHdAiYFVAd<RXAR1B4WBqaDck61B\1D&wA/kn1BPwC/k41D6Rh%BQWC>RH%AA$GD
5:By*V RENAR$HDRTQCynA*CnRcNAa$N9BC>a9!R9Y8t+iyFAp*G/cFTuX=<6S=kbPA+GmFS<Y5T8L?%q5Bkiy!
$9^Yba eJAt#c!=<&qu@DMeQ5*lW^!?TtGSy4ju/>j+85Q5SW6amNb/=JEQep$4wD^Ilmh\iDKH^=8l#9q/wi%9
=F8BPY P+ZNMYl=IyKISbPyW9D6jCmHG#p<k5PnPV\+eHaVHK*?5J#hqA/4dw#W%$d1G81n\+N^LDlcuV\VHMES
iVtX>A HNpQ=i\tPIInPIIYE^#BEdTa+AmPu:@F1K<b$mWlHSLTHYFnNeaiWhIHId$S$ypkjSDT>!D>D>IHIZ$Q
BHa\tG $8$kuR:T=TChD>LnID$>$8EkHV*T*!D>QNLyI>$<$5pnQR:T*!ChQNLhIJ$N$5pnjR*T$#leW/acTc?S
WuX9kK >BqJV+Q$M$nuwqR#>&iTLkdyZbC?BiqbpH+F/XYRQkZNTyD?BPqNpL+E/WuRPm*yTJB8BPqEVNQM@bCp
-A8+%K 000abd0bfa0001202b3 Page 8 of binaries1.zip
mF=keZ B$H/D/V*RQwPyN6Amk&p%$D/DQT%V@wLyLhAC<ipy$D/CcTLRDwINB%JPkipc$A/B1SdRDwFyE6APkR$
!5qN/D <W</A/R4RDwCyB6AikC$@p>Vp:V&V&9?6NbQc@!p5$t/t1TnTd1byJNJ/@&$#p@4?:T8V?9=6I=Q/@i$
aT&1%n dp@4>Rhw=9+<Yyiu>Zlcl/j%h%y*J%%FYuPu6Zbca!e>VFyjJ*%GYq8uNZXcT/e%hL9bVhLnyHuPm:S$
4u+9EZ <=8$Fp=4+HcVt/VZcni:te&<J8q&p9+q/X$&%:#tZ=4D:68KwXcSeXV9Nq9Iddca&&$J6>N&*G:de^6N
hkw5SA 6hjP*H/:eD96^t&^P:jD:dqN>4c%9*:e@9y#Y$!%9&He>qL6eDn#Z+&NB%i/6Eq:i*S4m=P=Qh4d+kpi
TL#H>J :ZFcC>6pqc%hP68p5@*6!&%\Q&/D#9cZcti45:T9lEi:8pBLN&q:F4i^<%*ctd&@QIQ:#QM$bidY*yi+
9!MS@b 6eqV8F&i11Yd9n&V??=W9@*VHwGBWi6w>RbGA%+IiPGZIuMHLy8C\*EELy8C\+$jykW8t+MnhRRGD*?E
6eT>iK a/5\iEk8PK6tX>ZGpt5M:bw6KCT?Mn/DDQ<b#mV#b<!j9YjNtql6XcJl>dL11wwe8w8A%JJHBmD!&GXb
5bdN/> <&<%MGWhHK*<IH*\YiYLT:i$6j<CBJ^An!/RedZA%K?u4LiXthB6a:\\9TSjh^W?D$>F&lk4E1Gy&ZDB
EiwHW\ ES#BES#d<8AXHMESHFtP%KyH+LVEqP8CnmVu^>a!l^ee\SEe+lFBhaDbhE>JJ+^$&XJ/dCuh$=RPcEwu
PDVAQp %E$ZqG\bpt+c&VEpuVT!aWl&D<q?Ihp6VPtnph*CqE+c&T%$/1YS*yXVX=F$/XL/4/SLS#y%hq$/$y>L
WN5+$6 /dithF968uRyZecW9l9y8JG?Y$wH%W@*hJ1Y486G8q^&jVjTYZQViTN>N>J:!/d#%qJ>W:881X$H#p&@
la#MWS $/pZS:y4j4y^Vqj9yQNGPuGp6=dTm!Q:q/Rdh:4t4p?e$w5n?=tpG$h/d!qhY:8PuFM@nuVmTBjQ4lhu
%8Ht<& %$>N8Z$u@hTW/*i!4Wu&L<u8Jht:JD8ZbN?TbBm!b$q&LMq?Jht6JH8XbKj!Ae<Y+$kMy6C<DnL4Tia<
EN65Z\ !a#uI%!>XK%p9yQMh9:D4HdD#QQ>dPKb#Ha?ab1wNp^Vp:qPM6NJ=nuJLCib+!R#uQ<!Z^Yb+maV*GRT
qBSBL5 t5^9G&c*!cRtthIpE=19cKbJjnK=Tca#!YRtte4<N=8Fjy=NRyQJ#DhMW>iGmY5!qWptM5p$JyuEJFPa
l<nStk bAKVVF@?^#VSVcc=!aR$tiWte>^pXynMCbMbaVIjVCcK!RT^+Ru5CNNeMJp\JqQEbKcaVAcV1YA!EW!t
DbM8q& keppMJpCJlQAbQ1ZVQ/T1X<!<W5tn5t<L=u%JZP?bMcZ#QiTGZp!H$>t+<qeQJtlJ#Q#bC/i%kjJQD!b
6^wTL/ 1TjV%YTKu5^Yp=q+Mk>Qb44JQDibl!i#<GRPu5#Ap@q*M96P=6:JqD&b:Tb#*YVttp^%p+q8Mp>Nb1uJ
ZR\tFw HDYbwTbV%&VKt5^Rp@qyMn6Ny4DJyDYb8!dV$&S!tp^Np+qyMm%NJ1ZJqDTbpCdV$YR!tp^Fp/q5MlNN
Nwkm5M =1HJLDTbk!a#$GV?q5#ip4qdMuNLyuVJXC/b8TZ#6tVYqp#6p5qeM1hLyt*JyC&b5mWV6tT/qp#Yp1qc
q%#Tt+ MqFLytuJJC&bwmXV9GTGq5#Qp6qbMnhLbtdJ8l8b%TS#ttSGp$^%pmqPM1NJ=nQJdCcb<mTVuGT8p$^u
!p=Hym p5qMMyXJJnLJNCcb^CSVtGRCp$^jp5qLMuXJyn:J#CYb6!T#qtVPp5^ap6qJMnhJbmdJ9CTb5CRVqYSi
QTQ=Mt p5^KpnqJMuFJym4JnCYbqCSVptSCpp^Hp5qIMlXJJmLJNCTblCSVpGRCpp^kp9qHM96I=l:J#GNwtyc=
KX%NGj BiBeHt:6R<W=QA^:dRqIhd%Zt$MIthRqW:ypRyhM==J=ZnK@T/b#!YR8tewq<:%plyhM>JK=ZDKVT?b^
b\jkl9 !T\8teMqM:lp@ydM*yK=Y#J#T?b6!d\9tdaqp:bp!ybM&JLyYnI%T!bt!dR5tbRq5:XpqybM!yIyYVIl
hl=Ia4 T&b6!V\6tc+qM:JpQydM^yK=YDIVT?bl!T\5taMqM:CGC&*hNH6LJq@J%C8biCZV4wbJX/iw$aZF11+P
uQZGme 5cM#m%1DNjh6A@b6Amt^^p96u$&*GmJZB^c:uN5PuCJLGa6pP#uEq^%bSJ8u8Y@d5Y<JTG$H<FL9u<1m
@y:lmB *%\Yw*dQFPZI>Cib@CSVu&Vmp<!IpyqRM9FJyn*JyCibGTX#wYSKqM^/pnqQM8NJ=n9JdCib/!R#uYTi
+%@Qkd p<^!pnqPM5NJbpnJBCib*mTVt&S1p$^5ppqMMwXJJnDJ>CYb%!V#tYV/pp^ip1qLM4>JbnVJ^Ccb8!R#
&MEDIm q&Vip5^cpnqLMtNJ=m9JdCYb1!R#qYTip5^#ptqKMpqJymnJBKXli9IGFu>9a4H*Gwjwi/5yylk8DK=n
NM<iQQ >\Y*tcIK8YI\ZDD+mT#Zt1+q!KWE8V5kh^KGG\p!1$#tqMtMMyqQJ4QMbHcb#CiV&YR!q@\B8##+tN$h
bEAt84 pNupd$!ZDwa4B#KZVGcT!V\!tWZidLK$IjN<bL1eIFeV=B/B6CZJ9RT=>TB*H8VGk>^*pF5Re98lq=y8
Ci&Hb9 P<lhB:pNIdek=K/D*HTRi\=!!$H8PMkNB:ujILed=G/DZItRPZp!I$@t+<q5QJttJ>Q#bDci#MYVtZk!
>Ge&T< ZW<t/Mp<QbtKJ^Q^bB1iVMKVKZk!AW?t*<upP=q/J^Q9bN1hVN8VYZe!=$=t*Mq<8&G&*TqPH<Bmi<Rl
h*l&R? Y8@Qa9!BH1K<e:9K4#V9LTu:<YhBA+9/eT%#?+6VQD/Y^jQn6QV6JMi\!H/Yl>l8*:cTE5t>61Ae#b<B
RmP?Lj b:AIj/cY8h*5dMFEjZ6N&hH81Tq*tiN5p*I:ceyh=p^N8e9<qcdebc/$Th\JVduLQFm#*GWc><ut5w*:
dGGFjh bZQb^lnG=4KN#\I&q&&$S#cZddR^Nyh6!K=5L68RQ%N>:u8c=T:VePQD=4INq#X5L66\BeQt5w*&^Pc!
+*wHaB DdeldC:deJjB=4INq^F5L66\n<Dt5k&*A&\8&#DD#?c!DVQ&dC:dMB9Q=4INW?/qHQ>I5>^qGtdP&X!&
N$Zd&u abcd#YWdJ1nbZLblLy4NbS5tuNqe6tFKtZe+GKcF&X!&ahcZnW?FD6e5h=tl$#VLZYdwW5%!q^t/ZdQe
i5W@FP baai$C^*tcGuNe6hb8l%#ZKZGjyT5>^q=lX4q49M9K/c=T+#d+Bt8e9MG/Nb:nL#h6a5h=q=e#VLZYdi
6m1<EJ *y4qLnN9lYc=!<^LcJc:#L#DNe6hb6/Jt8W8M?>5#ZKZtZi=b4uL#L6b5>^q=6uebia>yXu8M9Ni%C^*
DN#$A# tZq9c=c:#L#QNM6hb6=*t8W8M:?Db4uL#B?pYi+!<*jRLHib?d61q49M@E4Neyibj+Bt8e9MV&1Y8<#<
#E$6b< a#ZLZYd?Yb4qLnQ@C5%!q=q@1&c=!<^@XLQebic@wqu8M9P@%C^*tRXhNM6hb5EPt8W85&B*#ZKZYXC4
YKW^H1 Yi+!C>b4q49Mk5M$!%%t\Y<$!%%t\jtc=T/#+M?c=T/#+FdNeyhbeK>t8e55iF!#*GWY9KBb:nILQ6W5
*QVG#p h=tF^b4qL6N\ne4t5k8ucJc:#MKbt8W85*Cbb4uLLI^yq49M\q>4q46M\&W1t<58QE?#*GWYZ1Nb:nIL
\Qj#5u :>I5h=tFn&tY8<#CF#ZLZYdl8=4qL4Q\c<%!q%t$uYc=!!#11%u8Mw6GcJc:#KKyt8W85&mYb4uLLK4Y
/ji5AM LHibSj61q49MwqYc=T/#KLX>YGPZ4G\88?kp#ZKZYZT8b4uLLLyi5>^qF6&nYi+!m=:TLHibSc>yqyJJ
K&XYPJ $Yic=T/#8Fm#*GWY>>A5h=uFI#VLZYd^Vy4qL4N+utc=!!#iY:QebSbHNe6hb9E/#ZKZYb#cYpu^5#ZL
?mk^9i ZYd^Xb4qL4Q+V5%!q%u<6Gc=!!^?ZdQebSb@yqu8Mw8@$!^*tY$KNe6hby98t8W85<$k#ZKZ&Yc$b4uL
HhWZDi dLPnb4uLdDND5:aN6>qDnbh6>6M5h=q6ay1%^dNNw&c=!&^#yGc=!&^#ttc=!&^#1Yc=!&^#w&c=!&##
<5E:QI 5Gc=!&##uGc=!&##qtc=!&##qYc=!!\y$T^*tTW>NM6hb5qR#ZKZYVJb5>^qq5#WLHibJZ6wq49Mpu$$
\=*+9N !%%tTX!#*GYYHKXb:nJL#6e5h=tGt%4iRq=!n&c=!!#=l&c=!!^=Z4Qebbc<yqu8Mp9i$!^*tTXjc=c:
?8#H>e #Laqt8W85&$*#ZKZ&Zc+b4uLdD6X5>^q6y&uYi+!&>bwq49M685%!%%t&^M%!%%t&*M$!%%t&#>1q49M
w*m%:# 6nhyq49M69hyq49M6p>1q49M6m>yq46M\#$88<6y?+qt8e65?+%t8e65%$c#*GY&//ctI>9%$T^*ti*G
Xj@uPe cJc:#Hc:cJc:#HbXt8W85>*it8W85%&6b4uLdFi9Yi+!&@%c5>^q6n6b5>^q646E5>^q6984b4uLdQeQ
WPCt<X #ZKZ&i=N#ZKZ&i+H#ZKZGi/8Yi+!\&M%!%%tiI=t8e5M:/%b:nLDMe%!q^p?R4QebacQ$T^*tiHVNM6h
AGbjbk b9le#ZKZGV=j5>^qlm@RLHib+Y5$!%%t?E:Neyebjp1#*GYG@/6b:nLDu&mY8<#&8tc=!&#jTdQebdaj
m$u?MS wXu8M66ZcJc:#Qc#Ne6hb96>NM6hb99>Ne6hb98pb4uLdL>S5>^q69?hb4uLdH?ib4uLdH?%b4uLdH?j
KhK=Bh b4uLdQ?5b4uLdQ?Bb4uLdL>b5>^qhtm9Yi+!P+#WLHibHibwq49MDkhwq49MDl5$!%%tl$M%!%%tl*M$
\e\!1C !%%tl&5$!%%tl+e%!%%tl%e$!%%tl&?X!N?^p*KZTc/EW?+!P+=T:nI::14ebZce4>^qh1^X:nI:4qd8
D8t9MR Mn5iy>^qhn^L8e95iKX!q>u^d<yhb5iuqL9Mn1<yh=ph9%D8Mn6NXi+!P&%W:nI:*cuebY/*uZKZ8h$?
y1mC%V !q*thye1h=ud9c9ebZci16^qhn=T8e95@KB!q>tq9ZKZ&YY&eyjb=VDqL4QL+<yhbyiZqd9ML8<1h=qh
Wd9CGb 9qd8M49&XP+!8$=S:nK:#qQ8M46Gqd9M4pewh=qh#%j8M49i16^qpu9eqL9M48<1h=uh<yT:#G:hqd9M
a9J^nA d1PX8<^8P!6*th$YKZib*SLKZYc*a=Y:#G:uK*ib*Y=R:nK:QcQebZb:Z:uL*L=a8e9ej1l!q:u>DPW8
GtQauZ e@8X!q*t>we1h=udu/4ebY=@yZKZ8j&>!q*t>5<4h=udj/debZb91>^qhl?k*GX&*$t=!?!?TLuLJLi=
\nE9DZ KZib*a>X:nK:@$G=!?^?w*KZ&j$^=T/#?%9KZTc=$E&=!?#ST:uL:DFB8e95MXi=!!S*8mq*tV$m!q%t
QQhJIk n#ZKZYcQE=Y:#B+*KZibQi=X:nJ:QKuebjb+V:uL:Jtu*GZ&:K*ebjce16^q>6^H8e95icl!q>u#A8W8
c/MtXE 5?ih!q%t#&iX8<!i:!l*tV&@X?+!i\%Z:nJ::c:ebjbcyh^q>nyK8e95haX!q>u4MiW85>hu!q%t:=:K
4YK!p? ZYd9Keyhb8<>qd9M*t8W8<#ib!l*td*@16^qGm=8Yj:9@aN!q>tu4*KZ&YhZ=T/##@:KZYcjZ!6*tZ$8
<nq\tV WP+!?:!6*GZ&DTq*tZ%:K*ibjce1h=q>F!6*tZ$dqL9M95e1h=q>L%L8M99i1h^q>u%G8e95?+F!q>t9
1>D#RV 5*KZ&Y?Teyjbd/q!q>u9EKY$bdmybjt@*@*KZYc@D=T:#NL6qd9M$puKZYdyA8W85:SB8e55QXt=!!#>
-AnZZP 000ad76b8b7001202b3 Page 9 of binaries1.zip
?A%9kC w*KZYZ19eyhb?yJ!q%u/uZKZ&d?ueyjbj=J!q>q@D?W85*>e8e95@*9qL4Q@neyhb9>@Kuib@V>Z:nIH
X6CIMn hFH8MkhMX8+!B!^X:nIHNCq*tRQPWP+!B%!9*GWPiEC=!^#\tZKZPdCZeye=eFjqLuQk$eyh=5DVqd9M
SJAkpW kbeyh=pDd%d8Mke?wN^qDu^D8e5eqK@ebR:11>^qDmyV:nIH#XV8Mke6X?+!B>W4h=tDDqZ8Mkjhw>^q
5^Y^#8 DuyT8e5eZKLebR:8yh^qDy/4*GWPZ14ebR+?V:uLHQ\u=T=#<D?W8$#DhT#L@$PGKZibR!ayh=qDNml*
Nj9ZH> tWPPWi+!l#!m*GWc:q^b@l?/u*KZPjS!=T=#/CjKZic\pHKZcdlXbjq@&EnqLuQad5yh=4DF!q*t5QPW
I=1Zae 8<^l#!l*teN:Kuib\!QKZid\Q!q*teM@X?+!S?!t*GYPPF/=!^#^qHKZPdKZeye=ewX!q#u!P8W8e?T>
t:Zb#R !q*t!GiW8<!Sd!l*tTP@XP+!S:XV:nJH>Xj8MphNX8+!S?&8*GYP&q?=!^!XXP+!S=&k*GYP?wN!q#uK
JV6YmS :m=#B?W8e*TFeye=iyq!q#u/QPW8e@R4NuibR&#8M865:nK96:uL@FK=!^!:m*KZPjaI=T=#:Q*KZTb=
+nM4lu *W1=!^!*YLuLNN^N59\@L1ueba+:T4uLHHiceye=:9?W8<^^%!6*tiQ8Wi+!^#&l*GYPi%t=!^#*5ZKZ
c!J<LS 8aP8*GZ8MF8=!>^ltZKZ8eNF!q*tDnewh=p:jKQeba=9y>^qnq?1*GYPZ/Qeba/@R4uLHH?ueye=@m5%
jpWNY: #V?l4ZKZPYGSeye=wXc=!=#\c?W8e<L^!q*tlDPX8<\J:!6*tSM:KZibE@54h=pV=!6*tSPZK*ibE+>T
&mqyj4 :nIuu1uebW=<TduLuQmJeye=1bh!q#qyuHKZPYtieye=/RDqLuQTkeyh=1Rnqd9MTeeyh=tV#qL8Mmhh
*/GA4W 16^qV4yS8e8ehI>!q#uyeiW8e>LL!q*tyQiW8<^J*!q*tbPLqL6M\\Wp!@?VB!l*tbN*WP+!J$>X:nIu
HKi5p? V%j8Mme9XP+!J??4*GXPZ1ZebW:i1N^qVn=c8e5$ZEc!@D@=dPW8e@Jq!q*t=B8W8<#Jn!y*tbP@Xi+!
5lY>4p y+^T:nKuLFL8M1ee1h^qV6tp*GXPiXC=!=#!kuKZPiXL=T=#ckjqLuN11ZKZPZY!eye=hby!q#q%9uKZ
B9cMkj cdmTbQq@/uLqLuN1ZLuLuLyB8e8eiwy!q#u%a8W8e?yjqd9M1R<4h=qV*%L8M1h8X8+!h=!6*GZ88Lh!
9%j$Cd q:unJeyh=w+*KuibP@=V8e9e<Y*qLuQH#=Y:#LJ<=T/#dH9qL4N5qHKZYVbb8e55t/:ebbd6wh^qqm%Z
YG/=jZ :nLLtyT:#LKnqL9M5nPX8<!!T=Y:VMN6Je9@bZ>Z:nLLuqd8M56iW?+!!@/u*GZ8qKjebi:WR:uL*GtR
</N%Vk eyi=$&VqLuPu?eyh=p/4qL9MuiLKZibPl>4ebb=1e=h=qe%h=q>6:nIj6duLjN:tL9Nn=T=#y?>5:nLd
5h\mP& &>^q>4P=!=^5e=e=^?a8<\Cd8<\/=T:VeKuJ<9@PF!q*tV9jwN^q:9!>#X*thnb*tRN6:nLLdP+!F!y*
T<@#GV td6Eqd9MZSLKZia8%P+P&WL>9=jM8VKnL*6W/V:SHKVSh:%w#8$b?t+u5?=eZ>cy1#c@K\$>kqK#:cS$
@pXB&J CKl>Wh6L/SAa?mCLYa<kyZ6u%:p4aN&FQNcF!#juyR\h8Vc5N#ZKuD>K/W%biuqH5T:dlV#Z>!dQ:d%q
lW1GK@ $&Yda6PHKFN/mIbial*48c%q@dn>YQe6yi>&5Qq>bimj4GChp*4YX&H>FEP&@+l%N5=quakL8G@<4@q>
cNbKbK aPmF^Zp?:$8iB@!K=\C@=dt>:*p8d:M=h$jnyc8i*V4#i=H/GWQQd\Q4K^=pn8HG><Wu=n^qmHuFtH8+
<pPdyn q?jKH&L>!wZtZIKlm:GC9$W?M?e^cZ/C=mWMjbt>YZ?HhZ>wZwK?6\%h8@ctHGDw8X#QPl&VYPiF>X$M
1pbCMk Ze^K%6@b%@^&MuVq^yunncFQMw^%SRi#45qI%4E<nuW9j<Q/q5e:>ByV?w^LYIh!Gi6B:tZPWSm/Q^%b
4qC9hy @*E!/<H5#H1p8=4#SVTHR9NANEiW$1?^hC>V8yWy9eyLYRjtMk>>#>NaB?aM%te=p@Xl#nc@c/ljMQVb
%T8VVK duZwSj/Q>Ti@aJ*J@:JiuX&u:k%##EuV1Z8JhTyjN8WwR$j8H6cj9M1W>hL$KG$/qDT8yjRwDV&@qH=j
y?B/A$ uHW\9&Mh8?/5/@Nu%5Hb%=RDDV&lMP8uhtDh%K/59>1NhaqTi16hYN//$q^HMGVKh1^@<nhVQ<KR6R1W
AhK>l! #1Yl>:Bh88/PwWe=p9Wnh&d=cRl@d*btjSCu19/49N:?FK@BQ<*4*X%+uJ>y/1<a*<yhiV//G?6@hnB%
6HH#uw R\^>6>%a#l*J?ldhYhimB/?q:<u!bWyHd\c9LV#M5tMl4=*%MZX6DH*Q1c\9$=dq#8hN*S6Du&$A4+QM
qd5EmW =@YjEuMh#yAN##BqcQ4iyjHF$I>$/NIcc?IyucE%=91*<j%Sy:aTGQ1/Z@I/@!yie#&RhVY9+&?ta*l6
XJWhD\ P:ZNIeuj<VH?D6uZZJ5&>EejN>itDZ*Sc=RPE5$*GD1cV=44$n19TS9jK+j#><t9qE+14W8u>FJJ=nK?
dHbcel V+@pd>Pn?L9$VF:98<@WCVK?+^ybl?kWZ4>e!&9Ky=u4\<d*lX%Q1+uZ?hi^L8wH4I@/pTt:Gh>/?=u!
K46byt ujG66%:y9^44*?j\&4HLhk@ni@B5%q>k*T:n8>DQ6QNp%yib\HwpW%lubpjYm?H6Lwb8e$y98DP9?dy6
li8D@^ kdtP%%D@!Y8?#@L/&<8<LukZ4:jib1+DG:L/>T!uZ<Z46b9MhW@nP?wG%8q/uZXXu8B%$\hbn*Mj%5Fp
be9mRK HW6D^m#uNiB@KX%WR^iS9/EMHcnuiD*ycybhw:#Y6+DZPAi\:N1LhYy/5w=wnQXG%:A8KP8Hpm/Q5SbV
?wH&+V aiyuGd1ji:Fi?J/55:w://\8bN*YQXmPZGG8FS1/w+QN6XyDj*RI/*MQM>htnY?4@=u4\Mc*%e&<Lu$L
/kdR?E 4^$Pb6&=8@pddmD4j4Zu:<&ViA:9ZNbSPM?&niyp%48+$J!VM::H?&18b8CN?d:WX1HnYC?kk/pVpNy@
l!D=5k pLbhJq*#L#mCI#n<D6=Jltd:Dil4$FikL$Fj6DhF+D^RQ1kRXAR1AdWF6RPFRi%BHWHdkV1*N=iY8+K/
E+5&DW kdaHhRj%AQWE>RL%B9WB>RZ%B\$ADRRNAk$GDRENBR$DDRiNAI$EnRKNBw$BnRYNA+$HVRKXkZaC:RLc
QnekFJ FVRNXA/cD1wA#RDNBM$C#RdNAe$F:R/cB=wQYkBcCKwCLRI6Bm$BLRW6A?$JYk/1AhYCw1AXwJYkXcAa
eS8<1? cDXwDckP%ACKk\+EJWBJWCPwCdRP6B/$AdRShBDwaNC9RaiCDkMhAVwThDVwGNC^wPNA^+NPAJ$IPlq$
=@ID^8 Lik/$QYkG$A*kY+G*RK/FZRd/HdRucC:RJ6Ah+Q8Ah$H8l@$APkl$KPkj+AiB#$BilL$FPly$LPk=$D@
Z==&Ji AV$QikH$I8kq$M8kX$D@Bd$KikQ$F8l6$D8kh$H9kh+HjRD/EQRS/BQRy/DQRQ<DjR:/F9Rh/H9RD/DN
%>lX=M :hGhk!B//?BHHj!wk^>%<KJiDAI@/8BHHj!wk^>%<KQiARTi%D8B\Je/iFEH9?tqKhKc9!HV8cQ\$Y&!
YD/NI* 9XNLQp%nZZhcpKFt@pWB/<4RM%Hd@#KX<E=KbTiqG@>iTt<uqjB<Tutu\P^GV6ha\b=YG?lhjyW1//PW
/*>Aik Pw@Zu==l@%N/@X@d@@RH9#<>$@/ut/p*5@&yGZH>W&YR%HRPHlkpDa:YhyBBW8L?\CBy\A86>Rk?GLj?
iJNEDd d=ReH+FdIi5IZE\F9BD\R8wLKSkdeu<Eb91CI#m&Wap4eBH>!*eSVd4^dm/mTZ>i+mKc%q?*ZljSy9Qp
TE/1+c *DqC5taN1/w1kquD+GmFB*H?5P4GTH%6yK/lQn1<FW+bBdPG\YFKS*$ZLX!+&J=aQH9Sp1wWwG%=QF+Z
41uVym 1+p$^lyw?P\+c?:<tSlB<nnMN$P>tK<LPC#m>FSa!PpyZB5P\=#Q=i1hPL$6l!We68P\w?*i<655mmad
IkyFa/ tlI%WS1<W:<\peNJHE:teA4@Rti?utw4KhS%bu%NatPeHuL5nGk11quQy&*Hai198*Da%XbKZq=<Bapc
eF=1mQ @Vu9c\:9=LAZl>6#&IQDul#&=4AQl*$=:MhlKaY/Ku<AZ\@p/$F<QbmjhCSjD?Z<d#m<m>PH<@WIDqQ+
G<aAc9 WZ\>t5M^uD/Y4<h^8AQ@V8w?^*M+keQ&64wydGP5$K!M%bPkqu4!*Vme^tE=@>J$Dm5+uMHlVMb>\iE5
4FR!il Dth#PIjDL#te!?H8HM:n<DMPF*C+pMM1D9jkeBGH%S\8=uAyl$65V>m&yKyljVSSXSiyJ#p!#=dX6RTN
m9&@eM KByJSPy4TGSN<hCdHD:A+X5eQ5@ljS!?\PH>HH:F+a5e95Vl!^!?\8?F&=CicpP9ejmJ:hc/hT19LJ&:
a\:LXD Nq+ZZS86d$!%<qR4jyBLGMdZd*Q+MIiQ&E4c96Q5<5!T8H%4:*D+GIj@+QB^Dn@k<HMPu?V\cR/j+V6J
#JXMTE >Siy@8NbD9>u8=Q8&%W*%tdim5:R=&#RZ9pXDRq/J>^t6GM+ZMdl+S\i\iHiHP:D+d+eH5Dlul\i!tGE
6ydY=a \!aPq*P+F+j*e9k8l?>#?B/H^*Ja!?G9PD!K\!M=*MDlSk+Q+nDK+Z+e48D/T@YuK#qe^?EJHB:H+jEe
8SuEV8 48I\b18<*t&YNMd1aw$^w@>N>akHe@k*Dp@p<GkPV?L\bA=@\&Enl@h\?CGHl*B+Cwi@+@BWDp@neBPH
AmL?++ y*P+u5M#PV#Lh8hh&qW*LT?NJ^yYS&5cp#cG@!PHq*N+BahZ&9/+aQ9yVdG/^6K=>cWLG%hFE/XX1y#W
14::Dt <HkDl#h^iA8H6*N+B+Z+Ru8W\<e+@AiHn*Q+BIX6tHhLiNl6^<MT1cb#tEw95N%u^#d#a<5VpaV=iqID
m!LVL4 &djMAEN5!P*C6I^8S@Nk1uPd$WQ<%#@\hd:64*9tVb=K5\DeJHYN5b9=&1ndaqZYCQNci=Y9&@M%h$>/
n5uI:Q B%9bQjIk11jKDnF:lyl=R5!i?V#WlnS>AF@@l/<L?Qy=9m/$qh$ydK4N1Ke8+GHtHA:Q=9BTD5@u<N!1
8be%4P lXYSbHL^1pADJ#lc?>G16Y?Cd?uk+M>w*!EyNSVJl1A<ql@#YJ:La@p#n/WwlAej48tq4&q/@>@mF\:T
8:H/!J **n%Ip$j%FjVB+MdB=?L+Z&Byk<6BD$P/S*a+XP&>j4hnGPc5tjh<uJCY5GCl91w@^>WXqc%iETucjt5
Buh<:C WpJ9$$Fk!\=cJKH=tq!WW%p=j*w&HDmZ94McEw&qyk#weqSY#b?Xp*KYXe#I^ZM6uL=:cVbebhY!4QhV
L:dGX< Nd>liT:8b%H%wwyeqLN+=y/L^!^j=a8dH1t4c&mwL=$V4a6:aa^!c4LW#:LTm4EXI$h/%$/1uJEne%NP
E5Aq+b Va:8J=/4e8I=KTi/Ih:Th&?W5/yq:/6n1y^+#c1YqHP+4S!@N!<8J$9j8!l/pK^?p6EYm/i%DVXN8Ymu
=>R$Tq mYTmJljqJFjXbi%@1tdP!61QJS8deqIPHYNRTT%=4ySeNKcl=j&#WW+<*1JP?wBWPT%<cRhaEpBqNLHT
F9#1@* R?Rw&6wpkK%!bMyBn@BV6pDJpXWdw>e&Ll8ce*k6q\&>!<tSdLlN!&Ki6hNMYT^4PVW=8y>+451J=/Te
4ZMZ#h u%wY<:mjb56mH8W$Y^dLXp:PbLE5MpBXSZq!4V>t#+1FYj5N\5#K$uN5+#KhJ$e*W/d#cSp@uW\uiX>d
-AFABi 000f574cb4b001202b3 Page 10 of binaries1.zip
ZItqK= t$!*LFa@aZ#yl1tV9Wd8>5*1\VhMub!VHn^4PVW=8y>+451J=/Te&8mKu:RH>:mjb9jkH8W$8\jQXp+m
DSF8NI /*5HR@6LRGa=Wh<?uA1JJ4pyc#>B#%IZY!/WIH$+mH1w=c9>!qt+jHZ&ewJb=X^?PRT#!1*^T!caXY=b
b#P?kp PeG5enC4@NN<kRT#!n@#F$k\1=!VpTtaXh:&bMNkX9tupMYCYiYYqSQMKki#!68YVBjMK9@MMq$\1=!n
h8nAC$ ewJb=X#$+MG5enaJ<5ijXT:A@<malmcjB><Nl!uSG#/e/QXMR@?*Tj8^D=%?tiPBLV44cQY&/IyMP$\6
5:QPw$ bwTj*@^cjk/+PbSyt&?LG=^&THHiH+5%:S#R&cC#RGiC#mk&ua1RA:A<WD/wEFREKkc%AbYA&wLckeKk
\8@wW# >1APwHNB=+HPB%$A8lB$Eilm$CYk@\NhC4wMSL>>BilK$J>Aj\bhDdwGhB*wi6CNwF6A6+J8A>$P8kN$
FM>CNT J?k8$N&k?$B@B>$QikD$IPkl$MPkS$CQkl+HQRF/E9RW/GuRM/B@ky+F@R9$d%BHWCjRh1DPwC/k41B8
JepH&B wP/kH1CiwF/k*1A?wL/kj1BTWH@RANAk$GDRENBR$DDReNAI$EnRKNBw$BnRYNA+$BVRXNCPwDLRV1Ch
LmZmZR Rd8AhkZ6BywGKkhNB%YAbwBw%?55$G#RHNBe$GLRE6BT$DLRu1C>RH8D>kH6C>wQhAAwAqwP1kHXk1Kk
5##Qlj FcCXwFYk%cA%wD4RYqA>KA+/EJRANaKcRP8L!Z=aWjy5a4CZNVlc&$Hd+GiXL&/>FSD5bY*%S&/E68AI
TJ6QAR nqb^yK#NFkhXEe^eBDMZ9+TncudXnFl!VZp<Quu1tnK&:qScGW9YPLKtJ^4YJ@GXqJ+/5#dY&PBMuNXR
LK64HR *?lI&n&!LyK!HiZI1w!5nNYWXpVmySX%pYT!6KJldV^Yq@FLC5aLBX:b:4>mVM6/qW*LD^WN6hHb$Z1Z
maTudk HNjjw\!Q=$qW:BPQ@/4WI>u>h%K=!!KJ?qn>!1Rn8>1\@FkhYSHFn$bZPN>cJFpV1jN/PM:%KDu%^th8
Y*!buQ cE^EuJpXVeuGl4Yq</Id%#epcy&==VW%Wd!91pnnKteYGR&4hT?VFHnh/<A\4lNLkkimc=huQwhN<#e#
b&MKW# \@%XtHQ/H9XmbuyWC#/PTC*KWXhXFS/*Vnp?6&=VVMuM1Jw=!!*X>aHMqX%WiZ&$#yG%KH1R%=M8nmSY
DK*t9Q Sl6L1/PNnT/QPk6@WX1JD!FHHu:L1#?k4M#?kFI#?kNKhQRHqPVSH%CYwD>Il&ZWdH1&?/>+>kiW/h+j
@@L1W1 yHJej<?>Q#D8JLM@5Ci:@+=Qj$Db*9&B<ha<?\Nd4pjJu9$BbZ4*B=V4$S<a#PLiH%CYi*?R!9FwXKq5
G#i<nJ %%jl*l<a>?@XH/lMn&4J/A?M8uL6D%I=Q4j8&l?pM6L:A!9X>aE<?kQK<8kQKM8:Q#Bcc%y@EQeSEPL8
<Kt!$b EpLeXWTI8<kIeS<lIT/WE8Jb^IS+Nnpl:m5w^L$qldmu1BD*qlZmH5JC*F>cmGeSF?L?<pLeZ&CI?$5M
AbSMR5 eX?SIi+9M<S>lIc+n>RR>^ad+qupl4mu+BD*ql#m91JD*Fh&mL5KD*F9/TGiSZ!Ii<wQeZeBI8+6ReS>
9+K?jp SIm+n\\S>^em+u=TSN^HnIm:!^F^X$Em:mJJ^H%EmdlRqwluETdm&cTJ8K<+EjiYJ?KiApZeY/KIi+kW
^mI!$N eZ?bIy=F1In:T^X^j:Em:m>Z^H$Fm:m@bBH*ET*mQ4JF*F8+mGiSL8Ki+pZeY:/I?\waeX<JI?+1a5T>
Cl#9hF ba^+FmEn:mqq^N*FnLm*uBH*EVVmQyJG*F@WmQ9JGmpYMXLu^=KNttF4qVcwbDCI!punDbZ5@GYXp@/n
TPM*WZ Kn&NpXT!uajTW>M1Q#&L/#$>MXY*61hK=^hul5W16k!VT%VC*EYqC?PN5dY^k>IK5K%8<%6ViZciTp@%
dBFSVX iCIdJ/WuElM=WnKiMa%%XHK/jE1@VXtbu^lYV94ulbYeIe^cPR:t56LVQ$c5=LRQpdVWhEp?LT5q^ceq
IBI>YR Y4K/im4Hl+enR*%$1A#?+LAT$6/#T5=<#!w9:j5pLhZnmi#jJYtJ^nhJip4GM/b@m%nJci@b5y?e<b=X
I!V@L8 V6y:X5uP>/^!$6?#Tp>:#!4b@y:VW>N1JV&Lc!W>MXWH61hKj<@PDP5>&#LM>/\T$6/#T5=<#!4Q@y:V
G&upF8 W#&i!Qci$^QyQV6TMy+^:V&4=I#*nL?5dcwlj^T8L>8YujHGdZq84>&Yuju8dbpbDGDLe*KBI!8n+l#=
K%\k5A 66y#=Nk4#F+Ftb!Spb9GH9be^TP&%A^G5iY=e+5N+GRbS=dj+#8a^=GV+mBu5u86bQCTLT>nkQBlKEh&
H:a1BX ^qDl\%CP:M^B\+8lHHuP+ePQwX#!dh&8B$M=1!B#TQFtKGi8Gq!<GM1S=#:MiDCWT=dj+#6GHSiGep6&
kE:T#9 4=YMRemLwe44/nK+mNLTYIeTuQ^CciqMRmqyuEEJhubIZchXRm1Su#^%tZw8+@:TZ:FK56/4pYT?VI1t
uRt18E 9WFK!H^6qGy@X/u4nH8#9bZWJd$KK&/:#:SKy+TMy46?dK*lET8ceG&/68!Myt9Le&8/68#Myt9L#Gm/
qZFihb 6n^u$*XpbjC8I>@G8++eP=Qc1!C#/YdpynXhi/=184dWnKb4!*N98ncA5?p/59\i*>F$HVtyy86Mh1?X
d/wm\c nKb4!@MRIl&#Lm4DQ8GTuywl>1R6*FlT1*N=!MyIY^yKT<$RuP$qP<a&q^8*=V49*yHqQ9k/u<Q:%^!=
e4WKYt #mh!@#YZHBjS$DFDqJHn<1GV5Xnq#QGTm6^?LDQdc\l$?%tj9#c/Peij&NLTeI:1ymS:Hci8db&4i&*P
8\NlEJ aP+9Nj5>?^jQ+1wM?b9KtLtlJtw+e$^tjIa=C:N>Jq8FydN8StGPCuc:Qd5kqZcQD6b^9XGj5y%CY6w6
>@hY@Z b!8dc6lbwDGKY/Yp*pHGu=KP6Qe*c*y8&5mXu8We8NJ#$<i6>L!$aT5>!@qI/du&MT$#J/%Q#<^t%5#M
tK*mml TDGyw%:T^#P*VK8BPDLN$e^SH>b:TW>QG?VT5#LH8QS<b>N%=NwG\M\eu:1!DZ?bGVV/8cT/%tDc&Jii
9J!pYN qVd$yYe=Py4$VH8Zp=tVlhN6@XNtl1&ue98!#@meh@8G#@^\#@lch?6kuJ@646@1nk>$=%i=!/i+!@i*
YZQE8i :cM:9T9L?P=&@>l&G=/eZ>&8u>1P:&9:S:Z#T#4n<#qDVuISNJ#TlYhj:=A%uAKGt!CjId&:mi!beu1G
\9RPnt eP:Y@#8qhFjS*CGQP+X\F<udSh!&!hnyI$&GtP$8Y:9JFp+l&%Y!hwnVhlucKVluTM5b*%\8Wy>V%QMe
8PwYdy ml&CZ>14=@:Ac#B$HRc>BpD*we>%$QMc:6\GP5<l#tX\e^9YQAa$n/HMMalqDq?8A=j*pPW%YLpNW=+D
JIaKji qM9R=B!W*Ian%+HIhRn!GH#ell*jAehq1Eqn6%uqm#&pL=YV^uI1&eq$Kmih:XS/G8PybCj41S\:</Yu
L&Ic4m y4&W>C^?&9SEq?hNb$Jul5YG6k!VEY*QcdGmTp6nSyYe!a+1#<tR6l\dT/cuin!@nT*VE+p^HTpbNbLG
NaEqZ: uCw=nV%X5wNBXachShNVM=k$QV9n^l&M/5cmGe#y^ycbDJuBmt=M/GR@X<b#5J!V&X#a#IZBdK!X#qRb
JWj$@w :PVPTG+5=GRiX:b^MI!hXb^Mp5EiGa#l\lJPb9BpA\eDbA!J*9%Wit:G<PnhZ/Zubk/XH9%Yiydd5Pui
DwNd1b j&ZtbA\549%abwbH9YRP1y=>tmNVDdB8jX6/i5bk/>jHyii:Dd#8jX%tnp>hPadm#H:QJhY%BnMGb+<?
:N@pmi MD*LbcB&:\5#e%\Hdhe?MVQD<Rli#eK%RZk%BjhG+M4?Zw#9^9Ki#P:C=t+M:5HcHp#6aPhMSubqaY@t
kC=8%w >YJdN+d%bFWZJuY!y^6n84KpK#N/5KEdA@1!uk9VbW^>D/68nNVZS8wc/1QDZhid$kAbK$=y8Y=4VttA
eDEQ14 #FYu6P!Mhci$ZLh=#nTAe&p1I#NnhTaDab9A#<n#44ZMJT1Z@LVJ>jS<6W!XZq6yM:hyYSq4YGt=:16a
IH\%:6 cSC*Kj%$kGPlK!QV9#Ihm%$bicuq45\M4%4PYQJK!<%aSW*LhXuWTe6*L86pbL4P\Yik9B:ahhp5i<6#
&cc$k8 kdu4>YX9lT+\D+&@LC*TBiP=Y8LjPn$k:6y&9m*XA=G6^n*WDLP&ZViWR\HS4^&:AN#XFTX6&kZw8Wdw
MatYXS *:+>IJLZ+caJ/h*m9dL>*=c:\tTYQ5AF+:XY:h<jiEC<q^B>?\aQSKwGktM4Q61BH6NNw/5&G+B/!jWH
bX+FFt @8FDVc5<L1mmXu5<G6K$>8q<Eby/*Z<GZ1XyG=<I11jXH8@pcXwHS*@S:44@hH>H$\=>McmiXu8<q/>y
a:4yMR aWh@MRZ>^b<$:iCLk?yy4WhwXFGGjBEcDjumm<&d*:<w1J>Y!^eVmnQGphBE5:@aiiikjqw6Z?#a^t/Z
aYPYwa $=R9&q:*u=J>NG&@\F=4/?YLuW5!?TIjjBHX6F<@F6SQ1?YLZh1/>SiZ4b&>ijQVj\u1y>Z!^c:6*Q1L
:w?q<G !>d8y&qDVk:1y>Z!^d1\/*h1@+mtVY\V%E?4=a9%:X*uP@59%:R=?\d%E^#BwTp:<P4R?c^4IZ6!i@c\
LBYjdC aJ^LqqVNHSNQSFjEN4kZ?&MYRmd4C<lA8=cj4&q6DPej\a65%Rh^!tae$=ll!6kAZ5AZ4b5jTA+\?YFS
K6&b?E NGq\SPAm1JZ#R=:JD#n1a58VbjEXhYW%DY9ZN6RHnNE1^\5>p^@YStwCbtm6@BCmEaQ%Gc8d+8Vk8G^P
Mi1nL> NFIdVRSDS&9pl#\ZjykjY=/IJGKBMNEK?THjlS>\FZRS4bRjCq#+wcyljVSSXSiyd\#+wdZ^R/HJD>HG
54?HLm BDHBttTy1Wmj1C$%S+&NAW8$Ku+wM8a4&^n#qWZ=yKIj#FeG@KEF<=ZBpepQtnXjtRntK\N?&G!6d\Z#
>TQN?L qRE@BQPX\bHJD!EHQ/!M%>T8Ka5*LR>awqZKD\Y8@EBhSMAV4XF?KEu^A#mlLLp1pwnYBq#Rm98HjD5@
W9M9+S WLhRHjBEc?cH9GC>M#mC>e:k<PCHaL$#PIL%#8D\+whk9VM+$6e:6hB1M*Yu:^Bja<b*dw>+Hej:Id/Y
TCMH@Y +=MS4?j+HMRdPH+A+uGP+?>CB*L<6+kuPH+S+ptP*+A+Y/jd?Z9Et<#+L69SF5Gj9+atQa*:tM#^6&mL
?TPR*R wltuyNBWnuete\peH+k+N=*J\Ib&+9l<&n4Q<Rl6q?d+B6wm!@GVEh?N+%emQw*nh!BiHuD4#>bG<uA8
*N18aM =R%ZIT%>==Yi*<jC=iQeZ+A4\HtAAIe&1R<W+Iy^HmVApWYQ\RIeYZkaI5DSn9?lAl#6AB<t\IX^Hm:A
JI:GJZ wW@TS%D&NH>eS=^HCeyDZ/PQ6uAlV^#c8V=GkP8C<%kB4m9P+\T+:ZEid#%9umi8B<+VBdmiPE<T+H4l
9$=/m8 QFtA/+*#FAEPMZ&1ANeZ=^$FPI^HiypAX+4#VkJej=^*F8AG+L!LAIi^RN>XkB8E<&+C*GCey\q\R*A8
&@llJP F?CG+n^hkB8Pe+WAN\LuGRLeTJ^uCuCneJ+q\I*GidaAN\duPRLeYJ#uCuDneN=hkN5B=*tM$*%\+*Gi
mdaZ>: L<BN\LqTkJ8I<\L4@tnZ4V68E5+LGXjpk+QRw%h^j=Zuk+Qew?<l\EF?$leJ:k<!pX=6>bPFu5>L%dFa
ePkRcE kIM5yT<S+Kdn9FTA1<B=tRA*A?e>BdmbPP<q\M*CiY<BdndP?%n%:I&DHK@9K!l9L5/@59nFG:e:#95J
>ZR5GT eQN\*q?AY+D#ARLeRy\nAq\X#55F8D%\4lHkF8FeK<BX+^\X+Bdn9EKAY+L#T18>FZ1&w/W+4%LqiiKY
-A8!qi 000403bfa09001202b3 Page 11 of binaries1.zip
Lc1C=Z +S!#eEYi9:5u#15F8L%\ZtQlmn%^i?NeJ<D6k@NcAY=juP5F8F@l*CDA:ah#ZIDDN:Ci5HB6QHH+D6TV
a1T%wZ A6^!uB5F8F1e%\q\Wb#ZC*A4eN+k\K*EicMA6\4uk\T+GM+HC*CNPQi$eCYi8CceD:F\dV%^/*D?6RC*
JQu%XW H8hDBVl<&?8HYdl&u4mNPB<8\B&E<^EC*ME+H!uAHaL#WRLewVkjdiHCu4nDeV=GkD5C=&MF8CN^Q5:C
c^I&K> 6jjEHaZ#<RLe$VmjIMAhk@PJA6!^PJ<p\B&H<<pC*QE+@$cAP\Hu*%1+Dy/+E*E?SaA:CijjCZAu+*!1
eSCB5q AQeduH<9\J&C<&pC*P>\Qq&AP^ZuM\T+$*A?W+A:Hii#BLk#eV=dkD5L=*ME8LN^Qyh^BX4HQC@ePVmj
N<jQm# J<Chm@Q=A6#=PF@A8H\j*KW+Z&mXy?e=y=SVpV@m@AjGIS4!tq?:HPiLBLk4eL=akL5T=$5E8B5RjK6\
t$TFD5 cjLREVdeVRm?F?B8wiq$Ai=&BF<IeHek?FKA8^QuT:*t\&!S8*C?VID:G<=@6QnWG:eJ=!5E8H6\9q1A
MCnMtA 8^juc\T+?*C?VwC:H?idBLkHeL=FkH5R=%5F8Ih^9q&Ai\VuP\T+^*C?X+D:B<:*CZCQ+@^*Ai=JuB<R
yp/tAA +J:G?TEB:lteH^dku5Z=WRH8Pb!jF?Ci^@qqAi+FuF<S+F:E?d<C*E5+9!4A9a##c\LeK#m@L5C>l9Nd
Qq<uD1 A6!dPH<8\L&F<=eC*N5+j!*A9aQ#6\Le8#l@L<C>l*MQAi=>uDeLeB?ki>RF8A?B!^QkQ5H=dRH8M=\j
y6%X$I FPD?l@NnA6#uPN<9\H&B=&knGBi?SHbdRZqjASeY+L+G4wQkh:>Bhmh496Md>!*PX+W5<+PiPF4j*5%4
\Cd4A? ZekYwjZwekH8B&SZCHCdpV$#i:%RNDSdkCNV!t<IeBCARuMFPF4ujETAk!AT15:?9HwB5yeIeKS:$Cn+
EDkYtB ZYq=8eaXI68a6<&u6hb$PW\QX5mDI#m&@TNp@Ni/iI$j1i@jpKEQwuWX+Kmn/CdAwZ@S8k6\/Ci%HkJe
DlV*P1 CaKiAq^dBH$FPHJQ&X8AI*Q89RR+M8@hS+Anh%Z>Bdn6EA\Y+DwnGCnAhWE\TID4mtCIANeNRbWA6#&C
D>P!JH QRT+:kkYCZA>EP\y\QXE5E!A/+XkL\G8N+K>BVmK:TQA>WY\4\DZH<H?A6\ABAeIeAMSSAT+RRmYC*CD
A/8FMR EhRIeEMR%Ay\R^FEBdllCIaJeMMSnBLkSmAaIeCNSDBTkB8FaLRAN^4BGAF8DIK^A6^aBPME8HEIhlDk
1mCbG* ^mPaIMBNRnBJkCM>$y$EPNI^*XtAI=*VZRW+$pjhVaCnceq!Aa=$X/eLeNMSXAl\FRltCHA#EQRV+Gam
hPcQn8 YCZA#WIRE?BtI/kV+PakYCQA#WY\XwDdHeF1AY+ikuwBdn/CBkF8AaIDBdmFCBICZBYCyAC*CEGVALea
Qu9B1a \VwBdktC>RLeWkRdBLlqCDaKeH5mPEmAY+:kGAG8B5G^Aq\6k8ME8CmCE\T+FRlPFPBYInlJkF8F+GRB
kSd9cT LwdkN\Ie:Y<+XaCn9R?uCHC$L?L*Al#6nVlNkKN>E/eLeLTu+k\Bn9bduCuA$X/M5\R+&1h^6kBHi#nP
Gqa\NQ EiBwj<j^A6^/BPeKePTQ=D\BdmPC<\Y+k^BeIMAhnPBCAi:ZCC+T+A=FeLEAh^mCT\R+Ym8<XIA:E5Fq
@euuw/ A6#SCC+Z+I=BeIWAh!!Cc^W8#\6*HIL4QHAFN6#^CK+ZqHeCkl5E8BMS*CnApV8:t\Y+$^C<yuAl4@tI
Zy$hN= $^G<L5ChkiANAi=MBG<KeNemP=^6Hl&+/*DbX+C:HyiZC*A*+QJKAi+tZQ=FkL5bq>eKeLjk<uwB:qbe
kQT*@& *m#A*adL9\y\6?Q!LkGP%9e*CZC$9u?*ALeJq+<LeHjn<kpBn6d*u^VkcN*?cRGP%8*@KeDS89&#A6^D
qMW56m 8Q!*AQewLq<W+Gmh@X$Bn6db*^Qku5Dq?\Ie4eh@IMA>le5QBVlc6@>IkKQ%?E<FPF1Q@$KA?\<89^Lk
HkZhVK cN*?G\GP%8&@E?Bw*j+HAi+qBEeLeC@d6t*=+X:BPTVA@SjujAH8Xb\L9MbBG?+NbH<tKI@Y>=<S+Gl>
wWLpF4 @#pBn6d*u^Lk*5Y=SIB:D?h&A6#:PLeZ+Gl>9/MAS?9:&\q\H$uYuWPGHwA&W?H!9ZCjIykq\H&GaLaA
WHuFlu >#<Ee\T+#^HMFiC?RQBFke/!VQwK/BE&*JeI9lVk9pL\LiNP><F>niB:^y*lk@5G\YdGuitD?=d&YA9i
?Kw6iD G?pLVBjkTF>klkD*A+IXkuwtP$<45?MMjaFb&Z?ZMpJ#BDn<6Q/^AIiPJ:T:AEj:w9<q\NF/@B=i<4MN
>9@+l= S?9^m\R+$m6aLQnhay!ZCuB6eh=L<D//+Z!AwL!?bC6BkC5q8\kC*ACeq\u1lha%y8T\9AAZ+P#?ZR5C
dbw5^# @/:BpYKP\F>CeDn=RR9<8\cHF9l*DR:Q<TL\q^AekZ@Z+QDml:#AjtX\bLF*HNm@d4*<WBDa9\/PVH9H
PcQ/pI kj*4kB@a*uFIK?qw<pNXXRYpl9w%$aV#D*1YX%ZNd?t9HkA1n<j4eqFPbiZ</hq\GQbK=/+qD1eue<hW
4ANq$1 X5&jqbN!qqZM!MX#LcyiXJGLeldQ*HQ^tPY46Jyp<qw6d@+G4jPt^SckW/huKJki1c64cKk9uSP6m/i!
^+%Lcl Ru6P@6kI8:=tZB9q%Qn@Z8Y!$w1^FTNHi6hP1y!SI*NVVp&P:mii1*LmPTpu8mG8ZZ#XJm%$i:HY8eet
lVyaYa w/ZThde%:a!bwWZSk+!$8uqQtH@X4RV=H?5ZZ*&yZ4Q>IXa=1%4&9n1t!wquLce1p1!J%Qp<tFqPJJtd
uuP5LH etyY6iT=D4iX+<iJ+uITYi8H*=n*abTV%Fd=6XQeSuq!4Ya$XK>&8tjF\1#>GGFtbiuJcl61tuLS@!TT
MReQh4 mbyeqJNeXde<G/=1=1!5@ZP!5Tpu=hA^ByZWp8imdS$<+p/iP5>n^P&>na?+iLKenLni=iSw^F$+jjjT
XQ1QGw dLnK1tXb:&idH4p>u/1bI*jYety!hD@^ZJWV#$p=&Wd8hbh8y$d8$LM6H4p>:1j=I:j*k#X9=M=YnuDp
VDQ!dV >mmt&TN*6uJ!NuJHX&w?:bRp66$n/!L8I@hHXnp6:Vj\Hce6t#^>RW9L1h4&JaDJW>jpSAL\LChuE5C!
*mEwZ! YQ&E<cWdyp:&pADcN15HS#p=/eG#qlQQ$j$Ii>=5=Wl:Fw>!t6&#bC5upZYE\*9*q^VMe1JJ:i=4MKLe
SR&lC^ h4#YbenHw<@Xj/@VhiiZu6A/QhKhCwpttXu^N>ep>L8S@@Hp&:c:R#?1+@FyuPyVn9qNCWE1@CINHw=!
RmelG/ i9?=KqXPZY!=WGL#iYMwy&H=c4>!Fm=judYeNyXi$%S<hK/a9/Rcn^=hpcX9^thX9XjjQM&RiT9t=GK?
HRHLDV #bCh/XZ+*I?d#P8W/R#bPRjqGDJ9quLebN+6pnE4#JcVqiPyl@K:H=i^*j%?c4TSPTtuLyu68iwm!YSy
KEQFi% SeQciK\8k^pQ6@Ya8dpj>Jm=KAjNw1Z<dJdV5nG\w%DtFbeV%/kL>/8jDFuX6Z=I=5%JPXqGym#6\nE!
SD=FB* djF:6<yyVLc+H&64CLM?jY@atLWa8M>?8AQ9u6jq5Qi<%1^FD51y1E5tNVVqmH@LwijT@PdZnNtGHN!Q
RiMPAI MW8Rk*JT5\S?=aluCXdV$$>8Wj*\X%W5:qQQJGy+j\&b=i\>6\wn$$G?=Wn8^@mK!WE>G%<^PTnHpH$M
FdNi:t N6Sc>F^GPcki4aZ%5/ClQ84d%QZK!1yEL4=L5$%$c6&Dte:YQhQyh:n%ai:Ta#DV?bQNhPbCi5#bVPi&
n4>:FK NdPahX4SQ4Qa\tPdu<tdq/Pb9Hp@:p!iPeJXSlM4QadWw1%6lN51i@Ae6J!jpqNF<#=b%K1&ihtu%iyX
4J/#F= @cR!T/BZ%dJ!jt1bJc6i%dcq^!TZYdKMqcaip?<S/DF6Y*yM&Sa^6jDY8aybp/Q:&eyYR%i%4J/d*WN6
J=mc^b m/81Qwh#XjZHdDqGPX9S1tw\dkdnbnB8B8NtMG+G+&a\dnbn*CS:Z&$Mi%@6<5tZXGD91>Wjtjb<pwG>
&mS#HS 4+AjmB@!VZ=IBQc?Au+kjmkI:H$Fl+$jCkN:Z<Fl++emB#?5nNjW4mtLN!$QYKJX<pP^K#>RF^H\SG9p
hYdeE? l#ayjkAuqCXZSSLS&wALYnE@qNn=kd1F/wAuYnM@6A*5lRbHy4*R\D=p\A?i>pID?=C6q^<KA98R\bFy
4J/<N> L#T\L^*\A>5LDb+@PIL&pB6?!Hh+bh!TI\Tb9mSun+X:\mQ>WYMQ1w?B9pDC:RZ5H8>S$JhI8CPX<I=t
NkcRuy P1/$QK/?y=piK1&E=#ZVFcYSkD?>ZKQQEM*\Q/y>m+RdWtYSSc#9@Q:$C98jjw?Et?^@?wQju%=y@>QN
HPmWKI TLnF>1ht^QXQ<\\ZqFwZD#?BY51jib=bjFeBnl\thlQkClF$F?CIB*5IeKTy$qPAc+Pkq\BHZNhdkG8L
N&c+eH wI<AS:d!?ky\aRV>BLkPCQwLeKT?NhDClV^^uSAME8DI%6>kAc+#kmECZFeEw!^eumi8G+JlAq^*BCME
N><ER9 8B+ISky\QSGMF8B/ISk9\QXGMEGAw>kWAc+9kppCZD<EE\Y+WkSVBdn?CCaLeAMRqAq\k^D5JMANS4C#
P!#GKP ADeE\T+C*FAE8\y\\^D5J5ANS#BNkB8BwF!AI$*JGRLeKM*8J#w@*Y?6DVhc5@8J>5cN$i#?1d%^a#Y:
e&>9ch 9?6$uQ*?^tq&9>Qi8CpIXqt+R5@uuawkJ5D6mGC%lT9!^NGu*lwBdmeEhRLe#knYCuC:IKkZ+HbF$CDA
Y#pLcR RY#VD4S\^b/+ekRJAa=&#CaFPN4J&mVA#WT\VwAnnj@%A6^5BB5EPLJ%6%GAt+9kIAGPLNMea?HciPKY
#@yVdw IDnY\yX++yamPE/AY+dkiAF8V\RuYLm&u4m>EJ\w\P&N+CRBdl<EJ\6\?!L+nRC*H+JVLF\:V>\BCE+X
M!V?DY +CIIjm@ApR:&cSa8:Ipnui@VBdlcBGeIeGSt+W\Bn8#euTZApcYN5\W+$8$@S+AnujJ#LX^:V^^btD%Q
S^i\ai kKPh@ieLeLSH/AIB4l:BlRIe:c&+TIA:EMHFAl#6e4qEkKM6BJeKeLSV/VIBdn&C!\Y+DRm8EPA&I4nT
SZh^NI \uZI<^4*D$d\J\?e9d^DEX\qKP<IBQ@!<D>8HWk>G5HXA6\^CF=V8JAZ:qkE4\6\^!F+R+An/:S9CuBu
R9ILj6 IJm9eGubl>6\b!KaJ<ChlcBTkD5d\RIB:l\EC\Y+e=Eh>9wP6iHPR*bjAi=<bF<8\F&A:C5F8A8SjbWA
F:h&Lp h^G!@!LAZa#5c\Y+T=B>9RB*KdJ9F8A8R@bjBdk@I958Ai+KbG<T+K=E>6$C*J?R@dkA>&hpQ!HAZa*5
YHQ>^B J\Y+c=D>6AB*HdL@KeBhn?^uBdkdpj%9Ai+YbL<w\N&K:HeF8N8R@b+Ah#8!*^jk:pD&B\Leuen?WIC:
XC&jtj C>pjCZB*I@6VAi+?bH<l\Q$h&X<JeQen?^5B:kFpj!jAQan5H\T+l^AeLeA>dLlB#w=:BLmRAQeweQpC
bPJD=F *PQA6Sjk!MhHS\H8TiC&E?CiAt/cAQe$eNMF8GiAt!HAQR9eLAH8Z<DNEiD?ni!QBdnuWN:8A6^@pQ$9
VY8liI Ai==qLhakH5B8KWC*E9ANRq\L!Q:M\H8FYR@J<D>F>qQbeMFS*AES*D<YEjX:Kwb5iTc<umeZPTR*eFa
m@d+Ru VcR^%qC9#c!9TY!MW*V5nGk115%1cK19NRGLWy6i6iqN5d4G$4u%yR5dX$WVyXYJl6ZSt5cpNmP/9Guq
RD=wka !qn>T1&mai*cTD*yIG1#wyHGJ4JAWBYy^*q&I4KS:P>HT@Hn$WkmWq<V%YdFeD&p6Lw^Ea&5Ni+1Yny#
-AT+h6 000f9ad88a1001202b3 Page 12 of binaries1.zip
1+mqt8 ZdRibe/QJZFtZVb6TYP5L6aam%I/c:%1Fc5m>T8ne+B4TG\eF169nCd1I*ZD6a1Kl4w/*Nem*EnD&ltS
l$nLm? ^5mMYKT8aTYb4/maHY&5mmTV<XYJTDJ1T/?M^P1Z^jAH/+%LX+^KuBYL%6YccXc>ym4WVE=EX$RVWV^n
j*PCJQ $qbA6j8Qe^u$nMp^NcqLY^FtamXiTTPD+61MSG^hNFFiNbe8q5!6d=\<pYLVb!+8B:!/Ll1Nq>hFE+&&
VI?/B9 H<BNGt?K6WVbZAXuMl5\C%ASe<wNR^$%pYVnJCPGh%add&mwR&dF:HK<@bX+9jdu1+4X$C9uGnC#y$eT
ljdq<e ^9XT@CJ1y!IT6!yyYTSSD/c^dyM15:4SLG<Pjk9yqF\b1bt?PBGNe6^+BH6<jnT!JtqQ1Iw$%1!KymW6
Jeu+P! VpVmKmG=y4Eln1ikC?QZp8dF#ETmIbGK%/?LJS41?awa%jy:w?c6F$Fak&XNbGX$LhnSnM<%iDLccF+6
<9B!Lw mK=u@IKt6hFE4Id@AnYFh=!M<8WiVdGcNdYJ!H4#$ty>=mYcC11ML@my6QnKPNeKSdp?KI1dwbiXX6Fw
u9Zd@a WM9SV85cE5d%*By/TMQ\D*PCmWlhGDt1d8^AhY846IyaHF$CQWyXXaYJWptVy<+#p&bHp+&S8pbK+=LM
e1@BF+ X&XLMI8i5YnyIm/FLljn:=KLI<94VN/!pt\6htb64DGXdtNJ+^Wpt8KN</Q4wuXWLAFM^uJp$n9&#QVN
K#q+Pt 1F^y=qS94K>^qDKj:<P+LYIe8y1Q/t>cY:<$buLE@BtJ!M4!?6wbCiJK9q+eRiZV^i#!/R$dPFdXEG<!
KG^mb: IhW%Ci4qnB?bd>SMiRI>dDZ/\5nK1E16dKl9tB%6YB66JKc$Wy91GtQXWiwqG&^FXINJeM=I6&=$KZyi
h/L>V/ /:h5Qa9JjTdjXJWcX\b#Md@Mh*TQ</%l\4k!tk?KmS9MaKcXN#bGcqc6Sad6M5WA</euGmK%%DE^tkcL
h6yFQZ cD%jXKF6NhVm=?1eYPIS1?8id?8KeEQ%napG<\>M:pqXi94jWG8l<e#<IT8m?4*=%a&%>5K51qP5m9ha
$4CH@I 5Tyc5&c=>Xw4%6bT\a8nG^1uN#W&<n*NLp?@p>uq/je!8=#?KP$QKKE!6mFt9<+w6cwy8Tw6IRP^PNaI
IX5?MZ HptX5\R*TN*Fw5lcbp<M1icR#W?emm=bQJQKK1?^/4Y!wSc6LybRDGYpLF^PkwP/S98Qk%$MqqymmAFt
/D?qIB q<wNc<uMDa&JTE*n4EVD&9Kb/L>44Le?F/<%pm1djDyF%CZqt>!Vaqe#q9a*qhH/Jl/nnLn^i>aRRZ?m
PkyhWY utb&wtH>*k*%X9QCNVjHJZm=#H=tD<*F5F^pZ1FQS:!/MhIa6ThaI<pTHuNTZL<EMqN<FeaJT@w^W8hF
h<mbiS N/KVccRSuC:NAThXW/nPTJ$%1CEBw+:nD^bFI@Y^6cpK\PXK%FQC4IIq/Fim$j11BuNEZpK9E/NM4NH<
HGDZ:m W=PJW<Qi\t4DwqQ=VQN%51\GAY%Mk%bbQd>$EiTX&Nww>j=I^F<$4pJIQpXtSabNnI&hYn9e#AC&aw!X
$1IA%S 9u<1Zap6bNnNiJ*eFw\8iEYpJpw\/m%6=ZN^NA#SqjQi1NScqGwatLjhbRwjV=iW1/4&V=Pb/Mty@JEn
Q=AXyW nS8&*/:6?bD5jDR4Kb:?YGZ&?*H+FZG+>Wm#WJ*t&wB5Fny5=/jKhh44VnPV!DaKM$\MPt#1&i@S:N%N
!HCFYq ph@+IdKVd1cyZI1lVhe&GY*HkNk8dXKAPZA+SRF:1yIHdKqywwX4Pu:Tq5/9ytJYyj>Le$9P+EqHVXmX
dRj=L* a%:!Fh=88ylhZqiH#=%E54G$P41TY4lYFluV$NSI/nu1%<cWV^wVV/^PV>HK:He=u9qIQc9^F*dSm1:6
I#%t?\ pyX^dh/ZIXnShbqZHbb=XcLBXT=CueElL9IjX+@H&%d5WJalFbc=<$Jbl4Sa=5+ibSqTJHHk?4G%Su<e
LD8X$k VYlqDe6Zi%hAitb/JYV?yhej&hLN5*6FPLN51S/%+Mm!y:4ZlmPLW!Q^iLKMk*RYVp<#Z45>JVQj@ui&
4VcjAJ Zy5dAA8HSm6\j9KqZh98m\6Q9bn$XJep8pud>#pJTqS<&j:LauX%ye8nyR8ZJ^91ww*S5wX%6cY#!$$u
8*RwnL pNFptb1Y\NBmyT1l8#pq5N^u@Lpq1Y>yAZaS5ZqqGKJ%iqq8<tX#CmXJ%%+=caJyT\yKp&m*6K4T^iDt
*MJ8QG qGIJX9b:TlPmY*JQY%:jcb!WJ1=9cTuPi=qdZ=1cwTudQ!Xueu%56NhG?4iA>A?h*\!C&/d96$mhT$q8
a&mW8Q R4C#j:B%A#V6ab8GKWNHXPa*JYkCQPaF#e#$!WE##S96QmZIiY:#ktcY^?Sk!lKIa=LR?B9ZtWLdH/VQ
DGyj=^ GKa!$taP!=yT%X1tJlFVTJ=MVF&tV!w/dm^n@4BMVT!ZyiaT:Yq1Z6Gicy6nLI9V*6Y+5aHbhd+^DYD:
JFG+VQ Bp>QV=?HVM9LuJNM!*aPX8uq85=X&14VQt%bbpkibjdbT$iTNauyTLjNbVy!4CuN>N>W5=8PhG8mM#*h
BHSq=w t9N$JK9y#@RMc!dWWZ#/yKmn5NV<cH1!dZw$QaNuTl&Jc6I$QeM?j=1ia=>KVe?^#/1t=/kJ%9V$%F^4
4b1ARR tY&!6e\&&%ytVdh/<=A^RYddq%>1*Wcb/+S5Yh1MdFucqK#4Y#S#nP+pe>4Wpi:5$N\uWM9w55^*G6WX
iQ6t<F pn+N/kwSbQP5B8huV1@cKmE%$<4a6QqY^/lq%Ikc+>Iua<6+*W4qP&bu*RGy/h1!hAuHQp%d=9lh%%qd
6H<cG& X=B#E6eh=J#VhWXqV9G/\1#cMP=QbYbMAJhq#kC:M:nd9HCbNR?5j5E=dLyA$tcQM%?H!*S!Jml>j6p4
5p1qM* *&w/GjtPGilMkH%KPnM*ja:c\b?R&=KNmTb/RcZq6YmY1I6pGWq\yXG/1q>b=nt4:iA@?>Dt!FGV%I/e
uLAH<m hPE?Qe@96?^#+++54&VdtP%wN&t#/I=Mm#uVp&$hY61/58*J$mc89XA&lDu*1&SS=@^&tb14Xu?jMij6
#lSd&< nXL#+N+a?>!+G<yq96\X=n1H:t#j/VQw#q#X/6$!:NQ1bV#lcu5YNe@8u8tca=?Jh:+N&<^<bwu&1j4M
9aVZ\Y ZQ9ejWc^cm+@<\@X=H=b^whK&t!@T:bn?6<VwaTwDISnkTAVpD:Xu=tj6qnkp8%aQelEyC<i8PZdXlM!
wJ#/4A 5>QZE#L#dR5MbbaL<nK%%8BMLDZE$VLZJak!u6qQlibjbc=LGGpXbhNn>YXiK^FyQ=8cmp&dqVYcK9+1
H^B5@? Md#Me?/+#DFqY?ce5!%#V61Ybe#c?5/8yZ?kbM/GKYuJ?bGe<TI1tlJJZmBTWjjZdZ\q<EIT^$tE^Xj?
F^M!JX GQLja\nH/RPe$kBTu@@q6PBRF!ZYnykDHp<QEe9a%n>Vq@KbCDNH4dI=E#JLT5&jPCi<$ybqZj:W=dq5
cP/q?M TbdhQl:b4PXn^:Z@h/?y98Gi*K#dWdNDcdZ5W<jT<w!y!>T16j%CWF=qJl8WX*LSe%N#TX6YmnEqc</B
I/%nPC 6dRpc$18lRZSaBC4wiy8aWHwW&9YtAMbq=SSdc+%+Qa\d9jq?lNd&1yVW>98^jlNSqa+=tc*<Qid!W:8
qt9a=D ySkC^HT9y^AZR$?Wt^9cE9:&KEuNtdY$yPc*FQiCFpX1a\$=KYpL&y^:RXSEnynAFH9MEV*X+nLcTRd@
\H1LRB b:B!Jqi/Myk44:m?h4e*/Qw!*P4X9a4eu#b:^iGLMLQt%Ghmm<5^b&y5n==S6l81SRJAL51\9wY*dKm&
/Ci\m# <WELT4G^YE98^VFV9+YqPJdL61kRG+P*wBTLYXyTl6Y1YqCI9St&wBl:8:WL41u&+YBJJ*M=&eV=\l&9
DmlBQl #9pT$19VWVEbn=l^5%9+#NNyK6y&E+:4LbYR%>a/C<=M&qJbMCZBK>HNpdKqw=V6@qSuuyuaDHtPPKK/
^R*PV+ KhaahT16yme&w$TiW4TZ=$^1/eiwiubu9cdNS!/b9c\laW/W&1L1%+\bkjSd!bXCl8$DeuuV!lY^DdR?
?G>!ab WnY:!9:y/4#&@CMT?hhF:R5b:1tP&hlMkE9Tqk%>NF9IdTqXhGcT>@M+t+N4wnFZR6Mpclwq6jV8ttlN
5nV$!q EKW<A=5JyHjGCR5c/1NcSXP!5YF6/d#w^9WNmh1pXq=DT=h+ua&4p64mTGJqqQRDG&tPQ&u8n11M^PQG
VJqGhe FY&?1m$%buFVP//mmXL#d\!F!+1G&8n5cL&yllqLW9&6Za:c$G^*^a1bNFittY1kNPMdI=S=!i8XTe*W
hdA\p> qhStLc+!tK%Pt:8whGG<Mda&hlDAm/IH1d?pl$#>8KENc9>^Y\$ac1A#b/ZWRa&dMDXR?Tj\t$=%56RM
qM4@%E tHp:uPGe&DM#nht:!tYecKq:?5LBZy^1J4yQCLLi1GM&#@e8#A9P!n/HtQydV#%X4l1*T6F<d6L#b8#F
iEa:1B GA1enkT#ytiXL?cZah=<bSVebw@#m\QP8EPF=/6$qSn:Bn6uTlw\9b6KV#GBC/L4#d<@KJKw6eE>$4j+
5n8tTb a#HK!!G&:^^H$yaKh1qm$Dl+=+k#^hGnG9KRIiNaEqbtE1w4Yd9GbC/?YDKZL<95tWy=&Rc^qKqMtL$A
$p=S4R qYwHGXqeqE$ncZ1$McJ&M9KXHWBht\Kw1=1/GPyjqapp$t=T?<:T4^dGw@XtCm>Fy!ZEX>SSjQHG8Kuu
jYhuq? EciMMpe1Z&aC8K8jYX<dm=Da85=WFpwylyT==!F%:pLC4MA#qcY8ENI#&qVaFMCb\WuX<YmNE<by8MKu
PcW#Mt KCYp@=R>pj<mHiDMyjLRtN%?^p!&JT^hQH&?G=DVb%ZH>%@SkNwunNq@Gu$Q8dI!uTndEjn:C8NNK?$n
bn@!9X q/TY#SbVm<maC:Wq$mk$#HTLWIilidnc!PBIN4t19Hb6LJQZ$qQ6DJ^&pYy>>kTV\+MnPH/ca@HMQSj#
#Ruu@E P1Hupdcy!PW+QFXP\9?*cD?T/H/T$Sa*kh1Gt1cYqpEtNw$^JRjqJFjXLe>1nTF>4=d4RY8u8TmHnnGw
DXHtu1 yBbbn!Di5EtA4phSiXZX@F#WIGt9=KKeShYLKuJSn5Gy!%j=+6L&=9q^jA=c#p@J1bIn+%QZiZVj&nmn
4yLB?< 5uL?>G\+^:=J>!i9tn<4J?W51=n^m?Z+LL!c6mHX6^!@pc5==hVp/H:m8TwuuyN!wl9mPbESX4Z5jZY$
LdmuBt !Sw6Kij\=5w5&e4Jte!Tbc\$>%V:H4VlP669bY#K@8ZJQy+e*W#b^/hq=Ed&YSc4u#C?hMQW!X+nZLlb
>jqdiX QS$K!pqQq:Yetl#hV#^Z=eS#W5/1q6X#5*5wn*Kc*WNqK!iS>Z&BEj%HiLPe1G<jSaXEp>^+6B?*=Snq
RGH8dE pPc8VEL!ijMwy&H=c4>!Fm=jud&epFdTMb9A&nPRX:hNidWttd^Y!=8@Ri8<cdEF/NVyGT>=NdVu=I?N
DypTtR 5P64kd#/e<m4F%?%TR9hZ1^%:4GJ$uY/:4cGQM4qyRR!9Y:iE?bjhT6B@5j/^Xhj16h5j$n8=hY5=XSF
=++1+J cQZh=<HMemLJ*JT#deuQKCi4CM*!<!1@h54!5>FR9hyyID>9Y@J#^\#%mF@amP5=?>4MEhi:uB!N8A8u
59dR1m :%/chV+9*i!a?>j!6n^!?<!XN&9p#qyPVa:8J=/4e8I=KTjd!L*8$8*W!B%/65Wn6<j>NH@p>u/\=w*e
<ThKcZ &ewSn6#bX6q?w6W/?ekhZcu=6FPT&HcQ4I8+n>\j@SJGZDIJta5S%:PeuI&+&cc5&t/hM%bd&W#VL*tG
KG##MJ /P=4$IQjh4#YbenHw<@Xj/@VhiiZu6A/QhLhPWN$VWK@G@pjV:=68#9$w#wiu<cyQ8Ya**ARZMI9Wtj6
?cB*dq KKj*u:jGGcI&qb:4tPdS8YL?ptw<iuSFq4+Ru#H%Zu*lNEQG4Jmn=iA\bFX/FV:*+!bnPtWwR%dNRVtG
-A!e+a 000813b78b7001202b3 Page 13 of binaries1.zip
d#8^c5 nJtqHDebe+6p8k1#=YVqiP1l@P:HbT^%9=<cdYSP!1qLbu58$uJVY6aiQRJ/#N#eD*4MZJTDb6FTjndL
ic&=mK chpa&FEwa+4LmY9Wlj9XV+b5/Fw@JGQtyJ\5I%PYh8Eatdd+9X9qNCbd*I?%NaSHu:+*dM\TDN^uQ>!B
BauhJu h<@4N8q9/*t6YaIeqFNSq$^1cMwS@=bD#/Z=#YebZ@e=8B@n1#\H=cT?!9*KEZ?X4/cuu>!m?8G9tFne
MnWMDG y==J%QD??nDL&Z68FWctk*#Lph!Q<SYVk*w&9tJ!WI+l?^l51LZw8a^!WD%cC?9H&P9ph?mXqXYJq9aZ
FueSSA lk!XbYJ^t>e>C&aYY#m#/HjpZIe6tFq5?e^mL1VHuM$5dq5#iaHijVNt+AK>?^>ylA9$:q9P1cJ=u$D9
1k*LH: 91ZqBH4*kS=VT<5J>P+D9j66T@aJ>P=d%6MFi9hdXE/kh>>/>i:#TjNi$:1EhHQ?V>Q%>Q\?Fm+QRXeB
e<91CR D9?%dkJeIWuCAq\Skl+CZDGCukJeG\S>BdkTBL$F8LaIikq\yIQXS+ALI?k9\LXHMFmA/+BkpABH*eBA
&/VNda Ac+VkmECZBeEw\T+4kmGCZDdI^kl\HXHMFKA/+Fk6ADZC<EEAa=mp\T+kRl&E8AGIhlbkB8CaFeBdmmC
IQc$=Y *RT++jSlKeCNRDBDkKPSwJ<AN\4BKkF8NIKaADeGRb$AN^dBGkF8HIK%A6\PCFaLePMS%A6\E^A$CHCV
\94SKQ EB\w\NFIpBDkyyDkKeD6mKBJkN5J\VwBdteE/\Y+ZSB5EPB&SdBSkN5N\WEC*F\E^\l\8!M+XwCnie4n
QFYhuM BDmcMVyBkK6EeKIA6\DBTRLeRkRuC*Ap*9^GkN5D\cpC*CIEy\l\%Rl?L<A6SZCcALeM\ipC*J+I#lDk
ej#cMw >pJ\ykC*N+K#BLl>EJ\6\P&L+B\B:qeInljk>pN\4kC*Q+L#BDn/RD=jkI5k8ECAI=u/RkG8F5FFAl^N
NYS+Lw /%<5\JFi%TWCHH%dZT4A^SBeJ5CSy9LqAl#NEF<l\NEe#dWKq&iH/VbeQaL4QHAFNq\Dk85F=hE*<M$i
ZFuwu5 PQ9>HankBkGPbmN8FQ\8#ST>yuAl4??nhRliF?DYI*lDkN8A+E$B:tSpl:*it\**Y&V*FiBPRjdqA6#9
G8ZKK& pH&qAHe151<T+E=D>q<E8NPSjc$Ah\c!4^jk#pL&#RLe&en?1\B*D4L9E8DPR@atAi=<bN<6\F&I:MeF
tB\EyR 8D<k?\pB:mJpQ!uAZaL5y\Y+T=H>V\H8MtR@K<Bhn8^@C*BZIj6FAi:Q!H=ZkL5c&i<JeH>B>95C*DZI
*e=MHu @pCA8^dbH\y\%!H:I\H8StS@K5Dhk8\9BLm@I954Ai=YbH<n\N&G:P<E8N8S@aMAh\iCw\Y+P&t1T+C:
<9hlC% C:mRAQe*+QIF8E*AFZmMS@t&!L*A6SiWh^>\HRY+9\P*uRD*AIKbCyj9lZ5R\T\B:mEE5\Y+l^HMEiAi
HT:/q& RVBZkH5W\XeFPw@6i5cWek4*GIK9Bdl@IQmPei6<eI<n?IF^/*%\V>D6M&/DD?=J9Lhyk9j&FHDVBdmu
!l%9Ml kb5l\Q$V8FpC*LQA#SHk@wZ5n\Y+j/P<*RY+==D>L\H8Q!l9wcC>QR>eqRD*AuCLBd@:IuBLBdmZkh6L
@DZT5n \M@9AuiAwL^Qka5LeQ<D4ptA?^#bu\q\Z!D:PRH8T&R@JeB>nj5:!E8?6?G?RVAql?WF8AD*m<EXGi6$
iXl5Zk imp*m=CnjXnj9$XGpZy@Ac+Aq\MEPQ#ZB\y\^dkeJMC%\iXkAc+Eq$ME8Lc+HC4A6eQqMAE8nM9lAq^:
+e+IGS ZI/k:Gu?8I/+HCWwd#6en4b\IW>eb%!PEiC/+HK5ANeXq?ME8P%^Ph=/*n^QZA>eVlVki8J!pkDZC=iV
TqTw5* Bdni8J\m\CGtV^Zk?8J!S\G8H!:LBLlTZP+p\A*A=T+C*CBe:mdAneDqDAF8JC=uCuCneVqdkB8D!#pC
=8/bd? *Dle:m:A:aDLia#VjZDneVqjkJ6A&/IE8It+ZGDhZ*/?F&+TLle!45kHN^tZXh#i<u^\W*C=l\A*FbiL
cVLK%L BQi*G!/44Zbi/Qt<XB&LBdl!ZC+S+Gdlet<Bdna8>:Gi\^5*B=j:C51dm<6jYi@DG:e:L9eV+Pdleu<B
Z&pyu9 dkE8D^DkF8I!I5BX+ZK=ALeHLt5E8EY+4BZk1uEbFiAY+*KFALeEq!56jm:$=NPq8F!q!9QELeNq#MIX
cd&i9L ij:8u4leLeD6le5%F1:aE:e*YXwT+QdB=XwBdq>e%k6\9<Jqk\C*H!:nA6\B8E^a8Dci8Ak8p\Leeq\&
?6q*%4 CuC%8F\u\EX^8X/AY+HLDRLeTq^8FPBY+jIkAT/G!+MF8Ebe>4S\Jb/+Jq\ia8Hci8LY+jLZA6^/ZB+1
aJZGqb \G*A=YEY4y$udmM8D^jkD5LqERLe\dk<WwA:BJhHCZCH+9JwC^j&^B&P!&ME8CN\ic\Ah!R8n:N\:V%^
uI5w*J S?H!iAH8cF!iIMAhk<5VBdlneZtTAHeeLp<Y+I:H=Y<E8BN\?X5L%<EVh!I8V^HkV5Lq:\R+Yq<>XaD:
dD#65e DT=@L<DS?8yyAl!64=+8\NH//lpCHK&9umuA$j41YRLetdk<Y+Cn>hX#BLk@+9IQnNP<%48L#HY@m\T+
Q>%*S! K<m1wRB*JVI9EiB8RQC6\1ZJEWjaeDel?F/A8\ZBbkH8hkSjCHC$99YqAHeuMm@%tti\+i:C=YWC*N>\
dtLZMF ?Wj4@Z4nN8H!CkH8Hq^iLeDhm<64BLn:eHthAHe@Lt<T+B:A=T$C*IP+9FYAi^mZ6\6\n?D!DkH8MX#i
%T@Y6I K<D>A=j*CZCQ+@L9A6!V8H^AkH5cq\<JeM@k<tEB:qqeQm4A$d4R<\Le<:l<YaB:Abi9CHA9+9K@A6^L
W<EW^# 8H^XkH5bq/<JeK@k<uWB:nXe9mZA9auL#\Y+6*D=yRD*Nm/@F8Di\iY*A6!:8Q^ikH5Qq#$E8Qh^8XtA
$bFDG* ?\Dhw!:AjRleukD*CT:jF8A?\?YDA6#@eQtaAEj4ijeLeF@kPhwI^wW9ph%YWN=Z\IWFPF4Z/CD+*Y?R
iXn?ER *etcl@QGji8nq&dH@cD=/D9ceJ9^8?Q+h@P>eSRN:eC+Al?e:1MQa5iS\HKhAEeC\a$CZAF?h:#k@k1B
&InTm^ &<%4HeKGR>YE!kY+al@>A#88DZA#5@PLZkLedAGP%u9iEPDcwd!=Al!6>#\m\LXHieb<5dEu#d8iP\C*
bcnh#8 RID4CF!%wJ+:IZ8JANib:IL^::b^!JN&ZF@kI6udt#+E8ANX?@DEDRP8WXB@I+A:lP?9^KhiS94wAY^J
X4RP:9 iRE8\Q%meMG^dS=l+Z:55HA@hqm+H#55*I<hF8:HDk9*a+iF?:HD\9*aaiF?:LB\Q*ba8B<:LN!QHSd8
=P*qcP ^\+L>&PHlj8^\<L>&GHlj8!\eD>&YLkjP!#en^$Y:5ePC@hnl+Z:5eQC@hll+Z:55HA@hqm+H#55*I<h
j:NY:l F8:HDk9*a+iF?:HD\9*aaiF?:LB\Q*ba8B<:LN!QHSd8^\+L>&PHlj8^\<L>&GHlj8!\eD>&YLkjP!#e
@KFc?$ n^$Y:5ePC@hnl+Z:5eQC@hll+Z:55HA@hqm+H#55*I<hF8:HDk9*a+iF?:HD\9*aaiF?:LB\Q*ba8B<:
8BDuLB LN!QHSd8^\+L>&PHlj8^\<L>&GHlj8!\eD>&YLkjP!#en^$Y:5ePC@hnl+Z:5eQC@hll+Z:55HA@hqm+
d#+pNw H#55*I<hF8:HDk9*a+iF?:HD\9*aaiF?:LB\Q*ba8B<:LN!QHSd8^\+L>&PHlj8^\<L>&GHlj8!\eD>&
NKHA*V YLkjP!#en^$Y:5ePC@hnl+Z:5eQC@hll+Z:55HA@hqm+H#55*I<hF8:HDk9*a+iF?:HD\9*aaiF?:LB\
p:eSy# Q*ba8B<:LN!QHSd8^\+L>&PHlj8^\<L>&GHlj8!\eD>&YLkjP!#en^$Y:5ePC@hnl+Z:5eQC@hll+Z:5
AKwI&T 5HA@hqm+H#55*I<hF8:HDk9*a+iF?:HD\9*aaiF?:LB\Q*ba8B<:LN!QHSd8^\:d>tPHjjbbl&*:5dQk
y9%H%F 4Q*aab@>&GHdj8!\#*:55G$@h6luQ*ba8B<:LN!QHSd8^\+L>&PHlj8^\<L>&GHlj8!\eD>&YLl@Pm#e
M$/RDS Q^$&>Gt!:@<NC@hbl\%>Gt&<wL#@Iykw\L&KaLIAS!/byky\4!MwE?DiRLCLAQetAkp@m@cjl+Z:#<QC
uVYK$6 @ihl+j:#5HD@iXm+@##Adb5+1j&Du@PkP>1Ma=1^#$cnqc\CuN5bNwF^^&ZB5ti4QqL<whGcL9FDYdKl
!L=nH= KXEVDjmm%jND95pQmcnJEetAJXw*Q^Ta@ICnL4a<YSbjWXhY$:B&dWN>\Bm6pl<KM@qldcRtaIdY!k>F
KqWI<a Du=aGc?yZXMYd%wi5ET4=IhmX*/kLmLkmhdID&%T@ABPKE88mmTm6REZ6GJ?KLH#A*WL%RFQ6Gb?cP9p
y5ic+p l+dq1\NtcKZ<aQk&C+EjVIjG%W%^<mXZNmec1a$tk1tIX5eQ$&l?MyMj=5iYJ!KJYDA=%R4=Ih?FH*AX
tQl?B^ hBG6qB<KZQml1tF>NFFXF/q9DQml6jFDwepQ$eaEMeGcbGq%a/T?NyKwLVXHna$BT:R1jmkK@Lla8MCQ
M9a*PF m#58<PQmnk9<8Lm*6=@Ln+6ID:Eb@q=i$RS/mQqCQeS<wS=m9qAQMX?wl=k9%EQMF?wl=l6&^$J:C*B9
*T!#ct A:i9AQePeQ5JeFL@P?<B6%!Ai^?+YkGP:I/6EPDI:6k1Ai+n+FaLeB<DX!jAjRJejR:>Eu$GZPIZ+L?I
94aCyS :J%6!JWia5m$4:W+t*&npGqjc/pAX/IJ:CYFDL6bu9&XHhjPy:?!+<I?@bWh%>/u9:LnP9n$X*beS=@?
@jekMI !w:4=NNj&ZHd?jSZhq^uu@:Kn89m$%@beX%>?m5:4y6Qj&ZHdi@VZ>q^*Z*/K#88l$>@bej%>Pt9:Lli
@%I>Kj Q9&XHhjdy:?!+@4+>Fh&ZF?j@51P/?jVZ\Z&q+InPIInPEJc\aKG?1n@^FBqbXYmyV<$DYSPPE?iP1>$
c&pyth j1^?VVT##N:qXXZ#Y@yLB+DK+@G/ZJSVYVq@inde@Nn!$4q4cR/hH5$hW%p%j%bP!qqYMTMZ#:X\?8/q
q<yAqF &ZCXXe8!*p@X@Idq8dmjShYLKuJS#8Kbi!+i5*!XL&=/yK/8wcG?hE/$L8/FMe1y!XI@!$w4^qcMHPqh
H=*X9C P/q!Sw:MVVp%Pd1jiK:KmiipuPmGiE9j9XHP1yc>4+/ye8I%1%yT#8G&e9#i9LmeLH*9w8lB59yJSqi&
Q/6?8# 6J=4G&1ce6FPE<qEVT:KTc/1!>4@XM&eqdWjT#a&=cReP5ckpq4!ZFYyelyc*n<d=eVnLi1pD$mX$<KZ
up%QDy hwAqAXSGE!5>SI/m4W$C&CyHyl#$CD>qC=ReJthWXXX+!ac>6uHbEI?YE>uR8=\e!add6C#tYV9NqMY!
kuq%SY qqPVw@8J=/1eiE:K?cqqMa@:cda5=qFP5&Y^dPZpVBdLIkNWXbRu%@yn>1^atLZjIM!5LD*HNm:ViZJ$
a@CwmI M&W/u=d^$<q$p9i%6eq$!&L%E<cZdyk/&Y9pd6?5Hl\F=cRH#%yPVa:8J=/4e8I=Kce&88Iu:eE>:1jb
e=iCmM QdlHPe*8\dPXp<n/*5HR@lKRYW:W6\?uR1JJd54cV>C#%MYYC!XIH\/mHt4=c4>!Fm=judWe@WW#HI%c
9kdB&X %F@mPQu*jyunbP9#Fa/@R9:=?LiHpA??%QPRu#&PZ$??>DlP/@^9tQG^8!D?J5jJ9?>dHChjpt?d<ZHp
t%bAun D?whnyN9<*e=ZpN&K#tiJN8WHCi@9l>\uG!\j5n^@!M:pl!u?@ta+?R9<^PPp<:by^\uQ+GjeS^a@Z>t
kVb@Sm jAih@Ql^jDdbp8R+%e?ZHL?IdEh!@Ad!$<j^d<lYyBpj*+:<<uGejK^@^@E%=IiQ+?TD>RiPp>@S#S#@
-Ap4#/ 00031197a08001202b3 Page 14 of binaries1.zip
8Xbn/u !uSjR5eE$mQk>hAJm$kZp?P%=C?Q+:<t*W8PH$@/qS\@E@FCnyQiVJEbu$k?4ww=*y@<%ZEe*&?lEw+9
<JGa:\ J@>$HEihl>y^uMwMe@\q$6HpPPt#hDDnp&n68TQH^=G@Pa:QI^%MntNwCuZt?IGIh?H+pal*=jl^mHjn
n*6b9h ?FtId<@^T^H9#9EdEi@Bed#4WE?PQ+=+L+/V:ql9nyPiEX6LuwS*E8y4^miVupk@nyQ8RTuHB!Diu?M:
4&hkT4 ID/A+%MSH<l^jGiGBuF<IiKDPd+9+pM+nq+&NJVnG^Ej^9GnES@P<bMSH<H^5^Hu@uV!bamQ+nn+LVTc
De/$@a ++<mQwdn+LZRYDM?bSV=&8M+<e\PHKi/He@^ValQ+QmDmE@pPPu*ViI+?TnpQtR1?Xtd\uHWVYk1^=Ej
>@ZVIe &yHn$^BuXjTy^E5:eZ\@^HjtPQHXL8L8M%n@!8WeS:D?%S4uZIL%4=cXE/^@Bi6jQ<%eTdD?>VQQqRV4
KAN6*$ Z#pbtaL%4&%QNk#Y9*+KYT^a@&ybPeH/X:D?6Y*JhMH/%<<5$\Z4Z#p1J%n@!pWQH1^@bbMkj@V%L<N:
DCH<e! SF9Di$S^QnuJCL^H6Q4Dbq%FM/$*XkjiI\J?wBZbWPA>Inl5%n#dBN+nk5M&Z8mB>+nk5QFDKQAiES\?
pJ\ZIj *waC:^G6Y*+wCd^HBEith:4Ai$VAD*d9qawj1tbZ%hVFw9YN<&QLk#Gn%jFDWiBNJDl5<pP:\J6IeAVi
ZJQWRD SILDk^<Cd!LBEZkVCR+9jkm<mRSH8niSLV/C@Sa@#Z/LaF?C*^H5T@Dbq>A>&JeR:E9\=J=kZ$K\L<Hq
n6a+<e PF\L>mWE?^JcXp/8bJ?5?99lRH@@J>VjD@V8@Z8wRP@iZ???^NC:L#T<wkh/><E<lBdw*RhHJn>wql:q
&qqcLF wpD9Q8CHNL&aRP<?+Ihykh=>eGmB*u%\iI+Z?aHijZDa>PcKA:*:+HDdq^Qw*Rj<aN@ZG?lbB@^k:NMK
BC%=wR >K\Dj6ACQi9kePYHRM</PAI>/?D\+whA##w+$9T5m$&*Qq*au\??N9R$dD::yTptYWQV8ky\=QYut\BH
myR!K& ZwC/C*CpC>=DkKPX@J+CHHpY/mZAphil*kIeiTV1I<CS6/K?Al^=M8wu\JFuw@+CHKt*DLS\IW<eiWRc
MTpWLj JMCS6/VBAl^=Wlwm\JFuyXEYL5<VS%/Zlkq\=IXylABHHyyGCuDp9Yt$AEjiuCaIePVhcbIAS>/dhlLk
^@##eQ !LQV#kIeiZ4cXaAnL%C:CZDpFcyekCNN1BpCHHtVtt*l<9QV8m\dnn^N#SHk!A9XLAGPQFVN>MDb:+?<
u55+Ki X<$X+Mkn%TwLX?n=9PT6KmdApTi4%Sc8!BNHR@ecAa+<aNWJePRhc/$AS=/#/kY+ZSE$CHAaq4RDLX!^
m4F@A@ J/+eRWKAI<*?yABHG9hNA6^MBP5EPNLwZT@A#Wc\RaCdk&CnADeZ\WEC*GIE^%m+Ny/+JRmP6ZAqu4mq
$#^dpb CI+V+JalPF/A&^QBCSc84Th8L\RuCuB:I#lJkN5H\epC*L+IjmQA:ajkFA9Z#lN*AIJVBdkIk6<LeKSn
qyWl/B ib1FC*9mTKj#hAG8F5EbAl^6B#6VkCPd&&eJePTB/Y\BnuS*#^HkTGj$ZA9Z*lP*B5F=Al#6RDyjkKM>
P8EGNS ABeIeQWILlVkTHj/IkH8RARZC*Cp^Z/JAEe1\yeKeLRV+VIBdn&C!\Y+DRm8EPCPRjCcpw6D46>A\B&L
#%9w$P +HWB:nkEd\l\^!N+W+A:A<F<lW9LQ6!GP^QBQAH8LATXA6#bCBaIePekYCnAua955Nj*l\%Huu9:CuDu
ykya#a I@6!Ai+CbF<y\F&I:K5E8I8R@SeB:tJpZ!9AZaL5/\Y+T=F>5\B*GdL@K5D>Ehq*CZDp+ZiVAHeq58<Y
dS>u#B +Q/E:MeF8D<n?\pB:typQ!uAZaQ5y\Y+/=D>V\GPQDR@K<DhmP^@C*C*pFh4Ai=Y<nA6\N%G*1eF8N9J
WSj:&> M:WAh\h=4Sdk!A9$l\LeZiV6YwC:t#^iC*D*pch4Ai:9=QqckCMQ*><IeA?Rb&\B:pH!qC*AQaVkcAH8
\1mdSd ab1KE?AiIa@dAl^=a5+Z+Mk4hZ5B:ku!wC*AQWpi6RY+y^Da&tYiF?=y<9+5\D%Du1EF8H?TN*IB:qpE
k<j=a\ %\q\@$J\4RD*d\R*CuDQ+j/tCi49Q<BNF?CiB&/GAQemeLMEPQK\QpiAI&@&H\6\4/C<*RY+@!L:Z\Le
Z1djMR 1!l9u1CiZ\N89kD*PuCLBd@:BuBLBdm*kN6L+jK>eJ<Ch+Ck9G?Am\6\=Ft?TaD:H6tjCZA@IQ5=AY+#
\\#8CS 5y@Kn1PM$MHb*+elYE@JaZpBL5D>auDB$eJD:Re8C9aDB+jb&IL>\MGS!R>c5B<+PLSkQ*B\iI+Z\Z:k
*t\DSJ +An&A\iH%*kS?PEKntA@eHB+>R?F\Z:k+An&A\iHB#<E?+GD\&W@eLC@K?AH#@*A\j:\%55QBeH?<PDI
Zj$l@5 *A<e:A<Q?KGqjyiC<T5+k9E4PIL^K#l?99G49d<>C&9jh*6@i^b&uJ<>C#9P#=/FHihu#<KPI@5VQRW+
q&8K*S 5n@SX+An?^P>BVm!Q>FLkMN@V:5Zhl#bu?k9\KZdqjDGpX&JkRJeF<%8#<IdS@aulkl\bH?mTwDdH5Ei
lYJXM@ Al#b1Xkp\JGhmn$FPLJV5W!A/+XkL\GP:Fu5LeBSdB<Bn8^i:C9A>Wi\9\A*AMEBA6^ABBEBn8^6LBjk
i?R4qk !N=GnRA*BEG6AEh&PcICHNuqGCdADhj5>qT<eYT@a+RAS@a:Sky\bL>n6ABH>n9GCHBp9&P5AEj&P<aJ
lR:DGn eGT@a\eBd4^t6?Qmnb8p&i&+iPNIC6qJkCP:HD5LeGS9a%eBn8^6:CdAahm$&ZH^^yG>nipCHNud1BDk
nnhqc% !G@XDAGP:HL$E?DIL5e1Aa:5e5REPLLLWTjApX&PNRIe&iXaK<D646u69Znn!L>99RBHuqadBLkFt6*8
m//ewP mnh8wYc*8?KNI*hjTRF8pYc*8?KNI*5q/\R+5qi!ZwAni!WdBDm!X:JSkCN:JReJeGTZ+^kBn8^!HC9A
X8/uHe pX&P+\R+556^kkBHhnqPFPDIL5hJAl#b=VlbkI6yhu51*nm!**G1AEj&P$+S+Ml?^?<F8AdNdp@FG$h&
B>!bi\ PW+Z+Mk8^^pCHNuqPFPAI^>@b\q\bL@ndAGP:HieI<C6$?#&jL^^bPjnZAGP:H!eJ<B6%P^&X:^^=Md%
XaeW5Y AkH8aM%8h<Wd>&9NdujFG*iwb4i:+w$:VLQdZjHGHcHb:c=+++:W:HbZ9HFHc*c:K>++51h!lRBH>qT<
15CeGW >pHdeYSQ^Y6jhaENS@bW4liWh\KCG\T+E#Z9@hh&*MpIdldkV6MEhtcAP%$V&Jqyd>1FiWPAI:5\d\y\
Fa?Z6^ %@4ab>F68P6<:LQaehj:&Gi^+&:\5e>m^>*pa*jFn49b^?/KHZiLn>$XP?=YH:54h6^6QubZ:Lndji!8
L*>h<C &HF*?6lh5iQ8<4G:a5h6<4G:a5jh:YN*^a/:^<j8ml%*u+@hFV98jl?:K*deA#=&X?!+l*#546l^n@4a
HB=tWF ZdHn@8Fnh<YPi>#H:wwh>+TQ*SW::ppj8!6&*FM?hqj58Kh>:K:aee@/&F&^+=:#5d6m^@*H^?/KHji<
BX8WML n>$XP?+FH:54h6!LQubZ:LmZNG?:K*de!#=&X?!+X*#546l^@@Y^8&LH9iynl/VAlu9D^^/D9d!*eQtM
6lK\Gh AQi&n>$GP?+hH:5Nh6!:iI+TAi+>+NwJeP@:&KP^+#:\5Whn^**wa+@Gn99I^%/aHjiJb4eZt&/@\+::
Yi8X$y XLQdu@ZGjcdb:h=/+@/u&i*ii8M?%?^&c4%^Z!D+wpBuYTdhnMaSN6!ZCL+W+L=C<C*nV9jBja*ki<ch
kYZYWF +aQ:lyb%GHitD?=dH*5=>8j>#5hinl**9a?>HD98B\R4BQXMi9\45?Mw/tq@^+:Vji#9&HElH@5:hq!i
6qHYk? n@$hP!:j^@/PHXjpa!@Hnm9&5bhn^>E/&BRB41&QZS$:n6dB^k9Kw*Y\mRIe4aNNF8DIZ96WAa:Y!<wE
uDqdPM PLLZ9w5AS?61k9clh@P^N&VH>jY^N&VHqj4aG\y\Y!pPwqBJS%Pjw111wuS?4H=NNPH<8P^bZqW%9/Y4
9^$pD$ >kjR5pM<ZyiLemw4=$@Qly5jY%+/h!%ymNCV8YM11?dQ!pp=!!yt=PK=FqW915lFPa6u:4q+#QJXYp$!
\=R8%* ic&YN*?D%uuVak9R1hM#FE!Q%NW%NNTZ#wuY^T%t&HQ!^$da>VZn&mmu^9@*KyiXXw!6GDuT8*bT=a\e
Q/bp91 tb6!cuJ$Q@FeqSQQTVuSDZH6+15&ccHdm:ZPQVab#bT88/&lET^QY^R>!Em4t@iE?XjhTyD@5Z:^%bj1
&a/=<T Nh5jayY#1tZ91&P1uHnYe1wm!byIue?DtiXEp4pyy&bXT=:4eF5=jy\wLmiS6Z:+nZpjSnqJdbXjP<X6
qXLmM= qCjZcpbD>Y1ui%a5#N1QEYbYqy/561GtKSj>V!Kb1MqFPeqXhe8#+cyt#54cQ!edt*JTDl%nWEp6iT=c
8N#D?D J8WSh@LWiS+nd8>6jMVFp?Xp^QW8J$en:5Ly8=ht\%XYLe6/Q>9$!P*=XM$e8dPYW=Pn?+uu1y^+V54J
ZbdY<K NuK98*R:NZKHut*^!P%^Q<$j8d$j4Hpnh:b!lCP*S#HNH4t#qbP#pV8/W9Nyy!T^:S=bF*Ej8V?!!tqy
W5dDdQ 9#EN6G#!>AW6Lch1&=eAJp>hp^MJ\LPeuEpA!&L%E<cZdyk/&WMCcN85Hl#q=KRH#%yPQEj*I?^=5=Wn
RQbj%l :Xp<!tq&#=K6uEVYER:9*X>TMM8JJ4Y:4<GIe69^YyelH+<?X@?>V6ihZ*yC/@SIh!wpttSt^h>ep>D9
IpaEC@ S9:Hp&@d:k:>1I:Hy*G1V#utN!WE1jCLNHk+!8u>=/yWPZY^=WKJ#iiNwb!G=c9>!qt+jHZYe6yWip%V
&@j6+n <hG=a9/Tcn^/hEYY9ltjXjXijjM$R?c6tKQq+DBpb*wXQ9jnJ9M/bVyDh5=BPadMt/WeN=q*m&VMC4Qq
$=E^ZV bPX+/1H<:5hqdHi@u^y6bE:K1W6ti///TDJbY6G\Nl/4!&DG\&$>bt:8B#%tL5yB5&kyQ=9q6G\M:CmW
\MH/#S ieZq^DZ1\9*1J$NYhc$jpuq#Wp/YpTqL8*CMVF9<*1%!GyM6:5jcG5K5V><dNta6B8/#H?:A8?h%Pi\>
>D^:dY 4#X4paN!K81TTR%NPiLje8m=NL@=NYP&IRj*a<\T=KCe%C!BZ#umYaLX>QTVY%R@@FWXm@9WM+pc*q>D
aLK@N$ bnq:#/*C!HTRd#tT?#G?auJR#<bZVA:KMYRjk\&%Fn&ZWR/1S&6l@T^w1I@/NuY>54I1pa99$t\VuX4*
W<B+5j aKc#he>$?l%8jbm:>BnMhQ=pM=&=pB=#N6P=de$5by%Y6M<569Da=tj!=8XwJt@in#8Vb+=\qhHETw<l
9EHb^= 6Yl4G?G&!l+<B!*uy?SW$d^QF4Y1dX:&cdX/XV?y#BLwXdY5uJ>cb5t1X:X6/VHJbba5a/Yy^?S:BHyM
BjPdAE &=aiW:bFVC&<hc=m%8Vwj4c!%hBXLc9ub9hR&?K115@lZFZ>MX8PWe=Y6Kwc!EGBHBVIRaEeFMlBkS\W
H*Q9mw !EGBHNSc=cAN^M^q?<?6L/%KNK^ESTZL>m?Q^/PSSKT?Jt41@ETVbjcpl94GSENh5t\?/1&&ad%yt=!K
bta+Wb te>b?E*:=hJahL%^ZhWRd+yQd&y5dKk*48jYNNR#^5#uP=kiMa84cp1855EZSYynDdd4/l4<aX$KZN$a
P^SlhE ca#XLI=8cDR8KVI:$aDjc#AiMiNt6@Cby$jZSi65N?G+*5JTK>dYPk9PVBKWZWu98!//NqyQ6hFRn/LL
MS+8dI K&jY^l1yPqK9JTMqi<G#!#MLuq%88:>W&Y/Jn8JuJ!L^XdGcbPtT^qlh4HGn>TQ+a?KI/1baa:R!6mFY
-AE$l= 0005ea75b3d001202b3 Page 15 of binaries1.zip
iS?L&K #!XtJncn^KyaVYNVI1$<b>KYQ4/#ZnNT!1wm>c1RJdPZNTV1cmuDFqY@lqd99JXq5d1/$8ZS$wZLp\%%
ERJD9T $ebw&eK/&qLenHXjmelG$5&Kq1d>E8=pSm^T%:CTid<5Vldn++dF?PXNK%jENkBWWVY:KwWnpQQc<+@K
jAXA+t c^yn//Jt+#Pdpu61?6QQ#\T+JDY4?Xn?Mm1n>W*eqqJFb!b=Q+?#PdktqnYB6<k4aSZ8I:+1EWqGmh8T
E4E=qu pHFeE#Q$RDIYS\!hqI1tbGQD&6J=$a*4G^K%Tc&<ykbQn6jb8C1yLa+pXpadT/8nna&^?yXJdXaMd:w!
CD9u1n Ew<dX>Pda8CGtS5c<dQcnCmicYW$WY4?nWa@ZNFRG=$h4VjmM&JJ14?%!$q#$*bZFEX>4+:YNG4ttG#y
FD*FPF h=1Z!!KJi8QuKtbX$6Lm4MXXB4QXcZMZqT/MN<dY^k+CGB<L/m@yIXM@V9G$H:jXAEWl6bwl*+V=6eA@
CQeA%W kh<$16B+P1$MV=+5\<8ynTZZtLjDGa8c/uEn$XSactcYXXdQL/%e^wqwZ9\IjuC\F/icmYPMXpp=FYZV
@jPB9* a@XtdI!bX#w4Mt^mdQ?y6eNNqP>htBie^cYtYAT^^qXI5pXVj&8@K4Z@GqiNY/XwQnjyiVQ&a8n#\bqk
Q9Q1Ti %9T5<5Z<M8!4\La+9#nknD6WiL:T1AEd#R=M5eaep%N6Ln$qDbniVcYutMAF$jZt*^<WThVc+B:yY>4u
*H6Fpj X$jn\DW&JFTu:$#cRlHAKkcNI&yKNM+WS+>1!EPGnGNJYJqJ1K=p:S1V8jlm!X!?LLNueqNKl=mJF5^i
@8:/y5 kE1%k+\5Lw4iC:?6/hHGCD4F>C5:kLw&BXBZNZW^%L<1E$qXmimK=BnnC#*nctE<Yt?tGNZqTIm91KQ+
L:H\Y9 +w*^KHZSbZHKKHPp<tWtkL9/tjY%5RmJ4i8mmYTMJDM%N4npIZZ8R5K5\DPXyc+R$nPc<p4M9J5W\JuB
P#V5P> ThZ^cI$V^tt+1t/5yaV$u:Iu<q?pA=!=XB+c5>9QtMt&lKYLy<>*A*L/4P4+@m5cWQ8EMj6Qw?<lF<<N
m!C+6h VatccJphkd?9MN:$#ETmIYHYjYdTF51@65<RJRJuJ6IwNM^$J%1HwZt+PZRS&#tTVc+14%$d!?T%>FR:
ltABc? A/hh?C4yBEh\@KSHwLjV+uIC9b%k9Tya4\4Y1+L%1tC>Kqm9C6c4k9Y1H&t>K4Dj?W8YX&8T!W*tQ5?n
HFd=1J c!%Aq=FHi<t4wbP/t8Ge?BPB9L1%&8@e9b*=X+H>#1%bjt/t@W:Qh8y19>QSVkQ=?Sht9:Nu5K8>%h99
p=8u>E @PqG:tBZi<9K!Vb!H@LC:>ZIHhn9dP=#NZ9p@tu6h*1&W%j:uXa:QYV1L&DEDi^q@5k#XwG>#J>5l5lt
>lSw%l =*LBCQ&$ZNnLhJd#m:iZ/h5Zb6nL6QYF$:Rj^X/t=@&+&4q$!FA&i=p6K5htL>P#HFh:tX5m$#ZQZ1d*
ZRQQ#Y @dnbBZT>H<Nibk:K!ct>#B#en&E95?Zq@LL6bj4XV/chT:j/Mi%q=1CeuN4L*PL*dyZ#$>uLZL4\yhBJ
j61WT< Zd^:Z4hJj%9Qc<$T=KAet:%M9^4M6C@w:Huy/#+H>&N<qiikHM6iyp<=+1>!\%=tq^dXn<%iyte=49a!
WE9FR6 HiZa:GY&/H/M4=ke%LQ^FbPDek#b^:TZ&cLuM5w^:YY&1J#AZta\5:m%#C#/HaG>#MBiy4@WF>nL>DwC
C:$k#b i=tB9W#*ekJ:tT*uXNG<V/B**>J!A4*:RI?yyiWEi9iB*9&&Jj5Ei9e6/?pC9j56KmjR8\@$:kP>?%?m
CqQWn< 9B4w*Y>n<t1kh?>VV1B*:>XPA@p=$L9j1pdeaHX5Y^1=k>Y^qyWV/N$Hi9iB*u%LS6^A:*:dtGpK>P+D
::Y#Tl 9Z9uEinhB*4*kh/>F8nhP?wu$L69+SHw*Rh/>#:qBH4*u8Wa5p?kh^@w*Re#m^p#m*=HwHej/N*:T*&B
Fhh&l! *4*ZEinhB*4*:8WEi9e6=%VS9E?kh>@TekK>?$CQ1cZqBH4*kh:>6mZ:BH4*Li9yA4*:LTwu$L699Z4*
^XlE?* D4?8=JX$Xm^1?w=6nwNa=YnRhKl4h!55L<Z!T?h$&t6#y49q>$V8X4j598\qyZ8N*6JTuQemhnm<PNba
4d1#=: %*^Q^W6tq%e$%DWpFpXTVmT#*uc$Qy1I%LtW^L>l<!FwiKInS==&q+=<Vd:*<EFWGX*dpNma<5yaWWF?
NP9Xe@ e&5cF$Z1c^9Y#wk$Sy#?NthHG=ZVY&htbTSYu?HJ$^QNVl@yY!qYa:n65?Wqwm8mmYl>VVVy@LN1n#8w
=w\Q&h ZlXJSG6VnmXV@un6#mb6lXKP?wQKl1d/S9+LXhKMSG^hNFFiNhj!A&^Wc>tT8jYNp!jcphNuLm/*qXlh
wC?>NN F+*G!?8mmWcZG=6bZ=QaGG?eEVWC?m6P\jPZXe<yN\aji%yNJNp+KTM%kVeWd!AH/tpinm9RDyn4*F$/
FZYtT8 X:AZ:M#$hCj5cZqLVdiYFbG+>bd5&i\4YD%^Y4t#1/wd#Z8bk*6PiYXY%RptuL++EVZ91Jc+qJIMhuXJ
?!KWuT tl?N4Et/yFhFGt6YSh%!F1NhJDN@e$a$8cc^Ib=!+/uTnX6Nb1R4h=Vy!jZ4awtG?5\M<w9y>4MGW!qi
T$FYwT T!>5ZdT?MdMw<F5$WS>6#MlaaQy/hTR&4a$t$A>pwQGG!eq$NDNun/ba#b4cSGS>Sk:GZ<N4b?djXDet
y1FJXi !D>$SnyZ6?HIp%?mEieZb<VS/Vn=Nw&H+9GG=XybFYXZWZcyhS6qSt>ywGnpaA?\1dcX?pP?M9Qe*1Kb
9aL!%m a*RulF\eVVatF$iY%$XXN&PqP#5$GwyVtda&SyhqFec4TnVFG?hH%$Z4bm^c8wnTtijhIMRtYTCC:M1X
#**8#V >9#1njW%nuJXJXVMV:6l+!tIJ%%GLcNG%BmH1t>cY=>!MF\&K^1lnpVq#$lEXydZ%<=INMT>Aa5niDGb
4eyeC1 Qw*VuME:j6i+LE>k8K=8dEASWW>RbWN>\?^w\>ywI\%yZ1Ct85bahbTG8Rd9*/5GM?KeDYdXluF@KuNy
MPiBuH JBG#dn9qKNd\Z&$$CS<G4/w!ue<cQJ:m%I1G6Y9SiWaV/lie\/aL^Ey!j^%Gd+N:ml6hy\iw9LE^W4PK
mtpwG4 HP9/=X6NJ!N@i1IlWp6DtNeQ#I<l4>+46\yhYWM6u4QPlV<l6!WdE$*$kp4Lc>E5De?@JMGXS8t1jtZc
5B9kc@ :/jL$Pu<b^@cHDttePmTa#d?/R$dZQL<jw5/Lpy^!jJK6w*bnudVYP6>k^b#ymjdPnV1JW1HqKI9n$dY
\qTjh! &y+Mky?b=wi!Iey41QcWLLy+J4$FM#ZXe>bFDabVj%@bWI58MybRLe\VlT<twQ\^+I5+t5^GL>RTqbbM
@@TqZV >bh85JpdGlPSt5bbmac%=VMlJhT+6Y@TMnTh6L9q1qd9qnEZ9Gn>bZXV*QkRXM<T4Y>K!YC8tc+=T!^^
dSFp8h J9N6#Li>l+\Tb!ec%8@h\F!Zpa5?#9A1:%45E4BS%PNGViuA!M9+WDG/6=Zi&bBDpFuhGGtM?mKWEJYB
=ib*Yj aKuM/4a!AQPmG<HXiBEiBbmjSTp&!e^81I*WYbKmG&JSNFIjY&8>byj<qin+ElGQdGw?pKSmnS:Ft&*a
!$b6cW #LSWi5!aMa9lVC\%^NG!<yqtT?L*NV?&jE!DX4aIZ#?^6hFWcQ=X>j^T95dqtQqGtaa:>?t^inM&l4TI
p$NCFn bpYGVa#6Q:X&PEN5Q>8+!9S+dw8YDnPcK9+1Mh!i:CmqIldHkEV!/yl+a4YGd>=pa/T8WTY\6G>LML>4
J<1emY TiC!E9nnep+$kmE\!RP9MRPY@wFmjW^Ty?&Rqy\j!Sp9w1IypVVj5T*1@41N4\VkdHETajGXQ+dtpYY8
Gy=i1@ :tiZb:1/N/iHmGWMJ@jyq@KbCDQHcqWbCbpqyibQ%C!IEwnVL4I@q!&JthMciqPDw9Qc@:9ZELE<py6%
5<MnME P&y&KK&YjiyaYq:F1tnNGyaj$m+E=XXt5pF=JSe>N#YZ6GYqXDZEt?LtHFlLT:Kt=FyaEA$G5S11:laY
Q5\TGA lD/%bw$=pHFJGhZtYkN8D?N&Z/+@5cY6&tCJ=R$d*I9^t+!5eM#Nd8H9N=Ph*E5^BInyZp<lLwciKDe*
jki:#I 6CZ<:XGTtnN4cWuNd!u8BT&K%MaceqLTF4R=>+KwmB\^kTu&tCN/15Xq6JMM@5>k=W!8hGW\X%=^ji%8
Wt6cLY d>D%bdnX1*5X8V>6>w4DF&Ft#cuQ^BcZa<:W&B+>w&\*XI5EkF!WaZ$Ld>qRdiPDFySma:GY*I6nyu+L
^&Q<h\ T*E5q&%SIVaGd$EyF4P$yA!4XdYkEH5#dEE^>ub4F%^V:eQBpp:te4KJ<+W:Zy*#JcSZy/NmMl+^+&c*
b\Zimj <Jtu$%T$:Tae%%51Ic?6hScetdTq5tBKkqimt!NqT$ey&@&y#n\#5Su!HHFEhXP5MYwj$#IVt%EmV!uc
Xpmla8 !*Mt6jSnXD&:5%:V=mPZ#F:YpDAuTt%S>Y9GnED/4emZ>15eilVye:c&D<nqVT6Z^DdR?pnX:C4:y/9#
aJk>T5 &9PQTPSjF:W9bLmuPtbnM\E8TX5&>NF5IdiqXNGbTh:Q+&\P4wuGZAqNp/lyqNVT8&6m^9/#DKX5a!>e
CX+Vpe SXP!5YF6/d#w^9WNmh1pXq=DT=h+ua&4p64mTGJq6LG$P6yIe@^J#bmj4w#E+<dX>Kaa8MGa^W%1=q^n
W$h<<X NFF1@w%GQ%#SWB8hHc$*+nNmTc1@6e6y^:n64mmK?1c=M5*WmdL&qb8Z9F/b%CytXbI&^c#FXRc#%Yq#
SBYJiR F=W8nDjG%5aPAulS>CD%q@TR1S?uiN1Q&&1AwqW#b=pl*+Ty4ep@kh<$16DW/TnDp!hVM&Dt:ZCGe&LQ
t*kAI+ #DSt:!1ZeTKcF#?CH^#5^cqtw98EwJuuuM*#9R9#k4P!#!Gt@6b?XY4@Nc+c6$4SjG:T<&d5^bD/ynQB
S#WZbq 4Pqb=a9=bhl*u>nm@PKAM?=R+jp1ZTXG4hBpy1RB$:8y>BRV8CC/*9#:k!KJYl9eI*&LQ^cn9B^m?<=^
F9RS8! JG&yaJe1Bw*DuAdMTHH$1Ia<bMk+qwTXtaV1T6c8MbtLL=dM=e5!i!a*yZTIyW^q\8\F1FR:!Mnmwt\c
RJ:4?9 ThPnnSF$m8qZhkB%dR1k4t41a1l@XTcTTL8J%+5#4ldGw@XtCm>Fy!ZEX>SSjQHG8KuuEciMMpe1Z&aC
!dTNVF 8K8jYX<dm=Da85=WFpwylyT==!F%:pLC4MA#qcY8ENI#&qVaFMCb\WuX<YmNE<by8MKuKCYp@=R>pj<m
buhNF\ HiDMyjLRtN%?^p!&JT^hQH&?G=DVb%ZH>%@SkNwunNq@Gu%QyKc5&6AAKLMn<QeX^y6Y&pe8TT&dLcaY
q=VH!9 pVEZcp8pWYka9mL1c>FJ%EiHt$MZ5b$n&iT1<61%5W^iT$<Nn8DaTw@&bQFe$:1EhPNT%*Vhu1*u>:F\
ViInDD iRm/CuD=CLwJeIY$A%GAK$LRR+A4RhBVkG8LwK<AS:a1i\6\aRT>BDn<%@wIeLRNw4<A6^&C\RJeb\RD
nbB=u8 Bdk8CAaJeGVKa+kA%+&&Gkl\&!QaR+D4Vy9BBLki6EqLkP6JY!+E8F+I>lLkimQaY+Cn&D+CZF<E?\y\
?pyiKG @SH5L<ANwM%kA6^A&w+l\A%C5F!AG+!kSwAdRl9uBLmlCKIC*DAE\\T++RlGCZAnEI\R+GnH$WkBdlTC
<=DuR: $RLecNymI<CNRVBYkB8LaJ\AN\:BDkLeiARVBLlJCCaJeGWIhlLkhpK\5\C*C+JhBdlhEi\t\E&nDi<C
\GZF@^ ZDq6^ldkcMh:lRBH?<6tCHC$a:&jADeV\TwBnudE^kT+&Rn1BDm!cdqGkJ8LaK$A6#8C%RIe&iGwF?DI
Z1VZ!4 IpKDALeA\aEC*ELc!C9A$dc<yAC*CEGVALea\VwBdktC>RLeWkRdBLlqCDaKeH5mPEmAw#&K^\l\6Cj!
-AJ9wH 0007cd32c6d001202b3 Page 16 of binaries1.zip
G8Bh^j YAGPLJahJ<CSPbWVBDm!b*tmAEeYhW+T+Gn9/<pCZA#Bd\R+&y6=1kBHF1hQEiDI$5j9BdkGBKeJeQS>
tbyXQ/ jLwAh!CCM\R+&kX?ykBHi*HQE8BwK?:bAl#6?D>HkF8H+HkBdn&Ce\Y+DRnPE?A&InljkCN#C^eIeAen
4&+<*W 8FCA?#YCm\T+R^FeLMAhl8ATAi+IBJeKeEem8E!AI?8Gq\6\^!C+RwA:F5G%CyjulV5P\ZWi8AIdn1^8
c**lSZ Z!<w:\REN\l\J!K+WaA:GeHNA6^yCF=V8JDZjMVyCF+Z+M=A<IaAh!cCN\Y+c=Eh>uy9N6^%8P\4\F&Q
Kk@@bL !<5F8B6\icWAh^M8@!LA*a#Lc\Y+Y*B=9RB*K!=9F8B8\?XjBdndeZtZAHeuLneJeHjl<t+BdlM8H^jk
aZD/a^ :5dqE\LeQdl<WwC:D=hQC*D*+@KjA6\D8H^YkH5Iq@<Y+B:F=a5C*D>\?c+A>#k8*^Qku5Dq?\Lep:n<
!<PT9j RIB:CyejCuBQ+@InAi=bZH+1\D&H!!<E8Q@k<m5B:uqejmQA9aDL:\T+F*H=k\D*EwKnBdmZceyakH5F
k<^6m> 8JAA>%@k<kY+X+E4<BwHddk*pQ&bwL!*eQtMAQe&Ly<V+N:B=XMC*L6+nlIB:n*k&kq\:\QZZwD:ALmP
wPNZy% A6!H\G$u\H&E!/5E8E<R#FT+jC@ey\ltCZCjIbk6\Q$Q\S\B:uMEe\Y+L^B<WcC#LJQ&8Ic5teJ>miBL
tN*ChX Ai+4BN<!:uRj*NeI9tjeGV/+d^B5b6!bQ4l9<Z/uCh:dh<BNF?C?B&/GAQeDklYCi6/MaGX&HEXD5:L@
Cae1?D LtYE=kl\EA#%n\W+hD!l*RW+*Ln?L\G8CPW6F8CKkX51\NE/&BRB4m*K&$6R#:RPNq=RH1&DVSVkcB%5
Ew/EKI 5kDZAeFWAa:Y!<wE8E+IhlHkcF%N$D:$L1m@jRY+45D6J<B%A?+AAY=:+JaLeN&B1^ZkikC*RwD4Ch\1
CecDFq Ac+ZeK5F8N:A%Rq\?IIM%R6\jaGLC*Cq\DZqClj+C<>JPaG@<MDPdp9LCj!FB@:CA*@lciWE@5K*$SE*
ebZn6p <P1#La*ekXijqyWV?A5Q@IWH@5JdM8IG@5Jd%6MF@5K>!ku<lj5ekd@\\F>++C<<<Bi?BiWE@5IDj?GB
EL#^ka 9@A6?TwQ@IX:%uQkL:\ql!FDBj:Ck=qF*=qF9!Q\F^:+C@iZ?kJ@+X=H+C<<<Bj8Zp:kL:#quC1c>\u<
S8*ZXK ldi$uMBjiKDH%NJ!Au@lkd@\dW9&Cj!F6/!uC@!Fd%E=kd@\%859QNC:@!ZL1#ZJ=LZtjQGt^SckW/hu
ap\*^T 9PVX$J/VQ#dC41<F<8yY1*e@n>eEA4*:4Xq?d1di9Ye:hhY:h:VVRH+P>P/*1lE*YB*dqpd8aHY5biXp
i6Ync& G:uZZd1hG4pD9j9tQqi#S?/jX8@i5=&//6%d:jTnZ<KIG?nh@<k#XwHi@W<&R&VVq^>>49::ZPnhP<9=
l5y@K: ^i9h?@cFGZ4*64=\t9cn/N%:*w?494^Dl4Ly*diwHJ9i9Ye=4u4*Y!LVNW@9*96?*QTLZi@H$L9QRVp=
^RGW$4 %d9Q\j$ai9e6L?iZ4Zj9X#?b?9J8>YQ1*iikuJ#1*Y@^i:jK?iu$:kj85^@8\L9uhb9$6@Y<%m^BD51^
IbBqy4 /h*:%YCtu4K#=/Y9?^#en@FXuwN!LL%:u*LEZ?YG*9*pF6YQVi@i5^^Z9Z6HPVc>?^dhn@EXp+N/N4=m
>B9e=e eqCPIj8ai9e6im/nHFQ99pZqBH4*\e#m%nK#/HeEi9iB*4&@%Bjw*Z5hkh=>wHj9Zp/kh>>!VlZN?\S/
8*Gcc% >!$6J>C:D@TaYqyPwHej/N%9Y:JQwHjj5y+8$L9jwuIC9j6A:#:R8@<q!18B9j66VF+N:N*:qBQa8@h1
p%@IjB y+H<HPnhd%Wnd4A/6m&N*MH1YM9KCi#hB@d8A*9*LSq^A:*:dYPtKdB*H>m:h^/B9j9A*u%k:%+L:N$:
ljl+&n /mi\h>@CI:B*H>m:>!pu5Hj9Ya+l?\V&:kP>?&BtMYNt$i<I>P+D9Z6@1T@R8@e/A4*:RP@i9b^A:::q
IPJTIw uC1c>\u$:q6cV1B*H?k^6dTeRP<?$L9j6tTjRP??bV%hwHi@SiWEi9i6Yi>?\qW$a:e&&bnim9XBZ&6c
<nQ%H@ Z$yQq#D%*\:V6BJK4$<91ID1iBnTa&uJicj5we4Qi%8Xe@a\Xd+>@Ybd?db$4iB!uE4mmikK4ik%Y8uY
:i?H:E Pj$/uN1b/T<<SW@E/ZjmNM=MZ*Ad*Rtuj+DV:td/Z>wmut?tF$=Bpa#jm&bZC@k#n4:I<<*$R/+mIKi9
&Mt:%i Wiun1Q\mVt@A/WR#@W?9IF:M/clQdbCb@8Sk^N8a/eX>eN4PVQ@nYHyGV1j+:<#$Ml1K&*L/*>V>9#TF
BVp5:y u6%Md+Q!>DFt?w*$d5Jtikqlm5*$Z>?HiH6P*$&q4#5D<R/eQl9qlM#$=+b#>$A@Q^iu1Yd/j?lbPuH/
6wH&8V EjSdb914u>G#eQy9cY:cVDhEme=ti9>LWQ+4c^8Vhiwh$q8:F?Z*j*66a#\>Zh8ihNXiZ>6a%=Ci*9aT
<FE@dm 8njka?uy9:yK<etu9SAj!8p*Yu^T*P=F+qXP*/V+=N^qmA@u>I>XQj?L5CQM>Q*KFJ@e>^AT8Kjdj:Zm
dR5&cG l:Py#FGeZ1@T#*wD<hGeuqB<5uI9c5/e@y*FJ<Wq^J6nYb+wXZ^!C@X=+#l>9PKVl:>BjAhP9$jh@^j$
qtA:51 t?QN>Ek:^TeDCD9BVF>iy9nl$+&IV?V$/Xb/eTHyCE:m>N$Xu#^\LSK+l/tbd@FJeSH^=lSPQ%4^!b*u
KGT<i+ EwdVV%X<<5@VEh@SVB>I8w1q#Cel^Th9+J::VYM?Wiuc&D@l<6@MJ:d$66jd?MTY4q?l?PVK#VTeeQ4%
AjX>GF 1n>=pHlkAcjjyjnp\!8yi?Z$D%W>Z^>Y*Z^w18KVp=>H\l:eIc=T@HAi>TYLPL%Pyb@^PiLXuB=ZjQLS
bKQe/Q %VTpejw*1n@bt@l=mbti*%j^!bHjI4/W$<eyQ6u=9#V5ejwthj<j9p?CNw?Kj%b<<lKNi*6^@%tm?GR@
6R\!LG 15?>PZ$:qj+FDcQ:5N#?H<Wua^>B\4/M:/u/p^8w:F>^?mLFJ&i<T\&P$@hZjLI46ej>#jSlhJ?dtE@!
mQ?1qF %LmVKNi$Ql&bV%T/69JY9J6X#Ci&>Ld*&QnEq1+QW*^!*R5pnHQ/iMWub>K:a6FB*%Z^!S9E?@^Fe6XR
k>DIt^ 1=/LP%Pb/#n>RMWu8#&HlQXen1*j&DkV<R&euqDyE/uPNy4yj:ya<eqT?q9?jNQZKV==@#VED?d?:Y#F
M*Kyw: J#5RQ^^my9>=yPKVKlw9j5*y6/9:%/mPDnZV4!=RjQLHX=F\GQ@88c4jKH1E^Vwej=tk?KV5T<TQ+QTh
54S<dG FJ@eS@kn#jS4hqF<elKNWWh^iyQmp>*@kVm9!q=#yPKV^+u@n?H?=Cqdj=J99h:<<JPc%85J=lPX4p*C
B<>!8p :+d1tE>5/Y&j59GJTk<qMi:$GLT&eYY/QKQX9aZMWY9n!Xm/uQM1?4w&$/4tJ^8%wln^$nqe@16Kn4KZ
i!qZqE e!4G54^c@G+!jd\:=\cpq*K//6@$GtBCd*P/nb>Q^@5JQeny68h1N\muupc>qb^\Q%YpYV<QAh?@w=ui
4^/WTK /T8pZG9m*#kbwyDJ@!XHEJ>eb+yS@$c:HL9BVN<S5wS&QbiQh1EZtipHpL^$A*<1Et>*N>Q*yVb>I:j*
@P1F#i </^&X%J:KiI*Mb=+94&bQwh+@ta#jekjWZ/ltV/T?8%dGE>!&5=tilQ%+Z@q>M6XPY>S@Fa#9R^<yQ@H
*VV9:V VF>NhZId+&?!&u6J&V<S9>%M:$Z!^uI#Qj<q^P>k@N$YH=bWW>>@J/j@W#*ZCTTL*YYtn*<ey@9M>CPJ
K6yHB9 F@>ty8@<D8/H/&eT@iatM*$8!R6ZtPuV1a?<&$#9T:>n65iTV/uN*YQ!R#H8K<V*9\jl:?Z*W1Li?#?j
6!e^qt yZ5\?<><>E6h48Z:RS9S@t/Y<>+#/4&@T*^!9+u9$S@hu6t8&*^Q+>EDb9thh%j9jVGN:\?c/X*&WP?>
ult\Nd nHnuIW/Q1j1=?kVEH?d$yHyj5+l9H#HVcSlJ9jiQ1Y+ibj\S/4&Hcj^>nN>ZwT4uPSyj@5H#6\i4>@+S
lCC^SJ %hunnP?m*u9ibam#Spc9W9Zin/QjjJLVXj>VekjNi#*F/Yi1=@1cbQ/u#jVi:hS:u$d!IX6%:Qhj>h/j
88$Jip I4u/u@^?*%Q9@ZK/6&i=uCjWi#@$C<V@^jLXbi1>u$=6:h<<9+j:%Lhdt*VK#*&t&NJ6<6LIS&*y69=p
JZIlXZ !eG&hF6@$95HuAaa9/6hANqDb:t*D>Yd&b>wX?=Fa+ibZp4jFL<*$\9S#?k5>@chc+$:Y4\nnbZ<j8>W
4+LCb^ =e@+FPp5>+bjX8W@?neiy/t>QK9Kn&NM%Fu8HjyuXj=hpH>$qu9:uYcNP/GdD$D/L5\u>hc+E*y\EI@*
kXW%#: >HqRy@Ajw5@Rh#QVb^%8+jQ/R8dTy@HZ?:t1uL@mN*XikSp&R?Hdk:q%e!Wp>F5qQ?j%kk!k<+#yc9TB
u6kZ4@ IdQhFS\KGW#uhe<GjG@qnVjVN/G>/:#m%Qe$1:$ZVNlAKn>ti9R/1=#<d@H6wy6!4:=9L%ZPu!Du/C#*
MhaLkH D6qXqWQcTD4L9i&HGPNnyM/^M6Yi9m@8YB6^4qkNC6up6!I%Lk@He@Zj^PP!T6j?CVp@:\Ai9&#yQV/&
1\99uK ne8&>QPj6u$Z&NIHZt@h9:+ajdl8!4EFp+Dyy=u<eC4/GN&Wa@WHF%u>uudqmXR^J9/kI19j$?+=D8p5
?JG*Du ^+/+%P4*>N$^B8p5^!btY9Y5*jWZyLMeP@ki1#@Wd5K>/kh\9*GS%Y>wX:/G>Anj@=FYQ/chMADyQKe$
&JYFh% /mY4Q>RHZWiCAJj@H/5@%H:A6+@PGtRDQ%ZqjAYi$Zp=i<dFXu?wQjA/+1\@*QSjm^?$p>DQ//!^$Q<p
/&\Ld< 1=@W>!e<#!YP@541J:ZLIE91QD<$>A849Ym9w*@ViT=4TDi4@>S*yQdIP*KGnFD%<Decw=tQ^q^8>b@c
qZE*A1 FYmdP1<%VD9a/n?%J!=pibw?c=hb@ceiy@dT\PZ9cjYj&u<kk?p<N*6RB/9@%QhCH/+j!P%$D>Z@ZL1a
Zba&A9 =ZJKH/Q/u#NRl5:jC<PTm6>K$hb%@q:a4a*1q=/u>5ZjC%P86Qwq9Ywl!@Gw?kQH&9ydG#<Q?+%Xj6/L
WtSa*u pB9%>h^9uG1N+@qnICQw@B%^!i$YQ?h>VL>4jpjp9dTZJd@qX/DQ%Qp:w4K:^e@=9hF*/9\heZne+8i<
@WlHnq q>Eu/j\hMjJQFn@ujZw<$9p:a5lE/#*tD\HQ/@\hMYb9m\@#*waMw9N*SQZyFn@un\GQ/j\hMWt*?Dt@
wPNupB G<bVud<nnNq\5=#<*ik??V6m4^e5j5/@DLKu#6<SD?^m<ZN?L+!^Pu>HnFqu<ZQ?H#EG/j\hWZ/G^e@=
DQqTX6 l>I*!:Ge@1ZF#*qZ9+L$+*liaw*F#*tdTAdtZV1nZ%j%eQytyJ@AM>duY9!e9^J^@WR#jb@:LZ:PH$c!
Y<*=mQ \Wqt?l+ZYQ!e9^jh#<uMX=hb@J^*?!qI@+&b@uCD^e@=A:/tCX&?#<M5j5:@HebT@STYQ^?#?Dqj@^#y
i@#N@F 9?N^eK#Fd@u/bKTjc1a9@a*F#*q9wp@Tj&?tL?lu<ZQ?yhT8V#QVJ#!9?QaDc1iut@*@!uK4H</:F*KF
HKy59/ jwcJj@Sk^dhjWD>=y6pQj:?d+69#$dj4b=u+iYYKd!jSZMVbb9wJG>X+%^h>55:jZ^M?X*#:#Ed?n1Y1
PEj!GZ QNJ/Z*pjwE@R#?Q?JK#+4a#8@*\#@bl@Kd+hlH9ZL&B<L<Y*/*wn@WK8=\MW@>>N9@5HM@&5=^VjupD<
jNCPT: eJGb@6:bmt<9IM#FZE/>^dh=n&I5%m<^$*eh1Ql&A<q?@<jy^%l<t#?j?5>LPj%Pm&@#b>E+hStuQ/u1
-AVLQp 00074ce929e001202b3 Page 17 of binaries1.zip
RiRAZQ +S<aK@R@<1yF8iLdQ*SC?8Xt?pYQK4+>+mmih!Q?jF4^dhqTyF@J=V>9<Y%?BjXLX=uyV^&u?HaX<j?j
H<>PmL iJ^cw9k&d!VT@<#>XaHm&:*\nclj#Z\aW*#dE&u/Z<#$^t<X*#/Fd!Q>Gt=jHSZj^1pQ=P@j+/nPL&K=
R&\I*& yXk6W&#@yY*iTcX4L%%6?^/*yji>&mc*1HT>=EHd@IMN9?Awhj<ukRh%<:5:@/594jcT@=ibQI?JaPb%
l1T1LR Xu9Jn%Q:Nd?:C/>+T:YZQ8mDhj:8@5QjXZ5=AZ&C#6@hH#/5&58w\dSR\@Y#6>Xi<k<qQH>*:/c?*@Q:
65K1/J $99q:?+>Ew4QH<R*w<:j*ch<yN4L#K/I<*j*5u=Yi<t:F*&G#6@hm&dc?uu\yt=?h?8F4%46Ji>/jN9y
Ft!C?Y =ui*98RY%X+Yh8d=ZPKj>c1j9^V9VPj9:w&hXZ5JFbPM!9i#n&w9X&C5$jt:i>?ZXH6ywH8+l=@*eNXi
?D$ySw :mD=nd?:n*%S6biC@!Hh@P:YunqN6bhJ/AN$<:6dP*KDcm?uW4>^Q<9@ThZQj$Nnyjuh4Ze/Z4YZJdR&
bSNljN ^N@hhZ>T:cW4bGch9:8dj1Qc!&4Wme:j*W$Z&Qy=cm@<*Z%IL/8>=Ee?RVy@h@@&E>XihmbiM4?:>i%j
b?*MZq 6<p6Nn+@iD$66ZF:ccQ+@A*/Ln/e&+56Qj!FdS:Qq6/?t/$h&hL:WZ>X#P*In9>Cjd>eRQ$J#\N$/El#
9yKl=6 =j#hSN>*QA?\1eF1S+WncE:DuAeI6ZqV$:w6NjFj+h6V=*tALt>a:cnk>ntIt@MAi6e8Xn51HIQ9cJ*u
ckhXk^ Ad1?d:Yn\n&y@?F=kM:VLQ+y?J4pE=+H/Jb9<Z@B^Sn:hHMiRD@1F15hFd^B+^VQA*Vd#tyHBX>ZIJ*u
:DTHnF Adw65Mwy*I??w=<#!#u/V15hFZbyT*E#@hm#4HbW8AF%w#@Q=i^46cQC\iB=@RXPZ&Y%w+I@wK*4L*L/
qG1XL? \%a:K4mP=K8ZYK:a!&yHBc?B>@TZiS$\bNXDah6VcR&S&#9^$5Ne@!VQ@NhM@$%H1^$X:u$=Vdmc=h^@
MLSb&R 5NYPC46lLNZb6eY9>4dcWeFZJGP@dyd#^H!4HSY8I@u1DY:9*%u61PB1Gtjj=Qc8&qHlFJJZ*?J&>IDF
$j/Y4< d+Y#cZ:ndY+Z9c%&XLmS=PS*8Q$YY8&weAQJX?@!jS=9<Ht!Mb:P#$PP6dYLEyZ?%:C6jhuTD:uc%4=5
1W#/#b /VPP54WnY*1@=&#6!Jc?cJq/4w>yu8R><@:%>qa:K9!e999iN>P:j/Hc$dZ$@jYBtj:b:/^&XLn$GF=Z
=cY!Xl w&uVdqa:K8yL*:ttw$n64n=YP!41T:L>^>\@u/dc$hQ+X6a@aZu:R<W@$+tjQ?ZuQW*^Q/%j/J?b>>M9
Pw5MQK bLYnw8:W99:H>h@ZcpiF>/B6pp^5%MPB1y!*FmH>C:Pe$tLXnk/p8h\9#jVDn%H6cGiT4:=mPjP*1l*6
!aeFi\ m#=d@>yM9:LccpiFu>M+>R&QW\?w>bH8<=D?Le@LSc%&XFlD+>%*LPhj4Nc#B6D+>d%=Q\Y:Y8&weHh<
jw5Bl< $?5@tPu>Z%Z6cH><I?8d#jRB*%n61KnDVt11<KnlXn51QBy>XemeY>Tj&qP%w!ZklSD@\c@HYi&w<E4$
>Han9P PTGiY>#ub6YPDwBMF?K=^d4HFL>N\:hp!NVV$Ahiw64SubPR#uwct\c4h4RZ?1kRj#N9*G^4S#b?Q8pI
&96aly Y#611>K9PhQYnt#yN==yc$i&>JM864WnY@4I?&#6!Jd?8<@Xe*&\M@G&tj/J4S*>@naceM#uVh/6&6ES
N^^>e5 iPel<^u!d^l86cPmV8D6EQ@GVcwhFc/4w*hlyu??1&yHP>Rm#uwn^y1+?h/Ll1N@C:Hi!M+91*d$Dd+Z
w!?KBK R1\*e6R!^j?jkh>C4Dh!e^@XnpJwE!HYG:qqwNYPmp4A1!HYG#uyPqZP8%PSd81N/M@W1ub$BPVDWBe#
6m+H4H @hqh4ZbW%P68<nHE/&WhXD9/E*k5%I%@h*@Xnp/p8a96Pj%81^$X4pGdCHZu>K>XP=1#A8p>YF=>R>ZD
>+YS\P p<SZQe*$L&iyhuR=96FC9e#:*QmacpiuWjt>VjtlhGe%Hm$k@8>nq9NXS>YP91j::<9+%/%&XJTQ<T9W
b9aWiE n@G:Y8&wcHIQA9L/<9c1Hi&L:@yRj=:*GGn^Y>FknIGlAib>H9TG%a/KPpNGDk$$$%@aXdWnYqeNDVLV
EFb^nq 6Xh5:enG#%<haG6H:Y#yl>9cpT*>?<N6:emYduSD1ZbpT%>\pc$h&jEhXV9/J?wkNNm<#>X*Y?&w1Bj^
kRmEQ* :SC#QwheyN4S9jRiVZ&l@LNXP!4<P>yYmQYFjlml^1MyKD5$uJj4Q%F!*eFXmLP?$Pah%Hn$EMcyEP5L
+ql:%i db/4?ChbVt9EuF/6?Q>G<G1I%$$&S/^&XHku6cM^ZQ<4%Zn$K@TbwdGe@u>YPWZV<M=D=41JH9@ccphF
KBY%W5 @een*X\*Ca*/5^1Qb1E9Cw*ueyS?ZiHb8=HCIK5lQK*cWRQh#$TYY/yWP%wBGVa$me6S<\qFlbA^RyM=
\\<abW Ze$uFF=I/cc?WGnA^/wh@Y$@W=?G$5i?yN4S<?C*pKp9FB4*lYyHX/DMWBuLX*>S:YnSqWnj!eV9eKEc
pFn1iB n:/B:BHctjWiJ/y&%A/!bGkZ95?QXV5/qh4n4w^j19n6M*^Hl<^%u>DA&>S+hC??%WLV8N?iyN4S?=Ab
/cw\%u R8W5^#=qc$e&jy=\uc$hlhZ/!L!IVY>Byi9:X>4Y>%Y/N9++Y#8!+ciDH$KHeD8!+cei1Q1HJL+yR8d/
IpFIGR XF+Xj4j*^/#jRuQnFh\@HG?%w?JmjNPF#HY4k5ei5Pabm9=\CNJue9pu1ZaWyVWSZ5>ceIWcn>cT#DDd
a4$a#i VN@^>&w<P8we&6QP>cQ+y?l$9QQRZMbjbjF@<W!<8>D8QE=F%Zl$HGVAEK?Z:jlZ1^$Xh/W?q6jLh9!j
#Rn/BL cpe@aE\P<Z4b1??yhuRc4c*#i6ttaXa:K6cACjF/YXqI/S@&w8jm>dK!>qa:Km=AH^lmQdE=d!1=:k*1
uIN^Gu 4%lQ4C!8&6FliMaR/+qNX@%JWSQhJ?8JHd*GttewHwp?JtV1miphFqu61Ll@I>JbV?!a5Xa:K8/$Cit5
TjS@me J%b%4hYPmwj@uu#/tiY5@N^1S<YDVpce>eT1Z4LcWjF$nQpl%lPd&>h1S<Z#eC<l%lNd9bjm6<8QSn44
1cpECT mb$%Y+%HF+QZR4!?h9kRya?$HhYD8d/th#:hN5>k+?iNy>ncWZ5%Z:j*A#b>RyY8u@CRVc?t9c$huYX4
diymLQ S#d<9Z8d<*6GP:Lly*!6ut5#!k1b/*&l@!6Z:ik88u>#9W?j9>F1S$XN?M+Nti6>lS5d4HbWZE+/dL#i
M?N$l% N?5C%a=?T?MP4@j>iyHXnw1Lee<lZ8?d&qt%w>68S#19>@W@!?Kj+t:WHut>d?yI^j<9RtaJ<Z4j:E86
Zut&KT hqVeth+94@jN8W4JhZWdpM:4jXN*XP&^M<%6<u4j<=%XP@w%bKTR8h/uL%LjS<WFXD/9>$&h4jV8q1HQ
:1\WRT DQF/*&F:Y?&w1J4Y^Ht>d*X@ya</BuWb+9Y?nhiwhuRN9m%C9N+*6X4XR#F+M<V4jSh@1hySJbZD/*$9
wJ4uXq jGC%w/KuTW:k>d/ZCqR:K1d:=@Y?\?/\&qHS\Z>D84uiy$jjWZLht=C=R1\jiNm:cn!/q*VJYD@R/Cc+
d:6iEn Hi&Id@MR4?5h*p:^&?H+yk!^j8C4i/q&>D1>Z%:ZP?We%a:GRbaJti6/?kQVdP&w9jb#H@<QWE5DBBRA
u/&!$6 AkAIAQSWdTX!dR19cS<AAIA<ARA6AAAAa&^ybY=$e!>pcZN4L&%la!>\et>1bYN$e!>RS%BpcZN4SFJY
&Iq!+K Wm=\etw8atq8:F%4eB9Zhd/:wQkY>TL%qkM@a51YVW8!#Mm$a+pCTapTIeIpbe1^HSpEIRwYCK\BWK?+
tI:kCF 1j!w+:1%/#^6%?@aV1eiy&/etVS^&lp:VYe/Vh6J$p^uPtuTchJ&pyp$hhwj:jR^:Dt:H@aB:C/YAmTL
ZdBu&d \n&ei@j59bhu:@8eQjielXkY&^8dV8YQD+#hMhcn=i+VC+SwNJcLVA+QKqcTe59@<iY69#^+/>9*9:#E
e?uN>$ +^<jjHD?q$Ip56p$*aVw9#aL=dyNR4q?WImP4%QcC+y1Ea%py=PV<X\8qe&Fa:u5jeqERhRXNNk\BTBE
4:K<hm w!Lt=+5b<@NIFiI!yhl%!8lSIZdN<^<qKcK%KbKh!/YTPh>udSc6!4jW5?c%BBT>Qp9mQYhTtyDkA^<d
:+HVR% nwZ*>>@SL%Ti=b%@JF1S$hwWm!iP^&iTZ9@bl9!i@Pqb6@!q+/j#liS5JB*Q==Q=<9#GQZPb/ZVT8&yK
=^B8&F kP1HFD$wX6qRwQ@#B=Yw6Ncwk^X>Htdu@LcD*iaCcnC9l=TuqBd%E?W>wwkc6LAiRBHN6utpZHXDujjH
B1bpSb $kY5K:QZ>NZkTN/mZ1+&lL+w9m*E^qiFiQFNa6ADaNB>aH*lcC1jEQcMQdu5!V^6/9c$\iqWIi6MG5yt
^n4y/@ Cw/E@jEVebPl&nPm<bqWIl!Jc&F>l\qH54NcKq*!BK9RTCy#*DQVnj=pKnMYech/cth9tQu>*tTtLN*q
D@iqeM Pb#5&wJe=C=N8!j5t8lG9=lHepatqbuJP#LHmY5tp8Q^w$q/YQKwI!<Y#!jmcjjGIM?XbuE$B$<XeuFu
6*y9Bc XtR8Z<nPlk<pV=@M=1chij&JSJJGJBa9HHNt:JqLycjh1QZ8QPDcap/uG?ak5%PqNihMq?:tbLj8n6\R
Et\HMq &dLF9R?MLNe8mA^FmcC#X&IS%<y!8thqPhPq5y\eG^\1V*NyAKZ*=&iyY#QJ6CNnLHuG9X$V<h^M5lAi
>+VGG^ V^aKbR$dw6LlcF#V>B#Ne^F4d16ae%uGY6p/%n\Z5lbwJY8?T%u#Z<8c#&LY9Fc#=4GeNc@%4Lp8cM%9
P<Lhl^ SY8?T%4#Y>Pc*/LY@Fc%=4P5Nd>%4Zp8dM%#bY6iT%9#Zh8c^?LY9Fc*=4P<Nb@%4dp5eM%4lY8?T%##
*\w4Fl YPPc&!LZ9Fc==4uMNe>%49p6hM%:ySeHZ$<hTiWLuDI>q!mp5yu!Zh*Ket:1Xu4bHtNqqV&+tPHpA%c/
A$#PTG k\$+p=$d1#P98K</W<$6%Nc<ElbRttN^AF5PGICXMn\YH6WK1huWGTiNcD\^Pl/PJ1p@my8$qiqkG5=p
!B6Sc& 4/dbYaa#XieaJWuq4ZZ!C!9hMa$GpqN#M&Znd1R/l6^IKl%6I>W=$Ecca+!NJQ9\YmtP=q9JcLtXWG\l
pSMhD8 c8\eTu8mPayINAdR8HGMubFWQt^G8u*E4BTZ&64G!W4kIdLhPi48GBkn!VEt@iq$&al\ttM<PKF$NDnN
&KDYW1 PSce+lkJV4CQR@Hi$c=mIqyX9C&&R1?j5@?6JLQ*>TTn:^q%>D\uqQe:y>y:9ZljXnhdn^h98d>N*FbQ
bnMW>a S%>#k595L=EPnET:YGCqPMdbLklkbE6+5mQXdZeyp<#L56#?1@Vh^My^9Jw+p<8*Eu9>>d+11a\6#VG1
$Ra&l1 Ja@uJQ6#m@i&ET49KV&iTidC^l\8dmRVMei!+Q<dQJXIcq#jjQqYXp4F#u^MWmW6L1QHFT\qyK<pp$K^
:V:Skq CYZ@K1FeZdjPynK+*qCht$18wyL+hkyF9V64>B8B@\/FJ8B9WtkG@leWYwD@M!5ukdMi9\&Q:/TwHjl%
M8w@e6 q4yD/ciwA@k>FC$Djwcm=eC@RNEK+G>V6BL+Z%P$C9nQKi1EjyD4*kZ<MwyYA@<ISY8An%K$Fukc@eL+
nNkDN= \^T6B@+eSS8Aj+&mneC@S>Et+Q@E/uLk@$9Sl/DubHyl+F5y8l#+AEXZAL?dwm8B#%F$FjAuKjw\<Dew
hMIiJ! 8l4+6!u1B9=nmnaD@\?K4wH8uejuY8Bel!*Ad/VwP8B*a8\bQ$qSD*D8b/nlG4mj6\L@DpZdkQ?Ww8*A
-AQcDb 000c889675c001202b3 Page 18 of binaries1.zip
R<w*Ji 8d$*G9kTHyMh\JuGVeCnFQWC=:u$EiCjwtku<New8lu+8^V%Aj<SSdeA@$?KdwX1t8jCS+F#Y&<D9w?m
SCc?\R ZeD9LTy8CV>NWV@\#%P$B@lZ?GRI?J>SNACe?*aRPLh^!MCdiH:6Be:>9R<+$^5G#tP/H@kJmk+A@!^F
maM%nL I<D@kA??kHN:D\L@IWYn\HqMa\di*IE%!VmQ@^l\d85+<D5wtkDPl#PHkD>G$S*AZ/JwE9k*KDwM@G<w
m1JYqb 8lM+4>?QAij%i=iB6@Cc8B5+#+X:kHM:Qk+<RhES+N#&i+E@RXEe?P5WVRH@E+wT\LpP$<D@lTKeQLS\
+M#qQy @^@FtRj9B#QAih$eA<=#LRX<BH5Y+%#H+<C#FIEn6D=CER=FYy?qKAQ<T^SqkZQ@+HC1qhj:@eB=@8Q\
LbTXy4 1@Y@KeLSTS99e#lEcPN%N\ie%><J+D^QV\Lu<V\FuN6/GnmZQRQ<eay\^ND&QEWQAQ<!Sd<GuQ9\p<C@
lqnAbL V>G9A@>HmuD\%9a4Qm<%<Hdi+^<C#u9l\<B=V*wEPK@y*\DP<@yS+D^HQkYe??\^+F!Z*\VP%<iBe>@?
%Xj^5t FuDi^*+d?DeyikL+h!q/E9lQ\GMa=@u@FDVn9J>@Gnn9^=<B#9Q\5<B=*D<HuPjI=+F#8:<A@BtKukdP
XNZ&iy c@Ab+L#&u\Z?h^V>L9B@yik=A>hb%QQAiS/?AJ#*?^iB<::*EuDiQ%+G#t9^FiA<y:+IuQ9tXiBe>nZk
hnp?iQ 9Ci<D9\HFH$JPQjQ:$qSb5HAjWb>&9E@ECu+ZqF+TT5*\WlAQ/LeC6+RAT<aBD@5AY?:Ed^9G*n+F9Cl
mJ/XeJ /<C9h+NZ:IWe$\Hb1R*!%D:IV$9B!/+FZ>wFjn^5P>LbD>ukb5kht!CL4IDM$\p=1Bt!#t4ILZ&RRhbA
+wkPJ< y8pF#:$K@Qb1!Ht*RH=ac<pt8m#aCuutJ5lj:bBn4wH5eRD<68W<nNPI\VNC9+AwPmLM\Wqda^W!nBJw
daAtuV 1=59mS5XuDWZD=\XuMp1i1C+TeiMM9RR^VKFEGn*4en4S6?5Xa$B8eI$t?DTISB%TNnta+#H>qC<$dP6
Qbhp^8 :ZnwGy58WH@N/hF!!cPyW\:JZTp>APikB8^X:@/!?pWBZd<cM!Y%KHN/HM^Z<j@WHJXCmEIDlTWWtmk$
@p:6qI W&ml$E1lnWI:lcWWPmm5w*A=n\&FbSTYW%lBaTYFVkyhFFbVYKQ!YDaX^<lwL8aKB>W\W/D=RM<%#GJE
w<QmwX M+WYC1$W&lRiL*18\1a^6Ib+jqDwwLCM\uIKK!m5yNBJwa9Ccky4KK!q5I:CikwdKG^WiC*41*^5hHVC
/jJuF\ $RN:^\:FmwQiPJBLuhDNdN1GlpjaQp4BXeW%lG5D4p6\deG%GhhYZI6$&uFhcu8eGwwN<iydld\PZJjl
Jc*GBd 8l#Zqdm8\LWS%$=e8*C>DNjX8K:BhT&8/*Bhn?5GZL6^*an4Jq!NN/BB9H$PacW4bT8>dMKbL:kQRGd/
>d^iES JGTpW=C6#pI&ikm!&Y8R9%/HdQRI=ISuISM>CluwMek<n$QGPR&=+Vu\/?elI<^AVp%BLp%Aun$PiZRY
DPwtT* <9CLpHqjkn!clj##ceml>$Q8#EQPuINePR&=/kuIG$>ClqwNH4AYjKAV$:+LjGID?Mw1:CejSqe%kFe%
:ma!=D kqi%k%>%kB?5AC?/DH\tDQ=^ljXi49P6biA=#iAX4iCD6+Ju*kc?%\i?ek9+b#>+<M*kV\jAi/+F9:$P
RZT$iw 9HI:?QEPG+?#<?$mH>=u+*9D+G9:\hN9AM@jlui1ed^DHeI:&i%+h=4E8%IWeq\MM6!hiFj/DPVR8@CP
m8X/*: hA@ima:kHTmP>:4QRT=>FVLy$>a:+ZtGJS+LyQ/WaC&GTu6$:l\NRHeS>MhmI@4P$#A\59h\+ul1t4Yu
cSa6pp p?P^mMuYX>4ailqH>&D4DuHEbM%CXW!t:=DT?Ny5YMl8?/nd#mil#1HJpudPFa+e!SjmiyV:aC!tFciM
!h/TEl nqZVWH^65>8Y/t6wp:t/iME55e1F9My^StMAi5\bt\KWa?:bHKAee>mYAPYak:aFKMhe6n%APh+:qkaw
4+4*Q9 ^>!/I$A=qlCYBTnHW5V!APXa$qllqqM>!:GE5VJAPbbcXkWw^=JNb+B!LPX$BTnHE6icAPY/>LjM!8Xa
tZVXm= wq5ZwB^Lji5DqGQJeEPAem\>dk^Rn1ZKVRHK5iS=YaB!LJ%?KEA=^5JYPe>%#lJ44>j<5*FqqlS9>6w*
\YtbjH dPXact&6SE?CBApTF6?Lp8F!bNMIdLJyBW4j/8%cktW&VeFKt:c/!$W4ahhEZE#6Zab/N1L6VYl9G>y5
M<a^p8 d&?#d*9Q@!8uyZeY#lhF+<Y@wu?VTX+wb+*AmynD:=:@V8euY??4bR4%pI9K8pS^9Wp/Nm=PpI/NLmAh
PFPPPK G!<N*mphG^$LekH4!5i^<Y:%6HyVmE%8hMjGh@mAWA&mCqIN6q=SFcRcc/A^AL$qRXSBKpTqAPYck/l8
VRWa1+ XIkkAewFW9GwlnnVGcBei^BXpByR^cNCVA^RdqpRXbB1mF<4A=SdEWRXyBymZE8AewFWQGyAFa<KI++A
K9QwGk =haEWh&wlylhWVYm\qCppmyDNR:/K1yGXPM\5KJ1^HbCI9dt5uNciB88&?%=?=L^/YT8J!Gmy\&9m<na
clyK&Q PG8n=:TiphTWmBnu=D$JDcmPydSn!S^J!It>/dpp@&<<Mb\yJHP=Pc&Ry@6DhNi:k+9mTZ9V&cq+t4MM
/P:cRe K8^/li^whm=VPFSIeT/Sn8&=jT+=b#\tp5:tp:dda@HMVDKcuS/IF/^pdWcLJtiNTlmXNaqSCn8EFQHB
d/VDG> #IqWLy9JG&WHV!R#BiBEIJ5:diAHp!hSj4!Ra/6@T1buGManiwtJZF#DQ^/et$*tWkue/YYR1=pJhu\p
Jl5R6R GV?iS/&BC>$XyChNuY%*ZC9&ZHkmP=AXjjd#4q\?q^A$PPHlYT&dK+Vb!TRct:Vj:wtu$>q5J4\9tccH
>YCE?W V+aN:^VPGW8iEdHBIZ6l!$ZAeD^\QM%wk9:I@uScDKX!ijc=tbtq*lN>lknWJ$Sjh8w?n*<4#dKq/4E?
G!Wa+? kw+^KB#4*eGVn#G/59jN=l&yI#8u4?uy*/FQ!?n+THmM=p%1Npt=^hTSdGcGA!ilZ<M&V=/D&W^TqLpY
9nYbX+ &h&KTq&KuP=E=W=hNy<J8%6StW8S4SJ&X/ITN/ITF!K+D%tPGA+uIweuV$YGd@CaI599FNaJ=pblPTb5
bY@b>! Fbbn\yC\HBN8F=bn\q*Cep^IC<6R:RFlPTa<Kp#HBQ$RHw+J86FHWX#=tnAhE<T*lPtaIL+uVMeE<VNl
!<!LqG PmcIZ\uLMTEpLMiEbeJ$VFA&ChM^RdqGtI+J!p*ChE^RhkuVMWEbEcbnknIyVMeEbW1anktKb1qQqAiF
d+\AR^ /bmk5EEIHBMWNm/Ba+L!?<J$VFC?Kp#nQ+Zj>?GawQ!XMB$VqH<RytPC<p6lPmawdB\P^\TX?^YPCT1*
/?LHhE A$biK6eSnkp1G*DAMWHq>5I^RYZDD#kt1G!EAeeEqR$9+Jmk5yEL^Gn%8DAhE%S?AaSnk5yGM*BMWNp\
$4\QNQ B++JKl9W\DFB=jGFa+LKB5q\VFDb&B8PCi1jC6M^RYWHBDkt1G!R*Gi>@SWhE$I<=uBMCHHdeSRj+9/A
e<#Ha& a$KIu\>Nl?+A5l5+6^iPCTE&FwFnRwmNj?CaEPJZMVktlNnRB++JwciF/bkRawMTPCcE&HEDnktl>+Vy
=>#a6t tBD/e&E/JwVaWB!PCTEi*\6nlHL^Ac@VLa4>XcNB*+?&9**@!\*#<!?<IN>t/^c8Xe9u^a%jPd4u#9u=
k1V>N% X%/W*XP*eH*I45w\=5W&a%:<MC!:y$/lYb<LLKe&NQAh9jZ&!X/ye#$\H#*N#??GF1RQH\!T</K?=+M\
@:T*:9 HGXwQlCpW%Q=Q8%w8m?Sub*Nb8Ve1M9>RTtjD:Q^lJ\M>Vwj&LqQ\Th+^8e$XwV&GZ4\9J\WhVkjRm:#
ND9KDK aTR%qa9uWpp=I?y9QnT+#Ai/p%6Eue/HJeb<TBb!&bQJ*QF<iL\R#$#He>Nla=e+LchEZe&HS6Em%C:*
cw\yKa $<:AMJCht^pdH!8iR:V%kN:Y4X9Q1Z+D8SM=5XXZueXe#e^1D\%8jTTlP9kk9RHNaY!Y+?AKK1$6/^Mp
N1X/A@ hR&h*bHSkeH8eQhA@$R@ZYLDpau8i88EJZLV$#iMw5iA+nR4ZhmZhB4htT=@Xen<<qAy$%H5%t>q#/+\
yK<WA& iQk8neZPLmade>nw6l+eQhkjHi\bQD#wZt/*!au>4M\:4E<%Ee%D5YH*4!a+?Qmq5<&S8Lc<#AJ6kiLX
JQ5@1F +ljZ&nGc:hc:dM<^u@G*k=5D$eJY6$:&ZKjlyjCylTbSdyIwRWIhkYFiZNhKBMW\jJak+V!BbT5Vp4a!
b@LY*d Ewy!p:TXpXA/H+T$qbEkyK&MBM@=IG%qJEldGRqi<$Hc!pmR6nIT9PbDw>S:T/l*5H%lw%+*BKu*qmA6
I%ZkPT B5<LTI9Bm^kY!^hmyYYnCZX9&hk5m4@+yi+8ulDIqT#j/IwumK1eD*I?PE/M#9hH&E6NhaMaHZIb@w4a
@!N4dS 4ih5hcmK%8YG/mIYm*mwL6aduL5/8JhC9/cqc$EuGl*bW/te:iPS%DL*M6Ha!FBN/E^GBt4SL59+6nw/
@N4=h> E+PHJ*1tnwqEQ9?HInS!T1^/%@1b$BW4?Ailub@QLE/u\:*9/>i8u?4*Py$KX5Vtq#e>i/hIb<8Y&6BJ
Q1^9cd %Kk?Y1*wcDYlp#!qmXjiiFiw*&\Y1>dyp4HC>/8Q<:eqR@yZVVp6Hj$9+:?/DqL??<w4Z*=NTc^=\KS#
n5CFpH 4L4^Yq/pw%YpE+9uE@G$V<MMP9F<dikpnqZV44M&Pu+#MVChZMZ?\al=k$+uL+:=4XP1Su>?X8kL%Y8h
BJ/ALy Hw/MX6#H8M^Rlb%5Py8a1<Z?e\/?B/=$<5jTW=ZK&V:$/#tB<wY=t6Bl/KFP11bh@M89!!5hFt^e=B!Z
iSe&:: Q?ydC+:4VchGHHh$#@=\yZIq*=%&lWZN8V%d6WDPZbFPwpd%$YyFS/5JuW1e??RQ9t>^d9X91?deH9Xb
jaEcd> PPj&d6nCPHeqPkE=6\ibBZQ8TuS1^4tVM<JuudLE6n>?I8:P8j@NyFQ695H/m5uiQRi4ySNd@BJA:<:n
!VFCTT NbEAQPuWVAKaVGX8*B+?6dQZR\JwY>APVuS15wNZyKQX1D+Bh>=KhIL8LB=$F4!#XKKV1<nlcN#>JRYD
YFKDL@ VnI9*u8LPMw:n+uP1>@@?#iWb^T?Z@Zn:+wX*%uLSJJ=VFd/u:h!!u8W@*:9P/9YK\<9j<\^W**wGP?W
nZdJdM JEk6@bH?i\SPPl9jnBZy<C>*BJQajEcM/QBQajnA/NS>Fit$SCQ?Fnc4ImPH^1uy!cMX>tb/4ey+:e&:
yC1E#\ hbp*51<YipShh8cl<KtQt<^dK6Qy5uMN/Pk!d\W/dnL9PetaEYQqXJ#^9EQ=%eiF6:9ZJ!G&%ISPPq?y
B<J@GP Zj##kF/@V*LY6tQYyn/$a>cCDm&Lc8i#Rce/H4k<wM\dtI+tiA9*/=<!YhY%j%nt4RthCy!y\4ww+W#u
jku>*4 QP+tuWK?/u&5VShtjjdiyd4Y+51:Qp+%<N==*a+^dD891dYwAb%IPy<Z6JVn@m8H&!Z<>G8/61EG>hG%
#HF5j: BDYkW>RT?NEJ4CY+n%9jY%Z@+K$1yju$M+5c*t>DBl*?TXjB9*^d=Znyd#E%/Gj>LcaGhHVbS=?Gw1y&
BIyl?Z /ZV+l+G4:B@>X<L<RIqGa%XdMP5!XCY4/LXT$%ujtp+@eN9D*KXH1it<aJ4PYpmQNhN$Lm:NapY%wq&#
ybYeED YCW5ip*ikSyy<k/eZ$&i\iF$$!D*Rp$ZG+i:KHj\G1!eC#qVA?q>KylXLZ4by&:61m/w#CL6111ne/Fq
!IN=ST qwy&Xa9Lnmt+#FKBX^y&VL+k:bkYq^%VyWNM5jVmQMXM%Kk?F>qy/LH1?uuBP>SmQFZ%khJV%jP=euR/
-Ae:CH 000ed78b7f2001202b3 Page 19 of binaries1.zip
hyQVEp F>Gy19RD8JVqXipH5MnpXipH+ENH?kF+4XMyQ%>mjkAd=Pta>APRjkBXet:yB%CB+$w@kPw+h@X?ANJ?
48^q@L Z>49Z\nNq:Vj9&CcJtt@:\4Tjq@c:@9XS>49?>KS>99Tj9<eRh49T@6>H#4Tj6?Vnm::TQ6>cd<9NbSq
miDC%e Gpw@pQd:$u:jZ?1V>96iIP**yj&?P^%y9%@>VA&p>=H&?>ZTpjd:$l/1Yn4Tjq@c:!<8&ijT5h@9pQd:
DJ*Ma8 F@A$6Fc/jipH+N<@$k@At$+V6I9!q\\q%Cu$y>Q%*RH!q\\qMKlmmV^y1yt&Sb+$LTc6nV^y1w/PQGtT
:E$6?p J$$ZS65mV=4PG+iVJ$*X#>RkIE?c11anV=4pTXP%hPSJp#^yYq!!n#^y1t/up!hNF&cup!hN4qDZJ$*<
S!^FXN i>iK1H6wwb/I>&VQ>WjFGe\jFljK&eNu1/<T$#N9DmqQKT*1J=\qqLM%:wYG$kR=M/1HI$j!lZm8<EFY
SZICk< RSFN^p@TK>Y&++N5VLPeT?=diPY>!:+*ah@aVcL=8?h@=6q&MbW+wIK@PwjP:5nw\GB*8H8kj/KjL4Hl
C#Ej1! !ES*QZXAR\*tkCyCw4XG?!NVE/$HS\@&S\h:Bk<Q8yjddVLJB9Nc#yqbyAwy6Y=4R<%+RT*d1qdiui1w
hq!\cp N?VPJpGK#SIpBIW8+:*Eb<ZIQXYC*FMqTJB:1kT=y$1ReDH81ea=/phFTMh9k:b/F:6!/jwDR%QT#>yc
N@B6kt kn&kFBGN?uWA>+MwQ<RuWkS:Sd6?*RiN^#C8?%H?AK+nB9&tK:pc5@qC!hH?tm9=mI9TT<#P48:tL&JV
BiE!d? i5cbH1d!anPqy=#ypV>t^ahBQ@R#K*$9y=<%/N9V\\ha&&#R6/e4t!q1%ZLJw/Ly=%t4Z=Z6FLWd/V@=
JZ=aqC lnD%T<y6FG$%$mhiERK>LBT8>*+n@c9@L5\VLPZ4FFD?!H+l$P6C=Vw$GPpQQWX+I>J@acZ*9m\ESpGw
Z/qLEH @MG9^@?@4jPQ1dKM+9nL9TF\8T<pyAmw\R6mEFllDSARMDjZSwpTpwwKRZMIN&mk&LIaKcSl<5MpDCFJ
M1TGuN Ej8^#GbTNDd/BR4b?18GbGVcb4Y&YmX8Yi6<:#p>#:*WQ?@PQu5+>:#Q?b:#QN#*+aZ=/SFDQaP\++^N
?1NZ9& LQP9Ak%D5tZai?kT\9#NPdlH+Y@VybX=hnHbke^9!hd^Z%&Ai^j?QMY@lQpkZp=tM9h>D#E\*@$/&WHC
SmFa&R l#ZjlY?pkwYjI#<&=qQBwqHe>llhWyq@P$Z&dPb?tG?V?dWJ*I6\@P^6#C5Rj!n#GB#Y#ZdX%qS/%$dT
uR^@P\ 4#Rq^c:c/lp<F5<Ch4y1K/8<8RW@6>L+et??#Ej4bQyQ58XL<tYBTmj?IWQR19A\4bPnKYVHC%?q=@pT
jkN/^D eykk9E*4bP\%AuJ5Ij%D4aei/CFS?Kich<NPEu=i/<TXS9aT=lu=Tmj?\XjJ9p6+uhdJEG46d8H:6E/?
hT4YH1 8En&Qe\#\*Z<N/GFbPGqYmh*IIhLtT>9$*1+5b:5i+WjX6#jYWV&jeJ:6W+8wC:p8EDYMcWVj!h1JEZ+
=:XA+q yNdJ^/mFXPHZ6E+t<V\1VZVT:KEVn??M5&=TdR!LVn^+#DlhmpWuH6#c/KEVD=/dRb4PhhX8uhF@EpmH
*dG%MH 6pSZhW&=N+<hwQ9N#5861VZ<Vu%D+EHt$iP/:*tPV%qDq%@we&8<>btc\*G/8We<$d@SJeI>D+=C#I<e
VtStuF HFt:q<Lu@D4i?J^AGjP1ZI1j>S^\BYQqdH4H*!RN#yjnhnA=MBSQhiDn^*\A9Wj?@MCCN8a^j^k/q\M>
B8>#6& %mJXS++!9Nlc?4wFQRa^Q%6I6l\wKb%H@te^d/Y=M8SF:lb/ekd#a9ReYW?5VP&uAL%FDk/YLTR@F=pQ
/pelci Wa+MYYi5CqY@nuRe+KtTjKF8HtWiMb>5PYlq%TqhPebRK$<Id>d*%aBiLi6iEu4yJ<\VwZ$=AQVaDayH
jVWquD =8hRHAF=bywYSbiV#LPkjVtPcQ&BYlcPP64BjC9%Wb9Eu+\iZCi/nhF=Z+XHCjL9BLcj$Zq9QE=kNjPt
*A?mGJ qT49n9bIR=$SGy&q<>=Fe&m5aX+iyjP?al$E^Z#S6M=:?%!!<!YiVD$@^T%p!+58a?@W?V4>HhpF#C6H
k$6#+J hh=HMdj4JC?6K8<BE?m>leI@$*:PaI%:lQu?QJZ*kGt5L?5qL=h%*5jSM#hIHjZ19K>ED>5wiVtu<#/M
*w>6CX F*MYCdj4?\4F#&=m@9liujikJ4I*M#?RwQIi+P:@Y=m*4NB=Q*ZYMQ=>#?m&LJ**ycmlElu@w<=:AZLq
aDA<6E hbBL?yl>=5bR?wMH6>CHw/Rji9C+MI@?>n>?*Q*Rk/h>4jVtjMjC&51<:Vw6W:!8PW>Tn#YibD+hyQSt
QTwAeW S9=MRM+K@^XB$:!b8d5Y?KtY#?!hTt?t??Yu8&S?ZEy9#n:5qb/YiK/49JmX$QM#M4=S/eSMcTi:u9&H
qKAF^S %C8>tbpuDD::l#8>wQSt49&h:Ad^e%D:MhG4u&W@wa%Kd&aSNLld^9e19Vp:WWN:yK@GKd$=Q$IPG$W@
L#VL*4 AWy9#t:wy$u<LFd*=Z\Z@j<=@6\=Y=Vi#PXa8@tjB9nMnXF/M^5jILKQiXm/$y8=8l>:B9ueBWy9bkH%
l*8LKI C1Nb^q>SinN*IF@:yi+88*XTW%964ah6H$Be:9HlDSn@k9BLGM?<FNw?IB^n&ypua6%yaX=S4@ad+Z%j
!+Ne?Z ap<m@L#cD>mtP!A$<bP5>kP&6mQ\KjM<w5h*a!>=WMc@yedd*YjqZyV^uTy?&!D$jInuIYJe^Y<4^b?a
?iXFF\ hAmjXQHdN/C995R<$1Zm6?j<SHcu#HPim5i?CY9yahF61I+uCL>49C^?BqR<>96n!i+TQ1Hm5Yhl#V$m
\5I6Y: @AeXn&$EhhHNjQ=VKl=dGiLyEW=:TB9*ih?H5I/<\u\l/h?i#L\Link1@hqH%d69DuyXL+?*\4YjCK^*
+JbDmj 4#KQnhb?y4DYHYP?PF@:iS@><Ll\q@a#mQ%MH@Q+:hyQD>d4E<\V?:Yj:?t#nH:J+!D1#qW!+^$PQwua
KpJnRM X?>^qj#u#=@?AXBLA\RWAAIACAD$XG$qXGCtk?aeAAAALkEALRAAAGN5cYX8hHM9bGq#c!>6aYM9eHJ9
SKZ898 ctXnhHM9WGF$a&lqe%B!d&M8eHJ1LtJyd8\>C*Re%ZX9b9YZ@MEjMMcaBZ>p5JGNda!SAX6iTdc\bC&Y
J+GTh# dJqQMK9XYqy:yS%&X@kDBWMI+SQA=hjR<MiRuy=TankypHCKIYtclDRRTB8cNtpVVq8*lbc$Qce@i6^:
i>69XE *:8:<&b&bucqHS8LjXhu*6/><@dPi?>?*8@PE=5TntTmR:F$PJYMNltyZY!M$NWXVwZ/P6w$p/ThQ\W@
@/\\+? Z9#S=wdDL*@\8M5Qd:*%^&<\Fp$tE@AqAL>c^LR#q#J6dl>np%<F&8PcdnINJRhmjbFWKy=MBcGw8&LS
I$k?d> DC541JA\naC^Kw$hP=c>ei\aWStd1?Yc:6FHGX6:DQ?AyLHc11:pTCTc>H:YIqcu9cWj!H*cRPQq1a\$
=:/*Nw :a<dVIEHZNWSDq:i51&F/cnqM%=lhZTn4nwemi/PDMdejqqQ>=9T?+ch:p@1&bjP^IbDmWk/HW9u*/>c
W499&% Q#w!pIm=F$$4w9kBnX?tNwGqcmW*mk=e/u^1aI*4aZLW!^&5!^qRSi=#1*bR1>X9#G<SnjqR\*IAnhXI
N*I+b: i1VNZ%4t:VFyDHcXc#X8DSd!qjye:bHAp@lq#4PMQXa%IQZR#hV*Bd9m/Tm#*FtjT8=J^%JYa66AQJP$
D64<>< $h1VI^p4=jLIDbFe4&1=$^WbnEiDwakS=H+tGEwPG@GE@Tqt45:+!G:*8+/Q/I8QdAt=MN/:iqWRi@+N
>lQ@5G 5bH<G$:QR4y#SXKl1\*nC$Fu18M#5nhl&DETH^qMY?@&JEhV$XlQbGeMHlndcd$bn1TnpaSLyimtM>85
LBNqaE jN9&bqIS&:*RcD1VHA=8m8*dp$\N&G/&SKM^EBCRlt^*%w@GE\PPDFi6*8Sehd#SGp>n##Leu%eB9P9W
tJ!JCw ?El*dQ#R$6Dm^T/6Ii+=N$cw9R6+&lwwHHI8M>=\L#QihTw#$5N6:R=Ey+4Anbd$MDV!TC^l9dMq66?q
ISk/@e k4&S%GA5E?!JbVL=NY!H@MG8mGH\Y+c4yS6Pqt++YL1Sb?tG1/WdSXt/+Yuyl4iqG^/Yd4lb88Fm/acd
mRH<\: yS8Pqt=+Yd4lcitGq/WdZyb8iFt/+YHylyiqG//Yd4lc88Ft/acuyS58qt/+Yd4laitGl/WdDyb88Ft/
&\4QB^ +Yuylw8qG$/Yd4lb88F1/ac4yS6iqt/+Y*yY?J#cGW>uYG85j*R\V@CCcyG+INtjJcnYl\mcSTpEThaG
IEN\DP p&JyWyNMdYpT58%FJdbKZCdtSE%EIYQ^yYNL5N9I^Ijn?*M@/wyE8*8CZVGwGLY:wM6/aFIeTm6J*mTk
I$XKXd !KX9q4JdlC^IF8qC:wHScCciHMpVnHVLIl&JdliShC6QGdI*LMKT/LLEdGSLR>n8WY9a1NqGpK6uqYLi
q:i9X? ub\w=V6CulLFIqTJum>b/ca5Zl9b4Y1TwG%WqLchqF>dm>\q8pZ+LaqEu6TSblE*E8^!SyyX\Em^TBaJ
>L4ZCK 5pm#*!$X#lKyy6t9&j4\<quFbyJ!<8IpITlELSJCR4=wpC4LJQ5>4&!TFLJj5jq#8FSPT+Mn\hLTbI!&
:Wl:h/ u6SC6dpT&$lCEPWllEt^PAS=$CD4k?*S?die>N>YCPtPZBIdPX>6=VL^64IXS1JbyGy:QJLp=&c@T^KT
*4<Xb! u!Vck/iD5XSR/HC&F?pNY*\m@1=6d#StaHuV?Ybn=!I:8l\4Y+*#?GEB:a!+JiW+bK8R>>N!YY+SMF6c
EZlq<Q Mqk1q5:FC4t$TL\X4p4CecY*m9CH+cwt@GY+ckl@D/=c\9<FF!jypbm*u9C#IGpkjLY=*KF6ltR!+d5l
/^N@Wh tWL+ZbBMJj^=TE+l@D8RVCQ<d!GbV9mupM!k>eHVIbqJ?AyIVmY<C=LVCN<J!T#Cd+jphMIjw#bC@J8R
<N1XSJ uEH+V*BBljCQIVuVZPFpe\uH*=%FPNa^THkap4MJ^^ZXe\m@GbJ=lH<Xp9tE9\VJA5LjkYRl+j<ETTP6
n9#W5c 5cP5FlGPbV?Z<QMlPa@\6bA5J9^KTJaRjk5p=^PP?!6NlL>PPwH+B=A5I@\*pF\k<E1W<*LC5S+4CMj/
6X<VhL 4mRe>ihC\uFyiSZlB!G=mQAZIFqN?A<l8bn\9+iptbckWVjZEI:6jRul!PNT\4F6L!N<BJK%lN?SZdkF
kW1Z\/ HFjDYkn@NmV4Cj<b/V*m@\^J1<C45Y*dCMe/6lPP=hyAiDepG\pjk1TD<N5k8b^\%KXNlL<GTTjlQ<YN
#565Aa L<K^9y5JS^*8FukN&pGaeNTFK\nHh6yCPQL4Ij^cTHwJH!WdSl#daS9l1GN>lGQ:d!j<LWm8JB#%:T4C
X#IhNk j\*J%aV@D!VZCL\Y:jkLlKQ?Zp5+!u<H+hnG%^GP=awRQklJQ?H:IapTn4=qkHA5G?$<%H+jpy&E@\1T
an1kw9 ReL@G=Il&k6BQ^EuHHYehmH45A!:Cej/pc?9R=&pVbG/i!EbIj^J<uiI9\IJdW:Xwd!8J^#%JEXdLPnj
4L$=YL cP8pH9YVNlH1$Y=GCWh>8aF\dJ5>lPQuZ5L9kYRj+ck#?\u@BmT$^XCQM41J<Qel?T*CQ+Vpb5L@C=Jd
i4\R6F BN/AbcPN6\d$ideTn4:lN5LSl4=IPP4!:aSnY*&JeG!QP\lH*q<t@CFI:mV<YWn8I9^FTP+t@A%I:mH<
d@bcu5 ZWm?RnnK<X:C@^PT?&kFHQ8E?\qH8#6IPP4Xd^PPh9pA+cnLD^KPMutI<H8y4$L</=A<R9kjR@I:lKNM
:ZdEd@ 9$w+!9SS\uE:>HeFQlu:q1<Snn:+MeLSu>G?>GR5#^PEw<$>TVn1*XPEw\!jJl#L<k#ll!F=q9D9RZKI
-Aup/C 0008b89671f001202b3 Page 20 of binaries1.zip
\F=KTe eQRJ#^GPh9i<\Khkj@6%6ZM$b4mJ:PXt5w?>bFeH!C=8I:5<SLd*HNuF:cRnn=I>*EH/j!jy?>&p*@6I
JqV8mc b:=G5u1M>GML?ihi<5id!a>9I#?<uj1BJ<nZQ$q??C1!qZ9J@%=D@9bc<1@ZpV@6J68=u*V6INuJ1VVP
j:<9^^ tWZntlp$@y6Ja=5#cC\#uecCC&keYEHn9mwc=#ZRPG$!neXPwZHQZB4uBGqee++=J8QntTp$q1tleYEh
X%kwA\ nRM9wZ::M81ut&p<5+d//ld1t!?t5e$tG6ieS?PaJVS8YW:nnyW$64mI?9FY/4jd1b@iTGPMlhR@Z$l>
9ym?M# e^PNe=dS8GcR?yI+>S%S/uN&W=<^VH*Y$>R9QWN>SyJ<$aQWX%^QjWPc?wJS<9$D=J5iJu6@lQ^R=\uT
9c<?<p j@RbS$A5b>PRY9kRVeMG%<:YNch=\mSyunBVtmeEyZuC?hI<aa$$V&mV=kqZTQPE1DSQTJn#BN=GNE@k
9t<PM^ hpj#BK:d&Y*SS<%=A4e^tmi\q<^=A988PW>k:$5/?Y6#u5D?%b\u5E@NiRK9N5$V6CutQEFdcM+V6CZt
T\HSFa QEG:!J\ucG9MiaLYae+V6LA=V>C&tQME4eieJ&kn=n^B8>&eJ&l*t@ME:Z=#u1A>be+V6PjMiaL&VZPi
:FIiG= wL%q#lP$><^=Ay<9$V^B?>meJ&n@b<+V>Fy#u1DQN8eJ?kJ#u1BjaM+V>HZtQEH9N8eJ?nb#u1Bjb<+V
bJmB\D >GF#uuDT\W4ll@V>yPI4Yha+\FccVX9SRX*tiIY>RI=FH9hS:?5$wZWNljly@PqMF/E$4B=@k%E4Iu!L
E1hZ!4 XeNXA%ehGK5Gq\=ZAK=K8K4l16GF#cE>Iw=GZee=\pZBKteW1E@YRC4JJ%TRQ/mmK$B/d9jVe<k8#mah
hR8EY! Q+65aA4b&kK!y&tpw:Jjup<&iG/8VaXPb>e9LmD>tm4%X=QJ9=^Dbe*&P/iR@e?n55<pH%ND@tWY?aRX
DaabW> XM?F+%le\h>XbLXFnunmM?k#e@t\:JXF=PQ6c?aLYB+u=c9pe5*t$%*=aS9XFyEQ&:G8mH#ah9XF=EMb
%+dhKq VCwmH<1y\c%hyHbG8XWZ!mjy4E+/aS@j%El>XFc*1^*$&*<ImKBKGIwi5/XX9Ebp<FSB9nDAThu\5kc/
614$8: i=1$Q<mZQy8MXG^ujG?iY5w6ancaZ1VP/pZ14C:c4KcIjJWY*ZHQX&*SYjh<NeZaC9uBkn1tC=$64GNe
BN1BI? 8:b$h@hcj4%l!>b\NpP%&Q9H+YCk9cMVk=\%?6VyM!Dq%?9cp/MnA^FeuMaTWJaG?5^?4/QQK915yM<c
y*NYnD ?1#9GNHtL%5ZTdRMDKT&SSL^kiCmTtQRmK\j*dppTElQjB#!1QJ19?Mw6/L!!aE^LN9\WwP&y8I*^FI6
nYMMNt +a/t1MHp1QWw+:6aVaq+Q&LCqCAQ+9\*Y#Q^SBwy$Hbh5YH^k<&^QbTyJ=QCZSXB:p%FDERlK#G!:PNn
#K&A*+ FtCSVP&DG<%!KXLyXJS%^98DHeNGMyWJ+ybdX:lQ@4w?ppkpp!QBndEEQLk9KQd1<M/Y&H+Ydt8ZM#ju
<AAc\w iRj?BI=K8!t+LeLc+/p$:pAPD5hGM1^b^MQCiKe=&d@Lla@>qpVq1YnVwLRB8Vp=EtN=P/L!d1l>J>T/
k+mcuL C=wjmCB6>em:wZp:wXIl=B%R&?/udiiVhn*N@TQL*1hqA%LBTRGXK9Tc4+\#jcc##SaN4euS\T$>Y$J?
Dl>9PX FTueE6waPMyq5>$^e6=@1NDM6%!+Y6TKIIZ8$ZG??LMYwCWe:8VhYWX4=+d6$h*^AjRqjV*lEE!=cPAY
\6cR1X CFkHY*!YJibhi1pDSF+h&*!\\tE8YK6b=*n$\p&&chRLRBMH%A6AnpN$>RLR^Aj%AyDNIMhkX^+9AHZ4
$hYVJH !:T9BHB4Wd\AXC&=@nE>RaEZ:NmS#pSTte@YkF\ZnJm<aGRdC$uPYJQGCDl8tcZJ/qVB/Yehj9tDP++h
d#Eu!u ?>XTJjP!lhN%&YpI9RmCZ6#H&JuKtbR9#A:p/<Ze\#9Zd\N@<cb1u4Ih&I%lad#cdYHebZY:N49/:d=\
kw1u#M u9%ylZ*ljQae:jVth!84bwjlGwL4AF!H+Hwh4y@C>XFq%SutcKtG/#VjDK4AQlZ/!Yaq*dJZ:YMA/&m\
yH%K9t %W!9h!1>KG>>aCKIA@RBIBH9V#edP^QN$iV\eHJE/Wbb?ke6Z^?GI%GqDPY1D:n?4>ELp#&nBt:WNt?M
e:liyH SRbm1dSTmnLWl+CDQuVG?%PSXD!tNKL<>KHCRS@kt*ISbcwQqWIjayqWep<56V5h:MqEaI/dGkkKL:FQ
lIFSjJ 1WSb/WMX484uSXWyWFBGIMIZ!>wlcCLIWpFbR*W8&GVeMB!Jn+npM+Ic<XKl&pC$Aa#<ywZm^qA5lRGe
?Dmk1M +ZAwQ*^#9BGchj^wJ5=:uIWL6SyG+Cl@ZXtHXKP@MwebncH8%4dGaGN4T&<LjIR:R4&N=iYQ%NlWRXtD
ZaMJuX >FKNGy51KPQ^m\1BS5m?y#9N?m>!4K@wp8Ha&<9=hbJe4Kcep=que#CYjeGcknl%XnhXhM9Tcb5&tM*j
<Jmun! cmpS4wP4^VATj9Dy/8yeZ!mj>KIp%M\=V%i+5>$ZQu&lXn@1=eedXemu6&%:d%Q@EI8t$$hawHM9t*::
y*I5@w kDpRZe\Q<dK<KyyXnZ9EYTj/SkMQ+^J<C4\Xqu9L%LX%5u\YL@cHV>Tu<ll?<VF<+SQdc:Cuj@<I$:>h
E8L!LN \/cjjwVdM*+@hZeDN&B<k^hymb/nJMlQ+D=eL^#Tw1jhqPM#XJ1<ytd=GAZ=$KG^:lWVjCJyj@lEl$1y
p*QC?^ %\GJn=etF5$uXdB>TGL8\Qtp&bCZua1VnSp*XDe:*S:1L8nHME>:AW<&pI!P?8F@^9a81V8j>FCm9?Ca
ncpA:V 81&>wH>Pb$b>+aQRBI%W$l\Adc#RSHmm>:n+Z4\jQc+:H=>/*P:%q\eL=dPh5iAIE:4uh1*XGH98ku!m
/^SLye QyZH<I8Q+R8jRn**>T?<bQde?q?W*HP:qGj5Qdh:^edYe^jmW&VQ:eJt#D%*IV/?>h!^Ribly#lm+@<P
hB1YcB !dHu9tu%=/DHZdX/6!<>4m5j**4e99nIm8XB/j<X&KB?VB+V?QnmMR9!MZ\1V=Gi4lCjam*ble?aLdpR
Vy/LDK u%VBHwZ@E+8Cqy!KyhtdL+IH@>chdMdCV>kh&5Mcjy@?!*jbKY@QRmc^NCp4@PdFqQat*Q>p%dit9c=>
yhhHMP ei1hFp*%+JPh\:FJ9?AHpq4=#QtD:N6K@KCy+pbIHlIDQunMpkh$>?<1!Ki&K?T>Y#M>%Lt%B/wi&%uA
uc<iyp F<I$b5VNF/:na<#RSn>Y%jlaFWZlWS/uMcb>DMZH1n:\+YQMAu!e^ynnG6PFlPWW%Hn$WF:qeilLue5V
@#BX4d ba6>+bNIF/1Z>d<G8ukE<Jn?qAe<yl><\C^K%YjBy:R?eG1Sa<!m?SkMZdlZ??TNDS*dB<ia99Ay$DMX
\e6E$8 5A6d##S88ij+bNIq?:F/Qun$<L&V?C4B68=j/9jMeQi<DmB:*6\1kR><Rwq$twEyS:\6B?9F9Nc#?P#i
DD+:@q l@L\YdpQjLK#em<?Se@Kh&H6b=VWQnTLmS5i:a^DDjjbl?CDS$e^QGG4SHu^Ya\Q:e^uMV:\+YMj4wc5
wEa?@a yHy^QukAYau6\\?&>AK61!6eenRMH$MXm4CbyXaY!*6q$R8ejJn#/FG6LJ/\qWW@Sw??4T^P4JY<k56+
ukkXRq <pyimVDlX@I&?dTT6?u+48SJ@$@YPXQ%!hdDubRi*AjLPbGcY6T/V+E\ykp@>mudPKaVPtbSeW!q<VuS
CSCJN? a=cCeW\VK&/w?DFLkd=T^A%=kwwdtql^R+W&Mhupp*MZM?yViW/!*XC@%9cHTyQZtD*hSN!h>RD::8#^
iV$TW$ 6EDP=!VcuXWuWC1\k#1BWwGVQnB%A1WCyp/kXPC1D?wETkZ1BEwFd91kV1BWwE/kXPCtD%Z1QAFj?Kn#
#Bue/n BNR?ZKq<%HpC/n\Bhb/Ala</V&CC>4k1/uem>h\1/4e$Q8w<AZYikDyQwJRiX=$uWJ1uW?eJ8QFS=\q+
9Fq:+% kDyQRJ$uwM+VWPeJnIPQPp>AuTik#lMa#/^euTjk&5:1QIFTkI?l%HpCctZSe&ZSC>S=A8w<Ai>Su#yQ
CG6K<^ \A*WiRL1QAFuQ8w<khI%6cl%H*YiRKq<%HpCKw/yXD:1QAF%u5DEG98w<\SK<*V1QIEV+?uWiRKPWNdu
>TK?Zb ChR!jc4<*\nH+WLH?=?uZh8yJdR^eJV@%<L6dK6&WK9Xd&VHF!45BQZQKp8HHV9TtamuSS%*+Q<d5=bQ
:/&AM= >wQhw?M5!qwAQ9QDj:hb$h1=aZ6$h*\A4GXZZ\@$&NXCYW4StPFIjERpu^HWmH<a14ViByXMu^cKG$P^
V6QJcP FDyHGJ@q?<j^i4</ZGkR9Mhb8FC4aRTP<t=Fb?Jh:8JAl>>w>FjtMKM^%N*c%ll5dG*ydaGQeEiw6:Ge
E>h>l: GkD5@la<KTR@4eu/V/c9!=+pwn^CYaQqyCFh/aQTB?qptY1KW@CKHqCk+HMMLaqE8V5E4Vub9$9%C&WP
H#dk&a P16WMY98jFVMtwybK=&Qmqu#=KNm%4#dS<Y51bm%+>dD1bm%$nY%GFA^c!Z#WVF4Ktc6XD+1bp*F4E&5
XnhMb5 5a?KYT9N$/ta6SQn/XVMtmPWhe^cycbCXSki9y5H9FY1Na^W\tAqH9$E:SXyTw/YEIiXC+Bm&wH6B$w9
9&VabV PQLLjZEM<NMP?N^YDcR\Didy=T+8KF?^4MGBt1dJia>#eFtA<S6cZkqR\tMP?!pEcFkB4bSjbQ6pmwun
LG$:/b ch*YeEiVpa46nP>qHp&i4bC=1KGXHFnHR^A@!#nE<dRk@taiZQQ>dM#K\t=ANuM!\ZW\Fn=!*B6Jp^\C
AQtG\V FLy8e@jtq1/&y4d6de:=%?Y55mL*/iSGuKm?NKaKF#+PeFKEC>ewPdn+MSW!TqD&IcMXQ8mAu8>D^&&#
FL1V8n J&PJ@P9GQ5>%W>=EkSw?KXBRLM#W6AIYw*!1A8XVFTlRQqYB<1pKFJ!MQqZ5+T<RB\?\ldV!&wm9ERI5
^qTAG1 wkZ*e*HnA8A<+4Tahn&Z$Qj#KZ<V:uMCLGWN@HMb4ZleRJ@LKj<K?q^J@QHyhjSbe@nqD^+@h8!hcu6B
44=9FD A$1iCqn%QFVb+ZVGFwJ$&n#ebAi/LV\&PA<%B?m&W#*t+h:iI1DH4jTtiq\pE@\DS/Z<t+lQ\py9@DKc
$!%%AR q?A9$:XF1NP+1<Y1j@FZyk%1!!FyEQTjLYC=9Wu6M4RZRi?abK1:l8Y?ZNB@:%1Y&@ZTZwYL<9j<EYNp
<GFCFX wW#HMqRI?k&j5q^<k9/STX?M%pu&yZ<C!h&C@n!YnjbiAlkLPF@R*>:DGFp&C#\B!VSBj?yY5q8pj\PT
y1C#&b k+K?<piA%\6/^V1#@B@elZWu?6%R@mbB@<MnRJkp/JY9alpEji?yDLeKBj&ITVj?AjAySQ<?<NEF@j$d
V=%<td !b>l6Z<I!YyB@*N<MiAW$l>5:$ppF%\&uWb$=DhD$Hhk?ceL?pIMAFw*uEpu4H=$Ee4>+HDG5NEZj5n%
AWER<e KyNI&8k9a>pkj>^K9@BeW$<?&5q>4/C9!PqJVjWm:w5Fjc&yJ\<>\*&#wCjNh9=Jt961RZ@N%JM*buDj
*\an+9 #YHXQ=4/<GA>>?YC@4FJj&Ab>?&C@l6VV!KH8K@ueNGNPV&y1int9q@Ru#V%=QB>9C<R>MPtu9^JG?<d
F/eHZu PK^8Me9@!X:iX\n/Qcci#LtJ>^$eLu:N%IiQ959:EpF@M$i9aZ?KDWD$H=l/<8d@awWE9ju6uJ:WcH%a
acyVmJ REFjE#D%=JY@\#^Eu&41!V6@k+^J96>Bb$N/It%VL%+D#%%HimLSG:HN==Ci!QSGTW<p?1WdRce:l#PD
m+4HMH X9?n#RF=/p8GnZVe/u?YwF!PlD9VGXb>cAQkZXVPVcdjp@Pjh=4RY!N6%e@G1KkZy$9qPR@%iVb9l:4S
-AC5El 00041b125ea001202b3 Page 21 of binaries1.zip
D$\WR5 9\b<5/C*ZkQFF@K6@e6@A$K*wQiC@/pT?q#:Q51ha6wG=+LKHBF<DI!%8ELRq$Q:cNYCj5NXRNlC#@$#
h4!Ebb TGaJ?64@AL!H!uqS#w=1Q:\WH$n=WZcVBj$H1B6dBZ$F&L%YJinjR^*eS9u@HbJLBQ*HQ\i<V>BZ#54^
cWaEdh 1d5P!:Ch>AHK4Q%e$F9jA<KXJQiqPj868^tD>1+mQk5l/Sj$B%DYX^Q>#9<9:t^Cww1mPN:M$&Si:%pk
D5pLTy TVXwKIK$tWZcIuLe6LLcTBTWZ\*TRJmqJH%AyibMcnX?qB?qy6PZJSXCG!HEFpWTJBFIlytYJYVT11A!
PtBBBQ $8=@#8He/YQj=uH+iVq#*9&ji?+b9G?i=JXbmjYT#:^L:5659K@5A8K:9/uLI?IJ$LcRiN/kmwjuy\T%
nG/GSu 6Il+@1m/*CL8j4!EVm9Dj!@YM9Ee9LnLS:^A4VWu^=?C*PCDl=tnw464:1/!?YBn&/Vwd9cnL9E4Nw41
R5chTW SHe#uKwAQ#6%<+DYQYNBAV:R84hF/?:Hu5mQ^&W6cN&4e=VN=<a&8LZ85>CP>*N9w6dLl:ZHB^:HQKK:
J:e%d! GS>TkF>b/P<W*e%!/M=>lDhN??uAj5eH&%>tc6&4=lZk@5K4>*i#DnEiJD+i4*Y9!XI&H\V&n+u841>9
$#NK+& qF*Pj4K%:6*jqe*>#umb/P/cSQ@AB%SjbY4h>!B&Q5I^5W*4Zn!pdD+8Q@FF/=+L4R+Vj=&1hY?Hn!QS
\QjRRG *SHZ5d>cec+QWV^>e%R>nPL??cn/>k<@pZwa^ce<pt@YPGwAu^GcW4pcR@8c9Sd>##Hm:+=K96pG^9M#
J/#dcF DdMBNe&F^GNSH@k@wD?uJh?55TRFnlNjtJX<5?+k#$>\@HPmm>YE6ZPT?KJD<5RKw>i1bL=e<5$cSn^X
NlW@SI @I%5yiTdNaK>w=y=49a#nHlPEa<yqu!#$#G&l5eZTd:bhT?WHYBiI9qt%:e1P<l<SQLNc8=V>tutd@X>
9jFWwE 9ahhT>#^SQLND1L?$G5THW8>pt>&:WhF/wpdmbJ96w*^b>n@uPTd:iqZ>qumeV5p*/!u1J*uiF?In?VJ
l&$&D9 wa1!*@LB+RnIj8*el@WTan+w?:Y#P1#5B8c4%VYX?D*5Ca*MN<F@lB68%P$t+m:W9@M$@kQYVnQj%=D$
IjB$Q% J</KLSlD*Qqe^#PAi:@A+%$Tn=HYy8\Y@6!6Ew@lkwc6#E6%QP8\L:h^QJ<qHmQTG:aVN+M/ulue/$ZP
YMGu*J p&TJ^$lC:d#EjKiiu\dphkjHH>L#$+he:tViL@E+B:BuhjHuQ6Q^:ELN8$^<tW@H$+Pi9=9=dcW9>YP^
#ik6%Y D#GZQeS6%V<a/+q:WZ@C^FjM!H1Q#WB9haZ=w9d#CVZpK9GEPP$uG?9qG9HEnh4Q@lSqZ&i?Zj#E@MCe
&@Jb!b *TC?Kp@:Teb*4F:m:yD&M:$GG^jQ#\P58%LjH:<%+*Dn:+FTZ>u@@R&cZ%BLA\RWAAIACAD%XG$q*EWM
Gu<^d9 *qbBBAAA/ReAK\AAAGN5cYX8hHM9bGq#c!>6aYM9etX#d*X!a&X#L%BHWESye&58eHB9am=mcY:E@R6<
6*T/NM XGYcJ+/j*P<JICk1KmyZp>AGmGMCbVj$eP>t%B%TCF9q&wdlJtDLXR8E1ltZ!tL5?i*?ith*ZMZhcdDN
*TdTXc Dh68^KcwC8&$Q&pVHJ5bJFJW^SpZL#qWyZhue1p/q@y@9<>:KtDQVQ>uj9@>jQ/E1yNW*uQi>:q@u?h>
&E8a6h #wqY@9C!l*>@<</6e==?i5j*6H@>9&h&Q9Qph>*juy9#>a?L94#=^MTmk#>J%k@>M!j/@iX@!mNPLI4@
hJe**G RC8K@WDVTk:L4?w$dXKZqqj+^K=NG:d9*LD#l4N8@@cP:V6*QdQ:!X$:u9uDDh8iuqydN/?8:9//8jZ#
!G@^Nw :u>!%<:t/\9T6A#?@iN=8T#=yunjW:@>8%J=#>?:?ctu6w+9988YmkNX#X^mu9y%!aT#Y9HHH%+jZ/kI
I!YlNy &P8ep^6>LbQ=$^!6<9u=&u*Q@T\uN@4t$n>a@j6c8bd*P#k+H4>*GHHnl!Z+IGj5\^\%Za:#:VV6WHap
IKVk+k 1e!bYLuwi#6&:=wKaVbDtL?/<VIa<jZLVNH8$@K%ny!*<J+Xq*Qm@iSAJbhd>uP<V8MX\mjn4m<5J9@?
6$!Jn< te@W14Y9V#eN<6!eM#9u%%yB>wVK%S9&Vu*+mb$:u>:$#BM:N&m#PP*WuC466y!hPai9n!6:?JpNj:Vl
Fmtl?! tR*du>!\W<d<W=NP=jY%ul89Z@4d%@/ZEuCuNp5dq:My=*>iq%nJGGi##QuiH/!c?4%9Q:Qli@lM#kE:
\Dt^:W e:dp>F$@y*n*>q&dh#&%wXuNum5jV8Y%6d@Mijm/yM5i*9DM#l*du*l1<*Md:9@u%upLbWltby^@le5&
9PB8/L dN?\=\uuX#pW:#@/Xe+LY5/P:&&l>6/%=?qhG+1@@jDtJ*j6jtaDQ8B*V?Pq4eKZyu%9\<ch#6Ccb#d5
AS5*8? jKy1<VjeW^>i<i$@uQ4wly%VX@!?#J*#<MPPi^nH%jQZ#nq#iM:+?dZj&:#4Z*HYN*nYlLwH@q?hN9hj
<%4\*y P>9W#h6*:TuG$A*Q:NuR4Lk=Nuk1Z9?u^&*a*4\V4#u+@C566*uH$$>>%:&>&Vq:!6:N&=9L*6F!!@@h
y%/dJC hSQPPm6Kk?Pd99*$Ltj<:CijiHwZqCY5QcBX=iRw5<4bSW?XQV6@V>&eP8&QuSMiyaVqlB@D14LcXyX%
Mn9/%8 eQ?$Z<\cd6/ZiX@llc<dj?qe8iuJ:*%9q#mHkLb$:M1</6^@+51<t1:hw\ZK^h/9?/c<4#t:ww?e1/>%
Hwea9K 4u:/c%j@#:@n/q@^/yZj*RF:?^*Z@@X94V=$+@X#:9ph%^?R%h@klj:^%dZd4\5:>%+qdJ:k#Dq6a@NV
l*DM!K G&>=Gn:l:@DV6:S9*Tl5YQD*<Z4tBlQM*@ZE>#di<QPcJ#h>d^@G:NR!WP5dPj:Q!VI*B>i<e>H8ZV8t
Ga5Glp :6/?VXm#a@9WJ*h5i*4*4k*QVN*=%IaNV#5ZZ?FejJj&Z*:4+9j?4w6Q?N4Fu@knZNc=+Hh&:6wHD6?!
kyXRWA S@9BDSj<<HheWM8B9W#c6up:F4h#/w+@ktp><iT8#Z5&:*4Y8icCDi1c8:YbmA@bc@/FiN=@:y4mS@Pi
5uyuYK !L4Al=:i9ZMVGc$6$mcPZiICZp89Z!L9lc>hAmI4@QaVpQqVYiX9hK:!@S89puQHd%*qV*::K4q@5C4H
T!5LFG WSFHVdV=a<==By%#%di9^/5q#b6y&R<@DJWn*c8$me1jWL&&KjXc>9Ctb&=W4/4ZwF:j?/jW//aY9Q:D
StLn=E Di1$TkuwymM=j*mDc!m>$bj<W\Kc8AI+:JqhW?tJNpPdN5Ee=nmZ*Pqe<pXe5q!:<bJQ@w=L@5uC%V6&
$d:t:5 dYme?8$uu6+=>V5:u6\/hi8Gb/h8*nt%ieji:ZN8AAe:y#:^#AbM9HQDXLB9=&dw^6nWm=Z?*9RTAMDZ
KqLYLT >ZjQ>cu#d@56@j&V58Ydt#hM@eNuu>/<jcN#yY<=X@4BQ:4T+i6Z\t>@/$wqn&=+w4q&^@cuu9&/y6*$
4*u4eZ H:/tcij^&9?9%#SI:$bNt@^dX@puNT%4NFRkZKEXRtu<Gn$#d/Cu>hDb9DHFkNEAXGci!L881Qu*KaZ:
#*\Ad5 N:?qeDeF@<WK>>9?:F??MHGpGL^DYVMY>q8Z?NN@hIukDbj+$?8$*jP$e+q@h@&VJ:aDC6*$H!u84<H@
tp!=HS m>qL@BMGe>j@GaQ=A?iT@$q:WT9@&mZ@/Heb#PV4NnH%ph*AnL8idb\K$>tdba6#&j<djuH55nqL@:>h
:t6V%K Nu@==w&duE5<?QV*uukGq@ml%1FXn1*5#?mA@yqLNG5Q*\AQ5yV>AEH:/=V6@=hTl9#8n#a@5?$Je1*^
F$1&jP H*ta^*:L\@#m@*<iJ9c9>DC4uC9>Z?DN8K<S<ju986LEMR<#>it^Fj>Pb<NwG@*@&hue?q6Z?biE6V8%
5FCPHb I6w8nW?WmG\n\X!liAd6b8bw<8pQ4u@KM>S9kHIISln4Gc\FHYpV6Q#XV&#d<AjQdEVY>eS&bq?a@VHq
9Rm:q9 tZ:@>=@ciKNu8t<W*@$VTE9qdDn:u@hMn!56E$j:hXEZ@C=Lu@Z\W^8wPp>jV?YtQ46n>#NAZE<@T$Dn
DPA6R6 +NLG4=8y5P94NuLu:#SV<5C=^LjHL4H86!/^/uhhwl\5jGL:=8jE6t+EX:^$V5$N+I1Z19:h+Pyd%>$^
%\BQn& L$Hy@KNL4Q&ZZpIWtiLJ11Be=lliB@/%mm#1eiNXj9NdX@pZKQKED!b<IL@N%@by+*M#=X4G^w@LuXj&
:y+&:/ N$1GPR1I!!j@=hC+4@%Y?>yb%?5=H#aW1$>i@8>=h@E#S%F9!C8!%%DH1wLHM^uj?wNYJ6h8Q&Xu^qih
=*:nJ1 ZNN&5dP6LYa>Ht&/uM#kp$^tJQu&!MHM1iFM>NSBj6LY/Xq*5jQnSKa@5T$^*M$^I/eG8wa#Gi6k>:A#
dXDu5+ J4^6#i+VVj*>GiN^I>4QMS>HP:58b+cHw>8HQM?QbMaZ6wZ&ZF!@>&$:W&CeGJE^I%6QNCXmtXD:>qnc
n$E@eF p86$Zp/*uh1:dhD$JV8?peSbXhH6Bb&9#Yt*j:V9=JZG:nA?/Y:Z%tm*cRjj&YT@@W&Da\c8cQhyh&q#
!pNhPl #8&:iK&^?!DHdJ%<e>ZHp?@chND+6><enPKVwjChp?@K*HuHn\>&Dn>ppjd+^:hM@Kb%==*=?*+#biH9
8uPYA^ ueIu^8p:Jn<j9&8K68<*E^?W>hl@e<hp*<mh?PT%X?>Q<nwZ*=w+iX@qqMu:>u&Y459aMpb:eLSWi@DL
5>peEi jb<q:#Y&b5cX6*>Q&@h$qddQ*QhyJI>D4B@u9ZQ\B*tnjj5?ZXlp<#L6dZiP?q///#jt96HKQGPR!@td
w:\aP& 8@:lt#?+c@VLjbuT8#MHKJ\Lh%!yjit896F>k=X%P<m\/Lc:u19<\X$@*4VQ1L#j&INQh4\>Kc=X*Qtq
?X%<eD 68@9:u#\eSHF\F%:D%Zh%bc@:>M:F!=an$??ecA:>y9uM>EK//QM\d%&y1ywVj6#I\hQQb<\M:uYDw!a
+qKuBQ a@YH+%c@ehC/bFtZDH!!y9*=\c$jy:8NnHYm?:p8j6J$!Vm=:WTm!&=@*81WthyPh$ZZ:*:eGLVc?=8m
JWGYIl wp:dM68Tq><i>A*ED4RjpDH6/><Pnc\QD^=$J$<P!ym*4ink/WRtuGkLZR4lp%lV%Q&<bdh%DpbGBn*p
j*6iVm q>9aq4q$+6L/9eMndh&DY@FJ!NP?^VIPJE+eCB5:jJ#>$5miVQjn@Z8m@bicSkc*+^NQyLNVH^mKdl9!
>8YI&X YTjCyPL6^KYS=:8:u#@%?MZ%8#PQW<FPQSei*Ly%MQy&MuNCH?ca!?%8Z!RY&yMINWX6euuNt5:&YQSW
%?/a<T y4<y$buapTaXq>58:pt5&Yaa*8kik>iJdh8/99?AP:P>Vh<Y/l:CJ%9j:t\cckeDw1/V&:dSVN/Puk^F
5Gklua 4QYb!NDHmZAtRjq68j#^^e/t>yH+t6Q6//tw&>+?5Y*:TML8**5/68NkR5:cjPyp?HG*Fh8/+/S^WKV?
G64QpV >8ZwySFn^>:LQ*S*j!^uSdh6<^$+edy#!@w&P!Nn6y$/%hX9JT>b*>&YPaqQImN96%$&lph</>4cQu/d
XctS$c a@V\%wM:VuV*^*da^$Ib!m5!GG+#4IS%Cu+kIhw#iD1b/V4XudHn<Vj1h&#DJ/eHV/$^MmQdncGVj^Q9
LXPuqj =ynEcTQ#?N9>S9@nP:c58eT=Vk=&Sae#XuhtKHV^wSB=iNGV5d8ni&*nPe??H*cSQ^j*dnq%eY>tS?dm
=cqDEk n6n/9ThIcc#dPlkLG?Gl?q%#wl\VQbk+ejHkaCb#8u6\%daI4##RQZV\+<^&I>GW:n!q+=Q?:wHPNqBw
Rd!ne= G=qIW+#c55jPdPqiu^p^8p:11:d8^TeuB69iYGQ*H<^ak<>*u4I+^nB?9*&HEdNPlcNNw4*6<db:PpQh
-AH=pP 000fc3c0b50001202b3 Page 22 of binaries1.zip
/kl@/I tSF:^G+:5b8j?N/aiDI=QJk=Fh:c%M+^y=IjBT+i#HVd%1ZMGk>h^MXRd9X/h!!VTaa:&:j!!p*ZDuYi
JVqwe6 DIP8$Hc:5+6$Sj>Rc+6uVwaN/>TyyqQW\!%jF4m*88&S#QdLmVYhZq=b8<pZ61BKS9jBhXHTFV5$1ZQ:
tp5Jmy 1c/MqhVdL8&k*N@Y8p/N>B98DN#i84e9$6HqdIt65!!R89&p8@>6T8iF>iCyi**@\bH?dX9FRW*1nK$^
pa9L!j 4M#BlGj*&^F1%HNhH+>phk!/eX:<=c&p+8QLwei*yp>uSp/Gjh8/1iGl4h5M?$RGuNpSP:tNGy+Iu>nl
c<uqSA #q#M^KNDd*iiwuVi94nd56w\!8:&:aqV!5cyE+?jPunK&D8a8Nn8I#i/Ll8GFW*55NPuDl#wPkXucG#4
@R@pa6 *N:@QBTuP@d^^:ca+N:M$KYB:qPJ9edYp=*+bDkYi#68:W*athnnajG:/@eMH6Rj:?\&E1eG>I9d^C#Y
B\\=IW S*%D#&i/8:h$1#G^bDLV/YqQnk^bH?6SN$%\>@1VI<PSnN*j9m&T=HLC^$:bui8*>wjT%9whQm=b@+<i
?u##9> h!dS:S5<hcI#%MZwaj@mqLXtV!L#9DY$8<tkR?y9m%@KRDYMT+?*ld4w6I!l4hccn$hP>X6DR$%SmuV\
tKL!Z* 8Y/*uRudh6Vd%d/ha8@8n%48NTPb\SHhPHCTa/!S:TiM#MEh9kPiyw@:JiKFM$NN:VE4e$t*Vy:pC96H
S9!=^# Vu1nMPHwAa<:jwuP&I=ul4c6H>!BC%qd6*GMpWt5Q=WJ&dHV+ejVd:j#4JQhmY*dM>$nk=iGVuS/iFdG
>tTYNJ &BM%LPQ=6NZ>ZKcNK$\Pl4b*I!KjeG<d*EauCw*<GA4ij\LnR8IpM6%:nYkwa>n^E%=:tP1VVMR:6&hP
qYAtyB QY?MDI%e/wj/cIchKX5Dd9b:Hk<j!DDwhJ@c1^@5Hp\aI<PD@beap$e5/@tLSuit?+Du>EkEHNQmhu>b
ReR\ZH >*dniZnk\i:BpKAG*@BF\I8M=Zp8cXMVE6%&@$>DwM\>$l?KZiKXncn^%+MbSBVQ&!MbG5HI>p#pnRPl
BQ?q*I yHX1^MkMYqAwK^MhHPwjBB#^iA%iyn>1G&5BS*\HS$cTF5W%uNuS@R?QI\T$lWQGIBjaH#MTq@ePbm=u
eGp%>G L9X:LSF:JyJ=:k=+wI5H>84hayPJ\XQt:^tDme!J@8e6R#HX/4y#MNP>Jy%yQ$ZLPjF&9N<w/nbG:BPh
cpTP&N mj/p#JWbVyacEe66HF^@$Ej:H>q/5Q5\*En/^PD\JSF:h!b1=Hd4hu</E4bHSBVd:j/@NA:8PQu++CZF
&hCl9L \l&b1LZweT8h$b?*lA4Lin8#+&<lldd8/Iq?M8QW+*Dd4$W!95#k+JAi!+\9!R^HD::>cd?SdLP:e=?Z
ldJEFM TQD++HDt#d$uDtd$\a6S?wmMj1Dj&BT^B61/naMC<n1:?\?e?M&Ppi+Sjc<iwt%u48+h!X^i*#*eiRA8
cdZ+Mb wF?<whX@aQTdX6k+MVSwpC+4$Y$Nuuuk$pnVePdA+/V>$8uEKj5jFmB1l5IbQTS4#tV&&pj:$?*J#J1D
+<CP\^ yKK4a@&&@6n69l&b#KqMF!p%+A%5?\+km+#hJ6nH<@G&6+&S&#?P:6$DQ<G=Bk>?E\:n%W!tQ#QTqwnV
@qPKj$ m%%<ih6k=k?G&+aG+%B<!9V^HRBkdZA6/W^dt4Q4?16S*?Z?SKJ6yCtV+bZDc!:lE5ePH5#$G&$je*aa
B9A>5E SjVk\SMnH%<<+KW&nm</jTtcGSp?H4a#?TN4B94F8Ai*>jj@&iCPNRe<ti:V>I?hy+DJB4D\jyDQK&@d
Wm@RaI CyBmZSwKi?!\FcP&hEhPbAb*ZMb/aL%:/WM9dpqH8?&@n\?6H#\b:TijR/h&&FatykM:H##\HPj/PB4c
\b&GC! MSLh$@@<TPjFT@&p*hm&\+DbH8m@dB\<wHMMwpL*\aPJT>dI!MXL#^P%DLX%Jc#l+eEh+eVBA=&CNnK\
?=>h4Q n+\X#q!C6tRaWjTtE>5#@RPDJ+!B+jSJ/k<mnlHQYH5Mh*j*CaHFF:@S%G<aI*CNY\dT+al+?WG4i>B!
G=B=NI :>&S/V+^Rwh$<jE>q^AD\%b+#aDlIcZ6d=*IJDQy9Ti?cYMM:YLk<68^k^p:uQ:#>wF$uE:4=Ja@k<Xt
d9\uS% VtSP&N*hIV4I!&?*H?#96&:b64I>eVGJ/^T$Sh&Rlb$ydLXDB*&ejYVN8k^ML*d!5H9\+#myYBeblC8A
m4jSiI Ym%Ju:bGTPuF9%=D+a=E**MQ8n*Dkk:jnub*b=/*Q:N<tSF!@8P&cQe\@Mnkw!i/&mCheZtuL&$d6nJF
CKIe*c we?GnE\*!d4$ZQSk@$nGb@@E&>Yye<tuP$>F4j:w+LcWdlkAh?Q!Q::$ZGc9qTq<\>6%+kR5J!@$*CY+
*8uq8F @iIDq%MnSnyNDmbPuLd/><J/4uR&uim*laM:V5GK?4j6mtiM*X!N+RQ:TWQ<bF6Z9%lk=<H&EVDn+@VB
::n/F* nDGEPJu:>5eZ4aQFi#Nhc>b+JaiJ?4aNDwIZ8+&>tSEhW?Yh:D\BJT*8:>@i&Ha/LDF\m!eV:kdH?6&b
$9&bii @mRn\>cjHV\%pwpinBmNdRNSYW+5kemQT*V>Yj@BCJje9\j?5j5kjQA48#6%Z8hp@!twn>F>K9y^*Hli
a^iNpS RI#QCk$!BB*a89hWP+Y?I>p@iQAkZQdk?hMJAe4GRVk@\?+jC8&=FBHAhCLSHW4Aj*eQZk#4Ny&Q%V$<
:WM/*\ iDAV!mRPDH<e8TTkclke/Id*:j<*B@W\#hd8N*#JnD*TNtT$SeSBSa$heHl\Gh%6@jyIA8#J:IB4Kddi
4?k#L$ Vk^6meVpM9dk6pVGPJZyDkEZM4^bIT9VnTB$e6mMQV<mpYH\XD?t5nMHL:c*l/tu\*dGb<BySm>ci?^?
*+<C@J T+JbhHAH!LE#&/Q6tLI1N&Hdb1bw//q$q>%J\nM:wtE\eJ66hi&?qCF#VlpHS?L\\5ADn^>an/CWb*ZD
juJ#=> PYcKEt?j&uLJ=pV>:*XujNakkLjhdi*qSMPj?4bq/LCmP?+:ESQE<Pbh$GQ1lZF1cATtu#5$i4PhKhtS
KWcKYL jKA6@5yn&\ni?6?y8nqnYjdB#Mmq@>XQeG6@YjALeQD$jjFa&<>*$#Yi?p*id\+Gh$*P?iDy!T%@Kc:/
Sj@F1H #b^*99qB\+jQ99Vp8Q?/nP/1@#e==njjd@m\:6>9@G<NH=K5+a?t>u@#@Ztj:@9*G@>p<?%M<dy@e*@t
%kkP$! q4?1K/#=p@hiVD&WpVEN6@@k4?a%:j9bF*@!p#Iml9:S:XZ9@%Yh9jDN+!>??cykw$$QXZ$du#\%>a5@
P@^!+& VS&tQL9NB!y?<XeQDnji@>q@?@YT:bI!QFV%6*?%5LL!&R9*y#+Vymb99?u5Z#%$X<Zt$j%9QNwqD8!8
4dBu1W 9#$LXkDmJT+N!ym*n@!9R\nYY?!S:t*4PCcciZ@jwT@ij?H\+Z@:t=@Ihi#wZ%:VB9?j\/jCB\+<?n>E
@bXhGY PQbbW@6L*<kQ@?#?jej$6I#=#eGe#KWa+JW>6GPHZPj=1l^+@+NY9:$?bItR?/$@BqlLuQJh?#mylP#L
D<mV@J 9N<jSqa#iHBdS9Beh:L@M:miwS*h^9w%hFj>mY+nba%an%9GwF8e:nA8i8BW@%:4%GBt&:wM%Ku::SnW
t+PuBB Ch+$jGwRcDeQNkP:LD/F<DH!=&LF@hEhB$Q^BPNl^uMJ1y^uHDSkueWnRAD>q\=R^6*D*aQR8An5%Fku
l?<nud aTKB!VPbpGHn:QMnDMebZ:e%AtAE8^t<>Hm*<GI+$@?<dSndLG6AIA$!GhnnICk<%i*yF<%+H8wN4tQ/
TTDke> pT@&ItuQGRG5K6%lGH8NYPam6FQLcNyD\\<N@:?5bm*<HhY5jI#Nh/ybC>Xq@9^u&m!&GYT4Ycd&>\eK
JNja$P 91HqbnLN@!H*ST$964Z+*eL@wiZ@:$9FVZ>!VT6a?yttHZ6IhXH>ncaX=T=1@<PBnFb<%>&u@6QEP4c>
kbwRq6 NJ<a@/bY&1VX9FI\VT9:$$9j@*iN<:Z!5^1@6IyDG4?$!t?^&15cHQ:J/yp4>*\5dEi$pK&ZlBPlTDRc
5YT^5F m+Ynh4#+uZk<Ew@w!amh#NWV8y&ewP8lty41WCkYnTd%bDLTNVC+\I:t/6GRHepNS/NYPB>u>+Z6%u5V
KIG1bB :!S\yy+<QbCMlBIe4Ee9ZAnZl1K^eCTTDCWHp%$L9^EP+@N+TNinmdAiQSMP^$K^%tk<*y4+Ml=Jaq!Z
&<cM*Q n19EicFR8La&bEYLeMppQl>$#eiJmbAimaR^e#mEmWQuw4HYSG6jQKyniX&aGih&Jh6^whCF/KyRPB!Q
1?6Ct# &HwiCLIZ*lwJJ*BtBPjGeZIQyu/^Nj^P4C<Y5!Kq:Z4ZkM=Xh!X69VTPbehD$SCYbEh!pmeYXwYnwZAw
uSJ<^Y ntqnPQhMc<!PX9bl:qlaV!R^:WATA#X\#I/WlHAm%luXB&\>N>qqL!!K/nkVm:GmbiHR8hmLL+dDjdFw
IWnW+@ #I=QnWSAdljj+#!ERuwwFNc=#JA\e<A%PaJ=\/%leDG1l&K@n5XEZDE>kZXTILwM^K4Hl$K45Dm\Za@!
iTYFwD w$l!$LWAwk9yWb+eDq<JZ<JqamF!IJ1kkDAu%wtSEJp4FQ=y>GS:Mw#=<XHphNK%AF^8Dae\bT\W/yG4
IKki%W >CX\cmIT=/\DEV$YLm@VIeqIhNYFeQlM4+/%J!Q6qIB4Xlk5C%$Jl*89^KK%+FW$Xq:iG+?Ha%hmEd$>
wFSKNF 1WMCY5ZAS&Bd1Gy/KHSY/\KyEZ&ABDWYReew+m8Yy9ZaMi&MyiYY/&FL8?ZD=EAET>I1p/?XS&SR?E%6
/?JCd9 ZVSlS@KF:Ah#R?GIHe/JSp$6F$LGi%upt1ZhXZ+cP6X#ST5h?FVVP<PReclZ5:8m86+F9Ruy4kYRA!X<
&<6Wic S18+eqa4Q6eLa?=KuE>G6VL<@GGpM*#tnFa=PAC&aYYS/Ehct^Ym=pXI:\J1bnRY9cKX6iMKL=:XQwB1
ICGSmV DCRVYtZdy:lRJNdVw=X&&epBuiJ+/K!YGXm9!AZ*F$TEIiGRXlyJcMXSVW6&hWEdE?YqZ!Y\=DQc&X/6
@#^Xmd Mu&6N=uA6&ZSN:ZBkh/#FEK:HuHNV81JPKc8\h\l4TK5>Z!FXTcVac%1AGeu+S:K#%atQ\ZDdK&!R9>I
nC8Fb4 5%@VTuXbP?nYp=#/%#ldD&8Xu&1XWPpw4Fm4:L1tXitcBp=WD4/t/b>1Fie4R=>1pBy=Bu/Bd5!hcL%T
IH8Pph P$W4m=#q&S@<?ciaD*N#*k>j$*yCH&tX>1hc<p&N69!tb8FHG*PV:yIpue89c&4Pq66c\e<@%iJhu>4c
=VeV=a >ESaw$@4ip&LJ1?Xe^qhu&4$Dy>14&tZB\i/p4TeBWY\&Xn54Zh@aYqqbWqMnc8j%jREyF%=+mMNK>NK
/bk4h9 M=?Y+#jqEd*4#ZK6jHDR%9X&QSS^=i6R/LBhe:hY*l8LJF@VQ5R%5WwhQ<eHMh%AMmV46n9B5?n/V<GD
Lcyi&R yJ*5Pl$QpYhkYCJ/#:99cyZ\Y6CwW9D!VY$A<8y15<tj>ll+>tu=ACaHb#:C841/ByP\>FDTXS?P^tN9
e#PAiG >h=Nn6MR6ZI\E*NHeA1Ii@Q5ANnH8WFuq$c?@\aVhMHy/8DbPC\<FK=?6:i<WtS\X4Q%8#FY%$4641/*
1pa1+1 *6R8/=D8IFc8/\MjqYNbZX1FDliSG\t6\<1l9Q1Ftt16DQ!J^N@W!lNRmGRu!P5K%W:XK4Q!/w^E#y:F
Va1Q!< 56JuNikylh&?wA4P=+lwiTXmSVRTM:Wbb#H#B\QJ6!:EKLT#qRPk?6Q!n:TK6w?$\W@QkpF/=GS:bMG+
N=NTd8 K&Ac9FEQbwwtIwuIGXP:cWDHbMq\#V$jkW*ReM\LBcn<$Q:$:CBJl#h1n$SePih::PkDmjCbYBTLV4!D
@DVY*4 >>:iu6DyTQk!ZPC1h$P>FbHwbd5#tk^jKajlJYK&Ha8B&ZHM:m46QSPP$+iGI%@b?t\+4K:&9\6F<By5
-Aa:XV 000334e6b07001202b3 Page 23 of binaries1.zip
JuSY+# G+leiP6Ci%h:%+qBi5I\4G/Rhw9@WA>hm!^<5LeHFMNwERRnmTMJ?Pu&4y@1D:pYuE+?BE<TmuT%DTVV
IKh>=Z dYSuppcdQMFIBBubpaZX9YhmDFk1Cpdk^EMLjl4/cilCcMFuwSA@Pl*B?ZVFMh%KqqHJR+qw:QV/pL+\
\%SWkp 6/jumlW4\PpRqB&=N%R:LX^h?%b6:W>Dm*?1l=Kl>b>Fail/b!IEqcBZVwd6YH+$jq1QLJ\hm=:@hi?b
IEXh:: <?ebM&Aw?wWL9:=\IXahZiY141*?cYRBqllbMDCANXm^mnD<ilLl+h$ak4/?5Cket*Lq!9tiK*c+kE5Q
VN>GHR Jc#ck8wwF4:a9uBHCCcEpHW!$pZZeRYeBZGJK#Y^KMPZc%45VP#KtVQl<#*u5ZR/%R5ZEHS?F8y<C$H>
c!<BwA uy@NiTkTca@cik+me#V@jC!W\LH\jC^/pt++L^c?$tPj4#kVQpQGARqkAYDq9cj%6!=e/Kt?<Nik5%$C
TZ6QMu JD#ytVCmTVJeG/9B8i5mC!j?tqH/VP^<NHat*BylPIV/&VyMlZNj1K&6j8n$!Wnamw#V\cA+@J\ZDIJu
ntj^V& A6WqSEKMqdGRHe%BnI%M\9InpbPu>hNkHW:@c=IiChGYEMHDRCh$J9!k$a/XSWl5c/\XDAN=lWqmnumu
QB\K<V HTpL\Vmt9ZZl5+ERLl4P$?H4:YkBqARuYJGF6$F/lE@ABZh\\XHaFm\qD9%hd+h8p&W@BPkVR8TG%eYw
$kWuRa !JC/Hqq6/\84jk$>^@DEm$BC8D/IuSlHGE@R%RAIleG^$E<@$!MYJp+C8pWBT#AwF?6icMitl^QEJ:lt
Xb>BVP A8GWZMWQ!ZkaY1Au1!?<6iyiaANh6/NXaDSuV1:DRuV>M>%XFi5lPAC:CA%maeKjMC+VA1!Mk\HF461R
kN^jAY //&@Dm%AQK+CX?F^a%k*Vwh^NJVE4pS^Ae=5aQAWIK=Ek4+yRTn$%q5ZX6XPA!JmVIYilI9^jnKp@#TJ
FdHbph aHpthkiA^SuAwX@H\n*upZNRFiKMatEGl6Nl%+K*LpT4F+Ra#/FDYKT?9q*@DL=:+e&^&Qu\qXnQFRCS
E%p#4c KXjPAPpSeEEnaDn4p^Sq#p>Dht*FNCAuim\!J=/p:+&GFp+Bcw!iP*Q1nnBJl*1V!&Be:M1XYQm$Fep:
H&dWuD jV4!qu*lyqk%\E?W1l&PAb:1ubEF?wLT9uQAt*$mQ!6c$S1Jk%HSSP#huuhnCW8@4W99Cm&AppcBtpY^
eZWMuI RZwmGVpNE*CX9Nl//eXYmDnYc5jG9Rkqc$$emeF^u4tCCcCyiaRltQqh/CpkKE\9Aj\dTnKW8&d$HYm>
a#XC<5 %LeQm#@Zl^Ye/+9neAT5kbpR/846y/GduTB:jQWFGQEbGpE$taTeP*XZ<TZMmlu*ZdJjuNY1F6EZ@\V\
=t<jIA MFahA=THqTFRSiBYct61:!G/lq*Ba9Q$ke5ACK&^\**uL9Xhci$:$Hj8*QM^Pd<%wYMkhCL$d@THRk5Y
4J#?8L kNt\:uh:+GNI?iX%8tmbc$H5<Dtej/49Elb\1VY/:^#t^6ylPYBN/DIG@jSCcFW%<HX6#V*9A1mimWdl
qMnIlu lPE@P!P8!Z%S4BS<P*K8:%\W=&EqB%ydISE:elepF&yj+HLh<?=QRjJd:::LnKPuB<l>RI<<>Ni//%+w
F55%*8 XC5ql9h4mt!<+44Ah8Kj$F@@*RY:Nl>1h8ai?>&mEJbPN\<NAnj8mmcS&MRTPLt%4!etQG6>NhEK#\q$
T*d95H @hQpb*bwjC%mD#F58KaGe^M6&%%=pVB+jp?T1B>\Ph1HZCWcd8%LJPL^9umpp%+i^9>b/Gh&:TRpb?HR
Y%i=Ga lZeu9Q68/A!k5L+8GdtM8Y?FZ+NZVNA+w\D^pSnQy$Yj6CPF!hPZE*?lR$$Lj5c=c?&cuP1RHT/MhEED
X&bTaM L^MRluW+kL/EH8*nSj5ka@$q\S4^>RD*ZcHp/Wn6AkR+mQDC8=k>HEJPKTqFbEFXHIaC<WA9pL4AkP*I
wE=W#1 BLk6ew\9yF1SH<EBYylS\>TqpHk$GtHctF!kli*R8Gkp@QMwF+A<I=GWJG\T9PNy4H:k<th\@bGHCQ8S
mRy:\a Z>49FwL<<?FI$6Jh5^Aic8Ep\<A6RJhH>C@DlAwm1kV%E=ulAF^wDH/:KlK18S8bdb<EhSmcc&II&uiB
wuYlhj !+cQlIRA<X8BtTKq8NSAuEl=kAqh/Q\9tRCH*:LjLat?GEYCtWC!=$I!ZXNYG/Ljb$IXkn*Pm6IFa%1/
T1WuhL 5&VpYBi\T1#tjDVeGha9VLt:qqp%eCiem$8L&lj!w$n/\Ky9SHEN<J@Wp\/Tk4tVui*/GWCJ!>FpCQL?
:cZ9YJ SRmKDS<L/RLRRY?uS<RQRia/RnC\\JGI\H6phEt\:DPG/S=CJ^APXR8*uk6F9SCk1\41E&ZCGAF$R1TG
dZ1e$S AG=lXlkSjA?SDkIl/P*Su6kePPpKmQ9Zwd+?aBXADd$S/Z?a<mqDdm%=PS^i!EDKnd#GVydc$BNRBT?J
kZ!%\< MiYlP!amtY^qYl&Q8!dD5?4pWEmHS+^G#!MWIDBEBm:dpcyP!ie@a?#q+8CV!!Gih&q?ilImBeTI5yTR
#9%?>i DCjJk>:iM<RKtE99RtwJTQQRIGLeR$n?wWbIqe6yaDDBI@F+X\IlwBbISW/Q^KK>X<:$>mCISCu8ecD/
95YD4p GCkckNBDXGEAljIL9//8CdemhW+im!Rc!\CwVqI!$KV#h1>%B9q4lEqFq\:W!Hud+X%!w#J9wlc496KH
BVQQ@1 1D&k^^hYSh<q%KBu:n$D@Fyt>e!ElTCNn?mT^chlHy<lPCdm^F!lh&81a:E#$ENakT5*h8cKHcquW6#:
qc$Al= C*\^Awa9ZI/e9p!:\nZY&dkPBSqPZAcdwPFu*lGtRwNeJV&^<@FIVI>h?aZhP?eK*B!?wC#J4uaAcDnM
baF4kd E+NaSHIX!^^\4NHRlV81#!By%?u8ZDXllD1i*H9&dG<Q$HRMjmMWYpeFAjRaGB\E!!BJRDZCZ4&5y9bh
n$Ci6: PN^YcIYieE%EyCVC/D*dP/Z*DLMZSJ+aEB%eCW\jma$N@WcGDP<bk\!l+NDR99M9+ZSA@@AbP%^&@8!W
dbLMXX *9L!u8mW%tmjHd$JZGMPCP$:uS\ebPpuBGA#Lk#VkaKHitJunwVlbQTFh9SBVM^qZ*pSp+bmS&D#ejwl
ieRhRJ CCGWHESCDwEq@^y1^NyTCAC#6T<cDS&BB\ZARj#9QV8qjEy9CDqA1M<P#@w!KlaJ^aEiD!AV:i^CpA>J
C+R<ql Xiu9L4#XI$kjlEShyVk=%q6?69h<D!mwdW%E??K15yNM\Emld9aA@X/EQ/!C+/1yCajjmjbB=iFTJ5Aw
^/DK1= 5P:i*q@HYEQ4R#S=^++n5Nn/XH!TQN*FRkVAil^8J\V!**w*lGAB*YpNH%p+MS!>En*d?\9whW<$&yiI
G#&YDI 6P1^SC5Ep+\A#>AZhpuScL&PqhLl%FcHj>$KY+9cahi$PKn8KRiAyy^c+*B^S&m$tI&%H\mMKtNHdk16
QV#5&L y/iK9QX8V#nYF#+Ca?&LLm\E=Iu&S5@a$hK?P@1m#HkVL<i6!D%jSSQ9lBBe\dWp>D#CXX>G/K9GYeCY
>k?\ch ^AP8t?NSwDM!MSddF!c!ALl/?e5+qywk4EcEEpApWBn&>Xc$=\+!LbF<J^b^*b+ACtXbD9!mt+Ei\+IV
&d!auB Z$c?Cu>JmAtP6VNK/WV%%NS*R/\CCk:VF^VEeZw$c5b!+pV?i4JQV:atZ6c@SN^Fy6b%ikAtn9AbCmQ:
\CQup? Aa+PF=<:%=Pk=WaY*9%PDPIXdNh/yC<yjnniF*5Jd4V%T^kBb4cVJcBGD%?GywT5cDHEB4=nNR9#E=k+
pJ1*A/ aeX8daWY\ZC@nChD4ZlLJL=ENkdEQHDc%lEC!Y6C8#CeEWRXy#6*%TWTWNl#uD4TttVyFBiN6TaVZ<Lh
Nl$Au8 9SRm5:6P$$\yby!P4AmlHw1IpK\99BNIMCbMk$6H8pTP>!Y?nQ<<*64/CV!9qe#y\8V=mhDJWNRPqap?
^hYRG1 \Pt!X48\IkEa^?!!L@=PQIwaQCEil1wqY6jGZtH%e8A$jX4pJ4mKeD66lCp+#tc?AtB*KS+nKkwuGKWb
VC+ALy KN?J6u:!bd#9$p8j^FqT%ipYKZ?k5>M+8SY4BCBKA8&:KtJHCK*i+h!6je#V+*b+SyIADRmL=6$qhhEw
8umHT4 y9$bM/i?M#kh&p8:e$*4k=nkJ5HH%pmCWK+XC1K*AmG*<pja^tqbPe5X\BwRh=>WVap=F>^#Cm1GleVl
yci#aC ViAi>XaMCu@!miA<RRw+&hR4pa/EL9\MPk/yIb4Dh5NJ%:*A$cAp?t6pRu&EGjF*a1H\K+elBE@<p+m1
\&JMaA !6wSJHA\$>4RY/GRBGQJ*=P8Bj6mAQ6Z#y<@$>jHD/B^EDdlcT6@lFuTNipEi9C^6hWZR9^PauMm8jAP
kZDPa* eLw%nFmJ6Ib8IBE?En@TJ*A/uplK>jwYaIk+/>#A+kTpeC6AeSn58l6LR/D>Sc?pQPAuPBpZSB\n^<R$
eV1amq pnhnHmb@b+mqLnC9AAnTw<tF6^D<JSlukYAV4epRX=J<+ZDMnlhGYHbl:L$yRb!J$BP81TXGaVEdl4n\
A6YA@@ bl&8=<5ah\6INVR&G1jP&+ueyGkwEZhltPFDB=I1i=iRGtj@QE!YCTlFKGhY*k1c+e4/QwH+++JH^aZm
D55ElS GGZGCuQp%NYE6YS==MHJEbFumJ+S@nePS=NwVaABmP*ybAEe9bRBe1Eq>wWT&HW+@FL+yd/p/?cpJAm\
EMMRI@ Yc!J=:RC8<hneV6!N?\&KSFdytYPl!FR::hE%eAtYdVEGQ%qYF1$FR/X!55KDR$e/5p4\G!mpuu#mIq4
F@>TyK #kCKjbJML1!Wpu=IACS?mZB=b!5lYJ\dK\qbGL=ByEZM\=LkW/^wIVWqpY^haCj#PDPTh$mDFliLYjEC
6MG<Y# aeNqP=qLQWqMm5RTej\uYk+n:\ACl%ZGF>\1ibGiWKVHbX<yS5XMS5#pFKp&a\*SPK\tBma!=Qd$EAcH
$9B=Tb E\8u1jRkE5b:QH1tqZkl\SZHSjWHV8KKTh%KIC^CSdq+\SFI@/NS%^%CqLw?FR+jR!$V+kEm!ZX&<ncC
FujXQl Ly$YnCRKclHn=QH+qVB\+<JCkhq/*NJ#Ehd6<ERaYa\ZT%D^8B=eKY\uK4D\SDLG!mWm6G=He*y/ZFNE
e=ZKh@ HlG%m^JF\pZZE8hmYS/#p:j#X=kVmyKAVaP&PBb&NbGI\SP:eqmYjTCyEpwC/Nm=YE\^EKI?F6HZJ*WQ
5L*Ya8 FpB8^=pTJVwn<bN/$l8P>wRcd/aTKR&XPBpL9>kc\:I6*WyP\Y<8a#ciGE/eDP5Z/j8TmdkA=kZ=eywN
m1E<kW PRQ^55aTlmJkW9LdT6:i:8qp1Ki=mL#Ie1>?NWqj:C4l1Y4#\Nd9lCJTFLLpCGnYP:pjF5FJeFX^5K$I
:>md11 KlD*JtNJP=EVD498m#m/n?E@=#+jQCG+DMWH4RNmGT#uJDm*Hc<A^=Bakkk\QlqhtC<bEVJKYRQeJ&8n
wW>hwj pmXGTDTt%:$u\TI5Gl@nI9GLZauEXSART:kiWFt:dC>GIm<uZyccdy#<k:mPmck=e+#1Be5A%=JZMV$Y
aI*L5h uw!:HlBQwd?5n+p4XwH9+ktS@eD/bKK#M<F=?JYA95YS*q&N4Ijnn!be=Tw:h4Ve%18n\Ene:nwbVS:n
IA#Y&T 98Qq!@CMPD$Th&\pGd?KbaH#J=MLaa=PJ5l51!aJZIu<J<EFD\^T^/<mE+1^jMd@=Li?L4u8c6KL4<dT
@dpnlF bEk6PKt@dMK8\<lC1eS&e9IRKIipB/Iu\%ATYpeWwpyE4q4JZG<!/T1RKdHejJ/P1i@D5m>#JYDakJ%M
WayM#B ZlbyRe&wZ&D=Xik1FuM%tjVGF>cJZVqKKpt=H88q6Jp?aYWStlnCVa\cBpJ^ql*QT!dZk?MLC^*4qdpJ
M$Nwed qmQ=TJuCJ&&>hF*T:411R%>Pl8ER+MQ$>XAQpI@b\%FG1#tTtAA:PW^u4P#6STCq?<RqwT<RY+#dMA^+
-A*qcL 000faedd810001202b3 Page 24 of binaries1.zip
\4/=9$ J?%ECb\D4JJMdLAnBVkBR\&>BqCMeT8i/AVF//=&JipWw94/m$AQ?Ewt5jlw@QI/P4ZI\pLGCbul#8VQ
NDlI#I I=Kjl5/Wu+@EL%>PIDXMhpdw<tEaWT6iGW%/SF9mX/p%maX=mVBbZTlLy&&XJBQA<Mk*Eq*R:e94^j5k
GVS@1^ mIjZa#kNkq@$JZ1<5XCZuh^Iqq%Y=I:\L*w=e^!cAFyP\u>ASMy:+l\#XkDlS&KMNpR+!T!nJQTEQ8w>
L:%hQ+ H>c>DJAJJPQ/ScK$tDn>JN*SC<ta%$5M=CyuEI^pJT&:$uwTpwJ!R<Q8GImLH\Ynw>\:nmY>5eVFQm<e
amL*ke LH=P8t=N5q:l/Ii8ck/S&Npyj\QnV%bCq\TyIEAp+Dd6iDGP5hnXYDJ8J#R9h!/SSI^yYXm8E4/DDKhQ
IYN6Wy /RSS/$E9BBTFeKteIPA^9pFMC:uTWEk/HmKYZmCL$P*ii$PR/uy>Hj$l+^Vn$AD\Hlee?!FWJH+^teDW
qD%C1a pMa1tL>T5K?puABNPS<t<wY4ZeiN<ml$K=4$ilM\B%^GHDu+B&p^:R6BT5llyQEB<dm<QBV%R6A\ikSI
E5#9F? =68aqJ:QE+jAwuRy!eVCK4GnKMJ%TFtI4h@XyX@wuZJiJW5S@YRpT9WEaIADPap5AlE<Q<4JZRWR!5tI
5&<yIp !+:M^jt91kIQ\py9d$<$jnZCiZXtBlB$ZBV4KyV5E\>=9!=Bt8Q$n>YS4A6EL68q/:%WFiyTbD$MMS#%
$uXwQ& RF1^PC\nCYk1LPjeC!iE8XpiYlX%^IZZX*dpV4A5hBE@4Ai*V\LqIElC4:\+\*9%E<<4hq##\l6M%Ype
SZ>KL? ?45l*bE&tVBAQR5Q/FhJ8c%QZM@/Q!*nKqb<>ai9muua<ed=LERCCNi1YhupRwT9q>PJRw\IGPV*^jBF
1M5DiS ?BI+Id\<HpBVK?HKSjb1S?4D%THaS$k=+Haa<b8>eRw!\YyWR9hE4?1RFmRNWn?ltTT>J<Q^liXAahF+
A!H/ki /P@iFh8$I9jy*FcEyG9%8ARdk8k\8JPA9ARWJD+B8:\5@Da?\N\qFI@ZXD95$q<>HRFeQhQ:IdhCwuD@
$Y5AH! SJRup>/488lpuNd6Tb1JleWCk64%C#*e61D99I%q&?TXKijlQQT4we9^%anQ!iVXL9l1P/uFdBlZQtRX
YhlIY6 V4lKYNIHHk=QkGwXTjWS@&&>19h<>DKe\$pGJRBQuDePCud%KlcBmYHZJ?Q^B$ydI&BmYQ@bqhypPnI6
#LMp!L &hW%pA^j/aE%$MMkTK%Q/IlKZ94@PFEp^GZGG?wJCMNI!i/=M?KAm>NC>JZ#me:LJ!PZw?5V$bPI1Fel
Apdm=> K$<!:8YJ5cTScJkXlbYGa/HIqYwXcuDT1>\WDb<H%EJ+T+b=kGAR^mQ\G@pmH!Q8!whnA6/L#98:h/FT
mDEi%Y Z%FGZbF&!8hMLCyRCJdpQSaLi/?CJDyd^QT+TAub%G\/:ZeA*pM%EWenB=lPhMY8MBVAp8D$pqEK!E+W
8wF%ch a+puAW89J1^+#5Za\9umm%6npem:IcYWP5/EXwdQ9$iEq&RS:m4uT#K\Shi9n<GT4ER8aEHnNGR@4Y\l
8!@65R $5N#54aALk>E4y*9TSINRVHY/Za5F!\Ghw?F%!e8k5e=5eVC$9BLWI\ZY/PSC&E:MwZu9n4AHyS\d+!X
8#n%CI *M6^HRRV*ThlhXTLuDmt#aMLmDjiFEQ1FWjKF?15qSlBwGh*FR*wX\AiGdRuMm8Jl&NR=VB%p+!P^<!+
49kK\h /\+KtwYGTHTX#t+\&P:Qp/ISCIdInTjmqNnJa\ViDMHkNVtPDA<@LJl+yjWh!VSbMqLG$NWX5d5tAp/E
SmwtuA P!Q/%T:wWw#%p4n*a5KM=+EA/HM8F4&\qG%cjbjaI^c!InQw5Nkylt#^#EuGd@Acb*yB<<qphD&RH!d&
NEhZY8 etJwGd5<?9wP>LFY<JupV6C9>kH>XXk>K/MuER8>$bmZWC?bFBZB@:AaBN^qHV=8:YNyl\t+mQp$:D@T
RZAVQX lcE^=CqJR1&4uWRAeWtwXnMh=61bVJXFpEi\9c%XD!E<qdC#AQ<HVmj5&CV+B@wLww<+#=jILK8PkjCF
w%aJIJ D*IhhPNM9+u:Z6Y@T9/e@ZHRy58\B?CkAcH=Kqi6^=^LJHEJX^p%p/XdPQR=cyQ?>M%RMJ\ib6RG^9Ji
TCw*pb Ji#^/kVw5jY^p*T/5dkHZ5<%Z+@&uejJZ#J:EQnXulVDGGAp:a\L^#t/C=QGwy/I5@I<<tBlcb\qS/T8
au>TJ@ jXFpMXY1nkPV:P1K>X/PIytaAI:Hwq+JyDSAHK@cFDmCcpt+L*\q#AJw#IV4tm&qL:\A/D8SQ5cblCT8
uFV/%R Zti*S!RY9=mI8?bDT@4Pe*e>EZI&ZL4Enhk&bAYm%!iE&WtiKChDW^K&$4RH:+e^Mw8N9MQ1SpT/=:wk
>IhiHi =<FBKNy=QW^dQ!qVA+y+iZw/wTE\8icG4@FMcIm$*VEe6>NnD6k&/&ykK=V>CnF%DIE%wXkXL:ka+<Wc
%6Im!# <@6mX@1mXm!uL&=Hb6KFJN6jVZaNulmMlM?#<\By%JWQSTZJcb^>EV?aCT*?aBu*:F>59SKPZVtC!Ht:
Eb@/hM iC<Yw&&:/$45NFKR$=HwqcmHE%4RTR?De5KIL!nFayGnStQu#<i5!G&$JVk8>5=$JY4lNh8V<XD5jQlp
8^:lkb nCLF&RDwlS:R+kG?ue@$FQ?9@B1aqn5@881#Gi!!B^IjuYiS5qP@$l6q/yZ>8wnye/FcC?cE?//$uw9%
/Y#kEK ud9C\u5piS11<TwL!buBL1Al/j1Mu8pF%#\J$twtmwBcLma?kZRZIC5@h/D9@I5^/dQRp%>F&QdTbk?!
HA8YjT wT8yeG>a/+GVJkIA#Shn+4*mu9k44q!p6@cL>WEaBXTB9y/>hY%J<wyi6=&NG/Hi<$TXjJFyCX4qK@GL
>yQ!&/ !ESa6Vy*+EAjtHcEt/AD$GieNulmaIAZGlDk?tcb8I^+#GQHT>Veu5R4X^jWSj8mq$A&N:=Wa&aZnJqu
9pZXW: ycZ/L&++C9\XE=lK9VRV?jFQeDce%=qY&PKL+4<p^A!eVk/<DPZm?X$DmDlk^yuiMMtMmckVX<Z69yKI
QI<kd% L^\Znb==<eY?e/&6?<=F8dF+&p=Pk!WPkuL85A$R9+SCb<P$l^niL&L&X^KQ^d#R/\Y\\qnjkeN>=$+l
#>T??I DwVIaPIA/IpabFiE5V&PBJmVmk5Tc:!IH#=JNN4SKii86Mba%V#CME4H%TZuph%IdjVTSPlMV$#bwlW9
@qX/Se ^9q4cen^BXb+ey\hD1%58mC#&wVJN8i$8+yq5!y^ymh1^/yWlAHQmLm\e6iCQkn/DL5MeH/E8&bhETdt
ShRq%j $k1G1cW#PSKKm1np=SXR+Hqq4Vj8K6dD+DatQtLH:yJ!>5BZaQjAX&#6+mJp>^^RG?!GdbSn/jFQQPAb
aV&\N: IKQHNSpPL^^V^cNauJqBlI+A9LaH:5IcVmh%q9JC9SGwF$:%\G5yu@>CEuMDKWcnWBE+l$4w!Yuc%e8M
VAQ4ph #ZkN=LHd%w:eHNdQlBYjli8^X$C$>*up?H*S?JZYQn5&N^G:hmRGDCVPm@^?6W6cwtG5CF>9^pVYXDK\
u!5PI6 #JQ\EPY/e1Gdh8#?X5bN:8J\Q^Huj\YBSdnhIq\DwAVVBTc1XhPN=TS?8FALY4HJ4R^$5XdXW\FTSXX\
SdktQS nb@d!h8kwjAXwb/EE/LkEPnRRL*ZXZayIe$b5SiB@qklkT<C&RPD>5DW4?AN+TJC#QTnFYF%Iqu*CSPc
ubGhbD V!C\BSRY*hH=8JT8mILw5^qpV=N+ZY*mlG8elTe899LJ^hlcD^d:m15$S18M>jZ&\H>Gcwu:&pW@^dcp
NRLG%R BS$AISqKZAtFlilQiIqZL5c<F%@k*Phm\AY69TGXpQ^euVhA*C1:a>^hSu#Vj*$ilI8ciYP9iHn5<#bP
T%QF!! dYZICIjiTV4k4%$AL=5IB%/G$4?eNCJ=<VP^pB&4EJ1Fdk?$#ZZdAi=6/6u<njY&>1:V!WFIY:eH:wBZ
*aM6tl lbJGYZ/4wc:EalhjweAim*%!Eep/Qk6HyC*B!h?//M4c1G^ktp/ZEJG?lZkQBGdHaTtj<CK9IAJ5d<!L
G\6Lb& S:p%jE8&jNaX!XwYb?@1M4tHE<qn%=<XK^N?\a<SYdq!R8!+p@LC@RIieR/t@HPqKRQeCw+D4!CtSKFt
Qd9?+9 meRQwh/jiGK9IF?QZ*ZNaV5h:bqNtjV&ZdIJKYlKj:YL>R=C=yD?TkmPNHdSnyY5>aBk4Q5@J^diKSWC
J4BMpB QTH%EdL81!=h:I44lwY#=V>Cb^QB*Fl+I9bC:GI4FCZ8@cR^n@\pGAHXtJZd46\!Q5$X<+/DCNNYPCY^
!hy&*\ VJZA^YKQ^db@euFlLm=J&Ki!k/@k9\b8ThKBptt1:S?MqlkQRbjHQVSLD^L81/<pG1^IwXT@PjqEh9Y\
h5c5dV T6n%^kA6yI56F?DuVY4cPPWVi\#&+X*4<T/\>Kq!>+ZKPKuRZ!XypZ4ZX=G9VyNVYHPpC4MTRq!Nke>k
j/9hwn %ChI$&P8kwneGeDER6&XEGq@FYw=<Cy%Y/VEjk/RQCEik98?&AhTa/<<=pq59@lKuI*pa*1b$GZ1$@4A
jV:1hi 1*SmZi*e>&WNZ:J**5TB$:q&#\<@<j!\%jQDB$wmedYL1CjNTH+:>:jN4y!BAT6b$MY&pyCq=!Z$<%C6
uR$&jk $w89ZMRbebmWy>Hm:TFee4HpuAKBB11TEuHcGYAB8=m=n?8qlF/BbEH\=+uaD%8F&kl:Hmi#F#aTiXYR
P<H<jH 16$F4#u\qh!LApaX/i!k$KH+5VI+LdmlV^/LQicJL&ThV?4J8MAeNnh%KSh\Y1mYnW?HHDalmkFDN/:?
5y+l8G <BQ/n?JR$1q/RZ&+XNySF/bP145GYBT/JS=KJNtRSE:Dt8IHL4:1iRHjN?SR5aA@I$XK!F%j&RM=k$qn
>mKD5F wDV!M6IFkL>QcGt=MER:XuwXJ9!KJ::Y<>Zcll\>aWW1YjtTS6E8w9PM%XZ?KlRd!5*\1CjM!Dm>B/p4
&h9Sch ^P9F%!5Z+VZq*wyEWn8j#hAFAwFbTb1RlHYR!#IPddk*yMS:>aWj\88&Zq$+mV6Y?1ichy/b6VRBhNpu
VMBRZb B1&88&uAWp6nFb4K<<1bcDT^Fulk4RhP1>XL4bVX&64ePLiRBHRNm9&CYR#MWDbTLAY6K&^BIj!Li/Ap
JXiBI\ 5aT4FKaABHNG$!y$ejTukXiBPbP1n?H$6R4wQK$q#pcHu4Aii?^K^R559mH\8AyXTiJVY:5>w9hG+V5m
T?qThW !SPa?<<^NYBe<p<4&LRXlWY\W:pum9Vuw$wQ?&D\j?GDT1Qj%M1%!wl?X86J96yqa?/8$%?^$cj4VAX:
!MwLNB 91S<GA@>6#P5pu=cER/Fj++LNt1/%H:KLi$tZEVVQpBk@FT#6Iw8*yaS64SJH$c$!JW!@TP69PhN:W#F
MmAJaL S=YSN<6DPK8^RFidFFw6S84JDp*4T1cV&pi>t6=SNqCiQFMSj4M!48q@YluYptjLi4XQ!#?6$M@&tQyC
mhu6KB P@JkqLhRcN4bMpCkn*nVk/&X/q4Zt^>&uR%>Y1b@YuFNm*=c?Yqq=E@LRqy==LY!eLu$ipaY%CiF*4Pc
48<nX& >yGtMYuXALK:6HnZ&aG#<iTdehB:yi!MX9qt>E&8Ncb>GQt$+5$!M/Ly6EacBKTM&RG+85=Yhk*a8ABY
$=nhRj iQuK&R<@4amE!#@6Lj5w@qGq@tq=YI91u=byP4juiSPLLm$Nb<>YSD:><G\qd\iJDA=wA@l@>5QiK=k=
ER%8Cc ETq@M%!l/S?XSV1$8BcJ9\tGId68jaj>ptKMu$JFIqCWL6:V$GYDhM#>ASVtW/VW&piSem*!yyw:1d>b
uCVAw^ >qH=q>\9^6\KA<k>Ky@!9y?pXn/R^FY$ka@KAC\\N&Rj$e1V+Ntdbie%yA5XIR*BNML?YJlXGKFNK?j>
?8T^a% J^15EDK#6aG96K:ZeBqMF+q<XK/jLRjnRZFa$$FC>G!b@w+ibiu@=?LyQ<LH%<w%JFRjccW!><?^mm8S
-A@4?M 000f9354761001202b3 Page 25 of binaries1.zip
JL<cQ4 5Nc4k>ek+DTJQ1NFMDhaH>dD:$Sqdy4NGRkmCeatZ#$L>Vw@pL#T%ZZ6dEXT@?l5=F1Qjk&teR*KG?4X
/pS/k& pXP?iKV*uSAY9@DPmFNH^5nI/VNc@LS&6q!!Z*m$N>1::ElPHF::ykllmw+eI@\PN:y%yuAL+L:$et4y
quYGQG Na*%Dc&m*hb!kWT544\BeZ<=CZl6Xj9M$YN&6Ln9p&nmTFR@Eye:6cT*<4JYy86hH&pjRX%jVXTC/V%h
?dTe:n HiWjkthR$:QSbAWap^\wL#<V%5/H*?!N5w1<RPKF1ShAWyFIy/*NLkiuw<p8uJjAPYeTEBIeTaYiLI5t
MX@R$w P!6/#9SGnu^/qm%G<aW=aT!1Zyp$\9lH9C?44iI5wPcXAj$!Jn%jpdl&Qy!5TL:YY#pAl^G6PK?RRT!^
ZPuPJJ MI>BtVBZV@b1bRPei$IFjNnQ8&KZp%*lPLiQ>VC!<9HenE&iPSM/A>^:H1Dml:GFNGthZi!VIC+SnWaD
aMjHCd EeDc^Ya8QV?m+ppJeZD!d*9Cjenh<!:C>T<w=G=jlE&&E=KE^6iw+@BF!T/pPKDwXuGh54iK:QbKNNVV
CYT\y# S%#\!6yQQA%c^BBeX@b#TQZ$\EiqRAV6%5BWFyY=*^tZ*S>piRlewjN5$upMAiPFm:GFhGDehtSy@!cB
hRNSIt dS%cY%KqJbL<YyEC%iqkJ!5SREI>IeDmX##AjV>$qV6XbQG@y?&B&*/i@PkDTiaAl4y?4mCGc9&Am!qI
>eGBJu ApTF??!L?b@$4jX+GumjSNJW=Y?ipD^9hiY*K<Y/ujlYq=TBdT<Dpb/icDne=:q+EYB*wRKyW+ZbW1ZE
i*9X8m lG$K5DK4pGaA*klpJe8k=1@1IDkM5Gm@pwQ56TAmZhJtJI<m5L51iSc\NXE/E$AEhXcZXIJ^i8BMCJpd
?QQTc5 kl\!WI?4V4A*m^5JT8HuWuKVNI\LwHMWqbicLVP<TPk<&<Bmup@/pBhR6/Ae<:pNV/SKK=R!R>i4ERlc
c+Dd4$ ?w<TwmC<:55k4+eNiN!MSDK$IP!$A$kJ/:REX8I>S618h6&btuS*MjjZ8+D?n4A1S5RLW:amh&T*<HTp
*1RHlu FF>J>pZqbP5Nb:anE*l#L6Ebek*Ak/nk#MTCQJcSmCi=FhXP?DNk1!\M/a#$CpSMhnkM1F5hhjdul:=K
>cyI%b 5q%5RR/S+lVbKHcCPjQ65jTN!:WnE\pR1J\9//F#:P*8w8Bh+/X>Rt/YIaB/YYwM=XCHX%XVbmIEyd%b
luPN1# NYb$@VpyP\N*HYhlMKL@HtbP1:6Xhd54h+BI6jSq+lHy9+P^VE\K1EGPw%?Si:iTTTS&DRY5t5G9TVbB
/kGe&F ZS+WA\cu&=M@%^W46IThLI&whA^<nly\j:4GP>?jQ@*</Z@lui@@Qih@c#e@8HnFh/>@98!bq1e*ujni
X?Al:> q6?/J*:j::ku9llnm:@&yM6FZ@%Tp:Xp:+uui&<9:+uQbQ:4j>Z!iQ!nQ>L!ib\*V!6\Hyhb!FH+4wlH
y:VcTn nC@tEiNLiMV+Wl+^9p!8B1jK1&F<Ba@+yJJHnK@mEiQH<an^+&XYVb9AYVH?Jl+^jmKQ?M$pHnH?bl+^
>V!6n^ @lbbucbN=8w\@qaiMj+&HnH?hl+^ak1QGH?HWKFyh&cEb8$8HnF?Kw<aj#iQGH<Qn^l=4@N\$GtpF6>Q
Qk\KJB =^Hnb@CI<VN=^QlbQGL<dPGKy6%H48C:/q:=y>Z\HiN4ieV+PV^m@Djp6=y&Q*?L<ZW<+yP=QGL<QB+^
=K<qtq jn/QGF<9X>G$B*kXnQ<>HnH?RS:^t\aiMd/SS+^jILNy&pLPl9E8HnH?IS+^@y5<a5T*iMV+SdI1VX9M
!EnBCd XYH<6*uE/@h=^QkqQGL<Wl+^eyt5H94F%YQ<Cl:^&WwiMZ+Xn^n@HS+^@46Cycc6JyZ+:k>+^QmHieV+
te9pTP S*nE?Eh=^Ql@I>#R6D<pN#B?Da@+yPt@!n@N#ZiMZ<5n^n<tu&4cPu/K<i6=^Ql@!!N?+?ES+:$<a9#n
?Pnch8 e4ct@V8injFQ<In^*?MS+=@pETPcieV+DVILYMBbMH+nn^m@mWi<N9PI<X6+^Mm65lyNi+14\jl6QGL<
!+jw!w hl:^8^$<a9#VQGL<>&ZXt9aMX+*9h9KI<d6+^QnhQGL<Hl+^j1>Ry&u:TB*GQ<5nQutPS+#*<an^?*uE
=#p<JX ?AQCBdkiekHnD@KI<ah+^G@<j!V@6ADjMj/Q=ThN?^Q?lQE9<In^@==HnD@MI$aEieV+FnqL$@+D#<L+
16?Djm I#^m@I5<au\4n*m>^CNG@pC84tq@!16n@Q@FI<d@S^+^@n@^mDH@N+<a@$Nblcd>b/+C*@$bn^n@Z?cJ
5@?jP! yYkmQa#@e^+^@tXb4cd>N/+Y+%@lEb?<!mQGH?WS+%@nEiQ@8%Cqcj?DXGH<Z@CI<V@mEd<=^mQGH?eS
?5V4R= +%<Z/nZ6^/Ri+>@kEiQdiMV+hl+^wtPi@NM/=S%wni<aj+JHnH?VS+#@Ca<a@^cQiQ%WSt9c#=#uA=@p
bFZ+mp EiQj=lHnV@GI<i@\mLE@q/61&tqiFh?FiMV+M#^mjJlHnI@\mQHhM49e&m@<?RYQ?PShHnH?L*uE?F@!
FMKw?/ mQH9!Tw%:j@lKnH?jS+^@l!Q?M&9iMV+D*nE?B/lSy=ZIQ\=#!QGj<kn^9<Xn^n^Ea<a@&8lY9*6C%L!
8i:Y/l %#^m@N@\mQH!?H8M@=lHnL!EhJL@?8SQEYucJ/GRHC?*6ep^GySu:t6Z>8=Xj:Xw#Sw=^u>j@mcQ%u@Q
Hc&h$G QZL<hQ^+Pj/6y5pX@+=@+AnH##SN49k@NW&8iFZV=I1jc=ye<R6Np!6?1Yq!^c<$Vc++wGq!Sb$Z^SY9
D&&$Hc 1V?byCX+^BXq%dnmII?+Iy<C#T9?L^=^^j@NI/:+>##mm9<kj!%49DcWqH@c5QQuq$bC<p<ddbN@Ymww
bVX>pI @:V$Z9tuGY9pu&d?99#V4H9pu&cQq*>c=y>:J5*imqF*p>9n>@wDllj@:WBbMPAJ?D*y6Deh<Fn8cy?d
Cy^Ju% Z&qji4@Q9>@\Gj8NkM<IaHnADARDRTNwtl*H#aDjH@AdqnpnmI<>Ae@<19qXna$id>1de45>ca\Pt9^X
ePX$y$ $P!\k1bqQd5au@y=Fc@Z:@Wcl6j$?6Q?hD1AH>N4$&6>d4j<*=@i:>@9<^$%>l@%G^kiMDkyb#:iaRiL
1=ZSVL bTGGaRb6e#w8n$9Nc=\@9*GiF%N:QJndn/FacnCAX$eH@n@:udTR/\ES*pCASAhAK>ceD1VZi6^8SdA9
C?!*wX :jQ=jd+A9w+GRDiw\^YPp\be!D^?uI5^#IB6nkeQ5Cl@\P6yAMYaPYC:J*l\SaMeA5pBVG6%YM@iH8DE
pG&JG? @kAPyN$MyNQCb<#6>hn8Q$kJ^d/%cd>99=?#<<$AlVIDJ?+$P*lJ$<BmP9CFD<pT$6*kdeDMH6JCtnue
uZ*>a4 DlRaRW^5:Tu\WD+iP#A8VbK>tNcNkjn96h\bZ=YTMWTeDtBY9<@!b\KF=DRI6wQ##R=l8mE4\R>BVkDG
ji5qHS kXcQh^+q/E>:*AE1pVDI=Cnd&n8P1lAAZ\Qkw^>K=VHVp#F>it&Y!?D#@nV@k>>&?mE@>al5M$Sky5mN
1EmlSh <\4VA@LXVKZl^F=?E\BqZqEMIVk9CHL**5eXRc^4*ipAq8X&R/M<bLRd<kYZjV/<+VQPc1cZeXbRbtdX
@SVTJd yDMapDqJM6iA>ZlBLKRE\Zp>uA@j+CeIX%pB^kR6c><+Ku\AnA!5DcRl!:VHVyjAn4!i6bT5:dQhtZT?
#DFna* D+#HL<wDj1Y>tBN/FC\\k$yw>+6IaXa$MYG!I6j9^i?yb*/QYB>?\A1yZQ5$n?*Ne/j*B?#$PJkPmIX=
IJFLXB +VVPt:J<FR>nLY:c%%w@yGH:e\J?&<maN+6aVdt5%!@Vpj/kHel+:&*t?b\=+MZKA4SQCJJK+WnuiLBn
lPQDRy Z^XweZ9hIqN\N?Y&$*te%udjqZL:h1iWZqEFeDa%Q&CwyReDXnD9iNAAI<c=l/84@XkF^*kCAR?IKbCb
?Rb1Vt *Zd%yCB<k+i1JTiba98B+L=yeB^$WYtKN?XPy?cP#u%+4n8FXaBa*<M\ydT:&l+81S=%?#&GQ=%15qJX
4iCWA^ hEPB+:!KKEQK%mb=aE&cNwSyRY?ny%Ea*aSjhMkk9:k8#H&ectAE6yb=PTjt=4^&Pu@8EM/&6d!laZjK
6te\&h >PY/1+hTY9+wCJ&d%p1GS<p81JZjhCQuC>wh<MVDhpBL&>+mD@kGk8jbYytF8TlaYy\hLBVHGkl54<Km
WuLlp@ ^HwkVXDlhl6cGcdLeaM?*<QcWFw4HNL<+GmVKa6+eFlNB1idT5*FS/db&cENDYME/ZXVkd%?6#cpYbc+
$Zkn6! iaw^aIIlXmBn:6Z<b8BYeB%#kcPnGPbPniVkME\^+9w*Da*mBH?1G5:LTPMZ/hRIQ5+bNi*kZiSuW+45
tE?#6M \KRYncIDK*F:^FI<kdp&$6/daMS?tVPwGEML*q8quFmAVktimS#Jd\aQluGKd+J:GJeeyy4n8mb<PBSa
CGaImn 5#w!R#hyPdTSkD5%4<p>Ct4l/#y55:IVH/d>WAt/a8mRqtjbX6A&K5Y#HKhQC>Dc>^VR/KGP/T1j^?%6
R$4CMq An*W4VSb/d5%l=Nm#w=P#6qlt1plLcinw:Nn%NbKP%1CkSG5c:kGQ=WnyuYM%w!Cy4Tu&l1/hVnqDjJ1
5tm\%^ Xl!jD^hXt$1DknS84ZqZabDW?#%Y86#ndy^ZR++lEwG1\uTAhQm6n5qB=a9MRAwj+QyBL18#I%l6c^PG
J5aPe& ?Jjml5ntwGm8Q=%ncHqywVXnRe8$11FkRDHbbLSwD8\yNBGpwWyYP6@hMH<eyHG#N\nYcVtcEeDFlpAm
T>&Tb# @b:jkQEd^YuMAiKDEEG^%WFSD%WQt%wJ9C6WnRyqp$&nyXwA@ym$h5Bt!n4w?kMGPG\$k%bnd#:w<MM4
m%?G@! Xj4li8hZ#c9BWNA/%>I!J8khAZ5NGMSRSl5QTXJq\i>11y#XtYN4h<C:a!tkFT#AAj#A8<T*IJ&tN5um
qBJBQT B\AWua\X@ILHNAQj%<B1K%$EJeCpyDaDQc*A1ehNWDaK#kYGDK$a66NE?^$!6X^MdG5FDM5BMLppcGNG
iQLHW= LKjDkIV>BA>ky%B1c?NVHdcNKTY+G\kH#aGhYD>SW\B&Py@wB=Tc&8RlLSWRKa%Cmilu?IX#$tu6\b\l
$cY?^5 5>Q!W+L+qbEYPV6#BnFM1/a:ACi=Q4AjAec&1j/RWD=AT<B+Jk?k^Y?qJ*yTnbl^jk%GXqiQn5BlRG?l
>BIW@q ><NtJ\dupFG*RlAWa@XwVe4AQEE@j8nA<n%?/nM8nFqkZ!qD!*hL$NWtGDSpjDHYt%=l:J/Ja1Y$4<b=
:Y5QRC JJQ&#lWXGJk!CCcQB=<M^p=^BCdI!kFSeh9K/eSMN\e:+i4e@J*RPp!&BIb#LK$$BZiLNhDc:a+!^HGV
i9IyK4 eRcBF/Leq+6\lqmKh<@<t?jQG%eD$S8M8lKiTXmNcW4Il5Imkkq%udcXD$5NimH?nn!wl4l%PAtqbkJW
i=aXB> 1G1Au?CBSiq$<yyBiEMnH=/y&h^uy?<mWwAndylZNW:$X^CPequWHd<h8B$@WA*B+l!^%5=kT>Dd/KYH
amdNL9 dLGDh%L1kIAt!BMBRuqy%w+?ajJ^cRE/yMXWcGb*V6y6ywF9$>:=nZQuR+QL+LIRIIu&Au+566w&e8k$
qlhW&l <tC*ccG\E/jdnVu#GI+AYb4AXK#FFI$!5e!maDW=Vl:qYncW9M1ki/A*SADu^L55>=$AewRPeN!iJpY6
i&WP#e Q!DB&^?AC+VX4AdX+JIHQ:Vk<mC$EamdGn8pFB^?GCwQb^tA1hGlcW$$e@DA6nlGCW4ADj*m$%c1dC&S
WGjNPh MX!@B<+eXtmaJ8cDJ!IHA5N!YW9LH\1$pNT!nnm=/JujMG/i&>S!l6^WahkndR8KB^WikcMPKM<jEEQ\
?VB+ml GqckENM%+?9bccN#t>\yMXdkNM#bqHLV*\4<qIAdDKSG:PG<$ZpA<<E:aGbyClZ1&ABcG#$n\<Pn*mCR
-AHQ@L 0001684abb9001202b3 Page 26 of binaries1.zip
hnP*Kt nWTYhGY\I=Ac4S/8HyWE^:VVp#4BA+CPFPn$\M8aZ6GaQdiMnM=NAZn/BawlJ1e>ByE6LCnQ#^kAYKR%
Z9kqhe &%/<k4b*RuP\^SK$HYn\#J@udR+GwW+VP^FaeHqcPcM+nRC/nykSIQyq6PHucaa@WA6%&%6aM%KDpL:j
Khy?^K V6<HlaIBI$jkIFE%#E8ElcHB=mD++&%8l8+GP#B%LuGc6\B81CQacRe#Xp+el%JmnDRSKq^tB?KNPapi
aTH+pZ lWAJ+bRJCB\Akp=k#:&kq8kMhGJT9HuwZ\%DhN\9AN:VKNVKK/@S&?!%<W$y\#?!HK@k^F86F58TYIc4
a19iWm k=5CtIPC!/&P<X\@FRjbnFj$PLD4y4tQNLuhEG1V\wa\aH@cCyV+BYaRWq8NlR*#RYYn%&\5\KVRae8:
iA@una \KS&EJIA:Dh*BF5/uEnNQI%jjpPTERRD\$N/W6Ah?u@wldp#p/4DB$%#=:yHW$&n$Cu<$mMWP>N/wDn#
+c6LiR G/A?<?alY\QW>H:Lc#SYNDh/XVyqiETabbJ%pa%RWh66?!eHtAPC6RS%bChTX!d4kibub?EuEnucNLhy
5Jwa$% d11yKeXj8#$?!V/>R5t<?a*#kY4BaMJ1wZT?*ZkdqkG!JeAEtNARE^&ZwIywuZHjtjKpeBFtGnBW\+NJ
nQ1:uj tpBRRC+L6Z4&Ly>MDWJHt$dJ/TbtYeIRqa@buq6W@pDh<8Ap/JY*5cF^ZtPD*bn^*6M5PT1Vh#KHJAey
cB=t5> *ZTKetQPaHl6a#!b\IqIn^Bp:M&pm5EIh>M<VGp*VW1JnLFcu$j+#EHIy4$=AcT:qV!Hbm5?1uG?BYE*
pYu1L! i4*NMP4TRLM\pXNdkctRJtiTWkZuwmeCJ$p9#AN#::&JBRtQnHIL9TptAP+yu9$CyAukujTipqRI%:T>
1*yH&u ?b^+u6u+ACb8F5DkXXpj?Y4R/dtFRGa+!Da=5ei6$qpV<ku5K1PuInCGNNK&b%!c8b!Q11Y!KaD&mcLX
QH5LKN myteAC^wdy!HWDC@\aJ=$YIyA!dF^Hi*?\QpM:E&bTWw*A>TGY8>\A8G?Y#Gua<BhE5c*HC8j*@c>5%e
&mAA<a m$VhG%A8R%Fk+IJ?$RwYaZC6AKmeL^QdnWZjwwaFGd<LPA=TMYm6#E=BI<=nSadakR9A#GbP\L59p<y*
$@FA*p p#LdKBL1pKQd95q8ee:+<1nWHHCE?bIM<$kS^^PAmwQe<hS55D4wJZbmyRQAwbR1/cjN<1idaHAhW1nA
k&Y*#: 6KTb9t>9^q&JqdHPw%TT<&4Ib/iRYpht5A/TDGFShH+@$qekH@yP4>X+e$MnVd1bq\9Ty+1L>@16\G*M
#!PJy< *bAky@&t%YE/q6p5=Rbn4=&c=1b5la>?I:$j/c6:Q</XBE$bE&P?qc/k+W8M<6AaIB9EmJ^G4>&a:&&E
<b%k<n ihui&eV+mN%i1w9BqM4QTwDda$4XBwBG#ANc+6%dplLuTM>5y<9IG?wXQaiX%n^Y+FcyMEnhlQPu8V:q
qu\$#& 8IQRCFByN?b=9<Zbd^GcpSh:/AK<ctcQZHie=Hm$T1>a4#i\L<jhbKeKSijhH69htJbX5E:ADNW6AmDD
!6wACP Jd$um/XMB4j9JXwla=9FeaQXFl#J#Gd\mhp6NSwb6F<1c9lP+q8#TNlk@id:?VSd6=$T*W/qW/a:n+5\
TtlS=X *HqEXXbk58FjK<TtlYeWm1p1LHckEP^6dCc^GnVd>ld:mbD+bTNtV=Lk=pE!TRYBMwlGGu8KqK6\8/%W
Y9Nb1= JR+y?C4qN8k+<1YAbQ69a$EB/wWy<i5WdeM\qY>EY9+NV8!FD+FcN#SC!+XYZMM4@p+1mH=t5SLMIX:d
Rd4c%G 8>9!qbKh!uNmJm%q8iiwRJHcV!Mm^QFLbQKIK=5HB?wZi/AFC?C\t#Y\h@a<kV6RbR@LP@T:dn<5RBAE
PD&B:! $S5WCcdaDNH8#jl!u@Mhle$e6Z#q>FCKWFtBuTbWDiVCkhmBmV\@lVnbNJe<ypyBRuckXKIS!Y&AC!th
tCHRDl *!nSI?&qqqS/5EST/$=BJVm/pHaEnhySehS*%Ph:qY@<@\??cVCk@ed?AN:Vkj%$p@/$SGd!Z1!H4GL^
<!TbcW tBEiBEP15?alMM*HlG9yJqZIEZBI^eM<pq\&e<b6q1<M<##u#Qj1MAm&jdhlEj/n@9&?>H=PujaI5#$$
@aV@6E c/@6H?eXDIj\!t\pCG5^G/hlSp:Ic1!c#m6kXK1u+tmk8aHhGh>NS%@FVCVTwhD**NHudF?BjH5$#cq>
pl=E5l lw<!bRYGwkLF4H^Aqua\u#!Xkq+XQHMnME<DMAm4i5AYN$8plTyDk/k@RTuNiAN:d#:/uE\pp:/1=6!N
hkBwY8 k!ZT@ccc&ujW\Die&E64S&V\1\IicIRHDI1hNnQ\AP#Mt/?kn\AC&#$Sc\%IKWkX6CY5tN65Z:=e&Qdq
!IIDm= +j&=WW^uCu>=LDu1M**:JhVckZLBRJAXC:Q\jDu$\BLeEji>>#a$ny5*DlKXK1KHpCJNpNYlEm#wLNc%
H%?1e: JiQV$wa9e#TQW\+=<>m?WyJ*hD>aH9ASRkTejIX#BSDSM#AN?L:=eQi&h%!cKMhh%Vm@14FKbnje+&lL
YeD89e *PeIEE#VuY$yA=6aYMhd&9?d5cu8+qRGh^qpC1<TRbCY%T!ACc=>HuBLk?WhB#c:MR5*X8dQc@T5>h48
b#+^&4 ChR\uIBpRAXjyBq:9yqY>5%A\hqa=Gc>*d*Y6=d%@j*Rq9%HA=nXEGeRMGW#^=SK5Jm?F>:>Y%cnB4lE
/Aj584 $DkPnq@XNPal>Ta@dZiFn</4R/Kwq:YiQSXT*yZwSAhny:Y%LEc#LA#+9h>91D$N!!n$1%$e$:k=GPkR
mnVGQc +Mi5#E6%AcX\PLd*d1jWQ1?^c9++:mS=9dkKBMpC6Ct=AL\J*N/#>$l!!ySN*B4^FCGXZ<4:kdTQi#h&
WtZ=m\ +BGDXlu\T%dlbZ\QBy^/pSITATIlicP16ce>\M*#18cSb1<1uhJDTlEwIHYJ\K:dTTmD&lnNpnq/^TD5
&5qhKJ \E%?EaLEd5P96nH<6qEcNFk==?SiK=kuC8K>%$$*^<$TV<QN<$u^jC^pLeP^n:5=Ha^DF5L>5%NW@b>A
$&u?/t Lw8I!AAthbI>=91hh!unVXTdd5^cFJ?XjIMb:=*\i5%C1Xji\P8%XcS**nn?9BaT^lYq&11A*9h^VilC
hy=iak Bb^!+MqARI\*+B<NVQMHuLy?F6T!+GnKhkw*CwSa5P^?L+&eYF1SKqM&#wiXX5%4lJcp^RhmuS*bK?&h
PcGQ:B D9VYmCW%#9MEFMd$GIH4Z!16IkK<X#dEDNpXFApHHGw:k4JZ%e^yVjh$b<jL#<8Pt!h1qRde+8bR\Plk
@+ne&n w5=C>dM#+KJkaZDQZp@RM:buN#c^/BmFGjm8LIEqbNC4h8tpl5PJlhhRuhR<Jt&!=Rn%>E4SDJMH9Q5b
!Py?bT wbp4t$G@VP#jhX9A$!nY*iBXyZ48anpVy\LVShdWh4>5VEuBTQIE6V<aqAwFjd&:BPtkt\GVThAW$F5q
j@$N%& G:LeVNmjRpleT\@qIWV#Qn8L&:WN<!el*k16HkEnD5H$5tt9w>q&+Bbu8!wwJJ5B6YpGNbFwm6M<Vi/=
:N1M:5 h6Q6cYiuB<w/Z/dGJjd:XCHNNnLyQG/BQd5ZcZ8nSCN@5>RDuNC5<KLAPtdm+JFH<nyDHAhuqZjbmbZ+
S:njWV RW?LkD5//ua4HeFkn:hlHP%*9lh?B$kkLd8V%IBAiq<qDa+=8CGd8DCYt=W>iWWWCIkiInltC+Fc\Vt!
94B\8i :e!J%bbkS+eq#Gb>BiGFAE1!ekNtYp!cEZ!<j66ZAWkbTCM*ky9E%jaY19B5YPb+KaR\mMuMDN/Y?<G%
!TlZ?u 6G&cmWj&8&T#VYKC/VDcCtdL*IbWn\JTHECpN<4kL8G8kGJ<96h5Z%uAnaDXIaY$\G:dujE5Mb8Bl<Wb
IA8XHR 1EwZN&RFw#XJJePnynYcJTIHHDSAcZQiD4Z6c<LZ=<Dw@MYG$k?1SSH%c%#njATXWkwidyJ=!1:dt=l:
pYq+ZE PD8ey9IpNELJiM&=Yw4L!9M#kAh?#<#/J!1#CNemp@GBX$Ct&1=Z=ReCZw<ZbnT9$Y*+!6aKBtbN$G@5
=yI!T6 +nZL$%=^ChST9>hKb>\=1du&cEHN\/PnVZM6><%i1hw4DkjW^FSw8!Nn*eVepMpTbtXClm</tW!klI$C
C/CXiR DiNkwa&TGj15RCE4ZlD<up!1knSJy\FVBn@TAuitKVNcYnNTM$JndCIP95Wn!\?1QYPlqV\Gi!$:YCZ\
/?bL#h X>w\qH8*A*iRWH1nKmAuR8yHjD+/H=^B=8?>t%881TcXj\ebCd#+eZS$d5*I!Plw#h!HW*NN>>*e$+VV
XdW$\i X8\%%QTWKq5DP5SS&eG:PT8%kqtBIV!tj+at#@Q=H9E%8Z*:dbI4cec#Jb^%*mlX*k:embTLyctSpb41
E6R/QY pXGRP#4KnA/PV:ae1S>BWaAkjJNL>51lVuaHN&GCAejWMT&M#qBqK*1NiWCLQl@t<jtpCEW*c\V&qpt=
I4qDe4 XmwEjn<4XTYa5SwVk&J:d5a>mWWe6$^MAZQYF5#IIkP*eD6Mc=:CHKdyqTkp@SLPQn\:PBB<\YtR@LDQ
*q6N>I HelYqI^uq<m$KR<*@pYBS&y1lt8G1?hC8A>L+WnKZ&p*EkmyPZG@LZkeN5aKE&m%j5yc9B&eB4*mZuPK
en$Q^D DVCECF/q%HDQ!Al<dE=\?^DDC@*KZuaXMTWE^S=Tt+6=ni1<tlF*na*$hT%L8w9*M$%^1\%!XeKDFFuE
%Q&X^+ Jy<6t?lR+1Hy>eNNTRn$PIW<#@^Gak&*CTNTII4FDtM9M6eWN+Kl^dty$S1:84Cwy1lt6Aa/ZMcX4=W9
LTb+Dl #n=SCA\iF+ieyq?qEXlYypQ46IQ*mt@tV4hdhd4+^eq+Ti8<?WK5G@k5Z#llB=:NyG@!yMnlFAm64m:C
\F^@9? 4NWnI*N6y8^CdBM\NNCpLNa$uN%%\?%NTVeGN/#5nydn=H=RSaG$=JD\4\FS4Hun+DP<DEd+E6?dq1C#
GpwZGH X*Nd/WyR*FSVZVSeQV^eZVP1yuY#M&W=Epu&5KTN6AM<\NLnVKJ^CkWMm1uRCpE#^jA#&LJWJDXVAPkG
hC!@PN pI#Bqm>9LjQ?hD+BKlK<hBW<hT1hG1t8HkcQc$dtG8/:wWjTF5Qq?jh#=wDjDD4i^aC+%>1BE8+%IPb*
B!Fkp5 5A9yH6u=XDFV=qVpN4AZ!p%1kj&=A!KAJ:CZL4G$cSS#FpGL=#cBWumZ6cD$69*ZpTXRM*/R$1^$u6ny
N4ttZJ R9p=&Gq**AW*?dy!bM:EAl$<4L=C9QQu&h=<WPB#&\GEm4SwT*1ZtT=JNe$qyjCKkGVRaCe>&E?$+PQ?
1c=DYV C/P<FECQB&Rnu+m&MTm:<ATVCqEKiZ:BlYJBLHTD\X=qRAF1wV?\hu<cm4IQiAMtp4JH<?AuINSdW$:l
ADCS#X T?W@lpL9?<X6A#YZBMVL$b6ckVptqR1J8?tkT?/EiqkQqFa%hu%JSw*4?Z!\CcHYV*Lh$CtjSZ4hhIk\
K/Nq51 KN5>$!e6dYtCI<XnXj6S:5iBq?u>AW\<t?CG6MK$wGqTiYQ=^/P\N=EXEYwcYb*6K&huDm@lByMDi?>k
QZX1FI D5RiEPc>Wm@tF!:MdnImkD5EnGc4:$Fybp54?<ieudcbChahH^P8X:ZKeRnqnK!5Ai4yp%c%kFM6lZ&B
q%lI=L $j+J#Lp\6W</j?C<W!!nXwlIXTMZ/PZ&/14ZuHanu\H6*5@4B#8F#ca+b+Z6Deu\A$1j$$l@*W!KPC<d
@WLmcl <4!CMHHF*ZpaC6*N?P:&8@&IpL+Wbp::XD6b\EH6T1XjA%KTma*ZpAJV6&aHFc5^8ewdyQ:wWS$==DiV
IjWy%C V^bw>mQtF#qXh@#j>*5GM&#p&G!eT<teuF$AZZb*VZ#F@1P?w@5N>6uk9NiapD:kyij1=H>JByp>$GtR
Fw/i?: 9/4lCaT8ZW8#^W5&#9^WXM9IRVC1NhmJ!i=EVE9=yynwB@CSwVyy5mX/\&j/VIVwY$$Dc#n8E#WJPIwq
-A<k&h 00024b66765001202b3 Page 27 of binaries1.zip
Tw+5i/ 8<%BydABKi+CeMClibquE&hI=^cu>bnMF?B=>qZmJ>>SpM$GG$^6ycj:54tS!SA6yw8qHD%19Ba+V9l!
TltTI> %GeeFeMKNwDDbLKytuBWj5B<VDEbWRJ!*i@#$t5\KB6T@ld%&6j5N+:/Yi:!1+Z6l%hpTaW5XkW#IV9N
^Nil+^ X5&nek=Z+JNY%TD^pplZJlep!5aT1S+J!th<wtalBCmhMj\PjN^d+tilm>Pt#HTNiCk1&=nBtyIR?9cd
y!\KpS AqFip<wabM^j&5EK5$M5YBEMFHKQNGkK#bLhpBK\*M@tQKEZCIn:?5Fud$6DuEh>$1PIRW#!YdpSh&Yd
>i?tSl 8i^$CGRR?@&?@aye<MibG5p?t*KX=\k1I=cY^dSZw1A#6#SAatLdZ?clP%KJlQGM:d9>KK6G/SS<4=SR
GA?+a@ @A^?lq<qaJ\&k>h<thhRlWpw6ZT$5pW%1CcFX#EhVW\LLCIm<=lTGdLTSVRTD\#INLTP9ZPp&=b%G:cK
*%l<\4 anwTncAR<CuFE5i^Xy^dAD\?c9tKMc61$4VN!eGP+$/bRbZBlXkYGC^95Ttd\qKS1yINlaCTLV6wh?Z\
A?&9NW WwnAuJeK:iG<WqMaL@Qm+@%?b1%?e#>$d!b+#D%kM+C<K8nWN6V!9IyMKJKu\h6ki#QGBK>VDAwwXjbR
n$<\Ai eCR&+!5@T5nMEML5!*LjVqhq?LPPm45&yBRMll&^=t4:b/kcubmP>F+!G%YYy:aB*IkHZ8:#*m^STYCN
dCFBQL S@Z+RdnIBHhQyn4=^KaSpYVdNLW@4WwwtWAqQ&i*6XibL?88qu?<&t49pB1DXM9W@mED9b>Mhu6bPY@p
XqeReX %qhAFM5KqKupWnXI:<*+K>n6\I$wIQYt8am@6\t=np<tl<quYC:M:Kn6K#\16wCW8WwcGR!u/=44>M>W
a+/@dK lVc9#C8:Ik$NCukI+FI6\V^=:#*ma6ke=^/bP+LED?HRq*d1S1yAtnaDj&D+ZqN%dPqGN+JP8w8VniM1
?V:8Yj c#XWYh59HTwi%tAd=568kdiB!Fdk6IPe9ac=<*:DqKwIj6iEyGT86HRd&a$:ek/&DK5%FL*\WLd@RSb@
Hw@u\1 PXtH/na&VhX8:T#X1T%/$!B=Em5Lnh+GbeQyWht64XDFIHFGTL65>/!W#+EZCtH5y*:nHVQ/&PT6GM\y
dFFSWT dZPKVB4M68TwCm1bTcctdi>6LN$*#te%dK%uLZ6Y9huCw:t*&FS6&6!StY4I#ySj6V8R^wCS>p99QM$a
HHGkWt c:D<h\hWCaZaui*41y\VpHn9wh=:@Xc/Rq1tIYCpSMBY64jKR<5TT^KWa8#KtCYGYm?w5ANV@AFJCYHc
%%#a^5 ctI!YN&9<J4jb@6LXB5D9\!#tJ/J#YNTPlSdaVi<t=QVSZw>*K9\N1^%i$t8D&1Tl\8b?^yXJTdklBCJ
wGy=jE N^L6Bd5CCP#*T+*dwMI4mGjK>n4?&^$be:=1+&e4l/T9HtqVqS$<Iw&$/yh\T:dEut1%aN9ec=pXAWQy
i?+XiT w9l/&PD*cGGpph#%y**1VcItmR^KteeR!b11!#Y:a/@8PWl:jE!/&hkYYM5bbXaQwmBVG?M+:*B+8p1p
C4h&4J K!qqh9cMQ^Mwb8BNE?Kb/R^elN?^hT=adlC\#TL%w^G$nGL8dDMl>bnyTc1S#MP?aGpa==^i8pWkG<*e
PClK5B PWQhQ/BtM%Y98MLEuBJ+R>$55B?P!SAZEXBhjNI8d=9=yDSwG*ttdNC4ZWi@B4?SCa##EK6VlcYLA$8\
9!tL<Y nF!e8j9twPKTyM<By@hiiF^Cl/nRM@Iqj+X14/D+YN!&VHa?+iJtHyiJ1E$HqiQlnABMp=ZB!@+=h:yq
+ZCm\j Wu/#FkE\5HiG%FCQp%&1BMp=&VkJQ/M&=jEF:eDTDe^nVJLkKwLpnS>t+LBWZ<E%VFwk>=Nk:C$KNQqX
HF!u^X TpPF+5TGJ&&=<^GD*ithyeb^Yy*e9YMHbptiJaHE/=jPME:4T*FHRSwlktJkPME!e+P<!/bANNAEn^HQ
XEhbBX QCR%=T<%@PyLW5RTD:iID/jbZ8@PBhZju^mWp4^$ApnqYQC*da!VSZ1wTTumVb@jNm1WTV91B6Fw?KFA
W@>E^D %SyNj&/AYQR8%Sak@@*Thl5+dB#G?qP1Q<i>h+pIT5y4AYhQI8l<#%ApAJjRtbw4%lJW6kbKP=R@M^YX
c\p1NJ STy+I%VAhVpI#T>ImQhLAL!$G=k==iHG8Mj>>N$$FWNyp&wXp*5$1KBI&Yq$!IaASNTPQi9Je1?LpVbX
n:ey/$ L:yJA<8F\Xn?TS=P=DG!e>K\@X^Tcd9J&^uEiHa*GI=q!46EL\lacu^CKkbJ#Jjdcy#8NhNR&^Vt#RHq
d&c<PN JNm\bHlpd+HqQ>C1ITlN^wj+V\VPW\/#Y$q%:n^>S$Dkn!wQ5^>Pd6kJK1^GHenFKEYtM&NR?WE#B=:R
%m^GVn #BZjpB<kZ!&@qndESPEC@JQw\eHXu&A=y4SH!Zde4uKHSpN$!A=WGT4ePeqcAJQhRbHT+T4YK1iAk\1y
+PnaDu #dbbLnKXe1:HL$cKiR*Lu+eQ9L\dlpVu@+R$Y@/e6GhQ8cy>B>VP8GXPWue*BR&uqM*$CIbuG^PWD=IG
Li4wHq TKXMampmV$H#H8YENB^#8he8@J$pH1#>5CG^YFp69udQq41YGe#/Qwp*SqDSL&&C:ESp5KMX!n%wPAl*
dK+BQ% /ZYF%cbSLt+&LT>@RM&Q8ipKnh!jBE*<^NnmL=BJQW>QMd!P^VudTpHy+qh*awHnp@#T+8J%?6d+Q!nB
CK1wjQ KhPl\VtWBPRnd1/c@u\tX+GWTLTIXkw!MYE?^P4HqGS+aPjMwN\tqlY5wWkMZ6@mkeYpmpdbBXkm^mm/
cbW/^! C8ZyaIh6kTIWBm4Y+cGBFunEXA^@8iHAG+nT^MTFl94Nq5tPL^DHEuC&pKk8ylYaRCeI=<H:lbyNFVB6
T\=N*n KCqX\P+a:/AeqciLbWJ#Qj<kjC*D##<^j&LCSk/Dpq!a!9eupIbt&TtVDa*n5wN:p:J/Wk4ZQHhpqBkL
GVV@>4 #q$<D^ua$jFYS+jyCN+$m9%pJd<M5I>k*9JuIQd^aClPcaj/mDDc#eM:M&b>kK&wAZX>bZIK1#nlGj=k
bE!9Et Zw*5Fymt8wiRG&ue>DA4qQh^w1&Ka%BVAJVdcI46lutaQ85uJ4@F9Q#GNHbY5=*ChEBJhu>MNT?1i?QW
kd9S?4 nWinw&p9Bbtu<E^PB?a5iW9eLJh9Gew&m1WNn9yw?MpTeJVyF5n4\Lia8j$u64E#l!ujHPjPP&QM>Sub
SFjhy1 6u!yXKcdcpbG8hEYXMkH\jw6$qtk:9M#Ec!ymYu^:J!:m1pw&Cm!^by?A8B!&HBe^5+cMWqHWW&FYaZV
@ZMPQD +wCeaPX*n%VQHjWA\SwFypKa\CVnA519M%^JYS/8y<LnNE4A9+P#wB=?5BmW@pStl@5^@M@MW@jJPh9K
=?$KNk cm:DWBt8tZ%Qy?bYD>e$?hZ81AE/M^&F\qq/B\&5yX*Ad+8u^bZHe\=J^#l*P%iYhRL?:^h/qAPR#pJn
h8Nh*y 69A#KGXa!VcXS\y+WnW%%ZPXmVqS$?wwNAZJNF6GTeB^5YyKA?auER9AHySDlbV=!Q8&!XKSEwta&ca*
XeJC\t %S%mBt+NK4NH+qlhZhQEK1@IR%VY+4$dhN9?QMa6\$?aKhkHhFiqFaYCamlWIAj<e5j>!BK<!5<EHC?4
>d5>NR wydc#%b>yTcTe8+wyhl!TEAC1#VjMy&tB5R6Xm$<wn!i>Kkj%9+VBBFYLK^$8X<5^c?$cQe!Jkli^pi=
L@6CY/ p%Wbl?ueM^y\dIbb^El^he$wt*MXDPqRGE?RqkS?W<%tmd5yEqW%8Q%X!hDP@+jdPh^D::/>NAk1*KyS
$AC@<c %#KLqTpcWm<!e4ETcXtFG&8!1!hBhYVnY6K^DqQbMLTtYPY4pKJ!+:t\DR5VF94T^=DiyP%&?uMT84*P
Cca:@C pF8?GSCpDXEbw^Pa5$miZQdW%BSZ\#+<pFAP@WCJIFEB9:al+WtMeSRSk8:Nu$qukHakR#k=\jNR/Gj1
pyLXi6 5#jFPwBABSAnP=E+AXqEPkY61YblVeI\<C8u!e<GbR?w!leX5WXLM$b?8>LT9Qbn:jmRENjQTb@KtN<I
au>T4b !1$KA6PFtYwQ%aEDKtjk=1&HmnQ1>pJ96MMK6&I&?AP9Ie*CwC:6J?%kHu/Q&J?ZQ6a85&6?+e1PVKBC
h@%4dF ay&ZuYPCp!G&&wADARJP&CK>/XSNWZXNm1cp:5M*5lt8BHclDXG1>DD*1DF>i:8b<tek8FJDKTmW!Nk%
M<$<CF %^AjD9@5<bwPhuKRB8GM6LcwY#WXhTMal:D4SC^<t>9Mh@4RQDwc$GLtWFtRZPE>p^+9+qQ:/MkL8MA>
hTjCWR h#p=V:PW8qZd1eK5C48C/J6=!!%6a!+tJbYB\+yEk@i#GSPJnD%?8bPGi81HBdTD:HI+tMNm?Q=n@LqW
kI4F$j VW%iG*5iWZHRaM8Z^^SQ$N\w\E%6?VkNQL#>\8?84m/8um8h*51hNl6G5><RWC\Vi6LK^W%kGMa5l<*&
YuK1ha h4HFNBkNkSd=FYd&:/l\/8PWc1PH6@1wl6jyRTP4\K1@lJ9k<K$%w>K>4i/qBAhWnmhIn8\%dtLAb&TE
akwXSN @&b>&E@FFV@L/a^uc1R&I:L#il1>RTN:b:iDq/Z=+LlWtSAw:i1mGqbX<LQFCE$41bB<RH\+E*jDQ?+\
9&j+Zu I#>tRlCtqaC*@lLl1<l%%#ihDm*y1b@Q/yR^=q1N+Nk>@M/6LZN4118d9B=nVGGb6Je^$uK&6HmhY?pD
S@yWF6 ^MN\!tQ6JFZEdS!t%$iE*HqLRQZMT\LVPN?n/5&RwSY+XdY=TPp>INY6y84mGmAC5B@=PtPe%B#KTTnX
B1IVp+ !PNlRQVuEh9AFS&G:4RZ?N8Qman#DNE6#nqH>41eS\=+J5%9>w1B!K$d/tEFuFB64kRNN*jPPX1mI!$C
thC*Iy >5I\:e>+M8q<9<IjhHiA1SMQ$!DJbXF1Cc>EKV9Ht&4@!?<X9#C9paA<l$$Nh&VlS$B&upZEu1d1ty1t
CPCRP? IGIE=ipXR!&VtEZ?kXPYAJ:^l?ERKE1\X<mpI<^4J+mFQ>#iKA/QV?iR*h*=Xb/A!6>N<jTBdKFG9BGR
*WLTMA =Yl%pb86EnSST&/%yq9!!#+LmDC%\!t!$VDVLM9+yc=SjFmAAwd5YCCdC:^unh<$#&QHYGAM>mnRHk!c
>P%#Pl #4/XcNAIIwRpmjmj#\iR$Ny=m$X:8&BGcwq&&G:ZDIR\ykhEIb\aa6^T/yP6XC@^kB&a+=$*#6P5MHNR
uD8I<1 hSKK8b4Hud$1pAin>Ki>C9PMa11dwT?HmWwFC^9$Aj#yMB^jtpJXwNd!:*4CB$9!eQ?GD!JkW$&X%+F9
&B5&pi a?awh:P^dTHwy<P4bke*PCkIwFq<n9CJkS:V6VNBqpp^1&tK+NJCGuM/WG5<p@EXbQ6\M?^k<%VNu/ht
\J8&$K NFSqVVcJA6uhPMTTpb1WETTBeK/=J9eEAJtk1JQV*KMSR5&jeL:D!HLcD<6$G1jEMpa^=a/ML=h*n@99
>G/6Nj bJHLI#$<<=5qpR5+MbP/$uLeNmi$!G=CcuRp^XbDaYpKQ5e98VF5HBPS\<bl+:BKealYqXuAQqIk$?@j
Q51B8N <1BVWQj^Xu@iE?ebN+>NAXLtMS!:IHp6V9uT*#R*SWQuA^?aR*FHlk\>#Hw6@h9lWd46\=^KKkRk#Skl
SH8:<9 cRY1*G&ud@L:>u9YepPy16FR&=%BRI9d5:ppN^k:iZhpK6YWV5ut8MB\E:yaSZ<6jwbeXJk%jVn6eW\9
jalK8J F\GKJkK:j*4Y&M+IWCZ9B#G<=KY/XT9dtuheqSp!\ZHHRWAVRtVR+%HqD>8aRM5DFFXi$$?kD:58qemX
K\h>IZ XuiT?jMIDEbwD66K@E/h!:jj>yYpRKElFt<F!qSmLkYnFwCwF9P+Hd!NG$ky?F&QAQLD54&lw1!HQTKW
JL$icK wNp?nD#H<YZ6BMXEP*kbV=R/uR@:=h/8a4j1R!JG8$9FawihFB%*de*A/GnVcNypMSW+ma:$MHBcEY@I
-A/@6G 00030231f51001202b3 Page 28 of binaries1.zip
PVa<%Q bJRaAmPX^&\*lpqQe<d@+H:a#H=@Yt/baH>9wLG^&VE=/W$&n<6t>HGVt+iBaAwGu9LLdYTTN6&E1@*E
Qa?CGN FCAlSAm?JnwF\>1N9+hYQFtR+w$Zl8*Dpu\\&icAy>GVVRaDnqM&XXiB%AXVw!uGWnj<S!Z^4e44^c4y
MR^YVn yqkKT@5LXbRHWVtH@h<4e1h>jlLCVXp?EwnNSI%ilS8!lS4#n/EH^Yw11Lth!p?#tVqq*A^HebkSFhd4
=MRY6j h*dX&k?umdKq<DbIMlc!cYE@4k%GeRjb^$Di/GqYhYEXS6p=F\#\GR6tJ^<Apwd+^X8AKSMFGAmLHGLw
RLQkm! CpieKj/i<6mRTSi=8VN!%H@W<lXB1^p<9Xbkc4b5iV#w*M6Qa*Wj=/*Vw?uDAeKknHu#V>TXD>QZ5SMC
ZwIQJ! W#BPKkep48<*5N!68XS4H^ny8=>:+V=&/Jlin?SaRTj6w>X$Kqd=&dAGP@WHA&=\y8\ump9CIy9Jl*<<
Yc:Dmk >Fb6Zn4JyD@>D>Bl<HFn^q?WX8#ChPYBw#=y*jC1y^CX!&&aHiIPn5N1K8lp8Zc+BJbVnFKV9l9jMqcB
DcuG5P V%YHqb$I*PLZ*#P:kkd9+E=:^5i6Bh@h*M@!!h&tZ6WJ4+yaCt&I16qtYdAncKVTVh#Ee+Mweh#WZuE!
==lX=4 ?ai=C6Njy1bTpJJ5VQu#n>GCu&R6C$/H#:$!>uQj=L/$IVjM1L&YRFAF^hjl=5DDFqJw$AGuYNE!nQF\
HcTpth A1VMhQJ9CanWlB^tXwQ$*IbuGy$dK@/?:K$1$ynC&&NX6W#!a>55bLkRJ%jKjc5WJWWEW*mapB6ZlwkK
LA=Wai mEjJ4$#/j$5Y6c%ejCedu!kSK*CdL?%$X1uKLXd9Da=hiTKjKRNVVKXkhP!KFD^LIJ\tW5tuVnmKSlCS
SQj%:Z 1@LF>LCV@Y/c^6%bQqQKI^9QAi+/Tq8Jtw?XQ&+$tyNE6X5/k^$\wDVhb!CIGT\ElkKRA%eDl*da$diW
LSKky9 #EQGDdE&R$X+cld*bH$?6qSJ*%p/eNV9#yKXVb5Rjhm>qh@CI1uhWa\pPCY&bw6D<%MSCQwkGM/WXtDF
jCe\A4 GJ68GC#M<S9de6J4dX>P&ti:y/ipB^FW5RjSHC55Hqi6T<iF4M+P&!wN+n1anX+cANC9MmLn5AC!NJN=
AtJQA4 W#maq%Y=6EQc5V@KyPqBy/dedy>H6uh>jQM/iEWqbB&!?&S*YFbqS<BE@QG\AM?\a@w4VE@cVB>8h\yd
$jKk%I np9Iy9h@L>X&#hmRV@/qLN<K6:46nb8%/eDadS%1+>*Sc^\:+4bqtS/mBk@:EA&XTRdM%Cm4LajVnm4R
i$/Xa@ $@&D/LlN>S5jRMl??PHuSL*XE<=5Z<cwh*a%%XMTFN@APZb?<?E4!DeBlk!BJCJKX6tcDy6&i8Ka/@Hj
$D+$Qm +Id?6%VSnR&F@4X<tNpnlm<u%YTudua:4HN8?tGRc^HMqit<5+QQn?t$k1t=w&q+\:SHcldMucCP@5MC
jkHtyk !%XpKHTe$j@!=^\CXX98TTQ!:E:=lKmWP@ZI/MPnVc1^*+G^DHAFdJMMRlZ8BiM/8JQyu69p!dcdM/Wi
hp4/tt HZXu!*L5Ppyuub=MqYeekq<6C4CSe4j:ae8ZeYhTp=6Te^>&?<i&R1VVYHnHTteqhF#/!NQ8/y1=hBuq
<ntPX+ lt4hbG$hi8mpYQVt6mn=d=Vh?4eZy6i!kjE=^I6Zdh<6MPFH&BW1><QL^46A^$:LjBAc$eJH:/lHdmA:
>aN*%M DVyhXi4Bi/QXR@QT/c>LS**:D\kS?PaaqPcQ:QTw*QC*pLem?6Jib&>RAG1LKEPu85$CFFq<pw=#^\jV
qPwbFt X>tB<dl#lt9MhJ=j*NINbyRTmTt1N8i6VcjZYn=6F$kTadq>KZual/lEWDblLdPw^bDY\\:d9qe%LV66
j<#XH: iRw:e?iwb4nIe+Pwm6Q?4/9E^9!$l#&%96!ndKF1IE%PB!DY:LV=hSI%WMGqT^t^kt4@^/deGMam9d8y
eBP>C% KMjDqn6uH8e\LF8CGTMZFQ%SkWe/Qm%j*m+j&@@8Tw<>i%K1^EB\uY4>HVSa/Lhb\mjV1ei%&aEThq==
Wy=Li# cwccmHm#hiE^Rj$9MP+R=LM#Z#dykZ&j+%c$*QjK8=m#6@$Vb6utjBD%ikhEBccSd^$6CuE^>#+8D$TE
ThdMI$ u\BSNb/^/9N%h=S&AJH6L#lEQ*Jw?+R$Y@DwIZa:>>N!$kpmLIZ\qXSMRZh1^p/Id&KL+*yXy^9e<>41
k1TS9j I6=5tiYm9A/qyZcLd/EdmP*NlV+Qu+IIX9I?:dVQhVV6*G+q6&bAAeqK!X>++\&W5AWEHk?P1V6ql5lV
bL/:u& W>SE?ll<M+=qcYK?wGy*Kb9<jY9b@R66Z/d8YV:1q@6dA$:4nP1$=V\k1XQckAVCbJ9+=Ea@&a$d4kpI
ZiD?QF IPKNHnRtJVqL+wl&!JJ>C@#@jmbh9Ndupah&k4#Tw?tn^?l>=d/hCkYRGP>=G+VN4w&PP#1FZ11w$:K9
JQSdTb /nt<Pd!t!GPt!<he$&@L:lmu*Fac&E@b!WMiVX@PWjn+@DS9GLEDD:DYR>@Ph<#RIqTcuRwAIPHkT6SG
6cl5Kb y?4\clyi1?1GJe/pl^mTqR*pWXYipRb/*8YBcjLaK1tCe@w&&c&VG=kMl1!kmK5DP6Lbabt*16=mb:?B
Euda>F !T4^mZ@6<F!9tc//dkbC+!HVu*PMXSLnYQ9la@/>Gy<!J9h15c$/*??VB*SY?eYbAPlKp#dbPSN!/#R6
SC9d*R Q1>LtWPL$/E9%V@&D@AYtNEcGLwGPXae+u!H@GP!lFe?bQ5LD^p5S^p:M8u:@ZLdRD1\q5>kqiaFpRH9
>=Q$9q HnGcDSYicRK<C/?V#:Wk1ZTbj\\H*iHW!XZ*8L5IyPd//VL#PN$w%EcBPYRqFuK84dc9jD<6lj&t/mGp
SThiQa w6aIQwWKW9H1\aDInwLE9JRpALCalh\j:ueiD?Iih95>lQPqa@FA?YnYS?#&y#K?IymCNKdD$!CTKu5F
NtbbZI l<i4$Nd^^=L#Kk#TpYQCV&e/dqbh/WdY*Nu*:1&yAYGcdKpyBKiycj*$LeeA8Zdp!F*$^MGGD%pp+#da
^mRbQ6 EClXD%h%k66pQnwKbLX$hBA=Wu+6$6kK/XjIE&%E\>^F:wDyXP*AH?El*CbN5QAaJPe@%4/L$T$@4j4>
&1/B&$ m+@!G<=wB!a=?^bPSBQWk/p5iY:WFFZT+?%J^>Y6&R4+RZGG*hCat@%P$jeGl91q9JbnHLKN#WJpdpwC
ec%?c9 $eN#*cw^SHX6MK^&$uZt6AA&Vk?KCZJ8Bw&kNIeGA/1*lqQ/A#X#*iByEc$QKwpwSM%$I88^QR*MJ%Q!
b:I\d1 eF!1bXNNnh!AFHCTbGXya8BpwkYt5ktdESBIyXKi=1kMMCD*b8i==/aC!mK!!aZEmVSaY+J=DaQ@@d8L
*<jlL1 /Kul!a/c98Z8tl1@Ey:#BK^5l*iu\8CPGJ%eMNkyEWL&D?WSbLI6ZwQa=KH466PV^R\QZWe8^@AVqch>
uKc8B> S<bZIE*uLPb+QhJBD<$^5q6=jEbype\Bw#M/dlF*^/T/$*p1q*wcpt\+FkK/#B6%k>beXy?#8CZjRWcM
8k:!4= G8&:mw/19tSI9q4%c1qe#XT*qmGHSmSChELEhX!yekJR+D?YQT4Xn=!>L*\iu!5m&P<RQKb@wymF@=kK
h>juqd mwj<^<Dd>9d661<m:XWN<c4ZZ@ce%LMiyGInV^!G4kSkm*qkc/hl*lJ$eJK/>hY9FJd*DdtBIJD>PJRh
luYiLH Ek#NEA^hAw*6:j9Y?NL!LC!@5^WWhNwMXhNCWIBST+jKCZnHWcinTy*Kwb41^u19NP14Bcjhe>%<hE@1
6^Fhjh WD44WnF@8ZBYSI9e!t:jc*t@+S>D/wdVS^B$<BMLP!yWCTAWNGnK@V>#JGkG5*5*$t/u?J8iB\DkVVqd
F*ZNX? d=kyjT\:e^w/hM^@1L*>tQF5^qQ5#V+T\DcZniZjVn8iClRt!i5W:>QlSI>PiXh*mHmhi^Kei+%J5b*Y
eRnc*: tt!a/bl:4cJM1ecHbI@VMQcWB4\Pa$*DC9#dwJPJP:BSN4+/YqVZJ@!R$N@yQE9!8N^Q:9SiG&M*D$Gu
CS5RA< &JKbG8P#Q@8NCR>weH9K9*j&&NQMuGbaFiSX8=Eku^cBIIklXpehABaS!QGY+=%!#+SwqhA46&c1ELc&
yDeKq? !i$Y9XKiwi^/+GVR6N6#ac@:uqA6N%:D!P=?P^9m&ahw6<ldl\1aHeG5D%aq=PP1thpai<cXVI*W#TQ%
Ee=&Z8 KlYm/Qh#n*FP&m>mGaKp<i!hyuNZ4y4K/ehVNaKAIPdeVmpck&K:w=Bmql4XN+NbF/#/b5c+nLi$8+cN
t>d=yT bw=&HZKK@ykc1uYIdId%Hu9&H9ZEl#Ghh1T4GuS+=SbCp=6cTHGLE4GV%$P*G\XqG1yII&nGXH4Nt&^V
:djMH# tQyR&qGuNFHJMcXaSn6D/%/%m&Kca!$Hp6QLFubRiYSHpW$tCVBwbeB=eq6h<B8Pe9p>a:j<MR?cq:=P
IePABG 5y4=pJT%cL@=jwcCb@htJTP*ID4FlG^H8GyWSHwq/ESRWchn%DS4iil%<G85h4mZu88qpFQZ<%iEASnS
X+jb>= IhqKFqi=h&4A8dqAEY\/uanPM^nXn5=TTi$/=cpIa5JmW$EaE>G%ikcKN?8jVbW*<@q#wJt&T#EjI>%t
^G*Q1@ i=H^I\N^+bD^:K*P<KDV*GW+m8%qaFtY9dFd:mb*mKdHd5GWc69PDGd9y:q?D^G^#N!A?\cK^YGDWB5#
yc9kJ5 ?#u9Mj@8P^WEMR!uZ8P+D&qeXlw<V9pMpdH+K/nXdJG:dCcMQiFTYdInch:EuSL>59&XXDGJ9jCX:j+j
@mtPc> Gec?PYMhu5:#lw#4P\u1ebjCa/PVdA+T=Pe^/61t1!Ya9c6NAN9ak%mWlHuDQDJBM6tBWaewa8Qa+WPH
>ub?5? nEM@<n<:&:#?/Jdk>h$/a/#$4!IS5$?:+^6ty$I%WC:G=C#IMAV4*@B+FkNlAn+#SWA>/bCEmLR+cPn#
=n>uLA Md<Wt=>hGSk#IwYpk6pu!KnT!P51TMlVmD8DVy=9KwS#QTqXhTlB+myYiN&nHk@9q/</yC1CQ\K9&=q#
Xijjt< R>w\J6BewKbCwA6MhDw\uIb6l>Y&YeV$6MP!RQTKq4G/wIyca+:Lu?&6hGTetmh>?\=1FZ^%4Q*RMcwX
tCnGIu TQ+SHMnha<?9Mai$pdT/nW9hAiQeqAu>1t#y5P^+l>WmjYD+\c\t%Z?58nt>ln@:&A<n&@mZHy$uj:GD
8NAb=> M^?#pKkhk+VVLKphpk4H:4I^>RwEl!#6y8wW=&^Y8*51P?=piXW>S^l4tNjmAK$PFej<ARi:1NnKEqb\
Z/eV^T LRI!&?>F1$DlMe5wP$V=mm*=D*&@ZIWI^cElW*55FdlidwWRZ+iQ/LR5G&^Y!X!u1JckLM+4V#^W>#=u
9HKHET YS\WI&beXL/TD5#jbnnF5Ge1^@yyPMWRTK%Mb&5+LjLAGN9M/+n#Ah=qHZSWHjIyDHkPm#knY51=E!>4
\uTFhS SIc5Q?AhdbKH^+kFDTQ>MT#\P6eVTP<iN<aYS4=liSV@LjnPM%1Vwpb%$t/yT#aJ:emnDq9eTpXEGHh<
CFXbea tDM1ZPjwW5c+t^F+ZpwiCWe*yR*=D*NVYl:>JH@p\:?uQH9QK:W^det5SN^%@A5BjBA^TCN4/bR:XMYQ
MbWW41 EqW:PMEl#c%8?%Y&a^6*PYdk+eNk$tyiVbMdk+X54^*I^h#k:^m/MALDjC^#<bA&4LwaLK%m%HS1ju!A
t5H#Yb jM4Y16L<aJmQ&R+Gt@mAb1%!YJ/eDYyHNWk&bYq=\:^jRK9\n&1nAW*np?8$uBE4pC9N@48K51Lk5<^B
yB$LiD bi+Rcc$aqXy/5Bw@VR?&&B%LdM5Aw:SS#NdTGb!8RW8HtE<Mc+\%ttd\Yi1+>yAYMPd!V\1Mc5Myh\%?
MC*L@t %LT=JwpNXG9XXpADjd9KbIhXNdREWqwy/Et4it&V4YZMA5XdY%9b!ehet&b/cBSTH6Xk$eQpdaDQ1W>y
-A/8bY 000e16cb059001202b3 Page 29 of binaries1.zip
X&uce= FC/jiM&uyIM14MT6ceQ<e^hD8F+K1%B*n\1J?\wh>AR=twZ!4HkNjQqD@tECeR=8jNelV@Zw$IbTWF9?
dKldMP FaAS4RtY=NbGVXCckqTHNR?jtR$&k=$!8^HW6BwQb1+PiQmHnd\ieDBR1HyEIht>=YyjS>wXccj@Vy=6
Knc9wq Zm*KBj8w^9KBHEE\9wHXcDptbPw&W$&nYw%<!%BD+R$Qc+HWpD8a+yy=pY1w$XDK>QMJ/Y:TLE>8Del#
!kC/iM bkN:H%T8X>ZC?h^@nXLX1mGcIdwqW1mq!i5P@pGCwEqYk<1PGu9$>%JBE5\uQpEBl>IyLVWM<dyF^qnV
a=qIpn 5B5KLAEBdB@Xm8ZBGQSmXtB999k>Qpmjct>4SWN8MV/w5&$?HDD=SHp?=At<IqCH&ubYR+Ph*Z\^YR#Y
ildME^ W4m?X5&HyINI8uK\PbYYy=B:$$QcYmnhKP<9qL@+EhCMjSW1!DlaBqyeQ!wmq!iuB!RB^HjD/4H6>E^<
p8ym=J %H1Kd%IFE6XCpK?&6XLP4\%n?bytBVLcqJRdqGQm6Fi$dEn#!eQY?EDaRGDj#YPh<8LN1X4mlT&R45L1
HY^m:F 1K%>y!bwBjtwimZlVp&d:n\WaXkd=ZC5BMi=MBhbM=>84k$FQCqliS4W?kL8Gt%I:q+G\Vuy\L=Ky^Lw
<cG?qR \A8+lHG!mlE8kV$a\R/*yc*kqB1>Q9niGjRQ\aYq1mGpWZC$Ym!HlY:cqMpjqG>K#/N!i:^46b!$t*?+
VD&=1M w#4k^dS=yH4jlC^$W5<qkNaMXX9tdaFWhR&$p!V#n&kMNZWES$hbPlphbcaTGLYHC=wIY9HNQCnQKEp%
iAVabM S&8Wc^+h#luqE6#Xw@I+aj/^Bh>?>!m4Rj5^:j=Ai6<>kdHdIdM#c^:XEGtPRDbWIE8:bbkS#!th!E+J
YVwwM$ T=uHYacwX<@dWFHI/Yb&iw=NV=QH:*G9>i#udhNy=:=k5cuA969N/!tJiwaG8KhMm+@NH\>:We@wF<#c
?+Z>%I KaZmKpq@BW!yqMw&9yGFu>pdPhSq?hRnQ9nHd?^Q:\i%INY:Z^c\6$^Wi5^J=@LPHK*MH=SWDJw+=Di%
\EXGqi S+bkTWH*5PVcYp+%W=cHl&6GGKnFc^l!=CP$6DR:<FIcu?A*VD6P4*X4%eM?u+#\i:%Pi>TiP:I*C/m>
$J@N#i IK=ZE#<6=L8#pYLXEJk:uQIAP\iGS19=8>H1/lGcIH\p:eAeX5SCVq^PP5Y/mF>LAV\*DhjI\/i%/t4=
hPG8qy I$ctj?ihYeRZXJ6+YC#@#MXRT6$<unK%FVVN#w:l$SH?na$PAJXSlq/@Q+e1wcYcFLpy:m\dGl>:PD^T
LhP4$X A<>tBhN#=<yjLpw%<Y:iXK4JpJL4*uHbuC9:B>DA=/JSC6Q#8tpHe>&M4A<nJQmBt\L<p^D8qQVW!HM4
iuyd/5 A?^S<KmmWW4h:<tu4W9DjkhEY\M+=ZcQ56uI*=SK5adMT8A^@:/yD4cSJ\CyG+6EGWdk4NN@DCRB6@H6
yRH!Ec IcXTuRK98K$D=YIF#ctVGhe*&c>uGbK^BRNMV@l+mLVF@iBDkMm1<9q5YhBSbhXTe%Q&SkKXhLKTMJyn
&Jlk>9 c><I11JCl*1Ym8tpThtuwQkqEVP#N\@!PZqtymMVLIIBk?V>9BjZd/jLnmHuBF\qdn&&i$/&yPEWQA*%
cZ4/%C %$>Wq1$&hWabELkl\BVdMB5:uajHtNpc6qMR+c*j/m@AaS!V+aB:Ll<89Zc@%M1A#u>pGZp@\njQVuet
!*XHQJ XB$CA9QqtVqB&dYX4TyE?tG:w%Ra#htbhZ=DQWLXMhl5B1V?ZJ#A+A:=P*Ea+q:d^N%l&aI=JkZtH+ta
wt$it^ u=&5/5uGDa@\hCwMN9ecyRLdMcyXh#1dY5VK*&=BX1bTMJZwil^@acnHw%IP<t^GTm!XYm8Qa%W%YEMK
mY8\kl 5AcT5u$b\FW:MNN$H5h1bG>#NFt@MSXe:#Vuyn4w4VwB*B@1DKwHd&RjJ&le#:@WHZ1<Q%111JR/d\aP
!Cb<H4 8AN4CcF@BHIQ&Wdiwjc$<i!hWu!Xi+=E4=Xh1ZR*KEq%D9?$^ePha$XJFqQM%>XY1Hqhw:Ml6WNyun^j
8ZEeYb tLWR>%!9@BEDu^TQtHMm/\Vd>@Bb>\E?En@jXI1hMc#AGqcebY5WkKjV1Sy%1l%KXdmV=$?bVkuITVdW
b&=I:1 \^qB4cWTS#/CDbce*m>@:pIXwXuR^&9QBPj=EKbV8!HX6qE8?d6V!\ncHiXBXVeK!9!&PcXFH5mp!QX<
=RNidF #bKDJ5BkkXR6n>9BM5A8Q8Ci<WD&>LmX1B*dh/8nVq=Xdja/tmYQKVX9pi++qt\/%Pbwy:LkF555Xdjh
ThpmRj P5</tJbhNhnNB&AiH@8CPc&X9&VwV*66/jQJq!4@*mqPA$#YkX^*Qm4B9keT+>?8wZFpJ&et&Kti4PI<
m5hHha YQct5j681ZWhEmiQ</p?yAZie4>ddkAP=Atb!D@*L5/mDchEtG*Va!S$mkjKd:Sp6&tpnNIln<6^KuN&
@9AlDI wQ1GIw=a4&4hEI4><%J4QjLaRtWGVN:<i!ab/9qD&a1#w/S&5Nk^yE/RP!<w@w1XnM/5bl%*N4?>YX5K
\1VlDJ P8Wt$*q\EXJW&jJA!k$AIM@5=6?wMjuMtN$\aQQt/*jVnh*t\w+YA^q8B>K!A8YTLYmV\?8k+w##mCZq
eD4ILV y?B4bwkuM/?Lq*>DMc&i>BlWyTdb^>:H9iud#i!Nq%/qaiy98#u:Rl%qIFN6w:VRtt>Zt>Jbal&^iAYk
S\V!9e IZyY1V%!bWZ!mGS*4yidq?Z?kKyV!!&ai&=*IF$\i<ib?pth!5aV6nM+=h@q\tmuX1WiEZT>=85</!Zk
k\K<K9 *IWnjcL<t#$ndy>Z>TAih#\C9y:h=t^kbB@YMQb*WGXn1IW%p/DWtyXpuVIbw+TnW>t@ccF8!FFSWtbX
/M@LXV VPE$:4pi?SMpaDYj</tK6Q!:5X?t9$#@H@:4>Z@PQ@y:/De*uJ9*6d>kQ\=jiX1B>q9@99cZc:>%6Znh
M*a&mY Y$%Q4*=p=b^F9c+PX$6DT<Nt!:ZyJqjR6cq?Yj&!8tZ+45*X%6CP>^=Z#/I&%+>hdT5?YF1/6H4y%1Xd
+8J?cF :eZdCyb8Zd#6wXWQqV=R@WC%Ndh$Z8%ZM?/4@Ryj9<IZ*89i1G?yc/udZLiyduu65qyeE?<#b<?aZnm>
CpL=:! eP4u$&jYL1@j*NBYj\Tnn6T64J$%>e9b^hPLcthl=QL/+KK&Sd>c<<d&pte&<:Zl@R*94*qnBV=d<aG>
SwIcpp e5/EJheYJX^6e6&b9Kaeq>ZNuF+$?aZJL<\84MX^a9MZ5%dPYbEWC66IaeNtWBX$6iC%EZS8c6kIPniS
ZMK8I5 R6AJKq%6wBN#LGwVP16Jajd%$K1qY$tyPdh$A8n5EYy@ycm6i+N$bqjBhjA:i*4l^PqF$&jWd1^41h>e
19N:j\ V$=51X$^8&S/ETkFuXn>#LyNDT&Lj4ZpuLjE*q=!?+d*9TYppuR88ddp&5w=jG>wB\iZ#XdZuqpuuK!d
PY9\RL Ni*#!T>MPV:6<!uHJ@/wj#\w:GlwB#i*kM1Y?p*%yQLH4tB>pFVYm#R6X$<ycX*$K@^PJ+Y4:%QWRb1F
?5m\HX T:e?6My%nSVPLSW11/@VS#uYd1=hlqYV%#MXldMl^&tjV@%<>k!5dSQY8BqjK$DXCqI+>R9TmQYCT1\B
b@e:tn QIj5&4\qG>/*%:!S8/LNBd16JhjGL$w5!54^PuZL/#HZqPPWJil4@uSCR%5D6ZF4\^8kMRkc**D>8Q+D
q8D\JT @QRG1APFw1P>wLBwpel9^Rik4Z4qc1HNwSK/8p4SS\4uq6d&<D8<q>j&%QiC!mPkeydwW=F\i&dhWu^Z
yVMTK% PP$16LX\Nqi&CZR8J=&%!&6u&XP@KK$FS!DJbdZL/=blHhT9qlXBc<$dE!FF/N1m6whKKWQ1X9%t5RBF
*9GLV9 =ZJTTd1ujY=NjpEjS?L\ikPM\n6IjKQluE69PCjjd!S^689cBGYKm<RMKMBHX>MaG%>TL!4y+61HT8$H
NlMe*j 1m5jELPeY%=@nc@/ZlDa$$A^L5jZM46&=wLcySDm#Nwb$#/jS9Kw9M8l1lVpCw/cZVV%m!uHy^hS/BTn
@Hn9LG Ew8wWk6XhM$dTqZFuGk&9T5?\BG8BG\TBXHuKGIy#wp@wqH1yT:T&IKSd!#/Fin:AFTii/DWdunnP:kC
MERTLZ DH6S4:^/lha^abK?/=SiX>j/c*\%JB/wdpn\1KmF!t/B8bHcYdZKMKqkM!DP>/b>VmY8&\l1q+9mk8K/
Huk@Mc VdPLy*+^Fd\Rc4F?CHSb\*K+l$&8+I1k9cK6cAYPLklbnA6T5F%6qVSNWhqNTuFJhi*!/aYphGJ#wtTS
59VPcV KD4hJ^Saj/kW:lKWu56bC4Y\F!W&PLSTw8JicbI4*%S$N4/$<p%IhJ94Gtq%/R>WL$w54u&kG6?DVliW
QZA4tC F5/V:lN$KypJqW18MM%yX?EI/Za*Kmw^clNXq=KqihbBeWtqC%R8&clWq/<q=$AyJRtHCjPCEp5A\Cia
\#t9qS C#\Vtl&=K5=P@Z^m<?RZ95ybRc+5?6Zpl$yJc<P=l$44#@G:S%e94q&WwC6YpmXHMA9pTlMq6ZdnT@PW
ew*RE6 ZEqh@VZ%Dmh@4cEVWt%9/CC6hbV1C6JRS:uTqKDBMNnCYi?B%ypm!+$mC?YR1MiRK/T/9F+CG!t%XkV9
Bdjw&! yHqC5?Vh6d!8CL>DRFB!yVdZB$tuepnC\=t%E5TWHu>%?+wQ5H:R5NTlqLTKW>&KpJ4AX!iwBc$4HMqT
9?NJB\ 4yT5%jlT^ew*Tcu4&8LcipY4n9jilk:R&tHZH=tlhJjPXLTZFC=VMy%hTC44/j=wb!$TY8XXP\6Pq!=*
1B*ABk 8Vl@THQJ^lXB&mk$h+1T=+yk\@Jy:>heFV9iuKYW+aIW*llkHG8bPiX+LHjJPXjLpuQ&$6Im/QA=BBX>
$CqPVy >Z&W&+1p6Rn/Dc8uF%C/??l1$kac<!uX^dYWw6*R46Z*+u&c$qcq5R=%nlRh?tcR\6wmYX598NK#e5+P
eGV*kn *>c%Y>e&6EPPldPL/#9IyjyN6m8aT?ykq&9i!F@l!QHS%jdY6bN1m?1YN&^iyKkVd%Tu/Jtl+Ee&RDM\
:ZpJcw Zj&GT<I9yRu=@bkWLnqH/mlFF\L\8yQ+it9hY>/u9W<@8y1WW+yb//VtL6&/KLH/pc%4h@l&?Hc?9HZ6
>J4DBu 8yPL=>RjAXi*%Li+Q4SYQ=K:<yFFk@Yd+ZQL5BLSX1+S8ub6SZJFe5t%%a@aB?*!lw:cthMLc:ee^A??
mqtwPE eB&B!w@yeXc$keaCWpn4YlF5ilwDJp$=Znh#nE4IWEG5dHl&k9R!=Z@j4&L\hj&aqMLnRwcKS61p/<NF
KduXR= mZX9yR@cid:\#u&p#Y^<KZjy%1%4jjHWRV6@*ep/Rye6M1b!=<94Vkwjm<ap%dMmCcuQYVqH4Y6&EjRR
=hBG9e wIBW:H\b<INBpB!t6BA#1C%aC/VqqjGVZ=n%Z9$K&y*nZ^RX\meq5VwHENS9CqeJiQ5^w\clnc6qcitK
L!LPdd JKqa%EtdY@*I!EG:kLKlbQk?DA4kQ#dZR>>YQ#IKL8@\%SdK&k9B9=aXH/!ek>WDB1>:m/9B&1>P8V4q
F$MWGp PCRR*@p!hA:kRpWkY4C5uYEh5W6ST^<@:V%\wcXB&hF!pi?MG!Ay\dVE#e?1MCLI/EFRlyn!\bJ4&dZV
%V8@Pa X<kK<qa@59wS:=A9lP<Lh9m!<e+Zy+d++yDGF9BtX6&S^jh9ZX9@Im&wd58mRb/=cHD^@Vk#nP@L9EP#
+kCT8+ Fa&#aL9ZqHSYQ=KqeiKQy9^!<k9R6Xt#q^Hc\F:c8Jwq%%b<RH6t#GJWX^Kc?GV=+5p9%M$m5G#a4KCc
&E9=+Z /NeMS$yb?T^4&Hm%1p:<V#%<L#uu$mpZ/yn+\1SeMh?%9H=G\:L/+M/Z<XQFA/9tQ4X$/<=>94nTGaqQ
+Yi1>Y u$?>!ye>>jNdkW=kLa5G^T:mW:?a@N/W+%M@X/N>+cqZb:$Hn:lM$Wp1H%&>:1SDb@PWZ\LBFBLE<Z1%
-AydI8 0006d2087cd001202b3 Page 30 of binaries1.zip
6yq>PL !\Z?>mJ=\FwwT%C/!bFq%eVt<5XVuy#&j6$K/A8n=c\dLGwy+H#h5q^A9PWNG#?4tk&@Nb9SFn@BV*$w
H>D4M\ <SlWL1FFj*Ch!41qhe5YJjDVFCCXXR?58p:n%M?uZJ%/hjJ:mp=TlJ?@1B&nE?D*QWnyQcGqhQJ:wLK\
Y\+%@i acN*cPjL9nA5>YZ9pEm#HBn6q^N@NQZ#hTj^!ety\m6/#/%4\b!CuT@9jHqFEqc#ZGkeD*%>pyDcP/V<
6am^W1 18N>ld/5964%!:TGbS>b5+68RudTJkEKBJI<CLBpi<tY9@iF8WkS+<cG%%$/j5l6TNS8qMZiZHeESIpb
TT!<q& Ci5Spta9=^FL&#^G*qW5+?1$#$X%<!GtZ>dNwM5^D>1ch+kpW$%B&BhK#LW4wFbHGn4w1BAckw:Re1e<
Z6qkR\ PdEbckL^ae!5dBcSFbqTT:+*dI^XaRZID^Ekk+SPDatGV4y+$5Ree<9je!W4k1Dyhdl=88Te8mP#N?J+
/ydSR$ l!<?9SD$kC1Ay8X$mFAS85WXCL+4dlRbqG#tDy@/GSV?EkEh1@TFGS=AY<uWL/mWmm1+S:mq?m*+6ymt
We/kAF VSEi6JFDLHelkQE<nyYXXBHCkJNb?5R6pncCG8b*F<5A%I64q#F>IG*IcBPE$kmJ#&#YlLa<X:BlYeMd
MXh>5c />/!RBp+MSPjFZtHqCLPL1dD&@t!=a8Q1>6C/6c>NTcy>/aZWVd<iah9!yNV@/jF1@W$IBk9G4RWXV?C
kjX:Py HB^beTX%LcRKkI*=wEAZAP1bRt9P^Cj4iB\*jVdh=?RZ!LN5ZqRuFKte6YHb?/Y#m&jDWbAtWNWy!RG$
dPyI?V $M4TqENnAF>#/#8t#=k?&=cABePBb6X6w1=AW8L/d^\:=jmWZ$+9yINh%CqtDwuCZBRhV<I=91@wwMS4
mJT!GZ X!w/GJwJ1Gi>N?%1dcHRwW%?kTc%<yHJL=R9Lq@MM^&+VVyELwVQDhC?eNq5AX#WP:\Idn>eew&&yKTD
q>?:jZ \JT*iM:5=VSjSRQ6b*bl*YdTWL8CCa44R+/cZR^didKiYqXR8+#&ljY9EC51tjI?X6GeZj*p>!c@N:5I
L+8<H4 $ypmkcK\jlpDH%!qAll^beNd%<+8l8!iFAy?^PSH$lpJ6>DBlw%c@dL#yjY5pRCmEw\nBSZ*8d%pVAwq
AEMZ>u hCZiIi<RhK/6hnP4P%M@J>>&98#a#CaBKPA#>bBR6ZbtR/e/p?i6jGV&jXMSp1a</XlMAc+BGhX6bkYK
jk\X9& *tD1F%#j=NeXdjkP6C&?*\C9X5+BdECmX4eCQ?ZY4kDujtqN@FHbqPM1MGH8ne#L<d/SF9PJ=pLmh1$I
#?&wQw qPn%9R\G4DJqJTFYn@VC46%WMH5bwR#pWCSBXYANcWEin<Sk>uLSaRCG/WY8H5jm*/MQIB*Rwmjy%SR%
DJ4Qqk $//CtwKG=a9cX5=SVy8?VXG#<&XKcuylQhKcuT>DQ+6Y#wHibANBiIiQYnd%e+cDcb>Qib?B8$+BC/qk
bh+Gm/ ma+JbXGNNb=4?WmdIKqFAF9&>yLeb#a@5%uwK1*d#L4G>Ju\k+Y5T$EKt$S#/AY?tD&nVwY>Me1t@HI&
nm$<:t 8PTE*c5MM/ALXE*>m%t@uH<X5BTW#eK1c1/!KCDl1HLK?/V5%8K5D6LTCApk<<L/I=V?Dq<DIeJYY6DE
:VARVP b6IGT<MwXq*k+\1X@tY4KXuc?58wh<4?iTSabDZyB4uq%Y&bV5?+*J/>QL>YJjbBpX^lR/iVEDJ%HbNd
FhB8PN dYFYdqMbnZ/byY#N$5iYQ9c/?IjBYd?<@&4>nQwbIwXJTt=bQ!jWFbG/8yt5lT&?Z*$Pt!!1Y!Gi44tY
6qS5y\ hI=dNKkKKGJh!58Ju*N6W9/lj6tX1m^6Rq?QFFVcqGb/u?cL5A+WRtd\cS@WE!1@\ZiA4TP\<wK6c?5E
AZRIYl wDY<IaBnQCDQL/>VTJ<*=biET1=qn:*Pc84&EkGXiVmneMuTy1e6JlYRHm#&!#H@l\ni$E++SB1*4qWS
BH>PCy aB1<c?$YmW@\HPI=!?Gnq6QuCbXmh/w8%:ASePJ5FSAwewVF6T#d%u@R\A!AtDwyNcTpRnK%XE<Eij/i
uu%Vmm BDc\jQ^GR>9KS^AX^>eY$jE8/uZIkdPaC9Y5t:qp++dZTe!G>:$pRjPF+Ra1y%/FI+VlPlkSCG9&eu:Q
A8Xlap IK9IZ9pIYXK*WyFBlM6AN46ITHZ1XmwRtTTA5B^y\81q%aB:dcwcCZDdK+BQ\h4K&yYCLw=k$T%eQ8V#
jmYMWG Rj$HWkYHbTM%tXA*e>a9/<cIWQ+PpSH^uyItGh6Lty+GAb4+mbIy^&q95+9H!QleIpK?h+nYPjpFpWKi
XGi6:C Y4:E%MIhQ9ELt^WI6\VKRRLZ!ynFNn*h>DS!elBR@+FLq>K?dm?=6pE&A9A%8*n/nNuL/=ST6hSSAl@W
yktF+R TeG%Lpm58@IS+p@t8ZDcV/>we!&jj*Z?XXiBc#u!q$HZl%Q@A5d^F#Bl+QEqG:$PRS9il/EPEX!5P?qc
B\%*uY =myAbn&+cJBBE&n:e<BK@ETHSI!@:mTBEuQw&lZA!FhyaqP@AQ#EKDmkbwbakw:F>!??9*bY6k+mBi>q
V#hlVP CnKA&IHqlML4*q4=!FKY!pAw$IMmGJ=n!VYXnNS6yuijQyQ?HARK!XA>9yleL1549Q@1@XhlG>P@P@&:
?F/EXM !:/:dMq$X\HJ^e?\wCZV::</>T?tQEq=%5$k\c/NXGbY<Qud?Vn*@q@iL?<eb$><emd5EiyX6!\L$q%6
cLuJ&b hX5aC?tQFX+G?\SlC9b>py=GXamu$m?8pPRFZkEyyQkNTFi@p?EVyMK/BKn*!K6ZZIlDcEP:lGR/iIc8
PFLQ+u IF=CLC9L6m8wLhqw8\1tmB\LTKS/@?:$^%=@dPq*q<&@P86H5*+$H+^ANnMDdJqB6:Wm?N%q!IPZ%^ZY
BR^XmS ZLZBk%u9#aLpJ#I<QCpcMEPCnAS\X\>bDaWXAI*Z=>!&AG^BTJn<HmEk&XG*uApCmN@5XJJ:^Jq6JKEN
1?*kpQ AuY@KCcq1^?BD5Pd5BK/Itp8T6#L=ISW%4ek$YB8VNWZPptq%Atpk49tnehiZ:PWw9#8>CXL9#5hNE#u
t9Xm!/ #*CH4@M*%yLym!n1JW6h!?n!JcQh#Qw91eaZPNBR&FBITtG+EL%WEyl1LMe<Qh^EAuSkjdYa5I^X%8t!
DyEQpS #TPX>K8VZ\ew*T#c8kY1&CF=KPRD?LLJwZRbKW$Ai1><5?qy!HR%LbM9bb@M+^jDiuliR#5wD1wA\P$q
n/Qh:% l%=8lRm6G<VJd*mhXpmHu**JP/kF=hMS=ycCh4!9Ydypw/Kd11#AH+PV%IYZk&dKq?GnEBu@DKqA64pE
B9%>>J b5l:n<DCu91P&lYA@m6pk&TF%F*j4><CyTXpZ#tulLW8T6ZFhaJYW9#FdT9jyGQN$pw9STt9jtVh!bYK
*i<eea :nt5<VBuy?eT=\8c:jyNSbD5e6cW8DXI\:M*9F@wLcEB$lV=dn&&NBieAN*&l6hhmp:Z5katI#MWqa9c
uqw/et yKc$CbRZ%X!68TwkYiw*DGmE9jBQCjw5+Z:6I1jt#8yi@Yb8he$846@CEWyTVW?#Gkb>*P^5B/qEaHp$
h1Ptq< d?Z1^SIF:ccu<$ul8yN<Yc5jtcRp1:d:JQ#VR><kV^jpTdwwVZQNG*t5BD:&?w1k@h%q8Y6El5cG>^h8
W6$din EP%i5yT/C&&qFKXTBYk<1&+t*kp?bmBFteFEp4/AQwK<XhFb@DJq&e:\^STRM1#j5mKycFQd^jD$W8pT
dMqBqm eLdb6bE/Em%d9E%wY@*wcyElKSMK:hYQqFGK+AqtYF1>YDa$Ch<c&1#/Vdp81eGDyp1uEp?Ja6ZWP84n
Ttp!F& h=iB96iF9tJ1K8T*hMq$wSB/Cl*+S9$K\pq8=6aV8ldX19w8LLKluj/QhI%bD1pDbR&TFM+8kh^/YVMm
M5p<Bj jWy1m>yIGc>Hm/V$wpYLeTc4?w9uKQttX#<!Rc=Iu1%YW1N?1u$:Rtm%RduwX@cK69G!P/c&uDiJJ>yE
^YX?/@ \FhZSH?/^QE?wK/cYpyLFQ>VAQ1+A\ZRCP?*&hWm&mB%:NqPiquZI4y=A*$4p4IB9Fqtd/tdZd9C%dHp
lFmFZu t4%!V6tn1%epqbh^WwcNR8HG@u!St?A!&Ge6=c5<Dd?nSGWL6byWLlG6FE\t$IJXVNtGXX9Mt=*K=ta%
hVVGib S#%ZD*VGPy>4++4ka/?uN:^jJ#:JwXL=YKuC!5=V>9!/wLNn8Ppj!%B5R:TQEIh?6u=qFwJljWRCG^EW
GJENBK <%VK$LC^4+A&6>m^K69Xe%>Dl&##h>B#Lc=hZC9:yc5k*&1lV?j?c^%q1PBAWFFc6/p?T@Qt:A84=Pd&
@%bDlF VKci6t8n>6*yKZE!6WyJ=%?6K/\6!BIHW%FAla9j#M!ERdmlSaL$IE$RAlLWD\bVpYhNi:>&X5NtqRYI
CD$y=Z /Imtq\PK=9D+6\yPC$P+=%?9DLbFKnialh8mnc5jYKZ/M^+1hVc$!Dk!Y1tVpFYZZa5EJqpj$Kyh6$K4
:%dKD@ b@bjCAN@jRqMWELH/>cG>!8!mkw1BSE^WNKXp$dV%VcJK1l!bCW?ldjw9tpmZAikQCAAIVaM8FTJT5Ad
PRk%Gj DYPbAuL^RuGZe!VR6hY%YHYdd=d5dSP8j?&BXc1e!l%>kqpcZ6%tJVKlDpyp%Y*KFbnVa49cJyBLhXJ6
qi=YtP p@C:YhWE&Ai!bCuXp&aw>FWSDGTye^W$LBQ/qBS%Pkmw$b$N$6XCS/IWqDTKY:9G:w1/=i#NAAmTLLdP
/Kb/et we?%*FFLR6VEWtX*Rq/LKqLXd=bYGYFeXwBCa1qLj/CWq8eRTCWS<VpJ:Wa8SQbQ&GTkh6hpu/&BWLFF
Q&Cq+^ :iFCQK?:N4w&C1/VmIm+<Z=YtQb*y=jR*=Je6iNLBLcENnNXhyiWPKX/umXZadVblbNjIJyVlV6Y^\W*
BcQ4$Z <D6BM%TN4!DMqa<5u1MT*IaP8/H>=kcJ+\*eDd#&RQXD1$Shaa6mlhIHITQipEm+!c:dNKq?YZaNWk4w
/QJ>D: kXy5+Z+\/eT4ZSS+5*kmJJ&HJ#paX6ChWK5<D#GjwL\qT\YBdPV?D4Kk8$XBwcLkH%Nbbb\JilaSdp@h
1G?e$% mmu9V#p8lhe5yS8qP$BlXGAb%/a9bktYiRV=CcIyZ\1DP%kJTKl^>iJ6jD&$cqECp8&SZI!?y$ew#WyX
HY#kb1 ?nC\lncSRRFyqb*VD?1QRJ&4/E!pBE*QNKQ?eN*T?5NMXKm/qK4=&NJcwjh%+q*K*TZNKLLHM$aSW@6c
4VFQab RVt!L=>RP>c8NmK*&1K/YT4@yiyiy>RqHSFZSKITh?TFKHM#uhnmPRyQmHdLP*hHq$nc^b$&cYim>t/C
VyEcp: iXaIQwe<1Wqb#TY8yaV6Sd&XYN<Y<dVp^$dTYZ@a$YBRBl16Dc@j5\d&8<V^5mTR=NF91A+^ETdBcp<&
!q4<mI :%8W1N<!>e9yYjIeldXht@KWRJh5@PJYIR=RSw=#^wK>iu>E6k\F:CkI5Fl?a#?/GwHTyYiF1IKIGKaI
G8i4en q\pKkV@b4PCp6EQ$Tled\Jq$EC&4Y/4IZCIy!tMPTEhe$TT/*ETB1k%Ib<M8!i5I4VAIB8eGdy&#6TVj
/!GQP/ %XG:hZa^E^B+uGI11bmtmJIe??Li^h8W8nw9W9LIapipmu/?XC1m1H%Wjuy$NRMtqQINwjaN8?GNi+XP
@ptA8= %W=A!D>+I&lW+KS8ST*V5=qmZnRlWu8a!mp=NmqXaGkGwP\dAyqcqB6/XMCnAqym?J91n>AX1dJD\+8#
C9!&?R :/8dZihED?X6G=VK5tFuic@h?FKy&N%L$EpkHpS?RViL=\!6ZF&uCF1=?1FTqt\cY1S5E&SZp6mtlMTG
ipQ*N/ FmLFLEFiIRyc*RGG#<1&e5uG^YHByp9=kknFIniM+XiFeht:SiG695>ePieY69iy/+9>kb#/y/V:a*qh
dT1$J+ qy#qDXt:k/JHK?c<hN@&?:d#je=Lnc9=jiQ18W@Sj#c86lh9!\Fh&<!X1!ue%Z\6*d1+>wFTKWTh1@$K
-AZZAT 000a33d9539001202b3 Page 31 of binaries1.zip
D4u*9E 6J&4@\D^=B^WXayVXJn5@4BC8FSQlbVbRaMkZT/11bS#St$BkM%TWW@aIZDh4XLF?&CFhQRw6Z^WKa#E
4K9Ljq PGt>dKi\/A@4Y?8j+tcAZdi5KB98BV/A8k>#TFQ/98$F>*$HZ>9q6h&c<=Lb?FL=+t$k<CY?Q:B1d8tM
$8>h8u ??cY56j$khK=yhaDyRYKqQwQTAwT4EKtH$49/Fm5lyb^Apyu%T%q/qi*qEVM?mZFSARkd9N%yI?=LFhJ
Fwmt9V l?JWSbC!M&Z^JInmRqkTK+bPh>T64F5y\H!5468\ZMF4%/d*l8@d46**Hi8?:ip=L+&j?>Teq?a?Njiy
c8TuKm ?:+n4*K?RIY<=ydPja1W&LXj*eM&Mhw%XW%SABy/XCi8qP\a%JhJIYcGKp5kcSWe=64IqGKJYBGR#P*5
BFIIy* JYZc/LVyTRBaYpw/HlZ$KCpL1BEH*eFcqG11581Y=T9Fw*Cm&y!ZWpKIih@&l1#!KjZnP/nbL8<mMH#!
Y4l#Jn uVEcu\J6V#t!?lXX$KYVt:L=@kG^FQ6!8RdX^MJ>HEWZC!&%ljenHij*kNe#mNIpFTSpehL>:W!JyT8a
bV#LRG uwIh5$KbWCj?5EZcmN1pcq/pT4yKpY&Fw#h?PJIqLFeSa<>=1bJEPGRw\l#mFEu&jh<ytuHjnB1qkC#\
1iE/$X en8yyWy/CXwWyqFmE6k9uR+8jNt8kpyXTtVA?8=$\ty&>^ClKDFb&$98HG5Ab5@MNjdwQPyptZD8SD?I
<jwb&? %/!iPhXyw19qYile9?^TLqRJckb/LNG:HIitd!uqW#V>%85:a^S?J$9Z*FJ/Q>Yqw1C!bHYdHb#J*lDB
%>+DSJ iC=BWXuu4iw5Cn+nJC?q<%X>Q^TV8d%pklKY$@e*^\tj4F5GXcjQqPNVj#q:BwSVKIkDL/YCq*NXu/e%
4R6Nah 6#^9Sk%MytbGDRk5XAcXjVjuQqX!w@JqqSET5&jeX$S^RRib$ktAk%5dL*bL%t&SakaAnmKJJWKY!B!9
5b$aZ1 WCM\?ZWlmm%b$9#1hV4V?d=h>QC^%^j>TnZBKhJwZ>^Q1%$&FjuA6K8TLD1FDe=FpjXX$m+iKMZ:NZwA
CN4GF8 95D?c*muX!m*HqmqkRT<Q:RK*>?udP44NubheLXj#T$hK$LI@tD>C6Z<ykwnhe5XJCiX1lBKKmW<qV\t
*/+95Q FE4Q5nR5$4/5b#dd&$68yac!$=H>^mSNwVmT^n=ZaPIb15dqaEVS!C6t@RhF6d?1@/C&S%/>dM8%//>X
kI5:m< QFD6$yuW5IF*cdX/IWhhSS:ae$8uK\ZpP#*nhHW9RW@>8dw*/wJm9b8qua6Nn:PeS19CYmqN\\NTil6J
FKSI$u q%JI$FY=\cELXDH+m8!&n<pP=E*&qqBSTb:!IIVqTC!Y#X+&=jmW+>#VX+&nqJ*1V4l\1/JLwMIS>c+?
&$yh<+ ab<CAm5AL/+mL>DHi\u\5l<1#TGXcV4/Z>$B$uy19!JIbIim6JX5pam:kn&j5+6t5$+uLy/EIW^6ZKKm
>HPHWF L6RTlJWykhHCF4Y6eFCF5!E/TSHIY1<RJq*FK=K!HhLG&ZmdlHR/L/%nWWG4&@VXam!j/dKDh:n@I*ZP
ZV6I6p D5p/P8m<TSy#FVJwcTuIatqBb?<&%Bj9NDD/SIl5T?&9y9<H8T&CL#ECSTGR#W4y@J!y/MNZpXR4yXIE
SEH5u4 Q:qpiwG1?Wui>44%&P8q16NY1PT8wY#:Cy&*KnyJJXjDY#cYZPMYHTEmP*Y=uZL>ykLXy@$@b:JeIy:/
&<!FpD DhZLZi>RLBpY>^>bY@>AwV?B6Vw:&hkdC8M/S^!q>5Z1*1nh#JhX%*Iu8/8qnYX=*R4Bd!64yZ8ZNKy8
!Bb=+i 8X4YLEXNGh:1C1G5C8T@@6*y%w1k9iSeKi&PklR!yhiK=IHRY!nMJiiWMFWbqS6=DT&%G/eZebjYcdeu
Bnuec> E1E!Lj8m4F+&^mR9antXlYD&LdZaDT$LyV*%A:=L1m%yN8K\*G^Ry%:eiu&D\18qT14*IM5A$ka>T^1\
WT4Vat X+m!Wq&Zm+ilLT1XuTp9EMpNE%wqWSdk/%J:SdCAhKk\5PTe9ck6n@:W<Vc*WLAWy\m$Ymp6T*Q5$/E+
9nmkhG =Z+T&e6uPcB&?h<?!KDI%tdbjZ9hRRQLG=\!/A%dJC%%a#<=?**eNAqt/SRcN\qh/yaATa%F1M8F\qtK
bITcM@ #6ybh8*MAqFhWInZDL9tc1W1=$w8w&n>MTMF&&%yqmcy@IA^a*8JCjNW5tSqn5XX=nc8c\VFW:?a<4+$
P6aQ?Z 5dhI>mmF^tki/TQmkc<cS/DAnXiXHctmcaM#p9ek%RiN8p&=hXIw589itPVR6hqy@>@<Y*VNFK1YKj15
PK<wu1 &yq*CqZTVn@6<%u91h+HPl@pciInXZRV@MbCnK:8q\L/E1?1cN9\989HyI&?jjEe=ZRR+qh\N=Mc=%I/
&%&yjF l@iQ<yZpmPRWhTK@=d\%lImP?q891yW6IyMY5&=V9t^P<</jFlliybKh@F:wbCiCR>FM>9HM!le1b&aq
T#kD%d ^?4nNLbVF6VN6P6u*ATb@ZnFB+?8>kJ9<$ZcZGQN+!/=jePSY!WyE>wpj1tmPC8LMQQmlndD%SdNbX5K
Va*H5m RMQ&pn#qyhc<adqcTuCcpCQB&Tt@tm^RTl*hAm*+>B^#V^wtDP*/nZQL^\R$$%FDJdTb+q9+Z5l!/nRB
1Zu5%6 !*ZP9mZWL9uw/8^iG858KnYZ=IFRB!AGtP!b#SMbI?nBTbVW*%mGy9?eDbJc%E+5E^JZ&>@tb%6TSFm*
H<h+NC bpZFDq1=A!kwk6*epP$jpDcEP1tde$b&jS5Nd#!k>pu15uZ$#a/+b6=AwWQ6dQXiNL%w&u8ppA/FQ4RP
Q9a>qk cAM8WqIp6TQe>QTmV1u?6hR:P^Fe$=J#I4cdTCFwZQXA6XMP%/WXd<95p9wXWpd+kH8LK#:R9c^FpVPp
+>!Fq9 pdJd<$dDXkS>y>kLpCmK/el\dI>AhnThG?=IyZ#HP=h?JVWE6a8kTpLL@\q1qTVq=XA1/1u&<RS/6QEi
q<m=8p AhK/:mRXqLiTPX1$Yi%L<A+N4>BK%%J@DpATTdLWnu8\m9cGq6pq5+9X4b\m$b/@!&Mm^ym1d5i4Z%p*
eVZ#H6 &/=d@k*XD8G+qYC&E$RX5qVZnkyR5qeuP?9<qJT4Y@Ep#bbGINZ5=NA1G588cZ6&$X*V*8i6jeD/lh^V
DaXbIN h&Imh!6:548w5qPeddMNKp%mN8JC9mTBwwy$QqA1CibVpK9IXNHJ&$n4N%88618*TtYMh*<8y^n4b8N4
w\MVcy qqVd?HKcIc:HCPuy/dGYZB9HG#%YJFjj==DydPE%9C/qhBK*FDu!DFY#!^1p868SY@?<8ay*Lp:>be*X
9ea4%Y 8lqTWq?tYlmkKLy1Q%@W&=D6IXbdi=65&R/XP$HFLEukR/8eHQ1yB%dJ:aAk5Jbq/Qh4b>WjedHE*^I6
pZVHH* Wb9H:A$B&miF4QnXL1>!6khWLCHAIb^^T4FM9?!ty\8WN%i*Nqm8wCd>Y4h^<%G&<Fk6WZi#195mq!6F
AiAXDK uX$$:Z*&PTwcHjyt&A*LdlJqdFPmIJ^%Nm+*P#6N5yHtCuwy\q\t8:XjIY$4i+A\Et85*W#cyu=b9$Zh
D\QC!l RBM4wL4V#=JjWM><Fa8=RYnZdTwhw$4uhl+Vbhau4ZX9qhIqbCMXFF/&Z+Y&i^&1bw\hXZ/$9NclDHn1
hTM%56 @ep9<FbFJV>FHZCM&1ZcJKmK8$4%Ldqml6!eKHNcJ1Ci%?>ZZu*jR/6I*WP4YCdk964WL&He:\9RQ%K@
DVJA*R =Y1^KyG^\4PwX#pH!K&m%4ty/@>D*L@A6*HXieQ+PI/6JM&q>\bIG\QN^ZEWK4N14aJ4EtlmP!Zdbm8:
8N>6c> YNmtPGu5WYS%TY&Dlc&!LDSyL59!dL9:LH5yLE&cWYS*YTR>c/&5AGZdJ6%!YYT#%5yKkjSmSXclqedS
%<=+JA iGdi*?>*#w#p\9P<:@@>@#?j@$uppWbHe<:*@P:ucpNdteFBA<C&D$Yn+*6cS/mK#Y=C^hj%1Lb@*\iB
GqJ<G^ iyKBpQmM?X>:DI^<ehWYdm=wYij/M#n^y8cF&%?u&W8dF^%:6qGkV!PJZJY!WeYndN!Na6ju$A>BhQn1
Bc=Fqq Ywu<ma5*eLENemkdQRVHG&lwc\GW+Am@6Z5jH*=H6I$$D^l>TP\+ybFRl9IKaeSyH>>nM?G:<8I:PPEH
$bWbu9 XS=V<WlQZIBFK&8^k?CR\cQwe%wbQZe#6LV8kJdE+c\1uJ&PEdm%G4\%?&cL\?k+aV:mMhX^4JKlJVq<
&C@L+A Q@IwGk?MEBH4b<:eR+6WYy@HlWYIqI^$u*Z4?l<VQYq6h$J6*ZE6XldC^&aPp<mIA/EwiNm698<BIKHT
/Ium<V qX@PKIl>jP4?jT6+B?wl<q**IBLX84pCMYt&QVX5nV6mR5&CcBAVL8?$5cp5VM6RF#Ebii1EkmDtPA&^
i9\hHN kbFFXNTB@BKdqMjw^#DlR1uh:94D>/!!u&HBGm$P:YXDpypdGQYaAYw<S=+pi9+MqmF=!J6hieF>F@^h
\68*Hq :4/LWY+jDk\>cQR+pqbF&lGZIu@mWnmIGXmkm@eP$SRXtlGHGkb^+4^9uA6PWj+YQ1YktZ4<JK=yA4T?
B\VEW8 Q$Bn8<\k$4RbSpEDK%IReVIKGql^1TlPGTN4$QhtNW*D&ajVn<CqiAXpjDWNL:/CC=q&YbE:8@L88>\Q
mSc4pT +W96!t5h*@5MG+yuRSuNB>qH/9RCCTTAwqZH8LJ^M+HhapMV<kRGcWlT<N$85:ZCTNaNq+GwPC8C#<Mm
t<I1wN ?!1^$Xn5!5S%5C^C6@Nba<m1#GNlWMFJB%ImTSG8ThTnDK!hAi*N4weAe5i8P*l9j^b:LP%ZnCuYiJhk
VQYp8X e1BIV5L/TSAA%uF<BhibA&a494CuE9$CJyBE\M*E4plk<Aca#+SSiP*t&%?98a^Ipc!+9GWV4qPn&BlN
1R>k*C JbAN%=bjaCwjb&w+JGNpF<h%1YMhCA9?=+&5A=kJJmLi:ibpNZ^5a^m8L:PY#*Lckb+FG\SEuHkQX>6y
pwhR<S :4558IVB\N4/QDB#/:+:YYBGHmQlbYl^=VbPVChQnn1kDMycETpGST<nY6#ww8aFyu\RLT=K1c*mjV15
MMH!h$ K>AepWWQXG8Wcl4Q:TRj89Ew<*dRHVDWEK:bSHYL!la^w$@LkuW?N+CMdLaCl#qB:D/+M<htkDK6$^Hm
?HMiWX >H#w!Bjhh?GL=w$?n@%=IBV:YJnNP/$!=E@BZ/$^<&tcPtI84PJhd1DXeGCP%88@DEK$G%jaES@*IGLG
QFIi%j ^$SbMpXwYtm%>RW&AECh@*^NiTQ*wA*q^PmKqEY/IqL5KkTXi+bnyY$j1JQ#WQbYSpu+q:8Zw$YKA9e?
whGMen lClLYNp5&j$eK>KS$N&I*c/<A@aX+B+MXX?!5$/PQX#yM5wi$?/>ek?GllDKA6%4Z6>A6F&>c@&QWV$B
#H</n^ bSpQdGbnYmmXmJc9M4^wBM1Ip$t6RX9ETy$BuJMJ:SuG^^k@$Ekh^SC=:Z#^\/5GbnTWTFHA!Q?/:/Ky
dhA*am #!bXej!h#c4AhicI%Z+B?@i^T:X?Fb8kn46CcNa>jPFeLZc^$64pi+pZeIbJLW=CjwEbuk$9%F#ilGmZ
4q<&\Z +MXPC6SVlDdDhn%kL^aqaBeGw!!?\DZC/GR9R+94=\E9VyLKMN=nW*4iitku:8mA/?JBXujteQ+==&Dm
Mu:uG> a5dDPH/:&$$:ahV^DweMWjWK>WSTj!T<*4Khyj=Y/m=k1/X4?Z\/RA!8NJw!*4N>%HaIF%ib!$JiaD6p
Vpt>@@ IGLDXDFNlN%1FQ@RZ$T4NS/6a6#<tVQWG>8%enZ4DEG$>>B<H1R8#4>8qFV1E4aj#Y#u!/8A1tl1GX$=
6QZ@+c VREuw8T</<cBeMc@>>CkAXITEh4Pqq/+JR&<cIeAwP\8l6NKkRDyib^q<=L6Ci#pS5uFhdI+P>8k1$Fb
w#djpI p:a5ADyLP*ieNiN>S6uu&HAee4LS4ZZuZ6bJAn41DQaAkFMCJRJc\jHTG^c?j<WXyCnNEuW@>FFGVbw>
-A>HND 000d43888f5001202b3 Page 32 of binaries1.zip
iA8cYc 8+?n*Mj5T\pu*&4H\Ml^5?%*$JY$HtK8JY:X\yjJ9EKej\H:G^lN6b4LH::>^\#uy5%t:!^DTuM?pbNy
WWju6D 8l:6VwJlH>NSPJ=X+tDE1h&#h\Wlbj#Lb?\\t6/#/w$1P/EpB\t>9p1pKZK5&449ab^Sm4KJw@P+lbL>
N<5p1L Ck=#EJKZ#eW>Jm$=\1PEE9<SR9l$qu4ucV\j*y?^QaE8FT/@Ba!wp#cdDla6mGY^Pi5jIcwCFcu:>^l6
+VCt?8 1HQW$MKGDndpqM%D\>$<GE+d#9#p>H^6A>9FAuk*6?5PuBYEDn^PIGF#LBlTwKTd<T^lbWm^=:!T>/Ne
q@hP$+ $G^uG>FVRb\G&q1pKPLF#cR8*MuGJe<RNZhn9^jk9L!JeY^%&dy:9wAS=>5!*+QNwcX*b/tQ/t\=VuD9
Cdm9pG X?%&L>/#%&JHt>4L8p6^hRqDiLtK:TuD=w^14R>W+Q\Sdbi%p5$hyje4eQ<b\QaK/Jnn6F$TBwcN61NG
J4dE$k X#yPa&VwN4&<CYT#q8kICAtj>TKPwhBiPGeeb<l@1L4>^:nW1ydwTC5NPD/&4JGQ#9a^ieR4#ep?m>ka
\N/M8n Q4X4=a$aMNH\&q/ti*AtIZWW6>Ce91MWjPE?R!>q:<I>kuCkD4W696ljQpiY=5#e9a>iX6^bCAj%GSXy
K!*P&! F\KMhKkVtm%<I6$DhAT5V^Liw+D$EIVbl*BID%=9*dqK5:@WAGnB/ehq6X6@dF1Xcp=JN1l^mDwPCCNy
*lWhS$ IZyHM^wbde@k*ld:6nF?SdVwCbI*!QD!&bX5jmZaeehb\Z:$9>?QQAl+mZN^%/C:>>%bl#8!IL=hX9l:
#mWbk& S\t4@R4tBdS>G9W<YHkj6ERnJRB#ehQL!&6:mbmHcu8%VT@jke&D:AV1A%eVdca?>e8%#FGwNy\n9u%C
S!LWmQ 4>H6S1La^@4&KbbDEcYNP>D>8+eG<9na1S9Wn\XWV<BanwAkNR^kn:=SBcR=nn6d+jbQt9*KSl^A=:C5
%^^GjR BP5PJC/Cb\aT!XZL+uImJJ>Nm&=:H#D6Y>4tdZelGRpnIK#6^W?d6!ElETW/=$AwA!XkJGIcCwnG&WHF
Q*bE/J <mW=dF!KGLYQhR$#lDk^kBERTReC8bbG8WwISS5j!&ACpL&b>y1nHd!AIRp658#h?>ljuIKJ:^EuM1Xt
/?yeD< jZp=b%hkSGk4J+$eEF4d&e*dEM@t:em!mNJ1wnS\A5ZQaQ?jhjQYptmmIiHPEAqu5$uNa:T6CXi%h4=%
ZN?qw# Ta8$d^9TpqGTK%aeKdH!BX\$DbIGIqt@RnQ9^#8c8R&Nk@WmVu<k9K6R+TAhGe5!NtaPLVPMTFi4!Md5
dcwhPW eMyX::Y<H\/Hbe?!YRMtXVqchjP&V*CVk^VhRq6t$XbTHGeXe+MwqGYei+!/^bq:K#ED!tjp9ITnZp6W
kyk\!l EL4aX*AnK>#W!eR1$n9eQR=H1WDkL&?$ZpScMLTM4pDJHMQbTF6?phQPpF=p:w/XN9!mMXCe@:&YS9uA
/PFSB8 dFmJW?H%yIEV5RQTqb9a*u&HcGpFnk!BPhEAKQE6e@p5bFBwQmijby%lp**IqYjeK#H=lPC:DqWPGntc
\YY\nd /k#8HG*y6MwtGpmJl*9b$M+dk9Ym8uu:D8Se^4PIpPMne$h#Cyn#!1qybb69HVItCYP6$HDk4Atp*/au
DKXKFm dW?ajL5hZ!C:Y\uuWY1dLYR+Z!j8*d#p6bu6VMiR5lY8=NC@dC^kIbeQ>!b<cVe+Q/9Y+mStXJqA#Xee
SeDEAe Rb\1kBly14Ldjq!#>T$nm8:JXDm!wIe&d>?IhDS\EmeRSuV8pJyA!!9ehV*P61yDPYWTSc:4Bi*PXjW$
6l/d*B <?>qNJ5G!t**$Y5d!T/&E*E<>TK>Vu9*Ma+%?ha$LYSaHH!RH<M%+tHEmX6M9R<hRB#/^:C+MaNTl48G
\lWnXA PM:b&YbpI8jdM1yc6@:/%49**d$QJ!pB%l^TFjHT4JAL1G5SeV%:ZiFWQe:HcJ6^:q*9NWl^B&&dlt%C
#K!iuE 4WE8k:469k1e:RQ$*Ed/ucQE9WEIJWj+uk&IYJjQWRidPy@b9a1&Ln6KQZG>nKyMQ#uPRpAM\RwLMwti
lX/SAC ^?^ME:q^RaFtE=ilnG=+<c$Q*:%9^!uE!QABq&jJ#WcE4>BeJ61YD*hbNIMSEXC&<BpK#VSCDjtBm/wa
pdqKAy TwbS&*cjRFP&d8hc>/KXNuFD/cV%86YdEKXqKTXL6GV4Z^4bHE45dHkJN$A:?kH1Mi#qC!HPaq%=TM!%
q4DdVI WEpV&am86Huk%k$9bn/PW?mRq9Y4ET66T@eKPic5E&\9&=!QuF1wLa&*M%=kZM6^*4tKdj+HbWLR\nRR
4ck<Q@ V4qnE*h^Jlj1PTn:PNtuQhc6t:bwt!\*M/^qHSF:cCeB9t1H4Y@BZ6l:4?^ihi>Lt9Q5iy!5^ib^$a\q
!TK9mP w89Pq\p9/!%q!!:a=B+SbSZwYwGnT1>4&@y9aRLK%VNWHN$F=5tnu+8:%6%bS?1Yyl9kW1Hin=FwkuFp
PR9^h= W##bjun+&SBPkwq#qi>DlR/@QwG5AK#L6\ZCHb=+JM/9uKmG&NM\Hc:!aCwJy!Fkd+L&tVN4eh1hAbhF
+8pN6< ce#Hb:/?/nltIeLTnu4&a:ZdN4#+Sl%NY!YDkm1cBthich*HllyaBLwjEN?#q!pnLy!Iq\\u5jqF%t9E
&QjFMB apS8VLeB&>/Gp=RSJ<a+hpbPG5et>u%np\W*8mB&b5NP*DGmcBYudPBEbb!WE&BIGW/MW*BtJedb6K1%
YbjY8n <il!^5nwRwE@8>LwE/b8ic^y:ac#@:&c%kHSqDRTV%BBkDLE?*K%%u*4$LqFupYA4HPk%ItAM1ubL@\S
hnAaD8 iHhuecb%Te>my^^KlQ$eEBIB66D+b#Nd<I#EJJ9J8>Dw&t^cKq4Ckl&Y^nSbqNF>&:C#yHn\^R4c$k@k
X@RkW< IdDG=#AwBZk4TyMt<HjYqyw*$^@D#e61X>VmhC9G#Xi\$^4HnLC:yPN:?&p>A\XpL^NCQ18y4JQpI6QI
8t@yaq TD/$KElCbpiIbZHdXIbRSIT$=hiKYw6Y<<c66R#l%6w>jDdWHl5j!&I#AS%M#uA==kYHmbESW8%jYeX&
FQS^S^ M*ci^YF#bijLFWlI%R=Ebi9Z?t4ijI*Ka$Qt6Y!?XX@nSi#cbKNm&Pt%!<Qy^+V^YHuuCPF:m*iTZCS:
IY6$8i mV:<PwcPtQMX$ndq&Jw*IdwdCh$YKuWQy%+#%&RplDlBnmdJRTkqXVN@AD5#ESYkY&8k8@eqa<6B:BLu
JI:k%i 5<8PL61QX6n:cqj<?pacT<aSbdcbGpWj>tP+#JcN>dXT<IXC1NtPjaymqLQM*%8KDye%kJ?+DTuIb5%m
pql%ac %^@ka:S4^ih911Y!X4ChmZHShm*8q:YFyynkZ$bB>NwqE%?A/e6G665HdiTJ8JV?qe9a#HQ%*yjY6IDK
lkMMIR 8^jH=9qcGQbCyLW4565M?pFy=p\!FtHlYD^&/Bp$yED/biSTRtb$Y%+p4?kCI5TIEpQuikme4&\F5V:H
K%c4Xp Fa^I$!8aFK:aXI8KBqe+<Y$It9ueBEbHC6KSN^ElVjWJ<Q%$Lt1N$1$GLW5hZc!DlEXu/QjSq1jQ5eEH
:+awl% uAwJ#<N*ED&?%a=Ym&QhTuVh\+hA8jVnSBc\u^hIHnuHMt!Iq*qFlNN+wVh*pVyj!LeEt!#!?abdc+$Z
&X8lL% d69:Jt%w8\Iy#P:!PZ8$+c*h<Gd=$pG&<RK?X^8qTy^amqSX8%di\Ca/5@mM9ZkH?FFDS%nj&9V!4dX9
4WWq6T *WA6m@yuD=jQQd\$5@QISmP\18*aniVqMb1?\8mI<:964!BGppTTS5RIqukXIP\nc4aRqt&MymCZD1Iw
H<e8EL dm:S#QR66kVddIHN>WS/+59aYIJlNBentQEa?pRMujM5$yQmqqY:X>uQwJ#WH41%F9!VJ^Hu4dYZQ$^G
\HJB4= G1X$C>G&VN8^NdB5V1E^bSmqFDu*V1Kj+RumZ>X?bR9SEX@H4G=PT:dFLhhBVEcSqw^@/jNK#6566MiR
Ry@#N= TL995YYC=:VGm#i^uRqyw=N#GD$diI%6ZhtLtXJ%*:bq8D:Z&wh:SN%c?:+X:%6^c?&tq#Q*ea^IW$8J
BFHueH w6!La#Njeh9lFnb*k/d?p9=BYmI/qGJw:\^DT:+#e8\J>Ca=!lbA$5\yT1k&%VLPZeK*dD=6C>GXjG@N
T+QjFW Edm8Edi>9dk#!Ib?HMGh<H^nhN?BYHHd=baLK*Aa69VC9=16yS4dtTn/JGJ>dV6D!mZX6GJ<i?liQ8&R
d/hjI4 NkFu//Y^QZFqAcMq?4#GN6T$+VcL?%A/n&9Yq9idtwnSp>C?S$KS5#qF4c%58nVE!Ne+VnnPMcRRa$GW
/Y$Nn8 ^TI6^\pNG?Ha5pcJ\/\Al4&m:h8&Eme8Ac9#!Wa&FJ\YdhPVthXMB*F$Fn=>pub9B*hX5LXw%8b:AS?Z
hXa9lX HHT%IG1yc#T^:e!!KB!nQj5=$M+mWdHb$LP%nJyeB\E1k&i*GMnw&wKdMJDnmV#n^9$4ETND^4DcV\CN
dX6&$$ EiH:cTE#%YauLaqqG^8\iYk+tSPZ#PAhHKlqt#E$T4bnmZWt*/+k*t&8bb4IyPim6hqm/wkADnnj5/1+
/\>jXS !:1cSY*Iy<CqDF$L\/bb6:/jEBIYR:>!:dQT=FQmWm9FT5mukC!kPM=h:#nBwtQ5AiD>YG\&%*EDGWbt
cP*P9K Y59</yaLDujnPeVGbwjk/k6E&bm=jF8JQ:p<d4E&t*1HdZuN#k!k*jly=5h^a=Z9:ny%q:YGS?5=i^AS
?&H8Wp e49BcAN!TK<Xy8i/k9kVhA:wQ%Q4ADi9A?=5=ZE?IC!n+Aq+L1QeniStm^\69XA&kV:uh6L?kw*udHX&
pj4ZPl n@&?uWG%hej!$q!a6>c!AImFB&!!1^EPIPXWc*M*t=&CHhk+SMp$QNKj>?L8\L+GS\=DN9J&Y9l<jEP/
t8NE\h VFwlI1Rp?n?pYX5aNhu*NyVD91W+mcKw^W+RDW?knJ9>P\\y!?$t&yL8lih66>=u9e@8&StpXhE+6$ua
WpBy5l 6?%!Djj$tC?$tY*WlMN%6Mp/t+@i#L$^w@?W:Bq8F+D4E*j6$P:iX<X/hwtmwty6?aCyc:cb6F%l/FZm
!S6Thj X<c^>AI@eC8ldCX6e\PlJF1mntEI#d>qFNZ5wwW&W*DnN#WZcqjYZNB16/<AnFqe$w1$SG48*@hGDjN/
6T%HQ= T9=iLjii&WEDjCy*5?F9e1<w\LhSCmJX%d9*%XI@:m5pqca>MQm&bBG=y$e+$d9qhN=GKEE8Dd*D/Kp=
JXEeQD #m%umDuZC1C6:ejjb@A5>hu^@BApu/&=AP%WX*Pl=wJ%L&k1&98Z/TLu&b!LNA##\qm\d9w@*Ph4=6HS
PQK>d^ FuNEAajVAnmW#:bJSp&L9M6$EHI8%$Ata1Cp!b@Md/h#W%cWYbbtiLYRlt&%qW5w/qhG&iNe\+IqS9+F
:y/PwP ^P8=ZlLl!4paWL=b8^I%q9u8PN8im!G?9M&el5@q6Jbn=FVhW5c::BCNbl9!hm@N\8P:%mJtHCJ$EQjm
1\w=5> MmHRL^5b*WkiT>bqBiNk5tE4VN?i4AtVW&=SRNPC^9&A@RRhnuCC&YGG6eVJHCXRFcpJt8ke+RR?l6ba
dHap6Q Vy86$cK1:DYPb8+%d/p%y6>VV#NaT$bX\!@mT/qwySH*@ZA!C9yk6DXbFk?tAA=5N4t*bctpM9*DcM4<
SbcQGY QEAH*>y18b>HXPX>n&BZTBMFth+q4PiIl#jaGM+VbYmQ&%1SmwkQ=hy&uHm+%dBIyKuP6X#IN6IWVS/d
AmjTb# $jb#VFL*qFa+GYk=V?<^n=ZAYF!m:dKCFFNppIN6LTWdY9/ZcTDWTwc$%1+AC:9S6yZ=:+T*qZ6:VCeF
cy:ph# mHe=B=9WQWG+VV&FPw#^LmIEdJDQ8yjiH&h<RHnS/*D@=^a?IZY4&X9BWHE:!8q6hpdb!6+SalFR9wyn
%DH>e! GdTD#*FdZ^E<QiJH\>cWShiMe+tcLi\99iN!m44HecLwPLjM>H$1da!C=^aBE>M/mIy^PGK1*eb#IC:5
-AK6:$ 000535359d5001202b3 Page 33 of binaries1.zip
Fb*ae4 m\bWd&#A^eF<Jh1Ypqdq&8i>P1mbI$JNnCNl%?C/h=wMtMQ#4?!$pk%>ZyDKD!:SR1Syc>:e<CL#keBD
=DVCGk RQ&:qFhddYXiEL^A@+DG9hcpX<tGqn/SH6J1LkkwmTi8ad1Y9uPdPCHH=Y5ay>waYmQYBM1AZL:j$D5p
D+Gj<\ n/B=?LWpud&+PS%Pm#9!^a+R>9PDS+Pcb^Zn9HKp1HY$DT>8RA1YY>WqQG1kNL%a+p@Pw/4>iFWJL?ud
@5F$HY /=ui&ZAY:AmV^njLLK$d&\Nn\a#XYQlD&*<bMWtJqq6MiVT^&5\Z+V!Pi/G$:5AyNlCJHY65N1lDNK&&
lGncAR %SKi4a^L6jXu/4lQ8+L5!FdVZ&@l6BRNV+<<BNI/nlNqhYj9#yX=S$A*/>+Nb+Gtc&!66h6BD4dViEK4
^E56JS hT@<k:@wP%n*@6e&^y8N#R/Ve=Fi%yKYNdkX5S:m^?#\eW%<PjnSIX&Qaq<kcCHp*?bFc+8FTS4TD9ZN
jtW/=j lleB=:W+G>@\lE\:$5I<Ic=LHPe&PLl?6bi$VRpu$#&HkWPRT>&pa:ut1Zq#widC59WZRW1*@>e%1Aj5
A$6Kh4 8PWRdn4adDMqEZl%a^t9H8K>\<^PHnK\weZE>R=hn+49+B^5RIad9VEb1\W1XlGudpN@udDh98FF$@>B
DVa>dP @+nb!Xb4Z$piVa?A^bP@n+^!&I/4NSi1\Yce5L5b!k%u+a=R<&aSJZVd4%e^Y&F9\WPVeM6BQ1bP8E^9
iLalwb \PSPY$tVG15=?6mPNdk>apeII9liPp!DTTN\y:YX&*/kt44?#IjSXySJ=%JQl/N1NJChMCJJ?^KLcAPQ
CA\EFk HFC5BQ6HewcwGM&IT/8ScnWZmHdd4P:WD16lB:dcnQQJcLTb4bk!hA?numF>Jhwba+*w>dBJ8ID#Fa^y
H*91wd kTLk:\B@XqI<?cdJq>kn5NLWNC\PRe99b4SdhJ^d#jA6$cRu8AhRe<ECWwdYuZ>LcFjXd5e+BJ/=F%@k
pFCW8^ c?%F&j!%qX6:yp5M#>#k$FJjh$uDME1!KPYR#inJdLajb>QnES>P:HWEdK%ER?JT=E=P\^8b9<y%cG8b
bdj&NY @*de<N<Md^WpeQYTCPRE/qTtP/%:Nj8==c!jBd>FnFc*ciWNY\FQVh=ldYduCya<WkNjTSb6#QI#9AaN
$S#tV/ GjW+St6#+$Xe:WFV+8@c>\B8dGLnqk:m4tWWL/MPZeh$C/hi1&EN4Wd5eYLBei+tRLI$9n1B1Db6l^aI
C5jXl? kqeH@n?>ALHX4TH>6lEi#Hta>T9l=#hY5h&<VC=piLcABK:uK>JSl^Jjtn/1$YjAw$#pcNI\Pe%>%=1P
WyMSeB :+He+JE&I4eV<Be+b>5t!@6YALcX1F8ab8F&AjByN9FD4NXNG*mC>MyJQm8knEi6d1a6AYQR>myFhYQW
H:i%=% +\K@AJ1mZP+%<^<&/Jnhk8Mq:L\E:15^D<%aBq#m$#$t=6KL>%p!Q5aFqVm>>1=1wmF&pyGEAdj8anVe
5uIuSq <PL/M?9QkK/y=X++p$DRM6bYJwi&yjc?FDGZ/%GDW>*py&N9^K95lhn6J#h6b^GH:VDLd!P<mQd!Fpej
LLH8Z\ H1GG&>5aE5u6jKpZ6w!86yLtMj8+DI%pQ+cV@%Z*Zdj581PEq66D/9%A4Mm^lLcFS<1AF1lcTVE@5+WX
h*pCSX TFP+*pm>H$8wm9yt@WW:>9/<A9m\=!XZ9>w?ynuGXq5>HPh&>McN6wQa%9*Gen!TnG$pAj!/tmlbGne\
kJejN+ +$cclu?6nZq8i<1p56qtcKQiuc@RkyXXwH6\5RkhmIewpWe*%aL@65d5W%=y?nSG%PkGn&^:GVYDyINP
L*X>+S LNG5eIjJJ<wk=AA/*4*Q\Iw<dA@Yd4>%NjhZGijmE>#Y9Su!*^y:eb?y^1N<?d1^G4?=4J?b<!+@M/DZ
ynhpLC >G&c&Xt^@L#a*pcy:XGk=*ZkCWCec1hNNjBFH5AdQNbaajdY&hu*DCt*@8iYTPpJ?:tqX5S&wuaq&n@d
HtynpG Ci1^B#qFyQY4dc@Y>6eiBuph5=%mYDqPN=Q5VdX9pDiF=?Vm=m5P6ueEc1N1\^>kCFZ4u88Ra?q5DaN*
aF$k=a T!k^V>@PX<S*kKc*hwSw+hk=$4ZpD&Dpajbq5hl=G@jjPFJDG\G@%lLGwNq96+T1nDhBG=*D@nM:$hYS
VihI#y 1#&<cV6R?lTnK9aQMC*E@1JW9:YTn%w&+:d98B/c4%QhRH&Vyn>k&E:<bDh5mZHQtA8Ay?BeJBqh&VKQ
bSp<9= @I9^P5PK?pm4ZjF^Q9bq<8+jwGnRyGjRwCn&jlJm?ISi>91LwI9ah$Gtm^Du4c5BKhke/*$k?hkL=Ga+
YPGFH& 4c*wAd&^\9AD:C&IFde*$G#N6*F1>nJ/qpWki:l$:nE=>=A=/&EL&%cV/QwBwP5<LkBm@It/CDWR?Hje
Cu/eDL 5ylIVj?HWbX$$EuV9kTbyBI*e94YGl1HipVPYSB6:YHpYN6JdB*Nh6^m$BQ6Ehm#9d<C+q*HAp4edS5Z
XVKNkY $>yddG!R*#Ca=NcBMq4JlNWpJnqDeL?KV$Z1c=TIuLh!Ei&#edbFewLCb:B1dRdDIpCVuJ!a\L4BG1NL
YGRe>? Hdl+P#1ybEy+?L@?+1bcG!e8p5@?CpLe6N&K\unCAAhRK&8*4d<I4PN?4a+:h@RZeZ=/n@P5\=lMc/A^
dwKnW/ uCC8pK#qTA%D8+YPQh/DB#c$#BM=4\Y*Xt1S!K$%mRpGlh\jR6t1&q18JSiw%ZAX\FWQNy+#BJTSEl!=
tu>RPl TuJqV>wPk#8\G5^npD1*Z<W4I!%&LaHLb#6inSmyk?hNhNdj86uc\4i4wYF>aFtpyaTlCcjpIS96!MXP
4&K?=1 ykYcZe?XD&NZ<@SY+^R@*P$DZV=A8J+JJ\pt1TD5mMWR^eaNJ5PJC6uPKPuG:k=8Wk!M==A>YeBS8=$W
6byA/m LL456!C#ppPEYIPwqpDSu8N$QMEFpqkXjmXc*hp/NuGRt@yt^4h5>^FnK4m%>>N:Q4Pd>yW1h>@N:n!?
Hh&Jq$ *w6QneRl#pby@#:k&#&+yLuqky$h#F*L%Y\4e1!N$ALCX1P:GPl+AwihWjp$tkdWaTwlFpwbTydS:>dX
JeXZ%% <H:MeIlIBS$t6YX&bquh4K5AuGb\h>>a\^dSG/i/ItIHeT@TX4Q%4pP15uMa?ZHTuI5Ny\<w9eJa1hp!
CKRHEW n>PJ8M8\wT8QYB59&qyJ@hRm:=1PP&JtiHuZPKJFqBCEu%Mh\e&wlBlP=6mmyJGE8luP&8*M\RWVilKq
GSL\qH p<p1$Q$\Wja\<m/wH#imBKy8^*XHNQt/yeVFTFe<L<dPl$jM#wFt$/Z9jR@@e14m/TcphC?T!:Ad8&b*
1m#lcW 9tLDaT/GhJ8lb4qDlLIJTB%8SqQk>!DD!5!L*ik5+AcFVMyi+F98#G:cD6\JNLYPIW%4pcbkRpHyIl?j
^m/MS4 5FIuA8VA#1$V65N9*YB5jET$NYRY8Ba*>tw$5DL1*Y#1w?cT#8WDS?^pX=wPc5QD@q+q>*+689hwVA%6
TqF*9/ ^IdYPY&*c4dYt$nnp1R!VdR#!QAcVmDuacDt?w5kyS<AYkiSatlK$HTmw$A/h+^yJ@5aVY+kA$Sl>ktp
GwHQP@ 1?%\^p1u<6BiMR=cYWwle%@n5aNueEeh$5EqQXSPXh+CJd&EY??B&$l48/\R8LW>m4wJHX<c@Ca8J5w!
D4I%y8 14a!6+FL4wkDhmm4\L$:k:YNSuhqGX4t?yH?PeHpFYq:/&4EmVRFyGQpLw!BlndDPeDJ5d=^8\*Z+NMb
#FhB/? =dSLP1/^d<GPuSaJN%qwdDb*@Pp6e^tc4YZ8piE8cLYd?Rym*Dm?hRj\<PcYid8IPDqNY*p\$&1+ShbY
8uVBeQ QlVp=4JKXG%<6WSXDL/ak&>Dc@N?G:1GJ&8*G*RFqQ&wmbGt/DDaVkLuknc!:tY&%W=ae#YMknndFbeD
VViE9K $JaT8BX@H#?+/w!nn@5PBpaV5c*b/Cnd<!e$dd5cj<et11Qnm!eu5$+GQK8YeVDTqFpbA!*H&5wHNE++
#Lq>N? 8LV8DIIF*p:haPVYG4T%*5eRptN$nwX6JbwTB=P$&6A6jlMe+Dy\5E/Ri\Y!t@p$!mbdlpZ:L:#e!A+%
h+ei!T \A&qJX!#DZ#MN>6:V#nic>6nDwL8+bJK=/&\JSdaVW&uZAHm6ph^$&4P^!66BpXdVa*MRuDSRM\\%&/n
>d5EQI nwQ:!N$N55=*SF/:Hi:jCN1Y/E$eikI\nlq&F1l:49a\6kl&P8Ai@Ce1kL1Hp=5e6FMZR<8tTnu+:lKN
*y&KIT #X&$><C>l*n*utF##BM/4Q#AN&N9AK&&?5Qt+1BtS^D<CX4Zm%1IBmFZWNB6?IH5L=5ChJ#$$\uDX:Ij
QZ@\kL L6beYLiJ89JR=wCDD^5$6cG@eBIqYdEHX!A!&&EITY9yG\4hV%TRLj%+@Yy?X5$^9nw>c=!5k=!L&J^u
=9m5ZB G<5CFV/p8<eI$jm$BEC#!XktR/8G<ZTk^w8Mnq%=:N:cth$yWZDY\tkIPueN//+F4uYZhSpB#>wPW?j!
6e?VNP C8adMS*E=BFyCHdtQn8#6WF$@ypPRq/FaJXS$I*!dD@JeS=P$GIMYkjKF#@RYuKe/H?I:R:CpHJ1qV#=
DI6#>c W8j$u9L>D5!X\<m^je#KINLGX>uJXZb8ZeknND1M!KLc8C:m*Ayw$RQM%%\RNt$H^FY&\/mSKJ\J19dk
JIDY9b G8SV5C+RqCA?P:*\4?$\?QCj^u&a?SpSdB>T&y$EKamd>VL/hc$E*XQiTdTHi+tGNiGamHJX6ITN:Auk
C+9HWV P6hK/?#*QRA<Xw*ueDG=+=l1Gi%++MqpMEna^6BD8Fy#+hwT=bA1:GY>#*HK:HCApC!+*P1y*W/?:GHN
1XSAtd h1KK$SGqE*#+nV6P&c@k=BL4!#nNDE?C\Ip>GC!!Ne65:\>HTj4+^BGDR$G4*5uSIhZaAn*kWHat&e+e
#Fq*<# h5KDbn%5c\GdhMFY5l?6*Ph4Nj$Cpn6E+DmBi6X&k96+&:C?GHp\lMml:B%PcPJaV=GhkbjXDVy&JXuI
9V?6Iw E+D$5GyDD4X/5m6w>jNb5Jyu4Zn8^BZ:FY&Z>ZP+^S4nWh!>ykZ*>PC?kStFHVI:pVAT+#nLiHR#Heq/
b#b6<D 9JZP$:KQ$ZC8bBil*5^iq4SMGXL:jVRb+uDn1?kL5Tlq@WYcHMGGG$/m:dN:4QjXdpip=B&i\4!5R^M%
#JCT1: D9wK%4%AW$8JywkX/Fy6y%Z<@IDPC=4>!u4ei^AuqLAV=bB*D::wcGdD<q\P!:4/cMm5h9NNjNFqFce6
jCLGTE Y5<?QQ<R>$%\=MD4P>hIC!IR1Yb6ZWEVj<1R&nG8*P++^d\>?\qD*%CZjNAa81WJyS::jT\jcN>V=APj
lIjlhZ R8?h$b4RwZR!8y/\i6AjAp6baYhdwi*qc&K8%K@G>hK:QElb<Bq/Y++mbhEVK6P!9TZ:aX4Jc1bl8a\!
eV:=ju Z/l=J$RW8P9H9ki5>%t*+td<\F&6NBlG6EWLmePSNE*C#j^$wNc4RNh#TF9m%@i^:lHT1an:JHI+<+AS
TyA1?e /</k\eHwNaA8At!&p$DZc1I4Tm4R%Py=W<CqW5eccNW+w5Zqdc6^M/qhP*c9I99b#H!DMk@ZmF4NVnBV
wKT!h1 F%WdPDj^yatMl=GLki55hpNiGYY9^aE5wK\=!I^WceTJYWHE8VNI5ZWN<QB^*p6CiBqc\um1pW51iH9E
*Y=PAL 8$SX^4Wu?R5?cSCcjS^Z%PB1Nq^9\Qat^>qc8Mu/*j6&8=GF:iRIjiaMb?H!Qq^?GkKH86qaNd!JK&At
>!Ie%C 5A^wS<mSA$Zdl%6dMjeYwFwBN5+PJ/A+aktBJSDMMecAIkDYKWSKmEI$e6!CJ6\VuKDI\mib/&jFQ4CV
A@?B/e nK#IBlTwuWT!9uW*EyQt>4NNGNm/Sdb>jD?8Q&iHIiKG%I%q@hNtEGy$Li\&qjBtdt1M%i>d\Mtq$eKh
W%Pidw PXARY*hTaAyI1^pLI\PDPPGIWBWl=TVXHMEK^+qdX<Q>D%J*&EuD:TH!p5JF%\A@a%mKaSk\:\pTW$=T
-AX8Hh 00063d308b4001202b3 Page 34 of binaries1.zip
9cDucM M1pw8tBRL>?>!+44GBqq?S:#1?5Q5:Mw/k<*Z1EDC*y^A>5YmR+&MeK!R?de9m%LYLnK\M8hw#%&eheh
1:TK#Y HcFhh#l!\JKm+>m>X&\6KmwtW%Vb/LwNP@$1HYNR+@5I/T*Y?:nB&e=^u8DhJNTQ!XEDa1DcZlSIwGRq
VkwN=# w!I<!+:9$SY!inLZ+KEn8CMA:R^RlqG4Z>%$b^&8WAhHH5LSV??^6hnKbu&XuEB!?AkSX$eqFX!N5<Z5
&!pt+: d6#wbNehP*Q&X8^i\SFkWpc6%HuEMcInl&EJ<1:Stae$Sb=EaRW*n^CbTIMtSW>^q?<\PWMeJZH6Tiap
A8wCGJ MRem>\tw^\+$yl#u15*deYpnQ%%p?=%:nR%@pcKPbuMM#ZAlT66eqR^4qWubKn#C%SFwjeA^SuMYe4a/
b@=aTa &^+81$#=66IMyw>TX>BJ%9quQ<^pq5cPtB!iMJ\p&$uib+<+PTe#4I=#N5dQ=^nu$9Wph!NPMIjR/9u6
nXkj>8 EM:ZM4ajaTnLZ<DDGV9PeaIAHPikLNFJB616X5QJ4Va\54?&*6ahPB<d>EeP8Sn^Y4jkuHIitPE@$VCl
nn>MI: PJ@JV61I8R?Ade#5P8Khj=8&k^NlhQh!^=e:EK\F#yZL1au+MDP^cGB@6R#u#P/!A8?8^=X:/Pm#%au5
<TDWAP :=%%dI>5:PB8QGdd5+TZ$V%<u:FBucq@PX:4FweEZG/^6nlP+WcAnl!EnX6Sa8*HRVhXRPt6m#WZkGF*
e+iLZh YP>dAyCyXtBQ=pQb!R6p5B#MI^\4>\uJy\?cN1d$Pw!Y69b\>n/KndJ<$j\1P8Fnt!G&>c8&*Rekcb<m
P@tC^\ P@lNFI58Ga&\t4%FT%S9>cb!FdZF&tI@DEwJCN9+Km/8\iXCuKSkYhu\NTQ4VpJG\n8G@b=eRME:5Hwe
ByY$L9 lwB!d=Bd%FM5^pdqSANP=c^:p96LEL5lRdM4cTL@Pb#<9HpdKTlkbK%?%Th\mR*m^h*iMMc=>^Aw+Yc#
8wi6*: D+XE%6y5>mq\kyy@VRXXe*tV^Z+eXQDa9kh&=uCKA$+:\6+EJCuYAhG!&AXnclSiRnEG6N/M#F!G<\TQ
mS:cFb Rat!4M@Fd6KYFNMJbp:LcX6L!kqFNuM4L95*1A88SB&?cGHaBd=6^%8NGh#&Bu%FQCKSqBPnK:L9:T^?
QRVBB^ &@S:mkqi%AdI\Dn%#$FukpPpViM$+DwRbeEd4nMGBCH?6NyPktqqZD!GBwiwZDI9J<q>aD*Ay*achCZ<
c=YmWS VFlN&ycyJ8ahknL?JD<^+^XeywDHuPCLVlBny^lmQHCFq5H&kbHF$:N:T^EPn%ZyEBQd=mW$bTwK44m$
Z^Gh6Y &6budWYQnw!Q^:wFw4\5tS?Syn1B+$SnTZik\4Zil&kba96Jdq^LnkN:b:lNytVD*VHG^jcTKm/uMNAX
596jhD iVu:KTmZF1ZR*qAiPt1h%6$*>tK9C!:6*L\N8Sp@ehwc$^yM\&QdkmjBq4mbWSuj*Z/==uLN/#X9YLjc
kkj<^C nn8CTF*HKZa8+<=ZTy+@/B>\uaC&P#lq^=njn^1Le?/=$yZV?J!BuQyYVlLTMw\a>:B*TFup=h4D9^*C
<L>5uE TVt+Y^d8$Mj\Aq4ceBh*G4P?nM5=RXPhbjT%t\8X#J=8y1N+V+Tlnltheee&QN+Cn+b9jBWu:cAVlTjM
XE4:RN Iq4pbnBFd8wqP&\#^=tRt^tF4jiS:9KRMV%Ja^eGqW?cB4hpiIIGJ>6Q&JdwbuIjV#J?#n#MFytlR+!u
>KM6+d =+HD+:u*!4$9$T:@dCu&Y/mu:%qFi@*ntNRT/T&=Fp8\EuX^=:aNL?AY+wD/hY64+/6IZ?BwESBLHDGG
#KdB%D AG:YD:&J/Iq>C+!jti&B\CBw&J$!9CeMN\4y1>tDXa!VYS?wcn8=wpSy^It<DNT>ky9&wFqF4Hl8H8:4
^Q$YB^ T#8nHZPebR6cN&?:b!<@AhtI%W68qNF*Xt=>/D*TqubG@i/NB&w8P&mMi!jG:1@m*6C+!!*V!plh+QRV
^&wbFN &JjJikdBNe:bVnFHkq6h4w?b$&RmQXHG#!hLFC*VXmVF^M8p4YwQb=dljyhkiZce&piI/j^8QE:ZaY+j
i?Ptwn WL@1:u&$cL@ZHFM&i/KaFT1#5XXecwt!kLWHEc@@MXw8?*EM>ZDK1/$QN/yH8WZc$nR\:Lq*%:!J&4dt
n=XZQl An4K%D@lIXiTNBJReLZB%+V$JMhL519bV1+4D*lK1A&dC%ld5W<Wh?dA#b<lmD*F?Bu*NMFhWZpAiJHe
\<GT+I ^/N<5*y#!1A^^4nyD&wyRu9k^l:c#@m:t!\+WS\*\>=%B^8>cd!CQE!SP=5\S&h#+@Sa?*&ky%eA$nHH
uQi1$j GHE^y!#k9hcp:Mp!Zk/ctkqDH69JqeVVy+!iaWdbZ!>#EFc6>jt&HTbYStF<+RI/=QM:>>KSKc^jypVX
BG%&^Y QTZ9awt6BY&<\h#jh@Y8DT@W9G=4\iqbZZt\8mKi%h%I?=*RlE*1WcaV=mZ5k>#*AL4DHPqJi4%HH^Eq
J5j4*R :eFX6yN<FQYpaZ$RZhF&554RVpnS#AyHGV%du$ie&6*:QkH9H&l>u4<INY%jS:4a!99cYN<cC&GZem=y
S9:>TS yh?\QZ$bNVi<WG8BRPB:Hh@DRA>5dT>KK<$!&G^5*Ge@lw6!Mdm**&i>V*PMdcRi?=PP+NIZ<c9^h+#:
lyNY#h ^eF!H^Fq%D1GW*bPL4ii+lV%=J#Iu@j5^X&jET*!L*dD+Bb?hG#4<^$l>t4h%!nb?Gd>NtP8^KF!j>HA
J/T8h5 !u!J&=qi/8G<&:Qle1*F*wK>l5abHI=n4MiXa<Zq+DS9Au9N+h6V%Qh$muM9wRRc*4bEG^8wV>yP95iL
XTwq#c ID%qHVP$FhCY6QG9Q<%p>W/PGKuLnywpD4/D$bj&PH:ikV6V6:A6:a#bIZ!S*8cTlJ1cCVkabSZSG96^
Q$m=Ge k:WBc$8nPI@cY9nYhy9=mYHNdG8:i/@ky8?IiGhRha^hb*K9\ehnbZLK*\MNq#Fem8&pBZCia9wINc@X
?&Y#X$ <>y!&6!LV9lY:#=%4*GY/>&u\JQ!GQ!Ll\uV+TSqT==66L86&Z>aXhJG6%>GT%QG9V*4eTQG#a%$buiL
\^Xy<D SF96<@&LciaYP++D6FHLBb#%e?SdZa<mQRHl>acFMhEbXPTjGi$YRTw=:amKkLpT$THuZ4c\:c+aFXEL
<%>I*Q kb&ya$iHI8<!#8Xi+$Z#kBB#aVj9kCuZ68RFI<<!/&JIKN:Zc194!nh=M:eEP<T*ad!+j=<9/w8K:^DH
h4CBwY klbm<a+h@YJ+##GiND%CS5W^n4KT?\/I5Iwwia1<Bp?/mldmZ&Guq!5:Vq*DVk\qTu1+^5WNLCZN%q9Q
mj8lcL J\q!Hj6i?wFEZ8dYlNDl98K$$*c%8jYm8XGj8ZEw&\T5D:hXEh@^Sa><5YWiNND%lI4+p^AcjDqYlw?l
j&WS+w 1WBp+BG6anSFPmI/<lKAW*>XnS8L+d:*>=A<LwKc*hbj!Za6k@i:QA@leKP^&=p^heNR41YADcE^qdPB
nctjR# 1S\m*aaZcQQiK6/@b9am55&^#F%SeW?EK&&QH9tmL+wmTASp=KMPCR=w4I^$TDm8YA#Fa!kc/=mK/6ZD
@6PH:A Vapui:DqA69$HktGQh^pMp?^+&CNR%J^:#e$yIkY>=k4H#A8h*FLlkT8XamYHKEi&nV>N?XwT\Tqw\GN
RBHmjX @i9/tMK=>+4:Lq<WBQIXCPCb+#hG4#HiZ#btEyPVp+pppFTk9/5MITY!EnHB4V#<^m4e5B?QdcR6jV%I
QFJik6 ^S&kbEE+Y^A6>muSwctAq^>>dS^CXnbRa!lY#4/I6mTaSFjequqyH:m=ZZ^y9%5/n>AB4N9%KG=!DnXn
Du>Ydi kT49QELEtu%5GcMy9TMKA@*YGadD@I9P\TuY<aBW9dTCuVTM8*F!yKmA%G*>4WbZIb+cC>E+Lt#BVY/d
N@@b5e ?b:cY=dKbm&*HESWaq/C>$<%6Fe/p6u$>161T\Sq=GSHyBD::q/F=^D5&+d5!:YP<S4n<AV:ThW?hw$b
wE1:QX tbHNMEuI&hd\<*/=kt*=l#9YM>c>i^<DiB5@Zdwjah19+H=YhI:Li*49!=S1XWqGc%=RN:#\adcyN5I#
H<FjLB *AXneI=6j5<WD>8WD#e<h$nmP$i?&QYwI\De!4wSTLWC1EwH=$?AXwH9RJ$8N!CS<%:N%A&DXZ9+4RiS
DS*bBC e9i5Rqm+J?+8D!yZ</Syw/?*u@cl\^%@n>KGh$jLHQWq9b$GNmMR&*Ac8dQGWK^Xt$w:?J4G*<1QC/YV
NT4mM$ 8hlyTMjR:Vu!SjEhl+T49nq*P5c1Vi%DZQwiAlJjwmc!nuHnkRV5y?+^V*a*4khBDkY5jI66*CGZ?4aQ
F!jVLt M*!+*^=%kyI<&w%VDy9=$RZXJTi&VI>TWFL#AyNDk=cqpKYequSYEl&Sa8>V:ei&w%8N6N\y:e\!R<pN
wmBQS$ !Slu%HK$a<^Ee4QB6Y9yM^wTR^=4D%?/\Z:5Vn49Ep@E=h9i:&W:ybdnlaD$:u$jc<#RtW1+*iJShuIX
pC84%k CiXtE/YJl9RPy?46lNZRQGd\atmi*c#4mYqbk//P5&lb>t*DpL#^XcDwTwb$CYb\c<iY+<wBW<5c9K#X
%i@/#+ Hq:GGQj!du4\Bid*5NNmeM!jiZpI$6lEqDb5!WFemQMlWE8eyX=ibkm&%Jd*DHFQubGV&Qb%=mjAN+d&
1m%?AT Kh>MuQq%#TmeRM:4EPL8XTmc+AY?mkB@D^!!:Gw!tciaPm$bT9\MY1iKLSGy*a/EjG5%&+RStQEKP@1J
M/e/jj dY1BR/b1@i4hdJNt68!L>y!pPbH&9u5QPZe:&PdDt:qCKYNJmpS?DBkBwaGPKcTTkB1m!de>:8Nd9ZJC
K&uE=Q &w@mVDM$d1^HDNE=^k##Ri>8=l:hYEqAGWu6a=^6V!HT>SjZZ<Vb4t<$G>59+=A\+tRuH!M>&W:^dP6d
$L$=N# H4uVwnhc+EZH##a&q$^qKec5Nj5%pb4a*<iwcTAq%nY6TP%tG>>/$e=&B?*V:MjYaX<n11J:Z<IbDw&+
B#+b91 LG85SFZHtGIj8<uEh5wRTy4D!1lLeRnPlX^@Eih5Z%4NS%ywI#Q5Sej?Q9Sy:/\DWj\\<mw8QYWnQI!u
uZjYt\ >&P@Tb?6NHSaZW+yFw*W9I:$^LNVtKZWNqY6Y&I9q:k?#FwC9qXePH9*dYMtBTu1!IFkL1KJDDJCY5eM
8MXAnB F5Z8D?+H<E@YW/!nkEFej@HZi>nl>p#+cJDkCu6Qn91?ZV6wbS8SpMnMDw@B*Smb9T!NnT+hGc*m^/aa
qAH4Md Y6b$FA!Ctp^d95i@RWc&E#=aV9Eh&pQpXXQj$16wH:8Y?c<$?hkWT=NbpbkiWD<XmQK6hR!l$VEAtLL+
uR@8bF mZq!mFF#bHhnl\E:AwlPiT9*Z!%5M6Yt1uJ<6!?%q%WqnLXXT%SQPStQ&j8MF#@B?Bm!K:k1Wwqh8WkK
NB>PJ4 nnEX&bYLwTtey^m:Mp<ikm$Q<\>\$e<dG\Fy9/FIh>%BB#V5*hb@>#=<Rhm%k*edAFLcm>M+:hQ5*IJk
E^HJ&c <a=N%W9WdEppmbaMI/EqX8cn+8#+DdKa&G*GWS+%V$u5e=!>>\yZ6qi$^qi4:GY1h6HAccybip>KquM6
\q^J*8 ?A1AEyRR11HZtI@VV%*9h?BG^Yky&edF&6&ut9GI5u89&I<cW<b59cYPYVMm&Y#/BGXh$RdQMt4YG8cE
6?8MV5 $>/$qu6+>^a=5S!4kSP5y9lP%/Qaqi5IGtbqASCc/tcMeTym6JbnQEphBCeS+%96GG<a1yVtMKBV9l4N
JXZea# JXLRjShI^pXnHT!jh<P+Fui:a#^dG6QtyyIdp/@X@Ibn4C/=/e!j=Y*CjXut1NQP6l\l<!iS9494^Hj&
>h\K#i :/P>+aF9\V5knkXK*t^Rpj!jX#uYMWM/4YQI5em*nJ=9XKB$+9=q8JMyDyukWeVcQZ9*M8p9t>Jy4Gp&
a>?w6a 8hX1VI\4w^F*CbCTJJt*Z#ceA5NnL*t@X8Q5nX=&w4m^VVVD!I:^aT*hKPHeCyVQJdKJGItG=Sm=KVuF
-A89Yp 000fb95989a001202b3 Page 35 of binaries1.zip
N/NTK6 MDK1d61ieTF*IpX^Z$m&+#pi4E!LI*AI6LTt8hp<cZ%Qiceh8nGqYN4RNF\L9aAhhnYGD1ycGu4^cd%:
Mt>Te1 /E^i6kiF!dZ5!EPMX^1q4ph^b&n1FM5lYqM/pcbnuKcuPF4!e1%nJi=FcnI>>JyAFN%JR&S$*Bp:mJt/
ZZwKlY t4icE#wN6L<*JLc$?:uY/H/?nH!:aat?4X*C6&\GHS*w^I=b:1NN\/@D5*b6S@tP4HRGcNinZa@T<e?9
N*WG%@ IFJEihW?h1Mlp+b<Em%QGa+j^TauEh?61!@jSly%Z?QFi%?m<&ZyGP?!ae*i5n%Pt5*lIV=@m9V5ZiYc
WPpA!+ lXBW%d^RW?c6G>%i*PF:*bVNcn18m6tWQn9j*=cpp^<H#a+8\qQdkbwZpbw++cFIhC!#IcSnVZ1m6JJ*
lj*CNY \LR5wu^#N!Ap?6Hm!WN<MHjyaFebRtQKma&l6DDd\QCXD=bkXFJnYp/#S?n%ek64HF4FhlilE*j/?KuC
wYm45/ S&qn@hZwcDPMhL+#HdBqG?jY<$dG5X#Qq6GVZw!tJJ?%l#Wky\Qu#6ClD/n1nCNIi6?#IL&$EL@$&inm
aDK\Nd Y6yd!XW6niN?#RmwDbBGd4Y&iwNyVul9beteMMkWIaB!c5\k!&KQ/5=ZeC!ajNtdAT/bD:5BFAu/1mG5
h4E\Gm ABCNTn</i:l1/+*q8E/!BSt%V:Z%j6TaNjQiKZ+t/9J%P1cl=P1qnJCGp%j1F%4cicDXdq/D1whWRF?b
JE+?^M 8cTAuS<SDRE\>6QmF6nI5K$Q:M#b^wtW6!BST&wHtQSXjIHnN</N!1ucjtScl4L&<K?ZRa^^nI=:iyC6
5LTAIT j#Zb6dh55:P!qRL9wYYbM%8mJZabwHCY8\d9XV&diKVJA?tn:JAmi:q\<6=<:EAp<cSXG$lS4wDGDEXL
CEaSiZ I5uyT?4uMF6qTBn:M^9b!A+@A5p<>tuy?5H!VTN5^ywhmm^1N\Q*dT$l8d*p@Q#t>4Li8/X1tD6ASyh5
b8m*NE Z#uQ$qH1&PbdTAEh8+iPGYimTjNVe5#lR&4cT##L?JXmdH#H?Lc&u?FEyPAMjbb6K$kaY$1!cV6W66cX
#YIql9 1auTXpTE8ZcQcW:KXK*S@a^w!\KW1qIHmhq:WGX&Bbpd4=a=<Mat*@kN8u++?kiPJ<:SRGYEHK!W1TLt
+uH+C? FmBNGhimK<RwC4V6S/S9XB1d?IJ<*t6hPkj1pLF%5Wuy*6I1*%4VqYX8AeNRa@J6#Y@KZcF!?t=c/6cT
F!>4bi mX^KW?ScPqAi*6>b6*<jp%KteHjtXC/lDCQ:m%m5mJVlLMpt*c@6#>=Hhi<#?Nhc+68q/>Pd#cNmnI$$
KBuLS+ nBPFj&<E@4*88&FWck&*<DKZW&=ADR/&q:6C9dcn$QKdmaM9NGdIHiJPAuI\cCSC^VWTN#C<D/mjKMyy
lKMik1 !8=ReNd@^4&tW>BudT+dn>%nLb<\#:cCQYS8++#*#QPV!#8endE\i1HnS/Pd*MJ\y<HWTwa:^DanbWc$
Y4L6%V mn9!NMwJiFjl8aSwTw&Ve^u9ww6dw1q6*H1K4*I?lS4ZpFFCmT=Dj@cQ8YV&qe<QMi$qZ\%1Im*Nt8Eh
^D4<65 6tYhq?Y8\k5+4qAib6@?i5tqb/+8HWStnMTV>qu1*9J6?Jtq\jYNX#1?S/iGE%J$G*BtCRYll6NAZM#\
yQ$S4@ M1!ew8k$EBhj*t99Lh<?!@yiYh%nK^*RXby*\Kba<!GjWnBTY&ZquTa5RDNGWGwM#XRiyL%*JPXw!YhA
w+Abmc mXX59i<nP$PPd85P*A/SIWWPN4mZ/TE8w?PIXd%%6aZL1IhS%i4J*i<\BnDL\5\qXuSQmb=tc!!bA:Xp
HbR^pD FAnik#b/kZE9C%tMZn/P##ki5hT4&j6i:<k<TII5IFD%\<DB=NSnwMbwC5Ecq>X!1uKJJh/qQn/Pqiqj
RD@hSF pNWdtB69JW6nNV5R!5JR@wJT:cdu$G^$E=uLIW#j\jAd!44B1p1BYtuhyhXTY=y:5NT!aw*/Ft&>N>u=
pQuPlI +ap+/?LiK<!8I6b!nYVwa8Du%Tm^mBJZ5nPWnH9Bj*nA#mVD$L/>Jc?Y?+Rq:?k>&<1Z4hGm8nN>XQMC
$5Z1+t netd\!wq6CZ/ql*88ej$Ia+b@hW&:8<cNyWwi\&i6w%/GPhyG&mS5wD9GpSLc>cJ#mXQX/96Z$:l/Cu!
@WqJ$$ H#=6e1jlCVcZ:\^mK%8#ZV+9qjqJbW6eCA@4R9pDub6eG^unD/WkltQ6a>%m6yJqJcTAeaZhPF1C?@p:
FKh*nN 5>4P*LZa5RL+^yt9lEm=j#>8+^/TY66jbiDEX/c%bF<+^W#Lcm56!nyWluWQhV!WXklWqVwatP?Ak>a5
Qw<^*= lnF<l>4*WuY#Gbcch5bY519\YeYDJSDy:e#:diTi$4&++Vu8XJA#6hK4nI?bZpKKM9%4yi+W/!qtcbC1
:*#emY tX4#WI:T@J>D=c5L?hcdJq/&SXZ=QGP#Q=/5#I$Hdn!k<TFi:nFW@b/*Z?1&QtVu+ZjJI#T>RcI5wQ+R
nN!AVY +5XBjPSjpNlZcPYq1bt5nJ19wt%FmnKpDC*uZ4I%d!#Da%qI=>^5^C&?tG<YN@M%hweydSFu:5:EPly1
u1KclQ nZmG!TnNW1V=y<dw\^KLc94?T$cX#PMDDi/FtqS\!6:PQjM?>Jh\Ykb%jiIBD<m>y#nZn4QA&/Awha?S
Ji?5a6 LT*u*%>jW<c*Je8/^#i4?4YQ8^>1jaB#<TF#bj+YQ6ldZb4Xh96q%EVG9FN&Sn*iNVV9Wn?y=Q$cG:dd
VdjQXa !#5:CSu^L@4pN>8cG#QeA=dAY<KX/EEn=9=>nJ4%qMZw:tVh&Nc^Z%ecPljc5K1$y6pZY@S4nu$QqQ^:
upXQQ+ 9mnLuDqhtnNN/Gm&chu$tc1c%<9ppk>:q*Z?+Xb/&cWSt?pXMZRjymn41PNa1X8FNy<<#8I&bn9S5mLC
5aKidQ &u:payylc+\butMdBV4P9dbt!dcmje!GM/T?YeB=B@B6Ka+y<@@KB^&Amn&qGZ5qdY8<nQHiM4ue*JZ*
eIX^hk c/$:/LBu%qpEPlZ<wT%ql$=T*LF:FS+V6^8:aC@m6CZe=aZ^/yF9?VY\JaVQMda#cG\HmX8:$@FJ8L@P
H=q:WL ^X?9MdSQ8R=mZ4*Zy\AqtZZFjVC/<1$::MjAS/ni>B:Q%ym4b@LyEu!*L=qF\+ba5HbkAZ9LhA/Q$dk9
w6L#h+ L^BjjbDN#$R/5pN^eDcw+=#l&jw%1PAy/*&IBX5AjGE<jkc:w99aaY:+>:>Ye*S>bS8up4Zetd*1%/yM
#w+M^< @:*QF+MH48wIYju5IBcLwa=b9W8:<d5*5?q5SPM!ZWN:W@Hq58lXIDcpuYw@XptW/!NEY\%<FFi\Lu18
wnH8St W@F+EcTjR?L#dE<R5lMMBS:Q!<ce<jS*h9yqI^&Y?JQXbS&%T/K^I><CbNXH9tWM18AcI6A>K#yCnB4t
@$&PXa @Q*9RpEXN*/*>RG+4uceM#B=jZ:NF@N4S:/F@Ln9AZnc#X+j<>J>5<BblAT=FLj46jZ8i\B4nN?+H<Li
ny$jkC p4bH+iM6nXJH!K>%lP^>lCjA>69B>%%=P5Q#EES!i?ncc+QZc$myquKd#:Xn5&>&\c>bkDJ:TkMJ:wjk
IG&Z1F RY%RR/bLVnM<6h9\?jdnYC=T\lhnpRem5l>DdL=b>$Pd1qFD+9j:H5DD+l19+K@w@M<Y?n*=d>kC&Kah
@X1Hwj *@N4mN:YnImQjA9yJd=DtCV<&@G>&lX+BhpCNP/:5BZ\1HV:E+S4D%#lBi?PJ1<y^TBL@J5>BeDuPMh>
\DaBp6 eQLY>mFNLGWi#IHX8#c<CQhcWeJ5%KcwQS\BdE?tX:G>HRFD\pmDkF?KhMHYb%Sm8ltylYWVdyHXCh@n
h#$QSa eRu:>?E:4<>>q?Ne:a16Q!b5F^&H&l:F8!C%V?AL1QaE\\m9w@a#q%iZce8!wS?pH8lKah<D<LedNMkY
wa/#El R%+&Xdj8wQJ:tXZH1aYkIX>p6eVbBb81CCY$Add<9kia=5FjhaVRGnA>+mB9FCtM?ln9IbX\w*uMl^1E
E?l/au T8EiFd=**>X+nyZ6jkk5@ntwp\W@ae<$<k#kiaKp:Au:Ga+Q*\HQ95G$Tb?%:FAnJtPE5kJZTeCD@kTj
GwS4?c Y>dLA:X&Q<S+nM>SB/R%4?Mhc\8dcYkkSS!6D>^?GVjHS>V88#bbGFLW9^lV:e!TXQZ/b4$?$9QHpLKN
lF>T5C X&#N?A$<pi>\lQ#4jknm=ZN+F*$5?*HeYbHwjAG@de^wnnM4AiebB/B#$F>EdH5CeJaj^GWMm+B&eV<E
#<*p5X ttRhp$ZdMT#B8kZ4/b6q6wHbMTnmBpjA$J<dLtPbltXkTJtYRb11HcGQ6V=kNitJhkEyTqV5R>=4BZ\:
L>&&uI e=kjiY9ZnuJ/+t?<96ahD1a%pVI6EG&Su6qhS^L:SehLhJ\qS&uuYG%HdaiAc=hGGTdup5aEZ1P?&tc$
$h@#n: jEi?BZi1T88lHAGW^p$YJy&dmIN1qtC<@VJT*i5#SlL+uBmVt5^QR$wkBhGV\jbpikiy^ZGTDtS<&:1n
RX!Ecl <XYmMS=y$+w&n1Sq&#&4tCc!I>I#nyiA455SMhLV%99GGt9#i?Iy98da6wi5HtmPp9R8wqZ5K@Xk\jj:
S&6R69 n*!L^a5eJb5di>tk=K+:1E=dq9dDquRRYul5CdIh1Fqu8a^TdVlKmkj\@T:R4/l4@Bwid&y4\T&%mby8
RWBuq+ QN$a*?Hy$$lVSqYkJ9&%QZF=VWp8tSa!h6*B4eMSy!>YmlwBb#ZXtjh#hPY^pK+<I1*qPG>j\4EM<bF9
1?TT9L qR*Vey!kb*l9S?5D#MJlGel>TBXYJ1JG*^@*PTV>&+8Yp8pA6up+w?I81?Pqi%clHjHNcw/ZLElSP*L9
Zhkpc\ T*nt69*wY&9L?hXY\pliPNtN16J$jWJqRV9I?Sd5@:+HkJQ9S?qpq58IKcnNCTjnQh>5^@hcH*A@bD?P
5+#$dI PNG/IDLWdSkdM/6PMbQE4K:S:1S9ZtHQkB^Hh$yhDPhYG&$e9u5Xw!LTpYEGm$p!!uC!\&ehb#MjYpLQ
ab+5Cm 5nESyw>RI/BWqI/9\N1mNY^>kD\Dwt#H>\D66c$QdDkN:$MhIV+&hBujG&MtmA+E>iQ:H8A>AM$hIhT8
*jNGIe \KMWQ/H@!:\C@AcwY%1NBFR?<m%j4C5Qqle*qn:KD1m^HY<<6u5X?K&4eGZSuZX&RH4u16b>iK!E@TXH
FqXQ16 CTjT>c#nye5jKmE6t#lli18wj/k>#>qKS!PCJYW<l9XG6KTnQ8n%<V+5QkyYFnPcjXm*9<=:uI$?4F/d
8XE/yX McGL^lAYdd&*&5#hDw$?y%y#><hcC&:#nj54aR@I9t&:AS$iIu:uK8DSq?=eyhqjYpE!tpE=^TQG<jZ4
APm@cZ D:!Ht1WiP&P=SVNDbP54nh*Yd6/blX9Lh6%SY&WZRY=4jDFnkwEbL%cX@!%F@%c&%58a4h>L@e85X&:X
p8itc% pyX$l+!?F>Y/=%b5&$*XhlF:hX4tES@P^Zi<lMj<Y6>CjEnDP%e=?AHa:LBp614&<uWqDXV1eT#>bae@
e+8=Sk wqVc^jK^cjLCBj6^mL98><$!jK$QiH%GHIW/!SeDi>9HItQpWN^$!PlhSp6Djm:4c?YjY*e\P</<I>dG
#$4Epi 8*cA6cc=^J81pe9Sp&nhkRjlwi?H9<JhHBAuT1dZb?yclyCPQ$>i>*6$:C$lNHdwW>G9DiCpHS5d^RTL
^KZhL9 C4:<dWA@:J?!RLpQ:H!FV>ZjnFIE&pXp&4Wn=H+IJapPV&lG#\=6CZlu%G?Du?Bcm><kNtN<Bn&Fqup<
^JHN&Y XBVnHQS>\I>/FPuZ>mm&%#%:&XHN64MaCaDiwRQeeRhCnQ86F*EXhj4/>*kD=S^1:m/?M+9wRQJ+*<$t
SZBScV <6wlXt4%?qD/9D:WFKlhGd%\dVD8DM4pEA>L6B@*Sa%?Bh@59kjRhuD?:EXdAhHJSX8Ji5SBZl>1ENDV
?=#@!Q EB9k@PKhRV\kmtLIVN8n+CE<*@awLTY+aH<Fi>dB+9B>LDV41YXYuDb!/4YNBu*5jYZ#Re1&<netHZcE
-AM+%q 00086620cf1001202b3 Page 36 of binaries1.zip
NeRQ*F $B6B9t8<!Jh9AYZ&QXD$c^@jhRim6B>HjJmd/Sl&XLP^EAGn:Jb=S>Dwq<Jn!wDmYYM<C#?Dl*1M^WX$
FGI91b %AZXA8m=Bc^Fu$*E&A:m6idGK?I:mBKZNtq6n%dm@HR/WL9%AeF/T1964&JV<hk4XjMiu&:Qpu$+DBy!
+p9\S= *^%ZMIQjNi8L:e^b?ilHS+n$#K\^NqttbX+*Q=YtXPL+=G:eEhWaadj^&F<#inN8NQ5*#V*yee!:=uYc
<Hha!b JR=q+ySL^Lh9t*4QKy^IGLT>TqQV^leNhL\Q?dWQL4EW#iW:b6PleGWnH5aP?BS#qc%+I16w6Y:qM@K4
PK!q:L !95Xc$4VDT?Z6uR#LAYjL<D/Fj95yZpd#YY/ui*6ew*ByYl64H9&dZQjlRl*4\KE!^5#%GeMHAu+11t*
BK/+A< tQinYp@N9c<5\8J#Qp!?NI+d=d%k%9KJ9=@ibC+jaj=K:R1tTY9K?^dN@5YcJjQXnZp9dK1Y+hG^yWhe
&FRYK# t^>mB<?Zn*4nFp9IyaCS4T#8yXHwDPC58+hiDKq6HCT\&lmna!MAePi6*iXVIe^JQW5Ge?^>=kL*<6t@
QlyPJJ %iXLu%HXMMXVG4w1N+?*9/inpidj<WZ<Jq^tGK@qVIyu*Y=q=@Wc:M1&MLu>hh#M&4wbB>\l!Hy$h^%+
l@+&TR e^WIW:PPZeNIcR^eGi?5y>:+FJ<8ae#aQqRc<LD&Ll%mj5<\ZbYliqn*FbLY@XBbX!NHm*lLA<*tIwT!
h9@VW& kVycehSLJ8RDJqEJ&TaDK*dCEN8C+@T/5S!*h4Q6cN8niA4\:nyk*lYPIA=*MHZKTK4Y>m>nPDQhyaEM
TS^BhQ p+bq5*@LWh4Ky&!XdY&FG<bkX$H6C6!ckA$y5/H$epFq>CSZd8pkHYjiJiLJB+K6Y&9i&FVN5F4*dCIF
nP+$qY ^CeJdYd%5B*X>8>d\bkZHZV:K+V%FCC$GENZJKln6j*yc<5e%4Ibw1c!=WME=8^aJ1bd*4MJEF<5W:PE
R#MnPt t5b\B*ju!n4IT+1Y1TEI%t&>K\#FaHD1Jk6a!iW%d>#?+^y5Ie6m:ib4dZ8RZ^Eb+5MABBV6GMQHWPG\
w=wm<B K<NG6G^i+ycZtWy#ML%E#@IN\c9Lq*i^mV&GdL=Z^bd\<5qyXYZKqk*QMZy!T8IAG6@6dk8nH<kE@iZ:
Id^ZBc ejJhPbF4edWjei!%PI<bX@w=nBu5uIKq//<@WBbp>b1L&dt:W!cnjVSyBLeyaB%=XSk%dmydWXJn#F19
SGCXPD j8@Ae9p5hq\SZuLQ#ipSjVSNaH&=hALQA4:%Q\cMQ#c$q#GyCD6W:CCdZa?m&h#=59%C+/8NX*DDiD\6
IKXCVQ l!a#udJiJPwC!yud@@it5*#/^^J/qnb!LT*ZA+Sc#iYNydWXJY1YZAM#CNqVN5&qbFRaLXiZl!HI6:lq
/Jm!Ru Ep&t&AIe8++N*>6&M#%L/!9yqDEe$MFBA\XQ?u=X6a=qQ%Yth5yQ8CqN+&+&S=Dakc8:?elFcaE\>cZV
Z5@@nW QL5jq!8byTcEFC\Spa<m$^FZdLaPKb!?pu1%qw$D%l4KB5t&y+!E6MCwhk?Pb?*jB/dpYl1:8Wm^dy?^
5FVn$i 1Ay*$edSK>ykem#Vbt%iwtcZd6lcMmh>66Jmm!Zd%LLq$CZB4DWZBSu#k=u^jP>a5uHaPX>pae^/KC8V
?d$cSV m>DYVSccMp/#8wCWH#DWX!$aVnb=H*$lYu+CwwuS9HEwuuHMJ5Pd1TtLSJ4NE=^MB/F5Ll4i*%K&e=M=
k$wTLp P\CbFih:ME?wbDAN&yabp/1qP<La?KIkGpH?THq=nKb$\He%naQ^eh:TQlcI%uaW=$pR//+myGed#@H?
\YlhRy SYPbDn&LFkFIiETZ$bhq=ceTcLdtB81J?D$#\!jw<:+6N9tiGSVD//56t:N8L981L5&J&GVMGt*t<=1Q
%LISBK qVqCc$9uLPGmD#ThyGV=KWN1:YclFtiG4$j86i*BWjZ>?*C=N?/VS:9mHYeI#RZbY+m/IC*b#!+b=?It
$Qm\%e E%Hb!^&EF6aYjKuRq4Iq*qWe=^K#WlcdLFFF=j&X=5+Fyk>j=uRbKlh+q&&F!@wJqmleSL\Yud@h1^A9
KGAFHu i41+\!N6F*CP$aVPP4G\Z/HE9PXeaqc+Q&@P>Xm1tdkS6XcZL@6/:##>ewNTwnB#@<yYu=d%dVGHcAqi
9>lt=w \@qdkT+6aTWiBqqh^tdCA\+\6dlbB<ey$aK<Z6BMLhkZXp6GECM@h6!59Zj8&mY#&E8L&yyNk+=K*<wQ
N\11c8 9Dd+h*Q=p5!cF\\VYnKhT^*hMyw8wT1n1WdM?=ETSBSTp*H*5FYPVD^NRTX9wZc#9ShQlh&N1+yiBlbG
R\JJYp 5RTq!+/*aWil%PIX%?aeE*SB1AkK!\=+H#&<:%NH*N:Qm\eERdn>$IHDl#b?RlBY@Aw?jWL+lM+VjBI?
ahQW## 9??Ln**?p\@*j@:kwTM<@<ejHVnTm@iF9eKNFSZ\VH#%\P6Y@AZ?e6>B?La5XV\1CM9^bkX@^n*$DHm8
XtnJYc <R\BZ/9Ku!EIqX>::#P1+Se>B\<L@Cq*HVu+/GH/dp!wNGwmXMH%l6JV*yP?AT@?<$>RJi:@\8ATIG9L
q&KkiV K*H@F\+P94eTK@Btu*jkmQGe@jj*>V^&j<5uH^T?YLGe1mC\c6D4D%iDAacZ=iiYu%y?b9tF=SjqZ^:5
bnCAhG Q*AEZn9k:Xd+h&%FX<XL:Gta46>*eKnt@n**H?k:+1=y:^6??A5HlEil<aT%R1XJMMRqCNiYuytmBG>8
SL9nd* \adtNcD/Xi<=&H>\<GF+9\^9XH=aYGdRi4D9+BDq9XMwGn<R@5^+JIi&Hq:d!&y@LZ8XiKdm%mPQMa/w
&M$D99 &C:<$j?#J11wEd:!8kH!<MHHn6S<!V6Re?R^:^eP+459%D#Th@nkpbwnB*5G9uD\<Jh1?9y4D9d*jPFL
SkXVlC n#=&<EDNwQj\kAi?jc#*+eh1il:84@u<\S1Qh/Aj9*8+@$DNRL@=/VG+<cYc^@w<B*jWQNl:<MlB<<eQ
Th6NPu R$pQ>#\&<QBliD!X6l&ihjk\@P4u9GJH69<uK\Q4l8X+9IMHIbj*$T>6y+IPHIT1H/\SB++<XuP+#*&R
%Ml+k$ C9M?%u9\C#WH9D%RVQ>nS*d\S64!9&&puj?uSu4:RY>N#^ePQk#FQF#VZ<abDMh&1y5HK>DV/@Wi\X!H
\kR?:+ 9V$QQ>du:c>=#F6#=PHBk+DlICHeV8<PHD#T>\XAicS9?CCD<ZCN=?Enn$GqH**+!JFHi:@\<BFw4e>\
*PF\?X #A<jPIC9Qu#m\+jL5l#B=?MDYW%1Dn?Mn@D&d/@yi+S1lT&!uVZJI#XD9Z$>9Rc^D9h=?yA<<ACAh5D1
J%Se+d :RecQN#Ve@CI$X#CRFq#9Z>Je+*<u=44up<i:86^%@\e%hF@+9N@9%Wi<Z/B5hn96?dLJet$@Jjq9?my
KS$&c/ *SXV%%X<8?J*\5$N8%w?#a8Ct*8?eP#S*9HQm^Xe*8DY*\kjN>:?@4Z1Sd%m<j@t4$XRZ<L4mw4FhT@n
#&j<iy t=ZLNMF@kd*VBa9^:9EKiujhM9%<SWEZqAXhmF@mh!+JePeh8NNEh&/w%N<Y@LI8@Pk1jDV9LRlNeP?4
Jh9cGM yZ5*Lwh:G*?>5CVnVXZ\++%9Y/:?@6%%m<LT8:hXR>EYKFdVq/@Vj/B@XhY46HY/@uj5/=4*\hiX?9q%
k?6R%5 ?5KGTp*+5mCMd9#SR5ZC&k%NQ*nN#FCl9&*SF>bZLt/Aql^h>/NLq^bYd&n/1yHlQGSa1NRZ4/%a8Kjy
HVFS*9 1\8R+dY*S%e5!TDwm^Z/a8WQF9#\?NF%V<Ad!GAy!?DZIIQqB&@4/*/$<QF%V*^%wcqm<b=%bStchM#\
CX58=h Gtba@Lnqmc<8NqW8ju^nYacNAG>^ZXtGnbdFn#ibGTwiZ/ijL<9\F=Tl\W<bN1:Z#%ii*/lj<pPGT:4q
+%#MZd S+5Nu%\HGha6*uGJj*?y<yJjj:6yeiN4q!=bj1T6Z@I>NqQq&=j<C^9y?*Z\@a@+>*/#HT89ut>cYIeb
/K<iWh hB$!@JyqcDC4?LbFjd^y$RIb*9bDlt6j&$kbTmCBCw>9ZK#pGjTKT:?ZwXIZNt1@q/HWnk8WwRI#NGGG
MQDSmS 6!FD$:4FEmWYKaMAGSa&5k\@Y5AMqYWbHne#AD?>*RT$lA\t5aGPn&@WlT>9jG*S<yQ#cTDpyde^A?eu
4PwbH\ Zd?qRn@jSBp$ah*=nbDldWGHDPjNDI@4q+:w\n$A/@GNq#a?5imHcpPGT=RBtLj/9K:Dn=6?cu:&/?jL
HdWD:> Q%>1$l<9@:\Au:<5dDR@L&:W#*?ej@/k41>jZKhjYm>5@IqtYdR5YBdZKjw@94*8W6N=@/?MKm%cRL1E
$QEl^Q nW>w?1J?>a&481K9$@^9/D<^/:!I$m65nMAn%q&XMaMZM#BRXAdIAGV+KJDHRlt$R=4@p5:L\B!kXDVk
He<98q <\4>HX&tHI8X?Amh%$KDlwF&E?:=En=m\dK\Vqq<B^=lXHPny6<Mk9!+eI?1YdS%m@BQWSWNiJa%*FyN
n:@c&d 4+KGQC@+j&y<%ATRd9b^6cyZ9k&W?Aq?YKZwFR8q6+5X=q86p6/8LILiM>>>%Z#*A@QhJjcVI4ARK\Dj
KdM8JI L4K*K$FH^Z@/ZnY:Z6M6cX$j>i9/:KI8@ETDVQ?NZ>!1/VeC%VVjyh?i?PR:<Q%Qj1*4<dkiV=PG$@Td
<^$>Z@ 99#/%X>hh@/*6c=*HuEh88dZN@#h9%#*n@@<E!c=8u/#>5Xh?*i6@Qe9%jd<h6huhu*!+6DKj>*W>M\@
+9C1@4 q4+@<yu>HZ9@@W5uQ9u84p<<6Pjqi9e@Q:Q^8$&q:*$6%*j5QZ<%=!45P#D#!S@<nj9bM?u9M6&P^c@+
kVj@^Q bQ&8qp6ZV?\1:D4\\:%@j>&Kd@@qDh<>jwuZjXZ1^cb*XF&Q!d15/6YSTX&J/Gu/>lyXZ=b8?6G4%CmK
D+*uQk L8SiLVZHVayi?e/bN>=a%K6!89+q#Wh6edPmL@@6Gj&N8My8/\4hZk@<?N5#!#>+*R8j?8C*%:be>:ut
eH!5An ZS6V^liZ#&^/N9L!t69Q>dh?51X=j:j=^TZ++y>jP4Cn^495S!*L*q@/^jp#6&@/%=j#<+j?8Q/VLjZ:
HB8p<* l<\9Zn*#mQW44?#i<cj4Il@w?h+ud/E9X1Jb?^uSGA&Q@&j@>!d%>@<Ca&>e9*G>cbuBb1+YhJAHwbt@
X/mJI1 !t**@<H!C&YtZ@md4@^!!i?EJe>dAZqZ9Mhh&ay8DQNp\Jiy$CkJ!%SKR8WmJYG=RptwKqIT11>TEm\L
X4jI%b qIRXMmXlbaGT5CyQTdntZW4C/uewCY6?S$qa?%6K\41*KRuZ=mkJ%<%VE1:QWlJ88EJJ8DFDTdlynyJ\
YGGZ6G <%8WlF9iyCT5j+PT<L:ZKRu99$^J?MB9KApdjp%J8QXZqIVdZ1MpdL^ETclJW^I?PE6J?BAQbD:<*=TE
%ySyl\ &=PWlE$#qIVN@$XJ&QJLT5LYcWyC:SRqaX8CpqD*C$4C>9?pJFl@Vpua<VNK\ph?Tpt++!iWBN84qIV/
SD@+mc @/ApjQRXT5IjZcRp&C>RE8=<tbJ\%$8WlIaZKRtPj/ep*Q%nT5LHZ1ApjQ^HqIVGH%IT:9pBJcHyQCZl
hEe8JK E*FK\5=JT5K8GCZlp@>GTjlWqJJ\:\Rqaji@WlL&@C>KRuPEp6ATymT$lmkJi:>QTdn9Z!kJu@+iJYHj
:Q*JL\ Q%MT@9l=T5L>+=TEB<awCj8DqIR@PWhJiDBATZBKqIT&5=TE>8ewCR?hwTS<=nRqwiNbTwL48=TE#@+V
cH\Jae JcH#P=TE4t>VE41jwTS<:l<yCR@@A!Zl<*>QTin=P$4CkY>SEk:?LTZlpj>JTVn$N=TE*4?tJQR>VWpR
S19wdQ u/Ip8Q?KpuD+j%ATQN?pJQV@JTZB?\%K\1N@RWu+$%PWlC?eyCRePWFJiP\+JYHkTW4C+DFK\6BST5IZ
ltcR8M u/ApjPu4qIVl4%ETjH>PTjn!X!pJI*>GTSn>CmZB@#kq+ZE@JiE4w=TEQ^8lJH#%!=TEQ@hSE4+&VEu+
-Ak66c 000ef713adf001202b3 Page 37 of binaries1.zip
iTWVe+ ?yewCW><pbJ\hImTeG!Rp9DpACZl?GPWlBNHKApu9$BJPQYuqIT@iJTT<A$9JiE9?!pJ*@SRE9:HaW4C
/mjt1? Z:pyCW?JqITu?!kJj>%LTjmdR=TE@@pIJiF9D%IT9uYAp9B*QbTE9@<<JiEjH1ap@PQuKAuQhFMT96%F
mpMe?8 TjlPJ!Zlu#=LTjm8m=L\dAeq+jSuKAquH1IpQNhPTVndSptRuJTE\IPWlHN@RppI:1epnD%ATSm@u=L\
RKQw@$ @B>VE9==H!Zli=?tJQ#LjbTE:??qJIScKRulFpyCyJtT<L@&WBL?hVeqaiJiTpL$W=TEj@5pJTG&m=I\
t?c<G% 8bPTEQ<EJiF<E!ZlB@hREu:aTEu+$eeyCT><nJL\+:5yCj@8wCT<&EBJiPp8T5LLh%ITL6kyCSj@mJL\
V!1HtM !peyCj>SV$q+%WbJ?MphqITjjwTT<LMhqITjY!pJ@:thp9CLPpyCal5qac1YpnC>qbL\!!&WlQ@cVEta
Cqqd6# &WSJTN=PTjn9D%MTWl?mJM^?pJKR41EpZNyITZn6Np4C4&/qJQ^/A!ZlN^?kJF^?Q!Zl>jhSE6=aV$q+
qkPZHW <^bK\q5*W^Ltd1IpbG/pJF!=kbKR9b/TMH<hJTF*LTZl:ZYWlN?8yTV<dk$q+b*XqIS*4/Ep=FhSEkw4
=jTFP4 KRu!Cp4CkwYTeLYcpqC5wmRw!!pJm=YWBHWbJWG4wCTW>%+5:T>a?=ZaX&KStKC@Ek9EIN51@Q!X@*j9
XPVnEb %&w^#j%E/jQ%cp^\1+L8QqF&d^H8FiHiN<48KZBQlu6@XZc9CQj!k8B?8uS9@XY/>$@+N@dDtP:?wjHN
BM4c/+ B^dwt>P^bY=B!Mh?FK6\C#<\94^Nym?jk:<cjQqn8k1qH:?@RN>LXFu<Zm*:dTH&L8R6^ldhpV@$@i%!
GR@IyV :Hj$9i=YAEC5LE>bCXCD*\yam/6\N^::9ch$a@ZjFkw<^##YEF=KVHY@C$&/VHC:F/AEXcmI$Sec+I#F
@?C<!l 5IXpimu8BjMuPq!^eH#a1$aB4wZaQBVKH9>d#ChRd9m$\P<8WlW1*LFFcy<m@WZCRQnuX9lQ5N*\<Xhn
^G>RmI m+L=<M@l\\Yw/aL\&^m$Aq!9<ndG9Cy?!=?KV>J+aTyXRSWY/hq/&T>aic4\H$aJk@m<LC>DeQ?P95Y&
qlAYdt \Ej^:Qki?E%uXXjbA?phF1/YFe&K%M^m+EE1L:qIGe%!D&C=X+S*1Iqa1elkK1BuD!9GYB8y9L&\1EZ?
yiJ4SX ?EZ#iW1MKtGma>X=^TmqF$9JWCqFKpWSF5&YMWw^&1^ak8w&TqLNd%V?T/^qpaBmTShNTq&N#eHuh/mM
M#B!Sh *<YM^tQ=45cMZ!<6A/<1L\Q#KIVpcw!%Ge6=\TnlITcmRp#t=T\CV!!chduKY<b+qlw4\p9nbSlQ^Vbe
yAQjBp wG>X+YZn!S:<dWGwBMauqtRQj+hS&F$$1&MWwynFWRE^:R<WyQJja&EwWc4\pqGeq^YH#&R!5$n5X!1N
St5VEq @XcNRaZebR>nSjJ&mSu9Futlm@\hF5k+@pYV%^bmBYGSmypHKe1Z6SGVqRY#nAX+4kZdAi/aD#KKaAVB
Aadb@@ V#K<KqnhT4AYmDLaPF\+RJXmcW9L$6$Y\R%cB@/Zm5RY$uly8mqLDBdLJjQcqLZn+RY8RpBFtn1uAGTZ
PmC:@@ *\Q\dX+P58+!IWbNy&H>6VJCZiW<#wwmZ5C9VTd=uA#N6EDceaGZ5@CiepDL^a^!1kS1R:MkbRpV5pIa
4$+>Me 9=kM@utbQ%pthc&aqdy1m669iX9w\uJ5Rm1ZXN8T==hc#PBd5+#>l1pk:R:EKbI+GL>dFN/P5ie9Luu&
&HT=\Z w4C$=5lMy8k:C:H!J%:q/5IR/N@^&wDhbI>RVQZIMmw^w:L+YFN*8jBS^pP^$5y:>MR:j?nB^XlJ!T!c
^WMyYb :cB\?yn1>/E<1WS5/>>@PFNN:%CXwAL</Zn*11uhtRKY8SJiLBtW#ue=:a!YS5Pm<Da8$qPYw%!D<eZj
^1+q9I /Y/\ERwXW8T/!XApSkFLLPJu*?WXL%IXF<w$H9/CKbbmnAAJt1t?bC4K!GNW9Mmd=TjG$<H?Kh#AM?dS
q&W/Ht BWQI%Nl!N\48%XkqZ6By8EyjF1uFKqGk$XiyRLFuj6kC!!wd9%mPF<E5dC5#TQMplqiJ$LQ\N+eF^u+F
8n<H*u j:>6=N#A@I1*mi#pt=CDa*#:N1ja:/BSm4ECh+<MB&uibJamNhb:9u>@q9Mwtw9<$8?e&bnC#TdK@d6e
n?*c@c %^Smlt\8<m5?YaY:X=EbC>S1SX=XSVA!@6S+:J>pPjWaw@\PGlCdn&pP+JeK@KNnbiGFNHkZH!6nJ1SN
ujD#lE BVbyBe>+5c!8#JHIEphYky=D/SEYpXV\>!y/ijkejCSewHRwEGkK?a^u8kZN#Z=nE8qkq4M^%uciBKEK
&F:F#M Kpp@b8CI=ByCS!bBBCw4+X*/ABtE!ymd%^qXC@&A@hy5pwi8qBYV+#1MT=EPPw!1i=XXu:XKBiYFYnBQ
86/$n% $&kW8KjDd$6QQnBHY9ZhYA=?bqc^GK5Y5DZ^whZE%@n8Kn&bFX#E\nkwyGeFp&n&qjGVW9*jw944^Q8@
+4?SM< ba+u*pEZP+a8hlFi:D*wA9M8+^=!lcEhC@#?XjC/VRK5j=%LE\4qP<L=Euji@B9?nS^deu@>JZD8hbI@
>9n//d =Qb+/b64Z!WVZZdu?9?kb\n8!dJe4%Cd^548ZCTF<G>q<hkFpJ4!HC?VRmq:!9W9eX%bZ9/LqK8546j?
qLX1jG tK^q&b&%Q+KY?MH@jWT+HX5<m<ES6S^4ibX:=pu+@B6+jejI*b+l^59!PIdeV\m<%Nl%!M^IT@:HVSpE
WlRaT# IIPAGh>GLmkT!&DwlAL>P&TFCiQB#%+l?\PW\\n%GqV5?J<<N%D6IFDE@B1L6TCnlRy$+#jXMTGGwwRF
YyGB+m /4EdBjwh<K:^EQ!MDqMqXt\Sc$XtA*\@6$:BtM+LJIjN#d>Ta8Vn$Ne@M1wb9EKwX/DZEEP?%>\*^ikh
Q1X=Nm jub#?P+a1/qPtZZ*<ll?!!41J6puFjE?<!h$*^$4QaL$GQ:$&lk1F5SJpT9X:QwaRcej$t>JW/$5qj*D
tphKHP <qaq<\NX8SYj4nPQMed?+/Py=iC@myJMncBTh8bAa5%S%NaI9BIEM*dXVZwSG\4bdnF&k%F$nP4GH1#F
q8%\M4 4mXc5FyT\eAD!?pn@LRWZJ<t+t8^D:IjM4RCNanSPMbN<K&wRGIYhN!1BIKl^C#W6nEGh#X:V+>n>TTq
!$ijI@ 4<b8wZ4Ra>tnYR9Ak>*X4HCt*ld@WD&@#:n@jVEGX8AQwhbp4c?=1/mt4HLIdNCWc^t4W5M\DLeKnD<F
ay@l!! N&<5kXiINY<q5R64E@A?*B@t:MFqnLWq+\6GVIE+jIZbWFn4H^8%>4>F6YA51VFVbclqdJJK*a&jq*M=
C14il= Ri#p616eWDZ1\NDhVKhjBeqnppIN4ZJ6kjc4m5th#B>qC5%64#E8%N#e!wXmQ+GjjN>WeWuiVjI9j%lF
k+EL#? jjRu4Cp1Bc=&FH#ij$LVKLF*1K%%dycB++$j&Z=C&tA=6ek:#GkL:lq<p9E4d4*Nu*#qy%BF#kZp5/HE
NJ+59: MuWG$X!MS%9Eyt=D%ZGTMwawjeCtEjCb1AYEFT\dQcicCRNyNdelaJJSleh@CuLMBbQX+ZyVAkSVblhJ
CAn=+k W6!eI<^98XcI5j#aA!YkttRe44uZeYdZiXXBpqcawtuY\QhV5C%XVBhy5b6LlSwT/Gb/YHi9myueB!&%
1#j18* pkp4bqKbh1AGX%FdLSE%qkPqw+14mSL<Q@<y1VGGGA1=:n$KIGcKSVY9ClMR?k5QYMXWEJGG/L8B!\9V
u/*q&R ZKc&a\TENqqq6t#Mje/w^b@>nK\Ce!LIeGDltu8N\A\T@:pca*cE&wEycdl*nSH%5<ke/1CV?F*D%T:?
NJnb!k ZpDVeAQZqj!unJuMP6\R^b>Pk^j&dytXn=G/jiu@jj@9@/j9+j?H#*@+@Q?j^<d*@Ll=/hk+@u*qFYEb
nA#I=B Z9@u@^R1<j4II<J!9H:$w$IXu\%andukuRY9pH<FZmH@T4^C@qX+lj#Z$NMEaVW?DjK9\T9eYa6Z!L<P
95BbKK 4=D@Y4^C@88wXFBeYC4p9\G9pQ>G9MI*N?EX<6?MX<l@C>WPQE15HiS@H%+l@@9^C9p@kFjI5RG9pQ>Y
aRDhS8 RkGKW!jMPBNEECB@DX+l@\j^C9p@lFjI?YE?>@F&SA99N?EX<t@GK?VjkqjI9^Y9pL?YYpWR6tG4\L5/
G+@Pd< Q4c>Hj>Cjm6iIj<P9EL?n>C*kuAHjk9=dZmFP@X+lj\j^T9p@!P<Ru+:QWWR:5TuRQ/:<A4=G@AK*#n\
8t%8Ma C9u9^m9p@^mXJkkj^>Ikj!NiIj<>iIZ<VZmFHJ>+lWc9lJ%WK$HaldYC@J@EK:\?lXjIj!>iIj>89ELP
MG@QLK QXS:+C?5QiS9\T9ec<W4=N?LX<l@H%+l@/eJyTD5R=V\:w@^C9u9^!9pj\C9pH<@ZmH@u%B4CMKD&B1R
qWDw=l *+qZ8NQG^/dd<T@pj\m9pQ<#hFeRP9A8=HjlFjJ@F1@\Vij@yNFVwR89pL?djm$Iu<NjR@/H<R4=Q+>Z
\tVJ$n !N?DX<l^AK?R@!CXI8DaPLZQId^C@q/<\15Q4=Bj^C9phFN6BPE\%kd!i@AK?j9^C6>=<R4=H<W4=Q>V
pq#+%w 14WkjAF4Di?P+BZ!Q+bZ!D?AX<k@mFjIQ$VwBPGLmA:!j\t9eGj+ES1>F*^+lj^j^m9pH/FYEISSdAZI
Y&e#FQ :<e4=H<e4@DNX@na<y@lZ<n@XjwE=kM@Rj/9+SZ!j^&9pQ<J9EKPw*mF@MjwX+L\JQ+K<l@HK?R@kXjI
GXdVNH j^K9<D1FX<n=F@S$RjkGQl*!@!XiIj<*<R4=@\hiIe>j+SZ!Q$Y%EITu5Sd\:1<@T4NHlL@=KEtKRNVD
*=FdmX 5ZG<R9=9WY$F+i?\6yD@:@EKh@+B4=D@H@EK?b@BK?V@N1ETlP<kK5n@V*mF@N@FK*##LF+l@&t<R9+#
///Hja lF+RupQ$pQ<5ZmG@lFjIH<A4=DnH^+cD>FeR^9A9=B@HK?S@H1?R@=@^C9t@l%h+@R9qB9?a#<MP+SZ!
S^wVjC l@EK?TN+lj#@C/?R>%@y1aI\kW?Fh%G<R9=@\!9pn?EX<p@mFjLH1ZRId:F$!Q<D9MKhH?IX<9<I4=D@
bhAX^Q Bd^C@l>VLRZl*:GYpQ>F9EL?q@AK*:!MX<l@Ac?R@!KlkWIRDiV@D:^C@qj^C9q@kqjI<XP<R9/jEYyB
V$>9ne ?DtdiT:<J%+lQ!*1kQ\J9EJ?5t/Re*y?u64uq:RkR^D?K^1q/+\p$VX=>Clh@*6wmK*heD4yP98yV>E%
+4bNkL @cEQ$jZThhjS>VXBwCj?Cyh=\QZZkpBQ@I$k$BM9C\I><ZXBwCi?IRn$^DeFkb:+qmDRE?eEkb/a\ajC
a%GL1Y E/?\lTNCF1@\SKw%QDGHX*nm&*mFJ@+Y4@DE*?EXu9kPZ8GJ:?IXuynue<eKjP/Y#Pe5LjA=R%j=ZJpm
+!u91I u/8m<Dpcm*!PlM4uBtl<dQ=@Q#c?/m5m@k8I?9>*:/@V^E1H#hF#6HV4JqY$NAlC91:i$ZP!:QcmKNR4
wBjdE4 RtXlVZ*QZ=dhX8D&kqBy1Y@wicy$?@wm*M+LR9*VyZ5j8CwKDZC9/d9+ujlD5cLi<WQn!=wF8FpRK9I>
qqYt&> b<SqpC599mBY>1\SQt@t?JB5=JDEml=bk!\@ln9kp=Yieq6BFPTCIFkpWZCwqEMXlE:#??$!@DTQ>XJE
8Rw=*a !+GGl9wGS%QQ9$K%YF+ln:PB!*MLF1B^R%G5eNkYAcT6wYeTuk!=<4@*:FyA$QM:4N<CIM54RpYl@4\w
/\V%Yl jNc5S8uBZ$P\\E\Y1E=jjXFaq1@9!aqXVV*+V^Y4ilwYdQW>idHc$XBjB\&4mHyQSXP>Kq#V!jLA9\Pm
:*bBbE Im/DN$Y^<kBe4w1Yuwb/&RbEK+4XB+^HLi6ycNAaL5hXeVuh@aqSDe?CCB^iKEAq=K9RJ4<XlW=F$KGJ
-AWV/M 0000effa7ae001202b3 Page 38 of binaries1.zip
^h*yB4 kNBCA<Ew\u&k@J1*lR1dCG<c+EqRu<y/cAJF4Gk1ZBW1/u9\C$WAZyIFRhcwZaABLB1$^kG#8C<D@b6A
C6q?HL 6G^=?B$<GF41HdkD:bwZi@JRAck=@F1\%QiIQSbB1FNFwR:K6YC=eB?KEC5L4D=A>8WFl>mD=M?#$uXS
?eImPy KMCuim1?ChpT4n&9G1Z@BZIjCHkDqH:AA1WZHP<kWmk9L&Jy64^KjEERwa^K8PpATNBm<KS1%81hCAu4
$kY8?d k$ZJWB@kyRcXYALk\B5d*Le5\wPByTyE?AN*1D*kN#%\djkQw$J@DlY1B<*V<!=e4\1@w+KZ=^8E8mcN
Nju\HF QV@Qut?DT\>>Rn=q:Tw$RXqNKkiQNFEbqcGN&BZLa=YCQ@WGD@Cc%:>m%GIacmFDLjJAmwam%WIXhH\1
R=9ib^ Nb@Ku8+wm1^SWK1KVP41<d6FXlQ+4NI9lRP<Ai5Y1XGY=&Yl+FCIJC14ieQFewbaA#yal4L4+Wu=*:Eu
E\c<hu N9C&MnAln\QhC^^195lyBF<9LNIX9:c\ikmFa8uZQjC%=T1%9<c?qT<ayV>?qXSWSWQhA4V^P/^w=EmE
pN=mY6 kYXk$Re$cpaln%Zq#e!c+AAYya4XRKA<<T19Ej=1DZ/955>EyAYwRtYVKDalh:!<lAMKR1W5mlcwR#$4
y#:6KF 8<J!+F%YmZyimS/NQq>qW6Cpqu%c&!PK!B8w5QG6^6kSj%X@qXeGQujm$^dwe@XuSSH4@JJSm/MwGAXl
tnm*wd PXT9y+Bc1\H$RB*<\MK4AiyQ=bZAq6BAQ#Z%PHw59K^P1k6<baEuRD$5WIuKBunLc+/$\Lwk*>Z^BtuA
MNMVWe BquYJCKiH4MtV$C8Hyq!XjRWIJ8MJISY!TMQN^XahZ4M/6T#/m^\Z8Spk8K91^j^dkQK6WWWWXebBX>q
N8VVH< VFlRPbNRSVyFEk/#I5i\1ScI+bj*RGNbAHM>etBDkXRN%JLVRGW5A8<%ecX55XupNZZ!tp:GJR9mM9nS
5&jN%9 Cl5%?AES1q6%RIR:N4ZWKuWc1^^pq:E1D6IbQTcQjGYB:C9KhZXVZtkT?%A*%$M>LI8wZSeMbmDVyZG^
lkthKe @T*hljJ6WH+iPeSC#FHXkFYy@<PNIhNDpE&SXG9MKw^AGW$L%QDLi/Bq$Xa$pCFF/XyTAe/yA4IRc+AG
Xt>u!u uM4RA*@BDC*H5u5+C^>RT!^1aSZCB1n5lI4mX/cejku1BXbGeMC%b+H5FVwmk8&1TZP%^Gu!d@qhKL5H
RDcVCd !//9J?FjDleLjuFkEdQd/EhImE:MLJPCMq4QXFBjSDI#6QBmbP<Bm>lWLC@/ABM+WLY@I&tAy5pL!+XC
JeCwuH HkuLZCtw6eLc&5K%W$MJMqc9wk@d9GCYQARkC&l:$itBpyH=WVn#Qe1T>8bc%<L$NyR5+&\DdM<DCqpP
LDT1p8 JmSRcBP*qFn+kRX8D1DkGd^SMP*Bu$JBVXB\\aCM4R&jLW9LZSRZteJ!MCG1cMB!WZFdFypS\5iC+miX
P>Q^5F ^R$Hc?XF46^MR#mRl%^Fik\neJ/%i5@mEkI9MmQS<C=9RCm$TTn:ku5Qkt&SeZjQIqjh4I$XWmNCp?pR
QMC^R1 nMKDbIW%MdE$FP8+T6c:uLkKQh$mN@TA>dh^<:w<Z>@WcblcNM^kcK/mSGnE/Q!NWmJ^E*5Q>DQhweF*
KHNMMn 8RlBW+MjyRnL\R:$GI*Rw=a$DLIdi4ZpuQCGMZmJ4Dp&Bd!y6DVWp?a9en=p!l9WKMmFYi:n/HTlj%eR
tRjb@X X=FTA=E?WEA=hnBN84#VWtiyA&>S66T6Aeh!tePYS!jN$uAAHPEG1CuYw^L!\MPZN<AX8BQ8L+Ijc!M9
j*\GZi E*<9$?<6/I*&4IHQq1cjGnXwauaiGmPQ6BTZk&IDE5BNyQ+qhFQB#*$H:5MFH9Adj8ijnAh<?LiM=Jdj
R<R6@? ktPiN%Am6@/\FG:e@nbWmu\/AN^n!A:+I!^iMB/XR!4kI=kD^N\bdP!!VB?cJ#?XdBG1ukJwC1^#ib=H
ZeLLM& 5<^PFZmtbdLaA*Gl4Tk85=CEwEY4!KQPqepq8<1iBi!t5ayCBTG#A:YMupeJXSk\RFySRB/ww\ia#jnF
+V5D$= 4ImwHP?RVc1\=N<qMc%5!NeBNiFB/Qpj8Iy/EQ!@mkN>\KEFm>wDPlpcHi:IiSZCCmA1*qpA=>&TB!yw
dGP+HA QbYC*AN$Z%=ae/DukAcX1mB%heA5Ye!KX*q4bEt/1*wES+@RmTIk1QWXDjD4CtkqiNeE:!\!BmLa5qDw
\uWqRd GuA4quWKeL<KwDal&kyl4T^YAV5=GywA6:BaL@TabZ$lT?+^WdF?up14ZkPqYdC%LAh5q5KcR4+A+W@>
iWdM$i GumdF=BH/<Du\abpKA99EpAw5JB9/lVYRN5eEG\!jq^V6/b#Rc!8L?BQ<&cbu:6Ckqalp&<PMbIDQJJP
cLSW!P Re%ZCG9iSX**L8EyetkPA^1Y=EBFlPwRMkP^q@Ylk1t\&HKw45\TSnQIEBTF9E6SDqc&Ik?Ki=tM<bYF
8A?BTh bMmTB\Xk5iG:An=&SS$wS:A4HFt>5JlHDkF$YBiW*YX=#Mj\XhRJYu=bIR<=1t*+8H!yjN>dKLFR9kXq
AIpM5< 5Q=*bDPYHYnwwd@k:qe*%NjDj!BV6aQiASbLW\P>e!DLX9jW+/eGyDpwuGW>>Z%I=ZwpjRQa/8wtikJ<
YN6m>P d##KLQ#YN/DKFCHLcNj1IeV8@EFJpt:>ndm5*yJH4pidd$F9>Z#y/>6iE%j$aGC<yqAQSpCwA&F6KQ9?
QiWEcI ?qjBXWhNFm?:>^?RD<*ybNt>X:m^myZ8*ZCSQDKR^LKd%%>kc4bRu9ECpBN%<JIu95R5pF^i<w9M^%6T
%/!#!^ \*<H%Ra/y1eM>LW@A6cyL>hj@:58t@9tIGhD##\$M^mEmu4R+:yDwD+CHcnTeAC5CNwkB&4uJk\K*wT5
6Y:td9 aC51D9SpRS^/M1AP@>X+&8e#atXhwd+iH6eD=44CBp\EAV$wbduill?8c<m9ljC<*mI&FNdYmjIc&WL!
E?ui<y ZlAdRNuwDY>VL\F/tk%ayTcMji6@B=4GMYGW<T>ZTMGJhV$!&J1GB4qBdPmB@<AlVb<Xi?TGlkN4=H1+
$$yB^8 Ch+liP9%64Z%EETI%<pFt%m@SkR8ALi%1iDwkRn\6mdkjpeBI9@/Qpi?4kECnZy<%kEdZB\NDe94<!JY
V4XY4k j&9BAm+9FTW:wI#/Q9GAdcHJAY/+4Wi$=B9w8=/F6Z&L+1yCW\<\cB>t?=FS/i>hRcuX^A@%=B65F4EA
A^P:nX nq#u&kY^$CMZG1A^<k&kyP4lbkNy%?w%>jXRJ%CV%+I8c!k$\je&%G@=QDlF6$H:%Vha\Bt5q*55IHI>
4yX!TM D9^hE>44HnujAC1:HqVY%kbLn>B#AJRd1qMwF<ybI#j%RF+HiCiR6#:jbHHpLWD5XaYiinDl>TJ+Itch
6uJ#5< u<e/R&$?BGYJ?S=LJ!mQHk6<YFM9%6e%aTDRbK5Z+XeFcN>1t%qucPWDlWIi1k6@/855<1J+Qcltm$&G
!jj&X8 tkN/?BFR!cdX4\B%AdwSuwe>RNDP84\b5In=NV&j!M6>c\9\dW<iRkkBAlp=L&LbljyCk!$Q*6CKAuC>
JRjj&C YL@RpQ?BWiN@9TJ8Ah$5mpDTJpE5\JPkeuCyc^D45cHRRNTDekeG$ET>jnuRcR&1!uwk#bwiDDqBlWCB
6t6/n6 Rk<k8k&c#!EkeaD9+YjaXJb<E>Wbtcm!Qt<Bq1+V%wDb\Lm\D>1*RRD&:5HPJKHHXk?NBFYSLSDmmp%=
SI9LbX 8KqS6c8BES$C^lk@N1wi!amd\YDY>%qp1J+qd+MAjA&EijABWK+yYITt6Wki$RL^:HILNB?a4n<Ca>C#
LhRwtQ ^kJ@kP\mPqkHBA!<wRu!$DS%IAZ%%aAG1mCII8y>yN%HG\1aA%5V/kwCbAHYk\hn\jZAAIIDQmKMBkjE
Q$wy8& P$*IXSD4mK6bi>8RiS55b5Z@bW:e$NTA\dwDmtlAlWEQF5Y?H9EA^GycV:YImkP6AckY<F%Z>WB&B<kc
Q8%QDH &AcIyjAh^Lk*aM*yC!SkD@/tCjpK9?+=AF1/mS/DqLE$>iBhB>SKl>e6VR$Hi94EB9wcGlq1$kp%R1=e
cVD?l# *aVQQIDFP\/WY49tNXRyG1m?AykW9d/mIIjEu\Bb9&@piN>4=E!CG5QR4/Hy?!YX8itCYNpDXWJH<Pjw
Yu*M+i DI49mK^@CD#SutiNdB@:mdmmj5$BwD5$P8k&XK>4MFn8?T>$E9FZaBuR$NhnFVV5^nS@*A5@Bt5MSBAZ
b&wHR# dKkl^V+M8eGiR<kLwT?&CVluB?kt1tyR^!4XBh=w&JWLBYB\8AnGH^m/:+AMju$XQkTmCdl@%8\&?1t+
k1m$cS 5pEG1i#BipI6LPByZRjmWwe/ap*lRL$kP@J4wJp@YF>a+!m5Rc%hD#TGQ\XLQVA%55?cB9lRB$>iB5L>
Y5WQBp AYT?Bkjw#L+G<QMLB?D*yQd1RP%4>T8BW!$w#JaG!cnFX/EYEBRJ&F4!Yp&<Kd<GbPTA$PeRRKnE@D$k
b>=JX6 qcA!XjGDyD<PwKwEyhRJ$k=9C9W>lTcl5/EA$keMB@/AyYe4?MpAHXSN9RQqwch/AdXdZwTAWEaHA4Lt
4A/ImN WSpKT!wlYC\C!JqwA+%\M@\c>H6i:M8n@F5e\FLRMNBI:<iQc&^!W/eFqDNw9maR%+d1?9wiAhScbX+<
!5VlDm IAD9FP1*RpGklb9RQIAE=y51GqD:%c%BBR=GB4YFyWtR/?9NTn#^M*FXA$mqDZ+u4quAYnTk*WIVkhKL
m?*!8R Tk*:\\DtB>ekPyEp9kFXnwm>h1AySPTeJkFcVMWa9k:i&$D<Ra!yFn$FclnR?A$CckVRB9ZCAZl1#+GG
TGXIBc A<H!m6TnpN1cIC@R@&adcGFRk#Ic^Ra!qBbRH5Rb<N5%hjYpS=41+I?<G<$q9m!R5%B9k+w+kHWP%Dpw
QKcMim J#^FFCEkYCP9^b<iRA*hkEwc>A9a6Ia?T+>bpi6mKG<NlbjLBy4kXpQB$9V!@&@G4j/j9Ij@h@:#uj@M
/^iWwM Sk+4j9H:t%jB#jh8ZkY*nM&4+P*9Z&?ZhYG&1C?dta:@X4<=tqQ$uK>jtbYn8y:P?hK?6K^iEn=?<+\W
Ccn$q$ nPm#Ph@MYZi:tuJK+<M@&=4\n1l/nX<9TuyMX&J!&<TaFQ48W&&laH6et1^6DRZ>1ddulecQ!i/l$cSQ
P9F?%? te*%T&ypTNPX6Dn8WuIl6!iWlYJt=G+>F$>/l*SuS%8!j!a^La<p&lL8RCd/PiH8t&bC\aC8h<pD*+6$
!\hiF: /%4A&cXIwj=JSh<aL?l?Zha$%SPcCTl>Vp@i:W\YNTupmupLCT^atku4u1Rep+JTIiqK=uKV?cR#E$=:
mi##hI \4N^&b?XR=$SYY?dncnPkCSBjSL/5CSNuW+tl*<K9$=+PkL/cC4V/jTuhd%@IywdC$GJiX&ZC:wiX@YM
1<RJ*F Q%=R*Kq&Vey+m<HkZC#9hHy<ZuZ<e%l&wG$&thNmAdipbwQ\Ly1jjTwX%KZATFyQ/6$hIX%Zu=1IFKZp
H8FeyZ ZMk9Tlt@+uT%VaZt5PdZQ^6!DipVkcqEy#<Z%\jXmBdWlndyZdw&:e@&!*p>ahXu=>QD+:IaC?ylKV8i
:AC!ST hV4hutthcm:NbwMiZZX&bJKnmmehWRN!NDtdXCSwTH<$Fk<>tFbqq#lhCE41aH^tcp/jp/SRPJVuNi?I
+<dQ!w /?/&tiCpL85A%/9HPkiBL=V?5F!ep8jtE&=9#BNXZVPl$aA@$=F9##<wnTYuXjEb?QXjn/mJNnZnh4iu
QiDY%H $8H\dEwNF?T$%#M/qRSTS&jn$j%BVR=QBidnHbFWVHWP#mVFpNQ#GX@+dT\:%?:V^!cCaXXYhWZY$&w/
MFA*aF FwJ*cm\Rk:IV&iem:TtZd#R1#5XF+Ic<J!6JpjC$/4qjcNTnDuX5Jl<MhihG$/u$eMVZZy#YI<q+i</9
D9B?5t ^/M^@?C#41KYDRctpt*SbEe$=R8HJTul/6PTYQP^?dTmS<YyjD^bpPY$1t6^Nc!Q=wwlNcjN=$I#*\^&
-A<:K/ 00006b8fecf001202b3 Page 39 of binaries1.zip
HESY1> K&%#/pllb4!R>q+ieIuRXNtuln!Q\1?Vi4=LtkwH+$Y=i#I&$J%6#:Z4!cVT4p?Q!8tJuCnJe&4W%S:\
udE/V5 mVGqQ%/MBYMlb:649^wGm6ZHuh$!5PyR$68yKDqhn16S%iu^^@NDjq$j#5Xtu84$c%Nbn/aG8&L^kD+<
1Dp#el N/XJXXqJh!QF54w!+k^LKZ<?QJci1I+B8=^ZI+u=SF1Z%X^SQmAFA4LQPSuRkDS6mbG+!?u5CLu8HW$l
cyD8&4 :und%HSBTpY!E+uI+BZL?cF5?@t&wN<91aX$SQityICt1<HChCE8nujHP>LF4Jl\:k&j>aiBW?9qwtD6
BeQS@V TH&mc9L^t&iT@%b>cVTpue?tp+Z9^PP/H6IKZ>piGJ?bCk\HqZApjmnwV:9CWQQp@9VMJTk:%TbWB5MR
AeCe#> mkwX#9Cd/=:JZamen\:+S%dK81d4phm&\KC1?!dG$>=E?*S!K1CGE$=um!jl>/B</*Q\!%<KPL&pLjub
KPN84E /p8^5<wu=6Qb%Kjm8yKN1uMX4tA<EjVMlPJTIJ+NVi8?nluy&VayZpAyWV+4CDh>VlAknBcD$4yL@pVZ
&5:Hhl ihAy^Y%1PKjMV\?$Bwj$+iq\ZNQ#uSq=bpJLBb#Pt/J>jli&iS4K@6k#Ap/y1B6<%@KM>y*MieWj#u+%
YNXSa^ w866i8^eqV5w=+cVatC!eCcZu$4AX<=6Ca@$n@NR>u469=e>j9Q=hY>4!^/@Xj1:6d1T<H<C6ILYwipd
SRnXa* Fbj<>1dPIVZW:wG!m@?cL&beMW?w+&^h1K<ymtZLBe8qD\lN8t==??dWt=ceupti#+<tQi&V8miw^b\*
=SHMAQ SedTTe>Ew6*9?jTAQ^<eT4bJV#qh*@@4LLbc?uD%\64H@Z4B<9cc<QjZSdZa/Hp>y!5V8cSiCGTii/wn
T6cQTu tjiE9HFFV+ZWYQ>eeGRt+Y#L:8>PAy>Z1byqab&k/jYX9%#*&HdL9HIy?Ln1mw=NS*W61a@5d<6/$!Hu
\Wj+dS ^F\\Qm1F$*qu&%TkR\1G=<cy#jWb!!@ZXIDt5!!5Pd>/:VQ^^!*uC=Y/d%kjnKm8RF>hY*SkTy1PcZ1k
I?>A!W jeV4<$TnA<:YeQI#%!T^=4uS!wX%qS4WjHHh?YYYT@*C&9PL%euWiC1X#ttJB&iW>H#I&iq8%:%TPy+H
t#c@N# 6SkW#:w<l<eL!G6K\dK\hyteneNDHljYQVMlZHN?ab&YGjAZS6YAGGl9:W?CEy*N/yHRq^McYD!*$=pN
RRDPM/ lQ+pSd\&c@uq&pyh%!^94lME!@uD\44Q@jLYbPh+Ihw81!&6wcFwXyVC5p6*Vw%:m<t&tbS#t^V1&I9$
dJ#SB$ @6m5buq:k$Wj!qpYd16+i>*u@6e/?j#dh/qlJV$ZuJT?ITZQ/THJ/ZLJiuI8HXLFnFiWyQB5h6QA</#t
*<V5jA q&/#@C@l+=d#6%W8YC=>icN?@qLV@HTZM6A&4T=4C\=FH9^LX#Dd1RZF5SpqGJ^IuHWG*P*PMeT6k*ne
BXiZVG ZdWknA4CdWC:b>/<Sd6$*l>%bjTW$?Z<+E%lTb@::1eH+#qh#A?Nn:TFkHP&ycS51*\@%l#E+^:Lk6CQ
=N@#uc q$Wwi%*/@Hp>:@F:CkH98$hdA>%F/T6%!eTAG9yMh!meTdd*T\E^+uIGWb@L5+L\tPXN\TeIZ\cmZeLN
R<BFhF +!w$NS:WZe:RYNZ6=\Ln#1%Q>ejVYtL\&bqpy!eci9Cy6yqR\Ihq1/AYbkF*q%Cl4j69!#NjF8VQLe6N
L>$pdN JWC4Bd5ji?:/=&=S^V>*SpW>*@d**VtQFJ/cT4RqQdNTt9m<T%m:YKqj<k8$ph&qk4D^jKY8Vpd<BVtT
ApMk?d 8F+/&=Z9&Q?WJ>&hp5dhwjC$!\Q$>pR!R@*ac9K:FtY?M9@&5EXdZAj6Q!158XTl^tW%qW/y+1ii9j?Y
uC^MTL w9Shb&SALaVcP?bt@nWdVn$aDCj#\VmYui1!/BPX/e@=Lj4m8m?9i$b@*QKJ^*PbpY+\\Pt#&/Su8\</
!iq?56 d&kN#5cLWnA4i<dCTcB*$nNb$Hubtq1y9D%T1T>ie<X!!ji&=j#ntm:u=lW%L*%#=4t:jlF1EchC<$qu
/dHwYI ?*R^LCZFeKLhGXbe*Xn&=C<5!qTF=*/w\n!&8ca6P*@iB>dPu</N@tK9%#p/>\6uY#R>puiGmmEy/R*Q
T!Alqd QN5^t>TDXHbP58mKwF#!YRyF!!<6#@k%!@quQyL#y\61jPybb$lK@=u$bEkK!jMJq/wqQcGp<$Ey=QEZ
nZ&#JA !Hew#qt!*a>*QV>ctb+FZ48phFh?:6LhAD1iXu#PdVMJ=i#>?&it$twWQKWBn:M4/>uYNl*PKu/Wp9nn
XwSGCH XZ4wE@cjhquWh=e>b:tEbV?@MT\ZXFqQ%dcNBd!6F=+e>+uVYdBJp/H&#KD$M/jHJcjmbAWj6Em=^/8j
ChMyYP <Xt<ZSYZ%q=c?L:qtaXX?1!iG=&bi>db%/$>>eC&WDCmlu<Snm6V9+lFuhc&eN/unbPMLdMw\=eEadR!
9Tq9%# u\H=j8dL%%cj@:+q1Tj>TZ&kLiHeH>4$*Y>KW?QJ:H=yh5#qep>J**$1Pc4:8:DXb4>ltS/@Z^A/LPpS
^EW#N/ $C&ZF9Fq<j9AW\!Ap@De?PLNLdZhQ6>RiCaI?6EVBmjY/a^&h$Y\:H^%hdb+VlD<qwGy<<81u@pmeG1l
>cF<ka W5&NhG615mP^Q@lA/*j9FWHNAd$nYqJKh@c%T6GBcK+DY?&@@/\!KWaEAZnh@:uq/==bFH#u%a1$Q1&:
/9ZP\u y+J8<XuZ\4cYc<Gn<wIBTp=:QGJGen1umq4uVhl1BciiC\j#+H+pM119CD>L/?A&?Ecm8u<kGJdC***1
Eu5MF# R@i&i<bDwhbA9!=FInE^&P4!hpap1HuXj>$eH=/dBt9k%TjVcd%hA/5>w88=iV&epMJJy?i==tP%HdKc
<t!TFp :keHW&:9tMq>@*<+k@u?tY>m#dQPZD4q<phVaP^q^V?8/HyAn<e$bX+6Jq*P6ypj*6:/NW@M:===6m$>
imK>LK Myj^PpGqVtXn+56a<=DLu\%F=5EXh&ekM9mcD6bT$iXw&n@h:euPBD^u>*<I6Hy!M4I@FIyQBEN1>6/&
=<8BPA cCHh>m#wql5V@Wu@jC18?##\8%!pjXdZFcn>l+Hb=5LlpDQ<b^W*PV8L1u5GLIk@$VadeF+uByT^tX<k
9Sn9RB ^SJPQVE\yMk=ZXMn1q:yp+jG+^E6N=IP8JLitdGb4e<he+4n*4V+*YA!ua$PyRa9TEHXL+cw=9G\Hw%%
@/J\MX yRjmpb#8>#\LNTkY6CT+cq4YA^WNL98W$^pJ=j%Twm$et=KCk+Hdui*S/bAV!4+B>F<+C<RCma!FM4wq
uRZlLX PblMc@46ch$dCIh#A/:H@9L/d$w#PXe\>GA$/e&*!cHR&Y&S!ZmulG$P5Wa8ZJ!M6AJ@/JNBcV/qb%\S
@?F9@G *i<4y5Vp^NV<VFX#c>D4!91h&+Ki!F!!e*d1=/9G$8+=yQjHpkE>quT%/<:pCMmhQ8&K8Q\RkPX#*i=a
j&le*n X!:1i9:BD$tlWCE=QleISL&KPJX^Q9mhmDeTh/I?D++G=*Q=YLATAk56=SJQ#?RT$AJyhY=&c41aLe^X
V^mSNj QhW^NV8iHiu+1/\uqHj=SmSyyT8YhCdR8=>&KL+JVhc?J5+tp:K84kw&ktIJ/>$nIh>\QN4>5\hd&1TR
TY?$:* Fp*Q:b%KyqSQWQ1Fe%i\QV\Z\4Iua9G^ZKS4ylLI4MhE/b@i@a9?JJn/jMAZHM@tM5%QPb&8:9d=?aq9
aGKNA: =5QlwnV6Fb?/hm1ZC5@k4/jqPYXCXRyX\eu^5K\41@/1ZhH>d6W:NFZI^+jn#+KZMniuD+$pNlXV!bH&
Yc=RjT +j>/eNYVaGJhHqc&j#a*QV=eDWFWdncb?lQSG9jIYuymJ841#1R>?$XyJlmQSd6HY8e#u5tJeW>w%<@?
*6$^XX A@nXYaN&LDidma/1mY9tqQ+JSe5Hj\GtPldJ=:##YYX$d9baB<TcmcFWPQFlyhM=iuEt<iD%#^btM<=J
?tqH+i >P:Dmn!bC!Vj4a9Hp:tIi^a<Wy<:y$/GR1/&<YSe*ATGJ?DS=6Qly:SAPDukuZn/<dM?>$klkd@Y+!QV
n%%^ZE 16@j<dTc%a1/:w9F>J\YV&hte@tA18hVLTDYHyh*aCK:K=%%hZ>4RJV?KykKFaL>?P6kNn$TCYVu+4q+
b@VGDD i*\tPJ@^8pam^eJpJ6aqSV#hn#$NjtWkwp#t\kG=DWLa<SuyP$=@X#Rckq?9%8Q!6K4y#9caDKZ4hiG<
A\Q\?m tp=B&TNDe^DHK9q:uW+wjGS/^H%9Ytp4RLA9jZ6dNyQ!hCGjF@TSpWl:TFLqpZR<plTV<itC:B/Pn<>G
ZMFqdZ ub*l6HQHL==M61ZuqWl1j#+ShWd<TYjH$*I^E5tRh=@QVi6k*64%6E>S@dyuZl$J/4q5Z5pC/&ZuA98*
W&V4!j TetBcKiY&b9SE8Gb^IC#&VpWF&e\t98atqa>Ht@EM=pet5>=M<=\hH^/cKIa>@iH=*YQZ=w+i/>LVM9#
j=?YqG i8jBEcW@&i/jqRJPJS@*SMuL%d$RCSRqSXjneVWPZuX?JJkdq=NKKl4XRTX<>@yk8*6pKJb^#1pln!jl
?l1E&R F1Yu8maV+Tpw?*$^6\IEtW4H5^FFnSRD*qV*hHypIKb*cdudR91&meiQPV9m$^N/=>/l\dRW%qPT=QS%
j8VQmM h!SHwM*jL<@PFuVFJ<:4\BG/N><BRi9R>Ln5pV5$:hd9T+ucdXJ&Tp*4e<>PkL=IPkie?=?Nn+$QV1EX
nNh@W& qCJDkaA*GNeup@FCX8&MVMam/uBHYy@RI<A#hd*LN4WF@GMbLV!XHaKc/?D%FNYBSDCKW9JX*+V1X<Wy
1WMXtH cGDFH$>PyiYM:5*G%bqeRQhNLnmq?/XAb$Ai%V8i>W*Mk5QnCVyV%4HREMYCFWG9W=1P?QZb1ZST$$Ki
d\%=5t YH>EGZB:@TE6yii@@?R#1!SyK6$=4YdcP:*8@1IPwd<&t&\QlkF*ZaW:BQ4Zw<S$jXDLJbL^ZFKNT*E%
ntAhFD P^9X=&jj&4S!Q#D/pD\CbR>wwhX@LTumth^wcKKRSG=bF9M/?\PS8B^PymQKcHBRnZ9u=G^pW5=q>e\9
DbnP>\ @9cbdRHQYA#KD4b*#e^PkY/Xu94H>9/yaAl4Zntq/1FCCk!b11m^^LRi!aCD:Njp#5u+bEy54kI?V$#L
PA$@B1 jm*@dNV4h4pkNJuiP=b$D<+m9W?/^pNJq>e@P#Qiqe==lyQcbD1dVQwtynVq66!#>%<9Bb*>5e+=SZw/
^81HMu FjKEau/u5^*m\qn\Z:Dt+c^QH$yEbb?5!IQ=<LmYqA9SIZ<8:jdt>IEH9:$K@GquVw=4M?Q>M?Hb/WSY
&E$8&h Gk5EI8=BmwpChjQV1j:emN/X<8uAkNN/*J?LbYMD#$*1@nHyE^BNPj5uaqqbjLdVp^T#w?FE%%>Q#/TC
>tGb:w E5aG?XSeHR4F$4IetW%Pm:w&p=<4=8L/:He8^k5#kR>cA=&iWG:c4\dd+8Fk\DYh/ykMhH9hk^TZ@EQE
H%EQEt %=%1p?ZJqDKp#a&:9Hw/Qn/SeR?$StVh+&!iCwqTaFmhtp<+k?JMc4Iw8:6CtXA5+MK!M/=$QyKLnTnl
\kY1y/ aM4hGhIX:$lB<ehWhbN#6BkTu\a*$hPbdQjJ+qQhMc?aGP<I69@^%P^WKwlq^:KD<Y^Hdn1hp@%/yn9y
W>b\Hh XiSWim:Z*uc<Z<<=k/$#W#PlS:J1Plt?EHCDc9FqE>&l1Me6!qS&h*w1/w?PFmcC$&I\+>jTcd@QH*W4
Gcu=E^ u\:Fm%QlWL9dKWWn:WMnHW=9iH+tpRJQ/MJWPldySI4FR54IXGI?Ge<1I*wdT9tIuE9PJ#!4buM^eLAu
lnNwT/ J8aVu</1cm:VPyd5kBk&QBQIbpcubnJa>u#ct@Qy95JeyD$uKRZRMHw1ypZnM!jh5d#V*VHh*lGP8N4H
B4jp\d <\>KpY!+pNK!:9dyXN46tTR@hWmNnkX#@uk&NXJ+Pl/i#tbq*c$qSt/b#BW@EuKLe^EucEyqe8cyREjT
-A&jhd 0007911ff99001202b3 Page 40 of binaries1.zip
QmZY^h NSl\Bj9!kbFaiJ1<?%kpP/VHp>qSiVdk#iw^j:\4Mb9I#d>@P91LB%QB8G5tEZGNh&hEy#juCa/4YVHw
J%&e>G K&kJ%#DY@PjVYnVwXpd%/T+=NSH9!M#uFh&u8\c8Get>HaAAKPRSk@PKHANBDaYu<t*k\?YDTu>&HCtY
I$%KA= HW%t@Xw8F%dqmVAIbbiTuyStA@15hhw**BqP?Q4B$+&PVYa<#9G5GP%YpqMJ@:RcC8i^:EBTd$8MV+J#
K%WE!5 tewql?QJWH\8E=FX=<DNi9yudWuZXCLbN8=Set4IKW=HucHP\+GPYHR8/iyGmmZ<H5Xj$GiV*j:l!NTW
bY>^yP &n+jn*p/#8n1B/T<^!pFS<LTVCk<qt=L6EYKW:NymP5D*iP/J^9C55il:JT4AMwBHAYjZ<4/=nL^*HCk
!$kJuq j+ei@>=aIlJ\DWyncWXYuB$#YYC^$L@/R*=9A6CSu#wcWiVyhDamV<:yW\YqP^$Qm1GkQ>?iubwJ6M$W
QbyMlK 56Be+6lpcu@AI+hD<ZT@QwXhtQ$b/nqIbCeuw!N^hVRDBciDIX?mLncdC*dj1jm>A^$R=H6C*ZEqN@?L
/=ZRcZ aDnpGp5MJAaV+$DBEHGLFBnNbIK!MyTMJ*RIE>L#a$>u*A<1^Y?N1$w<+QFE\>Le*Nk5hu\wYbh@NyTb
?j&QVF K?kJ6T&B8FXuRJ?eVu9VleSwMAPim%?1C<emH?pj%@ZP^EAIRnI^FFeW:Y!hGAaNGbqJbF%hp%4Tn&$?
kq!=G9 JSZGqDbX$&dmTZ%Whec#\X5>ta/W+9JqM4/$PBFPB4wTZiMB/cq\etJML\Iui?SE^lPA518K\W+qq>Vp
>t6lqb ?yAVQN%It?KjCaVnYY>uMD$=PX5wByIiy>8j$hT?%5CIGHB&6$69lTi>?dBKZt+k$yZ!?46Hj8d*/Q/5
PMMecb c#\lnmY#:THb/=iuR?PVKchVVCbG+\FyY!419CtTmW+XApwI>C4mL1StMuw!1cdFwB/ataCa+Sel#%A5
cd^W\/ *SuRQeM=Z!ceDRe>@pC&ID$4B4?@1!Qt:Tmtk6*=%Cn%W9Zua5=JZT=AnKDq58*i4PTKyHKD5n!mnEhu
wYmH+n +=t&kDMmcjEPTRyPJt/1!$$u*P=mdm\TwBGQ!MT$uktu+?=BmAAHP9Q^i>6Te!E%/NLdFM>RISd!8Gek
am5wt% !M5=&/dGut6?ipJJnETG89IhBc!=:6GHR/QAy@GWFB5Qi45#b>%Dj9?$Q!84a*w1ZpmG\EaZw^NTRE\P
P&C<Cd jmmRe<:q8&ima%uT1hqIIJ$PBPPnmeFp4yn@RtH!P%Jctl=N8GQ6QpuQ^5=JkbDiuW8EPpL6#lc4T<$Q
*NRAah bki%bF5T!>bt6du<1J=N/6KHw6:8aFS8ea?w88!jpdP#iqmjHy\K#\dtNC*lh9XL#$dW\SuknM=RFQ*W
%Z8T9D LSG9H8<PFHSN?uMl4e\>/?%<FkemWktj&yWJ/YFXpyJ8%S@XuNiKkWVH#QlEMS@K!9$y56?1Eqd!R>*l
uSmka5 cjWBah6aVFK$d+aWbXaj!4cD5?LW?^M8b*le$8iqwBVwCHn#lhlkPnR<p/HwQViyk#+AZ$?199eYjj/9
JXQckP ^/dFSK#du\qPyq!BkP+Gb&\5theuwtI+HJRTwT=qbMAZ#A%$=uDWRRHdQJj4V*1HR5><&^tXhQY9^X^Y
j?AtQ4 H6ZtAl=X!&tywHPwj%LTE%Im&T/NnYWT+dqCbmabSk@:a:QKyPIQkT<>M/5>%c*ywZ=uZh/9K6M^=*i9
u&ctJN eeWmPXH/&>C$Q1NJa%Im+e#H=?Mbd*jE+$H:9WYPK*yTh+t#RVpkRd9w^a*6*ZIpQV#Z>a%X51^NJD&i
bb9>?$ <YFJl%adBMW+uk&Qi%Ll8cubii1qt5@NcPDH!*Kuq4j1w+G^y&:NV8w1^CE@*BRdVe1l\GA?4T8FlCia
<\K@nk uB8dmcjHM=QyYHRklK&YAW<nwEulXLj5mpqBEMYQkP8u=ibt@8HNXhNJQhajCuaQPCiD\KuBAbe*%^?b
e:>kal H9BImjF?LD5iXdQk?PmF@ImYEj>/hH\14AiVET$8utq:cmVu!aXApYHbW5kuF8at+9E@<Wau5!MDChLu
$<TtJV 8THhtjaEZjF$BGRwYW^*#?l?*VekjY5mGSnSl=M8X@>eWI5/ZXKpGM\X51/R^>ei/FK\:HAMuL$wqD&j
DTk%dZ WVMV^$jVaeW@yCbBdD%#RZ<pAk<P8iKKDBS##R!ER@=aeC\@Z\\u1P!ph%b*=b!itDI/QVwjuC/p>R!+
%8P58\ D*FSinw!qNDWkZDiE$6$1@*TYNbbVKb#/uB5Kmwq9TNa>q^TTYbHhN$hn!nV$ctJ1P!J1dKt1$=*hkKi
CZ8l=b P=>$Dp=BdD+llhyA!+lKIiaKFeLlEMq*enTu6/eXb*yPha:MV$#QJwF+<b#mFGPV$$E>Fk*QTBBdFdNP
t8PRna q>5%FE/upy:<hGwttjRny&aD+GD:8mH<tR/Ew=tPZG^T:%bnPWW/Lc6/YNcTI4CcDG==Iyd>jmKWK$/+
\\&u+@ ZaQB6tD\EpX#WT$NLSthWn?XLMTeHjJRT59y<bR#&6uiy5+t\4NBn#NilCA85Y&/T\@q<?u^=GA$HMic
X#AQS% ^<M=d$GNV?bG^5/PynNTJJd&K=15#RYhWHbc%=J8b^Riq*X/*YEy$/:Nbk/PiMA<Vn>Qbi9Fj+^pM4Fe
q+^&\I @6uy/GlS!4uqiDT6V\dE?FBwMNV8CV<>FwkYR$:ub=PDRTW\uJpeD/58D@and\AueDcknp:PV$!Gm@y$
V<<G&4 G/mtYXuZ5luuYHJY$#?klFQjpcF5CMM!#t<Nn891%MZlJNk#F@XKn84=t/eD55?jAV\n14M@Ct+MMN6E
tDQ\^A aBR5Nalm?Mqki:R\J$Ye+duA:F^<8nH8Gb6P^H>KQRjJ4n>Y6XRmMVKk??ZIZDKuyFW=ttkL6Tj>CnS:
4ahdR: ?yNDE#pX&4^@Jyn!/>&j:ylLDu!tk*\H^ijQY:*PRnE?ujdM#Y4^@yn8m?8cutqV%eL56JRW#\c>E#tQ
$V#V#Q 5!MEeZ\\H@n:\ilkM8n^pdiZ#p:<w/J*P=XSJSyZp9twHNHq&S^+b>*6<a!ti?LjmSb%JR!ld@<MSP9:
l6:RA& 6mubaHk1VNwBNH9Y*S@I#<Zq!jtyeV@E\j1<:m@1Kbhd!+=ER8G=b/dGA:GpM^RP8V8X%FM*PR8!^^*\
b8/@MT kbVw8mNRlI4GjhqaJ8V&JdLnt8JQK*FyMD8b%GjX?YVZL&J=dV+L*DIXDKRGh>&je*WpR^/Xwy1RQ#I+
hd^lyc M=&a$uMnD*+n/QiDHEFdbjIBy%h9p!M?V@:d:h*6ewe$JRWG$<4pN\+GEnqQS^lnaF%#kEIA*>aj<p*Q
=Jj\8# *Q:?%pR*/DV@9QcWGw1/>FR/Fb=<#yQZw*MBX*@1Kjhw<6/Yy!h^>CFQ>n5^tly\/wtmQq8M*L@>?ull
Lmuh@W Q1ju+lF*&\^\9#/e<TRTh*X*#IjSdW9G=j:cj>1ZAD<@N+b6H9C*k&@wB9>e:qb!A^XPq/+Q1Ww^A8GN
kMy+q6 %?>JV!bH9>?bq=WbKb!Rk8&hpYiDHY*=wJ8ZuXhnaqTj!5bH=5atby/4<$cnGpSq1c:EiDGlb>!i^Nt/
6d4tuJ :8/^pNMFYFNKa4y>?Kt^jHCTSyut$>&FhMw#w59V+BH&T%Je%>Nyd%mYw::PiF6MDT6mF=RN4D$&E@YC
GZ=H9n 9y<N:S$ID8cTcQ&nTmE=I89VaRk5b1QSdLB6jq=SmytaJ=YV*dwe<ATq8ukuKDXQ\8&eBE@C8Zl&dCw\
Zc65kk +kH=9k/MAdT^B@!i6F?iu=?EiFZj:I>QV5@tSmbtb%J1bQDeW\q\pb&k%94%pb@Qnp*jGQLF+t%wBcjp
Ey*RlX ^Fkp1YiTw@JWK1bpkpQSTD\:q>CW$HVPuT5EIHVhy*h:=/SRS!I$WJCpcQF!6#TXn#=K++LRd94kyJ/M
8HYFuc ?ZY=&??j%dYC:9e:+/NchFIbXeN1yM/yFmiiCkb\kQb5=*A/JAdh&lV%^84J$akunYZQBd^BbW:Qy9Ye
=yqL^* qFC!meB<InnhqyStk4y*ZATKPeY$tBkI#M&E$8CIWW?S&+>tclS5kF<9A9mw:p6Q!Q1+Z@H:9QyI6H<?
k^H6DK 5NibXwLPnwpp<IIw!c:B&jB$Lw\Wm?q#Ym\XD+VVI^CWBH^bNGJ/5E&hV!ZVIZipH%1=Vjh%Dnk#dhJ$
$BpA\H M9Q5kNiVhH9DiShTLNebV<l/6wC#NMbuyuN^j%dZ=uT\LQQ1RHI!FR4QVF%$yuQkcL4huuT5d&w1+kqF
!=T:cI $5E5c8TRLI@GB@Z8bNh58Bna4?c#inIZq9K/%#i8bbQ!1/te#/$XJ4JPb:Anp5qJkhtb&hqp4wC>NS?d
8*D5d1 u$#qW*ypD8iu=B+LhQ8BAWcT$dlZu<$H\yNnAY?H>G^hQPh5uWkEZN*F@*TP6EQEWA!T4=me%men5/w@
6j1>8* PBIC#?/9A6PV5my:?4QKRAdKuqctAQiWtywwTNMhM+tMX+^El>N8h!=Jjdu1mDQnX*IRHiy/bPa:D<KQ
!BY!M1 e@G\4MjVw<Z^1Kj6eul?KlRakly*BN*iqBJ\nw!HIMcPab94$\=>JBmjXDQ?@1RYhLdG>ZS<LnCYuNiu
nhdjw% 8+8=CBmDpGhKV\@QQPWiCIbpLhFiTID#NJJ^5dI><?C6BiJJSa9p>\jdW*4^*<KKypNRtJ=I6j*upCi5
EtE&^: PEjTIumc$unR=?uKnCTuyyZPLNI:QS&Q6th#Y6d9n&lnM<qSQiy@#hYXnQyV@wGeZ@qTLPq!iwHHuE/Z
L4njAX J!F4M?N1AALK?a\L?V\@QKjNRpVtu$/ykd^:JC44e<<HkRCbwWDcq?mWyn*B:ASIR1A@G>CD98>HV/em
p8p>I= uh%KnCmty@%JZ$SSRMnV@t:ZXG+&y*@:Lmp!4/hGBqQ?#IA9QBXKi=&k%y#68nI:N==$i#Kl1cpWWk!w
<Q?PY& /l@Z=5jte*=jJ8@$k:k:Q?FK#iwliV\htapFk^*SGZhMk+k&uFdGqM@HuiGbeD41mh^Qa>B/N8I4Su*^
W#GbG* qDw!GqB%QX=<9Q>$QK1QDE<wR%MRIp!FCnyE+qH5qi*?=YVR=ZY=W&GcwcL:k1PyZHk<ubelYAy/jRZb
&:%lZ% ?dLLqhR>$?pe6uFuY#DdthRHuE:\8dQ=u$>PJWLb8N9uyjGTuJIe%+5VljlwQn<KF5Y9@$w5VEX!iqGc
lmJ?9p KM1yeG++PbkbqSLPeLA4Mlp@P^\CR#KdCp:RdApIBPVPqD5ty=Q6b+=$?uPyB$JBX&wpQK=D&j$#waAu
*!NTPD &1&AZM?E6bq<:wD1cy6&?h&D$$m^iV&j:hVqd/euqd#/tijm114@\DY$dpmG5tNFPS?eVdWqB4^P<LEC
wjAj%k j4e?JIGC<+TLKVd:Vb>Q^?ZI!A<B61>@dPatd##/!Y\\Wa^:^mM=:<V+aCkWua!1Y1Jncmah>E*?XAwG
ekjtRA \>te&+Qn\B>J?mAM%GiQ^j*?uQ!jk*GR%P?E6jG$T!8tR5XWMVp/NbYbmnklLkkYpyM=#ct:1=MV5$te
?4dFp* :\D&P#hcVA=X8yP1&8pbS&hkV</VWPcV+$Q?:9u^aCL1G9FB&Y*S\b^uJQcMFA/u=Z!IWT!dmmZV1t1J
#RtZ@l ?d$SPVReV/h%b+j8tw!M=qPJRmR@GQX+^wJ^J#kikiq\iuTtLSEM1XQ#4KeIjNwlZ/S@#XBP%$ie*ZP/
l\\FH& M9EVjYbiLtatA*=j1n8bCkZ!5*pNKBaBP!R@:IRGpBP8/ACNA/j>1X!^8GbYnR=N@<#nn@1BPH1:uy4M
\R1Gy= yBP#+KcBk#MbT4eD^Yb@$nc9TN5CQ1<jPII<LquN!mQ^e&*SCInF=!I#8jq5ZE<wujJRPPRh/8/Yp&J!
Lh^T=V K8$4TpFui>a*NQ>VKTRq+thhQw1J\Iu5uM+8jG^In+BY9Mp:wYmJkL>Vup\qe/:WZLanuQL+*Gyu\lu^
iSt4!B VmcCm4l6Jnt5Thpk^WRAynCy>#yVuX4TJ%$#uP:&?9X<bqTb%+yVpbFIMB8JnKX!Gii&tel$q#L?*FQ6
-A<LhK 000c99de248001202b3 Page 41 of binaries1.zip
=Q+1G$ u9G8lG8I!6aX*VWh?PtkLKjqXHFuWMyEyYDeH<pNna>:%ctbRqRM?5cL+X>MBhyH=QdmZK5ESp:MB1uZ
dcjSM\ Iy9&1B*cyYSu*Neyh#+bqn6B#YWV1jm5Wy\a>*tCW#QV1RE>+/##KLw@*9*kNmCdKwWLCbLREZ%5QQK5
i5yH&# Y=N%8XMYA^*#$eAkBFYKd*+1LTjC+i#+eG//EIJYW*QchPc6t%^>kjp<BGp$W$NPKqL1L=?in5*E=Iu<
!Tjc4K TL64Xp6H51t+Hw<PVGlJy&9k$/F8jT4lnId%iT*Y$TyFB9QnpTDlq6Pn5>ND8@=D>i1k$mAm!L5DiVW?
:h#CDq tA$1&XtI$/V=tak@W@!h%DchL$a:e>?@!SNMy^>LDe/mNaDw>//J6MZdHW:/jPy$KnkYG=&e^4L:w$NS
yA+1:& Jb\IBbMJy^=\P69dawuwkH6ZPB#Jy>%StlYWmp/te9q4ZHtZu5:Fl<Ql=KHA6KaZ=yL/jGwiuMJbCCl%
%%4YcX >h&E$>8lVi4^&CwytSwLBV*pK?4RZANhc@4VRB^XVtiVw1RPS<LJd6*6K$TVuwC:M!KN!^%u&!J8q#PW
6yS&hn PQlBb%6pcH=1mu#FdFKNyN?>PX4I/N&S&d#QE*J8GXh%hVC5n<Y%WDnjMVeDMk>qn+Wt=#X6=5@D1ZVR
BM:ALn NSCq&SK/Q/IPhL^@MlaLFMHyTIhuybq<8<5d%<QKHMTXuSGZF%RWSBZy5dl4&lu?qhM>MmlL1RDN6JT%
QJZ5&i hH4l#8ue>Ik*1dkGjG+yAp=&eTwJbc6DupiTuyA@q@69!hpXcy>VhQjYc$atk<EbTYH#8JKF\p?nI^M1
eqBi&? 6FXPB@kBn^V!y9%cW5q+k/GJaHk<McRPP69GE4u8wDMtQX8RC:N#el6=8d48:*:Vujb&n:nA4BTXYDaM
H+SY5A !6tZ>G1V5<ZC:FSlbpbQSYd&T&tZ:Jc%Z$m4@MZ^wRF4q5*nTmcX#!eGqQ!$:p9Fe%*#+buk\In1Xd!b
QH<a?j !HnW:Zc=9e+l4iB5:$?p\nFu\QuBEVARRXe*Y5F$ZB<h@@b$8m5?p6S%NbcJiJ#l>HS/M1&MFw8yXK\6
hSp4Tj %cGuI=*dZC:9/?qybeDb@I@F/YDiE<JY$^SQW9&^$!hu^phuC#q>Mw5P*tk?1*mV+?uMaCL1>wDa!J9c
?Z?bj* ^<>G?!jGbkL:Q#I>ZAn8!EHbi5/lc:uK<jqW#JiV$>G5QDGV<QmVY4Sd%YaKp<u?aCmmyYeu9nti:p#E
>:uY>? 9dL+XM6ibh^XCI^k#bZJyC9&hBAe6FpqQyL#n?1icCR^%J:LS4!S#p\\NDk#E%A!<$?%8^Q#M<YJGiu=
L9#KX6 n#nFdEh\uHA4+FFj+<wN=IetXjqnMumB&R+>yR:H>YJYHm*MJQ9H6jHS=IPBHIS8+>Mib>9V</uI@NM$
d?P+ic u$qNi>#y6jQkyM*tew8YtB:6B5eRRyM5PAm^/YBRCk!$/<u<p+FMLypjGJGptbnL*VESIG/Sej16!^?J
dV+XJN JZ^K9L>K>?4=8cniQ8Aj$k8#tYF=MDCVXn&=4t<G\b+Py1ekLk6/atQb5VVXQB<PLZ+p1e6D8Wtq?ARE
M<LF%a &8u+QNA8u\1uI4H^VmuqEejVI=qYb#RiTib>Cciu/GwLlAM/>cithV$^w1Xma&Ajb\MnES*CMh*Zuw:w
k8FkyV ?5^WQy^$6$j!R>Mn#*aWkRdnRbhVtklu&%Ln>P8Cq9RWI%+>1$DMJa@4YnA*ua4tNC$dV9l>ZWp^Xk^&
K\/k6> k?j@Nce18%QFR5LbDmw^MCnV4>Qk&Hq%yV@jQS9*^>TpV^@X@dpSSacwLyHIiJ/hp6L=pb!9y<$#$l$G
?1#%n% 9%eKbj9uu$=*c6S*Q#tVXF%iEA=jbq+d%>QB/XSBVZiD5CSH^&KFj\BHK=/PJ5cVw>JW5ykKB=#lbCk*
q^\I?y IGP4wXN@q%hZJ/iA*@YM+wMR\=<iH+J+Zqiup?:PAETwCZqiP/QG&/Ll<W^H$J5I#+ckb8VqVma>TuIw
K5ulMj y^RTkdAiu$<u8\81wtaDlYV:5Ge!=@G%TZyZNND8q>%iV#EtkR@qew?B<umiyEVZJ!H&Hp59dNSnGX*X
>dtY>Z ydVeqa:/\cGaDtim+cp=&cq4?YBPu$lF81i!dbF\Ny#ZNeS>w=L#lDMiQi=Y^N*J*KV8>il1ZJM@uB^y
!nkkWb d^>PlPi#$e=PHR4:J!$hGE*PKe/=&WBd$NW8K@D4P>M^Ya*4:5^p?6$Q/KNKW6YpuNLbqjLLcnHaqa=F
4:!?dM QPFyKL8wVK9BWDn8uImPhE:Ia=yikYY4+J5u&4YWY*HqapwP%QJR*K9yH=/LRVW#A@LMXCK1>\iCd@&&
JG/Ch@ jYA$qbqQnMRk95uHm<Ty8dte/qLHMaTcqHQKWKcaW5C#H@LuQHQS#uSZ#niae1c%\48FeCAD8nkeG=\Y
R89p=F yZG94tP9yKbQTPHI<H^YVTy/HFXlIc:+XVW^wI<p\4LTMSZ\/n=*eG+t&XFMk/L4!w8^XEnZXI4Hwuwm
ka1<?d 4icmEJZpbqW%Qb*9uE@u+>nBFlmFMFPPyn1C8Wu=ySFuaF#MJ!dT!e/yRL?8=ElK=lNXA?P^SBL+%Tiu
dPdFl6 qXT<AKbd>npV&hGAV<>m&eyILlwaCZ4!<c:=1WAYJD+c%@&5d&>!d#\9i!bVik^p!?@N?JR5>knPS<AP
XpQi!S l?M=*<DEiHy+?5HSWCRw!1/P>FS!aA^CQ/y=i8dNXZQnuwk5K*I8y8e!@qT*Q/6tuZ@TWa\M/jtP^Fm/
IB?9?t 1Kd%#l%VWmEbLTVeE/G^=ElcHTeL:H@?44m1BWjmp&CM5/1ilej+@ZEyqt5j$Yd$:GSCHI?E8mdnHRqZ
Y+qiY@ @*\\Mk=t\VQ8%$uG<wZ#uhqI\Di6=FJSeI1m<a=+ZJ<9@9^$NJ5i%+M8>&C/1Pq1=!%8X#ATLe#E=pI?
@uedqa +FS>CD*56GPV%?@Z^6W+cLJpRe:y!4\T%uQdWqQSk6KtS$KBki=patSm*PpbuJpQm6P8IJklSbtqNu@5
F81cl9 c>FE6q*%=tRN9CXNK&V>PX&itB+Cb^dW&@B5cn\Qn!@?9T9k<91m\SHQaAJeYX$lu&utbnCn^ZFqJDWN
?CV1$9 #qec@mWup#ER1JTchA&ty>*mVF^JnA\<em+WDI%q&!bDkZ/\56w+&LEdW4&8iEReX:!/Z+*y*yG+H9J4
L!$<yS ?8*bZCHR4i9yIwmqQ#Gyy?j!:w:C4BLP=KhTISiaVC#d4n<#Dp&Rn&5=&T6HIBV$ccw<p9SQSQXCI1^+
?e95tK $+M#py:4AB*uDQ=6KJX<5BARA^=NZ>cJNuV8#+yy$F^#EVWN@?J!Xuiua#q@RW?=@BlXlkJPZXLp<eVe
?AGl/w ^FRt*S<cu+EI!?th%#MRA!>V1<a%*T:G6dRKuJ/h%ZQFkm:Qy^NiiYw&ta$uS<KTQnt4P!@<l:9VHbu>
PYPV9Z Z5a6TkHhq/S^@?h8XpNbKX*I1dL8A#&SnmZ>&Xle%jMR+&u/ZHk1/R<1$eB$\6$^FT/G&1ZkBQ\/4e>l
1\68K/ @Q&dRETQF=S8bTmi!1YLm1K4EN+yR<=8&SPLlHZ9kEjCKV@V#1DHui\Yk<FRY#CwK5Qj^%>@b%TdLWdB
uX!YG8 T\F>1I@E$*+I1^S@L1&@G<j#1EM#cWpQ!FF*:qquaMI#y:T*BeS\Y9it9*$@Lq1:iQ4mcZQF&S@iiNya
e:hytw p@b@YNEtqC%yE@:t<T6Lj4h$+?uqpHj=pw&ut\hu<RDG<w&uD^^a6p^a64n+#n6XXWLq:*/*a5Yj@:t\
d#T^u8 QJXc5cK/Y1nml@lYj?Mdj@1uh><6YQml4m9c&4b9l@\4h?<YlGijFXd^\#/9&dk^E4u^StH%5tYB\N!e
5RF+pP 5EaRDl!+:nw5$W^L%6%>Z=W1V$9m<IIp#ClT%ZQTp@B@Rc1KBIcHB<<wWnX<qKVVb^cpmmij$/TKM+jW
&\X4+% wiYHBwjF+c9T&mey6!R>GaS@#$ucp^Z+b>Yy=<ap/e!b$&epTZ68GiVRu18eP@Zpp:JW?emlS$:Lwubc
F&Bu1m jWR+4S=c<<ly>8?$mH?%S*Ty<4p*u#8>KMKDFk@yn%RN\ljmI+8uK/YnV#/mmqYQ\GhBTPuTNcjQHDw$
Bl^<TJ =B5ilM1Lt4Remwh!yI19u%cqc=/WVy<i>l&PDL<amYlDN$I>EIMpul+iPnM<QDR+DQXZyYYuB+e$=:Z6
8^EQt$ #1GlF$<QulEqpjI>y$wCQMpCD*#8PjmS?6\KcY=PpkaHl+a$5iL4#>$kuwdd$uN#kA!1A&>QQ@q%bhB!
kW18+/ CMANDmKMc?l6Y*6d&&DdpHyIiPV1+Qwl/SD<=9Rk=yG?NnnaN6l?ePmS\cFD^eF1eW//=hAnn&mHKl<b
>BS!^S FIV$G8uM$KFlu&<wAmRalKc@5ShKiSI4KI1?M@@t<:$a?ZjZpDcM6P94Qc&h1SkiW5+IpmbYRd5QDR^w
L4D!m4 R:4QM9S9+nCmX1TcZ5BC&PBQ:?pukY/uJGqM\ncWSIS^6>k4QjK$?CTCRpV\Q!kiPkk\H5EcQ*LwpDn+
eFy#Kq !CMQ6>%!$!$Hd#y+EL=yk:8DmQPRiuC#iHyIqJ:EjKIE\A<ijLmN<l!pDI><<duV*^/E#N4k5pPCMLeY
m?Yd:& Gu:w&enR^cFDn\\jGl/EBkjY5n#^>ceS+Yu%#K1LR=E9A@!lwVNuF1WQQjF%/dp9Dk/h/S5C?k$Nm/iq
MqI^JA 4$5mQKJ6cCn!d$MZZYip$=1$?VSW?9S#+uP><D*R:89T/YQm%/Yn$yN@P#eH$AeBq*Sc:K%??5t:kYyu
dm%C+6 6CiFZ&1TAL?$QHpc$S\/yD*!S+D%>CPQuHup$M%6D\CJBl>wc<NGEAFc&!HIhYn#<NjdB1Wu*\R1ny$i
tFu1D5 QEnjc&*/I#i&QWIQEeii\\a:>MlBJPWd!/RlIMdKj#95k>acHyTGF!Xh4AR!>ttuK</Itt@qq!M9A6aP
5JyRRQ kKyI?le4^d+u#1nDc+ip+chQ@<%y?C?hPRS<=%5=>G?H#$RI+@>F%d<A^uYhb+JkkTV+qETCXPFKqC&L
/IMSZA ppuaq8%awk^K/HVm^A+RXZeTFl*Wbb5NdEBWuXN%GP?1RNT=$C$^$+TTK1B&Y#9i%bc1+dWhLW4uZl!T
=LAY@h tB*QTDXYNM@iSLNY##/u4a//+#k9S$ai8>9h6pYk/tK@:%\wQWM<Lkme8uZQ?X@j@=@@@<@AQl4dlnKN
PK\CWT YKp!Fm\uGl*K:bdh:K#EG/$!X4F4Ht56tVb:D<S*dI5!G68aJMPHpEbl=TFbmVk!KpFRCYLqE*$lNmB+
\H#LnD wiTX^IL8TE@HHT8pNdZSEkeJWl$nPXG5RVQqAA&T@6pJGjkBCB1<nuYMyPP/WbXVSmpIZK@*\l69%*?@
W5iQ?Q B?4beG*HHu+SJFKXINyI\5?y$G#pqPI<i^n=VqC9l+=9Liq5w8a9n^jNm+%&%+C/4Xc<teVHPKMX8>1%
Xkn=NF ZX5=ACyD/QRZqj&u<Z86?D%<n#BH/Ya1wEH+KcyTu6MFR*1BwucL4F$RldMqGT<Euu1ybbb?JMVhA8ci
hLK/kR h!@EjC*Z\@E@cQuDR/<F6TCw9hXL>CPmHnwl\WN&R6N8SbG<XZ?:@kie\yY/npDMMjId!RiXE/%FG=T<
lRH+:^ Lq+A^8*X9^/<%i6>F+8Dt\#5CbW4/1/iLD>hXpXVcWD=6a/6GJP#bZA!&H8@cS9w!\^Ebjbj&V8^^a\$
#mm:4! cCFCLb!KqQktSXWZyG1TaR5CnMkFAKpKBS5X1wFcmi%KWK&XSt9mc5$DQ+NFMdt=R8X>t^JTCpnu+$EN
\?lci% yK#@\i@*eCP6DZtPyKCX$GH>lX:+?:&*Z?kFNwnI#tjAY/1mtmc1lJF6W5@GwaIpS%VQN/DF*puM9ya!
T4=d9Y jV9T516!cuL<mibW:qp%&RWXp@l\h:=alHcD4VAb6c5!WIP:yZ5CaX9@6LWJ9ncmBI&K1TnMXIJ^wYAQ
!bPn#: kVhL*qK:tlTGIXj9@/mXqD+u^^bA&DulC@HN%bek$@/=+F!yNq4\5%BCYc!GL>X1R+=1N*F\:Xk\ZiBe
-A#JVp 0006b7eed34001202b3 Page 42 of binaries1.zip
IKI#y* /%hE11kWH#?EiMIiSL$i>G!>:wPtQ:bQt>l$I9\/ZkNJ\J?tDZXFat=<=#8>Htl5>h=KYTMt^?iLe4Tw
*YSkDc DbR4&ZY%yTcFtC^GME@1+<K$SVYwFtBGLVt=bTZjQCC>FLpNKkmm?WY\cpG9NkWbXqnaSj:pF@JllApI
jWYM#Y >hJt=JXp4XV#^twqV%Mw<jiT%QEY:pWFBK:><$@KwAT^jL$ZkeA/ZH!=wtn1DDk&AuHij16?=aZZ/%Fw
:?nY8I w+&:>pkMTqKulKD5wdl6e?XK&jcnJ<K9Y*A^qKmdIJcyc^hjHjet^/etm%&qCAVm:6iEuJe=t^N6diVw
M&tSwX 1qD#RTpLC!kl*bb&lebpIA=SB^qH^%?mEM1T:MT9$hII8>qcMj/=BW^+!T^\qlBW4MJC6XDDktGPJiEE
&AH5=< N%D@6IQy8p?w&W>BMGWRl1?EIW\1Xt@T^yCa!EI1Z?m>Jj@klhhkP!^p>6dcZj5Q+/m:Xq=!AKYXcl4D
aMqVLb iaKIc<F:4:\d+Ve=cF/D9?J9$YT^8qkMm/H1AlF$Xl5NV+!PFkMXqyYT=yla^:V\kBLT$niHKJye?$Ri
Rpl+/F l1J%$>KJGJJiW9k=6haAjV&6tuHec8BJC\ZX$HPRQNYm*bSn5J#?%aYAFMj4=1wF&&yR=iw^MP\Q#<wc
J8AqJd :GC$$a6k=\XpKaRJ1KlR%wP*/m?ApG>i$aGFlene&dHH+nY58t1&VBT19l%6&eyp%:RMIaLhiQNGKMAG
TeE1Fm LcmjDAGWph/Wq$#6k+yK:ItXYHZXcFYQh$$Dp%DmEc6kJEy+SpAYGctKcB6\dRy=FLZRRE^Y5R:AAKNl
y*#^Jn 8cNqX58+k$<VuF5RIt^n44w1athkhH+cuP^VAbQ#ATkkNhSY$yH#pWBnhY?EN<B\aYRY&<Y&nXVWDH69
N#aB*# E^Z$An?JE8JYG&*di?NwA!c@kkeEQjH\>!t#wbVwYBNG$T$LBQGJepjpTE%kuHXVZKSTk*:B^$4ZF19T
GI*A+/ k%/bwJE*u<B$\GmRQF>iN^WlCQG$i$k<tklyVDBDcM?p>Fkk&=B%ED65CayAIA5Fac6mVuwaWeWjCnIy
XMBB!Q :jNpAelYu^A%+Y8:bjaME?a=FPkp#ERD?\k$!#1pnwIJHj9&4RC+^k@iDd:BSlDWN\pE<tl5Y1IhR*SN
a+iCNP G$aWMy!4ABYcJL#jLlEH\+#twE4B8Y9R%bXEiVu<\1/8E9jqSFY<YAdWB6RX?<E>WJ:*?CCt\w^iWZFL
l1R<dC <mpjkAKSVkEJjmjw1jylT:cmSB^ZMWb9&l>mbpEL8miyQlb+5wV%t1+YF9TCi!%ENB5ADq4Kc1EA69&d
I<cL>W Zdp958<t>9:R&W!aRRQLhR6&EP1uukVHd>n\DteJlE/^A^GQ+D>hK8I\VMDJ#yR1dTCRk&nZjpcJL6lC
5JR&VH EBRAjVenAH4VZZQtPI:6Kp^hLneP8Ai#tDQlE:uA1\G&a9$DY5\m<BM6HpFC\eNER?y?\@q/RD@4\LKJ
I/N\$e jM^4GbmJLVBtReaAEIH\QLJ*!d5cqL^CAPaFwn%i18d>eLZqqJEwbDJ@hW/DhT&XVWR&W>C*wa#eZIQk
l$K*t@ liBh?*#$u8NWMR4jSpXW1C&IG$ldciFX4hZEQkBn6#wb$b!CmcXbq>iXiFuqK6&BVaKHcGS5c\NW*cKJ
?1Z%tE dHB^5DwXmG4nwWBTW%Ja6XqZ+>c?d<F!kDQC#!d/qHI\QSaP#?ZlqyVZMI*:q=1iB@TPlTqaE*lRQhwV
Kq/C41 k<JH+MVWFp1yyIyCLS6eIFy\WDCV?hE8mLEdJta+4lRn$W:M44/uX\>8?Y@X@S:$<d5D?^p=PVYFi+9m
Vt%H8> WkYYn:^bt=+Pwb$NVcpB^ARAnKQY>QS\GIIJ:=591uuT%eI8?5FT*:pHI>?E<4Yh*#bq\C$qYyX!?CZ^
bNIqnq ?XK&eNZZXEqkc>9cNJR6uZw6l4lhkBuEZE*WkQP$lktXIt4S?+JqNnJ8m5LAi:RKn&WWdF5Ta%jPTth8
5mQkec T?Dl$Q:I/X:K/6<<R5D*LqRl6P:W/h^y@CDB\i@AV/qF+jP\HRQ:$GK%tu>mj9TJ<Zp^qe8yTVZPY6!K
l/ZXdW ik:jE@9*Gw94p\AP%8K*Abn48lk*/!LKKWKKt8>HNJNWW*Ba6q4^T1mcpAA5tYt8V+6<9nd1R%X19a:y
F*c+BN ^y56aIWCy%5m:IQVwmQScSum&+JjMZVF1qI%TwS^WAJkeDC^48y5cXTAyQ!WPmpeBYXH@XyYd5dNSB!A
bEB=lD wkMI@PYIuChXch4QF@I??DVWRV%+9Xid9ykbH9dJ*%H\*HVX#%i4euS$9KmLm<?QhnG^$ETe:tw4cp^=
NEcawd y<1JP5dySpEdYqFMJP1IM:nBhK$&5YMQ\MQa6ANAyE1LVA!4E51HwFDPVe54BhyF4V86%bb\Qmnypwl@
54mkE+ 1AkBqkCIwFEl4kL<8BuD<uVAwGNThiK%V58n^9c1A1/LLPRl1&hqFpPBNYVX%^59heklbPE@w^P61:?^
>#I?Rc p^p?lF@%wI:&%+a#\@*Mjp#!6b%MbulRjY#8\8TF1euJKe\Ec@qQMM5+Zq19=pjuVdh6Lq:MBPBe@eqF
NR$^Z1 I%bBMR89#=?G5ke6+&>mkq8Aic9NLl!&b+Y^bY%K%@A$ij4HRWB16wB:VPyyWGe/iIV=^y^=/Y1lFLTI
uyt4Dt AI*W/uhKe?V&XZlCWDlXpHMB4!lqJac=mAQhkD#\WL#bmB#?V?eIaHSmpDp&nQqwtNhiWMMWD#y/&hi&
R%hWIE PW99^Mn%?/9Z=?j+T&X@F><V?<meq^$bN/yIIq1+Ptai%wiPX<6kn6MBhLWH&:i%bYNMIm/H%P=W*JEe
YW=NWy VjIuc&SGAc*d:5ThtJRDGB1u@6DT$J/GeFSMIQ\T>a/8ALeD=w6C9l4I59*dVbMma^BQF5C58/ZSLH+t
tdXd^5 <Y1i:+Xd:!6ut#PbQ>/%\?<SSNV8bk+iplI\+iJ&b8lmBp=?hDh#@>CVV?T>Wi@W/BQ#tMqTS/Z#G=&9
PbM$6/ X4PuSh5K#1<XYywwWC&^l=9B>LR@HVG5hM@YJn*wVtW$q?9ckVuR4wn^T>jkFI<CKtA>aWSZY6DD#w@T
h8iDhh 6IEMJCmcWc#L14mp<:=ZAjm#Y>JVnRKbPS>5k1S$cpBFEB$GKm9QFZVilXbKwqd%%ia1NSwX$B<Q:EEM
kVBB>9 QbHJZN#JHIA\%uHNZE\\9/HZllMTMQQw@GQ#%jG1H6GnyGG4>h4$6N45&Fi#&bFFK*JL?P*AH5D$dHuH
6<<BB< Dp@ZLp%L$t<VLAy^m5ZpQBRt??6NRP/C:EEIwy@XRTK@wHG*PDbp!wIDMDCNAL?$uG1%HLeqGLBW61@1
YDYuDN yhl1dcF$wJRIFywP:RD>qwbFHmClNmmhelwYhmWd^y8E!AS>j#*ESV<ETaTCtb+ibP/D5i=Nb!CKZ\HP
//u*$B 1&GiB\%tGX#EbA<MXc9Z1+q*d9RJVuRFl6+!!kPJDKc/c6&RtQAA%lnheunCK$$DPl6G9YILyYNdZTG<
Be:W*P 1Wta4PEI$/4/8>tVX:W9cW#YFiA=hJ/wFkdASMiyd=RV!nliBYAHH?1@b=6TRP%+nhR@K?k+%p=N$SYD
1FVGG? bC>A%=!dk$CKEwRWIAHa4?EkB+A<jH+I!Pe!taPtFYFYB?E6J=tS+SDQ6^qHnJ@!cIHYc$qt:NAW?QcJ
iWYV*^ /1>jJ+58ddTtYtZT!<^=Zll&R@#&I9Gh&ucSZJMER\bk<SlaF4?5nH4XSb8wISBcD6Y!H4T=<<qeCKhX
TANwn5 Lw8>KF+mLqLFG5#TtHl4^RD4RhCCeq5Ey&Pn4Tk+w^>RdKte1m/TMm$La*B>ZKRRNC@X=k9RhwTBhD=*
?lE@Yt IV9Ha%QDZMwtlqp+XA>@N<ue>^XM+Q&6#c&6#je+#!S?=nqR*T#1iVp%>R6FS>Q%4ucc$+cBdkQl$:b5
Zc6eDK dq4uVDbd#qMQi1DYZZkAHh56L&y9WyjdpS4wwZ^%j::p?RN=QQDCM6EicEh*86AZD#59Y+p!d1bWG=JZ
Md%nT\ <qRLhF>hMW5G\F+\>8iMDbiGIuC8SHD4J?JpkSEVGPKT&t\=uMG#4#aH>4K1qHk/W15F6VJ5*u$PSyJQ
!y6ipj 9@Y*$GF&m=Qec4XkN+cn1CKCad<ReJJhI/eW4aN>4Vd6m#XX\Y<JBuR:JBVALJQ/kiCYC^#i9<WkZtMK
?I:hK@ !A^itYqLicGYLV^AKB4w/%SCeA<I&nY$$nq^4m>?JcRYMub%/*$=d\PGE\CB+H:GSnXJ#aID:JJ1!\Nm
X4?i<E HIZan5GIZA%IVW@wY4d/=cZPD*WcL*q@F$l5aP@BNI+Ch9+PbBPmqhq*!G+qt@h!8lD*#EZ<h?59p5^w
4j5Jk> 4E\yR+MJ<@l<1@5dNJ4Yq9wk9*EC?n=8pSqikla?w81*GWcS$Z8aJ:DHKpDR%Pm/WlZRRYJ8?RN=wBXw
+p6PK8 w8EL5q\&nWReBWu$Xb&H8\?V<1lp&Ld%@p86ehAYiE/KC5!K^w%cJeic&Y1Cea>XC<I@B@^*69b/cTGk
+AVayM dwZ!4Y118c$@N=Hn&:?EB$^w?l4I%61pKA:dKMtekuVC#4q=p1SH\WH+>d+j6W\@e?<l5QiTtjwCJq^y
kTi$R& AVeeDp*8+uAt:4TT#NAlCMLHnj%P4@+H>eDieH5Nkjc^IC%w4VJEV5Awk>XK>>SppJWBw$GtXS/I\#B<
IIwa5j a\HRkyiIV#1HY$B4R9EI*Sb=1Jw!1RiVBWSVaQSu#BtZSP:#SC$y:a4hkme@^P@R$WHNk&5GERd4@5YR
Sc>b8q *i4dR:<:DM:h56A%R?@l&/:hn\tC1a>9PT&$^e9\<Kd>*b*MQXSBeSi98G:We=mpYuYplH8aIWw@1!#k
/tK1LN j$@&hPmCw\^ie><n6t1!I9V%\K@lEjJDPy<EGRFQSyWluGIW#:eAE*t81pjhXlANcm9bikLLEL<t@Dta
hKhIll H<LH%haKcRu1Bh^J$1tVZenVVPFKj#WSR\AK?TP?dXGGaVL?#dc>@#XTc\QCijFR/#YTp*y&&>+dySVG
&K!qaB jIbn?>\HtTNl!$A4X+YAbj*INHA4jw&bdaF:n%LqtMkFBRN:m@awMpE6$AN:4<mbI8jK$GtlNklPR^:l
#<#+u1 V1pGMQBeIV6Y1yY<c5Gdk?+^mSnSC1#Vk5%Wy8dl8V9\\J=T4e$IKuYWy6FFCBltAEZH4m/A51uQ=j^4
cpDEDE ?DI1nhl!l/FFWy&C&nt!/b:%EJHdIjkRY$A?Y^DZbpyD@Gq+/!?V#MNHTW/R$ia\1TA*SSt$edVWMBm!
W1Du*L FwPR8t@9i?h&XI?CMHKKXq*9B$jkaiZ5a1TDYnK>/\?Xkwi$D=wEZmBMK\aWDiaKXj<eZCe<b*EkVpPc
GEAQ\h aQQwp\XPJ8GGMB+Yd4c\By@S$MjXXM@TaFJpjdhqXNL8D=:Pj#tAB=9/Z?<u>mnNNkqy@^bei8!w@R*1
*Y*PL? t8@d%+cBCI:+KdN8d9^Pp9uE$W&M8&k*P=nS^ZDLaEWYF@qu/\T8Ba&$R8G&TZ#K11DZA*!Z%wWiVFRK
TPW:DR y99B9X1$qj!<D!lTCHRBVuWB5>BcqW&^1:MuC&M%n$AN9yVeEb@XNkbBwWmCC5upKWPXYadhJFjC?bdW
&nYd%< NGSY45+a=jI++@jeiNEi9GyQ:P&P9V?$FjhJV@kWF$tupQR<Cud>ZS/W6$a^QS=M8:>5$hnAW+T&9Th$
lBy#u: ymhW8MZBnWH4&Q8eP+q?hBY/b:j?YHkqFDjC\LtaK6K%Ww%dN9DGljb@a@ymah19!SQXILmkk$CwXnpu
bm<9D6 =wK^lTV9hIkeapV/H$R\t$CKB5bBc=Pj#pI<k>G1D4jA1cKp1Ybwe1VALEHk+F!B9?E?1Iacky1FtbFN
jW*PLn y&Vj*dcb%+nXLh*nw&DY%#BBCBuR?qF1G#mSY^AVYJKq8IQ@caiW8NPF6ebLVJJ=*McEjY@hjq%KF<=q
c*k5QI NMk5BhTptJ%YDF4YL9uVyYuy*?5HpFA<dAM+h544b\?WV8bFaX5<R@i&<lK\lha%<B$FWPWm+1IaKuNP
-AM+Yt 000061d5f5d001202b3 Page 43 of binaries1.zip
q%9cGC M=C%F=GFFF/6uc6yYF%IIL#S+^I<HNS1:w>TRcq!ZwQMccnFm$eXHuTaByH$yJ1NPRe+Zq?^Y@nLX=LN
RHXFdt i?BakWXdWEGZ:XTTiRCn+jc%MEE8C^RFVGE>9BLbJQ!wbeR/D1QwA9VP>cB\HW=nWJ1i45FQ>!GI$K=b
amE#CC H$C$\hl6IR?>CJ$/QR1h1KEaH?=1AAmkM#lVu1<Ck9SaEBT+ibWG+lN#&1FBl\%A9*NywAhK1C115ywu
Q==hXE >LiVG9L+y*BH\5kC&X$ebA+hMndcI?L9:lF^P?QS1PC*9+ZLq4Md<i@!8^%pDl<KcSPiw@>!LIVn!G&8
*X\*yK Zp<d^uYH!^%8mR!CE*:\ieY+e\H$t:++ZRyP%EyBpK@BcLRce$F&4qbK5q?a8#TuubME#%E%Y%DuSt9k
4&PR=A *Jw&%DG&RW%KkJQ8$MyT/1RXNCkJL/5EIy=!^lG@<py!XD96C9S/!P$NlCH5*8GAi#=W4D6&LHK&kIVM
/6BP/B $DtBcNIEd1c#jj+q=#t96y:D\l\I+Ta@%<j\b%6d#EwI6B&E8@alYL%+LZ/qKijl#G6d%mTnQ\*6F>S&
RiW+Ac k>H<hC$RYBZ^?ZPF:F!?WC&e#eLZVMT9cV1XT\\RTRjj<pGF<\Gee^6InB/pDq4J:X!K$nqbYHBC/Qb6
G*p4\Y R<ytkHeD=XibT9Euu/DPc$eS=*aHW/CJw#pp<waZn>?8&Ime&+Lu/Gda6@eR/t!=ic:E$R=h:I9>#IHC
y%wYX* Tl^*h8\bGWX$w%9y*qaHVmKSRDMK@MJ$WNQk%AjA1ht5Z4INA>b!YlEPW#W9<kN^n^aV\1^$a55pk1S$
u4HpBI 4>RGqlCeY8X?M!\HpGt/n/$h1QihI?I$D!duYYD+Pd:A4K=EnLLj$+J:d%WIF\PI4Y?H\lyWKQ^Adc\n
Y@Jb94 =a1pD:L=EL6AdMI$lE#*iG++M:6C6dP$&eRCDDJHn^1DY##H6Wlc?^uHV8^H\+BwXeEnceZePuT=CXAI
HP61tT C>P%cY:>u@GDjMH*Y1dXaDKBYIBa=aQ58RZyicjXFF!ST6LKP8?pTq@d&jW+k8@wmcT$D@@4A<H6/qMP
8umpTS $=+4qX^wkXa#bAR=$aiEm1GRGYY*8?w+#dP#>*Rl4ebMH\4BiLLMtdbml*i&Y9D%Te1L9=Za$<B9\#DJ
cVRGIt tPq94c:kSbkn%I:Ch=qA*Zbm6$X>^uCL$=b6beZq!dRI$bqRE:\\ZjB>EYVu+aeR@VVA6ulYYLpTZLC^
5M?ZJF jM%L1l@Vakt$\W9LEaa/X<^d/wBFK\%NT\G1P9F$uE8:CJSik!?TPy&ae1eDm?w&!mnite^ju#JheqZ\
8FuS1# uDPPbNawknQ!SWnt9KEXQA1A=h!84SbWKQXymDXbyh9%9tQh>%9G^9#>wjlqtlQP8?Y&eAh&N*^+KiSG
VXCkFI km%*XJhbF@mWQRC<ApR#<HS\YNbp9qA8*&ppycjERmtA\wHjNAyR=%ZJu\4M9R4hW=kt1AuWCwm<%NkV
<ZNY18 SGJ$+MA$B/G$AM\VyJMh\Nd868/N&<KHNJi@8VpF$9:6QcdT^F#*TA6#4whCtL@!eA6kiRwA:?mK=YSl
qjLKeW Gn9RyRdA:9BY!$B/L!=6PF\AZ#jZ&mRWXE%M6pk$&JIMLlMQtGb#!#C<<#WtTuW6j4J%EFNQB\XGC?Xl
yl&%m8 CThjtQecJmtMnMEtRuQ/%WJ6XH8W6WThcSq+qRamildmy!YA8qa&Sc%$JR8MMJ#XyGXA4FiVyC16ncmG
lFk5&e dhk:Eq&%Xm&nI?i\*K5/tMbDHtGwI%KlW4<L?lVc#HMk^iI&V%b1HaM=ZHS+%/#CBjFCl^6tY!8aX\8#
>JWEZt Hj:#SbJYACCG*Qh&<jWhi%4b!Sa@!eTKmWa9nAX\9LmF/>G@KK5+q8hwA\8qjMt^aGqRjW!QC5HpC$^M
=hZ^?L ?tM?N=S$#N&XtG^cBh\SlS&^Y#1B?j4A8>^IVGQ$eF\4DSG9NSJ>EQit\Q:q8PqAX$D6A:L>LiMepRV/
W86&Fp JFBRaqFjID*J\khlKe8tQhZ<A9:W:a4up5#Hbm&^H#m$Mi<k^cFP+#tiEE+i%tG:6e%pC=5DaM:qAIq5
iSipGB 4EIVJeH?lj?8JyNk*@Wk8L@1m:y16B1qG8V^cp&Y<9BSBmKnE??5KKyYI>$Sp>X1\YYc+Fp<dy5BwBQ<
LnG=:m kHb>ehwJ?pJAWF6\1=RH+&<AQ5KnpePdHWqEi/AFR\KuaS<AEd\tDSAK#hHQbAHIwE:*BDY&ZXM=4ebL
>ZbQ%W nCmIC+QMI%?^Vp/*Ywhk6mmu4Se=!T+WX&bDRRH*+aL^l%b4wA/6Nq6Na:mhiMRH6^L??eF?WEEt/luC
Sy?+*\ GZuPb:yY%RWH*E/IHDXh\>AY:Ca\a4bWqdIMQ:y5kMeb#ZJTP5bXtQQQTcmpe!qJGR@E6+=aM/6aFk$4
4PL!Ih #\!lLQ#k1Db>pe?/bRP*K/pE*M1S+cP^VTeyy!C!ZZ&SEh8EKDFMb:qyM<Q?j\!BQh!mpi*cbyI=XFkn
lMd=bn +w5:mV*iYmi/:by&K?+\9k/HDFMn#AWt?ulN/!W5Mu!91^wW!wIYX+uG<iA\HV4ZE1LFtIBk6qwY#knJ
ytnSPq YXuljman6TS\qImQc=@PbVAGGEpE!Bklq1aqjn6e/bm<9&EaNjnBCB+1wMjkXG<WTNQp4T<P*<&MHLR&
:jRV:< kIYEAIcV/*J1@ViG6#NHLu/qTZ#^Y!&:uht%>=JX\dWZuV@YGXmQnl%ALZj<Xw^6KY&a@Bk5JMERIHa\
AM1NM$ qA<?GbT$NFcWtDbbPqe1RK9/:kGh!SDhSVZJjTA<hFK/B/Kw1*HLmFXJmH/k+QI^SAbVjLRk#%$1/V%8
Y!c*<K lj1l>G/5&upX6$6\N^tK@5G8HR&D/j\\/dnY+nd@E8=e^\^*RMyDLWhKc$>QhWP#KE\@e<<\NP=ZLI$S
\We:e4 9M$haAYda:kV<AjT84<X4RI>HX^6lVJWZca:D5\?1J$pPF14Z+Hm!aKK@kP?!#TWlT!idK\tkQ!tT&R&
ES:m%4 PSAnH1k\y?MG@q#!<wATyaE<9>LXK/>1S#>cVVnbVB<1FG1>K^VMMReYCl8abuty4YF44\eZE4tdij<B
XQJbPe a&Y6ND^hw<q:JdyRl1V4u6RSMP9>F+iu\*>qA^jPZDeV*Iajl$Q#YJ+SQK9hHG$t+<kH+@1em%k&<j?9
4&R<ij ^DGRIGd/$VBcl&4N1XZwZAXc\wbe1jZ1RRDmVhe<JtJJBZTRZRC@qdI%#?Xw/S*^bFeWyTm*6e5k#cby
@!iLwh y1L#VcPcXiCGqCul4SH1ZeYL<I6<\y\>WaB/4i1K^V4EiCHipRG8\#cT6itTH+TJuZwQi1jCBEdhW!&k
#a8XeS WS@aDVnIkXXwhhk<CjAY%RL6ihCiEeC/*cV=\e86:Y^8MIQYtM/&Qb!#bNq&bMm>^nRW<<Z1kRlwT#nQ
K9I5&> RBaiLIldMHCq1p<C=YFL@FSNE5RiZXINPTyMR#BKh^\wIi8$T18yXkA9?tIjJ54Nl&GwY&nkRipBB*G^
hAYeYe NFKi:pJ=cRuE+RZk%@eQ^@DbteeM:?uimwK8F@1K4MMA^$pLQtlMI\19buQHj4^VEVdinL6manIG#9SD
<+THY$ itie@!w5+%b5%?LXFbB^h?9In/#hIIleW$\\kY%YRM!p=86a*QwXZQ6BSn+tMi%48nA>9TDuytpd<u=y
SX@/%Z V$XKAi55^GJ*ILI?5P5CtJQA9S!LNW?LLF&9B=pDLBl*JT#Ia1y=^:cA<at?h\&mMWyu&<?u/RaQ8*tG
JLbH9! ntKldqy=Di<9DeM/<R1eY#BkTJ4RhRMmN*F46jZLZd9/EnSYydW=5Qh89MVq&KSXZPHi*9DYT&CCiGBH
NRyI=m wNZMY18q+t+aKdmnAc%&D#>e8VIIM9X:wJQ1Gt=cITkEX\iFR?BSBtClYZdXS*LNPi%BSkNS1uu=\CE<
Edqy:d ?CAh5^JqT+T*/ZbC^F?Z5kZtGBFyFKTE&9Kkl:VPBkAW&c\Hp9:FEYB*mA*#%iFqGL5E*@H%ZklQCp+Y
iTJ$J5 aF/K:>jIu+cdTc5=c>>9Ri9EY?d#6hAtYAt+c@ADB9dI/6d:c&Vq4e&:>pREP1y+VZG4l&wY!#\MqkW=
?=ipKm Meui\@Kc*>Q?hA*kb6wQtQpB\4y<R!G\#Iq+hwtBTclaEJ6bqR^X6l14%L*X9Wp1===Xja?:9!udc!Bc
FnBqbj @DL/ubLG1Kyj<GqJ>y8AV6JRGPEynRZ4>8y%nj@5b&FB*^/I*65pVR<!#\qPj#>?/Gq\dVD5M+C:AS:k
R<6@h< Pt#bmmC8a$+a@l99&GMdbk$+9tGMC1<BEADYMT1NL:B5@REh9KGliKaBE/cuT:J\68SJ+uLt/SX6Z*#p
wlZKJA 6=q=B!+GhE@nId4:w@IQ1\YukRdMSuZ:wPVZ/cS$ME6L&&pq?n=kJqEITqj>1p@w<+Q>AP$?J1nAqEe1
c@DnXl ^nRnMqHaX:CRVQRIu>?&>\M+8>kn\GkP%1>qc>N?8GPQdt=\6:IN9RR&#c\thwnWQPVT?qw4uWRh$maC
LFlhqL j^4\/VERIyJBDi1u>:4Z1$6bP#6>Si9yG6aj>5/q<MCR:K4:Jw615c!EJ:QR5R8q9uktAMqkL1XapPjT
lY=pjY HadW1nJ!=^eAjVR$dcY%Ra!iM!B$9mdB=KSkSk&C@V1MNlL4ShCNK8#>AW\=PL@dN9Rhk\npjGDDXqy&
SP1TkW w&Gu/Et%:BTVYtwZ@R1\PLiWDqS!W!4?\I:TR&8biIuyVh$I&mc5e$N&wI>G6\IL^h4VX&d&Z\u1M9Gj
!&%q$S luY5?WEy>TqEGkIc#$&Ta18N1Vq/XuN?ZljT6AwJJ^A#aq4@AJkP9/1=hNq51WAnBHWX4dRJhC&\H%!:
u#<>1a IE@h?1QHRMG/yyh9ZwqC=nZeC1=B>al=NXFiauR<aP4QS&Qtk<edRKZhJY9ZXc/5%QRlZ$FKI<QejuN$
WI%w9M 1i%!^1*dZHp$69E1hI%6K6k#5Gbhcy<tQJTGW%:AbB+R%/BNTMKkXD6ZKF%%bJS8\?9ZnJkVp!JYIm58
tyqRCD Zb&dhkEjS#\N>5D@RN@SRwyVZimupQhJM#ktPnalh!@LHRlymVEp:ja^/@*kRhnC!D+jpbDB9=Gl^b5I
?BPmD\ E?XMbJMkA/ceX1=mSHZZ/CwZF/PYmdI%?GiBDeLA6C6\1w6CQX5ttI5\bwQFB/\^aYc%6tBZGYHq\c&S
#?q*5J nBS%bCDi$L9!@6iujb@R@E1B&\BZA=j1t+BibVHQ1bXdwq4N?\WI=XmckWB#CW?KceGF8ZVH^P$niCWw
XnjuK& GL<\B4/AK:LBBIQY1!#J1BJq\J%?LIKe>FRaM/ebGN%Eh+I*#c%1Xa?4MlCLCY4VWCaH&5b1p>mL5T6M
BSlu4# YbXV5k!?>VY4WDSVXEYd5/^M+681YwXk$4>pQR*awkJQ6ciB?IDTA^q1e\hVjkNt?\$6lwHW@YqA<j58
IHnV>B AY/jY+C#:<A5h?GbKR=p5GLAtXu9Km^E\iYjWmR*X^5FSwGET>EED$5Zb/>qc^hLRdbKV<aqZK^!ZYWY
@GR+t\ :kFa?G>@Kcyj$YFw%nBb$El^^+MJ^N/w$t*MVXLjlNcwTm81+K>SC>#i65X8tGPiiMDcDkqnGD#1Cw4A
kW?$jb C$^aM!&ZQh$%#PeE>ndT!G8/u8kV5kD1R5/^SD$cD9Wa9N!Tj/pEL^Q$$d/Ya$+h8al6F:l&nmyPjPu5
t^G<:k YBb$h>uVcaLJT5iq$yTE=^JTZWpSeG%?i6198aS*1V4AR$YZ?e:MB8ne9#=RD%:4SaQ\Pe\ShJQSLRI<
:Y1PJj wijB%Fa%w?uMhPB1lR^LlP!T&^CJK@C>+$154\jMV4\k4&QTaX^^Ci?4wiFeqZwY#mdYbJXiA+!bBHpq
LMGYa@ qwdlCcMAB5YRXB@=*kI\Lk&ej&/B&\ducm/p^Y*NdnMSQ!eFM@t#C$@CG:YqNHD6p6>Z<Ay=4nCK@:pI
BlPRQA WuA8:*6?KZ6\8PA&@uSI+md!mDjHLNR<IQ4:^%@4keqIVW\!XMIpIV^+i:?aWKwB&BBeuB:GH<!#IBZW
-AHPGN 00042cc988e001202b3 Page 44 of binaries1.zip
ecBnun %K<b6!TN*LN^yeGTG$\Y@uk\ZR51eGLB\Mb6D>pKe$w^^E\a=u6IyY>SPWtmNYbQG#lyeDjM5Ku=q*#h
GIm@jR L=&RX@ZatHd^Le#JqGFHE@W^wc9BYDa4!/dkNpm+=RYhX$1BwB!F$\tl=cb\Nun8+nSV8#Ted>6^CII=
d<ABhV 1LYkq5%p6wd1in5<GG%Ey1%WE8*cS%%>VRMcN/wND^?TJGpEFB8G/*byDXPJVV5^Q\>RAiW=:jb?c9+$
ZFD^*< :Y\MJk>NK1&Xe4inwN<M/>91pWw=D<<Qpt94a1^D*&8hEmpmKy\VBZ>Mc8ImkLyl4EELV!Mi%m4H*J:1
!:Fh*H yZ^iM\ChF5&B9XiMYPDRV#LcAQ$q<@4TMNBBcVT9*baTN^8+KHNX^l!CAln+BVBYSPb%!YlKaMI5inNS
J#Q8J4 c+J^!CAa95kEVAH#CpQ=CuWQqQL#MDmXM6kX1QFkVYtTNuAGy&Zk4KmGT:$&16HFN&qe9A$EmWlT=qt#
ac#bb# 8BA<PyiIl<m@NdmQ6c9/c5AIP+ZXqh:E:aE+%ZTQLLL!dNc#eXw=p$CFQ&^d4QyL\Z?Xi4mWub:P?*DW
tCdpDT k1nKbPpV$pdM8Am!w%Yh#@6RVy@YXMKS<#YMZhRN^kGmKP!EAP?tHhR8DkeaAMELY>\D?#YYIY$AI:Sn
C@^Hpm 6aTB%cCpGSwFWCFNXS9V:SwZp#j4wLSLE+B1ana4yn5%JX=&mcd<tl!hL+6MKjE@Y+C\LWBmNbZ4km6\
?*K&ae k>=1qTt%YyM=NLD?8aJ%^IWMH5Y9XR9TiyXG/qSX/NHTPZDJe>M\Z/Z^ANk+ETh$9EbG!Bi+AXZ!\Md:
WN4W59 +FuA8\L@Q5BJXSnGmkn4IZLKX8S$dS4m8&8?dJ8AjqG$^nycMLN5mVaWdpXTY4ulCL>lR:YklBe6SNTX
u?dhXk %=S6a>$aVYkVMbNqHl!*1QEi8akVd5\uImN@nl5VBQTF$6lX&PG^pp\FFl=Zk@Q%yHZqd>p#q!R4Jy\<
9Yu9$t X?G$//&YL5t?GJGi^/%F?h#$eL/G!aY&4$?I=%88HyCW4Rcp:AGR#V/j&F>qCE5LX#RLw^>EjNaw18E=
a<+?<5 cHXY!=kwYJ&yq@mtGy*!Y4uC&L/AKhcM6hQ1YGI4aZP4DYcb6Nw5iwPHGREmClB&LlkhZ#T^I9Na8<mW
uT5Ie1 p6I%CK%P>$&$L$1qhG8BqDW5R&tKRB5/bCIjRGw69PG$:A<!8RVT:t%HXBhkmEiuS+eJFKYMkma#WYVb
\T?4h# yw=BFhTk^@a?MD=R?pdjitdh=IkAR6&G9tyaF19Cb<Tjn\JKYdeMht*d:naikyL15P+DbA&=ME\iDuGb
KTqBJF EDyP%LqeB$Khw/WB?%yI:d#\56uSKeNTCa14EXQFcQwZL@qZ1HjHTk5%WSl#u$=p5TBqRXEQK*VKC1YV
VK%^TT NT@YqFt6Zim9yH+wCb?+8*>Wb1>YC%/lN8^qp+IZtp=IG!9ZubwT+ADAKwb#*:Zl^u6\5m15lmFy\kCt
?%6<ZW bVecbu&pAH9@I!JE4MAGPAD/KcS=LdjXc6NEVbnMKHK11E%<&G*d!a:wkLed:Xjd&nkeeWNH5NjRq9uF
M\c>k: eGKXmWS4WFGm1$1q*h1D$=nIRuDPl=#1BXFLpaSTeb8KGP^9ZH=+AT?&Vhp!JVp1T&q%tac#<\uF+q+t
R%halu Z$PkjXK$@Iy18<Sh<FEK5$DbEtS%%^/+<@W%?%=mS:DcW<$8h!ICG\FGlIyy+nKA&=QyJGd@cmPC8#1!
\iR^/i +dB8tDN^HCyR4ceT?/l1k+m5QDk>d=w4I4hwSE+&cFbD%YNXm=b>d%jhG=68%G^Fb1uLpyQ#<N=e8X?6
F^51LM NCd^tFhV:nWcw9^1TDnEi:LW:FJNdPDZ?F<N%yViD4G8*HQD=\y=F8>ilcRYwCFqM#JTMhYEi88kA>Kb
+8XpyI #J@5MpucnycNjuwCpCmCNtccbSS+AeRQnukF4ttF1hR:>uFne+$K1%5mEha^CilmR=yY%QlW:5G!jSc&
@EV+#> /tYbt&AkKqG:<P!nbnYw#qWZ^a+>DB5LqwFRQktd:DbY<9=CAiIGk41H6%&K6ml4qyR4q</au@?1qY4L
jPTZwq +yEQFhL>#$ImQmbNCk1#nMQAn!<6/NAEh5K&HS&nSB<KGD<FMj?5d=u8jSkYeB!A5\*He^>EdSD5<@V#
l:uSZy <M%dyptEb:myMAck/BJJ+5CE>RBceINtQqTX!YK^18GZt1/itm41^B^wpQ<HcqVL?eD#Km^VMqDZAc=q
Pb:95# +Jyh?TCVFM>1b9Z>ZSWN!?VVjkh16*ZeqZ\Y<6Q\5*4c4ylEj%#I9R%61E$\NMmaue8ZGLNikHtBkk/B
cn/V$= ktB!^VHNyZKkBZQ<1V$KchH#Zdky5SQJwaDdQXEMEy:9EkMAGwW8l+SXatBTcaKw%*Q%SPDECNkkt9Kt
JR$SWj \KN&148wylL%CMYZC\M%P+FuiStT9e1h:mCE@AP*uh9XGbGWu1lqhd+A!A9A!$eZ8pFA\a@YT^*D9A6b
uSBmC@ tuNPT:ly*C=&In:uky+5Zmc>+J+X5k9\$lk%5tEp%Wdp!TC6VJa5n*B=aKSnS9ZN1cqSd/1qI6jdAi4#
b4ap>= 89bCiKmj\N1&++=66kmjIJEdbTwdE%/Dn^&/ap>+J$1AjI5Qlda!%S$HLX$Sqp$4F#V+15K8E9jGnA6H
l5k::* dblVEM=@Tp8ZdZkRyATA9cVV9Zn8i:I9BRT!5>ZAVQIc^FT1SKC9*c/L4nHHlBE$SabtjF<ZCtP8haA>
I#S@l& CH>j!cCc/AQPP8EFRQb@<!pd9GLlcRKG\^BY1+8LVGM\*Pjtn1!PXq&PBYD5WyqTNlT%B9aVJt+CBEE8
kJ&DSe k>+:EbEl$APw%6=+WW&y=1R^V%Vu^eSG488mm9mnuIJmNC:ZA!=8M?IYlbk8BdYle#wyZjbKRh/9R4lG
#%j#RL *Z/6hLlJMSywYm@FVdehtNYnnFpIt/bq/LV8V/TaGyR:X?J?W8CZFwTACl&FYc\GlFCBJ>%PHIMQWSL5
Q+8Zu# Sk?An5bPlJI<CAWWp8&mC^Dq94&HTj5Y4NjwLHYwh$$j8lXKTL+XSI^=NF9R*$4khXHHhKLeyQSG^&$b
Pi=Wl@ cEy>%NqaE^J8ac+hY?+aG\T\Vu:lT1E?\TDThL+R%Ey!dP!1VqMPtP9uPmYae4!%bX\eBjDi5//ykE9h
T\p^?T +//\?HSc55$PEVyjLRAqCl5WC1wn6Xib1<t1Vw8A6R^wXb+pwk%CEBD&&in4IG\S$B+#AdALK?FG!QwE
9G=%iK :n@E5Jt5=t^myk>81CbR\n6B4&hbba?yRyP=!E1mQ4Z8iTP@LlmCAn5$\iES=M^FLeJGdCH%8K?S9*H&
@WNwlB 19S@XlR8Zb\P9y#Z#lY9yw$<6G&\B$8wJ6Ztb8!/C=T<4NblYp!ZP85Fn=6y=HTYmlaGRBP5&!$JJuEE
LtY\+! RkILBe^IwWlutcM^@F#tIneq=Ck:4=m=<cqV<#CQIi/LBaAY/69:RNW+NLC6T!\FNIp>48LIcpct*&G!
4@/YwF +yJN#K+/V*Re6cB?^BQX/kYklJl+q%YQT5JZ=Y8^KnqtlLVDWNcA6?Sy8JZVF%qYW^wVq=k/\$$!mCup
pAXAN1 I%G@Elb69AXl>!nV$qNtdC@Y!>tTcQwN%%!B1ZHR#%B1L1NGkK+8>m8>/+CD&wY\IK@:YdiT%HjDi\BK
^19j+< kSQt>Ql+4ttTcJ>pEIp>bjc%GMu>hLehV#D!5KyT6Y9ac?DN6*8E8c!CE?85P:cMVp^YE?<+6Ib6411t
IXKmZG lS/1RQWQ:Et/hC#nkaEKST$LV$99#&P!4JA/KEwL5I<LmVnJT5?!Vu95MA8GT4h$ASC>wH5B?\GpiXRq
d+?8R! tRdQuFMI#5>!n%<^FHlP4<ySl!I$Te8PQLJE$u:pa8am&>BEWBht1Y*p@ZMCe5$tJ^BlVBi$@WiAiM$G
5YYc!= VBZyA^NK&K?ktd=:ye/yAtSAJqX*nTc#I:1L+>Z4<*GqqRNyq%SLQC?mluPS5ET4bVBFGMCQ!\d=R4/Y
Y8@XTT uS+iQ88X5p\Sk4pap&ucY&LGKPjh5B^96q!M*1Zc1Cmhu*P$Q$#IeQ9/8qR1ZIWt6lK<Fkk41d!e=+/B
qlSb*A Ll&Ebjej1R$Q9!Dj1henGn/AcVp?4?BPl1!EX*j6=?MqaBcXW?Z&/q/DlIlEjie*i&=Vi<q%:ytkiFak
BIb<I@ ^qNm*l8Fh#8\n^lAa41ZG&q1mt4F4hWaHl=ElH/pHQ=:n$!#AEXDh$J:L8m$?+1CX81cJSkV&*1@:VyE
A4y@MH AQ5I+n5y>64QaPy><Tuc*:$$Pj#KcD?$Xd&p$*JK:Ta+ZwWDA=4?#buuy4<C8Z54kJb5d4TkaPbHubwE
J54PnK aG6#A+qdMXP56Yjl6e1X/Za84iFl<K4dd>SDtGIFm\MA^?$Z^kdd*WW^DlhW5JNCBQ$L@\?c#*TY\MZ*
VBia%= 6YIL+>4tQpwRDE>@h9wTLG664BCMBXy@Pw$peBPNpci8NtZ:Ww8TYen:VM<AWD4kkwWkyW:dh+m9myTF
Ne8DD= C&NXZ:SLw\Xw+w&G*16B$@PJQmmD6JnF+&bJ:+ZkX5CpQdwpIqRpiSL8m$teM%6\KTb!KqiM%DweN$ak
MPY\tA nJQXh?w\HW6S9AcIydJE!mGk%PpJMc=?8W$qBLYXtH8=KS6kMb84YJE+5eje=GEck?uy+h*yJ:l=8CDQ
K6Iu8/ BVLNkE<>V\k:\#QRBP?#*\h<#!1n?KqQD9m4T!/qTP?IW$dAMGh4YTpbFdcS6^TJkh+QLi\q<yBnaYbV
\QAXk@ ubac84Sib^AV!Hcn+T4y5RwS&*w>CMht9jG!1SRB+Qt&dSYG>di@Y?ht<kZkSGW/b5&+NnStHdB%CySR
bYAV#b W\#P&KkJ6%R#iBm+iHCu6RtjL/mW4mcq@eH$yiun?Y1N*S%pMCc8B8I1hBIE%n49ljlA8W+&DGFu8b@&
yXBDuc y6byw!YK/pAMcVMR&VS6uq%5JBC\k5K%4qjY9h\=aETS#Sa!tS>5B%pGuZMWC1lW^h%VS9DCdZ9mSYDb
niQca$ SVt=1NS/YhGlVKJl%1t<CX#<5+dNwqy$XPM&J4m+GE+%&lR88>w5L#EEXiPi5&d%$w4han%cAL>M?LZ5
jqcVm\ ^iuh$wNk^ZN/Ri5FlqY+%\?:HlEpSRQA?\jIjh^K>EbLtnEDiDw8*F5a!F*^YFtqwpknJXc4JZp8M1Yq
w*:MZ8 nw5jRkFXkZ/4A:*QbDJ@6V<K/qiT+AK68m&&Aiwp/&5a@i&EVi81G5&TumyGkP>6?tCMeG6Xj\EICeRH
wB%cj^ VkAyP*cJ8ulNFWNXnJ+XT$51y%>&qR?kB>MIyF<LKtyA$^^l&kYtuNTty?YlMTybQSaM=AF8\eAD?!Ih
/Kh*Yk MM$Ydea\1=/mN=b*CYNK>AB:Z><L<*PRTeti6mVTuhi<Rk&KYc?!Tp@K<YA8laQMwj@4*ik$wC@:jeHw
5>E&^R 8:k:GI%lEB9J%qy1VZ@%^YI+Ndpw^!e4:EADa<KYQi@wFAY6&qdaCtqE5X/X!ZJFtW1#cb=u!ElDEaZS
c9ubwW >X1N*Z<8MM5n@tdLJ5ES1B!+!WG%/y@q6pM9hV/AdE4eiA5bYmP1^VR1LRjqp>KS:IL\#:G&HqD\MLQK
1k4Bm# KZmKY+^yPucy=Ku+Eq+h?+Fl&waI*JhtpJky&D<EbMBMR&+n&A*Sliw+F4KJXlk8lbl+*=/F*b81kK:#
d4^HZX y5kNGMB&>wCLi1:iwiYmuT$GID\XRnIJ?F\&T<lYHlDS&4VdA\>W^&/&6nDSaX&+IlcC^M?WV4P^!bW4
+B8q/Z yY@nceDEwP5amie&@AjtI*GLWFi+4PY^W8C1$6M>!BJS+JBWjeGKJWKpRmZ*&kKMDEQ+5mK8D?SS#^qV
lp^t6A !W#W9^tKkmV/SSt?C%l9XpFKVNIECmRGK$hN1B$LB!i*8Cnl/m#8?TT8EX#w8wIR##wXBp&1ZPm@:H+=
R5hAQ/ WB<QIi6aQF%nwF<#%N>mW5546cDtAhJLCtBlu\:GYN\y=RINyGcDDDb$wW?1BF9:\TM@CSdI\l!hE/FN
-A?PCI 000b4bee163001202b3 Page 45 of binaries1.zip
CL4waP 6<A=#e>yX/:8>1AeEkbS>X<cH!CJmh1/E&F%HY*J/kwe@KeHddTBl+IT@Y\IEG5qDaeBR/=FdIyG%et&
#*ie5D IFIY\YPX6CQV6jy*i?^+h=AlL+DlD?#lmmy#/#!G9@9STF=RBm?bHybB:^yRL9MjIKM%5FIRDQSRAhyX
hkaTDY B%49yakDLim^t1k#em?WT@lamX&>jEpMC9j4T>4KNPHc%Z<RPmkHm#mAhj9b8A*TYt=u5D>SqRwZG5pn
5yt^/j uIVQ>qE&W\\mBt/huRmnPl<1DBZk#C5&Ce<bkLdF1I8ZXTab@\Z+8!*jIVq6w$$Q9SGBkLC%=>uk#K:C
$kN:aw :m1ClIkimB&*Yq@$@S:MX!@W*>\ERk9!NYetcXBKl*wTK*/FY&Ku^$BW:WKidtNWLV*I!pJPBV:&TJcR
yH/FF: YKe&%QXbkuZbB#QYl+*B*$>Bd%hYFp4KMAZQ^1<RF!X!Q>WYZP9MZ^/!4$Sk\+$\5ahkB%X$Likq+e>E
GyGZEd <L$*HPADD+eG$Ni$=#HNDZnWdQAGAaXDE4ea<\XCkH>?qC$Ke>^$XGykH1&WYj/PX\ATnAW8NRS#6%9S
:V&4C9 c>QVHtcJCdJP<9+$y5jw&DZ<wM??XtIHR#HE%yn*^=dA9X4Kb9Xb+dNju&aYe1cR!H*KwTNuR9tS%=e*
?=!yR/ tqWa+ECEHcc>iuKP>FjEbQBNS&HeZmNFLVPP<B<?pGZ^<Tichm$N$ZP1W4ptnBKLA8lHZWPI/$A9Jut<
:LNKF4 $Xakd>!PhVhmW/LEQBb1F>18VS>!Y6&?GdLIueqWliAN4X>@9TiCI!D$NdHRk?JN=ANnRZAP^p9*ZLI6
Xi#E@? I>uK5HIM>DyYe1Y8bYepE*qj/5MK%\nQyW6m:1Xl4>!Y15&PN!$:H*lM^ZQF#9ac=QM9h/MpwLNycSYA
F%H&cw n>:6Yi=D\dR<*:i##ILaYIYp$w=&qIc&jS8Eq^Y%tmMjR%iudVJ#E$8\BiZ^ylVADGGbY:Ac?np1Dj6c
uITw:k >>/<eiQ4*JtNc6N5R1hq:+1?WuBey^>k=B*<htWBXlc8YPVCCmGtpdTwYiG1iiiwYLYm%6XyQm?aH<=>
H1%4?d Z#!w8Y91MV6kCiS4RC+:eX6Lq$S\YM6d+qbIIh$HM=1EJ/!n1YLLttA6nPJZh8^I!AT!ncW%VGWh@NnF
XyACuc G$eu**\HlJ19VBIqSqdYI%qJdLdSHwiQd5TpYATC5kSITqRG/yB?:YJN!nBM9uQ!BnkqApXLtGa>kI:5
5/5c>m BWM>KJT9/NId>LqeywP8l&tp*cmGKueaIyKnBjaT8FJkp4u?$G6#/JYK8XmXw?#EIK@CK@Xkh1F4K/%X
\amq#/ tm$JcHTw488+YTd#S>twF9kSw\R&BnD19jQC::FN#h@cZjNkG=MHM\YM8PnSpBEDK/FX/K1iYnyXuI>6
!VaBAc ejH//BSbKBS\YRdta&*DSLNAS>G64*@>^w$R=wX%nNhkZ?yWP\i$jIQ=+b@Sd^CTn\YqREI<qeNDT<c$
DYT6bK !4wyyY8Ei6cqM<R!nZw?YW4NSFy*Z*NN6tA>ClCpDnBjdGQN1AV5AlAIN:ui#GV?LAqG6i6P$5a*cIwd
I=:NlI #$Mh9kKSZQ9*>nJV=<wRTpq*QI4EE+9hDq61%5Q9EkM4&>XV?P9W%CnitAF+F?tAT%1GnF@$A*9n?i><
i%kTuP y@ihh:p>^?#+IF4R4&6j/HQ!nimck?SMqVwZLARL9enF8\BQqC1*CA<Ke^C*<=wiJkuw*M@TZ8>Niy?n
Bqw*H# dk@SN4N$#C1=XXDP51$le:KQq1nVDJAMbNKL@Jy%&RX5hl9CbYFi8I\&6m%#n$=GG!&Vt+?B\$Lw1%CQ
iD+==> #$8wb*M<jKHZ$&StG$%%\@qmW9*5w8Xd8</j+>1q%\ZVBWDqh$HM?uhlYA1FK$D19TB\8=aVcSeM6^M1
e:D<N+ ^wI^IIk/YJb>IySlM1ylZ>nCGA5I*NT5$<kECHDK#tm*E<GiYZBR4Hc^mI&G>C16LheqV:9><aPeKDn%
?T!Qw6 l@hE#Lm4mIwkulqEl/qZ8SqK>dQ&kd*eMK/9MFmSG^Fa\h^WA^kQ/nl\t<WAVMyPi6:WXNPMC<&$BccY
SAXn/X 1paqc5yyitP*9lH?J5uJICWDXE#B^qR@FZGQK*DEeT+L#GKQHV<a=kKn4FDFq1//>H<Ry/AJdLpt?N>B
jGFycw Jq!Bywp+:e>h64uw%SI6T5!AkuXkCj=^acAQSw!bR9Zeb?TTuJ#:auHh=MTcmRdR4WpAPkLt:uH!$$Y+
/GR!c* Y+\wJ8wBGX+wc6&B=ET>h>IeZ#D89AR=#:ItWEIdkQJWj&%dLwiaKIdeaB9T>:ny=\JW\ZAhmpVJc*6>
5ulNQ9 Y#XRWLBRp\8ej8B!pmMnG6!j^N?#Zn=@!RX:bcynZV!Bd4mVV5c>%IdySHVP1?E/uP!+VRXqP^n>iB&Y
SA/YWG !&kL^n$FYm&KJ@Vw=H#pi6t!dTE5N?qy68$^WLaB/e8J6wykDNqIW*bh4CTwT:J8BPyY1/h@/cS@cq/=
d1IH%I VaYBVDV\kact%hMB9Q9*8CBd>NI+mS=aX<w*hJDwa\+RniG^@HMTRJ?$NdTGEI=n4mt#!Ni!JRb9@*/J
+/iQHS RSIu#aWQe=JwMyqA@&yR:ySapA<cl/56Lq&a\!X+HVAEh#Ve?nXm5j4p\L5ZM*H=JN#:4RWDq*ThAW#+
??Rc?m S%P@eJ%6V*FZtR8jl=BPRA<CDL%A9k&6me&Wh&48$pmk=D#iK1A?FlDC=w8pTI$hWRP:8ZuHeyQGdZ&>
BEYbJH +cy%c@LktI6a5XehI=iZwG\DCnk*tiDS^RQ#!$L:&c5/:%I?BiFi\Ypmq&1pZN<cQX1wiNZCKuWXwT#e
*#^AGy ae1>:cnk>VHZ$pkJEQT9:wP6>^:LX@PL%Zp^NetGlA^hpiFCJ8N?A$=b5Zy>hBRmdDyLE?FcbC9YX8B$
yLYh/i Si@WkdlD?tVtc%YhbJ<aya^!?+HBE5&Y=cLBbF%+Q8\5*nLlHuKlK8!B9&1uc!W\K>RR!LwAK/Db*eX%
1SapVH =wEtAiJVcXbu*9jG+H+!kBLDEP**ASeG+m!XEhXXMQ1%wCVn=y^t^kJE?SWTqZ6TX/AaEu$ATw*d*Ca:
nZGHc# Qnj8nX#\ymcu+FI4Bud$hTci:!j+G>ljnMV+TL=/ZY!$AA1c#DYDYmL?/#Fc&Gy$VSt$G8ek:qlK#y@K
nMD>/! B%^ctTyc$NqQ\qEGEKFy*IbW!JZtNy\5WDXtH8@4J+IF>w^KFc6pWwhS68FWiKGR#hjEtHcCm6qipY!d
G&EnSh RiQ:Mh!LEd>!$!6W%%:%tYkD%NhmB+pKP?T^DT9=mQ#:6@?SnWR%:&Zu+GGPn/<9hp&<BBtWL4@E&n5$
y@MiMh Icyd#Z4iyGGYGDj/R&dtlMLYZ*m4aIn>8%H4YVE*X#4qnX=\cX:tVRZjYlKG=PlTBY^E8uWHPyH#bK5X
\/&c/: ?EdMj#HmpE6GD8CI!k!?^m=SKVPT\G?T:T%VHiSu<*tZ/Ftk?Tqqp>IV/b/cTyHk15/LRKqTqjq!VeWw
C+GG\j tPm+4WZtyVJZC*dtd$:nh8Qi1eZF/*K!PC@ESEW>K=+XahwuNdMBd!d5/qQ=@HZZD4>np8kj$Dq9Y5qG
!AY\>b 1>cEL&MBJ5!/#HynHm\y5/PbtTcX:Yp#9+/=A*VbG=k8X6nNpbEcy1M^Cueay8d%N+DWILS?IBuXJhkZ
wjIEj: nl^K^eKSVq!1F4Kq8aI4D1W/$Hu8l6QPG4\=Zq+$NbqX#dtAdWHMPpTu1qhe!pdJ<dEkH@@%b\phhBBN
y$b@L% tc+iF@PVMnhyXw$LAVKV:k/98ju5mDhKKJ#DqH?J4p/=*YVSVtkIkBp?BBe9QIE:cDejAFbw5eC1mhFJ
6<aT#$ A\RbMFyp#d8Kc\!b^u5Q%L/9C9N^$*M:KT:J<ewq6*qAq<RF/$Q+IKR5kNLyKlNXtW4IRCdnjq/?=Q4&
qlmF*A GbZI5\>$ZnqZKC^&uLhZAe+widL5mmeEP=BI\njZwYmW*WnkjKn=4qk5/uXVNGK<GVY*:YPSYS!j1!/C
lDeWDZ ?l&%%Hbh^pP#GLXW@i&kZ6SVMqiBG9uEZD=:cw!=VJJ6!iEb>F^<yckumCTD/E%RqY%FbYIPMCRN$=Y=
Ta&BX= p/nDdp>5AjVE$kQWF@SA:1yjJ!m$eJ/hKkM=C*:JG!X@FmDKa^B6@CJj8l4RS\iZB?1*k?#eX%ch:auX
/ljE=\ ElPTdG:Qcp589qb88*<$qMC\c/b4&V6eQL%w%q>51mZk\aKJSZ68@IJwS#tw4ppIJ65PSldKHA:IiLE>
^c@?<6 8Y/i^Ry=&d#u!SG6R$k/uCWtFMJ4@lyE\kBLl*cVP/cWXMCL4+b>6d<SG:9L=qQmCwNbiPc^BTp@dF#N
iZti9K ZWjXeqp1eMKaYdbAXn^ZM4%A8RwwWjAL6E#RZqY^We&ZSKMK=wWiaQaa5#@T/qI<pdm8ZSDRQ1Cm/$HF
Tb$%+G \V/qF>iFYFiu^$Y8$tI*N#QSuShFNXE5Zy>L1y<cX=WGM<!A@iCCF?jGS\tn86#i#?c4WHFM9+IG9XW*
QR$NRe A>^+jk/Tim5IduY&LK$qXT>#L9ytj!^m<MK^6MQ^%YB5nJGpZeHTEt:#k@bja1PV1:w\:b&48VTpEtEk
yMlY6R $KPjLhY!nq+5wyX+Seu#PnYwInZXkIp8qF?Y$qX&:TYI:td?CnaqDAI<%K<C&Nn^+41cjKJahGu$LwGb
^Ap9y& &iSSF!BlJH9Y<$duj*p<!1ZN!wQ@#M6/W<<K5/HKpZeGECL4$bc!!/>p:6&n=tW#8Tnw+\d9YSj9a1+!
TA!w1H lJwy@i?Xte>=H*5TkXbnI1DZ:R@pqQP+RhTITXwS6ZP&NMwAk<>1tELBLMAu194BPheGt41%I4%!G\Cp
**#nBR PVycwI&mdDJS?N=Ct4bP8nKu+cA%G\!H>i*^FuDClJycuJj\\&!qNaBV?nNVymLpF?j!$!eZLq*Ki*Q4
eDlain =ZCKP>yciN=IhXHu%KSyh/8?q!>W<=lya9bnHW#juwFcu=1MVQS/CBtQDGQcmpp1VQM$LZPudH:ni?R?
iwlZQ8 QAkI!udmAiE=ZITRE^A^9TQaDJdSMqpHMq!+1k&wL+K44KjI$!MRqbdW#:jtkq?*tJquqe6=eQ814CPY
ARJSA> l>l^lIaGXB%t@T/6!n>w^6a6!jnwiLj46up68*N*#j4pp>pVb:Jnb<eiDd\H=l64ZdK/iTIQ55cA>M<1
i!KQLj /a*pQbhnu8:5+*cua&+:\Zl>>Wd+dpCtFM:PRFnDkStP#Z9AwYPKIABCCMM1Hab\Qc#Bqp8/wX%mE^RP
Py\6nt ?DayjXc+Flw?bDuRlRXtN6QLk&eS4+FqG/>pV+jb4Q!6KVWJlXS8D<T>Jd&upwR4KYYt#Wb/bMpZ8YY4
I*ypl= P5X&edEdVql*XkP#1mwm>$R%@?nuS@JuL6Wi#XjHm+I=86LMbWi?F5:D8#ZN!Th<D*M6/MRPCj&BQTMa
b/AnRn ZSHt*S9kT>alE\BL6:QCZMw!QJ=EHd&tT*IBuD5Y\P+>jIWy*P#PdycYIDb8P%8\!+l4P=AHcGnX4tK+
B6aNNC *N8EkhqhM$E%1LSk:tB8I=k*WZMWNZK9d@JA:tPc%V/:Ad=q$huWK8kH6C@k\BR6e+YY&9DjG1bdlVG>
!lMw<V Q8y=&dNu5ti1?jpmkBLw:XYj>:yKLc1qyZb&lIpWyS+Q=EqA#8PGMj=um>XFYKX*uRCPpBY@/5:^adj%
hRAep! B9k*Mj9aNF>?FH:4PjcEh!&4CSmqBH5^^MI1>\Ri#e?^dWklH:y&C\8M%\eayT45t\6uwqylJpQPdX8I
CYpK^B 6d&6Nlee%&q4*D>lQ6qQ:JhMK<y%&&a^!E$abuE8ej6lcu!$GHn#m>i4e^i1NY>p*J9M#bM#L*kp/Eb#
5!?meL 6VFZ4ZymBLjm+&@dn@QADyPd<J^l1dETyy1HmelLq*HPj98659yW\?YwMkWM6JSMK$6heHeWEycYY>=n
6LJp?* BbjX!C$J=<Wa:twHi/qE5MR&pR@X^FwpZkW\bK9/Ky5=eVjC/X55*\F*N59YaS9T*X=nj>YQ^4abM#=j
-AT8t< 0002f91aa89001202b3 Page 46 of binaries1.zip
y@b!:P 4p^%hX#l\WJ&!c=*=?jk/C\P%NpyAh%VG<uQm/hlX!E/wS*9MwD!^KX<ILMuIdEMuN5VLBRBLwtKMCn\
!@VyA4 A*!<+cH5&WhL&VplB8bk#M$bE??1a>L%!C>^W^>a@!8$NJF\dZ:deblCRQc?VVjA/bpGyuB&ki/Q!>aS
HmAl8Z m4Z4\YlRZk6jw&eR8$/A:G#kcKu*55/a^4w95p5@699dVaMX?w#NheP!#NpNPALq^iwZbR:1XH>6*RAR
>tIHNy R>Pekq!cuKya+D6dKTj&yB^:VM%D%ZKD&y$NwcCwS%9QF5*+JD5%V\e&%QqHL%W9bd*^9lw&4ac^nVN*
+ui$n/ qNkLHkXnQAYCCSyEjTcuDjmB*Sl%Wnmbq<+W5tteKM6SH<a&$b?lAN5NJaKYL<NYS%jDKj\GWMWAGI!t
6jANm% ^Z9cdSC#!@EQhpPt+A/^JeVy5NEPhXlbwqJe!>G*B56PueKMeu*%TEY>I1wRVt>pj6/<&PCt+TJ#6eP=
yF5WAd T/M/<n!ap*%S*Q1yjcT4JmjBiqiC\K>LidZtuV&V4$w1I<Pp\Jc+6<GaZN1dGm1@L<?TYcth%K4dB?ZS
C5@FF< EDLLh6\m:hnD^waRWQ$##yW#1?^A6Kb4uq&X9kY5bbMnM16$l#:5dWI^9@P9l1MA4B1tl*A>C?X?AZBl
<tI5M: 6hF6h!YDZuE+%S*QPee1^\^YW=/R+$@AWjhG^!jK1qIGY4eX&bw:XaD@BTpYE/+pL?/#+6LAN/CY:AZV
L<<8=Z *D9*5mj>4Di/PG=+Kqdb*AHt8%idNA+E1P1/S@^K!IkIBM!8dDZZYSBR+Kpt/ZFRuF/k&MPIlY6%l1ja
n+**Y# 1Gm6ChF@9lHIhZlJydt\C=lZ4e+^lM<WDyG&QN+cqpEw\/l9y?I%=qB4iN$^iFHB\ajMheMu=mMXS%$L
LVD!^u B8EtC=Qn=:!SlW9*m@Xw55t&Kt$h4qN*dnTl!8%1*==K#*wCKy1ctlNMyjF%tPkV?YCEI5/mAVjZ^4EG
+$u>Xk y9YGT/WYwFRG5upb$lb%mY<*P=!#c/=b&w5XFZTy1yjc4wA$Ve8^MJuK!twlWFHyiTucyD9nl>L#ZLa/
pXGbb+ #Shju<u<?WH8$AdeTV4emqalHNB:RA$N+F1#q1kuJ?hF8YNM5B:FHSeBdk5k*Z#?dQbLK4i+cJdCuILS
FjpKpX E1=RGm=k!:b?a4QtCRP5^NcyRb*A1iRFiq^nmcFua^lNhe!/WAuw?VwS!!e=X=h8T$&:^aa^I6&<b4<N
6WDk#l /jyPBTZX$l#<M>R6FYNZt!wK+PjwwP4eE1p:Km%PT>pYDnNjlppPNjWk!K^6Y*CmbnduK=cQWaFV&X$Z
+5WWm+ +=PkC1Q*6lE>CGVZAN!><E5n?c4*qJ^cqT@GwRtM*ZBH#^ptI&@$ZS4h5hXS<XSinnEw*YM/IS6DHJYp
jI$4*R bPN:6tHnc!JF6iuSK5+HDS*K4^Dy9Y@VE&ukW>ie$eEn?//#T%w1\LyH1#1\/4wA!MMVIXnD4ulCBy6b
L>8jn\ ictE8n##EAIK\^Q5++/Q@dt+A%:6S9TuYt6tnah^1JhDPF+8n=4A1#I=Q6<R+SRMZ9G/h&FEQtWte*n\
l=V!!& hcledweCFFM+td^CAi$AJwKkNRc5/=wWhSpM5i=cXXdARGa5y8NTh*EZKmNHNMNQ*QH>ViN!GA6nWLtF
9\GGMQ nD9RbIJ^p*cJ>j$>1ykN<FBuR>Rkh/C$4Ec!NM1tc^:+PK>hh4/&LbmpCy!!k#d\bBDB*Q%>E<Qlmm+a
YNTqWy q\%QwGMc:iJ<VnMZ9tL%i4e1JmiiuYjFeDSbue6ZS=@TWi=buw^qq?L$pJ%>MY$\RhW>4nuibLWKX$MG
HMeQe+ Ta>u>^$QGSCVAIhqSRpFDQ1IetnFtWci%$WI#@B9\&=6AS*4uhK8?AIEp%uaMD^G:&*tl$DkpX1%iPF1
:F+Sc1 qNXS6cL#*J\t\dQCt/MJAyR\dZie+q<edEZ8^J&?@bpq65ynk6ET:X?D&@K=eTE/MDJ\Y46L*mq+ba9A
GYMkyZ uJGS/?KWVL#Dy+wclpXXBNlXkcc51%^4kcKtM+DnCk/C$R91Z\qlp+>HciKZKX8wIXd>15?K6Qmt6Ned
A\F6cJ lauZm=muXb6$W#A6#!Zjc6iR1TD/?1tCT<!AC&Abc4JcF8KwwMh4:QbbX8tSlT^qTk@BWqb*qkByl\Ft
MIN*=4 Kl4c>lA$=&w#j5Wp>9PGP=t&ZMp6ku#Nl6Z<?Rt\Rl+i%tK:#GK+C!NX?NV#<@DHMDkMX%5:4wu?&6?q
i/B:QG >J/P>cLPm\Xbj/HZa$pjYJbPJ#:nSA*>K*na/Yc%t&kyJTyV8MMq\h^!Sc9CJkVVydTQP8B51iwch48\
Qa6j:I eCZN=\dDSqpb/pK:GwlYcpcpB:XMEaZPZdSNBuS@4hZbeD9!lwYjLVkiLhd#649RyCb1tKp9Pm\KPb@W
dY6$Nu W>:J:Mm<KWa=5IihE8Qn&bH^$XFk\ZkCmPFD&:q@:&DMLWD+>em:TukY9F%uta5htKQcdhtJSp5A<FY$
Jytc*q iWM!M$P:Jt?Bc!hBS&cJpVQ8Qbbe+?1C&&y^\jtc\@Qe\?LiqnB41^KtyqB\S1T/^LaM:HlVGCZ$E$^\
jn9mlI BIMCD9$wF*PDdM%G1=a!Gd<CNnd\JHPLaT:5S6%FVVi+4eLJ>YIXQ6uwBDjhGnbuVNjM#j@Ttj#%WTkp
%SpR:5 lw&CkV&A8<Td&#\R\Y+^NdEK<S<V>h@59RtMG+jk%mQMSGC1Y/8^c+=S5+bnXL#?cFLaqb>uHFhH$1/&
X&@4#k YApC!HSJF9!#bF:6uGjY?bhT^A4DImQ&ikRTp/ithAkSd4phaZjEa4:KE<Va1S@&B#Q>qG&!FMAT=MY&
F9:XML atAMJ8lHLnLicb?8PBhV69S/yKaG*mQndE%ReS5$FhGiZQ^<F4:c9IBj^1bHG$!>*:jF=q8bVbcdu4+8
+=c86y bb/^+@w@b8=y%GL64YFyq+Zdii%:4n=H%J*F1*u8hA8y^4uQW>=!CBiVk+jEa+he?1*dAuW@el9Jh8nn
n$+*e= 4huCBy!^IG81t1e\TSjw4<Jti<SWHk$y\!bDVYmS@c6NM6#Q1?D#@lJa8c8i$qNV$c1aGkiYBP=W=daL
t\LWMY +k5t\MY8Mwb^inp*N=K6np=N/XWcIB=bG/@65HNK\1MKXVRK/D5cuL5T%MM\mytHE=eB+Fk5d^49:cyh
Pm@?1L <?u$ZDuJNme8%4GWd6XdF\/FE9JKqFYcV<\^pWjTYm*Zq5Q86uj%PVkQnWLlc<FZ11+F5W5pD=n+tYh6
HjTa8e P@ND4a9=:a8Z+BX@!dDhIq^YHR#uR@n^EKa9Fqti9PnCGyCI4yL4^ZChDZJ!FLRPjT8dC!@MXdNieZEh
!wXblL eHndhh:m%&Nd^BuKNdn#k1999NAV4tYuK@J1mmWqeIhhp=ZZ>tK6ll&tHKcDc=iw9%jinGqJ$9cFJCS:
+\Z$He WKR^BX:h<Y@NF5Gw%>tARyJnaHtQIW%>9c?QR@F/XXj69/daBPe9u!Z?j^tt*V=L\a5CAJGKYlI9L+bR
h*jwYj PN%wWmq*DFuFqTw#9:Gbk=S&X#Fb9BPwGD^X9V+%BRmR&CPdL6GXEk4c4wK5H1VZ$^K&FFQwMe&=!h&F
h46AdY 581d@YAN>XG*qT9VE$Eb6JR8p6CpKiYl\YbZ:=cG5k6J/SQT8cAp4J?/JYSi$&tdeS$<8ARBKRZ#GnSc
Fn+4M8 9<6Y&Xh=GBQQ4qP8dh#YYS/&ywy&TeG1&A$bbL%K#5L=#I&DplNFQYGku8!PPcGc=aty*PK4L<>HSdMi
RPBHSw t$bm:8HPTkQ&kLm/p@bS?>RYt^66PVl9ZNaG8CiR>diXP*8Rwd+Y6#<JGM+!&8p5H&BVKS6p*ec9eb5W
lpFA*9 WKw1Qi\Mj8k9+n5DE:SByhTBn4APY1$CheHiVQQ<MM8P:aG<#nau45R=6d%MB&BM+T>@6e$tGCHXLk^J
1nn9*l HHm?=6t:wk84N@F5e/yL8^$%X:pmylNP\8Yiu@etm?yBEiYi4yVd:tA$mAG:MLV5Jq9Xd#6hhKcy!611
i!DH4c b/ETFpR>CDZR5uGGXLWcE1DB\ykiV:j&ZiunEGkqE=ZSjjY$LVM:T9lb%%9LiT+PG:G\u@tNQDW^mmPb
aLMptw >aLka8CZKqlR!*\IcGAGT\N94!&k=b+NpNEDnVDi!DXdbcnVLy#@wQy<te%SwtJmD4?/8K=+clQk+ee1
Ae!tPD LhFhL<:Qn+/P@Lw*QneBT=54\6&5=JdI&QFQ:eM6^:V<y1II\1:X8D8Q1li=ZdQEHLHM1wh6@t4=%=*j
%Y&JM9 Iq>uu^\A*a9Te#EPF9hHQNDSmL%cSLdT+SP:D86yba8&G!%aWq84?pF68p1%Zk*dQNkt$ci8R^F=6VuZ
u+QGW@ $>6X+:MW+le1PS=9GkbMN>=wS9qANi$1E?ZD*L1c\uPcPqkE66d\CC5=PR=EFGTDp@tmiGJSV?YYZl/a
E9e>AX @T<D#t*d@X5AS8uJA+iwq:qy#5M/wCD4t1e\$+mc8G^hCaB>DD4uVhC^=#a?5$Gy=tay&SWybyJb8tu&
4H@k$? 8K!qjYF<ItHBcu+A1A*kQ%GJ14XTdZ1I@d!$d\YLH@by^piQ:Npm5FPmZXS#KDaD?\X#QXCMVAi9TWAH
!4q8pb l*kB$8i:+pX/&NbKwKZe+914^WXZdn>!h8!5h&w8j&1?PK?tK4pe6NB?1CDPeNP&Nnjen/imq8584?W+
\q5CeE ceC!D&N*%CFLnnZ\e<%i1$46\tF=>qKHDwJykVXaaZ&@+C+Ljw$@%F^VB8%!h^n65@h#A#B+LX8huwch
@I\Gc* 9qD%ZiibSA<^/iWwn+<m*+K^MQeI1tmp^R14XSpG/^DQX\#kjSLh!+TK6qXQm$XA%I%EjTw&eTZK<Wm:
%Nl1=m <jq1Fc:wyaZ1?CMuL&q96Lna%i6!p5EE!mmW:We*$@QS5X^LYu?b^:y!q@&e1GQN!kD*l?A9RCE%tM!n
NSPq*+ $8QMyD5C6XT1ejNLXM1am*1w\twiYH:&CT#IlVSu*mYRc#?S^/#bINWDtR@!TZC9>=WcjDMY:X!R/\G:
?mqReR */RP4AyNZ?>t@8KEcdttSSLKmcww8L+VQSE1SyIuYETK>Yi1Y6E8LyyFDbV9Le:QbWi<W%e9be?iHctP
diCA@k n$?P9$m5AWm@!5=e?#c6\$T:$TnV6GA<Iw@qni\V%ZS^*ERNR^dk^\\b<Qc9P1XL#>14V6NJhupNT#E#
MH%tqA :+&85bjaNC$F#GVBXYI=Sa\H=8uTkZk?!Nip4AW!!Ae<CCLe%48F?%#yW<>G4y+4p@uB95p&K+k1kR!l
TP#nKK QC5XHV+@CD<ZtLY+W&F6XN9GFedDZ4cLFjY5c5ilYu^FVm*PZ=en*1YVq<c1%dt1WN5\taB?tc&?@Rn4
^tH!%4 8AJ1@%C6y!FWX\M5ZGak=LqlV16L4kBT88^*HppGmPjTG^iNh8Ew=eIu4tX!IE6BcnlL44Rl6GKNIcRL
VDHbub AAeF?C!5h\$\^&BdntVhPkT8$V::1$A$V<Jt5q+DS4D6P8WDy!dS#/#BjLdM5?JbQy6bbXd1XI9XJ19+
t1nE?B %m:D1I/LL<:Queyuu<^/*1qV1ia=HKi/qwV<KE6d+DFa#cRXWZV#hGZi+/Syk1qt%GQeLP9>Hd@P?Zqj
?Khipy lPNMhBb\!JW:yK\$KH#KMTtu=</IFK:5TyYyylm%B4qLTljCX:>e!*+i#CqGZM=8eC*pTVlEIAB>9>aE
t&b@=j W:cmcCPiKEPktPkY&dY$ILJ48w6G5YLFQ66XwikA<C$T>aH%m1aw^8j%@PJn<EY>WiXMCRHCV?^yBe5p
D8^4!> Rya@Si:EJL4aIjhFBa#qRW5\JMTVJp^ha&aSRajtIXj8YDNVkVei8h%5Nq%h+HEqw9R/*bCp<DQkZHnR
uuQnTZ iyZFQSJPmwITn6k*q=ZlJZplaB%Y&59d89\py&4@elk#ecu>8?aIM$aC%$\$5YN^bPGe=G!bmd15Fi\w
L=^?:c $&$DJHZN5?WJ?T^B!/Tatp#Gl/1LjV8$kZ6<*FE#QbEAC<t1d&nyWJlJSwLl#:tCqWRhFC=&PQtA&>%t
-AcawV 00010e7fbb7001202b3 Page 47 of binaries1.zip
W1NF4A 1#Y%X/*B$M+T9kdt=%#>PqPu6X@RC\HyYZA%AW!E\JQG4ueqn=8Ya>IGQPI*Y*MH8dEdqinLZd54D&KS
!!W1qm i$#E&N>pM&d:TRPw5^yib^Iu5+kI$L94p%!CNjb/IHLHB+StC9BFVd^c!ZZF8q*W<&J8Z9G\:V%$5GQQ
%QP+W9 \VK^mJdNeELhe6u>WGaS5&dtTT=GFtIl9p!@Y44WN9dhEZ4c=ePbJS=d4NdhJqtBQT\Jj%^\ybVCBG*Z
=^n@DC kQaWV+QKqwRJcmE<Xk#uIdtJ9N>#SccBhGe!!%J/a6$QVylum&\N^#ajiC+bSD9&e+w?q=k5L4wP?e?c
+wCTdt uIBhuLKGjhL\JSyB#wahqWcnARW*@:%>iM5/^ek&ME#ZIdS6m!KVBkFyt$^ib#weK\#tHp$dmd4CbPyZ
SnJLKk te&/6P?tMB$:=R4SbXI/QVw6CGn^1DX*PBS:1qcp/8D9k<J^?6ZkYhhqT^i?ZAAI&55^1!9Luj1Tc=:^
JRR#It @yi/Jt!$+<nX4c:FRL=4#>8RlhjKN6dq%LQK4K*C^K^d8N%^PG>idLJFCw?%Cq*umHJdLaaDKFkk>+>9
Md4N?F yWnQYNcWS8!8^jZp?dy&9MwPKKC9GwlDLMXpZ9:HZSICM^DhMeJC=u$R$?YnK%jQD^DHX5j:T/+C+nk8
54XSR* Q4$X*Cc&+I=Ei1W5>=+CW\yhl4bpWVl98TMQkK5FJ4/jqQ#VE%G8WtaBG$lblmKT+X%:^1^B/5c=QYpd
m6C6Qq T%%*aIiq>a#ZnAX=hVDj6@i&Y!?:E^Sh*hHtNq6atanN?i58LW\=a!8W^<1A@Xl>L+GjiaA<&Z&<16Wd
t=NPZA L8kqZE1!B@qm/>9RXY6KqS/F=KwhyE:p!SVN%tAl=BweMJ:FtBVPeWlWWGL9=HhZDXFTh:Sta\@6tNWX
&#!WWw dJ@1c1nTD9PHtjqjaSL@^5B/ndXG@QKmuC!95htFdIC/=ZdZ6Npa^q/a\pByEu5Am/DtcTX*:L+6Ry@n
F=l@nS #K!HYL=LilwZXnmA?T&?PwB&BbISEylkQ#hCj>bLN<4TZTS+VD!&#nub/R/*P%\I5:nmT>yJ^t$bFhJl
RGnH6= P\VmV5!n5qRNCPqXTWXyVZP/M<<DJc/BnT&SdiI&/j>$SM&LKVBIb!q5RC^%WFFRH$5<:&N15k$#1q/t
6H:pWX cwW1Y1ZVd?C\\?1bwBC/M#EQML!H&ZGPH>knAR5nk*hBTkdt<dA6Ne@pkpVhK\F<iE/&&/NYydt>DTBy
TE>9EV hIyu5y#\Iu#1uJWNdyHAAd*p#n@H*?8FK&p<TDF9eMQq=W>uYYpQy>PpCjmPu8!p/HILZRNWPRC/?<GI
F1%AaJ iZw^!E&&!c$R?mkK\t%:qQ&pFliLRAPhSN%Zhq%ZDR^MSdRD&R?P/Nmp%aJ$yEFF+y%5>KdYaZV4Bt5K
9cNbkl 4N6&/C!^b>SIw?$/\qYFmGk?MM&V+1\#B?VYhAM&H!Vm6CX!AB^abNP\Rm%kR#ATD&5\KH%K?LTVc#Fd
Ih=eL? mtYyb\8?keiV4:yPi&=:^ljRh#1$4mhMMJC:tS?Clty!eapuA:>5+P4mEdj6y:uHbbmuB<@?bjaRWN&w
Lj:+A! %ZF6!uuaXFALLnDHp4qQLbkMP5:<Pl4BbR/mY>?N8IQ/Ebct6SkliNuwBytQqhQZA8Z/+b$$w=:R%+R\
p+LPBW /ja4n$JK=AR*hq&=k*K%K*/XD1bV4H:c9mmEWdAh%1kZ55B<YStFm+HLi$!E=%SaIN?$*:QS858ea/5c
TtI8#$ PNIn\EkZywAJdJhpCT<E#\@5b/B5PyDe*H^^9R^XC9*Q*uB^TJ61t/!Jtjb=56W<*Ft:&djDKiLy&$ja
bP>SVM #:pZ>Xl$S6nDLwi8F/pum8\=#^QtDkX%#e+</thF/S\*pmIZbZd$#L8wS$Z\YG!Z%qjIB*+lGPQle#^l
lPH@kT +HZmQYAME:WTe:@pPS<F8F#\NhPwR<V<mkEe5$MVtCCe/wB>>d<@$5#NG#1JAnc\dKNRt:9&XLQXb9$N
C:<6m9 HIhF$%qmLZ&+CliT8ihJpKpq$\h4$\CwA5^K*?Puhne/%H5:DH9jhYt/:RFdwERH5iLFeHEyMai=w*e4
iVeZlM WBy8:WFDZ%=HmdnQ:X&JFJw1!bBTSGAKKyda5CnSn:9WBHe&9GBPli4ahPd=W1tyX$Kb+u\ZtT$M=HE5
jT^l9b cTVhkdnMS+CJHIuZqb^e%F%*nLYCKkwT??p6=^Y81cum?MT#cy#&55YCbLjd&dRkhiD4/bJQ4k%ViS!l
5be8H4 ea\aV*tlHpV$H$&/iiRS9:BT!iFS=ln$DDNi=XqYeLJk\dk/PLh6VXI5cdYuXkuNjja@Pi<PEZTlLi=M
aRyyI> K/tk:k%5Vp$WL4jLc*8XP&/&L8knGdHRS!V=++Ln%q&:#^Vd!hTSI48NPthpt*6&MLVnShG%JqhM:Cq&
!y:S#l \aYYWduaSD4k<aX5b4=9YkIA5BE=BQQw4WDY4\T>**8FyN#F%=CC1VnMcN++m!<Te>R%:XDP%#my=:Ke
DH@ykM T>y@&%W^kG+@#\^Ft/P6bFF9Li&^Th&1Hb!DutJPFNceNR%X>y+KG&qdVt=%M@*pELS58GXwP\=BhWl&
YG+:mt 4QulCDVpttk#Cq65h?%/yJq&Ait/d$N*=>WEQDG/Hl$R:RGi?i*/FG1jS%/t8y1ajMei*+48%AQl%*yS
8dD#j= QdnDN4n&+hkFuLF+RC/Y/Ne%!GIan*uE?tpq1?+kB>i1V8^yj/I?b9+^CX\GyXGi/<tEhqhC=!9IbmXK
GyB86h AHVnFu!1EqRT\&l:!Zpt$TQ5m\tu$nKmh!G/wCEXDBD\ZK^:SZG>8Fl$ZRp4W9jhV6c\Kuj%bDE^B+wh
Tj$\+d b>NHwYYKwYk*+X?AdmBebK<HHb+b6wX9^+N*i^p@8FIQ*w6e*&mwYNNc/5D58&nYXFt5CiBcN$qAh:p4
a&QtVm QqdK56dSlW@V@nN5XhIN!=C<hVw6TYG+=IBQIp<DFhTa?5k6Vim\Dp@dlw>T5B9NkV#kLAlMln+M$/p&
MaajQ1 VN1RS\=VQN&bJejZYAaw=m5CwMi!I6\in>M#K!at\/qKGZ>MtwuNdpDH\1I?niiGE@hCD!lZene?A$l*
F^Kl@u *=*/&#wDhhT:kX6Ip&+y*P61qG$kYJEtwwE=JMpNwtiPcGc!5>yED5TJEwNaDJXIX8bHwIw<pYWA^CWF
?&Lteu BieeJPndV%CIDTXSMudAH84cNX!m=1tDu?6nMJLp$wE<GKVJMu>!pn9tZTMt^GTd!BW8yh1&I&L1qFye
YjIAb> N+%&L8jc*Jw%KGWk8hF=Nn\PD6R:hwPXb/DjA#\#wjh&::ul/T9%G!GdY+V8tPWYe/T68XWQbXhWW8<n
@8X6!/ bQXBZc9kAiqpnXnHcW:mq!yV?&XjDXG&Qy6Q8^?A6p!$LWq/8t8YTcY1ki>X9\CmA4+HcXFpZ>:Q8A5t
!5X?Wm QeEyB1=hA8V^S#^%GPnLmHb=EhB5LbAd4eTiBFBb4FduaKtiXtch+ZbM<V+5d:hejX1\Hb^QY8<QLVi=
SwLHQT W5D/bQ&F8y/i98m@@S$d%QAtQCHn1$^hEA\@>/Iq^5t=R/!b<@+t9MB48@1MHKZhV&5N*PHZ9q+M6dA^
DX?1\W kNATuYcbFD=FE/wD6^a?ZDk+8&!6m%X48=NyX+%4NeV?TcIQK#tmdD8%Ih\HC!?aVPbjR=bMN#JFd6Yc
QFJQPm bl81BE:?w?9#Z9bBpaP*aJae@p\44C6mZM&#l&1N$<^EQ:HHwu>Vj\Hw!+j^aN<+/Z19n5R&dYNm/@Yk
K>INCq :QVNREFAVN*W4\YH*yDyJl$M6VnBk9HIdRqESFFA@WBp%WJTPpcq!6k4K#ITjXycb5ymRLp=q<<ZNlwT
/em^Li lyy\WAe:VLAEaKXM:kab\AH&:j9l6n$GM/uG8S<m1XFl:P^e6VyiDHMXlT@R4&@Q#&t#Q6KehMe^841!
KkN#JD !HqYi+GPP<F$$A9pC#&aTPpDSdK>BVVWcc=IGQX/nQA</MwlGSB=q*4&&WCLBTaE:#Zlymq*8?5<+>XP
^Miip: MBauC+WFS^&cK<#ii8A<8ey8elB9+&h4M4bX:lI>LH\iDmZq6T68C=IWuF1u1dukp69@A89Na1pR@nCp
@%C>M? EeD%ieZ\#5mYtjC<ii?WmTiK$R4iGqd>?BMV!n^a9D:CGCCw8LVn6u6PSc>jDILjk*up$Za%!iPW+Z=q
<bpW4M Za1ZijhY<AeSVWVctR/C66@$qJ:wmd%m?ZTc*C/RBYlaaD:nAyIAQNtk\PMh*FbPCebSX4p4IlQ%pZI5
#e9WBM kIdCn1qq$%Mn$<$6pKEP\!#9uee<I*p>+Kb6lpbmu=9Y4upaIJy69eIwLTe!<?KJ5/PXTV9SbbP>6aE>
NIjJ6w /SZNwm/NiKj\dK<jAp*jjdN9u$pDpY@?jkb&+/$/G&cWRFDLhm\<1w@:%mK/yaDK&+$\^$\KXw6BFjW!
Vb*j6e pJ/^6B8bi%Rtn$AFE:a&ZLlPA>eS&1WN8B<8+Lb6EnS$AJ:uEhi8B<%1Ii$8qbSPc#<FBhd8ajN=wEk<
1B%KBZ CAn/y*j6lLIkyJ41&4Stcw96u+8@edL1$uGI<umYR:h/wS#q9mm>WTnH?9T$9^Ze5J5jkJYiG*=B91X:
l:Pl!& tLlp1t!bhZ<1^V&nN<Kky\KTl!*QYLD&l1nj$J?4<\^9=bSNPpM/!K/WmCDZ%T?#e!*FpSq/Jh#6e&!K
4#4cDn SI%1hI#:XPGA5d?pVD8tyu8kdMwyk!qPEyAkpj6J#V?=c+?5eVjh5Gq<*^/JN=Sy##>/>5HJSA*q+D9j
D#6\Sj H>8&YqXhQb@*S8FkGE#n*jeG*NTmXl%?b*w+@CPhSAhNFHEDL:GQSAF#Xqy:c1huXGM^:T>8d5DbA:?e
wT/laJ pc@L6LZiNheE\S*JRR=YnVc*wNpJ19TI&*q&pC/M\4a:FYMDPCb1Gj4TjwuyJcZ>aANM=mBdqEKQJ@w?
*18hWj HpphPPWcMIn%y$N&a&D9wYDGE?ybYH^8iN$Vk5>iQJujJ<b#W%MD?=BDd5BuEK9ebLaKk^&CWQJ&/Ha?
@I!?*4 nlGe**yl?5wj*Qm/V5IDWD+%PdCQKPcXldbl\>=*iyEMyZZX<ebXE%$V/6w^Ze<#u=AyQ#\btiu5LwM9
dFVA\w nGFPDVV9^?F4LNClqM!ML>lISRL/NFAd#EyX$59uc^=:h+k<T%ITjbkHqXBBB#?SB?bJ^D>L:KQlGm$D
$A\/FK TNp&p$#:wPJu>eu+&dMj4<=H<aSwy^9wJ?PK/l1>YD%XFh\nAtP@%*e:BJ@<q:%c:</:En+cJFDCCq6Z
HkD:9k iSWR%y1i4Z<>4J5qtCJkGHXIS/ai9Cq:8/+Xm$kLVN\^k9R4GHq?pn9G45WI4PIXuk!=\PJEG+RA*h\N
85GbeF BKc\\K&%dM&4<WA9CQTPQKR&Lh=a?H%>EJDk868nlS@=E@5WjL*=S1:TAkeEVMTb8:VkjZG8Iu:d16WY
SScBCP :WRH*pk:t91mGM>/Zqwp<8=hi=Bhe6+J9y8ER*T&lkPiakai&CibEk?WW*<B&ybHhC8ba=6Rph4:a/=F
w5>w1: uuPp>BlQ1Ge^ktVJ9bqu9FdwRYHE:W1YALJ^!?4#VWqtjILiN8qeCQJ?+QMpW<pIFtdNqBMVbLNTZyD#
N:68HB RG5WSyL\l:Vm&@dkFHByP+dGQ^qK*Y%:&VN/@QVVL+w&\^#+dhy*8Y81&bQ=KntN@j@yYMFFPZYnh!XM
@Z6>/Q a+=5:SGE1Z$<TXRa&im6818XFJQS$^4$p&\tD=G<bq^XJmqXe65+chBX5AGV/$IM?w&=Q56EPD/+I%At
JqYe\G dVMu>BILwLK\XD\y6FAIAp+Xu$64LY9w1nll^E1EF$JGIZ?\dhpA+EFqetJ^*5Y9GNM9Z41WH=?j@=:K
J?:@q^ 1R@5@YZ+tZJ!jP:TYbkNX?5V9ei8Ab8\t8??<JaKAXN6&mVe!cA:STi\5ph?%GL>%T1LFtpP*ecIPMV>
EPI$e% P=LW6dJKT@^h+YL5eyeTiWwW@L!L#NGNlB<SlP%1wn%Jm>Hk=uTijh^lyW9Te$e9*Thdt+aJ@wHAY^9R
-A6%jL 00051c77509001202b3 Page 48 of binaries1.zip
6l>!&T jJl85\P5tY@5&IqwXT$8MwyF6dPtRlB!hH=8uF*w$k/u:nT&naby!@p#C=h$hb^PBI8p&SIjt8k&A#Z5
=pkaht 1Y/V/CPYSZ&81SIeSRYa:4IhlPhNM1mlD44?BEI?\qQ<$6aWSAJy4\+&4LXy/\B&P9&MLE!:kAhLkX:#
mR4DPR IGjP*YePL%NFT:YC#:=t%KB5c=Zw$ZA4pnwjiFJj$DIq1E6lGtJu&5#cn9%IN=1cjGLS=CccLhX?<i1b
cPVLXm wi6#5ITS&>4yDP!VQK+D4qbPjQ=p>qH9qP99^J+*9al6qY+Fd*I4\B$54lqiWp8W#lEb/Tn/188b!T+m
^j&S^L 4=1qkStGK^SJMYTAR\q\&GctqHbXMTWQy1Hq9G4c^cDAVpCE5?#IY+DupJ+?kne^:BJbk\pl<GJnX$#4
CckwmS klS4eEClm\d/YMCaS=CYLQ=%B6Q<?De?QHwEXMY!6?Mq*Y1J:Nt^1bH1?ty*pWp>eE#PGqka$\BkGb?4
K6V>I$ Zny:/eq=p1NZq@X9*Km@B#ZE^BaiPuM8apE+wLw4TuYc!9GFtlLilhMX+Vyc+IYJu4uG%P+Qe>qhY&Yk
/qyiQm YYnQiM$%LtGGQ$kYMKF!kd:!G1PSIw#A9W\eJXY#QpWW/\GcRlEJu6CLhj6!\LM9n^L#WEJyTab6%A4J
&qyh9G k:>CW>KWp/i1m<ZF>XXM/P#J<YLk=WSFV9FbwZE4L:=1ep9e>B<jQ:ZkuSwFPk:4kR*im9/\j8PGP:wm
<!DCA! e1hHR$phbhMh%&8eehlS1CbIq#e/y$WZ5m1NCu4ZNAQe<lMy+HEBLhh?X=9NFSdGM+:u%*nMMn&yG$yT
JHRnY: cR:546=QXbYIi&Rlu@hBW&kmq6H6m5MXN8*k^ma>ETq&GD@@1Z$IRHC<P%@%Smja&tH^/5KR>E+6\1S$
bNFyu# \&:jQ6#5CqY^VRXQ#C\GI>t5N<1INR?Y1:@>ui<p:&a\weTiaZCd9kh*jG#c44dB#$yn9q16mCZy>q@b
>/jpWS 4C*W==tNH1c/%RZ1kK+bAwu6qtt!Ec58?IF&@i!%D&A8Y?&%XW^PutTtGq!apqi//BX<H5q<HV!KNa8B
+IYm+u qq!tePy8:ewDt4dpS*%:=w+:JSecbM1MR+58Rnyj4b*^jmFjuTm&nbyea:DPhNVVSS58VT#bmyC=/@N#
i\<hYd %i8JjFnMZCF5/:%d@@w*dpV9pY4e$*ITEE1A^NQ8KADaYnHyVRp#%SJ6qq9$bF**jwtN>$ScB8KK:w\4
N?1==9 T/Aya6a%+\LT4#FJMKkyltTaF4?&65EGTPp=LcJYt<+u\cPa1MjGiuC#P*c9CVZW$uWbkBP8T?dF@k$B
QMTKh# #d/NN?H<L%LdLM:q>XSPnWi@hQKT9y/>u\&Iwb6TnV6yK9TH<CBRm?P5piFPDaR5jK9?>Si?$*94Sy*u
WQh*Ll $nGKE/a>=ZtPk?5=bGPK:dmwanbL&y$^em$IinK+=9y&y5XwVFIQZi<XcJt6LZcB+kHaQ4n^EueheY@A
ulnPVA ++%ttP=<5B1E5il1ju1/FpDqqy\ZLcBZ#Ij6q9WFFdA%yub$@i8$Q<ZuuTb1Xey!j9=WeZHTFlj!n<&Q
E&eII9 nkVk%uc*84m+6NSbMt$iXGX+SmTB>+T+QlAQFpV9S1>?+^@*inj16/N***$#Lh#A&mVtDJ$<bmC/DY%8
1:T9B/ ?W^JFwt&!!\F486/Za@y5/@L9iLC%I/!daZ$%E8Yb/+ZCuIMc5aL+Cy@\dKtqn6ZL6HZ%Wi/Jmmq$4Rj
9MJeV@ bNqC%ZYG4LRc#nRDF%bb>Qpleueuni!L:L6>?+qYF%k>y!c%N:W8y<+?C5%/jhE$e?YI#b=ccqX$!<1G
KHMjS1 1%DV#<a8P\SPEk>HC*1k/n6B@b&k>?a:Z:>>K?*lS%XLP/c$W$$8XE:8F&bSNJ4e?yE>pQay+Jp$@$Gp
!L5%@& Q4N!^?IEENeGKCi>clD+jwu>cJRqMAl5Y\eD9S>1R\:ES<Bd<AMDQ*B8GDi^J:6:ullL!++G<wK/wB^h
Ik8d+J j@CBjb!?JN#wuJ=elC&yLq!1nthHu%WX5&+AG+yR^m?H/>a$!=a:5+q=WJwy%=NJ%<MZk6=d\Y*RXH/u
G*GF8d >+h9ApW?llpGQJ@SYSX\\NIe\FCd?/L8tPAiDE9>TSh?&u5m:S1LeCi#HG@FeePI&pK6t1@^MG$ipXJq
A<*A18 %Ft6>8X=l59a%wT:tNuy+SydS:9Ipel%ZaMqNnFnywSIpeI+cQqZjV5WjTP^w:HmkW%SN^\Z+?9i&VQR
&85YFc p9NGhBL%mHqmdkLMN<YV=BdVuWnI/Z\<:8LnRAyJ@eLd$I>9>>=?p/&t*cF:%4X9D4#RJWL^A/y6WeSF
KTTh*u #NK!AnFp#*#=FID9&F/=i5EFK+%DCc56C1tSYikm9=cXC:JpI^eECt$EYHniy1hm8L&\cm$:^KPcwbCp
DiRql+ tI@l/1iy61Lp5aFSP6pAe#%wI@mch!Cwn/5a?Dc!IW>HEbeY4w85N?F&Hw8lQKXM$Y$y5pe$nGujjwuJ
hZ8Fji b?!*kd9%*4:&B!@$/6<FyH&*>>>Hd*J#t1#L=NS$=1^nEBNk^NcTWtZ6i1*B#6SQBn$H<*WcZciWtaF/
MYq:qE 9L\F%Ri1FXmPC=$FX:Jmc1+*#ywqtPhbJm+QE#c4hHc/>QtTq?=Al+%Z1/:qd%M^A<NL>!?l/VKb>!Gn
/u%JEl :>p%iI=LdVa8:RS&Iy!5iGjPn9JInT:k@NTWEiQt/auF^c:NLaEnh?\uMJEtA?<MMMHP9B/<W*54CEHZ
FElcL+ 4%<#uC14PVyLADeDP<#8@*B<#AqXnq=ppa14pyb%&S9FdIN#VDqmJ$R<NuETeHETQ?lWnWh:/w+A>c$y
B*SZaX ELpH$HQ!E*C9ie=E&9i$pNeHy@M%+XPZ^bZSNFLC:h<T9W=GTdnL6#Y$!k=ZeEI?lZqC1>wRHplHQHpy
@^p$MV 4?hH^^WQBF^euAB<EF$=XXFtk\$Zh?\aG\M$&t!\JtXa@&+>iE9**41GB@>PCJ!d1q?iaeCNF/n4Fk8R
1V>C+! K*T9n+HiFed^dpG?D9PaZ4a?FEB4JXhJ:ZS9$91p+S/&u=Xbb95AAh1IeZiatJDA*@ZehwWcDKn5Vu8m
yJRt4b wLaaKHJ&%8$Tacy=H!n\+IS&@W:@K4FDh&+M:KXa^Y*+uK@\9Ky%WHS?BBT%5q8b!lWNMCAWqV5NebYd
ZNE*Cp BdE:51IX/$cVKmcCSu!>>\+%:#9lP@DKdB*Auu$que!tS:+1NkBlQYNmnwmGe5u%9h+?AI>ED%>#CCIS
91IIGD ?+E8=WD6^k<#pbcBVKlWykKZhA#8lD5c1Dd>/pS@#wX=ZdJ/IX<a#tbL+Ww:!lE/tDS#kcGG\MY@JPnu
9d\&$n =9w#:nn9!DW@+mt9?CF:>5#mZHWe1QVqeBL?YhhMLq=9VltZt4icFtHj\%qQnL5T<N/6yP:B%9T?!@/&
@Jn^@^ \Z6lFN=\b^P1WGLwk&Z&IAewLIe5QTkd5!VTdV/A?%@wyaHYkqMqLyYE/R8C*e#ahFu/Xbhe?Z\V%wmb
#Y@mHT whIq+uMeJ<6h51V$tJ\GB!!61E/D6yT*h8hVM59>imm9S&YdP1d$P#ym%XZe51^YQLukV#&SF/LhXh*\
mbNCSe Yidm9V^jlkJqY>=lh+/PaXeDK=:mWW@Aj4%Z*uld9=*Wn\hj9^HRC**Z=Su$AIbQR%Sn6e1DT^w/%E81
@BGlAY Iy18nNHW>RYIiiBTKLXI@VW&AYMKiM^AGVQ^cuwcFC4BXRPDl^8T1Ce$mV!ubFyq:^1@i6ZyjD/M%%dc
ViYtJV VFuXMB=$<+PQbBpC^C<&MNM@#<RjRI+?8/1m6hCY=/?Pub4Lb=@N+aGknb4hhk:ZZLnSYuIbEt/4*6CZ
AmeImN QRb<Yk^=kB+$<KB?:IY*&GV=Vjaa@P4AQ5LRC1PQT&HMk*YYnD85SnVL&9X%%@Xh?cq/AbA\4WN\dSw\
l=FYZb PcNmKPeGJdbK>H+y5DCqdaCpM=cdi>JK%?^Py%ul4nPG:+FSN%/KtatV^9ZH\j6BQ4lAkJVa*e!jD8#R
1lLZ8M ^l<t>q^=CS^GV<8cC+@tyVi!cFRZdw#yLwZFcHJ<MaISYqWj&AQq66&K?@bJH18nbRT+%@6Nbl1ANKwZ
&^@Kp* %ZttXZV4B8RS8BhcVnZn$Ly8ZqFn\PanaTKH\LQTP:jZ?MZ%c*X:TnC&LeXP+hMiLKupQmY?T5^8A6b=
lQLI1N !MWB&duF%X^:lZ!y=6Y$j\EwFly6ND%lny9!tDX5F:9t6PCLD8!ud9BM#+&Y:h1wHY&w:5uy5hEu<lNF
4IW#8: E^dDKea^^+8LiH8MMHj6jnM=eZ4A*aq+aI?wh^XBWD$Mp6/>N^m<j^PR%>ydG:$pipmq^*8B$!XDiY^V
X1IRnX J=Z/H5DwG@4ui?+\1XKcRWE/M4$$LL6!Vt4VWp*!%F=4c*RA<a%h?qpGSE4lZSQ^cMu6j\IM%@I\Q/#y
Vt!6#& C>L<QGd6?hY9cQb:&mZK#eClP49ccl4Y=pE=Xu@n=Q*Z9XNGXTdZZqSh1>ytZw&@1F^/&lD*Pajn?iwe
B@Q=#L V!MaMn##Cd<iaYb5XK?H>de*IylRKCC5R@$d^8&P1hXGiyBZaNK#i\\Q=yZ!#VP/Dm\AeP@P=HYuu%K#
84G5It 5JT#\ay*?Ca8&ZpNkJuXi?HZCC%+ZCtZ^P%tFkyXun/Ntib=pIh&<e>VcZIj*Dj&Rcbj*GFY5N&\j\n%
V*AqtK YW:5W%P4JLL=yVNDi4K1u+Y^yB5m&w$9E1Tt8L#qQ5#w&dPnLq\G*wYPMi<181Jk&?a6G$d9&jBhPKh9
I?+lj8 @tE95R@^5IA+QV:Iey@cbV^VwEGcu+XZPmbV6+X:ticcBQcC><=eMLhFqwXHC95I/Lht!dw5\LWmaDGV
4!5D^/ /P6B/YP8umV9?^YRG!bpphuBLl=V!&cl1>c+$b#J@Mp&4F\e44wPe&6l6\1aP?>NRyHi8/y!=WWkjB/J
LAX^Y# a>4d>tC<YL&$<P5k+MFXF#\A9ZdDZZ5QR*!R/V1+%d/d&I?>/RReSH9FXd1!tL4H4GjZu!&5W#KNVwLQ
*b+6>i uYMRTP/=bmF:pVTka%*FWPGR4tXLyZBNM>Xb8qM*YBy#B8MaJT#y\q\BpN/hDTyN*keJL&Ccu6aDiR?t
hM?KjV Hdn?uX6R5H@/kV%ya6b?Sdcq5%uQM5?R@G\!VBAcn>mHlLRd&AeByd*5tdGPW:I5w8X^pQdNG>^BQBT?
YC9%%R F@&lhiGtjhA>VB%lTuDL\Tjn<y\1%Kc>ZmV4wu+\pGQRj/YB?FRl=XWTLw/h#$*qibWBFAG=hGj<duA@
1\^cl^ lV6CD$Lj5jMthHL6156KAFTK&@T*B@y?EZ!=pBak/cDTcpG*a+w@GNmHR>i:%FccDH^E9=DQ5%YMaWtJ
K\^w*R nbhWN%p<&BZ8HKMhP\y>cc9=:CI4EMm1MQa&inj/5e&<^/Ck6VheTMG1kMkA:m!J!hc>INYdab&S:B=D
P8iB%C PJ<?q!blpWXNi9C>kXX68J:kA6wXlqLGc<A:hk$Wq^eACWIY#dPQu:M/969Dba=\pN?4N1yq*WcGCE4#
lY#K5+ NPuj6PDTj:*4#1$<YeHD88MQF:*S=^$5k=k>PGY<KjntPhI\=dmPXeZ&%An:Z+Fhl?hd<Lmb8Bb>+H+^
IYXTSJ bN:d5Rh=\w#q/ZI<u8!wcNCbbm@<MNFQ9!+Z$4mRc%nKW!P+1<5!ESjhEwZj1PLShTGE/#wBCpIWR\66
c4!dAl e&&klul1=Thbl1Hhmb&Y^<D9ic:b/qjT$ClJ@hItHKqM=q@h6Rjki1%CR?+&D%Rb#6m^J*JS5%5>JicN
nhI#LI //6ZKdj:iPA%Y^VBJDm^bhewXiPaT9V8V<m&4p/e@W>=ZLybkkq!nW9km>^D/F!Q8Qpq*=SRLGPR6#he
y?wl=m Ym\XIF99cXCNw8ieuH#NFFkt8&1CpBES!iMI1EHAqkQ=KNMNc?=wCdGcbtF1h:+aY<w+&^@CuP%@H%#=
Weq%cF S*iB*!!4SKIIAHRDhNp\n1<54Q*W/NM8ttFXh:&X1Aie?w!a6&>6^&$JCuhw=a$QMHH:JyRLaQ+nVm/%
-A:l%1 000b0ab2fb4001202b3 Page 49 of binaries1.zip
RH911u jT<>:NGpy%P/wHYQ?#dBG+iD5eD>R8/I9?<c!Ktq6MmYaLNY<q4P=RCc>KXLkWpQ$GCPaa@J>&pYIlp/
Bu9ZFY yniFyS4wW:LpSYJC5C&S*i#<1EYb?>G8QZ#uG&6k:FaIdju#y8pPPGF6HRm^wibjuJ>uP:?tneh#>KLh
dLFPS@ aiZM<a:V@H5Mj=uLEdkAGjVt\Rk&@:*wneRi9?Q&/ltqhYj@mRHRCl5<>uk1yPwb@hn4kh:LK&BIn#%M
QS8T:t Ge&DJA9^QY=yRtqA\><Qc>AyTb=q:T!?I/Jl$6qbDyqt9XCkbBw!Tt51tKc88>1hkdwXE:#>JaRQ>#4G
wV+FSw :AGie5dDVBIi!MmDFiny9<lPkcaD1VNjt=<dL/6em@Z@jQDE*59\ZP^iFjb+qNQDZ+WhDP?E/V/C&V8+
EVh\WH qQ5tpi9C^YPMidJVn#6Aaqi+\\m%&\<:IeW6c5?Rq5I%RE#E9lKLh*=^CS1NWS@BZE#%B4TMeyt9i<X6
&ZI8>Z JW@a8eDdP#LNT>5DTNXmkqK<?R%AMyeRR=@=KcnMe5\PVlY^>566\?h*6JXjKm:C&?pwY@FPZ5yQNT$:
QZuXyk 5dGF&t4#YVlbVja\+GtQ5Qb9R1l9RS\BdD+G9!MMSb4lZIFL%Yd<tcSnM@mR:cBQt4%AyY5T=wA1j95^
m&/ZpD cqJY!pHbu@Nn1L$NC<QLmI<I&L$i:4W::y/NPupR/Rpmlbh=61G8yymZt\4*<tBN6yJb\R<8C5Jbju4J
I>mpBD 4IwPPXJ$8$4uIphY8>GaN?PuSNi+w*T>5&NnHpT+$\iKA$Suh6ySbhdIt:*w#c?uQZH8A%&n>&/pDWAB
hA><=E l/tjyHuX^L1<I\:yukdTa%iCnH^Tjem#a?utEAP!:yTZlw6D\%*PXqyRAS5&/pV8QAYd!F$>dPyAeDD@
t$NW?j u\I%ZV$alDuIMk:L5<QTMu?AyNbK^?LFY:bnZV@Ywh?/A:SbN4HkYX1XTVZQ1lK&+V\b1%!^1E>QKN5$
pyCwJd 6q9Nu%^+&4YCkV$ba9d95ca:T>mG>jyc$LiHFIuy6n6Q1V8TXRde#icBkiPm1caTea<i$%BCQXj9a$/=
/GJjl\ I?5=&TDhBR9h:9%b!GhcEc%MZqjkQDD:nuuHVMyuK%pAJBkS9T8P\*GEI1Jn+w^R6c>QMbkFB&%#p@Y!
AAb<P% :*NQK=Q=+<Ti&YACZ/+CM=%Vp+9n:uV^iJH6PNhjHS?jtqB6cJh\Zp^XH&TlG9$QPCuk#YPLQL#eKn^+
^1=*$q >N=Q:j=dN?lCH%HyYdJqW8&EYNSLqJydAipwiBdM#:4&j^>&&*eX6t^m$C1:6BpqT&WVcBC\EEm%+bL^
t8L$!E tIuKZ8I<eSwWLb$WNXu=HRuQMn$WS@5qd!BQy1*t64a&nXPZ>I@@FL!Kliey+?\yXy#*S5jD*G1=$qyu
!GWuaw V=Gywll*uVE1QN<b>pY^5Ti$D+RS*L1@PbWDVB&89&*DANb@KI\G>1P^C$//IqnG*\*qpaGI%\HhYG<J
i$\=FG u$#!qHH=h/jl8nIE#iL=lt4R#AuSmlcCFtAbI&?qaW$ZE4dmALQAR=/#iS<#ul5q8T11NCuytVd/JN\P
yK8%q9 6ST@BQpm@F?nKjunZj9IHeI&NYFFb&4!</QiKZBQ9E+5@HI$%d%\Q/NSB!GlJBeVa@15ha=cSjaXQpW4
B:jHF* EkW<b?Puh9lN51u4Vu9MIe&yI1a$Bhh<YML1%?H6DViaBY<iMK+^8#8qlREh^S%>$q$M%Q*M?IGEMh+F
4E<>Dp CAei44HRFl4uI^Aq8PNMI?Fy8hbA*\K/yTiKAZ6DIin:Ym>%@6aqRZNdD::WQ45BX?w^%1p&F15n%cyi
l+R9Pi XP5<jtbTNTeZ9cJW<bJ#lt^4^\=VK<XEc$$I&/bhH?Yt<+%*+DT!AP>PjGjkNNkb=WLLQB*%c&bmWa1y
/AH$IJ !jJ<P1F/kJp*+9JAuhR8Icau$mwu%#W=Mcjn<qhhi%\bY:mCZ%qqkI=>RAAMEut/B:?Zdpca6kKG*RA#
D>!ttN ccdLqtB9&AFRb?A*5k=kc#e?VJi^5ab=@6tPjem<dC5*=?jPQ8b=dISTZP!cDYEY^=?wQl$TiLKlqm9B
1d$?J^ n*t!NdPDYWY!qhn5KhFS+Z8@?acXPk^bu6h/D?Q8kyD*/^i^YEW=PT/eqhimX=jjT<^BX5nDu@me?lBW
iBLmBK 98+/V^qZ9k+F%SD8nI#+c\W@1HcMh5CNPW&p=FMt88XTV6^^YkWh4K+&ZebN&5VLld@kJ*a*Z>y54Vbk
=!=kLC &6bW/MTSm<@8AFMnq!=X1!>4NhYetqJLT?4bKe<:^Y4qhb=5&$u=>LD4p$d5AJj!Taa6w*S@N6^!^VKR
hDMhh+ %ZNR6i>^y&6KmFju=/4X?TLSFmZTHdjNlpqWLWQEAApEcd>4e&5?EydbT++=WKyXpk5qn>cS?W$E=nRe
X+#&=n tZ1mH+J9Hcd:auPB/LCSkm:+M88/:QZqCXZb^G4n1+\=dnR#tjh&Zi#^w&yi#J<qIiH>^u4<caD1hlFQ
@4\S^l F=yP%HThi8:c#P1&#ZSlA:i5uahY8ZMD<\lW5PNT<ZjnS+%6#I9JJ:#S4PiNClBRMl=BQ/KqGKJymYk@
aiemSG E%<G+yP84=<&d/SlK85<aTDIh1FRGjQqtk=eBtZNXaM<!C%bH1n?B9i#tLPPkWGYPAuGw#VK*SZHS199
%acBbR d//8<BV^pNV:\^*:$Zb#e9:pybQXSh&GaE%&AY=A\FQi%GVLyZyTi+=88a\JemEpGCAuSc^aqRM5\he@
q\HiHY ei*E5AbHw5t=cn=j4V=SVeS>4w#bjE?bX5M&Y8ZEDFq^+BwBVPI/?V*1P5e1=?m#6=4enAX4CQNB1\qa
?YcNYX R#+Wh@XH&Cna1cYT1#cARDA$XYJIq1DuFCdbn8JP/@%+1>E&4>k&\/mJji\Q*\9X$+9bMhIMt5bMEFcK
jiRu\# huE^Z%*e5M%mP#$$AZ!*Q?*+eRA?mY$PYJSG>\P@wMi:X?H$eM9%n&$W1$EY^H5Rt6RyE:hJCW#SN@96
<CDaA+ i<I?\Y%N^qPh/!Ce#k*Lq8Z/?Nt8<pRqmN*#%6GJyX85GqVu/=J6^q!HEKnjyVWbBK!wVa?Z4hE*kWtL
4DHV1R Y:F>H^lN6<TGlB5MNLuSMPKJli#a/GLIilAVAb88uu=Yn5##\cL!9:YH&D*K4t&\WTGa<EnL!X9wYmq<
*%B4E^ P6=w+e<^@MSaV&ZQkHKLXYh%iY\KE\+ICYQIXcMB&4t8#ap+:mKL4y\4bJyuI#GnWS!dRmq?=b#\q+lJ
HnXDn& ZRQDkCEKeHkaywewmLtCpK65w=REH&WLECqh5JKba/86q&K/jGy>k\i&@M6h??mGFX*w#4Nuu4ki9jm1
@u>FKe LdNm$uVE?6!/BECFl^FB=I/88WaE+adn^<#tB+=<MFTR^9kDi?dFa9Z#\AnT6W+CttJiTT6YqDcnGmCM
/6EYq@ *t@eeW/HQ+\LA?Z5b=@eSP$KYJXaZG:JYmG4I8:N8Qa<iP=4kaD4bKI*=ECQFEwq%iFWKHLMWiLbne^<
!E>LCi 9+<H9\Nd6TP:>EwEhjpp:ZyF$tEa9\:iKLjN^BLd%W^NVydHK&W\&B4dacWh5ZkTa:RB9RnD8Y&H6&kt
FNbqAS mGLcWbCGW#E@q!w:YSS1Z1pHueDSS&!bBl8JRqp1!N*w*qubPt%F1F*:C$lqk1tP&Bd\GeNKiH4kLucw
55pY6/ l11<Q&CZC>a<MYYd!6<&hD+Jh9XH&SeE#Mp$<#AEiG#FeYiFiDWKhTd#d^L:mGl<eiFTNn8cF1e\ENPc
tItX@W X<ZFSTaF\56w5jEk>D>dH\@5+hChFKD5%p@6khnKaIq@*dFn4hTk8:%h%&QT>i:m8aFayblFme+W$A+M
#cJ^d+ ^KhBE?iuE*HYI^+8/LdKCS6N!S64bq*Cjiq%=>\teyk1yceGPy8HlCpnA8tI=&FcAc^jIp?&PuFua/Y#
HuL6m: 56w!\RVQPMVph8%^w=/+hPb5hY=hSDp<Dbn8uq^*Zq#+bjdidlJ\HuVqp^d+$tPZdqjlTuJ85q&mbjkL
iwC\pD hu!IDXLQpFd4\nRJS1CmZL+Dykh%GV5PNhE?Rt^=@MP>y*i98hNq+wF=EA4n6F%haS$4yqB#u4>Q9QNG
\8FL4j A1q#i&\!dWXidpQaAy*9B/hHC<^LpuVcYuHaYwXJpEHFqR??8&99t=4Munk:+p&ScqA+eGPXZITu\NPl
P6VW6C Jp!eyq4DL*4?A*8APh8=XPV&ZYjyFtp/BF#I&u9we*AQ##c!Lwc8ZE<<h<k$6L$+HP%6%+N$PjyFIe>p
Tmn\M5 m+Y4<6G6&NT<R9\cD/u\ZZeB/a=K/dH+$@ZkIaK&W>XAbyteZKnYMN:Q5kQ^mT$iiBM#t\ICYeG<@8I^
uceRy4 iHVX@KQ=?eXR6P&Gmq&N^5VW=FNLi#ptIT*B9k*Z#DZ?Kb\nF#*dTy5yH6&ClDGEHc?BeV?y>t1VZaIc
t\%wEH X%t=nk>+itZik\YQXR6A:A:M<YjepRZPnZiueBu#45IjG//akKL^&4tTckX5DZwNKM5ht!Va#RJ4b%KL
@mDiB^ =:pmu#HaPTnM4E5!>>%Bcl8t#cQye*B<bXDDLQ@+W$ciP9FwH9mpTL\Fh+BQ?PK4%Zu81HGd1^X%mKpB
1IpC8l NH<M#&hn^?YYd:q=:kP@yIe\D:9Fkh9*CQ8J5uMZHX5Z6KHcdLqaT!QtDH=G/DS!/CK?k9YDZHqXh14Y
kZi=bL LK&&@Q^TP<8H49HMcTmYnEPchRA\wG4C#\44//1?>AIZ9L@KN1pFN85MXcZe#t&<cIILReHQbL=@Z?PJ
nXp?bI /1Z5mF=$Nc!tDXmT1+m=<RuFqAZ1%blCFnN%kYe=pFMQSHAVW:*TDmw:4mL=&F:P1wp5dL6/IAyenl!u
y?Fh6/ !ENm/A%>%hmYE6j$G&tQRZjktHV:&*aqNk$FQ^%id5hY=bd\S#p@%=cM#X&h%<=614TbEEB&wW4D\FH=
%Zpp+@ 1q<cbSDnjX8B\<NG@cHW#$$HIN<jumuKS:Mn%\WdI:Sd%QTtauJVeQ&kX+^4qeAm1\@TX9FMyS6ihE4F
i^RBSQ %ZeRpdEhZ6#=h@A1dBIPk&=SAX^>1w#y<k6<%<IE&aha:<N$EnGpi+p+\QwXCbNZ*t1%EuZi=XnF61S+
j$/aBa P96X8pHCJhc:\/&%VJ9>F$4=pQ9*9qj!Tn^:?MG$LV!WT68E+d\NIZ$<8:tY\d@h#NDZQ9G%V@DH#J<M
pkQwie @a?bpZ&:>&S&E@#9q@i?Q9\L@:$/>G<#w$@@+4P@<l>?Q:Y\?q#=Q:t1MpPbw*<*6uQ#j@!j9T:#Q:9j
EawmJM aa\>uQtj@96q&ZVQp6q%@#JD@Q+9@pXtH/@@:J>q>9M1SPaA4?jQb+dh1E#tIEjly$P<a9^lZnH?CK<a
%!ceIW j=SZnD@t:ydJ*MP:aj!>9PI*>@GK<eh=^jkV9GL<mH9ZVPap*^ZnV@GK<jj#m4>pieZ+WX+^*uNQq<p<
ERIC+e \KjD?Ah=^jnV9GL<R:^m^Eh+^jmQ8qqpMk@98nquQ5a4^n@CK<cj+SZnH?WXI^>#5<%pQ5:b+8i#9GL<
1I=XZd PX+^jw^ZnQ<E4^n@Tde1te!u8C4+/jF@+j=qQ5*9GQ<bZnH?5:^m@M?+9&a!u?NjMj+JZ9GdJ*uF?QP<
&G@A<Y a9^V9GL<=>%hMyq^*kZnL@CK<W@#m4<<\!9GV@CK<Z@Q9X5t<:N<N+#@?:^m@M@^m9E@#!6GjIFZnQ<F
M!6VMb >%Tb#C@!1VD?m:#m/$8<a9\9<a4^p:^m=JS:i9ASu^:nu?WX9<9^m9H@kFiM@+i<a9!98FqtM4@KYiKu
aqyl4* Z?MX+!@!m9F=ZnH?E1<a@&Y*GyuM4*M%MH/cX@!t<M@e9+#Q:^l@tXiM@$j86=uMX@ldnL@CK<d@a%:^
<d>EcP q^qiMZ/YX+#@Z:lZb#K@\Xhn@B!9GH?XX+!j=^Wnm4^mjMt>C=cA:+L^pqiML@PK4\19GK>+^el4:tp!
5KY>D? th@p$&D<X*uF?Q<q4@nd@+yZnH?PX+!981jPbBd+%QnyP1<a9<k4^6h+^ZnNK<aHducb#BJul@HQ<+4j
-A9\lD 00080ca26cd001202b3 Page 50 of binaries1.zip
L<iwX# lL^mjJ%ZnH?BX+!@+Xalp@p64kLG@$i<a9\@+SX@8Tue9<\!9&Q<m?=@te^9<*<a@#8<au!DX+^9<wwS
u:Sp+t K:^m@Ky:XTdV+15\@u@NK<d@d*nF?H@KK:=i+lWn@:j8:yuMj<!:a@#ZiMZ+@^&9GQ?@=^XnZ8aX+@<Q
9HqmXL :mp!tVcjAn?>\m9Gh<+:Tep+/tH<G1<a@*Z*6JuM@=FQm@Hj+BY@?Tc9GQ<6ZnH?h*uF?Fjh4DKb@^Nu
$!+C*! ljH49GJ<q%j<=VXiMh:\m9GSt*$tE*Q&GL@BK<bdZnH?F1<aej8<?=i=+:=uMy9<n9H@Cc<a@*@tFiQ@
L9/>e5 W%+^@68<+85@e/M#tj<<%hCb%*uF?Dh+^jki4^n@Z@CK5h>^h<%p*8Sh<hQ9<a4^d@GK<j<q4^n@Z@GK
h=mcuR <j?%i@hM=4@l8&Q<j<54j9Qj<a4^@=^ZnQ?@<I4^9??iMyQ=A#+q^4@NK<d@>:#mL@>ZZnH?8:^m@D68
a!VSl/ NukV#kdn@\hiMj:@^m9G@>>=^an@B/<a@@>$5<=p@q@PSP=t@6?<a4!#bln@L*uF?P@^myH9@8*j89Z=
<k!!%> X*@$S?:/l:@*i?:/HtQG?Qi9X%de>h<RV8DjH$%Q8?9*9@Rqh@*nS^>%%^?MnKS&M=N^h@^VDPWh@!!V
P^DatR eZj<<$#G*jE9Mlq*^^>tM8/Pj=uJ8D8?u<t+P@+wp*F**Myp*B*@mnjFHj@c9jpjbj/GX>#SQVZ8?Q@l
P\/^Gm FZj<@@KKP@:@iMWh@!&98PP@+^X*@Qi<+w+@@q9*L@PVQ*L@Mn@>Qje9<+F%@#J*X>!@#Hdk@tX&y6&@
H:wC:p VQ>L:q>t<Kn:q$qG*L@M:9<EC*!IGh^%/H1tu>\i>Qe6:!#*h*d/th9>@4?:jdJ@&*&5*MdH*9jB:d9>
a\m$iM i$*@NjQc6*c?le>/jVt=PhnJ>Q8*V@!Hwj*q@5*qub&j>Aj>R^??h6Dj9*N#i*9::5:&$QLNbCi#@P@\
59S6\A QwQ?<J&X&*kZ9Pthu>\?kJ>Z:k^YV6=^Q?B4MLnND##R#5&l=b&p9*?q9*w:YWqYD9ZVG>@bGR^n/Iyb
6Z^qhb Tj4:<K5Q?whZqyhu6ti*q&iV=e#N@@B%<Pd!el?j!jJQb#>#e*dG>@G=:RdiuF*?<GQ=J4?=#%u*l?*q
<D?8F4 uh9:<FdJaHhq<He*i&SueH5bE=4FHYb<*GRYu<5#:lW#:ndy8CQ>&+QBTuEY9$?Yn?IJ$mHL5$QjQM^b
ZK>/\Y Lh?<8Z%#5N&9*:Q5Ht?HNPlnwyudH*A?@eHKJ=bZMK?XuV=unP@LHQR6j6VhB/m\Hhc*6&>mYZj/S$kA
pP*9QR N^!p&a>jd9h9b4aHN=Pdu%ui8\Y@<H9@:ke@@iCuF=@<+NMjjHC*jyj*&4/Jy:nb=>85*N%:?\Q>%j:6
$E5Eu/ %V:?B!4l@<P+?jLKe4J!GkT@p>JuAC4jZJ/b\Xy5#>\pF/*54tR\=4+hnMWL9u@:?^!#54&<&#@G8??A
Fdi:h$ aGb==9LA@<mMQ#N#iYb&Bk8I:@\BH%nCGT#W:I/@:@#M=RVj:=/@/=@C&L&Q&d&4Q=Q+B!@:@tZ@=8$H
&C1#iN q@&b@kwib?Z9:nPD>?4Q?LlD=9!Q@W?/%%%&4<e*jM*P4k#?cPW@nJ>%D#QnL\@><$P*RR:PKKu9i/Fi
u?G4V# V:=%DI5M9kdB8H#>*h6Jj+l5h\<+HuQnF/a//I<apPntV9%d@?En1S?+m%jQJDe#wP$?eQ!kj<>!EY?A
5&E=i! NX:t:jCZdjD+Dkm%u<<<\I%Gq&@PdN?>?<HFD\y*/?Hhi9%daj&dIi/Gi^#HKm@**X8cqd=^:<8*y%D\
X:!?T% 6/9+YMHDyZTk6N#B$1\p6\<+k8EQiMNpBqK=$p>AbD\?Sk=YHmL:#i:kLp:\:wBJRW+RqM\#/H@=>54!
EZZblT 6q9:&buL5+:9<Z@K\VIp=caVtFq@h8KytcetJpCY<*@*+baeZ!D%Mq:yTI+9EHCt:\@N>EhZeNPhqeFL
W^hmy= A*C+9:\>k&<46@8#A@@y<^@ib+@!n8#8l4\BPGYdmtKF^L8<:S=1&@%lb8mj*>6j*6/GtNj4h%?+G*/4
^^C!hJ Z#</A<dcZmaqIR@DK$+pBqmCIRlM@+TdK<Z\JkmNBRjbV$HER9i^VS1T@Li\GNSi*5/5W*e:N&htd6=5
Q=iWD5 W6yT:nl%e\aLm^86LQMNMABcI4q:$wip?yBa$LFP!h&Bw1TekcAHd:8SJqubD%KAb5hA%Z+1#Z&w9H6I
h/GMP& :iXXp9jP!mC=9S@W\RWVZNubei?!+8R%5*!Q$<E:^YWuS9nNcuJ:8H@:>nKbbMmAdi?>k&Yb9W#&>!>D
wGLM\T @<#8y@=Kbw>BLe=TIWJB+d<Hu:q<j5a@D\pd9u9i9?8jV@\H8jS<+R^t:e>!tS$Sehu^M@&l@t#mQ#T#
p^G%jI jH9qn!CEIM*5h9@&6=hJ4QQ?p!Dn*aH@&XV#8lj=q$qDWI*WZAaXX=a9p/m#!:!n+^h@1Li99:&h*D%h
HVJQM+ 8P9WFCqS>^&SRWY5Nyc**^?Clwd1B^@nQ$Y5=&t5QR$SBLH?\4ewlX#$EC?uPP=8:$JhDmDE\&C!qZ+S
%:Z^TW aq#E?5*8PBLidQb9:5PQ^=w*TcEXy%IH@cM*h/Dn<BS%h+>9Hcu#Yi19*TR9HhplldDPP++KEC4T5j@9
FJ6Za@ HV%up=Zhjka!hRIW@Db5Jcm*i69JK1^b@/DVH#8R%1P<LEMCb&:PJM8D&\el6:mu&acFVQwjZ%q&pni#
@L&mC: ^?cPYPDt&b9+64^H8bqp>9nE4Q<W%@#<*i&b<+=!>#1!?SCXFYn1!^B>49TP9^>mhZQ@wEphiY4tN5$X
=X//Im /dZe@*b@quL*bPJ@QyZjtR<F:*K1Q1qL\WAR@Z:@?>T=?D<En\yk&$ujP$QL&#6*#+BwwTPd:^lti:qP
ln+CXh +eNc:VmGh*wFE!98>GhJ9b5WmtWuH6<C^hIQ9H/::pM*NmGaABMRFu^t!iW:#6lB+EA+ctiw$J$S/N<t
EWNc/c cidimD4&b4J>D\t*W$<6b#mAG6*6D!@*m<6<kAM:V5^Akh%q4:lVuC$Yb^$H$hnlYwS/B$%*d+?8EJ*e
^QS?DB IXAb+Mh9>?<Rl9SBS1Cwqj%W!$iw%a9kybub@p^?>8cK/h?lJ4*D%@FnAF$MPq*&uSK>uNISK#hL1=em
%En!WK n#$l=QLP#D#qF4/=M=P1\MV*5NmZh/n$aEM9P=tpCZS&dtdj!kBT?C8+?\wqCpQAdhVbQnuB>=@&##<=
$&P>p+ p&4V!^>T<*K1X$qS&KcX&<8#yBYqEI@kk/yD@$Zt=8B8yyDeQiRECj4L<bR@<\KppG1V1=lb&i/jl5%*
L4eqLD N5PBCWnHl!kF%E#1R>?<t>V*W$etP+h8*wL5PtPawZTq?AT@tkFkPhAEtttCS1DTEchpm!AXll&B<1aE
4l4=5n 99C6uV/XM#pFLNQj5%I:jdNDnEGSBR*um:N*m@8YX+4J!wumeyG<5H1d8BF!kIpiK1+WmYhA81NPAi>\
e>Z:6X L4QH<H/#ICDkGmCF9&?bhn=#b?j&$V:J8EK4AlF/?DIJBPtDG49y=JGmTM^IqLi>QJm>d!bhiN@H4Yew
8\4aJ> l+jhttPh9$%EijSt89Ck*RSSn8>DVaB/\^!!@BKH:A+P>$qlY5F6@+\#l1pCVe&jV>^!tZ!^A?qhYaFX
Nkp&GQ Q$aIR@%+GZb&/H<+C^D^$=@iLaSPj*/VMMKBLbn6?m!YhVt%kkAXlIbFAkDCPYBVK4unJB@%bkmcj#P<
@pAHjn ?<Lk=nDE1:>#C\1ZHpL@6mQlChCH^tmFwHct8d*VV*d&$=@aV:yT54/$W<Sj8h\aAD%/5*:#NhP9j?5t
V6pPQh ?iP%P5WiN*Bt$&tHjt4YII$#^iJEeiILE:NjtJ$hFEhum:M4:4Eliw/RK!84IHa!8\>!P*D9halRH%Ld
&qMcy! 9&hu6km1a4bap=tBj^Akq#wu8j&QuV\P1Q?Zb&tFTM%q4Nt5k#Y$ump%Ka/WS1KY&V*5iZ+d:@+lD5GL
#FkYX9 b**u4A^Y>5kLe#l$&d>u=>9Ln4nP9QWHB%/chan%pbTKV#yW</VV4mp%ecPd%M5ap=%b8j*>&!5kI=>6
&+ta*6 h65u9dd>wj@1\M#h8=@?AAcS%k\p1Y@ZcVDyle^Am^duwSIVTBPFkRy\6n?+8S<K>aZpY:8k=\Eu9pp>
e&1ky9 k/@D!>6$%S\6V/j?upqJTkLk^WZuMi\Mdk+=y+SLC:!:+%R4:Y\SwGq*b&l:buA#8*Q#6hjM#t9jiw%?
MLcuHj IVHJLG+BkS%&il//>VERj^p!?W^^+yubL#^V@AL<wmIaeMZJJd\+9P$1hPl6$HJuhn?IDQR!YB:8#$KV
CK$lbp :B!BPP:M#8B#ltl?+MPGL=@pk>!t8+lQ1Pphb>wihHK=QQ8lRDy!W1N8+/EAi&j*Rj+G@mnYHXaCinX%
N?uHqH JpA/DQl&pk#&kTQ8?kiewD$+A&kJE5=TT$IBjS>EVtZ/dl@QpjlDV>:h<i?deiy#>4LDwD:8uwWN:h?t
5tB@L1 uuei^?XWHm<Q@deA?uej<<u?^CLEMFRhjQpMX/NQB+%&^!*6S/qF/@W>b??dFENiRZjCqGW+*:jw5Tj>
qbPAMJ +bS8pEPK+E41iMG%AABK?kh8W$kH@a?6yAI%/:^AjQAt&#TdP!Ch\RZc>qD/X#LS^=!SNw+Hm5W9VBT@
kcZL1p AMJBC1qZKaP\mQhk/XjyZGD>KaLbb!:QV5B/P45JSVLLCe#i9I@MSIj5:=d8M&T>Qh^KdwL=l%IC5&PX
ka8Hj# cB^u>=#1Qb!VEKR8+@I\*AiI+VPyay*y>%>c&bq^cyC9tipuk!M$i**udt#DH8+HAYj:@km^LYS1MJnh
m/imLp $<uW^9n?yQ8=:+?qumE51!MlbNH*h&=@G<DbahTWnm>A#PAdd5Mq8\9jQ*HP>TQRiGB+?L:+wLKcLcd&
QN1Xk+ cJqjZIABBC>d@^DS+D6WMR\ujQ/hD\BCh%NEp@V9T>WyBYcbuAAZe&au8Zqw^aupdSjmkJ:G!9LQNIl:
\GGV!V Abjhua@ejK*9pCnipZ4a4i9i<6I&n=IjwF?KnwR@D%XcyB+q1IEjhKhQFLP!Y^#M:u6t+yqp>4+hAnI?
ym/KSb @i\P=i<BY5Pd!%\XpA?Tehi9?@CPb*iT=cj:XN\:!!6Rtj=q=<=ju1tD<yAHcmWZZ$tDLCAq1iS\nW>>
+Y/k91 @BlEeKj9MKh:LiV&>p5jIyjbFNXA+M@/ACZ?:QuLD8@M$8Pd>XP#=/ik^muWdYDa!:N:XuuYV/M<+Iud
Q1AKy\ ^%hT9W4==F@>wh?DI4m:D=:HALV:KKuE!XII<eHJE@E^*IK@JQZB6$bV?TQ!Cd>%N^W@15+Q?lpk$k^k
ZV@MdL @?:6DPl$Z=H&$?qH5AZ8/5TV19MIlS6!%G@md<qNkNVZeAQVy@nl#ipG4w\5P*H4y%LujwC@6q!eu+Dw
A<ec18 @j#EF?bu=&iV+8M4#qLibtRGBt\XwqcetIZQQj5WSZP=CLtn@b:q^&E/>E:!Ewj&+aMhkDGEj:GV\hjb
/#wNA@ t$:b*KS%+?e&\!LdVyp=ndu6HI#6\i#u5ZJeR&iucLm&X=w9RVQRNKY$A\QBcX?lj#PVpk/DH@Td@cL9
\>*FDm wKb#GC/9yK+CCDd\n/TGpJ?$iM=RP6<8yS$X5CNiKwLyJ\D#$H<?9H$Z*5aM\+?H?1@%?:i\mIPhB$AS
I$S<Vc MDW5aL@w*Ck8LLZu6\d%a</HJ=LBB/M5<PMH@Z&*h%d8kwLdL8^JKk%S/nK#<A%*ht<Tji+uGWBd/NFn
=DE5e! #4GtIaLpybGjt*\LCB#k#9IRmZX+L^bE!V4k+nQ>@mqw9^t+A#6WDVS/XA*J!n+5qQQN/WIpK\@mD^MV
VbtcGY EFFe<i\RQMJIEt<b\GaukdSeIF!+T?Gd\i^yDDFl*NhFCB%th=<E:k/yPE#Kn=*bnJ@MDn5T\P5:iQe<
kM:Gck =P+t:ju5R&pwlb+l%u\bGt@qNtR>^VcHbyc@*ceD$y<h9b#K:X:w:d^#J?:/V>:%n/XIhN6FZ@4?KG+P
-Aw=<A 00096632585001202b3 Page 51 of binaries1.zip
T@PThI Ljb6=&n8jVDaN9Sjk&yRGdBcR#elM+<A+ANE*MRD#hDAAB5\BN1u$hy?kRG$\diPlk=<%8u@phm:wM>6
l5nq/L 898k^qE1*b%W!cWThy>dh\49mnPlCRkIm6:8Q$Dq/dT1a\&HR@8$6Bm!d?e%pL?@e5V=:\/kJm5Q8N5c
\BqEjN &n</K!Th??nDpVmW+qKG!QdD<AG!WG&iuC?CFtVAuVVIC>p?#^lt1nK=XD=5lp@S&!Hq*LS=t&XmW<jb
RV!=we Lkmc?CiJNGd*SC>FLn9J:Ge?hNG\>4lje&Zt=k4pL\*p#F^i9n%aJuYBaICFGDnL#GRlw:j^6#V<N9HM
Gp/AW! W<:?+p>H<Wl*#=?@t#:Z\$+&wVHwpj4u##?J=>!lh1ESuTYmP8DW<NA:8#MHGiCCyYFE*&EEc4>Vd4X*
P*uNJ1 Wu5*R/ZlI1cjAd^J@R*/:+!PWXkk4ic&Y&mcDRddquee&XMc*p@pmdYDP=FGCa1$cT//j=5dFjjTM/B#
1kY!Li +KCTM%?HuLPJ^/JL:\EDR*Ie8aBDPG4bCiRA6&bEhidt#iWQLYQ/i:w^+QwB+&wHXktRB5WS*GGbV9#5
jXnZ1A LEpKldy<L@VJ#M\ie1ecjh#SeycmDiDJY*&j%GR+/:LVW\=VPpVI*amV?Q+C6\Kwd&eJKGpAV>%q6KW@
5mZN%< R!>>bh5FyaF\X$/pZ8KPR&/PdA>eu4u>diemuJ@^J/D4J!ce<?jQjECw/9DMJ^&M9W#Bh!IH/n+DepIe
il^^RT 9>%u=HdQ!8L:>6B@8Z9#?Qd!l+6JI6DiuTCV$!up8nu\q6TQ:#k*P@\YQWCI+6&BW=@$:YC>?5u5!TKX
jRjYtk $G!S!?S<RLi5k=Z:m!+$!j@9MM#6aM^6+y*h&@hDF9pC/K%m/1/V&D5*V?+\iL1*F%BMyT+yb1k8njMn
=8dqPR d=/AQ:5N^WhQMu$9e5j6@5:6A*AH:?BPYiiJ8nmca:Cmw?DMaaj$\jXQ\+MA@a:j*jbB$S*GlGjIJMuk
I>W:eC C1QQ6FI#DuX?GG&ieYF8kkywX+dH/VN8?!pCkeS\+&HY*?/:!Iq##RE$uVNA+6/?@hK*1b=*@T!>^uRD
p>Wm9l A9Lw+&Mt*eMAEH*T$jD8V@#htSP?m&9Dkn:#JHe?!B9k9n%h/pk<>N@5b<S>$H@I8QAnJZBuyikeKywZ
CI<M$> IpR+<N5nL>S*ZC#NlTwBaLbDc5WDIN?6Y@$?w^/#^au=mbp9VQSuhtiQ\u18PC&<*IhwLYiyq8<ii9#\
/H%<i9 ++@j:jeJpdlD6EMCD8BdW+BtX%Ipmy9hjj#V?HDIcDB#plTeu\Yewlk88!hM?95BX4eHAF+*X*:T@>S6
R/eIi! ekSY<>6PcR&+p:hC9&KFeVum#!I=$^F!H&:ZQ:@@48Q#*d5\b#QH/BCCiFA<*KB:AAcH/6EFIEG>9VAJ
^j1hF% KDhaHy%%eZ<R+!WHLQhCJ4nX^&eka/AHSGVHIhMb^t&h=EKPqy6\/&<*h\:Q?Q&Bk!HJ:NDEW+PJ@j:=
@b!>>j y@aAFY/!H%abePdBD!Pqq@h&ttdwZaCEh*iT&@h>i!YFyH6EHQy>119QGSw<wG#IG1\CF!#FCDPEL:QL
E&uAQG !!<\F9wC/RjJk^Y<t>\<A8H:J^CXJ9ZmjdeBMIwk*<VwmYj\LbpaBwA9Vu\lKV:Ilb?qPP@M:^Rj#@\+
<EGRJC p@u^+!:KDdmV@YB9k:i@k@jp&%LyRt#*He4<PMqp<D:i#J+ayuV5E^aZW&@m/QLN8$@?>KeRSBh>J+/l
9Ml:yD e6=HSZQ:+bTR1@VIX^\We&mMRV\w$=tbIhAIm#dtkA\AAZ=%p/wX!8D&>^*\b*TjXL!<#P@\5YiAZ4J:
PaCLQC WY>+l>Bp!*Bw8deHNQNSdp@MyE+EDd*d@yubGVBAe>u6EG/9>F@CE#&IKR^iIm^^t9Pbte5VINXV=^$&
>h@YIm Q9K$u^yEA6NQyJV$$@$JKI&u##<D1*l#=h8*!RaM%:46y%q@/QXh/LnhuTN</Jub8=<?>QnP?eQR8hTI
<1:FeD $J:dy&>!?\pa=8/*\49%m+@@?Cib#MGj@PV^D\4dIN?>DFqCwV*=/b<<DwPeuQ>kakV$t=lQ@Wn!RuHt
Y?jtcw $@*M$N*qyH>\iTbDKl:+kKRn*muPbp?MVn#DkSD/bCZ#RbIb?uFt=?d8#BFwGBJ8*8qQ@P%p8yq$e@98
yH@?ka B^>e@PCuh:tHM:l>%P*A<@Qd$KAHZT!F<hD:aRhhDGnFGXwPl1kN#tj<\jplL6Gub:nh!<Au9WCGill?
Tem*yX hJb6lyG$FM8u?\aW\e?=mA^h\J&Xd=QK5!tTVGHI#4j:XL1*B>>*W5LkNSV5ISiT\bQ64n!EJ%^^TJI+
cd5nce F!5EFAVCQPYRKDVC?S*@>QtWkp:EuI#hyja<D<WB>ZBQj=qlY8hp?4ND@?tkj!?Wu+EYyVLG89+$e@ku
Qc1eyq YBTG9aE?n*K:+IPj@Bn4@iMQM96@56$*eQQk:YX?9J$=>PV^CXLytYSm>\8uJ4+A:?\L#^TjkW?hTquB
:G8DMY PSJ\KQdjyX:4*:<#P#y/jnR:RTq#khL?+=T!R#iBS5D?&@&bi&hyhIpc8T8C%#>+$?*>+9Q8>k/J6JiS
+JluR% MaCm8u*t&+^<49d94KVPBq:1+8+\e=R!MPj=jW?h>@9uQ=+C#^ujAS>1!>tdjWbB<Qyq/pT8=5%phn@S
iqVlWi \eA@VeP#F<ttwFFnWml9L/hl6<R@/y\!mPlq^q1<FWhE&P>Wacc1dch@?>m*IZF\$4iBK8E<H1K!ycnB
G<mDu* %G*9wiHW@\N>GAEF!L#QdalAZ*K9*!jJlqhe?Mh6X5*PDL*X:^@BMnk9@jLEV5dy1S@*M!ei>:i*@i&/
\=W/X+ n+@/h9&DH+NCS*:5JAYjM=AdCNqFN*V@n>&49MjQn=:AB&p+A>yNjGHY$jAuTYd+^=t:/hb=bl>Ij@18
C4n^M# m<n<@>u/5!c=5nW:EHPQiRImMIRDtel=#k#pHiLEbeGhLCI8^!1%TCYdIw/*nH8*TZ=pVYP@!GS<Tw<H
M8*bq/ uu%y=miLS9\AQh\w6ZYETaTD#a5m1cym*S4IY%Y5J49=$1>%#YVGayqJLWymFRA@i?>#ZN>c*#+BFE&J
I+wG+6 MaGa+N@==9Y6XeZm>HA\!8B4WS5Bh^S:$5Q49mwkXTHRm9u8Bm+Ma:=+?jLw@tJ^9@cwktnB6Lbh^Say
JQy8Zl Xn*yJkcc8nE\Rq5mbT$imQ!ph^!!:^p$i+bB$tDJ#Kyu@6NKnij!X!99X=$bT5&:HFkub^Nd/%IQk^8J
:<pwy1 e!c98C&ZDN>e4:mHm6XaY@R&Z+P@XyLit%8X=XKKjm!t!ZKd5XSBD5a?8EHi\^@6Gt^!8SdM<4c?qWqP
eJN/ZR la6H4LM5B/J=@^@jVL5CCXS+6Ea\SWN#dKtqyDq1y85TLj%#?R8cKltbG>+F*unBN^+hul!Pl5%w:=S8
/EkZp> ?FD5N*wy::NS/^+<>6/6I<NcLEcD:PBk6H</pbhCT6SRHjG#^dmF!hMM<ShN^Cy^KjF/Tce:pl?%p@aW
6NVW*G VWe#:$pX5QYWpjGdmw5G#Kb9THa4uMKt^GlYRquM@wdpjI%BDI<MnnA@Fu<amtwN#k&8qJI8:ZEpw*D%
kQAe&% b^SAlA/q1TSqYT$95?M&j>>L!aYMHH>JYn*DcZVI6N!p?ZQj1&K#ZZuh@F8ypKTLpAmy+Ip5hcGje8GA
8k<p&y KDnG%<KGn#+>d*/J1Ve9NaV*j/tXTl$i=^lSSwl>L*4L=#*j=8%$NW!j$\E>:dV#uNc>nDY58yHeL@c&
<nGbb$ DiwTjk8nNRtVy$i69HG9=5k?H6%9n#+w^Tt+$S&K5jdF!dAw\Kk5*PiHaW#<qF6+kyMT:IZ#PTT#q<A\
GnWm9B iZuShC<<@/JBN5PcL&I1ndtK6hwVED>q$KYm4yGZ65&p%MtY?Y1h%^Jy>1*H&5^k+a@>c6Y/#@H<+n6c
H6d\FY P61Ja=S<#Kqt/SVTbSVA5BHu!C@TZR\W$PJRpEd=YJmNTy\eN@tY6wXmlL:H9Q1u\X=N8Vj!Ie1NGn6A
8nZ++E B5tR4&jh6JyhPu!^#Ri%QGjTy5?d?W<nA#WGiC:9@:Mq1nB=QY@JF&jMCQt4%#6cHB$lq+p>95LTy#\:
/KDpMG Q/L^Y9G#lZVPWa4K?1nZt:P\EA9D#%:Wm/MZiJ5%&LJwS4$HeeV=<PnY/imI6uuEddcPKyj#8+4ZC<Zk
kZ1QmC ID5bTSWn&e/mp=bk&ZI?ml=@W>5>dqW9MWu\m@96a9&S<hJl6QC*8JkD$qH%uZndNdm+qDkSwhjGNt^k
k+$IVw :AXIVSc!VYRLQMi6d<\dFuYIJMWjeG9@Z*Kamd<Wb:B@^c9h?F4ybM$BcPR+dedk5nJyH!ibDQM\nmHq
/Q?8k= L^<niqaASNm$L^en9Gh5%V!:Tydcd\BVKLdmqPAa?/Fc&4qd1R:CV?J4>RQ$m&&#Y&qLmhBy?:?<wS5e
LJd>XP iW*YK9ldqQ\n6Y?%:?1W!wD!pQVY>G:I@:+waYZ>%5\>pF*!B%Lad*l5BYI6Jd=+1mtpKWB%Mlw>GI&G
uuRn#R y?bWLLFd!#?=1wmitLj#V\m^4CTCnRbTIbSc5lelBW4?LjFT*D<$<VBN1C>DLk&AL/ei1EE^JJwAQ%>y
W<R&CT WD<8:i%mNB!Q^pZRZn#18LI%4CA#KTZ9TF%mcktSPmiS^^KLijW=uVXm:<by^qnutLuY@+4RNQ^XZ5m&
@XM1qV 88Xa@VQCMRhmc!N=!ZI:dKYaCDd=D?9SbZ+HWjJ1Qy1uqWTY5<1B+X=KX5Pjiba$<6/dCJQw^eX!<<l*
*Q+>1S NjkIWydM?*CcVd^Gl9+m@qP6TkmyR&>4kV<P#HW4m!m9bt^8#:p5l9&my*GqVH#cXm8Muc9HEhQi6:GI
hR!i1A 5KjajI<tL@kE%QQHFhCpGJ8<CWh4kJ$F?wX%yPT#CtMa5jA6SB#yc+pN+%=ZAS45&5@QyWyCt9Z855Z1
@TTFua Th8*B9AG8mXmbn8/c%C8F1k5&b5!t&H*p#Zb5q:tY/k1DTB^nZqVDQGNItXa=895H@PQ5Yu5Tt:L^q:u
iZJalK T\bkAY5V<c9hX5#pbqXy&EWDC&4D5$1hDECWTwJ1yhFTLLAm9!:#G@m\n15NQA!KmPpBycbjZM$!>SQh
i<5B4B XHCuD1jQl%JualR&d=:>j4V/#4Di4??u8u4PZdeNWkQCehkI^cm8>&I8N1!b%q=e\P?cXcq9u6XT!9W<
8=%^u/ TlZjTLtKN4l*Dd+y9SPGV9J$6$j4&dE<J&#lGw!K%!dT1:uQ1npnyVmTXB#*n!TBGe#m^Cu9c?cEAeWu
dQ8u>Y VX88mu9BiPJld:l+Ti#%?hp$B#k=ZAaaF\mp?b6c<9AjIuc\?Ylp8ewKWlPGQk4yXu\QQX^4?9K!?cY=
p>@Qeu T*<Rp&AaCkTT5&uNI!?w8F/Yu#V&MG%lui*KFGi4KK@AB8wb1ZtqR5<=#Z^HZDk\SFyAeW$bG/enTR//
YEQ>&< ^46=YkjkA$b:ueXLVu!kdwR+WGu!V$**@Glqc:CuFSNt&PATlK4jZQ@HWp$D8^YA+XLuK!WaA1Eqled&
eR<W9j m>+LAHuyj15\uiSd?eJdDb6N5=#9X?1CJutp^Ni>=:$=yq4BHQEh>%@W+Tl=IB#RTB169+tEDybHpY?#
ByjX%W 5RB+J5n@dWa8wIPa9QimnZeTmNNhZ1nq\9Vm#L5y6wcZ@K1DK\EAJZ=ii9W>#D&BQ=KYZl=:k*J4Yc<?
^4*ut\ Gtdb&#XtnVZCLtc+#H6iE6lV>\%5%>1?l#PM?TNd!$<pwkW4#V>lD\Q^aG!X*NNYH6=&dqtllNVa9ael
%@</pX /LP$uLQ^tdRa%iQIupLHuGkQc<:VAIbl8DTItAm=4E?IlpDy5ytMLE*h&$!?<E\&iuWRA%T8Y>Cc@u?*
A6#\I* =PBwFhWcl@^Tw9Vq1bt9^ZuN$pQ5F#%h4\a+yY%86A^>X>qQ@qyicR?nckDFQF>/D=cj1F^1!aXT=FX6
qtdRPl IecyPVGPhj914!Zq*m&PYCjF=9jF1ly6YZbK*N^&<aLuDtju#jR>nMR=M?iiRmHcBlN<I9!\EmppeRB<
-A:?FY 0007e450dee001202b3 Page 52 of binaries1.zip
=i#Xu$ k/4i%CFjk:&!6:B/4R*Zq5q\a+ile/YYY=hMJ/>cqKJt&=#pJ!NmeX8::&%KW*nht&j!qH=cIVNK+I\t
XTVDFn #S8B^=%HuXdbAFAVYwe^a!J5%?a*pWy#uaJchWKkI:JFj4?DH<FH^<!/VH#bA\qe<q$CWeZ/$tEn*Q?N
I*Fc!k h4/X+mYT*4c?X9+y9Ajnpa$Z#YZ<T6$NmDV<5W+G%e^T11C^FuMl<akbN5XF=a*Ek>qH*NC1w<cEcDVB
R9Tl?h d=>9bKhaLJS6/9lbt^wAQ>GD4/NARcb>K*R4<$5ZeTE^Qb6iAQE=^cK\Ba!RY!w^YX8@mZIDHW5X<cBn
QIVePn M^8ImbQG61p*5cwVw?WjaHRm=9Kc@NCKT@CV>$F<%RGkWSkR*G&W=/QGj8m5Il$et9ETjWHdwB%GNb4L
=VhI?% R%YcqP&A<c5WQm*^<6u<MS5:8lbT&5&^NyL&C8/LIe\PeT>c1Ld=6\uF$H:PaPNAQKD8CiF^pk=S/\WM
<#Cq+A inkB:@<nSRP%<<*I$=9+R4!myC6JE8q6!58@EJ>/ke/kh^SSYMyDJ!>!G&5y!8q4En@tK\!&P$j\^EZ9
NmB/D+ iiwq&A<!$@Wq#WqDQ5T/?+Z96jIBX\KA5n6c#<dH#hPT<=biGaPQjZjSu1<SF6>Mq?YBW%k:<T%\M>@W
BA>@ND l:pJX/AYnNGMhIqG:LY/iLqa6QZcI@naQVGh\VijK>+IC*L*%EqP6mj6cDAe=!jbTheTb>p+M!PL\j=%
&Jy!8= Gw/ZQKlWJPy<y&Lld5!5Cu#XMTRSX&Q#mBiW\=XwFamCPNtVKDt\/t8E8w^=cML5F9mkjJq%+M%^*T$I
Kk^=mt &XCI5\%#>kbXJc$dn+YpRQt@wR6jaaKZ@Q>CP\Ht1ykcA!<bDk/*!XpX#n8T8:X^V+ek?wbm61YW1lIN
wq+CMX ?<@468q=n%\bJVVCCwmEddNbFZT/*tE>RkG1u/Hp>6#XkbeTWkl6Qk@mPdV=q^:yF!H*Mq=\WVnNy\R*
LbBE?A MXSm^pwpVTtPX>iQ&uwXp<k&DF!JJSYPw<SMNa1kw@9T!+i/q^*W=yHSZZuPkGqd%%d4Q/m\NlQZPMG&
>it6I= bhQtR#GiNR6:!&pQltbPZK&h@^Sdu@^NVC>N/k4GJ1IXWAALhu&:Fjj8a\JXi8\Q$G=kH6#/XW!R&*^X
=HKP*n q$R>5h*6lL8XFPm%$+MXY#NRV$Md/4SP+yQl?:?E%Bdu1$Fd/m@EG\L#%eL*XwH:$d//yI9N=>KQ9\kT
8H$WQN DW8P!cRK/cP1:MiFl4#hIG@#k9E\^XPyR4bicKCW%%i5%^V!R+J4DVT/NM>d!APlal1XG1ubqDhcwA69
9hIiT$ =Iqc9\TwEHeM=hI6@R1Bkww9Y=emReJhW/?>FIQX$d>qQGcidtby1JhHa11Z^\9=8#w#jk59B6w+1T@Z
HwQYqu 6TAJ%S/\LQ5uB!jHJ%K$^Y!b:+>#BaIk^=Vmca*hTuQtKG*S@6!t1Rmk:m\C4$5\I&1NBcX*dJpXyIe@
hZtWea 8D6PmD$$kymt8R:H*8b4ceDeP&:b^*Z*C%JP*S94RJN#P9tPtpmu@mkuj^Ni5%bFayy*?H4*n8VjjQVK
%Yt\pC S&LQw#eQV>4=85VM1#H$Tk$:4!!$c6H*\i@Zu!?R*$J9i=F1q1Qu/MEB:^Wjku@%c?BKH1tZmuX*Kk:w
c/PNW* thnc*4=aQBYy#\NAu4DjNYJCya6#QGh1AhF6+4LcC+V8qqJ/QK1q1>nIVRqMnD#T1MLcw?Z>NjE!lM6?
RWW!cD Z4>Xc*L#a+>t@E\Lpl?kAS#bk^bLlJPaZbQ1dbmtnB!qwJ45P>?/A\SM%8VmhyLayN9Lq?c/>MF=AndL
=\n1Y9 Z%c68V$tVny!qGLVnq^eS!MqcyR^wLy5&jJZi>X%Qj61FBCQ9*nZnHY*a/@Yel^YAkcD*ady@:h/aijn
6RCJ=y !yQ+wpp#bD:=ei*Th@NpPNALuV=nXWCu/+yCGqN!Z#9jdWy>&Xq8N19J&BIuX:C/l5>XQatuK$h5LH+j
VV<PIF S\W+hWTIqic:J:/Qncd+uG9Q*$B\JG=Rq?k^kS:pq#c5TL:CkWXh:&Ntn<tG9ITL+@9HS<%m=c9Fjat/
yF^i1d NcBc1E\AY*DjSGAAJcjbdJTJtSdb@SMt5#HS//qnE><AaI*uybGutn+B8DD1F#i9a@+Yke$84SAp1ZGb
%HhWIi k/aLL@w>Hb4qi1jJYR!C1TIjPlQJd++WGV>Pd/q6BP8TuH/G\kSLdkI#?@>+dc:@hPCHWE1wqVB$^Fhc
ZT8YM: tkdB<RID?NWZX+8CjpAjLP/*&/%*$G%Lkt\R?ZcjL>nYQWPpqE+e\SHVRG*m4>jAKKiEJpb4=>e^dpIF
+Nhjtb YG5c%j1qqEVV#H>jQpadd:mT6!8A@JY+/y\ByTT%=A+NN$Nh<mnWB+>1+wEN$dhmu4^b:H$qZ9dX+64S
@lk9D8 Au<b/l9=*<VA%p8#lmZCD!V96cNq98BChX@CyL\?b!bXn4/^T*hNdC8qyy=AP^9^CuM6nXPTa\//MN@!
aMY*qC Ywtwk^E&mYLCL5&h%DtLc?PwwdSn:i$pq$tZF9Q:*Smcd&T$Cp&d$?MckSHQEHC:Xy4I@6Pk5D8YDGKQ
Bu@^h! 9Sjhl8%=d*HS^DYu#5Z8dSq%e!N8JP?!ZptN4Dd$EkZ%u<T$6PP%D^j9R8>Rm@jknFHieL$GICR8i9&F
J/5uZy >QMd$yZJA$<HdZwj5G8VKy\#EuSmPNc5QR<*!\BadYl=ja/@JjRYB!e\$nHYW+?A%wwYX#\?Z*!FdZm:
5uXRpB YD%/<hX^A$9BVuZtkWL==qIc/^F8e$:M!a65R#^Mi4PMdSuec/\aheI=>/Z9\6jVZcmKV&^p6bEKqhZ?
c4j+V+ tMCT=E#E8m8aL!i&!*d4ey8tYq:ZiXw#jmjLZ^&dnJPN:M^&%=ne/QAhAatCu@X@jHMPSBAcXV!W:kLt
iWH\Ai 1u94L^dAC?G&wFimYJBkJtqM*A!RVMc!\HKqy9Fi\A*qZXKN$m#WyM%<5>G/E5%a#Tc<\8@F!ZARX*hQ
KJ=S8u ltSCdFPqGFt64:\aq*KIquMNkEH!!DL?iiBw@W!My$eB<yi</lBVY1+?$W^nDcw>uM6>ucQ1q=J^Me\Z
^SIlRY R^n*WS@%=eG^@Kp$Q6dS$/Ip4G^hZ1EVp$h/&@JpI#8RPDp!HE4mbLHD!jJ<RQ=q#8nA+*NYhqjHh@J1
tJ^e5e #*ubt8!AYDyYK=l6&M+B8AI\Chy4*H#k^l*D=C>N495&&/EV=J>y$nt/9i4!EKKeFEj>Z%+Cq\@$ldSB
G$8^y8 bi<FuIP#9VqP+DB@KE6>Ma?c?S%CY*FP4qXCPc@EY*M%Vp\*Y8*<Y1P>Gqh1eD6h>K!\&%=GIpe&/#pL
QC>A^K T4S=EyPZ*Njk5WB$*n&TZ9L^N#DLyc=^CFiR\Ikwjy*#MFmPt#%=^8=e\R4^S9LcqQt$#5Zj&kWGYtK\
y5984S YC@4@1P/#h/YYq+KcB/8S&i=>GRCAp=X+tt&<?W?5y8a$a/%APthacTFh9^yk<@/NF#hlkNNDp\RJtmM
VN?cID njJGe%RiiY88/V=cB+^ne+iZPXLEKG1IS!PMknY?B9b<^8l%Fl%$nQ^aXV!k5*45IF$?yy$68t#V@=WX
CEXMhY \J\p4<X!:/yd\\6j^>ZTii&4WeJ9<%Y^<8K\weJd5h!VP6MVJaA*&t4ai:Pw9Mh=Cy6mdin1=uE#V?tN
FyabNS #S9An^I!^e<?JZCF>qBuXLM@4:ESTcpZn%EFwQ5hZD*QR816>S99RXyibq=#*L#!w5FN<:biL6bia8*1
*PKa$d /^W^I1=CD!Xta6bkyH/<FB6cwtVHIe$E^jGYJ$9##ppP\MYa>Wp1WCTnX>@k5NNl^Q?J+1+!u1y/ij16
@QScCl WnJW9K#njXAcn^CuMP=L>&>9iF/my+NcFne9<!?\^iP>l&:>hBPwkG5tTBwV&&+uyh51dqj/V?B$8+Bl
/6*N:G mHhJWi#F:j1aYK=lPAJIc:uCX*ij!WtM^@6nhdR\@/q<hQ=?#TM#LYDCtp&id%m#E<P\?d!iQ&$iA/S\
?+RHVE Zj#8ecXu+?YmJ?*jP6Akd5Fu^PTlh/&WX+hH5ipYbDtZ=1TWZ1$EKAK*@y*VkVSmmTW5$:RVD=q8%Z>u
ek9c*^ Kua/@p1K@e&<^6tANM:%>aYW<^LXyNBClJRHjp>i1MVW<ICV*JM&&##JDZpeGn6AdLScncAli\1Mq8qG
1TcXM! 9y@1NdFEqKmdWei#SbM&L/t56IbNkL#p1G&:m#6iN9cpCXtcV>KG>C1>=iK>n?jX#HaGlKPF^#CYQC9>
WZuPN: *^qWC4wB8NlQ/@yFmu%N5$iWmX+kT&9EPLtHL^$H@6bY<DKyNHZhKL@HdFp/4y@G=6bnNq:J9^ae5\Bi
&EuBnY @L!4?#i^E+In4WtkjCy=dWM5<JSV#b%WqSR/6*cYEK?hF*1BBb/GN6+Pm4cL^A*FlLcL%bbn*BSnT9Yy
wmqyJN :6t/juDTu6i>4>8/J!FVGnc$&PD6YCe\1G:!VRjuiXw=%B41Pw%Yh:j$\n9HyM8PW8*i&k$Qq=N@p:8G
$S+p5A I\p6CHECF*Z>Jl$cRXj+ZYW+HLHy/u!N#4RKp$Y:l&=\*MZdJ6<ktBMj=lQtR/6EBiy&WdMCpmNkJ:l!
#iHn:d 4il$tG@>/p+5wqwS!GCp89Y!cb<lAm=SdJi4H1QA*5H#*u%=ZT^l8p:HG8J%YQD!>#eM/m@mVy@mPE1K
hAYC<k @WcM<pIVY1!p*NF=!V#%d9IXAL9RXK9!J6#8%bkET:J4dh9:mA<AD5C/Xk&?^9iFLipJnJD!iu:AmBtX
XCtpp> c\C<Qt+/qXSZT:dLZ!:8%:X@JE%&#/@SdPI&FmZQ*njlB@KTLY1W:GN5tNNNeBCHBNn1BDn@ES48c^I1
Y5GP*\ kZIt:E91M:jldcw^B%ju\<mDYL+b>*mP*e5!*:Pc=QAp?QF%bC#CFh#ae=c<4V$d91mkS:ZtC+&#8Dit
YE5Y6S *<bu+wZ^MX=NnDNS^pa+mj\dVj<j9\P#+h?M&h:Lq<pHR=wt!@Nd+5aa<bR6\@PFSHT8ECj!4+IQq6XV
Ad4N># *ebek\<?4d:SwlCpNJIc<W:>Yn:=ctDeqWJp91:=dkQJV=JTE#hkd5Q1e+HX6j18BK!cIDIn*ZXQHqtC
&jjKq< qA@TcVM5tWm6KwC=&ty:*t$QRwN:#Z46:?Bey/**JMX^SJKZ<t%yau/nSJtNRkXydkG*c#AiQJacJyE5
ijD>A$ bGMia$tL6!46?eldNCNa5ILbBbNlQaN>IQc:1&&!PPXQEV@FNaAb\plbKpjd=K6Ic&8<m/6%CT:bdc%Y
5/^C/1 dk:59Y?yq@t4RI56hq9hikaMw8jEtp6VjQV?n@8+VN\K9u==LJZ#e++b^SHtcJuKyhu^yL&\Wm/<kQh+
M9A4/5 :MwL++^+^bcbA*hIb=M/i8+4VAwLP>EI8%FmN%4I1+/J!kKI+nqd8XWp9Ldc\8$n@ESdm^w4kpj/?T$t
t^pPc9 AE%9Yc=luX^%E#m>ZAdpT<twQ5ZAI#E6MSE=XmVu$66>QaY%PQ@*<LB%#\^#n%p9l<Gep:yEWn@Sm@qa
J/M<yZ pRITRn>NF/6ElI8*beyAW?G8EqNHQb^lhbKtW6j%Bae:EmIE5M6B&uMcjtmp5X5JZNK6d^KIC>6ASP+5
H+$l^l Ie^NY4eB/G=+uaQG\CmPWRM$tB*mM:Cc>b??!X5bWC\59kK+qADqZ9tM!=6!F/N%kG&pE9Y/q:/%\GR9
bBhS?Y 4@q&#^&8nJ\a+Laa+Kti!%teM^J4j6R\mjuCul:#udijy!5B&QeAjh+<>KTq6WW5enypKe>#<nl4m<1$
@Aj846 mLFT!Wl/+?$@+&KDI$e>HECF%XdTLqV:*jBLnCk%\VT$W?t?^Z:4GHFJV%Dj#86^ChMSt5D4GDbqP>u^
hwZdi= EFmea>=64@Awa&NMmPIwYKtC*C$L5>uE%1C+S*u6X&A5<\cBi4^%dC1>p$#nLG#h^JJ/i8=$G!R9@^>L
jp*6p% G=nZHdTe5Sdn=uIPm+$qNp1Gp$JFjpTkn4apbkJkc@Q?jKjTjGD1^j*&1L?R=Ab+\t%TRltWAHn^pXLV
-ANN<@ 00050f06c76001202b3 Page 53 of binaries1.zip
6udhjA wQIqkmLQwd^+*G$j^iZEBTiFDSQ$\aX>AeDqC^&9>Bh#A5*V\ATISb$>Q^Lu*iI?Y#\G*b5ElQ=<EZy4
*TK8mc C@G9pPy/qpq#LT<^&eLIkEQF/JSKnDX@P>*Q9=be>nZ>!+8LQZwldh6cl5q^A:+yy*tLMP:<W&\pM?aW
Zmt\@i @lFQR*QeSkBaenJE/X*kN1T%T@iBPFi1>nS!QqB/E:ln\BXJKh%$hTPlRc:a9+#++Fnyn@THJZ5KVF^*
dl?*lS 9A#j%u&NZ1MD9pekmkHYY6JF>W#5FjBR?VL\:$#@YRRW5X/$S?6dKCjqBZ+d1R!&<1Z+Ja@<ejjqFQ9+
RWPK&% G6BXuu85p!<%P4=Sk*<6<H=na9u4^IuXFAZ&uD?@\ES/Yc+HjwB%%CXX1HZ+ZKKd9KYNG<9HDyLk%aMP
LidXEi !AcRLnh\lY#c5K#iTkMXdRq+?XdC5RCKu$4IYeXJk=T&n$K>ey\hL!XM4ptIptdCdXn&&XJ=ZM6\hKcw
:KMYNB a/=R%tC>WpI$<A#&DRuAQFAK^A1Q4+bhiN@*tZ=5SFeKEw!1GKei\Pmpj+!K=M1>uDV!1%kWLQI@qiWK
c#y*&m EPGabc#NkRWZEK4FGGj!n?R&KM+^uJS?jwdQNP+@*ee@85SS!+9:%++Y6d#/:##uQJ>tA@nRF9KF=8P#
nG>\mV jP4<je!LFWj?R6=KuK8WcDnARBmnq<KEmSR$SeTl@eRp*NAS8:1NBV>SCYjd4ieTe598KhnlHw@qb+$%
denh^A H!wT1Yb:je^iiy4H&H@eubEVIGY\dyYNp+*G>cju#XTK@S!Vpc?dcb99AIV\1H/WLSdmeAhb:S*le%J*
iBadLE %Gm+a%yMHk@bjMQyLBeyQNnjqBh<bBul\WbtFXWkF9*<PP@t^^\<8RyEM?m^ViIW/8cT=kd1^5SF=TWD
hE=<$V iT^+iyqHn>HR#a:TA69aEB@4ch5Mw*FP@kEkpm?P!$H+d@>*&:lZTnS<?hZ^$j&n4&1Jl@hKSCGGR!Dy
A=a$%9 =e55yc<+!<>e<EiBL!&G@C<YYI!6BKhkHktlFR=<k^/h<9/JNaS$&$inEjb4TJP%j?Xh</Dn^#XYJ=K*
M*5P6Z t6@HyJJaBPqhh%%c5S&^=d6i/h!MA%SE\ZI*tK+S\B65!^<D@X$/Mh5!Z=?CE8Q4h41JI^V^NJV=NRbh
14u4Q^ N@BI<=\dni>^/4Dq^>5JdC\Q@yB@uPYy<cWNw*%H16u@9TW^JRwa#k/%T?<IVN:uqb#QHVFukJww^\4>
nuMd56 VW9@VRJCTtu?*MiY>^^n$njk:IcZN5hZ*I1<QbcuJL/dG9e\m?SXkR9t:BQ%R>9?4\FNW+Kie5HYhMXj
<RNp<h aKk5mS/tLN6+C$6bGlK9B@KJlNbGZw+9jFp1VkE#b#JpKQyTKiA+#ui+p1yK*!+&c!>b@hRW?PAd$tdp
JapjAD 6Te@Kwa!<q=qY/<8/4wEA\/udLlIB\QW&qN<!qyBS%\HX9FJC?cB68\yM&amdX8/NSKh?PqNL?qN:Dnq
S#<Y9L IbGWqI!ZVZ+n4>*W8dET>TA!Qwn=S%&6Q##t!XLH#GX=@y?AJDnJp?ypja!yA@F=wAdm?/ulTa4u&NFK
i8WJGY lwcu:y6M*am:PQqqk>$aMGKd=QwV^\JPWmJAbM6ac*H#pX/5YuRq85lD#=dGLFdSRLn@/W6h<89LiJ5<
aA9*1: c9XZL^hjQcyBiRk#+Kc\JGdamuH6hD#%:ZV*DG8FijWNIG/Kc++k^R&Bq<RkFmKFY+n*yJEuq>Me<!<>
lG41#l Zm!1^@Jw!peVR$pKuc@49miC5RkiF8dd&yBLWH#c#6h$>nHHyKZldVCaXeIt$JkwKyHu>6By#=G%piGp
5Zn$F< p=/?jV+><%N=$tlA:FuDqERjIE/6MV?SQ>nM#<aTYw:qKY\aB%e#Hqw55%Y<PKn4!dPXJ\I\%%S9\#In
N$\h1$ MHJW6KhNq&5%PZAItp#I4NLC@\L#ZwiayA$QPd^KXA:y1N#k$?+N6RXREFKDI!1<=a^4khc<Kd<F8Cuh
YTJ*\V E?8!t^p!N@%@5p%IqPTGa@E>5Fp8\\*F=PFJJu$N^64VhTXbc8jLc8MdmYlQ=$?^LiX5tj//&pmZ>lLS
qYK^=i EBW#1JwdKYZdkkmTbn9KJ#qiiA/i\Zm:Rc1E?K!h4#>L:4bXEbL\$?yyk^+:mPGiEaAy>45?B+6j\IG#
#!wSjG lBKeBY!m=eBqdP9Y!8u=tXV>tG4qt*+5LueG:Ne&n&Z4/h@JJb4&y&hl88+qmtBHF@MD4Pd$%Se#HA>l
AB<>n@ lN6/WP>6\t<y>%X4i%JjLK9Ydw$VCei^y1\Q/<RC^QhBX&Lql*!Rp%#uZeltG<BJP8SS@A+qi5MVkQ1+
\H/ZjG ^5j=Lmkk5w+*VB^tSl\DGSRj9<=Vm\l@QM^R1@^pXh^A@KD*1Ku9VEGIEWI/mT8D=lqZN6Ndb>M#y!RX
4WBTtd <&<\Y*\1=WVd4DNmk1P!*H<TFj@K=yl>FR=<6*RP*ICc59hNI\u8t*pyueiL81Vj+V%cLB+/&ta8GeAK
@n6RVA Y#%4G^DkNQQi5:dS6:wd=dPAwZEYb:N8NkJC8cBp&6P#WlLjNRAm\RVqRQd+m<y$@QY$4j6j%?&$uh/W
9wBWe> j+^<E@Nl#@wT<M1<Zc#ZwNA+d9P*$4mpP^jw1LR=$!#ElBI<JX444>Je*EqV/y1hld#\8b&CtM>1KL?P
L#Yb$d AjSaZ8&^48kP^<y$mI66QdyL?JI&Y*%Au:>*Fde^k*u<DP!V65SiD\eV\LIpM\=^+m>y6Q>L1=XE#1di
cTkTPG JCG6>N8N=1N+%^ZKGmtQ<ju$9CTnahB!jA%MlYLQjbD6mcp9$9HP9P/Ic<nCmK%C%aDm@Qw*?Q&<4MGw
\W1b$J aJRq<=%=9II>1:N*>d:&AjDuqcddHG%!ZFpl>i$ucp$!ulmuMZQ9jFyP^Y:pydP69+$#uuQ9#5G8!ZbQ
p9ab&c $8Db\hSNiT&Ta%G?iLu\<1I5XkAka9G=Mhd1D!8=^8KkhYq:W1D8mlNci#Ie=SqK^4i/:quhD8<CyB*?
XY4@RA 8ZQRqW1P!*GH*=4i?HPJ6&j/HFkV8J+nbAmNmdneej+/cSTaAiKcqJtapt//9ED/M#Hj$<eEXKjkw9&H
?<+E:A 6!/S:cc\GeuTASEAZm1<AawbTV=qWKyTkIXLM5YLS$uMJM6<I&+kBZ+EjFJi?:Y1w+*GR:jPaq:!Eb45
Tc*>I= HYqbCYY5%YadRip^QVn/RE/Fy&CJpcR+&!6n:cZDDdWyFnuLcmX&NQIjTQcT<wVpqKmpRdu1T#C9!yM+
Pe8di> bY>iS*G&hdncYQ#46tS%D8RZyHjZIXm&pMh=R\6M5bX$BBY+AH?Y:kaGF:GX=dqw4bXNMqamnLE<yu4e
N%jb5J XMSMnmScEn:!thLdwEMAlw/Yyeh\j*1eDhXTGSCdK<dL9?=GLt>aT5H#PL4Eb>Tkd*@Rbp9V<@%@hK$W
n6lic> Y?FjNeX%tjnZGtt=&@D&nE68bLn#IA=GaAQIqDDDAtHJB9Ei\VZq&pX+kumG+p>/54eX??&/\RaYYWRR
Su9m=Y p\Y^dw>Y6^+b=RD4?C!YyHnj1GdXBJ?>/mM?<:lTa9b?VQj+*d1$nV9wH/P!=VZVi?Jh=SuR1+T9a8Si
=H$!#e PwZ1aXnSt&K\K\@d>VM$=*dMM%d^5CcQm%:>^%njZM$EHRjGWwPIk=tIAbj>*pkMhbJ1B::CXmHHJT@b
lB>FwD eF%SyT5A@FX&wu9R%q+n!:B#^Chky9q6:TtpkbVWJp$I<^yIE*JpNR+d!ekQi4jHiu8Kk>t6uMB#ehZ?
VWEp#$ Q=jeI&EjDQY6XCJ4CDc#J1\m:#j^LTZDQ=jWDuBPDww#bjYBMTV*kJ6=YSIq?:\:LiS*MDPDjlIV?iI/
it+wdH 1aKm1:iPnw>1A%w9nLG8\X8BeGHdAQw%LGWu&HEFSqd!anJ4#1?nt:9cdm9#h6?F^4$@JeqtiRc!iLD/
QYWm>K tHTHZZwMWIATc4D>Gp>6/?:\@PY5@pym+XjHm%1h//5F&:*IEjG+!ZeWHwC!\VV&5PK%AK6<1^ejE8^M
$RC%=! p/%^Nlu#D=Gc^6I%uBt>=Zh#KeQtWbGSIEW+!i!NQLYCLDeVehBNhcD<RaIkb!Sbj^QuBFWiHp8QJqYM
jYqcRa jHT<QKS#ARPAn5A^^8#@=t4Iy=Ky*<$bFbXD8RKhumiyAZw^l?PZN1^iTyS6Sn8<LmiqC%=AFQb4cPpk
qHR#:M IcILMTpRRQw4+jZhw6JVGh4VFkbZ9Ml$=cMMc=YA>h+G/u1T?c$HiYbtFcApeeLtZy@AC9ZIB9it8HtW
Q>IdGS KN8=HVcb+6!Pl>nTw9p#eV1GT1<Zb?RD*/VPlkVN^t?Q<VhMip6*Vb\^Q$bqRkLJKBbe<Q##6udDQDME
@uLY1V L=w<=tA:6j%Sn6RY9+FQAAl&$tDjik^1jK9<dcn9!YAc8a#EPpEiH9aDT*MNJ@<<5pNA$J6FZc:?VK%E
4#e6cL GMhZ>RmGD1lC\A1Y+@Nl8<K%HN$iHy5D6QCV:VDF?pQ!t4!EE4ZCu=wyyTT?K@NYkFkL$61FG=J$T4pt
PJcBY6 cES$<ee9RVLTwJdHA+DTK!#n6dRQT/>%E/?FCd\4cFk\$9Zubdu$6\DLpwTELbqVRk!<>Tc/c6^?%+mm
$RXSKC 1TNw1@hn6*9nlEXbT>B?P^/qT8^*4j<ARHPpP4A:YVa%DJ%Kqn+tXt5QiRhwwyeLEq5w=69VkC9p@eGl
\Iky!c 9i=jY1R:Y*WXbR:Cp&@ta6HX#ALl9IcM^@jIqbFh*8PPd6T1u%dQKyiQP&Ku<jmPPdEJ/P>bjHbVGYum
eLtC#K MB9IZl/>#Gw>a:S5=%nepXP5BD/Q@+yER58=1?u@=p1a?tc/\>IE#SL!*e$LpA<!=?EQ#/i<a%y%=aq6
%+\@YB S+hk!IKHYA=AMj>e9QRq8P\htjuYA5nyGwdBFjpIQ6:G/LcaTLcuaW6e!Hm#4JiLbd*P85K$jk&@qLwl
T*LLp^ YCiZapmlXEXweAEmPZYFt@Qd5B<JtyZ&D%*8>K#%B=d:6=4:KLTk6k$HJW%IYB!c+hI6*cEjw/lejQXA
pMh4in T@w5lVDiMN+d/=YFEytRpn6^h?G&VXKbpmhcK?>^Iy/+#P<cI5<Vl&nHHm#^V?JH9^L:L5j4iqP/m9&M
Yj1:=y 6>9kJ/F#b6\k!J5MyMjdqKL:8Gb@y+l$m%jpH5PGCXYuYeM6:kQ^SHuL@n>GGq!Xwqt1n^lY!uDSlpM^
Ga&X/m IGWNLF#\Ep!lCI!6iY?CE*8yF1Kh\dnt=a5Z#+<YNablcF>B^LW8NTt*ji9$T9uNdWe8hGSQMmaH<1kj
=W8ycj %1A48i>LXiCyc$qKHq^:1^WyLZ8XNlu>JQWTaLn9pyDNSSL#GyAY1kW>?i565JaaGw4%dJuP=q1*m=pi
y+9&+I thCqa6#DVw:kYetCtY4$KFpF\R^*^ttEuQnWiielkWX?5&I\F>6qX!$^NN6HGF*F/!199ycVPqSB+V?&
nqFWm& IN15a4=?\9uYMu>y%$nMIQ*+5W+9MRQInw+YS+B>=y%^<Cd^854B<P#Enp=5a=d=8qTq<ud>iV@p8H>b
5SpSe+ wZnT!kXT^Ra\*1GW^@YDA59qW65BE6I:KbKL:myNPkbV^^i*FnpWTJTNWlWE!qtNDmEkAS:mJlkkMbZ4
eJdIVC kjTTMZX>6#:c\5t*I<15j4t+@%K!Ic4M@=tt?m9pZ4ehSYWSieZNajNaJV?WHBVQJTwBD>JSKaVJq%e\
S$b%ql G\apGh/YXln?=%?>dBh>KXN!W8k6<pPAh/k5AW\ID*F$=lWI46^Z@t=C^nPeF:Vbi*Wi=<+tyuPYKh18
/H1hSa t#\C8GEq:kK5pC@6q8Jn&bV>Sb<R!8LdR!K4e#c%S$Q$lGQqM%TW$BPuQN8ACI*\VihiGBbp@h>i\!KL
=*J&=l ZNj4#G*mZ:hnGqamt8n4\^Lpa!BV?hJHCmXJNdN+<eYL=!<YZm>*E#FqBA<mMj*+MR6A*MI^t:lNap^E
WQYj^% !H4@$j$nie1N&14G9H8>LtMX$^yXa/NcF%5BpuMVW@I^8E9J=i6+N\HnMhFbR@+CW=Kb8Ru4GGWm+t<C
-A=RAV 000842429b9001202b3 Page 54 of binaries1.zip
LDmNhm P+T^KSKWqDX>iRWZ%++q^W%N%@V/@IDMp9qR<Xh+AF1:\!cD+q\ajduG@quZ^W8R$NPK?!e+H=nnAqW9
eWDDX9 kMjK6W^1iwN?\a&JJWi1Y!NHcY8Bbddnp>EalIh@F9RqS*A$Mey^hnVEN5:#XmDlGIkIlu\V&ShGJ%J9
LVPm+6 TLPw@A6b*9?@4p1mw&:e/pWIF#H5MTVmm\#pKSAQhE@wQB8kNTPCiFpi?u4^@MZ#q$eMpWFJSYGBA$:N
%WKlwk JLJC<IZd6VaiWkTw\LkKwbIdWwqw!@4tEdBaW11IYi8Z=Fa45R4+a*HiQm1jD\8<K%9F!uI4kQP\M^Vh
<&b1hc /AcW9/I&A@pC4AQHR!DnKiXCIm</:I4<:=cP8^d%+9?h9<6MQ</:kVBuWXTJa@4Cc9XA<^6=aV*/djG&
%W14>n yj^+^\J9XlwqRtA=+n&4?LGulkpwGtDHL:R8RyewZ5Pb<ktbw<STWw6$clPbpjDV=l?V+\m%JF=KM8wB
*KcQ:Z pDtT\lJib@Fw%eh=@=<9*V44pjJq/Ei^!WABq$+y#!L/PYC:eL/EcmD8q6n5Hd%+ejRXCyG6WLt8hN!b
6+th:4 yaJ$l8:<4k6J#a/B6TAd<$#iY/J#K/WItY:ci9MaNF#!XC<m1IP?Y&lCT$WyKaA=/!Y@K*\K8Db@=4S6
MDA5:c R^S5VB<N&D5F6@jpM=TpK#@Ea6KVDehD1c66jw?uBED1JiL!nm>4#CEVWFbH++RCJ@&p5%WC#@AAVp^e
AHVqMj p+KG*jWaSKW+i&#ud$XIY8YhWM9aKml=#Kq#SuDZPL?8JR:@jn#K^p&&TdI&TSH6pSRqNWAX>dG<KwFK
&Zj=94 Em!Aej<Su$tL+PujGiaBI\#R%nB$Pi:@/9YR^D*mE!=QF9GtJRGuXda=!kBK^:AbMbq*EM%cA\RVP<8n
9!+w5W %aW^bePTL%VK!k\V@h*A!htMc:6T:H/LYlNT4*R!Mm=IDaqY#qENMNT4u4N6TAP6FlKTWd@1^Fw?:Eee
^Ye:dQ ^>B<RTPnG&QF:W86M/nLB/<Tn<MlG=kV?hTR=qD?aBVE*&^&uh:&qRSJSbK<#LiwmKTcTQ?deb:E+bAt
DMtB6E mB8#Ti+S\*:GcK*u=X%Q5kQ=WYy#W1bLAVNPAucpn!IF1QaD6m@6uh$=5\TQ\Ry6>5cJ=DY56:hiHmWW
Y:>>Pl SR=>PL\!?RhWpjGGVJ#5+$qIicK=Dw!^Wyk<\>1t=A%VmQMu<wW<$hh4\+BQN@L%BFyQGi4ZKFwHLqHN
IT=t+y V=n>%TEw#^caiiY%Z^GdLeLN$4GTXKQb1J*eCtd/ah&^Qt@>u6TRp8uTNWDNt%KH14Pw1E4R^q6yqG#X
$6Wa@t eIbwn5c9PC?6@&$LPmJk5jd*V+cnWaFT%#bRF+wWGGXXA1Wi&<?@Ym=&yG%bGJZJcSL=Wp9pI>^8cV:u
GkE9VI GM#yVAbjEZn^>h/d%Gwk<hJ#14HQQnM+*pGG5=$im>/%MW+G:Pn+ZI#N@9m1lS9d$Vm#DTanWyJ5Hu**
4@&jyb KB<i?@^6mWLmG/Xl%+%BRIW6D#KdI:jJVn4dkaH:@&\L#mc?F1uI$kCdH!*qAmwTe1%C=^HmTVNE4$b!
VmbGJ$ Y6@+WI84$$E+H/a*?hmE:SqHu9J6%4AQS#ZGkTXey%?WP?kyHGIhT1JNX9Q$nY8/ypH?K#kVlc#nLhmL
Jm6Gnu VE+YJ@RInuub8DiwF^KXnS:u&6uJQnln1TB$*bJ*PWIBSE\6Fet!YHX=95ATj+$Lb1Xc/tQA@=i6TuZp
c!p\!D iq1BWdBnpE<\Py%liqTu^lEIDp$4FJab?qi\9QLRY%:YP&PVLpnldSZqh8l4/^k*P1q5>4CjPYFFp=$e
Lwd^k8 a+P:^hK@b1\<Km5yBkJ$jVCMSt=DjeEQ=^SmTR\TI5X^@>ekWmWt&*:T5bye!k65R&9:wiCwZ%+BFJ$h
X$P96: +:&$C?bSY?>L!Aj%$bM$BHcNT9#FHVV9AawWV<Km$!R5aQFX6FF9&NL4GFl9eutnS*Jp<iCjJ^kI#QXc
1#YIAK 9ckyPXeG>b$ni\@=Icp$maG&QGI+nyQwp^$MD$+AqhC$!m?E%N^\:&LyX5hT<^\\WCb<TEJ+4hN!Emmq
&9TR1K 1MPjeX81nZQJ4+CEQ?R=LM&aBaC!bMCIdZapSYWSwaj4WECt%86KdpX?eq!Le<Y*!Y5y?hhHK=u6JGR:
+$=EmI ieJSmP9F@M6c&1tbwTPI@V\X8I#KHGIKuc9aYVJp*9?XZ9knm8jI9*eLBQVFBKNP#uZLFSWXaGI4!j1!
\!EDZE utG1BBBB*J%4FStB=jb<1@WRZ+XcLFVZI?>:aHu=J&<nKW$lZ%m1XAHib^@uAZV\+Cck:Y/LVc5/cwBe
:KtQTY 8pqd9G5KN%EqIPa+p8$nA$MwAue^:im>k&\$HNFBiX$Ak8A+p^!A%e\*mLRTESjdEml4Vw4F+Y=1maK#
Xm9$eT ^p!SH#kY9cGCk8Vu\1pEFDn6>#%h8C4\!d&TJpmmp*Ie4me%E/yM=@NEHKNZd8q?I^Gb*\A>k45TJeTj
###q=m N%q91AyK?RNMLuGjLI+5$Y#G/cDq66Yn!StZ?q6EcVCdIKj&@?pjT=n$$PwnW^w\4kV#R=ILajSGTALJ
ty<CuW Zkt9cLh%#k+%X81=^dyYk\%qqBB*q>WB6Z8$?MT4Yba4a4h&?q?Ry%ClJy#JML=F\DMu>lS<&^Q<NV5H
1nPSm! >I=w>&$yHRn%Y1!KXeCqEBtDW1PD&HV$5Gnq+&#16T%\>G%a\*EQeqm>>SJZIHk^&@#Q\YnHcemX4EdT
5Lqtk9 =F\S=hTPDn\LNN1+<VZHZyASqJ68CZi:eDq=P#<Xh=R1p%JJ8mn%188Kd5QThP+G&YC^q:c5ee#Jme>/
SSCCe9 IKac/yS!GV?V8I/RKT<?F*nKPaWdbPlTK4PCZtD%j%q1n!iS@Q<eKP$yPT^aj1wCp$dJtiyPK%AR>L6%
WXSEKd W18S98%JR+W4Fj^T$aiku1jdNGlGZI>cWmK$wR%a?p%5Q>Hd16i>4ba4AW/GNmDaLWiG8#\E!dc+JbcD
pi*S&^ MVq*+bCdkkaD^GF<ycXKQb?PJum6CRXdSeS5^HDdEQ4A@TpTTb89\6q$1u5<4BWmK#ahTcnW+*t>*eBN
I8ci6j FbHV>m4d\ZFJhedKp8jhy5p?Q=F1+FJ/:KtnMnnHW5atn$5u*>4ydW9wA%FmAQB4n@VLtYE=&XXIGSR5
\B^lST =IuDXiQM#XDY=a&=p/nCE8+4y\JiCai::M*@Q!wQl:YKbI^VibqC>aI=Vl/newj<ntw5!L1*!cNY^Cec
n&58Jn #lQXaEuQ1w?%&#c9Dhl8dXK#b%1/q@GGeq^wKkMPdGVd+t$5Hcn4W6lVCpMWY9CE%M<6*X=R%W%DacMt
n6*jnn *C9T?dB&jbmBWWSG!qwA/RD&Z8a*>hmRNBNDcZMjbEDGjw1XJ^Kd%hnIyStLj&y#58HmM1=668h1J6J<
jZq+HP N6td1DKm\!IRX11epmmA$>/$hnhQS*FIbE5RwJSTXZEel*4nBQjq?hy^P9bI8m#ZjWYJG\uSWyhk#uqZ
5\M^aN TcC^&jFyGJTAEj*jc8M>#nlRqwSPA%4:HiS=!iXJ8X4icpPbqe4GL$$mXyJYQS*PEH>AJd/K*K*!>uyR
IWb$H8 +?N%jiHlbMl1$$$Td$$l/9IFYc%Xua/#b1pI#cqJ>m1wBQl\NIKAHEY5EAW?=@1X6\+&/tnLIG^GY:^c
d@i^hR AC4i8SW*8\c54>MX5u^jR/JH5b>hb?6E+4KEeL%^pnHBKhRKJHVM1\HVcP>TG\hZ&*ycaX9uEYe@Mq^l
6hVitd k^bQ:EkSq5dyFRILRmY?cM&GSpm@dhNat<:GY?@ltDyLtihV^454cYJ&mKm$KC:JhHPdmHij^M*Rm8MD
i:M#Ap >*?nZ%&$aeYHm!d5$^FW5R@uy=L8N+aniSZSMG>We/h*eu6iTidk>YV!th@RI:X+hTXVeceh4+cP8t:h
DVY=Rj $XRGI==Vp*ych5J^thTGHDiGCahX%aTIVNmF@aEtL!DhTWLj9h5HPqKFHWE=V#P1IC6Q=/JK:1!YARKI
JT@THE /:lj\e8$Yq6k=QaWb<y/#tRl@?VEnDPdqN&5WlZmmW^M964MXhXQt&cZbYWC#pp*bn@^ESBmmb/R$Hbc
>hLFq5 &al>!:G*TYpA>4c4tKil<ZSp#5Cju>S=puaM?bcmdeht%5a618npCQ5RM#h=Gu*u4Jt+NMKj>u>:P@4/
jWmGE% $TQ5^D*c1=L5L%aKS*Q4hDR<6chWEa8hWt%d*6V>y+eYBmCQ81yiT=VPY+l<RaEm/#1enq$RSYMRWK?8
dcNbQ= \aVV=ZV%HAK1<TPP8J\C^@Hi4GkCQ*cS:Ai>q!ZXpZbW4/!m8K*W9:ENY/R$SIjiW8AcZh$:Hd!m\kVH
&$XQ<! AIQwk5?#I<Ia/91G:mWq*S&bdFnn$KwGq<KJTij$LDSap?CGtM1PnqMqB@KM9Ye+Kqb61^^Z@?dVDHNh
B+DNqP 9DN=j%WihY^NS>+Fikb5=My6q?cmSuHTMV>+nde?>%Ju1^9K9?bnbRW\wbMq><u@$KYnQ%eH:@@i>jLw
QC+&&T ?a5Z1JyL6q&^:Nt&ZMQZK*/+I&EMMANPp6$c4<Wd9\$GM*TRmKM+C$$CKe4/k+a15pHi4BI/IeTde=&Q
Elb+SL pj@uVMZLq?jLKeBET!qyZNA+/?mH4/%TQ*e+ZVmX*l5E?SVD4V15bi#GqeCnPIitbcWI>Q8RlAd%:ZD*
ddP^=4 B?^GqIl/>FKQwQJ%#mZ1=tkL8J=MEe+44F<?QEt5k%w!ap6\!Tc9bHMJJ5^=%VV*u8IQe&*XE!GH>HI$
\?4FB4 yt@6Qb>tbqwDea$/#JW%!K/haYLiYB=B=n:J\QC?C$EhMC9Mhn/CHyc!cI!9>PXXkaVj!dNIXjQ?4+JK
eMepb9 +icL=+8/uuwm1jCNVAnjp=jwhCk%^5QS\%QHYMt6HTiRPkT66LuZM9PKcH$JLd<A9ct1TjpScw>m/Z$?
nC+qYH E?L&RJKDJ&<XedWXm?*4tk@QMmZQ$uL<i$mN+yQD$iFkhDCcaCAc$@ld?YISXAQdh*q5w%WP&bCayHC6
$5%@XG Dn#>*k#<aAmwS%y1+wldC5?6w@9*n<k@@l@#D=Y46h6!W/BiHq$dncMGH^aL9!?8&ApL=1u&NDcV=lwp
QQE94+ KWplWqq<Xi\#Ze4SN<5DLYA=#Rb9FE!\pml?=Y9CQ#p$?dWbc5>8M&FX<aCypLRcmepBd9k9IE8$jLH>
mmn#HY XW$N*DN+Yd?pQPM6MIKNwPAl>RR/K$4P\RjFe5k<<648Z5tM+!^T4HaVL#b:h<%b8p\AB\$+&M6TC6H&
tHa9F/ jEW?$*>iIltt<lE>BSl:wiZI4XDw>B:^@!N^\yMl5Q/JkPmTH#mwwutk>DTHq*415KXyeI:?+SDu8GI*
5wdybT W6A@wPRZZuMM+w<&t/Nq%njy+1iZ+Cu*VGKe=%Y@T=kkiYS6lV5RR8<=Jl$4!p61T48b=R:n@uH4*$Kh
$4dIq! +Zpp=D1C:I/k^65%JNdR&l8EVZRT8hmmW1uMwkS:W$yLE8ZniHY5E<=$D&bde<M!p%EHL$Xy6iHh=!<Y
iFnhN1 Z$@yENnFIp/m?ymB4*:QTme&GlbWR=HGd^8C!BAaSHQiu!8q<%^QSdClqSkKJ$DnlubQE&qIw8?WC\\R
it&6^n pYR/QJ@&T+mYRR^ZSZL5VNFlEDcGh1+<KqKZGu\FD!F=XRGJnA$m4<Sd6^<y%Im^P1EV/uq$#@u<G%C>
Zd<uA$ qb=GyQRyNcq+LdB%SF4T?$hDQdbdHSQj^\&5Mm6+K1bI@4kH?niP!S!/!Aw\@G<kFycVFlHR>R#1nhan
WuiY1S WpQ>JRjlt@RW6^IP%udRBZD^>d*p\h*8>k+4&pn*Y#?G/4YE#^8aKTHk54HA<WHb&nh%kwN8Wy<JV&FS
8y\t// G4H@+%8+cu&^$ARFWCcTN$IjL8@8V/#WNhl\!k9l8lqqWH?a#:5Itk4Ty9yWZtSh5cMYRWER$uWe:any
lCtwi+ yLLuWZm?:LtG%i9%1>&<K4XK9ctwM=&+mB9Kh?:uR/hmni=W56<&yB4SAM14#byJk5G%BAMpp*FJKPtK
-ABYKd 0004984ee30001202b3 Page 55 of binaries1.zip
!t1yFk Re??hb#Z\:w?QnycH1*jZ^^JS/HaQqw\=y<wt=wuG!p+6^DRJW5D4wQbpeSR5Hdm/14LZc*WyM9<a?\P
=qpN%C e*R5yPDRY%YhJq5CGdmR5>h%aMQmDRE^Jm+^%KTtt1Gw<jEJD*^WFNI4G^H*Fw&+IFc>*BmchQue@>Xd
Ga1Xhu >hGLw<ZW1@YtF:\\kQneRaW!*RZwyLAhN+*jaA8HWdST4G@y4VA8a?JlaAFJI^BnGdm>I\DRXa!l:ZSH
mSZ&JN Q<8$QC@D!p^Zh6\9XJSZXRqhjK\K5lQW/:EQ:dCakPilcKnZGiMtRA+wa%8#tXMmHX@TStwH&@t%d?c<
eBaWBh %eYeV^/+kQ*9w^y:/*Z^9M&c4MpSh\aEJWmDMW/dBudRDYSXT/K8&WwR>CI>@Sc&m5^!Vj+6DE+M>>1Z
Q@/8>k pW!^H6eHimQmE&tGym55X>$/B&bm?i9pQ%TA:XXDn!TX4=d!6LZ=@w#ZhtP%iatqWB<BhF>>8SMkN/:@
96hP=6 K&5iPQ^t8k$b<ZPk\/Wc9e8WFPEKFq6%Z!5/6ZSN&GBABBL>S8h&PySWShS:IGHkK+*qA4694WCq4D>4
*TcwEi #*hTpMc6eV>YL\FMwea+N#=9MHjmIdBFE8m$ZKhLtSpQtFeD+aWBHaIQ=G!YB?BPB\chj$Q?9/Cu<YW/
b$e6t# LG:4=hHK%6HSG6E>*bm1#n?u/X:htKLq6wRMwu+ycVSDIIWp9t85Y&^!844N91B%$DcPXhI/pid=d1hk
HK+Nkw NaGXa4\XRJnRQdS8cj5GM!L!yG!J*YcX&yCeh9tu=nG&Rn=Q>>JaihDVdHi^dySZ69@n&^A=AeCYE8LV
ajeiyu KX>ICaD9KH1l$1p\RlM?l5hmB:CI+DZ6NjE6L8Q$t*wKSVpLFay4+$%YGImY/S9KYq*+yucN\>ateZ9F
*y#l1p N>J+Y+e#BSy+t@!=+TmGhEwXK5&EYZ1=ACnRK:lFCehA5nN9A!w^W<Q4Zw4Xnw>Y^HK6B5pYMF4=iYPM
$GQqJC ?*pyQQId8qZuap&T9%Te6uF9A:wV%a:!Sj%$@k%LF=ZcpR+p?<L^LE5!L!h98R4nKyt5epSBLbq4Hu@A
Q+aA/M mPpXXiF=t=S9bA>!<%n?+cS#jp5/HSB\!!5Q6l\C?^l$aVKJM6h<^#pG6T:Z@>Wd\Q:wEXQ6^ZwPWi6Y
MHZy<! yeM6#8XAMWttMH@V+PSEZGTt=YGkA?:wkVIGq=PtpA/!8KaD=1kVMVHQZXLSiAl4Viul@q^lk*GNke/#
G*4m>> c8\V@SujLTbT9$VKW\QuVl$=NBQXFiZ>6eALV?uIRZD=XXM9DW:PL/tZP*@/DQhhDJt1!^n!#WiLVILt
Rk*q<? =9$AWQtIPY=Z8e%=lT&8<KXT<\I14!BQT#E$Gw+c8yVG>cw<dKlyRBh/D?9JZBZGPHelJ^lj=4HKCkB\
Rw^p=/ 68Q@T:HcD/!Cy:hT=bp>cQK*<CKqa&p<KjJX#PaAHwGF!njtVu=Xi#KBKmtB=M:?Q>1BiCw95d?i6u+6
YJeqE: qAZYyNJT1#hl#^R\MY9>hW=jHPGdeD:qZeBF#=5B>CpVc+wJhY#6^LFt$dHwAetSy%i8=\NQ^c9uHLMh
dF$mm\ #/AR!Mn4Jq#1Gdn\BKETk#EMX^L*b8BmCAA4u4un!QPt+n^\u@hW8$<yQ#$I:>y<5%=pt$j*#ZFj#>nG
K#kaSM hd+>#u$TA\kERQ>NFHL\5>IqDC%Ml*mDLQeNI+>Vn8X$a=YhaIWL$XV+tS6*nM^y61^BE<Y?jK^Nb>Ql
CD+:Xk 8j#Yc/Pw8+=Mk6yMAi*LiAjLA*qN4VIe\e6A%tDFeNh4=S%t@JSZ5j<d9PbbAWtG@>kRPlb$wWqqeL^m
=PA\aS 6p!FyVFEBkH\y@E1<4waD*>d4Imq&8I/%Y>X^L$kbGwZF%b5!!@Pyc=eu=/L<VpY%YEwX^R%\/cTAN?B
wn#taV <epB\4$iGpBXdG@CacuJ$BHVlnZnT^#D?*yhuph&uNenhWpRRZ*Ttcy^QkNyEF/\p4$LXwPnTcTTpHNt
HI$/pC XQbd#He6/%=:Kq/%py&RtG/nY5HBGktphP\MN+N$V4bTb%LnjDV&DJctVFlMBElh1F5>WIB:4C8qSG9*
*q*Imy ZFIAyaPH@Fy<QC>IJ=HudBY8tTykA&6ad$1RQQRe@lnqHVbKyiNC@:>>Yjb<Y/+=kA8A@+<VXB6T:QVQ
LDuJaN yGujRc!R+InZEBVCLeHql>C4k%kEjmJ^C8\YYmLYT#J$cVEmme*yGHJb>aKWJT>+QW:%Jtl9cp?k$dBC
jSwnDM w46ScCNlYS=CbeC%ad6C$XHj9\<P??Z$6piq:E5GSqKe#$Q\Vj&T?CF\1aB1w&MtH*81N+#bqTpynWGw
bC1b6% @Bb?qZ?dc5%=L6+WLIiVncjpD&QltNyywIW?kchy!E\<i&Ni/?YhVCMAtjK+>>E^>KT#YCNjeM9nXLLn
\iFq@L !#<ieZb4uFeS=QhT?L?QiS#bnuYwtdkk1DhJ=Gnq?9?pH<SI%*#Z59K!4pFP+>c#+CR9TRNk!AJPB<4e
C+!ZRB +:IEyaaWkNk91Ziy%TSCep/Gk^Hdl9YTIdGh4ptZEewF/k</q/+L\e9<ieW6RklZF$Len@M1lYk?yC@D
ipMY*p FXQ4?*uhHwu*VK@qJbS/5e/QyI=aRXC56/nmKLd^Db%5FVn?N?qVW1nZ++:h%T8uX&+Z?c1pM1u@X^nB
l@A#MD *5WnKhWAStEPLIIWRTXBq+/RwjHbI$%GDyabpG=$Yw/ip9FWaS$4QEW5ycyM?!\PE%FP^quMS5bm^MV<
D5!pDQ 91TRuHhtmNJQayYpKSL>QcF>ntBSjFH>Z+MleF\khWmy^*cSLDJWS5j^\VdIDqA?Im+h+e<1RG*bTbi/
Ne<hZc k:CB+DyhaS5D*ZcF9B?mj!m:^l:6Sd1eY?1KD11TjMN41j=LnV^1VI:VkJ4B8:^XXqc:h^\a%ABQIRGJ
B94:=m <!*8H>%9^aT*qFQK+Pn9&X!bHmZ4>X@Y$1j=jCwJ^8PCB<Jq1^nn69/AJQSm^Ct$AeepyRiFF!bI*y+^
1S&mh\ @4V&wAJESkHX*^B*%N4XyIb$:JpT>/G?BJttyABlG49Q8$m\c?8h9%9lB\ME@8ieWuS*FFY+DkuQ1lpn
k<@nGV a+lepqMKeNa<\?CHL/4&FcqQIYSWH84?Q&*DT9q*yX^8!>Wual4QuW=p>hBmSmW>t:nch%A\#KJiVbYW
mKVAX+ l\+My8qRPZC<apHpX9B1NdRP&*IhM>N!ny9bhV*>&En%aID*#ie9+*jF!eueHNMtLty1nYYqbX&PI&8i
&4P@n6 #PG!=Pnw=cNGT1jB>G\c#5B%y41DpiRl+CG=l5hj*QEM#G+pJ^XuHVj?N1y?i/c=^*N^R:N6W:eKe>R#
5dlA\q =iF?C$>KbcqbRbbZy=KwDJSG@T:ph<h?ZyY<=8jA$ZaKPuq4N5<IPTuN$6*kDyh4QbPtn$*?y%Vc$%SX
>/VyQe a+CdCXBnWncHkEcGm@R4A9&^Zpqm&?Q/Q>/NRJ%:Q@&cX#=mP/Wl*EYwp4?bZ9#m^SRuwuwuKR&>PMwM
Jt1R<y aXDiGLb4\kBwH=^\<ewGY9jAF&Et%T?qCNqPLX5XTPIBd%9Gyi8LS<j5mnm&I>AI&1=*Y*&Nq=aLX$jA
RRi<JC C%cb!@BhiV4IGulp$LVpV91Km@QLC#^SVHKkW<LBE/?\9b&K4?SdW@IZ!W?69&QlZhD1TCha4NZHpDCV
*QemK/ mIqnLu>G:C6&KXKX:Ab!VFFbZFLXS6=SVMF+H&PiCAb%Ypa#*Vll1yEVT$X*HbDZP=EjEeDb=8?ulIu\
kKEby> GaE9p9?6bpHlD<Bn+d=%$AXMFJPqu5emDQb@lSk?TZXw+PlZ8lK+AYlQGVSJ+dRX6yNM<wRwQk+a\!1w
ljW*L5 T=yAnLV<&IK8PqiwpmtqXQhP^c4we9LlcHumkHBEV4pQ/CSAD5HHV>k8YPWCI$E1G@uKE4CCjKhV&nb?
NV&ibw #ttm>!>jQD<C:>tWP!R^*MXF^G1j$hKVIcLJd@k^DyNlaDT/@m#*d>B8P9LNW+XTE4M/jmqtZdwQkCh!
*ipZC\ XAy^dD<eXXKJaSGu=EC4yc^%!D>k!XQPIb5$X1STYlX\E<>LX%BM*CRtX^*QJ6L$ly:P5<^5%qdL@FQL
6tAMNF DAe*p!n!LKw&bM=hQDFuD4eSb?XbA?d1@w?S&L%juX*wwbTW?t:yN*YhF1bk\BAQI$R%*ywu^G!Hi8d*
/$/9Wy 8DNDi<j$CQkSMtA:Zb=jq\?BwjhM$mELSHBTecW+*eVJ98c>QdRT1G<\&JJm>C=8HFmbkuWiI@4A@dyE
iFHS4C BVjA@Rn!HQ1A^a5ZS:ZaSP#Ylp<8L9qNHnDwYwheIt4G+*tP!M<eYFLpG^R**>DnTdGPYlPFJHBDW%Th
4e9Bmp E4ct?bq#W$i5AYFbcYAyJwSR8iM>RMI@KJ>a#D>t:VjH&JK/BFVjMT19c@TTFqcVeIPRi<PQ4#b?1q$k
?=XG=h Dk#NXAtabla%5RWpppy<q6:G/R6Y6QIS#+nne8YbtP>ZJH+%bB#unWEjXj5BG1pI&DpL?nkFVG\tQ?B&
<a+ELq V*ScE6iiALkpn9NEAqZIiNtnE&P?N\<>JN$SdmV^FbC<kn4lBG5C^i/Y$*jP\HlT#8l9CJ:Mq$XFDEZA
6aK58B :eBjtPAF^KPB%a<#T4^liQFZpe?qFEQi^^G=tBIPGCS+ZwkjWyMP\VNdmA6C?5!:b6yH=hu/8?Vy$l\&
i98L#d bm+bM$4t+^j=VZ^JJhn&PD4BlqR?&Y$RBV8X!dFh5M5<Fk^T6@yIdlw^HlJ#Y1eqjt&TPbRD#tQaR8kt
P!qLGi HPWS#9RT!%@=PFbkhYN^Ke?&iF:b!ap#j^1iFp=LZF>L8uL>j>pL5X=:lQbcHY<RPNNHnaGRh^:I>^yt
$C=l<m 4XR^TIn!ud<$eiQJQM#yi>e1^64EEPDChA&>Y>tcA#9C8BE\CKwZq>MQhNL5!bT8K+bmNBpX!JVSFkSw
Cq:8EV 69dn%FAFJukk@MDTAS<kwFa/9K>ijLGwY>?VH8?&8N!=GP$<m86JpuDT:!&\@MI+bI4a=JH4@FRMeRe%
@C9Qty &ypd$?uaSFn?%1wT:1$^W1T<Qte1%e=#phd6+H:Q5Zm?dN&?duQaK>SJkqnJVFXCWF5QNNp?V^1C9MLC
GnNXjI 5*JkcZ^Hjw>E=:A$Q$6lZMYI=5Z<MYm$+H$?kl$+auCuBqRhm9EWI%DJ+tjpRk:>j:RXy6C$pb+h&p4c
\8bLw@ N6@p5cNP1<=^Y\:c*uKF&l&>J@<QYqHiVBwV8A8#XEuaPTkbbmlB:inlCHhWn5TbEjQKdjqkaeyynTSY
DVGkk$ $K&E!ilW8uk^a&FPVV9/tRLIhm1p5yi^RN?4uFekMkp4IXM@j:GwMRhCN4+R\$qhhdEhL#BcBT>*t%<H
yJEwdQ ED4*cJwRN6pi!Q<ip4tn>ERHnXMHdmqm@DL@5mT9RGJ*+/jHiB&w@chMjYpQeKJHn6I>au/C4m=J9lB@
ZKjmJj k1+8V=hempKZ68MPXlA<W%Xti:\Bctww8p4XiYBIMp/@e^F$LI%h=4eTPB1Xn<V>5RRZuAVkE1Gy:/Bd
pjTVVM m1=IeD&>\$Ah$YCBDd1y6q\D/>5VnCd@b$nWTdu^eWWtAF1E5FtPwFFZ+K:nFNB$>AK+S$A^ed:t^h*A
K=N%CZ >SGw?djn&MinmVN^NJmAZ\h\lWVK\Ii+6I*yFY*<pP5?ZQphHT%+=AW:TXm<nPi@GKT?qEDGDq^e4dd!
RKwM+4 8p@F%cb\K*JP*eWBlNkJtA<XFEdHnJi@!h?mu$p8qJiDJmS!nhhDJRyMyh4<HwGYPc+YPALJqFknVjDS
BE#JdL #Zlh!?WJicBeGhIHakD/JhA#lEZawRWt#Ww6CZJkp%&ll&LEakejN4V#D/SSh#pBjy!XTn&Gab&a:R!:
1Q<u:? CJ\^89+@j\enQuE$^$XaWcV#eBX+qqi<aS%+Ie*j5pTZDA\D#pTiiQqS^#eKynen<TS!ERtk5TQ9aY68
Ta$%/^ $u+aXXje9mFYL5>:W#$yP8CkepIF+6FkNB1i69bQFTap@6D8WwkEVNa1IR?HtFKtjIZehkp!8e5!uyhB
-Aa1c+ 000e10857d0001202b3 Page 56 of binaries1.zip
pk4TLM PyEk#8a^VSj:HhLbDEduEm6=+a&QiA<@uSt>@<XQlIB^4=PQR@+bytquZET:^P6XJ1iD#LkiIQGPPWyy
JKm/<T eX>NyK$ZYE/eVyh6p1Qn#@wH<kF8Gl/pcD+%Jl6u5\nY\qqF<&X$PYnw5IYh#=E=Y@MY&Yi=I=<CiVah
hYh/j@ /^$PI&ZX@!h9kcpWM*pJW4l?51\tuGy^PB^tLMQtnDNe88D<Q+4SR4!Q/XXcj&KIFVp@aWWB*p&eXHG6
86t%Y4 BuAK$Mb4nLqdW<+cW&b6+ljFaGSu6ln5b\jm1dRS9I&NZMw%5KFqL@E8k!Zt8q>6A5Wt#li%yR9R!wbu
aI=M5V 4wNy*PiNZ=FiwJq8I%RCmT*SmmHHkQCRNV=^qDDcm@#VKXdhmtSXckmEjddpVTR=pmh9\$uE#R=+W6LF
:Pe>BX kcW&M4$QdV=B&Nj$\D\6HN!/w^b^K$?^@Cq$LcTHue*\/uaLZjtLiWTcE*?ba+/C><9qC$CZAAD9hDwY
PJHdQ4 H=!&dtMK*+DL4jN<6Gn6DaKRl!PT^eJ8$Td8tSqSAY&>l8H8E\La\YRmD9e>&M+A@w4*5XJDX4#uL5!5
IuD/XQ WPRRC5HAR*:\*KVF/uK//WQH6Qq&MVwenWJ^iLKVDWaybmIqJ#%X@<Eb9uRtjGCu$dbdNHa+E5i$PSC&
@+TR/p DWZ#yy&@k@p\&pmub%LkuCGVeD:qhluHJE6#!EpKWmC9E1RlIIKE4KbV/ST>5ynm@S6*1L=Zh1$h4CHt
CwVJ?+ ZtS9nTn^1ENGpKw\D95$LYu#Zj\GLTK?mu8Jt+juq>q+tBWkBe+NyDA#h8j/DKBPpXjqtj\^X\qG=T*p
8B*VqY yYn!XTt#ZPM*EDCqW89@?l6RGJFZc#k+GA#&aV&A!NqhNd#u&iNwDA!%>TNQyQN@mD?D<Ai5//uWllQD
G^SHSi :m5cRA#E/tT5\ue8cR4i@/A@@%4M6ypnTwMtJ!/46<*k=FA?\GB:Y*:%PCVt/MCy\:X8HY&$PY8u>:&h
L\XpmE BeW%TB#\>W9y/dn4^jtIptlm@qI!\Mp:49HBdcSH*YFehAmn>bK<9N^<I8qDEZ1M!qIJy4=Xa!Lt>D:a
LV!iCA JVXn>V+?D9N9kMDHZ=A1!EB@5M*i:JwAtF6FtK#T#mc?jb8YSi+Yn#$6t<W^RC\#Y8*QVCT/WhNc<hnw
bNQhnu GtbK%eiaDkXb!yd+<hpb=:F5c9CnLEL@X:@NA#M#Gk$Gtj!$Q#1X!Fqwm&WLlW5G14B/wka/\I/$CM@n
lKdCBA &%IXnk+Hl!P/u*b$pjjlHG+*+ZbFuCT@Hqe1b8IeADBL6hj1R?+DB@mp&eHJ@wlpKEaXc^X!Jp>h#PQ$
^bG6\I Y5:XaSFSdD6\!8I8/d$!Wce&/uKA!\c/m6FH*nS8uSE#d&85Eka5%pyMW=AEFV%EaMQ:a+dZK\PYC4b#
NyX!%H &p$/cwe/mFS4W>%p9Vyt$I<jy@5D/?aEdKEun>n*eTKYM8i*iKnL<VI5qFuIIZD4</^/yT4IJRHGXXX4
ES6Fk1 *mEmFK!wHKDJ%<b8p!EJt6!6/@>+Gh@FqG$p$W6<d/DPh!w?SS\I:C/^<+cD+Gt/LNh#@=yui:eSPeX:
6aTj8Y =JYZh?Zde=/&DG6F!S*EuR8eKMX1StK&cKVWyAZD$9u1IW?bI*HP%Qht/MVt#^HWI>?aTb*8+uMMc11w
lJRlQ1 9RluC&%NlnQy^%Yu9kH*8kZQ/a=lwCw^Ht@hWlLwTy:XwPS1@L=8Q:qqbeHm<??k%MREYLuknAwn5PDE
:Hy</= +BCqTppwR/i<I=c:p$MitY\5ZNqWTZ%c*QqA&#:Xk?e!hPqPT18=DFc41yuJ6L=p6bp$^GFATVDw=^CT
^D@*le eTFY9aH@pe?KRc#qSRnyC/^$^@%ji^<*+LDj!cE<?k>An#AT##5Fal\\BatJVRZmFJB=qR!hj$\p\+*K
95IXdn $8@&V$dbTP5TwJB^EqjT:jAtbQT#+uM@bPkMhluj%A$1$C9<!%A<HP$Q59*S\I^\AEYWDe4#kLH#5yRC
T1n14= BBX:P:*lK&WdW!bM/WX>Y*+:MHSmm8t$E>Me=eml\RTIkEh&GLRb?b&eM!9/>qlZ4*VA<TK@!eWCH^S?
eE:P@< C6T<4h9pHAh5^tnS>Xcay!TIuG@uJ\y8^Zed=<tAiwI<QI/pA+a!?X*LE%1+Ee1ZGdLhCj8@69wbcS!G
ZCdQAi CtaaG&^4JJ5qaJwDa!Qtw91<?eT$BhTm6dH@+<%=bPc#:intBEYD5eY\GMF?8Kb5mq$MG=HDDE:^I1H!
TXQQTm kKFI\Wq1$=phnkdbmjn6JBGG%SE!j?Y?e8Q\VA#dt@Nt89:%iT&@i\5IQ/m8IJpypG^$IwH:=ECe#:S&
eCuk+y l+T9iAEBy4mni#8MVAAuB%IctBe!CW566eLKhae!&R:dNktYd*MMYS4?aMVCXmKtu/SuG*miZGu5^M=:
?\@FLi 4PQNpH?:J8CNabh>k6YQaX>6abZ6Tw$EJ#8\YZwETKZm5A@j5ayi\htj#%jEZjbKcwYZnpTJVjXYulw<
AHtA5P 6PheBXP5&qYWiG$^/Md@NSZ=BRqt#^PcD:\lq8mWb&%eR$IJnXtG>/1Jp$dB16<XI<5&wGD%RYIu>@?M
S#/jWa %=APV<ZjBwMHBc/weP=amM?65ukyd^N&mc/hRjL4/dTWTL51:&&d<DFlK&JRCdj:tbl4PBmSTBBFG$5S
&%+!ET hl#6hPui>TTcp<mA8a&C5ItdtIL6/nJKwP#DIh=Fm%y!FaZ<XCblh:khq/bXI&=<\^H+TqHdNIet#^Ap
JXeE^$ @ybt\?5bZT9%Je/@?PDwS=4Q$TK*h6iu<ZGhD<Z965cklWcYc@M*^<T8i\:K/8G^&M6pD=Vpy4Wu!jIK
D5aN%E :LMX?#wRE&XTTwJ4VuEMbWWepEqmGW*X&1ZjVqkW<MD/LhANq!X\5:@*ZSZ5e#lFSKWa&Y!LSTeYS#<V
KM&Y!u 6u5JZmt8PbF!W44!iS%@q4jG^TtP=CSdmh%m%G$BqyXpWwqe$eyL##JS+8d$l&A/^+%Y5a1Q*Bd9aCAN
IbLDaQ K4:CT4wVq#6WK?yqNj14QWIHeV5Lp=H!V>KnjYkLh56lKmXWDBjN9Ni$:l=5bVmZIjim$<wF:TG56%Ey
ZPh*SH k=6WHTlKPemEtDRP*Q!+B9#=<=wuB>QEdqttRVRD1KP$J#nFiBnT=6hjKe^Ij#$WS:ti1l?yMtBFcW^8
a/pM=9 bGC&B=85<kjL9?+/B5pc>lF6R%6>*?BDbPNJFSVj\Hc@Mk=#cc9bFLG#JP$?A!&?+lJKNn#ye/d@Q!AT
4\?HNu 4yJ**S?cWw<\kC?!lJ?eQ4RAX6IJ5SEAJHFYZ%&d*=BCe\J9qFa^*Rw$^d+q*wkLYi+Q&9IYHM9P!4Q#
?a:TRZ 4<YcE5IqRN99!b6^itI%C+dVRbaN5kMJ+cln8I4W9lBq<lpc^5BI?ZCPRdh<XuR+lGYIV$:qc<h^b=Y/
m\WIWI B=chbiXVD5SR!XJFpVbhpc#<ll=c5*E@\/F@CwEiFwZty9h59=&cEdEaDw=WG16EC&iXC=GI=4wq6uPe
E5p4&H qF:Aqi4ITeWQT/GR@Jn#6YNAKa<J5%dlVc^>Ktt6\b%nM+VVp!R/SC1WJPF4^lJ#Wbl:t\/M+JuKq\SH
**bPLy hK:@P!9TA$PN+n4XuWy%W=BCl&*JPCBDESh6m88tpD/BQ5V%dal9#TPnLPHLpkkuhF>^b+Mn!Gd$>mqt
t=*:%> eIpmAkkaM*NuZQXKL&Mj61Qi\??QRN1Bn^A6FcCGA*HPk!!Vc9SATmSYwn!>5#\EuLwyWh1p&Ji1Xl/K
#8bM9@ %pw#+4+Zyq@Z=YXWe=w$LQiM1n4&+m5ZCNjnJj$QED?Ydy?i1>6\V6hm*5Q<#JA&R&jEGAWCHM$nZK9p
a&jwj\ qDR1SH\cK9aC5^u#XV*#YnqSbY6e**9RhNPTyyM8*Giw\Et*mWVS66XIt5L^eVbBW=<STT*Q6\qJlYaM
CRjM%& &jP16D1XT#hu&69YPH>j<ed$@!WyHySCRELuHup%=NGX4AkM=4:+F?:>$+yP&ZBIX:Xb1RuqnVanX\Yu
Zt#JH* \&c\5:M6l6mZNkqePG>G!#5>=FP>\IX+bDFC=*I$t5A4C?w9!IiinE:&/bWG^N4:/H1eHwYJjS8*Y>KA
E>^Mwt 8PTWXF!e&GKEb\!&8WCRqdd\5uKJbahhZEqaM/1bwJR:aAHayG1w&QC/$^Ky%N9VtppT4pRKYe@HHV#F
cL8HyW J8$hYNeEGFSSN?:1@lZhSeC&uARRHA>5a:=VS1#\a:4/\?lA*9:Rc/MKDuZ8FqCAttGdnS!LXP#TpRSe
<ReG5C SZI+1*4#VnH84E6>auyBCi^byd4?4!FMAm5S!!<I@P4ERVmbDl^qTu?QVh\yk/ACKX+\4Mb$9YNGy=Ln
ZBc/#? h6455=%6j65=+GTMytj1nEbJ+8#y+j:kbDAcj1DuKIYYV6Hc$YE&AIYijHtn@SG&hYDy4#VbeWYIS&iw
4MDARD !nYwna4S1aYQl55Lbp1CK:y&w8R44w?>XjwhZTVk9q$Kwl9/%8uRMaF\h=WC8E!/JNe+RE?>Ji4hc\!y
!&=4Pd MCiCt>l>4<=WD+<GXFL&Mb^8FeZq<*!HnS?uVG=yd=d5Le41CY>yDTA>VVa1bpF5q>HuuQ!lCm<aW4L1
D9L6=i IWt/!EM@/SKpmwmM59@4eMHNnmBV9JHkQGT>jb/d1=8huwwZNpXmaZp@KC6IJL>yyQ5>QMlPaLX5l?b4
Zy=&jh 6/?#Rih>D\?F^BS5$w1D$iBR/64Si^M\=?Cn/K=ZQQNpZ/wet$=%ZCpFDmHVZPVRiK5Xn?E*eV$pXe+R
@bS<9l Py=*+kZ5=^puhZtFGwSKM?WT<^nR8KPqw?>h+kiw/c:4k+GYm:6V4P<<yRtltwH^1*aX#tk@S!amXdjW
bbu$cM 4c5CelW4wj#hYN*6KulJnDQGjH\:<dYIFZdJC+49&JTc6<T8W4eEmeMSQ*PtE%HZXBLCJScVe4DSa@h^
IG\tNC dlRLN>a9dc1dDN9@nSXwJ^HRA1qmuI^RJ?cRKbH?J^YlLl5wIdmVnp9\M=mtE/9KcHC\9:Ph\Ran?l>?
^JXhS4 &yjYetlJc<ThIt:d^dhP^L$in6+5/L\5WBG*#il\pB>IGyYa%iR*T\$CXpMl$%?MQ<jakMW6Y\$iyX?G
B/@YFJ iE:ktCFlQ8@imMWM?4/YqJ5a!84S6blQjk8T/Mn#EVZD?Hq?H>l5uIAduemX4Q/R6DlMTj!NaCSTIcbq
EbwZ!= 6q>j/T@yD%Y%K=HSTPTQa<=^P4HpYcXFYAD^EV@Cb\mk5Q?MW4@G#ImH+uGt!WHpcSpn^/+%l>w%/1pq
8<Tk!\ WKVAka5D@l:Cb^P8K\hkIkK51HitS?J6*NddLdGp%DR4uJE8R/<:#H4A!dbWL+QlmZTLtM1NBtLA@SQ^
hH?<1< ^i^kpA%PV^N#i*RVQGAGd#a=De9mdueLlkM<e#w/kY?PqPy4B@j4m6/\dhm4>A/?I&4bakaYF#^6:Sb1
TiHXpL qE8yVuGFB!ALQkCJldy9i1aC/9Wh+lhS#H#nDuS#waelSp<5IYR!NF+LBk=RYJc1RZYlRQLmW46?MpRR
u<ARZc Y*6MWGidH%w>E#LDuK!MPDcZyP:#ueR/kWu9k>K\9I4QIFi6DBFRD5ZQiuAJCh%AkknWM@KTy>?CI=KI
:>uAJK PE?/Zh5NJPRj&j@u!:ml/LERXj*qTpheju&QJ%cMl4!<p1J?a6Y61yk/pp?Bi=nAk6KHu$/p<J?kuD&q
wyA6S% VdQD:EScRCqjWN=5KXMjB6/td+8qYHMZ1>+JQ%I^c9iZw*ip+^<hDIB+REik:GW^mZMF:JEwhm=jXY8*
VS9&%M TiuweKuYRBLQT^w/&R@bY&\=\a?DSlW6:GWmCtHB:jwwpLc=X8J+M\BDd#JQ@IqX:WF\\88RuMWwCVhy
EuueVT V$NXT=M$>eVbXGeWjKt+t!RTCaCtZS*>aJDu:F@*bGTXX@w^Sy<wwMVKM@HJPE8tDMC6Kj4cPQthXcmL
+R$eEL Vt>W/m%*SuhlVIT?@^QwQD:Bh$@&5R&q?/NCtu^$NH1pe!6CI#XuRdJ8wHq^T>LGi*CH$ctWPMPmWMbM
-AJ\I\ 000416bf977001202b3 Page 57 of binaries1.zip
l*ye!5 u8!l6Jt$w?Zk=mk:GR\Q=P<6%l&<*5NMCDwHZ?ICn&Ic5KchTCGdDWC1n/bm:EuEWmAFp1%D:HWZK&4H
Ypak+4 Wk6jCHGFBT@1&8qi9XnWLHhLii!dHTkt*WP*cZtu:YlD!aKZdCq?IGXFheCM=n6mWkPk:95MXLYipqm6
WI!HNu P*Rj#/EN%Y@eBpH1ibKuQ!d:C\K4QhVFpJ+pbGIa1F*dLPR:=N@B651:jibYA6p6:+PkcbuA=a#LdnK&
u@LalD EqGyaRubH+^Nw*$#V@WNLl\eL!*!pkj\%9b@EkFM<iTP&$!p1uNEWPXWCXB981bu5H#q$LhDZ18JH=C\
b^GPdt 9ZkwKe?<8ynXJp@uA1NlP:mVDSAlaiYRKl6!VwV%WPJQqGHmyyXccH5peeMku:KhBKt4%bH5iyXIjhc$
ZDQu5k Ym:/wLm>I*ZPGJJ1m/<YZmXuyJ4cqqw18:c#u+%$\+@p&dmhTp5beJA9$icZ$q*pmVE/=KPc54?IwnX*
Ztie@# </X8$pq$4:5tTpIDB<jd4K/Rwb:FZX&5K>R5aX5pdbkVHDCQ>*S/pKSSjla>Ja<iRjRuEaZi@Jn8KL?X
pTkyDh q^$PtFVYk#Lk!SMBd*SnT^EyMmjJX?EW%m*G:Q>duQG%PAh/AwD81<^IkpcJItX4dwFM9Ikha&*HC4C6
8GhMJZ @A:\^La+n8EXVRT546&GtFK!yRSW6TXwwnpm+BHS85Gqy*#8n*BMaRiwkqC*nwaHBYqB5dIPX+e5=Chu
y#c\ic ^kb/eT=jVCWPDtaNuIC>X$?uL^e=PeZlnyKTWX1hbJn?EHdRTp@AWma=yL86C\%&iK+#/bkCh6I&*<l4
&uV>G6 VC8%GKWl!>d?DPGMpK^u/+KiY<Pm1qWt*YSqe:C1VRZAlAV8jB>RK1J:qjjIDjCMXQFHFdbQAQt^uDXQ
LM6bB+ yHE!?TMIySl=YZVPlnTk5!EL/u:1klGau<TJpn&N:j@d:bIcZ$>I^LqGEX&y=6qST^AW*#i6@=ayqXGj
WbwRMD S!l1KphtD>+4m<<N$e8VPRLVFRm<$aM=#JE&e#S/MDkauk\P5b/\p:baX>4Hhh:AmG@8GQBCHy=In+FX
^wSKK? SGHBweAtXH!Yn%tq84?5hQDM>T5yj@5weyj=b%D=4i89F4u&p@K/!GiVtuqj1q+4bi<RlWKACEc%iWti
C@?F6^ WZnu>elT\?WJPKPe@6<m\:AYu:=MjHVIpX#TmciAw^NnPDIcy8M9DEq^Wblib@!wdSK:ChZeKTSGTnhm
KdNPY= D/epc@+CQ\PdmR>V$b/%SGtaXu+nyc++h&G+tLS6>dFN>&d&BQP&ed1LeLq:QV?+@8?6Baw&ljYLwPZN
>nlZI+ aZLV!qJy^8ip#YY+JWi@Sq5\kP#mh^Q^8%MWH6YG@JXSyTj<Jdkj5F8Sj5K&w^8DEX#t<BRDYI*bN!PQ
F&N<@q bm$@T^tD?DLMX!RXY+S&Y/Wc8yh?WDXVW5K1%AKnYK#J<+yme*9/>ZT^!CFa$@w%!XEHYV8/b+htqGG>
\d/Y6L qkkiYc$/N*j^B/+uMiL:yTI@qXR+:!kl6PDl1%R1EA?8^I<mHX4#6P4whEkV?X/YKCk:akwJ%Vk!%c6R
KF%c8< *kDu%:WY\6pTk4m>u5:/b&lJwaHNe<YjNVFI\5=BPm:8PW=I^Ey=S5$a6YP/CqZcRp=+E$:jtQ=Q?1W+
l=1T>a Z>@+lmH*<+/4LQI<$AbeJ&MluP/?!AXIT+Tt&md^!pnKYb!8AE>NVcpa*%cPCI!lkd!buA=H&TCVyCn>
%cE+nC !Tp+SFdpV&<VtD<LSA^ATuET!WG@ByCG+StFjmZ<p6y=+uK/F4H&lIVG!A=l^9$yyXWJZ^WjMCjS9AqT
p:PFQD iT\jddyV+V=SX^^@Cj>Zen8aK=^&4DHS?1t8lyTlnCEYFT6>5+##u#cNlFlDXE&P=LYy8wianH>P!H&/
<jtEFw A/M6^amQ1&VhlI$lh=^be@<klqpdQ<aqmHklR:Zaj8KbMVEph#TPBPIKeJ^:?L@SiMRLyRSNSY8E>6w\
Lkd^5Y M:n?9>tI&IdtNYmIi4Mt@6jcS:L6u1EkXap8Z?LPnMwu5XC8eIk>aVI1@S>yX4uNaFGn9=j&$lJYuEdJ
8^8*bm Xu#^+YmEII9=AP?6hZuC5<FT?XyYPi&Pi%WKb#SnM*?j>&lhP5hZKN<A\S8mKaXQVIF6tu=>lt8cpk1a
MmlM8n T6@J?kiE&BdwR9VbQ+kwkeT!T*e#/NVe?uKe4C19#Iet4jAS^qDyBEX4tJJWhSXkIFZn4l5FTTY1uV1B
C&55RE T*QV<el%t6yp8%Jie6IqKJ&BZWyIp:D>YF:wWw11tK<E@H^mkLYlpD4GN:!!eZ4Aqwp>S:11#BPJHhal
1$lKZ* #qCGPQV@J&qGeMqc\#Ql>Rj/amYJNp#!Y@?b+TF98u8wRBKB9/Xq#cq>1Mh?1H4d<wa!HW9eQVZwQ/Vp
:4/FS5 ceM%VqdpXbE8ZuJuP>4E6B$d5GZ^</qpw8y&DQPWHVuX^X^>@n14aWhVTe6YTqkClbVliB@1F9pGNTLQ
/:Bw\V AJEDhkPI9u5pp?BBI&b<%I/18ql:H:<cE8?Qddyq54TQGX<qVc!WPB>w*b@SVVRwjAnN+9I?ZaE1A&8h
%bi6NN EQm98PZVN$tI8P#Np*K6amDL9+4uGIPiJ?n>/J=i<k&1bI<%yPWXKAVZJcEat:1hp@\pH\$:1k1iePAk
9RBeti VIJ6c/R4/j@i=4#T#NmcbTqyML%<pDHC6Y*FW&#VK^9yaAdcayPu#yKyp*TlFJ=%bZT#YM$epBu6/IMl
BGLLXQ J85<1diBXI!+tVkheTlEkpP5N?<pi<+Mle81^EW=B!Xj:I1jX^bXwp4W6y6<9KA9MG4#G#lX1Rt4p!?T
*<Q&hF /J+GjEiqGHeRMYp4pmp4w6lR*Qa^<>qLq\9WaJVZ@PiHNR9TQCtbiB*8GJ*aPaB>u4EE54ad<@B:4h\T
uJ:=1c Pq*RZ>8eEhJ+9SHp/Al$wWy@WY/CK$XeV+LmEn88G8TSdV+!!Jn<Ta9bwJWYn>6IPn8mi5A+Ec%bM8AT
9Z#=aG elV/9+%hFSdNluY654*5/X&6VuSet@R9@&Kmi1SYEd1WR6\NVYdTCCBNCVwaRHt\+#<aTpIFM\JbBpq1
+q@dw< QdHDh4S!ewCj=b**Cw4^PGyRYZ!mc@Q$IPtIAKK%/!SckmwBct\c6=*9XESjGn5<!b1<td+uluRi$b*<
u*%GP% 5WRQ11+hJ\ZkM<QcCw\91GX9Sb&6Y&$aqBMl<6dyntEnpjVFDNq>/JSNe?6y^a>h99LJ+!#C/%Je%jWX
N1M%nY 1Mp6>%?yPMGFkPYylKuiJH$LG5wjhXMiuEVKA#G4&9!&$a1GLca!M?hkSH5dQbha88NwWt=C<cKb\$%W
ImR@Ra @%?nBSGu\%1^w*Bya%Q%Rqyy$aJj1t+SIqYlm&TMA?CQlew!<Ch!NBZmeY*&\eF\eDyKR*jLm@kkDnR=
+lBZZ< Ji*%aB>V&qXMm>ymGi+XQHjDYKX4e1@1HwyHL/H9QXh4k4c8F!Hn98NWN9$kN!hN9y#i@?GW^JmBjEwa
GA>NR^ =TEM5wKXq+/caR+W9^nj8YwX<>nYjXihEnILZ69>4tG5+bC=#8J6P8tSHNW<c=5Duw9dK&MTGMDB#$/1
1J9m:H M=EiAVyjemN!R$5kD+I:nt6C*H5T8amp&wy9<t?LNSCqRSKVwb:qA1lmEyncnw#pBBqkNCJ9ELdT<lpl
5!84V@ XcD5n/:@8:k*ZEe/1eKL1+Q1FRPPLFLhY9LpTuj&<=SJJJJDNahR&&DSlGJHm6tHy<QBCTE*YCX*81eR
jKK<$G VK%$w%tAld+ibAjD@eFRj5<m!FLt1Cu*P=yjndGXXD%LtuFDI&^5Ta1+tScqwVZdw:HaWa1C5^#el^Jh
M>$t84 ?VDIB+6>iPA!HHKZdNWqW*m69uFjXW=B&1=Lp446A*\<lWp$Jw/yqA:J*dSElSc^qSBlAH&I$ptCAc*b
XhX$Iu $+apERl!IJS*@$5I4H++ecF*1+T@I=aZPC?Ae81Mh5^L9QN*$BVnmkmu=FIZ\#QN!Wq8S@u4dtu$CEA!
CFmyP! mP@@:yIW%&lS/a<>CpBR&Hq>A4q8A^cF9/FhTIjFWEw/1ZyPiVIl@%4wyN1kGJ@VW@G=jZBhk/G%KNYe
@F4qM4 !w@M/aEWwDkQGA^Y^Pn6/MMl*$*95mZI8</c4>qYdLnK/Vq?RY&:wSudNtd4bMl8/$^C:QJ<E&/Jy:K6
h4M1NH X6EZRcNejKy%Y*^Gae@k:kG&:8lYmjIC:KA+acyBu95bZmdih4mpt?8$mI*QhFJA8lhQy>lWGtD+=hLi
myhkmV >uy9p/h:$MVJuF?#HCAk9pJ1/T>FTna:YPFHqZRmaqHW\lZVw%+Aa:+uDWlIq/M/Nl!i=BuGQ?pkGJkm
PR/?QS >QE4EqH/@#&YXXjMYKwh$MR*eENY%+?kMF+y$:F8SNBHmGeWY@kj\!MZ?!E%1E5MECVunR\9hqDealbK
eLw#cJ Pq:T&8$#=EYealqJ4>ukbHA!^Ldp>KGNE&J<eFLk!*qHJ/9iN$?nHm%\a!%i?kp?MhXcCAdB9@E5u*:>
B=6RF? \?u$E8AZy^JZ$FnhWu%ZnN&4HZhbyi1%pu?DP!a$\CycD5\#YIERLJ!qmwjd!bLAD5XVXt$#?Pt<Ik&%
CXViVK B6e5KdIj5$RFIa+i&tnS5/15cW6#9ialkPMA:*EMN+DlJu^e@HJY=SJet@^u^TiSLdZDnjNCNe=$BRQC
J&ZKX= J*=wGQP1N8cuw1KT&QLZX8Sl@YPTqCe%uP&1LH&hHS%qy1&?eJVAKSIqJGb*PJdu&CcCNRh:8=qP*66m
?@cm#D X*wMKPjaCeVGK+1KwED!/KS\M+PS*&V$=8lR*DdDqLaaeSkjMT8IY59e8tw:@kT=?6$4kmEA9<\I5ThD
FT5n&c 6JEm=i:Wp*YD<MlEj/SNB^bbSnyJia#/qVTWd%a5lun*y6AZy%1Z^*C4AXm\%Z/$wXP\mFl\y:yKn6L+
QmD5** WIVqReM$8GG/<h#6Q?GKZF&It^M<LwE6@4Yb<y>:A#$1\161NS:<EHN$FZ$l^V!<WFYFM1q$M8SISctu
4m/nDP pnWA+PD:9:&GwR$eWG4GNawkkTN6X:\dlLjHlly\%+q8uEkI^d^N@K4+lJe=mb9M$VQRcRBJJVXkXBHc
>MI8^N \wY/&8dpXkEmeR*l%S^MDAd6k^Nm8Cc+8R64ye=!1IL&16Nw=!8$KZ+P<&&6wFHk6GI:1Xe%Sa\BhRc^
q#6jpD LKhRQDnSlAnwVpY5uHykBclP+:/AE^Lh!PMw/N@/uHLA?ul#QbpRH1%:S%iVGQJeuby#J1BiCJTYP6+4
+8tlWj T@a/c=LhR8t+QRSLbkj^H<RbeiTkLIHAXb5@#M1AD#e4cHZA!hq&n5tXu/DQ8Ci*tey?/qeJjm@eM#nd
*N@tb# @#h>9LwHPBItl!T#l\yJlVhMZY@ij!AQmjINKuLHwJ=ym#@6CDaZY=b?QM&>^^nB19#6JCBA89R?TSEX
uu^eP+ k*H5P=GW&t4FRT9p#TwcM=Ea@BDaDS/9AmRc6Kc=&dunc>?diS<I<la!9YKe^8#ljF?iC4EqEMDV>u!4
+&aXVX XPaN!GB5BM:MHc/%?=wk!Z+uV9pS$S/a9PceT$<BbchRtZnpA!wHp9##W/Z*BhWDF6:k=/+IjDTJA1P#
MK+FIS by69tY+GG9N*Pyi<ep8en1D^JNPB?^!DnhI1w=9a5+LTnAH&I#QehFtya@Yt8VWjVmplaBV+1HJ46C!?
kWDQZd T>qWlRBm59:9:XPnCK^c9JEl5C^88pwq*66/Z&1+BPXHEEZpQE!ke<idPatW$/q<VE<8dAACuFIAXGuq
nidc+k NZqiHIRP@MF&5ckkKalHb5h\>lM\NtmkI>J=+:^4Nqwyciby?H1Z%F*5YMu%4Hwybn\/ce*Nea:N=bS5
GXd\Q< SlyT=i%8^K8yDuyG@Bb88ZS9tXVB?MTZlbF$PVcKTY*#?$1lXZdE&uwMle:YKRCEGW8b<86MaXialK>S
RYklIG R8\1Mh=P<bY/lhVGmW>5?Zu=D+La!nC:+w#>/CX?RjNBaG8P\DNP%\A:GtD^p*TVh$@I%JBtm1mcR8DS
-AAcpi 0001629ddaf001202b3 Page 58 of binaries1.zip
tX*m>G l?9@&#XG9#c?1^NXN9^Sd?dBSRVyQRMp56TAi$C5auHQ^1I6QwB4FlQ=WGLKM/>+elK$Si/?FB&*6H5Q
CBS9S$ wVKm>/=+9=*P5GJ4TINwMeSL@>K%qMmd9=WMKu@cqV&98Ye:H<d=JXqT8X4YX>yC^y9e9XPQK#w?jpVZ
j?SSah Jj^AhTtY1B1*db&PiT1*EwG*?:+>T/N8hyW1\!+JJl5i/$mhcHZi^VlXtFRXI@/y=#lH%V+mam!@CM<&
ZASY+R <5&4XKu=p8wXIV+GX>bjB*ZDDLy=PAw^ba%$S4J:#ujGakC4SmVRk$h^=pybPXW/CB<qCaA<itEyZV?9
&>SVaK PBnZ=yKhTSIPJ\#PGDR=cbVP/M9Kypy5DIB1RYhKKphHqiPK^G>>NCp:BpaE+m+d^NEYampMPttLNYkb
4%twbe lF*iujJa\IIm5XBMdV9jj4WHS@:5c!Qy=*@tGeF%YLnw*TVE#PZ%RhyE/Z?Yu$&u+b#@PmL@qME:4WQc
H6!+N! cqMQ+?Ghj+%IpFIJG5ndpAyJFKNHS<h/ZWH*=CDhBV$p+d4J<1RueT<uPEGhWJHZQGN46?>1<:&$>VK<
@QbL/m 8+XI%E\?\FB1C5tXuCw<pB:&/Q+tbpZtGKN$?ceAl/XjR$qVw4c^TkPl!XmuAu5RSiRMGHn#@4>b^iRN
dNWJ9Q hJST@<\pZJWl\a1^R\V*P8+69plWwmDqXTbaZuyaRu$I\E:mXcAVp>wjl:MaD4Tu:inieLDQI+D>:AR:
=<t%VC L4G@XD/Yy:HF5nn5+CbBkWMlyt*I>yY+lj^Qn#@<jFYj1d8wV#E6Sq6NkwClwyj!h91^4%V9V5h$\cYd
d\1=qH PWInPjRl%F!/LZiLc$jC%eBT1dWy\I<dBpJ*X4L5kW%5NKWPnCS\8G%X?>YGe8M+F*Mkb//d@FZq5<Lj
hd8P&K 9jFcJa85ch$V\D@E9e9QRY<b=h@AY+Pnw<$n#Ad!w>4WyJuTRR?QHX8#>NLJnL$PlVXn!wP#D<wLpAWq
9#pN>a RnQ^#M%WcIJiw&#>1mEq=T+$+ZIW\:Ge6SV6YIaDB5hI/RKyRAuZPZC/^W#dVAK/Q4TuBZbbw%E&PkCV
$ijNcM >R/AN>8HGKH9u^Aq<6APVFGpJVV<6ImKFXCIZ@Z/YGi8Qu1cPyHLm4AXX&I5I*uGt1IVlYbNMD$4p?!h
YD/K5* GyWuH<p=q&+bNm\NHHahPHwW???d@MTS5QDXGI:4ES+hKq$p\t1y@$:CMQt8LVW6N4P4RRA58Xju*XCh
\=DMj# 4@wBJ&/qX+w<wE48!1eJW6QWaP+<9u>$*!QGHthq&Ybj%H/tqwS<C%hnqwKCX@AXuTSywdJhwp4mP4V@
#JWQm< 4:a1q>^K*NPMXMVPFVyCL*ukYi1X5Ti*E<!P9*W\y!XnAQhcpH<hEE*yaten/VFHD\6:&w#8TlN!PDka
BXmTHF A6WM\M<J\e$ul!iDh4R?TYu+Hp/kP@n6c&Bej9hm&#D9yjLMIY!$>Y/84b<1Kh6DHLXSR#HJ>Y1/qD:L
I6CBK8 4SQhW:X&na9w9/w$*G:M@Sb9/hD!/\AY%%QDQC*1E*:YptaA#/5iti9CMuH%bZWWk*WV8tVJ=KK*EGHq
peDpHA D/ckeb6lu!Wj:q$!bI1y/JcTLE8WQ=taDpX6Cb1H&/D@St5JHuD&tyd\/IG1a+!bLPYBTtNH*@<^B\P%
AZPIyQ iPVTZ=Q*JMBStVnAY>5QF+9!kHpmyuNmKYMhmKQJtW<AMuAmQAbyKZV\48VF&WTb<$iVERGW+1TH/WJp
/QmXi* i?hkj:TQwb&S:!1qS@B:m>SaR#ulc6mV@9!nT+YIeAquiHtuh%bBP$^6E^6=pnA/LPGnnK&Xqn%AQBIH
=6!mQq Y+Yq8%91DYVP1%?$pTbRmE=i>a@SalIly^Pi>Epwb?TIp8Ct1<%*P@q^FK=NC1l4=yXnH84IFXaEVSi8
+Z9ZtT P>CLR&XE!6!!NCH9?#Lth$6QMqcDhpl%hJEbGXn9n8*4EbwCT!Rt!X8@#yn1?n>b4cn9h^%wAbLjGI<B
M=haqe Y^P9XVQ?Z/LWd<6NiKJPa*9T?/>\LLP5DpP/\pMhEwyPh1RN:<Lkq8/I\pl1&PIW/ZGR\HA:6:bQ+J:R
nlNikG ZyK@TQ#RDWaB16:%I5$GqmAGJMXjaCR%4Y9LheAEJH*dyht#im>XMw=K<+l4iY!DTk^*^A8*PitlQ9JY
twAY+e 84KDt8ADu&+WKe@MNjM^k&q?Ji>DJ=ScE%5WSXMtGM>tq4DLdZ=Rt//eVC:aaCuYnhLGwN?dii!h=K9e
//P$eb wS6JFVQ#pGCRmmJjk@/<jMkHyc5jTeuDRTF5TF5TVJ5KXy8t<CknJKtA6hXmN6#@LiqCClc4adMMKqIu
tB/yp5 hYjb?J:<d%@!a6q*M@J\<\^n\tF+$RKq$iHR=hit?IJuHaSZp1?Q\\SZGS*8Vc!pR!qmB+Pl%LBT>k\H
QmT/jL J%k%m\$LHia5mZyH&N^/db6<GC?VKCFQ8Yy$#cTNZIhmVFE&>k&MMaqVbw@y%AhlHl#\yNaTKqHk&B:b
6YWa5l SH%4E5PawhD+PG&kMl1Su8aTlVIa5lmDR868/+lNy/#MuuZiih*81%#a%Vw*tNcp>y6:EPik<N4&DMC?
y%Hq5\ lKn!KlmBt*\b*yu1Aaq<juM5H=V9=*$Tt5R#</abK>#T?TBhtW6uhWRI>Z>yHXQLRpWlyayby!w<?IjK
jwtR8^ XcSW$pkD>hEuQ16aXeI+LC!BaIcmICq5ih1aIB!J=FuFt@a6c/ESXdCB\q8Piqp:&5L>HSB=XVP@@q4p
k+?JnW ^LiZeEAJu*?F9TZ8%1uRX!w%QB5KHFq^wk!!C8^JXb5EHTZk1plqt46+!<w4iwtli!lJXEMHFa*LYDip
>4?1\N 5!4e?Ne<$%jpMteBkXy9nty5TJ=mwV@YBiP4$a$cdi91n>1\E&j!ZKE9>&aLdEc=>Iqqp+QDML>dW!TY
KmbTLN $XWjBjTPCJ?6?YmeEEA<SM:bVnna4LTJNSy6dj>j:pkJMuFcm>S^Fb$EVkN/Wy:8qPFJtW+LQG+JKuKd
WCV6q< 1LRIFCd%wmaRMNeYS=d@n?Gd<ubZHhCep>tJ/mb\atBP>+c+!#QIkR<NJJZm>m55V5D\JtW@Bua+n$b&
AkBYTq TRF6PCmJ*kmpj\C&1&n6NX+m/M&^lRDhZhJ6Pn&6T*$GY4*C@9tpY!el/w\1bN\Wn=WKDM$jV5B^PeKG
Cp6N<1 u<RDi5Kk+8h+Wn#\*&Lw+%eRHX*5h^PeZWZG\a+iC\eyM6*5MZ1W9pP/#QASqtLD:+QuRMKy@MM=+#9P
4\JGSZ H6T=tnGlpBM8p1BdECDA:/^!J8ZE&5PIud>R/4N+E$1htC$aKw$BDhRh>/RN!EwFn>4WG<hIp4Cd!lDA
\Ft^#+ YWHFFAmM/>5&!VX^*lbI?BGy9ea@9eaHAyh/p!L1J4Gdu/:SknZ1F\?JWY$ARNKkCnKXbPSDPkZI5A1X
XwqMnN DwFH+8S^GY+/145nkDy6aq%w*K1aeQRZtQP\Pjb/pRELq8a%!aIHpkPlRP?Cwqu=5hq+/XWYat&dd&i<
:u*K^C >Xji+J:i5P1ejP&%KjuTwB@dBq<mn*@<yp%Nm@TSnKD:hS/DBE?mGnH:l%nJ<bBm/l#Y/\jcJm&Xh#qR
i1Sh:\ N>h^9=DtN=kJ>Z>nm:nGIm&yRq!n\CDKh81+kIb^=RLP&E6/FD^m+\YAGQ&I1FZp9qqFLRRPb:EE%uyY
AVZ?yN n\8Aq!c9>/d!qdual*DRG6Z5kNmk$SS8DN9h?BQ/qTS+d@&*qHeFnK!PW5HK!RQ9M\CVF:k&nGtiKyby
!dHMFX :C%D/C/b@p4hp6ul>XHR$5W1T*D4Np&m\G@#Q!MqQ9Mc8SM\&\8WD8dD1eR>AFiy&^&4QiB^&pY$=GL6
PiFYT> Tc%<YC5S4jTDn&MaR?RhDW!jGNln#u4AZD9AmnPZ<nF^EQAk+LltP/FmQ:BSCe$eq+QaMY+EZTK*bq$S
++iB/: 59%@5S&:eVXHby8A4WSG!9WAZldJkC9^Am1ekhnYc=W8pE$BFh<CG4*LiICmyhQu^VBYi9^XLn8kYR>W
n%pT9j DkK+jJA?Wt8@pnJ%C@:uKH1QSZ:cTuWl%E6J<#Pe@JYpC\c=!6TXq^lMWCa4JK%jJKpC%%aKHaD^yE:h
lq8HQj l=/6:d!Rwkh4kD@c*1m%j<GBFJZEZay@!>NF5qIZaW4ney&dPyR^^NWFukt\k6H?9%GBbLHI=^4w&A#C
A$SH1q 6HZZjZ5<cmC/S#*AG=P@D69D^:yeKV+w9=c<E8Zkn#RDicakbn$=<PWF=jF!VtcCT^K9iiL!5Q*j*1t5
dS8*EP /ak4G&DBk#I%X&VEyQ/PWu<DAquHje%!$1#4mVJ*!+tqI<uIPFTqc^^Fc?lhFt6DeAt$bne9PE?npP<8
=PIDbw Nn+/dJ6jLSW*P@?4=:6cmyIkSd1HA*SCwV\Q=+VHq8lIQ/n$C%Ym!hGRdQ$YW$FHLmB=HeSwB/W&n>4h
am:5q< Icu>VVQ!445MIFG5W%^nupB8>C=nqFTAJ=XBmWK569p8<eZq*Gjq>SXIqVlXt4au9/Kqu+iA/Su\Ma@J
nCkLlR $LuL>$Rt^RA5@=L!>GRQJ*$TeZ$hE64#S?:mJYI+>y?+!aB4YX:5idB#&LL@Y&*^661kTKL\5KQXNwE%
Ae1PY: IJCHK#lenni/N$BlApK=RJXnbe6SA9EQ11Rm&qW&kQ/cW#6^iCdI8=81*t*tGP!4w/LhPH8S*/?>By>c
aWc=By ^yWT:GWjkLW^GLHkbhCtITS=:ZmyZ=RNni*^\A/FDK5dQNlDdH>^ZR/Ia>whl:5Ti5t:^*W^5G1Wp?EW
+8DTnP >Al:B=%5a\8b/HhKu8qV&?*16y^p+C9HGJmmyX@p@VyF$/ZbJye?S45q41l^kaV$?4Ph:Y9Pc:CWDMA&
eYkcqG qpSEKyYnV?wbmcZeV#*KQBA1i@C#q$cHQd+pP!8tM4?=+akW6W&BP%&amV$heq61/t9JX/5WA=K+KeWw
?E##Y9 8FhG114M<K64bP4#85/%+8=Mew?!!E8ikWaK%mG$KXAF/XGwhMipV4m1AdYZipLPFX*nd&LQF<yjXGWA
AB%^V6 C8dI=@1W6+&ZBC%YbL*#kJME#Z=Ek6wVbJuwhlkFKYb8@:\h=hb&B?Xe:P9y96WI!ITW%jm:M6*u+JR%
VAR>6% AuhFnLCiDiCK@TC:Kpjb\iX5*F:4MDC?L5jiKHeVd1Dqw/N=!CFJi=@AXCPS6FVYS^*c18!5IXj1tNVa
t5&khH WCKVctCAEmNk*8cN:1hKwld/9*qZIapV+wGV:BJX#1VTkK+MLn1kQaNca^:mXq1yFTbmu<Sk8wFR:I4R
1=b1L& Nj=Xw4*lAZISRhC?Z9M14K%*n4*4JIKpkME!Pj+JH%#ZaI1\jkp%ndQyGTnnEWID\*9w46u*pnRdcX1L
<X>ed1 ^u=AKl+$EKS*GF4q8:K1^AAkVZB@&iauYWKK=+p?YAtEXHw6pY6kX+ktk9$qF/bpV6ZnDqc9Vc%eXc89
K>8?5c 5FK%88BcquBVaV?m<yh/=ZFWmyaieKXRynJLMK@pZyJl?XmMt>?&S5WtMXImGAb\1#b@V+4S!#lZ9mAa
W9&D/t pQKWuNmWBHu=@t>@WCpDn8$Ic!yAydB+RIHJIZebNW*^\kJ%V#ERy^6SVl=*4SZuwyE%WX9hhu45GyLw
4nK!RW 8d#wqG9hiwRSIGjP+wP<li9Ylc@RNR$6?jMe!ECaA/ll<GBiVM<9HVjcICFH>I#X1&>5C\P&m5B<$KLE
k5L*+P 4WqbA/Y//St$MBM/$eYqZYc:I$cyMaNwc:@HY$LXJ?RNS\%1Q<#LmaNn%Mbkn>Q6WlGL$qa$NZS*N?4Z
+A#iwQ AViy9+kTVG@lBEMcNMj%QlIK!qIMS@@1<JFlCZTeq#Nk^Yih@nQb/$4%S?iwB\ebuS#AJE1y#nl#G*Q#
ly*=Sy D&%$b5d?Q@teMEXDRkaYKmTpLVR=8qJZFXJh<VXY$PwHwiN/WJF/q+:Pha9Mu%HPBB<QR$\!p@Yn^e8Z
Fm=M!l ^+9FT@thQIlTa&>Rn^/kN@ZB=yW%eTeCH#!juwMI<PI<ZJAiMwVb<*kh?$DP?ZV\%hmd8E9TlTE>l>J*
-Am1hb 0001eba222a001202b3 Page 59 of binaries1.zip
?qw+B9 $%*QXT=CatqQkl%qGc/#nheX4>ec<$w@&?y69nWhNa=FnHtQ<??TIK9E/AAIM18a@G1kHYG<846SqT^a
Id4Q/K kyA!+CTiue&YSiN=ZQ5MpJ!KWD?diN:Hc4NpP#PN?TaENRHNdiL%th/nhyb4#TyAPQ*j?^C8w!^@^TTS
a!&QN@ EX&h15*wjCE$>AyJV9LmDXk^kBPR&yR1SINBh5I<ElI\y>\Z%$FT9&E6by4/?qiL4%=?Bd*4a#Eity44
&&Qkuk uh4l@QWh4@aW<XKK&M8iJ?AdCtPkmZh%p9dV<L9GD1h%>#HwqGKJ$L8Ct+SKKXIJqMFyqW5EKSKL9&QL
u#4u6I <RqY8\mmmTKBRB8nuLZeuNPG<pjET4Z8H5h1bS1$+emRMKu/pe/&N<*XZE&>4?=wAuS\^4TG=4DC1L#9
K%$^$# &j^:TpAhtVkDQWe\K1:BME*<I1mwIFhXn<FZD\wkMeGhb#mS$4u*tPtRY\%u?4@%^y#?\:tqVjjAP1XG
GqkSyW nqMHLNF?H%^BR46p&Sa*H8L8XN:Wk5\+KqkHQ4wY=qV4ZYHk*c#\DEp1dP4qa8h+<hYmq8@%w$jLGu9t
K:u6^N ?MjJ>&BH!aTZF&LGeypQc4Hl?dR<t==jPH1kL4><ZL$p\9WR\A!MZ$C=\GTAilQcDt\kY4hl*bq$qNIa
SSVjb! dtCuK+utR*GtLD8+I8CAYY!KwpcNm@HL?%aXhJWRJ>GL$a4Gy1Py64=^uGi9d*nJPVe\4*Wa1EmXA9%^
cNm*S6 C/I#9:RdKEb4hJd9qmBZiXbbD6q^nqH1:#D?e&K>J9tm%DQ6jD@TF=XIC@t\>Y6n@K:@+#di\:Z?BFn8
#%jPWa TiiR:QKRCp*4%$HtmHc:Z+qZ*%X?McNAmp//H5M%u:k#&4DG5<badRe$=5bVWL:@/K6R4<49/+N/pd<?
4dCdF\ !=/uMmdGP=LyLl#pkeS&Z$@>&jRmJw\My8pd%NcP/8I+$MLTaIN%wuV$>mC\LXVhlRA9dN\PMA<qKiFR
d^<<E4 T6kneNHqXlqNATdqtpI9#D^qGty1P6FJY*hADA>l@TW!KjPhGA@eK4Yt9y&4M\^R/8ye:Ybi5y8u$pJ+
%JH6\X lq4GwyD=Z=tPXLYc?ZqF!J9$yWu8p9M?jA+wt$k$#REL=b*D9DIK4CqVIYMT#4n@*:?lX?Ea4p^iM/C&
%>Tyha ?i8qWRi<>l1\F+LIW5*eNtRbS\FdhCQY%P&lKu&mc4/eh1Ec9kte:1Qy6F:WW>IITB!AA$a5A/?/?SaL
^eAeL$ ya9Lm+6LAp^1KKlD1dIE?tND/&APcdG:?FAyd#A&ecV=^^#MeSId8aZCJq>5kPa<Kwp$TZVG@%6I8/4i
:PYpla D^E!pwmeu1*wXJLTZPtKpeSqy6RqyhI=8E/bK$5*N9u4^#VhyHT*qn:CJFBl/*elaYLFD==X#u>KqBS^
TJJ/F= 1!cjSiu=byaH$e!ImbWB+=nYj+bVHymTJA%An+i$CM/%4Sm4ScW#@NW?6169/EBcX*yeTVmhia5hyVYL
+1iTE1 <ZW+L/@QPQQ&^R+ly1ypH?VF^X5?\VcL@quMWBbl/a%QX@5yMq^d4q%kc4CKSYlc!K??e5lD!yyIG#HN
ZYJ+&A n*yH$@44i81t+X\?IYRT\+1L$6?9mBF>*A^/lSEc>:buaYyLSFT\P1b%P?yVeTV9XmTmjb6*m6tJ<Wpm
Y%&C4i yXTby&+uS*aPDpie9KaTQX6*m?CkWtZHjDqtSWPcI/A6P9BVSGLMJjuuFRG+JMaui#LtCayl*!YH8#!j
G?ALw* &EdE?DDpNdt^XX<Kj#qtNl^VD\uY\%@N&FRtS?\epDBYKRu@Fa=NQ>J^m1/DNDlm*R8Sdd^L5qm44/\W
99qJV@ <!SS+a+8WiJkJFA6+y9W*J9Q4c/bXKw?SJ*9%E8eL/ZP9F!SJ:5d!MTWCD>lKZMBWWcj>ZwL<XkQuV@=
cQ5/kL lKY9Hc14TJ$:<uC<u!=p!ZjFM9R<1b&DJA/n$%IXNEw5:Ze5Jepw8jRSAVEu?>BcyyEXbKy81MlPGC=@
k=\/>K E<YLWWBd^YXV$CJYu9+tj@P+A$y%cP?4u#t4kZnp:Te<15i@u+>K>R\KtC6Y!6S<>^kS6aV5X@VWK%I\
L!Q!$t 16bZ%J1&9n:L##l?pc>Ma6Ed/B?knIYEmW$9PpNDDFV@h<th!mB+*Tp%EXiDEW^T1$Au+9=jH1=d%Y6P
$44wdh CEL\+Tp/mY*k%<l5qJmuNlRZl:9Sal?dwGJ$!qM*%VQc+^&Vnq>C&T@VtjBXe+nD$nek/$Y^Su4mm^eL
APuLE* eh=#QEGt4heSQl\8t=?G8H9JbV/*i5SduIjyFQCa%6+GuFkJ^lFSK%+9m4?8V>%btW<@lCnVGLII8uim
Rw<&%m eH$TmIW6CciS&mdnTV/Q*amh$TLHZN&ipy=aPw%ZiGH6Muyi1aJBuqmqe$WLym@4dpF:I#5i!pQkEdYC
ElPT%6 S8B41ut9?plYa8qSWwm\++T%CEG**8d1>MdT5P\Pj>#PiWQe^H%WCnb%?9L/A&lj5e59hY:TX!#LZb\K
a#BdjN D\/GYkGbInHJM+T5<m^WK6qDVp\q+y+PS^GFD>aN>cPtZy?mVpKdGXaC:6biiiS18I\Z:jVYD/ju?jH>
pP>NDH w/>iQQ>K:Be8aqXKbdTl5\u=>/\@SZPCCc/D:6WP?m<ww<yL*+a>!6AWmaT/eZ$J&t/Vqcq#$=?j1w#&
#<c/JH mXG/BN\i85VMRQ\FZuFhGlCS\>6=XV#TyNkXwjt^^=L*FYRtqVktD:MbZwK>H+FZtKIF4JGp6#?k!amb
@CmVRZ C6X<Nue<MddKCCB=EVYX5?QG4=LCHw6G^//?NaMyE&GCMNNHT<Qh:=IH@QCki=LTJwAuyMJGl>&itXt5
Dckmb# >$+1Ik6#PlmAb81KaW\B\>yW:GyR%iQTN8\WB%L?PINXam8XVP<SQCpSJ&&ZX>XT=+RAaAR^^k?uQ=^?
hbF1A/ LatuYi^>De%N/1w@pq:VA@9qIpqYWl?#4EB#=e/DtF=i=+J+*$1LHY$^%8WjMhZjPPlGjqSPe!y#=ep@
EjwJ5Q >CA$%%$=dm#\b$*?QYAARblyMSMmT\I>KmuPbpqA+:XqBbNm\NANZjB81X6#N1IR8<LIjFAyaL@PJNjN
:awmLQ =^%$15aDMK+X=kR**E&\Z:RikIqZ+ph=MFC9XyTd%aqdd91@AitF/\pcZBpKeIp>6wucauH1+:5cSeXY
p:WECk y!iHI$mlID+Y!qcpR5A4JE%w=*eqhtLMGpiHw?kiAkwPlWN=81KH#!EV+6eFjW>Z9t$euE>jLmCA+?5y
CG?J\I T>JyaLSw/@<5>=XV<EYMV=p&=#!q1jS&\:tL<%<<Q@NV\84SJkcC%XVt^nH\!1>uEpDQ=Eq&QQZGWaqX
il9L4E kYcI*QBat?kmT18#L8$tNhKF:n86WJ*ijDLubh&YwwMjA1/@Z$Mp+cyILZ@W^q&9CAHIDV!::4k\Hl=V
AS:jy? nl6=h#6SYQNDjML@ke&tXJKkR1C<TLNA\k^T\eMN8\MdLm$</PD@YB+Mci<T@/LqBR#kjtYy/t=LZ4TI
HqlE4i hWjDk<F\A4ycT9ey%AIHyP6X+u#<EH<u\XR/n/BeKFS1p$>%u*^YiA+8hm+8=@?y>:ZSZE\Zp9it$@^e
&Tli/5 FeTtXJZ!?WKX*J!&PpCS\IcZSLWT&ptXB1!G<jJ#alwTuKbM6H/=t:aweTA6?@&ybl6TeZN*/FX#NIFS
&uH4kI 1b1kqTqjjcPWIbGdjBl?4El?*Sl!9ZV>V#aZS81QpG+!nKEEA4utIAn\NG=D>k*/G=:uaQqXj\L^d>*t
hB@EC5 nqWlqeeDZ1q*nVJt$*K69&c:w^4G%j:9>ClSm1%/RFGMa^PaBpDCGSe<1CLDi&ZHCSW4F4Cu&e/PPBwY
VTnQQ$ E*VIwGGNnF>9^i4$+HDm!Gb6V\<HB:m8pJhMYwTZS$&>l9Q6<%iJ<EGc5F&eV=>LVZ48$XbAJ%1BQKbi
yt<G?Q jAY\yV=c5CV*@ZnWqJMVbQ**L1cluPJqn%SE^i1#^E8QaZWLwV=<hyR#=ij?dKy/cq16nJYAJAFy5C1W
l&N<a! nKTWZ1$h<G/+WkWQnt%$XmKPl$Ql4E&L*nd@>BZuAyjqbdIymyHHM<=1=Jq1KuhwCZt1M#?dBX&RbFha
nk?m:! ^9jWF>N&Z1hGVq/9pMcqS9LmDhR!uqMJ56enJj+4>GbQZuA=#^pd?VPnh9w8yALqluJCB&k&kC6#?&DT
KP*pK$ Kn%8eZWu@tXZ8\bTnIE46AJbI>W*<jqK/jV9L#cQFllpVLjQ@=N<GPdjmyju$^??/D&jBwm*I/kTwM^<
PlDI59 KC&H=*ke^Rp8k&DFhWi+ATBRH:y\<a5Tn=H!yJ1uELlP\JMAw/M?/HwRy=&/9\VFWAC8mddA\w/beG!/
MVhX^k $cqi5jGeTbF6VuqD&bM+1kju=BC:td$cjuihBk#4I=twtdpk^4#6&j&+iYZ*QPGwEqdBEhdtj=+DuNja
6<nI:M 16L^E??^5jaqn5%/*VS%^QXItDl4Tu%n@^@*Tip964^BT>wPaRQD9bTA1:^BeXKANu^:bE?HClZh1GJm
c8Z6QF Pt*t?!T1SZ>aTH%pm$pe*eClHEYF//<YYGFhu1>ecn=5&HTm@ntZTCwiiHF^GZC+*bRdkeTNByKKJDLj
k=Mi^? \Q#ew<u=PIW*Gwi/:8:Mu@tTIkApm!hqYP6/W5T5ijqL?j&KlNL9u:pyKYpNV\5yIR6h:b\iPKbepS:K
hRZNe\ GD$D%%M?SdZB!qam*ub&uDkb^ZP?iG%YCp/*GYnAGA4q&RkK5MNRD$#p&@k5D^KYdV%LmkAJmcP/WtIZ
^kh%49 <VkXbkEnDHduZk*G#C$QlhumMkK*+BBqiKE!#\EA$aV?SKHRpCtBW#lRcR\KP6*P>8qphK4$NqSKcQV/
t#RLMt <:&PNFelmSReuw!G8Suq+#HCS&nL>XlYa1Yh<@mc&&HShECuY:^auE9#h\G5YqM8WjG\lF*#tw^&kc6D
R*cL&V j5de6K%YLnEt*hb%MGl9Y@h8\MaCG4upJdJWi:Ma4y*BB/e8A&5nIeCG^#Bn#Kp/V9+^PpTul&k?ubd1
Ci=u6: a*Khq$=P#?c#a%R^^&unC?n>J^*BY=!B6tPtLcMB&wD@=:D=q\?<pT/J&@^nye5>X1K=qEMV@B:d\a4b
+?mBl! Y=:V9tYbKwtDGDjQ+:WX?b1nYbXRZqKWRWwb5BhjW:JMGwAnV%KT8qbi!9e=\iFSpnlh<ZA$mi\DI?n&
Xe\t?6 !M>?BZZ=wF9ca=NwS%K+DwF$CAw!I=HFiV@R>h4=>:yB>@uZ$%1KtA9IQC8lI/e9F?\lDaM+Th+RPXGM
Aj@4/$ :Vpw9nE&ZpkjeT=jy6n9QSL%AV$aPVJX$XQ=?c!E>cR$Pl%4apt/aAy/ewpu<e4>LMVdQF9>E98SaLRp
LX84I@ RmebRCAqV9Ph#8i/!Auj+/Fknwpbw^9?%cX<uHqVXhLPc?/Vd#X*nkm/hXiB<llNT<&AN%jk4!+\EVBX
aj/&y% <I$NBt8bnd\E<ML$j<\mb9=HAMTkjLGV44jDWtLP+%KyG9lZA>n9AH\tdVGITnZV1iB$uLlpmZdKR\&?
<8dTqM 1H%\V+?MPM\/<KuR>?8X9e6YXRM/D%#GY^hVKWD4H%+AM\wLTy\p&\*8#85/X/WyaBbZIJ^yjwc?eRp=
=c%y\X B9FAeeGT\YYmC8:wBD1bI15TW&hiBYQ@q:/:EnXGj#MtI\#Q\NPG/e1&:BcXc\AXd6t%E%pc4pEB@nYe
E:ti$\ VA:+P@kTR+RMlm@HbEI%tDTaCMHb+LcSe4NlLdu9Sd$$H/mCwq/i<eJZ&w!K<&ny:*M8N%5+G<:!>=PX
5+SMJF >eydYyD?9?B^^Cw\lk55XQWe!VVFP6pLPMWG$?K:<J%mBF:cHhRty\@Jwqkpet>mD?qTEttBwauEWy&P
T:QR>d yP@j&ac!u?WGD#G*DS6q8FCH/mY+p*n/\VpMPIXFANltt5M<Fj*eXB/+ENXkDApQ&FSRVIM5Nihq4k%e
H4a!Y5 IB#apGMMY%@K6QFmWNqL*N@AJhM+X#%yle@pmiW!6>&NIhZbe/JaTLMQW65pXV6PK+w/:*1A6LJHMJ%J
-ACSp4 0003744d22e001202b3 Page 60 of binaries1.zip
KkbJ!L D$FRKKCldPZG/aN=KCm/98ZiQn?YSmIL>TeW<!Pbee$!1TRHGd^RZyNu<&1PLuy+*Pc*$!T6%J@FIZF4
94ICBq &QwXMNd<<%Wa+Q<X4!u=Q8FQSIP?1^Mb?jjQyCVj=$*uBMTq6qBX5Cb8X@M4>^Mji!<%qJL:1N/>5!$G
1hICwK uICwW&1lEu*dm4#p8EGQX#EZ^@d^A4Zt%!&P1aD\\QZyAR<t\E:lTH4GpK:+ew/V=IH+>5XW*uF/XtyH
%\!km! SCLWEbhN#qbJXIwL&^\1lhJQ9R@A+ZVMad>XHY%&kZw>T@q5KYV6E8hp!8YGG=I!daWh^&c+p\jyRb%&
KA>*<I EwB^6@tHj1+M\+Gpmc\9$I!wCPTe4thY5GuMXq+iRdV/WclQ8Ja$*ak<>RpY464I!<DbY/b@#:5tApVE
+:Nim^ t:bKw$:w?:@%@%Z9+?!VNH9!:dR6*mE6S1XWy!lEYd$e\1hGD\8Jl:luRw4FNG=XJ!49ItVFSPJ9yRpe
<\uAw> HjB8<PBpND1X^IRu5QVZ$R=h+5G+nBeSP@*>eDu>+jReW&kEcp\RhyDjNBpmA:5Nbe/>JK+D+&Z<Y=6\
ayLAb+ ZhYpHidND8Rww*5&<k#ClcR=SByMqXh&j%FMeFbPGTINbTmu>m4=YbP!wuPe^mDPMk5:ep9nHWDZB@YV
=tw6EN iyq6h+tQMl4tI\CZ\ATeR>$py!aXYa\\KcAKD5a=&?AwFh9jQ#wYA&b69WP1MNK4=1*=pI6je\bASbk%
NY>m%* <+w\Z^#IwBwcp:aIc\d<6MI$8CIG:j>L1tL$AHN=<pj^#&B#NBpqhR#iQCTkaYYlF*YRneB6TRbyLnA\
!n+:LJ lqQGaMdBbjWSPpLiEmKTa8W+HJ$khY=LNRQRLY@HD1A<Y%:Kq%TG<+9IQXL@<1Kh95tdiBkQZuhJ9W#E
1wB\?? AF#Em!uDJyj%AD#Fu!EQPQ+Y>KNBSTMRR>q^ew4A9c<n*/tZHHnGL5??n/Gtq*BFPI6mdKqItWB4>MN:
@!Fu&M aQ+!LGIC>GF+yIm8I<iAP8>u+pZe&$Q^XwH+EpjjLy?SQDyGu/e?\nP:YYnjqk!m&$l$FCKYKQy8X6jI
$?8qqN c!bQb/Y/e\BbBeXjjJ8@!Y5%4XH^>*ucL/G*wMBmnyHwj+D\jY!K=Yq@hN1P6k9d*Xi$%d6FPN%u?TuX
\?Pu*G =\Ad+JR4PZmn+Xa+aL/n>FBc1/CF^Eu&@8HJhk8yt9$SXYt6?hCX$#A>S$M6q48RH8DmWt\qSa\4FSaD
Al4>PG c<WD<1k+HlTZPGqCG$Ic%hCw4nlp9cZP?bdcqCKE+H8*J&cEAIltpMJ\/N%LIqDHpAd/C!k!uV@n=F4L
Nd>ah1 WJd>ZS*1Kh8t*aVE%ey^i1GTKNlwEKYjN@WG#&C81IVAmjpBPeeMnRk8App?nu#8?LyL=a49!?8id^^u
<lVVGe L<WdJa:&kd#b!Auw41XcAYXmm^QZTJLcZA6ZQhbG/!1bd!tN^A=q$aFnM&Z@X>aawlb$^H/RquAjEE^n
@dS9?K ^GCHJ+eA1TG1WkWnc9<?ADu:Qln!R=Ywk1yN$9?pZWFd4E?\QBSLdEQBqq^Tp*c$5:?>jRAYhkN6:\>!
/X\^?8 <eT#1jnGNGL>h!H&9MBMDTJ\n8\udlG9qXSh%*^eTwi+#bpBX?HAyMeP5e!\:!dY61N*WDkSqXh!h$@w
+T1SQ+ &luY^w!wmH^?=KbaKyqe=R1=p<l%5M$yLw>wpKR5+H@QKnK&TTlF^AYA?>1nPu8q4wD<mJJH&8!A8<!G
YtCIPl ?pAHM/L+iR?MB<t/HYVhVG1V?\?!q@W:m49R!R%Z9BkeTAFnFIej<#eXdMmtZZ@K!>R\t9=9LyZ^WpyR
aXtRia 6QF@Gm<DBBXScM1LjHBKi8AIEbLC5k5<tSV\\wjydBAMCaRyAlu^YhJdI%dKy4NiIARK96PD\bBSXI1?
VXX^t9 LW6/B1p?t9QdW:RBGISG&w@V%*IS>=H4?PTmJ&S4n%6ac6t+lBGu/RDDn/*htI#!EXX6:yKSG\w5*E#+
ueX=58 cR/:mRiPQ/iRRn+qB#RHHGw+1/w#dCBTE>Ht%!R@#PjNQAI%HG#m%IQ8Y6%ZlEZDp<H6J*C+GT+9&*mZ
F/iR@u nLApT<d^Wa!JlMm/FRjM:\&RWRJBY%@h5dZtkdJ6nkNlei^&LSiRmiGY\>iEm4qc:ZKt*j?X*n^EHYiL
#K?!%k <#*lQhw?iuaHP9dl!cEp9EqV*MMj^NGBFJd:y&a$!EbD:mS+5hAYT>cHKGn$ZFS!FY5b1Nj!1AJu$&ET
&&^%S8 Sl5QM6=WuABQMAc1e<w=!4q?F@NhKN!y%NM!+u\Sm&nBN8/FW4$RYjATG<GDBN>&HeYZiN?1>jKJ\>IP
DKup5b ky6kS<F5mcuu&ZSKXH6?MPY$BYC%NIpSk/pD/Dhpu\?Ni\1!^Kjp^Ta%yq/mHeMAm!\FWHC!GZt!GEnq
9M#%k8 %j!Sn#ipFMXajS+XHTAjWayd5=qu&hH>w/G<@*h#4X@!V9ebRj6^A$RMq+mJByXdw+RXSi#eanX1tQn/
\<&WZ/ ej/eI#TiQDn!1GF>$I#8RQ@AK49/\\NPQKW4pIc<LY+4mmdmkK<wZNYJHX/:$911qIZ$N5=6nX:TD$eb
aRCpw% qEdpyX1cQ!6STy#lZKjW?w9?nGS+ThPXwJt?bBNi$a\wbPCYuli6T5%A+:LEmp8H+/X%I=<E9Ah*WV&y
&Da*F= 4At>CXdn9mu@C?Mc\\>&nMVhE@ILkD8?PG</B&TbKm>6%VV#u$bG#uKeNn>\RE<!9RNMZYb/95LL=%pd
h+HAyc BnPR<jADq*N6bQn^BkDKATF%6DnKaQ=ERSL#yd*4EuC:iwbY*!l4CydIVZ:Z/CC$A+y/p+Jy&Z?C>k>C
Ik%#W\ dlI?q^SHeJ^Jd=uVl=BHLIb6<X=I+<?BNBnDp+GBuDh/9SkLeFGaalGyNBP\Ka<+D6$l$JRXwG*MK4B=
qEkqwj IK@9&Zd/ZuuPNXG!*C?K<$u>GT<8GDyS?GAiG#BQILP$<a%bqu&mI:B!IGE%VkVdmI>dNQc\6JDBwKKY
#I$6L6 W+\VytdNhI&8X8ejpM!TaLS^YlHw4w*=VhMePM&pDYw&9*G<>LP/wX*Yl+@1+%eCZ#AT/dTc@F*^5<hQ
8LjwV# 88YS6u!^&^tmd%@cuX\9&eVjnpK>anC!&iSPA4YnZZNp?aZ$:JXpEVhQCaVGlZ9nmTW^b::@a<\:@!l8
tG?bBq Qpu<cKn*IWn=tZmSXCmu8Am$+STt!maYDM+QV$EdY^E5cMYB&6Q4/em\&@%G+FJRiqbpGAZqByE%lb:k
tyC6l% GHPIl%nT&QSM4ja%68+aY?/utHpyhThtu?qmhI&NJ*nBhkJAYPVwyEwDib^yQcq*ebq9:^T/k!@a6Aic
XBK&=1 lHnbb4wcJN&6w8PK?eky:Tk9+ehYC@5p=1W$B=mu#c8&\dPQjlIXj5bST/m=eCh6JT4LDqp@pWA?$/5#
Eh@%+K E46+Jiy$Zn@pNcQC*@u^$hH>VTp\@&\GVnG5mVnwWYMXXXXw@Y8T9+<VRpcBcEqpHMb5VQ?jAVkBS%5J
h*/ZEu EJSFB$Zc>HT$JEamW<>ACyj>\Tu?u>R\kERXw%M$XaWC*5W@6^WNbtNqQWu9D:n?BiNbYjDE#m*hP8EJ
qw=46* 9y%?iD/XH9&H=<C=AHD&m!qcB6R5kZj*CAKT!TkWkHKMM#JTX/^RiQBDic:q+%91Y^bYnXaS>ejQkuk5
P1jy5\ u/q*>tCKt&m<Xtw\K5GPp#kii\N%Pa^&\SQ$XJ#8Khi$4h5&ZA8I:cVFZkPaZ1!@Xy6uuRnZi\acyHGP
lRn?\J eCt>CEbidl+/LR\+*dadh=m%=1ku*j+/::N^ZJE/FhNYN<WbhF=A+u=yK<jclMBP%$6/upJ=kS:<Li+T
?muqkF ^G/:V*Vi4KXd@HQMh6*XaGE\wh+=%LKVMP!$TameSk<Gy<T@wKll/AVQn=l*M+&9yj:bw>AMPH1\Qh*C
iBtHTB yRukC//hL5>Z^G^Njji<Q9?cwMHpjBeZbTqXCL1+Vbe/hkpLVl4VHN1Pc=TwmQFdqXa!GJNbpk^Bpwm:
D4ZEmI InCihW&eGAYZl6NyP?*u95ujTVLKcWk&V66b%&Y++JdmhYDe4F1*k+QLdMm=eXQj$Dqu4de45X9L<ph+
*C1BI5 I:JVSJDD9FMqE@R$?:DdA=6<iGTQnyLjkcKRdwcNMh\8Q&u6J#+hdbCL\jI#wpWkb1qdTWkE/9?LJXEP
t+yW8* 9Te9=THjmXX*8l#deMyJmn#PESMYVDpq!Wq6?dA:I?Q&Rh+G:N1J4uJTVHA91:LAXc5HFQP1P+YBE/um
Xwn/mW p>*BABt5>N/j6hN:=%@@pAH$c*mmimCT+jRZA^k#Y4jGGqK1KhIBimwmWM>+Vj9&?AGRjSkTKWpIdEj8
V\=JjF /P:=h%MjttuQjR6G#MF$/!mLu4T%p?Twn1tXqS9k/<w%#j:e1TTt9Mw%GEmdiw*hZe^*KYRaP4wK%Jl5
i?QNTy E/m6PLWi6&?9lC?5H+&NW4R^>^&BL:bPhQ^Jk+k/ZHbEQRN8QW#/APBm!*TqyFA!:jn!+ABdi5+YaX%y
ATnWHl A#AtHRTnqVqe1ylka4p6>RpGMA<6+!j8ea5*J/\4:cTcKN5wCbt4yGY+jWXDtHmC8Mm6ZPE\4FQNyYZ=
\c!#6a MdE6MN9ZQEKc19q?<S\+JNA%ZYLeGX1*4@EWPtT\CEVc6qYaTHWb:^EuDL!tBa5m1^b/IVT!yRiWX9^M
@wLuut uybt?pp?XT8PVcik=/$Kt+&yXPk$Bdd8DhT&qSTcFbTGqVp6+XPciuPSFBCd@GnGQh<XB^C5Gp89+&>w
A$Y4=T +*mj5L>mqHZHY1uJ*\bl>FGi9e#Wm1F!/uj+N>1<6b@l+CYunkc/#F!9C#Z=Tce?%q+hl84@m>+e15Ew
p9nB:* NnebS5pc$\6N?h&b<qiIF^LjA1LR$WNLX6GpDM^4NE+&l&BbQ\ZbCN@@RFqBZwqP+DXQE<paJl9KI?Wc
hJnq5: Q###iw1LT\p6RciyEJ%PL#FhCX\k^ZAbuF/%eS@w6Lyy+uGq8qPKJkVMSd=HR@=5XVmR9KkKEd+<e?W$
5%V&mm u=d>/Xte:8Q!V8uH^4!\JwSRwR1e6bB!lKy#*+Cj*L*D5l?*ahm/Q?LcFejnZV^X&JF$8jITQ*pYe>9+
/T&t*? G!A4Icbdlh#q>:iX@hS$Gt$9n#bjHk@BC%\%mQwGE6QmQy<D>1d/*TSnIF5N?+98*FN4WmuQ?:?JaYXN
b&WJ61 <NpKKTi?y/j5M*tqb4nKkdpaT#FyPS#w^W9B:RJGK^MicPM!ayjJE+5>$kI6RXtR$BFBd$CymBb9EhGk
t8\Nwp NSbcP%n8/?c<N&*Q9%D:wRchAp4GDT:jCI?YD4D=B?qImc$iW?S69IHKNGP?4&6Yecd4N9tXqBjmjtjL
F/Pmlh /ZhKn8mT@eb5#DwcF1?=$C9EmSZNN^A:*AMe\+pLpcA4%kBNNQt*&ca@C@+X=1WEI\ecP@uAGMu1PRSK
KDL6py K8BHd@l^h+$Q</H%c:M@m*Acyc%$dw#B9%ZXT/&6VQwGNqN!T!qhySm$HBPTQw9>Z&jd99i1q1t\hX?G
TX?/=/ FS@KJl!m5MT<Y61@$iHwSLH#a1/hwQw^GJlJm+khlaX1bX86cpIXD\H%C:Rt/a^PeSk4E9C8I@41YblS
QG6XA* BjX?PG?ud<KT$@M4Z#\@t+cL=IZSZXQEqBwRNe//ew$$%bJ!J1*:pDyelM9nLNN^albTVmH9kb6PQ&Ra
9^i^lL FX<<R&&k?Wh^K5DlyS/\ejiw>MPinLVAHNtAFpGQP%eipWTLIZEhEE9kN>>Dw5=#H6CY&E6Gpq!T%bV%
Fk:FW= 1F9B=VbWlZtY%tcH6hR$eC\^aGXu<@qnukJLFGXRBT>/V4WcWJIeI+#KS^/Zm1jZ?Z:@j%nPMi9p:1<B
n+b=GD tEHQ@QbIPpJ!n:?LGjcZ/wWkdl*5J#hW*KhNYp:kt!hyM$4almDEWCYymVuQKKCI1R^RP6pPeY<!E19Q
N$MlLF CI@FW8kYL8NLeV:Wyywjy&Lbk@Q!+4JWVG:J+&Ywlq%Ae+5/aRCQ\#&4qwJ?kaW1i4@Y9+Fhw9Ij$BF$
-Ae:Hk 00071d9f076001202b3 Page 61 of binaries1.zip
&4adu? 4\+MlX9/V^!6CY*$5WKiW$?IMpGdN:JR6t=LT8^9KMQY8B%AtP!a4K$hb+ZEV8#QmdHMQ/y=D9dEKGRR
^+i#cW 8XbcaT!d$=KLq/S:CZewb5pAQ9\i%$lHJMGe#J@ByBX*dF+u/B#AePZt&E@Y1Gb^Nw@ddd>iR4E%>u<H
h?w^@G 9I<9PRJh<9lh>R^tRR4+Nl//!Wm<ej9pwS$P56FIL?66I#&kXDNE4cEluEC5/STEl9DpR<dP?SZS<4\D
M^HM\T YlC\Jt:yqnFD%<IPn9VYWFmW\8Meh5SGq&G%BAkWaSXdJPp8LpMePPpbL/eqY\eCKXlFZdaW9MGFWk@a
e5+Wn4 RTtc*wD=eY?X8uS%NipX#@\KSm:Vd$8Fm9L8VHe^a*P%A8V+$!ah6W/^FJVRl$Bm=ENMbB:X>TQ<YqJu
EIHVRp <6N\JjLd>S9ci:y=ST6/%eKR=/6uq@c9ccPibXhA*keAF?JWAy!:Di/:E$LAG#%q#BP=6%FJDEI8&GP\
iDSQjS Ra:#@t>nQqP#SmXNM#w/9ZaI8M<Dh&kBW^+enIymeDJ+mElK*4Y$#GWQ*^d*kn$>^X\6LRuIiVJZwAYF
Y^jNp@ J6jIdlunlp1FTP4<$+ZTkCyVAd+tKV@Pk^cy4HlayX=eB9^$Ic:Jc$Q<\aX4T1kbZ&MK4Im#D=nCLjFT
yT1GkF !a?:8n/!yJNNdVajq@GGiL:EX>@tR%lQ!^6q5SkuNm^>8pw>5+lX$6YntB=iW9Gp6u=u\RQ1?E^9IiKV
Z=Wbt< cF:4G#ECP\RykK/pPM\&GlPYjq*^N&*&e*XCFGa$In^NauRDamjiS1D?<>%Q!I>n?S9^*phy*MdIKy@9
HtS1&4 Yi#@Kt?WPBD6!cj6I#j&b?KL>==k6qWRmVcctNHl\cE6FEWQ5?EaL?ph<qmWWB15ypD^BKV8K<%:/V$\
cVdeEB %WbNIy>4R:6HimewEnD=>=6aFy^LZG&uN<X&eewpCH5F:CiciQ5TE>N#kJ#KWwZ9YI*hJ/WV6ciT!XnN
/8=ldW SH=V@m%TwiGQ#<1%KT4mN9?T%\>/HcnMB$S:/dTtbE#F64nT>=bu<k%mcPBA*ASJibPZ+RuW:w&W!4MI
He%bSS 5XD1PHQFQ<WY1e^^Y:amV$V4X=&htqYkl*Fc5aSHc@5Pw!CiH8j5/^Vwu*TpCBLAJVEI@QnJl+npBu#L
S5+5G6 <5I%<@=9wpp<uX?6%lIDKJaBCFQFEJID$mEC&*p/ThiApcPcT5WK1dViF88B?566*GjjF9TCYp<Ld%Tn
6pDYiF +YA+MqXTEkX!t@nSY<yh!bNMDQAJntmtc@VAJ6\4yc*AdmJeqPKI&B=h8w5aLmn9K@/&yIBt&8ZKu>\C
T6EjVh AQHM/X$iME$wMpGAkIEdZhB@=5+AeWnMkKSqN6y?Y/64ZK6*KLkKVjV+:tcq6EJ\%bw$*DYk%QIT*nJp
Ti^R$1 qp^hw9SPbQd%N<deB9L4$Q:CAe4m4=5/!S/TtjSBp?>R*d5i%nZT*B*k=+*PRc*Gh:Cl+P4+Fwc$>VGE
@dj$k5 K9k/IX%J?hn@=iZ<n?IKGdX*!GiI6mLM=MWaeRq^Yy!iD4W^JMnyVbKVXD\MNFBWM+u=kNVIKnXLpuNC
E#aS?Q 9EebacTVTtu8WE^F$y>LDL&tmNPRRISN&JGkYRF8iBt<YQ$!a6VG!1YE/$ZT&LCtjWYDy/!GpkB9q8cM
+nSTCN J$By#+D1MIJ%bGyb^/^^6>dtu@leXiVGHd?n:$yH9b6A@lQDNY/*5y*/8nF6%yNCby&6@RR5uSnNmN<%
RIP^Bu ?j5VnbwaW=h^B8k&+Byp*&Ww<PbGh\qKY=F*55*@qAbQd$JN+Cj5=jZLTaLi8hjcl5Q%+%4!H&nY1e5l
+85=Y# Wc*@P#^q$VZ8?q\%jiJdi9?k>?t^+P5@MBM:LEa&JPqtQHn*XFBh*8T$GF1&mFY*w$6:ZjVj6^F@D#Ct
154&ab &^tF4mdXmSA<e%N@E/qL\89B5CdYk@jjpLIq^55Th49p\D8&q?@JH/Ct$cqhTb^M6+?@=FXeK/Wn\NiY
BeNEBB bN86Zd4i8HX4W$!9EeZpXh&dYtu#>jyp:KG8nFA%JwuVPG$yKQppV$WjamPequ/4+GbS^\FH1GNAZaCJ
*TJ>/? Kj&9N4NuuLpbQatRJDkAB=Ji6nN@clai?#+cpY9mjb$eEKZYDp&eihAleG5CMn=eSI%n@k=*Z$by9S?k
=Thtc? E$Fyl>V$dI:9@X@8#j>n/8#ZKSml$y<wZZc!\cRCy<AM%u\4<MWt+kI>@?uRF1NCGSqCyRPV#eA/6KN!
&<PE>n 9m+%LPa:&!4cImaL&MZ1N<IGL$DaNF<XF/QkE>DcP^jmaC^auQ!<Jb@=RkwZjMk9L>phatAYa8h@mjM!
8!?Rdp wDIlmkuXJ*BL9yq8P!*yJcl8=N^W!JQ@u+>#BSCT5#NQKA1jL9m58tD<^uZb4:#TckIR8$:uLB:%T$+W
\d^?=H hwVR$hK<ucc6RMVa%NiZcj$lAZED/CnGkA*%R&Zp455&9t<p6iY+ETMlutFilq/JR:tTXC&&TEPuYPnX
$6%wL: b^Ll?p>cVNdtjckI*1uIRIp&k9ybwSnI^^#a^LC%qell<N/Aw^SBKp+\+W$1=eJD8/diXHeE#1PD+e=w
ZVly\y ImYN5p!8XW1568EWFNmGdXDjakeB#%/uq%*?5hR@tF6H*W=ey1qc/ciqi&W\<Vd^nuhL4#6*m$b\nNh4
Vqd&a9 G5/t=bqpP<p<b&/h^*qT4u\/=nE<WL8=Mw?V#+ADI1P95\ILQEqHucw^4d\EdLCQTe\YGTZF9:D<LqYL
mcXI$W kFAhVLRd9?h$wyCVRa6MY=5h>L:Jl>$NNm/i<=!eI$yVk*Ay\ZIIube4DACJuw%J5Ph%iW+cedNj$#K#
ItQSa\ ^V=*4mFI9KXR&6et4lSl%A=YlqZR!Qh&FdwtHNBPVGa+jqEJAND@XF9w1HHQR6+tSb96&p=?q=>kZ=&%
D:>i:y $wjWqiJhG@PP!&L*qSwQ*P$ccP%k#M5ptD:Ry%jcqBRkL^Z%$4n4CnG#BG?iuatn>SEi%/ZIK/i?:/aT
&#\dm\ hlLRp:YJ%=eL!BhNhXn9j%BYQ/DWcAH8i<L>YD:p&hE^>Zy+Td%LSq=6%lHt#a+mXKR+K<ikBtGdWC4D
9klH@? wdlbiZB%aea%Q5p5lk1VAWcJRdQV+ALhF1wT?SQmqZV!AI^FAFD#tdV+Wp!I4@X@BPDEE<!!Z$RE>hlI
u>N5&i ^6qEI#C^IZEFKNjbt\DuWqyTQGk\\4aR6WtmVhwGDR#<:JK+y\bFCkXD#IRHkW1\Aai6+8kW^4^5R/@p
eiiAWl %Ei66ybt*l8By4wEGd6+t9#NR*:eCCkM+W198S9Q@\LIqk9&=wSCidV/=^1iJHci?b:aDTAL%>kQia&R
XmKX5A %KjHSu8:1:$h=Gm?+R=RI/a<B&MY>m9kn<<@Tk8HH?G/X4eP5&TW5d\&RAQLl=RtFP@QJ\K*cW8#qmDc
N\hGXt 1:W!d*N:D*$tE@JQGdDS!BuW8wa/Ll\#hIl>pK%JSt9tQj!I&L?@INA&uSJw>kwlpMF?ZSH#QKnYPkM<
:N%Jq8 qPJqp<SQWcEuSwNY9I1hdd\#X<^qpZkN4pa88%hp#1e+\JSGP1^h/LXKd@+!dq#TX4lFam*CM>>%EldI
iS%*yS u>%KJ86mI*>6*RiBq\*KTC/B:&!Mbi$=<6\Xbt!b9%5V?E^p6cPV&aT8ql#w!I1P!<+hD19u:Ppch+Q6
Jc&=yT 8qhXmT^AnmHp&/bYb&PVyYKCYNlmL&/q?pEy&ybd1dV$XCKA*d>958//Bh=q\4^K6@H\b^LLtITIy=PS
X#c/<J ySD8m6LdBXX=&$CW^Hn5^$6mA%tqN%j!=5Tc<CZGJLnHamZ19Hky49lG^XLTRHGPC41JPB+DKk!!hc9E
5&eI&B W<>>*h&Ct+KEn^H=Vj!tlkMZQFy\PyAPm#m+XFwjCdTwRT:Iq<WDCu&!*p5u=+FN*GYZ*ckmwJ1@4h*E
XSQRBW C#DPyR&idkTCj#$QdiXX@ja+#=nITEqkPH+&CjGmC^A1iJIhD#YJjGp>mBE\^XF:?@1DPPPy?I#/Y\b+
L!!GqD b1m$%pyZd#&kH5yb/iZV:yahlq9!/W:c$ibZi1?ua5imwmypQp/*w4q!ZE4lYuIZ1X1pXp@BRV5kedJB
Kum:A* 5GT!RntyM#FcK:VXT6ShAYNct4Y*ub4LwFLl>/D6*Gmm@lj=dlJtq/Qi5B*6uE+\Np5G*dnWVSH\WF6Z
?1W11S Ppn>nqTRT#ZWp56yG<AKGy>eJ5VyhVdlER!FHEk*RFFept$yW8HkuYSAIIVhSQq+wRew<e%lF>SP4=&J
5j8SD? @%&AuNtDuKh%:&QZPCa9N5CAh14E=npQ@HVyL1&+\VTF\wM4qEY@ma@4FZRpQkQt1*>R+&\d*Tc/kQ!Y
D\nuR/ QA4RL\V:+=lFdApp?AdbN4#BX6+&uKZeNaqHFnYPXXJb^P/^ci\HZFwb9T@DtT=&kA=LRJ:5\&LQ<Q#Q
*c1Ret ^HL@#Z@RPTdXH?AEBb5$maNA!9Qq*kYFc<GDFDBq*+ILalW+G8BmdH5\IyQBcuhK4e6:nD4ubEZ4eVq?
p:Yq8m Yew4mN6%4I5CC^K^\kZI86C!+Z8qHFnqJ8MmYWX9y@JD4>XSMIBG44E*5MGin5e+DeQap>jS/=V16N8p
p5&WA> bREn/4m%&/1?CtKR%8\TQ1p=#ald&Hk%4yVw8Kpe^tA6*#dKPe499S?Ji=pc9C^EutD@$@ndHQ>#hqat
kCcbVT &lkJe48y/ibGF?@B4n>KuhdtQ<N6an1l+E1DB:5=X+*ph111y\mGeG8/%nM>9i9@I>alL?Z*m8P:XTWC
NXpnhV bBWbL!cA*W8ZXXF*%VGu+RKVyFqMZSRlH&SR+tS:^*p!TliJj<Yy/cnIa^KEAAWj@9*AA+bLhn6yC6*T
aeyBCt yZdJd*&JHp%n<RwQFlCVN*Sm\<9%!1L!AInGdtGtNLaTaMJ$Q@#mXN1=6McSA9W:?E5R/Fwm*X$mdnG=
ZNplm! e6Hyeam<^wH49&@EY4X+wNPbBX*JX$<1%I4^&a^W*uwkqL<4H!JC=^beEt#QTk1jq/p:p&R&yl=B*+jY
ZE#96X jDehiXc#\8jhLDK6EHX$A%6lKMiFkJl%*nbdmYIaSTMu8:$bABCSF?99p!YVJD\JWeCLIEIBFTBGc&L#
IpXZEN @b4mk=&MdF65hw#ppy\tw+MME?pDG=pkTTGS?AnEmKcRhKa1^qW@$IBmqPpG>kIq?k\MdiTZVd\LeA?T
Et&1Q* bmH^<Ji=h>WdFJJ9pQeRYT#!^JLjTXTE4a:EN6D1$6*AAXJY!tA86ieT=pCXypR:^m9:Fc5&*$$uk@9V
8q9HQ\ X5qciGKCY^hq*DTabS%nJBp!<T?^*VPAyJ<b*>&eeQ9nB%nZeD/yjC%qGw:5JqL6#InnAAPaw*GaT/D<
>mGVi* WHM1P$eXZbEIALq:BPk^6<u#u:dNe4=j#RKGT!w5>Fli=X>=HuhtchRQIHJ%u/B*DI/HEDpK^NYyXA1F
km$$*+ =?X%tMljuQJ8L:!Id@QTHRI&p!yWHh%k%**NeYMAAjuPpG9keWV5JM:m5n*jPC6%SBq*hLuH@c!$e8KQ
L:yyX5 F$AD^6+qNR1\h!%I+IqFL#eAmn+!AWw=FI$du+pnVFeqnduY:5Au8TPI>n5pbnHhQjw+AjNI>/EIMm4k
Fdt6$G qnwi$WA=WMuXE4Mq>*mPq6p<n6Ch?w^VaMnmZBEQaC$MaJ1bG1%HcDtTn1DqYmiD4:#4kc>tXc+6&<#y
C\dF$t ^jTt$h:RRlpbYGt\/\NFRY$jaKHt#W@qJhpyRbhcTiPGE45@Z$wQeL@DQmMAEw>=iuw+Gwp=WKGSRp>D
B&46*k KQq+eNP*HG%BS:ZT+LlBpyBbJKn=16:Ra*SWM8CmcJQP>H1RKlVi5*J=Eh4yKna%Lcl#?jiWG>9lEpAj
@?1$d! AB<@C?SBykB1KltB9CZmqyl5*T#L\>wC+C+P%%lPl1M!ebcw:S@tFKHG!dqZyk>pt\=5^MW>J>QhQk=P
eh^>9/ #yTFuCMQqM1wlAZEV#F1?qCqWtJF!GbP4L6!?Y4d\hb\nc8AF1NIM*<GM^5JddCjwu<X8Idc$eb<DeM*
-A5Q46 00011828b5a001202b3 Page 62 of binaries1.zip
N5M5qt /THYAih$V=6tT#\MnS*G>Vmq:E5u>n5wHR?j+QG&81nB?X%leGHcnk/HI?1@K&tT45ZqDh6m#^VmmEut
k&McHJ TPKYE8^$ppaH<#V*$tWe#:+&PAH4BN?4newinmkLn*jatj:\HJJEyV^d:bXYZD9@uG*DlSaw<u9!#Gtl
^mP$c4 bFZ@m<+AiEX4Q$b\B=EKB+%Tj=!N@bqE#I5ybj:pp>EYpFC%@&5H<mnFDJA8mpPVDpF6$$KQS$lkSQ6B
idMc:@ tp41eb&<yhRH:PI!5hnnK%In9jc/m+DyqWkpVbA=LT6BH+:<Xh>J$CdYn^ZYQ8J%unQqHc*@TZ<E6=^K
biiB^# +Ci@+%lJ!=yt>%tDRBu5nQ/&B8&pYj?jam9*kWyNIiN^@#dal=\yVu4I4?I\!t1l+R/R:RT#TP:AmdT4
j&ekHp TCta:Fc>pn168wGX+4wKye%hn<XkBIKC&=LJRC/A?&ZQIa:KA>!?+q1?JGm/IpqkG&>iS1XcXiMSt:c\
qhDKwQ QhQcZS%8ki\9B*cyqFm=FY%!H<1M!j>>t^T+LGjK1+PPbDpcLdGC+AGbK==lV\Pt9E65=HQu&*WY@+G<
=6LtDF /I?Wb&/bj%I#YH4=^?d1cSSFRa4Vb+DRnh^?\dVc!XlJ#p1!:*uThEGF\56PMZ&V:/u>whyLKh1dLcA4
>VcH5N ki5QmM@lY@>j6?p\HSIdBZucMZkeut^9u+\RMCjYeW$1Lmu=4A%dP8W/Hb/&w#Xi^1d%?Wcqk$91TZEG
*eya:> 5qF%#Mp4*Kq8BqV>?AqB<W/eHB!i/mWaVlVPCXcR4:e6!Sk^V<#p:!j:X\y9$jcj=bLX8^K&&/hD?^B5
$GQ%K8 Y/%hI@T*hjjP=GYey9wed\^nZGL&mFdS>ey*ZCLbKXXGKE@ZeC^neKB84/NIAdyB$+Y<%^6XTLM9M/?1
a=t4Jn nNKeW8!D=49l>WI9$V+Ctq1!8l?*@6ba!^diR*CTI1F:W@6>JLw?mEGPuwXE?JtE*n9TJuJbn^W<k*=R
Ennl+/ uPN^dNc1u<+=n+<</a!#c6d@>j=e&wV:dPMAAV5h<Nypj#CcVI!KEI56kbwPQEPIE^+4D=WCtVpJuD#h
X/mkdh 1/?LN!IcAp&^FqZWL&%e%@XN*y6Zy\PViMT^M<X9T*LKqWt1pT=:VX%c8Rw9$bu#m<B^DNIi\9*kSL+W
JwRi?h M4SRBI^uCPMTw=Mh5cBN9X44NyuRa8p&hjWK:ip*XWHhn6p+<Ea>\cSBZn=RVIM8i8BX5bqlITN8ppuy
N=6$jl Pa8i4K6Z+kC%tWEiQIi!>=+iA^Em=nn!lu?Pq:cQu9%Q5Yl=lk%i:ZZdp!eJ9#SyWdb^$q=Cp!9<j9#>
dRb=X4 yuuYNl9^1RT?GVC4&LGG@p?YRE+@\bC+B+#RWK<XMwDwNc+!aFHwVe1L+kDqJW@+pDLXM@c4%*nt=$u6
HkWIe9 t*YL@4bHBh5=WaRhBFC/<VCm>5eBRNEZHJiAF$e99n1t=d*8HSK*b+@ndMk#4In9NcQiR\pJR*ALmP5M
X+<Y<W haRJDnpAMq6*1/JkMZNk%JlcZawj&8?kEVlLy%>YG5MpZD#8?K:KSC?IBBwX*dAd$u%KdC1K9\i451p^
%?*4uw TB/nE+JanDIY+^INaQLCMq$q/i+99&wT?BpyP+WlYt*<c>!jyN/>pT5%EutCbwypcHy6&<mLYcFqS#cW
+IQFXM pD^VV9uiE^@j^Fu/cJB^qT&^hGJ%>qn^iJt#1#ibL!inR=\VnXS\ZN5\:kQWEc@pdubj1b>m4d14@X^u
8iaiym bpVNGV9CPcykMiIY=$i^SL8^SM^6Z4Fm:iDZ!+:KaGtZw@YD\?^kQ&6H9YE#?ydEWm%G<VIliAX&AP1B
RYy49m q%WH%%M6J8j?C&hVPC$Vk4yV1CL4HG!FQkIE=tuFGkyFHFtEBAj4qe<m\WdleWI*1HCn/8Pe<a\cW^dt
ZT!1u@ S18:8>b9/NhuX&HEJ9>I/!A5%D%wp%In+q<^Q*1CM@hIN^B+pNCIJY>YQ&XA4WBHMa8qhKNX@%hZ==Tc
J%hYCu jk>ZaBN:1lPW:R!tuBXJXlQj!eVl$wb<eQJRQDT\T=D<XK5$k*IlKSBC+!GAu>9#&Apd/ecXRBY&<:jt
GBG6n& E1CqMm>n9ML1Jtt#1F#X%DRClEnMIdq96J<huGRuB+kID$&$K&I:/1\\hnZX$6&q>$Va#/Yj>JdTjiLL
p%$BEQ 5WL?LMiICH!tk&R=^b!ZyC>jA:+wTk$L?P$%m?%L=NV=5XSZ?ha^^Q1AEFPFVcSC<5tZPF=a%?9L66#X
NRMY!8 5R+QqjN*P*=ZnJ>DjC^y$Gk\N4yYddqqJ&FLh/Rkpat8I4:*?=Y$<Q55CE^\SlIl^8JAmT%$qdMe*Wl=
Cb=?p! eHRKFVlL^yc+A$E?ZhGJDh@u:YYwFIqymptC%q/FP%L9lD/*5IA$<DI*SXZ^4E$h^<B$D=M\KtZIJBNi
SWL#P/ JXIa516tFV:@NHLBCk4ZjVHhaVaAn&64d%IAu5\54N:^NVX8Yh%Sk%&%hBY9dcXEYieY&kP:e1!NjJ+&
j#9>8l =5yYy9eGAihI*=C4EcM=p8dP=+<^Kqty+4PGIAY5:y4<1L+T9i%Pu%GAaJdcVV%%QkA1!T%6J<mS>Je4
881Ww& aqq1NX>NL%Tu$+?nNJ$aw?1!i>=IV<F9V?W>Mb+Y%<Nll>+SLc9*eje>P6#l!jPwALMPCiVaDHL&J1b+
ZF$6*@ q+BMe8tMJm1ST%/&pHD8cQG$1+AXeDV=JFCd+kdi<wqPPENZe1=\RHMXK1t95wbVNhe!l>:w588XF9W<
><:9X8 /lwC6^J^6GFGy/PJkRw<Wb6EiPB\lBSeuN/K?+FeRqPljQ<BLT5q+*eWqKJ4hDRb1Td6Cl16clA*PZMm
AnmdG$ CPbccVEm11RnqEIE$uCA&n:yTHimd9YAZGIq$9lhZb>#mPac9#R>9#dY#9=L=5FKGV8qL%FPD=?Tw4wl
^#X*ap 8aGBmRa!dDqjXwPtiq\%n=>!lSyKk>/\>LP!@=NQ=mSe%1u$1VK5uw^PJ&VLahYmZZ$/5CTnp4ky#!<L
NV46Tj ltME!HX%^IdI/CXmcHph&mJmSQuqmj#$BN+yS5YPk@aD&?DLFC*B>8ASiA>jwiWn=\L1+hDj$AF5pB#>
bWDRqH 5LXjBK^&WL:ADbHSk6KT<<hqqa^G4CX1W<i#h#S@c%!$N@a>bSjDK=+4jEWVyKyA+Ji&89aD*LJR?W<?
i?Vk?@ \LN&9m69K<WEBtw=Yc>&EmqBWt!WwQyPwq@1eP5<Q?R<&=E#=8j<Fh68jF#Jy?%e&K9&Kt/?cNLc1MmE
>t=!Yq V=IC##D+qIjw>\GMq>>QG4MTyG+4i/d@G\?V+Lyab#R/kSH*S\eQAeMpG!5qG&^<JX!MkhlDADmX/Ry$
XkS8Ta Eb6XelyPb%R#E%!eBKtEmGT+S$j5BnhItL891+%Fn9y\lJM+Jd5T1Q94\M$5nFN\?5q/GWYH>6TP<!Fy
G?MkQ8 +hSaNCd&kKt=e=Y8/mVN@Ye+L%apP1We5IhZ!tk>\E1VGXS#jASKue:kkZHXM$pj<m1RdVy*M^KbRj\h
EKK=?Z XD!+TDF*cIcy%Xm1$G89X\84yD8C4h?GuZCpqZjBXP9TZD&^#Xekm?kQeD:LyIe<DA&QyqwSb&!4DXBp
PELpDk R5G/:Qu?L*?w16/wS$G85:%#\9$RR!pDW8Bt/Y/!56R/ZK5ZQBjA!^QnLVjZZ4BdQdAIFhP6ycm=GWPH
MRe18A m?5:d9@wlM>V@ESbH#wwC:wK#$NejFB%9ulMJ8tw4HLPZd*a5BDPlZV$=qS?VQ%QVLd:A*aTLE:>t>\%
Tl%pwl eNXWGuW?+BG\AAI5uiIhi#\u/<4R/Qda$GN?QH@&VILqlw$#=S%jIi@Py/pPyXhS4F*:PTW+WG\Vd!p@
EppWMZ 55qX*iNwP<HnhIndKd5nGu>PCnyi&#!J#=B+YIZMkaiY+5WpCp@TQ@+G=CRqA=+1>eD&CYpDHhm9R5Z?
$@TIF/ c<qFu4RTdKbQyZ@G8A$nW/!!&iilSy!@*u$V*nBDw/t4JQ=Xm1T1jKRiiDi?LqtthW^Xkm^ZDctHS9n<
nbCY%5 #?PYd8mXcRT5TpEbdZpeEupe=wD:4N:pG:ENhJe\HFMl@\i#WiQ?9C4BWcbB&RQbThk<$V?YuSbTk4dR
/h!ekD nmZ9WK!jQ=M@LBE?h/A+tmZhSqBMEGj$RiwBe1YtG454P?I*NYq9&@^Gy6C@tGb:NYnu^H*NIq?9p%4T
Lk6NRB lpECnA*tI6X5Fyy1c/+<S&CA:y8!<d&/@/M*=FYTDt>$wLB$MPNGNCnT:L&MH?li^^ZF5AByIK8cGLS?
<h*yWl ecwQ*<d>%%=@@wlhK/n=1<WqNMt8<Tly?cIh@&J?p*XuZS6<QC%Y1wWW9!uTe89*^V!Rk%nFmQZ&^mXJ
WC=DHG ^1DwALTbMN6qW/&!ec>YGDA*HKYG@SbLE?#WY96SulaTPSHq=A:l8T/>:l6Hw+un9eZByuZIQY1u&dM1
qGq\FD j=D\#VYdl!*%6VHHcEd9>Bk6$jbByq&XXt+B9Je+q1?EA64<8+4uQFdW>KPcEE&WijIbb#QCRX\%$?Qa
$*YmT? yHwd/@/Q*!RThyBy6ZI/McyBqcAw:%ZhNl#cncinl/hJnV1/Wm\JhlX!HVj#?/>VX@P&yJ1@ZnK!kwtX
iwBW>9 ntKa<Q4+m<*P+XB4*pT^HLwibJ:$*neWu?AckAFmwy4DtaK8DF4*ZWn8ah4abYZy5T8F+qShVGj=tLyB
YXRG6* 5h=>q:mI4\VlPE8#iS4EEWWE=RAy&QEB:yA*m+k!I$:*nI!dAjJ*HMAeKB1yVwwNa5Hwd+#NGR&KGR!l
TRLe@R u::Jq/CDpK/@typ@Ic!c8ESY!IK>?\D*J*YhGiuQt@pP\DMG8GiRSG^L#\eSn4^?BQMNK8pC>nNy?A=G
/<KRBK KDXnP6B41jVHlq8jcyLQmj%G$1+Z%E4kbW?/$iyZ:MNd?q1q=BF#a1LXtN6QtP*tGAA\^%$J&u4p8&B1
cKJX^l KdY^hMj+NKa+iaWc9jV^6t=qeM=8$NKWW?wI^M@TiaJ?4a=aydS>niI?:l81E<INjk+i^&@nNHbJC\K4
!*!i1e m6QaA1JV1J+&%XN+Hjd<J8lmeF\q^^Q4SdJ6J1&Vt@W4>wm$Y4C69/pHt!^?<Ju\F?Dq#K?dYhA:E*&Z
wMdp+i l8*G8JP$!mkBpZFV&D^4u1FDtLpJ%hq$CSEw%u%$6Ip45@=9ky^qZ+!ZuR\iK86tmwRX>:aRZGHkI9RF
yi1P+? \++JF^j!plmLq>jHt&H?&1SMa&V*<t?LMdRN=\/iRXQ1uFhW<V$hhQQ@B>mGa6j<cyFIVHSLJK/YwFkj
FH@tMh Et$b6lun$LYZ$utB!1WFEe%qwu>$VhYVH:e9K/%k8qEcHi9uJZ8h<jJKP*a8+BTD+6^X&%BhwqQY\wW:
=6k<qS iTl$AE?GiWLInQ!D<$#uu>89QKqNRjIP=1D5K:Fnym=LSj&+Vip!nk%\VX*D8AIPKPm8wBMlkJPQFCE9
?Ad<>/ !&w%#KJy!#$#1$CZM$GDt:j%/8d>w$Xd>*4L*51Qj9Knu@V\*@?>@#@%d1\5>*4LX9:9=>KQ:t@\*@?=
TMD1GR @^>:k\h@:8j@!15@@<9@^&@?D*@49@9j@i%i9:h#>dd@J@q%?aQ@!&998<4jh^@#RL/6>6b:@?q@*ijB
y%Yc?m 4/e4Q?t>9>G?>aed:&><@NuHu**?&ij@%bi@<N&jm%@?\8::j\6@<9Ht^=?>9@HiH::*l@4:6#jnY*@a
9Tl46! 9@5Hh@@A9@YH+d$@jQQ##e@?@Yj@@9@j#?@>:u8@?>aj99YH:?5H*$\j:NQ*@>d:j/6>?^jCB:8:*#4/
Pm:6?h %6H*@1F<?@9j?@8j@>j!dijnudi**@9D=1$@*MQu@JMjWL=6jjju996#:bi@$Q6<=+<?*#/R4@e@?eV/
p?HQNK cV:@:M6j?N:j@@:V:@?Q<Z@^*j=j@jbj@Zd#@j>^bjm9l@@/i@?\?jIZ?y@@X=>@%u#<&X4*SequjH?>
Ea^?RH >^b?Z9@w6#@/:jjZ>Wh+j@*F*V>+8@8nn*::5*@*&d?@@\hjjuL@D#::h>&j9jeV@jHY**94:>&?iP99
-AYkS# 00033de267e001202b3 Page 63 of binaries1.zip
9etbWZ *d&<jZH*D?TL*@y<?<6jmN@:?%9j?>9j?>9j@i##dZ!=<pZ?8<@?ZjQ@w?69j?K/$/%lEK1AikHnq#mJ
RLe1Li p$Ac$tD9nTGiit:9#mqQ:$!Zb+yWaXMS%uNdTmSuqKn:tIA#HdZW<?YP%F@TDkd:V:k@hk^I@nb@Rn#G
\@pP+T J8Q#jMknQcMbnVSTP^l\b8:u:6PhGK4&tY86>j96Ze+=a+5CC1nZc@&8hd&6c@y?cj4J>BM<bQ@keT8H
4t4RA5 I%@thG6JiDyu9&%9TSIYZ5=iQ:$l+@*l/W1n8qLd1P@X>t5dMj/9X%i1K>FtWq*ymbb+mc@L$XJ%yZLh
ACImmK Z4n48w^t1!9^+tH>1@:/*id%&wdh^pb#4#$*qLhd\t$>/5RdQjG6k*m>1F8$*%@HB!+Q+@YiiCPJ6@4n
XFTF#Z S&E\>kCQei^BM9Lq\MV>/ThS+><>mu=:iY?PQdCjQIwjQc@6F?\S&#*mpei*<LkQ+q9=j@hZ^!eLiEZH
BI1GP8 9n^@Q^/wj%Xj1c*Gm@Emj&5Jq@ndVu!4F+<4>*<dGNpb6SeGL#l5/dC/*ZQle8j65**S=5!1ZYhYa?@:
p<Gi#V RLR$ZwbXn^dG#$^56eh&mlNQJ=:1SeZdbS?F\$wld*aGc!6$\1J5^N/GtSY:le=dk<>Q#@hi8H#leuLl
MT=ACD @WL6ei%^hCi/I>5hLTXnP$h\i*a:hk6SMdLLC6@E1IHH%a:8JDPj>WS4TZVuMFw4tFtWiL?$:dCRlMZ?
Yb:q&F 5GT@icj&8HX849Ln%i>!:*:?:8eZ*p?tjy>@?/#b:=1>QLDkWqlK\1CMi*JtpSqI+ZqaPDu^NEXD$S=S
h?9*C$ aZ\kNMPbLAmMM41b$@awC$tqWISJ+:4M1JNVZ:>llt#GdEDi+cMCw8:lPjQ#dV\Yi&YDTtH/TcX\ul@X
e5pF61 ICyWA49FkW4JjlJEjCWu@6\b?dI<>p*\QR#Z#ykXGtIDcD+\KIcuB/w4>d*YwQ&j8VLhGp!ci$j1i@Xh
WFw:JK 5=I6jMSd6HVanXqwjdhV&!nA+8N%@Wd#/eJY=<Py9m6VH>4@lj$4W<uX?iTne*dbm%956AcjN@h/:Td*
A9WubD &5&>jH&9cZjY*E6ck!jt!qe8&X$8Z:pSdeJM4$#Z9\%Lb4Jt6CNjB6@ZX=4d>y8%ndJ@ANHT^Ndak$4A
YwSp!C B*9nH?+8&1*B@mcjkm+:#d%ZeD@%ZWC$9l9jCk5+IwL9++GF4aZ>Bd9Pj44qu1IiYT@8I@hNaeTPY=l!
hmy646 hS59huY:dhb<i4=++dKhaa<AAj8@Bt9kYXlKJwQl$hL+tdGHPDZHH5K1^<<+1!:C85!1P:VuI5:+TkQu
J&uW&c jLR$5@4&&deG@*=/9wj&uJM>t+t?lHMa=!J8ER?GFw%*$>=V?>w8K\$<l4>Hh*ylGYdRjdAH&nM51wjY
6?WV6^ QMCV?A/5b1+!X$t8j6hnq?>?duh&PQZ:u6Q#>9kHkF5enudL>wG@/4dq!iDH5HD<*:8aF:+9+nD6XA1V
/MGlRS :uCGHR@wID*%>hkD&QGyJ:LtpjZ^M@da%&1*beY%i?=+D9!6\y1Bm*cqMIHuc#b6S!*5HLe:>mZiSd6h
KE6tVV <+Hn@iNuaM>+QeNA#!DEcXER+uSR\:V45DY#D*9H>&na?=*/XlFt:R$d^&HNDqae9Wt<QkT:1G<6dF*d
:Wwbyy kpF@PIZQH$/%B1>M@ZS%Q6ic5c>k%tbtjdkS*9D8RZP9b/=5X:>&=bIb+dKb>w*c@5VV5NDe8*Jndmlc
61V69K C8/P*b#+<>mZ\h*1i:y4*Hu<1L=ZZWuGH8S4G:nl8TG:p*=meWca@Kp%iNneG^Rwt@bu58cJQ=>@W66a
S/MiXA &E1A1m*i$EcHyy#:wZ?!MLMKC/aD99B?:/<8ZZm@M@Z:khQ#PEB4?##@H*Y1&$hlmnP4MASQPuV5?1@M
^hcai= KGBVpX$GPd#GadEVB4*8ZDjQDmb^eH4?aP4*bqw9?*N==4N\idIeLw?YSk6t#+ZSAuABY:d#tB<X5>Jk
#@!>AT AKe#4EF@e$Cdu9uM&@V$L6%\yiDQcWPB=^i6e<qeyee8L:!j9*D=4eHV</ju:Tpty?eLd=<Nq$Gt/Qj6
XWZ#Tl tdZ6n5KmPb/ua\@$*A!SQ%WKQQu^AV5&C*61Du<w8B5YaIW+V?%ELjn#Pjk?tdn@&6k*a\@Mw4?tZiN!
alARNC B%aP*pNWL6t=Gnm!<V%8Mjk?Kn!9FI=WAn%9e/Y*:Q?m9Z=&!@/<j%Ii:#iiX#CLQk&*:8ncte:+kNu^
>4Qq5Y iQ@M/ZkDb^cN4klL\L5NK=WS&SqyJ&66%Z%Nt4D?p6*Zi4e6!=yy!hNZ=/@P6<:lEtjDjB/GN9@DqitE
c/+6qE h>EjNeJCjE8kPcSq&\>!58#p!w*Z=?a4nau%iAuZZLuW*LQ9:5P&S:/ej1In6db1y4wjFp>>QjFX%MBh
RBSpIS &w%juV@!$dqY/?1<LtZqC@9!QFitD%1DB<=ZtFYddeAQnBA\hhl=44=qD&kn1i@qb<Qt*6\R*XZ8j#K:
^K/W*h lLF*#B:<AVh\+jL5&hS9:TjXdb#Z$:96!cBjym%ididhm@jd4Q5I4bIumZ%q>w%Leym%thZp:dQtBu:W
Q/SCHY !Zul<wuc+=uQaLG\e%1=?RD\=:Ghmcj8%A/IGhwR9?Pyda@TdB^@b=>j6Y6+G#nH#dj6<uTH>jG#LF:M
8/%mI= T6:juq5jAQ\Y?d8bipKDj?t6Rd8X%jC/m!VecXnlmcnu/y>6wSi**+pK8ckaD>kn=GGd\+PejtJA5?>@
AwNCFD YZ%Q*&c5^BN6&Q!IYj#IP5m&4nN1dt^HCQJYL$Vb#jZC:5$:>JGSNEAiP:ZXeu\L4!&IQM@!Ab:u@V?c
RR%%te 6jM4P:$4DdN+HGaquhtp4X8!=9nSkht:pX4RpF5hP:Fl/jcVFXk/dB%iHub8>uF%96kc66Nm&N8:I!Xt
PWdb:W PH*%QS!qSk68GWZyN#w!JZ8i8&R&@l1J!h4a#WyJ%+G5%Fa681Idtu+TL?KlNjimybF%P\S&/l86GdAi
pmTGj1 &Qdl%jpBD!uaht9GdQ6j#cdJShbB4!8F?wyB4TC+GJ=*<Zu&4F&Z?>jitXX:6?e1ji>?D8>>+j$L:>5B
JeREZb &*6^i8+T@&a@&kMnAee&1CKmey:d8EhkQBl&ZVaLKHmd66<1XtnXFtHtK88\u:d^/cuju=:@ci4*9:S:
y%bJlM ML5C@<&5Gp^p9G^&ZTDDiaDL!aLPeDATMhA\bht%i#!=neVp:GcY#MVD=bj5y51X5km?DF8HQ+$dl/ca
?q6a\c Fp!:*^9&Y+N9Dbyb>>C+m@kP=:p*cSCX+HA!PDqbENjCcT9iWH*QRyckZ8BHIS:A>@a@MH5j%ZuPc@lX
6/dIyZ NC5dN!9ikTWd%@:GY:V@m6@>id#jV9/*mIcu5uNelpR&&Sna6MN6%S/iYiPTMa4X=nQn4>9#Q<BuS=9l
jRbcy4 cV9S?#8uu8VH?&H%I#9Q?ZXaRDDb>l:i8CqQ>/&/b/edl:YNZqm/laWD6QT:5Hbai4K\Z@^\CtaG!#dQ
GY$9tM Y+:K<#@ACHG\m1Q$X^wuj*9!6$cd:WV9pHqQZyq!Jn%6Sn$F1uLqS9Pb9RI*c^5\<#qeP&YQ88lQ+EwB
^>bay\ utdmKY+wZkT!uA>yhc:Pq>ND*X@4PhLj#F&%B85daYCHllt>aY*ScIy=qB4IT4<>*V&e$@A$8ceYul*/
d^&I%p M:\>>j9eljhud^MRNHk#h&NK<8yGy@8:I*Q:@qkw!\wW*PBTl#jTHLK1R>y/AYk!RuTb&a<:NNQZ#e+6
qlD9a# QlXdGh5Bu<h=Lt5*p!9J+lYdmwEdj*%5%y/HkRM9udBeMpQH@^LNHRcQ$!<1Pk<kqMDe:jqbJG5IjG5\
i11^p> B>=CR??DwiMlG$dDwIhtdlGGaj8an!bq/hWkH1kX/<Z=aD=aPLN\jiHMjCFyFkc/dd:/ZlIQ@AJj$@@\
mMVc?M JQ>=&kRj$@d@@JNjQ@u%>:@?@9!V<<dl8@n>ZcNJ9ZnWTcWSPC99+nHkG:B99h86GZ8VNw&NF^u4Pl5@
JBN!Hn >YV5G*@Gn?#kc>^!i44V=46P?F$T+>Z/^kFa#K$j+@YVR5KCiZ=Edn!pcYQ#Q%VKE%8XW9*d%w^b*LDu
CYWbyW =L?Md^p^M+5HSc+GwM!6\dp!/H6/np@^5^t>ebhuaSEt4i@\Y\9:#d%+eiLQ!emZ^iu:F5@dLXWCa@HV
>Hu>!S AB4I$pju<N86%uPGA:!Yy:6hFy4QwmXRSAR1paHGCE&BB*6a&:<+X:MuWLj#9X#h^4q?>d84*?G#Mk$p
Gtqw5y LuaII8yFakm^:*:@^Yq+!=m9@N@D+qAa?BP><wKJS*5Jn*VnKHueX4Su%$S44>4Scha=Z5cH#9MS+!nM
1JBlFF \#^FjtEE%4/VbW/M5@SE+PaF<BYLIG?D/WSLp?WEma>!*w\dJw:I+AnMER<uLnLqAuhR^BtNB=ZWH65D
PcnJCW mi/<jhde\8m1Gdw:%+@l<?q=SB+P1aJYwL>qktW!PP4SLcP*w#8wFb9BR9BB<MGbD<=ec*R?PHQMVD>w
Jp:NJN FywFtH/NS:%BA$GFP>46\J&+*<85*9V>*Qu:9>tbH$kY4p<9uF++A:AAHD/w=aE8/uihKbL4iG#^w5JR
%l/9A1 HPyttH9%d=9QhPDCB8dtajR#K/SiBJph/kMA&TTeAdPEbyNqtZn61cQ8Y#L1H&5d#?%M4*%6#PY8V/da
\kl>Nq tZ=W/Smi/jiCl^Q4qXJ#nXa?TDI^&GaWANP$@*<St/D=uZIWJnN\P?Huyqw#byR*#ekh9dp!^j#IX4#I
BZ!kKR BCJ9b?LQ>SWFwCV1uT5*e8Lyh5AZQmJ%$k@^AEDV<h!MScYbw@1*aQ8\i%Ad^k&=8VJP?E=69&j&dL=a
D!P!GQ 1N%:$iy%#9hiiQ@m6IW6S9\6#1n6F=4d<c%/w^a&\%yaDZnc>:4Ae\mH:<>Q>&nQBcF&8weZ*u@:4Juh
I?GRE? JuI$Sl1YajiVbb#9aPqk\wlFS*dIcZcW6$p=P%t:N$l^G@D&V4VYD/PHl$B$bth!D^@YWb1tualXGEpS
lW!N%l *6?^>nID<H8i:dhHX=P*B5*1*#+dLTp/%aGKRJAJt/KC/#TyKLw?WHuB:69ZGyhk@Zd5u#dLB<%y?EMj
VyZ%iT ceD8k^+j$$?tnb+Hh<<@?e&P&j^%?\@mkM>u/wH5u#Tt+A+W5@#+qnLQDFkcCFZnSV91:XA&&<h^Q\nd
VBdkGN d>t@8jtL$:X>$FCRWAVQCAdM5V\I@n4&aPI?MYZQ$h=NHQbHjAJG^##w8ytkHj8%y:XXI#tH<jy4bQF*
L>B&Yc :eh*^jYdV?8:PQh=iE<LE#n=ka4y*ZkJBF9ujk==qJH%=PS9!\JE9Ik#&^MhI<=ZdyRXb%c*nhWnL$N9
\dy>BM \L<?Em<Gh$i?BJ^P@la@W<T1MNu?5p$RkPWI?DD==IX\hhC:RjMACF\6JlDdPYVcE?h?HRe/pJD41V$&
lWHw=d y6PQ!ASHJM=4MID1w?1&SVY*ECZ69#+*XQ@YZw%GM&\G6dBtB&#wdFV^Ha+1ji+GR?wFyuG4!F##DX4D
w<^DRX d/DKk&nXeb$TjeCPa#^EAXmQPJD#CaE#DZkeS>4Bchd!ht9Gn<dLudGhuE?1FQ5hE!@GlwepKk=+ww<5
a:4DB1 huY:I:=En&TIWNT/#MiP#EuDBRe\yb:JwG$PJkPDa@qBHHk\HF=49P9ARDek@wQn*#Q:<REQl8B:APH<
D#Hi#R jdpAD\Te6>i&CAa/k$lbH^1>A<GTK<T<l%e:dkIIhp+@E^B\V4bcla9V\AGV5E#@&MM9!c6+bNtj*1y9
V:wKMe KAEPQ&CE9:/FE*V4::YNN*H$G/XjEdE*X$Dnd#/hDi$Bm9V\=KXD8A*Vu%kQ:pbL<EVNdhtkuSanZ:/t
9+6DR4 !5&$ueC%XYM>IQl\CM6mN:kNGJZl<&=>R:b@bT1BM$E1cSZSMNkPpIN<n?Bt%8@DYuMFFluu=?kJmJ8Z
M>hjI& jKIhH/A5apu+8ZkR#wGwWh>DlA&8j*EPLKm?q*?%WH55Q+ApJWJA5++PI5m%a*kl+!Y#@t>4>?^n6duY
-A8=MZ 000e2e1179c001202b3 Page 64 of binaries1.zip
!&@/%b DBeMBSdZ&j8QYNbeRjHjE@*P&&iN+#>uKnL9VN<q/8*IVpbLd#K##4MjZpC&utX8W159mtZFSbiJEZ6j
MtJC?R 55jYQ:M/9S8YlJjEdF>XLD9A</F:5=N1WJI9!HI+LqNjXtR><>uw/9kmQ59&pa6QMW*Qe&kI\LM5=JTL
^iPE:< 6/@/aH@#6Q*pY8Pqc%9ZG6ec5u?+A1NB%?EIqLZMHIHF48ZyJ<HhccPn==@WBnI*pF#d8wC9:VX6A1?m
NjVWFS PdL:L56j!X!ALB>t=@PHekP6%wZL4Xd65d%Z6?Mq%1ac:5!RN?ZZhm?*qP%ISI1b<VBnaBa#1a6ThGwd
Ia9eCR k<ld+wP\/QIG:aY6jQNy<?qeiYHjDHVwSa<kaETN=nb4VtM+lmj?dAT8MZcV\ihhA$$D^*=4&TCBKQiT
wJ&A*m tTy1WIN#R>P:E@iNIW&npMWk\D!QQe+lC%+bA6T@c8:JLcT=$t/KSH\IHE#eD^L5LJ4be!NNp9PbG+wj
&RF?VY VRdIyI%>k/lc1Tj:Q<ZZam@*j!?4bANR6IdNkq%K=6BmVFbT\e6BSk$Z1$p#HDVjEMdMQCk>+qEB\#i4
P1>CZ$ I!dMH^RbFh^^N\ltXDccQaAcJVNHbcd:S$9D<k&nBZkFw1TRbVcSI!?YZ$#p8I\y$DFI4^D+&1:9ZTA?
MpKG*a pKY%9?yWk*#MaIG$^/Db6kebL8jHF\WKi=L>WePuMChS$9y:YBn5Ckiaka1d>ebC?EFkqPmIweAmajPW
J1+<E@ L8?DQE@FWj6p:MFR=kMR:WcFZ#?SD&k?:X#dGnSMZY@c8YK&@=+?SIHc<c&!dN<<<yL!PR9:bB^&D61=
AuM%/@ D<P*CIBtD<N@Hm&>yKSa=d1+9<=Eh:u4p*^NReB<AhpQp9XFGV9Q@/*W&Q64b84+Y*kByPc9#lh4>!1q
@D:VeG Tkt&H6!Nt<*6?y+=kKq+A$$j%je5hL$XFqSDScWW%G8PnN<qI5*T=+a1yau%cpBPNcX/1P1mPBX1V%Gb
n>LhY> 1N>q@Npc#AQ45Qkjijd*#e*n>MhNkh?4n8YnkK9<Ti$iIt1e@Mk+@YnQE>!Hei>iEcc6$=:<@DNtZ+yk
6KJL1i JbPB^cnqTlpuat!Mi&p+Z4Lub$FAQYmGehQdh$n:nt@S8yeTZ*#1ZHnjnN*<B\NhtDSTwcNblkmq4NIS
>eCu<G XRl^^8NKm+LLP9NSjYE6AL!qEl\qLSh9ah/i5RRnAGjQa#8q6H8lGD4M^cGh@VtiiRWGLcYbXiNKS*HT
TZ%XA: &*Npjl+XiQE&=^95<mei?Ei!nBdLbAb$^y\d>YA?TBcCI@PB5Z&/RIQ:i!#+F%S1G66yn#$w8W/b:&Zp
Md=D8< P846pB>a&KT^&%@D9D9^+kE6&>8/!%R?I/hqipPu8yu+!ha\jDB16VEjVHabN^u4tK%EDbmBcK/wQcw*
\$#<\& 15jD%GHcuZn>mDN\h=a4+lWHM^\&>++6:Q9VXd:FLL$eqXHb6uN<9SI\tjJtjSe$bjw?cpFNw@#IY54c
i!T&?A \\AqK#9hb@^b&^1Mqmc?1lSRDdk!BSkhLt#%\5/XCD&m!BW8^JN:jNdZb8&>5HcX^M\>HXeBXp=AydP4
Tj@RYM <<%u/MI^c:<=ceT^99EQF^Hpuk:A%5*T>&Zyh5V%p9hPB1?+FE4Jul@jbJ:y^ll\y5pZb@u/thWp&8!y
QA=Qm^ d85eq/ZuYVT/\^5%T1@GG1R4Zb1\CA=c/1ldBV#/=<uTRWhLm&tqTZW9uPEupP6SGK4+YPi?!@$H9nKY
ELq>dG mPDLmH*4X<KnQKePN8a9m?%KwcV5PJP#aNnFTL$9St4/M+89IK#wlYEh^EGihET@qqjaM@EWNw/$JTNd
Kne4VK ?#>#GwTtZ8k5ZB>aCP*kh$i+Qdl+5i%5uPVdb!8jNb@N@>Atc^>+>@Q$>DaD:<SLTY*%KK\dhw&:Mea$
@j*4yF C&98Q5LNDM1m84JX&Vk5@Lph+4Jyw@G*LQB4+D8#uBM+YbW^u^8CkTFdYTqQ:<KDG$i=maP!D65iEYQB
d%<<@+ Ka=n9:=l#GXu+m5eydD8&148Wi\njwT@bM:GGE8!5N@4PF%Qe>8?G@KGC6KQ*\hZp*ud<?>Z<kw5mHG5
?GdRaH AjcpkK1:qwX@hP/ne&Rm\&m<+eP+cVBeNe4TJ*n#XN<9wV1yjA6#nidI\?9GLV1\9hI\1!IN=NBhiy:&
&GZGL! 4eyJhcXn%5*eyb*nl&V8@dJ85S+#y%hBTEBFhHCVJn6\$BTZjLt&$1CqBQ@kRY=YEBXH=Vcm4E!%lIbH
Q&MHQt $BTE4/L<MQASjyah?q5#E??LqhbSn8dwyM66?1eKElYYTdyIwN6^pMVFuq1^E^hj>md5MpqhuVXySSih
kLwkAP D&5w69@E9l%D=pp?yAj1M5ALdyb+W&pXS4BQj9%>HNRGaQd&<A1MW@p/\6bSDX$5/Z8EuGI6C@6pLD$j
ab%P<> uaQb#=G#\?#4*$b*pulyGPe=&cT^!my6Z*$&5Q+c$lhK*G!J8tSuc&4*yZlL6MY+N8wVBpHY/@6q?YqP
E4FTKm 5W^DYw@K#Y$LNw5+6!5BE!TD6R%:lu>G+kXMGLehd^lLjtL54V!^FT<y/ey:bb$1ZnRd#+5aNjeP4&&X
!Z/dyF jF<Zu1*M6#Z#uM@cD9J?I!&ZFLV!NFe4=B+!:ZlGX?jdH=$4&tq>i?Iyc>#4\jjtiL>6$+@=*nKeA4t@
q/VAh/ HWMmw:wNAw%?YnKN^bpX$Y=^X4Q:VmWw?\mwEumDIt?l9djbV/Cttd!*>&Vt5#G\F\NRCRq/Fq\DWBI:
:iBqA9 VByIBhWd>4BY#EW5<tQS=/hJ@F$4w^uS!/HQ/SXbPClYA=ihB\yKcmCLqwmBwDP&M\V:B\yAlX#+WNLD
mbtYbj N!QL1=&TCMnbPX@mPh?DFwc%9Gey:ib1V#Q5%INP4Zk!L5dFNIPcbZDWpedklu%CT!E/#N=W9PAm<Aen
i@uH81 :KnB8?C4XPQ>=P$Y9/1c!?16P#@MD1JGV:#amSwqq:XymKQA:8&>@8leD8jiqS96X16I=4p95m+ip/Ad
hFJ=@m kd&W5H4p\ej::X%cJ=@^hy?i>$y@m>P$+@Yp6uFCdVn^BpA<hlMbH^l@jT<6X=HRGQ^K>Y<uukb*t&5I
+Z1i%a AMGR^&=GDV9$Z<NhV@!=9kW/npD\!mXpMqF\N?B@bdh=N%yCd\H8Hm?RPa9h>5J?u%wh4lq^6$P@5:Cj
Gj+?!n +/NDC\KRjuW?J^4VMi9*1WpZq@dZN$Sp4p!qqu<9LPq%S!etWa<MpI\?*>PHdDcP9QFFP>h::HJthTnN
\d5KMb 9/R=<!1I1Z&ABi8p6*iuQ:/FFD%!t:=G^V1ZScNV9=jl6&e?G$S8$5K@In5PTnn5pVFaCA?9NbKF#eSC
S8DW1/ *Z1nV+E8:1nniq&S5!mTEAi6e?*qh<dtK1=ub5u*:yC=G$pceW!G8Z+\4JJ@%D=@#*^Q\jlT#%#Fd15H
HFMK:c Fh/%HK%y4d&\?Wy#hTFWNlbSTV&w8Z6PLh&VtSI:jia1R&dqc=Zk^Tb!ZDJ*hD\:/=E8bl6JX^hCeQi<
w9qcEy EjppH8lnS\=hVFJyDI9V$NIZ@@%b*@up<nE+dtY1ehdQ*ncmW=pdeqTH:N*5j5l\5A4uCh?mB94yJ\yd
kb8X#V :i\?=yN//pJRck<Yqy*<lwDD&5dS8k5=XjqB^l8&u%EQM<ZB?S?M!qk+&6!t>RhmE5!I>8P9$iIF?$@t
LT%aTT !1@aRW$EVP!!b<B?e*w*Y5L6lTZWhNFblu6k$LyqS*>SdY$?jEAW!ya&S*j5/@cXG\NbAR9Q+ID^lmmP
ZW\\T+ J#4\V5:9*pVwTp:Yw^/#nlu<L$MZXhwd9I^$I%Q%m!#QNpHhpb^d8Q+BL^t44TDm+mt>ad>>!!D\CGZb
eql9VJ Du8*P1V!8SRBPhEJm\@Kw\Wh@LX\Id#Y?HV>$@W@d9$l@PuV>iScw^?*d:h8RZG6tBB49dDCyBaPLd@#
hN\+hI y*@:L@@%V@?G!?X*!PqL/GG4QY:@/h>i994hKaeAu>9HA$e&HVhae?mq1+AV!iuYpn@>Y&G8k5jI#6%X
L\W?uk FIEMC+NEAuP!K6T=DBTLX6*uQZ8Qm#n#w#6b@D\b6Mh&iuHct+h@ZV%q@9#B/!<M8JQ@TaXb?ck4bkF!
iWLQ%J D!1NAbYynB?5IVhn66@*$dqQLu>!Gdb9dPhab9jmPHkG6h9IKehLqRCYu+^<ciHE#Gtj5LF*?&lc48*t
LjLFJD QDNmAZXbj1i&<bd/C?NdFhb:%G?A!1i#SFhBet%u=&4:E%9BZaTw4WF/AM^tFJk>iS$p^9#Au!NYyc=M
!k/Za! #cYhcFit$WZJIQjB^Fe5BY>HT?m1NNhu=tpl^5LYCjMCt>hicQIWYXJ/XIiBS+LS@:^*bZdM>/L@$y#A
m<CLT/ IAG\JkC\/VJRh8euC?#:n1J6QR!WLteca^Z&:>w%X8^NZu:u<JQLR$DT\n=JmnyhN#B<\q/EC=hjabib
/n9t+q uj4/8QD?8=>j@Y:=uiW9q4>\Nt6jLd?D1pD6eXk?tA#!ak9G+bdjKiF>%d9:l@DcFqB^dT9=hH%RZ@<8
FX9TDe 8Nak>IKFEQa<H!VNwA?jt@b@?S%DkJ*1S5&Pt*?:y@9D=hZ9^l/PhFYA#d*cLTX@*B1!&&<$k>n=l1\C
G8pLT> h9W:\$RPj<%?6#^\$X\#64m\YRaTtKJy^k=N:LhEwA6E$C?ad:u/ZS><:5\1pGAE4MiC&=GhAa<B?@^p
uWP&@1 :EF!/88e/^Ci8N<L>u>aKS#*uFJBl!h11JkACiV^&+aD<N=QL65:ZqA!^&n@5El@W46h6F?:^@IKaRDK
Pyb:mS d#DwA\!mYTVi%S$yEDV*P9Y>+k9Ej>8qhA=1G<M\AJEjhcXHlVyddpSa:AEebeR:\+LRVWT/bQi*^l+k
>Ym1NH 1#:>yLb1h@ccHiedeAQ%Fhh>S6NZ%G^^C8a?HACtH!IjNQKquVVtQF\8ce@H9pcGQy#1R\!A94m=wWQ!
E>$$cn IJm@YZ+9Qmejue6jhRW5e#<YSl^9#ekNIJ>n^<W>BAGwA+>>mYa?#W^b#J9:u#8V\SFB\Ck@AQCISM@A
jj@n*y J*9/<W@@Xq#?a1:TjEddj+VYa?Q/F!/*L:\@aKd?Ba^GH#@>/h>/q:?wQV+$PuZ%P^nuj@t9B*dhS?j?
DtJIDl EJyS>%#dcu?/Z9k+?Dm+XtTl^+#!+/D#RVAMA?<?/Pe1TqWc#TmHJd8qpduKCGlFc6VX+IQkn%6\IdmE
l*l&Hu Yj9D*qEi5+D$5P>DcK4n*m^q&EKpNj69BAkHjY4W4qHbG@bpkIN?4uJ+>d5BGdchYTV$l!M:8bF%nDKb
T^Kl4L PR@B4Eu69<yc$JVNPckWm6*qIwXMSuiKPN=Jd4a@8d!$mmPk@euqI@L6589YeQPb&jLn&t&$K>X8h&14
ARZNjm J!KG5tQjKJRh?+cY9hYhp$e?Q1q9DdLY?l<VjQRb&\G@ERaE!AA1SLWNH&Eiw4h+Bt$9a#e^caI@C+9J
9%wnaG !h<iC@/Kt=T@MH=qS!pPe&@bd9:yGF4FJ6bB<ZG<w&q6:E8+n*R!bT6lP%D:\/t<&I6/P^&yWX&&kHTq
eA=W=y d<<BNM&tV<wB+TYCTeMB#R&B*/56dy4QR9hlDCj*n&Hq?6RHkPpn&Db?C68?6uXI+$^+cidX9@!PkeR5
p<aKXk G&Z9#wZLA&?j^cq?+Z$b8Bq^!b6thqt:b+ci9@1h44Fd!j8jJkDCP*bW@ZG4F\b1^y?H\j<8?F&RjB\M
w+e?SP \P#%<aGh+9dd9<Bjt6EHwi<6KQ4:ASnGZCCLL8nR#Q6*ka\i6\$9$WTP9q@GD*Pnb?knwYNm1BM6=Yq\
B+&AJA ah^EApk6Py^KCk68dnW56e=lwt4=uR+NH4GS9aIQ:PDa5ZP<4MpuQ<N*/wqm&WShcCk@SaYP&Z6Z=+*L
YcdVF< cJt>q%!C%RY^H$+64Z=$:yDES8XYC@Fc\/?R%P^#qPw&/$?4VCMZbjN!G?HyT4&/Am@heX&IHHh!>TWq
+8iJlD /c>MN=@NDeF$a/S!&ucmk>B+Rn@^b:PYbuNdYZuap6ueG@m8?R!$B*pTkCjiGN9BpVu!bZ4?D&JT!dZb
-A%aNI 0007d2c1141001202b3 Page 65 of binaries1.zip
:!@nTL qEXuDq8DJ=C=SBk4c%T:VVwP6iJQ<#aQ<kGWhu&S6+Yk61jX5wP</DtNu!Mlwe>d9D*EI*/8W5Sjk5:4
T^JtXI L6CD\A+#9Sc>iIn=9l^1uI#EllB9#1!mQw&cBK#i&&jHY*?^&==d\<:/?>Fnk++#&H/u!/=V%PV>FFVC
:pt#yE w%/*>%N/i?L&QJd@yjQyi8:nAFb1KBn+PAAGkIZqh*ndbtt8B=*=i4QduNu:\%M:!elPH<cic:V&=A>l
iWLIn* H4j=5Y#>yI=5JDJ^P@+=VP^!QKwWq6DQkI:q/X%nS*&lm&ZD+tFZiu=t%dkVLh:596?+@FJFW+1\>#=&
#A<*?i ?uIi!k:=a+yl^h/Sw9@%V4*A4wM#Vhhqp&DpSJ$?qWbP@RIJeTeij@DJ=VE\Qbt<nuke<K+j=F=6Z=E5
4!ykun YE>alAPB4YKiJP!4%EXl&Hmb4:8D9qQj/qMe!/pRq\FEX:*:YE@mY?j+NW8!aDRc%y9+M!J^RFFh>1ul
uJZkG1 MceTQ*JJeibV^GwM<&!lRZ+F6B/pH^nkiPC\*I?aDcm>S<HJ*$+@ajhD9&9@aZaTiZ%\GYS%jG:HLk?8
&AJZ4B *Cn+iyW@?y<VAcytGepb^tj%bK1>M!4I9MuaEid$+pHuHuj5\FJaPKuGhn5nFnaSV+mX@MMMD\cnA=<D
De:6MQ &G?j#eukE<>ditn\=j@!Z>W1wN#qcGt8+mA$<KJLkPp8dPJk@yFeB+j?^<:WQhSw:K^u\6#d!?<en?/A
P$c$<k Q&CRXJuK!JkSdkMBATD$kVEWM@lPHB!9BmA$@k+u!?nZWThP/G1@p<Hj\$L*:Lc*<VImEMWk=lG8a?nj
MePty% ui6HhjiacFY<K9ITF1bbdtX4<aD/!Y48eE<1RX+Hi4#anyaG&En=djPbalqn/EXFND=EM/5c:6T@QYqH
I>w1bm 8%p=cE*>Y$@SRYZG9ku?Gp/A#Nn@t&kZ<A*tYiNA#dWecp#d:L4HR5Z+%nFbPl5NFmeL5G9%TKA9B9dN
H\uXRd 6Mpd#Ja!cXu@Fme<$yTc&jb#%Mm?I$>@bT1?FZ^jCVnHjepaVT<5&<:+Zk!?Gk@KwZGiI?P>/P5$56XV
+QS4&! l$WZpBd%kVFaVb9$QNh1wT#X=ql*b5<+@V5juV8lBA&6?T<n:P@$ckdTWdAH?Mn5?Wi#=%Mb>$X1DI$!
F66VeR 5GhQEtATiJM6>H#He*K#!NLX:/4dtnVBYP6dk#k8p@Ra@!@@>iy*cN^KSp6HnC+a*=YJ&hFiWQ$INq>:
yH6ANa :P%*?R5j*uyt:i:=m\<CP?n:49$LTA/C&MNQ%*@^Ma@/d1Ph1>kB^PT*K=+YNNwF+*MD%YyZ5*lAl#:C
w!LZKP +GdIJwS&HQTI&a!j+iVFD5y^yZ:YhX*Zky*9ySj!p5!=%8/%tc@SJP@M/5\Kpq/nJTQ!QciihI#EK$4q
YL@&>c cW9>kZmk*5<=FDRdqK<%=kPjw&jW#C!q&Z/jtluRb@DVJ=hjXeDXG4a+dJmlKDL#>+ANpup:&:NKXNkZ
M@l!a= VTdSdN+5u4%kQ!H^5Y9&qQet$KFRRB+Gn>A4mSh:>Zq>!8/iN+V!El=Y<D&:j:hXE9$wHR4Wec/JRE&N
cGVNA6 INunl/%l<1%BNN&HSuC8VJt=>@AWddeGWc9ht*TDIy4ISXKW=aE6iac5B5#SAhhVI<^@hP:9:CS46eni
TdEAXC C/%BXdX<GddNGpb6hYLLMDWw>y=JiYlcyL/SH#eYMPm4>e1@5W61ydt&5GtYMQ^j@16=$Icc9m5NHM*h
8K/KAF HD&yd8jSNj@&YZKW%:!^SuhGT!<ZEMJJZpYjV@:q=WL6<Tuu>RGA$RK#nAP%^/:RbCa:X&p:5/>@8^A8
p@6$^^ lM?9NZ4Be\/9Nb^%Gu@=Bn:&@H$#&6ja>qZkXKlVDSk6KFhbCby4!9QM@>Be+/S%Gj!hy@*=dq=nD8nL
?nBj#E F&c!G^y6y/yNWS%pQ:h/#q59I1c@eDt6V6*^E=aw<tEcG%qbP%!PaYaGp$%895p%84Q$M%AQkIQ&6c*B
um4Qqt lVQwXI$K&WAcHuX6NatZ?8AD/6@P@@DS8VSVW<BRWi6ec*n?B*GhyQ:6KZkAi::CR\Q#+nn@:jTjnGc4
ncmT$F >Yw>8yq!ld&=KXSPEj&le%EhN6+j\EI+MW/YLd/DVp?D^#F>F<&1?hhm$G<Ip\c!MZEI6Lab=<J!=+da
jcpBVk d@MAHmElq\t?B#kt:qeDQAap>1PG&D:44Ai6\d:/Z4TJklwhRX+PmNEHV*h<JFit<&ySwA919ZLn/9\l
n=uLqy !qa6FDBR9tnNhNk@uEEJ@AXe^=nPT$4k6+dDEk^VdF@\$FkbAYJQQV@ch9JGw\YjAGeKjDW>w<&I%V\d
EQ$l#& e9B@4tK5y6jP@bXpb6YIjBwTuL:/HRyXAIADlKh^@EwREVkA^>4n:uQhb#=\Q^qDM8?DS4eqbq6Yp+W\
IY/hR? d<AN4^WZk5/%^5#Qe#=wFEFLL&bD&DT$1HS&h1<8!X>!\+14qI&=A?DahcWKR+I+1BWJ^H+:N1mmbCAJ
Z+wp%N nI1jSy5#8wyWLQm=$A&9I&SGX#ZNlhS8hb6D^H5Il%WdF\5eLV#H$jRAYctJ?=MBZ6*y:k/%w?ch/VdW
/8KEFi lK^aYJXq?@<Iiby9?<#<=lWW6D?=nCVIPa8Di&8Q=*?\u?dpQJLt5=iMMN&1ZA@:nCn%icDW@4u&NX4Q
J^$@%n EF^1FyAu?NAX691cFX4Iy>ahB=8:=q#c#1F\cn%iQ^w9\64>Y&\&@^=eVKZp=%DMhE@=*tB#Fd8Gly5Y
j$&1Mq p&*+:kHE\<leK5$QJMGXcBd>TM9Nn/mI/>wN*DkpePPBdQSy$Q?imqu<C*1^H/@e!DQdc<HGV@#XuLwd
XVtbb> Dn</h&!8Em5e@m&Ha&=y#6J:Ey\P?etE<QBX$6GT&kYanGk8j=G+/Ld&iLLRtdl@BCh56\>bjti$MLNm
#Q85KG @%jj@d!Vp1DSXSmAAQH<=G>:LEa<?h6?B\<#$6ynSe&%^:ktGjt!F^Qbhq>H9AiCJ/pX%S8HBkk#BJRd
FXWhM> ?kF/ymhZbeIkVPkV?QZ*#WI!H@!t*wA^yaVyCa#b>dC6aRwN>M<^@Z9GNw4IyB5wmwBE>1\tA\DDH8tD
:NZWpP pKuI&t%&WK>JN8XuZ1VLq+!8uy=Q*lw<lyE9D\6=p>HXMJA*WX:ky=Gh$9kA4MED\?Jq5cpnC>idwW?=
i9>6M> 8u19T+eTFQt=wVpGkc1>6M:biW&%k@pj+MM$RVE*bLB+^YC^EY%Y/uajE+KFGd1Bk6PHY?myB^kEDS#J
KSKC@: W<tHW+PWW6l1Z8hp!6&/G9ENI+hRkcIV<i=n9B?VX<!cj/Qk%<KYE5b#MS$:w/a%8kZWhyFi\p\6dd>W
Mu!S@w */kETnel@GdV@m&DSR?hVJ?dKLuES4W<eYH?\#D^pnDlS+QlT#Rt=wjRpcnqm?PmbWRZLIaQ%jeMH$YR
FE%@?u LNTSkV$qWT*PPF1:F<Jene#NuPdAkl6Jlm<BaQJ9H+ju^\E:q6bVYc>%@eKyM?tN:uDmQ&iW<^5G6mZ<
1bRb#L #DCBHnDDTiyP?phZ^<6!J5VHKF=I/e8+QKJ#LtJE*i+E8QE@\\jb&^B?l8^eYMBSH+i%i#/$5J<iSa$m
Z^*&X+ Z91=R=uYhJR=IRSDe=ZyJ?Q>>5kj1Kp$Y8M#!Cqep5MCb8SIXF?dDA!@iW4VqZmN*XQ+Rw#B+1E>h/AA
F+EW:n CGt@NXnEaDAX%9cmQiDDHND+tak/Vthe6#d#XP#p+K*BneB>+5QiyIEtYhhC$C^/6Kk#IqyTd=9!S5CK
F\h9JX Hc*uwP@tw&=F*8*YeID+k*kl=^L4M6h#K=16%MM?eK+8^N\q9>4%mPFR?cY=T^>P+Xb>EVbb&By$kBF<
=VLW$5 :1cca%DyeRC19nh#Yq:F*9hZk4<cZ$jw5R*%w/le@%bhw&16S<&KjcHB^FjV>/pcpaIuLMA@ybQA\#:H
ndIQmW =D5i*Hn:yhaM^\>1G\N8*IDwd\&&F@d:@Z$=d*bkHI^FBCjy<A<L8^d&$R/lQJMFJ5eR^48w@LeIVb^P
n1HG&F ZBht<wN\K$mlhL5YF+RG!%?$HXCTW%@*K=IYJ$LE9Q\FyAMtA#1JAYYF#HRKByWuubP@QicEtJ:+bH9*
b=KMnP l*mZ*Z1bEQt6b&V?>8GmpE6C&l:tuYct?n^Qa@k!aNC+mXce**^9RT/kWVD\yL**wRW=cYppVCQ*y\Ai
X1TFGF 88<Wt4k$XDD^b/S\\IF$THkaS$59!knT/K?uVmTHFQQy?e:db@N!InP4:eukHB!\\JGJa4HF:Zcq\dVX
BIwMh\ @dEHtkuRBD%qI#BE%*A<c$uy1Nw>JFkJnluN6LATYnF8QcuM8=\KLytENckkVHF%6*&P!<#PuAdjA6i1
ImV!AB j\ZBl9yZ>4HdjJ1BBBW4m*ia&l@PZI8nZT9/:Ibjcl6><Z4q8lFci?Q54Z=q=uVN%SYRq\wiStW@l?bF
<duy8b hyA^neG^dqcDR$PG<T$mA@p6PBZ<9RWpKTa+IZ@yC46NMaYYwJqy!<hVm5F>B/9cmymBQYC\DpTan@49
#W=it4 dIY?My&/n&G+D\wECR\dYV$Q5Mn>@ZBpJ=@PWw*6HAMM8w%BQAkja\>PGSlaHB+REMdQwIJG$^*5<ln$
\RdlHP Da!Zh$=B\SX<c\ieC>AaYSjLTymijhFjAG+$*+L<pmACRB#/qP/y:6ncwQAqm4Y@@9+D<^Jb%i&ne>ec
!\wS8c MmynKY6JX:*RJ<M\FIViCukLF*D5nnG*M%qkpNWDBbXCq@+kjEVu4eHp:dM>d\&&*#=:#LZ!Ze>WISnm
VVSM+X P#qEYD<Ep&D@%Y*aj#L&+IRj@KwWj4$VB:@b1d6a!VpF&DRW<nCKDh=eacMeBNH/ajQi/yQc+&P\e>q<
MCPH!K :VHKu@EGdD/eCQ6k>dD=\+Y696RhVLY9*Pm^/QTV!=$Qy@K!hYSA9^yP=^u9R5qKB/YG9!4Z^:+^T^>T
LhE^d^ VW^XNNl1#d#i^BdGjcZ5a*!8NVlA$dW@B>@4>#1!>+J1!SNjndkK^GF4<Kn4w:nEjpDj^iRFQnhaBDi1
+<A&wl %dH#Z^+D1GKq8ajWma%$Fw1Djl&!Ic/h?kH<AeMLi%*aBRW*%QT!my^h&pMnZi:HuqNQ#A*$nKFYXbD%
%hQ@ak a@wK%Yc/kMLMb=:9mFuBKu&H#5t@IQ@CCGTRWeW:w/YSHXm:=$pn/^*mC5k/6ZM\56MLt*iH@&>q:WDV
pPdqI> &IPWubYZ*/G>&/$IXYp>P1*lHjD+Q@tZCZclwbeIYIT%L%!9$?KZ9:DjTjnInwZLZ1EHtc?Mwa&Z^:+E
9BnJJd d1Iq@Jc8m?:A?d*aFSyiX#Ch<KS@GRJBd=>F1MEVj<ZL=W//eS%u>:ih=d@KW^1BVQydp9Fl&#RC1ICh
eXS#$4 +:S<&H*CcwjbQtNGpKKEIdXb?*ERIhAk?wWlP?Z*:L=t#h::\6QVV?L?&n<#!hX#be4MG@plyG\?uAKj
15>%n9 E96BS:Jb%ZY#?AuQkZm!d:nEDN4tAy:8Ly=GT6>*D1HLH?FD<DBieu$MR&=TJa<cY*A*Z5VEtE:16C:B
!Z9XjZ 4mA@w5X\AN1\y/B9=bXV%Qj9DhRH%WwByF%?M^*tu:!EdiK#VZNDV5&YCcmQ#l%yDVQ^%MLwQF@wY%BE
96!9&@ $upQHWdMC/k&C/8E#ZjGhpbG1TPm\wN5^G^@^>9w&M/Lthuca<QJAGIFu96&Yw/YV8&<ZQA$y+$Y!y*e
5*S8Te CN5*:J5m:1#:J5\/V9+qD>/D/<G&RQj68y:c9RQ$?>^lu1bMS*A&a!6#FTe#i4>Y#A::Q@%dC?dQy44c
=uNpcq :i+Hc4hVtHT=5&myhc=T#m#RVI%\D56kI=XCB4Zca/Xn:Vu$WVkKW=84:hQ#PaVN9:4W1Y+ZJY\B#SR9
hB%yTF bbmElaId8uRacJ%4&!uP^K&te%cVcGqaLiupQa*M>4$IVeJ1h8IN@\$$dwHV8MB=j&+IkaBKEnYi>^aK
jTq@ly VDBEu+#:MWT9@u6k+JQLA:B?Byte6&%@PGWR/DYCk&Q@mD9&9%d?W*uJGANiD$n<n/CtFe*/R%<NF9HT
-AVKw6 0008311a4a0001202b3 Page 66 of binaries1.zip
wT:qTY ^NQy*ia#mI@+k^8WB9w/KQ6XX<b8AnmkPDDn=/*Bq%#bIB%&$a^Y9AZNCRwmW$nWn@c1IGGG@9#KnbJZ
lI*k8y dqQ!!b+$@A1hDWat>>5<:>E$dij>pdq=>n$9?8TScuB!b9tCEpp?TMaRIThcKMHD+*/A^#%J!&S\>V8#
9nE9Rp \#\TI8Nu:H%#l#^k+a==yt>Ghydj/T^@eenG8imPIcpZ:EmGXZ9<epH$HniZew@n+&Xh/#6M>VFibkcj
a1@yED Nh#c9Vc:>qKDN:wA+1/M$4#$BGZAJ\CeTch<n<=p1Cwk?\&mnSMkDX#!=4H6J&R/R%i@G/Wp9>R8<SXC
HeE/uW t9FFw#Yu=%?DpV8Nq4%M1!YV+\&qR8SVwnB&Ky*!/G:ZH8e\SBa*p#kwamyI=YYe=4D\n4j\Z+DuiD+D
Q^:nnQ K@heH8\jX1+mZQ^IXl=NRqL<9J*$hdN#YHu!l:AjuWnw\HM=&BKD$1t=MpyRGl@H/PFYVmwtujyZw:S+
<^bS\i y^a8*ZpLXl>pl#=!SZ:iWNMC<#@WXlH+58^RWF$89pZylkIL&:%%I#:J!Je>M/e:QI1b!W$wN5Y#Y@Y+
I$YHQJ *Zm4&?mh!Se!WW:X*8!aL/5I1L6mJYZIYd+DpE<8KS/R6$ka?w4%N@h<#e?h@96NX=*L9&yAiMZumMai
e\b#iD Ky&8<*@mcYcVaDR/qJRq!k:lh#@u=G%R*Y+VF8kqGpqQ@=Gh>CBXAFyEQ^D8AjenX1M\889Yla^?qLQF
<A\*?C >$hLl!^?b<WMjID*&!&?D9+#R6aQZ6PhMj4N>%AN@QZPm<=t@A^RqW#eL&d4GXk9@y+P=qZ<ZlnakjY+
B/&^!? &*qAjRJh#$I4eMKhF/6WSp\8ZP=#$NmEmNBckiQV^W\aKAtD@5l:k<jpR\cRu?a1S<CJ$EASMStMHR6m
biZ\mm Q//y9Be9T991h:*p@c%#w@@@I6$MHiFyXIcApdnjtNCA<QGH<JQLl$84udTnA@1#4PI?%V\<Qnh>q<bh
59Im1m e\p>/M%aQPPp>DjAa9Ve^aaW:*c*Zdht$NIYqy4dYi5d4BpCt=WC*mFWk#Y*FycR=@ihG?lEtl6Ti4SD
=j:qXK PYjnSWWyw6ii^1pT91dmi=%Ye!@!yS$PC/e%e5C4q>w@e$McnZGDq:=pnc?aGV4CSJQ9N>1wQc%9yFHB
b$+5EZ Z8/9QcR6QlIwTZNp5yCMqu1Y9?n+/NNb>hZ9hB/PL*14RX^y:1V\epFwRMV4@!=JP%BuQl6nuIE5i%ic
ZVHh1i Syi9KbJ+&hWtwn6hcQ\CpaY8X?Jw9J\l#Y/J!$IRj5yLIHPKCIH$K4@<#kmS%FE6+^9<68\j=G9mci&&
F=!%** QdNe6AVhYj8hAWdy=mbuXl#:#/NiAIM@MFPjqKJwWd5pk8>JjbByyuaA9EH6<h@uK5ia?Fu%^dPalw=p
ERnXip #6Z9Qn1ubyiD1><hk8$#AR1@Qt\Gj=^>F/8%XYR=\>QKhPLaB<WZ\jqD&F=c:j%D!EQ@yB!AYH:#1i</
Q96h4k WtPy#>/R:H#XmShQX>>VBR$hyYpQ\heTF&<Ni49&Lb:wmEa6DaF+%ycBYlq/BPJF6ARl1+MGDZV@1*^<
aJkK15 lW4Ql&#FKHtlj@pdndD=TJZyt%jXbTRI/T5E6?tDGSS9kp!KitM:4FVD8mpIlPd1GjZhpj!4Y%!S:wa?
Lk:WCF W+kh>id?kbGh:6^*MlpWbMtnydCpTDT#e6ZLMET5AS5tQXpFR\%6#M*Fk4q+#=Hc?$C+uMYTnH8Q@:\H
Aq5dt/ &%9&!#^qaNZpNIQ\A!<Y5Zu/I/LNmSYb@Rbn*!DX&X*E6ueEN4@XQW8nHBHWnbla:hKbSjXM:MlHNWuc
L*Qyh@ FBnh+caTakESP6lSYISGNeV<y*=Qyh+q!TacQR!ZV%DHnn&4Kmcut!tKuHl#/TBD^TAPe5:*e9c/!wpM
G>>p%y JDt^*?WQ@\6\eYAPVyA\CtJPAjXADG8lXld&&Y$!\SNN%pu+IciCjp#F8mBCh8Lu>HY!6GwaIVK&tp@6
$&6XFZ \F6SuTDV/ujmdq>Lb+n/YpmdF6XXCJK4%wY5EA^n5!Q+cQ%dcIYkh/m4%%<XbYmleD\FJnhZ>6w4PP%B
SXSnLV #wmMIbE5GT8%Jjc/#9!<9#<W!kkH\aK+SKMVNSd#L98/y@TQS5jWc6y11T/S>ye5^w9%FZ@$=@+9QScb
JIiumT R8wJLYl>%F+IpQcBiZiVwP#TKLMhbRcZQ5AkQZwLM=?beat/p%KqVhcMGLwL51%#*SA=IME^EQpZP15^
AY?BtP qG8Q%VHlD!iWm#YSw+PibdTm/k>#FbB>qJp4\W<GpK9jSZe+\6n9Y$ESBMnShNIEFmb$KkZuCw/#dXR4
1D\1$u akK5kWFtZ/%G!Pq\eBtmTCeuPdRMI=h^h+tQW&ZZH@:MZ/KJ!NmP^ql46!E\SINjketnd:jX?8u1h*qj
XuJ>q# <9/S!j$?nV#X>1E+*hiH8uB>BTi?BdT>1GD>+=QLucZX=MPya6ak+dM+TZ*4qL:*>k^dS1W#*j9!hSnA
@Wa^4& Iu&?Hd#dTD$t*&=D&ej<n\65eYlHDjSb^+9@ubLlQu^%6PIyS^&:hIZ<Eb>ITe8LwuT8*Pl%&n$=GjAl
#=ZASX !%b=a$kqVP+eWw>FVhJ?tqQ5C%MiEbyKX*Xh:t<=cippVw\diny>+dI*&PhthM6j\AD5ZF4^ES6LMZe/
ti&<G^ L5<*X%HPEVqNtCWtVJ#&XKDmW4me1k/c!j4/K1E^lHqI*D+aQ?eqZG5Q+>6l<8lqbI!<Tc5FNVX5P&?X
JJ6haB HMDiudDw4l&GCa>>1VSM>+tekt!RE@TFMBXG>9\?>Vb>$:8XA1Lj5T@NwGhk>1qRe\CqkGnQnJqmGBJL
5j%%KA <S6l5FNAec&:>d9TKWTXtS%:Jb#iMjY&$K+$@<Nl:jER=9?kq8WI9wWAMGnI>#\*p::&L!$:5/@>!+<C
n>Ri#P \hZ9PIPKE>\#Gq\Gj/*><+hV1D/bDVJhw:a:M?<nj\n>ul@1u@qe=X*b%%cBmn:1A%1Mbmii&uN?Zh8N
$itq#N Jl&Q<hdh9XqFPn?!>Pa#bXa+X5p#&!u?=ESR:ET%A:caetm+D<AM6w%eQ$:5F?kM>Q$H#hlL@1#PVt#t
119T%> K@@X:1kTeFy+n=tdE#/IXj<E<$@:<TLe41d&ZZu1@?&*wjTFchY>Hc*%KEj@:8jIQKIjqB&jyW+a&Buh
1&e*ZE L/NQDYlp?S*Wb#uul+adJ%FLk!l$l**SGl\i11Ft@MQ84<iS+QV6MT/D>CD4iac=?#E!W9^XB+\hFc=R
\Q&^Fq !<%/5BY<eqtJZi<DA+Qq%//^8IDjd96\a&Bm%/<EC6Y</1nb<n5\?Ip@w!Qdd\p5>L4VAhKhJVXJ\N\:
&TjqJ+ $b%yLAZwNuXQV:ki=V:quJ\Ym%5ZWK=wmNiL?lchhuID8\clGkCDl<pjZ9*89<>XD6ATQFNhtVthlH&9
P4chA% k1SW/9Zh1@McjheiN4d!*MmcHQSVjGhGd!h<D*Q$jd+YSX6@yd/mhE&<PHNck&VwA5FV4nV1G%p@khkJ
nwQhm$ %=!$EJXYDLeYYFNhSIwTcyn&1uA8@>LuYQ<W5VBAX4T9Zky9:Dph:t&i/qn#h8XG\1G9Ad>ZRy:BVL^5
Z%hk6l VuXh8!qp&QA&C%661Hc/DA!<C4w46AwAGM4>N+\+8SqYi@hi>c5LJa#=5:V<%/+N=?6S48>DdRY5SH>V
WMu6l5 *TbNL859YHB>kuabNK^lwKtBQbIF<<>pAub4V%V>^*ZiFw%>QMq+^<l/e844atdyaCIPF<j<aW>19RN:
/GyQMw Dq<wM=G6FMFYJy:?:N1C/D5$%NICe4<QCyc@kBWZJq>$B>$aA??BQJP5H$%Bj9STK?t<Al\jp=i/=iaZ
aAB6&p MBm+B4>kK<PBV=wG*$9hucyJk?I/Y4FSwRR#F6*M*p:i@h!m%:>b^QLS8THqQ8y:h4/jVp@+mjyhXt!K
PD&<$c SwE8chYD>yy<e4uNPm!FIbbYq%dbjtA<QnHnb%5PBejN?I>JwLDTWFM#G1&uu?Dh$lw=H4uIlp#:RVCP
@#465C +jdX9=$5R%lYcmcaEFAVDteT?:9H9hDV64BQMWFPw>%X@WwhwIQ?N^F%ewQeDWu4&nGjq?u#X<*8i/Qm
tJ%W=L ^HwT*P%lFc!u!?KNd:Pp+Pyycq@L@d>/iKRQX9%1KGi>Ym4Fw@&p!1??h^uu4m6KqnJ<yLaDbn^^Q/eF
K!n!Yt J$t<mN!d9bQk*KIiM/5c!S994^VTc@589K@hTci?@tup!:\E#5mYm%qnkq>:CYqau>#*y@naVbCuNptM
<lDAXn 1I$aN?#Q\8PhcA&QpCYC@nBhyEY/yMdX%ha=?>uScMui*d9BZ:Y&!qt\*B*JYYh5=&*@4Fq@bWIiSK%:
<ti^bb >iH$4q?P&<ZQ@Wdby>t1SHpVa@a4M!8Xhhn#le8hh#<@bF/?b@/Hk>b\u<9JXP\bj*T8BGwc*dVApN$F
VB*:P? PN*4h#95ajSNZDnbM%F/ui+IQNq8pAPbwT4Wc/:Fb56ym#6mA=p&ST5aJMNBQ@$p&9VFX:9XI/yAPTuP
a*qQG$ Gc@tQZa#K6SZ#Nn/IF5I5ab/1lLF^GKdB5/JNIymTi*V&Vn?#n5Pmw9&P89tDlYi@Z@nQm\:$^@c&@P>
IFBC>P kc4IHXp>%P5eFPQHZcenaLL9\#::M6Cbdmj//!+F<FnL5:wnVJ*w9lh5qN5?Sh1ychcLKC^NpR>NBp#!
RuI&=Y WSAiuc+RNWHjF$@9wmJP5RG5?iP%6LQY8dF9@nH!=T5e%@l?58BnWh@MRFK?w:+#uJlyT+Im#qhR^Ayj
jeqBeS TLX:9mJF?etCBC1B$/!^^<ibcJdPP8nm>id%XN9l=iW9\GMt6hA=QR&<*j9&CeVYF8=Ec+Qcu1!F$C:?
/KmRue 9I9/b/iCSauV>#Mc:<p<QmNF!XmYF1@&=<N*Q?@R+ki%^yaD9QjWtMpMP<WJPi+:Fh%Eb\&=VY>$<<wq
8&TI$b 5$k*RK+nQXN16b@plIpDu8p>C=9GcX=#4j/aJ4?LVqC<ZP#kZQFj5*By4PTFw@!pN$<9ewK?Ap:AL&4N
BaX*+* y>??Ti&SH%FBuSKbMbPjWDIWh?4uEj%tFCX4ZHQNndqWNB&Z@9q+kTH<4wZA9hP:E?96+G=PmpJ&??Wc
C@M?RZ T\R@P>#*<m?Z5TLETRD!k<&A4BH!cD<^<%q&5CN^$4&9YSL=iJ9dnlI59+M*P!4c5X:A<thIYEZbIX/$
MKKS@P mQY?BDY1RZ46<hynZC6/</K$^*m@PtJ16#5$%PW9#Lp+a*bc*wmZZRXYc:^F%>MWVC@wC>Vi@LJ81Lp#
p6M16t i#pk?SQejq&EQSi9L%!*a<u%RFQj=\Ek4P&etupH=aBSc=yL=J9:J:nuDwdihZ#nuq>FMdST1BSi*H@4
^wI6EC Vd<mXi44tdt**@&<X=JLWQ4BSBp?DnCwe5@+K+#>qdu=&h9%*imt@b$:/w*LVECV#@=@l^lT@auc=MN8
mmJy^M FI65D\EG:G&:yP^*J9uWIcF@^dhWIqkNV?PWn&d6>N1w4tBW9qJHTl:ER+b?TDWwBc<J%hnAj6T?&NET
k/G<$j VujTP\4j\<Q<JAyK>ENVLeheELX!1SAQjX+?^j%k#pa+RGGX>L*L@lMm4><DBhY5R$VJZml>R?6I+SM1
h#tEwV JV6!Hl49!WM/Duiq%Wyijk+hRN+u=C6=\CLn?EkJb<8H@kPj<BiMMVISI**Lw1AB\<DATDdHj9W:nYIk
>GBqj9 XbVWX*JwBM5<RuRu?P9aN?MD$$?1T8m<:Bwu9@Fmq6&e\c$6=PTV8+e!^ql\6qc$N1:a#dw/y:+?kkmn
#u@De\ t>@Lu:DHF+4Mlayd@VD&Djy#qQT=?l&Yu@^/b@/FmAG?wjdQH=*#5lZwG?=ET#tMVGLZX*E1<\mI\>ZN
VE@B58 \d=6C5ckiPjQjjAlQGIA=he:9>/JCt+jERBTFF6T#I9FBC6>YpEJ+SmDTk/&<P:u:dqKL\bZp91*a^1A
k^Vm%p %^A<i=Py>ZN^P61Dh/nWASpq=$H<BSpuiVkwhtSthj!ne>%KIW1W8K$wW$k4R8AGd8Nck^1cY$u>1%jR
-Ad@&T 000a878b8e6001202b3 Page 67 of binaries1.zip
w&%lLI pK?5CJCC9l@G+4P8WP5mAcX=KMcRW>&w+$JjHE=&*KFAqchyjqq>L&EubwE&Q5XbkTFZm*%DZYm5FYS>
1$i5>\ e1BmKTIRd%?e%p9kwjQ8=$DNS?pEQdM?YtQPZhSDGBiiYK>9^M*#Y^4^%<IALXWF!6E8B!WtnC^VD?Xa
P8Vuwh TaVbL>yEJw>cbc4IupKLq?1lHK$9W#QuDuiMa!b1!a5&Sb5KH9qZbaleSbBCyC?BMq^#qTi%iRS=CTnI
%<P&:Y y+Vq?MXy=JBBuDBdL9%p8%RnF=9Zt&FK$RcmJe^:%R6RiY5Nh>LKL:wbyEpCj/h<4IeKklJ8WR\my%KL
6awT*N dl:%RV9lmd8+%jt$dT%?bIj1X@Y9SNRRQNN:W4t>Wwa*ea1GL&Z:^ACK4B!SBRYCjPjZP*p$&iCcV9D>
lhNGQL aJd8kR@J\GGBA4SIY!*uSXwci<V?1Nd\c@a>:YH&h4SuweZNTl*AtGFEHM*Cp:VP?WKu&\F^R!I/8p!8
N5nCNH *BmWJ+H$LAGB*TydC=5YW=JNYbB<E5<>R944j9BZ8BIRHQCwLkpGC6/&bk:eJttu5ZJC9#jtXmE1>Xky
qdB>pw GKN/kmpZhhQRud!tunuXjKGW$6##/1Q^qth!dp:A:p6EmhC:Iau?Xk<9D>Qh/ZwRl!\daMWK?FTEmc@X
BhpKaG <%9tRw+DHhn</!YkWYCV>J=miiA<@&=w:+>jT?l+FS!IL/Npkt:PnVCwCM5PF+<lSmb&yh^%hTX?XH*W
!ilh6W >8Ylq/=?l&cVn</l%XbPKY&t*JPKDyIQ6M^l:$cWkItwQK66AbC>V?1NHQcaLL@VTePB&8Qj:C!e8hd+
<C%Kn+ KC8FqiC?XDyVB6euq+AN6:!9lQ5^SBN9EIlVclb#a>EhKVHZZ*Anhuled^b?<!SGj*NS4uZ=C!EEa<S?
#haKX8 Yc8di6m%<D1QWy\ch+y>/t+k$\1?j+%XtCA1\IY+QWc8<PY*D<!5SF9hGCFKB4#TLe>HqMRP&PL<Bl9j
1#cj@I Yq^W>\ndnP^>tMYi>buVqjye&VeCbKE%&JcV$DEDG@!INM^=qyqMCD!yd\%khRYkI8%Ne^@H+E@QQ<GL
?I4@d< FJF%IiwtXDmQnp/=lB*$HS:i95tBhuwC9kKTR+m^%hcMTtM<+MhR^LI/d8&S$@jM=wT=WVKJ%\8yI/EE
Aj&+8q Hd5:Z%GW$i%CZE>Q1@6S?NS1Yt#L&YQa11%m/V\w&MRY@IS=ek9PTeTGJ>bXAFGyk^LTpM:h$NS>:tuJ
k$e5F! %iSh$kpWnE&JcL6CdHIK1AFtSp8RXEpX<apb6%Qqq5Ba*i:Y%j4S$c%\Pjki8<MNJ>9$Kmh4n@*IE%=I
d<yQ!W :kS1RM6N+8uaI&a+&ZSKhV%MFnqjAy<^>yAy4@J+&WeZ/M\G5\!DlL?jMK:1yQyha#9VXG4?#R:99#<P
&ycQ8Z +@:#nG&8jti**Zj%P/n/RtQLdQ$Et9lSFQGDePl>pqVnyN5*W!qZ5Gu%yLh=?R8yCd$RhSV>\5cp56:u
q/YWmS 5CCQai+mn+XeMQ&@#XYG4>wSmbpXLjbmwAL#9#=Zl8tdLjcbjW^yEZT*yKC#DK/*e9HBCI>q%?dnX8nS
a1M8hy ?lj+9dtKjn#>iKD&#=\D8\9bCwu4h6m\w/na=$/>?k1=!:H/B5RTyTM6YVp/m@8GMhiAKd&Xq:uXhCmd
NYSjVb 1*jdB>c#$EN>@cSq4yHN9EMiBSS<jeA$4k>:GL:u/CCY:EG?GpPXeS%nR5Hhj#KVn+1mV+lBcl5mqGk#
!*8cSa u!^#K\*$T@M9Fh*:=!4A#5::jAJKQbewAbA>qdpi>/S=B&@u>A&!>LqLF?im9Y+ywQ>IRk6uddR*QnDi
?LW#6u d^H5>Yk#bXC9#XWWh+Qn\Q/%N\<a1IZ+H54NC&G<1HM/9j%559eqZI6&CX@Q>yQK/plXL5Fm4jJ#Z!Ad
V@!/K* 5dDui:^XYDZcZWcw&B9KpMhPkShHHt8Q6e/nQjH$dWqMiPcpVZ#\FC\uLPp<mFAw<<Y$alchb%E+h\Jk
%$X*kc ec@=BukIaAJ:9yML:@i<?:qF*Lm<<H+9aQEVG!A$CaBVeTl?^Ip8i^8\>%ja5N<ahA5@JWi::N$FWTPb
MBJ/T> @SLIFY!+/Vel:uGp1yjmZA6dS&4@HQj@?kqEp8yjtcP<nm#m>BQD^H8?mT$411E>\m$buTatlnnim@Gl
\M/4BW Q%jwF?w4mA+6+l!E=H>cYPNaYMe4>tP<?DBi6$h^SHlLZh!Ndk<k@!chhF<<>l6?pc&6daAqRZ9haQHK
K!<eA? NFi8u6?c&IwZ&R&*k9IdJHu4G=IcbiiJ9XE+58E>jnn1ShhEud#w\9@y@!!Sb%dQ*qTqVby8Sy$!J:DE
CGHqKc $jXt^GZlhRneVGF:=IZL$bcHB&@B!TuC9FBSX85\APGVRAcIM*IJAkVAWA5:ehBjC\GQii18HHycq4hH
\Y/n$? N?@AbE=l@I^jZMFE%bACCVZK?culdJDj6:SBaE&!#c:SI%CnA:nA#C1Wjmh&^*dM?Ijh+pt&dZ9X*wqh
q*CEdd %hI58InY?9BK!BppDBY//\$!i!:T1c\Z$E5Ep=jM>pWLCq5q9%^e%<I9kC1DIWEb?V5qbTXRDlARBy9A
$6RFDW WZ*Lc$>ln*SCi?ul8Z%w\QDPAcq:>SE4F8ma/aP9G^%/CS5yj<%^5cbdQG!S^P#$p?puwEbbaT^lV58d
d^IRI8 cTyaLtJ$^Fh^^:+<j^>8wXLAX<%XPIRP<:D>&yKZ4l44lSQw%DaK*9w>l<MGP#^@%@#jqZn!K^9Be/aj
=yV9e9 5ydZF=YDl>MQ:YQZ9n8Kwq6kD>w9C%D?GuL+CtN!Q\:R*BWu*KQ8jdL<Vp/Ydnd\SuRHyB64:y!X*</C
EkEZtB =qkDcZ8#+h!q&h8\<&nQD4FG:jH!P+jy&KB9+pSnEA=RmXBJ8lB$!mp@I?Fb1HF^Zm*$1nwTAaZ6+!Nc
tbFwiE TwQbQ1X>wWTH^qFI/P4aS$9^C=ptH9!uhtbY$%ckZ@y\&\:4kqLAT8%&B\mVbbj*KqKL/QGLwnGutFW/
p6Zu6& uHk/MP4*Mi&mn/MVqu1+Q1>M#cKkP^VA=!R5DHI6BlLWt@:Rl>#K&&eVP@W9V8jA?:qq9PhZq^I/kq/k
5CZp>j kiEm*l/i@%!TMWQnl\>\EKm8ZLqp=*>P^6mY<jQAQ@nw*P9?nHbY6@?CAKP!4!AlZ>Y@EkD5:F>b8G:B
A+Dd9A hApAMP:FQSqm/BRy:&pNG!p=+eHp\><c\&WZFY^X*&MdhQQRVu/%WS^w<pZheIjaJb<1jmHX&9cQGTPi
Dpj*!P SFjdtd^uQnB=MJ>KwL%I4eHc/4Rb@QVD&1wnZEj4K\mJSSc=G*C+Na\JabTyeV@=aSm?Y@F<+Z&1kB5J
mDVP&e \Xi%^/P4Y4+?jwa%bY:PwFL*twwXedQC4J1h:yiTm*Qqm>P@89T4T>XHqjZ\NMRq$j@JRhW*We*nhB<t
PqLNEn ZAQjaaVtjnTYwWcL>n1wVnFd?RBqnE1R:a9lGn1uimZ>e6!&YeFL:*=ii\\YT<F@R\^1ZlP:8A$J>1M&
qAKtFM Y*5<A?ZHwka%XWkbi$AmN%h=W+8Mb#:D=ptJG!Pa^t>NdPEeS:8!+h:%QcT>Q*a9w/Z^Sd9hAy1t@Sat
j&QEQ6 wPBk+tp95:CV=XiSc5MKTSClmwaBZ1!=WY\WQThe*:6pAWHu:dM=PaLDm>M>F>=9Z:neC=h\!ACl\?Yq
^QFeeD VKdcISN6#acaX*%ctD*:\paWJ#Hi$*L4lNBYb\:lNZGk8Zpjjd4Yk+%$5J*FN>Rj#n?^YIC&d?=kGGk+
4Kl/be @!TclV/EnBRJKS?AG\yiV1NS6Zn8iuPGC#BT?&i$FbF*@Dtc^A/pVFn^8aNBjVjlR6WPN>Mk8=N6\imP
85MHBN c>!M!$AYAd9yF9ZwkjnE6+kJdADdNpV5Xp1e@F4a:*emSHb*%H\aRN<+QKEeRj/X\1S4lQR%cLQj%+EI
b&Z>CN eAm&RuIB8:L1TKW/mk5@::cFa:WA9EDu\8WSICLcR:iZW<V>1@$hXERwF1X/eFkaH+A*<IKMw?k5Y$+\
1pt>uL K:XMSK^:*h\j\?I@?ZXC91Sqy?+*CHMu994%>+*9F<:MD?DnN@@Z<^^9^JtPGkmtdJtG9BiY+MqWT%i@
R$YEh9 mBShEM:m9pnmh<jW8<ily8VW%:%\n^dc@kJXVFXDpPbFKK6NjL+Q&+@$h$55aV\Iq/^MV=c=LCi/a<@9
nj1tBh >WwcGGRhF*y?aQIpM&p+AP<kYB^euC:k5@#FY+PE!wZ*D>@>@KmwEq=$Zh4dEF\MIuQNt1c^N#QjP1eN
pCRMGD mkibHu?jS\/@w+T6Ye@S4wta8%qlnnuuJ*HR9N=i&PwDV#KH@e?Wui6#HcW*iD6=4\#eeTh*e%8AM==%
LKjLd! HE1?eA@V>\E*FI$Mct\m%X=j>Q<uZ8+/&#&MTSYwwXMi8La^WN@wYuQV$wwBb4@\JNAQ$yjFB&:YEl8E
EHw^Xj y^<iEB&pTd5RXLWjW$ZC1=iTKic9#m6=qS@5e/5QNcH*5ty^\wYRkXRJKp5/CaEM>MND^DPyBJN+N?NH
CIWADY F?j$D91*B&p>:KaJm!w+8?Xbj=%?pyYmJhYy4nyIw+!Zp*B=CJ/JE<bji&Wk/SyPFk+^4XBwX\yu%KD5
liawDT >pkaF5:j@<*>*##=#bNj*$iTB!*R?Mqp+PMd<LK\QLKVDa@JS?Gi<L!\%EWC86A:<y%?KHm#nBDa>TNj
JbQ6^h F9uIh@^mQA^GJmh@i!bVMPwPqjE/ES&:p^mL+WbK?wwqyJLCWui@pqdWe!QX4YnVIwa&yL#6^c\>Nn?S
::FyQy p$/hZhhD5yVVql:DSC>i:Pi@8yT9dq<MpGX6Z@$8b+jB@N\<pp*iSk?h/TA+S5bqpI9E>8yhVhY+^HL8
1S:<Mb /TjBZ/MCJLYc<A%=?Abpna\nDdq!AmXLZG^K>Vdc=EqNc@phHqTdemNwtC$i?^IhE$lGSEXIVY5ISuX1
BH+dLF y^9c=#JacL!GTMPGZSd<ZlDj\t%?41DPKu*9aP*Y&ukyL6AqJIa1JaQCWbKu*iAlF4W1n6cq/@?aMV:b
YWXpA& w<R!Mpb>tAiRm#m$YA^BG9dN*SpWCNLtb>J:RKBVCX=HhT*c?>WqHYM\@:jQTl^lb4ZCTqQZ#NW*cdQ!
A5LlA+ !Ji9?!F/AGD<#DlNBaRFk@u+mc>ihMq>cqh\D#5k5NbLQb556H<b*G$dAJDyh5LpD:IIj/+T4cF1uKq#
>y4BHW ndml=:Ghpb&j/*S=1X@%d\MFWGm&l*^T%$!!8^y@?cIRZnhj$mmy:tNTDKue1bTQlJq9KM4/^bKR=#H4
VSK@@A :+t&p4jQ>pJ?#5KDQIwEWH&\$KGu6y>+JHR!CQ#+1$8>MH>n8Ec1ZNuy/ujHpFF=5e:55/i?MX>dyI@<
AmDSSq i$>kV6&P1tnYVL@?%RDudL=C!1n/uwCBI4Wb$1ZuX?jQWB>?^16h%Tq+4m1bb4t$SZZ/Ql\:>Q!+1\dL
aX%\PZ ^KdRH!J6S+ZKdNXAEYNI%V9JPQmlTR*1Jp:dTp@FANHQbNqM/w@i!uKwiI#cb1PTAKudl6<eCCYZ1J\q
pkl*^X 89^!MlZTD=FnGGVZS6kjBwAEXwNbuDbZ/YH+X1AW?Yh8pcQFk9b?H<EIyXa+lp+iE=pXCFl#eHCR/nqW
5*K4h+ A1u+hi61==t?@^bK#B+pPF$BDMy^qlC4eIN<iZS%anedmci6dZqa/NSNQDk/aiEq8Rp@H5aq:QjQd=&@
I155V+ :/<j&=H1cLL<V1$%QFqYhb1EdRhJAh#=tJ5Y<yB\ipn4\1YTcbCX\=wZk^$BIZ$9$KKRFKq:my<6=V8u
w5H/=9 h4^D#jd@ni$pE$?Stm8:ERV*<lnM?\tT/$kyXXe5qCl:<mTXSw!1acj=RY&@#BcbQZ&euyhwQn%H?>*Q
IuYe=$ n*k9Di/1T#mZZ%%1LR5@h6kSQ=m?h=%AHZd=y$P=N/=eEmEj1uj=D<Jn+D!tX5^j6A$$KFAdkb15DVR%
1Hb\SS wluA+Ntdh!PLL:KBapuFTTVd^>6wJ:I+jlin^nnh$FKEpYM9mI1Bmdq!b&H@1B9nZ/p>%amRG*=t<#Y#
-AnS*L 0003f5d8ba2001202b3 Page 68 of binaries1.zip
R=eue% 5hqIG8:!pEpEQB>D<B9CLl+AGNVE48Hq1aSV@MSCe/<cINFW*?nYd#!p*?lD+H%qtu%@J*QlhaVd!d8j
jD+cCl q?a1Q5uumJRF\pqa:y<5T>4HVBa%yYLwX*e%AA8<Y\tFhkCWbGc%#?>#4TBeQwIpNa=**<e*Q5Ab>BLt
E9kdjb eI$?DiLYFhmQF6SMK&@Xh9$RBw<*@CJm9!HXhjA><C9e6iQWl!G5&utW=LFqb8#BKMSpSmkkI>&MZdS/
$p56VC b@w6L6l&C:^SM/kEjm54F>8NQSl&dW6ah$#Cl<idnwJ?jVC!<?yaq%TNmJh4DHeXB\w/Fl\!N154l=Z%
wKV>\X SG1Mi\BEy:a@AMWk/RbXwXlh*V/C<NwD^GXj*>edlXQ6e6/:<db=qa6#L*wX6N&wcDF:?@tXG*t%ce!X
a4QRZ+ D>E!=JT19dPwDjkME!6\Z#G?@51e!?V=J>Cu/NIyP8/FV:4&Rtbe!m*Vc#j*uLc8tneMEVhHPNQkBaJ>
!V=@Kl $?EXLJ:u<EKc>qKVqB?BQ?R$J&6%M:=$RqM?#AKu%=YR\6IRC:6*EZyZAqjaw%wE\^^nYhYXLGZeG8Ti
+m1*P: pHN?wb?FHG8%DWMFZAAQwAG<+FqkaZk+n9hja:Y+NMjkhuT44<DJS4$%YAImNG&PiWM5EIHA#tK8?q/X
RMyG5h P*kL^:4/RF*GN=6^%Qlcb&Ruy%V?e*MVp?l$iD%$/::Tbh^hhc!Jy?l=?QXPHKw4!jW:GBw/!??W8J6<
H!MSNu c<\Sj1Q/AXJDRX+BAuZFZ9M:6GY:qXKXbR+t\B#!84Vt/C*aAh5#YtmQ:L#iLhC1MPnF5ad8pwMY>YG<
ijytqy PAGJ\qduaRVT$9DFjCbF+:=%?=wMEIplI6yEj@%iy:y>EnQJTEDb@#unW<9+LCEp:!q?hTui8lm$YkeM
5G9?nt 66Y=aJkaiQh#w$By@!l&kdYYYR/?qA$GJ=!\/cq6aMVH\NDQ+68K5cp!ttMBn&k!?B:K\h4%beAaXA>6
>t/R8C >:yW6Z\pHPJJ=?Y^8PBqu?yXm+b>jAY&lhmd<w>qAWSjGWCPcHychYqMpdJTuW%#Iw9L9HJP&TmwXGTd
@EkFNN #X1DFjSiQMWTVI?CVLm>9wHT>QVDn15p?8HVR:bmGX:MJ?XQ=:HbAuk\d>HL#:ZHPjwJ?IY^WGHnMkJH
wSkMhT &L%be<N6GG%p98K6RiECZV%&8cu6kFk>Y\8V8Dpw*=Lch5pn\?/4BHVa&e9htVylGX9$Ik&clEHin=B=
S4\!<L T5Y6TY!ANWdCu&K5IcpZn:u$4ZVeq%4ujEESCNHI=TFH6jPc1&T#>%E<GA^B$#p$/+*8leWAwh%6L%w\
FqWVNb nBVq=AwADML11DaJ9RmEDA/pVHuAAaRJthhwn^/%8t$BSFt#!q=ACDw4*L+h*#1MN98\Ey$S^*^u>t#j
BKC+Hy *KZb5^juIMiVSF9><SbT5<AApp#jDX>+Z!lA/!jTWM!eyP&kl%h8HFGNYt6VjVZMC$>knLuLY+AuIjE$
yPV/HY lA+NZ=JDZual*TEMYR9AkSukpnyu5<F:?A1:#iG5@RLGHGFh%JeVj?bt+/KB<M4WWe%HmEQlqyt^JS\+
n1@*jZ iaiPybMaPp$uJ4y&IDnHMi\hS?5eItn15*4j<Rb?w:=lyPBBYEIIatnaemFI1pBhDhDAEViFG#\C=u:X
6qD^8Q B6pHpR$Jh8ZQ>\IuYNcKnIlL%q4R$RqLGNGFEw@F#Nna4ane:HSa?ImY6AdD+\MdAPINp6Fnu/+:$hqF
EYm%un wCyP%/i/@h^4VIaXFiLAe&nFMpQl5lVq!ewc&cCqtY8@Y^=b1qmAi^kYl!Z6*PS1eN&Dp+qaw>VXZCXZ
mP4!8c 8+%H&wuYeu#El56:BY$!WKwIq*dLR&+QekuhI8mh1wZej&\^A6JmqG4E98K^uVihhqQl=:+Cu:9G+VVM
/9jY\! nH+qemipa&Helw<makd=DB#?BwdHuhb\H*^HhS5/AJ%w1XeDyia<DC=Jdj@a:Nub5@W>jFkE9A/X6@mS
w4T&9Z >N+mc4=lMP/:ZG5a!kDap>y1>d@:PVjFEm$HGJ8u#@B%*/c9G=DG/GkHXy4Zc<^JNc<jLt^NGFbYlBW$
BNe*N# %&L9ALAC6+GyW5%YC#FAm@wGNdYbXplYHS1di<iymMYeFcy:*HJ@H*8q/ECt/NHKly@eZJqq8IY6W</B
CLY!wC *FYdp^V%M8Y<4FqeGGKIVtcpi4Xb?lVVB+M?WEh=w:pZFw%^4j5klCHIQky?\jh^eYHV%>TBtT:Z/BdP
R!S$wZ L8\#EnqH%HRMNTC#&w+B1#LQMlmY8@&KK&IJPWemImhe#n\LRuYIu5edHePN*j$1JA&4dm&\@^\Gjw>&
8iI5cb e9Y:X:p4jBqcaNCR+%A!NqwG+8?c??FAk=PLa<iylpQNwk@C+ln&%>eycNwMXT^$C=Wd98A^N/VqPS1a
DphTpF Xaem^&j91a#jn6cPRbqNI>aT61<G^H!V/GpAy*bj=!aLKG+4WlHL\8@@B$PnBjV+86/ta64h%BD4mncF
aV<%9X IAajn^BYA$H+dGHH!%:YGy@B\H^^TZ9C*Xk4yjTIy$=>4\!9\<F@ZG=R/tK46h\t>%LSX?jqwW:NK#iP
8jebLW YlTQCiXqiy^LZ5R4denDIp6#EQ%t1m9Ib6WG/m9teAdbM46Fy#Mb@NYi+/\CGa^pL/$tu%\?=9ak61Bi
b9K#Z@ =5iiXd4\P81h?6bL48D8FJDM+h!Ehw!BBp&MkwDja>JD?A#:tWBjyIRWwE@+M4/Y%1@!5<99>AI$>6&\
wXEcF> V^tap%tj*6Xj^B5KXTwNC@cHJZ>/jk9:56kalWjt64=Set#AX%RSdJtd?h<eJ^%:Z!qeB=p:Yn>M#tKR
\EPa9w \XnB<m8EnWGG\&ucE:!E6*BtNTNnXEVu!tb#NtQawkql/uT4eKCA\#Y\*?qijFN:QQMbcmCWd9F:q\CR
h8?=q\ E1j+q&nT*eDJcVVEDQq+cI=5Z1Ay8pEK\aa6i%AtwyJ$9%emlcmYPb\?ARkj:h4nI@ceT?Bhp^/8Siw$
eK<%8M &mYXNZ+Km+M1kp^&Fjkt6m4cIh5VFh8X\4DV*PdD6>NmBV/GVS!Q$G%9Z5cF/WSHVtG/ibq^CD#!4HLa
K6E%8L pJiqb%<VPuALKMSC\<5kAuk+Nd9Khh#H*JTF:IX4@?K$GF&11e*h*MiEn:q=4Rd^@5b9GPhwY&&nuC+H
\1Iu%P Yct?F%G4G#&CB%wh<5?a*<PM61bKF<nNDCe9iS%Y*PZ<D?m1!RT85i:Y1>AbBKi<eA^PeeLqG*md5FDd
/$yVj9 TFiTb/uly!ke%kVTLbhNeAwJG4=Ra<u<D^n%$M+&I5bm%EG&STGATbXWMa8u>XdtelDa:%JKaXeJ6*ny
SWM$WA QN4upV<aSl8>S+!ui?A6%Fh>qt9*#K\iZ4l5hFyhEHAdRIa8D<Qqk6\KB#qbRW>tXpjjGl^hVSe%eTHm
nE/Fm1 nBF\:LdFM5I+XLkTNdw^I6iCBNRZSZWyw6FZT&n5X1NmCXcidXcLq:BI?VuN%inS1*bAB?k14F8+k8EJ
Y\YnF= a4AR?8XAVyyPQTWWbLW#Fl5L+E\/FmlySqHDQwaPV@e/ajD@SdlWCLW<tTNSQ%WKR<ChnFiGV>MuDdKR
FyuGYR P^h6\jVN:FHQmB?XuV4\5N5inlZKJFhL4+qkPuey>:CC>Ybi?Kn&hR&*8%=y?N=^6FF@%&Pw=p^SVmpq
1%ZHle M@^jPce\#euXcb*J*aQRVmX81*94B#I4qNWiRBWeKT^ui6mT5I/S9PC9=>p%mHtk=qMy<C&6@mE$PL\5
%w8P<B =i*tM:#MKL+=4?GVYm4*Tiq4!>#h!&/+AlY!t>XA8*EEBEV5AIGAkJF8c8S<leR!Hp8H?c!5wWTYcwk@
l&@!JR C59Z\ayLh>1uA!Q5bC!k+ehR<JSu!t+Nqu>E6ZLqIclA6Xuj<*T4#aJl:n8#@8VC=Z=5A@C?+1h\iRJ>
!?e!A* JAyK+CFk@>ltGNETby#qI%DHci4EyGuFID^GVpSMmAE#4#^:4i:NXh4LZ:!E<iNwnb+BKRBSL?yaTPhI
Ta/uEQ mkuV8?&\%GbQB:Z>mm?49<wqub#9aSkjyMKM6&Z:ZPHYJ<<RLTGD?4mHjVL>qF?<LWYqHdQ=m8bc<*\M
\K5q^5 GJ&D%ZN1%q5?c6t$XnP1yQc$B>uZS:%&HhJPQdYNht%%A8H**BBCeKnAc:ekP&:T>b^<BbjWA<+p#cI&
WnBYwy B$K\WXaQ5pK4::*\QneE>L4i\F?IBduLKZjiV*HM5#5c==t5FCppq6AGa4hc1L/Z%L>C^qYb&^WBA8q*
@u<t=R A<Rml>@aLcZ%Wy&q%ZFFG:X>LN!5NDVLuWWcZZ8SFb*9/6ChK%ec98=qNP4KnZ:/JJ::EI=<&qQj?lHt
1y<1q@ 9mjbaA=QhH#hn=Rj=9FPu$=uqCJ?ND#En*C!n#&5NB#iyBCJ&HeIdZZP\9i#*nJkJh?dW%LKV1eVTy:/
AbmS*m <%!ZP8MXQ4Ba9h1PGnt>Q>nGKS+Ww5#Rq@KHS1ecDMKm\%RPkXK=h*Ctt&WjM>b#D^%S&y6Wed&^DK\h
6FpPqk C#F4:5X>J&E=J$y9+j?STEY!EyNmYnEY?GDBkypl>K14y/@d^uEW&AqjAAu*in9eK$W:n?=+h9W*X#I^
Yu::Ip \qQ\LEnDh:V*E=\SZ*RLAM*iK?9?uLeZ@CuITbXWb:M@l5VyBlJN6h6JddYu8YdY*^M9YTD>Yt44T=:5
86kj$4 KG6FHZ?$cN6@^Lm%j<cEhcXi?=4Yu49\@5L?qW6@9*Jn$MjNGtQPD9tpNhm9TWwXjm&YLtwZM?Jq/Cll
lu^AcT G8/\@qZSp&?je+4Zne/jkHuI8lFL@!EE8+E\JcSS5W$C1==IJN4%9S\J#c+^:#ipbk4JJSq%hWYn*%+p
cJ\kRJ y#W+N+Yb%y?QLKES6@u$Yy45<mi/1Q<49yI9k%%?=>1@/C8<4%*%pn$*CYmH8LpVBkSe1>t>uHtQPn\F
JDG*$# mA5TCFVKb&TPk@$jSWCABTKRGyL>JF\iWMPu!<1Yp<u!<Wu6+Y^IY%X9Y*XFtThiN5L!aXk/4lTu^M:n
$WY<yk Sch*+cc=jaPGWb5VME\c+LKtjEV@TXYK1dMAFQ46%n@VI&P88KhTV1K%ARa1AwRbjqINSnXJZRqmEbJC
=I*/tq F?F=LMF%\EHWB5>ZeND%!Ni\cYV*9*E6iW=LtyGMCl*chQb:9RV:@%+TL\/tbQ<Ybe!jt8*d=?1nV4Vb
jGaTTP C?4i1c$iN6iGtHh6eyTE4=&j^/$El=XG9//u*nX&d9a9ZAeAwqp#j+5L9^9Ac>ac=6yaM@tjHA^$%DNJ
\+y?wc /YHk16Y>%K?4dbRpw#j>lK8lF:Xw$$:/E?LVmACk>Ri@kqplj%ILCWcyq%dLIDd%9atuE6A*HG!:?e!E
N8Jmmp \4$>9D!B:tq5L1hMZ$FXd/LVu?+e:LbaANC=&*^1qCcu*FZu\/p?5ZnTtPX*ipltJ4#6%?=X:P^EB6bu
Kn5mq9 !WSeQIYQq5ai\8=S?ja?S+i>:J&mQH%!ALkZhWDq?@4MGy*Xt:&nC&FbqVuKJ54tp<uAh<M8+5*DPaWV
SXJYnT C:q>M?k!RnW#^X?Cl<ka5eAXi=DVe:@wE$X8cQ5L?@<P+q:EuTmMp\<XGV1mHDE\/TJah6DhTYa?/$Mp
1hiRCS #w+/JE/Nl^un!aubGA<j46ADiNna9ba>9+itEhK/FtJTbMh#juKeHNu>$9<cFu6+9mhlwb#6n?ZDdmkp
:Z=/!J /bD5^\H4n#%acL>SaMcVB#?Njd8Da*<nhwh?e#Xy4w$k!NEmcicit&y=J%$1hSEi=\1kR%&6L=^JEdAJ
GjGwQA BNV?Gh$=B*SXdt&!Hj=t@$Nt@=jTciuW?9G>i9=Pb&#HM=*yJ/HnPpTCeT4lRSFq<=pF%bkGpA=yP5LR
8\VAmQ GwSQcB5TQ4q5JP+y%/k<^XC<ckYcXQ=He?<W%y>ZX=^WbRA*\GYZL1+X\/tuSVnPTn5WjDnX?iT!uhBc
Q%ek%5 jiqJQCb*%HtI\ciQ#k&aC#iTWmuLBSn?V6ciyu8p:QP$McDk:5S8#c*BESTeFN8HW\QZGP9/GBiy&cNF
-A5djc 000f8dc3eaa001202b3 Page 69 of binaries1.zip
9#MbXY c8W1tCZFGT>*J59alGiZw/n9uptZqC@ljc!tbFXE^J?\XM6qJn@W6kC>^+GpSQ$Wy<8aH6WV=LK\Nc*w
\uyVT? Dl%ha5&keIBA5&REcPc#HkNBYP+%CC#L@D9I/iJ*5WLeujhK@4CIXtBRDAneb8Z*6kE$Rbd^eR<ZNPWB
daE^cp QR8ak*?%*+%aS>djp$cFlc+qtJKZqQ*n\P>+?#<P1mQdn=ulWdD1R\A:m4k?jdN#dc5MGKCI+X//RNG!
@T!&iy liwcuyd5$*XIA5RD:aZ4b9k+@I$LQcZlD%^+9:u6=CctiQRQ!iT#I><#jZd+>d4?u$=6+#<^V<T5FR>+
BAKnIG BNDcHj5X<pl%:yty:d8kdhE6!EuNHm:AW!GRwhy6CLakD+de5ad8>b9G6e@B\PtJyyyWh<hHhWX/Dyne
y9?<81 8bK/A9AlkKH8CuBT1W?nV>dAeZ@T5jh^:1EDA?Q:+pju=u<RFk\N>:Cl%y:!c!/tJSyRaAki8nLeSneb
blN>AF $n*w9yn=/RQ:awy=J5>8d:T!jkaukE/<Tc4wJ1PquH1eDSK98#McBKiJAZ?<6$/&y8VnADXpeI:$Vq4t
6#i*<n >5ZtkY=A<D\?!ut?^+AQ9MLan8:D%aeFmXLFFj>Ta4cMY%*8hRZCuKkZ$=LIE@XC>$Eq:km1Tw!9ac1h
+Nyc:S /ubPYXCLiRj5$T%Jj\?\?kpqQ<E11GFuH?EBwHZC\tA1uF*$MnI@k$a@lupME655qWYdR/CGnGb9wapF
Q<6$ue $AAmMPtW@CE5jd18mcit1+ZD+WAuNFN5ltRc*eS5=Z4#itIIWbSkbGtL5WHB9N1k%:4DmW8MVL8inKp4
H&BT!& Hl%!FawV5t+nLMp:B?q%6XqSy\#i+T8A^S:%85^tnlLkFReWB^Y@HPiTXnHAcQHSZPQ<a+C5PDlVjA9T
WmYVI# piqn=D+$6?cy#GWJL<FeIR\$@RRbWdjK8i^bW#&X9Vj?XBbRFDV+1y>^uK9#J%4uQpydEj\/YG4>#Wl4
TqHH:Y k\%CT$tq@G46Nt9Y&SwGQl5PXP#Y5/lh%Y6:qweL?+Y5e1&+JH>!VMphnVC+:Vt8%\<X=DG&5:1VNAmL
Y*W$n$ Tk*yKI#lF\4WbZFC^wBKE6$bhyK>bi>hKt+VmWnNIddMDKNP4j6FJ+eHuH4<aJaeuTl%\tYLFA+t!:&K
<beSCQ aLJi&Z=^J9%/S#YFElC#%Ie<D64dtdE<nNcw!>eh!P8:Nl+*K&L\Hpt6&B9dDS=YC1@/X8<WHP>BG$jd
VR@bJ+ Cdm1@yd1AkTJA8bpb9YMt<C>le^Re<$n=A<lhn4l<6N%bI^hIc<46^CtaaSCMQkT$KdP\9Y?lhN^j?*4
^+NdJy 8W5eqTmmRjQKhD*6eLk!@j#KnYQETawN+eWVKTXL*j^EY9yC<c@CTXny!<myJLY9T:+i*H\YQ=JV1c+p
p11!H6 <Z1S>X!9SVuq%yRa1/yDtPtBWd>HM!5iKhTb#EpMC64Fe%P%@euC!h@PuKd5^mu9Ynnh6>/qJ:8%5PXF
FNlpei CBZDC^ie%<l@=JCBcX1yLZVt=uPabDS8WCt@FpIkj^9Q64:Zdj%a@8u*S@u%c8p16+Z>w9*&lmwhGnW!
5*:leB S9ZTT?F%&PcLmMBu4ejWNml8+ktLcAXcJCdkSNk9cycX><1alwi<Du8GIu#VtVbch6yPWNk<11X/6h9/
&nYCVN QjSjw!eCnIw>4*RHwWKLRIEF^>ZA<\4ki+1@<SnDLwnI#MT1:G>QbBwlFp\<<m&qm1Bek*8b48$XKXGt
5>$aPI e95T/HcT>5CLS5D4Ra&PBZMhWZFaRp61d@XCc\\cCJ5El4TSiLRMiR11:iEbZn/=*QqDPAcQI1\+&b>C
Dqdh5C N%1$65eJ?#VlX?#lwDnen\Bpdk4:q^F!6+bV*Y!#YwVee?L!q:w!V=VGVBl#@MI:FhXmc>#ukbGQm5R9
@yHn<i na9J4aCBwcmlHFJ<!#&WSaQKKRekB%GjnIIlN<Qk:5kP?1&n9bpXqe<keuFAMcejIjT*Ai%J\tVAm^GI
G^MwKD a!ZW+ilheEZ8hF5RyY8uZVh5D5H^qS5GnH^%G:IQ^y#NXXT+D\P/?9W>D+N8>>Ahb8F#G+N?:thNClWc
l@cW/u @5/Mwh&Xn1Hp+aC9%GkpKVD9JlRECBdN/^SP\upHI<#n@YQd$M^uPaZ4l=QBL%IHp5c*j6Mp8JjeCSnX
+HG+@# &I=4nGCXq&&\6LyDBS6MLSuRSp5Dc9J&5#!5jZW=ncnw+k#b?bJeBu96?4SEB!ulR:V<yWkAQ1J$BMRq
pQep8% d=6J9jFY$^Z115=*?Ykp<4Ke^Z1Skku\t$lC8M!dCt*E+!cV$Y>X4wjZXWBD@BM9kY+JG5$%kEQ8^I?a
%Aduy# 8&InpiuHX+B^i^GGqhPVBkiTS>C&n&cN6dM4\5l1+eL:>9K/FA#XM/:e\CIGXIP#Ib@p!6TRW\1jXy!T
+=i%du cbiSh=*!9kT6YhT*ZuhX*1<RtRM14FQe51ht@1d/HnJ8//>*cS5#cR1RcP%#9XEy+D&8Q4w+X**Eijb%
B^QF6y <%NRQ69:d+#V#V^jVl@Dq8aC6Y#CT#elG/AkAS<hdtp=<Fy5Jau>6bb4?=n!ml@NDhGD9PXlwyEw#=#<
<Lj^QB P1wWK19?GqiQYjYbY9tQ@C6nmwc>=*CAPcP?c5DF=$Z%94GXhIYW?nwqbIyaaqBEIWA4QX\Ak:QhwJIV
:!DqNV WBLM9b^:SS5tmSHGE4+^h5R44BaSaL91GiKQHnkIwMM44&JDTnK&p*inCylYQiynZL?h\Y%IBpRipXhy
ZS8KSq bwEk5h9M/#e5hylbjXpRmay1WaSE%AeBNn$95M?n=8KRmDFJJ!1?my*m>cLV#+EW+XLMXIZ#D6#j+BNN
D1e*>L Bw*4Ha8<jJYNt=k*Pk8dYEL!/Z4jB$NN%YH\Al/GRa/9IMdZV+uM!AmD:?6dGFFtP*nq/uhwmwX8neIE
ipIkth Xykq@N4=!F:le:BPaCL4RFYB%!&ItPyT$EQI*w9Ht+TFq!4Zjb#lGE+cn<V4qi5VV%E/lwT+\<MLp/M?
=c=GE? FwHV\EDt?Buk+iJebZ&!wBqH8I=P891HGT#w!!Si4dLnJ:Qn^SI*/Y=%+?LD1eNQL4Q:FX%aKDFuTt*C
mQCG@W ^<XytJ!F@jc#h1Yek*ABSeyiX#h5c9t4%C*b^hIWPSJIu6e*$m=A+Z\tQ@PYm!aet$1@K4liXb?9Kj4R
uP?DWH NeZFJw!u^lM%QdhLeku+!@E#:euAM!/HnFN5Yu55nSD@1&NPKM<QN+S86+Pme+8cl:XVL9%NN<nRla%l
%kAt8c Z+%&nIRHNTWlH+FI?Yti/ucq<b#iVuXqR\bRYFL4Lnw:FwL&6edI9DpPH=&4Pl+#Zwe:cSdum@P8P/4i
$Q@*lp TK95L8YcXBw>WeQRpFNIa>@*\yEq6hWnVNu!a<G\J#WT*+1j5Bj?q!+PIn:IShjkd+RSqKqS6ilTCn/H
RI8JI> T@VHylqeN^J*\EWVkwm4tHuH$a89#S+uHbQbqdqA!qIPA?WZj&m:k4ZuXy^wudkQMRpX@RknNd*t%KJ1
+>Ct!8 ^@ySk+iBLDRtHt%iuIQmZZYFi!MydW@=yd!ZLGmVXw&=&CP6eaQWSb91VuEQbpYh/B+y&uaELKKc!Ey>
+udbt9 =?4<5EJ#TcHbRYm5HJt+EBuNMpQ$RdkVP^miaW!RwQAV5dYNw*d6hnhWMkctIpj?yYNnP^qMyF\lh<LX
WX$>uG d:/Zd4nm6lCBCRM5iL<Z#GJpW^&h?JQBG+KiG>5J5wChnG9ae!*lBV&EDnMF<\$D$kn\L19NaMVP@WH%
mHK6e# >TE%uQphcT:B^8#*?5VZ\jLSi8$R$mi%DQmQ=!/#%a+&S$mnZieHkw8F+IQkk$DQb\H>kWW8KHD$Cnmb
N959$n L?IuH^TVlcAj9kYC4&CElk11&?nSyWq8aCSH9*FL%i^&*P!N\#lMKpFPSPw\6Mhe%QE!<=pFd/@=nnCL
*@Q?l= M#cdV<*A8?T#eW:YW6WLdbqmi9Pne%C:?ime*!JajNF:RDXeJa/!V>&IIKpDMX/E?Bkc?61%4*QamDl^
t%V>/a Q#u=&/H^j4kL:ZuPuAYcR+CFlZ&n&l8X/?a1Xt4:GAPy:$Yd&Ab><4jBZ!tethVNZ:D&b6?M\Gj=#SM?
mD>FqQ <GF6\:Wupyy&AhTbJ6ylQ=\cWP?I4*AdJu1+S<MNq4Pb+!uY>$*5X516Gikmw\bt@$6I>YI9LmBkIMDA
jKT\YT ?L+Bab?=1YhNF+>u8T9=FPV9<kW#TFd&TqIiRI$QRtly/>BdqZRyF^1W/m8WFSWp&GD1TE$^hFD\qaK\
wyDJ\> C^VSuZd6eT/6QA!yt8khTDdhN9GW5ZcRA1KeARLBm69Tny>$\5J@\KTkGuB/@9T<jaaTDaiPMK#BE*/#
LWytNB ?plT\:C@cyDE\cn=BEQGRklpiD=FuAjmW@AbRM#HSI%?y^:EIRKSH<NC4</M+IVLN#H\+Y8<Y466B@M6
\Kanjh qQy>!bAdD*4wdkpKRYJ%=4NPhGjA%@6RYKMt/8DeQAcKY1$8FnWDMKD*dQth6nR8ka<Qj!anwGJ*Th/B
l9yp^y 91GAIy<F<m8H<jw:<AZ\CS^EueZA9dcRaHNIN^b<Rt^8!K?u5=ny?5IY@MEM<WBE:FbZ^5>wK:49IQZ?
FEPq9Q AYX@4td8wTltD:<&iwZ&GKNwJV1I4VVM<FN<A%llwbp@L5YVj&m%n9y%=/%BNKBk5l=Hw^j%mPEln1Cb
KJ5!K4 nI8MBIhujC:QRJ9R%de>YQh$Kp%c\b<aEH4:J\889?p#M>h\8ain%+ZIyY9$DnIj?kbB$FCY@kMG1uEK
<MeD#c A$?=Jq%?STM>p8M*ItX*Slm58t=bF+iQu?tM:jS:%a\SATFjeYPyTRWYZ?l&DuAij?jElI?*#S*pwn&+
B&VCw4 kjdy?V\t^!5!@#/bQ$qV>hEybGCpVq=%wt6!DqJpnu%VB<9ueAnZGlaIFQBEuip#*HkiFka<#nYuc/=k
w@^KlD EI@DDl<cQ^4/jLZVDL@j<cPCG4eK&SK8RK9yDAXq#n\%$K?tR%A8IaHK@4^HkcIIN@@AELRZ<i/l&emH
JwY/TV W@$?GaXWcRiTMkytd&G=^iqiNn9F/=%+<cRw$jRVLCEEAMc?hM8H#FT/HaHh&!iZZ%ua6Qh<K*+p$=<>
Pyht4c P*eJJl=9YhS^H>&HW1*^APnW>+dVNMCW%$n&+l=%tZ?Pe^&IXey8ii>8/wKAb8w<AZkJHX/:%T14qX$h
BlEc+c lhP:d6TlbJAb^/PNqwKHqZLZGpn5hhqtY@&G1%tAIu&d#clKZEVp#!CR/\%LuHu4ySCWwTBc/+Z%61Mq
qmZiEl <?%t?WQ^WuQNY#=MwyucQkJ5GYPwdeqcaaVk+c*t5?w&#IKVC&X@?EPkAGqjP>R=*P<V\bwHDeW<mwwt
$LIn>k EB&$&jBZ#qacbnXycl8+SBmcV%=ERuWdnib6$K8CZAbdTS>^mwBd5e$X9PucVjB#M5/5HPK^5FDWW@@n
IGNcna q9JFJIXBmwj?MK&Pp^nq<ZVlBC!AKGC/FM:A%$$Tqp8M$=Y<eKb&>Ka%u\HwBlq1H$Ficjth\%b4+PK$
6&KWK# DC^6:8>hj1e%jPAAeHDqSp+F5ISBAnVPSE$kt+tGX5j:F=ZckS65^+6>&BIh#a:*n*^ynPlI6wM4+$M?
VFMyWD kE+?8a^=kM$Qy?y:TFVEn\AE?IAcyVtbWM$yytu#yEhkpQD\H/n956Nnq?9u6w!PHYhtm^WL>Z%$c\nA
uIL$5G lqGupJy#k1tN%wZL>nacSduIWEqKV&=<+TqEPi\J@/K=HbY>R>DWuXmS^e#Q$kl/FSWKNwK5?9kc9#j@
ejAiDe R&5t>*%9hGj=uYV=m#=$^GuY6F*h^1yhIGB6ADtTiMq:kPScw\?5aMF+A!QBkhDFp&/Wp#$YJ#A%/aRE
@/!4ay !#:PXlDm6T$Ak@daVk<LepWF$bqF$9kVK6WZ@h!N%5I=Qa?mT\I91XAH&#<+Qh?LRTSubtG/8XNK1td&
?N64Yy VVQ:Z1RALE+@:u\N^:pZk6<FTw*?ee9ZwlEJJKnEkL?Wqbi8?Hm>IXN9^:j/DXw/A?^uQ?JMKGRV&VD^
-AhANP 000af522332001202b3 Page 70 of binaries1.zip
qq*uS< mX*$C><=1R%P$cdMG<4PE8:D1A4!H#y:1aNQ6yQ*R++@b8V@p4w4ZHQHCatP\hdbwn&4^FCcFWaj!mLd
X\X#VQ E$PM:?nk^&a$j@DnAHeGmDWPq#LiA=8j6jA1DKw45Qt=KdCdiM9QL!C+@aeY/W4*pl5l/q5><Xa:Z5?#
Zhbdq! w?w8Nj*G8^V>byDh>Lwj1h1qujB#R!w>+YNtXhJT<B>w*cmWtI>/E>DK$JLSuh1GCCM9YYQ$J**VpenY
Bkl*W1 <N^R:8<>Y9Ay!YKKu%^Y:iw=4V$HP&?86c<%T4<#c@na?HH5l@5deKc4a&u@HCNid?B8yDPARa<YFPj/
^nBLD9 p*%5y*8=AnpPtyXKj6wlXuHPGj5J*@!6D!<B1C*6wamXYZ6CW?<D+SE>Mt6@tdG15$<*N+Ame^MEJ>dR
9aP#\/ hNyPm$KiT=AyB4bum$Mi6w?QD+bEm<nDnLpM?RY:L9C@upHAADDky6aEkhJQu8!+yZwF>eAaAq/!/M*?
K&\?ep 4Ltu*4cQ#tp&GQJK&A1B4neNYmZL:@TnT>I*/ZQme?ajh6\4PTT?Q?\dRCHJ!qGkinTLNA\VMe&p8qK\
Xy$nH8 6%V%hlKjmj8hpT?H&N^^1!9phkdXt4HV@lZ#J4S>I^idwD:akaD#Z1ytLBY+RRcHRT%Mj$NWB=h8A<RY
9qHbH$ eqA1ZhmB9?Y&RY^q><8SnB5@eZNRc+chCY\$GnX81CtqK>N1^VlW/d&4Ipn%#YeMjy?B:lnFZp%1?#q<
Y4&W84 %5J1e^W#bQtDQh\/&?jN@5L:CTtCl6$::G++1WR+mI:>6%lZALBDMFYpecRi^@5k#F@ui<!tHI$PnJcM
<>cLBT $Bhq<tNh/q/hmcjF6FJSWC&=!nEcV*M/L/TB8ntPY*F>udQC59#D$@Q>pwqT68WkLB^Q?^?$yIY%\9mF
wenWQI cR4t8X+m\*JqN%n>B?tyn$8pmNX>yD:auP9:+%4%my9HnDH!Eh@K?+GhlGj?K?p/mAIW^&u=44M4:j*C
M1W&yB /Z@h1M\NEytTH>8C=W5Rt<%6A@m5E=KlL%Vmq:p!/$b4PjEIeP*hbu/9aJKT&dHbqPwa$aHS&\Neq\QA
6AM\4e l=KlAECIYb:%d9clAJK:1W<SAF5GkE5CALu@FB*NW>>#Ld$Aq+^%yYh5VSHjWhe51^bj^$*#BK=Hk<F8
kZ!cRl jc@p6+>&D//^d<p<Ru#Ld&tahCY4&4=t8tQwcc!#itA*$q9d<F9cn#A=/9JACHwNBQ9KBHFqa^?AA9ht
PX&u#c Q8B@htDA:p@WdKb?*!buiQ85&jXS%<ER1DAWqYPlaqY+?F%k%GhkIjRuH>BkQPqa:X//8ST>D$W9Ic!D
56<$!k H=y*ubGhQwuJ\::dT4m1+#V\Cj9IJYHWaGit?8@R+FVA496^P8ukHdnIF/%:NETHYCMuwjq+B\S*?Hjh
>?VK%S nta5pt4R^+SQpe@Qw6+QllbeE==a@tFa/MZ91%VkCkSLl>FTj>VXEjWnjhBJmt%RthQ9Mud&:#RVMZJ:
DVMGSy =bJDRC=XM8%l9*?j^lW^+YJ&*5Q+65#b@8q5Hbc?c6Q/m::elZkGAGCdWT<M9+P#j>N*Y?u5V$c?:MN/
=W+#Wb cVX&J$^i?5BSytm<b:?&C8N9DTL\uVT?D>:#audH1XZTA9<GScc64IB<YQ8/#QNinaGeCEJi1#X#iHZ?
PX%1=w Vbu/J=hdM\lqw!Zp@T>P5??tLNIDji@kajCRPj<>Q%PpJ5Qu#d%iBLNJe#8QbCeI9yu*RjNb:9>S<K6>
8+jbW# 9FpjWHXTe1^KTiBNuN/F<TK&4aZGe@L%Fb4/&w@X:cJ!%KELN5Fjjl#b/W<:JZBMw\Ecll1$1$EuK9cq
Yki*bK I<YkL$jTLGlS^*E/D:V=>6uuyC5T\R^L@?CIem<!py$+?EZGVXSh<PdyFjIlJ#Q959m@+/XQ&mlTNlM>
Q8HiwD PeuXiA/+4q?WAikG+uC@YJkDRtHRW\p+Ja$qd=lW&Wu6>VNG:$h^Y5hL6j$ZXS9BVhBXRt96=eV$S?h/
\GS==V 4p#@hPZGMP&WW=jaH5DPPX:DjwelP/ZT6%Q#>ymEhT$d<j1d#p!h\Wa*hYy4H#yIP@hRBhnT<@NVt&E^
TMJ\Zu E@j%^5IY/5u%QjTdRlDAu>w8JVpk!8LN8iNQ:TGb4^>Lw=:L%^VL?Bw=G#YD&=H:C@b\VH6J#K=6Qc%Q
<PmC!j LnijaXYDb@dwmlnZ&W$%GK^%tN:X!h*uJRH+EMw/8HEJ&V*wIiB:LCq6Q8MG$h#DAR+9eq!Ge8tu=\ek
d1$=lG PaHSeQYYJe!EwP?5ktSqn4t@JV86?^i8M@XNnSS:a?&+Ln9GZlbuF&5@6jN<bGekqVXqKN1Pm4%tjWY#
q@QFJQ $LLTl4+q^$5t6TpJwaTk&IhImk6FpbDHwVi>?*iPI?854DyF!M#wPhye<k%Q!L^apH4WVtWc9T6iRTR5
JteyKk >MNu:q^&YBPE1YRVLR%X6:uP@LF9i^LmeN5!?WFEyt:k@IECDPy/\P:#?HXa9dGP>q#q?jI:ihe>nF:1
Gn=q@@ I?\RZXaCBGXT6+iKZhX6Lb%FEKcXJc\@nZB$icZ4JL+J+@bpSKaNCTM*Yy^Gw<^=91KT1SKSuKA5t&pZ
EG^AW\ 1N8kY9A?W!\e1ytd<8y+Qk*=E/Z*<p=kBYY\IeYpqNDa1Geb#^8p+jt+Gh!64ZK\+BjSJ6/YcA&dJXw#
wXneMk %QLc4Y>$+/i&pjZ5+FnYS*QNVNp?:JD8+L\&By:aAc$TXd=@ALP@/QCH5D?%kW6V9=@/Qiw**1TSjXh1
eqDyp4 #*WnX^wewpFIW%?JjPWH=q#Et?#IB!NST19&ic5i&#pa&TqLpHhTc&6S+cEJJ8^YQ8J#+yE4nEbFH=K!
iS/&l= HT/Zl4/>L=#mh!!RK@#N>:+FYjpaAuinJbbLW+5YiDJN5GRl!M$n:^+c?<n:mS8n<Wj<lBH:dDRY9?dH
p\n58% %e\i?/S*FHIcNDmihbNK&R6C?=SR@ywT*&W8bbBS*<FBbKRm4&DVTAiH^$5b+:lCdwH#&6:>Quh/t*X*
dJle>h b5<P+TTX%c6*#ctuqGu!jhnYw=Q<IF+j>SQ:bPC*18?JmV6n@<9Iq\\?%*>?n59D&Dp?c4b#ZjZS?l//
m%aMYV wSE^8N=<WlCb8q8St?=S$C$bD#@X6j%HA1nI\*!F5#!VSE&Z=QwYJT*t/Y8%wuKqQQ&R+H6V8TuMJwaq
aIj>Km i?aYH&AhD:I^GVF^S:pVC%bAP9<DnuP#@%:kAY&k9H=QXXuei:/9/BMwpKGF>P#y?e:W:@8>bq&pM:*p
XSE>qT GwEdWu!#I%56KpZZ88YWw:!<n=6eZpZC9WNJ$y#GD\=Hhp41QFDF9%=W@cyhK@dZ*Rc&YCGyYYVJ#S=:
:y@m^F 95%LQ?RQFB#+<QuP#C1d+Rw@8yc+R1:CH5yDq<u^ApJSWREuqtDXZbMcFL:mwGMImNX$kEC&L$5\JqTd
XHbNcR I<^:*YlRWY8HMK/yAS<E6aWlN8G6n#&AL4JVIh/Swu/H!y4h65>Xi*PXHk+XVtJABPcQqlTpq=%K!yRP
9iK&!9 iphjd4nDulNdHkl#$mlJB\V<ak>CRRMM/$\EnlIKK+:adPy4uQ:I9l5e@t15@V*qSbyhFXlyQBkkVtBL
RYml5T N=VnY+QIStIaP>:\IuakNJw*T?dK?cc/uQhe>XZ1%:YNq*%4y!4A9P#cdy=qRRFEM@!mF!S86by4\X&$
m>+S1k 4EHeWZ84Y<8R+AqLEMyEj5YI#T:Y$4:RePBc%8kPAITeuIN>>SNcmVbakquQG=uG?yF:Q%%+9+@dL6dR
5FSB!^ Hi\WTBpjPt8pPq\&B5W&tFI/!D55J!CX8*Kdly>RNQSNNVyZCtq:yDN>YtJSNkkA$CWWSi$#D?Baqd1B
qGhV1i w<&e4L>#i4=u/9iJm#wSLT9d4pa%uepeqyjp1T6<mb:HIcBtMB85iu<R86X\c59BM?=VyVdTwFt9\*\=
WZQQ#w !wSS%q/a%8>\qDNipq5w@ILLP#GdC%:@nX?:Q5pycpiLH16pLm/L@l9ZkqZBTl*#C>N?Y\IARaN$R<Wb
8dD\6e A!IIytS<5!E+Q@uRXD1%NbS%hIITmi@HG\pLRc<=XkS8K4KQ4<mJIHK6KW$%#AkV:M<lIN/Ab1tAPu8&
I=RG5G ?kn>HmBEbu\KR@e+amt\qqX>$uq>kKTk//:$G*iME$%B&5kJ$Y%+dmMRttuNbD6Q45/DBW*9%pLyL9I%
*nXFt1 8wR8Hd#X<TPpLPiGKtXnq?6twm!G5TbkVKn?dd>+9npHI$e@e1<XT:H&LQPD9SRi9jA?DP9C?$i^/pZ8
:9&\dk \eqJ?N/4kk1VSw@LVm*L>@DipnNIKN=V<J=AkpTWBn1ipTKjt8eKPLaa+$#GL8cpGjVWm=%t$M<VPuML
Jm#+1$ ^*^8Jp!4ucGV8i11QiXSV#BtlA+E5<V@qiJ%/4=&9hiuK!XnQdZ\Fei=/H1EkXw1A/\y*Em#<8#!V/SP
b6?ZlE DIYIkpc<5kXa=leP=mwDHQ^l=RuJy&V5RSG&D*hkDtFuHNP5cEkcRK:SN^!!#TCQ?lQ5*l#C<aX>P?a8
Gh86#4 yV6tnYYp6y=iJ4NuS:^%<jJT%>!ah!CDjmpIh6lmWR#FWe*K#CY<c6?SH$W*jWAk$^@9>&&cP1J>MXac
%/cp\G %FpHJbL#eFK#b&9:+pl$Bt/\F+@4!mX#CH$aRba>6%%w+Qq:y:d^mueJHMd^&?JYWK86hW$X<GPG+B9+
\&6uRj /F^MBJ#jc5%<e6pi%ZHE?:NuIcYFqD&!nQHT&MNKTZ$HIQ$<>5GA69&GV8eKi4G$EE84ZNcT<*VXqh\B
*dhKmb =PYmP#*!*w4knH*$i^nAL%lIYuRDkC:SAV5<4G+ZeBhKhuC/c>qaBB6<+SSP?KKTVH?!+I$j9YALwceq
5?aeLH !Z\\BE$/!jjY9A!y/*BPZM>D>EK$1#Rp89qFj%AA?8<YCnA&ht/ATpeFTQuK:HGdl*FR1Kc6ht:<mb$Z
84y\9w uYnyGJ=G9BTqPS&u1hj\RRGN@+kYV8kTpIDaKLDA%41^B<i+WYWhc+ZGHmA5<LQYhCFDiHeQ=?cHlRhq
\HLb/l h=B@%/p*N/<hT?*b5*uaQ5:+BF>Q\jL48?&=e6G8L/e:tT@lI&pNquu1Q<LkDE8!Y#!hX?#wQ\dd>^>t
!HYSn6 ?VibB=1%EPc9j81a5=JdcT8CY*Jnb@@4tt=lFLIM?:j#*<:E4Q&Z5<SV&5/Rnu:l=C@+/EEFa/+qjNp5
AkVm?E HewZZ%FN?G+/R@qCaR^XPYCkk@VqVKXE>iwR4hycM*mF>w>M4=$P4MlP:<bL#91yeAcXQ*TA6i9j>6Xh
i4ppi: Q$=#?:pjD=M1^*w$G!*qT#*l<p@SubLW4uYGK+9ImeKn&mMkHh8K##G8?WHhcLPNSSh4Zt^PC>9mJd@Z
a#FP%9 uFFBi#J+#jW9M@C5e:wEH:nE/M!<Y$wPVPBkX4It<VMDjtPJVF<SMS\X\CVD@%hPYG1H8LadhCcDjk*^
XmLqJ6 m?5d/#?Zkc1TqY*V11y:=G51PCPna&@D8j1*ZbJbKRkR^EJWSmAAp+V?4y$i\!kQk\y^><//*/5%\8mA
qt6Nb# ZW>w&Y:J^DEe#kN?Z1XaSA9&G*pQk\:Mjkl/%+VDt@mcIGAk!KYyLnCq+VABTuwq+nRIRFRjcXLNPBDX
w!ZRNR %k@n^XPAQEJqk$whm>na^hDXMN^Mc/Y?Vdn#!iZZEK$IduPZID*HpiEN9:Xik@XhIGBJ!tA\/VQ=8CcV
Dp#Rc= 9*Mk8C6H\CpCKFL59SmScN?Wd%w\bl@eHc@hb8#pClTX^5VVtXWA^wC\y/\t&<??nbaeLJ+JD5+X<Pe@
T*?%Ji ehVGKFtj/>&anY:t>uy\iNMNSHj/8\Vkq#5#1!DZSb>RJFqPlcT\P5hVE5/8J>FcQ*\B=8quDI:6cKtj
8&hbMn Xc+!WXL?KT#qK&+i@:AbD4$AB5aGn9eE59?$F4#y85*e6A4TnC:F?Li\?J4*M^y!:m=lXhIE1NNqLDnF
4%Ec*i IqilDaMZSIEcYYehbuE+bHYQYdH?LDqEBWi$h%^+Q+hA!y:&le5YPR>BXedd96>BlZYpSwdtK9*i6q5#
-AD5KY 0002babbfcc001202b3 Page 71 of binaries1.zip
T>Sbl1 5&i^w^uPjQb5G+a@d<j<eh4+ya9V6Q4=m*P\jXt>EmDIQ=wL/IPqKV#w#M$j>iK*PQ=uX6#^9?eZM4MX
81>Klu <%ZZwjPiI$Le9Db^Q=%T?Xwm8=pthCjNl4wJtYXE=um<$E?IG4Vy6PWFh6>lV&c9!@VuQdN9%#cP1QZa
w@M%8N uj6j8bN@T@uMlG5$$WitQl*8*H!>6l4e4bTtH#cjeY<X9X&$NQE$c9lVu<My?#B5>GRmT%V@66N<%pP8
1nEq^\ p=acT8tS:$btcP9@V:Q%>5^uZM!BlFC1\Gm5\a:5jJ1E1RVwVT/tJtnHbPj65$QkHh*H91V1RQ=SDKlC
&MT$%H y*4NWNMVLj$EhLmb9>41n<*X\Tdyh#ZI=lS%EDQq8Wbc*<?<LP*dH@EY<8bp$+h?\hVa#nHbi>e+kK5q
i/RR5t ?BVuJQ/PqdT8i%yC6$EDkuwc+YXan$pcnQ<$B8^/8?@/6/%l6+w1l^&qF>+*??:FMa>%N=C9k:8E1a@h
YG=\u4 >F5N^<?p^@\Ae<:+N\MDNqQ9R/pF/$Bt#^4:/Ti*6=>eND=:YN99\*F8%<CM/u5q64?+A%:584X5CQqQ
/AK>1d mJ%%8PNw4/#QaAaK!uhQ@i=^Q+nqWn@9WVC?+jq?&PjqmPI8SYe@#a8nX4YtDtj8uhpQXXj\C44qkQ9@
Ac8Z1a H=YBh%$HGE&L:Ccyj%WWycq#=w8aShW*:>8FDXNnj4ZN>EMRt\4cncZZiAp4dmwN^h:yAlMnNGEJL#LG
nMq6Bi GHYTk<4D:H<T!Dae8e1D&ytb48THe=NePaBbhht*ui8>qDCptkM#l<XMJNRhiDP4:djQa6@Eyy*kk+:Q
eqY/d4 TGS*&Y@K\+/M5nbwLJtBq%!>heq@kQ5p<XJiR4P%%W=#6ck>G6ty#8^Ku:y:ZB#dy<\PIk=thh!?NG#/
4XZkH* !L4jYcRwmPYMyCGF\cHjh\@nbKJRP\*iWJQyRZm8k\+c=RRjcRENJEP!Rh*I=j<#wZka@>6u^ZE\CGc9
i5414? $TBc4qFq$<ytuQAwQWb*#QALWwhFj^Za#eZyht*j4L<jp/t#6$q%\Ph:Lp/d%Tj%9jh\^8Q5^lb!td&?
VGu>n? X1KH6H<ij!k^hZl/BKEw5qjY9jGuMn*w@Y1!4P9#u#eb<wL5G>&9%CW^=ILQ4i/X4!&i>VV>ad>WCybb
!WEXww jaSF9=BH<WK/G6VXJbh=:EpL#5%Jdpk&Y/QDBJph?tnV=G<Z5q=uLV=L8EuV&M$c%t/wHCb&k&MhZRp+
MpZSF/ :Nqek\#uSkX4hl/M*WRLeqdJ^ajHA^e<^%^9Yqu9tXuJJj%KVtMMKL4V8jB?9$=:nYIqdE+5bVtY4N5q
Ka*#J$ iY5\y\1B&jw^1aBmHE^6R1G$R$59apPdQk/ltAkp>NSY:dL5hl<%jd=F&&uR9>:X4/C8tkdu\n1b*9tk
w#S<eB P:<=:VK#+l1GAwJ+RC*Kj6L^EL*S/QX$M+iE\=SKXq#j=@ee8JKZJ@eTXGZZMl9&c/9yLQ8T/*Fa!$AB
E8uS#k d+H5&iXSLLDBC+RqJ1P4w/6iu*+!$HyBMDEW^j^jK5b66ZD&J*d1R<IPZtH&Nla\A!+Zy\>1?*qw?qKy
N8FhEK aY:15I+&A5u+MNTeMph\\mXStRAW:<GiVmunbV9H#R4i<EE9JaRNDYlcR=MDiney59Y%JKiS!yS6cm/+
dju45A R!lw4^TCnCHyVS9^TZPYQ^wE=5y6DTm!\I8qBpQwDW1#@Z::PY?@R@9QX6Y\A=R4AHGjeVn>eN46Ekj&
84V6mS K\FEkJnR>W*H1&nFS+w6LMSLTj*duC#@S:SWMMKIPRcy@TmXhVlI<\h9Dp!/leeT:#HP&meEnE9iy!hh
CJ9tba DPNLRed+6VFiXYK@&Attnh$e=WH8mHWmEcG&DlMT=tGG^aatHTQ!q&/lIQ4:Z+I>^W6Pm%\:CA1ClP6%
Y4ZXnc *\VD!q!DG6$/qXKjW+5VMnVuq*h6!uBIHZkINBMX6MiQKI8KS=ZFmq/eyZTDZ%Zym@d:EZXpRI$k9S1=
qGiM?Z jVN5=Mi:8=Kqj\ppikw#dA14YmlRi%!$WPCPR1F\GaA\J#!/!wZpM/5VV:XnGyDRpwX*n6BV6PAyRI@k
mnDIyX Z/wPElbQZ=#8td%6q%lVE#>/tdc>n>R@wkNjEHZNpj!cWin!:P*b&+cSa=LZw4jaA%q!?QC6qHjbdJNH
9yw<#4 Y5mi!<$ptu&Xw8^%dD%FawnQjN*Fy!@RJQZ5W^^$&NC<nL1WcDup=CD!+GXGPlIE*9$:yidTXXATQ6GC
ZW\KA^ leZ8uhC+QHDL@Q\mNLbmD^5i*+nK=E\qZI@l4PtH6XYQD<!qI?cFV==an^4$Dm+c@5qSN5$V%DcAn*m4
iGED?Y W%u9FV:!K6&dd/k>:9i4LB$&55W9am%+l>!T=Z+QDaCCG#cZqZiZ4yWjjbe&%1VVPG%DFW=cy&@aZ=ce
B=#N9y bmum=XTaQ^Z*:/L6qc:py<ZAR>\*KaHC59pX?JbRd1H6khELaGB\Hbp1MIdyZd9&FTmA?XwEEIFcGG6^
!\FK/w nY\+REyBTJ8&/+&Z/!6PPd1lY19pCF%H@1b4@N@ka&kcew/E@\E/EDcDR&F+GK@a\in1Ki*F59DlCWTc
Xd!9jc bqbd=:4hBLJC#u1*PXRMCbeLq?pyduQWNH+$kKXuMa>>?w9b5*pjJq5eec1?1=kC8W6X*XSmul8Cy<HL
T=lN#m amS1V?KhYkDimheHZMwI:tIY&iHbp%t6AKD\S*6*e:#TNPa&46\+wS!8t^hl5?naA%KwnYa&8L84Vep=
T6Y5PJ =dAP*Y!BHpV5+qYk\@tu4=KF4X:uR#16\aJeCGuW5A9ZZ&$?E+YKq/=eWqMuJ4ce?&BCTNTyWtKPhD6y
nG!&16 Q95J<&58R*W^aE/Vt?VpQcI6+8N$D8VYwwm=TppTmECICBDIiajBSHb&k$jRTA5AmJiSe!B=ui9KHD!<
d\=6:k $yZjZT<=PAekX<ah>>LAFym@^FF<N??16nm9HyZPC?\=hB=V>!e^W5cpRZMXYTbP%#ap=yNA/pEyIu9a
tnnS8A ^8#jWG6V^dj1FXDBa^FB+mil%+/LZW8iE44#RRjmwEF>Bd$D\Ay/q\$LWiM6chaVN$IKqhnV1IS=Xe\n
j*kZuE Cmtel:8uFm8>hKpZ/bu=#C=jBtJA?WaLadt/LeRaZ4/nee<IMY^ANd^$LF1@PH$E+RQ5HbllJ+AhkDY@
B%>FwB J/i?>>b5KJT+NCZE6ZnyI&?qcF%:BwMcJ>8@GbuSeBGl*h/lRqA&*uYmt<eXeT8>1lEbp1Dh:wFHnb*u
Num&R6 &QI&tM\NDS6aHwZFmc<1RZj4t/ahmSi#@bjTQmR*m8NE:?SR5nH*8%B/q^=K8#W+VJG=ci@CFH#kE6<b
nZnil& TR@8>tNieYJ*iyj6He%ulhw18pkSjKN%Gy*>#*=KqXq1?+jSZm?Rpuk@Mt$H&+Z*%VbGbc5Tm\m8qwwP
yKYZj& 59:IAeTh+t?CPFMJWVTJk@G?h65Nnb>h8y>&Sp5>FAk8h$EuE\<yJSW$ptcqLp?5wn&#>cMPG\*N+XDI
89Pnnh 5KFPjQXa&%?jEny<:lX$WN6hZj4XHRE?%Xw%lCRjBMX=u<Wq+$K=4*P6$W6>>Z1n:Ha+LQGT<+JG1XiT
DkG5^w =8y4WI=#T#=al/dwjRpJPJ?T:WLJa/EpIVn/<DICKt<N&ue9IhcViK9Z9@@IdXEGSNk@b@A\YuX^?nlC
JBkEcQ i/DnSa#kGISWc5RAG+LuTMM&Gb^:lDBMu*K%8B51Q:AcN#hjwuh^RyXi\@RkZ8>WX%=F>yZ8bZd/Cb^K
mlHdD\ tE=SbkP/uL^$edqG$@8RJFI^JPHIjhRa&$EqVn5ZGIVpt*+&*1qViJk<qXcLlLX8=Z*l4Y$?BYQ#Bw<J
yW<Bet VHhB+pS8^cCllw\byGXdM*FS#A9VaXFbik=kXtF=al$Ld:G$HQ*X8P=H*dP>9JD?5le%\Q+=L9d6w%jb
W5yD6m I%4?n$SLb/:!Cy55q=^pb!QX#T!/iCBIt@6ylJ*V<#N9DZ1Gqm&qFY8dLGiiJSY^K/jm\C>e+*:#cTd8
8lEt:8 Fe1d=dlLAc%=@YuB?^dEE#dL&iBNyi^H&Ba&p&8NI\5$i4?55?It\hIYy5Ldb!?<L/F/9>kp1G9!wGb8
5Ha+L9 mdwuwc4j1FhAcR66&JwMh46ynNVY%cmBN%PlCdT6:e&q&PK1HJC=wF68Ta4VjQemMWBDN+Ap9/<FJ?*S
Ip8Fkb %X=Ei=*S%dwTINXH&DdPFcB\Lm%SM4!^5G4kBcpyiAQlB*\u\\<wN9ADjmX&b6adPlW4F:4+My=LNm%4
L\#he/ =w\MnYmh9a$FD*6=VhnT^=#!dW#!NWy9ahlG\=nXhP+L\bD&L4i9#w?:JaXcZIJ1Ndnb6l=LjI85ceN*
RbDPhe c&Rd1:1>FS9<Cm:&*@WqlW=</^hM1t*+>V1+lM?^i*elj1WELnd>5LuN%BaDG:i%%u^SE::u&LV>BwIb
^NK^PW bl48whI^hyN/iWZ\SnhZl94%SujZXHJ^4wD6<TLJ*YFN=Z4?*VeAMC>KmlKYlwC>S/By8NKA/#^%I8*t
$*nR*1 HRwEp<bn8I?uE>$bE?lT!BV\XRamD/Q5/+#kRakC9?5EX>mlueRB%y4SL:Yn#Z=1?&=m\wJ#BducdWDL
5^pZXm QMjRR8m&*^a$IiaGjDhFMm>eJ1#8hPpXD\JaWFJTZXHb=:la^##hCey1WF%JA9ywe1?65pGCpV=*b&KJ
RWjHHe p*u/=lwZPnXZZ\H$5tYJjn<<jJIYZYG%ql4I\tB<WZ#NwDRITGE*N6Nn1%y=n6^\y>X/$+q^ybBTm4kL
M&9*Ww W6&A&1NDAn>Hl8Dy^eAP@HFR6/c4l&eP!heG5==cmZ@lquFQmMMwj$nhmkMSN\LK@NMJ6acwMtkH*L1c
pT8PJY ThRm:pY8&d/hk#\^t$?PiXq=8Vwt!w1%nY!Pdc/e5DSI%=RVkiN\#qbPTG4H6*K1CyyVt5K&N:Zk6kcB
GJJ\H! HmVG#t<BIWKRuJNQwtHDPjBVKhZ*yMmCwkudEL=G^5+4wCL>ZN5k@Xkm/hlnd4=#eT/J>kw?:LHLVakJ
cd*R># =6<4aCYkpy&AyFqqNYnH\Y9bHJnQ#L46Bt68TqmddEYN!8t5!%Ga1IQDGdhy\c&>Tiqe?WYj=LZ9PMNj
8p=^@# e84W^W!l&5KMMc%E>l=BhZp6NMhmFA6:%nVRM^>I#>kH?G:44WDWe?E!19:cQ1hHd9j=P5S=$VqXa:kV
nhIEPG F=8By9YqVPP>pkJ@?B%KqGD9aC<F=8NHbY%iaLj?G9^V*PRwhmX+NZJDi&1w%!=Epd4^Sh\@XtEnw\^P
6E@9=n B&/Z9DYaX#Bpbq4dQ\+Rbcy&kFF#D<HQle8aPMeHw=<ByhaW>%Rj6iNH4&XduCA&J:NF/RZj1ejR4@d^
ql9n>K Zwu%?bL+IVkh^<dwpZ+!SkZMdEa*kcBKQb^RN/$T/6+XTY/w#S/?u6cMkcDZDSChqEhEnSF5VmWkyji!
e=V4iM bdF1LwH>Ny</TLumjpIZNKA<Zi^&9CWL?%WJqpXqnMGh*=4iSdb5ile4FBV/iPeE!a9yZdK:RI+Pwuha
*1T*wE NuV1c+9DjK9Z1qdwetqZIdkL9Y>WPQGTPJa*S^kXa?*tlm9m48D1i@u#9:D*iR%BKZBHY#F4ZLni4jdY
hMcY6L >GQDPq:hCuLRj8+?lCSSPZRh%Y+@LBe^YQDV+C1GRmbd<i@XJ:6+u/?Tq/DB+n5RIe!q%SDh8#DN</:+
6yV$>! @TwiWYmD>cpE%jHqtCwPV*nVW:j$PN*Aaw:yiXk5%AMky</\cCH++%d!l*BI@A:8BXnCyh5e6jG<?mmu
n?yCK< Cppuj9R@mMI:=>&%6>iM:JFL6d&DamXaHXJ<+&j5PhQyMQ*5Wkp9F%+8nD$MV>5Jh>&bKE/PS*JMLFj&
wVn8>: &JF++j&iZ%$!>B^F5=P>e$1B&&@I%eDSKM>t^*wQF^P?Bu6tJ8GTi6hhCjGGTyh!c*A?eujAV*#L$HQE
K/@ybA 5VtYK>G:P*F@jEAARkF6@dkW14Hy^E9FbH&=+tX#W<<6LIjdkdy\p4G$FEFT4S#A:q^T8/i8NhK<Vk<F
-A/Nj! 0006d441ac2001202b3 Page 72 of binaries1.zip
\GiiVY qh:Bjtp64AJ\FnaBmPuh1B!XAb#kdnXAMCda?KZwC@6WCNkCd\Pnm>GH585E<lhV8jyX:c/wFBAw<YiQ
ZT9>&q DCwZy+&<DaG&@i1TAp%+iB=TRM%K@lht!=X$@%8>Ad\ej4y?\tPtF6cL/YCum#de!kQYBp6=FnI@a#<G
?CLN4> <*bcZPIqpZnC9!L9$$*j8tMp9^EPb#>GR+$?uTbiZaCPni\14cj4Xby+#bDMh9K<qDQ\4ibh*1iw8eLD
?&Cy%H $@M=FhiVcA&JaVRAuImKZl9GKF#^n%6@CQ>W?8V!H!Wk9?bIG&lbVn*jl>XH@a1&wS$^i#cy:a<^q6?w
@<HQ\Z 8wyu%h&:wmhEeeILHD^!BcMF=lwZ1S?\BkTN:HSPjV$<*1<hYh&!>$l&M*G^lK%DRKkIt$Y#F/hjed:t
/bw!T= pSwcFSXqQkb?B=>>G&M!N*WKQi>5<9J>:XNZd4Dp*@I=CbDD#PjEG#@G/+Qy%B@&Hb?YKnhRa&dhl>p>
P9wQD9 pMC4<#>>enp9ITilSJ+tKmS5%n1t1qEt^QiCRD%:GN6ETV@L?!!Vet@m5X4^@Fbe%KJt>YwFh=64Q4=^
tW*&h+ $hKw9jb1#y!8*eNa$<VY&M*kLlubHpcatt/TL&wAd>A\5ij$mF%C6=G=NGl5?@R@W8Pi=eDm<1NDp+WK
9THJDj +YGicZXlE!aDMT%eJy?8D/RT9G\1^+S#NX&M/Jwb*R=Q45P/S/AWBBPYNiqT5Q\BctCAlVtdX:5VB%D@
9@i9Fy >5/p:kT>jle+elVYX%\>bA#yAqRb+!WAAjyp$XK//qhXH!=pb&qi8+Vpm9cReeP+duJ/jkB6l1t?Yjpk
a5K=9C LL+G!qAQ>K\@ZY?G%^y@*QyV/W<qjX?:LbimuZALt+JK\9&kBiY@=L/S1Ep8ZM=juK/9aJN9y^1eVe5>
>+T+9i ^5:i@h^^5*9K1w$9+tH4/=EhXj4S/tliyRG9pmEFdVac#takai>hJ>:wSjd65LbjBuKp\MVNPJIVSS/4
S>H:nH b#a$+?^nXyy>:+cTaiYw*RAk!9<8K/%KnnHCuC#pH@F/8j5^5P>4wqKHeNV/AJBljM4<E4!IEdKB%JhM
&>!6HH PVuLHt:Gkn<yBN>VkHkkk+uLY9i=ncBd*I#XR^:YA?uZY/>J<L8?=dj/L8!j*#1@%X#%C?X1IY\>K9w5
R6^WR! NG:#5Lq*mm*L&!k>XE1ecFIJe%9LVPBJSL$1YP^Ed&\PyBjQZ9ZlZq!bYBmF\T?D^/tnkAe&WFBji$5u
D>F#iG KuTH@Ge:#Riy1^e88NddtyPHwWDT5ZVJI5jj^LwAn:D5p:=6%+GT^T\GEjhX&u64LP6cI@un%ppjN*D@
ZqW@D! iyM:L>M!mHp!dtYZeS?G!$hWGHZ5!yZ9I!dQPdydXDKcKaMG>$?Z$lXCVqc!HkARu/:de:#?/j4T14G6
S%#iIu ju5EY#YZJ#Q@$ciMcdaPc\AGu!YDDSa9u=/@eLt?=#wF*E6EJWdM\Fk5nSjGcNe>>IRq+jL4M=?Nu^Ep
RNmCGw MAJCaQTBduZD\tnZLa*j8M&NAMcAC?Gepq=C1Fm\MFebFD\a+=>X=C=\JLNun=J+uXXZAPhqR/$<RS<A
JQRkeF 1FhCX6iLe>bPew9&!:\ZQw:K>jC$L&^&CI>MywB>:#$ETS@keYYK1iY=e4<!DqFn+u/<KA&G4G?+nZuY
i#iFn& aXimwT\*F@>TJai8=Jljek1AaCqZe^Y8BC6IXhC5j+6mDF\LBQpk>GiPC>4NYEJaRwGG8*/PIq5PYnZ^
nl?/5e b*Md:@u&VEam$<mF&JHRl/BD4A4I+E1P/*q1E=nqRX@TI?QV>e+j6*ylwacK#kjB1F@>$ZSy*T#ah&E4
81iL^l &qeic:^V^S+HCwZ4a+LF#*dVqVI%JM!n\tMAnE848ESPCq=Dt*+wG&N^eu>WBm1Wy&%#QVd:ch\TW98N
L41tI= 9K18y?jdW:?uS4*FY9bED+^\X4ypl5%w\/aV>@A4iS!u&5KmuuwDdmJd/c4qwkcJN?#lZqj&8Qaa4Zlk
BciKQC V?B5AEb6Z=1C#hCXjDS=l?qV+#dI:T9?aiw\k\Y<l9MZtVFmtuIq:^eLYXldVLMcT^+1ue4%IlJ%PE8>
XtTAdV %<B$*j/kd=%$RLkpWM^N6YjQ>1Ld8D$**+5a^LA\\PjuK+aIwM$?B%*jJP?t$wB/JeIp+HC>ZH6lcq5>
SkipHP MEVGCR%IjinY1*TQKVd*+k$EAmwu:8Z>iFMC>*HPKT<Q1ylD^1YP6SE/T/Z*d>W$aiKeTT*<y/%@Mqj!
h9+AI\ !YY^NaRnGyAC>dKVk94j/HyH/hJa!hL$dqkE$ZLyk&H&pBqmENCIJCKpW^9&:Fq:Gh9^w==+\%/SZuD/
G!qYKp @MWVhCJLTP<5dH+RTK=WnPQc9*mte/*S@kAmG<PImdW6^$Z^lXS&dBF!ka>DqR&#p1Fpln%W815&WElT
StXAkV Q#8lW5Sbnn8G=?JY\lDdSX\j=InEQ!RHmXaT%#?@:DiYw1lK#NCZ?KaBwPb\/9eD9:wE#Hk=HMPW6yn&
+Ck<$$ eBV*1PSE<DV%>LEZEa<Fb\iRa*:pa:chQ9Im9Y+6*jYbFX?+^QkNBLIS</CR!ubmVaN^TW!X8RNFF6Ei
nJW!NT B18W+%Dpn9npb<m=nkGtdA%ZXlF^dA9F9u?HHpR!*Qnd$FjSy4*>pG$p/Vei<dL9AWA$wt1ne!&lh!>8
H1@5*b Kyi!D9P>+G#IGeB$N*y+\PiIK/VFm9/iK*Z$#<!ey9bWW65wyM$#4kA9V=N<enu=eA1DG?n!LA@XN*Dt
j!e&tu %4j<XJY&$HPbCeZecQP6\aJ$GL\TLZTAdk*+9BYRE#iV<%9HF@cXMqARD&tS+Q61IDXubMF\ch=5DP6I
/YneDW Lalh\6KHcAqLkBV5+*eW1p#j4&ADun6\lCC<XP^V@yb54F%d#Yp#Rj:M!bEh9<4hD6p%BQI+kD<aEuw$
Y*Xy:% @#SQGud\RXD!bC\8im$QqmKQYy!#1kp>u%#8X85d&?tMqwa>FcPIGlw18ZaEBA^PDkSIa15^kjKnFBV5
9y:#t/ &ZKb@FGp%=kAJkuNit\$@pKwHLu\QnY\RMlKZ5hHEqX<qEW@cDYjulYhQ+VH+N$M5B6bJPL/XRYYqjHF
:/h6Be \=uXZ&paJXyDEhl*<^lwYA/hh@/+n8&GT=1DS&mCCWSFW8PLED99BpuYuYct9>:F96m*^6YP6<=*T^e:
Rd/ZnX XAAh/XeSa=4a$R6E>$IIQW*w=>TFE5tX/D1%:e>yL>WR<I?Pb%e**ADlk?N=k?YI>AHaIZVcL>n!ye!8
5+JLQ1 yZM#/p=GMjPAYDu1>%EwiwHnMcy/ji\BXH#\YA^G9aDM<+@P>ZLJ+6Z=AVN?K9PwDhNik=i4!N\@14p6
5qbSin 8=HF>9nAGplA#GmckZSlH+:tQJLLl6CEYDpbNeDGauC#wLu6BbiFqHk^NE<#jX>K=&$L/LAMSSLK/F*G
=hYZ6$ QE9XARZQQZ@8FVaq?4q5m^FW9&m8564BCAEB6IGIwPp5BC>>EEkbjN=6mImqPiX$y@l*CJkd:dA$JIKY
cpPG1j =aahLSNlG@ab+j>e?DmRl!Ey?=eF6=+h<!T>WeG96YcK4Re!&&5q*+@tE$\++lM1T!Bw*@TdSXu!NI#$
b&&HXB eqhiNjmFqtwyd=G6&\XC:SZEF59XtwK@@TyDY$y%qd\15+W5d=?h=qjd&h\!HE<Fb\aSI#Y*ipN^SYWh
Mq6kP/ 9+&BwHe@n?/Mq\$^m/MFVT1i@A5P/Ewnm$u5RP@Vh%TE1K+eq<QymqGYZwRM8wiNwA%HLtWYd>T:G4Za
\GWF\e AHBY+!?pbZ%$Ji#nN%h!BK9Q1CTHSFjcCct8qS@nY!h$n>kL/b#Ji^p?5E=C%R8LQ*1=&8iV!\Ye>6$4
9GaQ*K nDyZyk\p$Np$4:LucTLqJ&=k+\9>CtVk+BGhu1#*wR#a%GqGq:KIm8V$L5kaJH!\TPZD1jNd\AmwGlGm
d5P!pX bT!u+q9V8/BdiQQR$P<#bICJianC>Q*y?%ES%VP<%TBqdA#%RIH+MW/hd@*KD&&>MeDMu^*bRby@M9Ad
BjBFPN T8^H*Q>nSq@&6Z=6@K\*WGVSyC%5\5NG!!Z<\uY:lD=QI#H8y/q\NG&YHCtDpwpQ:mp5jlK+X!S#4jl^
KyA*hT wL$N95TlwL*mjATccTJQDLu5mmk1hR\@qF5w?m+%9Nmu=\$@pK^:j@c&9jB<hQYmX@Cye/D*5B4$/jdl
<ppSW8 c>y@CQNKGT@5J\8d^=1eBNL&CjJ=:m@&aub8yhhbV^SS6R@yV:pRNQCB$khIhVQJmy/qtXWLi\\:6eik
1h@WS< tKQwZMcE4=yQ8lJjnPcyBy5P%1CaWX$b:1J1Rp!KG@6eV/Lbupwn1X\j^i<=kZpIHP@J$Yk1YF#DGQ8W
YXM@Hy =8jh%Q8<>KHwbpcJ8I*M&cVh>9yahCdN#qS:dR4n@W+Kay*<LC@li\1l>D4J*D\?e^uMl%M9I*KZ&@GZ
?hR@DI &lTA&@IdK@^nT@^c5d!Z>tEENMn+jS$#?dhimni<tMVCjnYaj9lQY?i*5KWJ$SYA>iFWHCLJdBEPP>bR
+bG5c4 =EH5D^/tAX&8!V5P9%Pl%^Gk5u%JayAPW9*&86=#RuLjtkj1^c8Vd^aw+?e&#cGF9XN:ZK#hl6C^+k6X
n@wJDV *R\eba\$Pl&H+IN$4%YuXl!E5Vc%AbG?Kt=!$kw\PyPqA@!Ki8ZIjIRPIH$RjB^<uP+@>EKJZpZPXT!^
naFhPX RT/5A%T>/hAnHnPtc+yTL?Ekm+5&DE#HCKXH>ebC+C6I<?\+A/ApEYw8cWDHBYI6PCRnnGiwW:=9>E&b
lTPpP# ku*p:yEdaISV+n1YRIM!c6FH+#KGI8TR=HPye$1/cK@S6ea9&VY\mGFXkA1hecnZk<KFkTkecwA9Xq*e
\ajPR: pAE4L!J&GcRe4bM:Ww#D!=uV:Wy>PGN!cWq?N?%HG#1aQj8/ay4b5&!ZkXdSnKAEM=E:/uJIG\=KmHYP
\Vhl!w /HARwLAKd?K?qwA=IQXuI=c6e+hZ=$elBpuh^/tM8d&+a\@J8@lYTNFS#!bu#@1qbH+h<ADX+9a$*$<M
NSpASP he#!=<wIW%V8n$Q6jqVLD4LP=:i$Y%mln1w9qWJ\F+>iWNKnXcDX*K8k4?b?NcBuet5E=51H#d&n@4XS
dG*$PP H=^>9WHZ9W4>FWDyM1BWeD9nYX>^&pJ4HG*5aYy4\M\tXPERWEwYktPCnbp=@kj\XK=B\C&HRFc5NCmI
kR4DX? @46WAinXCiXw*dI=>Z+=/HlJb*\ejL4?KuaN%IybqFXS$&uJ1>6!EwhG4h:u=MLqHB:4B%A6H@k+Jb=N
DiewK9 4GIpi91+J:WJJ&lBV^<IHVIEhq#>Ic^j&%LjMjIMac4l/=1kH%E^ik>*SVuJ\P5tTTGaaw/l:?NBYejR
CN5yut a#dinb@w#1md8^#9D\9+cZj5##y@ml*DVW=BqH$%Kw^=#KBmRwhWl%QDJd/#n?5mhdS6h/#PqV8#b>>\
D^8*B8 Im%TuyaM!/Y5&:1L%P%==W=GH5\!\Zn6<^D*CN!mKA8Ga\9VV?#^N=qHWCMi\^<nh^NiBb1CLDQe<F*?
TQ*VYc Gb:eRD%6tI9P86ZE=8c%?aAd#wa!9dt5wlNVGe5i%X6+yNm9nb$8/CyVK$%#Y^WnPKi+mXlJjRNAqVyG
mJtC+Q pTTI!jkMXa6R9Ga/<Nd$jhS9+pYlTak/cP/X8EjTSbeaTWemkTHTQ9BENLqF1BmuZSPc5CCaTn<c*\Tk
iRiPkV YGSe>DR9cRb>hXI<uQuJ^$HjAue9klR/JYq/P1%>>H1q:HEd4NQL%BlJeYNy?EES/d@PH:j!KnHTP\!:
ii&bNe ?k1FHnNB**TuZ4R$BpEBl9X::DFbqRj!^Xy&9#Dlwi/$1p5j8N6liGV*$<N:!&t*Li+Za@9ApqqLESSa
ZtNETj *qqDA@diSb99IK*kF#lJJ+N>DM4q<Sm\A\ahdCS+RBJ/!>R\P@Qb1b%VV<dQAAFhK?<*9R@K\9Y8#HVW
dWJ/ua iI5+cuTFSHWlCJ+I@epPYjJGT&t95qP@WnmEtQ*T/$RS%i*t=n&YiP4iw&C=?yc>S%4*ahJ#imVEK9ca
-APq*S 000998bae71001202b3 Page 73 of binaries1.zip
C!@qR> KFMeenE4HnWdYi6:A!##D@5$R8j1@C<p^<TQF**SyT/qQjkp5&l>l:IT!p8ei+Cid!@<GpSLkewWS&pG
!?mjbD pl+VhZ+16TAG+m+>>6d<$^a$AJNQLl<Hq8Tn5yRe14BSAWlTI1HV*D5maa&w+LDE<hT/<$=86:m>uwj%
wG%1Zm 9SJJ*:auj9SPG@u@%A8cq$\G9WkM?+&I!1tyMTbdW?!&XnTpI\ykmVA%GTF$AKtmZ<@*HH+N6%9\P\p$
*SPFP: R<t\j>lHYjWmE5piAALTH<Luj!1haE=>m#5kJSieFt>eDm:k?HS%&>k4np8SNF>alehDw&ct4Py#e@nd
G!Fw#d P8@9p<5YJb*ERRhCl%^De=8TeR%j$GXdV5N4lTdS=wVK@QC\a?um#LDwNdduCTR+JkMThy$m^:CC%5&*
*AHGBF #!I*F>$bQ&QPmHA\X>ND!wd/+!Qt:%=IZ>6QBkA&D!BGRlaQQb<=uXV1W@JAWi1Bc6p!+W58%LnpBITu
M&mqt4 =>DyQ!?lJZkkeyX9$:Yyu5eba9+Y*#1Dnlk6B=RQ+9nqI:i5?JqZ!<=EinqHN8P/pKheK!Z$X^%cPqh8
kV+4Td DIE>^e$ZbetEtPVKnVH16TKy@e!*&%CK\LFL+RZau6+hi#n&pJ$!#=C+Sk9u>G=W6DMRR5Wl<kyAT*Nd
5Le=K= 9E/eDVllc<lKW:NAR@YNclB<D\SlC/CVC!aHqtn^WW&S?!ba:>\qJa8cWZ:$qE<%VLIQW%6e*cT@TNkL
BM=$=V K=kekAc:Bhu>EqRHuZ+QHbhj$%1?pyjXWIJdj*<aFSph#SeSHj&PLT>L1<tjT4%Itj*$y>K4?A^9Iq4t
INq!dQ e+FiB<tZdF$DnZpe<&M9K<9*8$BDd:FQ8HeDl/pARMiA$:P\cYEuRq?&TeWdTByp&^k!&DBN%eBlpw#6
TBmHGA cH9^&E=P%T!L&MyNSw\juFEH6d\QS\d/AB4$w^E5k^+kTF%Hc?li%t%*WFub#BILmt$MLK:A@iQM/Xe\
8u4K&/ jSuN89VCy1!4:4cB5P\!^d:tbi%VTPdt!#nVkSd9bdTl%a!n9>aX<@!I1m!=GpXMDDh&Q+&E6hyW!jGb
laTi=p XC+QNCKA/iVY+EDYPRubnnd!$DQ&PlW\YADMJ6!>M*6dKDc5kK&^&#Ty:?a+4Y1MeiNXl\<I\Sk&\Ma<
DVq9=> P6CHlptB&1y/SKMmw1Dp\/tVbGb:<YJ\N?IEAD=*#&<*&X6n?Ak:>c%?*:tJu:J6XCPwG$ynh8y:BZXy
R^APG& b\MQ?VNMHdkyj\+5J=QqQ6hIiYdm/a>nP$ieRdQ##M<8A^L\J5pHReFmCVN\ETqR1MP\&A=L9c+Z@/ZR
kb*HRT JjM1bGRLSY\T?%*kp<jmbK:Ia+A+ykXnYF+neybFPyy>y6=:1dt1SkBB+aPln!HHCpZ56I/VSMX@^tP6
bul!KN <=SHlk*?m1$<Y$&w@Y#kWMQSl5&NwT94bup9kRFA$RGS#w8cV^q:1I*ttNT^N/RAWAkY<CW$=uY$bGIE
dRNDwj RBM^6ee+#m%eI1YJ6X9&EWl!N!C/K#%8JMLu&8#nH#PuV#GkaXDnp\L^iywyGyKiJJik8ibq!w<h=jDw
dB+w9+ QhZ+$1N:L$$LIA49+YYB&jd4nwAXYYk1^B8yk9\R/JdSyaLZh1T\1Vtc=/*B9P@ENIn$IiVA$A9uyI@:
ZPKYP5 $KydDD#L486^&D*>WkR\MHlkbEaKpIViVKZMabyh/T>BaA?*D51FZl9WSP%>YFE/kKPq+<m&6RdnJTRK
WjWZJQ pAy\#*4Dd@aYlLLZRq84/tt:K#1YwI<#^^/K@Q<&:@\I6ABtABeQple>!Cl/SdY$6VT&$:YMLHCnX%*i
NctjlE BBEPequ##y?pC/IMQt>p!<J>M$LM=bNc\@h^+F5KqD6&A=iwY9/yNAq8JtDB8iAD1Vpj:MTlC%Ic4BR#
cF&e%X :ca8XNXaQ#nnG?4kZQ!iB@I+#1cyueD+t&6K1&$k!bdM*u+HScM\*Y4qA^A8hncE?beya/y+nqwplP8R
1%+IQ? Zc<Xt+Z=\5IbnipAVWwYmJqlSEcDuZby66my:ieyqL8K49ld:Zmn:LwLZkBP=j4jb$/jSGaAKY8Cb>MQ
Mi5hq= L89N^8!X9A9<!mElk:lF@I6mSZ61R@WeVJC^8PX%JcLV@Np6SX1?Ia$ibVAVR&ZMdmdhdk&i>Ft4VFyJ
:89jlX k>N55StCuIw/L+$%ZduS:<jm:NlCp$Eyuil$M$KADt1m<WbatqmHBBpm<?a&Zml+THR!e&FcGbK5Et!!
9ZFtSZ KK1ATdZ#Y&lG4kVV>!F>6@eGSYlZ$cIVa#!cdV!aM%D<D<?XkthZ4+ti4RGt!QHycY#Z<l4/?cB*5pDQ
FQqSb+ A1uY!jKd&Y!qaMKX4#9hi9NiBcqLR::pt5GCyFaeSKb691lR9=dKw#Kl*AP>9XKd<uw5\hQnJJ?8u>Y5
L^Xm1$ MnuMpLyHpY@+H=<%\&^mPT6y?l&9j>#/uXJ!Ki6#cVhM64F$qVVZVuCGPa^V^8kk=l1%kj8tMkLDhEB4
uqlC!! !Ciw$iDD1hudF!:@/lJZqbndc9!VC86eGqn$8*H>k65MQL=>at!HD6pi&&>&AB*tBy\dAuA1/<1#AVya
NX8Sta wweQ/RZMDcq$8:Vc@8V!MGNZVtNL/AB!H?Jq8DREnen%iPenBFG\qe:B6?J#n5d*D%m$DijV1Z@L*bIT
\9MTN1 mE^1G#*^^6@E!F:IQ/Ny:Xaya&R?=t?%D1@P=^Z9#\$hNQiP?ca$<VT%%KCen+&=cHInbw=1LFWhD1tt
FWb!qZ N!jS8Pj/WV8?NS+%JudB^>T8REFuSF@&&KMq8^=1NN@C\W#9WqJkYK&iqXLedJKbtZNBhK<8/EDPl4XY
H&puNX VFN9WXEjp/bcbyi8\6JkSim18W!#IYH+T+9ED\\u++8h$XI9lq1Mk8i%uGj<VH65b*A!uZtYAXdei8SP
R:+T%W NVntM5cBZ>8VLtE4?H$MHcc^Z\YS\1?Km**MD>Sq+B^ml9Ckh&n84:Pcp#VD9Q4I#Id@8QXLn\<+IBSR
4!uJj= kTtjTZN*YA=FF^9SYp&nA5X16n/qITZnJC#Xw<b<Wi*@/Pye&MSW=5KtWQmypS8NJweBBmcR<?L<DyRB
5QqVje m6q!mt=WcFid>n9k=@b?FPLm4*e<P8yjKZMG^%Jb@>WqqWaqC*=a*Vdt9:T/6Gy8XI%h\*!P/JiDFKL8
WFREKu 9c6Ya#FLVy+qmYdQXFJT=tQXdJ5*6/leeynw#nE#L/abkqS8&<W6=q<GjhGVlLRkyACVllRwae9JIG%k
#1PqnH 9K!W<VLhJYD!9LuZ$*#YtS5/Buh!bS4GY%>S+S?>bbA8eL8K+Fn!jkR6WY<?$6%9w%Wh4A!6BAmWc9e1
#jddpc =j1*Y5ndGk:L?Bp/N+PHWIdXPA&%XEMD*RdcF<ZAFy\iIlLN=8&hc&p9dPZ>%tcMtPKFcNe&B4J\H%*n
Mmn*lM FA\BF!8Ni@Xm5DBwLtYn@ewIt&N=/K$nhVC8L^P>?c!GSp8=tAZ<yBLpI5/phY4Feq#$m69hRkN?=dlE
1QBXp< AGK#hjVd@I+%V@kGiRda>$GM:LZj*YDI!Z*A9LHlywi$/aRIHFA#Z/!qRK%w?Y\R8uqNi*^>%hTVJASL
V6ptQw LnRYb#j!y>I9@4nF/KHSZQNM5PyETNAknpIqn&@$BlR!4$w%A+KpM:cDF/<kJ*J1J#TR%A8ATdJ\y8!h
KALR5t CI#=awCtcaAp8jyhDtPcqE9Q%jdlPk\wlyInIy85Gt$&4/QPR^?!/CN<?w*/AXNm1FVN15!V8lDImk%+
1K&SjX GwTWFCPZkVT\N!LYjJdMDjW%$<mqVWWaWc=&9Fn$=TBntk@wVlyt8aX5VaNT^e?9#9hT9:I%?CPtAwd/
F\iNBn eb@Nb#m$t65J@Wd?m88JM#mpt5p8cN5k<5a4>Byn^4L\aIDl5DT!Zmq#8l5ic^k#qbNqBDP%&+VpeL\$
nHKH4+ @VAPMS6nj8J:#9WQmpjF6+K:aWGTk1/lE=B\G+pMEn*N9WQYp*B94GZ&wpp$@?+41K1\?>GyL/ZDpAXw
m:hS!$ deq9bM#K*9YVjnST5\Ac6:jw<HdMiBhaXVIyLmaWDjBdq:9&?unbNLeiHF8SYj\9IwZF&L8*15J<D@6h
HWNGuh 5BqWcYllRi$&Lk*eL#\a^:IdT8LmeFZLHpw8>/YXuW68blqIGPPebmp5Lq#*k&Pj4tQhPPV=NTM\Z/#+
1%NH5P >e/Nty9j>#+DVMyimBQib!li!^bSRKb=bKhmkWk>mAeMDm>VL?A4=8#6KAK@XVMcy@@uJj?l!>bk54Vc
lnCi:u <<uqNlQn<GDaqt/+CDlu85n?AS?dGJ5KV^5tAtY>jKXTHpVMC4*bt8LTcm8D^!Zt\J\mFNenpFu=cW&B
i?8ye> +=DkwC#XywGn+KPWpT@Sk5dM%<p5TkE+wC4t6%Yqd8Tey65ktn\*%Ka+9aH\Kl/LE<^e=Y+\=K:hpn5@
kuIp&k SCA%R#>Xt8YHkRn\LXjd&eMiwLGHRA/\\$t#&:lt\1IX1Pmnu>\C@q&$cRJB%aADPNMye4=Z4S<Py4/4
Ne?a\t ?55%e1?FLRtA6muhRTYN&pbP:hX\m9YN@Q@?q^wQIadK*Sn!RlhRbB%=AWNTwQT=MJ1t+cjDHRy8uLpR
1?p&<C FhRew>Imw?m?dF?wtjDd\lm\A\J%#claQc%/SEY@ddS4bL/acdlwyk8DMZHwm/cA%dX@WhBCYA$4:8@P
ni!E!# w1XP4ekT=:m1M+BFya\iB+Rk>acdp6kCdXQ5XYY9kNe4=ND$C5KD5MlWeX/pc?!l<hQZFJLA5+\>AI!p
LWA+a< in=m@tZl#Ahuj4NVN%A%:i9/X<*4>l<:caiT&h59baC/PM$qBaLWu4SdFKcAIqwINbmC/ny/$8H4wE&G
c1L:WK #PC5<dE*GcX$bbC>m?u/AJ=tZGaZ655YiEVLhDIFH?*:BBut:dG%hBFdFR^Fy:+i$jK=Sywk!?IXTCPZ
H8c?QD 5*mj5hA$e<8aq?\DVwZX\:tlq<*/H+#hnG@y5YR>qlti%WaL:=QEG#u%SmSnD>?5KE/!u$+#jkEhA&I=
$*y#lL ZWSKB8<E@LTGw#Wt%P#bIa\Gj1BHcBF?kSuqFc<K1n4%NVT>&*@j&tc@t&?/%Bu&+WEZyePwy6hi6w*<
D>4cLR hA<:#uJ1TY!H!+XJlQaQ%HkJLtbGe5I#5Pqhq$yK%^NT1EaLc$9ctlWX9NQ^XZX#Kc?=1IF^lc4:%+4m
C99a:Y WZWjW:m>h^K4hAGQFmNCZ^bLMi!HT?4dRhCjjL1ie+n=W?tZ\I9eWE$6BA/@dwVV/ZemwPhD9+h^?=AP
9XX#W^ :XwD\cej=MGYkpuZ&e1klR@GZwStqmdWYaIZJe6*BN?QQTSmH1ca8Y+lWAGwcSawQYJ9m+y#DG\9hcMG
jeZE!A 84wTR/<?RpwL!BE#SACDeWFkl1=wSRYeiwNVJ>F5b?d$G@JG19i4A$AVBCtCHBq*wya56Dpm%c>cyZ!S
b8N/6\ +Yek1%eCRRj^4eN+<TX^5=Ghp:<>?SjwtL5kb/QdDTGPia=Ru\5+4p#dnb9nMYM:tB5!DkS5%4?F!I6E
dTili5 Z>#>&>XREWRQCuDTmVj?W/XlwWnD?^1waKKKQ@b\5q!:*Sy&TBpCS89jnn$M!%kPC8bYKbPlQVNQ5%6d
Qmnm*L SR4biby6bMQWA=QNTS8P4t*qFqnHV+mIW4P:YYkS585CEI/d=4bS69>D4#tMi?*c+!T/<+dZ@kJni=Gy
+AiPFT /XJV?n1uKV^?V&6<E6>HW>dimIwk<ta&&iI*bpXMkyGnBRJLW/ZFXAIKBIp<EE1%y#!:k/h^iX^PB@nS
b#M1K4 B6Aa*\tkwVJD#pBc\tVHtwXSQjS=^@uIT=KtMT>J/V:/t$a64JTX+&=n/yV>hyLnMCIZhMe5&y1Sba>>
!4CeZ$ NX<LbH#i5DQ&+H?I1YHARB?ika&j1BBwF$YGF?#?m9a\4?P>DHbbAC>+T^uC4EHDDdjRSKPN6HDj$/X=
ta<tG+ tb^ketnPlw$^nGe1WkZhEFm//l6Q>hpuAq^%t5/tR:A$8/w^B&k8Y$RdF!KcT1Dh:!h@t:1dZ1=6RYYC
-Au+M@ 000fb658fda001202b3 Page 74 of binaries1.zip
eMA>6# Ki88V8hldTmV<@A8SG+ECi!EEELE$>\PT&M*nXI>8#LhId^!<nMhPyu#IttwDmC8J%t#S^a+tkcaWL=1
d$4njq iQ+H?*\P:/9!<bl%^lcA?4ew<C@5?!Th^j6LAw>4!HRh$+dec%5DcDR$CBqJhM:ttN<SnBp1DD%mu+^Q
9E9RS& L<:@WL8HST$DaWpG%eJ1NkCm1KqD%GlRqSuqh5?hRh@/RdM8$S!LCH\Pc+@LCy#WJb%6IiyE^iM?+FGD
cj:>tM JSiRFy88!@pD<#!8>q>!eu1KWmVAnPQ@hj\N>?MFeW4e@LyT=HdllI!^a1ll!E<%@*HL*FHj^:+48>my
C!cS#= F*61CMLK99#CdJyd:V=bTCcD9C>Pw8tHJSXWtPl!WHAbTjNna\<Q^*b!kw&>KwX$ER&yt%HT5RhVqRJk
8Z%Ann ZS6k?YXLXJKDKJhR%%c^qPB=H^9VCCDR*$$M1$6n!TW=X+%4ZG?8Mk?AFRXqy=L$H4IA$L&W=mZkE<4d
MXHulw PF@#<<nHR\mjjac=NXQntBbKtSq<5D^F8tc*ZyWKPq=yeLYVj\F<+HC+dQ8YiuB<hRaG%W+Lt8mtyEk@
+8>5*D d9tRpPtqWb4jmbakThb<bpa>DGP*<@+h!S!/DMG?#^DWZI*j8NbKYJ4aEuAm^nqkci48cdZRXYbSX<54
/Q#^^N P>h8V#?Mq@AeQbAEbk^>W8q#$hnZ5j1GZth^6a!9eZCE\FK/&Tp+4WbFRA>qP5Ah#^iDN6FT@u<*MGqQ
u/*#54 TpwAkJBS8Fi=BAZi1CC6jZpm#GXKu>u6tAjSW8pDk\d*NP#4>58w:H<$hQ9w9T>!<#N5#IVtVQJBpJ>u
M*uJkt SKT1Dbh*qFMRCa15?VTl#j#Kj!=A:^>#Q4WRKYK6kXGTmiK^DbS&XB&>>m<GyPVn+Fh5Ikm!hh:^C%&c
LdpeLu Tu>\FwAwtHl/cth5y#8ZnD:PPnwTA:$atjMbiaG</aXKSuaGjCMijlJ<d/l/M!#<&8ld>V$Liy^L?pQw
//p?jZ B8<9hYQ1X=epWW%hELjeEu*PpCM<km$iB1Ktc:^t++\<E9%S#<^yZIcu&<+nKbuRqYHLNC%*Nb$n?kaA
&MZacp wN!wblV\L#Q=uACqMw*=w=EZS$*6aLpJTJ*<!<mZcHjP&mV4Ka9#ye\&Yttam?:\hkG=huQ9y:tl9646
MCT9kd mh&wnAJ@\89?mhJ1dnP<iKH#R!X>l#AHCVYENn=hAE>Wi<^RB$wCZMPNhEEetuibRRuVD/:lMhW*wBnw
leYq1l BkM&YJ4ywT^WkSDcNH:t!y5GwcN1\DR96EF:L&GP&dXn*wbaYL:=Cw4ZTmDAC!tKaTB6pR#IuD?B?aEq
:/Fhw9 Fy%K+SnZCj96:Qj56nVHyZ$cJhiA>4K1@n?L?6P&bn<JX=jm8iE6eu5EMLW\9i84R\1W\Q$METib4C+&
%M9KiN 8XG?GWwMVW41/nqBSKBeR99V>TEJbmLJDSnBIjqMknG:X%REqbR$BtwAwbGhpT/P^liHWkhe?yj9k5uW
hVe\h6 &A5<dwVRe+//aFHRD9MJD*Syl:lBKS+k<>^WLJQPS$J\:BLkA%th=P&#QRcbTmP9Jb@5BD*C:iuTy*PF
aq\qJ$ G^X^<GGw/jh6#5CN8cRJ6RqIb5DlB/#q1VyE5nWD>V*%9tB9GnnP\4=ThG=YiM<6n^iuK&SNhpnEni\p
A/md@F J*<:NQIquFKGH^YM+PLWa/NKnt@#d>Qu=EVwRPbck^aX=TB:GT>%?D%k=N6b$nwT+^:D&yL9c1dcH=65
PIq<>^ #B5NccF61%XlEcj&?C4#FTn\AJ*IZQC4dc<A4Twujcp1y8lhQkIBV\l*iw>pyG=LaSAy*dAPGFVRKkEq
LhVXS@ Q6^1MZm/1JEj!1Qn!KICiJRnnHL8PTtM+5T8CA^w#9mbnlhL/9Pb/KnS\i=8DK4%+99DDD*wGZQqHt&@
TS\a>: EBc8FhXGV#WBR$<\:Bhq\9QA4ntMdb=uu5MD!S?*S6Sy^tKQy94ll!T!!cMc6SmRP9R#k$b>:HRE4t%%
Xeh1$l Qq$j@nn\A>?Gw4DYua8VcuS@JjCJb^K$Ht=*i/HE1bKYwYe+R$>&Qd+P94j9H#+ji%BkMcElAT%<JB>P
m6DZA> +RT<kVkI%S^w5$F!=@R<Py1jX^4D/L&T!Yl!t59wZdKctdW?aRRp:wDykm^FwJlHZpbJZ?hytGyVAP&4
p9kS@k ppkZKB&Yiyt<u@W<nG?>pk*EGWwR?Sl>G@qTJe<WJ:/%Bn8Yel14WVN@c/d6KN8BAEGC!A%Q*/Llkj=N
ZM&y?P $p@W%<ZSkH^BD5+qLGE!VnmAm\GM=#lyW:5H^ESL!P!%luH++/cR1eb/T=iFKQ\5!IF:!hZJ%NwjVk*k
S6\ZG6 nemK@+i6\WE8S<NP9JKEP/I!9wwZ<&iJB4QEyeNw4SiKHy%$nY4d&*<Hp@&qup4yAILHBW4EqCRW+@^F
!9<pey \Z<6i$:Dq&DB:dqIw5b+YHJLClwlLbLV!lVN@Nk%ccyJBPEA5\iBG?WMXiTWLHID+^y8%+#//5*j=L&8
aa@BT: wZ%>+8N$jFMVBbJ$=wi4R1Fn9#P!p^6:CH*Cn9MaDG:Ghpw8M?b!a<KEZh@u9e1yHTNd:bGhCpilEX5^
=qMa!n kFj!YKjTFcaBL5==<@hLRSBtc#tW*/Y5^u@%ppu8#E@GMK/aVe^uSLN&kC!!Y=q=M:Xt?lEAq#jd+n::
GVl@hI hNqbh@bMSEq1WJ/kKGVZ*uqaC1ZWyQSW!EaPKw*k?=E9#aEeJ#Act8N<5ijM>=4NXe^t?:ZSX4We5<yi
NDbF^D *M9jnaQBe8WB51!*&qJe4uiA$*jMt/HTtYBP^&\Y#bmkatp$M%<lKdQ:P6q1&hFh^5+A/M:C48FFXK$^
8jVJLt **M*K8mk+XTQ^Xl9?5EbZI1HPiF6%&RtLVXpN6CIA+hBlbmT8bEk9yW@=eDCAut@^CRaRkV@+EyYLYZq
F%+pS9 u5CTYDX:aM4/TeXFBLE4pTSS<T$*6PLtt$G*@uNB^*hVY5@yHpyeAny1mecWe>QNRdQ#9p?k\dS!$k!Q
KbJKP* %AP9J?5Ga$ybQ&m!EJ+!kA\yjMpWD>EK4dq1#eB%Fad59n9S&tBap66RIh>VMCMa:PEji\CRKKtIu!AL
1X$1K% IL4%$<nPT?MDWu?Pt^c6P:\A:Hk4=u>kyZMP:mKb?u&JCt%:FNHlY61Rmi:kTNaQ+<hm>D%CE\6H&6H5
cLJ&YN &^p+wpqEJqtVVC^i6j9mAmiZN>6Z?W<AWX<A8\FEd%d>9nE:6H9hTPnL$NpIC/i?:w=QKIG^n6@ZQdt^
RX<<q: =6b#VQQQIDb^Je/BLG<GD@WVQMmMEc8m6E\aN:G6S^wn#I\>BQAMuyMY>KiPR=CI%9A>F+Edl/6@C<1n
Y/MiDE 8Inm\5?WDY\N?8K@d>?QH/HVBY$CHeau=46j\>\VpKF65n:<X+?#E8EkX/4IId1AHG*?jG@\Qj%ED?5k
#K4KPp j=Qu$G:/55KY?S@MlTFiH@e>^u=pQ&Q:&h/NmK$1VVd^i!<mW=VemQtBW=Rkb<abLe:\Bl<:6eD8nu&I
HaCQ!# BFBtRA1*4%Y#DAG&JtuGwKtYkZt*W5cQDZS=qdPKVPwyMAluX=FF+=l9\l:b?ZteMSqpR#?/%uM1lQW@
G/F%ay n8!e=*:pM>4<DMlDA+4:y9aBEnpW!BPnHRB6bJqV<T/q+114YqwA48>VZc/B<ybmpkPG:&eSh4D/Wujy
6MD=TS =FqQ4d^IyMCmXbnyhIhhn=*utk&YWYYL8LXpG\yub1Tu8peNTLDY@&PCJYEc%?\@:CiZ$>c!RW@k\Pp:
bliTd1 VI@%pHu%bW6m:L6nVchjWXe!c5M6eYM+Ay\RPXmpaVR1CS:&%?/yeebS4bPkYuF#@keM51E$k#%QKw@Y
:ZY&Y^ XmEyC:84?SWbSiLC:%Z&6P6XTpB5T4VbibJBqZZ\KFG!R6ZdWBQk1Xej=ZN=wAc#X$^LBV@Am=R1BE\!
4LKqMG X^t!PH>Xd/wkW\q<aJHMF!ehcN\wa?^?58CW#&PbiWP?Gpdmi%!$4RJl8Vj*n\MLHMbIt+cc:6SQbe$C
K/H!/4 >ScuJejAc*\INnWHt\?paQ81aCeRpkD!N#^wiH64Km*N4CLw6mDnqdE$#*Z1BbmM8IK?J&P/@uBp=!lE
BBn1a$ beaiuHwCMhHRd%X5wJ^TA*CRcBuRG?B/cPBZ<qk$A<CASKdQ^kCD5N^+X6H*<Z96nMy%C>LHuENy1Fdy
6kn#H5 \9Zb/Kct9SmKdGWqtK:QDDX1G=!mH:n1qk@KSD8EC9W:F=$kDlekR4nJ&Na\e5n&ct*/w1WPapWCXMuI
bnKZ:i 8%AhWDCc>a?=wd^jVNbt&DFED$KSWn!M/ajKcKFb9+NYV+^1dZDYBi9<=yX!bndkJEkXGyCSKIc$Kqyk
8c&M#X PNBu+dtG>9&KycT=QTlyC$*RwL%WPy^<C@LZ6wTQk>akX#&lKwqcHCJj:lB/qD@VR+ZY9+6AFWQjYc@S
NAAm!J !JJj1@*SPY$>dY=ncN6mpwKQuTpqa@?VliA5Gd?4TmL*P?@kWDjVI@tkKHVh1S&Fbam9^/Ej8%T59SCw
Q6*w?V =pmlVtynaK>6aWVLq>N1y16wV84W:RKGy&mAluyqNH@5RWHFha:q^KH#h<#QXde%Y<&+lGb9eWuQ&MMP
5#5pmY W:$iHwDA<=GhWSn@!Ly=nRE&IAh?^RCIFhIh<l*$=D!J8BkQ<jn:XEw@akSL!X?@XI=RaN#hMCn$Ip?X
hdXEq@ XK=QPhtcFYj/hXi$X>uikaF\!Nyjhn*:<St58k5#aIjkKBSwKYCi1<6>ABK>n8Ge#kIR#p8d?#DZ<ShX
Zcn@St Jy*M#c&+1/FMZCjLa1uAw5c%%5!@98A#ZC&VGc/TFCXp#DBHXFPTmh%iFCL6kiRX6WN8?cGh!=me4H?4
C8w$NA hDN!ae%uByiS&n%WWN!Y&$FE=lania*kjZW4eLccq&:Kb>5=nd#A\m/bHnalIBi\niADC5dt9F&uRZ/m
<\TWV^ yBBCKq^8:LjRDk6=:!D5c#<CXkI9kc6Pq6>=DcmyB6/B/LIcmHqb>F%ePGMjkV@+^epMVWh^nVbmR6AS
Z:G?wh 4aEPN>L=By5/V4HBRQ!LcGqTy:@p\^1$NS>WC9*PlbXekJTuR!qT+?a<<:9qiApFT6?!1cDpA=<Qly=b
ESpKp+ 5/1AcAtb=!\Y#<IRZ9jRF$>P@i#u?Q1A45P\A>\W6Q5e#kPMGMnB5E!!5DpmTS4mB8&=q^VIa<?A^KQb
XKtkd% 9h4\1BjnwlVM>e:M/TM+^mM=CeaiW8Sn%4iSXP19XL4EM:PtF#@ip4pS\\@P&Hknl*a98yEm#tVJ5HnK
CRKQ/N %TFpi8JFmuW8HqhZMwmY=GT#kj%c/pTW\iKG5u:%9#A^P&N^TC@F>k$4Kp>tic\SBTdAmikX<qlw\uil
TE1:H1 TEp=Z\4Kdq?bS9<puA6?\?/tF>95tWI:l:+Z5@a!Kw%ckad1wSbnW6NqWQ$>c5SGi69ZH!$</eZZQ>qj
Ya?E5d a\$8MWLFi>?Qp+<GuZS^!bjlQbZ=1XIaXcaKm5?pYW8%i&lmk&i=>m>Z==649kQbK@IJDXKpkHm#C+8q
AYQnIn WyH14bJ1dXc*p+6#@bD?qtXR9#Iuw6TylaM8jmqtcRAqA64XaDAVINi>?>qu<#89l1=B&c*:LJt%L6XY
LFY1XW @<hu<FCbR1+>nqY6q$tmSy<jV=q+c6=nTJZXW//@bdTkAN%qiH9GkA4Re!!w?H4EIeQC:bi%YkibZZTy
bQZ=j# eEjGt9K<<CwTRbpNFbEa9Vy/i6/i?*W*MyN=^HR<$tKQpLZCAQdPSJeEqNVVW1>pMe6tX/b*L$61yct6
Lh&NYT Y/JYYN=Nd#KkTSAuWCSjwun>hThK$/^R>%mFimPi*!B%>:M<:*bG5hyI9*I=DePetdS+Ae?S%#YpY9&?
@nTPV= X\SbI+6PSu\jnJwy@aKnTqt6^@En\Ycc:j\1c9lIQctWB%4DCK/\hCe1K!TKq!w5mRn*$:9eN/dXMN8%
?&E@$T @W:>&!GNnqKR+J/d8>=&LYMjVqqWj>kcHQc6ukRNV%+5L@Y6BQpLlckR!:p+/j$pK8b>Q$tuWuknZTSi
-Ajk6A 000a1174504001202b3 Page 75 of binaries1.zip
a4cw+B ILSea!Lkw&l\ad<YhyZkZWcLI=TnCQA^8XJQ%bL1VQ^K^Ju:l@cR?+H&QIwEady@nH9\ewKVQcKm**JS
b^4h\Y hZKZ>YKd\XBPbjip=44/9W1F1:+*&J^YWKHTd9FpBdJ1&HDw%%5&*Jc?SW%C8nbnqSC#ZyaBF+$\Fnt%
q?qLCa a/F:BHeC/ImKTitm+9J&*KK+=L9SKY^N<MnnW+8a48Z65\nw/Xm8w<DJeL=LY%q#pR#iI@Y%ABn^P6!K
?SJYZF k<:%NB><uYYXySiTZt:e*G<D>#6^Rb>EuKAFwXqk#8Nt$d!=q1QKHuT9qJY5BeewG^!pQJ/%Jj?enYXM
bE?5Fi LGuNqFqHJ=JRnuhVZiBt@YwbEV<:tB5KqJ\G<$A:yeWu4Mt4!AnZA8em#PL?QG4R1KXI\d/::cKae/Bw
Q8QN9I =6qdk@*NQVTyaLc5chHL5:=Wi8&iPb=i>:qI^>QX?EKZp$MLV4StJ&P99R/Qp6y?L:H#u>+WhmTP^^yL
Gp8T=5 EBY:X<l1qCWqSTY*aIq^jt5a^=j=9pdXq!tMIBX!K1m*c<Xi\\ncHF?yM$*tT!KIDwEcXBp8#wG=m6Ak
lHQPDY Xa&@bYPMc<!5ylK#n9RXF@AjnVG>%+4Zm9c=:#<Z=wMWSJ&+tE8V%HtjBnDkHK&WZ>R<S$1l?l+HaI1e
8tXum^ ?nGGNbd!4dV#8I8F$h<e5ilqB#KYI?9pa$@GB\RjNqBZG4&+Zhb/q6RSYX8X=$pY>we^?PH<#96a5aE5
KG*nHD GH*8hjkd@FWGGaHCkDQF%ej91eaP+GVCa=uQ/iyl&jLb+VRX=p4eP4Z6NG$lJ4W*L?<a&ac9\YMkyp8^
9midW$ Ca5T\5KST5Fu+q+5wMDt$d5m9BlGC5:VDA5%e:k84??d#%BqhA*<dlqWS?*K>d$VNhh+QLE:#TKK:5jC
n@eJG% q6&\NL$dL\py^mJQaSPQiI@FTtqCD*t91P\HZ8Iq!D*^WWwS>lWFM9=T9kbS9*wR<J4+HDE?DluKkA?l
Em=*!+ 5n/y6Tj$PItB=m%:QhS$4*ncS\j/\BHNwpXJKT@FCuA=hD4D<JLN:Xlq#PAkLQcC=*ZmaKV1P8un\GiY
NyFn^X Pd991yBtTXmhNnh:F8I+ZdwZnKTKJ<NCJb&t<bpFy4a\N>Q+uXN9SmVj+Sce9k?CFDZN+tnhpeW+%in#
XLMtXP +&#Pp^d>atVZ<q#$pm?uEQaQbYFMqpBYtQPQpb$*CJT9eW$GFTh1:c8J*KLSk9Ij>*K1JG?RPRccabBl
phu+Fb niXZq>+cjQ95#A1%A1::db+Gt@=8ZhnuM/jQTi/+98YklIDjKJ9B9Y9du<<a9=n@<ttuPF8YhPQ19A#8
SSPyiD w*M!5K^y^RD#c4hPIE54VAXX418b=h?D=1i4<<jaC5\=iiqPbG/FjbQ#hC^iLAbj9/aA!A8^kA\BLymi
1eM!Vn 4JT#AREY@A^AWnW#\QTmNGTlhC<tZP#:HP8Pc?bRKD?D>DB$\y+X9D9^u?qWDCntcu4a/6YZ#kJB<cpE
PcNETG CKM:RBCB>H#<1PMh!!@hdwyK!c8#MHbGSFDtJPX6nm6!4$Rc<em6*EPuJTw8%MMLT+RIn6b1<Hc//!lN
m!9H4y ATmM1Vtj=SRed>Gniam\jcXdI5aZcRTTD%#LQ>W9i1RF^kG1Etatjh44k/IGYM#j=LTQ\Q#dcF#MXMW<
B$?<*% c4m6#G&?!jLC=nB&5tBtSP:GAym@n?\WEhRLG%+D^^^%u=y6+Ge:4ZN>tI9FRJt>e\8d^$YTKSE$JX#I
uNC/Gh pWCZVKlAi8J/whI6R>/aYVFuWwa#\a\tZFPGG996Z!yh=y6WjALMM:BWG@tFXWuAlIm@RlkZ%l?/ctPu
J!me/y 8nKK1F/J/m/y=%8%hN=ay6yhQmH4Gwb95wnqyT#GV/E!yBlGnM6XCGe5<u>DHYXc!c4B+5t!^w@>jTKi
M+6S=9 MS8<k^a8L^Z:$duP<n6FNCj1i/+P9Y*$=8y<Z@Qb>P:E$$4D+yZt5:\Q:k$eA$=&$MqIC!caaXGV\9\Q
idHPW> CWGC:W6I*KQ*V*/p:WHTq$eYAV#uiXnMESn*p64n*6lwCRmL5>wT4RA#aHa/Cnma/5hRT!u\DbFP$:#a
Z!Abw^ ZaRWSqCGqHcTZX9\a!9X+Q@Z*y@A^*Fhh/L\:RZwBTAY:yIA5WEBbDeBpGydLS8K&qJVckwNCdBA&$ma
*>=I=@ GT4tAlIE%=CWbij#SISNW!BI96k9#n#dtie+upRCPFRtmYe!uyibmVK^LBCp1MV^!>nJKFaYCTSI&hTC
ZL5W&4 yS6h%i@<#:t*1l1pcGet:@5!9<<k8/84/ub6je+>?@>wHtG6u/$u#S%YKl!Tk8W5y%BClNndGBXbAmRt
/k59jE %&Z?/Wm>lEwMII\JuWkiq?SC=tBGShKt@$DaNI4q9JR1p#D5#a5E!:^L#NE\Tm\TR4nEI#lCXmJ?6$#:
a=jwGm EBiMe4RB9TXa^<pJm+nh*<9Fik^4EwZGlVbR$LPkdaEb\BdTn5Rp45k&9Pab!AW&A4EK+!9y+EquYRZL
*8YRmJ tLiGSTNm5jGBe5i5y>eiV<WX&44YVX+Bm?\IDS*MTiqiHnd*PHJFB5Q6BXFN\l\A9kkdaiF1ZHuTy?CI
!#q&Eb lcG@$yWZIDca:1dTHmFF*X1DbC8yItjRILXuA>ynpKBAkI5??4CShMSc&CaRKbIG1ZN:HT%1IT<kntJ^
Ytw6At >y4Sy@l1R$B\MZ^AV@%5\ZBBbRCNt9AACmnTa69e!q!KMl/KV1N*^RQ6<SEQuLHd>\iBWmtF@Zd1%BIp
5QICcD >HLPSTTqKhq^FCPWwwH*SA^J#FFpBL^\88YS>DIVdCKhC!<!by/dI/5>w<Wu^^tW$uw/ElREQ4Ti6DSW
iydVn/ yj*piKMAJHEPX%m!GLNct$NkW$44G!dhcm*JVSVlMNW\ia@ZFHjKb5+K4cQ?wK8/a<KB*S&R@1>C:cB*
LYC@jq :k?=V9\*DLcNI^ln9NPF?5K:*d+t/MJ@tiJG$H9&GTlK49u8Yljm%@Ypcq*S1HT?NMjWy9!TNRJ1y/WY
<cV*$m CPt^QKqJ8p9FkA/5e#TKP?1eLde6QJ:iTt?lQX5VMCK<YlLyNP#\FaRnN6TJ&lbJaJ=L@&utd?G$K=EI
Z!SLQa !TmydqFn<ePckN*Nat\DWZ8$?<&8bPwWk^m%m*BLuYFDN>SV$:=jk%T$A\6nQu5^hnPd\kYiFM:Xde!4
A!hMqK NbA/LQG#k45LQ=dlA@@XACi!l^kcMtAcF^P>p==GW!b*6pPCa<LImbD$u&@jn:ITXHXb#Al%&webppJj
P14I8< aRK+4HwN?tRuHcbTTwBNh4Ch/k^IJu$/d1jDIbQb\p8c^?%58DLLLT>!8nGG*b8wMwBkAuRppkBbLHNQ
a?yZiY S@\mK?#??GJYu*T=Xue+T%i&ML1l1?K9e1/XA*6uipYh:dkkyViaaED<dJ!t#kcaAac#ucRSSZ4HHeVP
@>HKH* K/dNPtqSAjFH<aT/CFC*5weu?#Y8Aa&!tnY*abIue*%ZD1u9t=^5LTe<1D6LZNHbmX#=nnm+m%WMP6TV
Xb>>:< jWCZMI/>m===HCEuW:w?%ipCYJduIw4#F5SihEy:YcpJG8ZHPG&q9p5:dZ%b!ZPQIMIBX&&CP!<nQJ/M
pti=ah YJt^EK+LBnKWd9TL6@1//#j9/?qBY!q&E8@DP!9ip4qTA=bkp1>CWyt4+4nEdyF6wG8wImdn9j6NE^Lq
9QYW4w ZwMXIQJEZCb:5k51544HPX1&?6<M*QP/RDuC&eN181C4:pYZPmpRTR>!5wd$=GL%mPldK1p$$e5LIEBu
J49H>u qnk%WZGub6iljbPqBVHDLASGm$k>mLepQ8%a#@kYnA#mBc5nHtLE4:nB?&K<w8yiZS\Q?$ET8E\mePHy
5K!MwC mDwMDPK\CAnJJpH%jW5<*#BbcVJFPN@\@D85/lRdJ16MRB^ctVQ%u!IL4GeDKb:yMVll4NVb%hIG#BRc
!l%N\K e<8>EW#?$ulZjKlE9V1IIWwNKd@eep#15uuTV8:&kR85=P:Fy6aRdmbTwJn?ERIWqh%+a+EY:BSH!dRj
dRPCKQ EiSlh<4VIZIPc5BKRSNjXuaC$kyQHE4kM<MDtk9GlA8/88hE$hEY<X5<yj5$K>#t1nR\jiuTPJkHWtik
%Sh8+@ !tGb%SpilhFKp6HMJZ9#991ih5BkwjG<\P&nKn^#qat@HiE>BANI=\p!w#CyF>GkARRQ1Sd%#PhXR8c=
Ne#^kI 1W&6SPd%TQb5H^cEV8RVC4C!W@CIS#*8u%\P$E/NZS4YXdTSlAMw#H4MwP6^NjM<#@<%R8!C=RYCB+9k
>ykX/N ue8lpPwi>bJ/%pGaw#%B*jcEE$@mATH#XHk?HjcL9V1jRlSQMppTEl9Mtq\TyN9/GBb!Y:#CIJ>!Lj9l
*ZI::T lF<DE*GKTGB4b\d\yMk54@RE6CZ!<DaS?Myu:adJ^elaV:nPu:lyu/4lLb+ZSF?c&8>tE6<6BI^/EZwN
wI^Chq A\tFAidG^J4V\I5/q8%WYb!WyHcG6Sp*$#*>G@ZwQ%LV6Dw>pN5NR^kylNw!HcX9ZZE%HA*t+AK*n=YV
Aw6uLB P@REwl8!?jm1J1cS>D4R&CLKDiNCJEeZ=k5c!>qN?RD?mVF5*?/1>9PuKy8n&m6!W+mn6WTd4$nyLNtn
*L=6hZ +/t\cYAHmBaeTB4KE4&jB4&uV4XE$ipeIH1A5pSHM%wn@TN%C9=WjGQ?mR*?4mR$GhLkk&b/#%$RKMck
PZyj=R ^FN!HJK<8nnFCIQTKwB?pkqBEQjW>iISVRS<FctR8BL%*L/GSZtpSYDw8GbXktNG4YhYaFLuGq8i&#E&
KJAMa% \hKkKTwAh64MShXTFN:Z4Fd5HVnF#1L$HbLbHWEEPn%/M+V4*SL%hNl>tVm%8G+aim95!cPKm@eWna<V
X9F&VC RRFDlY+DF^FVjSRJ=$d4TVy^caqKF#pQCn4PY\&VRhtD=$C&c>VWWJqWRnRPVk*PE:q49c$VhTcI?tJ!
tWp6L: S+p+wPIauG9AqMadF+>dkwH>EAJeVwc?/d9hdu6ipF?li1AK/iR>Xt=/kYQphaXiaSjw1NHK^XMnNG>m
=RQHCP bK#m>Ik>T>N:XGDnJYFY1yw^*W8dd/N6R%$H!Sik&jhw1:ZGbG>AX:bMylQ:j\yh%ZiuBpH=#XiI5lpp
lkBI*t C>G#bD##4Bm\8TuHi$VVbG1\y+cdMXRnl4C^#VSZ+Rq&CwC8:TN$yAm?b:\@4QYHSQE^Xt#8RmE*^hpp
IX=A8u Fm*BNVVVl^$YAAy#J:IR$chP6=$\RuHCQ/%TIV8DTK/b:RYCk:6kS!ZynmQCK8tb=$t^CRJuweYBq^ia
BXy$cA LY+C^QE\ujVD^M>pGubljSQ\IPp<Y:F<P?JPW$dH44X\VmStTIq=&ARLaP%ctdBjtIyWjbXLFLQl?t#e
#LkVJ# bMem8*aLa\HDD\1hyy>$wWS+JSN<<?W=VQGV%^5t/=9Y5lcn$\yhawh*H\?*+$LHeJEEq+Bht$dA@M:E
IJ+/e$ LhAyIFDyI8iBiHedpdI?k+p?\!&HicIuamYNJtCMTjweMi$ZRjC>JD^$?WNWa>N+a<8m#jlFt/EjQcJL
M@qHK< <hyhF!HyNdpyqRG^X?4YmuElhT5>aE6iK55G!d1RPXp*+cqthb:WGYu$A@wYMD1&cZ&/6KmIn>&MDiVH
CjGDLm d6K#t/?E+HmB!WmE@%^1W?bbSB/+BL&9?@auNtR8=c=JV#9W>PCA$Pil*VhGMPZD?RkpIHn=EZLGjXqM
Btht%C <E#<QhKYNZelu=81MK1NJ9lq\D>GJ<CET@Jn$t5u=^A>JAAu\+cAKi>AQ&8<kmwt@JDdG$Fn6^tN@k\V
F8>Pad QnB/mQD6y1kQJM@LPFh&%lwEhE*&HqiPPHPI:APm8cjC$u8Z+:=cu<>wImi6Q^qccmTARb^nlV+5ip>Y
+Te%iN 1mQ$iJIcT+%Du>V>MGQH^W$Zd=EG&dBEnbpFA1bmkp#a8yn^XaaVDk9APlEY/JlIDX46I^WwmSI6mL6#
wS*AhP X=AAmEkFBM+@eL?phSkwZ/+^%TDV&1p9?51aaRHMlt+Bul8M<qSVECMAZCH:nEt!MDqKy8t%$&PkYue#
-A9<Q? 000f4685548001202b3 Page 76 of binaries1.zip
ZSm1!J $JWJ&w@Z4yZ:C1n&tEM%dBZSj!W8WS\/8NRmw?:/ScYj:?8?$+8+/\GQ49d/>LYHZ@9/HR<@#e8p?T@N
/@9Hhi Zt!KT4kLRCyp/5cdS#qh%itlLeCMZPMcBE6A$<qe=iauJAPA8kGJAF$I\FnyMeEF#p/JQJPi<*48D=te
JWZt!E I>PN6bm=GwL9EnB61IEA%w/h8^d&%G:\<<6iChVV9F+p@Xw<q$VE!$*#yaVV8CpX>94&neELw+VJ9:J^
a@S$:M yCtKB5:TnJebRah:nccQAt$k:Ak45P>W*GuP4M/MEPXjJT#PHwPQ$<GTkPd<XLnY\CTKHCD:F5VWCSlD
QZN6R: TSWucdFaS<+$6ALaIi5wTYtHDcD:^=!mITlEQ&1anDSjNlFjZRWI#N/PC\yG?>qFb9bQ:McVAINI5&5w
dP5\hW N%amXEFZ^uBTWQ:6*6%%4pR\dp#n5JjC:P^#h8@+enCD1c>#k$:aamSC^!P=*elt\m^8y$endm9b5qad
!e^mGy jtEDt=WB#uD&Rh$AC!AFuN6*p<mZaBh4@tmBlR\a:1KDawXMYb$Rq?n$cCC1Bm^bScuS*Rh1VFKSWaC\
NQTB<: L1t5V6mLS=Gc%J+bkceHlwGWAwH<!DRa=V=ZGq8d#646l4u/tMFIpS1l+#<1iAahF^KS>ASK*qQS=uGA
YLVD/I mHDNKX!p+^Lqp!8Y:*hX#*C%h8d1^4d=#NX1pk:DAAFFEddPDd<G:B?8h\1ay?tjmcSCGciB8&n@uLWR
k84NCL F1I&Ac8p\EXXeddEGed>8ASLl4F&Sq1mFppGENce^?SFDVd!\MY>Z?CTXdeqi>ylN&+CH$1c56L\nin9
Q#B4e< \CNMmI4FZiCRDb+i6HPuK6M=Cik/6iZX*QeqL1q<*h!T!uk%C\&VFVEh<pY!HTqFhp8<w5ZShbn?q\qc
d5@cTK L:y:4t>qWdAdl+bSAHuMHKE4jJDRGwLiql=aCplC?JPMMYA+\jH!=EV:!a^b9iP*k\?<ImHNJ1M$hbj?
J6&R?= BCIRiypQnH5jDeQE<HWn9t/nbitXcZMY5+u@548FC!+#HQmF+w@pIZlkR\GP!k?\mlVK8GIFE!!KT@%m
+*ejdL CJC1Z<@WZ&NKH:^e\RYwNXw*YyT=twkI^TjaLG/JIqP^?ZL#KJ:TcNAXB<Ty6*FA8S%\NA+*Ee?b^n5R
:q&FSE E5t+\RIBN&9/4#V*J=tFe$VQ+4kujmhnRE\BAD:BCRZBQy?:Xtu/Eewe+u<4tkyJ@w:djp!:<betQByS
EKHp&% GYc$wj%LSmAR%XhII^&JF?ZBIdw%Aji<bXVeDFM=&eeSd:q&YwK?PGPXS9wIteTH4McXw8M6/iD88d&I
V8h6p= WHH>Sjid<A6A^hhI6b4&LZ%<HB%CKMZVQ/iVB6*e8dhbFEmLVyA>N/:&aY1*W+PK>J*XXZBq5ZQa>Glu
utqA@u IaQEl@qEcAYuP<G*Q+^b&qkC&9nhdYliN*eTck@DhYPwY%LmmBcY8QM?4IC6dPni4GnBVw<FVHaDeaCQ
@Eek@C EX8+RXnE1MywCAQCklXKCp+F!F4H5pDwjpGT5p#p%wuhYm:&IGN9#BIJ8&S6!N%hF481%\H&CYlNIHGy
GuQ1WC jp6Gp=%wYCNwX1b%kpVduPt>JnYIdG+nMDKuE%G84K=JSFD?k@meAD5ZM&MSuR9a:8*\JBa6aD</JwAn
W+ALXA p>nheeHKZK%MVapbAP4w8GBuL!4WZX<LwjBBcpp=$ndl9%1X4yTpNcNRT!<Lu8+dYD@WPlAH1MKTEMRc
1uE1aA pCb+hCwkbT*iyPE?ScN\mV+uW#/dASpPaaqVKBq*c$pq5MWRc/VAXKb$KkSVQIa9qWSq+EInbyYD8mNy
e1YlQ^ FwCwIyMwGSjjFPN8TkjiC9mXMN?D+q>u5=e$@!mMi=:a##Ii<!q8lk5/J!K9dl#BLMFt\CC:NDtFAaih
<I4\!Q VaRayp\mYLBPShWZc%eKuqMiSV<#B8eP=ty$SE&QT&&!nGX=#?+cuWXN^>FnbXajk=$4WT69*\^*Nuc>
1@Ipt4 >/L4>LRV$Xb8dp5#k16Ad1KSkNS/kp%yZ8>$=9YIp>c9pYA$8cM*TE?QaphPui9lhFS@S?NBeLj:VeS&
F:/yw# M/h%\5=X$ILhjIWLQ+EZR$S@Wl1=aY+9>uY9SE^L&t8IabG>GGe5b&tEqlw$$Bmt+Em!>uCqFniRJS8*
^F@eTA etNdc1wq9uIT%uKK+%ahE!nSpmwB!aHnZLm\eR%^NI#4:kIXqit+IL%K=%k:E@bL+^aVbYIq9Ccyt%TY
\RTq5h #i%u+PkBwh8NpbW6wecI!aR^1YwtcT%6mD:5>I+Ne+9uSSLjVT<pi@+iYd#BqG/e\cGAyWq8pJ\iSC&M
Bh9=IF qBw#q66ydy6=ByY1<FjRuBHZ9ZEhD/&^\1H9JEPa+h>kD&hMh>wF>e>*ZAkayabI9+a5i6&AY8P&eS&R
R8\aZ> PhbeI4VKXi+#I?L8/ZnElj+W$uedNIMB6l4@=umK@6uJ*T5%*1!b?n6F8aja&L\PEaA!VD<V6AwalWdk
4tJm6R 8T$tiXJ1+JY5Rd5#R@Kp#QlbkCC69XbZmk=+E#wNtDpI$GaWGhFutPKNH8>w>S=/:?qB^VNSjAmlLJu1
eY4L5H +iAp?!>?juH#KD&IWbN&ITA9Hq&LFGM/FtCh:kT6M>=tP>DLBWXG\qS8J#aDBPJwPclca%8H/N*i&Lae
u>WM6P Tb^kAqJA#+yDl:H1w1IL8JuVEkwtb1k\GR<IBARYdW!F+KyGH*Hy>y*VQXw>FRTlyKhleW4TwuXT6LRY
t1*8RQ AKRtQKT\id$JAmTEZIaImbwkCuy9?GMlV=hbKChBS\+kZ%R^+c<&IIHmC6IpLjCb<Fa\#CAaklPdPBRq
99hDIP 1Vd+LE#S@TddhSWJJ^8JeYYDJELwdJwl$F&H&Bk1Dhycw5bljc6>*&MBCAT\ldY/16/\Bc5<$cVJ*T94
*W/K5p XqbIlP/CBYuak#F\h^6\bebke6\/p4PbG8#XcQSELbiJPcbTCAKRqm>Yk%kCmL/!L*S<ePVu%&upPTj#
^?K5k! tVTmMR>\MktCkE!j#CFS+&eu<tP@8%T!FhIuyWdA#%Q$MJh#Ru&8eA*iQnJZp^Zc?>Pn<>S1*K\%L+MA
aeZ4Du DIt:a*bXL<8MGFGA8Bi1cCAKEtHpEbp=IiM1?pGIA/i%RFZtWy^d!wA6AP59PAB<L$FV&bahI#&wSR1w
w&w6p8 <RL6\&YKam+Il1cB^qDDbGI*t6F#=i+X=wkSq^je$tmJu!F1uK<BP=k<GVBE6<MRHX!LE1w&F1@Y@aWb
j64hJE BuXmV!X5Z8t9wS$4Re$Gw5t9aDhM\6m?*T+CnZaSTa1$eVZy&BknD!S%&mi\ctFZp!=WCVcE/\W=bn$d
!S$H^R =41ThV$dJQ</&ct9#nANMycRLBwt@Yi6#Q>Nc^6Dp9+Neki!!*&QmR/W&L8/C4AXndAD&AM5pmAyeeCI
>@u@C$ %/dYbL>TXCIljDV@e>TmS+#!4=EyYj&B@>Q8Ha?KSGBViw18a=QIBKLCqSL@^V1IjuBpK?TBy$db1\!J
i8dy+Z yBC/F>ZBBtVnqMTa^H<yLyG5K^?IVZY\N!:RG>#+CE$uSp^Kk/pyI!+I558hKb$ESK$unc*ha?4YhPpY
9ddA?b =Kn:#+\a<YCuJ?=mk=i5AGL>E/lip6dQ8Tq#D8R6A@@FdciJ4BnEXRFuKRCX+DAGM&iWyD^:RbGqALhP
Dt*m!I aYNdXXh*/t#VYtRp6k<D/:F=HNG*>KCX9Xnn=4tbyCAZICB#%X>eay\u$t=F9*8I*\Sm+cRZ<=NuaWQ/
q<#H\V FYL!en<MwKZ+wBAXE8G/lHdb=Blq4FhuNB5:kk8P$&Hn:At:=VE$NdH5Mea%^>TkQLFHqyMQ/QLJcNyA
yXQNT5 +49R>%*B4mHn>^TWJMa!pIVXV1n>W\&Vm<CT\E*uiF/<McVb+kJ1Ii$%*ZeI<c>9NeR9aM@T+bJu@AY1
dGbKDm pCF@5u54\c!tJ^ly%6ulSnePl9\Rw?EdSlC%KQ6M>4u$GC41yA=AY\Ru4jSaqR:^DtTj&<wMkD\=YAI$
6KQp#d \%hJ4aRtj6w1HbTMVlRA!mwwYLLkJT<#w=H*ie+Qm9HB/Znyp$6M#&BHI^KZIR6RqNCaqDcm@KwdcF=@
Aw8che #nQF\/tnKV+B?P@tK?L4q:QhRQGZBKBG+lQIXWd/YmIm<::VttJKyBd+QA@4h+wE*wVM>?n1l%uj$4wR
\1cd1D KS/n:MMVTQJV+Cp*!>PV:*tJhKGA+RQ@>^8S!e^Ve/iG=AIH5D:pl5a?PP=Y>=wE#KSpNqi\XpDWAd8*
wY+E+> +FJ@k^hbj/5&A%^?/wkdNh@pNDiQt:Id=AB^%#?ihMtK4kT6cmQpEqQ>VN>*I=JFn%+F!L94+D#qK/Vn
aRj<k= w#$ApYdV\FIRPEkeTBL4DtKPh+qe5qpVGyPmtIk\!*nuh1uLD?t$NyuDbc+ecDV#QFSI4iDwcFe=wWPJ
&$!w8I Ta>*VK^9=X#?KS*PZR#IZt:>I?W4a=ny$hw$=!Dt\V\tCk$KwYN4MVi%?MdP%1K6>LVDSeTyc>LZ$T?N
$B\cjJ MFuLaY8p!D+i/eWk#Xjl+\GqY#AAPDYVKDqc49S:59SJJbV<6YJ/wndJM*4#M#S%nk4tu=9Xk%ww+n>:
&aFnYq <:=RV\&Tq+F/*#!KE9^=8G4GNLcbJEYN56>?T4mb!\YJ6L8/EeRm$w=!nj1FSB#F1:GZGpdd\GTu&dd%
SL!S6j yP<#eX@mqCDiB6ZA@@dm?B8MDbRR%BRB#9L1N8L55hFjXj!ennhVTI*^:$e\tVc6#VhM4m/HpJimiWQp
YYA$AN *C!XnAqD%wKZ=LJRRli86LD4B?bCW>SM:RtNe\SnkFnnAwjYLmGF5m5JCQt8=H#jh@%hTZRDt8>K?49j
PbFaBD lFPGLI$wHYYkpXS*W6:*k$u\?P::5LZ8aCYwHbT@8k1$nwaTwHZT!AAaGQXM=b+ZBI<B>>K6mke=SHT:
:c/AnR n8!YyViaF5I8kn!djtQRculTu!BKZ<y6JIbVW+IEBh$GDy1jZ#e+enmS<^dJn^K%X:l8i$=y1QjT8=CN
NFqc/J \I@&6Gh%BJZh>&GaCS4&e:hWMKMc^b8t!V=NtntWBF5F/\/K^V\V@WKT^!eliqdwV^ZSMuY\:d#hQByN
=?E*H/ dSIL%$#yKDdy\XE=pRjhH=yHwZDVXH\mGSI5Meb<#W+FnCX4bedC&5jDywJM/9ctX6ZXZh#ay15WAbK?
T#m6p/ <6utehip=hIX9!k$qm=mEhWthadt>h51Bb9h$L&hT!#NcbT6HPi!5$hSw$G//V=5I:AiL:&9YpIP?F8V
WGG#$C &<XKBL<ElRGK&l5*#W+>y4QGeEt:lm54CpA=F6>L6JLd6VmKEB^#MC/l%yBACePMFcwH^aMDTA5N!>R9
a%AVqm &$lT^qt^1adTSh\=AKeq*yPntc8\&D=$!F=*5A:%/6D\MihDw+heTP!Gl>?p/%56<iwFjCB:PK9BVuXY
KKm$kV mneuPbwelh9iTk@e\T%RTMW^e::lFThwP&m\=WH6w9Nnt=$/Y!j6*lBcbdjke:*n/H:*<?9eqB+L851w
T<IJPE PQRB%&6Lc$dT/1H1TM+E#j4e\BG+%/Ll$P\i+ZPFVCad#<wDdq+EZJ*GnTM/CL6?RkIkLBw&YMImVehy
&!MWIE X%etC+RlkH$KVehKV#S&ZMAhNw@T9&eTIhF!DFPkJ6bpWCDBB>y<Ky1icL+ej\+68at:c\%p66k^^6&D
y<qIS4 NiSLyIH=EJTY<^5S\NQmRDC@WWwMpaA?EGVBSq%G<Pw:lqtINXa5$8$hNXaK<BSF/+jPa@ZGX^nY$K*l
hYYdc% NGMpNcC1cR9uNp?^6EPSEZq9<&bMCLc\1@eaW#eXhytnR<JaAdAcSAE^SnZ*?PE^JkE$KdD%mL>YGj&u
:T@Fkd b+NyDwj&CQh>GAWG8kVlEyRmRAt5BH9+GpNNA<ZGpj1PCZSP^<@^wWPmC1YtAPVA\tE@Y51T1pQVDYy^
>Gti1b d^RLAI6AG4VnXA*yNM=P<i8k&#ab$?Qw9E+MWtMEljTbF^kG!b9Z/p?%aSeDA&Hi8T6KqCh:1D$5J6D%
-A/Gui 000969158d5001202b3 Page 77 of binaries1.zip
$RnHy# W$i:\1:tn*SQMIVq5IiPE+^K=$SJX?6yq>JFAAtn6I^nACH8eIBMl?1$J?lqqHEHhL+T?SIG>HS#&##A
VT?R<K 86w=tq95cc@wR16+4nDpVaa9#lBjNHC%&&k!FD9SQAwSaBIdPKVLJT5wW8qn#pI9LqJ\w4GZEN/%\SYP
bT8:EQ \HAhu>46^jk5SZcA11=H\SCb1=L8p:5GK^VKj+Iak5l?mR6V^P?ZZAQa%btaMbd:PA6ai>5F:X*$JVEF
>mcV=Q &F<V#?p/&A:Vq<T6dktCLTVwbVMINa=H#BE\#Zj=&CEnM*w=DVTuc%5Et#nn!A>PC%1KRuSIC/t9RbM9
eF8/<E k\#tF1&n9I##$BSL4pX\jw18n=+lKC/V=FS6y16EGPaJn96&\&SXI^E^JIbwTP6di*4&j8Dy$6+Q&B</
n<<V>a XGZpB9cRMT!?wqNEuP$n!^K:wWWbbnC5\TtpSm<$F5N8K>qy6R@jtS#qj1QGN+18^b%\k&lAF>$Z&MXn
de4m*i KMhtIH=yEQGDByBRyHJV$1i\>!yd^%eN=i6mSThGB6ZK+a<cZhnBmn4+R=Rw4HeJZK>QG\\?SLLu9V*w
>&Il4E Phtl4#85W@/%+kS=Mh6XZT?lMjELCi=Y<^W+DeAhWkNA$%h/aqZHlLSeFaqBM*jI!A9Ee=Bq@RVDY+qF
Ly=65# DQ>NImwYl$bi!W:yWm&V4KCl:K:AD!ye$RS^AdMaPj:TaB!ZIJ$mwbNy%/iuL8^GM^tl+5#XkC?AF9P/
XQR$tH BS8tQM/5=QIq4mYML\K81NH9ZeiRiEX6qAM@u+l+8^$KpBW1^MEZEmRAZ*AW4qdcYWuXq:n>P#!epaK\
Faa$<Q 1BH@yjR!^tiJ:t1\Z%S?LbiWPdmA*H^>!HwkpRJQeZWXF?YIk&e9ea?junKJm/9E4/SNEWe$nql48ljj
#mqR^^ >?H6n#%hi4wEt<P$lnMekYem+wdE$t*6HDDYwtI6I\8F#L6dGCpe\TtZbP@a:eNBEl4D1/6A$Pn^nwmc
y:G+44 <bt!QR$el1nnM#$yKSHCFqb!%MjS6NSWjhe/KTLLVaEbwEuy%4:TEI:FCPqTcqMmD!cR%4@R9ebA5$C^
I6An&# \#45mw^lAlaVHk%1lateAi9N/FAL$W>hHaw4A/4e%Di<b!?&/E^RK*a?KJ?%6/lN8:T$9IB^IZa/KkPM
dQY$y> 9$nPlZkCQQ1a=FEJbqwJR^CcF@IkVDXRAjyVG:NEF?iDXwIlW1icWHJJXGyyDK/<>knyTFuA5IN@N6ck
\kjL&9 IcYMdtPRGHRhu@cYCl8pVLYach>nyq+ImBAmVR!kwBwn^AL%$46S!H<LX^^8mS6EH/ehXTyecaAdJZtc
B\I?aq lMMhjC^tAtumHb6M^nMi<bVlJpBcm?QTFApYp@XZA:%JaEWV*MPa<#cmW1HYE4*YMLqYatF$bBaNApJ/
KBCJP= *&M>G$R<:Q*$*p@*jSecFERNtAY?1<##A81A$ynMya+LuIE8amJpN%Y1y4Z$4lQLE^+EdR/Q^CEnSAmq
Q5lb@y +PDV\RSpE4tJ%Id$QbtluVy@k6mntB^FWS>mcETp>#+K!CYYEXeeDa1b\6bPICiLcK4Ac4mSDTA>w\Qq
BJyVm? 41Xqetc&$FYRj5=cli/pi&P#m=Zn6*MMdm4BA$S/mRpmJk@WBA\\4h5M?c6cpCmlEqGdG=P8bGahRH6%
<d&Bw4 TSSKn!Hu$?TBCkNpLnXjdl=HbRD!Q/X1*w<wPK8BFWa!$K%Q#Yi81w%65!kCG#STyN\&eKh>9C!H/6t5
aFTiB/ DqTHJLPlmZQa^BMa46Ia&LyZd5cb@cW\^lawmEHYmTKI9dq>B+SM:adJ&:p5kd/*^iq+$E@/pMa+Dd6B
ZNykY& l*Vauj5:&KE1XV!eYVwk8L5\bh\e%R:T$=+e*!INV^mM*qR1E8FZ\J:GLA:ec$A4wyE1JADc1ncG*t!a
MHyljC DILpSTP!%l%e8wc5NpEB:@88R@RjNmRQH=qa+>^h<ncPueG@^Q1RpRC5GXYclw9GcNCFN46JBqTC\cSX
@LdhCX V@yp^!M&!RFVNecB+nG6AIXMi=!P+e#X>BlLkEB1uJTm<VTp\E1EEVb&\V+GFcDJmTF=XwyG#j!h8i\J
aGDWbB GFT+uqVku+^GnQ<TqbGREDBDdFet?MZdSeT@6L!Xk5#VC%wy/P1b/c:1yW:MVF9TmG<qw=IIKk*dSDc\
CLHW5j XS*RX#%K>%&JJZ=qB<idc>FTy/A@$ZjGP+b:1k#KpEcuK?ctAmIaN4WTA!nPGRw^9Mb\Imy\EtSwICHC
!dF:hH w\WXGRja4bk*4NI^Rh\RVW6^LKbL#R>Pl#d8ERK6cBkeacdk6P=T=bnRWmtJH6E/XRJ?G<uVFGTSGKLp
mFE$ey +h/EhBTSK5ZiBQmChCMjL%QlmuVe>T$SV>#b\ywW6H#hKwiu@:VVXCEZ^uEA*\m4Jy%LTMRVH6bLH#1E
\X5aRp \Bq+IuMy5hiAZ4FHCjYdehKI@EmKYF$%9?+ky<kA\jt:VcJFeS&@W\pMVwCLAD+5YZLZK/$QISeXdZ\M
HXI>C* /mJ!W8PBlBaF^Ae?VQ@&?6aA/9Y+<&h/aBp$I6KHBluZ=K#dbhDwSHT81=t41Tq\kb$e9b$F\Qm>n<JI
%RB9<Q TE%6:My=8KH*11MXPY%+^jM1#e$FGTGLYnGyLYAqy=&:+QIeL*pYPw>PyV4JQqn5aEFep^IaF@dEBeZ1
hI9XR< cZ>H\@++9qZVqiw&Lm*mQBPpTWBLV\?cV48+WNh4$BKK9=Hqc:Ki&FCNlA6Tk+kF+8jhJ1A\VMlGD\mI
B>#R^c CkQ+?IZB=#JZ1^%H<%Zk*bIeRZEt?%TJE^alHhR4EL!CRk1NnhD\Z/<GH+lekHZA=T//e5yP^lYC84qK
FA9*FM 6%6:T9wb?LWdJ@N<RHmkEep+5bcR6@pGe+DVW\eNyyA\BC!ThNnJ^8+$VmT^^IpLa6InEEe%^?pq/hK6
T=eaGu &$q%MNdX%p=\^ld8<+c?=<mJSZ\MZXb:cw1bT#+p5Xy5BcC:D55E=9itkhXX/\/KHRAd\449\=Y\CETN
n*k8Ny IpX1L>%X^NkbH#4W5+F?XAbHyP$X?IGF$%pX1ua6bR%!y?%qqkj&/1yK*dpN$TBllCWmEPB1=WVmBja^
!Jk!by b1neNTTA5Xp\^YaB<6/JCd1/:i!X86!Feka\qVPkB?t+ZP!yCwkcDY$H>C@tkW9@AyCqNVapyA>wQTle
RdTKWj nyNIXIlTaTSN>:#XXS$!NE>VNluF&a8A8!IFIZc?LlHq/=tRMu*nAa8@EV6B15wXDS&/DN$:Rit^E?te
m^<m8@ %Hic9mQc&Kl!QXTY!<iYR@ItuwL<PKlPTZEQ?WDMX8+CJ$kI^Z5w*$VYMJ$Ftya$VMce8h>=h\\CkhhE
B^JtRA ScLhEc>^!<Waw<RpTy!GQ+c$QeTlTQLBi4W+E:qyLjyAA=MHe*+@h\P^u^!9:6cN&$^9ZChcAawuBYa^
B>?D4W Jtyy:yRKk&Z&nGaTnG*N1Iewlhpm?InS4RnTDuhMkPBSH=1=lLACZEKyM@DlR1XyGmB!Z$VEPRAXCPV8
wIT!dt c94*QRa%^X=*MCkE4/&cBpS>\Bca?lGnVEu4*>NiAeA\eG9hakTyMSa9C=Q<S1tuEWWINA8u8mihcFn4
*FQy8u @p#=Lk/wL1Ye+F<JE#+4R?\uGle:AC+5Xwqa*ZE+aNSBL*FTVDWH?HSnY\kAXBnCjWyt\JT&w1h5p#eZ
cR!+iH qN/&W1+klwCZAbCG:W#@uD9*Np*L81Q#cTL>Ct:A1ZEW:h!%ybt4B9e\bRVATZPVcIkIZF!JLkPnC%q!
@qZVVt !K+k4YmK#yYT1X?!n+RShQTmTq15+%^k:W&6PTiuNnPt?/aRZ*Cc#E56IYMleCME4k>A/uT=8$mT156e
FI/BBw 1dRYYLtwRb5K#XeMk#SFySKTVae/ec%1ZPm+TcSL^uY1YwVLVb4lqlGeSDLT%*1dq$u#DNndY<JT$H5+
R>dLmG IXmjY#8%thDyLb?bT+RDw6J\5Y<DFKN6LFmkDEE5IC!aJ69d1*CS!uWYmRqCl@e>B9Zj/mKtm#IhD$D^
*C^Y*9 RaLlD!Z$^5dC8wN:Q!&PwnZhmC1RI4Pti=ti^ZZPB8jMZnLeAkGly@%PebW>Z+<SbN1E6QuA#/%>tKeZ
S/d\L9 4Taqhljdl!PNI$a?!E8dDde=WBM=cYHn&59<QmHwH*Su+%CaeI#pKMtJTMeFdVlAW:kCRGZGA1$\6jcb
K%4XhP 1=5TN4PHwD:Zk^h/1mTyZ+1>pGhE=nw4TaL^Rn!!lDqpeCEChXcZG:n+wbd8w>:XVX!!H6Z&HDk?D>5A
RZkdZc kYhyXT5al1#9pTBy+q:ylqQpLMuPl8QNL/K#muCK+ETk&F+<5iCJaq@*a5M6B9HVwL&bHw#!nw^C<I^P
DliY1c 8+4AiGCR@yeAyPIwSucP/&waiemk8XeaV^LGBbbH^bB&BaiwVHbnSHGXeDCl<+4TcPBS1$$H+NFGVBw?
$qCuwV XB9VRy%w8e1paSkVBCW^Y+mK:cenFajlnRy*5\9XTwh>EBq$qkwn41B\#VhMppKT=9B%j%!*dP=p@EV8
=5qb?d $Cd+X%5%Q:A4dp1TKi::MClanPLWGbkemd&a8<pku@\l$LDYm4IpQLH*$?5P\6*KHFE9ppQ1ywu?>$4y
A%b4J= DyRt+RyW6TJqu?ZIKb$E<4\a%61NGpj\AeVF+P8:+WBF\S4e1QAiCX>k*mj6CcHuS+4ykecWy:PBX*4A
?Mh5I8 nAbZmNqkiCI=TkdEBeuL/%yHQ*$+N+Z8^m+aP@EHS/YJJbdy^A^^1GyBkhkC+tVT^JQLEp=/9EiDuHDN
V6n>=J 8w?k1&tG/Nb6RCybcJnc+cyyd9?S8\bt5J89BHZ*=mpYHGVaLpdRT:BYNAR&+9Tn!h*NL/aaVX$\AC#G
Mm6W?! !iy?W*ABdPIDa/m+pY<yReC/<AFihJJ/ipTD1e:5tIRTSYcRKS$GN<AJ^^n4#AZPi>SFYQRG*CRc#eqJ
pYwE%J lZ4H5?1SFm=@NA1%A!yCi#L6hLnC=PB^5W\m+ti1SnqLSW#HyMEb/Ik4TKLkC89y!DLM?q9Ck8jY+Vmc
a5S4>L pp=Kp8Et1Pu#*FIk\iAXtdDdKmeN/eNRR%5:4V&nT>H:D^1mTcFi*+1IhN>*WSiSCNPhnHD\nP:pS>1R
CI!iMJ EGpB#W1plh$+Wt9w%1CmIw$yGZhV5MlEJ#9SY&$k=bh5cDN*wP=iyEXTJ&/R*IC51AbZTAMypYjelP$5
Xh5b5: A!?qB$JPe4ck1$94AETuWj5\Bc+wJpi6%FSIBIVpYRC%%E/QXYcpCTF4&EbABE^a1ykiZe^JGn^yE%p!
H&aXIc h&Sa1Wq&JuV<ZL8TnQyp:Pl8T&4RQHBD&M=6wSTuaDVDkRRSkdCbyH5K8kuieW/8!npyXedNX<mt%6b$
ZIaRt5 ^:A$hMQXTPWe5aZ1T5:%hWhM4d$SCq!TkFaH%=BqBP5+QTnVQ/itXKjBAuDj9JTMC<KKIjq=De\FV#n:
bAk9Ay qT1<>kZCC*e9FwPm!TpaKDe86PaEPw=/Y#i=MC%FA>QmWkZ#m\+&B=CY%+6P#W>HKqEmnDTqdndI:c#$
5dRTIl &iFK!>lpSW6ebII8YqmLe6EE+=cKVPI&By\hLp*ZYCbe=SbN%+BqV4LlLC15hWu\jk/:heJyBJ=kVTtC
RkXb:M LA!SC1B>&BRpESyH%4d9h:==l5&nmNShIyEQ<:<+qdIZhXcG+#=C=\HDAXKIDIyu!iAn1aCa5?LKHbI>
MEHqcT R58w@E:16D%EFplnYt#TXq%h!XY/Sd8CLWE&hS%Z=w!LW/tuTqSw6Kl!Ej!JIwITV!m#y5iRuDicbNDc
SCBIe? 1>^uV^5KW8Jk\HTVw//cJMeV8YAe1@D@G/<Ta$@wbl#T1%bmC@Nh%hXI4^DaZBRQ!Keec*a$nT>n@i?C
BJ\P/$ >CCIT&5d\YW>&@\mCa6NHa?I8PCK$mjR>DQq+46*hS8HYI>E>tyET4m+$6I?LZPcCPub?HPe?<6yLAqP
qylLS4 GAKV5J:X#6>aKB$p/qDleV>Jq9aqGSqa+=eAMtqN=Wc+qllYa!VIpEMeM4a!+cAp?IFZAJ^4?q:A/Twy
-A^BC< 00032b01576001202b3 Page 78 of binaries1.zip
PW9Z$M E>A%BIaI^nj^!ZLa#F9C+JSeZNy=G9lS6&?GeB8K=$pQY&i/^d4qu$bcTIQQZkbWl#W86kX*al1HH$ie
CKhTY$ B4B/GEKIPXjpSYPEPMcZwDX$pIXEkb8J8MWHd4HdS>cAX/RRZ>5Ii%Nu\C$IeMAPV=?WjdFJ:YwKMak>
Jp/1\> ?PY$ee=K@\hIC=IV1lG<+q9VVV#VeTEpdVCqbB$8YPKXP+XZZQ6dtl%4dYyCyIXW5Mpu5l5aya56C?S/
lE\tMm XyqMI>PtE$Fcq%hEeyDeYAL1J^9p1umiWCRK5eQ>lME6+N?V&9Dta!IBR1hw/NR?V88#i*wCyuDb+5Rq
#LK6tw 46=bJFqKKMWWqay#K/Le\\#c%BLJVp^\Db9aF^AcDejS?Ey\m!T:4@nEl95SqMPL>DWSHl5+K>GAahTA
Qdc*GW Q^n?@*q^$Hpnd<TEL#Wen#?ZnHPw4^QVd!I5Lq:lM#hS\%8%=pVwIp=Cp!iSI=C/DXVK&HXp4LkeAwum
biQ=yt Tlq<+5V@mBRdY>q\ldj!E@c/WJBWQaJ&GKyZq\8IdCG>c6QlBPyH8X%NPB9&ek&eCmJZVNcl\K8aaIhd
FB8WXV N5$I&6ySt$pkCWVR/<Rl69$^YPhwqTtTL/Y:##AZ:eb>I9WdZ18Y?HWG>SI>m:nujZDSNw=wyFcSNIQk
PmJ@a6 Fe$>Inh*t!AG?AiY8ZCuTB#Akpt!p%j4a5RnnaZHQ1^cp$aq/TWMGma\pSP\^%uiLIKFdyI<ZL\LkjWC
=uFEk4 \l&95dSmyI6S/dqty=G>EhYl=lE^Kp!9KN4nl$d@<?85u11kC&ICSnLRKK\PtdSA*ataeSTpR?Gk<YCJ
pJFtP= ?BKPIRaKk:JNnwiIuHuHm/WlZW=D\RKuaG@&I9kJ%b#kyYLt/uLlJbSnGW5>ERaueXi5AREFkB@ARZT$
#Qb:<S 8yJ?1iT%ina5/u=VaB&p^AYNDM4TYnt*KSFb?Y#5BQ4lJFuM6ND5^R++#qTe%$kA*8A&jVQpDZ>#B8D/
5LMA>+ &^E#APPW1&C8MiJGQEC!wyJq\%a8ZJE%pam+^5ZYcdDcFj1<1eqEtkhIt6ltJXT!4YHJHe@GW&E*<y$K
Z%6B:% G&FD<>SquE9eaLbP6YYqeJZdEAe5k<#&LZHDME?Pt^a+yKn6JwJLtARKAjN1+andTEXmL=!?PHdV&ueb
dC96p5 CWbEELPPD*H8?jcSNtH>yG8Ac%AMMM^>n+HIlSXpcnAbkTd1La1cKWtld\=DQaQB*km<kh8kI1/8Rk$9
Am?ymd bp4hEaVLy*6*>?+&DtCDy!jbW<R1m#wtJJYYqTby^Vw8ak9=T1PXED=IAbEMPe9$D8DKI5pPR8<\BkeV
/^tmnj 48H$D%LXGp*!LFBnVKCEk^:+lRXa??VN811BL\ApIQKAC!\aHRa1ttZAkduLRi/c5hmJ6N9lEecc&N9#
wYpj:^ SK9yCeXyWXZJ#yZQRm<#JZRi$XQ5T5:*dKn8T5ynA/hIy^pGABKKZ/ZXK=L$5SPIu<B/mW&mKa/LpMuP
Y1A#G? 8?jLpiI>qp1wQB=8#Q^Awk4<k6<dQNQEyb@m?CWFddp85w!I?>jWCDtNABQh89\@#jGM?WVay>&@FeRy
hqW6/A nHeB=!:^TV$m+F9C@jF?=lRa+^pHQhmAAyASW&PMGLhu8c8TEXit\lGNHJpRB^hMiBbkK!FieBaaNJmc
kC%>$@ p:y5W#AiIVDcS$T+eJR>*lmc+/wn^ECFZ/SQ<:1Dmd%AmIR#G^RQy=ZXE1?T*FpSHiApibGmqam9NLZW
a8F&l5 dqSeelbb!F!XAAy+JVq1W4H5>c&%6J<DjlA8LFI/AReG=XI+^$wQXINwVITC%j\^1dLnmwKACc<\:Ndq
yZ=wJG nZG$ce6PFVJnFd4K/I181R/dttw*T+S+yDa#bmwyelhMIbABpp#u8NJ81Sk!uDG+wPyCyIwJnuNq1i41
?euP^R J5/wlR!JuijeQF&RBFMF:m/SKXdt1q>pCnHJayVM\6bwZ!MlWhHP5k:wBn5y8@NhTS<Em6%V$\kYEWEC
/SH>J< NyHpYG>jHH^CK*R!/$?k!Y45yjdl>ISe9c&SJ481*aBlicXFGbM++md\9p4NKuESJeZGTJ%lEK>Ylp/c
ZB+bwF p8+KK>9cE1>$Yu>\$G>iWuBSd<BVj:hwaP>:ey!IN:#N/XmAGGDY1dPYEGSLTNlC&MT6*&A5NMdtpNmM
%A<1:V k$RyZSMAy#ja#WKL:KM&NM6lRtPA$<!IKaHnF1qupjGZP5YFiCQtE^jtSeu/Z&5C1AuY%$^ne@aBa$yQ
EW8mcM ^C9Ej=AR:M!YiCYAB\TeCW^wyW+6\%kGNbApa!eB*RVVIZAFndLnA4Hmekb*an8iP!6$PqkcueI!&4>N
/DHNN5 RkY>C=F/bc\eA>QKtZp?&DjENwwn+!Gpnt!MA=lcwKQ6#Fkw8/AuwWDWBDVe:uk?QXwnQAQH4XRA\pmV
G8$G^V u4c+5KIuuhB\nG$kPIShMFPnAwMFVXe%RwuQT@IWMR6TdK5lXtCC+#V=#NZXVmdJSCK<<qpyV=I5i@HH
6@*/@B 8TmSywG6dqcpq>!w1=wal^8w\cDlWPWqSqT/=wIJ=C/RmB^59wK8^IpR&BMMJ5qc<GRdFm6LQF!km=XJ
dGCZjQ ueA>m55^R5I#SkX49p#Cycaq/4Z>VTpie\%S9:W6H6kcB6JAB4t#Xh=?8J!$%!q1GHFP/uCC%dBP\#t>
bLkB+P #DNiATP<a=Iapc:iwEEmBhXd\PmhaL@$wi+W@5q&m1<aS&j?YT6iALJ5^uMn5GK#*FJewkQ\AdiQNML9
WLa4Y4 NRF8pnS#mBj6R\+J=+nAphF&54NTP961#pFCVhVE&KXkA+=:YC:F%KpAN?KYQwY%C*!HtujR/w9^Z6Gy
l/b%b% b!t/pWm!P964\=y*lpZeRPCR!IF%$$pmy\1J/++jdST$B:=b*+4pSKKIKJj8T?4XFeqNRb11w$TX6X*j
LY^c%< qCntymyN+c5WpSiImZJVS6$mm8Mab!KE1X1/NkkVicM1HPm\8eA:aNISLec5NF=qMZjkFJA1X!PCiB#u
5PkQID pqm5nNXJLTP:i*h4Flw*nNRX%XnEN16qMeGnE&tDF\h+SEpD8&l&aPq#IV8YmnbjRS$j\L=S!KVhd*/$
yc6+4/ @8R8D\HE+6H%!pL5@bIdibiqya&e\Q8Fc?+G%^lnScTMpV&TM+=%q&?!DCIy9VTqPXy9QBe8B*+XCTTF
L*D^SR Tq5:YVY:l%Y#8ND$NlVZe6\!He?/dZ9AhSE9@<lT\<h11Fh9Y\hypTC>*Lk!pjuH=lNY\:bBj/4eKZSN
lq9y^n !J$CmAdTYtl!Z6>c8dwKp*%/Rmw$:MaS9&V1&p$DqTcXuan8FLQN$1S&c!BBSdI=uiTWVla:k&AICLIC
FF1Gih Ma=AG#QnSLtCQC#=9B!<b*E<u+n:BinKawRN\!n&%uE@N<XNEI5whkQ+W!da+thuLK+iKJ5RMXYcTiA?
?nTd5S 8+y>$M5a@!\#FnC/te*!JYRK\$%SdIGNF+t/wKTDJHM&%hpTZ@p5btX/^wP8$TKlHG=/e<&$<wT5<VV!
&iN46$ SM?&Bk>?eV5WMGS^mipCTRQqDP+#N+6S!y%R%pEKYyDa=V\ClKt#hG$SXG$b:Nt>H>nelmYbMbYM&%ZD
?FNZiu RBb\A9VWBIGPD:8G\d44/YwBe!RNZEk=m>M^AT6mBK1HZh1bZc1R8MLjKc6!ay@BA58jLJtwME$h$+EV
?6w%hl jm\LSWaV9E/n:8DCn:lk!:9Nw=C%JalP&dCLh&CA8:Y4dLtEIQ6buRL#TD$l!J+Iud8m8MWnLZGL6Eb^
HG5>Fj N=h*^ew+6XcC!WEQIkELu+6=GhWRQW>E/MAQkHNJN1Xy#n!P!ZMKcB\taC/XjknKFB6HpAWJ49E^>#C:
EVHkRK XAm8w1V#G1NGIGINiKB<6pZReACV4m?jmCQJK@+P<WRm#n#^VP@8+6d^qd*^*9G5RSLpaqSS9W!PL&$b
IWlD\< S\l?a^9KVKDE&dByy+KCFZDja=!uXcFBRARX4=\6nL$C6tCSMGcC<8l%R64>#1W:t%>MeJ&+lAcq<CM*
\&eFIe =T&G:ht\AAWN1QaMmmuX4@B@ka\p$Gm!&BpC$+e6X8!<R8@C1&Gwa1R?nDIAJ\enm=^tcVBDlC&&99LE
i<m<MC luu&jwXeIRI^\IH+G8AWt/Ja$S<TEek@Mw9H81IY\/Ma$C8?YYpPhG%ljb?%IQhh%@8%%tG1hw$X4^CS
<GTd9I ^C+p:pWY6<RNyJ>pJpykeE9a#h96S\?iZNknSNk%LIyZ\&EWVaYN/NlT*i5B^nEC^A6DcKwH/Zpt\w&t
w5X>1B CZTPc&G=TD#MZZQm/aS$ZYhBqhBhNnqbVHlk/!9&p?M4SZGS*y8>4Jl5:IJCakKFatuLT>=Jt1nXXXdn
AXm*5W TAC<$VnT9y@MC^?iT4EqZw@W^1S&D1eGyVYyAPT*ZbEEHnbjclISW^*d+lk9CTtHwp<#mhAc\AeCXRe1
FFuhZ% I9$nZuc:TWn/I=hE=TR$a%#HyIheAKikY!=+Bip9WIC5Vc%A@41KjWI8J5\8MZ9G$*HNqM#aZH1$\dSY
i4!8:# !F$n4q:V@PLK%%e?8@T*tXE&tj=9/XHJ\<%N8dBSyQ:RZG+CliI8Jk%1MiTHBF1Mw#l*LStXNeHA^*K?
B$+YPB ?WwX>w4tlklq\&n#bVBK^*BB5yGu=J!8aX?EVa@?u8mGBh$KSpj*t%d8&y$=W#Y8:#l>MltCA\\k?\bW
%t<j^l XmC@AZ59iT>8?49q\XIwj@hYBkdY4Y$\<eC+wF?Y5+yp5JR:wuR5u$ked1l6eZHam9ZSHTcGCaqdVKb+
Sa!FBy d5Z=hKSS:BRSNSnd:cBuCm!?Kb#1eCB<eFX\IDi6=e#LpPp14j6J//!^Dm=#:&DFJw!JMC=hChFJwnhl
qYTYX< d?&$>+#YdZ$F9ILidKc/nBTMhhpyA%^GC9:1K4Yt8:m/Kmkek+BL9uGpWqyEmD5kEaFJ4*tEBRuDLRS$
RDC9&W n=t>N5hpw?!eDuNlnAiPbC+ScnjN=#DyhA^4K+VbyHi*AQNwWcL#ltGZtBmt/RW1AtXnq%j\kY$5d6CM
*u/QTF V!bF$iB4<5$K^pJqGSDQ&G^/>A/yIChP/W\Et!1AW:N$b<Q^SFBClaBM\c#Me*GXeaJyTMGc98?/!eF8
S#c6LZ E^WIGLmHTY\EM1iqZ4DajGW?h4=iIm*J1PRX+wZ181RPlw4Dkn*j&mM6Lq=$lwbMIeMpakBTnhMa:@C/
Iu%y&M wji#=AJL9Ik:Zb>M^tMuGw/*9bkiKGdG@FuVWmMCj6FSj/iZ6KY:L6+5P^nL\B%B<j>A4JANZ?HqEl8S
M4ZHmn ?:m^Cm!G8^RjFK6bp5Fi#jc=hC<SZELtEi$tdwA/Bai8SA8*PEYESk&D#R?q1Nj%y+WhcH!XC68beJWy
DY4Rw+ Pne%95n&knDlVw$RT<NALSBaCF\Z5ejY<WZEFuGIGXAG1p\*JVd9/%wH>Yy>1<Xyn#bH%upbMtJFLH5m
B5b=\+ ?<cSqd1QF86RnDi+&+D45\CJJ/LephX$wllpVktL9m*RdSK4LCdmRXpDn%mJiHXTQuiKWBG:ujtqp<!R
wBKWRK TwNSIn^CY<km1SADZdSD?::H\yKRD&ktRJKBZP$i%N6qy=^k91+1%HlXJ1AmqTT#DG=Ym%A?1TwlMMnT
jac8=B *&++H9>:5En1SPwENCFT*j1/K%\G/itl1V$t1Dp861aWWBF#SCA\pw!y+FaVGwGCQF>YTp>^X?Xm=11j
:C>98c hlKdFNMuTh?1e4lDC^P8:j\A5!RJp%wVS=EDC^/#A:MkTPRXKFJH+L:npi^#le^ak/+AulJBAtQjm:Hk
1t=VbY hPG>6MB\h&My!?+Yh/!JPDbFG&?T+6IWheYIRVlKPTa<>:i1qmkJHFqd+l<LhY6m%+:m&<Z?kQdD8qAu
4c%%5R pNye*W^M<G/6\jW!cI?P#qTKmDFXl<RRkXSIlI?FCpRV:#TRRy*eP!QHAQtu/B?cE$tjR>K&81KdH?*b
M4Y6l% K@JDT\>mEl@MD%4tYbaWTN>mtSDTBB&Yh>lk<akRQX9jbH?uB#MnZGeXSX&@5A%Tk>9S$%B5htZimWYY
-AtFB4 000c80f5602001202b3 Page 79 of binaries1.zip
yJ@+J$ JMWPpd/p8^tmGYlyejw=tWq$W6kt56hd&E<L\eGyZ?AJ!D\nQ5AXt%1:>DTPbn\8JmGD>#9mk>%I*9n<
lZy+MN =bu$cL%&\LbuSyyjZQ4d5EjAGhLNQZXC8ywmn8mYFqwG9K*BI#kMD\#G#w8C=VRne6LBpP!XiX:u6ZhX
e1k6/& #&i8lmA?t1@wQPmV#B^wu/LdCllB6jeDNnQGdaayyC&LRidWmM^\*kHjQSh@I@=e<?jwTV/DdZPb5Vyl
9e4BpD DGp$:aW1hCIu!QKK*Ck^mC&1qnbMTpC?QNN4kbaqiLHJpPK5qbByl\:bAdDD\yb+5F6R4YnGJnaIHE=I
>+GTu< D&mTKnXd14jwZq\hVt>FdnQEwZS:Y#!\SVhF=Y/PIY@laWjecaR1^4nV<W6K@R#tPa4q8WMm1@J&d1Ti
<!&NMP P&NytaHWI#m8SJ&TdF%IC+9bRXT4\811MCTGpS#IbtpjIaXKecVEy<6y1>m:LWDZq!V:XDy#YS^6XB=i
&8=ne> 1E:GVc6HCahpu^GPaNFR=TIhT11K^BYBk#lcpYa$V:qk?>=HX\k9*Q8w+LEcdkB<yRtG8J%=WY\w%dc/
EA&HWa LyXILw?R!wCpB&PcdZ8>?WX:/e+/=kZ8C!AP=i!a^pb8N:%M!W/8h:JVyChy6dl+Y#mCcNDd!A!ypCm:
!GC&*C cFCT%A6pEFiH56Jnm8>Qbb?#5?PXw88cq4@EB+EuhGCE8KGCZXX5bHi@Tji#YJCyDJI8KR4li%/<=<XM
?Gk*eE JV*QeaNZ^>%d8I$F6CkSFbId=nHCI\!j+akI?R!4w%w%VN4Nq?9ip\$+QKJd9!qPD>a1Qn6T++L:cjZG
/?\/>n k#u8u6m4FTeED$*iCJ!+4tyqim=KYlcTGE&IeS9/b5Fp1DZ>nLKP5mYX4BJ$aRS#H<KNht#!V1iZJIhG
I^Cab6 BEWIClY4:wPTFmZy4?\B8yB!JAVaaaa#W6b$##ND&PLkSjT\cYC8Jd:C4T9W5ayP!eATD+4JEYahc@kt
!VN#X+ RtGF=AV#^a!BN<WqbRTF$bJM/\8iKmPeuVWB=WlEA!:Z8liRbFbZh>mW&pp\Zd66w&+:Zni&\T^\8^C=
WN<>i* =F&tN4Y>H98YmIVa6^JB:9F?\5V6$ARZEWHpB868LcR8tWR6^N5eC:\GSM>SDc<cJVEQD1&dAm5IBtII
%:?:#X Q>IRY/K/HWD/=CIBeSReqc!n+#nC\jiEbGw%G9A49111uA6w!JySdmRh99?N?>@IX4nNRI!yAcCT5bA=
WCBew6 hp?:6LA!dh^bQQlbi:11Q!HR5Y^Jk$=!9KEt%*tZaDjZudP&JHyMl^Nc!Mc6ZD!RhXMbYVAkwGE@PX/^
ILe6jn Lb=#jFe&N%8@I=*I/W^i5Ew&4CPL*I6CdG8^^ypNGFqStunb#ATeylI&Ya<mHZCEan48k+VA6M88!JPt
46pqmE Ym<>acTC#Sqb%wePBhahqAL$IuNCWCIeKBm^t\bW?#BERtL*jE8<*9mZpH?qi\VWwHJP&ltJKY&Z!+Rt
Bkch?J I\?$SBkGIHdYFN+?Iq5%19<tcXmE4Spucw&Au=&c<wFu=?>>XJF<&NlYK%DGPWe#Ewpk%clIAC:QY=^L
h%KWLp n>c!Z?5E#@8d&6jE96X\ZH!%dc>DH1SPCCwI9LYeN>nPYPeYJ@$&P4JA>/eApeNDi\N8idjpK+1peHK9
AQ@QD@ \1qVcCIp<^D*nked*KH#\NCd*6N&ThD/6:/!>\P>X<5C/DYmJZF&&VL**5SEVPekG>KX9iM@9$/cj/B*
=GLW:$ QV<d>LZR4S^h4HRP>&e9%up!VC==K/1$MZGy+$Lkje&Twb/I8JY+^1RRkaEpLRpuGCMm+ZSG$VAqk/pw
4Z1IC9 YmlctWSR\H*k6C$?HdqVdG\JZ8\b*XKh<TCFyuVHMNKNEyI:k4GIKQat^J1*$?F1camWFS#RVpuk/tCH
dN#?Q8 4RWWWBSZ$9ZQ^!ch91pJHYHZnK84\RZctG8@y$B$HD^d*!yYNkpKRDMWYH<mJ1pRqE>^!BKd%HQG@G:p
K+<wPa D85GF:9hZGDyiE1KRQbmlcR>iqqqkSJ%q!lQEF#$Q8b&inE&NZ$tApcy8Gq8IT1CTI+PZXNJJ6C>n\cF
@@#hwV $&Fk&N#MAdF^AVM#1B%kGw?B:jDLHT+wFp/HZHZa&E$XdGN9M1YPp9AlHMQ>=^B<C$y1mhn%:T9FpplG
t!SqIN JS@^BplwFm\TABT8+T#jMGqSSF:Ae>j%l+DLap>CX9j6wM5PT%GX5dwS/dCj&JDkdMq&A#I1*AX6K8ME
@X:/%j KbPlN8IZcTpIu:%B!<%NGSB%Djw+aQ4KYH*hT!RN$6YmdycAA1Wk$LdC=M8:@66!A%^:yl#D&?a5Z^<K
DE\m4y e8*WGTCAS4tucMJk:tmuXAC/FeyJ!ND\dcu8ZY8q\%bH@HanLdK/qdY$eIRmJjqiuCdJIP*mt=Z+i#+S
@A$YuK 4naRw\bTK@cTC%5Pbe\pBTiqtyj##lEtF%q4h$\\8A=w#tcNCua*%=c\WtY6d%$lGlX!6:m8h5V\md\d
&VRPMn u=qwYIJXi/HKXPi/IR%SAl$?<dP^AeNC5b<yJypmnuh&E<SJ?^yyhY*+SCbB<AtmjeIyau+DnaI+ykbL
BBHkcM \e4Zd8p48qjibb&</EwYIB+Ky&k?PY5+BSZnJFha\hJblEK*Y5q!:P+aHLb>nuYn?cKuy%$/QVK*PQLF
G@ePm: PHSNWlcpDEe\K=\Kh8IZK#$S=eT=+dKYH8PMDP*ZYNS>*dhJ!EQ+^t$JnL*yRby+6d!R>&R<@q#<njRA
Jcl8^D Yt8K6BKEWER:8EF1I!8&w+!Gje*\I*eP8twke4&!SZPPD8<Hdw8=%TWmWVly*GPRAMVK+SXuBnjbX\Bd
9p*ECR I/aJw+MY+$G\mcHDkqX5tahSje/J<eR!wwIS%?kIl1RQ\=T^$@H/hALjy&>\/D*HiNQh*LZDhM%t6e?Q
nQ?Ltn DBTGuw6+kEmhNkdTGNnIGZ1k5NbQkuNRdEFeE#KBRdVPaCNp*eGbNh&Xy4l&jY5ntSdF>lG$pY+jYTSM
HbKpa8 p>nN1XQT&a<bBk^qyW=Xt5K6BGih#CXC#d1RJG:a\u%uwGdJN^?A#mZC^BW\Y1TMCKP\@tZj>=lKVXu5
qqVYnV 9/%tKNnYuNG:^q*IE>54Ttl?RJJmI+5TRSl/BC!TCDc@GQ8Yh6h8kqPK:JC#Bk=q<#=GJ6V&AFplIXMP
BH9wYF %eYqWMkhdI>$hW8/i?b=X/DR>lDk*=BXKQ$F+8hJ@XwMk=#X4=MPB6bJ#:8\JlwABk!ER=E6ILJF%8Nc
^di?B1 yGw*h/%=jPuP?HQ$K:IFktBG@LuaT/pR&ZnQbei$TV/8HXln4nlqWVIkReK8KHi+VD:BtbCMkiWWZNuw
&PMd8E P@C<+APBMbKhkeA1#Swl4^n^qq^y^e9A185GTEtHNc#&@cGEdnVW\REIbw61+:AT\\Qb</bJ1>$SD=nR
FX>wKq u6$hZ6:L1X8cnFtkaJ$^hVp=M5j>^bATdQL8\R4Fl5q/X:Ca5m>9RV\dK&Fm8e1P8CtkSiaX><!cpMI1
#5Ayu8 ^M%F%Xy*<J$%*YEy@$X^P%=\YSGH%Iya\d6GRuTF^t=p8q96I/EFHebCM+qRI#&%*WtumpZRecWIEYkH
!N^?C> $whDl>$ieWKAPnQhVw<H$1\pb1/TZSJ!XT$YH+B+1M^elnJb:1MKtMIREl&M%<:$j%a+w?*%66jnj$<@
1!WTN4 a6bPdWK4tVmH*\KaepGJNkiw:#Ty8!\Niw!bLDLBYCYGLZSJP&yw4#Ji=^qmCZ@:CJyj&PtJTletm=bI
CjK/T6 VQbuVFVPL^cJ:ja5>p65\*ymR\%aeuMdK1<R6tDmupyG\BBa!&jGGCB^4D446J\WjWwpC*AZTXML\Niq
:Zel4P 9XSXbYBbq*Rwmlk*wJdG!nAh!k8whHJJ!Kp^=LRty\FHFHY5NnGBcVTH/pR+18!uI+5PJ:bmy8<$kKHh
+Iw*e? VmN+6m%Ybb\Ih%b@!wTNS#hLEtILjX9c*kknmG*PVBnlSli\$kZ:kR!RP!XF*9CA%JXIiVGMG^\wuSNi
*4kq1e MADtpPTk+QRa#d^pnID1m/^k4V6aYNN>G^R6+Rh\R/MV<uQil<W5TVp<RYyh?*AXGk6k9#bSuH*VmhD6
EpPNN9 Ch&XKiu$w$E^41u&RII5=IZlCcQhIJe\QT:KqeYTwpd$KlMjl?*BQm664F8iHl#\aKIGyKaMTMWSGGCM
J6\R># ?B9J4CXMMc!bR86V\lSiy!$kS4VTJMDy1XP!VlImLI^mQFVRZBG=TJ*XMwJ9NAW\mpW5JCh$998w/YnA
*pilb5 ka4&YcbjH&\PYuIpIlpSZ1B=k>Putn?HGY&cE<4eHl#wPY8/F6A*\*$euQj$ESM^eItLFAc=MYp+5K/!
+9PK?a kWF#nRl\/>WF@XqZ8+aEWN*N&ID6#RJkd=M$SAw:ii1L*E^d8Gt*luMJF@CYcD@1yZ#n6E%BPC#Qt4=:
9B5R*/ EA#5>pw:+phnTwYhdBHA$hXw@il<#KuRhhFSGH9wVuc55d+E#CEeHi=eniI@CB?td1!N:QNVnQq#SwRA
#dGy>k $IPK:MlqD%aF61VP\IZF\8F&<e<maTR=!yY>y5JnAPYCnA=>Xy1YGX5hZ6>yd6qp<H&+ThuJ%Nqm^$RX
INX*VX X**5F1?6aRHRl=Wi4&a<u*FJ5uY^6Pk%RddFIlEN\keGMM$DhSI\8TCCF&1qS!8<4Y@5%IpK5j*dZkhL
EXhSLu EDM5R4Bd+NSFm<qy:Rt8InI9jBAWhp@QMtlLCcedW*qR##RbEQGSPT&l9ABkp^Jl^DAt14k5u:$BMM?E
BPZRHM IVR<^TKYEa?/$KTt1!XdPM\lJEGi&FDZqTSYqHLBE&RjjT+betIa?qZInC&S#qMC/mLY6*VbFJWJjnCJ
nXV^+\ dhlPNyY^I5C?EAYB^W5M^QSCTTHYPKTFYBLELW5p4th/ECim\C5uC*Y9dmDG&HA/a!y^PLGq8n68M1d/
NQY4/b 8dLD=SqBW<tG*WSDDdIaV85E*q\aHNe45pL*\tGnu=EL+c8T4Hbk8VhMFtPVqhKMRA5MIE8k@V^yW:4G
^J>:<w QT+BN\uGbBJI+yM8\Q^n5d?Z1!?tEE4DJ%GqADe66XJ+6>uwTJ$Sw\Pwmda^P8cdBm4ek9ctAd6^JC45
k*>CuC I6ZiJ1YE:JSEQA?WFN^Je4epw=?h:=kIm^LqXcCI4mEwLp8Q+Rp@Il$d8<nECJ1a^*&QYS9dIwllEt>e
::<E9a N9WdYHi/d9mJj<dlElyhJGcM^Dt$?HnEeMp<CR#lEWqmRtV$mR*dH>PblTR=dkQ1M>lB1taqFX$1BRW8
@WiHjJ !>YmGN?lY96$@eqPJKEZSaMcM@aWBMhEqdTEN%=h>w9%dH>5?&Q=98/A&NydZ!q1ukB&KD^4dc>44:iJ
#T8@eq kQN4Hl1W^Q@GyKlHmu6!F<AV^Fj%pB?Iku6VeX&PpEp*EF55cnnA!e8L#=p4ZnLiY!5SZy#WVT?MARH5
Nw^$G< KEB1t!:bGc:X5Dt$5Ye$S>a^Rl8Tdm8q=mRn:pw:@Rc!ukk+8IG+kEhK195YDmNKnMQ$N#Bq*:wM6\/*
IWAiwD kK9Z@muH$ldDl/XTIp^5wen1RLA<XAceIk&XBtZ&ap!^nk5?*YMnIBCl4FMF&9hLZLC+9nWAtncb/w$n
4:pcea m>wb!hRW1+9pRMT<Wa^9PqIqA%q$GyceV+T1#Gi^\RHLICF=1&NmEVR4q!tph/@S\5t!WMBctQDB6mBh
:%LJ4q !5jP1a%6RcLQhi!MAqRepGc9iBmC6R8La?t8FkZ\LYK=>nW1tTXt<JF?!c\Ak^jCA1#AS4cQwX8bH\R=
T*F/e5 *WT/VSa/&^W%^6TYCIlBNT!T9AB?a9QqXCjSj%l<6uI*kD<Cw*L=iZc1XnkClZ#kCCM#BB?i+?>QdLnV
a<qcpd aDepw\k^NB^u^Duhuq#KT+nPy>!Gq&:84hc\w6KZ#STpc:q^mcZGJXQ?!V$@mJSYQp6Ta%uRaGi%^C&6
!AbNQt Zdp%6CI9kQmD8F^cI<Wqw4c4Y*H6pR:/^du$t+%4/Fbd+6+CD1?p!Jn5YmjYpiPYWN%lI!YRlwWAPDhB
-AE=jY 000f2090d0a001202b3 Page 80 of binaries1.zip
Y<6%lB $Bm*HNYa%JKm9tGB>\qZm:yFcGc/B!^plk?XW9VhGtqZKXESF!$FTn@Q*1t#QpkKP*QJ/4lRIS\B+dC/
H+CMiN cu=>1^?\nJ#/EbTiBtACkAmlLNh8me8!eeVQjRFS=SR$XS5J?KTmCeiS!^dG1JVT&l$Vm%uJ>uCEB1RG
ZiTncL *&#m*yMM5E6eWY%AiJGjnk!SnY%mCY>1BcKt!R@BXA>c\<9qn&J/%K@:#*RMB:XP5+uM:ja%jpqF6^iI
Tu!itu DQBJ%/NC1WZJqP4yYRy=$CTRYC\%yHkyGjZ&L^c$H:R%!%!6EZWK$TWNLGE<WX!uTdeX$DWX88p+lMd&
cIj\le ^\ywJNk8:GK\FWmy184bpDwnLl%SpVJc&Nm=c&HW#Ya%P&mVI!j+<!iDaunw&1a/W6S1JH?Rt*w=IpN1
TlYS@= WaH4EIn/RFypdm#!Fyj4THnI\^n%pwPS%u$JSI%1E1FBcp:PyJ*ZeGF=\wBZdiPTYnAE*K:etKbB848/
B\wVXP 1XMcn$S:t$TB!8umZM&ID9^#?Da^P%!D\\%6CHMIc49ktG\S&D9IDt/9QJ<IL<KhGjk66@PaAMmSNJA&
ynI/jD +iKkP!W#TYF>c=VlEAeBCTT&6@VNJD/y^Cj\C41mpVl4G1n$Cw>py=YIB*EHDDYHtma&wBAeEi=IVTHE
biqhG\ Apk%p%DL5D+XnwXPmk>pBWy<AhA89Y1=VCKee=AWi/<C1J4d$kSEknA9lJ*albkbJ%KdLM$J1SQCCcSc
IuTGWb DhIyt<Z9n%mj!A!*t:iJZwlDF4+t<ITWa$nE#$V/BMtH45#KZA&mtV\kjLm14=ki<#Q/!kVJn&ylBRFj
Qc=d^u lH*l6pB\jFGd&=SE/J@a5Bn+bKp#AMXBIbaPVRl8+#XhXW=mw=knDZNMePt#tl6RQekBpTiRyR6ZFIw=
WtC#Rq <RN1=WtAQ%=CIY%kchD6ZWMeEZZXKMeLK:^RJ+FqNmq$C/VEZqV6mAGPdnIpJMJd\^LJp@JatN>E@aXp
^+CaQ! !C@b=Xa19EVTyVLeBlp>L=u$yYtB64lF9dAe/+E%y8nCcETHkRkKwEkKVGNypmiYYe#Y<N1al$*euy5J
VmITy# Pma4MIM#:eCKw?q?jY5IDC=AQ%!I5b<MlYD1qK\Vt:VE8eEHm+JF?PT%4yNeDA5&TeVjVaS8T&y!d$eA
Q:nVeH njPiPma/Jq!5>8^#YaNcBde5+<Db!XEjWK&K1AihAEN&XY>EJ<p\J<?8//uC:>^:6jetKlKSjbP*$+G&
Fw5@a5 q5lmmL@BejXNppR8CdPeMn6k\uiT+m*&A>uZ%a:Q1Tj#9BB@pl6>M^^:PPqa*AcMS=IE:e#XTp+JAXw9
bt8q1X +&eVB>S\p61Ed8a*aS4cCpaCal6XqSJaM$a&$66hcQd8N&q>KXRhWt%Q6?>Hp>k?>FuRAEXccVIAL=AJ
?dj/BP 81lSIlW\YhCTLV9tAq%LEA<GBWenwq/iwCq!qLtmQqRPSN%<lZmnW6I8DFeWtTjTuMJpnAwhp?ASktBF
Fuq!$b $1EK$pFc&\N=C5$G^DDQJ<LL6YM%d4w+kVY/\%8+>\be5K#\\M#RFhNC&$:t4Ji!Zi<VW6MbS<G@6VMb
5wZ!8w dRq=?MJ^m=w8A$ZGnyCd^WSQt6?A%SK9yb9cm<>E?*9BDj\?I8>RptnT><5u1&qAMaBQ5YtkVnb=P+au
mV4@8F VQu4YZbCkD&CkIKVX4A$8+iqmaGJ$tYj+#lESia!tCLNEP!p\IYl\BpTppwL5l/KZhYl4piSV68#h@Pn
&FWVXN WuE$=?WKu?+mY$<ZeIL=Rq9SHMkGV!CeHZee5M$T?ANHIIVMcWXJcVVyB4SNXX:tNFJwVhk/Nek>bHph
l\hkEp TlQ^BZwTR$pTwRAYMW1TYBApF^SLB?/\RX?w:PwY+ljbWP#4Zkt!FYdRjR9&IhMy<#!R&nQQG\ZKbHwA
pN$P?Q @+Cd%F\#+V1y*=Dt6yIuAydIPQ8MLTEM+YYHqe?CHeAR^BJ4a&Ky8tE/<#KF5E=?qE=jhi#6KHey&M8?
yYJbPY uywWY>ww6$d>EVh6+pbR*L$a!p1D<Sm=t4@J:ECj=G:GP^R:\4T!VAuKDd=hFlCVI^RhSQeMX\aKZ$AG
p89+Pw YG^BNKCwQXLY5%njDc=ZdGQM>+*cZpb8YP!qqml/ACKuHQhteSF+?*ClJZ+uqCJSnA#mn8D:REZC%wRk
cEn+W= <il#JVYM\9yYW9@Q6I>MJ$KMQKKqB=h&a@=E&$5\B&RG!mJTuFwPPAhml4PMAZ!%R<Lc%pb8#E&pSH!^
FCIFtS KhG%#p$t%PH5ldIn\PGPAicWYwudkWh$8kim&a>\CSLZ6BKZSE%yEI#6:a@%dHBclAhN<Vi^b?^<njlu
\>+k6V SXJIKlVRd!TpJ<CIp8bBlm8TCeipy6ZaEqd1LIen<aIJLppYawmI\a&5*8&Q$Z86JG5bYHcYH@6/cwD%
cqYC84 k1p&h+F5k>1iHmjJa\1AIwJ?aP\Ma6euN1\mPYim*CQmqpJkV&\Zn6nZAM%BHLNR15Ei#CRu6EdXWtFp
#lF*TC l>cyk4A8^PqJyLnTEFlKA*<tpPK^F#%\^iBP^6GH:HBm?&Nmb1jDBTSttPakVklC?mYDQWnD158G+ZlC
aJ\Jl= 1S%TyFB&y$6inYZ1MpjIMFnV&pTEnq&XCAFZRSIY\bwA>/WyDtpkkbZcc1A4j<^e8cS@PM\8>5EyCI8E
jy8n%J MMepjtB$mIJ4D6C/pAKaPp\jN>uK*hPM?&t6F>5N#mlBpt6c1:9EP11YFQhJQ!w\VELKZ8%EjCtH6npq
pQF!\y Q8*S6bl4YNeC$1+WKFtp:$ttm1/mlnlJVctNRE/9IXPnb@M?pm6S+St*ITAMeC@@IF%1Qn%c^YedhqB?
VFhJ>n 6c<&@wcX&qRlM5c$\BpN8#X\pDHe1w>MeI=yLJJ$ZCNjJB6h55<FICF%m9SB?JVQ\1L6GBdEubCwYMa*
^X\?PL %VFB16ecWdMpF>E$QVMYl@Sth49j!BJ?5TTd!1t#SnJA>5D$#5QG+k6uM*6XZ:hdN=+hVy9pEAankRqP
Y^u:RB 4H4cabJSabKG$hkJTBXtp!YL!u5c8MlXAC<k%clY5y:EIkBRSEI#CMk%G?dpe#<cqTWm<>yT$Qq>4adA
^Q4=bN G^!Qcy1NdSnJcHZGqdGhp9*pIF+=DcyeYdbRplC#XNP^+1mZElBS?MVwPlp#D6&ltMSlL5Yh#QY\%MaK
X&?^/w 5&l6m4W5EHhnBQ:4ymmc1AG=!4CMtP5PtMNq+MLNe^YV#i<AW=D8N>:Y!Vy<eXcmI%C&TJw5R?<w/X$k
CYuS/A aGwiG\VA+<?lTAuRl9kP<eX!p<Mq5:A+y4ANudLlq61<D*Y:#BunHC=VHQiPGMQYXH=uHheWh!@wGK+S
I#>Dc1 6=SIFuFMmZRSb#H^^q*TuDtuG*FAA+P/a*Dhiuw?hMkk:BkIEVdFc%!eBI+B%yBiYAGHllR6pW*FGXQG
%p$k!B ke8hHVTKQdc/!c+MP?1DbJu4//=&P^\AbS9/Cb#B<DXb5FP1ZBbAH$%^#*JkMNnZnbqB%&!I+%b*DWVu
D&IpK^ IwSHGpd6qe>YGkYLtaNpl&1a6BwnaY?Fl8SK#TGIEaG<cB/Z91+e9wk:&CI<=<Q#W\A#lB^=5hJX?Lqh
Qb81Dp RhnaG6$cpA1I8Nq+q9F%^M+wkQq$iWa1dPb=4>HA^iBBS61l5&aThm+SIK5tlQ\Qm@F^nbqPX*CZN46D
1@>NXW Kdb1$l4:6pZQ=ACpbtCIpPqYnpbw$6RBDBHV*WTb/MuEAPuD&tLbWMu5+&ECptp/j^BPZ$C*p:&^%AT>
IE4:8a TR6*ekcJAea=!i$=1FMd+&CA?^+nB4lnVViS?:m$kAMDRAEVNtC9LCwY>p1kP#$8XY9$I8GA^kbhV8GT
\JGpYA BQT$k4XM==pMP8d=y5Rc4+wFBW6Me%c\QI\kVqPa=>DQcV:i=<Il8M1XDu$#D1n$S^PnuSVBKFR5MAK/
8:dhIw RBpFm?ZGTp<<a+!n+GP+a<qaA4qKe$\\I^lBN>&=#i%iD6tSGWE6c#Kihd^cTCaBYy5*Et:qymJmly65
t&4>nX aapF&yp^H/qbI:Se\uHAEVR1kaKFGAdJC&aPb@pT+l4?&i1GBbLD!I/G!XuT=SNP>/aEIKuI<8AwkR?#
+!8Ql8 ?1!nVMGAN$DMb1:PelRD&dGRFWkl6DMwl6JtP16TSQ1?JCj=li@ItL=5VkKkTB%D@yLD\ku9CRcjauaT
?SF&+\ JyGi=llF<m5t:NEdV#uM%lIudaa6dpE%=K\a4W1KI5ZTI1VXKQCGat8eBMWTIPmAP+k@Kp!HbW>LHI*a
w#P4NC q8!Ed%cEk^8:5>IDFiKk!w=*SVeq:I*^SXLJdjw9M&?kLEMmHctySS8:yM8>ulTqApmun$4YaG:K4RnT
jT>lKI &XGZ4jSwWB^S&p!9NLWb#BplWy?5%ApyN&$Y=EQDEmCn>GD#KQhtjb+DiN&8W>dIA\tAt<aCHpD&IKRD
KAQman :Nd$!TK:1yb#K:8#ayiDD#nSaEIkPkZRDTe*XA<9dW<:T\1TBeHeNcRJJpPpDjLhXbbF9GF!Xb8cX?aP
@ba#ZJ mZ^jqWmjSjiZ/q^pEMJkkI9yLZIBE5KP9cTcL\iC%h:8tp=j&T5k8*hySyc8*>C:aQRtQKuqZF>K9#?S
e?nBBL &nJRRMJ^l1L9<SdGXBPHLPP5e&W4yIGhCK%IluT^KJG/\Y*LiyJEHCYNGapDiFW/B%BnH/TNLSI8Mna:
/E!=ZL %CTTcA&JEE#+lJQHtlCC*/>hV%EwR+uhwlS^tD>p*ppNcuVNc8S^\P9p?J:mJmGLJaVRj+XyV\Cn&&+j
nptI1k <TE+TNKlpnNth/e$enw\wdQQkQ=bPw^u4&^i6!pB/aA$n8L/%65p?cqnI1uSD1A1wWaQJPqp@tn1l&S\
+RC&DG E\N>D9EL*NwmEL>8$n\1iXD^N!AYIBL5%ItA<haT@diW/$a+YVLchq//IWMVkt$6MQ4AGY^m^CkJiH5+
4S>Lch R!N=A6wchAc*XJHL8>QmyTXKQP8ZLQKm/=c1F1kD1YmX/S8MkA/I>8c&SdKiVnAHnHD!%L4Nn\wW65WS
SJkaHX my+1mAi6J+%^91SlCt>!FKe5T#DXVk&G&1/\EHkJcLukk!J#kZ?/8pFHLL!Fi#\NMy$uSIhli4j$8yWM
>Y/pN1 ?WZXL!LlCFyTVChpPDa6?GALV@*e?VllWD#$%B<&!WukGXH?:c&hwT&tmCLMkYpaIQYP#uXiLF#nM^aN
mAV64^ K^ZY#mi@bJHQ5R%8#mFVQ&buLulL:F*MlpLIui:q/MIJaqVAQWZVj^Bqi8AI=k?:1VIkl$yE=nT<+A^:
e^HF^H q/TiFuXQKX&tc1eHwmB*&ANpFX!tmiy!:nLI*4:*WhKJqmKjBHPm=H8R9ZebTaEG>h@N<etP&?u^CK9F
wn&wXL +\cmXwh^F*dhYCRylp=mF%i^Gy&Ib9/kG/wk<1<FN:pcEdTkXLV6T9Qq?Hp\RR8AwPwEW%Di^SCRtn#V
MYt8aR <%+IZ%i8nmHDR@i6tiAWkYEt@$Zma#dwGwJEdR1/8RMu#?B$Q&Hyi>6VqS=5P+@Jj@M/$^y*JneX$wZh
H%XTWX I>1JkE!Slw\ue=#$%DXwJ<Za%6E$yu+kI::pV9:5i#$QGE<m?#@!w&<5@dRemuC<5CGi:JYBM=nZE:@W
?GCkIe 6*H\8hLku\tS9bMI*<HaaF^S6=WhS/kna5RuA$*kiHQFIt/:Iupj%6PSC8lFuAWwdFcb<QlPt<h6dPGy
@NXmaE H*uu8qMcS^@!ZD&W<IkK%M>J5lKnFNSLJlh:X*WYLeby#Te81StIP/DnE=pkVRPi1Ie$D=kDhnMZE:YE
p%p^DD JHiQy9yWb+W*CaNw9Xa5Z/b&u1SB:S8:AP<9BR@&?6aK=PKKJe*#:!Jy1!F%=$neeNCP$P<?P^+8^#Y@
L*Eql9 piSuPeahyAj5J9LSHK@+/NGMp%wu5@9tjhtL!akhQ@>8<=XcyLAcbCilcYuhb@JbC/#PK@ca/6td%m8p
<k&b^> ?ACiXw/%lVXw%AdJ9IDDl:TXShBh&5/u+?\C$9c:NELPVp&VEcMX?M#XP=G6/NRdM9uG*+l>C!Rei+q^
-A@wJ+ 000a387c020001202b3 Page 81 of binaries1.zip
J!JkqC 5Vti=ny<yI<Gtc@nTE5K4FuiMPu6DtMWh\+j^CZTdGbJHZX&cu@e^u/w4SFXP1pL=wnp=9t>%kG$+Zc6
Pt8y=C tMXB&N$tJRq#j&XCP&P!uTbIBn>4PtH4LD8*hhtNL&tD6wYP#?WQIG5m5:CuNB\BPdI>!awWjD<G>+@K
:/a*jB ZG&!Ne#^^K$n<#jc\w4tRkRiLw?kcRVAR81WH\a6h\Sj4Z5mC+SI=+IpI@H9DJMca=Ral<w*JVC4G+At
@:Wk>G 86At6^559Jnbb$RNRu5Q!R@ZZuA9mJFk@%$^:T@aJ?1m@q&B:<QTTWum<>TG4%MQ^BQ<Ty*yjWKKLR!!
a+T\54 8hCl1bZLuG+nDRjtLB\ih8#<MnQB^<<dHeeFelJRG+Cw5ZdVthh6MDwtmDQYmM@HaEbI\TduW:lABXX>
aRj<<5 *YmCDI8m4NX4i&cpnRSNPy!:wB8IX=E8w$^tp@AMdiEESlI5pc\DFIl/>%Su@P>n*:IdnwidZ+TCn8Ch
aHtA%1 /Qt^q?!X#%bkt1i:GwhkCn^RdS1Eq/QZkMKK!ZmhVP\G@>nplGapAT?Pml54F/@Mey&%RQy^T9dKe8=K
TEG\Pu cL/Ta6E6LAkpiVY4t++uhPpF6CNBLhMR+@dVpenlBQ6i\?KjFF@qdG\!:MdRpmHAy4GmW!qn8F8t1GCX
nI:c>h w8+ah#?yGQi5/ic$pyH&ESNb>F4T\yykI$D4/u+bA$d=aibb\K!ANT54G^4l#l&hAp+8%h@qGARhn<!u
mNXL>M B?we&WBeI\+i<A#Jl:lk%#DZ4JHeeykB<QeL%*C9M1hdtc5e*aS*hC!8#FuE6cWYF\\6!PW+Rh!aqX!P
NWm:WX =G/dXCN^F8qw*A4ZM8/yTpcdS%GIBm$>GRZu\GpEjJ9WGWq\nb<uL11X?DYHB/yh!\D?TXcPEK^Y/RtJ
5G$w8: L@manbtBZQaS@al6+!qlAIp\IEi\:Z\1KnkFwnjSait!+5>JZ$8pePBT<>wk56l=K1u^^D14tDpZcEqA
hiQZlj NpEqEqL+ZQb^jELnJGdGtaEkcP/LNW#iDPlG?5b$eNKG:6+Th9D/R=KRb%L!mq5:t*ySBbSL/*+9*tJW
iMC>t9 A\Mw6hPT+!yRk6Cq68lpQ8le5/S6ydt:ST>ul\PJFRE&^C%e9H?h&*Vi</J*M1RhZpKGqG=8^p5IE/tT
!l*qaX $P!>QPuELCBPyMRWaVtp<AqZISDJYbCTbX6q+mRRR?A#+TVY5eRLFSjHEjT:yp1p\6L>::cS*Lhd?k<p
=CLA#R P?hVuZjeKH&MBGLEn&FaFEdVwuh&6t4dkqlyMbe4pd&e&=*bqS:I:NKwPb$c/1BV19G5#FkqG51IqaEe
SBhT9? X6KujYAni/GtSV#EHRJNVM=pR*FK4MZ5I<#Dq5X1I*k&Q=wilM1TGaF%AhED>tp:u:&wjc:ePkc%@*Dm
a?R:KF T#Mb$eY+DK?4PwACdSnXe=t4QqA^Cb$1S?kMt&CDhLRk1q@1=kFtL4YBXcQkGeEAVA*m*B*D&6?$8T$k
Yj^Fuc WFl5W95qB=k?*TqA$B9dGC$BDSE=jG/tt6VbbEm+B!BbDejBL+k+G^?4FZ8yAtKH:cb^+y*/YwtcieDT
%qLB%+ 4lnlI#&P4ZT+Tt4^p61K!JK/liw=^y<qt#mGtp>nTlmJp+!uhCtFt@<1AB>kGnFCikZ!lqTdPa=YJ=kq
Xa:Ibc hiX*BE&LI>XGh&4\Au!\LwWpRRticiAFbl^ke^LVXPpEL:/=bD!ut#^LHyjdLpcaSmj#TheLnpPR6liY
#^aiiY >HJlXRE:IWc=$/S%CLM$Z^cGpbmESDqcNH+k+k>meJ5kZMen^jTAZ:wS5NiXeVZJyHkP%SDnqiq^Ce^6
&tQl/4 Ttnj$?4W&i\a?9&BX#K:\Cjm9SZ\HNMtE<F8MW&Ah?Bm:pqDYXP%dSAN4nDHIAepy!N%Q9mmdC/\MP#C
HXd>KX be=p*KQ4LE^:iHPcS+qhV8T8ITIIlkFPJlH6FWaDRF%1lebYi^=%1aJ\aHT$:EZPp?ypGcMpXWy*\nuL
Yj%CiP bnnbSeR?RTekkX^Z6*m:LuMcb=h&twLiB9a^Dq4wdqbQ%V!H/yE58cq%jtQdjPb1JS+G*X%I+LL5yV84
=Gq:Q$ q@=&:DnCCtm5J>:ZGPiJ^<+Zt/<waktWWSk>nI#9JcKi8A!^5I5FF\uSSF@eM%wBdH1pK\Gj*8/IX\w5
<T#DGM h%ydNHatZK<^CKThGW19\%9Ca45I+Kdtln468R!bWQKN>wpXt%\5>Lq!MnabY=A8c+IePd4PjMMpVj!p
nkhTcJ wMYBd66l4Kn/Ft%tw^IdLa+^!R5TPd4\Juk/tGtaJEdn*4FcXm^P^MZN^auESQ4i!LpWZp8J#wBKu!RN
@Gl<SC 1=n6XNqlik<\4eP@p^**kc#5#PXXMMM#q\%&:Pw1NGuPcay*RHC!EnWD%W9GPB5Rq$H6W4QNm66a5R^w
Z68PmN YcJ^SPwSZaj6^PMRtCb!n#lJkV4XCi>E<uGnaEpLyjTkGPkwT\W!G1SE=uTj5e#LpcBMj&N&\ic8wecC
%MF@bl LQcJPb$LKA1p%1<mKM&Y1KM^&:81/RbYmJ\AWZNw+/ZtWjm&M5@DZ=TMPuG/hy$lCDT%1NHKDBa>cptI
u%lE$u KVi&1T+kL@wkJY#yQH5TPBiC<TN!\yEWecAGm/:FAjh^8@tKH&hNSAPLPE!:IEq&A+mM/+qMdq/ucE5=
w5!RP8 D!ak%&b#j!?c!lKA6p#u6CZL*<%1CPYMFlkT5GdWtnCJq:D44W41ZENWpZJ84PJeed>$:!PGmJl+uLlc
<R!t5k tTuPF&KVm:!aWE:+AWlV+bYV^B=E\&CPQcMmpJk=6AeK>cXATiMTQG=AmYRZElVS^6C:DbQLud\VQjqD
QkV4qF 6&Ih/kcY=S#DXKi\SAANZ\A8c@j8@yt5^8*HiqbASLV8JFqMJl#Bh96b%4B&GeBB#SdEIq^PpSWY$c*$
ak@Ib# hB+WC\ZnutS@9HRcL$NNk^b85=@YE:e&c6Yt^B1e^8aIuR6kWCuRa5t+>FwB$KDIl4:8SAR1Dujk/@E!
w*cHJ^ CTMdqLEL$q6J\Zwy&Vpunm$&*$PT5PFcIDBSDIM9FyBBRBY&Zat>BH?B1GkC/CkP5<%6iVc%1kSyGl5*
MBRYV? 6Y=1SYIL*ni&YVDeahekR6wJjF*tmh<tMSERBC#<aIMl#yLX>pbL6P&KVi#\kb>y<MRp9KcHaGEaiH$^
/!m:He M*y%D&K*:^C#R+LpBPDIBDEnLHm!9DZ8k9TL&bKF\SHiJpyZ@SaGe*JVab*/IchHM19<1=*G+8eNW^k=
X!:#c5 $VC=EDLN%Za<GTVMDuMNp!6mp=p\tLp*aj4LI1=w/8ja>#XI&!PyW/lL#b!&W/eC^1Tj+i<:wjKRZI8d
IliHXX =Ti/qGETQDeYH%GD15ta!>LYk5\yc&6uFDwSMa9Yu*nWMDeEn/LeitPZ$:Nt&Aq+NECPkFE$8*AMWE8W
P8NpK4 *dyj#KlAEL15Iu1%^@KwLE>=+pL\AjT:+#4XkMbRc!Hy56mXLlwyqCYMKeNIu\TKRDJCLFQ#lMbMJl6p
%MFIi= yHtWLaNVLnaPKXJm6J81QF:C8Ie9iJbbyyA/G?d5nk55bT=\D#%$5at+epL/W/A@kN$\8kRTBVnLpnPI
q#/cYD 9Y!>6$9!1*8ZhM<X:DS+qDtu6cl=lpEk&jZi@GL5PK6Ym%ADD1+l9wq#jCPCmmGJ$SDQ?GDHB!wC^q1*
cJI&hj hd>ZeZ8^k6Xy?6%l@6>mKu+1ySjMqt1SHqbHjDGQIXdbym6MP+^9NG\1W+GJR/^T8=XdLtZa!bX\&CWy
LHRZ%n yW%TuS&WR48GTe:1w\&L9Gc/GNFebe9LYSa+5CXtG!cn!SB/P@WtyAwQB+bbdViPLCdimAlZw88^dkN*
FHKViC KuXG8MJwduQcZddT&WLu4>bJmCEV\+dwTCF/u4P#uV+ICc6*6?Id6LcP+\P6elP>5LVR+mdDnE>AhniK
@:CZyM LkT?j=NAqpN8FDYJeuF1%qY6SLpTNlADHLDjB4BeqnjJKa>+aY?TktQATycpP?u#8*t^c&HWR/h98/J4
1Xhtb= kncIpmY%TiLLTpR#q%#yacADHhuBuX=SkwP+>1!$Ey8R%Cbnl65hE*=lClIjAu&+%KVAm8YACw/GWhS\
TJ/at6 kB%Mq\6$&8P<R91CV?6qjuAIq<Lc&a6*GwACI9FR<?iM/BBq18E+Mji*GA8GZXi+SmlSTQ8Y>$DDMtN+
G<ap1< q/PXt/=&BuSDwJ&KV$e?IQC!aIFMRm\KX4a/&c=GktwaDqmhuiF+mHNlp:wKSkD54IHCeTYGC*jnJ1J!
4Mi/j4 Q4lmh/+mYeLSD%:T6kLSQa<=:>cyCphaktBANN$TS+=/SteW&m*^FW=S^F4J&wQ<EAB!/W5C1=/+LTT^
hV:mnq E#=L6YVYm:\T8RXJBc/\tmyFtR5l/\RhNhBVEk#lk=mkbZH4iJBXVyId8h*EGnYaiSuiStd=!=#XNM#a
Ei*N*Y !b8TucVdKHableAYCT/nE/YK61%miZHYMEiGI?IGLw@>TTd/ZidwhS8?GCjXAqj9yuItEVleMA8b\?uS
S&PX/% IC!R=qGkHKC*BdS#5WQ/85Xdld+8n1SwL<iqqZi+iDuyR#Etn5%i1u4Z5&8CI*mb8Lj$ybnumDeb*qhk
bW9P5p dG8p:E6YV$$%\mmmbGtk1t4#Z5^h<$855kk$6PebT%cZ*dq5R4LCdnkipGB+MtIqw=XeTBhqd6qL*FG@
1#?uy+ %MRP9h*&+PiS*A*tnQlYE>P4AG>\*^aSD\/AypRHe&H6NFWMC%YFdh6$Q^i^9dMA#\qy5!Ibn$lQFjHw
SAP1@* mH*N6B<\e#VSyqwJ9Ta1GXmtMK1B9W&tGy5=wSYGB=LdSjk\DW6\I!VqSS#XbF:RMnYT&N5<n95*Bc&8
9AFZEA 9DCXIF#GFJ6emu^a&n+8QmnIm$cE^nuiR%^BJwd$8*^!*D/eCA!P!D#AWkMTbAqJpnHyS\>@pSSTkELF
8l@?aZ ^!V%&cDN?ja%Qp&4jna%\BQBbKj^%yLtXe@mapHRR<TF+Jq4D/a9/\wML!eaDIN:JFZe+CiISkY8a&5e
yV#%:W >9lJ+$Wq/=4YWjwnJkh<1MtIaN^+laRkDL4yklLJ+BJ8u%=c/aqKX&4AVLiM!AlKZ\LG%P!y1wRKbhJN
\:JW%w tB$C$5I+h<*81jFqLuGnQb@yCT=F+B++e5HJQA&teNpm@q#5?H#D<cwat^#55EY#Jm$6Eu8JR@#FCnhM
ebiI9! KMZdCV*SG&&y*>TB4uVb\akKp?B6pMtlbB6$e@R86nLlTC+5S!CYAJJcRtM:NTc++%etpa\d+\Iy/dFJ
#Wy!p\ %!W4BGwe4u!FWcu6AI5\lEI$EbH9Ew8EeG=HqFSK<1D^KBHLLAHyI%5&1bWu8PBlZCV&88jCi#E&id8a
J1dnPc Nw$lq#XmGmewN8tp\mJSHDGjWLbVlKF%PPFH!SZyq\JCQW:5aGYBNGPu^!1bnwHdD+DuEFM>&\6#:Y51
9*qW&& ^TQF$wG&Yi%4q9E?^lIZ:EA&&+WL^k%AtnG=diPnbD/aV+@iZ++ZcGTQhD8TQHFSuTS\uk\J@qk!d8yD
#p>EbD M<<*Q^M:pamAD!AdN8@4cWeRHR1H:p*phD%!?<Fk1>XXQeip4#knKwBEElA@CRpd4dP951aZFE&J\^I>
==K!Qk XZZwj\pnJVWItyj?^F:NKZ8SiEKl@e5%?Hq:cp\Zd6QQ!LSDVwmj/dLh@KKKHT?!RGm1mL@Sh1YaG1\E
>5:81K i/SaIGA$w#>=i^%Jw%WJlCPDY*^NdC*$GiwH#Wykw5ME^nX&ncikLiT&EIdHTTyPibyEJW>C%Ct6JpZT
1kF/Al jE^SqM^$d+^1>%%wFFS9WNmcw1aw$GBAGT=JSK&YcFB+BXe$*VBbIh+5wjJ=XwJE:KE^6@S5IcKpa=MT
k+mM/E %DB=q/H:&Hpyu*A=\ANhG^KjqCe6QMT8l4kyA>#?GAtI^i!Y+Abw9iP>*QRIDq8<8Lu15NkX1M$Ea:T9
w+ap=M kbk^wakbak&Qt=cEBLEGR*\aV=TFjmdMFGuh=WV1mVc%=q*+#L8<TlKHB4X6I11Sdu>^Fp9aPi!=J:GR
-AW&?@ 000cc97a3a4001202b3 Page 82 of binaries1.zip
5&HnRM Q4u=WTtpln?w?StE$QbXk^tIRW=DWhLakS4aBnuld6MLawRbN!*&JChY?W^cXeiEAiB\$#<+LNFVhV5!
wZXc#@ Ab6HW%HSl*Rui<$G=u%nY?/CMTtA+GRESib=P*Py$iRhc4lpl!5+qawFA@*:F9!#bFS<T<SDm4MHW+Mp
PZRJHI FkImTIlDKt5dJ4&%heIhLB9mkyFyFCWGwEEbV#wiEN:kXm+BcSu5RB%w</GZG?bJBS\wR?eCl8%E9JK:
c5>!iT ydLQX%9Th^qHp=5AbTRD&9kbIBGNN^WX*lBAHueL>64MFRK@\FLEH&N@L8SJm!T45/Py+\I:Iim8de$y
aNqJAk EmCM8iaC<+eXt/^%aJ#nLBtMN#mW%umG^V&n19e5GSHLSbGWHpjmZ8I58$FVGRwuPwM$e>:pn>k9&mD&
uDYwJj k9lJwTEBmhta$6p^Hbh#NCT9jmTINy\/BM$w=DYnhYk8ANbmL%Q1^D1hJDLt/pV^N!SQN5WSdWT\/X?d
uCMV9j FNNBH5A%mnSA%?*1YknCE4q4^AT#V9=WpSNpGR1\W14NlRXMMLFckt=kLcL@MLS@wj*5ScL8?<X<S1SC
8HV4Cl &n6KZ%Xy9AciAI>IS!?*8^&E9M5BEyTLQ+i?iY$9p8Z\PXKPQlj:X8^E@LqE1P%Kp5N*\kjkkQd>1VQE
=$QXKM B&j<j:<IppKMcbw*R&I8eP/4GNIlI^?$lIldVQ/4nGKWhC4k6B$i#&mHp6SeM&w+X%!:@qha5/mSe/8%
qYpBQE ^bFW%cCh1cIdNcLy>Z/kESbdwm1^6>AT4RK%R/<V!5i:WD$ND:SIE?>VNFEEkDYD$DVS?dK!LBJ6KN#w
y#\ncY #lYV\G/14Be/l\cWb4>bLmFtMe@^\>J8nA^pPJaAZS+%:dC=jP!p8QqaDXKJ$HYth6eKYA4dYd8N^mZR
aHW!R1 \B4Q5EqDbE?1cWV9F#8kDP$9ItltZq8ALaE:nA/EcV>>Wly>5R+WF^$I5duN?:Jn=lNwuwVAQk5B+$8T
JEmdHw >8y6JP#6lej>/9PT:\S%9=A//*jmDC%m#Ww8lkM\$IbkA+wiWMTA&h:a\IciRiYbT%I@JG6aJ$YwTdhd
E!@CCk 8!SRPGIGGM5a/a&TRw9pYXA*$d!t?Nn^6ljnd#Dkh>VKuFcy\YL1DF1n%qiddDtVDykJ=:R$J^*wn5PM
tcb/+# ?Mw&kFeL+8leW5@=l6m%Vl>mKQ6M?BH8JTGhJk#1u+EA$L$k6NQI$htNc>>41IL:nDdCXZq:QVM@9$8m
HCjc55 LGh1:Y%lHkAu/M>eGAwGnMFF!5d$P&^85<#l8S@Fn+L:SM^&8=#hqV*ilBHDKV1++eHn5BPlCGiDhW1D
D?4\X9 Xy46PV&DE#XMb9Wm$XYaE:lcyX*D/pMDp6ujB*+ktq*PM:<$yEQwD8um+m@m/6GMJ!>D+?q4S/1MEG=\
WL=?#! ty%=:iJXHE$ahME=ZFmuXCiub4#WQI:+Ri!q6m8T<E$#>KPd>=GXVuaAi=AY>VC!5i5q$9M@4#9<eKhV
n:%RQd GejyGZy6RwTAmXRduyD*#QPJeQMwcmLwd411A<IddB/HM%jNtpA*dY\4>6VeJXJA6@=q*FhGH&X?pJS!
hF8uM< #9K:HD<jj+=++Dt<p#:$BuRm#Q?yVlLH4EPh%m^S\bBlMQSTJkVAARTc<yMCh5\A+cVWT%KkJ#QY6AeK
L&:Pub 8hE#mWVytb?#bR%&Z>bJBW!FhIwyWtMSNF/BCh1a8cL&8BP#pR#5>&WMpMSiWuN1Dc\P9mPE!?#IDKJX
S$kbKV wRy8A</M^^EDH+:>Lu^L#A:<JNB6kNuBSN*e?IZW$Zpld<^h!lQ#>yR\>h+l^cWWK/SwmNNtl*W@H8qt
HwcWEn NTF+jm=LyMdSR4LIHKHFR=HEA\jZ#kwVbHX+Di=VW$*l+8p:KGe?d$a=q%EE6K5I$H+B$=TIXCG@+Ccn
AS%5I4 lDw:uw!LLiDtKWtq&8b>/bNEuKRA<baN*9:!bawRm\cHDj!Tt<TtkID/%WpP8TVB81lqEBCyRb1$S?tc
*NqNXp i1wCIlTa?BW4?+8MMMA*8>?W>petwpH:$eJPh/SFWSC<T&AAaAR$Z+c1A!!qpB%@41:=e/kiknSA+b>E
dan#nM YkEdTC?5$e6@JR^LEnIly:X&%uwYTjkAkGTm>SlbwE59%tpMnLk#V+a++au6+q=P%>9KtSw=cbcmY/Wp
kRbBST NANwkNT\m$$t^GY:!QtVZn6bT9<VSPL#5Wpj6ptBBbN:1EtVQ5kdYij$yX4ypJEcyCq5A$mhT=:Z+ktJ
VWmH>S #\qhJBeRe=^^@K4LENQKenJ5S5luIFjh4IIIHaBbNdw\iAIV5cDKC6wM>$uhZWmEj5ki$eRcI5mRLlVT
Nie6V5 ZXW+J!q1eyJe@+@Y>Q$CqWEp8>#4?ZGen\++jlpW$$t8q&/Y/LFP^ZM$IJu6N?@LVVYQElEPMw/L*84S
%=E=iV ?W**S?Q:Wbt4FkeF@KbFE6JZ&j>=RR1mDZwj<WNZhb&aGFIuAXYwidRnd5Ie<JC!6/eKqC#KQ6N/6:Rq
E*i%L* =8b#mkEF/wu=NtC@WD9!Ap&=Q%M:uD+SXLjF*!CT4$DkE\SQp^\Mb4mTu4e!q%SZ$9>ctHmB!@lBwPLI
QJ*^5? 5DTyd?$E$L%SjYC!T5XSISFi/<#^Vm&wkABIXm1R?E^CE:PIBKW=%kbmchEkAuAITj!4!LYhK!ZuItkI
Z6=pIA 5mXinE&8dI^+b&LJ5qnJM:&\RBMnJ^t%H!^EP^i#>BuWPG&5?B8Zy=m$t4qc+k/=t&cNpwaE1dA\ATul
=^Q^qa ICyytaXCwyQJWdh*D8b#P>pbqK!d=Gn:MBG/cq>n5hc9pqtc#&@npIA&dJ*=@LKEEDkAMJ:X@Z%Nk*j6
6&diAD :tRwPmRiqJG<#tBCJ!%VCe*KDY4qjL4mASDGW/qPM:5VDT&Hm=M?n&>8$@ZJ?/RqubPCb?b%h9\V>d:L
:8>#h* 4h*h@D9&e:J>i=h+=#p4TbIq>wu!lFRJwZBJu=A=9@9NnS\%F1NYXCFJ44A$5G8SIb/18C@Rchm#dwE@
K48^d= CN^KS88VwuTGEV!G^=Q6&Yl1pGd%T#KQI@me>Q>NJeCMSJQS#9$1PPll8yK!G8b!Bb&euW?Eq:mwLcdF
&?:KpN HKMP//LQjt&@b6A+4y+:>A!KGQA&QGuljCiu<aqFJA*C%TRZt%\tc$!G+:G!$JS*yyeb*G1JBpDacS$W
1XKaTb A^qjc=le^AXGn64m!l%<u</a%GZQuyp<ciAqNX:5DiR64ApM<N*wP<dRYA/hehInd9m5kL8k1hA5E#jJ
>eKt&y kLhaahG#PZ9#ycYcWXa$tJn+<:WLmEleEmG1VMY\$!l6%IFAYw!MH=uSPhm=^658nm=J:FqVqWDHlTej
nDBJd@ bJ/>KQqAyLwMan%>$9l!BN&STK:ulm/p*c!<TA=h6cF$$h?qFmHDkH8AQALBYk^=qBwpZV1c8&C/>w4F
@KAaJ+ C*m!hluIZu@FYhk$j>PZqk5/p+FQBypncXT1&@BCV4k+JjF8JTNXmL\pwdVV#J=PaCaZEm>kE1?+=*Z^
^\ZpbF *&Q/64t6t$hVeh18y$SQWRuB@A1bTJRy6neFB6$MS>#QE*uPFMXJ#$P8YiZTkukm+pt4bkmNFwQ1XY$m
TGyQ#: YX+j86C<1cLB1>!?=HTJ1Hn>Y>mdp>kL8wi^RIh1b$W>putiJ9SLtSGe&dXSa#1K<N/F1P@%A4B1?*C?
l/CE\= jcRcQubyhRWcF&n==Cm+bVwS<w8u@t%N=n!QL*YXq4VPM#Xq@lqQGV6eqDS:4*c4QR&S*\l^BDKH1:4=
hF+*BV Sde9IypQJ%#HDlF/TA4:E&FSZ^LIGX&iPa&bQhpJe>X6L!1JCGWN14p6#:8ek&Meqit^5F6+J\ZXQXZ#
+4e41P <AA>n\kTKN9ltTwD<CZ&1>V$T!1Rm<J1c<\n<\K^=/=q$AMkJHXyJHlaWRGBG@<:aK<nqVKH5\K$wT6y
LIpTA: :@&ASSR?6iVBTXFQJQ%VwB=qE5<p5p+<q1P6T^*e/yDHN/MB6eyKB=AIYwWJQeMyQVwDDluXk?qBt*GS
pVW4pJ uALu8JuT=#u1mqRG+\&^hFjy=m9q=mGjYZ9#mT8mHK*cK@TN9imLEy5p&1=G*y+&SpbTuXLw:EwL$#4^
tq*TjL ^qhnTM:m<ec$^Q*T:M%8H/q#K#qSp\#cl9+68HRh\=AB:^1uJM*kQt%\luTi#punh$FY1JQSieXAP?yw
yNikW* VyXL&Npy#R+DGy$wItXpCch#hQPL:P6yh96Kt>\EpR$=W#Pk1\c/*\TSe&V&WXFSJMXN+&t%e>FM$CT&
wXFwLR hZXQh%YHZEpmGcnF#FlMIkb$!!HPjcnC$R!!I>TWbCR#atlX%HN=h^WZtKZGaCZ/46VRAQRN:a&6+T#w
CE+Rbq V5a1?bap5cFjdnIm%G&u#1ChWmwKMw&\Py/A>^&WdnPl1::9A6hTqbV!6T4@#wPH>n*<5\h&H6\?8FMy
8ySEuI %jDWukM:%>dSy?$$^QPu5Kq@>^E>d9Qni*ae^Vdjh>Zj?QlQij:MN^d<?iS%%:1:+ueq:t1>1>Y:E$jH
u%>She %i#IHD11#>K!a>8lw+@*H#/mjq5>cM:kC>LdY?=bQ6h@aPjNL85Z!m:4d*/C!*4:486*9WZ9d*6*+8n$
<1MTRq Y1>WIKkj%<Q:h89#Ni@i8Y@*ZZF=ZPyB>YDb+@4\w#F<Z9naHuw<>^Ait@I69JAje*%u:nyN@<:ehec:
!qu\ZT $*9pnD/!:^>/=J9?IDh@yy+B@<QQ%QNE:n9$=JEBQCu%Q4ZW?aq@nh+!=8m<%*9wR$4=Q@!wV^@lAV:C
+c*HK< R+j:/S9PEhVLbWjA*kXHCNG&uZ8PHnG*?SAj=9FHHqhHQBi!58\\&L9kMFXQQjZW?pP:D/*jeZC@PXR:
!a<DKM !JbHdFLX#lZN$T61DlZ8I/4ie@DAji1E@qL!Qd>$8@qT>YN:h9RjPNK@M*d$IH$S6Nn*WDt#LD!Ad/Q*
I&DlH\ 4MR5:<qly>ZK5m@h9wDDZD=R>dK4@Ai99\pS1MW1&N?#dZ@@S@d<$8FHN<aPh&?M/c&Qd#6!cQ9n9j$Q
JQdi=n HV#\!e+>hCtB*%F?jXH*j&JQ@%N<Iji1k5Mqu%qA!@ly&n#u1yPZl:cCS:h6*?%b@#?QHQ&pWHKd86%=
>#\^aN ^BZ/hXNK>5ZW$K+6B=<<HKQjj8iiI*6ni+:EDl$?iLS@^%H/Hdb@K4a6htndpTPHBk=9P>K@Qya:mkF:
>#\@i! >l</iQnw6kNHa$eH6l&Nji4kp:GhB&MHDl/NQZX+#>F?Yuu1AP*Cwh#9/w9ecC/!nA:C>P1=^WWi4*4e
m\/Dlh PhJ>?pk@<@nn@d9\wPq&p&Y*?@QtTNldim$Aw5Dkk:+/NWS:6kZ$IV=+cQ8&\@mh%H>RNe+lQpY9$?>^
Q/uNW8 MV9X+=/=+&Hub4/\+Gc?h18dYWSW5Y9Q+j*dnwJF!t/H>6^\P?ie&/G>hD9/C+<e$dj#edPq!:teR\58
1wGBMM =@T6LtiJ?&^n9W>8&:ju/KjMSY*eMdD>p$#Ajc18:Il@c++w=P&R5h@*m?w#XdT6Q@dSV^*ce<CIpu@>
F?5qwd u5T=>qdE8a?J$!Yn&Q+un^!Ndi?QEh*6/>>Gu#<a&#G\:jA&w6jDS&L:Dl:aHh6&aGj5!MDBJ@j6nP$+
q!IY$/ iPDw6n$HakeQ>MePHw:6Q*m+u?n$RQ8&jaeG6t*9Q:yul?jd/<9uAj<Qd5c^95n@BMh?>u?MR^<##Htk
yhl!6m 9*@uEYLJHj&H?dc&:V@+JHHl\X&^\*VVB@jHht+:8w%t#>n8@kQ>l:eSK&+:EP5@5PQ\y\/B%GJ:?#>q
qqt/\% ?HD+j?#*/H$eV=%?lwPj/Ajn+=p?Ti9dD6PX$MR>$B<:58N\j@?BGF*auu&<kicV*aj:n^!JEdQSV:j9
WTSm$p +FPaSPkHVN=>h<9/eqde@LA9:tFFWN4Hj!JY:HFw@=N1pjQ>djV19hZ>4Hnw+L=>NNpSwea&!#N<tJ/l
#JncyF wj<P=/lLQWeNM+jh+1n?8%5MX#5H8M5>kK@&^^$kmEinD@E+D4Gn==NH/bhcyL!@XPFYl:n6wZ%:h8!N
-A&AW9 000065fa185001202b3 Page 83 of binaries1.zip
%e1RBh jciu@=NH@^\$AX:ae?DJ@9MiWXhJRy/iPatu#9@Z^hN%9w?H?#Fjb*=!+9?Qt8L/D^CQE8$jIHp4LL:u
PI11Je q@yn8+m4tR\Q>D>qbNn/YMaSb#8IAVBdHIph&d>6*#=<8Pj88&N:>?\:8Q%VS@8Q^PKQdp#\+YnQ9t&H
iN$*b% h@Qa>>%>#\hm?@6*d>Nn8net%5e?T1V<maQ:u1VVj/eq?ii^AS4a<4:a6p>5&:N9&@b>em&kh*Mb=up/
6C!MhF JBD*#KG+==?>^Z$@W\HF\lEP@ZRM1B418whd:+d//kkH:QWiw$+NK*XHLFB&CNJW%IeYHPKAe\n5LV<E
ua+XVN @aXm9l>:J$h8iTh$YPhP:n?<?>AuiNe*Za%MHcVZ+S?9du8w/eHDP:ejlhKqQ1aY@$RGkh>Hb+k<cu:=
6Te+k6 58NAej5F#*E?>tPQ$&&w\!M$!4l1W#h>Y5HK1e>\WcqW?RnN#J?kceu@4Z>$/hL9thIZ@iRM6u:LA9+S
lVXb\W GZ8Ay8u6tL#:D&$nW+Ky?$qZn@9j*%N?*H/4p@&#n$I6BFei*dcZbEZ@J$lP:a96y+pJuMdV%Q=D?@1Q
XDElTP Cn66$#^y4w\*PT5pAGNHIE=&H6:#mj+FptSV>\&T=CM@pTS=lPiyVj8Q*9AaH::Fub&5&*RRGl$p!Z$<
H*8/Q+ Rj^aEdLnj%cE:QkuIEJ<wZ>$Pp:@D>H^TGZ&<PGDl=9$RRd+qtpVHYV6V$/j!a?/E:lM<#6apaS^R>^A
apy?mM 15$&Nw#/h&!D&6Q!99Wi9ki*?%^h&MQ6!m>VB:>>:^>h%F:*QLF:@kGmqi!J*cRtQ4tQLbEnVVGcCpm8
\/p^G8 pYw*mCuA*P&&56ul1aE>P\bmWPE\Sdnmn>mSJjHP@mN:n^+<6J+Q>6RiE4y/K8FSSEXHnpIN=:G:>8\n
!Ypdu> 4n@T9?QJ\@*:QmX!iMeP/IwpTQjLXbCaJRXkD*cVCpqY*GHD/4+q:*ujtX9h>*@@/MHap@5Q5P:<Ka@^
#tK/^m &$aV!ddh5V%HebYR=B<qp&MAp</PkaMH/ij?VucRhMW@n?$/VHwmBu#pWQ?PQVS@hjejiJI$lIQt/4%H
b!L:V< nY*dVdy/G?p4NLF>mw#nJ?p=6P>k%9KwC@\5QPjC48>$<#Z1EihBnQ9*+!H6PXD&%Y&HD6Hl?Ee$5?Di
N=y4y@ >&Tmj*G4S*PQb9tH!YJmqme1w=M>hjD\Z1nIV?$=PuCD98XXKFhnbk9>Kd*?VE>$>>A4Sc>:>XpkEH<q
YwTSn$ eNqD+$<FN>G6X@h+nkluRE*=#c5Q$^Y&+!8%tb$:a/:Niy+>MR<NdD5ARdFk<?b?6qRYdJdnBH8j*HNW
wIT6=h #ANM!AF%LHA=?Bl>Z1Mm>F/q4:CcZw9wXaNVc@dD*^*$Ywjd8hZ6l4@p8i$DjHS>&@b<ML6##>Hk^<nw
kPt#F> kMhC4mu\$JNH%e@S6V%$<NCu%EQ$m>GqH?$u<%6XQETKMC6J$a@$\&cJbjd6A/HLN/5jQ>!@1@<\YZ9>
kC!5@! S<+4=d&4K*#i*\6eee>8@j@1wc?k+&\\A+kV!AJ@6Q>VS>:4b=Eb<^@jh*da\^=*q4HHuq8^^<>AQNAh
Yq8M&X :AG4Eh<@*P@a%uRZ$G8$wDnMh:lV?BpQcchl#F=HuI<9aM!PY$t*&>@#4Ec#@l9QLc*>!aZAYhHImN#k
pNha>I S#A#!kDQ6YVG:+C4c9iVSkMp^i$>L$SMJHMEiAXJeSRlIuMH:K>>S\/!LPB=ew?YCAijPpC&Hb*?/K$i
@JjT<i 4@MEn?:i@pq>w$9LdnV*+$&IG@=?1>^l@\HYG#IQQ?yd9iDuCh:1Kcy!E!C<N:^Zakm?:>d:j6Q*6q4?
&Y1WFE \a&=dlNa<H**peMuD\*<&?&DQ9Fia>PZ%Q*t++%L@+9@JQ/9tqGB?=Z9>?hWaI+t1!LbV=aK%d=Ap/T@
ApWu\6 =wQ9<Q=h!uiC>q?W@T@R@81Q$@=K:F<:w+J@586Vj@V69Iy<P**/uj8@@+$:>:>t1i41k@j9@@KQcn@%
<*&:RE ^p6u994JPV*8#B@\8N%uju*Zt/>?+^M9aN!?Zc@??4&%9@TBkd@/^5jN8QRj:MP+Zh@@>X$9j@pd8@T+
9m*9!J q*?>e6HQ#i#+9n689+#:=i@Q$:k@+uG%F*ueqn@a>j$@$8M8:Hyb^u*<?=?qed?LecZ1KI@:1*9*jj>*
!84#uT >dlhB%:?k\@T8I8:jyG8V</Lec@?+d$a=%#jl?:>F>@A8Lu:D>H>j9t48#:P+?:j>@&@1@:!#P/Z9$4n
=@a+y& q5\RGhqpn4>LV?^H!qh@dFdX9K*Wc:K8cteY@lLX*%PXRjWFp4bLy>Z19KwM9cBWLQSCZwZ>aiWQ$ZS*
9L95KL dI/G?JypTFPiKNlT9tBMn\l@Zw<+<qd+>a><eX4F<!wcnB=?cY%\*iELDd>41ck@M9/X88Whud<*eclA
I=p^#* A$<&=bj9@KkMDJ$?FS>>=8Ky61?Qa&A$@t#hdhq@N>E&nIH=y9C:n*^ZH#H<T@E%\Zkl@6XlH6m!81+?
jmI$cV *Z#1<5hyaQNRW&Vy\$9N\JF+W#D?tjnZ*aHb=yF\HRcidI4e<@BH#eC9^EiQ^$jm#<4A%Y9CZ?l8uwnn
4uHDk8 %C6@5Tu<*ajwb8:pkaN4%+dGD<i@kwGBK@@%>qB>19u*^k>N154L:N@FI9kD>/E8y?eS?Na!%cR?V=<?
j@4ykS 1aJ%^@*HZ8jN@8ckT9Jt5kJq<&%#>CSdj8*uEw%@$WG*E>4a5jSQn^@?X%>:R@c5?hnP^Pw9b#?QQhqq
TD=<<T h^hH99/C:Aq</&MQ6>#=lZRh>6#@&*ZHC@@qtQ=PpQc5@pKY>#^Mi#:#NZjQ#49YjKEdi^=?LH9*<bG9
WY4^YQ $=/:bM@QNh*?b!u5?iR>D?MKn5$4>iq==Z<\et^G%W+Vp$+16Y6i?X=aPR%c\Hy$^=**9$#MN@tj9:y9
qGq/$> X6Z>JY%+@//Zme9G9@?NV=kNH\e:@eu*9:HL5?GQhu&dN>C=K=yIQq<Q#^J91/?FlqY\wMj<:1/L#ymp
^>Ny55 <99CGFP9nkW:ie!8>?>/qR+5a>dTQTRcD9?^:<LWR@?T:mHY<G?CZi8!hA@SV>>Jp<JZh^GL$Dk<leV1
mT%RPX W:H@G8@?4T$a6@4e<c:&b^?W=>P!?yhm!e5u:@w#*nQ/#Emm&hp#Ew9GV#d*!y:nWYjQZc8@$lVhE&uG
GY6&E& h?1^b<<c9ciyaVD&%4?=eli?W>M\in\!%pJQ&!GV&4>WEX?aVh#4\T@P1J1@yH85m%nKQ^\<Q1NYZFbB
b$#&a@ Z*n\V9<eDY6/hei9@h^4\#@//^t%@LIK?Jb&%e@T=8&JL&:y4#8=qL/>eqJXjQF5@dyjjKFAP*:#!ww@
IwNTP& !%=@/%%*^@6Ga6m^PLG$Qp6t9h:^>dN*49:5c:^n#>LidN$RD4XmWkY@j4b8>Yhw89FFuq@!lahjP@dG
DqR$$C Z<!wK9yCbq$hQauZue?@?ML4N<\yX%Sq*ij4/Ldt@y=ZXl:D!9G@X#XZXHny4@:Lnk??h9#plVhW:SWX
VN=KjB Yj4FLhq5*h^I&:FJZq@<^j45@T><99i!b@*l&QDt8F/9@&J96468iQYAZ1@:%T>$*QQc<cbSY1@<Y=1:
^cGcL& Z8jFk/@@W=F%@/9<J*&p4hBYeHTFiu?yYyXItKlP@jJ1E:jRSbSHGXFjGm4ZRqVb<eI$Nq!tBD*!<wVm
YbY1$K 4B8hIPLD?<YL!w@qq:?5Aqn8&1YCYL:@@cyCc%KXGEYjRqnT?DCYND/CJa&Qapun1@lwbPdkcDS?Ebc$
C9=!CG yRbLGq?LJa&9\=LG%@Nb!SnBYYu<Em^y@FI5ce<!LGu<em^y@A1?PnIheHW$@na5cj#6YNL+P:CpER%a
?KCWjJ $9lG9k8q:m#^Qc6XYNL+GJa$9kqLG4<cT^y=q>adt*G*>LpFT^1@Bp5c9^bLGl@Hp5au?KtRlatuRy>c
bNJQa1 L@Kjc5M:nY@Hp5c9^=LGd?C>yEFkL+%Qapqd*weqnZ<@qnV?Hm^yjI1Qw6T>PA1N@\CYNQ/DYNKiDm^y
VH=T\E @H%a$9mj+dPSAac#$jk$qnV?R%nT?Ai\yBEQapunM*^XTt*EXhH+l:Cp%<Na$9k5qnS?E=a$<lG?i1I9
n:?epn ZD&N#&FJ&:1\yQGQapunH<PT^uj#ZT4Xk:8pV^@Gp5a@nmYN:<YT^t@Gp5b@lJ?GWl@F$/D^H<PT69S>
Bj19An tj@W#?Kh^9<eqnS?C&>X/8i^qed@M!^y@D@Hp9b5^bLGQ+Eqnj<F@4bTH<i*cj\&LGu<hm^y@A+5ceSP
tR?4jD LGq<Q=?FHkHPR8N*a$unB:Cp%^+5cj\kqnS!L%?NW96\NVS?Q=a$@kCY6P<kqnV?EJa$@lj=15uR^XZV
:5%m/E y!Na$9mnYNL+J:Gp<b@Ap5a@^Ziu%Ch^h#V?W%nTqq@Cp5d@j:Cp<b@Gp5d@C*+KT9$!ukKNj^yLGu<M
XNJaI! T>w#6I9@%Gj\V8M@!&5pVLBG+#?HJa$@kTYNj\bLGnGMJa$@!h>TckVjw9Gu5KV^y:Gp<Yi\yNj@lmYN
9&hW*A @BW?8qKj^>Fy@Bi\yQH@P=a$@qi^yDFj^JLG@^yjlXL@EqhBu@+QLGu<q>:QuKL+%/Q^Z<GT^9</Z/%T
\%6^9P @\yZT?Q@V!^y!%i^yQG@kTYN@^1YNQ+*?c/W?n48m5d@c!^y@G>lTZ6?G$5c@!!YNQ+=9u8qSuH*NH+M
#j6DE^ T^y@Fp5c@&?\yBHu*5>@/uq?X?y*<E:n@!&YNQ=*5cV^9+eqnj>>LPu%DS/6%L@VN8!@^=LG@\GYNQ+@
HpPYlL aEun9+pqnj&QPkZ1@<JS/hMjapun@^PYNQ+@a$un@\8YNQ/Q?P^p4iD5NQ/Q5cR6@^XLG9<uYNL+d&FJ
j^M^9^ +%@p1%V1&:lKG9<TqnS?HE9ce^=LGn?BJa&@\HhDJ<Hh$QmZ5cV^q:Cp<c>kTTQ?FE5c@&h<%$y>S!h#
5B:Lp@ @VtYNJ/qGa*@9:Gp<Z?BJa*<d#@<IV?j::*/Km?@@+h@!M8@QH8Yq*<%QM#L@@+W8=@W1^?VGPFjQ<^S
k\+1%m IjYD%c6=?Xy>9Wpi=CPTT5NH@D8q?Il@4^Rj<ZYq?Il9KMXHJA&hn$kYCS@^mqJ<^Ctq?IlZeXA/+nW?
p8jEc# ?c91VT#ymH#XhMRjaWqH9I+qHbE#TPtIuJlIS*\HT#4m8=#MX1?tj<l@c8bX@qP#j<l@c8+5@/u<MQ?y
FN?4cL \qQ<y?a@^u?1?DD@KY5%@!t:u9?W%!6T:5EID!u<i@/uu@=Z@hR=1wK6R<Xm**WX#9iy94^TM#N=a9Fm
:<\DFC Zp%jXj/b@P^4mnc&@kX98e=dmABum<w@t<@d!6?Z:@5ln6R#ym4uTudSK5&@ScyiWSXLc5/i=YPXjHd4
=:PwbH NjyCKj<cZL9=$q@\68t*iN9d!ui8YKV#q$1#aPkmH?>9#/4+6G&STX556c4bX5Y9%u^?l5aWXi95>FAy
T%6#m5 Q+N6M:QVj/#8yY&16ZSP1YpMtb/qac&#?EIjjdPWN%>6db*BF9yPQn>NH&%XMWPjqI4P#tD5nFYcuj+i
d$*V4V /by$PD4BNI*4W>N>?Vqd4cC9#NGS#LZM+IC6JY9YWujpT^d6KFqF*6\1=<Fl/X&%&11/NV<*M/59V6t6
n@R?%V 99\MVb6@e=ciZ+ti+w4Y$lD8C1><1Ynd$+1j+K^hC8W6C=hC>?mnQY4%WGqt&4c6$6\MjWjSVny*!iJ:
l^&e@N uC6bq6&1m4aXwu&$9Xm!4Rn6wK8$:SuT!M>bXwq?6yKc@b/K++S$R:Q+@4SqF$9#hL^T5WSj$NiCA=bc
CBZFtb m#ah9#=jK6DFYjSL6jJYuIaP!G9LcJZHqySet!ychttPd9G9/Sd#JZyEVZR+jhVY9C4RV!$$Rn9y%c45
Ltq*ab w6J*iB>6KySteG8$%pw@A6%MZ&tP:uDcQ1j\ApteK$*u/W4yT1dyTDS+yqRk\4Puy@uAj/HY$Y?Ty>&#
BqYX$5 JZ88FcikF#%6qZj9#/LS^Vu/XMSQPFhT^RJ>uMqQ+*jGTc\T4!*DmYk5QVl#bcZ=&Yt/9?@h:Q:wkbZh
-A9NC4 00017f85bab001202b3 Page 84 of binaries1.zip
PWt#hG *#Ri<y#*@wy$Tn4aZKtQjquRnaWliTbW?lL>^^j^ZZ#Ewi$mjaebT?u:5$144Du/*R9<FSAA^5?/h+jd
KT&eqW <8q:t!uNq94w+@TRXiJ:+!>ldau?Ay?Y4/wIa5Ph^ijw+K$#iHei&N^R&c*SD%$kk%VjYyC?YmTPIKQQ
dhheSy G1JjhLa$bM?8t4u%uXu&4K?%:M:+w8<!Z:uyuhFYbZ+*SZR?R^?JZ@9ei<Ncqjji4Fp@9bMY<>@H%F4m
mi8wtY p#+m%Bp/Qj*a8AwmKQjG=1cJ+1\l*NkD>EY/ZnBtjywtRXWAjT8ct8cK4dkt?kV&LhJ8!%ciP!MCcmZ1
Ge6*GE mny*Np$#C>>dM>>dum>&yyZ*=e&X+F8aDakq?icG/NKK@P&<i*NaY!\$&qw1tW9n8@9itQK%$1$%Yc*$
W%t^n8 ZbwA<GCI1@9$#dZm>%e&EVhQ#eF#$&4/uF&1wH8cKht&T5\S>X4V8MJY@wSHX/Jd>6^bK&&kmTd1VFtq
?NC^JY YZ%utNCJH8d6$8%$\Hu/Ql%HZ\c?Sae:S?><b*%+cylpmATG#J%l4ayY/h\&$TI8LVAuh@d!1L1Ly8L<
\+*aEk uHYPJ@hYute^F>N@VQa$1&NG6PuG4Fp%R%hDa5JT96qYT+YtMYiVZLC^d15/PliEBL/D:&Id#de1+wmc
1QR/wK &j?GpZRR?yJFkk?H11KlY4T$<lj$$i?k!S$!y=ZqEi?iXj1cXJlH#<:RdK\1Y*GN4dN$P$%jy:&ZXaAt
\lCIdd P*ypZ%G?attKyDJJyKFTwXA1p9:iPK\CjWYc>4B:1Kl*V>MpXbn?k=>e!nhn?i>WKX?k<>8qcR5*CyJZ
CMbiV! yY9E5:Mp#YqW:*@C<=?>SuhWuMZMN@R&hQ5Td4H+Fq$i*Y!+qeVD$LVK=$qLyYqBDl1p%!^p*<JD:mKd
MWA!P4 w9SZ1wJ?Y1LQh^aenl:&nEZThZ/w:HnX>KPZ#4Y&Yqaj$aZFZ:thnnBpR>wW:HN>idwEDFHtQN@>V$!H
D6#1k> h&AQWbp>y+d!N4&*um6b4c%DwL\mL5>Y6aY<t1iyjM/&md:u#=WYu?QFPZN<jQ+LQ8eTPua4VpNKnJw4
TA8nLW pL=^#1J4L6F<F=5tMVKQiYCc^YWj!StcGC&cVwb\ZhQu14Aatm@N+WR9<F*SXDBZuB+ct5qd4Z^Z^h6B
FT4T\8 *>QVNL@aM>Q=e>M#QMT=1@<dh&WZ:?^V&DhEy!!CZ@BPQDXEk+y#$@NEt$9w:m#m4BLyMBahn/cq%8pq
l^ywaW 54Bc>Tu+<*>#:w\PRWeqScQaq!@TBEb*Sn@J9G4M$*St+#JccX:B%DcH5TW=?%\XZ?ARChuy%mHeq\?Z
M+TQ<K YEqDTj@lb&#N%yYk>^S5*Ac&/^FqQ=a>G=lSWCC4=9LueM6RKiuTKttS6+hc?hic4aX\X1^%YHpedRpj
9hjF&# BMPhE^Su=caCPAByYpT*yDFMF!Gd#E&XcLbbZIIPPFTTK?ILw?GBElFP1SnB=Tq%#m1RZqdbN<N:4hpK
uMW$*V #&&SVpmVWmF98diFAic89mepmDPX#yZ!aiiidBYi\ViIe955y5ERN6MlTDaGb<48!n*?nZjXc9WNKii8
tVi5NX <kXL4T^P!:*pLSJ<N>:Z4A&JS/MDSJ5#*/Iyn$SEH*=N?k$>N$bptMiE/>!anDB*>yj8uc$p*ZQi*BqG
l+Z+WE YdREH?dq#t1JqjGa4bqy8R*u#6\VtD6#mBBVNppZVaR6MmYe$:hVlN#^*y4RIdEVZ!H^D=&1qi/NYJ\p
T:R5nj GVQ<ku5nqj:e8V=#d#LC*N69i8+6Z:LyN8VibnCKqmRL#>G$d=WC^Yu?KWq*HqJqh?aiHuhtqc1Lb6=R
FL%&kk 1w@pcbDuDW5%$#cbPuE9hPAli<b#Z$N!?XX!hhD+T$NueItLMHZ:<pN@KuN=#bD/><w@d<@w>WXa>:ZP
%<8C#Z 9QKVCIJH@#%8=S^dF^Z<YEpD<yZ/IA*!KwDHb1u@m<d+#4Y?T=6+44bp41c*A5k1V>@mk&*/>@!dq+b<
5L4u>9 tLqL?ZjypDTj<JFK?pka+M6dQ:#XeV+4^%pKTl>mjRMZX8SJhcmwTQei+1jE<@NRcYnYPpiYT6R#Z:@I
&bBj/t Q@W!wlZiqmjNI#@d%$jpcR?b$!/ql$w$Rn<A*:h<uQiVKDmPm#nPF#G:#GIT\+VHV+jtwypbVNjLTM65
cZ<lYB XYc?dm*y8dZKP:q?t!?nqF<mG+qAqR$P6X8um*\bbGM66Yh^wHq>A9*SN#9#YX#FEF>FebqLF916kDY?
XXlGNp C4wYM:&1plK!1@LPl5=X/EHY#B#pK*dKd=C*b=hC=NA%FjpE=mQ@G4?MT=nu&hJ#@4^#jyyh#V#wu6<:
h5@B$R d<u=q=&d$+MKijC\=@!apIl=TP$Q6e4=/cP@Xb@@X&=/j59=FSTMMJqN*QN:b=h9M#W6y/9Xw%ylRH6@
V?8&S! Bp$NyMDPF?RM?8M+P#u?qJlmVkZB9ut/wM@LBhYZZ^DyEHPmWhV*tTtG=nF>Qh+=+h9EV58L4YcM59m*
bQ5P*p yK51y<$=u4@+<Q4n8DlP91Q<:Eiy!LPCVFi$@Vjy=@$:ay=^pk8P&/PQ>GKX/6QiDd!tb&un#DV:Icah
<IFG/y :$h?tn$u+1hkh\jS514C>/Ej$:L%D=Zc/b/DLd6%eD6+jAVu6PFPyE<K6$&t@#uH>Le6j?pe8!:EW$B#
S1Wkk\ yy<5*l1qD<BjKdZ?J#uLnPe5GVaN&XKHBb+jtudPWmVLG>c?c+C#ha:>n4&P=%Pn>AFt/aywM=*qF+de
Jdu=Km M%T#<Y%5Tp9h:b\kd\\e^\yYn9*8Nby4nE&K4<#ieIJtNwEhw*XtS6*5DNd5T8<J!m#Zt=#k+*KCVS=V
^/EqF/ %FmP=$w#5Q/55lM+>1A!=1^nQp=Q!#QmA:lu?LX9Gnu\L8d19AwTFhw5u/dXj!TdA#N4K/u/5/\aGDF!
:QNltL ZjqLTHeWP^JtH:LHcP!!PVWD/:H55tDM*VbuLk8G1Ld>aEAYEbTkA+VuqH6b9@yNI%V+55l?tdFB6Z$F
qmQ55J e&EYWZiiiI4&989KI*Nh&k^p&+*i!jm4JVN6G4\^w$$@Y#Xwt$\=S8TMa:>lj^ZdqjkG9immVu=V4VBC
ZE??WF KR<:R5RP!!WLtkn<jnNka^kE6LNaTbyduu/<GqnD&tRw$Pj#!nhu\de&LRiml#9W!mJN=yaX4CtTJNQm
wbma<+ $LE^TD/#\Hntt/TVmYS1=VuTK+<5hS8hG*#QKl4G#M+Sk?K*6&yI*jJw?jb=&n!Qm<hS=EjYB+FeZGEb
lRRBa= MdDAKQDqm*\lJ@lCYDmJ5QCKyKK1uy+4pD%Gp+9F/tu+uH=<NKqXq!utel&5S8in5%wLXdA>ISqZ!BX+
aKi#LI *tW?X9Td<*WM<*Y\pJL4<IwtWn:/!PSaSGcaQXRaKwCE=8hJSZP9^KNK$+<#T#@P+9!eHGuB^e!4ydi<
YTTwTE E9qyYF#JR@WKKSIdM*ki</VNVM@I\#%uiT@Ew@mP1^XM=jc$>>hbeCH\w=V4!icu?h\*Sd@1M?V1qW/Y
GWIDdi 1kGnD<E6a\%Bi!?YKn!@nEhQye5k!eF/4THYG!/DDq&84wNWy#>d4wZik?X@=a9!#%9V<&TjEAG@I*+B
npl<18 PnbJ9dtC<yPNHaKhVRK^qYV\i9pYjAu$yRJ$CFZ/G/aW@+\>M/>I^nl1Jw%@ZMc*qVBeCVj&&bdYMdZ?
:=Fmed S=4HpQaX5EeBmyP6wpXM!YTWYHcj#:K6Qy>6$SE*!^EDyjpTYek6#FR#n5KwXdqbYHVcTwe%d/uc@BDN
<e9DXp &1RJ#wM@TJWJ$T8Qd*1QciW6Y#WJk?DPqEe^W@K5^b^pM:pYJ9ERZRA6tKbkW$J4^y$jk5XRQ&RCH#PY
CWTJXZ @1W5<*CLiES9$YtZk\GGmEcH<pPi$>JV1Yp6Q!$5tFK?KPynaH4BGR@knFG!V%WBDy8?IXH^myd#<%!X
5&F9M* u+JWkDqN<ib5nl:tuw*6V#qjGHcl6jB<V@Mh$y^PV>&iWWN#4WQKuM>Ym+8#eAVS+&F4nZ@awmc+iK9X
uc/bNC KySPCw&e*&li:9ubS6VuJ=K*Ie8G\9TC!XKc?RPqQnCp91H1eCPKunNju=^@ljt^+e&bbZ/hbnwwC8*j
k*wEip !%<5#NFp$FipG*C?YKN@Wdc@b@NmWLPut:@*Q9:iZIGPNR*8eL/Hm<SDD8NL>GQny!w/jQaNamP+HW6F
!4VmC^ mNYF*/utK=!&?9mB8&j/jRXNJyw*#&VBh?T^<pM1@5?HIF8G%B?J:5FY+:!+H*p8ID9Wty6^jJl@bHTB
CJeZ\8 Pe<a6nBuLV&1G/QYc8He1m>TDEbu$lIHwi5T4J+tGW%C5nmNPcJ!SlWlbae=1IuD^dYAuVX?N=cL#qT5
k+V9LW @ZLmmcQn=c86ISl5SECaIT4%@MDHi\#Hm&w=KR/9qhw@apTMau?a8MD1EK9Dn&14RwGFb&XitMc>81mY
Ld9SD$ h8Iu8u%t\iHPue9uHihVHj6tEFL6w=<hVH@n<iJcbupeQEwVM8=YHEAiq\>Ny!wMJadb?5dnaW^#Z<u4
*pqZ?F XFFMR9JnmNNF8%up%/CH4Yl?aIFWPiR=Z5&RGmF/^q^9ZCGu!Dm!TJAdX<ky=b8i#j<$99@VV#@>>L@/
!w!>C# y^LZCNcYAjqJucb<8L=k@bWF/>ZZ!>jXK\9&Z:^i6m/uwQWj&bIH>8wQiL*t%Xhjp^T#X*n>#d??hpt?
^^N+eW I89Yn?#cY/&@iit%G4JIT/Z45q:#ku4N8>?e#%q*@u:C>RZj4*qlWhu^4/tLbhh:9j4mK&Z4F!@?wG#<
R*VZXi ^bj@88^/L::/n*8>6%=jmN*wFPe6?C5HBbqi?Fe?+Cd:=$1**1?<A&/&*#9kJ98ub&deAVi:Q8>h<H+P
c$+k1p n#6@ij^=>%9F?jtCP&AYj=:>6N8!<uPY>!Vi@cX=HH?&hP9>M??=*!I:t6R5m!>hL4>5Q#S:*9$i*%>+
!hR5dC j#j89@H9H*j@n#p@1WSpK:*uj6=N88S:Qn@iQjji#=h*=>@:?jL8\m&i4>:>V@d=@5@5j/<@W?G:mk!l
>$GVl% PqXJ4\y/Ba@S/$F/^iyW/H4hhXXZH%b%m*jT/%*>&9tn#&Md>6Wy#<8MDZyj:#FY9%dSXIn#4!L%hJWW
B/:RFn lB!n%\9$ip*&@d@@Ay:S$>ej@PCDdR@i@%n\miAV@?/^+IQB^+Kdk=9=$+QBy+6QZ*>/n6:j<^<h+%m6
TichGm j1w<:hJliXp5/ZW5cYj%K/1&F8jE$4=?9jTKdMi/u1mhhSc#YL:<H8Q$$9p=jYY@hnq%/A*8?k^9<P:Z
*D*Iat //YTukSq9YSdJbimcN$1$l8Ntm$jd@cZW?CN??EcL%8j#j@Dnqi?9yCm@YW$L+1M88+Im\Z4^i9q/>hj
q*>n*J YdA8tw/:L9Kh%/Nu#!y>Cq=@@whVZ%9$/19P?8?wtuQXF!?Y4SMBtQYwQjX9C!?+/:W9ZH#=S=:%/A?u
BR9>%6 !6b95X@8%hqQ/lj>9eLd5H:>w9=:=TLYbVj@FZE>%#%cA9bjj?EF5@<HYLhihj=+@Zy%hhu?/!<Mq/$Z
81/P#u 1>?@aQ@F<9*8<jl/QYyJ$jN<DJDIV:L8JaL4BnhIc==q!5#%q%@%jJeW&%LyB>:%H?C@X*q^%\Q9j@?D
bTuaHA *9*9^:1:Q@D?l^>?WA+l/@e+l!^dN>iw%&5XH8aQeHViWI8H>jKQeQkHij&HW&h=*a\*?>YD1t!@8RNu
?8=$GG 9@NAbL@#1:<m?^&m8GlBG@eR^T8+Que*W:BuN?91*wjIJPdTDB*?89LR#K6kmaZ:QVRp/!+N<d1Hl9V?
YWdRk4 m:e<jt*yy446njB&N\P=eH:4%pK?<J+DcH:C**5PKLFGYe1@>\F+@\*j@^:?>4#u>:@u:L@y>:EQj?XZ
w!a1Si +h&@y@\mC4jej+N/WL+jG&jwd^dcq9jm#Q/b/Suw#uN#?jtT8Z4QAW4F?cJqYi:?lehj?H&NLQQi*%@\
F@jKGZ mG@<@w%/V>u*T*\@u4@b$l#?>Q+dhtNA*4Ejd4IdA<##8?q8DFBK9jh8M?AYyP1IR44jtbuYtXd?t&&h
-AE$SK 000975a5c4a001202b3 Page 85 of binaries1.zip
?X&Y%: %Z>!ejRn!d<d@kw@=99P@tt?uqd>N*9D@4@:8%6@@*9j8@Z*>R*j@Q5*ZulB@?pjy@SnhN9ki/9A@/8c
RKC>RN 8Bd?dt4m!8:CQDnpJmc8*n>Qd$X4>kaVh?H?t=5aqk%L&Lbq\I*:djAj<a:>H956<C>+/<h<9@RQ?d:u
#$$9lQ X:*b>:%eb56j!dQ@SmceLhGnMj69^1P#Jij=qN/DQe**d<=niZj@VZt$WQd>G*t\jQ?NQFm?@$aiLN>@
>m*Zbq I\>/>6?WB#*Q>?d5N@6Q^<V%AWVlGGtEL>D4c@V/QL&G/ZZe4#=6?=Z6>/69!<6ZwqiAZ8<+!>yT\F>H
M*dF*P &&M1/H>R?j*HqA@aDL#E/:S?tjYuT#mieq=$dl9uy>eL>H1NZ6jyNWi9w6=*!^jyNVdb1QaD>H1cZ1Wj
X=CIw> <*4/J5eRBK>Q$\5jpWd^Eu%?Tju!L/pA9WJ#ITZ@c8&R19P6i1E8WH65%b@R=+Bj4jwVM6MDhJ\@CTyj
4S9m?% IK#WENu69^^VKpaKcN$^Bi!J$l!Y=uXc9<#/$/#9@1VuZ%XcSha@ud?E#*S??5K1EwA\R9TCu1ij^&5+
GSl*:$ L5:>+%=Qc^6@XdG8y1/1:tDhF?4#>de><Q*MdWQ=a@Xj1#>YZ*1L:41$14mKu4Z=>$DycR<laR94*K@=
aWe<h5 4nj?:9%*^$1HQl6:S:&#/4P^$wQBpu*M@#Z@MV<>c*h@KWd5\<ey$t?n@<FQwG:lKKm>#w+CSWacDQ^c
<^mnjW >lVVWq&mJd=F!%w+tYq=Zeu?/!?@@DJy<K>e9=<6mXhahciqbwGdPR1P5SQ?V*u:I6+TiQ?m/#?Rwt:%
Ni\@6Z A+G+L9&\XA4Rc4Gc:AXc@=$jmy*BT#+YLZG!q?q*EbNV&\W9Z:?8FZP?JqLa4&9F*dZSjDhVN*<!d+Z&
qpCqiQ +bq%hlDPPmyS!iQjK<u8&jqT&YTq%&X8h@cZKa^au#a#e\FncQ%:QE6mjyS%tZchhe@jV?c6eJH%cFL%
4BBa:b CyCCS:mVBp*41qB!:REbw6j=*TdBDMtt>F+IR5ll5^?CW>dX\uWSuQRu/+:A!@Q^QQJQ^KFH!mGSdNwn
w:#W=! 9RyaN<>I6Dn*Giu%G?bu@%/@kQ:F%PmNwH?$eTHwH&*/EtNX<5edq@+4?F@4X\?<MK51c9@pBdZ1lcJc
u<E9<# +qe9*F%W16KmdbP9<ddqm\QAKTZPj91%B&^XP*thN/>eGwRHaXZyYGu8kbLiHJ1%cReRjGnHH=iKD=TP
Qm$wum !YF<H<APAMjSn4@D#QSC:h@luL+H5CP&/6mD6GMT**ml>nYFHc&<+?NQ&&4XT=N#4#*\K*@!w<u4V/>/
Z:T\6d =Y@Y&Y4FpkiQ%hXn^*Z%\K?<XJy<1@RdQ*nBw8$bFc=T1%:=$h?XH9mNX:B>qY\j1k*V?BK&q&n:P?@R
KtTVuZ lX6$d=>bjJ#Gq%:B>6?k:ZQ\5>Lt%R@ZP=6@Bai^ijPHH5dw$QZTA@a1dQ+N&d#&Y@Y+?#u:kYP4Z1G4
PXtHc5 @A$/!Iwqu&uG/BhChL9Hc8qcX9$A=/V6T+>niID8F69jwY5@J6hanjE?i1Bt8:punKhJ<IFnwXuc981X
mhtG=j %!^?B4j@G%XLV@Ha1tPB!bhiK@L&WAAQ:W$5/cqmmej?y14$$?>!nSd$8&FB9!wY>IQ#+wEZ4ttmIH14
Ynmc\w 8/@8QwhYdk:/bKnJR*D1T<jKKi*HAV6%:/n@KdDVV+Ghjk45>FNky=<CP@$W&Ptu\E:@j\#5=NXP%\cH
5AMKbL %QeX9<XR89ReKjLFw81#XdB\4qTeK/wb&XK+1ndtAZm9KtjXLAy//Nbu=tdX>L81wuY8WJl6uhMd/J/K
5l>&Yk ^XKkkC?Y%J!FR^SSCuXXjYTi\\b#5*+/AD&4\t#Jd^YtWRFR5Pj^iYdi&V46HMeC^wh:HEA=&LPX4dP6
8/AHlY ctb&=5NFLkCcytMYT9VeC>MwyT51*=\>W@INIhhWN5*e+ukF8%TJT4hC1hB6<jHiu9WXT9V#Fh/q:</R
^AyBRB V6d*Dk=mt!&#:*YZM!1KM1&?pnXnYaYe#Wi:n1MSESViKRZwDtjjKmuL=qW%L$imT/BudyZP!VQuR$&4
18>pFh CJ^@yeL<8YLl=$6<yHp!Dk5+&uW?5><8um6kKmm?Zc1a:=9&dC!1C1=tt5jB*%W&IDJtmk5P*X4KF\6Q
E:@1?j RmFW^Xu<9H:/ih<y!ZEA@W&uK>GDDShc%i!=$u\jn8D8R8ppMHD<^btCQA&?FT+tLycCSd1kIk?i6w8q
:bp#tZ SVcQd1Wjb*/t$Nj9S\uKLG+1Q/6KSBS16nVnHH%/98TdShmDnqcc#u8*B+kAdXSM#u9PmeibL\W5Z9WV
@TIJ#Y ^hJZ?>=XH<hb4Ft/9%p<6WIlWKLuyW>#duc8TKhyHTLct/aBJdy:h:8@XSZjNTeIFllB1SVI/^Qkn6VR
pHEppP P?1j</PnN*9YK6p+^*\lTD>SkW@!DyG!jkVt?L^y=l*9kahKXmp$%#hpC<*:muRS9uQV:/lhQu*^>t\F
Ymy#S$ pEJt#Ste8/Cn>ZqQMK$*MSpW=8eZumbRtJ5BPiM$=&\LNQ&&?nmjyldQmK/eCRQtehF#I?<!+SdMk!1=
ZDl61S t?nejR+#/DQq/jKCSj1=m#Q$K:!qh1lTeSbJ@/n>t=Ynit/CGNXCSiLejKtmRK\<T?eJuQQ5\NFu=X!i
%m?=wH **5I9@e$u&Q/LZYAd\IqdH=/XBm=+BdwY?hwAPcGcby6kwWbNWjLRL=5u#:J6FX?4tu@dAE$Me8uK:/q
b9PTXe 68PYR9#I/L>h8PGt#NV!XmqwVi6%8kemch<=1?^*tdZ\BIjwF!9I#+<J19C&ipLjpVWdLeqEMF8++bdw
<yDX$F HL:ye&@Vlhn8TScTq:>p+?Lu=QB>^By#:/l6@qJ41#\^IB%XFQCdL:!DcS\h<?ie=h:VWIEw$98DV=jA
BW>BhI G8eM:?E5>5!:c45QD<qZKlB9kHkL1w\=eLS*qK>k=$G4itcSG&L!uQPia5+GVb&dN8ik&Wihi%j6Jj=8
G^6CdX LeyQQt9VlWiJ!jW@uASIYQRwI>Q=?ZPq$ntcIk6/+:81E9N6ad1%YMV#%+JQ#XWPFYu:9N^\pcj+ihw%
+bk5d1 neJ\H$/Gl@SP/Y5pNJhkT+GteCLaQN*h4&PdnY&FYYJm98P9$LbcC>9i=9W9$*whlFclMENZ4Eyj\kcY
uSD=@H nQR6*ML@RS81IY*#6QJ46BKGdQ=XI/u=Vb1nK^Z//%>SwXh@ScuIM=Z@<9#wujB4N%ReX4YQQ*=\8/yX
V5>>%! u@ubZM@DK8Vd?NFQHn&5w4/9d>/#<#FX/%@V9YQ@VlZ\9>Gh:jtaCkTYQ:Zn/HbXGhn$iP/ln/1c\Fei
FSN=M& ?8mY^=W9&LNu^:=:qD?+m=ajyPXI:1Gi8&n=P*6&HMH!P:VE@lqc$9/K&:5*bna4Z<YH14/y*1hWkNNN
4DPLh@ %6cS^lZ/PQi>1j&cd$NMldtL>=Jl*+hmK9198KjMIX>*VFY\uZqZ*LhFldd>Jn/9t@Q>Au&LY@G5i6D*
5XH?*n JiY:5II@@=d9i#Hj!#@D1p#aN^ML:j$1j>:uQ^aL:YTNJ@cu@6FacPD*<LuyH9>*a1GD:H^8?qLk>qnw
RhS\aI F@<dj!+GE4HRpRmQ@&ykQld/JB?V49>D6QlF8W:%>bmTZP+Xl>VYtQKF=X:Wp@V=RdqtcLt?$@y?TXQ$
$eH8Y: 9TDZD*u88/!9j%V=Lw/#@uZMw=N>SwZwjSq@@1^cS?@@uD<j=/b&F@n#=@!*K?YZL8Mu@DVG#>iyl9\Q
^X5E?t K6@L*BBNQiQ@tA46HPQQ\@/>>Qt@<PiVNLPED4B&1WaCcSW/@Lj/H48+::He+?@FXM&E95e>MXXd1i@^
e%h5!W PG&@y8?SNHQj:?l:JIZG>:j/N/K^6VF>n>?pi*^Z@$cV>B8q=Dj!l?q*?ZQ>G*&SQq@S9>F@y6@8m@w*
hyCDPV imMYPnCqj/M65hBlT@>GA@RdBiR*C6J^QyuT#*AyN*BC^PB!+NM1>PV4HGl@LHBClV:B6pHkT8D*/jN*
RJyKLl >jlX>H/QH9>=&q/q^*>Flb:!/@Hu/jM^@Z#k?j*Z?9uk>@\Q<u#aZh/tu<?9$8ih?9u<FZ*?yH+t!?p*
hZAkVt 16dQbJ^?I*/iwV@%QW$/@1@!=#@#jW/y=t*<?V8?W$46?Gj<?d5??p*?>na?=9XTKid:$?*<?T%<@6+D
wZaB%+ @Qq6jJ:>b*Ji8l:@Hc9+e\Kji@q?:%yHu\PN9<!jkS+Z@B%?Juihlp@9q>lK8i5MQu@&u<8>+@QE*<4#
+W1YQj \iiZyaZVMh<c8ye?wVjjRdyC6qkCW^n#8>!1P*AXu@@n?>#n@PG>:ynjj<Lh@y@9e<j@<ajeMZ?\*h*?
=ZZai\ +pb*@Le*8YQ?\!=*#E6h:ymZ@njQtLPiMh>^^+#*8YP?8h+hM@/Z:yn#j!**G@k6ww&9!9$GZmN/+KbM
cBWJ1^ qS@=%JGn@j84N#==>PnBA:GQ:nt/4#?cPZSwZ#<*n@N<DQZ%H#/!=?CB1t/$iQ:bQRh&Hu#K?>uj<L!@
KCT>nS +Zi1N^:e6#Q&$Dd8nqVq/j*q@X##TQ>SV^88H:Q/pZ@AcpXt?<Eun*4jK#>!cN?&I\Qqm>4H/X:R!tuQ
AqA!k$ L*F*8l?*Hu:w<V$:nn==?Mhet@ei=i\*HQklh#Vc4FWp&:jV?#*<@pG<X!d9^cIYHhAiS5P1u/Y9H6:=
t9HeS* D%&9ehb#B++iQ4lk6h=b^j*pD8!/!bcFq:=5\Z455Y*d?@e6ZZDi&MQ>S*a5Y:n^=pQ^AJa+G>$He:N6
d\qtSI :ye>:dB986H>669=>GddX6*5!tQ^l:mle@@PlQ9I8IGui+mHDl:a5i>J5MIhN#<EYPAu?ZwE4i/a6!J+
ctGB@\ FQLyJ65YMbjlW&#n65QLuSG^8N8yL9Eit&<9?&:b4t4upnIQQ%1&w9/@>9j@AFBLA\RWAAIACAD%XG$q
VX^6bC @$W\/:+YAACAS\AAK\AAAGN5cYX8hHM9bGq#c!>6aYM9etX#d*X!a&X#L%BHWESye&58euN!a!=mcY:e
EJSH9t QG%\ZNX%h%h4T<l4:<1RFkmkb<ABau8SniM9nKY%bV5i!$cX^blMMl/ihy?pl*j*dh=:p1!Y1YVDbJTE
=>hyFn bmDVM5qM$6I$j$II!hACHYdK1ISlTtjF#pCuR%54<yT&A\dMh1kqi:&:4?jen@j8&\<JW%Ma:8488?ii
W6&ayh e:@P%#**:1=I8Hh@d:h8Ha?bqypkq=@/n9V6/VbGlkJX>j6i?@p@V:**:QDjj/hB\=Mu>=*CJ#cMQ$SI
SKw<AQ F?Sql\AI6l#XM$pn4d^Ty>YK8#b8*N/^Jhc@>%D9\IdhS?L:>t:a8QF461ZdttXb/TDbjiB\9BNTw\p@
udL4PI P@^eL=@mG@/8%?J:&%X:>9adSt4APNF\#XiY5nui&>6D&WBYpYF!m5\E*mG=:8/PX1k=\SBpj$Al*\^<
VyDbV$ K^T<>!CFY<qB5mQ\4ctnl:T$aa+481WMcdc6b+cW\bFWK1d$ynVX$lRdeLcl1KtWN114NqRMc$4YNAbT
C:Ayy9 YqwbGFeTKeQCSycS%yTppSlJc^udmmu@mSQ46w=9JEEedu%&KN8N\n1\=@A6WBWkJ?Eh=jj\94/>?@\%
=\FR<A &LVZ%Adb<nyWdhR&%G!YpKb*cStGkjJbLGhb?V$5j*6E6/H<Q8ZDL4KQ@FZk/bdN>>%H?iB!ytXLVe%Y
dPwG/Q Z6P>BK>8BXXQk1w4ykbntb1qHBt*dPDD5R:FMJWW5MiMAj&^Jj1=y/ajXVtpJ9TMdXnD!yl8D$QFqt$h
F?acAY t:^8piWJWFDDnCE@:%>mlK*>IKW><TQ>!yEN8+$VMMK\P1wyA=1YWbJ1Yl*Tp4GXK@5$QYQbIF1FV+n&
6Pimbi @YD#utE>wR+b=JPtMGF&GaIZy1AQ8>\HjbFHa^yYBk*d^nZ5JT/*MbDd>/9p>mDI:cekN%NDa%TFVJTp
q%JWNe 1a?CAuBScWqqDJa\nDRbdR\R>4CcwXbybDVFG5qtDhMGK4BNi^mIwK&qG^uFGHTq9HIqN?+S!C49S1LD
-A8elb 000cb03f60d001202b3 Page 86 of binaries1.zip
1jXpYh #5VwaHey+JkN1Nlu!eH6uIM@YIKDcVF^=I>lK+pS$\TQqAJQbcT#5A=\ZM#EeNQci!IL=teyB\+AW@aa
>:$X1h GX6N&A1+H65iX@adSlLK?1mcGFeG\SBH5pq$kHwGkDVnmQIbetRH=<l9q8DIa@&wBkPc4dw!Hqa6SV8S
aV4%kp BhiVXNRMcJRPQmBnnCqya!SnK<k@C=!Vt6^kbFLnu4+pPIhRRYmH8G8mn/IAdKDAd<M\p*yG6cEYtacp
#d&KA6 /MEA^WiQjVa<C+TD!%98bn\L6HKiVRY/!W<Cp!:QYpk9iTmRtu1*Yw81hAhWJcMqdQ&E$le@BNELIM!u
J%Xat1 ^AKB6/1b$wXydwy%^DdGqJW4?\%1eL#4>e1+McKpS+A^GuRJ%FC4+kliq\4X8mFVVY1+CR9^$S/>HWiS
Kn&S<J yyNYaSiBnA=pVB6kAqJ6bhm&5#989HN5dC!YEMSRTu<GNu&KBCd/JR<#c1RkcFDiYL9^VYT*BbwDctp\
JTYM\+ u$ay*qm:/e*%*P&l/n/IVKN:tjak4AV&M8D8N+Cdl?/DHe@EZW$#ddu>ZhB%P1$qMaIBlZb%wmZ+qSZQ
NJ&/8T <$nJ1*tB%:#Q%*E1eC>=I9Bu4yceImYAh+iY:%E#CT*qY68J\KNVL+lqJhRMck/WtXHldMSTn*Y<CjMH
MWwR#w <&DlFG4ZCG:!Xp4V5tm4CSW%bXBQ\e+NeyceMAkYYlqbLRNtmY^Mckq#QI5w=dk&#p#b%FAQ\FMycSdh
R?1#%& wbFLE?D&np^WLA%eyEb*@4i+XXT9>+8\66E4y8QL+IYy1THqy^X#mJEZ5//94BXC?5ZG:h8*Kae%i<\\
kCkl$n n!6^mB$V1Q/\&YWTcAEh9AXa4EMVEWe\$d>aaannTTBEX6Kc9\RLiC:RE\whkdBT5wpiu$&Ik%1IBN:S
EkQb<C 8H>>n%\d?APPWKDNbtm#dC?cMS6%J>V%Rq%#6&ah6+$51:$SiDBB@56heble=$JnyAnciZk/TFbR?Kep
*6/YX6 Ru=F*w+!:BSAQ!J9V:ZkVBZX&pF4:+hSWwGiTWd#D$D#X8DI%Jjmw/1iwn=+u/qy!yG5t6B&5Bt<DL#@
G@*G%D dcCjn%K<RnIq45he=bP1jBl8qe4BB8ZYB8Y4=GNmA=%ydXB@XWMh8=d<lQ^yaDV\kVjQbuEWVyQt1+WG
5SKQQu +lpP\quRB&6%H^k4CKBZ6c#55AuB^G5*<1y+C6^DBmM4D&t>6q4c5iD5mH6X<^:aGHVdYlajMEd5WDjE
K@EKV/ 8:/AcCeQmH/$SEB$w4>?ZP\h^#CTB6iWSmiY%m%/\EXHB9X\8JXCbC6=uQwj:lAHcEmh>AItW#=l@d<H
X=6C4i Q5GZ!NZZWL&HEN?L/K$hWZDc8w%uCX==jX*NX>b8QLV:8pcwk!FEN$HlF4=caA++iqZJ8uKpITD8:D8?
y=@Ypb &ykGIl5+*h4kAlnyuV=Ti6@kI$=AXDWphh&^BL*J>G#RNNK5\j1cBtuXwwj5PlP@4Y4m!My/hQ=bR>!u
=B8X\c JpFbReQWXH&G+AbZ%hpaBDjRDPSmnTV\8I>ZMiP^>R%IGTP1mG@9>#MACSpH1kk*^$E6Xhj+9CaYSI/t
@t+$5L X4>S6E?eCyR+4j:t$YGI\^LDY8K+qq!9GGMb5C8$EJk9ELHX\Pb>8*WH*h%Viq4H+!tXm?lKyX%lHV&!
TZFAu# muM1?KA*!C%dGt5P8!1^FTT\qdYWI!aeWGAK5X165NT$n#MRRk\a$MGk41YTX1\>:yyItkYae6eHa:jY
=n&4Zd +1$$u5l=uL@YP4R:>pjIjW9@R+%G>@VT^ey1CS*GTMKSK/FyTa6PSuY6clC6!pK4EpG9G^Fdd+I48R<Q
H+m@Iu /TC1l1*R^RA4P+@SENy#SRqk5F$uqHbnML+em/$HHJ?iyHNIGRqRY8>GmlLF9kS4%E\V>NhI$FN%E4*A
+&aGmq =11apA*K:WVkMNl#S%&:KdbFn9<ypp*hGEpqSi^GI$8<^@CcheZ4Yb@wy:aLyu^TB:9mH:?^MK=Q&F^a
#+Z\99 n>V<EK//u5GldX^&d@j$\lFSV\nd8p^PhF=P/#1n*/Vd+t!5K1N1Tp@/=Lpi$NSDeSWeGK>*#<Sd*IHc
AL6ITL TdYA>\la6c+Tj4uK8RP>uppawI5Ji&wSHFnSahlkhmn*Tl6:%8YAXT%=/5#e=XLn$RdXpbTN%Cc>I+jy
SX*1$K I8N<DjHpwmY@?&qPbN^QkW!TVh\@!!<#IhZh+H/j+d#4MY=96:B/<I$+I5wNl5LdCite6qwYGE\B=9l:
S8FXEW 4JtRHM+cBdcHnZ%CV+?pqe^IikD9NAad:D4WY/wy*BdG&jGi18$&8<FhhwJ?=ND+N48nnlKC*k%aSp1D
E>LXP\ wj&KmLiBZj%mZXYi%NT!KjC$umVac9qCDbP#K>ajN=un6$b+aW#F+:Eli9Bh4iIkuR48\nAFmG9y>SwN
J5kwMA MPpbqw4Z5tQ=@1w&!mB5At\Lbeh9YXHy>C*&5aTy&TNtl6:^Me<NZDyK%Riuq6KQ$@AIh4lS#h5lyC$G
RB/H!m Fkd#XuXVjCdBw?REiAM<iH5ckWECEFn$WqZby=8\u<S%!y4DltpD\Z&&uwJ\TLM/Z#+c:#6<+QD?NWwQ
w%9Z?^ nI#GXM$WcR/WE:CY4GG1yw/lRmyqnNGQ1KTw\ee<dXSDc#BGlwaX#$8N/lc>9uM6lb+8kTENSid^li@H
nmiNYQ :1\/H?+Z*KJd9RkHcKmB:Kc*d<PkbyLPH>hV^5C+#T+>$61RTkGa\AEdLGTeZ#QT!#9pNMRMca\eDZB@
WwL6Yh &IIbwSVj@C*PLP:FtN*iZeqBeBP*^:5Q*1FwaBDkZK^ly9/\QP4u\dDTipc*dJQi$@ye!mCwqHTCASPp
Rm\NXK QID8pCt$B?cclT8pHdB:+Rd>w!KBuRPMh\QXS=cGmh$=iCAJl<PPBPa\mawIA*M#BRaZ\k#P#juRkkDS
J^!dYM ieeyCaICkAW!uYe*HaWIwGpQiY\!uRe+V#8eKe@P#yahJA@uHIjCe/juAC:p<4PqWt=P+A8=e1/WS^n\
JDejy/ JaSl8Q^yF%@Kqiee=:TEL?Y^/PH#?X^=^5Zue#NAQ8NRjAVk$:ub&h\5G^@kZQq$Lne:X<dpEG!AKL+i
#9*i<a W5cFPk:Pu1+*A5VRHy5\lyWFi?a+Q&eb!NHA:%pKTkKA9tch^9JcQIZIqW8PI!/w/tQldRFi/?ySaN&C
!cXNEm TLWWMlaJm5=mcElFb%G$n<BF5?uZEDmEa>pCHF@!$N+knn5KWHP<R?T^m!\=Si^l\eZ#+RZiKWJSck:X
h#QVe$ #wKj\JH\RI=a^<Y#>t:*jHY$61a>:^=V5XF:TqJ5&H:BYiDh?>19Y!eIm1^*jH46CS?kmATRF6#t4D%^
b$R$BH %uGCItMi#4Lw9qAAuEC$1yIQea1C:Y^=k9tiAlTFaNkEcMtuRMX1:cqY\GLSl!*YKLBHRcha#\LemVtj
E4CXPT ^L+?ibJ8PV8uCbu8IE$pDJ+lTFwAF!XpWttj:FIitKl$VWdd+1Sq^eqIT>8y%a?5PHX#h>8yZh$4V6*&
>\VAiG T68yY?F=#TN6J!QlFWDV%nX=@T?^DddFQq4wbXtR>w%n$LG1E>cBt&^!T1Vb1bAILLdheTa:HYecetWC
eyQKDD Xn@lLJ$EHddB66kH>wX>a6<+S6Z+ZaR$V%::kBLhQ@Z%mejYQL:tl&5iY@Q%mj%VT9VcB=4yDZZ#bQ8b
?Z>dMh #5LElRqyuIpLuaZ&M\^QJ4*8Ik=%&JEC!Sj+QkeiQSLPP!Za?TJl1MeNAZe#&K#kPRhdGMLqtVL5M*ue
4y6cLi +uB@KhG>I*I/D*5GhCR&npl=h1+knXQ*^44lu5A<tX5nQBhZY8E1SIYDVw^+jw<IZ<bNt5LktKnXCn^*
QPpyCw E5^@PML4CZ6*Fn\:yedF:QKmI+#Jd/HMNQ\4YMRMk5kY9:FEZLpW18B<FS\8?GGT4<LuCn/aDRH\l^Xc
9ZjC:: \iXDX5*PupEaAkAKj@C:>%>uVSle@4ATYR#?+QW#1$BNWWhaj>QpnI\Z+:t\t#+tZNX?%jSKZ@@9p=^9
>nD/pY 91DBiS<5RnyBu=9=uY??8hp4P>@F+T1Z#?KcPy:Bd^Zu1=PjwA:?k4M+u5kE>jA!RS*<?jq=n/Di@PSX
i%IJRk WH\b\ptQ+CItGX<8ZdyW>AlE1CL\kC/ZL%+w!+QIiPeT>4@kLI/jd+k9F!?Y!@PpVKjPy8@Du!>jYKDw
Z&94lB B8&4%%iL4$%ZF4@E?PZ=<&T?<j\yi6%Ca@=T>IZG@KZwm+*=T>HFSjnL$b>d@9=j<I&T&A9dac?Qp8YR
*L/k5/ q$EPVWKGYCTpSEq#IXwk$daYEq&hlQ\@QCe@jA#4EAe^m=eFdWnPDYl=lymnkPP*R<#S#8PahlcLuGG+
VB4?u% V#>nZDNS/N4Y6d=4b$@wYPna*@TE8pI>wd=RH!%%lTbKE^nSqB1@MK/JeK=T6\9h$tjJ+VA?ASuPp\kN
tq8%T1 S@BbKSTeQK6HtD61F/ddLD=uG6D^y!9PkE@cj8*kFS+<#<J?&Yq!c*K+E&T\W!p:upaBZC:BG%A6?PpF
>6\d?9 *1?B6Zluj5Hj*<LF!?9QD%h4>KL*NbG19c*kZSqRhM+y#<u\HQ=>jJnjZ*llWhm>$/H\NN=KjPnB=<+?
$%nFW9 =aP9GJ:#A!<>btqE#i=L^Q\K+u+yX?Dltpl=j4<pE$lwT8CLyWFFC>QVHl:m>9K5uG4^lZDaD$>QTZCF
ta8/Y& qMJ*!jCbk6Re+HQ?@m9ujGGNe?+M%\G*Sq!!TVebQ4lW<MPFjBZMwq$Q=q!mZ>N+/muCl/D\4</hjZLq
qW*d9d :K\LQ$NYQS%tdHbl!nRG6%dP@4w+:eEk\bpQJdn%*Fpj9Ami4hZFM/HSK$IK8#LN=^CYbF4C?Wk!#TNi
GJDW5N p6pe\lLQKT#JpMGiDCp5!bDne*/<%^?h4!VDp5RjV<tYltWqKHl*hq?k<Jbiq>aNd^t/iPqTCRq1\q8P
STJuRV 9\S9yjJCVZldnc<jZyR4GAXZKw!kFq?bQ#<QahTqTkM<BNGqM8ChJhw:q>Nipt1>>lAa81uCpmQlbVSL
NCDL%b >BR8<LXwTmD+W@>59iD&n#PHPe*Q4=6jS>MCZ5Fh>QA\Y@cTW>HZ@n\hhB%Q:IJA^4@>huZ@j9^dd!*i
L8qnJP u1?1ju9@^PnpmpYJ9@ZD!wZQV*n:mi@6q:lB^K8e&66LD$&9clwVPEZHjj<W<I$<udV>WW*GE%M>QNwS
&IS%5K yA6wT@Z\cIjqetQ<=/D>Bbye9F<^JH$Yh*p?E/<JwWphL!D#e*=?EaK/cI?kAXwRLKKEdnle/&Nwww84
WFF#mV :&P+w%t<9a89>WF?jK$Q+9kTciCDBL:W\Ai=?FJ>H$VVJeTVSi/*Ea%uwma+W$JEPA*=TemQRb/C@EmR
N5n?XX QFRJppw\TF=qPiBAdwL<pj8MPE*BKNR4JBV5I5HkJApEwY9/^Q\w#\KieLA@+taa8+LnR=/GjAb!AjIF
H<<kA4 !CYPY#SDZFSyb@j#iK>jebdIE*Z/\QN6i!t/K4wmcpRjd:9ahq*u9<T9P*q^58*J65p&=:?nkZcu9hRP
CYqR:n ++lZy?@#A/#^*>8L&*Ec@:I+8NBKu<+=lmmF&duptZQTE^bD/\95JMJDXB:I\StZH^kKP%tkZ?AB9^VG
kI?&<? V=JFD6tSAn%pE\l8<ZAewdi5<CT9\^Nd\SM@G$i+RBm?MDM#A!ipQB$Vu?^ViQ:Si4%DhtCSdRQnC\tp
P?/^*p <byWkYWJ4pBAJdjAAAdnJ=eeHF$D&A%+GM!eCA>\K4JQaYGM=DR8+4+9iRV</QD<Y>V/lNXl@Iut:MI%
YAXu?Y ?&1k*nd#<Y+c?Q&dkPuq*wL4!l#yd5=l/IXLnm@a+DBdw+9*PZ1E*VWYped^%mlk5WaPT?un*VRIQRkW
I\E68X <Ej<EG9<B!HL49F!BPRTBcJwE!H69/**dHIKkSDRRiQJKNmwRwnTBRk\6Baa+kI?SZ+WDntRX$E=kutC
!\JJGA &VWj9?pCIe*k:Jy9<DKPn*ddPIN9eJ1bn/F*d8Bn#pC@BS!:Vm=^H!M?P/!\#\QJV9LHbBDp<VD=mH#W
-ADdS\ 0008d7379b0001202b3 Page 87 of binaries1.zip
K@<cZI @4DmhIYe!tV\!Tb\ilWJV%@W6=TkH>aV+8QLk=QAy&Xdal&^Vb9y?*4qF<wiI#68/pQD64J^?@a6G=d+
tdMlB@ jhAc8bN4<F5>@Ce=!lH<YbX8n%j@:+ZtG*@&t?98l/wdR56J6Q6Aj\>bRd:Hj6<j8J:?<4<y5E6QyLdB
S+TaT< M\QQ#jD<e#%l+jN%iGJ>Bb=AF+^%>?!@u:RGn<X:?94l?i>H?98k9tq\>?H8HyDQE/1Y^J@:@!!b5Ajk
!S<DYJ ?W^*#:*:+jpm?$<DVc@m>@6IwPpNAy=S\b<R+i?QNtM=eICY6>D!+:T<qba@w8X6YG:/JT%9^*LwA%4i
Y%uQbA kiXq%C^c:5b!<%*$Z#R<n?Y49pHLL&C=>RD:TR!Y\<ey@W+5S>l9pp=KRiRyY9+^LV>M!@@p$h#<wqi@
qYwkQQ :wei@R/V@n44HT#9?piQ@1duQj4dj8DSd*4Rw>?T<il9iNcnZ@5>n!a&+LZ6GQVwd\%/>P9@%cP@?$YQ
\=?E+? j8e8mj+:H9&Ga^:>#ye>?u6i>il9iWu1@\tQ=8=S4&*u/$KP+CQ8FZKE<6<JPRLqPmFH<CFyIWjR$Apl
DWEV^q S$KY@:YRI:#HlS#FQ>^APeL:Z\k=E4LTEuIEQ@A$uX5Pj<HGjuVY5yueDQy#Nb5Q&RVq6Y\?=B+wd&Z#
nk*\kK IZ&kX#>t<!GDwFj@^8bD9k6/^ZV5d9IE/NWcNl@!C8nX%>l<!Gpw:&h#CN!ppFZWX#Y>S==VTM89cjq5
wZMS>h IA4%j<J+Fjm1R1LZ$@K:ki$KYZ&cjXPA/6nQ?deGeL=#*l4DY@qQ8a4R#:i=l4+H>i^Hj\HW+c:X:KN8
aLH9+J Yn/K^hW>^ynC@+9IWhZM/JtlXZ*5q%SJ=emIdt8S\^wY&bhT6<bP6FKa@wPLc*^j:NW#>K9pX?@D:!D!
d%BQIT j*#B@9%B:Pd@uS?YdhmwY@l=uEC:$F$l?>4q5KqH:K#te+Ge1lBeAq4DYC\P*qKtEJK9EA#cy11kAhuF
>#h@Y: 1MtHK5:uD>4iA6wypX>cqJ\1/wi$^!HaDime^J#<hF:j#PJpQbnJ*GC@R4cK<WEW\KS+ZeG:KcA<M49X
VTc59h AFBLA\RWAAIACAD%XG$qq9!kKG5JAACAHAAAMAAAAGN5cYX8hHM9bGq#c!>6aYM9etX#d*X!a&X#L%BH
q&hNwb WESye&6EbYJ%b!=\eG>mLtJyd4&bC=^WXS*H@*hbaHh&iT^CwyCPSARtc<5A4km!n%pRahh6&huFNaS=
pqdn\c 5a:M#p\#5?^t1XBmJFbwqtE95:Cmq=1Fkw>KEWnKS/Y>5#J:aIVQ6Mn%>@9ji*j8#C!QleG:u#9ji<@>
%8V\5& *9@>u#Nu#y!#I^ZNC=8>phS1d#nR*XtbTMRDM1k6tWwGG>94b^k==SN8@5:V5=/+e$9HupQe8G:h9I$p
C$RF%M d##q4!Ln5S6*ma^dDm+Bq=y$$WqIVVe+WTdW^&PyhLI:tI+uY<NhCjj$Kp@X#Ft#Qb=1V%X9Iy%JTKRQ
m=!mnt Y@=#tbchwlmIc1\TGjI<#9uRF8jDnyCL8I!5$>K:\TmKD+BYaHFdn^&*^nwwmywu+*yeJX4kqnPq&Ekd
tchNT\ ?/Wa>&nGL4+n:6b\Ky&T1Z#w/E#?9>eNB^XTtqW^jRhG!lCSqnL5=hlHwGT5:+B65EGKG<P^d5%Dm!dL
/JH&Qu XBq6ZGn5p/G&NdIlFEt:?#PRlM8P/*5J?\9aZ^\+yhJdiLdY9DLcaX^k:TIqTLQE!9jG@86FYZeW=h+@
?tp%4J @JqSB$=@dj=B@q*>S9cjid%p>Et:y+RtV==@5KdI?ej4\*c8ShZN&1NDGH#h8%iK!M&dbRm=cyWWp^/Q
T=nQD\ DLY/#VBcPByP\m<l+biT<F$p@DKNJqLPcQBHpCkbTeIjSeIjVeK9$KiKnPFV+b>E\l>L+5w+E9:dTQku
X8uP:h c*d+jDA:?KiR<E<q+W<kaW\p+d>hc!F!Yy@YYW+u+d6J?GiR<CiSMN>ljWkt5:a+jmeJj\wJ@%$p@Kpp
ENM=!G @GucKmJu5qX\>P/>85qbjIW@uaSjTeI@Y/?K9IhZ+XiSKJqB\9iR<GiT<GhyFJHbnAL@HBJ?Nap4==L\
9Xb/pD ==D\#>Pume#q$?DQI?GjV<KjV<KwIiHZcqamhe\Kjn&J*W9Cd!DlL!BlL6V5$Z?bQj^FJMw8JPE9J8E9
B5%/BH IiE*cm%FtqlLHF%E\t<t+d?ZlN>C\q?14THT!6cA:!NS$4bbN&uuK@^qJQ!L6XTpk/Z\L!Hl9+@EqiWp
Sty:^T @E6J?C9$dyGX9B8?u+RjIPEHTSklEu=au+It+FQkh=L\L!P^S$n+q=M\X&5&GQmaDj\8Eu/M^LW+CV>B
&4$w/E \u?@bw%^tqunKEZCV=Q\8$u+c$n+QXw:pX:YD9+HTJSeReL@IAu@R!V<K:WXSK=mK<C@twT@q5TXhc6$
khYcd+ p\@#Fj=H>E#pGy:BZ$@C9=cE@%ET^kaT@5j$LyH4iBj<nTV</$u+H!i^j+KE?WtNL4KJ$iHjRMK@paV@
AqX+nQ KSLPVTV<V&5YIy>lFnm/taV@Ya>?WpVjQjm*pQA@y>tKjJ:b\9<CmbI9p9C@SMK@qaV@bc&X!G&5Fj!9
8JeYd? pQC@T8LKFlL?:TV<4&u6Sd:P&5Q@Bkq@K\u@t!TMd*q$p&@4K:=u?R4@8!V<P$n+h=L\:!K^j$>6pd86
%#*ah+ L?#9p@B@RMLjS5K@l+S:4$aX&e/wPNyB\4?QlH<@Cj<BE9/D?uTSH@Ly<H>Ew8VHJQ!HTQkQp@B*cyam
nXkewn n#BL?L6I?L6JZNqD\9<JCj>S4R$i\64A@!pJ@&ep@MhIGI?V<J@RYw5<cZ+n!<>J?L<k+j?TlQ<WCjQy
pPP*E= @j8%jZ/qZ@wm9>/^R@td4X8X9>&\Rjt:ul:#!>nuW@:B/%Z?ehIp=VMXFew@mYnEQ@N:G@!LmEb<XpRn
4YAJe9 al1tEb<V$al@\@e>I@=hSCQ?R$Rn@lM#EEde^/CI?L\=E=B@pamwYTQm9$qE%FpII4=AImLuEI#+EwtI
i$RWke L=PI?My?*iSXc%d^u^&/!Y6dhbQZN?kt@?*SVj:u$$$PiuYV@$@TVh/w$E*/BnGb6caI@ci9/6cZPiXq
iD4B9& 8$BQia>XpEjHqkuYH:L9heh&I5::elLRCcNlV^S6dtq!P&1@dcm*we/*$Du@=FTqMh+hT=@6m*YS=1!R
u9*Zh* >$<ZuX>c^dZS1B8LmSB8%d6GLEn/P:9C8LIkEk%udmnZyabdb?>XWyXhMENtbBh+SIiHkW6FyuAT*HRG
!dqiN= >pqtNb9Ya:@YPpbjdWI@dhyu:kbtjcF+I8y6VcZnke6DuLd*SGKlqlIyt4nT&RZMBk8EP%PYN#jSudyM
d=B>6A b>dNM6c\Y6DalQ$5?!=#*8&an!hEmt6DwV%m^VnjmqGiFYN&Vw#!*BnD9PFwPB&&w>SbWWa+w*BqplXq
Eqkb6j SG+Wq^tF:=K\DY1Z%4haET@\y+JJ*FN1QGYe/w!w8:&Me9ce4I?MjhVmau8b:S8IY4Gdk9HwGq+#hl4n
6=S+jT DYjQM^!^e#hiG\95^K9ntT&8eC!W59bKpdLd#ji#IjN?V8+MSV8=+mulP4bGcy#9y:%/ed!9^Yq@wNN^
!lTE9y Zy6K>/J#?%/Y^XkZ&e@t&tnawjI%<AF!<VQld9J*lihakT+Nt+Fi\ShHyqGdn/LmA#T!kcXRcYbFNqiG
@emAYJ YE>bqIkuAq!aGiMhuaEL1NN!ukI?l1<!cYPuLhh$&?LSdmS5Q5EK8D#hGimF%Y45p5XbjcFn<GuL4d+D
\N+*#N =h=pbE$+cR+tnwc8M^8/#TiNnwdtk<ah41HLY5L?pL9Xn#HGd8p&5/Zd&qDuVE8H:CZ1+F9c1MJm%<nJ
=Md9Y& 5^*9ZTdQG++8#/YSK<L>idbdiT/VBa+<u#9&QI6t#?S/&ky@4yZw^VI1p!m1ewSEm>L^uQ\/uQpbDaZK
=Gqi1P d=/X*!W!*bHjymQqN\^DTZC%*Y914TA4^JjVc!wQF/T<QSuB&Dhk6%tb%&&tFcDd&Iu/<:4N$TR/aL<J
I/lJYa =QYdcaZ5N<G<jqM=8H+V!85*$\4bd<J=@cd!KQwN9!!5REF4cL5ud&ndit^D&^nPc>!N@ym@<#AD*L$F
ZGTuKa G?C&u>ABd5h^D*AhXy:*FY1AG?1bee:5/kH//9*HP5dbKV=R1DE8L$Y:8#=amGH8weINe\?j$GF8=@EQ
k/1yAI e@bd<$mll4qD>y=h^#4T&Tu8L6SIh<ni5?h+B:5==mwB<>%c^%ynI@dmVKAl%?T8Eww8Yt^p4%b<L&bF
>bKcpi 1MtJ5D=96XL9n\ZDWeti1Yj@!FQ$?LN*XQQ@BSPNMVK<5cHJB/G8MhkXAn8ct?MBMNt?1MpLZ6eTCT$B
>!i\GK d?5Jyqt?9dW*uRTjDEcCMj+j\q#A81:T?j$B@b%lBa>Snnq:&V!4uFN9@R<JXu6aa=Y6651ZacX/uqX?
:+JYqK 5q$VqHeCX%4q@H>Hw%ZP**G&YPZV>SeW5=\65e$14\c14jKdpF6EY<jRN?>SZXDwMn695Z*E\%H>l@mW
6+%dJR B/Ll+iaeQtW#=:idRb&Y%eX:*jZ?SDwTn<qd6d$JWE5DBBRAAkAIAQbWdTWVuq5FZ\WAAAALAAA^AAAA
LBu$qM a&^ybY=$e!>pcZN4L&%la!>#d*X!a&W9VZqDhZN$d&%DWqN$aZJ$hZA8VGqmLtJyd5%Yd$kdb^l@:yLc
%nED\& XLPcPX9VIjbIk/k4JqkyK#mcZBJ:VYQm6LWYPq<%Z1KTQ=JeYk9:eFE/!qa&P$dul$E6k&&qG%wG^Z$b
jehTA> !5bw9/u4l*$bn4K!59?MMlk4e<@:*q$<4X**bdCD>>=:@n?@*@8?h\i:P5+FCupqt\=$hT5DPcW\%l\b
l+!#HJ GaS@jZX$S6wDJ+?G#D4dA\C8dud??N:b?diCn\p5Fq?+m?Eua&LH\iiQ/Wwi\HIV=&h\eLQ#?Vh^>81&
Hwi1Ce Np\<4@jwd&&P\%<@jj1SbmydAhnikk>PuK6\FnR>!@WWhVBZ=8nNClBKlnLWmW11d9N/9ZGt6hJ8T6yD
Mj:$1c wXGe68N\GD4@n\DLD/6ci<aF&<!JcCGWy<lbey:cR!N+&+HnnBEljXeGy&JCFl!8LFV9>+C#duy9L*A+
6?Hn:: iB!YylwF?wNXVkjH?$BN&qe+B!iy$5Ih6d?l4pk>teYZ6H64:pq*je!!$+l&%>^:>i:E%#ecwQ6<?H^t
!a+ZmE 9neYYaX?:I6&Zw/nb:$Ql?D&Cj5B/5591$qjYE*Wmml=&#/+<u/:^?b68#4>d98N%b/FIP#^AZk5u9Lw
Z!DheL l#kD9eh?AZ6nGCCMEWu4GHh%P4J16YGhI5QLcT8F?I8MMTwjbLLC%wG!LitNNP9#:yJ>G?QP&DK&Ew<X
wbn\IR b8aDj>D:\pN\:L6kA/^eRNF8au=WZ@ZL/+m@?jYqYcl%b/H&%B5im4WJ!ybTAIjl&w^Rp:CPXX/:Ljlt
&LSBWT lwTVM+$CEV4yt6d:lGQWn&HHGE?FWLF$HY\cD=+KKu65PmhPX?VLH*DnQRjYA!>H5WNZI>lYZ69uB*:q
M*q9FM Ihm:%e^>M&PX&:F9nSHc>+WTa#5aln/><T+VM=#BDQP4aLK9bLe!&XtTLW^&qQnamYN1uR@\Ilh&?!n6
i9nRc= NDF?/bcBW^kF@6L*aL9cEB:ulWTj^%djGeCh:61^Ah<uACbpQ%N&kt>9=pjV4DPE*DaJbPcwtRe:NF@b
uqm6dj \IT/map^9iZBVW^w#PVbTuQGY<LEnLPE9BJH%hcuh9HmF8h&XPjNdeS+!984G:Hi+dc%NW<V&JAnc*V1
tY5+^= hM!N?$ewV*#4JnwCntX+Xk<4K&X:GpjLP9hiWQnwu!:wL+>kXV!q>tnBDbL+?YI>J\Y?YLkVpESSZFle
qy8EJb t6B5LAh>1@X6teNj!5GJwmRtck?C/JN<!VJ%5SY#im%$FunNy=ZbJLGi!%ZitXlY=!bq/>SpF@@m:dZj
nZuMFK DB>Yn:/BZWc>5J1!B>X\MiWIF1QIaLma66IbJX#dwK1j@my&8t9Ny%4jiSwQ%VlPd+HBnlk+kZ5TCmw@
-A6AuV 00021b2bac9001202b3 Page 88 of binaries1.zip
=VA@bA FkW@NapaHykR:KK:wITktPKD^dC1>/%8/L8c4X8X:tw9>d9d9A5E+yJY9y44VjHS=duiLN=duHP>Ci9T
L\1T$@ WuVy8ES4S=hbXM$YWhM5cq1Qt6+WqhJ*C&hEMe$&<*iJcjlHNN\G#ZD*1R:yu#:YZD5l!XS&eCBFl8T<
/u5WTq pm9EqY!P^IeHS9CVh=PRXDc?qeu!DmH^:JCep^QK8VGbEIDQCEtnmY4HM+W$Xh$uJBALl5TBQQQAWwqW
Cmu?/1 IV<<p6G!nYR#1LcECDpmK^$a&>5qJ/ntCmH/X=&GHTEpJ>M?FBq4y5h!\Q&PDnKccXBZQliuRV\luRNK
c8Rtuy jLldV1dqDPbn\iPE=PYpMnCawm%akJBI#B@5Dl&l$y+VWT4=Y%HGPyk!WMnqMNnjC9\6w5HPunMI$qt=
ClN9Rk nc!pC!qM\L&Cn$Mnb\1$$qu6tcw9Ww@5EFP@y#*nI@<^IYj#b:FFK4!PipQa9CdGH\t>/y:$8%X^+FCL
*KJp$C 6?XA<@FRS!jhD8LS1Q<\Z85in&w&Z4Q#%?<b9&n\Q:kik:<Y/6dY@96i@kbRT\MEFAACAAkAYXX6JiF4
>L9?BK ndC@EkAAkDWAADIAAABndGqqduS#L*BueC>6aYM9WEhRSZXpd*JlWG^%b$q8L%BHWFB5hYhydm=!e*Jn
aqlMSy LtJyd4XdDZBe%ZY?d!&5qdT4qR$WJ1H^m<HW!EG!YYAa<=P%>YPWYw5mChPpp#ZQ8$@TD19h#j:a1AY$
+p/t%T k5VaGaJyP^*cGWw!NJQMmJ<c&tquIlw9qJay4LPchB4QBA8JVCd6bEB?$Fm@8*6:#4**:d696T9LJJ#%
++DM:+ %Z*uj8je**QjP@jHyLu9RF>jJD$en4aqpwpk8X#1H?n9/I!ql=YK>F9@??ZMntP9uu9@SA*FmaqN?#FG
iFH1!9 ^V**ELId\1buQbVTWySVDBDQNpwZj5*yA9BNh?#be>66h:RNh9Z&yah:wwtkHp$qw<th>\@eyL+XVSK!
4#KtaX 9<i@:<6A6T4</k@u@y+@*Zd4!4n=w%TYwaY/84yT1VT?c9:wT>TGF&pV%LRMn>PZbAHEpYS>YaDYeZ^%
hiSAT4 HN4jZne+F6eH@j6//\jTS<^uX/<YVR>y\XR/wTe\+a48mDce9Qik@$Ani%J:6iSD!Db$^EK/&k?D^@Jk
hW%ZVc ZE>u=\Q>uR%?dXSCGCiRu8lR#EIab!LBYFSCpPNI@TE>pR#Hw1#Mju%aLXiwmWq%c/Ql!BlKd8+PS!J/
mi+AnF wl8#/+6w1cFaanS=Z+h@<IyYyIMDk^%Yc&yZ*&u1IqNY:aL?i@D\+Ek+1ZcqR:GEy5cb?c4^SP^wPKRu
GKDt9Z XdBwXa<GE&Q^FFSZ%cIlNSpinwcn\&yTV^\NB@Xpt>1VWmEHLbKMwZ^:d$>9q^1MneanaT&ccwM!/qMn
dM*DXV $YE?ZM!&@+BHyIY+GPe1n?adHdFwC5#\bl!:9iywPyIK^:XE1q%WRk@h1S/JycMlLVF&>@ah!j?/E?8c
WRFEdu mkXnpd8*c*EwM1llVh9n\@Gd!#4d*i/dd>/ShL968hiWh:9F?P^X>*DX:i9y^wIyQZX#MyZR6XE*IR:m
jVTb68 wVISa5kV\tWRI=iu8VJ^HputXSA6TL\D!FPReKR#M6+$>XyVkjPFQD&6u1G4y<<\uuye8XXHcj:CK8MN
EKWLKI A*l/8nR#M+6F$n#^8QL%1@tbi9e5bGAkd<VHZ!>P^?QnpAC<=?*/?6Zm8j4/ik@u^\GcmRMJ@N^5QTQQ
yDX\wW l=^@>NF^SPMq\b<:l^Ii#@\5+%*$WbR\Tl>^jckQTlR<AHM?l^JFFiBCH85LVV^*n9:Mk@YqnFjyw$WD
$PwKu5 BKA>Bt1>=1A$C*$E:Zhl9/!1$Ih1P@K5H@NV9A>NH4wA86DCRYN1c81M^LNSpZmYBu\lJ=P^b4\J1aMZ
!<ml#N W&%m:/*c*+EF!9CFlaXm5dm\qlbq*KSc8JQu/T#Y\kX=4T!1+mll^^e6*A6pCRmeLmL8SSkdDSJCkPNW
^$nGa8 FAEC>AhAKFFeEnn?PE=BwQmDMTSKVb!Y1$n>jlRaG@Q:@Tkl>E$eaEpAmE8W1<kVm>+!DlI!QqdpAlY\
FD/XEM lWPbjyqw5SK*ThBmFh!WKQ1l9<dp<liwJFEpDF=c6A&SJRFDZS\4LpEZLW1+JWGly#qMF^eyLiMLST=S
#pM!Pe bAJt@=4nk#mMEElA&W+tIMdHlNpRPuGIuRRFm1J\Wna+JwCG/JS^!YKLZt@b#K4lC>!Pc8M5C$+%eGt8
q46#T> XMeZqnmb?MJmViIViQ*=nb</eIYMDLV/TR\W+\!EB!G$RHA/j%V@Lij$1X<%QyP:#4*ql5$NY:e1E%e%
@&R1TH pu%Z%=GJ1*#\*LJy+11/c@bh1dSN6GS%yYZ*>wbu469nu4=!=*i?*&KMbJ^pJFMHaSMEpwE\@4>R*kmY
6RINc\ mYXnkPw54ShtKX*=Hn^5&&BAYhT=XL=aNuTCn=bihb^?@QV?j*#luYTkajCKjujQ&H<MjQ8un#hPNGci
$<CP9F ymZyS<jLQ!5X<5le+N$/X!mSM@kBNWwPl=HNGaYTi91MC*n1wFNG#1A8a#FQZhVnwaXHHnH!u8d^6>>?
5/B^/n P\@^MiBLia@4j<d#>MM<JjuF<ja5NX!ihpyKlyHNj8J\RP^!iXT%bBVa6/BptPZmYK:cSukX:AQ?ECe%
/l^/TJ *>nIw*t!/d6p<tDZ6M^VNp5\AZte*X//*AyJ\LMJBdTede&&WmbAcJc&b6tQeu=FJNBX^m?\BK\Nb5Di
wRbJ:M lnT:\kykSkkSFkmXZDXuK&XV!PJ=A8PF@eNd&I6<bZ8BdkAuCX%GycjDj#%#+VL\h/K:9/9d+6DhT+=E
$lVl<# nuAZ:>y4\CQpVtY:eDH*>jYwS@iAt*RR<E*mp#eaDma^!*8FZ>m!5SZVZiRIicQ$qQaV:Z9c<>y#&qMj
!6l<R9 j@jn:!+@>RGdkqAB=XdI>\:+Gq>t9yhD%wRZLQnY%M/&6ydjDMA8u#\JKaWCV&<NHQ:GZ9&B%kD!k<A9
4I:Wkh H\aKYQ\6J\PBtXcLd\&5QNE1</*FRG94!XMuD=5<Bi&Vl\?jZLb+Zd@##n5D59#n*%lt<t6jZR+I@\V>
$Z*k1! hm8y@#*$t?keeF&bF$!=X&WW#p:tj9wliFNVW!?@m@F:W%M5jtj1JSc@?+5em*M9=mbj^Hn%*Sh@jB:n
\B=aiR h%:a@nyLj@Fjlh@M/?*D\nJKSqq4D^uFG1P:!GMEZ#bXZ>5biXTb>&h/jYd<i/y*RjI\:ScpXLW\G>t@
%cyh/H Y<C*T5S+!ecRq&$MihuGpJh6nPqLN5d#6&!M<=cNqZqla=I<5:GF6jY6?4t$WdiiHn\I4+=iZICcmZ*>
<$pj8D >*YR#MBk9!4?V9S$*Phu4^&pBnb/mmZJ*kDZp<%j:I9wYqKHFY6ED/dW%Im8Q1TQJhXWVA&Q^tPJ%N=D
J98Jwm Z+8q%TFeX/4JGK#5w@w^69Sqa5hG\lFWnwbk&h8t88&=chE^LnaGYS\LJ$ipdN8k?>V>ZRh/@C!*#1/P
kWWA1Z @1@%DZb%6l@1/8@y:8u1XH8:Bkd&HilTRhD6duP:WcHL*:pl<S958heR58hbZYn6tyWclu%AQIb6#bQL
#RQGLn t:!aImcjh<*M5qVB\$y$y5DZ1I!KBmqiBt?8m$*iIQDudKHMF*Cq>#:!9N1q?etZpDj4d?JR@^apE+j/
btlZK8 &uDkK@BCXd\+k&Vyi$V>wL\YVkdb^6jk#S@q#+MAtjw<d\?H6&*b<k9PN=>9@mlL!Mj9@WNP\q8&WdGG
&8PR?+ d=+@*\\bpNteDY<^iZNpGE<NZnMk^59DcS<9e@\1^=8@>#hIuwyJc=!hpi*Fp/QFYbtj^Z<d=<$ctVDB
VtKjwj WdAEQFp$kk9Ym*H?N=PMN>mZ11YMG+\q&<w+hPn/?Q#=cnn9%*L?=jwJuQ&\iwl@AaahE^ljDV@@BSn&
wqLA%= hZA&:LX^<<j+Ga6tK#<Wu?y4Ld<H#M+99\E1?H\F:#L5QMqZ+M\D<Ek&SGZi^h6R=kq8BMp<IVnyQKDI
^Pnu?$ jkaqld\N>?ViNGT?pN68CHqaBtEFytVeWM:P&81:bT9Q*&Cnc!ld&1Z!Ebd4m@AFm$i+KNY@?McY>9Pm
S/hKRQ @6QIu*&#tBZ<#A#\M&jPp#L9uq+>W<\K*n$NQ%4METK%*=WnNy:*^%\FQ#>Z\e@Q4iFh$p5A=YYdtd9$
AwL<*e *lZjGLmW!:h4QX1D5%^4+=R541!5WEuYl4QhDGwK<LY>DX>lcb<XLuXMNS^=61P#8LSM1?ELF>qP\>LT
BHH>Z5 <twbq/t\Y5A>m#Ji$j?X?p^h5clTu&Wl+^Z/c@B1?495?u#qYEN@&cJ18FLbj>k?^W/+?h%A4j+E9FBa
SK1eC\ kaFbE4ATCDRE1I#d%B8A9Ch6PKm#QITAN*DTuu>FDyb>q56uPakMFC@h6Y5h@e9B5j*iNXVGc?$<4Vi@
ln8EFp K8jjyia*i\h<Nm9qhX+hay4ZlM%yZk5*y?quk%@m!&1d=6X\ibyXY>VJ$/#K?eBcjYK*$LZ/quXYV9PN
I>Xt19 /li5HG#V9J1?QM&4+Eyq@%Zm%p\khq!i/hZ\T?4LM@*V/FjP>M9W4+W4*8yEc!#/j#jH:qNRhV>knhXZ
19R6Ip *i+y+^e4CHe!%<YJLFANq\Y1+Bjb:ty6*NcK6jmmbeFX<a9YAWB%uMqRc8FRtlV\*$XcZ$@Z$cj%#e%Z
CMYTYl $=w+ZXl5964CSh:mD@AP1GAwXE8jPpnhw6uCK9$DeF*VFq9>#W=dA/@SN?Ec8At9X5hN8Ed@W/?V\^Z>
J!8NKG 9!L\p6jyhTJ<5RIH+4nZG$C+Gk:@cCBAGY#HWbpFTp6R>MXK*Gac=9lj!n+Kq<ILlW9lKHFJ@GKNA!\#
u/GKnm @%yWINIbXmpDD#\5KSuqLp@G<bk#5?qyK>SVb<bJVtTe!kqKQ*kc+wtM=+MJY?\pE!DZuCHje9:h^P*P
5kCu1Z nLLb?djb==\b<4D#?RhdIGaB<Bd+Xlm5QC!duRY6yjZPup44?Dcq!>HF58$d565k:IK1He+T<p$IZ^W^
y/&APK 4J\WYJR4bDiq4<e#EGiW%?N@I?LuYZ^@QAN!wJ#NHCW?Fk?LiC#Da$J<p=PVYTk/Y@&hnPX@PeQLNMP+
QkJ8tN KB@Y4Aw::%59#GHiG\u&e6EPDPIn%$K+C5JYCF5k6GS<bF9YS^wlEB?E8RQHI5@+mPL$EeiJA*@?%yKQ
wR91Cu NP\G?Ri:T#iAVA?E9@L=qB8#Q5hB**:H6htPN*j:P6/d!*aQb%Aj<*pRA8mS^!CW:4@@@whlHPc\@HG/
$ZQ8*P BKEAwaS&mTEDIT8FPZH88TRFR/SuN^ntlF=JBH!ia&ibNKM<<Y>Q@9L+pXPjLHqQ:Vt%=+V*%Ci@*Q@J
S#mJd4 @wpuMlPTnbWpP=I+jpnBVmCGaP=NbQ:9?^PuZ<#R+<+uaj=puNA<<+VmMYK*h9Fn8G><#4jd6>N*q@?+
a%bXG@ 4?GQ@>1*!*@I>>K>#\X??/h9?Vd:/5hL+*Qn^9nTiAGi?Hq1Cb:=D%QatY1XA\/&pXuI9VM=YekbEB8N
QKGAli LKd#AID6FF^uL?SkFF/bl#l96ImamQRY66hwqKcJ5T$H<j56H<@mbTN&>yPnSdF9Y8&\SjaeGmeu&V=T
XYYwHG w>HID+#tSV&lFE#AWw%yEZ>EmJuP6?Tcy+pd>$cd*?e^EMb5l<#eI:d6dGe<I5pn@BpYF<W?Ei+cEYwa
b*la#N b&eN^45KiR<^1PHJ6Z9+98eb^D*pD^qiXNyBjywW*\M>><#$Kq/6ep@QWJIZ?#J=5j?Tu@hIb<94Lid+
Ye#6CR il8yBCSYmBm^1\\q9y^nQA!4^JhKlXY8\bh:JZVkq%hLjIWJw8D\e=/9^!6=t##!kql?lSY&:G+RP^:A
Z^M6JS F>k1&8SNq>>e$hwZ5XX<TtWhQ^SLqXnidwp9<XCY=8$8V#@SD9PVdLcVplXYTa6unXI5ih+I5>&M=!Ji
Id8bXi c94*4N$TL:u+5u>QN:R*1<lCFj+%4jDZ/LLh9^M1\DNQEN%aj5QHekuR=$TeTaAVmT/tyi>aZA=SW^<>
-A^8hb 0006ed6781e001202b3 Page 89 of binaries1.zip
*/X5?b 5cbqT=>/Cjj=kF@luqSAqMiey%KkjCPL8XKqp9CBJQ?E?V!!Q\I?CFune>R>VD^j&yGWD6@$lK=1wbAi
D!&%1> cp@HR%yKD/uJhDCwJ=ND/Wlp4G*Z+Il8T19H6PS/5ujL55FaPlJTw:GWipRWAA>BLb$EL141mWR5wecC
+4W+/K \ZRmwaj&1n6&6@Yk>mlpyk*4h8&nimI<FJa!CLML5al14D!<Mk8\WG:44bqVTBe*WG6tXd/nY5:6t+Q<
Cb5cMK QHP>Fwpn#\Vi&&XZhSP/FlyV\%EX$Dc*i#CGC1daq>SRRl9GwqM^qkaF<<EIS$P^a&$lj/^mkQnSKYTZ
eaW#wm 5qwG&jb1D?p\BCCAl/Mn&qH#%BT1q6IjV8HScuAEKl=NciEw%I8%+$kpFu!wdde+b6YnKV*B<w%4!YS<
ZSBy/Z JIGJR#GibN=FB4Y>*w$wmA:G8<!w5&jRLmc/PlmDWR?t&qSX=JqKnKucMNT^4h8$IZFVG5aD&k+qRyQK
XZt9mR h5NQnPPJGNwi%p@1FlYMKeqNRM4GGn8lbXPSlnElKkp6GhLTpSR&w?*E:=ydC6wST\?QkM^wLDGGFyFA
IKnmN< <\mCubRdIF%=FuLR@*@G?=dj:Yq:kN$qQ<w9V/8^IXay^L?c%mLB&PmwG6TmYB!Y*#?\n=tR%e%5<1th
lQh&&4 A\Q6uje!W\CnTIGq6l&y&eAlMEt$4pVb9wik:!FQ6*XPu$4H1+lAcjk5dL86<u>QPHdj@wn9BWm/#9Ea
I!eS1$ <R#&>8F%yejb6RPFQB$PSt+qt<kQId+D+y?#G%GdqM*5GqPhen8:QqPuJQn%I?WXjphK?R&@RiX\JFNn
ubwhE! EamdB:9?bBDm#$G?%^QFeiN?j!iW+:kuQPD9k@k4@PK<+=DNX=ykZ$\9>%@\8ip9iDySRjc+qd=qL@88
EVd$C\ @JbMEuLqQi#=IutNpK9*C@qd+I*:HT=Q@wYRc:1F@D8EjQ+4R9=u5P4\C@qPRy^QY@qj*!@p#^F!\!El
&\LNnW Q$9In1<L?j5IcjlLq4/A<8/myZ6nRPn?Cy=jELwj\9P9lc+G8n?*hJ9*Ydy@%Cy$Q+duX+V8MmE:d^G/
jl?l!= TjAj9!:y@48q8@PjlT/+DDj>tP51t\qy@apqw#^4>ZQVei5L4L\k!j^I>N5X<Q!GiH=YJT%Zeq&qTTY:
G?+?@m *lVy*+b<Aqb>tq/&<9H<J>64\+H?ZJZ@:1CPkQ*4mT$:l^K^WdXVV#/pDkRVY9!t6TtNA!Mc9waPlw>5
!!WMjm SL^KC5+\eW8Q@#?t4aMJLb1McCta\kMyuD9J?m=i6dwBiQh8=YJ1N<^CiPum@%&^+b?GeZi^h/kw:nL&
R<iy<6 K@<jWE5DBBRAAkAIAF6XdTYF#qaFd\<AAIA!AABCAAAAa&^ybY=$e!>\b*A9dYFnL%BHWEX%bG>!aXB5
kiI?=5 hYhJdm>FhYS9etFBWEqVhZB\d*J$L&X6e&S!cZbqLuJ#etM8atq8:XwLeB9Zhd$QAD>TBP5d@Y4L#=Kn
e!9?9= Z<WjSNGTK45GQ=KXmBRqW14n8tWZ\BJcE<BC8\8JNM1IwJp^/uHhK9=W@1TS?=tJb64WtVw#/a!T!ydd
+?FWRR btyPtccbXB%u$uTt6bNtJ8G$KT6L4Ld**Z*ALpCApl#bnchie9H8Qji???/:::69F+J1$w\b&kt%$VCN
Nd%C!j KN#$JZIh:891bGX+!?q#8XYj@NKKyj>WJYM8q<?IXGVeNk4\m*nZ4JmbtRG<b/:cM<=qw>mGteJX/1/9
hGVQRp %IFl1MCZZ<K6kw5&PH<#*56VjqulWu=XZQQI4=h@=8yXn^#1\R>npIN^yG?DJ4kD@yCFai#IpicFlISk
5CcGWS I:#P9kT=#p=Ctt??piA*+Q&@L5CH@%1^9GZZ4l*<$JH\ka/D*h*d?Q=W6BH^B/l%/LJ6?$1kK/bbkTPy
568HQ/ tA+QaR>8ELm@I&QBk\CBDn$>Al*atZ5X$%LlKFIhCXW^Ckd8\Lb&dhtB9XyCDS#KcBaee6D*$5A@#*p?
AtZ&l? mM:*WSu@9\d1S*Z+1A/*/9JX?X$6=VY\ADc!%ju/94&>ly=MY+n>BhT9:NG=Ew5b1tt1JnjVcqRd%NVa
wLpllC <k+>p+mqNque6BVD+4*:il6ZE5bV85Zn15YH%BE?1B8:X/P=TEJN<yPcha!41ck^p4c$XL#S6THWDVYh
+X+ahT GGqe/61I1cT=6mT:1eXVtJeQ+uLT8NbXQ1Ec&8AImSW4a/lW5W@CN9at?!\Wh&&?B!Eqhlh%D>e>DK@A
CnA=4B Fblpi=i!5#D?M5SkaX>9V:@@B$Kd\WJc:Py>>/<Hbu@i6q?GC+HQjIL*l9kD1lJVDh:An/1G1ipyHty5
>N^b/8 dtlySWA5maaYQ&d^qq$:h@I?LcFFWh/8K6Fn9E<j6E+1l8w565GM1Sw^LYw%JYN<KKYjVGYnGeNRW=aA
ZVNnyS PaL1<hH5wJI\%XF6WMWpG<pk^V%cVd&lAbqblCA4?ElYkMGIG6hTw^E6FeMwDn1KwVbP6lHkN%$/F:b=
ncDaTC LJMYh:AyPeVXac\W&5wta$%y^bJ?IGQGZVy8TFyBV@A8Nh1WLnEVdDJX1*?+Y+?yV1+!dhQXdwypC=X#
a?lk5@ c&p1&cSmGhy\IWmTR>i6hBBdIwy8KkqhmjG$ul/NNJtS!ltwFKqQtdpWcCu5bkW64<GkNKkYDPKiTDhW
5BK&#e nlX!ABSGI6t+1b^RyWtbQcYi^Pkh+$u>lG4yRm$1&1LAJILblJcT#HA&t6BNXikLNm*61VwPlkTQ+^AX
an@YJ= lR4SaNcMKktX6\kQlIGVYp\MH59Rl$lBDYa>?8q5W*!RW:ChpDdFCdGMnAS+uKiH5p$DYDc%NpXSBH$k
w6dk+l dwlYL9CnYaEE5&&6ne*a*W/I<8PGMnIcKZRpW=k^?:5>nX*M4A$&^ai#VXc<&NBaenPQa=NkG%MZVA<F
/^K58a pe+KJ:IE^Ai#RwkN\M*+1PPma%HA/4AcqTWZP<1wJ:jIlk+LZbIHHVjeLm</uTm9/C*qw^1Wq8KwY*FS
/=PI#l @:L!m\WH9ZbE$ViRS#19DRd4^JT$H4+MX&p/ktPlHe&<=b+&dGXWXwi^L<XLcNpZLWNJtRuFW9q&FB6/
CcV$?5 IlGW@V&6c!tLl:A9ypjtc4eX6NjDt/!LMXHt^HceSpLN4d#ER1HRNytctRl9qjR8D+ahIuk#86Iq&bhd
=+GITJ C9+IS@SjSY&H=%H^*GHyTeWaCt:H/lBaMpwhJpm>1yKk!StVlX:u6E9TcjyI!kp?A%beC?Sm<dG9muXC
:q5Z+H 5M5E8/lbQPukR54lLpmelcjPwNnl$kY$5PwA1+P/K#c:B4X\=:5&nNZCL&N!wR=?<\w\@@h4Ij$8ACdV
q1i@lQ tE#Z\9e^TZ?AmT!YuHB>Iliq\\Z@#<L9mAnW$84=\:Q\tC&QP/4@%NhqVMYMcl4S$YPKkeQmlnS1c>IJ
ne6&lH SW9l$6\Pt$p:#84bCD5R<B*<qMQD1!\Lq\P%HWw11map6lm^^\NL>mySuQJGiJ>1mS&IThIwC:BS%u9B
EG\cR^ l:5D\V>5#:Bja=>G@6P$ccmF^dCM@XJ?Xjj?:1:C<q>a@F5c=dQmP6VcCu9!Nj$ncZZ*a5JCmN&HYH%j
K5I%ZN JtIJtNAHEH$R9yyj%c5aTqK%$BLjnC84yiQ&bZnL:phJ/!G+B^/Bl@I%Qcm#?^:CWwk>mqnhWTYSWY6&
Hc1dS6 u!Q$5+k?Y>S$614QI*aP5X4ThMy>BdELSd$jEjaGa6<8$*5L5S<X>XaT>lQE:FI>Xk9*5JXF9VBlc^Hd
%ZR8kd Y1dZkqm+1LiX5C:EnyTX8\+/aT5:8GSBMyP\6DRP/WEb^W/+D@Fc5dqVa#I/A#CIYH*c$C$>1mhpjAdk
6wMWE? WWVZKPp$:4$WC%8wKS%QN^T*lV+b5RE+nZ1?uyCM%kD<5iCQltTpB8A<!djLKA*AN$t?ZWbwAN+lic8M
GR$>Hd #kBeJZt4nM\AY$d!HVI1A&\n!ZjImA!\i$uiJ1M^\A/S9E*Ydk$MRmn9*>!!JTR>ZkPuCRq6Kjm+B5+V
>ZRb5p 5q$md!H!DmG6DwJ?4GHLCNt^=ZFb<ly&L!F6Y<!TEXhy6*#i&T%:6AL?SF#Ei9t!A\1GE$eaQ=BJ^TIJ
W*F@W> HBRIL%&C+98Qb=SEXE<tG@HuQicl\myK1qkyFNICa==ny/65^ejDEV%n<W+%pwu#VuGtcnR&NqKFGk4%
!LbJWw =LD&A==LFwYhS!4i1XmK:PX4wB$?qc?ZEthM:EZ$KKLP&Ht!&D5iRY^Bn^ahTkq<DiFQI9:THA6uEZ&q
=hSl+% cPF6\q=F:I$KF6=GjGcPlT9ab^aYLVk>/#dE%yXa<Mqc>NJaLa!59ekj>w!5l=Aj>I!5J=E@+^qbb=H@
Z&Dl*Y E<@IilZ=C?:IRk>:+V@epaY?>dJc#<m/Djt%:5nCPYWN#54w?%=<yHY1A<PIVTDt:>eq<m%E9kiu</9C
d$dC+H CXQHiZk*==9:>Y&<I:1N6$inY>#^+jiPD#?Z+&P>^I:mGH!E4T4$H%##P&Aj?+X/*/?LSiKdW56pHjA+
%lcTL& P%ZW1wQ>MMS?K@>uZbtadmm<Z?:AhIPHi@jLQ69Rn:6%%RkG=@b?91h<tN#Hk*%S*dL+QmMVGiF:#LlI
iAq+9^ T%YC*TNaXwiTTKky95ecmBJXyuNPuBN9\<jbZY$eDe$=MIcckKWPm+X=$ee<e!:!T^aQN/SNFY9WaB:Q
!4Cua$ cPa^CtEMP<kqhlRap:FkQ\YkEJ+F&6:m\9l6DPH1auB?BV+DR@C/h\mmnYFeSF@K?%8ct?PELMT@VZAt
#Nc+Sy H?\%>DmNK%G^1NSimN4HWcacWh!!<p+>yi=PXB!8bV#$a/Pq&P$P:+QFh5p%QX%/\4J+i4Lptuwj?D*+
WpPp?G Q#W:NYuQP9^F@EN?cuJK/8@bM#p%=iE9Vyd!Rn=yF*uK:?HJ@1S4@*4?pKa>K%^!?Cuu*<NQVnpi#M6Q
*w/C>p &1Z=m:!$Z@V@ja=9CX@i*4i?D/CBEu+c45>jFK%tV<=P&XK?B@?Ru=&ehjmL1DE:/@KmWd$<!ciIS@?h
WAWS:/ @JIZ@yQ>Yej?DeXMcPI@8mD=Yj4*<5Ki<IDK<@DpV+Gje9ubE6/^:>du=8JXE8@yW9:/:VY*D\TeN%4X
bEmN4R L:DuQ+t%=:\5Ld$?JQJLM@LZ69EYmX&c@=K<HdpR&1Z&L#p&dQp*S!/L1Cw9=lhF#JWZ!/<5h@&j1i#@
LtjaB< #^1@wp*/qXE1ph9i*!4!tcKY@VQKb?^=!/<kL@G@R96<1Q69hju%^9jQ?^#kiDBjBT6<5QFi=FYtADh@
SVCV=n =TuAa:@mFPA69>IWWCt@h+k:<c<?BSVnZ*WK8FX>4NwW+Mw4V\Gq<9Il:6c9m4\au<yVRLueuphicR1+
e!EJGZ bj*u9ey6i%:=4Slj%=<DGJ!!:Y6nTFT:^^e<ue56jTa<>uJ@iC!M><86+h#T%9D+k8Y=kp=8=>9lZNjK
>Tb=T& eC:<eZt9iC*ZljjPj\*Qb%8WLY::@?kTbXiJ\YK</\9*^QJN>iMdN8h#:X@Mn+%@EhNnV+&9Q=cdYLdJ
>$:*n< nhQ^!h#+E>6!+?Ndu<I:Q#/?JV@?BN:H9=H*&5L:6l8M\iX=:9qmh8%t<nw^kQ6QZS6n+m>@%$S+QJhn
/h$I&^ +:tJeQ+8B^6ny//ht4iXVyEN&$bh@=l9#JhjQ>FBXl/dcM?9S<R@^n#?ZjQ++PHR^yne1$:Q!4*4*FR<
j\RZpe *wu$In$Z#6LnIKWZJ$9+k4!kZ<%i!S=bQA1NFX\4$!u\$&=K61hqYZaXZ&\y>?mZ&CtY+\=MX4+&k%$?
yD<Bqe >t?A9?T8Qw:<p45a&h/q^<%@1hSitd\5@^#:N?ujQHMX#W%#86t<N54q=VF#iNhuKd@pX8HtatKZ^cTK
1&FYtc @i4?#K*QuAtc%eIC&t6>khZDq>%nZjkC9Ay@Zu15C!?!AH#Fe@L#nD$D#%a+8F%iPJ$VL*</>JR<@1Kn
d6LSpC ^lA$5@Y%C\?tGlVD$E+wlhP1EHSKQKcb/aR!Iw>GR@Ck^A*%iEa%LZqEGwIE+4ej!1kbqd/eEGh#HM8L
-A8:K4 000a59b9276001202b3 Page 90 of binaries1.zip
JlAJJm /5q$RyWudPJ%S\nGWHQhZE%/m=9WVJN$T#<?>4Y@ENk5Z1*eHlmHbh%hQWjAB!>$6+eQI@d%#9*>B:C&
5HB5<^ j^5?eLkjGF9ZiiDkQ9C#Nm&c*AABNwlyK/b@kPqPVL@Z%hY#D<C*X894/RY@d&Nj@?EN!B@6*h@Sn&pE
t@jS=A iR=*?FJcNNEK#Q<hVHhm?8Q>HV$dkAX16cky$uYawn!A=bkwD@TItRSklZP?N\/LA5D?!Qtmt64YPZal
%NWSW: HieK4BS$*jP?>8jQaB5&eqnT/&6@>4L9QG#u5PIqZ@6#CV?Hi#q5NZ*6E\Eak!/Aqh@%6Z>8GuKAQYPX
!/=$ci D@Y@!*+1Q1lijci9@dFb?T=lpXM8SpY$59Mb$b$e/k*=p8S8D59Q!6QMHPd%!<QlJ#m59PD^p>+W?u<w
1ehE*G cN>Tw9?h/C+/Bj=:w1q9%H&L/D@%=I%=<9/Lt>j9!i5@=?aNBD%=9?HtDS^*<>d5eQQY9P9t4j%c<SEF
Kbi:&i &JN8*41et:j8eVh9*Y?:ii8iJy$j\FIPhX>^atZdGK8uMLaV:LTkX@$#^iwqRT@?MhE9Cu4=e$T@RQl@
m6LZq5 E9$<$biJQpM/L^L>i+V@D>HQCZwJ9Z=k#^JNJ<u5GcKy:hnVSNPZd8^#=MNQmQ=>\8<t?9NE$%p@8$!$
EqS#IF <=dw9+q&ZtZPRBVy9WV@F^^CP>?lP4=B9y$u?mLS4^H>P6F@VjS4SQ<h$SiI@nim@=LwK$S@ZhA41C/?
emT>?N 4^FNL&b<j$W$?iP@m&l/ZiJjV@RDSG<kipDRt$/L6ql>pinjFjVc9*H^&>>$eV:q+uj@k+6@+l>hjPNd
?Xp&5d L4:yVljjFQZk::n+=mEZ*/LVY+I8\>CNGuwVS^?XB\ukjbal*y\FpqyTZXD<!LCM4a5/5/#Z!FKl\5W4
LcWj@N hjG=lyJJYC5IMb**:AXR9B&t%\FFwtD5A@:+<u<BWE5DBBRAAkAIAGJXdTWKV/6mqE<AAAB:A\A^AAAA
SH%G<M a&^ybY=$e!>\b*A9dYFnL%BHWEX%bG>!aXB5hYhJdm>RS%B\dHXucY+8eHJ1LtJyd8%hCaAW^hY8u6ub
Y$8&:D liXeL9EABqHBC\$wI8wQ!:Ik5k54C!=i+LA:\MD8#nk#1+IZtqNNnMcw$Zmj1Hllaw^S+=paNWbNFJN+
M@mEuX JTa^<ayHD8QF@:/1%%*he#dMkPBY\h9??uXNhZjX1%i9ZqXZmV=NM=wT:X%La=%nE<uqa1NDa&NV51=q
8:d:wi b4&qYeFXhVne@9u8A?=e>*E$#\@QPGQC/$K$^8Q6?IpR%lkSQHKWCB+%T+kSH>H=jC8kE/&L6$XdI5qp
%cGY?e LJ+MN!Zn!/P6chG6R5kTG#daJ^5&YAmA\!$up!/=SInJG@BQYKJubYP<M>IcL=StlSkn11&HA/8ha$ck
$yl!4I yEPmX*P5I>EiDW?NSlPmY\bLYCaVBATNCH>FAHX&$E>ENX?44t1K6K/ILM%Z&WW99n+&6dIn%@W?#T6V
Y!ETb1 /YlHZZ5pqa1t51>ZV8*1dG8QFu1<d^JhJeT8L\pTb*u?^+/:P?:?a\eh@uk*a%Fq!bi\qHVnV\>d%GYa
N/eNkb RDTH4@:B?kI4u1ZVy$wwRyG^1&LhXjS<l1NtNwWQ1#&mF6T9MbyP^p?MJqip\whFVwkIMjXYIYy9Di%R
/j%nHZ @X/w<5*>hl6HQ>ky5F^56/!6jTull=9u#cZtS##hYD>:Qy*dIt+W4%G<Z:VmhVT9$RSjwCdamlw:Mb/w
dQR#F% IcAi:p?8yqqhcRw1t@w%d6CcK/VTEZ@\!FKA@w+yeI>m%+MWa$^BLSe5eL*C5kQP%li>H:*P/XIQb@?%
:\DJty *H<5I@&?NK9H:LFIc1\yRk\+XIlBjJ=VIk4alEhc>\WtB\iLt+Rajb5R/</q&MeRHWFpERYIkpRlwp1m
=%\AXJ K1IiSD&J1wq/EjWt/pQWq/kjWR*SAKJ/w1PJFlIhS>SK%Eb$I>Ecwy8Idmc/ninHSHeV*Wj$c/KumZ=D
WAL1A8 >ALSi1KZmF+tikXXl&kI$ZbER+t&J>wlAHXADV^StGmp1LS$5?^G9buSu@4RVZajP4wphyLIbe>qeZw&
LENYaV SyNLw?E=Zb9aqb%Mwdcy1WGYR5Y$llpLYqjE&6A:dtq81lN>*a>cQd>yb4/He:$cmnLwKItky@a6JGyB
$<YKhl S=$wRBRpClFXEqWS>TD1TXSN%I8wN%Ejw4=E@al1mAaRDTccRZR5WaTwnTlK6IdwJ1KdmY+l8y*wd1Kj
jC:6Im EN%Q>DVSd+miIXyQ>CLS!$T9EL$KbWe$lGk:w1FE&^Q6RLRV$RmmeBBqThjwFacwh:P&W>ZAGm11=HF:
E9$Z/\ JiLYDtlw/dkn1=Yh1K^^HAa6T5jl#B@B^/?w*LdG<i@DuQ=I94+#y#?K::eLy:<4^>?Nn/NFyV!P+h@6
$%hm5p #4@dR@TW^#*q@V%>GH/4LwI:FSCY$1/H:Ncqi+iR5Qw:@4J>/49c+5qISyVE$pS>iquu$m&9$cEPM14#
TSTaTl bt:C1%lKF!&KhedT5Wl:dFX$a>&HpXnuZQqu&mc>>cJF/YlT@8tIhWdT$a%PIL>bWiuWMe9ynYVtnqlI
<*&uih NJ6wFqGA1IIwSFSF%IPwJ%E%WT?m*pS>mQwT>TQ1V%SDNJBwENFkwl&IhmVcmYka$ZCmEWSlwyFEP^PN
tkh#BY I61FcAJSR+Y!:q1IFlBhVuRF$bXEX^FhS*RL$X1mhWTQED%K>BnSW$VQEc$uiyHw>>JCFPJ*SM<V9eB&
m=:e+N &VNE9!X/pin*R5Z=DYWHYyLu/LmTnu?p+$KIA6F^SKkYL^G>VQRK$c6CYcN@I9w#$i6Ej!H/K>G#SH<n
JB\Ijj iwN?6+1Pj!j/B>FQmi+q?luSjWR@J41H/H/mB+l?V9Rn?p$ZHZ>C^^Qw?CAhn!I/t8kawtPJ>^B5i1JH
p>DJ#H mB+qiw#wF$T@JH1e/FhEV^DhVjRp$XQ$8^Qy?G8my/YTlwKGewbmlqKHAwh!ltKGWwdCF>abW5EL/$!m
TeJiGY 9amYE/$kcmimjwC%N>Fawu&I>yYNBlwMbZ96S:R@$RVbYAn4AKKJSF<qPyBwp4LQ4F1m1WS%SAin$lNS
#e$^FL #dH1mcaVHWV$NcL@I@w/$R!mV1I+EjWb4iPJ!Mc#blIhSnTL1IGwpYk&$S!mJ1LDmR+ltp9WVQRNwuq\
e4wmd$ !lNSQ<n1SWSNw6YHmJw5m=wum=yA1^>Sj!J1*1#VmKm=5$+u1mFcRpS/$XyGFCMcRDTRmA^Pc:B5qNEk
jbLhbw w#FGR+^GGA&\5KypA+#GX%m4biPLlqiIj^K>S@R?$RhEd^G>T@Rl$d?I@p*$J5W>ta:9$QEWP9/Hnw8J
FcIW1n YwucmKA\@p9$EhH@mD+t?wVwW/LQmD/H$+jX/h65:<KiQXZbRScc+!8I4mT/m8l1wp8JLmi/l8lcw89k
WV$QQX I1K+TVyiSpj$?K/u+^FELWRLmI+p*k%EN^K6ITInY6^MhA9SYmL15a4dMKlC>EPmP+n8yN@BhF^HhBjS
&N4LSb D+mw@AZJlcC!E!RDktSHVIK6TEV!I$l?BMtXIHtYmy*KZ=BeC=JqRdI5TJaF!c+kYSZn8DhJ5mu&==:p
\RT>>\ XI#FEEFdp<\JpnqBMmbIZkZJqTC=EmSZk8SepJ\LpuNBem/kD!njBiY:cIQiJmI>IbD@JBeC:iXC>GtJ
q1><M# TA:F<Ykd+IyFd=cI=FHMSW?YmQJLIL?wuk81=+L18TCbEmSVAmNaXPeEByZR>$d>J@pZeMjBb$I!LNCu
T*^P?& y:\ZqQiC=E/R*Iu6qGEwTB=qB+npV=D<CbI@MeDX?>tX&>ckW9@TnK8WVcGRJmLXB&pK>pP*AH+FwtH\
lcc5C> FlJBbpqQTHPN/wPkim=IZ\nTJhI5lIpHH\QXLjFNwt<SuWX$NlHXbWF%WJ^D>G&m:^BSQSiRKenA^WRy
DIKm+W ceaJAV$I@RZ>DN%<Gqw$IukbTWeJ$p@mZKL9Ey%HhD:S>+k8ICJ>I:=QhCHSSWVR^/k@1D8udytP1VmY
y=J^&T /DDXA^FBhG$5Id6kbQcKH8k*EXWV>TL1VhTH1C>SQ/L?SDXEA+t&I^yK6D*SDpR:Ek&#+Ltq5mAKE+$p
9CG1j6 &yqwHNF+wqqEe+utEdWRLTC/nPl!wm8I4mT/q8ltwq8I:mS/tPkSwpiJumS/q8kFw9XEL%119SR5A=d6
\SY#>A V<wlQ=p!+JcuZXmt\m^ZNT!Z64^t!4E69:6#Hh!V=ZBHq5qh8j:9^dykd//9a%qPS:4pe\@YEX@Jw^MP
/bhEbZ aLJ%l/$@dB%RmCbu$BVYTZXMM\wacM4>FjAyYMZnlXniSFb9Q<9\XiM#QE^Wml6Ai5H56D^nQwGM*?&!
Me/n&a n?q@8RyqkC8Lh8aKJXk\K^k*eAWV*PlWM9+YX#nBnZMQ^k>^BSVKwHWe9l>\lSVKwFG?ADbC?tkHt8%^
#9<L+L kTEqK/6RS1C55EIbbLLmCnXTcVe5%4%epaGj=\wN@A=ZdL^1mC5+<E=e$aEuewWHu5$XH#nKCkD+hK:+
&X$:Pc \Ji\AkC?lbWC<MP5wIBjaTWA@C>YP5nmKqaM\MM=*+Eu5KIAu5*KCnnGmkd+c/^wkC>ulRL<a%bE\E?!
+Em/>B \kJ?uSYQWQyjKljkEc^kkGi!wkFi\RwH?F^YL5C*5RIEjyKXGQAd4M!E/1<JhumGl4MMAW>tJReeaYWH
XD9<\G jCa4QPB4&cACjwRNL8C@5PEqqLNVGtdAaVdRkA>lR\%+ES65\Ci#MkV?AT6F+H9akAN?pa$^+QhaYWK5
8>TuJ9 ?:B^B4\QG&uA5>laA&=nw\*+DDdekK>pA\:+jndpkF>lyR!<ki5X15%\N6KAD&LDDjkIN6!AW&#AAX@E
tldk!K ll#\V>tkA@+:G*cwj9*aTAM?kI$%+GQacAM?na$*+C9bIAS?mA%D+NjaRER%4tSDEZl9NlmBt>qABF:J
QP?15L Bmn\FY!kAn@Klm4\G&#IRl%W5$EL9Bed65DN4G8A$&#kAq@Elm:\#>nkBZ/NnXjk#>mIlawb\ea5<HR&
wI?VPp cwGZ5uEL@HW&ewF9bEMZ?Ap&iIHjaeMZ1twkG>dAB:L^CH\5G+@AcVawke>mk^L+Kna5ki>uA^Q+D&^w
y4p*iJ C8ZwqRau<C=5QAJQb!MTPM4GJQAb&1n5i^pd15D*5MEK@C\d45D95\EL>V1ADXukeY!+A5>q\^n+iDce
/j:C%@ ke>uA^4+Nnc\kb@p>kD+DVc+wdJ:5PENQIwNd?DJdIADL&SDHQlWN11B9<@GNjAhdGRDQ<9GN9DddHRL
phAm!E =RPT^nh\tA%\+EQaEAe?mk%!+FX5<ANj!l$@+H6WS%QmJ:knC9\Kh^1B@/p/wdIJDZJHFZk\h&TBh?MP
L<VZ!P LjAE:6kC#?IPL9BS*MEFZ5+hZiBV8W$FQp>%hCZ?IZh\khh!S^j+ai:\A4@AHX@kN:pDDQ\^h+VSVQdn
\FBihq DnH\eP+aA?@BHYVkTh^SBy:FuYZka%TuYiI+h=!BV?ePNQC=!1pp<SZ5hAJi^\+m+EiW\$um>i!WA4ch
/^dXXy X5Aj5@MK#Zp%P:GAS:A#C*k5P:PA@+?hY5CH5*ML8E$=6TTP5+$C9J1hY5AZ5ZML?Gb&ekE@\M+8+Kjb
*\eaZl /RZ<Pn8@kD>kJ^n\=?\Mk>uSq=%m\CQaMRc<4*KRTX#HVnLkb8W5p*m^elBKuGRHI9C*&hpHjK%!Hpy<
t5&T*J Q#5akb>uB!V\&?!IFG1RVnwpkai^a^J+HD5tkR>qB!X\SDkh4!G4&J+DQwehp<DZ5IMT?AF&XAK@!A=L
/a>D\l +A@aeRtV1\e:MIFH5TMViCI:NIEQa<et<HH5+AR?pb&e\Pe1b/jEN:LDE@l?hu\CQ/ieX^L@ub%dRk%T
&JR%Z1 \lEq<jdK5TZ^iHb?Ae>m=^n\aucTAb@E#nLkC>m8BX:DVnQkB>l=B4!iuYnA:!uuGRL/$>JyBn!WuYjA
ybJQ@1 ?:EVDZk&P>PAq:FVDjk$h1+BZ<JPN8Dd&NpG@KB!8pu<knd=6*>H??LlJ:ja@6>ltHLGTV!iuZLAl!yH
-AaWR5 000b5c55103001202b3 Page 91 of binaries1.zip
KWP&^e yMRLqcNT+1S!Kp4<XddykT>Ynp!Jd%KPVwu9XR=Qmb>Rnp?JZ%WPWIujXR=RmV>ZnqCEHY8WR%VmZbRn
N95F1\ XPJ>qANW+muKET4^EewlK9F!=SmX?DVqIJZ+ZPWwqjlc=VCXiJ%!uE4<kHKkT9!$e1SK@Ky!yp4<uuK1
lMh&Z9 ItCR%GL:j/iB*LeB*qp=6!Wiy=#jEnewS:ZE4e4^LjGy!np8<aZKiT:^Y8XEq@ll=W!Z?GZqXJj+A?XW
W4tlh/ S^nYR#uZJS/yuP\TV%LPhaquKci/^I8Xe%*m$=TVZiIjKGi:^P8W$%*m^=Z#ZiLZ>aTHaS<yb:#$%%R4
yYbYmG y:#EaiYeq@kA=cCZiLb!%E8<XDu4JV=XPi$q@y=!#E8<Snu8Jj/Fe4JL@Cjq6Jh+k*L5I+#aWVu?Jb/k
u9LM8S BkApdqIDASLH%aCA^N>TA\ITZ/MGBmV?8SwkpQkqNVAk<j61RAAl*F5NDEm<q^wkpJkHCmSiykaMJD=V
wY*t<B DS^IjDZ*i+H9XRMJEn?nBlRpjqMNLCCMDKuBBauDcyBB+pQWRIQELY4ARiKEeylLjLb!uE6<tZKkT:!Y
T/9wZ# HiuA>/8BIItjXRNCE4?8Bwap@yAHmIRcX:Qa@6>=1B4IpuljNcAq<ZRi&AI?Xk$pTH!mGqCR?L61aEHm
\=qJH? /*tAAjk?NRAm<R61IEVm9/5BEap@WkMnCKN/58<AiJkcTJJ+j#YkJQE5NdAp<YI%$CQ^KY4AS?Ij1IEj
/t=wpi mhiyATCJj<$DE5B9<cAE<AaiXEA*9k<Q4kH9^kN5\JN+kA#+WB+IBI:\aCD\!V!aB@^hHwRB9w$HawAj
a$#Vq> X\MyE4?pBw\p@pRNGmH5&p<N?pk<VA&!TV^BDdSJ*KRG!mS8W\NkEu?XjT:AX/6BLIq@1tcLt:BSkTT!
wnaTb@ j&PpNV!uPh#WXBi8&/h8##$*heaTqitC%cW@ptjK\*#4QK6u+PRMh?H1M8hCD@i5KBQej6uNQJ>N#W9L
A8S/:S hM1:J:RCHt::k8WIF$b#Rt\#&pNhnp9aHw8$GdAun@Z<HDMP@j<<1L^G?8j8&QLutQ%ty=j=<%PXp$wc
#4Z&Yi Tei+bl95#l*<X8+$Z<PGm#&!jD%*4C@q#9?F:B!+nJ$*=:An+^5bw+4u<pNh\a/hti\<t<5PNZ5EebWi
%k%/lL SbRG/GLZmPA5=Z!Yw@W:5tHbX#uFyjE&uS*i8:EV?b@5GP@Blt%@qW9TWN%JPjTqMb6YDtJyuP:Ml8tQ
Xp^m/m 8DN?N*i?:<p^R<R>M?VBnbn=\dM?:Bpj59Q/DHhYu?QPcVM:SDNu^:lu^j!^\K!ZID6y*&NH:/HeGb9M
Qh<?Bi D9AQ8BP&P#95>tBH>=/8$dT4>cm/uDp^kB*c@*KN#E%nb@^B:N!j^$/\R>kbj#A:/Pi#I@eIh8L&XM+5
%YX:YI PS8Db/jIka+Yh6yY8Gak<P\Db?dBM6e5lcZ5ML&AHXu&1QQy!5E1b+#aM$W1&FFyP/Tu<kBGP#6LP:pD
5udup% &5HP$I@bRjwjhq/PbCj:j=WDW>c5Ci^$@aluckVbtY8Q58:QD4\h&bq?qi1$!p:cJ>^B5&hijM1h$5>+
+6Q:AF q5@iQH6uLM@\ee?E/euP1#W<I/cKb:?EiCByED6^N:AV?W#q6JVK+G95tL&TuaLu<+DVWh\SP=buGI*p
/nLZcu &WGnqINhh4R8a8hiTDukbajLut$\kAe1LP+\D8EByaE=btH^DC\=?GHQ\H1VHR>95/QlZS=+t5mP\^&$
@l6<9I e%<PjE#SA\+dGT4KML$$RHY58t\N&1bPu>/+WYu*q^6!X4X4?FK1nGw?>qCjW1hHbw%FG>9DlIy<\?Rt
Bqk1n/ dHya6CmXnmT@$HWGwE/cyFw^<?@FwNF%e/dXn\/Quqa:4=aPVVQ4=w*8VlpR!NEDH@6nd=\ynn1weI:b
%$Mi+* QiPR?XBP8VR1lnnje/nQPTbMuDY&Iddah^L+*mP%4H%^8S/y8E8n:A4i4/&T>#5+\b>^tw?VjaY!jy^5
nSy4*G V#+e:E\?uBbh*LW$l:Gcb@KlXY#!wi%+<Z\RtDqZWykXc4=aP<E5qGCYVQtmhhHY6%BCqj%^?mb>uClD
5dPt*1 1X<wCu!eKDd6+<Te16dc^Iyl8^uMRkpdy%uhC!X51qQIQWkln4T?:%$w\ZV8VHAL#YaiTNQcIJe5F8<N
/mB\eP iL=?MRcaMeCe5QW$@CES&I=/SGHX1R?4uqF+Y9*W?VQeQje9bKWG$VS*Vl%QbC?jT/iaRY\c@qIc@kLL
NJy>+P SAS+NSd8Si9G*EjD*/Q5#l\VCqT%nSma<@yGAwWM<w4MKWGtPDF+55q4\uACyR&?qLItnFPMY>?w>NaT
V\TJC: 64/e!j<<8TcP?XEDkaA*+aD/jwAH*K9kGtmqhu9C^FullqnumtnT%HwV8qMk!i@8N1I%cXJ<<jJJSlc/
w1Y$C8 hVCVNJ#R:ThyGBp\\Y<\!/4KWMIeB6h$GdNCE4Jt<N\=e?c=tV&t#&!w4^Dm<Bq#=>6#6c&1=ulZ5qX/
YZIuXj Xki/?L$1t6NhtMyp<a>t8!=Y>+CHep=u8@#En!MM=tMDH\N<4PBnmI>XjLTjymej1@uam+>>?Nmdn\Q=
$\<K<u &I?Qjjuau+<%4kj5Yht<LJKM64ti9>q%8dLQuK+p>hRYJ!QJtH#%C6jXAV&cy<$K%<YVeBjIy<jKdb!M
KhGh6N QGK=eB!^%LV4l+N/+ai#w?pV+<pXR4@=:#tN>j#dq@t*4:l?P:AT9=$@$@Y#F@quL@DQZ8Kj9i#/&iCi
IewiiC hi&^cGhc#XP#H@bFV5G?+T9<!%hh9\#%uB6NPWXj!d?a^eeJjB#E^\X<dPE:#HYqFPnD49Z/^8dcJ4!B
bXtV9W ZhR:<HFHQ8:E^&F<HP=KJhkH#t>*thkCMwKQaV/P=PQPjB#F^%*+LWj\<XlZ/4&DmTZ+qCVk+9WJhpV\
6Q<?XV KbW6eJj#<Rw?Z5uH1@l+HS?j+8N#jL!Fn&9=8I/QC%**/qjbG8@wmPM4qmBjjw!Qn@L^pV%$&QVSbZ@c
Xb6RQX \dJ!yFB5MWI<E=\$YPjAZyRRu&4lM!=<bwJQVP\FCh&LEhwLEh1LC?IVJ*6SRu!Gk4WD<KpKQui!F^t$
/6D^Ni Q*jCy#u+hMt>aCb5TH#8p4t\1Q*b$*mPM+dV#F#R6BAhuEH+XA1jb$%lt4cS9tN*!N^9TqXDyqZP=FNl
IMdIS6 K&S94jLYn1dyDWLZZ&+5^:atdDmn9T8K$:y=!Wlu1n&Tnmh^&4m!eYbn@j^$4D$%6lX^qb15:&^N4p!p
AjNWT\ y$ZqRTbDce#5yQ6^ZPJEW1uE5tRpFc&L6C=VmjQ99Qiw+&R!8M&^yb$b4CPm!hmTqSuM^pluX/Vh!<S9
PVHXu8 I?t8bLR=VahWa#TX\wklZhH^>IQcd>WWTca!InXSJeKdc<:$TC9>ZaqwLbFpb/^#cY%:NCu#aG4>9F1X
>tJaP5 T>PmHZFCLjFpY$5!p8C:1PJCM#p&tW1&mtlHKyKI:W$XQSH9JJ%M9?mIhWVVK^Q$FCK=yQW4E@e:RKGJ
KXRmSI +<aScI$uX4bG$8wi$PA#P>QS=JJIc^RunbH$Muq5dknQ:iyMW%LW/w/%YZXn:dQYiGe1*l+ht/Iu\e6N
tS!DTh d$+5YlJQSD5Jp>SMm/bYyPMJhXLjiWI5TjH=:AS/VMa#Y!W:AV\>%l/%5Z!t#tlc^Y1puEB8Ae?Pu5l^
L6@^t4 buh%WFG&epyN!VkJbT4Ky+/a16QthJI!GTj#KipJ?:tEN6cyMyJPP!K^hqYKmyXHA8R%V:qJn1=ME!dP
&>HAyD Rlcy@J$\eaYh1*ZVG?G5HdNjdJ?Jdd5:th4awm=\j45!t*<\QbKp*!^!jwQ5Zc^1uw%J6lI!<#KjRq:%
XTVePD Cw:/5j*T<5^=#6cy<=LSKKjMmd4TXKuXLa6$Lw&GD+&qIMZ8SJ#ucalGX5nutbT%Z\FFC<<pcW&tMiR5
<mCyH^ ypdc&?Q^#9Cl$Zc/ca5ckybZ/IV1j&8pZb:Nnc+ThK^NhakFhZPtV*iu$XV9Pe&/y#&y*uX4?A+dt%w<
iMBCww y@dN?aS9nnQZDZCc/\dVy5/R><m/^1Q?iDD<FkZ1eMJP<dT&4cB#=*RP%TSdd=ASAVmQ1nR4$Qp#/W=!
>6u^#u 9>Vc>ua^CXMJYCIA1dwwkB4XuIm&/nR+8dw+%c?V$m4Y#Dp/N9SbLB&V>!FYe:wNZHeMN$dcS<!d&8Dq
n4jK6: pAkwlnIT:h8m=miV<cV:Fb\*y6k5MjIFI1%%ZTSdHj!e>JJ^yDp>qp!q\<*SyS&W4ykWGS99T49!i&>Q
>AWS4y jp@K?LAmm=EuZ5/m>IwSQR@@GKk#*4p*V?#I@AGZ5%&/nKSA&ekyebpljMuG*w8!Vun%kq56TEh\%p9u
:4t$u4 aN19piic<@a=LuPYTbe#@tc$TJBIbEidjG=9A44J!ujXybhICHT:l#N16XP^iPil$WldNKqa6Y$hMciP
DXYS!u 1Q!WD#ByW1J4<TSZy66CquFBMb%ehq@N^*VTCtQ6pX#yEd5q%nq?uGD?&GpNDZk+ju=H//4uqti!ki95
\S1dhP \q8\M*>T:1I5YJdFC4NAchwFtjK1wJRn5!qHbqP89IFKIYPkuXJZWJWju%P$&9$<J=tZTam>b#pmWM8Z
6d=Di9 ^hDSGtyd$<lWctapQCHc*J1M6:hHp+1XVEbYcnTVVA4d6t8wVcjJwI\5dyh6ZeQWbD#T%lyJyjtu49Q/
b4eMZJ 6ql/im#c*ma9%EWT#m*41HMX/Y#nu>BbI1J9ANXF#!L^6Ek/RlbINNKlVyPSydYhdhPT<aS#Qm?TYmFQ
Na5Bhd 9LiDVyXkS8*W?EtM*M>Ab<8m4T5Y/+5hdVC1yucq$#1K+nX*^hJS>*QN1QZidWa6wnZGVwy%85:q##LQ
:y?8FS 9ep$^SNhCS5ua^&S=E4>8E%h1YYi^&tPWmy6unn#a8u&1Q9GXIuc+mjc%S&5bGSJE:Y@S<TWAhnRRNbH
HPmVZX 6JP9NpW/%TM&pWpad+6S8!%QQjJA4bu:5X$qw5^DCihFF5>I^9q6=pFAyQA$W:t!>c?+njHP?I^wuC^6
/&EiC? bee#6/5>HY8P6phddVtRdPiln/CPqJPt+9Cq?XK5q@Jn#CibPJE\DM?wt?F$PPc#Wh$ldZ+/y&KP6<iV
m#C!WK e!MhCZXP8uMbtei8Jy&+5/I4TcbI4NYy51\dq<yuuW?&hed%8hFIJ^Wu9\!hL1Xey>/kQJ6ZQ\?N5%MH
i@1=>T =?PWdMbaY9/+VujiIGb5W>b%JXQKCLBN^cbIt4y&68W@LSbyn!?%4!iyV86PFuEP:+1%4tmn9QDcHFT$
jFQc1a 6nGVaeI$^D1n>b%666tmZ6k?w$:DTe/JLHb8T$nQ<eG6Dmq#t1NJimK*Zb*Bh%y4B#kYn45u+#!K#H9Q
aCd8iR 1dKj$H#aVnd*9X^J8ll84FX%qlqBQHaWbmTm8XpMub!Hy\%Z^^ZwQ4F6HNi=?*=Q/MdpCb:GAt8ay:Fp
=>1uT/ #Y8bVX%dwW#CMGW&QWXdT6T&w5NHXuy/YW4Mm!TZStEdy6Qw/ApIS4k^ppnI5/qh5jc&eQ%JJLwywTyc
X:J$YA NBqY9^HK=wj/y6<p?bT:h=VR9Ka\6E8:tDp*QIeWd$h5FeYTp&ZndhEb$W=q^<hTtC4e5dmhL@KVA%Lu
VYpj8X RS&V<iYpGLkZ\/qT6$djG/>5y!4:Ci=WZjpBcKitdEHPV%&AGRY5m8AJ#%u&heFhH8iB?N#JnR\#I9eY
b$!E4t hCb5M<GbSPaTYSNM/EbBi&HMJDIV8uE\//5KaXc!&m^lK%uJ!1^iXGcFWdF>jw?n4@AqYL%w<*<9ZV:B
<awh>& #j<XwYiFl4:<1ictLD&bZ=HcW%QNb/Cd$D<#H@ta$D&DHm<*@VMV8uNd<CXaT/y<yp^qHpMp!G6cm\^:
EIn%pN QYP^RLu&8*i9BltV4<4hEnD@QPh8CRGXjqZAMZ$<mX6XK=&*lWuW$$e<8hT&n*m+jY<j<bA>jZ#E\%Vd
6eSeeP 9n:maVy8Q^@^MGY*9+>+tNJd+!Miy9\P<BEQ$+IH?amHceSDjMVD6PQ6jMVDNPVBiiIJX#\=QhqHQE^u
-ANuTA 0000faf86eb001202b3 Page 92 of binaries1.zip
qhMq/% *6=HQE^lH8:EC?S>Qp!DH8EnH1bKD@MSD%Pw\#:mab4%TB@^MJX:qBM9GM\ZD%P>D<pV#=$9aV1M%9H!
M+/R\# =l?thI@^ER?:CW#R=XGSV/6lF+8JQ8JlG:B9/HnBjQG\ShnRjHLkmwj>a4/n+\Z!^eQYan9qid:X4unH
&YZ5Vi $iECH@iFQ4#K^@6Cb%:6I^=&qyu5+::aKuKtn*naCiMDH@G\$<aWH@G\<<kiQ8KlLd9GS##5I4P9n*na
Bk*MZC XcdiS##5HBQ%ER?:!/S<^MMPNE6<^MM8NH9=mLei8/H+mIh6&H4+1B@a64G*n*m9aKeZH@G\@iG?ba!H
5Btn$# uZm?=?N>5b9QPF#iRMHEM@G/TV#5aQYJn*na?Y19M5dD4q1:F+6uX6VK&jj:M1!wbZ@1*b6/wYy&cY45
@*HXSH 5kJ8dY<H*QMyujui&/\itD65P+6@ttXnPHV:bYP&9kZ%N8Yd=$CtiqKmHbmCT=c#I:wJ*VSAGGD=VXHC
tI<+a+ a8VB!IM6D^b<+jJDA#QadpI*Djme9J54BM8M6b6kyum1$FQ8ald9KtH1:yhkV9ntu?Jbbit65Va^!DuY
AVH&F4 Z?SE/+1MLQM%SeJTW^>/?wmH>K6>^MQWl>+?+tH1R^<j<hCN:P5nH1a?>QMSD#*p@n:maiyDna>+tQw\
^Y4H84 \Ee<VH$wPkZBWqMjB9qI#>jWB$86#ndES*1aI4Ghn*la=Y%:H@jF%IhlQ6LD%IjlQ8Jl/5MIH@E\>TH5
eCXFYH I^=YtS9yI^=Ywl8Xb<nSHR>VJHd^ER?4&8&cd\nVFT>Ml>%<^JP4+@pwD/!+N<bHQK!wq*e1lT5iX6\:
&Z!RT: ME<<>@5iJu^M+cDLYE8?S:ElY$9NGm5/=RK4XRwjW!:wMqbL9eDHjX8En!pZhHtB<DHq\qJVS+d/8P>q
&J9A#< \5jWDPJiLu^M#TD8FeLH%A#mZmq<VM$k:4ZC^>RMT$*%8MbH9F8En/pb^L%V?JmcRh!Hla?yGeS>SQma
h4kAnN tpHeS+YQ1SuEjXL+tJyB*Gj>VM&\=FRQ1/4a%AhLVjZw=TQim@T*4+>+j/C@i@tI>*9/Y?Mn*8<\?hQH
PCceGu ?&KI?u5?+9%K?Bn!N9FM9G$p*lQC^>RM+n+8jE!=&Il+n\p@W#PEu:&VMMF+>y#b6a*%a?5Z%PiPM<Zy
!HK9le 5&#cF*N=J1AHjZb<kn:ulkh>#k$Q?y\dH9R=N##we&=+$Pje<KDQ8iFBu*QDk#:ulkh>#k$Q?y\dH9R=
CdathT N##w5+MW>Dp*QPl#dulRLZ<>Nb@l/a4uc\==$Pee<1DQPiSBu*QIk#:upAh>#mEQ1w=Q$VupRb>#!IM?
=9*S?% ==BV9Bq?PmBBbiBQ>BEQlu9SPiSBNii:1IFQ<Sd=/hBR9ImjnpyR#jt?!5h:SQ%$XIJ1#9hpH@i>!W<H
YLiQD$ JKk/Al@+mHiLu\+I^d9hV\ep1Pb<Z?Mn*p@<hEAw*9%?PmBBNie:/mQid@^$RIJ1D8WTH@HY??tABFXH
pQeCEh IPAnH8b<>@Rl>=n#*ehH9Fjyeu<j<X/n!@8WMd&Z@HR5k1wDW6SkM@FM9C>b9Bj<hECCc1:=ZtYM>/!j
lZP#G< D5ltmCj%cdumCdPE$YaJY<WTSn%MPiRMwiLD%P=lcB+mumLEkke*j/t=B1!*4pt&iJbT9wj\<ct>G6$8
8R4IbD bV$l*#PAQbQaK&$H#iaj8ue9uCVMX!Gb+6LL=dAdKIV#ahXIX$P%n>A4L+^*8hc\D^d9hm:*\:LXH#4K
tYpE@k QSp9EeKyDtt?H<J*lZL<IF\6qHMH+WhCPQ8e\hQbn@F4Rw%WI*\wqFMG4+F:DtA<nN<B?ACl>lwD^knn
eACPdc aMd+eH5Ia&!<6l*n4\4qIAG?RCkuCQCqRnp/kK<VcqRa?A/lHB9AGBpc^lnG$ZDGj^LK1RH<qqCPC?B@
KDK81J ej+Cj!:W!C8KAZp<mnHicSjG8Q?8nLFZ&t/MD^J1V#NknI/Paa#<*=$^P96:MMb$YX+!MuCcWH8dAb<6
EG/ALw %B=5\BeJ6aec<HXe>5B+**$b*!9W*t4A<B/Qa:!i=RQ+d@SuQ<aw4@$bj\buC?5uqQ<BnJFQE^un9R=p
8F9pc8 *El@iLbjEA/Vk^lDCS:M?E!YSYCW%@<^SwiiXZ9\ah8qVBkjI>a!@kieec#>WTj1GEQYiBGYCyR#i/p4
W\H6Mt pN@VGiQb?a8lm8qeB+A^5n!VMV:EQ+^^q%Cn&MBjw#<NnM?uQ+&MMjw/t@Fc?nPHMjKj>\&5kAQmeMdI
%PZn:M @:tMpj@NnN<Vc8RcGP:\?c#@WdiPaL\n%%Xk!M5C^mmHI^pnncMaa?:y$a\VRm&CAI^/jT^n!NXC^6<T
GnqP@4 !upFjLFRm^eA*!CW5\waH?V#<wIlqFE4+%<IZ6CFMN/S9!pM@bb%CnA//9!FX8lN?5MNa?nj>CjGDR%$
kiIC4p &*LG$EM4GKP?<q#cT6TDD5b+>$:GKLe+a:^*knF?h#^nNJI<Dd*!LDlwGH?j>S$\HFBhnPEWPwE^SwyQ
L8kqtA bI^*+Rc*<l*/\?:JK8nkXa^SS*n\w\1!h\yn!QKynCE9y#GG9J#PGHt&tnHi+\#GTQ6M^un?4#K?pQ=<
54J5H= nVHK/?8M%<G=!SmLGu!V<b@y#:eaR/ihyZAQ=QQbnQHM=#BGjj$&a>T@:#CG9J*LiCG*E<DI5@Ma+:*Q
M5FqXh b*\JuDYM5WnFBa!lw::QGP*Ila#S!d&I<X@y#<YM*/W@Q%C+J>4AT^lDS%*KGD4:l+!l@!=nDH%#PYQW
d>Q9IW 5!5aR&c8bA\=9a4^mh#tATNj4&GM>:8YMb:4P5c*$y@4GiNhdtAMtd>S+Y1$HY5aw+&>mVHcny5bw#&=
VM@E:c lVF$@F4GKI6dGWPH*eaa?8B&^1l@h#DG<>@JGM?@nnH!:!:GN*FdD9^#wSdiAMd#*<*+bcGe1eB9$J>:
qYA>wn GQ?Q@9!W#SP$:@e!S99<M<dI@@5a+@u9b\#>?kBn/K&jM+d<e&imF?4mR+#^@A<#ll\>\llq>Tln9M6n
#5XL1^ nQF?9&CMNH:JGJ*@^^u@ScnSZPDQ&a/B8RQh?!Sn&AlQMWbb@Jw^&ytuGWQH@+a^hPR#nKFnutYM89ke
@$:!!Z a<nMd^tn#H@HGHu&QGM<+\8Mpeb/^4C9ZtRM@jN:^y<KPeMDwR>59V<!lu*!EtQwybebw=%@lVHK+qZG
ATZctW m>tGA+d??SNn/J+@M+b8iJ$^/6>jGPNh@5wa:@I*^5nLN^nn8j:P?H*/<\?FyTu=JtPe9MWa66ndnGHn
M?q:h& 9MMa59R8a:VD@&TM>8$>^un?>^qD:*:A?D!&VaGlD@:FGHZw*+\lt@>lnLL>L&Qp#WiMee@@Mac>>LHC
dEHQ>V @hB?jeIaN8!unKFnQ&PMh9^#^tkZNnCiy$*?j5eK^#9Xd+X\SyV/WX6ki<Z:uTYeEb>?yQM569@:pb/\
m#eTH! &Q:9>\DG:^k@\da+MGd/5Q*jn@LXa98@Q#1pdQ@*H+RFalmQ\aAA+%4MPtI<G+9DMF+I=#*nFGaTMcd&
b$BST/ $GL:9#@XBa96@@=WF!!&@@8VZ4Va@8?Q=&j:9#@yDI96@@=+j4d@?&NGE>9@@WttLLd@?%MbYt#@%%B?
KqweHB YG#@%\#m9ke\&i<Y&@<%bFNddQ@ZpA%45j%jR:cm^jb@DhqjF69@NXSHLLd@c=cn1<1a&n/L:j<ccy<6
*!D&wh 69>4TN+569>41C&!&Q/9\V8!@X>DP6Xm?:?G>JuF>u@Np=m%^bl$k<Z&j\*XPa96@=wQMLCm<IAKLK#D
/bR+4? tQLia96@AL&H^jd@APJb+:iS@8>\WZl@/=:eu?*Ljhb1:1@&+Z/b9cj%APHh%*1I$H6d&@6b:<n>5Z&=
qeD$X% @#YM?:W:ed>8DQeV>^J/Q?^>8B<Y=4:m#pL9k#%ciQi&*w@:X^P&iC:c*$YW5QbI1Y6i!tXHTqq:yIj!
>HPR\F iSkujJdV%l1We$NKHd/\XVI5#%hGY%#8>adLp:B%Zn#y=p!Qh/a>MhT&bm/Pb/e!F@?\!ApSb><\F:<^
Am?Npq 5nVYG1/LJMJ%:bFWTt@@qVMPj^th<%1P^F8w=6ZqVQKpmSPe*e+!&Nu*ADjZw!j4np+pnk*u+8XI&::p
mH^nb8 dGnt8yc=>%u&yb!@W5<W#m/F#Q*1ZJe<Y>i=?J=>/q^<>:=\GY#QFuEb%:J#$d%^uQ6S9X9kbX*J>iK<
>BhC*e :=\:K%^:+tY\<#&qc>8^DC+&#e6pbV?+b!5>F>?#1=/L*!\*lY?PLItG5RP9?%LtDwL8G8jbVDB#l@Z5
6Eu@CZ K54<nIy1^<+5Zidu1dS<NW@X=c5?KuBY#K^5#+1S>*b=1#Sj#%&^ZSj#*V6*JdejLL81b%#Ji<<C%b=n
6YwEVe =K@<*kkFW5muCQl/juZAEjIwBd/cS#Z\%h\K\uW^V\X$^elZJ4qXl9%T?STH=*4?VM6TIubt=qRq4w8F
T!!e5S *!iuYuFh<!wZ>+X<L=yH$jDXQP1G4?bZPl\l9?1^NWqBBTS*4<8ulhVFuK1Ij=hdyNVFkpyJSTtwtXRW
?bn/FG *?wyM*1iM5!MX9n8SdTXmqSIbipaBb?upQLmJ</u\d!ZC#>HWX&twlXVcJ=a^hI14NyWyGL/VeW11PSW
b?j@P6 qIKcVpWyyP=$nII/Rpe4YKmF6B?@h&EX/I=WJJ9#KEM8k\IcWej\<ewFhKPPpE6B81+Y#JCC1qJFKck9
Qp@uMy XbSmTqQFK1a=Yj9qWb>=FGhPqbqHYSbWp\WXyG@XYFRyFqiHSSSlISXaRQpXWu6=FX+^XXhW!SXVd<WW
6aJIiD Y^GXXp!bFXSnBSXaIhXXXGpXWFiFFFWSFXXEPiXST+WWWqFXXEAJ=XM@lSSQRbXVWNpWW#QFFE\8%YJL
9kF\Y> qiR&^FJ!4@e5aRLQI$BkbN+I9I#EmiMSLVDe+tTjb?=F:^ad?>T%F*&tiGmYI^KT^j9ME@TwP#DWHuX1
hWEyA/ uy$1BHC#NyQZQE@Kdpt!#:Qi\TW^>mtp^MG8>@FIA^kiCRAnR^PC=hb?>4u4jt+6S>tRXcdkiewWnM\!
1e9*De Be>dy8B+!lRMh=uc==:<5Ju<jQcy=@t<bcybV5=LqmyVRE?bkyFhy8Btq1tL=$ubZcd&iha:8M4WQpYb
kMWYTG P6n%Qy+!BeNVytBpqCqa:nK%#%**!!lV6WB#4yLqK=uq!?\eye^Z551c?bpq#8!Meuh^M*QPhWt@n+8b
u<yP\i +/&!=MF#\X%&>kXHNymSKTHM#mpujC&H6Hm9=Ll9l8T+8Hq!\T6FLmdLpy8VqT?be5Z5VPqmh4cM<aWM
8$lZ4/ TZN^5=:MLZZP*9P=&wl\DqND5*P$F?GeVbLD#&\:\6pGmbid1aQDYWcIq=un4dJcquBPp<N%\Yqq\nqM
!iF^c< c<*P&iKEe>8GYXh!*DinDR4u5YP<q:J!\hW1ldP6Fk@Z$$KFe%k1ty*hYwY#LZa9N?9J*FJZ&>/iJY@k
XcqRj8 iTRNnE\bA<<4ZiB+=AwM6$Vb===e6Ju<qQcy=@t<p1NbV6qJqyIYRI?ekJE6IiBt!wcL=$ubLR@&iha:
W1NT6c 8GVAQpZyP>n%Qy+TB<NV%tBpqDJa:9K%#%**!!nVQP&Z9yJb9uucL*$q1/^#6X?cuXH8?hw9:!Z>Qnuc
*cS/1w L>hdbeqD:9dLheGSnX#6q&duqJM<:XjYqS#*#bCejP&Z>%JYL4lpKWj:=iF/=CyZ?/Zb&VKYw@*!e4Pi
=Mc\@W LFQ1P8Phi?iZQH$%T@4$yX\T1K>tT/G?qmYJ?qKtNH19bJYF>:L44d$Z<4^=6uStZ9SIm88mqqLN#JJW
iP?pw= jTt*6P448TR&/&1ib<tWZP?XAntYIeHiC:aWb*B#=tPYNP6LYSK6L?YRcu$^W:K>X*I?hacFyl^+DbHP
iYkH@I yX&SyXHNthPXVuT=atV?bF1<%hPF<TdneDkb=###J^uJeC*MT5#N%$t/8dpVeTi9#aY5X*d#>a8He*k+
D/cwFn 9Y^*<tm#9Ap:HE:TPe@<TWa!PVMlk/?V#JWJZubt<qwY5t?See%%t+\4?SQM!QNJM48YSyNlyRmX:&hi
-Ai^Pe 0008bc31031001202b3 Page 93 of binaries1.zip
>>!*JI p<8DAbG5Q/p%Tqwl*yq!haM#j!yhDM=Q:X=84y@!/?hI\G:>*et+qH>Ya44Ee:!I*Tq^9+:LJ5%KDCYi
tt=4F# ta!$P=$EdNMu%$@#9JVLyHEuW?mq9KYYK$FZC?XJ%K6I5lI&\aSmwWLNG!//mB!9ZNjVS##MQc:&ER>#
5:I49n p*9:mIi=!*%<^MM<=:+?+tH?e#<j<VBZ84?QiL=Y^c=R</%4jMVDQP*BQ8Jl*9WkH@F<4ayh+ZNX:Aw%
u>jEDa S*!kn*maS#/^&K4JFY18?ja?$5Q<<&E?+tGP?uAj<VBujaTQiJnnH9aSD@Q\S@1Il@u^SXjb4qD#=Zj^
jH!>A: ER>#/uj%ER@#:uj#ER>#<$j:iA><P#DGS##McV:Rl^#kG/6<m>hbLu&Fd+*#4b:6nwh9u9I6VumGK=/9
9CkRE/ Xda4%QjIF@m+d/HX5>*^C1&i:a=ZcHE>h#^<y#ZbS#^<$#uVS#^<:@tBn*n+9uCKn*n+BuRQH@H\Zie%
BY$kJ\ Q8Llt<>>jeVDN=*%Q8Lli<twn*n+qnLqI^/?5%#mI^/?uh#LS:#uCm^i=+/HXdFD?i1=K^+Y\/9$ER@j
h=G9eu \FZ:mIh9#ja8X*wttGCCCb9#m#?mw!&>HlA9ttYN9*Qh^>69&QC98$$Yhh6\VCBLL5V%JBhS/n:Yt?#y
BkmJp5 68HaaLbe*EB!aY*a<Pa4Ju8/dXlapT$ZN>/=:u<jd6l\!%>N>uVd$By!>&tWZJ^&=%FZ:Lyl\@ZVVjb$
YM^<ZQ &*BKbX/=8QW<p#*hNy^cqWe8lJmhN6uV4WPlNZ+\SmdH9+Rc*<JaE<c9MDbq4>GDeS6:uS@*Gn@&?n:&
Q^?:CV in%a\<hi/\j4@&DeAG9:aB\Jc@@ac@hknS?5AaS^FI^>aF\nLHmZV1HGB:D8D>d@\ZyB:uX?^uPeMb#t
6qh$HZ :y#tuy^8IVw+k:DPGhd/t<I$nRu>6Bu!&6c%GLb\!k5q&EiPZGI#iCQl*d=/a:8FKi4EtnTyiXppGY$#
uR^w$P e6G>=aH6AJIHC8&^^cqJmTZ6p%4nHS*^VmMd*XIiR6u!$BFyNeLRZiYlMpMiqmbc&%bIpWl$LVbm$d*p
:^TcYt wTKjQEAYay&6:X%6WTMV*Ww@XCq=mC>idk4i!AM<A$w@yE\H\<mDuGE6=cFySqN4i!#ctebCeMb!/L:/
T6$y8B wdeIpD!wD\Cd8^KJiDI>mdh5t#T@M*aCHTQ6ab6n58=LLR>V=JdwYjKkh@E#A6Dh=CGRR^/w#WlGp4Gw
BpDBb4 Eaj8J\@BHQJkM1n:!pPFpwhwPlp@MbyepRw*y!PhdbFpY%lymbXGP41XQIR\S1*Wk&5BB^NM/EcBJL?:
:FH^uT K\Vnk#VBjPNukku?\tD?!FjQF85q%=E\5<YMElXt6ykJ&jIk#G\^E+TbLYbCZup\5+NM!DE:!M\iNQIk
Bh#R/A =cGH<hTa+JKHutc&tAt8&YK>#Y\^E%#/wh4MFnQB#Ba#Ia<<tNqmJynbamdpp\e#Y<\E:&!^kPlShLda
^N5$1u V4XNVR&q*9W+w6yEw4$e/VR&Np\6Fw<EPn!#A^w9uHe/WGNV\@T!yNNTN/$e:>W$dZy+LQ$yJS$1XVG*
im8TYD iY=hPb=uZ9&CiYMZL^PJXIy5m<5tPlK$=yBueA\$4*y9c1T>QS:9yE=Hi$I$#S:V^NhJ\D+LNB&AFY>W
4/h\i* P1&F:>jaEqb:clYa9KZT&ZQQ<1VVY1duTbR4uWSb$wtiqCm%:GW/!$w44@=&Pwtm/jAGb9qjVKWVTbWu
badV%D uhbqyd#Zcqe/lTVSh#yFb8jPnc:!X%+y5c^RQXY:5IqP/@ml^!WK%NNTbRj/b$HhuKI/DHGtF>G5djHY
J^^MWC 4uLw5YR1&X1PhFLL&leZm>hWQ:%wi=FKh=WqHaT^qEtq9BjpRFpA4m$TM<MP&:kFkN$a!&EB=E?uVBdA
+!Q:Kt uKtHla9Fc&^1Kjw<&:RFpQi6N6ICKJyPc=tiJ%G8hBJqTYhLY\B=utjnLaD<L:b^FpC^hH^cAHtT&YkL
e/1i>L wFk/bdMAwp9FtpNYw=:mQDA&GT6Wd+PWMJ$@CI5kRQZ&T>Dm=m*+nY^^C>T\<4T+LdHP<iQC45%15!4Q
P:m$Gh StqMT1k5G4NwP1%qiy=E8hJJqCYhbcZq<<b489\Q6HGc4qk/QnXhutR&Y6MXVTjSXey:ca%bXA:q>6FF
u9%LnZ NYa!tlIFNCRTmcbaKaneqp$=NIKVVu655W>L6IBEW#4^^e5LyVNu<jKm/VRY?*l$aF*D@Gb/>ikTYQVB
mejV<N A>iAGVyw\hDRRT*QmEFu9FabH6Bd%I6GPu>NDKtGPle6b+aPwnkC==XQujdSFGuL%^%cn6!VjRIWSaHu
n/p4SF !dVq9e?VTD6>knKpI&*=I8qp&9K=$9HXE6TyGqlW+6ETFH1iDJ5q@@P$mn*Lpp=:16l:6WhTKd$SjB/N
wQmaHM RC%Kib/HYyS!yEQXwm\&iItcyd@QF5=*PktltwL<?iP^\jQtD%1+51SVyIW4Wm?!Y4lNLHeuuZT1bD&t
6T*Ey+ h1e9wH9:Tt>M/6JQLdd&^bD/Zb!4R>:P/+tA6T@dN4L&HY>MGhKyc/hGqKy!yEBdTntIF^P&@@G+HG&y
6dm?eu >KKW+Ztp>/MM/hniD^q<in?P!?j>YJd8pK+9H!%qbZnIw=p6ybQPe8TmKCtj8hhb5HiIZmeTKyVPWVPd
HeaZZp 1IXdXVAhQ<<ni=%qKC@b/!^DP6KGauE8=d%pPyR>w5V<tS*9nBbWGXbna%QJ1*^MeV#BnhHp$n\*4N4c
@i9Gi! QMHq>uRYCy//Z4BjWdyHb$6/WH^b%$yPy<Xd<:SN9i9tjH8F@%V!^=G6TSuT<TMb^W1m:JJl6\Kq&tF&
R\\tb< K%BC@ySLWtW4WGJ=RjeeFW6ML$i=?/p=j54h$\1W<D^PK%Dmi=uXQE\\\Xi\X@QaLBcHGZ5&a<?qy&QG
*u9DhE u55!ItQGup6L^+\>q>S#MtQQb8!=^HVM&LMbi</lIe*a5^q:NtQQb8#bnD&d5Ye#>y\@HVQ&dMci#hm#
9jQ%pZ GZ9itJ/>GZ58HM#ae/uytLFuM@beT4q:YwETu5hyBWy<L>i/?L$45A/bYSi@&\i#L4+J8iSBtHZ^VSBt
D9P1!k ZZ\V<5yDyXpH*RVZP5htu\RVe8!VaNdFN@LA/%/dhjGNQPn&w1hbF><Eq*:wbhdFN<G5m&>CHup\/?Kd
:TW^8F aNdFN!GjQJl%<W$\/?I:\c!LZ@l=#L4+bq*<VZ$i5!/?YSi@WDD4+yiiDwJbF>>H!&*YJ6mYLAC#NpFy
M4Rib: /bm%Ce#cBGb6kqJcZLM&RYpc$/^NWESDtdWJN8Y>6Ma$c^Pa6Rt!u6m5VYDYJnB4E?S8te#cBMJZC&jY
!N<Bu= J6mEhM#cBGb6A4M&kXtd+I9\BJ8%CW4*wQm!45*cBPYRDLM&RX:ha>atKJJPRDVli\D=4=8HRcQ4=p!4
i6EtR# H^$iQc%&Zm$httdY#S9h*VLB!IPSB#6k*SIqB+EypA!#dpt*D==%T\JGHw\<8L+d18JibcFbQ!ca<CWP
Z4<1MB 6i*6+Yu%W?jQ/L+K\c\>aIIRIe958Td\5d$ISedG8>Kdu5SpC5yBc1%i5L4$S$J/#5q</#!4b?DpnD1<
aNJ//A 85!=WJHLdDCl6LBwWTwhTcc@!Eekp$>6FtiX?l=j=M9$MLKWY+WZ%%%8*eS/k*wCC^:e@JLu$tLGbiYE
GkPW$6 d8?!C9lwm/\!*CWw159Yj/bu4y+>b*b6a@*a?kZ%8iNNeb4SC8ia*ZaHlVkhT:yp@#Y8QBN!mJ=^=btR
n5N@/S R^+5$*%VwVJ*NyHbK!#=Z=/dVl=Cd^ca*u1^1D\#SI5IXlYVc>*<Z6Vp>VGNqkqt*Z\Ve5tDMP9tt!DM
SBTl$t 89pt=JWH5&/?Cda<jCcehhLN89qGHnawF=pb8#d!wPYly%p**\VZ89t>#d4=Jun&%VD4=l6=EGdhjBN!
yD>EQ= !wNbN><E5&/?Cjup\c!dd+JbN><Jb6*<\5>n%5$*/?b9/9PahjQN89tFkqp*9@S$EM!/?V=cd4N8@4bp
@FQJFk Abl%<$6L^/!dd>dNN?9tq>LmtuZ#T>Pab6*<Il4K4J8@Ki?qNcbbN>?5t=@%^GdhjLN89qp*Q*jLbNdN
ZELQ^T F:=cPLN8@mcpa>dNN?9tt*Z##d4=Z+Ru&K!dZ:wH^bh%dhdNL+hptHZ#<?wi5&=?pZVMaqMt8ENAXG%y
ep1<wT !/DAGQFRM$de9eiI!>I?tnHmdnyG@CWip!$^tDHbLVMtc@1?y8?dS&5Wt!E@%M!R*#I#=Lhyt<ZMdC<6
5BwHBe uc%8b98Zhmb=+dbT#TR9GM\M<G%4B4mbn%cthM^<6ILytQqwlY*ucMF<>5=H&:\cRcc#Fe%HK#w4a6DY
\YYGQQ bwN9^Hla\VkdMS=YMM=l!=NL^lKX<q:>9?!&@Jahu!68m*YWQI*5m^nuK=!P@*G?dew9JnYh9@HCw8tS
a6<Ntl @CSL#S>Py&R=qPu+G:@$W/btB5G&yKHMDIIT!u$nNMKYtWFkSw#L/VW%I<bdk<XtSw#NmQEtyLQS9kR#
l+wVL> a4!q9Kbt^Hm#6ZBt^Ll$TjWV#Il^!itaEYM#aq^1PtdE&I\ad%8&n^p^Lp*VtSHnVW4HnBmdEiNTNaJM
ikjj85 ^+\aq=CPGVHiBt%=M&KeN=kS+<LyTE%uSw!L^VEn^68TlnIn^mYW?$bwlC$#aq#F1+<WG5e%\aR9ecl6
@6b/1Q d\>*^n9*uqa@hj/M:ykB&IQTdFF4RpYBM!HM+mSqCI5YyhKSky/cLXHdLe6h1D*qAHh+V6etQ6bpC6LV
AcnG8j ktR4ynZMYNC/I6dYqI\9d&q81lNBIT>+yEe?kaZ%dpIEky=4mD?RcBDSaNFZ@XA>ejZ<yyqnE<uwp6lJ
%W%l+t ?h/N*%AEQEcP?4qXc5F>pcZZ\%TiuCFE@!Nn++YE%^FRac%YlL:Bkke*j%ZDuSpHlN1?$%<ImCay^tbJ
IWj\I> KDFwhN&ecjYn\/Pu%e/4yWQV#Ly=w:6VBlTZtaw!TEtAFG>%tSwa?e#X5?jM4t&5H%8@wD=@@%^bGSZP
MJS8q+ ed=%u6W#eLIj1<MVK!BM!JKcj8n?!?Y%w/qe:pM+YSydnt4mb6i$MN$?VJ9iMK>tbte/t8!My5Q%J!Zc
PdZe>% +<tNhRmX?HMV69Y\::::Rw//jV=a51hqi5$ttGDCq/9Hac^ya$&daK^yE+\%dc^yE$\\\RSnVS64&kSn
?<wd4L Vb6k4GqnVb6kkkptGG9cYNMtGG9cBGNNG&9cBBNMMMFa$<ccN5Fa$<ccN5Fa$<ccN5EEE+\%dc^yE+\%
1l$lt1 dc^yE+\%dc^yE$\\\XnVJll4&kSnVb6k4GqnVb6kkkptdJ#6cLaGL=CP&S4edA%iinytc@CC/bm6\R9u
$<hHXw n>pc*G\N96qcPLM%iPtT/mia4eFLV5h5DY/&Bm<%HdM%8NpcjN8!je#Y+KXyP4M%?Ccqa:aGN%8Dq/wS
6aNRwY bDytc@AT$nFdk&?D64#bGn^9MF8DF$=Hcn1#NZm^PGb4<G%JR=t6\W5w>+*RCF6tc*C#>/AJTk=MMMGE
!?4+X1 +tG\bSuNcaLSuCca5Itc$>RqE$\wS%$!\elBMb%1JMWE$:ccaILS1TaauY1CCWcuttB$1kptGJ%1k6Gy
ViE@b5 Jylkkl?hGlA>mu:>8cQ=?uQLjQ*bNG%/iC#>KTYhKcL<M<<VtPAZ8G!mw+DZHQKMFJ:tXi>==uW&#S:V
QX:CF\ ^Ne*dNn\YcDykKFCtK>I8@hZyEZV+Y?R<4@a^u&nXT!hL?%Z4e5K%XQ?14ZVPu:weap<>hS<%dy6jhXc
y1RcML hM&1He!cXh%:#cw6&uKdNc6KT&i4Y:QKd<8h@<W&48W8q5/ZiA&6Nai5Sn*FiYB5Mqcw*kayaVy@EC%=
*4ac<n kP46q/DF*YdY$DL4TJRyHdPPSDp$ZZhiS/KAl9T8I=Hd5mtHSuDT&a4YpYm5K:mKlBAD/^4tN>P4S=jA
m<X$Sy wk<i8AdM$EELlwaPcuqGDD4n6e4\kN/mZnVT?Y6mTDZW8Yk=M*RR^SE+4*#16I?tTF8?:6B!=J:5E/Aw
-AJKj= 000ad54849e001202b3 Page 94 of binaries1.zip
/i$?LY Cn^Qym*9jb=E&8pVqCEhce5ZTTjVq5?Xn1?YwE:X\KITn=ck$QNp&C#=u/hX:FtYhNyV^h+L*\YH/?Ih
nT=VTM mXl:qnT8h4Ww=ZpicqHKpR=Xm:La+CX1q9+?Y#nj/TTEck4!=+@HB5?dQ&nl!yJPpSc8TL*Ic8E&5h!h
pmF^ZD hNKyp9Xa$SX<?py9VP4TV!&&>5YR?q&e1$Qi#88JkLW9&#c!>l%9VBuTpi6I&B@\=&qL:bW9dL@leVuc
6Jw#BV W8qFKeQ#TP>HGhL^4Ejl$@6^ZD:9l:$ila?Y5nI<=NHMq6JJ^%/QwwS<=q=u\h+liy%I1FA/en$KLLlR
Fca8@j a4uLZteb!p9&P58Rn4Tl:QWwTuk9tR:Yw!k^j:d$:kXtdijewX89:Y^YJT1HbJlXmjL1H4M1WdF$*4=I
&LQjm/ mDGmI=ZPKLZ\H6RhZ$*<DNEcjL+RqiB*i9pX/G?QIZ:M!?@<ZIlBuH:\:=4@?:qC>BM1jVj@kC1!a+SK
<Bnw9T *<&99B19uEmmD@VJjPHMG/4<De^d^j@ZqeLb=:J1i+LXm4@pt:CSFL@uQ9VV6PIj9!?MJ5Y99la9wjnj
S^8>L+ Q\EJM@>G#V@$G$ma?djRu:MX@=G%lHq9!N+#KH%?#1etEcPQ+9iBq/1H+q>+Hm^8=y?1?iim?9Xn@8Q$
?%4jee b=Dmj@^#\kMWj<RaTn?k?I*@JAbdI:%Yw6A/$1q&+bqV>XM!>*w9/EkuM9k:%hCj**Yp&?Nij5Y=WApW
1&8ZQ/ Q=dB%@q9>Z!D<Gnt/@!*h4pJM1D+l#?m<*@hKGL549mlZZZ?9*RlMdkjXZtJ#8e:9p%+L?bj49t**$q+
:mW/^N d<X9@4ZP@>N*^dMy@9!a#9<DQ!QGiMW@+tIuu/*1i5L:Mj>K#S<PGh/j?Y@1@H<i@Y/&6Jahy9N@HjL\
&4X\H+ MM=@QQ>^uQ?89Xb@RPu%iw*#*<Z9<^L>ib##*<Z96d<4@%*<GW>w?Z@wYXS9=u?p=j?%l&HaKj/lW=*<
!kBn>* 6!yQl88Ii+ILhQ=jh!5KT9FuQcZ#ih&LWGjMj$d#d@$qMy:=9*Q!*/w/Hc1j6W=C=@>@<C=HK9:5K:Te
iBupXp h?G*S#H@By*@jcG4n&d??#4@d:&Q<ELF9&GT#9>jpm+T4AMHH8QK@/DP6%@R?@Xi#ju9+9hd+<y@F:@Z
j?*LlX HFj?8@nYGJ*@9%wHI+n=S?n<9\$!#w5DY%hy?j<MPwC>%QXQ/j^98b$aJ!y?<G/h#?j9TQkp=6?4?R&R
cRR=H> =bZMj$DLj!h/Ih#+jNiX@\@eR+#V8b/iy9N=^NZ5ykD@G:ye=1JPueH%>%Th@+89I@\%^Z?^Tij@R6L6
%B945V +mLYi#%h?1hCb>5k86::I<=@#SiD:ujyH^i@%!JZ@49TGWq/1i@cn9VTnQdmpB$wu@j1TKSmZu/MilVB
Jw1q5J B=5cWqRib$A*Z<L%:88/uZLH*?t9hJPD/d+y4>:4wLdA&yj=8n=c?$IPy#DjJTh@y*ynNVDj>X/>IS5:
5nhNTa 1H#:P61FT%W/+*4V9h>V=dLuy<V=wiLQJq#bt<94*<T=VBZ:BNK>w>yWPlh>l#mZ1@S41B=bXay@=FuE
%hKPV+ 8IIhP!m:way@+/PE4&V=8StNtPKjk:y?Fe5D/qNj^b<BQZP%+w?u?Fcq+phRN/@l>FE*D%d<!>EPZ59q
L\XeVL ?D?h#pjR&hey@tT1+>ajFH@>B<T+u68F:bFJ#EhH<RbPH@y65iK9@R9lG:u?Ru>MXQu#j>5SZ5QqC=*Y
XVpk!= l@WD&yidPQ:*6D!jkj!@ti&BWVwj9kq<C?5V9Ninmu<F&WJm4iL9h\e>9<yQc%?$Zde1@kAe%*C>?=n\
b+eAt5 daw@@CC6N=LR+de4jm*b6\F?*:5lJ*h\jMn>#m4><Y<V9yQ==/BiKQ+B8P</^V<a>5n*XDwuRH:8+l:Q
+j>G1b Z4yhHk\d+Whe:%b4Pd^4J8EjK*qdMEuL+Zd9Eih8Fj?au&w=HIY+Q%H^8!lQS1%q9ZeKei:l?=/k=jB=
n=E$tW &DA@=j6i18Z\edVZ>:Ke%P9<9*Iu\n@n>@&^I#@YjtnV:qQ<cce/etn6QJAa>*Q<S:Reh8C*D#B@k=dD
^hk?Pw 8@>G?PiK9?ASLaej+H$jbQ81n=dDS><l@JDm:@?+q5NQpG<Qe@=j+5ml8A6q?\mu5:$nl%bQ&J?QK9/E
^8y!pR QdRe4wXN<lnuR>#JB&9*RYm+iH^8wTPHF81??CZdJ=<:eml8k\*:PQjAYl\=6EdA^9\XQ?i#&u:dDjZ^
R!TRa> CeXj@JmY\^<iRI\u8b*/1mPH+y!DCV@F:j9Pnl!KFQL5%>^n8%#LaS\/>tq?uk&/jZ\Vhi+*ZC+n6S!i
5*m=<M jRnl6=Se@YT8I+jmj6k6d/9+b*/8=dDtiGK<w?L@d1wnl>b?$Pj919lLQ6N!iA=5&u@!i/*Xe6mE69E>
c/Ac:R %l5QcDu<Qdy1::Ni*W@L#!#p@\iKj%c%q5PJ$D$j5n$&Se9lZbCSj#H@FJ*P:Ym9@/*+b@jZeuk4hQN@
:Feh#N PQ:bYk=@Bhu@L:jLNXwP#+W9+mP&q&:V?4A9=PF@uM=FYl?8RJ!QtZ?6q5MdaCh@\9I=SijD$an#1iL@
Vt6<uq +\1ZHLaS@p#^*%!5>YHqd5V+ZQHjY1Z%+XM9E>:A>Y/=%wh9u?5$6hb@*>X!iQd?et6w>d:uc#u</S4a
<XTGqK H9#<Q>F!?B4yj$8%\hbZXnq!cA%GP6\Gu@Ptq5QDl^Kj?*%H*GnL+ipd*pLhipb==wie4iZ\PPnab%Z<
BF5BWw </=\=FB<E?*We!4??FXcH+=C8@^dFj@d?&p=:Ih!@^*j>!E6l%Nk%#*Q>ZTDuj?ud@k4bP$F#wi:dQp=
$qh9Di jeNX/Ki5X@#9HGVLIeZ@Lk\$:1hWcDu5<&h$8Du@j/Dq<PLJlQ?k?NeN68Z\>A**Raj<pj5LDXwPc>D8
yI6eeu 9KV+=>b1PS\JP@>q6yh/c*$+FVdRK*#jG&\=QH*D>bDlX:q>chX!YA%h?l44tcnPl*jR%@tV+q>$5&/Z
hTFhF$ Y>Ct@Xu^d#^a/<Nt/K4ZFZ@NQC&Hy$H&@<J?mS8$HJ+M@j^Zn9?yq5P?1LN@+?e<We9lTPyDmVj+9i/!
8:VRdW =jD$DZ?DQtTd<yaiYl>8l*L=B?jd6XwPF$IH9Pu&q4ChHM4$$4A>/iLZVHjb&!=?=:58?#qHP6Lih9HQ
lQhiRM jejS\/HW9bAqju+1@+y>Fj?R*$PGFj?PZw:<X:^PheSTjw@ApSNIy+>V@Kiki*81?Hh9=<l@cCu%c/^1
1EBD*Q ^d@+Hpj?K</tN6H1^Z45d+:?Ce&k8t@%=9h/#bHdmnewL!*&1@^p8KPHK#/u>56m9<4%@*VpQ#TJbN^m
EeIPMH 9<y*n*VTCS&A9qJ@^Z@86++i49ka/hT\Q?FaS@+49p$/*tI@#D&:PQIj1mThdR*p>Ae=<l</bTE/RM^9
LCiFjJ eQS\1JZ$8VYa<?EbS@=Di=QP6wb\jW<=?XB^H:Wl%ub<*&<+<q>^=Vel<+4@8%5h?c>+tj1P%9cK@@^n
NiTM/* n9!HVpG?:eDqi/pn@^Yj+Vq*XQ4#j=<:<q>^Jn&D6bPK@>lhn9^ZZE>>At5aQ@>jHD$ePySp$S18?C>$
l/*yhE PQIjR4&&SuA/##9!H^yG61EX#mH@qZup*<Y9YiKTj^h@@Y>e<q?bS@=h@F?M$QLj?&%$NFW?jF46!H@F
cNMjpW *$kG4b&XuI6Jn9!HLmFd$l1q?Ce8e?R@NP<4^Fh?8WDqhC*@D<N&*bZ9i/An@/GS<Eu8^8*C1%4?S=MM
?yB+6Z Y8^u8&FQLde6B:M@k6K9cuVpQ*R1/YcL@Y\9dND!j!Lc#V*aH*maVteH>HtX@!*Rw%uL@?jWSqn5j?6a
TH5ZNb 48X@QjXBLQc@4Z>X!@?PWjketN?t=j<m56?5jXniu6d!j>cX/EB#@IP$@E>bkkce/$8Xq9@Q$dehy=/#
6uePXy it>H@pNHpA/\^nQ@jWj?R#?nM4TWj!<k@SI5@#iRDF95*%6@tTQ@wVb14/$JHQ>PS@=DF!DNA^T@:@%c
Y4XF6y @n>MEy@>ki9uPQJj<SH$^wEe@%W6@%ZWy:EtKZ/@+:Z<*$a/#V1I@SnXWt=V/WRi?Y@Z98i5i8Hm%*#D
<mdi@i XT<$Q#Bpqc6iXPYyF/:+@Z/t/<WJ5KMPb9:#8q*AGIF%mPJjiKq8F%/EZjh@m9@lX*Y>?D:bX>bp^S<W
Zm$pit e8yF^aj9\Jim?IN:/*y^M@SlLj8hcuY>&J:chG51^>>F!@QB5KZ4tD>P%+64Wd?teV=M%QZmJ6LqX4*m
T*5VC8 @@AGue=+/KZy#Q?SW!>Cac1L%k#F9@^ey%/Ey1K?HM4<T*Y>YHR+<Ye1@lYVhL*aHV:p\=mj%QXmEN4b
Q@!\%< Yb#Py:yi%MBu&MD^??6/<iTjME#Q@NN%9VkX:/:<\IE4/*T>YE9QcCp@ePC1w=%/WjEG%ZFLdV\Y8D1w
bHQ#eS /<Wi>C:Y+e#@m1+Z5L$6=S<PZH8IW!>Cq=PMYe*<QD9wi9FZ/Jq=HH?S4leuwB:Nb@::8q=e%eb?Xhlh
w%IptT q:n1lW68n:uJ^ZjbM^PR4=M:WyunF^QPe9Fhj9WJn:9+Ln@i^j>^<dWjL*BhBDcAjM:KPcS44SdF9^:%
&6wRl: WMq==iTyeKk\@*y/9CdF*\$?NPWQD>^M6q@F9iy>d#&V?MwjH4n>hy%?M#&@yj#lkV5i$8p9wLdCPwd=
<LiKB$ H?4$k+<T@%nF9:9PTd>!D>LNq9KjB?:>#Ep@>BVyQG8S+6@Z#$p@>G9e>#nt%#4yl#/mQ4/qlwkDD=&9
1h>5/= $?<D@c>tBAS?MW8u9\:y1>HH\C?Q%iujRD4KctQ?h@Z#H\^=W=NEAp?>16M@FQcTt95aiQaTuj::XC/Y
mZ$*T9 &8M><N\6P9*d1H!6be^@Yci@DLcmGy<M9Lm*#9<@pR^dcub#+KW*hQ/jTLcQyiajBF:?u<:@9YCZ1uHS
Zy+FD8 \C6:/9Rd1T&!%P/5khhQ%5>@>X9EX?Pqkd@94>MQZ$M+49n@tKHVQ+hp\Ww\j/ZP@@jyuc#nFj@hZ?uu
VywPY$ j+hp\iL^&#plNPd5S<XatB1u5PcVuS=W/a8XT#EG\Z/aH&w@#F1M#jE+Sh8#Py*jpt^aJ/l$j9CCV8hw
cMDE*! plGL^!<c^?q$HwEQWI%jBFy&$?t$W>611jGL+E=%Py$Lwih=@KJntp:uZi4LYCi4?CM9%8t<CD9lFMWj
/LGTl4 hcXPb^l<:/i!jymy$?qNjR*4NBX@6:h$Pq?lQw/q^piCa#:W/j##I8K4<bHkZ461@<AucEjPaQ=p%*8l
qRndT4 **Tt+w?hwhQbnjw$%qeX@!54Zj=@%K?9Mj<Cue:?bD6aZ%j<<V@W/h^NNw#%Djd@@%1ue#V1^Vhb*?+l
D=CCKa >YGpQYP<9n@p/NGPTPp#w=^=CQ<QWE5DBBRAAkAIAGJXdTXQd@B@5B+AAIBPARA%AAAAa&^ybY=$e!>\
$+SEI? b*A9dYFnL%BHWEX%bG>!aXB5hYhJdm>RS%B\dHXucY=VhHXmLuB!cm=mcY:5ZRtRZMX=:9j&Zm&TEJK+
R>+FGS #aAAAWI4:tMFTK9bYTG^1^&$Em8JeM#PQP&PNBj#bpEHNlLGNlBma+I^6<GEK^lpVBC?8I<aR+mVKmjq
uhVJ?: EL6\uFVmJPYmK1/EyDBK@@&?tZi@thW<uhQ@%9b<$>*#V:?@@@:@@@Z4:tGH^yjGC=tJ5ZS88DR^&q$w
GVDe&G dtCVw5HBiDE/5m!ttFuK+C@ybehue:@^@L1Hn@L=+Qd6W/KMJjQ=DH@V^D>%CqM8te?WSc5bt*w4#*6A
cN5J#y WW&t$Z^KG$pWm?q<MSI9=nhw!SJ4KGyS&K=h=Vi:hmqEBD?uXIS$**&MLhyFj$^lHc&D?X\mtR@m&e^P
4lZ%@d ab*KG?1&!18DPP5YNtW+uT%p6MkTVT8\lmTFKXIInBTN@%QK6aK%JL1*yB6XFnZT8tZ^!QLiK*4yj>1k
4X\nd& Xm4td>CKG@ZI<5V%CecYQM6a::M6S*X?*NL/:?iejBd@\DH1Bud+iCw#^9Ed\/6Y#8GY<aQB&Ay8E=qK
-Ac/c@ 0006f1d99dc001202b3 Page 95 of binaries1.zip
i5/41N huLtT/\V#D9d+wup^5Ta=9j6W%Di4Y@PiyWjM4^bL&ubcCcl/=48Lt>hMyFLbdTkC@!A@*@E&GELGb6y
>5dB1d 9M@8@HDul>th@CZ:IVDQy&6d#C@lm&S$^H6Lidt88EcF&!J@c1h@^dBM:VZWJ%q%1wd\Pp&nb5mTGa%y
cw!ppL wW9q@&$ibc$wy?@1\Pjd1QRtaa9h1iBknBFJ6XnYhqN1R6wK#E#b<A1Jm!\F@h+5aNu@Kcd@M<T?Xuqc
G=:+e= 8dFyFu8c5duQMjc>4%1/uYk&8ynwNHR%M>VV$E%Pj+S8J>1EllE>AnWlik%1RjS4m*45alXXW!n&tRJ<
NYe<w5 Dp?/kIhw>AHVWJ<K@GYiVAN?kmjVkh@t!cHA@<!VGRbY/VwPA#/iaR^!jDFQbkG9^VWVyynyePC:iZIE
yS8tRa MJeVP^L+Zb+kbqQ@qThHG:mJ=HEMMPWhC*\iBTHAX@DpPGB!DSHk4@DpiPB9<?RE+Fh+Mkj+H*l!I9D@
E^?cjJ <8Rp^CnW^yPB#?ZJZPA+V#D$t>M<PSZ+F9R4+eh=Mk@+Hb/eD9^jQJtQ8I4+h\Nj\yMF\N^A5#PA6@Qp
Y*FP$& VPBHaM+Ip\/eDW\^:#p\uKS4=\JV&<<DZ5/V<+F#QLpA?P5<8SD+Sb:$AQ<hV^aC@\>QLwIFwn/<GJn!
C5+4\4 LkG?pmiLkLhCy\p@#JNi+Nh=5kV+H!t!B9/WJ*&\56SZMYDm$R>M+&Iy<I$<8SV+Ib+5A/a?ZR:<V#!=
y@YGDm #MAhNIaGkKujBwHyYqeA$:kaAmd=^+G9=<uq\Lj^bCZ\A#\bB9+PV%aB9<GV%eB@!=M4kH@Dp^Fkp8ec
hqIdTm iApcw&8BTdd4kEtu4kSiDL6AtHljBW#*T%eDp<!9Aca?9Sd+Wb+pkGt5nRK@!yMp<N@\JAXM:aVj:cS&
XPF\lM 4whDJ*5#Bp^/P\=M:W\DW@@nHt+K!YpnMNZNAFQjITTa<nYi=ICyudlntQJ>umC<t$I&+Vyke6NF+I>=
+<6T<1 k5Clm?\D:5t/!D=NANM+9l/ahQaG+GHaX5LW>5*AJMM6\Hj^bC9\a#!=Ejl=uu\i?E&ijAGa^56N\L@q
6C+^Wy CY=w8n/n?$$EQYSVd\atQj<mMI*nY+BJN:<EVH*!bYD/u1<A*<PVY+F=IMh8A/d&*A:<K=:<MVDbuD5M
p$i$8! QJX<^b<Ap!&En=yKa@%4\DSY:kRtHjp/MF*jZeD<lw@>KjALQLpdtQ44G<DpL?+BJ49/VRNQI=&@F=np
FkT:p= eB<\&cV:kYp5QkBM?9MkMMulIYD/@wiB8e>q*\J?Gj/TMIYJn\KVVjk&<P>=<ymBy=Q?@Bp\?c:HketY
T8R$$c Q\FMN9JJaLI*V\HV8H\ctQV*#+FJn=+Byu:+DnC%=Xqk54jQAbQehkD@kmjjBj+hV=+H@kNQ9tjkR/pj
AKu+wM Z\At@@pZ\NVtF+GyV*eCp=%:Cbl5^9iBcT#?AJn$?wjA%Ie@A1d4?DE\&diZketG9\JM+@FXA<>REcMR
aH+Dun Jut?Dp#?<A%kGw>9AyQP9\XMdZ5dtMd/P<Cp9*<JVH*:E&D/#uiBj</Vu\L@C$@iM:AIW>+Hynnq4+BQ
nyL<Gw \G*E\W#HIqa=FdHJQMSTS!N&Pk:^+C#ER$em>n5bMe6<^CkuIH/dm:n%JMS1C^C4VEY<&YY=yYqHHNcB
?*\p!@ GHkca5pbmQ@KeYML+6>!VHpt+5aVLdhT8$hhmL%u^bjG+&K15W<duSn4LlT%>iqNn9pt^*%Vp\n\FehE
!E+iuD SHptwwYDJ4N\bDki4eV&wMhkXl/HGjpY#M?VMB>Q\*!>B^Q%Q5#H/^ktd&JaQAQ#<T#M^R/al?hlDq:A
+&j+L& <H<ER*<uXQ\qDQM5*G\idnWNh*\h*KpPh@+V8P^*+W=j^9B?FeN=A8:$B4nQ#ZCZY?EiQ\>*8AG8eB8G
Qn=Bl^ +*c+9X9l1t/Hc:wFL8$P8KT9\mY?Ddj*Dq#TD&CYjkR#hChe$q%\RZjD=h\DF*M9ZM1Z+E+ikPq+EK=n
lHKuKw AGHeMMK&%RkDL$i+NwL\dBBl+F1EbXemDL5Kahe%CLMTCK8TCCFVCKHYI&TcBZW?HGy@GNV?TA!lw<*d
JtaAJ= K1FCJ&G+iM$ThGG+V5X\tw:ljK^qPEe\6A:F5J&DwXTiTinEWF&I5Q=mlQEZI9^jlQC>F:eJJ<PEZIdl
QFQKaI d#WqbSN^Ft=H#5H6^*pI>cMI:YMI=bjmN8STlP*LaX:Kb8VMMGi6=W!IEEHHwFae$!JDE:9=*GISy>=+
dXSKH: jEDMnVV*DT^hp>!aV6GnpI4XW=&&#=i1%&6XLLP?qkpW=eRFnh&XY&#Q!*ym1ZRyZ*Vt>8h#JXjNVcXm
M1%*IV RujtLq5bGT1W$6u$F5*FlYcJK\?:HGYDmdF$MlJNFCJm?naT#YeL/a!dl%q9IJ*dGFV8<$Wn/h#K1C@:
1ljy+G VSieF/FHe$8%uFiS>*hTmh>qFcNZFkyZSj#!jd/4ZD!TKPdT8VGZqPMJQbuI?F+Fmu$@ddR%+6&D$Rt>
#^$GM= qM>GL6M&*=A9yq#F9etp^95uummN8<1YVKR#KS?&=%%\th@XWqFjY1hb??!w^?XR8djp1eSH<6EF$Zu#
u/%B*P jCXpqQwJKNw@!Dt:^BcQ?q$BFRXhAbX:Z\GX^GQ>u6uiF<cLi9W5:+CequGY4hT&?F:!eH/mtNTGE?5%
AQKPA\ #qqd:!^iqiDt9BRb%pwqL=H$e=cS\WTl+FEwwq>9!&EWibkQjMbLXa!mAENmXAm\JpcFGp&K5:JuQ#p4
\XM#cC BZ%9wIW^19mdGdM<wB*?Bkj6>La/>5Kk:/>mj+^K\WdIXmiaV=A=M1wE&!TnVwBlMmwEYCink4?JM55D
GecKKW S4qbKcD4@C$Y4nVIdFt4BI4W$+BB&4=Y#C!9iyG?>5\5hl5%T%tAAALMt%El\MabFaINuXEu&N4Bc6qM
1!QL\u ZqqLSi=AYm<^*e6d/m+j1Z6bX>%6W*YZB>YhjqQ*>Jc/\$j1V5?wi@lD*eML/ldjy:8CPh$I4=JD\^En
j$M*n> >Di/TQiKS*T9KES*PqHh$*Z1DwiyY>&p:uTP855q/m=H1H9Ejdw#&6MhMb:8nP^Tuyaw=da>KW<NT*uw
1#8qC8 XMy6q%I8T=V!6n$yy:XJ8i^L!58myL^5TMy1NXJ8@=8C?*N&j54VEcR<VZ@KbZ=T*kau=VR^Kb6STduM
Iq<<BT TMy6PFJ8W=H!e5+yq#6PPS%\!8X!e@uejG>6ME65GtFtP:ZCLLF4lyq9$\+#&/wl>q!dLP%F8CJ:y5hX
$qwZD$ &VZGYXDyWW8BwVqtlp%:#G!*ByqqVm%!qZl<4%Yd:Lp?W4BwqV&VNM8S+=KLVeQMdJ8YthpPVVML4Nyt
PFtFu* #*Y%#Ky%9btMT><w#/byqPHWMe1#c^jq&QTKM1\cXZ=9p&I=E/$59:Y%#/+=bqcq:$TYwT$EdZyCGY+N
SEAHF! wX!udqn!dJ!6?qB?::wGm\/W*%L9X:Dqit\>Vlt&91aMS!>Vq4X@!?<6*?h6TeVh#EAmN#bBC?Ae?WMV
EJ6GiA yeKE1:a*p:=<$tEa:c#hdD%ai4Pn%68bXZLA19Li?SE4G:P>I5+c$+wSR&Y6%uBX*DZPTHC^VWtN/$5?
SGl!Zm y>5M9bPSp$pAA&1l<?Nm^FR?ZP+$%$eQq1qe<XkAc>MX!\TyiN?/w%KQbqtdc/lHn^lcc1kuFmVYWI<i
mMa+&C XdV=%GPYi9R+w:&Gi9VIw/PG:&$Zm!&4%FMN?ZZXWE?6Se+1H6HWWK?=Fnt4iNSVR:&c=Kec<t84wS:J
aJ!BD$ :=Ac94inq9=R!+6j1>S#4I/ebup/MNP!PuKPbZZpibdXpa551!PZY%bH44G5np^bXpjtLE?T6=14I<Wn
$pu6jW S1!PFI<K5VyTQHKhcqq^mhYS:K@N%bH5X?d1TQajq5h+u=m4I=XYe*Yp$tt8nqTPNFhHKtib1!PX<<*X
#@l+DE pe4F=8yIbct=PqK=#F\h1c\%X$e1%=14I=XSe*YppnSZS!yd#hYS!4*t/pnqcZN%yQKe8VyTieX<E1?<
ii&#Fm b//PXD+$X$e19#XZS!4@dc/PXF9N%bH1DHN%yD4HZB&yhy84I>Wie*Yp85^eHct8MXhH16ia1!QX6QuI
I<QD/^ WL*iZB%=kBDZ>8p<mw4\ME1ER^S@hd>w4!QYWVan\i61=W/qR>%1Y/9k6!#e*DylZ<4MLN16GC5L+<5<
<YN?JX %pW+^/qTiVVhmhh&a/hXh1j#A$*!/c8pD1ai:y/^/!:1^YT6LQ4!E&M4l%hG\&yTjPXRqG*DGHCQyV%B
/^mBRI =ZXI$!94pQ!Gtt9Xk4H6mYI/4Dl1Xw#FDc$a$?&PdRq!8>/?DNHqhn*:^lm=Zc<tP5m*/:YXh&?tE=u$
#J9H#\ Ft%*JDTaTPhYm1S9>$S<VWp45uR8WhJ&:@QB/$Eu6\4KZNRpF/uXKm*4hn&%J8t165115<Jc=Y=%pZY:
6hVmQe u9*Sw6A+Bwi>NDPlhTeLVM91mWJ/jnKjLiS#Y1:WuYTF5eKkqnYAEh\p?WiV5h#%/YI?y^99cFbZJ\ae
CcdM>@ 4>B8ABw8FYqCqFj^iKyJFeC9WMG4mwtC+NNnQ#^B^FMD/hHIM6/\amqC5:cD<SH4&!YJVCcj#$W8%VKe
EP8Qqa *+l^8&FWHIqkmydi4hT&5Hm5*@4SH4<Inl/>GXN&=8\j#eK^@uSSy+u65T\ZE86JhPeuT4T+6Ce@85G4
h!XpNh /i=<!:eaM<&YCi$XZQdMNeN8uX%*#1#db>X6M?4PKWZ4:Ly4b6*TCP8M8tM&*VGVnqq$e=:TNyh8t/mY
P8ne@L 6G?J:qtQ6BuqbwGQ+#i=ud6&*VbXm1ll/RnX4SeS$k6iqJdmcXk/15t6F=<#>KL\VTtiB1W&=w=dJEq1
\ln>bW IDJ8B^4/yqWSN#bTFS1dYyk/8*J#8!A&pewZE=G?&JLXT!6XCtPFYGp<6\?Gm*keal^S+hnWHQBa5hX9
68V8j^ Q55<1c*S6?8JCc5Y5X!lw=ppS6bAnwYGJlwn8#k6Lu8Hu8H^SFFLTd%wdH*AjTQZB$/b>KniW%mj/Wut
j@Sp#\ 5>q<V8yGR?yDm%5j5wtpXIbG%ahY/IM8HadWB^Fh1q\jnCtt+apCQc948XSLyLTm*4M/q:/i9!a!pZKP
whW?5= FN*BHp<1H94A*$pFcFB>WD*$aTA>Yp\W$=yWl<dVl!aQjbACcq^>cDd$\X^1PF^K=FKJamymYIuNWn5c
GS66$: Tl>cKy85dKYT/1N446FLmYJy**b!8?^QV%JbZP!9WKSwb5/ND9ZF=pdt>9Y8/8W9<YZSXZMdTRDNIimA
^VZ\Dy !1P5#6BcJE<\FhRtNlBZjwLFYpVHn?:8J5aPy5:\YIk<GVwIN1d6?iNlD+c6H?F6%LX8nY4C+*KjL&*C
WRQ^ZX Q/$/Xa%j*Gtmw\VwtAA/AwC&>>QYjh1YL:de1/#h8L&#HJ9myGNEV>XJ%@L@*pIlE\cj\eGBJhZ1Yja%
aPqQSa <E9#$bH+RH<wjEcmjYFeX:!9Q>LNp*4+pE1FaX?wQc6mc%b%n+/#k1=#ZZ4\kwyCQuZ^#+TKD&@=&LbD
$K5nB8 JL:mqDnK?R*CH>V+?iJRA5Gumyt5dC:^qZKb#:^=+jBJl6TiRql<C1H\$VdX9Y%T<Bt94:?tq@pW19LB
jTYW<W QmL@C#Q+JQS\?CVH/:t8dSa?RbyaM=<1K*^yb%XN@cY#<cB^cy^%^ZLKhWheY\kay@Z1D6tjNhGl1ncM
LjBc9+ /9SZ5c!yjHImDD5&/TDNl+<?ult6Gw@F?19/C:EDLkR?SN%eTHZFn/!GNihHHiASAP&pC!MC<PeVWkR\
FnaDZh 6GS=yGypc>?m/Y$%D8RI\Qi1JlpBXPYVDKp>ldD+FELl5:enAJ@&VD+C<L?\!WWA%jnWGAH+5Jq$BFCN
C/QJZX V&kSkDdGu4y+G+%Vi1>&F>NB+:cJM?d9Z/PIRPZn>mD\8L+hQ$tQG#DC\9G+I?ue&YhFLEiH8kdQyC\t
d^^Ln% b^TK^c#KJ^qTi\yl<TtE\ti<QnqQ*6L=N&l!q1+cu^w6uR?dTX8/1u\KE@Xeq&p^1?1lPLm*15W5cnwL
-A^+Pd 00039048b8e001202b3 Page 96 of binaries1.zip
>G4A&t 5JDESNNlFJl*bBPGScn\!cSHc+^EA#Tc<<tQdknmM#T/wT1j\YmXDcmHSRhYD@NL%>bVSN>$wjl^$=cF
bBbSCy c+=wYVn!M#b#?$i6pSqhLMaG?j8Q&P^PM8h5=PcYld\Pw@i6:*@lp<Wmqw>iGwd$^D$BhWXAi=!^9L$>
QF/BPk lXLqumAEQmKY4<LHGe6:<cuJE&CC8c4Gp!eIcw<nb9F9V=LNC+XQS1>&Zjbj>@G^CN!nlNMi:qHC+MPH
nS\CLq STk^iJ&YbZ1NH1=tQkXt8AJ@?hlmeF@=pIeLlW<XD%hqZLk<*G:&i+XQTc@dnlqu5Aja*1qmNpc@@%MF
#VSV?X $V/dHV8^Wn4:Q*%uImncF:/NS@8X&bkR?ER#*Iu!wb\I<KXek8Je89L<+:Wi9qVMwwVRHnH:ERKj<8!H
t#d*na wByuQ/:%t@$aL&ZF%FeNu4I%M956y/i5<NpkV9i4T</+/\!<P/T:VtIW^IePIGS$VtPh@T:8PpQwL?N+
X1Na5: 5j4=mBkK/q#QhRp?hI^qujISS=eFpVI+GK@:yJDFqbqk<ZDj8%Ld@naVHQbMb^Db^u4kjWZ>M#y:e\cq
SGdpeP y8nc$FQ/yR>9*>RXHdyna?%e@P5Id^ICu%w$w%yQlK+bbT>Rd^^Y>kJ%!Ce5VSXiwM:?I68#Lq*wD/Qj
wa$I<: c^p=6jT:#R9W$b/KF/n#8m^uR*VK5!EpCejQ=NpRp6#/\PVbEJKaa??*QB6C/kPVb$NI<6THDup&lCS=
tZb65% NwRpH*&Rb$NIpthDTQLVB*p&lCV:&SD!NH6JDW:tD%\%4EGRy>qLauKjiTl<=D=#8e?<jn=!u*qRi?R?
A%\:9u <?D?p99Mji&a*Gei<D%M:nMQka@eb!:*thjQS?+#D!WCpQ9M=V:#8n!8*Ghiu<YW?<!4YCm=#*^*458$
4uq$+e tHKj8h^u:t1^*Ge8>=uLjidiupu8M&e%iVm=#*\*?Ml>=uKj8h^uL9ib:+8baLuQ9Q+bqJ1mc:uQQA#N
=epRlS pQ9MjY&Q*Ghila@<Vc<>RQ9Vd*yJe9wW1HmZ8eHJ=$:YQSVE4:Ma9%jDn8dyMd:j$5LW&bXjD%wRt$nq
YA+!X= m+qIZ&#J/1YXKwY^R1\$u65H!$ZF:\l6N?=A=C?eqWu?\6q?>\6u:a^BM>ZF^F8ik6L\bD5FSbZ/IQZB
^ull@J 5w8=DjMceliTyAcq*p!t$R&C>AtT^M>mmuMMc1<hjM>W@4*T1WcW4E#&>&S6*!B@8qhRB=hEwn5@WehW
*A^XX: TiZZbbt!de&&?y6E@Cy9QH>nX>pY5lVpHN\iwQ%mDt:9@Hy!uSwnJLW9^hXT*RyaS#qGIA@+%:!&=@9R
W<\cuL ak@IcDeyNR=VXR=B6$Tt$RMJ5jlK$:5*JF\*b@Vab*BpZX!<cbJV&JL/?khYHdw5X>KKPc$WmY$1bQLF
Tw&dbN !h:W%@q^TRe/uZHGGcSHDT<HiuKqKDK/qCSJ$5EhP$:?E&RZqbXDR#a@wT^h8Vyi^5&DmZTPk<:?bRM^
Q1jEj8 @kW1Zy9\&w#ZF4!&+dWX4^%+LZ>i\Y8:<u@mG69&>1LMkMepS<n6?a&>QV?Icq/cKLjuN?n&@IN+P*!h
R?i4C% JLjD:=*6<HLdRTkY@GDehqD6eMIn=PGEi?h\\kM/byGHC6dHb:<:XQCkQeR9&Fecl@kFpn^<:<A/jE<i
\p<Nh9 BSRTH*pWWCAjiSSReP!5Be4bjlVRu4WIk5>?hBSR%RMyb8=9Mjkp6mIH%yuEX8VAP55*FNh*<@>/4t9/
^Gkn\< \S:L:>&6$hXn5Y#hJ@n5m!*Y\Z^1*&J>RM&LCW6Z&%d619!<un:6Jy?/>XD\1Y*4iC%>Kk>9PJA5qD!<
6Y1AmZ wa=?u+SF&F8HN?^QG*aX<GQ5iQ=@k8$:JNqJ4t^6iJI4Y!ZXVZJqK*!QZNp1TbKpA+=pdC^na$p!Nyap
$acuXj a&MbG$8TJEtTnATD:^upwc&kln?$qdaV4llc$V5a/+/6mZuZYW^JM^K<8w<&p6wp!hADTbIpXchbmmI6
?>=CIZ y!SyPTXJ&p*L/V?Y=GmTJG&1JEql&XSn8jAe%mV\mbljP+q?NwHV!ZkYQbePbPX$Cnmh!q4F/&q+Q\@%
eLtL@Q V/jnt#uNb%*m6S5HGT@A/^twj!bi##L+H@W<a#NbXm<=H5m%J^u4*Md#He8lb%:NYBQq=?#=LV?tN9L<
!F\5?h 6D%@<R!c*nD+N@&dtZ@thn4p!iB9#b@^G^Kb\h?c4=^C%$Sui#Q&/EbV45wXQFq8=N@@I15<\Xei+dDV
^Sbaw1 !P>/mDFItVZ6=GWqI@>\Y5@ek9cj^yNtI:@uDw=dph>h#4>y%?<i=LkN?Yj^=Hcnj9wNXyphdj&A<$e:
ylline m:VX/^An9?%V1tQpL*!C+/tRe:Pbj<+NHE>D@lAJ&<l@=PepGCQ@!B&e9&1$=@e6Rt?M:/Xin&SLi5c8
GSa6S@ e>&<j=ZF&XLBpZ@B$$d>VN/i**w//TY9u*dW@*6V@n5?EZwy/MIYW@+@@cHRW!N@!JV@tuPF*kyc1Ju!
$!5Z18 9@qJwd?CL91FKj<4Hld/dPV@$5^j@cdRd!Q@%/d<V#yj/L8kT#=jq9>N8#+mYb=6=C>/^yV#h$e+Qkj=
V$tt=^ L=n=d/*n?F#pj&dKj!8hJw?jh4*</4L<?ZZNwY8H*C/!!N?!m8V@K#9:tK4LKI=j+8HKYntHcD1cpm&h
N>nEF\ lmGEd^QSwuI1PHVy%5mG8wCTP&?:=F*#DXG\\4jIF*#JSEXRXM\$C^T5TDV\heVI?hLmawp%eNPc@#nQ
1\$*^S >=:ne*/!@8tj*<+?i##*?b*j=#uQM?d9*6k:NH/>%N@B9SZB>eL%h*D*&+:/P@l4>Q#hKb:e4G:4biSa
*FDde% Gldn<j4ii=#j//SLZq1KL>jq!t1qPFY<Dik/ha=*=@D<9d=8Q1#tiRc=e==H$V!+D4@hy%nY@a\MK66l
Mu:%PR ia+DCem:mXQikcQMM@<kIP?miC>TC##AQA/@FCH>=yu4NI$i#FQlk4\VH\:Q?#G@eJBm/WPl??pm9qXn
E=Y\94 4T?R<XkjQbpZa!:!@@^H\$M*<!6\?RQt9h5kF@QptSSLZ\!Q%#!F<E*iP5mmHl=!Sj4TNkL!/tn+SL4I
!d65># @dySi*td1q<:Zia!d%yH<WJ=n1n=GQc&m=^^?cZjVpeQ+jFL$Yjpq\$mB/1j@1$Wj!V<bc%DVG?K=WYK
\6a6%a <cl*QjMc8C^@c<:8wQqLQhikl!%tuwbcXVBQnKN+mjTjThwH/yMwZ54<jZ\Bu>^9+\$C!&R<:u5R<$15
I&Mh%S 8V!b=*l+#u\l:wq@AM?Xk:=a#L\DIJ>=\uL6M^eKKX+l9FE>#IDuK=q9YK\iN1CGBe#*^cmHGdmZR8bX
=cZ$&W a>VDYu#\KyuQV9Z\P84@5h#Zb9X\ES#=SPdV49Wjnl*=W?Gh/w?j*HaXMje<WA@:S^FaLj%&9uy+1yum
tmWHCm NeLQcy+i9%P<q9uqkHwa>kKBhhJ9*%IQa<HYM%>k%MM&%QA#te@yS^:Te<ScKJb?&Kpi>5Jc?%#/dc!n
tP%4*i V%=F+aWuc^%TdqK<WV+*W#&MR9@b^L!=Xn$5\%/*tZqLwu4anL&kSQKu1wj?8^S9pjEB>dAGZ#Y%Xibj
P\n4G/ w^:P^Q!*TV?QWA?*a!:dtdh&1ajqj%Q<ljT4aiylAy$qZD8ey^*y</HhD*4TQ^&<=XuHj8Hk*lJH@@?Q
HjL&T= QMH>\5GuD:L?t+Itm4>p@m86G#PC?ai+4=*M4^&^@y6ZhlEwbj+Q=S$R#*\K>5%h#AQy%u?#CQ%l6*^8
NRkH&c w9Zj%J&liI@\N?%#N/>n4bjJ#M866!bqB5X:tdjQ6j/d=>ED!=u@$tL>N#8\#%bIutPcJ^<P:&N?M>9/
b!G<bj d&bnn>k9>e!%@y8y&L<1tj@=19ZjZMQiepD86/@%*?Sn:S\WQ5*/d==G#pPTQ<@/d$y\^18T=^8lhbmK
SBJnc! Zu%aQuiQ>h@MSn@<mw?4L!/*@y6yYI>HiQ!6dP8@taA#$6jM&&16@!aPd+\h=V\^Y/#@wb*aC+:J?L?5
Kl>m!G @&bpHeZjMP@wbj$*4XlH^#qQbKu%*=TkJ**L@KW!/:<bnly?J?94S6BdZ/:*eV<:1M?HSAVHl=Wmj#Z#
dtyy=t &#nj5t>8H@=NnZC1R%kc<:Zw?Tiah%$mu/8bF/G*uPV=>Jt5?e>n4/mX<$?S=5?Jy4mP^@hN%@!#eG+=
+cVuY^ ^V!1$8aQP+T#=QjMw>@X@AG5m^<p@$uNQ\u8@Mnnu@N4@nhRl*4tk^6$@yP^J@\p>cT??wTeQ#Ql%Yut
NIi61w I@/qM5dLib98$hWk>a#Y@T+b6V@D+^PGcy+u<c&Ib=tQm6M<5Vk4@e^<:D#NE+u>1%H+E5&VmLNDE@N^
N&45L9 BbyuCM:k==kuHhe<>ilF=?Y=\L&uQHP/@j=bTNIq:NGiPj@:Y!AiAqBLA\RWAAIACABuXY$qXpNZh/bV
w<kcCJ AAAA&RMAKRAAAGN5cYX8hHM9eGh\L&%la!>RS%BlbG%ydm>RS%BlbG%ydm=\etw8atq8:F\HiFSq&9&?
ekX?yN teqMEpyA5cIRSASWmk$WERmBlBabTSRWFEKIEqy\Em#wK8!1YFh?F*j>X%#LL+KmImn14k%SES9TSESS
6@yB%u :KkwmlW5?e?=><\*E$mCFFh&aZkP:=qpenP=>:69Ph@:n1ph#a$YDl6hM1d%&NkI5?&Q9L^wLL6@#?+&
#Wu6*Z <cZk!mDN4Kp9%J$>b>QQ%j#k^IpZS+\yKm$h^S<^^4a\\ZtQtiDV:^8#d!c?65+GEkjNLl%Y*L<\Fm5y
bIR5F> nYXGa/Wnmw9K#Y:%<E/yTX<>*hk6@k&!di!DkX9NTGNt%nd&>9@B&Y\A+C\iXGRMV!ci>\yQDb<!jYY+
IEweZ< /!@4iKl\n??jlSpQZM:#nAP%M^dM<yD/#1RA@k9\&ll#AX<b\u<la+?w>E1<\P^j:V5Q?c@$Z?1>>1D1
HEnkSS @$#dF^lmVIMnnZhIQC@PmbYP#4>\VQu\+4KT<eY^99uh>Y/8VMF@Kec&=Nt=6II@9<Z@KjE*8b5@9K9k
e=hGCW uat\j%6bQw^@Yd\9SK^*Rj*umbjZ69:yc^B*FN&Kl++:B>/m?P!TC!yj8$1H<*>y@KHjtL!eM*wXuqia
AGA9pj Qc1\4K!+4QYI\6nt:@mMu6HM9Q=uSQ%nt:4d<Whdd<FXit/6@1:E*^t$?6:?ZR9LTww!w/ZuF<imw\4H
/=+F*> qA@P!??VtbNXMM^@dP*ZheanK^46+=&JWLe?8RPKSyaMw:91u^@NN5GA&YI^Yuej?Zhc+Ni:k&wYjNkt
w8tk\^ @jFJ4NLq4Z^qdKYLX9Q=VCq5ZV18J6@d^d9\?p@&XD9bykW8&9#944S$4H?ykk$iMiu/cuwpYqk$59Ce
&RqlX< +8y?X!%>9*ZblcP4?u/h@A9L!w6Hc=F6?j%\%*Fnlw$149/Q&bHFH>n5i6X\:c8@t8::NVn@<VaYYPYe
X@a:!C @%X+=V?AY+HdkN8B9\P*AHeA@\jeCj\9nq$Lhmy5dhly\I@AZeB$aAd\E*A*eA<\E:kZ8A?+u?EhiACa
%qDBB6 De\Bdka?a>nG<i4Ajk=<AVCy\H5#DQP<TGeDJeAawBRaC?AKYQ4!+dBl&HPB:\H/BF+&44ejkHHAieD=
!85BYZ CkAZKp^^bX$M@AG+BDkH?Blam?Ml!VCjAJ<CT+Fq\HLkNYAS5ASaAd\P4ASi\e@Wl%$M8^j5G\C9^C4k
I\P!=# ViA6ZiLX\N9AP<Ac+F*kQRDym@pA?BD+CHlX$R@L\i+NeCYE9LmF>ej:EplXkPjZ$*mq8dc%lBy#GRJu
PP1QnD eV$Dk+FBAQ%lBqBQ1+u9ti>*d!=ZaB>kZ&A@w$kKHAA$Ak+EGkIM^AeDPWA8$AQwCZRFGGS:Ad&BQpAY
q%M*=c $I$JH#AWRGJl/BFQBlC$Dj*$KWA@IB<wAE+FVkQ/M+MDBkCu$:WDA+Ft\GFAe+AySqQkWKAqeDl\BHAI
PR^RhK HT8AlMAkMVC6kELkVKA%$Abwc@\5=!nkcPAa+FnkPKAh$B++HtkCuAB$AnwAJ\IhkbPAS+F@A9<CHkMi
-AWJI& 00078447e39001202b3 Page 97 of binaries1.zip
@1!M\G Al+BHkiiAJ+EH5Sy=Hq@GJdu@mtA?i$<+GqkQ9AL<A#A=Pw=aAH\QLARiAF+EZkJiBtaC/\H95V^iB&@
@mRAEJ AnaAq#HXA1=kCkbMAQ:ElAjk@Z$%*RN?l89tn:BeM>eAG+F4ki8AQ\PdkP8B!RCTRuMD<BhkCuAn<Fjk
E:1dTu d<BN#MiB4+F9eD!89&?B:?L?jJ5icjln+9/!*jG>Qbi=najkn*8S%NVij<C<He>?GJuhp!&nWV^m?Zh&
*!6SDi =p=J8Q!MN<Z/EdpjpA<WAAPA$+E#kIHAEKARGAwWAeXACVACGAtMB/+C4kc8Ac+F4kh8B?+H=kAQAk<B
Xe%Vyl e+GHkeiBJ+HukAZA<<BC+BXkEjA15BlaAm\FqkHLkhiAFeD4\E4kDYAX<Cd\F4AciB6+B%kD9A8<B:\Q
tmZ?w< jAB<CH\EjA!5BV+BQkW?5!#wEBYAL+D%\JjAX<AG+G9kG?Bd+D9ki?AHaCP\CjkS?Au+GclR/EMic=G:
^!<QFt YiS\Nk%IB&wB6aE/RF&kQ4AZ5DjRANkZ&A>wCB\EHA\$BnKBJ5AlRFPkPhACcApeCdRCYkN6kKPAw+Fn
R4\R#y kPP<5tq:e%PZAPAa&=+SM$:YXE!F191XP*yu:8/Q\aQL!k6n9/9++PYScZuF5ZPKM@8PK>>?n%lD4dJ6
I1hjyh %WnE4^dn6eXPKLkD8B@Th=aj^98#=qiYPDXi>>@#+t@>Y1T+YnbSp9lFl@>@w6bN*ZMjX*$G/S>h>b@b
wAAdTq Il4NdquhjYQ5BB@MpAc5?i*9?1Reb6e4qC6LDp&V%t69J%:/hX\<K9%hNbBS@l\Y@%A%pXGP4dX1n%F6
T/IPyB SD=ANbLSFckqQpP%E9qC%W9pZ/li+661wL1JQChSQ\ZG1wam9%t%FQt#11uIQ%h6^V>yL>Xa=B%Xc=EQ
GZ>QDX We%FQqG%F@qh14@IZ%aNS4=B6SlQ#aG1!ek:1#anL%LhSu/qcpL!&aq5NdST>R*=n/1diI1d/u1R>%F>
c>*hZ+ SS=V@WX?p?w\<mhWn=F@4L1Mq/iY/nL!614Q!AiwVmPjwD1N@DdXc8RLXK8S4%QN^59eTLWdiR@Xd?Sq
$SS:!= 18QIy/1iI*>PhS*=y/498ERc1M+nQ%:%H9uy199IL%H6S*/u/n@!F%WHpt>RQemq6y@1R9IVXVPTD%E>
E+%^bF Tu=Xwn=Ki$A%M9q<%hDpu/u&=bK64^1c9IN1dQJC%iDpp%TLp>?4ty^<lYy#<p&1#du$G?5iI<>X4W=i
A6F5Eq 1q1h@H4X/iS#Xc?V4%Hh#65tVjW:?hG1+<u:1=+uu/m/uu!c/u9!Bc4#!V>V9e@d4:=1j9L&19*JB$5D
>ph6Bw IL>MYkD=DGpd=K?w^mj@RjwHd?Pt$pDIi$kVIC?SLpD?b&pW=LPpXbA9q&bB95uZujnIcClhm9^a/Wjp
EwCWt\ 9Z^N!8NF$1*I^$9ZIy<5ja6<tuR8<1iph=E9p>=F9qc/X>#%nBZjZ:wZiR6yZ?ThyIGS=<8HpyhID!Mj
T?58ti L%&M@Edya?V*T!enj%=/Gjqd$5*I9=N?S9iZLl&N9KH$NQK&$6ZIe*#6\iPDyE&Rn=PGRH/N4$6+@E=y
$?i8&R F?TQTh5kZ!KNk@\ncS%^6#6J9IE$D@KY$n:I5/TBpJ<8:aP<SQwH?cZTRemuTA<l9$icCQqn$pdIX$kn
JBZ%*C IX<94aT8Q%YcCjuB$p:I&$6DIi<6LaX<pDRX<uPq4bBQ<nXZn>?m?Ee?Y>wy?Z^jn@Z+Ctt&=G8q/bJ9
^Xw\DN qLdLWJRtnbi<pdSi<qdTi5qQp8d41hnTj5tLyQtTn=H8T*/y>F@!//WDp><tLbn<ZtuC=QPqDbP9pEbM
tyP++R @1t$a9JN$w\bMnPpHbM*pwbMj4m$bQIP$yVJi@8/t<eHTbenH!9>nH!m4<q=@Edyh8VVyi8S^@W><wZT
&I^/N1 ?elZT?<nZ!i>n@\u/Z+M:SuT@<kQpi=H*p1=C*pucaDpJ$5LJB<5QbB<yHSB<wuTB<q9qE=Ij4j$R9J@
G:Jy<I TnepZ!V>pH!%hEV!V/Rupt?W45kWJN*Z5n*iWFw*iS6jp@b+F%@u>umB6HD!5/YXp=<9#b^<p4S#<1uT
$SB=hT $MquTpMuj$^cP9pmci4p:$yLJ%<uQb*<b?u1VJZ1?Q1/^^6Ja!e@ZFw:iShy:8RF$6:Jl$8DJ:>AYn#=
AYkLRE hhLp!chKt!ijwX!V@FFy>iR9cP?AjJY@l?D^DhyHaBwZ$Z+CiWQ6i=C*>je@QJ/6QSD!jP&FpA?X=p5i
pIiTMl <:Xjn%<8@bj<S8uA=HhKq!X@!NhuQj/!NF4!h/ZXpu?49SPttPucN!F9Iu&a9IP$ajJV6P>DQpJ:Q8RZ
pG4\$K T>5tu!^ht@\P:aiRQ=^I?R>e1D$\<4j<@R/Q4@j*QD^iwd$Qy4^%6ihD*pn:Q8V66YhD*p5cN@q\/h#p
eKhBQY E/XSp$@SQld=HP%qpT@RQlV=e8u&=J?44tC1dcY:p&hw*+i<ljb?!D9/?#ai:?W*X8!Tn#@=Mh$m*:ZI
ycIy?j e!&85V%S8eAjhP*Z/D:/RjjKP<w=!yS9qM6Q*/h<+kLht/8WE\%YHZccu!h+=!858t>MI8j!<y9?jp!^
u4!94J !M56#?FJ9q?&uiSZN/lGSD=kt?5iVh/D+d:b$d4u99V9Dh6iPWQR4^*6ee1j:tX=:PiP6w9!?ad?84CN
yAk!tT %R!DhYFS4%uWK4cSc4*+ZqED%Zn:!Gei+Nhu61ETptQ>8w#4n&9VNqZNe:Bjq*q4bX@=$mY1#=a4q5Aj
+e=IMY &kQ>Nej%/N$ne*\@djj%t*S5M*>>&5MW*&byje@&+!Q9Aa6/^B/5YAm@c\>T4ZK+e8Dljp%5D=Y@mKk?
^!1:@M !qR>&p:%VCjXbhw:<?:BJ1yVD$u5\Zu*KhhST:>PbA8Rh^?*%@%\tH@9&MNX<*XR4VXj<jFy^eau@Z4T
9eIV9* +9k&9yj*nPyKHN5&Wa=*4jK!?N+Xen%:bNLi:NZ!*jG>LQlj!@jjXuZIDewD@/KcI/4<8FC%#Bt1a/=R
?&%Y%A HVJJ>e/b1tpG1p+wWa$\R9u5H*%>\S/qGkVu^cL85D%XM+^YLuiV<45JmutZKE>?R:F$c@8BQ<9HX5mu
9AbdJ> *1*<<tdqlLhW5c@@X@u^tew=b&l@84Z&<XwyHu*8^\yL%aw?DQtJSX=q<^TZ%m599EN^JL=*@Z%mH>&L
pk>B1t ^SuTWiyIb/uu%\+Y6c=F9LPwdT%1Yy9n%$R&X#XHX?*^b!uu9Ej^ti9/YGpA!^S:5lW:81p?#yE8$EW=
kA16GF *q#Fm8V>/pYK\jH>/l>XB?j=Ndp>RQX9tt4jKe1Jy!j16S%?BKXJ$cc!::GmatuuLZT$QS44uwi*Dhi9
YJZ/:X d>?CT6J#d4>Vw@EZ%MwcP*bWTXFliWpy\&y/V5<?*ZFQ>JP>ZQac&Wt!j=M>SVbjNpW&LQ6w$8@KCEb#
AiJ1w: iK9W$@j8qd%Chyd5RNqB5tjKu8Xd&%#Ql<nPqS$tY!^:68#D5ujKQyL$u8yq=A<9nBWQ!+#tSnPLTwhS
SJnWBS ywuwhiNp4>V9dc#uM&Xu!>+6i$@Tei8tJ<S>+$/VDitq*?l=ZV&9pQ%YZ#i!VYZ4/Q9#bN?WjW9&Ght%
ahe<TC 58@IL6ZQy?4=A6uX5q@JdyBh4>ejwPi4bH?YjX=&9q:ZVM?jqj%WZ&?w=!@J9m#:m8^H5k6q*=Z>ZQbX
JbNt:t &W>pX<m8$@Gd!Gd1/=@J@mL:w?^4559$?pc!GdJ:!S+w&$A&VXdL&i/n+*!w=@Z%jJH5m@4/*u1?SQbn
6ZuyQF jj%RQX<y?+L5$:J9!:+u?=*5F:L9!#+u?+H5G:KLbX@Z:\9K^t@D=dJ4pybwiq1jp1G^\qmJ6\9nLjyR
FpS!C4 +1ceIh6L>mjbQpqH1B%5h#^%l4D@5@aIYuaa/FlQ?<@>1+:ub<kPVDyGuYA$tl$@Bl85>e=d?M@hmu>K
&Z1uQl Nqi&6#*/4utqF>Z<d#6&Mui>HYXd\%:+j@=ie*W6+6Z&e#QIMMB\LZB>em%\ZVIaMZA^GDGIMIA\iDB\
Jc?\tb MFk\RDA+MDDR8VP+MjkE@NGDK^upGNkaKLn?/hny%Pu\Gc\awPn$GZAaXBlIGPC+N8tbiVjVM>Id$!Q!
F*iP1w d1ZHyhipy?NhV$>B4$mQTG>ID$J9^#8aZwMit>/Kh!!>F#$j:&y/D6:6>Mn$@9V<>PL$HQV&9LQySiqB
BAI*XP /C*wIim6/GuylSkb/E*ywip6/Wuydiql/QWbCSkFGJpalimB/EX=*>Q:$:M!TkY<=uHL:9IR9TM>DKML
4<^6K4 QTcnFCMc9T5>JL$4QTK>Kn$ww\w>LcMDQVEDKn$+9VpnHd$pI\wD9DeGptLNuuEKd:&uu>#*=K!<:1&:
^&Y@Ib D?li>Y8/GQM4G8HnHiabTZNaY#TZ8*cP!4+u8at?e4h=FbMGmVLq*#S+pYl94#^/+DZ/S%*@?t:?cNA<
@4&pZ: 8&?*:5$#t*jLK5mCmjdMLtm?P=$A%PS%p*y8@PSq&^:JQVp:w^Nu/>*Ch5JPQk6I18yWtnHb<mZJQhF!
B5It5y KF*?:b%H6mcZ8LZnJM$M%n\!8G*hl%6pm=Xtt@T%yQ=86S$FuEQe^pt1RBZPdt8QTuNtP&tGmn5nlc*H
%wmPE< q+#hE+>4inCe>ew/La9I!C58n>HbnC#LbBSE864MtJ^tkbGLJ\SG^k4cW4p>KHCi&Y@+5FG<B?juF@S4
Y!cFh\ mnY!KK@:!cj1T86/B=b&$h=haHFkca@FqSd\+5cVh/m?$QFHYq:?\AQi<hMV=SCQQ&91P=qX@$%:H46E
P:eT:C n4mpW*Tty=EHJqSWdK^uk9Z!Cw9/=mQE>e:5W#JtbHF5G+>a>Z^1W5T$HYy/Q$5:nb*y:^F>YXH^@YYJ
wIuPc^ ?aA&/iN/>T\\FjP/^Bhk1GLldj=CQLGHMS%/lC1imIb8*hmm%Xy9&:TZ1iZhD\E#6KA\^99pC8<?Cbkd
QhkXdi w6FT:kI?*K>pGGZF?aZF=bV9F8H:*IqcqVP1pK@@1CCQpe^5aLdLua@#mtNqCA:y*YKqa:qVFB1i=D^L
DS*kmH *PTdCa*\h4Q<nyaJZ8ip6<N6n/!wmP<K&>ctScc^ZniddeXhMH8qZw?@$M+S:&XMLZYqiD6A9@$E<K<K
w1VQmH FaHNp*/F#Mh*RSppbLanF8==@A4==@eiMhu%%6wi/WH%p1&XNMP%Qaj+:=m84PbS%cV>=lXC5q1dLE$R
W\+pii P$uZ1ZLE^k*jScQb8?*\*j=iE=HZEtcQ>e?VQe+j?dD6@Plu&@5%tn*i9=D&BH@uHQtN@@^E9d/nQ^Jm
KwdcIi V@LHQt\u@+La#4Jh>Qw5&b/?twWE^9<>ZYY#>Z///ZZhhj\e9d>e9b<iKp%*%m4bjEq#IIPNSY^eaIMM
wMq!$e t!DaBMMGCVa\5AGK#T=5ttCVE=8Z&NDJ&+?=H>$Bt#:aNMGGu%!>E#bi5AtD#X=5$tGS\EcI?MA<G!iG
k!d@l< GL@ym<$ndEVmBlAdLNnk\!aLNk/^+alDFN%N+kMMA9yDiRdnH&cRcTy@pAG9DqP+=A<6aAMYG*G1?6AC
aCFDid yw^5\GF#By9JtA!!MaiyH>Y^<@%%FG@W19SlBt#8akMYG+9mDW%5lIwQ9:Clma%RXZ%kRj#DC6lAFQ?R
JH\9SA Anah5$uwLKYk!S>?\NTXN#E#eDaCedii=Zn!B%i\CcttD/8+%QlNR@FtI#d!ZXb%b4Ynnu>Qb4WLbFd@
XK+9ue DS8E@$GDp49AQp*XZ>*&ubm1Wy91=e5>R::XTLF:Ky6h<@Hdj/4Bht=qi6LN%n/=5FJbepCTn6QMJAck
aE$nM9 &!byJmia^AB$b=QwDe$#dkDc!$Hm>@ER+\ck+<*i*mNt*AC$q%hwAMJ4TNaAlDiWFj@nu#F8ANy4:I>@
:HSB/X kNSZ^k%Ai$*lGwBk$*^<ANy4jNeAlNie4\Fw4:FZA>Ci:KaBcF65*AC$nSp*AG$uGneAdc<%dkDc*tVe
iEG/lP ALThch\A6H*E8AFw?=^^A>B&YcKk6G8MG+C&/+\dkLdjGneA:dY%cAA/WN?+AilAI?MGwANHGDeAHilk
-AWpV: 0002e9a3e12001202b3 Page 98 of binaries1.zip
icFGkq *AB$INi+AilA%LkB/MBA+\ckA/PMG+D&wweGwANZGDeAHdnJ8AHw\A#nB1AD@#J8AD4\muED$IH*nS8A
<QVeEj >kdRNRAh1DB8ADya%:kB/PB?^k%AB%5aN\AhnPj8=D&NG+APDnB8ADyabN\AhHCMeRQR\a8MG+APZtde
pY8ZdD AHS\5uED$MGdnS8AD5+!dkA/PM?+Aink1<aNRAhZG#eAHj#C8AHwaIX^A>ClDPMGwEPNnB8ADl%y*AB$
itbT6& /CVnB1BDieaNRIeGGVeAHSyl*AB$/ELnB1C>aZw%9aYtGDeAHd4Q8AHw$D#nB1BD1+\dkA=6MG+APmXp
^wijSA *AB$Tq*nB1C>+Z5NRKh$NG+AP1YdeRQRKj&MG+BPGY4eAHSK8ZED$CpVnS8AVyqm*AB$!nVnB1BV=9y%
yajbld HVP6qGiNG<bJYYdeAHRK:=Fl$:$S^BT8yiJ!4@$>lR*#b>9!Gh?A<@!jM:15HNe@ZNj*NSd9Jb#y%YA6
:nAS>9 S1P8Cde^dkA/*NG4j%/cmuWe:8ZXdC>NiAD<FL<tCtF>lIi1N8Kuab%4*AB$?H#nB1DDp+$dkA:@\:kB
\\c+Z^ /QA$+\ck\$<bN\Ahj5P+Ain\%<aNREh1G#eA:Z*AkFK$THQnB1An:a\dkI=$Nt+APyJ6*AB$JNi+AilI
MG**5= d?MGwCN=^k%AS\acN\AhKVF8ADw!#4kB/Ml%^k%AS/abN\Ah+eC6B1AnHG#RAHTEA#MckI:\d>RAhIV?
G$JEh4 YRQRER/KcAA/qd=jA>Cy9Qe%AJ%Kj/aB/FV/Ek%Ay@Ki$\B$K6i5NmyVYeh1AD1X=%5D$Kp<B^1AV8Y^
8=:4iB NRCh!tEZDWCueqlFA>CyHGDTAHV1W<aNRKh!+EWD$Kqep^1AV8WkmAckW#tIwkHwXK=JDWCuMi=yAD1N
RQcc!< eWMD$Gu@*>/XkLhXZP8SamY^+!$lARwEXEIYCHZCYtyKc$i^5>ktIubI!m:LT1JE6qSJlkT/lFIwT\w<
+PdSak *u8F98+69EhykjJw&hyHYeJcGlLYEAwECE9DW4bCT+G<e&dt*4qc:*EpRwLP<Ze$>+=?H<&hi?dM*HQu
=F%C8l #KDh@cp?Sn8kA/C45W*4APl1dH</ALwc4%EHRFinL8kA/G1<Jl$AZa&9lHRAhDY&KS$AZa$BVVwA8lyj
t:\c8# >8wA/GwMyNMB$NWjCn5A8kd:XS$AZaN>tu:XXIN>mA/A4pG:4kPkc>At/ADwG4R^PkC/B585A/B4WK>%
AGl6A+ AHRN/wWPkK:Bi6WB$DWwY\hA%&D>/\DwG4T>PkC/BwQ/hAB$Dhc#DwAilYMRHRA>C96&HRA>C8&aDwAi
NC^SjF lj&XDwAilZ&ChmCQ\nL4APlScFX$AQTw5+RhAD$K!/pDwEhluipAcLpwlR/AHwZj/\DwWSn+yRPkS/F8
Mi9?l< /ADwYl^d/RDwY6RHHRBhm*&:DwC8^d4XAhC%&K=%AHR6&qehAF&LNpt@8K>FG/ADwG8^niwA/F4WjS$A
aPZBtn Za6/yAPkc*Wkun#Gi6IB$LWwV\hA%&I\5\/Aqk6n/ADw&9iFHRBhl#bYB$DZwa*XAhB%PHdRAhB%&D@4
l5ND6& APk/6EW/ALwP:cy?w1=DjhaB$HXwD*RAhB&&IS$AZaj/yRPk/:BihRB$HbbhB$DZ+j@yAPk/6K5/ALwP
t&5k%@ ?\WhAF&Q81$DwPYCHDwA8l:HL#wA8l::j^$AZa>>5k/A4pid1RPk/*F<1ChS%KiFHRBhn*bSB$DZw@*R
Z/eCni AhD%&J=$AHR>/1<PkK=H9hMB$QX+#*WAhD%iq\/A45j4%kHR>bmuA/AdeK!6A/AdeA!4A/AdeQ!wA/Ad
%m^SMj <F:wAPkGHDjyAGleIMRc<niedAKkG:=1A1Ad9tECwB9PN\HRDV<$AhAN9#IB$A&*tkDwlkhNAHVDM!aA
X\/^tL 88E6E\Dh/DEB$I*nVAB$+!RVAN*adAKkG#6MAHVn<TaA8nFtA1Ad9&ECwB6Zt\Dw^8?dAPnGK@Y#AS:j
a#d$I! wwJb=jFcFc\1n#iy\E>=@I+P^MQHDJ<KmyZHX1A6Hl?wA%9^?A5/+BYQ=?tkZV!P1KBiiZ!GC1CX^^j4
HwWFVy aFI<@4pPN5Zn/@X#C^/9$RG!iQ!IC4!X^=6%<C$i@%MHJPMnWL$KjJZH8?6kYKEYI@Hw<j?a#/8kauue
$Ph\<K waNY<jkWHaCJ^\M/KBPQX/4AXZq<yk=k^iNLhJAyH9>CQ%@l<bW//B1Qd>IBp*l<q\/A^8NHXcC%QH=i
&lhQ$+ B$4n<S51IF#wS#mQH9@9Wt9tm8CmJl+>@6>qmk4Yq5iH/1B6QA:w\G$<u1?D4jH+K#4kGw@D?npRn^M1
NkNZZJ KFRij%$Fl<4n<%TR1D#?L^W5Kw?9$EGniH!%Dl#F+=6X5K$<9q5H*R1%PIyHn@>*iXEF5<4nh%TRK>La
hTmdHI +V4AFa<dXhC4QN=H:VL\KTPiS49#9%H#C4MM8QX&dcV&B9Ed6XLj1FqLcu5KP*ZB:9PpYlLSJ6Y89<&:
uF@wyt @I=a?TdXu61+Qc=6i$/1^i6>^W#KHM5#/n+P?mSiqiyJ6b:8hhb>>HqPtP/eXP9#BDhX4W?NdWKQ^Kh%
SK6BlL Wm*4</hEu+h?G+eZ?K?M9Z>&9Li^c8!%\mMeMqWyu:u8j>>j8*Z4><>kDc^aP6&d1^j@BL&A=/ZD%uL%
+?5u4q XC!hWbY4F<?CZ9\NH1&c8Hw1q4:t!>YL>>Z!aJ88+i1yYQ4/ePeaT8uF6/?Lu@iMEF?>m18uRwpZ^GBT
uVF>nI V#T<RI1tmq<kbaTwkM&4jm4?:i+b%mZmP\X<S+K?LL#X?N+E*?Hki^q<n+Q9ahC*lP>1<B$N9t@BMVc?
w6%6kQ V<F*Kjn8Bh@^+D5XjE?B:&:\jW/LWP>6$LiQ:*%PEiwhEL+L\9e&?E+G@YH+9kjjG?H:HY9YJ:/*\Zee
MVce?H ?I+I*@jMFPa>Dbb:tL=Kc$6ZjF?C:^Le*6uki=F<Y:jm8^B<Q+Q9RjAhCQ4*$H8H:*L\ZSK?A:G&hm*$
8d!*M/ #5a9#D5djL?F::L\*R&?B<Q*V9t&dZX8&i4e16Z=#kc>+ha:G@SDw1@Si4iE:&#\@SK?F*P?5/F5&=9*
BNaw8F 9W&Xtq+=H:kd8Ah+EjBZePqCZLaR?BVkEHA9eBk+Al\FZkc<HQl$+QPA#\i?AHk%<EZAQ\C?EyhZBL+c
n=P?aE ?B4kc+F@A*\><P?Ad\c?Bjn*\H@A=SPB:\C?E*kN<F*Ah\QjA*\9<H*A>\Q@CjkB+D<D4\X?EHkh<H4k
DH>K8w l+AjBu+E?FHk^+AjB>+A@AV\S8Aukj<C@BV\$<DQAG<Cjld+PiDukVeD9\D<I9BL\C<D@^X+C@A4\K<C
<FCW<c 9\d<P9DjkN<AjlQ+diB*kN<Fjk@+H<AjAu<E9LXKBZ>:kL*AWQii+eAnkEeC%\CQAt+AdkRiDd\L<Fnk
ih?Hy! eeC:A8<G9Cj\Z5Dnkj*Au/%C@:Q\VACiCD\JiAw8V<q>Hjh%N8YNYS4qmJ18WMYAZtcpXR5FID9E<tBD
%n$Yew Y:m4*HHWXZu?j&ebT*lE:9!QEZw<\YPJMw$qlGNdhclkH@A5+LuAHeCh\MeA#\j8Bn+i?AVkE+FQAn+F
4p#l$R 8A<+A4\aiBD+dPB#jE4i8eAZAF<KjDu\qeC@BL+K?FjA9\c?F9k/+N<B*\B<I@BN8KR!<P*Ah\DjCd\G
S1MK/> ?C:k8+H9Ad+Z?D:k?+H@BQ\A<J?B%\I@CL\PiD*\R<AQA#<C@Cn\a<CQA&<AjkJ+I@CV\H<Bjk4+ciBu
^=896Q kDeBQ\9<HQD#\J8BZ\B?Ejkq+JiB@\1<BjkX+FiBZ\N?Hjl9\G<A9\Z<N9Djkh<Fjk@+A?AQkV<C*84D
n#HTVp 6?A\6kC8Awd/>\\HHkFeDX\DZA@eAN\IQAb+F?C^\PPAh\ZiA*lQ+L&A>\H&A*<YiF@k@aAuAp@GJc6=
<@+4+A QMHp<K&Y?9^c^njMGVw<Hun9QLw<IX8jHb#hhpa/&p<6eF%YP^yhwC*6D9\bZ+uq5YKQ66QwpPjt8SI9
Qdyd6K iMu$mVn=h4aFL:$jt4q=\+bu#5*#9m@u=p*DMjtuhY=i4Y==6ZCdbphCjXCmy1ZFY1mD6tWhiV*:C#>4
teHkCw FkVuFF^B^j\mi+YatKk$Vp?5HCGEM4#BaGDdDC<V$$=Nqi51696QV*N#9HhbM?5C$\/ut^@*Rq@i4KG1
$InMt4 ^=P#HJ>iYL$uT@B\#hLbwQe1cXGLj*t+LXY<*w16RC*!/bL%kjZB%keQbj<njySqEpN*6W<y=AX4:kwE
GjJ^1u @MHRRCRtCpK\T+!E$@/&FiqpKFWaF^lMyiQ>@w:I!6Qm!d+m\Nb\PJJK\e?tq^bB#SmM^9yej^Rhk+F+
F?<VAX Z&SYbKA+cGa$lY/t@6+aQMwYSi4H*cIaZThFKtNcaPyWKFq@Iq4$B^X8aTk=EB%aW1^!&:6\^i/C*<?b
EXSw5! :=?ZTEj:w/eZ?#X$6:tZ9T8$BL+IlBJ?/bwnZIZ=D:jKM$nZakSD1ZAwS9l%DZT9SHSt8CwLktnK+9CN
<*k&=& FMWE&>yhAK=XER!$y94hG84<!PtE&qwaHbkjIPBYHHG+i&Wl!K$KEPN/likVn/V>*bF$89k>dIhT?:6C
tyjMJF mWSlGNTYt%%DCMY8Ia=p%^Dwd6eR=Y:ZEPX1%!!R8/yc!GL*!eIW9W?!Mkl&#iCKN$tJK&LZ<H6*8+aw
TT%@ZR h:5thYJIhm*#Q>\1n&nZyN=S:JwD/F/J4udNA6GW^e&8YbmCh5$G8FcF1%%DqL6hR^VF4mHP%c=bILe1
8*mi/l eLX4CCLbNRSt&nZLN5ue#tm1\C?$6@dR#BMC*e$VwpkFSmDBECQM*h\l!6ZeYTB*DdcR^Y/jlTq/?&Vq
#1Q8I6 E5!h\SX91SJZ^N#l>?:tDqH1%a#!j^XyP\kqGS5H$Q$TZI&NBcLhKnhna&EKGl5d+Ha9*a$Nw6!NDcIw
%!%ktm ^kb^45dGA4qXAYpRShRL%X?SwQbD\:#BhGI\:RI/658qm!+t^RaXpwLX+C4FB4t1k@XdWH1=pX1PIdY@
i@PT&B !DCeht/&wdT@!DTMhucGIdS#uaa9I#Pn>YS<w%WqI<?/YuM^taa4K>>8=TbjGTd:QMMR&duP/5@M#CqA
c1l=DS V9Ztcy#>XdcS!9+m6:lPI=TStd@cHEatI\?NTtbG>tXpGA$:N<NIYD9^=TmR@WYGA6t=&Rypj=E%FLC!
*lAqiB M^VI#uW1WEbtSp%pjKN4ImQQ8uB#MbpKqJX9*^GV4^VIQ5>RID9Z1WCbtVpF5BVI#5lXIQ84dAZK@mK*
DXe@Td 8E+F!5nMZ&$PBe4IR\ZK#Mm?nA\F5uM#FAn1La@^/em&P^%=VE=Hn4Zy!Da$HXp&ymPjiiuI6C\hYWcq
V=bLu8 I>iihPTcpk=nSV1!DWlHq8*w!DadHR/L$bHZYHVp5SMhiW^ES=b%/MluGDw!dWKH\^^$bFtCnt\n$JHV
jW<IEu @9M%@b^Yu/@B=:d%uGci*eL#N8/5hy*hyQP$=n\N&hGGe=y9h59NcdVP>y1@1ib4yjpccHdd#N555%1p
pakj#J 5#Ft6<PeJyl=?%yn5b#dl*pb6\<#5t<j=tZiQ5#J8H&a+d^>%uuG%Xmb?t15W?5KbQp!d=@J586Nb1ud
GBWaNX l+eb6\<#uLjQQuj?lHZ:<Dn*>tF8>8%#=GWW\*u:4QPeC*deQ85Wd=>>:Clb^8*DnC#n1j9p4CG=ui<e
>V8iSR kthpbk<IuEN5dPR=An8!bHXpm8uIpJDHJbH6jel!NGV:FP#PIqhM:yXqbGd*XJqZ=l!khaaGqk!GqpR!
Fi5ES+ 5&jG\\Z/a^8jpi*E&=deIdwnu>SekVpwY!>6qJYVne11I5^!%w=%:6C+9HWmQ=hEpu:X%l%n?y=k>lkR
dTJu6q BdT6CEikteWHW6phjLapM:m#JYZeul^JYG8=^iuIKEqH\WLp?@*Mu<:@4%k#&j<1:b#>4%dh=j\4E^QV
LytGJc npw<wb8y\5u1d!6+5lqQ/Gdm>jPbtGlplePyyZQ\e%TXCu4qth65SM%Mj6t#A5Ym9cut^PJae#ni*^<j
-A&II< 00072b85fc8001202b3 Page 99 of binaries1.zip
!NB$>Z aB&yQH$RX1SQln:$l<K5DJY1D<PWQuR9DTWnjc\GFc<QXXu&aWpm*LhetwnEaC@4S<Zyk!?9Q1A8SAjC
#^>@b/ 5eG?CP6ESiuDeK$QKi+\YB@pp!h::qkjnD/MWQwRuBWM^/KSkZSu6JhHDlY5D#X!JRH%i1>:MJGIJ>QN
:Y@<<L b5J#e#DwD!anaVW*w5?9q&qndjq$/pPLYptkmD=\ZXYaQun#/INqBSaMSHEb!XCM:WLF/MM\yR>tCh#8
XF?185 hGmkL=V5<<NIIlqK4t#GGJuA%Kt5C^YlD%W$jYB61BB><BZyL:mmKp<jl8jSB//k!6YHEd^!HbNDH$cc
J?Y=&M &eZd9E+@E>NPVXbeWAWdBH=H\eT#m=tacMT#m=ueS>e<8=mJb^e#FhIHuq*M^LPLtR4yA<<8b8Lb^W!F
DjdldZ >IFuF#M=>YEp#!=t+6uFVQu$waXuF#MJuq*MXFAjiHa^E<<8bm1pD#!:tIquF#MX$kiiZe#E5+8btB!E
iRlXh5 ?*yW8EHkh^SM/G$Kwm:I9\1u5bMD<&c&VjbQu6uc$\yJeE/kb*KF&RS8EE!5BW^MJLImDwyR%$K@*6S6
\jBJ#J ^SGH=@q?FZBQ&/KiytVaVa:eqK5aS5tJyIylWEkp=b@Vn+/lI4mt9um+qKwJYuJm$h=m8M=w4!=MkR1!
MN=lKN =MBk6bmeid*LZPXAHX1duiX@:K$N#F8>uHBH6bVCtEA5qT1HuQuh^i?+^ESPL@4>Kbbt>C+6my5Sm5Zm
/+p5Wi <RH@:Ek5WXVDq1d:T>ti4NGT5\!895V/WSyjY9$kHVeu/C@%j4YkuGmm9S#*QbqKl56^*&ZLCehC^dTS
6</h+C Wl+y=@Sww6V4a6<VW/WV?=:a><RpiA>Fywwu$H#8C:k9aQJ=&P<wMHlI?EJN<eH$6w9+MqB4MNkJ>dq1
!8ljL< $c4Tm+V!:JMFuw5>%h+#564\1uI4k*56PK>Tq\Ci9^jh>9EdLEh><EInVDu>GT<$\yT4D+IZGtET9NAI
II&eT< W$F>+IXGtHmlEcbC?5ALnVD^RmNMljTB6#Fp+wXGtQL1R\59NMIpiKESywL/\A8NMQFCI$!F>IEZGtHm
!H6T?t lWcaC8pDL#VCqLuRCP5D/+QI6@AMV@lt1p\C#ih6LjthFhM\4kJuH!t<$DCRbE=Z>=\&4yjKy1ZyhKJ=
^bllM% &nRMpt>KDR+$liQ>$^LJiN>kPJ&c61^9?dTDtk/c%leQy/cFE6Fyu</ik4YAmdYAmaqE%uJEXYXwM%+a
i\:%Mw whYW4j%/lck=i6:S4X%6VY&LCk^6YqVS%ahPe?QNiN#I+$atHneYJw:KbMynKVp1p!qdH\SHbVIJn5yp
1hKi5a K1kQHJZJ^FGbVIZ$kcM!tVk1p/tRQ9D&:$\eqetWX^>cPC1VTZBWJqNBjiCwVCcP!tR1yA<eqeuEWbqM
9n:Wtc ljTBw#KbM1Q\tLkubiKiqIq:W1bTiqKib%<^>=#u&VNqE5huetRip?D+VCatGqu^timDCdq6y<=$*J!k
a5HReZ j&:45c*IDa+*Z4nL9BC#Jk4SQ6G:jQ%6*8X*^Kb9kH@a!*81&G%yZ\^Z%:tn8&j?BBnF48%1P*1B6qHc
l4WS6L WupjcuqDH/*#QnS:Zeb\jN&ynh9n&9Jj$<hDiL&9+M\n+Zqn/>d*^1yBQ=9\<6LJJ/jTwYS/8@:t6J4B
*4XmmA 8ZN/SNWQ%%u*$Xh%^ZS%Q+?eLWV#dF@X>#hX4W?NuZaK6k@QZDFK6ki9/P$JJdGhuCQdmXheEk#Gi?H<
%$yblC l9uS9p=5Q/FIPkLyY9niD?uG>qkI<T@&hPG8t?K6SDK!GNKQeEaKQB4X#E#G\b==>1%cc5yZFSX%YDZ!
uJP&dM iJuaDbJj!C>YmV*l<^?!#Ajm9DmQjAd&NIpyj8E=Sl=@Vl\Gu?h1QD!%i9=ZH<<Xa6R%?mh/lNw<hylD
DEuCcG l@t=uJ@Ltjm=uJ@Ltjm=uItJmjJeZ1#F:AyjH/JGZ==D%T\K#&G+wnGpl?Q+D6LQ+<:%pB/lJHt?IIdL
tFNp8d 6FtjH/u^Z^VXMn%K%M4$T&1+=@t!Vq5$9qYuM:V<kQ:>tV1@Ve64%?YbyZ>@65I#FVKLQPPDKa<?<I\Q
eppJDX Jy:^\XSIH$c!===G:Lp9D:Huju5Ri?+@Me<>QL<eHS?ICQ@lS*V\nnBMFWm65XmqD:B+nM$piG##cSud
XJu!lN =N^Gnnt4iMI*</QuDKRn!aFI&6?&IlGLJ+e/%y5VWj@YFFpS+S16RB18u=y1N#dcV$&%#!W!uyy1H@jL
*A<N$R y/bdQ<%QViy>XTu>w?\ZQ5uPkj8EAm+jwhcAw1KDe4+H#@pRa!eH=5%5t?!jQLP%y^YT+J^A#?SK1wD5
nuFIKI YbDqt*M+qLjJumLn?^%6Xtaq#S9%Dqq@iBb6ldljBM?mbe1mmy>FP*S:YV:4JNlTFdSWZB?b>iHblyFa
cXlZuT <Z+hc6mDd!IQAn/ai\at:luaI9Qapap6BF8IddIR=jEpXJY^TMZK5@5uGPp^S>VLhK:?uR1Q@PC8lat:
9l#Y6$ Ft+SVN\mC6CMWCwc>y5hp$:G:T<PQ&K=cE$pa6F\KB&ND+lA9L<@NIB^jcI>EpwQJmMyER\N\Gh:NBd^
?!$m\Y V@J*y=PSWL@<u+m@:hVIRDwqP1My?NS^aGJBPl1Ly1MS#Mh>N9Cwc&W\mL>*<5^I:?ATHVuaqAk9uVyX
Tk^HNQ BIN?XdS8jMWiTVcFE!b9jmRXH$!GI$*JXDKeJ^6?5li#Y<NajC^hhGBJ!pdLu&8NSbJyuhjy8Fn<wW::
:nBa+F k8Xbc#whCm@6l/6!uIb/a^F=PmMbD@YFR!qh!E==?VPn1WRwHX/1<:A8IkQ/JBlJS8N><HM^>j?D/dV%
^%AYDl 5/GEZRR5?/tS:uA!Hw9yj\#EB>J\Kw>uSpP^?JIb<SZ1N@8m/jbwJNau#>4n+eGW>SZ?6HYM>$\hSMN+
aFhk+8 F>X^LBTP#I:H4K5NRtYq++Q1YnN?9#9h=!^CV&SFGu>aul\dnb\tD^bGB@4m/uA&XGE5wuSDFV1WDnqP
X1>H$% Hahh<d=IdGa$GRtu+$tVM/>*GiTa<&A!uwDd6lJ#Fpl6W<4Y6WV?$+K&FiqpKJ^8V<d:Y>6tSqJlXbZJ
VcnNZQ bGmqPbwDh!yp@R#e/WVIuGJ6&Reb\P+=<^a5!6KEuqD94GS<MCFQ=wj/wuF#1yVP9yZ/45L*y^$Z%*il
%$n$w$ K#I\cB@MCKujYRDXy?y:RZ55Dmw=5AR8bHp/L5W8/GuDcneTeSyPIBbKyTIy?d*W:TZ/q^jMVIbPk&Nw
6u$*ie R?tIM\Ndw<K*Db\cVeaH4E6c$BFbCY$/nR$SV:5m@jHpT16/+S/Eap4#%NhTX$CiBbkjCR%E?/$/k>Mq
Y^8T+W WI%JhYWLRJempaEkYAN%JZAhQeqRNK%EKd&S^%&l>FK\ElnV$B/cetl$&lF>?#hBlpDdNH<Rj4E@Aq@c
NS5:Ht YaGyW=65<MqPeKBA94!bVdaMnFl6m5FSc=9TPG&%+M8tiH+VGR\G4HL1Z+KenBI=#>Z9YVq!H6>mcHXb
/q6lA4 %&S>u%$G+hnSV6yt!QQQ/eh9MjBDhAWZPp>ulGK^PJm>&bEa%PXCj&AcFEeBF@1DwSRaHup&Q*K/CLc%
:lZZ9% P@@X?WNVwDn:P*>KZ4IqVy>weZkG*J41F+5C<>4duj@m?Ap<qW$\j=&&6@bAl=JMyj*hpTYwpcI=%ATY
VIwV\J TDRZlDeZ:L?c*Y=d4tdkL1P6jj*SAjlK6mMBk6RBjlZC4>RymLEAHWJiXT\ttwWF$l&Rhcd/Hi5MFS\:
kqNT^F Q6q1M#5>tb?uM^Vl?EA1D9%NKn*aC$%ERDNianR9$N/XZ<&:F1196H=b!l+aVKdm&MD^^Da8iILh8Y/C
NIS6$j ac5*6ZFRLQ&XQA:K@m*q#ILtuMnI/I!Eqq5b!yRwaWi4#kKP\KLDV/T5Z:G//4BaGEwP\KH5ylGdYJLR
e!FSk< SeBDLSkQRT+iLIdPIdI+bR=:Xmam?lS:LdA&Cw@ZPGiiPi=PSMKbb%CP#A#w?DI#n8&b$Yq!:LGN!4KE
q*6d>/ \*@b9=X^Nba?hM5>4>5G\5tXmjVMmE#\W48nT\dpKA96>tC1C?wu6EVc:^q6Qc$wLb:5Y\l%LV8AYeF=
Zy<Tl8 CVC4%5W9TRVpS4qYSkFlXlu/R>GaKwjKc8>PuL\aPquR$+#&aFwAhGK6\eHWW5i+bXb4h<Vbm?I=1G^j
py#N4i KLuTGu4Mc5$e5e^1:atta=G8/I1wJRM/p*:#H\6t\RW8nabVn64F*NbAQBbQ#k@%!/5Q!QIy$jLeMdIJ
!I5R&w kAbDmTLa+<l@TtX&*\FHF\%mq$dC!*96$ntGakHwE*95+b+<5pe:<1\4QlCjFau*S>LJqTc*G&VDb!St
kCA$>? ^nRKQSlLS*P#yX*5lm^>1#8QlWG!@aY?$?G?=hLmYEjcG5uVkLW@5pE+5@JCyZ*P!ZJCDeL?Atwue:#y
K4@=eH GAFujLEAtuutiCLRE?tZVWcNW=$HbnAIKm#911ZBC<^6T?t:a:SIDS8W8hRtyT&b6K&dQ5/$\QwJ\&uS
8+kiNA hb/6=QdFPuQ\Z%TlLHuH\uYlq5l#6Y8=ldi4QDQdCM=G=\JFh:w:hGwE#DXw5qXbAVReccZ^cwB6ZdeX
bMyRnj H6Apm:bknqEF/>m?5VJDZ=F%4L+M/E6!/D@c/<F?iGkJ!:5B@>K&Il!^9+d#qK&Y1W!%VNpKqHIwWCDd
*8XuJ+ 6tht!M=VNql=Qke:Q@&el5jYR+\T1yQMK:MQ<qX%9n#bn#m/KDq!^b>FLXdhyhWC4ZcTeYI%8d#6#e1$
K>kY8V Y+<^X\5eR@6P&+b&S1*H6E\#K!$HZu:M5n?YpdVH<>a#w9&p=#DNe=VJ6CDY1hPcY*t6ZXtk%1=eEJ4m
C%GWtP LEq+j=\tQbCbaS+k>d@AI%\ECnikl5L!MdbHh6RTDA<@aj8$6e9/%yVJRE\S5qFRAVpw/<uX45ciNn#M
El/mwE jLJ!>Aq&#iF=j66njk/q!MjAGiajY:9!ai%c^l<*A4L@Ph9EhVy@\ZqH:X+Jc>*=yK=8VN/:%V$aVb6i
nCS5B5 PCC%K?QJ*^c1M1#HXLmXhwc=HlkAlyi4K6TbcIQXI&bK&TXqIi:Zl@i4l!>u@L4KAGNlbekI><Ak>PZ>
MjnXQi j8lPVwQBV$1$luHaCM<j/cWykdEyEZ^1TPQD1QbKhaWTCZp&a#Ac/@NL%$BK1PjnTNK9@keH<Q=A9C<!
ttiT\M K#Ikn&hGW@k\*R<hd%I+TwYHMFdFB#PluwACcyQ=yD:XJm\q%JBd6QeE@dI&^b#=@uqkLj8ny\MaH44M
X/d+\a j?JFYn?P^^p@:1kBQIVHKJZ1R1nHLj$V?nHMCFduhyqWbT9DhH@GthNWc/8tn4K?\E6matJma61yb=S+
NJH&4! QDp#VQRZPGZ%RK@HFZe\JDMJ8EMkiamA\<DN#^F\l$L!H&++Jmctubl\TqcN@B^XJWR6L*DD=FlEWm%+
d^&SKX lBTL>1ccE+6n#iF+j*><kHYp<9SB+MVYHH*wD+XbGTyXH+ayjXD96FkNKq+j14L5\=JE8G?=NBGJ\X:Y
\SB6N* n+4VB%>ijWBhmA/Ea+N>EhcJm6KH+XwjW6^l5D=AW1*$\Z1D#L%Eli9DCKWQPF8A/+Z%Ra!$:aM>5aN6
yuDlNV SAZ4R$&iVa@MyPQtaNAjVEdC/5X<u=?*^@yW/$MLHldXB//4C6MHd=FN<laMSHE=*FCM:WLF/MM\yR>t
TW$R\d A/V8hAlu!9j=XYDp!tahRMT/WBH/WEZVB>cGC6EH*qTXmVhXbT1pD:!yKqQty1w<<=GJmWLnQBud+VI^
kYDYuR MSFdDLebJ4ceVE^5Pbt&^ZDmE5PNJu16K9Q4pVaPq$IiVeDNl?TdBZHtwB8TM>&n/?VYmK5I<lbBe1LB
nw^?Nj DT8E?\wpJ^N\^$H!HRL8iEnPJiBPkiT:lP5NRZIlAajdZF=E\IWl8bmA\&$!L!HkwyB<n+BdB5tqBN^!
e4GT#i TC+n+E/H=H<I8QMk8atAP^?Tt\t+C!C=laBdDeu9CdmLILtXkQ5bJP5IPN^ChAPljiC&w^5J<1/H=CtC
-A*yyy 0005d935a59001202b3 Page 100 of binaries1.zip
kJ1L>: 9N>C<nRB>#6Iumj<:k&RdCdk@kDJFkIP6+y>qaC:C=LXBN#hpL^J\N$D!X8Ei4pZp4eJ8D@L!S98>tW6
TDnm>m JGMI=Z5RpuaCdl$p/\t+>Vm1IPAikp<9Aje\JHMI8Eek&aYAi^TT*Rm+^!CbS5A>DppdAdeBpkMI8Cek
/y4PMZ &b&A&\nJq\m+J!H=MkH*F$n&J?CiktSjA8=yTD+k+J/B=CACdlMpi^J\#$J!JAH*HCV#CLnuITFE@a9N
9%Sb9> pE\k+F/AyI8Ai^E?l^F\L$HTTeC>DAql%RV^X$kPIiC&RHIwAjeKJIeSeK>CMw8Ai\&TZRt+%!EJEuB@
tFD5P? k&R/AjeGJAeVeG>CMy8Ai\8T8RVe&=C$EHD9RNJE\Q$hpk<J8HelGW9A9RjJb\k+*Bd>KAL8u@BbSeC>
Q&H^N6 D=<?A8=j<DtekQ5AQpeReB@C=$kCDtjhnmi5FwKjNRTeF#=4CVne&K?PkMMB^w$EZDX<nmdkc8B#VIF^
*^Tqd^ me?BG\YjlH:cW\8jBQ*#%MEuad#l1ahQk6*\nIbpBkE*ByI9EuC:\CiljZnG\8eiBN!8<LpZAdedJH<p
Qe@&dH +QcE#*$I8L*k$$@AnajpVkJ8H$nYEHB?TG+n+D+Lu+S^mYhjTG+u+CdAJ/E@>$!G#@$I8CtR*EHA:R?j
CG:dcD E\t+A!H=AkH*PjmeR5A%\Thl@PibBy?Eei\P9$4V+jDb/j+e^dmhEieq?nG>SD<t+GbBeq#B*#Y+8WZ>
kiLBdQ nkcHC%YiSMB%F9XQG6\^FD?4X@qnZj&5Z8YQZWYRh##Fn\t+E!l?VMChTQFnA8+pml@V1@!5q^B\jSR@
!eb8GG yqj=ST<q+BbV@JmAG/V+MRF*N5YQCdl#KH=M\H&H+5eE*LpWQ/bZ?WX9JiA8yjk^AZe=^a<J8C5yjp#A
j8a5RS @bLm^\VeXSR@J8B?SjFnA8:ZFD<t+K/q?DEBh^*Fn?qXj6dXBN\NFD<t+G/p?DEBh^QFn\t+Q<Kyl&DH
c+<6*N d/Q+MRF*P<YQCdk:KH=M\N%J<YMCdk*Fn?qXj8W=BN#hFD?tX@tXh!Qk:1Z+MRF*H<YQCdn:KZ=M\Q&J
MW@R:< +5eE*AMWQ/bZ?4*h@bli=jjiu+B:pPLH>C1@>\eE*H1KH>M4@h:8jp!9<u5jTeA>R9FniyZj?*ME*GMW
Hqjd86 Q/bZ?d&:CLkNFD?tX@t>P\t+nSR@yqj=9R<l+Q=C<YN/qh@:MAL8cawj$/9<*45TeJ5wjp!9<u6QJ?Ci
^^kVLN w@k^9e49Qb8A&$#^a*1X*:8FkH8S+5j$K4@*l\Ve!^R@yqj=9V>D\G&l?DG>$8@6:5j$T4?*8^@VK@*i
M:S*ZD :u=M4@S:8@5^9hL9:i:H>Cy@>ukC:m&KH>M4@hV8jp!9>FP:?#G>!p>>I\H*L+wj$/9<\GMI+=IQKZ=M
&cyjCV \H%E<YN/yd@aR^l9TH<^\Y:Ik5<k+Kwwjp#A?Tl?VMANy@k^AViT+5j$T9?#8^@V1@#A?^B\>SR@J8Ac
RdT?np KH=M4@IZ4!Hk^qD<tF:qL!cMT>Bj:P:HBN\+ml<VeJ?l?DEB6\jFn?qXj8YJBN#iFD?tX@1L*j&aZ8p9
wP<9lD >lDGj>JjVBnHTn<\ad#l&a@m^\VeSIwj$/9<!wV^G91XQWi:&!9GMW+Cc$jNDb$c59d5!Wj%4eFky=n=
K?ud>i *q4Q!lX9CP<Qn^Bnc945d<he>&%SkD\4X$/Z/eF@iADhd4n%eVupBGKyqGkK+$/pBiX$LjVnhRueV#bZ
IX=H/$ #1>jXynA#HKWb*:*@EA==QT$Liyy/q$1m5uJ&Cc*\HXJPW9V@VG^*>QC?<T><pd@=Iuh9V@bkE?96+m>
lA^k9i V@pAA#HljJMajW&L&D9!Y%H*4&eBI@De8?m1Kq5P:nE9XySW#%JPWpRVSi+Zd854FdGIuPQtBQ&m/jTm
kA5Jcd emnq/a8HB<6^9?V8jtYRk/VWYbS$ZXIPXI<w5Z+ce*a*!/I>qEZ+^$uq5Rmq!?u1/y\lwPtEm<nJ&u+/
c/i<y@ 9$WIh4cZSa/$LKXj%:\be@%8=eucS#69ibTFK4$<qwWKq<NClWZ^/*L8AX=W#6Tywm^!\tJ1YiRp!mWu
TF5^8W Wbd4m1\wK5j69y5iSTRTJbTu$bKVELl4dVE=n8*im%^ZIyRTbbEVZqyKQc>!!AFNLF%PWwSTSc+Li$14
SqSLS^ \Si>:/uIpqL98?\yWXA=i5w!!Ep6njWK9QFF/mja%8=1D*FH?uLIpV$8XFIy>S\$Qc=n<<\CQi:4biy^
En$49: Z>@PQT:8y%!PH4i\HNZn9q/i5Z#yen/Su6K8uSJ:Tqe=^J:TXW/mZHITbdt8:h%VFmnQ$H6KI/m$u6JN
86X9^W D4GuLHBhR?+y*iRRi54YFKYuLC=HdXw5m5ybFJkHhm^bXA=m&4M5Yh=uW%VE59T+ye5baw>d$D+Q5ee6
$1M*!e KKh5Qi:C/MAlB@6ZHHF+kS/*RX9icC>F+$FPYT!91^!m=ZYXp!mZuESb4w61MR9IeXnMPFV%dhL46hel
1:iG$i a&$=hV@iL>QTKWF+&/ZZC#%pm*/\K56mqpEP$YIY8K+lY$\*PYAWZHwWcBe\AkJB^d%=pcI>Ck1JyHSn
H$pC1h Fl>9T=b!a6FiRS6B&nYW6##^*tZF4t6i:#JZPhXhkYLihJAX/F#RDbeiYj!VDRW%LB<bDd8115Wik$MX
5L::&u FyGV#%8X4cq1DF//HPY6C5hTSiSpi/5K6y!\KC+u/&t/5B^wN&YSA=c*LHJm1cLqCjkD/Au&B>VtC<t5
5Dd8@1 iq:q6PBqKR>a<HLIAZWYJim#pRMYwRR=ncbHTT$8S*uWGJ#RE/kKK4%HebMDQWwJ>!84S!qhVnwqT1*u
$d>Jh: w?MDEXGMQF%h\cRwpcVFhHt^IjcWjyaT!jc#qEGP6QE8qM<&b=P$<iYRk*/YMq!Z:C6eKN?dnY!T@yw!
4PqN>< qMj!%^TnjQ/cdNJ>X@H4!8MJ#m<HYtlb=IVLXJ=E8iRp!mIH@VWqp8+4T4w8^>PHt=!eN^J=!+N>SXup
BMGD?# lJiYeq%bjWWb=CRGT:p8l>?uKKHjl*Vj<R%JmTV>NYY\Q>JjW\a=$q@nR9uidGTV>NiWRa:>qFeCBi&i
WikmDd 8!8TZFJk1DBmS?8=h<mi1R\6b*61KwZeZy*6>GM/l^i<yDFhaVqqG6Q6%GP^k4W#^LGa1=^\te1VKJie
eF&WBV SFupdP?^YIH!DH$5X9nClnaYe=NDHI5XEDQp5bm4HPyaLL?k<w@FZMaA/l%eWbL9+IR:y6*FI8:pa:1C
4h%>Fb mnnEMX&SFq?iMb*d^HM^ipj48RQ#Xm>*Ha@wGddFTM=kL+Pe8e8Tm=8AT:t8^p@:CEDPlC?6j5^M?NL8
>wp$u* X:p5yy\JZ/L?6KCecKK>HH1+w%qMccHWnQ1T4p9K\Su%JhcQ&&RD$Vmp5c4nLY>Ja%XZPiE!qThSLntJ
*c8:6\ 55lbYqw>D*&MYdlAR^6n85plnnELmBu!GNNXDuYMtX?RGYP//1Gc6iB1iTMyq%ccM&9l+^4:TDp+c+H&
:KX9#K :F=Ew@Y5lTKWd>bCAT5&M^+8aKJ1l#D&tXt5jwa\>mp1l#LYeP6Lh@K^S6H/?RVGGkZLM<T^S6H4ww\S
#$c%&Q KQh>CGPEtY:6uVlGKC/Ha*E=FyhneVpYq&N^PSb*CBcKa*GL!iFa*H#q+Xlen5ZqYN#e/?JaZI:F=Xle
=+bGqD n5ZqYF!P^iXaZI:FLa9q=Xlen5ZqYF!P^iXaZI:F=Xlen5ZN%S?P^iXa*G&S\:G+HI6d8l!P^T%YHw:F
Bh*qB& =XnedbVD5dk:T5@N5dmqc!1FPBc*bDpem<8^8KZK+Xlen5W6cT#tMkdkYF#1YI^neV?&uy6neZjCERDH
c?B*AG +8cqF5G^8B!LY=c^K5jm8w!lPBb*Y/:LnDE=FyhneZQ/Ta:F=XneE8::EMaI&!eYq:$b:M%kd\b:M>md
wT#*<N \h+M>tc\N+P>Gi#NaG<Gi#Qat<HiDQbt5Dhny@Nt5PXp!<tYp!$uY<+l!jGKEh59Iw1>X8!%a1<Xi/$?
%5hRkj @X+4n9$5YR:HjuL5b?q!PQc#LN=Vn9*e%y/da#<=>9Qn:dp=>4N$VcWR^*/YLIhnQ#u&5%R=HQ9J5!XL
$I$aJZ Gw8=nAF+6mS%LLdV#Jdp>$^q/iH+QXNiclH<u5qNn8559u1i^dehb@Hl?yude\#qPl6\B=6>^*M@Q9c=
^$Wy%W H<IntJma*GteS:WX*n?V><@p@VN=@$#iQ=Q*#^!CliL>M+9J+j$#<=YH><@p@VN=@<#e/?L>M*u@VN+@
<:K6q5 p@jQ=Q$#ij>M*n?V><<5m?Zq@VN=@$#iQ=Q*#?V>M*u@VN+@p@jQ#NWj*n?Va!m*SR:HWHIMbiq!PIc!
8=Him+ YHp+lyJnKLhSD5hR:mk>N<hRq1/yFPIa!yLqeA\q^%CYKwhnKDtG51T^tM5akGMw1YM^*uHma?8=ii&?
+nX6N\ uZAE\G9*=cWY\Y9*<a+VbSt4<w+VLtMw*uFmY/:LnDE=hydZVe@yJ*p>C%:QwwV:QwR^\ubb#/JKCB?1
?iQ@qe kFhF=u1Ey<4=6WiM6HH#IjqtRb!S%\*JtRduKaV4RYNLpLeIplMNdqkl*FekPbtAP\/T:^B\^$N!LkGH
dkZyJw 6@Y:lP9FyuWlAajY?TICD8@1^RRe941+lICLR9I>Ak/6@1WEHN46!\k+dDV@R<ChB<qNBN#=pN^M\F$A
Kec@NI !T$E*GyIjp@AZRVJ4RVeD!BbS<BhCepGR99+NTSQEPShDeqVBHuZRQI$AZe6JM<Vj9e*pG\t+K/HbA5B
#DX@@P >#6IZmZkdwbpNRF*C!S9EuC@l?R6R4*<AbK*CdndIhqK5C>*RDKGWL+:IYpu+NbA5y/A8\8TeRVe*ZD1
#jawZP JiD8kYRPAae4B?^C\N$H!Y+E*Q&RVCQk@kSJG\GHEVeHEHB@ltS*At+6JF<m+B/E=M5EHK/&5D<B6^/T
SS!MKh jRt+l!D=kIB:GJKDCLlHINtVkH5WpmMJ8Mj\aaPAi^!T#^F\G!CbRMDlhMI8At+nuA+n+J:El!<C:m?R
GkkMP^ HEnAQRZJIRVe$=AeT5A>A<qlBN\tTGaSeM>C5m5B>^\?9BJ\#$M!uaDdDMuBBN\LpM\t+F=Eq#kB>^I?
iX#>#@ plB\PJ?@maD:K!RjEuBdIBqL\L$C!YeI8FelPa1Ai\%P1\m+%?HWS<D>DW/HE*B9\PpIA8=NPB%J\L$N
CEunbP !ZkC:l$+4THk*wZVYkL8QVm6I?D?AetNBN!HeD1ckQ5IV5eWGJj+HLm6<DYlu<bDD$H@<A5Qad#l<eIy
nj^K/R \Y=+5K\#CLnlpH!SkB5By+V&+aEub5<iBF\NuP=F\I&C=I<EZAPe:pQANeKyu+AdDethBN\8pK\l+HCY
H+a8hq @t$E*Dk+Ja^LQL6Cen5B6^8eE9y##==\8l<B6^eph^B\+?F$IkGHj1+9EHCjlhMyBN!?eEwa@*pt\Cql
DK!FAV HP8bCKiE<abuEmRQEZBV+JR\D9NMlhN=Bi!RaB#n5nwtpl<VRLQRLX#\8h9k=ld%P^we#pE?maD4LP1j
TKhQtF NLlnKH=Yu@LH89ybjewj8+wk:*mKH^N\J%D<tIA:piLHBN^JFD?tV@qbL!Hk?ml?VJ@!m%=K\C&t?DEB
Ky?AQh N$n^a\L8dIwjE*DuWQ!akQ5P^a<J8HMyjp!j<w9iT5BhT9FnA8=!ml@Vy@!hV^Dp@bLm^\VeXSR@J8B?
Q/IK!n SjFn?yTjhVMBh!*Fn\t+/!l?VJ@!h/+t+G/k?DEBh!QFn\t+t!l?VMDhB5qHdu=Mu@J*nmGW:\/KH>Pu
>JRkQZ @J*4Cdk%FD?tV@w:*j&aQ8u9hQhn?yT@e^eC:q/KH>Pu@J*VCLn:KZ=Mu@J*HpDAQWD^a@1W9@NLBN^c
c+$>>N ml@Vy@!h?^N\/!l?VJ@!h*=A\D%E<YQ/qL>#V\L8Eawj$/j<ujMI8Mewjp!j<uhPIPA&WQ!aQ8u9hQhn
ZbSWq: ?1T@$>&Q/XQ?#kMJ8L>R@Jk?=i<<qIB:t8LH>Cq@=!\CdlQFn?qV@5+kAjee^a@yW@:Pk\t+#SR@yp@=
-AR8>j 000a0f0d0d8001202b3 Page 101 of binaries1.zip
qk?q$d P?eTeC>T@Jk?=i>5I8Biy9k^je4jPbcA&$L^a@1W9@MwA8=Xml@Vy@!hQkL8hawj$/j<uTMI8Dewjp#A
KbqIhn 9WZ^a@1p9>Qhn\t+9%Q<tD:q:/\n+N/n?DEB>\HFn?qV@p=ZQ/bQ?V5y@jSYml@Vy@!hlQGG>HeT:Iae
Z:X%HN iM$k+H\WQ/bQ?n5>lQal@b%:EHDXFD?tV@w:*j&akK8u?DF>!6@yJ?AcKZ=M\I&l?DF>!6>=G\E*q8LH
wKe<1= >Eq@y:5j$!j>uS=Cj?:bk?LH>Eq@y:5j$!j>ui=?VMD6R@Fn?1T@$>&Q/XQ?V5L+V@w:CiNa#*+WQ/bQ
@d<b:/ ?n9h@bmAt$#^a\J8j%^K^6%@^VnGjZI+*yPF>&VlQXq+V^dip+Z*bBtKliI>Ya4J+V%b<yYH>&VlQXq+
84GH>1 V=de/?I>YZlQF6/Vljhp+V%biE<Y*yPF>&Rym?ZqQXq+V^dip+Z*bPE>YZlQF6/Vljhp!hWj*yPF>&Vb
1AB:Zl Fnt<J\99!XK/HN/VyXl=iE<Y*yNqG?Z\um\:T5@Ni:KW41pW+n%bTydDi:L\um!q!8E>YZlQqyLGam=n
qGGtS% AN/VlVwY+#%bQ4cit@hp&RqHAL\uT%=1Ed\uC?@JWyc^K8@J+nKG+n%b68Y/#BmV>&VlQXq!?puip+Z*
\Ahq$C bCul9k>lnLBh>tRS+w1JR9lFj!1hhhjG*TNE*T4I#%K6Eh%CXGH?RGc?=%n+tAL=$e#5h/<Xaue6j>nL
<mnu:S n61/F#SQ!*jtV=kqlE@Lh?cQ\Fn=QSLJ!GJSj#E?N?m+>^Fjlw?^K9?<C\XGF/9!H\ajXTy@A1=#&KD#
+l%L<q 9&D!#*=B1#@tH\Wj=/9<:?A/cKNXjnP8@dYj#K>dX+&iZb&Qc<:W1Q^Z$ZD9yjJdD+TQT=Te8*Gh$9Ec
I=jYui @!a?Pmu<K%jA<h//kuANMu>@PlWVnql?+b&>G%#Y9j*ySGc?1H$KVq@8V<jmtjtid?C%AD/cqV@F%B58
bde&PL j!k?1@NutH4:Cc=Q5/@KH%=4/8eGZM>5t5=9NQq>GNk>ZiiQNjX&G8=9ebDK>=%u%%9>Wdni^bE19?1d
d:1/>\ y6/i^ZWe91kj8^?&//*8jX!Z/Ck6=&1:*84QPk8P9/VL@:1n*4!t*p=+B8:q:44iVL++/B=H9Vu!Qbe=
M5l@A% /5&SQ*AJFQN4@ipqYjw=BiS+D?^QyKKb?Ri<nSH\\e=WY6Sjl89*6iwC%b6&+eVQ1aL9^5L9ynL9X^?$
uyh:TE I?>iP6>SuydZ:jy5&B6d>FhW@m:L:j15d<h:hJ\89#B/?A@W9iNXj98Fyn=9^jY+V6DqdLj%bPLNl\m%
N+c?*A FmZRY9m6CZ/bQ&uibMnRd!@jQA6%SiYQ\QWAXYe&:J!FeK6ZK#t*+*1S&l=+V<E%lqV?!/DdRw<il1Hh
&tp$N4 &X*qZ+94wiu?*uPljX&Vq8E%cV5$DQje1Xj+K%/Da?&jG@W\4uYp<y>bc%WA+H?GP1d!d<X/mP9<y&\=
Vnc$V% p$:<F^^4Y>wA>iVb1QCZ+u+<Z>X+dCQ1ime?k1<D6d$elt5JHc#!4<a&yC*:pcD991DK*\J%I9Vk#4QF
W6kH:C dpiV>1$Vcm%Q#ML&$19\c*iH+%N%@9:\eaVKZ+e&+#Thn%%%ubJ#Ah1mFV4@Fd6hV=1MNttq#6>1%?jE
ck??Rb h*G>Yh%bneF4YcQ!9+jZewdYK!mZS>&ZTZ%al1?y@LHjla<4Xj=+^H=h6%P$nW%K#uY+@5+*XQ=lj+h:
kq^aDS 4@XpAhd^N#Z?<$dj*t:ZA&?k>&<*?naD%!M@W?ZjNhHw&?Y+D9&*XQZ:::V%dXIL4yh#q5Ije1&6d=Qc
=V#TQ^ eS/6u694P<dY6$pBZPj4dH%jdnL/>ut<l?hwjNVw!j:@FGwNXL\qHq9jJnZl9VyZ&<MjG*%:?qcl>yJC
ALREE/ PcebPi&w@?j4@8JYw&@Q+Z=NF&n<i:c?VVwd!:Jc/&i%4Y?VLnkan4?4<lhjdQS6Qh4&C:X?D6n/N9Ft
AQAium %MPL6L$>#Nc*Th@BjRe8X9u%h^q>i\LZyj5*jX$dnd+%an8>SPi@bP9d^N>kPj>h=@@L%PiQ>wDn@%D=
Wynka% $>jd?ndyi&kD@qQdyR%G*<=F*jti!9@CCKN9^?P%Z/4Lj/t6d=Q1ee:$bT4@nF&N9p%Ejj8?q9N*S*>l
HaTn!c Flkhh5I<S#@4YHn$G@WP??#I>%#y/C<e?c6\dcBN8u>^=I@\&Zw?/h9aX@/ZE9QqA+!iu+d#*u?k<5e@
%+%+Qm c@T<D89?l<y<j9W>a%h9^u&jj1Vp###A&NZHeL*GH?9?:n?Nuy?N/@L>SN@jD<%>GaP!j/44<!=nX@<Q
C/%9Vy ?/?j1j!&k+!iu+y>:<>%8^bG#*?Q:jRZ?ui9Nuy?Jja=q/9<n6&Nu6?DPutFq9NFw?in<jm@hZ:C/QtJ
@Fnm<@ &D@?n<1@<ECn=@jl&P^KjTN@bP#1SB^9@FL*t^eaQj<l66G46Q!j&*w?/ce+#9tX#y>6>Q\56GP@%9pL
V/!4JS nJ/@kP8iZ1*#N=4/4EX:ew%?nu:L/QpC6AHZ/8jm++!i6&Q@@l5>Y4@B%9PJY*D5e=$iN++#h9X6:I9?
=h\wWp X?X@!&9$jD4Y<jX/ZH&qR<>>S5?@CnbuZI9Ye=M9#wH!iQ%c#^*=*5Mhi8:IQ@h$l=+:<y9QNQd<Jd!@
#<mP<C 9%Z/9PI&w?i#@!dWG5QanH65Qb>+J@bSN/mj9jw5a<>qW:qS+a?yMu4?Hw+qd>K@?\Pn=:JJ*K#:4?NN
#a:t&@ j@h*dC?*/Q8%&inuj:+9%F=4RPHbb9#\JK+:?RiXj@TX6y=QPkZHT@?uj:jd!DpJ?=bdXj:!VdciV:wY
<X?D9W L?CQ8q*<*8m=H?@ldX4??&d<<B!P1Y>Z>Zb%4/*up=yRq?@R@jmk5ihd<JuwVu*jS^p>9^a^c*S?9>H#
9a6+Fj %hmQ*/ZLj:*S<=qNR1$%nHd+GDN?PA49+V*cj4=m>L\G?=h:Xj:Z>#X/jmdi\@6W@4j4dV&j?AyP9d=j
QwNLnJ =b<>!hn#I/G8=N4AtL@Y&QNliL$Q1H1a<J4S<%=5e*>&Qq=1jS/i@XT4>htS**Cpw%$+<u><upQQ<<mS
RXYkeE i8:Iu>hm:QpJiB@ZcnuR#%SN%@eS/?%BXj::a$dQH<j^@#1q=%8lQi=>854@K/=j9%:l9#lw^m*n5E$>
6I/Z8G yE9!yBpu9+q>/eN/@LCQ8T@Hw8+@w8@nN+%?45F/i%VJQ?y4^y/jnHZ@tML@?>iMul?AN9l^dS</nb#S
+\I*wl &Ch5WHLY4VB/jndY*SP/uG?dejKVYA<d6j!dnD$jn@d=TTZuwjuGun<+Rck%iFHEE<ci:+dQI$?y@B?>
<qK!jI a@V<kI?EYtMZ=Y<^i9/>N+ScW^j9!:FG#&Qa>&*T?YGn=\hmHV?4<$<#>Zpt*1@uXDpj@:uS<&@l@#/9
kGV$AZ <ne5N9be>ytdXj/Z9tZ$jC1PY%=R?W><\?n=CZmQZ6V=9#b/9lnL<yJ8y#k?*\8iH^PbinkN/*qj>d#<
<>uu@b iY^V?6q!P9aZnT4@ct#Zj>Z=E<*#>c&+4>aYqV@:6<a9Ih>$9KLd?*%G@lF+9%:X=Rpa?hjkYP<%:X>P
=&Y/nq G9pZ+V%=Zh8*p+#<!#<u=F1#$t/<cPVjlL@%l6ddmJG@EZ$Sd/4<%d%G@5>\B+8*6N*+\MkQ+*nydY*@
X6EW!W >:jq%#hmH@KP#8?\=hj9DtM@ZF6Yiwk9M@J@lPP$h%Z?wVea?ein*?M>hd@TMM:!KDuX$1d>R?WQR9<@
R?iXkp dI#M4&qGuj&u!q?&&PAjSb@A?!y@?cpG9/kbe9/q<m<jd8N4Qw@QYB?w@C6&Njk#5L@+WPXjd<yVM^=>
<hWh1J X^?y@N?c<qSjkYPN4T4@6SttQA?ebL5kQG@@!PC@D?N19hmp=@ulhu%Y4<Z%Rd$/j+yhu>XuBIY%/J@u
*>>H8j >jq&jhdM:lVYw9/i=+?\/:Q/V!8FYp5YH%N^9D%T=T@/nFB:bYF%\@QKMGW*16>yEZK6YKuQN>y&8Q1!
I*F+8u ?+VeC\9y@PN5PVX:\4Zkt4FI@:G9pZM5?mJ16J=jc<8y&Sj9$TmX@@NZVHqiQA@ZH%d=j#4I!Qu*i*G>
Wm@ht+ ac&*=ut&?pdeN/^iZi@Ej^w=%?M/5k*cLii^=hReeKqRc<jme%#T!Qu9j1H&^pL*VIPSp<S>WMiweh*+
u&lEMP j#Qq?eW9lXw#F86@5:t8/dk8w+1T<4#\pi#9R4E59?+5dH>4?pPq#%pyG@$@WE5DBBRAAkAIAGhXdTYT
H+Ylm> @+HAA#RBAAC^ARA$AAAAa&^ybY=$e!>\b*A9dYFnL%BHWGFpdYq8L*Jqe&>%etNqe!>RS%BlbG%ydm=\
#=dXnt eG>mLtJyd8^dcZAdS*ciAWmBN$GJB*kAGQCtTALkVjMGRa1miIG*TEwWl<CRBAWCFA=K6LN4!Vy6//SP
ICwIDK Y=c>p4i!8/q5:G^TY*FT/+y4+$1=K1ua&V@?5X9Jn?!8n$*Yl!/L\E^i#\#AATmAMMYNW&WQ*TKI/Zuh
!a>>nH @jZ*9ji/i+#FG#wMyGuBdFW9L61t5c>>&S%&a<?w9l#*@^y@e@/9M><=<VQh*^aEijDa5Zh85DZl9^<Q
VNdHjn aQmQBnA5T5dj*Ibl5Rjkh\V/I*aTm<R/MTNt\/!^XhW%bbZX/1H&HwQb+Y#dFh@c1&>*PEmH&Yb%PQRm
cHw\N# 14Y#X>eMX:AP@/!&6<#dSc\Dw#A4JwIj>mwdiZP&>NCdn4/@CVXpA&u6%w>&6pQQJXkm>1SZHudW?=GB
6wwLNb C$>P%E*dZE:CP#H9ii@K5YQCmlG:#Ba1w6>qhtL>*Lin&HPCC15S:Tc#M&Lac4Jl+#DeW9T>YP>!au5B
+cdJA@ YL%6eSuVa%mpkZR+KY\EQ8p6FGqHqYIGKR6qhBI/m\ZViTeE=?cK@^RDSRHDl>ulY+!DEk<qARwCSRwq
#$F6C# ClQD+I/ld8EuMh\&QY?Cd=XLm$+1Tt<\G=$8P+WAlW?LWLA8?MG\cY4Y\Xe65XMPT&K4byR\hP1HmAHK
aP=YK+ RZT&5bPHG\\<ZcYwQ?k&@+\cQbNWYVy6hu/Ny#Vw1i%q%b6/4Q#46pca4e/qKKlK&bewE$hHZ&WC!qdZ
=!Q8Vl w/\tB^R%jQ!Jd!I1$ESp/iE^y<%PGY^&y>=t5hphP1iVNM+6WFauXBw\/HYp$#m*juIKWcNT@8qhWNmu
u4$P!B A$cP4*ZT4*+4cV\a4L/k5&15EMB:X%RPLwC@bCAMRwiWAR:AVwI^a6V<NGp*ahwaqu>mwQqHWD/G<kuQ
iEEaAL SQ:/DZ6BK\<^pet&cAE#dZ#9ethNqqpp^TnWpSc5liE9:pu^S?m#aQR%Dt4Sk8/IbFkE:uX@$E9<cc>C
ZPXVVi %$u>+lwaDa58^^#d$T+5&j5+@1>RV1\>nwal<KtLwN6i/wnVc/PF6@E^c<Nd/$mAna<DdWRb:NTT&ib!
bT=Q?P BQdqE&FjpMV>:J^e%^jY>@A&ByCI&X6H5M><NyA@V\pKB?b%KyJ@q:\9?WD!K<t9lDh=!?$Lm$8Hwj%Q
XNQ85K <Zq<\Gj=l%CTN:d5?%jAKRZLKR9?P<RW:w4&8X\9l/d:8wly?H6c#:1w^*AIT\KI%y4lj!i^46G@H=#Q
GjH5Qm qH!A!MJ?KX4#1XEi?JTGSR56Me!&D5yKLbG?11kC>9kK4JZwh*%XYj:HuIN!H5wF?Ga:C1M^Z$C=C?X#
EW+NMu KF?CyRSPAZ1D%iKq\bKbA1Aq:!PkMV\R$hBAC=RB5n#CWkGjF>AyyB&e\E/WG!D?PCkC*A=qJ=b6Ln6l
CMD?>c 6C$5p6bq\pw8WPDmCPeeSe!aKa8JtKa565N%jIQ%FN8k=AN<DE5X<ne+R*Ayhl#8EGIBL@+^GCJSqW?I
WYeMJ4 TC9$d+qDSEDlMP$A>a/LQ^Jam$M8GRSSDJb\99<dn?HGN#/Gn<MdA%+ahA#84S5D>56NniGVWGQk9=<!
wQ\Kmc #p$jRe1GX1S?4d\jyBWSjkk:WVRM=Ci6SKeXcG?&#pKMk@\N$q4TR4SSS99!I91D/KKY\<E1?y?&EK9*
-AF%Nl 000c04cadd0001202b3 Page 102 of binaries1.zip
9hTtYh N+ZXy?FnFj*8P1^?E\=YjT:u4C%M4ERS\dCKPd8F&pncFFb*\<CK=LCKPSiIFc+IlhZPh88M#Y/p\mBY
4GMaV= REQu%#YpD18lnYiFd&mid?nC8wccAl4ClR%XiB5cwBb5Vmy+M<Tk$\=ymbX!CQ^LSHJRHu#&lD#k:Y#P
*QF<kE S\45SDnJ/XtlZT:ARR#QlkAu>CaDwRIeZw8JCY?!*<nd8P6u+\:WnA^qR%T8SWc<L9w^#1F!W+V@R^mE
y5P%:P u?Dy<jp/=/Bdc\WqNQ+<#QZTA!$SFq\LlNY%MA$ylY&GMM/Sh6II?aY*mSF94wK>JYkCyR*DwZIX=SBp
:\%Ajy Iw8p\:E+b$e=!+LL+aTelCChBEymuL#%ZV:4XwH%i^6bV%#4JtG^YYejA:4LD\=:tKD@h^mk>@Kkj:pP
pVklkw >L5C$L<MBD$6EQSDL6Jmhu1X*8hD+pX@uQGwWEnI?np4\RDY?e!iEJn>=+*M^1BpH?lRy6WKampV#C@E
D/iJR\ Dt%lLQ%pW*L=u#BtdyTd8hnlhVQ*aK&X&PHAtTN$L1h6kZTcncVF5p\+#LNYRt?#L>ykdW$JuLYSN#?C
GBWM1c n*D:Gd+yqITKCmX6FDKJdQqbJWkHRSI>qJM5:dR/:VcV!$nb?caY?KbG%#YXF11y/qHTdmZMM:CE+KIA
q?H^%W lCCunVlILV5I1<*JDw&C6eP!j$<E/VP:iEIR^a/k=4&LK9F$$DS4/kty$i?eSWNqR$c&*/RXlLY/>d>?
*jqPwC /L>D$?p\Ynni#iEEnke?#B8ZQ6+a*PM*N/NJZNnn\&d4HG6uLIBt&Nj9MY:\:*GVV>C9a*E?+&pBQR+W
<EudR& >GpJ=IN&w6P:q>Q55/IZYHquI!6S5NauWi:kZXj/#QT5teFnN#IVMYl?tpKpRyRBjup*@Swk1m?^cA:n
wD?64: Cd=imd!:C!GA&?:d9@Dm>J=knb$S>l4:?A1KY#M&C!!ipVk55FRuHHP&\!BFC!SQ=lqaZbj8ym!YBWm8
!=<H1Z Yh%AI5W8^iEQP#!mJ9lX8uHPbwNjcEWP6%Ah+4DbMaj$=pK=8aP>6ZHKYditQ9Fk$MT5<F8k5ymm:%T&
NHeImq hTwDNJ>ebZ?@PbWhD/t!LbDX^k55wc!ck?a%j@e6pFZ5Y>@Jc86pBYk?8c#?jHP!59*JbAW4F@ciZ%ya
qL#G+S F=kZ^5tlKKAwRXS9BBNX*NG6E^XGB%9%dwGwMQjtSSX*:D6Sdb&wAM%l\dy\W/LCW\Ym1k^jXQ?^CXGN
Vy1/d< kZ\Y!GY91t^YKHbm\Ycu8AhAXiVmIpZc$cQIDGnM:mn\GuARl?ew>nButVBdHW=W\>Bl+P!cdP^Tda=e
=cX\Je wyAhB@etAnwEap*D+t==4hbl$m1+6>a54QBM%A#y5nnXAlG#T#qSbnDl^8@i\qZ?*KbY?b?F5ewj+6dG
Va<W4: <b*4X9t8WH8tel&ca9B\%mZK!1eM:Xb9!4DlCFdCHMHu+i\\Cbkc::j4K\t%cbQYR#pe=C^F:KbIE&ld
Cn^lSM d%6A4!kEHALG:<FNkpNAeN8+LQRlaIQ\EBD@hXB/@PWV$tM<&LBDC#RHBIw!Q#5Z9t#5jDqaFdAmeXA?
eSXqTB CIVyYJqjC^qdFnum@\4TMe*tI$j<V@H%pwE9l@FmQ\ew&1DH<Smt^hD$lZGwKD\knWGY+#5SWZ\8+dhB
Q#cE?? a@q@@j<?EIn:uh>t@nWw#+a<ECkVHAl+dZ#pb?PQWC=9dCQEiaB4W/:9RSmPw=6#jZG@lS:/8::u%q1B
b>caWP 8\HdkmuDm!cW$+EHSHthk&ljw8#L@teMed@H@lBk<=4A=8@ZuVEIdA:bZR+ubTLY6nH>t%lLGkwFVj\D
AS\K># qJPl@F%EG:u5CGWCS<eWL&%wR8De=MGIumD>^tQj9VAIMM^NXpJT1NmZpBR+YR4$5mNl6JklZBCLht1G
HH&D*R #SW/8hTD5k5A?qFRkJ^dCNDtV5!?CAPkb8=N4kRZblC<iuMP!1IAIFjkt%\TQb9J9ae>bkqT9NXLpB1P
?a9%b/ !\qL?A^YEJ:QS*ERC@hNq+RQ9@E*Zd=<$4h%El8?<VHeD*MM:N6qEIlRIGGhL?55&djTYCX!u%#?::/J
*nh<Gl DEFDd6aYC8&XVa*<n&EI4a5QG@J%u8kuk4AlD<#Cp:p5HB%@wSj+:MK%bS>9W8FuMyp>tk=^/CZnVA+M
qK48FF /l=9%8ALHheC#Q=d1NCS*p5h=ybXRa=iY^=:>Q44ni^GV=8hj1jcVZ\cw5SKBHu:V/H<T/k$SF^VZa6F
wD#BeI ?BIS6je6TwcG\q>4L$t!:$<?>lc8CLw:?5pYM9Hut&Lm\#CaPMKjqZ//nwt@DEWdbd8XuLbAApQ+#thN
k&wWpZ ^AC%bD5IT!9@R%FY\dGj?k=DS+Mmh9jd5J><::864!*eV:/*Bj9Jd&>8Q@u$@>Xl1Hh:?VFKk?1CLcwQ
P\biE8 *@:\ddb:u&FH5CRSE+h<Fwd6=w9*D4y8+%>k1dY6uV%4**jau%?ei&N/HqCK<hX>GRF\:D<F#:L@V=ZQ
c/Yj5t ylRnMDEY6R=yd#9wh\6iVT98KlqFyD\4K#Mnubc6ynG!&LVWqPV6TapJedHS$a>mtNn18QnEyBSbyqKX
XS&S:u q=?Zt/*IqKXubMpX/JqMlT195HluaWF8V4bTuyp8!!J!C*cYqJT1NY1NS?*YmA9!<@M<8W\Pp$&4wktq
9RKukm El:LTJiq$VItueq\b:bu!iWKlXJJ1LJ#e9Q!<9MLmuaYF=h1!/y1/ly%:i$hi*4/BwhG^!et^5jH>w/P
dt9Wy# DA<PD9Rdiu6/89b$:8:wcG@V6?@y/8/ti>J:i*y:?\!G@9/BweH?ZuTj9h*c196KS:jY/h6&hi#8:P#8
e@1BVE /i5jGB#bP#a^PVX6tnEj6C+/ZEii?h:Sw<iPu#l=<6VyM!?<iQd58jMZLq=c8ZVy+5WLF</j>=##uGXi
wQtFjl bF=ku1jQMKi@P9ZwJF=%V<pRHpBPLAjk:1hH!\C$Hh8qmjF^D&I4+8IVEyP&y<m!qDAwqTI4I!$%QTNV
WVyqju kRa9X\E?ycZFSjt=&TyALFPSp%>WWq11Z6XkWCIKC\4!<?ne!N!euP\ekC\TIIMtXkE5JyQJanLdMnIS
Q<P%N% bG8IFSRCamX1VXqFhX&VV5<lNn\&5Z>!e9??mat^MSc$jpNjd$>*F<K51:i*l?+VG@wMjdTB/W<cGB\h
*Bt?hc HkBI8\C\ZT^mtP=SC\PkXi9d&n6&:?u8AhAGl$jH^9ejAC<GtNpeT$ii?j:S+!hPuDy%?uqADAC:eGuq
IP$<Ph <8Y4X/>e8Z#b5<Je<q^pLwnPu#9uB8nwF>#Q8<>k#?QN1<wHBM*Dq9pkI^1apJ1<I$tcEH<@LnW?Wdy>
CK58jW S$ycly#IJlSb/YpyKYqANAY6VFHq=8<5%YwA6wLe:G!AJB6aX$y46tuL6F1NS481aayElRZ=hF=!Zt+8
Y=!FlY Rp=FEE1FRk/pV5<Aa9Qk^RF+YV:\/D^bRTG\4cSE4c&w1Y>8dt*4/Pw^DI+APYk!=eDp=L/JeT><kF:Q
S<qkD+ u8=ik/e@e&B\AFkIQ$ND\&MnR\N>CFmADuFN*NLe%PSybJ1a=yIYZT9H8n$>9RakMeKQbDq*!P=cj8db
bK#96Y a<h>/F&<SK@kX/@S%&N8ZL>?:SwHI:%CZ/IBS8a<ji:lYSH\E6jiI#CXB=mHK?S$%5QMcKTqFEA\MiF?
au<pkP 9Bc^LnpqNT$>T/uIVE@h5Z%HMpIRly8dZ%T1LT@VqIBY<*P!CTK91Fm6$hBc9K^<6e!nqSV9*FpEAPa^
\NXbZa ih6!e\BnqR4cpGe>A8BwAM/V$TyALm?9wBC^DtlZZqFd*>AE\P$B+EdH>p>Pt$#V=NTB!j$A*h/SwcHB
IE5Da^ ATBiH&l!eHnaM$RQi$cpw?NnI+MINYAnC%wEkNda/G=kG88dtkG%Xy=&jWmy+@5ty+\WK>RqBN1JW%:I
pYy/ci kHBZ4q/@j8Pqq&@ijPtqG#jw/<\%=my>lRHptE98m@TFS?j^<qZmITBGK#EFLZ?aFb&bum=D@p&ciD>B
ykAJG5 m\mHAJPqb&ZIWkHFJBc^VAYSY%T1Kc?5LEieK!#M!<pyKFcZAXaX+9KK<uJ*GR<aWC=j\qJPyaI&^A1k
+HG^wd NeKL#5LphKa:w#E#T/BXV11qt4LKt6y/nt*>CLRDSty&lnIbAdb>+&NnI<NDA@*>k!Pnw/6:5dHX9e^a
Kl+W## +9+JkK\jRhc^1\$RE\FkkFi>y/G15dtqBSDd%hHblYRKNAQZby\^#%5QAYB@>8^#y<+Ae</DQFi8ZL&G
Q?*ZPC $H4q%1%ZQdep4>!<?jLLQ6kmkZA4K=jhK/8Z<N4:Kmddw/JlSG:F1n\G^RdY\TXJ*au8lMSEKee#mAPk
@l/Aqn $l%JhIJe!kIuB>#WFhW%%bZqYuZJ#5LCjIBNY%:l4uSZ$PX$tcT$yLka+edpS\Qb<uJA#ITTlyu=Kp5M
Fe1XKH #nCDB1pKMGQhG@AMidhKFBFc&*h*>R+M:=&aJE%#<@Qt&SuEN1SVFB9&Vw^QnH5ttHE^mld$8HSmc9@+
LFSW%n *tEIB>%:hmQeYmIB6+cG?6W/yy=8ALKBRlHXRQWDR!Pej#QQL^^!HH:/i$iQu*4BC^5m&e%Zd4*/&k@8
l@SZ/V *Lq>?\i99jd11#RHIPKhl\ZRe<X#Gc>^1^/A%/bBwR<XMZIPPBSNQhJHmSwj&#JpKWtJ<dE^5RtJ&=NV
c!A#IK bSu!:AJ%=XQ%6Rk*$GlSIZk:aJ?:K4K!w4K!A4Bn!uB%KX$5A9Dwkt*=mHI1FR*RQbA*5/*I\C!+Pu@5
\nw=M^ muam6tqScGnW/WGn@WN:^\G/&jtD<?a=m5N8uB+VVW^P48+ZR:na6#1SPDZJ5k%AR&VVNW5cG?44u116
F?XMX= 1jFWM#XMdiXVhjWNnRAh<t*k&9ybl<q1%HaIa8u*n=$<#iy#=dKZd\Aejai=LWdI$Y9M<\JHZ<b%>:Pb
1$XBC6 HE<&A>A>XHwW$T^$dE!qp:/TXmY6Ibe5na&STKJnIThJl1SEXXBTZq6jl/A4$=TYAHDAqK41G8l8NX%F
c6Z4<& X<am9Y4WyTWqAF%CRTHKS#ncKbV!%T\/e%5YN$*86GTbAEBP4+Aj4euVqqjXNnT*:8yEQt=<@^Vkb:Ee
>akq\l NM>TJlKC^MV+9kNVB\=MiR/pR<SFQ@5t>p%:Mi#5cAjiNWa$%APChLY+14ITipXZk\5AGJ9A&\EBYiWm
4qkdX$ FNHWLNmRdlH>#mH/IS<H:L5Jw4%>l*=>G$6A^D@5Fjyq@MbLdkCSBlD^#6Z5l#p$C?F>CLETPW<?#*bQ
C&#$mK Em$6=TFEGKaqJ<bKImN+EFM#mL!T5y4/Pl=Ehatt9I18mhcAj\e9B=/NJtLTpuhwAWRA8IkynEjc#WW8
lm/kYl D&W$EIdTAWG&5XR$TV+aCbW1l<:4BKiulwRR8d*/y6b&DpWp+INY/<H=8StVEeF+kJ\t?:8/i*8:8=5c
WNpWd+ t!GK1w6&G1j&n+$P<Tn1tlymAMV1cwAR=yR8w<84ac=l185cGlydkI:ASwk$w&Q:RMbkHJH^&YMu#=!>
yMd#6W +FW^SIyd6$DE>P9MuandHB5nka&ZL%**9IH@^a@y6<Y@iP9u9<B#QtiB>BAQqFEKL^ZyHS+kI!NXAJIw
BA@DST 6AKc$4kaTaRIF+pnI4hJwESF^<dE$LF+ZLR:Ew6\m:GIXhE1:5EpbRAi?L/m?EIWbdq+wYSDiEa::%^V
mENNPQ pEGY+mlJkb\a51D5*L!Cwq^I8@?Z1i<Ac!L4*y>JIIEpEG4w9jji1>J:4\qhmmAmKA1mI6XiWXGpF*99
X:INA% HS9&:6wIaHj6ubbpb9=uw99>@5?8*?i#n<8i>:*u9Pe>h&d8NRayNRWy6hHSNhDS$j9VmnZl*\DGRa:q
Dte=^1 =PWF5ymMmMZP!W^QVRbLItdM%>6VGldXGim!5:MX&DndRk6#eHS&eZPH#CMJk<TLVW!dqn>>%4#KJW6Z
\Ea4#J 461\eej?k+iQHnq!iYCkj>?8\Vh9*#:u9<Y@WD/?i+?QTa@??np8Ekp^kjA*kS!hNBAc+tKmBLyC!DnG
-A>6et 00092518810001202b3 Page 103 of binaries1.zip
Z8IVHy j^tuJI8KKK<RqMIaSWV\Y!E1JCt\5aIM5mDMYKVSMCTLpJ\GeA%ejXKNWKGCnXHEqTnKmp1aC5:BXZE%
CWi#cA DIcEZ/yWNTWb5IhCGbG5WEdIap@LT8etJ+B@CAu!l<4!bLyB9*GAH$<Y8emC5JTFbLP#e*B!l5Ta@5?n
SMX$NZ 6@ku!5T*5deEm9%<VmAdeIQS9&GVZqSc9L/pDcZ^EdT^:lj!G^Wk>L<@#+I\q+MX?:>wAcE/tHFXTSKw
6aN%CN 5mK8RCmKXF/wW4V%GKP5*#KVLHb8hka9JTE8KmJWHJ+H\+&MV9#DLHB#\k^?YWnBkGS4b?@whblQwLpX
kilm^< ENZGH^AV&ZRuhAtkpmcYJFtWn%AYQ::#E^qDJ^EK4CJ8k%yb!wqd1DGMCGRBk8NRF\FX$my@blB=PdpJ
#ImFPI qVi1NI/^5\>HkVHGGyPbaLH#kdZWyLlwmCyk1w?u8!#WPytW+uaMQka*Jp\IW=wb#F+&5::#CW1S6B&E
lSK1DR 6ZpCZLJIHJwIXluZpTR=WJHpI=Jw\=P:d$K@IVk/m6ChIDadpF>bT@LukeKC^>VS$kLjmMBWmc6IkjCI
^y>\?Z y$1q*!4@16L5A5PV4FVXZ:QptAZVRC1V+&Mm\9+EJ8QmDG^BZGI:C1MnckRlTJma8X#Hl\lJWT=DRYu\
aDBTAP BaF$mR\u^IMq4m@RE+qJw&nKwaPI=JIHh?@ic*+BRVuc&<N+aAXBYj^hSJI9VbkGaAX^Fa^DJa*kV<k&
WC&jDM 1nIMDBN/FAlVyEyV>E4K#M1M\%XSD8M>C&i!y?jtpI5cG^pYLA/T:iLpaCh8%KRRRt=A!>iuGlnt@S\p
#<YMXR JHNp=iYq&!HE*y<\!bGbNkpKT8lR6NXy#^B/\>N:>?:iipy>mhBB!i#JQMM6GibmYaCSWB5K+p>+PIhR
%hwK%5 ymkyKI&4EB^EBhhA>HFDkaHIpDCTMhdRAD=DT?jZ#m?4ln>KWbbnjtJlVHblQmtbmZFS+eGBW*%JNy*5
9dK5eu :WkuSlceu8/pD5Z&An+IPTiJ!%GathlLAtu:KcbSBDRTECY1CB^Kw+$Q:$Ka6*?aRbk8#p+PDub&Np4Y
EZ8hB1 qkDb=M?Q$md6G8kmlCpJFR?KPKcCcPD/H\!a?ny^C=h8YL8p86tak/tkdPa*qwDJunGhVEG!MEKC@H!>
c#?yE@ *PWlNF54C*MV5yQwpMMc!CGcP#=IWLAeJ5ct5H#jRun:j+lJFEL?Ed1wJ9$bR1Eh?ph$q*L:W\HE=m18
NRj?<1 jV5d\q4S/u<\^dGypc1KK^NKKCpwBIitDQWL98pZ=DJl4tSm/&Jnc&aPjd/pee&Y#k$4/61mFCFcXRYM
/wE&bL PRbDQH5teJuBli+DJiM*^e6D?W?<<J<kX+qWAk%%1=QaIEGh5JGY\&YydFuV/^D\+ZEn^FkwDqwA>a#K
dZJ@lb wiT=FDmC!l$S*mZ8wMPHIG\*Mcj&hm!^LpB8GyH:J:mtyNnJeVBqmn^HBXhDXR&@GKkdG5H5/=Je=?jy
Wbd<Mh Ap*Wa8:KDY%>ZS6ZNDT6qSi1IGwCJ5:/^YTZFBXM!$lLmaepDjKHiGZ@^k9$/yJdCLk/Ynn&k1DmBIHn
aA69:p BQYLlR\dp!Za1Ga:BL%QbCR\FpHRGASN$hPpDTH!enREpV=/></h8@D4>8%H#^t9EMJN$6YbLHbNTF5!
WTqnuc GWkjRNcWlkdR4eKBN5alK$u@N:C5dpp&jVijkwiL>!R=&hlZ4Y=8:>*b6u=bdiPyCSXE?lPVQY9G>N!5
XS^6jT hFI8\/G!9D*pZTFwYEenA:ITaBH6Hw\R>QHQd<eJ+4i=WBbuw/4qbL!I$injiEWR4#\/lECJIBVGwd8m
!DQ<n6 P@l6/1$:lNM4lE//XyJwSbA/c\6^iyBdC/SdWaZEyckbGQ\C$$VXM:Y!^Y%W:V*h@Ne@HcwKeZhi5H=L
jp<49i S??P:p$4//9uQ:GdXKGwKnC?MNqqJaX=PcBZehHla4tT?^P9mbGB4k/bET5tIN#9ku+k?diXAMKqKCcP
VhnJ=y 9mKRnq@GGER4BFbRdepuCEZt/B*ldj\Y>icNmSRI%M9DVh#FPQbp&#E*E^iF>6@=keQS@1!QGcD/NmJ4
Z?idYu hS5Q6<CWGe*981P>1>h6ci@8/YqiBVHPPS?9DJ\1Rw^#b5$wtJbJbwK+$n^q*b\hIBFMnEnw/ud*?RS6
M#QKJJ @ChBjDPVEeyCtetG9+MA>@+ZIK19^EjwXH$WRTRQ*ldi\t=Td%#:5JCM$bPp$<qS\<GidB^tbAjTI$Yi
ld4ZK? nFHD&N#M#ElQ:+i?lJ/88a$Nb1%ybijlGlCbN@CiQ!h<\h4t%w/P6p$4/1w1=yS&#IFaKc1KnG>M>6!!
wMPX## taX=&itymZGSwYVi!4mD@9?NXtQt?BBBu#k%@I!a6GcJbEX51y!M^\MI>@DQ9?Em#GFECtKXwTI!B!Be
Kd9E<i +mb&k*1h*<b?nhC>^SE:P!1SW^Yw\*<Bm#eknVE4\yyma&k$AiJNNVK$BZIJK$%*D@iA/ih9+&i1M^c6
&&B=1? &dTqbe9GXjWL=ycYqM^1YKE^ywI1ML+#&jQtqBTJ^iFQGum#QF\e:c!l%Mman\\VWynw:aE^+y8%tGFC
=k<b8> nmJ4hkKC*p<GnStKDBCyaaR8mTJ$lHu+68kteWN+uZ46@qX%mBp5G?uDubSJJ&=DKy1^YNA$!j1!6J!$
KHQ$/? Im^SK%%Mn/wLluLCY5jJ#e$:IKF6>:59c/9tL%8*ehPG%R&X5+5LC\wKb<:jce\BWXcEmPiZq^cD@1cq
PYM9T/ JMSERGj\?q@EBlD^>YGCGJZ<iA*:aTcDRe+K=Tl5nTaI?CAb5Al1DIGGL/F5bL*uy8kGhl&:Sq!uZH&6
iILe6< Jk/ZuA%hZhThHB%In5tpABK$!K%kFXe*KD%HC>\T6^Jbw#bYp>aGX4cP4qMC@MNVCueIn:VZ%/>e6*:h
CcKu/^ m61=wLX=ihPL=%TiMJXZAyaXGV?b:Ky=5<ZXB4cFqGAjq1idp=$NCDAb<*QTC@Ve:dj/G#EItW\=lD#<
ywC:J4 \^n@E#L/HyGnTNBq&I1Yj4uq1@aNQHy\@:4wBu=hiA&@LuX@/*RjSVtGBQwSwePI/?Zl+icm=E^&hY5^
nLFLcS CAMTlCcwlLjIFZiV<LAHKS8HnDG#6jN\>\DuHBtZ^E8N!m16dq!=i6Z!?kXqJeZFMQ+81F@XXy96d/m9
IJIS*? yacSZb8DKACWlZ@+#?Rq^$hHBAhMaZqCqwN8GB5CqLH*lD\tGQ9?=eQ%9a&#E/\XcSJ$Nl8H#MHpMLc$
GnN#M* 4Ed1+pMjQ9?c^D<T!GjW%PTZiFEIA$V:E/JkG=Xc51q9#=GVF/:i8uu#^9Z4%/=NZy?<lq%u*L=:?@K=
61LiM? k#64a^$%9mB$@!p?*8SK/bGi\%ceYH?LRWNXL&mK8+99FJ@CQD<@b#e*kdPdR%BMdG^<hHBATJl+P#Rn
1G9\%w P*@Pk41qK%a8d/!8KC56t#%*j5&T6T&>B\+i/G6dW=5:%XbQYS:GT$ZGd!b:eSXb$&Jbn+pICbnK>HcH
A5?^cA bLM!N#HW$@H+SDAGP6hZl44cGi81!PNM1w\5G%AT5tPAtCpnLWXZ$nB##GnyH@=CkP8%MMjNEJQ^@^B#
hq6yWw QmPTe6ei*L%%VZlFhBY:J4w?Bw8JRE+T%%k*:n%+jGHZ&4pyFq1!/BlCD\u$u\Lq=KaDE8Ak*n\GZ@1u
aCkl*I q6V6IwPt?p*%n>%>J6y@K8+1hFPi5t=y^a#MlLC\!JmEbG:t6Pp#!^jYNPJLDSy11?dMLy>Z6cl?SXQ4
\:@&F+ >pQHn^<>6Ki*hj*T11K+IH>9F%N6BTah:EJ>hXX=KRl9B1R4hGA@yw?H1=P+^QS$TkWE?89NKEH:LEPS
wky\S8 qJcXE<pL=WTAiS\\V<4I!EIcIw1&WTZ4d@C@+GMEklE&p1R9MDeVkVHHnITG1IG5EB\E>ShC5d>^Fd>C
/$t<%k DIm8+Feu4kt8m1+J4?QZ1Fi9ZBpRZ1aPZDp&dS!lS@\b@:!W!C$q8:>%1Ti&Aiy?MZmpXEV?qbH=8VWl
Y!*LnB dkJZd#iZ/Qw=$*p^wiFS5Wue#Q#mPXZX6R&NT^44c^bXqM?4ZFnd8Gyn/:aDJ<?iQZ*<+I/P>ZZq&XF^
XLy!\A !Yub?VQuqAXIVVDbndYL=yjQtyGjA$5P?i*Q>QX!e:K*IRXSy%hITJ\dFlGmMaJ!peuG=ZB=pb!AnRB+
N5XLL= 5B<!GA8VIYRSeRXVbZWVj$+R1ARDDId6u@pL%y<\JW^Ra^PlMYyIE!JWTBtaPCnw%m8VA@mXL%h^!IK@
XVbl#k BAk8T>\/GK+1PaHRahIJk@q\ml/WNyl%514JnCeHAP&E!uX=&SpLQ#==MqkX=8?DRiFQ<b$/hhdM:IVk
48Y+BA wLCw8JV$9JJ=NR%+w&qDjX*Nw1y=FXYL/yc8*4m%b<@^e^e8un>#hHhZW@*5DFCA4N!m<pIHiScR5KK^
ERBSe9 btFqiWqSZnc$*8m\IJcjn/e4pG>lbtVMF&GEJHdn?#>jaZty&FR&yAAtl:NF5lQ\m+CyF9@LkmTdyiVw
>yP:H? <k?\ICZ9R8=$\PB8a&M6ul:N#TjN1EaWXAyDWCZ1V+T1jZ6kAL?MA\%npBNCKAke^FqMlik!:h4JE1cK
iN\d9M GkQITE\kB:@kID%@eul^AeM5>t+k%j4tXYeG/@NKG?@@YyIdFiHul@5VAdm@b*SKdpK\:>VA5NmWuPKK
FnF8?k ?nW4q!>64K>hZL%kj8YC^jZLXni%hP<+hP4<=T8Z#=@e*:P^9w!Z\58cXyV9^%JWqAE!Xm<HN1BNF8bq
i=%Y5* pY!E!\V:\!k5qkHuu>@iaAV/mQ?VwQAq^WRRdCERAWI8I&ASamJEenSbSjP\aJ<>JBPEB?HPelQV+jAu
F>cD#8 NZDw%bk%^aAmIWJRqQwDRW59+=j\!<RAAeI\Cq\I4^FZmT8Wke9\#?p*N%8V&%J!\AW9Nbq<?BC8T+=!
ZXq9=W W:#e\S!Shwce=RKjjZ<+$4cp?>*ZldpyEj+CQ@j\!MnW6CA*F<<yIVFy?iX%Vb9Y4X^TZ:N+$eIFXR84
d%?iV& /=i8Y6@e%494$KtLX/>h9ZVt$Ldtl4L$nM^ySZFcC4km\kamt6c5cK^hYFFPGwd$qMRa^elR<RRJJmjk
S:6=/$ :iGJ=!I\a8>?EPk5IIIAImbqBbAStM\pC=SSF5yFmm&n=lIeFPSZB$!wEd/Kal$Hm$DTAi&X*N1^^?!p
+l#HN: &ak!?RTa1mQ^A/HIu:^I5pEb8AI1<SMaIhqkZBpa8H#y$9YiWJaKyww1w=MIQV5nQVWqMV=GL!w<NJlW
#FGnwX DBAMptKw9dQEJQF<**iSeH6SLne<bA48N*X1aGlWNDjc%N:W&6E#MDc#yKcyh&9V1mX%JCELFm&8Z:y!
MwMTRa :ea6:d&:Dy!/iQ*G>T9>S*h5dm!hqqiadMGRp!ijGdAuti^N/%e9d%m<RJ\h&eCJat^pcKAjtH<Zy>d:
uwW8J! HeNjmiG*S!h?ElKQ$yWW^B68BJlWGin#ApkVplp=plp=6k#HA1Kh+l8TQDqJwHJT@u=Vy=AQpn^\h<RN
1Ph>T@ e/E/P#p=my#wXQL6A*tE?SYSn4=^<iKqT=e9D+B/Vk!MZ=t<T4>CWuItW%aA5#+FCMtdqy&SBmtTHl<V
aD$b:k GSECaeGp/8w1H6S9**k#TZ\lZ8%d69>Aa%Jp6J>@WFSpbBVQ%>#I!6LY&V5+Q48$juQ:lqXLcla6tF?%
<$MVqw wL1&j5tK%i5&dYu4/66>Ekm=ei*mmh&6T$yLy45\eVqCu11wyKIClG#i6H:X594FC!ytR=aAI=!p8Kk@
9FucTj 8!F8@IpuwwHZJ?=NEB?Ew?MEDV6a^9Nk@&WFqRXTlG!B4AlIwbPp5PYNQaT8FKi+:<CILD*+#$NJZ>\H
J*b/NK >jdEQBA*pT9l^4BCEAp%C5KmIik*BNtBZ!R8EbhFA=PZJ\e\KB#mCn=A9X=u1m\ph>/p!T\yt9/HF4%p
pq?$m8 ep5:nH!W+8%JQlN\CX#V>RTDaij%:4jQ>8RqJ+XnEidl!cq8d8bVw&!h*Q*CE4NuLX/:9G=S=h#bbYZR
-A$kpT 00004b70321001202b3 Page 104 of binaries1.zip
V@Z^\T SljW%C>d8Y=VT&6Z*::Vq:H4WyhP:t%d9mBcDX!eqB^pmJImS=plbLK*d6u+q^ZTdGhuKQPT@?/y=SHa
l*D#et n*&ZN8:k+<M@9kIu+:$4idF^t4k<eAwNhS!!lCTEpJGRqhF!lA=HeikWAB>14Mn\WQI=daC@u^>Jml!+
NcC>tA A\<QV$<9L^YahCWSccpjWEAk4w=Z@yCCDQ!/LAST5K9aFi4NVt?tWFXTVXqGppcTWn1VyCW#R%i5KFA@
kQ$RR9 pC%V\GX=8W?49+?>8TeTnZ#CH#iXJcYIWnue=NAbW=*T8GG8*9+SmXqFXhWAc$aSQ6&5cEdb9K1cJeDJ
wEJWML %5/?Zej:4+CF8\^T54ZaVJyN=4tmpmJdph\bFnKJNytYncRCAT9q5+4!yuHAWbJmFlJ+k9n^#<jQh=+L
/d45Ey ^9>=LBJNEw!uY=bqymZ+ldDq^d\k54@F8nLBpyBlec\>MFi/t:8hhi!6EdJ+PDJ^$bGSaYHRI<V<+H:I
9AbH@h FN\H<\XT!CN:=YuTC4<SClYSBHKYZeI9@4mEpSq#SYLk!4qaqWqXSA/DdAJT=ydNKm:K#=&tp=tSBqN!
Pkl/DC VDT=a?aQqip:y?4a<%%ZaNB+j&j5jpWYq8KTQC$weqqlWlKQF?HyG^ASu=+@C$bB<yqWb9c$@Bt#K<Fc
9IL@D9 4>9e*49:+PtLA%i9Zn=*dE?L4\Id8wTE9IICY\bZ^ntwCkNn545/&:b5ZL5ThGkB&aELPLqbQQLyT$V+
cb/*C& h?L#a+K+9dV6GQF$AlMR#NNdctd/VQEQVnGYA%/E$GlE$HlIZpB9#cBAyN#MXi$1u@EHTX+$/epJ5VFS
!IA<6k WbHlYBkTnAeTAWI@^F/E$BSRXIKPTQ^GWIwWnqAX#%/+<QMmJtcFNGeTX&:QN%AkC$lSTlKwwRM%pMmq
eQ4MT^ =PMP>>!e4E^8WtI<DI@pP!1B+dpqVW8&nIl?9:@e6YX?TW=tSpb/#lT*kDm*BG/pn+84d&B+dHIt8c&e
ZW9Y46 m1iayZLV5\yt#X9a8LKyyY9ukiQuLk$MZPw@jYK/n1!eDJQFqyNu5>np5\RXnAQW>HS%6Db9YEh!5^D$
:BPACX yXmJ:MleTNmFBPk:ei&%+PXZaqJA!An&dh!!tlhmq5dn^bGQK^H&GBkWZE!NLEQH!h*X#e*V&%DBNLSn
$t>5Rh GPen:+AhcXacN!p?NncGjLppMk\QJWK\RCIIaZ\ke\YFZJq=Bd@\T<!LADkb/LBRFKlTPC^J+S>KcljP
9E\6jG u%6cYqLEuF+AqWR?\+Z^CA?ZC<*PunY9>5mZ\ReZ?>bYA!ZaNPZyIV+l:qE<dwKHndXLRElEdDL=u<bn
Q6+<n% mFmD?MTM9Jq#F#Y8*6m^dh?^$?e9Z44aj&1>1S#pCIN<\5XmKC4nTwR!DGT!PJQh%>Qh5dX=\>wXT/EL
q:wujq #b%VKqXTqJ8buycc>B=5!iSVuED\eaJ?iPPGuQBR**mem>1!j@!qayJFWZb\^%&q*N$+mn4?8iiHMV:!
YcG?Rc FKmk$LQVieqJ5KyaLAZI\CNwacGlacHi/AeEpSRkcQ@=u^h\cMyplple9S!uwTJWShZaE*@Kbpp6CGV=
ppP8Fh :FKZ+1LC/VtbcYupbuMM@JYeXdJ\Zi@=B$P@n#a54mk8!5/bXq\!M!I^nBeZ+&l4bYp/qZ!GE^cGlS1G
=FXwhT pi>LeHPK=!=c5t=L>/+ny@4QZ#l@+ZTW81K<LJQpRbdFW5TABpSB^FGRbVK*p$T$Nni6Ydt55cc15q!K
>qKj\k HLhB=!6AQ6DuE/C5w=9LW6^+1SmZ\yPZ@!utAAePWFMZ*FZc#e6RR<p%bicNIhEjDySwBdubcX^81mlJ
G&N&Z/ PV+GB5ma1ImI1Cl>/L>!CJWtIWZ=BiYC\l\Vi9uZiX^MB*+bG/D&q/wyp4WmL!WywCFWtF>YL+PqtX<^
tijF*4 q#Wd>GS/dp+PhMYpSD^JQ:Gk>@m&%#>@a??&Lq*YZX+&5/Sp#6!Nc/J=1d/8#ndYFna?9wKylJ>?RGBR
^@uCWi TGSK#w!=%e8c&4ajPHY8@@#=E<X1<wyRI>LTLBbDYpcpJKG5KC<QbcKk\td8ADc/&68ct>c6Zq=j9dBK
45bLYT HwTpeHy?:ltC?DSI<G@?=A?QE6VqWYa^I1+E#$i518TVcS#GPB#<P%XG%<WNYQG!XFK&np>8jDwp@MPK
\lYRX? HKiwIC<:M#&hq<4nyTaqJmapJ5SGSejG+Ik$Sat8!ZaDkWY@Imn:/GV@^Humd=bRB$:w1bCtSH1TlpmM
+/YMQ+ I9RtME$%%R546ijNLT<4lwLJt=ci!p%NVWl18QD6LW=<t:nWh@VjkZ15$1Tmee&mCG/5N%k=G$5*<6G>
pumq>P 8#9b=u^<yp#^m$#JL1/wZhue6iea*m>@:1A?S^u!R%yKmmHNaMmSV?ARSW\iWSF!=GV&:N1^4di:9cX=
6Fu:TJ +@4XT?641yWZ#y>hM4NwFpF<Fh\jdK@N8Tapjq^@QpqR:\XFyIt+cIL!L=IZMTemFm44nEGi8K14c$iq
+dLA\! VV<^M9tHEWZY4GI!$VI#$nQEtpbLlY!QV#AWIZT1lJc&IwK1nIG4y\kS!caL@j*u#w*%E=A9BBAn8w!i
R>@l81 %BKwInLAC9$ZRt>8Y4&5Ei^u?wK1?iWqM<u!!W4L!EmMVy!&<eQp$EeC8*#?@ij#l/w4F>VW4F=/jtuT
jR?ece XN?yHt+Bnm:Pnnc&>k:p$&Q!hacyEep=JjQ4%&:hh9ne?j/#b*iTFeKRwp6JT$9JKyC5CPWSSiBEcS>J
=KZ$4b Tq>*Y<6t5lM*%NJ1F5$6K!&=lBHTQ&<KH#eh\:B4+=ME<<P=^Gk8FDI*RX@8y>m8+dII#Di!Cw/84t/i
K$9!h= ?54K*mq^Y^?PnQPSD\IC%YCYq=ZMtA+XqJ&Vuau^cGt<yIVpSGk8plRF1CD+DWEbS/Vq\d!Bw\&=*C<<
CCQHTn N>GQm@PF6C4EJe4qM$+mXawmDhRXqcD<SPldt=6YkenXP5QAWnt:nFVc9P!euNCw:NMj9q&+QIH>j9TP
&QZ@i& tQ^^bFXDR@&1Fe5QDTVHymdHSacS#%V5:B$hMTjeYh>qTpVK6FpLq&:5&u9!$wX#b$/%/5w!yGl$wIaq
lHZ6d> 4/TwyKTwIAB1SB^Ctd&jJGhHZ%h:/=cNwCyLcA&%XZQuX9:EChcBp#n?<L^RJNn=?9$*EeEeG^^e!a9#
HM9w5Z <IlMetD@ENND\B\5aLHpDh$<:JZW4JQT/???GPWnH+EePk*5+/#mGRXaQtNcXtbYXuaYN+WLjXkKSSSp
awE4VE WBYWJk<JR$N^lEKSP9:nHC:PF?Tm<BL><wqEFXW%bdKKJL<n>I/6t=4YR54ENNVZLyyZZn/u9LR\4!Ay
*wV^!V JGL^t5NdY\eJuMA\+9/l6p&4X1@bY46<*>Mq!apyZK+:%BCpmy8d8=5dPR\+?+atbBbZN1#9&HP/@>#y
yHwa@A W!ec>KX^Pm=Fa!8T:\WwVRAnAtZ&\j*:h8@i6cP*8/N6<@w%1%bK4tm541w/B1pC4idl\\XNu//6A/9&
yC#j<4 uD?+JnR8IhnLV9u:@=eyDAWqS\$X@hnWcceHj@$lRqq=$j^=e?cW#mDjQ<uQtbcdt=id\iPCypyRWYqb
NA!K#N FS!SAMetLTFAcJIWSBJbh?udPWKeJeSFBH\dDTyBTWWGMwSCy+L:y@i$6&#i%LS18e1Kba&L1?bZXFcW
SmWpbD F^eYVktJVC?a5*LkZ^#Hmcpju^@99Zy5X<j1JS8/L6/LC\yQ<QQ$<uB*ejj$>9d!<kSt:F%>ktNT<&bX
TIuRln Lh*R6Y@@AWBhwpinM=lTLDC9+PkX^9@\eiVR@u*:>8:c91&uC>bl*X4J%T911^6\IcH?/%ZLn4dqn!eu
4G59&5 CPL>yIn+?I\@<ulJGDe8Rq$P5p68AtnB^SpmanHaPww1t4:e>K:l+b>@cGE^F%hZXaK@KyqXPuM/XmBS
*cm8/V PD$:\*ETaVKy=FWP=PH6VQD%XFSJXSJHWQ@?u?iR5=k+VWRZJC>iPHi\CRRFqcS?Rindi#6cY=4Z4*be
Be$e%w SVaCtG5ZXbZN=E+NV<+1&QmcILB@ZlDnp@n>B<V+Q\i&huahj@K+\59H#\iteueQH^mThcdA&Pdw+Pwh
hV$1ej EJtRMZ%&>jLt#1:i94:PJBWcm!W44/mEK!NKw@KIkpCbPCJ#cD@W#M+h&*9cNnh9&mC^ah&TtnMmRq*$
#LITD% cjDEP&L5HEHe^Ik>q+RVV\ej>#h9:?H!jMm&I=AV@l%&SDJRlWcGBtqyK?/NjPen:+ENcXy>LRSiYa:Q
>kDYLA byRXF^ZNtDF#St+&VaR\JcWR8kRmR$ipNEBeyTkwFA>=>I9\4PCeWE\Ijl/:IHH1\H=FTSENqWI@IjSh
t9W6l8 &*8:P<E8Ei8VXm?y1/861c$8L\&eEy1c*9E9>u4m%=:n#$cJ<h?@mHH?5Th*@8HjPNDk:pGP+6+iQu/B
!:K6Bh \eHmPhdJ!e*LL#RtNd6wZ8*1Db8*6ub5CqTTqqZXIAedlb@!AtZ$&BH<EGQ@*4%:ht@9c68/bdNE<+cX
=+pw6^ nSMawVH/<VL@+SQm+:i*bY5?EMe@V\=*>l?4&Nn@D!?JJEF?Rp:$6?iIbPk5I^en=:LLR%?l%RnA!Ep8
Kdbj1+ d/m44%tIXW1Z#=w=5/T$dNb$K^FIlhIE\4Cm$YWRPdwP\1KDeKA4#yM$CMR$mM=LZnm/@=R6/h$qQmD$
m<LMH1 @d8&R%/$dNcEWZ*=pmWNna$N<?N<\tN!19yGu@X%6&<+@ywRVtKE!/jH#$b8*N/\1CdFL!RwaI1Zh$BI
+w+GYL iGSpSFnRXC>ZX*e95QJ^*J!bqZZLXnX6ctq$+1l1ctwyebVpjkAF:JQHnl\>euDj99*:h9X&hdT%W4h8
mcH+K^ ZuNDSGmMd*6JEALmB>H?j5YcNj5@dNya$4J$><8SF%%/dDD1\AAtn+p*$VEbTab>pM@cX=@@+B>q4F1&
T:+:!P hNuTtwZX%R545NpTe!9K5&kAqw/kAql@GP:Aj$yKV!Kwh@@pYhG=5dQ+PR!1R84Cwd&H:Bp$G9%jlH=+
j#PmWa @=+>8*4d&^M:6nc6Z4F<&e1XT?i=B$d88d4y#d%6VdW%t^:>@9Ca\D><H@8Hj&L9%9&L=qeXS$iEB9y/
F9SlNS ?whG^ecVe\:<Hkb6H:@k!IT$9FtXNW6Y4Y8iy/811/Yq4TL*neS?/9m^+<eQHVl+/PAi5B^hZhJhdY$\
dejaWF u?D9mXemRpu+h9kn5jQY/LMX8&e?89Q\Cy@@a4Q5h%l<e68a*EcYqQaM<u$\>Be&wdB8=ayX!?64/?64
<6TD@8 =5?hN:hm@wJKG/l@TSyFA6\&T%JdGkb>KTEa$&Qu<LQIGR^YZiL5^Y6Z#w4PmM+T\AH>@Q/>:j1Y$yS*
P=kR+X CQ$a^LX9Y$>9Rp@uy4X4%/^i8&=%ktQA6kMVu*?P6hZMt%jSi19#9in%+YhZn#^w4T/jZqR/m=eaE^:k
iEGVth +^MTVZcQ%MVamEBjL\<QL%@@+PlEWIY1&tY4N?X#6LVN>VZp9kJ?&8tVJ$?hPHIaQ!K=d?iP9y=ibq@*
FW:B84 R+Ia@*Yc@/wVBFF/uLn!<PD+6*QZ6tJDE9#BP!1!IAJ5XI+>D1qQMpAEW=I@Q9>LAC:j6Hdh8yYNne8Y
Pu@hqt %T?5uF>b6Yl^pRB!uKwtAQ<kRmlMcdwIRi1^5@kb@K#$8j+Lb@a5<LQdhp+EXPBRALR#?@a&GF9K9WYR
%Eim:6 p@lS/9/hP*ac:inhT4+n*LTy$hE=JLq!W@e@*:yuFlSML/p+VN#5&dCk4PZ!:8pFiL=qaR+9L6#jM!A1
m@%Lc& PV%:Yt=tT4Cd8eijBQAQmW:PupGPcp$JKkbcXmd1eq@ple15M/jPuDq=>Mn^+$eQ:NtF:$B*HMII!b>n
q#ZjNl ^K9dd+RE?9EkVpl?HL=<<nlMu8mdeB!thmFdRp=SSXF&Ry\AhBqPTQD56!NpAn\VRkLId>#R9HH%<yX4
BLPW@# Xm?6YdS\aZX69V/JH/EAj9wwkuwN+Gi^M<Sb=4tBE?YiXtbt=pb%A=Q\D@B#>Q/V?@bYtq4V*!L$$!hP
-Aq!9l 00086d49972001202b3 Page 105 of binaries1.zip
8eaG>t uVm+i?<?^d*d&4h5&4l=e$8Mp$>ABLj1=M?&Mm#L1:D/wQDjq14<4JL/15!5#M#<YjuyecE?ZtHJtZp#
#c!<&S C8P<HG%6HDuYQ8AcQL\DRtQVC8a5dFm>Pyln4t&u@\e/?>!be?hPHV6^/6T^k@9&:6/>B>$HGp==@B5V
I#9+l+ E6LC/>B5B9uQun*C?bTSLVSacXl6GXt&k9lqZ/aM?iKjTN\IcDL/ReHX4$e?<bFlwE!T&CK:6YZh/uWd
lW9NY= tqdW%>dW%DWY\>^FaW&R6T<:D6QGQ9\5eWd^>JpLq*5Z?luyt=KjRbmy^S+=i%wpywHYj&#j9pRLt#eI
ELXm>e eXc!@<#l@aeQi^@e&ht?6cYqjcpn5BC&/59HF^8!8D^iY5HyY\>?4y$B9$&BITe:8*VGNG=M5GhRjGb?
#4</kA Zwa:?i/FnbM>Y\h*WZV%<QIQV<$4Y>C\i4tZq4t&5=1/\l<c?m@$u#y^/5#y++ePH6m*:\B!WWSR^>=i
l:E!VF GBRR6A?9mIMV*\b^QnKE<!X8c5t!kRe\A&^MHXiVWPJI!WBQ^Q:TaB$W6QQFZ^wRph#Y>1/6G$F4t%e6
hd@Dn4 YXLj5HTyNAbtiyTpak!lLDpQTeA+iYm?4=GJPjp>A&ayacTl6?MMhywRp!B=iN<?Q\8nN\m>@?JA@@En
eB4de# J$:yHh*V&>Zi*6Fyd?jp+=@?5HuiZF=CAp^%/hNZ9%^XtB<iEa+q&TVPLMuQTIwItBLFViet?4t+Yhua
=55KXy PDl:Ymq4k1%&h9MKVetd9ZDJ8uyHT*MhP%X%JVEF@Se8uV>>/t#@8iPHn^\=jQkwI5AIXQS1nJB<<&CT
W6J:n^ ED$X<mq9k=uR/PTp=PW+twctKt4KInY1Kw86nIu6ACa4/S+aeQ:=j?k^8a:idi$dt:i&d%pL84%$SRIK
J$%I#a /GpjEKd*lVNu?1@64jC%MnIl*$jELRp4twtim4yG?Zu<Q?!H>l%&5NAA:Bi9Zn6@@MVbe#wu>wA$hjjM
*1W@C% 5dB\<9FhQbThTt+>SEbGJ/W8HemiqyYKS>yHyTSq#C#IVI$JDa:nJu1=&:5+p1?j8:1/iBuy/%qAIjnA
Yq>ceK LDl*<dKt^e:iSuwYa9CIpknkD\!eQ*Zt@MX#J+<iQZLp&CMSkj=/Qpcka*h^A9py=LPd/Y!&LE6J*<FK
a%:inb SXqLR%aXW/PyKtt:tTk4CiWRYH8/DN5ucM4n=$Mj?emEmEAE5n&:huR$6*d%dF$H14&1<VXmJZZw@Lq6
Ped%SE </h1/eF!m#>k5dT!MNXXW?S\=DWW\@iiP**t#Nt#=</hPZBk9cGqEtC@i99t?bNuL%&TQ:pQuQ!&VuN#
#Jl*<> M^eH@<4c<NARLEk!ND\plyiCy/HeMD#TLnyyiq=Gwukd%hMiJmluV^hw?y=Va+8!k$#W>L!DwnNu#t>e
?R6XGL *h!?&NNj%>lW:Z@RL%&>e9=$@/ZL@ThPHD>&:C\B\iQjCXRI/T+#>EBNXycnc?@y1K?5IH=%WWNF%eA^
Pd!ZhF KmM&#plbVXqiVk=apbYSWjD##*pu^9+d@9ZQ5n9*:?^w:h1^4ZZDBuDcy1<SX8Pyem>n<5PhQ=t8ALlX
TKMQ\Y PawG&nw5cVXXp+*uADtW@epDl&edYhIB?1%:N<=DV^!kuaTK*L$4DDiZ6HS!m\kQF9lTy+cFla5T$iAA
HGYLVn QJLI5I+K<k>\6LN#euJ^E<>IwQMlaSGbXWtBY8y1jlp#F!^yc8*dXn9FV>6TS@$@%FJZdq#yQ*j^!pC@
>TR!>j /BV/ljlAIC<A:pkw!>Di#X%HR+P6w5nBId$%ZYL^NAqijElpIK=KqRi\8A!N1S5\het:=^@?wQ$8i@DR
GcWV=K n5/8HZ8*6db5&d^yL8WN\yANM>e#B1lm4E4G&lw1K5weDV*!4Z?tqJKKc9b%5hajQ*Ap%eSeE8Di?ijG
XK$KA& lW9Zd%?tuVy&=QCBNcaA%<LS$h*Zb>JZ\m<<LCRYV*SP<A?ImJn1/?61a\%b:i4yA!a*IALYP!R\KL8<
n1K1Yj IMdNTphN&ch8/acP:j6*%<SP$dZSXqjZlA+9Bu#=>5D=m%i8D=#DVqN8+IDaTQmE#:>w/iqyy1G141/t
e5Ve1q !XbTWnH&nWuLTE@nyeeEJHE#Ew\=1k1+DMGmTX5F?QT?GjtL?K9M1ZPHh@V5Q:T69c%%/^dtK$ST\a^e
NBPXN< Yh#C$NLC#FlXBhbYTXhQY$6LS%6DtmdJXqZ\P>^@:q#@+RMH9e^NkTF//@qD?\>iiuTFPC6^?8S^e&QM
@wQ=5u ZNLS!euB^%9km@nkai/l<atJTcGBwXFVLC%6dB$hZV*A9mdq<JKTWmKDk5KmyqYpJ:4btG84!#88/6^%
XQItYG <PT?/l\ZR#5NhZZT$mCKpNeS/?9ZdVu+/N1qkT5DA$Ia:Rncc#:@?WIqFS!Wt!dDq4iI#W:H$\kipedp
hKtCJe yuKli&T=11w1!?I5tyT:@>S4L$t<*\D9i?I/+%4@1ZMZ#l#9c&&Li+FaKF8T*+qcGi5bca9j*6dR%6dT
*dFPw@ $XNZppISqE=n1HJMPm/iP*@\+Da4C/QZCL&l94=&<h4hujV&#S8d$uT$LZB#%MIbe$Khy\y>pWA5#CE8
blL8LT MVE1MCDc^6VK&RZG&yD5<wy=th!5Pcq=+SGSCVu=cd\pP^MnDa/!+b1nJ!:54T1!M:ZH%XENcPMmbbap
^?FTHV qe=YemnkbySW#D&CA%Lq:+B$5dP1541MnLKl5by%aqwcN+&HyZF+Kj:SeX\8n^8myKam\&JK?9qHDV<j
!!P$<L B1TQAitd!i5TX!>hQC9%HFHT64R$$XXZW%jXBaD1i64ctmyMmwk<PX&TSqhT=bSBZ#/\^hJT?#XCjy%K
=8?+N/ dc!91/W9ZqBXwj<HwJtD!Ium/DaF<$Z<5DDZ!KVE=ICRKRdGN1:8AiuFe^hYXqVpbyiWqtdESjn:lKSP
ip>:kj DiIG?iqwccq\PLQPZ>m@aIch6T*=NaLmu?Yp5Jk5uEqnMFt!em1nPQE9ajN5?El1ywY<pwqShHbapHF+
tbiY!1 Yu1Id&R/?SpSh\w*MbGd!p6QN8Tw!nNX@Q*VAiMuQtZ\&RhAiW>\Hd8GYI!AJ%NV^>RIFYtPp4K&6m/H
EeRHVA mcDnmA^Kp=SZXZa/ijl\6cY%LC#jmyZR9=dW%>F4Fqe:/AA/#B!^EVkldyk9/lPPl/GlTZmmhcmiwWXR
^cl<4G *I^=<@Q#mm51!tiZdq?hHitVFyPaG8#wtyBww/?q4cdMWZd6*%8jbi>pmKpn16@FP^MaW<BCaNV?F^48
d#NClN IM+%n*JPmwD%!kn%m?dt%L8ty/aFyWd:ljG+/h/yAC:hSpYXw?p*6ZKEhJ#w<Gi\*I?EkAlhT^qCFJSW
:=?l*A %XSk5nQReYi4\5TBTCBT5GkWe9PdL5qWXja:eVVj$paKFt&%=MwX!=a&N6D4Fp@V@R9LR8CEP44mj*A=
LYyQDD lCatJMVd/SpHiCjMtJ8VtX$/1&d@<N6@l%dF^Kct^<a+YNwGSq8=iy8Rd>+1BS%au8LkwRP+XH:IV!mL
:4Ipq8 tCIYGm$maXtLqmh#E:uBaSHycYplqu1<8E$bP=whW>*D9EMBWXwEN#wKFm6IYXZQ#:6=bPRLu@J5CJ<p
ZY$bjX pD5mE6b=%lBEV<W=NA%hHW%6lB\i\EW^WAqJ8yJe$?pwT:6ZCLFGenW5$=JGTu&%Ic/DptlRM@6JJ/1Q
JP8N&q 4/<QJ5cTGGYmd&yyF?AVp=^i89&j5Zj<b$NQl*bpyE!^N#M&6klPDk1^XXXYXFJRqq&!L6yyKkiDCqMa
WPt4<n qWeXqMcXlW!elZK?m\CQ?59mXEm!$QT$=P#bm*cY8/<9#l?<M6*dE?DlZGy1KDea=$4#$yKMqN\<Dw&M
$G^LGh jIQEi#e/VmBZ!heZ$c9S#^A/SXNHpT=Bw&PIBHqZKa!DCCyEyCSwNLdDYShL+%eIjh*c%c6Y4qncmDaG
c%ByCa p=@eYwlI$SA+TZkCwDA<XD5EX5jS^5DW*NLB^t@^nmMZu@GjZV^!:8CnB%5Twq%NeEQ=1Y/tu1w1Cky!
kA84nj Cw1Kql9>*N%XSi4p:5?w<mRVbdWLRTtw+$&%TVlZMVY^wP9i5=HD^b&Dk>eG8!/ee9BJ\:nW!Bl8M5dF
pBC=>R ibK&Y5:*S+c@<>HBN/MEel!=L4mG6D>BcFTIupKV?InR1ZSJ&ZJDT&&IHH4?Gkl>GXIt$pEN@li+/^S^
^DTAZG +A+SCWq?>1/t^5aiWVMZ4V>!=CGjQ*m^hhYim=eYhRbd/?8Vu/141*CWFYSq!T*NdC<9b#YSP1wyN!tQ
=X5M>V Km4>l8ASH\HE4u=m^i4elQnK%t9QZ>+jPdbk:wuLR$Q@ZN@%/tS8I5aqiJNeGm@LJ?Dn!NBQQ8ZSN@K#
$<*StM wX$E4ADq!nEWRpiyFIT1n4=HCB1XdY*JkTS1pq\QyC?yRHSFPwmy\B!^k:Ah@@C6G=MRa?9k=liaZqI&
!#LC1a j<pP@yPl\eGuN>a6ZnRuQ#<u!WbVT^NZ\#tEA5#DmqTnwCt&AuWBeQ%DYeBEqVABhF#N+eaXc>8/::<e
DjSp4# +k<Pd#:=+Fne=6*D@KGlEj+\j&uKL/+pL&*:1=Gl*$D!<A<C&WN@@QDY:T6H>+W?StkT=AphKQXjlJCk
ZEbP4q /Fp1AepL/qi5YnI4*XH+J%J:kSQX$hjHD\@XCauuP94^e51#y=ZP1h@$ePn?<Q%db>hXX<:P!$mJn\1!
+:$1Fc l8=H96i61CAQyy&6c?L6d!NRS=SFaBT?K<M\#/I!GhIdJwtQBG%5@c/S*@kI^1e@dh+W&uVu\1EJGAdZ
/MK*aE Jj*tT1cjGBwiGS4qW^+Keal&F?*S+!h*n8%1iC4i@pWw&yVZCJZK6KSB4N!M*L!WMD?h@!>YF%<jj#^W
=JW<:$ Q+GZqX6eMu6Gh6tCHb9&ZPE@8*?kb$*6@NLChG=<iECku:&1K5/lKCwA4VS=HRMn1$A>kd1E14!<k8JZ
$Mi1nE bX!YK5NpVy&ATNFJAW:I@PD#u%%/?8V666mV@JHu+*#1!/QJ1SNeY54M!<N<@5kaH^*=<JXA8tmQu#!/
=mV=pp 6K6d:ltbBjITWw4wC\VSiIuRT@K#WyPuGj<ZKC!@E9m55NCRlI\=e?iYq%juqhX$*d<D*qn^@yHtqZWL
!A1kcI =^jtJWYHB\b=intwenm+AnpLwA4pC@P81kJ%mwce@Ge!VJc$/weJ+lNac^HBjM\j9Hik4Z#D%GN*adGy
>5$dFu R^iuyR1+qNVKy^kMtiN<=NquA6p6?jVbuRN:uX+lFAtcJCmDNCJNw$kb!EthS?k>LT51G*^%@pbJNZWm
Rw#te= H=ewi<QwH=w\a@iL1+i1F<$4YZ*u^6A@R*#<1eKlDi5*Lh$&y+RdGS++^e9H$X=NGXiRaM9K1BlCuIc1
1jKS\m p%Bd/y?WeSalnS\bJ:=AD4?=?@p4RZ#mQ%y&h5Yq=YYS%ZWau@y<kD<m+FNH:lWqmdmW&C*Qj@HS6:<B
5\kGCa %AGJb$?9:m%>mXApEZpBknA\BFXGeWRTbTPTmNR%BD^i*=we@G@A1IWV:pk+tdn+?ITGJ5cZ:d4#e??!
PYB<5P =ZP4qq^/iQ:p*TjQ?A@*:Dn\>NdNy6NyRK&uF?/IP1nlCkRd$SIcIIcVRK88>mhqkpqIw^u+PQEbFJua
Q4t&c< mSQ+e#:@u@4:R*j9qFa@=R@jd:&<i*n*<CSj/q$68SGYiZaE5uX\/CY+@b$TV??i:CbZZj+*kmw!ebBl
>m$Z/A KwLKZmZ*uNiYK$A@BAZRuaRWEDtcPQn+VAtNmp?d5jL*WP@/ySY%!:j8&4d@=N*Bwehu#@Q9*u9$yD$*
%8BBdA Q5VdG*ipP%tac<9L5@WtDXB>NikjY61+D5L=DMFTyJY\MWkB!a9A:A>!R?Eb#yh>5:Vp%QCVnaj:h!/<
VD\GYL !?eQCjm$y%8VWkwipaZ%>L9wQaH$WS>j/6Wp8hZXGWXpyM&$bMV*51Lpp:pdCH%%ZbG?p5d@H/?h1+>*
l6cbBJ aGSmbu=D>?9dQZ&%DT5*6dS9:#*/=PunRj=V@4=%?^<j/PnN<uJ%hHRk^%A>Xj%^A!yy6wR/1J:TF&Yw
-ACXp% 00036e1353a001202b3 Page 106 of binaries1.zip
JTLI%$ K9qHw=AIqNH&>VAAD\9+:ME%FXG=P^6cl=@jZuZ?@9%up*!JX>6ZQ^/Ctu4/+m&B6FN8H\y/nplKVW%k
S^E8?& wJSJlEFFKFR\XCAFW5B1a:tdpyL!@^?q?STjwImp@JL!=aMX^j58uN!/cXNLY$>j:=u4V?@<e@Zy@411
5>GQ@# +?h&<u\>HS\hdVAL%NJ<#ICmy1E6kB@\Gi!k>Idj^HiCkYMEee14=Mj\diBP=91==9Pd4^&+PnS+:MnA
?I!tdl $*F\S:Dp/HQBG\LbkF/e@XK<:c\51djcVGaCRXEbHEGqyT+ncJpj?i*uj>GJHI&>jL!DW9jh8d!th?LZ
Y%%G\K =8n>>+?%6:c&6Y@e6QuC4T&>P\eQFleY=mcE\IInNmKIDjlD>dZHhSCNL<wwM@WZ<aNk@S+iJwmhd^5N
EGCn#y N*YR#?Nb\=j&n@DjLS5aAw&CTSq>QQtKRH4Rh4tjCKwp<R6l$Gup!eJM^dXl#Eu!CVTPIHKZEDSC:d@a
I%!E9C JA^kwDVC#K*JX%Hhjd^DI+@ejQH>\LFjBHE8/@LDw>6&hG#h&LT5ei*Ty9PQ8&ipSIRH?HnAH^YTEW+a
B:aAY9 WI\5IESWX@Y4M14%:lhBIe=@HTXpZu>>@$SI*Nq:PF6tj8ikkE<j9D5$iHV#\/H*pIH@+m>BLlHdZ<Ce
?Xk6VM 5cP>HIL1Tp!A>TJ=yKJ$9b$F9^GEiRqBVDB^pJmP1:c=tbtPlyGb8a&%k/P:n+>jTGy^%V*m=+jJ!Z@=
EelP8Q q>K9uNnj%>i?DyT#5t:%\J*X!RqSARHiDw=P=8I\J\&wy8dt&1M/mNI*biV+V+Li1tS\l5B8VW+R#MH8
YY^!=y T$PZ#kq:F#LLu+@^1ijY*IWkphHuWM<@Eacj1/M>4/=qh*innkCl!mMMcSFCC#>!RlIl<^GlZpJEj&N$
95EctC $Vc*+CkcGYmD8%DZh@Z!C+*tbqRM*y#AQ9%#+i4L4qp9nl\hPLF&ERn?uBPDY\yT\\ICQN$hHi$FEKLi
nmi5Bd u^D%IWVXd<w@CcSIt1GpKP&mVFH!9m5k=E+Inua@\4?QHIqpX9Fj**k$lQEql5?&Qu#^L^<bk%AQ@pbp
==aWul KiE?:4b#i4w&#EnPdCtXETEWBjKXJTtGp51c/$@X%XEBk1yJ@q@A^6ytHCW4I%WbPa/154J/jG^RQDi#
qlbmZ: w1/>@>nip:8jQZlY*9j#^qZ?^py<qp#y*u5u>&TFBul/PWQlVFn<mhb\qK#5:<1@Cawwp<JWqJhn5?Xq
\u9udW YR^p/+TIaH@HjkwIatkDh/1!+a!PbS6FjMtlc\9PH9!Q*b:jCJ5ZGi^d*6W:$>ZM\qC9:a*FPDk?m1V$
G\eX=< nP&V@+!DGQ%j4Ed//pwPyqw!56aB@4/&KqcZTtK+GYWX!#h$:K1aj?*F+Kb=*$iQHqmJFW4ud%t$P!<5
a1YWjM APbh*HHCAnGjNMDNEeQjPwmtPNAMFw9FqtjLGJ9y/GnIeYc@lR#a9&dL=VA#buVk@V6*TF=9Q4u&FIIe
LPu>kX HwEWGEZpp*PVItP:P8dyY6kb114y*5Wd^lC/BM6w#\*mp5Ty@+YIcmnlHla5PX&Q?BB*HT&NKt\ud$db
64w^N8 *KX4N%b+?$ZWZ:$\<:D\VpXldqatq=9EVa\I<5ClCWGAF1m=Q6tC@5TJcm9>WB+q1LNydFWbjVddM5SH
KGq8Gp X>jA!MAucb?RpBGeTpyKT?F6S<^m=+<MmjmWIj+RyMAIlLy4DFG$ZJ!duqDX6YYG4acJ8atSG4Ja6GFC
N\X8*E @DWbbh5&uPD>F!&8+/m6:BEVbmY4/yuk+SN1dYVy$uX*j>H5?8Z4W8Nmw1G^LX%a<@qLT$=tXtJTWtJp
l/6b5L XKC9q=i*A^p9pG4$Z:m@wQKXjm1QESLuGI4c84I15wy8LmacSwaG*MP>iZ$aIT9cWJmc:K$Y9+4Bmp<+
$jeyMt M9L<V/!H^^Fq^VX#muI#%uc$L9NYXhW&qyiqIZcjjDCEjJBHY>j%ujkmKZQtd:!EnyP8qlW9IpXZ$Yqc
4iYTR/ 6LYhqZ6CYtbG*em//qXLW\1V!RtYG%e^j$R+YJCjpyReFSqNt1j@C=n<4M+WN$e66Z>Bkj%WHmepZ/8y
%j4#cw /P6wTC8!DA%%Pe4cW>:mlQL#taME<ZbDcX\aL!+kIqlJPnA?+?QRT#:/dA!CQn&PtJY8YDm*4LB^=:Z6
1qDtPR M%SWXbk5Pw*PSKbIeMk*55H=I>LI+8=@CTLYYiZ5@$JZN>BKV?PqPt8HL!p$NnEPD$+1:Huae?HP8cnW
:j&QF@ QJ!4\I6Lhm6i<Qnj$SZXPRpSpbERPi/F@le/ckY&D>GH8hMCapj%FH?S\ee1t=1atl1w!*PnuR!N:C?j
WbB!GI =Q<p9lIQlMh4q/WGGV9Hbdytc#C<+5JP9S6/^WiiDlQItRqE^&#jt1Y%C!6tdu6:bVNHVbE6TbNT%hFV
HE=Ed# a5kup1>apC?dTNX$9!KI5@R5&ZN@\>jWMdAMulGjulF8HFE*%$A4*N9dN*Au>9u*tjLXBbE+X#+/cKyn
hb&k1K ehZDq:?8VF8dFBpF:l4:L@y^C<V$j<H@%EG$j!qQELS#hHM#QR5#KV8qlER9jh&ES4^bhj?#6@\qK^wd
tQA5ZH W>Q%QJK=1XpcDNjw&QpjZ\?>@lQ>8WqEC/$+*dJl#jJqyk+@*%=VWXhk$tlTHEM6Y&&ylDSbMLQTG<ua
TmQXL@ l/kB$!V:@\b9yYQuuyiYtXQpaBbWNqjQyC:EL!Aw:^>mZ>8!dS9T8d#pCD<9?@LK8+<j9M8w1+:FA^H@
<j!Sa^ @+K*?9?DN@!lk/kIqRXKp\Rh<#e\$\T=Mt^i1lec4c>Z8d1=ietThYhtyC$PVW+&<iCtedp=<k!Z!Pne
qtc&Th V&>iRj!QIj:#p+mX$1Hd9i&6#iWww6#@m/ipCPHVGGyR&$4T#tZ/E8SdHjShJIRJCdQ<wQ<k&BqM+bb\
l1t+N/ <^bH/V5H=M?PDCnqlSbZ%Lej/?:5cmlbuydCVjd%>yqjj8:8FWHG>HZ#@RKDQQ/DaA5RLAGCmekeMj$B
eGJF=q 8cM<TkJ+#ua!%4c&eDW/SH#&>nZ&4h&\5Zl8cXJNYPNmb%6Vn8hW>*S8Iy*lHBEX<?uh1=h9?MluRHB6
BI%?ll E1FHQd8=d$>4tSiPcKmF6?5w$&l$cSyNSqPcnmKY5bIW!H?njX&9eWLCRTp4X?H<H\ncL9bJFVM#=!R/
=ZNe+$ P:ydPahW?m>N#q4a8QLDQ/i1qycp#J1S!p*$u^JSWd4u^ptmMtQX\9nARA>Q:#@Fm#1bnX6ItPpdGBmV
+/5bQ+ IL/DF^JnYKJl4Yb5cVVQAmePLC>%6yt:itq8V5HBmSM%kd=B>qQWuJK+*BAc$!W5\9@Yl=i9?j#BJ$>G
QlV:CS Q9=Beq8A$NGYd\Pu#<ZL+RmdAR*dXqYcRYMw1:GlwaN:p/FmCDN%Y>jVeaJ\a*J=*u?S/LkEL%mePVNA
\J\$uY %5bi^>\>4DS@eW=>XeYN?:9Q*%<hG^dD+/bGBIZp#b:bitQ*&KLWbZXqIhElwYG?kAS#SB#GLCTNAai=
JKNGT8 PY/Gt84?ID*VtJKApMJW:K!MHW^WQ=lP4F&%bPtmlLLXFR%dSD<I+qq5Slw9IwDejVSqML&CR*&9jS^=
%Kli8c <jdhL=^AZ\>?=mMjAe/AAFFZ/jq^?>KA5V^=dn4=@c8tFI%6a&+wBT+K>FRCS%m$Nh%h%%><Ih!pElJD
G+iV#a @<I^%k^9Y=^Raclqw/quQ<W98G4Xk1YdV?>8dj9/c!VGL^b1P#E11ZnYnM$*P4<9TF@hYBMhF+YHWH!<
Dim9b^ HWTPmPY+BhXTZ>>ecIdwjhNBFMhJKH!t4cYh4Z:BJ<4Kbe9\JVyX!R5!D8AEIZ^>i*$cN>:JMmtPF!dD
/C@T/S awSFS$&>?8$uLmCRq%?k\weI=JIA+bl*V#/+iXGPkTA$lyGSkb+1I1H9+YCPm&HI$^EWein4:n=!>eqd
/W<lX* tq^WhCLqAwIyWSZ%hC\%w</XB6Rwc184GS4:VjFLLbk=<Hb9:?4qZa@94y\TlZHqp4NuFe>bi:n:iZ:b
S/X=YK m84XCYIewd=iIpk\KHTK!Z<+WG&FCSJIQ<9P\hFYd@ETS6*!lmXLq#SYFDjAWKAw@LdnXka9X6<&uPjP
9Sy>%J aP4ESMapmMaI=M*ZQ!DPAkn@:4HJF:haEklKp#a^M#atV:HWenMVIAw$XFIT&hDV9cX6#:p#XPZApATb
j=y%P1 Q\l$6b*5w1=6TXkn1/c8b&D6N!WtJPEwecYy9c=&?cEF!<6D!EE#6dlpS8Z1=V68=5/6Y:k&LVaiC$FD
NIn5#j jaRpkkpLm4pBmWD@K+m5GEC#nK8*m/%liV&neYp>AFm!+6&JZ!JCb9AFj*8pt/8>td$Wm?tPS!Ab9\up
WtqZ=i >de@+b<SIQIyZYD<BbGTCI$td&X8yp$l#*qk&E$kemnFyc?:a$ZV=4:Xp4w?jyHM@+J*h+m+&n*4Z$e%
ku5qbF DWN>:/mIyQRL\pedF5/6Kq$+b*:D4yKWyNTW4Jp#m8c5K66&ML>/<cIX9Lm+&GA5BHGihEVMJ5GnCe^R
J5^M$^ e&&IZZtTnL%C%u*KXA@#idYMqjYN%e8YL96?@c$II^AlVLa9wqN+@tHtVJbCTFl+YQq9A5ZJq<RiR@Ru
aAE9@* BRkqyi5VVnA9eCk$m4t#ud&enM\aJA>W8eVY:6/c&5dXLZ+$C^i9+D?^K?l18>mEu#$^e/^GR<9ai*Z6
$th#6: #LcQu!j&Xe!iZXa&w:T<?8TY&Km\$BuFlZt#b5@4ZFZa$FDd\MZnpFBS!IRnct5G5+YhyRAT=!5W5+1A
iuHRly nD%Q^5ZQ*>6y#mKyqVWX&ZP**69cLTTRX^D=#Wa8N#%FnmX6H^acFknnFaw@@<qHB$el>KMCSDcqp@>n
J>WKJK nHm5R1E48V8/iZ^H&NL4i4yZS/bZ%K>ZpDK*hZa@V<c5wcNmb^Qe*eJ:8X*b!Cc&widXq*NuD8\w!59L
RBCGE\ L!8aXd%/T&hpSGlBeXFijFdG14:!GR$Lc!6nIiaEDDLit&VeGeJ&5IG\nd/AuA1WlIV$jXebY%jjKc=J
c!M:lp K/SZLI1b6c:::I=d#$RE?wS<ZH8h^$%Wa4F$R+NCR:!@@aCT@RXlC@:pm/^@^&u5\?hQ?lI!*lFP96dk
<KYHX/ &6qClJ*T&>&%cubc#K\ESN@E*NbKHL1cJ69WJmD@p9?mjRc^aVMYuS\e1T>Mm$*LK<nQL6@V6L:9RGSp
1n%kQa SqHS>QKbMaqLX</54y6ZNVNGFIiGBPMl1LjLlCQh*5de\6#B$W=k>qpH%XRWKapI^1?qWVLc*5=PdnMd
\^MAdn GeXJ1^=j:B%=M5Rj^RtF4=<@DA<>=*M#4Fp5Yh@kwED@yh?kXu?DuTPn:+jwDV1*n9:/<nETpW*ITEyT
P#@F%I HTh9F=FkkS9c%6ZXe/!%jtaEm/=ucGm1KRckL5>Y6@Y^G<lJ&8BwGh4hXNX*hX%mbESKYuyBZ68#$!j=
HPqCK? #?ep#Tk1LGyiM18lbNd5=XZqC+6na4E+iu^MeElI1K@L8KPpp:WqPV!VCj<bVIWa\91c/T!tq:PVjewC
Q&>^t4 S6!&L<<iud\@^H@/Y$VIHd=\b*Z::GlyFp58LD\$MPu4X%L=^@nIc#/aIkAk*>X/hjLH>^=EJuFcS4ae
:W#!/A CWCTTWXwqN/844=H=*i*&FAX6jWMnKZFAJVbdCW:h>8!Dy?tiM@>Le8L%ndPDR<Mmw6NV=6bjjkyu@?1
+ajIQ1 K4q\?9Vmje$>l<6K1ydMuVh9Yqy/4CkPmeYDKTFi#tPPpm:peY?tIDdcZ!D4FVEqnGDi1K+6b<wa8:la
VP+4*b ?W&ZZn*+/9Z#l+@+@PeARHm4h%Z6Mmh4GWARFSZ8%@PbRF:<nd>@EyFb$NZ^XjmVMJS\CiDqwL<SBWpq
JaQ%/H cTT\y/9u*enh\\ldW$FVV:8jDJ%<J<DY$5d8ZEH/5w4yiVt<8eFlkaES5dGJchPd6n?=j8jq9Kna/jtF
N8P?jq h*ji?Yhcbj&<8ZNuy/cqaiuTcitJCiFB\eH?#pIHcZ6*N#euewc%EpEV%9+EpwPVANdY%ncc5NkiVmdG
-A8%q: 000a947ae2e001202b3 Page 107 of binaries1.zip
>*?L$J i!SiD4%+@S4nI%<l@uj<*kiZT?^TZJk5Gd?amNnQu<t/Hien4\DADRBk&68&Y!Aa:=T$>ZBPXyyEXPnT
hVQYXm =NHRNBTlq9X&*TK?upXMDVWX6Tn>CK/EKGB5T&W#M@jVmb6#9KPVk@L>QV#>!i>K$yce8u//?>^nd4R*
pi>T:@ N#>9>?V:6:qN!!4t#Sip$dMKDm=Nn+<Q\aMSZ/E*+WZ#*yD8:iSwB$6kAABWeCYeaD&44K&6#=KYXZE!
TjW$B: <1=G*8A9AAYjQ!\mFIc*Hn5&@HKJbW!1QyPqqS+*:T5P19qmWplR<JiDAn=q<KMI1tEA5FCZ6Lj9I\T@
4u!L*E hVniH8G/9^GW#RAn6K14:VQ^G:Y#M6JTPEiCpMZa%p\hE>PRc!ZXun/JAcq?Hy/BIcHp1Y5#F/:18u5l
4NK8Ep PeR9LDiZ>+IRqQT6Y:m\QC<L+<upF<\=i:!RC>IjElV5k*p^QH*<w\?ZB$Dim:Qyp\=FVatE$qMNR5$q
yiqHbn Z^H^CklFu@!L9/CP<J<KSaV<&&j<\Ye4b!S^iYtkw*:bKV>BSS<@u+RPN5qH@^$HGE<uEJbYZ@9YQY?I
i*S*d= =!w8Hu=i9^A&4AWmwh#V9iM*MhjH*pb@A1FRbJp@EFSTpa?Rl!uJ+t^E^y4JNnA^D6^aN6M6!net%ub1
EbVNGN eHBIVGI/6*Di=8Q<\>#I/NVw*Gt#QlEunt=1ZqyaqI9u!^bQZ*4&<:/m@PVa8QmEmAl<C59ZQ#T8:j1C
*YL=jj SC<QB!eLDIye@=MPVXNSmTBGG@Ac1hueeCqbGZZQeD1Q@?4qm?j<%:BA?FQ?<NPZ=/d+y5Z=lpBnm$p=
*QXcd9 C8P@aPnMt\pCiT:pW+=jukSp\?MIc$ydi*9L@6e9XX*hatnnmII$W^yMN$yH:D8:8u>>mW^*$=%A1HSJ
CG?J>9 XPwHRtEmp5MAn<\=lMqtM6SNLK\6E9Nu8Md+bDyN^aM%wnKTiI5Q<J?>4PIt<4nBkhN!e6?Mudna91K&
a@a/mA 6kKjLX%Y5jdqQ?*dP+8TSZH5?PCktPna=Nw9X&b+?Vk+YI9MEJMQPuIA:N?/ty4cSG=PLF6Yq1XEe+^@
#>Dd*C ?jLF!!hCR9Ey@>uq*a6#uF^Vw&%Vy4BaM5pFZ*EC\TaJmV6Qldjl@=GZIn:%*cpu*<DG9l%DWQ@hYL9p
Sa5SlZ 49caRBj%CWSbkmJFSclMCaTK=t*9&jd/XZ1/JjulGTFDRitWu?B%?YJ+PB6qAV+bJR$dY!eZ4>Cw1eGS
tm#McP @y=+5HhpP4iwh@D^+PXadmw*kieXp=>Z?j4Hk=MhLW?Y4=^ZYXt>?i8u#=<9Ftcq^pEFeqQK%/$5d>n=
4:Km6> JC@C!^8Y#\R#R<\BwnJBnNVY%Gb^8YX%9uSbYSpcp?&$<e4Qu!JCVVR!hL>^>/1nQkdt:pq8QDNyFmi!
uK*End WpkR?EMlRePQ*uk%?BmHciZh\?j<^$<iaLCK4$eSm5H!L4!D*4=6Y@QmKVw\k6Aq!T>TWRyka!\8#bp@
D?nCF* <<VmXESc<nNCw$w#EFTKMkR+eVdpLNPV!XcWWdb&<jAJCI6NVb5YG^:6H:9><yyuq*d@W^TduBLn:?65
tCLeNa tSwcW>d\?N&XG?<@:Yya8Gly?/Y^+R&XlVtkluK<@N4?i\N*Q6$5DjQ$huh\5Aeh6ND/yCPuS^D>m&6L
tZK$lB W:m<^pyimAyLlyA^aqER*jVNh#?TH$MQNy+c/m/L>a%K+Gb\5#Tp=SRhm5iJH@##Q+REi8#8KEG:&ZGw
/\WSTX @?wZIaB<<S8SqHD9/i#w\D1q8nwPHdBE=Nq5DKG5YM+TIR\Ja!$HZ<i$/RaMRE!SSctnmASKkYWt%=Pm
l4TX$* \GdnVJRyk<8/5LW<jRQCayI#<p54%q%eYHH>>8W%!/1<m4d!Eu*hZS!5dT$>5uMdS?=>G>8?8&q6e<iJ
KWW8MG %&?/=yZq<@A$YX=BZqZdw>9hb$wTk+K<*ZEH^AJT%9CnDpFRL!=8VMc=6HJ\%TqiVE\Gb<p^bNYcuk$%
@q#P=i N^<ci6GX48tTpwb^tRt/Tm4/46MJ:MGbCSDLp/<EWJdu>#^:QEkk:*<mcqI?$&6YdG4b6dP9>T%^Kw+B
eHZw*K K1P=1i9plCFMn\wT!<w%XSkc5ay!KI%P:tw4$tDqycnwW%BRqM*CtRRVp*Xt!S9ci\ZGyBcYXSVhJR=%
l+:WM@ u4yTW?TXu4Hkwci4l+8D@bVX$/LV&$>??Tm<?u6+Z>jFb&Nj&/w4!9L\HFt\i\jiny?iQYNcjFm\n\@8
iLNZh8 kJIbK%=Lk1Be1e9A8EkK^pZVp>T<DKB=!VAaVL1:V$dZlY*<Y%F!DDqn+@A$uK6aE1BwEQ$9RZ#9Ey\b
D@$y&< JIkJw8$!Qp=Ij4u?@Q:kJCAh@I1wTLDalu+=/@hma=MuGYlRX&hu^^Y?kVTKIhI9j1TyccpG1aw@Mmij
Clp?ym L1ATqEpEbXKiIFRqSZWYBnmF5laKeuK!5uKc6wHbC:Gun@:bW^/TuydGY:9L!M9X!hHB=e*A+IjSu\V?
Xujj*Y nZl*:nyPTD=y/^naXIyQq!$y*jlENLTqcq=8RtV\FB@MAdEStwpS9y8VM5cX=&ZE8Xpac19L5SVDk4%>
%A@Cpa d4<I\FkKG5cK*8R^<XXi%l8@Q5cd6$/8\\u/65Q@9CbE9$RCR8LH^mHm<#MCGj1C!KCT5uIKG6P?aV<J
hkP5=Z $%qhYKhE??A&PTpMpXX@Se^V%#L\aDBR<kMVHKGwpNAp!W!XkFRFiFy@+et#FSVp%XR+HBXNQ@/9T%j4
$RF!WF <yQ^XFq8T6hCHW<Q5HXyu+t9AlGlNj44LW=<PuHm*@9LK&cXqybW%S$ndq+<&hqWHB<b/C$mZcEy8C1C
e>4^5d RL>pn*J^4t^K>jREZ&h4Fi?+EN?HQCpST%NQZ#$8M#Mn4cAp8j%$b@d<9LZnF+nBBVlPhH:DBAV>/@K^
:CwGyA 5h<@J5k1jQISpcdC^BqQ+J@/8wYht69H5>uVX5>PS?\J4NJYXk4!WqdcTk%B/LwWKmDn5FpThDE!nwaa
c$:6qN tWCYI1?klK6JcS5a1?eR@^!cKW1WV$4MP^tyG=PSXL&ndjKZpMB?VBI1D+b@j*q$bPGe<pWLq=:>NVa=
*P%6Tn <i6>@d^qmaAJ6VIq?/C8GNc:QBKYVF=hdj&TbY5#IlPC9M#wRycYuKtY41tK48jiYTp?6=4i9c4@Ibw&
bT&*F4 J&%iL@Gq=euRN@K%<dQ>8<=hjmkWna+R!D@9aSXwNEdNVk\ES4dn$QleqdYhB!PqR+u*$:%\SF1FkcJW
?yuNLk FRSlwL?k>QmIlJKt8lID@+NIVpEXX>QZ$NHRMnG4Ji%IdB^$:@m=l@Ph$4Luq\c8AC+FN#>>@aaS19nQ
!q:RX/ *@n\<=dG1kXX!>h$ZQ+=9P9i?JE:t<K<lR/IJimJ?Y<hkVap+?DPlDE8\WXVF+l1cCY<BC/$P^HwmwcT
nEuF@N yda#l/X5c?u9#>*SV##Dhlcjd/*9H@:hLjl*pyDCHn$pmQ*jB!eA%e%*mARFbY^1u?!Rd:6TZ%uc*Z:a
Mu/p&S T4GJGF+\BWF$MIS1SJik\nR4?\V\1K14!=B+JtXbmpw1/81c8l\%LY*6eC!KmJaBQ^t%Mn>ne*dtmpn4
M*NH#8 a#m8??n5CIG>iW<ICF#R9&*#!tZLq/>6/d+w84^l#c69P=eEAS#W*qSEL6M*dRq<mD?WV<KlyPjQ\S6w
H8tuSK niqeHm>BjpJGl1tq4=+y^>A^ME$M!@?GE>JL*^PVS#J!$k@nE+TW5G&CEL&>>i5:kLu*GyG\*hHS*Tu5
cy@\*& pG<>wTEV$>6>TpH^LLG#&Jw8\aJPkGyIk&BIRFpSEwk/RFIETMy@IPEKlL!$knJHVW%L!#\mDA8*n+mM
CuijXR mwtic&5Zu=*ZcY6+l*n*>dXAlN&><bMkJy?i&:?%:hVy$:6*99$>i1F&XpX*apmIy#Npu1M=FJTF#uh6
M$FTtJ !h?DjQ:l^HG8YBPVSF^$Kt%C^w!yaYdKaeuatS6pbdaT:\:6Z$:kk&$uL&AEVlD9Q@\kmChDnc?kt=QG
$R>c:* <9\4SCK?N&M6IJL4cYEw#?91YK?1<bK+pK>Ab+EyRRq\qTm=YWJ1H!KQ1%M%FJlmQCIFuEPwiYyw/RcF
MRZW!C iATElITFAb/p8d1Y/Vp=!\\5*lKCH>jinS<:PETM9Z9=e&V*:ujjj%?+Nm1<&Fk&I!<?QmnE$<5iE5=e
Z4??6F aQbhG?NVS6yTJ4m@8bKy^VNpFGWFMp1!6k\=JSdDV5<$J:9u>>mhC\V^:SSPMC?@JwmuV!<T^Pj%9=<R
XJa:ba !CXAIP%tNKXh$CF:4E^F9dZ4WAdHikJ9LyccRBk!+ECkdFSSKRp!jJE/15Akk$ja&J@\XT\D@i$eQMpD
=Tj?^w $pQDI&MKwk$heuP48Ny?p>nuS<@*dN%>u*n=<kQ?/<JyAATnE@:8@I^yKdES\RHm<FEdeQpWe%&6Z>wm
4CVT>k \LA%byI:!1Wu4Hl/^%bhpVWyI/Ply5Jteb\$ZXM#:lP9eNDAw#AMDA<R^Jh6F$jZ4h=^:@NVAnu#HKHI
:4i5lS J@RJP>l6y#\=by9dV@py8&KC1kTKAGHKTYyIWqE11ANK4wGCWB%SAt@+j!C$VQ*>>jV$Lh$CAkPDR<Km
a5@$:b w18enQ^!e%h/eYIt<Z<8+m*1l/+@jR?^j^q<SYdB:@+:<@N+$RDC%<64$kG^unD:yR&P@MZBdAGEL:Z^
X8RVp\ ?cQyQK/QHqMI^cG8ITjLbwKPVeuLjmMm&BklGC$@h&+T9:cTcH?KjaRqPDPMICYVHVKu6XYu>HYe5Fc1
%?lmhc J::M>aI&TpHpbCTpES5Y>RE!1W=XW=CSEWLW8ALMy^^nXX6jh^&a+k%N*Mu4T$Ima8IYtPmHFSc8NFSd
$nI6pX R\l9H%nh89jWG\\uqERCeJ>n:#:*%e*kyeZEBbF^8$DkylNtmPcw6wA9PZK@I#p^FiiPe^tJ?>=e!BK@
uJ+/!% @GpwpJFlcc8wtWw#DdZW\*JtVakItbihe*KC8+uc?JcHa:h@Q\cFGpapbNb$huSnHdL6&?VaSX$huVyT
Tn=KVe VeTLEq5RZR%XCXqEYphdGmWlEPyTil4p>VHR>*EFQ&WPS>*F^$yDm$SldPa>%T<kPD\/IdFI$!!%cMa<
EGM/Q^ deX&a9#c44c>F$CmlPS^46mLM!h/1p6ub1bFA\wjL!>*MweeLTjMKKd/Y8QcE*#cm/e:G?iXV/jty!Wp
NG&W9k a%APBXhi>!RJ8YmTE1\Gm/t4w1DHp6JS$?ZtLBRS4DP#V%??6Vpu=?awIeRjEemyIWSC4*6%eVQYIZ?\
KDjGWA SpXnW>i8PkZ%/<TDGSwwiTkMSS=S8AhAKPy1lpIDi*%hhRWFDpjN&e6MXW6LD%Aatq4:?Dn:lWZFJijF
jt>5#/ clpZ#KyMXVC:T9!+?iZ4EIc>i#tJE#LCL!i&41%dMCPQt^wZFIS=IS/\Fldnbwn?8QaQQw9@=NlT<uTJ
!/:F4Q \49<nWpC4kR9nCuLJq?NX=jVW#YRa<yw1%lqbc\mLu\kh4\lmKGG$#pVR\<knjmI8w&BnXXFh$hH/=ER
n<I/1& bi&P>pPqHPt9SH58Va1NmlAKk!Z*+H@B5@ZNLM%$FZWeQQXW%dX$>QS\R%6VT*8*1X+BWdFJ!cY&1qaq
F5VmGT 5=jH18m@JH+LJmH6?Xj+w=BH+<hd%ne5ZF/WqjRuiM>J$tSPRJ5\twD\Cd:$<M8H1/N4lwa1RbEMib=c
=Gh6$l Mt\&TV%HW<Xcqmtu1?1Su*H<$euPNV6\auLwTeKGZcKHBHL=Ga!wT9cd<R:=#w5tG4:dP@i/1VtQE!8#
LkR:QL wA/k#&tAn^alXEYED1*:Q\^??yaYFp:tnk//ctwkyHy/lwatbydY%k+8:8G^Th!5=d1cQlWXNYb1+b?I
hhJ!pT j+i8jMdQH#9>bJLA9l@i$ZJ8#*BnT%qeaJDIC@GBBdAdI>8CACCIwB+P9Lk*J*YMT$9LmQI%ayQDkK+c
1WCW1X ^$!K1cCyHJEWM#KJ9>!HE^L+=y6Dy!E^ShS?+mjGl#X+Cp%M1lH4aHj8WFTe%6X=SFilkQnSEMkSIImm
-A5*S= 000b564a056001202b3 Page 108 of binaries1.zip
$NY^?8 CJGRp$DwqQ<DRNi#6LB&hHVR\NYwbQ!+wd&JycYNnhPW1LCaSG=GV1t1i6L</qy%%aYV&N89\yGD?$><
#q6:WB ^+nSi$iQ*j!B+Z^?Vu^kwKjRC:EZpM$cIJlwmkCCpE<hiyKj?yNLVjVRkPlXtHw1YpbMl11cZp^!!h9d
SP4qGZ t^/K\M:eP*pLJ&mjd@Y&9u1NR@RZu!Iem8V!4Z$hHb$Hq!1wLi@y*5/WZWT<KDiBFbDRb$nmaJ?ktcET
hw>TQb k@?D+G>taid5/PDlw11t1T58AjKiJ#8u+Jmp5Mnp%M!e<tRq9btLG<yqNJd<JASjhuT$H+M$t9\%eGZ5
!#$6V$ ^/ZV6/yV+kPDjIXiFG>HeV<dlYZR^RAD!NL\%WRwlDE8qSee4TSm/eny1^kyM=nc!5cbYdHQZyKT5G6=
qFAK^8 :L@9CiL$G&L5@llMJmijImwWlw=/cF6Hb@9JNBY%41:iiuYyC<Tn/XyRA4/THJ^<5inJ@?JHVT%\S^<Q
Nyb\/V L&>:VX%neRYdYnw+PLtG<^IC#S%VM/eXXL84thZW4$^V%V$?KlnwZ46q>!5BSu#@<lTd9LGtIyedH^Vp
S5WETL K@BC9V$kjKjjyF@CIj^J95VR>8V$knG8bK!%tcttE5/TaTyye=^aVGp>NYhi$pwSIj%BtLS>\&?mj?%u
Ye+>G^ /AQuH!Q/KBZ%&k/V%IC=t5@P#mP?T5wjmL*bE8T^ZjL!1CFFAyH?9>AJT#>HB@iy@wGBn8Gy=FXF=p:&
eAikqS WX/8*9:^*PSAX?@5chNLq154?/>e96Gea*9#/=5nc#h9i\=FS+\TE@<KD5:MT+pND\4&tQTm8D9dm^^?
D6J!NH kay1R8RVEQttT#iTePA>lSiHe%X+YS=?KZFP$m\YW%6h^bdGpNhTueJLQ++S$t<YXe:5:Gn8?:$YEN!D
pmiaR= Qp^B!GMdWV1GKK?DtdC6V$5l9dj#6lNH+=NwSSJKW<RStwwc?XIE:iqjJCKDICMLG$h*CCcmeH%i!#y#
+RM\qT T!9*^GA86IPaFG/T4+5qL:i\yG!GGmh6hhM&jR&jR<IH?:i<@+%NCpCQ:y+djha+K!W&QmAw$HQTm?46
GCQp&\ =YAQp:*nV#NE:\ej1uII+#5?G*y\ty#?@PQD8CtJ5TGtTX^8qmLkphJX%dcTqqdV$InN#iAV^P*Y^>et
^hwe=# %<?=?\M@<Sme^bQQCKI<mpmSb=FIIFREyEl=SW>9V?iiYntN?8/8W^^PGCFcFIKRyeEt1\VG1<H@+bK*
*mCDWG MHh!#?yKm$/ei:H6u+%Sqna?iAwcHmjmtuy:&ZL#m59Kc<IX>K5&dF:C%8ahGH>\D5J><94:/&?H6:%?
6mPwPA @/\tPVa&Gk>CQMi>EDeMPy&y\E^kTwLT9H6wtM>@5QN^&:P6Th\Mi=<pd4TdRcBLDJidw<#Ctby5ja/?
KKGI&? KwPl1/1Vtbj#mSldD<X!:<$NeK?Z@^&FPuu/Sj!BNCIlRClWFL1DPyXGSim#y%k=4?5+p/C1*hY>e=MK
G#4A1S I+>+Y&auMaqRcCnq&X>atMFWYC:*1TXHe@Kt6h>>$FG#MAAYL+tdqJmcElGZEyWRHiy1dVqn+SyLFa6N
YQyuFW Y@5!qdSuuBh>Ed%?iG9k:Ku6Y>d9GN\=I^tQwbH*&p*%>BS=Eb=TZ6=8hk+Pnnatw&J<69eQn\#!:*We
Ydq<1V HPG@1$:qSWScyKd:lTXHP$VEB<p41Cm!tM4cc9a!DGphFd95cR9iZZ<>TXB?Qj5A<@8Dd=B?p8S=MyBn
uq&cN# $8AAJeqQySCA1I\!%R^Tin89tK5/hHWjLFXm:!Ai=HQ8mJ$JawlDQ:G!eI@JZL>>=>:!yu8D?>ee&B\R
4%AJDb QK?M^+%MT\6$Dau!nZE%5ZKI4/=b1/I/6c%nt+im?eLH+!MD=!>eQLq#T>QK&4p#<kAaEweFweEltA@h
JRjV\i P!VE!<jH$\q*RP*M^\CbQZ@w!V@*:>!+^l</XH?Zj@>&aiGtPRcJ1jG^!d#E=KTa^CAdZV$GW%Nh%aWl
ln?q@d Lc86QDYdY*iLRIc?AS^NBJGE$anBppCpWCk#YDhIP9JVX@l@SVTl6:Q4pJb!^w/8$!q1!AZ<WK4$c:C:
5II1lV Z\Eh11/LGjmdYnkp:#1^>?L>?<$6@WMu?^=jQZj+L4<9JTk<J6DYN5VG!pSQT#6mWi*!MpY%wt&h&*ZW
GSQhcG 4Vc@t^m<iPXC@:HYFR$LT9IK8LFaDBI+HpRQTGpK>QQ!lEJDLW\tAJkD@?c=jR>Qd69KH*/eh+&@>EVL
kkD$Z< \ItYcL@p=IS\KD68ek1Qt&Iu#bVTW>P*wEp4/Y4EJYRhjppkd:<T!QP9mJ\WR6aPSaF<ZawqThPT?IWw
@W/CQP Wyb6/?#c9qKi5/C*@bkSS?5X5V+iENMi@kiJFMCauL$Hc\<Q*u9\/MtSI:iHly:^B$<F8kW=&y8d&ikd
5KT+KF cG6ycihWLYyaGe#Y48>14=QVDq9*b9L%#j69Jl<&XJTY=tZ\p1L^GEy5YKA\TD+kQD44\WdITY<Zi\hH
jSE5Ch B!6#E!FAW?W@i*#^+5m6:mNHcw<<=k@tXS&d6?LcNLDIPBhJFZEy1jLTPJPq1&KpLTWFZmwnL?EjuKB<
6+\<eh PjZ4QaE?j@8NRB=?RtTbCJ%NB*ATpwkYkp4@RnkT/S&huTjT%jW:8nw9cCu1EIIq@wmc%D6A?A$RG1u4
4VQFNR Glnwp@:AL!!n8Q#GM#=@<P/lp+?l:QqQBukP%ydp%ay/Im%hqbnK^W9YGHB56&#6tCb9uL4>N@:q=eVu
9uS5yA :tYXbcX=tV^ipmkGmSIF5RJna%Kt6=+PDb+K#qqIdu/cpwbN/hpkj@DAc8:!SXj+@J$L>ncY>h&1V^:q
!XISup e5K5tE!GuI/cDa5BLe5$bq4iFaI+ii<hkd\HWC<@mlPQTl/hmCMWCXu1V$Tb%6#b&Z:YWNGny*Q:Yka4
XeI@Pp pZk*$%6T<n%CpbTlpKBMTFBGF8dPDy:B<huXi+i9uV#?4LN@?MdJP\<iQ?RF&yL*Ail1cclnc8:1yR91
Q?@1yV qm/TW\l1*4nFX<X6#6=ScF%DHe51FyVpFuB=cTt^+q5\a!Mnw1MVWl5ijtyJTjd#<@L!>4DDHZBH\kc^
54G<XN JcXEcZmI9?uMk<e:Z%!ce?L=$TNFB=a6#W$bl//Y\ta!yhVW%i$aDJcikt6Aj9t:HX6iCD<T%QGSK\KA
ZtyIdZ PEki^I*TGcI@L*BDd/Q>SJSwY*5/P:6Q/!wqd?</q1WyYW@\F&1>AVK?I+mdRF%ZZe@A\NVC$6HdK#Sl
^!*K1Y $+GuV@a6Z:S8/ju:8>b68u8@y:15\BuZR:REcq1cJbYL/6eY5DY!N1=4h>ANZZJHRL#b*dK5jpFFcZ+K
B=1Z^8 #5X=<pu^edF^KV\iN*QP8hj4h!#iFA^8%Sue/yGjjJ\9PZVl#9w6#<mQy&@%DjGju*:<<NZLq@ZJ+%!q
5+ieDY bBpGp!G64/=uTYjIc<5c<SJ>N*=:V>CEwJCj5S<@CiRDcp:@mqByCCKHIaV+*k/JH+k!*VGnHhBXK<nQ
:$:?wP :?w<acqC:!IG<tViI^J$DqndH\kcd!BWN%A*NDC#5LB*<J1TMQjMp^9Q46cXXT\>@QSC+=dBl?61b8h#
X6<eX> #jY$JkGlhWlFhiPTRI=Y?c4Xm:YNiQPjmQB4Y:a5Z:c:eq1&pK8a!1*dpJPVpyKZZ*L=#d?QQ6bFBZpA
aB1Ri@ RuK1Y*j9F$CWj*=^*iDt%T@+@Pi*Xl@p*%1=:#uPS$hK^:uKTZacWp\GW$9XWyjBWGS1^kj=Ldu%CTPR
b&+!RL 5XEC?TwkJN@YnN^?IkTwBGyl<APlTp6TJIWIR+PP5pBJWVEeFZQ\KQ%=cuyNZV&Z#Dn$^*lLDJW<M&YW
>dJ6JT @MCEQMPQQD+KVawR1l81G?1d\:nl+lt^<@cn@6d?A*PuF%+<h@^pTiW%@8/#l@J=%ly1Kykcy1K6LG>j
Y^etGA XXP*%FdBwY:=8nJ%1?T&d<Vnui%ZZ4?5K5:NV5hVPXt=?R6GYp@PLCw5t4jt?6i6=hp^waFVQZC\\i/8
>+6F@G tD&/68eZZ=M@euJ*>eGSK%ij<X>8PH:>CQ>b#:4u@biGu>ep^CSMe6ZTM@$aVKc<Q5hBRb4BpVPM=eb*
:jhh+M V+C%juS4qKDeG955ImmCq:ekn*GKlcZCD$SCGqcdLpRRGVA1TnITLFl9LhCk6qN&1yd6uY$61uJcRtJ?
85SC8c EALmm$1lp@CH9!GWJJ/#CP4Y$MnC\6uSJ!l/@tH?=pYL<>LTM=8tH!6Pu>F==Fd@Q!&N=w/8Fly1cpKP
8X?5pa q4LJ*AWL1^hweyIdq!=N$ZHQcj*/>hbq$h6h>dNL<9L\jJY<*NI%Z::64/qjXFY*a5@ElZqbMcFBRTFi
Vk$/QE tDj1=aN:W>c*ZQ+N81R^iLQ*!ekN<wu%jj/^q@#H%#4Yu6*\dKm^:*yd=mRZ=aZlVAWGS%*FHXJhVe$6
++N^kD ITj/Z$K$=eWwIju#+6MJRkD+#@*EjlCwBNZC$w^KQl\p*^<HZJTjCF4anZe1hJ*Z+CV9:N!:VFp>GQ?*
!*^y6i #EFimnw1NpVp9QaNwTcuyink/wmc5S/59a&>X*BE+8aH^/yu=KepJWZFy%aqJuMLG&+88:I9*V@R$<hC
NNJXWn YeDSpw8iM&@?kyw<Ba8mya%LjDTnKk/M@@^*+p9@q9pqM\8^ZMZm!pW::p#&jS^5YhQ@AL?&MCe^NpAW
dGY^\i ^AkMuluyF^DR*L:4/Tmj#l?/8i*iIB?<1<IR@?IIu#@$=9#RmbQQuk+Q9YlNFHAytWaMuKuI$qNZMybp
+M$#cu !Gl^%P!tXa!@Z*n\+<Ra\S\jP$a<8E$R9$VN\qFCA5MJHEiXkRX4LjJnFFte@Ed*B$KSS1S?I6TR:S$h
jtm:+b iKh<?*w%bqqZ&<q$PeZb^NNeHc4pD<kADAyBuncKpNcZtyKiFT!tA^1V8Z65a!!*+M#q&qu=$ERnwpJD
wXR69S k$Mnw>di*ql$5Vwl$MQd\\#weHcdWXJYZnF@aaTtRXF>*Ww4w?T!K=Ma>tZ!!=K!YdNKb=ZPYX!>685q
<^^X#8 @qn\/6Di*<V9I>W%4WqSaZkkM!\&b8?m!9C\4V&:Lp#CRQ95&wkEj?nC?iEJQkQM:>CDnw6D*j\l<5ma
SZCIpc 9RpCL8yMF#EXyZRW4a\a$ky1$84l&a8J9wihF$Zp*lGB!^L9DwpP\iA:%QERJ5a9p#kKR#8PKpmR6\yL
8MdY&% VTI$1ld$MkYJd\kmC@uBd5E/mE:&1T\X%VXhuZehXTYcRA1b\J<e8DAY1mS&tCnMbmn/E/H#M4KuGc84
R=6TlL 1!pa/J5u#h^/5tN/&i*h1$y#EyMmIpTBMkHlP!5#Wp:5!@j%euFWt?R+ciWW#m!hM:i!\W4b51K8ac&t
/4nP5L XZLnK^!@j/J9TYZy4Fu#1m+>Q9n?<hhSA9<\?8+:@4#>\Jhn?WuCGEdcu9hN&dFh&@j6j!CETi*^*dd4
MJ6F<y XQ:\:ki@?jVlG$@=R%59QRbKB1iuAmX^5pKt9II8^%tS!hBTaSlFbT%5EGFAmBL^/w*\>JjuJc&%Z%=@
h$hmQe iDV9N@H!^E>mEyia9QtY\FF>CR54c^9>TWTKKkEk%TWR>Lj+/&FyGYDG4q*WIhh?$yqnAcJ^RqqB<SuS
YC%pGq t$mhSFk$m1R^wwSR&HSJHZDklN^9tF5ycbp=$!KAGWWDM<9kw=5H>t^a*Q@pTp>YWpS+kC@8!jd!Db1j
P!DkRI ElSTWqQ9:8#wcGet+GkwY8WX#T!hQc>161c1j%%6ZbGtb</PWeHI:1aqm@A1XpXn#$9lPCH<@aH+LMII
!W*11A Y9?n*?iZy@L\JFae4:B1+NcqLZ%:>?</BQTMZL/>/^F6<PZi=8cLR&N<td8Q?Q#:q//V/ZN*Z:KRT$&j
Pq+icj \mL9E&N\6DT<bbnTGp\Ll^D9I<CEMnH/hh9Ti*Y9u&!hHCybXd/ViH$cSEXE*mu%/hZdj%E>TbInP^at
6Y/y/d >8CT$uTEn5mNIGlG6/mD*ZXDX#Y88*Q:cR&Y:E6l>bRJ<H&KDGYaEPt!RCn<py6AbJk\XWtm/Xqb&hpY
-AAR51 0008e3d642a001202b3 Page 109 of binaries1.zip
SD8jbm /8wKBmcic:ctH*%&:j4hdTP65?QCA/ElMD$>QMVHt4yPhZHAHFFuVX\b+\R1?^eWFpQ?XGW4GSVY%m/J
t+ppSw $\4I/j\l8Lbqdh*CBR5dq9W>^miiVI\h8u+Q@#H!BS5hjV%$9wA<tKH/>AH?=>H9S*d6*>QdhqQEq^m+
1yPn=Q \L?+qH:1$1GZ6W@Jd?\pRZCHl5t9TQ/6TBYC#FwItQK/cm4t$p!tnyTH!@V$8#m==\W=>G:%&d8HV^M9
:+#uH? mVYQj*:e*j@\=9AwkiH$!e<juq#c%9<b%cBbY6ua&Ju?uXQwXCpa^GRR>DqCZhZd%+q*5Q6/NGVuhZj5
9juAAS 1%TklSK@K/!FCE%CByGXS8VJw?wpTX5mJVtP$CkI&d5!<T^1bw!G64KBeW^tjMmPnShP4Y>+5uNZdCA+
h8yu!Y Yt<u#FHklDydaJcTC9IK=GGtuEAFdtFJThteidYJim=X6dY4*E%Tbl@Hj=$?h*#q$6W4>u+S+h>P9H#a
6R!uVy 68YCcPL5nWpC8>6eW#^6Yt=P^b/ja<Jd\%@&:h*Y94quEL#Y$!iQ?Dh8$k?ei#LTji91$Ce?>WXGQMqQ
c+JLh< 8lLWGE6QTXPN\YR4!Zqq=Ta?\pe@a:nC&JE>S/+S%:+AYaiPE4>8#N@?jBKuVX/+hPnn4#iwHA*T^>dP
wCT@dl RiE*nAP$EWSN#6E<5/8nw@%A5VJua&jHqWAPppe<#nPZIM@:qKDBJI6Kk&nLMMm6CEu!J6dMDH66JRNV
?wpT*q Y^jukFZVK1cZ4u>!yTI+$MjL*WZwTHN!5LY%MVeZYXDMVNR\lYBFDpjL*CBp%8!=</whhL\Z%6W8%hPQ
lhdtD+ ZHBN<AX@9H>h$/a>Z@DdB:w*LXt!:5HXd:%dZ*&:%:?@wc1$aH4b8yGJ\$e&N4*e9:%#!+aNq$Tk^j!B
dkiia% j&mDI@!l%9*QQ9Ky\\?8%Rm+E9F&=u4RqC#pNBW<FJlRW61SIbu%^JpZZ/D>VD:eT=Au/PQE%Ze*CPLG
YW^l^j D\Id^<t?SBhiQpP<?!F/mZ\ZM&L9aQ5L?5+kwy#h$>HShn=aXdi#5@Y$mayWHVFaLE<ljVlHkV#B@liC
uwnVp4 b^LyqI^pdTkhC*6HS>@I^NT!Hj#PqLBAV\?SI?FA5Ve*H:XAVIRKkewen1y1=P\=<!wd#DT>c?91T@W>
J@jpA: $yj\MiLH/da6HShF#<>8c%>b6:l!\dL>Dc58@uQ#*h9Y:4$L1m1dj%^eZ#W#8&JZ#>aNVS8&VwA^pSnp
yET+LW >@WQ@<6H4+DGEn^PtltWBwPn4V/F^bBTXbMQV5!w/Z5ATpEXLQlICHEXAlQk?QA9@PhD+95RiT9h+*ET
NE$jV5 ?RV!p$:iHAi#y6IaLK:EM\R%*wq%5E?\FCP:P*6P/M4IZmH/I!YkB#MqKd<RTTYwH&u!cE>yCSFCJR>R
9^REu$ ^>MRS^X!VLS#<k1K+LW?Qn!LF?4n:iDw/PS5?h$CMSAwEB^CXe?tHL4\wpJFucV/ltWbt6/<:bQE^MDX
<pTwh\ I@9:BSN9nne*X5@Hb&8XLt4a6PiD/Mi^J%?QNDc$@9l+eqEBL/c9dXNV$+cN$INy@PHL//<Pn:#uW+bP
^1DNS1 yE=\Kd\kG5bWWXQXe=BtMHZa*5EBwStE<Be5e6Py1<J^ZE1EQ&8=?QZ66biktwiiRqHkmIlPyn&5F9qc
8%WH&1 MQwERhX*a^$1jZ5%bC1:P*4ZK>LX4lM4\^A&PA+bKuWMpbXkWcYqGI4RjcVwmAdMtpRGupdleYM=B9yt
Lb5Zn1 =AbdWNKm4a>86B>M<ZF&hLInW%=wK4SAVCeXAlXl$c*tAQT1=ZHKi5YNDY6mNIML84+Vw+J@H##:QTpT
/<5t@p dF?=eM/MkttFybZdLk6H5e<jJ5<j84q*/PYQ@uty\b&d%#h6&LC^e=JQH@4u+dcVX<<Pj?TnR#jHAH1p
nCNRTN JMbWa?ty&t6LM/R%PNHPTZFHu%#t@=+a&66*E%\+4nD/je&q6thQ6lPmwdF@:^:=lPMaTyWm\bQZ?TwJ
cKMt!4 !G@DtPlVBQZdJ84k:JmqJL?<5@Q$jCYYD8ITa$uXbCtnFQX^<c91VDc1nK4I1mD1mKRGXEBGPk<Hcia1
^#ZK=? PJHV6JN:eHj@\@$u#nTumd@BSW#GDSAn#AJSuIVXN%ALBbeFF1#GRht55uHJinin?NmAw:?lHQHJ^&?I
Zq6VIn m&i1b8dl8X4=K%=>u#k#mk9G^u+KlCPhF*@NV#di8wG<tHuVyp6CQnJE9*!>?@:&w>j89ien&iQAkT6a
!l#$?V LnXbZYX9FRcD4T+ZtJTaX6/!9c^?=eTuyq<jIQWXlVeHLlF4=&\hQHXt%/q#kk@NlGAJmp1Vbi:w/P#m
#Jakn= RBGShy9?GKF1qt#4^nw+%$LWhdb*6y$JIT<#pbEpQ/GD9^ZG^R@VEcX^euJD$pu+SKyCkyGllaY=#+bD
=Wm#Lh u+@9VG4$eZC!Mee6KFdG?1MGlD:F&MJ\Akyj^bhdQuji@IZXK\#WHFa8Y::MZN<&/>C*?!>G:%:j>^B:
V%YpH6 j/B$St=Pcmw*c?:^L<$*<YiHj:&?5t>n^cFjJ&K5^Jt@eXN#&#MM%9$B@e/B?^hiQSwi?5CuDJMXIMEL
QL<yKR %chLa$^Xn1/cQ+$l4cl5^t&=j*V!?iH9p<V*9yN9CAGtIQ#=l9nc?*N!+MuZn\J<>N/X&XuI8QVjNHB%
\Pb&6T W!EQbHtIeGTKY$D?Y+@yKE:6:P!/jL4TSqwFEi?tW^nRI=npVy<WnpmSy\ek/YqyZD\XTbFLeVW\N*jP
4nlMe^ &jP8e&qCmK8#w#qtkb44jVik/l61!\5WnJW+6m4G1iWAj@E5JhY\be6ZX/b841$i94V/jE9V6nMV4=jN
jEJC!S uVE6qa8ucCd9YVj*&h9P^R*4:^btFda<nW/P*WBt@/bN#e$ZAQ:n?>V?<jGSN*#K!/:pec=&Sy!BDM!j
^C/^d* DDX%dZeGk/t46@n6l$9j5Xjp$hLHd^GVtAI^<w5+?ldHSIIdBI=lVV!ZKPTNNIud$euF%e&BBH+jpXii
eKQL#N 61Pn5?e+S&qid&jH5/e#uTZI$!6lB1XLV@:bitiqy@FI8Mt!!VH/BlbP@p5j%KREi*p:R+=djVTkeGVq
cyDa^j lYTt1/9yPlXXL/=du5HYLqt>eqXX\+dFG*hX#q?&i5ML+u=Ld\p9KR/LXWqJt*=!1L$$I&N/QC>#iWbW
5%?@yB dBKJe?Mt9BuyFQGSi=RZk9e9?hRXejGAW!9TtE:CW:HYpYJI&RY*@j#^A\M$^QC?MZBBAp^TkBH<=\BR
A\nRYD C8acau>\eq\/<yalBpuiRP$8j^PSy!JK$#6:66Y^JXh*L=JHWFt1kN\V+@^G1DKIBEYIMCuT+46E8Kpy
k>qdhP !ep!!Wq&?ldPuq&H=+j=iVwCTM5QBlJ/YuycmymC4!JHSW*DN!w$8&:JGn<F>eX4T6YNAnMLC54L1=b6
jynFG6 jn+y?nR\M!p/Nmk\MDR!MZ*D8=jN9LDA5BB4Vh9RGh%@aSKdpY5aH*qI?Tq<?yI9<iDM6i$\WT9!wyJC
=Vb<nR nBqTLF&XRGXybh8MC>>A5nDc^P8X:ehiVw=n58Nul9<XAMnj1^Lm9SQ&IDeJS?p@S<8:i>mm%^CY>M!&
=?kT&1 @tA%*WJq6mRNJkKE<!<mcbiZC<8Hy^Iy4PTpWAML=?!YD/jCjS#Jp^d$*^tkltwmBWNqny1/y=8^n9/$
eeYN?R ^p+nJh55Xd8a/JVW*Fp#F>b%ZMiihC*Knw$NFAWySZEjd#!^ITw\!FqXVX&L%>eLiMTAcF8&D@L=n>/n
E*jyRF S&+M<!p98yIu8ZJJ1h!$SAPY54c!u+b:/jC#Z$JMW9Tq@6PEcB^nE@*jZ4?BZQ$uI=ZLZZJkH<Ju\+L>
y%XAch QTjjm*^ju*IDpXdLQtitTqND!BNX!c%PGQZI*:Kpk@N#5<t5VE%NVybQTp\!M?D68:n^iyY4uaYFydHl
/=QpAA G\PKQq5PX#AA&/ZtE&Gt4ew^!%1811=8D#N?Anhn&5#TFe@jn:?8LWmMmaSlN<nd^#5!N:1tP*KKIe/l
9WytN* /<@4/?u?m+#aI6u!aPnY*ZeW$RBML8n>LAFZuleh#8Q!$mJNFFS$p^8j<=<AElyPZQ^>/mE?l4GFp<T9
mAK16: 6+TkBYR6b<8l9Z8Ri$^ay#<L=iX6VS+Pip><DJTpckBhRpJXRL=51+*RQ5FwaqmRQ!$:P\MEly8Tpp\p
YaX\5: !mTHtumGyi#a/8>pa&Fl<54ATw<6K$5/dI/KdwCStm1H\#c#pnj*CjMQmI*K!C&1iVSBQPtiY=AWE^dw
ck^haE :?8Bi^Ii:Kt?94a1aMGCi46B=Db6\y1qN&@b$4J%D*@+N$:=et+EkN*NtPCmRTpaX#w#%6?6>hYRGJZp
h$H=?X :=5:%#/FWb&FE>e!p:t<1mPH>8@bnb^t\X1JAZq/ij5!!AeDJ^FE:lQCqp54!M@N!e:KVPj^WqNTptRV
1TJwP/ p%JT4c\>p!/p8n8dY^n@MBk#FBtkYnK+?G$cKphFS$@A+bk/Puy:?eXGe@QtNQSi^#=$LF1RGB5RKQLE
tTcc+Z 9YT<:XRXPB##hb&hdY&6Y$ZNDDL+q1&6>+hFGL4>PYVe<PuECYlJRm+qde<R#pijECKMJmT&DRq^5BWW
4dhB$t +9%5uE59*H9p+Q+>8*amjBc5lVl&d^>jZ&N!Qe:A5E%BGHSWBWX@IjK5+IK<ZQKTwQRM/Hde%PSE&cVp
44MWbq FG/A6hQW%uW8Fyat?tMGpwbGY6w/18N1lLcp41Glkc+!Jm5yy/CkyKkp+qm4&np=P4y+iWSGy^eh&hD@
PRIkW9 qTC8D:%9VQIn4<l\e:F*5NCEQ/w*y:Pn4Y%4!?dNIH/d<T%EC:FXw9Z\h?EaBbJ6tC<^jGM=N?p*q=J>
^kiC%e @TZGb=MLA5w?QLC<=ei#e&CjMDteiLElLyYd8@ZapaQpGi<:pEiIG?+8ST/LD+D#Pwp\&AnKIE<eRbVR
bmL9Eu MjlF>=^P4qBYSpacD$^5GwliEyHC+Kb^#i!6y^bbt^8QRj<!WFZ:4p=S$>dHDSAPJw9IV!yat=w:Pnk/
+=t:wH iH1GSKZ9=y@?nN?/>PJ=b%8W4/iHm=&>9bYGuIKmbqbZb%64!?bNt#b5\KF+TESE1$Sdq$D+lVJ<H/bd
Jn9yt9 !ij<%Xty1bNeTt4&QcEaFQ:!Q9F+JjH:=mZmnWmEKiCmj%jHy9K!%=++h9nA96$:h&#9R&+R:p!TP^IX
=bNnPk +FI=mWk\wWiBIml#wuKkcCDqABA*JV8L@LI@JWW/le6L#@A\N:c!GnekDAuND?4TGpaGBu11=NuGtAJF
5q4KVJ ukQh&kIc^hVkyILnH<d8@*!*hM/btXE?uy:&>w:tcw4!C6bXt#9cYq1cN&:e5G:>&4<LSLVmdbSB+9Fn
ji:lkJ YJ/:dVtJRm+%1j#SpJA9?^pVCh@iQ$\e/=@AB+Wk*pw+<YR^XE%J>?FnbN*5&6HZ&>iHZCE<JMmnEH\\
CkDXni Z?wWZ%jKVpTXyb>aYJAHIDLJV+8lC\Gc>DTRAGqApb/batmw4!<CGBL/8u11c8@WbXS%DR\MDVZpbYVp
:<pl$l =BZWlScYbk/PQ5GqC*e@u:^>@pl6Sq1$u/iV9c&Bmy!Cuuh>P?Vayw%NVi9Z4F1#i6YYLdkaB>bG&V*C
eI4\<6 @+jQiQ=mb%pCCHFT+<kpu@XhNQ4#+<9&j<dinw5IZERR!6?PXMTp=FZ6QHZ<&EH!KwH69d$>9d*IMWpT
l4Vw&5 BRpDu+L/TJ<l*$*=mcm4lbcY#CnI!!EqkE!8yMRE?H%GG5klQR*AbGWb1RuJ#nPmnyIQ6CY$RNE$Jm$W
X\AeqH #S%>k*9=u+u4/?yuyEWHBup+t/4lCk4&bd$>HY%dtne&4X8:i8ZK=e8ZLeNdeHH<%QcPB@#:jN4\!j^W
?=Wq&N d5@#CV:6P@d??cMYdFKpm6&wB!4LPm:$u#pB=P<F<u6/846:iyB?C8k>:p6M\cbTy9kcuTWjjyK:$>1T
nnanFL %yEFe?jMk8lBlDQI8mh9$I1hS1aY/D$>QTM#P&hcwLyAnc?PcpLwpyycB94G=pILG*QZ5A**N4@:64I\
-ABuYR 0006f49f585001202b3 Page 110 of binaries1.zip
HiaqNw J#dT*$FZVXp4cq+#ic>BS?8YVS9Yp+E9Zd1p5SF$c&64G?RR$W=$wCj=>@kTI@!nb$dG?Tdj5i@D?QQ6
e:=<:S AlF\QnG\dEb<ipQ*1aFL@YhQH^hZN@!\LnCuZekS^IeMZ*11*%R@9/qVy9mmb$DDlIkBZXdhL:8<jHdb
w85wkF 4Jp#CppRYitRVYIRMdqpekH@hDGI*D!Nl?1I=wRB1k@lt#lQZVT#i9Vwk4^EH$5#8!uF/*j9&Ab$6bP$
k&QLl! 4%?*b9ZK=W8YN6R%%PK6RuHkSCjC9<Mul5akcpmT!d$E@8QXpeY<#FpdDk+MZL+IMb<+ilmC*4Y#6@8@
<Jmn9H 1AtItbk1+WjinAeb+/6&F4Gk$MFkGkWX%hdXp*iHpjjhFaD!m58A9Pp1Nma/G81C9Maup=+qD4#A:aE/
/!jImR 1pEihGSwcwqd/L9+BMjXu/wQ>8FYdn6!>MVSk*8&>*c&ReJ9cF1#c5YKbW8YNPB%qJycCB$Zl+=&Zd:A
HM/i>h N@mGE<Vw>6dF$<9ZdB8+i8Qt#c8Z#=<>Ja=/4@lKwm:!a^pwXwmbIK<5>bMk1dc=lNlJc=1+lTVQuq%b
tk+yTA W:i+64ctyu4Sk5y=5$6tVM?dqpXYdjKj\KMmI<SqpJYXLbW#DTLQu=/5AdG4/RpNeEM=A$N#c^ijkLDw
+6uVI/ 8Y*dDl\?iPk\jpn%ADAG\Y@b6H/N?NDP?n4!y%e9YmTC&HGIuilC>6*k&\/QnD\jiV=+@jCSlhpSPWeP
J?>tk% HV>%?6#FkT9Zd>/+NuDl:CuRVSJDV*hHi%6:i$h:S\e!TQH#><eCCH?/*%VA+i%G8W$iR!t6=JP!aPXB
$PnHe$ :L4Y#jN4Gy8c%m!4YXSbPc><#8#Tp8Ib$@N#5nP+1RAHn/FHS+cHlaFI+hqw#nRyMb#C\n!6??1IG1:Q
6a#e:J MDR&MA&IL=!#jG5L65Y5><#q!?hQHRc45HN:Z%>*y@ktw>W4q!&y4%>e9Ynlw1wFXXZ6dY$RG6=B/?!C
6^V>aj >Pn88\@=yQL5/bPH>+@*4CntBb4w/8ywc%k*DF!>j8$!jqHy$8ZLF!?eP*Q!?FGw=y$An4RDGKRnMwIA
RJQ&9I M9LmQB1pq1?*B?e?R1e4^/#aj9DW%jH481e&%6dW%njW%%dQu#5dWBZt=?hBMeBCJeYV6\hG+GETwhPl
ZIh=Y= J?LVpF!y9Q\C\FXW:QFWHhiRIW?9XqaQKq8!11t%9S%9\%8yLb8*ZeMQEWjXwC4*:kBy&4wF6HZh/qZL
l%PTdm qnVWLX/<5Ky1QqcJ6JNjR8BhSDjSk%^:^ueij9H/*<G4S:wd$$N>ZG%M>HS%>jV$DjV%hHVm:y<?hjd<
*D<inW \LZ4%/+P@M*AA*9*At@hZi%6kqcpDjqKBJA8NVAwkL#t$NjL*iwy\1DRbVTN:X#h5\h8nX/Z8uG=6:q=
\A8qW& :dLcSjl<#e1=e$1Ly?iJP!KyaRt^MVFSEYFlITFBSRX+LmW9Q=<l^nmniGct85bLhWKDWCNWtA4!C9K1
RY#Hw# ?8cYhuG6ZbPAqYmqd?/=i?*<!WQ:5h*KP@w/&#a*4X&>mn^>qd!th?GC?SWX?F^pHm=GmujnQemlF*!X
*uH^HZ +ie9u6/>%N@bYBVlbKmq41X9at^pcGAAVpLQEH/nc=R*hP@GqR9>F!=h8Vy\+e#JI\j&kp^5:?96:mV^
wYR<9J Et&IEAuEk+lkIwkIyAiR%+C/P6PHEAyV&$LwVuZ#Zj#Q/HYdG%h*X</4Z:y<YZ*%@HtR4DPLm@KubcZ^
^VE!c\ @lRjYZ9mt!aDm\4!aWWLy8PFhBJ9Tat&+t6%BVXq<uI/bX%Ne\6DW%64C=jy=Je4pI!t:Y&6Zd9:ny\<
GaZYbJ jR1EbEh9b*94q8aNc%a6I!E9Y4B\jtXF^d^=e?iW#<E/MeA5/pF:H4#l?\\NQ#uc6Tk>LeXHqW1l$qu!
=iVpp& Ky1G=1cA*MnR$MnI&MVa$IS:>9AF1FBa=p9u#=JyjEDep:yJC:mX:MlW/A&61A\inIW\^Li1Rm1:Pmt?
?dt+6N SPSSPZ$HD@L!H@JylL6L<mXaew8d=>e64X%RWXt%CPTujDdkF&i%?FLK/KmI<Q>8&m\8uD+hK=R6tmGG
^CnA\H Q/9WSX=PYWQnK/\/XXXJuw&#FLS6@TMD#A$6VA*NaekI&R1CQhtl*\um$Z*t<P+hP*j6k+L4/&1F=X?#
VZNPR! c9pTKKRF<!9u#T8jm<&tqM&iLi4C8kW>qN::k=@+8mP9*q\=8LGmmB8juJ\R=TSJjwNGa<y^NE*N#W^N
G$6M8: VI!NeSNhW#MVI<iG8^jQuALS8ud><9p#J+<hJI??l\:Z*6c!yjp@/+m$w84!wTGlpL5pqkB@$C%ZS?P*
E>D*D% CA8X$9NITWtI>CN>9NChWuV9^8@46GPNqR5YXqZk5%ZLbyiS9aT<$JJHN5AaMl>C+GhkAjTbSbD:RIhp
PuWAYC <W!TEL\M+iJAMj8H81cc1lKd^aDM5I<8t#%4iyK4uyGqmcGFqbqNeq@*bBjYchDie*L:46&:h@V&hHh%
q%acqE h*c&Nt>e5+K<Hc=/WXZqZFI&!$yL5XpEFD+F*IcwB?8q>B+a?kdcJ9@\#y//k6nEqLVe+9L!p4\+a\SH
=YVj:8 cSRJcVqFDjKCBDQCFDen#E%NVYJ9u#^*@u#@8dNu+G>wyAhASiE@B$wD*DS9J9@cDPMd1mwKI$KJEPuk
c6nhtW RCCG9HIdja@IWnY>A5QCw8PV51jH8:l:mN\y*KN*S1@L*n^ZQ:?tG4SlhqqJWXElQq$:H+aAZ1yaA/Q?
mk&%hw ZFwL<8u9X%JeQKMa1CFKmFqE1RR5eJtCTF=CRX=VR$Pw418l15mYaVGbLJbbbGyGX6/M&a8ZyG8bYBkc
Fl491y YbldlK:y/S#9$8@5/8udjZD@#4/?*1/&Lb8d\d86ZdX!GTSPXTY\SBwW9ISKy8M+EIV&>RJZ#*:!PTP9
>Cc4*u @>qSp=8Sp54qbicTDYdt:P1/TKCJV1FK!T4yGJtNtY8c?uYhH:kE>QTjk!IC5aTi8Z%dd%j:%m&dN\9I
yi#K&5 *GqBLaZl4LDRWCAGckmIpjtETFGW:ELI5k4A@XtBaWFpJdq:8QuMB#Y^9DG\c@ZCmuuR^eE=FbFPHB\4
nNnNJy iJCWyLna/QC\$JBkMVuRPW6u#5SKpFtT5$yL!<yta*MRT+E<AS/ew/!l^yFnTpqL$?qTYq+<Ly/CJeu^
\w!V!t M1dwGb91G%8c&Gb6:\AdlHWVZZmucWj9ld*d6?*a*kQ!5upD>I+X!$Bl/1B=XJdQtXNcYqJTQHQGVFkG
aM!E1P Ra?wF?>DIIt/d+:^VahiDy*jXJ!WpMLq<4IKC9PukXGCcaGdbEnYGTp<!41GJ1btblnpp//ymiY$j!/i
Ll\96& QZ9l\6uVJ+<jP:RZb1p?TF\ayMqM&4SJCG\lY%B>aRR4HNkK<y>K*5%64@$FwXAN\9E+thnwmLAkECLj
<9%jK1 KXNAjDB*!w\HN$m/V5\9Y:m\EkKhXT#&tiVNp/C<CiA#\TYE@L*?iPwW*:Jb5@BT6K!WKCNt$?cWq+N1
p1n/FK SI*JW?RaNCFhnYHNt\dNKG>cBm<=IT+8$p*d%EnQ%M\$9l99tPk!:8n5*hY^b<>&<4pePKJ%WGnR^G6I
k6*>py p5lTA=MLc#YnCJ?BFPM>\q=BH/Y*=<\+Z?Lb4VZb!TK8Nt>/^Z^\M4PKe4NTE?Pmk:SJnqDwt?4cBmDJ
q5!>nI IqMG!LJl=MZnF!:&u<FQ!bQVJtp58pD+kJ@NY#bn#ektEdql%+I/K$bGSWXHSpbEkI!RX>!:8dqaW:+l
R^pkeL $kdBWiES$VE^eaq+Em$tdKw*MAXESda??H*h<NVc&pYX=SB4TjF$<XBBFl#RBA$b>DtEqDS@<MKEL&X&
/qQBh? YSp&G=uDlM=TZn=*ZpZq@CKqTZtWJT&kc>G5p<G=b$:LL!\8KT$y#E+Mh6A^$#e\M*K9/Gq4^/ESab%E
D$aAH+ 8<tl9h8/!c6+N<P+8ywWyb1FXhC9IKFtq</CBnqnStHlhFA?M1PIdYnjNnK^1N9/Dn\V<mXjnHVN=JIQ
SPe*D= =chDiaIp#5dKFYeZbTZ+1Ilbw>Lp%dV$DA!NSMb/$MVh//?eQ*Q1%PtVJ++iAyeQdR#?8$AbqQ1tVe*p
4:!q/8 #lu<wkCF1DMTnei\@@VnwCC!HN*euMmZ*SV<atQIj^wK?l+iubCeuS9nTnKHFn<c9T=^+&49+4u+QPQb
PmHNy8 yeZFbD%tm^M>KaF$%iGRaXCQAYIn/?9nA\BF=hV!8ZQu+bWT</81!6XE<lR&k#bJ%%FQ#IWTIY@I=KXu
nYHb^w =<$wY%mV11X94G6palnZ8:Y6w$ME^5Y\5/*nKI!GQX*p$NC$dyYa8pXXbP=AF!tBMy^SXIRZE6QS\1KJ
5aFlXI dWkj6w$k?h9?EPhLDw>eZ5%NFHA=PbZRiM1l=^Vp=SWWqbR9Yl^JumAA$pXZW6HR$Ve\\A\JA!%h9e\H
p\:wKS ^+/hlHI<C6JF:kn$hLY*m1j#DW$dSB8JVXk#BeRh>eJI%1Knwa?HBE#%<jL\>GD@S6l$VRj!cIVaPDKF
@K?FTl \wJB!!TCw$QFGbh=Dq\B:i4&/eYL154^YWw#aRnQ#eumpTwYH^MVVX+lEwRHWQ#>ywy<WSnd=&L#tGTm
/N$?qb XbF8jMFCM:IJMmdyit#V1VCEpSQLNJlu8CtJmWuyYXM$\dwbG\T8ch9cC6/YXDGV>w$4t*iRN?q6*dJ^
l/LI&E HbRunIk%%XZ#RiDLbyYR/Xa$jV1an\J<PqKIdeP*+>5wjh9/eMk:?6pl@9D6?4SWIXe!w*APYC8<T1PT
^ZSmK8 9HM&J#$%JTW>*i^Q4XJbCl^%LS%hQW^jW$>H%&@#:nPunl<=VN=k6=9pDl^nT@PtDS8cSP8bj^+nmQ9n
@jBWeE FnRIn=YLAbKmwdYFRd*/iu6//kkScbTqa8#1G^whG+jFe<AZ^<auJmapSIeEVQH%JS8C&=Rc/AitN$:M
i@%!HH K<nMKy+NR%$liX<1=BD+K6Jakd\Fm**+%Kt?<P>kQ1IKwlKbV<#H1/RZLIVSbqGR9D\Vy>PpXE*ew%J#
lpDQ*& 5WLhk9#e:K#MchPLmwwLe>MVa<Ih6a&%>a#MM#9B<MF+Bqtw$>HX5db^!ec&6ybNVi9Z4qwPw^?paFWF
iI$=ie YHpwZjITh%EBMb$C6q&$udb6?#d+G@IR:?PejQ=$K!?b!=5&w*^lDZquaF*N+pZ#K@B!a1:VuFtFtep^
\NFIP^ kb1Rl&RF!<k41&q1ci9w/P4wcGqP*hi:yY*QpcPHD8\uXc>ZuIepq+L%iBP^Ah>ENKNAbDTSwJGapBkj
K&$emB L=d&pEB@9!ui94aIVXdQ!mM+LCIcn>Mpca!LT$lMBCeBGltZ\p6LC9RAN6%<c?@@9t=$iq*hk6uViNpF
PC\1pj SVQEuXZeX^QIQ$8tJBR!Yec?8A@N&<9dG/auWSY^RGIlpFtNLbdKpbZZ<w4Nt#5Hu&$ATWZPd6A!e9Mk
S/It\L NZN!C$9L=<$M%hjS$#a$#6ncDJ+I^tSSl<*tnZ9/YyjZLF*d6GE6ib5khFcw=+4!&TCEpJiRptVd?VMa
$1H\SB FP:a5S*jRht?a#9W>Zbpt&Njd>??W^uVF#T8*hREc:F/=bL/t5YL1<WG4:S+b9G58bZ#b$&qpt@^WTTb
FRah:/ LLcmm41typlLXeP++QVSjS$6uV9&:N8:G>aH=yt6Y=5*d5CdJ6jnG\kkqLK=yRWaVeKVmWRm\VEicyJp
R!!9cb hKw9?jXqcHlphGRWbGSCW1J+A!EYplPcSW^+TEkML<aX56M^+i465i9Y6@44iGp#=5\yVPhqbPjt@5hw
uwn>At QGu:khFkWlyBGL&>jaBSL!><IdGIW4%wEX1>GK<tFqN4cle9^t8JPkta+idN\e9$IMZI/Tp:P!89wBCG
Vic\9= jlmn<tcH1^y1/Y1:4h?<CYnF&$Rhi8*4/^i9&>1/41/tj8uKFe8Z%6YTN/LCMEV8FbBVSwEkD!>Ay^eK
d$ey:: hpl6*:FnY^>p/ZbXGP#I9<Db6#c9Z:6t>e1X+HRY\\CBXZBkHC@I#mk5<^TVTRXVKc9AWXMZcYmw&XT%
-A<uhX 0006e151e23001202b3 Page 111 of binaries1.zip
G!D@pN 48@i8*>:Y&6H:*b!P/aVGk^p=@1tJ8F/6Etew=Idwh1*dEFnubK==M$?$B<T+plPIcu<AwKCRmNna?Qk
qK\1Kl H<WBn!py1cpymcRPS5etJQNT+wI>jZF*1t9CpS6nWP@ZD#dPL8CqFSRZbyQXqEb8+\Cn5hHm8aE5iD@I
JY=Yc# WS>9pSjlLXmM%Kk64wGp1Kt61/?44aQ@1aee1c+CR%R&C!8l#mmaqw%uKiWX#m\6LW!ba1G6y/uuZNME
Y\DcC+ /pSTmdZ46*ai&L^mai&1>Y5cF!%aZA5@Aq\N&ZDEndwI&uR?umidt=hLytnlnJ$:h5Lj&A:J:Z$kwN55
?*je*u ILqITu9IT*?d%=QZl!^j84T^44y1Hup>:i#!!4uFQA>=pqT1NM/WkMJZWeZW%FSXR5:6cF8*1RhEi&6L
yYiBMV c&eZPJ&6t$u=uF^QcXyQe4ySElTWuC%mKWACu1bJQlNNFJNKt8iR<Mmw8PTWFG=cTpJmek1imuMXW5m8
P^KRb< HB+YEbhitP\M$&uMmX6n%?T8Z>/cuq5^6#knJV$:J=8ZqCBKWlAQymCk=F\Pe#*b8*F9lD^d%/eP4/YT
KjFlQR ZKJ%6ZmhI$pyYL&/l91/lkdI%8y=ydPAGcAG!AE=#eyI!!!aX<9n/Gqw&6W&4h?\ehQtLVlR1>?!841^
/ntJ@* yYX>VXXN\:Iqm!54=qe6YEB&yDqqydQk*+ZJ4\DQ^@KIjFyBaXH^4y$:SD9^HSJmYtq>=Jbud\@i4h9S
BZp4j\ &61!jmX=uX%nQRT%iD+W@9Ve@PK1lqk^1R!M1T5ny<nl1Kmwe6TD%t*c94Nu$:4N:h%h4TS>aINA^ejZ
mVMPV& !c^jB/^8&EA&JbLVMD!L!JRmN@bVp^NnI+Yl#LD\1Nn+XB+9LVM:HW<mWnmy=P^Dd6wp^WWEV9Yd/8dt
BEGN@d /q6=>j4+Xjq4A^%F8h#WceW#eqKV+A?q^p>G$$k!R$pZRJ91/$NYQAd=TjF6dBA&5l1lG>SBcnW$\GTB
Zle5#4 %W5%N6SW%>R5tF&C#>RES%NaZE\&q9#M=LkIG\%6haP+XY9ZAbQNt<t>CKM6t#a%XqW&4qqdZ%Xb6dB/
h8M\m5 \d!!5nqq5<ERmSMWM4TkAJRaJ@jL^Cp/e^i?p>mF:BV6wEJt>6ElVeFT>ZVnZV1kk1&dXm=6JG?PIyX$
G^<44: IcSyTZ=cW1k/TcappKuDam5wKT6#qFYm>&>c5d!=5*64W>QGq1$6t>c8Y:eY@lyjK\9@C&!T4$R$d+c?
BGkykh md!V!euP#lE@ce\9TVG#tLVC4Rpdwi$*G<RTN/hcP96+C:^Eu1mdQY=H5dG!^t$Rc/HX8PZ@c?%QAJ1+
TJX6<i 8wb^jLK\4?/:+1:k%kw8wBZe>*$CRTE8BAXE4IkIFwqwLhJ1ZRwKKqyMpE^A1\Y5kAy6H^AdCA<6$PyD
M8iF^S /dP&FSSSIWI!M:>#:kVW>*8@:j@>tbA:#N^:>uQ88e5Mbk?dmTQ<Aqb>MHePP>jlk:u#jJM@PjbJe9L^
cHnnAF bK6QQ95$+9**Z*1bQWZV*?><4@N>1$un^w?hMM$<+@XMl^qiM&jP<MThBhMBI9<?>h/LcT=V^1:iHdW6
*HtV6\ JAS!9y$Spd5@NDQ&pJjp=H+bN&iY6#iM9YjD>&^?qtV&4Jp#VF=hulJ<6Mp<yuP5cb#NlPtRd<!eMaPh
XHEB&c ^e*pb%E#8&b$#uV^ip?S<5ZJW/jSyHGSp%4JljJKLpRW+*/b5lwkt?e>^+idc#@Qh#/a=@GWV#@>VQV=
VRHV+l %M8W$?B\:BB*lP*c9Yh9Zm:LTHT=X#%NqIb!GH:$$$<@Q@QF8jRLq!=S9l#a9!l<^\ZKaj/<GdN>=u:k
q?/nbD /:jk^Au8M@GJ$:EZ1F+46<LIP*#Zu4$^8dp/S1i:j1TV8p4bBZ=<>Qny%HSIX/m=%8HRk$K@tW:b#y9y
V*wq5k PY9&ZN@=m:nQyThQuI!nMmmZJj:!4eyhH$dH=8L@YhahjW%qWdadD^^K@n#6\5XLXAejKREDTnJSaqHj
5twP6T Ih^khlA*pB<kGVkI@\GM8S@dq?6n:5**5uF%eZb!eub^+X^FL5:+Smm#k=Y>uR&M4<&&uA%4#X1byTId
k&=YhE mbt!YV6q?5\=9k5Ze&j+W?L#FIZ9M8p*qB9CAt!4kaMGR>#nB4D>Vjli\V=<d/wZ@uhLt%/>i@jC6?Pd
Mwy89p AVn9KHY\5*h\MN6#AJ$F/CJdkP\W9Cbkc@mitQm<9P8=DGPmJDan^w#8HMXBNp1N:HJ:QeI$uB4GDiYG
t1E1m\ <eQ=aicluWQ+\j\kh4B=WD8\JHIYA*FS8\>?e94e^W#SNm9<^>C^:=8y><dH*9*lRju**=di9%6e>E%B
hupPM: \R$%hJR=&bnMZpk@V>c=QwhB!CejJ*%<Im*#!5unCX!+^?+>H=I%HX^d^=pJyWIad1@B:k/G/H:#=wI^
@CKYn: iZqPZ:=^DE8=>QcbNN*dh?GT5%?pup&jSXE<6XW<=XCbHmib9!549Zi*yPnP%%1G!e%q48GM\GZ<D*?R
DVHB:C @iEc&/jHQ#6:Wb&hi8ya>IjS?\>AD4wZF\QA=TH4m6!Jc*p\&ljYPFc9ZL+ER@t<D#dI^:KWdb<N1?ZK
Z$KJ+c QdEJih^%$W$jq4L1F*1#<X@@5Q4:d:<%@h1Ii?N@1VedlqZ4j*laYXqSWj/Z::@@:669CWH*9@@l4#<?
b#14eN jQD6:Z#&c?hdN&>AYy1u$$GI#4tS^&u:=&Su+>^F%yhZL8N!=4t$%C??8HBpKp9b>A9jFb><N8P!cJ9$
%#bq96 R+lRS<!WiHd?4>\Qt^<k@G>^I8&i=8DSa?i8*Tq@<H*b@Z5qPQ#K@@4tnh#ew61jH?Ti@Ym#dQZ<qaHl
@y5lWe B\/uCJI@tkVbh@4>E>nq:I4ABjPRdX8*lpDE\iuX>c6q$SMB<hJ^W&dMY:k5qW8nMnnKu^LQ9>PpS<=A
dKJEji 8><DW@hL6WpyJ#N#:%a?4AA&Wh>*94qh<QXZN?@XQZ1ah#bBEdB?/jy6$ajB6$mtCh*+5cVMd<@E+E\m
>?cGXH GWNBl^ZG:4IN*R:n*+A6<S/AqX/+LnkmBmXMMT\q/j@=Q=1=BqF>HjiV@+?%6Z?6?Y6F\h&@@QnL4@@/
Yumu*i %#<F1j@6<cNH9@^e*@Dd<&eN6!<i?*DZ4n%HLlX<@=j!mkye1\NCT?@1/&=nnuENSlb1qLJGh/Q\#1$<
jQbK%e pQ/%4\yt5JV%>5&:En+:q!pcJ+*iF:N@B&l&+KZZ/YKdh68lNqKuahPY:EnS*d%d>M*6\u\eWim$h?9?
L6LYIX <ytj5:mL/m*y?>/!dVGH\b+QJ^=KmN?9YW&>6Hc!/#68%my=\Qw%K=eG:JB!qMQM$SQj>%t\LA*mi\^H
R<J5tX YXN8X%>uTG^NhmdAaPZ5=4p//5!N54L:JiA#ljqj*:y^9i#ue5Skw91IyAP<%pWpJJ@<DQ@SHa!etNZW
:/Eu\S c*Bnb^9:@lM@wIuY%t?LqACYD?a8<>?^L@F/*9WdmeBYeB%@YYJu*&+@^G:knMCnN^:YN@/K<94==+d/
quWak< ?y>?@Q8#9=/cL/C\H49y?Fj*T:<68\@&BI=dC%#aPVtQtl>/P9i4HI$//&c1GMli9E/^>?nbT>V9$ll\
Q^TJYQ uhtkwKY%HYiiW4&hy&@>>P5m\i:!6Lh?@w=&iEp=m@y/B$WhTkK=HI!L8V4@GYWuHdRkaQ*Kya5TQaDc
n^GZyq \Y:ny5/i9\^V5upeJcZY%^uQAm!ZYYFud6<VnPut>eLHFqn>jZjEju\eBcD/KIjAG4y<&&db?4ZHJkFq
Gml%HY \&a6YL<>PlEe<<bCkGYZ@wRH1&$D%wcGZH@\<><i@jILMF**+/M&9e\i\IuH:d=ijJe\Y%#$%+WA#tyK
Giq\?i +qi+uu6*CwAd6W!&</PVGbTiQ!CPm@eCmLcln%/ed1ce?/>P8H::/%9IbqFnk9M#!1H@wyD>wQt+&Pk9
NaA=Jd =:hRNyJJ59ZL@D=bCR\PG#=t$p!@=StRHupDCQ9hj*6=BpAMqH*<hjH6R8A8:%+VAVF\=i=D!Nmlk>pE
M<I9I+ ^LR6t#i5PApk4Eh+#X8y?FAFjH*%AaAaiQ$yq<=S#!lun@V9/l+LQQ*&LBGBVQn+t?J:JYBBh\\LAanX
46VPVR Ypcdhju:%enN\nXdaqLT1TLyS*EHQ=yB8Quq?cpuqIQL$1TdaNG=VJqlcVNqL*%9$+ej^eZGjHl=@lQK
^/Miae c8TGXd+jA^H<eL9S:q=?!!>Bn!*\<cn6NDS&ZZi<AQ@V/@Z9c:C^%R^qHC+X^Gt\<bnN@m5?R!G+ie%h
!G*HGZ 9utQ/18</>juR8QBiW>b+PAy=VD$<?<djt=w1Q9^Z*@D=4cKG*iR?G<MC/H=uP#5#P<I:R6Yd64#!VqK
M/D6lY J$*</KMEwwtR?tij@$ub>h=+F6hK:>dM?wP!HS?+=\AM8DL>@1Tpp#e5PLKCmB@Iu4@1!$5ZBdJ*@h^/
mpBWdy C64%DWw9BNGZ%YK:TTEHRP1^X:Hh?$G4W%aRmu&Yd@:\CDmlliJt>n^H6XB&w:Mi@q^j@?M@j5YYK/=@
w4/SSb A<Vi4q+ILit<K>?8RtLuL\8IQH1P!yIt1R+hI5S84*6/<k@K^tP*>wd8=w>L@$QbVFNE^?#hjSE^Tla5
+IyN*4 QdL<DcXZkXSCcWVD5<?l$dV>iX@jKKnDSq+:D$J\!eJG$lWdWyaVM8e5&@#l^@p*4?eltaN!t<%AbnNq
hi!@SA +%@<a@%Q9@\Ht\Zqj*QuhtHXAtlt>ZGPRKQjW9?II&uWSj/wYJXInGHdV<%Aw:Zn?nM*6LW^@\ddtd6%
8=yVQl *+iSF*#@wCRnX^^hllT/njGa5YC6Su*qE1E\9Q+yWGn69Pu<%*q%yMtmmI@ma1=kp#G!V\q>M?a8D+4?
L&Vtk/ JQ@4G\J>8mite$mj>aA4D?6@cn$AnY\T99/t5KB1AVTct@PhIMGq5wkn=/k$/dFQnmcmBG&&%Q==+ujK
H5m#6T !9Mn=p=^4*>S%u$*:I&KTEhEN9PQYYmdQHQS?t9bX\Zch9:WnA&<n%/@Y+INBkjF^$bupka4VtAD6=pj
5Q^mb: 4FV5@#T@+KbAGjNuF%AGXlj^*a?@XdlCp>Y=EId%TJj>1jKXAq*?EWjQW#>Lp%PPJ/HWdIJ4j9@WTEqB
@l>ci+ wLMGhFBT6=&cG9pLmyeaKV94\VQYl$Z6Cn5*D!w+>Bw/\ctDEp<@LlA:h9L5^i5lJj1TEL8n>5@QwJL6
#TXIHB 8QuiA\HK/A?bH:8l&I@$*jRlDHw9?WIF=\En*SGK>!uC\Y#jXX9nV8aZ=F<ZPQmnM+&n8mly@&Z$5tEA
dR&5@X b@:6&8bNL@GhRXc9KZ9JPD4=&6iFBjpQF\CwmjQui:5A1KkjBM/Y?Wh?uE=%TFM?QjEJ+Y^#>d>VnJSX
yREn:G u=%*9%F:R+P?e8&>Z8&W6cnQ#E$:Nk+%W+:m*qNY:>kd9Te!ape1<Gk%DmJM^GAnJb:+/XJpe6T+Kh=L
h8kac/ /b\eSpPaXQ+XSYW%+MP!py\=ALD@6l8qCFA!iN:&TH<EcDX\yu^Q@MEDMhFSF^Dk=LZ!5A?HAMAyb^Hk
6u5pG@ TG?@NTEjuew9KL^F?NZ?@y4\c?XX@M?tl$5ByD9#e=W4kP!%QQFK=4:SAHLAaqZPuiI:lju=Z!QdXn9#
jE64+E tF8ZS\LIkG4C>+Lq@yHHMmmi@$#<?RtBd@&@nl9B\CLL!4=Lp:!tJE=4<k?%W+Mpp!PQjuL55$<<KMy8
Mmc+NV #KJ6H<bE\*B:X*nwF$my?/y%K/LpANd61MD/?Kq#X9n46LwebN$8^QAjaN%/aM#**%ipI$\Z?S&EcVN#
%n/:RL @/euV*=^alJFPW>cG^GjeQAAD8S*b!DM>\I&$Re&A<!^u/G&S@w5YBh/KDW@@*aB+V:u>>iy!L&%=#i@
e#TS\L @jb:9lTkD59/?%GA/yb<:!@jq%eX#/V5y8//ZIDbSAF$!4e1=\QWHduZ4yd6AcnLKm$CCNl>:IJILD%%
dleq/y <6VuM%EAkV@<I^pFEH/*yQRdi*!*5?@NFS*WaMtp@TjPuQ9<5#QHq!*jejAILyEjmI&P&Bq!>kPAP&Hb
-AS>Ih 0000e6e091a001202b3 Page 112 of binaries1.zip
#6CH/c 1pZ^B\F8@+NEA1MuVJ8:Wy/u!>Q=wAT&X^PyD6ldi9<9SRnWdpWBA4Yihil5?mZI+E?8&dnucM4^a&TY
=c6<Ri CY\1HWW\hcQ@&1TQAPnkJCKCPR9Z:#^<@udB:WJBBQ<^jmGIwQDZ^u@<kGD:b#^cCYCHu4n*q<11B^YG
^!m?4P P\e8*BE!=H6*m\68*Z1AMqDt1K><D?TI=\4BeMF!iXV!Sa1Zunq%/5\5qEFA=Y?jRMY?ph<@?Q&epbJa
WWM5IV #epj$$H%G1D<:PV>4#+>uu#<?MhAKiR$*EG4QRHB&$?nCCc8&*VkRRCAhaptVn=t\u5j4A1EFD!QmGC4
@<E&bR H8X1NVCtR9<u\4Sb@A*AHP\YhicLd&?hk5Hq!W<@\>Vt!PHD16m6P*ihR=nVNwiw>Am#:$hEAl<5&ll^
+iLP!J >MKh\5LdtApM89d9nm<EF:n#4>?=C\B%aEd>cIC/<=99!^>X*4=hiPe8=18*du:%%a$d&8#4N+pAhu^%
E1^>d= 9jSJIEChX+wCGL%\lV#1iCd%XAyJ?lhEALKKytNI:JHT@I@:AXn4SVhenBDkb^=JV9@W#y1#+Y\:dc!5
CKtL1w y@y9?*\8%QM/qZFyl^RAPpin>wiQujm?:>1k4/:uZy?D4G>=?HeW==Dn*^aRcHb4d!E$&\Wyu%<?aY9h
XmAKYm be9d<Ql4Lb&^NTIX?jbP#d^MAQd:CAG/#X5mm@#p<y%9C4+ljGj@1%*ki*4SV><hS=Cn4%a/AekSGYZj
^qBM$= @9Ym4i$4i&5:t<kdZ=WVh4?:>>XPCKdmFh?m#a>i6DJ\V<wXTm>NP@@FF:PSZjw9nS<DELGnk%W:JdHh
CGQ85C uG$H#X\&yB\>q@mepw=c8@ZEZLRCb!hyP!X&*d8E<Pk?*Y?6+6c6/\KQ\R>Ra6$kuEJ#EET@+NPjZVwM
dWHL5A ICaGlu@^\S5Rk?ISlB9$\qEyZ^aXYdTy?ii45<mXSP4pmEBtFlVbAJBqZ*%jYuMYkCl#CV<TG^hHjI>A
9h\L*C <Q$XFt+?BG/8ThM8yBF84Dh?@:in9%PT99HyX6B</LdnS%IV&!k4$iDXY#/dC>&biPC?^enBPA@Q?S8&
ZDeR/8 *5!@pWe+CK4+>YNwN8#ISY\&b6iyqI8H5hqwihkbdCab@SE&e=8@ZQ:lCe$*^deLLFT@QI5hy&S#?R*R
VMy^l@ tFX\+ZeYeuW*@nIj&6ph9C5R8t4V*p?9WI#$*IWMkhD%*#$/<keqFd%@@lT&HB@/!iE9DmHKWi8CW?bA
\GA8n$ W+hS$a8R$9GV9Bb5*Hc4IF?khHQ=*+=CP?ue#LQadt4W!iRMFdd#&L#nNLb#tZcRpLy\=cb>y*L8qBRJ
4M:J^! yK4@<iIMbl@T@tj?!pm\P:n>:j%1yDW!>@4*j6B\bt4Se1S%<c4Ni$>pWhiq=!>iVmP$4m9:PRq\8wTw
6nRy^b V%yD!!plS^JQj+R+S/#duP\D8bYw9*9WRmS&\8Rbm?mRt\ZjCMRGj9<ati\j1V&DDd%&y^^LJ?1a5Eu=
CP5HyT ?S^wKB+%M^c=HLqwXhD?5:t*m?<L%F:>i=6A:b4Cu&=kW?W*yji1#$BVedR8:#6MA&%m#u<n$L6/<:+V
?bMKwH c81t>EJ/%kZ$aP5%>?6Xj%JYpkXuL/e:a8?<?cQEW+Vk$S9q^=Bkq+pVh^GCJ$/b8hk@NQ>t$hiEaQt*
IK?=k! 9!SBT>9X/iyL&HJm/JFn=+lcykS9Q+EWD=k^a^?liQEc^aG$G*h8*:>DAuLYd&&uMWt&e5?54CpFj:Sc
PnuR6a <9Zh8%XI5uYmLyiR9QH<&WJC<yLXRj6Pc1l9yFjPbYpI!c99@1S/RqqdiThjT4<$Aq4d4>1XeCIcYp9e
AdXTEt A\I?>wdp#GueqLESC=Bw>/t#q<4D94q?=\+TdS6R%uAa&6w6?n#4!qW*cP6A^^#>an?$6jLc89W#H&nd
WuI/uG h:4*i>HI<Mkqc:eiQQ@%9j#:>=H5kX<&QV?Nw^F4>*Qqi9*D5hC/h<a*h*<+Ac%hV?l$bZ/R5Iyk*H//
iPSc<e RKB<VZDM1Y!1Yy1Vhq/HHd#%!yIjE!Hy:49&5+9u$/=<$EHbVh1<N?uAAm@QkQWhIM4ykdKn*nAip@ch
BFcMPw MMX>hJmFAi>qkiH*4>?1SG*d!p44D:hR61LB<4Njbq:M>kWa$$Lnn!e5<b/>iRQAeJ!*ZbHmA#B5luq/
>d=4Rc #=m&q#C!hQ*&lA8F*?jj1jEqnQ#ciw1nYmqd??ZbFj1HD&6ZAbRN?Zi?#ht=dX9<JwA!@n\M<*\B!8CR
C?@Fah e&quVlW5R*/Y4qZ5Q=Wn5yLt1:<k!dD%m1K@HnJTIyHEdM9d&jh^Z=iRAa^>pdpL+IttB??PQ*1!/K@A
q\$R6/ yyZL\5CNTh+h8JdNml!pNp+D^p/i:D=l%E:Cw5e$GESF%N\@F#ehYcV9@cSC1FLPn4h%6Hee?J:<+<6b
$G1MSH tSe#%FEIh>dP&KVQWp6@uAh\?/@bHuVeG^@lNaph4P#:8L$*i@aM#/q:EP#I=S6CXJqF>Z>J&#aN8d:T
LGM+Pm ?P^#DJ5mmb*b$hFq1M?PT>>X/S>YQ9kyGeF8!!<14c^y?a<jkF&i4hPYRmbNYbq5HX^G#h>=MmQ%#PqV
epWPXH ?Sa^dNq@Ym91LT*>!:jj+&TE%dJ9DAqG11@n$4T$5/hQy^\<ind#<wZ#ccqu#y+d$pHbmN!Yl%^/eM1>
KCMa5e k:IYD%<d5F+%?#ZXS#Sk+ySJHlMuVHCjMuZKJQiJ+>^C=/M5J4$@b&ZRL9ucqjMuw!\&qNTClQ8/446\
FdW9?D +j!=6FNJu/bj^c&aF</uZ!TkS/@dqXX=GpFLJkb8*b\M58k>*G9&#Bti$#%uiM@^tVZD/@*J8+p+X6I:
e/MZ^X p4+5un=&8M5+FMjq^1hEHH$uZ<Rb895qh@=mMFTnQB+<@N+Nae>N!Z*+e>yEkG**EeQp*AiB>A++jiK#
<i1TyF V#>N?i#MlR9u9nl:=9VJ4\Yb4N5Ti%a45yE?1KkwS=qaL!&5kw!54$6Ady+&J^8*Qq@EchW#y#?@EQkK
JFtApc kyun+F+mTMH6QQ*y6ahtI>W#=@4Mt8uq?V/Ia?KE<YPGl@mlQCc@Q*hqWAVP#lN=4C?1RXH*&Zd#%9W<
GW>##M HeNeW*>=GdiNuE9>MknBPk$laJ*>6mwCn/E\^m%a8ylM!<:^^9j=V@QalYIi8ey@==E9m^&huJ!JMDIj
Qwh<R6 Q#%JlQH?nb<d/u@//eejc/4%Q@^RYjtkw4^&:!9w%Q1NhH%FYe?/^Gm9*aPe5@i&4M^LF!>iTCi4ltjP
w8HtVT uLIIa6t/LRjP/1l&/RNwm<=t6dnkl*kn%e<bSnmc1:m#N\QdkB^PuE\dC?Nc<anX59Y4E%AER#&>b<*\
p6pC9N jQ?>1bQBMMcQHV%5t/<kknp4NpjMuV6u#mRW\dw:%TDbj4$XiZqM#nZNXb\HJlI+?<WFBCl^q&<JCnmK
%W\yHY AMj++u#+B*N>!IV+i%QhI@\\pX$6&=q$=R:4VFq+d!c<>*6Q>&Q6Z&9ACKy?/J/WjqA?GTD&Py!n9bb>
P\=E18 F@Y@Bcieee+=>a5#b*B/@ta*&:Fj/KlP1d//8w1\9Tn@IdDh*&qDhnbTmBQ/8Du<<=MuW4:aK@$QbhQd
Tq1Cpt #*@n8qWj#WJjGQK?\De+\wV^+<cMG4KXMD:yQb@qkYF#=!@dkA=58@adNKu?9aN$?FCGt9B>Ij%e/lhu
Kp$IIT V&Z5S=CDX&$N*8S@BDpj@eECQ%>kHAW/@j%yW!cGE<=Z!Zae#8#l@NKn=lQIij@*GGT<8q4jM^9@q??1
!bBw#> $^Dpyt\GeN%FnT58YVk@C*cQV?DeZGylQi/LQBkXGLybZ*m4M5=IDZBcn%b@8YeyA&i%Q@qm8?kQ!6db
HL$aGK B%jWX<dQSPaHV=9yBd1bDNFkQG+LH/#wbu=baBn8\Z<jW<@XlZwaNk*w9bu5EMihkJe5/^Tju:\RmpD:
X*V&Ep LXEEd\/WHb+F6I/cP>>*H1l>FwKiNuZ!?J*I@5lXhKk1<#d4bGH@q#<J?\Qia=D:K1L&B\?E6am!clWC
L5ytbW ZjMqiG?&8pRRRL1\&kD<u#4%?eqQ9:IIaG9eF:pmK/=cyCj<#@?1@ICSG8m$>8yXC=Yw?BQ+HMjHH=@h
QYdTnY Iu%C&dq++!cN%e5PEApMt8I%Han$eAeBnB+%e9mAwHqEA6P<q<q*dk8Y!%H>N18II\*5FbmDi++9Y=S@
iu>=Ak >5!y##@@:NPM:SIAP&CSIulVaMBGFeykyI@9B*QA<teREW#^GB91m#JaTT6Xq\1:bZD^q#<@R^pMuJbV
5hemmd W\Mm$L<qkt@L!1wVJM&W9ZnDFY$PdnWwSnEEa!C#TPF#5PhQd*TLIV:%85myS\!?N::jd/RGPc:?<568
qGy?PX P#%>/5SuKeu+%EDT!b&DuqIP+5F?SBA4q?!jkbIaPIqaA9H?pY+nl9djNE@wIL&Z!5EW\pKJLT#QS\Md
+y@*%m =C49>m*e\$wEkh6uW*elbPtwqWRY59YHbkLSd4PJPYAWtDaFEI\PEaT^WZuwapG*MDJ?@wMIa^AI\%Cq
DmXden 6<mmw9#::*By/u:yD!iGA?S?wYwG%/C8Zm&CwW49IPmaIBykDATdPQqbTy=FHN9m#%$ZDbaCuE1Wl:Yj
$a6le/ :n8R^^DHqbjJDppTA$>c^KFKVEk?85nlPiZwMtWX^IW%1%e8Z^^DSDLAw!eikpTGDit4\AA?\tQ1:CWB
kb&<Pn wb9YLSGC+519HwDNDZH%X/6:+8EZ8M5GX:GPHj$<baqDG?Wp/n5:kP!jqG%et+BmGVH4k?:aCGJ*u#CT
>yuGY9 =F!nXt\MPZRlH#wH=@Ga4%/5?@%VqM8RchjiDw:jC$6G>?:h4d!#!RujmdQ\qA:DBT:Q*TG!!ikPqKhP
n!YiNq +8cW+%>lanlt?jy6B<@hELqLj*n+5HI?!tdXyY@*G1ulh55#M!*lwy9!I+h^9>XHu<VPH!n8wF!p9Te6
\L?E5& <@hHp%t%a6tmcC?WWD?Qch&BE\R$hGC@JEk&Hac/V=&%&F<=djKpcSNI+ylXHkMwuDbi9ZyFeM9WL\R$
u>hePR KeuHQp=THju<w$YDEIZ%\Bpd6t\NJk@MdFkVQ\Q:=qq#LIEWyVS^:KlpGP6a8/*a5D$l+&8Iy1MBkW8t
N9&lPF +V@HWW4Dy&m1$a<iEn@/C>mPIKTT+98X%?Rn^EdKXhS@$ejcZMc!p9uqN#B1:4$=I/$:5wKwQp5=jl>^
CGHHyV nCK!?p1$k@6B>DCYyWLt^6%KDXE1<VHZLayNK@be^L\INa&ihi^n<uDK\jkD?@ehTD!+a+*Q8IGP6ud&
nbn!^P 9ahNu4<8IIAt1<VLq!%iGLlt\pm\y8HDlk+bQA4Nc@\+mD^8\+ePGiC/JM5S^DeN^Tjd:4emaPetnqJT
Cd\:6J C\+Zy8@A4S/Aiu9R8kNjRp<8dFeq8HG6>EnT+eTEn%TjJEX8uD6?pJPhk@PAMVNYd61&XTH5T68\h9X&
a/jw>q i5wE+YGaWTMuw?XN^%+Q#Z9M<QX1^D6:^j46H/ZjhHb!ey#FW6b^*#&/jWmq+lPyR%#CuANHdpQGmq=b
@M:uq9 D8d**ZhqtLkJ/#l*:u@@#duwDb=8jX$HnJ$4Q*k^::wPalc/chcZX*SJ?JKiAb5*kXaQuajahSyn%\tp
ZdwhbA ?>m%In5R>F#At*D?ypmJD99\Jp66H!A:il&Z=jN9jRYyqyw<#p\!8JMYWS>GWiP&6:%:a?IP:65VEmVd
VD&!@d ELAbwp+A9nEWN+k8Y:J++hJFj4:#=yDa<#:^5jFnmKRHn%l*X<=TDw5FRc8PHXMqeqRINYnLy:iAy!Je
CDKa8P td:%FcQJ!lIpVhJNqHT!IPqDH<ZHJ!RqjZRkMuSL$LdRuV6DlQZ+ABtN8%$*4F8%e9qTZJLHuhbw9BD+
kwY?X^ 5I8h6Lp5kKX5bDA/TEm@=ek=WQNB#l:Z!u@=>:@?8Su@>X%n+>@1**THSNLRFh!*LADi?cdw*9jj*euQ
DtwcHD 9bc69bZ@>Xh=Py$&l%k!Q8Cbw!Z8j@ZLL/?AQZ>^6pjRu?j?A:m%Dq\BcC><Lhy8XRZRj*Bu1c$DF?*:
-AHKNy 0008554098b001202b3 Page 113 of binaries1.zip
WdRuTu !?PGu*/5^bV#+aN!*JdR9WB?E$YQIaW<E*aSR<MZyB5S:E&FWwnDjRqppnq5B*qiI+k<1E?i/F8=jQPZ
G#!Rkd N+FhF:6bMBBiI68&c@PKPa8HpY$Rk%h?XQp*#Hb4@\4e/m54LJlLAHXlQuteSEiTnc6jZwbWN$PI&bDG
qPNBT\ +G/\d8RHa9jHpK%R8CWnqL\yIGkV:8^Zct+BZmi:6e8lm<u+!6HJ\Z:5EJc!t9#^:Z<?c?GdS#@=<@jj
FkekaW @@Pjj@@#u@@+?>?deHH?d:k+V%cdIj&84eGM^KV9<$Pq$Q>aakkRh?ed:nbj$D@@//>9*9#1#h+I$MB%
Au?Kci \:iwY95NMNSSZe!u@tqXZjXh*pe^bpw1/nQLh^::AV?Zt<Q=5N:5dG1YiTa@k@M!i%LV#i>#:*HV8Ku<
w\AeIh FQNpdlLuke?M5BP+<h\+dm\*ll<6u84qcKbeqw!H5jlT&jcJH8@N?&AVSaHZmQy=+?a>>kN8Ln8H>iEA
P4/n>u MA?A&St<F?9JVijib>@ny=tueqP+!i^dkNq^+tpI$tun+lZ$#1RL6/TPk>?dF\^$Tpa9Y44E9KS45YqS
nkQ%%e %$L#k1:=ZZ/5d>e<$\hhe#9utH*Ia*?#:M&Wnj?!%jKIa%>?R<&%*8Y@#q@88!The9YaQN:n@duLA$KY
y^5*dV ie#e5N%9KY=Dt4b$<Ty==LE4Z/?iMu>:4G\N&adp8ZL=81DwE=ymc4=N<II=C>a6YdVkA6X4\yS^E!b:
+Styk! ?c*b6H*HkqpL@Xe5YkkZy!^b6G#>q9$uNRX^5lZ!*h9pK<qP1QhZLX96H=y\L8<?6eb8\/w=<%c5t46R
6Z*\eC du?b/mQ^<^k:\iM>u!Wdk$M&dbk#d>Z/ia6EkZCuu*VqwwXLX59DXYuMN%E:%t\M*iWj6NPSdM/!*4B!
%je8%N ?Ty/!>/W4N9jW\ihX/##ud6\=aI=e=e6un/$4%PFM?9$8@NAy>/D^5?eQtdeiI>y5?c9qt@b5eF@@6\q
dEt$uS /^jQ6b/@awuu$H=P>=*dZE!8d5=>lp=i6G#?w1Y4@bWHVu^=w&nH4wCNmq*dAnb6*iDnN1B*H/4Q!>:@
Wamk5P /QY<>^>>ZAc+ic=i6&#FYqwStZV?^4$HwyWDq1^bNNh9&iIQ=5%=#**e!KFDl\$h%L@jkIEDZ9X*/Ihd
%IyW8y Hj9*^V%/@W*>1Q=hjdp?XG>#L>dXwXj9Qu*:>S<\cQCRweQbEc\dQ=Ij^iEdF<d&HVh?k99p>&d/L6?\
KZTe#K iY9wT9@q<^c8ZnujbaH9hI<JAH:+5EH>?k$aNIkd/ABI+Bk$ePCAAaP+\iJB@j6#A/mBZH@L^nB&ED>+
*Qw\:L ?JDBk\HHECB4&Am*WTCMmbPtVH%98li?l&T&6#e*b!^=PeV<?iRj<1^eF^kcp=!8@dy+Y?R&@?D\uWGK
iGa6DD #c5Y#y5^dS4@u9%ph@hJW/H@tiVl\W&$lw=y*Nk^a:m^W8mhSmH6w<Tn<Y>?ZN@^E!h/VBJinPe%e:c*
YC!aKS <Q+J#p<MTM!L8MZeE18q?HVmTt/X+=1%/?qNIZ5Pj/H>=m>XI4<Bm%a5@5B*$jL=e?jNuny=In:9P&LI
46n#AM RPDANFk$cLB=ED?RH&\%bQCkARMHewP/B9IDVQ$=5pQNH1RJ>aaPG?+&pl9NAS*ePH+<Q+GjPMDhA+mb
>Dcj^L ?y/Z6>?!hjLkdTHLN1#!Y:B!:YIZ9\X#aJR:!t*pKLelA\eQGYacTk*yHEwN++cLRY#5EH+\NaRdcl:G
=FWJl@ D#iN+N#t+ZM<KD/Wu9ieijl$%@\FC^a8ZLS+meDP1nZ4N6D!dSG^^%K9=8WZdRujESkeF4q>!#d=/lWL
>:YE!n 9Gj^*pNuid:9PYQtnBtRR:+Q\\\W=mTQTbM\l=<\$i#Pi+kuVb:MVSp!:d*y$@E>Y#=#Q9Cd9=DAZ\:\
F8ac\y <Xt16ib%@Hy?A:?^4<\@RI::Zne46wZ8Q9B^11ck>EGXcMQA?W8Z?<=d5GVlQN?=ME!iCPa$jlTKbTVu
R\!SI& Jl4lbl:BDdecNtKE&$k*=K^4GDYWHeIPypCchmCDETNHIbi5B#?Jt<^Q+cj!$+c<>@::$+Z*j9uk9:H$
4bLA=\ *:^qY<nT>i5ZL%m&i4u4\pZ#b*6N>\CduVkGLG#$GG/$//k^?JwN?MXm:Lm^w<\n^YApcN<TjLKZG!eG
M!k:pw w4kJ9lM>QCc@N**t:Du#=m>e8tLXctRRN@B9yQ*^#VGdk+K*dN&8DI8MPbTT>1Z&b8EhSZnEqtBqbNn&
CeLYYX $P%!i6*!lj$lAC/aN&@Bw5Z+Twh=e?jP<b+>c>dMGYS41BjuPhb4=p#+#J4q:iM#b?+<9\WLF!>h6uI%
dtacc? GJ%@RCDILpmlAA#dVTFDqKH+CH5aihy=#+h:w@ejPQV^=^i%BjjKj/kYdS\!j@H!BjQ<Fm*!uVh@#w\b
e#m%S8 :$&iQGZKyAqn\J@Gn+QId^=4HtM%hl\PTM%n1NGtWYK\ZQMIc4l=tNQ\ETDSCSMuVTd9n?P<8Bu<VGwY
FXe>im N*8w6?ZNLKnl=c9Z!#aFdhpc5uR%eLXp%Yy8eh>=*4P><FYL$>\ukD8BudmDJdPVSP+i*KT?p/hPBcPB
Y$>WRF a/L:SQBL<Layp/i\W^hNi\?$Bc4!tVh@$dKXc#j+B\aFB!t&+N5W68P&?QCI!MmwQZ8n>?&QT#n<!eu#
c&wZe8 q/@q*m!+9YXubPnY$MmwuV5nRwKD=S9/dbD=!>cmPhQ4!XQS!<p#wP^C&$W+Q+bY#!$c9unJ5lW4X/=c
h=c:D+ 8*+DHSAa6GYdeph+JEwQwMjEHnnA^bun?a<GHpyWJS$=?9Euu^^Q?jVE!VQuL14#dyh?Z%qXI>w\FGle
dialLu =P8:eQFCZ:>=5&jQ\u*C$/eCT+Sh#q$$$d%#I8<8>bkI@5FNFE$ad^4Hn&FHh+%!HVN?w5iWci>:#mTc
Qc9t%! >bp:l=9Lj?CGVpqC&iIqT<mVIi6y5CLFqt*LX1>j6YVJ!6ZY!=e5ZVV9k:tklNuYu6Q\lZdR:+1t9&?i
^j>#Yl Lu4jp*9jdnwb*WHwt5c>b@e?id5Y9wYKt?ZmQh9uA><FT%i5&iC@TcHeGe=FeJGVh$h>?CF\i?DA\a<T
Z#u6EP pM?QQ#u?&buW>M8cuP5*<k6D\mLDR$J*:hph5Z6Z/I:RLRMX&=TlY+PCRSi+G#W\ANLQnS5k?%*L4cQY
CIu>ZF 5&6Ec>h#G+dTMu@=y1Bk^hd6wV5nh*?+L@dkS+hWl\<jPZw5?ZlK=/hDQ#6^<9QVb</T#jGZMm>@iXYh
<b:YVI 4d&SD!q>^R>X%cJX6k5YLq*m=#6@$TLPX#LH&*5YN<Nty6hW6FlILVwl6YAuW^=hpF^\E!BCn8QHt5da
!E#Al+ nS*9QypENl@IV8d^9yRjN=>jIAbBep5GaZSd6R1ECY/JV1ua8t4XluZLq/^a+:y1KiD!<=$LpY4iZC?I
ub6TC> Yil+\&dPAw?dPZ9Y#JpR:PB5?9V*Mb:N^Djw?jlAWnY*%\ik1AYLq/%C5>?&a>iiD#>pw/j8m>tQD>al
=uWQFd 8<D6J<pyJ#+@hTd%*MZML:P%81>8=8<Mn+wK*:H4\#%k\9mkZQ<h+d8mh8<MDR9jFSG?E<bc?Q1jwE&d
MdCM1j &EB8$?lAEl^Bnw16IcFk>%F:w9jHHW^M?9mV=PPjjudm%Pt#Z/S&yjHu?QMD$nM8bX:JWtjucLY/*L\d
6L<+BQ N:<8?Kd+*4jqqX!XcLZLwwYLqm:\BhjHJ%ut#QHtbwyu#=4PRtn5uMJP=mj^ECcy!b*8FCS4@Hl1ZNha
a?AA@d P?\qyp**t8W>q=9H?uc@CtZEwy=ADtF<*acN@9:!\M&dk^X4X/@j5G4b!qWnX!>j5t#^@Qq?EBZ<@PbA
T8:RGV &QKiVb/*uw&9MQCB$Pb6ut$%A!Q^LM=dDAENXhWQAklaQQVh6D^+1#I<Klwjlh*Q^jJ^p?IQJwA5p#+G
lNKV1h !\HjA%ttud?IuGy%%:?/GSEi6VeT*?m>b<@iD/Q&:PF*>>5VHd$ua6j8D#?EAWLaVu\Rel5p/b^mLMaQ
MNKM5> EPVYdTEaR*bFS8F:\D</hQnwJ!qkn1hPu$qNVW9Q/L#AZ?R9DWaMtl#AeiP44&:qF*=VhQhichu*FR@%
@^^kKH XV?IX9XcA9*bIn?@ljl<NA#%jGcBe+t>yp$^VtWl<iZBP1YVQCDTei+eYCkFLt?Q9n+XjB%/*T:II%Ce
DHj^W? qBCALB*9cu!TGD5NI6ANc>b9YL6!=i1?c%a6Y:b$<aKF<#HG#9iiDea*h!:uI=+:b\+:h\KEDY?j&TDi
tAT/QX GhC#kRHQuRNbC9Vy<^e8kq=mBWVpRMZ&ud5?nGGJMQu+TWTc?FKWV<CC\DT@TE8@eQE!GA+D9EbFSpX@
!umJec GLp:Pmbt::=>H?/Nej%\#>/a&Q%:wnBA+AP^pX!+W^k?@1HE9tdH#6AhZQmkmN*+=BEaJpB?Y=nu$>pL
Jpj*#p :EZ&$6BMjC6A6ydJ#j91%6j=BTDN+49+EyDKl#Dm^KEbFZww>BCFQ<?yA%R9Mi>I<S#<6hV!&*$Hj:+W
L8DyE5 9cD/#=1@dNYd/$9&H6?#<<c&eEyE&jjWQc</<E+:/l%+?Ey5Y?46u&Wh:%GEFy:<WCL<%85yMbdy/bRE
TYNC<> !>BRTw4q>PtWFcqFWhbaC<=55IV/6qlCjV55wd+>qqDjkWCnKEiEB9Yh5IR4#qlCjSe5wd+4qqC@F<FK
4cJFKA Wd$SK>V9k!ZW:+5q*PtHJhV9n!ZWH$Cww/mBTB*WH+Rq%B?MJhRjkmZWGIwq%B>G8KCw+V#ltS1BJhS*
\c/MW\ \^L1n<RT/w@CEt1PJ6^T%BnpF5:Haku%^&EJ>ehnCjWuaAu%J^KyWJR:TkZPQQVpl=1E*%B@MybRj\1Y
C=:jw+ WH<18W6S$@A8%H<QT:n!QybRj#1YWN<VT/n9ScBR%A!EA9Xuaku%b&EJh&bnCjY>5aV/QkRdSe%BdFB@
%c$F<j LybR@\M5wj+<LKGGL=bR*+>RSXH#pT1w9\BL?F&IJhSjlCZWZ+\q%F^C1Aj:R81l@nI5+hy!LKH?Cm!l
NYLuki @pw5wj+1\mXF4Wa8+Y\NqqB@LbbRj^&YWH<>qqB@A=EGSY%EcWB>Gp8+Ip5uQ=R@jpQ>AC!l9y^eyclA
CXVAyG 9A4%N&EJ>VhnCZiC5IV/\XlCjRXyVXFd5DZW*+wq%N?GJhVjnmZWCMET/m5JFlABawH/P:CE?n8^lN<\
nZ\H>V LKF?PJbRM+JRR%G:pB1wH+pq%N?NJh!L\lL1:<ET/u>I1Kcw9Wk%uEXnCjZ*aRu%a:CE?98^lQ1^lD8K
5nDqNW PwDeRj$+LPFKQJbR@!CYWQ<nLKF?AyECSS%CKWD>SC!l9kyL8HM+qQ^RTjkN>a?R9!n1KQ+F>V@GE8wj
JI\94Y \^L1j+Iq%EnGE8wjJ/$wKkXdRj%Q5aV/u&EJ>W>kCd<u5aTcu^QwFHWKwWQ>$%lC@VNaR9&#YEKhL:CE
^5hhA: ?1tECwyKR!4k:B!YWQ@<hPIyFNEi%M@AE8yjINST%EYpF8yj\lK8bGIJ>T>nCjY9aAu%9!SeWXRYekZ%
SAuW\R 4&IJ>hXa\l$NqqA@G$8wj+%\V%E=!D*W%&IJ>Sp5wd+PT/mSP=*<WHupt/K8+#jW9+Eq%Q<KT/l@E$8w
H?%JVT j\6L?Q&c%KcwjCFCW\XaR9%CLKH?dT!l@nhaR6$:BCyFFTFWPC9GE81ZaAu%:&IJ>i>lCjZ9E?\WXa4a
5Z:a@V wZ+bquDqY!!l@uhaR9*95aV/j!FWWqR=Wku%K:CE?k?\lD8XYEL>l%lC@S<IN+AE8aH/XXlC@Yw5wd+B
8*6L%E T/lSk!ZW@!9lt1J1pYtw@!PYWQ<uLKF?HbbR9^=L1Nu\:BtS#<?NncV<ydmaqI<alyTQp=NJ?djaYFI&
#iF1HJ $nRyj%&+pJSNw$cS<4hi9Wn=h+wmEQ<BXSHmQ!tKRQ\ZSSGI@/awA9E@FEWk@p=SBPIjFEWk@pqSBPIV
lXqXl/ mmIRt^EwRG\l!B8yy%kCSEI%RG#FEmA?^^Ik6tEJEF>kCSBjakpRZ&EJEN8jpS?1w=H<WMbm<pP>b5kQ
-AwRhC 000bc4c6928001202b3 Page 114 of binaries1.zip
qy?jdy %bqMj1m8YQJDtYn!R=pZpl?KHWX?KK+Z?cH+6*KB:y!BqAhG6iqaR&+dHG^d:k5<YQaFH8VVSk/8ddDl
dhkWw9 lcGNHIa/k?E=HIb1QHVXnIFq*u@AQKlYQ?k=16X1Bk?+#FTVk%H*HByG4aQ9A?@yDDwYnl4!#ic!8ljC
!Z9Bdj L$6IkWQZq16n&*R9hC<5tFuD$FbA#Sm1CYK%khES#AR*+PLW%ANPQc!c+Na<$FS4tE4AJ^\E5$dNHPln
WEWETT RNAC#&&5AjkDLB\:<eXNRI&jF*D=lRE?L*Sa<caBQ5>%BwP8&6C1R=+=ym<\yncw1\t9A6PAkFY:QGDW
^9#4c+ \K?/8y6dIEuH1TX+98e>XkjeAqd<#d$JcNpZPtT*l8DNJjLZ6cEiDK\kd6a\BIZ>ZIeeA<9IhVZKtmFI
N6q^Tb Z/8qCLtcE$4G4LaZ<P4W\G4ESJ&BBSbAnt%tA%6DWCDKF:haqDRimBNEDC48u&6w$\Gu\K+PYhY%MmBy
^J:MQD ltG4HRV6+1@/RTjItFXLpASYLRbe4<t*p6eNNPkRD?mMKJRF!CBK5Ke&E#6N5C#kD4AAQw5qIYi6B6Rq
pFQjqI W\$j\FPNH&V6qh1ctJGc/XJdMiVE4Fd$N?mAPJ%kHm<IJkCd?<LEi1GlCm\B%lh6dM$LA$4^JuKDLAt1
Wce\6@ A#!AkGmI&M%LaMipyyl&=EK6+HW&ddye+CHZ\Pb/AaI&XpBAwLJ56+i$Ea&lw5AwDY*Ami==6e:\HEZG
llY>bn XXMG6641AhHVe+B6/9uh&k9yb>HnhGl=KCA#c\?Rd\F\lG%tl\Mt65$k8B=cAGmR1ISB4VAGe:WN$w>t
\^WItm *!IaF5jaXnNXeFR@1>wy$lp+udNBh\9R*NKBS\Hkt^\4#c%u&Z1P6d:F%1N*e&\9hHVkC:WQPkF%/Lnu
46b^4I N6ZQ1%8b%81u=t18T9IWALLN$my>4X:QNdP%XLP=qt@tcmt>5VcW$@XBWaG1e&6!WW!C?FqYuH5L\I69
VY1PlX 5de+qu@SK^jCCQ9<^/wYjZM#jG4%6b#iB4:Jac1%cmbuuJ=1NlHAEu%64b+XCuQ6>lHIPkpSBlIqewpc
8G5n%t YLBk=IVN4Vi#@Y+Blq9%8T?ihwMFilGGVjijuZy4Wwb6j%%4naB4EVYq:/\X\/tC%VpmFw^B^HA=qkIP
d:e#nL KAB6>SKpluIdeR8K=\m&%kLVk1Z:/K!%^*K:u!@iikuA#RIQy64I\Rk>F%uRwe+^!EEAEFk\Al/PFhXZ
A<^!ST edXYAqm8%6bCIy=V<M94uY8:WY@*<@H=GK+=YQ/&NEFiyPT96b#PqelMCDR5m86YK#9wJX9Z*EQ+&$!k
XuW6T? :G6bjc<iu4dnbMbtPG5laDiLDYlV66%8wi6p1X96dB<R#X5CF$Ab>XaCyc#iAc<F?jl+?9nMBkIq*ZTc
6wm58H +beqdFEkt/&5#6bA4KktX\e!B@GLZ6#1a95$5W$98Tc&:t%1VZ4dHuSINCj<Db<kH>dL^5e%l@#SbeH!
cYQy+k ttAJF1Hq&PV1lMlpa1ueLyb1a6u?HH94cR>5ja</#RR!Xj6c:\mZk4&<QQHn?uGQk5\><EZ/&t&<IG/A
ZA%und Dp\IERq/E?1YtZY<%eS!HImhkDcnDbI#Xm?&MACwT49$qDj4=RSIjL^p*cL5JMK^?IATPDDy4FFMNT\I
8#bZa+ TbS:!<RPd<J@GMHh?qHjVj5dJ44q$/YZqliXqyX#iwp*<MB/PZy:ih4%TJS:S$/dPb$haTMZw\dHY8tI
QtmZAW u=qaS+:qYu5ke*1:&4j?wEDqp6KmpqI+DVb:Wb/eF?>nd=jVa^RhR4RkT4AX+BM^mX:ptqluWEGX@t%+
FjFd&I Dt@#<F4QqW6L<$9L>T^Ab4*/iH6=i>pj1u*H/n1:VR8W5cW@96\BdX<uTI8+M@mbtcZ1YH&j6:Vek?cq
ayc^Ka *1:<ZEF^PhE$/!Z&>QHmjCT8mRnT&qLZa4:66j+TlnmDA@y#d1+RL4yaMee?i$*M=m*l9NLdqBeXF^cX
@c4$1Y q*6&idq+i8G4w*\<cRSpEj=4wtWW@t1SV5QyKIB5BaRV?a9dMEJIduFeXZ8*X#*ZP=iZq8aZq=aDqb=+
LYRFmE hQyI9h@Q\YDH/*u+NRK+461N9dEnRptaWSa%&A%kXAPAI1:1N?BaZ%=iYun8WwCQGjVq/E%w<@d!tR#W
Rd1Kya ebcwa:F&kWAR:uK^n6ERJhckG66$4=F9>y>/8!1>Xu*5eFC\n^@ua$*e^ejV=CQ!<8G<^EFhc1:bX9<t
pkpA?5 +CQdAXb1+nNtuRm<QqjEAm#S4ZKVum>@yZjRM5i/RwJDjH%>jQ\/AadE^\6%a8@yk@yH?FM=L&9QkK=n
a>>$dE &laTTp!YeMLXK9w#P4XPA=!dWa=+pGALnN5d>PX/?JTZFyi*/*p9%peKwhVQt@Wbk1\D!V:pC/TA4klw
pFR1Lh yp:%tn4FDJm6R+I?RX#66h65%TAEBnCRtCL$TGDID6ZqCL1<8Bnp&1H9e>WLa1kjHIAAJI5MACQ&<I$j
XH*B4d ^MS/TchPARStL/PQ&NQW#HYLiV89qmAG<QkcuW+\MR1/WuFFiTqdLmpwKm:m!w%/WdA*tKtjn>LQ:PMK
GipQ+Z a9FBA+PT1BG<WPwJ\L&+1d&tIC6AnC>GhS>FL99n/>4>+#AhSqb$GwNkIpK1AL%TLll6KZBSZADjuL+@
EmaG*5 aR!QCl<jZ#<+jILSn5%ihwkTGWLY$QGyKh^WG?RJ4kB^>k4Aq>S&/<Y#:u+5qFhdA%a%aGX%9e^kuLt=
h1cch9 F4^teJSm4qSWXMCYh?46EYGZu>JQ/iQHAuSuwl$WuKeClYj&epdhwILRHBTI#nwaE/de%6i%8<%1F$DC
^iB!wM cACQ#wLFuG6ZWqBaWFScWHC/qC5j1C>@e%VW?RtMiSQR6n+BZ6$cp<4St48t>kP&=NCVKZ!C&jwZ6\CS
Za>b>? 44p:/P^!WK9WJ4WFIci#Nk6i^?bKmw8K<>pC96T14BTCGEnVqmC5NlnM4J?D\5@HY\Hk=cA&#5et\GKB
t/41Nk Jm@yFLA>ECdu=RR$Jd>kd=HQC+l%Md%XkA*R1VTMChCB1b6%uLp9MKk4LT$/W%BaYF^cnCG#9B!nJ^VX
iw#?8l %b#BS8t4>CZ9PkX*q!yRkb\Q:$Wy#F=YAX+wT&=1H!<$Fb<n6?y99TAnRQbb5$X^8<i1XiVRtQBnR85$
y:FYKX Ab8A6KK$1KCw1KCkKL?kGAV4kunL!!81H^kMD^?c@CAm&CnRBeBwVBBw=Cln\ai>81d&paQ!ekp&!H:4
^A+^Sc &*=5ITEm8y@Kkp>>YI%eIn:CJ%@PF@NF%5BqCcD6LHi119/8<8HD!wiGEL<RQ:ACTkF?nhmCPRlA*tCW
HnnJN@ e5=4pPjW1i6Bwtk6=9ydPQ==ea84j%:XW6ZnhlG>+qYbBCp1E>ACZ6ap%bp%+AYq$8KC@IIm44T4uK8Y
i8pB+9 QDDWQGRN9J<>KFAllE/F!eeByC9*Rh/tw6<B*1tPTbB%E?++61&cdbFY%bK<hNeAXV^ByAJEkM/E&ECV
#HDkiw JlNd#yhTBS^k/m\jCTMIA:BYYYM\JA9B^Aj<*ReMFW^X+cNAa=XMqcQ8uL$Ce85S%!%A>cL8KhhmXhYC
#pXXWH \nVZ:lpRD>nm%cw8\KmBA>HyDkN:HDDGFapLTp8N=XdXqacHlp4PMK9G+Ih8y@SXIB/FH#Ay^ES\lR$p
\dS#NY bHqP#ab5?AXaJMjX6&F1D:m1YnlMRKHH&DM!Q8+N!5PAWZ*ahBk\ZwZaY\aPCJbmLnYX8=b??=A\B=>e
FnW^1i <L<RH>b94JI+w1<CeT4RTnCMVh&R%M$eIG^44YJd1C18BZ5<%F/$Zd#KknGiW+*S1FTHD/5Qc$\tmGJF
5&aNWn BeXuC5?C*=eYR%RnS&pFTNXp/BeC<RZaBL9^JR#:wS/>Ih=Q:V6Fn5p=PN*Lq#DK1*8K:AFCpaXJ+HLj
iS\Ycd NGR!DyG1kE$+CJi11>nBkKteP%MIZyEQiAuK58L9HuIGCZC1=Q^eMhwkdn<@<EyWyhuLB8^#A>kunAn6
8kYKX@ BC/4Actb<GuVLGS*6Ri+?FF^<aSVEC/mSiq1wFe4KmFPtF>WXFmR#=WPAbVqbYWqB9RNR#cmkXk1SDpk
B*Gu8X aBSGHl?=X\B&ecDSABaHc$*%dZY6Q:aI!kT$hnBp5/Sc8$S$HBhQ\c?LC9F*AZIRMmm$uC&%KT/+Zblj
YtL#Gd WFnWXYyhXqyY<9%DA@jR:NedejpJcME%IZSm6+Tt8tG1X?PLq>#L6n1RLCCmCJ>5m!YQm:GJq<X%Ay?J
YiCBB# ZL\nEc<KyK9Ta#^#LC*KL!\<W+meqlc#yRM4!51KT&4AhpQiahIQ8B!I5kW9<bJDmJ*1/SY5=LkZdZW@
E$NeL$ 9a*T614bMwmK/S@*Pp:A1:Ie\KacB4=k1EZahSRX=8jnN^kVX&bZZFL!LaS^\Mn/>jZ%<WNHEXkFVlYa
qyE8<k WJm<dIQDZ>dX6XaJGLpYMVt#B\E*Y:LRtH/9+@CI:\VeA6w8XSemuR?PApGuFNS/?\!+VH=SeWq^<h*#
%5wyRE bYYGGn>\VF?q6>JH/Y9S1b?jD<4aY\=cBV?Xi+d+RulnMRyW>hkStC>LB4\S>5d+8Nj^kJcP:?!K6%Nh
@ubyt@ %R5JIWlWYybjtH?GK*R8KC^JL!\yKT54j^CmRC=h9Rq4!Ch&J5A!/$Nlj^ukG</$XAGtVk8HmM#cM51I
1@G:kX GS^uSA=qhD\N:6Ky/8!MX+HFqpJZZGR8HX$pmBT\*T$GZbbZqKq>MNbB@QFVpKnu=<9=>RM=i$PECAaK
NBH%KS =Nlld9i>RXBbCha1MGld>cNqSB\>%Lk&dm&KFqlE4eKB+Rha#C<5LTYGBAI?Z%SWZF^TYtc8GPT6<EWF
%@yBGn RwT%5PpDAmcY^Qw+i=EAGBRiqyPD?N:an+XVknYtq#F8nhEIanYmZPM/AVGMmmDImw5L!p#qLyDmRQCy
4!iG#p KC9?61IenmDP^\ZkB@5lW<E?IWy#Hql6Z/Yj\uIS@DQAP*^:m@bh?^H56pX\#6ww*8kTb+Tnt%hbuJcF
$A1@55 QFyeXAA^qm?XRLhe!qXR\KP6GlCFRMaIuZI9d=<n8Zq5H551Mj=lAPS<uL\^:\*b9p&4%d@FyqBcCcLh
Wc1pT< b^&>b8&c%>G9PcM%1qTGVF1Z/>FeAcEQyKiFyiWX*We\TV4>IKAHH:uG5wk^L+<:49RV@JX$a\4Q:a8b
hFq56X />y*EbL+k^EIn:&<pX@naH^6nDcm#RKnb4&+HQMNB!GFk*RX5>Y1@lXXFXZq\bmwARKFIy9N#tZ#kFG&
ibwFkG h^:HlyCam=EIFB4kG<JyJcnPHneS<HQES/K+Na=Eu*G9nc?B$WT#*lbGDpLKcC/um6u!*lZqXiWXFTlX
d/e#ay d#>FTHa&?$e8q#eeYMS*BNc\ZN=^nAjBjyDq!d&C6@614%e%Y>Va%e%mT=Wk%%&WpX6nD^!8YaQ8aw!D
/j/$B> \XCyqA^b#Q18e4=1ipYX9kI\KbK##VWkSGR1G?Xy41#WXEK*@!9&%JlQiutCDuP$CN5EPaeR#S&Iw:RI
?HT\hw Zlu89Mc+=9Wc@IwG>q:uGNFP>d*JAMtTFqjwK/1CjJK+*KtwMw9tet6MqRcV:8GX!we\>A6SRD+P4Mu>
FG@+^6 jd6cem^ykMBdX+8XEFuDda!ABn?e$Rwa$?M$DqYPW^N/Ipt8!1wm%=!dt&ht^%>n4:G=&abKPE!G!8^K
uF+D!D ueEAuYE!BDWanZq/B^@L$da$E*i*KM/BeGi^pqC:/bQY9yc>BtR$6?aqaDH4uew6HIGt114BBt#!AMi%
nK5:Xi 9G9bZKY>^qSyNykAn\aTu\H%wDD5LDaE?H64d&kSeLMkP+K55$WpyMM:!MBY+nuhj#4uL%dX%mItXm<y
9ta!NS J#%Wd*%XXdtlBmS&La@Njyn>5FKn+T46NAa+K8E9TAQI=CKpl*ci\WHcuC1\mYaVmM#W+mkEM&IT?6y\
9EBY:> *p55DELk&:8Y%XPAcd=FQ=ltX%VZGeATel>tX%==iCY:59JlhucqCVP1l\cRIK+jeB^:JGC19&iRXy9V
-AASdF 000d65cfa43001202b3 Page 115 of binaries1.zip
@Y^ZCY $k*>4Y:Bw1S6FA\M:Mta^$8L!ebLak?Cm6l!mDmG!htXD!?DwC=DS1HJ9ALkH\LCGpMNj4WbDQWet:h?
6L?kXY TuBZn4dHBn4S9y56E=hlMQ#F\V8+ZyBqp8&qj1Vk9QBX*Rby+EPC+YH&qe6uT&/ZjA9C1uqwNw\mKYJd
KBi*+u HWnN:Btk$wJlX\q14?ylTWkGlhS5C?6FkhV5jPS/!$VQK:*#&&I#+K!/m\ueJ4Qp>leq?B#Ih\<lw^@a
\A/:+q B9pT!K=NpF!AJ^Ec&ED#K\DQ>e\eK=&EIR\E!&PIwhp!4IPS%k9PIAX!H%#mmpX*T>lm?=Lm5l4R^k6k
6X/u>I kVPI&k^e&:m/6uwYRF<F$y9j=cKq8jdNyP=8Hpb@PBQlGY^lA&jd&kp8AS%Z#S9ic#M<\B!w4Qk&5FGK
L#lK*8 &SBpCIm94c*:A<iLyB\I/Y<uA<=9JwJJGhDqbc$RbytcWjEkJ*M%Z!GFD4t$lC98q\/yRAZ$ZlD\15u1
G:@+/B DaF6cuP11</=K4kK@yyc:N?cZMdJth&PPK4%WmmPYTa@JXm$R^jF/&%\MF^hWR+hFFjGq:neK+V88K!<
/XdPaW DLFAIK@t&5b$M%EHCJ>YcWu@&>LeLdKi?Y<d!:Sc4bL!bu*+pDeV^T?IKa9K>b*qawDLqhpWFcbD1wG>
G<8%P$ 9l6E8T4CV=9BI1:uV/9$XX4B\Ill>Yq?i+Ld<6uG?>lDd1q+c<4+BiLwk5Tmk8Tph$98Rd:GqVtD$M14
L@?!?l pB$IDICp1+%1=cy/6%VyIbKB@y8FLwCMC>?b$\?#<iwFW6Pm*5Xp<l8%Q\RXZ\a=E!V+FYWqpBMY*pZX
>Qnt!* \MC14I!4EP84>Pc1IZYC%6811+mNhW84SWAnJ6?&QX#6w1b!ZqbhbA:bwy=ZiqjB#E1lN+ilSEXy<X&\
FiH$SW b4T^M5RKJqFlA+ICu9VQ&Vc481iImc8!R/ESuKAV?:iYTZ1tE:hBQFMI%5#ZQpPbeiZmWl^dm<w4#GX<
A=\1PL 5jQ=&<YR/\KT8&Zq$Aq^XVDG1:IBJhXXIhk1t^a>mk*Gann>*:PcI!ba5P8PB9>W6AkG<bdJhSFD+MwH
ESR!K& qYci^$T5nAkNBm#uM?/YqBVCGK&EK=NWAEhe%XSk4dwXGcu1<XLLKP^6y*q#KB&<$MDjYy^+AZ&dhYuJ
wc8/Y? qeM\<nTX>RIQLWb%kZ6Y\FeFakF66Rn5ThB:wCeEbER$Vn&M>c\+aNeVai9#TY%*MPCJ&SuBpRdn+Lc$
MHb9jL MD>VpXqmac1WBILTRnB!CT4JZDYF?H<#&B*yec1/F\*$:/L1Zptw*i+RZQZtC1B/&1F*KhiZ\aCp6LTk
MMeL?< 5QC8aq>J<i5!Y^Ak5AQ>1\u=cVbZ8Rmimd<CaGGbSlAN&&MXJE&uGK:dEAqQ%q?^iW@%i1$bW$4M/k4b
<!Y>ct k9=FJieXMbDkIX5aGbA%KLk1KSykC+yNn!!BRIE*ajtGJ@dYQZY9B:#h$V8c6/!9Cay!44*=hS=:QQ#^
ym5mQC w+mRK6LdPWIGY%kMI+PT!#+4!4lm=#JAYRF5Rku+BD:%dJYNuuAJiQY86jy*%=D?C=<H4AVye4kEAXe?
Z1dERu ?Vw9:&<SETGjH&>W\tAIb*%GF<FR4/#pdwdCe@#=EtRRYC!?Y@\6BI<1+ttE%euhZRbay9+h4Q>qJW:+
%nCT/% SPBc&<B8Ab@+>Zn8*<IjJiht5:te$8+1IGbLHS=<Y%J<?!PFbAK+6luneAWQNtt8wqC!mKc1^X#F6=l^
?Q:>=Y Pi\65?>b$4M5p6V8+&9:9qq@QZH<8Du=WWT!GZJWX8\6ie*CRIn/qnP+jZj*9MJVMku=R!d%FSXCHPu?
TpS>h< RleuHk/+YdI$&j5h&bJQN@yapYWYq6Q*4>Z?:ZlT*9GIpPV5GncdbR%X<Zc9ejc8Q$=8Qj!><wFedm?J
mE=?wt 4:D$LlYAmKw\X+tdWdCnBV>HyM$>mQV@BdGFYS#Y<4WD81?&KJPVnmeyI$KC<>k@YBBl8ePq!bek\n!A
KHXa\D DKt!pu9IK?\qWn9EKkR$/*KBWSa58IZEG!tm4VIJj1>@T<cPd+t<X4@*DdjmV^+48CV*EKY9j^LL%qSX
k4A/$c XiCR?q^STjYD!l1e>ZqwCFbM5bQEb$HmC:^Y/D8SW<DqTPSM^N5m!E*@#4y=6\tbTVD>eEDQHi&n+CSq
G6Bpl4 eFK!e5n$aJa%5>Yk#6P&JR@mIX?HVI$#&B?S&>6JJ=jHAVEt\V6J9BdCKFmSCIa@SKQCA1n>Y@l\AW6K
TCP&lT MH*I%a+SKEn&DXaEJ!pab1n*dI:>49yB>RQ%?aLLq:@:/GDq:\<4YRP9eJ=md#i=@NIBkeW19RqMq/%!
L6EMh* IC\THmHjIR6n9Y8:P+VcHkF#q4Aca>>6&T%?*t^\@/Su?uJ9%/TcB\?1K!8@?!:>8<^99<@?/BwHLD4K
Qtl<SX Fjb&>yKK4LmLkBIWX!E\&S&K:Jy:w88dBX@P5u+u>E?YpGR^IWS:#B6!miApuX=jZc$L#4*<+AH**amT
J=XVJL w9PX*#><tG*/A&#IpP&n<AVbZm&QP&S^F#QmdCEhTDNH8IcT^L:i6i?5e6aK<elK+H&9Z#i9m9/i\h:J
JM\n?k 9?u%4hYMG9L8B><>iFCWXqyW@B*wE\\Zp8+pleLV#lY\J5bqXbGpp:mwGRW5HCnl48:6CV&G!/J1i*1T
$@HduD @eI$:VB>qhLX$>iVNTBGZdXc<%*qh=qyF!?YFlTWGA#eR$pqDw<W66Pu8ADKA\i!!QwF<bQiSL#hmd<k
ppGIRq Z++EyDiIIeu4&VmCmiiHk!*+6Ry:d%@Qq<>dDSc<qTXy*EY?%K&wBFLq!n<i\qBVwRma:nuh44#<+1ED
j\A&DF qwEC5Q1chM:p6+Y%>C6<N&<EPk6ZdLyDdmSjP+1aF/P$h@Z&bJ>Z6%adHnAc=pFyaXHy^a9Ru%YWjX6n
hNEbWM Bmd6kkQ<A!cZb%*MPmC5SmGnXV%TdSF?Y#4$qy=DpGm*WEpM&DjcI8%nCu9Z@9c=l8jX%RbGy*=RZIBV
G/!?*! *XuqEHBK!:nK\VWQkd*kaQ>k@*ZqkP>m#<yZqd/LSHqSC+laI5lRI9SV!K9W$pZc9:XjbI?=6l@pwpy:
#N9SA4 q@=T#?jX#\&bq#YbBTXpV5$iithId4:F\TiuGB:eFS\WeKu<+5Y5m!TZFFB&e/ku$eBpMb$*V5qbPP:Y
B\N@%j =K=B\9Y1bKYuc*<:#:d1/p4#=jNuML$^q@MXXCqZJwblG/jwH&^PTkwIKEilbyY@RYt15ldRA1hG\ylD
DKu:#W 6&<I#tudE?B*e:Y>+cSXy@C&>*X%%V$\cPLQuV9QXykk^<Ke!kA8AVGy!&V/KB:^ZM\T%6uI!q+Qa=nZ
FCF1C% YbJPV6@*uhDc:SR5cnBe+K&%>cbTch?@9?eul54+A+q^^blPte66TtH\YFJTYep1:Q$Dkn@C=a!L=iAW
iD<VRM >6$DRF\pJepIM8d$:4cG6:bTpGqC6udAn?ABT1Y*1/>45PHd8LlDeYW+JpH!dVCJ8%*!@WNA=iLyH/AG
hpa1#w VFqbF:q!K<FTYB!yCh!^mJApYTcB6j?!IeymuBFT@KPcc^$SRul#XXhpZW$<SLyhwy8!Mln4*Z%acRJj
C?p@^/ tDJ>!nym5Ft9aFAwJXam8J%IZ>Xq$a>kHHc%d@t:qaB\>%V+duu?HPWaw4Rj/4yb4:&cp+n$C1lKeGc=
!T#@/S =GEN>InBZlLJ?HL8w4V<I6\#qh8YqXw5SWAIMdY16L#nua%GV8>G$?mB<F*>HJ!:LTRCtZQXXtXy4%+F
@D9>q& WiL\A6KuM18T8\?JE>lA^\<iWH:SZA+S8q^WZEbpmpJq1/\AX$W^CQhNQ>H@de6<K/WLl^Dc#LZ&jX:Z
pSA!D* >pIJVH4&t/*NkpNjJW\/XaGuF^X@@^C/@p4\hcppHmJeb:pEX@G=eqhBm%X+kI5Yq\PD9GXamTHN+T%e
I1d&<L 6d8H%81dIXT&\yn:J8JT>Ehel/wEh?I1:CFL9j$Rb*<Mb8DRVuJ^:$YIN/b!K^!GqJY!\C1Iwa195IJ^
IVZ@#X d$F^iSjb/jRGweQdh4wZi5R14yX4p#^9Nj8bqbLka>w5Vn<c5RG6lVARjQn:\^yABy&SjLJp:+GLMBRR
&Yqujb X6ZaA11aK=eILklTL<eFlHI#!VAG@bj>iY@%?!BM%/i64e>l9A>jL$KRS!Yu/BYpJ16*JYk9+HcAp#Za
mp:Sdt B^<=49lw<1/>SeWFZKp%IC$1LC+%k5jkELYk1Q\%\jcPYh1>/bS&Rul:&q4>AmeYRJ=6bp+yWmnNCwq<
Ke5@*p $6WK41S@YipDk!Kkp1!B+5dG:P!Di>MKC4yK^eZ=IFG$GTqkKkM&Sjy!w*=A:V9>?y98L=T9FXW>=>1w
CR=%$F P4dND4DXtbPXTpWIC\tThHJ<YWqFlWtl<LFuc<!GQkFH&M1!wq%FlelKKT/@qJc?Bq5yKBDR9Cd//6uI
aJEB8d b@<Yupm+&9K<DbBIEAuZ^6e=9/lu&iVnaHS&>qQK!5&5aynZqL\c=Kl/k9&?6IJVb<:pF?LKbCE8SSRS
hH<<L\ R$HMbSciB4=n/:X9yYkSh94cbtFmy5:eNqmaycq41*qSe>\i5F*1WmmW\bCmBHBtR%@NiMu8$+Xu#?Jc
au1+*K bFEBIMR?%+VmK!\1+py=SGamt?IEK*#nhNnq/jjBh$5hCyB4E^6\w5+XFNbc*hycZX%up6l:B1PNnFR1
qLKliZ FK=H&CVFpcS9L$8ppYeK<k5L<t@jQu5YpJ\yKC+1^e$C=aC@pC5AqKZquYmJ:%nkY<!Gw#mj6hWJiuPw
?dNS8& R\/^W&$%QPeME\KAQWWI5EmR%kR4AyJ14pmB!/Lm@QP*AWWBaC@C=S%Acq5E#qiEj:+kF8u<Z:L/mQt%
aRdn#H pDybb6N\jkm5EW+kR&pqF<EHAB9=AqaQk1>q5@:T<W9V!LyuWiHb&:eLm%/Z&lZlIlbEqhJ!a<@a:B%E
5<dW!H 8M*Y8lc!NPC4p=mJwc66At4S4FCE>DDE%mTD=t4a!bK%8<+XFN+8RythSp$=FbWSFGjIN1S!w&W:y9D:
I@$1dw Z\bIP@kYi<kGj$J8DLlyitn*nKhkK=<wn^P8+AkP@9P9uGJwAF5#YVJ8F:l#KXtkL$KnLC+wKCwCYb4S
KDhjKd TFyJptj:#p:KCG5!l>bedYwV%SpEhRqY$18/w54M=pKkJH#=JHE5y^mR^PXKJM9&FlNGm9L#BjkFSX!l
I/LW$d 1LkIl96/C9mTCN6Cuh<&ijniaXu/iwaBA#A+9=th^Le=X8E?ktTqkqP/Aq5?8X^i5MLLnQnY:PXK&TLH
+FPi#c @N8IDV\A<BY#=YIIn&%EXW:9dBT6*YqQMtqk/<ijRHIT6Ai&ddR\d%lFJyAN!h%<iZE51M?VbRMpp4$Z
$Vk8t& &XJuWNu6d\4#\h$KeEKI?LJkibT\?jhNnA>@4&h5*X#%DHyPR%%hN$6X?t1CCD/kI%SW5DKa?&5Ty*Bk
c+/wwc Z@yL^pHZA4!e=RwpaIEFZBEFLm*Bj8mqBSj&Z:a>dAZ#LW/+9N/>QIDDI/>YakyXXhZC4DWeP1W!tSk:
*Ejl6Q 1k6MQbkDP^!*F@\ZA%XBaeHb@AIYMQ%JEAn^A4>*R1@Y\8N5ZW5#bM^pE4LKwjXFK=ucSb++\/A&k#p*
PB/iGJ L!?EkE@tewMX<mT8^p/!QLKAK?TK?ALJN+XkcSCR4C%LEl*h5Xdayw=<dHEqQAkDYDJW6+#^:A%%kmZW
beCw\i GF/aDjdtZBIB9XkP8tK:QM/MXkAM5EWTmA/u#cXY^YVuYjM:CV&Mp:d$:qc?MJtEk\*MZKGZMl6GE%Mn
e$+QC! !!+QR#AmBC5+Npt8<IS9mYVy8VMa^>pCi=!!\k%u$Pt&pwVR$t<kC%9=Fy51!&^\>$!uVVNJphHMiAQX
h6NH\h %tYRQK^WK1GQ<kd+C4pmtH6=WDIl<lSd&4@\#Dhp5\YwA<PA*4I!&R+wP9Rp6>S9:hWmVKD*VHJZNZhX
%q\@** mcy^eRjZQ!\MQM!6PS:MKl!V&S1FZB:M%p<HVdPq>pZ=b\6L<w5K#lTXewJJQSPiT^B/QXS*+EnL&p^#
-Akw^Q 000ef2199fb001202b3 Page 116 of binaries1.zip
D:tk45 m&WP\#J?kVT1811CCMqp5MdJJaMlq%XIQDuRk>\/n\X>G<EdZRy8k+PeASEXEmdK@$u$AQIQ+ZFXpa#i
1t:VS5 +hi%G#lP%eAa18^d%tD%5AaZw#neckcDKen1YC=JL9eEXW?Z4DqRYwDl@<^6FBI8lQM+a>wnI+:IKeJb
BS?C%j tI\Z!G@G!ht?FVm+1IAey/!cTIjM*eDaG@+Ill^I:lQ<mk$GNB^4eyH5VT5Cp:WnHk=^4FVQYZySC^K:
WMZwP? N\Q\HR:Nd%dq\Dq\VqbjWe^XYMHRA4JC#6C@BmeXWFT+ai>+dq+8iB++CCi*Dib1D66JIp<Zt+9aWwjm
1VbuD9 59KilYm#BbeRXpB\mn+Y6&klk?St@K1waM5ppNiY5GY<Rjy6=i?XD:qKpcGTNhnX=KLlE9?RY!h#NWF&
n!m&Z> wQ!m4qIaZ8p6bkYyKdlkN+w\S<61miB/dNZ$m4L#AB1Gt<X*m<tKT*HJh<lEnYBk+C6JaFni/CF!4&VP
=>CR51 +Apw#EW<lA<M9c#i5YhJZX>ib8p%\d4$wZ#LKKKjdl>EV51KK\kGTEGL:>+6TT<y:nSaCZGLW@B!y^CP
XTN@@9 DRA$LFe=*Y:bZ1=IDN%^F<pViX!B%yMlmKT+XG>BSNYG<YSTTpCCw?:!K1/CL^q>4^DaKTwy^IFj<aMc
G&J?<w SGFbNRTGIGkJ1uH&l1VWSdL5XFEB>9t+ycS:cWnj5@WCknE!FDEHX:Pci>a%CWjqMDIy^MWQ+Kip1AT?
XntCQD K15Jwy:XTZB<8R>^HMeR45dpMn:!VCFPaLCE4V:CeFH+aPIlBQ@6+ty$Hy:5!TPS$c1<wk^M#X#tkV6/
bYh=+& EGFySWW%iY:S5q!yRE#hi94#wd@hlPXydKtwG=PaDKZIMA*/VWmn6w^S6^Dj\eW/m?hZwH4AwC6\i%$J
t\=kyS @yc!Fd#B<R$:8epKEF9I1*4\Iy<<4nLajq^pphtT#QPkLP9mpkLenQlT4?VX>m*h$c81lc$TXbS^JiI!
WhZ1Ph GCXYDDpQJqBiAVkk9FbW6>Y<Ye^6$*GK9tBy/KjiVY#qhMu!9SCRAYbH8SlC5:ueV6m>ncL1$P@m%j%/
EGhi&y Xyk6<c8CLLN!FSKe5PE1ZM6K!MyWhZXX6hBHet%&hdtKAMJCNtkG<nW\k<k$MqnA+a>kDyB+mmC4/b+u
Rwh1<e /NTHe&1?!wZ$YGT?wKKmCu!G4bDmMpc=8RLGmLmR\qXJ>DA1k9GDRh^tTGIXjRK<Id!B%aGBZ*GS:DyZ
8apXC: YFIEiQlTcXFlKa^LT1$\<T!H&CP5GAK&GD6G4i:ii%w%y1JMZ%FiZC\56?y^kl@+SF\qFVnhD4$@YAHZ
ABWG/> JnLpekyK#mq/R>ABlGAJ9*jbnh6%B8IyKKeZnm5l%BXC/kbZ!54J^Jbk:KRuniZX9c?1La8e=SkdKmCc
9w:n>8 q4EX44nCT@DCqZJeLPK1*J:*LC%D@Ed:<^I!Am<&:+<A8@G:!dIu:peH>eF+yiB&ISt>*C+Cy^EWCAQA
65EEGd InAE@S+d>XY%?m4yVb*S$59KT5@*4L\N$ANYDB>qSP#XFp8yM*eyS96A<CPGZ@N\8lR6yb#p%VmTBcb^
Vb/>bR +!dpX+X<pSk!aVMb8$8Kmw9KkNF?X\WBA@A!ZG#GhX@Cq=&?b<&GJe+u%S6I4n4R$AbyjVCkW*l#$F$B
NlbNKZ &6>1H1LleKXmam:>mtEaYFlaYm#5?wM^b*ESGd>dF=WXw\=&WqjN/BbXLdlKA+^!bXc+cK19/LDMhVpl
9*6$== =t=jMNT^m4:BJHtwRj>Y5k<%mK<WW/^C95C=>F\S5wwy<Y&IK?B@aL8+PVjWyLdF+I8ewQ/ARdLA%*Pa
hF\6Sj TaaHZRD%*NRtNhVq=wKl8uwh@>MeLIVkn>B8m5&qawBuK4W6J6%pQw=lYJ\kKIB84:S+G*ZXyH=hbX5B
ITR*m$ pdAE&ZlXbY5SH84T:e%\yT%bDyL##H%F%JZ*X$PA*dnh8DI8KVyVBB$nhQIw^GK8!AERqcEKeYM#X:/d
4FDES6 W%MMy*au/=FwlQwKkbt*8GptE?nhiK8/kCEep4GKwZKjq&!*kZlK^?<1I9JCB!BBtC%%SLWWF!DCRl!>
<yWLkL :DVne/j1qm/e+mGVc^YhJI*B*\HN*YGtY$FEW#:keaMk#/=B&\ntDA<lcJ$Y^mpaWV4Li/PPCqE#yVCP
w4%W:p lc\MnCJKyGbM/wqCi1wu/:=w<bdFWM5WiZj1BDn4CFh6PC$%NACMISuS!d*AJM!G!%FuC5>C+p*G4/d!
peiPGw QnntK!&<jTajHj><cYqliZq%FKi&aelD^&nZjJpXhF#qbYRy6CjdH&nJN<uAyae@M$RTVnFR:9W4t\5M
RluP5N B8VXGB/W\jALb\TKC1EVB>Y=F8D+9LTACBcGuRdD4p/%A$QI4!kDIXT\XaMF!*l49NT>?/Cq8166mCBL
HDu/dw :J!D\d>Ac?Bt*q&ZeN/6GM$ESGp8h<K?EySXpw<KLMbH/Ewk=aymi=/n4y1A<&SXk6R58W:Q9wB8T&ty
Q/F:CQ F9wBY+FFR^J$c^L9X&\TJ:j^>w#QK5WNq/Z&tBaK8c*iZM+ZW?Bk$t<^1>#Dk%F&1i&I:51K!m55W:4&
L8LdVb ?8+>FYn?R8bL%8?4uqbX%\qnk&F6NbXtwVh+ARdDGmA4JqG46BlupXmT5%tBKM9\ETW4*D!tmh>n5n\F
1KPy\p D=$L8Fw^X?Y8J%$*du!y/ycuScLh1iyQ*jGb^V+<Ti/X^?at%ePau8!hLV1D1VWMMe6:a@eGWm/Fn1AK
mjJbC: t/nn+<H6^PTli:5YVN!kb$P#GY^bylIYYL8NlZkEYJGalEq4RInd\4k&1!RIJG%A51ueAYJHwYY\R^l$
<#=eam $yiYpb%^l4dM?Qm+eFH*A@+1hZMXCKPM^e#PAl%M5=>FibbBw:DF1MXA=4NkaPyca*u1*q^jnTMa*GWP
E:+y@6 *VEtY&#=K:$>aW5ZF^<ZH^>tJw?4<%ZD>iWqFZyBcIRb9YXul<BYC>q!$WLYiIWJJhTiCA6SZVYb9kin
bjPp6^ \EpnTEhI=9bc:%mFucIlQw+eWSm/YLZ$GClPC+IGupaI&J14*m#+6Rn:yC^yJTB66W!M>GSh\m15M$pT
1C$V?% \dZB$R6KTmH=^y&b6qZEqNZ^ecd+eLN/BQECqX16J\M8jW5*PtG9A?:RhZq:cI!u\Ey4ucuNT6mKb1y!
$dA/M6 \au*euBc:Eq\%46VL<L6c4aG6eBZHBi@B+TwEmL#hMV!D1Ltql@j&j4ZZNY>y+%w6L4P+uy6#$q</Gc6
!nl<u? kM#bqlhnItSj%R1%DQGI#SR98lT@8$9h>^k!yqK*YE^QRM8%nP:l^dIw*4NQ1$W\qth%By!F4Bb<FJh*
D5VkDQ <YEhVIPI6%qZ+&!=ReWBZ%LpL^Q+a>WmFXmpw\1#lG/NeT%>*>$%JR!k8#e:C\:BX9X@myPQyF<TuKMe
SP=65q i@<m:G@$%qY6aE!GiDcPn^eVWWw#XjG1#Fk:jD!LIS\Cdm*8a1^1jt5ucDN=81JHhbbwVWVddPpdu#&%
A/k+=d MA@^ZV<Y@Np!Mwie1i/FRb$bS<jl+^l^KNXMFcDNnFj6/^IWCd<#lF&PqmGPwLT1ulFe#%n::V&hqpA*
Fj!!mm #4L4R1@Hd4RWH=GDXF8ZGS<HKPP:n*kXaXcXGR@yq\RbFjDPW=GWp$m&=a$eY>+ThI<M*9\qPC/=^qY^
8TwSch ?u/q**::\KBS^^9ycDy8DiC#YKy>IyClnkhtXi4adqaqkyn=1q:C1M+C9FuaiD&tb>Kq?T%d/k/6*h:E
KD/t$< Xa%uhJ1pLu#abE&eMVw8tw/PM<bbiAY5?MmYKqMN*@9=HmEQImb<XYD$dRbSnu#LpJ/NPm$>V6PnhK:K
DCK?8j <bu/<PHkAN\F:?Zb!c/SIpKnPc/9\C+SemdmJWe$y=cTy@+/%SI6McA6*d1$1NKm#tcLj5q%jZN#%a>X
l>6e9T Q:WcVICIQIh6?jm9iR*Iw1QZ^PEVGSb$eakNpbLuC>Z^?<SRtm%+PjYp1>$59C*C6:n1>1KuPFZQ5iK<
iybhlW *CP5J:+<X+JIPW?Sq#?:B9jYA&a&4y<FJZRbK5KmkDnGmjkN\apDCS!uVSV$Kanbwp4lplB<AYFhZS9L
FaFVWT =8Z>!8YJe@PCPaKY<nJ=>9Z!B+S4+6ckSkYQIcdE1S\Ryh4Cc&!*Xqt%Nj!bCbGCc^pu5Nt6QI8C+eK#
%55TYV u<mmuM/ede::Ni>ZNp@KHmeeIqaQ!\Q9c/KS$>h99Ia<cbn=lqM$y$kMT1yE6VySLVmSKQM1&>K9b:1q
D6DV#y &#Fc1y/%Q5hA1>N$Hhb$tZLbQK6j<YtHyE:Cyy*@tuk/LlwR^y9nZMknj@lktEY\uIY=TGiLaQG+yFbj
>IaZ9S +6R>V=R+Y/\W&Z6Pw44awDF^G1=LEt<mQQ/ch%#k$ilyL+8nw\q*ec>N<j$EW%ZH1>+IFD/:kdi4=BS^
aT<N9Z kTFSbLe>&hZ@6Qw=lHEd\KQVHDby#CadnhpMDQ$KCyRtijWIe!TK$u@NG5RW@?akV:&Sb%M#RYQmVGR^
<mHM@n imC/1A4mA!DLXF<C?Yb18*jh+>MqQ>Yb&%#4&uRcFakRD<S4=9Iw\Gu%/^HWtktR5y:mkDZ^ZB\F9+P/
ZwuYS@ FceT%Ec+W%9<RcSTS#6atE&E&+pRm//C=ZT%TK1cj\J68hXl1kH+AJMK5G1/8nRcE=wMjw+4pEt^F*+:
656y@^ E+8Jy5EVnaJ>>p+W*B>6^9KI5eW?a\hu11:GJ!JBmYw$yE#%%W^Bm#?&k6d1eJuP&cAGqQlR5ppDuIIY
XN^KW< uW%=A8In=MpdL=c\/8TQ+bZ8Dnqe9LM1*5InK4VdhCAR1Qj$ISyGqSKpq>BN<LE!:N+J$mX%Bl$?S*6a
AIL5L= hSlCt?t\VwPQC%9+QT/k:a=CZkGA#pnmD9pTSI\a!PP+FQ#8:\@K^P8bmeA^+mRcdaH$bZwhhEuAaSe?
e&#J?c Y\1Mck+jJ9IF<jdIX!Hk/#+CZy9niYDRRZAMFK$/uqQd16Sh*RwXuGVQAEB/Nj/1CnHGA=51NKYuln4I
lHkCJL n*lXH%RHNAEPXaSNFC@ZbR65E4\KM:=C\*J+?5eJZYW9apSCQCePw8ym%XVZc!La/Gu^q\mdwFT\I>Wq
Nw6n4@ DA#Ac#^<WM9AIn/&m+IFneKJ=nCu5Vq5?nZ9c$DJint<+VKkp+%*6V!jGSe9QQWd4?bWXyuEcqpLm&d%
NGq=uK l=:^KyB8uAwNN==$dJjWeScWRCFKSHlYYI*+NCDh45QwLGLRJE9iw8DaLXknMKa!^\>ABkYDBRmCWAGG
jRkJmj INk8hhRW+hquCQhk8*E1\ZJJ6$y<GbqEdaJK<cHw\<CnjXi</i6j9<+:L5jZWNl/Ym\w\BV9c8FMCKRI
:9hbIY ApdEZWTVcyWk%S&&WAFqEAey+El%@FZWbmdwMn+?$@JkMnKwEb=P:qJ#l?$kBBEhH9HyI1>^EZ5G^HE1
#Jm5W+ Ny=Z8TCh!BCGHKVVTF\SJiuqIMkbQwu^KncZMuP=auP8?WW8^d:KqiBdZS:uWnZGZG9YBQLW1E\aPH4d
EpAb>m ^cp55T#*Mm>/BRD:<@FYCCt8/\J9b>KwNWTP/4:YkwN$yjMTM%#F8JP=\p4w5d6+mnP^9jEFP?T\FB#H
jBJ@/B 6uGTq^#*$5R=aeG>+8D#Cp/+X^VH\8@#X%&<GD#W4A/$m5iuV5$5:@^Ky*LHN!c:G>&NSw@XuQFQtw44
*aZ1j# kq<8$WEF6lKj1CKHYTYGd$:q%N&ZCC>#a^p^&BnL&:#W/DVa9aXI+#9n+ttYq:^mnP=hH4aI>#$Q+<a+
tX>NJR nua^ImyA664DcF^6yNh\6I*S9eQn6c##MG5T1SI:cX9wP?t+SN1D=knCVyWE9lP:XKLEZJc*N8p$KKQh
#uJ*aS pPjL+4yaZt1kKSuj>W4MI=5P9@G9YB&nwtpQI*Dm8NFIG+$dEWPu?SZLD**F9*4Fa+XE=J=YhTb&^6Et
:!DWdi uu@%lH<CRJ^+n5*XRaSNBMbWKydu#XJIThZ^K/R!ED^IT<J$WLJujJ<uL*YJ6NFnGnBl>NlIG#5<D4>/
-AVTTZ 000de7c88c7001202b3 Page 117 of binaries1.zip
>NmQLd \V8^PwC<Ka=PyPM&$icu9C*L1BNXKma8q?P6Z=y%ICH%ApK/tiPqZGJH8/!bh&cb8I$A/L*XNN*l*9u1
tFajC/ Gi@AM11+#p%^uau^6Ltb6>cl4Gqwa5*YtIH@?LqTYZ!eDIBKZ/uc&#8j<A/e1lM=yaFZ<^QiD8pA&TZT
l5IR&h <IeXt/m!6DbnK1GiLeZ5D%8@XLqV5n>=8=iJIDGRp$j8H:\66P&MA$&a@?TqP5B4E9CcK6Z^Z6LZec>q
nblbdw b6K!w:*#D>=Gq\k+cZj#j@A$eVMw#9\HTEpXJ?C4AZ!b$^Fj9AXj8?\Q*91Xmq=Nh*V>C%tLT%TSN4p>
DZW4NB HKKW*yi?l6!GTEuqQpd&P&?qm/M>QDlw$ma\Bp%i1T%NhCbA5$D/G94TH8KMIJ^eubu4+KX5I8%8?k?\
^eaAQ@ &cat>p!d+idLF:u51\=i4LPIy1aTBL6iGk<ehyMKMK#1E>&NyH/>m9dk&wH&F+^KbYLN9CPiJcKL1BK^
1e&i:t lyWPMnwXc$TR*VIDpB8qpG!@NlNhCTDb^DWi:4TSq:B1n<=&j6A4B5RjS>P=QF<Q%keR+\leAinHKqZm
4JdEN6 aRDKYpRK+8tK*<C@F5i>A:R?*kMhnZmh8RPLPJtb:lXuWmjG$b%kpcnWN+R!ehBI@KJd=JYcVCV$>Y8L
ca9DVP YZm+C+T/k:+EtG\H:&IA^%yD!<B#/M:PVb%^ZKewdlP4EkqAkYS*E\JN6BAKHWntSn=PdCTE9qRLlL+A
F*6J?S R?*pAGm>twdC/TWD4M6i<S\+=$5IW*a9Z@FQZ8p5Y6LS>P9DwKWZeV$m#a#*q4+&^l6:KP*kSS#+6dk?
hTVe=P $hkB<FWk!<:ucL5A+ujR^l6/+8P>PKMwL4hdd4@#EkQkJ6RDW!ywbRDQ!aXY##6Nk5hk1=p>Pu!yBwSw
i^%16> ik\6/<BtINpibHC>uupd&$^R$=w*lML>NlAl6kQ@J8&iY/#jaGpH@6&XGV?LN+4ZCPyX8:6*@5tLZ1w=
FmlXI: dFiVCNEF!aV+FJeLD64GMQECRlMmuCM%^6NG\T/MHSAaSC<bq1dAKK$+wJD8c8P6ZnE1EliwF^\n5qBd
8J59:d CXn*#bi8Md=i$+P%tSi>WJqy!6SlmTetui+\@GH%pqGyN?Y&RA>t+Bl^6e4$l8Fq@B1^LIk\DMEjnN98
$nqnYn FWSZ@lWHlk%>m11hlBhR?Gy*MFI4<EiIFK&<?PWLk/tdtIht#iZ+jR8q?HaFRXQEGpZ%clQ$Tl$$lX:I
X9G1:# 15AhbY\:d%WN/R!hc?Ry\!6GY5%W1\TPNPAq??c^jlRBwh:a$WX<GQ1eF#S%?CW9j5YC#XnZA!@H+1C=
P<cbqX SMe\/ubpy%8eRMRCKd=?RNAj>GWpHEC+M\II>6?<#T5Gl*Gd#ImebTm%tdHB><u1tLipG8@H?@E?AlWk
Vl?LJC ElW!wkKX4PtkJTAHFaAB*c5kauaV$eFI1q6X*XaEXC^tjTmY&N+cFASGI8Pch6wKLAkA@M:d6nGpR$+E
TXKc@1 R5RGSt%m:KwbB6<u&p$ICmN?pTP?:mD*N%DIMeIMEQIK?66P:HA:/eNkbY&RNp1bSAbywY+cGRwWLHqi
Kb/qja @Sa^$WmMIFJckKF?Vq5ua9lTeW>=l%iGa#CC^+H6J1IVE$NX5+\%m8Y=APclB1Y!u9eS?@wJZBFAEyD5
n%/^cn GmQ6&Iu>Q*CGWe9W!n6CnIY5uMEn@t*?kLuuVQXd#4bQB5yPJ9bCi^A^1+&$CIIW\E#EnAJB15^kMm+R
BIhM&N 8Mt:qK/TLCaSCY$#MR:XPlAc95c&6SQ:c>cA5Tb84^VjVydE<m//PCQhli?Y\RNGA1<^TcL:aA+S6\t:
1!$4^a #EVApKk/4M8FXEV/5q/uA*H&B>&1n<GlQ1bT/emL=jDF9V1PeTbMADd+QFjSHKDMNV>ES%TRl?8DYh/S
FcSRpT Bb?Fj6&Dl4=>+$6cFNjJ$c/AC*PMV6LDI%yY%b8pcCn*SJ^CPad4SF%kpWamjtp4w%y6kuVGJIZ$KV=8
BG*!95 P?en>9PFyK%ZQSQu:6:S$j&Bk@MRGhi\S86yc!DYd#R?w+imRwDBPMl55IPHE$DcuSY!KkemTy!$yw$t
EcQ<q6 M&SwwA#I>>j!jlLjpJDDJ5lY#YbK%&WG5#FL<JXuuE=p#tZl:>ht1%\#Hy&RN=5km*/i/%RDTVTdi!9*
%QjJQT Bd:6#Y#mdVTtG8nh+/MHYy6Ptk<jNy6!iPwX?G?88adV<JqWZH?dLkB1$yuNpEQut5$tA^ya>EDibA$b
V+^q%Q %&H+ZPL6VYa#1BP/+:m+@b6NG1mQ9#yVLp6!=Q@Z+=$Q>e4E8d/CXNK51#EdTBTIm+<PhRBc#DwVSFGV
eDbuJ/ Vuk6a#%H*1>KeX*\c+bjnyYTXL/DHX9QCpeN?+J<cty!!YG8MbPQDk5Dc:a!AA1NkhNa1WH1$hEHPBP9
kC+V@Q p?Jd6EDPX5I4kVuY@\Y?\w^>\hc@e*B9@XFVD=<cXpBa<\Lj^%!D::<t4&6FJPR\\ehkMlp1DSyVJS!e
kqpJWp Sk\DTC/Pm9:RB4I\aP+VjFep+B:H+65/&+V*b?PLbXp&6\djTAlFLuu^K#q1PJdQHTP<^Jm<iNn!StVE
Qj68$C my#yLIhGX<qy1MwPnT*Py<Xjmw/Pm*R!MTlNjN<d9t4PyQQAN^KT%>tTE5HqGqlhd9hd^A*pXd*+mpkh
wL5?c9 9mmVN%kLmPBemnnWJw&>YwQDMHK<X9PbN9GbeZHS<KEh!NTGV5By%EF5$$u\db+tuY$89n6dl>ttD1^e
5H@KhS J<KZbEy#mh^$Xkb<KcQtmh1GVPyt+81EdS\A9SRHQG^\MBGIGlMDu!e/MRm6W!eGF9CNt/^P*Q%GV=%B
VVa$Sd iFQ=A?cFiqAttWhEYPyMuF#MnM8<FH<JBydS1IuX#ma%ERynMyH*<Q%G\BkSDGQA>&@4HnDA*NlMNW+/
kyyacl pLpJlImueTwEqAuERREWZw1PC?^HRGtRRI$PcMWZM\JLbl*FhACSL*X>mBA4ldiuA=&YN&MQJ:Nu=DhV
lP5wj^ tG$A+FiBXuLEZ?1MI@@%bemBIRj?@@+jcN#?F@?BSk^%^i@?B^w8D:+qd@+D#ZL!R+p@I#>+=:>@R*$j
NE*N=I y<dalEcn5Tp^$Skd$^DVS9QWMLF@nD<d!>hbBVW&^kR%eLSWu1=MV#ZSanqFnZSydGl9dIk%Jnaba&PD
/8Clh% /8kan8bqaq1il9XCcc^SF/RITtlW^MdCJ!cw!b?nJjL$WCXHY/Yu$p1waS*WENMW&>VPNjb4cpAaMdSM
ZYFwR? KW>NW/cH$9J$kPFtVeeE^VVGNHG^$llna&\5T#9KqKFKPW&uy<yCwaJLR%AnkEk\Nna&BeZY$XDDRb+8
YZn>\C W/cu!&SKyMI%KKa8CJl4mw%6bB5W5ZR5S#8p$iqykCwhRa#wSVeGGaGXtEa?WeG&%<WkL>J$yVJh\+Ie
WnBi4@ ?49G?MeClKct^Nna>5cE&IdaX*C=q+N@VB*AdW<\^na&6yI4RdFBAKjJ&JCaWIhZ?9I$*&kNkk*mG=1M
8dbTa# NKZ5lI9>^DGNC8Au\SnE64?tSVINZ8%4F$VH^AK<S1MC?99AML\+&I+P1164NCLyRI4eClqu6Hl4mF%M
+E%Vy> ZYMm%8j4PNw&Feai6DLNe5?FD9J9TFAp<LF\Gb1pe4R+pGHI9Z=BDWFBDY!D5SG8p$<&HT:eG<nV%pCD
4@5@VZ j&J5uat&qm8bhIdJIZV\Mc+kH:c^WRAuw?pWGWjcDP*9H$R*JCym&&pqpABH+LaMcJdclVh:$@=BINet
MhQ&cw Yp+\KbY!qHCPwenN\Va^hVFB\LIeYFNKbQR&h:duFnAAQQM$l/Tu!uJaSlT1ITAyMCM4j+W@Lbh#Mwte
/SQ+!& D65J!Z5&R>wN5cFnGl9bhqaP^kl&S1ZDQYAP:\&EBC1twTp&NW$D^IRGbuRCMnQc8T5hFA5cdqStcFJq
9T1nG< kW!aN69MTCa\VDy1j#lHP\EDMjL#aVJqiHyGiLmbEht:e+\$Fj>b^ZDReB$jc>iw#YLkA1PE6qbbPTub
H1>uyp 5nAkkS4lwkSP@IQ&8?hw=ipbt4RMM&Pjp=#FMNjc5jqITkdXa8#1*ZP!\cVyWJCPa#mVqb!mVd>L@4@G
hYt8\T eAwpaP<jhCBJHJciu9cjRBMA!MymIw\^=LbLGGCkG\KTW^n\C#w%HLLKFH9tWmJyQdJZclyN%>GBK9iJ
\whaIJ whu?hCnDAAd:4PR5Lh<wWCAPXaKpBkXPWGuV=dR5QJ#Jlq4Jw>!9NS445IcdPD$D=Ppau8#8DlKmbhpk
Ae6/I1 BPA@PTZBtIBM86quKFPB?WBG4M*tcJE<ue9tGc5Wh$%Van8S\mB6cCnaDHPF!RdQD\wND=WDuktnLmea
NqXbai Wean?I\B!uRqWGi9BTu/$/uyRENPmndY!A4*6RM!RwE&FeMw6ZThHC\NlJR%kPXn!Q%BVLk!LbVPTdbu
K6yjqR GE%RpE\Y15\I#$qydDLYES$PbLSMYH4+#qEVwAIhk%/WDi$Vt^4SAIa:MNuc>QVWuC68KR#D$Zcy/cGB
u>F#m\ VIy:I%6H:INu4DQCNKFMqm*HPKVK\ImlhZJYw6GE>5k^jdMD$<NX1lR\inpEHdteaTatNyKdQNNZt/GX
y1:&XH MiJp\K!l$<PWTtCeTTBG#nK>R?XZW6^WVNc%WIl/5nTG$edk4WHWBECqDh*GJL9b8t6T$<I=JYh^Z!A^
NiQ1I+ Y^8i\mVb8#PlwjJRmJTlF4j9q\M*NVqJnHyCXpbaimlIWbuSjY<W+<=w\4QTe=n\:QBWECe6X&aI>/ke
9AA?Il n8tXHuke@@XjcKk!ZBM4w#ManRWjYFd1ijiM=SM#55P!qWGNMit!eM8>bQCT%QA\?Zp6Le?tW&Nmt?l$
JmA<bj C#:dWYCp<9D$hIaL6R6Lc%DW^e4pGWI:Q4pQe=\PT/MDM?nAXIncMZSntAYj%H%C5pdGKb%TqcFlhEMM
n6jCX@ ?HqMIJNN:nqj!ZLZk9RBWGyBW\L$TBLFw^!Cd:BVT9IXDRdBWLueQ!cPyTZ??\XTBuNM:%T=MqWD4T+%
1kN<kQ aCST$5bpVje6Gj/hyqVG^MlVqVRht^kwMMA#jdRa:iV!WClq6Ab/wwbZd>*DeJiiVnjKqXpV\YcD&nZh
ph:#ee >=APbck<LV&GDuSu/AVctEn8kVqIIHcC8#tqy#dYb&YNPlhV%>TpFGIZNE\qeSJ$E^RI16R$NAW%@q8I
=aiQ$* 9&CY4nK=DH5>ByTe&lndqCkVqMCA<JGJ5FARjyb:8n\^\XlZS=4%bXLqhKw!XRaTT<>^%+a1L^tDEq/n
D=BVy# lapaJW5:!%QqDBlpFkN8CS$J8hNHm=$JRAV#C^<FbIBRaw^+S\LPCh&:a/k!B$IW/F=JK^4^#pCKAYDK
ipbI+Z WDwnm\quWwAI&y<$/i?1ShKA=:CedCaHtE4F94PjC\BFwtWbEDiBwc!Z&AYKkZ@Rcb1eTaJ+j##6ySC&
6<5u+\ dYRkq6Cp=DMeI>Kth>GWDH&4Q$6d^cR1M*LEWNe>6bPt=GcmW6ySCh%WcNcEqFHwi&bcLKNVVRR4cM!j
uKVQ1F yu<Ja:K$!hwMSwpI?pA/EBVn9!?N!S+%H^1<RE:N6J%@nH8+=5pX<AeVLTY>HwcTRV#6BFaTW=eTV56!
\Xj/48 RGy!$B%B*N6M&<jI\4W$jYyRYG41T+EYmBeKYew+tn:nVm8:cAtKq5B^Ay:pkRZ$qZTc*8pPWMSKPiEL
EDTPy9 ekbHYX4kQh1QwaP&8ce1pTDwby#pGytG#kDquLHYyELQbaZ!R+ES1l#C\S+#5wC&<<i$4/HQyJW5MVuc
MQRI^\ TZ5JXDABJL:#8Dah8#!qmCa>H@V*n8EFEE6#^6J$^nF6hkiN9R%ICqwh9^$n*\c&JR5@#6AcbMeN4wbj
CuEe?5 1yPB@hER+:Vb$HFLbHL5QwVPEIY#9B<6e<@PwPWRiNLV\R1^h!eAq$>?6M&hCW<NlRCwDLWAhA/jLIP?
*uh\4J D8^Wq1*NpIPM:hQRMPS!BDkaKt#XBDIb+W^1NmR*Tk%pWBSS^HBZ&n>RE//Xb#Nykh1M$A\bhNhT/ABy
-A1=Gj 000761be4b7001202b3 Page 118 of binaries1.zip
1C%%8@ kuCwK=$R1GY$<w^p@L?SDKTEHDEEhDZI?Q\*c4NV$<NV?8*<Wy8hHc+BtBRwSmwnjiII<Fq*<I$MJnXN
@:t5Nj #KSubARCPYF!qHec/I&mlk&k&?9CIclA#A>Ma4Sy+S4w9:YyT1LCaT/$wn$\QVXWCZ\qMSqlYX!/NIPl
T/B\#8 BVMeMek@yqGYDjHlCp&9VetGdAt/+BVptKl5SD?/KRdWy<^\B+&/M+^1al4$!GDI9F\5WNeWY/hM#\dq
h1!%DJ BMtTSwH*lte\E<Fjwj5GHBSmmG&IkYm\ZK8JcRyIauLTNiEyY1ZTau^D?>M5u$DLh?aw6>PBn$c=8\EE
\*+lYJ ?#Tb4I6$q9/RV^5dA?#VMly@ttB4t<Spl:6nVCA&A>kdFAt^CjYn$nMKcMw6Tb!W#w#KXm1Sjnqt*G:>
wy&:Kp @SQby5cGID8bQE?YJLcFDwT^6aPkDkp\Y6jIjnRpXMcatFBq1Cd>6^R*6%EM^BPILNaR4ZBkMH\kuYB5
KihAFu Tkl1mptn6e\B&?Rp/LhV5nVKNBu^<d+$yI%GQua@HdyJqnbKuA\A:JuZAupKI&d4ncC??plXqq9YFVh*
kmHq!$ cAj!yIq!*RdV@wpNQPTpMjK$tA8?VBaF!R=p?/EpV!c?%n<&McayB9K1$E6l#?%VpmE*!kaBED>*+?ml
9<B1Wq 4DGlpad$KT4\b@ee6!SdJq$tlDtW@pmiH8aQK1IXRjLRC@J:+m6RAWI94W^F:nByM>PDG?5cIDpQ1:?S
P?=&yu NGGC!n$nHY/l&hPY&$H?CZX%M6u?mC*mWddkIGpRkbSK+tYDVZV9IPC^L9!85mau?aw:p\%RqTSXMhGD
i@Z5E4 G8uGPn4%S9bQ6w\+T\!=L8E:Fa$Y:5c!MdF$cMTVR^VnNtGCFu^N4kT6ke!HtGnZIH<alQ&TYu<8mWqP
DVbiYE VkqXk4RqcP=D#VV$p^Aq/iD\nt9d*MZW<VVwX#lBZqBJGccB*4lQ&mZ6##uJw<DW\E&k$$qNJY*FwaEc
uTTRq1 nucP!d:E%N8PGyWF*CwFY^<CddXbYlnBPNd9CC>W=WD?platI=a&Aq$TBk5R+jwE/S=h#kIql+cqyabB
R+1XV6 l/aEk8H?pHAGY1V/B@$cZu>6T+w:p$a4=Yubk1L^jtBY!wVp%Jn&^w#>&y>HJcX4Gdp!LF5PtkJ^5HR@
Zu?!Ea YWdK$1^#MD+NB>LE>6tlhLa<R<5K&IjIh8a\:9$cEw#!G?E^KuetQV56LH^eD*buCIJbYSwaV@%HF*ky
45<RLQ tiHT:WLVMnCWYdDL5mD!cG<uGGq6%:Y%wKjAeC%n4/FV=Sd1J/T:u&Fk:NtaeWkZaJ?TpR%HTu11MDIA
Y9Pcp& Z^pT!IR!GTty@4E5EnnKQm^ny#8VA5p$WICGKA95y=GH81eGNhLyN<L*J:qul#HJVAypt8paKMDl\!B!
nPi!ac KMM#cIYmLmNCh8pKye*ITIa<PV$$G&yaaec@Z5QJ?#QKIPPl5QSHiV9hM=k55V&MF<=4ERc+BYTeTnw\
h\Nd:I MNY@EebIHdwAh!&nT4+!CyC=A^p&pF<\:lP^j?\Vc\#W*5&wB&?%6^hVZ/a#a8DWKl$GlR^ny99/N\d>
F#n!Qn P!M9QAamWlKVAq*\ql\\h!5M&w#GSQhSGGQpP<ILXQa=:mBb>?\5Byydb\AdcSQBJ8!CGw&Q6I?8:W!B
P<F9KM lNW/K\WTB&!8SCc\iSAjXJjSESFkC/aTutQ9ul!K+!iIP/JAh:kh/=@\KLSAY!?iIM:P!FGqZNFm/%Tk
?#nKKJ LpYL!QpGPSQE$G8yLG*&qYR*>:FkI%ckVFpKnD^:^!VWy%>:etqdTqb&ik:k^46T<MlA>!//n#<E#QAL
aAk!IP khC#RcVI&JaVnwa9lj/BDP+dJW$$$<E^hykSR*eC/l$mlbApk+//X!N$JIe8BVI=E#X$q6bjB9e+yTkR
dV$aDy &9Z&V&mm/%Nn\nKT5tZyVF4RI&\HBAWil%DZ+NKiEFWZty&5Vci#NR$MkctWB&4kZwKLj$!DZLdVHyIL
djGH1Q tYI@8WjL$&TykK?ywd$yAe\mC*wkPnce*EPVk*c>k6mtlDwalwuh/XV@GQ\unaPlHVmepZcFjL8Pqmi:
w=GKy+ R+KnCMSd@WZycc<kh\JwhEcK?$Tqj#*H<NRATck!ZhNP&?Q+WuaFi4&ERL#iD+d^5qikR^lWl664qj/Q
:p\%/A YLncS^I1D%P&$hKA4FC/uwWSJEZ%EkPy#!H!yKVK#DB?y/m?p9VRMA*WTwY^XA4HTNK%iFGyTbP*RV$t
Nc@6Dj bSTMS:QDRh%>iLpIp\5yDlDh#R!9lVSHpkdD1*bcXIhnZ*eejY8#R\MlZ=Gpy&cHGtq^WJMMWCe#MK#u
9al#&Z M=CE\SJqlq#?tyap64jHR*/bBWm655QCMG!AY6N\F5\1mK&L>Z<EETwHPNFKM:LSG1XyGWyM5l\W4F\V
:pHjP6 %Ann!JT5LJc^!6DIRdWnyGGyJM8^WVVR54Ca&HCYwRA4DDAD$#ZRZJIY1M\&$!IeYX5*NGK8D/&66hpc
cqMYJB iS4PhwZD&Bue\b>9CwR!IWlwd1QF>llX1DR8%AG$#nc&y&cE?VjWt^q:kBGiLW<NSRA<$!5$P=%Y^Cbm
bGB4C! 61CJ1YekK&ebt\\=nBX^T1=9wC\Ml8IJVi%!:BEdAnHCA9imMC&ZLkaR\%\$VDcV:6?PKW^/8u@Cp!:G
ib4w+F Nn%dBpEJ*c%ZiDwV1p%Iqe9V$8lR@\cGeVe^NtE\DEkH<MPe5=p\mGul/huyem&E4T:GLn5$NC$5LBVu
>m<Pw5 FJ$#kDktVK6Nl:+unAb:ekL5GiHy&uSqK4aj\VPPpNXqMNp\9p$QVA\$M\:l$ISP#!Dw*YDaHB1iuS$Y
byI=pN tlccS5iAey!$DA^dA&F\yERBDSNDNkm=5*<RDATc#LRnYGNhEB$nT%Pt+*@Yb1nLj@LTQ>MAq+PI!jmD
JS9QFT q:dL\<t=D5:bWNBld#9tBt?E<XeCc&#qJVT$G&#NZGdun=1RdGV+dFFGKJjP$%cd?Dw!Reue:=mRuITl
PT+c<5 !ubCnqlLk<wte1E&GipbmZWayTZM@b@9e:^hP*lXm9k!#\QdXCLH&#TG$wq%kYkWVGLNjbcZhq^Jel@Q
<b?PXK <lIIM+p5d>&ij4phDbLeN5QqCXikq1SD8M8tZt/E^pQk:t>\X@^H%tGw\+a^mYdi/5@L:ZK$e1Gq8C6q
F>=6Zc 9IpZB&dk4d4LnVLl%l>+1!N4BN!1J/$/L4eH+1$WwSYduAm*&5t6hpLKIA5!Eb9V^a8=dL#DEnKGYTM1
?Q$VNI u9juiP4LL6:yQ$\m##j^QE6An4SQAY\<9^\8Z8Z+Z8&Z?a/\nETiDTR%bFlDcH<FjuXRI%#LltcHR+%R
hGu<1< cHIbyVS!SA/BpR!@P/Ab\+A<5/GGDC+IYJ#hE@>^u&iZ\wW%QN?ilhcBMHIT8&6ab^E5YS^9FeZ#Hdwt
5#!mGD nyeGRk$6qKRGm4Q&9wtZj5:#ZV1YF\WKQNbq+L%SSGbY:A&ij!VeNFucDdYIt6!4j:5l8bpFRPFQ449l
@ydC$Z j+lMFY\+*4SA:Z1ubd8qyRZ5w&6IL6\MFZVan4FIMmH^b:ly#eDNhk*NaXP$DF1BdWhInkNYq4h=^PlR
#Jbnpp Zq>!&B48%>GZ&<N^:n&hCBRudEHp6w?tRm$WKA!VFHXa\X/Y?DPIDq\$m\G>+mw+K:NWcN<JTuhREklb
\H#\9= :w^:Cw1m*hL<Mnaj=lBItnPR6#F+6#/\8&$+MSki&$J\wt:A#X?WeJPnkVZT%n1d6MZ\ie*EP/YlGhB$
n*tnK@ WBByP<JBT@A!BDRKK#SRcP%QYw?\WjKQpC+I4hSqq4i1V=MJ>&MW1K#l%ttJj!B$M$NyeRWh8k@+5+h\
KNmuS$ 1<DES=AuhnG>NapR=VHhdAVpMjj4WP1&#Q$8^P8PkSp!8nAaQ!1l8@nJ+5#cSQaKS$qWpCidGGe6DPQT
W:tbeR 5Q@X<kl:8B$h^hjX$SCi/p!$m#?ClRAX%KDkcSKHbQ+al&kG#%NynE>+:5nVXCIE4n15=ARD4eSt+DyG
IyG5V@ qwM>Im*&d&^1n^ZHGB5:cWpkXB<GNaK+Sti&pRWjlMFMa^Pp@nEtYlKik@pH:iSQG&Q>nj+^$Np*^Mb\
k4c4*\ hX*aw/bRPB*8WleVBEPn^n4IFaJw@/AkM&&nVIelP1aTLP*kV<hC5!D<^LI+K+PV<ELV96mRdkTPG8kG
ci9ui# Gt1qy!uD$1H*#IFBKW9*naFw:P<Q+P9\J1V1+YFMPuVmPDm^daV^pn<h+^@D$VcypI1uyVMbtELk&y94
k6X#En chjV*c6b9WV@m?Y%6%dZ#qP8@?NCYHeyd1PePe4YqbL/WaiyMTKYeuYWm5VWcVjdMdd81nHLPK1Zm<n%
$eDaA# !qHZZlRqyWbS%FIXZQFXWbSI8u^?EmYm*PB\=Tu:*mPqEQwyni5!KWi=eyTn4c94TM4XXW4=&pK!+?I/
^?VnLL Eh1I1YWWqiR:E64$e4Gq:KTWcm*X%=d1VcXMRW^\@hRa$j!5PlQL5a@lCmB!yZ4h9<9jn@Zj%BADX>#E
D#X$*V aq6dt$i@Mn>emu8c$ASZKBWR$/@^Q<XQj4@iu9cE/5ZdP4piyccEFn?:Z>Tw+GjCFeyJSjt!^d59@QV9
#K8t4c &QBqnhnKq/JGuZ5e&NI$bNN>4y:WecWpj$a%*I/wjFK9P\l%:MWm6&HBSWYQY5a1my88E*yW+9:GS/&/
He+=c% Ve9d\+5iE%t+Ww<DY#h&lp*aXJ#ZnJDhKNZVynBn9\pu8^=%*CZCpN\P&*@yn:1h==18N^NW$kFB6^?*
Pt@a\P 4\9S:T++YIl5Wai6/86&Z%y?bquM:WAVkyqA>Y<+GNMcWli?**R@CK:$wq#6m^19c#?&b!=e146NAD5%
<?C$el SG!KnaubiKk=KlJqKyJcliW>bXL6bPLIk1ipT9?<tFFMZiB/:hnG@RnZX8V$q<bH#cM$PhJ:T@KI&H$H
Pqb?DY L=QB&IjbRK?:%$RcmebG*M%Zc?&pW^VSlPC%@W=+ble!iV>hHY$1I5TI1H=Nt>c:1?j*C91X/EFK>cZD
TI=#l= :8a6q<8Z?@NKAmdJ/n4*SLN1nCmwNaFkY4yXt1X#4/hVN$cb@EtXCi5dd>jSPjQFHQ?W/I:ccF@+4GmV
^\meA= @/\C@5q6AT:6+X>5?Kp&^TdSYABZ^JSWc$e*@u&VjQ=>jlQSyqm$hwa&K9myepKmma$qFL6>:/e4L9AI
hHZ#EL @Lny1j<namhmnY5P%>C?dI8Sda>Ct/VE18Wd$%=@<NNE>6h:1Abj5jXZw8YtAV>G>PWnGwk&Zhe6Z?/=
6@dd6l /&up^4IEQ4/SRHdbK8w@4@B&iCSLN$WTi1^5V+uY/!=EnL4S$j\MIW9:b!&m=@:$%JNlFRtCBR=eShp?
QZFu$^ Kd:%tNc%N^B/jJ$h%pXN!XY5QFN!Q?E^+YL/58WjZ:$YHj/+wi:/W+S58?8/b6@h/MdGSae++$ECS>d9
CcyHJ: hFy&Jl<SYKWL8pFMJ:=8<cNH4R%=K@a*NcB<KNG/mQBjX^ejdFaY%=u1<WyTa%=BYHH4$=c$Z:q/Fm*F
k1ptdj LmL?$VPiK!4TNpee%MEX1TS!SeTM^wkt:8Pw?+F*5bXNXH#i+/m:V*=XF6V^9?IX?>1<@XFhD&<Zy@GJ
nEKElE DJHQJ*ijXQw@8h8aYMp<+hFM1eH%m1nAG/HG%u?%*4*>P%/=EF5Z\#<=W*#RGQQ4I:Ri6<q*I6I!m$TK
dCHpqP G%&QtlMRnuTGajQVk@@c>a!>E^XWj^>dKYJ&F?b6GDYV=+6da^tW^4>9:Mnmcwde?:Y4MccI&N!>81Kt
E#wH>N SYQDG$^N5W*?GB>EEaiiilb>&d<+5d$^lpZIC+yZ#H!<@H#6+@8:C^6q!Fj9KlPMB/V$y6ddn/NmbZDF
DEGie/ JycPCR?c@&qpaqh4HhMKX=\iNV:P!ey*8@%IX*k\<R=e/S<ym!@!QFMRqFlpctIR8<>>$+XqZ!#6Y/hy
hll>k: uXV:tIa4p?5tS@a?P$+Zi/naGJYAd8\jW%?\hPW9\^:4ut//1$NeujhMhd+cn<YSZZtQ/yw\#kR*QE*w
-AZ4bM 0008cfbca97001202b3 Page 119 of binaries1.zip
JX*ye< :ccNLXS$QGQ4pMIPlte1?&$i@QnJ+$%V:nZAqXX<*Z?auNH6#?:qSdc@SGj1<D@$+y1/JDNY^*deCDwH
jRB$&5 X\/chDjyX>edmy=GdqLY%<KXG*Sm+?:<DiENm5Kuh^P^Xj9hmm%DekPdky+<u6G5Rj<14I8+E@uKa$Qh
=AWF98 @5iQ:=uRt^+4u9&eZVT=1&pV&@lD+H@kT5Jj/amku&=>H5Nq:>:j1wA4>ZuFPX@9e&m@EXEe$*kZJi<9
n6tc@C c:pXXP>P6^e>>yj>kJDd4*ieu9Fp>Q:CG+*6n%nW8&Ltne<Wi?@wFF*NW+\!=K9kYNeG85y1<=?!8/bk
?pY=Vy E@LiiP:^yP#\>l&HVNpZI8#SC==>6*Qeded4wQ>e$>Qd@A^5Ndb8$@LGFTeC/@M&@XKHNEe>@uLn:ZHM
WQ/BFW *1jN?=>GHaRI+HJ:jq&>%a@LN5$<8GqtbB:/SYQ#?8dFaXFlBZtQH??9S*?@V$@J9/cbGF^9nI#aSH1V
$aWEPK lqjNK@164d<y9=S/>%qDGF#bXF5eZ@FZn=ZZ/^9#wBJe+dy?YEH9QL/#LtJ!Z9FnDKG*u<:Nh*:qXiBS
ZS@IIP tNbSFZpIbYm5d+%k#1\N%Hy5mu%<Fc:\CiE*?*eqj<HWDZ9<T&R^ane!!X<udq5j1A*h%X4aBXiiNmW5
^^Ba?R @8ZSKVjNq^h8^#>G::/j&HyF>5#*C+>S+ZW@:Mi+$YVm@^tacC<cXJ6*KPFCBQLPN4j>RFQJ!Y8uZE64
GJ:PA$ 9wi+:9Q^JRZj86uMQ%Jp8w6%L9CNEDL?dnW^kQbjZajTiH1hc<^4*PI/$T4weZRm!6DI6@KFRS@cTiju
tnpacX Sh:X:pb>GSNdt1>@w==wSSjYN&CM/8I=p:qle!?1>@ZHB^NR:#iK:!jin4m?Mjt+LnL9ZDBeihHW?kNd
$Lpnb= pG$:b6XVYWe:?1Am@9:>Z^<@:p&=i^mHFKHp:#caDyp/nKYn/QcXV/PISZZq*W@R^Z%:!6X4j%:B%/n*
e5lyi% G>ed:4jQ?Y*>5tH*P&/kD^c@c8ejFhW@V#:cpSV+C8&uRZFnQ><c>L=d4^Y<:kLcV*6>??%t*i+:/?%m
&ua4EA \8<%wub?NRdSCh!N#e6Et!J@mMS?QCd9Q#@Y/#bpWkPZ*++yNKKeD<4H^9QNP<a8b@NYQ=ZDFX*np>V4
$d9/Ce DQ8Dm1F9S<^E?ZVXc^iP9/>y@5KD%pW<\ul+PXE>euq4%+8!96hy6R:q@PVQ\A\d:puM9##pHa<QIchS
RB\l11 >%8Pjl*Li4j%m^#<bT4KMPcY89b+a>ihQctV//Fulm6BVdWV$lKnkp9eu/!9PaR&Q/Nka9k!u45le$*N
>?e1d& G@9^Bdk!wPHjt>T/^HPBH<jMQ>YBhadE$iE@Nj%cEh!49*d>LiVW1i:VQPc&Wh/kc9ah8YadS4b+bc\!
VG^+*p <1:!u*@y&#jJG?P<FZP4LpnBF*Z>QeJ*wpMPZLH?1X>5=L>@jSn?>+u>1J\58CKJQQQ+i4GyPGcuY8!1
=\CIc6 pGJeLXIG^V^NjJYSd%>An%!QX%4yl5Id^X#n9l!:L@4ba#T?4au9c8i+ynqnJ/Z&?lT9QE4J8*FhWiD?
kHt!ba K*Z5n+XK9BK:41HIbPIMu*:jc@&bjukq<GSZW#n:KLyl=K1NTR8\>+!MWND*E@qB6dqnj#1DuQ4PtH8L
?KDuJ? D:@B@@9ylyTD1#!\%dDRyn1?/@GncQ*l:DR#>mD>=5Z5b&:\*L%d51J9T:DP^hV:^jhiti+ZQ:c@pQke
GdYWjM /#n9jqJj%>Vc<Dht:FNNKjbEIy@mlNaCnnN8VCu<FdNd/9Q4iZu:PlJ=$/Qin\>l:pw6&tVpE#jhcL1$
GJu:mR NEZZkqh5Je@8inD<\c:jd>HG6ZlqnNYty^!j>?#?*VD*T=m&PwyH6%#@RhbS@Kn>!$A#JNK<!Pq?e<Ln
nSpS&X VZt6H=^YqEJi/<JVhuWJDd5:8KKGQ*i^JQuld<idtmKMujRX*QRGCijS<Mi@=pYW*A&8kj\b\NyJSapj
JYwlaq NSu9N6^R5bVIF9N5Z>&NtKAu9@:YSVua1KV:Z#=8X8#4yJ^6yL+?CbEJ4TwVJXJS#6cW:j&b>/Pit\E5
ZhMF:\ S>qb?XEiV=99GmpuK>6SM?:hNZhSalkyPN6RwmHN>*?njKGXK?X19hR6KIGZ&4KWXIwW8hmI1BG*Y!mX
K*V<@T 4bpTR&L9dEXJq@Qj8JpwmT$pc5:YS?e:*Q?ZK?AWI:YP<>$Wj+mp64:A4kkGB5C!qYMTSjtJPawCBuyJ
nXQ&d$ Zc%<1VEeJi=F8ZGWCMaF%4a1/TmSG@^qBjVMB^15KLj=MQ#kEIYdGIFIiWy!!1&ZG$6lC8q1+\iD>1kt
K$^F^: D8iFun/HeaYI86@Bm%pepQm&<&K#m4Kl?4#mAd\DJVH#XGIZL$yG=*kP&dD+nFY@mi:$a<WD8DL?N@5%
kDpH$h T*Q5&58eQQJ@cXLDFSeDd<wTZ?Q9@wQuu?/w\T5XQN?=eS:j=en#*P%@Wd*5Qnj\9FpMj:*kiHH^K/1Z
KKZ%#S FhdykFE%NSm8*QkJ46l<DuYP\JYj+E4DC/1Z/QMK?A8umy:AFbMi41^yld>5LFh?j\+DK^j++#L<9wIL
dlCpZ? Swn?Ilh56Ab?H?KXu=AJA?@CZ?cNdCD@mni>lm8jX@CjRA>\8tM=#!ecMj<dd!BZ/A*ljHPmpVD^PV?X
HYk?c* 9<@bcmeu98KNLRJdc@l=HM>*<b&<mSD+P<hL:*QAKiL/GdGjk!8J*GZlTk6iMeCXiX$+5RBM*EJlAP8k
HbtlTL m56<B>bB6t!ALj6=ZCIQ%jmGj+Cl4?F=1<==@D#ilHYAbn8ZV$A<VY\Rd+a4t\lj4V#@=V#?T/Cab+$9
eku%yp pK>Q?KNjKHkhWGm/jl@w5Xyn+NYyI#ni8w99Mq::BRZ@P>>:?R&+<w\*F9H@EkV@+E5R5*W6#$cl^K!t
&!^i5S X9DMJAi+<wk*FukRhdZ!>y@<AFh?=W%N^miCNDR:QaGV1+u6pW*=iPWGZ>Q:8$TiK+GENBcNBhV8wb$>
NT6KNK kt?@#4e**u/FNQ<qawL:mS@+\k=?Q>?AZLk<X=%Sb&&pN>H4t=nYQ?DKpmhm/itJE=ej:X?XW*e=k?yq
+!p#&L L#GbnD#LH?R=EJuwD#BYCSn4BClFWQ+E>4\&Ei#buEM=TCkF#::t^S&?RLZd&ML4!>Wedh&9\H&6@%1M
nLl+l# d<uy/\5&!SntCcP=IdjF&CWJVX&w%w+h&*6h+Nw5Z+!8^<Z4i9i&QZX/tbT!l*G>m<NCZ%>d%iH=Wq8*
mM@@T4 >e6b!6YYEw%Ski8+kwPKIbR=5bTpN>RR9M%SP5cX5qX^FG>4\ppJ$VlKHBK%b>iC6d6*SY$LD/Ewc5:?
6!qb*T MGW5ShpHm5JF/#F19j6DN8*?n#<m+Zidepi$Be:<jRj&:Ti*\1pp$j<qHAkiS!Thd$F#ZL>&kS>FTV\A
&DPuPF ppm=P/V:i9D&uh5PALYdAI94P%k?@=>kEa5?yI/Py/PXdq9h%m=bG^IYHiHtF^IT6m<5c9jYZY+Lqh9*
i?*@%M ^8*BQ>^YKPMRE@^PIX8b<eec1dQjBJS5@b>KV9H@KLq%?*b5P!BIVnV1Hb:G@?@l@A<@c8wh+M8m6?<T
k=\Vde %LJV=NaD9Ki^Bdn4j\<M:4pIb@bdSG>VHB8&i!iBI@<9Y1D?:!pY4Z&Z+k?m\bLIuc8Wa\@\Aj?F+uhB
AyI+X? 8FGj&ICK>:w6Y&mBM1<H!wK*wJV>:/DaL6m4*I4YaAHn$\Nt%S5\Iwj@HSnyl4B+JSwVtk#a%eb8p>t*
ddIEyH hh6?Ip%c=N^Dqhmmkj?X+HyVqMW+8?Z$wJ5$eIZB@&hKANKPuN/+W?pYG4X4X^Rweajd44DwjY:SP/Nm
<^8H^* w>&&:kJ*CA5NDXNPZ14e6T6!/&/*CGXe6B8+Sq^W#F:<a!<$tiK&hyh!K@nV>y%SWXD5A*l\C?8+^abF
!MnIdI :*VdF?WYk?+YVY:>d**P?+*VTXbVak6*a*cE:NyBHaG#j<C9L?ZLY*/Rn&%4X4nl?X6Y5*=6&Qb>jt8Z
dl@^YV LSDXW@@?9#XJl!KHd^#8PBR:FL?BIq4+N8RFF5n@6&:8PM^^KB#DHIj>#!A9E!A4*1H=*@<HNLe+QHFw
$NT:&+ l8?YHZ8mh/JEKJ41?=bE^t:j8tjj>yXl&/uQ1HE>y45A9u1>kZ:CW9p>4E^1LH:Lw$%9X*aEWM4h$ewR
SGmjEQ WLA*hedTeHJQ\&qWn$YLZISuQwTG6nLq*tlRNnSCh=A6&LQ9dSJqm>b9wN=H:^IS^kmJp4hIjM9t9jjE
iddSw< YHn%y94&aIQRL^4X*aDejX6ei<DB%1\RYTA5IBDAKKtR6!AMj\eC*9$9EB^ma&Pu:Nt^b<4&1Em1P<RR
!yqdT< WBA\1Nq9RFE@9\MK:@+ZWDb\DX\ltu4dC6cDFRBFH6*&JhwLZ$Z@B@a%*uEeHPMh^:>><+%HwV^#wHP/
>t:kYY 6l:!/+Hm4d@5ZI/h&%DJC<y8%cLXNMTi>c8&S+bA8Z@6&1l6%CA1a>X<Q/k61q&\Wd/YEwq?BhI&WlJS
M=tt4N l@?!%R5ypZne?4CRqhRk<Ri^&@h6w$TT@S5Q:N6LYWqPW11*TDlMabCeTM/V1H:\9b!e1/kS<K&^%HGH
jPHIBX :^8YPy:\jehT=\P\kBl!jkSZDNVp%KbG/kk>em!i&*yT6?HKeZJ?uwL^qm%bYwGS#uPK5mNGc:hF6IKm
Gl/?^= ?yDGh6?LkBd:8cR9t!BTRIhCXq*5Q^NhAP&GpjQuwkJIwD:Ee+iNwpc\jRLj+S8^HWWN*w4unpQF$!q1
bkbBL8 Wn5=X+ul&4BCe9+9MhRht+VuVp9F=!l1bBR=#^WD@6Eu<h#bXY!k1ApS=H!j?P<ku5@I?e@mF^VqMSQQ
Y94K!k ZibIRGWiJwL*miR<SW%NJPi9JGA4$&+TPlYTepy$=RI=D=V<Rwp8d^ZpSm#q5WYGm?D:h+8eX+MQ:CE!
c9H+jV @JHu*TlQS*JiC?em^&y!@qe<n%+4!BuQV?w6eIBi!VCLLw=SqNYHq86kwbI%q89Al>Xbm++G\jp@BS$l
$Gu@*+ QXbQLV4/De=jCnyCb:H16PkwGuR/*KInd#mjb>HSJ*C?#KKnHDlja>FSJb^96ikI+QZ=#KInkNEu$/In
uajmuq 5LXlcw8P\I=Glqq$qA8/8&@SEZnZ&N$YHXZA?WiCnmSkF=Q1BB%Jl5J=p/An!YR+@>Pmw#q\*t4SEhn9
&q4EFb 6C<6PnwE=#1Ln9+EHZ%1$bEb#p>d=BbHppqBdthADwI9HKXA%%b*LNebPCh/wV+SRe>9LV\qq\V>N&W>
laA@RX ly!jpaB?y^L=WCep@uAiRuD=:ht#T?t&T4p:^t=^YQjbIwk*=P^@e>6/ahnYZXE:dBhkTI4b1^!/aL$!
lNRN^w iq@WZ8Zc1L*:FpV6m6wd:dh9*>d6P!PX8@hbK4>dYQq6m+4b>#>?>@ILmR#d:iajF4>%d+nd@KlhIa=9
:Mq&jp Z^u+#8&F!8n6i<NIk8Dm6*DF@?y9X$#5q?&G1I#JDN#<H!++LXH8X8:j/ncdaLZ6@w9WY^P#d$jW&\*j
Y/SLnb 96BukbDj9A&5?>4@L@WeF?$Pnh1:Zauu$i@<$Yj6%8nwQV9*aqK%Kt^*YGSM=H>:4h?C1L%:w9b8*cjE
?tT*F5 9Mq6DbHA@?S1Z\5F:>#<d!@&^%awq4$p<i$G<D?=*M*bRtZw%ylh?^DAj*9N!T<G<pB/V\m$*4*DeXXa
/p%9#l >Qb8EDadamIn6?/N?#?w$t6B%J++6\Y:\5Di*Nd8XabG8@bIP*wjJK#K9e+d68=@/$@d^TC5/J*KpQ?Z
hFPttk ywKS#QdjGRamI5d/>yXBQi^Gl?*aDXIMeX89*B<Xwh#:Q:@Vu@/@8h#dA1euh%/+\wX?>?@@k!1PC/Im
1BuINy >&#hHii&it8p<y$@1Q@&=@<DWE5DBBRAAkAIAGhXdTXh%M>/\SkAAABAAAA$AAAAa&^ybY=$e!>\b*A9
nQ9G<P dYFnL%BHWGFpdYq8L*Jqe&>%etNqe!>RS%BlbG%ydm=!e*JnLtJyd5R:c+\h%%uu4y$/G@8!YdeJIcHN
-ACYkp 000fb0371d3001202b3 Page 120 of binaries1.zip
<J&mld McpV8%u9hiKGPmHa*ZmhbLG#*6l4L+Fw#i#M8jiPh8/e!V#&=paPhmw%mXGS+R@\A+p$kElMSS=IILCE
L^RpFC @R8EKBYKau/$16w@$FIKZpi+hWu1+j8?e<:M8c@NA%Du?u49#Hq>:>e=\/y#n<\=Z55QJ?Mph6tH9uDW
DwQYYJ 6M\cqb:ui&@=!yG*^>/e89A*R\a?>>#Fj<C@PQDBJtP@AN?S%!P&q:*!R4RJ@9?NX#<Z5S1d@Y6&<NE\
P1uCL9 Z*4q&T%@N:y?+*$@9@9i??/juN@@&N#W#P#<@6ty&Z*:X@!Gp<y+i>kaaR@N#E:6lY5a\G@8u6&qRh#$
D6jm&! WJl@:^hQ5MZ<uX?cbB5de$?e1V*witJq:+P4@NYZhm#pd:*/Mk@#6%:cn9@jCi*S\q+Y5:$X?EAjkP8j
w^w^B$ w=Ec1&*mB&b@c@J&/98b&mTM?<Nja!NQR98@9yI?eWd**SdqNjd1mY*H?caGG>tD1\EaP^&^ppwumlld
K>N$w\ >&@$&=QAmHZj\>?S?9*9?Q8y#E@l>@hl#E?^Zi\+?$:qL>ty/ithN<CVYca+<KZK>i!q!pQ4S\+hwQ6N
ZIF=:t :FE&Wdu^^ep=&Sd^ZPCEKh@@6NPKA5Hua6tIuXd%TP4E1an=XBRF988p9k^ynTd:A99H!ujbX@WcV?5%
Pb4n!^ H1q\>18XJ+5%dtAH&APXJ%>eiE!$bN#lj5IdIp*>5MH4YSBM<4qAPIukKdTqpn6BIFb<J+WHVeGnYC+F
%K?hlW w5YZP6\NbIKDE6pTHBDQYmJMp$u?L:DGy>t//+&wXw<+K+I@:AMKW<pDN?^#\w5yQ^y/E94>LHbC5b4b
KQENWi N*5HRZj1+eQ:H%c@+L6lct:8wPL@nYP9*uQ@@b@nMGKC#+V8JD#:Pdb8e#NNw\h16Zc:QSp%wpqZ6nd5
8LM?!# m+Zuy<u/tdCPm*^uZ9KY5!^\KAiWBW?Et<Xmk95ya6<WRRTaI:IA46@!u%G+Wm<@:jDaV=aV:mTJhJER
VT=y?n Ht@:cbM:QE6EjDHlEdSE#SlwN5u=RSp&kDuqM^kIK#bEKGIkbae*uhmDD4DaWm!ebSn!lM#k/aycXEdI
wQR%w* WC:49C=nF?tL1!VaH*:AwkSm%4JY+IEIG&pVCFL=<=tRP&FHaT1T^GpAqnA6RACIPn#\R<FnAVP8AB1\
eAue4W Aui#JJW6DtVV:CN\Yp=HR$I\J=F\@ZwHJqC@jFjNBFCt+8tWpBEIu<j>pNDR<%G*TV:jlNZdjlD\WKde
?naTk= 1hiFt^y^ekFMSBQtE1Edh!IpMACY?I$Rjtp5Ey\aMY5:ueq1hd+VkikH8GSCcQT8Ch*hIQPAmbud=EKy
8j18ac EQLR>I^k5y1MG$:wQ$M/^EPuBeScYFnkVbVwCFdqS\<juEBkQD>^A<h9AiMAA^>kBpLN%HpHcPXJ\146
aYS!ia J$$pBHHT/RJtAnlp?F9*SiAB6RLb=p8k*<5w^<<ZIwCRBRJJAISZWymKmLB*bXn*G!CSRC^5<MMplW/P
p4S8=h pSjpPbLmwR#wCXVnS:V<d8HX/q!MV>=GXj#:m\mtC<IHP8&Ebl+SI!SuAJIa%E5@A1ATAFcEQIGSHqBi
P+e9!< I>&YGcAS?KBX>tRTbe$cH6G!CP*dAMGKL:QpIq@K$qTGp@\Rhkc!CbwSSi=^5JueRhEAiWtB*CnVj:FQ
iIXm#? lm6ATlJG9q@JCPIMjSIj!NYlBWVbAMS\nPAR>:S^+lqJttQ4Dn\G:jDW1wIY6WVSS#mX?AJyY>$6MC?I
AdakN9 FQIiNVQKq5Ae<&ZSIhqIRe$CH>wVGRkAWT1>5FaG88t=1MX#Wkjwi#SWSIWuIc^IMp=w%JZqI>IAeYW:
Vq+yLM RZ&RIP46y8VLIV:alkwNLG%pkQ#&AR6/wq#RD^EqS?P+D/%W$mT&km/uaC>SNHCE:!HX&p%B#JYpA6w#
h1J&<l kBAQ+R=\d8VFI$1S8p*lEnkdNIBNAJVpJVEpJlQXA8eD^yq5C$D=XPaEcIPJy\$jq81&6@QhPMIWpW\S
KGWnJ! HnJePEMd4K^ITBPZnb+a$#+B:NFiACSJ^mp/ZFTm\8mTXnd>SuPHkeVGB\kpnVp9ZI\k?\ckAn5ZtpI^
eJCYCn HmjWiwJakykkJX$kAlw*/PHdVkQFlVyN\B?#<JIVK!MKdG4*EweES4T:mDQjT:>8RtXJyn\TaAjA6VYw
%tY/il ^qi$@KhV#akAw=EhIG<i#/IIj44K:TAnp\pib1$q?wEhwm^$$$!JXdZ/8F+ib6TM>SS8Cbl9tu9unu6&
8myCGG :kSG\9>AVk<nGmKIXpkL=FI/wR%nqBV6ibLGEyW//dWCYRmMCaHk/BuZjYp1=FMilAXKWKhF$i<A5GLd
8l^j@# %QTB:R46CHFX+aAMFB!F89E8l&HyW?GqXQ>aYL+M8tGISJwKeaN&pQbMp/Z+8?RA\JZARIm^$NpkekD:
\S5l?l >AF:PI4VZaqqhFDYMCyS>pGHKnD*BHqNa\!:wDL#ZLVuWSLtBAt=>L:?EHnJFwIE<Bm%%iRl4Nwltkkq
Hw8t@y nkm!STMdnkT65RWCRD?qeEV#FWtKhPA=Pw\!Dp8d1D@K<=wFaH&^k1wFhI5BNIlBJ5l*q1AZ#DG4K8X8
/!dDE? F?T1\/\b<e!B+NbVJAD5NiV+EJtBT#yy/4nLBDCEYkFwV14R>j9kuCAn!l9+G>CKlhK\QwN1I46R$^TR
E6h%$m !\kLk&ILRnRES$Y6IBhkNZuW:CRaAwH?w6cJAE\PKIJ?bN5q<MFwwItkGpCMQN$t+yA1wY>ICcGdJ^\e
q^MXS6 GVl^w%6AT$9a!wLW^&^p1C/lAacIdwuCSqkH>D%LpZ!imCB^RV?M?nn/MJm@cd<P<hCPS$WR6AB@>J$V
IG#y5R QYI&XGWN$>w!l8Ce=5iR$TpWb8lICHkAXa+pGKBHY1nBYwYYGWI?^PKyDB$JmWecA#pCI$RDFJI<yHLR
M@5btZ ipFAGElBQ@55kQaW^qC<@\kn*+pX/qkKyelwyT#Kjmm=hn!9%GlRCw>5AFkhp8WaBDV!MSukVkc=AT!u
*LIRnM lP1j$P/&t#/RneKpenRKEZGk:wB<RI\ia?m8mce5G?kCMmaKHBj>+1!plBI/!BBFiIAwpCp\caW&:%*t
Xd6c:% y\lG*ccWK4:SmtS*$!EVVpmK=ARwqB&eGcna\ZAZ&mm1ZlJ%#A+dppJ51Z$1=DiaC!nNXLECtPWJHVBR
aWKqm4 J=\eAjEltA\>A\nGEW14mS8lFR*Q+1\/Dkbq?P^CE>QnQmwk$=SSTu4SM9I@WWVh5wmKm!\p=Ii!XKE#
MM&hR\ XB&GmN=HpnjV5LaQKYEmi@ewPN\XuGGA^c/DTT<kG/wKyGqE@DlWTYFeby99C\Fpp:aVWQbEbjk\BYq!
tnMDC$ J\JaMG\y@RycSRCiTGeTZ?DPpl<1tGmCZnpWKKX6chbKMQ>hRbR$4$qmaA*jnEQVLk&\lm1\:JTCLCq<
Ei$b4p \\BL&8WEFGlC\&DYZ$PFdBL>^FVw@jVtn/ek@allD5\?n+D%^%Wyu66*^MS#TRe!/NcPNyLb65=wi<Cc
5pb8j> k*Jl6KYtZ+Fk%dMCc1XalymEcHjeSw8y&k=^Ha!kCm+GhVeG#TV!Tl/:dT!/MFwcEMCMAlECklFkJA%y
^^MRyH DB!ApauW5TbEXSca8t1mw^Ye^Bl>YBY%B%hX5?p?PkIeWE$k#SBeiXXWnbdnCZ8aTYy^GeVN1lkbb!!K
ACN$@G Dk+!+#GSPn6tRwlW9M!FKK4j&SIY^ik8VGCGia%>PWYmT^Hw%4wwcRnqIG=qd\6<\A@4Lkk=&T4QV<A>
weP%Ln wVNCB&aJ5DIwKIqG?XYdT8QR!QTS*Wyy!>Ij$W<8WSpE*G#Dmd$AJb85HA:E:JEYI%6YB%e=khJ8iWJM
NF/h*S VEC&MGW4\:uE%\tZyhAJSaT/=BTnb%eYu!yQE/1Gw!WD+?amW!tHIep%k&$NL1w&E$W9NRlun\44n@H1
:8@ep= 5k@JwwiXkL?cyXyGAQt5\hERSwpIbL?RP=n1mb%YFGEctVF6ywwBXu1I&4FE%e$ISS&Dhq$b6ChZQP?y
yYu*LP d=dYD&TA\9*qd4$8TkKVjRL4FHW&jkl55E8?l@K$jkNkKNMLw%pJLZ/kHFl!WcpCa6YE@*VX4+Z8AP$w
JC&+@+ =6D>kd1&%AqcXXBmGSpEZFITTplkHCdMKwTVSeYSX5IR%$jHBA\ZAPBKWcIXmTyaWY&tpD^6J%Z?PW&$
FQwYha R$B:1PidLB$Nk=<ALDHICZLLhhDh?E4CC#WF>mT$h4FPW\cmEA#n1ZW>kALIw9^eL\1uKk6VFMR!wh+4
DMZ+5b TSBwV@puuI$mJTy^aw/GP!Ah!%bmAjI4?\IMl>EN%iFb/GI1mYXqJ>EX^b=ClR5m1?mywtW16=e%jPS+
+B=!J# *Xe5XV#8&mBIBKXLlh#dISJRCpWZ5LW&LXVlYMTyR@W/m5EVeyyCFdPMyDSmtWYIjypAD*S4ya/WmkE=
\HWckZ A%Y%I&I/nRHi^EkZ6=<<&uCYyYWX5lnjTE<SjVRGbS=i%w%XtR5*8wwMC?uc9=Bnctecd?DZ?6<918pt
VL&!pN wX<#HS^KBt:6Y!lB6cwcDyk&J#ddHWZPyLIw<lZd:6qilK=F<I^XZ8W/hJR/iG$1yhYAhh98*h+j&*dN
jFT>+/ bupc!LA^HR5^1T4KC=%ialSBKW^9S*q+n/WF4MYaABmCm&ZKtAhkYSRw6mZdnaiKSW9T#yL^cERPP&VR
/:9mS\ AcL6TE*^G+NDLD5td6MZK?knXhGWbJBp!yMpKJd:$lE?&i!i?ncS86VQ:q#a&5uR?#ctVKJpqBAkdM^+
GnN>RC nYmBYT<^cA<Dw&QLlbcdiTI$&*qIcZLCY5&$FXMSCNcG^IBT8^yiCtAp\b#l:kIcib$YhSX5VGw!ZHbK
eKSuqb IcThNb%Dhut4J8w?%RTh$q94*e@>CmJQ=Rih\X8a\1hbDiwp=pXqHb&kIbVGn#byhJqFlXMDpiM1VbL6
KEI/iF RbPmAJLkcwd%d68cKHMaJ@Yikk%Spc/lwXc^1Rw5nSF8bABn8SGyEtK$@#kAYXmZMkBHK89wV/=SqR\%
HSA^^w SyZ@8eRCJt%*+hI1YpF<$AKn*eW6LEE?t9k%M/&eYlGaJ<ay1MIPhAhbq59k9RkX<nEaP+Bp4yThhS>$
m\!mDt tXd^FIcAaK^Iu^JQn?mt/uIhHT8ZQpEXGW#W#dQIw>w>/K@\5pB9MJj<WjpEWATyktt\#194^WnmnXuH
tdpDwB VDQJn&I#<uyk?I>twC=TX>ZlAy\wSWiq%RMj>w?:tGm5wmBLnJ$4/*$hlb9m6AYAa@J8=cDW:tNDyD%L
G>aX!4 p+<pB$::QKEJpnBF^4#%N\?F=XEKYyQTJ^e<K6X9eDKbJG4V^yVwa*<Fk&Y1WiwC8G:CI\Zem#FmemEA
=BVMtF AX?yyK>EBGYR5k?HL#u85wwC>KbVPc>%XCCW8NP8bpDa1Mdi\ADDeX*K^1WiQ/B1+&DHTj+aG9ymY\%n
4EX=*K j&XpVQTBdqYGRNi5i#NW^R=Y4t:m^D:wyBbmnI9M>yYNWLq>DiSMC/LE+1I>S!wAEl8$w814y9D5KeBe
@<MhqX 1>kcK=<wEtX?WlVGWNCNEqFkw%qh/yD&Ea+yFC<y!#qh=4&HCdFa=^9F^w#q/#V1^piZ>6q&6:RJyw8\
JXT!ed Xwc9jG&w1lYIYdEHTYJR\FtT6*Tp@WD1nW4KXLRQwHtLBM?l4WtT*CN?TH:5k!E%PDdCKFnZ9baFTA#I
^a/T+C bpj9nlSY9c:bDZ&%l>WHM@S?wdXQ!ln:QGP:&VS:+i1d/@@p9T?<<5JeAQjh%&=&k8XZ<@jke#YjP>HZ
wZyFRc d8d+Zbnnm@Q!8:8*>Zey=#l=hjj8@ua/</T8jJZ?nLHd/i>1bV#Q+hu18jE9n+@j#qbj@?Tjun6*u1&!
N\Y55R &:=<?jI18##?>Z^5DQy@+:Y8<S@lGkDDtIJl$@eXDF@d>G%<8u4lc@@^#Y>?m+%>>XKi@*lX>j@^/9>&
?\h6#d jZ*K5QiCyd68S$bGe@8&Mnw/t18L:leZS$hQn>KX$@*I/K:Vm*VSQa^jQD&c+\j:R:hhy&EwjtnCZa8u
-ABpBy 0006dec09bb001202b3 Page 121 of binaries1.zip
e/W\j4 <#ZY@*?@QkkN4q!=a6QkC49/:qYLBqi89w9@/M4yHt:j@SFh%PH1%ZhX:^@qZjPd?=<W:8ac?WC><t:\
=D\L$V ^5dl51S9hVNe=<9t!yb#Y:de9Yw%9#/!?ddZm956Y*lq!>&9hR*9d6?!yZb*Qtdt\?a4?jEjtlp9R*MG
aFHFu$ q#Rh#y*:+RJe^<wPX:L5yp!a?*e&u%>a?Pqn^%uSjn/L^wW5F:k!#m4nN^Znc\5LN+:jWuc+jYZq1jHu
kY^:Li !\u!StQ<Pd9>&PQQH*88cIj%BX/4^RLu4^\:h1!k+hmYN<=jETXJ*>u<^9p^m<Lad6N@dHQ*Qd9ee#@Y
JEpV:V e<<8>>!Q4TFi/@@QyCp9XYNk<*Z/G6\l4%^*5@w5=5PcF^iHhXCnF%pFP@SaF6XPI!81&/B&5@1c+@GV
5@DpMu \@4Gm6uatic#Pj=:iWmH@PY#/uPy4\PbV6M<1APM#/tyl5%u?>yl?8QWwVcwteaj^\Xa4Zby<QRAjc$G
IV9\B/ 9&6\uS*RRe&P#e<PuCF@?SJ<hQMACHLX@P#R<VCKty/6>a>Z?F<1QwMRQA:EX<$D=BAIhQ\/aB/PHTBn
dec1Lw SD>wH&1P>jnlC1DH4>Fl:ZcY9$<:#LB&?$h#Jba9#QH8FHmG#:Q%P#t:u6@I4tj/Y@p5Y:@8Gl9bpLNK
jBMn5< uy>mb:/FZ<dPuGGXVbXV:A<&ZGDH#%^ki??/\Bdj9eDPRJ>DMPGB>^k:HVE&\>S*P*^@B4/niAK>F*=a
V1=H@Q H+c6!!?\Djt*\ZK6Y6@@ktjZwE&94:/I5:t@\E:Ch/@?m<>PR96JYD?H>W<!>eY*IY/u\M6iH?LLQY!K
cdIyJG @h/y*#:%*KqH=9ie8QQc#eGhj*9#j<LjE=5wq6\D\@NV?DpJ:Z88jR1@%@C9c4hnP^YknctX&P4G%#?J
AihPh> D%b9a:jl*<9n+%>jJYj/nhjGMLD<::P4a+nL=VhY4^\FX#d&^84a+<jXQdwt8Q@B+@XX9Q>B9c:c/jS>
q\<l4A *lMLXwbb=1:a#w:8ILbd^Pk6L?=HF#F/K?+y!N6XGpX+RNFdEe*qy$?j#1%q<6FFtB+$<c^Y<u!Sk5T#
KlRa<l &1ma>5LKWH5P8u@yWq/&Z<LLHt>8miX4CH6q<+!>N/>QV%PT=F5%eH&$cA4jw9Ald<G*buB:AE5STXq#
yy#L/G K@iV4T1p46I+XGKHqG$=qXG=W%XY&p*N1u8SBem%+8IkC&*hLyu#69&Fiq&EdWuQ4@8RFtaldY5mLPdM
\t$h%+ %FyLiHlAEueJ:=&yD>k$w#Q?kIZuJ<5V^XH^AtqC5G<juda4%14/a!WH/c$uVnRZm8^b:#Zk9w%%94=M
#*TK/d 54GKaL@awA=DD#5DGR8Zmu^Wp/aW6XmZ11>e6ERMp:8RIh9Fh*N8yG@Hna4AX1HDS\S<\6/WPdJp4WS=
K%pV#+ /NEQA%t=huH8+<Pj>?k?:tF9?K=^bp49lHeBMj\RTPW5MYGkeBFu5Em46<SVupZ/BSAqQj4<ENb:VCYC
$qGEE% 6lHLk#lq#TR^R4DG96q?LAdlG^61P9F$FFDNdAuQRD4F#mYXlpqkEC:c6$lF*NIHhHB9KbdAZTRXeMh*
\y9^Dn SZ<q>SCYWV1DZ^8lX$aW:>S\!%lRFdDaweiZPyAD8Bik*kawm%?Icw?mI+iw#6c#lhhuZ=Vc^5qh/nlX
V><8qC 1neqIJ4@NK6hS&?l4Ee&Xt1d/i&\ey&y=IGN?E/B6tkQakF:\C6Qd6PJHViqK4pY#TYS64FP6%XX^:et
X/+MBF p@eQGY#P^A<jYdNHw1Rt?FLa<Q=#C?y$mN:@Qu^p1ueQQQ%\E>=uA/DP%>P?6hNbC?GQQSnKWP^b#?Ec
:d+X!C */hie8K#Vp6W<epu<M^!iTCNu9E1@VG:PiN$N!9VHiaJDLI*ChYkn%i4qwK1b:iC>P6h15Pmlee:m/b%
Aq@^*a V+lpbFb8L*5<ynGdK=q!pF=mW\M?5&bQ@W/B/44SEwZK%y81%jJAGJl=nTQ?N\Z?aRiiEj5+*9WeSN1F
=n@8:C C^dqb>1jATLRpVLqEkdM8u:BmePN$=J/+t?kRH>6XQY>yX1hK9bJn14hDt4=&H/!!deTb!eGdZCM/Tde
<kQcBl Q$jAd1=Y$Z<>WwmYYtHDFNwV+Y%EcQV9Y:EBbZE1cEnR!&cL1#Mc\48nYnYW:b+NeH=GmR9jCpC9>a1Q
MKS8\q /9WytEpj?*^WPBnT:FP991ut#jV8&a/D$5G6KWTki5NYim<WdQZY5XLV!eS>VB&%/H*QiPRVV@#S4^#D
@!!$kR >$XHutFXS*ky955<hjD\QHV<>itb?aQ\>*iP#B??A^KDQ=9j@<9#dJ!>>hD5>EH$D@<#!I=T^t&b!eXA
QZ+=Eh iebDRNwCTD?D:D%q+kL!VSmatMR!p*NMkH\4IA%5LVP=RjcpMkWl6byBLYl?BRaGE#D:DIMppD$DIk=8
qh9\WZ /pF&4y:=@^<w9k4MQ5Gkw<DA1AbmM4<EmVQ&k6p9RG^#B#D:DWk9+&a\?!PI#VRQ#Q+Ma4PEk6uj\P#:
>@>1DN aQaHEJ8%CM^?C&K#/<DMB*bchwDb4$B5Zk<\?#YILRA^=^&ILR^^A:kQKt+Gbu<F5TW@k>qjRG#y^YD&
k94Ye\ h^Bd\SuM@kFmK:tC&b>AdCP\j=q@k6nGMVB@MVCaVpK\Gj$R+ePal^BZ9ab\5=wWRw%BFWKNilyCnWaY
wKe\Hq Rw&lE/KX#XmJWK<Yl&VtI!R#>!HatupI6uaSk1%jBtL!BWFYRKWwBJhtq1S!PwJ4d1j<CmEjaEcA:ykP
Xm+4Ck l!\Q=A\8Abc:\HbGMd*GR\FRT\MEFAACAAkAcXX6JiRIK:n/ZAAAAEEDADEAAABndGqqduS#L*BueC>6
aXMyd* aYM9WEhRa&^ybY=$VGqmL%BHWGN5cYX8hE^yam=\etw8atq8:J\JuBVXuej4#TYZ+kF1ZI&6wMQqcBKn
B54?CN lmA!$*M\MM$$$#MMtwMWQVW#=ZS*6hZXMAMwwFFE<BaXn!YJJl4WAGK<Zak*<eA#Z9FINIaptqX*N&:!
@4pk6c ?i!!9*@X9</8ce:5dtTc#*j+%Z6X4/4?@@j19j>:%T$hGG?IJ%P1pnGc%LqXYj%5che?5Xlen:a*%kp*
KWTR*# 1ZVKI9y9*dM#X>*h6G=&Q\e8Zbw+WbKTtycmR!SJnJFK^@/:XD4?TEpc?V&pjTBK*EKnYwjTL88/18tS
S$/^\t 8K/h4TRNcb@/qA6y?*b:a@6&RS?TZ^cPpXc9q1R#66M@TWmDK&JcSp=1^ew5p<bIR<TnJW8e@\MjFF$8
tp16R? DW&w/Y^KmhRwTqdcJ#>CEkNGpE1wua/+V^4C&$Q&!<4JH4qL/i?Awb^jqi6Ll?Z9u?nLGWw/tyJ#PTXZ
VV#Cdc tF>Sp<>$yJRmX&VYV/qe4q1k:16i&euQYa*^!LV1YhZE<Jlm/Ny<Si@JScdJ<?SI+6mY!Fl^$94d^Wth
$ji$6q W>1cI!%V8/ZSpRV>4cp<iyIpbn\kTWhWHHn$NKp4$6a5mb$+acp\eb>PiN1I9XAHT=*/6#jc6XTB:k<h
CF?:KA Z!Rin$cmJ$dHn/@/8Z?jKhcqY*@+@#b^lSle56C#%#C*^J$:4@t*^Je+?5S>9I+KcaL+6PVX$muT4bLW
cG\&y8 9p\Ty=N*pl$>da%\EV^W1<#Nh$&5/%ANVbjC581%nBGcWhh4/HI8NC5th/uJTFVPS5\HWTT1ydN1T6F*
6LT%cY 5HPVt8ub+W:&TCX54<cYTHQYWNQ1ku/KMb6t5SLc%W^L6Qn%>y=&TwTGVk%Ky6@<IuhC&eY8IC:upuK1
mDpLSl ?CZ\Qlm<bhSMX:kQEqyiV!wJ8XQB/bVP<HK5/+kWeYW$u#P$hGT/$nhj$#9C>/qPJlX+PT+d*iE:%PVX
#9d!yk XEi^5=^!&9TmN1Z<YnXHuXy/du>Ywb&KGJ/!m^uijFRX6:8%T%G#S?6nPFG+6iq=YPRtKZ?HN$p:FdqJ
=NRKH\ !w:Z%jijX/#t^cQX8VVetFFTwV8$KA8K&/hX%45WI=JRDKNjA>Zn/ElM#tc6QdkGt1qNck=ZSqaI4*yP
8/hXmL n4@CPepFy*h!Amh%$9$X$$u&XWhj16<@9m#dK:=E^>:8ZRY1YTDD4X^8BqeyJ<H@tHPTa*K!PSGJKVCC
MWE*4* :WRu#%j*jKu>*JG*u9pT#h4qV!t+S*>NeyL>>TeiDjN\kY@D9F4w#\JQBu$a/4&A*+IiC@FXmJe<@mu\
JnRj+^ VLlQk6+I>WQAA%:dB/%iaG?@ye$:D&%Sdw:Q/t=!$Qb8n6<Dd44QD&/!%^9?XN>>?:Q+:9&J>u%::549
lwt#6Y yYCG+!6Ql8W^N<HuN#i=$H68u6iH@6S?:5nnV*<miVYRWuCQQk?:!WE@l*t+\LhlZm*$b+Euk#+M>X:A
d#GBJ5 d$GQljk1^E5i@^S+J6\uRY?E?mHkAc@6k%a95Ljj$6YyXIGqKe%ucWwIYy4T@JctFJ?qKeF4cZ9dh#h&
jBVF9w I6?N9YujkZq>jp8:Ta/q#TVL$mS>q1cERp6V16jT>udB6Zp5dY?TyS*68W/jyTpl&E6EQEQ*=4!S#S9B
+kNi+j %MIP!E!iFjN&TeFlhVDH>$kQuK#kNN+VlBXhWKndbL%FB%ILt:%>G5?DIHC!kl^jR\1e4PA$*lPEFS%t
D+NkP$ uEl+yPSp?PInZ&4BiMIZC<F1lYWGT\8W+!9BNWYkHDjDY=w@6iDJHCk=yM^kcaF!jCYaNV%kZ$?c4$$G
1#VI6S #pSJ*nQb&=:&FdCn6@I$!bt8QE$w?6N46YSljjd8Y:BZwFI/?@4VA$eW:q8\F%&@j!<ulT885^$<JHAV
VHCZcT jBut*!=Fn%kQZ&<W$Bw9GJPT/iy/p\1ijFwt=^qClSVnL!D<WNee\RI<a!iuGH>%C!554Bl@AiGHpw&C
hpEZJ% l=1>n*PwZZEKDl*+jNE@ChAK&5A5$A^cRD8k6eW#\R!\Be\E9/Vbd9AR8A=eV!6n+GH\LZAD8BF<G*\H
acNA4u jBjMAdVpKIP=IA=?C6cCb<Ah+E:RDXSAm/R>wAN$Ac1H6MTSAWu\LPkE#\FckZ5E*AS8B9<M@kZRk5Wc
Mh=ySk <AN\D6ABLaLR8tai#AQ#Ac%@*AX?By/ubXY\Hy\L#kPLAT*e>RFch%$K#keZkF/\FhBW>R9k?&AV&A^?
LJE$S$ AS+FF+IN+G=\EXkGLkdL\TXkBXkJFwCN+B:\I1B=<u9BIYAEGApPBRiBk<Fl+HD\JZCkb\uyYJ+A4\D:
XW^>iT YW8@=4^/PW?n:\?PAQ<EnkSH$TIuPBwMB^F\ADkGDAKDcTtKXy9AYDAPnAeV\HFkDDkBXAGcaS<NHkPX
NMND&j +HF\E4kQZAw8A=iD?<FZ\BZkT9BX<DX\M9k/PAYeCp+D^+Mjkl?BJ<A6+Fa\Gb#BC\nXaCI+HhVRcncw
L@=w@a Bh<AV+JJ+CqRB^+AX+G4\VZkRXAQXwF4RRPaCl4BNDAhNNFCQQkt?DH+CZkc*Ab8B/Q&wQ&>BN/DT+?^
/IH#*c *I#6\ZJu6up8>YT6jXtqV6jN@im?N\l46SS%ZPD<A5eh>XjLbhlG4X6TJyW6KyitVDqjPu^J$9R*&Y=D
D6T#\i 1XpS^M%WG^cd!>\Fj<8F6BeYpQ:lQ^Z>LThbDmm#F6y85R%dd4a55ebemAQtZ$hTm^StC\u@:Ge8+Au&
I9:i@Y c55P>^@GL!WeEumySPqWi\QZVPeZ*lY#MtF@4H#Z%/Z&JbiYi6L/1!i8VV!*VIa4EjcJ:jMKh>@B#qLk
*A#tNE du9tDH!1+*G$SdFp>yI>>#TX=&\WLnuTlT@b!=WLqll5^hAa#8/lFenKbdXNDdPVQYwHnZ#dE@Gw&RPW
ZWq^wS ?Be?m*#M?mh5j>t%/*B9:VLHneE16qP%!>4J$^cw*^Stu:Qn^X84j:L9+&V8^!Riu=T^Z5V>t5VN$Y/<
kt/hTG V*HjS=>6*I>S$aP=Q!M>kj5%$p*e9=H8ebid^R48L$t9+*/S>M9eX=L?*P%@T+:k@yu$bP/uTe@ljy#$
diqp:D E8:QTj?A?*ZTV*D@V9wD:6@y658+u!hh!j$>/Yuen=NY&F/pL?S?ujSc:6>Jd?F?u9V98L<uW=b#u$@/
-AMp5% 0006c487647001202b3 Page 122 of binaries1.zip
V*iSd+ iP:*TVj\YIJ$n>9HqX*KjV#yNV\GIQ$A>>YpZ?D?u@Rjia^A4m4lMRVyL@Fak9TJQKakQa*HF1Vu<NmC
5l=\mI hJ:HGKR9+:EG/h6+nEHcHqiR*54nC6J@+9EFXSHB>au$pV#iIQ$XHuiRn9L+k@TbQA+luiW^BiqqQPak
uM<GdT jTPQDWnj!iMN$y6=VEL/JS/#pH/j^!/p@<%?CRJXhlCQbWkj^tMb$yW<ymE>pee&yGM<ymE>t<e^yFWi
e!GS8u ^=Bi#PMb$yj#8Id$4V!?Id&S^#tpN@F+l@SYH9iRjw@nANKjen8pynYW^@Ppn?WakjRpnmNI6*KeRd1H
AHp4M$ +\*TT#u8IH$V^^?pN*D<RjwynpNI9<j^CPt@el^CVZwI^^/pn?Hak@VyHIPRVuA5Rn4DMRuyC#k&Id&K
wE=Hkt a^VTh*C5R9ySnn6I9<F^CitQPZ+k@h<ep>Bn=YCPY$mQ=4mG>Ne=9mFh^*EP/dM+*mG6e4^D8w@nH6I4
cA\WcK Pj+l9adnH6J4Phal@SDHP1Sj=JmH>G<+>mH>F+/B/JFZ#4ER/aM+JmJ>DMhGyL@KeR:yKMhByN5=bmHh
kDwquP #VER/WZ<ZCb>GehSyNh\QEX/HehXyB@u?I4$!^^jpZ/j+!#Tj?F+m^:Nk#uPIn&C+!9T^*F<Sj1dHGiS
5jSkk4 u5:^F8u9eh^FY8Q+m@SCn5NI&@Ea/b5+dmF>F<e9yB@nPId$t^#HpQ/I+^u1Nmw+#mAh+ZmD>Epeh=C8
<6R&Ew =4mDhI#nD>I!^>cp<^^np%:B5VdyH*G5Vjwin4qJQ<?^MPq6HBPV@p?PncpdG<!^MitSHCPVH59>KPuV
ymSZ41 PiamQa8H9/SVHH?SZ54^EPu4PC+m9bbnI>IQew^Eik9H@cVj+Qmj>Ge<B$Dh/mCiC!B>FMjtyL@GMV4y
WXu::e iw:VTe@miJ&$\4E&/V#H*KTZe&^N?tcP5Wt9=#md>GcP6$q9=bmX>L5e4=L?uPNH/9IQ+6mS>CmiD!F>
:d!^JZ K5?FpG:t8RuTK5>LpF:I<\TpL?j=A6I@=HpD$l6+@wD$w^^Vp@+X^>YpQ?GatIahbS#4pl:Fa!DTy*K5
W/am+H T41P=*FIj=juepn*<n\M/bW<9$L/Dy=nId&J=$hIQ<j#H1R@=LpQ$u@n8R5c?k#m&Qaj/XQKa$L/j=D%
#E<i\u d9&$N*emRl#+:G8j59:CqwHQ:u@t#Mpb59=@?5WVkdnSetZnnMdYPh=IiFh8BQel:j=>6Nc%^Pcaj*d#
P4Ztk! @IMG1tP+h\6t9aVQW96b?@B<uQXHYDN<\*dkmt^Zhu18P#Z*j@?iQQNaJanElBT<1**!M/I!&q^dX^ty
KE$RC# 4K%84eb@<ebwc?Y?bICB?Z\4LyjKSumd:mtuVViuNHilmL*h6He<<d#Zl^T:Nm*5t<#qS&dSlRtMq%jT
\bE%G/ X$^BCcB%lFFkNDkPHA<1\Vk\Hp\AJ+BJaDKaA1yBDamCYqAHG5BW$AmtkitkCeVADNAMYpA4cAQ6aDba
1tR18K Ac+D%+Md\Sy\F:kjQARiBy9B+?AJ<CS+Gn\DukZQkijBC?Bq<Ay+Fd\GZkh9kDjBY?DZ+G*\DukZ9Ah?
5$1MlR C>+HH+B6+A@kn?BQ+CQ\Mjk#?BS<B9+DdKj?CMB?6A+n!pEFGATGktHkADAenAAn\cFkDIBhBY\1aFNS
a&t@V& BiwBdChkP\HdChlP\HaC6lP\t+mDtRC&E:MA:CbkN*EYWEAu/ALhRAXuk^/RAttRAS4IkuPADuLAAHp\
^Q=M&H D<\H9cAQLACL\LukQLAaLAEZkA9BSYAb8Bk5B=eA?FBeD1+EX+G4\VXkFdkY\L<C@lY44iq^ec8%RCB?
lLuju@ dE*&m=>aC\DmN19Ym>86lRL^W/6bmdZYJL?+\^4Km#5=@T:?@&F45q<<\5j@nM6j^@u48j\NjL/:8j!N
bdFPb! 9Q<>@Q@Q4ZlS*M9H*ejH*Y<6SIkH/Q#YIwu=jW9/Z6<wMBweB++HqYAeGA<tkBQAJDAbVAHXwAbERT&k
8FN1Qa L+5*kKtkEW\D$$EVmIEbwBt$kFbB#!C$HVAduA<8AqiC1<A15B4eDncCi<F>+H:\IHkIdAKd\T@Aa?BJ
Vb<W>b <BS+Gt\B#+Du\Xd\AukJ9A^iAc?CZ+HZ\P9kDjAtiA8<Dh+B:+L*BZ%nZbJ?B#+E9\jd\B@AS?Bn<Au+
aJYh:# L:Ch^$A$91Q9TJcBCnAaDAHD\Q:kaHAIGAFkb#EG\M+Chlc\5+A6BY\y/kH5KYBQAZ5K&FQAqkI&FHE\
wa@Q6! E<CGalcAHeYbwAMwwBN$kY/kk4NBBtkkC<+BP5kBA?VBQDAj>II?5AA5BI9AiYA^YAKYA9lLZAmYka9B
LyHlIy euAJYAFYkp9BFRC?FFiDc\B<K1+F%+H4Aj\4dkA*$c5Fkq+V&EF>^j>HkT?Dw$EEHMdVe@d4M@a4L/8R
^SYNX1 N+TZmXd#hPTNQEX=k#WqKR/%ymQFTG6/Vi#QAZcZ&S:N/Zc$Q*MJD8&P&y\=VT@8=tu1e/$yjLGSy^$j
BNu1nw Mb<D8D@R^W6>eX/ccPEyi*:6Ta\Hb%p>yCmV*NikcH4:XY9yRa#nbRj5J^S41WFRZ$nV%c?a!\RF*:$h
AwyRVu GHu6YRV6lNH/HwdSi*J?nkL@#p9&?+uAlAN@T&=ZLdZZJl^&+@\DE\:>BGHwaEK??Qn@d8Kk@>h>KwV>
!nh4#Y nyL@6b+>iSXyS>M\:85n8^T*aAB&BSBkFBkNnkQHk$w\Dw\HE<AJaBKaDKcAcqADw1AY%IEGMBW$ktqk
ZKyD=R PtkCMVADNIMY$A4cRD8aDd+N9kM8B#iCt<AceA6aD^+Gt<Bt<Dl+Gt\B9\VQk1*kBjAmiAt<Aq+D4+M*
NC5$I4 \F9k%?B6<A=+F:\HjkN?C>+HH+AQ\i@BN9AS?Bn<Gj\4?AS<Cn+Du+P@ki&w4LChKAGqwB^WkEFkKM&A
Y!w@yN kRQAeDACnATHknEA6lY\1+BhSSZ+BwD>BP\uaD<B?\uaV<B?A9aV5J&aCYA@pRC\uaD6^JukY/AVhIF8
ka#6F& wIK#RR>IkVVIAA%p\VqAB#qkkD!aB?cDZ6AHFwCF+F^\HqkMqwCq+Q9kI4AMZA!Yk$9AC4ATwE/J1<A%
TKG9un aBY+hmj1a#tQ=KWh6/>?+9:A?+RDE*\DE*!Fp!/:Zci<M$QFZnkhtET$J^GHB!aSh:YIL<Ap+pCR<$WN
B/+G!C eu#9wW9D&LHDauJ!1mJ*KH181q9c!eyqQ%@KlQ&Rp8#Xe86N*dDlMLR8//1Tp>wcI>bGu^T9d=Lm>DNc
ZwCamS <bTeMcVGnKHwuZJTwZ8MJbwm$TweZ&X96iR#lyyY:CV4LIq8YXe/19TeuyS1hduL#ZFPdd&WZ19KKc$4
m4E1W! X=ZNcuMDTidBWcR%KEbe#8Y!*d1eW^y$8VP8/WbXMt6t+kA:cbc1#LiThZYidCnVqd=eZM9t5&bmY$:S
+*AyLK G&6d=dpylda>%nC9^:b*N6p>j4\*6#GnG6YbnqbFV%eqyiDqYBjLBZw8*pqwM>SW#n1\SWt1Ycw59wPe
jSBdGX XQ?hPYikZ+YmJNRJ/=X\n&=T=J/eN!E8G<q8^bjW156bP+G?>Y:4Gbc^wGdt%YSQl!=nt#bdqJ#=1$W=
*a@4eu c#Nl/QTqYG#kTeyZRJLQVVKt5Guc/nL#XF*LyHE:XHlVhbK?$?nIiWwm1Y8yqKJdTdw8>:t1EjXMNnVP
bYMZ@X M\\=&Y%:1/qG%?TPyJ\#?FDQNltwZqXTHYbGXM+/y+^1/dTe/iBD/L8<5u8C1Ja^eC&t4yWNGjiy!Gq4
E4HH<m E#WYL1@X6c!#*T4ui5\N@?pc11QhT4Ju46b4d/a:GyNcymb9GH\XVqwm4^1K>:RN%eHCcLia&16tQN9t
PXL9J^ aeF6j#FPLTi61&t$+l4um8L=ZLj9eqyXI/X+#lJwQp*$C$CPWDJ5Q64\iam?y&wJSXi%DnWyY=jne*HC
!HE>%5 /QBi15jIX4$!JSyqk/:^Hbk6%K\QCb!JjtZSTa%yGc%B$hKKwjh=W9MyR$$wKTXyZ=tb:N!PLh15d?L!
!lnC1R Th9k%QuRCWP&4G5ueINFAl!uyVT>SW=u4Y&$yG+%tcM>XEP%YqIdunJwXka>P&kVdWHV?&Jh=yY$wbEF
bhllFe <q5WPRMH<cXm5\6&^YQZ*G16c%X/DdjS6NEtG4B1tAhQ:PeSHtqMb?FA?1$@1WbPyVR6E=t1yNC+&/*j
E<h>Gu @nN#YyRFp9W:D>L5cHN>9jiwiJ%@$@=t6lS5$SMub9N#R/?Dnk9L>V=L@R>b=*9Zlee=m<Yi8/P^Z!#i
CtC?bl :68$:<@</S@*H6\j@*I9\E%#C1j8K>b8@jwGh&NXdmhuyWj1=VEu1*NP/^n4/h:Mu^Q&ZnRd4jB8uEVu
5!Ny8p yN=eJ=E8LyDlqBjBDhL*^KYJwZcT/qW>S:>8$pW?pmdKXX4i+D$q5lD@8kFhw49F%tnPKlu/aVy?pEjN
nlDSbP 5a!V$JpKTQycJG>T1$dq6I/nj1Y^&hYJ4JL$d/En<Tjk\iBQtNXc$?TtiNwaJhtFY/*L*w44Y1?#kRKh
B<jt8y !<BVM1il=<kb@>QiqeBJWX#>1yu8*aYFbVpYPaK8F^4SXTQiF:k5q!!5LAlGnT:LAA6:nDP:HB/A+u&D
8Z6!$L >*%><e6ynJywnFFW%GmME8N69G@n4aq?TbV99cw*NVY#M#%9tbEAY@Z:9c:1tnjX*hY9Z:%/XjY9nqqa
^W%PRm \6n//DF#&8BbIa*Xq!c=qJHbD5kk8PaQcebLT1a!Z>I#hbPj&c=R8Rq#\d:L=EqTmK\epSCK%KhK#$*N
NKC1TE TJcWqm91wbFe5GR@DYFdPdc6GS+eaTan4ZGEJ?l<IZm%NR6BdMnKcYqwc4dNQ@\=Ft6D>cjc\tV:4PWa
N>CSFR >GN>JLa\Ep6:Jb%@\6#/cHMDNGj%yuy%SnXeDyXp^6\^+>Q!^<ampdT58ny#6<4ida&RcI?i*hJpQlG+
qh@h1W j&yZP>?k1hGMQ&G8LmX^*eNBu4Am#H&wFk^MJK*DpnbmhY*d:Ibtjh:J%E&&w9Z6>R$LI>WhMdDj<EPk
Xb?LWu ^4+?Al@D:BTDaEbV/?!&SX1phR5JZRDV/11eSAFRHXBm9E%%SK\VEND>&tdN#!B%/hqyPbacVM9GPwlu
kPLZ:% 4Lh+>w1Pb^TTiHcym1j&RPKtlamdFmJ8/iX1\wRbDjcMN5^VM6THn:&Riuyj+^5R&FuXc9w@W<:XT=<P
:<+>8M j#T+H/y\58VGNm&tW$1l?wZ?XVM$RD1y:ZA/l:8F6m4%LAQDYDA!$nNT&FT4B4HCDB=Ve<n$eWK>yA!Z
?WF8W$ XK&J>cQJ^^b#>J=y@+dM$Z8t@q@#yZKwH/Glw*>n14Y6hSh>b9+$MpQlI#MWQnKXI?XHiHlw%&PhT<yR
jQ\Nku K@ajP4M14yTHymhL8Xi/we/Z6588%kKLBtqH*Q4<6VKF6t=8LBKQH/JN^R!=Cj$%JlJj$I+>F*YTcHnW
J!6aMB CjTLI#Fn+KJt%6ah@a/>m<R981ZX?dYS%k=mth#SA6b?I=*B=SF4LhFXyK/ttA+1hK?STuC^/W=4!!e%
5$5Mc: 6Wb1Yteu&t%q?ej6NQL4e&B4ctkFW&MlKW61/SM>W9mA#Ih8NdHw<p6pY>dNnLda:Bq\m@1Q8kJ4Yl6n
I:ClWJ T/L6a!I1wn<4SajAetVpkCT&wjqC#km<u#THSKLZu91Tcl9c=!q:W5jbDE4LCI8tG\Jb:IXw58Y1mkp5
jPSu/B aF1$QhF\WdGk^!nKym/#=c8565aFpjc+%4h\==u!p9<*Q!T$1b&l&Yc*Ry*wY+$%6Mc^neNLyYTAthGK
Z#4NnC &1R64ZuI%GSkT#c&4dEnjkm<X1%!1>QPy?8YLy=<4Wc1XeiLyD*S5W9&@HR#y>$E&L%Q6J%yZYu1&b1P
XkhR?< <PlciJLGBd4@NpH*GmGV&JIb&P9Huq$!S/q>ZdKXcc/Y#EQ6$NTa?tjw:5dV4yH5hmh#Eu?$P8ppy=Pt
dEJMFF N5^8c4MiLHGD?1GV>&a@6iqjy%=whDRccaD*1h&FcDBFFpccW^<DuTaNeY\M\VBeFLi#hYW4QRB^&m?#
-AS!FJ 00037101051001202b3 Page 123 of binaries1.zip
I%9c4? WuJTu&@e/DFN<edt6ulHLDIN#JuY8e&S=G<yD=R<VVJ$9mI1\$:Z!QCi$PNm99ypyqYq!e^Pd!@N#&h8
d=FhH\ ESPJY$y+dc!5SIuYQTd<wb*ELh*cW$!hjZFy1m9NVLVp!pmPXRGhBBXiV+w4c@w+WL+yZm:q^VK@y&yI
EJ$BhQ Y#<1uh9yR+jMlESMWibV$9iL?qRB1cX:mmpd@Xmh8i$e>bK^#W9>KXqE5uFYL\4juHE!Vc9BbKwdS#>D
qjF*qX b>tb4y&eLd4#bJ!iCX>L/kRQ/tMte^IhB=QV8aW\Q>t6TSJlJNqm+l&1dpb/B<Qw*FSepk#=GdI/G@5y
@T9A/Z A*t/+dEW9JXly>N+VcuGH/C<deR!PhK?1C&&\JSyM&puSDYPC/mt#k\GXFQ9LBKLkPKKh?yq#bkH\t4e
j?/8w> w8PdI4GGYPP<Jid@p>BXQLc=Re9E=Ldb8m5%Dj8b^mFb*+R/!ZbWkwE@ymQYkGKT/kmi%NVi44yn%Hnl
#ZecyZ =>>b!i9MFNi8@Wj4?&^1dAi%cL/&>J41qJG5<bR<e5qb6/I8wB!\C4ZR6AtY$6e5<DZSZ=w6NbViE1J^
w#hhC4 l&ab&Zta%D%ShZywVS*&\bXtXb4RZA+XT1IX4y/KQh=+i%N:B%b58mE>V#p$E8<!ja?\15nm1Jk&L\bK
Snh?pR L//$D>#$uKbaC+mMXSBqVkY=W1NMKiM=?kYnnCY#nY9NiELRi\Y1@=CPPZP\Q6B/QmRlL44tH$9&SS<V
hdQ6?A GkZaA9VXGSd/<PT&%wnwBIh5R!Gu\!CuRmCu\B?ua%ct\SmuRSku$T\:aiKuRNCta>^dTLRJQH5LTDTJ
F4h?Jt S>\JS#$FQDah=>9CpE&WS9nKWPiVG^cmqh9W1J**eNw$X*%@/m6Il^BPk+Y64p/IT8eSS^Vt#y?wjwQJ
8BSRY^ L!^N$?t9/4GW5</@m$uVwTHYZ\*%Ft!uFJ1>S>SM5h1pSL8i8D5ZZKBJA&=G6b6S9buQ1Ha#=&l/aebJ
Y:<mY> R=mhAJFFkDeEZ$PAH\Sk\/q%CF1DaDWI>INAbk6FKyB6A6\&Jn1D%CbAduH>HwL$IVljAnRZRjkRXMwG
Z%VA*4 %LYBhG%kZQ#+dZBeBBT1FBwkL\E\m<B\CAmHwG\IPwYkb\meNEywIDeEeENRNAVpRiAuBK%D+CWE%WJk
Iq:q5P MF\XlcB=CB1Fp%eSMAyZG?GMVASnR5A:BFbC+CaEZ5IXW\tR*ARALkJk&aC%CdBcBG6DACJ:=bMN>w#k
m@ujc? VatXV4mKCpHYENALAd=w6bMC@pJkNRSWR*AmBFJC+C=eebWN*BtB$lAkDeGneJWZ4ylCaDV<S6MBuuHK
^^1:Lw akLaGRG=$EyAADMEK$MRMRRMY!+$?BiCj6pA!nb+5k$8nGBeCZDjBKl9A1RcX=:lC4V4/ZpR!CwB/J5A
j??W>Y <$$AW!hA1SQk$LT!VWiyM?cTC^bATQ5kHD%68qp%9!GYL9?+XYV6nB@Y$eeR!91=iJp@1cLWGd+JJVQA
V6+lNb ?98YIwtZ?Z&4yF%EEm>#H/8aGyHE!/\ZBm>V9VdC!%TmpNkce4p\iJt1!lQdM>+wDF/t\6Wm9E!FA$X+
F:wPC1 tiJ>peT4@qaa9E^bJk^iyq1\S*mb5paa9E^=nDB+tVI1DF/tZCwMZ1c<YBm<VQpLajA!=Z*C+GZKQ\tD
X>PVTA q!u@Jk^iy9^EGL#MWKIiMh%LGL#M$EBl<DJD&\8Dq^pcKR^ibtm$MHmbwWuC+GYGbkmDq^p/Xlm<#FBe
=!CNaQ GL#M$FJl<DJDK+ZB!\^hJR^ib8mZ\8Bql8+SBm<#>Lk\iJtl6+ZB!\^>Jk^ibtmhMHmb+VJl<DLDR+VB
SlPkW: !\^@Z^m<#QC?\8Bql5eKk=ebumaMZtc+WSm<#QAmajA!\!8F\e5M*!AMZtd+%<Lkbad9F\a9M@!<MHmb
uqphJQ +diE\e5M@$Ma9E!9TBm<VG<LajA!9S&F\e9$hleGL>M:TBm<VG?KMHmbuwYZ/e$XBm@Vc^eGL>NdIR^i
w:CD^L yui?MHmb*lZC+GX/N\8Dq?uhI\^iy9iWMHmb*99C+GX/Z\tDq/p?SeLL>M8E\e9$6^IGL>QjVSm<VH?W
ijm>6A MHmb@8HC+GZ/EYH\M9&+MHmb@tuC+GZ/F\8Dq?ujKA^iyu?:MHmb@kQC+GZ/#\tDq?t@I\^iy9?FMHmb
$tVlA* Tu$RZtcSJ\^ibqGyMHmbCtPX<DKLSkmDq%t$y#B+tWW%\8BqFl$nDF=tWcM\iJqFm+ZB!!^cKR^iy5Ji
\\y&Bi Jd#Mw6<Ik=hb6Eaa9M!m9\1Dq%u$tnB+tWYjCIPZYjS@\8BqFwiF\e55:meMZtd^V5LkbSdZCIPZYX\u
9iBD8i DF=t<dHC+GW1HFdC!!^iKk^ib9Eb\8BqFq<6DF=t<jZC+GWY*!wMZtd^H+VB!!!?Z^m<#PIHleHLLH=i
m!@kB1 GL#M+uiE\e55@pka9M#mL+ZB!!#?l#B+tTXlajA!T@wKk=hbWmpMZtdJ:5LkbTy5X<LLLDqWGL#MpyuC
<NmG9R +GYY#BaGL:MpJk^ib5pKajA!T!+YBm?#=Gbl<DJLjmeMZtdJ@eLkbba<KR^ib5ujlMHLLQt:MHmbJj<Y
c*YWmW Bm?#S:E\iJp>Bk8Dq>qnyDB+tV$tCwPZ&iMaajA!i:RLk=jb+\^l<DJ:JM\HVQ>TGL#MHueLk=jbA@W\
Vna8P1 +YW19FnC!?#^mVB+tcwyJd#MukPF\e958aM\iJp>b\1Dq>q#6nB+tV$ZCaPZ&ZPFMHmbQXeKk=jb<^jC
EDX>^& +GZ&jEAa9M!ij^WGL:Mu/mZC!!^FP+L\Mp8^9TY<#FJ54\k95*RQajA!FSa5+YYYw5+n9E!FBW6+tcWw
<e9>$9 9+TZYaw!RumbyXnjlJhbm4!Eq%tKm?pJL:MWeVeJL:MWhR:lbjbCydPc$9lPCT?#F?wY\595li?Z<DJ:
bX$Wpq aj6AiJt>WB<VZta9%EPEq>pL/=Q\Mu8l#BJibm><#+TZ&R8jqjA!i!HGJiFq>uyZGL#M*tk$EF=td@!P
8=VBkW CC?#N>wclJjbG?8V<DJ:+*$TZtd9GtH\Mu9ni@<4yXF9QW%y%AHQWB4j>dPWS4q:n6L+Qy?uNNd^C=VG
uL!>CE b!W5!>:+9=ewni*5*!mNdhQLPq&GN8A4qEa:/FXKw<*!G1Z^@q?uNLcVd%Ac&:R*Ka*6\%8WSn*\N1XS
p+?J<4 4:^Dcj!?*/W$jlQ9WjyY5le^ndL\AcY^L9>PcT#nR$1nujPSV9hBuja^yXFPQ1E$*9PuqEc:+DNKa>9+
my/NI@ PcY^Lj1C$6mGjEqy%Nu@wDV1&u>TG8@@K$1n#H^Ncj\t@w@TKBj@wnVY\d<ynhj<D/ZSN96Gy^Y?:LiW
C/!SVm Su8A>q+wH=E$?SF4N4E+6B^5H$u&j*th^tJT/YMI&ALV<@Z1cJWG@TdJ@m?HNpGT@X<P#!LJ@m?@unD#
X1HYLA MZ$4AZqkGtSJp9%jDuI1!j+9@+DAP#D>Lhu$cPLD:=L5@:/k*!Vb@**^u5u?:\8&k!V:9!@ImTV:9!?$
DCcAN4 tbL5@:/ZEpkIyt<t+BBM*$pAJJmGd$/T@h<Z=F&T@h<Z=EKT@h<Z*1ep?^<9Keu?:#hIA=8w>AkNeKLT
:b%CVI B&8kE=Yi1RFQXB4ch$u&j#@+NmZb@@&\Q5u?:+j*VQb@Q>DNp8#@j1C*JNu@@WAjTLL@?:%B+CKaB6tR
XWL#hF bQ@*?=cATLB4%F5Dq/n$aPw9aSy?q&V@>\j:TyL>*^@4ti#@@9B6T4L@?!PIC6u@@eGYpYV@>+j&VyL>
A54ha> *^@cV$u&j*<EaTH:9#@wYpu&j*@RJ=L5@@:\ZW1!@@8DLE8!@\ikDJD>Q\Dik!V:j\DiM>u@A%Ci!j+j
9wdaXc AQc+JQ6@\A#$4XEcdEbJ>9<AqGG!@\iAQyFp@\>A8TZ:j\C$PbL5@\GQW*<T$/DuJNu@A?AdqYV@X+D5
<&/Buq T:L@K@A?!j/9kD1YbQ>Z\DWq&j<Xl>Q?EbkGt%TT@X<BNywp?:<C9!t!@!8k*bbp@%hA8!jJ@1<A*T@J
Rpd?p8 @1>AGTD:9\J$nCV:j!B<w=L5@+EI\EQ&@$B+==L5@+H\*JL5@+Fad&V@D%^ARDiaBu6Vp9$@EN<%&j<D
4XNCZ* wX&YbQ<QlQbPp9$@<E@W><a$/C=J>9>A$F8T:Q<6+H8XbQ>9AVI8!j:jA6/XJQ6@m&pEwINymCZb@%5e
yFe!!R 4+F/XBy5REu&@^dR4pt!@:iAhp&T@d@Fk:SQB/clQbSp@&<Biq&T@V<IpTDI@l<E*:ep?*@Ru8R:\DT<
Ha&m#E K$u&@!B+Jpu&@!DR<=L5@$HR#p1!@\jl@bD>Q\m@BdL@B!HkENu@k/A>q&V@D+J&WyL>Q\njI>u@k%HG
*n1E8G !Q+jDHyIp9$@GL+QTjd@+QHp%<A$Ak/S@V>+ZuJjt5Fad&V@D<b/I@6@MNmJp8#@\YADTLL@B/PiIj6@
AhW+SB MLVdp8#@\hB&TdL@l+CPq&V@D<F:I@6@CPkQTjd@pQG$N\1tWS?T@V<Eba#5@!Fal&V@D+Fap9$@BP^m
k^$8na Tjd@EK^D59?HaB&T@V<EdDFJ>9?RF<tuk&t\ETVb@/m?Jhu@R\hw5CiXBu$y!j+jCuyLp9$@FL=nTjd@
VP<j6$ WATWI96@KN+u&j>D+h+q&j>DERTL:Q?laINL59?Hwl!T@V<W9%?!@+hC?!:J@l<KhyMp?*@wt\1eV1i@
Lt=+PR $MBWkq^Pp8#@:=W4wD1h*qKB%iu$CAXay>Q:K>A/ub/wkP6$?kn!e&G/pRC#MB*XwFp1jTL6Z+Qy<#TI
ShVEVl qpyjVtBctL/iALW\@R5C$<L$:^TauW+@4AD6hQwyBSKt$&<1wDCh@qmBliu$9^SktA4D$ENK>9<\%BXp
E9MW8l @\@dYwH6/jV8CuBQy%HHp9$@:En!*&Ec9p6J>9<\?Fap&j@DRAaq&j@D+D%L59?H+dPR@V<Mu+Z5@&GR
QWHXlN J<u?H\a&5mV:j>l:it<%F@nD8Ya+b%j!J++p9>ti%qBJDjqSMk*nSNhnGGe=e^kuqncME:iGeSJDNQb?
+KqL=Q k@b\n4*H+Ldp*/$mH?5%=Ei%l*E8ID@8lYuDPD8V*?J1<tFhLyJ:HmcGnFba\%*nSii>B:MN=!!#luR/
?T*e?C !Ci+tQ^SmV$<F%yDP6iS4?ep<pEqlui!DiheV*/V^LBPy8GeBTJ%n<+&<156Ib>Zamku5Zjt1iTHPq%p
N*kJRy *k5#Mb!#W1V8%Zky?ZpTR#uZ$9QeKJL:Rub^PKek>=MaZp45jY49SZ1hNh!$*9i=HyBFK^G&1DNt^*1N
hCh8ww +adN!E>BhEZQ!XMtn//61c1bYbPbd=Rb@9JM*Bun^JePBppWe68?4k>idykNDc%\Ktt6L<qD<#q=eQ/y
>\CKPC QVQKWyt94ST$VySX5pS4TdV/$eJHm^>:A/wu@wn&A1wi?pQpKX^BG86+$y!L1dXbRBy9DttND<pn>R==
ttTBnc 8D+qn>Md=CE:m4:+G$kDZE=j@I>JA>^Eq8FT<u/>S:*eH&q4EC$@6QnRIpKLFm%b6K#RW+CYm:L<u>Ni
/YSN%4 RNY#?D%yyEG/=+t>S8^SwlYPqlV&=4B*l:$8=aGl%lX:Thm:\%+h>8c\F/h/J#S1m^+ctjB\jc$>Y5wK
!c%h@w 9$i*!54TZc5>thmVRi6XiWX/pIX:56cT!tL%!Xwh4q6K>D/k%\G>DilqRP<CilYWl!LSi8/pi+T1q&FN
S9q*e! GyH&45P:cY<BintWB&H*bA84iqEn!iN\Q*pQj1M%4jIi:Kp>B?k^WL%q5kdRc/C<Bj6wV\F/CNBnk>+B
G5Smb! =SY\LAZ5VYQQT9YwDmBQ\aHpJVlI><mXq?Bi:THAHlu&$JRu+GD6*Xc>?XHWA&!tFqq1D+H1DTY5qY4h
RYeWR4 $<PiF9dCXM?RLC#$yKCHAD$@/G*BHyZ!\I#XF1:!#I#V*l4qMem!$:H1aW:YQV:59cQ*RquS1:WXk6+J
N^+&p$ %XN/pL#8/XdZ9<nD?S@!cQ/MY4ql=NY<ZZ5$Ja&!1@pVN?miqjJmdyY$$6CVmb=B>FIw4&ALYbJFbM$X
-AXXRT 00076d1a7ad001202b3 Page 124 of binaries1.zip
:8*MZ$ p>X^DLZky?tiB9dG$BPIunn$#GGQR@W$&5mcCbMZ?Z*!T4>JZ8KQ!K9>KuuAZ!S9?h@IP*+Pihlj5C!F
5PuC%S P<n/T8\$jmiNn9!TY9MwYdaqbMW&YdMh46JiD8#NwweDQSnw*XBinVP%%ct<5Jpt81#W%nB/d=ZZhyZ&
=FbC!E <KJ*Xuqq6!W4PYFSX&m9L*ynqYj^y&VBZ1R>GPm6pIqi$luc<+1iHNXD9w85H4K&%T:Wk/qu@IRi+WAQ
ucqXRE 1@Kt@qGQuCk9/&N/6AS:eNld\=+b>6T\F+hiB@R&wJhBiW*?4EhV$PPCuld$5ClQ#N&/>+=iBQR1w\eB
NuHZ9Q QRePlq4aMNVjeZDdQLl6H9=d&#\AZaW:&Ii%L51u^:iijSeLl9Y:N*9D%Cb&8wP8\!Ku<WFL$Ypbn\58
ShwTYP hKPA/ADh*Ge4>XyaJ\9hPyRqecGli#K>dpJGAH@di/ihQ8u\=1bN5Xa?88BCN\yJFEuZy4nRnaN4C%^\
4@$1^# daH4Z:m&\AY*ZbEJ*Z/:wl=C?BwWjL&D<bpK8Z#t<9^9KjeiPuJ=kY9B!>!yhmGjeE!ii?kWyMZV^>\?
D$<DFX ?WLPj$4%\8nRXXmN^Q^Ni%+tY8!J8bueibp+I!a^N#NwZmc?y5R5Ab\NkKQtmdtbqYL#kNjAGT?JEh#E
?pAZBV QM\E6AdP^<SSZHT!+ak9#4>Ml>aItw?JM^h\>A9ua8cC%<kG4aFT6FHCc*l/?H6dwP&A6kecD4RD$E=A
!IIm9i I+B&B6wF/ACkk+BGAa$GPkTwGtkMWA*RPKD^RBPAJkIhCnRJ1BbwM6AWwKqA$+CtA<$Atkq$FNDSRK8A
nQE1am LkY/AilGwB<D@SVw6$AQAD$E>DDRI$CQAn$G>AVRp$B4kb+CikdwYcDukJ+HilHwbcBZkF+Fil*wDcA*
1DJBMF kh+Cil9wHcB*kh+Dil@wA/AQkV+C?lnwe/A9kL+E?kjRQ+G?A9wc/B8e:kupA^WDqRD%ACwF/kXWB6RZ
n:#:Q^ 1B@RAKAKwCFAR+G?B%RF6B9RD+D&ABwJhDAR%JtEPyNRb:IP/DAk1D6bD\S%J/H8JNThQAII/p:?CPka
c%5cCS wAckb1AYwFckN1Aw$HFAMcA+WD6RB>BCwEXAm+GYAB$QhALRmWAuAT$FYkc$HPlpwBXAy\KhBuR/$BqA
dWV+dn b\PhC*Ri$QqAF\BhCLRTCN/u9AVwM1DLkc+A8lLwK1C4kc+B8ldwPmB+=@ItV<$kit45lEp%8F<>^W>V
y/a$Nt @A#F#%L<HMZQW@#C8KuVcbtZKQjS4a+jZwl?jbHmq!\8YYG&Rc5eZtt&9$J%1:uqKjT9SH\/^bJ?H$D^
kET5^* cSTQwdmG?FbT9I4mV/&4F@ZY+<GJnhlA/SNZ+y:DFH?IMR:ZW?pZ$Zp#udjT?TR/u&lh^i?69WJyX<FQ
n:%P=c n8KnhC\Q^ll*ZcZ#!?t<le:nhF=L=@W9a!6XyHe:/<+YbtJD=c+ath!%G=q5lil/&A4LtdbCLM%YmGi\
BMWy+e FVd%NS#LLL8lk?!G^Q1N^A!\lbdhpL=?I&FDbLMb4mi:ajNh\:G?w=mhaCLZa\9Nk5JE45j%RRQ&:R!L
5mS!QI uSI&CnnEE1WlWE@$>@T+5*VP\i:8JBbmHaSS^tMMwdqyXl^*66t95c&qyc*X!Wn*p\hqM*TTl=cGSmeM
KcC!*V *XWi!6LpaY/$ejaC&q4Tli+uD*$!!kP1CCeV*XEi!ppi+tw#NTeA*X$i?ty=1Hjm+PSluai?1BDKR&&p
6BB=Dj Qhc&KBJdEK?5\:m88cG%*aqH>?69TmWQqnnW6#jk:5T#!VY>^AqF6=KHpJaHNY&%9mPKi+DmGY&*:wTl
lCpqCh 8<qDPIM<tEE4J\:hVl/<DQLkK1n:!wP9=MFXmbMHLR>FATQ54BtB\eEZ+pJjA:65C:Rh$QbA\+F&ANwJ
^cc/eL cAVR#pC:AB$AhBDRKKDSRIeAXRPNAcwBGke$HtkC$ETkR+EtAhWCVRccAnRXcB4RhKAbRDPBnkI/G8kC
5ZS$e^ wK8A4kc/D8ktZ!HWmZ8A:kNcDdRG/I>An\I>B9R+$JNAc+H?A9RW$NNA#\E>D@RC$E6Aj\N/GikXwFiB
bW9NRQ ZkN/HikNwDiB*kJ/B?lhwQiAQkV/CPlnwE?AQkZ/DPl#wK?A@kY$#leT/p/GkMJAQqASWAqRKXA9wDKk
8%tDFk QpADkC1ABkL6CAS%K/FiJhT44ALcF\n1V$L>Tck@CjWuwj:pJJ!KAkS%J\<Dk91V>WBRh^L1Vl+BhCVR
#yG6LF HKC=RQPAtwDtA!$Ac5cyLWC6RG%AWcDnkGJAecB&wA/klWCLkBaDLRE/H8kEwJPAq1+HT8A1uGIDhAuR
tD=GWI yWCZAX$PhAZRqWD\u8W%RQCiFSy8HkmGVwchDBhel5>LRd9E&TC*hlEhbiND!M^?Q?p#9p5EkVCKpP4F
C1Gb<W 8qpX#mwS%1\Kb/W/idC>u5XCd>D8%tc:$E*D/Pdt:1+RZJ9kkpnMj5:H?FZ4L9?dm!>L*G5MCP5F==:X
bpjeDW m4D:Hi5:+#:E888R/FYiC/J!5F/qp%<+F68DcLT=EPZW%p+/JBjjyKbbqSNceQTkMm5EaY*hyLEFKYhG
kK88:5 >blCQNjW?1uXlTluY5*McXY#=wqwQA:>p19*MeL^p\QXdyml?8M@QcTl8dt64dX!jKR=K8wt:%lH9+Q=
lbk<$C ?p&wdt?%1=<1y#H+i4W#K16*4S+^wnIA/FGZM&JEaeyyLND>SA6XV4Rk=WRYS@N>>/1ecM:*XheRd&^w
*aD#a! D4klZW=D9DDqNM:Ly*/YY?WETSC:uB!>5KtS+*u%HBj#k4+98I*S<SdSKw<dhG\$!@e%5*yKV9&DQGN#
el1k=% cKDbda$hlhAd5Zm55SDqeFbA%hYM#cqZ+?$hBTpHR^XWWn:Qli?9QBja&yBN9KZMC1dX^ba!i#pFcmtu
nq=C$# HDK^Mlhjdh&MuQi#Tdi+AhBuZYy^e=dVYKD:mSc1uGlB!mqWm#599@hX*8YYP@8Dhc*q#qWP5?ZPWp!Z
>PHA%k Y?=e=ST5=a:MFV<=eDq?y*ki1ww%BZ&*aTka#qhnT^/C:*a#cHG#99k864mB+I5FcZFuNLZ8<aQK^j95
CZ<#kG qcZFLi&T^wS!C1I^e=aVLhD>MDXh4uK+Z*KYe44<Jie1J=c#SaH*H6\!/*ImeSH\=YIlpVkJ1<ne+lbC
\JY@G5 Wp$=#eF+AycFFQDGwJ!&YjPD!yp!c*:Peu4W=6l^yH@%yPu%<PmSPe$*4Xa%PQDE*ic6?&1W@CieD^^b
Ay/Hw\ KRdY@EheKS<=hb?dQlWDQ*:L%QA@<Z^pbYntt^?PWnbt>jlC%J/!XjFXBN^QJl5#iV>Qq^ld6RDqKB5#
GICJnQ S#tbdM#$eqkc1qy@PVpqHnXW$Q%pcE5#*$?nGFGRey4n8b+LQcKX%Y$6$cdtV5K+*NKaldpj$JmFKAe?
e*!Ea8 m+Laluq1quKtnep8J!yRlRjXV!jdMGQ>wI%bpHJ!6E\=9w8$qtt>*:5yy#&i6^+4^ZGAIN%dy4\E<c6?
K/9iG> IepKlV9e#9\/<MP5QYT$RqZdBqcw<SIWwJ#1btlE+XN8CGlLwRd^8WVCu*X5l4bW>i+LeD?1X%/AelK>
mjnFBt elYa9jJn5@ZK=:Y*NA6tT%t^ap%/T&uKta?%KQK1b?wNBjbc5DiEBRYXk!NTw84+\HI+>/N/R\X+Z/w*
XT?XNJ XIB!qA%F+y#Qe/q!wHyEu9Yn=kEFBXqdY=j*:CBqm?ZcDYKw<%B&d\>qWEnSlaFY1QNRPk?q<%B&Lmjc
b>Fn?N pe>#jTii#n!D<*S8GE?ud4uXS4ibtaw*6yb:w&!bC9DqdElJbjuFe8$kQNVN#>w$=&h6WF9M#e@K4=\N
/ANA*F da6q8b?8&&LhhJ+Z&^dLZFDlddEeNwCiL^aa*H!^VY8?YC=H5Pm:5dZe%XQPZbDVHmGQX%BRH8WCqDN^
ek/w\p jt^PFXA?#%Y?8X5A!nPhZ@&piKd#iF?F$ynKM=&u@I#Cey1ma\5ll^8d^qRcK8Hl#8P=XDuw+e/#juJN
Q$iEy\ $^HqG?e<ueaC*e>GN6>uZu:%*HWdM@5Nhe*G#FZPSncQmY%nbm+wcYMYeD=W<Fh1#aj/dt$jXe=GNB?K
w&<S%b 6Nma65a5K1yZF&!jMWH%$\ZdJ:Aen1&S1!*h^G&N\Q4=L>kcYi?um:bG+HN^dAVPi??CnVAt%@jP6BGC
ILGl+u !$uhq/m9Y^*9k68Z!IXM<mDe9pR8CLe9pR6b=eH6T?TC&=jIlY#!+Qaqe5Hiq/nM:W9pk68Z!IW5<8D&
TcG!1h JZLB:W9pRnb=eQ5T8iD&JZIlt#\W8jE6F\Lp\+%98iDG6%#IJk>8jM5FN::qRnb=ePNdL4n^LSe!!wMd
j9db1N **Il4d@y^4heePNdLtTVB#i?=aId**Ilt#!+<T$ZW5i*jBCKl11&nwCqw\hD$JkYe4ptZBw*e@X*j/N+
WC=*&R bW1:uT1:jcm6u%DVh$J4i!VYGtt94FpedY/LhZZ@:RpS@di1!PKI1>F8GIy&:hp^eeI$<hwyhRq6GH46
Z$kwS5 :F8%X6^@9BD:nR?>68#a$NwH96!=H&S>V$+WydW%p/hD!#q4YpMM5VhQ4=<&hX5+Z%XZ%+b4+Z<:6Yp&
FBI:pq I9+<$BByS/q/Au/9lQnF5e$N!Q@P6F1FCQR=d9IK<deLwZMtyP\=J6aYlT69+%pL8d$t$S8ma%S/96kC
9AB&jV wy9WD<9FWDl?4i==b@RY!y+1ZTX&4BV!MJZiSi\J^#PJH^$G6%F/wlCq6>Aqynq>/wLVy!+WWJ??eeYF
R8Fqmq Sy??eePuKj4$nW89X@w$8lu4$=ARQThQtV!/61c1btbN=4wcyi/BDlSQq^jKH1EVLK/8:#48hLuV=W/Z
XwC>jI 8%AwZj:&a/8NLu@:4=Wy89#6S>a1Zj:Eb1#L!>RD\$*k5ij$8kqXiHNNm:P:W>R<WPFDMm!6H*C+4qh=
Hpy/4S L1#9\R:1i>PE?6/kG$M:1P@<!mpW%LiD/A+8y*DR&9PC9m?C%t=NdNGX/j6!$N1dF4S&ic/h#wc+ne//
bm6HC% >$buG:VFhS8h=XiP&?l5$>4w4JAdqNFtu*ki1wwFdpaclwJ^5$>5!ZG##<&k^h%pNmk4#+Z^Z4y^R4^9
jQBKWZ bND5G^8EiTGl^\P?*FVw<e\6dmEp%bT#EWGQ>/m6D6\FS9T9unT>Z8Ci<<*MDcaVNY^6MD%K&bnX+\9m
QRHFFq IpbdFX>F\Q%p5nHV6*lZ6twB!qE&bw=!M6taGdie#/Ylet\=u/Klk8+u^=d#6p$*wmDqNMh#QSePE%XY
&W#Ck: 6:XEt=w:CiN!T&MY=u=Aa^cmuNtSPjuK5!+uQ<%T#4R^&iXEBc4\wQ4ybB6t4B?$MR6TVw/YKeh*pha!
w4SNq: 4jh:N?Y$^@QYa/Y=h8A1W%/CAt\=4:\EBTlHdS/SRP*Qa<6=%d59\Q&wZupB!publILbK#<&Y/>edWLB
R#PkY> dCp4X1^Jd!qNPaqNKQKwb?wNBjbc5DiEBRYXw#cl\F$Y<u#91nhWkQiqipMFKEjbWIqNKQJ+LqWPdpKS
JBCi+l b@%Mdt5NH4CY6dX%5Z#%n4LFenkwN@q6i=&HMp<QbXAw?Qc@#pQyQJVh!WQJ*yw6e$Hjmce##?A<uS9G
1!*TXj $/qd:6yIdG+YW/F+a&8=N<1Y1RBj#wcWXJbjLMj$4E*iy88&<:M&1C*t=tjqX</G65Y!*E@ZddF8P5?L
t5^!uP da6qL1n\6qkPG$DQF\5Md4:aynXjLJenYQVh&F48Lt^HHMnVli&IA*pt#w@N1RLK=:uKN*eLaMN8n=^d
^S9#C+ $&*a:bG#@n=KhGq:=E&1F/\$FG?d=b#qMdhbDm\n%#RhWd=^#6NyLND>dGV#jidqX<>h6#G#*%DZdM^e
Cn9H!R =Y^p<=naNtdtkyI&bkHuR\X@yhb<1P@Y>qHqdEV#wbKd^YhSWd&/aQ5EdnujBh5u5B!P4bG4Lh*Eda*A
h6=QBF ?9p9&Byb:/iL6pdke*F5BM=::+KNMCdZ></$EaLLCaumnYkpjJAdCZen+S9M??yG\9M4b/MdCh?M%<dp
-AG\w: 000dde3632a001202b3 Page 125 of binaries1.zip
FVHSKQ Gh!I5S5^*wT<b>%^^HmRG#F&I<a=&^\*ay^jPS9hmQFtm<RS*Fc/pXY8#dLJnK#tHG<we?MNG*C<wXC4
nuh&kQ =Rw&d4Eb4*ePCN*b9=>#45WAN>jC#dZI&*di&Pbc6PT6iDi1PS81HDhuI&h=tWCZ%:Pe9PXRqXPAPTS8
jV/B^a lHaV%FB8lDcQ>>+FndClStn4FC1\FFJ$<#Bkl?wya&y&1N^l#Plyw!G1t%A>daj8XAFiAYRkJMKmb$H8
c$I:dT St/Wh%T+VSZYF>K:aHjR/a/KGiMIL4m\GRiW@DGSYS%#8&5FTN#e9Y*YjLenb@ePJe+i#Bm/9lYTDClL
>8ehh+ !9VjMWjIDF6*/G9LG+B8BLyJN?8hVRRZ<kuHHBN9d\n$yG<ADi\&#?4&\Y&i=WLiIdF=%m8Z4E&wq6A4
u6%@H# %?/Y5uuYK/6iC%$*ej!I\<Zt9BGm<*FS/Qa?44BVC!u&atE<dF+Bd<t>wZTLjmCp@pjZm@!^6k:q#im6
LWPGSN k@l@$S?I?KQCX@FQ!c9+M>FL^V@Z:$d?k9J@TjE6XN/9/Q^YK8@ZXQ=6XN:6XQ+hFQ>GFKu+6@T@P?q@
%!<>yD h+piK9+hZp@iI<4W&S@wZ>@y%d/#EPymZ!@5>qa5TDq8d$W*E#9je6#imt=9^R#B#inP9^\Mdt>FSk9u
P$:WB* %t69Tm&8Y/?hZ#pP8h#64in&X5!u^ZX:K?cu/h#im6uKeZ54BkT*6/LdY>H64in&Xq!Qe6#imt=9Sdi*
8B#1<4 w66d$i&6/QbYhB:Kd8mlDAwPWhJ=KJ&HMy>!*N/K#6P=jy=Pl=SbpJdJ:c&+/hq$Dmq#R>lmdu=Yj8Y+
#L:R4> 9SZh*wy=&YI=dACHAM1%^h#im6>b!?*\@nbBC<D64bk^nBIPy<@64XkRY>Z64bnDluJ:K/:Qe!X6VIi>
XylZII :QbY:NSPP8SPl>!b^*99kw&\abA:ehbQ5XwjP<DVcILTkZb%:+CLyNhBGKXQ=H+awNYI:^ih$:^ja%6L
jeB<=^ T%84p=H8J\<R>i+5D!$NnW+a815<qKZJ\>^w+?\F?$W:bntS/Jd!WJ=SHqBFPJuwn9LRl?RlQ1<lFyu6
@QN#S! BKC:!$NjLR@%Vl!eQK!D@tcyCKE<%Edca&&LI4EF<ew/nP8cG%4duZl$9@/tXQJkmWN>i$Q4:Ida:MyJ
8!Q9dP VdNmDdEqVmm/qV!E6D!w!Zd%HXH$J8Qb?EnD:Ek5:wTl8<qDPIM<cM*RFHHm$Q*p\e5kD//C81<<?Ewi
bQS@uw ZJW+ihD!WPT\XA6Tn5NThZQ%<!*Hacp/LNWM\e&N#:<eDA=LqhHCPcTCVcuFhWkF?bZnpAweq14DW5&u
*5<^a= ^ZXa19qyPwiqt1$el/WcEB!Y15NThXm1Dp6%Qey^YKwPT>Xl1Vw5Xaiq/4BWuai!G*wwk+LDWuWiT8il
y\%E+Z #Keel/Z1QJ*4=?q$YKwFcbpeq81tb>M=LNWNaa8=?Xu=qiP\XB&Ycq/&YA+d\GGyet$^l/Z/udZeDp6%
h?TSiy E:RAHJb1^nBKPC^Xl/XcEF9Xacut5KEeq84/QFjT^uSa1k=L6XM:/dBWHbb1H8?>C#dCl5FTDWplMil@
LJ@tWN %E?wET=$/#C99V&/*//:wm/wmui$XnY&6i\cndZN:tl5n?</j@cCZZi9&u%ZcI9m8#bEt*d6FqZmCbq*
u*^I:^ GTEwyVBB16JE#<qVJw?84ct1tXtVZj*ym*wtum+9qD%CJ/TWJy*M8?Cp\AWZYKGCnKY\1+wW=iE5TSie
Hcqy+1 JYpHy!GeluDBcamk#<Lb*T/+q5K%FC/+qmIwqDkb/P=l#NlJ$@yPcG&Q^Fwn:bW%m/QNddFIF%ew=9q*
V1R$pu F#d%5N688/EePVQDYh+8KG5V=cAwJBNTpYKK>:D+RlAXb?GVXkJ@KGH\dR9Snpp?ta$QX>6@u<G*QWR:
QEPQD\ MjmGR#TC\deDSD5#?HcCcFeGH<:6&w*B6#NE8#Q+hwHwB\!?A!Ac#iA:CKJ1B6<wmGwajKMlG59k\%Xb
CKWl=d +^l<PP>wQIMQ=%SQaQBlu&wmk&<eSJMajIk*Xe9kt\DSbAdjSImtMQl\DYkhk\@u>B@G+K8FcC1Dd#JE
q#4B8S >R!?KSBNa@BNlYkGk\@d:mMajNMl?mGDd\bES#H+bpI$l<F*CpTZMjlPl?l!B6>KmH/Z=QP!<c&C/G+G
6@Inya *!WR@aF^*T5k8y@B>^PIutZ\*R:S%\!?*$K$l5F*J$SDGH^*RVTW\Ze*SMMajL?H/N<M995k?ntDd#XE
lRdZA^ Q&Z\*R@Sqk!?B!G/k<H*MESdMjkikYPI\jhHPIabjI>CXMuk?^NE&#D+uwDwQAdjp^Ch#?BDFJ$LGH^Q
4mFCm1 RdTT\jhZmFa^?J/G/CIG*#N\LGL\QR9Hakdje^Bh#PB:H1JLGH\9RHRyk?>FmM=t<L$E$VpM9yel&ydB
SGPtbA >\yE&#H+ZwXwi\djt*A5bjC>BehiDL/*+hmd\jePSF5#?N/Fa^tD:#$+>tH\9R@Hekdjl*D5#?kHjAVH
YN&FB/ Cpb=u<J^EIQ9G#l!?k94+MnwB&BTM9wB?IQeleEHFTEb@RX5\CYn9!CL+MnwB$nw!<p>GZ\>+dkZk/<Z
adEmj1 HQhl<QYG+:+M9u=\QInB%^?PB#Q+B5B^XG:=p>AjqA#:Yi+IS+bhLKE@KBu&4wV?wJ#P+IQ?wD!e\Rj>
<=$:m: Hnp@6@$uwh<nF#D+^5K^tZFh/B@JFkaj>I>pK+MQ?pi!neEH@TQb#um@&P@=qqEi>FQpCR!?Pnmi!PA:
nS+>K1 DI+uMjmku!JQb9AhD5hVGH#au/qm<B$B^^WM96pReiRQIaKPbQDl88phGH^#+en\k<l=eN!d\heE^=EM
w49i>M 99q\*IQB%\4HJR#=c+Mn\*/SWVki!PA:Dw:uM9lmeD!A\SiHI<N?q8%\=MkX4n+<qMG*EI+Mi%\8kmQD
@4EH4F HyiL+hmV\deEnle!?I/HI<P?q!jApYHj!^Ql8D?Dd!peGj$A8R!PDL6hLwen\&/ZJ<PSadjLW?DI<G@I
+W+iF@ $?B+PiQ:PAPPX#LKP^Pmi^q<b$H$AIQ9dDli^iA:B+=ZM@nPliM%DL:#+Hk6k?>CmQ:D+F5F^@5ajBjB
G6B^J5 <Z:G?:kanyJS*mX\jInBh!pet^l<q<H^aRdj=SB>\?BD@>Y6DD9uTnk?\mn9cnn8^?C:Fw/eh9AcPM=p
L/9#d\ <F$A^><#*y9n&+#=jCE8BJJA&\J6B:R>$HCkHaB&AlwB6DQRLpAHAB$ENAywNNAlRNXAa+B1kMaBnRic
%plSen ADRS/FCkTWC%RJPBykBNBbwGNB%wB6BMwKPAnkc/APk1wK8B4kP/CilYwH8A:kNcDdRG/I>An\I>B9R+
e5bktj $JNAc+H?A9RW$NNA#\E>D@RC$E6Aj\N/GikXwFiBZkN/HikNwDiB*kJ/B?lhwQiAQkV/CPlnwE?AQkZ/
httnWM DPl#wK?A@kY$#weQDCkEFAd!ka1ATwBKkZwBqRH%ASwAXAE$EGlHIKldCjW1wX=qFhC?RFB@E8yQR9%J
#@/4Z: 1D<J>Til@mVWu+T/p+eBRj*JimCwP\q%J+<APlJwD6BewHqAVWD#kSaANRP%ALWC6RFFka+DmkHFkh1B
&Y^p:< PwAYAm$CYk!$BPl+wBPAVkJcC4RMcDuR!WCuAy$PhAdRtWBuAb$NhA:R8WAkW*IX$MXAq\BhCuSbG5>=
Y#bbFb RPj:KKh8#wALKX4JBSheCAmJ6bL8m*HBlc=>Mi/deeFyVlhe/J4thG9HZEkJdyY^p\EZZPlCG/Ie#mIm
eIj6AA laZcyqDkbQT&TVj5IMRJN:9K/4+NT4m#ZB!He4F8*V9#ZjX$&:DA/!\ZMbCLHaYaMMBXV:eNJ@1h=TKP
wVI>\B e4F8*d9H8?4y6tFbpY&dc=Vb$*=>%tFX/>b>@Jm4ut+cWA1GVJ$!JYYN9n>8/9REku?w=@RJqbPcb5Wc
!@lMIS ap9k6NjaCbN1eQ+8^ZW/F4jV?bWWu$H^ewwQI:/*/Q^5m5hVQI:m5hcqi^VX#&8ISZBKdB@/?ZCKV/dm
#y*QA< L1H#e?n<I#1@nPJ#Kj>6Pq>C<jEWu$C@9$j^?=S@Jy*@^Lwh4&hh&/JI4K/=wSY*VkldQ@Z9PVwcnVVE
PA6bV? GqwdeYL8ACwqVuE:^j$y>mn8S*GM+l$yQwLmlSRjS*GW+y$yDqN<I5Y>KY/niDnFP%t*P1D9/F4eK1E=
Gbbn@n $lJydY>wd&y4lh^m+m!miD:FVSV*wLku^jMwut8XZNG99u%&=/Iq5jc!YAh=%Y$^4Kt6/ee=XN@dW4\h
AmJnZi ^h6VuHmTT?q<B#1jRie:WV!Ca1wl5R9^uWZuB>D=Mnw@mPJSFI?t*=hTjDZqH$J^NeXnKK+l9k+/J#EY
^>y$ta JNbmA9$?ue+u$nuJ4dmC+pP6!luea*y:W*NVi=Qc!1Pe@pHXKCbSZE9^bIyuWy#+MAZF%%I<t*/jT9E/
P@tlJ/ m1hSVHewI*Ti1Nq94D94Fa:P\d$jRqbi:*BLA$L?D/d@$^8Rm!liSZGmJ5/neu>L<b$W*$Z^*SV@u9k9
WEcBLZ yQl!mlQQj^@F1!t?u?IHmi>mPu?a+pewjwjmQ%L<KMX@w9lh/>uKml4dYqyTQyDF^Qa!^c>R@C4Fd%y@
*ebE^l :?QNcYyGKT?qH=?k?EtK%%L<FMX@yjlymy?l?FtKu/Q+iayj5C=Y:phnpVpwMTH/>WYKZ:K+bIXY=TBd
hA8uAG qeM4y$dmdS&^SmXubjTAy>C@E9HyFCe?++S8P+%m?lIpjRqmJeYJ>=/R<E?68!n14ji!yV6BXW>emZ5u
WP9@y+ #Ta?^DmeqKKL/L!b#q9yuKSCV4T8+9jic=>DP%<FJ>XSjJTP=d+WK=u^TNb\klmh^?t<q5:49@nmH@@+
Jjn:=N +4M999km#EV$CDMSQeJMSI>\MKKH5QmCED%59mBED=59CNHD=k6C>LD=klA>dL+kSA?dL\nS\?aLR9T\
l!=+uC ?aIRQY!?IERQt&?W!I:wajMFIZ4ajEGIHnbjEKKH#SiE/GH#BTF/&H^BmB+&Z^Cml<$ZlPll<\Wli6l<
iTQeR6 RakiNq<RwwjNF+VwajMFIZ4ajEGIHnbjEKKH#SiE/GH#BTF/&H^BmB+&Z^Cml<%*n5mP%GH#uT8!I*@a
Qeu>Zp jJiJ:IkiNl?8hLmd\ZiX!I:wajNhJ:Ini6l<9^VbEV%5QpVY?J4Bl+kbc^l<>+n5mB+&*&1SHaHD=q5n
eqn8Zu 5mN\&H\Qmi\IHDajItb5!iD:w<mP\GH#IeLFXk!?^\MRPG!?Q\ekeNl<mJlS!iBDJI^6GH!IeHEik\<S
5V8+8R L5=u<D$n5mN\&H!IZLGT\ajIFc5ajIleeSGD:<WABA/d:/WABA/d:&<mP\KH#aeIF=e\?BDl+qIGH!Je
&i=el: uM*ki$%pS?C\?h+R&SE+dL+*SZaEDy99LbEhkeQti!<AkeQti#<AkeQt?!AAkeQt?:9In5Bl<*$akMBl
5A?bb8 <*$WkMBl<*$ekMBl<*$YkMBl<*$ikMBl<@$nAIHD=q5ZkMBl<TuEDIdhLpMBCB\&Z#kAkeQt<\MRPG!?
pIGVH5 wkAEDy89JACB\?a4DWDk5Qq/BTB\&H^qARkeNq?jAARPt&>AAAKH#XeSkMBl<\$MRPC\?ZaMRPC\?ZaK
#Vnc^w RPC\?ZaPRPC\?ZaJRPC\?cwCEDl594EBCB\&*:kABA/dd*\AAwjNN!EAkeQtt^mA\GH#HS1A\GH#Rj>D
ZWm!%< hnDiL@a49tYWX^iA\GH#HScA\GH#VR%A+LD=Dk>A+LD=bkRkeNl<&K?wa9D>MACB\?bDl^%H@lBb+$kG
hiFdRT *%!SHaHD=y5ZkMBl<#WFIHDajQMDEDl59kWBCB\&Z#Q<jCbD@qwCEDl596aABA/d4!$AkeQtm\akeNl<
M/e*+k ^\WkeNl<5RAEDy5QHa8HM9ncA^A+dL/PAARPt&>lAAKH#dewAIHD=q5ekMBl<!$JRPC\?a+QRPC\?W+M
*iC%:n RPC\?W+KRPC\?baGIHDajM5CEDl598WBCB\&*+wABA/d::RABA/dD^FL:&Z\uTG!I*DajGeGIHDajGeF
-AmYLd 000dc58bc93001202b3 Page 126 of binaries1.zip
YGwhm# IHDajGeHIHDajPeEIHDajBiI:AkeN6@KAARPt\?SPqa#*5hFARkeN6@FARkeN6<qARkeN6?qARkeNl@/
QV=b@K 4:=l<KH@/qcGuZNFAAKH#ZhXAAKH#ZhNAAKH#Zh%AAKH#Zh?AEKD+*N</<ZuMejyQCbT95hE!9iaTQpi
bA95WF E!uja!Lqi$!pjI?JqP<^pjI>JqK?^$VK>=lI?S+VKh>nI8X:VKS<n+tW:#GS<n$tW4:HSM4*tEn=HlMy
\>w?Tl *&Mm=Z6MyH!QmbV9MbH!QTbT95hE!9iaTQpiE!uja!Lqi$!pjI?JqA><S$GWE<EV?I/G1IQB6$w\pQiB
S&58D9 :%LBRN+H9l5EA*pjet<WDPS>!Q&^aCD9A>>QBRN=*>NI?e<!?B+RDPS>V+?D4YH\QT\a!Q8iRw:Qnd#9
5Ln^q8 cWV+aR!?^\RDih@V+%5@b@A>KSnI?=+iB>8T\jiWaCD9i*y<c!5G*:Me=H%QnaQqS6:*>DlaJaQ9SeFA
HM!LaH *9j$iNS=DL=ZBAN=*>QnWSe\?F+ZDPS>V+>H4YL\9Tpa!Q8iSuA9a9C>#WHi>#TC?<WM9ueFA*ujW?Nk
Jy$Q?M 8bH*QVWPql6=*%QnaLtS>#$%9yWdih>V+%8=pje>Nd/XG*uj$?NYyR!?L#nI?<D*JRh=*%QnaLtS>+H9
Lmdlu# u^#pjiD:mwP<D*^je=D*Qa&AZ=GdV!HdD&L\?S^EjiA4=mD1i*1<nNFjWIn%8#D+TntI?y+iX&Q$K>T+
Cl&IBb G1P@IQ6!EQW>nY!@F+N9AAhS*>Qnd@5!?Ib\EQYBd!kHWS@+95hB%Qj$iBuD#yc:eSD%ki<HHES>+N8D
=^D:^? k/kQjCM=mQ4Ah#CeH5%+*qwP<4/u^5F!I?>:Gwt?tZF@hS#pjW?Qq:W!?Kb!pQh^5nGeLtLW!*VBRN:*
R%eCWK >LncCR!?tS#pjW<n&=@E+D8ck:\QjD@mIP<D*#GCkd\QjA$e=H%QnY<Jny!&CAd!91jG6*In:*6/jI9l
#S$y9* X%HnY*5#?I:nIP>:iu^4D\ajI6cj#bC@hk:!91jH6\=p<C*pIP>:iu#4AAdjak:!91jH6#l!hd^kIP>:
^Dkq!h G4Giaa?4eVCGQc:G\Zw!?Jb!pQe>QR:G5P@XPBnD9qjI>95#?Fb\pQiB:%RP<4/u^>Wahn8P1$tG*c/R
DntCS6 <lu?DVWPhnun?#mZk:#9KeV/*Mn:u9J:=$di>#Vm>XWM9k5=!Q8iHu?:l5G*mwP<:/u^56#I?==G4L?Q
w?LKX# \Ze=uD:IiB>ZeJD*Qa%a@^CD:!wP<4/u^<Eib9BhI^nI?==C\M?N9A><%*GR>+H9Bk:!Q9Dh^EHiB:+d
5@ySX@ Pen:ul=j@V*n9Vt?#bnQb+:V?e#%d#=#@b9QZQ@tM>i@?e#%d#=#@b9QZQ@tM>i@?e#%d#=#@b9QZQ@t
1<XcEN M>i@?e#%d#=#@b9QZQ@tM>i@?e#%d#=#@b9QZQ@tM>i@?e#%d#=#@b9QZQ@tM>i@?e#%d#=#@b9QZQ@t
#>T<wh M>i@?e#%d#=#@b9QZQ@tM<jyjPa+Hi+iIln4/ZDHE<FaV?j4>Y<=%>QldmYC5b:P%?9p@5C+:p&C5b+P
hnZKh+ h$aSnQX$9q:@>nYD:#:BYE@u/*X!R^l<c\SnQb&9%:Z>uMH*1GC5y@Q%iN/YDL:HBYM>uc@H<:bm<K*q
cZEleB 4KjDZYw+/?q<Qi=Z!iB:YnDY$@q/Zh6=DL:uBYM>uc@Z6X*A+H6JMNdV?Z1>&mwG*<8C5b:PX?PD8hjV
R&4ReC ?Yy<MQh/Pq?9X:8a\ji/aK!u<@W++1WM9neFa#&h4>i%ueQki$e\%6Q=iu^\P\dji+K^u5:Z/>XKGZ\j
tkJ4A/ ehdV?Z1>Yt<G*!iC5b:P%#6Bq#H+Q8P5y@Q%PGI=k?<4#nw=*HGK5$:Pb//V<=u4=H#tPntj8W:Pb//V
WSW=ZD <=u4=H#tPntj8W:Pb//V<=u4=H#tPntj8W:Pb//V<=u4=H#tPntj8W:Pb//V<=u4=H#tPnpE6\paX:Q=
^B<#Bb ^uHY$@q/uh\CB6<E#uw/Z/?Vc&H\HeybV?j4hZJ6DD+eS%#I1Jeyk4Gi#6jnjme\?Kb!%6Q=i6#9JAdj
d4X=NR DM=/Pq?Q==*C+D6CMNdV+i=/uQX$9q+u^=HV8aK^u5=Z/?S!4/j#>Vw=ll>E4bQdt<G*kLPi#6j4=Qbk
RXQlAl <PE/8dMa<6jKYW@u/*HEA^q<We=/Pq?QI^:A+I6^%6Q=il!SI%j6k4Gi#6jnmA^:ZI$nM8^^Na:ap<G*
ynwQVZ tLPi#6jnmA#:Z1&Va>n*cl^^j\djTb#%hL+iH&Va:Yy<pGG*1@FBl6&8^kebjka%:ue=+@5+udPi#6j4
/<kPDe =P=q<J$yGP9yjL%P:mwG*>te>ZT?Zmh*DaQ9ZM=/Pn>+S&8dd^XuQb&9@jh4GP@nE5=/Pq?9j*8I\Zeb
qlC&:! b#&h4<j>Htd\ZTEa/?q<Ni/Zi#&h4<j>HtGWh\%uQb&9^?p+:iC%uQX$j9CP^+:Q<c$Zu^AqY\p^RLVE
4a$n=d &&Py?h9>ZImi!!G@PVZ@i<Aj^9#Y%Q!6$Q?:I?R*yidZkX/1yQLD:!Z#F:$p^EA1*</@?M>CFFQ=hn:&
\MZclS +$RXa1PKWQ&EyG<eeTnESJ$@/TKl<Vp^@*4E9Fd=<q=we\XXRQluPI!y?ae>Lk#Gj9kYp!<j*W/:GqV?
=S#+qd dimj$9pj+n+hSV4jG\ZZcNjqDL$iK=J1@k/5QJ$@/8*pYKiQj5h?P4<CjVa>KS@um/@T=j>5Q$mZ/9!m
Qk>X=6 E=QQXj5XyH6SQ1+n&W9ud\h>S>Gd<9?DcX*PS>DtmnKhZ+##kWM/@^$eC?qD:^&9M$CZM^:u6yj4@K%Q
Yt$Mab R4>5T*8<&S=@EKGLwd<#>Ce6:hHWjHHk#jDn8T*6#Y&y?X9lPyb!+G>KLihl5Q6:u6nTQnj69i</Au:e
#>J&SW 8TWcd$4JD/%>C==lXN&piL8RQ@=T/HFkLQ?=yL#b=dSD8^ycA>iNy>:Q%4?$um9=MaTi*<=/L85nPj>I
NmtDph 1^\4j/6%%uNb?XhDQ#S$K6YDqX?J>V%E%ZN+b=\n5=@PZ\N&#JDZhQ=5uQ8^9</@9m?<!%+/9@q&weh6
qQm1+8 IZ\P/j&c>j9/DNhEHWnqj^@>8=1@Q&IGHpVQ8^5eBtu?&@+C/aMyH@6h?45IK=pcSjp+V/XM=<@ENX!n
L?GV$4 hj+&PH?1TPh9kYNpl^D@u@HihQu*jT*$8C#!>$mYM^?@#VE/j*j5*:/w</@C8bi$\>+&Y/B5/@#qYFhn
6CWAIY hj/&PH>1qm:@6@n6nCQ?da*elqhk?iQyjtLt8WJ4n^X/jBZCH46nbY9?M@B:uEn=CyhL=\@Ed?%Rud<u
9MkPXc *6hQhQ+^J\5>Zw4*<+uSQ?F&@Ab4mj<niP@/@pQ*@F9w<XB<#YM6iW5cHcE9H4jp#VJG:9!:JY>Y@6dn
AC!Lj5 LZt#<8@?qjZhYjud:J&W6\N^:5IW4R=*&Twyd+6SNkli?icIpVh9BQd^D>Q<:RebiR6jkt9tyt4?9j<9
S^>!*^ KY<#eW!!u1:dbPR6jBHiE?%E5M&STZt:d=DR+:H+GR>L!5u88Ld4eJ&@4$nK&=8wp&eR@\knd>:*WM@Q
%6=WE5 yQ!=!ZL&Q\ZHlHZ?/DqJiS8L&A5@yQjXP!q9L!^GZ+ZP4^=q=C*<M>R^S^H@+KT<Zad*eDSh6!Q=ZE>@
&cEqEC A?pjWVp*J8X6Ihnc+lmhQ&bPW6:G+:$j1@N4qmdq:Y%<>\$pQ$XJiV5e^!=u/j\JV^l=C=?I<6cw<!h6
Xma5D9 cetdd<Rl*Kjhp4hp9qm>qTX9X9:YM!%=5@JjjenTd%d?&PFG*4!dHwV$dC$@+>abijNL5R+mt9<Z^^q=
tV/uLM <<hlY#NH<:>>ybE*j*<e?=%L#*YRpVh@B81wiZVhWWdi9L@kN$h&^*dL#H9^6*\Y$4T*%y/:GDu^B&Qh
AGaRkG L>D=6VXG*4^j4IRM5ujG#nV!=8?M9w\Yim<np?X<H*WA&WGVD#Z!=p@APb%6XM:FS6/<l:Ahn?4</Cwn
8!hhaV d>+q1GPPI@:4nd#=T#?DNNqqa?<\#?Y6Sb$Yy*K?NQLtF?EaYd9PQ?+8I&@?NtkVhin<&Fwnd@+^iM&F
+nm+4b XQ/>S6/<^:>FA$*u**cTpVh@IH/#m&*4n8T1KN&1JLt!<4e:^=JQK*@Su!^=!%CPpne4@>AZnd\X^XG@
lDnKLA LhH=d:<McuA*uZ<?!mD6pjSBd!N9SW@li#qB!>56aAeP8%Hun<A%qCh1@9lmI&>Fh/LiPIt8?/YS6/LL
MRt/kL j\DyyTTj9e^:Kb1QQM9I:6*i!EuSNtkdL6j=h=^q=K*wDt#DV!d?Qa!<Fe*=Z$mjR9Z#?&R=c@CbX8n<
?=t!5b *%^k=K*w86>B^1p/@:wJS6/KVpdbP+*!y^6=K&4cG6KuW@/hS6/Kn5Y%#GhR@y?T#*W^/5I#hj/uk+&<
&Pyb6A FT*D?ntL<q>P!66:PJjldF*Q5%+%<qa$Fd?le/n<b+!<Fh&L<ut8=u><pyG*wnZ@k&Q/XD<wy><Di!?c
aHMP:$ Jn<wH#>R@MPL$ac>TJjVCM@l%/u<:e@G6iEZW*5WMZd?>5&wa!/lhlBqi^?h@\XmNF>K>8R!a%h9@!l?
#iINSh Z=jy@M@?dc/:@Wja>:qeZ*jie<u4uwc&!lX$*SZJ/*/GN61XbNhNN>ehQtejwijq+HQhpL#8Gt\V46dq
<$:dL9 6^/Z9P:dKFjZWQ=N=44D><i<c$u9nVdZHV+H9?u4NH@<m?V#ZwLQiD%h>^b#*iE#ed@KG<k?\Z4iS8WQ
N<=Gt! ?AC@Xh4L<tc<@*Khj!*c5Q>L*?QYyq>VWaX6:E?wuJYtZ%N^=J=C4>9H>8XpW*:F<Vku+GjE@%K!@MhR
=#i9Ru :@%e*@<VM=Qq6*&KDR9X\\:J<wjk8@$qqZ>V<9/j\Yi/li:##/d<myqa^1?w@GT@dMBnFWLQS+L<J=Q>
^u<y5b 5ww=&Ij/NdZL$$#=@TyS^>^I?R6N?j$8\n1?Tii9ZGjK::h%Q$n@n<=jqc!jj59\8Z=M=b^8>F:bS>n&
FjyMkm dc@6!ewm$</Y6iB:H/:9e?%Mw@jK/qFPh6D<?:%n&6t!9jFcP>J%Z#J/4+@K?n=h>*1n>@yI%L$:Wj=h
!TXpZ# Sn?W*auj\kmTu^qGZ=Y>lPZ94QQ9@d9Si*&Gw!#5w9M9i5Qw9V+q1Li4!A?\bdKe>%Du/D&Y=jNFS8?X
/cJdde @iwQpLMd*e<DS8?X*a>6*i=W#5:ti!q:CY&*<*W=L:^t9yi!Q/B5Z$Dj/R##9bV>Gu&9F%I=Q#L/5$!y
4tq$a$ 6l@w@AjiNN>Su/&\LXlJ@K9Nh%R&BuZJKy%@*&hG*=dhm*y:D/1*TLI?+%kHI*Z?k$PN9m*:M@cB>6V*
B8QS\Z @?^5w&@LQ5D??%:Eu>T*bTjkj@jY?Y>>ajS6&Z=wV?/n!*q%N/N9!>:@DSukKPeQt?iT\>Ai8I*/y&H#
kwlSDR ZPIiqPHdTa?hb?SjQIX#tP/kj5RII@@!cK#n*?n<N!ab?Sh@^*9@LX**Y!Q@+uhwl>?y<%<@APidcL9*
kDk:!> R8#L*1Zq8RQ/JYH6X@H&Sj9#h#y@/dtG*=8L*?DhPu@b%Wu??Yk:@F:uu*JLp4<S9>F:hQ/Ki=Q<Dcnd
%AtHTe @1D##*\?iV>Q@A5FZPij>X/TQ+w!jB<>:!6J@1i^n:Xc=#>*wyHQ<Lj+VQj4e5:>q=HQ<F?\#l@R?c8*
%6eJ4% T=a@EuZWk#y@ChSD1EVq>*khQ?A%P9<E/QiEhjp>DpTj!WNp@@6Gu@Rak:44ae%@&%JVV5<6WY+j$jq*
$wLXpX uJ+5=^&$1@>IiuX85y!%1K<i%j!u4$*i#\h+:*y9\6Chh!ZLYaa/=p?pl&>Qq4Mahi*nt9@8D=Lq4MY/
djS/<V @LQP9?j#bDtL<S6<k8S\q&R=S&Gj<puN9&ym5y!D<N6h1@Mj*C6b#kjaJ@kL9bhdp8X<nYW?Sju@XQb1
*FKc>8 R*PcZ@RA%GN4Yl1m#itP%9<HWE5DBBRAAkAIAG6XdTX*^>81L*$DAADpBAA+AAAAa&^ybY=$e!>\b*A9
-A%K1q 0002a3470c6001202b3 Page 127 of binaries1.zip
Q*n&85 dYFnL%BHWGN5cYX8hE^yam>#d*X!a&W9WEhRW*B5aZNwRqM8euN!a!=mcY/W@RhaXFtZ@wFYpVMWCIK=
c1D4%6 6h8em!DtlDtlakbFSES!#nquWXFSWXFRWXFS5wAkwAKT5/uNGVMT15+=h/%>C4Su=9/ji?h:GL9X%1L1
8mTw^N @Qd:44k=K88Y466kd&*16G@ll5tPVw=tuQ@@@t@>l9YL%t<\YM#>:$>L9F^%>ee$/+!EL?9@9@!HARGl
DAlc%k p9kn@IeTL*=^JJ:@ku@b=GT=*6VbjLYL6dPq9dYq8cQEtZGD\+85F4n55dSdc8/<>u?>*A*&hudY=w/Y
RZm=H> i<#hJ8?#h@4#BVH\j@@::<YZ%jeTF:w+Ldh%Nui$NdW&eGh@NLK%54X#5=W+QW\t@QbP?C8ZP=9dTJ#%
Cdn&n6 $kk9>q&%hMFmT!e#c#5uF$j#na/Yy4aY%8dm+ZWD\w9N:Qcat/&&6LY$edFbdPy585HT$%\m+cl!iDH?
+iG!W$ &#JV&#*\Inh/&MNQFk+KL:amQ\6@Ppie=<l#JK@uNdiF\^NnFDkMDj?&VQVX>!9+j<ue:^!NGR8Z4@:>
Wn8A1< <$5hI?#*Zh8>H>=G8j:ji^^?bMK&@QHjTyB@:95#XVknPPIetj@%%9V>QjnnjQHFh^qX11j#?>iPD?>i
Nq9pC% 9*#?:=NH:Y&64T%$M>ZEcSDWD&6wct=yc*@<=NtL%&<@hH#/?PHn^$<hu:>>@>Hb%hM4yIVME&amVRpF
F!T:nh QX&@Pn6@@9n?:i6u@JNi@Q8p9dZyRhu6k4!5nK8ZL/ciQbPejDbq:TA6wTcn>WXVjcD/bQ?1*N!<<^G*
=Lq!aG c61i9HnZ<d&#Y$B^KV1I1Yeat1bYCAY>Qh%h<Gh??>L^/eP:N/>j5K?88cG/+t=y!i%Cb&eZN?@AmINJ
R9w6j^ 1eqJmWeP^ejF^5VEHV1YhQbmitb?TWX6<<Nud#=>:?4??bZ=\u!tP\dB1*@XZu$uN#*qiH^WTICQy:8L
I//4$I w:&6>j=>Fu6ye?+iM*4*PNNhP$&MVW^&t8:ia&=lcYXn=?Dm=8un:iZy=iZ6+^eRFBISe?B\+1tW6G6W
a=MA5i FyQJ*KS8eG>tj5/T8*H6Tl1?nIV+tKHSpSFlIWEB@4:+F#naYq98Nh&!i8tm8VQ%hHX$6IX<JY$6cTqJ
^lK<1* cVqq6REDiIy!M4T$4y!mm4KTkwKm5w1Kkw#cVJNNt:i5+S655:B&hQeJmwlLTE^KV4%+?YyGX8/6+9LK
WBY@\l t5c&^<>i9Z*@WjlJ?8Q:h&@i99@\pi+R@@#q!%j8n%>$n/Cd$$X*eu+Kj*B?$y*e4t//=?@8Z=$@!aj#
WA:ZEe /iQ:>?@i9u*#=9Z4X!@:*6Kt?41c/8wHkm4tAX$>4cc8Hn:&%9bHV@=>Du>N^=j9uV$>9*:AI@L&%jPu
la#nVp n>1c//54:=dCS=6>M?N1?8Y$m?jy%LEy=<+tu#tXhCL^!PH+8JnI5BB+A:\>*X&hHS%5djbd:nW**Ybp
!Knkbn 8H4=WwPZjE*>=h66A^LT:#R*q&jh!LmYn5@H1iMB1*Xi<eQ+a18+HF1MI!dp>w4SZEcMkm<^eVpXYqq5
FcP&FH \Nny:@q@/?k9N:d^nWp<qZ\8=X^!$6H+mPlDmYhT$/=e#dmSXXdd$6dT*NSEN$9YX%jeK!?q:k\w9%hb
^w1a+j Zh@e%6:iYq>>9@S&jqdGqR9uqy\?tZn5TMKl?Nmw<GBjh$h4<=%d%/>c5unB9Lq#=5!iM&j89AWLDbc6
n=44Ya ZL6^1+u=jke**>Daa&i9=yZX64XX*<qPT+4%h:La8uKP45=>Q5MZu*8ZWcJ/j@*+>9uV?:i9Z#^:?8RS
En!R&< *T+GIAqdiy1bF9p&>4%<<@=nS\j>mitR?@#%&+@PZ>$>AwyGlCd>khA*<4#nP@&+9cYl<p=Sjp=tSu4c
KHRBme ?bVp$<DR8eSN\$RMDSmwMYd9*d!e9Q!IP&%QZ::@DB@Vj^Cc>l8l4=<@jaBZ>9I=94V&%8ct884Kmu6*
KaDXcl ub%e*L$DI\<qyb+=iT#l+IFaPpahEW1?kAnh4&q1@@j%^&>hQV?@MRRmytQIy+?Ewc8yJ\=Gl\V+iZ8+
@wPAH$ Pn9a&%n96\TK>9cce@bRby\>6Lt<liX?G%5HJ^eQd^<j&y9^WjRLCA\Jn+w>iPSp<9p4GZRPJ=5GlPmd
#y!N+S ayqbYRL+b&E&>X?PwmLCR$We8Vp:&F46M>>q6Myk\S^>EWiD6KePqyYYpybVITDJ!plL!<k1KC5lTLVK
MDi\Tb iHp=*lTVdX8*G<@c55@G!eM*PQJA\uHp/M1%G<BSTZqqdXM@S$w5S*C&hTBG*:mhZXRQy=91+Zd@wn8F
ZY=#Dc Q=qP5X@@p/MQLEk5S<?iQH:a%kIeXV?w18!1+FhYQckGnlwBw+hQ@u*^?6*H#></8*8/ju::@QHhc/Cw
C<4nqa uXB$B\>IyPlT&wZ@p/JA@Qa>ZF&e<E&&*AeaGY@h6MHRECmc5YT46h?lT<YNLjj!e4I!kcP$<?hP?:MW
WNQdm& Te=hK<@lApaC\Inl$wCV8Jm+DI>T=9+>>RN@p5:MqTb&j4F>EB&Ln+\:puV&Ay\^N:Q!:ni$6di&NLi$
dIJI*I 64W&pkiF9m6=4?JBVZ$#*c:R&pAk!5=I9=mTQBBi/nGEKDwm^N@V&edChP8GXRd#=<#1%9>u=1\=<^e6
S4T*jA ZYY+!hnM$6:NL##?^IZM&=W6:jZqiitu+\NhLLi9tm9mb<bhlpj%h9$EGj4+:5$4iDijQH4+pG/u&ylY
y5n\<h RR9VTkB/?9\qc6BuaaeejELjj+ICCaTWAQCbDQn$Eu^AkBCj>&@\wGy91d6jWymZhiMcEcBV\M@bqCVL
&WkXLS j\alQ^&c9PF4dkI>=jFFV%?>@@LnX^<<DeDPj@RHQ8&QAM<4yPj^\*a<Z^41/?wRHy?k!MPuWp/jPHw+
l%D<Pm @pB5VHS$*KGnJ\Git*pq>/wd&=<CQL>/P4@S*+b?@jLqe$jHy%h6lJ&Vl&LCk9^>9N#le:WDiGlL#n:c
H9*IbV k6:da//\F<C^64F*SN*^yZ#WjbGd5Mma?IVEW?jT4tdt=iZt=tRV>eumbA6#8kAhPjIh\1h+?EDMEMRt
uWVKjQ PDDA#\jRhLK*&d@Q*HnD<5Z#b5%Acu4=T:Yu@!W9I!YqwKK141+K<5NTk@KnyM^VWbBV?tjV>8$t=p8N
D\?n5% db$>@EKm+w<eQ=WMl!6Ap%hRe4i141u>!dNZ:$VR9H@:D5<$bAcl/i:8Ei@8?9XLkLkARYMBq^>@+QK8
De!l9> H=iuV^/&6#R%AC/XFjj9*d%Lq>N*6i@h4/mwjFBhY>@R*AIj?LPZ4>>@?kwjVHeuH1^kKl+DNVXAVhE6
p<%l4B R5$XwCcXTYXT^9\Zt*CCnbiHt\8wn=&NFb^N=u6&:#I^Nkb5>Bb959TJ9%Ba*%bSYJCjt\&H//WL=@^Y
lZ\SIG c:@ml@Iqb1+j^AHBEZAFSHmE<MYXXkL6WS\&?TN@tM:5%d95@iNAn^GdW+pHa?JSi6I#M4N!C15AD:1N
G1NuR> dqh5b4?9m511/44GF9mJQtb8yMQyhuyR$uH!RwGbAG<ZP$9VdS6ZG<!h1V>DV%iZ$tF$@>Gdwc<@c>/m
WbckCk =Y8M6y985*eQmE\+p==j*6DiZFF+@i#lELj>^19umenS9<5MAHI/ShIDD8:yp<iQAS=B8\Biml^k<?\F
9^J?+D C5@uL>SuibcdZ>*k*GkEb$wjPCLu>9H>/=jQun^5c//=i@6Ydlc?M!uJy=JPuRdlTV*4w/*Fp1M!?uBi
4kN88t Zp=8%jG5J^@\<^FTHCyR^M&R@<HNP\AHdRdIDnlL1wX^H8Qm+SMeuZD/*KunS@HnAt^mD+1\Kd=Z*hD&
Ch%Zb5 =NYH4=$>uV?a:\#w#qAE=!X\p*e%Niq\VDkSHVeCnw*X@9&WJd&Q58D5yT*G:pN!:B!eZV&<jj*>jH*>
X5qMLj @AMCk$MnYClVL&hp=?eDQVtEut\tl</F4&\c9:Lp$KTtkAkimpPC\pKAIH!CZB#6dC\6>t\#ZLyRyD8>
B%lBAe jFy:\FlqKTqyBSW%>RG11D5!MuKK!p1$\pRqbSYik4#15l*G^md:%&%*<QRQma+@i8LWYZlE46@M#m8<
<MXQj8 e?>BZZQ:p?h>AIEw9@<Al9w#<9Ph<?6Zn&S*F\DWTj<C*$d%!PM:CS@Nq+/Pn^@w>+Na\WGA@mW/*qBZ
FR/^Qw </Dm@6*!<4I!1yR8a<1u*d$QCNZWNVRlRYDjQlDh/j#?yiQ@Amn6IkL$D<4P@\AIDlA9D*hZqmBY*mq#
DRapeL \Eh*\WaL#>mWY#Z6D$1Km\4#e@F+Qi?#C9AJ+a944yuGEiPKAVe>^L\J+b@F=YqqCTWF4jHVQ@PHc?9M
CZIkt# YYQ1EBB*DAtCb!9^WG#CTZD5<P:p=yZW6Hc*T:Vlh$XZT>VW%ni%$8%Kda$I#/&et%e9uRjt6MC*kXYJ
&1!>:Q mRkJ>HF*&G?&\&n%p4u/w6Q6H&$hHh$b?4MZLFt>ac8yyaNueG#m?c!T/4dY/8Id1WjCQY^&4y$9Rtjp
BAqk1% ZWcbEuS*E6Xl#hG@>BQtMj&IihnVL9j\$bMu#$B!*u*wwMH<!H@>lqEQinal%R95MNSpaY?*KPwlIRwd
8NLdJp >VR?KC5Eb+^G=8!byJNJy%B%WyQYcGqSLD\D@+:K#5@Jdnyh?9Hd#!/El?/Db:AIup/SC\SVk9VAcRqI
taGjP& C>5JP:+lMRuJb$uEA+wVFWZaPb>?I/@+:wQ/%me9**@y:Qu%<&>+XcCFZ\EiaKe$:>4=yIVamNCkAQlW
RcuQ9M ZX*kM:Y%5dG&w9eLAB@cWu+@ln1kb=+?@kGW@%DkB4\c1#pZ$&@pFldeI8lpb&hq=?RIeu5BGmbLun$/
>eabye Rj$P^pWQma^k*b4*H%GQ\j#b=IQS:8E#&84V6YVA45t4DFBZ+:HCI/?E&E\AdFRW=ZkGP*cc:HLecPaX
#yZ59R EBb#<NmJ$?jP>%F#@$E>W9PcWCMH%IlW=!9>njPV$>WJX1&*C?&c\t>iQmE\t1#mEF+iA!?N>eDL9jK!
*qeM&4 $n9hJj\:yYZqkA5KD6D!?Pu#%?<:95IuRpKhN*AR64j$\*Lnin4Aen:%u>RWA59y@\tL6?h9Y1^A$Jq>
TBlADh HE9Ebb/l8Z6$e6/D>y4!<6KTIk!c4q*$YRt+BQQFbm*nkEWD6ipGn+c$!AI6wMXKewPtjPaQ$>cb8&/*
V!#yJT a^<5b$<jQ^^@:HV1yY6k$jIL!86@6e9lh%SjX\<?E\=:=dcttww!PLk#4%>B\=PpeRKjpymI$EBjD!h4
iS6%\< e&PnNW9t/i9ycQ@k@\YW#J^45NIRIHH!CV6+?tyBSZN:ZYuY^eSId%6V\\X/LCQDMD$k/GGneDaIl:j!
?YC%nG 1XCECj%I:9EVmG#AtL*@>Lu*t?#*H#@b^AA6RpVR$>%9!\A!N11y4:mDiRFYZW/eTEw/uZ#&ZP1F+?8G
FS:alC 5@1m#NQ!!!@IKmqMjkmE>Q=JmBaT$5MTk94CIwLwQpX&+T>%XuIF*^J#NBuDmEQk!8kwhak/VpDWeTQ9
%RGbjW huqXje8VF?<@@+R@a&VuV&RZu^aSI/iP^EYm\Qm\kc8>uT%6R%5#\Aq<wQ9q4K\lyAFuB9wmCBkGnISF
L?F/E9 ^B\k+uLyYqb?aS<qkEqPdm/X^@tDp:V#EPEikYB#eJ<><<LI!Rcmty%GK^jNbeYqG#Bb4DNXT%bKWpcS
Khc!!M S#klaa&<w4ImSDXKKn\XSYtF?d6&:>yu96E=MD#t$LGVb<=h8AV?I!i91QS?hS<tH%l^Ih1C$9L6i!iu
y5eE=/ ?&iQwF9aM=+>Z@BpAESIEENM&ZMRcall?lAyLTpy96%d^N!iZq^!y:V<ZpWXm\t+54ejQ*<HW@d#G$pI
GXGSI$ ACWNLCY=TAttA<CSMijG5JRe:/iElHL>tNnnAYS6bYX6DbVw#Ft:&!ZmXFbFY#%EG?X*mk5l/E*#Sp1C
Kni#LX ?N#b!<RXkJJiWTSD\bi$HJ\eC4^S$:+AJd4#De&Ap1MmTp+pHD1ijDE>I!5*9:Cww1t#ZS4m*edGy8aY
-A#T*$ 0002d9c7068001202b3 Page 128 of binaries1.zip
$T4LHQ 1q&q4dt854!EQH$pyE+cpAktJCaTEQF$5ht:e@QcyjQ%>dT@<Ij4/PuQYdVeeP68c>iA/MRL&YZ%:W%*
Jw!>$l <!+u^jk=:F/@WMVHkL8MGmZ5IWElGLB*^N!mnkAm%GQ1me!@#<F>kaS<FdB\5Q4S\#^qy9jF@H%b5@h9
>=>ttS Zn=@<1m68jbieZ:&#i85jmRiQ+EKem:%@MW#K$V&T$qy^6p:ihuFh%IdP46FhDR!XJ>?EDwIeARQ?HVJ
nehYE^ c*yG@<5<a%#G8Hu/l<aqupW/REYnw!Kn@1Cn51:=<jN*HV?/Mi\h?jMH9nRYn85ZVl?Nn$aF<jZ&eMhQ
K6#J>Q EQG\Fhw\%pI4^q4Y^6di$hpXBWRa1BYEcEVHE9&+pJ/SZZC:D\+/l<pX=nG=kl\GdJj<#i9yjjE?pAG&
JJeJhV m+V:Hm+a8Fn5&dF?&RKSkCAbnM=C9mbICKCl41/twmADcMnKK!pyp5\bwCE%hJPF&Y=L1/&PEdGHE=QP
i\anNM yLBp=N<81/m8d@p9GS<JGRDG><:*QawR6BDN@T#TnTH+64FMpECq9lcb8FN!8\m?pRL/Fq*AFE+4AnLK
IEWCt? :qbWIlm6D=?kjBC9^ad+V^+CF%X@eHHljP4wqHQu#pKw<l<8<DRA4\qk8Lt+PPGya$jde8*5CSi4h#tF
FYjPyn ud^=4:Y^y411+q=bCj^yq:%YRwkj!PjwTc#tEQZwFZp6Sp^GAlMkmp4Dy*=FMBb5MHeKlMAiuy?We&hP
kn*%A/ HpqIT4q$Dh/R\65qD%y?6uQdY8pYVl9X#t644u>\:\:G!ym5Bbh%R8%aAy^YaWGAlj$?$/&G!^jM%NQ8
n4@iJ8 \D>Wj>cC=add#i$<R\+tb>!8dt8yKLl/?pCAp@uG^VNaKyRkuKiF:CuNim9pku:P+DPI+9FWF4tAV?QV
/9\e&+ =&?C::LIBc5cCAcjDW4/e&H9mdF/&NyWZX:+Y#WTE+?jFIF^#t+eIiP#yyLGwNXJSjp=6$9QhuaL?5kA
!VG5Tc MKlBLBppHGZ6Ab=<=PB:Td&a<QKXm+8:h$D+keS#!TeBnLma/EkSGKqZMuKLEI^H#>>&jP@8/jwH@Vtl
?&&pNJ qmWn+?Kba@F5$MuGuE:Iln%6^>l&&<nd&aP9R5WICA/tk+amGGC5Dl<>CYHn%b6=SeXF@d1St!5A#SAR
lbik4A #XDI9HH6mmmtn++eSDJlGNKD6:IDd:X:/%wDWWK=m=ClyQ&QMpV%5w11GkMADXqcSq\PHkXKada!D/J/
ced!il ^dEdLe#N4Y!&5eupqQ=pMwKBn!:tpD@B8+J9!<e?Mu:<i6<#wV@nBYS<FMtFmI^HlI#1Tn!^m@C:/Mun
NwMnBG =><1KAR\T599A^eN#Y&Q@\Y>?Q1#8?jZ>!<R\\MY4R&%@<EmNZWCayH<G+5DMXESweGkF*+?KBmwGC=P
/L<AcH Vw:\6nw/PkEY&4NYGn8EJGcWN:e$\6>jhd@<#8&CK=+4YC^$JbhQ+HDF@y9=pyKuqeRWqWaAFny/m+#M
+SHDAk uRELpM:WXM\kJ=:BR!wQ1Cm6di6y=:V>dFh6c/t9BnMFPuR>@SK/1bPJ19BeABF?um+P?*h9Y$?I?MAj
6V^/I1 wnNn=wLqG+#*PjqFJ%:K9>@eXu$:+?!laJi>t\^EQClApE/VaPHuh>aH5YtRF^Rk$j89%nPE+T&<:%?@
Gn4XpH \au:@Rj\$NqFlKK:n+j8Q*Tm#$XX*wGkTBSuJB+>qukCjSV\pJywNW=AiFDpKS4h8Jihi@6!VyiA?kMH
iyt:@B VcFA$NMuQ5RLmAwDd\T9J:^=/?L1+SMaEZ<CI?IEPKYmImMIDGeIDGXaY*u?y8N:X$<Q$#%TXQuyiEFk
EKE4w! TE6PQBRHPlFMLI/dK?LkTDp\>w!h$Jc^W&B^<QL^D\\JCcbDNMQCI&QmD5JDijd<=i6b?eZpmEWi/N^i
yR!C!1 wIHKwWAuFDIlQ4?AidbDeXESYlmi5*qS%pH6Mq1%pNYJZ\RGeY*?YGXci1&e58wADVXqiXpbGXt\WEwK
X=AyDN C9JkwXRBqMt:de**&i#i%%hc\bS\AhBR$@BjGn/!Dw4A<JN<8#>:Jwt!G!K^EJ$nYE6=Kw4JYTIKC@LS
<*4!>t DA1!tb#y8YDa<jHCWpShI=Gm>&mm8u/R8Q#yw>dG&1y:@+GCPeiebbKH>pF^pECBa8EQc8Hn:RXa8LpK
MlXVlj ZLm8dpmE@9IhhwFH46=yJpEP1NZh$8LLlIkA9nl@$TRPVZJcNQDR!^YVWqTtqdn1E::^l?4wLVdc/^II
8qB&@4 WdmIltMu#1bh!<\6KCwy9X9jk%YM6q@6ct$6nVXkuAy#5#B4ACh\$9Gn9EMHw5PDERi4QV5&4q\$T$@:
dSj%w/ HZ?\n6:Mlc8MVG$<Rk/ubJW&6Njj!W^NCHP#*LJEu/XB=T/nTXP>w5MaH&nYkeJJ@PJF%*NbaPHN?\>a
^i\1S= bBV?pAWT\DKlNCAKDMYHkKJQGV/CMpCWlydyj9F9bVl&=Pl9FI/F4&IDd+BlwQIE4/!C*N#mw55@@wSB
n5l</b u5BACQ9^uj:GjJFpQ>ti>^M?jASL+^5ehVnyj/N\GXAw4clycu@&?6M*jDb/StQ8B9+WSKE5H%CAkC$t
\JWcyt Cy$9Q1\w:<:PVkRHwV*6IP9pku:JL!A+qA+bFBwYnw:y<LEVb%LT$DKl@$byRBIE+Jk+PXklWe!<KRwt
<t%bDN RJ+nI:S?/+Kn!DI6u<jGEm\K!6y<@uAMISTWMh?4JEjLLJLFdJYC9AK\\FPT$X^pd4q99:*>u9k@E:*q
kD9DCl qVWN4R?j@keFCLtJL5D^%I$whQbM/Yc>JqEHWWZp6TlnRW1%kMJ>SPFYZt=&XqbtJuWV<>dV5wEHWIp:
4:B6pF yDLZ%Qdw*%j9\DyBTQG%+@&dF@?KcLn>t+aWqwdBj>ARDZaSeinn\bQ&aN^yD//u%\8?nQ:T4Vd?l!<Z
!W84d= N>L6<lDTIJFqq#^aHBm?^CwyVy<?WQCntIT5I1$p41k$i9wQIGKG\TaLq<CalBNIBD#ymchI<4AR<K%w
YIaQ?B /t$Zd&66ci61H>DY&qV*+F=yEby%iJGyb$@DE/IC+Zc\9^ekaY=m6H4^:Bp/d@mD6QXtLX/#%h#SL!dy
&MQIVL &8*1>8d!uI8JES::6!+VEcFa#9Ak!9/nXIhIWK?bX<#L*lh!L\EI5E1wDqmJppc9JCBE@M9w5qGETB^I
uG+my* pa?69aNbRuG+mC<4<WnCpeVnLBJy=+/GP?kQbmMJihtJeiX\TBWXXXNWANMERRSFKjdlRHkAIKSF^a6Q
?dtP>M >EjtE>M^@w8:l:h@TE#C/hR#J++hnw?Fk?p*E#tFh?=ZN=K/+c?iH1yuPF44VycIG=jPuWS9FWH1YpVb
pIt%j% *X^yF<cbeYIeBR:!npmEl#h1R^kh1kJESMWePEmP/E6Zd?aY$mW!6+uQ!M5FeiDtknaI5=R!d@=SNa\I
iYK5:$ $?\LI6#aNBScyVqEHDwJETyA^JSB<lA/KKwM$BlA9NJCCCMk\lalIVq\4d*Xjt6HJ<<@M4eqh/61G@<H
b!=/ND EZ*c<PQu#</iZm^>hHX*>W#8JwiAKJ4+JI4BjpQSYE<eC<T+\AT<?P/M/Ve!5\CJkpIk+u=XDRd^L>+R
E<jnPy $>TJMjdLj^?%@RpEXn%TPPjwQmBP\Ph:MD+&PnIemRlCJAkV6DjHC$89HD<kawdBq9&?<SeL/+Z651%N
\Y?Q8p >VXX>>Q/ibDWZ/JMAt\lCc:BMHHE=bWyJc:!bPSBj<pYER>ukai#y$=k1n+ZZ?!>1ybiVNk&6:b%A^DN
HIIm=y aJuKTeWNQXMK?WTWa!JC@L%ekahhY>a8tVMD@pw6:Sq#q1+*5jIIQ=1YZ>HTWyF@?YTM6<&P=TIe%M5b
Kd+pNA hR\BSM/VlLF5#\L%tu=F9&SiKTARH#8?aDZn=$<cpTAmRZYJpPn6?jXdJEVF\Q1KP:hI&A<mh@^aR5KS
k*uWES a!\TF>LPHwu\59^H1EqyjhYW%FJXZ*jlNy$4jm96yRCbEIJGMEJFpyqFKAkX\t>mRAZ%iVI=EV$<jRLC
mb%lBM aw<t5=ZA@^PIy/?^1NEn:QpL@^Vpwj#Yne5yTbl>RLhLKqa5Ec+WICF\puNGG4!IRFDlVIStXE\eBA+u
C996+F Vy?:AE+y4?nPuSLYhaNACQQEMi<p!GI!qY:iIGdy#Mtn^IlyEwZ\<5BcI%aDh^16ZMk1BM5DS=9t4=@G
9$a=^B A+&RW\TJWFNYRL8ERIBhpqjm1jHp=Cj86LP^6uY\mDy%6n<ui\>=iQT@iQnK+9ALiJDwlw?FKIW$t\Q<
\VWpK< ?wZ8?J8XmV?BcMKME\6EX8cNnP9Z4q+Xyt6j9Za>+<dN4J!<Y@mpXV!wc&^>@A^hW^edad>/>4m6mXBS
G6NSFJ kDWIwPJ<cwwalNh$<mCYm1MJl%C\I<LDRyGLwEApk@bnjBp@ej?AkKAZjFpIBT!>D/Vi1tpV658AZ6XY
Zwl$=1 >XFB<!X%^+l^?<J46E>mpkykt<TW6cd<SC1Yd6$HXB\?jyyReV4yZB4+%/KT<45XNY&Ch1t&qwdGq4c&
w!eBcQ *ub%<8ji\^JGbkceXCRViDBYKVIp\N9X\hy<%%dDbZQ%hX=A8K<@d?WYe<iA?LNb=W%6%aZyy?Q<dI%Z
I1:=>d #tT^pC=uXQC\F?X*&Q\h@b==^:#q9Pq?LWPR\MaTRceM+RE%AwFkKF%$VZ%%C6KlRwy<>+4#TL!jnBJ^
&PSdXK ?HACAiIeAJGeEPF66&wpGCeSEt1G%+9yZLE:TjS9ImVbmJ48yH@TQ/n9Qh<taiVm/i$ZFBGjiFcERuVp
E8hM^+ j%Awai6:::>$hueLiwcA+kEJNiWFN/?pumJlN?bDTJ+R>X#C*R%w/HcSJS#+BkTFlA5n6KKma$YmAD+J
jn8$@1 IwdTQ#mk+a8dA/1A#XqK<C!q>:*hpYElA?FQ^unT%eWSatmLQh5Nq<$n\9CVkCDpK+\FDGVpXhVRKeuV
AL&!/T MqNp=iSSFqlhpJPhbPFkc&j9bu4/*Hp&5XTE>V#\L*$W$B%KECRVt@ThBHE>Am#w@eKQw$i&V^i?j1a:
BPb*Fp ^4C/\DaXmClkZV6TeDQn?6Z$>C8ZL%?/SF@tZ$t@im*nSqa&iCapAbP<V%?CajyFa8y*4=<@dmhPBH6J
*EdC!5 @k8C/y<k+EeBKAlD8MFB+H$DtECJwPCRpLAZjHt>BS9*i5Te!*5AB:t\Zc1q5j1mP+5B^bhePF/Tm?Ik
&w>Ph^ /I8tPX\ySSAH^cGhjAX6ubuLkaPAcPTAVqW<h?bW/yWdEE8X*d%jYh@dLk&m$AB@cl9X#4Tyk@ARlenH
q@nF1H #4G?kt8WatmA6=8D>h=hY#e5Z/C9<\^AtLua$MVcK?4p6iL/>41TnLMHA^^&4y/qw%&BIImXM&y$u$D$
#yu?$q 8W<I^Kn*a1ATkni!d>>l&Ic%dtEu<$5c9Dq1A:D\nNH9<$9j?>5/MJl8dc\1K<#GbPR=nKWVDl*1k?Em
dp*=XB keF?D*?RRJQY?1Iy1#\t8AD<S@/NP=!PRKcbESAayBAG?IAFueKjQV<a5Gunj*u:BISEHV!i<9<FBXG=
bX%&mc :9QQZ%*eL1Bl/C?Yle#$%NQH!Z@A>lH/EZhL:C*nJuCXhZQ*<QV&>R<EXakaHBpXVXTBiQj$G#pFJYWm
6K>PaP HQL!iuPbHA:dKuKVe+QPWGA#T5RtlRaQbC9edm:aY&Xyd4y=6eF5QW!%5nRI?HPHK5lKp#LEAJ/T4K\M
mVEMMl \IBJh*tIyHt1K4IDX>9bP#k/&ZphE&Xbm$49><H\lwYB?TV>pVmpH>mH&A$\TAH^KA1Cutuh@j$/:MhH
1WNb/t RwjjNEDwkG&ileV!ZE&@emp6VZCSTb6?/ZL/%i5btht=AEMycqDdp?jkqTB+IKH$<!j6#j<*C$w5C<eT
%ZyZZ% IHkAla/pI=l\Kw\V&l9ClI1HS$SG9?A4/5=jd?+ihTcuAl8*+JGXdKt=+L/TkCDpT<^Y+dAe$IRDMR=Z
Lb*pAh X1kp^96:Ylh!MG9=Xp8ZkKlDmT\H!Ye8ZM$EpT/@Z@tkWRAeRE!Dj&y9t*w#81<!>Eu>/i<D$YEKkV:8
-A$4JY 000937e9708001202b3 Page 129 of binaries1.zip
*95tpa nkTCXR6u/n:qD>Td5*!#8W6IRq4Bk:dGMkmmk^%N%<\SMTBi#k#ES:t@i/QQdRIH>H9BP?c>PmD\BW9Y
M*pKN8 ujA?@?wZlF<mCH1:j+pEAeYaDcQ4Kp4!M@8mcHmjCASupqQPy!EEQk:tY$d*p6bDCR$%uc5qeNVt*?A$
GYuhcy 5SBRqDVEDckIZjT94=&V<C@$<R5Mm#q<MyWpdqkAw8Q/AClkAZn^@nP<SHF<KKkiLScB\1#$C!RNm#pQ
LEwuTn bAAWkjaS>@d!<1R<BP/M^^lQ6l5*QDI1pmZkWELmTVSG%<Ca>mGR#=ad/B\^mD%ykIC=\YRwZd<tKq4D
Tpp$AN !RN@6kadQ45/p@nb*HnDmkZ/1Ap@?GCMpILyA&Xp5FqZZWNNSX+PMJBZWFbYbDWBXGL+QleHJ&eZ^*BS
nbm19/ T9X&&j%1qwJZd:DKRHjRu?SF6wnpMpAS<Mu@%RZ^Y\@hQcY9ApR?Q:BGdL$G!>X6yEG1p5*/p\4$ydTL
1YDq#? =*6T?ie9ZE!:uH+6+!d<jaWqSBEi@99/@bij*TTC@m<E%*>DRCZ##y^KE9Y>a8NNFL^>9SFWPB$lESpX
WPKW1$ E*9kBX>Jb//ltW6EW8c>culeY+ABmd4#@RmIc?8Ie&nTt58RaEGMI/+wXPK1VCEI#F/^DSCIQJl+ClFI
kWeVd9 TV/dhn*:XuEb%k/dBim9/194GyydYwX6Gm&NlG>Sj@mFe=nQmApQWkAGdQccd6&Al=E&RKC69>B\y=*j
qmn!YN kZM=>%8c:?XeQBd1a4c8D\LJM9A&!5L@bnJBZCWIBwL*5tlM!jHVTj%m81SBlH5FFDL\uJpqEkJT+SI%
wBV==t ^@::tAVPSdpbw4n=KMSXLARaJ1RqH+u$hdVaMYPImIIBk+$9=NC=uEL8^jakERYMWIJIAhZ%A@:K!iT9
S=bWY/ BAejEb6\/u\KuP9@p+Q5klK5TYQXDaKb9n:VIZ$kZL%+N8u+WbJ+a48TMN%B?$kkC=+Cn*GiyC<>EM66
//w$!q $XHS$jAb^l<?RnL<X/=ukp59I#W4nJm^+5bpmYZi9EtDFmmD!@+hNIeGB/mVkB\dVWENIGli6&TPH5GA
pdIV@: AR^/?ZNGKWNaANbIR=&u4CCHa1BA^EAB^ICuwDJn4#$E:=+&ebhJ@wkWFyybC5CYj1I/yD<SY+SKIQaL
W<WVn! +!B8h^hN&kRF*hQ:l\i?mKVkDh5$%5eA^M5qwm+MDH=VW<:B5<!e=b>LTV&jhmthNK*i8u*udtX6W@5V
u*L!#8 5EapS8n+<PaFkFD@+H=y<S<keM?hFTdLu#thhQI+jL/HD<dHWVE>$XRWE<*ETMDdh#DlBZ<khmp=l=*I
Cp8Pe/ KCQXQhCC>9c/XQhXBAMBZ*#8WA/SAJRCVCB^ySWwJVHFRXP/EaM=K\EDj#DBy<=T1Ryu$R<lyXZX6c%C
9T!&C8 eEGnt811c$AKY5AX6dbAdIDBD\R^tTkGb$+eQSkVEi\4:?Fpa&G/DVmaM$Q:MX>Dh#dIm$hpWpbyW&6q
ZjY&>C @8WVEY:tluNFGEnXM>#9kq@MAFaR8puynHV@5Dl\QqEjtR@MS/bDmy^Dub*CLlu!aAyFMM\Sle!@i%%j
u@iFZ! QH@Cl5\FYXj:I8bDCEQmmXQkm6I8Z$w?G8Z9att<jwKY1QktQpA=JA6w8MY>XaA$>BJn^AnEAIi9eLlQ
e/iXhN k4>QGBAWGlq@:M\FFwWaFwXDS%pWeLmB4dQB1^!D^&XZ>/hPRKG>>t=S>4Y$e^mu+MtFE^alJNHll#R\
N6!pX> *4RZ+<q+MV=Tj6n!F^+ynBpWm/J\:MRyNp\AFEyLTt/nL<4N\Zb#APGGMIMHGKTn+wEVQZ\kPmIpMEC>
lVu?j% #^YS*qpVw%YLb9dyAcZV\=<>SFbYYyc+Inn>$SZ%!+G11w1m#HwHCN5>Qd*:<1nE49@BkTLJGdFm$MX!
WPAu4J ACEWA&eF%e%$VWeR9yQYqk=SkQCC:e6kt&ZJp$KibXCCqHNaM#6Nu&JP<$tV&RYekeDk9JkW9B<@j@MJ
I1jc%+ k\TIq6??iIwN=@jLm9?ZJCmKjBF1\wG+8B?^MuEH+8MQHp++tplAYL*VITV^YpubZZmA/=6cHnVZ>wHR
+YuDBm !^jV=@+lB$I8q!NLKVGKuAuh@KHc8uNYddh$>w8IQ\clY84=%HQu$#Q#dyji1+TuH/IM8ddYlyw1EITt
RqEeJK =tc/bTDEQ!#t?hp*4q+/u=\EpWFEmJ?HuLQNQ4bBXq@uEX<D>GC>tZQI$T8*/>84C/<tSZ6adJ\9+pC/
WJk9ad kbF18J==4?bBJ<%\cJySl9P+u+mjJJjJjBWDJ1kP/lQVIT$K$*=SZR^w5RVlwbN=\e!F@+=E#N>FCTR!
m#FBI> GhZi&q^>F!LtK?mQVyKeY@!lI&A:WB88ZDy:LCdA%Y1Z$h#l\AMNQEn^>FK\Y%85<Eb^MEVN4Dw\Ap:9
>?=CN1 %^//F*+W$6R+<DA^B^PVL@:BR<#@+PEljw#j9w<m#$^F@MF4PXj4c?<XbYheTmW?nXYW5FBM@hEB+wkE
<Z@eGh =WN=M#:TjkHkpWAb1JnB5ZFEGPDFume+FJYY>utp:F+CA=ZBZFi>hlX\8I!/eD\Ba?ckAL<ByA<W^*m5
BI6j^1 LjicdePaGZD+*wjDlAERG5k41\:Ank!mC+wmZeBKt>#I9e/8d8+?4wF5E9Z@^IE$JcNFSS!pMcnDj^N$
N8jDVQ VSPyAy91aJ$SGdSwd!Eh%lX*:^Sn1!ZAeCH%HQc9JkqPMpuVV:Fb9e9y\EI?Jt:4$B=l?1$L+8Y*L=<?
>kSGIn bFFkE=YZERZMyqLJ58mPmCwew8KyA#*^#EHyR+e^WZn!FLCAbYj:wCQyJQNbWX&d56\+*H94ClEL+nMu
hhJ?X$ @BaFAwM+KTww<Cd&<IjwIA*:uH*DCR*u+c<Ed+VH\+PcPkkQbMqRFZc?N\tdNhkKIkaI%/>eQHeK\wPw
8/>^+L EH>QF%udjcddYSLc?iw/e%ab&@nFu:>X*X=jpyEe/&%y6ECZBWGnmhGm/@QiQK1@@!D:S6dN?5ej9k5J
eSyB85 C=nZy#5qTA1V?mcBmj*Q\k:b#@$JC!GAIMpKA=I\V>TL\R:l9Ye@ABTGTk!ZSbXuFAaMRbPIMF!>jC+^
F/Ctmt L6nD^t#L/5q>$5BwTAVhBBVEC&=h?lDCNDJCYplaaH1yHtF94+CB9*AC#aTES5RiQuEPD94nS%kcI4HB
P+lHCA VpVDdXJ+j9d/+>i9*$dD/@%^:%C$k+Yqw:h95E@C5XPup5tLkikP@n5&Fa=AeQ*>cABC%yjREAy@IlW:
Dkcj!E KA=%@tlm$ltT!etG&QXP9#lA9D#+=w&MnP9Z4^Ee4q^Pa@WBnFJIkL?QGw/%pj=##Kb8Y4$a\tdCA/$n
?Tl\NK y18n*eMj<JieuI!Mkk1SCDqb6E1K!w1$@CkMuHqKT85h*h#hjZ!h#4JIXQalki&6u\Rh<5Rt5TFdD>Wn
96>itX R$+9qwmy9*&T!Cc>FI%T5J*ktD+TAbF!qn#MQaq<6wMMknkIWDJ#C:AbCwJtVD^$R<#</h&4j^?&IA<q
XD>GP$ :H>/tc$8WBA!!:HTRIDwQeke+l\YJMkePbyI!15yL@nD6Ge8*&EdeDk6D/9F=jhQ/c61DB/pQuVR5KFn
<Ct*I= J$/cM9$nkNHDF=5y!YG=wNl1t=!TE1ZI@Z6/L&I^h@Z&jW+?+RiPIlaZ#1hi!5k6BCPH4p5AG6FeX+YI
YQl<kl %De&$e$D5htp+l=wYP=N6EwRMpTHBum=&Mqa:6=P85B%&@n1&9wGt@b=SJ@J4tl6K56Mmji%&4^I^IXY
@niD%A E#NatQu/aW6LY>9Lb&&QK?:qZ5p84u4/R=T<AV<KbNBAB9NX?EYG:aGBh%+In4\jmyjMcFaij9*<#4bn
G6e^iP 5ByNE1waQ%<A6*Vm&JHDl?l+naSnJ$<uy%/+qH:>T54J?FA9B@Q6/^cNE%ZjJFW%D!EW8dj#M$Kaiwam
MhM%E$ WQ\TkE&mGJC9ecHl$RiPJKWmD1K+kiB\EuHI\1+&M1D*AikhCc@%T*Ke4ctFp*hwwFikj/mjt/hQcP^l
mZE:Q& :KcJna:C#B<hIlqMe8C$Q?Wu/$>w\Jw#FVeaBJ?EPepyF!=h9bGhj=5E$BA%=GSqWSA+T!AP%?m4hD49
1ydqNX !tWIRqEjnl#E>nB@Z^<%V#KPaW@$aj9/=Sk@A\>T&I19l#\wV6GE8FpPC>CwEdT5lIKmp4ICLV>TTWXN
:6SIQH XWXB!eVh\>M#\MeVP>Qk5/>liZmJ*Z1jlB$Ku$XynC+YCAt5p@=E#!Sp@bJw\pkWNwktHB8\1HAZHtw!
eCG^c+ Qwp=nhQpWV=!lEykn9D:HtJCSXai!ec^RXkZmcFjQZ9WI1yt@RGF+C\DIuE/maWmkV+5VPAiPWwjw^Nq
KRn4HT ny<WWjcC4/K69&!46Y@<lc#e@ILdJZh5XYpiw<LAq+!1t14G<FF@n=@&lWXDh\1HEp&/pnlCZwqYFFNR
enjSWF HE9RtAhwPQ1EmhC+eD:>b6:6595Qc8wdYwV6<t&6nVWXyC8*wbF8Gml1?4l>C*#B?iTVEEYEB*1:&q9K
y5HE/q pAGJij1/&1*<Ad4#%8%&Dn8iWhaM5jV=\\E&Y\%?T<cR$u8Q\I8%6DR%6:e>k+Pq9cpmP?N/h5u:4<AG
H>NiSj GKPj#A@ti?<*#qi\Wh<qThNi6/CH/bZwJ&N?9%#$l^E+y>LTWFXYtIN?leVWl%unBHJ^Q8*K6a#$%KSD
iKL8Dj Ed=PqmadX<<eJNDpIBpDXZbiLMmX!L%XiL+^qKpFGlANC6DwAVRE#Ln\!JmD^$=j?APN1JkDl>p=u/^<
eTeZ4% :M5kJdiPn5@@\HF/\<>l>%+ud*<jh:@Rk$quW%I8uw6!6:h^CI?K:W8L$!FmREhQ\JnAwBDTw^eHb9kA
IbT*C% !AT+Jkkm5GPPBiM&c=1!cBJHe/>jw>KbK/yABVn!e@$!+ijnyeyGEdawE:5&R!DZL^Qm8u1/&lA1nyRF
b$F=MP LlSSJ>TW=AELPWYel=Aj1cCEPmE:^>dd\<59$CtBFB4?J^c!jd+J<\XI^T>CBR%8h949RYK$VZ$jR>@+
$bX*5W A=6QE4ZLEL?DlkjPh!bl&6HE+$tu!Ah#@YdP4iI!$Sn>N^JR9*@>:FF4R^<XGZ%>TpmFNKwNWpEhaa+!
&1Xn4I ^=lE=iMuVy\<tTS1Zka#>y!9yL>p!*/j8BR&d^W<nPd%1wn^XFSwbYpq%aGDlw!aP8$uaNHNF>NnFcPH
+>&$qb >GhkyqXKkXbpFLlDyklEaFk+iIhma&91?a5ZLq:N8wZPEpIJCLBH6:W$XN<uaAAbVW*pi<bZuJq?<S^E
8NdnWt FdESRV=8D99*TB5d4XtKZLV\B&nQZAE/quCq8BGC/:TnRZddDjS$CBentltJ&:XQtywE#W#LIInb&^<>
&5it?% j9!w4dY819lP#4X4Jc&9**iRpnD>ua\@aEjVS+!\i/S/BTI8Z9&yGL@nmeeQY=64:yje\l#QGam9IRCn
RD95FQ D&wiQuaCAkyMJtbi9ZDtTHTA1:Zyb5Q6m$SD1^ID=Q!L<mS#e&:jT8<Pa&wIGWkF6wPMk%n/eGJ!&u?w
uC#yYu mD><DKuAmuEyKWT@i9?yw&NT^?e4Ra/:>#y+Bjm=i\XHHWyMPu5=<$bKR4mdw/&>yipiP$>ju?D\MFHy
IK1>&% XBkwl:Ym$LDR$KmaYQwAE/>%KAHCmXN5<^!ARRRD8em<IekaR5L1K%nAAm^A%Wt*PilFMLdI144*#YYm
#MNiQp Z1\R/aW$$a5b8n4hjMZyI^VpbDHu11:GR<EaB$GFMq8HW%QqKWy6<QZ&>kpP<Ll=C?JJ$nD^/ApbR8pD
yymeAm k#&eCBmadj*B/kZX^Yjnc*b!=P*4%@<VnL=<bEw!Kb9lTZZkAB&u$^eSu!S55QtE*%Z>Z></Q4^?@qmE
JR<XcF Su+@Gy!W*uN!:GSh$wunmeiEmY4HV!AVy<pwj\wJW1:jiM=ZuGG\!hI#JluC><\e4+EWkCFRX5c^KB+w
p*6Gc$ l44t\NEVJ$?bJ8V@=DQV8hPt$6MVpBJ6HhLX%%?i=5m!/9EQkYV?/t*\/adEJ5Cuj?Hm^dV4PXm#^<SV
-AiNS= 00024f903fb001202b3 Page 130 of binaries1.zip
LQ6FPB G/wHNu#j4<Rb>Rc1WaNWJIwL+I^PPb&aEBeb+898aGX8LLYJHahw+19N\LHbA?eLcmH59yIa+tC<hAbL
R:C4m? !JRYS1Kk:VETR4Z$6C4n*Dka4IiQ1:K8ZM+8j$PDdFDjNV@W%?TjPkXS<?ELF%P8Fu@:mPtuQn+acqTj
^<$m&H dyBXH/I!EPlGiXH8nT5a=?KuRS*TJN*LyPCWhV$6PVE&&MQPjN9t*S6IwQFJW%^8=@XC!h!<@N9ZC5Ka
HdJZ*J c1DnB\Xj#LnwtQmEE&e9EVJILT/TNN8J!MAQ5\E><aiQu<b*ZA!%N>%n:^*k/?+XGHHk/MuV=/>hV#+e
A\65S* /8u8:iQ6+l*wb:q<t5HYQh=ENPnk<Z=PDlc:ht:c5NF\l@EPM>9wmIPH&ChFlEaSK^p=RAchRX?ZJtlk
w6Wl=W bVhNFhHAmSWe*AdS\Np=HyuP5:Etw4Ft!h\b!IaMaWN@yy=PF%>lnD#EFA1amXXXJ11lRFVnL%KYW=Gc
!:iiTB /?L4+?5j+ltGyam1&wd@56FuybANtyVnPu@<ILLBhDG@y4BNA1RuW*SI6jhQBMG*IbwQ\G#kEe!e^qI^
hTktMw uGk/ll>:IF:$QcheAJ$E+Tm9/y6F:Q4??ePd=+@dSHCAG:6KJ8uEW5/hE/cM/t9<QuumPCwG\wG4akAP
*ZI+?T #LljAV!!ey:#FYa5M644EZWKDaPDM5YnXVn\JXCYWFJYX8FS=N@AZKpQHVX/Cl?CebXyE!d<w//1!qNY
JFp$\@ G#b5/InS$/at<49Adpq\cbHhawtSW1CAGI$JR8^dBYLM:V%Dakk^cYtZM9KK\G:XNVSDJDIcB+j8*mQD
5uB6wm kmA4nSmm*:%VqJiXjn:=SEI<^Pe+aYi!YZLhMt\Ld?T4/e^hb?aYqb^dBiH=6cS\==*L>Xqk>Fwb!h\u
%@b4Iu D^6bawT6VA9?KNWG+9+/+#:\<FQ4W>P%<?qFbZeK<t@q=?RXFibhPZj1JPlC!*ec:E<Z<=4=l=R9YEZ=
>l4BZe #&aQWJRCRPQeccIw%PFBCVkmlthYbubP^tYIR5J>\G5bY%41DcJISX6!wKdm8Qn:Wnq=8WYFF#?GM%YA
8=WK\N VR>k<+Wbl:twyJVLcj&NValNA1a\YG#8XYMJD\#Jl?*ual%M>#n+kJ^+BwVFJTTiT4q/>e!lEA<*L^>9
<^Q#@b N=>AH:6Np>X+A+cbEdeX/GJ48t9*#1*4%&@c9GZ:4q$:ndh5*:dhiKj@wbPu#<A#SLny^!cD85bebhLF
?naeiM kBw/Vj$mYPHW%HPaimAnK1Ayul/8QNE1BhTWDT5Y#6LFqK$e1!t#$Hy%<@Wuc<mB4Cn!NNRHkK^AaI=#
qqA+$V R$SYqEFYbAidl9u+?wYE81eZ\?jPpwN:n\k=M1VbnC%V58D<:AhH=Li?>meLeW<EepNtI=CddNKKtZ#1
eIl#By 8KkXI!yTEKFNTt+mj=tchkY#e8m*H4EDYD??jH##@EpdtH^Mm9bn\$tqW+TyW1KJdWGTJFq4ea=PXVkQ
P+PXaS #/!wPJ=Z<B!dPnca8$ceACV*K1PmCJWbJWcb&+iLLE>%\AB%nRGn?Z!cL#%6w1c/Cwm5EH/LuJKmkyKG
Kt#:Hi Pnm!ChNPIVdcj@eLDc=GEPiI!+HTmC5w@VYh=k@SSuK&t66:BQiSe?XtQmpANVc*InqN<C*e/#NpnR&%
Y#jh85 iBCk%J^NPlwjE^dk/Y!#h?eYR\p!V>HAX\M#b8IRi8LtQanjM$=H8ym8FIE#w=&Sw4Qj6BJ!lC$WpNML
IMSyYM 4t^1M*m<?piX/c>?hZ/1Ve5wL!8:e:9+hqFlEjaE=YVu=BVpZke9e94EmT8=yY&j9*RLtLeMR#QWZ\KS
I4n@Pn /Ilmqcep6\mme#99b9wFakEECaPQHP@9AkWQij=$RqTAt<*8QZaii$iT#9J9t5^ASqNem:j6lqSJd6/6
b?MYLS wt6*\ypKDPBB*V+^+?LmE^JQu$@@k/Ea@Kp?lp48Qcl9jj#<#d6*TZPPPi+!5@MKCQD$>A&NQun$^NuL
II<i@^ /ceQlum+i9u/8IMi&Y?c4AKtcEXAXGT\m+YFyjGYVS6*:MG6B:c&Nnb&6NNkP$8LQYdd6=qa8jnFu:%\
$SA%p? Qc?\1FCE$LY4\uRJDN:V/A8e<*R1D%htJIFN^KyHkC?YQFR\mAhZbpGWB%8n9lPCAKC=aJTJ>mnK!ek1
>XB1E^ <NR%NLBBTuc5QEa5CuIApwwcYLW=u5F?AWFl*uEq=j<DIKyDlw%ZkCAlARmdP@<E1H?/la*l!Vah$Y^S
j>89#& IbuCTYQV*Z*=QWGwhqlEBPtJbQQcq$B+5MG51j*bt+:9YA4@>QdFp@bGhnmXAHVy+wZW4qRtbdlIhj1p
yTGJ<j =9^FPP+9Z$t@quED+LqXXQKeL+hVyT/lS$?i&1wm=AqE>Imy<IAplmiD:KkQA/&StDbiW^XCGA=<>Tn%
nSZ:5* KpI\w#F5=D<Vyp!hjwHj!ijK@1E+R1/EGFhKkdk$6et@$dH#CIyJPAF?IT$NR=t:/Gld\KYNceQFIcV!
G^d4tA Wq8H:IBN8%hKSPhW+mEM<F%5!Y!i?MJbiny%jFW>k/$&AWi8qnc**M%KnuE*Y#&VJYh?P!Q?P1inpRb\
HJ#y@$ eJ<Pk1Qc$p#AcT?:%hZ%:/Z<!14:h/q!ldLT$n5+iwDb$H#TVEhuK8cWFGTiTV%*+i4Xb=>:BP@J5#%T
>Et^>Q %Ej%>hQ:@m1XTH?\NIH46a=TCWPQHE%pq!=lmjaYMY%^IX+Pi/%eA\LYD$aF?1pyP%BDW*Qw5GFcw:$=
Kj4<$i >?k<Jy>:wVtC8ehR>H6tZQ!lI!iTL@/BV^R:L=S<u5WHE#iQu4>?Y^i>IYnZdl6Qj*>QZQaWh@na/a8Z
C/$1Sc #^\I>kS/jD%>A9$h6?8wKc5N*BId+:@j$Y:*qp*d>>1TGY<HF\<9D%euHL!$h*C\66^4aYXy9tPjyaPu
t@pm=B #@t4hJap$yPiVq>lLp8RKJ>KHTDcARCQa*^MbFmRQ>qIw5Lm5\<XcPYm&YVRZy+5yJk%h?GCYRmR?yRl
>c%BXb JLJSlaMZJEmPqE8WFYm=+aw1GkQXiaPM\9\DApNCQbLLK@+9kFn9%kjRD^FA&nmS&C>A@XpZ\w?w$^\d
=19+S& u%QQplhMYkqCR+KFRV4a@leS!TKWhCdq+lZ5y!^@WN@&qK#>/9#c<R+Ic14FSXYaM4lG>qSS1e^==kID
YhtcEC l+kaKeRQJAml?q^JV:>&HeL:dG#cLd&LFM%db?wajQlw^D^X%CCKWIVJMAF<!SKK@8L#J&6!+Ch/qH<B
wqCBeC Gw!Tk4KTIp>Le?n\ESPuVJ?inlTNJ?p^6n$hT+%eGTXKeaVT5Gq<QnK$c85iY@jA/MPEwW9Z5<tiFcI?
&G/NKM a*CP:^=BCEPh^ka&1biVpZd&iEJeSJCQK\T:&>c9ZCR&c+bPLX>Xb>+GC?@+6PLG6w4e%APi=t6FBC%=
jNEHMV !Il@#ZkLBDHNuCaK=Aey/tyYdG1w4&>88u!*>p4Jk=yK8tJ$beX>ZGl$:&+=pHTuyJkhGTc=%M#MY?Wq
@\Vl4K EP/uHD8SJJ/jX@YBanlWJ=ueHpZeHGlS^+jjNMF4S!*K9Jy&Dm8$S?pn\++iT##JGmVA1ckRk/PpR^F?
/ywDKu LqaPQ8EHA+bkFQSLW^=+GnV<4=F@@VXCe^i*>BchJ%/Ru>Ed!X^t^l$E>*a&:cwIJ*kYwpWnFu$+XhW*
:h<m$& Q*4&8nWteKcb1bXuaKCZ8*hRSP#Bw$tycWCV8:Puu/?ZX/C@!$:>kew<^dEP*yaP?$!&:4B\eHF^h4B#
%:!qqT <jaHMZGu*j:!>HJ%5MZhm8b:>ymb:dYC6>qw^?a6^6/i+Ye\@ppDL#jpItut/I<B5AW+Pl^ZM?L1JlWS
LMK+== V8d5XL+8N8w15n#NY&m\iM+MHH=XGC<Q<bCCm9yA$4M4P+c$b<uJ!T84cR+CwlcGBRWGBaiHBbj<AhRd
@lle@K AlVYj*@kyKWAii41+$u+m?te?qM$V9NG6BTVnQXX>ePE1&l\*AidNMN^XDXA/M<E<ANFe??Hn?CtPVLj
Vct&TH Y%bb%@LpJXqw>K*n*e8u:W&pF=#6Yd?eh9ECBT#SF^pm!y\W?y\tSn:\FIPX\\:+VNIBj^5HR\AuLMjd
ZFDH48 B<bHLAdJAb^/qDERRyR+c6RA!aFn^k%WkZ?l+SeaJW4=t^I:DV=k\EDNWcQGVMpAqMTtT*Jy$Z+44ym+
iIM5pc RI#LqiyXHDbiBNKYQVd8AXEEyE8Z!c\uF9*dEKStiBn:RY1w4*%\9?\&TFF1W5IBpm@ad:b>+/4F5:p#
yDji?b hG4+161#X8>&m$uBhEH?laM?Fwc#Ya/&QGLpQq#9cG+EE\j/R$Hp\+KpAGnYN#SqyYY<c1t6EV^k11lK
yn!uF^ la4:>\AqMHRwTuR^e%8S%Pm!5?B@iVi9Z=G@j9ZmmZQud&TZ9Q@SLTSX^XGpJ:L#=#ieNtbBiwShSDZ*
qjG>9i :\D%X<=D:Jy+nD:/%#EemD1H=a+54F:h#ke8p+@GBHp+iAVFJl=hPW!L%1T$inWqB1y4D9tL@wj#N#&K
uky?m6 P&!GdHSXdq=ij8tFX*RW+kRH=/uW!:>^mkceDwq\!5T&H!#k@%5ZGYY?bKiqi$AR?4nR/QmE+!tEJpeQ
Ql9FJ5 j*>9MH!88?hyKct1nh#mFG&NTRR*V%huJ^i9\BCRFm<I=*GC^6dc!uL@jp9ca5miuX9ZGe#StVL84<GD
R4QlJG @@=4!QVXG@bci^=NPu5iB^HwbPcMGktwE+<ePlAVES4p=?&BCVhqyAuM*Y+<:4C=/!hj1a?tJe8ZLmAP
KhT&wy V&?cywK<uL!Tt44/ABXFFCm5%iBiK*kdBt81nVcNBb#Ca4&9*!jn*R?jpQXmH#:SwE>>IbKkl?tSJy6+
BmdPJA ACm1p@w%4X?h*4IqjBFQFiYq^cVD>^wbYCH^uGl=c1?Q61?w5a%MSb+?h=FMSh/9cZ:$k8\+?6d^@6ZV
huSdRP >tdEThVXk1Wy/kLuwnCN8ekKqCdK$1W4GBZhJDNYkFJJGSd9u@Nq5IJ8/??9y$L^iwk!eRlP9Tyeuyy\
L@^$y# kPTRRcw<XS/GT1laRtYPEk&@y%6bwCSRyqVpXZp1cwPGnQn4u<qVy?eBYJLVS$l\&TE1t55Sw<TFatLm
=i\y$4 551W+nD=phMJZC5*t>t+BWRiPk=H\?X$ZLhSAWc96Si#eZYX=cY+T1Ktn1wjYF*JTqS!au^$1L?Hw@Wi
B?85LQ a/QXBuQ$PVwQ?L\b!+\h\$@uX4ZZFcaq?Ft8u\NkedX%^Le<bmT@Z9$IbApAK$ELDV4X&<^6c1D4JS9L
\14yZk e8@Y%>P%*Lyc1wc8ywE8ylJmqQ9ei:l=4$\bLS@td$Gt!J!tep=8:1*T5wL<1/tuL#i?jN6B$:$WI%#c
*hdpGK !*dFwEmJ=y*dYy8JTGXh8=S/=pSm+4Fn8JplmjZnkBc<*jm>ZE+=iVDe^<$9M8H$iei@CX5CVTZ%kTNG
^T*T\c nS5:h5#wMYNGn@=:4NmiP@tkXWY=tV$E4wSn8NtK\EX<T*SMLF5+IuDlpGy6e*6>=AGLua55ZQ!DjN&>
/ujpD* @EMm+k+hP=N&Nm:E\<EXyMk:IMl#:?Il!n#qRh9D4Hd8&P9p:iQ8:P#8H^wPaQkFlIRG?4k/&pEAbYhD
9hRELw :=jh8*9d14uVS/u#+Eta\FQXHKTqNZn\pMEn>Jj5CI+?pIA1hT1JLZReJ4pHpC45ndFV^6TDljpip$%4
@5\ALZ ?1TK$XHW%b5%d>HTFc6ZLGa#EHw/j/5waAaC:J<1wW6PeaAG@LP1?5Al\+bwDq$THl\eElwXFqYGudJA
>/>wSH F>pc?@?pC?Ku#8p@?%cR9eLeA=8#1&L:==EMWh@@\hkw$ZmNq/eu=cHnmWhLAK:Im&WDWq^nXH!*89Hl
AyqWe& <:ehQ:1:9u>?@@4jl<%%D>ltGZdnaly>pW/nLqGEMc&L^QYBWAFhPi!RP&wEQNjQ?hI/5%b56*dYXi*n
JQw\M@ C#qC8SLn1aJemjNWiKw$n/MmWPtE<KpV*uKcS/pKiI!1uB1ky/E=jN#E!XMK?V@=E8PqSYmBb9WCYS\y
-A\hKm 00098c46c3a001202b3 Page 131 of binaries1.zip
&1hl:@ wiI\BiYJlK5Xt*jd8Q4*ebYbn/Pc<Pd%kta%%XTWqyanX^BAmTR4M#*%=GE&:&APH>iT8jw/XZ^X*aXd
My\DRQ dIKP+/cX+9SnAXbGe*Y$1@keHc:8HQHqn^t^i>Z6NAFL&AhYI\G484T14WFa#/pX%uGALhu1t8wHXXYX
#>W^Z? qSWX%H$F<IBqyTZF+AGBK&EYucWEePZp*m+9!W$@ub^T<XmI/*<F\%uul%6n?8ajYy5d1$G\et?pZ+TH
waEk!w u$wehb!hcE>LJ$#hKd>Zlwy%+e#StECj$QmV1Xem&B$wqKcM85dI9!hQtnl^ktA<h?^w5iZy^XTi&L%L
:Y*HX% *\lTEI&h9ZkXpD4Vl%ReeT6uYcS\BWJV?\X@t=*tY=#<k9\>QZ&D\tQmn!ThV#+R:PHp/l9k:^Ma=G&%
RQjW$K <m<XXSYFCYc&P!&ejj!>ZX$<A5Im\pPCk5ImI+K<*S*5:S$ACt641*&:%5?jNFlXGSj$cGkM%NVT%NKm
FC%4e+ B+$cQGVa<PFDJ@NuGVmGIp@H5VKjRFbmB9y=8bMW8DIl!l#h?YIe+NZ8=K6w/?n1#RTpX1+%ZE$W1+e@
pqE#Bu R%6uIm1Xk4KcBm=:pJPSW^p\bPlkwG1A=yASI+b1VjeMB/nCD\WY@RHXP+SKYqR1/8+FytV/tQ4b&<u@
h@WbnI 9jaX$$J>c:EAKLI=WVT&eiSkZBS8j<PPWZe*N>1XeYM<y4MVt>nYi8V+/ZNy/YAC!/91&@@FlSuhQ#=@
>eZT$u iQ&MSR1L1Lm%F=mm$mR8Zd=<=Ry>tRbZ4AZin+&ne9JA5Q1&1hR%6LR@=$61#%!?%ZK>pNi6$m9CmZX@
/WdyHY atw<EDIRKyYj!5RA16C1nNw*CLIAykH1A:XGV:!NKE&TE$%#ha5#aw\+X%KiWl!1ID<cWb1*a6N8c^j@
^lBGF+ mIPI$yY4YRWqPN@Y$6M8%+4QI:/MB>XW4TaKXEH&>a6unl/I\CTE^c+6/=dN$>jqA$k/e#ha?mXeK&68
%tSLib L4%&QNlt$*\h:Y15Xiq#F/\V*@cEpY!/ki8+iqu9%+\BqTScRiSJ14HtVtX#R\Qh!KpZNHD1/V4b?61/
HEaV>& &lyeV9/AA5&T4:kQd4C<:HdB4e^MRXbQFyM=LV89/Nc6:E9uM1=YCITmGST!%BEZclGe!ML4!uJ&<#eE
dcn\HL \jV^9>tiKFF4eDEiEZhFMlWjHlTVtJ!YpVb:EQb^!t81c@\#b64WKXPuVJqMVcIue5cLVdh>RPhJ=N/:
t*TyG5 Xm/MB1mWEp?eVpt:nqCSLhy$#EB&JA8la19wNa$b99c:hn65>kpK>QD\CR!Lmnq$I9Z5+SBQJ^e@iIAC
BuGpY* R9#5Nw^XXiZ^^t*i9<jSJ!nA\>WnID\ciAmPnI$P<*N*hHB$euc$5:Y%5VSbwj*ZAQSp1lA>A%RDNVYB
XiAli1 KZw\M&V+$GEnlw<aMbc@ey*d5YNA%GGe6k<N<9jB@IchndW!RYw*q4+Z#NRVdR@mEckYL%8%dwPS+Wwm
GM6mqS Xd*<GVy/?yyKcAXX\R4!=PYWXVT$lk\jy1W?AA*^1BFDS/$=GBIcFu+w/EVX@+WXBqa5Xum+>YEqtnkm
$XiRtK WSY:YK8cNCRWpDcdT#m5mYQL+hlw^?+jhcchhJ%heFYGN?E1lpnX?T5bPaYqFjY6JFQS@jMLaQXINH?i
$eMe#R u=PXeV$h*KApBJtZLq@yVci9DCc=mR!Tt<kuG+4K!8@nTt8!8a591/&@bQP/McBI@X#%mtSKVFWFhAt$
8m%Na1 mhlAkjIQ=E&XWtNWP$CyGJ/E194kIYQ9AF4ecV^c4Ie4ITa8LmH^R=\44WRyDyHVtIykLVe!6ZL^m#ma
WX!Y!M mGBh#!+p8@4A?w$q?apTq1^1iNAj*C<6!46==h!JR%HBQt:&q8#1LX%6jmYjN&9NH5>+ZQlhuyEWa4h%
$8<@i5 ka=&LX<Cn5Vb!:md#MYZ@56IW:W=4=5dYLywwE9R^AHCPI%$uWSVXh:hhtEVy$HaSDeKG=l/5dyc+kbq
<#:1+u 1!49*:>ZYZGuIJ5Cyu=pMhpde@K!<m/j8@Ll8\mtd*my\&?a+CYDPGYC=RPcVy#EBeE+N5#CBQ4@AD/H
u<pqdL ayE?STYe9uA%/%dp%EGWy1!YJpTm+*Y$y@Qy/YLVyp+XVPFME6i&KEQdX*D*<ljEcS#G#ye#41d%LcZH
NK*e6# wbaE^PpC\iq&YeYDNH@@Qd859LeGBut=iaQym#=\>P!=I&Finw+?kaG?@1H?V68tDiCyK156edH&Ck:^
MZ6Y>+ e*j#Da$GnpImD<SHBZw=P#1/+BT\k:*X48ZVl1kkT&y1A*:nNGkRBVk^R=ql#HC6EZ?Nk6i<I!#&WQ!B
IF15a$ tEnm?h!eTdFJ!hJmL>C$Fcmbm%Nn:Ja/H5Fy?YyDw!%dnha5k$>QS<Bj4KM:e/GPl1I<eZ>19AEDNPBM
L!9KDY HnL<4!Gc/knWQ/PG@:$<PnR$QCL1eEn^u$C^t$:^9wD@A9Zny\CM*\@S:5BZdM/98c@tXJCZ*diiqb%5
#C5e:9 aLhc8nk=$4mM!WHd$Xt$qm\5M9akKFX1&4Y5Y!Z*c=6^@jK9u5/9H><<F@ZApjE##IGCRIpBS#%Z1ZR6
&iGVbC FmdeYuG:=A/B1d185du><d<9u5ND1d>+\SBK^BIt?:mIE5kW!yWwupKREKNZQCqXuy4/mMuV:9J@<CZG
eiS&EW !yPli//a8FCCEceqi5R=$kLF\ZLn?nH!Da>QJFMhdHwCub+<!W/WpD&XD?l1Li#+Kem?h8HWphlRQ*iH
@h!yX# @d8*d%m=eJciNl<^t4F<y&6McpFh&@*M$?EP&^jyc6iVdpZ>BY8M8Xci+9Q?bYViZ*ub$wBJC41Sc1Kd
ZCqP4T JWm!9J8RJNqRpXZR&AKA\T<ItylGBySLYMiA?c814Km5K48Xe%MIIH$GpQ+y8Jq!1y&5PmIJmbemlF4I
<Q=%>C IHV^LZan?Cp/cVT+8=V#F!<SlCBCBduH!!4AAYLphDAy>e4N9N8Z=pQkJD%Ra>CacZy/8pIhSq8GQ*$/
u*Ic&a j>4$/hPtmp>dhdMAKM169j!RWHV!>NpL/Vi8IWYJIwwP+n#MYS!TBIyK:>@!D>q4a8pi8DpaImi@wLCw
P%^//J &MPuW+/FiV5:iAWG?j8HBDn9%BtIuYmV>:4:l+X+8*5HSeYB++tIV+kL<*X#euS%e*i!h*K$MX9NH/IK
IhuL@= Bw?u?q?K/EEMwakGmykSA@<cPjL99<ebiB@AuWmBtJX\JBXdJaVIbB8mMq8QhFBnp=\cWDVjaQu1>b8&
%Ghb4e Gy9k4RLaCpH^DeBJ#F?/iAmCyM#VGDF/%PCBGlycR$iMHDFIA$Ac<e?aWTN%@TQC\mMmV\Si/\jy6Rkp
?h!E?A WSCFIMtTp+$+Q1yV8&<cqt^HECWwMH6?8#AQc$iZ?$iu5W?D:Zm%5^Zc/NncmXdCBwTES^<+nQ+cF=uj
D/S9kN 4Y=m<^ThZ#?>ij/+FV@9P!!XPN59tR+eZd*YiX$LKGJVjQD$qtQjYl$I\$NeEj/ML#bn%uCpTQA:#/jK
BKka<u a6RLEIEtEamp!L88191a^^$$<S+\^J&pRwqSZI=+n\RHKBKk!SM1DyIb!hjSt\5I:Zj&IRlhIptI!y1G
%HWw?R =l:Tcq%bZu!u@C/ELqWcqXlu8uHydGJ<SICHE$qA+DInG9uSZd#hITI=4:1>Kme=$5uaRFiuAaJhTd$=
@YNWuh T+*MHLn?eiLV@&Wpm8/&N#V$An\WEcCiJk!aRIXKC=6cWbpw4N$mZR*!>R%+@e!DB%W%hZi/Ab!QYV8!
H8em%e d^YuZm+p/!QJ845un^:mnSV%eLdlq5wMHF$p=V8WuT9ZCDVqSM/d/148qlSpZd8ajQV+PY\tL!*iyKYq
LZ&tGc 1VFw4M:5&dQ$b?nQtEH4Md1$D1ZN+e6Q%@ey\h&L^TXZ8&PRt1R#KYqZd+1wPSRjK=wmP**8\yX4N:P^
I#Y9i^ D@PRy+*JHlj@+I$Bdl+?AeHl$jEu#l&Q<HG!>\kIC9RQCjLaM&<RVkbQ6jIQnR#!>QAQm#q\IDw!>plC
XdmVD^ hKCZ1=Pd8:84p=PL\:/N85QXeB=A=V@W$Jy>$KD$$ATcWcQ?Hn%6w*qECQF^#k=pHd9TZuM#p&&dDFec
#/*GTR +EyuHY$BGhRewK5*c::Bm4Wd68#a8Z8*<YdD=hkJRTM%iuMMXl8PXkJ8XIbQ%yp/d9mkkRP%lw*<=?@l
#EePdj YkM%B+@+b<LwWYP*SaeDNkePSqTK5MFt$#?\/itS/&E*dKQ?CH:!YjX=B$bdqHZAuB=d5Q$QMwG?8P:a
9B@kh@ $h:Y^6yK8F@H!5dY*5EbwQELDItIahjQ+ydNB+$Qu:@:@LQu%:hQd:Gj41cTVDVpkQye9*1XV8eCMStD
@SH5/A TE+<9\D*l>&>*:iZGNeP9Q<E!PmNW/X=ZaAM%ty:XLk<Rk#Nw%VEiTw1!lTAk>A\SI<ikaWVW^9?V\XR
<59hLL I#bNnW8LmaQ\mH?XEI1VE6MkieWJlJqh?=%<\wCb<=jT5dtl14aSwmLb61dcm6LdaCZ9CT9W:<N=uuW%
Gq6GHe NTplJ6ndlcRYDPdM$KGRGJ*=t&^CVtbY6FjuyeT+:F!my>MEqlMe\cI%&!%hR:kJKiKLunPTQ\8LAb48
C8ME#? SlRYbKP*H=15!uc1Sd!=ycWXE*8CJ1yS41G?F5Kmt61!*G!E=q*Y&wI:q>QJDT1+Ap\EVE$X9m#SJ4A#
N+b=#n b<kGMDIaqXhEYtadt%8cG&545PQlTtyTMlqK8ujji/#t\GHV/jte8jRebyda#Ft#/JuT?nQ$b8ny/kE<
tpY^Nn apabYFQK4$y:TcA=DWjJ>W!EBqh8^<iShnDSQD+&<8VHi#u5MuQ$C\=p*Bh/+Yeii@VMmSk@F%6Zj&At
EZ!uA1 PNnVe5qj1n^XSXZD!InIIA?9wMn+k\imw\<iQSVy:?up=PHq/i4p+t1#c?u+AaALtHGF@\e$#AntL&ap
wCYe:@ Qa4*>?m^E#cCY@MmT%PBtd%K=ta:6&*c5GdbRuanGEYk&ap6R9MNX1+#&ty585je*HTHETd^hMA6/PnP
LNAkAD Y4Sm@Yd>AW4!TpMt/i4#J+$cw1WJ&I\iM*Kwq8dk+j>MHD>t>N!A!Imw1PnE+D!C#hN?dEVZdjV$TBB5
p9#XGS 5G?i?aENpZ#SHqC!&da@8eDYq5lGV*buVYmRu?mPGC6L!*&Wli+?T*IyGcDn+^<eFu$A&/!\*qqcYh@?
BPh46R nPV59tHJq1\L\>pH$WIq?y4+>a!MG@VN*5^Bjb/64J^qy=Ep<X???hD^:VqjdP4I@>KD6w&4!lPT<RY8
DT<d:= Myk*YqqIwmMYIc/ccl5\^FZ:1^IREy<?XAw*VEw\p4<RIWpFwcKY#CmYIE5uu%Ap/DLyeZlR%>R1!m8W
dWy=*> +QDR*Z9$jjX:h!G5!ElLQuak*M@XD4MKT?j1/\kSIi$=/!$Dnq$9d/$4PB@ud4yeZ/eFm?8/?9NB$G!>
a1\FCn I^P=cdum85<b5ie*Z>PEIXKw:Yiw5jVtuSc/qTF6R&\HBAZiVcaBw1Ccl5a:Gd<Aw4hbS6q=%=M@j&J*
K*Qn:G ediLEIIn4VA9?<c%!&ty=*DPFt#c6S6b&JXQlqYcY%4BLcBd!<qIP\jBVn+&JiT8@b5@j?HCBR5ZLJk@
Ll*u@N n=+4Ntj8HH1&eCcnL#>D#!C%AFRuy#K4pQCVuHLlTpdY6dT?m?#/bnZQ5ZZi\nR9Q%NVY=?RaK>Fdq:w
Ti^FC: &KMQu$/K>Zi^hjaJDQaQD9G&ZnMc<FFYZlReE^Zp+SMchjDRkbmaw+u^+Z=8#1=iZl+8L8:Pqy6$l5H9
eVhyKP WwYV<Q?ND@$ZQa4=t@qHcjT+lYB%!DJ8LMP/ti*e9uuD8yWG<&iS@YHAl#aYpHV%>Pe5YLLT$GndVnN#
81aLCQ <:&a5kP:ltpEPPEYLF?*&YVV/AFcR$hP$yp%a@4a+aP$Bk$dNYde/PGDBk$BjmcNH<Q*\K&cWeinnmM@
tMN4K* n@@pl/RSCD>kwTukS@lnP48^AZMIwm+Hh6CH%JHINq!!XRm:M5lYVL\&m#cu>#Dt&ukyGhLn/SMAb>BB
-ApmBF 000b085e4d0001202b3 Page 132 of binaries1.zip
Alc^Fh WktHl:Gm49Zy/$@j??By1u8Ak<kFwD5+B$lqmN&+thtdSYeQ\9ySWeph$5%Yk*8N<NcIX?S8L\l/Jk^R
PNkNY^ =jF?1XDE4QWyn/1AwMMwe%T\SRnpS=SbEMK9NjK+1wP1?N@=plNX^CRpJAWTqPR*Ca+<W1M^VY@85w$:
dl4?Tq LS&>R\<kNhi!C8:ei%CQ%I^5dcm?Y%!IieH!8*n=!?*<#QTWE+imAn$e&ITB91/AZ<Hu/c<&>#q$=W=#
^ltqQB a%Fc9Ijb!yp/&k>JlCw*a<+TR?N>#kF^y>K=BXZmM%+\Wn$b4c*%JQZYIMBGwWaBT+=W<>&d>@=>*E/*
V>CP9J hLhTLh*NLE/%VTXbYb&A#P85qhtby>9AyMH9/iQqLyp#J=6mW$Xn/hmWiJ55:MHFB/S5>PB8!c&5>I5+
/Sh/kJ Fa=q$u9YT=a8wR&a^bKLpJpF>H^tHnPZAYw+5!Su/T?I8\Z^nXlB?RZCDPdCd@a^e#k?ny*WIe^k*TuZ
n$!D@e %<jCbL>uaLCj&\JQZ=Te8BPu+kNhdi&>k$ICk$N<:VbP+Ktw1pyND#+WE?nlG^=:/FBedF#mmjlRZ%hu
jdWta& D^>9h&e*h$i#XiQXpSnB@+@EMKMX^8uc8=KNTkCMtV\A5*Hh/8Zp<phcl\c^&R&$#J/*ePq1\<$:RG#&
B@mnBh Y8DhXD8*pM<MV:Pqc+!M#W^$^w:?c?S+:ht#hTj>NZV\+GGn^p+aQ&4wpCHD@=+\hiK+Kj8mwmPnw8PP
c4yGtn lj\@ijp8@Cd+#tj#&G@aNXjNDdZ5RypCNw6>@l#yww$JD\b4/WJ$B1@KEyn1tP$^*&iJ>%?T$DA/Q8EE
wI%QQe i/@b@h1YJ/<\=jc>+@%L*DND+ly&q?YNG$!GFLCTqbYN>!4qMutDSG8QehKku4&V/NpL<Gqj99@1iRGP
j8Bt+@ c:AKDeVRj^In4pwW91@8!mJD1WmkWTdR%QHEXDYtXAM%*CpcRptlBH:S\A=ZWk:AWbAd1#6u&WaVACeE
Vn/F9b \iuQ64Z%ayBVZ%XiCA!ZqFJqA?/RJQdyI:ElQ5=Yb1IWARFu^uJVn:kL6=8cT!+j>ndH4W8Q?M4aCnq:
WE!&pi $iw6bnaiwajQb6#t%4TJ4*#J!L#Qct!8B*RkqlE&wt>n!I?<Swl4c85dT5?Gy:R<jj8\9c&66:WHRl>^
VAp4m^ 9ECP1lh4Kdu^A\n/teZNlniL#8:PYyb:Ii@jb$<i@8cI4IRY>X&B:F!@kdhcFJjB>>NE6yKR/?kkeINk
$&ZnGw DR5NPBLc$lC<e1X\KRha+m!tF#EL/RXm<?jNw?a1#J$#!!!*PDe94/D$+1>ayCnq@KX4Yd<yP5D&<Tih
kb+DFP Raw!56KC@C%N#F$CR\JhQib:?jwHleWeVVwe:GFu/^EaEl\a/8?$ZX5D^@!XyquHREkjGZj+MInZmSN^
D<RB/m \X+8Ll/?Q8+8Hy:&Jk6HEhuy@X<R!YwNGn^+!JClR+eNw+h#kCI^mHXwq1M^a!j85MM%jaDSVuuA!HD%
m6Yk9n !mZp<5hiHWbZcedMPR5Mq1@i5NX+6:t=^V:cey&F8bp^X9Nt/M/a6&T%$jdh=u9tV=\\/1@^@Nq#b$$j
$LY5Sh M&IIWDS8$1R^I+amShPuVJ!\QD\PKDy\JKT18c*>N$X>8dciHmt&pQBX?I*#uj4G:<<PQP#4BmJyN5^d
8R$K!^ Z$nyV\+kS:ckPaCS/c/hqIu8#q&tb8aY\JKnC\TMIjAtJb=P9R!S>>*1=me9**@>%j*nM?qp1P>DE%uK
<99jTk bG=KApk=PduCQDy@MJcB:yD8G:#cm$CQX:N?@hHX$@tTL#cbBapm&VaSTBJ1!9L!JHW64k!BD$NAA1l+
<+B16I +tD6CEuXQDG%5hN4kTR^MG=CTX1mF:/EkJKa6KITnT#>DT^6MNuu+BWTq>mZhP>u1ddmV5G6\69FJjTh
yCT:qq ATZFSZp*L=N<kb8NPja4#J/l$+55/Swa8$ThK&lwLp$@/ti=j4/8#tM?w/PpN*QBC1AW6?cj#!16=:dX
$kejWW mB8>bCTdd4&64c@9AS&mt/mGupa%NGl%NTY*QNZH4Dd&4&l<BwEt%j14lh9eSGMY8@q&^k>R==+5Jq5t
EMhd\K J#eZ?^i!<?ldVAE*N=9KYybhiCPq?SELFQmE<n8pQ5A8$!K/qJPH*XZ+VdWkV+>E:WIXh\1#d?Vmh+84
$pKE!B +K:9*NC:ZH#b$mXLKBAwblFuwZCB=IL=e$*Tm#Huh9>GBeEy>iKXnG#5lICuAc?EnQ<QV5i>QE*MHQ%D
V/aNGN k##eQYh=?eGneCnyTKmH9dYdj$lIRGmk1?te\bkNWFbSHVJNh+X@hPKS?AMHV=/IDjJ$h9H!<ZF*>jC\
BSajZw *ny4KI>Y^hNT@nhNCBPnyhBQ$@DlI+AtbyVW*/NH@@QQ/NH$GGc<#My>?%GVht=ZAJnY4F#PZ1Y1K>R^
CmkquT S$tc9*kyZuc:E!RJkw#>dKeRNuVNtnHZaQYGdcd\<$d<1YNGn8ZQZnSQd?KwaWPG@V%&<yV^w+aQHj:*
tSh=e> ?Pu<KSPZBB!Imw/JTa^Mba*ST*KuAd8En9CEZR5@9u*=?4Zut*b@*8CS1FpB$\b=jdQc&JkiT!:qeZY$
BI4Y?n SW*cdd4V&HkH6X%*l:HJ46*tF966:J*eRJuCa<DFyX!C=:K<L?H&<@PH%@?T!%eRWNH1ebwe5uqMQkNQ
:Z/+=# Bq$+mP#m^+SSI:uw?Bui$N4^:Yh*h?jZq*!JeSy19Q@kBJEPw!wy#^GVqJSB6YKW^aAyuEPT=PGRHk>^
IkKGki i54nRQApkj?1?w9HHVt6n9?NL#XPTXJTTlK+?myJTZCqITLTqNZWu4N$k#Gl/6mbC?!hCnWNLFYN%jiK
aE?*Z/ Tau1Nq&5Bm>jqFL\e6m*e@QcJZQ$hZwRKy$FY^*CV?jX6ybjQ^=wddSIV?eyZ^X#&QPZGY+#6@WImV>%
Ze4mMk Kjh8W!8*Kp@e+lWn?j:/m@1/?m+RJ11l6=HdWE@Z1ndhL#w?p/jG$^n<#<!=SpuZ:6R$hRJYnZTDiGN#
:=^ZX6 Web*wE1R^iSM!e//enL^1PWYw!*iWWH^b%N9pw9k5nKL<+?X@<EXJp1#dtbe8$1u/%#Hd8<m#GQZID/I
@m4Q8i %SP&Ec?l?q=Jjm+1M64ul\WYG%i9Y4Wc9qc8YE+6a=a!T<RMFl9Rm#tLtEX!e%eiL:1F/duCm+T9C:nm
EpyH>@ p8Z4PP=t\/FM*M/Ye8F!ipc1K^5qlZ1:iZnQ>QEQDI6LQB4l+YD6=BeTGlRc:LX*!RlqaAdPRtWFYWWX
XK/%tm 4dHnb%m/SS?PCRT<9Q$AL$@*@Wb/k\li*Z%+>YpXw!XB<KKHKk+bQHkA@MKkISC@@QWQQbwb\+!XuVl?
+LF%VC 4ktlc:M<$LX1?dLF<?jw#>AV/8:F<atFT%c5Yd>y8!qwFeJqdYNF45SG1#:HaNYG4d8R8l&/@Itn^p/j
BwTuqX 9ZVS4GtnS\\d@9i+!hMtn@q4^F?n^p@ZtV=J#\udNYIPHR#:E/@?nHaQcRu@@8*LF@w4L4Ca*y>k\BmJ
AnRuiM dX+kyXGTq#6F1pJlRZ=idp=&Xyb:>=n8M6/^nh:KdGG&/t#daR!M:h69++CKFSwXj?Vp&dS4YaXqXR&a
G1a6?y u?95/j#!EWjBG?9aqkn&wk8bdBC49Q^dBRXWIXM$=Day5cL9c!J*IGMn$!i<nLL:==j*4@ne!RQy@^p5
K@>c^@ 1cmyKpq!8B\5@plIa8Ml$<eaKBcS4GjAq:K!pl\6LT/9mQe<h@P+R!jZA&nemV^KmyHpwBYW/kbL!AE*
^CqmDp PFBicV!mb8HkGSJ:DB\5&*YHCY<bdK+8^Be5LFR6!GjVDtG?L6d+1e#Z%?$G#FT%=^4bBJ@Ii6BYeSM4
$VQ&!V 4p9%hdTj<hW\4nXa5>q$9:N9=JG#%\w1tq518Dqu^i%iM%I@d:^541&4y^5+>d$NYGkXNM1nD/^61K1+
8=11NI 9IKHV>JAGZW%JYub/eHq:X&5nIp*NSde?Ia^b6b$iA?9Jn6dGiyPuc#BW%WjyDX\^NlJ&=$8bKC$bh+8
:QayDD TTl6/48l4jk&^1mbN+WbE:N!eB@1*a41PuAHLG=QTi54ce<4IkP8!N8nP9@%/+X4JhakehRKint#nLPW
bEh+lu YmK%^GD?54mCRm#D*n:jG+i\Zd^<LVQ*V>kPHV:C\uay@bJZ/B=nT<@kWH<*h!>9LS@@+Kkn^&K<Hjjd
iuCP:$ iRiHlwTE?X19G+@lFZ^+a5yKT4T!lw1T4KV5Q%9e9WDKjH$<ZL*h>&@W$XJB%4y\Fp%X=A9ykR!\Nu4R
?8j<KN +CGD6hR%BkC55nJ!C4mdZ$/Gy#H1u:Hn+H<VJ?66S>R&!kF1K=a9YVS@#p^>kb/KQnGFlpdwCkGw@Xc$
!uik#l #ZydaA%$D>P^B19Yd>&%B*@BjMH$cYMS6TZ#hMcNHDHm:@HV?NQH@+&wVhQZtc1#Q#w8Jmd&\KGk?9<d
j@JG*^ NSqmDD>@@9JF?JZ=w5&tI<lT:d/Gl9=5BGpV^!Z+EFLcY?<#N\Mq&:=%!?bNqBF@$=c6&\q1XucP41S=
Th=5<j MiE+QKSb6?=kQ8>N^$?&DQ8a>adpVyqdhB/XJ*P4AIKaw69F^ZVJaC#bXJE6liAKWek?hH#=*6uVBc:!
l\*t1t =i9?GP5@%qBenTjF/ia!HK/aDFibiEVCtKw1!im>=Et4KMuLTWqImA8=$tJIw/!<mwAHwbuY=Abpdiyk
>KMBda TpwAuApqGTqcpyERp=TRFTw!C81n=m^hn:RFE>y8=lYZX>a&6QT=^X8ajM!ud/uBkbF=le%a&J99&LAC
+bBHVi S@?/?jj=9Nu4>\ee8%HSZyYhHPFw5t1Pn5=#@kB5eXm!$Zm99Wh\*IpLN&<@cG&?t<W>E!*8?+cSyby!
pcDFJ* u6VXaj\q4Kec5B4L%GMAJw<J<64/B:j!\<iy>iD=Lc@mX9&RdtbcFJ6dYy1dG^5dGywdC#J8IulKaBy#
48hbl* 4/R/#^1w11!kwKkPn/E/w#FWZW%YaiFtm?V<\y\dh/?j@u$%Iy^=8Vq+kj&W4G#TpEitC\A>IP@y9<?i
+1$tjA >a%D\Ve6pny\Ge$SG#c8y\!bhh!%c?nX*FY4/XXTIH9Lq!%dL4%<&bLFX6hKe?p<5iL4#RSA$p@SD?Cl
Pj^&l1 ?IP+e8EEtZ?@e6DJ*tTQc%BwpKi:y=iZyp>kiH#mAX<uK!9*wNDRwLAAl/%<hSYT/^9G:lHA<FqPd1tL
kdc<TQ 1:PHu/?:1=i:qSFjE*>Hy\1n!1k^A@D:biGVGVJ1\mlFGZpqSXylpC#iQ1twwCAuIcdAG#B1*IS^a!hQ
t5C64: YGTCAbuet6W4+GW9YnB*>m!l95W5$yi*eR8tNT\\V&%nc&jjN^G%a?NKAy<=Zt>8ceDZunRP/F8^TH@T
/KClTQ 1JEn@=p\VXh9!ylSI@<iN&*tDP%y/+IPAZ%^CXEblL+Z@/Y96+jVLe&8JQ9<YjCF?Y#Zu><R%Y#JGkiT
6LjX1= *5Aq44nInk*LdC#Nh+QMdh&!!YnD?9YGl85*Gt%CAM*&YlKyA#h=CGK#>J9=JSW+A>Z^w=6WwuCLKC8k
u+G>S% 6@F81u\tZ+wAiB9\a?+MLT$nCeE@Gua@h8C%&F$pSjKc#^&ukRRK@/^IMcyeSdFPLyen\%Gt?&\pn<Z9
W%kQMP Na>Sp^mkImuGyVkCenG5JJenKTP4SEQwy5wdTRmeNp\I>QWCjWkm^t8Wwwc<=t#ED$h^Ed@MjMT9EjAd
49kpHc \h4Kt%ubIC>=8iCI4%$kiR<u!%&p519hBjTy/1@b/*Q+cuqdVX=1nK8b+RJhHi&ZEK8y/e%bdtSt:iIZ
#X9hu> pZDtep=yZX6n&e$pd1Td8M$dS4K?1KPt41/4ZwBhEA&KAFX6VW%>>c*CI*!iX4itlL4a^49Q8y6qG^HS
VcY=PS =4y<=K$uT!/*KPN5iZ*bVuZ%kdSYq/clq1cMk9K5kMSd>&:hPyNanynhKTptViq++*$8*llWWpb8S&pB
5I%^VE HTPWQZ@?RnRy%hJajdej5!i6B?H^*El6+K+*yNhSc=p%W16Zwh/6XAVcqqmpq?N:WJLjRmm:nFi@mTnD
-Aj6a* 000aca7a682001202b3 Page 133 of binaries1.zip
W45>yS Hci+<E>EYb^QwQFPi:?\WC<*D$<9:=q?IVFHDkc/YF5/?+iFBaeH8=uP$$JHmb?hM6qEkQ?pI5F*<uV\
iGY9/t <IZa^hQDcyPPlwk!Wb%iZb*YwDWHcA$iMY?Z#Z+>PZKX1SJi8mGuRCt1KEmJe&WHn^\@ciLE!ZM&dnSe
C\<!P= K:6/=ZI<HCDcFM=St:8A6ES5*&XGBM+cGcMh%6t#tV8\Ll6R+SA!t@$4>QTtnb</e?t1yZPtIX#ny?9N
PV=#X! uD=8>Kl@^p&bPW8Q9#4\eHSMdG^C@A&knB$#@NlZ5841Aekp$E=?yn5Eu=pP:a>>1a?t@tAN>=^eIluE
IZXu/% I+eP5FhFE5SR*#addVBe6=biw:h&uiFGkM#EhI@Fjq5uN#L>e8\W=n?K:>i&Quu><S6J8:><?4CXZNME
#iMii: y!8btGMKtELyw8KTpn6*T59w<mF+WZMNm^k=EMBK+qZNJGQj<wa9Np/hdNumKJNYe?Iy5T?YB6LEqMR=
VDaR+k 9:lmHEqqLl/II6VRVd:tTcpN?tj<8AHm6Bk688BAke9lTPIGJlZikJHVtwA%5YpnbIRAYk@aT=R<MYpF
KSZ<>? Ay9c:CYGSJSmnmbjVCiD8\CdwF$B=@dKC4P8*<BMKJ&qenQnpmk^5te4CiF?IY\#Xyy=HEm:$>^RiDHi
RN5N%d e><tA@CY4@pDIacdMY@FbuN!hZuK6X6*<Rc%nJMSZJjh+w=9Gbu8c?<ceB1+u1+VAt>$jW?DZF%NVY%h
klpGCA iYGP$&Bi6/dpRNZ===ydlE%$5&^Va$N>R*NNd5dN4=tCLG=8keL%=E5j9*@@>n^+^GA64b?cc:RG1m5N
AaihWl uib$P1ipNQp!aR/k\%MPn4qdeMkSV%ujlCq:WDbA:5ZLq/@/h>LYX>Y\49IJ@NJhG=M6>Gbtp+VS^k$d
Fp!nPS NqL4cSA/B8Bn%pm5Yt/YWp4qMRZeC@RBlP:K6b8=?RR/55EWwV9KRyj1G4q:l/X*cJk@*uQk/VMkMQ^k
a&$ny8 RymL%V=:u=C\aEB^@<ySKlCm$TwTkA%/q+F+b>QauT+PLn=?Z1/iu9dd>DWJqekecJ6I&Rb1ck&d56a@
yK!@qe KCnRa/tT4K\mZ4P6IC$qK$<DhI4!Mq^^Gc*SE!hQuYJk8Hc%DDK*dKuBwwZWkuWLF!%i6kyMyRtaTmDL
LnKLPb Cyl#\G=eJ\hS\u#ubyIiaZE$t#Ndi\JR6*dXRy*^@+#/b\J@^m!>TYQ?GR*W#b&y8>L4WA\h1*:kaGnL
utC691 @/c8F:hmT*d?^AJZh+e>Y?VCDEq@jjmQBAu8nAu&l@nNh9>iaG:dqp%\Y1!GW&:F!qY4%^l8&LS%l+ty
B/*dYu PT1dy%>IbQ!SJG!H8Z&*y9uJ!\@j84y@hL^@>i@nNndQZE+GXa5twKpE=EDS!8@i9ZejB!j1G<pGGcJ1
@$<RPn +C9JuXS9Z#^81Z@L=$+jJPS^XWVIMcRwnMmJ1/t1!9*E?*J+HFZ&J+E&6VhkIDYGV/Q=aqMGT?AMIp*Y
HNi*P6 *5uCd=VDC%dW^#Z^9@KqJ1qJTWqLEYFnyGpyD58eqIKTWFFhce\T\^&AZBAmh@W*e5N^$1MpQ\Mu?G@e
CdVMIJ 9Hpn+>1X91!J<RcI=uR/kVk%*YW:ZcJVm=1cT/+e<dQb5ZIP/N6d9mby@X8F>:NFHEyK8%qW$h^YY*#6
bm6aPX iLkL%*TN?Q=*+HBL!%wlk88yw?w^=enW>Va\hW!NhF%%WcdQQ!1wew4cq%/&+aTIDAS:>a$QALp9tXTY
b?\Z!S iHbi*kZqC!??ptZe:\:5t+VNyV<$=Zt1\!bdbD#IQum6:I/\SA#ijLyRw?k&9Qup1mPTM\GNR>=iWc<%
E@JDk% Sh9RIbl4dPun:Zt%w?p&+XaPREedCVh!N\B^uHZMPpuDFS9ndtM9aH=BYnjBDa$p+uci9hkBcBQlhn:R
%eS\DS \>y+n$6RiLCHt\hwuJ>?TP#lTA@djhd8RYGlIYH?>y8tDMDiYJHE1dATJ#@T*N@S!S6\<@B!&DX9pBLm
?=$G<c >9MQI<pMqNReQH/FX!AhIP99=:XKS%XcRXtbXyKTp=cYXXAEa\tGpm5lw#ql?1RyT%c9=K\RL8iT/6?T
++G%<$ Ae8Y4%m#aa5^=pwIWkCdp#Qqw6i*M&!QTV>5>k+Y<?d4V=+/c/ul8mW#J+@?i@REQpA&jj^wyG*iHL%=
K1B=ku %kePIG*^IjZ@wW$$>MH6@mYPp#jWJ&EH<$pHNR+ZQbQLCj4Y=QYuT?JnmI%$64i!MN8=A^S8@d4X1?Ca
qDSuE4 wJj1LX8?e9W/AA/5yIYXuVM+TanpVy=N8==VXF/N<+yjj@Xkm#1=LB$6/6$!DCKKtYKtbM\hlP$i\FbS
=86NZI Tjw^TC@V1:h++h?Q#y:8V6IL%XJjCd#>4Wc^9AqFEpe!p^K1QAW^VlhZkkMYuaWR%W*6LjA&aNkWAX>!
XQ1KL> &nB%KY!1yelCQXpT$Ct4<nRuNRN\aqQWyYlyB5TNpSJKh$qSpq\y&X:FATMSNV5Y6Y6bBZ&w!dW&QCk9
EtViWn !puH1W4/G8<1HEhun4KJp<&4Ma+n1Pp5*8+Rjmc@41W<+$TIw/ul\lp/&8@+Y6m\5ZD%64%PAVHH#q:J
@ARY4C Kcq8dc$8Tp<MhVdq4yp6Hkm5jen?WX%VY>5N/pdZ$eCdau%DZY$%TF=y!ZpD?aE>t4Jc1pyYnW@1TMFN
JmF:5F %N^SLiJNI45\@XKL?Q69Z#>VHe1j*4!+ubpYb#lt#MTSYq1D6Hw$bVVW6Fcj4dq/yFla\4pnKNHFw?+i
Qm/adh hpCT4AqkBeC>j9*t:X9&Nly&>L8q4e>\91l^*tP<a@6&iki#nh:C*R#5mY<!&4mS*mC>aj&G%S5mm\1w
*LGJ:q QQFdN^8E<eCh+4YM4H#C*hqVJ^IV/MPcCWiPpT%b^%\nh8!!<\<L>ZF%h@h\>\:RmDke=&%ucipTGBaY
Rq&Ci6 El:mn5+T5FNF!$>WVk*4dQL#*F#6QH&>*h&<uM&Yn%KtXdGXVXRGIE&*R=e:?8J>+4TQ14iH1=u^=lZn
CMiuPC %VW$iZLTMm^&<9I!<Jn\^9Cu#Fm=kq+86tLqCt4=llW4X/>ic\m8ew?ILL!%&6uF%hZNHRj^HekPT@J4
XRcEu1 XwR/l**#F<&hQt*tpw%GK?hPHV5c5J5%d/:PyLFn^$?i5YC?@l^Lkq%ejHSG//Q@A:88VuEe$KE?Wy?a
w*ua1p n:wj*9euV@/I*6neTcLwFuI&inM%*4wbSY:F5mWGB9SmQaMq!%c5N6!+ib5^Cy&nt$>AiM#l+@C+bliY
9=/h6j Q&l5b*PXZ#??ijH$aS9Jt6&@Y%=&=$:JBHTXTB&B:pF%j\9l1*h+<i#QZ#%pi\#B48\hZ&#!RDWI$9y%
NL6=/h nqGSWqdB@iaa!KtJ1WmB9bVkTIQ%b?GnAd:ZQLFlE/j%<PYuV^5*=y>l!lITaP!F\J>AVIw4yeSV?*6/
aak=Jt C<DHuVKAA9a+IHbCcaEWB\TQp8VIClVXFXRZ+!*49@t:X%ZZ&CwE1Y881!m>hVQ6A1/5\WWK=<<iQ^kb
qQnXwu /GFu96*RACK=u<DjAJ$Ft&&CVtR>cK@IPlQl6t@#56tkhb>I<+it:5^Fc:hdPAjEuW!>uq>i%>bTYZD=
*m9\1i GCC+ln6HS>#:QTQ*I/8&GTG51/5XEA=:/*F!8F4!V9+N^^F1*amSWZbdQj\G1q+MBI?8FaiR<MbuJLDw
8G=S\X /9Z9*/S^IT>:F=HK8:h9*4!+u*Zbh:ZBt4Fck\hyCVTqNAdw^biuu1FL8HhKlYXM8jyh>B4wM@9EDTl<
KYkJih ?$:+ZqP$l?=lP?6Au&LR>@JS<G:VZlM^IJHc^t!X&4J=</bNSpc$peR/w@BdlWBk@4$mASI+CkhG<9wI
jmec@G ^D98SATieQP!MLd$Ck5QeHin*eW<jWQ+ejFBn99&&91ElweAq%a4S&LDkbw1CF/@:1pwc?>#6uZ%<ZF*
#uT/tG <ZT*NJ^CTkW@@4CbmkM%l^kFB?KhRq:p#m/iP%/B9ZjHqkXn@@ydYWbPEbM154KTal!=WhMu#X:B4PC8
!?/cS4 ZCXe4dqtuiF/w$*Ea9bJG\Lw=p==/CGC8F*b\y!+V+VV$hF8&cKFi61#qll6YdNRi^!eeN1#F!#Wu#bl
w/tJQu *IRyM^a8uDZQIw+RiPD+/bd@ScCkS/#:X/e+bqCwD@SH?kQ#juyjA1Z&\i>KuKk>lE\=k6F$6CWEd5JT
t@ptdu @QIqBw5EC*RZGT^hkjuYHV9NLK\hZL\CRtMPJb/=eDY4wJRhij^BR4TZ#>neVBWCYF=Y^5BHQ8a8C^?P
>>:+&? QhXlniD^$?halQ9!4dP4y?5u!Z5Cj8XF:@qmW+j>J:lniDLIH%tQTiSQSX/<p!5BXKtw>E$Ze%Vj<4m1
t=5K=C I:@!bcbQHD6/5JKm5lT8n8pXp=BWXFWdl?!JVS5pR$tLaZEP+KPpEERJ4NYl?5uPZ+j$BRJ>dFM5Nm\K
&AHkn9 &+iS%19ec/t+<idm^R6+Q*BCDJ6HYVFQZ?eH\1e>b@$?*+V4>>11<%LnjG^M%m!awcQ#la@6Q%1/5\#Y
?RHa\c :eDPK*Ccljed&y98=/WhDRH+=uB%?PJ8:^uJt54HXhW%*dX$HXyNyyaDCDJ%uB1/Y41tPn@*@BI=EEEy
*Z=ZYp LjtBl^:YX%P%XB&*yy18ET9L96tSTYhJF1huk9wypd8p*yFdW@F8diFL8ceXD%JCA:SHcR+cSGpcDPV>
S%NS5+ HXkaq*MH*Mhh+n+1H=BtWMTMBjDXc:^H:<QHV?^t:Sj+jQVSCd@//uYK?S/B1jT8uTat^5a:h6DdJdh6
4tCV84 *dyq!&cb#X8&dNykeca<F?iPd@WTJe#I#C$WeZk!<RmXMQAw\VAp\HtHtZN\SIkuQP184y+Bpc4^ae::
!dG?RX #T*hk5LBjka+dy$K>yNY/=jBkbnGXNupaYQ9CXdM#h%tt#:Je\KFY4?LCJ4D6lAG<V=X9EPTh8E+W$/M
iRby?D w:1>?h:%C?b11Tw1a$yVTw\nPYLc%CZmEDC6yR*6%t@acLS=/\=np5DeV=4WeWwK+%A9d@nD&F9C4C^F
F9d5N= pS+JAy$*LVcayV%#!cb6/=jPtDl8*AV6PR8Z#PXQRk+ZG<!j8<d4TE^5dF#e<bQN@+NDuPRZ/@4%W@#:
j4I+wj %<?j86:49P6Q5LA**=E>M&RX:jEn:Ja&?I:64C^&t&#d6GEhcKDBwkZ#=%J#>PdPZ&m\hPXc>J?t=99B
dXnSH* j91FSMZn!4uMY*e1/nDHRqwd<X/\l/%awKm11MC%KlQ?EECen^j%M:=??:HnK\b/9<kK\5j5E1L*jP=a
c>EXl> iQ@FXJRJlDSaV<ImT^8nmm4alSWFiX#M&hj<?IdHGjYBL#6>$8S@lk/SqiAkj?IK1pPu69K@kJ&Xy/TF
6lYV@q WkJy%D/lqJm$QIS+A&RRQF9*\JknCF+li<MtlShJ%qYYFYbhwyQX#1Zk@1*VTau^Ej/aW%t#iKd8h@+>
QqWaS9 @wCb1<$<+m@hcY+wTp5IhnI*Yn1d4Bbt6IW/k@VtGBkcY!J+q:NLKy9dG<y#L!RAiG9u/DB<ebeQnFSH
^L9PLB ?pM\tnX$LchGAFlSIH+K6VmaWq%dqHjDTuNA6/c5^uC:5911B#W%%XTNhDYeZnXXYSuIuXVJ=X5wi8II
ZE<Xq^ m@C%PN=t*@&eiVd>*$h*!4LPdSp>/1@ltyw<Ve95E*h\#1eTiK5B+JyE:lLNJW9eS\lGXMt%^jA+QCL%
PF@4j@ BNT<X@S4<T8kAbRbd+@bd6Nh\N%PSG<H&NF6AN@Y#j9QqmF!yYh?EPT\e#k9E=HDc=QwBN/Sw+uHV=+/
+&LI+M a8i>!<VcN##eF!jY^h&<k?N$wn&5#e$h@MF/lkY::b/9yaIpAXT1K1LTAW>Fa/GN4dY#q=i4m:8V/hIS
qS!RR+ !N^*Iu\14QjW@M8EJe:NqZIS^&98BR=Ci<bP^Z4Z#5%4^5PjyIVPW&9K#PG4%/^dd&T$cjQYdeatytb:
4KRG\m MM\nPSZ&?t>Qd+GQK4q!Bt@a5GV%D5TRh9q41<H!BZ1#ql1B1=$%bj#+mhy#F!>j1Dh%+5RyM\!YLX/\
-AAIC* 000421ce038001202b3 Page 134 of binaries1.zip
YYj9bH #85IFV5k:plA#Z>I\+=IIX:P*jqDElV9\:6*k9jMP=&*w6SKR$$XCjZ!&H1hKNTLCA*$\*Vt9n&:6t@i
qR\ERS 5Hd%<1YakJ$#m=1yN*9P9AWG!%c6&:lq^/+>qnbP:4:BpjFHV?GEHw=QQtc#K=<@9Hu^:&MIJbG*!w1K
6X$i1R ?@ib?$#FtD:Y/l5cSh*Dd#>$jQ9^1/ju%@jQ8ESc6QL4A%>t!mBmPyTX!iyP5mthWlbu1\TTc1w15q!\
$G:tX> ubI!!8BKqIYm#A6H:S%QVFZ6u%h<!itVJw$j4WbnRX^MuC8nMywkN$aSpi5FySQ$I/etP&uX69<mX>?M
LQLRVK W6hajc<pL!PX:PVF@X#Hn^&KD9LEqM1!PZ4cTJ#GnPWtLqEyla*NyXhQSHyaGc>hmM6Q!Fm=WGewhwa9
6TYnH& AiyeAtKVL8YXX4i$%bhqy^+Peh/>d1+P4wQ!?eBI9M%8jFDhDhmB+NW!NRKW9G4/kZS%WWd?1aWa<WpN
CAVB5P XJy<8j%?BX*FQGC1bcw1K/81cpw!Ri>p5:JL4^TV!^@E*4==Vd>pZqDQPe<E@\1iVte*1DWYZ@Nd5ZnC
>XC*jL aQYNwSjKK1w\pATXI#*IwkVLK*KbPF:L>aZ?!5M@/^&bytWDQ8TPiTN=*hy1*>/>6IZWZ9M>btc:h>Pt
yIYlqR Wkkk<EedT?:acuYtFNE489KYwIj*D9Ynh=SP$GVSP&!:j<hi6=CIRIDE%eZX$!<1V5uQ#tKQqZhwiGla
Y6en4i tM@?%cNwXZGe=RP*k^5qMRt61nBp6/8Fud8Zt+P4m?YG1T1$/4h?^/pA*Jt^&Lt+PNFp6yhn%&545FEt
d1mc?L HX^tt%jyDNYWq^BZG!8*eN*GVX8*:VDicYyGt/6mLAhwweDl:e4iQ4=?qL<18R9VlR\*p#nQEdpd/dyn
9A9KSD /Y1DtdPZdh/%je&<cSQHV>Kb6&TX\W#?=EqV>Bc9YL4I$DNBGK5YH%LY#>&ZQ:n:%jqh<69uV?@j9lY?
6Wd*91 a>:19uqNY5XJnwXMX&d@46VF^$cGBj6:8#t^VuQn&qZL5d\+b=d?DFyQb+d?#Du#FyL/^#cV*iA**Z!C
b@$Chn Ik+eTW1=uEHtLS<?J@PYiKZNe+\tG\C>B%X$JXM=:nh&Ve&@8j8KkX:uN<Jhc@$DHFt@>wE9PX/bS&+q
cy5A^d /BWJuA4=pe6!^?MyTaLRmYP8lRbHK8!V89eA*wC^V@kK$/hMGM=VqyEWq%adQ:$hwJMcw!k6LTM6njqM
iqWJQ! TpbMYp11B<I<MYp=bE>ia!XlL^4aa??K4&?t!D\#16&X=MVE+>RJyeSnS\:Hlwy!LQw/*\A>Nh*FY?%C
QN?Y?B puJ4&8=uJ5eHPP#b6H#iDF1Hw>$L:FE/nP/\Gjy#=m>hV?k:tbaDkX=4#b&5qEQB#tcG<*Z+mJ@=S$d!
dnyjFR aRqIZHXZDdBZS<H@y\l@\kiT6:J9:qMG#bNVH^qYXWHeikXh!c&+V%iIFYZi@JRyt%%?wcTD*DDBjj&T
GVEIGR B4Gn@?W<@jFpCILZ&6^aY\p&JmHR%*dnpVK<6aVFnt=Zj9Sj:4:&jqQ/Iy4w?Je%q@S4Ge#BbPEhT$JL
4E:I%D TZcLIG%G:^bH+cN*Ty455D=NpC8?*pcR!<1=>Z<kF?=6b:LLITA<#MeXwmluh^C:eCpuT#ML%?B\PqRF
#FWAB8 @PW$dQAjwK:Gml%GGTw<=aGGDycYn8=8Vp/8hmaL6GnX4!41ji=T<=@hQq+iHmR9at>Q&#G&6E&u6R1+
FCj?*P Rq^Y5&PV+cwX?6PtVhCTu4%l!*cVZRmd?6/?VGa@dZ:?ARFWwD=:?T^i8mt!p!/ahHHd8e^\^b\=!#d9
nepp=N NnFeyD%=+mTh?W9ZLy?4P*ZTXL%FK=eb4QhImKFmXR?F=@\Z8F>hRuI:#w>9+1l#>B9/LjPGj5%u4*89
qyt!&K 4/t<>$eJ+R#bZ$P&LZ1+&KP6*Gyp8G1=\eL=mJ88WEhQF^?kScl$aC#*Ynt+ikhmY9MeQKhF=R<c&AaX
tR6KJS ZMQ&GyWP4>!yJa6cPA@w/nE%:QWd=KD6\?%HF?KGSlS^\?tQ/&pjkVeNBI=TF9TuX+nPwc?WkM>FFtTP
XIF*j^ K!bLpZEACVRpKHRm*q1A44>GDJH@l=AtMXbJYpcG^11B6FCGpid<q:VXTF1AmLVTm81GXy4ew$Np:9!J
ATGk@> lAVlWWY<Hnwm\MQPjIjlp6t/Z>FX/5#dcPq@NAPuN!<iDjP\MnFeMpiQ%8pF!wcD\5*Ct8^/6Ja^J>K!
9Jt95: !?4dY16Ldy+>GPSp6u/BLw&aYZ=p=Iyccl/\G#/1lcB%\l11Xl^H#/kH$nXFN@IP#XaeCQbTXihCe&ub
@j6MaF *Z6*:%H*yi=lZJb>+%PtZFbye5XH>nbI5ijQ@lW<aS+#n\RQBa?tEhLIMkG5p=dj9Z\d1\e+pea&M&NC
&%=bMG p>lK9AtZZGlF@=DFC!dbLT#$e!tI<%/@ijPYjmj^Q6jJ*pbkJdWjH8Y>i<*y9YKkhjS8GbA:$=*:DlZq
1q=Qt9 W*umBeX=\wNaW5C6md>=T$k+AkHh<bN8jtatqn=lERFpe+8Ll*>WqKic>S+#Y:<\WLkk>>$LB5Qu11+?
EcdCPY kPKJKT5Bd8k6Fj@c=Ym&*<Zh&e:J!YLhSI4*4e>aAt%nLNk%MI+Ph4cWDYQNYDH:i!!y@dKE6>$wE9R1
QDiIFq <hX4DbhIGMJnC4SyIt&m<M&yD:iAkKDkaDypXnD8F5V^jWheWWX+e*N#h@e\ZYG$b9:eFX9MVI&Y/p&b
DXb*%8 Mqq*\R4D%R6tVJ8C^K%e85a?QmcGnqW>ePlE?*?S//b/JQE1<?@j^HF55Q5%@>ZL*=pWWS<ai&jCWhE6
RLyDTW D%/8DncY/C9Z4%=t5HDiuJp#SLNB$@Za1ad%t:j9M4i$e@EKCMP>$GuZ5pY4duBG:j9un&>jpet*b8\4
bm@ZRA yG8atuEmR!q!NZ&$@jyNG*dhFtSuZE+F*Ed%!^6&M9>Z*5D#K$tA9PG>#4liAJ56XZmWGuiA/kjkVZ%C
@%CIPJ Qb<:aYwdwnbPtcDGkKkJbRVTDMGPK!$uWFSVpF?!ha?NG$6cdmG8Q+JnZ/Fj$+:EH#^EH%a/FH<kNm4E
:T8MDD G%MuK?j4c!N4G6yp^<*q$8cG&?tua9$h#TG+t/Pu&/W#A4*p@EXLX/+#M4F$>w<=jmH4Vq%:e>Z6nPV+
DcGR\> RCi#DR9%KES6@ThG5mc*wc41RZi%wIc8^qBPki^pi%CSu*QDRp/hCFyChVFYPe9K/d6T=Xl@!RM>p<<1
/aAtFX PZNZhQj\M+tuV^+@ipR>yN1b6q@6p+E!hyn/D696W%QQHt%51&W@bNn6#w:G<>mLydF4klD&F4PbE1$l
Hj&XTi Vw/&Rl5^c/9>qCY>V^J$#Z!QPRiuE*iLBiZeA5J!c/:<R5IW5@MK@!CMQ1KJlQt:&l1d8abk\5RXkm^Z
EKtLc< 4>Bwj%6J<>*:QFHRiN::%+/FI%NnwQwAEDTi5nKLtI4tFpi#Qda8L9d&VndGC#Sy*qeXDXF@<<C^i##I
EB8?eJ jabk?t!5>8<ZYDL:KA9BQ5bTbS?<PnL#8YaX%ke&dl/?*YT*8dtIL?9jkQukHhS+Q^AXylacEl^IEHMt
c&6RXI jGEN\b*!GGt@b9QGSjNYd6649kZ$eewW9aW4%1<#tKp>hb4iw6X4qm@jE^WunPEq^VY^iJG:/*@&+aZN
!IKkni ZyI+&Q:1FjYcicXLLpkutSLeVM*P+GC=kN*HnS6Q+VDbV!#pt8WGC?dN%5i>I6yC9l/&X&Cn&myDw&$t
<SaXF> byc&#l:?tLJM^lXFjhHd4?/jZ%DWuyGLFZE9dX*hlDyY#yyFu#p:jwNndF$@?^pV4bk><+uQHc6K@cFw
%Ry1@a HInk?lSNFSY6p<8S/%Yt!Y$Mc8<JYcpaup*SSNpTp=IGywSE\wAyYRYBIp>!*laSWyh\W$JqZVMTSecu
?J@@n% <#I8uD\aG$ehWI!Lma+I>ZP%&dN64eFM*T@<8@!BwkC6wdp<M@XItIjN:5&4F<*S^:EQSuiEcIwKJ*iB
565X=c 1inE<#hLc61cKkwJW*5&LywlSKa&AFP*/15Bwc=18pba#aB&mbm/q*M#L*cmeyitqN4e6M1CIt!IK=Wy
%tC/bI K\W^Km*LkkBN+Ydl:eVuYE4DmE4<$eQ&h11Nd8%6wX8y6pt6Le&mq4%TZPXR#dbR>4W9k^EpFlFd@*CB
pGiCtQ YE?uE4u4n:V:IXJAFQ%B@PNJN#jMNHB5cY5c%IEDaDEY6IZpZuP#kG!CXQXqF1te@KKm9J6Z@+8W5?h8
!YR4#j E?8AmAk@b/VA!e$9M6VJR59WDQMlwYH?nq6^Ca/c8wa/q8AAKY#ZW%aic&1>$>#i&eHc*5F<@SR%twmY
bWaVN% GmFKR$QQmdlDY:Kyk:Kk>*cdW*5bC^ZpCS=Kw@X4TA=p/+/l8<kIKKGJFN%auH#>EcjReD1CmYRmqMND
wtA\E* ATpj*KCBewW+$b+n9TCaY:J\%db>q66Z#ibQt/c:aNZGDe9u/9Gu#Xm<h8&1qd8na1paZ9TJtMd@ENXF
E+%1EL +iWqyLNLHQV1XT?E#H!<%BZmyh11?:<9VGSV@:FS+eGph>J/u=uJNmQDqRaL=5:GXXjc*j#yP41p+ZwN
WydYHq ?MQh?&!eQQ^Cwk?!@bN5PQd8C>q/Dh!!Fb#typc/kYpaJ%I1pp#G1+Djp+bqe8?m/B16$5Je9IHn=Ci?
<YT+=8 ^EmX@&WPmX4StARB<!D?C+I^CWWXkVK=upGXW8Pwj5TXBIPuy@I@</Z?pyPSpbYSwcR=M4R51qR9@DNZ
J6lna= BytTt6*HFI:nqXjX6\BV4e%%XiYF&iuJS&Mmw/lw^ckI5MmiD96MNm/jP$MdthLWZdVXNmRyy:16M9>K
ecY6Tm Wq!A!@=hS15N=5@GIHZpDQ*b<^aa4FnDc4mVZ>T^%I!mB/*N>\89uapQhN=nbKA9RKn&hnA!>$y4K/5\
5/5hVA NBW<aIA1?IIjRhB4Fhp6wnXFGduZLYXB5lRH@HY\Ini@wKmw5BC:9t>LFJeWa<JjITj@YQYLF:mcDcI8
nWTakl 5jdYFtE#$!Vh&NBA#m8/tY/bTmkn%W<R8w4K/44?pS\&\!GC:P5*$dZp9+ShC8\>cSlFAGa$aEb>bD/J
Xm%48F JZy+>D1Kk^PDtIjAbpqbTqmaB&Y^\uY=t%CYi?5&jH#@ye#V$>4E#C$5M6nV^hZb\eHFM!VTc@>8?X&Y
lAHQC$ *1HlacHBH8cLl>M<PjYBGkN\dEAFKYQk@\@e=tBm56ji$Yc@9dYJ\XBKqHNp%Q+C#Ccd+=JSG:LXGuYW
a\kuyG JGbMVZj6*Gq18665n<BeiR@R6u&L$j1%yB*K&JR^H!1c9:EqZTW8I6mCeG>:SFS$NBYnHBWbHlwC8Ht/
%nY4>R I&wikB4q>di*#?ahP%e5Z4QD$6yp:Z!hcZ!>lY5&dX+%j+c&>w^Fc\*Z4N+hES6DSc8enGu?L&$$D4*>
c1N*B% \uZpHSK+tPY=<AZ>jB48/GWVIH@$tQ!?nMZVFSMk8*cARX!/eP+5#Kn>+p@V%6GdNY@^56Z46^mdYqk:
H8*ZZC 898GSJJP!w#?@cI@846?jCF4L=?T*BjX#DTQI/EAi/I??&MG=#h4bWZ5DRNHP@me$eJ?%NAaCySF!R&c
Y#wVX# ^=XD$bIZKw5yKT8VSd+m$5SWNTiuIGkn=GXpbapqqKFpPZ?C>yj$#C&+?n4//Np4bDXYA<Djlm5#WL8T
ARmN4C DpJwRIW4lIaEBjm+YP@i5u1S95=u=A^*j9kqZL@dXq>!M@XwlA>AcLSt&iIFe?p=I#EHm>*tYQt*hjcN
!tH8*H QJy!9dC!ydZm%6ZVkJp=aKbNPDQ>#EkJ5t84AdV8B%R%BaRJc8RjXFXYQmnQ!e1QG5H4$ySYZHm8PD5u
lm*Kp1 N=??SSW!BiKFSTlhmqqq^<8i@A8!>RnjVLHt^n1/l11YS#LbQGJDE>W<ywtptT48*!Y85FqW\Td1>Rw$
Rl=!tL T6Vhl^eLeH>%$h%$n$y*X%e@Zi@jj@n+WjCJ:lBL<9KluBpZCYeuS$\4TN9n4p<dK!9KT5J!d?DNY<I<
-AHM1@ 0000236e9d5001202b3 Page 135 of binaries1.zip
uy*<V/ 5V9u&pn5qXhRnIC^DSJHn^+=i9VaWV5Z$%&&ASHlQtT^wcPdZ*mk@b/hYu6eAwG9WB?dnSQWicwDBk=W
mF\ehC ^/XV1mV&A5DpJyn8&:bn4:*>jm5:m$$#%Fpb$&TN+YkV9FiILM+^*\Mkdh?&nh+/jM9tVbm/^#\mRGc?
5ARW@M b@e8p^&p*Sj<+jchb8b<6wBN16SPLm=8I5L\48HI/Jla9FR%Lm+tJnImqF%JmG%uZkJ9&8i9dd6&4#ba
i<iVet c&^qb:y?wT/jD#K&hi9clVN%hYe5Y4h?*b4haWAaL!4iJ?9J9&\H<BeTkBHEPqHRQwtBwQW<u@:5*/h5
\nYmn$ \wNhDj<jh+mJjT>*$G$LmB&N%m=jQG@YDLK8i=w&16tTXaa+ytjXq%5<S=J!FZYmyRi5t4$Ajl@BE$!*
i4<nI\ Vtl6/+<BMKWq\k6W:^Qmldh*+cLt/=hTV!ei?5\Zt#+CR1:@?pJS/IY?WFH5F%eK6A^:!Tpqeh!/V=G+
H?STKc T&Qm8j?VME1GI$9Dn+R!Fdtl!=C!tGQu$nQB#Na$kb1%NNbYqlhtwbwFB%HBCpGBAYCP:jd8YL>$nq+H
tmMb!5 9=\@Y*@Xdw?+m<XNLjj#4y!PD@G$6>m=bj*1=W5NDJa5Y:tG#FL6*Y@4=P+dpZD&/1*:#Y*XlituDkT/
CSt>ZE tG>iPlN#nZ#^naDa9dL/CpCMjpDBF%M6^K<cyw18qK/?jTM**W^laLit9IcKe*:tVZaSQ=*Q=DH=akZb
mTTGFX N#>uK6$59Jua?Pm^KG>aJ%GN>euie1bMq>*\ST+AB$ZDcq^q^j&?YS6S&a!$m4#@IPJMhEMPy=j1WTBH
k1EPpC L#+aYMZ8/yD<uP#n=?yK8Wqkh5KJaqhl&qK&E6d:A#PR5N9uG%uCCwG\G@<l#MQLcwi=S&lpEAbL>9dP
tJDnmZ umGl#la:h\&&<k$B\Rl\&VX*pAy9\EDNki11bMwWy\HAKC165nHia4#Q%64C$5y$>Xm%L$VA5GFLR&9t
MlWu\$ Zp54pnjek/dRpFyHa:9$/5F4DVeadh//HRp#*Yt<a#5bYDHCeyQ=*1GmalqyD*H*<AT+Aqu%A4dm++WH
4aCI*R qiIQ+A$@weF+ucTZ6*i*D?Q:%@dh?\!ZGP/$eVVj8HmGn4c?\j46&>e9uV6Dh?cmhWcG/*cH^6DSVNVk
yMV4Se PN@4I9u/#Ca*!LZwbNVtk\T8Fj8Zi5d<P@ZyE$\@5Q4%b#/S6a9?:KnNuq*dN^t8ZLJkN8D%nV>Xb<d5
/4dM^/ ?Ra4%lq6&&Y?*>:FP#AmqtR&IP1/X>%*w<Q*L?SmAiJqH6L6VQ5+IP8*T@uh<<?!BW>&<c*5nM6+A&Qe
?AYw5* b#:uH^R9aZ?^nIkZQWCK6QDIaBKSI>QhS>XHu4m1&4ByBK8@FIlDbLFmbDmAFi5WCXanFNRZAFcBMapy
QN$/SK /XpFySX%#WA?d5Bq+/=\Q#@KZ<HQF$+!S<6ht%a6$NhB4GdyGYADbF=6i&*J#jQHa+M<:Qib:6m<$ZAh
Tt/Ai9 N91Rjlp4P!h*u+CIlPV$9QLG>91T1$pHkq#&dqp?T/eH1b4*lbH<j8*Bk+4K4m4lA:1K<$BR#Z%RSXhI
y&n8W< X=hqb>&K%XAq\yYaij%c^p$/W#adl:JB^HK!Qte1*:!Xe/RYLVbJDqdiE!54KjyX1ISV:*j9X#+Au841
:^nWNI ct9w/6EklCI@&J?Wj@5ip+Y@Yi4y/i$XCJlilq!qC#lSHX&jtT@m=@&DQITiEl:8dwCWC?$5:kRlD//Y
t$<>=$ qdC*D4lPcLyRh=+S$6?BKIX<IC4uSnyLqQDw\Hl4b%MV8<DIeF?<N<nY\hW9%Gj@L8M>t1=BaYElIX=Y
tD@\iw c<dA=/c8PZDkAEWXXVYi!BHKVNt#h<5t5GH:#QhbdDea<lpdEFSyNb//Bl>:y<k1WYBy>jIq9\\GL%&?
hKp=cB Cy!j$bd6^6mm5l*:W#b9&54&h\\S6ScnSLEclSmBSMWhmD>$YJAki@lR9AkpClCm@Cnj9@*<njhaGc*a
/hQ^E> aG4u5t@4$yt/PnPZGSu9*LS<@p\EcdPSwYqIVDRhySIb/=NPRCKHE4GBM6&mw?m>&J6Z#*8j$p<tQY+u
1W?6@u GR#&NmBSu#F/RLJFBD!kuhXiPBe&4F/GAd9PX#=jY^j*C1<^&t1!S=RhQI#nw4k@ChQ^d#6\j\Ey6bGL
e^=Npw nb<<j9#wEjjSa@4J/Kh>=!RbVi5mw&t9u#>yc/4FVi:\8X#E!^mn99C=W+hRRJC\Z/AE!5ATn!a4FDtK
B>8&pR Q:qeCdq8JjCAKpLXV^lqDbq&FlpcmR#JAnMeGTFlmAcY5NnFI1R^*<#GQTn&iCy&bqdX\+PJt+XJM9Bw
wwWJqJ VJCZF?W6:+X%EJ5>&\\Nb86?AwJt/5\*5kyI9FHS%u#@%6Y#S/ID*B*&t=8c:Nm&DWj&#C&6:eq$i9Vl
c6V>t1 M=h#!84dG<5!V\NA?:c8tIN:tQume:<\MqWq#je15F\54MVm5bBR^KtmK1R4d>@MT>8tDLKpMFDBQQP1
=H?1^E /L1qG<Kdayp*d*RAR1ZJF:Almw#iqyaWe9N#1T\1t</S\@%=wtW5klyl>Wle^WP$TFVV?9CJDC9??Qtd
PB@Pyd ul/lQNqLn&jy%!>ji4:TZ!T?j45eEC4\b4#EQCGp^%+MF@B?qJPpw%*k>X9=FQB#5jwm$$Q@RH=8FiH%
/eJN?p #GSdMPHH!>%8?^=QCKneZJ$hdY$e*aPCHHidtFl4?wcFl+V/P^44cc1w1GtB+XQ?p^@yya+tG#j8&Ljj
$=Ia\! *G!j&Td>kX>WB9ZqAae5*LHVhI@b#t%In<GCPdNt#1Su$dQyPdL#F+LZJu&&%QdidXJ5p/LXEB6di&#b
Zem@@F eQQ\>Gd^CWeS\pXeCWiPCSPXn8EF&keAwbAkj#>@j&GA\H>p\C+L?&&4nM\eQc^&4Jm6y#64thG8*X6Z
QN=+IE Lb!nQ*P^+bbN/$&DkS<tWnuYJ?$JP<9<?i9*u&n!bQC1a8Kb^WCIiy<\n!e>\mJ9:RQSjjTmK9IjKWBW
9+Nyk1 Ijl&%1$\AEB%99Cuc89w#%t+DLeGtXucaP1Q=C88*PldJa@**Q@/RSJMRBDaTQ4JlChQ&WuDX/@bDC@J
DE+XcS 1+8c?et!&WIMu%LIla#A#&lq=IemLXKwR1lGEn!Ri?BHVFtc!JA$*uKHZ$TMcBJEDSmhDB^^S!tkBAE&
R\NMMq kJEA9mkbp9/d11A^%<#YI?VA!R9Ze&@j4Y=CDc1F9#\9+#^i4EPKGG/a9:K^MDFcMX>j=^P@nK@PLw\9
l$@Ik% cY199bN>/ZSCbICHp/*XQ5y<tAXb:aWZEWVHJ=!/qFXTA=Vqy5aH8Xy8Y#XZ6\9=YjCXpj!bZqX>9/K4
ucRGQS WklPV1#1\RP/tuuAaVWwM#59ZFWN<NFT?e9n?pY&G#qheI*J+ICqW:qbiCPtAQe@wAjHhqL^nK6Z4qDy
jVG+dw !qi9IYhb=J4N$45XEJPNJc*G>jY5yZ9/nE*:jTAF1><WCRSCaVeqI\Tai5mn<E*5ctC+$FjTV*ThDi$8
AGuD** nt$XqI8p5$QkNSck6Iw$yw9?mXtJk66wFpRAHcPQc5bd88^GBa4\kjjN#5dP!Vjaa=@J>n%8twFlweHB
dmd4wt ula4@8cy1GywcR=WW!VZt+Iy=/uIcS4bdDHe5GP9^Y:V9V9ZVl4A:tDYbC&h^4nqc$HiN\FB8Q<D%!V&
ybYLPV /nJ/eykX\5/FhS8*$F8X6t*j5eQa&GRutiG$5lq1=!D1jMI$ilCwEN=1TmlKQHH!JJ&plBipHEp+!C:P
GK$Qp% DkkRBQaGnN!>*<X+#ic>#6+&J19t#hCd9Z!Ltju&NRb#b<+!&LB6<$dV\PlwPuJISI^91tm:DS^J4KQ4
w%^IG8 E/I*+qlHEn=tHp%/&I=LR6l5it:jmBq:9\td@4QhD%1$beQ1yR9t/IHBtcI#a</CybmK&G%l+?nlG^IX
yVCnlj j#Ry=hJ%VKLZND>?<j+4tX#=Rpl/?iL=e@wb=^u>jA!ylbAtN#dqS>ad+Hn%k*6+tjd%!/qunmeemA#G
yiSjGA =6\l!unDN@XHMwJSaXj=mmq\^dAtLNPqmE4$DuXw/DVpS&!WI9F8E6IwS:ReS%d+G/ISCkNt::H#CIqQ
$u+5M5 T55k4Xykn?wj*C<qJctaIHhHPH#qHHF=q?uYNa6u/Z+ElQStLDX&mpm?Xh*YZFF++&LT+ckkH#la:LBi
WyLTI\ :?TK8@HC<Vc*$&tb^R>cY^<WZDwT+tc=a<%<9X?IpPFZS1dyin*y51\WXnCXXBXX1RaeXbFLk8:j4/ww
8HS!?P !M#JeyMj&KYyLLjp&MX#Kie9ZLmalu*>q?p4*I\5EKLdy+/B+JTWFw5P8RZuW</T?>HQ\?<p!/>#<5uK
\%5V1C ?KwHdB5u&%MIjk+D$6>FKSap\lFFCYmKplITqH=&j?@>JuEnJN4ju\1R<Qj#<jct9BlQCT>Q5HaaK#pE
pTKPTp Z5$HN%h$?i=q=mjhmjFSIeCW^eJ$A8PnI*:Y6n9MQePmR6%eui^6dP^hA\L5ht$#69ZSDA$LD9G%*/16
w4c^4w \XMbMBlkWqjwl$qXc6w?<+%4DHia:>t=$&#dmqH\5&\*Qa<$FR/eBM1#jBZG/Q1/6A=Zt!@WF8kMJ96G
LCcB*k Thqm<>c6&*ea:>^q8y6hLGBnQ>HB?a<MPp9TIRJTW6LyM&jai!dlJTNMpYF$MBMCZ$G#AK4A\CB#c*hV
P>:T@: \/$Yd4:&yt9t#>Tj8*Kd8aYJ+hL=5&addNm?BbGKmw!MmIn&Qj9p&e9ZYAKGIAt<Hd6IH1Zy6hmLj^@*
D$PRMm QtVcJ?CC!%4eI%4+8:H\/GF&F:cut=P>>V+mVjC>+Xp>SWh9%kKDqdkVem@&NRXHHMChP%iJ6Y65j@/&
ybSIhh +#5&^Z>n4!S/@iwq@YICV8KTKkm&nGLdQBuN^A6dt@H1AL#6J9$C&44w$IC9jP++NX^d^XGmACt/Z=#a
uS%B6c nDuFE%QpmPEEtaTekpJQQ%Ye$YhRqQ+twmTPVFGAFCWnIEnJE/Stth6:lS$/jTu#XtpqGD6!&*e^6qQk
Q+GPyY SjM&64ThQPcRLQd5&ID=e&SKX&jBJ89A^J9qVi*%=juZ#!eq^IVlkuB*DGj>eTM+EyYTh1PRVGJiQ^ul
BuL/kV dtY<d5GMVyJ5?MdIjL6WYZZ9QpBF*/e11E11kkNkKWEwW*H9Z5ZhY/BM^&bBhKR\WHHV8VQ\1b>FYKmL
FAbjwC EttZ$1=DhKTTp^6&@By8JM&/RS15V<$>eR#:F$/eVD1huH\PL@9P#MuHBhtpKS=:^pkdC%tI@n8n%$ut
\&m6*L =H8BJ=ym/B/GwYqKE8>^:iwW@AVZ>y*?J9H>WWS$1CBIGti!jH%<jCpjeY<AT>dDHj:uHJSPbK4\TtpD
C>J<II <+HC*hBhDEQ%Wt?b>>R4wK!aZFq$5a?!&H&8yn65A!KnjN%\^/C6w$?km>u&4Yd8kXQCRwKD*M!ZnqJS
N=&iCI H1CyyVX+#F>>pwZbhNub65d4X1:h6u9*DlQV#a8HKTpBb8y>?/$GDy15C@w$h^bbmj$D%^9y5Im6YL6^
hw!k#y $=b6P$^&:h=Dt$9l<q^dB<jB@$uy5Z\hJZkqu#%HyTnk9iLaKy1AX\<JR8pRJykKY8T^\>h%#+ah?#*<
L=q@:< uHc9uV>#=6^X&!*&t&=a9uD&dIPNP:b6Mk&Imw4A=jP?y=+<j@tGJCB?h4J1lW9teTM#>>tVu9bJdc$6
huN8Sb #bl/\C8JSZ9N!SWujbp>IA8qcn%I%Y\>:W@<!Sk%Gc^a6*Hd#n&Y>lA%SeTTJV9aAqVJ*l>Ei6&B4jh9
Y&?A$N *:^?Sd%pZnK9tNjM&%Em59CZ9@i6cK\wK:/FeT\a95P^EWE?*@nTW\jnbJC!pyDp>mkmXB\iBWIqwV=E
/SVEbK qR6eeVpT6AIaQ9nmK5H9i5@nDy^+l9?FL#=bR\aCJX1GpSZKWVK><E?E1?EK19y:HZ\\PbCFt?%R1cwk
AnEBWn WpPqmk=$6:Gp>nPYMlaR/&=c9Ymt#kipTu9&YuP9?E8FwEQXh@K8AXaHw5KC<YRLluM\Fyk/hi:Cqa^d
-AS\uY 000a63ec45a001202b3 Page 136 of binaries1.zip
G!+4M: >^4dG<1!p8N<4HecL6dZJqS6@5bIhF^59*iQ95?yEN#9B1tCiIt>kLY1NC5#N@jRlEHhtpycmtQe#8CN
>!GQnm Q*l#?4pWPqZm@IZW1%qjMuqbBYj<pqN\8Z\c#qyBGD54JyKE$?V=PIt*T+68tGPH!96ceJ?S8#p?@bG<
d=u$KI R/TR1J>AFENJpJ8SBb&+Ny*/L9E$FpJ!KpRmPCk\\J@!a@#S@+FpCd$pZIM95#lh9h*A9KJ/AECK/cF?
LPFHc@ Wy?bq>S:klNanC5Z\hwRuKLNuZj5>kmLCuMH#dK&5uQ%>>%99GY:qY@I%LCkaB@d#hQXqbXX6Rby@d&Y
@4W49@ 4/RAPKpTuGT%Nql9ZdX5>hbhP:ebt&!aP$SSWXpbh\&IAW@$AEbD:G??N1$nnnS>b4jG/5>h6H#NB4IG
HkVi\V \+\&q!G8D$*jaHjQQ^MQ<dnN:8TyM:ln@D!=FJlJqV&ZjAbymw?NEpa\+iJlwTEkYZ?HiBpHiFq5N4H&
EilSW* DuDb5&:luFu#X=6a&=wb4X\$b+:BS8Q6Y*d:S$jT+W1lEZ:Hu:Jqu/>k@?ki8c:PH!K6im:?>FFdK>YG
cSJeiF &>DHN?NiD*IyZTdbb*4tyMn?+Sb66H>tJq5*4q&&iK/?#pj?FAmp=m=c6tdnFlP#jddPullIHV9%y@@:
&bwiZ1 @B&:n:=@@aS6c&@i$K?=4>>Rd@>lmjwM*1?4<*9H^>jQH:W$%GD<Sm/VTn=^JD+1NMALtJ15VyBT\wRi
h9SiyJ A%<CpXIBW$MZn8TKhZPqPX\biZpFBWYBAnBF1Z#C>*@WcaBKi9JAWCw=<H<!HFtBHMut!VF>cI%RWNQd
DLlAjJ l*ZbqG8=^jh4Y>4dt/99k@qE^R4#edR\N/j*!8H!X8P6lp9u#ND?\C@qD=m^#Nk=Mnt44L/>8dIp=?4=
ilGp\B $<eV+8Pw/MHpI!P*k%#Q#C?6dY&<t*5lIenBhPPTtVw@Ec\%*^t=Z*j!c<99kYDh8>h:u\HSamwEqa1I
kPq5?C XpXbZqbt$e&!qX1$JphLwKt8PDe1EbRIu\J+DQC?lyVp!>tAX$=?WDC=W!E=Cbidl+eE/Q9=pN!9/QdP
XP*T+d $!q+Q!=inqXFduWk>jWuV<u69B<:@lNIAX\e?k5nBSbR&N9VSj$ThuJ?Cu>wQD<aG+*FwuC<HV+wEAAL
tBH@<! R5lwQ++Q=T9lEZ!Jyi6/RRQ#klI!QjDjk?RJj%Ej1Y:tGjYSGXhWWkTQD#8#hP#wpZkZ1:*GXuC!?+Fi
=nYe&Y &i!*h9D$h#dh55ZW^V>$apl\wK8b\RlqJXY6\aMG/ia8X%JRB5JWkDCi:NmhFpa4q1#c6GQH=t*dDQWH
RS$bR% $Wwe=X@EGE1#E%/DJ4@mD<LLIGhDFLJl$#b!d\M&WwAFBAjwMhHLl<YKJCVknV5P<kTitX!5jSuM>cY$
H1VR<T m?hV#=:By4#+GCwK&!!++YHCpEZiP+Q>>t@ddi<j:Lb*@cI=5^eat6p/YG^bdVB*:lKnueddh98mV5Gd
mPF1u8 =H8W:dMnHyDw%HiSVn*nQtu9dcGd^#e%%GJnblH1%GW+h6ABH5CP&#+H8G9Hb5NXT^dM$wYudDKEXA8Z
Ib*ARb 461\bRj&W4n:BWehPHwT:^LKLTwDuZ4?>6QZu>%k%?H9?AlR9cQje4E!Q@4DS*b&+j9Q4q<@<B1<J?Vi
wNbFLn qBJ!Ve:F5$tJl%Ct*L@#JciN+kFW6BL%9*SKWuZmGX&ECk&k9H!QApiS1/nEM1W=tVA%SXQ&D/a+SLJw
dIy+1i wI1T+en*Kk:q/X1/BMReQ=?Sj\hhaG6>Jhc>WK$C*G^&C$^qeP@Y^yWL>HZiA$><uRXGXwHHLlhWNLe*
G&H#6T X6#P8Za^Bi55S+/AWMAH^WyFaYq%T*NF\bZEeDh#w?Y#hZ<Rwj4PTH^Id!?@&\XTJaWMkR<WXm4BQ>&>
B^@bdX Y%Gcp=tdu>y>cSDmJNVW$FBhhRn*yl$?i9VaedAwJ$?iPy&Wln#qZ:aGA^MSjTAiq&DmJRi#HP#5<TIu
cPAt*T H*Iu#cHEM/q\uPZjFm%&I#Z$J?\t\E?j@^NNWSSNj&IpkRbBd+?\m@qFh\y@T4\/emA8pw/Rmw\I^*!&
m^u@^> AKIMMXR5$C89pDSCW5GN9HdR6G?CVpwwSKpVCkBI?GP/BC@lb@G/A!AK8>w9a#ePElXy/ddD%CW$K6#D
4RBp$9 ^huic4?N5:jZ@l&d68:*Ck=qkmb:Y&?ew1c5wnb+<KC@hu>QWj=NqMK$QYcGT^a6*dB%m>GY#Y8$B!w1
d<5Wph KkFSemIQ1DFRa<RLhn9Dk1X4&BX8dM?/LZqQ9Aj=B9VuJTCcPyGEq&hm!me>@Ty%VjE1dqP?tH1PHXWW
EeALMm ^plCwAVjN^Z/6=>yiID%DnQHwFDQjS5Y#=&#eMMii&jLdY8Z#J?*hJPJ!ddhQqESaZVw+DC@R@<?J/5L
*EACKa Yh9Z%Tt/Y8n%</jeS&%+X>V+^kcIc<w^Y===@W4c?ZPuV^:65*%8Vubk?*d*T>S:@nRhPB5MXyGI!54B
p:nSqS #V5\QDdl^Ju#q/>uF>#BQ4<Zd#>??jEL@y19Z>lJ>Zj9tHjW?*>Ru#1?jQ*i%jZn!<i*L==kl\RkuE>8
a^Bw%@ cn5D^*=WTICZ!*eRGW%XwqCa+EPci95XTuLk?5bw6H*mpuJ!<yRCB:+RJ&YPTkiQ1#4<FPu$$/JqpTjM
lA!ZIb W<D9w8ZE5ARF<bXRq1QR1#mMy&*qGuRkKT$V:F<#c6T>pwKe//BSwh+Pi+%*WMa!P:b9*d^^neF59W:?
qB&Z&E #?u$>Mj<H>N:?NP^khan>p^GeXX#T?&>&:p*48Due9w$BpHk#9A?u66qqe$6%eWby&P<4da5u/9*HeG!
1wil\R @5FI>SaY%yV@j@n/C:Cw%8>>HKc:SYuEFyAeRLBd5R5XFbQ8EJW8C^EXVFTWXp1/8$MBTeHEDnDwtJt>
nA>Z#n *:Z&kHw?*>@@9V^el*MapFu:8i>%4@Y51Kwtc6m1GVYe%RA6wwc5yhi^%>aR%j!%bhtbSa@jpptW5&JK
+q91<+ m<wI1dum\u8KaeF4EYFeh?:im5uy#!T!^QN9YIHAejQ$^RqFnnk@R6@$tKtFqb&n!$q*d@@#\ViA*Kn+
yp+Fp! 64/B1y1k=p9lDHcKWkj@^FaA4/<pJ+HkGCNH!SE&\Bh#pP6VYMnXT<\kQGpAMMa=dydVa9y#?*thV!lp
bwV^c5 +T94FRu8DYA=BDBqMEaBZ<Q$*@S?=lD%@$cak^VC1GIq4Hi:ji8cw=MFKMCkT::k5t!64B%Pi:5e&d9*
PGT4aQ mI99PZ@NAL<VS%bMF^PSqJiZqhN9HZ$wJm!C&*WBaRIKt\/bdF&>a8&P9Wa:>^l6%J\1BLJ\BH\Y@<S$
Wwt%S< Dmty&i>w$6TKl&%G?%q#64FIHc\EK6BH%8>Q6kKn1akwlBi%8B:*>wmpy:E&BW>$=BNZic>eDk/?BCln
L$!I\A uy@qc^y+%9/I?au#F#!5h1%h9t!NpiYJp>aHh^18ZG/+:@Clk/cikSiIe?SbYb?48H&Bc8<hSye%!FyD
<w$Bq6 BC:4NZ6ZB$E6L%B6cY=/Yq>VYX4EP9QSD%lKeCK/5whR@5nBjV5*4%5Bd18ZStm4$*RZLX?#ej8iA$jM
PqQeMK 4Kq41W9ZdpPwpb!iZ%4>6QZF&+@jj9RNnw^kP4CZGkuB>i*:N@l*#/#iZ>Vk1@/jQb@j9iq1c/1uk44$
CQB#$^ qMR+qDuBkRHidm+DNHd6YhlySXABFw4Bec!dbW#lp^CZWEq=jytha+!hn+&DD&AEiyARJAF^:EKViJ5!
>e\+^$ C@EtyCGLPJ9AG%PR+PiAV^kVcJMZy>t=ud$YpbShW9Q5iXhue#%8Zp^A:*ZT>mm^n#Vt*:h*n>GPLS8Y
RVC5=@ +#1mH>wn&6>yu:SJt6dChRih#>=<qF9b%NHSXF%Mmij+S=nBT*/eqyGVZ%JS<:Tqw/p<M!4W#?uIqlZ/
bjJ4L& PlVcVAbI:y?QG/541+aBdtR%YeNY!/knc+Y41/y1K:LVe@JnS=mXM*D5NCE>VWba%bEKnnFG\MV\>i5*
6a6IZn 4$Xq>&YTYYTPtA&KH!6djDLHn?J$T?&>i+\QHn/GE%FPR4l:>ZbEHG=Fy%a=V*a>V1nCkWtawTV<SHIl
q>e*59 #Maba^!nI^B^Cd?+h951uLLLq+PS#=pZmEA8Tl5!#*AF?IYpFVL!PA1!M6/Rw$\/@S9<FLb^^Be^nw=\
l/?tt\ eP\:>j@GtMPpepqy+b?:Z+m:LJ$QHVq^>qKk^$pZB&6LG&h*N/9>8@bc8kie>hj\>:Dh1V=FXH!19L!e
yLlY%M *M1iwSJbaSF^TWuEtKDCi8Q>t%e5Y:ZFcPj&*d5&1EpKCa5k^ARwJ!a=XWyKZyPF5bYGP@cbHJ<aYIPS
?KZ=VZ %tpRlAE!b!tEVWSbmLApHBmGBTuMHDFeaAIkT$TM+iLbWCJpAaAMMIc&h:eKPih\*Q4$^W8i%49Z4q!^
#=!Ll! d1@NKZj:\:5*4%yycH#$!GF49+9EPaY#b<:+ZP1t<leV5lD94H:&Wu:5JYhuY#QP1G%YcY4E>SHqJaZb
#Q4qaY /WA>IH:8VPdc*W</P>latqLhn^9YRQ#B%P/u$dZXcL4/!%c9*:4LGCI8B^e*:#MZ4>/<k*9Z\J@XNZY<
J^!><J \8%*9\iGYMtTZlDnQY!>SM?eZ6d8&IG?u>?@jHn:w9$bd6TnHPnDGA^mIN#!QPp$RPQYpMNYa^TH@<ih
y5&>BW TYmY6ed^n:J#AMaIkVFBNmF&IYGR=CAQ&YW$KZTyVj$Q81lQKd<tKMDpb^hAl!ct/iAbiCM1Jc?<9kZ<
tjaJMu YYN%cX=tem#+M\<u5\M:h^G:?Zd6*LF6<+bXm@RI&uj6jund*hyVhJd969IM8y8aZ@Y5w:&S8mVIINJp
HeEL#= $1pcIt48dtNLY%NF#5Nd=$?b:X/64>8H<DwC<Q1a$qXiWWXW5%W^1<p15y16lkpj+:X5NWTXaHXJhtbB
NjSSNb jnyJ>m?q6CIl#Tp%Sj<$EeCHbheZ\cqhIc=!lkdjy=!bSG:&5S$:h\P1nl#c9=e%ba@e1E$Ntkb%+in1
l8p9Q5 iTd+^9%auN6e%>nc<ie!tDwGYAXKyVSRJ:+u1aRGjZ!ewEDGGPJwDHqA9<y*leJaWNBFIwkLyhM=<l\Q
SpKSNJ RC*kbqa^wm\:=T$=B6lpnQ$aGS>nw#QGl<dIedbS^ll>bGkEjhp+jIW?Ski<nTHi@q=%*dy=%6^y9+Xu
mktl5C +KYA$/:P6lAmujB\PYSphMnb=/!@9+cQ/>GXm1ImW?RX=PVuZPwj:q$wImI&bT4kVX^p:ydhi#a8Y:^5
/C4R8: +<:6Y:b9Z:>kC8B6qA4D?CaH+!6$5@C&cjiBw/#dLH51AKMYC<5EI6y\tm48l*/WpQR+njZk<9KbBVL=
NwAFlH PL5<HbhE^WW>8H94^w*4%$JD4mLktIG4Zb%9u*i!5Hi@e6udb5?G%T9YGh8=iVpi&dN%>c1N?+<jP?J\
!I:mN$ J9DePjD*@q/B4E/M9pG<&^4G1h\VH1&Lw:*qGd%bFY8yeTNXRR/RM!b@:6!aGKjlj81Ew/$X:y:h5*QV
u9FAqK i9Bu6C@c5*Z$F/?EMG#9kcQt65+uQj%\J9Djuc+9*wAD@jGdGPD1@@*4=\@EGhqL@mB@59@/VjRy@9:=
Kqc*be @i6HlBuib^ZpbKZBZ^l^:^cEaGh<*F\hBtlec6K+V=^!bRRFM<1XCaA4p:E8d&/e\+Ed^DpSQATIRpKR
j<Ga=b BVZSZuE&8ZBMGKyICEDe^WZBm!HIB9CCKE!RFCAtacd8=H$yLDc>EGXnb$6>SYFY/1MHN!/^16T*E69+
A+4KiB 6&:bdLkitEYZ>qY:VF9haQM^q+DR1NVCt8a&LFe5K!uI!<XFb$Wq4IH!LT%NXdqJh+M<dA>5ZKSDcFN^
<F=#bn tQMk!jE:8bYwaFS^XqbXXlKAMKKK9d1GWW9YCIAZ1/:ITe<8VHqNpN!=<&S\GdD$NEub#b=iu6/a<Vy*
ynNitl @n#CLCn++6&ekW\tRC^&/<yXc>abd6/?biN/uG!!jJuYMy\w9Z&*<TFVc<jVjli9l\QEmm1jNtP=^Y91
-An@CZ 0001301115d001202b3 Page 137 of binaries1.zip
WFmR=w ulmC5X<5J<aC&F6$acD$CD4*PFY:^l#mc4+Yei$cM=R#=P1X!$R\iapI=4y$EVDGh?H<lR9u#>:MLAKE
^pVeb& =iet9TM^>tKPMWiaR&\DR+MRqw&Ra<Rw&@n\GDpC@^=tn6CH/IQnR+!SRRn$GEMDA\^+DZ\HwI=PpmZ#
NAyC5a <9@imX&!en6+&PqM<EXQX^hHc\54l=PuLQj6&tQl=u@G%$@D\*cZ=lRSeTpFiVq=>j1?wdF$BRnYyp1I
day@SZ mwqI/G#j85N\/WKD6X8&dN1!hi&CKaJCkDwieXc&uylGT4MyWcld6GdL95M+#y:XYa#4XQ*PZkmTDtbl
6^*\1T LkJ*jTcAk<9Ahcu\QI8bJdLFSaZ=%J1P^$uW$1jd6&<C:lB&Re!L1$?=*A%$5ud&Dd*mdd9ZeQW1\\MP
Lwcmnu Hq/PS@h8Y:N1p<u^+<j5A\LQap:I#@5MFc!Bny#$eXT4G@m+=?^6#a\t5pEFd#myjtP$TW\Ec+kNinmQ
njyPFS W>Re@GPHD8:d9ZZDcuB^u:Zu/8k6y5wDnR?dYh1:89tiDdy/@e+D%t:L&th6ZY@iA=pm^Nl@@&D&5u%u
BY!$*b jmh:&H6@MH>P@>EL99WXRP=JLanHZQndE8Pm:whh9^y$*6@46I9hII%dW^aZIBEm\\C/<atpB>c$<!4i
A4^SIK KG:w8mWCpINRnb>@SIBhpEIdlttKFN^W@\@eAG4@\E%$kT8Pe5w11Y*8:Pyw4C:JVW8IDkPu=tlt9NZR
D?+yj= pNnIc:ll@b4XIB8H6j8$^4Zic@@WG6eY%%6ndPN&@tbMiqF%a$5L5EWqWebjWqyYWXFbZX9jRDRJQ1*K
d@DK9a j@#k51@V$i$4>PncXJLicbDpj9Y+w/\e$EbW55HHiBXd>ZkNi#X<!qPWqbtju#%PpNK%cwk*?Eh5%yFV
<4$L$> PL$Ip&H?AYjPEie=A<@i#BpE9E*J#n&n4/8*EF8<q!+!$F?wy/i41+ENQc9\Y9?Rtc&4>+X4+ZEyPTW%
?K^i$A VSN+\^=HX4+L1JcC&!8TnTCaJIPpe&J%E&Pa1@6G%I*4^DX8=QI4X<a9e+FdC:4I9Ml%+h#NDHBquQq=
<V@@+E CiAF/ZkDQWbRTCMGB@5bk@DbCDHMNnw+\nbEDHMMDpGR^?\j:TeHmRHtWD?<pnE\$p@$MiG@CAy#IDdB
k=qce@ $^XQy9V9*L:yb*%m9=q:aQA=uN^maYHqhN4bbNi8k\:ib?DEc4kiYV%DVHTKuKK<k54X#:<HS<6uRjkt
S6H^\b PWXeZFBt#SdD#acLhjSYGG:e5HHnGuXJRTHlMY4FKRiFPW+ycbu=FPmY46>^<LkbK>Hw+u1KhYF=/ay?
+h*MTF /A$e1Bw>wTp#5*GFV\p&tXbWX8Ipe%!Tpp$6SRa5*L$VB4kD&EH+VAT6>uWMD*K!P^q\@c19*d=N/>b5
^c6WWR P8Vp+iq+#Hn:8nXdnymbH4j#C#!D5QQ^>kib%+QTe5LZWeNK$Ni%5:e$Ml1aV=V4cuGaVZaG=w!wjGQ\
E>S*=e Sd^eBe#bRZ^\=KC^ET6$w&u%cDP%=pQ5lueV8+$QH4P$hV:qGZDle8nNi=EQE#N!T/1Acd6iI>B@@9=F
+tbac: @Cb@EAm<Hpd9nJ:9Z:><^Jq8#W@4Kw1yXa<JeXEVn5+Z?=5HcX!1W:G%iAJ$KCcJKWI+W$n&WF^?@jP+
W^M%P? KS^$WJV5QA#?eRE&RXKREGaV\ZB6HwW:>cq@eWeZ=MDEI?CPLwDStwKI<1t#wSHJiiXQ&6DFqSjk:8Id
P6PC$? RiDmD8<&ZMNa!:Nt>e1qm@Swa\C&aZmjH:XIdRthJV8PPuwF*a=LL/l5iNde*QTpu1nqwcwDu#aRneJQ
LKj5$j c<5LWmND#:mc:%t@EL/X1wH!G!K=^@KcK5w1mEyGBdPTBKT^X%ZVc\T41!w115y!M:L#p>8bJFjjBkAe
/5y!tJ W&cc8KIS%Xh?p4wp>jd%D@A@+^icP=VJ!PLI#4Z/4W9w18kbLMhNJEe6ud#PZ:9@KA$XeRi%N@n>y<<W
SuQtN& 1+JpHB6HkHWB\Jl+1R#/dyR=MuWk>*w+uJ\dN&?!%BJ8:A8=!4#MBu/NB/AYiC8>CEFYEM@+PAE!eF%D
MBV\cQ HAPDk$R@<@jwV<b9AmDFQnBEDLKB?mVBw=EDuIMDA>VZ!b>nQ=u\CtJkAPBH>DNa*>FHDBD\WwICHRGk
mCPM*: ?=8V9HZN\jP\mb*jyW9ieMT5#T^5Vy!!&LNn6>py9#M?9l+c6pdcW+ZFy!pw!C8wFZ#@PVDc5%JWYA#m
L?HbP! PZGlcW5*4q%9cKBNY:S8\>1%G%c4VRZR+RBNhwpylCV+PTq&Gdt*kLtFK#abHVY#RMk=u#l=&6*LL?Be
4%#<4> aQDXc%K*:wSHwK/EWD5hjF\ldpT64MLbCdI%%VlI9kn*+<DbjBn>+H:+9V6l8EZnClG5jCuI*9@PJShH
Y+5b!y n<BdwZ=&^q5&4N6!^NuL$@G+<jd%c:ej6#A#6je>j+b%?TH>qqX+Q5^!hD>@jJ>\hG*5#^1Iy?RV5y/5
SFl6Xu t%hhSVpjCK8m5e@pKm+9w$wR<id5!EFePt&+iyt?Dq%4RH6MT$Yd6lCV@hVIXY8HE?+?b\M9a>JpwmC?
?Jdhd5 8d*#FWTSXF5i$W6<J:@V9<:/<9un=\@9*:#5dG6/Yq6SuJ?htRwQkc1:9*wJjb&4w<$RnX6:l1kw!>p^
?84laR J?w>YNlDl<euh!wty/d>mS1FQR=81u<E4<aE\J8^AMktja@&t<cyQX8Iu!qAWN/PX\nCPI#tGIIMCwCK
RunYiG I9NQB>/MTT&5cu1PV1<+?*Fe^P&4=##B/Y%b6Z\Fe!Z*mtXLDBd1$LWH6Wa%??E>D&wNc=JcdJ1nY5IL
aB#</E N?\#h<WG@4V<$61u#EdGW:aunH1^884!+6!W/P5Z*G^M6m#S$hIc%cd1+APGTL/j1e*qFJYPAR:JC9dK
IunuKk 19F1RRBkbWX?Sqb8RW\Qk?RMW=iSJtTpyTSu:dP^64Yui6NQWWX%Z6=ikTqbI=q$kGD/5h?/DN&=kMA6
RS5$$1 Smbtny:u4$epbBbXNW:8WeZ1Dk#bKAhHhE#YhNDl+SMnuH&Jajea6@tS9AF@%$JDmY6pCAjwTma/8n8b
XS?@GQ lZSRpuHnu\B/BAW>ewl*aLC@@@j9u@AeB:@D5@^J@md:PTEm:^<iaAPIpZ%e9%ljJ4/QWT<kAICn%Njk
>h%ua9 5:@j>w95I\hI<H$RCNLyVJJWLm:K?hNqGYS%<8BS%@NZA6%hui$5WWM=Hh!=*hnGE?hh8G1c4y<N!qJ&
4&\aq@ 8wLC>E*N*:CaKHTPpAkKVmGb=i6Z4Xy9wKtl8&LN1qX4X&qICRwIWRQF8KmBN<R$LuB?M9KISIM%&\/a
/Pc5=R tpPRS>$KiHlBnHe^PPVG:aZ*YDlE^=idX<S1M/ln>dbTbVqX=YZF4E/S?FlYjWna#i8lX$GQ4:qwHZIu
E>Z=@q ?QRJ:?A:%@#5>t@h5H:dMXh9D\jVA#5N%?<$6dR\B!lCuPju/?Q6>iaL6h5INPjIINWHVk$PBnjE&jmp
EyE9ti 9y=bS>dPB>!ZAn&qJ<ZHSN:DHYeZ1j8BE$=&tLmpSmjmAt5>&te6WuPBNqXS9&**Q6a<KW?@<$FZd8B/
%==Ili #6Tew5ycuD#+/t$*%ej*?e5Z+nQdJ<dHPXnPmK8%P66cG9HR=tYuy!Y#1ky\cTE8iuJ^5B/meYpwmE+/
G5e&+M \Q<Fw5AWXj<HGbZ6#$>Kew!#5*Q#Eu!n@G\ClBAy#Cd&E$CaRtQwDCAR6bV+J+AIWb+RJ/bYmApknkp4
Al=Td& #HEDHGYY%4X$hdZYq?iu^Wji8ZdS:/V%wb*4q!=i#F#C6ZmS@pJhBqBPu?ca=mi64=yMLWth=h6M4LEc
w4pPw? Q!aqP:<WG$K\qA4CN%GWDnqyThE*L*ncH>t=Yw<BIKT/KG<Qp*^EY&wV:8PwGC<uK6k1tSXpFcNcpP4%
K+4duH L<*J!M4QL^puFT$XRHjKTE%XPYDG!4:bP#pncYPdu>i%uLHM5T!PuInN9*Zy84M^T:jj%NE#<GbWek/<
^!Y@*4 l#?461npGYyM<IC6qMVpatD=QDHKQbB%=<GhMPah*4Dd6>AJZmh8wNaEX$le=R1=HBJjPA+RjDn!taIk
9Q=ei5 TWFReIBCaG@9>?@j9lFjS#<VZ+q9=Hi!q@QuD=#=N6IQtQ#J>?9Hn<tZ5H&tj!c?5F/EkKSVWISA@#9^
Y6b@VD njk!?kpL6QB4R9D>jaDqwcESPJNMwA\X5ymXi5E=y#e<4Y$QYHkFZRq\R>?II%%5ht@deeVFN<DH^<N?
6QE=A9 kjFCcSEJKRXFBeX=6>>@@hE*Mnb$YEJajK1p1InC19ZLq/:WX%jXYL\KQqtyLW5I5kpVXQKFjawpMbYR
i4q=:k +yKYpbYDTFBGS&@Jl6%H@<DT$^8n\C5kTMPqItNbT+N#IJ+9Kc8541PtVna>I=yZQY61iFyjY%XbSw&E
F<@bEw Ak$hG^MXTSX8+Rd/!=e9&aiGZ*a@=Z@6*k%@\KZlly*tJ*$>HE$Q:6!+ec<bSLV8=+pASaTq>?tZ8D\V
:G?be! STuqIZ6^hmZqIb>^NNVX$Y8W$SpZAW+iI!nD@6S1aX$JcFIV+:&aYwhIpKbFcQ:Rwt61cP5aLF&>ae8E
^b+aP@ j*S^<@a@H+R41PPT$*NLKt5du4X&hPIRn4j988HQ8:j5YKyQ9J1F<!Zk4&%/Wq6SXplN*ptIm<G8t86+
XC=dji #$5yW/5lG49KFEKWKVI!+TG^GlJl!SRZuLd:+6*W56dPJ&8=PBn5uDmIk?Ad+&juF&AK5au<\4A\p$d1
D6G<Na nPm!/R^VduKtAKCV!W<IEpIMEKyMkPYw5K!CY<n>^N#Klw/8=$*XSXuJ$jh8BJ@%eAL98HLMkFNjV=hG
:Ge4dW cI>4nYmPck#B?^*YHIF@V>M!YLj:mJ%dRQD61IT$#J#<\8KTp8LmR1JALI<%R!n!b1C*5?uiDa8$tRDn
NIPN$9 MY%1+E*8MMp>Z9K$4KS$8B\kYe=YTc<mK\ZK!!4K\Dht=!Y*Amw#>iRRqhPW>^\?hPVaeVMLC<yDPy<+
A/<t>* +Z4T%Th*QHMWWdpHWVqVd?ucdedHRTtH^cdqX#dk<w@8!X8=wYFKqn/nMMtPN*Jew:?nI^:R:*FnTHQ4
eLGwuw FuGV>^bLt+c!lSCluFi8Q!+FRJdunZ$tGSPAFB$C=\eiD\eWj@u<?iNH=u6/N@Gi?El?=99!:h9*d#$>
d:C9V< 9aA/PwW+>8<>AMP9HQA!+n%dN:/R@Mn@?hMZjPZ**6+^eJCA^G@pF@I#!jyJ:+kQa1!9>&KFL5J#BLR4
ec%P+: AilWL91Vwdph/8S?!MVlVHCR>$quB+9n=ndPDwi&d#Y!PI%^%ppL@T*#JWRqbGaCPPiu9j9T&#e<NyTk
Cbh^dt JkI?W%^Ed6ucJRcLDhTWXZTYLq&<dJt8Itc/1c%C+DKbW>tpCGqPGXqbCy\LX&:bd&yynhnEi#+@LD1+
NCK6XY h898k?lyD!j*iW<5w&%wct=8dY6n6y8&6Vdn5P\c!yjlFeGn8NlwACe8FR/=i8XKpG*+@YBQ4@P*H%\H
MXbjE4 dG:jcLnd/yT9q=Pb!e=NY@bdYq9ciAd/?\ekNkMm81tYbHTbiAH*HV6dKJjb!FqjW+P=<ey=wJV#5WVq
4YkS=1 aXS+GADq+5SXu^%KX^NMiG@h8Hd=an&6Me$lPLRcYnR5X6/+Dbh$tF5:844=Bq!+FH1L85<6KKtwihLa
hn+aiZ *NJP#S!AQ!?:8ynQ=*Y$6:i%6dc&NDW?1c&8KC:I#WlNTwnHP1G:6/?HZwaR%e5hb+\M+&Wjp<It6j+h
XT:KJY 5DuyNJpRMS\?h#8=6Lu41d<$P\iVuaPDB^hZaCEKjQD\C\kKCRpKIWkXetl5PwT8$EKDSW8YLX@Ptqk!
hWkhBC R4qVPZTu1Hkb@\J&S<CN1JVCt8dP44b/:KpJ9^pT/P5KduVhatIlW=<Vy\eSEC?Qc@bynGt\:DC5\ca?
E\ZGY# 4MHRXNXb8uH9MZ5*@/Ad>&Lm<WIyM!M>NTWqNVp=Chku+6/%m>+8qki*46DS$NSkclKAZGw1ZQ$\!jZ4
-A!H$B 0000939bd79001202b3 Page 138 of binaries1.zip
9BdS4@ eYN^CXFGq6LL!HKiC6^&SiXTRiRKk8I6L\D1Lu4+C+DD&i<^S+cRqyw&a?8?jeaHDl=mdSWHB+9neW@u
$h:Mjk WBnP94j86?/+4yLB/m*:VJ%<LwjHb^dZ6n^@MhFK>b8/p\IEE+%W9Rw+Xica/Lj\SDlc+jjl+?/hP&Fl
&5wLPC nN9e6%DjZthi=\!=pXSC#?QM4T+e@\IAJpHWTtL##RS?ITS=@:::#h9Z4$hjEc>F*4:yj9@?+?jQZ:=?
i5//1E ?j4%?@e^RKdwX*AGZ#=>kJi>yVwTS%?Sd<l8*9ejQ%AaBeu:Vik455D::8+*d?AFa!<JiAp*Nj$HZLBk
T11a9m D@4aCR>LkCJRL91V<dq%!hLq\NFVkbjQi:k/&bkhN:h%5VHc59YA9ci@6=iHp<tK=jIm+6PtK$%ZuHYk
R1TwBZ wj6#V>@R&NAuS&pleWqJ$Yq/IAL%F1uQuc889\mPmi+MRV=?\RpI5*b1a>Jcqt$GkFnZaP&8I?dWCujA
Ck$a>u 5G<Aq1lj9*$9I9cSbFIKBiHTet1$CnaMWnM8&X+RZeijW=86edySKXbnJePJS^njDRMZC=H:ieiHEbi<
>LhW%C jT@hmdnlb:N@^/cNi&#e@CCGP4S4<:dD%lDE8J<QwED5hVd/*VjY<1WJB<5cZk!i:mq:dSYnWkW#VCX+
?BBDbb *+D^=^&1A\/L#CcTQlTG6&%c9&1y9w+YW/NHp/Gl4pXXePIX%1HnFnbP4l:ib\KDR<QCa?JV5@KK!1wA
E+ZA%L ^e>c&%4d&>4dY66cY6mdu#Gd!MbbKPh41!6Lm\6b?$*nRDTE*\&:ii*KyeA#j1\Xy<QWj6A@IGcdADE4
jNnYun =!wm1YwVeCP?/FuZ$:VNAl\Aa#b1$hM+H!lMAZaYjyZ!1KYjtI#e6HZH#6&:ht^b9\LHwI#l!k^NKV1F
u^%t&4 aDc16waRaAy!RIR/kiR>F<LmMp1j6LM<d$Lp:bCkAHiIT#i9$Ch$CV%Cl+PtDWCtc>I%&NW%l6WJhZaN
Yi=e/X >ZG\CX*n6@1a^qSNLd&XY+^NHW::aR5GlDY^D?QmaynSwqGSEGhh9*LP?+VXwb%4F+INEe9n&mSmGcI!
RdPKpy AiJ=ilY%Q18$hL!M4b\w+!!FCJYwEKd!j/Xq^htbYdt=lcMp^%5nPcd$NJYN?Nd&:N%*\PR\?tSW!#dP
deLKYm iT\kB&plpKj4\?>mh5I@NDI=6^^eMR/??Nw#pTDCAQZySN*bPDHG?T5!MYd<kin>i>k6FwbIBwh<<\dd
&BL^Ne DiIt=:WJHNjtnZ&qeI!PYHIIlVHkGGHMc449:Plk64P%M64JDyHPF%k1<Pa6#91H/Ij?he1*4+nWmYqD
8D89l@ 4%=$\19d!ZbtG>qBhk1?/AJB%6*>@5PHV=@wqDet*@N*9=%<Id!1BV:cydDT=!Y4p\L#G^QkSt\VkP*e
F??wPd DFbmKi!G6=*=AW8jT=j>+W^bHV>8+iB+hMjtHWhQiQ6+ib&&&nXZW%JEZGcY$9Vy5+NjhH@1?a&nyywM
$K1Ek# \WFLT5lyG!#T$hJSu#N#unclJ/G9P$iWu%>A:B>wE#KpLIi<uBykY&@yJtM#K+lV5EdA:<\=:D+JC+?M
C<*\aW nW?itycXY%AE94pYXQM#%1K:X/>jM>?R4?Xia8>&I@lw%uW/qk$<^HyTDG8JpDXBnw?mk*#PlN!Q8P=4
X@Q6Ey e&DZ=5*::N#>QS#ND?@i89P+4S$FdZ>@lQc=mQe>%CDmCj@<qVWiGd8P&c1JC9AE=YTyetEBpN:nS#ES
Rp$JJ4 h&?GBq>knRl!\E8WI\iN>?:c5ZZVl6ZkwLW%%NZyGkN\NAq%DR%NHj&qK>acd6&=b@>lW$5:==Q8*kGB
wDLIA5 q/?F*a>NwA4^!/61cy<<\aG6DdkSkK!B9/?K4JlFHhjCk9#5#LTWyEh^PGu@*y*d%/>hyhy1QcnKXaC+
L%Q9&c mlkl!m+mVImMkw#G/l#!H%e6I4He*nj$aYFnX$N?mCwHB<HP^pF\E?C88jl+eY+pH!hYB\DYJhWK1R%5
BAeE!d ?p9Zd6q6jQka4w/%MD6mnNNZhZZGAi>eY4KC@HkZCm1dBZk5<TEy\I<J!+95DkyQ!K%1a4u8qNm:%+LQ
W<pybk id6cH>/=FwJ<RwhVX+hGR>jNBLQR%VuW%NWIhVa%J9Zb?IT=^6TH%VnW%hRa/k\NCY*>Nh5QtN1:iwG%
>*e6Aa R1:jAlnhb6\W8ZH6/yXL=@#euc&P:Dbew5%Wb&1kCthw5!H?l$hIZuy>dZFSTWuyiAqS!qdGLCWkVCdK
hTH=Y< eeWZL:n^4Q!EB8awKb?wI!e6JcP@d6*G#X8*dh?J?!aPWbN$LC\6H#M!l:La4%DRX\DhcG^=/6!6&LTm
i/1IQb tydPq&?wC:e?F9Kb#HyTmPZA^<hGZ+dF^>In8dG#:h+>=q&ii*haY9\&%/$d6^Iy*NhunZ+qIb1t!+/N
W\F89F 5Ew4$Z5D/lGhPPQ\&dQGSkdPHu5t*AKp*>FJnReDPBMjtSTWSctBAm?:1Fi*\K9JS4cu#EblHQQd%9H<
&dDmcj PR9>qI^@V*cL9Zu>i8IuW#@//XQtE:JB6kpH8aCHjEESAJZj@A6@p1qepDM=e?Zc!XPw#1>e<n4ydGh?
GyI65c #NVK$Y:9qp%Gqt/?Zy+i#pjZLy+yKm+yQ%Ny8yJG:QP*u:=V<Q>^h^:tq8eAl&841YuMtV=DlWdV%6FX
Aie#tC q8Vn=^Q:L@yJiZa=>Ze$YS*>NV8PtF5n@N$u<%uaKJPapmGJjbWX4PZc4bkkjI&LGBkj#Knyp=*6#e>\
GAW*&N K!NXG=1cuAV+u>m8F^4m/^EjFiRjiC51<419:eFht:eehQCk+L>u8=GFw:&6:iu#@u/?CQ@#>#/\Jkcl
!S%QK? a/eGG:J&kD^:Y56XmZKRKFW8B9SuWyiw>&/HZk/pGuK^TMn5/KED?+^&dh?/cj*cqW9$cSy\j5jlXLJ4
JquY9E cI=4MNR%%DT$\et9Yk>Kji<ByACup^+?eKm9**pRq@A+A!LMp6KKTy\&ZI&aL!hL!GK!pC!aqb?Zq+8%
yW@ca: GcDSRdBEQLl*q>W^TR$D^Ny%wJ+SWP4#CFDwdBRFaIEiE^\>/&1XKT+^hd&%%>Zakwc8l4!+I?IeHP#5
$D\EIb uE^1#\+:D!@J!+**P9^m9\H@/5W$WqhYd>HKVWcH#G!hZHFe4=j:KTj4w*5Mq&AQDRM+kG?BlAA@XXcE
49CN+$ dy@^l\Zwk5kBemI:4+J<4&5Dy%>XqBq@@$d\BS#ldI#%hp\cZb5A>DQBJQ%1a&CnMR%m$pbnc1ML^wER
GS?BiT CA%l&8J%&@ej5*E?:aW>FeSF!cALF\ID#=<@h<dj&?Ppw<ZlQb6Y/Kk#1SeVFQIB>\MnJQj9lN1m\1Jl
yl:$jE RD$a5I\Bny<5aT<6JLI+e$wT?phIyhFEA%pych1K=T9Z46<A5N?B1MeBYlCKi&XpbYaPb4HjyEA99*Dq
/kF4+I %wM&HpH*+4QL$N&#6pQ$5*JlSC%mumwiG16=AMSMSJHS9MDP>^H*^H%8iE^*\8/\*THCPG<@TC6m=JG=
S+LAm% HBX=>G<W<PZ?AJ>c=Q91bYeHZn\@4Re=X<&wI14Fc@Et4QEb1*$am>*jML1u9KQGu*W?:&nDaePaMc16
ea!/kD yqiVNTJ%V=/\YmMB?T>j9YK<IX/JVFBJI&nEtyy1$KYd1?B+%eIQ^9H9djBD@$W>Cuw/uVpSpajj8Z*J
l%yiY@ $8Ek1Qp4=>%QPFpj^@yFm^$dN?>*<QV%<nl68$>@ndTI&LVbM/bQu*t<689N^&<5#L?:yTI1QqXbYWXD
aDlMeB c+G!/q^F?Xq1tl1cYk6p?ju+lQ=1iStI^?ZqFiRZAPb%q^kc+&LWE/eA<te9BF$P8Zu*Re!nyLT5QBN1
c5/N*= +?%VdFB:nypQuEWA\R!8W5JFbDkt5:X=a8SEXuw1Fm>Fa/5W\9=$cEJp<Luk<NnIc#+&B*h6*Z:E^ejj
W:tlG\ HXB96NQa!5uB\eu:DPGuCKD*DIn/VM&PyZ\?c%\Lnw^8d1!9bm5nTwqm=cICZEn!PIE1lL%<+c!9%&q5
Q?Lt1X wVE*uSD#t#h8YL61&TJhLZW/?LIlPMwMNZX%VS%1SPAtCM**H/bY9:1B4L>!+!:XjbiSp=8Qc<6^9VJ8
\L+N^t %Tc#mW\!k#M>LT&XiK!RAFwik^N5neN*R\$dCQD%e1MKEkH8t4KEKAFkH<MJF!Kewu?e9imW&d85*IPn
t5&PP= <^1/u8dFBt$VAY@QTZA^8AH1VB/CG4#JJkSau:KknKcE&%cZd<AhQ!i>IPT+GlJ/LjVK^VMiV8dGl56R
cpeGkV +#MS:@PEIJ#@m*eP?B^#dC!<!+459^YZYhd\HF%?duJ$&NZAAE<Z1<P:%m*YbeEhAAwcmKE&5GB<\X<D
V<$qu\ nT<aX&XjwMya\AAWm&91LF&@#jmIlS$GhS=iuq/ilL8+l:5:#1F^5DE:bLSq6d:GAqZtAqKNuMA<we&8
MI+ARa ViMeHRZX@T16yKB\yJkwIa4bYZ9kmVJtCY>?SqbYVt+YjblW:LbRqJKiw/P@cPt!qdkudjPY:d8\u^cR
!SQSqn :=CiqVtR^S=PkX=8+iwhl?%>RmJ^&VN%:+edaTa\Z#Ql=\H$lhGJD&Pa5X!+?!lm@AE*^P8AiQI8>:$:
ByX>VT h^NKe^uk=w9Tt:>N!H9bQ&n@$I&SItD>CX/KqyiYqNCLkKqKSjGYywcCeT5+@M+ZnJjpC*Ee\NaML95J
I+M*Kc c%em9HycCb\ZCG^KT554WVJT5AiQ#*^BhyIh\8&6AQmu>hS>c$p^Hj!HA4XF8B^VYpAuHal/%9bkF8kJ
nukM<% 8nI4kpi%:P6+jL?XV@BqQ*A1F5iPtXudHhl58P&w1+?Zl@5J5!*KBlJmW?Su#XBTt8:h%Qu/A:Zkw/@*
i!DT\4 T@XiCYEJydt#=m%RuV6u#uSb?Vq1C%VWF!kJ<jEJTE#5\mSpiPWR<wwK1wB=9bW:n8DI4bMW=C>hCd%=
t@*?5Y N\I$jqyYj4FEiSWmHnhAkwj@?Aqun>B@tQhT/&Dj+N^c:PVHApJAjDI%1nPMKqh$9j*+\iZA$Mn+1FB9
8d5a?9 c=QhY*ibu9D%h*i\QG!$!<VP&eHB:RJwjQV!jt/FQXkDn%:?N$+R@MCcZ\%i9pK4BE^dlHXb8Xua#l^%
ieDa@j Q?#cqeA#Qy/uZb^54e!QHV/\d\<wjK#bY:q<<WL\<uAptYwDeJ/bC>VXMJBj8uLNl5*dh8$BJ&?BW=Fa
cVAWFR tH<RE=iRuJKPB#I:P\6LLXMjp$q5ma^+pWeQa?Nmw/Im:tPq&5*4SKk+blW9BRYiQ?PQ#XCAiA6A@AKR
=K:+F4 ?KR\W+R8TuW6p!D!CY1wG5CiIV=Fbdib&/XIRQ&V*Plkm=teHP\euE\8JniDB+jCa\&nIIJi6aI&T$h*
X9\$8^ +bK%&+!QYd6/Z:l/C/I4HF*^MD4<b4Cj1<Zi#Y8ZL6VXIZD=<!^lAeR>RYZWiaRFBVG#!lSmCFLB9dl#
l8R\1: iGJiXW6Zb%NXaj4D<G6Bb:^P&yqP8HpGlZ6Ck$Ru9cBjhi!QuSkL/KynK8!1KkV<L+cclL1t:6L%Y@ic
V5Anu: HDi*6uN\hHS!hLSuPyD&kudY8P=y%?a%m:RYEC1pKpFBu/TkV&1V&q\<w!Rj9S!Cw$I++9Rmwym:yBkQ
nYlSXQ P<V:ye^m*9#M4P!Cl?*MIXL?%?ub$qQuctnT>QRZL%&^c9Y/Db8&dN8&a@h8w+NJ&j%b:NEW>GZ%%?+?
<S?#a? =uIY!K#$ceeL4HGn9D&Xw15mTTdJAFte\9:+IV%PPBbkH^WSmTM5RPpV+WR+ia<>wbn!<mZJ4>DLI?:q
Cq?kWa YLn@@8*V8?=ZZS$+H1t/w1T+ID<ZVkE>p<\YA!>RWFSeWqFbW+eAdY+q&1h%QG>9d/YT#9XAEylL!5@L
@ySYMV !ettb+qt=&AqW#FA9=bcV$!$TGImF:\<4nG8KC<ykl<N^+8iVtaabtdu=qK151d?TSPF@Qej9*/dBD/h
CV+PR# n6E>>t&FZZe?iimA*hp4Rh/8#ubtS+=d&F49\m#&cY>Q>>MPB=a44BESp=w%a+dTDQ&HVe<ueQ?:>@P:
-A::^A 0009c58138e001202b3 Page 139 of binaries1.zip
MBSS$Z ltQVSMStKmuNWb+#a?b$GTtFPT4#XXSuT@L^<qGV6/ZS$<9JIi\XFXVi$?S$DR#*aTeE#kwD*GQ1QVIY
RnW^49 %Y>lccX+LeC?uc1<?RCwb/&mYW$XEH@CDR85EcLq^ZpW<Kt?hk4+#9Gy+biDd<jES+h+Yyu5*4dd<1Tj
k+qXKp 9^9kjw@SWWeZS$i*e+VjhQV#91/X1P/y/?yjPG&dYmmMj4/1VA6Ea$El8Qte#I#W=Ie^D<J8ZLq+qtyq
%BY?m+ 5=q$<%5*W%9?qm*S%>FWa^%j8lwhVnT^kKG16pCDyti\DLC@CchNR?l5k#hqKQDD:kH+5T+tJiZ^+/Tp
i9#CTc ^QmHedF5$WRp<aC<V+c#*TQ8!FQ%b%iwJ1JL\Se9k6A>+?@uVh*J&XmMk4mj#SL*DBE/=i>S&lMT:FQA
?YSa8G *$?V%N%?@PSFSH=>h8SFy%*!*P\AjZD=:N^ehBD=JC@B^!dYJ<+8wXJFp\D5L#ZejhnK^iQMqVAe?blZ
RFEbbh \C\T!e>Pnd<ji6dX:AAPLhhF<HNNF\c\$/tLdqKaFGRDq<<RaqLRq=E+Fa$Dj1u?c^#Ze>dd#eu!EM9n
QtT$\h I@JJC9pEeCIJYKe45/t\1!nV@=mMCX>k1nJWByWJFTaFdEFkkYX46?#ch@DR$iNMM\:V+<eJW@K+!DE$
m!Hmh+ @a=Nc=dRFmnQX%bGHmAZeIG+$1B+kA%=RARWAKP/9DC@aK!IE!WX5+m6iA\wkL$kk<nmKI@4:Tjq:tlI
=uyXEb Ke&b4/18BW>yMYmANeABt:h5&::FQ!$ZuH?CNnKAnMGG9Sb8RiFJRG8h4>>ldjppAXTTAmD*\jWQ^1Tt
A4HFK! ^PM$AG:k:hkaT9iVWX#IA\@\mdLH5%mkLPLLN=IA4c?AA:L/jqEpAL/@6jFJLZYSqJtcpy!a<In^WP%S
#J=LtN RqIT=S6REbcYkWnH+WGN#=+%+dc/&y4K<yLm@D#\S+?VE8LntR@F+^PTH1ityYjt=BbR5?>1u>CjT8AN
dj4wKE FccC<%tPMTHl$WNGHN6DItF>Wpy1SqbPAhBGLSJB%/68+IGiTS/kiwE\YL:t+un\1G9k%jN8Lw:Y^++e
Vlm*K< 6:R=8uZDy9*&Hq:8d1/YP:Yt4lGXpJ5#e<cMYh5Ltn6i9YjSRM?u:lh6:w4Cep4!CnNtV%hRqJYeynlu
Fhw%$T #6#=e?REiHtEpRYpbcTSBSTABcbQX$acYLH>mAX4a8AbaIH46?>F^mctbGKt8%/CSRKVc%&w9SPMpdZD
E1lm1u 4FR:tJC%tyw%:JT%p^MpQ\Aw^DW^:i:q$QCHCXFZQT&BCQbc8\Z+u*c\P4^*u/tVm=Qn/dQ?lK<mEIGj
m%?+9E W<QERld\@>>^k9B4ckI+!IwT5yDIZ=AH:A\$<CmYc5w=/?N?En5VeN58^QedN/^d9ZL=5mYL>ZY$%FTX
dDbQ4E 1TQMZDBKuZYcm9L<iZQu#qNiAL=t$VJ1>L\S>5Nd&dte<9K@eDpWB^SE^pVH^MSGW%5#:>/=Sh=k9*th
M:>@d# iW$wFNV*%T8Z1TcuC&QuSe/hQZ5GJD<&StC>DNLAZEKWR$V+D\%\kP^uAAhMqbA^AJpYGJHd$FYZ>iCC
?ZVij< 9hGT/d#5HE^Phm:RAAR*LyMuiWp?%Q%5</6y!pkCi+<:8J$J99pkQl&:$WB&aph9ZZqiT9V%AGi4w*5*
SmESjB L6ZVyhH/cN#c5pIWE*BkQ=<\R=A?!RK!uw?!!y9R@^ip^h+JCjS%e:E=6t@LTu%RD*>bkFVnYcC111IC
cIjECB qyyQ#B8h!#cQPb@=H/6^w6YI8YN#PPdPt$ijV%A\b!+RWNQWZdJ1@bb68+#&M9h^:N&#l:FZeM@8uh5&
Q#Qwu* 4%?=YEh6@q^mHntjXPbSWXXh5EANkkKTWkbem+AQ^lMK<@MLCNC@nEKmmC^pL+LkkC\qTylF9IWk\4IL
&Y!H<4 H9Z*pdLubYVqFYeCL/ly$ZRY/m>b6u#q/uZ4DR%*SiWDKcVRpBTpq&+?cP5hEyNiA14k:ai99d<tPcEC
m9\F+F PRFJ+e%>eEnMBIu+S\@^jwJ/9BAaSIM?ICP=I8=HJBR^kSM+e=:G@j+?IR$WSmbQ>P5ZdXk8Z=Tjqb/T
1ctI6u <DAt/pH+9V6*tGGTXF6ehB^muT1wLC/41K#Gnk=^\Dt8bW>@uAR9n+AwEjMM6%Z8+ne<nE>MVp*Q#M%D
tGl?ZI tXBbXXXVZR%$W=Cduaq%WdE^ESM@jnN48Ep$DwqJ!<+4LKMKPbAdQp>\\>nabDLkXwmX&RE#4?A4ASB?
ySI!dI tl<=e6#Kb8@G>h8QukB>eM4^!L1=anympnNu#b\=a?dBptj6E>V\/@8u6%&6DbdCaqK!$/RXFPXpbKcK
pj:5H5 V=WHAyp#Za!Hl%hTmyAtbWp=Qla#KE&j@+Et4&P\HlTC9e6yV%?KG5LCI?MTW:Q!mm61un/VcANt?Ch<
qw8X5i GcWKAeqSet#X/FA@4l4EJc&hqJI9\VGH1c#jH?nl*IYMqH5lN/PTEmM98%5iM6y?$N+n\QeW5MP?A>au
e^it68 ZX&eV=$qjKeDPZle8QCK!kHmkK@imjH>%L/&/6ImMu>Bdq=8L4b5JCjGS6/:FZL^nLidm=&%&SGVjWa:
R?cb!n 6t=e9&dX<1YLehRkVX6nkR1ihBLe*5kCRqXQBcllNmYn+MR6WNjGWGHh^t&:>?+@jM#Cn81KD+JI/Nah
T5=B>c VB!FRTkAaj@q+I5ewAdwb$WC#y!FQ%Vq8c?ju!@lV\cI?FQhH=+idnntneWRW%kM\SSl5MIENqG/CDa%
alhwN< RakkId>w!&GZ\Ai=Db&%GiFudZaa/MkT:E!kCbKL^M&p*G\<BC<Hu/nEAImFidW+i&1J+X+#uH#$ID+6
q\9c!l 4@^JT*6uJ/Nh+uuZ<>d/p4VwEL>VDtd:DJjw/mBN1IpJ@EMVVMF^mmdGlGXEX%^Q#1>yB:FRty*++Mcq
Nj<DcG AQeVhtatP@<SC^Ic/8y1IKtWpV*u#Jp>C++TMaP8^D=nJ9i5&dQu#J%HWIbp1w/CIju@GFJyjD1y^Dh#
=cWI%\ F4+C1IMANmBXGK4<c81cip6Y4F/:aRN#I/jlB8#<IA*=5bFy1d:&kuq#mVupZNF=<?e41/lR%IH*M=wE
kB6iCJ e5jKMbKQ/E+y!M59KCkpC6nka:!R4Ym<SKmwEBSmVtbYXt=Y/tk@!Wt$:aikXqSiWYpY$L&Gyw/iQm:E
#dY!d$ JFb#BPZpDGc^b?wkiWm6&H:W?Y^ajG=Xe>j4h=?@W/ZL!B*qE<$cZF%StTqJSAKbTCc\^#<p+kRkGI!L
YXuw*N ^b*KWbE<pXERaCRX55mnJcGjSS+m%EAGVFX>AP=+Q5wplam^paHjE/PG*^J9y4=?ejuKqY5*d>>:EQ$\
4L<6N1 H9%@NpmFau1yAKWp$5G%SXcPRWkn<T5lJQSt&H%+YRKLNk1LtTYt^RWA*=:9Z#=&9+cwyjqyjS$tye6L
4CQN?V e/=j9lJ/@ich<InaS$qytdpFbhX%nc*Q1YByknS\+k\t+c::&S+?aB6\=bL9TYhd$!NHVK*M6/@j5NQ!
dmH*qc FK=a6Nt*YF/WJma%F#qnlp6=$<VReb#p?1c4?Wu$KmHS1bITp6LTW!Wq^eYt!mp1#yk8\<@DLa1WIakS
AFWGMR lRJwCTYqGjPAM*TZdkM=+ZVT*TjkQEWbWZGJcXu=JbX%De$h+m>amX6YC#B84?yu>FpPaIQmeQ?9H4!:
hm9Gkk l?C@FaPApwuimen:YJ%?=p4&+*9Z:#=MTdy@/dVFwh$:D#6=ujE=/YB=!QmRLT+jQ^XAnbH#hA?/%M&c
KE4m#B u>pQe8IL*lkCadDpSAGbT?RIa@d?MdcA*Ly&/YaV$TdX&6JRD+EkF5SukA!EtCBYdaH!9DuEdLaJ4$cw
Cl4cG^ nKkKkq?eM&8t$9HKh/PnDJIet@9%mVqi\?MT!EQHLHAJJFa\Zd+cG9KlG&?D1LFSXbZmKAN#e$HEJQyS
8HLGpD 5&l^T^EPpjV$<9amjATS=6^^/^:E&KM$6kWEqkWAb+#@9VpRa$4R^TYXDDccPF>+pNjaYbN&^<>!5:/P
a\lMd: mlkH\e:kIJA#kDG+iHlB=QYJ5<&6w!*RYdnK!NVbN#k5NnY94K:=PT:l\n^WKek/?K@G54RHX<=/Pbu6
iVK6mM ZYikC+#BwT1KMRXFGE^lpy4MAbHGH>yah#i>yKEV%EX?cp\ajKP49TYPhMj5AlNwk\*W^VTpnVZ*+?KV
yh1N!X pl<uWpNQw1JRmDQD&i@Ip\4e+FXt#9/9Sij>c>FS@k@qP^Z\XdQtEHNJiB&l#FRSWb:@/BEP>H!IlX+R
*:?WG@ *6?hm^QKdwSiMNVXXqiiDY=8FuDPHBB/RCGkQ6VWKAdS$tLZ$8b<Mp4!F$IaDlRCJMLMH!>kL!\mm9E?
F@@AZ^ l^6C#ML<hCKL5#V8HjGdqH9u8$biSpbKYqbBchdeic41G6w/C\&YLF&<K/\+i#mLI#6QB/5Ay!%ea&V8
ptTqKT Fl!SY9Tp+&Z*J^#kRJFICapM\qH?PJii#JMEmn@?+TQmIjtIA*=9Iwa6tl6Z5!eWMQPa8S#%D+i@+<6B
c4+\&M iRm#:4c^A:&6MjjFF%L5e^mPVd$jGeM1k59Jaid^=YSn^n5&<8e+!eakl6uw+/Vw$$6ZR4Fa:tFCapy/
m!L+:P bqaPpe8Spe4+Tt:w#d8PI?*Cw^+tWeC4ih4MIkYYu/aK+@E/#6:PBM:V%a8iJ=^5nl$?cty=cPQcDeb&
*&8Zdn d8/uVn1ddhPeK1I9waD5Q&h%Rt%n?$61ljDk#&<jZ?MIw+eH%eRqy$4k/DeJeYFlCRk1FPXFidl+JiXp
QKP9q! bPWIiXKSuM/tSM^kR$=a8Hc9tdZDCVe9@*NBFCW<VE#LLwCD&Nnc?e1ut>4J&A<KauRa6\FSqedji*/\
5&A:Dp Xl4$@<T49*i5$b&+FIk1^+5G5S+Y=l=htHD*XtSCcqL+^bMYJ46*HZj^PiQq/tB^/MA^S:iV41j<@Z^\
y9^5Vl c18H?:tkV:<HYZNC1T$q8L?8DYXEiXGiSE=YhqbYSuwKh1BBpBF<:51Ld/VaYG@YapX\KHm!$D$yn/4\
Y%T\W! \wGh1jV\C=NBenGGl+dyDFKKGH^ILe*di?Aw#9nAHP4=m^jPMadIIXKM?J45bY?QmVSu:H6!e!e<BHHI
&p<mnM JdZC*haK<M+%W$SWqMI:e#KXmJDHREJcRp4N\QCk$@pHiW*Q1%J8i=88l^lAVWcIk<FPeJCedF^MVC5R
H&RwYS QP^<I9$A?u1ct8/mnaeejaL9^YiX%LX$QG?yK<6LR%tKk#8#mtydP=8Kp<P9Z@S^N6&%Wp<HWD>HSIAy
imFyqC !MVmI5d@Ad&$/Idw*K1Y44c/p1#+<NBAFGnH>8>a6%kQyRKdF1FJRpVBBYHZwSjjTZF!:H8/99#@!&B^
SK&N5X cDA&PnHEN5+k?bt@d<p4KAIXVICe1e\^d#dnG/uAiH%%qTJ<bebMC5?WJQkLb%KLT*tWFH1euaNN<9uW
IXwnEQ B=FQFyD=uAYFSaByn1LmRpaBD+mCuQ!H9*/T5kNj4<!VpbGYpyKY\:lmu5wCDT$RBnTu>H!Ee:+?\ut1
!Pm>Hd kiF?P><dD:M4RSP<@>KL6h1A=tJKEZD&S&XqMS=#wXNIJPLbHlH^=CPI+8QIYBI?&BPLCIA#b%FBF6FD
1!mc^E mRFSTk#<kEDm:e8Pb@ZBRWNnI?Q5hHn:WnWZkpN8*kXaQ+yQ^Hu/cctykPmIi&kb=nDu\I@iZy/?wcHB
mMLYya \YEGRRwN*k8/e9%&iEV$\$iJ!WR1X>4nS$M@mF/!l/4w@W4X>H:c>9HDl@j9Q@TPMbu9wkM9Z:6J?XwA
qh+:ia Ft/yj@GG!m<C+Cjnl88Pb98Q8RhhPi6&\6Hm<PGnbqc:%/*be6nJ@jSJX@6Dc&cJmc!XuE9J9RQbha%6
@FX4#t CQnl$aGj*#/<:ulYX%/aHH=\G4dFmI8LCEMMKn=NTpbYTwCLW$SYH9MJtE=RtkHQdw:&J=1C:yI6l!%S
uF>&Xy S98h9ZkFEB<NCmY:5K#/!dN&MLMQc\p4lZhY!h::h:lQH95y?+j^/lL?J<1h61d/tpy1Zl6PC+Ba/byH
-AKuG4 000a0495127001202b3 Page 140 of binaries1.zip
dN>iRA S8/nP*jmW6IV:%++aZ=\>&/Lp@=u9iANHVK^PAGRh#9n=?96A#Le&!QmS^?qA*D9F^dh+^:ty1h%wAN!
>@\t6t JdI!M1t5Q@n/1L5*4\aGtAWSw#@H&MjlKjL<DyLDa<\/u8QK*QNt#=n?nE:kES:t^8GMQd?bk>LDhJIp
H>?%?S *yt6Mh^K#W?%h#uy+i$LKtRIH^Q^ui$dAa>J?jPuV^<@\qN/S#&t6#iw%k>kBBh5\V46h94$TZD>V9c&
F:N$15 %qdABbLCwmL@ekHGC!Vq@MXqNR*YHWA1iNbSpZ#D@jB1ZaLG1cW8#$$HLtDnJDk=8Vm=RAP\C+lB\DBL
mZ?>P< 8\EuWT:dai=&/Y=<VpXn?@Qt84L5^MndIeGB=<>h8Bl<:h:D4QLt#1h=mXFl\V/Pl:e5%8&HH#lNECeA
56%yZ$ WT1AIa!%k#meqT+$Km\6en!q1L/n5/p!:*HW#iAAh!e4W^N1PT$KABLIkE<D@Q<Cqjq/RcPnk&N5+&#@
51Xy:= @$#JVl<tl1d%>jb<@#$\PDmA6tS&dyBHYpBi\LRE#=!bk:&>QYDK9!h?NuZm*:*9GYW!Zy\GYE?jMbMX
n<N#$\ eXBe5aAKHyA1=w&S:KN^SA=d:pkiQb?>wJBi^Ad8u=uFtb8hMNlLe6NV>SVpbRlyMTu$ZDNt#XYBPEX#
pSPh#N $ju!uJE5#8#<\+9:kB\pq&+>/uI?QJuq/4>ntTq\R^GLG*=E=tdTW:qVHmM=nCh\^D<Cj<@><FHe\<RC
EX>b@@ yAYPwyKMTT<9mq/?B^enhLa<1Rw+%5uwH^$aG?VCi*/CICZDAm=e9u:::9&I1BkeZj+Ri$FGCjk6l+j:
u6TSQ< j@^k\wFm:@qPjJMAc\&DW9wilFZq<QLwPKAp$=n:9#=$hiL$*#c<j5BXWE@11W9K!wc8N?<?9T#C%\MI
GL#94V +^>uFbSYwS#w@5n1T/E8G??F*dl5huT@lW@\=aBVLuctl\<hMVQh8tdNh9MVIE^h4Qa6qlMSZ!5>j#cT
$Kwa!Q k&XPdRN!\&@kll>j*:%5d/\6!<>Im4bXqJktKTwtKm\w\M59KmE=dbwaD!i*lCJ%*\DBAi1$&W41\A%/
MhkI6W c@bRu6KZ/8\EcplGckDPw9TWGG5LC:Y5BX9aZ4$p8t!wAaPw6WdGeNI*!1YZ8CcqiuL<HCd9R5:p=#\M
iaB=BD j=CRuy+Rh5:F@MB8a=9Vb!k=eQm\Lh=hu<LCIm>QV\<9:@8ae5V>6NRGVq#S*p4N?Ai1IhPuyAE%JCe?
!ZSGTG m5MSpbjPiB<<>4!9d/S@bECaiq+pPdRbn5#5PW\+%e#=k9Qt#Jli\mSJiFl>SC?#l?$:>tZM@9/Liqc9
\wEj?I h/#d9HQjwiMY6w+uV4q:84u?i6?Fn/whW*#QXKtHlTMc1!w1u*dCt*^SiQL\$iMYqnn@DL8qZW?ieHX^
p8bALJ hpTGGKN^cW8KmIw\lQG&pSSlw!mCIWLmyBRCYWJSW*?65iQ=B@uN:YWJIcePLNNq$Dm%b@FVmtGeE>MK
G@#SLT :MITk?L5Wt1NNE&hlc8N:j^8QkLj>:!69nR4IiLGSV>*X$e:Y/#=>D^:NV!%4LYnPm<%:p/\y+*^twX5
MqI/M< PkM$V5$yA5AS=MShBLiI5QA@NCEqbI4Ly>91mnMj+6BaX%9VR*8*4tXJBlE6VW$N#C+5WFYiy*/$a:!9
h6CRtc 9%<E9MD+Z=NTVMGeL+R&LWcdDk*%WTbqkppq9u#:&V<ENt*ZpFiAKAGVEeR<k@t#qZ/>y$#clmd>=@lZ
/IW&L/ XKBJQ*dqdkP1RF$^c=IyYGpGII1ba!V*q/V<:P!e$X^/Hn8tKRtKK6n!kC\KW9NHi$kib4Z#BmXbaA6T
EJ%wa% TknwRpFy>n^qFSZn&BLREZtuX!NXVFt=&<L>cp^YBemID%>@aF5Jk%qAVbJ>@dA+k=FPy9Gp54mCTGJL
waJtSi JBKan\mIDiKBKknMSTb>aHGFPE6BjKMCkwdcWn@VVpbjd@?$pZG\S1PHQ/mIc#jD:6/:j@@B@dAdERVJ
TQwGL5 SYhSBCkRdMH:/9dq<:hjA?MpYi6:DkIJIJWHpXFS>&/BmdAwteWRVT\V%YAmwdTp1PSye**lBZ?e=@Mk
!CP\hl LnE>n?II9JnANELKSLl\^94IAd5#X+K<5RVyEFDEAeNXc*hdu#^>+wVDeR\Z^NtX=nBuL%j%K1nBFdjI
@VIWL# EQ$@94!D6%FhpyiYEH**^M4=8MSWVETRn=hQTE^MawwAF+ik:HSFliuVb!klpe?iP%*>M$%Sb>FtWA@P
R/*h\I y:$CLkTH*5aSR=T1cYl=@84h===jakMnw<MD9*1yShRI*ScmiWNLc#6GPX>\%ThGEh<@9$j>kQXIlVnF
GWp<iY EE8R:%&+YywXh#<tPVQn+c$#Ltd:h=9aib+N<HB%MD>!*MHLA=!^u!@lQh*L\?*<8Xb1dWD@L&y8Lh=#
V?+?qu 6LG&FlVtbp+F?RdQE8ilQdl:+$1k9=8^/jQj9$jlQA8MnMGDimRnQ&QYdM^5EjPE=5/c9ukR/RFpDa+j
A/GMh@ w^+V&^jm<+!9%IQKYt&+a/@JMZM4P$jup<+P9>:>yaitGhSl41*F<yR!jFJQt85K@HCGHhX5:PDp:E!+
hFGq+b <Dk=P6lBNDFGa%jHAWwWQjBAZIF#!!bKD#HqKDFLi?EcwIiIkyd&ppjBLu5Y/+#VPPhLCZM\&WpPPke:
%/!hH# J\jBmTuHah!/w>yEp>dS**DwSPD>>QJu#=84<lL9R^AAmDdb8=9aMZZ*QlM#i@jAP/qXHT*XSSpQ\\JQ
L+wQ<p tY%d\w+LI#pZmFNFTeASdEAM%C&JEBMIAwIKpWXl8C1^5TI9Giut6L*=IiMhl59%J*RECWEFQ#KEm9Je
#<\HC1 >iMh^C@t:@+?by@A<Q?cXYDC4PMWRdCM!lIJt::?SLM?pyYjQtMYSSJ#=<%T@QZ84%WdJ+<@XjSVZFle
:dY=!V @/!&\FXYnyX<tD%u*4^Jn6Bp%/R+k15nKT<#i\!CdDKQlI@^A8=<uAYX!<#mKIu/%WQ!E+!^wSadFTY=
&=<iQj Cb1RRy/aPZQP46nK#NE5#u#jlV4>8k#hKj44>>9:l!WY%Hi<jQiyB=MHhGa?>mw\enJLmHRmk$#uVp6B
AeCide ytAt5!WSXCa!kWnkTM#Pb%FF\!SXTCBXkLn>?P+qC9S<d:QuaK&BQ4d?5V=KuScheQe@j#Eaq:dh8Haq
*>LdCL 1JkpGeN>#Q>am@np?4EZ4QZS%@he$JX4N&/H*dq#@jL9h@>RSiQVTRhXZqbTZFTRZ%BiE8u1HSB+>Zb+
D8y4jA LJJF#hQY4qhWitGAFYue9Pb8h8mk!+Y4F>!hHT&QtB\/c4F::ewNB?%R/6wiYnhZZFSm:d\=e?DS4Ew8
VR9t#+ t!CLphG?H=?:8%1iXlZuyD!KDA8=/K\9P&&KPLAFQ\?jkLCItCkjB/ik*E!q/ckpb8G6=p^XIA9hqWc+
$SiqPP N^GHc+deyLkmy^C=w9M%Nk+Qma+P>@<EMunL&m9<6J=bb%n@6KG=Dd@?e#JA?NRNiwKXD5nERw#I?@je
mDlY>Q HyYu^WRpyGhu^F:#hVLh9?8+5<<=j*hZi@PnqmiAIW==?@4+EF/Kut+Z#4jlVHhRE=l\lEAD1IJc\%Ce
IYw$h! q=XPyInB5+^HtZW#NAnp!F/#=+^j>N?@?\TH+BtFTe6Suw!aI#l*>k\FX+Jp\IGiiEbMmmcIV$wjQ?BD
AwhR%e /6//j19SkeQH5WZX^8LZP?wb5R/$/q?jS=*wk4!C5yJIB/P>B\+hN:XAyuB$hHJ!eLC*5:G!H1Q^1+mJ
Re%+B@ wPMYEldG:wSJKWGuLnFSTWlM$/A6ZAXeEXuW&qaWi>Fll+HPKPB/Gk<up*&EA&INZnGJEcRJ=Ye$dS&D
L5FNqA #cd8IZH=De?dK:Nmd\S/8Xkh*dNqLa=QMqm$hMZc4edt48jD5==$66cXbMdiCHA+5JbhV^h+akcwSiRJ
p&?QJl Qy^YL!\!\SMMFBImT^@k/1&/w9Va5M6uQb!5nln9&4^/pS=nkmcEIh^akEJmn4yb^<?jI:>GjnN?C@$c
ma+KM@ @Mit#Dq<p!d>@jjRw$HJn?THDV%k$6jK5k1W=+HnNEMBVQw9Sj\=>1ZWdLD<58IIC^qbiRYIe#HttBAT
eC1M%B Gl4IEdKkI:IT5nP#5mHwkA<8*DibT?S\WupK#FIkZaCp!Mq:AHRl!KTQD9X%S=%aNF6Plk/E\Te6K!i4
*$NqA6 i41!MHM5m!59RW>Hb\Dba9GYw!iDI6QLt49ijED^k+YQ?SB*enJnC9Qwth\bwFSVW<aj<!RuJTeqJTb^
ZET?bR kd:AK\wkmwL!?QGimjlDuIw@9wKtcGtwL5y!N?@+Pj=4>Dind?!*FBk5^e+XC@\DA+M8u9Q9A$+haA*K
AQ\<K1 yFRZ?>e@JlN<*#5/@9&<y><=aBWm%QV!8h@9JwtCbdK/Q&eRC&q#5@QTR!*hjC>e9lEiubmiZ%dd&N4%
cC5!I+ lyIXE*FH1Q*^A+hQZ:y!#5*b\eLEBFVF%qW4Nl=^BKb\5Nm*XFFWVIb6HnFu=i\=&^QL1l6cZ:#@%ne!
T:Xk/I $6j:/Y%Ze*%qWXb!*Q&dX!:+8i=ayDlNaw1aMD<Qn+CkwLAkD^9uqJp#b<!mkpQRjHQuAqMadD^pcijm
c>q4+? =u*&+6Wdh/p>J$kW?B6>?#p\M8I#<BM9kL9ceVb>hYX=YSuPhKm5^w8L%^??>XF4G*:%j9&A&?$c1P*F
Jj@/^D tF!D$MP95DA%J8b^hp=/XImZw/u^Hw8V@8j>*F#6#a=b8*q=849=?iDqlIiHq$>\:!B%%+HmBTty4iXb
#WT*A# A!/ZAFZ^tP$^pT!KXBEXj8h/<AY@$$/:#V5aQ:@?+whuFD^NDk<1Mb69%uT=Pu^GQ!bJkpZp?ICI>@L\
@kIeTV lL+iZ:eF9QMSW*NL5!P@8@?!SMP59*+Q8d\\Q#euK!<>=NkPI?PDl*AGNVdNM8$=dY&5kTZaFEA<kMdH
STebSL 8Y@E@/EIeSpNt6:Kja+Zww4dt9Mn#%q9ZnlM+>GcJT9A^e:P^n:M\epqIAFTkt%&M$%K^&C4ye?6=LLY
QQ\pt@ 61151JAAX!8VZS6ZLhdVHchJ/8k6Y4*ntG6RVFF#X@9V$4VIK?:t&#kY/?wM$VmtC9+VcyAmyDBVmAH$
KdFpDM MCI<dZ6YhX9Z5@Ke^QDRC>/8N5j&:>1!hmt4%qGeFYc\NMV5Bid6Q*/M@l#?Nj=L=8j+H#5CQaAhc<GP
<PNmh\ @V>/95NBS/=qklubQlIj!Qjp8*W>I?NjN<nIW?uI&ZPW=H=*V*ID1Gh$mj?!dY=&Xt=cmLG$4D!X\ARJ
D?taKn RdEDKAlTp=MJ?mHyeXbtFmPdI!5:c#!dLajII<Gh5\FBaJ^B=4LH>9ZA8^5jGjn=>X%dt8@GPZJ!I>Le
>*Awll Wk8e5+5!^:P+e\1PACWMAmXI4DT!<4+iu%eH?8F#L&nWeTcIEt=mMLa5Q=8S^b&bkXZ4+!upa$a!F*BC
F!Yy!M <wS5KM=@@I>5kAnnM:m<y41!@NSVFl*nQ:@>p1CVVA>L==Mi8G4Q&?$6^GS>DIwDJqq#$nSPZ+iG8#^P
J#^\m# i9tj8^AaiQG5V%@*j#nkQ*+IV%lG>mP*Hch>#kEL^Cbt=qjWN:Y@/pc>pEn6\:piauFp9/uZqe5By=#6
<IDG4@ VE$PtB\%&dB<=VbVEMPP>5i*$/SF^Yh1#y5:F!n/RE4yBAtMD9j%jH4>HHRQnnm:h#*+uM>yJ+8hY4KT
XI>Iy% p8Im@L\<@ITRlCA*G@eW/ubwNuLAjJYbcq>y$*XZ:Dc#hn1Ji=c9*+tIT$4LKcJa+P&u::?GSwh?Hj!P
9?W@W> a1CqCceRq^blN$B8H5+IKc>?Rm*C^PcEwd/j*%pdYuBJdHbc<mMIL<LPX^Tt^D%K#<qJmdn5/ZB5:\Ed
eibHCR 6+B#91hQ&J8dPZl:5&mA<J48/i:6jl89KAh@@&DFF5@dY=1yl1tT@P#$JCJJHG@QwmL8*4kcCILBhwh=
wE+W*P i!@^a?nu&K@^u>QGTic/cRyKtQicNX$&D=:T:=/JA@#Z6^H\qPT:<VH6Z:6==>:>JwiQHnL8//ciE58=
-AAhw? 000c76af450001202b3 Page 141 of binaries1.zip
$Th@/D 1j+qkpt8#54Ii8T&h958iQqSuPNua&h4b&jLwkJ&GR\1AIVn&N+kmuqJ18wSqIKEuCbNF*kkMKcp@Xu8
&9PKKh @RD#DiDb8dSWbp#lJbEFPAZERTt\T!%wyW*XMhl8HZA9w:cnIT<t^M@ytJHlekMMGMV%qt$#hR>N4t48
tEJh+w :HlTqH#*uNN?nnZ/85M$hm%JPpWAHC!yIp\I$TpCtH1$yKG#w/+\Nj4YJRkm#E^&d>t\AmiR5>TB$AV?
!P<APZ =<?hyY4i#8lqwQq?T9:+4@X!\Z1@9nQ?MS*4kJQh/>=?GS48ZCa6Q=&/Zy\8?@96BIqTi9mjI$=NDe*P
t<6FiX #Ml//KcL8RFMTXL\y:RB8+atF@<+!VWTubYiV5>p#<wp55l55e\5*EhNBSD\#Vp=&TAMmqJKAY=mVQAP
X@\IB+ Q#/@:Y4I9tP?awc$4M!+NI?W8L^JWu:&iBbH@p$DRthIq/p45ZD>Rcj#+cqq#>B>@SwaHtM\e$k^+tZ1
Na8emy 5<J<1pI=C=kkQa%IJhK+WqJVH!eVn<uH:MtyqDdI1e\5?DiI/MHS9G$wDSJhLh8JZ8cQ4#<q^<t*EPE=
$C9H@1 u#l%?4V#uj<>b<\@dEB&P:*>%Qe%#>:F#e9QQ!DA?&Vj&@?lk:@uLJ</b?qyX:ahP8X>FkklLmY4GQj+
eIwIwN 9ZpQ1wCc8*4#Y6DSa<bYjqe9i=>\5nq/<IDJ<V%4q/+!5ny^\5Hi=6AG=TtmW?c^#YQPZcutt%5K*@9!
R9q$A& @Zikk>@jQ::8cKw6!$6LmLyDCY%:T?QqY9PWyEXFBjq+RGEKCuC#ea4QtM&/u%JYXy$*F?lA*>AESaH9
^XyWe+ YY4ldTKXmt^wAVdw/eMM=!ij:yi5C5jm\4#5LPSYLQdM!m554Z4T*QZ8/$?1&KD9B<wCc4k^c=h*hGVR
dSmIZJ *bdC%ITWuQ!<=QAkD:5nSwehQM?i<*F#5VY*QPEDhPD8T%W5iL4:iTXM*HST5>C:eDbCA*Z^pb8bC4Gj
8I$@Y8 iQ\nZG=\?@4q<:/uuc&&Y:d%nQiP\+qt@BAHCV6FYlE9ZySpn@#uPDQ@MAHbVd/X@hn*JZj6&5$:nQd8
=uiB\\ Q:B9b>@d9%V\bQb@uhuE>PuWK>6Yd6&=G+YBtdtX6VXl!\qWaDPPtCSE<KKRVnW&m@+dNp!bw<$mk>m!
yiIucS nwc58#=HX?9&$#m$Nih^Kay!5uPPeHD\mWtMm4NL#G/nTRAd&J!N!G%w4$1?+ih+bQ51A>%jNDHhbV86
b@4cyA A<K#K=yA@PjGldmdet=h115#R8NiICGE%^KWF9lLBcQC$^Ve1%1/tm8!+8>iQi9ybHX+#>aNK^e9%GF^
$=d4>S kempFyk@d<=MXe5&S5<kpCqd:$m9&Dn=/w@6DyQp+E@mG?Q@tI=+8@dNl>>j5yYpYdTlKN**ltY/@*8/
/9SPya YT!cuk1tp\W8\P8JYdQuVmRVpA1+^<FVS?it+Xy/6k\GpkF\AwRL#F#RBKALkAe!T=Ici5mytE@w\#Nh
XMW:@I qZd:>L:F/k5WbiFuM1T=^KeHX8cAJMnLM1VyWF\k9tm41X6IdE=6?<6*Z@DTm<:MJ1iMJD?yLm$6\X<L
H&+mj9 jVB\Ac:LADdAAT!ySAydQuX=th&R?8+9FWCW<Qp>=Xd#$?Ie4h1Ju4HiH#@IZ6H^Z\HG^!%6:P&6HQ<=
t$5b\P be#Q=Ce89PD/a!#!nZ%9^&$4l=Q8Hy/iy?#:*qK5?T<VXFbM&wy1yE&J5X:w+Py>:516mEiyicY%Vi$9
a5/+t* WB8\\wPR+CQH>n8e9*4S\\WC\Q$HVE^*4q1/%6nY^eui%tLjmlqmwnL#!Hup*Fu#6C@qW%#\+Z5@?QB9
wT8:hn H%/%N%TZ=Ka?m4l>NhDQ*eZYdL5BRiQVY1A1K!dE^<6QCQL#5uHK#ch$AcHM1cw!T?5:VWqu/W=V$Abi
V>Fwa5 AaFZd?LT*n>p$I6S^:j*4$R/1H&<BdqbGcuJmjH^^CM:cyA$4pN1cH9%<V9&NI^T!/bi+u/eC6!kEl<Z
KQXGG1 E*/t84apM#Y*8CR@<Y:kcb6DS5hhjC?e>V46atN8C:4Am$WGGC8eQ>6P4j@>kSHCc/yMwiFJHR:S^Cql
eiuuyp pmANH5dFkG//GZL^nNhJi:M6Xt*j/V%ji4uHj%yJ!p$uqLlqXbn@e=mJQ#^A9mFjT@i&*%m/b9Q&ud9*
SQpA$w :Nw<ibwdWhTThewVSQAQYcitSF64G&:i9u5jL8p#6:C!6pEm5IWA+S<maBeVHSjl\6bH+IEyEyL#ebZX
\Mu>FB Q1iLD!8iQ$t@=Y/!DLDNT>NcwDKXq=6>uIPDZYnK8Dkl^1/k%WEVl@DA=u^WRZN4WW!k!>F6K*A:ycn8
hce:j4 19$uktP#!y5/Y!9T:y&%+#Si8%B*FNlESkRduJq@mIAWGwjAAIlAbGHe$?jQ/\5jS>+I>IGk\HmH+cwq
c%IA*l B4y$IAI1KFBZX/M$\i\bKqc6*+n9\<Cn#N:^HyH^u=bkPmYq/T#VMcmn@c@l<GC9jj*1XW@:6cp5!qCW
dJjD?B /u9#j&nkL+PCIplLjS^64VwNE+GKYNM$q/WJTA%PmEN+11M!\bGpM#QIhQcMVEaGS&bYNl%VB%q51Ac!
y!C$CT C?P/iplJJu%$<Ni*h!?dm?M9&Y:But?6PRyMYSJCk&uc\RY=>C#8:Q\L1%p<ILb!n&*AuiVmJyAE**<Q
LIQ\jk nw^DbCHVqh%b\eJeeZEBMH6YSpat@AN@NRQEAVPQpe6Sp@kbGYAc:n^tSRa9Py11T:IVw?&6&:=@H?9y
bMYZL^ /SZyGj1X6G*jWXN#$$PD=QnE+YJPcKdJ\$Y<eZ#>18/8qbGb4bQLTXhHK#^ep!b/MwF?TnRXVJ/6^$qi
?&ST*B !\+=uQK=EHIuPnG#5PJyM=WkaAWGX=&QHDy++8IX#CNcHN1@@>CSLe8Z4ni^h*c\5#Hh1T<9J1a$u#F9
ChCV8% =51d8A8+:iYHu9/^wb>k4dcG11K5^*H*d%#G1MD/<Dw+AlLcG4Pp^Hl=\aZ\e9DI#b>HhdB\LqCdy\LA
9$bLth %%6*$NL8lL99?iAdh/MtS5&&hPLci&CVL>%h#eJQYZ9nH8M$k/lIbwRh:t*AQwuTt1dud#>VlR9D4CZD
Ki/pqL dW*%XeX=tTpJD&M9SZTB1Mw44Tk9TLwdiM4cbL@F1aALAb=8LncYD6/?kH5jqkn\eA@\jWYJAM\lapnR
u>>H@T *EVNWKHYVma>t9L\$cQatMn:>&=j8*LB%>*b?6lG1#aI@4>@/SEi@JWkJ1W+jd4<%E@p&Q<eZ8IhG*X+
1tdVTT !hjpK?ucP%b4q/#b8Hu:nm$d<QR?t+B>@X#R5@>/Mi4+ymVD5%t?ajP&*Z5B?KakA1!a%t!&IABtm$*m
\hc5L: u9pH>PQmE6NWAjM4nJ$8^Xh%%cbeQ:q95e+9GyQGyc$^a+4RPAe:q#BDuCuGIV=q#uPc1I:Bb16#$WX6
R<YT!5 VVq*@C^*46V:TlNb8MuM=$bMXuq#X$NB*NXVuMi*Lkc<e/qPaX$\Wulu@5H:mLCpdqw#Lt!NDR5PeLM*
kPT4kN P:l4+/1qBu4nj>A?+jXu#XC&c9$/@w*^jdSu9Ij=ZZ#\b@!E9V/Ta#??j9*!ljGQ9Xlkb*6N9F4>Ek!t
u:/E/d N%XYed4TDIXyjc<yt9#ZpW*1@\tcBH56uVwNk\CMAXl?Z=%hZaQ#G$RA!a@TW>Q\GyA@QTM>A>^^StdY
ePyDM$ iDbZFwaCmQimmG+1A#A<kP4@ce=>u<M4^uYF%Ge1!eGQqJ+1:=!GcM?NQ1K4w#P5T?mKL>^\!DW+P18c
8PGF<^ <91kRltkJnlT/=<T%YVXNB^dWXJWlJeWGAypWu>nP9#%dPpEaJ/#8PkSE$E9Tb>IB*^<$>Z!yLIk+>F>
jkcan+ Y=6YBln4Y+@k4<16Y@ehNNq:mYSR^+w^kZi&j%nSGXn^k5$cDa%Db4b&>k:Y^@9j@A6=qn9=1++!KV6h
^h#QNq *4dE$9G$j>B%HKNjTm&h?@!NE9?lX<!PHVl!P9n18hQPDtaHna$QGc>j5uV#MWhuY&94\%5$y+H+u$@P
<>=ZJQ J?jNuL@!Fk9&H*5H^kb@jH&H9*>lbuL59i8Z#u1hhLDe8*TaNt&Bww\Eu/C\ACiHFN:bW6$yK9M%itp#
!L%Wj9 hBb9B%>@!89M^bC\mIi+B1wcZD$G?KNDQ#/>dt?5ET/nlm=BKB+bjm<5nLl6H*du*9*IYC!nKK>9jju8
Dll%a< E/B?bHV\=*hedNL<yKw$L\6j:q9XXFPWZXJhW%Waj#9\6NYBw*ci=<::ib=&54I=+a@Pu8Z4Qh!>9C<Q
Y@yPJM aQSA>XKB<G>l#Va5\#GAKaq^:Fk/KlJ=@<:N$KC#*nly\>Ctqjk/>1**P@qN>GjFLEp=SWWyC*k/j\<^
1Z!?%T <=>uk/CZjZuiiw&G/5Jq&Gi@aZZ@/?a@1K>V@i8$@nJ!TuLm=Y$c8F=p%%:K+X6cYcK:H/i^VThEGIBB
YwLR:u lklDhE\ES^1Nma6VwF>y:B!eYNNXqZVXibjBV>wanX6XZq1Wub*k+GIZEBMZy\Q1=hY:cCKAi9M#WeZ6
*W^CVc V>P8uV/<Z9<VVZmyphQb/:FbXi$hXcqljy!&i%em=8YFlaRA</#EH$NplML:XQE>he?jQ!qKDk<=:?q5
t\QGbC ielw!=1qBk6%^tpEFjPLIPIy>#=VThtt=R9>c@?*wY>CQ!dMbE:Tj+CNGNRJbwKNmD>AJ%?8SmQNt!K6
Bet+Hp RNFC*?8@NyyA?u?aEd^Ya9A&SeC/LKZ^J%\:RJ$LAnL?S$tyn%QT5MTQtWcpe/Wl%yqbSDaJty?i^btj
p4W6FB tV/GWAh>*+Q/Q8Y/!!/DWX%Pt1ccEmHDM$*w$L&WVPAE45KwyT!wm!*cd8=>M:GwkZL5R/N$eP!eSHJu
=ilbR8 HXFL%Im#llEAEXFWBB+?E$WFS*ai+n!:J49<G@bL$/hMS9y9upPauJ5ci>jK6w$B9Mmjj&4dPpMnm/9q
#P\^AH *?nj/h<E?%/c4>t/i@eYB9u:P$GhKkKmIa+dF!@!Zw96j6jhnW$NRkD:p:9%%DVZGlpjNme5VW$QD4#?
=JcmKR m@8/&qn4>c9YdDd^mtVJIe4Zk&I?yuuM!5Z#:JZdWiD61eD@+#ie*kNT@>m^jee<Lq@&Q?q5i?!A5jFl
?65>&t w>YLqt+#e<SY@@*4IPwHALMyE@Nu1qk@#m5G+L@/&D5+N9AD9ZN>iZ=/a6ThpI9?Hmj5#Ld1D>I+6hYX
ek@HJ% =RpBdq/&KdNW1K=YDp*X&RB:*VZ:LeDV?%&+jDM<NmphKRRe@eeieQT>H%/&Q1pwE5yNu%\RhiNcCQP1
m+w:A\ jWnwnX6*eAJ>hqFX+*Q5HQp%BL/?>@P:%=*NDhXq?XtyTjG^Rb&kPw11/884el@iQHjT+1C=1@@FRH<9
L!Ndww N!hd8>MBkH19CW@9=8?ZTZq/%m/tnqdM@hXk5lGHQ<VFVw&Nma/P8I<n>RLl@hmcHq^9&@Lq!>lZ<l6@
I8a^>: Hn/1*SbZ!4+P+aQcKTc6IC5^T9:/^n4a#A?<:?E=\YQ/k*@=q@CaF5^X%6SblLM&%m#6j<X/T6VlX1*=
w!iJZN <=\KJmI!%ndFa\8Y4>/At9@k+cPtFlcY%qa&>5AAC8n+CWApW^VV<Zl=!Ca&Im+?W=6mAbjL!ZZQK?I9
8ZH*8l &Y@S?$pdwRq11<?Z+?dp+GDnF^ahF&MZu@+CKEB@5:qjSFF:jZK\$=:qPl>y\444n=</i!M84:/#MT</
SqQ%qq mM9%!IcFPtM$hmqlPpWAQMImYCMNJMAtNCk5Pj5T=jSndkd=86we*dh6*VKDld4nXK\9T5Z/qNPjQYQ/
^V=8ee jN5Y+nMBNQDHc1Xjl4+K@*:^^&yjQ+QXCIwP8G+EBq/LIiBp5\ll:eqhik8WywlQped8FnuJ@yh@GcG&
5:9Vl8 PtdCcBH@5Cacdc:p%At=Q?H?pSKt$Wq?itStenKE*YpynFSGGu6/BlNmj/=MWAK+@1IkM^eIATQ?*>@i
^&IikE 9&\8iunBa9&wLqNuCp%Vc/cM%BTSnhi\#!$4N?P$NpWIwm9*PX!ITK>5w%#@<Dk#p?TyLP!5k%?P1PPt
-Ac16^ 000c4a2abd4001202b3 Page 142 of binaries1.zip
P4tdTQ /uy\YE+Jj*FSWRFtGLP!&DM#KMijW=Z&lEWIWlPE<Q+X?L4m:KTwY?c&Lb<@+$pV!F1qNF%SZqdZNR?F
K5B>4/ $%j?6?=L%t<%QE&P>W+!KQh6t?&LF/l^/&+&8%aNbn9=?6W=$=Z1Kn44Nt:h8jjkpYQHnl@iP@D1H$cw
nTAj5D 94=eTSF?/ALdmL^@4Yc6h6DW:ySQIImB%L!!?8dud>=@Sjq@:i4F\/b:#H!9BQ8/kInj9<@+/QdqBm8M
X>+^+@ LB#64C!QG!&dKTcmwK^MK5?i4/#muMGmlE<@lpd:j*^/$@pMT>@nI&>j9iDuB6?<X4eQI\BNSVFBHk:S
qGQ++n tY41GqneMX@qB&&G\bbnKAQPZ4y&J#w?Lci+/pq#=?8Q*@6GB*9ih#ZDn<u\wRcMlh$IDdtM*eDuL%\I
Vd+Mnt DAwP\c4tlDV+lX6aliP5Y8p*Zc$NNYWFYYqJ<YiVZn/6LK!5i@1pInMt%N@q&BE:#\9BF<@+8n9bujA>
SV9Eb8 A+^A!RAQD*e*Q><TTkb<ubV?TAkXKAM!W^Jna<lwecw>?Ydw=ZP?ENAeM%=4&\#E@IZ+KyC=BNT^5DnN
i#RZcQ NSeP6?DdE<JV=cehkPjEP64MD=49<WGy1P4ke*1N\?iw=#SHaha<FZWhk/ZLX/=iahD@<m<q%KlYZ%<1
<Q9%YP LTW%hb11:aP<Ci4GB@ZIi5GTFY5MN?@AdZ@WXE=4G*5/nX6dBt@8mZ>wkTuCJ5aWb^Pnm:QNJkDjK@i:
AZA!Jm Zp%=$qEci<HKWQeudbDGD+>CRRCakXeayeFW=Xe$ab&FG<%<\\9c/^MCddab9KMJLVG!Pu*?hqJJT*6F
5i<jK# <uW8L+66BkB#>nqmI$ICI5K+!WMWC\dwI9*CW%V9Qu@?6Cn=:yW#dk=tB*aa4kBKGQ6LCSkH#IW+RHGi
D1Z+LE dVQ^cj\#?aW>e#HB\<W9Ctbn?\!K/w9A=#iVy86lWwbn9li/lbbV$hq5Gq4%Gqll=58#aLqb+mKmaqPt
t>je1i aTGAk8\W5N^jY1m/9wVkteW4wt##AQE/wSVm\ZATplkZWFyl*u#pBVX%#5F^pme!I#u=<iNWikw>qTMN
YI:b<D YaHM+KLmA&TFS$>RJ6BHBu/Cn&9ICje/8HSWh%SHSGYtkwB1RHb?RZbPj8ytIASTX$#Q<KldcH#?W*Bq
ZJbKX^ *@6a5RA9M/Y:Hu/^J$R>*$TY54!CYe=Zl4QVki*#PHP!e@Qw8b^==au9YbRkPbEC:H:S?4T1MQ*S@i8t
=X:LDY 6m&j/J<bZ\ScD$&u$K6!?@$IlAL<ub+LX/^j&WH??E!u#MZ%*u@hdAXmq6w5JeYX=<yi9::q8q6@@n#>
9ZQnV% SVmyh998Qj5QtJn5*#H\<m<j%FVjYcXAKJJ!t&e?LykRXnk6>JGh>6:Dqp+ib/@emW:PK1=y^PkkEuj:
+8RiW9 Zk:cj&TQbeDqIG<ZS/9D^u8ND&=e4L>/u:YDnaZFpS%/<1Jm5%XWtMw#cAHyRAeNdc?SD9y/Q:*Gje<=
R/5@<N KR@9*\k?=**K$hJ+cR?Nb:/mqICApnyVp$Nde?=Q&p#hqj5waSB+>XdEw<hbSSZASMkDI$M>:#1d1w8#
$D#CM1 W?J>al:kN6JLkijQ+9SlH%<@@:QuL%+P9a$dLpEd6FG%u+MVk^ncG&9L<Y+\Q9l6\=Q!561unjWq1R<8
dhXTn+ i#5eNn9lH*\q<I!9t:P#?*qe@MaTBpAEQy+9KGZ\/j%EPED6ITnBmY4J<hFSSJSa^ANkw15Z#*mjenA@
@:TP16 9Ge%<AAecIEYa&FSEYFB@6t**+%B>M@**E%IWtbKE>qLjGJTb=uVj=&TIJN*Q9?WFijKZ4&/CR>unw!M
jNYltM 4MKM8Twc&44/m=e5Y/L:#%t81Xc6Cq5=VWycc11p+8PCHNaGYPw\&&uyL<FY/X%WPlBw\N4Pab#GJT55
Zik8wu InSBAk^Sk1IARy\AGtCZuE>^\AHZpLTG>1LIM&b4kAN?$dnu!$$X+Bcpk!!Rj$WV$q69/uM*y?XJ\uqL
:A^4Xq \+ZhNCHhDj86*aQCM?5/u&cFe=&#N%1K/JeTHlZmyjRA\H<EwC?lu69XCt4k&kW9nAk&4X15D@EDW*9K
1mcGE< SAbkIl=RuG9d@QHn?CjmM*@#Qn+BAZ=i:6t*&d1HJm*XCJd/!QnAkLBk\qI:?cc5PF9K56V5KaJCRmLm
mj4BJ? W/bKTe9K!5uLT9T@@A9//14dK*n++Cj!TCdu@&ZL?Ih&Y9khXDbk%t\1RpDW>>FJu8/:1WtJTeu$^@RW
#<nYWb >qRIESkb#DSGFth&Rjl4Xk+AZhn#16V4Vn5Yn8pP/kmyVb?>!TY*wmkuJ<=Ii\V\L4ywl=Z@9dT!qlek
!=mww8 AAawAeDbq6qSQ@/E4PPAy+idD9k\/XhcAyEBB+Chu58XW%cW#QkH/Jny/&y>YyGQ!>PQ&#X@yH>mjBb+
+pm8$p bcp+e/cTky^$#I5lPFmBYw6ZGI!P>Z!cPEm<Q59p5j=y65>5INSq#y:HX1uPuK?lyYeAy<J\!:bh8@j8
j4H?=4 *Yi$hiBq+%?eX$Y5p%FWt1+kL^>V>/?FV8m9PHDe:yS9$I&IBCwciNH>tSWL8B5jNLI?E^#wmYXB?@ac
:4F4un :%&n4:@?wI&>lbt=!TaNKSHJ?Tw1e%TWqXYYZp:QBcm*5/AP<XR:*tIt^+bj9*VG!>ZPdL9?X=1R11KW
LPcLX= qKKYDp$LpK:^t#bVj?NSK$h$?hj9^Tbq=JjXNZY<@9D>>@BR::9P^m4MIWV++Kn\RIC=6=i:&&ueFanL
V5#iw& R*APiMRnhQ4Q&q?<@RVpMN4*+<8:X?%NhiXFPYuJ6?KiN>TWXD>ydK#NT:\V/Gb%%Md>@NW4F<:/8dte
awF<4H ktnkZIAQB9:aA8nnF#bM8j!JGAC*Hqhm\WF8bq4Tw/kw!ekImAH8*L=??YIAFRV5ZtZ::AQ^ei!V\K9n
M:wV&C IqPtmI5I<pY@GQqMjlJwDlTWuCa/P9d>+<RS=9bbJ5nDT?&9t58*FB?Sm1#aFEqyPeYb<%VWNGm/C@WZ
nHT@#V GYkQ9KTiEC9EXc%<5G/K6K!M6NT$1L45:M^Ju\@QTG*SMkkF1I&?FN#6uik$#kXVSWRa@+N&ylky#mE^
4@RVSc VaYC?<FV%#Ki6iZj>#&/A8DiT?NSXb\1ImRGqMA^SW:nLRB<>XG9P%uQGyLPt/@ZjWMVZL4F^M+:=GF^
IVJtj@ Y%6SLNhq%+M4hip$n4tm\tPVkBeVHSabFJ+mItQVnptA8=j<RQ@9*dy&1d:8!D<=Q/14iMb$ldt&VZBi
?cWbjj Q#I@<d<<JkBcRbCQJ=16c?kVZ@PFCZM^\XnMh##hp>dc!ejD8<Vb+?k1FTq?jkElaXHA:#VkRBqbYStJ
4eid:k kSj@IL:m\XwiRSElRRH?!Ny5%9!+yMTES*E8?yLw/YZqJ!MAC9IpuiT18@M+IZE<tZnMqpI<F5H?9@T$
?\BJ%< 6A\5*$6Lw$KAmK+iWkl#A6<@9Gw6iSSw9ubW6%>HWF6q*1wVh/1KC+1e6EaS?BBpBejt%qG8miZuPej1
qq^qBQ /^wA?QYe<CS4^19JK9dKC1KeA>DQZqa\q56Sqqd@nd4lt<LK:*><A^F#YX=K>J$4S?&iEZCw/J<E*%nK
IF$tFE VXhWWJCZn9\ALED@^N>\caGi@mt!>>QEwiK:8AJAQHQP*Lp?aF<qSW*NtWy#RWN1/Sw5Ydb!:jyNY:d6
$>9w/5 &Lq4?+bB!qAV\K?M*mkql@&B<8i:YIKIt4MWF:6Wj?>lK^j9C/Ek?9QB%Zc>?amT@<wqq\QGSnbuk</=
wWF$Pj Ph8bH>^46H@ZCq*>nah6dC%Mn?>dy#yXSG1i1k1yMp6bbjHF>N\mSQ:uu<MncDZM?tet^h\N9in9:tJ#
aiwC<Z hIQ8b=1Rq9IMtVp1i4w/i511&kP$YV4LnM#6ZNDJ*+/MV<564YuAATt@l+h@9P>51MlQV+m/h>PHYwnn
<mA1J+ =ZdK%eZJ$eHBph1S:l%\Ijn/9Sl\<>XQt#6iAi6T#hBWd!V\euyCiE*Lp+1!iwBWSYd5nVP8^$!h@T/F
THjQJY BF<+/*9/yPjF+KD#=*!<@nn=EycVS:HjSqZ?XJbnjRE+?aVamAk!kk\Z8^N&E::dD>:J5RM:X>w%9aiu
!5ciQ$ <FHw$&6VIZF5wSCI?QB^?JNAR^C@^BSV58jnl\>$PM8$:5AXAqT%NQbw<9N4cmkKC+8ITW/Vpb<?a#bm
MXIJ#D Z$6HX$>ZjdD4L@K4XC8mDeYuT8Fk!HNhPSR:W++?Ltcy<5IqK>jm#FTewYdPkn::LAA<K\%I+G##CjA#
V>XQ68 ^DnFJcc!5G>!?pbYe$9PZe?DT*S?$4:na%ATE+e@a5AP&8<B?<5Q86*PdGlPkYP8<=wt1L5eJ*Qe!Z#T
6q>CVS YjYa//du$dY/DB1H6wLkGFZ&^$W%Mw!LpKJ$pSFl<Vu*Mj/QDn$LYu@@n9ZLDQTG@=5B@I9@>?Mj8D/?
%JI\!^ Q5+uRkl#CQJF5L@@MQ!S:?tE#Tn$E>$td@@cVJCjq%hVR\GZ6R5KmiDKm!tTLAcRFl@waypM<X>bEYZI
QcKM%y LRCBq=CRj?e@Dm$8b5uW9$/jp945C>R=^?pph@P6=ITESEaTM=q<#AtcQ+XIbcR^W>p!5Cc+IPyn:&RC
c%bdMB +N&Ly4\I:+NL^*S@/RnV6QZXD*4pF#he$X&wy<QRFhNhcHne/%b!cVQq?EjR<ZPZb#dDd<aAB8CAZ+>b
mtm^w* R>TTNZ#XmD:+ST9bT@LGe#u#T?QjIRqMud#pw>KAyVuJWde8Hdb9I6:VkRaEZyuJ!M8BLJVK:B*:^QnI
*tW/?p F#^jW#PT@M+/ZALhmec!C6Py/mc&?eR<n>q#b<#CM\Z/$YDJ<qY4%^q8*LS=!>bNc\i:KK1e!J*GdyqK
ZYVtn/ :h!X8@E?d<JW%Nm>JR6*t=k:w5!QVepy1+Y+@!NL=L95&d9Z>p^R\Equi>PDi@ae&L/EBpG/ndYy/bHh
5\^mki K?hImCtw1KwTKnNX%>&cbIBjI<P@9:%@$j1pwmAnIT1MC916D1:A=BJEtuNtK856ZKI=X$6Li=k&T&@D
yuYA?b IT9Hp%=uk&?E^+LMS>YBw\%Gju:wc1nIT*5WESacLHDiH@eIPNudYX5SqwbY%6kR=?dqH+lXCtq==XS:
^u/4+T AiaMl$Hy9?:EW8VenMCa%5dc581una%QTl+@8PJnj<#c:h#XpKD#b:^P8@pHZ\+KDQAt9AmQGY:8Qy+9
N>8Q^Z S+h?>&Ida!hXdq^VYVc^BnDyWe!D?=IQ:6?:h?jY>c6BPM#Q/8m?:e96t>+^+CEJ9D\tJIcB4!A<ItBt
Kiij9J utB?MhHd=DjYYib@t&k5#MMuBBE1IW/K#SGSFBVG<$mXye:CWYn1/yycNC*Xke+@D/m1R4W<bnQIk!u\
5WX@jq \899e%ppnce=NtdJjF*eA4l%==+Dl+?ctX9bPDnVcV^#^cmtQ+LmAKawp>XDID+t^n=hp\B\4#J^8=Zd
:!VZ/n ?m#4%8t>m*:R95I#WFijNWWC+CR=T$NDG&lbb=GS/@Y$l4c5aK6%Pm>yAk6ZG%t+Z+p9:&nI=k4*N#eE
61bAe+ ?LQQFl&F9&C!nRuSn@eAEmJclin>:%\E9Y?!i?QKSZw/\*?>Q?9CV$qSjw=hI@Qh?H98D!?Q<ApJEaL5
WLypHt jPq5QWMj?N=jAu9hI4?>b+C=tG<XE@hN&A6bXXSIkyhjTEREB?JQwYdqM1XIcZ$y<aHPj/BjH4&bG@R?
h=%YdN 9/D\%Zi=Gc!\mFyDlhkH19$9>4<A>898J5ZHJ#AVtWtMbI/p^!un1RRI@\\5@GXLwVJ@w+Ma+>hq*D1B
HVY@LS mu>El/CN/kn1cm^bb=tbbL%dq$anAQ1Lh61in<!1Rc%K8Z:R@BukQBn%=BMijJnw@RH/QNW%NjCL%4AZ
q=Y\Te =GB\Z@K+/85E<QGmn<4@%^SuJWdeCD4p$ET<w:<uQkm<PDaNICw44$V9G@#Ae&ZPA6Zt<Y<EbTV!Ld?j
^KM#t/ MuYqPW>FGYe/ie!jm<MW%DW$6WFJG8CeN5T?+j1Xk=$5leT/MwuhMRYwW%y??tB*LmYS$QM@nI%i1LjD
-A8K1* 0006e9134d0001202b3 Page 143 of binaries1.zip
t5u9Y1 ?Lnhcj@L6/PT5$y4t=/@ip>y@pDd9Wd::M<E?4p/&^+@5Mhw@=bF6MZdn66aHD6?cMhmJZH^YcwLXJt1
j8p6*A TpiV$mna9@u!i&V+%:h*qJlJm+?+hStCi\eLw$X9caLcc9QtK?941TnQZcA=Sy865&THtT&/@bC\!ITM
\QR+L= kuLRG>%jjk/N@9:W%XmSq+yNBIEBm:#eeJC+lhu^w$iQHDq/#NRM#49Lcc<#RhjA<YeZX>R%6d>+>@ZZ
4KG<P# <Glj:?i*Ze%Q<JL@@JPt?54!P1JlbXX8QCl?$?QPQyhC4q\<:?@l=u*^!8XLkZ@e9yhH\cVdy%1S/4HA
l?8@Z/ 8KRIy=qnn?YD<Kp+6j4P#i5a*b>$5Dm<h>6!l<d8dma<IwG8\?mkSMYu$j9G\HH^ZPEVEZ+&@yZ=n6uN
%e/c#8 iM9uN=idX%BIYGI1IWqPuTMyLmalmV8cbLFblTyBt/?141G8DMj+D?kB>dHdSeDBVbGYG*!dP<uLiI+Z
HbZ18l #1QyL%$Fpu@Q@pNHVT%\8SPh&twm#M=CQR+$R>Tn*^<Za^hXa/KeQ?RSq6@YpHd>^E:>H:TQ?A^tKp&d
B6SK@W Au?Bww4GX=4k\m*&q=Q4&9ND:Vdw9KAJ/BkaHuR+G=:Z*FdEFZ9Bi4Mik<ctPMw1<^eq^RlSqBiIiQFb
NMY!Pp 6:G+L#4WH?V?um&4F!@WHb4\>/KI?IpAZ*/PR<Ndbnj>ueD:VlNidAISqcT#@S=<#*MbVNW$@yWBlmLi
ABZ*ut <QqPtwwl!TWlC8JwSGIF@JITwN8qymHRKRP^:9^m6uQ#<R5ImwwQ9M*=^<hHL=\1Nmu#YbE>?\I%#qIA
8<DEQW iubW\5NH<WRCA^\>G+l>IwXMSeHQllI@N!<iJV=>bACm?+:KyGD4DYP/w#y$&nBAZejkkKQLpd%4F?9y
Du/LjR m818QHA!JL/w1c9:M:l+P4l+n1>J4RRE>uX%SD%bS\LItdXpHXHLB9@t1Kt8b$G>wDn8+\VWJ#Q:#^64
GB>aYe mnMV:q?@eNC?pRpumjqi+J&NqC!+<itj/h?G*9NYi5^Wu9i1@\NBHTTBIt6<X\yK5<dIH6K1c<QT%c6Z
\K^+ND LcGP#TT1!?MQTPCMyBuuB=>q@Z61NJh5&*jM%6Z*$1&I^It5Hid\k\PQHhm^#?FMwI?#5<&^@WbGi\*%
mBqF\4 cW6*tq1bHVq&aI8iuPmW8YwLFyC1M^iw:5FcjAV&%>?nR#?@htQ&QVeX5*buMbVjw9iT^1?lw1!1Qu@Y
L1%PCA >Ju#/dVb8t5PYn1\ZHqeCwn=yw+*u*+Mn9b>ijt5Mm<qNl!?$eiN:+TDnaZy$WMHD#CNN?@HnXJtXua8
K*lR+Y dn:u4pAIpJGQbd#Q<h5t4lKjXJZp^X=ycck64c^@&qBjplaX+8hwcu$1+P1%wMB#jl+ib/=e9S^$EieI
hn>dm! EB+#*V&<@F/QDwI4j@?G$9IR^XiAJ<jb^SM#T/dk$1td!G@?<C:MVjb5YY4jTMBSbaCm5lATE=5!hi1u
1=%6d* <Y@D:@uiXZn\Ck8?/u9QyI+1j=E%H\?@kICR/AmDPW\\tFMJb5jC&e111uMHP9@m8F!%LH/@MJ^HGaW#
XIm*I: <EkwwtYh$!nN?hwk+Nh6&tG$#\TBdP9pCpBYF9$QpHuBta5A6\CY/YIewmK/CPa%S:#8F4ZZQ::18EZ9
uFW/ZZ B/$d:D=QVlKkLDXnZk@I>dZt=^>Y6SiFPY@Y:cV^/!:daib^LcZ8iTXZR4DDNu$tnWNhTlm%P^jq9Xqa
9VnLpZ yw8MCw8LLC*y1C6IDA6$6#e%*4+PR9hBC59mtlwcPBcAlYY=&ZaNd^l9/cBu#QtESWTuVQp+#9b%/B%9
>My%a* 8Ri9pPDL99j$6+\*A1<L@>mul:tM$camPtY1yGn@<*<AZQ4IGGT/mLmp*$BVJm88wV^%qKaaIql1IqCj
iBn=wP RQBdPmthpQkw:mE+/@kE?Ce^IVE^AieBQ*/eVKS\QW=?uJ!PRE=NRTCQD@j%jH#XYl^:=8n!Mh$^uZEA
/FWll5 MqPZq\dB=pyhHb4I!qXt99jT1nDASHihRZJW=#>l%yC%BHX9V>R!/=m%dQA=i*$JKQTe$6#eL@>Fd*5n
$\9q%= J8HDR<<h5G6k9GX$p?<Ejwa1#ymlF$1u@@yIj$>@^=N1MtQ8*N+9SDj>LjPNRI1^6J!<A9\bH/Q*M@8I
<NH5A> *?!@j6Q:4L6D6Ba6Y:qmES/dQ#k8#Vp#VR/myF?D#\5yFeN!##GtGt8*:n%1e<KH!51^kI^b:/ALJpi&
Q:IDPL :*W/e>:d^euttQF8w%%4hGp4>=lbHnW=ct!wJTM/dS+AtXk\R?NaIwZnn4hj?$cHju^=&>qWY=L#PDd<
FQIhpa iqCAB\Vtc@HMcGtw#btlPGQ8HIkab^65QY:n:IdiPTw^5+k1yP*yH?*:?41=Kn<%>6/%m\Ei4w=<%tbH
8V=cuj Vjd9M>1>p:qn+$/nQeatS$!6:E?+W%XE1VtFbVmpDF5B5ARR?+lL</?tNNSYqqZZQ*qTtb6\>/K:?ZEH
*BHMQ! 4+9wuM@+iQnAJ<GZ@L&<CE@Ta/cd6&<C#l*/>1u:XTh%@%bhWac?th4q>#D/\d&:W?@i8ZQ4^4Y4q<:=
j?4!$# 8%Q=8M%L+JT?Ad6*C@!<LCpqyZEbu<wwTCci%IN<\pI>u@Gap1<FH8>DN\J@^pib<FTa9<qj=G?md>49
*TcQ8? 98/RYVQtKm9QHunPim+I=#LX$y\AeTtbtXd\bA4?bXlVDVZE<>1N&#EZb&bydih!pp:nXSZEVq=BRXc4
TeLJde H8y^Hk4Q+8CdPaSqqmPi%^:%Dm@81E$M6nZW@WF:ViQZXFhX\pEYm51@cII/T$&<I$4d!<Lhh8y%$Qn$
^JiL\L %^%\Cw\6j%:QuS419NMA^CnuHGFB\jF@AI$nmlkWwPZQhD$4!+kM<ZP^MNtJ:V\DNFKdREC#=u\AwKe4
<ZcR!V AKCj9tcA4jl@ZBcVuKwYVB@@!jblGQChkyd/@8u6Y@wd+nZ=T8n^*kqdna*&>#QkBDN?ej#8k*<9i^5m
?PYVZh I+#4KRe/YM#HK54JD8AZqbA#@#uapb<?GdhRywL*n+H+j\DiTmh=H8PGl$jWJC@&?ASGQAjkt$ltRp!i
WYLb\! qInk#w84uEnERWDbqBj85e>kVHheb\#AQcdL1WQV$lVS*Y^@MVd9cijdV#@/KjjM>!EYR8*K1141<S1!
94XF@m t1lBaDQBZheZAc:#mlJ4@q?+n45de6da@mu##jldn8=jDCdJ\^n1?hnh@Y/pt!hMV&u&$wE9VLAK?X4\
$>S?MC %aPq+JZq=iSq?#/Sj!wW!BhpF@uCH9e/=^/jy:h+&dKFk^%@ayV!$6K!q6<pTj@>5cZwV+ICV>F?qVXd
jVWju! >l!&P8EViPM?b6$d&%?<D:5Senuw9MtB4j8e#=##hHc$Q4^*%?:6K*X$X8<#M#>1etnQ8kXT+4I1/ty1
>>yRG@ lJ1Tu55p94@%nR*??Q!tw:G/PC5==t=IIBX&L&?qpX11Gk8W%Yp$uSZ:LP^hKR@>pJyD&jZ8Y>@w\Li*
$QbeSQ ddYFcZH*R9E:dM#*HVW^N5KS@wad%1<**IkLP@ajMwWw*j9<%dDwbL#dj\KK@i69DQQj9Yl61C=:hL/5
iwF4Fy 64K+4L1891a+Li1c9@M^e%j@+K6BF<:/i*ti8SJ!PVnIn*LSyQ5MV@jmpeHjQX@i9/c8%DDay1ChueEc
T!kB8$ nZa*nAmV8IWnE5=SW:MQ:N1$&Q:J/>j$N<!*:D@l!ZDCp@p\Bp/bJ$!VV%B6+A6<Bb/B\AN>H4^LE8D>
@CMDtX @atAB<X/K5\8jDJVP*PQ!T4Punh@=tDHZ&mZ1ycW69!mupy#aia@4ny/9@ICLd%FK>b8*Gc$D$T*JWai
maY#Cm +#SPWKyC^B>p5+p\RB=#VCB:@nIK&eh<H=S%X5WHY1+FbHiB/Vp%XPiy@/IJ/P>$9b*ZXlQqdY#RV8QV
JF\:L& Zd4D!m?<wP&bWNa6X/NFPnVcktpWcXBD@:CDS+\ymu<J=6nEbwc*%?dH*\=$5#qm6AqndBc1^j/mikck
=R1ciq iydhE?IXAZbm@$qHK\%?j#@+q8e&&GlB@&eCAE%@JjL!@q<n9eFdhPIqdwAqP<FPue6!nwpJmW6PES%w
FQ4j$G @\jVJcZNaKN^6NG@>BhqQE>EqJXht$m9W/BPB>&hHleZHSjHiEl@SMb#A/AVE=PbTWRmG\ZwtGwANGN5
Fl:i6^ /NjZh%*%GVih6?tNA/BHAhBD85I4Vh^8JJi%+pA4!ph#N5XZqBDquBYAb1KckA<TXDah+j!$KAjkZFAa
Vqc+/C >^*lLQMQuJ>YWXhwb@jbQ*u%C5<N?bd>a\@#F*99^@/*QJ:VFbXYjQ4IAH5\ZkuetR&@9=!5uP#Q6$Ru
@QLNJI &*Pmk&luc!Nc!Sc!ti$b$ZV\<F#6lRcLcHB1c9+k8cTp59Z%1</Gpy#MnEpXA=+/c4*!@+W!S6IZ#^<!
1whHGZ *4dQ^j?e8:PD=cE>P*b6ZW:VZY65cp1a<P>iPX>TVGpBQEhTdac/4lPF=edu*h@/RRB@i6%PJhGn\$I8
//w=$I ?J=&6DSc@IR&S<@\1LYVt><F<M=JYWZXne@jj9p%QNV#44&?KQ$lc!/p=VEVQ8Qh&#c6Z:61^ZJmtiGK
b>1jiV qY9Yd\I9hhnM^6p>IQltSH^1XpFbdXMH/=48?@8ZdR$%bjh8XXcWkAC91TuQnkj*dHHM%9*eqe8B=<:+
jl#EaX iQyeDL$TjNuQm\uiibc:y?j=n!#9@BJENm6!^6de:C^e^BpVei>PGHFd:CaFaY<*J?6n?*h8ZGSj#*#F
^i#&>< jM%<\@/ll@nJ<c9*+?Bd<k&9=%Sij8&QH\HADDmKZHjp8jpECH+8*l>9P/tHRdcS4WTLLFdJNnW&HycS
HqE?mn t#F:nlIe#?yJCJiR^e1XLc>iQZ>Tpy$^/ZPw<:q8DwZlhjnPD^$#5:S^QPFGy*EbVIKaIa^V8^DCI\Dj
FWRC=q 8RaI**ZH@TLLP!6m#=18BQmY$\S$%%pFy#a%^AeeZ6yK+>W*QPy&QcPyXVn9ny9^Eq$cdc+wby&^>+Wd
Eyn\!u <\F@jVGAXu^VXYNyY5SXQ/jn?:c8ZdJR6=<C4eRpcKt$8N\5?@1ZL?qkGdAL<!hu#+e*d\dj<H1AYdR?
Xmq$Yb jkDE$9<albP*><&jA$1$4J&\TeNlMWFSCRulkjb@IF6eZEHbyDmdP1GVjnl1uhL@C:Q*/CSZhqS5hA\n
?q!m!j qu^IAuA=H+HkJlJ=AdpJn%K!5ynbHLtQmu6JITw%>9u6</4p!>d4^!b\P/#Lymi<$h#@RXdh<>japV*P
u%jHjH #CCFK=PLCkwLm$6K!*A@PFHBC#/=841tF4R&Y!&nn4$+F&LpuKKm^M?5byeJ?L/kd5Bn:%\J&GhZD+al
iF:RAd Zu>:\=6mI1e\*cC4G!tM?bIna8a$yk!u4M!Q6?S@EE5?I=9IS18D5#Xyik8%$CB@IF6elIY98hS%>#?H
?tKRN# ^FyZe!$L5!^=ZaZ!?6b%CJQQHVdca8#mF+AZZ+iM68@e9ESLd>*?+$eQtJn5ZDbZWtKYlyc/P1qBcp+*
=mqn+< t<D5P<B5j!>m64I\I!H!>yX#*mj6#de6BM\8&Y%8=?y==lLqh56blZEnQ>+@j%1cGS>?LhDuyJ*=pj%G
C#H\kp 9N5M%/=e85lkIXN9k:+BFuh6Nhy@^ML?yG@k6jC+bFaS#e8Q9SBT>*\A%XJZjn&!8Ck96/T<w4\kNi4c
C1VjWM Gbhn^^&>k$BRu@Z*>A1+Aw4/wl<mh4c:t/j*#SG\:&h1et<nN4CXFlhmlYqGcnJPFL5Vhu9K:X9khZF9
V1Z5B* y@eyS/5n^n5&GNnXM?ES$F@@i5Q:&ITdl&>B=%9/K>!?J9BAGwRlH^<@uMt@MGX^J6pw&ZBATqb^=m#F
$>/tbc kZd1CXBu5qm%1LA\u!w%bNEtBDmW4:ZYucuGA8wPw@&Hny6d&V1j>ACk4lAW@A6WNlE/BXS&WRWG+HT>
dyFTqQ tZ>$%jP!KL<nT*X?$CywA1Cb@YJ4Y6MD#Xc%$HmyC9mp8ud?w96iB=eBV8iInLGGXwm!WjE9C/KmWqc6
-A8t=R 0007376d866001202b3 Page 144 of binaries1.zip
y$q:LM %dpQd=+@dZXk^@1qB4y>@!B$<8JKh1bh*a5ZnJinaIil%@!WHXTj9*$F!CSAYRn?5WVQc<wRmE$P\CdS
$<TS@= 6LK^wiHyAXEBaZFAb>5j\91@b=F!1DFS%nymE?mW@^ihER!Tj#\#Mnw1Pma&JwabT+@nwLJc%DC1S/tM
LG??51 dM/e9JmZCE+1q@Y/HhVa5SZ@kHPS$C:H+EhF##BdPwliXayIVe@P!5:N^+Xb8C?96AV*b%SZMc6JCIR=
Yh5j=$ u^VqIDn#CnLV@kZu=*@A8SiM\uk=@twWGH*5Nc?j84!Cwp:nG!bqFaH+&XPqbYVku??9!Rtn@MYuVeQV
Q?dDLd *dQX6ZS$NPB+XQ%jkGbPGIZqXHiyLX8*DRJkX>?kY^GJE\H\Lan:AkNMht@i/?#4h>4J#6\EEL4JRG9l
!CGb5+ lkNHD?<#&d>n!c\yW?hycY61pyw#6JaHJcSl4Znu8?<DYJV!18%JSZ=cjMSNKyF%*FD*KY&8:lwVK<jV
*Hly=K QmB\\c5Y%+I\l6C%:%NZa*qP+wQ4kV/8htati*h5=F/:jNFC*Qc<VpjZaPt1DX8NDl/*ejE/B:wajGwl
9DPV1G b4LjjRjZ*j9^hZ6VZWZk+:#56K!CwyLmnEh*LuqbH:E++S5WnN51Qd$D4%/?hMtZ<GTCJy:y+j+AHi4H
MV#GTN 6!<uF1GX+bS/PCDa+ScLT*^8pdepdq+Q9Sy<IRB4=w:5&:FB*:c8m+CuMAApPjcK%$?Xl+h*Z8PdeZkC
qR:P=4 SJjkI%q8Zq^l#j96>S?jMjpIynW<jd1d8wXY\IPJn\ASYpRYKlhRCM%myTAtZit8BjQXJuJZi@ajQt=l
9#Gqa# a?><&w6B+>bb>hib+6\1Fpa=SGj1wDQhaHat61cnPML:+GIYTQY&8aaX6Shh5%&9$$#nYdLD=q^5bceA
\&Tumk wukqaFSSRGCeAmpdJZ5lelabFlcSPjY$KCW<&Mj^/G:DFRc/9@<S9u<Scq9LBE8M\Zpet4SD\&5C:ED9
6DNN\t E8*<a+m94>4d&@:BJ>t+Et5nhk5LkLMY:t?dbKy@#!KqiCjhb?VPBWK5RQc@tc44DJLu/:YwmMmwKCKc
X:=m+B CX/WM?+l^4SEAluQEjea*ChANHc5F>QN\@%\AF8Kwu\QLEdhP$IdAh*L6qLI^P%&cqZ:/\<>jiA?Z=Ep
\>Vy<q eM9W:l8Qp^/uyGXp=XA:N*Anctq=PdPC4GT4It1+cy?W=4J\?4nk<#<l:X?eZ9djc%6LkGuwL*6j<h*j
Wn5hll IR$wXe5EBwhn$!XRNBiwSlyR?8*%9^kqt1!S8J=8^\uh&8wDdj<9nQ=HX6k5t4>m@Zdn+*cu@C@hm5J$
4ekE?c M>+mWcYbH46&Gi=%>9E=/YSuhuD*>8$d>LZ$DR<ePYl$eN>YA!XJcYXeX/C$LnIlFSDc%Qt8B=#d>\<9
w=w=4j Y?4L<>Ii*d>^/a!Hm<&SNV1AWQ&6y4a8HkFB%>GHX8B>$/?SAe^J=TXH*4nw/&yui6Bw!:wXHBAhDhHY
*mn=aj /Pk6Ztt+jh>lC$i*kPBdpR<lckZB?:#:c>@w+A?eXFPj+y9\PDplNT5*N#M^+6yb%&PH4W<GZIKA%ejV
4%K9c\ $@@T%iCLkj:wP$u*YY:8y=L/j%Lnk65t+%WEb&ac?M/H$R@8*4=%p:kyjm*p!1Z#@q+uEb#\Qt%1P^qk
!cMb+C ?bGZk/<+Z+d9+CX+PKhu9u4JlDNJhkwZKj\>qK\#!hbMWNkpG<mupp?&V=MG!TM@$QwZuIY1qQY#@*Wd
8?9//8 \JDS%w6t1KnnFhH/LXnyn<G11:5*wFNZS$CalW+t45ZC1^\^N6E^MVaqBp%R%>D<:KP/>5J\D&PDZqwq
^E6hB4 iNCX=yjTtt998&:XjWdn$h>p=l6i@J!9/8Fb$:Y/NFX^A5BJCDNF^/mdZ\Ct*LtK4Nn4b$>cGt>iBVd@
%EY$NH j\BVZuctVR$V4MAAcA/@=KCM\KGa<ZK5m>EyYDlykT<9@*AVayK6kZlKQqt/uSw!KN#j?9<Gbiyje4Ji
jY5ybu JAY9@KjRc\KX\aDKd!GS>^>ESBJS#GlGDEh5*EQmEVPijDkJ!6#awX=Y/llmwKc<eDenjSawS\GW:H1G
1<1MRk R8buIuPjh4*>@HN\qEG<I+iJN/VI?/6SWdF^<WtQ$>I#M:N#mV!J@CKR8Vmh4KK1CmS8bREF!@!ClKj@
l!@<IT kTYYeXjpyXC\6Kpl1PQS?=I@&XSJH5i%J*WkZ#E:Bb1Myp4ljcHM>%jpQ/c^yXD==Q:&?cwctywLBq6b
h<iKGy itITqlQC/q>B5Xyq<cyNP\?cP:lS^h9a&9u<#eedtD#&&LHheJ?n6+?4w/*b\X*d61:X$#Va9Q?R5hGB
=?q<k% QX5YVy<19+BJI:Tu4\:@k$51Vu!BX$AyeiHZk9#huc%Nqn?q#hNb65@T+cR*Z6<pw8N<<cF*cLm*8:Yt
*BN81^ MC*&h4DjTaDq4w&4q?m^/jVSb8w6Yd%y>$FV8=P?F&@en$uA>k=Y9enRn<>9Py8jyuqEEDH!<a@V$lKn
l9nHWE dkh=&S+/a86&FmDy/?*lhVaaIHtG!k?V:4Qh*D$<T*:*j9*\=pW:K\LFHBIqH6BnSwZnetnmlulw!PYL
WBQnG/ =@\>Zi*NYcC5ie:5HP?m9^l+!bF5K5jkaW>5y*jSP#tjN?:kb9J!k4h<!j\jMJJQJMP*T$4JKTnIDdd?
RXIP/t beJC%WpS>+eL1iP+Yuti11dPw8Y4Ddj6^4!\qT&84/LVPFWFlCFTbAIatj?ApX%cm+qw6D\jZ>?Yh?i$
+T>5W? pV/mpX>@4%hMdZPm:#/DJl1Q:64D:nj#&9n1EkI6DjX$FpmMWVQa&EAZ>+GMFSFS8%&RBQ4C@5kPmDN%
\>%F4F jqFRuQK@WK#8iQ/e*ntCuQTCI\ujQGhmi^i<iiI=&eFB9Z>8iQ<9Y9<BI?9>L/<Qy?AwKnVR\tKnTVSP
51kcRi TIXJ9Rb1Qt4%QCFlWR1P4MwLFl#XPY<BHH>ei^APiCRApQSwulnA+<P+S+!HHLFJLDnG>jiTkqT!>%*Z
FJ&tq$ $<^dLq9HKDTP/R#15l95FHT<uFDT<lL9d<cb:$tCGGYT^F6!>5iL%&?G*d$jFai:H%QT$nM!5<FjFqKk
*#64Z5 LK<AaX8WT?ub@KK+RRTp>Q<C<9bq@#&WiSmha%*>L:mVdVRBpIRTS%^VJ$EbTKDNp+XJ/Y<9@m>bYh^e
<lcA4H N%hFVW%h8d@qQ&V%H:Jt8ey%/4SqGHFc8umiC:*L/4D1Ap!GZA//+Lqnt?EiB!>9F$hd$\M:6&=iycP=
DF$aWj cM6?p*%G?+$&/mlPW%LZJZRI&9TXh?MBqNXNZi>:l$b?a<FFZYuP+%lY>6b1*^IAyi:/I=kn8wnquPA4
T+\b$N P:1@>a*?@9m<HtVw*T85=u\WW:Sj6QX/T>h6M#=1=iJ%IjS8JDbcXFLl/jD\#!>98%wcMp=i8*Z:VpV5
JH/5dN w$hSh$LPuDLdD+kMPIPAhQM?j?um?ZP?Hl=aV8FP8M*$P9jq^:hQ:%=%69/b%ybDCWu\pnGS>&:j9HtD
hjd%6b 8C+YilWR/ieBmD!<b>9/lVdXSAeJ=@JHF$i!nV1hB&#?HC%PhHC$85GS=AIZ?aK!?CRm$iJV/&?5uVJN
RJE<tm Xp=iy4@qL!ILXQ>SJ/\aH^*pP9Yb!t4cip6Y4N8+DTNM*K:6=lZAwHFyK$PI!cAeJCE!@liV$#RSp^86
=$d8^S AyMcYuN88i:R//XX$jl%%64h!G@QC#/?6JHGw:QC?MVX>Gc?^5jBhq5NAJMEQ:5AQ!FACLILkdeqlajB
<IIi5b TRyLdM^Nn\\JeDZjc:lWZ@juQ*e^LGA1!59P5Kq1b*aR#$jBH+^&eTTlEdlmG=>*hnKjM#w+&!p4wFDw
$cuYQA ctqyBmQ<lTXb9:#8^qwAy4CwaH<LC=hF@+QL9:!$Vq%RcDL=<=?T1J5A#F<*:6$DbBIAVZwWS*SM#Fke
a1bCJ= b$^Cbk+#t<^ln@9JR8Z94>%hhYplhwc5&HIWWdu5kKBdYFw%Z6pQnNCJn!BeB\CX:<nbu<?iQSh$JjV&
juEmZM *jDI/LlH<auJn>M!1Y$^kE^MCyZp=dDWc<uDH@>jduKQVSWDV5h+b%?Z$A$VdZuYyDm*\k+tuBBGB>iL
P!>CA< ilpyKWKcR/4<Bi8E@MYpXZ&hn#b!n/4!:=c@uIZl#j>!69NcNhZFK#j8MD=8C%Htnj8Q$9M4u4b&hZ?t
6ZeJF: WPt>a<6/I#6QL^eHG>Q>P:h5ZKGn6YmL<eE>S98MNtkyVJ6N$!MAq>NZlQ$QKy@XqtRu^?D1#>PPF45M
RKZme= u6JtG?\\5<QLq%8SCbukKX<C!kc@9t\5!$1+H*4P*hHebJjl<wWEkHKqn5HKVWat=p+ib/?GQalN#m\w
K9pFtQ 4&>=kV@+%>h*L>wce^\D#q<M9laYj8@&%jMi>wj&H5clSh=iH1je9T<Eun94=?XJiBAITe?AN#%j*4@B
#eWt1j dW&5wBIStbcGjX&^WR@8+w:w1hi9kZINDn#4/?=1b*=+H&DT811>uR=He1CV&eZhij&kFk<Qk=jnXEEH
nS+*e5 <#t>k&#u/KwVbQB!<=S*@ZMk$ibT>ZX%Qqy+\tTq\ilqp:DMX=&E=V>WCFcjny=Tj>u1>X6&kZA%5:S%
N*c=+H e9Z\Pa8+BB@!H%!!m+tPm4FQyYC=!Tw\8dEq/+d#Fq$KqkaH#mR&%aW:dhBywHE9&YWHwBXw#kl^&4%a
VtBd#V X&$KH!@BS@K#byb!kKeeb+$wElpTFlJjqjDwX1C:4et&qRc/Q@+QNMFu#4C8dGPCJbl\A5e/8j+aI4>>
H\i+R\ 9IQS#6FbC&dk+mu4@BiY^JNXYA#mw+p%!<IC9=yb=DRJT@RH4KQHW8>kBhEJj#pSXM:BVtZ5W+lppH#>
FWGueX N?:eSYA?aEa\I5pw6tkml4Z5mDM/IT8Hpe&SE@<h\MpaG@#%BdP!\bb4YPAe$^uRbX>9JuAtK1?^/>*Z
l#CDtD Z$Nn#I<pG#HPJBnnVDdAy>JZV&hZh=<#keHWXwKI1JmH<Wty1SB5bkNCAcKFVA1hyR?@@u?m$:1T&e+A
aHeCS: /@S%my:iME8BNdh=ntFEK\mNDta:=<59VqJMca=y%n8J#Z^d#S<$WQq1k1I855:CjMd5ie4KK51@t@@n
6$bmXt M@<JL>FGeRiY1/41L%?*be<lDPa8*+=m%VP>tMCu#@bN/*dbiuk/&>5eN>/^&ZC=68cTLj5P:Ddc8&8h
n$XpG# 8wL$QL&FBCB$?9Id<TqbShZQ8n:<RBl%h&LXbXJ$&NZ#Qymq%Y8k#hbbeeDK<dS9aMnh&BV\t5@jjS<a
#YP89@ ?hHhRkYakhnQ666\tS/V>yP&ZHjy?l$HVP*k6<G=bPq=bZZQP6>>H^\F*L>5d<1%hD#y:u$&/M1XT&i>
Zpb&/P uM*&:Vc^Q8tJdW5uV98CtQZ*yuI?yN8M$&/i95?@jeVbbI*%%bXW#kinT5AILy$JD\N@TX/dEu4%C5Tq
YqL!+V Q8+u:M\Q:WX+X4T%MiAInn<j/?R<9YE/uEu\pt5i6DI//P&edT<@&<El=Wcn<&+%8><AJ1h5#qbQ%E&6
<5NkGh NbjHw!an>d9=L###XNHwE\+nmWYK?=i4VJ?4w1/>eDF%C&1MYS<Hb%C!=\CjY4Q?B=<pBW<NkKjiby8k
qL*YRi qGjNGcEPG\Gi%iA%%#ujLY6>:G8p?=VGddDFMmC&V1k6=?bJ+&Y/clK+IyHkI\Ck:Nm8!CE5JDSGwXNR
Bm9iW> dEq+?GXjb%Pn>a9B?@/j6C!A$/wCqGwd9Z&pk?*=?QMJR+CCZj&kyYP<uYnndH*^/a<q?MATV/pAm1AM
\ycq?a Rha8M=jq=SMREBL+>i\9RmuFNmpjYD!%j=t!pKA\=Vu@nVCyX1IIkPlR&G$Kw@ebAFLS!KnwtGneeS\d
eq5HDn E^MFEKXu5<eNIEJH1c9=<9kLym5tEV1w!/G@*X:kepJb&!9M?>CJ#?A?te\SBkMk?y=W/9E@iNVeD4ZK
e*5/bc ?cDLIVn%IkJ*E4N&q8Mp<\tIQ94+?b<4$Q>AFI&Ey&Y5a@T=\Fuddh4!5/ny8+R!^:\#VRReGKKN6@ZL
-AwAhY 00020856669001202b3 Page 145 of binaries1.zip
bN\=V9 n>p!M6LT^DSmGw?MZHdhQ!kqc!*&!PM:Xy=QGiy@aDyJ/Jb:q/uN%6bj8u4V#kQkSu%AVecqWCtZX??@
6cT6+l Wnn%*dF^:R=4h^bP6&<&ZK166YV4Q8PhSu6*4qYZq%Xb1E<5JQYWF1/??\iw\<P@94=>*qlhqAul+JX#
buCCSQ *1=&by6$G&m#hA&Q&4l+BF!/<TA?w/m&?SWEpH&ju6eZyeYGBj8=Yl@b5*G=LwQ&k/bq5H1L<XHdp*:B
jA$@lS N?=mj%FJhYQHt&@>tGF/%hFecG%<#MLP^h*d^>QN^j4kn8*:Lb^PEmj+uJ%P?kV+iZ6:IWwJN@L$VE@9
bK^pCe b>Rp<thQc/ya8S>eYy1euQAwqlwECl/WCBY:At<TWPym!$KyXVtVPy/DHV^u\P=m9L#njB#TAa%weYa4
hk\ktW :?hiKZ+?Zq=8Ble*L*>Y*X?Ip4XVc@bITPByp\KLq$^mNFiXlhE@\kXN4nS#49ICLX&INnh5*ap:D/*5
e@TJCN HX&A%T<!cP^cTwRRuXwF>A>Gy&qSGLY>qN4<LP&1*RaKw*\GJwFy4cWlbp8j$Ln%%l@%8q<=4d*k45jl
5%uEJy Ndwc$:m=idl=iZnkh?WZEJkwWQkyDFJTN@V/&hNYB:a5^@GA@$?Aq4i$MMAGI?%pB=NqBXG$Alhawd&h
6t<\>H &Wb9=Y9=c\aiMEQ6Q@leWXP>S=kZC*+FjnZ>5eIpRCjQHYWFPRHBTS@/S>6PIQRJIHRp:HaaRnTeeb>+
9!JRq8 \MuKB/Eu=a/Pma#QAw*LpbMb^:4eyP=QT8QPHFtKJaSn6HF\w^^LnE@#l/ZZh4:>@GN\nIEa^h&mJJ$^
qKmwtE ^n=PJ^n\H<RHen1#d98tHj5Pt+GIejeJPBh+PSTC$wmw&LmE=MiyGSqbnN#^ZI/!?LeIXcu@t/pNMLIE
*X>=$Z e?GSIh1u%<bjPHZC^SpZ!bn6&/A#T*+Yc*:JAnY%BjQNE8AqeLJc?X@&>e!Tq\WJLM$4I/e+M*c5<\>5
Wj>>#? mX4LC/6t#cJ\?/QyH*:L!R+=aY%ydu45/PGDi#a9%bw:R$X:+bJXG:j9\!d@kM8*5Qi*kywE^MK6*\:D
GRFqYl Nh86*D!e:K!Q:>8&ceNmVc$qY@d8*db4:+:XC?VqF?kdEQ4pRmYD4hEV8Q*ICl+:G18KMlImd%&tLqp&
Yd*BYD AG=uG8\$6#@yji=1YE^!dnu+%=/lwi?9t<1!+5ND#44bH#ji5qKQD4Bhwdh<w>FlK>DmwYESD*HMV$Qd
n:VEX* /!>>a@$>H%>*Nn>=aLlq=:=Db4d&hnawtVj8QtJnb&h9d&h*\6QLA?ieiwD&JRG*$$>=ihX>iQ5CX=P^
GRR:4y \6F5VA<qk@l>GB6=@?+6+lydKBEmhmW+/MIbAC:qZne56C^nW5hY4Cd?@L>QRWtM\VjP#&EYn:CGmFV5
GjL6V# bh>*TTEBQl=8Hq+BadH:w=%@PXP1y94CKnHKbW#4@Z6/e*NW5:Mt:H@p<EEn5Q<eiRXeic/qa:B$%d4N
d1:S9A &@hAjGyy/?ACn9b<EHycPZCJ@$Z^GLdwM\DFY&!D$=wdW+K6%\KKc<DV4n<SYhMWi*KnD5Bah?Z?p&HF
dV!?6= k5>LI@*MDBj1#Pjq=GJ!E#!ejQ#<AuTAMB8+&$FlRSFS#VNBZk=Hh/$%$P*=j/Fa!dK$8bpBB8G9byuD
VFNy$G $hGB%^d6MX&Wq<p!TA8>qhEm$j#m>:j@&PQ=H!!911t8Q4?Kq+Ztu5a@=pAuE8L!4#qtTRyMkJpKI?V@
a#4L=? #8+l%Vq4Ae#n>/>VcL:HCGi:V+S#WPpp6mkmtw#mnH!EcPdMTZ>E@GBhl@b?i6%cFPNu58RjPK<?=5<j
X?m@<S thj$+l&XS@w!5Y!ep#+&P5Ia+l+iHcM#ANPWA@=yTF8$e8NYw+NHLRDYd6+BF!=hBVeeny9?ElNVe@II
pcTQ>X BHX=@M9@#&6Tm#LKiF^61Z6uKlC+mXhBREaP&^Twql&GFyjtR4<tPE@$F4=*\&N4b<%RXFRTtV%Z?V9^
#ShF\w 5^Wdh?5ltmB1y>hWY<*B:=19QL?u/X<$*><@ZWFiDu:\iwZyekw+QpJ@!T4DdZ5PtV8e<k$MBTtdW<yT
AXy=j< !><wPAj5Nq!>#iKW8=Ph%VHndS9ZAb!ZdnHc9YuZul&4XBYt1!>cSBmR?pwG8!LnH$@Ciinuq#ehDXYF
DqY<eF Gc\:$^P&S>j1NNJt/1\+cIXbyt9ln>KLc5AN@^:>@d/>Jy?T!$:tB:c9ZnkPeJ/n5&V>LlNLF?@AEGw!
b^85k< S&EFBLPjj8E>#N88%5dmbdVFK?EZJk=M&:jLePY1#j8PtbqdYJydPb+/=Z4mqL5HFeqTcQcwjQi15/*y
H/eEcu TjXEdwpcnyWaV*ul5B9MWQK1BNa<ZAmaAQQ&DjwYye?Ibmd\Ktj1HmXbRywl\!EmJDDPQ!:Awiud!AT#
LcP$#= E<&m*WPnB8Km+NMpypy@Iu/$Vl=d5wc5utw%C*E<XY4c>$dK:K!5L%>&?H=FPXpbGXqCd41CqBS8q\JZ
ZGhmqm DPH5Wy#G5Z8j!VF#c\huPDNuLq+Gb/\6T\m^W>5<Aetp!Nn@INp8PL&qIjtT=YwK!iCQk:Ld<\JNDPyw
nJ@ne\ ZE6*P+dt<ZhW^b/#*4bIX%MAh\*#eIFZBnnSIc:qEtBXG\<JC+mI14n:8=wdd%11>@*@hW</\/IEA6Xt
$VZC>6 ik6u!l=FGWKKpCcqPaWEiHqSk4M5M6:CdCcjTaBF>HG^LF4pI@GnBe+lGwT6l1lY4LKekWntF?V@%9k9
YWG@tc pMPN=ZC>L%NcRWbWtA?lnnnGHn^y&d?yaGw8H?e#RDI#/5a6lQJh+l/JH?HekPYI!ElGFGhEZGa8BLeb
mAwky* 5ZRYn96:Q:=1Lw#$*4?alYM/+JkVIw%L@QFqdc<@>9cQMIm9FJB=GanC\aF?wp?\j&BwGMHMbBLkwJZG
a?EPdC MtdQt1?=eNtcnhS?N%8uW%:?PC:tSqn+k?mw?G\YtC9n**#?V*u\m*dYTI+4AZ9M\Z\pt1@%<cJylJRa
5qP!=# 9C>1\@I<FXX%DT&c4l=#Ia?i:4^>MT&6+*C8?J?%hk<Sk%+ce?aLHYku^*>$@eE#L^Bm/CdR+4l@@hmZ
INQj4/ ^n@1B8^+dRZ&PqJKBn!D1kaeKRT$mcp6#8Y?HbYAP#8w5X\>FKLQ:Nt\c4QyTVeuY/6n?:b5YLhIR*QJ
tycn^Y =6&:DHeadX?yw1Cp5Yn^wpYL!WZkwS<<wmD>+8NQ9HDBR1YC>QkHN+LQiL4aHF+NpJ/lc*nM>wVu&iBd
Re\:F/ Wep=/KF:l+c?9Y\wTRhl:Z@T?9C8hRbn6F:cWwP%P\/cPZqh8IJD?*BmB/l%@Jqj8q?$Q/8>4DSVGi&<
M9KXuq j5PGhe5NF1*e9P?A!cEnl+>bw!h%h9hpW6/bQKZw=X=BLSK91=#MVE$Wb5XEQ4kZhy$IAjh<XS#he+C9
>6C=tl t\5ty\DS=mXNVA4V:Mq/a\Lnkp!BMWFP5d*SmQJt=nQ^q8=Bw6>XTXJ1Y^M=>kNdILHBR^b4\WI*TiB=
?HF*MJ qJ\&:ZQDZ!lue&ShY$/I#Jp<1@KKM+B@%hAn4+VRh>jik$jN4P&eVy#!<D>@KaSB+>YYFRHI+Ww>DmFB
M4lDIc C5/pMJ5RZblVSFSEbF!MR%^Gt$tB?uJt!>Ppm&a4RS@Z$9l$%y&IjQL$kiQcYl1Z\Sc4+E#B644ET+=G
N!:Cd6 !*Sy5#tyFiK<CG5?Zn=AI^&wall?M4@w9BN86wi&4#LR?j:jt6<JTJ5ZE$&Mb<^tnmShLnw*G\@JR@KT
i<!Xwk XER>J5mFbkG4MJ/SVYLNd<E8J>A8niSa:@Muj^mP4PIK*TVMT!ZKSD<@uWR$/8#R=W\8kl6@yB#1ln?A
DwFKd= uy!1^=1iSTG/tp:!S+ji8Hp4:A=C?k=^q:#HHZ:@\j&ICEap=+PaDAS$b6Van+pmmA?9t9MjiP=d^G4X
?lFyKW wi9$/*IcGLui=E5Duj$F$%Xj!GpRC#Qww$MDjd>@@j#^+?i9**$DR\BwquNYbDc4!epy#qqAM%m^d6NP
B#SNq\ +$QH4S%P8H6D1B^!:h1D#AItwJt#JD%4<H?4@b>Y=XQX@u9NTkn1KJE6Tnu45D>#E5$LAM^/?kcLqm^b
Tw&Hp$ 8uVJ+pZ/PmecCMA#tyG4?jY*ARbBCyDnQ:6dJ?GM9GlZbc*Gm1&XqV<<@RjQYXiY+h$S%b++X$XNW>hk
@?TC*> &Y4E<*EdF<?#q&:en=9$$B?@@WBAB=:h8&GX+dEVy^%6LSHRc@ZXNbh8&4*DeMj8dT6WFGhy\??$iMqM
N%P$\4 kQYti+?T@\jR?YpA/E5BHm:Yl%amwA%&Y6nnPP>:D>MK$WZ*nj=<%%1Xt*k@>J!H\@G>G=j1IKCZLF!%
5SZ8>j hd@b@+?96+C4c69i9?tRd4C:EBA&t&=ByWWcCWG/P%REFBTpW^BRRFFApY=S8kVydlAdE/Z&Z88he&*$
B4#>M/ uH9@>@h?:9Fc!DqP=uiM==q##DHe4>+ESlq&$RNGiZRi!9n*<%N\EN?nI>lKu<TJm?PElQB!cqw/89wG
pIF6Lm ^yd&h6bPAaFELD?nju88?KZ&a$hbEPj1Q#kD5j$ADn^QnEQmPiNma&PmwN\P<Hc^5#DTWbP\ijGcCHa\
AL!mP6 &p>ihY1VARWe4VBTMkl:haNE%Wj5yi1di9?DRETyN::MDublLFMAqyFYdweV5NE%:Am^<P49cqhYWJdH
+@qG^F !DIn4Ae^B\*#D9mCCknnJYWXXFT%hA$8YFnda:N@4+XG^Cb6+tl&pGAtaLM^@/BMBXFtke*\iISJLMhY
45QE^F DHa>mdCYJ:E5aSySNX\SbwkHLI8h64:%nKG@y#nB^$^bDC>/uBwlJ%J5w+RytkdAVA>wSLcSM#BCu8qa
/5$TTq iLYeL8tjqeF@?C?e5SL?jhd%!G5C&JZpqWwEINel!@D+GtFa^^dqFcF95^h>VhW*mT$K%j4!:MBjpJFY
&95pen 1laHjq1k!qF/X4AthdX@PC/LpeZW@&=cLC@@+SliBeFJ9Q>8l6?^mhLt^Taqy1TtySLTpL6wPk$<*AKb
6nu=\Y GdqQqZYjqJk45qiZ6?wtFmj:c8=hMbTEd&eJRGADnyW54?jR%jZB%%?@N$FibwAed&BnaD>@Rn+!j91<
+1e/+F @AYTnGZtPZVu4*NRPP#ai%lAXE4^4JdiBR6dYAIcEuan5jR=luF6R?:Z@?5^ulFeM4mD8C6Wh?#e8Z9Q
F9*+89 F5ImiApyGVpFyXPIM8$yJRW=kXQl9b6>lF:pNVZIXt?Zq1mZ=wc/TV5K<w8&8q^ZlEadnk4n*>yT%cTD
=THRil $h8!9CR9A9M^Dl/J1y<#NN81S$1Ht4aXbPTyldijqyNl%XPa<YuF5^bi9t=PpPA#!lKCRnL18n11=*R%
SV14@B ba@6PTRtL\eCC!K#S?*8a^LAT^DkyYpwNdC!y^6aiaXwL&/j1KKbw?jqG%Ey&W<4G:6HkGhiiV@iZX@!
=GIV4M <E=ppLi>1Vd5#\\A^m6wGq>!8\LdbtduF%jX6*aQ#*&CF%GL$&N\jp&#It\t6RMwm5NRBWuJK=>SW>M!
^+A&N! MDW%59ILSQ+A:P5ZENI%%Njh$h^RV#1K@uPJtu$jhkMu^uH>Bjm!6/8hyjF=hWu4?y+i8GuSQ1wKbXkP
tq4Mm1 CJ#1J9a+BtFGtKka&W?F9$dA6pXiw#$W9YML^CZK&eFZ@%y**yaRSVbY&N\F!J:=4u<Cb#q@&Y$b:Di\
MD\mYk !=F>B\+jQTGEE=PTW+ShVWpw8*u=Bq\NAWE@BdC<m&tLbXIbIiCbpWBK!?6@n4+$ZRHJuRY*4GRB!b$k
I4+Q\C K!6:bL*1TuhSdMhS+SZMR@Ibi\a1W1>iWyiE$^%aN5qyKTllY1ctIYI!ta^lqauAVC%?$WSVRiL>@*ye
pDAX%m 6<@/iViC4RlF?Tq1\ldDFN5a6q#<%y4$EHwJ4=Ei!t=5TckA^#CVpDmtdtpPWYTmJeCMQNiF4ejY8hh6
II<&Xe KRRLC:8*<nH#u+T<@e>+G!\nR=JjdKKMp#EJmWpyh%L9\H?RXDTNCqnui=uEi%TbGXuF%b8XFFZ*X=d@
-A!HE* 000cfc3691e001202b3 Page 146 of binaries1.zip
XLJiyV qpD%%YSiJ1FM^FCtpn#9tXSM&#aKK/DYmi?BGIew@@:=djuVl\@9pZiM:#><@Q#q?<41BtS=B6*8h\D8
N5%yLl M%n>jW^aRp=FZeja:JKD1:hu/NN/E5uN8R99@qYD5WX!ih/>yHDDT<?:i*1IaPG+!<:CL9>dII6JTM5y
<tMPeu a8%5EA$/hdW#Kw4H6FJjd@aT\jIS+bHLK@Sj8<tyJWF#Q?t<nQ<E@$^Z*S?M!<9K\1X*\ul*<DDMCKTK
N9R:wD PTN#Y&h9kHFCPtppbm?YmD>>^Vm?/cGmwGL1+i98CDnYWDpFPXdV$V/4jX=D>9n8I%IKmD!bLCK*?<!h
D=KVHZ @?S+1L8=y8S^b6JYthS4*F/Je@Dw/%be?1PT84d?!cX91%@tB%115JM9F$8>$=K4GMX!/pbY4yhJQjCj
X!a8<6 XV^9/l!c?RDL@bht+F8=%#*hF@iC>iZtk1$k6?<:hlI&?\Lt+J!GpZjRH+yS*>%ZAy=nR:L1c&8\w&wM
T#d=h+ aqnAim<>LVp8FwqDa>qmwmN9p#B&5DLS$=C+>B#B6m*TT%/tDF9I\Q=^bP!\c?R/C<yM^dSZ/\:+ViJ4
X/<8Mw Iql$+6cTp:d4>ydtBM*hLBnBZN#e$=*@EF#GZ^w8^RGVNB>5XkS#<WqSeYt=W/jXkdI&5dCG6$1A+CCR
t6h*qc nSNVN*FWJ>kA\5S6yKyFlJF1c!48Q&WbkPC+m1HP@J8YY\TLG>?1GC1@4w>9\%FKG%>>\N\^ZHj985N=
yMy:=Y iZFA5CkQ%Ta=TpEJGAbKqw\GASCVd&NeB\#V5B#XQc<mlj>@Ih/:i<hi1:yZSLAi^NjpyawI?GPRahnH
&GDTMh Ay8M?*hBi8B!ELDqIG:6RKTXy1Y=PX=#F<nDSH1Y1e+@\kRPkL5qTeVm\Y=TFtcG=%\piuj>>/A/!led
N#YbB> /P/+BMB9epy!ekwJa6LSX!bI!Bq*5$y4AL@X>:@>=Se?pL$MJjYcKIL^T!&temu$RS*6u%#<+R@AePLy
wua4K> ?:hL^Dj$T&@jj@n<BY6kR=^GKVKEh!B<uL!\^>ci\+I+ccY#tu4GF!%eM?w\i$^b%Xde?G=4Pk$eh\&d
c!:GyM Y9VCylbb!SFGF&6j\V%EiM%XjH4@kd@$!5kDiDY$#y$u/6GhQ/i6wTw9wN>B&Fw+5m=+%pLeklh6wY<&
4a%TeH =N>@GAR^AWFE!H!!<^<NW%acJkpHkl<?hkLtaHqqNY*>C=b&Ln=ZAd%*e\1Kc+CMJw&8Y@/iAq6h*A\>
qNAhF+ LZ@K^M*H%eHP$plDYWpe+K81w*qY/:!t:QG>^&TXEAW!iXS?n>#byEj@!i?4yyymE4<iDtb!MA$4\VS<
XynL5b QVI=/$qFR>j\*Mhj9>/N9/w9jyATEilla/\lK\wBqlPXXVY\hAt+HlF*=@+nPMTmw*@/QZ\Y>Hb?Ew/X
@l?ppR :H*he?*EDn+?Hm=PhqbtN6+>B+HSBAdtqKKc@hW4j\Hi:^Qpt>H:14*=bS$J+EK5wlMAjD<V>1GKBXta
p!%%SC I#+&JnwKIB^<^hjh+bKy9ydp^XwEjAGIQil4<mJFBPCL51MeSE/Ek+\hDuhCYcmb?jZdZ:<t@G9Lpkkt
pqt:AY c$GciR&Qp%Rl:LA&$jFZ@JTX<yiETuABD$P!MMj+BWZEkDhYQpN1TG>6:\kS9lJ$@YbWjE4/Bw/Tp=EB
EWK?64 IA^j^SG*LuYl5malLETT$^nCaSel\q$kCT8/bHS$yV5y6PIwJZV>M8tdS^6!I#!MV<8KE@Hpi&uZ!epw
j6wpHq mJRWIA<nNJSA\&/D@FK#<Mty!a1@?>P^R9BjHT9&Z1#yRq+S\GapL=Iua9DTaeRB=FlkG%!+GySkNh4k
S6Z/E= LmV<ZR6pc!$wtk!PE?p&/eWt&9>Fd*GwPA$<h96Z:wW8k+V9%p!y+*@=dhlE1hdmE8IVpER$CWqGW6A:
?pq*Iu XNl=F!GDM8%iMRb9@lRG:!<T9Qi8Gp9DhqNp8HWI4/!?h*J^K<*w#N9qqVWCqu\Jt*A8+ai*d^dtpBut
G/#R:w &juFyZejq4@>ZN&E/ZecyZ1l8GQHhwTQ!MQE8?9A<bN+cTW%XhQWi5D8inXqZVPyIe&j!XKp&SMNFW>!
dB!V4+ :pTbYQ^b5ANQqKGIIJG4wH^GZX6H*>D+k1tbtipFa$P>e^1!\wd6JHbl>^8!LZcSXm<R>yINSjajQube
@Q6@*L RElIYFlEiL#nH?FTYlI5D8RJ&D#CaQMwuhHRMRVK\N*9YqlWWn1A6?yFc#iR$Nkk&y?R*68*R5:IKSp/
<TF\Y: i:uc&%wc1T54my$RqD1nyZ=YW$hh=6ni+*LKmwwKC1nCHutqeIDc@/D*Npc9jC@M9na8<QA5Ldiw64X*
wJeHHq jPp4qu$4<#Qmd9k=Yb\@Jjad\K5pK1P1d?umH*IL#1J+Ay@d>W&?li<F+BRyTG>jZ&?/^A+weLnawV@p
+5RZH6 +68%:?B^ad!I4HZkqe5BAj:?CIB*n+@jXj<1tH&^I?w@:D:MkVM5WlJna=BaNA/Naa8/HSEYe5ZQ$>Hc
@p9wIP *QCe6EX%b^j^%Ya*SaE<P<KBeyJ^Ih\ID<1Ne1GeSA/EHYYnbtXlA$8@<V?&/@apR^FtpH>J:QKNhj#D
&FkGt+ dkq@edAaD&pK$6@51+Vyb&M#T&5Hb<D8=c9ZRpJ9^!cq*kMJYAVTT>mG@C>/PjllASa$\=BiC^pT9Znh
EbQGW@ pPLBml9/iEA9Z6Q#DpQ>cG6BuJ?q64K5lBmCJ#@K8Iwhd/EkA%QRdtQibNykytLhJ!WyTtIZ*nkJ@tX*
cEKWG^ =%/\FJ$IYA!pt:^AFyyb<t$M5JkKi&DL^kdY+q@4$WaE/+H<c#%R5B/WVYBBmEC6E:iJndXZ@\N\eVD?
Y=hhjG D:>@^VM&I\4/Skn\pZ>Npci5&WVyCjEk&McDNJ!IAInSFIw:1YuE8#Rb/iqytTTGc?4@Mk\E>Q*AC#J4
/h@YbS ?G?AZ^wyDb8\B*X>NBPpmtXT<6%elVQFq8buywnn#BNVM\6L:#<8k>?GAE?l=Q&tCPTZq=GHG:m%R!hE
=$k<a: SXRmu>em%Y9XqE*FqWST+%mij^4H\y/SD%JnLymDNi5Cc$d5=uy$CmSQ4I8+@Cpaw4G^RhcILaQ%JT5L
eLh81P W!NhdctVi6m1wX&EV4IP>F@:!CNc?<RiiDMFi<ul^jDDdj<E9=Lm!:knAN?VwlLTC5yaTbC6M&#eFAQQ
JE#quG nCC@\AID:R#H!j?<p^RQL%ZQ!muwPum/&NuC>K5kLmAkhWbD@dVGPZYb+@9=bbYXqBRX>!51KCy+=D+6
F!=J@I 4&@6G<jP5bct6kBPJAG5IN1Q&\655INH\QZdmjj!!%>AXj##%*8aj*PT5j!4K9$L>\puJ*XY@/K#Z>DN
$EyRY6 /PTMB@pqqjW64!H49:/CybwEBA<NDQRQFG4^dPjn+?ZmbGXmB68Jp+69#/EDR1cBX\ICEJB<EX@Wb?>q
QAKZXB 4/mYyli%yBNy$tMKkG>Ybuy1epJMVG^5HEhedA!\\SFl%\Q>Qb%6La#PT=6ZEV9Bm4/m/H+pl*DSeJPi
9dL#=^ eCDdWV/Wq=KHt+8L\EuQ\e:P^5wBql@d5\R5hBK*%u=uW=R&Q@kQAlBD>dXn^*Ad69aa^MZ<SbhF68@A
DDlye5 &pai=SeEHlmE=4MceCcWlbY6A?cCA+NC\5Kn+8?pb&*k!LpbEW^FR+nZGTplP&85bAiJ8G%+nd@+jkL$
&pjjaC $54cyVT@#uSSdAH\144E5%eQ9!1=e<*BTFNFVpyCVE^emJQmN#phBVpFJVVC&#ca%ypyPI:k*@=B>%@#
bNtlXE HHd8Nc@1/IDLRH^F<Wkc<EeJPWPbcLGPn8\eHP8ehH@YwJYIaW9+m!*cnDVSknXkkH\mRD/IDdX8tRlI
P1n*b* d6FqaR#ej#I9J\^&&FlZnF!T<SWWPkuS4h6E1VeV+tNm+4BdBAA9tp!VkmuwNPR8bXy/EYT*11:tH@Qd
&DZD5m Z=5hdC/*l9<P&KYXPGQmA=L9CDW5dIdJF!Z8kqYYH>?>kW%Cl\aHl+bHJ\C>IQ$C:R#kuWTy*nj=:NlP
^R&&%y BQTmQA^eQN6*:V%5Y6^eXR*kyc4yjDSMJA%&=j4Q65?=/jHtbu?Z:ZC&k6BJ*F>&6^1F8dt=8:p=P>qb
@mBZ@b Y%\\$JEY%I\A8Sw8H6\@@?\ky1ak6iPHIKImwtITEwmp^eB@LKDQTRA&Vq^KnyS>4i#hjK:AH11bY@kC
ISi46\ /#9#=9&H=i<@j/Wt^<hESh^Rp=e>b?9lcteD*P<yBdEVAyI1/1w1c8jWbQn*u=BZPaWw:XhTXD4qpk8u
t#WmAZ S@X8+j5u@&+>EqKE?Eywa/ZQMcpQCt8ci<aYq%i@#R?&X8Xu^N:\hVVZWeSDjQhIu6G#eQKFniDV5?HW
/m1iDd ^!d+pd>Z+jmG/au^5SHm<M/S=kiZ6t?HAywhdGq&h6nDtH8:4Hj\u?!L?8#&>k*!!Hu=9Ib$AI*S?!Au
GIcnn> P@5ipM:J<hHSTC!J*mlId+C*1:*qBZ$=5$4aI\nyaumXLRXVKB\55JP\m*duDm#j<!AkEhN^e5C6C=cj
y=+bhN CNkqdLEL<\*c6QPc&nFTB8cB6+K:h9Y*Xt&=qyLmI9+mH!H5\tR4Ae9DBE^1+Y:4/P#l=ReM<QZR<Mna
P?keVt ^LVMuE$eyRkQI?MGX4PMMK&S/IX*^j8^<tjutIyB1J%l>u$F51@Gqj#?8y8G?GaeldJ>JEhJj*>Xbym:
=pPqNE ycHYYTX=YXq=JRZluT6AQ!QpqBR$nM^EynXtClc8+@@FL?p/cb>bSZ5:Eh8K>FumpDWwtiqJ8EF#9@H9
IchacD bRnjAB5RAjRT5i$H/G$E1$CQ$d9JINdj5lY>+N=:=mNIa9ij4A6pM&p?P\a9<L$uAL^CJ%Fl!kwAL=J^
D\1dmy P#wcuqVEI\pw\JeMCGl+kEYbi9ebCh*K9$jRW@*%8YHY!4BD?\<<udm!9pQak>4iCYya+dEPe8biIJ\*
nhE^JQ ju*:>G=^1@6BX*j9+MnE:J6*u?CDiAD9PE1=uHpR5L9Bm*LV<4IjDc!61/=i4cb<Zyi*SJ4S\QXuSkNY
mS1Pj> *XGcq=qpdkyYC?pkkNZm!qVAm$6AacXP896*kBiG@pkA5:?Q6:8L9dY=mh/bE<1PHb6k!dBL6/&h\>IW
6Hj8@V dTpQ#/NA\lcZqJcSSiR5iq9?Bi$#D$FlWZFJtc$1ZF6uD*<ktiGME$!la6A8RNH<@hh1G8u\?b!56Qwq
y1LWdP N$m65ccTk9kJj9FVcthB^kdWHnwlj%wbPaW1:V&q:Qn\Q/kh@9ibqaY!/ABM8qmBS$SC=8QT?9cB/Zjj
hRhwBI X#>P>4\wkcdZ*hyIXYwFw@c$44tnV&AwX1$F*>q&n<^@@kWuMT#MVp?Pn^QHpHHtn6B>GLXe4Fk@Z+TX
S/SDR@ mtuH?e6ZpC%tWY@Wh:6Qjt*q%y$SjQpQpL&jCSS#Wu\MaJadHn\D9\8d^jt+P%tdGe1bX4T%kh%K/CVQ
::YiYE qEJ&WP?E$\L*E9j^:6&#b@j8ubBdAC+*N^i&Z+<4P:anYLal@6&98<Hc:<PwJZp+wAFjN@?XP$XF@IZ8
TZ\&wP J?A6J<m+IumReXZP1tN!!54c*5uX$>9@<6ZkG&Hl6/MVW8=tQRK?h!hR#y6@5cYCjS!^PY9:TN^Gq\??
dhRnXl iuILP:b/lcPX9Bn#jCDZ+%RVnpLB/mdZp?:l?6^wQ$hL+@Pc1thXkV:ZXPKu?R:TLn$#\9RdMM5uTJLL
GQP4$b 4KRS/4C1+?D?Qd9*tbandYk:?J8BhSBDTP<eYPm^BApy+>pE/Rnqy9?#DA:6t%8LkGKLRN<ahXF?L/RY
T+ScPZ !IXNS4Gi=u>SY?nP9?&9XQ/deWEwk+hXY>SC6Z\Ta68/kXKXSeSESYMGJ=+Gi6?ESGl>:/CyqHjTTN\?
uabBTT L%8Ga=S?a/%Tty:G8eMY!#<B8QSmmn1Z@JPLYpit1Wt9mV/m??B^%T1\19Acw/i>/iYLq$%6QRPnW@N9
#<nEp\ Q*#=5RdSHWMy%&yph^EA84R<ZG#miT$a8JWh>YZ@VFwpVXHCVywL58=eNQt:bF^y<qI!<pw1&JR$T%5u
-AkRS= 0005a84442f001202b3 Page 147 of binaries1.zip
6IyWN@ h&?@K>iC4!M*YK<HZR9\<ZC&6VR%PCh$W6&#udS*!Fyl5mYCpP@le8dEZ9/6j89\wpqb?XSZ$:@ILZVm
i/wumH J:X^$aSiF<8&+WA5=?RXqhe&@CWZ!tYAL5u!t5qLu#F#hdY#6nVSPmW9L5A9y1S/=6SbE4wKy+uK/Kt>
h?b*H4 K1h6@=ALT:P&4u&^^@JZ9b&6%eWA8SJcj=+cpY/NQ9@/<Rdw!aJMaHm^jE5mX$ZZ*MH:!9Zd<cu*e=?Y
L::^$* XL&EB%5@%*<CeVI@P\*j11NV#JQnk@jEh<JDb=B!tXkRhqw&b5cD4pGphE9$ajZ!DQRL11+k*SZB>*bI
q>Y/FI NtQY9e#$6GV\X+wGcltNR&JbkS$IC\FmGZc/WVAyl?&<+FiAIW%mN##1**@k\MGD!KGhB\@5*:>9D/RZ
8XeyY^ muTAL>m&dK^:\j1*\e=B@&#d9a$8b@nb@<CLZYQ8*>@XXQEZ*pL?R1hnB#HLC/?MVtGY%<RM9w>*hRh!
BdwQtj ?WwkBt<W5L&bPZtA*wP5DA\d&<m\>t=a$tYCQTkA9u8^^+BPYIpY/Rc+G$eu18Kb*hMTa!aP?JW%C?F=
&&&$5D &Ddc@CR=!M9^pytS9y/?pct=$Zp6KXcKu?SWbBRMVE!@AMF5i>@>i#VCu<QtjTbqTC8RE8%wB*&1KHdA
bFMqk8 DI\8@hcFGBAnt<BE5Q^4MhR<&64dCX6LRY!mdt\Ac<GG$JNlkl?/hZGt#1a6<aGXm#5iJWH<4>SLe4#@
=j!pkK SdE\\QnqB54aGlJ%P!w!G9M/IAqV^ChA?=8C*1FM8jMWe:*%JRBn4PQM&>t^#w1MRHP=La^qNe$>dtLQ
ppW!#@ n1lkF#iRj\HFBDmia&qt6L?#5c/1w4!mBld%n5<C?j^nFXI<kqLMZNlL+KMAj%$CL#ZHhy&mF\Bn111c
b+b5Hq F<<1Q9:H^NTF1iHihtl::%+!^laP>1\=pRT9mNR$hR\8YECKA/=hD\8QnMJM&5$dIGY+PX+!N>JXPCGm
d$Ia*? /hd&h?*RJ8>ki>YVB++Ka6jFRC\y\&5thdY&^u?9u9%^Pi!$W@<Cqu?D\mJlJYNBeeZ#^9d8@u>n9H+Z
4G^Mnd PN?a!HBdceqVJuBKm8WFLTW=5SQH<ayuV!8h$XKZQZFIRPEMwpKt9F>bSiYM#SdJm%nN>M^\V&6hKcuI
D1deJb $6jXVq>tEPSklR5PH9+l<FFTeY%4*<VT6>Zq/heNydq*dtQGX?wuIHt*lMy=M\h5pM1h#IjkQ/!?e*AG
P5i6*! 6u9>?uFyeZ=&lnC>jRaCQjqTb<>&tIW^<<9B\edCn9eMSDDVm*k#i*u:8X$nZSe>#5$FHDNqkR^<F=ni
G>G5Pp YAl!HBLHBk?hd>?CC?48aGY1bF#cR5T&:4ap5j%A!MHhhBR=ll#hD4a&HE8#C^QRjD!pLM^&EC^@K@H9
</pq4w #6$jBFb@B#dcl=M$1S9dpY$Nj^JRWYEl@%Q:a@BIAu!BbPYXaRa&M4YA56uN$<j9CnC>YA1PTWlJ9=>d
XCPEZb ADA?>B<aI$^p#P55=K^:5Ej&nyG\aD4KVlFntFdMIK^<1ClA6SFHIYq$lTG#adT#NCQ<14iL*TZEp6:c
Yi!H?c *6Hc*QTC#l/1H?RW%I^MQ=tBAu<QAQ/ul^6ti@j5N!=6dkH4RGmnV^StIqHGV4<FL#D!t#9SHc#@8Rm8
Y!Cw#i 4Y$E5AbEEMnRS1wkP:AKCPtEG6LQVGASc&*+E<nkP#m:I/Vn4@@K\hl>L?qlAAqjaZJlEey8AHB:eGVE
=QjGXe :emw/KkaADETT^EHn/Hl?SXqepwBh8>dZ:lMGuWA*=V&%#??:cT/n9<q?l&@VWdN^Dpw?Xu#<QRd15<@
Wy%*wM 5D!<H==e@j+Pp8laj%6>SjHVkwLCp54/NnmV:@*!>>XNkQA\T4ume&n:B8CZmy6D<q+NYe%9?L!*@Mpu
HZ#Z8H nF@8j!aiR?Nd@PniyXN\+SC\eEL6F<XW%dX$DI#NL#t+ieNK/+nw8IVE=PR:!Ru^Wdi8Z@Q#hLc>iEFj
Lk//#e Y@/EwJ!bJ@lDTA6bM\wI>9N^QC>=+8B^YIAyDkij1Kl1cGtj$>E=F%Y@bd@kEn=X=+i@wR6<4<QjVQ!w
<m@j4C EHa1d898HS/d@M9\/uw/5L>ATN9JTCuwPVndZdI!QRekFnmGp#?nwulcT$%Y+LCA+qum/RPuXW/j5Z#+
tdn<%8 yP^=/?9^BiBW9=KiQbR@!W/N9SZ5:?Fkyw\j\8$X%:S&>4+cGy%<Q:@<JZcq??9hcGh6+j*+MH<um@NK
S$RT^? iMn\ERpXHVMH#+CR<NnpnJ#<b?ZQ&@8u**=d@j*><*5A<j#e:P#eHQ\PtcEi6n?\ua<d+YJlb&bp+iBp
ZTdJP< b&E=dPj9=?j4m@kR9XG9ud+iZq9H#5D+btZhl>paBmdk1GLnKPQlbwlqnIwI9S+Iq>Z!%KpTEA9BDpdc
iNV@%\ /C<KHwFdC8!yVaF>j?d%acPwMCQM#RXXJN6BRVqV#=dY%laC&MGHjB#PT@L9kD*?@%SR:mZ6#Mnu@*D<
#T>dIV qQ?JPy^+lIN*S/SpdG+Fb#1+i@9/Z\/<hl%\DDJPjFLc9RiQu&:k!A?#Ik#p&?mJGM6pVK6@Yh+FYV:4
&L8Z%E EQG54:<p^kE?jkA5!#1p69cp&WkBq5X%jjn8%A:%%V!MB*HW\<Zb&eZhG%+C&6udu1V>RW=P!jCDGZ!c
<l1=+L D^nL4KVVb=IF*499XEpV5bt5lhC/4i*mWhlhGTJH9+W!<QYd8>FhuQ@QYunAAIDB#P/NLea&puptZVl6
4=!p:& 58Im/@=Fe+H/WXKR?He8*4iXm@?lGeFw9k6wHk/QDA?@HRq=nw=Gamlm++A4lphcqEtJ?hWdqSS%>+iY
pw#<Sj TVQMQ!=PD:iY*Ap\pIR*Th@^DNJuDi$CwuN1i5du*qFC8@5B$p\AK8@>\5SAY%%J\aQ:tji!<+11Gu8G
8dc6bd y^djj@:?G>I<mFKp<GM\W@K\Hw\p4/n:ZW%XW%j>iGMbSan5YQuGq+@\Y4P@C>nl@C#d:$L5&nyA?EAX
nV?hwi :Seae86&dGJKYkd^*5/M>NVEtImd\bi>ZP$5L^me$%AW=BeWpqA#6uX^e?G#NqIVF?I@hQmpME=WVEJc
/m!uFG XkGpeR%6HV%>A<TRVPtupP+J&ID+\pWd?FqDI&KVab8K58wZ#S$>IQXP#!/?jj@=!:ejK!94t=tamw:\
WV&LE6 PCWqw&$L8LW$Qc<mC:kXpV864KCm1T+uiFlARjZM&hNuDy\=jj45tSCM*DH5^j::8hFiENqk4>YIpM6i
<GH>4? #nbcp5Mk?<wd&:9:BYF>n/8di<aY+MFXj%QF+:TwIE>da*YbH%n&Xha^5@j\D:+F*^p?Lm!yk*q/?jjc
aD\VlS n?WQ:=ji\HGjm&@iLBDt1Sh8HkQyF?Fml9tZubPhnauH^NjjF/lwaIC>huq/iZ5/=@*B>n:AN9M8!j>G
td4iKQ k/<+G:SVeZFATANBe>ud#iGT!k?l<+i*Dn%QCw8ICI5Iu^TCR*ePk=$MVDDGLCu45LK!<B*<5?nP%wbk
QmFy9Q #a@6bkJ:FPwA?NIGF8lnI@IEqH+JwWLHn5NyM6lNpVb&!G^n:?L8Cb>nAHeWi9NYSGS$dH^!&n$R1AC1
aRe<hq ^:p\XApA%bW6VCqa&a<kkNQV64ii>k^W^L8wAp=:eHS+>e9=@ZXlP1IAXL!t?@d+54:llmhy5dhC4kd+
dcK85& ?RXeDRpP<QH$<QRJWGXeI!inIJBVpDE\AX^=SWn%#$^dJ%ap:d#@l^DhZ6a6p8m*GAYGauM98tjj@@Z*
BdEYHm h*Y?bKmK@j$SVDDVdA$$SNkRh4nnDl^q&bw%6yXy+SuXZ#kFTHATlXES!9b%qD+9/8c6<AmRdCPSKDTc
/ERFpJ A5kpan\65L%JmRq=GJ4b@e6@ywnPn9jWQAm:yAk4NL:nGcXP/%*!9ut*EL:@@WkJG:>B^:y*<@i*n<Ad
R<?htn h>aX=&ctJCapyh:LK*uiPVmBndYGdA/kFDYTkE&Eq+1Qq+?hm>K6>GZh4&4K&1iV^K?A#6&d/?54*:/<
YX$ip^ j#M@Ph#Z&j!<:EpP:EMBi*6dtlwd/CG/J@Zk%GkdB>nH:$bEVNKh8@j8=?R<jQVwajc>8!t^pYHB5C+I
uGJ^dE Kta66VPu<IJHn^GQZ#%/=QASIS!kXF\CitdqM&1c=*RN5K6lC#QVC!cGBu4u#&qyctywct1B*#A^5:J#
nZhhJ! Ab<j1PW:MKGX%d=5cP%+QVA<N49+=9*H#<6j9/@<@4$GL%Xk%dPBnKT1ycP>%WW#QSYadE@K1CnLK&t1
9h\ZDM !\5hBhC1ItiSM@6WV\e?Kc64\b+P4u*@$&RnN!M^MnVR^>ZiYF=$BLhZVM*K!R8dR$C1iebP4d44m:KV
G:wlAR dq%&5hSVEaQM:lIH#N1=\:8m^LT5*CeqNT&9^^e@4/!9aJW^lKY>d>?>Bi\CeJji=8G^wm6PLuatJpk6
GkT>hb I<6b#!6?CJDM1BjSp<@DKR/:*kX=FlAL>ZJmQNDLIM5iVWlMmI<H+ltV#L:\NAHEQ@W#T9I!EtI+TC5G
:$GC@# LqlVAl+X*aeVPTq++9nSR@@R!\8!DHb8\<LC#MK^c^j^!K/DP@qaGdaPbXnb@*S#ki@JBIVkk:LNp&VC
6M$:l4 @MKpYXAKy</wc=<*M4%+!hdB%h*V^#<A<B6!@ec6CKCa+^JV:ta>#H8&nmQdm#BRdKQHW8%Q4HIT+@e\
hdwlMu =FjFJm!@c/k/&WMV+=hY\m!1b9C^l&ID\FjXaej6y=&ndcZbcjGSN$N9*AmLmI+ELn@\YplwlB$j=HiV
e6emwn uJ\Y+56&+lNtjZqQCpLqDLM66L/:h9+BqJ*Al4JVa\XpQQTpXA8Q<#d*<j#jc$G#6SbE4N/VqytW46uZ
i4T4:y 5i9lNhb>YHu+Xwdh>a@hQZ1elDHkGDpJWm\AiYIDyWh!IpLDd5J^<5l6NBKNIw6Gamul*T?TTBu*8LwK
n6^ylZ mPdcuNjLKDN^e*Zq/+j=!eHG\kS*LdE%QEH$G==JWpZuwu6IWt:X1@Hb6<8WQ>eIRDejIGZch@NnQT>K
9HRYuh H1dF*:+F$8Kh:ML1%wH^?V<+>/MW+?e^uCu=iHp=1JmNel94Ae=%qe$4*:A4w=&@\db<6#k>N6DV$Xld
<Xq>aS ?nRuQVH1^qXjh$hdK@MLJwk^^\W#4BdYP\B+$=mp6I!5B+@#mAW:<^+@!E1Ha?8CkREGPB94uhNRQZ%K
PG^X!e RX=PSq1KVBKS+BCZpJTTqyFXWALPTp6H%>Da#MJ1<^Kh%WX#5\9GSkd/mJ/?QpAeHy8+ikHuC$?iH?aZ
MX/8!6 qhe?d&^6j@Wcb8CblVh9**@<C4Z#&9&6FK\uI/=mbt>uihFe::T5tPBSRiqVy?RWNNRWVl+VpFhZP\6=
/wiZQL *1h/=pyBcT%5V\Z:5u/e@&jA$M$kj\>HT%Y^Wh\?WXpDP@lwPAd&q!NXZ1$5DdhY=&jEl9nat&4KmpKe
T8AWIT n&A+8<F1pwR$?B>aA%<9jj\Bl+l<@9nl@j6*:>>@AN?@R>=8j\h?%KEJ@SkuJ^euC^M4P\e:M+PE+^X@
CM6uiL Z!miCb=$Z8:ZMnGembpMRDmV#4GAG>thqJCRGB<ZE^X^<$d\FZ>Q+BQNnZY%%W<Du1ZE^jBEWR1<tDkm
qI^1+? kWkipJKWpBAVE^WYPwEh$?:dB#Z$DqIa\Y=A\TbGtIlaR#lPCDIHN1q8@<EnS@pF+Ck*EBHISeFuJMPn
<6R5Ac a5epJKXJLMM?Phb&nm:8Z4=?kPZAc<ElaViBMw!Knd6#>#:+i\Pa>!AMbN9kp\M!lp%GFGlu/n>Fm+Dy
%=hEuC R+ByWTZL/:u6\*XyQn4mu*G95jK4#M:PSA5^ALZwKS8P$N#t5b+cPH\%H9mF?PT:h?KnpAmc1Lmp6Akl
DtHJSD 5uW5LXPS$VC!5K\\W:AeEX+GcQMJ@$uMS#H49&j*#1&@LeeGP\$HF#c/h>5YmQ9&:h>QQID8S@i^@@?5
YwhZcY C:I%dJSW<4HJmZCR5*MRaWW1?&GP4eP^:Z?hMCB:!:l55j*HD9i5w:8jZ\?>AXRLlB9tc8mMa&JllI/Q
-AuR+S 0003694323f001202b3 Page 148 of binaries1.zip
$tlDL= n<t64pc1EAD*$$wAN=#/CRhZn*bYbAbipFuEM$5yu#N#9l1hXhTA>b/n\I/$WPI?\myI$%PDLSY=h/JD
q?9@tZ 4%&>Gu\4Ln&@w4q@jQ:6J^LajTnF5k5GNkWAt+cdVXI96R8aa14uL\11*@+AcPM*%*=@Z*+@Q#p&$N*S
R@VSDq >L!1=MtD>ATR#Q\>ZRHdF<%NVe$9AyQp:P+L!L+hp=mctR*d*BGj:C#Ij=S#L!$^NkK?ZIh5t?nycKth
Ia:Ik6 QcN!/yTmA1Y<ky\<I5ey4/AID:T$#kG#bRyu^nw+PNwnh1k%qiXFC*NVwwt?1Su+F>nc8*4/Zd$SHyie
Ye<dYd pb%ZYFJi??JqT%6u#?8BpdGJ1bt=?dh9Q**/>tM%?^/Y11N5yMRWnG#6LC*M>W@Lmk5iFSBZQCWuy//t
tcw>MM mD6?RpFDZX%NFXZdj%bN#SuR*hR>QA9:wu>cuMB/88buy<bFlF#^h4HXp^pF#yk$#AB:y\\#<J591%@u
WEZe\! ?l1^$!**T\buJL>DjT%?T5jW%6W*MBRwme!e^+XXnc?Gb>>@Z%*:<ZWbi%JC>ip#\J#\ki@ny?ZqGd56
w\%:Hc 64ubGYC/btE<JHa^CKK>/Wun:iQ5HR@Bb5!+C<lPmIQuYwtJTPJ&&Je8In\5=NyqQ!>ZS&9#C\a/t1w1
#Z&9iN y^SpycWIE5eqyWCalM@BRPCWqBAZ\$G!\V:j9&@9*6%@9VGYuwk5KQM1&Lw<\A%DM\!kQu!MZ?CpmKkw
NFG5DS Zp^CZEKeKIGKp$6I<p6JT<9KKT4BW$6>a*NLG\eZh\<9Z*<@&MMkEKl5RHaE:KCYpbNZ9I/nP5VI\LCN
/=YF?X mQY!InDCT!bTV!6GDG!&9SB5Sa8k:PdSq@e8G$yC5Gu^&6eKB!8DNX@k!BZMPc=q%k<NNya>lVNY$nQ8
P&^^E8 =V#K!W^FptqV$:N!C@I$Mc+*!TtycBlajnJV:D\k?BXt:JP<pGy?TQWlE6a:?El@X$+mB<1JeqFl%ymP
*QNL/d >QRGkL%?kQ*@ZBTEGYFBYct^9M^J=EK=mZBEI5et\B9q*AW91*m^i:m>Y/pc9ue@D89+AhJERT^bW*=h
qTil69 S^uGA//HZA<N9Rt#NRLTNXWWQKwt^qFGQ/m8*1!m1K%/@HqLe:?hG??4#+8\P:&Eb^YVW6a&hjCQ8J6j
Fj4iJh *Vp&5:V<k\I:*D1IEIpdK+DC$Xi%BYqS\Z=iHq:?\dhVe55c?@/B8SiqJD!TF6wENMPTHtw&X5EddeAW
K*F%a6 $>V$hPV&d^B@\W!>y9j#*iV+?An\^A%%qiY%k+MD@Z%b%\K<QaIGy$j#Lq/$5w:8c@d\nlkeikdC/hna
GQ?Qle ?QnaiF:i$/eFV\huF&h/E/Mndq/@iuhwcKD4q4E?WNMckCdX5?kb/dnylXE@bbW#16q\:EMj!NMkD<TQ
Vk=\#u #e<&Z*N$eInyd:y$/YJ?d=/=liYq*4/?#kV9!!Bk=A*%QM^@>lIbpS5i/Y>8:^pc/S5cGS+bBqC@?@n%
TXnpb? i$+YKX*:TPBq#q?!9Yllb1k1B+DtF%NRpyFSW#5qiq^ARWNVZW*>pL11t441lj!TGwDi#Q995MQ=%FB*
HjAipY C:AYD?+tSwaF?4w:tKuk^*H:<LJ\%kEeMZR@9:T?A%+c@@+\$XXZtJWR=8<E4=+k$n6JTQ5A<^GZpy/h
HqC\=8 ?:T!wZNw?8&ZZ!D+j98!8Z#w!>e9!=<@j@4<iZpbtQ5j&XKCjL^eHJ\<HI\M4J#54I\M8<+H?uwVIhJi
6jj61# RaF&IZe#pL>IA/IVplKap^Q#8q>%6?ZjCL=&^h<9Aiue$hEiA4K%tpZ*?ECKnLTM6F6Hlb!eeYjuVZp=
8y+$I\ YYIu&5E6ImS\@Mmlw1Hy+YjamSijeZ6:c/$i\p+F^>G!EqmP8I@M>PuCp>lddi&64Y&pem!H@8tJeq&k
Dj?&w: yF\:K/YpyXI::pl#!MnJh:S*9QBS%>I%NLubXi@w+ycA9EK:&P9>L#@w:A\K8X:e$S\SuZA*/#FR+PVH
H&DAR4 kSj>N>5IA!WnRH8Xla!QmGPRN:&T<ZK5?WG\ta#wMkSd<tJ5@eBDX*pA6w\^l*>KSi>w^@PKwwK<S+<i
6%+D4Y F^TYFD=?kGVVQ*lWWFV^wm*<AP<GPRyTNmWbPV*4V&bKJ4:nIuDTAdt\LjKCy>!Q^Ldym^e9Z>RdRtdF
>tt4qy &$hi*!B!$8w*F9D\Tna%W*5BJy8dmT&dB%mjDW+PQCW6nqFLT*P%:n?L\?A?NQQ/QQVTwe*NTBMQhkHN
:bX%qh bhk>PjbEuJ8dT:@yCSeZ=/&tt\kuG%hna$P=HtdZVS1ikQS6n4^EZ:DtHV*tX%<QWulEZiujK5#lhbV>
GGw\8D R@mNIEl<GEAiyuGR\bEw8tl+8H$:G$P?ym:9M=Vtc$CcL$\N6=api?6K95Y#!1lwt>n=lCduq5Il*i?@
ii>?Hc @mKHJ&AAiRJ<XnM>$FTTFS95:iJk:?RSEJcWW>LRP@aZ?Y/W4pFm?*c5S#4CT\j4CVn&&he@@%%NZjY<
n9QlHS wTL*%T>+5L*B@P9::QnE^PVpTF%bciGVB8IM:Y#SXV<jn?p=bJ+6%>4cNt>^^66*cuE&LDI8=e$d+lLN
DP<iYq \>#e9KLFJiJdtwXWwCWDT\n964WB?/!ne%:u*Dp6e1%4^HjWT=c1cyw>lLjWylcZdB!cCE65V=&huJ+5
^C8*qP #h4bYL>ijH*J&5b&pdnA<MI9<HyE%h^pV6/#F5KM#Fl6ZeQ+bG@Z1@GJ@9:l5ip*H:+?JGZ8&CAX9IT/
5Q=H%y la&q8btS81!+$JGnwuIK$yJu%W:lV=!R%>JT%>AkX%hD%QecR5/:B1jjjq9:6VYE1KI\N#M==qb\kKiV
8SEeC: 6ddpBNDqptjNHV#<k<Ql$XkqmAy#u*:>BMK<Mn<>P5VL%pSh?68Y#VcF5$?8S<RtA+EKY$RQVL=bZqu@
/#:j4V 9jL>?#jmX?y9*?H4dtS=F*#i@iQZ/9ycLZ+:L#eHB\<Z<#aYDk+&Xtb8JV<@w6i/J/i99/hhIHDa&ASQ
+jWi=W \HqeZGICQAK6GpFG/eeG\9%<9V$jV$\kp>Tb86yc/8QINQqMEmJHt#\:41k\PniB!JQJEibyFpSPC9C4
e5D:@! #BIYcGbpaJc/SXlp4AItkI&hna$X:GW>+mL%kkk4K*5#abEcKQJnJ$4A^!bJT5pp#$<m5yV6e?*!FQIK
S?64c> C5Sb^yqTVS$>p?#yWRhu%*^pEy%kH@L$9D+!Xu5qeGTp>Wb+hNK>*EKA6!A*5w&A*e<CYR6jG5MndWk*
*CCM6P L/Bd%5n9V8%\S^=y/FA9$PNK:9hi6eidmRG<JjZ&i<a?/^n4dZ%SW%FcWqJYWXNjXj45/bPu#$w1clw/
l#<d%K B<dG:8$tk&?ekNYtwQ*PVMHPh^mPB$PF!YPGpGG/pX/qR\eQHkkdI+:VZIh:iZRTtTILRdlw4$?Q<9IN
wI%5=@ #a^SRp&?PW9eV/p+NRi&LM$W6m\*CjPMFj>cFq*mQQteMMJK%pmaJ^u%jMIea!kQD*jw:Bk*F%jD#E8R
6=+tEM #1jSKacH5LI4hHIIJQF\+nndYQ@l\/iGSuKQH^<c4kdJZAB:HpFeS&p*K&<GBkXj9+GEpwiFInjJwjYt
Zj?5HF B>wekB%?9/yt5\16Ie>h?19Kq&dGi&1!R!+195P#TcywG>6+BMhqFhb&nMDl::@JTehu?#h@kRk\*qPd
!D^!y: q^#1+*nJ$6LG!ih/jQb@kQ$K*Vc69b%9P^^S\56L+KZt=D9*:GW69G?8:ZnW5aIcEVhYj*!dHl@6/S/d
:&<Xyn HH:$IQ6?>jS+chGVeLDDc8it@Q%/4K&5dS<6VLt*L5=GBN?MnK?yi@Qt?jPM#M#:M$5LHdY6m$9VREyi
+Lyd!V Lu!:<QnX&:iPi41/iu4/Bkd/VQyVd!i$wy9W%DY%P6?PI9hhVe&6dQPYqpaL!1ejA::#*p#d&>y$L*bB
Q<p?5X 9leYHudM#\j:B%+9tb8+q=Nd%NA>M@/my9Bbch9pYH*H?El>W*9Z\Qn<l$eQ5F\iH&pqnqM&8YSyaY1p
+$hiTe JT>^<8lSaSq=cjHV1mwTJ@nq6PDlHKy^WF%DW@hPeVZaQFNLZ&B*u%u+D1T/PC<4NV:m?lWjX#6nihFJ
ldC<=j *D+^SX$dF@k+MlH&pj+4#^6KH1bEZHY#$qeS^^mZAI#d8QleCRtQTW4L#Mp94&@4H%@+CQR=dMSC@E:>
D8\Rt4 a&ZqJ^\cmZ:j<?Qu4:Z%6X<@?>T*<@F\eHD#5DM\5HK\5:K\mdn+iZ8BjI=+WjwG&X>BMlnV$\DtmjG^
R=9DIM <aqJTeqw$yHK+cFuL+hH?>#hZF&!J$a!:/db/=#VLJwc8&DT4mAuJ=<\M/yRP#6lkMkhpE>ItJ8Qm+am
ej%^cR jZ^lNm@5<i#CGK\yCX&aDut=5CAM6nX\pmnd98HFRXcuC4C@PSwY?5QCd5IT#imFlj:a4LFaKTtblLq^
4K!bPK SI/!bdbJnl<AQ#PV$DA#dc/qw=e?NYJ4=*Dq+a8Jpc\pS$ju54Fl:@KSwbDL\Vhn:&VqA:W8ewBl&:bN
cQbw:& ily+WAj<N^\@BIEu=^aARq%T##Pla1CuMN4^LEa<LX+uCBQ1>Vl!Mc$D#lGQGwiHi>1daF8a?5dY>5d/
CD5%9y t54K1y4uL%8/B5hHi%6#lMk&kF4jICiuawTHc!VkV>JFDjZhjDa+*HMA&e<TMnaae8&cPNnkaK*\?Cam
JXyj%n N&*\%DB9!jTa^GEIjNnNtht\WKnaS&iuH+jtV5?N\BY/MV<XZD<@@*iFhk#P>:M/qwEXa18jj^$eFAS<
jZnWT1 Fjj%8duZ%=NHklEim85#w\k*Sj*Me+TLl*61/q4%%BTid<jPpIqB+QEXRw9Bj+WLewk^c&V\TNbR9?LS
5q9C!h a<AK\Z+l*>bR%p:ke\D?IVhC4><IDR5N8+YEp>%GI6Ew!q8bXVWdRMju9+SJjiM*QEKdHG\5mHdSFQ8A
%eljDj b^hVQth5:S+aCj^&W^?eHj>#nS\1?WNA!c@DmyVl%6J:WRFPq1dGF!:ciaIwWjIT+Q@u\K$Lyj!Wau8a
L1TWYu \EjG8\uab=QJiQF<DdDjWF&#5aKmG:8A5^<dG*=S>tSpwmI^PjHb%HBwWICZl/6L<&!ZuVZST6Vt@9^+
bj8YF/ /5JeG8!kG^tZ8LkIi$AtQZ?#tJpaE^/>5FV5=?Q>cGuK=8Lp$y*#8uwGSliA$V=1N4@$:L!&ywc/=4uY
BFKMh1 yVaDI!Qk?1!uqyyeuF&eAl!eHB<8Vn4a&ZW56CPZhG*u=?*5l8e!*d!9F5!Py1Vj!</ytS:P8u<@/?Hn
:\bq?j \atG+jG/+yKKF/&>+@N=8Xl/V+l%\R6L/%qctbpcu%MWQ*u5/EpyPSu^W&hXyARB?61AjXRV%hm91iFd
=JCWcM XQWTDt1AnZC^>9FN6cWFD>IVw<K8?eFnN@\Wdn>iY6*MAe=%mLtVZXBG$9G4H!hi%SZi^*V<PRZSQ?!d
n/p?$p kSl^PiSYhEJ1bub?/ZM+LRLY@c#>@9WLYWF@ujkN?#H>@QH#=<19*=D>H>?YS<NND@J\5HQ^enDR5\D/
hIQXwI tSpQYju=iuq=ilK>1L&>L96+yyH+9\Q+B&I?MiYPaqJC&ZBjwF@k+PkDG#9d6QF?W!P>e>wcG5?uYqXP
*I/<R< KT4K!!9E#A^jt=t?Ap$/?Gh8Dw<DiV=qjp=&#?=hE4ML5el&&1AFpKqGF!=9AL>J^VG>eIih!LcZucN8
\=n&l6 +VuY*iHI<hH=Cy!w8Qk=TYuytNqSiVu=l6tZe1neMaYbcWZF\iuIM?4upmaHL%4b&Nytn9hj54IEQ*w>
:CVtny <t^k?KG4P&^6tQFwDWh&FAHpp+1^%9=\#:ajeC?l:SJh>L1@QNHnuDnGQcpI%F$BeI>Z=dC>j1?td*!+
dPLc+y :%XuY%6:b*hjj*h:C>LI$6#c&VM<Q91/6daw&SBQV$akJZ51ly@M=L6F+MV8:TiFdk??QuyI6u@+>y/>
Ny4X5y i/?M>5CDhbDcKmbiduDVZypc5J8c6PZnIS&@#e#5*RQ?q#A:I\%Zbta&B1#M6dpSd1:l8RDT!p#MyaCX
-AK^?$ 000a8cfe83d001202b3 Page 149 of binaries1.zip
ZG1Z$b Rhpyc?h1PSBPc5D<<G\^\59EI<4D!*N6bymHt:6&8y4InW/lQK^>p@/<jD88V9VCR4:>\cM>^Q%MB\/?
^Sa>tn G5:wG+w/SBwAITBI?YMNyj$chQXKaFBRMBLCjkM\j\NEZKDt+aFeYEaqJL:/YetYnIi6K$a:T6MCnGWB
nFit+A <VJc^yheL+iu=JdWh\=QLeLCdnKR:k>lP9:n$tSjjWHKha>LeKC>ta%HWG\Y!QjaCV6Yt6KB$u=1VdZm
YJ$XnZ B?q?k=icm?ZE#b4/>Y4Kt6wHR#>Sw+*XqiX*R/MDJa>T!!dc\pJDH$/NAm9pbG>ui*htbnDX*M#M@GLc
n=6jDa *Qn$jL1Vm+jjqS9l6^eZI?FBa9>m+?%dN\ID/6/<huX%84e$ai+\6^T54RM5u:tX6jXX1>/qyTFjDR%%
!YDkEQ Dc&GyjHGl1iGJtc8d?ahHB*B=:c#h<lcHHi\6Y=icLy+$jLm*J!q/?VebX5u#?!b+en+qNT$+1tBJJD<
H#+blt pqML^$jGZ&hpbD%/X6QeP=PQJj5:TjGl$meqNM\9tq+\Pc<pLu#55ICp4LTa+yuV5pL<56w/mNblLW*\
d^4c=C Q\%:&QWL4Aa&Y&qle4C:=a?eD+Fh6e=LViQ&m$1w/F8Vyu:jjWnT<>lBi%6XjuyMmDjW<%?ld+hFKna8
CK:WkB ZyhD5Li?YZpq6T$>I>kD%jZ%NiI1&S1!V4G&?l9=6i@*K9!qZ#??Lu>+8@m/+L48AVaPHt=titb&\D9D
:ZGn\w Ln%9*$$9%J9K^>j&in1EHZ4*yQn+yPVpqD9dElNKluy>*i$jn#RlbuIJa<NXXbX\HuHW=GSjlL!<4K^e
cwKFwt ?QVw^QSNKWq+MCe6PV54Km#Ij/^#:mq&<QS+9k*5@wD=EY/l1ZpLBP^klP5ab@Q<@G5Nhum#Y#W@ZF%=
\8%RbP d@?B\+y#M/S#PZFJ/enbaZp=&d1b=#L<IH=MV<8iG=&!WqJSnb/Ey!$ZL>+b::qkdHLlkquC!PD\K\C?
=9@Kl? 5$@R:iTHc#nKp!#d6t$A+Fi\wT\R>6$InqFM#iFYZ8h\:h$Aa&uSL:k?iM:8t6ubtZSSHPA8iw4?+6YW
t/W>?S $w:S<dHlAcS@^>DIPH!d$Q&18/h9cHS<yKiq=qq&<t%jW<XD&+kp+Cuyj#GVe^&H8b=BYEk\jKD:$MF>
j%SW@& !eQ%!C+Y*>HBwtiF5N:hd*!<^+<d+cLn>y5eGy9!+?YqlYy<%?:yceJ849cbJ:9lA8ZP65AFtl*mFy1a
MA8Sj^ NTe6EC>u+?^56#yeIQcK&cGK5nSk*$@PVQQ\d9DRZbpiBMmZV%WA=CeQek5NV=#t+h*8N@=/N+k*?//P
u=&!XX h8&F*?@#G?wj:NkHu*RePWdPL$D=hR*h6ly!PiDK%eB4ReEAi@R/#R*M^aenEbTlh!61N/ww1!5j4j:S
w*H/RN ?J?Z=5b:c^?E&b:>mPiRPGN5:SIRqyBhYNQcQ\:ui@@iIMNE@kFM=I>%XV&I8i^ky1<DVJm%?#XIjS?J
dn5eSh iqlV&wbT4*>@we#Hl@J6<6L\MP%^K*>b8%qN<cL\^R?WA%D@icF@6P@^uh9y+/><jj#TJwE^w4cCKDam
<&#Mi# M>R>NwbGF^KRPeaBK<6L6p+iATFlC\5l^KB6I+5Qk1:/i:5qL\+l%1#Jd?cH=>>M1K64aq$FuS\yHC:Q
L*W:!M IG?wZ/my115@J::lHhLSN$^eHLY&5d=pieuK^mbnaeVtp8YL?iiI1c:b*F#*?G!9patFdjLM\I%dEbE^
5d<%>k ibP>EdhC\!Imw%9G^nKma8L8bD&6/Sy=ktZ=6PTE&\yCPGWnC#MVE#$XeiHnl@nFbKVEbM?epV6=ZEd:
LQYVwJ 9Ld&8TM\%Y6yGiXX\KHke^??p+cT9t=:YXYECj\dX**eHE\XSYh\?<Zp6e#lRHB5MmuyCl\4eQq#AK>@
LpIN+4 Yl^T9%%T=d!bndNZRHBaJC#/kENMZ\%lyk5\n1+S%<uYCP8:X*@B6lJ9F&iu^ke/M!W=Pdl+YPpbYAH8
+LW=L> &:lW*Q$*9cl>Aq^<$4hwV$%JTplM9yPTt51eHQh55MjD#8L&TAe\TSHEMbd^M!w1y%YiV$^PhtyJT<6e
q6E<dP S/b*>E1ImiH^+lKTAHbl\SQHn@VQBtC9QD#t?lEiS8?=tj/b?YEP:J$T\w*!pI8NI@QW=SD*M8IeZ@@i
l/5JH1 @Ri9#A*Ch?p+9JmE=K&bRSpb/c4yTmq?KWuy/ctP+cqZpqJ!T1EVQZwGRJ4FnjZw/i1e%>M*dBkiDnI!
ut4KnY N49p+liciH<NS!QM9t$dQcty%/<6+NqaiaS^PL\KNn&+MTjEWlGQAa@ZCu\!WB81I@weS!bQa?IVt>@a
Gwue@D Q:w?9u%$dH^<hGS+BH+@*N&EVdAL<uG$NFVkIQ+=11NnYtMtb>*@A/Q>yPDNka+D?*c:D:WmP!k<SpcR
NywS:K WVIiInhbNVJP*!wA9Lk:YKwilIiPhCM&Nd&L8HNd:+#9V4lA:nP>aIG<b1b/y&aH@:%Aa<k5hSuE9bk+
WdqV@E R>MLj6q#yy@IR<9N\\*m!FRj$QWqW<XE45PVE/%DE=*\b6=n4H5Z4K@^G?pEeRSPLc5dHDVHC9kQHTE@
Bi#d*F jwITYWQymb&ZA@\9R?TSICTaJkTK?=6A&%NiV!uHiK>=VNmT>X@iL$\NNSdGi?yJjeb#mmti9?Vmj!M8
k*RIR1 M:?mwZ6+Ew+4ZTPRAX%@tHSC@&=&8KWp+=c*6bGPy6b=+$68%?K!T^1B%*!@VHwL$wJTIyMZ>%Q5=5PI
kuB?G@ b?E&Ktm5JXbV%n=@?QEHiyc\?9*DXM>IZ@46wQm^DpeH^=mJ*8mICBMR%e*MjX@M#BRA1S+=P#+>q\??
BLRTE# +FcPukGB<@NZ@Q%<jIaYu9q=8VuaQFkeMDM#nTI8MuSduV/n4tMIC<LhV:k:&h\dZF\MPH6Y6Y1^Lj!t
6!ZIXY u/c&d9VmPAkqFldtF!>b*=pj64I\4=/4NnA$MCVPcqWcc84wZami:9WQDL=?+@=p#:W4X/<GZd?bMhwb
NE=ZZ# jC*+iulTXtqVZ?GjQB@uJmIp1&68btK5j$bTtQ@\WSEycVFyqdQ!I9^T&8jQ/b\nP+hwH>DT%m<w1&98
bTnPyB Hy=?B+@6*5/P>ZW&%yS5CZ6@D!e4NdFb*AG<%FqDG$eQ@/Bd5cubBiXa*>:91=?ui81jbTjiDHC&$FHE
i!k/8T R?b*p=n*lQiP5eDY=^bXN*aPVC^<?L4!c*X6dS%bw\ICj*X6e@*A&8?X:^D<BRD?!NBAd:HYLn+iHpAJ
&HS$1M M#5dC\P4tIP@6^jmVi*ud^idup:MwIZ5J!etyTBybKtKTdGFk>&PF+%Dlq5%NdXCSu8C4\YiWny%Tqub
S1wnRq 8uymIkjp><Cy+atyLBEA4mliZG^tSpnk?NFD9dMy&LX^:G\Q\p*tTy\nd=ND&Kt\T&GE>!kQ>:Zi8VpV
4npK/5 hudPb*PNHt=ti@ah>J$hFlR/TT1MCb9yq=GTKyp8EiiXEBijty1eLFEWESYZ9n4SycF>:9#=mLFPLWTD
#Vwqu> SW9:@M&l6uQc+G6q+^+WudGKw#9KANuHunm8\EqQ9%qa8YD>n1Lb=dT/+a/C&+/1GQ1$EtcS%WMFQ5y%
tiRPBa PDIbPu&*mP!c#6/lEYTMbuT+9/h*iI\\#np&M6DXYFYaSYLjSFhDly8TAkH<k^lASp:D6MFM\eR4SAwA
<btllL RkKl@S*:h8>$HG^C?Gkhl:5eHP!=8IneLM4q+?QyIFE:V\!NVcS^ehPTL5Yuykk:69XMJ<F*NL\^M/@A
D+9=iq I4pRb<ldbQ>bJBwi:15>M#QGCD9#$=pGb!h>EBley\i=8WFkRZpw9Kh/EY/c\5tuZF!euMkE&@nVI@AQ
9n#4Tu Pw%%:Nm=e>e8#=E&\p:GZd9hByy*\Xwh+J:In@JVWc?mhD<C@j#<A/=e8awE5q$Dal<GAHlZh!5$/lF\
I>pkjY &CAAqBS9auW$c:?Ahy<b//#IDLI<BRKAnIcbm%>IhFy8TX*d\DlMMNlq?&FaSjQn$>JW@<8uKTG8F9yc
uVC>bn GywAj@jk?J!!=wGJ^V@+N/Hp<\YW>pi*A=ZQ\M/tiL?l441/=5Yn?S<wTnBe?jy81t9phX!IX?%aq4t=
KKkVpn ShlE^\XDQh*#iwbGJliMM1h:#y*VCb6=uV+:/*FP%?TTp=j@*L!j6/i4c<uCkJ8V:TZ#%\8QDA#$d!:&
=@ZuPK ccm1KCpy1&wdYVy=?AZ\?uw=Z#LyZC\@jjy5/YKyGkkC/6y/M\9i=pVVR^cYq=LuS1*MVJ:Qqb$@4*6?
8PdBmd h1bmyqNF=c#G?b6VQi/?@qi8yp%$?TE?pkGZk%JH&$Gw<R?P#Cm5:*u&N?PHT\tJcb1aGl5b1M8IuDl$
AwZ$t* ?KTpqJm+<qqFHD@?:Qu#PnwWP8eA@@8$ZI4kwV$&8\*c?wFZ#ZZqtM\QD:tM*djQ+R/Imm9yZLS#<d=!
B6Y+i* HV+wKc^1/B1ilhZwa^$%Bbq^%*$eVDXq9\D/h$mi%5Zw9^acEbN+J!P*5QJqS@@+*L9q:#>ZCL>wXu=?
qat?YA @\H5QLKK@yd=>jQ:q<<jqnD/B@6:i%/XlJ+@\M*F!pnH\kKeQiN^aP&>jZ\C:G>uyMMyDQD+@p=KeuJ1
PLBW5c cuyc1tJK@JPBL85L=!8H$qSPu:p<$115yAB56/Km$mtFP^MhAE?@!c/E1TpLAWElEAD\$>PA@<MH5&hi
FAPB8p :>#P!<QhNb8GeEp=#Hb#eGDCqhTPl*SD*V^dAH+lj#ajc?!/@>DWnC/5ClEBI8L/>JC$yEV%%FNSZqG<
atA*XR KMB@5p%AREka:#9ieWbNR%Q#^tm:KuKYSW%h/<bkm#4+V6@C=i468/5+KtE&pQ%JI&9YGKlJNh/4LK!5
JF6c*6 i$AWpDZ\mm@4:!%N<6KX^IKA9GNcc<>hY!pRBCRE6B%C$pyi6ud%>Qd%>uT%N4b&>R+MDR<N>QX$9K\k
l$8H?N Dbq&6DVTWXPY^S*myCdCqmp\DqA!dnKV<\nAMMAI!*89>:Z6&dt>bCAP+cG$Ht+CWl<F+y&Kt!6!4B*l
Aj>GKn yLWdd+?atNDtyIN6Vdd9tJ#cRh!?:h:WK&^JP1hVEc:h>6Nh@&P%Gtj!&NuaH$<@R4DdiI1JKiXNEAjw
bG=hG/ 9Cd:8dt=!maiEVuSejdC<Yd\^#m+dEdd68<AkeB%8JY+k*4uny*PA+*EHbT:h8<:SH:pPBZ6d*VuLY<j
X@>Anu 9+CA!%hkNRNW@!HZMTF\M?^GPpu&q#*>6a!!RNu@a@uh@ESj@iNIq*PTZ@BepteM:j%CI8<<kGMmSmdt
ll:<8H *5LZwF6^aQZ:^#jnQdYQ+\Mh#e=41t8iN:H&CEuM4YkhuH4#ajpu>y1:AcXG5$SBipB+Gjq+idqalKL1
94K%n! //41/y=<B*GAE<TB<ddl:1k4D$eH#jRNDaQG&@VPIX4<=*V>Gw\M+/bd\Gi>N9NK5*qt=L!Yu1tht?@e
?Cqi\C uI?:1:Q#qju=FyiL%m<ZFt\SHhdklhi1y$<yKy^TQRi<l@?%+KDA?kbd$=eLn%TWXawYm1CCXhW+X#5@
9!iDP1 :HHlR5R%C!64&:p=^\6GR:MlRJ=4#5#wDp$u!!8i%k!cikW:^j5qnZh=iuy+?jljTSqyA&HH/&y+cq:h
S>NGQL 1?LC@Mja+Z=T9JKA5LKS1bGlkbaeV8DRIWF^Td!w+lpq9KC\Mkk6=%Eh=B!19e?8wLwB5LwA*&B@ZJ!C
Qjl9e? 6*iXRQtu^h<P^c:yqjEL8IPma4L1JnaP:4:\y9+i$Q=aej99:+6DLXl^8+iNpcwpnASHyM:w\Wnkj?$G
C^1<>T HBYY@4C\+pXd:<nM$1e9*::@?QH#^@j9*?CQjmI4/E@$P@j!y@h@R5H4u1:P6yct!<h+8NkSbqaPbtat
#^em+T l6%G@4:iju/PGSuyGeSMlk#5nC@%duyt?q*&%Qn<@w=LSltDjYwKTpw?I<&KewkM9/!<W=&m\5*^BuE<
1M:1A6 *uPmR?Vq=IAE9+ARVlTGklMkFKlNV>eL<QBZ#<#IIy^TN4Nh5I+MdG=TK+ah&^<?+?G1u4$Lj8H^dC=W
-AaSAB 00037aece67001202b3 Page 150 of binaries1.zip
NY\9e> ^$AMqM$MuBeT<4YDQYKuy#Wp^Q1t9ISSpYQCE^M!@SN^^++Lm4mQhb\/jXbXLZmp@jSyqhNu%hTDB=9Q
^@cY+& A6Guc?+aeQ98d^\qB=AC!Fc4dZRdpaEM1wFh\AlIcD6HFL\c45&<cma4?lZZD+!A1q>8d&PWMS=EAnEP
j!e/*m Xc54<jtX#^8cY%6dGq@WX6T?dGqHPup:Yl94!@M#E:FAaKB%XqFGWp\W6+?YdJYeuIKB!E#P5l6i&*QA
LJ$mQZ KBDT%:JuS?LA/!Ne*N\Zl^1+CJ!$ZHyXZF\Bw@WIB?&q<XcP=?N>l?lle!MRBCblW:B6y/ct/p:\<FhN
$R6J=5 VWpnuL66yn9?^$JXV1iBKJA:>aAIwkAhb<qW4^I*6/Ml\4PQh*JCpJ84b<KGk=PVa*#<WP@adjCHPT%H
>AwIL+ Y@ukI#iuwSdChuVHN5j?q*A1At!m9lWI/M4>@L^>@j#>L!NZ$K5$YCkI8aGEwnewkQ>j4/KwjjRJ5\P4
MZ56mL Q:>?AQ8%yjlPkJumX#!*8QJ=K<?R&<ubBSW9PwjGy^e?jF6bJ!DR@^?E@u<i<@<BDlhkHNC>aP5ht9!+
?4?8wk 1u%+i8uDq=Y6PICmXDXuh5Ldi\b+i<?!$/j/Se*n6i?wMYH>>>e*I/%DA?$DI!P^II*1Zl+ddt%yehLR
+4#9S+ %8&edCpct$wGej@KhKi1>6DMT%W+*h^:h5:H\>ZJ&juB*N^$#@V<jNI=LY*6\Qq8XYXFBWXqhV$LS>?k
P>6c#I t:iCE8aYPywZFm^BHHk/Q>dh@W4qnQw=<<G=8hiDe?EYq?#5&&jH!%@QnG111&8wV$?j>ykcQTiuyHyq
SB>%9X 56QY^hZVK&G<\>QD\^QEkiVlXueZX+?A5PT<8l=54nHyI9?TmJC$#kWnjRMhSb#A+WQHSCZ\RuKuqTWE
RBHI/= V=+/D\RN&ZqEB#&*Z<e\8@JF&?9S8R<@%8Few=HinkdkB*LTE/N9BkX+Pq*TqACBAC>%Y5@THtV/+HBw
!NXB5= CM1\Qtyj%::M>nYWQEmP8Py11c<m>kZ*GZhWXPc59ntMBIE*\pEp8Q9kKV^lGJ=c?QAb>tcHQhw@j+I@
t4EAYj Iu+@>8*4<5e@ecC9y:84A<TBlljliF:aPI&Dp&pdM!Pu1uiA4*$1p4Gb8R&EkhR:cZAEcaaCnAK>4Z&D
pFMe>I k^F!5uIKH5N\iKiq6J^C&%lD@9B+NIkCHlN6J/Z:J88P\TdQ?Ktyp!iPH#q<IHb/i4^#jHw/qMm=&&yt
RK&\Z@ c&>nM>6&:NwqQV*#5k+ECHaP#ke#R$kHL?!GJ6p*Qh*XQ?&Lq=CYdb\cj6w%PTl<EntJVl\Y5B$jWn#K
D$k*tY L?R!%1cwDGVJ6iG&$!Ceu%FXD^ywPkP?uD1tDyh9b+Aa5J?Juy=Al*Xc&wa!\QepYBVkF5Ll<Gi6k:Pd
qH@D#? ^yy!\&^W<DAK$IwblJaMqX%V4<YS+a?jM9P?jj>ycTYe+%bbYyn*4KLtij&LF@Y%XTYQ$8QD4*tDGKCy
:uEd^P wmA6kShFeBTHtek&5Ta8=BS$CDQ=D1!Al\FEklQB9V*N4@9:A+teFPcDjenLdiwA$PcS?y#B$XARCm#H
l8tdFA tnpP9S/9&ac>5N$?MREeAeJHF#W=Phw?NnX%k<nJc#ZX>q?4NVqXZ#M%JaP\W&SQDTJ6*QDM+FnQ=GVu
!5Le?# /$q:&Ni1jtL\Wj6+Q+EDHYNu9#A/IA#?4MXIM>a*^*GwtdCheehP^#+5EP#a6SeGA5yXwAnYAu&<RCRA
W1AcJN =mDkM6RFJHN\QjV/ndS!GAkcuw=<Sqp\Y@AJ&IJZ%hqlDy4m*@E<+w4cbm/BEWu*<p41Yu6HJ&iZQpNu
%8IP#= kQ+>GZk@Q>JiulZqd\>mkcc&9ytD:/*Wky18+btqn%?^*tw9WRTq/4ZamX$A5HNe4K^+?R&qIRYBFtTI
Mc6cEB 49>qwB:R@#wB!Bk/V8&4eW:Q5k8b=CuX$qBZ>=>8X#*6QnPV1tX$!hX*h6dj!\N^yZBPHWQtiEb9\Sl\
AN@XM6 :8y<6>yybYWXwAX59aIma8Iba9JAkJnJWD>#?9RV\l!Nm11tnwFXI#JHP?bqci9k=N&L#BmQ8IQQ41E^
4Lbe+> QZXc/jqWp/#TYj?Jhq6HX$@9lLF&d!<ku/=iT^%8<@F\k%KkwL/94KT\aP8mQ$41lKmcwbG?9w+!Z9DI
Zt$uhP \TMm+tJCWmw1$pJCT44/84wIDAG/??I1u4h$D<NZyL??9J8DN*&aJWmJnRm=/8Nmb!Au?kb*CC?l1GXt
i?Sq>V +?n1e@ZG:RTR*!5dPkiu*&PQby:D1n*TtRAMAWhEbXXlCQD\D:^?K#I8MT*uTXqh</9Bmjt*H#:CW4*Q
d9k=j6 u#=?iQjl$?jN=cPjQ&BN:nD?Z*X&kEVZAQb&mkwjnAB5HM\$>A^M56:i9yq\<k6!D<&p#:mdqyciij>?
dK%EmN %u*/8+u=jj*>4&8>FBA=Cuu*IiL\aXebBTYh66G^5YhTE8Jm48P6\kLYE^Q^@CAEmE%PmknCc6#>%+cS
?G*JDA cjIlV\IuqSZIdl\IP\9YPl!&Gh46MnE>QStFeJB#=SCtciCkl/M!hekW:bC?8JT59Ha*Mpp=iQEp=H@<
D>/TIZ <Au?t4GZkH@H$SbFJiZVb\KH&<DZ<a!1ltdIRJQ1tdMc88dPX/Q8Aj=FYCH@yBd>5PIim\CMIAJ\<MNV
N++S#C AXQ@P:ZDZaW^LyymYATR9lSjQ=D4wRkmkPlSiRPZG!ubn=+WFn$4#H?atRb44$9L!p1iFV^Im:5b/PX\
jwZ\uk $WBVYXbTHL?Jw?Bu^&y<WFl*#<^?/N6j?q@*>ubZtuMSPeuNB=BBlmE#Vm/8+!*DI!Q=uIB?m>EtDk/V
n$GERR 5VG/KG\K#@nEn5*6=FeGpWu!AY!XAQqkqXn@YTXuEBQGI<G9ph$uVNJkFZ#H1=EJ&kFF&M=P1A5bJ?@Z
+cZ#$D A6!Qw8!5qcQQAjht\$&<5F&Y+&AVeV5V5ASPjT?B>N=TAQ!WW:>Rtuk9d\>Qd%?CQ$5Ahm=+LTkp=HyI
PPH@nk TEwbwJ/!94V5N<pH@Mb<RQ@LJ@E?^9I@<L#mmywtDu/*E4HDy%jD+>Q#::>AJ$Dmu9D*yn@T*>=WV%6L
\T*<8d ^<nT?VJtupju*u:/B4qHZ1JEqHwlGQakIQDT<uG!cZmuqa@<\QL@N=D@T>N9?hmc/kQ$hjWN>HX%6LZP
k=8>\/ /S1bYZni6NVZ$hKERq*6#Guq$/w/F&#hA/=hC\#\<Ram*e*J>/c#wT+\*nyAiIMQXFQZkBWJ%!KT$8:K
?lG4FG y<cHycXcGGm41c111c8yuV&4yuqP#<ne\m+<EDd4e*X#e\1+HcB:Vp6DE=:X1/pw!e5yKK94tqw=8Hn+
tH^>eQ ?Aekq&Z<@c=e8^+cimMw\Ne*+EdM9cKt\a4Tw1hdX@*^GkIAe!N>9jNuJRYQHV\pmMijqFBTpSWYXNA%
Mbq6Lw $NNDAj+HhZVQi#&6di#5u*m#nA&pu5D8@b=BI^Abi5*Q*eHmDH+Jh^k9J161iMui&eQ9G8aEmt8c8phk
$VCMN5 i?P*w*@QBLVpSCH?P$Sq%R#kkEP@\JCd6&MT$4L#T?G@aY#t#h9*lA?$:><8kS><?ED<mH++?9dN@M#p
WJZEN# ?DCk9/8#9dWb$q>ZW=X6\5*N\edE!5qKT:iN+iSbe:hRBM=^8+@iw<@MTE@Q#M4PjyA6q=EeGi^^!Wn4
HmBE1A nJK<9CLYYEhSRX=B/a!c?1Y4=^Sq+iMced!IpAA@@*HaHW6KWq^WYID@&PEDi*ey&el!4*MlaQQVpDd%
\Z\j?t HtV9$h$:dd^lIV1Y**b8hYIVFFL$6kb@YEbBWWuB@LKNKE:+JC1<R$SaYAm?i#>&+mSiTqbSGZwANXZ+
?w+a6c XhVRSuT&cYtwcb\#5uIQm59?lcQk&$c@TWhGn+De9\/?RjLb&QaBC!C6/^bh$6hjpiJ4ICZ/DViAw^M>
JiylSM =bdb<T4XS4IGlAEh8/9S!iu*pG!/i?py<VHJh?@uILt5D:M#W/LD4ulm+E6Lm8HZeSTC&:jAy!cna6=:
mDe6%Y mB?iA:BC<w<h*4h:B@a1EXmAhS/Eq%LB:nnZBme\:?^pHFVa*=Y\E\Z&u+yQ+Z<5C5*8uhbi+I?9A4MQ
ejlIYY *:j#uLDZA:th\Ei4:KDLBVR?B%AWRBekdLTpe\K?:i5:$J*EZYR:whHjk=**WZ:=lZI8Z9N#<@AC?ewZ
^!&:FZ 19\A:QqCEBJMGSlVW4hYShGW>RFt>a%X:Ey@yK$5M<SGZZ\F#!iyyGq5+^WTu=ELQGX:Q$n4d#:Cbw4I
D6h6XW H::l^hXRe$qtbAB&^/h@+V@8?LBTuyewAcZ?um?+h\h5*ebP!dQ9dPFQ+QL*@@:&d1TnInQm58NFa*%>
?d<R/q A!PVC!bGBu4/?5btXnc&Nle9GP1hS*RQ/tl41181c^8aP@yi8*EnNBl&AjZ*>ZC!6wBHk*wGlpdGSwcI
nSlGhP H4&l1a$d$B@*H#+K!p1LDjG!N#QRkZqjY%6LT@8<9wuFJY5dt$5&hk=A9*6=P61aGiuykNmky/h:V9&M
^#h:QC m9Jy6ZNGq9a8Z9/Z+Zq@CH!BiV5tFp:SCLwSpj1+5t8514^p/:\@JVFaWqBC$$lj>:!GnBD@\WQHSjDC
Z9Rhi6 wkw1<nkB/jPAiVI>SBe>j$DH\CC4?tX:L#b*?98uN<Du6:&5L5uQTW?K9lpT+Pq5w!Q%FuhaXE^cSeeC
Wj<G6N mA19kJD\8FT5RAi:=h6!?6HBZ4dGc6LLWPDn=hWNMd!9lwRB4\<?8ASP<B&btq>eYu4:htuy#iL<@MKd
6LBW$i ydjIP@R6dtq^juy!DAP<w?$Q+NWX=a?>>@F^e:A\5dHS$#I\$DF!C#qq*59K\6yRIJuW>*MiQMy>eCV:
+%eJmS Vt!w6/&bnnyWVYhW%XVQuFE=jj15l4cP#ntN$/eW+PAqTVHeTWTRE:c5qJGXp5B8?A<j&LPVn+idt<lF
!YlKbW AN?wIe?:>^L*H>&:i?h&&KIKQ4nBHt^n4SdlkTH5CZJKYWXFWW=KHI@D<iNESjGmImeFVy\REMJJ\Ddt
D<%qEb 18wcMNCDaH\ijMZ%>ZT%hR!Akk^L!j&FI^hpR?mJY!QpTan@A9JiEIeVX:MNi>\^ZH@@t4p<HmMe4*Wq
%k6hhw 9:@l6nEiEC/lb8pVFl&jlCV9TIm>HZanIna^PSYauPV+!P5BH9aY?kB\wP^ZebVCB&kwCiRIBbGekwyy
F/k%kV Q:#e*\d^Qk:^=8NB8Kul<>WhkDpW\E!NQbeFJJNlNDN5njCB>jnkI/m^B#j@9Va$Y&9#t=MTaw:\WtGh
CCw/qi cYFekPh?SE/Em\HRnl*4Re\S?G@clZ*dni=Bh>PC#:$LDq?B>*8#K?n&eA<*N*eQV!>9E9Ea<MDWB+RZ
^TR!Xq Q%?4wt^/&p=aSqtJt>l6@8^+V>*ncE<nSeqX@A+JYSW6a&8Q\Km:D:Fu*DCn9@*<A!4=LiT^t9#ByyJ:
SAT/+> WbihLwLNdtSl:*$nKdimbYBmAjcbIYDI4/PWdW4d6\Mq#<QL^<5j8\KQ>*>@?#DiXbPdEPJqi>HM%N#T
kF/b4b !94TSR9\k$8&V1/8L9dYF!?aZLlkikEEAX%hI*N:4<C\1Knw&^G*d6/<ES#k+&yuCV:a%M#C<6IqK<8L
ih&>N* qnbP*pGS1R?iFn>niQw\LjKct/&=5cGBIYKEG4wcZdCAjdQhuJ&e*D^<kJZ^A:SbtBnCi\VVC<aGIKlw
yAZ*=e /=qaPWKR46<Kn+1K8H$:Jm:y:6*WyNnI!JnpuKKZQVM%IJ@DI*:a##>i?hlJbX&><#4cm5L<l\+eQTp1
BBn&db LC\DG==LuAi^/:ki&JK/=<<d/wYY%aNFk<>9XycZbpb:P^64!==me9:GXS>Zi^NF@H8k$jE\4qyDKSEI
F:G^I* BQ%hiGDZ$V>J<9TNyR@9\N/NlteqIjItiEXNw+6@pa?:p=XZZQ&!4YhwalcR94m+MD<@P#$>C*@+=k*+
N/=bZt &h#$^Nn\ACT?6dty<YZ>e$B<Ji^^@nSWELb&bGXnyGNkbtJp*Y&T6bqND+m@u=*:KP@^a:pHGat*4:yh
-AyqH+ 0000aaa278a001202b3 Page 151 of binaries1.zip
N$m84W M6HSXFjZ%D/ui@/e61cG%uq>I&NnR@mCF1S+JRXbiN+qKkcAXXCWq+H+C^\:6G@Zhq=ilIeMhpQuJjLR
Y^Z%cb aC%@>?$uHn\Kt+Z#<Y:%Nwi>pI:!a<*+JKYpkb+/4cy/Fn:MqSRZJ^iZRCVb^iGLi>lFTkqPw>DT$hED
X\SjJh PwqX*<Ca%Nui&M#c@YypY5EKnyKdDwy/M9yj&!kb6nE\A#ZQjpREl%e!C<^5HG6=jM98NAa<4dn^#dLl
InCWI4 5mDNcl!HtI1JT!A5+AA:/5c%kICk$QBIJJwy/9c6aD<*Y#N>nXMA>^<+<tMMBHIm!PcWFPR$8%aA:D#\
wWj+Yk NP@+ESDYwGkGj^NaRuhk@:=>!H=1PPCQn&eDk^td<IQ5Ii\GYP/k?D?YlIc$JN#\cS*KlZCV<@C8<=F6
??Aw+= J?!klJFlDj+c4PYDF\QI#w*hFH9&:pZ&$i*hA%9\:V>$qQ!+APYHFbT&!6jd&hZh\\Q^wkKI\#ct6FeC
uR#%PT A/<F*Mm4Yc?m11^:pjX^GiYAk9*uF%mZ&%Teh5%c?:TeyDkS9%6eW9cW1w/J6h8XmJTeAyBBPkjHJteZ
K1ZJV? 6=R:Cu8=HaTu?E6V<P%NhKD4JXMnI:NLLkEScjp%HeQVd#:<9e\uB\IiZWMy=$**<9*tyhl4@@WZckSp
l#?RCH @/ib*91u/SFZ9J#6HS^h*N*hZJ#5:b%eQH#>L@9=8Dw/&Nna&64b\Ewic!jk^8Q8*IH9\8Lna!J9B96:
eF%QmN PntA*\Wj:k4?wL8Z*>Yd5StQT1y4c^p1u?WplRh/PNlaYXwSL?&\8tV9/P:nj#uA*>@ZL!A\=McN+K8?
wy=q5? dk:YXqcZdBAHF46LMGBa&44=ZeQWMP!PJ\$MdM:n^\>#:6&>t@G\5K=4bLEY!?!=Pje#$yIVdHACWq4/
<mF@cl P64uXQD<l@ajE5RJC$k1K$pImGpcGilVG8n4/aQe44@Q@EF6a>jAFG^h@8W>5P%h#WC+Q+dCuXTl1!:^
FJA&=& AZhWFC<l4/y9CXP:j^CR:ytQkEu1GwLP@hNW#=>&F@w1+lD$I<BKGX?EM$?9BwiGS<Zi8a@N%i+iGAN+
6yJdb8 #<:N#e=MV+%QVE*QE8bpb+F4H^$i/IYWN#W&%D>@Zk5yJ:XCV=Vqlb&ZYbuy/SmbGbq=qP:pQHkAY:Xt
BaPBuP bV><ZQDp/SPt9J!$tB6?Vqbtl9wkICJtkmDtk5BwaZZJ&6LeTP?<qwcGtmwAE%dyKy^TPZ%GYWqPGmS*
MZ=a!1 E84\1Bdl&>#Pk9Z%ly&B5WaS8*am&:ulBDDawb>j<CSiRqyPHq+T1y#XRLSwNFTXFiXqbVqq=YE*iXqy
jy&kpT KWpRR%SWNiGaRpPCMh5FW#NLc^5R&T>c&d4=l!XtFRHKD#KV4Q69pNZJ6#H>atHbD6K/nL=Qe9ZR1&i^
9DdwnS dq4mGPT!N9H%k*ui!6Y+A*l=QV5jIPFCk1>h>jh$ejWJCIVuX!FBX*%edE#%%JYp^jEInp^pBWel\E+J
5@Zbpw H>%Sp%NRWHKh@IYJh8BZnl:cB&GDp/&PHWj+N+>VH#%!eP>PpM1IQNRAT!BhCQ8R9ikic8^X@Nbm5Q@*
#pHh$! akCcES+/ZmDZ5X:Xc#9IhmIka%PViqWViXt&Y6>m@Y8kHmL8Ji=D>!MH\Lh>qHA\D@pJIT1tFZVd:$l9
aLtjLy S&hZtM+>ET<tnQdLX/+EZ4tcWFwL6H9:\/uQKQ/Qhl@64H=+&>%MZ@PMpwKeHG^IeM:A#Nd><5&E?@pq
p#my55 RI#&naCE99RSG!d$l@Vj&CQ==4L58CAQ8+6tbyaPZpE^>=:Xh+@M@D&uZ$LJj/&?RYpI:Sj^byZVFARW
TP#+B* &WCy9\ahBm8\^p8=R:YH5I1!A9C@LA/%X8Vi8SX$GhnmRPTcM6D4@kFZ4wZi8kW:<j6/i\NB+896/iHy
R#R9mZ jTW$KmZ#Ri/nl&B4b6&:t^J>E#aY<5L/=Ajj8H+>LCI&:eHV1lhN4e%eL/8j=TSHlQl=iaCA+PEJF5Q*
/Dhau! e8AN=Pdl5NCR$LD\!Nma/QAdX@$<*N$>9Q&BQ@B&h*F^<@RQDw8E#WQ9b^N#KS@uFbambcJFlZq=BcX%
kNpuQ9 :Z$#H=:ZXJR<i@IaiDwk/TPXn+8eQk<5k=1p\NH>?$<IC=@AK=/TPuqT!RD+C\NWH>E:aKKjA6h\jQGQ
I*wY<L Z?>yjXFFE9TpRq%>YhGQRKYL!=:SMdPB?j%!TDl<dXJC/1G^<89>iGeh%qVPGVcX\#T>^Cq6a$9A9i?X
bFC>1E +NBdpVEy>?Ckw?a8<JYcHB!buy/cHB<dGRZpV^GubeFQSwd/Ajj6kQ9/FI*nK1H*!!9K+Qmlk9^H/ih*
>=?VeP eHG\M4P\MNI#MDM!5y<M#eq>CB84Q*!WZ@m5/JuA$<hbKbEljm+k<q/!eZB!hub!5Li#e\Ac!eQF$icm
w^VZR/ tRqI>Rdu6hZQukGCZ^*SbFE:1/\kK!W8Iun5+J=heG+NEJ/EZRh&:>pcbIi>T\WbdVe&QB1&ymJN6XBT
ShG\Ek Qw&eaXLZAMbL*$D*HD!lPW%??k!mill4j/B!YqXLS<@R&MVe*MIKlHK4T:cP<L@G!eHJ*j>/hP1nMkC@
JV9YT$ MB<>eP+w@jw&iH>HDq@c54F!<kNb4?pTXh#dZ*HH#%BK>D68EE+IhM>w:<q\pK*GuSCX$dS$<ZD#<QZ^
KX&X!> >uC&5:TGF:i?ju/?Ql/PXmdu%STqweWRPRI5<!EBpVWe^eu6XES!Bky!EAdAQ&SM^$XYRTnkFD+yiPIa
GWRDS% ?M5h\5dA\=IpeVE^BL>NFI<VQuH$AFmN:WSk*Kq*aHPFNk<k?>F>%LBS^y>F+9y@Fku4tL8^uSL!n8\t
h?Q6GL :CLdVh^DCW6>CTD>p<H49*@%*mAewDl+/BB!GD&EHKREwamjZPApFihQhH8P1/8D5\8IB!D:i$JH:?eZ
H5FjLc ePZ!qe9lJdW\<#hWFQ=eSpZ?c98?q+Wyke=YF$lubV4/II<:iF+Jm<><ZF\J:+dGytaZ*!%Dka?ku>An
I9wBc= 5IupL!\i6Ja@VL#l+&SncYZuGuA#?iHYT@69yDpw:%B1akMR!L*9Wd1FS+ZF8ZjnLT!wet6/Q1>5w6T4
%?\PVu h@Hk4\4m\ucSJ:@ZWB\<!j5\$>6RtyMYG*E4QDI/LmElJnwmA1T=^PTWyIVwmJ6laiHl+BhC\<ImwqLT
&KJE9I e=<YIiZEE64CJ\@9yebE*ESC&eN9^!atJ1YpyN*LjRKHid:8:?d4dKwy!p&Lm\m>ESIcGkajK>!MnE6M
&w:?41 TW%JRlIQJCYDXH@*VpI$eA<l5F\ZCL?d%/@j8Hp:@p=GXt=iaXFyKXJBYXqh>^JyEu%bX\%?$N+*8jmq
<^Pk6b 94c14Hn4Jm<y*8C+kI!Yn4cYq1#k5RQ:nkkJC+4IuyIXEbLSN#bEDXEDSQ?ku6F==/j%4c>H6+#?>QD4
4qH6/Y n5acVQjHpYy=#e/IjeIh\+9LAHh%!e:J%e5QCQ@+8\?iqNi*>5K?qD?Y6uw@?#1auXQEA5NlTSWhE$5:
@5ul+b wJt8BN&+GSGVuJqdYF:Z&Qq/cDk4Pi%8CRkL\*DE^ed+TiD^?%>*h+Kk<CV5:wPM/EB6Vj<deR@#TKMX
@YDBBY Mm$QeHF^MDP!MNN9A&GBdd@djYI8La\J^TWqbTwq#@K!:pVjCQV%<9V&<\e&<iwXkM6q<IN4X\K<*b#5
^Je^h8 kXC:BHTB91+8$PQ/?u4uwSqRpBHHCS\>ANHHmp!Ji>F>NFm*$&QHpPQHTH%Z+S^HiAXI/uTqjEahH5nw
9@5^&Z uNe*NDG%MDe#MhVX$hbGhel$EV$tcDjPuhe#8kD>uT%mn#m!PRGFC#c+6/euCKP*p:IK1u:m!Qe^IHRw
6=Q\c9 NkkdYH$RF<kaXqla>knn<Kh6TF+@!EIBn\WF9NdqS:$6<Sdm%dmVPMt#^6bu?a<J/V4aYJwctF!$5Zh$
WG8P44 huF^h4T:cKTn1mkqLwwV&M+GFBMhNi&iR<hPCt@mKEV&$Q<:MNAiEF+DkaETtkHmmi&\q!pei1q<YkZ&
c5F6AI e%FTAubIAujmCMn>lN$WaEqwTPM^MaVS\$!HaCPTQj>:6Ym*86V8ZkX?uu\QEQ!di\u:KIDwJ?#c*M&I
*GY:SW Fi>6NiA?6HGa:AnlKP$SdIw%jKeuVHZ<J$w:H8IJ+4mVM?LK5tZ<wi$Q<A<y1AGG9:a^h^kEBbIhiD<@
J^Kj1! Nh^YpS$S+PFkdYEGDDj5c?LtG*k#Dl8V&>R%MDwBNMKH4#>ZN:CkeQlQWJkic1%<qHL4548nuaPLV*D$
BMb^uH *aL165FJW5<:EBViwh9YZ\^<ty69jj:mE?E4!wDMQ*^TZqNiWXuX&Ed:9Kk5L*><iS*PmT:S*AqqA>YP
#LKd@J I\qLREikBHwwHMc/G!1i=mCb=QeiILt$PXu*M+A*jak<y5uJVL?di9e8ew<yA+=Y#Mq>Xq::51tythm\
81CJ&X /<Z#18K<:H6yIC:e9j@kWZ:ip!iF^bZQY%:%nw!QnnIM9t=:Zy/jubGcuJSC8EPXi9hi#mMpu?dSR>lJ
/FyW6p L^>=5nM9N#M6PVE^?Y:t9Z6b>>LVWqQV:#>+<1!5w41?9kFySq8q&46i>jV%9P41c8@1Gb^e@QV6SX%%
JKDSlH BZdLl@tFADq?*Nq#Y81cy*DHD?+:KHBTWFBTTS+9JKFnapSlbAmWA/KQG8>L1t91Hy:=<B%i<<?M>uW&
F@N9MQ QRh&IV56kXV*c*%PYuRbh%^WVQ1Wl9=FVDkEAMPRqEp1/y6e?4L/dZ/kyTL9duTI6:&yyl#+/GZkL/SQ
4uAcE5 u:?\FTG8*+\ABmQ*cXqNR%6QV$bt*e985y^:Vd%>@TBGdI:IdEYIq1jl>\1L<?/uJ6@LVw&+:8cceC<*
itiIni L^i+IVeSdp=PFmbtqt*$#I\MLH!Yh^+>j9Rw@&qScXqX6X^qShEVwHJm\t@ilF%@+^Nmw/Nkl/da?Nma
w/$RRn <B6BX+HmA6LM&e:Y!5LCHKB6c1J@ZqQ66JK5lInApaQ:Cj9I>^<kH1R:hBAd**YeH#qBCS9MIah+n^+V
9n*qYQ EBIXq=TYW<B/k?5dGl8dkPlkca*a$hncYF1aZnDl8tBtdtEBV+w8kPlkbY9u=PRCjCHmkZ1!kt$ieQW1
dm=?VT pMQZRt<ubD\14kWl+kR*RpicBwy5?@PNnBtaB^+kHlVMA8<%n4W<8tX*llRt^I%Dm\h4d?4n1*GePDFF
LRt5h\ HVq8Fmat:8&!&8e$hA^M#C\6ET6GT#N>4VQ!p8KmAu#MnQDNID$VM\MD$@bhILaSebRmB=pypH?FC54h
q:yccl k85+SGT@MP\emJiRpXNRPcPtBeKikd/?4y/8D6k8y?WqSE+eQ4B9a#?/u^LcB8Rw&dHNw%SHaJ#+H<6F
$#u#b< 8>YQD#kQaBNA>ED*p^%AD1K\R>eB\pGKA@9&EjiT:TQ8*\T@R\YW\?HD!NFNEF9I?IuH1iHuEBApF^Kt
YGVRab &kEW^F1c1/&hA^BeLpBG8Lq:a9eCj9/?@6uXc$BB6Ja<J!!n:NkD9+>9y5h/ulepl\j=A+YIPP!A5?m8
VuqClS \qduD=/CZNVSN#\P>ePu::@YN9<4Xk^*XPiuSRZ=848+iRjiT5\848<tuS^k#@*iwe\j!:@A%^W#k*%q
MeP%WG L<dZNqbR&4d$py1c<4I!yBR6wT?91ty:tbj#aPAZkqIVQ4#T^TLG>wP/wZPdIGJ\AEu^cY/58:t814T+
^dB=kH 8K!m141/1kIyaTp64/!yAwd?&hPu#+1LT+GIwCt41tq1:?#b/GZ8:8ywjk:kLZ#!:FqJbR*!HH%J*>Li
Kw^^&N *V</PVM#Q$5L/&?cc<8iER9RR4Iu!FMt<Pe4c?641!54!!9ll>NZXbR<LenQL*lcRm^uLTq/>1!+9L1&
@my\=k 1cY61:8:6*eAGWSH!McIp:m^pbG^TZnB?d8l91aTumKTQEdW8TQ<el1cc8yuJjpQ:h%@VEnkPE=BWWII
C1^\F: y*uBGDXCkJyA>R?aGF&4c8\euH::qXRTMNDhYq>XuQ<ka?5%wJ*^Kj\ZHL<wZqJSXhjM^6:J#hQ9C4Ab
-ABF55 00014961160001202b3 Page 152 of binaries1.zip
?%<Xw8 Kjj#m4GiIP??4!*Q>DYY=cbGBuucttnIdpWLYXW>M!6:F$@jK:D#QwkYD=?W%4^5jjZ!htZym=cG/9#:
4+ABYM $cuFZV*k4!E@NDk+AI5C&6LCe$8Ke>MV+lLma&<F?#t+&Nw/8Wjhj=mVubpRJMdP!e:EBN\GI^MnE+?E
6:Pq\F WXI?nBeXXdX%:HY%NYXFn$HkVp6L9=iXp@5w>\H^Qyy%MAeaQhlL>Hd+#hD4X@&BVZN&hLT*5d=wc1Tu
t<9Y9q 4ZFYTWbe=MTSnWMW\EeVnwykA/IFBARF5E:8S:HJVKT&yl1\i!p<5LABY>uJFZlnh#eZS&BtKP#5HaqP
paN@IN LI/a4*F%>jICY>9Z*\<JaL8M9YRHInE$QDw^A$m9F!BYmP^G/Im$bFmJ+N>a\jRdPA&Pk!I+cRPj=Bya
Ep>Cm% HPCtLTH/A$RLYlt4/J4l+pDNKl\%Dm>:bn<LkSqq=hy*RpbNY\??Fne!%NXRpbWWP\4$FlE&>&PmaYHt
n>1$/+ +6=^VBkBeWLwKB6C#9kuVyBV5i+R&MRCBakTew4RFPuDV1B&nk+Phud\Nb1=MR\<EmiQH>++SIP%6#%&
5?4^eG jIMjPW+BFMPjXYL>#%W/e8kR<TAK9yEB/aEe&V^MQIIiJn8$Tj4=IjRkDhcG:!mIDb5k5BCBtEEFWCH!
k>mtec p!JWP*/k&>5<uY%5:S%kiCC=DE>+liDnG%WKkkNq*a5HC<8wMBF:B\nuLDYZbmhHl\ZD^5D?\LdjAN51
MD#%qW A&+4pITG^nAbAd$FAjt9&NBXX*k9Qm#R#<j*ctnM*d!Ky4/^8cYQZ$m%\i>S!8<Xp^QEWZ4ki#>>1/<w
:pdyw: H%=dSbtRMP@R*Nw!&DC?6KRELWcLYE5dZqdq*T>=6a/m!AhjVFPk&<tN8&CAwF9@?i*DI1CuA&tqcP9w
+Q\$q8 Rn4J&yFY<ybYyIPt9cYy1cGlCYqBY8tcY>9d8@wG^<dZy=nGS<GH6#c>jNEIY&em4^u/B+bGJ&duF=di
KW$Z4> j*lL9#k@BVJ*T&N>QjITcWCcKAD*TA>NX#65M>YB9N4iAT9wun>@$hDT%6dc*64e*NwKSEQj+MnIPDJF
m98#ml NpPeR^iJd+tLRt<@jQu&e:*^SX%XiZEl>Bu\k5Ebh\^*YpNNXWNP+QC?QaeEBI?jqFYWEla?bYlCaY!E
8*R8Ln BaiD?wcGF:Jj6MPCkh@aAeSRV*6DViuV*H6*6w!GycdpX^kdJBSWha\9&YJKIlAPK<<8KIZZPdMjj9#?
cGi8H< PLW%IM4D^qlN=nPIDej\<t4/\BmC&HD=YpnaLVme5cCp14:=SZS8eW%VjeYVl\<1Z6^NVm=/Si!ZldZ^
Jil!<^ uY*Nhk=Bh:Lk%M&at%heL%+\5jKM9J5b:8WiqJtXhV>BubMD!ApYyt&M\HK\5M9ei9K5yKL/iZ$Di&ND
BQl9V6 R*%hSet#\1jQmp4KK$Hk4pVKn=cCL&#J5+JHD:Q8bh^NTamNC4>?:a196=i:1=QhJR5VA^*N5$4Tamj=
kXBVM4 n^FAwmRiS@tJJ!kEBAYJR1nkEZlSCCPDA6d9YM<RbG$dB&hZX#eQD!@aD@91qRB@Q^<9V>RL>Wb>D9u/
E$G=/5 iANZAV96Zk&EBY:\&Y6I!I%R&LR1Imw&/Y=PjqFq+\<e=XFYPnwCFl#I5DMI4GMu9G6k=lHAmY8:^yV$
Y5keT1 \@IBI^u<D>\RjD95jKi^@=G*TlYPFme1hyTNtSq4y<jN#H*wlLR/Xptm1kR4l9pa+HSVGB$RbnwtSpaG
RFC9Ri X1+>S$WR*Dal*4@BAcGkJChnP:aJQMeBWZE=bjX#i5dtX9bP:6:?q\PD4kWGZ9H*Bi:MGpmV$#KmA6m/
&au*>J wMewaT^aFcA/\Z@<?Q>aKtyTICWe&VmKkkCAHEP^:%H\QRkVS+uHEQANQW:Bj?LEtkAK@klSEBXCV=IL
PhPWKQ +!l@kPD\KhLF<yKNnh*j<PDt+RuY$8hcajX1FWXnaS9RDRkSM^pL$/Nh6RW=h=NmIt+lah69\aXN8\?:
u?bF?d PL>5:S+aGb?iA:IB5^nEj+iG&bGi?yKeqKkd%+Cmm$4PL144HAIP+>QYBEeRGq+Q#a\kw<RS?8GSD><Z
+DCqMq G=?>uF6bS^qZj/chh+p6Kct5Lm58wkC?FmqqBcKk59dJk&jQX\lwLn@jh4=%Zp1?:R4qt!khaS%El$>9
nqtN$i =/cII?Vna<kE&Vl^BB$mnqIMD@Rl@eRl<LM^15uy?Vh9%6@6jDM@M#W/QDDRP#A+Mn+?NVW>QVeHI<Lu
Say8=R #%??L6P?j:5+M#W&%I?<y8\dHP\nDqAMna+np?k+Cn+nPk1?H!Wj:ENiW@V%k*<B?MXBhI^8atytHu#!
jc&:bV h?<IH>BQlC@EV$IkI9^iZ&<GikE#F#u*aSHSDbZD^&XXXe?1ueIh&d>u@#GBE+KTmnKmRqJ/F%BMMCAG
N=iSZ6 RC=E%Li?H5NcB*^/A!SMb%Qh9:!F5+$B:Ph*AwRE8VQclyb\uANRAMFlIAe?lPZB<I@?\mc%FtWul%>%
HB4e8R 9&TpKk%nkyPawwcl8jXYVAm>Gb&WuyMQ4FXn%6%ubT>iXBR?9J?h?/S=dKR+IdYpyRhYELe&N>cYi!kc
yP#m/Y iejiD495cGbpc8<jtbGde?iGp?EbHS8j8@i#:Zh#R5uA#LCNpatBtiQEbSAV/q+$NdP%hLT*6:R$9K^@
Bl%nDM &hDa%64S&hXJdD@c$k!LFy=Zqla@i%L\CCmw=NnIY>iD4\V+i4k/aIM&NXZpyWRFV^D+$SPdaL?mR5lJ
>m+X+h XJn<yBAm8E5IJ!+qj?15PlRKy5A%\KJNZ*@5In\pJBRJw:wijP%cIBJIhk$JR1?lX=Fk&yD4N/:j8BEc
F$9JGq TklDd#Hjnw!MnwtPB=9&MV^&?aEnF?IncaWXikykpwCj+DmC\=?%8=ZjNX!ZGZlSmSRF<Gw?Yb$>te:!
M!Pnm1 XVkWS<:Q65qMbNuP#MLC^LXjREyJSWXBTkKQ\\pL:>%GR\?d@kIBkXpKIKVa68<=KC!C&$eDakBCKmYp
in:9=< ICjdhtkVh%kWBQS#SldYnt+?X+J9*wyPTEyJVp=KmLq>K?T1u/8N1b/ckykAQ!AhPWE8IQkdwE+Bw8J@
ypY:kI 4k5XHKMlkJ^aAd?K\LRQQ=^@<#n<KBSIATAD\J<puATBA1/mCI/!:khKl+\G&%?$54c%R?!bHB\h5dD1
MbETXD /iZ6=X8\C5#C!:1<qYXWmGRYqtdH?^9Lun/Cjn5^IVE=JT*n@wP<\6J1PHl+iH^!B5wB#C4<bb+$5Kc*
Xp>Hee 5V\9Qj=&YNnN1KVM@I4G%!QRKbBPFbAQKPZu$8p^bHS#bN9w!Mn$+y9BF!Y9Q1!l>QYTRte9*AcJ4bK*
N#A@$K DJbq\nEt^WYq%e?Le9LGX11WPLq+AjMWjIJ^BCAI$HW1EJk?jTC<Id=DqmkY=8a&F#jupMZNJjJ*H=DQ
M^%::P !FjCN@RL^ah*d=B=BGS1^1Z*d>>??QD^+@LZ4>??Ih@S4:VLH>?>tb?du6/eSeCjR=ew*!$6LeKQSbjA
j#6qy5 V?jRcSS<T4IqbIF</S$CQmZb%+%99*?m9$?5E\m6njY%$Ap<jykF>uFCnI@MESGq5&jPuyW+jtDQu5Mu
?GWkb$ Vl\ZpbeVQ+uZ8$Bqak#!QhH\5IGJmX$y9Dek9R/aGi99c1t9^J^A>K&R!>/8>lb1pun<L=\k:Fw41/Jq
y^%cAR aG=n=+lq@JD\tPVMS<?\F+GL!:>@L5FbNqtJN!?:YltwTtF+T=#TM4KA+\Z<LkiG*Ln=b/B4Yhnnw8wZ
H5Sqp1 %WYQ:>*QLTm1:SwacE\LC515\TwEZ>a@4\p@jqlTWi?C8cQZncTHSa@Vkt&$=cXWDB&edi*D:@1eaGHn
5R^*?6 AQ/bpaEJ%ln56RX$A!tF91J+*h8L>NB%>@V%D$LZl+\hG^peGB#5:*9h*hdTANctDCV@4QTW8KldweFZ
Tii8X@ @D\B+Be9/J>VP!WnL4\8mG%J5IpJ\5nJQeKmEnIKePkF6PjYhp/\c@:Xc<GR*J9l6/PmpTlKYDSCht5n
<nlVGN nA#pHk4a!iIYm4Y8C$emYLHG$9EJKZj9Q*lTXFujDIR>JV<*KhP9$JQV\RVQ!4bVYFV^auB&<%lndym>
RT/IT* 1lmG66n=\L#i%mS41TweJW=wP>D?SBamM<JE!<c>l%<e1\JtPLKNpyytG^NI@a\a%tVka?matbl+h@Pj
>\wW5p QMSIJN>GT9DkG<$8Iw+hL/Gw4t>8/?^%JjlYVFJc%5P<jKTANT<*J#5>Jjbt5I@#JYNNBXElkmCEiPWp
#R8Z<\ I9Tjc\GT5?Cc\KakI9SDEBXaAd@*??TKMJpIlDj%P<4*K?8m^WXL#CZbPhk:PtE%A==i#uhKX/5w1%<Y
ud8V5= DpB&wbljjn5@Ph#=9KIaZwhq*e@K#utRt@i$8L!t94t#h^kw?duF6^?@aFIi5u9wD:9#+@&6%aZb1jHS
b@t#>l $dFJ/duFhi$D+@NR!c>6wj8?:M$+M4w?Rl#hBuL??EDq<:1*KEJA/j1N&Vn+qi!Du%HZ6%iZFBeVm+Cp
wRXmZd L&G51K*K#!kwPM9J!MWH+h*y6EIEH$<NSMXQkPFu\6iN=h?jNydS4<V9!M4Gd@RuCu+X@WV^eZpb?aJ?
:t:5$6 J@5KWF$l?+H<Jq6BX!m@j@*/Gjt\<Yq#Gjt&6p\GMm*^QjIJ@WaAu+D\uY^q>jjtP91d8I+Rn4W%9aTC
G:Be<F HFd\an%*\*Z*HyFWPc&m1mB+eP@8A<j+n\4K!E8ICJ$%Sp%k>mWcHnW\M4kDL@TB+@/%DK#/aE@d!:>!
hY9aQG QNDZ\>FGD%+++$YBmlNF<RJmpuI1t9yt%uAePE!4RJmub5ETQ1#N*?4*^iG&tmjAGAY+YP1jqj!M?+J#
tBQ@V8 FyXTPYh<$edS#R9nNC\1<Y=&*4Q!9P8QC541cw4#5nK#H#<6d?uy1u<Wj@6&$8&plKJG4M!9MqtBmaZ9
*^#@Eu wLVyujKZ^bqBN6y!5tiNHd!<*P\9G8lcPR8#M4G^Ah5PTGXpaPdT1t^5:i^ljV$\QDR<Mna&PVa^lhWZ
Wn@mF6 ESiP#e@NVp>PnI$M>ub*6nc<4C+4#M9JVE5EPV:w1y?Hm#%55K>=YpFKXHn%=Ka\K4Il9FhEXFJG<a\t
&?Mmd5 uB>qcR&u$9kGZA&?D69kS<ZE^5WuJBDnKGKmI>FI>DacSalEw?mmw!Ind$iC@!MNhtABkIIWq=1S<@ly
b4JBWE TZX>E?CQWuk9mhGj>GTMK!\5dMh^55aBcjWnHW?n*e=Lm9/ElEyiCC5i4I<!E\PEu8SnBZRTYBBtFM=H
&KH!T= l5PeiQj5E>#AMjP#pbNSWNHT\bjBDA^MSBa!bkIVK#M4B><?iuK!Q*\CBe:NJa#DT!yyGMF^JVh8J/bq
=QNZym Qaa8yyba^%JhYX4+?H=1VNkXh&5VDXpSA1D!8@DK%kwkIIq?Q:ptSHaTyPKVyN@dFEGFCSmbH6@S:aR8
Fpe+Z> S#N#C$9TCach9aPnM/^&<ZCKKRbTG1$q#%*/kk1TD8\@LE/Q>:Xk\lA:jHyT?K!p9K4&SZQuc!A%kbJe
1CMyCR i9<b1MeNI8EjMn?@t=<a:Hlipue@LVu=Vkd5@>w#QA$p>#jTjj+HqHy$euJphHSnlDBKNwIM$+?PVa@Q
QS&TqD %Ja$jF5qw4V9@A>^khZTy4j*j6wC/C\1LpbKpGKGp61ct1ebdnw<VD8\#Kw>D8FE%+t@%%a?@!C5EFh@
T#u!1t 4!P@KZ>?@@+V?aH<Ru+Tj%P9\%+W+FjBV::@@4G=<85HRHH4a+E!S+>%6JBW:^<uHPp55FhRRjuWcYZ<
ZXjtmy +d%:>l+?jw^jVE+cJ/B5THZBBCSHYPGHGl\&NH@TmS&N\:j$p@DKDiniQE#*B5FnMnMkDmZF^Vd\J<ZE
!X/#$< \Za<4cq*\ewG%mCBdBETFyX\N\iP68kik5$+9tCn#nNJ=J*B!DMZqV%#@wKq4SNGH6m>pL#HlYWbGa<K
FJ=SaJ K/6LC:I#:#@MK*4i&hXWtHR#LPH?5?L!^F8^SYZXqSZqPjw:&Xub8FX6ZT<:/!4Ic=w:?@m+YJ5cGylc
-AjhY1 00021199879001202b3 Page 153 of binaries1.zip
Aa!JND Pdw/cWt\M*I\I+^\5lMDI=9$+</iQ4tlahnIj&d?#hLdh?<@jwJN6V>>?9nl\:8qN@P#W?QDk:&9Yq@Y
wy&WB> qD<4iQluyICQt=MNHLh*>yR$Ht+=EWV+6<kiuKmpuBJE#>Vmpl$&+94K6i6a&/Ka?ITp=BVmHVTFInEl
6BXI:# nn\lhmMGmWXn!GNnmNFwFP#y!I+q^5TpP?u*H?a@K/6?&TIB5KIRPec!Ta9R4hNnVyn^J\5#4=CpLt!Q
@Z/!dG ?dw$!hhED9<VN+!nF=Y%n1+e4k#V^\Q&BBqbAHep>qBtSyBR+WRab5:6l\YFmVkGRX+1M5AbNR$NI@DH
bIZm1W \CNDFe^E\<FMV\Q+R!lPduqkFkG5WNLXQ@l&ZQ4Db?W%#^6cP41/8%?>/tl6jF+NJ?yGBHucGJ$Yk@wY
dq1RDT Ej+l5w16\+4ImnABwQkBJMpqEZKeKKZBX=V*ycpyCVqaCR/Q8GBXnb6LX8Z9Kw4/<9bqqA%Y$Z#@6DR*
i+q4qR Mh#h%qljW%XSnyV^qqhWX6jYk@D+G6m@TT\SLu>jATL&D&/p/ehV\>$NqaY=YbqkZ#\61?<eGJ@D%C=&
!>GwiC Zj+JyWXG1!hGAZA\FWLkmCN5a%P#k@WF$&>ZWQSH9l<@N!e*\<=hK5a^#<w1!51KT#cL$XLcm4K1a5>h
Hn6!\F ND^4kDbeDREqEkn4/Cy^a*Q%>/>jG#<J^HX$ni#Z&l4bd&Rh&WA*$e*N6e%jG/8d+CQINyC%nX@w&1?N
EVM$y= D\Rmi1\VcNCcmqKk5*K\t?*wTP6>B@FKADVya@9*:Dy\:QlSIXqb@EqlLjRCcmJpnPqRR\Nnk>k&W5uL
k8y5Di >+>9ypj:Py9@EcHa#BwnHXWXBXtyVetV$4KKK1ycile5deDYe@MCGR+Pee#MLeRcZe%??L/&QN9jXJGj
D\^^Tl ESj1:@\HNGi<QD!a6uN&>@+DYq4Yw/ey%*Q!T/9Kun#M!M#PLcl5:t!y8B5SFyPS>/#wYXHl9jCAnJ\u
1#N>#* ycX=Quy:Pbmb&Hd\H=a+b?pb+A5\M#A\NLZ%CAkM<HM@!$uLV5y!#A\M4EiT?wca5dQ?N??\/Xbj99=E
tadcQb Xknjn*#:@QpDjA5:PV4W&>QS?L!!GGB&J!H1%w%Aj$>ui!6V\*N1!4LmwkTSNh!c!D+eZq\GMAcH4q&!
+JjiAR ljWqAdA#EEAMn5NMTW%L!$DT1hJTW%PT!BKS?M$EJJ+8LnatNma/Pky\^ltFVY1NV$^K\Vm41HuSLAp5
uiMA&P P8ZlddR$SFwm*TaAnWlQ^4VC\5^/XE#VPjJb#&BN?nW4FSJw?FNP!jZD#\LQmXdn!E=T<DFnyNEC9Jnl
WNuIHi qDTEqa^qp=tBqY*Z<SMukhE<\E8DRB>JSeiAMBPbkB%q&5@MSAe+w@l:%4SNWNQa^9%KcQThuCjq#=9c
ljne#N 8%+Qkk$/\NLj&>u!w4I\G@aT6n\uJ$wW/SHbFQ+Iw5&pCDC*kC8X4!nh&%Ba6k*IR1!aAFpktVt=8L4a
t6H/b? J=TCVEbX$=V@AjpK$N1EQTViL$!QDd*8dG$CVkKyR=>#%:>5dGpD@:wSIDFuaTL:CnWtllby5QmQ=R>9
Lt*NpK ypj/Y88A:MnNjX^aY69TP#!%<P+nLFbFmGRALb1%q%@@VhdtCDyKM#$:$Xye@lFB1XadJjl+tZq=6t@j
aFIcLK Lil^@&FJdYWJ#GaM^WZqqVZQ1&>Le&:ulmhDl>MBYRRCklKJZ#e&mV@RVRK!mRKTEKB=meTSnZZmAu15
dC5+8P 1/*ySY%XGVB!D?=uaGQSL596PT/6yHlKRjnku6%:D^+>\m<lJ!E5iNdS^QTCCbc\AEYGy5=qeN#S#:Wj
@>&GyQ u=ht^98:Y@<qFQ&\1YQ/&8yuXE+yKTwyuXI=w/1yw+>l=P\K<%X\cEVeuZ9A$L*AuyQ<@Q%yGunt^*hn
i/AL&C d9k=@=GKW8KKGkdtq?^l#L<eGASVZFyY:8P\k6^uqSYFn#LVM^<<Lu4S*qd:MPbYXQ1ny<YFV@J#H&Rt
^+N\JY lun=b!Mqkp>9Hihka&Hm=GdqWZP$5:G/aGSpd8jtF?DnA>&?+YEYLndtLbCah\aQM$I*@@:V<4i9Q*:?
tpaaFu A4GH?J95J*Hq$M>9Z&Cd1btJpd/8qyi%=TAlb/VE\&F%IFJaA/YwwT\4Idwl<l&*F\?HnK44RIn55CRL
!Lq&ak V=p\mJJT:1VhVe>AM1p#$8@iVW$lV$/E5#RS<Q>wQCXAKYa#tkMmlHZi#ADlwRlCJCQ&HWe6!ENHT\M\
5JwVwh RkFG<A1auA/KShbh\1h6\l/%n:#MCZQRqBBhATDS+hY<Mq4/H@84XiHIBMpbkFnebEFlH5KtqLFAc<hC
*h=F1L #e4C^4qDAAFb<Mk&lPViKPpaGJuld^PbmM!WLN5w5Zc9J!BI6Hl4n<Bd<StQT=<*heEtpiPnk\Q>A@AP
nW8^<5 j4n@XZNh/ePWmC6P^m4mSN\**G?Sbh!I!BRP^XEi?ILT>NwaGSqjMEM5tLeeG>TEX8FFNd?BXY89@AWk
je/Fmk \9Vk%\>9bmhkm/18DnneFY*q:Pn1/S5cGaNTeQE6!Dp@j\PdBlGCa%MIeMdq$8#+aGhDVYqSaYFSYW*n
mDD$!+ K&!8N*!kVWyPNIVBn9GSEa\kFBC$QwIPWa>NVVZqDSJSm4icjESiFl+8Vn=lt>Se?J1k8KmmpqBNZjZm
j5\*Mj umw:F&SuZ<D1S@RZ<R&KIAVmJmCGTF\t@pSZmBQw5Y/k:==ZR&Q%MC5nDSIV:uS$4:Cek4!T%PE>8*d6
WiVG5/ P*4pmImMNI=jph#RnHlBcC96GJlhd^pGKYN>Bd++Hiyyd<S&E$uiid5/&FydtPmj%>dWSDTENdZPuTe>
nBAGA* G\PlB$/PD+VNV>P!<&EHhc#Q!1<Qp#$Nba@Ta1=n\ElBaKRqqdYMTNWY@u?A8j<kJnw:4:n<&iQ:h#P!
w@\Lii H8bZN4i>iJwWEbu!<Gq^WiGV9K#W8Jnw1K68<eSm999m:B^5DC!eLQSMP@H18yeeQGASBK#LR#!y@c^Q
b6KYN^ 5uK\IW\$kJq6VD^&>GMLT^<?jaEV&JB%<4ZjG:?P@q=dZj&><kQPY=/hHIcHP%WqBR<#W^P\^P48cGNl
dnQjX? 4Kh=Yq+T@\q*HC<BaVquePGm6d&#P\tY<Mma?MVpP&uyGbuA5JPGCGjeVTY:R$\mT+c+WCjE^<h6!d6w
=WAS5u h5^=ka@HiAHG9pqi+l8P+nk#LWKDaAXXKB$FQS&RiPRM#D>btA:IY%!:*#nYtl@6wT?N^+AS$\q+$Qp/
uy4ckq &%PqGpe8!puP9GY9cLG=%^k\SBamK\WL#%Emnq!Ric5pky!epk=P#Ca!4VFVMFCSEdGVVW+KelyeREVm
6!bW6j 9aKKF:A1iZ^$1K?uC?qp^@d!/El9i**y\/TdQqdc51IILkSC59ML!9949yG^wjEFVMqhlPdJ#6:S!e+4
=kpmCZ 8?bZFYXLZn@INQ#EnVX+PVp@DR9pB9y/kF45/u4%18h%*\C\6qDBLaDABjLM/kb^<!<p\Ga6#W<M9+a#
ea<Hj< HM4LK&9B9lthZwBuH4?*FB#%TQjW<Mnw&qcYYRQjcEb:c<8jQG+kwtR8bAiJ5JWSF\jZQqtV?QK!m54%
#jN%nM c81cy8KLjJ#49FS<P$@:Vu=C%$AKRbBXIkXCIBCI9+kRGwBID$tcaSaIuk:GSpWEci$=Ima4y!A46HjZ
>lEJKS #n&Hnl+<LmpnJwnHu+NQaWlb^SD+ma5=k/ViAZCmT8?YNE8HDeY8?uw+P<DKQVMVI$Pm\Wt\c4DC*6di
nuGlj\ $eWNdQk4<K+&Kj%BRWqNW^ie>@F:=h%+>+8T*LVw/:=PJET?+8V\5th$nC%6HF*@^em>!Pl:D\4Lmky!
TXhcTb :5J/18L/=wc!8%G*p^<<KTp8jJ1ji#elK9^Y1K?um>MNa9F^#i$euM^MHP\M>E\ei$ZNjd#eahEJQId!
/In@H< >L45K59B#5:MBBRcE\MDJ/8WR<ju4>>ZX6jZ%%b@\epE!QjnQ&BV<6?41^CWh+8#<I!qwcc5MQh?YqJM
ybqaI$ ?HYRP+ELM6HZQK$kmj?M+\jKVFFb:b!?5Vpy1X!=FlKG%b6CVnI^V4B^&!SRNyJRpFMwITRIkATiQKAR
@+@4Jt FJlaaI%wQ4Ae>a%Kp1LjeXVC8?qwcIp$bLT4$AW^AWK+SI#>W&8HZ^Wu?=5ypkmSNA:J:?%Mh%G1\XGI
R5YK$n e#CSaVpFiB5YMqaE\\NlyRa/na*:EBFH#W$F>SiBuJ1CmwcBmip*M^WLE@A@pI@n+DiwhmuiL1^8:Bwe
K?@FiF G^@yl#9pbZ*>m+ct%1:i\hGS99duSjhnk=\MqjBdhLA8w:!#Z94/B8ALDX9b\$FY<Cdj$T18C1cRm6HC
pBn&EV n=AP1MP?jFmeub+aH^5hHl+cHBnw:^<ACRwi!$IS>kbLIjCWH6K^F>K^99L%+>8F/hGBX!$9u>jY%eQC
FmE*+W u+p=iP!\5pcAI8\#T4NS5#D!L^EG<YAeiX%hYXNVX%G$mcAwha4KeV+?ZwTQnwiVqiMIQ1c/bk*ppMb/
lDYT&N u<Me1:!W8^Y4mC$AnuWmAtVZE@Va//=@R\G9lCQCQIS*<$9J!elLHN1%e?j?I\eQ+/RqlE?IuVE#N#QF
Wi5%QF 5IBT!<A/wGF!/e99XXm?NN4@CmBhm6Zm*k/>F8Dq/8^kd&hne<uK$yJ+WenTm1Sake#C$pbaSC!5wm89
9=t44a c?pitq:/59yncj^XQaRm^Nj=D^T/a5C\tF1B@RW:AAXiC+anN>MD58:uFSeXQM!Aw#$L1l6iXtdHSmde
ly!Sie L!k1KZ4/=NH>yKn\t!Hiu6=iZ8/?lWZF^R:C8:uaGXp=YSpaGdd^:hen8mJ85KKNN5BQjV5dB\5npRqq
dD%piB AHJM<8t*Z+AH&KAjt<cDjn5K?@1BZ@4><>9uh@PRi6LBS*y!dAReT+lyTc$#mqL+bh\J9Lm$ww1c>l<i
CkQ89k jC<H@y8Hi^AH:HFRFpkhcYTyCMkdcCIKHM6ipq&JnL!NDVZHb8Wty1SDJ511/^6QT?NB<lDmwTQRwLV\
<y1tE@ mR/Bnw#lB\9njp&Q?QL?@51MIP8#am8+ES!>1I#F4Yj>LepP<4W+TqE^BlaKAMA/kAFqRXqSVGRSkYWl
pZG=6J MFP\:BFBeLT:Gcp^X+KRW=NSWFJ8a%qlJ1QdID>P1ynbH>deM#\?N6Dh%qSjW%qiXqyYWX*Z$Qy1aG!5
<WAPIb 9/*&Thw6d\5%!T$mGAESlBIVjV%>R!NnE>lA>1IX9Mm!8*m=wA+RWhqR$:Aq1qc?jX1cu=&itlkHWI^C
4*h<Nm A<E&Nn+PJ!9CZQHq?\yRXBkPB#Aeju&DPZ5e=P#Yy5dG%5:iwjHy^Zej@:n>#!nF^w6BbIRMJA5EE%Rw
C#L1q6 ?I#EEiI\^YlQKdGc84d6$iR1RIK!=BVY:acVuV8k1G16t1c19npG#\HMQmYjRMJKK$1ETk4aiwBD:/6&
ZN%bGD +D\1@?CRCHEIMhm@:/T$6I!W+J+hP*ajQHV\lKTW/AqScePLY#lk%8PCce4+It\%B><DDEIlXXH+PA5I
9@<SAH 1b6Abum+8nk=PNnb&1:dCMB?>%BA\Y%>:j4N!QnW?+<\/++%4Q&?NNybZ@IRw9A*Q^lJKGuwt&GT^Dhk
Qu+LTR C+Xp9<TMl$?KC+C=8Z59P:ip@tX6RXJWZGb?WWq^$hQ<uD5^EYE*k>$>aRe6Q?iWAkDDbTFPpAZa\DiY
My$t?a djTMb?!eZREN1Me&V!<99/5Z>4N!5AL%RMdI9I&S:ZDpMy^d<RPPyNyeQkbHW9&ENMCk>5<XYW+tNB*a
iCkGA> McCq1d:&YRDDF>^?WVFyBSXXdV%nM*m5=\q=D\&@HS&Z?AiGuAjEl#RQ54Q9R^n8IMuwFk#:+mAMpIY6
eR^/8P !cS\&H5mb6<LT/8iN/4Jmu*FWS^qwmKA@LBPS\dpFAW>E?5KC^P:8HNpajh\je=Ny*PTw4<\IBS5w58H
IS$&!P Z5bb!>aBGTYN5JC#AB+I&B^XFm^bEAAQG<\W&$@Aw4GDDPSau$pcDAA/ylXtCuwK5k*\c$jIPd^jn\?@
-AaeJ* 000354784fd001202b3 Page 154 of binaries1.zip
Rd*M$F dt><ZqZ/:Eq?Zq=?RYFJSS*5>#HY%%#^MP/K4a/5KI=EA>%uqQhH8P:=<*4/5GeCMP#\<cYN:TZdlNy1
c9c<B8 REN=j>/:4%5hZ=jjL<:Q#W^QVW:<HtihtJ!cuy6@<?:D<nhMM!GRA^aTB><@A>W$NV4W*+%$5ud*Da%N
+*T1N\ #RNjAdLC=laHZ^9Gj&%qBMnDFkQqt>XWNV&FV%@SEqB$^JIQhwPq+Ya<:=qVX:5BKKl4juCcG%K\jZjA
Z<K*8h &#d$F:IPCin4:tl?YXhb?1\A95ptEZA>RG:uad!$yLV+\S$:h?\=iPCI1JTawKmR19tjnGB5DDKCqYM#
tGVZX* eM*atPjJ+hihVhkiAVIy+u1k9=iHt+8#p/PDA&KQ&CH&1MN^S!ekpd^J&!M/MT$:4/kKhttD=%jjFpe/
Q>ADaR u^j@lWD/M@B^S1LTK6wpI?H>q+LapL9*Hle?ibTXqyy^Q:8k/pXhaXy$#N&<b!WqSe?iQE!QDR<N9iaG
>nB9GY GHB*h*P::PRS?c!+KEGJk+PXpaYNqatXiS9N!XMYmC91^kVL?V%>4>wJ5eE^LAmVHCM>QT8Q#>!9u+AB
blZ9V9 &NDy$<iQu?CB<XjTeDd\=eMMW?9LctAu:1WC\^Re+P%md&X1wK&1KA%&KkBBTl+i%BtbRYqHA8EYBpJ1
=T8JhN GnAV&hpQHlJ!cS:paCBR*EpGYaEmMRGARA8WEkDl>t%CBH1da?5tFW/N!!<51c^4$FTR?IKnPE^LBdQC
IC$j:: Jl$KZDk=LRPRT1!:VeN!&$cd<tM<nYV^GAb+FciEtyHcKE9yPl!X?G+tF8C>TYtBA5PAqBdYtiqaPHei
aVuJSN FeHl?Dt\!%QTkSWNHiM9bkyGcCdkKSbC\WlPa>ZRDhk9ij4+RSa^p!94\iPuJVXA^a?Nh6eZy6=\NXdC
J8uJp4 d=HA?Ruq?S/nAS5DRdWEE+MFhN#t%<8BWKK14K%@QQ8N%B+BtP&qN\8RlityKYRTtWAtYcdke@6FLC%k
#tVN^e KtpD+LAH+4ABX9:D&<YbmbGl@4+?YDw+Pjjt*ee9&GNLIJKYWeyjyc?Hj<HP<Q@mkZJ$1Lqmw=1!5t&m
Y%YL/^ p1=tHWW@B9H6&L:BT<6HV/b$><Z#KpBEVYPXGS<Z1aDJdLANZWZYABHdkT^5ccm4kqju&ji&mAm==1P\
Q6h8*@ +:k+I5Ek8H9H>q*:D8\@ITElLM/9cGblByHaTkyGSl/N\F^D+#A>$6eFNFLJp>#MP@G*RhV$<jb\h*MB
LtD?nC WDk=PlIeWEh?J&eZX/#6/dZ4aSE^!ip=?YByP@4G=kESZ^cGP\AS1j<t\lW9h^c?ZaK&\Y?LmEm*8QTe
NWQ:l5 kmiQ58@i8b6=Q:i$64apM!+t=XElBKI\:%=m^I&R/=hJQLk/P@pE8\aC!=%q^MHJ\e#I^kb9%KuInym+
G^5ewb R@5A::C>jK>+!*G\e:EB?<DC^MlA^<lt&QEhAAF9Van9$R@HQu/Gk$q@4c&9auhw\:&pS%u*$^Jl?aTQ
Pmq5cb 1+PXtiE=XTXbeTD9D$ApqFY%hI%MIel@pRAGP@X8Bp\ND*N#ma>we^<?!M+CWNACKPBA1RSmQHWelkR^
HWdV$Y km!eGMF=P^LVT5q*:#*IA<G+>1ZPKWqSAAW@FhYYXILJaS5#<\wLI@MJq*5Nw=*F!REY!q6R1H8p%w>W
96u4PK ly6JQ5hSm$q#54A\p&%SRZIRCJae%kAX4B#:ASXCjCR1wJMkI/Nm@A%pFDM%aa5KqJ^iMR6?adQV:!Rl
DDhINN <h\J!ctbMJ1>:B\eH&14#L:6a/E15WWF!$iW8<6WT\9&^NE*kChS=4B$+KJD<w6jWC6XQRhMIAS+R@L=
aIkcX! \>5q&Gymhtbthby=B6dHa6pB1CRTD95lDy8@j*#=?G+J?QDS+cGl+YHaakBam&<41*?T\@DR?PaI&VAB
:6\JT? E$pwAAKKJGTaetT+w*!6t1K1<6Y&?thjWjSZ=wuDeF\ALS<96WnEm+c1>Y11=$&il#mlV618<4\N*WB?
%tWknW \\\^AG^T\@N1aE$j=bB+kNPm4=kj&CMwlljHH>!^jej8A@5P+!SEGRS\tqbtY!pCMVypcGB5tQd8&?y9
^>QcJk +BqtwL^54C$9BMEdu5Xe>jj%<jL\eAPm^GZVGZE==kwWpq>AIH!8G=?Ttj5Ec:E%Q9@^^>4!@HBHZhEj
$Dq5HW GFSJMMATD>NL>5:RLt#BeDp8@j/nk5e=GTq*$nN#C194Kl+q^mVtFJdAq:#=PTtSaTHBX>\<IA18L9Cb
ye&Zey 4w?dh&=^$YQuQV5+&Sqb&CENVJT:hD\<aa&&J*\H/u>Xa#54F#5LE\K5NB$Dt&\SJPH>Y<IT@>6*:#><
XQ^aHy &tKB%LeS6lpEInD:L9DRyE5eM$Mh6XP!5AHGRj\@KFmVCwm*WElJ8\6X$wQe*EiQpV!/^+>!H?bp*j5L
?TJqVt A$\R%HG^$hGS6=EINJ\Ct@#MeS81JVmTBF:qX>T?$FYSFF*GWi/kw1at$mC$FHT$&GMheu4G:!\MP1t%
LY:=lJ R/<4MpJ5%TXEj$Mk^M:=bDaPq+bhpABA!LPDLIFyyV>Jk1TXjnH#54D8lyehi&ty5SMuLEtRWY=nbqqq
tjjtKC Jtil\@y$W=BlSNAhCRbj%?Va!HApnQ6tSHV<uZ8=eF#=!Nn4F@pJX&&%ydiAwQ?Ae6hy1t5CIuS%waY+
y!Jd\8 AB&ElWX\XVWAw9yFZ9M*qBHKyS>jQu&AqYAL!D\/l<\mM?k5<>#<A9DSYIyaBhaBR4Edk&L%=%iktSdu
P8=+8T y1HSkEi&JIQ^N$YR9!@>8bWk@y1G<h/!Z>XpXR\6L@JiL1Idu!9p+P$:>dbDZ5>dAR8$NY$^NyLdPWHP
Z1jBuj wPAVTY5D4tEF$nCIPin1<1IuY#SEAlwC4\Ra:Nl@Wp\WL:TVn&@H*u*:V+mJM=<<IReEE<ABbAeVYG^?
bw<N=l !Mn!<bjjc:DIj*\IC1cKImmakMP<hmZA#<jdC!wZN:h%X*+*h$#%ZIQhcSKkaTm9c?+ctFn<6LK/QD@W
L$*Sl> Zqj$AKQlI1ABjN&@+?TBY6I!NIh1CYTW!%eDA+N9Bu8CuFL\?EFtTpyc^4%HyhWXBYq^<bqQm$1BbTnM
>B>jj1 Va<PC\+PhMW!k+5#+uVC$eHi*hWlJL*wcjbqjm+PJta&iQuFTMN>!5$HK$4GZnTFtPpIe:G^kT*D^MSI
lb/b:D S<><QQLD8:hLd^cSBaHFN$5kbH%e@kLQ!qilLB\jiNWCt*Bub+C@=QY498+P%tbGP8w1<yJ+$SZAlLn$
Cat/dK Z!d5@<XEWky5mAt#\/P<QEI?:YPASDbAktaLCTRincPE?REB/aF\m#5eGAkwt?KT$#J#Hn$y41myN#k4
6y@E4n Db\/lRR#BWKN$K#TW6KB:QCVlYG9jZu@$QMH+T//$umMBWu>K>t6k$ZZniF\KtqSaB!aYj=j^jRV@J!d
5L$S\X >?AJuInRwY&pP#+5PbDVMdPA:EB@lAiYq5KWkXDReq%Imwt+EZRXCiAGZ<Fd$Wpb8ZB?&hl\c&ucDSh>
nFDlt? iXEMBRwWwQA?YE%NZWNVG:bM$#jE@MMFq$j%K%WWhXXQwF!Ch^Qjqn>>IC*!+5L9iea*T?<@Aqt/<t66
6B^:he A:4aV!kbklC*EhbY9m$Dalbty=FJ^1uy&RZ+ajBKHYQkC$4^8*l/+&>mIAPJASqFwFIcGY16Y1tt41y:
GE!q>k $jBwGEEyb<*&AlBwYHbdqZXXAy%EY>NTpcdB!kJIwPR:HLBiBVDaPhTLHTV>\TABNuWLCd\e+CVPh$kE
:<DW>W \hEj*e:L5&Q9upQC+ulSj4#?^T*nRDykNhT@Ab###?Z*\DhAqXSNWptSGEl\:A\kkim^/a=/HQQ!khjZ
eui>8^ N&:inptCJX4AN*eQV4=b@9Z:<>^kY?&#B*imRu\kBnIaB1jEkER!64S#ewZ+aBleh:1Vi8@^+\j*W=NV
b?eVBu :1buF%bYQ45ZH=6cWFSTCmST@9&Et$HZ49qlPRFKM!DPEH5YJ&hZ/+Vmw1JWiS=PXmbtXwTbm+tPVe4S
u889*6 *<ZXueTBj<l%F%EYFuJ&+B&&MY/na>#lQAjdSmF#/D#@\8LT&@iRA=kc5LHe5KXFej+D:Pp/LGHDL8%P
kH#tQP \:aJ9#AMkIQi\5B=C+QItQmpP<A*\M#\KC<@u%BAB=?hQ+AeeG^^EB<jB/%DJDDR+deIN:q9aTBES<eq
/JV1N= yYXtA\:Kc?1N%YRAB=VmEtTWSGw!t6<kNVBCDqlXC%?NNPZH?q^RBB!M+4cJTy5E=Zd$Q\$^Eu8Bw^CV
?GY+8n *pbk&eAPX#i&<5E*bkyY#tMInqYAnZLLMMB@cJla%=lSJ1yDP/nIkHH+@\n:D:mc@@h@HD@6eWcudi?>
^aZmC9 w6NilBCXwmqJEaYR9VImlCmK>m+N$i/ehlG!R<nii/@YPe@u::wi#^Ni:<@*>9@*i9GkHp/ue?:*^*Y@
68V%RZ 45e%CAMG1Fn6CMc8Im6ZBc*FKh%HE#IL1m/&+BVn5LYiW\$bAqB9cb%QB&!u&&IXB#amSZQk=iY>9X4+
TVLA!S 5%!8wm#4?*icm?Lw%:i9+JElB/lZ4JjWm/:uuBh\$5AJ@@$Z11MPKRq/p1VLD!Cpu1PMRweCJNTZ::?:
kt#J9i :aD5>caHZTCK^GAEWB#SyPkB9ihLJV?E6JAn11k/%hBF$#<*nWL*YWG#q%*t4dMhR8Z!5$$=Hly5:Law
bddFAA *>jn5XlTkedk>w*LtNJTWmBq\iGD?@d5DN/!cj%!5#:DBiQ%J\#w&cNuu@+DS^y!DeiNuim#kBFHJN9K
/B!8S\ hcmd!/a*/C8<iHT*?R1J9+MNQSc?j@jP:aRHG+AI/>bTc<SBw>c8b/#B@pMS$RqyPRZqNSk@ikW<?QAE
Y*m&AE ibCGQFn&l\eYy6c#uPe9Ckkpttw4<GDZ16Da8LT5#JT+KBReJ+6KC#PmnpSuAA$A=*uy$j6*B8@aG4kT
ujmMAj HJRXptW5eN6HLeX&Wj/?IceLC4Lu>6ZT\Q5wPQXXiPN<k>hllT6yk:h4:%w4Nb+18NleNyi64KJlh?:l
6JRHG@ R@Gn5a?J5Z::kd#<dhni:5:%C*Wkt#QRH>yD4ln\Kt:GbE6VI<N&\VADR^PL@/XBKN:GSaN4p\VGIP6p
T@!Cu# Vp=iu9mWet:PTiBBemLDk&PEB$i\hlyy5FeMAwRR+XD+pYM^miSiVqk>#<:T/KNA#5SKXd/dB&1<:&11
yuDYi# NyY6F\8Pd@PhaYVRStlk/d$:=@KNuB&8TIPy9VuhNPnkIRp?<XVXl+CHMEFZH6DjKTM91<Dq\>eWRV8!
+Gttba FYT/ChBjdyn9eu?@^a9>qwDd5*qu&NHE:JL/1@h8%iXEdQc^NYc$pP\dY8&%$%TdGaRA1Ihe*TqQ&SZF
%Bn#aL wl@q5lZF8h?p:nJGJBD?d>?<iT%=JZ:JijZ/HXwASkX%$P@yQp#kCMjR9TXi^QMZL^?@iQeSV!Dt@Q>C
AW\Nuw !$u8X4R!BwC?K*8ulSmA4n9!6&@hdc:/LyRA?G5K#u#<T6MJb4%:+^\^:b/t!+:XXZRC?wX%laF>qJAT
e*Jntb <n&6q6b*XCL/Y&=e?T@/D?#F19YN/>e5/h6u%AR>@hG>hZX/>i<*cD#ZTH?MpSiKISI<w6\q4wQeh:j@
E%ie=8 @w1n#Y>h9Rm/GbSRRuVEkhCRZV8C6&E*$w$dNqD4/ZYT6cQk6CW&AGXqapa8hq!/l8D@@i9D+=8Nwu^R
l8b18^ >n9@kJ@Y@!tadGlB%BA^A?khBG>d8V:1iFJYbqy<FA486NQFlhpklqL!C+yADiYjnD?$c%9\6nW4A>E:
J4XF:m D%nt::>W9IV!G:yp1i?cqM#C\yYn6BD@CH<&h?Ap>*XTMdSy$=cRVdQW6BY%%Lu\Fa/!MqjjQi5P>aB?
DEi%Em PQaSMIBS1#@d&:FnM@kH>TR>JRd:tYES$eJ=L4N6y$+$N#E$^GwWR!NVT:^ZeQ/ZAYGHDwPDCe=>cpat
NW<uXe E8BWb::!1h#54A\pkAIlAPklFcphAQ^*ltwV@B<<hQkaTiM+ZT!5<4K*M9wkpDZ4LTNSwEEP5bRy5AK1
-AuN5: 00010daddda001202b3 Page 155 of binaries1.zip
6a$B!e tt+6X$5Vh\e+tlwT>B6cL>y*/84%p<HPlp<FMlQ$Z\npDKcPbZeBB&nCASa^BS>+Kt4>^8wJBQ&XWj/L
<dI^NP kRb!Tt!\FBK8HEhJ!kKJ4J#Y$Gu8qIjPjP@FAc5&:AmLV5pZZYm=i::k?QaqD1bTB^p+IG/iPZp1Dlyl
TYu88n lJA4=TG:+FD6D^!RijImtACAh69QH>?@jeXBC??yh*J9*:\GD+##?m$mHB#p>p/GBl\TMGIEE>wK>55d
>>Mq?w nZF^XT??@Y#4qKwk8e/mB@hAA4X$Eq?A8m6#=!=Y1euh8Xqh?q$wFuLL1/4TWy:VhMZ?Kd%/pZF/&pM&
iY!p8h CK6FKIS1!uiNWEAY$D%q^/S<4!I5cL=!wcGdBdHSpiFli$NA#t>a6&dX9F=>Sw@V$^9TR$i*h:<B\:kC
bb6E1% k:F/$*&:ZRLM8KXel!+S6iHF?9&Y/$!8A8InjH@w:q%kBdb6*aJMACy$4S?=cjM&py>\=Fl5e8cyI6Km
AH/T>d >9H4#:>@9Z@W*ElGKRIL9JEFZ@C>p#PhwDjl6&CKMSc6?m^qVAFKw1&LnpZHyYYpJS$@hn\tJmG:5QBW
d<p=!& +6HI8L#Cw1KC\wLeyInh&:b8DeI?L55CAwAJaAepj8LF>JKBuu+J^cYl994c&tweNR\S5Vuc$%i9Y$PG
@+y%?d G<Bn:>4Pu>hQRW8V!%WFW/Cp!l?!@^4XP9b94B66\c@Qd=?%Nq@Cn9\aC5DEE*K:=8w$c=1%ybpJbalb
q@+VJ5 @ePMVM\54ceBGV\\h6SNl9AnS/NneTa+c1K<@Q#VZYhWV8jukWFIA#1wM*Rk?SukMCMd1FB1D^Y1la\+
/C%n6h eQD\Wid?8dm<e5H5TeajAN$&P9IMI&Vb/B?w<5jH*/4KPBDpbmXqlM*Tk/h9ZM*e+tV+ZKA\dtV9Q5Mt
&GkH8y 9BLIGh1!iX%1tNpp@mPR*9GW%Z1MERmG>tc#P4DSya^KJ$<MnFD?\+k?MmwV5D8jm+j*p5AN8\:FbBdX
:\&?>i ZY?>Wyc+b@qeC+aRA%:V&6VQBbPuaL:cVD8MHLt/8ut5KAKnICi1LT#?RjMy#Md+^a\k?5S\ku=L9/Fj
PlCaRC e$AWjYL8d4wpFFKmN@GQ&*>??@Ly@d5*#eL<yMmap^pyMaY6HZ<N\>tGi/mKPwkmElP9RQb8W>p*WESm
LeP&18 VDc5Td=N$jL**KX<$ND&#18y/BA1Xwtmb8nwpkD1wP&91@?HDbl$AY\AWR?CCP<D@Aj*G\X<GKC64h84
9AbGVy :$DPGIQ^aBT<mYe\n@Kk*Ic+8wAEVAT@+QuD8!TbD^RSSqQC>wj8Cht%e$e\EwLcLA8MwDcM\lnw#lB5
wijkVc *^1NPiRqFjXNN?+>ijPq:ii:S<*ulKh\68m/AEKIH\IF@dFn^$?i4iDu8<BcwNelGG%kN5ZPBTTT%EVA
AYTXAB /d>+/:EVTSuyTVHHMFW8:XSBjqyW=QF5wAXX1H$1I*yj<Pc6G%aRYnC5<ANYmBiy?jp9>ap1E%cpVNdT
E6c:jI W8ik5$C4!uFM@NhV/^VJQMDkZXN&Bllyct14<eBG1Cwye*5F%JQEkIhM&5!ud:?\q>j#B:e8u&Xc&B\L
<XQ966 q>/#iduQ5dihm1*jnTtn+eatyyaVy$!*e*V^\Gy5+nJnn^1MImYklTCpPFQRXckKL9+yyEXKa1#Y9:RA
jk:*uV qdS@d&nwun*WduwQHcyJtAHE\E9w@KL!Ct>Hc?N*AnuVeR4!FBBD4ERy$pw$:=8cT8<h>dtSG:%6nA#c
kk\NZ> CVN5q+eZNq>K*ilk?F4AHn6mcH>6MIJ19ahNiA8<tnYe$\u<aAE@PwAj/EP@=5qwncAE5tQ+LE1GJT9B
C<BA+1 @FpbBa/a%<tXbZPXySVyLcQR**\1EN@F!&@qyn$Smce1tpCkyIY6hy6wRBk!>mY6>ey^+mReWIHK!RqH
4wq%6% GHl8Ek4Sa6Tei9+D&/^$MKp8*@BGW$wS/m&dBCi?k?eM>GkHhyAdB5#h?Ny/:XS/BJ!KPdqbthpbtdGy
9YkZEA X#5pEw4/T56%uV9@6I5aDGTHBA$GBZ?W9>%!YXV?Zek1:!lZKc8w#/\S$@Vu>ST=iibPT/16SINSWbtj
Jpq*/Q 6:IQaWkju>acbMmh=18EIYh!@&EImmc<MX9a8?@IWYNG>NJCm/E&iL^k*BlLd?>8*=q!G\+WeZd#999=
&dhb^h *e6H=Nc=59R$8biF6*W9R=L6WydRt$dDtS!<k\tyHE>IA??=/t^Ve?9V6%@cj4^>iQ%5iX=KhNl&yMkM
TPC/ai C+QjAtY\VqQu#q8+dI$TPN$dk8#$JuRJJl6bVZh$Z?C*a9Xc^u^5ZSS<@Fl<cqyK*LGn$hEuE4NQu</M
d#b#L* mV!Yi1cwGM#HtbQ^B:b9&4S^=ZK<?=P!SLJa5pnmT@5MYLVWi:i\11daR%NVm<9l<*p<aMNwu\$dkIKd
YaL>aC 6t\N*1G<c@j&cB<hdZW%mtQMXqLpcD1Y6LVedY%>mBWCaD>?6Le^Qh<d1$9QbMQbkP$6%\Z/L@L!\E#j
pu!LpY KhcYFtcW/Rl#T!64uD##H=weaF!JqDVRWemTRtC&yJlhXFl+Jn<*P#Q>j=tC>kPI5u5*FWL9%6+VG4y*
u!I/iZ Z%la?NHnDFQKKu!e4I$B/yMHwG6NKhGKTp1K<E6FDemmQQJ$Re#&JjctlwR4Sua4I+69ZpleP<9k9WB>
8H=yI4 :KnBA:V+ctweDl9@/#qTD!!S+i!Bml%1a1uPam#KK=/TB6=HnNj>!^mYHB5bI/jycClQ!ZVJ>yKS%hIH
k$E\q/ &Yk*%&9J/t%l^#NL#4c$%PiE4=<@&bDRbhBLY496/C#LmhbV!CRuJ9L1e/aC?EILbhIi@/SXRVY%6@*?
I+HHGB >bMpl!pS^lDK5N>@JPcEKK#&dwZX<jb=T$:E5hR$Kq9tbIa+VTpnM!e?>eWu6CY@m^@jFh@yc5E4B>ch
5nqH4@ LmqX:6/8KjpF61T6uC&5PuM/4+$Yu?lDHG^h6u=+hXYZpBLJX%YY:l*dD6JKbqb>:Z?bk5pbWSGH>8@b
RpbMG8 8R&F%i1XkT8Yt9j1Q&LW/MG/Y6w>?qn&H/+@ajTEih=MHy<$%>ZF&hp6<B1yQCFJjKm6aw<h\ViYeIY^
==94P? KIR5w:bk4T8IdZRbM*IK!14QZY=8jjd8c@9*N@i9%bjqJpiFBc<NYPAMVPpR5QZHV4d#uL>pGjdCeF!:
aCnt&H K5DZa//#uh=+A+HA\NS/=6^=Q9:p%lwkHd^=+dGnJ=JTW^Pnn$bFS<ip=aG#eVR!Ql@wWqlapJeT5SPp
NBu9ne $?yq!+qSRda5B4cIjXp?+wZ>jSa6>N$wcnm:RWed#qa%lI!1Rn?*nS6I6>4kHT4kFP&LZVhET\Q+5yC6
ZmaY4c 4KDC5$!?%eIpLbMIiF5:VpAnw^ALeqJJS%YTM$=/j>lPt&w>$e4T$t1TNS!+YFna#bd6Ij5Pw65Su=mc
e>/!RX uytht*<c!FJe$qZKLmp8^A^*M4BB4=55W4EFXtZ*dulXR:DeQ#RW:AwlC:uFFnFpWVS^G<mTXXBwW=SV
Yd\Gnt W8alV:RuJTTFB4yaEy/wGM<Pmm/@jVb&%jVQAtX>9ZGnB&tB!>ZBwdkKHFY6CaaGu\X!^k:KiF6BVE8*
*X@bq: >H4BW?T4>=5kEA!WEJ:R&C>MXeJ4=<yPMiSRMl&!84^SyybVb5:%Cqm*/$lTjp*#9edVS#h:&#AeGj/e
AN<lpS %m^^NdiccD%=/9RbwL4AD=t:y:nmi:q<SX%Pp?R*A4?4A#pmJaqY6%*Bmleth/!Lwal!%>eQV$=HS^=L
R$ybEF S*1pT>Ip1XTca5dJ:MVnne?@$jI@T?@eBZy$wS<PFPt<C=K4Sjcm1Q!*5K9<F^Cp5m:>LWXjeJ:I1C*P
m@<%IN \K&X6TKJWCJT4LyeHni=y!:YCByq%Q$9SSK\#j/?*V8&Mtw4ECBqP*DA<JEn?t61/QVp>ip*h5LapXM<
TbA6j! Gd$%n*KZR+yR#uNejW6iQZ6+l$uy!#?bGl<hTaIy?+Ap8@>cFP#$^NmTcNJ!yB#dcLjmbjY*X/%Z/$6#
ATw::& Ew@8D%:nV!lCCjmGE<bcVLTh9\ke&iW4qm>j86DPa</M/ZMYLN5a9GKGu1ElX6b:LX+GbwYw4$$LD$We
99\QjE m$6JTaw=inR1Kn4^bF=&<4GItF^5RFBaqJ<i6Yj#?k*4XpmNC6wW5c@al%+w<caZ>qt$hHuS?cdpKRa/
EQe6Xh Y8Cp<>Y+1w1ch88*MDbq<5/RQj8nV+RacK14e%W=HBXFSe:IjVh9a*HM$?iaq9t4+?iu%+@9Zn>Q&k+u
PiTy*B SJQd8>ZL@H#t8#5:&66P6=qCVS/P:ZZ6b5>%<%^A8q=kFha?eMYI:kKDem1@wLCwyLT$VFJPq>GqK5W+
i##T%H 6lCe>MR+#SQHCW&p+w8aqBD^LnyEm+!HJ!Rl1S/qlCT9BW18E&SqFSRXFNwXbXS=Z>YW%Mh8QdVPc!yR
Dmhq&? =J=A%eB$:94amn8%We8ujAiPnB<*bmBPFt4uhHFynwK1m5++e/N9wN?e?L^&\lLGuNB<YZW?@!qQqh>n
NhwyNm 9LGbRJ6Q8tFR\BNbFRy+w5nVu/AlJ\NM$XEidG\^ibcLV?AY:E^@yjXT$jHkSdbGlCk/#&nNJpeLM#k!
X/RCSI eEkwnnS\hE/1EAFSlA&uK#6@w:ji&jE9W#TpVEHqlbaEQbN&?nQNyZ=?i%q?QCI/Li9p!c!$>qR/VbJP
?G9amS b!lt=tcuS&jX@/DqZyc?dSEVw5m&*AFdknq@<4j9NFiZ6kp:!u?W1+w8b6%5w?qH>mVjn>@VQiFMFTWW
TqDBK: m=R1tp8ny@ek1S&D6u&m#9/qm4D+hE=tT5KJa+eQkJ8?biQ/Q+qKnkMGDB5^4LiGy5/Pu4$H/8tNHPt+
*e=/6= <G>1B:Ete?i+#W>><8ni#c9u/!6AiKWuuwmKnECq<F?!IFQAtPASGy?chR4:\X&>hj@=??@6Z%@i8%^d
/@MJhd py$a8Y>dpL<ZWMXw@Bk#c>9=*6/?jw9<qm#^>jcaP&8cwy&4V?CG:d8yWJ5hc?&NnG#uiC^eE6kh!k$K
a@cb4Q mI$Em=IWh!#!YNVStI#5:LRVphEblaRyb:Ln>t>h6*:DT9?@>tVSI51Z<tE6@Puhi/H@pw\L%=6F%nw/
+9:=Xu jGRKn/QENX+W6AYJ5kKI5uh@\6HNBu!?Bw@NBq5n4/!%=C\y$CSXbL</ju%=?@VinR8aBJW89hMLY4:E
>$<4yM ^<9Dhe=5?=t&PC^8l1$h/dktLWDc8tQ*9pMSWTjmWZlq=+H5K5diyeI8EWhaZqcC&k6:lehy@Iet?<uL
dk=<y= &dqLP+TaE9B\8ppm>J%ndj^KwPk\nmW4L\?YlMZ=w1dE::>w<?JbytCdpTJtdy5Vc??KDm?b>E8kNF=9
JqG+$E :GBhDV+\SM!XeCS5SXXqFh=wm!p@BLKVJ:Hc%NwJQ!m?nL4cI=/Tq6=E&#q#?4A/Gi?E@b54^^9eY$pm
p!d*CF $!t4LhhLaD:F*tQJ8yCn/TWZ:q+4n>8=^M/a<GLEW%4nmItb1aZqSFJwBt/J*c1<tt@qelWZMy:?^5!?
<wmq+I 4m=Cm#?<pQu/tj4E^lHCcD^\bq5:@a*thj%?e?F+^It$p=q+/bucpWKu56I/$/p$XkcXJbeaX@C>uXck
lSeph$ QlR<8hNC*iq5IcE5XFt*=i/$NJc%C>9K9=Y4NBci1bDRQ#dn4BkqHW&&hXcXTNkyW11@hMb#5A/!Sc:*
qYKq#\ @D8Te*mVl:!wB%:p=&Rp^^<@!4knG>aVpdYMCqBba1#hd?m\\d41GybcQZ5QH#>&8Kt:V:jM/8dFHLjA
TLi!bQ <$?aP?&!\4#M=NnnWWjSmuR#A:WYFY!%Hj^%iDMnny%I\Ky9dGnZ<9Dq^^>6u=@jccw8PypRGdw%cItu
K1u5w4 udtX>e#=Z9P>Fm:\>9H^u8@8bDh6t6N<9>qBt*j5*lP!jjPc=W5Zi:qNu#nS#Vhk%Vwt4LXlWiTS1IVp
EN!F+^ JDBjS+>GSmXquW!QnV!YjIdRw8lW!8H6/>h5CQKZ&k>plT?\kq+w/:*R?@eC!q6:1i?8a:hcd!:V%6Hk
-AbawM 000a6816d07001202b3 Page 156 of binaries1.zip
tQVYF# eZuk1/51K+^eVt%n:dAt#Dl\NH/@VR<%dZWXXVbZTX/BQcQk%q&t=hduH?*k9#>4dTcVb6QJbJyk$5dB
*$qSjm i:/H!^^HB#61%nA:eFYhZV&<TLHS8p%pIAZaW1u>PF%aDLRRmT1/K4pXIqF=cZGBqBu1j=kS*m%h1X*W
/W+$@@ Vt1ZFyp4LnWktBhX:k5G=KXA%pGXSeuVCtJFiRXFSYZ8F#XF95t1=ZM6DAp>DC*ud$<:%%IT=tQbIXAB
/9n!4S C#JeY=*Q=uI:Pb%eF1iNVZMW&cw1@eddt4cDI&<^T@E*+RkLPAI&BEtmyn:T&NN@6XpHCC$=GW!RA99B
HlccW< XbRn/XEaEhcT$hC#uDbuaYB\iGLB8bcdqWt:A^^MGP@>Kc*=<bC=maty8TY+<DdVb>4NhAkZXkBXKm9T
Td1?bI H:XltyNa*NZ=l!\@GC@?E^t&Vi!HYNJG@/Vbp9e*w+?eTMuMTM>I?\$$whI/$qtk6qVT$nM!W4Lmj&EV
X!llYZ Bjtj^X>SduZ?a$ZwFwZdLdjPqyb*Cu<BY>lq6VjL<#6wPuEEbwDI1+&P4K:8FCqZXDbYu6k>A1@<=Q4M
@AW1dm 1Qua!FmSK<CY<1L<:QVpPHVi>?\E61\LYp*$XwC@u=hA8??RIRM%NZbwc9Z1M$y9^QDyC:#@be9e8ZPe
k*C@di =nm61eP4:*PM+p1IQSF>LJJp9DF<ASY>a@6&y5E/iK&^mip=y$51/m>ia?:<Qn/:jdG1MDQ8!J:XZua#
!BNWdI HQFCES:i$<9V*hpJuGA:h>@AhX6*DN8>C$P4T**tPe?&u#ZL$huXb$bAELpY*:==aYL+pSNJ!auHI!Pw
CbtBQA w?!a>K!M8MmI8FPpV/#T/a^nIi8D%1/m@FZRlDBepRBZ^A6?i@Xi5NB:<Y4j*Zii9Dk<CM\IB?\Iq<%Y
\%T+4j /8P>a@5P/%*IqLD\I@HHN!@6w/ZBXqZq1CnI1SkquJh&19wPHn\!Bi>C<nL\Ru^Q<Pc%kRF?YFLqM6jJ
h\PKLD pbyNP\$Guuk8/Hdh!XR&iBFT$:QAeT<wKm$Vmmw11#148XYXFTK\IcibkXJcMeinw=Ew^B@b^^npuhRP
&h9lTn *b$+ii/@XCu#ebyp>FIkb#=NDdmCPTK$k1!mE98Vt4!y6/i%qCuYQu8!t=4#R#^N^imQnNLSXJMTliK$
FKa@4A 5%qEe!t1ct1+GAwM^AJ=M&eYn>?t%pH<EwyQ1:QW*9N?1Wq+Tu!i+cwhB#\=ua#pW9*FXYB4>qV5=w8t
?L=%qS DHiW8b&H@<b>5cj1d6?8Th&:\5tW$GZ$E%4#X//NwcGJmSul!+!b$:*VG+Rk8My1#1hjd/MymT#Rli1R
Fkt1TB Bd=R9#TpRc<9*::>AL8Cck9a$p/466&>Hu5$JnW6QT*6h#KhR1XK$8n$44R8wA&h4yCXulS@@c&Eqt?6
>b<e^\ i6pmNT\$eiCqw86tjYtu<Gj=X%C*16XXGi>y8udKIHIj1N=@m/m?ZcSa&=Cdaa!tSd/*yW>&=\XkT&>k
85*@e& !@u/19LC@JN+NRIP@B@9bMX!KpDX*&?S%<RijRaP/1?^XF%Vy<iA$YPH/5%b>D>5eZTe/?J#?l=ipXiW
\k5^F/ u5uJTE1InatPIt<#E<^E<:JnJ!m8jZk@eD\8PSN:dnW$*dnLZI<<9ut?I9hA5Meeq*p+%FDL^hZNhc/V
NnqneP A#DFh8/CyWGdk8Gjd:NjF:lpwehel%t&+Q?B*q1&h5P1Fc/LX\FbhkT8QudwYH^TWt^pSGSpSFS!Spbm
ZyClY\ XMTJp<WqaF4\IuHjy1Ckhc8YMIaF8iLnR!%piXML^F+h<!Xi6Lj8\5YLN%=:>i/MbV>hLb\q\qXXXhb\
dZByQ: Ck/hlM<cG@lE^CTF:S18wRqj+Kk1!m8NhDneRl1>kk9@:j*#?\^j8uPJ%/%c6tTSN^DG%WZmQM#F%YPi
:>SdFc %$LjJj?\=VkYmaDnn4%AlcLK/81c&qyJuXy6VZX%FhmYwnM+mRF<p=kVj^mD4kpJmwl*/CBlGL/eAAei
>w=VhX ?FICjJqw>EKkcD!6D$6PZ4=hRXcJ!@?my5Ajct>4bNAJdNE$uPb@MQ@/%c^6LpaC@XEnhDZWPPC/h%Pq
jp#uG# DeTZk4Kc85Q5KSKB*A^DBj:9Q$SB5@IbQJ$8u4L?61np:eNXbYVFyKAX5%W/$LHl/R=RbWubwmHD%l+*
VhNiyR b%FRTHS&hZNLjYba+B^#RybSn&mNy4pCjRNnW<8Jp!ddVLib5dY$9lT=Wup8y/KhJIu$FZeS/<K+KD??
VYu*VG j@@&>S615N?MCG8n^dS1%@NL!ZEyYYtycetTJFa!qTRtqPqMa/X&ycA@*=ZPQyq:P4H<K9&?:P%6IE\H
De!6Mw mZl%MZiJLdecm41Awy@AScuKdLkq?Z4F1!>Ya&n1?lTi1$AqX6YRj<1qQ*4+<n%:nR#>hyGl!?ZG?51!
hY\4$? \qMaGRbuu9FR%kR^Tp\X/$/>b@d6%Y>kd$8?81b&#$FnSk/%t8<#::@G^hHB$hpnCt@X1$CLbcWtJedF
FjGP8+ Hkj:Epu$A#1k8/qhXmH\>l+Mn\Sluk4PjFu%&W5aGj:c>8Q6jYHeC5@=<%&bMd@Pe=%t&>9cVJut+PG:
nY5C/q a6&Y+B*B&>c9<QMi+n:Hken>YW=8*9/4Xm=j9tLN6u*HNm\K&LFl^jEDEdH\Za<iymJGS5ctymYhmIlK
Ml?9ZJ LTw6A4aWk^Dd6tdXtqX?@w^qRdI5>F/+eMEC!16#j1huu@qiyDG>:?LA4NwQL^4ei8t1w/jCXqZmYY>b
1R?GLQ 8n?E<PZI$cmaqMPl%q1cjP#/1mI94>I9/MdVq&<@jj9h@9*Dm@5*tStBTTiaNkqBK@#>jL!>QQF%eueH
6kF81i 8ulnn:5@dn#AHPeewHNTK5S^>HXW9dmB48iT+b/q#PCT@>CF8CnE+bN5%>*S#bjDj@lT8uC&qiE#keKp
m@6^PQ aZI!TBiYKqkYjl>VW$QpC6jIjqXp/c$LTY66StL#i&+Zy\Q+$RHcm\aN%kuPCq6SntZwMX5\cSKL#=iw
B5j98% 5jl+Cj@Z4u#ljRK/1A#**%>etGA6L!9LFIDLKuJ+!DlF48aAQ5m^L9met8J\><DkmE#S6d6u5\?5h4ak
Tl@*Md ZPu>pNb+6qRjJ\8bYW!$unLh^tF4RY*b>*KFMqH>tj#&DpIYIEPZ/l>@H6$YXSBl^K+R41nT#&:quDmS
k6Ja/< tJPPR$=@I%hTj1cKkTNhaFapGe4\Y1Tpb6/<j%j!n$%Bh+X8pd%TXTaSjm*@YK+14K\41Pmp9&<hlm#S
P8iZCa $uSM9%BdAT!y4C@KZ#5M#a^e#\GLu#RlTXy8ZG+ER%CRq=tKdn#n4wAAY\pCnJDEF>:wPWN%i\@R:cGt
1AlFR9 41Hhc?nw+eM6Qd#u@TWJNYi1+&!M<RW*NaEEK\a^q=1eGA<1LP1a%K!AC68N:?u?5ENHmQdAqtp%nXh8
tJPM68 *u@&:9cq!KWLZijNtW*b>dF*eHT\6=5=*YdK%FqAlNWdeHDCl5DFZ1=Ph6Mu&E!bMuY/ubP4q^@P*q8&
%4h&b& i6P8k>F^meu^&?b=:DpWeTIlMVH/!BH\iKMVW=JnIw:Gu!1XFGpYF&Ri&:q&=i1kbW8Zh65VcmH6Ld9A
e?ZN#D !$5!@/huu*ti<=p!kmW4@W>?@9Xl\/Aittw+wEyXSeXwa6Cl@j8A&Xl@F=<i9e?>l+aGX$YF4R4!S6Qq
4w8Bb\ :QM*H:@?/9n^+eYDt=eal5SEa5umlnYB!=a5lqjPT?I=qI\D>R9Aqkldh+CZElEXp\C\#pMjyS#wWX9j
kia&*W eQdePZEn@>#bBy^@C^1M6N\GL#/YaRk/<YCcmYWY@!ZIkeQk?YFE8KCp%N9i$9CyRMF5uCIaqA+FPWWX
Ma%?qd H9?#t1#PGGBIK<c=ZDdEyy>cQLAZY\IEwaAk<I56=4TDWbEA/SXb4D=P5>T+@Ha%Gp9:\EXl1QGX>^/w
=PyD*l wcVdP:n?/5XFZGcK6K\CG+kBJpm>9!=+>l&!QQpB<#iHy=bj9hiai!nI^cJBRB6IDFpGF=Ae=k>wjtiw
k#qM^k @6n^AmMVe<8JW/bPuJ@e<KYeJ/\1QSEa<9kLlZQiKJJ^&NZ%D#&?pdy/MCTk8nyy8ce95tPWw8JV+RmP
/R^!N# n/MT&lPyJBwIIpcCJE6\VYPqm#M++MJpb8hq=bhh8ZYZYBK/ybPyeL$6i/&/SCL<W9+iTFI4#Q%M$\pV
mXM!$d i9jC=C\N$+mG5^XhI4yC1d+mh=<S1jiV:YN*/SLDpp8N6TCZenNV+w>L:^m:a%%@YPI%V$?uX=>?QhV+
*y9G#T /6y>l+$cQG/&n!eV:ZJ^Rcji!Yp&bW<:iNud8GchL5uHiGbKakJcE<c:J=IBlDYD6?PpPkih?8L1@c5Y
P6I:Qn i<=#54i#uYF4P>N8Fp+15=p<bcc#q^<Pk>/!cWQkIp@u&dPtVdG&unSw<uR:S%hQNATL@Fh8DDpaFSh*
MhKi55 InJ$$*Ijn>uPT@cjTE1MmcCPnAtQnE6PmV6/=ES&cZFSWZFyWY:e*w$4X/=i=4h$ChkSH:RnC^h+L=n9
kEJ?uL Nh>#95SVF8niPa@&/DQQ5=58jkFLn:*1/Dk^4wePcDA?n/&wNHGa*$GeVS6Be1!!p9j:D%HZXqhXXqXX
RSyHTE qJNuY^ZncK/PH^>jQ4mFdMH?CFm:E4^y:cwXAZ/L\ZBSC+cTl@bj>q>ZJSM\ntTy4K/4Q>9aiQ/C?KL/
/DHQPI ljPN&H1=8pLa*bhQL^b<?&//:Q6#j:6>?^@CHDpYk!p4<GAqZuaYBp<AyZK1LDt=D1A#t@>JVWGnS<?B
B!&WeD E@RywI#mPCQDMeN%%eVaAX%1V!Tk8>w=NF85T4PXXBSpXPEH=%Ep6S*IA1Vy\qb^/nJ<6i?<N&BiFQtB
MD5qp> =%ydh@amu4&eKyhHkdin\P9hT\Z9=qu\m>QVK!!=>FL4lXQlRT/Y=\Z!BwbG^5aTE#qnI$PDJmVQ#Fcc
J/<5nm u&$/e8\EJA<Pyq!aYXj&yb\4LE>#hZD%#&q+>8&utNmYkj>!B=nVdXi/u6=<pB>#NDaqMb/XII/n+#5T
=Yk!F? /ER/TbLetaK?T!j^YckM?JXGy/1pyKcuby&88H:99>iP6^Xddy<6EAtFu<4jqZPEhdWJD:@TbVQ%i@Z5
\J@T>I Kitl1KM=&ucu5F+5wm1Wc16#pubcpclaV=Qe>m6aBNmCVdyEJch#M6DNQ:S@D#w8nBKVBKk8Yi!LGi&i
=mKXbP ula>?9jww<6XA@+MH#FI#<ud+!>>RD:N64i*w&abYA<hMMSpVem^^MTWqCVG#9#qD<mGA?FHI1N\SqLW
CLH&&W pjm6T:$>QiiASbHaDJ+&a@w$MCGV4chkX98!wI&d6&^c6*KS=%#:/XMuV:T!tnl=&5#^DuM<eID#\mYB
<9k^W^ G$MPHI8JPZy\=%w@q=qVJp&h=d^p!+FapGFHRQqFJ!dFS^%GGWaX$TXc?ctH6/^c9t4FIqBlPB<W8PQ6
FX8J$! VZqS<!qQqkeF9PuEjyAi9cT&^ujS+8ZLk!?>@u*cby!8Jw@H=*IWq!n%EZn6Q$1+E=?WtyMh66q:4Ka&
EHmwD: V$pF>Jme+8maq%>?hj\p*MFpL%Im8D<En1Gk\GZ?T^bn4\lj*<ZanR8d9j*%Y:J!V^hK#e#b^k5Zt/lL
^@I*@M %GYNT$%NbNy/VbY$qZ6TuGb5VDh=$N9jVYItXHAQRl+<qZBKbRLD^JL=M<$MHkpWDdRB%9Ka&TI9y\Ai
?tKKHc #Ee%Sa/TQLjZGD*b<j4/L\T1?tNHn8pQ4k8jB:#y=IwJl*:Du!t&SJXma?NFJR/&PPY11ZZ^KVZ^Q=45
mYq=XT N?<bGCHX8ipN%\?M%YGSG^bqYSp=iYW8D/MG<6\i@Z1^tS:pqC^d$#&&8Ku%a9:lNc/YF\Z!lpatytcW
LJiSFb lbKqldtb1atS+TZp$6^:6F4V>GFn>CaaGIMl54DjZ!d/YD/mcJHhdHiQBcGHwlK#4:b?pHS%AyQcj*#>
yw@!Lb >QdX<&iQH6=@eDEqPV+&>tkEFc5RA!@VmSk/lw+X^%H^NDCJT9wFdp%Z5lleGm1NT1e#YPqh1ZT!cqyY
-A%VwE 000ddfabc8f001202b3 Page 157 of binaries1.zip
i!d1Ze *8p!WXuFqV6*^Fk+TK+u1V5WiDSZSPWWaSLR8Kc&MQpc@cdKA/kp:1G5#hNhhL1?WmRTX>A%CuuZu*41
$NM>Tp >84wIV65#=i4!KVd%=4PXp9:&$bFMD:NH:uGBmD+EC4Nt#jh1yh&V!$PX$Pu@:Al\/h+inJWI8Fq^>t#
PV*w#n RYdNttq4P&*W$CHDlw/bQejDi?uP9bGwN\ACB:FEX:K%%:dk6b=i/L#MeZF%5J%lM&W!@Dhq/6RyW!bS
LQjj+K %9&t&M=&Y:ApeB&PTq*8+?a$$&c!qaW=9K/Vy>p/#HGq*CdN<@aL*BS!IDL1&PF>Y%d/#Jp?!YLTDJiq
?lS9bM G@eeQlwin8$G\\>G^CdGS^?JAK%YlJjmlXqSP%a9D%^JuBu$??pF6BeLcKTAdlqtiRKj*D9eiu6$!#dk
Faec8* W5AK@+&%*?:t#?&Blae<nyY!wn#QNnTK=HEqyYdp=l>N!ytmy18l15^lK<nJ/&=<?u?wFLb:?=aNc%aF
!BlJ=L Lk6a8pVmN&kJcdhCGyPm%WCH=tVitiI!WXWNY1CLVbi9hF^X9*K=1iq<a$Qhu=cXwNn?l$Xkkclki49P
*RhFEl H^cSclJkWYFS5eeM$\eCSV$hPXpymeAI<V/wKZDl?e5wKt5N\hq:iuwVPkY$98cE<iQ%5Dj?&BF>?9d8
WC<tG4 %W6due@u@8KkN><PuQwJMw=F:BJNLtbp&KD!YD#pqI\c@IcGTc!PXdqQkFS5Ne%J$SWJG<c^yF*<FeDX
nL>D=G aZPBq*JcI<b1hHNKqiPRicG%mXD1ppDSENQqJp?X&ClNuV#J$5#W!PA!p54&L1*&iQGAEcQG/S8atFtb
BY<LW= Yt+11jlTVyiNE%b8uG%9=:IR^!Y9Y:<?iQQ&wy#M6IR+MpR:+pnp$enwk*5QlB$=im#1&LGwcP1+JEaT
>4?4>D K^<ZH=?RRCX?BpbJW8VTW6QT^Pt5NCyXuM^L!V^%81!m5pIpKm8:eJ8Wy&MTGhwu!Y&=K?Yq\9jqd=FT
5L8Yh> FYe9=6dR>I5h9dApX%GDb=jYWCZ11qC81ntVq:?mH>F&Qbe@8acMR6i?8y^ECYKpD6Bjcej&>@9DKE>6
P/<!Rn y!H18yyeLq?4@:DB@e*eQSqGWZNyJ>b5!tERMt4GhN9^jReQHVb1FDbbNDY*utn6:?Qqmi/@k=*hLM1P
kVeHV% u1F1dVXypnZaIdDtqDW%mb1wa#Xy!p^Hq@tLq\Y6k&<h5NDNajwW+BJqyp4abPe+b?+eF!5*L:>Xt*ej
DbmYMu mI\<E4b#9d?H@XR4m+uV=@16&^pihR\Ah&DjAjk6QDw?Q8bI^It5EmBWWWq^Zu#w&tZLAye5Yp#=$6+K
dIJL^Y bQIh<AtNpwR$Kbc+hdu&htj+lHV!Y^K\cq%R:5h*X>j$%NECQqtw1TkyKJl5n+$?HyiRuJaB9q6!hNl5
q5>uyJ DS%64nKd1!Ru1:T\lhAJjCAtDVpKZ5ch&#c6\<a6ZRGDq/*AhPuN=IwGuB<G@nlWw::lZPQFT%i8Z46?
$by?&I R>!5iiQ/6c6ZLnYhQ<iMITA6aBp?TaM6i$ND@8XV!P:RWHLu$<$uN^8V?\J=9X:!MuKh<4IKK8C=!Kpw
FM$C&% KTwMpyiSXXLtcG4%:NP#=/nlR\eQ:NiuX+<i8n4cY6y<Nq5X@tQ@JNe%TKWjRKW8XXp\Tq%w5LBBFq>C
i$:1tp ?kA^LlGw8*diI#BWqByu&IcM+%9MYcTaq$#DpYeDmbS\Xw/&ZHe+YpX8/8q:Vjpk<C!8CyRNeQd\%Bt#
^y%cAm :Kub6IP!@e#yW!icA=Y8IJYM:>C<H%HPkqFn!Ilm++uS\CT1dL!wJtcjm@Y58Y+iZtDmA=c9IpX6i@ej
8mSwN5 JC&Qww+jC\hN5t9*Z9\:5Cp1Y9b+>Ap1Sm+Y!QRd^X/CPBFNqG^KctwZPEqWKmeqNTW=MSHpAhmwmk/S
9e1@ch k4D5ZM6hLGL=E/dG!N9=R8E:wBRqXC/9dCk+@aN8T/HATCu&%GcdSVSWhXawX%dXXb@bN\IH%<k+ZLpP
RGDIF$ lPy=E^My<h=T/m96*Ld=n>aDQm*/\!ehL$@nRd$$&F\%INTAAVQt@Rpw!AJdKD58+hQ$cRaV?9RhPuRE
C6eQwj NXJ:>Jk^a<F+G^1dtqqaVy\E:w:%=ItYqIWC65?&5P!$GGE=EdQeMSWtKGnXC4<Fe&jcVLR\NVE&MVG%
<tXVkT tDnbb416ud*D:Dq8Zp8tB&*hjiD\+aPlY%d=P66PMni%uD:Zh@ZY9ahA*$YktN!:b>?BA=E^<VFH\+?q
59\+6q FlentW4PyB:c9DJk^RyjnLR6>Cc%B=RuQa@!wN*Fdm#ZZ!/>Th<c^pNc9GTy@+w%1\+@iHu@WA>6dT:Q
$jH^<i p56nK!8!SkWq^GEJCw/8LK+wQ:JWX$8H4/LCXRHdNLu^=<eZD#Di^nDy!AETpTEyTJIXk\NJZj?Y@*lG
I%FV%F lcYm/n4Rhp&Z4q/:$Z##q8R&jW9#buQ#hVL9y1Gtp4TCBVKN?$5tM698j>&nj^/!1Mnb&1lXwDBlpC=d
kL$!t\ X1=LZpcBA&Vme%YX=BRWqbk5bqIVL/8mCpK8C+\Q^bG\9+HAa*Hik\H1XP*phuF?eYX=jL/aiElIGIp/
cqh9IG m>@Bi\DcV1G*\=:k\IpWb9anhYSq=FXRF5y^?@bTwEkq9ESY!TD9+1u\%e:t%\W1<J/dY$?*e*J&p*mw
c>eDNZ 848/#HGaTidWMMT=SdNQtR\hPZc<\NnE#DZ?T:tpVE>+4nbtuwtX*X\Zh<<F+FSmw>yXc>cSBke:R9d5
IMTW^i *Sh&KQ#R:n&:R9HCIDI1tw=YAYpZA/RB&uVGTWDhhRF6KBK5F1jSKi#pqPVpyMSpMEMFyd>EmlYqqhj8
jeCi=# 6h/VTG$RhX8&=Y4yG?CLYKk11m:NPhqBZS:XF!!Rkk=u%NcGt5+K8qKy=u^S4Gqj6E8!Qa*#dmBlt1<$
#AKG#D Mue^^DuCuLN8TTeqnLiZF!dPiPy/ij9/Vi@D=*B+Y9&GDB\%T$1aPbTVn1NW$e&adtNnc/Qjl/jbd<n\
ctbKbH WcPwpe1nkDVn^8uynci\#VlqcAwiywt^9pBjaAT$5b1MQV8^%l&?*%K$QJQMRT<dGlpla$lip8$5i$e*
*Z1k4k :&Z4k9iMDV6$eN?P>e9tP>latRJn*Q^Ydh^J!1QCD+Qm&d>9d<n8jWhm+5CRS5ThK1WKXayKm$>Gd%<N
W:WIdy ewycyIIlBcb$tTKWwh^pZF%\du&:e^>5?IR&CCWhcRG=jNY1heG6>@PH>6BS5<D1GGBPd^>+@XQTV?dt
<$wjI& k^c4QB8#eaTtnnbHGd+tL#<!=eML9Nmy\MLQ8GlGG?Q%&G4J1mG4k>c5&$BcaB<+jBSDK/nt!m64Gln:
E:nMnH $*##hp8L6MYH^8&d#Vi8Ztp/j:aYY<IT=1n@!^\t5CDbV8QNn9RtFF&66C\kVtGS$$VDP\Lb+T1!uTDm
51%T#4 8P@XbNZ=ZHpq#B&kqMVKElY^1k^d6R9wR4Nb14<JaV/B/bF\Ji^PXd\EyWnW?n8lDwc1/V@W/iVhA?ww
XDSLKm cR+a/#jQTpqYVHkn1>VJ/YI4>?!4\9VKq5k1Dk4JQdl!nqt#wBecG>DyLl=i/HR8\nCXl+8Vue%EW!PG
aRkyGd PDhy:1XbA+iQGk8u/5mXSbZCH?XhbiNKldYyAdbVytHLYuCGF@u=L%?^KwnyDdKV@Mn:D$cE\^t!>$B+
W6kuyE SPR^bbB9^$<kh!R^XK!EWEhC\uPTFEp1YJ$WTdJ1WtJCWpdi/YKl1PK:mFNi*ZVn&eP:LhmQpbVPw%6$
tt$Ldm 8:dpVjq4dBiS>=n?6HSKQ:R%89!?m&8d15RXXKXT%jYT9F&P9Z4lQe>al/Vj6+A?QWluIKqHhIVpwY%k
&@KL=h >J5+kL&$t#$iHy+tZ6+?j9/8k>SWXdtc@Rd%NHcb=!cN#IFDbM?w6&p&W/hM6VEc1KZK:6q9+Pl^PLX!
!lqq$& DDXcb5^acl!q%*?<*umknctF%eTJPMJk:n^9PPV>@H\Z8AJ9LI\NKZ*cRMjI^N\CW@y5ywF$e@JaFLly
<?HDqY ?=/\5H*VR#c9Y8R/c:K=mauXNGjj\I*dh?K^8&@@kaNMnH#Q:y$:>^>Lnn6!KD1nyLCkELmVF:>*ZeDT
kd>:Q1 FRE?aDY>yjua<!VT8Yw5q\:u44q>yL*TyKM/qyDY=uDPXh%yhDZ8nTZ%HCMXSbdc:PT<hI\/F=TWm$SZ
ldF!@& W5MYY&u*WFhq<%RX=QyMP6V<L*Q&MaYu/<S4ByNTcXJBn%+R8a%Be*Q8\1Y4%=8dTZb$K*Yjc6Y/h@hP
G81Mlb !!&\Pbh^XIcWN\pcj?:KDuZ#bki%ZWN1eEL*pXKb=QT5*H!1WNdi$1BFID?TK!M4J=GZqXMBX+nmK*JX
9P?^8I FBYXFBZFaG9EKq%AHAqHHmWd=^j:I>kbMb6TXYC41lK=SuM?eGukT4haw>R:iZjXjwK@$&Q/XCMhDtqC
PL9/:1 SDH^c:SSdDu6AV%=nL5DVyD8!LpBV1c*BH$NnC$t&#w+8Z4=LAqaEdkT&\@/?@q+8VuN\5:kX=E+%5$$
?XZBI% >&tA/bmSa<bNtGC!61lK?LP<w&!MWFTe6ZGT=R#:Pbm#=:Nwmj@!qc6Y4%8@ejM&MLMli#C&i#Sm*&+k
mJ9whX #yEIPyJ>FJpVjb!RS^JLEibkeI+m+RSYCyZMTW^ImE>M##6hIlTJlF>F6JBZFSh+@hGDi$AeJA@JKMAE
Ce+Dp% uNiEPm1X\9w&tk+c$k9Iw/Db&<c41EyTIc=W8qHi<m&\F*F>BkW?9a*M\V^?IZw?CTiptYwpWY*=M5Ie
CF$LMh QC#tE?bwE8c5<B*jR$&F4hF*aH>nF\>Z!upIS8YAPH?bM*u!yIuG\*6\qZqc8u&G/I$jQ<HRlDKqVTln
*GdYw# e:\Zt#Lh%u/P?#\ZiHHt#b<@#>q?84YFmRH+6iMu/P5dk8W&6:RCXVjbbwc><@!qc#d9*L69*?=6RW66
I+X!e> =6udYJpaGaNEY:l5DWudSP1ABV>\WH4S9n%+S+Bh?LHw%KLmkwLCpyLV1ae&LX<c+P@4C<Sb5ICW@DC<
K\cGlM WZSBt?um@FQKuHuaJIGwNj?AbemeDi8TLq&@Pp?&u:ac^VbWXbJqC^#m5:I^nmaWCaXZe9QP8tu$%PGw
i/>jB4 kylVpNQ!LMiiZaR=GNuEyl5dN$nYD>yA/wXCR5MPhd9<SYXpSkeR=#cY+h^@&QXI=?GD?/&6h\q#tAdL
\!+^+^ BciRPPy^JIpJmTM6%>5y&cHSuZtDXc5^CYkHV%PFM4aAYjbaLYWFYZq=PZq=bh+u<FkW?Gw<XWW5yAGb
qWmTiN J1P5k4NSJG!JK5&YWRWcTbAyHAtJ\4FWKa+a@mcQeVZii/+<Y\p5D+8E+ql<5D61Zd\Y6S<<Xi=aA$MD
<cIFt^ ZVpYGBp^=qT#<RyJun>TZ+iFHFImZi>G&=neF9R#NLPiNejD!>5QS$>5*L^=E/bAatGSt=P66cplwbDS
8k$QI? Db4deT=<?QCSa!dwnX8Wkn&L&5wGqXiZ::QDm#/\QVmdCTkW8GwNW@?^k!S+lFHl<tF:>?+=^MQijyFH
4etD<X n^*:l$F$9G^CI6mi>tSJpuJmRu^CYudP/iIP+VhkD1imeM@WPdXZ:^QtEMX&=*4^K?BN8%C%/t^P$Ve/
K#W*q+ it\jnGnV8ww>SmhWXqaAe%R1LqeJ8+:$JMEE8X+PnX%*MHhNPwRn<&>Ei%%*<4P@j<C@>NEt>Ft?c4Zu
%K9WmC XK+1S/NQ@%=/h1+8+PcwP$qXG*k=!B:4TbMwK$Q>@9%:eHleuwbP4@:D^8kJDE%^S1TD\&\u^:uP#p:&
WZAR@b hnP5LeFnNJmkN&d$!FGn\TGcwG?ENDQZAd6pdYQ4/P/:a5QYpD%:RwLZLjh&tnb^tyt^pdGX4e8CJT9Z
j^8B\& d5Dm5G*BaH6&E\L6*^i/P&Vun8B6&#c+nnEPT!5yQFNRWqb+Mmy+yh@TbZkL=N*hcEBca!*4+8\5u964
*j^#pX D8*eC@k#n@DHl+Tiq/@Ah&4V>y$Hcy5$%k:Y+ZNWXFTX=BW=k\>pu#yVXEcJlk4L#=jGZh9A%\Hd\?G!
-Am4Bd 00055552cc2001202b3 Page 158 of binaries1.zip
dQ%u^P AbwYehXa^=<TV+4*RuaAj#bVt?nNk:aG+:TFA+^VpyYLi1*&:IZL%=9S/N^@<Pn^p/ja#W4u!YN5mu5Z
tDDDYp ?/ljPp@cMSMKnjk9lVByF1^QN+XA@GN@w%T$mMAlG=PdAnu>+Z*p8?SpqLmjkWA$Z%Gh#%cWX%V5BNFG
FR/KTi K:iDeBP#bVq5RQ$HLnJH#KdB=5l#pDbh9A@\J#bQmeQmhnF1DXl#Y?$:5Kd9wAtC@ww!lDXkiqR+uHc&
Q%cDXe QGik+SAYJi*+JT8nQb1qj$jAlVhyn1j9$8YBc#b6&:GL&5$L&SpM8FwX5NnL^h:GuPGN\VYc@V*Jie!\
q9YCQV WiQGD%ljY9t:@GebLS1Ye<J6t9YM&a!*+<9$WAjDA&@&DmI#5IXB?P/6uD$HD^*BN96S$eAc/kTG58p+
Z@YYCD ?jkEaE%:pmSSCZ#V?NTVy+y@Cu?IJEI6WZuG&RqY=bj8QG+F%tCZ9Pc1M1SMG#k=%=w!Z6Bqy1VBlaJP
>YR&<A n>DT/1w8+M8=8qQjK<j%^M@K>Va/?i58<EZ*Kmceabb@h!+P1DRtFaj&=\S$*\ElZ$bL?dJ&++dbw@m1
j=8TPw @F:>NI^hZPj?5Vdh^5b/$pS$@uXNDaeM/6hDS%%NVX%DT%NdY/hZ9$FDS++aKSp6P&4+WGwIQZnMpEED
%Qtqe% Bk<dkZEX+9Wat=mctyqdVb:l+Ly\YhDt+JDh8:b9ZLua%Sb:CBqNNb%pP*j?p5BX1>eE4X&@pXVW+Fl&
t!/TqA RM*?@R^d6t:b6HHDp8$D>a=uFJcZF?jGlc=b/8i@tNkcyl?BqC!$M<8Ft65%y<&Ju69L^R%die=j5GAl
KLl<AH we8!Fe#B6u@jypLj^kNnhDS=HFX\bSVqiJ8!T$4KK#B#8c^PiPJ!!pDNZnw+Bp>bSt:k6mJCF+!6:IZu
8@CNyZ Vc1J+Bq8*^YCDX+a:?aWh8%CY>N<?&:4k$jaQiQ=C<uLH6lW/iunS\>c:>^8J6&c8>u!n<GS=8L5wudT
#uuPJ1 8>SD8w9QyKGBW&iALhcGN*DYHX>BImenw@JFVe\Z<&X+HE1BBV/PuLKKmnKq$1a1aiQh1T#<TJ&eu?DS
bjAHZ: +J$Q<Aa+I+ieciPlYJQ6MX=XVwuN+Wy+CnnVWy*j^d5F6KG+!n*HCacy5pC!he4KKK8&AYh/Vy#EwcS>
wlCX!A I&XpqGWGVYkXDDR$t?w+d>H!INCyP$MbS@RR9DA:6&=aHiA:d+/6yVFl#dm4NL9na@*$keNGDVZdZ%HX
8Ze!qm Z9/>dHl=VW%Y@LIyE/e:#HWq5\iAN8nw4N8\ci8&:V5b&l\?8E<ldN8?k?FH1El=uE<G4FGKma$npi18
TV#^QJ ^K+Eqjm+lNT5uD^\dZ+Acd1E/1Km^n98#wiKd#?@*+LVCm?X@mmZFXcIjkF9jk6X!!9Qu:^GQ%+u/E5c
Ib86nM \@AZuYtw1im1yP5We=+<hhDHnAT=ZpMQj:wH9NH=p>d<n$anCb<Tj@c@4Bu%J\64/@b6AWNX8V%:>y9w
G<qWX> :DLZCXnnaQ>ZwqqdV:TWtNMY/pcGw\eQHn1wq:ctqm+a6^//PlJ6HS*hHn%:>iuZj>DRaTQB>Sp*iy\i
ZVhpFK cDMBbhDQ$MnM$u1/9a9*$qWd+LZb9t*V/mWihyM6VA!NnM&t&p>%tdeIEa$>9WkHC<Dp>l$pTA8tt8EM
CKTj8# !wB%K*iEGb86nTw5V#?$\Z@S$tWLGe+\4eAqdnT^L^Sa^\+u5YP@&W=#ub&quR*^+lSy\?mBVb8&:>6w
J@nc1y tqB@$t%ED\$8<EbBkTZ4tqqXAc?#TFliYq+YW>hwQdyZV#/H^%PSp>XappqCpnmRPBTin!S+MD/@QZ6J
Qk^R5j BaY$H1cmykE5#K$:4R?BMe?i9*#%Y9!tB@cKi@d5<cQ:>%y8aaQutk1GNIq1TJwwW4JJct^C8ubyEML5
d4b%:9 JX$AMCaA5k<ba&q\ZTC94#ieK$QJkjQB@\ce/iLL1jN+!6kZkFcTAGWpJC#AA44R:C=Py%TkTeDM6HFq
HDb%w# iN\j9E@AEluN<e4/9dXWqdq1cpTeTZnN\BeJX$q:qGA5blb$!51!FFS@5%X$:H&H/Wl>H8CSjJ@^D\S1
ZwkG$X Syc&Ln:L%&*hSi1Awp>R5Ywuw4HXXpn\lqZ?*1:&%mcEL+cZcXZ1#cw^\+eQ$h>aX6hS@1%5YGqbSXZl
jXHGX< *1$#4Ya+P46=#Ei<wVmDR*LDym&EL*9*:#<a4u*+\Nch?\=kC<GnWXFMaADw<n8inqPJV$nJ!m9C6?m4
&\V>A$ <LhIF6a8wXyXdVZ>c:>jaPTF=@jB9kl@qC5IT$+XXA9d!u?YT<4c!u<Bb/4P=Sde?@b<C:JDRa5#P@X<
^9ZkMM R%eqy/K!81Ck/pYI+/l?QZyTQiS/>k%<*w1?ndS&lqHq8+p/R&5VECD&b@?=$\Hc/BDcaA$mHB<Hhp@T
>K5W4C +Pu$/GZp=EI=GwG^?e8cTbMtYqtct=tbty1dt+:VG#=<*QmSA*9*/NG4d@<BA\eNHDRad?6GnBk%iw^+
#S&:Ru :Ml^a$cMHD5PB*PmnZH#<X?=Hq/jdb9Z4jL#uI&8nKGl5eXWeHIY#TSnd*H1:e4Xc>bl<\#TjuZZ4n%:
WSDlJ= AE<:kYbd6&#e5H+6jG%nc4#LbJjX?$NZLq45:<NEu@@W$#uQhuTn=p4tWE:6n8LbjaA%&DecP?SmQk%P
NI&TaW wCGp&RmH=Q+lY*iuFGX/cG9#&cw1mkw5%yVE^ka\NynJZHAtNTH*%td:EV$wunydRW=q^kqCG4\VBneE
ihqnKb deIkVPR:CNllettKRJchA$QVek>uP:%/>j4%&*j9JP@yh:y9Z&Nn/5eQY?@i^m:R6h&$+ehJe#aPM&uT
+Z86e% 8$Mp8#Rb*8\LC$Qjl5pjLcAKYccZBTy/Pk4!euL!1t4<u&yh@Hc?Elb8!!5\*k$GBWlAVe!SXYY#&=A:
#PS<C1 tF4A?eZ>#Q6Clnb!>ATCEZ$=Cq^%DdA9E6+9Na4*TP$uV<^X$8\@b5K+ZnLAGZpbiXBtHY\XnycX%#E9
Edjj<t W*WFGap5LT8nNjc^kG>kPuu&jQ<%&@aenABjI#+=VbLJV$8P^+VJ*eH4A^h:akjqc$kd%!cc:qViD+Jn
J1Q=>m %KLVb<9E=b@KByeLlTZ^S>!6dS%h+A*^>q&<BB^NEBj4@4Bt:*/%A+ePH>!^P#R5uJuRh$IT$\uiDCe&
#<!k!N Dp55ew9A<!\9@!kWm?m1Z6WX\yKC@L#e:JNbihtm*Dj$:>KDH19Ku6$Xqj$wX//Nt?SWWFhXZ6bb@18e
K4\&Rk XWW%!J!4Ik\TXXTj4<kXh!cP/Cu8whyVm&$Sij=TVWXqycSCyjyKSYFZ^/p%>8Pwu9I>i9b\9HajNS9P
LAZ+d? aVnDTLaDi<p>BJ1ikIA8+NCm9^\c/:WAPSRa6H+LeCnmcK!#qwb8n:H&4mVQ+D?YB!tEEREhW^MV@jFD
:5w#RP l$+\NVeeN&LwwAH>?mGQBppGV^k/dNn\pcPBQwbtF1cY\B<ZV=>q1>b9B5&%LmnA^&*YFE5VI\PBwauX
Jh:m9N NA#A?jn+$w95!Em@FT8\SiLchS8Jm:NnB\qXkpVc5n=w=a4q@p9>@j%YBB^NmX*qct4q:4>$wdi$ZR+#
pSHu$N p5ZXjedAaa/8LuPASBLH*:Q:PVm=8L4Qe\ejB%$e9BuF&ByiIYA+b=jy9wm\:iZF1@9ycHBWXbTXYK#^
?@yw+P +Se8XbYXFJ$=jT4*XQuJ>C<@MybNHelX+!4L!$<IBSyl>*MEQBW!CC<9\\=lA/bEcXe^HN>=<<:>S<>i
^m=tJ= 9u1LR>$@hu*1?bH$S*:%@CqI6ycdyJX/tbSE$5TuCP#ARKwCJTEc*S^muKcWnJMaYJMyMLwpwQXqimtC
kay8L4 y\G8@T<k$T??HI?nKEhJKhTy&kuCnEZmA?%Tm$Q^5EEj4QA*FW*hu4*:>P5*RFhZln8TEmmNH/Wq^>HR
kE!KP\ ACL>XJNVpXZp9RPZ1SM+%eXX+1pQEPkQWmTepqQteD4lAhle*5K/=4&&R#maeTA4\^9=XDDM$H!/m<@K
9&JkYN #Z9Cw?NV$nQkSTnENk:=PikLSwTFdApKYPA<Ve14Xihy=TRZw$HD*DQQqpuKQ=SS=j%KC=JZ&M$GW#S9
c11T*L @kIj+u/8I9%/Wd1Be/6FM69DR:HhKW:l\!AB+@G\a&NmE>M!5\6FqSXCwKl\eLtww1c&81\w??Tyc^*j
ma@!Y> j4X%mip4N/6!<6:ThNjF%ZNDM58E\6@q1tX%hcGnhCd6Q*G&64P<4X!q4Lw$NTp?+qTF5AMaJlEy%>Xt
wldC%u 9cAdLH9&p9SR:1uF$%5WYZqi%FYlL1w>q@cCy6?iCdVy&R85ltZSA#ST$l+BCZ@8TjHGHH6ZWE6yj!Wy
Md>W&p ^ibSHm!Gap5I^Zd5CV5THb?/SDBRS*j+DBiHQ^V:c/XMKFP^CY$<\tnC$AEnBSaVJ$&$NDM&NJmkN\+p
EH^&!Y uh:+CadGTK^bVt=ijp6<jRNY4cHYcc>h=d@I$&u/JHMnR^B<ltcVy>5=#=6Qiep8<F:w+M5M?%8Gbmyw
@j1dh! #X1tRXu\hnm\>t#d8M^u$h4\R=HS<WqyIcEdq!/LVE/K*&w#jyK#q>iCQ/Y6L1:P:9NtDiaQ5LJ&hcae
J=RjW@ P&jVDq*&@S#6y>qMt?#IBLDJlIPqAa!m&AlHa+n^u4%HI4itqacN%6JSW%XSWbJn>b>*8K!t+DR=@5B=
c4MQh# Q@:w?@64$i:/QDZ\%Ri5lCM=A4YaPLR9cDAtn=aED*BI%9uLPQ$DY>?<@$l>p9*<=T9%nj:cE@9^A<qi
VIZQ51 Qu9!1QZP4Y6Nnj>9nyE?V$!dJ:Y>VG9aw<iS9E\EweD\kpBykJ1TnJ\mX1%%<u@\bhY+Kq&KMp1KEtW=
#cIFek FYWXXRy+%5YYX%EGD\q6FEp4=atBbX%eFVlC&P4ck<abtFAGEkE>Vp=96J+?JXDWG/c615wFt1u\%H81
hK&B<X 5&SWPH#?b#WF:BjN+ZWB+#1AeZ*$BCM+LFS?ekyKalCQKq^H$huMddaD8VIa&ybSHj^ewG=pbii^hN*P
WbR!%+ k>FJYjtF^eYqwp11YkQ$M8bqJl+@5t@HlpBjN%6#R$K+ia&$WpiN@aB^/&<I1jJZbZ*KSeL$DY:8L5^I
nm@R?! YSJiYE5tJ?\I&d%:EJP%DFbmh?mB<MMpKBeXnb^LTE9QPmP54BRJ&<8@C8q!=d4/86LM>E8@Pu:RMm@c
WWP=Zd KJyN@Zy!*Mh9jcGwAt$YZeE??iVcKu965d8Qk!cSqLiZ5/9PbV5QHVbE!!!!RkSYDc!kT5&=:A9jH4yb
l5Bukj >CLyy%41A@%Fnb$X<1Lcm/uNFK*/8@ukKwhi9Z8PQN#=CA$bF8@pbmdH+8WGy5!lHeNAuYTymn?=I?4t
14@lbC &VnCM/b6!=/\\>F^KXp=i\Tc9RZ8>9d@SB/5J!HN\Id>NB+$j8mAIYMNVCjc&M:Cuw8PnuPe\YS+LeR5
\VGd!Q =yY4X1<P>QPl9Qy/PPMNpctlRH?C9wHJ^CuVb:8+i:lL:#^>cF?ZSW8/VSkSklk%lXh&<@JFkV6*+t%@
&+%mDA FNN6KTM>:Wk<VqE<96@L!5VCa@=<caMiF%B<jyt^e<*X6M&6Hb*A>MLBaE<=$Qc$*RD:&XPHct1wK@ie
!=i:pc RwcJhMj4AypDe>8PEP/ijYESJ*cG=<bcaLh!T5XYu1ZR\:hIhCwQG!XuyGYhmn#::8t>yw!q5\%Aj9Gh
6#6aiT w+=FMp$BTe?#eG!\nHik&C?<=8^F$IP6n<n$%T>jJh>a*<W@iu$uuXjj9**>+6tnB@i\=dYWcMtJ9HlT
Q\lZa> /SAbGZGa*ISSwWk#>d?hb<E@T<5m\RhYRcNAWZ<aX$bYSS%y>wW9!%NSpml&KHWy6/t\XCW1FBk^MXdK
K^ZCt1 <h1AYnSZlci5yK\%$5DC$PAZIJ9Yq\mW>MiQG<AFw@SdVaW@VH@5<N+5GYZPX#XqQqeSM^IWPGJkXl9+
XXH$lK XCQ%^tt\YcV!S%cS#Y:uKHP6nmV6<y5^4w?TNk?MtYIj@XiCETdYnk5CN??NVM\8FFdX%6ZXu#6@+iKF
-AbE!X 00022974c4b001202b3 Page 159 of binaries1.zip
RwMc+l ^4Pk\*C8Y*V+um%Bj6k>tuB4$qqc?hG/QwJ%ncL!<lhq9aRXqaZHR:a5<uJD&C^h6kIl5HHVFuAE?wa\
N+KRuS Ja$S+aeQ:6/>N?\Rn5k<uyCetq=aZX$y?qH?Vckp1n>jty:YKH=N1+mL\qh6QFqZJ\Lq1h=+Ep^P&?in
!Q<AKW 1*1QZFMIt<8AT=#<R!6HDS<?hJD/!K$maXj=V:BcdGHq8hLMe/>8d8yJ/KT41V5:8:/!1$JBXH$^1=+C
c&thZy n4b@i*l<R/>ijS#*Q/GiA1GG%8Gp$:VE9#GJXckL5S9A$1Z?$uwIV<KwMeCwSXJG:R+:HEZcdTa:1@WY
N:6FYq #HZwblRcLm9CKLF^t^F64C$aM^^aNZKe9yHq%Bq&$t:Y<!uQZmDH5I9MFC5#R+Fk\uk>5GaCE+8Jp&jN
JK=6#A tT6^X9q:FVyiPy?YlCSY4XtL95@&pI*?m%ahBE>tN$tjmRFCyTPlWqNV5PCKVl&+dwH%yDu#9h^hTYKF
p9<59J ^:!e89y1+Sy*HX%>P?RVQPFP8\FV4e#/>?1lw/ckaWdCieVD\q6ZR1dkHd8M>wD*G^F*JPSRW5SedY%%
mbNF>Q 64KKwn^L^TclMPepNl%QTW:LmenH9t5Xb?L>:FTXFEa::kk@hEAe%k@RVnLAp=paZ5*by15*:#=+kyQd
JeBT>G 9u::<XQ<T@Kd@6Z#=@h9RCW!D@^lK=b\pV4Hp/uJmY4^tKwANm6T&plFEp49%Td>Pk?F@%YFBhk8//^A
Aid$RL aa\8<1lD4aQ@mT?9^tG4p1RiY1pNJ*!4anyeJ=jF?\E<W8R1!Y8NMdL?K9kqWJw\TqiV#XHnh/uJ5Q8K
H5QXTu BRy/\^Vqqduj%XVa!4Ka$CM4y!yY?\WEW8Z\NEjwni*NatH%uI!e/t?P+nC@Lh+&l9w1+<j$k?<8y>b:
KN49:G :D8BywGynjPmwB&HanMLSTCE4%!>jQY/yFun&8YLb&6EJjpbebH:6/<LtG>9!VBwXkP6>PNP%JAFbcL!
FZqVZK y&Y/FZZX\5!E1DZ?C*%<8t$VP45>6/A#HdIHD4hD?*iHSWdF^CYp=Ay411549wAhWTpZX6TiK<16?m%=
4/&kMh Sm9iEQ1tuK/9ye4qT884VuZT!k&SXuPYbb\:K&KXhbZ#lCYS!%d=?*k+#bnW%!/:Yq#PK956dBiy%q?5
*=AVay QEQV1eN:+:&Sk4cGaW\NR=*GM+WkI%W/j%eqYA@4/XDV>R#DiZnl!pRqyIp?kaR*pmY1T@&ZLQ=@<Gd%
Mi9c?T 85*BIVnnK!p#6:C5JH&>%wlbhnQ@ecp\\>&$\/nNeI!^pcHi&NGDB\\eMt#E1NFn^^5aGb9A%:CYBF5d
<9wXhm nSp:h9Tw5iMuGBmbYp/hmjtHQP#MNdj:G6Vd&<PHtXj49&\=\Hu%/1B%Y+KDq1$<VARRCtqpDYqn>we&
MVCtQF mXkcuSi?*hJ=#n\QF&juPY:8/?41G^w9NF%P&Dl?@Nmynp+a5=<qtVuR*5%l46%Ew*FDimpQe9Tel?Qa
=B?nKn @^BuA:FCHykTePSaRu4<#nPuX@dS%iay1!w4!LKG:e9L\qFjtH&Xhi#E>T9a&#euhiQC\S#XMe5Q+4R9
=X%*LN kQiS!GQaACThDHGyQhh$:ha>LQ4Gec&@&5V6pk//9XjdL?\Anq*6ed=J!><T+YSWi#FMd^BTVLJ@*#=1
%yXVNS 4?+?/VRMWk4QmL%CdHLhIFCaMH1RnBK9E:n#pW?4!@QX8B\XTytqJFH8WBEVG!VD^1RE*ti%d#\qNa/K
HJ=#9F aw<SW\\?C*/A?hH4wc&mw1bP1eq!iPMwAS9jEm9VH8yK1t4<hnWbum1qyKTwwCA9L/QAqSAtaSZ1RIFk
+TIP^m mAKLplEDp%S?e^S/VHThcAB$WNGjMK\@S%/GN$#@I@bmuiG?hQ&i!PS<WZ*V>h8aI*D*Zt949Z6*mM&6
j$ddCE KM=NPS+i5uHFAkeytRS%6GJd%Wn:NGH=p#K/ZLP1RqS/Jm94$J:R4b9Y4X/*Dt#SFn++9NmECSV%5iQy
H9!R+4 ^XXX%XTXLAm&D?Z6IPwWG=4P=b%5?9YRb6?5&*c5?uJXTZXq#5>&Y9FXkb@QkaI/tS4\5*kXBVHHD8#b
NQd&WC 8mdA&&*G6JA/TVt4p11S1SJ%CGXFqbXmMERXDZWuu>BuVekq4IIPj*BwXVZI85wG+eq9:dVC*aAy:6q9
cnC9%y u8Q%c!WJVQ#J&Ad:A*+V>6jAQ95MpWl\al=^uj+RcX@+$bnEhP^wWN>\w5>wt=qT?&M>$ewKmGSmbQVV
YHYkBE WG^AG@KAM\J>9Rpnl\$jNt#w+KHWpNEaq^k^e8Tw$cQHw6GbcIQhtYdPapcPPDwBp<lRKyJI:ddRh>Em
V?cuS6 Q:<q@lk^CF!=j86t@<YdI4A6CSIJ#MQlTFLtp\FEpnIJdBE1uMKw@W=P:q+8nm:8keL/luQut?ApdK+=
IJ&/T> =t^8N5QBAYk$&HcY/=akj&?ucSaVl9d8a:Xk*u#T4tD=m8XpR8!t4eE:>\#aS+bGHw>NT\8J#R<hy1&n
bqct/y Ai/V5l^LI!k>QTWyMVGBm6hImV%R$%BX!nRZ*t+!cIL*V8yRZ<\ynnwim!Y1Wl:l/NDu4*H<!i@&H^$>
Eb!S51 &*<Dld=<i9@&%dNH>%8\J$W*k>RT+tKb>nwS#B\N!Z+/VJ9RB&RL%tTqMYZlRKA/kd!SwR1dK%b4=:@n
VqGLCQ 5>Ry9mwbpMNYWaXuTyFEBZBpJF\bul4Fj\h!VFtNy!KuPM#K&8mn+J8AQX+\6Ji1Iqih1#:GkBJ\nW\6
h#en8u y6k/#4W*:K8p^AQDyMnn+kPBQcMWbhl<myBI#FHwyTea4T4qpQJ9nn^@mLFA$CqRGK*FXl<+:4PAc&B8
/:8BAC P&@b=9*HM$61t=49@Gnq*&t?jL=PXJkbF^G/bTWYwlQTDKmtFT=/H!!64ukIuPEJ\d<EctWty1Wqy&bp
8$cMn1 e*LluT\1KRWDW%Eyw5yayiK!>?YhTJZ/1+Zy8di::6HK:&?uH^ji9qF<+Se6L/:h5YCHdQ%=IXZY1/K5
\P>Q&S 6Dk*Nid\*8$dX9nPZX5mK1?51!p8Lm!yEPFR!11c!q1JmKyR1c+<qZQ44W8j9mVVS*hX/cW/+Ey%VhaV
<9JtMp 1w&Y4W%=lEVSFlZqb&EZRlIFb?!NQ>c+$E8+T@<JlM@#HIk<\V4qhb9IdQwVmYp+ZL48@NXd8VaY$&&u
&+Ni/8 V=%MYT6N6GI11mnD:\chAlWDR\ND5C<C9dGWHtj<BH&BIhkeW/\Cw1#y!d&tVLZBJta#b=Hihk^FyBLN
M4cw81 jcGQL<dW\F\9Y:=tm@<C*/*Ha>DhBw45D>%DYtdCcb/YtjYZI*n?=tNZkh#+%i+8C#\>n#ce^SKC1>ic
HMN8%Y d:Ze9bMSaGukMH5tbV6+=8#hB*h6Y4Fk41*q8CH>Dh$>=!>e:LjR%*eyytPl5hpi5ujA@pN+uJ&IA^e%
E@/@>4 au>p51q&L%%5W/ZIp9iIQ=YYEB>Q^SuE^mj5#edKSVLSNmy!^d!6+e^E!SMwySmKNF//*6L/?MZdn%>\
>ue$^% jFqH8/TN^j#1/EHI<9unP%B1D?=I8bKHZPEBX:DDD4lSbB^bX=kPtdwE<y=e6VI14aR\ShHR&6X=IJcc
6t*?@l 69Pj+/WQ9+5uWj5P4QnNw>WWqXp>#ThNNHk9?ASGcRlQWctHSMA*NDG*6y*6/4W+\N6tmL\!FkHSQDt8
BDp/hZ Ky6N1dLAV5p115Jn5HkTdli9He6T6ZVHnNhpaSNeYTWP4=$n^>WcI&kV!A+dMPaLQJ#=4QtB\ajm<$TN
@^^bDm %??$*t8=TVZ*9I%V8Y>nBmD&F/<8#eP&4pE?VlMbl1lX$a1jk$N!1!4LY:GJa*qFhY%NdY%NhbXmbaXI
n%>9m! KC\9@\ce+AnL<a<N%\6P%uXT6<ET9Y@I#m/mj6C!Q/?pDN\aYF56LM%ydek>ZXy$M8Ha\X$d@VjtX\wL
I!IpJB DymMGV8!9@@yKwqRWXTb66R@>n\qEqiwXFaZ%>Luk+d&It1M:^bW&NBbwXBbu*@qb%ed#cKRE=1qBVpb
q&bQ4C TdH@&I+A@!Yhj4\qT@?Jc5>nFBkRa6ZcVh6&:V$Idlhy5%dViLu=:4Zq5/dQtDb=M4w6F8ctJ5bGZRaT
+4*ZjW Rae?NRH>T%wj@E\DYTNnI<yp6Kt^KcadtJtdY%mS>DayKeB&&DuMu8*+4?Ea/aY5YI\&dNXGQ<<A?Kc^
cy6&48 CBMyKjajQII^J:AWJ:Pw#DpMK$m4nTJT+!p<jhl@*na5pd:RhPXc<<$Y9Q!@ZS#tQ64P#6dY:Z\SPP\:
%mpj1m Au%eb^mQGYdkQH?i?:S?84yccld?RWmK+F&4dQ4QCDwi#p#iVp:Nm6%ZiMCyd\<NPJYXbXpV9cLV+5Y^
m:FqAW kynayIQS?dubGTpJyDNhBJbMSB::!\kSGw&Y?$>i9kPdkbQBj@?mjud?p9uhSuZw69@??j$4DmF><yAl
Yde\qX SCpTImXJLVE?F1$HW<$dj8mk=IC8%HJESl+:Ea>*1hnZDb9t%ktWDT!h@IItDhbTc?M@=Li4j?i@Jb$H
4NRH#n FaAME!ed9BF<EA\$G6X@kpAA==QbyPpP&J%?>abNK^hc!m9^%jmnwk<aD?FI&A11dFWXXYAYT=YTB>hF
h$<DFp mh\aKdCXqFT\bqYJQ$I\81e<Pm?!mp11dS\b*uAbQjD+6R*Mb*t6*HEp8cC//Zd4*X6Zt!+$u4>+ThKp
KP//$% hiZc#V9ImE5NwwKME\h*4F*pNNEICTH:ybJY:L1V8VG:ZumuVF^Kqd$9i%6Pq!p$NBiePm8=S58&jSb@
+*+kH< yXthm8<15>ILm%wwi9D6*M!mm4#W/EP:DlcJV9w:YX8cCu4NVK!wEAw4C1JYCQVuJNSVYNqYK<4:V5iP
5qFDcW :p*Cadw>#BIcK/pKT1SRWT*KK91PmRRc^W!p?a@j5e^@CiXHLcd@D?:%GN^nA5/&ZcEHIpnd#eL!/4Q\
>&>KJ6 yn=<ZHh\p6W$/+uwh+B4aYlkwK<9Fpn$&!iI>ipJ6EBBZ/B9IBBIDEabG1Ey?Aj&mH8E@W\:B+jbj+$B
%KX5uF +H/HF%:nLF1$iQp/Z+<q?<LSWRM\@IH>wTMpny6^M96pXydW>!BT9KRMK=94/kFF>iec#\Q14>/AI/u%
\1GCTi Qtc<QL=?en>wk9yQZ:>jQ4Fu@dyFVqaV>C^hQPbcnP4Z9/?P$9D=iCY/ha&LMY?Aq5uG/KNS^$@E+JD6
JjJ1ml 4NTh8cW4B@VTWRN\!M5yn6&XH6eX\+&Nn>&:LTp6Pb/kuw1kI@5iI#*Ryd+/Aj*VX?@IyLK&Z#?@T:/J
y6K6#I 9@iVX8J*6IMl?QVl#e8uPI%BC98$qCRP6wCIneHPBbESS/l\!TE/ZJ6k@8m^9>=/cTtk9qckan4Li>*i
#jMNTk ZW5GehW:?PeA<q$AiZtA@GV4q+L*A4DFAHhDa%M4G*6uV=?AXS8Ch+Z8C>&$YJ*d:%llbYQBel5NFVaH
ap!e@: SBbdVa&44Ikilw\CY+^F&M4!<ky5H4nuk!aIlmln^I6^%&W=@ei@EikbtM*$Y4p#M1&p@64hi:i8NNbZ
k>CX1R X%bY%hVZ\Y6@:8KXbpD<ui9u1$6P^l*i6Z/^$!SmAYTjmYlFeid/8Ebl/R$A?:6!ShG=t<WFVXR=VhMK
?p%W94 %PPG#P?WlB:+wVa66cAk:WTcKH@Q^1DqT^c+Plk5#cpTXlSHd%/*c8H<I@WTkLlKdW%8#eN4X8BuW#$W
=R4B5C hZW$l?>61PwW!XjXZ<wnX@=c@#uWk%c8CMAGa6Rm>eWk^Je\ITpy\keD\u*>@Ji9ZLMSp+cPaA@t*AL\
jXn>C5 CT=e9Z*@/i9*mb:YNyMwC&W#E&NnR+FAZ@@LlK:^C9wVJw#ZB/mQFSmRNk$Idk5L!@?@+EbH%&jS5nZi
kP5Pd\ dw6*a9$J!B1TdaW*FcEpQ^lPN<B#Vua*9Mu6N\dw1\HcDYhB+&Dy@8Y4N=yJw?ZH#@Cm@e&d!/hZQRP\
Iye*yh 6ZY<#A>h=GJnanLh*eN>l1qAMG=wQ!%V9:Z4N1?iQudp5IEnnFhEa<LjeXA#TetbYRePyeZ1/iy1<6k1
-AStXD 0008806766a001202b3 Page 160 of binaries1.zip
tP:+E8 Tk15Hm8Ta:6P5GQmEnP*HptM\&=\p5nBS:8luZitBMNR%^Dc:#@@?N&BB#kPk9n<SjKX?mcHDXiyD8&&
X$BNA: Z>??jETZkE^j1$T9Al^&PyEVn@CPIZdm!GF^8K+W&@B55K5c$/1#6KRI$Y%5+^G+K?dM#tt>EN%9%Cmi
6Dyd!& Iyin!NK%u9Se<E+\FKB6bGJ1PZZYHA@M1NkY\qSVS?>*!lQYZ&=y9ZBp\RA8l?I119FWXbSB?m9K!m6^
LVDTZW Kb+Kq/&KF:T1ZP=9np4QEiNGeXuMiA^\Ahw+el^8#:F9BZ1t6y/BP!M#!^1dY*HCwKm$5KCk5LT<DDS<
@KpHF+ hZ*nyic:4jh8Zcw9#$8M&A$Rb$TP:CMl4hn^/Xdm8c4!L&X6yb<A=l@KFT91#8aXZ=KW$n@wAV>jN5eW
be??R= F=+8mnwWF4Ih=:VbBcSZXyTpSpWi&4N%e&J%lSlqT>YqJ6HLX?+>Thc?X5>qwl4+QF$lX*W=:^=i^a@E
>G9&qV X8J+iE69L=a6bZwb\bpJ/F:<L:nH@AH*l1$:>wRhQlcdqAEPd$Xh+=Yd>^/@?9Dl=VujKSM6#E\^mXkk
B=i=Xi teAc@%GQQ&G<H9\*ASQ^<Rk^M1bMcDQck5?ki@JjhFMPuQ@Ai^lIih<q@8=#F&^ltl5Bc8Jna\m/>?%l
4l<TPE !lRVRKNIe8n5PTeS*ZB\u!p5lSiXND:Cdm+Zt=w8pc#+i@ejQmbbX&@j9j?A$?J@@kd%<P9N=c^bF6c#
V44pJd 9Xe8hJ^mbtW&juljE>?%G=jdGF5cnB%maLM&pmRcuamNk<M:4cAk=6Tb1bw>i&D&5SJLci:^8BQH1SNW
qBG#eK nHJ<>1=>=EKQm8\HdAC=A9=w:yqmaZZD^Y8*Y=?<i9@qS^6<8?@j9uS?pu#8>$ZcVSmPdqR5DLadGY!u
>mIt@< y/dIJ!Wt^MhSPEeX+/$S+mP/WtSHw@8e#l#ebR!&&acV=m:hGyqdhT=#puwZwQ8%tlKQw/I+!N4c+BtI
Hjq@</ qhHpSVe%6bl5/+V61hh9DeGZnuSjLBHYZt!?%>y<5j#wen&e1m^YyXZpqXWWqVkWmBYcI\htmp%^MjhF
1/y?#4 YYj5iG$Ym$G*nGI:l?LIcI%/L^l9M5%n^a:IVPGF&@h8N6WKC@N#+L*IQyYjj:1k8A^eGMBG/=%4=!4!
h^6QY/ p!NDN@!B>=5!PKjjyliXX:cX9Ty6B*S@Kqi54D&jjiGh8Jn?S9iVjD/Zuk+MQ*:p+L=hY#e5&y^hXb/Z
5cQlw5 uy+eG*Z+WHyXSShmY%Shh?454*%VTVtZywbVZpPXpBJJKtR9u1uHc*BNet/VG@BN/<E@>jhdVJwJ?:IY
DYap=a WZ+ewp^I@TPkdaLZkwYA:YW4k#dkQVkJ=tCZyJy#q&:eijnm*hjj:R<&VyywD8i&\RS>4C\bV?q>G$j4
J?ue%P $iNp>MbSi9S+JZ*BZ+BVF9*@B>?#:P*@e*#QG+YhW=%eq1#Fumwa6wqNTE#w^9j8Q&Y+&Zq=8dqWnlPe
MBnc#p +Jqb8jtFJTDHc?4@\95!eXF^qMSVKd+@j91MR\jdmVD+@P=P*9#AdS8Y866cV=65QHda^MYdA/ecVyq5
BuciH& w1>9+dkSXjBSqCjpAE@QCI?yZ&:T8:etF!DPaytFJeSK/?@mM@h9Pl+hSS$heA\Bn8+#btlXkYG:%jwa
qp!8t+ AQ/#9iQ*V#KCZ9Ji=5NH<ci?u:?RwY<hbDV8H=BnT:m5nLSWLq+%A5^Jt!1eneiK\CH6BPRua4yQ<BI+
TW^A:# Jp8LCt5FZAMLi=@%B>M4d>\6h6dYqJBnZJGu1nB1pyuBE<Fu\Zn!&1M@bGp>\>F6kX@k8m&:>8MwMhTa
@\dq=8 ycL1^t6*Y%58%\6Qy^=bc!Dw4</l&DVAZXbJGbR=ShKJJZCMK:M%S?wQ=BNqL1Pk&5tSeGV+R#+KJllQ
Q:@\:T eR$In5kRZt!=h:&^wnA*M!W^Lm+lCRiC==\1KBHXZdnY$u19?WJ%ai1^j+D?5wSY/Lku11m4Ebe>J$D@
J$G:<F A5h+hWNYW#6XTH?li&PL55h^IE8QS+d6Z4@uXF%XcZ=ihuyKRu^iSV8kZLt!ZyS*4nN%HDb^$XT#Pq=@
lEBNQL 6qwEIJi9QF6i$IGZ$Pwalwp+8Ljd=aSV8<6HHRQ8@/49ijQHEw!VhK4N&*j9^#GN&C?99LwBnjC#6=>@
/bBm=a h9^?j#:c^6#EAG@AP5d>GE8Np+!XHciuS/EAN!DCt#LqEZYCXjIM9Kpb/4b@+e*ki@/\Bd+Pe=bm/$b!
cc+S4N il?D$^5EKaF*GJb*HmciX%aPhRy?kq\/b*d&!b^V+G$ThAP&GZCVEq4mdCK/*:^:>?HnJ#\><jApeQ9\
5#R4k\ >8Y#J\?4%!/bdi6kc#Fl#PTqt^iaVb\^%hSw^^VQdYEHD^$/HIGyhVF^<WC9%JkDKe%l\*911QNWXiXb
my:WWH I#apJ5WC9DGJNC$1/Pm^a$R?+PR/W9=iCbc6?h/nq?<R*ZlWM?M>*\LJ*u?Ab+LN4uGIY$jd#&>TlJPt
iQ1#^M l!DAM>JViZmJkSku+bln^<SHhcZwn5WkKJ:m^cZq\uJR+DWC48pM#%Yl<cXN4hjKD!@wTRG?*/pyeNuK
*%NZiw w!acQlS<EVC99cpy/aJn:?K%iQtc#RD9KP\=uW<KYECu*L*iYFYWuSm=i@$!H/eSA>W\:WyFu59n1cqJ
+=RX<R iLJeNphMAK+&aM\pe#WE8L!<CwjLyVlmnm!*u@+Zkd:l^Dq?&G:9+y&:X?9LVtWpunkYeiRItI5E<Nw#
^@*kya e$/ZXnbeAw6^8/ttKD%1L/DeTm4IC&tF?nMq>bZqV\uG9=W4XNcWyF:8Pp&@w:X?=MVH^5ej*^PXE^>#
9:JEI* 14dmVF=8Xy/I1tSXhAC?6c41L8h<4=+=5E?9un%/c9HG:m1y1kXbLq>dujYiiwL+Vp?MPSyPww\kWEkF
G=4q6j qHkl:eQ*Zi!H?8TQi@pjkAiH:D5WiS!:y1L<Qu@%Jynln>@d&*><jy<=h/c^kd/iZ99a*&NpS+<bK^tn
uycD=a luZ5+<hQtEAEPAG=nJpFbcu<B?VWhN1YQ<8PkF^/mM@#<lk&*YFSRGAR^nYbm>@+yCRW8piQIMn*@iuI
E#RGXi KM/ji\4P<b\eW85H+48lpiAdAZ:%&k$G+W?iIeJBu5DBmTeuClVEHLqSi6B/>@LPbY+Pp+#$b@q:tJud
Spt@MI #da^Mbij6Y#j@kQWRj6\$1$DT\hma8ITMk+&u:V8%$eduE#R8I5m+8IJ^PQn$%KC>tNSG:tk#nlJMm4R
$ywL\V 9n%/@8:#D$V+F=K\JH+q<?a6>c:@i+D+=/@ptdV@?9dy@Y5y\C5^*Va#I$$i4?tT1ER=RQkJKqwTSWX4
IH<\dV M!ublECutK:GRwJ99yG%T<D&/Q^#Ldj4#!R5H6aZAI+hmhn<CSMN:k8?C1\N!iF6aVtJXGq/LqwY6Huu
=nE*+# *uAWK4qutJwVAN:Ny41!W&puDt=d:VjQej1p<TP$&Dmim<9l<9l<Tp&Ym>Y/Q#tK9CELF+^RWTCnW?TW
Q$E:=j 5VaEEN=#*De\$YlH\yJK#:je9X^VuJ%$QPLA*6A>wRAY>E8T$uFw<+X4h<BW%JXpSP>h9/kd+6<LcMYZ
#<5Q*& q:J4GwRqL$4d!6/Y@T=ZEFdXqeT<#KQj$Lyh=&IQ^mYhZD?/u@Yl?CySWYGJ/PTJVGFXB+l65Wnn!8uY
8#e<W5 b%X4^\@1%dPZ69wk/=YqtAalZ>8R%61FcR<nW?Km5TMH$TuLTG5G:\ZaZ^j:=tD%#^<SQu<eku#^WtpZ
<WVLaK /d$HI/ScVqVdiLu=#1PZ::@>:9n%>iPd!/i<Bab/a<i&n&pj#SyFncdG$GQyeewAe%VmBwcWpa!JKYZG
R@c<Qw Ayk4hePetpdnYR+\:>a1dl+8E%*kLF?/jBWi=d8baV1J!XKaH\4dG:4@V*eQ/k^>t5yZQ=WHS%6JiRYB
Yadn&H PS#mq/>RX<&9ZWejp<D<^T6GyZ\qjVmqPwXe?#^?iQ@iuh5*4!Y5tt^m=VbhX:Y*tdYN?cRh489*dFm?
jRlGB! JR\P<!PSJJl!+ulW%LFnciFu4^eEn8?9\iW1!1mNea>KSP\qJCctu>!<M=LwFDA^tAPLR4#q\dM*u:/*
4uFRVZ hj\mh$^ai@H<?R8RVK@j9GZ5mqR$jj9<H/Sub&ct<<kqAaChCTWiq$V*PC:qXAIVTTEhmT8EbTYIhWQL
5!A9FP &d/dDthYN>?>YJy&iK*ZiBt?&uu?J#X=nm4jeMJh\VjBLGtuGi5yNnNt&wQdGdB/+@dR<Kk+Iqa1cl4P
&JTV$& Z:wPe8Z1YXFBXpLpu9WBC=^uV4a\NlKM+wP#1T\uy<DtpnHjZI+1y^ME8kb:\Nwn?%#/KcNEq=YVW\Si
kHZuRe hHBp6Wj4@^AIVGjMZ^$cY*kPIF>htBpdESaT9GZ#=m*dh=N4%=nEnL#m!4PZd:jCtX?cGd%9@TJHKidd
9%pEWS V6PK:&8!K/?Kmq<S#LiDh1t5PXZ%W=JL9/J%nl6Q&^b5yKGq4VM<eEiSWJT&%N\n5c4!l$lViK%E?PHL
NEVEka #d$#4Id&/cYyy88WY\iAq/5=u*Wb<e+u<WL5M4lt=jIAlL9aT=QydjPune<j6JP<PZJ=FH4kTFR5cX<1
<&WqNR JEHDB<@ijj:X<S8N:<64ec9%>Mi&n?+eSa?pAi<$+J$N$tZCBAd9SyR^!+VB8/IW:=TN%9RbM$l&HVuZ
VW*JpL =:1+#dJ\hJ5@:D<nDWl?ZDLmQbLk9d6>NCcN$RZ$GdZV?jtMe1t6^@A+wN$K$a/>Q?:hj<TM6=j1Ft#K
eV@N!J *K%e85@%qq9N#hi*nB^5NupID\+!>cEnymw8*Bck4&5TSB%WDn>!BCh6wjVYna^IP=L>?E*Vht6BD!:w
Xwn:4Q F^YLk$q^5jGJXNKRnQ\>Y/Q\ZE<quSR1//RYD\<D9Cb/@i4F5&jWW@4bEID<K+R<tjRE#/ad<HeI+M5A
/&G&A6 <FtbGVLycbJWbjmyE$mWSZJCkcA>kWyWI/XHBZk6WFtJW^&1BY1t6q=B?=LKL4hi1<1J*4<>WM:SSI*:
Au<4NH le>Tj<D@Cte<l>QZ$1lF<F%kbYBMSqKS!V6Pe#$YLq&%IVn$$NHa%G!t&8Qmqi8kwY>e1C:JVa$?GL^/
Q8bQ5i 5aiDnTWY6a^VqXXXq1Np&C^=FVdAu1M54<n8+Iw=E1+/y<?/kuP=9pN:KcJ*Cy1h$</SWS@&E#RV&y^n
B:Nk1< iZZN>/=WF/RhQ^m!hZ*R/yY4k6b9^bTD<KP^KTjQCP8dd4di8<aA*%eKjDuYKX4l$+*59L1!%\V*+uJq
nL1yBP aYXqhZ:/lb>WN9&c:6%5&$N*$Ak+#u6wc?t9#MlPCX$<c>185811&81K*\D@<%Wb6i*$\^6^n8N/>>VT
Vn%?D^ MIt44811pG$+e=ckH=*TQV8&dMD?6E8\pRk%u@LmaJi$Q\EZ!pMY+D>iCu>tEk%AD>mKt4&Med!i99:E
=I6N:P TJ1*<QbiQ:*PaN#wnqGTpjRIlkKKYGkuXi<5A<1RMya*\j5m\wBJDAQw/S1&M&%u+yEQBJl8aYd4/DJ9
#l1$aw \VA<<Nhm&*XyZDEJGZCCaeDi9:$GJWXWwXQBthPutdb4=#BPjk*An?m@JR&:EQl@?5REQZ/*@ZQia=Lb
PbDMCm 9bddAQ<e1%+/Qj9&$6Zp1K4\Blm=&Dtdc14$ek5>eBDpJ^c8aB\E@lkiG^tc>?=hR&G\SV?Pm4#5<GB5
y>cCXZ ayGauJKYh&R4Wi=yJCidpVZk65Qy<B%9TX<<i@4pMjXwGKqZBRc<iWhtb8IqEwQ@l>*+#<i$XHt<Cpmn
^IcBtF WlYT$Y8J/+4XJZaqKVtbFHdn>WBFFa=wRQmDb:lm%@E#nZh8N^RpS8\NXqnu=&!m1>dJd\MC@FCn8HK>
SpwQyQ ^=kd*lL<RAKaV4TbN5MYS/k:8*1Aq:y?&?+DpdGyPchLlE^hLjn!6!?Bt+yyAS5DF5!^uYTKZbN/5GVp
mA*y>d bCpb41!M4J!KG1a#KC1waBe=Vn6ZVZ*E!4Lp6Y+GY5w5Eq$HA1kN@mW\NDC*>>$auqF=:h:%&wLW1Q*B
-AP9#n 000de1e30a2001202b3 Page 161 of binaries1.zip
V^PR&i /%e8Y?4uB<jy&5%d6+j5C+?KV#>XYuPl?h/>c\*AkL%@GeDPySZE4Tu=BiXW&ejT*&X9!yVLlhW%%TW=
q8uR>S cR<#RQAwh+d$//P41cudp?1lQm+p8Tk@<imlZc9C!&4KC$81lemB&p6FSY>w88P=KNm!h$?%wZ8E%bIK
Q=E6KY 8j1c9E+p\iDwCCJ+%wGpJ!*NQV%JD&nMIbcGb4ybwN@NAl^W6lPnM?DXa%!>wk/9VB?@?5Bwuuh9Z+E*
akKBjM &J49cVy&XNhI%kl18D#t%WmNAV&P#Yl<hKdAHJnIMX^RaLlAVcYuWVQ+wH=tP#w/VDI%t#dVaa::@IZD
#6EqJY GX9ANBpp&me%CTeBSaLG*:ijlNLT5$<XqJSTJZR^H>MjC+yB?>TjP>>$=h1NG%R#jXQ*F8uLkTEc\wZQ
/S?y>C #NmZ*?%W^<B8Y@D!GSbQ6>^59uFyYX?\tJw/Pn^XFe&Sa\Z5mibnB\\e=^F!/ND?MPw\FWEjaS&YlC<=
w4HG?H iDS?@+t4D&=jPB*tQw!6!6JcFyietJ!epy8>KWJ/bb4QHBT*mZQj*9dnC?aLQH*</PHDB\<iQkLVBGS+
9kTkF? >Ry6ASMS@WPFK!S:LV<u=&RYuap6uIipySJ9Nn+?V51EqJVW%DTMTBYZCT811pt:dCCDwcYn*=cIp#ZN
qYTVwI h=9KMtIn>mylGb9htB=cQ>Sd?Y%1m1DYNRcMN4$BdDA*My$+jbc>k/MV/5#=*u+4%t+NCa8MTeptSidu
a6Cm:1 L%&:iRhnl?DW=mSHl?$I<uP*u&JyDG\aI<9Cj9F<iXW8$WB5FXW5Y?B!juJy$FnV6/:^tDS?bF<Pm=Jq
i6SIn5 KZX\bH41A^tMdicBl%*ThQhtjYFc%N:N1\MY+eRuL^?e&Rjma9?SE!p=^XYN%?@h8>:\Z*PkhbJY@y/V
XLq?VN pXW5EkuL9kAdQyZSycyq=cL1l84Cp/tZj1WBI@y&NG*Z/#h1yI/tdw?i@ebdBpiWq/WhQ=SWY:VDc?/t
^61Mb4 5:>E6FC869VMha4tT#ydm6^H/&wHq6SZkXuJ9a=84lwwwq%M*?YqlA<TD%=*<$!yq!5lhDD\Y5A$@tep
CXMIuM ?Z=5EycepZP/GK>V44e<jQ:8C^FFH:H+BN@8C?9hdEhJSmkQG#=<^B>CKDK>&<bnb!pYiAQ@q\@cGL1e
F1@uMJ cVjdjy1=aIK=6e$MM6Deh>mTbYkcyC+9mmPGEEj^&wt^WJt=y+6K1VJJ1YbJeXEScTPIdACneQQY4h6W
:\mGbW m>ahJ1V#/nYP?yd1ItDDIQS+Q*@<a^y8Nh?+jnHNd&mQweN$?G^qXb/t#kmi<VVn\eM6F^*ePttM9u9W
j##CK? Iiw\jakXLn=EH#TPQBB?/61FPtFB^HwnZZpF%^Pb1cuytd8*HCQCKJM^DJid:#$GZhVY@lPnp5?jQHy+
kEEwLK Z>I/@Q/Dl+?jwG&Ay@S@&aDVpa4!\Z@QqntbJe=W!ElD%:e#WShwAC^IT<<p5T9pRT%PImt1E9BMb*19
QJJ&J1 C$589>^/9jyWct\pN&#uy6WBC^$Nl\@R+K9#P+ANPEXcmcQK%lp!*k^\>qM\CAulMIepdYD8uS<J<l\=
**!!/j uyS%Bu\CdFF!/!:X!t>81m9Q#+k>5tj#e8?=M!ccGppMFWh!mjmS!QLqRAClb<Bte:HFqVL9P=jDG&W*
kVHiLD \$kk$B<:ZE5B*ANFeIlq8bwnjkt$DC!hqt\:tqh@8?W<RD=$e?BmL:i=qFM@b\@9yaC9neF:Dpaqum!5
RWZRR1 PHhNcmKAFh%=PNwb6P1*M%tyy/84154KTu+CL*/W<W9LlEIS9M=%%XYup>I8@JKpkF:1R>FFZnHSE\h1
e&wQ^? e:X%%VS/nb8#L1<pLc<5NTS\+bcG:!L=T8GyLJGabu>>Ht\^^D&:5c/8yPA^pkIdKDPeaCdDTN^yD\+y
Cc?T>L diu&mlqT$F=YTA4@Q>NmI1KJy<DE1PEEjEPpElcK9H5DekDj>!6dF=u1ATPRFZ?6BK$uV/\EbjAQKiRJ
<4Y\YV KcmyMna#JLQ+W\S/a\^MLTbPRS9l/8t>&NIjdMTtdikjw%!K@+eVB<P/u\1&iTLyTYYqyTZwLnR$Imq8
Rh&G%w *RbG$Hi$:>/:l/S+>9L%Y+aWSC%SHaQdTX4pH^6^?&d#>Y6ZL#eh5D5Rb1TlLK@KWXXqe#WH>B>8cLh8
4BwD5* t#XjjimeCMuB6kPLDl+=FLw4HQNbM$<euNqQdi4l9P#58KDIa^muTpMXYXq@Ah^meq:<?5c\+Z:49Z6*
JqkQdR Mc%Z&6!DiVdjj9#q\%$yH$/jApLR&iKVTtREJ9nHXFJQ\wj$>I#M#JN@?5QZ%XTJ!yAT^qM>ApNmClyd
$yb5aS Y5/X=KWu<KMP:ht&L6DQ!*ttaFSjdjBuJi4*?VT\RwYnAn>Vn>EGbwcZBd<Ek\!BF:NhQicS\*A^9MqB
KET*aq t*j8P^!htJqjT4!GG!**kBe6X<>XFtauSaZ6YLjE\*/KlVFqTB9Rky+>iM4a&$NYBmkml+uRQA/Z^%FS
lLCH=8 W8b>=ey1>^p1F5lP$P8n#FaC=wAD%8?u\Ml+&9\%actmc@e8m*Jm>t%i+iQtPG9G6Pt&hp:8Q1Ci%t#i
PQwc?l 8V<!Q4NA%E&L+?A$T:N^=QlyNJ6/jCE^1/CmyqyWZ6bi?1855$!:9KKm541t64/?641tymR9M#Z:WpeZ
aj>pWp qWR@y*5$4ht$^ZG1nyJYV\*=AV91c54Km4KVa+:EXH$S!XWW=&P!Q@YnbMhm@?NZ5%+SXwTF:6!/AX^u
@*=F4@ Mm=yuwed=e1Vy64:TE&FYMwKe!p4tGkS?M>\QGjqFVLT/b=WPu*:?yqE@q+>B%/AT=1jbGe^j8Tw$hRj
YF/BXD W1n<pW=kKpbk%%5#e*M41+uYW/da&E\DTY66bnlt%BmBwcG^tcW%q6a+8*9=?A$NADwTQ=ywy+TpXPAF
b:8D&X *kJEHn:WLiQPFJiLK!kSX%liXk+?SGQVbd#Sw8:Rh%u\4t4eb!Knd>>@@MMJTehk^qAAp=<@Ji$#tt>e
H1K\@? 8\1ecD\d/#q@e9<BdHqX6kyQn6%u8KHZc5iltkQMjR@5w@bL+BeXbuVk+KHDEYE:<5uA?8lDT/bQhN6V
i$:#>c 5upZ!jLH5VjF\8y#q=49QZu>/Wh:&*eA@a5un%49*SY*DL>:V<wLeG4kCj%DC=KikANcV?ij!596#JE@
:pG6Ea tbtbu6cSKy8YupFq$qq1tHlSJ115JkkRqSWDH\!6=m#hFyqh*Z#9eqXyjybtep^p&K:Nc=a6<y\:!>^+
=*GatC TB>6Qw@*uM>Tw#B@teQG9qb54REnDE%NL\l?I!85y5>&<=L&NR%aESm$CYNICSu=iHNBZAt1Xj%i<<Zc
hIqNPw 59^$NBe4jb^6\X^Rlm\DmWDJaICmkwKmDGkpiba5S=NQ<Yk%YT=d>SNZXt&kjyhAieL\981K!q#hed<E
1Yj*NN ^tAuqt/QQ6N+6:p8Q?HkqlZi#nN64ChmX:Cbe?d:?AY5ZB<eimR&++#w:L?MtMR\auA!4j#=bjQJqK!C
I?^nbW \qKJTLG!11yeKCy4K?%bYqcGme!XIK6KT+1KV<HJpTX<<dc>p+1uu>G/H\/8<qt?#Li*nQ1Y$*Zu##a\
nIS9IC 6+i=Fb@BaFRq9?91yPWjbG%eY+c*aH^\Jnc8ZhXNCi!j:5LF:Mj=C^bKI$4huJkGLpd*NeE8E5@BllNM
:+pLtF P51NP/CjQ9@5cCPqWMkK:DYB4LnZWHX!la9%lDHn>eC9B8tpJ^qQV=DXF^DQYk+bIdck#iZM#I*HWcP$
Q\d8e/ S+:VI!pQSmdtXyN6dP&hZD\Y?C+h8u\%cj:QBJaaR8Dk6!l\J\=Kk%8FyTJJNX*F^+d$tQ:hiJE\+8+>
H:qRDF ec9tjSV8VAn%I!ueAm>C*DHpH^MB\8p88BHZ4#Jht89Q?M<idYB1\JXS=Span^^1NH98yEHcw&i6*l51
R1&<LC &T5Z8ujjZtwj9h?I%KIePdwPZIlabGj+yup#jhiR\limuPC<PH<XVeZZ*^$@9*=<?@LyI@k&6!Y*S6#G
dk%NdC nwMQ$JqA=/cdE>?:PaFDm$9P=AMyYHqh8aw=JFMnZbLYE&%E%5tV&huM6S<Tw/Gl441m9LlT\DY#<%pQ
M5CM1N +8uT9X8N6eLC9nlS<en?ub8DCDWtYSmQG#&+l:cYBp<NW@5yNSc@W:&V4\F@WhQT$5bPR\Q$DI&M#E!M
ym=@$4 #kucBIMMVC!u#Zd#>tP1>qc8Dq1*eZ9wwYN^/ZuFFWkWeDPAKHh9ZVqd\hmQ>RH#b$>q:Iha\DMaP%lJ
CS9J5K SpFJqmYn!qjZ$MBi:dJA!A>eth:n^AJKID>&WA?XkV<F^pa&ut9C$11c:%+wTa9a96JuLldt+klh1/q&
ZYh<id 4y+LRe=6&S$ip*G/&&^puhm*j9Eec+apGwt$ImYl*=?6KcW!qHQKmw94189PZbR$$Shq##iiqc?91^Fq
QMJLAS W=teCtFF*huG^yaQeBb&H1ij$J1hl*hMh\uiFujy?8XLq!/T>5KqH$RKFYjVC=5pudV5=?i@pTADRwI*
:aNEN? 4i9tB#c/:5+QB1uJKKp8KV@<89qB^l<#/TLy#HZ@SbST4#>>c?9A@QP9@#Lp+Z*RJ9e9bMSHB6yP6#K*
&>\GSF 6Jk\AZ8mtbAebXM#W*MLM&MVI\MnjY\9PHL$?AtW9qmkBkR^6bk$bj15&ZQhQBe8DllKYLq#N/qpPaHh
yK5+j: #KW#*$BKlYPthGbiRatwYqJL%>DX/qYXFhk#>nKVA*Ej&EE>yB:^yDFZE6IH^$LeMdRN@G!<T$Qy><hk
ehPSet ZLuThKG^wc/t85^@*6k^=ldViR=GR<hPhZa!/hZZ^HQ::6%hi!TlJu8qSa/HI?P&4N8KbRTHDl+I&:Wn
/S8q/@ DEj1^BJ4Yqdh$IS^CLAZ9=td+Q6*Y&/Jt$jeJP^+?In^@Q<l^=9uRA/ehC<1KVl#Pn?@<=S<dp:&!T^J
L1W/LQ Jk9MlY#Y!Y\1l<=X!?@Pb#y*44/tWqkC%DC&<Xkbe8J$\/%:&GX%aHplpPQ+pj%kN=a9>uK&5=u59Ml@
9c^E:B =h1Fqtbn?9Z9!?F!XV6XcFW&t<NV$?k:hPk+iDjEbm\nmWGDwB&aaR#MeF?+FEpS6Gah6q5KDn%+NDa%
b+*?X\ 6$lW&*ny&1&:\A!6P:i8Z/kyQRW&JHSLpJ@dVG8MTFEGHRLXecMWYe11HHXNVR&JP1$lw<b:#=ZncA<i
Rcw1tX VRqAXa$jM?GuRMQM\T<+?5#=8>i4ew:9Z4QIid1qmhmw9#FIPmjZ?V:?1#j6PlTVj1cdE!hnCCiM!j*D
pm/\SJ ^?M$X@L$+dZK&yy$VH@J#yceyHNaiW1u#lRK::=/?dYDFqQH/Wi$iq6Xq1Xy+9p4N/=i8*Ly\4t#>dZ9
9%>&b< SQIN6<9Lj&ND&9:kR1#G&bIL=u8++jSm9N*CwAMIykXM6JX!q<Q:By@==HwNL^^\16:8@cTda^1y@GQ!
F8eTKt *F/?@+LZSAl@1aF+LZWuyHuyLbiLE^KQ?!=hNHjtnJt&M&jA@>N6yp&%eZC$uY+#$hV\B+Li&NRTHYwu
@mkp\l F%SJAWQScRFV6B@:68DqLQmZ1JQRLGCcHTFjbX%Z9Xwh#wc6QZ9l$6ZtY*hIy%j/5h1Vy*@\@l*^L8pa
$A>%Z8 n8P/@y1ES*>M\tWek\GC9FJW9H@DpL:V8BNHnVCh/#F4uP/IGT6&:P\I$h/>B:6aE5kD\PN!\%iFlS<I
TC$H+W w@dVaRMQlyP&Mtpu<+6ENa%Zd6%@luqSQ:><iQ*<MZD1b9MN/94IG%m/Ai:DR*Sq@5Z<B<V<VS!KkltR
X#R*Dl b$/jF8e4w%kC4@4pTWqY#=QbPVt=iZtuV8HqwamA94G^AZ8qA?yJq68SVNGq8@h8Z&9TI?&FeTlmYMlY
XQAl8$ <CAY8LpGdI@K1d=ii!y<@XIQW+MJw+bIi@%MRBN5VBt^DE5B<APM#G%t8@5E4F/@aiPt#b6JFi?iA=E^
*leM@^ KVp+N9L!>h6*Jc$cLVi9ZYwRwTW+5HQ>mwX#yqpTT@BdwG!k#&i^%VW$NTl%ijmh#*9HXiCwck#VF*\T
-Acleb 00007bab021001202b3 Page 162 of binaries1.zip
+95&Z^ cBlc8/*cq%4bjKi^MPuAy1X86ydGZad>na#Ny>nQeX?\JHAD+B\E$4u4mQP!p:H:N@nNuY^<Y!CLtl4S
eNki5L *u\E@Pqj9#/<i9MBINbF$h@yV8wE@aBtm%>jt#X5</q#h&>e8$^hqK$YC6?L=IWZ/9Qj6\C/?&$B@#lA
Ih&w?X C8+=Vk/amkQ\huWH/ePAY$LA:ip#@&<kqeV&Td6jJnBTjR/qD*nJ*#BqC?CN?8e#+!&@jQd$MYL:i%9:
SId9%w >+?9+PC1ElXqaq9Xk/FkW+ICq@y/iVndV=6pbtVAkN9M!yySQF/?T=id4$LFk>Em/Rk!LLkqS@1^TFIC
9K+=J? pEh8QB5d#=$:i:cl94/868F<E+H*k$iQJW?wy>R##l>+@!V\Hwn\Jke/8jq+VNyP+wF?teF*hXWqJbI4
1Ac$j\ !+w!+14%HnFq999Ekj&MQDaFd?@e1dM4lPuV8y<AQQJwXFyM+Hd5DDGItXmL9nwb+*+B^:l@bE:$q$<j
WQ^PMX 64de9HFNeuZI6S8M4WEbB9kG*@nuj@F>6pbWmu%d#wnQKPLbD8=AS+=5d6+yKq@>>D<bV8jQ+u!uTm\M
ZXAw/$ 6F?+dq@etj4ti/**Ywdi8NSaJ!4JQ=pch!\<NHnD/wDqP/N#c=yd#y$/8ut^k:tBAJRNH4?uBbRBT>Al
hLRFVN GGBwN6WBMB&$TVy#A^8KA1cVV^cW+:8KZwDY9bdt1=jPX?MlHlG/Nenj$*/!tSGm?1iAN8D$WYD#?BwA
Xnd&1u dE$NheA$Ju/1Db#\TcB8QGQly5n<^49ZK$<i&^HwbYhq*GHa#<l$p8%5q@tLA>eDwnQQmJmIcXp&I6y=
dMIFhp mptLRA+k\EC/dlj>k?+AEN?q&Si5?kSt%5AyejXTibj\p$lBiP=ed5$L:PHcX\ykV\>Zb!j5nwe*5p=#
E%a8!L MC4MXK%V:k4E9@WeMb>yQQjQNL1nJQ4b4W=cu:^/>@pHmTac6Ep%!pjtpCaId99&+iYnq86N>YSAX$#p
@4pw/y kV*Bt>a\CHcaaY%8bQAhEY^mnpQ:HPc/#9Ni:B<+FPQ@P$JIR<jnJQe^He=uI68QpmVw$<Wa4=be+J<H
8YQtj* FAPGRXQiIQl>&9YMip/@aPN>E<tqIjAhVPA4Qb:@iLA+yik!THa<u/54K<RmXkZ*&AV?8PuVBL%HVX<G
QkZNKB b^Y%uRY@LJlY\*lGT^EeubK<QtDDdnI^+mBtpyK<:C4RJK%Q*?J$Q#mlu#%19ZQ#^6Y4%BZ//qAt=anJ
hS/j/I PjyjCN?:idZydE%FYZESXhlb1FmA6>6=iXR8uheDp*4QuMHphd#5A\^jdLy\Dl5nX\k+Jnai!+Mn$55c
:PH<kX 4>//&>wZ9le#&Dw*I@FESNm84d8P=>ZhdKuQPdLS&>a$R<ACn+qqJAe+N1AEKwctp?*hjbc6&d^LE11^
*X:=9j q^u:EZpmKi6$GduqB@#&^E=@q!:W+/pejZDZ^pA@N>6JiDF5aQBXwG4RW%cJ#hjWklQ=Le+w+@cTGcH*
RjDN<j ScBl:lm\K::<&6*#laql+I%ct^kcm5Fb/\8m^&:89EW4%8<Kn<$51CD+QX8iE^8&eatLniphkSKYA^kd
JRCaXb CBDBb*jSQ?q&B5G@mncaD*LeZu##:9tKhmFhITP1?CtmK^T1/1<YZJBk1ekAktM9V*iZ8a+P&D$Lb=!R
ART:!& 1#=QMm9C*X*mJ8?PtR*i=Kd4d&lGt9CdllW@JDaDl@H4D%<bAa9nN@FA@5we!P<?j&>9?@d?^ePY1^ia
>jCI%X icj@^dH6bA6nk&<C&yB4k4*^MSa#j/FjAME^phdTyId$VAJpDMlEMdXabXZkD%GZ1Ccbm^iwSnaDa$!h
QkduXF j@Gm/!Z%TkY9VV>@JY$QAMXpI8k*JtD@+n<1A&B<FtFeJc/W1c4tq8&hy/jS5<<AE/@Nt#b9pY!%&kbH
H:SW<l %W++1WlZ8RNMl+WVMjEy8Z5DhtI4>kNMmuy8Ib^kX&+>iQ:?G@#AeA\@iaBA8CK=NP4!qc9Zt%6IQPdJ
m/qcI! 5%h9*9<B<SeC+q9aF:K!4KT+8KmIK1KLFW8KC\6Be*Vt!=+?W!AyXC@/p/DWhIqypA<kN4S!>F$Zin^H
m>h6/: XN>+?WajwMm>Fmcn<*SPcu#$+bn<?q8*cnMQ4ji!Me+R!BmcW8a5M>yW#RT4%W!6:h%<q8MN%mF^8BwY
cW4NkY w^!NTe4KB^yi9HadIK^>>>cN1$*u#%cZa6PSjeF4q@q$K+59A6Z^k*5yK1n\NeGHjej6+5l!6Eh>E&kc
iZ:eq! VHRLPyBb%*K#P8ja>8Wi$<$A<GLBRE^%6yk/$<uDh<YG@$I+Lt#VWqedW+N:AtZMMDI*NTRk94CL@pZ@
4In^^? ytLw&:SK!*E:Za6=Tch1Kn1FmqYuh&:K1K#+LXK1EIp1//+YN!GK?^MR#*N*kdN+y8*$cVdVMGHDpW^Z
1KmE$\ ICAYT$G<kLt8JYN%%&*cT6LDtGGiiCKiddy&t%R9+>%@N+:@CI9QcFujQZ>\?&ynLjbyV!Ia*lm$a1tQ
R#jdCL q@6eB>5yq5cGZ\X1^D&ePwPICS?@bT8HEKY<b^@VMTRyNjMpAVFJua<l=^+Yma19$qi+q=8cLq!<\nVh
qBlTGe jjcm/=ZpNj%GlRH\D*IPD?1iB+$HMaaTH#@<K!RaCNhT%ZRXXe&1uX%Zj!=n\$T?S5@bAb5*dh\EPN/!
n%6SE^ dihcJ+e%i<lbjAB#$+=F^<RtJGWWHX&^e>ii9hI/m:^Cai*=1/AqQ9*5?QYXuMR6#hi8mJ8GZ<IPDFnu
D9:uhw DBl?nln?<kjDd^HD%:A6a*qyKXXCqWlK=a9^elq#:BV^DC+5K1bK?Hm*S4L5\Je>*%BVWTwT5E&ui\S5
^<p/4B PSmjX!T548@hiPpG\VEPtlaX==>M!&<APKYHBZqMMe\RKB1aVy+/heyp94YXlbty5jHEYc+?!>eHl^/K
\iD@@H yKLE$b#nJ&KVAeJa9uaLIK^#=?d%K$*kMeM^uH\<jQjt%W8>bp<^J\HFD\LqERPXbPZaZDXiB@mA!51e
Dm6RYX *\BpPR=djiS*EMe&C#ajQhQW&qTcHLdib:cXpcFBy&AATHQ#!dcPHw5CN+aen5514G!<kVkY=kKP@h&t
%h@ZTC t^1$M9P=4CcbMWC?8a9?VXPWSCIGMN?pXb/YLSk*XG>hWcYIEm1LlKiDnad=qqT%mbTFqjWNXZt=bVeI
udCp&a ulHPHt:PV9c#dHEi\yTytIHp+PV5=pFcCL1JZiZhEM>i=L4X%&<yej?p&T@H<aKj*KTj9>!M^eh@5lh@
mm6cjn @kQy4\Du4??i*d>FY5np@aZ#EwD#HQ5bW!^NDL<RPF9?$ebLq1<!ZW8$<Z=!daSXeW\ny&VA<+u+XHC$
5X^yVt lNWNF/:icG/?kXMM4%/?hQu/VeA#&P*Z:Y?yh<yTNGM1\dA@+<&@auaN<j5ihEe/RBknu864c&1wc4tc
DD#EPX &4y/Lp=&8%J/\uG\Xm?dwA*W^wtdNt+P6FBRulReTwaHEY$SHb8Tu4VZj*Fk<A=$V$t!/cpmWh*FG@hA
eMD&n> Y9^8@@GbHM1*4q?>hJG/MPImAQGcFNJQu:>/?\?pQ\KpY$pZ^CylYSqXTyW1q?FXGN+Rh^dKFlYZmE8X
%Il8LN lE\P*YZ115LqC&jlAAe+G%w=iK@cEW:5W/?!!44@IL4$dE6#Xi1?XY:Yl8pCSYN4i&^Py#F#lw&%ySqy
5GVmTb TL%??>:\/QnESEpCqcmcBK<wmYViBDV*d4q=@jLF^94c16L<#QmnaV9YB!:&tEXmG\aAb>yAae\IdStY
!CGnt^ pwRu+eyn5yHmd&aA1y#tkGGn9k9WVi#<h5aLt%5c<w@9Y8Fla&yw$IGRNnT#uwGR*4V:TQ^JKcVQCjQm
cC@#*\ \#aH8M<\M:\QikY>@/p&q5dhtG+DVHhJJIDyG:Vty!i:*Z9:=?I$yiKa#a9h:V%QXZeCw564#6Zq=>jh
idNpFD ^!ElQSDR4uNu&!Pi5epbTc1#h=#4TuuI8L6S4yTLAqNtNN@#4>P*=6@S=%q=b@/$AZ9/+6X4LK:+%P%m
Rij/9G EeH^m!C/>ibq5FpFPTDpGER9>@Pb:?bpN*$!IQ4#H$R:#HH%YLBw/a4X\<ARdGe8jE/RMy=eVKnCI#wi
\?18\5 hCpyl5X?tdiyY&w+T@Dc%Y5*Y%4^@H9>:9h:=R?j@l>+Jn*JMHJHY1ZjbJR!A9we8w6W4V\Y5=:dm9$/
T@5n*p 46>5ccwN58NcLq8#j8Pt6b/GY54cBl9&aAN^A8na=MVhT^d:d!RD^*dnLZFeTtb?eWW>cPXu:+nKAQpA
Vb*TqM B@VX!^jQa+$XA?mY@\C/:T?k5jMSmAilyJ\8y+W$PDZph4i4YKGp6LT54J\T<m6IZ6#q1>i8Z:>!ER>$
RIm&BW wWDXbK4#wnY:eMbwWp@$N4HG?>y6St<$*dqSpS\c/GJqpA=K%M1iNDqXh*b!tDX><uVule9Z:>kjeTIy
Hm<NAP M/5>e$V&cSKXcka6D@@!G1K=ypyWtJN/+uDw%nWBQm+#4BmS@FHABy@M!6byt1GmQIhL<bT+HG^:15ly
QQQlE/ =!y!&Ky54WEnYPP?CQltVm9&yhi%NFhplt>c:AnHhH5*yJ*t?c*e9CemId8\/9!NXwC$/FV<ke$BH4dt
a?hFY& lk?aQqNVy5<EWY+kFS#6kPpPCRYa9pc4T?lVS\>6PutlJt@@^5*4q/*K4BTLqIRkPM4##6*HaY6>jZB?
=:InQq uMP5GVbV4dHXLJMcDYi$C?qC*8pm:+cK\>lVKy5DmG#i6yQMD?98F\:mFWPYD^<#mS\p^?>LN=\G@Q4!
%XejpC >qq4</YGTqB#cauHI<J&k*P>#G?ly/9V4GuYAPbQWnBQt#q:4l5/jm8CS8CqjklV&+E%P*ua6jIpI#lT
^@EmM$ 5@M^/j:T>h9M5C#8LWAth1hp54#Eu:w?K9%F5!Ln<*&u99ZG+=u^?@=i%TCe##iidim1q&5+%*llN6bp
%P&kLM *!IH@b9EQd+#jLh8Zn=nbC?6kSPDhlE5H#\TuZb\<cIq/>c8ZaiV%La#8hEyYjpqqYe9**4\<8PQnq>j
::4e%u *4>/?lDPbyAGp5cl=:HR?^<wj@kZ!m<IqM@ZX*iJKJF!STW&Wmp9K?51ye6p!wWTpZwF!iEB\RK&CChK
nIt5J& XTGMDe%6*j#Yp89hHyFa/=+Hkl*E\p*+J9i8m^L*LJ>nATmYM#C*>cAY!jk5%AVZ!Nq^%y\F!>d9DMP$
nD^EQV ^#MFb$CVD?:&iRmP\hED4:JTCMh!a6TBZb6YLjGca<Mw=W@k%LBNJ#58CN\Y9u:=THWi^XXp1*I+Km45
Z+wu8n D1+TS$X6$Gk>kiCLRN*A!t%N?KpL4W*FmcG4=<?A5:pd!LbPuu/4NwhGJ8aWXb>9JpDPV#m\bht<YbaI
QA:<8: bCNVK#DQnk=VRDwDpK@5wn5B!G$E!JjwH4hQu!k8K+k>8H@*%l&=iD>ZYh6Wp*91m4kbRN\dMY^9P&$1
BjZ#G< huG%MMiya>bVy5GnPd8=8dc:!L5mlGqQ>@tM=+imiiNYHB*JnHp<TY+&+HT<j898@ReQH#%?k8Z+4>@?
eKVndJ PbebBDMnZMEjPSIYk8ElQ?>=Lw/&NyQMnR$@MkmiQG*YdGh*9E$JDPK6@#8hEuN&1Z!NW:p=J#M#WqPa
!Eycq% 6/5B&>qS>?qYNb!$h@5tA?C*RB*1T@6ulY:<nyjm>>8*4%?bFyFEZ^C>nABGu?><I$d\TF8B<^e9DeiD
8:qkhJ <!/&HZ@:<e8Q!/p?jkELHa*/>lk#a^*PDRw:EuN$1<@CNWFB%GyHMpYV*MWTDJhYu!PC?SjSF+@9I!dk
$=S\:L 6Cj6CkmIRYA<jASY/*>A@Bl:X1IM41BE4AwqkHFXNapF$ulA\@E5C=?m19maiaQc??dN=t6+jk9LBTyG
p=@=RL qnQh@akdw\N?DKphP$pI*uV61nAlJMDSQFYkdD4NheqKHQiklZQ:QF!<A6d9QHA5IVP@SIl$wW4yE1ZT
B:8TH/ <1y/^DLX&yME*e:Yp>#I*NVamH&py#<ntTtD4?DkATJ6uH&DhpYtFb<4n4ad11c5RuFyXSbH#FZk5Dp/
-AHpQN 00009ec406b001202b3 Page 163 of binaries1.zip
5$G@ZC \@VEAGi?kdZZy1nm1*jP=ph9D*C&NnL<DWVwc&=6P<h4!i16i+<t=SSZZ$A\N\KaD&=h:tqucjRR@FpA
Hl$HMB <!#H8T=#yy5VNF@eSZeBtu>JcED#SX4#@iY$yNVC?INlS+yEXVXZKp/j99RGb=j*>HB^6J6lM*tTyRZ&
iX^hJy IkbQE5=nPI=uk:=\wb*y8bT#AlpDMW</*q51tVh5@8<A+VLy&JMY$mmR*F\@q!L/<>jQd=@iA#CLmp>q
IwuQMW aqZ*@q*d%1<KYLRA+^hV4E!NRIKykXY^tn^>q1MLE:<IG5LEL:44/p+XaH\X?\luyKYCLTS%juejTl/y
BujdnM +jT:i*hcYl<CSnB\*QY6/!9>Va/Ben@WN6%R@p^e9^j@ayt/wuCy/RJaj?we*TlQn5%leLDji@D+&c6*
tZAI/j u::?AyF\J*?#n:N%9>=Ge#jD<+uc6>ZZd\XPucJY$IEP1\m6h&N4#bTVy$84G/@iijLtc%5:I!%8a^Vk
=qCP?: *Fu5WHABW%%c:pm#=EtA?^jB<6hQDJc9ZGmw4bJW51ya+IQT6ZT%ZFXqSWYZTA/SLcqY4<HeAQAPd6%8
!@m1Fl 8ZZ>M1cjqAtWnc%t8uw6ZLRpRJ6eyi:iB/hLauyPRctwLH/Z@&!#XIG<pjZe^Y8y#VId%?88YdXm1i<C
5XYd+B kQHB/KV5R9Aa/&1RMyXWlRJydN=C6jb1IaEL9J59LV1hqSRh9tj4ttW?H9dYtE5mMjk8GA!PuKY6?>L%
@p^dNW whFb=Sj9*KyQ&YR*SE&S#iY!PX\8S+Y6NYLelE+E51GNV*C</Nc6/1#DG**6#R$Njk9/G^ybVJ:q:PWj
*qGXG& 6G*j5iTeEkLpG+$Xy^MPdX9lbV@S?JGAc&lmcYQu=P4l/V4V$pkcqlMDpu<TJJ?uiY$QClLne$+eL\Zj
%4jEF! 6PDcl<5Aa4d#:JuVyp!!JE&$KEPipatb=TR<ny%\PP6e!S^/4kKyXjck=:q+iuu>I=JSGS+la*d?nwi:
@#Mm6$ StwcY5mMPAD!W?bwj9Q$*w&L>cKm9A!5Wh&*c!6mGB&?/ckw*mGE#c!tVMiL99p?*SD?E?!DS<iiu&j!
a?MS>I +WnP!pVHCu8A*ZqA=5@^H#<CVLcT99JM4kj%k@+8@md@uaF^*:<\@pJ8cyl5*+jM:jb%/my>SR%W^aZ#
\nA=uW =^9Qa/<AELI*l5L^@8AJ/dtIKZ@9Z#//hnyp*1nS%l=d>wS5>X8&hlQy+!j^u^&\dMXKyw!YkZFb#ju4
tnKbqq >%Al@@:/+hY#l*h9w6w<m$%ptJbkLZkdCVDG>Nt9DI^@TGHejPZm&h18c1X1hD9BA<YRCwKc16cy1TW>
/6<ZI# 4SpR\&6:?<aXen<wWDK&uGE@i+/L8=duA6<q!%a^LVanV!Tp^8=eat?cC64De4bQ$K=RHGbnlXuVK\K\
Qd1b&8 A*%KdppFpPLCiSKH4/?4P*9lCybWwKLH!EY%1L!p<E^iP9l:8#c6>9h&uVtJAjFQ\TA+nE$t&Zp8&^\Y
5R&qwn t%6^?i/N/5#\nh=VBWM%Xhl5LwinQt1<jl6kYM%w=yLh1dW6%<yV>kjNu&aCb#EGMm!u&4q+B/\JDw6P
awRwbl #T868TnFePKl+EC9&hatn\W<A&MLG:8=:tD:=>qQMpaRq??mAd@WD^AZ5jR=Y1Z4/:t+#DJSWj*um+Bj
ipt/da bRhdG&54C%Nnam\+lwljeLV5uJ#u#8q!w8ewpQFXH1:TV8<aTmdtc@6j9ay%CcBRGpC+acH^hb#mDte^
GPR^Zh p=H\:QpV\C:\JVe><Znp\hCht>i6>QjFadR&iJQ*Xwyh9KVG$B6k%&\>$/9mGMtZ!m<ES\in1uACu<\y
u8tG&h \B\I$y96%c8ZL%<<^&q\D=<khD?V4D*JL@1u=Iee=m6JP94>m>#QVA4JM=DDW8lip%!X8*!y1Wq!pY=T
/1ZDH% 8ITB*66D:!AS*u#+@Q%*?/<9:=+@dLq/98yW!LSbc:h6ZLF6==aNRbkM/We6Gwd>=%iRDtN:D=EK4@Lc
m^FWYc C#hcu:@@V9V\p@8M9t!k/weS=F:Ht^C5$u6JYMbW^BHpp1%N=?wA4nY5Ynbmq:ti4KuyImGWPpt>?6u#
T$+dC9 q:A^GBw+*I$>yRYKStbE?Guc&wEnRT#ZGqIl95QQ#nSFwGw/$&9q>uAe@uDAc9?iuX9Z4>6^<Hl1jqp%
T!P?K* ?IApX6NEYN6$6SqdIN+l\K&6\q1:M@ubKVFH>t%jH?nu=YI:$eSIA5l6I<LY!G\K1PLk<MV<t86*4\lV
e^bbu$ \6dM6<GW:*=5FVbj:\jm%6l?&j/Vnjicm8JCX4kRDVERuWIdi#ijbi6&HDmii11$Fw9ldnSYuppMD%:y
X<bWB6 :VVb%PCJkGhpQ5X845eCZ:<qC=!ttCJ\C*jSNAD*G\F8A/$k?h4ciQ9*iRC6m8*WTbct^8l#mkY1JLqu
W\AX$@ Imd*#KGeKEjKTZHPZKIdcI<=<@=HN*V*ICVCwRR9tB1bNlCpC\StFVBH:>*4mNte6IVw\&F:6t>iG:nW
ijiEci b::LdJRMl1?:IT8NFki5ZGNCmycJw$&8Xwl:Zq^aeQyWDu4>yH9Jm:j9*4=>R+c^QWZEp4Tl*%R:*Wd@
SwL58V :9wqk=Fm>l@^C+CqQ9H@cwc:DGLFX&W8Z=I$KVNQFnDq$C%<&>y@ju1LeeHG/4KC:JnRhb9&:A:i9G:X
<M5Xe\ Cu@5HPcNSc@MZIk6P$IQSnKAdY1?@?Ln#+/ju><SGRAAPC6l<H4%?y>tAbld<Si9:%+?8W?kWp@X$uY5
uyNMqL i4yiAS^JPATyi4yPW581w?ybDbK#T5!a+D6*1XdFP#i9Nb&4FSXnb\@5ucJlct+=cc16ujVij6Xc9%pt
X8@b1K KRK&5a*:5t*l<atJ<dHSja<iQlC/e@9BE?quSHZk=>$l\:pbB+AWJ@T>i^PjA<K%8QD$1X\!wtDd&lYL
#NMDcS =<?hdtXm%GuIM8kR$Ac$wbc^=ZRZ*/ChpctFDe%*LldH:\q$5#d5E5lM$Q?GaDX%Yupw9?q8a*=$<BJH
>?w%cQ T>RJAFcVThNti@m8YL@4$Iu$@DIyYK5KE5P*4%4wNNWWEC%ncIB89Ku%#Lu#AADLq@8+VDM%AMmt:1Jb
+RY?Mb VESC*EXk8\9R1nlqw4tJIj1G16KWHF5HJ<i8&e1pGBm%Ai$^CI>ZSl85bP/BMbPB#KRkTMX4JEu>KNS#
WcnMJX =!<$+WF:uaD%?wXcIeA$Qmy<Z\kVB@b$ebl8dYF5<I4AhPKW9=ecc\h9*Qc*48%$5ZVTaGqS+iu<\uLW
6ZX6/y BQei9ZlLjiS@iQ@8HTD%?R8\+Nmbwd&4k&/uAKh@Wj4>L$ySEuTuhJP*TZ!N951/Rq&t4!lhJZpM4R?G
:T%AG% QCKm>th:&@hQ4=?$Nq</Y%X/Pn5%Lmy<j<m&nZmh/i96=WuNt+Q#CBa6kii/KZkQp%$k4G8/?RCh6P?j
\imHqT !HZF>T8ad+4HJEdmd6#1nnV<H/A?8ENAAm<d1$GXPHYM=>lXV#jIun%*V6Kwj9EKe#N!@\EGq#HTt!>R
IAmXjT b*wRtmFI<cYdQ^Qk!VGePGjJ=kQ^8TClM6N+TdHkFl<+pXFa$ZAJ:L/pqd/uhLjq>1%tpk#hD&RLjPPc
YR^I\T TqEywnMuP!*8/IFht+PY?e=#\pLnDpQckBJRAE>6I%N4P+<q/*bHbbbm9eLy+#5CuC#BKAI$#X#YSBSi
>jh9+w dcuQmhnpM<6WCp%VnJA6D6\aEl/dpX>i%*V4D#SZ?<!%MVN5S=bl\@!jAycB^FDN^My&#n!jye6ZB1*&
D\FtQn e:e%S+lGlhA5mkcIhkFEcTqE=T^NnR^@an>pE*IQ=8Ak5cehqJpENqh*h<yn!L^@+\uM=SnyAp/cayPp
pMXPGd <<w1EF9DWH+%uCWh@<CwZkX<F8VkG:$ZVND1bZ:iH5:&tJ@&+4@\ZLJ<%d4B^P=*q:GWXcKHkGQ>TkwL
:MEw6e Tm5dTM:$t+@WF:ZQu=mEIaLPZ&*69#8whuGHQDp<1Y>!&N6Qkweubw!TcdGp?Q$GhX$Yn6C81<y+#JNC
9hLM14 !eHQAbVj5I46\/9Hh&?RdI&5=Nmnl@d8*ALQhat9>*\QN+tLG=tHk+G/DeFaPamk4G?/>inX=>@wdVE!
KDC?A: >WJn@S>RhpePTCRZRhu?L!m9ZVwQB4+B1E\*K5C4BFcac1VQWYjlX/QM?R9WSZZtIVA/\<#H1K9IF*VB
ZATD4# kcbM=NuE!XPNp\WeM*8j>j6mV&G^aHEB@%SYc6!^+^tFXa%Zd=N&?X$AT1c+wV>?#$aT/!w1!D?Xe#I#
<Jc^1S PTbm@+/N1\N<QB\SpP%k*!pAI:k@Vq+BG@ii!Ba%*dqbq^P=hdG>&Y5AI<@CdZ%WcjQ6/5^D/:!tt^n?
1ZI#S1 E6CG@e$u#=\:*&@X=n%H+nJQC?59ISdQX^epHh+S6Mlq84qSJ:HMJ8kZ\iHZ^b#H&HjT^MLG$eMHc=p&
KFJ+d! 4A@\6LM$yAW5tmZnwP!k#MKQX#J*YP1!NAhPW9ndDPt9:1@kS/4Mh=cP!YSd?:?ju:+tdLZ@Gh>qLBtY
w1\$P! /y?>Md98@ijj5j:#iM1\X=u%:+j6=nZ\P\*@p\?YDQ=?=RyLF6jaYJae4p8Y5PS^FRlaCtRZm/YI8?BQ
yYl<S8 T4nCjtXead<K44BjFXja#!cQ^tJ^<NFkQ^hZ?A\QX>m9lm95=?MK?>ZJh&Y^NQC:\u=NZGG@F1:\FY%e
bSjbLH ad<P44Bjq#\:F15HQn9a*^NZ&N<LX>njG%ja$RhZ&N?Z@BR5Xn?c@M!5@4nC@kG+\9/B8ML?RdnC#5Hp
ykdEY! y&Y^l8BQC*<imm95H+a4:B?PK?\jkT95H$qiFSb4FL+1<KjSX<kHc\#?D99H+k4:^?EK?@ZIX%t5<jlX
C9&pT: &D<BX@mMQ1/\Z+A4:DjAFjadpphl5a#\WYC@Mc/\*\SZ?Iwy44DjDFjad$/?G+6qkh<N>q9mC986eIZ>
<u&ube E*GFHbN\lj*Y=Ft^YJQ^YeH?KdnC4/t+\u+dZGH@NF^l=*V!:AFj?P^l9!&8<Ltb8ML?YdnCjn6ead<>
nm^P4N ?TqbLAj<KiFQ5*GF@a/+\u+uZGH@HF^l@%#!c4Ba#9l1\H+ZZPE#44Hpk?YG9<N?h%^l9\j=LI5%D#<L
SQC5=? ?#%^lj*#eaY9iPEK?^jkC98>!d>t5Sdm9+d>Q4nCjq>eaj<mZGHHaq^l9^@=L9AT+HiB@W6^lj*?8MK9
PGaYXE AF^l@#Jeaih!<t^a4BZ+dGB@IK/\j!Y8<LXX8ML?%dnC@mD!4Ft5Njm5+W>4eaZ>/*CF@i6^lj$deIZ>
^iW$F$ G<qQ^&J6\y<P>t@GFV/#BXja9^XZ&L<NX>kjVF+FFt5:9k1\j\i85H<u49CXZW9IB!5Ej+j>8<ujYK\>
N^6F>4 ?DjaH+w4:N?LK?#jl!95&I<4:A<n@+4FPwD@C9aj^BZ&H<IX>wjnC4<P+\w:n=BHb:Em<NFlj!T85Q<w
<e6AK! 44D@GK/\J\yZ&B>NukYLhS!jBj#yBK/\Q$bAtMIm:^:5n<MX>5iVb<6mJiC#lj&J8MJupuCF@et+\9+W
uIyMd: ZGF@K9tyYK\$@Kqkj#185D<DX@lKJ1/\Q\6Z&H?T@QR5Xnd?>LA@B%jau+54:M@DFZceEyAQXn:=ueW/
S/PaCe nd@D@nP+\9+CZGF@Ic/\9\lZ?FXMh4NaJe\J#T4FFjcZ+R4:!*GF@WJeac?IQC1LXaGQCu?1^BZ&X?EK
RP4whu ?/6^lj$%8ML?Y9LhYc\/@P/\9^=Z?E\D44D@LK/\@^!85L?SQE5Y/#\?T>l@AXjaj^FZ?EwV44D@E1/\
4caE1I @#L=ciCd+E<D?/@mC989+R4:4?MKP&:kC98d!W@Na6*EH^4&*<IX>6@GFjc*+A4:mZYDuZe@j!c9#:%H
/XWjWa n<ncYqqJ%98=8YS>5H<@YS>8*EnYS!+8bH$<hTybu\\cSNcu/8ypjebmpWh<Dq9^EX?\YPRSZ:Ja=BFj
Ci>4tX 5XnpEX?#YPRS*:Ba=BHj5qnpEh?^YPRS*:Na=BE@+IQCI*+p*@\S/^P8<InpYeMnj5EXH9E449CI**CF
-A$I$1 000fdc56401001202b3 Page 164 of binaries1.zip
Y<wheD S@!PK##mD%#lEZ@mCw@+/#Q=aQ%?SD=adbZpk>YiT#=aHj9JB/6#I@qkhdtRD=b+K9qkTRcSD^cqVn=a
F\YPHC >D>cwF5#MC56$bHl/*#p!/n!Ki#u1T!4LMEt#JT5w4I5@p&YW8*pK?n\#ZVMhJ/beiF*A@\L*+!9\>j=
anm5HC nj?8u!4@@?h@*@uKP4nbAQ=6y^p%/j?n/%?<&$m#@EA\Ak<mAPwSqJSRQqmbK6bLJXJTh!4R:k:aa&Bt
KmJM5@ N:QHc+<jNbTI>Clm%w&kY$!:ddhh49HcNbpm^#bC8!:6th*MM>I=e$/8#mSd+mHPutQ>Ji&b/pyT+1Nj
Dj!Nph %cY5!4iIb<RZi*@*jlEA5:$CTIIWCTD8h:@j@h*:*ajbd9VcS9Sul>dnwP:Z@cDhWG/?Tp<a&&M<+bDi
#9c!>8 TJXjP/jjR@4a#D$%#?VM1b@T#eyd+:JbKZ>SMe8X1J!Wm@IjI$#a6HJ^iXDJ+**<k6<H*wXd:dqtk>+K
J5!F*L McHjKjCdi&+d%SFiHE$je*u/M*PtqC8b>BHuDC81^Qa5L6qqRdnXZ:w9<FiHd!IR*KynP+?4Zpk9@@?j
Q@BQVV XPk?59HKh9wW@M!^P>N&G&&/Dh4j?R<Hl*S:^4hDjZ8Yjn+<CN%t9i/*a>i$*elY>w^?^cn!enqj#1jm
\ykWih w#89K\pD6!@MjMp$T&QVPFLt!$etLlE@u<m$uC6d>Qe^TdTI5V?XmmwdiXW8<9?Ya4NeM9Hd>D9qeeZm
DQak#/ c<H6W*88c6Qq$DYJLHBBjShCn1BqS/tMwYtJbidwVbSSYb+4=ikFXYX5q:Rp:Nk6X$ZT4q5h8AaJJw>9
^F^n5l XNYm@^Z6/>5=i6YpMy>J>D>*i&:QPm^u$iG^t#V!pP>Si?dj^^DnM*XkQB5i91RFjjD5WB*5i*Y9Zk@\
&#MtkP B@TP%ER9V?cQ/cZKpdLlCyR=i&TtN:M$NI%TbPd^WNF&K1qeay&aW61!Fbj#JNu!y=W<SJ!WZ<mZ5W1q
DbID/C uMqQRP6lpZnLR>HhdHHyep//Nt5MK\\pbXTHEQI@T/y=&bV$A%HqF?pyelciMciXGi<epw46p%Xdm<TX
P99Q1^ HVGnBc:ee%B54ILD1<l1:>DTRdM4CW5/Fc?1GQTS+$eVVSndiI6&8muwl1eq\Z5piNW&CABK@=H%8W9T
6*c:qJ j*Ym%+eHYAFcFD?w$\4+u85AFyShTq<\45!!dtMFVC#ATW9EB8W8tWeD$88IyD<!e:RW5ZpYX=:LqTd/
1nqT>6 Ve16!kYTdcZew*h@SK81!mYLu>PpXXP=A8&AetFWthE:?Be5Kb8*8/5qNwdI%@J$pT^\NhF6XW+IQR^c
BqEtNV iC\t*T$44yla\*P<$jEyi!KY9CZjpKSX6WmTw#8id!#Qb\CV:JetkCIjE&k=5p>WYeZ%Y+9hWkPCd4ed
+*+&jT #\qwS+j=:4NuB+w$@JCS=JpGqaPAJE^myqiP:Fl\c$S9@>\Ei@WDEt%8dM=w@i+#kyCWZ!TXk9Jdb4an
iualw9 TN*!XyqAh<lKEjQujtW5T/dMCmp*@^:JQ&LhTaZ<8c**KCMA/:h5iq\R!jyjJhWeCX6AyMBZQ+WnBWa^
XiK%l6 ShdKlQyXSMaPJDJ$9%HN%B!juCuqFl#ly>NcLJ@QcT$@y8!XwZ&K%p@&k=mTTA\c!bu$?8JQqNbp4e:<
iqpT6@ HRTP:>Xl+ANXQQ4n&E/\w&$S?SSc1%\q%Y%eD!u#pGGElC:/@ILwM%at%YhTXkJ45wAS/<yE:mMCS/85
ea#TQj 6+5%Np55?ZKBj4GWZlIyY8WL&/B*hC4FZ6hqm^c:SRnMMM^@T?5EAH?iKtXMYqKAZyAJMWn/?XIP\?Em
=&>91< ?!^A^dEFNl%6A5aM*:SH?Aqb!!&BMF1Ckb%k!VTAV&TP^cZ@tkA=quZGaR6PV#Cn>/J!b^w81@wZyP41
+4Lid\ MDpwCwnHl\XiB*YRw&@Xadud4pQdjdw\W9cm9A^c>y@Q5!^#qytmM>VhBBTWNJ:Vbbd\Bdi^YcYqaW^J
M<8$S/ 6V+QRM>d9Aa^4$G/DqmS1JK4kJnpkXQK6E1<A$n@B:n\tPT95QeA:c>w%ZekyTw41/8@$DL<G%+E5u15
DeBDX< 5+\NBc^61ajl!JdwjtSjh4AIiB/6<BP5$b>wlXu*Hb9SFiam+d&In/I5lh/a>L:W%^bBDIe6C+#XuYG?
hibybu $t=<&dad:j<RH\K@D:85?TV+e&JV/RPpJRVk$B%<Sc@B8AI\#yQ1G%cet>QKn\WRY\m<\bi^?SJd^1<J
%iI/IF u/$yIZ1iDGq=XDu#q/kAa#IydEpRHw8b=AyakQ^+5k>?be?L!RKmR+Q%T4k5QbL?B5V?Bi<AEXbMPJ?\
Liy/Cp 6TulVbt<Bad&m!tbe:Vk<hAXZV%Dn!bW5eyecRAY\:JQKuNVd%*jqX&iCH>A\ujpnhu/KR5N$EXT@pde
Dkd=&M @t:uQ$L$#\+#!5k<<XADWBL/Lkm*B@RSBAYqPT9\IN^A+N/$S8dbXPH%F8D9a9Md8FKVX<mc51lqbm8A
S<^&Nm wHQHmG>/J^MGil/ZC@V:JuFIhm@wV$ckDbpJIKC\GblBPIVnMPp4+yyyEh+YI=D8AY^jaKFmeB##t>K:
Vhnmty +K4YW5GkhDMA@F$<5!5jR5Cb5Qd$55w8PKFZItW=tb+M\L@EuYGY^Q49cj&HEelHJQCaWTetPHyB&%1&
taByP< CS<4MkE86wAT@eh6ZJpS:yiTGa8lmGpn1hi9YMZP\hAi<*9I#PananCu$niy8RFd5EyWthFYbY\YlW8K
j/++qy 8T*\4\H%Q:juYRuF:QIFbb9cked@n^C%cH^iyAB1A&J4pK#NZD+Ya@8mA$J8y\w9/1&y=GpBIEeAl#/W
=:&p9i dVyEN/!W!qR8XKbFuTu@%DhDY*MCcIct4KV%JQFj6uPhTMYHM/#k#\/m\&4tM6FZSewP6KE*q>Ed/H6b
lX*jKS C#u%Kp55cjw+e&V?yX5Mt5M?!pV4&WMmtTyB@Jeu<4euSp\iS5AJ/!T>&lGRm%/PeGicYy=Q*d@5K%<8
c6<bXm !j<jFnR>!YPSl1q*Tt?BKV%5L:&:GXye<Tc@ZiXqeCeA\c49Py4CX^ukcDFy9Rl&VL\=K=N:QJF=J9tB
Nei:P< Qc8Xk=>6+BcFXu:JeJN$9leL#jqD$ZA6?9VLIjAGkPQa=Rt1SVBcbTn:dIa*JNml1DwYAa/K!c8VMS^&
BWJlh= <DXW<QPMSIQE&^C>6FnVSd#FCdpSkyMnPSAB%\B9V?VNmy/p:GdIjldnLn*qtAYe:=pY1ZwQBqqeJ66N
9$SJiW HZ?lM<Aa:J=W<w#1BY%/BFXi5w<Jh5LieTtuHEEWdVQAh$E1Q!eyn$uKb9Rj%cH^LD:+^nN^@IXcy4=T
EjFGh? CB%j1Z8ynw<4eNb6h9w#G&ttKu+8k@XyJa@MF$15+!u%b/Nc#nT<tQHj4$W%tIYW!1C\>EeS6JFlQRLR
6$G8nt /BZ+qNE/b45K:<eY\V8C9TV@/#w+wQkZM+dJpMllCm\D/WMp$A+n<Y4&FE+claGGcm%*TQ/Gw#pTZC?>
\KGhVa ST9H/j!$q48bqm8JNpDQQ/MXmLAC&$whjQQ\Yje\M/9QSNQq5?@ZwPnP^K!iK\9KYF1VVicMj<yLaA8@
9Ie6lW thB*c$!/QV9NYeap6ylXCPwhy>!^BARl/SdG/a4<A8>h+l9+SPJ&mh!CAbJe@#t:y=B5V&R/I?GAppm%
5qB?=N DF<5#?A^6C>XHW*1^NY%ld9d&km#hFKBD%LVFXhTLV>=*CXX&49BM=?aCkR+4N6F4\Hy@1whh+^6hjlN
VwI@Q\ MJT8pMVDA^$FaEt4^+kB%P1?RR/^9BTp\Z/@qeY*S8cL$:GZchbCX*wYNHKCJuqLaq85%nNcB@wp:ml#
QZ#W+! !IT+1@JJ>uDAR#Xhu#CX#&!L>!^EH&YcT:#KMQ?t!V@Ce/cGe/LM^bJGduw@dD%:>t5yuYC^k@eIa45T
bqB#Kq u:HhIV%SZ>D/%YMiW8X4>lJ1e!wVhbZZd?RcnW@c#NDdudd1uQmQE9MTWlkjulcpQlCTVqmm/1bZK@qP
utbL8Q !p$RR5yuIXlYba+at1W@M?&@JNq^tVXVKAcme%@yHYGKTA6=^Flm5!klkEnVpb@#un+JVYaI^bW:EcT=
YG9M1= \4bQ?J:ESE:KBbib*JmqEe8W%metmb<S>%PdP>+YDntdDqN6ppuM#*PpKVX@TkANW^b:Gy?l9dPC#YJY
ZW%HGk a:hET<VK?\6T*8>E#Lh%&QBAHB>=JD@\9Xc>XT@YHREFw/DKy!VR^FALGBmcX116JJh9VKp^ZB&YiIaW
G:Rh>M ^Qh+T4T&&umDu:CWC*dK#!TAQ&PbYtZ#1Su<nEW5H%>C5u?F>QSL?tdAyInwyCXB1?LTnS89L%%V<1hH
1mQ1Y5 >njTjc>nMk:VR*iCPDpHMWhY>Kn!nRuqQ!dImc&dKCm:w^HlRWI\?$Y:\CR/J4tc&#E<?Y>pe5&<GXHV
YluebR Lm^i1\SmIW1cqJQ<1ZJ8E4jK#J%B*1NS?6I$e5w<qiy1H8RNIDCT8J^BMK4jj+ENYYRY?GBl4Lh<C5p:
>^$tYe EN#@KSE^$5Y\ew/bbPm\hqECCe4Mq=ce8dmih*!uyekWGc=muHlSR/uG&BS!!TmtY+X^Ict<eB^SW#Hm
@=J?Z6 *jd5Ttd+ZH6M65y6N@/mdYKDJ>8tI1?:KB++*P@MAVupH<BYiVQ%tte#H+bPEttT\JNwJRq9bBbaD$ht
5uK9=b 1ThEwSide<jQCiD!RaTbJTISbMEDpkV$ZJ#6QE+KS8!Z+P*@:!#FVQ&$&%W?R!4I+XLV9Fb#/*T4#cq/
%b@dK+ W59=K*ZqnP\CT!=t\5^M%>WM#6dt:*q1qqVq*Nh>CJaiaHtAaGq&k:ZuLR$u86<&P5M&Gj+GcYHWPdW6
#BX&+H :QcbDym1\#ub+mJPiBi68qX4%Xe$4%Zq$%AiMjw5TKKpPbamH:u$RRJwp=?a69$pRlLAlGL>icaFCua8
/=wEGK a8@NKp>WNYbdbXTiRwy@jWTQ^uydn#tTAJ@awPZp+!9#tlPVCE5pT&jP1e*F>ND#ZYli4G&PLYEI%$=>
>6l^t@ aYjISHlKGij6@<^yX9bq1M@*=Ql1mn9^q*F:y6Q8hLa:&#F^YHZ\$4Q5CP8bDyXKZMl6#hC:lPEbEcE5
m>5NlK qMY^=@MXWw8I++\=nn+d9RHJ5JRBa#p*I4NnCNZ:W+q6XCdutd!bTRMn5W!mk#@FlmiK>F?SGu:FBndl
EZy#X6 wB%+t%/@%&9R\jNP9XcQcnqu:pyem?5=*@PX?#KLVPIG5wNVn\LdPCNHCWnhejZ:$n:l&6tlCIEHNt?D
ypJnQ! VDRLK!K%P$GmE4ER&?RR\k\#@pMTH9t=l^@:>Z1ylW%eEik:A=/i$%GDuNltJTG#GMcFLRu&L$t9y@*e
YDXcJP >PkWum#HdSC=$S4+b*4yJaTAcI$!C^\+#t\:6G=QH$tSEJhHt8@$$^MRHWiqjc#1=X1h64Nhh&1&1q&+
W#jGb8 YuQwP+h8e!Vab6D$ZFi4INVS>TK@FHl?&@h5>$miDu^5:ynKcTR5yqG^W/t:c+6Smh&CnktZ<AY*1D*8
?EyeHJ GG^YZn/E!n%Lh@I#mhI@W$uw4^RJF&56X$\%8XF!^FR5+imb>K?aS5F\9tV$I9MWwtEbq<>dWES^jD+Z
HQC8@n +$DE&^d4EI5/pl&c\ipiI?Lp^C!TEQCj\/*qu=Ba@#a5!=AyC#9@YP!THBSeI%W5RIn%ai*X1:T^/!SM
NM^BcJ *J!/&*#nw=@6<kGF:dm8:>N9N846Pu$%A8ZucQ6Hp?M$yiNH1XSFT=@d=cy&yB#&l<b!#QGyN6JSi>T=
&E&JkH EA5c@8EW>hEuHlBy:BQW6Pkh4hk&HHVE1?LeDP>bPZ$ieYCLpbEE&l8dJ#NBq5W<e*lY%4l9q/wc=lZD
1hedZa p$ynWpu=BGLk+E#M$<hCZD/u!@nauy&wDRuW^$+@Tup?9cu#iLEde#A&XjLk=l\wce&=TwycJTYq9i?T
@eDuj5 56a@?1n^WeNnnCMy#nXh^JXwG>JZn?N=a#@9%X#!WSk8V$^yce1Dch@#$X>%m9aa4tdtnaa:l9Wih</K
-Aq=5Z 0009050d766001202b3 Page 165 of binaries1.zip
>w!uSW X8yVI/&k/6DTEbZRu/t=wJR4PDT1MDQu8GEiEc1lN64a+<>N8<RShP*Pm/WbVRR/aKM^w/PpR1%nqyi\
qERti\ c@1#GG%:4iNl<wqn>+pIN:Y!yN/G&S=4IBm^KRKR=@EGX</4ikp\RB>pk+\=XZ8^!9yc4=&uV+&Q*9mw
eYh9dR &TBe>EtecA8q/8hJ:m+4WL$tb\bc/51j<Z\tL!e4^\R>=Ni8XCX!:E^dw\bydptjWnDIJt&4e!mM<k@X
#*64K< \huDnB?^Y>Rq<4TB>:6CePDA+#^n=ZQ/mIkQ$8FqD6tJ#k9eG4&lPX9Kk8JqPR\ccj@tTPJw/Z%kS%Py
lPW<Z# J5T:Xe=M+:MT+cC@pA<FKW?jbJCW*^qN!Pe\*Rb^?R4J&adJ15NppiIT$nw%*P5C8MCGN^5j9hutELTY
DRnlH9 e^=!X4X#>He6jGk=8::LT^H:lnhLRylTb+VVVnu&XPmF$%dInLpeGy\XRR8umwmT&8S=hmSaAqLK^*Gu
^u=tCZ hQCEbZ%\GJaeY8XY4WcKjSwib>qK=V*Sc#B=IIW!V$P^Ve*q<i516W$XW8^#KTjM:ubX5klTVyPWb?tJ
!aKklT i>kkCAiM$4M8HDFPua5P:hNc?Bu4mdAA4VFH6dVLpGAZi5V%XT%Hcl9XZytD%EtRNTk*QYl?%Hn##RaC
nZ$Lj? GSBykTV8EKX+%W%B8?+!t5n^bFAQ&49N>8=8iVjaDh1$D1:#K=&/BL4@*PZ$FXFwQutI&$XR4HbH6c%a
CV<P4S AwMkC+1ei+tppJCJVMRHZe89$%9#mYZFqhq!SiR5J\<Jb/#pPBbapk\WuIActnFWNQNQTd<a8c@5$=PI
YF9$X> 15l<VLw6BElHbYPRl*\=^iY^Dk9aE<q1$jal&4iFw!NmqWbm+:K>M5j8RBW$6kcEnt6X@Kl&Htyi4VjI
&<N9Y! =u*W<EY?b^$SK=6HZku/Y#J?>HHT4RjNb9DG#p=#h&iujdK=$>l6+y9A>^#uE+CHt=+WSY+Mp@hF?\Vp
SVGAKm #Pw5Cy$nTWj6e+#W?6^BuIV8+/+/KHaQeM8HLejuD8kene%nu/6emSHCNHX&!meR1!p<#CLuZmhVcW?=
Sq*aHL uPw8#48Jt!I%SD#8eawimeWaDjqG^=#8?NkbcJ^FE+EWiZ\bR6n@akLZKiWnM*E6a1\G<JJKu=\DnNDn
:huSJ> ck$@JIj5w@utG&<&BYlah^$GHJI$\+/1=^\5A+F=9hqw:yC\G:8:DbL*:G/dSN*adVjjcP:ERiIeIcjP
>tTthT %Ye/A6iS!#TDbi/K$KHkStjWVk:kQ=\uPW5EF9JtYjPu46Y6p!@t6Y4i8HICyNdK/^nlTK9%ZByYaj\&
MQlTuq Bdk45kH$IVJlhpb!?%kBP%8BE@aET<m$bij9bRSeCl!iTdujtCuW/YPWqV/PTL4ER6/NiA8MYMq%jQD:
6t#@PD bYjF%cJ$wdtM*ZQMuG9RejyQAlGTP&q^wRaAGhcIANb1$G\uA1k$t\&%W*tDBL!:$>=6:LVQNZjc>Km=
c++XyD E>DZ^p/nCVklwe?AGPyAN>LlCpmkcD#H/V*hYPy8A!FcFu#eQ6qwh*Xm!#QPn18I*L5H6AC1c^!W8!HS
mG$N$8 Eu1#LeIX8!#=LHK!A*M=SNdQpe=4w/YweETYqDcZ=c*M/KntEG<8W*q<SMkX$iCTuWNK&pN5=m%PpT8q
:LQ/4c S!91c&yjuy#DIThnWMuu5RL4ERhSnNS/^wTEnuM?Jt?i?RcSqHH6DNcDkRRIVkBDaKH19?a\46S1aqDS
*yI*>Y kcVPK%VuDaFj*Htn?Wc\5:6DT:C#G?!aP:61=\!Yw4uVDHaCdAIAnlN^bF\m6VlSG1WJe5@dbjFcQFL@
mMFnYW YKI:k@a=4E=ZH@9AeD:GVZY6^:\Q/I=qwFYAFa$4y/Cc?kkI1MN8l#cnEwaA4M?Y5wN<VXp!L@uw&FJE
^hYc=/ %eyj%u=X4uBCBW\DV6$!emuud8iPlR4TlZmPA%HD@NhKH&><tkHVW158ME@!6GWL#MFb%Fl85&9#btP*
/nSL#H AaFLcIkAcF#DD1AQ?uwY$6>=e+h&AMEMTb>?ijhdnaB8EQ6c5IN>5NQE>tn5B8!J5?9wAH6GdlGcn\W+
ltQ%IX IR9A?PM&qJ#HDh6J\*Ld?\y\j^B*=$n!9An/K!%C=ZGZhwJDV1VukJQqEY1M&Ln&J?!eI/%^/n!tJ<yM
FlbVCD amcuby^%nh8u%RJ@uW1i=eBRH6\<R5LL6IT%@Pe1$\iPjP@Du<@uenn\nDZ\D!blH5hFyAkjB5u$6+Hq
VFyE5K e/u&p@9#=p/##uBEHlL6D\EwX@\nmhdXCb<I&h<kTRPCTPG^CZc?k$?:w9>6kmJcCqJ@5kQNwK$>j#G*
@Y!Yt# TBA45a%6I^bZpTZkVVBPX&cMH>QDpN*N1F9al@#ndl=LEHYVdu/DNkB=GNkBib*/^1p6CCHBDA\qLF!T
Cm1p^l JTmu?q?&IkH@\yT:!jjuACC6?&Q:dPakaX@^&SA$@<JWEpb&RtNQ?$jQPSMQ5TYT@#5SLiPu>pZ=lbX/
8MPXdE QeX?nw&\cJ&/Su/\>wb/<#jj&G%mR#BAkhVMyi^TIAnR<!dSVAmh>L<N<WQ:G<HFBw\BiE+djIhR1e$@
5tukbj J#9e*QW=q11#+tpVNHkN&k$J*TGjbWdIjKP9W+%mZkJcqW/Zh5Gw1@c6:n:hcCG//uHTQj&+G^LDyF66
4F=4AX =R1!^@Ybl#+ElieW/c$A8&u!ihBe!e!P@HXEKuZ?&XRYGQ>@BRwpY&HA<IQ$jp$9S>M?/yuyNFt>Iq<^
I1$%B& EXP=uEpL<H5J&?An6kGTTXB^jMcWwqD!1GdP$Y+w5kYk@:Add\J:cA&a=SA!1hw*^BkkiKB*RSM&?p&Y
6VjJwq ?&+n&yplGp?I9:MA9eiPcP@IHmAY865M5AhwWh1eWHBEIDQVF8$jENIWYP\>TJ$yWIH^TLtFQSL$984t
+/:#XC Ru\85?ny$?Q>8E9G\K<=LciF^8CXp?^H/hT8ptbBa/*/5kXKEmC\e5Q5\Q+=bF&F4DtbjCRuh:NaRFb*
^bVGyF k1y^htS&VNt%\t8C&ij<8CI&CT^8m9ann5Be\?QY*IV^yN/1K:FB%u:*w+?AJmV^PSnePXW4#lH8M\iq
N\d<4: D:NYXZZ4w#e?cu#WJCtQh*MpZ4XVaG*@68k?$e%tt/At\AdkB*Ru>Appl&QpXl1ca4al+lM/SCDAQ*b#
%4RDbu 9Ce1pt9E!^G:JSJ:&KYdI5$*8@6Sh$aYwD6DH::V15i%mqiy=PYE$ww=NkPbH$W/ldew^^#KQCFbnqpK
L</e1> +#V@H:Lb@ZQ/pJ!I9HlWbm=%1Al%ZymPLp<?JGJ/JKt@P8<cFnhtuj<5Dj/%CQBQ%dRLCuJQwkZ<J@^^
L8kQT/ lqV=#a?cd\jpXe&=k9jRiLIK<Lna8aK/N>@<cGi6!bnj&I%*TqB9wQ<59nRFl\K%e#ak>wMqII&u*&\&
P%!W8c Am<qwCYtuLw\IGydLGp5AW#CRHLbIj/^?&K:G#:i::L+Sib:>GB@H^8BhD?5%X1$ALWXJR+AqJ>%Z=Sh
VySmPq lI>WEpt6QtFJkE\YABHK1Rn*pb&R/J@JJnD6KhMLcSbk6e8Da*ttYja596Fw#<KQIQ^@u/HVJ*c>R9#:
wqMnZk QFMhJ<N>b?1^AMtdnVh&umwXlkG9#S\e*#wy@quGy@NE?AtT*mC\&Xud&aq*V?^MMH?*<Y*kC5tj!D>S
u+^AnG Hik@@iBNjp!+E?\&EZeuw@6!R#8&dG9d:Y\H$M@/9AEm%?IN+DIbujP$>Q?AQpKT@*:IXyn&^D^?R9kD
#JSG*u =G<=PFIwb#qIjIB#qK+BTA>wEQHQHJi/!Pt&$1e+Bi$AC^B>YVZtu?66EKjSMLc@JhkQaF#@?PG>Qw+D
QIZVG* *#jLBXYi$Tj8MSdmhmJd/XM&=dd6I##A/5?*1BdXV<6&AP$lm:4#hqehKyX$9^*/9w9@1IyXQ8<\M!J1
/Pm6tk BKe&FV!&AECjaH<Bq4mBYA=^#TjB*d&><MtVh9B&ADbE4nGb+&Dwqqu>8ilL5eE6Cj+AkAw/l$N!*LEn
b\l!Ta cEXeFb=n^R@%AtAl\4*8u84G*bh<PAA4bH54HN+y!:tRccXJQ+m:I>i4yFP5T:qM@4E\IDGNQh5E><uN
IGS4lb X?eJmPb:W=8A9T@5Ap9m:Yu&\h#ZWye=ykQ^!#/k%cK%JtQ\I=*9Q6AiMBpCXj?YbyPyIckLEYLQ6@pS
+=^1?Y 4Gy:V$YHbZKAumjIAHAWPeLu/>kSM\&amw>wE^mN+Y+F?/AJl4@V?Ba9TuN6>&t+y@aSE<Q6WD$Pj\I:
+S?IIA 5A5c&w:hq>JhIKX*/Te5#JkhA>pIjFR*eF<tGNwQ\?+G=E:mb$Vc=<WILV#&Tj+6XT6:9AukA5T=AW9@
$6?uG/ XJ4dkXN&pu/M?IQFe4R$?6k5jAZp1hwnZwCIFkCLMMIm=Nk1!@F\mY%B8X#we:GEaa@F?H/JVC>ijJZn
diA<Z\ +=W<$<=@N<tj@ILX*&G*XRelc^#9TTpQmZYyTXJ>5:H#bP1$Xu%<GNd%PqZB?V<CCCG?wHbLik<$%W=?
q*::aH q*+W:%yNtIAk*FhHCEc1=HB@L!SkclIIphnQ5?%%W+q4G$5@HE+Xw^p5iA@W=#W?QRqa<!jmq>5?^G?R
Sd4WmS Xd/\+hhY/mBBX!wyBq5/:Cby:BE9^XpRV6+IZD+tNuk1u/HHF8Cwt5\Z1@P+>iqdn4qHPtPjD$uEB%D$
9MAV#C h#k?L1WYGh>C?c&<RCC&*\!#J%1Hj/$^/Fh&*mEkX@Z9yM!Hqb<yyc5nDA&CwDjIlD:GRhDBTWp:VEL!
VjqK1/ lwu?E!*q<DIb/nic=GXB@GP!BL9M<HhAj6y=?l!RGEN%iCG4JEZKF=dn<QGV6\FFReD/:/uG!ZSJ&QYm
w1jpq\ qSATXJRMT<tNNMk$9P!F5k1lZwj>dB*CIm<R:aC#lEYPp&+CKT$wDdRXPIMRM/ieTBaba<V$HpD&wn&w
%qT5$A utdyX&WSeB6YFR+AJXjH+tT!jH1ePwZ?Z>HLEkbK96WIiSSqCQ@jqqLG>Kq6i1V9yqPVtJ1wQ=GeNPSD
Kq6IT> *qSn>/uTy*F<SpRMV>ZQ/MX154<L85QK4m$AnLHb&CZP5>N8e*yFEKjJ$RR>lEHjQtAMikI#*Qba<1Vk
?ESIjR :T#PVHIu?B?+J/4CW>*$NI5MREqZ<uSW?AIJ?jktCQG\nEed9qN44cnc/SW^A@t$4muY96jajEuK>5RD
e&c5@^ N8Y<yT!?X*y8NW#ZAQk#T/LQ%tDARRu5laTDh$nZmLXF?G11JlV%qeY<V9nGcT>VLdLDujVI=ZQ:%+kQ
jw\<eh ebC?X15:^?mRt*4AhVdFnh$uMb@c^Ri9HTINnPDjaR<at+BekVh&bAEInkc:bXpQBJ#QiB^y1%ahAk<q
5w+kMM c/qRNeBbAP4\JVII5Mb6q<MNDd$Idacm$%4m61=6+Dn%iKwpGjwi@pG+weIe&iF^YGCDeI4Z\/?%EBb6
EV5IpJ iekuVY8HJja<Mp?LLhA&GER%^:WcwELSXKYGZwalnEFX#ihwAiL=Gd$4SqZPZp>BCaeCDDZ<QH%hnjbb
MwCnPt ybKFA$&Pi*BCS\Yu+9<8$We6YA5VVuASB:X%>4FwP$VpD@!ctAniE<&h6@e@q6R<EYDIMV1&%DmJcZ:W
6melNG =Q&R:CTbTaB%CBASDd#1!%LBJCtAH5E=kye/e!A?NGk=:L&kEdT%eiAXpVwuEFCI@bVWQ68/wIj5<+t$
>X%/yV 65%^*ZAnCyMN+\>WiGKQqmDT?!Key#Z1ll9pIHPM%KqM6pWP?&K1&I@FS#?Qe!XhPC^uA!M=\?yycn4m
PkiFMH jSH4BTu\ew!^Mcyan$mIpy\P$G5h$Vy<W4HpXbpQFa<+6=n&A$=n@ttmZjDQ:N>wTj/d$B>Nm4T*#F8n
l/TC^h kTMaM46Q+:StG9iReE!9uM&e/R%6E*AnawT>$Rl&htk*JNWVpwIw=%$PChn4\K5>!GNS^+iuH<NG5^@A
pF@ecH /ZG8I6A@u^WS/8R:41jmG65m^:G>KLVII4By&FPlRZ5mD!8SlCeI1Z!I9XWnt/DK5!p*SVD/!D\uFh\T
-A8Ly4 000855d0bf4001202b3 Page 166 of binaries1.zip
XW6k?P 1<k1EPJJX6IkDaiPyudBiL:EtMRemdeB$kuJTTQGbTc=lQP?@wVVb9nXpHlT+CNjVqj+=!BNCbhC+R\q
QN#5#R 1XZ1E*<+amLEH6iTTH6uh@>bq8^:<LH!c*IC=pn5E*/ACHwtDRDSH5l:yP6uJeAtJ%*!tG9*QL?NM<N#
j^YVB\ lEFIKH#TCF^>/JY=Z<1h$*p+P9qiVMGy6D5CX5ALN?I\*lm#4CMXtuGalC@CPunpEiQI>Ec/@aE#$cTa
4diZ^9 NVc64I=Q=TSYRNLLA6HQ+RWM1#Qc@I:tDbE<&iBmNhQ#yH!C%w$48>q<@Bp1P9Nq48mM+C^diF1aBIKd
Khe<@F *=h<#+TV+Z:V4&XBIH&m1B>yGpSCJhu96y?tJSh<wB*mRNjEYYQTuCGP?8dcVmNP^d+#bPl96npl:^\u
Gk&Sa? jw8c</tZI!=X+yql4A:KEH#IaQPXq9h=*a6DC9G#qaQW!%4^*Twyit+Danj&/IP?=9bCM5lkR^8RiA6i
&jB=pe tPa>JNmT>wDHEu9I/Saq!m1uqVcXNK%:&9AP1\ZY:m<AL9RwJ8cVSTK\ZCkJpXV/\5@S?+RNiwTnH5d*
y%:$Fk GHlFM9?ZM^u6q<NbSHm5VNenD94H>LMKc@y8<?%>SWc&JQL8?1y?Vw=/5TB9c5=Dpw=&##bTjNtFX%6u
=eDYt/ VJnX<iT$G\HneycQe<wL>8QHB+h:bG/l=>Lh+=K8>dR#Xbe8Iq\^//a+k\JDWjal=N?Fwy<p8CGb+>m4
S5CZG+ XwPh4Rnqb&SSce=ibHIX*1VA!e4Hp*BQL=X*cX+DTq?LjF!Xp6N^JucGd9=e@w6KKX@Jw?EB?5WkA\*:
W\4<MQ 1C\lDMm>qQydZ>t@ql&Y/?MTN!W=>hVNJeG?8hQijT1yMy#9iZnk8%m\1yPF?CX?9!6S@D/n?1+4GcX=
t!nF8T ebqP/5y^@Wt^ak<S^$Et#u/:$iQDqm8cYEw655=lqS^@ZVn8yu5HEENaHt?MYP&nWIXuNmB%uQ9T:a1e
&WNi/\ 6TlP9S>#4QNFwjjY5c+uY6E%Q/#$Si!ncqFw=ShkNj!R#C4kjC48!cZ#Y6jLH%eMY4/muG+mnt&tbYeJ
<euYWT $1LZhAdKF@byQyY6VRI<+DP1hpa+I:Pb>5:d*WQ&4wRRhu$=WLSJ&ZjikA8\I^Tj%Q&MMQ\&PX6BYwwK
KR+YX^ B*XGT##Y4R:/HDTV&HKQj@b/16?8TFqZ8WDJ1&uqdK4nXT?AV4PYJ&A#$QGN$HhcLXCC&4XaEt\=knPy
>5QNYm pJ9LtXqVCH&w1NKRn1HQFNM#*XHXuK>?My?9cqR^5:w:hqk=JR&p=%QJE>LqN6dI#I8Kw!YJbFD@c$F#
\Fl#YJ PW+^HeKK9?8tIF:Z1R6Vi5?AVlR>jD+y%CYE1ZNTFQ>te?iNy1TMyF^?6#GCW\94KQD4J1#TjXbnpVkH
jA:$\/ !bk4yua#^TA:#T@Y?ZiTS8Yp?eKbm49?Bpp>*nBD51RGcV4bWC#DSk%<pWT@AniGPVV1+!F%qK1c$^Lu
TS8KI1 ZqT^HEWJn59J%cmcl%y@QG>C*Iq&uqSc/ZkK4F^!Im#phZ=SPWqKD1H4Xnhe4CieHa&TbD%J$Y<^KH%l
IT6Y<A u=B#YK*t\Qe^cjtTcDuTSpmeV%Rc^5G6!$tXTQXD@8ZP#l5:A&I4<i/yDNB*&kIibyZ>Hi:E$6jTHp8?
FWLS\% Z$Qma=H:$4FtYLcWb$l!jE^e<\X6THZdIw$wQkCFTGIHZ+Hp!WaTFu*!qyA/hZ1quB=jedm5JGGde@4E
uu64W+ 11#LiK!<uQ/J6#Sl=1Vim6nKb^4GXVZTJ*%ydm5Et+@K#!6FFuYiG$S\JuEyumynqbJPA+*ChJn#CN%T
iWmjtC /6>#y+DeQi/6+qkEMdHhy:1:XH^RJCC98:R=ZuTSY+uVpJ$yTR69LP@5B1=aQPZ?mb^=R=<LPlS&!6a&
!PSI<P WASMF@R6\SHht$n?T@:dI&%iD#b<8k%Jt/M\D6YGYTQB=u&u6wK4%eH=NP89LCB1pVXV!J&CK16JVpiY
Z:m%aQ n#BMhXumaqZhhp4DB#E@>nAV#1uKM%1QK1jKemBYL1i^kJl=wXnL9GV4IQ&QE/m@5k5i=KtIpbVT&PTw
wQI%h> uyi\=QiJ::&^R!4:JNd6nPmDm<Kk$nZ?$6nbJa=CVBA1Qc9FVI!RYVhn>ZQZaPa^BqL4QI>aB:6PXcWD
/bWX%D Vq1kyZTDy+n:=L!aq6j4w*QS=k$@DMadSlBB#IkFJQVkdPknALBCJ6K:W6aCq=^l>JEytYpHP!Swa/?#
KppTw^ mCb%1WhC9$tZj\:p$Ea^TtGDD\PLJi&j#uK<1\J6#1PLW*+CH/Y$nDYH\AKuGChkJ!qM>Y\m$*H>:/cy
^q$Fa% blPYpuIWDuWSm4VDn%MQCHLj1H6N*=M8C<H$MWl/G?*thuddAlpJB>DhWcQAIbai9lZ/^*$myF?R1=89
SLCDXT RN=j&Sh$*cGphLQTM=d:\GyYdlZPBtG\EY#RAuVC<JWRquLDZ&E*9%d#HZ$KJit5=:PIC=>+<N&TkM6I
@/<lPm !uG#9I>I%Q!bWBJ/SB+t/<B$Dp/Ti>YT/CN*e=8wiJdBQDd#+9/\bw<k>:cRu?h&\Se6H>aN?8BkC>H!
6XHhQW Jn98nS*Cc*Z\wwmc6X9LthAD%9GLLPC+&%b5AI$GckyW+=VHkSMhYGTI^5tSDy<wDybI%lu$X#EHe*=q
ZwJ>l! 9/wL/nXGX$Y4Tc%b#u+uDp9$Nh\I\6D5pHK@APWt>X/y%%ce%L6EJ#\eMhtqZJ1hnZ5iLeHMT9qaI^YB
yC:<ED cqd99&CuWlES!dk&<q6QektlXq*w8IkceB%#B+/e49Dm8GI5@k:!L$uK9&>qNaADt:Pd@1/Vy5FL?Fa#
V!Bm6P d*a#\VqA/8/CCV=L?>GF48<*8i#A>i5B5?/@4N=Bi+D1GK?lJEj9YBKBK?jayP#eI!I%jq!<CBZ@%F/T
h&CjLy hwbPYp:Gc?B=LQPNH\NY/PcH$P?NMHlb98FITl*M&$qD/\DhM@y+cTw**wy$4:6IbNM@#pn?nCqkNbw/
hj4@S$ *tQRmEC&^hDt^>#>EcK*<qt!PKJpDF%qRSVY:H?a=R+cKCS*TcFH#EXi4cWBSNC@hpyG$tPqb<w*G9Vl
/edE#j ^Z+J=>a\mM?b<wq?8^\CXI$emVZ6N1ZTRwMGJ\6A@aj8tc#QqSa#h&<$15@5T%p8d%y1bpQGHXF8pm!l
ZZQhme B^:kWWJ<JQHuHJJ!!/%=Vlc1E6$8mulnHC!#l^?X+&p:YW14D<bR:V>Q:YR<JYNX@t=c5/Vd+ZG!lpV1
muEAPA <%uLW?am^RpXAaQQwYQJ:<d<Zh@?hhjuQFYhmyh>#yAdL5!dPIb:?4F8GIKPcIil<m8B4$61kpB^6Qdp
h/CBDw 6G/*h*Cm%*!da+C1WbVWyCH*JJqFypAc1iy4WEtd%$C/j&LQPd4FZ6d1w/4<F\lQN9\j?<CRAJBNT8&H
5<pqDt aTuk4*=L%W:BpjhVyRbpu>SN9*VBdE#KPQyLjG?5A!X@#8ippXnJ4EBMYI=SW4p#pudMN?udq6NPc=!i
HJ?PPT VYkM+jwc>CayVby9GcmqR?+h?bA=?n!8j#9Vc=*+&PdnldT\<GPC!MAQqD@4?b=Q<NHG:^!S5I66#qCN
ce!dEl $mJbujM4mShHLNFb<h/qXFTlk$*%=$^E91i#eB*ymPS+LanQ*/A9/^QBhwLRDN9^^utjPBF\nqA/DRF!
>k%%lH Fy+$Z>W\EjEi##H:pNBjQ?X:A&n^u\tQukKKYG!k8J<9bXu$8nhTYq@K^cNHJt<Z^wtlq89j%?$995>M
XT6WmG V%JLM@%6VkWAWb>B$L#4^jHBtYhyl!FTJC@\Al@CNaP&&9*G#nF\=8^VSKTi6Dt=c>n?nCV5ycpXWZ1P
uMlYW8 wGtFiIijT%=CV/hejXN?Tm5R6H!GmSby:paR4EQc$NmNq$niQtt9Z+Mq>Fq#JVMWPd=H*P%Qq!qD\8Qy
j+?\LE w4AB!N%AaQmQJb\6\6WlD?:=MndQV%4!VL/A\a\u!CBQGGQF8KHS*!qNPqcm:wXIQ$w+I8Iba<LnC>pB
a>>dB% J:5i:cZwtb#q/QmH=/9A>AtMp<DcZh6>Y$icTmLjuchj6a&P$XchQMJJA!A!euIB\SJ<$yXKHFV/LK*T
pPb#Nm qeaF**QTXn5Ph\Q!wLY?>&Q/VIINA$FnMu4uINWNTHaFS&l8!?FKm>#R4KV&ndD!idyh5@yR:j9>5hm%
mPw6Hn ?Jl9p6cDj=PdlicPB$6$=dV89c6Ti#pp>=W5&!yZ=9Z6d#p/XKHDwSy8t&=KuWqh*%R:M<*ht?d%k<Pa
aAYB$Z c%c11N\EEPBGT65Pk4iD6X%!VTyVmK6&<+*hD5p#/w\/8Zcuk*^#E<&^pbWL$hyyI$j8ewL>@=#nLuFY
Lb9yQE Na\n9NeEdX*TXw>%qyT*E/R$L9R:L+bAmHX!6P56lP@1K:Jn5Xe=RcYWy1YDF^8EDYclQM=cq9Yl6*$N
>X==ZW 8I\LhDMRKE*yea^Me*=C<m%#=qSj8=\$WS8qQiummbD#4Lq@k&FlkHab>SLd6hyEd$&ENq=4k1\lw:?^
lIw!XM bA+PuppSFnyPR5apY8ISDAy4/8$<=Qy<6+CWe>S@6\ihIY98CKL%=HBZP5J1Awa8aGp*n<!pj!q=H:F>
+P@8=4 l4mc%+LGd4VIm6HPJ?n^m!*m!WFR*RlI1PL^%iw4>SWudZy4qIdtDQ5ebXK5Au5K?n#SuALcQlV*aD+l
^4ulQd pAWLH1bAIM%d#:Dcc%KGR#IPmb+AmiADFuC<VJ\KP96QT=P&K%e<nwNKMcl+iIT6Yh/=m*kEVk8ddhNe
q6:5yI /wIp#EG5TShiFm/VXNiQk?S6w^*6&6M<AbHS8%>$BwIGWj6FSwPGnpCupZ6e+JeT6bJGFtpmu/%SC6$4
ap#uIG 14B#iXLeX8VuAdp1KDMy<\G&=>5?99Fdhb\lR5S=ei^WY6tqpbb#GFT=BH?+\9HtmiyPlaj&&ieaCXia
?P?^1/ %IVQ5?Kccc6SW:iQ\mPP6uK:wX\8m%5MBZqai@@dYJP$mwNcVlTpwYLe>Eq9TTpJl+W6:L#BXTk:nS9$
pGBWQ5 qN8yD1Q1tERNl4@SBqAEc$@Y*tdR:VH+:8^$P69>Vu/:5:$hd\<:J8Tha\>9E9LuMQ/ZPl5k^?%^T1te
+YR&M? $ilZwbdWJT$t&I%dSeDSSkAqy8<*AnMII@?$l@M4kkb@SWIYA>NKP:@AE$BLiJd6/G8=tmp1MQwKKE#V
NmcH/6 BiqEJ:&nWi^jRqm9hE!8qpwLSWiAGhdnH^Y$\*nX%!iD#Bc<NMceBiBIyt@Am&8&q?nJBq*T+uQTKb@W
Pc:cnu ^\9b9wBuB8yJL5CJ+iqnm6^5:+?*ne/RQyL6QF1YnFm?:ecAV@/$h@^XYnCR>Xtia9>e/e$e&Iaip\q6
CtkCy> uYauG6kA!CA4J!\al!i\c&SMQL*FEeVH1dYSm!TiwKR:9EwQ\TQ:BjV5hdItVLk%/QdH<<ZGjGQi4Xde
Iw#jVL TTS&uQwcC%cYhGL&4P?W9yQVH&dQ^Gh4mT^4PbutJVEE@+?VhCpTJlGGP!IpX9X4#Z1cMwl/N&T#6y9Z
e/MY8/ <BJLeXaV!&pAwKPp$Z+R66YVtVW=NS#5FlE1&u*!?jbw&?^5S!mu=e\u@ibhPSJB>+!V^:N/JWF+$ndn
%5B\!e K%dwIuq1Le?QYw1IC<E@mh%wF\K\NPY@=4R+J=chC4a@85G?4njJk@Id*FlL>>nJPYnRZSV8%/5t<#tT
W81<<@ 4bw*Gq@NY+*=id+*IpaQE@p*J*R4bi=GXapSZ$cHVlI5+1CqlKC:J&lC6?@R@!&XL\9NbtuLpR!1k6J#
HeHNmD <VGd9?>=6V4BmPPLpu9%Bl:XBLpS5MjB%NyqYAE#IqY@#M+hkkV5#WL8hH@cj9Jpeq!ww<*$1jQ=h4Th
dJ1&$= I!CJPmWCd5/<HLmq>HC1q*ZD\&uhF&q4km<pi8A1%8#E#*9BBquAGXAN5wa9BQlKh=l6AyA/++jXN$@1
lXn#q\ Eq8P*jAJ+ISRZBud=^^:T1HyNp?*cp\mX@P#WP^GJuYnEe?Z>I?1qWa%$@iSjhGyPJW4=e9YbXLwu5WL
-AlL<Q 000a4c58428001202b3 Page 167 of binaries1.zip
>KPpH/ <J$TXB#m@\:j9q8!4P<T!JR8X@Dd&Wp:/@9dpk$!6M6enw>mT8IiBhTXN%Z>uM>5lFRi+I*CHR?BQdN<
6Le#dk w!86!R/:m5?NVueA+p?iQu*TTM<N4cbW^AX*Q><iR8hn$9tp\dE+:1ZG=+JPd:ym>XiVVEkPQRP6Te>Z
tp%JDW Y1Vt5/CTHynh8l@p/VEy?pq+#m9aq!9Tm:PWDyLRb*uQhX#bIeIIHMuc^Y1bX?hhJVk!*@mCBT$jyQ48
^c:qH= PX+Sic@5&D8&:nmHkkn4G>?^$CtM+AYCZtSbY#&4q%8!!1V5am19>LtNAi+w\ew^y458N/X&wNhwDC/A
#FtTc* H4le9E@@%h==k+9Gt+%4=S#d=ZX>nuY\MWVpIMBJcWe>jiEJd\kySNpqSAI8^hEZknGR6$EiTqtPwcRL
N?4Lmt B\eI@u!m&/RJVq&SYl54mwTeI#aycGIGBCln9$KE8Xd*TdG>551h$9uETGCFipjqL&ENHAERbb@Zk!<!
XK&1&L qc+&*QpGR<pF$id=Ke%PQ@FH6ZGm&ym$:!W$?y:D?p1!LEP:q!!#S#4iY!4SjetE1K*ip4Y$bKuL^jIX
6*#XDl t&/^dX\bVTu*:/ZybbHNTYI8+dtQHmAS<bMtCu@PcP$tiwJab*CND+I4%:5/+!uePA1JH/muJ#yQyKKj
bGY*%9 Zi=+y\But\CqV&JYdDA=i1HQyLmn&HS@^X>MK98?I9JEXGTFNDq8Gb:!C\GlB>E@I\ANIaWtF8KTd*$N
IP&K/V Jt!RX86#mYBQ<u&9/MMnb$H/!44HRGSK^Qk/byW?NTX6*E/+1dV==MFJ:BLW&/qWL19!uEX!6Xm/=yL%
18uP@h *h:TWm>itwPwq\nQLyNcR:Z6K?Vjp5XqiVN4?Sim*=i=RSBhAh14?KLkZ6PX\u=/%IB?w!:KR&$wT4K6
qBM^!p WXjIaDiM+6C+P\nny&euCM/XQKVu\Z+GJVG4>w!eYPqG=q>YLH$eWbHPyV1#/DtmYC%<JQ=JRlGm>iRl
NV!*e: p6DdyP@\?XX66w+YR:WXhwyqbAi!<^De+TD?WI<pPXES5!j>&8WMap+jyttE^q*Nu=8w?iVu<%GDjDCE
ZC&!kb am:nSB<&FM@Fcu/=jQp!mYNJdn*?uH=cmm@QX1/S\B$GIVd@:D/NIjX@qnEq$@ZRj4GGk!$wicuJ@XX1
+$ni4l LhL=l61=RABB58TRGG@nya/wibyJ9VeM%h&by+Lkc4jMBe#$VjQJb/VwmwW8I#L+EEZQ*Mt1H^NpPP1V
k6/Z=n wD!YRGecQci*T@Rc?t/8EMkadTI44QBn@^S=nT%E/?4Rh<liMwVVHp+e/<qLmh>bcF&FJTAN<+p%&WMe
etyNnD !:Q$S+&Zn1q+a@IhJJ?dd?mM&yF:u9=Y/A9W8E\G6H^=/VKJ?w8qe=iJ1q!::F!nSiFZ$lKj$dp4w8kJ
GHu<Yh %J!\\$PcBI=KEFbt*ja=RbL$9kGdmXKwbuBN<p8TZQFGq:6dhW55<DneG+Z^*VNwXTEw#q>RN99b>wCS
hS@18\ BRc#LCq<&Py>AjBM%l\$#p9Mwy@=jD%E\AldIqJ+!$MAl6T>ySnVTh%Qew6Y5ywE//V^R*ynbSp1Jpi^
/!9h#S MA/uGc8A1naJktTkuAIQEwnh&V4J8<:HdA$*clkp?M1W\PNGHkIjNw^t$nlbd:m+e=c!R#l#tqYiu9E!
pwQB=i bF=iK9iZZuy>ciu%!:lh8*d=&lYH6X#8m95/X:Ym@%:YcwRe#CKdV&LtSeaa<nRZcpn5eP9we$NRVy?<
8Vn:yS 1by%m$W@:5:5wZBy4#5PZ@nJ*d6QWDcPqlWw#$ibb9C&TD=8<#+6my<4\$J/$8/!QD&mnTVju@K%<&/4
*aN?6= XS6C^+MaFJEIm$eG%RdC\@Fbkhm9eX@p&TNV^qPqiZpat=J&RBYZl?jTpP#1a@eEKZt#RjeG*V?Kwe$p
A=T!KX cYNi<Ri?G#cKH@H@F9RJZAq@TZ>9n=\myH4=YuR=V^K?HF<:^cJi85bj4nuZlp/Pq#lliV5+Cebl8jS5
?TQhn6 ?d+D@ecS95\YAKI*ZZTEe$DY9iadWF5A819:h<+Td1+VM*?MPnHX4cBYep<WZ8&hiTwqt@Rud?^!$6NP
Ce>Ill AHlJTPbJI$H1yMV@B?t$qFG1:Yptw<yJD!iGtYEt@wFheX5@cJF!$/beIjq:k9TS4@!=Fy4A6tCXCG$8
V=M6KR !#pLWqS=qAhP5/bL=^*Ti<iPHNP6DRlj/1#1@WciyQ9tSP4G@KBl9Dq5pMdVlmCJ#:GTP#Xdk<6q?*J$
tj*tiW Ldq<ByKG1AjZd5nN8Vb&#8K$CujywXuXjWhRJ%JI8^KmYbuQGTB+PI6ac:*y\\q6IR?+AQLZXD5#Ai1?
+1aKAb WBj$Mp<D&IC1h:81!+Z!?=D:jpmmQ*6*q!8W/e>RFa/#k6*+e>b*>CPPbQyS%tF6RHK9bAZ%PC?cqaAF
CSPM!^ l?BqwwQ8Jj/CB=EV1@pBjTYXJ<EV\TG5MSBXJ/LP1w>Mqb1@qJ/kpQ!XNbNLaWin@Ctd:cGa&cyD8u?!
SR=V?4 :4qi9i*SLcC:\kFT5$*!j+QY+1M9cA*G*D1k$Z/B/K5Z6D%Caa?%H<9l%GKuVKB!=byD1$A4a6/+yt/e
iXR!Pk #6dml4NC6>4RtV*9PP\KeueW4MV@tJeY+>>*ki+%&kGPHI#VDWnjIlNAi/P=?\bcDdYdDe>G9\Z$Gpm5
=648^4 yD^Z<d1HZi=d\!ZdZLXhJjVb&*@TVk9IPaGE998M1A$RH=H9Gh+Di8VSTJL=Jc$Fb*wD:mX8TRdHVNcT
DWq?WR 68SjdZHTH6Q=i8TZPA=Pt!D^V<NdFj%*YuZmZV#ACn5J8Z9X6B@tqR^:TDGB>T@/u8iT$L&t%&!:JHX8
=%k^E9 LNPtN!!1u*?#$hlSnVJ?kq9RQ59u$@V:>P584S5k!P$=SWIb=<c%?Ed^&k$T?w1/<a&XG!8+p?^dDqyJ
R6!P=l 89VlTDK$1^H@*@Ly&T\HFq5<d+CV+P81?SL>4MZA*?Btb8n+=HPmG@eY9FI8XC1?I9eWVb8\E^VLQ>!Q
9F@4d4 >@d*TPKM?ZC!kQ5N*kRJCh>56GNpT#GB%@MQ$!TtHM<+:HHYtPatiV&4eGCjh%16K!^?YkTZ1CWG#WH/
J\M8XF e5V@VXVyM@1VFqt=mS6qYYp:&t\DqP^KcuJQp%SI\dV/p&1V1$E1Qt1ZhpuKELk5AY$A&5A:yD!:>B8$
IFYSX# DPjdAj%iG*?Ca%mZX6Hu4VB!bpnm%$n5\^Znyqy=>ab*a<ZVN*iq9wIhR$dD+bQ515PG+Ce=N48ZHHwt
R+$\&/ *$HT8c5VSH\J$Ely+E/c&Nj$8BFiXW/YeHWXl>9Z1AN%<Qkkjy^$e+SM<j:eE\:MwHw=$HYEu@M&TJn+
VEMqkD #Pl8%/NJ*<GmwBG*\Nh6KAuI+=^bq1CY4hL+*c!:elYkXAMp^Z/yDq8AZlW?P:9?LMIGLbDQG^\=pE/5
IuXXWu p5^/Jw%6PpR*K<JGaw6&uqX<*cLdpuw>Dky4JPBhhI6By+$h&lEueP//R#@<4hKSeSRd!yk^T#iBTWVp
w%<HW+ 9G<VWukpa5<llZhY?LB+!Tw^\S<59a+d*YQ96SW5Gh%Y!H@CCb9D+WHJhiR+R5DJJ*M!cRd<W>6qV#Xj
I9ZDTc Rah8H=c/!hY\\W/#GVkXNk<=^cuMhH$ZHc<4W^C/B#HB$&M$p\A/:d%N*qtAHmI\!#6BE/mp$GXSS!4%
HXdH9+ FJ$SX%6nY\!#QwpIh*EPnSS*F$dyaWHPdX%X4XPeV<^ptc!DT%dbhH&d>\nP+<k8I+^nTX=*YaJuR9@Q
h^\cdQ VR%KE9Jje/@%jtEWb1#&&lMwjh\?A>nb=V6<Sq1RW$enI$jLMDVP9h+PjN+I9BhI#X*HZ@pL+/Yn%%e<
#4B8ip <kNZjN=m4pDRicSJ5>4@i<X>^!@/A9:%8l!E8ymTmnE@AQ?/ADm*&@K+FDGZwC!Cl\+mTP:+Zb:Jh=lH
1t$cRn %X4<?B\l$j=n<4GCN=15>$$<\&jdI^a#@K5bca:QhcaGh$Bt/B@#8RGd+5lC!N!WuFNV<k!!N6ZuY:Wj
SCHd#^ +AD=B:AGhL*$Z89kSISC/E@IB<8kRWVjd6B/FhNiIAa*w$kp$k<A1w!ekne$!FK#HJWlH$hG:9WuJQYV
l*R^HB EDLLG$4jIP#e:WXGuu:VmI?Tw^#>btTe:h$EBHtRL&q?#X6^jGN+bQYPnuy<G@Z\4Kh/N&S%9BdyQPG:
I@%EVk P<Q1nnqweLeRwL\K9Gtl*\ty9a<:c8yb*bHQR#a++HT&ytiuhmA9ZTI9$kYS9ueql1dR^?\AjiRi1\BK
y5Mw98 #tuJ5AQNQaBQwt%\WXICl>B%:mpD5AGp<edNpl+6HVIw!ZR?$KKW9y%&jCBR!&u>ACtD/PNd>qw?HyE@
pb?LLb MMjYGR9lM1&+ym9%5L/TN%k>^pnbK49%>h8LH$P#d#==EnQe=&pXCQtV6+%TdJlH^wCEZ&V=EkJbQhkA
i=lXk* 1H*5#c!RjI>/9jGm$Z8?cQVXa6\4>t>C:5w45H&IZE8G9AFqjy<uud%cbZSBXlkCPaleEkhFdL+8ddy&
jQ@lkB T1#>P?&/15^!p$JyEXdYE&DLd6n6T1>lhYkmPX\>Q4$u&w@YcHAh?FkE?q?TR%SAj1LQtRwMZcncp%IQ
niFj\Y =EFm88T+nFMnLwTSaVX>W9=#4T6ZwTNZeX=Kd:\NLK#Fjw/8+S56Rl$QLJS?SQ6=mj9+qhK<C9SBTAj=
<CbI!N Rh1cBHt*i%<iGWcQlFpahJ/&TjQ#d#Q8=?lLVQ>l>w+1It<wNGq#j1pVBLFZAwb:K@:S8Ge8>91Lbu>^
du*aF: TEK*?1MNPVJR*mt+WAR/QFRLM9>HPEt%HMJHhJRlljpGS*Ccd6DG&cyp4uHDCh!CNC8ZXb$5wA!uP?&G
C?CWN^ eXhQJTPVi^m4k>NAh6wdcIeVwCWnBC/cH4p=G\hu/TCFHKhCe48jHId6yS*^+=S%nmhnGia>$B*wN^qb
&LNRW< :k\PtptK:iL/dK@i+nkkLRJh#+yXp6EP8ZI8a1k=y*%h>4aeWEBT:>/uJP+BmZHt>e:h>yQ&p*E:>/V>
^IjX>D Y<4wH^Xa\C>w/JBQ6DSiB?AiiRWj/l&Vik<YT@*FSd+Q?:QZS?$N*kNi*a8!!eMp:X6D?@6Ma%w+8HG=
#t\eNP E:FHWEIQcn\N8<F>@PDd64%JK!Sp#iX%Vnq^ST@5^mklQn!IDyPD$+?jNwVRB=^@H*?^QTdXVllVp8^5
Q+>!yZ iC^>XQubGME@V+hj#PnbT@yMPLLuY%i9pym9E1#Z&AeQTJ+4I8&/j\y/*mLVSP?a96#p5c&TMwHSPeY!
TAE?8M NBTYDqmRe?\WCa9d6^j@qGS<e9mp$*uTyn68JYYMnuIp%llKZSR^^:&ZTKwp/J+Z4966q1QuH@WYi*SZ
VbP@BK JP#la1G@&P<9D91q\jD&Sy5%P+<#nbkD6D^Q>^?^bqa>9+tGRyKD!h4eCF#$/W@<E$$PjiHY>DGBXYMJ
aWcpLe >CXCD&W!mew66L6hAEqB#!e=hjAWlTZwbAA9+K=IY:WnN!?n/hP&\dtbp5RX+/^9uy==biIeY6w+nGRD
ZR>P4D #dh1X<YC@n%I%+PwY*!Dimj?TaeAt\>aTd89=a=yhZw5:mn:BJVc\j:&Tc*@BPIiQ?$RluTihJ=&BkaJ
*Yl@:R &!BSF$YbLc*Y9cPwq^!hkdk:w4d4G\dJG9I8p1DyN81jH9VyNww&PkIquuLL=P&ih\XG@pj!+Lq^jP8d
=1P=8q ^F8k+iSApGI#46A&RIal>B1%<Y/eakm5F=@8!/l$AHG:*iuG*DumHPQ*wdw4ViWc*Fe4@yLEuVBdL<4b
CJIE6^ ^+leJ1dwCuAlhW4J5dE?TkkN+m<JN#/MK>@NYpp/4T5@1F&6PV?+myJ=#pSjEYYu1%p=VY?iS\HW8W@>
Bie/B$ kM!8DFDk+RtTNyB&E=%nw<p*wLnd8d*+^$iJeiLw:q&5Rcj>>KbBSPZWBEq/WQP<LIBBwJ$e#jW:/$Fu
yMGM*X w?P6?^$wQK$BK#56Rc>9$\IMltQ/d&\KayB%mb>A@9>mbL>W=cl\VReMA8awdVm6u11@Epm6H%R&eNIK
-AQ@5c 000a2bcd615001202b3 Page 168 of binaries1.zip
VRdHkn Lh%4MKI>Z^H^N^46Vph6=?QD?CA?6AHuRXMmN@THVSJ@^N186M</qRDMicw<HFaMeb#N$iGR@Tt&11cb
iQmcYa q6mNhSj?qjn1thwQkDYp*aI^MJeKF4V%Km$GP$*<hYYJuhn5eK1TJlQpSj%nJ*GLhP*4w<ZDw^QG$YkQ
<y&i8l e8@e:SmGI5YQ6NZ55hIV/i@q/MGkh?yw<ZwI1hJ6k@:*1%V4^@$<6F+Nbpdh#pc\#1!FYH8ht=KR%H<+
14jNHY 5m>luIKpydJQ=AFk/4=&X^9\?RQY?:cV>XRtMXqqZYEaE<^W$SpC5?M/$ZalJ4+mdiWjQ&pEVTH/yQlj
6liBwn piRVVhnVR6J^JbjQTc5<1=^qP@RtI=1+dd=bT45bcpNchGyZTiZX%Sh?eKWGN+N48wmy+G&VZVyFKp?A
:M9S88 A:my%S*Qpnw?IaqSF9>S>luNYnmM+9th&!VYQ#$/TWIi:P*h:h!>&!FnGauGV%uRlGV@Xe>i9H/:E=LI
E9wGEh %$u$BnS>pM1>*#eH@ZlRHWY$LG&@VZmD<&w=QCT^@?PS@Z$8%EHYK4=1ZY@/5t&DJ8h>e\9RaJJDuWj<
+Pb1%T F4yiqEFKJM9PaF9F+<Qby&\G$DF46!PCF9PJdLt^hPhM?PnRNKZp9/AuFJc#Q4ZAH#GpeiW:8pe\&hE4
l$WAE? JGq<pCuFeR&<wSa\ljDhjcZFFK8GI@qc@Wct*Qty\iY9eFBA!GEhl4A#Yp^hth/9GM=j/Zjm#q=un?Dq
m<#8>h 1Hj<%n6T9V\d$>/y+i%wi#5pmad4aZlElD\QYR@/BeAKKjtJ+Zk:%PDmEd#Q%LY+Te6@uhRcQM665bIH
J=G69i ZF&bKnutKP\I65MX$6mCtYSGYkluwma\D&^=9n%H:QBRHh:Xm6%wB9H#:bkbT$4GZY%FcbjuiN&\Y?mJ
*ZVYmW u9Fmw6cLXN1WRkL6y4PR^%eVV5L&Xd*C$T?tY9YVuGbZE&c+<uycFSpj%?iaC\<Vb=aDW4+Z*q+</k&B
M1ApML #+PSmtdH6+j>XK#nw%h:+:*>V4^Q#8jZJh:4ZS<P#iHk1De*Gt>9^>%8TH4iIcuVj@WZe@*B:VnK*S=i
8^^y?& H@h#k*+@Gy!<9d$Sl5RaA\@iVkw8@&b5L%aFZDR!I5bCbD\NCLeS@$Iep6VYVVGaA<FFGVlKW5TSMcwj
Z<S4:^ Py>9u+4StY?j6b^8V!D$lIpLJ&iPM</Tmj5wHZ@C@c5qTbbQFW$+uaypFX<%4lCMZEFDTwRyQM+b4WG:
A$?D>P Hj<p8=w6hnb4*yJCV@w$e=Rnb=GRH^MW<Z!N%h8Hip@lSV>TB\X%8D$cDI:P<<>G<X:<NXYQi5Z46<hS
@<TdnF 9F*ant+QF<i>5>D%YHZ*IZuwhCe$TQS#@eZ4&#FaZD!/*kij/a<GJ&:HYB6tpc+Z8+Z#4QVlCFWVdd<8
LQR4Ql #uP>/cZ89?l<\D&GRhRdAd%@1h$ZQ%Sd9:KdEy4Py>6JQK8iH#^lNA@c+hG&awZHTdI$iJFB$jIp6ACK
aZ9dmH WH^&claCh!M<tha>tB498V&A*iyjXblVkFp!6VL#eki1jlK=deIm!Re61WpRj=kcb!T1E4LM8TA5!uM/
jJd6Hc 6/iq*%5ep!tmi*#>PITQ>9jn9X//BKyZFy5/nGL!@yKD?Vkc>tpdpQ4H/9F?h&<::Hc/YI1\C@b?EwVt
PJ?YE< iwSncZWRD&ICH+Q&kZq:Y+Xq8FcBB<BZimP<P:aLdGXXK:iCtMc*CimB>41!!pNZQuS=SmNmJ?%eKqcY
<w@ZH= /CY/IeeCQl@VPyn:V/Pt&h:4pjwdP9ICE^#yGauT<TZHc&BPXYTQ$%:NTwdn^tJQ^yZ#lM>pV/@WNNnZ
&Q5d$c 8G1lnp/?JY\F=IPjAPS#1lX6l^8/6&$/q\GJHpQ:%VVkR8Vh<\QmMMh\=Zc5MFX6$J9?/iJR:ej:&A6a
LILMyI BTI<9hIwP5TcKWPyk=in$il&FMeHPA&K!WZ9!C$mJBw5u1FX8B:l\CI?QBk5anjRh5mQ645hFSdZMS@P
P9F$C/ R*6tYwH@RFBW>\Kj+*l%eHw*eBH9b<cJ*aAbGCA4dYcZKiM&XR+=mAyDQqBaATD/<?&T/kSkNtGjhpGT
6GV$yY \V/*u6ZPW+WHP?d$&GSVT:<1HV9^i%PIBMRDIpp6mSM^JJqZ4mKXN6d>yqCPm8!kp<l+c*q<L8W6HTp>
!bZq\E klTFKPYJ##ATTLJwV\CSdlPmjFin??$D>bkp1/+jY=#FIT*D!PC>MHiWL6GRqkK@@Vmlye5jpmqRB&jy
//+TC# ?@$aVbXnJGS$/IP&E>cCd6jH>M#QD8Nu\^:AcjDC>Rm&\\6=R&BLEJ:AIMj&WyZuiQu?CkK6=KHDT&<G
QVG9^# HJ?HtWCPRSNTJ5N55!Zqln1MGpDe%B#@/Zay*pPu>CAidmhb&CDH?ZCbJ=5kSqCY9DbcnE<anTS\E/jt
<yIBpp GYdWcX&>MtVB+?^aN^8H?FZ6SJ*#Jpu@jeam:k\SE^KJ?#SEMnhVThb@L?mp?k?>X4%9*CdSwK%nj&Jt
&GG4C/ eceNwK/D!l6H\%=^AAGTlI*+%Z&qatAZjSiV5L9:yNc$BV1Aw6nwnSi4:FZ%B&M?I*y&RDJum^AQVq<j
WFwiJN pPCJi+yS<L^Ih5G@yF%A88:^ARmZmkhiE^495ZXG4lMuJTAB^&Q/#Wcl^^&:qBmFyFyKneL?hnF5N<M\
6A&Qq@ Jw>18>nl<m/F$W=w4J&nQ#P6mek@%S*95mtH=e\PFGBGY&KJ!%i8!mRlwlG%Am4R*IlYa/:FIVF\IY>J
Y6SLY? uL=I>+HY6h!\BKhI@1=V<%!ppJDYe/T<N$Qak>byC8epWe>PbV><4Qb:Sp><%/mZH<cEP!1*H#@P^Yw@
$adQt4 WuQhiL?4+9&a:99hPN\uYPtcS:%+<RYSQBun<iG#k%nF6B/5:#t!#m1$%kMCu#bHe:mb&V?M:Ni4TH*Y
hRwmHm TZR5jDVPE<95\^n9k9+HVEDFADCIp*Sm*eiFh4StRp?*m#F5$b/KDXL=qP4uiR!nmLimjYPeI:L+Q<=c
JCq@uK Rp!ck6G&$Dt*K&MTjp#eM/1j+tF\ZL4G=cC#mJP=mLdZX4VYy@&CJwQP^<m8+?\n6$Re^F<u=a>a?Qk+
h<N$bw ib5WQ%dp\dL1D*8q^SG6B%umw%/?j^5BX\Ia+=hG1SiSpPM>R&pS5=S=V>BiGB+6cn6:+9yk5E&@Td=A
y=>^>p kMlb+lypc^QD@Q8p+J=L#lT#BlAi9?GVYH&^5+V88:5ItDYIlE+W9CR6/YKTqMV!wh$:&#M^:dm>iD8*
$4Lt*X 6<*^AuV>GLN5<^^p!&R:1FyyQ:C$WEnLtS&8pl!yFMZGSmVq$+=WapP>WTeMFje4Ne+&\GHVhY=m^Yh=
=ah@yq MK?VRwcBjSw=<A=C+GAbIdlt?YlI$6*G5bMw9EZG<jbnhZB$>L!ZH$D*Cd+V+%hH=h=%&NE8IZcE&L41
/$h$Yj u!d=Dk?JcN/t6RB<DAp<dt<n<akbJRdL5YcSF9>A<WBynqPVH5j?1%!yTIRi$A/V#<M4aETdcK8uRX9e
peW@\+ KH&!\RQcBdn@>&$nLt>*BDc1:pm<JR5YLbQ58Hw1p&#c^#TiKm9tAB!i&&qF4MEFpBhMLGDh%TPaMCQL
jkBX:@ 1!G!lPP$JXPKPuECtGWa>!XupRQ1AI>%=yEpWEPW8E<EjX5>*mc*9*IhXlESDuJji&j:^G8&Cb<NDRt+
u95>ca 1d/=iKTM=Km\tMy$MI=Dep:DAN=yub#VRy&y+h<i&&e=>+heW*$t*Y\VJMj?c@Yknw\ZStPe@Lm5AqBa
%yJKkq kW$N!GXyC\bA@p@dSSGw+kMKST+SP8=1I1IqY6CN/=K1Me@NBw/b!Z!JI=wXGELE#$qq+%wiW^:HkGN8
DEm5Nu nbanMIC&68D$?#jaabPn$EyGRaD/b!Z%FptuHBBtVCc!eQSFd&bEEw!kwJZ4wN\R/FFQ>a1LmBtTc%<c
H@N=GP H^Dth9eJCmS/PP+um/1ZI+H&B#Np*\bS*CYw:c^nCLDHZN8BRQ>tdF<G6TAR<DmbpNVTa!&F\+u9&nm=
%8QNPZ JAna+hFCQAlD\JanH^mV4ZH&D+>#P$#ntiW<aE$qTL:eQiyIq\lt#j>Kcb\qyq*jImG&%NXm/!w/:5j%
VhaIYp Yc>Y$*ZAtFBw?Ph\TM+$?+cwJt@:<dS!YyI@:bB>>R4BPt*:k>:M+QdB+eH&+qe5\pN%!By=WkTa*wcL
N1+<Hm b&?VuQc&ce8uS15QaX4Mq9FyQClhH>CYn<GcV*b<hmMJucwPTjP*IuLlj+9FKJqSJFhPp@E>eX\\1K\N
WEJ/bc cbL:+tDLY&X>BJHZZtTJC=JbuIX6WW:Vh1N58=9\W&KyJpQQ%p@t^%WbQe^lKeXdZFZt:SXEYK>eyj6X
$/>IX+ B?elTJnuTR6E!5l>=MVKMyNpYK5d4JX<#1<4N&TcFRFw6id\abZ9lb*djbLpeB6=ByDpIPbP#\epTW9L
^AppL# ENy+cu#\tGBVHT*KF9<K<d*l+GY!R>jJSWRnY\SjJj/BLycwWXbeP<PdG*Xua9R>^D4+AYumLq\P8dX6
/Sa*\> 9d9=m1&Md1G/WjBT6JEd4Yu:wu%6Re8w?58$w+YPQFp5P@INK1</!LG/Ty<Rw&+lAc?P+GnNA!LC#<8S
$XkCu+ FE?BamHhc8X%W/#<tE<&bIa!8jQuGCKllS=Gd>Ntlu#?4FemGpRdPP/QiuN<^LZa/<e5StlpKSWnD4:/
ehG=&@ m:Nn%h%Z<YM<Zu#iL*H5dkBy9ul>SKL5ekkQ9LZ8TVwmWDIm!?EFR@?dJLa&:ib&IIh/VYmkuK*A1E8%
A+*wZM pbYSH#dyHHZFj9=Q=C=d&6++%ak^4=Tma$\T^GcGFQXG=wHyE1qRqY>JWhXXdtSb</SKAGi$MDJed$eA
^%jNM5 jlL=tnlX>Jb!y8bJYbIcN:I+C^pmQaqu==IRTayIKqnp\<Fj\X:n=GJt$PMjpP&l@#WZ^?1\CIEi+X\e
aX48y+ k5SHd@H$>jEBy/\cYnEqGEwdi&ASSq/Q+KmyMC<$!YJ^eq?NH+lH/\EdY/&Sd#Vn+B\&6WdIRLTTVLpT
hB?5dp SAQ5bYwb&VQI5?a>dZV!&8Kp=J=?Je@Bc1&Z=u#%F!#WGS%bBTMwIN9RGdZtX*:RYyF/AI\X46Wp95^S
/Pq!>L 8FdhS5$Z?tY5qGV/ZZq$dILce%9P\Nul<4ilpPChJLaZScDH:wS!*NmtNFlMyZ8KhZPEcS?54AtJNibp
%KbZj/ n>u4EZ6i6Pj:m%@$p$GPk&%=Mn#d1n5L@4*SRcCu:5Zc>Q\hwjpBE!TeMRda:t&\JGm4G*DBGY/I/qet
h#Qa$C NN@ECXdM9X8I^4cVVFNbWb&In*b^@yjcuTn6>Jccd^=\4pMP>D6Z9I%?T@uu5LyIKEAetR6GwJ==bHQE
:Z9$X8 >eKK^THpcPJFjTptG$qh:EN%\qF@EipBwwb=!A#mnZ19Dt>9T=ntkH>Fd*8?ah?4R:QjE!*>e9Fpj$km
>D:^K% i@^aQRdHJEYh+cNa:Qu=/+NS6B$@SlllA^Fp8K585h5=F&4/&+1DX^:/J^mpyqFk6@$/$</k4cFVNi$$
Bi=Bwp b5c?1tny!M/M8MH?Ea?Nbj8W$>\hP@:QJ46hAHPGnBLJ&I<*^1*E4+1XR^Ca/@S4uAZt%p<#>Xu^Hh4u
#8yai# 84uKmYMDFkheG+b/G*KJb4G9mQ9$Ib&ahC!ln#F^GYlkBjwZ^SAtWjcZw88L$<L5Ha$ES&?Qm>E+G6??
PSJ>WV @8Xm=Zb<\NtHbI%W*!B==tZQF<da:/yd=yA^!D5=@kYHDjujwD%d=hamSN!@ITncBmjCquiDKhX5B^lR
Gd?n$w Z$1Jn4bDq6T>Ma4CD1EyH*6D/Gy5q1^Mu6!/hMRKYeuL?T\We4mSqT>l5:h<eT6yu<@1:M8cy^81VPaC
l9MVcK wjL9HG5pcRV=qY%@uVX!pXR!aVuGm$8y4Ic*^>5kpw<l!Mj^<BkSY8\hKe/qQa\Pnj+Seq*/=FdG6MZN
w4<5Z> I#JZShbI:X+Yd8QWI?/YJQdi*qBilS6wEZBDK@>8I8Z:MP*a/SHy=b^5<\BT*WW$Cwyb>tVtGtNiL1XE
-A6!$w 000fe38c893001202b3 Page 169 of binaries1.zip
6N!FmR Wc1cI5tE=$M+MWL\wQdRVi#^8Q4HyJ^^&pcAu<NKM+Q@aLlSRGeSqIX=5X@B/VKHTN#Y4C5l194KpyYT
+c*8qJ <t\8?*N:nk6#ZV+kI1*eJ1%Wm^YSEZ$Ml8NS/jdw>lnHD?4Alm^^Q:k>EFFGm:Q$?ikwby1ERR\1N$D/
*d6Yah ELLnK5PI=!\@ju!$iNVQDacn$i%puET9+m#neZh@G!X#G^\Q^IpwHAPdN@yKnJJ^*&<Q8LcV>u8R?Aq@
piZ*AN #CJFZl6+u#8CpDDaHMt=j$um59B?#E:ddM9y5pLhIXBV5*WqjTLIF9%yly^ndhyK@F\Fa1Fhe/M:*5mn
q8e@G< Iu:kq$tmL4C#=8eSiXL%W5&>dMub#:TTH6quydRjy<l%S5+N&8&ytTaQypj8Z^\yI+=XjHCK=Lt9eCPH
*Kb41u ekmJ=nk6KPuqnw^PyEmk!MHFaR<IP@F*Dkqm8\?\%c?QXY\1Yy$pL14D?HGZ@8><!Gh$/!GmjT+PH/C4
MS*Cyb &Qn@Qh\?V\XYX5A=D4:FJ^S?i/K4#EBVQVQNH5ih+wt:*mb*Qipa:RKVJ<$@T\Kq5QJ^>c9=GX*PhnVB
wbaETb XGFmR1B!K>&DehiIStG!kR#@pX@kyN1VhVJMuM^<YaycJnQcJGh8kLEL+P%%ME@ja!kFBJTk5!TWdiR&
E?WmG* $hau*qSGm1wIN>1*%Qm/KG*M!%D1HSuGmASZHQh\=DBtuV%Fal/PEYkqWS+eCaZ1Z+@Gl?bB4A=iR#EE
8c8Zk5 \u@\*6hD>nb>q1@4mP/?qjARhy9S%S9:4*D4y4ckke<$Q&l1hQW%61bubIK6nwbYLiSmY^NWJhdKEuTN
LZGi+5 1:&$:9=#/X8XPb^J4mllJmKdVqehn4wt86+Z8Q6y:Je<aC%ye6unECw^4Y6y/n?@k:#GB1pnh>qhD@^P
TZ!pCQ CJNq>j1SpHq%aAFhIh!>cH<GaXG%QS1SdEip\5mhVR\VwTYnH!@c4L%kZKT@ZVL>m/Q?T<^Ml>Elw1bI
<Y^jtF L8/T%$q*<y>WYCJeRGwY&c!T\:W<JF5959Py?a@<HAp%IqCaaRdR*qYBZY<Ghi$?HRhcAkcPm=D8@1j6
&lk??< HHEy!abAlJSYRIBYyE1aMPTCd!54lP&^D/1Fm>IpuSbhDJ?l*Y4M6SmaLiCSKmi%HAp%1bhdLthY4=VF
<8h?dD iW<y18+KqVmFK8GDG*6=a14>Ic6pjlAhECVM^ATdJNb+*+nX9lu9^j9=QSWNAS>HDA^IPwqaZ<@1FJNl
#SL*EJ lEIhkwdHMdE!AEN@wQyLR^lBd6&NKkXW5:HmhnwdPy5jS$uPieAX!jitRtMSlE5C55+iZW^RkjKCH>A6
/6S9RQ C1\Gp+JG<^n$y4wdyeGTV8j@$MaMIw+u+M9YZ+N9D!Z%Wq85/+#:#BY$Z<CJEy#FYhnwQ8Q<j&I=SMF#
Eb$$8? EVwqY^5lcDT=>6>k65DXebe4=Wtlk:b^Z/G4JPwBWMpJH/6Niu!$?E1jdFNM6\MkSHej/48Hw*l<W98=
ZF/$pt iH#>p$ZS*ZN>uRkd+RSGaZ:/RY>S5l*WwE^G:lt5ZH\RhW>9a=kKuIHAY+h<I>iCm!#m@Z9RR49N6Z$S
Nhb@+Y cwuHyL$9C*>hC^yIL&\&/?K*b61db&ik\N1LDJ@@a%6:YEu1Z#H\mu8q1wN=i/y%kV#5VWZ&Wl8ub%Bd
pjB^Ea Z9hbq\e!1aMe^NCN\mIjdK*M%nW<PL+nmYpItZ\G!qBq^:@Pnn>5&>HmN$q#wdXTB$MK8:>*N>+L:>/N
%NdH5+ :?:Sw@*>iQ#J+tn^9Baq?Bbl\YM8uHu<tHl\*!B%VRbJ*+J*\C8n8lj&kRddIApduE<Ch+D5A#h%hlkT
GVtYGl @lE**TE8&^:=J+ZF6wG+Q1R:&&\n!l<$jA=GMhJK4DSCwJRVBEqbj!1HJt+iLaRmpTkuSccAMJk95DDn
t@TIQH lyWX^R@u+&\AAtp@>DWhKn*upEm:8y&u+u&u88lTn?VF?m\#*nwP$FipL=F&Z&P&dmhp=ADZd44yCR4y
*m4wC6 :PBw$Sw\u!J5WQ6XW6e\D8Puh*?!%:tLhKt:uj*>:jFuyLLjEAq4RbQmR6apV$\j:ub:KyN%MmCAACTn
qqSRSj 9nLiF%q*Nn44@nwZWLqk&t#cEKekcdiI!khDj^mea=iBwQl6Em+ldl&<\XW<TMt\JN@kPL*>I^c!&ZAV
yhd^8J q*XSM5$\Ta+DjwyR6=nY9^6TA=>yL6u:Ta1uyRebF/>5ELd>wVw\peceS/qm*C$me=/<CARQ8N1m=1@E
%4^jaZ W%QSjtYj4uJ?TI&nBIDiw<Z1IGKy:yNlJ/H8:aW@8h5J>#41dltCBTJ5n=<#FmTL<^y\PeI!HMh/jiq9
VaVHei qTIQ4u>KS%#/k>E&!nbW>>\?kc=p1uZ<WM1weI+!/:lVm9^&#E&h!I6aB^?K@I4wM4jdWMHL>AkqyCS#
1TTt^n 6?qyJ+B=d#p9S%YyN9@SeV<CG:+wAAFmNynQN:nYHjZZLPNy%PY?WJ#IkicNJ=!N\&/1!AVAbeBjmDlZ
STwR*\ 9W4cK@Y\mCSMbuy@kiRW8lD8N$dcY=GWk#GENXl</jw&=5$maTCM>$pmi!FBSPey*iK:ye:h9d61P^1K
%TpFQu <=Cn9#AZ/eFCJ8^w??A^e>>>+QW?u/d$hdbjcdTN&Bh^EM\WDyEVTFw58jbE\uXlGt$1HwH^L$h&H4*h
K+tnZJ TNId*A6&HBR=Q8QHRcFN8q!Qt&bRQ/:QTyjnwNcetWVub!#1ZAP#SiA?FIWCK@dZlmLy=^MyJ!\ee*LG
>?t8Il MC66+NHiC6**Z/!5hHYH/$Qy+E+$C%c8NXjZCw&pKQ?KDK\*hA^d=k#E+MRT4THCFumEGDFTIlhJc<*4
8Ft&<1 Wd^@kjMG>n4lV$KIHCu$V%u$RI?:i*F$Y/Y@#=tWb@5/mkkE8S*FED*J>^TCmN*FSVp8RH:BC/Vw?!t%
qyC4$M /LDpk*YTyDeL\he=9wpRQ=4DmbKVTt?M@b\H^Z/SXh#ZDW/Di49iD6#Ac*y&XMq^jahyeiVY^JRFlMN&
ql>jP* PK$nea&1nHiPK#NE+BB$mLtXV4W@d#dt9&\WGKhHSN=G>lphEbKTaT+>K*A9CkKXqY/Z%J\Fn9FXl+hh
YBEV1Q 8CBuaj$<#yZHIi#EAjtWc<pRmeP%^X/P%F9%b^jVI&4p=HWZCV=CByGRJQ\E6TF$J&p@9R6b*>*inpdb
AjShV6 tVd^89+=jSbDh=I%EY9AEduJ5*9INXkWVS<N#N9$5\ZP6TGi5SF1DaeL+nu5=qZVDnep:uhGSPdCN6wI
+c>a@I ?6JR5B$<WeEyQ=CRGbI>mHCwyqu*SNhuPGcYaZjG=*c#XB4VtaB*Vm6:XB%B=KNGH1YMw+aJ=NbP>Tph
=KqFE8 %>VbHjta/!Sjb4&@9EFm@$QYh>&RqhDFQ/eDdPmuBwyu/^/%$QGZ1*^%XiEjhPYp=w9c&KuF*?lj*$bm
Lu?iq/ &B+cNyA1Q8*keC4wBCS/Eu?uDipVIhpuQL?hbSR5>yQFyL?A5&?pYV=GTlN1*Ru&R>naSaF#%uZ4>naG
d^Vd<H hhK119CqhW/m>\SmSQw8N#am/iib<j*4mAQ4AdeXSBeH#\>C#XA<iC@ueeDdyP*c>DZ4$<hqmGYWW=iF
uAXWG! Nm9Lu<N5b5ySWM<*whMD4EDM9Z@SVc5hCi+M=Slw#Du$FXBKd1!dhSumMScq>T+aC$wLLX+H%jZhM*X8
FEa=GH B:NC@I>Vn@&KLILm916@l<GGw?&E:>GkQ$W=pDEAhPhdP!VbQ&&9BY6eIjZp!hM&$Ah&qbbli##1/:>L
pi#^Jy 5IhGuGL<tJml&4hn4CW6\jbi&B$K$m?M+&*/YbeSu1W9SGXFPqY+#l\1<YVI%N4IL4mhAM%Jb#aC&kbB
y/$BLd PA:PAtjYAuJlTPSMY=#nl$Vklutp8p45jW?*>pCuKqd>8IKD<S!dW=CYlNuKEI$Q8I%Ma#AXWjy%:e9w
*6Cyh6 !lTbQwTpX#&V+pb*cpRlu$d+Nqha?wL$hWIiu:bl=YQ:yEb*l+<1P?Q6aw!G44Hc45all!NI*TF6cX9R
8bNe1W Sy5Q++q1J$@PAin*TPCp$9RZWVT?jZ6$8+Tk*uaeK@Z+DNKcYNd:h&QbPhFZ&><F!pm/<WbdC%1K9Lt>
GVLKED ki*1+mBGtu<!l1L:Rai:qKKqb4u>lA%1AJ6/kt8umI4Z&::L^=E+&ETDRWtb6nJN*>QqPKVqBp8dR<<T
16!DQB <8CA*SmhNWumjhL\lB#%Rc4kJR$$QYX?S$>:!puujtp6j\N%YN%$<CuJZb$L+Vn!Kal8!\M1<\Z46=:n
ub$4j? YGPRZ$G!8wjiyJ%^8ElTaSqB8aNPJ8:h>8=88@$&K#ppDynjW@8JIw+aG!y?uEipSP&j:P:6l@9<=<S@
KD#@S$ PuH+Wnie8wpJJR51Bc/uhc>q&t4e\6Wb&VqMb@\HR#5Qna:>A9yHl^A+t6Y&Ai\11NT>J9Td:GqNI*8P
u*WpPb +=y!6IVAl!:SPiTiKWXPc:DH$*E<+D4BS?N=P&bJA$1G&iJ>h/1Hp>!=4<VTPuycQy6I?i\lMB$VcFA#
=B$DD6 nQ^=<ml@aj<c/+/WJ4lm\61$w?u18@yDA$kt*#EZc=>pKGj=Et?J+:%w*%DJjyFn1CVhCyL#:kIn>pm$
YGK^MJ b>NupS5@dTeK9:$imnNJhuQFR#eDS?=<SmN6#bCZP4SLH8G%^!yhcKQL5kwMW8+<TbpMccZyi$&ZCHuk
d+m@nW VuIhhN=IYSikpakQhGeCVuYAXm9S/y^X$TACqXcN8I&&Yh!cm9mmuywkDDR!maZtLtS#KDQB4*eu<EFj
wecGLk 1!4yln#LH6cSC^iR*?@w8NPI*F=Zp4JZ/514pQ5iwp1TyDRMZ$R?WyAlCJi#wCFE?&*XQ5hCV/pm@H8+
b56?Sh ?Eae:d?+y$Mui?HiV<B*>pVa5JCa$taRj#EmJMKVZ^u//^9R/uQp^/QuCi+ea?S$\XlW?*<a&ti4IZi$
NnNCjR qwpJAWEJ9VWT@Zwe9NTGc6eD<n449wV=NK%L5<4RpVPNW@>^%lEw1Sw&<MVCd%9yweyI4Capd:c=j>cW
+&18CG <HZM4%CYBkX=FAQGcAae=R^/aNNmZ><Y\!tV1C5Hl+hJHCBh6cW+9MwDtZ*uW>6$V19?>=c8%ZGa/q>d
Z>FSEQ ZF^c:N@\cKh:m#&W/+Yht+9>5PM6L6+k/a<ZTh5H1qj1k#y&u6^Wm!j/N@ja#WiIcu>&d*?ILHyclL%l
1/?QdC 6QnKH59<=tK9N%ku&h>eHND*%@tJR:X+c8pt&e1&j*N^mY#q6cX+<eV4Du*6p@&?%4je&Mqj5WZ!ShiH
PnR!^p +Mpy&mA>u^Y!ktdMpH@TJI$l\?u/DW@tll5/LXZH@!4Ta+Yn%*?&HZH:QZmm6J??H1!cp4=1D%G*\!A#
At6^Gj !1#upH*TM8itupNVhXPtLWnDhluNNd8$#jaVkHQ+pw\FCt6TyF9Zu+H1u>t=%*8q8Fheed&Y>*4WK%\D
5FQTTu ^Ea>C^K/*88Fki4qEiWptbh/9RCNt5c>tcM&!M5\/qZ/SFeI$D9:i=*<@p&ped@TIadI=TW>htRHp5+1
Nl46nI #/hCQ5<NDZ1N&eF/5PHSD\uwZl@*Vuq%l=dJeZ8>9yQc#*<<kP9Q<^c<aGPDwD^<wypm?j/h\HiB=RFl
BbRY1y itBQl$LpDHGeFcT%P*>KaBP%8XKiRIpqDw$9y*!FJK=a+nH^FSPP/anV*#F:4BT#nNH=GH%Vq>blMNpn
l5tl*L jWtd#BB>nV&8mEIuI:1=ji+$@Feei&t^>@yT4:eIZH&>6*n6?k&QEQ*%Zt@h/!PES^Lw$Q>:HWKb%/@%
1:<FGt nq=@uXqKV:&8i8jINYwQn*4D@6ESc#u+!6:JQZ1/9b5p?#D8p#mH4><NP=$lClSi:%$nDd>^SLIQF*6>
F^btBp Ayi\%$PXnpjCy6hE>^>/N+9Z4mt9VG99Lm$8E6#ED1hk@^9$R#u9A8<&iGAIm=1d9hMceLTq/dPmE$6$
@nbkM> $\1emRGh=jqEty9@QFQ$R6XqVT>u<Y+hC^l4lFj6Qt5/!Z&kA\KwSpPiX^?#l6CLk+eH$E1ePyK8m?5e
-Ajt#P 0009524280c001202b3 Page 170 of binaries1.zip
>+Tk6T u?$?i=EZ+9BR:j54p5:5%KWI=%Qd86cn1!MwiX%=@>WNLMH/Su8nR#ILyX!Mjucn%:5bmn$qBeiZ%*6H
h/BItC <E4d9cQ4BP/@%i5>jd4aG?:6$\KwQcN#jw@YmKCh5Q%8@/kj*8YAVcuZn<Q/Pwq>TC5d$ww8AtS/S!G6
yX6yHC \#Bed>NL?cICQiGMm+89$^9DMTVwFGK&jj5mb8B5cKiWtC9BC^46<^y\F\pPldh>Y!1a4DRje/L5IPh@
+P6niQ RbKQGh$LQL<pEa!b$SkVe:\L?BJ*DDaE5ccMMR@LpK1QA9h!jYciaIb??hwKthVDb!?tISl%wIt+L<NQ
BcZml! CW9PP/?#q4@i/>MFpF#JM\Fy8/F/8THd9YHe8$KQTNNJ+L$iyQ^p5Vhkbpl@T<w?lPdTm9Cb\$@C#6&F
+KCPtL 8\ViyZEaE<CVGyP:E?@lN/VapmR<bFVy>@4I!/Tj4&M4lXlb=d*ki#eYF!WWeANuuNK!VDpELdiq%%W%
!?cP:p bJEHG&SR+ST%me1eddN%DanB?A&/EeS+LJPb*FSTMeG/P%H*9>C>k+E\idV/W^#+!mP!41bSQTGy=:a:
dZb+iB Y8=>+Lyt/me!4$ltYlyHjhPTSnJe!bF*8keHyc:MdVyRl!hC6Ph\JjuL@b\QhK:^NhJFi=%%mKBZSEj9
eW#4K5 5I?p+ZZmiWQX8:1apZRIt^bn5ZeVMbnPmHV&J?FNJNae>jd*EV9j?<uh#8#hmLD@1E<+H@jn*y9$>*6a
N::&e8 y=TLDp6+SqwBXulP#MH&G9aYA^Rb$>i&n+S8n@dhDhb>XJKV\t@$:ZP8!B?>%+udQPWyB:RENlTi%S$4
Z&qHY@ WGiFV=Nt5#BMSh4eM>w<a@puuMEWp<dDR>J=I6yDGuHkpdSicjuHtYecycPN?JmaYGWBw*5\qw?@anGp
dEtINI 1DLHI&i8dMSubK1lpM!RT+:SAN#:%Q/Ya:??CKT=Th8A%HN^<icNpbSn4/NcMw^IaKy*=dwYH?$DcF%u
hL5LGb <ik/^^&9>^d9:9%plN1djmji&+@9*wWLt#^>5RMie=PAl$S>e*S#9>8lySJGiRyR%8NXGISS6^Q*9n6A
X/:PZp 6ln>^mJKFD#TBZR?&Am\IRL!ZGpXY4\IuS#ZbVqEeDh+Q5$GRIeAB*:VBmPQ%!VuYk!6N:G!GjJE&uFm
FnICqc P@8M&#q#8<MmV//m6iAnWe$9$:nMKLY+Tci\*iH%TKc=#nkh:%iW/WenHpE@$PQJiRbcEeic#py%w/9*
N$Jk^6 BQK:ij\%t?BQ:NP!HVaGQVS?IFHEacMd\bep%Fkp4=IWu8Dn6umZBB:wI\EkA1Wu*Btk&4/*8L?*D!JQ
Qq?eGA <Q?Vy=$uTii@wY&B@+#*B9RbAdF>W98^>1aATQTb%kku>kTC9eX8h=6jK@SIDY+8LyIJC5t4I\ZBpt\w
dnTYy> L%@DT9^dthaW1LBIeEV4wMJZukL@cYX+Rel^SSPlN1bZmAuIE1ESF&NZS4pR/c>IuPQ5MD<:+T^KhtTW
Ah>Su! !u<cndAdWm5kI:ZlbQEMH#PuS&:I=J/TjGhKK!C8dc%W9C+HK4q*VpqJuyZ*td&E5\Z5l\&\!YkDa8lG
Gkj4RP *TkK\%F@uYVX*\/:EA%lR&hdlh?V@WALRDniJ<iK6p!HnC*>Tm\i%j=iCFJ$+<u4@d6*?:*4JH%cB5Su
8/#yAq 8y*8kE\FmSwhJ&lJCQAI&uDISE?!TL<1T+:NCHPMdHR<Yq\pmA\/6CN+R+R!*j%:HkqihkTY+AuQD8Z^
K\*\ab K?V=mqH\CcA<H6\\MR^/@uIi11?D^L>m/wupTk!jB4M%$qQZuA:kDCdaJL8Bw#&V8Jt&EFFqVwcB!SCq
ke&6nq hJDt!bKy^>X#=HJatTYQw=8itcnDw61A&@54P*FPZPMtM+6Dk1FwFC>?l^clG!*%?kPmmTVB$YIjR899
ViBq^t l>6/S!BijF%^89ALR=!tpkVbP1Mb^W</V>yQV^J^Y5R/<a:w1eW*cE6$PyL\Ct=FDGkSmZEe!Pu%84hy
GwwS+X 4eu>9d&+TKDa*lmS=Xnu^eCP/G!5d^BJ=S*^+/VT6/5<?Ib5BLptW\9SX5HJJ9eJDX#cE4/V:Re8E$c5
IFK:WV Ie@6=HqDjMwcnuEK1Db$&WT\%\W+pR\Z^HRt^tFCm5cyejmtLn%k5celB%QQ8?QijbcT:WAdGT*IuDAN
hHm&bK RCAJpK!%?$9:6$CTTF\nDt8NPH*%N8$G&IbFaHh*XCLA8E&Yk5PMineRM%1Mi>ZSHm\CaSLaJ?&F#q$E
qEkB8D <N6t?!a=eWM5Cnq^M*5h6ERkt%>cZPi+Gc*h4!@iD8NPF\!yC&#1hG@CVJQe^TB$Rw>&Rl?Du=Gm\V9l
w&FCYQ @=ua$1udcK5\&VkNupS9B8aK9NSZ+ipA^4py6@4ZMGp5@aa!l?B#VFmAhdAcdh*%E#FeI+$?=CdSl\Iu
\E^Vb$ GcY4Ej%uN+P8^*y%MuhRj#HVF8yeIwRJC\u9CD?N9&FH:G%+mD<p#t^6lYPa6B@YTTpS^8^&@wCENqwQ
X<kGCd &XS$\+/$GIi^yl9a/%Qed$b1L$idIN+:&TF1SH!Jjwk+=\*/hQMtYaqRqkq%!S$8^B^=E5ipn=8*R*qm
L9PJY* ity8y!%^bjVKwV%B8!H\PAX$QjT+QqpaW!J#Q:@u$A4AXwe<u$nVJ9cMWSd8%h$tGuN=t6BI^X4c/TDu
/@</KB XGqZIDBQT/LaVw!=BW+5\GRhC$XIYBq&AtX#hI@JVQhwEcSTPdJjFW1Ru=wAYb+iBnp8n:lC=wSpH*tQ
Gp:Fk# iSuWRZTaP\m>#:qp%@qdSJl\hIGK!5*%#e=G6IEA?#w^1E%ctt:W\Ry\jLuN$Z^</n#y+DS^4!QYtVMW
=^$!uk eP6\:>d#&BqQESuC!5kj:\qh?m8ci1$#B?6!BBSHBelj*MacIK$G6W4$JYVGmwZ\6ij\nt=VPGJduY^<
\V%9d8 E>=C!MCEJbC=5XmA\Pit/wFAW#=*LL$=1SdREJdS/T8i&=YIldCq/pcTde4V&BSq:y4m8QPw&8jb>iep
A8annE ^w\nqMuAa\6!N*npXILi=>#55/9QFDpZqLnTe>*Z!#u94<A=:pDwuZXPhkuZ%#jYR:YilDpMBR19b9Fm
dPaEGV NE99pKMeE9k@@Rtmu!FCuHiJNWH?DEt:dhKbF>=8I#lKSkPTy+>>%uDXibG?\BNu+IuT\DbYkdu5^uy:
pYhL<u k>8L$lhjiTSt4+neG/<qC<CqXkQd>Fn?b4kSl^h+D*SCBmj5AS<5Ca*SeHklYYN=ca!kC$J6#L=AJ#VX
cJmjw8 PWyu9?R^8m9tItcBJ1R\\cTWDX/HQwinB&t\AkFS\#=iaIJF\CEYYaN^Gj*nbGb:ihLX@pTYliiEtK6Z
^<WKt# BuQq&ZwdZ@K#PEXcDhL>w@Y@*qqjJ#mtlcDq&FkQ%:ZVRN=WkL5eAuTi5JV959n^EDCEFhlyjGhHD6ny
YbIy8e @<I$B5$X+a\jZIK@$R:Za+=JJ=$E$peVw$/ATn%ckIkp#@=#:KHl95TJ@6<a:mYt+d66?G<l#:IQkI5!
+\j5y: al%$6R:dkE%AS6yJ//PI1wlq+JREGPiww!jZ^Z4e$a\i8whhWM#4XKlE*IdllLaclF$euFaTN?L=eaN$
E&XFNR Ge=kGc^!Nkee*hAn>HiqF!?T*EQH!edduEW5TW@$S5?145QX?nQT5BkVTpkA/%/<Z1DQ?H1BQ9PhF1uD
t+n?\! !:IPhY:D*W$QGX?kLjKWLZe:ZMNl:=Nk4j$&>Kd^b6#?L=:\j?HP>e+aRLAi+I:/!A*WX1NlGu*IhmV8
ulq$u= \&p:8wM*u+D^ASGbc6iyPXjR8II9jaDyb8EJSDSA*WI!%:SLZkRw<aKALyE#X@j5+@$Vl4yDHR:JIh#u
DdXCtH in*G81Vj1En$#5y!y5cT!aMhMYSWMmWu8Cm6nPJ$bGISe^C8=d<1F#muB@VIm%1$c*Q?mlN^&\cd=^qI
kVA/W8 4kQaW6iL>jk&Z1QaWT6n4+Bi<1Qa8!bh=heu$pB=M<a+%N5I\TQbImBST?@SJ&9aAY6wI\$T5WP$w9EK
F<^#VK #:IP&p>\?5&lQ<:%J<Rlcn@&Z1YX*Am+IS*>^+a$byGWhy#$i5w%/kN*BmM&5B9?ieLtaGldLk>R&\Ai
EHR:P8 GW?nEPdBdwje8\KR^QJ*FQh@au>BP9ZFKXGF/Mep?mHb=ETtb1CjVy!YCcBT1K\Ne=<6\wkQ^nmnRXPn
KL8Yiy a#Pcue45%ht4Nie!b4j&ye/!knLZG6hu%yJc+y8iM:Lu9QCRn>\QyLX9%*h$<^$diHqFPhGKiYMq9tG5
=\RjuW nG:EK\WTQ^4nGtk%#Ep&tA^Vd#VyF8M554$tS:<p&h&+ad^JF15^R?9!N1%F%J/l@!TS6tN/A8/8!\y6
#FGWW# 6V&6+GQGHG:ZjWyt&HEGTb$udlV5K#kN?:@Q/NT/IdQVBSa:1V6^IdIAdIWJkSy%Hc\GJ=4W5W^cGyee
&ahb+A jS+b6*5!A=bNRJV%9TV6%Ie#8iPuplEBF@&B%98?qHRJJ+LnnD=Dq%jt$M%C%SIuh/XemjWGRQpBCX?%
%DqAn: mtmu9wIBauXcB?!F^LHkM&A6D8LDQQEn6P:Tth6ZK4E#e&&F=%!wc#N/#InC&JH^m6X!Ymm1ed&Bm<!:
<@di/e 8FF8<mqqi/%Jd^EnVYccp4j@nebHDVINdX+iWu*5HaS+TM:wWVF!$^Yy8Q!MHDRh8/ehuepnZ?kqCEHJ
lBMn+6 68JEPG&QP4JLLqcA6$DlKiBuFL+T!HFVp+i%%V$um!B^<VG++XnT&Mb65!NmHe5/yN*T*ZEYDCyq!XYT
V5SEG# bAL+KZSpZ4LT!Y&DCRwy^lhXRVeS>P&//6VtcEi5ZBqZ$Ld\lLjSw4XAX??cZ!>\d#yc4=cJDZDi<dMw
l=Q8XQ *!HTDpPup5*^JAY/huq$djd!6e6LQQGIS<AMuRIGuNRnkwnayjjuDlyGp*DunWa#cyVi$CQEMN5K!$Hd
FT\M<k ypqw$n^CG$dPCS!:iR!aGcFcFuP6yE&l:VITKN%/FkyBa9@98JW=yuIFMTyDiAM<Hai9Bcu>Sb@!J8IW
Z\B+KR kbMt^1J%^bk#a&&6?8RAhI=E*tQyNI6ZkuqQE!Tt+ucm@lFbaQR!/5kGKHBK@SB:aCDPGjFZE9k5Ch^Y
lw<?:9 6XtuBllceS#8=Vy4i=$N9<XNQRp?WCH8RQw8^new?/#Z:iyWV@:win^+Pa>lc8QLZ!*Fq*Mp/+FV=Kp8
H4jDwF L4%ka@=#:MEa>tmi$ZB?nNFJd8NwTw!eu8P+6D\n#D?Sd&YcNq!jGbpFLLkH/j=dyWuPpJT#Vam?MTbW
D<P8Sj X/H^bB!iA:85R<B%hDD!$>KMTT8m!JbPR\D%^yiRdpQQRiL=1tR!Kqb8?5l>wLW=c8haq?QGe?I#M:aM
djiYK9 Cl9d=!6&1?cRQAt<uVu8Nkywd#tS5Q6KC#XCAh=XnyR=dy$uB!TkDWhY#IF>QW!F1k:M4m<1QC4@NSpM
<Hi5Cn KQj$lkq1X<yZ>CSitY/c#aG5Vw<jHHMJAPb\$mwp<+/wN?dtXdQlpWnt=kRTH9$m?T*y&GWiVc^R@!F>
CKelHc <SVZh\>SGK!X@J?up\B=Ij\>LIRKm<Suu<I4iY$DcA<9!>Z>pF*jTVM4ySM5A#%IDP$$YwwC^kmSy5@w
%Gpb?t tb1^XuY8$e*1uj1pR9$$b*MpbyXHt%ietq%VX=Pc+eT%p:RGX\lT#1PD88QEmDMR1$e8h4lS1>T8ELck
p>&y/Y dX:VW:+mpD>V><Jut8\j$kNFBIEMLEc5G=en/>RT#yt@k>G9tEK/yK\C=l6jy5Y/w4lat88ql>X!8k1R
1X#V?B 9K#ATKdLN1L=M\%8A5T6@%$?pWYcMewDbbl1*tHLJ8yihi!5?iS#Vb+N<^@E$wmB$H\Q?X&E=upeR+#C
!n6AJa e+R4<G!dLGp$pbL$TdVJ$8iRBX=dwJ>J>LFhl81*ic\je*5pEjIPkMm6$qFPKA*KXcw+yeFqSCS:md?B
qTWc%p WM:wBypS?AnBCt$C>F?ew?*k1K5^4WSWP>*T/jd&^wEmB:iddL#TIplyTFM4GDF\MH<nFEBZB^a6Rh^%
-AG*Nh 0003ad8c772001202b3 Page 171 of binaries1.zip
Wdc+6C KnDML:LH@N$eV>$%9!Qlddw9=bTq!wW4GFp+quuN$16l4KYN4@*=GGYhXe^IHaMCMFLuZY+8BJE#F6n!
=Xd>LJ nZ8a+56@1#KQeIm=m1VZI8Y:k=A$BZ%*>XRM6?:wumhwIcT:P^h+uBmpuQhI94GiXEaAwmeSCAjukFFT
*bEH\8 KcFJS$+Vh*BHYyyli/#6=XCeJ>*=e5pl*wI?q*NweucXWQ#KZM&8A<<h>J&4?R=pdZ5dn\tl9^pjhQeC
<8P?l* HlnE*X5C:w/>W9e*Dn+?pCw:#KklRc6!YWeuTnnI^*!qMmp/>@:/4lYu+Tp!M$PI?HQJ4bQDIMPN>KuE
5qK$jM u<wEb=K\qTp8^mkYBC=?P$/^knPM>:tYtpD:dl!cV#5SpSFZN$Wl<CbmTMbF=/GtAVJcb\c<!J%68KT*
qT<P<1 EC9y:qDE!5MVPS<RT\L<V5tI/C%K1@u+K/*WGYZ1P:bQPmVaPi:hS%y5C+1wYuEPambDieKy%X5<L^CS
NjDZQu tq<n@TT\^qAQhPKWJ5ewQK6n>A?GeHBw?VBi$XHy*Am>?$!nN>K6n%W=Tae><DBhX6$@J*W6MEKM1!Xd
W??ESe !111?#1D?ZMi%<Ea<J9TcSPXFFDPKA4N9b<M\^e/Aa\i4#K+SdP?w1M4FnPLMZa!kIewEQmEDFEhy!MA
*>yRpp biRYNFKcyXS$?W&mJ$?Y&mJ\aSZ#pwkn6B46C?PcibW?#e^^u:m41qcyM!A+X:qDV<XJE?P:B:?8D\WQ
5tYd+R 6FYWRuZhapmQMYF*=&C>4JWT9R@HuHBC*=Ep<#\W5y^Pppi8*Kn/<*uFleXV%9tuJLp9JX+AHj!@mHFN
YTJ!i6 8HD6hNXnJa#CEGW>+h%S?DJT+VltZ8jBIL=VV9Qd!X#JuAVY\i4ILjHRVSj/X<u$V>y5qcS@whBlDb<D
SQ*wGN KVkRLIlTHS^M5YGT$l^J/!4k5<c:t>CWjym@/q!hI+5&^&%/jBHn^lYPnKD#m*15R5:ek^S=pEt6H4IW
HJAd?h tS+jHpV4T&kdnRGMJStJkXR$w^hnbCFbl+mERj+yP6V>^V#ywb4cGp>b@ZRNMMyZyLp>lNp$bQkC#?E<
t8>jwN SWJBELHL>:&>AhpnD=%1/R$%jaq4TG1eMDGhSR$#B=Z<DCN9SabRJ>dEM9b@TSiK^uwj<>q$Htw+Flpi
\ZS&FZ /W=\9PJ5m8a<$5FbwtK<tc<RH!P>jJGEPm5GCq*%IMa/$nE46kXY!==EjJke#LFX1uF4PLSIImTND<y!
LR^a&d lu*Rjd$$MC5=taWPKcKVPd\qemDVke^XWpTTIZT^B<d>M^bkpZe#mhDRX!e:?d<WyS4ab@D@Lpct59l\
8Ra1\F l#1TGpIXjTRaaj/ap</M!NkV58c1TK%+L5QISadX%C$4X@LywRH/t@Tb!u/bdYBC<GE%pV+JtD$KZc8S
tuy\qL *b/dk+6RE##pu5yp!E?+W5@q%am&&5&K9hI>TH$\$5NRJ66#H!V<Z9j\GZ9L?BS*l#L?pPSY!wpAVW6W
D8y$!u 5qDmV4SpF!bI?BebD1ad?W58=VY1w\\PieaCipHBY$!DumZ<dpeK<mMTImR=yt*6T+=YuZ$b&6tZ4VVe
H1E^iA wB9pq!S@u4MTIWWJNei!6YW$J=4V<*KXhhGLX5\nKPYSh4YPW9Dl%V/#Iq8=Bt41ZMXGJq$<+<BZtPXG
w$/+&% 5ZM%/W16/npjIaZ9Pl91RAIN^JW?DpQJSEj:H1lpKEqiB/T4L^!M\IbaF!hb:cYS481N^GCQ1<VX15@w
8c9K*i I#eQH=Cb^Fep#Ge/K+HqYiC>QymatL>ucQ@@CQYu%jciuIelb*y9FJ+N6Cd\*8c?<=jqiDijnlXlF>bl
\Y&tAH +YtHa<!!bJTp@^9^Ray8GDMFp$Qhl/M^*=9Y$pH%6KaWZk&Ytub*XC9d*EwQ*/RG?#VQt/?*SBj4e@=m
BhtYH< DRDqV+=:XbJ$hVNiV=wndcSlBBL1#Q1TnFDJ#i1DT^d1GL1m>CbuHCR>Jb?RFNYkHeSC@XVcWH!mFXTG
uZXeS4 yiPDb^1nTR#\5ynG^5:!=dkhteQPwlXXqjYG1ka8&L#DPS=YipA!5p>IbM\Y\ed81Y41#:Fw$@Re!ZZP
4wk=Ey y@Dbp=n\wFGWmuD+5Ci$wlJj%Wc/yluR%VqX5@AAQ!Fndqh4Ltew%*Z@@j4j=nm%:etpN!u>VLwlyP@!
k\NmBj yAj/E8wBjDKZLL1tc\HK8ZK14Vp>FbYH+I#anpep%KVcV\*nEi@5V:W$y:qqQ:NE9/juZA#5F@V@5YWu
ZubaPN 8i+#B8^F+htPeCPP5uPCyHhNb!RWNARkS=bDYnBJ$m<ZSXVKLdP+GRQm6D<^J$*q$ubtA&t?\Vh6&:>m
+jl1FH 8!TuWL4DmpekWL5c%e:Q\T#lD8bi8#y*yRbdlhHt5^!R<<R#TkkVWQ>d<Lmj^MH4$NLp<Wbhq5CX#qPT
LB$YZI dm9cjhm>kTGc?V#Z!?HeF/PJI^uXpin\B:TZdhT9lC%Nw6Nj5c#F:j+Mp6dk&&P#XbKB&TV9*\W/FNPi
n5!+nc 9l^>P6XBtTHh>:w+$mYJ9!TSSj:5khM*d$^5q$#i?canI6jHT1#TM9hiBwL#qD4h!#CZhyISQ+u#EQRe
Vi/!W/ >DnXcjAy!B9?mEecjBpe\IbK##II\&&/CpJ/6ebh$WGYZGbNRFn@N&Fmja+pl4E?h$Jn$lBhP/DSH4il
+lmmuY <VDaX9myP8!8w$SPqa8e+WNPceIC#%9yPMTIqV4YjY5@pe+*GnI?b@KKa4qb4decl&ha%KmcTqLNQy@?
e@D6AW Su6jhB6%FZkRl%Z8^Xn*Ani6\9PaqcB:%5n?l5Nk4KZMAp:^wywTlcl!m8M!8Z!bV$Bllu6yi\QXtNGB
4=EA8Y yijmnb:RP>BqePnZ9kW*qB*T1*PPeIb1VT8^nP+pl:tppaQ&m:ZS%ihJ/9BqFTJNFkY$hS=h+t<e5kQ\
<QZ><u DNKh/X#tk<J^?Y^iAENG>HAdMcDw5Q4y@A!WtG=cmRG<je=5#ByXjKwNuLVi5G%&W+iy8@<nw=!=yu4Y
Zy\hZI BPt#&?t!#RPC:EPjm*I^1u+cHmy=$\*@l8l#uM*6$\mm^a*1^!44N\jXFQ9HnB>q*Rpl\?dV89uW9Db?
J6KJe9 I8wIYh@$@&jRklaTbp44RJG9KLb*J>lnwB@Qae/$1y@k\Y<<1wDE@y8?j8R\WthG<FD6M/>kG?pB4BET
=P>^GD $Nu/B/VVVm^n+HFYnq^Cp<h\<ntny4n5LZ\tb!6n<N!9PJ^jFJGn#4?ZD1?Sw9ibdI=K=w*>PMpGPR$a
K6ye^@ IZF*>@hX>:8EI/VtG5RDD4i$jYS8TC6$>*XyFSuSpy%p@ibaG9SdXW<+IuKP5#lc9#WQ6mw/1M6NW8BR
w9qL4# VJR<cDip?e!AGS#hd=KR!jM1#+FpEF:QepmAl+#E6ZM<A65Z>jdV:6j@lb5YkkNIHL<dC=XnH4#le1W+
Yh&11J Y4IS&t>$E*&klJlnh/XTKTDeiD4QhcBEpI?+Nm?dW#cl^=>L#SHcDc8MIjh=AYau#jJR@Z\m\@DW@bn+
Y$mMD\ d@@KRl<HjVw$w?FuZD%Jdl!\jC<GqP@FaS/yA1wP#/lJT\A\>//b&jDE&Q/GmJ<@PJ=e4cb8mP%tjMRw
dHT85? A<TQJqy@NF@Y<iy&EMS?n8Vj%#Eq&wDu<G=e#LCwPhpNIWW:4lX5HBeSK/tj4:Fj=Q9cJ14/DG8%S+>K
hiMSDA DPXPTA:e6/Y##YEwpIVGdT&+KPybq&P?tHN+5I/WpwLmkiNI/=@MehJMtuZ??Z^S<Cc8^kI+jZ5!/nC>
Sm?!^$ @^IiZT4&1SqClTuN#&jtM?a4L4p@Rc5&R9T>%/SlR5mZEnBqaV?kYhehP*WW?AYNNc#yIt@+MRQS?bp!
4SaG6I >$%miy&&D!S*8ZGc8:S+$lZdJ:EQSP!u=F*?qn5HwKuNnYwFRA5J?pYi4EN:\PdS:/qnn@un^FFe@$W>
R$9jdG tyRJIl?C?RLmB>Hltc+9y6cu9%!y6c/6k<8ejCb1*:pCj/yAD4TXnyJJ$mwPE?yikl<I$#tAV<nBHRH#
4?4V<> Hka?byLZh^\1H1Zi6lLcqZKapm\SX%Ny:&aIl#EhL=V:HVSn5jdRG\VRw<I<4ww%u>Ai+#TJpu6L$8TL
4119/J 9i>Z=JA1XZ#Nb4mtEJF>8FM^Kd/X6*VZ%wnJI6GYNue51$9Z5n!kb$\4aApGEu<h%::uTAlnVu!eGy^H
*b4J=M =m@MZWVY&mIXiBnjd:A4^pQ8kEw6Y?h?T:BNHV:t$a:\jZmM/R4>=?E#Qcn<Ybj#kDDmQe?n>M4eN=yq
C:^qYM PyKFKM^LGE6YaXlNBQXQV9e:FPV@NFQ?/T&R&h6@q8mVPNd>Z9Z:9>ZlNM9>QTcQhCjAD#Bip<i\E8nA
I6uMaT HYK=5>4*:Sj+5EW49yNBjh@G$VF*d?dwd=\/qSEyjS\w*@V1I*S^IdRy6*!G?#VIkDeK8Hh/mQYKnWZe
KmJ^FK a#c8XX*&eP6/9CViE=6a\%Z?/VyQAiL&1nl\eXT*KF\<Qp#<X>AbE4YHDtcd45AYHPytPh$X=AiK$5i/
V=5SaD Y<>I^#GV?XtbF<G*?S:>WCJ9L$\NXW&d^puj+!qSb+nVF^4JcYE=#t/RaPtM@5%BNh@wwNPZ&u?NBh@h
HH9KEY E<w8>V$8B?KJ\F@nmc$=%wTZJk5LNbe9nk:%c=m9qHQthK>uBP*cKnC<wj?C^%%d&Yl/GAua<4%&a#+d
C%84&V LyY+NyDH%5E:8E6pj:>=qjp:l6!ST<<&%/$L+1ij!FX!/%#uw?yLDER+tLpeQy5$V\l>6H@mWiA8J5%&
=dP/4c D:XS!C9G@lMFJn#pb^!bMpN%bQeF<&QttFXYi$Q:>mN6c9Wm1GQDI@45MPEZM@#JXtieGiB@p=V=hEST
9a8pb/ JuH>wH8n/5Zj+a=S8P%^h$q5CK%:jI1D\cb%:*JbP%LeFhjSY$EdapiHGRq?<n#GJTe^RLEDdpMFI>@m
$XNKRQ ReJB&n!^bcL>y&1Q6P9>Y%@X9y>bZ#K+PN?iA?jS^N+V9jjEEJ!qNeYlP#J4<aB?c<XS=bIu*n<bk6i/
eCcdX< wJ1I8GCRe1*F$RHaAN#CK=ktbuPYPEi%hGQE%F$>IjKZV&uI^eTt1FctLeDp$?iIZB*dE6w%RQaWTj@j
EVGPbR J&qAJiW?S>XeG?\#*9>G8LhQZt#k<4EbpB@q#LI#9M9=EcaJMKt*=bSY#8F6#ZWmeB$P%LI:lYcI$1E!
6@dFWX S%aZ*d6<&k%6p4t4YtQ@A9Ld8Pu/:%VVh*wVTD?ZCy?ID69n&6XbuQ:ly//1u>QpQuP!?EGS\^6kQ%=h
%EZ84Z ^9Py?5JKGh%EPI>Qa4YQCbHRq::Yeqw+NmRtJF*ybk>WF?jGQPe\NnMnwFp@Rq/qhBGPYF*:W^cA:#HZ
X=ZG$e DSS$9&d5kdMVKmRdRTTXdwN%I*MDSpJ!9/y?>*i+>S>>+E5Ih\XPLy>tR8jRhw8+1KNb%Fh/4X&>GM!B
a8mFch bJ!kpWj:G?#wT5q&ZG=y1@^bhGu&yKiWS>!#=c?wFuic=Ra\\hC*d44<Qq%*XC5leuCieCqGWA\l<nuR
R+iVQb V%Y9<1R9Z$b9amAbqwT$=q95lnh<L?DpKt:5l!By#uw>TkGJyF*h<HqRJA<NeGw4K%%JRPBn&jWXlVF<
Q@8Xc\ *IhKJ4\NbSFtiAFARBF:qLQZweb/EZ?pWWX!ld:KY4mtuu6XqtA+MSD@W:abT4JWXj6=6Wnt+VFY\P#8
NLq*my 1i/L?$SH?VTmRc+9YRk>+>y#BIY?\tppD>&WlidGL:bM1bD5y59P&LeCyNGmjbwKVD<a?@pYWjEaX6qV
CX>h!c \a!$HZdH@tt$i/aq5L$=MRb^LehdkbM:b9qe<cyha>P5CQ=lnJN/SZaBn?E4e9TW%Q?9RQ=NQ*X*4!&l
yy?/@+ /W8euX!klSeG/&IFAE54wc+LR9!l/&E4aHIj%=DJCcAPEk!1^hRw/MDDPG&mu&&Eu8lun%%@PYbJHiH5
P6jh$! WGmeHYZ<I&$R&PWw<Cy<Wb&BY@C+&+*&Z+bLAF$LbL<nla!ek$cVHLI^+S$QaPCVDFi<DYKy?ZIl6:S$
-AZ9cJ 000c4549556001202b3 Page 172 of binaries1.zip
eRInk= k&BuZq1wihK<nl5<i#ILc<WHLBu6GC8mcCu\:Ru/V/jX\8^d:?d9nGy=&kIa>EXL<F$pieApM^W>L?M&
l>l/+T QjF/YhM>Q4J19wThCq9FmkI!IYi<hj?/Mp?N8khbeYnw8?Sbi=#<Tk>YPECpDp%$9C>8ZEb!kt=mnDV1
MIp>Q$ ATu?b*J5ba@pVAcac@iQ>h=?u6uj4>Mm#WN9/cn^qM=@Wd*aSu>MNNkq&FElR9Cw%+HVC<mBSmEP\itj
SGX6Lq B5q<l1AGN1CuG>$:qSW9<ZK5*#tmP5wjE>a4IA8QICK\TjCDwCn>6pu8yQ%t1#b1Sj=T*W*nP<J?=nkY
I1*nip Z?PDI/A?cIDAQRqa%e6<5P1Vd?L@XVbWkeV@PJtV>!w$@kal!LC4E?pQD*H<+jmTb+^5%=dZJZ@MSFy4
<=?$1C RZY9/eG1YewFKPt9yL&JT8icR>mjcek?+nb*b@?T4=6BQBR:MPVy?9^$u%Y9$5by^/VWn:pScbjDWhmm
p9VPF/ dlQuhKni^ETtilDkSHVFha:TcLSn/=MX=imP^PmD!S**<&l8#qlPwwTFnXuIdSa!Wj=SK$Gj$mDjDH#T
@iV##q 5yp=Hq<*J+G$5kNMb?Mc%e@4GAILW$m\^:QNp@wLZL*F/8CJV%+ZJ:F<a/qpeq@Yb>Dcq\//G+AXEdGD
aW$RRp W4c8nkPyk%QhG=dR#LKiE%$W5@lJt5+Y/!lb^j+$DdS@RbSnItF:K5WtR@EjGXuY4u:CZ%YZGlk@C^nj
6:neBd I+LQ5?:c>bVX<DFVG:pmjFIT45hi#uEJ8R6MdYJ*lwjVRILkL8MkV/IGVp9Da1KLJG*/#^uh!JkYkjCq
pI=4yt LjItBGt6pJc6%AA$Knn4abRW/IaeM6YF&%kP=>*MI1S=4n:^6VmLBYVGk+ML$D9V=1w6Ti>5%6EA\kjh
K:B=Tu B?4RClG8D>aq:aEH+wRMZnX>h&\?YI$Pp\Q4luW<4RlK?Tp*N^uadDu6I<Vm/Hap?Q$=<l8PKdlKn@a1
!FI&u+ GbhM8QJ5S9@PEbMqjFkh>JttFTBWiT*\8jBMRBHh9S5Aqtc:nwkDl>5KKJRKqVjLLe\F4KHP+Rn1nB>F
Xa*ph* *NKL5Q4I:\iY@k&jJJ+umheWc@<bEndSCph&PW@DSI4PHFV>KtMK+a5d%%<WTHbF*y#X=4jb!jk&j6/R
:qSm5H VGWh%EVpV*\8$9y48h^q4<5NGBHKiS:/1ncLGZG%%qWT@A1JP!@b<4P*q$^#\mRB!=D+F@A#BCi5KcN=
V!*4aT Am%PK*#nyGTh/9VKNIW<BnVV5aX@N%NPE@iaTZ=GK#C8L4Zn:5HnA/C//lJB44h%#Re&AN4<khk*ADaE
I\<D&9 N*8neEa1NpNTb&k%1V&1%+bBmRNuAmmENEZMw+DTu>NN9Bq6A4c1uq?LY<y@%bPN\XFH6<a#!*#5AKcV
qq5lnE WQ?Le%h1N9qY&BDu?TCK^e5JTQRP+aP:@PPt\<TL%cjPm+VjaAVT:9CN5qXiibcS@KV4ph1V<:B!%jpB
WZMGTX 4ZiLV\Bp$6=My#?bl#XPYjhMB6#p^dD:PPS>WK/M!@pKX\nNcP9/PT*lTj64m#CJ5Q&PbyQ<^L@p*IP+
+m91Qt i4t>V<9\tQE?<DpLH4qYcJ/L4*SFDRB@?JlQ8Qa?D$?kGE+cHhED1L%BPt>+A:ckJhF<n$lp%AJ6ChyS
^eI9FX eJ+qnjINqnI>RpQRGyV@Eu8^$H!!1\I$QyQ*6nm#jBAaeP5A@#L:Gm=*XNIu<u^R!L<pd8>K8i^$a+:k
/9tB^/ p$C@e\C+d>Y8$86iZdq/heZ9H1Tl@eQ+85!%kq1t?DDMW1#/ZM<+4H\lbWB/15X#CcJ>:bb=5J\H4?iT
P^plhT b5hYj%H>y48QCRFpYR>CykMN$ZWJ&$QEcJ=Lt4&j:CYl5Sh^+9!LkT:hq*=TcNMadLTS*kmLPTb1GMqP
dl=NWZ mAA*w8#p#1yYWaa1nwL9I\4R14q<l4eC^CHHl1jBIn&nQ5jST+iH5$j%q<FiPLNJeB^NH?9MXb4%9^8\
t#VihD +mPQGe$DPBYQma!5Ei6=/*Kq5wE8CweT8N?wMZQ@ATbXEqXc<WQN:A<Q8y$d/VF5tmNe6nM*8!hJ8GMp
iAeJq1 iXhmnu:myq6uCL@=a5J6JnSTH&PJ49<@+uTIM&9:=*DR?Dc8j6<NpS>B/+FnVySSAH9RLkRhnJ4kqTD\
&Vl&#I RRk9K^j8:R%Dw^PFJc=Z>wMN\ll<<j&TWQcAPI%BRDTn%&DpY=n1^+kVa/!k#pY6TcB*BW+?mB/Qw*Q>
/A/Rdi 5CaBbRVV=umGd#$NyHqC+JXjATPA?MtmjNNq%k9i!<FAEB>RNEp$bI8l/5TiKuqM9FCH<%mP:paL&jX@
tuEZZE n@aB4WdN1cAu8!#X#MH/6W1cAy^!:mnN>BnywjKGJK>WIy#EwFa$+k:M9CakN%@aJ+?9mB^4/dDP9!9w
4?iY\8 necLeXlFlenB6\n+$djIdVcaJVjSdJRiN6E/uScmEYDR+L:cM=F&h^LKH@4?PtwNR/I:kQ@A/AB&wtBY
%5=:Xk !=+H=aF84yDBHRhLCG8Kln4pPjpE>DIKECjdK*#t=+ZhGuN=l$i$^#m4an+Y%?e+=I*YuAI:6Cut$K8V
Z5l:L* TZ&#CZ:VkLBjVp@+GabcQC+Aaj=D&k*n\^i:RCB/CRIkp9%KbWWuIm6!w$JHqQVMJASRVXhltPapKpL/
q&u=C^ p*qJ$Mq#>%@bDXPJT!>QnlT@lp:HDuj@b=*ntRdZQpWw6V4j4!:/Id1FE$Al\8#4:8paeX5QaAJA@J9A
Ypl^NL @H&!^4RmQ>qVh=PuL/CACuZM+bPk<!SAjYn:TjB$l4?DmedTFHlNqF>wkZtTLu8BuptA<<B9?V\c^PjS
dI%V+R nQla\h1AI>Yqi:juh481Nn@L1Zu%iqXH%*n\dqMHu*C5!JBETkMZ1+F#cX1^RP4c?S8Pd86>XiN&tlYJ
e+FnZH :CCtRK5l$$!9a1#8thyK^ip?//aFu6$XeJ$Vp>ZlDCnPGRBCueZTeFycYbw/$Q:I^#wM@Dp9:X>ipwqX
6%jLjj @u<qYb!NS>wLR^%W4$p/S=eHuASCnJlp\H4\hIFAFwa&TwCME&G1e*jDu>C1*H*cijL$caCXiW1$6E%W
QGmnPy qil1S=MuFb^5/$mD*!J4Re5!CCwmX++V1Qy*>VlC#CF6MY4lkK6F/w*JI$+uJFbLiEWd=l85?P&MJdWb
@VPH@m VXFLml*n&$&tFHX?\#DiQ9%JwQpW4$!NLR>YBEj#l\C6%$n5G/$4RC9AF9Gp!=e:bNm%DVu\S#JBbq4n
TNRi?q ydDB+Em9+5aCP1YNi=YnZpqc>qjpwQD=%*IkaMY@T1*+@/#El1jE+I?4T*mFpCh<lG\yCAjcmD<#eLX=
&?<duV wDatRneA?H81c+V^ZkHhDqED>#RP!>^1ki9Lp&Dt1Xn%tI#FT*wI5k#+ppFJpmlJQ6c<bC$kSaG#udA4
p5MEEb Y4^NMFFA%c?RRZF64lAp>m1t\=iTDZkJM6GYN\dhcE@Q8%Am:G&&J$nA^VLBnQBB@R6kAVY$w+JDTP+b
d*hS=^ H^RRW4*+QKTq8E1W>Re\/4YXc$8nMT?IP5!yDRhBBC6dmEFYDY&WZ<SKHG<=k%HyijVwT$QM$9%#:89d
JpKBbn =QlG?jicF&6i>T9P*pKkn=95LuyEa^Ed+n*CE!D1Dec9yl/Wl6t#aFF:*Ykeu4$dhy+?DWM$kR/j$LK$
Z9?9#L cceW&>#jZRWD*&mNcW5kbBR#S9q<^Ikbp#Yh1<AJI#=G>HJ@&JFZRiYk:Zt$Nc1KhwWL\d9/MA!%NjAc
Xt=!jR WkL%X@&t>9XBAiuH#j4pBKi8\^#$*Mk\htw4et4Ml#LpRlBG9alF?IED6?=G#4!?*8uKj+dPtJHKuqwL
VQ%Fyi E\Yl!GG^5t:dJqJbXK+mLdjSkcPeFmX@yjP!qA/N=8XJpMim4Vu*\PQD5W@Ej9T!:nbZ!J!mkmRVQ&cp
LtjJLb !=R/&S<!1LdB!>ANw?ilFZAnGLLyB4HZbPQ:HnG4FX@QFhR:kniFK?h69uB?*l+9\FK*PItBqwF+LeIP
+C+<D% un8!E!j9i1/n:G?:HaSuWaQZ49PuNpeP+<N>>AkNlQThkEQhbINHm^RH9<$k/&yH4q/Z=8=MuZ$&Ha:E
kNFpBw nST*IYpSWMqTpDN#a<uMZWc:XdaeZn^h1tGpNn$t5&HpTyJ9m==pb:uXB#j4++=A89LhSPy!Wp*RGCwD
+Fbi:j 8+GWd&EqdmhyB:Z$@QmZbD9/?9^ldQ<%B/6Sq+=V<FQlXcMy/6TPcIy6D*Siq*RG<NFS#%edy4>S=A/4
Ww4+99 SKwK?Ny?Hu!HW^1+J1!bb4&K+WCNSy&HWyGaqJhH58l#&!CXLD4wMpwA<=IudkPt^D4PiuS+EHDelXdl
IPAPwu 6@tWG>+hjR$^c8y^IBY1>Y^daCA:n%LBYbtDnnDc4#=M%Ac^4B@wcQYyqTZpyV4iSwkynH/pR=YTw<Kt
^@c<Kl Y=X#iit>yL9%nW!LJ+BK8$TXlXK#^BXDX>5eyb5Bq8Kjby9lq&!/+XZ*cI$84l?wpEG+ETCi^AJ9/BHa
#>GADc /TN<dbBNJmD1S8E5Tpj>eAQhlQ$=:t5L4w9Yp8\BK9c\9+<Tc6yPQlhDTh/D4piw/=K6qV1PhD%$1Kw?
m=?^yk 5^M9/b!A9^!IV+jt4BX9ZZYj\m4:\h?Bauke9mC^e?w+9ZNRK$>&tm\AuBX^+X56p4!9n<9wq:9wpQED
DtFebb S!J:K>eR\CndJHycq&:kc8%@Lwi\TduAKhBG:4qyqGJ#%6KXE8W$kWhm%/X1Xn1W?%wa+@eTQT>e@\4p
qc@WIm *56WQ1p5$G8Vb<iMk#$KKH!k=S@II>Ye^TQMj/YL9n9kln=tB$+iC1VSy6^<RkV&&&*&iZGtR=wy@ct!
Y5Aa/! mH:/!a94?b4u*b^\mTEj9TZP1hALtl#eyd@tRJ4qiN%PCK?m#L&lGZZWlkyj/?+jwQJPi*H<^JlG!H8y
lLu$66 #nGn5qi^9aP88G&Fk:lXY+q4Xaini!8TFtVd44j@YHY=BW&%L#KQyR8m!Y%Bn<\nKTa6<CRSDEj?hIJQ
Kd<L4$ A9wD*W%G+Q=*#M^#?+SE@aXMFJC1qL@tHKDVbkQhNluwA\*/LF4^GjkS6J/F*ab#EGytYmdV?\RnQy/R
pMBB1X D*&%EZA=EIEBy6uI8V:D5K5%$hZJdDXSd>Ri@IL*a8KRp6eLeI!>IXKtL1?kJ%P#lFkG*q9pt/l4Vja9
B&R:YM BSJX%eFXH5ENPW6$mtQTBP:ymi?yA@HWJX:66JAPXHLC9hBnGEn+XF&SJ^#uEnQYjZBnLm8%T1mwkw!#
:<FKh+ 56I9bMS#/1q>lhPy6G:@h*Z4lK4>MR:#Jc6mtJ+<MGC>Y4/&nlq=hT*cVKeFWWmuK%1:Ai11YaB9RIBS
RAbGi8 +L+q*<PaJn*k9KF*BM^jR=wB6QuaGBcSV:BT*Xb%=SuPKNPMNMIC!E5+:8k+H8q@#wGmtTkP#%>d:+Vq
@?J?bB Jt?ZJ9ud5Y<GG%F+95+P5#=4hHt+NHMulYJ$Q9J!dIIjRbY#H&<kLJYi@/IJC9jme**P&Gb?YbGCGtYb
!RQ&J+ uKJIWn@mk6RC!#&Ye<Tjy>t%M8$5Me!XLL$E!*DAYb=bH/^p@hiJEAeM%?/$tEX8Rc4X?CE@yQ>9nJ6J
<qV:9u $!Red@+/JP?D:LCy^Xp*D#dp$!qPD/1n@qKTAVE#^uPQYK!@=G:Y/Tt%+!l9BGFGTQ!:htN8QeTIIY@y
!adJ%\ hYjFAT<KAlY?nA4>aB?V:CS6HEF5Ml>pF5u?tjn$C4t^MJCHelT\$ZIpJ5hc@p^VhEXLy4kRNVd#TG6R
%T!X%/ nA:+%8I1Nm9qlncT&51VAEQMCKNHmh6<hn6l==>WLb$SkjCCbNqL:we1@=c%hKMheNmutcJ\y5YyhCeW
e6:8Bc BV+8/!/J@NjpN>9C/@u98hG!BFT>bq4eW6hHW6DkHDHBL>P<>*\/kG&a1SBP1pjTXYKGZZtT8jZ/ndd9
^F1YMu LlFwL6%akW$FB/YuJn8>**%<ECJnuKmIV?\m>ETtJQAV4byuk/q*bT:<1Y+1dVGd#>I8uEW\Q%T1e16J
-A^n*N 000396321c8001202b3 Page 173 of binaries1.zip
!=FkQ: EEAiCI^G=5n!=JJMimhmEFFl?cuWVtTa@DeaK9/e+JkVjpmBw$1haj:/i11ea8!CXI#H6VjDcaAEmjK!
*Zb!AE @Kd?4Z1djXy8Jl=IY^\W5:TbFwN$^QYm=:yTiX\>q8#CcWt/B$uF@4I!K8iBknQ$ciq%#\JIqq/@\SMT
9/HKeS miAVML!+*\$q%M<>CZE?ADlakWCNquJi!6D+<MB9Ti?lGnel\pAW\A/aZM+cI$Z6lMY#J>nDKiZ/byI:
hnB??8 X6n@T=$CiKVBm/H*9=?e6u#M>t*T9WRTh5yJ:njM$6LN8qm^md/Kal:VX=EjH9D*q@kZ&w!*hXb^GH*Y
A1A:=H YI+*B$*NJ8ldXT<m*PXY5iCjeFYaGBnDHwl/Yy\LYW+>cS=tEypuT>a%L?D$p+C:%=Z*8eW/XFcFJ**Y
w\:NHq 9lWSK<u$6FMJbTIH8N5GjyVH+RCBS55bM%!t6hCac5Bq/iR8uyH1RC:E^QkW$XZyL+/AJEi:Qyb6%li&
KL!9RN qpH8/mVm?A966chhCwdyqpk5bX/#duL<yDEq%EA$h=eE969ES#NVaZq+XT6#R!TPJAX&?$q6t?^4T=EK
y5WK+A k91eC>bR?1W#bn@TICciqH:4Fj8=&LMbT@1#<1\qdwlG%n$lcH\>>yV@%>9e#ST\*8DVANJ1HYNtSZZa
*JRkj! luE\?Bu:Ke@DChXAL5KZ1WiwiF%S9A+Su<wc\y4<IcSCqDqFa<#S?=XP6iEC+h@tEPI#eew%V?MhWtBw
hVMBqk mM*e$nXQNSeuWLALXaXek=%WlZhF&8u68\$6ZRuKm!K:\6T$F<JJIqEh9V#\tq?tIaMeu^H#=Z$y5m^#
^IHSha FF9cDeP/DM!ZTmu:9?Ilb+TQ8ank$T9GRiKZeD:4MQ9N6+RE4*Dk655$Ab&bcpXGC&Tl?X?t4q&TI^:A
JqZbGC w4Put?8YyDj?nCY^RD*1!ckeVN6j>nGm%JD>uDG&tKaJ/&yniwHa@QWedV^Q6HBZqHY*tRqP^Q1%&/Kw
/hK9W4 Nad\\nEpnwDnQ#AEPZVq5!eP>Z1Rymn1F=y/kiuPHe@5^>hBbc:M>i>\wXJwIMNm5VHQw=SZ5c9LVQVd
/lj<I$ K$mudIi?D<\kulQ+=E9ZJLDaY5q5&e54=Y9S5%mPT=YjtnDRaL?Z/t^TQmY8^bFb$q&>e&pleR\VS%I1
=yuZjZ a!dHFI&k9>#V/cu/Kpni%<hVtl9LF?/NNyAX=eJbbd:PKhQZTHk5:q$B+%%w:#RIH:6h%BC5IaM>PTl\
%>jqZB W\wG&c5DcjDcch:t<%TBbdGqJ^=jec@CPXNkbkBnS5ST#4B/*ICCP<1ZC%A4<pCDE%:+YP$HBEHI!qS?
KV9haX Z9S+LnX9RPZL%4XSN++Pm<lMAkdQ<Q>mHqIG\yBtbM:wjXI1c\uHFw!dTZc9NJE9/jNH58Z#HJ*+9/qW
HTRuCd n@5m%PeewDlK5##ma?kDRyK:a8W8Z^P6Bk:5mq\^^G&*PdqNXQ1mwMMEjB5BY#lABB?4Al94:WdYM8pL
$ARJ1X uc\j&YhVSqQJmwaR1m\l#\RJDuG=JNu@Fp1t#d#JuPpp>/!AXMwTNHnN/*dDwH9IbeFAD/JqIe<JVN&&
?\HbdM t4GmcyZY+L8qyS8aWw1n6!+9kKwXGIcHYX+5ct*wXTR+S/<iq<@#AdVAF6j>w>\Xa&dkQP6E5D?SEdZb
9SET4% =8S$C!tqMia@=1BeZ51I6cjBQw4JHb=W?j9Z9JTc6ZjctbF4@Gh84&ap#teLCBWP=PTcH/5/J4#Pb>L?
T@1cZA qN&q#AE1HSP#=QQkpJ&NHEpb^YpntS4FI8dReCG1jNhBnuSZ>^S+Tt5e*N*dS#b1#ct95C%dkTBX:cYX
eQ9eYI c/bFGlS!wKLL+CL86b5tH/5!c6@NGbuXp+eDQeiu@B!PK&8wHy6FiHLqhE\Em4L@BEChqSWk@Kb$V8+S
F#a8Qi !:meX8lA^$%NL<ARVSVMZp*:*JN?R<:k8@m!k&?C@<#6P%PwWliQEN!aD%eR8k@cdct:T6NGu86w%h!^
GVMPQ4 1ki?nSGZ+QRy:q?Zq$S!Dn?TwSy#&=WpX&CQT/H@6ei>\DkN6D5Kp9A!%JqXtnp\y!/=CQ$kmi8K5<H!
*eIm?u >lqdcqh4K:4C5/TuJFua&+pF@TaBnM59+C\5QR5wCaJd$EYhPDHmhmV&%?w+TPL@IlG8QBBA\YHqq&\n
N=4eBJ J+&:51&Em<NXFRY:!Q=+C$F#l\ui4wTEhnP!MaH5X=yjY\/$blT&*QSX8>TaV?Mn6MTjcP5+KeFK**Ke
MEY&L8 =WqB&mh!tu9\WJaCZ*N5umlJ^FitH$TXpkQ*nX!P?QDdn@eDDqpB\NC1GPh8Vq%dRl\EEBYlLZZKeeMa
qhnG8/ ^=Y<Mm&*#>e?!?YFLNXeQ5b^jcqRL8lS!VNc^WeaqJRl6%RGTP?BLKqZS@4@tW4BSPtQHtjSbb%P$6IK
?h5lcE MGu$GKuwRXmRP>EX::X&5MNmJtWQNGYln+tRZ<\\uGMjTGHHAYi#Yejw!:E8Ma!!bj/Tn#QtKq?Z8@nT
km&lSy QhT1Y$\IMNLLXK#jXwuuL>I/^GYnMK\WX<JY1>5qYc8Q!bN?T14k%:!uh<QR$Y\D$Z:pMIGdPKkiLK@9
A#FH5$ 1^AJFVX*NBWF$mX:nKcFQAt/pqSi$y!I?=q#u+K$4\t4ia+L=!H!b&#lyY&$%uaT?T4Z9@Y=pSY\SSeY
9t@d<> KG%B<>P/Z8TKBNL%1#JuB4wGqTwkEE/P!a/Pj@:q&:uMJWjAGy@kGMa5e8+E$8MeYPt%amL=L<eykPN!
9!E@8t Nb8>4V9m!KklM&JSq:P\i9/I6Hwhwa9Dn>ZlRuIRNpHah>>8k&mnk>FK9bb/JMmMYBucmXj5dQlZjYiR
:yC=HX 6mXH5R+^Dj&Wpice?m%I&=kS^=VLHQ/9yHX+5YbS#>QRm/+A$8XIJPid8it/DcZ#EpZJ<jW4nuBMETLG
RuSnLj e4yTJdmCbI9ZpGDpiETc6dBF+BNu<RT$t*Mq<B8nhw:dRuHunFKcQ9b5kuN&GlmKK$l$m9tn\4bJED9m
pSC+RL THyE?>iW</K9/Ni>Vl\8HH^<GNLichTJ&8?RS?M\5c+D1?8TkRR?+lP:hL*%DZe+8c=ETq4w!elYXM\C
i$1#6w Tj$<KH*iTqeZeCI4pJ/eT%?aL%mB!=P//%k*!!V^@ni5^wNJmhl#LXhJM=q!\:u:9NB=qRGnYE#8/qhY
e!1K%= =KB:dVVLc\bHVhW$At:iPG=<Mb?INSlyCm%h\W\+J/K8WXtiywnVb1Sp\DpaET#aVDXK/bV6jKZeb?XI
%ytl\? 9AK/VQnn=wX/e/jSSFaX&lY!w<IPNyiM6lA*n4Wu:@a#h5Z8\p!J@d#<1BJZVla1YqjbpS<n<Gb^SYpy
Ii</>1 Xhba*JJJ#+BaPlML1BX%qQMjtFW8hqHXTldlBC/tl*>j<H+h+dqEu#kVlWnXjEtjLq4M1un4RNk>c?uG
4kMnVM 6Y8^q:SLZq68Fu%CV&D8@be&Z!Bd>+8$lWyFq=YJ/<@>KTR6L&?Jj/C555qXcn!SL^*J^<D:XiW!@:Zn
PayNi@ ^h&kKb4cwQ*CnX:ki!DdB\qa:Bc8kCMZQZ&/^lXV&41dILBJn5h%$AKnV\PBpnCcnCL4ynDCQFMTc4Bp
mDhaN1 S@dy4^hPy&=L*TASe!iN4LJh>HZMI8/u<ylW5?H1?DL^/lGC8Lq!YnA=\+t?/TFYhX#>li=pN/kt+8y^
<:WuJe aJceP!Jy+@IbmYnynql<RF<cttMb:cu^4%L+w9IhpiJ&@HT*YTe:TVyK&At6JP%EEk&41lelmqp4?%Xh
tJ%iM: betY&6c54KV:dJZ#lPmX&ZKFQR%?VhbR1ZpGaJ/!y=!qmdJP%LYZ+8pQl6IYaLw5XGZEwVAyE=&eD<:p
amN6D? JKA*SACX@c$eZ:!T9t6CV&LymlF#<:1$GYDcT+5:kXY?%Bd=!!\6Lu<5:/e$tSXbpRF=HDDkQNJ?^V*Y
GDkwhV NeLy^5DSN=yNPZ#Y^$Yw*thV=iuIit*FhSGHLqj$VGMPw4FR?/TX5@tKdA&J4yWFR1Wbu$wDj%^Gu=NC
C&q8c? mAw/ClbF!8N5%@<6$eha//Pc\6D?FI:&J:MDGdJBi+a<hb&:C8Tt!:lGW9jNHWB?pVa\TV5@QlQaiX==
hD&HcX VZwd=6MlWcqY/l\iE&*\#F:M^dR=cZmX@^!/1djW!uy<5Bj5NnA!HKp!QP<ZCenI8%T%M<T8HG*<*a#A
YG=*1n t=tlFSCFBAeVBdX$+EE41QS9jTqh9Y\N5^?kYR=jVn@6P@^@H8N<cF+/K1n=pn^MadTWFyW@V%qYF1Ya
91XadV +Sq!1YBQmyP1D$^+4KP$X=RYAV<ZA=>&H=M$y8iTD&YRhpBJ6d5=HTRp1*:EXDFCXI6nK%be@qKdXQ#^
$m+4:^ 6=&XTHZ9?nnDbHGTZR<&jLbHZp*Z<c*E6WLL=ZB+ByeF9M%Cu$S=m4ml:keH$*+p5aC<+y1qdG9Lb=Xq
Kq/+=Z Z%W$kj1!\yPFdpV/tE*EPKNh*=lSM6ZSLH4bq%lcVK+RH?*yKQ:INEmJ6F+PhGi$HI69yn4qcQY+nW8Y
MZnPpR 9<T%J%kTdHS4TwI!^w^JKD=PM<bJtJi^<$9P$hR:LCaFZ?pkT\tb$#A?j9CaCD:u5MlyD+pS\#yeJaq?
PEtLpT b$Y>wIZwQm=BN?^$Ip\^N^4JGSbPke&e8LNR#yQHwEX+9yc^Q1tKK6KPR\#R*$>:\+$J/?K55=Qi<#q6
j=NG=# <HXMJ$915tTdewi@Et>PNpp#JYtMNXZaN5ct@%Ml?NJZYtjdM$u8yaem8RymBRW89I4LL*AP1#WqcFMG
:6uSm1 &B8e$yHA>lEyl1KSHM4Q?e4BEL/1jQ?!F^%\w!YeE6@h&$N<4MZWXNJHeP/WH8V^:6e#Adk%+BFJF?<B
cRjX<X ^\lR&Ak\!u=PGZ$D9?=/R&FQV9WAakKa>lMk+j:NBHGchQhHJGE%V@yG\5$&9tn\<&uZquWPATK$<<Qm
pIkRAp q\dH=9V^^miy\n4>uJ>QL$>QlN4Zupi@@KIE!/YV1Cp+!l@YYE=b/L4uVDu1!tYVER8j<EEeAkuY+IaZ
XYR<#W w9N4kP#ip$JKHh:*ul94lpFb=wbRi<XWmb/yS=6jH#bL@DnT8l4LKYW/L\Wje^PXucm8wRMd!GNPDHM=
\%?^CG F4D4#b<WDK%1Ymy/?8XWZEb:8b^>tMekQC6VJPulL^QjhFN=k\V=J=Q?Vny^*eyC6hqM!RIduSG?I1Mw
G=yiG> N%9mM%nI#:V$$jaSH=5b>H<!nbY#=SEG?%JjdK>!S9e=Mlhj>*AeHLTjQFX?GdRWl\/8i!TW::Ri11!H
cyWlw? RyX=b1WCyHK#tLLaSwbWmV8Sm5=PT=Hqi5^TMckZydk^Ftm>p8Niiyqiy9*F6J9cE$SpW#I8##Kb6>K>
\>I\bH u/CHh>wdky9D1jp@pd:PcS9mTTKNQkEqN>QC5pVqGY&GSkIey9SpHp6&^w#J\=XAKQlmQ/N4Q$1#/5nA
:Mc=+> uLY8*eSB&yQA<@tWATjK9ZSYAY5n>qA5DapLa<dm5XAMNwYtNYLZmFMkJ^a9q*Y^tQ!Mn@ST^Q!4ShuP
#w$6bW #@@#cmkS1!tkK/a8DD*LEIpZHQ!NLFQcCYV>DPj@hJwcGR\GJ+:%hwMNtyMV^ZJPdKyRLa6=ATJPQBui
^q&enl qPCVudbt%p=ayj##!yt$!%CKiI:DBhZI<jDe#>KMAPbE/GSX+B+5#\GLRm<qchT5eH!JY%nV=4R!yS9D
JF^A!: !bTHm55KybTKc*la&//Tnu\1p55E^<dt<:Thuau/b^QB#Bq=Qdb6+/!*iV#@^/Jl?tSuuIaDJCXnLtZH
9mQEDh ?VVFtQ/i5@A^H4p$+q%cTl%GX4cemb=SHM>CutA8Z<u@uEVNRiPIFE&1J&$HJ>/?>Bj=T6QkYKeHT4N+
4A9<Vk jkabc<4:NE%ppN=!+An/GETd+1F<mTeeRZ<95BWB>WkVjnq@9yy!!GPNmCCFWqyHqbam<Gu?IEY*5W\q
PY<N@< ?SQ6^VC@/cj8@<T>Q19u6KdXC:#P9?A\Jp@*6ta#be4u/K*>9JI&c$6hpBn>N^%+KQauAq>K8KA$%cQ>
-Aa$pc 0000943bbfd001202b3 Page 174 of binaries1.zip
4lNB=K #unP5WnR/+KP><D@T!tMmdG<PV:y%XVFpCD4GEGXFLBP@!1nc!yF1W@$ik\t=#/jm@FSKe1QcIMJ^w<u
:^XWYH NZ>TSqNKh^kmDGjVb8cbQE^86e@8*Cn:twe/JdpbV89N=^A<?\WP@ntSlDiZTwH^p$^b&N@CWAiMdCEA
5T+hZ> GQLLS=ZVleq&%9H/Gb&SyuXCjHbAwNIByqKq4ANj%nQ\K&D9miy<yl*X?c>T4*?Rl6/p9eDu<4dG%V:y
:I$6:% SeJP*XTt/#VBkV!A<uA@T1q@t#q:S<<SJ!%yZqGT48XT^Ewd+yi5ItZ8bbuu5^:hAb4DTnPbA9NeMFWS
ij+%*6 um8NEjy5=/Rau<P?:IdFbkp>TW%&Hn/tZ*t8$TW9Vt=mGAb>6H?n@S5G@9&=?WjGZC+=aTTK9966@bH?
?i:=N& D@:>j<\9niy9@yj@>h?c@Q#N*\@@/i@?j@@BttEcqi^*@=h*@+hnj&eei:+e@Y:PtQ:*Z@?:Z/jQiZw:
uC?Zme @M<\@\d@M*Jh@wj@!j/q#<qj@@bw!*4+\d8G6ZB^c&6\L:j=cQQ#4iTi<b=cNt/Mp9^Q*%8>4:cTB<Z%
iQ?$TX C?5LF>:6G<Z%laWLh!:GD<5Q:q#wGMdC^aeQl%9Gyq4N6?bIF5d1iC6bKBpLPYNlc*N46Dy#d&96%4&6
T!wDYA LjWkill9Ja@!Y:ei$dPQp6P>%hdc%6dDl=$L%kZLY4mknFu4Aq*hAu%*b?FP9FC=?PBT:wJqLC^einDi
+4LXeC 5ndZ:1?8*q5\nLjN4dXw/?ThD9*&R8ZT%9&6%hXd/q/!c6!Q65!LY>Eq+$G<qX6djV>c49l^Q$q?>PMp
P1JhJP iH>Vde*e8jVkRt+lF^5uTID9Glj\cle/C@Gh<wQP8^*/d9%Pb:^Xj4T%iY9#%myh$P<d>!K/@t>c:%1h
!IuFGq #1Y64Wj*:t&8*41*iZ>#<@:>4c$HY*i&Hn#a&4y$cW9h#>?:>Z=LLXj>^E<Ppu=!Hhh*=?EH%4yqhHB>
eH=Bbd Sp+b?h!FC??1>XN*Fm+?wDh@ceE!e6dCyiFY/j:Y9e*Nd^4GQ+t*1w@wD#?k6&h$68nl=4%::/?&N6jY
:bu\>l +1*TyV6d>Da8*at*C4e&%>=9^e8XG$u@ubk85lZRJbaY/A@Z4R99S5byityIh8Hmya5Q/c<i1M:M8$du
9@tQi/ #5MHC!VP?&9Bbt8XZ8<jG:VE5*R^D!?S4C@RC$CYM&9$>K8d>I#Yk+h$nbj8ZLwWdiW&d:$ZLThJChiZ
bBE*QD >N=/m%:\+aPehYHBYlkc=/*%>b!%*4q#/e/Dm\<jjQA8*5ACZey+1@Swc&*#%luDYDMindhtFn=+q*#J
BAMewD D4@8=td\@841%1NHiQh+GSIwXPXYem>cj8GhQq*cP?@Et/8R<5ZPB>c:/<c:I?MFY4%Pb&HlRaji&y&L
dyXbyA h!+6=K#KHY5EQhueZH&jL&!VZ84lPm5XZehceH@%@1*NVSKn>jDB\+eQ/Apj1C*nph4M4T/@F!?j<=N*
:i@PKn p1Rj^/%XKPaHH?SIp6cIhwhF/t>%Hudm4e1qB^ej$BNi9LnXmcAyY&84Y&9$ct9n4SeiQ1A6ad%:l*V!
1=*/nt Ec*t9e%d>?@h^\c/p&\XcNu8*KHH>*N9BTVE5y@5HjSJWX49$*Zj8WV/hiFh84D18^e/Fu%D1py9<eGh
L8wb$P P%du*R94D?/Rl1^8*q@hyA*\i<qc59XNY4HP\*jy>SbIS?:j&:1%6Zaj!pJ9@eHC\y$:C:RJmt6R=TCm
!Id6Tu *S\uy\?Tk#<K%4a/D#446EE9$JWq%nucAdTuP/STY/TSD!+a%wZPR?!BVhyaY:eY5GTdw!%#*TIF91l\
ZBq$&d !i>94kaB:RDcbJi&H6KQ5GSdt&5j*u6@6H\8wc6K+1T*Tu>?=&KuR%D<Ltunm!SM+>*%m*ikm4S66l=&
#=C*Li P8?8X!+6*Bq6Jb9Jcu/LlEnwpZ@++CK\+MEh81^:n?nC6l=FJCBc4keLq^=GY@qHlAPn=jI:MTulP*6H
R<MB4$ >>=TD+8$4WuuS<bL$ET/Z%!+<@AlBL:\+F%eETqQ6GZem:j!>?tKA8M?\hRhbd\C@KD4^HLh8$<LTY?L
Z1e\qa 6Ip?d#&+yLd!1+<&k>F!@y&D=B&XuIlZTdl*CADjZaBcqKGCyH?p5nHJ+GHu+48=*KYLD@yd!X1PZ1XN
Tq$qyA <8jXkPT\GK8dd&&8*l?SV8KupN#MI:4CY@hc+?W#j9#n=J&>?KD%F4%El#V8*ZY5#<\FE8Chm\TA=aip
ik$H?$ =Be8EDSiGt&XNl@h9@?IZtRXTu:&Ad$u\lG5Q1uA/1NH6K%I1^:RH>+lIbDR%qc^PHPEFReJqP=D\1=L
ltXkI& uZh#X5!\qL^dY5>h/F#pX!yBn!%/yeEY5AHZ<lc>/#8hntWaJBb4p/RFdTP<LhI4ZLy#Mhw1*N@ec6$d
T%=9b: LS5*+?RW+hEj4c=6ZjmAJEW4MnJteqduDmEJ4jYD$l$C9e:F4RhH@NT@R=61Dh96*ZiN>RX/i4ItY:BE
p#u!I> $hdym%AW1A6>4N%:d*PIK+B?9hM@84>&mWC$e&E>Nw4a+kRuF\wQPk5QTKE5EwmXI*&=$?QZ8IpFy$%&
RGJ$&@ IbinBTc=$=9j9L>Gi*ctR&1@BS\wpBK54R/YZ\Ce$wL@<Q*:D^=$LPkX:VK!GRnch5\HHh1Jq!+TkF&+
P^!LMX e?e=Q@6@N>1!H*/\j8HT9e$%LAFb1nXAD!EV9jWHpA%bnaDi@D9Jn?t>J@G6XZ4XB?<T85Sp>a\LFn%d
kuS/i9 l@V8Ad*%P@TmlC<QJ?J=>V/y!^$4X%t>SV1/hY>4<^H6?M*:4Kap@@FYph+/Gaqw?X!\9P^nkRtj:^F5
YmeeBP L%kXi9?$ucAjF+^Pn5\PZWD!5HnuR8:T\wJe\N<jdy%iMD4jl$q:n#:Y/NuHY!c&RHLJ8AQb9B@e8nhe
%MSH+= Qu9nuZ+@/SMt9>Wm>jukZZ4ch&MnS$<iL?VyAkBVh^/Rtq#e8mn9@??Q68aYHn+$Nkun!Z!&6kBWbFRL
T<+liG q\B^yEAAtu99D=b#N&KM1#pw@NE>&qVKMlhw*<!R:d^\IYiR+KGPyReZ**%*kddAWj1?#!\a/=8p<F6p
Dd9NIC n=hJ/#>5Ldhw+&KHndaK9L$I@c:HbLVtj^V9Jj$@Y9*hB^e?iJAn<$>QdbBGYB&4<+B&:e^DRyELC%lW
jwQy4N $1id<hb=RP!DC*hc>&qb:/@iYu:4@4*4\d**q$p@H&AZF6c&*k@i\%5u1=Hp*@tn6VX%J&h$5K4ER&pQ
S@YQnC ZZkIiBkR&BRZDI5&eG<4j\jaMN\mC9D>VT#m4c**q4e?DNT><1%:!+R:WHiT#&b\:#+Bk^Gw=bQJP#Gb
ljuqZj \j:S=9&LH%^an*nLqkkl4QYLD<lYtw<&&cbhMNa:lC9$ek>#SHD?4/P6q#wQ4EjE9?=@iJ<\?<P*dlHK
bT=m^I pdXhjt@4Wu@L9QW?QV<b9yQ9^IC+H^@h&/R>epF%qFGB%q<k:pC&qiRJ\^J9#X\p?$bYiLBXJPbDq*F4
NV$<4+ 9HZ8Ieqw<@%NRn4T\PX:H^JD8pX$LH?@hS?cTV!KEC=cN1@jW58ujuV\I%Kjk^>94yGS/8VGSwX$ue^C
DX/je# nnalZtiVaAZA%dqAht?LSD^DQ/j4M9#SX9ZByh9*%6=c&*y9c*Q=?4**:&*h8@@l?<E>+1w6&JB<K*mQ
$I=5\n F5Q\w/V<+:&*:1%*P5c:yEP#yCwZL5B?p#Wqac&6^qkQWq%/:n+y+pYaBBCBiP9ePt%mY8!%i^<8*%wq
bcGFWN $N\mth$jL&M>mQdSD56hZ/WX5j%?@=%*j6V@$T*ctle?IQkhE<aSZdl#pYC>RD1>Sc>TJHt6X!1D4Sp!
clPQ*q C*jwKu=*6QZC\5Z9EA5l8uQ@X9DYYpCYb&&#SXbGpc!I+6:/pF+nYF$qaju$A9$j@Zn9+:j?^pKq\qB^
k5:p9c kWnC?wWHbAMi\yc6QdwH<tASb!A>G+PyE+LV$9<nE/#4:J%HSFY*Nq8Q*q9iDP=9Qhy<9*X95E!Z9=y:
QE\yuE 9$WLu:8?#FTj>6%i5j?nj:Z=+KImmmlWNdFP4GP9Eak^dXJE+te9YICyLSlZZCnbc1a?!aP#q#/<@@+c
AT%ZbC iMl:!?@V%d>%j&$%GC^d%:i&kpid4jhchFu*IdwpN941S?WD?wWHF>hy<bXSZnBwY?PbmZt<ey?y>eMP
\*WTZP 4C5+&laSWCILh^:I9nq#=/$%&w@$nydj9*@>$hcH6>=j:T*QpF/<%h1p#b:dlE1e@wQp/Gd@^@$j:n#/
@JteZi Z#yEAT@ESM!IDbM*AY8X4J+kGKKuIh/jI&t1LbN+:=*e%1YF&Lk%&n1:<Pn>D?@jI1y^4@ZYLdC<>&?>
EuVH!R S/>!ja6IYECT!:@Z89Y?Ynbdmhw4@?#HN@<q<c1PSZ?eYK?THm^$5CAkSWCPVZ1Cm^>$/Hwi*uqAymb=
DbC\>T tHVMl=iWee9eIkk<<=B$/^GB+%c\@Bbem&B4>ju!#P4>i^@id>H/JNjQ9d>K\Q/ij?NG@<e@/@@$*9<G
AY!H>X k$?GL*p*8XD5kAVV5!4!*:cI*M:eMZIX+qtpGS$!@yei4H?knN<bd5*h8:>&j?9>6dXk?SaJ?N:>>?<>
J9a%M^ Z!/<hc9%jlA9X+QYY89i/9L%6+:&ju##b?<5L+Q1=Mn5\ahR8S\^yhHYQQq!n?D*pM<G5$tZSTV$+Rh*
&F!&/a L5In9YZR<y%hwKXbJid:H1HcGt%u+y@B<?XpM*h4Fc>#::%H>>+ntLm=@LQ?#S@GS=9*LtB=qEF+?T==
I=M:nZ YSjB55@hIlRBAaWHSS:dSZK#:5BGL>!l*%dGK5q69GXjZ%&q:jQlw?XkqTke9icZ!<p6<#+=aWt48w4u
ti!wRc YG:h89HV=S@>eP>uN:EGHjl?=R:l<5L/\lb+&$64bFNZGikNM8mZmGJ8phIVXF^kSbl:6Et@Rhi<8u#n
IeWR6N y:TXcH<iLX>yLRPAk9j\6WX+&u1QwP>HN&:8@imH!&64yG>kDGSj*mZjn=+6*ywupbBiQ?IL5uIRH6q8
XQjtDH <pL8ZCSSK8Q*#AjE$5/R!$D8C:%G/$c!h@*?@hZ*YpjL*\#wSi/%Y599Zd<F*#P+H6^j@8HNH!*j*N5L
@%6m1< Hn$pt$=QeI/<lui6C%9MtB:hy*%Q8LY165=hyQj\kH/MnRTj<\KMG!:5?/9*:t?%68+9L=QVe$S:>Qyk
M9Em!l ?hRNi9#D=YXmK?@l!8J:>9*kj9C@@t#=l#@:IX*c%t?9Z+kMc^$ZS4+!4ek<!ace=jhJ<&k9hR\m@F5R
CynCbE H<EGA4jG:$EudNyJt$SRN6>dj8hHTW!dc5Ai!atn=jhcyCh$C?=616XCc=Y8VN$5?#h@SQ8bqw6A4>Sb
1$T&L: MBdI8NEi9jBwc*Z6@XZcq4Ta=Hbc^EEidC*R&m&R#Bjw\9+b+X/$NSeR+eI46yaQ+4&n?@j89Vhe@8+>
V+>9&! +pV9JEh$ZhhZY/&*:1?&65nJyj>d9uHnS<5@@iuc??A#BEeYEa:%h?<5AGNjY>&CIpEDHua?MD44HZn>
t$E#8a SC#Jw#eR4@l>A#8acMd1QaKMS<9L^E:@/Nbt$Bw6F/=9?Rp+#jI<9bQX+MMYtc\Q!i6iji@t<6+!4iBd
wP444w ^EbB\W99$6NXPujII$+&T<ScTKe&5ZwQCb$8LZVA+#5ZP?B\BIL@%IR*a:P8*KL%8$F$tECK49HZCZ&J
4!^le1 u?E1q>>jZcc*@inD#j86>?pmcXX@itQ=bt964R5EHiR&Rn5@YKA*j+He+88*AA/puA5ZLa8Y:!FeB?LY
l=y\+a F/\KZiQ9$SIm:EHi:N1H!@+:B??5*t<Nq+694Y:hi?>uKup%J9NCKp1P@B1JFDyK:?1HQ@*lnde&cSXy
kS$NJ8 J<F>#BHw*cE6>>1n#e$Y9PNN&6RpciKBMI>+QaJ<\yHj=%?di\Vutj#?XkB/hT@ajG?$jQW/Li6ceIM8
CWjmMF eZu=4hXq<wly1Vj9$R8@6:#<\=<8@\\!jdeDJTjQk#^Ji1b9Q4y*@%b4e:Y%8ucLDa6FHlb^AZyFlF<Y
-A/KY6 0005a7cb308001202b3 Page 175 of binaries1.zip
w64!98 TKV@uACFZ9I>Mq1*Yq8p@P@5JjHt@Z8$mm<Vlu*+cQQi@$1:lJS%:Z%EapAH:>*:WC&ZTcaEtt8<nEtu
?^\hWT cHR?/D!At*\jF11%it94ET*nAnp*HiAKcACl*Ah*YHQIt:ZZdu&+?amZpj!CZ85SMaHmhZLc::?9:4$Y
$#4&pN JQF%RqIT/aipl4Ty6!BaZPldn@/*h+tyGTZC/IXeBXB&t9/@SY9>jw96y=XVC/eaaS/R$q!w\H!KbE?@
i4Q+wi V:cQDQTH!<5HQ#=a99@YeQtX%4%HCFi544:@*n9L:>$nMeBapHl9*d<Z+!1Z/W%hJLpTJ/jNj/HVIj8!
ubh&WZ RN8R@9@DaQZ?KpJY/\a^/eyFe5EYKmV@DmnmQ<H?KNQ%9R>XZF=YTZ=*>h/HhJYp+c694cy:!c%p?SSw
/>\pey KZa%iW:*:\j$**QZ*%@LZcA>bkDa!I<H&u!V@mSayY6elRYDM$D&km=^\j1kR*IApj5ZJwnp@/?#>\>9
GN^e:Z 1#4VSbhpP=dq@HBMuEBCmNkpnc\RtQa$6Gh/Yp\GblJVVwQ46bY6IJLJXL9SDkt$wKkqa!S$ae/PPl%?
16:yXa NFLa/8FkBN4SZ5bJB*B!TB4C/Vp>6<P$=#IW&eYyMQjeRmElecDaTt^4:@6?Y=u#*Pi=#*Q@8NNPMhdT
W*T4j& Z96d*/@*@hc*qn6KiT1K+FEKB/u?\FA9<%X+XaPYPq:KGel%MFMXyNZC/wwTX^B+pN@lAq/KAa:WDQMl
Ni&ZAh aCDllW\nB#AP#15l&TG$F$tXk&Za1y+XbD:E:#6Nw1k1jJ?V\c1c\YN#@F4bLBWKepTN=TNaZSIcSpn$
/T^d=c E:kA8Lk#\iYCqmb1:RPCwMKQY!l6^k5CLluLcGED8lV$A+4yYSm&FCkY*aZF8I+CME@eBX*d1S$yB#qZ
&M*RyY GIXaHlEEqtWweRMaFuFPEQyDaJuq<!9\wcLp^aSi1BP<4!:cTjP^9IL+C\wD*AkZAXky?wCl$#=@$JZS
TYkZS9 R^4wKMF^C=SbERiePpLCDL>KIRhDCMqDNakBeZJJEBIEjd!a#C5&VF4VkL>5muRIuY:J=H1<D%:jMKBQ
5:<Iq= klSWV9bLilqK>+Jj$b\Q8DJGpIHnCIl\pd1V!FNwZc#t+$dMkqcRjIqkWEt+FTyHy1FX:%BM1$kWlty*
VlVbXa AbBp%%wL49YwMVl\AemI4DWwpa#I\Zkq5l=m8+6l1elyTKI!H=mwVT6p41*Ai!BP1tId4cyBZMA5%EY4
munkuT Bt^uYnub=w9DeJH+IAY\NL^A<lZ^1B9wKVA&LC*FP!ILVQJKkIIB^GC+ym9qp1JdY4dWTC^ZRB^#uIFK
>Q<<#d DuT:A:/qeK!QGm5wcl/!#aA9F+k=&C+^hAwiZdLbVV+9<uG^pj9^8RyN8D/mEiaBIhY#eBEj@XQRlN>u
ptR+Td YQ+PF%>1Xl^SIPY<m/Yb+b%aHmS?4mmFtGERLm1AFBE^cnK=/pLSDbawM1k1ue+k%%QlD/5PGVE?Dnpl
&w4ElF a=F+1PRY%lpLbCAd@4tup>Bm!dDmiDK\ahmyV+^iInaF96MYA+&D5!J*REDC@\a\ZC9RFW\nA\Fd+h8B
PIyI<W VIne$X<\ZXPN=W1GZZDEXV1mnp?T\QXk!5GGkFwZeAFm6JGQW<dm\BwPZAEJlIFTi?Ta4ZymXk%8hl%<
=#?:A> I+i\lLk1Y^a\II\CpC&w8?nYEuXnycpWIqSlADZ*MiKSpkS5=!h+n/u?Gm8bk!<ZaFYaCQ!Ye@XV#mKA
cM6DH5 M+WIaN<$:MtRCd=#Z6DKbB>i!hc>SjIBCjBCWSWnqpN$MF$WT8#By%N>Cd#HLaw!CVbJCThGwa69^>Ky
b>u\kT IG=@knbcFHe*aqyeBWcb!*N8AN/aYDQIpe:apmeIu%%ITSS^kMKQElN\eCjRAW#qp^Bhjhp4k8^aR8aV
WuEC\n %$#RENQk@I=c1y=VqE@=QAYAHpm?J8aBBXt^CQ#LK%T\^Ht$G1DX5/Ih?S\tkAAC=<j#>ZbAijkj:S6J
G@mcmL \WaNeSj=XwiKyIl%\H4<CKRVC@<yd/YTBEIA@IulYe5RZlDQkM5KlnWI$JQ^FTYpFZ^:hRFSqdJGu4bE
k6L*p= NK1LFh*%DFC?D+K1Yy%a5CXpqWbe1Bc!we^@XK6N^YV=M+S*VlMX=wT*VQ^+cS\Jp>N@VBYWBpa6/enR
qb=yXF TM6iRBk:%^FD9NCwIFDGk1aHjZ:d=*Xl4!8QE*Ikn<kXFI4=9M&b1L9!6CmF8KamAnalm8Fln6pX!?hp
yjScHM te8!b8lWFkL<wI$LY<#Hcm5\$klM%anbtwPqc$6LXL&lwpnhuim?1$mitBtBAYBX=LcJkTpP@NWMVDiY
G5%#*X 4HQH<JnGbR!qTt?ZXRIWMtIemaEKeZyA!9wq&um\qmB$k:ZEDBp\kWwWSXw*&>ii<j1AlWAJ5Znj5<Wm
TdPB+* BQkTk11AV*mBJiGL4IJy\5&JcyVTyKN/FhIY=JQKM?I4JXyG5KG<WhlIyXnpD4Bj<pBN\\4GEHhLMCHb
ZP<cV= *R@DbAF*DRmKpHnjY\^&amA^^uMtZH/4F?11<RYXcJlZw^X+E*#Eww$tET^VPaIAZWupbJ4V6Ac>TIm5
<YVtKR CIhFwKGed!HY^k^deZLLBKqPCkL8Au<lSyCqW>H<keXb&qXDS5>H\Et&yqPyKekaSZKMnmZABanYGVKF
w:GtMD 9yCh>SdL!EJhyqBqplKjGFTS!kC$lwKWP$%XSt:k!H!^PpB:e^aJSThL$cqIR=6D*+eV=mQAG=E+QK8Q
ulT>?R QXjHi6KcLkkuw4!TDEPV^DKS?M9N^YCYaHqZ!SIqMD$FMAFPACGS@!tu4IT4AY+4IFT=jA=wn?waFJQT
nPJ&N^ !KG$/>QpdlI6LyI*I!duaJ!^etDX^NRq!BiGDm8aVwdXIWj4BINy?\!p&<\li5SWuw>4P<AP@CB!Ia1+
9MA<&b RJ/twbRRi9J%bXGnACApZjL:G951Zpn+kBNcAuY4S5:%lb%5dZ$K/^m6#HF@FbMtZW$Y1Cw8$j=kq6!m
hI:nwq E+AJ//bFVCIp$GJbB^lB&I\yPX6y6:Cmek\lXBQq84=kEJMC/FJWly$?CJmCPKXwMtZMZaE%VwXD4ETh
V9#+?? Z^Qqa+p\l=A!pk4buATRtA:C5?5mlMVPEY>q&XS%1yjmW>1PA8M6EV#ItVLmp+EleTy+W6#JWAt@mZci
L^T\Rn H%wK8$HA6ZLkE=!u$=/JYnIKaqZu:iFpFQRjPBuB\Bd6IFAkyZ/J!4>E/q1whJ\#dLWdpS*yPkn8A@<A
Tm>6un :AZb+HpPbyGHyT6WEAcFDlEFt*FZ>u=HLLH!5LEaFqjlTBADFb:Ep5:!NlAi$1Xm8ydVT1TW65*4+m1p
%ql@Q/ C$\u!$4BRLKGZYVJ*VwBB?E*mNM=lj!Ht=G+LbyCWnHpIk8XuANCAkAl^<bXtIt8T<>XJ&A!YNuq+MqJ
lIc\=+ X=Zk#9TmYe\HVq^$1=:4+G\=^h$c%IyMwqw$ib!qAw?YpJyk19pa@lekMaIe^M4VwwuC>h/qSYFSbX4J
hiSnFT \<S+pQti1@HpRLTKXa*!JHhX1RmnL9!IN\#^R*I4hy$F6@CC^^wGIV&aXbuAC6WSKB4bMS@Tiw\deR5J
19n#** 54WkRC$w*GA>#SIlFmJhMnn@+@XpBY+@^&?yX118DmujRR%b1mpE$uyIE8+&wTnJ<D8pEFDIekAJHC/G
hkyMkh 8J&48#5M*4!MTNpEE!4MAKbRBRK8CR$?TBwEFFDqAq\nE9B=R<q1KlqP$8a>/GPChFlREWyCAZk/:iSq
?EW:un cJi1p/1QK8Eq\$V/<XJhlXJGuLI@6A+WSL9^5piN#+pFFkIw%chE\i\pj^RiE^T!A<AKWtdVLD6Rm>cu
e6SXjc 1lWKhHc!JWy1nNZFAwt&cIE/AEpSh&^1Q5kBBMbAB?tZwPepjJ^&cHIKW9>CtE/e685%FXP1tt$&jGNb
bcdwpF TJRK\CA!ldkI$J@?uPNMdE>l\u>L#n>GabWwHnWkIJkBi:C58:DI+$wilFR^CkGIHk1X5$XlT5AYYi5!
X+><YK q6bt9nW^&e\ZNyXlbu/i\$A\twb9hJtEclRKPq8LCQIq8GR6WTHPtwT%AyVnFaXH$wq:BAmbBuZAKR%5
w+6jiS Gp+R$\w1a15@wCM&5QR55*q#VIb4%%pLw1EY^/@c1L^ktmVp>#Ej1A=6etCFNB$lPdThNqTu1BIALTaS
/tL1nV k=RCWmn65Z5qKaTwS9$RMNeqJkehBZ4XAM$G5>R%Im\<u4ZNedbqnuX=PD:8wW$nQi*qcq\y1A%Fhlqc
Pt^&n$ ZwEe4wlEPR?qJ1b1A^Vy1qZpTQm@K5wkVqR@>YaA>DNWTNKYCN18Ak@Ia:pyYTHm<B$#dI:d:G1wt*ZB
&i*F*^ luREI1lBMnqmDCZHjbkR<T%tAm>#4qF:kCl6h=^WHVJG^=CWwWmTeYES<\Gcqh%>d<wkC+p%^QKG1TFh
JJ*bu\ \j*uSHPQL?B&D1!^?dZ>iHiE9uTdHM69bIlV\FWYWhRCXQpDS<\#+*Btu4h=?!+>VV9#9P:kQ>!Jjkui
8PJlL* E8ZEuM6bH*X?bCWkR%>ch\pQ!C/R9q4aljjBalMLKt$CmY@K?FkdZHIH<*u6RJiQKZqqE?&qamW59IT4
k1C<:^ $!RtSkAqqGL#bTA*aG<mq+JYK&+SC</b+BC*R^4E<kLYbEMBK1hRM<hCE&mawP?LL8NB?GqYhnAT&JQ&
>!MPSC &L!D>l\R5ALyLmYY<TENkVEmRTncaqjkyS^BPpi%X4+#EIC%CC8Hlaa^La<m#AIh=/kVBWCch9$SpGmd
8</W>C GNF>IcJZAcHhjAb<BMuCFmGnlJqaPyD&Mdk:tLR9E\C4dbGXVZlVQ$C/kG5Y<qeEXpW?HqP\$p%qLKM6
wmWk=N X8S=$uH1TAqReCXMyX/5NH\$YKdi4Yd\BLjEXABjR>mNcF+jwmKb>WyqF$IpFd9bX/L>wBVRRTan6ZG?
hHn=BQ pYA:9Cyu^=4mDR$9BZGY8XWA^SSFL:XqkDNlay891EbJaJp1AWHhB@^ahCWHX!ce9MAmBk#8YGckikAJ
EqA=>p 1<#aIIkjRH5/9b/@lWnqBStBjnkE^yLAAX1BX%TKlj6<\wKL\K<NcBnB^!>lwZq!P/p+^puDFbtA&!AL
5KN$1# $Nb4T^uylNLqRt4PMMD6u9VCq+ZdJMA*$6/aBCuZX*8wnTaDYl*wl4lbT1N+c$KI%Fn%@Xbl=eHyid#P
QMl?4J X=X%q1FaB:DA1V4d$K?CeCmF1KeD5<K\M^LC$ALAC/AQI:<DV/dhpJXtdAiC6L8leDnbw/h%H^K/=Ijb
aXCWJF RFb>V4TYCCXD$wicIJl1=/R<YH$5C/\ATjMIEeu6wCblWm&u*Y^1@KBYnK/AV!eeEwKkwLp^c>CZeZH=
:CLC=n KnW*!NkBRGPh6XTlW=aBeMq$I=D*\D$+NZ/XpCPMS5BaG:ERk!qi!LAuAHHVCFQ>N\WZe9Y1kKwJiMC5
WBt:Qb 8KbMbDQ4>uYaAHCYwcp:JK4IbpuN!p=JcuNGjW^11XAB5#9K5@+\QKEZRZV:FKa>nElI5mcDpDY9^Lk:
>Y*6dh dSG\wCmRZ^Nl^Km/+t1X1:VBF$BpY8:8GFBuWAmWDJmEcpEGwt&SjDJk=YM>nHW:$&p>9i:*YPdAYth1
<jHl8a MPep19\ZYKCBAXhekELM?+NNw1T/JIN1BtY5C6#YCEe^IWI^h@Y1FpT\CEVmSmi!a/!*nut#kLI^5BI%
Cm/nFk ujG=DX1lPAjtjZVAqym$d5+dqQ\\T4+>DHm*1SkW!Rp<akm<WY*+#*1b/nQI/Iwe!nK@L5\T4&CBicXK
YQwt!y MAu$H?qXS<CthkkBp?:Ce+8Ed<GE*bJ%PyANCml+8Sud/R6e:>ly!dj8B=S&W%Yu+nnJC9?Fub&j19jm
w&#yiX *T9ewJZ?+W&mSD5ce5^h/TCnelX*FW^kKW#$BWaFB8*&/eRNY*\nwFNyNF8tjlJLIH9Cqw6864iMHNna
Yu^kyL w*WdQQBHq:#\udw#+NRVqYl%w^RWKahYDaGJimF@CBiTe$CNAFa*S5y+%:LI^/Kpa!^$Aq+WBScBd*qJ
-AF*T% 0003f4ca95c001202b3 Page 176 of binaries1.zip
<H5#6> B/ayTH+pHDhpFLSC^DLW:!BHbRp+4VMN9qQ!6$*<Hw!\>aFB!jeny%y#wlPyJQ<X4CPb^N5NXZlBIcQ?
1@?%kk K&HKeiK$$HJiqBpl&h\XLXiku+GKHIENW\a1CIAJWTkZM/V!eqcwtwtEakn165FcZ\Z#R4b/6H+ScZHw
5*5H>\ EtnV&64FPhdyGi6F#E?>F*KZtl5RiN<6MK+CkLq4%HlQL%anqtnwPIpFn%aWW^RHA@/RcYIk6eiX!=IE
Xcp$tC H4wA\IRKee<\u?V8Mm<w^JFYhGpm4i8?6Sj6kQi\R>N&D@\CD#&?liy^WaSITQ5DL\#En6*1q1pm$HAw
q5KR<$ bJX!DR&V6NW^%+M#Z8L$B1ABIF5SmaPcM!!D6tVW?DMBpFM*XJh!P=Hq1Tw#YH4L#unZVq!$>dcm6Hb5
:tjRP% E/Jh&p6PuGk+W*KSKEZAuWFIcIelR#&lN@BEaw\WHK%C\$D?WKpQ1\<mwiRNT+TRa^A4=q51?FPywA#/
kKXTQE jWYh64EW95uh/p@4@qX9B+LBw@ZQ5L/l<8GBN!YK5\$u#49Bw%ZEa\cQ!Vtdj#%CShtRpHp$mq\QYeNl
ttMytQ &BdASqHH<18!AbJGHLRMhq$RwRIw1Ycb=yNycukKWh>Guk@1AX99Cp4y=*/Z>Z4ZPlh%QbQ^4$65LBQX
uum@*y dV&ESPPm=F8E!W*+EXG4TLteyyJX4nIGhJPIJlF8wlYKHdBuE$EK!J?Kk6R=lNSD@RmYdVV9wLL%uFly
Dn?6>^ GdGhkc^Zwn*t=*+HVHRW5&bD\jLl&1>EcFc$Ql66BI+HY&FWlCDlSe5n&a#dKMnDWRV#MiAdV5JTVwD8
plK9E9 DGJy5RJX^:Ht?IYtYHqSmK9WWqwEwF5S!?&W*CdLRDb%CcBu:eSuWuC\KQ&H/C?!M$A*\Ib8W9lLkTkX
>q&*^? I+An<$l=EC=yGd^KZl:F#FZmAwJcl$FbSD^PKFXA:p\S%CJu=kZJ9wM/h84W^YZ\Vdc?nHch8qMQB*Wh
eq9+Q# ly\qYL%&w4hIQcG6TWwKtDdSVKLKe*!?HCqKDPqaR&BM&8G8BIANBDXwPjFdk?j^DRWS5nnwDeF#cL@e
Ih+j8Y ElF%WKJiiG4?NFY?5!+6BaBh+%#TA<XY=@8RW!<iuuw#SCHWb$Y9yITHqkwD/eC6YjKIAC$IIVAup6^P
k^WG</ 4I<t<M?wVL9n5DGVKD:amkLWnVYWC+Id?d!1YkdX/M6bc8w^etXdZ^IE^D*pVGi!9lieT@=k8Sk<qQ4F
4F@1cV nQDqckuF>htH=wpTVRnt8TlCSmAEbd%1FX#Y41^NJ8TaEAFAH+McFGKtRtZMRc<@FnjA&mJWRN&SKbjh
4<XBYh #1aa*&qLT#NT+MD&&n/1d$>MIXStm<61t<w\Z^@^N+XR?pNipD!d?&K\Jpk//KN8WPkVcV+c61QBC9YN
P@q9Lj /Pp5wlQARS/WZ6P\+AHkH64uh%61Nkdh<5<C$+n6R6wH#M\=1Yqdb&ZdtZe&G\\>q*y#X4VqpqVawAdp
L@p@it jdBjPA$u9N1tFaNp9#E?Xp<8C!jempRpk8RnWep*Fm6SN#pIZ6pZ!HGFk?YdEeZEJAB&nlZK<+*FaMlW
Rj#/&! iM1y%bGRAq>*HEAi@dupt>A/\5N&K8kwXCn+j4PI1\y5!R>Q#dBm%4Kw9NTeRLyL&6\Ba9Q/AVu5QKNN
IIpT:P Ie1AZydNkZuC6LC/P>%&yuYkWd5!tRQPRGwmtSwwImt$V5#=BJK:5\q^PDGY4AK1GCW1&n*WTmYGuP8y
uGIbBE dSESBB\XPX/yX^hX19CbcmXCVlITttw4:c158ITw:NWQ&>^YYtT%wG+1&quc*btH>hwbCuZQPe916X&5
Sj%chC uGYuitnVP%Z>BhAAhZqMkPyGTKiJ4>L&y?^8kjCIG>Y6iDlK?<^SK8F^mk/D@1\wWSh44tR1iR4JkhC/
E6/Vw1 Yy&*$n/eWccYeV?5GJ^aQ?A+Nd8/eKJQ?IPD#A5*:S=I9ktHTqYuMGqL\cDXjjAc<qVMmiAjk!X=1RkM
qY/GI= LJGwX5jtp9P=ctLNlYY1dnG*K^?unMM!=XThakj%^tml$I^aX%D=ntLS1w%XuYT!Nm/B*IHA/eK1PV5B
*TGXtA >FLPAMa4MhZhcAM<=4Eb94CRqcl6*wAtw&FT/wIwIbkklZ5FP4hXV^!Wd*HRG+J^%ty+T$DXb+yqjbcc
auj+:G hLkIR5y/9X16dh>HHdn%WHP^=A^A!QqJm1me!w5Wn1+B<+CRM6B+QkKekuBjewYM\u!@RPGwQIlem+\A
i/15QA NJtL=bFqk+PAVw>QPHY\IZAi9P158NEW5h!8a1l:atA5PSCht6Ky=DcI>#qW1@%Q=MbpcmJS+VtnRGI?
cX#X99 >Bem#k%M/VyyeSAB4RSSkj$4XK#E&&pmC#yTmBZmihtI$J+R&XXYlKkH9eyLbpELZSa4qD#jthY6&wRD
8i5TqF *FMh$CCySQlti!4SC%FVWcwnp^E&9MWCRkSbn*$%Wk+\\m&eWl1ai!KJ!E9/C\yVmep^R\cdm\CS/%=k
nuY%ME ^8i&V#lJ&mBZ>W6\RaQpHJkKX+A4w**WyAEk&X&jTMFB4jAaXc*!cpGn%b%HLF/lCNmSl@Ml9ly<#NWw
qI:Yp8 D>6<DTJiMJ$XtpqtlttyBdIaVQ8L=RNX/yEB>VDISTZNW4pGRc6WhiVX=GkR&D6WDJYeY8I5bl$a1Nl<
aWlh>e u8KGM4d9#&BEXH>VZc#pI=RQ?E</SjCFq$KHSRd4WlTZuelWK%qeBFQ*by<n%=ALPXZLbthF\LS!P$QT
9uY!yX kX1%Rt=YHhmJ\FkY^i*X/5SPVB86$FbLm!FI&H&*R%lMCY!wK9u5IEA+ElRyhT#1XpnBhcnAE<5dMekc
MymT<4 w/%Q^H>1Ebc/J14PRD\GcWNpT@GewlZFP5BwR8@k9pFEw?Ln#5BaqNc+Wh>%6$:emyeZ:nQL9/1YA&uZ
>&k!XJ S$uW^BkW/&I#&LSyqKkmCW8I=T%SLAe!\c#9RJ&PGST+Wbl#P@yd6hlP9YmNlij+!tm1$l5EIA5u^&wJ
A9hu+L tJ+F&+Z^tyyJW>:jnRXG6pBAWlRbpeEQB<F:AnepTFRKS<EMjmjuEG!yXpWdEtp91Hk\ZK$::=c5R8!T
Gq:EQN tGjpMK+WuiW4\##F+Zp<Xc$uw#VjGF=hnWRK4pJ*PeLD=Xu?lX!?4INkCCPZ?FeSPVjlwek*Sq!t:Yk%
iq9Fwa EpN!YbRFt=GC/YE/LXVI^\1ZpRXXw41\&qu8C%it+HulY6K8ZPa?CBb*%@J:MH@ctiMWc=W51JpkV5G9
he\8WB 1JDcmI4kd1ccn>j=5l!lQ$Gu<!m=6\@WuJTm14HInQACjh4eC/\/!?euBmd1+i*PSB$wk>9JiRpkwal^
YHdI/# =hmG=wkbHqBWYSAhA@PmJMLDEI:LDeGA=uM^5K&IRqt#A&E>uR:w&YR1=a#GnWKBny1wCtWCLKRVdijX
jSQ%5* CchYuTI*^C@c!E\$N:d8IWM^nDyjJT5=jVBD#c<RNR49n=Kh^WZY=<i9DNZt%<kALwdd>EFc<\cYViCb
?Fe419 wJl1bFa$cYa8N<*>kMV\k+GJkW4WLXq#j!!H=T@<1%t!HF+w6nIC$lAk8*in1m6cBA+aKIy+uly%ubmH
$yB*:I ?mAZB#QWai4#6k%MPA/mnYHPmw/TMYn^LI>He94nZM@JSV8=:Ai6:^W*NH/y=YT4uH*G6ETn#AFQ\BMZ
AS\nY< \>dLLmE5GG=b8+yk+!ick5^5I1LYIcAC5*V:bPuwu</i1\Qm^A#F$P4mS6&4/Aj/yh!nQX^c$!?%*K89
5<lR5b 1TdiiuRjP:VXq#8\NhjVFyt*$/h%?$YnY5hKhZ/>DKmyCB<RB^a^uICepLXCt/NFmE?!&um#tBGubqcp
P?A%ht Vn1JStZZmbb/ZAQk1\8uGMwZT=Gq*H1iD=d/Rkhpj&5!&4969T?M>IuedX6#&9Q!+=1RR//+D$Je8QR5
XF>iWE Z=VdXE=V1R:bGbyMSF%lRX%k1Ry6CDn=ySR5/P\dYR@#S&6%b#!HHAJb5+ZTAd+%F</&<D/?k??54H?<
N#c:bq Y9&j%Z%4\^6=A4Li6qQ?kw\R%!%jtdMWw^!mllTSV48:S=^K*BCaZBFB*6&yI*9pEWYlVuDpS>dtDXlI
<Sp$uq ZRt\uDq^I^+LPd6=5a69=S4jiY@L8mV@^dJ>&XN^Hu=?c&:#dd^dNcF9<+wqqYd=iwZHhkp9*L>kemy^
tHe&ZJ X/uqDbaWAFCkNt#pFFm6TZ\M!#HH&uSJQJi1%RGtMiZ#lT/>Sjd#ul#j\9</*Mj%t/QX4Rji<?X8+>!K
Qy*CHh =N:5ql?Q4FF*GpynB<yd+lD#PqtXNdeemeXNllQ+d+XKwGZlJYjN#\FwI^ILMQ+!Ciu#qYyPLiLPmIj?
Xh<^C< ha:9!JZZRMmhjNh$JnjFK>iQYmPdPZ>$//GiEq<nQ<=*eRJdD!HEYRl^1&NGBJpIaeiERMmVL6a6mDRC
1PC>AA AS*1\@\!5Kh/qTbCQy&B^Q9TtYIwYue1FMh9jQTb*AE5@LP>yWwj*=ueGd&bMMDPS>bP@HW$dG$h$hd8
c*#a<n i=!9kca=VRw$bhq<WaZAD/e?dy%+b>T8LllL8CCpGA\AlKt#9Atyk:JpGap#+M6R=%*&$MTE4hKp%p+i
/QHtmw V<n>8e$\yQDY*IGyNatyT9#5>HBqJ?i*@T=<&+<k/Swwt6a&kdY%cG*dpa+mEuQ:kQC9FECC%MSL?\1!
tGj*\c a8RwJwH4$1tpIuYAy1tH1lk<AGke$#B4MeTLyh<Xu:X&X96+JQmni=?aCIh*Q91i:>VYAN>X=H?#PhER
KnqnQ$ %h$#6SFu&@PKXk+A^\LPli*pk4C:M?9c4GGC84RTpkdp5yBAhJ?ipXlcL!Nqy\ceecSq*cy5cyGq<Pa6
aC^XD# 8c%lPdN!cp&6!4i5&/e9G<*!94dp=y$R5\R^cY$j6CquAjhR8%cSPyaEmAJ!TAJmElQ^8VqLJSAQDBlV
An/J66 C<T&A+FkPkQpY^TlR<kaEYVtp5$ZRpHA\i:@XlF%AhHD&=NXYpS9iGC1#q5Wh&pj?G4RuTV1\q56G/BJ
6Pmkiy #VlHuK/R&ecFQwmakH#m>1k1yd!:?c=u9HSyInW^m/Gp+$!B+!KjJ?c+b\\$cn/55Jap>+=PJREP&NkM
c>m^BV d<uJ6K4*&Y/RZ^nu?YKcBa6I#AA/aVy%EdjFMpBMbCmbZl8aZa$*#q418m*=!!KW%eX#A$+hMam=*icR
*/Kl5E K8HCZ&SPALW=k9^nuQwhqF!EW1W6X9?4eQEamDLXMpp+JE!8SnSZ8IJCS*jdAipLG8E6TR4b86<9WchY
Xt4%1e !Wtq^89Ca!IRi?Vabh/WBILAdEti8MV>WaLnAH+$XVMY41VM<aZA@FpaQJ&i^b6l=SiV\YS>XBYl^kA5
/!aE9+ c<^Y8<mI55ALAB*qdHhEbK%p#bpG!cMTEhAi#D5@:jcViGR<6k*b^$CCha<Kl#\CPq=A>eX<bJjP/F^6
p*uMVC H5b18SXdPqcyRNH4a4LdK$eHPkcFJPtbwldD9$YhkdwtTDwFnDbPi<q$X1pJbliq*E1u^#^G#DccZWV?
946q>h AB$X+\T?F?SmPY*RS=6+F5bC#^Hc&\pC<=SWFY?<#MYwhF^Xy:a*5k=LqDS^!HbcIqT^L6TF%+!BmnF=
yFVId5 lu6!Cyk**pFY/t1dWuCdcCtW#1QYKE=t*\/T6!8aJ8yu\G4cT:TTZuBqlVdw&>!NWIIe%MRcLEyb1&Cw
l8tTmW ILIkH%P$5?M6YFbhNGNa!aSyGynQWSduXVQQ1ZpV#My$$iIDZTG5wL9X!=F8Clp1HRwXiZCBakD>D4w?
:>MI:= ECPk+FQwmAXYpd4b>jL#EYEckLnQ%meeLWSu@qiC*wJ>EXPV%S!MQt@G1SBGuett1iCq/CkZK>9C+a9I
&k=FhP RYPk!5FMkP49tHC?mX^j#u1#XG\GSykHc=A%%dw54yK!8akmt+w<SEh^m:VhR8e\NAmbn?WBE=A>1X*Z
Q$K5WW L5^Du1aDu*PNZm#1$cQ4H^ak*eZ!?TL#p/*tcEWI^A?t+SR^XcbPWJ?TN?nL%AK$8C!/iR!1L5XV#5SW
-A%C&Y 0008ad2259d001202b3 Page 177 of binaries1.zip
$$*e^Y CAT146P#4wFE5mI4tNRA9+*VpRXL^PtW$/^:#9J?BH$lu1YeT/^DDRdThCkjCHml/>Mk#bI\Ck1Fw/b<
m\<%!< VI*QmlYYCBXkNkPnMK&I9H&m:tnbpK<w5c\p%eWmDVK1Tw#5DAHC%AlVCt18<41HqCR<@4Ad>lRAuGLc
^1XQ1Z H!V<SDLuqV^=REcawI\thcC1yELDuBbh#\%E8FGK=eB1^wNyaB&hNk665aC/djQW9KDGae+#kkE#N=ZJ
Ew5qLH W6^?ZGCXMRI4eTZLA8Vw%DpWW$!NtD:RZF^SPbc#SaqSYe+YN&9CQaF4Ce6J11B/Y1w?Ma$WBTmb<Ray
l^wLa& lSaEpCSE^De5w#DXPDBNSPdj/QBW1+1AtICD=uc^DDHCQDRiMR#cANMyK\CDE:uKIS+kXXGALNQY9ZnP
V*nK51 tXL!<j^*5b!/Q5e/jSp/9$^HWR\+jpR61PcupA^41F*nh6I%w1X11N1kBFlK9jXG#qah$Xp8ipPYSThC
nZ8cIT pH&w+>4Aw6^I^?lK+uB1kDaPFTVc6<pAkBm>GY41$k^1VqJ#^P/F>1jGRhpHQNV!6l+^qHyF8jGMn=Yy
CK5@AL CW9qia%PSBC5!A1<R<=6w5wdihMp<tQSKRAp@ImFqAMmdpauJ1cw5<dH$pF*FiGp?Vm?GIe^cnZBpQVy
6T>Vw/ hjc!dF*Mj#aKJ5j#Bc+G9Bqd4DJXDRHX:iAtctQFew4Ba#E+d!FC#jY$\+luqm!SuHD1TQjjhi4PLkLE
Sk488d IB*WnGG$$WpnA!HQlMa<ytW*nPS9QHSc=Pd9e5KdSQuTkYA&BLZGXA$MXZN%S8*%pE/Ya/bCVjXCt^FZ
A@Lt+9 Y^FbhD9Jt1#EnYVK?RFDwk$\H*pAm>XXn=K9c^hh8+nV9R$L#XKC+CW%MSc>jnlBC&SCjLNFb#BD?&e=
mmDY\\ &AqpMlTISFaBwdCAJXMYA+=V!e8F:ZYu*nmP#ZRSw8T4WP?!CuBlZY\+5$MNT9E^!1^1LK<NMl<%9!&n
qaGYQC $E9bydGlwwI&pDl1#Da>lnWuXtq$aFT^^NGJXD%8^A/qc5+PHc!Zil/B*$!:%EytYED+1IH?Wk6#W>FN
d6QGkm d>D!F!%+YKKCGJ*dIRum%Ib18F&DMA//H\bllP\$HuN:JW%lI6C9LGAWL=R\p/\Y+kMV1ZH*Bk+9%TG6
TF&>>i km$:BpCybW:S&YjLcwVm8EhCKL<JMKtKNJlVC5!dSS:S/BlDAYwJykQp**u\aGAYI&=CX*TF!4Yt/$jE
RbjPc> =:iuW6PKpk<:6itM%?*Jh%6#jhVWqceY?Eq*Ijje+q/VwV=LP/#WpdnXS$nYwl*PPEtG\B\TSl:yZ?WG
m1E<J$ CH/<IPnWD*T&%nB#%LbeA5JV#ZnJei1dm4/Mq$qF$lqmuFKKFXVNw5DSmQ1c^\?4tj@hKy>KpK<aci4b
ynR@GW ZtZG#BLmJ%JMpeE@++muQB<4ISichFXGaXbeuaPhGke64KI1G$aTTNaHqJu&?aFQNV4SF\FPM9<p1Dw8
pai=## !t/CRVd:AnI>>jamLjAaNS#Rh4XXwDPERK:IPQCWHE\LYqC@1Ip+SRj/LB?J=iEnI8!pyqR=<l#AJCVL
m=m+VN kNDkK!dCDj^LENZ%FM5%$aL%<NKBIPy?ZtAYc6FctNNbnB&?Ik#A\w\S/uIJTCHp+Xkpq?N19GVkTbB%
XB#E=$ Vm\9^W51Hj1IqPnGB1S+J?Xwp8RL$Ccq9&DqcReyZ/A%>>Ay@Gd*^FRnFN@9$iEJN<ZNb+EBiS+Iam5h
V#HXKn a4ZwulG4wV?EaulRV8W1KSkLcyw#+ka4RqZD9CyTE/qSLGtm=u^ihu9JTQ9RHMT$Li1i9E^BLu+qnN#u
H@TD8I wXND</%eau5mwTkqW/WVTW*A1AmGG<5A+Xp19YI1Z5Jp5Bd/mC/L5ckTp$iE#k:ZuCqLLS^&WuW>E>Cy
E#e$?m \KHF#WmBeyZYcJtjew*#i/$ERBBuD>9X6bXaTRE?y!=cQDRTh@$AdteX!Mjy1kGEQI6cI4<A5IPWyYBF
PB>yFT %#k%S!uE+!p1$tiwPa$iF$QYBn1w8=hP#Iw&LKh:JJHPX>EG6^a9SAiTWRXlZ6+Ek&&K8?Jh4XP=%cR!
4*yb&I Xb=V!bAmnXb\V>:NR=/E!uP&$XEMy=^SIM=DV8whZjjSqWC6hCYRmjlC*dPPaP+YEeW>W8FiV>b6cVQD
VM^e=N +YwFkD1YK\TyNabGIGd16QMj#%HAnCltLtKc<eaXA55Lduc&/LnlaThb\YIj1nq%P4%JVWpGdY&1%H9h
>bdeGE qBZbWI*8:lBa%Ii8e45n+LHQXyNJGZHXWCuc8Fe9&PK1wP/Y6?tMS$/DpJytYdQmbpR^qXw<1R<<Y$P1
!?:^F? M&MYM89PkE+*PhGhW6CIi=WQZZlE&/q?k1Sca%&VX%E!ye:a\>YJ/CnmnJKuR/lLGni<WBMLnBb1yD&k
mBAW?D uB*#A=aK!#&jd>tGBQyMl<cX<4N%b^4aPq^#^w9M4T<kqEFISG//?Cm4b?hEM^^eI@eIEKdF/m?$VFPL
6/*9?M D>TuEmYEEYWZ&Cl!\SK/i<bC>pDEJ8?AaCKCWNNl8QhEWb6$#6^%GC611=$Y\L9icAw*T\nBFy%@d=cA
*GVjHC kuRAMdPl!Ae<FGMZF8B6+Yk%K5hkQlyW/!&a:8lMmDaY=\P!^+nh\PLyMNpck\AY+Wk/wKb94#4+9atq
J^9BNw *Rw>qlHtEajhE>a6%Kw6TblQ1#i!$wNL1A&M:9a\D!XVFaL+MW+N9Y&YwA6e>MER&MZNS4=EnS=+GhAi
DPS:P4 !$ZTYwG/wAq%<u^p^#IuXWG\PDVlVE55R!$A:9%XhXEQiimRmq<#4eIXVh=*qZ9<RaPR<Xw6TajF+ZnV
LID#tV \tQF:N^CJN5+mDLaE>J<D5l:hRu<VKYt<=kYm^ZcWuT*mEtBL8$q#pbbykAduWiZWAY#mCX?m/K\/h41
yyA<J/ ZkIW<AJ#9qYIJ5e1!LiK#JXLk8WB$tXa9\*CyeR$/kTtm$P86TL^jD!ZR&/ZiWFSM>5hYp=4i\wkCaF!
m>nKae pRatEZjDj%dK/EX\Fcjk?hhk?yB:<9CcPB%6C%eH>mtpG9AF^e&1kIW&9$wlQE9iD$>E*KHIBT>hTbkt
kmunk: bmFR=\\=4&\6EhtLF\=QPDM?lGQddKIFyR5bY1DVaCk+/>1km\PdmhibhtGBFdh1NShh!n^S8iRi9QMw
*EBJJV K8mB#HPK!MWAa?dE6TZ\In1Tw4wu9W&#LbY1$=W*AE*yDIqIPNM>nXAWWmC4R*<t8WSDj:6h#Cy5hWHi
*6$CNZ VDwDpAQYB:^YA?qS1ddduyNlKA1Z/dl>ZdRXTupDFAhS\qcYtw1mu=y\IqAQXuaHHjMnk=wV4iY5L=56
8HcHTP Wu?ll+:!8jd=RAPSP8RVleQJMV1En/mTCq@muyk!^>jH=BmhtqQw&k8NVmRklILEkXLp/KTi1paP\?H^
GSP&VI ?$Myb^!i*G!KPF*jNy@cI\cLRjjPJ6N8iKDZDcWWPNXFyqDn1cq*+#uCkPGy^A\+N58DP55<Rt*1tqLI
eFbV4X ^\8I&#iwEI+RqBJZa6SbtLi&P*W/^D4kVFHMA1!Ajy8S&a1BPVl#M>&^eYZZ+@/4m%uKB+Je95ChSC=P
VcSkkX +Jq9u\nQ8Xii#QG%Cqe6AwW^84MySy6<SIhn4yQAhZKkQPYe+<nI4/5kJJdQ\QIl<YZ>8y+68>5Wt6Ya
d&E4aJ :$Em85D@1u9^SeplyplZR$RHy6\N$6\5uIIdXA8N$VFuW!ueT&el!W<MB9*=4WmBnkj@B*k/w5SR#bpt
IBq%uF AR1A8Z/+*!AhPR^tMKqQw%Bidl!4yqb>kItCGVEL&<hw?==Kd=Z1SKLG8\EAIW5latlWVVB?1ktVVwjL
k!p\c1 6M>QuSmp^+KGeIa=9EtuDpZFcj*c>K^9MPPn91p=N@heYhMH4*F9M+GZqpD#aNZ9\9S!6PeX4hllPnwX
=&SmM5 WyYT!!6LBTBEAKq<VlDc#B6aVdhCS/EWMS$E&lc?R<CKqH1\l9/mCNDheHRTq<K!IFn1JV8q$EAueRFA
E6!HCZ kC8&J!nh%uu#XLKcTM^!mcA9bpVMyAQhJkllZDdnCD#kuEwB!5#FdLWFiK=G/>yplXQVDX:nZ4AuBRaq
y6N:>M cha6@F!lE\?8yE$hPq>Ly:RLY1qPQc$^u1N/=ln%Ch!I<PX&Ridh@WQkN\MpR5tXTnR\^=WTJY+R!$Ib
RRG95& npnkdE&1*4nT4L&5F**EB*&/G&i$B9diT@DjZ/B\T<#Pm64e1:m*<mR9e+>S1QMPP9KwGCXVk#JF^PKG
%jQ5Ty Lc<M!\Cj%B>Pl?FBh^DT^4GctWMPAm=h/Jl%V!BRu:BiuCHud&ViQe\>PWMm^1n4TS^YmHXVCaJX=^DZ
#^$@k+ nDu8%?n+Y=:Pu?Mq4!@BT*LYRI^D58SWQ1dRDW?k%ZX+ahucQp$=F<LyQy%8I>Ty+=F1IN:@hRnN%cAG
WIIcHL 8$ict=duiDM5M\\=Qa%mKpW/BBWbZH%Y4EIGnw9DQ/RTSc$PK/YYCQG5+=\Xbqt*1Gd6#Ra#Ny9u<\c<
%9V*@B jy4Mw<c9BLd984jVRVnNKAp/!P=:XmGiFuQF1%#tjypPIPGbS4^$TX\HN<&G\InJnCE^uT!PH$+=M*Fl
k$XG:K l5TlWVlA5Em*5#Tujhqk>4KkI4F:5=<DW88nutt/jRK4*dTPp<1<tKnGHcPhP5C^c9pTqDEnPp^?5F#5
Ybe5GD lmGyjD6WGa?V#hMCtwXNRmSk<$W>Qeic9aE$IeLtMmZb9+d6Y&V=<Di!nK!iw?9%qM8<QWd>wTwHE%Mn
>aSaB+ $?K/8JcX!pkQ=H:W=K>1cl+4=l:/F^b^=YA^mPe*\c&LM?/hj8=!@e*XFEnyWCmbZ=^c6B>H@wJ&=E9e
V<4K&S ph6wq#yHl$XLlG^uBWKA>W\^/\hiE9kwZI&DRXQDkDNce/>V>GT<N9NtJDL9K\ZF?:BWXm8=L!cAu8aZ
k8aF*l k*tckBwwe1S?SHi1V<HaCBQV%//q5/QbaD4V9e8Q4B5iMI\B!9%S5DAVTHBB5c#V/cFAkPp?P9JK48T!
5T%Kdn wP</nb9>MJN6Z4t/5PV8Z>CWhYA<myL=GNbK!hMSND1wldWy/pKTutRI$QPnTIWWc<mjCyjFQD41ubHw
M8kMJ8 Nm#JCX&Cc6!FI@$:Yt9BBJ541G+m<8cw5&kSBKPV98B\ClJaZy$YK:N$B<hktt+n<?bMH5c:ED?lwIVa
eL:G!+ DM1Syh9=IA!ET89FcV1Q^>lPY4lqhIiwRFalA>D%6EtNJ\*>?JCpEe6nwnA6&pNTYe?G1CbJ=%$Y1uTc
e9yHIG %LVKWSiB+QX<!CK/X+LHRD?BdGn1T4XGZE*PWnD#EeP>#ydPS8T=P\MiR\inIRqMANR@A8&5wa$I5pS1
ukD+wV y\5EEGCaFQDpiATJ%CKSAEEKGyK?y#^wM%69<cYyBAtLhm@9mq%D:jAEt!q*8qel/e^48DLB1kH5ISDT
yB6D+G yWXu#c?nR/J/NlQ\BYmj#KV1u*C9CEqm*e\+aZ6j&ybcYbw8+5tYZd>y>D\5cWkXE!/>E?ZB\eABAncP
Tu\QHX 56A>:W&%X8S+VVW9k&5/^VYD?tASwSu^K!D=5@!=WTWuCJ8XWmD?DXmK#&^>H1cp/*1lI:y4JN+F:lm*
R6*lbY Tt=ZQ\qE%#R!KXjn:XlCRIBeDt\ZkQIGp4XIDVy$Mc8jTXTILAd=>4weXcpSKyN#bt^#Hn\R#<*a$n!/
AP!Eqa ?Dmk/*R>uYm+EhB?9pCyNW>H!=9yI1j5HG?m4lSC&\AaAJ+K*et=utRGBkMRC?w/*SnpC^V>&hTA\/MS
C9/+8N 8mpSWZ9KLSjy^dVpk=/CDI1CXM%$Q\ZdhdWkZA1jM\#\cLN^$c^QKyGF#/jd1GR1YlDjl$hp!>q5\Nch
+%^$y& 6M&8!9mK*VW/*1LSLXctXHKwp8kEQECeWt9GVZ:b$GZmVFVe*i&a<?ktDXWX=K>k&^Jh6Q^<#t&SRamy
m6yyhq <%cK*6VBPmM&AP\J\4KDi6w>tEt*E#=L>!*EbDL#5ul8XETAynM5+Ke/nW+9Hd4mV*GHLl8tlkFXm%Mn
-AKjVi 0003a3a18bb001202b3 Page 178 of binaries1.zip
N#j:kV 6jBq/bwk*>@JqB^pct4NWeEcPYBK4ILQRqET*hLlyRPu^hJ^y<=nw@BaKphN$^E@^CnjwK+nhyM8mnXm
Q/@mK! uqVmYpI%h58mDqm/u\mcCAdTZq61K4t/YpBuN&Z1=#BM>#=aS\wIKSnM$5Y@AVJBCa9EW\:<AT6nG4V:
t/D:8# b6MXw@Bk1cm:h:&CuNCSZRyeYMh&8y1tRNZNkkdQcKPnCAFkHKqp</ceG@911piLZ^d6:4qD8FW&WKS4
%lQdja \#AILL<Wuw1+QbX$y+IF$L6Iwly9PWP9=KYeDy&FhC1u*S<TSD1AV9M1ZiJEXpT*PYP/RWH81^Biw59S
d4J=^m pFaI5eIGwdVAwK*ZYc59\?ACRWVcX1S>p&:!wkDaEjVSLdelEmbDdB=a6<Z%BjbAE>&XcB68aRc?jY%b
9F!R9R ?KF:LD^mqWqaX1ktHTtYI>D5bhFYDPqqQ&BQACCB\VAZF4Qq\$Vj1EldIqLdmY#I/HB!tm:>y8%ZP9XF
?Gq^wM N$&TWZ=9lcDLmDR6n!^u8YFKy#6@Aq//S*JP6NH>CY1ENl<8I+*VlZGbRWu*iYp%M=IpABYK5F1V#lkB
KNlMEY h45V?mSjXpkl84I<+>dKk8/FB44di9D>Ban!aP+q!<wS@K!L1<qm9RG51/VVbpie4we\a5D/q>&:^/A<
BKhSBF Z>1>>MJLc5:RB9RRhhT4MWFFEF55#5JK!pXjPTQS+TN@pP:W>yWlcbdA^aN6yqdkiW&LSDSdJX#n#&dw
?Bb%^M \uEj*h$KQGjq/TS*uqA%EM!6STqayq8IGIZnkJhJ:yZm^i!AHM5XCw1FWN1+Ym8DjIypBMiCuPY5P&FY
Da@IR$ FG*JaR<8$SCT+@t<SR^C8NeIBHXw1V$DkpNH<Pu8JN6wlqMW+4M\Xi4@y\9TpQu1dHFRp4J$i/P\KkXN
NnaEKt wYSAX:Nj!\KbdAmIkAIt6i:VXmeCMd&98:RFNcdThS^$VLQkE11An$Im<%K*9bHuid1<9pDP$S#KELbE
biu6A$ WMB$GauyWKW4\mF8qQdFAJ#yQGaIpTWW%KYMu1bnZZb^Qq$lVEhlJQiP4jtCVt#VJTb$t^LhNiyHGMuR
p8K6$c Kj^mCA#j=^/6ljjAjt+wD\I=q:EAGVw^+&N$SSkBpuLYTlm=C5\lB8X$qke#*mITanARyF8T5KS+?XaJ
RV:mRy EbFM>5GFeMWa@Etqi/XeMh8RwQYAi!1idwb5W@J!QGcA9>EF@cF@A!$^!ud$@$!u8+i#^XBIKka5T9u^
6:9tZY El*cEqnAIKGn4J/B!kju!u:*4tVwHuFk*<KCTylbyd%+&8iAwHwZR4#8:1Aakk+/^QMFNWj*IXDX*+<+
G+MCMT WhTLCGI?PmC4I=>KNK>P>i%<DyAqalqpFFqjBp6J4alIy9/=4J<8cAdww>Zh6+D8^aKb$&%$?aJSF:c$
DwkI!j NKkZth6EaiWMqT=dm8XBqLF8!:L$8FDGdYamaVPML956F?&RQ%Q$5Vbp5SKhp?5k!P*L$tXy=Dma1q:&
A4A4#B A%ZVBiJ$nhEQR=DYWCC6lyBMhYe!MmI>:1WmBhhD1SBLF?#cauQI*Xmk5>^My?8njV/JeDEiD*F>/W!k
1!wVC/ JAN?WL!qc$MSSAC4A\BD6LGYySPbEmE&!9\@ZBk#Tm4FY9kNSYld*FD$$:&5$J1\VFNY1MKhy?QAyLR!
^yyId@ :LYIJ>4/6e^NJ?+hYBS$k<WR>BkT5q66yG1N%?59\<iKwFLMqldCQM8RB9@n>>E%jQMNIpyEYPBDJ8!t
\by^MV *IZXwimqcayX!6NiBNI<ujen+6WM51SL5\#/>TJH8XeIAnj=KKSdknmG/9=bk$FJTHZ>KpaSH+4%F?qp
jTHA5^ IABa\=AX8wMnVlmiX4W8Y8nXKX\/X46J9E1J1hADqeCkuZKSIyJ*lu%Xb:w@R>*mBE*hHIIAnP!pqe9M
5G1$A+ /\h!CGWwaEw?5mT/D^MDJXL6R@MX>/yq4GA?V48Sc@R!qTFh9idhLkp/^/K/HV>8SKN#84:ALQ8*TB=i
kqu9aj cA@9J>GSaZi9Wmn8BTqb8uWM8k*TjR=yQA^Cb*ZwYe?E*D@i+VB&*T*Z@c?@HLLa<@@^^$H?H*<d=Bu&
mteN<4 :@:jj<dnZ@@b@lFnH69^%Aj@<L>?66@/A@Q@pdGW:dAdG#?8^I<98#<&*#w^tS4HaQ^&ERcjV*>AQ:i$
LnqTh? #1atQ?6y@D#QtZXtA+&jt/nlidD^5<hJ&VNQj5D<H:LtCeiy:&4<YK5:n:#c?JHP$Qe*j9!Ge>wS:w>5
uu!LP> FYaj\mM?dE^yyV?pu%6YuVuyuMZQm&bl58j^Cmpu?jpdH:KF?QiH##QYm1?h?+A6utNi#=4!Becc<PY=
8!DR!N >#>puTC&LX<8dbq5@Gy/!+j5KuDyqu@8DKW9+nX4y$@9*@RlY#4HYq8Y:Hy/D&Mnj+Ip>t^6:tej5tX#
X?Ni!t #Ljp6%%*hcZ9jjQ5=^miel!::A=9p=ZN/uTtL:F8$?iMX4LkD9h**Y+?6d^>PG?y/Tu/@iS*QtSZ+@jc
NY\SBc mP@a%Jj:LQubkTt5:GT>u98RLc?#?b=k%u#1uy>GVQHB&PjV4Huj:MRn:*#I41&#Bh+n::<<9Gj#=n=^
JiCTCA LDI^YGM66>1P$=j?I%8BD#%*L@%tTZ!\JmT&Vi=&cw#lR+cZYFquC%6i54/>L4G<Eluci?La\de8+b6P
eF1=@N de<H?Cb>&y\6hjQIt*jj\X<=h<L?BJ?8Pn*49HQq$/X9Q5Y*CY&>h9!iW^QjT8LVBiihM*%9@JFhX&iL
iCmT\: Fuh@S:#$#qNQ=/K%$e4I<B8Z<YZuhih5wQH^VbZ&@uDSnMejnJ#eP*:tAZ!</N^59bJ8jN\h58=<iQ!y
1*EhIl yX*Q9uj?ZG4Q#@F^/!MVi#<jhD>&^ILe=y5&>@>&8HL@9qNDI?@k+\Y%tnQ/=B>lF/#D\?@8FYQ>V=iQ
uVYj4a QjLb<P:Ii>9y//j1y::Zk<@44KZ<+\%hy#+GiB\/Y16PJn=:a+c%6I>N%Gb?>pi/Rum^><kjD4\==9Vh
@6eD># >bZ1\!hGl!c&BVDAc$<:Y@W4A#KlV+d8h/bm4$+PH=q%uNqBDGk>jH4A@qXnRM5Q!$@#+<:W<nMQnhcP
J<qcN& P5:=m@TEtct^j\\$BuV>=R8lI^QP^:Hlw@8NLjcWe?PM/^iQjLL%!lP?>J4+!eDEjdqpdh^=A?d$PV*B
klNQ:< &8:WNq%=\nQbF<?ju5#@5>E*&e6YPe+^>\qV<t6ZBwV8nH@:#!iej@t!e!y!muqPP#Ma+PHduW>i9QKE
p+jlI$ L*h><@>IPVehLh$@CVju1XpcWJ?>>>VXj&VZ&/!VH@4q#wV6FEX>JQE#^IEXhuwYI/LSe?jjhEjMj@ZJ
Q5wTNN Qi8m!jMd6wWu>4=lM&?V++/w&1ei&8JPM4>*4NMce84Yuyq#4@VWtYjXIA*aP#\=EZGXNZ<p8I<QPLb<
$:^&I6 /F6@Zp*QMhbDu=><:>m4+w>58RP#=?F8@m%:18@e:8E>j&LNd+/hGV$A!<bHLY98Zu@#u%K#&@dQ%w/S
4tWj\: %?&j8VD#TiN4*4jF&?KwM:Z=Ll/b\>e?Pd46TGjnw=d%/*u9^H6un<&?QquGS<eHLw!Z4u^WK9YjGJ8e
u$F=Sm FpjPcJ@kw<ml=AY4MXq#41>!4?P<jjSMhPABtt#9#Iqn\+&94hDEtuZdud*q+etlRZ^6JDw&*9hHhm$?
PHh41u puL<#ew=y^K8ucn9?J#N<&#:dnVbt@:I@h=!L5j9QiXMXTLu99WG94ju%G?EcE!*499P%iiew@<^jH:k
a\!:t? <#hw88Dw=LEjNcaLtmM@Zb>!hy<>tV@ck/?NDZ^=@NZGhP8X*8>MQieei&:9:ECcyn5^NDb%>=Zyuu=y
Z^nh5a bNt>y=$#5bQdT&tTdnl!d:a^*d5*=h<?>>!Fdet^my&t/TK%@$NM@bFh+:B&?X?WP?>h+b^@>nX6/DQY
BR@h8B QL^?R/ZLjbF&c:$<QLJ1@!&np/iQjebc^Qmb9cI^F\lm8jViK8hM<pVqDAKqX&#nL&PS4%uAYq+LHV8q
nN@wD> LcyHV$\p#8N=R>Xn+!Q8Y:T@YZu*L%>cbJ<Qm>iQ@Rp99%ZtS&m6%m=kVY6Cc::??cLW<jHbe:@H6\/j
uQ<G!d HE4pbymutc+FZ6^eb/^=q6&+kHqjGV=4@4^%8y+/ep1tb?\cnpa1XLd5*Pn6tYQ#HkPM!uViZtjBBY#i
4jj!/Y M!?Kl>>yPl$?XD9$Dkp\e4m*Q*&b?b9y4&Rl+%:QQLQ5Jn#%N<hKV?^11y?cijjlGSKH!&hGRuP5\=6t
<XcnDm kR=j5<i*yMjV*N#DQHX&<\LY@mW^u9mb^^t:9*d?JR#*lQa5Gc@M5eWh*6X/81iHTV*i%aDM9V$>Nw%9
%GKQb% #w4TLd>n>htSl%@@Pa$9Hl9V:pTp<4LF:Hb!G:w^6/tQBVy6EuLyYVF!ekh#HuFPD4&E^Zn=^G?@h9e5
6ETwF$ Y=TYRB:9YN$bjNVnZ>%&i:DP9wmZ/V4iY^%pi!ctLw^?lBYby*^4@c?QkAw6/YC/=Ap\#&*i+Kci^aHF
j!9GYV *l=kVH^nCi<hWT?!Y&iQ#8/@l%:uL%?64NqTb%$id*d%\Se#khY4N&Yal#&/eZM#eBpEYMV*>J+ebK6P
G$l:$l %@hE:/N9>A%6G:q=qq%%t:T^w>Q9ZT^%QN%^?=e:i\k>@>pChn%jG@4>IF6\b5KbIIGdB+h:SdHPPn&B
58D?yN @1j:54h=49e@@idtN8uy6$MHdjcqBi!/+jHK8Vha1%NL1H<kBaT@Q#Km&G\yRI%$b@j%:MYD:@S*BDJK
hW<MJP Y@iVBHMkSYjjl6D\Du\q=b!M$B#q*<l*eSlKB<Y?*pmu^D!XVJC>tP&q&*klSYSwhPkWZuB!>8H1:@GN
j6XMCQ F9?GdXa@^TTd?c#dQB&M>Y>Nk*V\by6t+D@+h9@wG<!dep:9@aSt?PZ+d+b9kda/MaX9!ShLiFc49&!#
yW:Gb5 bu>yW\@NEH4m%Ld#?P*ZHGhIJnH/?Jj/u<aMY^E<Y@/?w<:c*8:\5ei<k^=*ujyjF8Ia^m</Zc?j\Hl@
FtuC<* Tj9N6??dk=dyj1?ZBjMEQH#V</G:%@#:k+#YTSMn9Tj^lcaJi@kIVZB*bHi<n>cyJcn*MQbttZX$5N5H
^k@/Lk jiuty*dm*:@a\wInjH<X:?l^uA6u<bZF/!N<R\Vc:umG#9=w>Cw>mc$>jS5*Ye%y>tj#&Gnl^D>whDHT
PYnlBb #SNVy?t6H96A=Qwl>$aI5En$hDB@^=J!5!@awyY^5C&5t%h&H/$DaDt#F5b*jCt*j5>1TQETa=5bH@T%
/upmdN MG@:*a6:Mn<V$yM$\juSpiEyYGlV/9WJmpd#5k?XyHj\BZ?Qn*Xw@/YFQe48&5yCY=cMQPuK<J&?*+&?
GpnD1E BB>jNB8n<Z%@FW=w@Vb4C@T>9^lA<P8M&V%6c\!<YPi4V/j^Ty/l??YV?@EN#?RJN>+F!:pN8#DD%R!?
$tH^ER H>ISVn4ji@>A/Qud6&&CJqya@<H#h@!QYid>^9u*MZ^%!:dIt$>mYb6d?6tKF**LYL1y^%Qj89w@cN&*
bPu$P9 FLjkC==9:+<NJQGF%tPD?EJucVMQ:TI>BJb5Y9W?P<Y<6*:&u$d8a#?>?FnlQ>MmibSe+6=*<AZQ#F9+
WSVKPH k4+t#wjk\F*?6%8Y@eG:qD&@:V>9Q@Y!@1&H?@deEYA*6dAQ6&$dmmACL1J5XPw<KQwH!WY@!qd?LQ*9
pR+R!! P6n45#NnY/Xqu/:?cd<4eHu$D<PVGP:>Nab*HBE9Dt&q%%t6B^c>*:G$&Ve=tb4=TH@m<<=wu+<i9@jd
IZBm!j G^K:LwM1V!GI?4!tKCEPhVWL>5SF6u^nT&*&#QajiNh?tqq9>hDn%?/9*k8a=tq@a^4n%*C4@&X/Hitb
+LJlEe n8*94::H$%T@j?DeXt9bR**Qan%9ctt1hK9H%W8MueB\d$@&DttaHy@ipXu&T<?@C*nkEy/Q&LPjh6>:
PndS\: :EX/t=jHC6YjZ&IiZ*1c6aR&>A@*$6M:@&QQA5cY5K6?n?G9*j=Z/ei/+etlFuatep+i@aVNc&E@&qDm
-Ahw#^ 000b4146e8a001202b3 Page 179 of binaries1.zip
n/Jw96 >GRQ@atSJ\e/D?DJdd?VPy4:Z1<G&DyA1mEF8b:Nc/:EhR#FtkT/!=$>Q9@j?q14%:jNP:8alZyQ*y:G
5DN%nK YI<eGS*+?Tj\Kq>iQym#&VJQe?cLH6dDH84=m#qj#?bLn@HMcqpE<Awic*Jw/D9$*FK*6X6:A/@Rhp@c
tjDF+t 8:nuH1>@L4&p/Reh/i/:H*:%Thdh\6==?jQ11*l5=+59mVZhe/\4<PTYJ*$iP>D$e?=>+dZi:5Z#V&@$
D*Ab5i +RYc=KG9:eHIid/ul>i6GW/VAT+yk&X9tjQ?CIJh>V9Q/tiK=:/jyleaj@$*^*/H5jN/*:am@jCtL8>Y
$i8Vj> q9c*V95<u:Vh*ZK=@/pYj8y1llj\q8LH19jlBSbaK?ZTEF=AH?u#>@#wu5G:H\p$9:CL?de$XZ+b^EP>
/mbcnH 5@hYp9RC*8FKu*mSH44^GZadi<L&65*?juDbbh/VjY</Vn4\hN&=J+LFt6himwn!MS4cWi=pY%KVAibe
!Yd9ER c4:nEk66&u$T?cC:yip5RQ\Y#N>!+4\T:5Q<j6+#jHVc%y?<>VNyYb!*HD@>G<T*hT$5@?H+tW>I1NyJ
@Ytc$6 $:1LFpC/dY9#16ubp^uj!pH>mW8Qduj1D<i*$L8iVi/?n>/%1j4TLN>JL^D5Cm^!Vq>+I>Pc:tt>6QWJ
4+k\E6 y#4e:L=4iN6?h/$<!hyhjSEc&9LYa<j*u>9jh#%4Zl?=%H#$^IXT5aQiXS6?b4d@HG8^/<i1k6V1@ZNy
>P:RL% %aZ/^Q8?6C>>/+tu&=*/1%6/TK$n???ZQ#pHDuh/6wm<5:V=\Cdjn=*nmZ>bHbR/nq:chGR!4B&k>jhW
!Ei!*j lpwu9+^u4yw+MT:i^#N9@?yn&+>X:4*p>V:c8&><>e*:*^YdcCS:/JR>@k=GLuKej?cAQq%Z#i>bMj6I
qLn@N& KbL8&PVbj:q4&aXQSCBA#@#y1DX<AmPdb8*QBWuWe:H#/L*uwm?FZyT?:Y^NV?\j8k*CB!tR:J*>#quY
D=#jne :J#?wQ>uJND!>My#8Rj*yhtBq8GQ9>B?Z9:=FqIV&*<8Mu#mLNH>KdqM6lh+y99tE?QY<d=iF4a9QSW>
wTJN*R >Y/L?$lQ*<B:=??npe+WL?PST\1?DYh/w!h@=hu<nVNdN@&u$X<Qy6&=#+S*J%:F\EZ%i9>LNQjt&/+:
9Mk4QE u:n>^><9B&aub>dejFL1:$nV\D&S<VMcB4bQ&MiGMQCyL/<i?6I@djn?ci<VS@i>iDD!l>iwEkt=E@h9
96D5N= $@CT%:XMP4$mVZ>R=ntuQl:KQDE<+>SQuHaij9*^&**8Yt+:Zy$=elc^*=:WZwDnh*Y5=4J&aNeH^$<j
/d*@Vi q!jFwZ6j?F/k<bb:68&?8i>n=nli<jNBDG#?!jD8*HjtBeiub=*I/QVR8:=PJMt%Li!YtjjGV**Mqu@F
\jyW8\ tdwn\qlkw>lh=b*@iCkeQnL!$QBh+*Ij=5ED6!*T#k%@#Fc8ePwJnVdY&k:G?y@$dia#M&Q@<EyTE%qj
\n5a1C l#6#jP4%%&nk9Au:&ZX+te+Z^#de$Z6:ce?>S^<?c!#Yml5jc:#mN+/iP!>nIDnp#wM>4Du6*jI9B#*T
Z9&aRT p4<diu=\R@5>Y:5:P4$>>I44I5hP^n>m%!bV8h&Mij%QDRaj:W!HQQ6/B96dY41ZB6QhHY#6QQd%!jHl
9u9d@H ?>Mj5/bXE?hHRAa*N9@X4yWd6@kZ=*:<&:+:DyaQNG?GKQQaWnE=JVD8&qdue@mwh@Pl9>nR$4dId%WY
i:ZQ\G @QWQ9:<p@5&?%Y5CNQHK=L=n=#?mnD5n5IcQZj@<Y\?Zip1T>5KLB>aj:F:c9cJVy+t:l5>Euu:nI:am
!VNM1I Xi>u#J@MqIM9bu@Wi>Y^S*e<ML=pc>iT%Y<P$4lX^\j5GbCDFX>^MM:nYj:SP%?=+/+ji<jjimE?qI6@
GNNT%X Jd#e9+uG6b$=Iy:6\dmXDyKDb#n@6>@deIe@>+$*I=@>VF\djK%:*iQ8<%4*%Ac?T?Ncudi\yH@*$:>V
E58tEW Xm#@=eK9cE?>ePt<juqy/GDlTS1*<Nl\/dWhNG:mLGDC!5!94Mj@iei&qSY&=edYnX8j8?ZtP>^=t<=M
d%8TRK &<PDGPh^KK59jYHHS=W:u6HMX*@=%m&i8@e<*lZ+#TD:\n#Y5tj@:9=BEK1pp<dLun!bG8n@#TP#V/8V
\+@\I! 5@d\Mij</*\LDY5/M*d1jyD1=c5\dQX>qd98GF1ZQM\*@VV!$p@p5jn1wumT%PHb<<n\\diknt9bI8h>
VD>==n =6t&h?4%<ZeiP*G$d+&#:d+#>:^*bu%ZD:5SA!iQV>i&u1i@^5t8DchduW85c<?/Jd@hE*yb@PQhub9j
J+#@k* jHuNH:ZT^9?&lh*w5Pc#%Wnj4<+#h!N#$%8iTYV8Nhcw51G=eM#w&H!jYQHqQ9pjk>#uQlq+?PlDGL!l
a4hIT% l:X@RYayl*pQ94n=L@HE#dhu8ybY@69n!6dd/bkJQjq6Wip9a*B/CjP>K>++:cS>/%b$h/>tV?bCt^:h
=6#P/X &ZGNe5eNuh%\SB4<!KS#<l+MFt?p=/*y?>5X#l9ihLy=MQNa<&&M4X:ei#9^1#Seb#$Gl/h&G>?<\K/j
@NtFJI =\>6<W#>yQejuI854!?#bFPQJ@kW<?wihwC6*6KBmEYQ@94&/uiQZYB?#?*Q4&d9*XWK%!:c4KPHhdAZ
=c&DCN ARp:48>a#j4T:DddjjSZuN$9<R951tbn!h9y%C9SwhN##Nj5C*k:mC9+t*8<6>PjdpJIY8i\q8ZD>yme
Au&&#a utVZN6?i&VT+dp=<=Nli?k9a6DMBDpt:TA^+?Gw<ihZ^dbY#iI&Y%Xdw+CL:yTPuudQEnX6cJt9cMB+!
D^h#He 9:P9PcPBY>:\:!H>J$T&Y%yQDa!<<5apc?>iI51=&?/@jM<4#5X#:pji!TQV$S*+cHZFL?:wTVt@*idM
PLmyYB NV=1*i@\P:dkI/qn$M>*4dJj&#^^=TQQSGZ&^CA?P9n*lZ<b:t6%Sq>KuV:HXwAtVKZW*V?+TGZFuhe*
WKSDFX Q#*e=F#iDb%>+u=&i9KHPb$?/?w<1P*yi#R=b>*y9NH+dQ@J%<ju/LQNh@P&>bG*W9d\@bMZG=@h=H!5
mc%hhy bjFb!?y5V&>^cNP6KZ:*cZ!&HJ@hitakq+Da&S$=Hlq?cJF#N8@MjeJY&1^qlVPeEPqQ&WJ@dPu6Zd6j
\G@$hb LDR=+8&Wp#=Q6ctYBYj1G^=PV\G>&&^li?kuj>N4HZ9#eYjt\b8hN<+#!cdm<NH1uV*V#NQ!G\^bE6mp
6KuI/W Y#Lj?@:>>YhQP8<*lumty>cM9D@N46wRAq5K@LVa8XadN=/<%hu+q<:Q#4MddLjY?<=@@FtNLjEY^4a\
mhicHu X6CN#Z$@Dj%/jIZ#tyYc\&Q14Qu+1j9@i^qDRt?i/&P5h%N&e><@HVq!=$Lu%!?i^yAdMPTS&5@&*\Mj
h+4d&N >B#j*&<\byZmc/L:*9:6R@?dM^XJPijbcw#=tnNymp65/W*^8+d&95?p!P1DL&^i@?hnP/btlya=/R65
ityR<H VS$kw64@&wZ$bdb$KH1jNdVXa@pPdl#bM@Id=eq9&MYuV4>@kZ$Bw^bM%tR%QePYZZe84A*98c?b>>+S
<KyS1W G6pV$X=/=%aupuM8ZtB4/:SEmemJN&db%h:@c@%Ij9Vqu@^FY!^a+t6KI?HII1jW:<\%^nZNVk*h?Yea
j??VwI 6#J/Tw99H>:VH@Q>q!ZtqJ\4q@=4/tN?<!MZYHCPNhhQDJ>@d++6>*\\PmyPD^?Zn4ibG?SZ%n<<i9Va
HhpwEu >bPj=LcjlwtH=qlL1m/$<Ee&w8jA%@j*Hi?9*B&1@Qyy9XMe9&u$D&PDy/d@!%1uMZV%16hHn=<=8aX=
i4m@=M L?VQ=cLnS*jjM/H6:N5+Z9uX&\>?bhjQW@cGd#99N+a81t*ayE%Pl89Ai&jQ4S6@/aXhX6e*D/:=</<M
G8dGmK H:HC9a8eZq@6atNwp#PW&ncR4Ih*D%inK?e?iGZd//Y+>G$?>M:wV$:^D%1hj*q#aK+^%HN!>p+iQnE<
4C+W@H Y@@<q*iNH9udZDV:T1neJw6>I?@??J*EZ#m@8?NYGn4LXn5@Vy\=:hT&4h&&9*b?/CheP@9Nk+h86@aW
tKQ/E$ ^IZy*cHB$?iDV#nym?:RY/h/d?y>:?TF8TQDpbN::n5/*6W*6PQq+%\:*:&=eGb4c1b$\?p*GpQdy@c@
hN/nTh e4a&jnI<jj/><<L<PQbB9*m%$#mYD^<=6ah4m=#AW^MZ4\^>9VD??ttuP4X@RB$SJ@j$l*n9iFakCL?h
nS\Jhd N+hC:jYDB&6Zluyt>?\bHdh4&+?PuaqW\u^dSS=bE/4\dTQ*:>:YL@=*=^e>1d?>!Lyu&A%@?>8lj*9+
y8dJnA *IS>etBQdF6hmNA@>d:%kZ^t#>=*S$b&<!&y!?8Y&a&S1$/M@I?=W>Qu1yZnj#=?<EJF^LV?Dh9&:BNH
1@FBi* ^5W\Z**/</e<CNPlGdb/+Zlq*>1>J\i1?/!j:lp6e5Fb=\I4@QCS6*ejK@GZd=$:?Mc6d*#1Dt&1:B$c
:uCX+u Q#q^yLS6>MJ$JQy1Du:wHSXQ@HdQpjE#uNV/%WWa&u&bhhSit#:?t#&J>>+=YS&8jHauEd=FZ?NN>@$$
?1RY@u NdY/<8Ym<>V6*p8j58Bq68nL\<9H#^>@jZ1m81>QY#Gm%htmBR?^jieQVe?GjuJD1uI*?$bn+K4w^P/>
%n<PDq +&MV=<>@?:&V:*KR>pXNEZchGJ@6E8<Gue??tX:RGNlmjn#!+G:6wYQ!/:9=VaL?8Hw@c?J46dMn1+8*
t:kHPw Z9+T<5Xu:A5a/BpI*%<huyDQD@@V1?LnCAa8AGT%qhhQ>=:b*G+@D4Xjj+p6MK59!?ej*HdL#L=:n^*c
lENaKA hAq=b:=\^Ejj?T9uh?ZGmK?yb<+i*%+h?hdJ5Ql+B+*\u6<&69?YF=\*i!?!AEc$uB!+NXEYa!N*mY%!
BC1em4 85dcQLhM<uePhE^?5QwmY*YJ#jiP9qAb4TWnpXj+YVHF&6yPDi*8@@Y6Q^lH+F%ba?&S8Wym&=p#F/4V
liGXM< +1QQtT>j@WhbPtSLX#+Nd$6G:*9%>@L==SeC?HSd:@ntk<@X9#Va?HVq*9HJ+&i?P:9tk*?V^1j#uJk1
?\W$hS Q?we&Qwy8:dG@N+#S%<h*#9iP^:=>b?a4>X=:lu4kb8uH&6</NE?Dt<d8n?=@@RPjLl\<5Q@Zq1/:K&?
H9q^AC V>tKchaYVhW?tV15FN=M+:NF>tu6m=5>>W&j58ZViI=R9la>ecVT@^p><+Q%j%>mD#@b?MnDL+!>pyk/
^NWccj ?VN<=E$=4:<TiY6S<FN&>SS49jjpiQXb?TXI%S4?ZG^i9auBuybNkRm@hG:Q/MnkShac4i*b5?E:dMiu
h4dP4J :K4QAV/mI>4GThc!6HD5/Y^lpuZ?mZt9/u*!AnntlZi=>mKe9Q**4PZB?+R\i^w@4#\tTnh5cj#e*5en
ppYVw! 4*&#<dQu9Hm?>+5Ztj<Mc^:+>y#%>+$jF\/b@bm*:R\khiY#y!ibd=^=d::49puYP5+<ZS>eeH@ljSXS
N?5K11 e6/:nL%^\j%H^\Zt@TZ>%\EAAZ#>u>P5?j?ebw#J#S<?>iw*>8Kuc=uM&JdNj\HdbQ:&p++V\C?dQ*^C
Ae5L&D d#?Bu=5Y:<QQk?&9+ijt:butD@@la96@yy@@/<@^<>?#@^@@>*<DWE5DBBRAAkAIAG6XdTZW@GVjpCpA
@m\EuP AABTAAA>AAAAa&^ybY=$e!>\b*A9dYFnL%BHWGN5cYX8hE^yam>#d*X!a&W9WEhRW*B5aZNwR*JqbGq$
AJ&TFR e!=!e*JnLtJyd8%<id\hXbZ889iiP=Gdi#QQlCRp$LFAEVBKA!GhIDMcyc$P<B/kITCcGB4cl\4SqCDk
/E^GS$ M\1GNJQKwIBQLAXMCMkRItkkDIIBdWmECp1IREJCpy1H$>?*h6Y=J$A:>H99n*/@h:nu4K4cZ?&>>4V&
6B!$j& 6>diRadQQu4&TijP@?V=u==%*4\##@tZ<>>:*9uu#bY@?pQ$^$@/<JE6d*9?5eq*hy>Z8?9NJ&:@D%=$
-A\lE6 000ab9adac4001202b3 Page 180 of binaries1.zip
Y8JWAN uA%uW@LF&c?KjBSjtX/99\:SIXK9%:hIK*:j$N<@+it=?L/:88h@@y\#==$=::#Quh@cyBBi1:?#ZKyq
=#^^$4 4w/=4KdqdNaTZ6XjD<?@1S1$+jhd?P=S9uhFih&K:=ZqhW*j&am4@+q9q/b>A><B=V6L!l^dyRXZL!5G
W<+e/i Z*&Hd@+Bh:PG#S1t+E$69=QB4jWi1ShW49^YKj#e*LJDSu^w=4Eu>n<@?4!9u@9yP#:%GVVnHk*56e:#
=>kc6c 8:$u8?ZZBY#Zdp*!pa8Z+di8neE&w:L%J=>WFi9ZZTh6qGihJVZKk\/T>4JqP+nCXTeq<F&W\HhVA4<H
<S=+8? JjADNDiSH8aG@EBKQPtqBL/QE9lBqMAQ%qJFl4BW+IhTAn?MEmuDKaEjRRu<TNXPbBT%A*+$JjBnKIEj
uyEde% T\uEPE4k>>ScmI!9c=%qL$4kJ%ACQ=ET?EtWRP=hn1QJ4C&8y%AC9\<q<Q6TA9>*qMBQ%XaSiR>dBXjY
B8EEM@ p@1S@jkL@Q/W\L?ZE9n*cc4IAW\F@9&WiHIkJjAHWRJ@MCZ\H>BeSKa^F?A@TAu<l!mSekkq<H>QCj!l
&M&?68 Yy4IaT\N?MMykb>PCj\SqEDMwAV?H%R4pbuWC9lbqQkiTRu<l!tBQ+wT!KNXi+\9ck@<5bS+hl\q<MhV
//yQ+t Au<CJjAucm$^:qlLZH&WE9nbqMB@nBL+n%MCj=K&l5k@5nYA@\Rqu6nZ/Wj?md@A#/EE@tS>KuIKu\J@
G!L8Q% KmZ\@+$TKj?hE9nVKIE@Zh<YPaN9A@>JT8A@SRu<ZEwk#1REjy/YkmbkKeCjVRu<y!u^QaeT?M>RA9qb
SBCec9 %WbpQ4WBjkEq<J?nSNyCT8DQyRV?u%X4&Fb1nc9#KaH@F$4kQ$<J@Q?kBQ+C4b*IF%k:+L>ImThjwkV?
ptIk\h Rp4kL/IEjyG&k5mZ&R4Aj+WT?MYWTHHP$w><qd@AZ/^*Iyj\D9m9WRJ@KTZ\q%ECeVpq<F@Z6&AW?Sd\
pNQcW: */AEjkpq<N?p^QhdqEBiwduD4DJ*+L>NCj^TT8C9wkStGTZ\@/ycmF^NLZB%DTZ\%^/pM$Y$>+C@ulL+
TGT846 :/m&I6?q65B@n^JQd1AE@pbK+G?mBQ=t4bZI>%p4+H>ACj\6qEm=qSL+&!mB@/HYZ8S@5jdA@+kT?N5y
lP?K=V kj<^JSD8Rj1Su?m9!E@=C@\hqMDjTRu<ZbVA@+\T*?YKFqqlLLVeVRu<Tp4k:/EE@q=KaH?88a4e^%^^
Iqn*XI hV<q<A>RA9<kJjC4KIF@TE5ZYe*Tkj<FJb+<VAu<I=VA@=IT?F?yqmJ41CZ\n%IC@^kqW6bTA9<+JjBQ
kB!N1* cG%RCG5D@FPW\Q?cE9muKaF+llL+*&m6Shc^$5A@T\u<e=VA@=aTiF*hkQ!*N>@W>uu?^ShX9uD@@T4Z
Sn^41b *&:I^+dLL%j=?\58WQumJ#/l<1Wnn%VyVb1pe8Qk\T1^WG8PYJ+%^#?KcI/9mGmPt$R$S#AY#ZG#mPaI
$J15/% p1I=9mcmPaLKcI=9MFQp8EWLj%G&WmJH%Sw=d1NEn65ypiNdqMl^B!X!*EtJHHhSIpj@Vj%I<KJ?JL^j
HH$\nb Q^Lh4l?JL>iQJBjwS>JQ/Ei!I@Wn?TV>TDFaQ>LMpm4PaGTZI@#9S@@X4!bR*mX6WS\HY/RYBu:w9!W6
G@G%=@ RTn?X1qdGQmu4bE<E*8:6F1bFiHbSk#uYqJ+dySIm=%qWp>cBT<1IJhYQ*NTJ1V/IJcjTd9nbdqud=Yc
djnHMw F+himQ^VV&Lpu!H@bY8p*e9mqM>dpawm5w&aKS$&\KpZIK<\SmF&1*m^4=Be&t#QC#JymV&WE5SBLM9q
^CHNCb QdaZmmTy&LcE5akh&^LEWCCMLR?RABjIIPa9%jV!Ec+w\lbm+lA*RGZW/4E%M6qDJqR+KTR89C\IQcjI
^9K>>i Lj^/iiA:ZyHEuli@DFZ:am<TNF#5JX/GZ!p!9JHX9h+R#aN:K@j+IlRjt/WFhT5KXM&#JTu\&M?<HD4u
Micln% uX+im8jp+j%wIVhFR$#k&:GZiWuw=X:w8c/&IC+KX:\mA%lca<<i+cF&Z8=/hwX^<<LZtn#Btnll#KRe
hW54Zl LbFEiSy/cbm:1AucPC+myLq8\J45G?Tiq>pwMw+<%E>RA8ykia=9cyLtab=Bk$LGRZ&W:ljI!lQZpS\/
n/nYMd wykwLXD@#nA4wGAT*I>c%KZ\>lcVkS%4Bkq!p5BWl6$5iJJq1A!1QcJIWJpIdY<\cLHEm:W!9<Jk>Ea=
D61=6^ QyPSGd:IwQ\FJQhckh5I8#5qnNEalGRb1?H!AyBTC!9J9LIc$Dn&LJMNi5*T/:B\HdS!&A=FwP#Q=V$P
/Rd$&B jI<\<e4*uTLSb8C6nyHR>y#MM\WW$lb+iVcw!KZWT$FbZ5T6aVY/Y4\+q#&bd1Q9HA\DY*>DW&$@DDKh
%YX!:C B99ctT<?8ktwQI%Xkj/1RKEm>X%VFeq#d&SmMTMQ4#lc9G%D/<m#&%EPykF1a1H#:WK:$wZGcXSwVSK&
I&ATpR A&8TtihqVbImnpe+ywE<>EPWWBe:#mK6!h1!J8Pb:8iFnn&M\<Vkeb$ZXqdaHF^HB$YBSklmDE+Y%1lK
!eJQ8= dtHiRKPmeI$8a1F@BSZAQb=LCt%$eGFWB/uZutHci@G>MnX!Mca>mVmhWIM<hXWQnF4VKWZliH=Xqh\S
Fct>h& GTGFa%R#IM^nHZtw!tYwCkcunKiyED?GQeA\W!MTTGWeaCXil9%:n&?4LjFwNYB5aHL+niKA:<ZA&1Gc
eEE8>l HCRYM511u8M&pNIWIhF8y?&J\<5pp9aw+$REXSt*W1*e$/AbMHAQ\$An%W<>VEKpDq&yFp>V\@nl6^9$
cRJRLw D#lkE*qaq*1RT*5wql<EpYRlVQ4#em91XdAt$tL=5KqBkY@E%<=<n6ack/kFQa6WtNFYnD#eP$pChYDY
ta#WhR yM%CT&%C>y$aAw+4Mj1>QWQi6l%JH4eYeeam&5M<n4Mam$MYb6Jl=Sm@8cYq@PR=%k^V1RWDAPynnilE
6cmZtd uYGF9R!qPK/NW9CT^%JkQylFH6jR$JIXaT&\w>lQbL<+^RQdm1PA4W>:#td$&TP&bVe@CMV8wu$Q&B$@
D59+eB bap5t&6KF1dTt<RCQZWBwFEiEITlnW#<PLIDeMp%#<q\9PFL^QZK#XF>l*X!:EJG^1uL%Td#$<!%$K\Y
ZElwPH Va!V?ZuYKVA\cbd=d/AYI#B<k#!I<<l^<D!DemGtFM#e@lFclyMklEFYSPyG1i*uWi#CaNuXA#R6!58/
/yDbkS 56C%?Yyi%TPJ1*4+5My?/IbPI4S+A$JVuA9nHyy/DA5#B*dBSuqcKC^5F68=%PPJPR!LueXwWah@8EW1
Fi<?%S d4Hw\pnALCb9tN:Ilpb5L9cQ1Rh1:GLC9DjILhFu=w@9<5>P\>C%MJ!1B^JcEYBh!DMPcSQLt6SNSSIb
iNbD*? GGFawMaah&W><E=tcVtw^/Ncn!mX\5ieV#M6Mm!KmQZwVGLLDhtcM6^%ane8>XF%9T^#M%MNDQ8+4/pT
q!t6/D 6EEa>/&?m%d8i*56Cw/<iEmRla%c?Mn>*Y4S\tFS5*!?K#*WQ&T4NFZEqNYwCJwhR<JCk=8K8Fc8HSK+
w+We:y ma&yEYHWBupawubI^Y%EuVEcji9hc%L+jtFtdC=V*>phiF&\nQhZBG>cd/6IB!XtLCym*6YKaJ1\dGSj
QVFD6I XmSkWc#I+#yDJMt^YpQZ^A6Mm#5^i:XHZA#LLHI^elM<Ga#SEE4EZwLPmSPtWZ>Niy61ptj5nBaL1?l:
l4jqWR :HjYSBLZ6cYyJq#pZZ8*tk\Km+\VE%ucd8IKdR*4+89VPHje5m/+#uS$uaK/BLV&NAa\F%Fw\%d#AiwT
?eZiPX >plIM+IE4Nm$t&E9ptH^LX66S^!?D4eTA?F^8b:<?ZXJyb%==dRp\=\1$bFE&l#ZnXj<X*IVJ1<#K+j%
DKAG$6 J89GY6!A=TCP4b&q#=AThRyRIIM6td?hK>hGhRDilFe<\Mw<$6:M^kMjDRH8nnWFylb?Rm+%G!QSC1SX
d11y+W k9D:$l+4lh$qHYaNB\B=Z:hPD8jCHYI%l&G*#IwetE6QDLi*cid^m&YChl!>EyWE*@GeN?GY>@mFC^wS
MEbXJ! m#wEQ4pLNAGl>/p\NAp=q1lJ:Q%A^ql$AekPa&u+D*\#SHX5S1@XB6=d1ma8Fp^\u#Aq@R@$W8t:Y?S?
hRLN1c XyC:bKD5bP*CC<PWdNh#1hya<DMWbl5/ccqL+KW\dyqHenjFB=ZleIb:EPWiHC9RF*JSPmEG#eh68M%8
5I\Y1L pjG^l?w4dbS?j\Eb^:tZkDTTZ$D#=bZtJMtawcu61ZZnJh+EaRLJ#=TEa<1CSNMXTGP*MQRe4%J#>eKG
1SZP+? G8/INRnGGc8C?k^RG?!Y9A88kFYAcmJ#pEk$T\CQR>EBH:iq1N\6yk>GNdR&npG5#I?W5CZJj!^!%#4y
ZLu&J8 W1X#bFdEudbj&KTVSV!GlN>+dTZq#pV@!Dum4w1TXpynEq96=puthaYGWbQM>wAc\+8lV/LEiwDS^#DY
FDiwc! #K9FLN$MpjF$Pl*q#6LpBSm$8EtLt$DqFh4Peim\K=Iwm<F6!e==1W+XYDX$\G>W1i!DCchyyZJMqZW+
nwBYhi ?uCPNQ<CuSQ/qhLRN5m<Ci\XJe?^*c!#a6Xuc4XXc#>*I+^/XAGm\jkXV?Qa+qqGc/!8*mEe/uTA\aQR
F*5pjq I8aT?Ra/y#QM%WR14VpG<>JZCA1Qe*<Yltul?qZ&GImX$tRNPp+^RNl4uBNS9>1FdhB<*Idu!R>pV\55
/C@9E: PC5miKqPQ:6u$ABVIaAZi49I/ZjB+*^Yjkuum6MXW:VJ>T>JP5q/ISPntI>K11>VHL?G$T5LnMM&@Nw*
4pppN+ wG&*kCBEleRwaIky\JFLPI%e<Y>@h=6=?F1<X+ShhAKWllh1R&8wNi/p^ejm/<l!$pPa5njB^PQT!Ib<
11C9!J @a!%$pMc#bYPc%>TaNmDYcey:kI8Jy/5qD/8%@\tJPiCTedkR6dm?DpIIwnCenJ/>BMGjS*5Y5q=/mkd
W9Zy&4 9&t6%JM/e5X:bRqKbEdY8daGdINEGVc5M?&w@TwL^P4J=V=PjE8Zc!:$hSRCd\%PBR85a\1NAlE*YhBe
X+S=8b muL5pA$L#1tFhH6mILaMN^nD9dtTt58HSP=kG<ASB!YpV8RRi+ckSIuDNmkmiCu%JCwCeMTM@DhNNqQF
K6dNGN ^BaRDuGmpqEaFRj##wt#WBt::@BHt\h8>^ATdyPly^pm4!K8STpwhTG>8A%nl^kq&eMN!JB5^+q!T!>L
9DMFwG lbM5Ij85k:P!Tjhpm<NdR4qaS%#GFLM\#F$+@ZEaF1y\qAR8P5#%G\wQS>jHbFYS+V&&k^@L>c9?HC4k
P6HwRX %e\\W+IbKq55+na*Cm\1#DI#a4TR+Rbp?I=qwRu%Ek1:dGFMc4?8Lh\aA/NA$pI4V=CJWdmkQ?Epec\K
a1RA=B B@VWGP%4KD!R@STIKakQctDetiiZ+/EQI\4bJXp@wB:ZJHJ!8!!^k!ZCk!4m*dS%\P\c&9/I#S8VwVcN
+!>X5j B+^?Q\?wP%$Yw!%MZkC@%W<*!>*Tt/e\c1pnVeMlp>:?h5PQlJYtw$6iYYyKF^F6H=EC5&G4$pmKjYe*
wLa\uH XV&p:Kb1uL5pt%ZD:luYM$NeA#iNe/6TFZ+&Tct1!nAVI#n9w14T/ImD1qK%q>NW5%IAqw^PVnqtSqXJ
YYVa<X kJWt/=PB#cymCZj1ec6S>Z$PTt/BPbZ8YBq9ZDLeDL&KCSpw/iZe*jY*5ebDu/SJ?JQpG9qAu\Y9IAG<
5hk+Fw \!4CN9w^8dVVMQw\L!$e6$DVBwy%P@ha/SQ?Th44eb#pIJlTS\/&!cE#e@AR<^+=JPTlTTRhZL9ayhKK
NBMcaq byWMiX\E@:5!bjwDYlka/=ILn^PM=LCp?%<Q%i\$kkld6Sm?4C+F%\!dATA$nlXD:::ahcW!p&H8lL&K
1=SjLw aTPbaMP>Iw8$hLW1ke8yu<XSGRuIbY\hcySGT?wP#WueeQ%N/XVPV+*QZ@t1DN?!d?KBYT!N#PP\X$E&
-A=?h+ 00011e82e78001202b3 Page 181 of binaries1.zip
9JQd!a =yCGF*IWj!GKh&q$p5\1:AC#tb=e\9:H$KuHTiIG^6i8?=IuubY:91W5HNMZYFj/HYZM=pRh8+EBy+A^
Nej>4B Q&n4ZkWFXykc:\8Fj@qyGc&8MCi>m?ZJhbmE<lM6u+%jV:4b94R<pwDIJVB=CjI%CnD$w#c:1Z^&lycQ
T8hqq6 /Y!!N8W4!M:n*e5*QmP6R8DA\ME=FtNKZFQ?mBSYqb=6QhTJH4uGRj/Q!\e8Mw9JAHBka!Wc=hNJd=T@
tVXSNY CPZdPYy8=tiTa!dcnCCX>S>Vl&tAXnAIMBAJE1Bw/ha&qV>w>@JVN<qN<iA<be=8YZ#E&/4+\d?tu:aT
y>BW\a GX&HB/>#M9a+#Zh@j8Ii9Aan?T%yC&LTmnc5>PH9pZIHJmlbDG\qbmwVaBkVMlq%@?dl4jwPca@eKHL6
eIpbKB XCN=>h@LI>Jlk^Xm?T1!:yVPB1bIq4!LB?lLc^CmqQaM@llHt\cFcql%$!R%+WIW<+M%M1BP##5$M\$t
a5NKGa P&jANnY#L>R%IDTdP1A59=SlRdZ@khZj^H=h$My*?u$?>%JR@9DMVZRqm$y/GKDj!X!M?e<cBcFTMykG
h*kBRt Ih^6:6<9ew<1tVmlG?q<yG%#+TYbGWwX>WwJ^tdwPDVp=qaa1GMD88+qL4^Ftj4ZiZ%$?8/A5apKe4Ka
RdYQmB ybbSR\aNC*SWpYA6/cqKD$P5/+NJatBPt1\GFF?lmliBRLXMy+t&?>B1h6jNQI>JNDcnd\jCQZXlAw$Z
#WY5wJ KaZHHdmyj=*ZS/iQctNya&TLbbal\pmD!$Q<PIY:$#A5FmCDQi&bbuMD4Z??Fu%VtlIVb/QmRaFJn8/C
TFtMQR benw1cQS<\Vtq1^n5#\5k/$+>b^Khc>IQXDy9?D<aaR\Y1nnlM5Dh=eaj5nK5GBwVFSRq#+@6!1dBM58
!pIlJm @c4*Y!1wjn>W=&p4&CcaS%Wh=mHu\yN1&M8$8q+yC?F\GebAt8m?n%kc#tCw#VmBp@?mE&k*6A?+hXiY
GRq/81 c#Y$J!YGldM1m$aP*FC?*<^B?Ril9JPlTT&aM:>T*uIVB%TXF1qR=jY1JDtQ!FDZ!%\9k8>WPwdwYLV+
mu*SQJ i@=KZ=C8+B*q$8!^aM^dE@<#&9j=IAhbWlqE!!8!y4d9N=NRj<=nW4i&aaSd#&A+6HMVHE$TD%T*phQj
/<65uY N=:mqL@5KhJS9Eyc4VDa<VeF%u=H<+u%KN#BRTThRSK4k:kha?mQFY4/:#kLe#Y9dPE8a&LSF>8=DjBH
H+tTw^ HtlJWE%:C=$?DAQMYN&6&YHiQ/h<j%ByN$F$RGjkhCE91#Ti6HDXupt=6WLm1^+bPSNnw9bPqNS8cMqY
VAqj*# YtjPE&Qw9dKw4@WZFci\R=nTtNukQQZTBE:J!GMd=pu*QyKCuqSJn^IcSYeZTl4PQ4c\ltabZC!abQ!C
RNhcud HiYt=GHqLw5TA*Qq8l!6DVXeXeQaqh!QRBqBA$1DNkW&J6EhmZy@jJuyDLp:yCq1+1mGqncaY>eaZ%l8
wC?qZE LM\M#GmG&nP*!IcY8!Sla:<pLILW1HFbj&8wbbLEhmLYyDJQj?huP85Ttk?%Ac/TEWLCQPGtIT=y5B1c
m6*P$# \HQ&p\^LV&4BSe&#4AkLp#Kp*Pnw*@IIMR>WpW9:FiF<^+VFnAQ%+RnaV+&N$&<Itqwpw&W4>NREblVN
k!*X?u D@ZR!ahGVVZ+dwNIWp9L:>hD6!uC^wbF5^+n+Jm+GR1^ZDjnnMh$h>!EmyTGR^8pMcj%L$p^BLBTaYGt
uuuk%4 +$XVapbInHZSkyed\ZD+GF+acmRWqS//!SA&6l5cil#%1LT+DACH%lPeQjChB?884$$Q^A=FmV*!wTe$
tLeitu ^AV+nY6WZyZ=>K:FuM@nB@//&Z:\+>L1l&!tII\Md&L$y^Z<cyh^qVRkyEGk=%BYT^nk>km<Fhbyq>N/
D:ueu* a>e$A=P*yd:LPEu/tkt>4=e&EC!lc=YBDeSIeB/Z+YGi5/^/NeN6ni1RlGjTX>hanGWMkF%qPKCK6@Mw
I8*^+u VTGV:Cdnb@HHeJ:!TI*6baEM5$&5ZhRkcwki8c:CjKRK89PT%M8=D%4H5I%bdpK$j4$M5GA=kThRL:X+
!SqYal j^qcq>Vn6u@GI\dX\yD^^ACntFkZ#HGa^IPNGM+DM/:HmHjVpRRd48+qn*QnDaQL^jk#e#?CQ?BmXw>k
6Q\R94 *Aac/!Q%m<!?a:MYYea#P#dQW#R94qm+iPnHBb8\VDAWnYaQN!hh!Dj%mEh8k8dR+181BZ\wpQuG9A<L
J?c%*C J<X+m$%@tHG9Q4lW@hFZS4*LdmEQGhTpA@@REQEiRSWWFth+hW=F&/^^WAa/ZK\hImtteL$^=$qyA>%b
EJ?FTW 4yTAyak!?E+apw&G$Dm&FDA8wHFPTHdHKHJDmT!Qp1^T\9G>+icICXtKHn@KGp1aWTF&ub*9q9NhI!Ik
l+FyZ8 dlw>TR#%Md6&N5>*XIP><QbuaB1DH8dLbp#cSIWdcqm/TYQWeL$\Ge:nIWGlP\Vqic=Tnd>>Q?#w6hVA
JaS/@W #PC/Bua=m+NkHa>+/9VhwVN>G^1*=wN*Yc@J4jTi6ppdywkQewRMWI&Q48*u&C$ME6Wa8p5KY*Qm!cy$
ntLQSc y?:Y$Bumj4%Z5!Z^M5$8V:hLP=#@&QWDbykl\\hMl6$ePJ!\hNl%Jc!H\\P#QYa%Vp9AcAj&u%DTFHQ?
NZLkIG mZ/MdR//eP?MY#C/<SYW<:8R<S=QRiSb@@E/Y<\L=wBLX&QQ:R:y6b$<pQ=CcW%BLH5A/Keb*iWSDk#P
TGW<WB =W1GwZ*aHd8Tcq^X+=H\6Wj==6^Edq\cE!qSe>JRQ&Lje><y##*+TXt8a/He@TywGKl?CmK5b:nMtV1a
>#*Tb4 Bd@I#e+elpbZ6T@u*TF>cWTC$F<wDVAY9i=?/6J6#t*\&AYW9$?Xn:8hM5bcl16l1IMpWY=5CLaJ6GAF
9HFTDl eRM1Q%tJeMG>GB==\kRHW:e4=YEVaG8=K>YtW#+dYS&lm*R4pwi&>MTZ%Xu8#IEeD%KYIqZ\\JB/S5c/
PZhT:! nZ6F+>JhEl/9TZehNp/Y8FWktNGGaWb%yR&^!^CNu\j8btk?ul/%HwPT<m^ZhW/L9##Pb</GiVEbihb@
9q5RQI ck/GwMke%wet1aY:e^#nWD\tu:F&X=#uKuw\cTwH1>R>%6MXnWED*iul?cdhni:J5KbtN?ejBKyRh*PP
G!D?!^ hL!^m4d6^T:eQn&@TB6TSIpZ/AatqAe:yTY4D54SqAIW+WH8?b*XQl&W%\&6bDjqB>5taN#\4$4qM$dY
8FCy@? tyT9/WGE\tq=b<MdK/\SJNk=9%>=*eIe:Zladm$%jeaA?t4*ZC+Q+*Zy$ZPC=hE+6H#8JX/pB%Cq5>18
+KiI!R 8=QeHK$e=E*ck!$t6MuTSMXWia%1W@u^N$BZ=%Y=VN4VlEdt&+#k?L8ERdKjmw!?WXyBDlZAGBAGiJZ$
!V#1Ea =?*4mi8ES9SqHnJwlKD?KHjD&PIt>Bp5y6$Fb+JF=jbcAw?&\=!1C:jSMAjtWLMiHnl=uhV1Ti^pj+Ri
6HemhK YXN$mnV:DYaLZ:5Y\<DbXE<uC@JqP!S!y*RtcYmne#&/mtmG86QG?+Jb4%1u@Ve/6c861@L$YYAm!Y4&
IQPBWN kl!Ih\cw:L4NM!VJY/4BHt1VA&:Fq%1M4GLZ5SXYt&XmqL4LbDwPJqjQIDd96TF4a@^Lk<9kXt\NCW$+
46emc9 1>KLH6+DIn<*?w?Bac6&5y1QwbX&L$=TGjG&&JXX6^L8TbZc/\8?A*bmqbS8yF98$ZqyYG&h>c9QLMjw
j#^WCV Q648?&=ki1yIcY%d9HSw1BG6lpd1Mn+w<1BSjYDa5Lj$DYmA\h85ekKPy&iT8ZX=Y\CL$wW:b4V9Nnab
uBLEIT N5ZL#Rdd!L!Md*6?a^86wV!H!^ktlL69\WYqJnBG*FmAt+QZl^wQNK/$$n?w@*Db<4an1Y=!tSl\wk1H
5cw%5i P85L5/</19/PEBbGEEm4@=dem*pk=VG%YtA1\LHVX<ZH#WE$:19X?l8j\&LQ$J\YDHjdq&958dH>dYPa
c8F%^c QBq1aq!$8Ry115N+1PK:aYX/Sj@RECCNbSj5GSRM1NVjH5%mJiIWHPbiQT6YYin?Pw#M\1chPLQn%1nD
lhyBnE JM$X$/:c%t4i5T5*+\yGq%GH%NSBHX!1X9lNhXnFP8nGHI?Fya:yl:k$8hwQ8a^D5#8P?@caqwCkB9YR
IheF^k XimFG\m/w#H<*c4R6ENZ<6nK4w!*ZY=LG4YdN@Le#DF:hDq5awciN@1dYFh%?K*Tj<yQTVY6N&D$*G%!
IVu%n< n@LPZ<McRka9$S+HtZ11X$84:Wdd@n1Ci<k#Ja>X9=TYK/XS@c*?c^FeeJEK$IN$wZ&R*Zyal\6dD?BK
IM9TLn H@MMV^uAlWl<R#1p45F:<//iMITVu>K<$lT%YMpP<wVY&EFnh1FYHp>yiLBNq#=n6wb:/%X\ZjTpRmwV
/#P8hk 1pCY&bp4@\qH5>Zh11W^aJ?+jtq8Qe!m+j$BLd4#kVGJMJk6Hny%5Fye@q5MB?k\^A>c?P9Q!FC1HXc^
NhnKPZ <yIRyVK^nHI%5WTNZnXb##hXpcpl&D8LX59ytRMDnamZ&hlV<<jDt!*5dLmHil8+m8eQXLte1lS8qq4>
J&Cmda AjC/NpqjFdX*T>JR^L&MaDZ5VlJZ1lSPAcbm#KBun9Tc1Fh%8li91<GnKqp>G%VbQ?$eD8=G=&VTw\cy
w>hE5J $1MAuh$>Dq>=pW=8N!^duBlXlwieWYIC+mb4JPhFQLC^ye+ZaL8$WSnY\ZZ*duyeX8uB\DSImITqHw&k
\&F\:* i6Ik5PW?j5ME>DeJEGq5a68XHtZa1%<Q6V?qI4*GGDW4eutqTASQFwQBVWyF!kC=t@qNDYI5RYXm1kbS
RS/=cL Sj#C$mk%nI5yZeNiVa4w8/WmjYXG4pG:CRbJD\!1>iVj/6NPiRKeCI\Jm$9R\m%=uq=1C<4R>PaK68?V
y8Ye%* $y=p=D?a\mSupaqGkh^yhLwBQPIy\%EGkZ:w9u9CGeeVSdtiP^yl1ATuaqCh&PR&@P8N1QhVlmZ$/nVS
1MMREq $KTi>nE:5CMVy&^LPwd\tDHRhS@>nYaFNJ^mh4/XthjNci?^cQkM#pCXAePebPS%H!N>6\!+Wk+Pp*L#
Puq\Ey &1^iw15n5^=tjI8p#EAViX/?Q+MS=VKF=XAQBQZ4wFGYaSy8!8L?DGnXG^pe@1RM=>L9TLq:dDmAib<K
pHjn%% DMXCqGhyp\JJunSc5QeJZRZ8?*@n*!4?@!9>j%H$QN:#iQW9WRi*@Ju@>WZV@@umYnu5Zj+Sc!qdj@Yj
&An%PB @?9+N=GN&&Wm9LK>SCd+$uqSS+?$huT$l6LhAl9!cYqdLB&SVE1pSpSHIJ%dYke8d8%XTN9ajch??wt&
8cY+\^ d\\:K=LJkI!?@?uDRGm:Z\:1K<@4t::?m:<G!Yn4ZHn@c>588&JXaEBn:>@/ENc/:pZF%yZ4?/c6V#<Z
S6p<9V I/hDF/\<b<GqV&$8DGm9cij<pKC>dul1=bj&&tjhij5SNHdldb@hi6uc#YXPw@bb<MNLAZwWwQX:4V#Q
@mSQVG t\>R!@$Lj@nGkm9Y%58eS8&>:dbRm*61XVJ/%ZuyFwLTdV>+a?8Te/nVYIAGVd^m<1eAP8V:V%*@tWHZ
hK8LS\ V*4@a&?JjDtWQ4SBF$lW!?LZSA+LbR@i:^Sb@FLbk8M!/Y\h%hLY$!1#I/q%Qt>L<bc$hc/ieiR8taLE
\81p<Q NmR8/YVmH4ZVbt<e5&Lckh<bQT?Wn61MGjQZn6wa!4/bhLWh?8Le:@*1$GeZ^#Kkh41>@eD%>R94D>/#
</RJTC PAL8nBqV#%qW+i+:?bEdF$^:dnX\uT@aX$=c88GJBh<<8MRhPuZilBL*+><<<48?Y@/J8Nyw?<yQLh&R
<>iiAn LHm\\k%S*D=W@jYQ#dyk/t*QSRd&<NINn!?+%eBt#ll/VyXh/?8@tZ9&F&::Zbuh>tLylm<6iEl^uh>+
EitK9: dQDV</DiCGb*:MetVL=!:=NkM^iD$ddk>RF@K1<B?e?M$N>m!8!R9dBcShK!8BABuiu59B=Q=aDX8/V6
-AeJW$ 000178db8ba001202b3 Page 182 of binaries1.zip
Q8?9mM CPt+$=hJ1ZR8ii!/Je<?9?uiTLwH4yiieZLAHDpnpNyBp<>cNTNR!Di*Q4k1#eMIpFH4L<#GZdA1*:ah
h6Vu?@ pE??ElRq=I1<99#yBeE#lI#bMH@cBeYGlS5X5uL=/lITE4LLRNL=$<+<eEQEk5:iFFTRF<InX6WZ4Hki
H5>5!Q pJ:%n<\@+1\hG\a!q!MY4X!?&EDm#ajjpC=+lbC?/>Q=e<@i+cp8i#$a@B!RWTBm1*&M?TEH#y<:c<k^
!WHFh: c\:aKT%6TNmDCT?K6Qu>4eRluM>bJLXhWl5<jNbG\N4dN1K>y8?T9SJy@>YeD+<?<qyj&wdiNi5Ab44H
k8$5?& 9J=Sp&/d9YbW^Muj@6TeE\@j6J<9:YQ9unZ!8^5=5*9Dc:d5<<cF&!+!CPR?eJ<#kSl#//#kum8J&HL\
XK$SmI <8*VZ#l?+ypGkVIP*@emIHy9uXY:iV5SZd68jtDTnei@4^?^aA4#/Np$1:b<MSHhK?:bM8t/+/iYmHnP
ydjGb6 w5Pu*E9E9Ft%i?+$iZ#9*8ujP9=>4$ReT8&%D<?wZZ:GK&<jJmQky>RKca&/pNdS?hky<55cG^H6ZJ5:
bY\JYL /w#LH??a9RtZu#9qyqjPiuqbcBL<B:hj6*Dl8W^aiM4&ZWH\Wyp\dh<4$/u^GWnwZH9K6e<hjPY/MtHu
y5P@ZT D/@<%6V/DL:Sje1%9>>%Vbp\beY6X%=^#li4lKhYLC5VDk5j9DJ?itGb5Q&ZAh@wiA=VateqGuWaAN9T
%PbI*F <SI:ibj5Tb5pi!&?KbCP65%LX1>8/$G49F?/PqdQ<GX9NNZRaaPY@ACDyK96k1ie%Y*6m#6\jekBV>iP
HMim?+ P8&YA#E^mSu^$1ByQ>qCVG%l!/MZdu8yV5!C4biPQc4a5Nykl1$d%MHi/ty:bYHd&X@b8lJ8a>j?J!!+
bCh*h: ?JEnq+/bwbc@jhnHB/&/+\Ga@q$L&</c6j>Dq\K!:+hjY*#/CW8VGTcdbi5G*@anF6X/<IKLk+Z:*+t&
iFDGau :N4:^KqLVy1#>QwT5*Ny*@R::tXS+bN4yu%q@+L1:H%IjJq*t8dV?:y$6V^/?b1D*#>=!h^N8=5B6M*1
JY5ii5 y?GQT&jZDJt%C*hwtbd6InNdF:<mw#Qy:n1li?dIJT9i8kRX/&kbXccMae1yV##e<hL/%D5Dy1Pq?+W9
?b^L=a #D#98/5*tcTVVy9b5Ydy+^e8b6KAe+:=<9Y*LT/VQ9dqteNiY94EC^9%4Vimtet1K8tpcVMQZ4j$<XM%
SG4^B> \:GjY#*#1#iXTZ$jPikZ4*lLh:/\tpuLZ@*C#QW4pVRa96PE6@Dp=X5PtQtyc@GpA$@PiG4*Ra\&YmM#
5/maMy e1q6k4*eup64V&$%^lEj##9tF!iN&+TFc@Tc!dee?Q5*q<!JNPHZ+i^jjQ+BJw#h61qI<<K:!CT<Q8&M
mck4nM iQ+6t4Bw$<y$\a1h<$*C:d9P@eW^tnDtR@PR5G9uCTdl9tY#j*GmJm^jpCMl<M1Eu&X#<1MQa<JdV^??
9>*AqS <5IF\W6IiL8hjlbMayiMA=P+yPiI^Sm5F$qNSq&Aah+nLZiK#Al%DF#!=ITye!hlIV*l65P?ji<Fl<\h
j^k$ME e^=ZpZEjj&V$%biYtG>8tjnkQdeBe?K&SXhFF!\KX/ZEnL>\d68G$+HlpM#&P@#Y\%dARC^/ai9Xe!=a
8qaqw/ eE?RatINPi=V58:pE9K%LSN9QRJ#9j8L%&&/i6SZFu*\%RTR/ejNHh5Q&Y@m4ah>F=B@8HF4?Q^ZFl%S
iLyWKe 4Ahp:?QtD9q+A=JN9QYD%^J!^YE:u:>\$RiLHaBMQP/VP*ieBpk9q418dTLV\BhGBZy:AG/ut>6G<@B+
MRZMe9 Y<<j<A!?#EbjJtV5+AK4X<5M4D96QRPZ#JB&ZM^jnCtA>Y^9LLw6w!>hM&jm/KQiI8DyJWehN!?R4yp*
AlH:ZA L#9p+n$PiIJVmym^*4d=b!\+>YSkBt:6?inu:kbt>e/ZVu&pdeHYt$yM%/qjQPH5kdPPB/b9@:=HV9^Z
>pZ/8/ a1=e>@#M9@@w%AqXQl8?iMIuF=%?HDHI=%kjtIi9Y9iNS@a+8wEbku#&Q9Gpn\C#eQ?iW+>qQphh9Y:>
?pl5K! 4DH>?i^MF==\^KLV#\VtEPS##CbkL4y1*aW9J+i<Bp\Hbt:6YSZnu6%6AA%QyYY/FIQ?IF$u6C>8qdcN
@XwP@= W/D@cNnRTRjPHn484mX*dyK8PR9@8MjNZ>%:?4tc$nby@i\S^W9!QFL??i:\9l$QV:t:jPi\MdPH4d9^
eaZV54 \G8Se8+Hq8&+i6cYY<8WCeu5aS@@#k/tuP^j<:N4H8=4yF\@i>t/G#Vq^A<5?>uXM*5cKip#P=h?=\ct
H5wNte jDm<=thZjdZ#k*i?a\b$y1TJV$qQKl$h1#@hl1X+uh:W>9uM^eM:=/&Vkem1y??#n*#kk?Hmb<%h>?8#
lRE6F& Nl&<dHX=N@Z%Yi&N8>w=u=uX9tJbmi^<Gui:4qu<:Q<Y*@<@?%h@?@@q5QdR&q5P*khZ+&R/ul<:/^@=
/ka%#* @?@4&dNiu<D@1?BDc:d$nPQ%4FG%l^=hLQ<ZQ@<PWE5DBBRAAkAIAG^XdTY^c9KDBHpDAADpBAA/AAAA
4\@i/w a&^ybY=$e!>\b*A9dYFnL%BHWGN5cYX8hE^yam>#d*X!a&W9WEhRW*B5aZNwSuJqbT=!e*JnLtJydyV>
A$>/!@ B%lWYbj?kXcSM^RIk4t%&=!LIPcEPcFmBpXESHLPPYhSWXFSWXBSWXG!kCCkAyK#1e$bM^K1#nq*4Z$K
:KBXES 6Gjt@y>:b^+?8>ZYw84<>9888Dt1/=c8&&B9di1$d+tn8jqpS!hHM<:@Q@?*j5Q/Si5*GC#t@9iuJX=1
1<+*Rp Zj$^#Vwn+bjY@=j@MCDk9CV?CQ?l^I6Tn5V#W9mZVW/Y/$&h#Xi:YD6d&q6dtn6KuBp*PL#IcwHLHp8:
njSaYR yidPc@?Qq:6l/?4J:9A@dyQ*&V9>?aIa?L@@@jjm!?y:mR6huJddPy5:&yycG:m#Q^4bY6uc8hqKuB+t
8<IZVu E*=:J@!X!=*NdTVPittEF@88Y4yk5cYVtdYhp+8n?WbHT%NdC&6#<jC/AiHFbub:#M%YY>yc&4naLDb%
MVMbXA N6%k/Yp8pZBWPd\a@&&b1i$ic*QHnS:&<JPFk<KL4enQ\y@PEii6=/$u4?e%6+ZDE&MWPA\N@:bM>NZ*
HjkQEL K@l@!h#9HI$bC=i9@9*#T^$n:Qhh&:$j*pc=@6>:HH=p\4d<<h>KpH@8?#NXPCM++l!b@@ZY>Q$>?PN<
J6HYX! <eX*GXY1y@Q:%++Q:%/@jQ:9p$j6dc&6LZR#%eSyENRQc&l1dtq4j@#p&a9Zd#>$jQ4++iQHV^&j9**@
G6XQ:a $huX$!8plM\VbmJNCRW>Zd</P*@??Q:6/&j<p%:<?/T>6iqB&i&C9K!M1=e9yy+>p=^<NtZ6IC&lJ1Q%
8$Z@!Z SXN>wQyp@/4e*L##Edh1&y/<iNj^9dNdRHEyPwmyb^mcyqaIBd$>*X*\b*::$9Hy\:5*4%?\4//=wd4m
%EVue= dtuJ:WJub^e*:<CIk$ty!WtJS\:F^<ZG^MRhPyb$>tJ/bu=JSY*#\&h9Qu*9/9:=qjuCjKa:B5G4j>Xi
*PSC:m jTe*QiX+jFSIkI?u8+8n9c*%@u$Yi&q#:l+#i9e+$%$:Va^NVHcc:6=ndtFybYQu+PLt/iQ6=iuq=i*n
c&I@j= F^AWElF#+HDm1bT$c%RYp<ueyG=\d&b?#yK:ei%KG4/MlQmawhGSEYElRRH?99kZPNlcY?+%*dJ//cK=
6+P6yu M@X$hZT$lZ\qdT%yKWqyPYY%ARN+muI!6LT8uKKK5yKCk1K!mw1CnNyMp$&d6/#lG&!#5Hb$>\tKmE6I
BLhiqb VEyP9Zn=cpbY:1*m<51c^4dH#%/>jj>S?Eu/+@6*d>/?@@CS:lD@@PZLX?/QZ*TQwJ9VSZh!jky@eH:T
kDhte# uh!8d44u:?=juV@Jl@Qy+@9*:>/?jjQt>i6ZL@9i$1d/8y41/kiCK8aBZV&6y1+iQ9dY>phQ@u$Pj$*H
5lQ8Ee q??hQV&@j5An<9dX</iQ&y441!99q5JHt*$#+&4/=dTL=?uW5Tuu#mcjPbX$I9HI+jm+tMm\EHkD9D*h
GZERjK Zb$hHY^6>q98NVjhbtT+i9qTk=h<Vj*q&&$DE6L9NDiZb>*I8JcP#<iy+\G4hX:^\@lm1:keYw\nJ8V&
S/=m=E m6FeSw!CL#F^PSXcYY#A&Pu9?Z@4/C<*69GNTV!XjC:qZHLT$jmI/EPJb%LV4q#N8JFXX69T%6Le%ER*
^kXXC6 T>bZX>\4L/Z8DCm@X%qh*>#Y*6=cZ*&@>Hb?X5cXC?iYuD/biP^I\1H+&Kn\aF>*S&9#uX9Z4%1!iMG<
84kCkC 8ZQt#J+#b?/<BR5Nq1%e8*G4mjq?B#jj$Nlnb/@tqhY&6XZj!W=Lm9X*56m/ew/8#u$?\^iji=hSwuy@
/h5Wl! @jn&?hQ:6/>jQH9/=BHhLkakCX6/typY?Vd&9Z##@tNHB@&J/bD:@QZdn<=j*V$CmpcEJ9&B$Dj!9PM:
R/4JIT @dm>ycH!VqF?VtbGi64=qPVV\NC=^E*DSA\NGKk^b8@h9J!<@Ik:dW>j99<MH>N@EJ4&G/G9u#>>kFj&
^aY:PC <nt?6QdY=1c//51Ki*ihuX#e9RMnD!Yqunq=LPHkkXk/Sl$ST4/ACN&9cY4@>@ZHd%$>Q:<^BCKta<mu
pP&#Rl n+Tl1/puDpcHBQl=i:k/P>ndYP?*BI4&>yy#>qBtuD&$8d!F=Z+dY\euF\>9H^@ct@FS>A5IDAtQmn%+
?X^k$% =GV!?T5bhA+ut\cE/J6mtXqbA9luaVd%Z+/mI5JDSS!=PV9aY8$#*&Y$!tDBHH$SS+P$y\/YqbcTqqMl
e+a:#h IMuKTE9L!CwwK!FI6My+iVuiFJN6Y:ed#>1!#<dJ\#e+<pDCeiVw!4Wd\FFJiYX6W#>HTm^HeLb%IEdj
h$QBKj 8J%hXA?ut?4lh9?mP+W@tW/^Z@?Vw\<5TC^H#=+<j6nYAl^XQ/m1:K4kX%a>1AcPGkGnl$@?jjH/*ejQ
Y\=$Cw *#1:i:y?j99<<h%4wKmhWHRHD$mp/FLclj?VwpD<>n%eZb#\VddeB^kbd>&$\hARKJ1^bK8%*/FL^a$6
M?>8$@ >@J!5nKBw:V#=$::5^SJ#q$4#?ECSkLAmPHTkJP+tLkMn%Lt@n*%A*?T#5!XJub?5Z$RHa8QnD8ThQaC
w^M/Wb uDE*5@L8N:T%6:a$6:T&6VcTB+Y?K*t9+pFNjVQh46DcRCDK#pm@tJI<EF:1MaRwPmLE*>Qb^5J$/+bX
wyH4Gu B9Qu#P4Y@&jt4Du#F!%hbdnJ&M#T*5$9QQ:Ele#dqT*6>iX=/cjnA%$56/?cK?Ju^q&GS@X&@RRb?9n8
AHZ\/c #T6+N=<<i9mRd1jctFbBC>NKAH4/@CX1$Ghll^^<R6>@kkIJlJRA<JpM?QRTjECAEJ@*d@Ckct?y8%>T
k*VmH* tJh%+^wSwFQA#>tWJM6@BmE@Hb1<+Y68An*q<WXQZ:*@<8NZH#\N\M=@>Ae?:a<A#!8p=@HDhn^jG844
TnlkGC /lAiu/DI\/hTVy<+inn?RG^MhHVewcMuAb/diTZ*1l9du\I<9*w/9>Hjlu:><8X#S<iuX&&EubPHa5KC
mtbT#% @H&<*PF#6RN+cE9PQ61C*66n44AZ\LG&5ZhE*jGqjNS>pb8\!Jn+lMSV=>K8b8dq=idtbBQ%!iJpC*P/
aQL15# AB$=<l*Cy*n+RM\R^Ca+MMDQB>B$54jb9<@eiMQ!^jNt#WB1i9qL6cj@JT<nJcYkw1184k4!\%KD<1Pp
p+QE=i #FNSpFQ/b>Q&:TdtT+%6uV*<R1Lmn^\@qR!HK$CVX%B!6/181j*J5%j9SNC<j@5P##SpB1Hy:8+S:?:/
G/5VB\ >W8A8ABBa\GZH*@k<1+jq/hQH4c*NDWALyWX>?@h9W8Z$*i%:>&91Kl<WF%d*>DeAl@+5=i9**@/Cl>M
F+H9<1 h!ei4GA1HkM%NWBN$T%C#SYkJyXJbXLG@BideIKNq+idC/mQua$XuE*ti*d9MnE&Bt#$Ft?!>It@WFnj
-Au+!n 0005f0f3264001202b3 Page 183 of binaries1.zip
E%FL6h XqFapJ?dDaj4yR9u@Fb49?KH<mXt4l@EAeESeAXEiIV\^bXYA8%SHDd=I*?a#8#X8?#>+$CQEb6VmRhn
&1R&k: +qF/$nM!5*IK1\AQ8w%8X&^t9/?K!14185aY?Ip?bt/p\?q&iqDTejJCkbpAd^e:T>N6G%ed#J&yQ$NQ
k%@&Y+ X=jTaZV@$b8l4#>4*1Lqc+!&t?/#h\?IVDmVuq@i$N=eWZn>:PER6@*G1?iJ!NG@!\\AenyF$kMP:8tV
HH4*@% ^+<BHpG:AF/KHGD#:AWK#?e9%Gh=qy6j*iDecASuTl<+I8j&<j*4q<?iQG^444q:?%b8F4+#Ketupp/h
bm?6pS B8FJQi8n4eYTw#L/eF=iVt:X<c\uH@D#EXIeKqDE#bD@\e$:AAh6B5kPPE81lZEi+?LlE^!heQ4e1iNH
ZbA8bn <iMCdGIQm4Ay9qjh$Qdp%ai9uV&hQ=n9DPnPWAVuJZCVh#W%/ZBMPBEhN\KPnhZ?@bRq9a?!+P!qLed8
>FH+&L R*L5HJ^hQd^>@j%<jj*<A\KDR!NaKFM9b&Vu=\M>PaTidCcH#wY9dB1@58VRyKcACB/KR+LCRwAkjIJe
w*<Eu: HP%5LC*&dDNe8qCpP:%<Yu9AYGWyKYpFFVZ%Ac1wP#I!ew4KT4VCSCXqFb/C9P1!HedGJ99ZdZj\>A?J
y+MmRZ nn>/+6SbiET8*<#PK:^#:$Fhe@8V=*$AkTm@@\CG?nQ!<=*#/%iQbHeZANSJ@\LjS9ZI+#5JH<&Znw/Q
41AD/B H?n*k%nBRaD?JV4iWFj#wPL?*jL!5nK1qC=n!1jh9R<I%hR%NCFBaN<?EN*y@Q/q+@<CKP$mA9RQ!5:@
j6K1lb AAkPEC<Qh%iYIFdiKZQAS*jBSk9Q&JSdNi$QTw1LC9N#<Zk>::MK<Aulm?88teaS++wBN#*E9Aulu<Zq
n9F?F# cYWJJRY6<hM@<+h4/<^ba?wREHeMCaJuK@FRdMJJeP#\:8VtqhT$h4hL6PF*SXhL%NVYN:ZT:Wy6nRnQ
1REquY 4b!dX!?hB?c$\LiBXatJCAu$eZjad:dDcQYT8j1m$?$jdS$h*Su/5^e5Yd%l1/tqk&h\dPL=4JL166d1
&5Vjp& +l8yS<I>dHc8uT>Cb?ShSypThHeT%YHN$d@$E?a^@al=&NM8>@DSp!jQRHLijimk\j#Ij@&GWR>/NmHX
R\yNl4 C?\\%GSld:ew/mElCl9%ND+wK\SunEdt:Jtpp$tuWHXTp>bwcXE5QAQ@n54P#<q8Pq*/<h9QLwTH:wNu
NaX#Tl 5AmiVyELBFPC>MByCWkL&\p:9mE^CequTeRDmlMXShk=u*+n4@n8k@4YJ!@jj?u5?jZ#d*lXwIXjAS=k
/1cm=T y#V9&9tplNmI$KAA?FShZiA#6dY^5dcm>\5AH>yTjn?GP1Buun:?AbV@WPAG9B14PSjVd?RYF6\m/GSu
GMd!lq b&Zu=Al!i\EcJp8iQVyB@R:GSR?JnGDht9ejWa@B@Nupk>H8+VQc/6P%bMC8!c5MWFjn5eIn4+VaVAB5
5Ct=eR XBVqiAa:hy45e6^w=lWRFuQ\&IuV=<:*WZQ@RV%T<=yRI\jWmFVuK@&N<=QV%RqY4deL:b4Cd%+?IVCc
n@*jp+ 4PIRZl+DL+*%\M8><4LTP>$q@D8qbiYAC\wP$QL+/jQZ:#8?\mhCRy$*eBC&6@VDe8N/P5B!Q9Yj%BRC
kF6Dhm !?u@Ca8*=&>c4EDRtZ$eT<Squ1G=i*S!*wQ&t9L!$yImDJ18ZjSbCdkE<<XtLiPASRP%/RcQl4VIAm&k
anu5RY ^Wy!k/b<=k@V%yt:d4hnH!^uV^<@HH@5hP1qc&DS<k9K/*?%!?F*XF>ZD#+VDu9q61ccmnI+8DP9Z$HD
R<Ry^: p/S^Ay?TtInRRF<QJ&6#a/M%T?dy/?qw@?D@BbVMuG8\$lAkejIJP*n/cpFFe*6hchdF^El9Y%QDBZw5
e9DPuj I<M\QTDwacN\NkmH6@KyWIRJ@Wn8<SPIdMCa9j@$8jid:QejQ>uEAC%CSNDV*Y@LADI&11t98IN=AXbh
K8GdKD Vy^ITn1hjQbe/wZn/+c#?1LM$@LLL<k1KW^?CIV$@ptIFlLT\^KC?5Imk8k?SZdlL*XYekZjEuM$GePI
J=/1aZ R?DK/Cl%mDyPRNS^I?>&iXX>!=MZ:#@@lD>nbPhQbBijFlEny+:EScLA?LCB1:&hLY%DY#QACZ!k??Y5
Lk#XAI 4CGpAYeG?mIIGAcMlEZEHCDme8qcXu=lH!YATW=8LyZH?aPV6QMR+S/BaHN\u#*#\5nJB1KcuWa4F<%q
VNitaF ^cWdMFt5M%XLXpyTSyFHPCFlnd!m5mJENWw1QBXFcaZ=8*d9&ti?$Vp\QPdR5bNu#q&+BQ+nJ/?w>H=%
!mNQ#9 H!ajYHEl&wLT<8%:J/j:b+?kY>k#un%j<GRASEkRR$#be^BymGH/ECp6KTt?*X9E*J=iZHKu6Q^iSSYL
=iJ46Q Cdm!6^<@j\hV>9MdTRkAJR$5JdqICcaD\JE^=<c\qB#9y+TEe9&a&PMBbG%qbY$NqPnMYd9dJiJWXpXd
$H#nd5 QWRd=ZiKC!HwVjNGTwL+*NuL^BYApq=SJEQBq:ReuB\K9FHV9kAq89MN#aCTw!JKVmRePy=<MV$nK#i@
Eye*iu 5Kmm1dNhG8Lh^5ct=lc1ZcY68c/!9IR<jTTpVl1RCCapJlIR<ZT^&d6#<>1q<@Z%6L@\l?9w/e>b6N^\
e:p1bT /&=4%+Dw^A9bbjZ6VZj#LmjF?Du5Z4>R^MiA8+\cJi\lRTEa5HjE*KKPACLWa?1J#L@Q\Z&BlH\X5HC\
\E+eR1 ?6HDQGYt><Z<jXt#>&>iQu@!1K&=>q=^j9dN//^?JB+@kRy!L9Z<^VM4SQbLTYuG&V6=&eX*Wl5/8$X$
K&dJ!N NDJWu*+RPkl\BA@+hMq4ipd@!#^nZMc+ij1H^mYiSVyAScPnI1Q?wKP!49u^<*ehQ:w^:B*=<\i?NBcP
TaCn?? /^hPH+&QSkZ^>jb\^$<R<dAX&nDYRm9GY6dG%6:S&SWFSBmwFaSwSMeT@dmRuyFheL5QDn1H!SZtMdtC
/@/HqP HAb5q@#N/?q><V/RAdcLlQ5iLlm+YP#b5Z:bAyGAIBtM#pK?JpkIwKG841cmIANw!Mw4KTtT#BtkIVX$
PlCpG: p+Zbdp844a+S5aeVp</p5GVp*!/41K=9?T<bH\pbAMd*#9e>mlC$EM*>LNKNIjm&5W!RRKY?Fyt+W*K:
T@&LpB CL/SA9wYZeAWVm5CM548XqRmGK$Qu/B<EK@Fl9lQHkIZXZ>\eiF</8mWe?jPR1n!H!:\NAC9CYC+8dk+
?a&*jB +cqnS>6!:i\JF/6*PaYh9Ht96dGt814mZqpJ@GtZ9XbCmB@I=?lJ4PaR>ikXiT%GVEaCE!CKT5PujpW\
R<eHEQ Ft\\h\1E\B/iu=S#b$+iTWlK8ZRN*yDC&!WQYu/&e>6c/SbPG>ZPc&88j*D9D5dKtK\Fq*XC:XkCuFbl
pWIT=R RaCF@V:V4adLF<#W$?:AQ%S@%wLql69N:V^DDmbu*K=8c/pw8H4/RICV?edFM%k1qCCey+Z5Ke%/K?TC
N#9Ln< j5:kM+nm<XRY8aBQ+>Qud+L955kF1^wIBy<NT9y#ai?J5Z4a&qShZ9ldNSIVn=<WkZHPdl\l+:Ptp5ck
c<TRN+ %WqF?Vt*T<>&hk9/!AA\1EE5GTRebi$Buu#p+H6J9bn\<yYLm:6*RQmB^HQJJ\GM8JnwTBEa1Xe!ew5R
puN95c nEjQ**b<:?:y?kj>PcGYJTQn+yqn<Y#R!eceV5mGQY*H&Hdd!N9bk/>C^RkID1cDlmIaaK\PH#$JaiQX
VMA^YQ t*qF^WZ>8yGdK\DNEBDNWMm<ei&KKKcQnl^EMtEa$wP*5kN96Z94YkNSR4tLpKGp@a<!SQY!m1wcA\AN
Kjn&4R YXyGZA+iBWyl6nIQwu4F5S56#M&6dLc^!iTW@tR!kwGQL8cRQ<G:kt@L^#+!j9^/*#PlQ?MFbH\W!aYI
6*+nWh nEiEnPyKQLGL<L9w!iQu*!wwBDBK!?<DF\*Nda@@Bd*+?4P:=>j*L^DDA^c6DdZ@\TI%hRJmpj\dm\M^
ccAjw@ WSGl\cAZjn+wGKkaLp=Pn9C&Pnw/ASdc5%acP+RpbyR*6#VC*%>%9@#P:aI4um6aLHRqq$@keMZ?t@tT
9^F!$t p1iX^BTXSkAYPu1LnM!hAR8R#6SW#CAuu5FDKk?wKK%6/&uu6Q%5X&%41c<GM\W/hD*>E41yp+t1<F\A
IyNjqF EZ/iLk::h&>dV+n+\B?mM&Qtk8WdnQe=?WWuZ51@*>^YjV9n:KFkq:&dDER<KECRVyNk+ih*%ki^cbAZ
V9J%MI FCDS?/@YM+VlLd#9Z:@Bmj9>B@DR&WYEw48Ql?+@hKLQSXZikcBIFGepHn&YiAJ>FQCRttk%VpB+WPRy
DGYX%? G6&+q=%:?*JPq+D/A\hNwWDR$!e?^A8ICkN9BK<u9Hu4+84lE^kSj\In+kR+ycImI\kMb\kMbXldij/t
6YRqEn +*6ZV\@VQXJW?iq+RYBIT$+<FAe/EW\5ny54+8BIPVD&nJ*Rq4FVaHH\<9EQDApJypM$\<Ina?IP\pN=
iPP$4e >9#q/%u=^iTISS:w*F/kke1lRCeWMmE?9+B=6pN^WSFcGJ/#iXHYRi$!Y4YR%aqjBAb^dj=abXy/4b!!
YPqD:b /kANNYX=YSpbYdBRTkwK<tClXAGW!d66#jjb:N:ZX%4BqHAB$FDV<F<cQ4IPm5D\p*!:Q*5tmdIdI4ER
59b\8u uTNaT*p1m5qbIkwL<6EMC4KbuPt=aNn^<eJTSF$npcL*cKK/jyC+@Ptn%5dc1u9@kaI=^=^qpwj&RZGR
#@plVi RIFm+R>1+iQ6BXm+8Rye8K=8TIV?<l%&kWi8*tptRR/w%h*T+58EmAC?PH@SJA=Neqw$<NDLFbNTXKcX
H!8w8B 8PwV99GH/8k6N644EklS8ImGa!jPyq*L#C$wKmt>Y>?DXa!&Z?%1dT&NNYCeCuP#MG5AJ*DT<cP<R\im
IdY<pT \+MSB/5>P#c8ZDSLV@5hj:CP*5!F1+^MdV^CD1hpqVc$%>@JVE$Ie:Qe5pTjyWHqL1NJW:&m\^kjcNcB
%&HHiK \pu<+pZZe%qk+e*:D%lpFQ/RBSLAM1E$IAwM^aiAwp<bQwI!RJTGq8q?<Y>qPHdp/G<WnwY9akN9kGGk
9hyWL1 <kT94ILe*PKm!#@?lEGi\EAI?@Gh@5b<pYR@&b:*E#=<BE9nG^^%PPq@w*AbWCm61Gq1j@d/$#h<NuyG
?jIFwi a?+G@lSEwT\jWICALTaKuT<?4Cn9#5=PBAilQi$k/?TCj5p9IDmWDlpWGlcPn8u\5SNuW6LRM1H@StqA
ebtpRq EkVktDk=YCFS#L\yCmbAumMn6H:4k1QIMm&j^<aTLA4K&u#?eA\lFJR^*/5pS<55p5X5qaK<A4DAW=LS
8&DC9a ZGS88Y?@9j&i?D<V9iYXNR&6D=@?B\WI8ap8\QHWnTl$>p#yb4$tWRhSSiT%KGNBT4YA\u%E+XbidubY
Ke+Sbn XtathSQ#%6P!kRhRmV8pM6jW>8njX?@APpFI<dZn@b5Z@+yw8Q&dllTYl5F@$BANhlF^/PQBp@bk*GpQ
&c89:j 41jZC:/M@6K6N9/HL^e*$8*!ENIkpYYZQFkeGL:EKmqPu#=R<KPalK\m4TT81DS/?k<kawdBJk8Z\JmE
lHZFdY E$kEQPtJy$n!5BD\4Yn1dSh9c&%y/&wj$NdcXQjkZtpStuX+pcquV<MVwkLlh4C@F!BldtK$i9H5GVy9
:ctt^u ?IP$>Ya6Z4QX*NE9J8uc:i4&=9Kem+pSH98*LlMSwXnP<CDK@1NWl$lR4=qZ#M9iF*I9ARm\T1kPYItT
^@1#ji S1<pIEV<!?m!WaSIHEmSn/&>k%qCedmIL!9^TMKS^PM5Etuunwa:/A>tI\q=&aq^=ZBIFSXXW%RA$\SB
YVnqC! BEWy>8FAiAAkyEZFm$@$S?aV$#H?m:8H6*>IVMLy%DMunl&Pn+YD/VeVPaX*:qe*p44l4=+i1te+Y86P
Z\>iSN qwkdq</hSG<XRiycSNuhZGpZ^yq^al\FD9KPTITHN&yDGB&1ApSE^S\+TI:wT%h9=ldTJVK*me@I!\X^
-A!*yY 0008b07f923001202b3 Page 184 of binaries1.zip
niwALl +PcCNkm#qDJ9@qE%nAnV:A5m*Nk$FF1qPWRePkpSKpDEqEH!EDww1k#RGEC<$pIII!DCFmElPZC69hX?
k<cFG> c$eu##<!6!X*1&wd@\eSjh4\+?jQ#y=iLH%$hZj%VP+tl+Awt9kpm5F?R>FaV^\L^LnABL#+:w#yN#K#
ZPmTPM AItCRmDmjqWNB9E9*lDV%Ip^>56@H:Z>CRSYQXI+=?k?IE:A=*5\Qna/Ml!JCEIpCBP$N<eLT/<eQ!Bm
IVlZ9b l5GY@d:^F\94li&!4W*%NXZ*$@y=pNSjwp\CdCEJ45E\eeVqqTpq49Jp=EF@!SaSD&iBl:PuVtC1Qlhj
:T6ylQ :L&1qq=M&Dc*6uWDEM%kteyJ^R$>W\4=SJSnIpL<9X!Bl%%d%m/bM\Q?Tm*6GZPY4ni^<kk@tybj$hJT
+I^nPR pZ@=bI!*#a:qIl#W!^q%DAFE#yPE5Y#QA9YcjpY@bF+yIBAjP:=kNiQuV^1SICJBhatR/P*=>X5pSMZA
y^Vm*F ?ww:6$naD!J*@FlC\yFnLBIZ$5+imjC!@EiwTYq>%bVWWqXjh?E&uT6?K?&qAJpRkpa\RpYTtWWwCBZC
5:X?<a d&JABjX=MnpSQV^>A5Jmn!c#qeD@E+mu4:Gw$TQ5?R9@FPTl@NcN!!qJtH%A6$51Xm\S4lRkIZCTe$ac
i^K^l8 9IlAWPFMlGbWVB\EDmhPu:5AVmt9/M/hE6b%k$AI<<R^:!VIanKXd6+kb8uM!cQEmGpTljD!\FwnXkN*
9#%m=i G1%e!CwE!\NHt?c9u<aDnbBVBIqRW%bA8+SAkF&TX?Ky<iVpJ?/$5:G&hdCIPuY&Q!h:D*q+>L>+?M4m
%MhmtX <A6+pPmGn+WwlVTdA@#/li:+t=YJQ+Fw\w\VC$SY=w&M/>i8ZlYtc%?>hn*n^5&5uL^d?KSXQKl4dH*<
$F$9d* DF%VF^6l9*4&8K&JWFGANRmk+u^1mlmE%*V!IJcKw\tHWLAn\5NCpa8kRCTD>tN<GV>^@+CAwBh<YRkF
/EH\+@ LL$QyN/1cSP&!+Bi%Xd%WWH#JZZHmHH:\t8$V&KTCtCd^JT%y9^EKyb8*RhWHD=?tqB^P8qeG9nZwyL!
QXu@QV 8^W%daJ&1dcYl5cY64dihuZ!=>:DEpbtBy^WJBN+MFayMmVA&>ZB&u#ZX5Nqe@X%ZpC+4#>9=Sb#^+D+
hW6\hI 5%uqVY*Xlitu+@^5nXjPbLGRLthW<LAZ=Zja@B*>uuuH9PY</Z+6R=DA^lJBy\#lAVWCkYAwZZSNjZWK
<nBjN* $1FCmu#*m9NI9J?MEuH+eAIB+l\Apb\R+Y&*cmRaJ^ETcwdZm?qe5V6J>G<mJNtIt8/pj>I@1P<>*!bl
%4lcMR =PLy:SeWEb>+XwSChPS@WCll/*999*S&h\6/lwDmARp%=RW*4/TiItE*=pNIulD%ZMLhDYnwhyEqHQkG
:Z5A+H BIYEC!P$w1JnScIAQkpml6I@PKDlm=5D1wDNYW4\LKZ*9h&SaTED+W@GiNLX^SFmcI5>&\&Z#TQC<JPA
&i@15C IPR4nAWMbPSX%NAy!hM!W&Vq=FEYYF&Rp=%p+YB4b?>ti94eiVc^XIV%QQA9jSVRHWwRJBPd>J$EeV$C
LTNyRB LPn>\w?nS:bQF:=?yn9G5L4ANlYIKGBhP%J\M?Q/%jV$K=e9Z:yEZ?bjTd>/LiNGXnb+JmRBp:^QZ+Jl
GleEm\ ?pXm/ui9u#>8J$+Ei$u?C+L1u!DkS\EwCEP+\WHkjRPaRItk+JCR5Bh<id$FG@h/^J#Li\AH8dBh11Y^
p<NSd& ?1I:m\HFq%\+ZyKL+mDwm/a=ZCqFEAjFwb%<BY&hte8Bk+Bw=IBPXV^*=qV1qS5RT=Zh9X>b*>58DcLR
jXSBEX AH>1G>ZP6KtD<BCF!MjP5d/Cc=SmcIC*t+Q%*q%dN!^jwK@#DECa8hnR^Nw4/8T%+94&8yKM5\eDHHc8
ch#^6\ u1YnZaEkmJW#cuTjRQT=V\nE1QhmwBKCN:J9*&Hal4X8aTj#T^1<PYwD5QCM$i@#T>@:&#w\tG=64Cw4
%iX1Il #Mbp=DtMySMPHi1D+TKB\Z+Qj=BAp>d/wmt4QCc+AQ^H@w$:uI=AyypSEBmpEAd+kAYh\y<>Q^m\ciN@
:j5FW+ ij5ElERhQJ:!@\WFWdu8<<>jZh\8wGHwL=cF#QVW$<jJj<D&EjwSh$95LiMteJX%e@j\>Qd%D\SXmBke
lCq+JE GSXNXIF+>@RdPRWqbTIe<9J/e=peD651eyN#k<=RaDNK^CcFBk>pK>^8L6ldbYq88ut%\Y\>VLY!NAn+
Kn96$N e+e1!E1VM5RAuyK54A#AkEq*iampicw15kNZ&>p:PD4biS$VbXtLT8@*\jCGlaH=JQ&SPKRj&IjaDVBI
QJ9:1= AjEwCwKich*>@V45^$hCl><$RPmAdb/F^QJeVd>!KT%NeJFJt*:ye94X/^tb&dpAR!q1WN8V=?CXIHkk
WSjcC4 wjV#J?*N@#eLTm\L^^IkiACFn1RntHA1nBQcG<KEmwhHSEc@+C91#q>9:l=%J1eCG:jkpbX51duk9yKA
!1HQe$ IPSL#Fdl5B#RlAM^DqhY1CVG?*6cF*I\c@qYT=iA1EPJLAjJb!=e#RTSL4>j?cBSAB^AVIN@ct?dinP/
LB*4P# 4#L$Tj*y:\QSaR1BQ8/PBIJXC&j1Q8WQ%J8#jLP=T$lCY5GD65a!CKKDHW*Z#BE^IF:PDMSH8d>:w<>6
SR4Ct? Akj$i<E:=4$/IQAFT>ch<D:@/liEZ!IIi46@mRRB^bkNw?51T9I#?/JwiJ<IBGiTW</uIRR?D8bdS9iT
1#:!#w %pMJDVYh1!X\%Pdj+DT^EFCWNMRN1Alh>K?9ubQ\L@V^C\!LPZ\!qTS8YACm+@wAKGABiQH?M:^EeZ\w
k=e@ac 1B+6FwHC4QRLJA&LPR>pABTB>lH*>9L!yD\E:w#HGE?&G#e<Mm1TJiBRR8JJNEdZ\Jn&IbDQql9wHDGI
NiN+!V QYtAkLuBbClh9!a1Y5QJA*?&Bl5?8#1V?NueiMPKBj1wCV@+aI!Rk8pDbYT\YXhhR$%FZk+\pFhRXqbp
+l?*=d NRFWa9k?F\eub^jHeFFK>Zdb@Y1Ykqh95MyAh>Cj=EY&mPR!RBH\!j@XBjFdD>$>yc<CSD+@5Eb59RdL
^e&p88 %Y&pRc1T#j1VC9Tq6I9ui%L==!>eVL8ejm*nJ9^>lTXEES:??@4>q=@hJIL?L\VZj$NAJjQPuEwT>d%m
1X4qtX +$$W9H&>EXR+HTESGSWVi?AFZ$qu41GbT$ST=4%1iF^dkAGJ89Q>CIl4/+l#cNKc!=BkRa\n4mlW+1yM
FQuqNK IRnMZ4ENEIk<tHkKEWlJQy6&Qj6YeSuYDy5F/K@11?5ctq6clY$cLa&Ed%F@?IX#tM?ICR>TAAb5>yy8
bQNP%! *aCHpVbAwK&@$HCuuh?Be#u*Y=49=X\<F8ym61+QA5p!<DdK\9>tMpFeJRkGk9i!cE#J<hNJ@YK/yEGE
WJW@^d i\WWM9CetTWTAqLlEnZH@98aBM=F8Stm8Qpw^FW5BBktyCWjmjS%6Nk^a+mIkkGDnT@p$LteR8:F>mAS
lB1a<l Ba^RkpkB%jWD@54J=K<EB^<St*D1jA1e/@?Vk?!CE1^Ja>WNkyt?Q6MljTBe9Zk&/jlSpulm8=I\*WH:
$=dF$+ TCALukKQeb/pL#$R!&*SWhHS<BuGH#=CM9^Z4tiCT!<nNT8MtLHm^tTJbh/<TaMYKIQL@l$$l\aH1JPA
l?u6/! HB6NRR$kcF/*bI+i\aABDH4=e$ayR%kA%plDuci5IIhmwEDERAHEkKikMtP9QRV9unb^q$u?mBRYtqpK
qeH?L& \Jb?wn1pQ^FdlEwk>k9nIG=*F$*cBAZh$@8HB:/IyPAN&#VY^\DE!!YmLk\MjqNV#5G##J#qu$6JQb>&
n\C/dL Kb$$4h//jih8bY%V?^P\SmSG/Qn\=kYAWQ@kjtu^H!B\#=$XJ58jPb%$<nl<9weQ^5hSMV*SXBRV#eSI
E+l*4j \N6*MPEFj!B&KVtHuekwI>W>$IL&>4yW>%WEA\FjjP=RDyEAqAJMIHGqFTkqMeXBW:wSk#p4ARN@MMGu
G!KT1# #qKyCtjSD!GqXhY%4WJ\RcPc/1y4RAyc\BY%6pB5kMEQBDGbKAbuVl\>GBMS:C99+YSnadwNPJk#R@5^
H&ZETm Z$N*N5mLS&STStqVc&Z?=SMSd8cGe$WaTNW#*P?CZ<\AXlC/TitMhQ?\PHA?WS?bD<^HypPKuEPhueI8
VJMTIi GjJkCpW\#BGF#L>:ZX<<j<KG#AXbX@5m=pMIR?KJW?CK$m=jTn+c=i>mcd^?kycw?Ca?RDppC&m+^d%X
#tL&@1 kDV$EtQECMRAl/>\8E?C9$<aEBRcGZ@5#AWYlSkYlWNHYSS\8IG65<G4HIQHbXj*y$=Awd*&dqH&6dS#
@IlqV1 GKjk!aWVFmEp$iGHNDDi6Bjn!Zk^QqJ?&QIZHmtMGSTLwuD5^Cp&VAAWTp6Kd1M9!5*BhuMA+aa\k\ea
Iu/dmC yKQmkSM>jCA/ImR\RL*QFbHiYSPnXa6t>8pByhQDu#%EXqbcq4kmPQ*SFjZLkc11m1LMikeI&#$>9j9!
Z*h^<4 1MT8@<GBI5pb5YLR^ZIAISRDb\ZX#ZSNS^C?p>cYDqGA<IL6!&CdbetVRy=qWIKWe%k#P$&jap:#TbQb
AMhaZt Bb!B\PC<tBT<H#>@<\tDBImY*:=+mk*u><8K@=epKIy<EY4Ckdm+H:E!eRjm+\<iVnmcTEBa9hMlJQFc
G19/mA ThqhiID4t%wiNNj&khDLF>Qu@mEHRm/ZI$5yMa1eCh*<wh1/e%b66*V&m+k@B1Fc/9uWe?jVM@N8q>/4
pVF%ad lKejwk!=66cGtmwRlKdtb4yqIMR@LPd=&Vi8Zn1juATSRWTIu+ie5<$?6pFYZ?eSZ\Q$aL&be<nSK:j4
6wAeq@ &/5L4!bFi%l5uC@mRL1BpY1+uut9=pEu#ZBwtqGG<:mjmJ<pq<q<FRMt1A:1E>MlLR4VjqFhDGm^BPGl
M8C@P% p*uB#IZ@npVM*$WJJDIb%h:cZH$ZI8a4/I>Ppy^d@KEnaD6RG/=ePu55J5DXcyjS*PHAA\$<TQH$W4Bd
8>i/Eu Y/#\SuE\SM&5PnACV8@ZH4wZjlVT%Dn\MDEHE=M9@5FD#Q@k+TF?nN??n!LQVEZ<\Y5=X?64:^Xqb%^K
m:ySI# JV/NXbT\WE#>$RHmmAVqR*p#Q6J?AiCSRBtwtMG^eWRa+MYiJ#kWqbd&icV5ZkIDqeFeX:%&FZC+nLy\
8c\AKZ QAFn=1AA9\GpD^VHiK\6>=y6\=kbeQnil<PEASAc!C84D5CPDKILmmJh\E1d*Mm>#1=8:n/8kY\T>j@E
diWAXw kVRqw$XFHKR^1MN@E*SNE/pCt?ykuSEb6Gl9IS*YFZj9FGP4JeB\IjWe>1<tCW+!ThNQ5Xt>!?uARn+t
kC>uTZ d89RHtH/4R9m=de9u#=pWYAVqbeSBe!tW5t!/I/IKl!m+1pDQjHMRiqDl#FSiQIW5IBqb@8kI?pp<%qS
I<H1T\ Zb8!*Dnei?5KER9mM!j<FkWCk#kyKmn\J9d\l?kkDj8ejeMJDijl4\S9lMjDk=w/CA>p!XAXh4+*Cb5%
\IlBS5 &AwmBknZ4%\<h\4Ck/kRj$<ZYh6>y66bE64=/ny#Xlud?MYj9%ZhZq?TpS#4dYt$RJeFRcPJ$cL4<>+<
m!^F9y 14@@IQ6G%5*/^^??C\pLtNiuP!XICyQ/JwGJ@e@CD6uQ@RpLIaAk!RwDpnBQ%I9BD8G>b#<AFIbKDJhF
yip#Cy qYeWBk^Bp+k\ZL%<LnE8&MQGdM91!Z*T\GlIBN$EFMRLdq*/EMI$MpJcTFlki1piaY?9kIG@eALNlISG
u$a>ZM ^B+?eR+P?8NHYBwm5eFPSMN6Wul?>94n%/@jS5Q4@ZH9WLTDlcYn6&?\V<K^W/iT!a8B/A:?P#aXnpB\
p^AV8t @j%wAELYq>ARCu<mFV5wDuZ?cGLTGbLJ!ada>W/@PEC<QQntna!M/>i9ES!8ZE=n>RGMWpmA9+<cn4YS
m\#SJ9 @uQMyt=c9SnCb5ID4TPt1/Qh\^@\q=!enI!CCyEIPXt$Tw4Km4V<KA!eiWyK/^*h*N%>jJ*P5plW>mGB
-A:L+Q 0000528580b001202b3 Page 185 of binaries1.zip
+XFE\l :c&jBB*!^Cc^IX5Q%TNDVm?YmKt@jbLIJ4$WnXK\uiCaQlIBpZKYQM\>mZ!&k\!CPAlRMuML5BpKktbM
ZILCw\ QHSD#Q#y*c6@H:akD!Z5j*1b4T=REDLL5hJAkPk>!B#mHBap!B\=tpnK1!p9?MP$b!:jaS6\PC$Q1<Zq
ZE&b=h >$@y1&wMH1R?hNC\wYMuVyw!@TPA$eMZt!uJadtk&G1duJITyen>i*w9anF*>jb>Vn:lB++mFljPy%:K
P=c?q< !C$EI+i8T\Ac$X^ZlanWN#dS#RP^&cVmHtla:p&$TlA!SIeGiLua!Xn8*p//\HZd?P4c?kcd>uqEu<t8
!w!Ak5 cG$1!$!J>:Zc9EnElXaVM%ma?jylT$6d&<6uda<4:8Xi!T/8i9yDqL\BQ\yp$EAG<%Z+Sad6kaF*ZkmP
Gyb9&: 9B?Kq<^wXl=?@j#P6tP\Gp$T1lk@Z\C*hPLapePH/HmNlGMuV!iuZ4mWj9%K!5u+WC<H<?*4Fw$VXh<p
<Bd&^R XVWQIST=6@M#Ryl/lmJR@BKAVcIapK>^wiHSB++pyTIPw4mB+HATeenC4na!wQeB/B$J4@XLey!61aYV
E\/m%e h&mkX/B@1J?dy$>w:GH5ywtNn5LMH^$mGW^!+LR@=Tj4V&nAtnMXN^kEu+R=!TpZLq&>pb%@t\VREDZp
TdJa:i bGXSEDlLIA:Z/K6$P8@KbRlCWS?PHMV&MH>jH#XQMw=lV@Sl?@4qGD<DD%Lam1?HQClP$aT+YR+L$KkS
H#<h$N 6K!Ek1KT5kI6Q%JJSW%XSWHJ^N*D$#QA^^M:$?C#4&F=iIuhiy?EHR1jSYtMLlaICc!V@pVQJGV>ptnC
q5Zq8? TBR&mCaeG:CweBeicnI?mVtN$?SSQuKETtCP<Q5iapJFXl:J^4FBYBiJwX<>i>Rm1td>AaZkLAMmeV1J
+p#B1K lTKBQm^M+B+=Tl?nE&YPu^SS>wK9w1&@dK8%d@!F4N#<k65qh&^XcS/n\5CZnK1c15d\WZ?Qu@cFSWN*
d<kS@u CweTVd1TPEJimXaWW%AeT>CaB&k+?wTJ$Ll\Q9%t*8&!?\>1/l6clP*!dc&NNSYpK:ilpY+cKG4/8H$L
tb$EbW jMH==JMRSaRHi49cY<1RAaq=?44c4j\B89QY:ZaPP==S%k!^>QuDAVbdDZ=L^yDTi+@Am:Y$NDY*6#&D
?j<1S& k/Y>1TI:+*y&!j89\Aaaw=@MD?b::#jPX:BS*!XJ$%/*wIjyqikua*/@ZQTHEVmu$6JRXXcak*/F^NTH
5<6FT9 YiMEeuE?:e1%nQVWyEMS9p/YJl6Z#^\p$PRkGRNXhq+5!JZI9XX+9nGW1RWcEA$K$PkBNAVM8QDItIQH
G!I+^* Vq@+A+&wtAPH&Vtj4H#5!!Aq6+/P#@@AeZ4D#&H*Zmh9j^>*9>CDTYhVWm/im*K*6*EIn+46T+9VIYJA
<9C=Fa S$@AtMCkENKnF\ht?ADIBLktCCK\a++F+#b4t4JwEph#4%?n$yp41pAFPQJ#@VLl=?Pq!paS6mkV8#bD
Pyp>pR INe9E?K/i44cEC1PqAW8FFEu%JVpAR5=Sb!HpB?ywIR/IV9H%69D!!@RKaEWG9+uF4J>9ku#BWnFL$IF
hca\B! DY=&?8>Ba4SNjS>D*@kDt$<T6e5R9+PGB<=*JtHc$eVnTcjIB*Q>b5/6+nLSGQ$*EqC@j@*5WY6DH^Wb
jqB$NA jZ%KTIW$1k%TRS%lnnLHtEVq+!hPuD!bJGyiBnQ&uK?p9&VLjy?+FDb9FV!M=9Y1mQFWXGlqcTZXkaPG
k=+1q^ nJk/:Thk$e$Z$&MXw+j$b&CtXW1BXtRW8EPtCESkYDl+l&Jnc?4=m^e8Z5&/le+TRkpI5Ei*6VSW*!hk
>9qJai ABqNViS:^qietZ:^HERX5SFBQt+P?@hIG^86Yaye6QAHcM>eAV1YeKY+EaL46KNBh65N>HRIF!PcGaud
!VPHZl 6W?ctkVNVM5kmNudH#%?@Km66c/1?E:P6Y5q4c@jh=CTMQ&hnD>kS>NHnLB:yHwFIm=i@cpa9?PJ^\>d
AHDk<e t&98q>#CHM<bmK<lAKMQcl+?hkICCp\tbq/>ePbIhIC46iqt\?&LSEP4EkQp@I9!JHN#d6>K:\=nckkb
bcuPB# TAY&k+!DYQy\auLcj/mIQ*\M1eCKeTpySL>/@/tna%LH=!6Bn49*PukF?Lq:BWehTp\/i#u#SpyC8J8n
c5wP?L 4d&q/S+:V%?j+QA\WiqWGCmH6cLR5NDR1Jla?kAV4*WwAeKJW&##HIBBBAP=!L\l!BlC\8w4YMACLEDX
Yu*l^W Tde=/EW\65m189jNbcJi4BDylVVSm^t/P6%<^ipnFPSpMii145bD\SkHRaW!Y+hVW?WyTt*\>jd&CR:\
c!J>#* 8HpL+puTMQHwCSqC/RPDQb\IGJl6@eH1BhZFb?N4huLp:i9Z@^PM9u^pTnIyt?FJhiAAHcjVF^GjJG!\
#9YnQ/ ?aVjXj%j*#w?9H:?YISGjn<cuJVie*L5bF*TmiPJ^+TJc5hQIBPu!Tl@CkqT46>+#qieadDJ$nMtGeL*
wVlTeI #B!9kSTAIXBY^4EwHmmG88dA$SMuV=pt=Q@pM>P=$/dT$^PREt$h$6ZZZ=:t!LL1<R?BbQ:1djDyl5Rt
BI+6&: \Kh@+iLF6P5=YLQH^FMd1ke&jN?9^Bu%B1ySk%Rpmk9knE+=ubkRF^um/?=kbY+56aphl&nm1<*A5hpD
w*l*tN =\61Ii!?plnmaL^$Bp9IqBbGw1D6MSJC6jT$K8QePBm5l+?451=e#m=@R+N5WN<%Q>VZ=J</BXH#+R5Z
XWNZY: W/+Yj@8I/ce?Qll1XJ>8pFWjwnIR/Eb=Wi/NK^nu+1hBHhIp*e8p+JS%QT$=MVda\<=<&?dhG$mk<WqV
5@/EWe ZG:u>WLJ*L#<&>eK\yl1wPMHBX@M8Pma?IRVb!<SMpk6LyI$&+uI\A?#AV*^l+?j^uheDLW**YQ9HiD4
NHKVJ8 :lWaeiDw!hQu4%%QQl#1/i:6+?*mHilu8Z!c\ha>*pR$/PD^jp+PF46&d61\$ZCH<R+#&?mIk+jaJ$YE
FhRNF? SlE4GVqABy%BZ=etcGBqN$$X$eCJFS#eB6HA&Vpite/#5Tcm5YdJ*BuIlk^lR*?tup+ZZ&GMQMRWCymJ
E!Q9$I XXWt11FAXPM9WybVpb44+89n/^@mGacqmK4cl9?!$YiqpA&cqPM/j@\k55F$Md?t5E$CyChVhEm%>$<E
8RXpjh \deltk@AdPAS#J#GWnGecD1GH*5kZ9R>y%\AuRVlKK@1t$Z5?9:=\=9un>6EeIAd8$wt/eST#y$Vyw#1
Xj#+Sj c@\?iiI+KkdCkc6mAA:M8F<BQLJ!u9MXbm\!&85ShRwNk+M!^cNXPQAqWJbRWqbY+XHp*<Be1R<hNZwK
T+cL\D H+J^qYpVJ9!n414KW%adNt#wmNHVymd!8<B8TZByph%mmbFTwIAanRqC:F5Fa5#6QWNmCDFycbe!<w4A
5iDhyi d6W%NEMpMlwHl?:iI<PCIC8NGKLj9XPWq=X?Q9qERn#E=#llb:Jbe6$!dA69=K9y#F%u=lcXuF5F+jt%
CjcIHu yHDuue9%YYD$YluJ*CeQG%qmlK%MC@+w%Rdm@n4nQ9D\W?6V$:Z#/WXqh\4!d?Zu=BWX=q$=h?wp/ELL
6n1$&8 h^45V^j#t9tHqC>aSjuQbk>RqAJA+>^ywmnW+WEJPCKGb%bthp:GbalC\u*Ac^qdY8wNwplFY*Kky8K+
LX1ZwZ ?Q6TPZt=SaWZQ+a#XaBND&D#lStH8cmpqM6y@a%NmE$CynBadP=Xa\pQDMtH:ihmHW#*PQmAuHkGlMWq
8jYAmt JJ=K8Z4%#KERD#e9H&<*u$Aj8$&V%ZkDlypS6^Zwat8/c@jP4i9Zd>1<bj88ZV8N6&#j66%+y@?lp/jQ
eSB1I8 \DNE8PuHJwP/^q^q$5YAGnyN@TJa+hVWe=l/ICM1wCtiH1+<$TwF%JRNK^dP$5YW4S!4KdQRiuZ#>Th4
*m*E$y !IG5KQI$%AiA4EBknuNDSFcWRXbpB=8G?jn/laT/y^jD=</Tk*8QCDp!yNtMLXP!+Q#5B$jp6::&J\6^
+EHQec V\S!R&anpJ65$w1bjP1+1BWnKqIRwW%KdmJ@tby&BdN!/Lei5RNaQ:=<jQQ<TS8ajE!K>tQDTcXVlKqT
5DE$6J wwq6RbIpYY6^np=XPA@Q4Kk+uqj\HJ5/Nym:Sy\AJQe1w/IIqSpqSyudl+55V*ZAAHYNAcQ=jJw9QY&m
i*twpT y4wKmK\Rjw8ep1KCpwa/PLIJ$$+lN6y@>\5N4paR=+nLkhKIK!n>Nb*tD>FGe4cc&*5E>=F#=Ya?KRA%
ZLEwLB N4emPW*\Lh#4M&TNDdX+EKDWuE$/Gl<VF8DydLN*=^bDCVJQ$eBZA#Nt+lB/+8a>mN<#Vpi/tK+WkVPn
B+Qi6d ubGm5>?$EuKELSTR$\88dGw#iL#/S=Zy4*=%j1yN!!k9K:6#8@l&WYES>kVqbPjpFPSiB!>!?5TJK:tq
!pLb^b db?@hA8a6\^DM>SjAyHwmGKXy!T*CKJ#P?>t?kXmARRJk+<e:?<CBR>=@uSCXICd#i+>hl=:S=LP<t?c
TBICu1 #EBGW%!L6?&GXEq8*1&mc*jCtRwM+EHhQnHn+8IVEp?jV@?DwSn<1V/GT8+>1G>>@Q#N8*hJe++=:nK#
B\qK?4 <\wI<QV$Da$?iQVE&e9yy\?GiLl/?j1+k^:bd=15A1bwSWBWbLCLlaYq<bbNG*j5\c$H64a&Nuc$$&A:
NuWe/Y T+5>b68*tXm=?MYj9ZA>4:CwWIVR6c9ChApM*6QwC=##hCwQX&apkW*E1piAL=a<XDCIB%htRbRHY/P?
+^=Nj^ E+IAwLqkqIu&KM4J!C4\%DW$5EFKh1\<Sm\KekCTmlya6Vti\Z+BRYHieTZq@\Mk1pPGnXiAICEBCJ5:
1LqPk\ @\Twj:1FniHJNl*SdFElteJJa>Qhjjp>Rcl&YERE/aqp<>1ZRHm\\c!y@htdn8>aC9@$>5YV>pb&PJWA
=yKI%Q hPumlhT8XCbq8El%?1Vt@EW+:m>jTd?YeRQk8XXW<y\9l%PqL1FHV=:c1mLpCWV$mKu\kCTGJ+Q51A<D
#tC&I/ 4bGaNq=VFWIaDu#%KQW1RnCnMY#pQ^PtVJ%?kh@J=<4?wVlC4wRaX$1B8DT%!d@S5jMImpp+AZ+lLR%D
=9>$tj td9wcF9Aya%y\<WlyQJTY+j5kE&:X$yE=%VmIR#\ZY#JdJ:+\qq/PuX<XV&D4VaBS//YN4je#W1PeVhd
P>!LwW QbMqb*+:I@+/y/PSBuB\u\/Cw>4TVMByL:9X%jZ9yj#K196*1ZKF56LTP#l/kNuRjNJMS&e1=yRWbJ=J
b&nAQZ QZjl/6Xuu*5E:<t#QXLWS@Z%$@9?KyXIj:A$ki8%nqIJR+<eVYTZLtGJ>la^dZElZk=:4X\DA6aQSkZ/
d$6Gj9 1Tp:WENVe?m\aX1n9Vu*/D\tu*8lPaK=^%D$i&be@KEnJ=I9@wFQFD59qH!i^ReVN+?i9*=dF:$lcNh8
Xbc/Lw G$>@j$>e>lS*?Nnym=jQHAn&BHy<QZ$C@S&*//ky1\*eEl9n9>@Sd9iYVh9*&yIbd\eZD!<QX!ee9LS*
jTFVEH eLC&*G6lbYt?a=?qk/jQ?c6$qmVTp==PZ&E8T=Awu$whINwBAI>njE^pYJA@&Wmm\8K#D^Xw=cLbbNBi
+b/&VV um!ptDX*+aJbCJD/qCEp5qGFk^epTI/WT=RXcLulmmwcA>X=k+#C@AMCR$I>p554@m?AYP@YB>AQEWDc
=&PJWS PJHaL$D>YSjCn/nVHB8jW<?TF$^cCWJDkwXBP6n?F^HJIyS$J8ZmFi!uLH>R*@cW4Q*1@N4^Dkl115XF
8BuA?! Xbk!8Ed&XFGy#HutAkPHmBky^A<pCKH/ZEqQ9*ah\965dNw69a5W#X6u/ll<?GnEQFZWIIyRlMp\AZ#J
a:p>P? Ew4?+9Muc*LkJ*1Wj\EcnJKC5yImV$6#/QASE/hMu=/PFI$u/VG&QS%LnX\bJWy^lNK\cZ\?M4S1/^=d
BTwE$Z ><Dw\+TlT>i#!b+Xwn=neI:9HpEIR=*GBncyq=PSh9b+Rq^EpI<4BL9d%1>eJDb4lp+6Z%Xu*kaL:@m$
-AKD!? 000576c1b33001202b3 Page 186 of binaries1.zip
4/W6/T +5c&m6#WA=:tc$WELZuImH@NiA5EMe&eJk4pB!u1cqb5c1m9d&//jLj&T5tDtp1/auSq^Z%ecHV9dntR
%cE!FG hKiptB$bJ4uW#M^d=TWR:1eeP=Epuy>Z>aFmPFRuth\iSh\ecFHHl><$\Y6HLe1<tuaPK:SH/TQDnl=L
/A1\Ed QMpcJMCy1BCDw/SDEZ+8Xk+?+ReDltAW>E6VHukcNQ!9pZ@>NWJ#F:j$Fy$uZyCj$S9JZGdGHRV*hnd6
/@XnQl 1kkuiBcmSTMYjVlX%Ve@i9c/NTb\yytyqYhkwJi:h%BE:MGnTcqyRJP:5/ij4=hZwL@LV9&B!n#F5R:i
G>PD>q qk::VLd85HB\eZF&5HQ^>ke^ecjh@9L$euY\^h&K=u9&tJu66aK*&YnH=m*G*y:lb#D?TRM9N?Rmcidw
Vl<?FP n\G\BVk/HFe#+8wtFSFP=8^W9m+&/m1!QM%dcLB+#k\ejqWaL\@^pIKK?pDT5!5:l4Su!euJK/6yDkKm
5Vnh&m FwaFBRaFl+eFq@\B%B5CFNb@j?CpyRB=/84nTjmL/b#/W#SP<$c$FJPM>XZ%\+T4cHDeB=5$\*FWNWDw
>qJ:Jt #\V\A$X#:+iQ+Ka=M6>dXquZ<8RqYYn$4iQh!/j6VcRZuP%b9=^&<RIFLNEZGTLKuBV/uCbGQ9AWk=ZD
?6utCH D9lM$kF@G\hDACe5^>5H^pe5B5pBuH1WMSBCqDl1%ADJkYQGDXTBj/HlF^kqT9tdEn5NQtDARM%Sw<bM
%>V&w6 !RCW^KbLetuSjm88tLlAnM8X/qWeNq+E$ya>N8+BWRTpT=jJ4CeY@h5RyGb+GQ6Bc1m9jZC@:DbIWYyT
pjS\6> \kGTL>l96u*n15Y#8VN$c9m1&4NY:*cLTeF$Rj/Fk#+Yl4Nbn4a<a8R?ZP>wdkRVB@yDRiVDk1RAcNa*
$GA=ER NGYqbd^11c$SQGC11E1Fm99*ACW\hClKhDF#Y=HW/LK#+Q@#dq/@Iu@>/5WV=<:j!C==@/NdTK1Kw$lQ
#w/GcZ bPjQd#l6#IL$CL8Ic8:jAi19uIjaNjEajjT9a#kRhR:LHXqa9d1hD%\tH+$J<uD\CIyNQLy!tBc6TYu%
C%k+Sh cpwMXNee<lj>D?h9ilS*&A#b/K4e9L#<$k89/CnECR:PW/tZj?MWDVkhE8GWmY$@YMD@6!+!!u#JVp9*
K@%b^E kCD$ecHS<RuHW\lNnl:?@6=k?F^*#>NTWqWd8eWy&l1VCG/i45=PLq/BITA6ZlDP+\TN4dYX=j:>q4VF
5CG8E9 pD$:6/+#tKM#bh^jk\j@@hiR/c5*:LZ&QJy$>n\PI6DJ#Bp%EqAuHnq$ICamNMnQ&\MVd5yIE=m:*Zne
@!n/c^ aZQZV:=TH$%Lqm>hRB!i*nSNBZp=iTW%hjWBKwwwWFm4\d%Y<DaM%qRddSwLPIZFiq?@V<c:H#+l/<W?
PVj!Ma jKJBu@yCJEEQ$!NNN9EAWFRu>Y6c9#1>bW9+Iy+1!p8LTaj9NVK\R8I=$jLWZl>6Z%FnG=tKQH*8IytK
&Rj5HG 9F@V@PkF&ZH$4iQ>1/j6#amV1K5FT%QWBe=FaSy#pSWwVbTqT%e\K4yJb1\AybI!LN+@=<6kBh*Y*%>Q
Q?kmVV liL%EGZmEJ^/Xdk<NiEA!TGDXHt1QA!XWLGE!l\qGu=Q6:JATcBM1em4<qVWBk$b<he@p/hP#\P\JKiQ
SGhKkd pPC!R%R$q!NGmR9F^MSqqTuFajIny^P+Xt+&5*ELmD^$HI/G!?t+d1MCnF=4L&dn/m4LT*GXSE$hXV?\
VCNdH4 8yKX1PVE?PlRj\>H/#*GS15N=8l#hB:\iVPYGV8Gu</6c1<4VE9\5%\@B<Dmc88Id*uMTH/>?lHIEkBY
h:ZIH< klachK1*th9WRNhLNydq*1&9y&8=hdXWDX%NA%%MJeRw>:u*eQNitVJcQ5#jkp!SPW*quN#eY/XqBjqZ
dIF<5V W$>jdu#=6wPti!qG8LTZ:ayBpSLNP:i%NlPS!4y&KjZMmeVEa<h\M$MT/<eBLZm:<Z8=uHL!aLmQt%>p
TYqcR! \8u#nu<V6kTcT8wDS+\cN*d5tNFn^w\i@jha5V%*<pG4muI#i\leCeh\5^YBm@mY/Jla6uBE+MIl%h4t
%iPSC$ >94IA^a:F%t+?Aj=8u9=l$VEHVy&J8%5ZImHk!6IpZhApPji^WPWie1D6whb:h!^%<ud^>*b&h$@NB#A
l1XpwE <A5ICR*$eZY$k\DK#wdiL:6*>:bXe/iQW8jBp#CBy/w=TE64<PAlk$jwL>pSHH$kAXZ1XBJd/DlMek<k
9^Dt#$ Xhkda/iM1ReL<#$tt>d$TSYnw/m4N&9iw1W4X1>a#Gak>HV?XqHADAVaQ%XCq=#mAA*+b%Z%kWPGDhEe
n41qpW 8mR<PDkpNCw51k\:baE85nZ&@$pZ^E?h$*@&4TB:ldpHNthZ^jdQI^tm99?D5XGm<Sw9V$@KR<eVn=aA
WV#=pl ZJEZ!\cp8Mcw?G=%+<Qud#6?hHh>@@#?>d<Qt?5i5M$!:MdFNQwmuWbhwklnYliJ/\PlA4y!&CF*%Al+
D*^dHI 4y@#yZXt4hl8:c!4&5eZewS!JebVBdpT=/u\XGpiS$Yk$kulW!i<=VTQWlZ\GFW=NWBQR*Q+8ItVy^V!
Z$VL1n j@Iq^p8L$ALN/kY!PFJC^YEK!lMJX!5&::b^>i@nKnMjS#Zl#i5F#Y111Tk6LWi8IIATTXbti84J\&#i
:?a4^= \S\?4mX#>ZY1?K1/C:jaBB*HVT9F/eeC4I#t/tlZ<Vp/ZN$=+55jM&L*166yAyc\D/^GAqb%cXXdk:Ci
wmQ*qR W!85+\Bd56W%%R?11mw4K!1w?\4kAe6KT+4BA\JZ\m\/T\uk!5t>ZX/Tt*+/PcZm5SDZ@\1G5<+Q6<d$
XQmpbi #V?$NnhYk&Dq*pm@CA<@qVn1PD9SuybPtLyVj1<MFi9CtcM^kV/l<ThV4$T\P%AwVSq%nbF@V=+$eiIE
eR^C#n \Zn8&NFm!>PL1V!^i=i?EcRkGn6:<TwkhcaQ1VnmX5/!TPEKlKd&C@+&P<&*PQpF?Z6/?kcF^<RjTV1j
iaEu9W jCDa\<uXN<DjJ#DI&&4qZ!11KkwV#G^*Ynn:?H8:8ukElEYEl\RFlWXGBHt:P>ndP\AW%6bY?*c6u#>y
qP%:a@ 5Kw!L8nS$Bmw1cYyyWWQGnX+!LDl\+hP=5<!eA^Fuw=nbV/B4MRM>QN!J!q\bWKWPd4#^VnA1>*JX>HY
H1^m:? $hYdCWm6ZG8+tmlYD*?G65=EXCwFbVWNZQakJ!PuMtDI$MFA%RDNITNGDNYc:lpPWIWjCm#/A/y*CJY$
%IJemq 1FVW*R6M!jR^>dP*p@>::T8tlj4YakFRbHPmcG#n!MG+KN#?ll&n:t=86C9n^ulMb!e&5c*%!QHV=>LT
W94@@C \RTYX>Y*@+5LM:y@jQ:\?ltLFBbSeY59MEYqTX!/jQuKFjw!Dc=aC:\jG$jq=IFk>Y%V1Y6wcZ@Pq>Ti
RSQwqP 8Z!4=Zwl4%8qX+RV/@:E%HkkbCBWKn?XmRFWwXWb6Y<RbAFMA>RHcw&iiB6StmRut8d1FtjEGHG8yD!q
DYd$+c PFSBjnTmNG@Fy6*YL9+SB^GqK%i#Cpy\91&qy%&8Fb>HjBpQ11qcVSTwk8#4F<<eQSCBTRmLZX9YLb8u
ApNiiS 4<5HpHVtd4D$T:lY%6^ei8%+5M&t?V4c%Xm4$8e8YCi?:Rpn&ZRD%*H%56/9GRM1TdTC!JNWa<&h!8cG
Flj&:$ B41SW!>w+NVVhdL%6ZY%Ndme@AEFtmXjeS@eaHub:aJdtbtC4J+5JuNchq:S4X9bq<=qZK$RCEW#KGTy
P<P8lX I!:WInmSlhiX=i#td\mC/iN@5#%Sw6dkan\m:wypKn+<KCa^PT$ndjak:PPW%%VZ?GjM6KqVyp/bMytc
C\9@k$ SE@pnBidd98A#yQI9Zi6ZBkNWCpqunmhpuahwTJd6Ptaki^IFpLFX6F4GnN<:Zj6h6n5E^Vw+iEVGBaX
+Ge>GD e?lE/6uDIb=PLu:\AAYE?Nq6GK81!8PN&:^@n/NQWICH1$hAiDV\EB\bG^*t=?:w+Pnp:Gluc&6ncdJC
D%#pRu ?/<B/MqWIZwG1Ab1ckJV>GBt!QCl\$aMH#FmLH@qP4hn^+Cw\#l6H^4p:+Q=DV5dc&YC%G+5jT?a1Tjc
c:TZ%L H5RnWC%i6t4hBmQDqWT1i9p#hQV$NbZRC11CFiVJ!!t4cGkNGV=MT*$AG8JSI+cPYuM\JDR5@FDRmc4@
69Y*tc C!5M4Fm5<HD4\$w$eWTmKuc^XnXyTCkkdVcZeFkV^=dD5hGP*V@1VD9yP49k1k^9\qWMpc4#X#J!Cp54
=FX=Bp /q6Jy1L:=^jA/yFw@n\@J!9nin1+RWpIMm>h96KdVq<bVHIVGTR*pW<&FJYX*<iX%tS#F%>YY*@J=uXn
8^VnL: RJH/8iwX!bTa1k4wEtkV5aEC=S@It!1q^1l&kFI^QAqX>eFD^6+B6LnViLSaD%hCVF^eR8KHPFhcmXIe
KkJ=!P I1e^FeFcdtS1=iIZeVAS\d1iZWl&>aH%G$9!E!W5YhZ\wD?+Z%1Wh@QK8SPHwwJ>*P\6&hXd864<Tn=9
?+Cntp %yw>u9G+<L5<I!uEd85CHi%c9kRemdPZeVibm!@>q=GtcuNiN#i\hNFAq/CJA+S^G8p/mcc19L96\mbP
qE8TNE k:CJdlR&MQXmhdZEDeyYXh/@j/?!+p=BNkXM@elm5njt=GZqZV=*=eN*EW#j<FKH*#DBT\b^!kVLB#Th
GC+8$5 PIpLkuF5tIWJ>Q<BjA:FIu&KTnl>+Y4Y4emyk!lNYT%NmEVH/&lQ=>QV^cbNuT1a\ypp4t%Sl4c9+P:q
*YA<$i L+nVPI!hL&heVi6dTw>DLRtI$\YC$?&!mkhy@9=:hqq=d\$M<uL#B6MZjiDw&ZNH\4\eHZ$CA**>R@&h
$B6Ak< 6p$d\FNXXq9ma8$XHPLu:8adGk$elWRimI<K>HJ&hHVBKYAHi/6h!/eNWWGY%NRG@Mby$CAKeGKGM5Pa
/@@GY: +Xwn@lwF4*qHYP!l?AM^peV#8VtVayPTyeXiwGp4WDMZy<daLZW<k6Q!%abGY:ac4XpGu=/PkL>aS*jt
\YSleh Rl$NSZum@6S+A\bw\Jp<bQljR#VXEcl@Sk*@i*q$cGl+SNVlpPI@kYI*uiJ>Aj<F/5hQASm@H/Lhkc@a
IXZY&& uF>#Z<&yIC?:d#$4P>uAd4X$eZKpeStVk:cn5&k6YXlp:EFR16T$c%t*T8:ZN8Q/=X<>uX<@9up8/wEn
JkBTFu +&iaA\YBEkPPi1=T/Xw5VLm%+udJHRJVhX%ne@9nj%<<l+hTj@GCIbTIJW#&eSEqpCtWK%E<lTAlS1>+
\8#\+j W1w<NjWSp/jh=j@kT+!XJ$Q*ZDF^wRRnVp9$mHPpBa1D=ed%a?RdHy>Iyn4a>AR/QZtTuTkli!wj$NXc
5jhJ&q &QFVpH*6\1pn5cF?:k::h&@j5HLlLD%6QtI$a@qP%=nWk41&?=tu\^&&L>LX4mjhm9wL%ll#4V#F=@*L
eE#@pC !L!@<4KqAbMWhCQXSDhLpGS=N!FJ51Em1/C^BRCDZ^A$Ma$MKJi\nkH#X%XbWXqXhm9uylBA?k\k@XN\
&\w6$< M?XWP%q%SBITL$WI6bBB/PJd:Ed\W*VTcHB*Kie9ZmIIRaRKew?ZXaAD^MnyaFL1qb6=6!@Nl<BJi1DG
V%i>M& wDHV>QS$lV1M6k^@?uV?6PuVy$$Xu:d1bkFRqF6:?TGl/PVy5^jTd%^DmlJFFB*Eibm#PCRJFJZi9?Wj
CtET/L 56jE$n%\e#BEVu=BaXG^l$?uHA9#hud\Ck#!>\<JeN/yM^A:$Td9hjeQC@F&>\/KmkQHE^GjEBjt/?dp
V8B9eF /P4t:tV9=Gln6yw@SBWMHp@%9^VSk^lCER$WMTMG@nX!=N>@n#Q\QwA:pRI^K?FIK4bKCJHJNpSq6l:y
/F6^\p wMatPVYkcL:B<6Z4N&$%N5FdBdAXk8IdkJPa9*V^EASJtce^a9Tw\RM%NLTGnlk=ayAGkDVmu#GnS84/
X&Kc!C S+TFS$TiCL#YD>J4EWmmIAyBpmWuG*F<XKh&*#R5&a+kTqBk>9^&aS:Ynm:*n$=nu\dd<YyuK:VS5dWV
-ADhRC 000c62cc6c7001202b3 Page 187 of binaries1.zip
BtBDjX 4aRNCAtQQuAa@VW8M4>d*eVtKV1@ju4#@HE4j6=*YCy^6q<!HVm/i1*#8lbR^Kd++Pp6^:/%PlCGl:km
JhTmdF @BqjdMc5+WmS+HiiV=ZF1BekAp$mEEtSh%%X>VGQP&nmQYCIP$tFE1P+HQEiCR=RJECVJ%ReJDPT4/M*
AHG*Z1 F^Dc:?^DELyEplCXNR*NQcVX84K<?E:=ZRlh1nR15e=$+>Lb^QmIAA<upwDAbWa$<1P:iL6DSHJihZ6X
nnC<u? VuKpp:GB4p+DBL8TiuPYGyp=eQ*n^Kj@!$kW*Y%9cPkFiCkmRD%NGDCBCyWYN4YmMqFa8$Y/G8V4G@D/
NlZFMH tReQ1t41:uRDPB?#htVjKp/>ZEnYS=J%h$<iQeRdKi4ldMM6qSp+8pnKh!k:X/+ScM1JuDjXXh$6Kem/
>%M1CB hnH=/QF#&E^iY4^JT$6Va>Bauht#b?uQ$J<^k>bnhGphTy9Dq=?8:%PC8^iLT/=&^!A%TYhT$1:iFFF#
C^HQPZ KD=YNEX&?6!FK>h8btMj=mFQG=M>L9:BG\QeQH\Ck5Pn+$?eP^:l+&V9ESAW/B<T=LFu*mCeDJ=1=S<c
j/^cQX GiVy+S<Ye?BAhGV5paVwRC>ZJ#h*h%euJ^iHjS6%l/9lQIDKj/mlNj8kRitlCVTnS9$>i6yG<+kR+8Pe
caS:uh Hek/h1Y>=tat&#ab4nVAqe+/&kI!1DqAX&@YjIMXc#h5&dF#>&:n#adL5SPCSt4$=lm5Nl!6BN!wDJ?5
u6l4md M*Ze<EEDB&wNG@uQ*<P%BtwPH9HQlNGn^t/LDkh5Dl!M1BSlk<&tj&DV$!QZ\&:aS9$S@PT#/9MPnLaw
d9+9#X /+A=Qdbk?^>pAu%^*dGn9c&N6bX\9+/Xnc&>k#NA+^eaElHD4y@FLb5QGl<?j@j=b<?9d=@ian>hVTYb
ncAC*! cMkB>dq?>T1h#kXmMkcSuHl?Ai+Q8*8@d!<^4l%+@\tR$S8uT9P/ABt5%jcweHtEGJyH1an#XFTWKRAH
&RqBqb wYGIHn$CC!itN9!jC1BGdJwcq^aVB?ES@!wlFCeqypH!mlMIM:9&P@tEAVQuL/Xne$NXdTNESdJ6VdWX
m:Hu#w ydjBT6+VX1njl@M</&y1WpJM5LeLTT$a#JtlR!E^P9M*&aTe#K^w4<=LmZHb8WSQy\p5J#mCSY8&Y:1G
bLFJN* eBNT^Be>b!S@FlaDNN&NKC#ISt<@NFtX:XTLiHNLT!5t>kSNXKNeR*$6lEW%6YY=&RnN8/!%BZe8y=Md
8pdNJb XHAFtAmatmy<YcJNaGjPpA%kbDA14+m$#Da&6#R*%qbk^<PX%KSpMyS$:::*YM&B\/dV<#q#/VuMLLGb
dc#:G1 5&dSM/Z%b?nN$NQXA*nEnDK\yySjqjcTRHMcnyL4tRkN46!Pn!Q6aKJ=jG#p!a@*e6lq=8kZHMm+L@VC
Qw<5VR ###&/JpVMZ+861:?\E^\5Kjqp4>Wic1K1wcSEbFBHq=BpjEHD$SHH#^/KNLj$<uJ\<9V%euF%YdZ$9ED
w$4uyV ABe\+\4@D&maEe^j#El/FP@9$YMudAT*=pYYykI#i=ZM#Zb8&:Sl#dKF:Ea\mpC#E%8E=l85ZGi$%hl$
CES\Y\ n:t=/R+nVPLykF9R$b&%cMZ/#jwDqPTXlp#T%ihQGnXET^P\GV%t=FA6#eHD@=p+j5#w8RGSEXFS$auB
h^TW+n iRTdy@*amK:d/PtSINlk*###A^5m?cI>wGT#dZ>!kc$6pa&i:M/c$CA@$S$^XycY?!kL*Z&Y=FI!RMjH
ah5h/L Q#k5?kC&YYG>5:T!99$b!hq>\=I6YSiG5\?mlW4$NjH4GSp*/J8>taQ/QF6bPe6PI$um9*##wiQde::a
bj4mRb %JH@yRh6G%iXJ!VnC%^qMG?$5yBES!^CZDZXNtCI1@bZJTApQu&wFG/aqGApj!FCpkyCST&bWT^Bqp+?
KM5<I! wWnRbhLn<KC81XYWX!nB+cG:>?n:/9j8RqmSpbb<:EC+u/5hblYY#6ZZETJC&uQYY\ae8%:iYqh\Q5:h
IMG@GM hLt?Vk5Y%*Z%=+Pk&ZyHJuLVe5X%u#Nm#&??ykqDyFDd#%Bn/e$:LZR4R>1G&A+IC4!dVANERVWNnZe!
<hhkmQ jkFEd:PM59P8J*@?^P:mdlelBEhcaX:&nY8Z$%LQ+b\6&LS4N:K\K=<M1#T*6IJdRLiYp=F&DwKhjG^K
m:ud>G !F*:N*@?\wWLFm=aMH<iQXh5#6\=>G#lVEbjjwciRYwB1E=PbXal+Te==eKXnK^4cZ$Z&jZNcy=n/:!F
b6iAV/ cX=?y1c&QmHBZw9e9NC^S^<?uSV4:&L4:BMa:B<e+t&>bnVkw/!<KDktK5nDJ#V1+KEDMVFHE?QD@h!e
tYQ>Za Zd&<QF^e*J$6N?pMk>?qCmjl@^5j?m>/FQM*<+@T/HEL\i1Rbh^aluW#&:q><+b%K\*t#!L:\+AQdT\k
8E$TYG /i4y#%t\bKYl$dchb8dti#FqB*aN$\l\\m%a9t/#!cdSA:TGny!pM&9G>LHDB&pNGnb1#LnS\\eNGkL<
1BCAjV VBw@l8?BY#YnnpehS*+i@<pQTTMRj5BCW<CQ<Mh$htMD=lBEZR:5wA?yI=F68GT4EHbqpK&aiG$YdW:9
p<@piQ ae!%<XI!yMjVJ\DPwIPpEk+Qa$Xh/>QZu::*\hNW>\AHpR6Ah*APpMwR8*E#5#iL#l/E>cPmpn8pt/$G
=T+*@* >^4l4SG9!N%iEQSMGKDK+@%Twalb/%MiXRFBl%Ht1GCLEMmQKLMklF>4=HFXB%Z^9@MqJ/1ITWlICmRw
Im9i?* !Y<THHtpStPc*6^qG*hcPu1HHpB14tWX*Lu*wB/yGhucWH&*8BD#k8X*<jKZ&@tb/TpuDpWFinm\CRN>
deyM:d ZRG@k5@VZ&*8e?nKuidGw4S+D:PXM*Y$H=IIXY:GuCYG^98eA?JPyZML15Su9GCpinJcY?6J/1%BkI%C
TucmT* nRKYHKut8#j9@j8+uY:yd1Xc8y6buG1dT4K!PkGb%%p45#NQ6+FJk>@V^<6hMthPN5Ytm5dT5Tu^Nqua
hFQt?R k+5QTNuw\h&TY%uyF*E1HM8p>/!ZLF%CG#CLJSelM\9w?e\<bm+D%HBtTe:TZ^B*C?Id5aL!C+Rb#IZj
pPP\%b :GQteH\eP/qDtMG/W//9n+ZJj5@AaD?*Bb/?KDq^J$:FB:4c&u5HlRRGl@ncdb#AW%FXqbwijCkt$MM*
FkDq#j QQdRwdna8MRV<cG?45+iQ6:8#t:8ntc4^15nMaL@H+qlSm8M$:X*JS8XABk#iRBt+:4X!<uqn:RPDYK#
#>AJX> G&mbQY@l$6YGt*iA&P!%\L8yht+lu^tibp9ZGBtdtimMHj*Z!QHc5&j4V9y4/PDB\$cNuVB?%NAlR+d@
?DHGSW QYH1^HFV>pXFS$bF^^$L?Z@!<q*+VjCh#?c^*:B44ywdc6tFMkX5F99<PhJFG^MiDNdTlikMZyWqMNW^
=Xw>!= &&P?#^L99!TlaZS<\ku&Z4Q:6T%QZtHK:Z9H?=i+b+dENi\8!^5*tA\yaCW4K^99Xeyq<kcJ%l:nyEE>
TV95?t i!jS5^jk$:=<@>Z#Al#ZaBWcmKH@JEbeqTl<Z>&XSabTpWCnVKCy++tycp!yBt1+W#TEppIJ@KKBHc/p
l:ncu# HICnIDhYh</!nTaAVkmC$=>6c?9FIKi?14\RGC+yyewG*CFJ:NNHapN<uK*MSCpCA5/M=caieSh8N#YZ
Me8Lni ZD:5da=dq^:^qdEXe9cm%X9MdD^CD=@N8M&6cSNj?bKSib@X&F\Q/EA5I&^E*<cRH*tNENjW%niWuk%Q
X@pJyI cZu/>tF:Y%69c\?EQ8J+kS^XL>bTe8MHEQR#m=5Nd^ch*b&%LQhC*4@Qun#<#SFbCT*18\Lb8Z+Dd:Ww
Jb#XQp LwQ9y+q5JTHZ$WHkB5EcFly\JLTqIZnqT8FTD4DEYW\9aldTC<Vt#=6H#XYaP&iYYY=^dq=iRiuFZ:FI
G@dBi< We4=T>i!jqN$kP*nV#1DFGXpyRZ=Y=1a8\TGBLy/#Qj!>R<Km#tchDna\<:YI#ApPDDW*&t:6kcP?T6N
ReA*WT 5+/BpD+!:9BlEK<VJ?KC9X^eQH^>*F$<QP%NFw+m56Q:9!CT%Sw$iQCRIWPHDl6GD?eASYIR/>A5S&QG
Vy<&Iw V6^ll&9/AKPh<wCS+i1XT<nqn:$/nK:TnJq#Flk5Z:%l1@F8e*PLjdVqPk6#M&P5=5*RuVF9!Y1n:d9N
5EWwy# ><!jPGHWZ?Q=5?jPtn=t^BCkcN!pTYNGDEYKyp?bPGF=iB^RhPBITFX#Y@69m9y!dV$>Wt\l+c9\G?e:
ej5$WP >a*ju^%+&NeNSNJ5tLi?pNKjHECPdEF#ACQVZV5yE>&h8$#N#C&AJWeZCBlD+E%KQJ%/GTL98>ZNV%/?
DXCwTI @@14?<hu$5qR*+et5yVJ*JREpHJ!ewX=hQ=kLAQhIh$*iLWZkS/9b9*/w/8u<!XjdDILEpY!dTKRJNTW
#8d<@M =iXJ/qyeGRIjlwAEWQHE\hwSp1y=atyny>eCTYJk*ITT6ER9jApBJVFySTWcYjwdYNyk55@BK!R85T@y
4n>meL *5>TdeYhkq8F6+6L/D5DTw1L<t=iJ9pCN^6#:FiaQWPuF%uTNVB&mVyZ$NBetu:W#*L>jF&h^*^GS$q9
#LiK>B =wIXRCq8#V?jXX4Qdc5SN*4JTDdhiq6dZ><DPpR*WR$>nYyw$Py1Tt==1w>bdi^j$jkMAp&1>XeL6:tJ
YIAqP# ^m^&<?&MH/DPQXqM6p^Pdm:&L&Vu$diaAt=8NyY%LL9\Sp4#I^aw<Auqh$l>kF&tSZRyJ\?:1@CdcpGi
@T#8eV HwuclT48FGdj!MZ9FqjBZh?=wZi=?LKqT=bRIFDMI5=C+RLJBjQut1RZa<:6@w$KkqQ1^T5b&hkJAW<D
6bY>D> Zkpb@^?enu6=tyk=?weGidl:#9L!k$jlWNKSWA>:c#j@pJCA$EBZ$#tDMS8k4KI/bJ48C9@w^CQ^B\/i
AdGL8A QBEd=Pu5+8Zn+?:1+YG>hhbRH1&Ky/Z<d=wRJpbLwb?t+eNHAE*MKKt@S+@?==@Sw?p^#Hmbqj9&w!d6
F=#GRV *K+AMK%b8b!>TqXZ1GPPpnS@<XK<:HauTBIEGj9bVmF5/Jw%a/:B/k*dVPHunjlV^+\e!=?>cJ:i^FHD
tYM?q\ lk#:i?#pKiNHDS</@P@^$@qVJm+JPBAXHSPVGJuKG1PZ=E+Dhkph+Rt:Fu=<?@L%c<<*:j/<\TNS5\Kt
JaQqyC DjL/b4Y^MV&YZM4n/tmLt4VdhKi^<R=18?+Pa=Nh8<$6>69aP:tBMwZHkI6L8RVQbZqj\8*u=\?9@!YZ
pZ8c#+ 4!Ckw6ZnNDqp<=l<By+M8uAR&eYQCcNGe6H^M:!l6iQd#?:8#1<9?SLnNNS+@<EJIl%GXXKiI!ayKaN1
C#KDW5 ^TmLAXM+l!VJ\!E>H8L$qMiB+EpC@%Z%F+<:eqwh@^6jcy!TyKTWJHD%XbKT+EyDSKRy1/p>b?pGa$LX
&Ha>VC 5VMZ&D5Xclya1l14:^YVE6X68qkNZ4+wyiDq5G@u=4XL=8n4>CBWPk8&PwTj#166Ld>?QNDccJGi#qP?
B/D=*k K8c\=!<#*Gb8/^ETj?yT:6&tXt=Xu4nFK$d!@jWZ>ZZ%ZTBMXEN9I:ilu1=XddyjhH\tV+&uMjmjtZPN
AjT&^4 p1:h1Yu1BK\c/Rd^^8cmnP>AqTCL!btTuZZqbPJS!!%GY:!nk8LQy6+pF<FqbSduH!9@k!6MqGdh#Ll&
aWYtRy qW:Z8a:h*pYa^/=BjBC4J&\nZpQ%9bL<ZFSp6M<QC!\&4q/%cnX<4X!^uF4GLGYYmBp5N1AZe^a^m?Vt
nRDNp# 4n^ihA9Ve+WZCX<ZeMWq!>h^*M&GR=t+uT*q\8Z$nFSZNpwK>Zd#<J:y+^<aFyh+NMLD\h4JL!R$KDVa
XM<D16 c??TEe4ADJ!F!k1!mmyca<jQ5HTLQl\VCHl=?\Fiu8::njRGEd!/?@D1$!yGT+LkSR>XHDJ+<AD+lWFD
^mWaH! IH:=/^>/NDPGGT5:ej^eE$LZbutkc>Z!ba9u#>GjwTjW*a9nE\8Z4Fm#j6N&W>A1lM9c^wyema%Yja:B
-ARVtl 00090185573001202b3 Page 188 of binaries1.zip
j&FI@p 1k%dh!F%P*V=E$iNuV=:/cJb$$cQGDd<:*GVy$$i<>iI9$cNu/+#jbKiE:b4^B\/GQauZ9$b:S:TE9:>
4EcMBn &=e9>FheaDG>Q<GAMSLd9EBKw!R9h+yWleKC@L#euP!5LQj8Mh%q9GMd9bZb\t#X&ddDGBnd6>@GASW4
9wMJ:Y NC4?!Mt#chi!C581GnA@%>uV?iWnnwI*%4E6Ei^FF#LbIFb=?deKC1lCytnIdXJmSh@ZSP=A^pctV*kb
TD@G*j bjjQL?>j<dtVB>L@M%lTWXNXp8S\PXn<pbDE^pPtn#FRLCJb#+A9bYWqPXycZF+S:*u8=uGHV1+H$LkV
paGKt/ ibRWI<qBK!nXDbcRA&=\wL#TiEVN\5E#JQaaPFm&/\+V*nLaZF&IL%la1F1R#/ah\u^h4QFVtc?9&\&a
mBaPHn 1Y4QNdIJQyH%wK*mJqbeq?44cD@n1&Fec:Bt5?q?b>@II&i9FXR$6%S\e</K&:%tyH:iiNqeY%hQN*D1
ucKtw& i^8\$CywqEejYN6RXZF=BR?jyIE!/tyK$4LVk<9d8%kbE&>1LLn^DYQM4Pu\Hq=Nh4a!%J$/YaPu1n=I
:d&ZS8 c?CI5bP&P%*IRGuL9F&TWN4Wh$Nd<Y&MWVN9CnMtb8ZkQ6T:FhX%+A=a*J/T%qjTuqhEBq!S6$h%@89Z
RyQhcR C>hK4EHm1BZ$etabb!t%SG1J\j^qeRYFYIc>jd+*DtG:iQqcb8/j5B$/jITF:XL/Jc@RQecYu5Gl@t:8
H8W9FF Z6=cQ9:BWWiP^Zk::4j#Dk+NCRu#6X+*H5M4?QDEqJYWcGWNFTXbThq@64l:kbV=?um+i499*/mnyaK5
G*Pw9P hiE5t14IF>IDGYB6>KDBR\b41Y5MAFlqbiRWeDi@uA^Qa>R@a<jB@$?e4LehWh5wB/m6YL=p$j\=M@WF
Va6%KA im4/^BRcG1E4BKD&Y>E&/&&BNhA>VMec4F1@hhei@AZ#BhPunWZWq5#VGVh!^Im@^$@nV^@@N/I&VX>u
qMJ\pM 15:?/LmatNkDl+L1@&@WbIk^@Q#=!^jlX?cLNy8PIE8%?^wc?4MSyE$eq?BDTGq99e@eDJS5?>a6t#hS
XY$5kN S9^NY:b8J/lb&Vt/p8dFlPQ\pGdh8wQ=9DehQ>p!:GQYG=I:bY:SiXTi#K$CCGKKdleZ$!YD5YSVSdaW
wBShG$ km6EIj9R<iX:b$<Z8M1Z4@6n4Q>aR*E%ulTut<6\8GI!ZGZmERqn11wpw@iTJ/&mJC<uJTElL8SKm!GN
?YjZCa 59I1Al/Ebq1VG=C%1aMyKRF\JySpyGlJSpJMWpJY1Mkw1I?c5*R>$lbMcL8bX%^iYh9R$8eYd&H!Mb??
ZZPuIS yRaHS8aXNtNld:=n\\we@i9t*?j#b1@jH*D5SpX:XZb!lKQJ1np/P5@=A:DFaeqG+:*&H5F^J!:e9Q&k
kYqYea 6jq8F9hM6Ln9G$cYc5y=WqiH<bi\ut4Acm^Vn\GaQCdIc?5j*MwQH/jYk?i*9Iyd>WP/tYqSdG=ycY=8
T^VYHJ dG^wcG+5!LmJ+CtBce!>p8w<c/C15wKCwnw<l81M^qB%NXtFlb56p9MLe&:e9Z:/>>YIePdq=8AF>qP!
>dpD9* 5pqDHyp8AQTA9Kj@Qu9YN\+F*:SI/5BqNEh5&LmiMtVYehi8wXh#X/&tX$tB:C%j6t!=>QJqT^bdZT9N
49tLFj yjQEm1<*E\BJQ$W@kIjmD?LKlSNp@9*KRTh:p#&8RcFBu8/iZq/cQwHl<apHjJ&54N!DRpPD\kIe69LX
k1>\mp XWm8d^m:S\DDb#t=yT/8#l=?98/8Z8=YSu^N@B&hKw\1w<aM\P?ZlW>t!KkJw^Sq=JWWcaXB5un:yKKC
+V^A:^ ky!EtAJ9\Kl^E<cNuV^lpRpGbHJ4X1?Aq:%w\h#b5+V/F4NIZ>:GLbnY5MA<6a&6uZ*jSNTPnT5JjPb+
8\W>F5 9dtqAX>:$nmkd<Wm@WtnSw:<b<I$Zd$ya$cN@H9e6Jp#6Ki6C#wE>MWqSGWR?q:<q::iHp/*NL8T:QNu
e/9SBD \Sjt5%%@jpNW5!X4HEl/A=i++mI:Nm!#5VVjDVK*he5tw\*4%^5c46>w6ApBNN64TcRP*PRlmM*Td?cZ
8*w8JZ XPAMXMiQdqKJ\m&m4IDi^48y<yq<KRLkdeCQ8VP$6I\pBQ>w&Q*akhhmh=EW!Y5?h=\GEmn<5!LF1HIX
b/FRRq ^V1=ZI+MS=u85=E<F4@ZQEbNawCKyBmZ+knI^dCTZI/pnK\TDcGdKt<pIZDcMCHR%\9$Iapa4%GKG9Kc
FumLV\ 5^E@HMXF@DL#Ed>G\G<Ec!69btYD9PVqkmP?hwHpQb\5h=HK4uaZ$Ki19&c9#?G4=Y$%icp^4tcGC*S%
eeV9ZD 6F>C4KctN&i=pbt%m%>E\yuLPcX%da%qN=P+pY:mNt<a!j1mny1/81=/AZbBNCkCXLW%NjZX6\1Q<Hqc
61Nd/p *bwT/tId:#:4dyb6SETd/@KS6=+58h!mnLQq>YW:%hWH$qyhtwbctnIK!4MCEt@h8*Z4VGI=aucuyJk$
ml:<19 yiPN>:q+a%BJGdphyRX$nFD&@QpL$cSWT&Q%*Z:Mu4RilMh#I:YB8>/RZpi6bhbI4X/Fi4hTEYldayFi
ciSGc= n8>BTZ+Lwi\!Z9$twk^*uPLCQ^FqeV/B^n96@eJC9h\<QL&<b@1F^B\=GPlmdiu5H^aYHB:5bnyQC^$q
DlMX4: judKbBMB@yPKBN@J$<HDF&IZV\?4VVwcI5yEhZy%hX1D%l!kNZnE9F$&?@Zp!FYtTunyly\CycmmICZP
n>Z&L\ qS$<e9!pmSMu#>t+$ZC6:P1X!@F\kGlVPEh6:kLTE4F>q^pSPG6pnHbab<>t:5C/dECFR<l5>1@R$=5&
ai<VFl j84Myc8Y#ytGeI&j4nh#?4nSw@+bN&ZtLD*?/5DD$VG^5Ru^N+A!h5#\a%@J115HIJNAP@tb:lB<bn1$
c=K&D+ Q@cqQy4/k#Zee*KJbBCQHD4AZlXJEEN>&&!$\ZDhYu1N*6y%ll5BMlQVQSd:db*e!QVL5XPa@!m?Z>9/
HejGWe =QZHd!V6@9Ly\%b!VSPe4tSmnmqkC1YLmp6K:6\yLcQLl?BF#VW5a8SAAC8JX#YVnH*LG::aPHY!ba8n
8G1$9M VF4NmcjE9qkcTBNVE8j<+wy^JJY=iCCKWEM*?bwuyVdwu@HnBwnVa4VwkkMFLwenmS8aXHkDSp=4A6dE
RYR+RS yw&RERJwQYA9WjLEyBWIdG1#q^kTWaw=tu\^uR#8At!ChkYe&!54#Ly?A#PlhJdK#a^Lw5VIu1$plQ8F
P?h/NN 5M%acib^IP%Pe$Ql^ZnQjb5M\F8?=k?EGG:G9BYd#euX=TuZd6*FG>R!Vpb\ZZcLP:=qbL199Y9AciB/
X&WFnb 8p+I9NH%QR%!hVW%6ZZqlVqPk*uhtyIDXiijc&+SN6HN5p&NDjWN#VY=GVi@bk1!8LpFC6iVL**<@9*d
<ZNR8d <?ASk:Y$jt18$S1w4nS$t6QyuJLT=M8EPaAPV#p+=t:BIWe<bZ$Vy8^B&RC=F!>j984jTX6jXeP/!mj\
:@XCeX T*h6VLdRt=qNEpadN&#aTK&uRikakI>bI:F18XqKKbZHFHA9$AeR8m9Zd8dtE?nIBqPE:mkLZcy4=P+h
Qwht@b q6/laj=+#+Gu#+DA<IMJaT=Y??^>R5KCAeZ>K$iyRIlG1$kAN8lhB8KhVYN*8nm+?Ql=8Zy/&t@V%!SW
V\G*<1 IuPkdTJqG/myNY#KY9?kwECQyW1!5wy+#dcC6JT5QA*RKe4LeMXq6EbQuD^%mwHl&6W!!N!!yRcLFqIL
q<lGp: %m%e6HnbKnCXJtA1kT\4aM+B8*GhHERJ<=&dTZ1E^hF5#t#6CWDh&qWLhed@M?1jCj\b5@RtnjquNFA*
@dA@*# h/d8T1>DMZT5?wGDwT*@t:yi*Iw6&jpVC%#hHjb5pR5#JQ*%+V<TJLk#J6kj+njd@Z8B8Y%dN5Fy5SyP
&^NeP\ 8SW4X/%ia:ll$>ahJ1dt1G!ijmGS<WiT5B*t>6&c=me9Q*#4/9:S<j:X9+@d&D^#PSqWLb1AylKRA$W4
yNdHpV 9*9**u$euKl9JB6pmK1B4!S*W4%><dmq@m&jP*&RpMhXETHHpKI\Imi8y1w1>^Q9!?F^XNtjBN4W*wCB
=JFeq1 %Bk?nicLVSp5kVPINFq:J\8@WR+9YFEj%<V@!yicyCaqJT%FlI&Sy1W+LHNTCpyCSZYqMW5Mh\B!Rane
wcjSmw %h@IDehJn=L<DJ#k9*H#=w&Mc%j/5mdGG!Cc$?pE+6S$q?%$mW+6ctw88ZLE#&dH!ntkd&@=t1V%d^Zi
AnjBFM #^b^KCu6bqFFe%66<dZn+T=e$#Zm?>?B\!$6c+WI41iP15iWI%QZ&<DWMVZThhXFtV:@1KDKKYyji6tG
&6wGY> E!I!EP#XN#+A=L=pWqum&Zq=F=R99QlKquG@P:B9EncZ@6CW=/pPt&!S<TD:+LY!P<ITMZn#/WKNw69\
mHBIA# =yP4npnPBDRPiZ6F9haWdWPHaK/^ya?*=>YPy68EY#pAHY$p*MnhAMS^%nH4JA%ZdI!:nd&A?RXy*RR*
Vw^D&Q NJKI&*u&akikVaVd?WAQc?M>LpHl\S=8H1B^j9wl5aenQY#*Yd5HlaYGlQudd=w!AH6nSSKu\p1e@El#
\m+9qc j$eud<DN\<6l%:^BTwnd##?MJDNRWuQ\?BXikZTA4L?j%!whXYpFbYXcTWyPYqyYRSGMJSlK4wTM=wVy
>!9D69 p/a5Yd&T5$K+uE81j$5GLF8?a5&GLecaK!FIAY^P#yTLZ6@P5D$t@dDbP%nMt/<@ii15yad4q5!eQQ49
:W\itE $SQ+ANu$<cPS6uq#>PbbH#mA6MYH%Q?HN6HRB:j:q#lP*qCjlB*MJ^*WPF#$VC+u/F8V%=<8ma<lN6Lb
LdDQEm *54CdPePWLn%/%c9ktPCZ11*dQuK%i5APLCTFqb&#8ApIbI:iVd6ip=SiVZPK*:>%aM6/8T!hLTwh<5\
qJ&%bA mCltmytTMZeR6u5AY$Wq/eek9W!9*8KFj#</i:w:TT>WT*$q<Qc*G5Z!JlSJHMqMT1n!FMR+ZX\JDql$
m?$FaK FpJWN:Y*\N8AaXMEjMqy\>Tq5KtYIk9%bEqAy/#K$=#WDMCJVXGZw1WbEDhGTmnhJWXJe1Xpi^WHnEVW
k9GME: :FnW4tWX>KEt%>4\wL\wJ^&uK8q49K6\HJ$=!mbPN1@GPI/ky4N+8$Q+tj!/q9KME!GPywaLb?lw9?N4
HSlN!N aeQG\6Zd>nwF^B\:i!YuyL1%6dwwQVHW&bT:b4b+ILD&Ij6HhW%6dViwG%%HA&?K>R%%6hWkicWq=\*p
&e$b$p B@bw!t1yKqp%Q1pnBVhSe$i%mDiJ:ML$T!*m::>>@W^%KH>/<?J&bq1e+bk^E$h1cR*T/6GW$XDVYu&&
e%m9nd =81SatEJ=+/kSBiQ8u9aAWt!JwAXAQj/>b8*d>udcNnS:=c&Q5Q=w5b=n@GP:h9yHe\&ik6*M:Au95qw
/DwK8L +$b/k@TG>S6Yd+k5K1D!^G@hdBDGA*iK%#K!<kq*b$?hTE!kD&5tHDqG6tRhe+*a5e9PQ!#W^>Zh*eQh
S5d/X@ P$An+uCe6=&qyW6kYFlIiIk:Pp9AVlW6Q%E=Nc!#!e>#e:Z#>QX&h@N!Nq5?TyqY^Xa&WStANN$PZi:w
W\k?=J m@iJ$#/1*l/8b5cdX+^Z%>Dp!WuL5NnJ!<9Aa<Id\=<!a?WKi4uamyW41PWdX1^e9Z16IdnKQTK!<Nb1
TIt?:E b^hZX#h*HMS*ID55!c>bEiwe>5%jNHj/6JqLNl16uD6%:GnAd6c<8V1V^w+hQ*uGk9u/e!\JhuH^$St6
NjHuR# n@+Q:Lw/^ZFAl@yIjYI?/u=+*=<<?TN/a*MumcJd!Nuw#hS+/&aW8SZLqlka$I9%DJa5Y:HcePQtdeaw
im6Zm# hI=8QkHlMaiQ\?PcZXn?wLGh#XX?@jnt^hPHdTS4h9>8ihthP!WV$FWmhRT/B>Z>LaT9*8HF5#>@>bD6
pB^!bT MRT:5uh<5epD%TBI/>e=SpXKYRZ*t&Mky!ctIkZ&WwInDhcjla<G?F:#^IbNuNdDq=<?dh!aj+ayT$mA
-AVF4t 0008f3d24bc001202b3 Page 189 of binaries1.zip
kXq/Al 5SeCj\I^Kc/WEp@6:?p6AB>*!kAK&PPA&AtqBXIeED^KpmM4WFSZWF&M6/#@=8>iXX%n1^Cp44t8w9VY
RN&Y?B #dRL8LIGF!teQ*9<aGTkl=*=hpMDmPS?Au<DhBb56kp/pjYk9TL4VIVd95*LbwQYjTLNH=1/M^i6*Y:l
cyG!>b HBB*M9X/juqhY$6q\iXnkPAc:l\hei@*nN!Q4NytlLC84qbAPP!6^<ulc5p:?VeeS/l%I$bG&Y*%<B8w
c^!>+T inERQLyYHELCG=?S\KK4%:>@p<cF9P^hSC49*4==<?J?%tZj%Rb4^twNH1Rq$JVTGKAZZ==/lm:l*mpX
HuZViL qnHq/ujSc/DQ:BM*wQD6P?F:VhEi8wj64AN>mpHj!$jB8$%:VeTASGwd5%X1!?dNt#abGhFGE88M\t<X
H^6R:b AwH=>+wETPAwHBnJ/!MR::kVEZnC#e9C&NI4LD#A*a%&F@Q$DiHH^Re=:664/^McHkJeY1$emR$Hc1wk
bDQn=? iQ&/y/K59e@b%6ZH^>*F$>*TeAwyFj#+\&a1D6RealRemHeKibE:8*n8iAZ&*l%dFw#>/&>qGVqFVK4I
$Znew> !p1KeiSGVb<$i\Y#k46!qZC%=yy%l88NNlGL&Th6CKCdP?Yll\nmhtWLe?I?EW=HS:6qm^d1ce>ca4Sq
bbXXn* #WL6eZDCce>i5FB@&wS^E/dMYLl\%n!LPELkkiPuY@+ZkaIi5i=juiKaRcE?$B@yD<#:/Z$JqNwH9!6^
?/Ib:H w9aRM8WIS6QSqlC+CW9^!=eaLBI5$F%p5HRF=q6*:DT#5Hb\<RwInVtWiPdC%c!CWudp<ReJ$X+?a*M#
A&$aHJ XRlkiXpbA^@=tL55jDn&XIe%k5hQu&MS:58*#1/i4y<p:\u+qSi>=+6NHjcj+I:l!TB@bD$tpV<XijFP
1cVj=C 4kSRycLTN%*MWZ*L+/1P@M1ZtV=^:PnBTw4KW4k/yqhMRqJSXY$e5me&dbAMJT&G^VtAn=JCECY\Xwj1
!5F%6B J#6@HhIZCQT^VdHa5Cl5H$bc4*K9yiLGt+5ZL?D>\Ap^dB=q^V^>uS<Iu@ce>j6<E/:jc/9PT+*#5VFb
LVBjVS 5&CGn5+ZQ4d@cPuPMqm*A#89\GpY*t>wd:1jq*a$BPCd\>Zlm:8>b!S4Kl>ZXhh$%>J%cDYbYk+k!NS^
C98nER c8l1/b41@N##T?SABKY$=AeiiqljVhXThh!cc4yG4C#:bpetuTXbuJ+J/1hE:yJ/S&=N^d8%lT@quqa<
?nMqX* TApN$B/qPYkRyYp\pQh*aGFe#l%\H*iJ?/l<RJyBEVMY\Fi9<S/>D^<@5b8%Z?D#$Weu@P14%!uti\Tt
+/Z*IG $46&tykaG?@aRY?Z*Lb%/=a6t&W&d>t!caQFtjJeuD8?%W8WMCM#6%DE+euEI%VC\KME\=AA=^%t#5ES
X5kn&I Ib:\1L8/ikbE15cHPi<*6*RLCkj:GiC+hT4aV%16Z\aHalyVbbPHnd$uYDE*h=66?mVQCSS1@T+mcA:d
+\%@n4 RlnE?%V^DpucliNMPVGP/9dti>e9tK8q11mMKW$yMa:pmGqVq+lD\LTYN4Sd9&Gn$ic6P+^JAuM@cXLH
4*^@VG KTtMR:&<+R>nd\t#5lSFimRIhN/$&GCY>5\qt:c6Z#yn+4l^E:VuLF\!q#<JPX^5MH@8G1<nMdG^eZHH
Ybj%BW V#d@D\=^pq?5/>hQ<i>jQ*@1i1@#4n@B\6=<S@dMpFY$^+?\Y>4kP:c#56l65t*VluYkkRcLF5!jT<*S
I<Wm:Y t#6@weHTqY9Sj=1c:\j:/SeTFa<4=#J9*ctw\^\LcY*Ei<Ei6tKBw11mA6i1VQlDAHE?Z6VQ?Q46^+/9
tdaFXX GPn>Im5IH:NLmN:#8YQl@ShVWTaR$tA>Ca55da\11tAZXlVpeVFuZ@QnG^=u%Ai?:QSJp@<bPpSYkwQ<
chpt$C mT8wDy*c!9<ChqciplbKCcSS?+STa6L!EPINpEH\dN$Da++kiIZ5Db5WZmSbX%qYtHYJVqa:q+L:6$+u
ERtDPt JebH?GNPbe*mtd4j?jj+A&c8N9PI9*Tu8cEwLTHa!h^w/Y!!YynSF8wM$y6naGl5miBh#m/ydG=9KM?>
Y^QG6e pADk4b&n\@DFZV+\Wl*yD<Fw%6C%uBwBaEYB?CuW+tBKhY%S*k$4#RHht4Ic\?*K/15i%NSWW#ZT%ZB/
KkNmXL %XSqbTB*WmYZd/HwmTM5\6jmiJ6>>*Qt&jS@H>$y!#1*bjTw9+b4c9I$LdNQ*ME=u$4k4RcAc^K=T#TZ
X\#+@Z LHEjISlSJheY\?Q\mNRVWQNi$c@F4+AGWGc<QYc:VZeBh#5S9S%kS:eBjF5*:#>dl5mXu9qBpMQP+d^M
++H%>h SA/9VcIViEiPJl+@ii1Iuje8E&9j<HBjuFkZh@MPn6PJ>4A&N*j\B?5bF8!&i:/YCyIEWKt1mEwHQBYN
T/^D=h lVc&%5=iZ1+8:p/tT$eke>?J<Kt\*qQ#L^PYPDhZ!pWe4:pZPAn6GV5X/%$:N/<bD*?TEnyQ4Tp#l/>i
hHkH/E 5&/>phGt#X8*Gb8at8*BMI@pXNn49#&>BV/1=Mwb9GHDp6W:EEQc=c?6B55Z/M%cckT8h6cW<iMuc5>h
5/L8\j 9H!l*6TJE/jMMFm&iME/4!NW:IC+I\E%@!ENP!KFiDq*=\>JWL\Q:>+J*nQ9hN/KWm5NNXWp%M6n/*Ym
aF%pbQ WC<mNNAQ$=u:>8#c9uuD&6ZLq&ICh5+5c1di:Du#Flk5Y:X8+=ah8@ba&nm=?\bH^l<>lSN/PD:=tM&8
>MTupY jQ:\=5Y@n!GWSN+1K!48*&j8M^Xn?qm4d&kWhR?@@hD^:ei9uy=j*#@nEtuS!1<QjJpyk+nyWFat1#9J
!94dFM yuSKYb!6Epm11c4Ie5F&T5wwk!6SFww!L^!%h#\^XdX@Z9Eqy$?cNH/$Gw$FeVF^4w#KcILeGEXE4liW
VF!jp= V6CQuJ45yFZd@w6ejVNKZYQ%9bK<nFT!p^j*e^$@hmk/!BNVK59t/GpneSw#qy8+SKWWNncZZn$S/YFq
X\4466 9HalLn<la?XCucHaGd+E1HMJmE&/qFhc*hJYZ=chinnEiji/8V1+D54uA!Q^N49^RZW*aAiCX<9WCFD!
&k><8q 18pH$6XFGjtuFtLEJ#XRcjLq>95XhBZ#kKtY1c154K11KepE9bQN!m/>Wp\8j^B:??a%@bJ=RV*uQBQ<
$j!Hk@ K*k/uh&k%ql<#Y@F+ktD%ViGZmm41MJAEqTP>CCLEm!9!GZmiC*ZF@w4D@?5h&Tcqk*+pD9tniS%c/6>
CPq*9y i@jTFqJ:#jiati*iVb6KIaDAH&$58YP4%bqTSK@w!q8CH6+:%I@iWVyBp$Z95P*?HZ9hRmICASJZF%hQ
Hhaj!J 9/k+JV<:m#%Y*1HlwYFlQ96Zn/JX^ZGYD>\PdyVEJLT1\yDh4lb&:q=8D1+8ql8t16C1*@why\J\b<bm
8*:Thj =?LmSJQbZw=h4/*ASyq$eJq6Z1W#XFNiRq^64N#ChS5*dh&&\*mu1Sq64w1^HKCFAwi*K*9:?QyS@14p
V\>PK/ Lp\ZM6^M+n^H=G/p/+/q1\%t#q/&ihj&NjPtVS\@TYjipqWGM@tVJ$*SY:^m/TJD#\Sl4Fy<TFp@h%@?
ttFkCQ +P=Z=*jJd=<@9Z@:X9mPic9:=nXyFTe=FnJhtj&:WlejG^pY:P@6=5R/#a%4X!*H<8KeYjw#cD&hGjw#
9p8WtL =<^dTPwj&$^&k>>$<\tKPHApKiX!Byt*jQme#F9mqVdQMby5AQRiXNGXVPY+*>k%Nj@t:m5Giy*jCHi6
^\5kZ* >R>\bQ*cB::piGWi8bYkX!S\K8SHL55hn/epCWIun4pYGl!y5E@1*kN+A<a?+T6Mu#JlPE>bSqJeYt*<
QQb^Fu >HcAVt1Mw4T$nLR$=nMyGVFyKcpiCQQEyPYRQZtNqaT>cGCQ9T8?9ypm<<!whqiTE^PQW!iWEw<hPS\d
FH#J%I K51^/P6<A@VWhBh96R6J!1%y8=?bHB@k5GjV<up#cB&Phm?\S?p\85Nt/M?b9*R>wi>pYk+Ei1$%h:JT
Y5p<>L DkW:t^uP%?Enj8ajGetHJTB^%X$%\F+hBj>LEj/ED!S9bh@ey\!cJ/e?M1!1k4n%C41TY*Gj4lA4!4#=
pP#Mm$ KXM&8@^CTRi=aaL:?mWNapj@!*u/+<pRBK?%8dG&Et^MR1C9:eanbZl4Ca5h*c:</L@eji*>y9SFNNH^
?p#6Iy L&58/he!tIQJ\n8YlJcT:BbB&w#iLa:CS??WNNqljbwkX*!>nTCZqZQ4@$A8*N9PbJhDRHman!6EWe:8
c\a>bB IHdlWp/Yblc8\iF$1A4+!&ua+D>AZa$XP+\!XHnKA\$hLC$h*h&euF#6VBbw$cyjXhV:*KZtQ:6>9D\<
j5>d^H TF:E*y/&a&^yt$=4FZCF8K^t^!dDXT9$y$&dwCW>i<PY:Tc:EDd%9Z&b#H:c@Q\DA1lAjjd!Yd^$W&Ru
+u=dI& ZVDy+4b#tiGKPZPYdh=6a4lIi@LETV4#q/=hQqh*/1Tyiw6YLnNa:=ERR<Y1Hk4Q?T>\9:1E=HceH>@E
t8a%/N WijwN@Sd=k*>t5>i>%=jW*u9n^LCGdK@lt^d>HC^S%8=%el\%ZKDljMSN%&lny+8QpCLWPuAYP/%euD%
DMWn15 D5T$=nq+Vw9KH#T\DT1+l8$%Kl%i8XNLF4X\H6DXa&4a/#jIRh8H&+<8^A&NKPKG$^@Z$#+Cd^wIHKW5
bl$XYh /E?9EJ%DZ!pBu+55!B^ZVJam+\ATcElR/ET<6RBhj+$aI9<QIW%m4JK$nA!NXRNywR\n#jp9cc8S6AAS
Vt<9K? ccWX%R&6NLqHl<ne?SMJCeKnmuk>hETAl=*=D5Mq5*Y@w19WtdjS$9>wBp=9Zn\c=tFqa4lpnl/6$\8W
jqNVwY DRiFt+W%&jXwLYNPyGYZ%di%XyjeQH5\!Mq5@RJhGnG#@MnIFdZWQGA*jFRLRi8ENXT6PI/iWR?pc+y8
&lNSIe =B&c4VkR:KY1#wZt$4K:>?:iw?=L*eP+LQ9Gy$!=4NLpmw@5dbBm#=@>K*nCQGaiCS+KHp$nyJFqAqku
S@cDH1 Ld>:?VbYD*AmnY%t^wRt5bX+E!/=$I4?Ia5ZVLJdYPnuWlDu9Z:#=m*>V8J>4yP>neBKcn<<!u9*t6N:
CRQ1T< ^WD4/N$!IHitP@ehK51u<5RLm9PEB:GpkF5Vj@PYpHAEA44nJ>*<#E\5jeImA5ntFleQ@/kwV#Z4QYc&
SDFyy5 jtGkeEH88^eMl5>XZZ$A^SNVXkLe$F51@4ZL$Y!@m:8#ubPV^d1JFP>du:EE&5ba5G6kHB*5dCpd^y1^
W1Q&\+ a9d*YFL:bRq98%Ep/FZm1>ecLyE\lMeWcNNE&pVlt%MjdkEBReHBhMm5aN\6mPQ:n4mmm9Dt=8d8:tG/
LP/$GF \tnN@Lp46ymbGm*Xt#Jq58/CFac4F<!aNkYJY:q$nZ%<VA\h1*4k$Iu&@!LZVjXI+qZt*:?J+>lk>&9?
i=h/Gi 1=i@M!tmQnD&#wTnwq5i9F\hdC#SX/=j9e^k+d\=M&iIbwPt/:FVDi5*d>>qdtuu+lWRlu8l$/=qm%dh
VnDF*B +I#c><<j*:+mp&@N&FhI%#A%+$TGW8S1?tn:>b5&:Lw6!M/+uA1+ni1ZN?^p@1?<kihZpkB=\*8hed$A
np^ABd Nq81<Ck%:kDXD<Cd?wS/QujC%DbEdb\!Ra$BWSQKCKRbkl%ZYp/k1Kak9&V4Hl5*q4VeRq^@BMi?R4?t
KZeZ@> Hap@iIk?4HRw@pB5XIk*yp=Y#6jZS6a$6MtPt<8q#R&*$$@F?n8cR*A*S$?*T&eEi5u=m=c8ZGhpa8u5
8jt:8G H*Q<R6ch89dt165b!jGBVtadF8ySmN4/V+^pVY=DXhYD:tyBDX&Nwb\C&eu&wCI@=+cFuDwS6IV1a1^!
JBqc4n qyZVh/ZK5j/TB*wtu%X!=1:w:8FuEp?jQH:$mHyI6VN69>wuA&Z5MQWh668uyy+>&6lY!*:I5N8hHa*u
n#AY#k 5ShLa>eEIi\6bnMqYpPeHG&FNtLYX95yT*1jJPmc?S=#Dp+u:laL!4pFlPZYZQtFlCqt=^Z?RSl>SBMJ
-AZw*b 0002780090a001202b3 Page 190 of binaries1.zip
KFV/eS <*i%NVb#DeGEmT5EYc=iwhH?6yLt8@h=w1D^9Qi9HR6Hy5bA>REkcD^qbSa^Fe$6ntb:dF%e:P&hdI\Z
*9?kDe cNK<4!wcw9:tkYQ*iJD:DMH$&Xn6*!?\bQbSFwJ>nKZKQul%bPb##T15D&#eQH!:!Y=#e^Fj%4<B<<E:
1uS>*k 1QF?ICyMLVRpPJAk=p#+\l1CP?W^$u:N=w&L=1*e66h<C?nnqCq/C%i5Z&e\W*91NL%F1>e5Z:+uKp+a
KG@BRp \$8Kc&L^IujZ@?#DC=8>JHG\@hW4/nZ#TyhepE+!Jdmbty*B\ZIB8+<dN=:CadKjYMk%!\$Y#J86n*6F
LaQa6t 6IX<QY!9\Ec%XabG&$#MLG&hQj\^bbtMK+4/w4hj*V?@wKk>I^e4+q:c84wJhc!eNa5?e*d<B5ja8u:&
DN8hH+ M!bcMZ9tE=<:XyZ/R>E+EMH%Kbw1Kqwuq!QZ1$!V&^nW*lP!WnE<t/KJ5mWtJR%MCatEAXP!CkJFu8T<
Cuy^GA LTKpL8GtlM1/bmTKnE@ubX\+iVA&nn1kGBeVHSH1=&1#b>6ck=t/Z@l*?RNFAXyDe*qt/yE\D=9ht%e9
X4I=^P t1PQa^?M:knSFBXP:kJV$auud=dW6DXXFBKt>t^eNEPIVG$Ayt:XX\NCZhX$ndCcAi$TMZW9=&bi:EVq
&Y!5R1 Lp$y6dqyqRXF&BBZKqNYCtJWYyaFAb4C#eLdme?^qIaSqjmnl?*6XB9h&66C6%J6p%ydtpW6i/Y+!1Gc
5Z%yy% dcH5c%<GI$k5I4d?+RK^up+qe6ejcjhDyIAw?wQ+^=N8dyly+NnT%nTwA\jAam^wC<t>=taB&RTy/555
<##ck> Wnu=SWX=N/@?F!qu#>$t%kESEZ:PTIGVt%>p1JPFq1pb=pNC\@\h6?ITHDX%DZW5\RFT&K/u4D#Y%H1u
<unpy= 8d&#k:Y>k@u/KYw$ET$%RyTGly+Veai&bFMHbWH9:Vcu>nIYK5kVQJSG/>iRHMnYHWN*pSFRRlMy84E+
X4b*^p ?jwnV1HlhARV!WRwl+eCWn/+RRQqCuGmQWh/RVC*bPG1dj556/?c#b<&VZjB1w$dq5@X+$?d5Zn6&qW4
pu5:$H h$jFWnG</BM^nj<l1w9C!$6Ib=e+/NY4Zkmb?ZmyK<SL6XZ*j%?a!Kd?a/QCk$u9yQW?M=N6Swa4DSdM
%RtEVN ua&444T:?hN%hEuD>S4\l:9*&Vl=?IXEH&V:J>q\:N$Z59Wc8GW4PM%NnZRD$#BPyFRpta^ZAd<uDe9p
#4L1T1 *pZSNX1qldq+A<jJV*!JpT4@!^\T6cI^CRLtRj\ZBGMTmmwCbZI>k!1q^qH>mC5JBp>Q=Z@tT@$qJ!Mn
DQ8*w> K!NDTZNpcFqW1X:+b/+MMmW%8+<yHMe44/y9Acbct?81!k8#$=PQ^pSGWhGKWSFkpV$h>yq5ZD=*lna!
dqEuE\ yct:cK66TFJPhX6q@yYp8ACZ@d8MXl9Mu+%B/5kb?4QuLVBa5adXeCi@1GPyGWWQYy99F%+:E^@w9MjI
B\bn$L RF?AWP*6aGV8qhbYXtFwKunAAFZ\BV?CwNe15q6Ec+w!e1>d!wJpKR:+/&BFdu=BWXFlIZb>*=awLmuG
ydiik+ lL>CV9/^/le9eDWdSF%m:c$6\tctTd1^waGeX*R#*VKXWEc1u!B$FbZXhj$nPY!GR\Vb%&?mc<q@Cd5W
GHA:p4 &H9TMIwA#GnAnQ4IjBJL>QDwhSRHJ\a^D+HNp4KW5DAQ!tKF/*I*wT#*%t*+?Q=Ltciu6atbY%lp5KiL
S!X@Ja 1:PDk+6uTKVZ@6*!8!!>R<QDRwM>#BeQy*q!/kM%B8DakAyT^5D@D6#taGK!%>:Sb4?>6auBWE1We&VW
1>TuHZ @kLMJy9npqEd56WchbRpbp^Nh?*ecY1/&&!Q\F^=D>C&ja9S?4YpHe4aqDEjKy1@5TXhJT+m&IJ\d*6E
5IWB+u XHR$FcMeFSpiGkK+idwncl/AG8Z%6:jQ=l$:X!^i5<QT&tV6jJ%yjL&Fc#b6ZnX@l4d&nEX4Dhi5*l$S
\YqtYl G$NF1=!Mcj+9dVRP9j*ChiRhE4ma=du\Bj%<G8:wbSMkj@Ta@L/M^hMXE!C:hwBBZLy\:m#M1Q*mV>QY
c1SWb$ $b5%d@G!%i8*GJ6cYD8/?+bEpp:KnQ:>wn?/8*=<IY59u=LeF>ZMNI<nwRB:wn::a\duN&6qSi\NA$e:
X=EEG1 ?J#S\u:W$BkKqEZJDb4HqWQSple1m!pyK=NF9mLT^FR%J/ekcCQpbYSqmTYWwYR=j+L&q@VMLdn/P94w
Nabjnp &T6pNXaD\N?GK#NR8=IPRtlAlT8ElkRF?Lla:>/!iyG?#tjpDHh??CXe9>6YZ*I#>YmED$Bw6Gdb+kX#
kpKwY% /VpnMRiL*iba?dh%>w$<tuK>5LKq6iLY%hPAtVqkyp$+M@*MTAt!c/5B6P+HXDWFlAq1=B>WXXa?KM@J
GR:1Gk !w<c\i9TqFbeiK++P!e*u:=FFVIF+wXFKF&KYYZH!=:<C:L%CN>M5idGP41G1ybHM6p<apMV%V!tmcTb
qq#pe= K8:jJc/\YXVBJ84%CnSK%N&HF\6\j*ZS*ZTQTuhZX#>h:>>@?QlS<Iu8EE9!<1GeGSeJb!hHVC6I&?P8
CM4Ih< V^54K<yK\uJ9+M%d\n!^P?jcTP!XX%CMkLENEpiQHnq/>NlSP^jVZdaBEiE?bLGlw=6jiKD>uy%ci%\C
N\S^SY kc>RH=8NE>S=1kMGDqVHyXP1JQaC\PRttP:d6tP99j%?K#8LVVQWYSuVbI*lcBP<X+k5#nHjA!B6*:cN
tkp@<c *ny<!?bNtL4HQCJAb4=u>!/VHcVhF@#l>y%t=u!&kE&1%E+8Lt+m\9C8+enwtFm<XDW8LmatMmKWZWtI
a1kdCA dYhiAt@c=/>68*c9Nql4dGXu8u/lLy<QM4b%/>1FM*X%b!^c6*:ht6%lRBk9K6+u/<t@dAj\F^KAEeR/
SRZTiX WhA?maGk>V!j@8#jy&#Ck%$N@^>*mIq>L*jRdR8IHa*YLq<<d>aM51=:tnc1&bJXlnmtb>YZY#^HpuIX
&GZYWM hcKqB/!c9RB?H<EVVLhPcG*4n\E\yTZCC%V9E?KF6*jlw8d4q%JQJ^:/#BidQkJC49@/RqHwld=RWi\Z
?h*WPk X\1$DH9JKTX^*LyQpdlLa?K=@=M\TwanT<PQlDIX8cHLpLKaa?jTM<HM%nTBt4W$%qcYF&cltkWHWeEK
tjbM&w RaEBaI:6>8=a9*TPZki@uD>dj>X8n:mL^W$6>@P8uI+Q<dT*&Lqq@i4qT\$Mqm^d8adMW8*hd?9p:l8S
wBdTF$ eQd14j9NdhYF/cePBL1ad%+/E*PNjQGNkNm>59wKRI^?RMEZW!*E4^1tm1/W44=>I#jhVGFk6/c<lwy#
V$@$^e j8bNhlE@ue@pMjqmBhp*Q&e1*T!<thn+/LEwd%kuWa*%!h=!yp!Z*jBFLkAHSeN1ZGZF@d=bG%HbnLTK
V@F5GW 9Q<k+p^$R\/uq?ySIEe9Qlla^i:1pQ!e:PQu/p1=TYB&\wqmX&HcW4aT%95DM=C\&?edYeIKkdAd@!HM
iPHjyB \<61l:qHcGRRBp9&>5/iIcHPFn6*Ddd!DRHBCHDbNZiRCt@ARM&B/1yp!lTuAeAwK1&!Mh=m9M@Y&5LT
yW:LW1 !uV%YLW9SMC\aW6Dc?biT!8TN>!Dy6CRYphn8@V1\Y5NN^l6*4whCVQhcd^nP^qaMeJ!p@uiwcJmGYpQ
P\DLA@ ejj\BLkCYjWC68LnlRiX+k@kDV?l\ZmhyJi*h:eQ+@9Z>6*:DJea:4S^NN?+iIcP64:B?8*d%!?hP$N*
*iXd59 =1J%Swd4hwjG$NFM%PA+*?5m?j4MJnjI6ilp%PcDBK+X?=h/^9\:>ipVVD?\?9XuQyG%m@:51M&iZh5*
DjNpB4 Gc=e5tA&+QYNQ%Xu^8#=Bm9YGY*dbd:j*5W:MCKYbDak/4yZ*Zin\@e9=GIB+tWi$8%M?#kk/:hL?h*#
4TCJn5 #:IFV*d^4i!M!*kDa>^uQ8ejFC>lj:GMmBe>RI1$<MlkEyEn$>%H%Wii8K4c5GpE1:<WmENp5YJpPIAX
!hCR6I /^RJXmMW%BeAXwE^mTuyYRYqFZZNRD=8\GZn4uA@Q<yj\e<ZVnJH!%&dXm*R%$G5b8pbaANpZt%:deuN
ehCpn= <<hnk##5>=u8&L#SeB$&?yB?GT5:J*ijkImE=QT<<5d&?yK4TRiCZQb8YV=Ly\iyt9iFpj^?:eGDm518
/iA8I! K8ED8w4#RFDNjXBFX$lZq&Xu*a4XWCZCqbl=@X4GVVyVNl8H5pHEe4I?b!4j9JX#yBa6NppPX6+VK!5y
*Ju@6a ?qYwlFQ9h?>ZQkCi/8y1c?n1$TCEIn@au=S@?^/Vld>b/8uy:SWItF/GZKWLPFEhZb?bL?Lu@aM<lJ+T
5KTVjp H8=8kJRL:T#8BCEQ4ycX5LeP8E=w8qB*ulHT*+EwlZ\kK8hGPp8W<PnAiG6uW^P:\Ml\Z:\*!NdB%T@W
jwQ5NE b@<8+#&c4pFlaTElZqb4^5Duy1+=ePAASSXXNb:IEeyM&dN*!!c\aj9M>%q5N^n!GS5RXGp%u4wGH*8u
ddjG&V !CySaGu%<mY@DAa9Zd+KuJ@Sq8*G&KK!Hj6VNt@c!9b*DBG%F1NE5S1FGIFE^S&IQ*SapCB:?FC<CCRK
EG=8YQ EKL<KN?@@j!N>%kb4hlkc8i!d?9Ttdw/M=ebGi@e6H#?VASy5=GlcWlMNB&qElu4p$=AIweT5aE!*cKn
4WPaK9 /L*at%jQi=@TV!a>dmebDQa&IFGjMZyA5pWEQKCh%X++F#c5ZwaB8<=ZQq>dF@eK4#Hcc4JHqB$<nPPm
h?K!&N 8D<J$@F9P*B@ATt%pa8Nu#^?@PkS>>Fn?5uwy**uJBqN/!Kncc?jQ&q415XN:9C=ZMVLGKP?<LqVl%BA
pi^mY^ pLBjwAVK\BKQJm5WPaw@8X\J8Y+q<IA1R6XQGGWNtZaYGS1JDMpCM^\bIYGIByc\&MWmyDHj#Ma>KQb+
?DRF?t KubtX6ZDk+tdlWp!<GlMpJeZ=T*9lZWRt#*dDA%t/*+Cktd1#Di!Cpm<WhHYjQ@Y%dNHwkQeHjcdt=45
9?b>i: &LaNS@dMLc*6!ZS/>PE#q*QK/65d!#JQA$D:61/ak*8a?iJ#9#A!XTZN>!1\ZC!5^PK^pFDE1cI1yC69
RN8k@E *<^L&/aM51R\WME<</4w81Wd\y6mtVh9hABCyepZ5CGKnN/YqlS!<*PyLC1d#yHD@ZtmbT!CGtH%TF#F
Lc@%J4 R:SIXNQ/<IpMK@:+?b8iH1E<&W8Qb?uZL%>/96JjJL=?8^\RK9Bt9MR<IcVHZk\Z<H/Wp/TnZiD%Y@pW
uN:pnW <HP^?mLVR@>Ajt+X+jZMbF5\+ejL*Y::Hp<I1N^euS%6dS#hk+Ieh=8aYG9/lwYHlQw:G86y11mwcaHl
TqukDa W@/VH?tqnmadN?:a6>@edJ@bJ9&BZ%RG>iWBl!#e5hN$n>uPdWmQ\aI=5&dPyGjS5?p=59MZk6etjddW
5qapLk >6=6Wt!Vw6WRG%6:dNq\<@D$b9EJS^HCSX\JS++JE=YP+RZcB\ClpCB@Q*>@aaDAj&VALk9:dc8M#B\>
X%5ny% 4Hc5tK&uP&8b$c:hY%e6uKM@e:Hlqp*4VaPBH!bTPhau:Rp:!@#=/@ijcQJp<Kym+yuFRIl/u#CQJ#*C
I^DGH9 It@6A>F>>KI1<l<yRFRl?HdY4VAARHY?<Kh1/?nQYdkM6\cbYhyk/w@pK/:e/F5qn@je@@yBEp^AENlI
%MkE6W ?5tEJ$@bTeNZ4>pML<t4m=4=!dLbRk!jW5mFnMDQcGZpl!I6W1lC1EaTQJB:+EhMYb4IpDViewhjSI^w
NiJBS@ EpRNGJ$MHHFHKcAEAVcApRC?KBtT@y81wDHZ#Nan=MDJC>h#d>?6dpIN1wY@QC@nQF/5R+wadym@54E\
Y@5!?$ MXw^Z%@uE:?M4<+8nC>yc1?>p**yhEJpkIiV4hW?!u!aBXu6lSeSSMeuuL1WXXIDqPYt^ki=Yt=dNXi*
J+B\CA C@qb<JYS@JqiXZ&@w16TCE=P4P4BA:1cieBlNTk#P!>eXR*\$XL=!?Q/SdadPX%\neukkKXV8Xq+I/aA
-AE=+y 0002feb3e8d001202b3 Page 191 of binaries1.zip
jGhDAG >#?kB<h&W9GM1%i8WPuKX/<lb%upt5*T8^WRp+$q4ed%>c!qi@1MVj6>IAY4*^RJBEJlN!WnBJl/!KQ\
AHkBYX Vi^1aLnRX>JQhJ$N:T/PdSYWm/T#R?A%F1C$mnTtm@/JYatC&&kYSAAhw+>1^q8/:EaFm9CB><*P^5:J
jZ%\e# N>lnu<u&QY/ckYGl\eGiFm9?=1twctlyDqSVJNidkmuu1elyG6q5Mh!\a/@Fd6P>P>hPG5D8aNbpLb*G
*yJ%tJ 8PX4Rh+*AWG+@\QZJQd1Muy!tBZC#wX%G:jRY=Y&dh?^\>nabCib+dT!GY4uIPy<\nS/EKkR*tyKKEw<
y6HY&e ejIpucTEF/ReTVnIL5+PCBAE>kcM*L*j^ZnN=4*P*nat1?dN$J8>jI8b?ja%BuNu#nLa5G*#S6QA/Gk/
aMKDlh eplEnG?1cL5NHEt5w?5VwnjmYEeTQtaiVZ4anp6C&G^/d6?IGZ8@Cb9?5>$QY4Sq\?1qC?dwkeGbwnNn
w@PIy+ #wKqtI4adYHn/PEdElX@NCuq$uXMw6e$Q*:^@m8bZQqCTH4=+9q#?luuGj%<DKtFpCa*N8XH%l9kiQYD
16u*\\ i*mb>9ZL1YiPJ^!IDMdt*CHKiMM*>We!kqFlX@tKKZDF5Ca5$/YIT9RPhYnwNPSHdJRm<Y+T$mlH6B^H
$KpXL& X9kdwlEKA&d95jMImW>K!!C6YtCQ/l@eL!Wq1bkkh$e+jPWeeZtZ/ha%m&jyjkTE>Ga5NZcKTL=X*hbe
SmZnkm WZnna6Ll1CAjPFn55F:9=I1:<eL^N4jVcbuFD%ydH^SePlLmb4qn#Z!>Z+mR+XhGy8q/Qit!4BSYMJXW
6j5cJ< FXYyBl^XpW8C:6?91mnI#Mq!p^@aycp56?Va^ZMy=!>e8JmGjj&Z/T9enC\Rw68unwHkqJRYm\/=BihV
@Ge5c8 #yL:$e@D:!VL4*Q!!e4+1kh5G!jdW\l?DkQT*$WyFmVCEWWJcI1TElKWjub@:@$teTMp&6?jCyD\>@Q^
itKADR >1c<GE<JL$?\hlk4PRSi#Re*X*V=:tZtJ>&J<XEl\JVF\uRC+/Mnj6c&P<\>\/JC*X!h:G%5:F$DA8^&
>C6@&# dVP&>hEMDR5P<dZj11*BW^p\GGBTX?mHTXX1&n:#nY5Mh=n9&duVdN8KWjC#dDe>n#RXDy\E!4N<Fedw
iWm4IJ ?41$DqidL>RY/A\t?$bJ&YL#%1*dh^n9*GY/t%$5aGM@$eH=n\\/T>IlAqJT$8p#b>l:J8EqI$!SaZR\
hL+Va! E\JjRdMA15DAIHN4h%QD4Sb899ctc?dQ%J?:ey8=laul$9t#bl65&L+Fpa1KnI!ImQa>??Vb!>haAwak
5IK9AN Cd\h8$kiyit%&I6@H@e?bNwu+ILLY6\nY9m:5jDwaZaZ61idp:*%QmJN<L*lYV%FS&@YAwPX8BN!L@a%
ih*Znn BWee\J$:X+t%c&^@@4dnP#dFj&P9JH4>/mZ>akJP+yI1CLcMa65<Ge*EC%8d<iwA9P$t@RLc88nRkK><
*FMKyN :nk%ZF9FWcIAKdyjuNmMPeWVW?TI+RTblJ!CRp<@Xb#Sb%CW@mcmJI=MWaAWJTMkTMpVyGcb&*8FHVy>
9LGYba KjNYcTWaP*Ldh#G&W?BF<#c&6J$<=yA5>8#akQq#bEyZb<Et/<DEt?XN:jZq?hjQJ!ZElPGCeHeMb@%^
?tma1I I#kTqbJ&w=BMaq+@GiF8bd^8\a^PSG4bN$dt&/ZK1u9*AT4/QqXBXXIXHABLCWKbmu9*K8:iAtW/Nk8m
5#uhK? I+YBmy9PuaFQ@T#CRq&WTL8Whl&mI=Ye*LDn%*AnchaN$tB>c8/Ja>m@ePJp$8up=HN+&ZhtVn+8!CbN
GjL/qK <hk#S6ya!EL$*^t>VnIu*\5<$SSD>#AMVXPTiI>4X/jkJ:m&:@R*mi?QI1JDBWHTPJQq/?QnT@tIi\Na
d%Huu8 5l:8<Q@PRiqEyk19qF=ljwnIKmdZFF*5I!6&u/9yD68A!CljN>\4cP9wE?lm6u&4tZ9kqLCR+CA*</Yn
Qh\h+! XJRHcGyyDS:#X=>MaRbhh4c6<d1Xc:j6*4*D^HV#+tFKTwCYi6>P1+GDJ88CJ5&hShbk@<CXSnw5Xm9Y
eiANpj d6!$bh5Pp%&:>>DtW4k\%>dBejB@$uk5W$eJW5qu#%EyCumZPLcHJ8B%R+JRPwRJywIYii#\hh&#aeh?
dyqAVb D#?u*Y9u#=\=h>X&m@&tG=a9uD*daPPPdb6MA/KmIuDl9P?yJ<>j9mFJl=?h4ELlauue\5^>>1TujXJd
194$#m c$5#yl9INeTb:N=TWd5k*4&M/RcWy@WkV:Q%6D@^J&PplNtG:d9M>=P?yXm!YAjdjm4bP+NIj#9l/h*d
4#%EDW N>S4=nZ#luuL9B@%kZTCpq@?*4iY5cK5?BdG4tD!D5hGBQq<+$6QHa#VRMyKRyLQw+k+eZkWmJPE?lBX
D%bde@ L4DE=WnRCtD!+I84BL@4Qa<:ePIb@li??GRNGRmPcBqGXmlH!jVCQ^GYlm8w/8>%<MGERBb85$N%1wLw
Jk$\*< DNWyP6Dh^yLc#%nKYEB<8&u%wyp/H=Ap:hq4#d*mL^YC>qVj!d6&@6TS?Pn\pCA+!$LCI/QnDl+=eV4q
6R\jJ8 a91Nku8N:R%qYeq^Q6a:DSj4c^PTXu=nJDw866?:S>@uXAn8h+M<Ra#EZ4ycXb1Xtb6:cMKkdp$qLeW^
y&>n5e dtj\ql?<Lj%eCy$1ej=C/6Y5L=t<4II#j5py8FA?Dii4IHThFSNJRtn!jJ#EG/XF6<1^k?S>ddjQ!H$e
kMb1ny u@=I&CFGTNFQwImlJMl6!IJPZJXPjbh+Gk6lPBWmES\WGPBQ?VH?/QqAywSiE1:Bq%tE46=PB?D/EAI4
HLH9WT eiWmYBmCWLT=<+:hHtFSai/kVhbYh1:?998N6&!*<k&bGlaW:GP:id1/54K1%mC69>j!qSRAIXYCpK#Y
RSiyBk B8861=c6*4y4=#bnp\%#l!k1Km9nVkE^aIki\GmI@e*ZyuZEpcDQ:Hba@dtLq1@bRNbhtNHtM5Vhwdpd
bZa*a+ :P:=b+IlH4jYuV^%BuiJu!iZ@#Ky58iT#!BB<dFS\kktZD\5NATp/i<RL?MAL+9NJ6diAT=:%m&eM&9?
&H$mXh clN4Y#Pnqa9t#DHacL^>!&:@/Ek/ZCp$\8@+W:c<<^X5H6$n%>Z=R/SJ#<YjQty4yhy\/@u+b6#jRT/j
KVk!*! ?=>qJ^<QX$e:K\8SLM*X%@uIu\IBE*^Lc+&&:8#LPPCCuD><*8j9&GZ$HZeMj*n@:l*>q99&HjZ?H=cm
mTpX&a 4=m8/@4==iQ4=+>cGtw\VmPZSmYjPBIjFS4kBS^NXmeaKYHmnwE9kWmSkKPlC$h!^d1=$l!8nL!<kwKm
qT5dnW RAE+wqR?+j5@/nTAJD%=ICmTHQk<Ga/5RI=p:iTaQy^GKKny:eQ/c<1%*PL:6T*6:e*X><FpwnKF?Vlc
t+dE1L tJ9Vi?X\Tc9^X5Pqe&bwj?CZ<kjMYGd5HJteXXdj*q^bpuQ6\ypVS\+iwGIGH#maeIR<#?pbYdjK+Xj9
l+wuFW =%%ICHI\*dlpy5=QlGulh$d8%=*<&9J:IE#*:9Zib$CetAyByTLmXFGYq=XbhLN5ySc6!hETcKw4#w%K
d*l\PA BMZBy\AiA:!ZITZ=enakqbMjFE#8VplP\mZt+TEB?u+?JMe481WVie:I^p8\15n6DcTP@8Ry8aZ*a<h@
MZmN?G AmaAmpN@acVA/kq:i:1wZ<JP#p@lD+*uB&Pn5TkWn4jAB\WCXEEIF8*H<cF<JV!CL:FEZT?+!9Vkj$9@
aJMDTR R11KTw4!M1?#<$nHnl/Jh:Hcc&\FJ:kj/JLNjt5HV*>u$!%dVF*<R!iGBAi/tltMWFbT%Sw<cJB8:uIq
>Q#ktw BYYkTkYw+5tP*Yql6GLJ1p$:ht#i65%Rj^C6^FH?SW!jND8>NYn!K@+k9Pl^NpRaG#b6I*e!aJME&D6\
mDcew4 h^+V9Z^aqEm!Ah/5+!BD+IjJyhtZ\VljT46+Q9Z5GY!+m+?lw4CFkl5iJk^b=L$#&G@@66*&@5F8i>e9
j*pH&A tnN:kcGb4aQFq6WGe?e8Mhyy9G&*L?wS9DG?S>piP8L9mB=>F?uSM?/V>6+Y8uq<W$M6Nq$Y*e4J9Q:H
NAk@#4 tnhShauMKlM>t1WLV>bpCJeYLq8>EjMP&HIWEl%@LPueH@d8$>ij*YDFpcMPMnZLjj?B@nn/E*9%%#i&
y<uG=b V@*V&^hQ!J$wBN+4F<<tJS=CPZL@#yieNwwHINFK%Q@TI$uXmYh$ETR$h@L!QRweSc/mE58S=tVC$SSN
pIIK@h &V<++lBywwEpTwan*/5+qKh4/SIRe@^<S9+hhHm6>bXa$$JXCuC#&T$\qeGhYl6ZL6DZiR<M<at:P*c=
hB6k*y wKK=9dGmPQe/Zk5CV<#Sa<iVVy$=!%/=YFSi&>bcXbl?QMLN*Gn=dN$j!JD?h$dmR*y:?h$8pCRy=Aa<
h>+qu& u4BTCj:y:6&K$y#M*Q#W:p8DECGlywcG/1yD8BQ6MQ:JaEXPun^%PmpNGe1@dA%GJTL/RD\88MRLDGa=
tY+RD= &NunJW$?=L/bR+qu<AnL9!%c&pd1+$@aLZ?jQ9<uW1Iwt9:ETAIFk6+iaSj#m?+W@yS+hiSAZCRhISWb
K#Xa6# Ea/=ckFEEGKwVKBLZmFylJ/CG*uZtF//F@+AEV*auZ+b8&1RuplL6^&tL1FS+S+8#9bY?&&e9d*&:>m$
:JMY$C hd>ZeCkVNNudi8MWNYWX6eGDB@&%?*8K<t>/FKd6MVNe5tnyl1%dnLb5Z1M>WFFSCimSE@p/naEcI%/\
E=Pkh5 Y^aYLF*D4tJni<>6!jj9Qek*wD?@AFHSmTT<BBNVN?uyX/q4mqh^K@LF%HQ5!KE\SlICH9ki1hC@@W#D
*B#@F? A/^*tDpGlZ48&:B+:y!FG@daP%68Y:6p@4!qt$^M68*&mawIw$MHl@ph?9e=YWHIY4t8V6EXRc?jQ?W?
W?+PVK c5M:u<a*NyBN%*mq<B?h/L<#DSbt@SL$un>JB</BJcJMk=PHd*ApSEdJF/:$YdqZ:#9R4HZl=qPAl@4E
Vn&l^> jKI/@mHW@AB5MCS/@?4j>mc<J4\wu>!*h8b+Ru^WTICZ!*iREE%Xwn?aypN8i99%S*Lk?5bwNHLmpuJ!
^hc?@K <yRCB:+RHGYPTkiQ1#4<FPuZ$/JqpS#MN5D9w8ZE5JAEWbJRq1QR1#mMy&*qGuRkKT$VDF$#K6C>pwKe
Sk#wJ! //BAwh+Pi+%*WMa!P:b9*d^^neF59ZjA#uV6YY9NQiPTd=SW6:dXX^Vu*RSuqZI&th\Nq*aFL#aw9HMQ
QteL*I j1&&=McbYB@44T9t/u%HhLd<aKS/C\64!599$9e+h+Z*^P<CQQR>=4/kku9@Hu%Z>u=Jhtdl%Z?bK$TC
GmPyHT KE%qLaXJLulhQVqDRa9wSIunJ+/t=H#QyLN+?RtYaF5<9Q%^9=A>du?a5Yj*Hk6LG*5uX$@j\LCalJNu
>wdlI@ L=Ln1:Kc>D!R:XC+Rb$etn@:I!N+@6<^+nRqFFA>VDjV^RGC1J<T4@<@lL$FYJZh<9?>/W=SW5YYpN1A
Z=ZlTI wKJmw&KCmwyFq=TwhAtKCIya1Cm6kEl*TTMKmLTJHYDR5jh>*??56WE>=@#?%*5>D?jk\&aLe/@Q#HjY
nG4%Rb tnWVFZHyAlGK%lek^A#tawWmIwDL*@65TktLwN\Y/n5^RnHJMZmZWayGnBPk$EG4I=y\kSG1Wd6^QhLJ
P+p/1n &R4WZPkFQ\lF>nc&n1h>ZI@5*Z9E%T<+RC*R@<TS%dNFlTZp=GSphX4H:wpKCcPJ8EAV@<\6l$!*4X&>
^Z:hch j8hi+%%:nDi4VSeEmVeK5al951PGyPV<h*RyQJbl8@F?Xt>5XFkP6kFF=!9n@&iHAYXD+N#8VR/dS:N&
6@AjFe lLM!YhN>J&@Sp=h+LwcHlX$Awwm#<@#MR+KPH:E<ejcey<*8>c6Y4nP&QuHT>8A8A@%XB95PH#yw:lX!
L?@+%? nk!tktS<L/GJCjlK:kkKSWP5$WERmq/#hZiRiPCA$9MYXN?F1wu!5%GMntGy8uN+QntwPt9#I\hN$P:h
-A4eel 0005cb17451001202b3 Page 192 of binaries1.zip
aPc#6: Ct*Nd!k>R9PPWMMQC#8u!jRw=1?5i@i=>^i/pkn\AqN>jYT9Wt<jmpW@YV8!I/NDA&kD@GXHC^wNZqKR
iS>j5S ub/clASLYEmkn:94IJ%Na^//G$Zm>AnJ8kqW/e1e^m58J1/a*luP^n:P^p6n=\XpRNtSAlVR^Ta+^hc$
knMQ6M iak6RXWb^NRpY+RA!eePu#Au!bIVw#8+B$ZGQMk44*9Y&h*X$wBtJccktHVT@mm=n#Ll&:h*n@HPdRc4
NhZ81J hLY?$m9y/p5*t4wGZ$<84GuyA4R1m9P!$l?pywDuR<QL<*B#\edY#te%?aqZAq&Pdq86w+uJ&nBIej%<
kyZX?l &FSdZVMCcFG%XB&6u9ta1li14cty4<4L!m>KHCY1=/AG$cVWDGplJTie$mKXn:b\4%!=FltZ%=>D=XL=
<KBSII wubI!6naP!EZh^V%whVa8<jp+PFn1HjJTW@@pE5*ayLR@HI<hHu1j8Kp4l8eRk1J8p<WJ$J1knuPQnaK
/k\nQ< ibLRm<kdq&B6laiHIa>NuCNDPLG/I<=\B9yHbJa\C>tLe:Nd1I<EAV!NRFRn1AqmpQlJjTC?W\4qn$4?
TMIhAN uM%C9tV6e8nImcALIb+uZS%64i%eQN^6>8@ic?$SGBTkG8By9$6qtwnahDp=YXu>*8F!GTFlMRpJ^JQA
ip9FGZ #I$t?:i8Z4uG$HnZD1Qht=bICAwJI=#+eZCTtC+yKcjG+pujaPe?W:QJlnIwR#wNwm=RPknVNJphIbwi
&RaJB= wIbi1GCE!BhFA$aA1FTe@N?+i9p!GcEMRAFQ!PIiNlHBntc&y<>j<LI%Y1?@i5Ni8%Mi^\<ddX&nd&B!
C>*\SD >MllY@@#bQDMwDNujC@$+L&GTYtH#yS?>8H+>JKn1/&qlZlP6mk<R&NT1qkS/n+Yh%j?uCw=&h9kebW:
Q^FhCZ DNc9SG64mcc&:1y%t:adkaP\eZL#SKhKN%lVIQG=:F5IWd<lESwjHS#+@i5Z&Q\u<Y5BT/tQR6^CE<Fj
DeH9Sm h4Zmak4<>!ZeSRE1&N@4yQMkuW6XF6$BS548j!KW8FyFc^LjGB5:wEV!n\9RBNpElWBQk:bnp%dDEC&b
A^Rq\b @l<R+W>^1BLkJ@na?FGMEqX#>A1=GyhiYNu\HEJWW?&n\y!$SAlSu5+YB*d6Jw%+h?@c8eQRaM$!:T<A
&YAI8R $nS$L85VF9&\6L+X8MQ<==E=$4u=BaZF1BN8@hPY>5:u6WWyN</h6nJil&+4ApeG\NHH>P:K1l1!qqbD
Z>bpti %FI%XC&6nwCQmZycHXpnWF8iq%NeqEXSA*ya+yFTHJLVhE/Vkd!wE9w<SK1L=CYP!&F*eIRTL<k:6uPZ
tCy=Vy EiB#=ND?9c#Gh>StDh#:?cmqubPd%=t\1*eTWT9q^$&6HZ@Pb@GVS+YbiMeB!d9*FN=9aE^MpJkt=nB:
NP?VCS W<Sh^mZim^mt$ND#bCkuWpHBXDA*MBX+LdeM+bTZ*pK>J&mA$#DBVnKbI<S*aw#1ARGm<P>J$@X4RbdP
FWHlXQ ?/&<Rm+Euub#5ae5=wTu/!Fn+$M89pEBAc1?dpj%b+pIV=PdKT8*+MLATN>TaYHSchMBJ#HllabGi#c9
C6ucab ZL=!</+hln6&dFTiBnmN+W!Jh/w9@e\iFp=dnA+ebS$tHee=Ey:4K^&CaELNVNF+=95yD^=tb8Hc1<Im
YanlC* wqm/CLWP#$I#tyLm:6//j9Z1qenLEbeRV$VIYniZG&ih4a=:ZA#*5h8#ci*1DTaP:6=PS@b5Y:6t<*/#
KF!a=% a$ee#+REB$QAD9APaX&EkBRF%N:I$AB4&lAEy&:&>8jQGC%K#=1d<KmW5mIIVR<kNN&P8watjKM/IVVe
SK+1PG \RyC$::hY@HP*Si/5yc8*q4IqMA:YEPt=H5tFPSiVGJ1Sq=JbX%V??6*u$D9wX&FEZRXkQlN@cd\WD&&
e/G#Zb wYF!hBd1YQEFnd>DA?1S&u8IJ69ekC#ynK?:t?MkuZPJFB4uniMTmYHCeapj+yK$dYXL$\J&NMCdA!FC
GKD%6^ kywnBXlAmjTJ$YTn$h/hwnk@yEceGCKtAA$kkpSJkPIuy&BTejc=EJYaXaL$Z6j#l11T*I#:h/>iaBYJ
tQT@A> d!P*<&+#NN!<cb&in6aZikXhbhuYa&=BX^K!!^9c8mGc%qXXQmw4SdNiK19SEPCY65:P%5iq/ZjC9B$P
bi^5W/ dq/8>S8lbDlE5j>Pc!Y4tDWe%VZX%TTkSNc\%ha^//p/jwlL6XZ=YZpq/c>Jm16kpVRc^C5%R$Jt1=i*
RP\*pT q\@clRw?i^d^FBy&@qd?aA+BLCX8$%?#dwQB%l&Gt#im4mK4X119SN&eh^mbHDK*hV46j@=KNLBWYw*R
&Z4yPj ^65N4GVyF!555Wl/m+IT\YTTDK+JZDhGDHP&SMbESlKZPTI8ZR\u\/kLbBnuljMAE??=5?jPuR&/qqMK
CHyFc\ KBWXQPmmBwq?B8k<J5EkpFlpVlApa+V^Aj:4IDFAWiYLm9/iN%&\eV>+&QqM&Hp9N%euY!5d^=Pu4Qj6
:%6BKV *tQqHuDG#%@X$*/*&nSlMetbe4J!Kk*>\?NbM!GBtm+8Imw544qn&$+D9cY//\$N6^l8Y/<<VWARpPIY
TKLPNB a?&Kp#MwKbw<St4bP5N>l%G4iNc6ZVT1%D@wZKlWGA8wGDSHM\YCW#acSXwMV+\wq!p4LTuCI#AiQ5AD
LKP@?? qY:e8AbRIcbCmjN4V:uiCuG&hjG:jNHHj1@B&nWGB^\>9b&P:6&?d5$YW#P#a<eDR+LRQw!@#^teRIHi
Qd:wp& t+yQ?Bwb^KhP64cYmYbFhMu&eT&1G54B8=!5YR:uWPE+G8bkbZH$$Q+>P#c9B?Z#td+RdV%5&Ly4*<Fn
y9wX58 XudPy:\C#+XjmdwVn<V:w=wu4b&9$NnWZ+NAD>9\EDFI/$hD>6kGl+nl&WQ>Q@1?jun:w4*=TW*qJL:^
I5puZC KDbhPB9kjh4XaanPyTcDSk8S\mQA$<VpqkP1F8ibhdY55j8/MNAE/SMj*!k@t\AGCcXP5#BJT9>DEqD$
kjl?$> D$pm!t/wTXJ8iZ%LX*hHW&%=RYbKjBSEJTeLp&$GB5StdwNN/>i8$6WiwA>4EB19/IMca@SbT>j96@eM
Da\l5! 8ZE9>>Hn==&hdcmneF%6VY*h+<eNcDw\&THR&qCYp^Ab/G1&W*@yL/#\lmm8X\<:KmwBJLKcBl<VNdVc
^K?Ii: mV1&Y9mW8#R*y/kwd+KpyP1ZIJVkZ>F=S$/lypBwH!wk<E\\ibanJPlc@lCkNC&9+I!Pq9bThHNcd=t8
%I&%P\ #qJ6dT$6XZSQbk$/LV>pai@te!+!Pmp>9:!8iSIqhHYR6hWELlTV>I1mIaHGyBke1GmIPeLbe#Z8/lW!
@YCpKV pk9=/I5ZJ<I=IVTFumjPe=+L9yaN+amn1DAF9t&WGGFMnA<#cMDRIEA$!9nFGCCG<Z<dJaalMyXN:a#j
Y%ibdk 9HHN*@dEjk8QpLBk%PnE!54G?dTL/i:hB^%>#5AmXHW:5ucP1Mk$&Xq!M^W9jj+>NFa=D#IumYqmakLT
JV@Rh1 /\\N6lw5%>SiddB=$?dN/%RpBATF^9FEWHcMEaipqQSm#JHi^y$H#T^ai*i8d1ha=*5ZL8ye9w4/n<bQ
ytmYnB T4!eQDV^yl#h!c!14pcN9>FMpV\<R^l!tX5*w\AqIAu!XVJ$4b>VhKm#\<uAK=j<HQb6&dB8!!FuV!?u
+Wat6^ a!a:N1\#QGJld8dkH*IGpiV4E\CL8^ey9eualH6:wNnW#9c<cc^S+WqDDV=Y#$yQ9ei1D$jNBu$>eM=4
KWjQ&K mRKV$dbNc!A\cZ!up^1LJ>Pt9RiQkMIA\Z:&\8Z46&ITW6LSHhhu:T@i9Q<MD*J\GB&TD=GDuINDR\MD
q/SyK6 #ME=R+Q>Q*8@AEua\@@lN94Gqa9uk@#RhiAlP1jThHRVh=IpJQHIcaKwBa@MwcTml5/pci\M$Hq5*E!?
WytYD^ CZ/cACXAC6GEWc/$CMPpM9$9VA\Bh4TZB#A^?FG1NFNa+XVR=bm$\5wudTkpXScnWd>ZR!EpHVa!YMhe
Q6bW5P #:%84d:i51Yc+@TjGmQ\t*:TwPnmYm6*tdu+lh>P!Z>WD^q?S>9#b&RVh*QLe%SkRLRJQt8w!E&/j9c$
Fhe&H* >d=N8y1aI/%lmt8<5Lt1ww15bqaS%SVk\%bV!/kV1K&y111yKMnPK$y4J!nP@p%AETE>R&!YMd/DjSIj
uH9a1p L94+BRRGuQG@ZDCe\<^q#!8\?c%FcmtC6EbVP+=cP*8jnd^#Q^PJ%A+<a@j>y<@aT+KYG=>A%HRDNRR/
%bX?1P kIZqQpcMVl<58BIN!?d16Y55caPt&$XeI5JyEIi+kb?R/%tqmJ#mbPadcw^kML/NR@CbGGCRE@CH<eH^
9bQ@ed :@BjJlnn^Cl\<*j*:u1pw>hlW\j@C^h<Vy%\54Y\5n6^!t4QVmPLW@=ujQ$<Xi&NNcaLme&aPXN8=yLm
FMHRtZ :#<H^*4%SaSEIWMTE=!l6*u>SkNhDj1!Db9Y4>?$h5q$+Ac%nGRVu$bKRQTSbJPYjR9aLF&>^jmwlSYm
1=M/QT ^8ZE!hMi*9/B\TFlq!Iq4>?MnpFTLk&pHETiEnRD6LwGhR8RAViH=lPkmVCbD%QAWh?J9u$#C5&N8EmG
5cnTlb KX\IQS=\<+K4p&jI>e9?DmcGt#aaHuH^>uI!M>t^ej$PM!5L<?N?b<?\nkGp*4JK4Wha+ijun??V+ciN
PPlIb! :Xpn18/uuqJQF6ZX+kc=PSq+G?at19$?!>J$/BDymKuJHnRyhyuYlMaAucGlSNiCJMpAV^m#eeV:iPGS
!q=@@@ N%Aekm!y>8u#DwAHFTtl=#uMHB\juIetGjZ%j9u+>tXHc>Qn1nI$6R*hKd6#<%yE&DuWEhVJdynPyVFH
+CD/HI SIRXkanJ<kaYP!kK<e1iT5m9c*?!BLQD#wY9T/AVIu+IMT!AcFK*/d@yHB4#BjpIjlKHIB=BTI=Rn5RW
!I=R@q aGKAbkp9Ql%!LTGnyKc=E$Ym54!HTVE*LkX:RTR!ZLN1NcHQ6Z4qmtW/Yk^/4$a@@Ly9NWS$N8?*QlX+
V:/+?# /W=Kdqp6/m+:*CdT?l#m/KP<=KkL*5iQdF?ySY4k^GnbMMZ:M/PqE98?eYCH1tK44ytwFRBw118K5uML
PW\ChJ mlN/tSSHqI1$FCp6JTp^d=?h4j%^jQj/FC+c<@d^DpuQHe%lADbb^*=4MdWYAnYG^1aYVq=u4<Tp=JVY
WQ$DdE NE*NCWZXC!n@\bGG:Jm1YYDAw!bHPjyVw&+#d@Ald\9MSEKKHWqF5IN&I%DE8bqV\kC%qnV^qlwHneae
ZSu9n% @#GKPpqPVQTQW^P$Mia+e*SwFIYcCj\XiFNmkqIwK<*@e^e\%Pdp\cN8b!?GiLm=PFldYB>*e#/+c+iJ
&yd*lL uSj1!8Ctb4=^Qtk$thp#b<:i$9INqd^eZmAwnKTdwQT1nY9YdNSXW>Xc9Y:Nt9X4XCWF?AX^&!6P*JcF
9#5W6e uMEJMWhcD6Gn8&::AZNL!IZ\u4iuN/SC=<Mm46=aiy9FDww*BaYq4GL+^/\dtLl+yKc!ww^%u!E=pXZS
al!6h6 EHZ6!8XLwF#ZudiN8Bq&?wSQ&M%Ij+j>&#b6*H:M#ejV$j#ALwPN8<!64T\BH$mH@Q%<jd#jjMEViFDG
A=kS%F Q+S9K?Q&66*6LS^NV^wcmChW\&KAB>>M\liVd8Q?j4kSC!wM\45Li+*\pHLNn^4Ktnw4RD#5SkLP*8Yp
cllpc+ F$ThmG5*$TE5G99h%N4=<m$ml%W6PWD&M@wZ@Q:%<&jj>&?+:T&?kaV4!%MkqN=GITeaN^K$Hcb#15+W
@&Y**H taw=@<$P@#TqkL9b%i&hJ!ZaJ>na8HlI*nE?Gn<yTAuSSH<CN?q$y8akaphhut?THWmEBDuRHkM=!e/+
&8i@iY $M\F:tE*:?YAG898dt&wLMyMn4$bih:@yP&lZS9%qm<uXuA8Z+c/#hC@cV#TENjT**uEAXeV+YHH#T&6
ZLBG<n LiS#wpZ$GT:!Le=Nnd:w:&yl9F=uRkPj8l1PWL^pY$a#GlNSNXFJX6G1mT11lqp4kK?kQ<4Q#m$1Ky?k
-AD<*% 00080432ac7001202b3 Page 193 of binaries1.zip
PFm$Ac bquQBN$tLVqh<aAFc>Qy8LML<1#w>yq*bQ=+#uk8i*:M%6>cDK*=cHN19:tVX<m%8LS<JCPuJpDlQTPp
%n*dMt $TDa6GKJ^5qEXh*pGNhk:5&:N/PIt#^SN//niHPF9I1$GpRh<lJuSHlEe5pEpHN9>B$%RWCRkblCDNNA
T9lq9C KDBAh:PQnAF:\?QWKDuGHGWP$+abR^QD\NI+?6QkIHMaZk&lCbkDtqk:C/mL=qW9Y@5DX6/lF\QhWS^C
TcRqP@ DWQ5nLd9QPL1F?n4/*qe&YTyqLC+=M^bM&e689H?/+@?$jHl\?JCa6MqSISu46t+Tp>jS$XJhjpc?ESj
QRMmIS R+aWwAtSiG?BdbwEPb&W=JTTqyGFZElcW*9FJ1Pnj*D!<pF=$EZRd>GT5at5pdV=leXwwH#6a>#V5Qpb
AG6wY> &dLtYZQn$+d/t8wK*HAI=E=mRq\5LlFC<<*D\!<e9^\h:uE1IQL&%RDk!YDVL58Vjy=P=kh*dh/<%\J!
qaluk% Pw?#bPA5lJQQ/bhwNCQTeDkc>cHPmDkcQcM%Vn!t/lanq5wKWdIQ$RGN5RYYA4\>V?F^Y<ePHhlu6HQL
bkXqGm BwlEhARVTDk<1l\*YHH*QSMTHuH>N4=E<ckG$jRCuj^??j/>D?%:@/D%M4:QS^XCH>?@jj&m+*pniQBm
8=kS%? X8XERk^Ew56we4IZ/w\:VGhVuEcKEMKnp+EI%hklqAk^kSqG=&>qXLS&QXuQ!e=p+$D6HWnieV+&Qu=C
Y<WIli pCd<C/XEPZSKe%TLyntCw>FejmCK+CMFTEEt/DpCWBwVpyuyHuEu6cC/5cP:5:t&NDe6@9dX5CBQb\lC
VTPhTQ ?tP/uE8%NitRCR&wn/8@%@myQ1ElSq??ea?bp^jpG<tb?TYQ1t91!Mi$i1JY6J1%5=q<J!LwFPwiwDtt
I1NK&y ke6X:Waw4wu!y^Zqn$a1kcNKYnYnl14t4/!w1wA+qFia%kww=YnLIyStKP\=jPnIMVMLK!5enX^PuHA:
m8NKYG /ibdMJE#lqDck%Cc1/&*j48JtbN*cFSmbqF%I^wp$VN%SnR<ktZdM\\TG#wj+l#:HS>#q*GdC?u>/>jJ
I5iT%* c##ZYh46Mm&C9M^^<e4DS$BSbiH+P+1BKqnHTW\SCT1dCbKde&lpbHl+eJR&VI/\k+wkl5mB$REp^Iul
8Lee&/ AZkqe*AW*CMBj!I^V$AmyXD/b%9l^tXun$PtntjCRu%A\qmbYh1=PB:c5e*a/nVKJE=c/Sk8FleSq=+L
$<b%nJ QC*PjQiq4*>pjDlqmVCEJ#Fl&bZ4X?k8%%&mwKmyy:h<=W16YYmHFa?bkilEVKhJpqIe$nI!tKiq?wd:
Hpncj% #c%6EW:wEMpjuXSHZ4>%N*:G9cpB#=QVTS8dY%yc&>1Ih9P&%ldWQdq8Mq$BZ=/WGA<<wTt#Ebe8Zk!%
&B+yY$ n:+V=8X>>5dhK+DVn5$GSncu@L!hLW^*dVHed&%4dieXElARmHAKnPuBh%SShEIF&6@SXReeubywDTRI
aXHJmJ TRwi?aLKelc%CbAWSWJTFI\GSb/AyMnK:MlBp#&:DA*Y4NTlE?1>GwR/TL6qK>jlLlBt%9dPy!A9Ck&Q
\IC:tw nL1dpJ!SX%^b>/V=iWj*K+lSu%GyK9GX>yZ+VH&mQ5:><K:u#W9EFL1CXJCV!T1n8HWh:YWEw5G9Dnan
ZjC9GB /CTJ\FDlciAA%XTEIpBPH\/?pjcwyj6ykBRdP<HG#5/N=lmk&kZ++PdnF^AWFBBEhM*My>M$TT*Byd4L
li8cE9 X1^e6a4X\GIW^!=bFL8RItV?T>4P\K6^/TX%LX*hdR*wmpZ$6akRQ#iIYS8Yp$5JHT=W%$?un&4<Wl<G
8?S?>L E*^WJ#WW6Feb:4h$<V=*?ZamGmlXWqJYZqbcZF^TZF!IN$/mL=@%QH=$%>1q/mMc?H4T6SGK<>jDy4J!
D:b&Tb 5wJ/^KmkK4t4$LAn9J$HGqAABGFqMjnY$u8@TAdFMiC=RJ1Wpy\^b>8?jTaHDl=mDbYGRIc/w=:P^>nq
Kl:<eb *h:\Y&6CT%=*4iE?e&jj<PnpuLL/==$9Jt@T@MbHHkAh&aSLGmB+EiMm*/JVaTFF*+GQY#h9SpW^d*Bh
m!J!wV S@L9CuGFI?L1k*JGIWhBdeuEl$utIEwN5$NmT\+R9<h?Mu?VRBlKhAeHGeQWKH\Me5Du?M8$u&M@CZkB
=jXBl% PVmIaYT!91GjSKY8w!SGpAIE@&^JZL>k:Z4k/KtR<LPid5=&FtcY>1=&^wddDl#*C9D^>uR&Zd%KVql5
4<Lwb= ^t#=&dQtHYn5?h#dQ#\?@MqJTqBMRpJpl9d1=h4c!%RYLqVSYRdQYY8PAC?j\CTB4BuJcCNWlnaHGNVT
*NEEuj Zd@:mCWi!R$I?kYmp8M4N&:HJN/ZiJDPG4FimX6qwA6k8Gel:RZbdhcJJ^YndnYV6R9J>^CF6/Ik1EF&
t&jW5t ihdyZ5\FH:<LN&P8?696*:qq<^+:h*>IEk:6*44>5C&Ihw?#kblB:/D+h>>a\*RtR^14GT&E6Kj5>VW%
ZdhQTM bK%TVZX%XXXqYZEllQ8W^FlWZHRSKEVF4m:H$haEuwT\hd*?<1Z$ejXBnZF%BR&/n6/cnX9SeDB#Y$hZ
:XAEqb D?>AhLuuXt#mk/!C5w4cl1cY>t=aCn*9*yMj&D>??MD^+j*:h&VQ@Lj+8m$c=6yRk@wKkHjBS&\*4$NK
h?Vw5L F^!AJy=kE6Xp@=JIt!TS6h5uLKFpF*k%8jSb>>QM4j#5\CIND??b+AX=^5@GkqC?EA>!SD6lY:d6*GY$
J4E#/B i/jl^6Yw6eW+GwPkJ5uAGNJ\yRZJV\m\R^w&miPie%FJ&a?i6LQmZp45nanRRA>I94c8%mG%TNdNkDGN
5uDKDT IjX^Nb4cABlnTH%EnXKu1a&ym>F%%8$\6V:ljjdTDbDMD#M!5<t5cbqbtSpbiJQ&=8X#*5:ti\&Y$bu1
?4kM4d a^4+N986WWkCP:N1<CTpS+<tKtmXbAZHI$nG!Cwl9Dj%1KI5L!i*wKBpnGJ@c!^LTM%R*I^?w#%:>^$\
BnRiCy Qa^CIqKahm/FLClD%SGW5*Z$DW$5VkSenp$41ISI?Q46u*^*FPhmV!jLnCdIea=j5cpJE*hF:6^GF*?m
L1KLMp EJWRD/>hyX$q4*FEVnJbZ#n?EbkpMbQWMM@k$MDA:><@j=J>R>@JQ9Iu=?>j@j%A*<kkDhmn?nq@5d=K
ywDMaE jS@DZ!jlc&Q+c@Dbu??mjqH>%CAFISJ!QAcDWKSK$ip?1^8Rn+QqAY9jC?EBy$<+&bmbYVp/Hh&=hijS
iRkDC/ E#/?*6/udZa9XJMRFyPiJ#>:>9!\F#&jiu?n:n@NBlAmJeSqNZTZccy41m!a8$mD%BdZ$XwkAmt&/D>$
eM?@hy p6KWDL8e:BLAW%69m+tFDYl$hC#5j!aaZRmImw=NVE/dukuyeCqE^*1Rt5>a5<hi9Z=N9KFi!:=E%&td
Dd@wmy IE4YRtyXpINPm8?lMpCW\=ES/$Kh:5iH?y/J8BN#^e@8\P/6Y@e=iAS+PqpiN61&!<#iAhMbEIDwDI==
YV:Ymk *+6:\$=G!K?5n4ZwIml*dZW%GtBAXm%G1YIitPb?@N&d%!BEukM+V/Q!JY9#w@lI$uDV8yW/t8y1u>RX
tNHihE %hVyT=i9S4Z%J1l^4hNJV><#=!=e9uE4:9=DXNJV&@D$GV1pjQu!FjGcipq:PjFmHlyb@:!y5cG&84!+
qVLaXJ ACJI/u%eS+J1G5?h<YihR\PXm1KpCJ8\ECp<B4wVqX^R@+SIajFX^@$8*!6y/t+5mqBmb!jbcP\pF\ql
AL+ywQ pyPZB:Z9+?XAb<GAy<TTEn\IT$h99cGS!iFncIKuqeWSE>REW$6#AlDqXJeS+ENuamBLYa!m8k$KM#w8
&Al/E= JCh5FB1hWqDV#A1b/at*I5PCjh^5D?>c9%!dVtyTYyRtSS<HQ#YkNkat?c4GXBjSZL=^>&GdE%=u<D=1
46h!5Y jCKb^JaaV!cKJ1ANyT9lRX/8%ki&/&841#EAV6!KLHYW+tE$%JiXqye@tmkuH>E1mEep=H%pJS1q^AQ^
d!Wl>p M4ewybEaw?STNYYqJKX%Nt#a9HZd>l&:WF@@R:lnmbY%>WNt#uA8&$ZM=W!Ra!dYy+K9J&cY%n*9i9pG
=h::!% H::$5:ApmAbKpBWyJ<dHZpaqJ#Jm8hANw68*mX9e6&?!hPwN#86Z4/hmKB6!^#=lKCpMyeAkb4K9:@9*
MCI?C> d>@I4&Pj!c@pN?w:X%<9K1alj+M<@W*>=Q*%+<jWT!a?p%@RT!lMKAP#TRG#=Dj!!>kuXQ?E9md++^jA
1%Lh?K QalcLIPPI<B>KBVuV:Y4mD^=C8uam^i<RWJbHnP*eZLac:nF&N4h#>9L$?Zw?8X#SeRp=PdK#=bZVi^<
j\:=i1 ??p:^9VH4WXwp*KBt41&^yIq1k6t#%Gp$#W$6SRpiQq+Sj?VWp1PVXdqHX%GW&jh#mPY6klVn/qNqy6*
1XjBjd +8?qythLwC6yXc!=^K%w:?p%/tHQ@GCBG@h%6de<R\Q6K6ESdWdcA?B$enDb=Rk@#?T+$ICR/*G^X@#5
\^R$wG D?:icunR$SNn8tiH5bZVeZ9:$&eD@Q$Ryth9j&A%Y$E^FQiEa+%QiQc$u1Mc5u?mp1yaYDcbjmdE*Ly?
*ZGkq+ ?TLc*J@cwV\KmcH^#t&wR+Y&BpQ6l#yDVWXDT*jq8p*dh8/FEGy#*PY$q%>RTQnq1D9^1F!$DA*=dZ#Y
WcP8bE &64i&hHX$huS$eui*6bP6qG6<*Du&+c/c9\Lycit+QJnhN*4+up$al$Qjl+FLd8IBA%L\:Cm?mkCwmn4
Hw5tG6 ^I\RE=??$hd:WtJ^a*hnahISMZb&NnaPAk<taiQtwZm+$M+?u?l9IFYqnE=y!Yk9$>>mjMnC*6pN>Vj%
mHnQBk >nnqdH6$n<EKhBtBCdV!Kw9#<?F!D^SVtZ>+bRkkYtYFh%%Ce<9dIKLYqPap*:pchk:%9DW^ZK&nPWcj
>HqQGW $JlRH%WdX/YyDwNhS6SGXajWyt6w4VR\Qt#6:PEZHBy??e4%G%FS%/>HpViEIPEPQ^jw:YwD<qlHjWKN
XuLyRP WB@Z\G%91$ay46<y>cWqyTPAKqXPXVAlqFLqdI>K!F!P@QKWkXFKjm^XX$bTm4=/qj:/nb8A%b$IXhSh
t4E%18 CHJL:?#euJ!lZLb4tFT=yj4dD6y=l6=P#16AAbVXPu?A6TND%mNReSuHiN%heJXpHBZQE^h:>\/Cqd#D
&XSjqe hj5YlNKd6J6pFMiN8=tq#EK1kL&1pQGJap:TKnI<PIlGi1P=KX<?j@:+pZnQ/CHjp^?y#:^j9u*>>9Z:
Nj?\I1 >#/ApwGBbQ9iC=S?baiZpi<u+GZWS::Qu:=<?jaN9Ywel%qA>R9%tYK>##9!k!n4/**w&mBmh^RpMAp8
PmuSnH StE!Ba&?iiPC6iNB$L<Z#*1eeLa%R*XlXn5*d>*9/PZu:Zucjy@PPmql$Su#=<!iQhi5999N^&<5hN>h
yCBB/F X^RSt//kwKm141!k6HCY*L\qc1y1/5w!jL!<ku@X4#RpwHJ!M?YWAX&6FRatcDVpmXNAd6C=$QAIjFQw
jKd9wH RYb8wTti?jpWZhjySQp/8w*>=i6ZNE\GnYJCnRJdY!a9*ihtIStFL&QlSQ*$=bVa5PC\/MVaTF?:k:8*
p@/G5# :Vnm/l9kAjAc:#K^eZb$hQa=R@4QAuc>A8M?+?/bPMT!Gqcky4p6VR&%TG<^H!qA>wS&LhH?KLwJejdM
^8yw1Q =AWX6KY#j=@S48%dN/%hyc8q41w/4naM!%XFZXNulj:/#V6&:#8I^/Bkim>h8Zp*KSXhRm19\wIi6cXG
pbPd&6 l%nN6Gc!cXH#W:V^Y%>jm>A6AHbV:mZF^>=FG:?Sq<LPw&4?W=Q\15tRImTkP++8?A6#mQ\J5mLV=8?&
?uy5qH <RmLL&#5jq1aGLyhGKI5B<uJ=AJ\CY+T>^&pCRK=$=R4/QJw&PT1VYnE!Wu9M!Flq!I8S%/?iQ/My:Pq
kEpIJ^ meFKJIeJSP<mRWlj@>LLDy?n#TAY9VLC?/<u=XR$h1JRY=AYH*WyJNDL%id\:k*L6SC<BEA+wDw&cbeS
-AuQ!Z 00021715f66001202b3 Page 194 of binaries1.zip
+Cu%VX Xb4KmCyDdaEGPqW/dPpI+mM\?F#wiXRyGHwBXiAGBZl:8KABSm5%%WlXNnXXRw$EmCpEee$a/NJZtiZF
4GQ+>> JcNqbDqb^5acip%YEPW<Sht=8jpF8a\ScqcQ%T^J1RYcP59$X81nwXBdDZj5SleJkYVH4N!e\X!&cA!^
D$hN<d :NK%P\<j>+&ISbN68%:%jQmM^q>MMq\*GY\B+yL+%H5JSCIuG9RTM*GZC:JVIJm/^ZZ:=1&WS\XMmLYq
X%:\+/ YT&IZkwE5AS1CDAJL>14i>@#=8*4%&P9!NjCd>@$9J<c/ReIn\Pa\kD#F<m++GYw8>84$XjWG/1H=@*H
<wNcqh D=nReRm&kq?SB*nj$@MGp1NZ+!>JiApZdpkK$XtkF+Zj!iAL?y6RaGY\TG4/Pbu66@ENC@e@=iywhi!a
^cPXSe lc*Dkc$G&+?/?Zy:iy!\MFVRFSihJnh9n4#<dJ@t46ej<MCC@4+96Z9FleVqF<=dyK!$eMGC&VJ!C=aw
pK&4@# K/ww!\9!<9KLV<:&I/X=bBHA5&a1AeHc?n8QwBbCJ#HA?KyjDL=dWXRtnkJXE==wl<cSj$K>FBk@LQ9\
BA$5?\ iM5*1A<u8ytM:nRC9&u+DqkW49>!8@H\dunI=hnp8M5?61bG&*cdu@AL<HC$Qt!<&>VB^hHS@S\IbBS/
C$J+aQ @h%LiuEbFwVi*/kn&khYQ%+I9hX1n<wjkVy:XI/1ajL\pX*$nc8ZLwSkkF&QV+diQd6&dDXa4:>mKX&N
BdDMuG wh14S1nPX>QRS96Il49RyF%LP!jZ$%:?\ie9Zd5Xh?>BSqai=PSwB:PB?$pDIN6R#%=jY<85tae!59KT
q?KHZ^ wwIe%GW:KTH8d9S69MpeHwy8Yu9mt>bA4#LIbE1IEGcI+M8aFAlqE9iHAwTba6MWnT#eL<RC\W<K+5P5
ad/XEM =uK\5:F#EJ\EF=Md>dhG>YACCGCqK9w<Vc&qK>b9N#qt/?b#:6J%!E4RLj^:<hHZ\9#h4Qb8Zc?*XE8V
NVMMy* SHN5=\u^I+bJ9I*LLTRkkQaECWGtAM=y^X!mW\64uuh*NhiWbN&Lnk\>+**T\S\H+HE/A^ltkF*aXFSH
kECm#n XRkXNqYXCdASR@Y*!4k11VbQR$h@m=Gy8d*VChV@!^e>E9R@9n/kNB!6n?\^BM%M1nA^^lMcNIV^6#GK
FFi&d9 q%H=1KT+yLT5nFFKquGXq/Fl9=DiQmLKiIy!e9PK::WV\=Ve4>Q#yca9XFYnc?55%%8>b8&GVX5M6&@j
jmcjyT cYSpjQBB*pA8Y##tYEbu9hE^%!D\R+?iw4Qd#>>\KMc:T#WWlc1MGXR/&<N:nCTlSGA+LmaYZd+H:W^G
YENHTX p>HWddcWMl!C!>NijeaRw^A5Ma#$MpCMGGb%Ai91/CDccc*Mh1yD8P5F1wl?<:du@eiQkDQn1#mKTjDT
/jXF\F D:n>/c5ZZjB15y%ww#1wLwEZ*T>j9iuyij<B+GjkRE!>=?6=P@W/iNX#?GmZSHeZZ4J8h1NiCbNpI:Ay
&Bh>k< RkFZ65iD1L:me9LRAaikm/E?dm+PFpjM4P^6h/Nh%6M?Zl/uHR?5t4qPYFS!*y\=<uN$:nX*VwL>8?@#
j4y=ky 8<bnM+SF=<4LL%BaMGj8dGuJtR5WF!51#bjk=iHF4aKqWGCYqWXe#=1y?J+81/X45A<XlKQtSkA&&l1P
h$*a88 VW^=tI%&<MZ1ki6&ZQ:\AdBt#e=am$58Q/GY<K!il=Xqlbl5jCpZp?&TuBEhHuanIVp?\59G%Gm:pjXJ
a^Qi=b @\B*AH8Q<XEuX!eu>&DTj#aK!*=8%WlV+=QLZ/k>MJ/Am5J!VTY6nIS%w%BTZFmam:aEWJu!JXc@6^QP
/!T#$* GG9V@Z8Nh&$*NNm\hmWK#IRKR*XRncqK1mmw1tu1/K*i5Hud4n$tl<!5:S^hV1N6+wn46?PTWl>t=SWW
Bi56KH q=R@11!14wJMn1&muKP<6K!ELJ%jXFleYJAL9\6mP!:tV9T6t#hRSWQ+lSDRA:ne#h=/DIV%jJc\bkw#
L^ScyH eHSG5ywWb=5G$ZtGlNaP5=QuEh5NidHuuZjLedEB*BCk&dk+GTC\KS/Tq!dcL<at4qlDF\i/>R!MD68+
DI:qel iy/=GIZ/$^WYE/ZCSZpb!Ze8B:qbHEAhq4WR*y!#lRBuBn:#yIRwASwEcKakkiGYFn<Xn:1S+p8p1LhI
&mX?56 pI?:5@WlFJ>bdBNkFaaK?^KXJcRKDV++XPDVmWq#nc8MLGFZYdKECZ?iy$dZYdN=N#16\uYIJ%#S!Dp*
npZ6+> NBDT\edChK@l?tWcKmT<A\G\E?yMmNpeZ!BmM&54T+1K^$5=TqByamt6dB\wb!9PJuQbK=Q/Bmnbt/1T
EY6E^q <k5YK/tw$:X%q$QMZkiad#Ze95M\ILMAkuYKBwJeYujVZm9*$PkH+Km/ePu6:!uG1!q?pN5R1weTM6KV
Ru!1/: $SXt499*ElMV5P/t+nkS/ujJ8>Rh6tRY/BW^Z#=VBGl6tjFS%1W\FK5Be<Rn/4L?:FqVE^N%Q*+t>L!%
Q+$LM4 9R*9l4^GAJMjCR!9MG=yBw5e9j4=5!c!mjcWcBJCkk=i*euCHR9&>%TQ/J9Z4!jjGL@#$/jEE/ySylq%
EqRyXH pt^6:*mBmejNWj:!4pnkT^AwFa%$hVy+%C*p$qq*X!jda$hk^S:h6tuL@8Pi*l:8d6c:%Ki9E^GZZVB*
iIl5TX #y^=P+ydPq/>b?Hi?/uuSb9HLCFbidtbe?dQunqLStLG4AWLFm=iIM9Q\!&EcJiTqpK$#\Vcb<>YRLm9
j*ZEd% *uHEm6ZK:A#Rj8ZG:hnE%QTe\6KKtkb^F8^V<!b\R*#t/QwS%y+^^HLY#F^YF$dY5EBR+ni8Za%\T<&<
wK4PNF FZ+=?q=K*CW9c\B?4/%:aMByS=9Di@ibP:5/P=$PCmD>bkH\@5/Np=MmIJB@S/%NZ?QY^EkjWKXECXt$
<lei\1 EA*nVWP%A>en\<<FVi=AY=phRTy<=:c6t#i8Y:$ewnkJC*aCXmGd161EKqNq*lJXFM@Zd6!!dhji@bQ6
FH$lmG DmGkZ$DH4Ru*$#K!RV1T^V\qyTYkE\4!qjL#<uN#e>D5>5!Ml&pyKjeTa?@i9uWDNSG:EupyQP#<8iBA
bh/V#c Q%bdQI#<RqKEZXnwD@L5IMmb\Q6$eYqh$F5lMRYN*a>#:=+:d4^mNk<dP<HB^kpSuiSCW/+yHwwZKZLc
=>QRl# +q1/AkJ?4=tn?=t\c*iV5>Dqt&baI5@B4JYF/jFZAq%5n8:h4Ki6Scj*$:p$bAR^>i#w&yIRW+A^Sd!M
ykqqcD %@*e!taW#a5#E&>GlQm=8>wh&&iw4/M=AeTVRD\BSlqeMkbYRnF<$p4nT<cWJ#C?kpC/95GPQj9S*y5X
wdL$8S $=1!FdK#6dXB<^iM6t*R$%RlqRq+IRujC@=Dk$&D#6EQwE?pqBRXFbMqXDEVHCbX\qaKKy%/SJaVyV\q
ZIjV:N IM@#m8<Q>FM!b/Xq=GdNBiCZ1NM%q?15YLqKj?&GnRaG8?PKkQb$P1JhTt@4RZ8jmIT5ewnwd#><:j5%
w*/pkt BZ5Xkl*S@8aPSBWmSV#=@4%:TWpJCjEJCaB<ZD#Ehm1YM?bPVEwyAdB#=D>N?9$F$!::l*cW+@Y<i6uX
m6bW@D AWA?jh4RkPWdYT6Y*>D\BDYpjN:Y%6GF:8G?ajcI9<Nhq:5/P>4RnBNWTqA@WW9XCV>?<wVXpAZ9qd=m
MnBW?% 9mFjCW?/n!dI=FC6L:N/T$%%hY$>9C<cP6WG:@p9/pm#M^lVGjj%CB8LA^diaSeDIdY$QHLE#Mb8:?cN
L^I>pa P+/ikKl?!8uIlwYmt1ITe?jNuV6u:5H!b?&VwQ@/@8q6h&8n6bCwyM\M1bt#bKYqy+6Nq\N*5GC&KDe*
FB#9^P n+RpKWZJWLK<LM:qb!@?RJjV%N$Iej$+RPCHRa?KnwZENLi\4K48/VN^?DFj5/=/+S>!DNhnWYQW?J1^
w8$E:F +RE$$R#Nk8^CA481HHXV!&D>@AB:<Lu5>N5S%?IiyMcGi%kjM6=^<LluwN<yaH*jAh8Vd1+8y+JI9>tA
\C>R\M 88i=e/@\jlu1I>R*&TWen+Y14TlVL+bqXF\IJPdtbLFPuCI9l8Danpyl$eD:Qd6*dN8!ceP/%Z4L6NSX
TF6SY9 qJWbT\mXaXnD#CX#XhR$q/=alSy!:>/:@=Cbli%^q%Ni1FuE>X6*+yPTH&SpbnN#8SDeGSpCD>QTWH84
8myWCH qBTR#YTCZG\M:5h$JVI!+6KqeIn5\Lt@L@a!hqaI>Gp5$AqlJp8:$$Ra\8nYB8l&edqqlwhhR?+YNHdX
Lt\Ib1 b$eH&i*W%bRl&RmkuiKp$PSDLlwp+P!<I8KDEN<Z%cM?N!5M>q1kLm6*p#MLK=<<d?@1a4cLh*b*6ncW
MBuTWq b<bH?J>!6Nlu5EJLE>G?SJV@H>wJkRqM?:mR6Mn1K&qFhi$R*^@qyh/>imHR++TDlip8mP<5&wFSWD*M
I>$L\Q JWQK+@?acWJ=RwqNYaty#ARuIAatY:%^/$+nNHAYVhA>hJk<Rl*tQ:l@#//6G%b11!w4pp1EM4YEttTi
jNt8Nk $1A$PMl^myj5TaeHXX^eRldV+GPmlFa/WT+Id4T$PD<uN:ekN&N5kPIk&@bD^mkmN$6?*mIFbhBj&nyw
a%a<^l il/=qn$$Q*<wq!%HE#E98Z4HWbik1PTCtyd8%?<?j<hXu\n=!5pThM:88J#$B&RKqW1q5MH#T8JQVIJ@
!LuwXT $ADY8Fn8&DnR>A>KYM\@V^u+Pmuqbj+\@/EHHY5C<W>RjYwqbIcMWkweqAk19164iILc\kD*ZT?aL/pZ
KwpPXB w1n:e\8E/!i5Ri&Q!8GqyhNKIE<BhRnbZ#&Ljwn&^A81m?wRct<F:y<&+NLZ<nIG8EEDqNXWXKL!mcbu
#<5/V^ ##5R@H?^GkZ$WR<L6GF%^h@?<AH:\I5Z@E//&J5jPYJ8a:qn+/bh%1jRRDc:je9qSPmmpk5S?uNeK=5u
+VBAC$ Y^Tn9w>98q8i^K<SFJp8IT+lJVXhRpJMhL454Fq#bp9#eZPJIQIFpJ!jCRFiZu:PIpBjT&<:^Hnup^/?
Ty:CCc kYe^?TB/IXE94*:e&NIl>wK%p<t/pIlt*R\\?/$H$Z&1paFj9ilpGFL4XqDkpPim$1PWyNk:1LL*#MY<
e4Sdtk l:i9*L1Z@8DPlhNYl+^&HZd&Q8N:$6H/pMpli#T1?FRkdn4q=SF/wajXdY<Aa9\ZhJkF*LNmjAqXRBW1
eN?Y&S FSWW=PhqR\cN!&59uR@&>#4F88eI*B99R5PGN/^h9ZL=Wk*XJYlXEp5GaV$V!uPZ1Kl4/c:WZ:>^/#a<
^DWeZD qNHC&kHID\m?eQuc#V8^CWu*W%QJl%RcX?1DB^A#PBIlaBB^I4E^h/Nb^etw^&=+PBqGlk1FuD8LBkh=
ww1?mj wnM$FPFy!mR/bkd8J@=8qw5T+k\^CZuh#ca8=?+YNuZXbh:$6>/1w/pw!p/!MhqJ^D%R#<uNA*14Z+!&
aJL\Z@ <DFhYZQyGtN#F:?\1MTM\w4HLb%wWA>cLw>AaeGjtmw!:%+M<uc&&L6BX\8wb%eTRXIiR$<IWjniQ\n<
T<C@#N Q?l98JXX*6kFkd+wI!EK96H68DX1?+\CQSPnV/yTKlC1qRiX^9/am1uMWByZbFQCVDMln5>TyY94kVk!
inm/Wy *LF4>&+n?Nh+#=/>i@d5Sw$nEj!pA1qIKbGaj\4#V\Q?PRZHKL/T+1IC+B<<AFE$We^YAppbaFLGXR#J
ALYi>c jXEYte9^KPph?b8Tjii*Vp=cYqJKb1d<9IYLqFSWNVTZ/1:RY:+:1m^9JJe>4%AV%YnNYL4P&NI>LCcn
*8I%+u >EuH!^=<8\=:kHIK+e>i?dCApecNLpwu*:6Q*1Q85>>LTmRVcQFecAl#TnFSTBT\N>\d?R4SHyE9!!L@
BCTK$< P/nVHlCT1D64dXX=Gj#I?Zq=nB\1V#T@wKm+6K!<5418HmHc$p1&V?@wdG>9^TXPDiAtKl/XF^eX=8jV
IZ6b@i <lm=Iuu=/GyIGhBj*+DwJ=>L6LXm@h<IE1K154\W*n59N=iSSYX9!5p4KCmCVLIKQE5#l9@>^/@j@4CQ
-A*/:& 0006fb2cf9e001202b3 Page 195 of binaries1.zip
4+DSVT /=DSRhN^B%NaRJjPi=%\6n6&?Km=>cHN/#ibPLl:uD4ya4Fhdd1\n9nM?jQt#X&\N1Y?1j$qum5/>QQd
DA%QhR ^>iw><t>k$9EJKcLw#=S+tJCR8Ik/GjJmZB#<pnIT59IpuLWLGw&Vb/eR$QwL%&@F+@p>k+ID5Zp*$9N
N8uCk/ #C88RKYGZc><i@Ck6kGI>&MncERIQkV<*98D%ih<+Ce/%H4H/8jH868QV8L9R4!M<wk9Tdq%QVaq+$H$
EIhjlu ?bNYypc:#X^>#*m:PXwhPuDM!j&p&/pAj%@W!6HVI#n$$?<lX9NAQLwADdX1R$G@51!I!kj<</neShtb
jiP%1W PKG@hR*j:ZJHY>:tS$#^^h16Bl9Z4RH&hVVXq!mSiAE#qnBkVbQKVKW=!4CPq$H/!BwXeQAI1kA:CVI@
<yR9&w >PKX/%F*:5dGJ=H*iJITE?QnkZtJ/N8*d5IQn$V>NZ!XCX*DIM@S#lLulM@m\YG?*l/uVnkj6:Wbw*QP
&#XC$= FSaS\R/AtN1$R#+AmZ\yeepq8kaHue@iLY#84Et@+YP?EjV=EtqBhmad!W=^$DkJqN/V*G!<\kQkBS4w
Bi8\:% T:TYdV:p=B6&P#t*@QH#n5:un!5KM^@eT+lD*j=!T?6d8=4L$1K9uQh%Mh?64/$JdtCBMD<lRKD1Fid@
/ZBqhG iAEypW*^BVZQ8>5iq?etS%<PRZL4&Q/hG=b45=\Alb$ACS/TA8\bCyRmVaH^^*RE@HhCmcp+BI\V\Dl#
=jjI\P CV<?iWSJ8IEB8bucIt!+#ZD4%5&d%889$FbVXqlEL1c\Q/CWPbiw1KlP/kHP?YPW+MP<jHTl6\l@pEXW
k?<8dm MXZEWR^bQ%uGZqyY\m#tBptRZ*V9%$>Kb9D4^WZT$qKTpqK!KBqayKm51k/!kP/eXaV<RbEP<kjVhR*&
NTtb?A P@lh9bhZDa4k@be?XHkL:1AM/\GPkdneZPbD#9R$%J<$tZcjVKd8$$AXWIpWjLCqqyLkD#lKm*QJ4?A@
S%1EL% TMbM%K1*@^j&B!AEYy8i%PMK^y!M>LVWqQ9Mi<4*W^+<TE9Q!5:FZdW4RLmnN1bN#=+%w:ub>ZZXqiXq
JhM*K$ SYnD/iGDqGScMuFQLDuq\ePM#K!e@IJm*Ic:@kun1Vm1nc^G6<bai>wyKjj9MbQkJ$9b<CAhyb4F+EH1
$^!YBu YcYIQiATimhh\qRceMZJa9<^n>CLRdD$4R+jQtyla:SluiFlb+@VJ>&PH%w*V%S+9eSC=BHtH5l:*NTG
RSqjHu QMLI&PDQd^>ih#^:ZFtTFu%\B41tICatLARJw6kMTYpbTZ=PDtEbPbV5w%^jj5/e8jMYcH!m#>ScaZna
QKLTe\ &5EbBHLR?a9kE8L9Q<nMK/twjjK5HT#8!^4hmB$C1#D5Qb:?@8u4h>S4ddkjZRd>&QP/8/&=wc=/1tNA
%IZP1J DIVVTM@5k95*d!cqb/ZiPujC<1CSphZJkCB9?IWPtX1hAJ@kj5dj#<jZ^<9V^#QtS#@YA&lcEC1tS6Nd
X6#88C \XYDHmmpetq=bK=CDpn%%PSE!Qw9l+FLPPZ1cG6=:NCB9VkJYL>Yj=Zie6&qpAhATMQLtFAi\<6hR%Fl
yB!WyQ <cKFm$B#1wFuaQXyNhwHYc&XujNJV@@k<?GZIqHnwh9S$ZjRpi#%c%e8W=iwm:R\=kZ1QH<w8tkjlDwa
:pXYYZ ?yPBateCA@GhJD#<#NZy8B%!C^JCI5L@8kYWD%BaGInJ1Pq8PIC<\4PP14T4HwjZcyF$DuWXPT+G8AWc
VA$Nl@ B<uB\euBCj1AnX<WEwJ=Gw&w\>*Kubd8F&+q=%e%6Zi&QK:IT+&>ESEYend+*Qt\!N9*em6d8y+Yy5bF
Djn>Hd ljp/HVbe4nWAd#lDAQWn\R1BKaV1%FCnS+dktJCW5Fq/cWNHX*N%+eP+c&GBH5+&=1b+8CZnH:>ALiFY
uT<JyM XqJTXFSRIBiVm<aY$laSm+u@MCIHMmK=eH\BP%mT5bkqBmcWlbiAnq?/dIZi!qW4X/%c4W?5=X&nn#!#
/t>6tP 16JmamG=mAI*\c&wyKT59ATTB9nL%NuWNVnX^mt&5TR!u%a\Y5kwam58abVTRDwR8S\FiTqDjSRZI$N:
MyjVpj yy\$KTW1mWLbuHpLFbiw1Kp6P%8bQ=4LpXh$iHp@?AWJ9Y%HZe>Gy:Fp\uhW9Al8wbVqFu:EF8R\M4nT
T*P!S= H!K@MJHCuu\j6ALZ9j6J>%KLpWhkL!*QuqIIM$iu61>i9&l:>1T?54RwF=&:5w=8dlJSE4n=S*\T\l#%
RnW&Lc CT<y1/m14pX*&$WBecTB5^+m#^$D/+i/Th=R9IXij!<=NT$nK/ikEGtF/y1c86yc<DVFBZp=tYuw>pHM
DjnGYW =L69aZXinEhhK%GhLt4:<1\XiaZQp%=lHJ@q*a//Gt=^hL?Xd%l++CqZB@QDl+=atG>d6&/H=RtQW&/8
u+Q<Tk N98Y!\1L4bhcQB>=Bi9<?pdpFH/DW@n^>h*L>1d/m1L5B@H&5<SuTImImkkJ<QQ\malL#Jkl!5*BJV+L
9:Cm=& :@bDhnAZjMJ<iSX\C644>wBPeQNABTiSN<AuyCGjWQi$Ba5!WhdRBn#dAh$qi9YT:LdDQe8RaB5hS+&B
QayMJm 9*@=<Qaqt14AK16Bnk&WR5Tbw9^:$ZhV54JTwwJhLR<athmhQwPF\8HD>l/R/b^C^VViZq/i*n=*$Eak
yG+H@m GtiJB@clme/68CX+YXE8tcPaDip:iP&WyQk:1KEC8ARZi!8#\\j&:Nw?NVX/1SbhR$%XYaGEkEXA$CPX
Dq<D9& SyXJJT%FeAn#<huI9AYLqXGw\%MDh^49R/$/$C&M\PD#aSESX/=en5R>KC=eAQ!+<HW1Q>KZ*ejdt@TS
XPP5?d k=@SG\?$<jd^BYunm//GiMKnRA&:dejyuBwT\mLCVCF$4peJ$:BjaAyV1L<DmX#DLDYh>TbPb?<Y6dSZ
La++1b yETeP4BTm$uu$JnHl^ZDBAjcK&AVEl<Ta=Ne$pRH!6ccPQlj8\>S5LP6+XF8T5#X<@+idp+P>1k1$T9w
^Vqq5< WuSGSY6HdYFG$5$\L#8VhW6ytwN$D4Xy@PAa1Mp#AT=lIcF@jIPpwDtcYN9&8C#uH8yA/Yb9jtn969X@
Wq/m4: JaP+1w4KpmXK+BdAZk5Y+GlD#tHI$?b\\!1b9&DlyFWJyVG\K6<j1<yQ#KdpiiEq<Ay\F$k4WIwM>ILF
6pEZRL Cw4KKt41GkTh$1KYWnwC&qy$<NmL$Z9QJ^hRC<WYwhewaweB5pJNVS%:DJ%^m89Lk/K<9Q!^ApalG>yj
<qa4Ka JLHQwBYC%!nPKB44ydmJYyhN<nLkNmlJRjAdM?ZuL+K*Mpp5B!%SiHw6<luV>I&5QC+q=FcBqQn\>Ri/
ad+I:F hMApmuFD!6j*!4KbYXRth\dLcbAQcKqpCuGjlARnGZ\GmVaSH*^kPR%l*EaPqaq<AJ@SPWbRk8V+/PD9
S?ta#E !WEud<p*$%?@CL>+ERLL:d6w9\qCjl/wk#LGI*/5H4LT:mjGXp>RVE4<X$4E=Y8kVPQ^bR9\F!XqSLqb
n@bny@ YjH+<K@i:#m\hn^9ih4\8BdhIH8Wj!Z<+8W4%&=G^!SCqM+yKK/wja\9Cd&j<ldyp!uFGh5nB^#PZA#%
c8:wM1 RbW:l<BbHDBa5>:I>8VyE!ee#XBKIeat9+Ca9$4J8:kP#ebE9tLk^=h*L>wcc<5LM%Qmd=*RZ+!tH+wK
?hbZtT C@D!<A1KmwyQ+?hpF=CbQY9t:Nq#=PimNdB\65yu?m#NbX6BRLme>k+<F<d1NISTm44G==&+e=jw+Pna
lQFKRG !CBaC>@4AImjp!&du4i&w=@/C=wSmDKN:=@jI\tB!ulKWC5%XLB&?>!qS:qJh^LTe4L9ZV@nc4Hj!NVB
Q?P@BI K!nR$<*S<wmbw:ju/bQkLEmj&SCM#\c*+u:nA:>\W$^$D6E&%i+<S!M4P!e4K^MidC1/RHL>$9uAm\*Q
+VmKKZ u4W<c$cDXE4\+TS<DVLKiIXFcAuQuV<b9EnFWTWBmH$L=5&XN/6?N#dGyKn^BX?jYPLP%K!bt8Aq*d*<
ACME:W #kTHlF+Ijj8/5:$NDbAFJTRE*4+wQ!<Z9NS>V&huyk5@Pmp:he4h*eQLp@VmS?*5V:1/kIkAd<Gtky4A
aLR=Vl aGjBDXpG/4A$Ya!HhlZF=&p5ZRjPI1d+iZ9=@VDZQe5l8ihaLCuEV4BS:A^&Nk=&pkQ6Kw/k\S%K#ZRy
N>N#t: Vb%Nl$/E*Mt1jNdbWqPaikhTA8DdhK<S8ZP/$V=Vm?MiIVe#cn1i%=bt*+5KPYY^jRWdtnuHwT!GC*9A
Y+d6pA a>DAViD#DEEC*AYpGMLLw6C$6cc1\nVpjE+j6#^p56NkFhyuIMBj$EBK#ED?a6$hYQByD%N^+<c+PHV8
&?9YBH SpVVd8K>=>u!@&*cSj?chw#9R?W8@Ky=C<mFFL!PXCAWlSWYJTdkiy5wWGiSpiVqBdkX$npj*Zu!5?HX
@b@y\= ELVA&T^a8HASPA>RG$8Y5H\Hye:^bJ#m:HlRtJM*up<YWIXwe&tmtK8w5KCk5IDIbT?Q?>XL<bHM<iHu
keIuZy hw4!5yQPR^J=n:q#F?^P4M+b!?Ww<q81PcDF%J1t5*H@<aCw%PKGnyj9Q9YmjRpGWaT1=Ju=PiXpFyqN
8iW!Y6 bZFqymQ@RcVSHyB+l#KFVGFQ#T6mPbBG=EBI4D1EYKZe1AqDY%QBm!?W/PewNLnlVt\C/>bXjn=S!A9L
HD<=?* J\6amQ$=RdE#S$daSlkVqMnVC^e9w?6b>%JT$:N!e8EZa<@PaH/qN9aXZktH6+Ce@kHi#aNw#jIMiMPB
%H%ctk qXqem@T\PHVR>h!qe^+8V6bHVA<h6VJc4:@ywAMKZQcHNm\WE^Fj9\m<@j\Fc>I1Jn*D/Fn@n<<>*e?j
?#\5:Q %yVqy>?Qnaw+:/InM&PcGLkGQt=ijmFlWSFihk+B&du!5=GAtIiPGPe1kYjR$nhG$>W<<S%l:Bn!T=Bn
hn68ER /H1NLwAPm+!NDQ\E<6?!yw<?dTAiG#R<dY^yR%@@PbWRjPwBGaH&B*DQk/V+&D8**i>ZbmdEyGVqbThG
yiTL/% ?ntd:>>6=8IdHPDlh6#!1QWJeAiujCAkp>/#9N#QuY%DHcFBSKCNSpk5\C<<t>IpXKbaStaGmInpi+p^
?t6CN5 $hen\+J>R%><w$VHi:N%$Wa%YqIwImtMKjLATy$4j?<L\cR+tTQDI\\tJWpPJiEG>ckVI@m@p/mb!JqA
<ht?N5 j?aINWTJpF>T*jFwX#TW/PVJW?Sy!y*9NB1P=P#paGe*V8hVFBXGEXqRTAkX!W>yBAa?PWRTRZ!GKu*y
n9N>6m G5A?64T%4VV^9PNPZe$^RHRGN\jBN5wPtRPQ1QkwIq:lGX%DW*i48WhEWqFnb$6%d8LXEG>Zt/N:DNin
?pn\6L 4m?/!@SY4>>ta8q&Nn4*TXj4+@Ke^K8BnkjY5&q4AjJ#RA\m=HqSV&5l+WuptWklCP9hSaN+HyhtJWcF
LdM\DF B*p/&^\^&d%%:VK5EGn1yBwF!RQuEmYFR!>/KR4M>n%L=@<$Y^I!G+%BD6MttBRj<j5/!E*\BJPME\45
tiQ/N^ m?a#9%F!nFhl1>BZ$B1CJaT%\B?cKZZP&TADeqQ!euL#IHtAD$+$Zc/A#PjAY\%ww\F^Dawk9@A8eC%A
q#ARAy MMcG?*9mVm!dL!9NALJ=yYSpbbSPX=jpnPh!F1bwc&wPI1!ZG^+>GS1dXhHT@idD6=<D\/n!4+mmTA+m
QCC9pj wcTRpePXnY:uyE<<=E=:kA/KHuCCQEBuDEB$eYZ!^De5CWT\JIBe?BPI*teNacHD+/MVdA#+9TZ4$PK@
#hc^=8 BYDjV$=FM:*RZb<WTGTSTakS>5EjjV^>@eQDR$MnVJITHLwhi9HKnima?H9*W>QIDM:Ml@iHj=B>XC<8
Z1ZckG +Q&KT*k@dj9++eQ:>^@/^kumZV\I>G6+B^<F*ce6:T@i+D*G\iHJ6PH!edMDl$>j8Bn5:8JwbYwKWtDd
d:5N=% t6Ydn#kB<a=Y?@StmalK$^cSC@VuL>mSYqHd&Q4m@dj?$hH?9p>98%5c1p6#$=L8ZL6+#6>6=:JbM<Tu
-A4TC> 00034792068001202b3 Page 196 of binaries1.zip
8kYQ=^ mR4^eZQ#C\kICZDVPKdNuV6uHqb/<LRYLkVmhVejRyP*jaLPZ:y/C$<+RMC*w8Lku+Pnw:/DQ%Gm%h&P
mJHadA 8qZZXqhYXKC4<6Y%/PDl>ah9@dl=?/??4^@RLK6GQK5W:ayB=8BjWyKSpQA\L#<4L5Ld!h^pn>ZJkLQ?
RniyaV :t:HLa:b8wMRh@j*SaeLuy:i9tF>R@m5AmpP=FyRSGc%tM@JwDLEH1dn9b9E?D5*4$Di+HW$qB#:Pe/G
luLA#l 46>!@\/XSR8a6VAuFLkY#b<#?^tDSI6*lG6++Eh9:&>mTG1EAe8n^\^%RVA=hA^XD=*$<QL^<llG#+u<
BV+8GT #9:6/%j=4%??jQ:$/iNHhKpNQ/m*pWjN#C*SpD<uhNZ@JPuGe<LX%epSJQ\+uVaV\n%whNTTm9\jV!At
4L8ZTw 4W4Z%6@uhC/84K&qKDdah89TEV1*?n\bjp+&Nl4dCD5HJ:<+BH@c@Bc/yKd8Nt9j/&pX4Y$%8ZESkY+&
KHbuqZ y45*4%t84VXBq>DWZ4b&=#G*$IVTq8:&y+<!a!>/YG=uZ//qPW^uu!:\V/yACXNClCAV9MCw$I\h8dX6
8J1u%6 *e<1<%PnL=@#edM:6u?*+Zw>X6mu\Au\1pLWX%be4B$/Nnd$@&NGN5aIPV!n9/@*?&>$SSQbpincJIie
#9MX!4 AjIGcPPBi<Hewd/?ZnDn*?W?D!@*h?>:^\ntm>P!e4Mk#LD!C?\lqHG8AA=CB1L>k+i=PduMQQde9N!J
1iN6h! QFw?YWlB<KYBq$C=AqZAq6njC:@d^Pnk#/@9&nL>Nm?RqS&X+yJWh5p4#buI=ew9QkJ?aRn<k4m?5a*Q
bXtFJa qiVC^^D6Q\Pka^METAk8emm^wmkQu^/n!yCJhPwlM+$VHEQcbJA9K*w+FiSFWJD9SbQb8y+@1Rp<%5We
t^iyqa GB5eH?JES@+pTWqEwibuN&:hmaqLRLPVaJ*jnlwnKT:G!MkAcl%N//X/ch@Jd?Jk4lHRS>>D#/GdTZhm
G4b1aq +yQ8p<qtCZh?jin8R4NI&6ABBByGm+4Hc&811^8:ISX@YayiH+Wc8?eYQ/yBc1DuI?=hpI4Ha%!J5D1!
SZH4!E *>#:aunkKSeHe>MDyphNN/*T*&:8elJW1hpP8yTI&F!%SR5l>%6+IQ*SyGeaG?u9@jT/<>qn*Ldy>lYI
Qt8&Vq tcih4Zcy!$lImAu#<ZD#paLmAq\$4tqaqM%HntG^+6\qZ?t#6XadVR$@8ZI#Jkq%#Mc8+i&u::?G^+b@
?SDGI= HWS>S#8iN#?y4/pE:X!IuDq1=FBb?\VQ\l9A*dN@jteNd$CZ6QN\M>Ta1LNXJiqJ>:Q!<>Nn\4$en?$>
enG6h$ aPeiGP^*?5S^T\6HH^?Yd!C>b*6=?HneRPiPcNk+#lI/YZQw$SmZ@K!HM^/twX1AFHT^:hdXmA6B*1j&
MPyLCK H895:^<hGB$W\5?Mwwc*!5/cM*<BAT8dYC!\cMGe&iWESeED/!j:CQ!\1K@#99@Cn?9%n9Ydh?\>iBT%
pnFEmJ &HX%P**C?hj:d9T$&qE=n^L4icFi<nXX%W?:+Ht>KDqli9maybY6HY6a6i5JF^ALLAjBJw&TA$B#AyZ/
S!\qYY m/A6Sq^VCDJBZFcN4kZiITTl9Q%b\b%A!$$R%nuXFihM+/GRd?DkF\Pb\Ccy*E1j41t:\#d\hub>S&Nl
8uC5L+ RwT@<#Fn%I+alL?a>546=l/Z$&yc8n1iqKdhCudi#:=PS&8E#1a8\eB8kb&qW+SIRRb&C>PQqnh&hV\8
TbQ@aS !am@jkGTAR6VI<NN1*Y%pDRRXqhVW$YdB<yKCw6WnubM>A<PmA!MnI%N@DWk>k*EapFp\VJp\iHljt^A
FtkSa: Ak\w@kZFadBk8/weKHG<&WA8$qp<Z@:Zi&^AYP<6@/:*1myp\I@hBh9BPiB<aMw*+H$ENnZ\DSMW=&l<
QC!91a dqaYI+e6N+jMyjJEe*LSjF1eC^Vt=?Zu=+F$KE%@^P!qSAtIH#<?9?%8#L6y8Z1PqI#$lBT*yJme/aPm
5\FQ^1 9Iqe>1J481Vt5BclJd=$+$Hu5>EbFe>RkEM>1yqEQmXK95^+XqKEnk##e5FNbGYTGYRtb#4E@VV!IjYR
aD!d8< LT$D1+j</y^mq15Ra/tHd#khcK^@=G@i^i#9G=k^mm/pN*u/u\8LmL\Yhi9&uV6*:$ShnTEyVkdLR=Bk
nHC>t8 MdVw!K?u9*!GH&CCw84>kmGSAK>!N#a8:9b%5FlZ^=THcGbbDHZ:1Z^WZq4?6KYl=F#APVSEJTp%1^D:
F6VVlm CHRi$j84H*iM9Babi9Tama*@yZCjE<=&S\<iMDZd5%=9ndHNmSPP^?$PdXKaJnJ6EZn6ljyL@A4k8%6j
ZG/Hl8 99<PH8L*>+?9P=44K\w#W?J8Zk+>k</pVXcyL=KZElES+PWGyTuA#$ZnEJ5#u!WXFSTWFm$ED/FnaI4E
=49uec k%<RHwPbmueeG=?Dk?n6S^8bu*^:Z4LKC<6KCmE#RpwKhbA6LHqW</Tq?>*Zu:mwwQ<Hpk@6#=:YXdIt
pcMeG9 @MdHl6=/ZyKSpy=jXJkYHi4yeMV+5KNZWLC98/8>yjWJZ@ARHu/+M5HL\><:bjKwE*hk:pa*:B5uD#a!
X*QtL& H5^+kCdlwa&C8/m:?Fq@V>e>=y&@j+@%D\#\n+:D\:w9LViH6bhFLlJePG@&<mHpHWAa\8LG6!c@$4/R
9j/^LW u?Y@+piX5&dVhtM$w^+X$^/*?@Z8n*h+Nyi%8894WbXKBZyYV%wiF@99R=N<LK!Sl*B$Jy#aHI?V>lMI
L*ZWdu WqIauRe!<G%dpZ?VmGpLNFniIdGmw#H*q8@S6XwDhHaN6WYe5$R+&DlG&hq=SeZH^NnE=:jS^eE>&AZF
HPc\I9 FDT&%/Sh>Ze/5tPN46a981nY!q&&khF=Xe&RClRpSZmae&#V$>IeyZMym\8mI\e5Gj:/lnGlGVM>cy=*
pq8X4c 6%VqJ6?/FPVqdHN+#:bN?58ZVpwGC9IGQ8ReFBWY1yl%pL?I*+Q>#H:?pj?&H@?p@Tc\c&Bbn!WINu@>
P*jnQ! mi^*Z$b8>y^=&D$5ZDS9%1>*j<\*=S5tm*#KT5wcu6WZ8<uI5uaZ=m>a6GnKP%B1uNIVENjnC#LS*Gyc
6S<5F= NlN=B*ATpGERBcAkREYAa<kyj>DaT$%Hi\Z>cHuZbN++9Y?=m9I5GSpyccaWy>n5pPy<EBCF8Rb$Vi\e
KaqEXe ^Jb6M*iQTM!9d*@=:k5/*&IRihT$$dRu6a<iqbiZqlRZ=Pem=+B/<+N:!EkHB$Gt$+4\pYXia<a:qt<R
EH%i5L ^&*9j*#:CGEQwt/Sn$Wu6ll6aL\jK>HTE^+Bb<?HwTuSX!M9lybSFHPpu<AYw::SJt%Gjn4^5R>5>6HQ
@+CCYu L#n$a8VXG%E*Rj*?j9iQd&l/PlYPKm6R4=Cm+54!YDij\JBLN/IVpZiwi>4c@Ry9J:ATm+m\I<j&P=/>
?CbV*q hN:VFXLD@RhM#Zi6$X69a8@1jN#ic6@1PcIm$w6AAC/e6$nnRlH&Dl??D$Ck@@dlXZ6ndZqB^9&aG=hC
In$5Xj @D%e:T%&/JJ$ZuXqJSqSRX+iQqKAn+jGId5am\hTkWNJeb:/h:1<y6+8e^AR*9AVZWQDQj?+l#/W4*^:
QtIHHL @$1+A<@6LC=AFeKy!eupjRjeFBiNXtq5i@Z^P:yKMDd+C\tN#8iNn/9R%IdpyIVwM:Z%=VpbBYZqSct*
BF+#l! Rp:dHVI&e@W:F?S>&6ZP$l:Ek#jLQcA5+&^RP^+V?kQqF1>^=WLnp<e%TEBpQ$!qQTBTSP:jT+m:k/iG
d>*kFP iy>$NLLwbQ=m@Q:hL#AMn!yKTlcHM*KB\ML=e&c/pSRV%9dp+mc\c!A@#j:+AV&yH5MNcEDQEZM4c%54
my^%%> 5%@9<IQCc%9yu<CHF*h^aZFFic!n<h:>yphBQ/A8LMehHa?DeuB\kN#mH?jAJmw!Ie!J:k1Cd=ktL4Ea
E/:ZV= nejb=*#?ZqZup/#4H1a4kZei841!+uRiL4aJhua&\YpVa1Rw&$#%D4wabBb&b?PKY%yLE$Jen&=jnTdd
$?9jMW mYm6&Z<mLDG*54t46T4#hyADl<u/yXyn+GGplhH>Z8KQe/AEJ!CuAPek9DVycYhuR<uD&K5l9yBQtP\$
Zp4q^t YLNCX&6<$npIRV/lnJVDAlYLny<@S*?N@Yd<F9\%>I@=mAY<W>d:@he^IN6SH/pQG*9Bi1<XbGdmQYwR
M$5:p1 4*Ntk9Z?hR^@q9pn*CK=1KI5^pycSt:tdQp=KK8aFA/1dKy1HNRE^X$dq+MteSQbXBbdhk+c!J&d^$A:
TR&$Bu ELp$JBu!TyK/i!pJknE&>P9d8=e6bepZ:A*S9Yj%BVMJGR1Tm^pcaeWFnF!89KJ#c%t?RXS@n**k#dT!
LG<:j? b6AN**<QRb#QycT:<:11+JGC6!<4K!:M#<*NSthePYkIPCkIwyBb\F/Z?9udbHIllyML%A@=iYN6cc/H
Ab4!^k bejQCdAX5*@<6!VaK6*BDh&BD\pJQS<e$A>PhQAuc/ES*&lj1etql5\q<L=9dPL:YZT*Li\Tihp5QQn*
klwJ<J 8!tuMKqS@!\%eF1FBZtFYbi6*j*PlX?Nnp@NK11wd$LyQYkGXqJ^!iZIwaMu#q>EG+^Yl@d9Q*VEeJZi
&&ZZ<Q S6QnLw+Ph8c:hPSESiWZM^jN%d?GylG$9j#RP#A?@BQ5%6baW=4:MPuP%ZCWWhki*1DFwI641M/VFPZl
#?ba1? kTnD\<+68^lJBXKSR*uJIpZ\B>wdDqw:uQD\P^6&>Xbeeuw8QuQwRqP#\eq</iq8EZ4KGp*%EN*wn+5q
<t%yC! al^R**q$t?FSZZQu&<?+ktGENcMWVb+9K<^JV:tZiCGtG\^c?Km159nB4bBV61d:4W+Fuk9$eui%5*d$
q<i^G4 RTXB9m!%+PpS/QeK1\Y$8anTmbbt*P?DySbTWD&KKLwEmDeZ#@y:8Nn86P^k@9#/m\?iWNkMYdSC!jt<
4GGNE# <&dLQpbQ/MiWI&B=dQS$!Qi!<Hm?H68\FhW#HnW#Q*d\h<<jV>C$+J<\l=^&TSEEqeK5mGM:nQbBQwjc
CiL%pJ b6nb&h8VDyR>:VkIljtmW:/A?PMIJ5VEb!mBH%l6+u\l8cc:Q9*K!Z*LNZ@SCV1ul81ecaIV:G!eRp\^
YX&>Y1 RyShdN1CV41Iy8=Yt?D+$4dt@J9?%49$6d@Tlbh85jC>tyBd&hLhYJ^$/STH&Vb$<=hVcS449BH:APKQ
hLQc#L D^kXp6DKdEEDIBPn\kLhn%5e*L%=nb/8>nnpDtK5*IGqD8a4Y:d@?DEGQtD<q@VQmV<tA^eAJ15Hp\&k
4m>1M6 /YREhy$EYI#&pj^A9cji4i<hujm/TXwPd!ZPZ!A9?:6umu?R\CnM@i5<C@J!C#InVKSpYJ8QIA/\B%BS
^FA4Bm RR=kCQKG6Q6bGbuwhJA9K#54G&J&hp:8SB=uLpwkpAMwniuBt\wnk!luiJy@^@j\/kp6RbY=<4I#yKTq
hcQbw# y58=bCL<C?KQcGq1ntmSYtJLN^%!C+9Q4eZTAFR4E!RHi$dDW:KY1ytB4=CYq1JVCySA=PC@MR9?iqwY
Ya8acA CW/Aw/#$Q9H64#cA9PE#JM:Nn!8KMp=bhW#<@QbLuEESu6a8J#*SAG<j>:iRh9W#Mj6Ij:Lau:KX$>jl
jWPK>> pY:Qp>+B\ihCR5+H?jd*@Aj<@^Fu$P4K#49999P$d#Dku=mcW%VX$N#?1khERTJ4RLjF5RNHVwhhCn:6
CyblN9 +tl^$MVppMuGFZydn#t=&N9cHnbWt\H=\tJ1MdXw:tL>/!\HALJpjPnH%*jh#=>Wq?TpJh/?Awu*TWj4
Yb&cq^ 9Zwn>BuK5/VFiRYE?DuaJhFyLm+qWX!5&pijw:q<B+mBW>=u#phE^h^DW&y1RR8kdaK^+S?jZ4e*%RqX
59IWh: +FbB>+H</N6SWiTN+%E*d>?JVWT:IbWN4T@jjRL?S<iGju:@?QbFi<8VtpiF8inqjnZNhcX==dX%NTZJ
NHWt!D N$JP&^\+/8AXjNdj/:T#nh&JAKRGYGLA$<QdJ*\RD<L:^5wXu4N/+8E&^QBP^D&^yMTEtD8*RA5E?y^!
-AL+K^ 00041479303001202b3 Page 197 of binaries1.zip
%jdLQw 56yt&h=H@ln?Pj=4+8iMCa4aMGPtQN4JtnhdylAi$i@i!eZ<N=cS<IBpi>AVMqt:iajS*9$HD^*a$>?D
c\?Dcu H^APbk9?+Z@KQ?ht=>=*Z:>>%^/Vk?A^$H/CHYHQ=kD<$&cV\p^kpTuMFBpZSu%=^5ZEMQ#/Jm=l1ZZh
85n!E1 NR<88i#Y@Wpjy*My!WtJ5LGS:J^5@KJmak!kZ$/qt!+M>F8imT64j=wbij4\Sy%QhCE>a?ikK+t=Ni$h
:Yn!#H NSqS@l#&i@WS?*JCkwLAQt5@pTp<m4tjL4dueTic5^ehehdL^j1R5iE/QX*W/J5X?kWu\X?<eJ/TbV8#
&A<KJS n@qn=PjaV+pj@&t1AnDX4?@Mj?#EY5lW#@1*Z+bH8qbK!e*GS+K#bZ/@uZTWYN#?5=V^bIT<uP#ei?=c
NR?QIi 1FkA:Tlm:qHky%R=\Nu\*Z?R<VA>E?*ZE=qpFtet\y:IJjMw!BEa8S^FPXunmH4IB*ySQyB?^ZY*:ykY
A>u9S/ B%%6mV\y#V%D<ND6>B^\D=\qeZw5/pYZ:dD$8bbc&wmD@9AaA+I?B=uY>bm5J?9EYBeM+Ce4^jjQeuN#
&PIBNR pPBk#!6E!PjX=XZ?t\:$j9&IhkwkVKY/YdiVjeTQ4#<qJ1m*yldHZW/ePu*c=ib@4mj1M?$#<Rh=15jy
>$iAtk :cj?4+ZHZh&>@RMCA*%P>4@>L?d@41km9KK!Mm>8Q*VKJ\mwV$4QLWNVI6?<@>1LP9lCHuD5&L=nu8Hl
aqi/Tc AThh:I<hMDE=dL^&th=&C!hui^9L@S5WywpA9DRFe9FeSh8HljC>IMZ:l5aHj/Aa*XBbqJWch#QmjIDu
q<:nQ? CRiLdVyDhA+NFRW=py?Ll#b6umI8PYhZW=wQ!G86&&<F<h:@ZQm%/MRHYZmcWhidn:$R:95?9G^>WqW1
*5SSCK YJA%NidtctREeiq+^PY4%&@imW>P#!86ciyEN$y?DWQE:@9<:uXZT&N6SXE8/9Ia&kZcw:TtwcGt+N/%
MT>qe> +JNYB!*hA5/HBHm:P>5:uA+E+4$u+:%:kH<Pn9i5mVIh4Yn*5A=6X?IBtQiIJLGEiH^jM?^ekIi4ubtl
HnXuJF hX99SN<EMM@<IRc1hJ4WLFS+KT>#=D<YMjEHh11Him9>5j>L\h1%t:j6N6/:#*l:@>5@6D?qumn<S?!c
WSAJn/ HJ1VeZH:c5Mh8@icHD^mn9IFmQq&Dw:A?$\W:pukn^BBi@4wwJEtPmwtNqeDM?<cu9c+5!4=\uFD:b@$
J@BL*# Wd1Al5ymYT+Phuacu=DIlCmd&P\ZAL#PXp9@tNL&l4R\=#&4ND@TldR&ty$K8yyW&NDXXBkj!8q&bBNC
wnen*/ tE%TmIF^=^aTSwZTkD^NeElIa9+FHPwV4wZ/8hph*dh>\$yhqCAk+wYuR9*mSR9tKqt*MZ8H\D?P>IqP
lkkI%n WK@?YPw\SR*>JL<^@<hR=N6%d#:<@yIuL<X!DdPp?6?\DQY@m=nqF4M!\FCR48MVlHu#F:L&ANlWXDp?
c%S!aX M!k?St^PYl4p+Juy#A^tJq6YNyFD=uLtRMSHA\CKe\1AhyV?@@:&@tXL/d%#Xl9H6AnNcZR%>duTp6PE
BQd%Te N$eYIGwL5p>4aNyF>Qe=uw9J1t:DIZ=pk5ml8K6L8l:D#$W?=5J:eBZpI:Ke4/!$6LkR*#bq!<uGAV/@
?q+\Jq J9QJZ>yB=Z>?n*jem#KVuG#c!h:^9l<@1D/SmX?BJtdYh5iQ&#n>5=1I##R$Qj\jM%F9HQw/d6k+upVX
<ZNPn* c1iP>:@FQ9Fj%HHTkc&EqqNGiwL6Wpe*u?CL%&Q8b^R?1t>8j\ESunXS?@^l<#$YjljD@F^Bw?@jb*J$
bdlK+a ^!4h%ebYVk+&%tdGK?iKC5>WWKAW=wPCe5qt5j:y^@Da\I>Qd:1iwS4*=Nkdq<:=8<M*4>j1S\Jjdbcw
/+p\&H ADi:!F^I8FSWXNWYK@/k#>E%QIbmi>CF!J9^!bu=bVXQY4yij@#iQ#dW?:/:Bh+t&#e6tZY+GSGPBlmi
wNqELc QajG\Eik/8YW#MKKl8i5YuFYVjTd:6dG8wymIDR=/MHLy>Wq%a?jQ1uKTdke+H45mIQZ8dD#b@\<uB%P
\a5?W^ ?J$B%HF5>@V$eQj*K<i^@i8W5pipX:FGDKViT=1ikG/Z^/JPR=hCA*%PP%pj&Y#V>y*S?/YQc?KunaV5
ku#4M1 dFKiT$cS?K@FT@/luHyD9bd5c:?/aw$B8uT#\&B1>eJnic4$N?u/^\huyMjdct#c9H**HlQVI&m?qm&R
*1$%SA :8DIwHNyTKPVi@Ij%AqltmklSlNqmNHtp<C5@u/*T?qQPl+qu4M^$QyJH/L#kiqu<kQ6QEIw8E>ZiEWZ
m5pY4c $q!/&eI984m>ITZEd498P:4kCtPd$&h9QCl@*q/XhwZV&&w:&8FuY!A/K5k9LIRGHamkkkGG<IDRNKXd
:RZc\e ub%QT>N8ZV#n:tl^aKjBc5B<FDDHmq=FbRtP/@QuKN1$jmP@n@R!?yl>E:*CE#?6\XV!<4NbytLmBj!9
Y$uaM< whD!Zjj/%c9i>5nyLJe\T:L@#j>k@6ejRqVQ#Hkad/5$A>Z^#EK%SA6^ZEieQ+X$Qna:Li*l\\^GPmPD
c&LXdF QSNSVtX#aq&QKL@@BMX$^8nkV\lPnjuS*kj%^4VGNIWX=<:pX\4MK!4P!!@K&A1AW%1m&kbH*T<uF#&F
@/I19> GQT>u/Zlian$H6RP=kub\D9yj%DnN%:I#eyR/>%Cn9!<kpJGAWhlbiy:lQkMBy4Dl!Z<m+:t&9K<%Qnn
c+>tB: 6t*j9+@*>9aJ>\:@i4B>*%F#T@NDR>VE=Dym=Vt$j%aT?ed^>c9H6&!MLi!hZW?/PhtkqVSqu!iVkGN6
<Ew1Ga WV!%pB+?<F==!QGW::tIt@GyPTXXV%6RCl?L^wKGl?+@55e/MD#W^>ZJ=4AJ^JVN!*ZY:4N%6LP!P4JV
NZ9%Xm Y$=EhL/mI1E\l^/aBZ\*64%GjQj*jZ4h$X^Zuy>?:<:X5GAR8>ati4%$:5Y#JQu==XWINZaN6aW@/ZP%
aLQ*QH >QjlEB=!CX#L\%\<MliBQV4e?//48da5L#*bN?H8VeknLwTeDWLNcZ*>@APC#y+Q9*\DVe?DKN/Gc#iH
lSA\ik J65d6DjXX/J#\PT\6+%QKm91u#a%qGjeDjh^QG^^ImAM*Sl&h*H^PI5Gn:JCPJD6/@WC^@BQ:!hFP&+M
n\&e/! Z+:cl#%MVp!k+1pEWZRLGJWXB+I1MVjhbNMGcju*L:%CR:>TSCXu#b+6N@$VNj=j!=X<S<QLqZyN9bK5
!:9=59 9&t#d6tcVb5N6&%bn>a4!><?jcKEXPm@eRp9&QR$iCA4N?J?JKcHn:Ht8l=*t1B#!kkJC$/C#SRlMhcp
X%=Yek GAqw5$p5^q\jeI9IdG\9nV%n5R/+@pZuYm\:ub>LkAHlY?+XZXB:w:u94j#uV%LPYl55:cELct*cd?5S
R+tJ*V Gy*#8P6ydnSu<HFnQWT$yNCaIA?P&+D$KPA54qLR*RySP@KeN>LyY>a5S/iBW#SQ^8^=e^S5Y4>PjGQC
G8!cR4 el*9Jd/LDj%Mu4VPS&4<^>i9Z:+\@:EPC&dcc@LXtyhkH8*yM1l+d?cM@6ja:j$dn1a$?1VdA?9wVb?B
qdmFJ+ lD4T/c!+Vcq\qDEw:y=dGR>TH/R^HnLT&VJAy#P#mW\t=PVF$c>bPVpKQb$%GXieh!+h%^4TFF\!i@+Y
HCmQHL %+K1$9#<JGPNWiBabNqPt+DdtSZQZ$CkH5TBt1M6y/Nl+ku%tB%?HNS#uleF!Ejq<EP^A<TMA5:<m6I$
YRpPuE JkJaknGbk*><k#La+8#:h?#6Yyqkp&?>A4?16&*dh>B$:\YKmheKe#K6?#e&P+N#P&i*VqZ%pIY>\*FH
w^q<d$ Y:PBN@@C!+wCj$XMDnbH?QaX%p/uA$K9wNFhKEC@i9?bJeW>VA+c&=+JC@FC^V::>y45Zcin5@Gk*ZE4
Ek$HpE C$9VLc1T\lKLFSWZKCwwKP1Fb^WA9?$5jmGFcWjySFym>JWLb:#hHC^&/H!qC!4NpyTeyc=JX\h<XZ@V
BC=eLb =?y5Qt4nlAL#qh8JD:KLKl+*h:#?<Q**!HDj8//tGyT?^@niSHQukX$jd\@*$&k\GS4SEBJ&PT4tQk4N
>IcCep #>yj9Q$E^I@%@@n!:qX:<?QK$9#M6P6Jua%%=dXQty41C%N9l4ndHLZ#PH9y+4pkj*jZW!DGk\N>We:6
19tJS4 ljD%n^4BkZqTk1Nyn6Ywa1AkB%$>T1DFpdGmMZh9*:\YeTHIF=VG5j$d:X4J4?Qj?4=V*$S?X5&VpJ$%
Nlum?p T>IKu5ujFW4<<$RR9>I9#>18W%ZT$q8:jyQBl6WD4%8tAG=R?mjm@QYw/Yty+h6X%&#anQQ8I:ll4b&n
JlM%?: M+QPwV^hGJL8@\TaEKZE&MXuKGKCD=/K#H:YXuVH:?l1ILmQ#1$$c:1\wClR#n=NX9W6ML9&1QjN*GiN
wJBw<L D<=cd6S/R^jRM#S%<It+X>dYXy4IGi=&WF?LRYhjKCI$Q5Y\1MmI<JDRNGFy8*cWdh?/+A@Ti??&>Zw/
RCd&lW Y5N$E8jc\wlmHJLu!m9aQj@C?D4+dimd+I>J/%lTnB>kGmcGq\DVpH@kyX/8RdbbNE%1Jpc>@@Wj$$#S
nbl$%d ?^??DaJNc6n&YeC9DNdh4HDM6pTFa=BBeV/??VAqhTKNjElLJ^<Kw@K+4M^M%HWFQ5P/P/c:q^JEYjd*
ND\1bu D/>c!??HYK+j$^4RFNBRZLVt^M&c58JTb@W^SDFpM&GJBa>^PGEFa+:^l5iNRHEDB@^ehSP%XA%dhSXb
MqlG^E !R+@HX6F<ZkBi$Xt\^jWG+\^dT1yj6QbZF>SpJF+!<c?nRtinc@w%QaNB5bYq!1@Md+#9ku$9:Se6<*I
Dl>:5R !JBJ@j=P+1XDA5=5X<@#uw>M:HuZ$+PK@\YB/JNG&p9W%l8dHLap4e*MD\/?@w9$+@yE&+%4%t$%>a=q
Pc\:q% CSaepNNTp+?yHdN^>R1/iCMPRnLP5D<m!Z*^k85BE&P:wNBkh^eH!+N:njj9Z1&q5@t\ud&X8ht?DW4V
N+\yNq lTWZKTqTm9MWFJij#!yAp>%jj@+=MwwMlndXe^+p*Ly<H1YnS#hyjcaL1m9MpX/k1K&q1c&kyDFIu/i=
@4mnT+ $6nT\SZF=B8^!bpFn?wcWX?S*!MnQ>=*NXaXbcZE*d:tG*HldKCj6@5yN%huJ$hHJ#\l&Tj\ZNmX&\pR
<yu8R! qY8j6uT<A8?Jd!ZnP+nkZ:NTw88iQ/t1cIBj8!wu<iwb6&QtL9+ZI5LPBjthQ8q%Qm#$dLC9>=?aZM/K
*&?1uX !Wl56?GmuPyKhM+QMVp%MT/Gm1Xm^P?kt=GZ#kh/uV^8jZnji99uZ:/Mj/Y?<SYml&SphdHm/#B/SL6E
uqZm6A yYdKmI>S9:/^FnD^kij>%jQwAj*BY@aqQCDqla6XNHSY4Xt:j5*!kXi5=+MY5XJ>*b<uXD!bE:Ety^>V
TIESN1 Z4qt+=d6Su5PHAJXbtXni^\Ab=5HYLN&%WnW:*wTecawl=n+hBdly1i9=4a<#:@qhZCF=p@/h@RM=EZF
mt\cS: +B>S<AEc:+H\XRjhd?R$61VD<6b<VSjRYwZ/aN#MihJX<=D#t6jS>XyMP49GVIF^ZJ#HmT<IVEA!#+A5
G5Mn#M Y&#BHbSk^%<PA8G>j?jGqd4c\#m>F5HyNa:W<?jMZt#@uQ^MA8i<W?b/SQ5!@FZw>+5@>94/Gi^Fa8A=
K5DyYi 4+cESCcR5Jyb!K<:8X6dYZ/c&DRyXMe9K#H\<m@#>dWJp?cK?eehIuM6qJk?KeJbRb6NYaYD!cC+Y1/u
GIMH!\ ycTpMl<RchSDDlDn/TSp*ERGLS5X:^dHji!d!4Vj9Yk8nQE=1Di8>W6VmK/lw*LR5/m5<cLYWt%Nyycw
:R4*8l %qIDM?@4ca>cePRiSbGd1#Ku=etVBmbR#\+@GXFH%qN%9LZILaFn1ta4L=\w+Cl/qQ!PBd:pJQn9Z:W*
RWZli1 %bZqQam:dtu@@QNu6K:+e>jI#=+qJ/QqXwkp#qi?6^+4Nt+#PE&N>$*=Se+dhn8YK*M9$hy1EXpLyuJ:
-AnBK5 000c64c3c0d001202b3 Page 198 of binaries1.zip
TFVuq= @T4aZF>FWSM%q65LRiCa&iG>k/@?Id@&!m4=YjCt!9a^lj>c!udJRZPHW:+lEM<#IEc&hL==#>Lm4u9&
@pZyTd :4W@E^y+$8Y+?eE>i\:5YEGH=NnP%6#<mJH?AuHStayKT1VmZKWN%/jI@#W/<99d?^i6V/1K5%QmwuC!
#G*DiH dZN\Nh1+ka^9\X\F:cW4%Bc11&8M$Phyd#yp+*VTP!n5cuRm1HH\PT>Rd+HSu^?/G/5KM?@HSF$P+#<d
/LSlVG +PN^$6Z=8IP6DYq6aGPLdy!=i\iEwN&B#MJKZM/QN8FGRJC@:pIq\\ZbIRt6VjWX6W?dty/WQ:^:$jj+
ahqlQK MX9*+E5SwYjQiJ>&D\kLD\$J>CG>Te<=:l/?Zm@Hlu@*wh8CZdk58K//+5@a5+TaGFwMiXeW^Qm%!QC#
pn*4l8 Ab+u:C%Mnhjc6+D4@WJ?=e>bITkkIClGh!8AyT#\>wVRhLpbB?AJ5Sa!<WH%QZyEmp1c/At>Sn*a<BNc
XillH# MHQiRwWq>KW4>Fdy4>RbiQpH@Z1q86w4iqI#bp!jwYS@6*DTPcNHhN>Yiht16b8&:nDih^C*w<jBuZ8l
J:cn!* KL=XS&L<CSGCXe59Nm:KNq8NBK:ZtLyjL&l>qu9>>N=qQ?lj+Stw1M!dJm+1Jma^V%XXA>!^=nJn6!8b
KjW/&T nY&=aVadNF@T?bi8Ndd!8Jle&hGa^^phaGpA=LQNF^tD9&D1blACH?&wm\84q/D\j9M<cHSVw<*/!:R%
wMa9Xm @!EjcjTFwNFuLdJ9IV>NjKc?5PW5J:p=?EVwdt\Fu$ERjiH@@GdKbL$ENln^Z9A/5ymm=qd#!#Y9kj&=
uqdhci L+QAa9QElEXEy<%Ay?R#bccB^j:CZ*NqBep>q$ha\i+8&kGdnQnJaDB^CcVbee^j6BnS9+TnF?l@jP6B
?j^S>< euIKpWw<aKc^Q*maQyFBkudQS8Y=6HT<!Va&lNL9^>uZV!DSQ1yJ$5e$BdSWX&!\#uqkc/SFy=MA@:Jh
b=C=WY >thne?8RAMWBH&S:N5RNbkQ%lL5BYEM^H?Du41&4k+T4n1$+H?Zh=R>4QtQ$JTc*%uyi6D/6Ket/j?iK
/nNY=A 8j*#V+#Q#C@<4ahta$wXd:\jBhZP%?Y%hQXG@R:1^&eGNlL*?+AN<&jPt$jNW=cjyS>e<j4%hVenueYL
iGPdF@ hJclaTI:nQd5Q&B18u@u+M8@+NjX*q\#p=^F!Y/b?:B+WlilmSD*HVV&H4b&>k!/iDM?Ldi54kqmL>d^
id!HFu Ijb:njehQ^Qm:?bmd*bkn@F?\&Z$=h9N:K!PtS*c8X^iVG!ip4ITwTS@>EEtB9@Nq>?nI:??9i68RSPC
k@?$K5 ptP8l$MY:tlq9P\6ZWBn!cLFCn4cmkwLqhZG/jM%X?!$5EeBQ!I1NmY:8LKlyd9u!<@l5h?j8y81CnNR
1?SPy\ 8Z>I+DJ9h#huB%54C:PnS+<ePZ4M*MIGhe##QlMcCTE@4/#1eZQ:m*hjj+%A:9@=dZjLE*S/j9bJe$N%
&Ke@6R =YP!Wd?tIBqW9Ltbm?<F%HR?\NQh=@#F<A5lj\K?6&j^XMDHq*<cWNX9iYp^BH\$@DdtL8$8iWj$>1$d
b&yYXu X!?FalX96u?ZQuAQC=u@8atRmLCRAN@<G?@GIj@t:ZRZqJCi%p#%pb<I9Ia=AndIC^A<m*mu4R/8iQZ1
E6Kek/ Gn!hBhJTMnQuLFBRWhhe146<^ZL/Q&8+V1t&JpwjBK1plMVMl<Zw$BXhF$TL&EF>/a4X/\^R#$B$qtb6
6RjP== :?nC\EM8lNla%KM&aIl/FQIuSNqEqlBI4^@!nCy1c<!<etKZ#k@/S@RE=54QtCa?dhw5ShY9hIGql5jD
IdN\Ii $^/*F%%&&KV=k5/91Y6\$DEw84Cq4bR#<b#6Xt$tuVb4nFYHL$KJpmJIYTDm^idhRGX%<beDRM@9MX!:
X%Aa<M jKuYEAA@dVIyu=V#5^dc6*#<PQGJ@M#d5w?Zu=?Ql&5?&+&i+TqDNaGlQnI@MEHXV^y1J^k1/BHLWQPu
LFqH>> CRkKCw6Nt!+yJTMnK!enQ9D!L?8%NVhYe@QCP*JLyBZ>ha:J>^#W$ZjkBH*ijCV\Ei\DAH6iZM1>?<qp
49+?B= ClQCQR%pQyqPbTCyV$Qm91A\Gaq:^8kkJPph%R@CdDiNc+%yM8knkL8t:kEu%!N:%!@Z%lLS$n>\MmK=
:KX%qA 6Lt:=#MEikaEi9c9D%yJ!M<jQ!ad1MeWkE:WW+@Jil4<Q*6hdRML>?K!yI@@+I/&&dydu%aXbTVhmnB#
+iY6K4 cQuI?MV<#Q@Ki6de8jI#bcWTZk#D+kySZ:=ch&!<>>Qpa8L&ZTtHCwPw?h:kVFi/iB%dw#S*5c1/68+K
Nq@=MT @R$Gl66*G?*h8<>+&?DLy4?\%<S5pJ+qQ*8tuF#C+*@NhEJu>RE#l%N?wXhnW4DGj>GDN6ZDRw+h&LuQ
a%&qLC <W!I4+8L*dH>^5b:DZVwi49MdT!PHD6k1C$4Mt*lEtXqTtt856IiXDiQiQ@/i&#+=>ei6B%ipIF&*aJR
ttP/4@ %t/w@bLPy/1wwKT!iN:58a5b>Qqc/\=cP:JmjFI/1Q9tnnijjk!N>Z>=?c!/MD$^G4:S%=**BG5E^eED
$$9Pp< lMuY@Yl1pIYNk/8:d@BF!At!m%B>dTj/65qD8!e%=aYJF=<*%n?1dunc&FCiGSjl:&S8i!4\WtSwTLC@
D^$j*? y?ibm=jCR<?ni@!p=%\QV&@@%&NDEPQj9<HmHlL&Kkn^^aY5$ca^h?+A:NFm1Mu>^bAk6Hq+bN?P%jdQ
/pIkdM QyAj^#@^9#IVunbNVFmAN@:F/Gj1E*>LmIDEDJG^<i<jJ^e^q?>KAY+iQEq*Ac<iin/KM1LmEqK!M?e8
JhA&?i XFBYWch4LhXh1n:+En<iuKM1%XVj*TA8JTM6PYNG*PM<<McVRS+ipLI8!+u9M$Y<&#thAN+XSQ/Dh^/I
^c@^W& ?eKRcRQ!DFF&EYE6^Q!/I>/*T65dHq=!M6V?Ri?By:BIXkKIq=!#1BeE@Z4L5@h1&p8nZLb1hhH=6Fd8
whR/!V 6QCMVH@eYe&bE8c+Zaik5/6ICmF%#+tDQA6=l9CapJm\ZuuH+?LW1BCQ+?atP#bACn@+##+e9pE:b@dM
QCnnL$ ljdN5Fa@Ey>+Z^:nF^EBc*G#^ZeQj?J6PVhyLRJ5Sd#n:yp!%p=idy+XLy=H%!lK<9H^C\1JAMA#bplK
9G!%^+ Te9ITI5Q99kH?c1:/:pFlAWF?Qqm/:F4SQE>=Z/T1++Em9A!eqQ/HnE@^KCpWqL9J>&DEJ?eA9?ty1Di
nLSJIq mk<ikM^QI>M=$S&LLIS?SnyCj&Kp9@jn1>c!^DNHX+%4nY6PAQ1EFk<h5qN>LW&/5Q+cC:@dtVWwI$XB
9pNEt% Qy6m4!%/R6SS>TR?NTj4mehEQR$?b&5wB&Yj@/mk+DM?Pb9G&qd@?AaH^QV+t^iQPn\naWW^Qkt<5bch
F:ZXWR QY9tVDty&A@AQ?MVZ?MFbY&hW%Vjy<pX^ZN?NiA:h<FCZ!Tk=Giy1e&XZ:lIEVYZY+G/!&$^*L=#%?+h
F\pl/y t+c\tTcS4+:jLCtL?89Iui%t!TDeW!kyWW>u:&EdX=>#q$HeF%XB6H&DN4lD#=pi&dHZ?e^bH%hu8&Mt
/p65N& S5c:%&uS>jhaYB<%QYymwC+6MtMSME<1#%E>qw1S:*n:6Z>5?MiZ6%*N>iZ=D^Pn4+RGipJT9^+6KHZX
@:XV@* JR9t#J1#eAEpuQN%6=ub8dmn?B/ZtqPKT%>:B<d/9:=81TuKTL\hiV:R$<&J%>dm1Pu?jebG8+mht*eb
iDuLnw w!Mqe=9nJ##\ytJGjppF/nTG!9qShS//?@8w/FJ/a*%%SY*Dp!jXBTt*#u6atnq/u$jl@a!9y?>=%D$4
LCI4h% \N8d>KI<=:4:?KYk*pDjQ9Y</5Jub:XwGDn1uy&X@8B?@N*w/Pq*d1PYi%emLwREiL5h6#!$h@6Kl?d*
yj!mq< <AA?Cu=/dT+wlqwQ<Mh<?Dn!md<^qE><tnuX?@HDB\a5aw&ipNZ<?PI^ct@E^/itPlPASQIW%aMn=6W$
VDB1KI NLW$q\^%@!G?S1ttK6=AdLwptq\R*J&QZVKP<EpJiw8ZLq8%j9P&*Z5QHD+G!D5D<n^KA8l84wAA/%ai
SdDZa< W9deGHp^mQL5R6K4EQL4n@yEq*ZWy+dbG&n>wL?t</tyKMtn#lP#FH:SBVV%VH%mH4XZSL99$8/k<?y5
4J8=<4 PPAepqnb&eCXehqqq!=wYw+FRkICE@<\n%wIMVH#eti/u%Xp^$d+8%1b:pJ*hAd?e>98L@V9J#=\ju^6
m5m+*+ ^m5MHp1Aq#*t@aiSn:^QJ?&FpTh:D4:>c!<BQl+i5BejL!?jkCD/heTuTdC\q^Id:GcbC$FjZSXu\MYQ
CD!H8Y 5m9BkK=@IqlT\w4yj$M>$9X5T5weL^kW><Q:>^KV:8MYZG#JKe^phwCiVCMk\Z?Rmwk9VK1i*MtD>LT=
w5%^!F MNy#u?/+%wVtPBA@45YlTXhZE>dci9^<a8HV44ijjk#kKM@:ISH!>81ct61JP11Y4EP$E^D%G$wB>5LT
>Q#$E^ %DwE?@TyM#T<jjewQ!*8?wZD^=9J>\#Auj?XldTe4LT$nGSP*@ku=pji5MX1c4HWh>bK+86JNbGbPS9X
DJ+8@y @qCL!WWi<^jPtdhIeat1lycP:wyXc>b8MNm<bT5/\lu1^9=\ewM#$ZC/qLRW=DbZ*^hPtmaXVJP+a1tS
K$hcmB 1cWVE9PJ/jpX>SA#w/=GlIiiNV&\db@LtYA9F!jd\*6*G?*R%>Se8<@C<1nywV$dqCZFbBSXqm\lq<l4
AS68=b 8$/S@1%@jPnH=#hw8H68Y5K6mBCe^K>1yXQ1T14KCmy$88d1jXdH*ZBa9+j:THc@?>a@N9n6dX6>TYdT
LP:P6\ :e9wP?\5>^$%NVFGVdENNt*ecLB=/@dhi@ajMwie*?j5ycn+NHSC@\VW@>jjcNQk*a9Y^61K?&e4/19L
BM1TS? KtwjN>TXbebFB4ke5*RLCL5Wm1c!iJ&=GBEiF81Q+#4qMejLw&^$/Hj9q@i9<VpcT6$^=HubENiVa1N9
8:hX@! *=y?<>c6t#jRQQFkQ$>ZB$niDjYPN:>n\4QljHqMWFTEFGdul!eDnye:nE>W=Ad%ndXt?h/ttkl^<\yC
dP?1Wn &ptKWcL#lTZ+lWRlRpuL+T9tm^TWqm^SXhNRW^#5?9NkcyT1KlP&mwlLVIMFi8X>Ae5Hw%YdtLBmpbd8
W<?8AA !4YdDHj8Aek64B&eV$:RPRRElRVJQ+nVlJtk8NpuEX?<EmN?#P>8SXhNewn%ipC<G?#Qwc1$TPWZuX>u
^h*$dm q>8N\4c/PB<V*Za/4=diVl9@/PK&b+K=%>&Mq&uT/ew#5QjAnj4RhS^SRkV>JYnHVuS8hH6>WjKNEHi:
jEtE\6 I<bdWNw?<Dip5$:Y=GjJLZBwI6=N9Pj/<QII4!D<tDSi61#i+R?<:!?Auc=V*>+#\W#E&%ty?!d6lD!t
^nFjS? mKA+D=<k?Cq^pB=+WA5lTWp6qSRd:QwH:e4+4X!k+9pElC/>K<lt=Vy+lC>mY&LGj:KhA!w?K!pyQmtJ
yN:+pQ ia>^u$4tTpH6p6PIB&R1DZPhWA6eM<iHj*%>%>&Rje%q8@aEeD$GZA>4Citd8q>N1&lF#cl\@PbwV1+1
N>J%h? J!5=114SZFETQmnR:A^E>hQTjKC/8CVy?^VX/GANd<4ZqiYt^q\NQiVaVL=n9Ce@<L<+NkMAqJGVb@RQ
N*MDb& jiC?8EBb1YZmG+qNR4*q>XjAJ+YLFEpFT6Fl<WLWY%AFXk6Tk1nZPALdaKQ?WBhL+:APLSJ*VkM@KCW*
L4HMW! i/muAI5eFL*9Jea9%h=ya8b\PmD<Sq^c:1Q/=5=ZKD<@j@cR!jb>4kHBHm/P%wj&:N!>dSXhc:&J8Vqy
$^5NN/ !tip9%lCXF+bHmc%bI/KqnPt81t#=>5A/PhQ4>9^yu^<XMR=9>NP%5dLu>AZcB5e6ZX&>#<HEj6Bdtq6
^pj<<F W?jdL:>Glu9j6ViWb6%nNZT$QtdKc&K$je9G>Y6Y4!JZG1#YZ\e!%hnp5IYhm$hk&LYa=I#e+w4/=k:Y
-AkYNA 000814f353f001202b3 Page 199 of binaries1.zip
N6nEy# kh:*>!@dG851dq?94mwH@X=ZX=tZDCHd/ym>S@DF<JDkM:=i98e9Z\\L>@etIGLQ<@D!P98SFdFjkpbu
Pl98Xc =iQwFt=idmbE:MTa&:h8#alCp#<BbyTS8>mcHhm>Xe?^1ciHkGjC**$a^SeS5StM@uGIP>\ZiaYFup%<
cK!?uK Jh+SQW^+Ik8=iIA&<itpBDX>9wTa1JkET&9KwcYG4t51LqFSYR!4hI4qKwA=eae\^KhyWnJDd\8t*C^c
T+&kDb yp5Z$bi8$N?I=1ajPtyy:iB/ppHu%J&mtTtEYt+lqpiB++Y/mPMNb9/^qX%XmWHt?5B^Jb%jc+NNYEb#
ZWa*Kw a*Lkad%YPw?P\XH*K>uN4WKFN>%NXtnS/R6FWPlD6%i+$G@%N#wD9YJdcywibebe<ue&&:h6@a1qY9&V
VTMtD? \XpE+V8bk<56eG^<T@R\*9G>:#LqRR$VSCVaGL?H*uPHk&GcJ:+!\T#pG%/@KeM\JVnFSWDFnI19tma?
SZaYd* VS!W6iRMSC$&B?6WLYEHF!<j9+CI&PDd@H<Ce9#T/cJVRl\u*+ncWAdFtSiZGJ@AVKV8WaA8^*&R+&R1
GHJmw: D&y%jn<>N=jIa!?+Z>bHCiL665>9P&9T\t$*np?TP/JF$^dcdBq\N@h^=&6$>*1C!KcE16NKm>Ep/WeX
QHH^^c cBw$YeWD\dt&61+iqDm6u9ta4c\Ae8:<$6LWV!!Ay#dZP=91!uJT:q\=h@B+E\HLlZnQ@<=PWkam:?#Q
%5YuKY nG@D:*t1Qie1LHw%<IHE1+Y9%Bd>MnQq=+%@y/!:N?t6Zd6tBX+cW/^YJl<RS=&E==\hiyd::<yRY:F>
MS=mJQ *#F:N:<L%&NTYh6y%/>Ail%<&NnR^NW@EJ&kHVLi5Y94CuZ6Dj9Nnl+\Nh&%e1GE?D^XhSWXTyXTt&$^
aJubB& Ci5:kHYkD<FcZbKhEu9na4DQ!iPY&=eC4C8MLB*e9M=e\JG*pqZlN94njijVS#uJ$bEl9mehLI@5N?db
c&FW:T d4BiZ&?b:qJCi^PICdTJbL#@mNZ^p*+lphFJcc#mtbej?!AX:@*\14*yeiYX&LLT\wL!!14K+w!+!DP8
Ymb@8? ^<!ejEJBZReFiHpHZkS=jh+jwV4H\>*L=>wwYQa#:5ZdlP/jQTw4RRhX&St+IS==p^bF*lC>i8X!iMkb
#%ZDh6 u>QPN5j&:>1<@HkVCT8T?a/@^$yRFGLy>E<V*$di<:/4<8RSEunX@=:AK^KM#<9N^<<9KDLKJEbIJmFB
dk=9<c El*c<^RWFSeMh9&B5$1y5mJ=9^A5P?tbb?AbaH@JYw=^cw5%6QHpP?N>l+=cwLtXRPh1IPAQuVSlB1cV
ppTDkD VYRtE?DecBERZ>NbEih@SE@#B:&K#k@T&V?^4nW4^GLNe#wQLp=@<Lmh4@TP><GXAPeC+ZFYt\wSG5/W
TPZ!ej YX!KTN1$%lde8*d&6M&BuS9%hLX?a!#F%FSX$W%$Fyc!<^$c*#DjMuy+*%4!CktLVJ9&pY*m/@A:upyQ
jCbhcj HpGBq@*9GY?bd@ljq@!^RT?l^&^VFJp&ZWJpwQMjFl@hN\F=LC\t+V@auMQKJZAEnXMVSVBKVtdFLBlV
mbcFKF tSVjSE=5jF^<RtJCAyHITGLHt&K+S>V>DGaiS*=l\p9EI6+Ki>$PK8#a/u>aZCc+&!u5j8p#6PM/lMKw
ke=I8A JJtSqbidX%CEtqGZ+jqt1C6qdR%ST$FY#QGpNB?^YFmep@qjLLa*wh*8/M9BB^\ctY?bQhR:@y?Zb<&b
iN5ne* w*&b\jn%pjGi<a+:\*VP\wX>Z<ki^q9mDX?/mbT5*E#+b+I&#lkk?5ujdL>?M@y6imLWq/*WZ:$M4aw@
?=Ie^n ZD:KQ#NDFlKVZ$PhJht5ut5wmCca1/:j69iw*Rqj9QQFAlNEaWmk1hHY9T=?@1ihHT^NAe\688yLN^$+
A8iKI1 iumj/j/hK?bNt:=IZWNNnXKdw:+1NCWVFZF*9j5?mMyXZ4W>1T4KVI/=l9i>#A!$u6IZc1$#6ZE/:R9T
9>nA!& F1JwYV%Iaplj?#>%N%Zty>/>E8L4B9y#:<:NZP6ZLX8Klkl9$NVT%X8#cb9^RVM:X?>kWMRRR$9Rj9m:
\dZthd :^C1?#/?dt>?ZBZ!5DA9M:i+6L\5?@:NC>/&S/^P?IYGuR5K>QQ!CWHNIj%IL\LW<G^Qn:5wkH=<?*K!
\lj4J\ #*lFYRu1Bb/hmYh:*!cn1B9WhjE4pSFl=\LSFbenJn5Nq5F/jAN&:8H@GT+lKcWcny:CGMka:w!D9EKC
$mH1K% 9b@Sk1Si<#@el*\@@DM^S5BDIH=V9/njbQ@$*@$>EZQqF!^iQH?\p@WaWGtKW5Yn@EA^Tip=N9Akm9>%
/1S@kY pPc1!84c!%i9&:#D!MV$1KY6+\pQJy%Le<*j+Iq/WdH\bBib1+tC=!cLM+q%HYW^QkiZ5@nW*8+YXhyi
KGH\Pu Gtt@WdPF#4%my%%\auWZQ\JaH@Ce^e<@kjtpad&Ly4TQCAqLu*yctl+h=86$%MlkNdyZVttRCE=Yt\mA
CiTjtK e@bMkQQyc!bak@hH8KnE>CXlnAt&u^>GIBhIS:d+@8u6Y<ad<nZ%T9Dl*pq4nI<NDDBlTVJ@5j@8l@@Z
qJZFb? i^5lLTRtITE!&MH!XK^1qL^AQlF^Ye8jR^%FYXM=AVaGbMAwtj$Z%nRt^j$%Mm+tNm/PnCekjuIp*WNy
p9ECYk LbqCJdMuQaVACdRtn9ilni8SAXmJ#$9n@A+5S=y*qD+KtyitL&n1jmPny9*%l>=?CJ!9KIy<RW*98j4\
1KNc+S \eQ$#P#ejD\6w^T+jXSbTXSS%dRc5w/#@5tnAlc!D+9@L&TVdpWEtS^@T4!biM9i<+6JWN#M+h/QQV*9
=mlt5B Su8+w:Vq=?5NjmHAQLBWZ6*Xk@AyJ!5u$<@?/i&jI*#1BhXN9dB=?cK:8<B5pjd!qT8ZDuZ<!Rk1H#&1
*T98RI iQ/dwlm@Q#+9@bQ8w^Y#Z*Gh+b:DNmh<R/:iRb9YVi$9eH&t=?:hBu6hjH%QPn6aHDVc5YPVn41P\aEn
qZh1uG B+$Q:68tK!<lyaDcA5y9mE*JAG/d8>:%R1V:@8Hq<+dK\5#:h/=iPPQycuhpuTb\1:QN*N:XM#D$Ck1w
YtF6Ee Xik5/>jwIN16Kp!L9Z4i#<*B@KC^+adX:Ql<e=&t>uJ>k^*:Dq5=8RiGZa?>B%p5!N:Pu1@>a$M@WG8c
HESt<< luT@qIhyKSt=BRW=1VGSRY:HD68iDL\ACc!9q%jAlW6l=$MCWCCqQPVhQW+>GQmJP@T$ViY9CNteVAmp
J:hJhK >?JndyE*!P9V4pXi9uVldIAZIH6+:+=N85ij9H:NiEP<bj5Jn+EDH5PHeRmh*FF19AJLB4@AX<Di@Hh%
G@5&a% 8NHbC#@Q:$<pQBZYE!C/$XPR/Cw+Jn%4*1JFe+e/@mBdwjTw@NH#Z@kJ6JVp@BNR+@e4KKqywT&1:YkW
$E?ijq yaY6$$q*aFbLp%?I^T!Byp/l\!JSt5m+KE&iTSjRM4AM89?+9TVc$$T*n%+NIXZj<pJtT@$h6&%c#?ne
TH@aV$ Pq55@KLLPuq4:kYb4>imK+tSkC\ySImM+:Nq\FW&8Cw*<W4RTY8V4Y9A:m^eSj@mPkh\uij\lH^Fkmua
GQ:Yb1 jnIImy$=>J*&j8k6>\&\k@LAb^JRbd\Tjuuu4!HiwANq<mZ6BhqNhaE689V!n+pKmpqME^q5@+jY<pe6
T%5hcK aIeJbIh@ZXie!TJlEhdi$?TPM<I%DuD>FlF:=&=MLBqH^DMV&BPV:yH*mYV1*lT6BauDjc!>b5mKtk8n
M=!iQ% *a%%YLTPAc%5&kcCqthmC==&9@*<e&mMTd/nS8CBCd?@FBiZtJV<+GFtXp=PZkFbKF=WC5wZ>T8411pB
9#&I?T %X6hnHp6Kp==mumX@wjZy#Z+lCqw*@Eu4%/l6WK>bj9aT@^m/@5+<Jddc@c5Pc5@jYTCjbm9?G:Pl>>H
Q\aF#R XpbY=mj6LhqF/!R:!HbcG>qKQchccM@Ib9QDC#YY/m/n\%Ky?+N1iZq%/?6ZZa*q?VubW?IDwt#eSwZ@
X@#TE* ajW1&t4&*LuDaJ?Vn/?dp:*F\h*d6/*ZX6Qh89?RmjGBQabLb$?ZW!bAK<%iG@&HXb^B9pBuT?qJ$bGl
$Mil\y AS+861c4u6IZcc:eb?%+$kihC/YmEQ9mR>@\TF>Qc%%Jb8KNMQ?VkP48#Y6ZcNM$??q#6Xi5*YJ$$N#l
T9^^Z% yN@=1*eTW6BFDqcF!9CQ#&?/Yy=ti5cRCZLJD#M#W?N8lH4dH#ym:^+EtQ4=iHwHlRGtb@B8M8W^*>*D
unbG>K $/9<h>@ZD&>i6LN!W:VQlA<nWG!N8^N%@eb%<y4a%ekI?G$DQN^A=8@h5XH*iAQ^mulN9GH:$E9?bQ@X
MjRYml >*HwLjYG^&5/D=@G^+@AKSNYI?hNPT=ijyKQp?jH&!=5j11NcmYjT/PT#?cty5QT5yBY#aaXYn6J/mPq
6W$*$5 <4K!/8i9ZuW?Ke@LukwwiIq8YQAQ1tcYhm/u9Bl$DmX?IekqCRCX?AhWNmq%AyF1jVc=wc*\=tqnHWR1
ydtSEd u<=i:+V/qqT@jd4NhG/6>ae>4lY&<V=PCdE&$NbWFl@HLhywIKL:RjMKC!?=Wj\AXMu^I#5lE>Z<mVEX
PY?ATN u<IW:^LL#n9i<QIqA?\AXmB?59h?iDQ+l5eVdKD?<RMR!9lnAR/i9nh@%l@=jN&pASwQm\1ImI5LDdd@
k5=mNT k&lbYSW&RFpiZwBVEVX8k@#@\Yk+MQwn<t+$REwCya^+:kTA>F:Tjia>>5RHLEcVB9wwAd\:@K::ce=%
!aC!:i %&*nGNF^#TE6N6%hAp:lKiZQZ/JVwAumQWYTa\SF91Ztj#^@=X4W4V6^TYkKR*ytXubPHpVZEp^1bSWw
4X^i&j +6ICLITLTyPGQ4H8Y$^T?kKjA!ji9Bm+#/EB#EP?@9cGJ>%Wh8b5*i+i=LtIq?\^e&eR$8\!$n@a**d?
%?SJa@ B=nWM/1bc4I+PF?N44%WHSutD=qqycm15\Cj?9/#Mt!%%Nc#$GRyaED#FhwdQ8i%e:9BHph9H%eui@MD
ca?BHB 8:b6ZcPy65^\9?p?+@*Gt#Xu#bBZ$TI%Tjy5@X9J\Gb6e@j:98HS*/nP+@Gn@IiJ4I%it*$4kE&6nWjR
XqCyZ1 J6J=hM+EadTn=%9@&P?QuR&kY&>hbN&#S<1L@w8?WX69\*cVw#c8*8e8*+yFF#G1eSw:M9L#!>98=+*b
ImZj6! J!P9*:kbp*n@j6#NmDPuLQaDtIF+GyK:#>pL=<<G?*q/wmwPD>J>4uj\q^@jQ4%:%hZ/y*MdPq*JVIeA
mCIyF% tlAdjiQc>i9EXhHL\GYR4+i4k<YlQh5*/Dk$EGB!^86jd*kituJ^<!y*9YY<RmP*?P>KkdLn=iYDyjkZ
X%1c>q SbauyJ1tNS/RqJ+=b?/5\Zb5eL\Wqe4\!EbeHM>cm/t55Gt4NXibBiNP*KLX*9Y$D=QP1cEAtTkVl$%T
eP@16X iPI9nVQWEI&ddWIiNLdtZ*jd1h%H4/H#cc=*8F4WZllty6hE=>bedZLmWqaLd>QDMIh68pAn!ejG#$j!
\+?K15 p\J5klCDKcESCJ%C+y5L5tInA6$5>^4w/Yn>?AjJ1aMdtdpPn%?<aL+ei<X<QjTcD=6A1jQ6K&ASqGK*
MW$E@b \B<n>L:GNpA$5kPNbQQ1y5dGy\hE?IZEkMi&KZ>W@4?4DwjMlDldVhFJH8Z?+jEc<Qn4/8*dACRJSDLm
8/5BqN &PMVE5cVPBJTe9KJQC1jLipuC<djZ*8/H&hGPBm\e6E^BPQKA\L8Wbt%1B=keJSBjkS%P\k\91Qtj\+K
!%C%j= Ck/>iQuG4ina?KV:!cqyD#N#<DkaABL6GbWZ=4Mpd9t>H@@C?QpjGQiCbbk9J%/Nkheij<*n4!I*e=bt
>&c>iH $^5Ct+a9ij=$KYqy?Qe:??8PThQ<=hG1<cuSjBX%VW%XYB<%@\6p#1SyYLF!>=KXG:bDV84tF*w>JyYX
kWBWMm p&ImjZacdnS&<QJ&hdR#*:@LeQN1VjXqlmaH>^n9M>/pQuQGjLw&CW#PZl*%Z$R?1!@QT$6A\#bQP%u6
-ABTnX 000ec00bb75001202b3 Page 200 of binaries1.zip
%I?!EA %u%Ku/?:$<IBuhFen\Zm/%6iAtFDZ%<&XiTt*Lpe:PFpcd4daNXTEwDW%>VX*&J5c8u5GZRy/t=mYp=^
j#/y*t beQ#F?mNj*%>>/K6Kh<y<P#=5Mmw/N5*Ly*%QH=w:&HWq<nH&@PWl<?=pPAkj&<9$yNEPHwF98u><9+N
CVCC$N t6HE!pASnbtb1Na5Mi:8:i6Z4%&nZTY9mEYADQ+HTQ9H*TVajSDe+Qk4Hu<qdt/iSW%9J5DtbLjAjSp8
YwnM// Hq+i?Qjd/#@Bae4t$^8jQnYckc:e!/H%mG!PG6kwAbQFtMqe%ndAXIDe4d^aYRMT$A%dh8+=kE?e*j$R
8h8IA+ qI5E@^NKNqGSMXG&/bnJLValcW*Qe/?/GGylJuWQuEq6jl#69Et#pe/%a4eDEM9jpl*ldLSec<p$Zl/T
p==DYR q?JnhVJql\A=\iw?JD\5JCm&J8Z?>SAQi>Q6?44\Vu<X:X<8:i5JMMR+PKilKVM$9mdBDI^8pc+@h9n/
VYy>Np 14&>:S<11cdX1BDATIljTFSMcKB6!nZ>8@c\py$Kp:G:qAXb1ih@:BNhaXK<A%h9*pJk*mXmtLFWHC&i
uK!GFL VGBNM?KIV<uNb?c^=!h@B#mb+$P@91BN&#D4hT\+^#WH6hk&Y9CjmT65/u:*>hj\PQGSwyEVBMteIGnA
w5Gu+R y@^ZL^e*D><#IYG+Q&BMZMK>=AebGbCS=kGlkGkJkiq<hP@49\uwZ#4DA@dc%=NkH<dL9qi<h*bKAb6L
bmt84F e5B9\>Ly=m6hCF=GC6n<B9utQ&TT#ddIcV*hkia:cckM69%jbQ/HmLBd6un%^l$tbk/uAm=en$Q:8M&h
lJ\N/$ LDS>h&#b5N9i$<9q8J&b!e/6B15$%Faa:n6kbL^*>\cXtXKL6JiTAPj5XXiV$*NLc=>%j@mBCP4yRkhI
9?@qkq D?KnLy*%Sb8+&w*$?b14D>k+ujaLmdmXtA:B59Qh><HSH#*Qeewbk8/<GSt5%CdwQ?t46QR&:n^k:8Ai
b\818u GI//ntWXXn^?%9Z8?>AaIQ?!9duA&8tpl$>R/MYLF+K<ZT#&Gbucu9SCF=>PuQaDKS9kk@iGKQj=y>&>
SIi8S$ @D1@jWTh^=wcc19^*lDKM<Elwe/9$Vi9Z4q/qdyCSayFRHJ>B1Ny8tjdBl&:?m+t&H#$=hA4nyjSP*qI
i>N@m? dw:bPc>iE4Ap1T/l$yq@%!S4ThJcTE\t%Wk>ujbp^*SJpDS!k/%@$C!qTlS\uj/@5RIea4#65npKT#TY
CEtBAy /8q9*LwL6!%%P8u6D&!1#@59NmtMym1k1d*XLnV>YW9&bejNAFR6lM5NL4e1Yl@/GY5>yZQyGqwHJn+Y
C&IBBP dM8@h6JpyhaTeVRFpiRqAW+&hKiSZWlReB!VKTC/Inw/*M@F*Hnne8*i@\XVVtc8ZS$BbtC?tHk=@JIh
<N?<&m Y+F>X9dL<Y=tq$DJqAt?9Q#ntlCV6Ed!KjXp^R:ewX=wwQZ@lnLn4&?!ZTaJ4@!uytu!KAYwHI//kdG<
SaMTYh \\R8SYLn+lQm$dDl^ITEPKCTpeiYNImkHMPu>yZJ=<^ZV$E=yMY85?M+j*lKSh546B@EID>D^CTIWTaV
P>j99b 1H^Q!jeGHD^1/iD1:l%+NnR<A9Y4mEHVkFl#\qB4<$p1:*@<D!yS*ZJXaV1t$1/P^G8p:!Xjt4t<HJ49
ynX@w: >cAD?T!mm/@biL1pyBRPtc@c@4GQQad!!b$hm=XW%hTWl%ybWtKK!pp=>c?YYK8+jM&YZRe6Hh%^6VK/
L/Ne%i h>n=BtQy6*Q#?y&&Hm\5h&\%$NNRZ:F6u<p8+:&:%19I!Tk8%TGZW64!T>ji?5Qq!Mm94&<:t&yLe!D*
@\tkmS 8^n5+?bk5WY4pV=Q!?Cwuc6u+IY4h=P#T?6dZpG&&Q?y5/E$M#E1#N@N>5mi#c8$tQRjhHZh6aatS?%Q
mIEY=H ?whh9aY8LbZZNuY<?VcA6ylihdTW&Jwe5*J\>jD^>ZJ*6V&+e<h?K?iV=AqiF?iV9wH?Qn:iCE4TuVw>
$Mw8!A !<9uGY=I@8^yZR%4<!eH*ebKT:tjGB<VHWXetZ+qM9L!yjAL=\J>*X*5#FqI%uWTZSQhnBiDL>uV#GYb
SXNu>V *G!y:a^8SlhHb>NPLwKHA!LqT?K@WKTiVI9iITEyK#hVb1n%4\NW?1Qd@4lA9BdZKm^WXKYnpwX6Smct
W?/m6L ^/\kp@R=\/T#1e8Vkk\<^PejFtiwa^d6L&T$QM8<=LAJ5<m4c^1T&jww\pL9Cb%Li?NS:#9XM>1Ld*pi
H19V8V Z1iqPwPLm=8Ll=5d5PHn==<5W@kyJCk5wuZ=T6Byt\PG1=b15pCe>6<k%ub$hnK/S48yF!M9&B?k*=+n
#<Th>$ 6d$dju8!p?yk^\dkAkP<cQ$HSbaBXnbEa^lFBAij5=#SFI8VPtFKuaF+n%5LmpAE\<m1SymE<VdAPBy%
qI^AM6 I\4SGM&<R>:qaP*<wDnJFb<Rt=\LCya>Q!iJhdKJV%MiJb$=wwi1C<jyE^Ap&XiauPcL!149i99=^>A+
8EWFD& E?GIbw6TDPa+&\TDbMIj!A@WdPL^nm$:>^&&5HiGwBpaHBJ?GVLNtLnEyJT$l^ub&duMkwpC>w4p6+lK
T?QVpw 1j?t<pb+\B=5KYdZiQjAC/+$P#YkpySuV&48I4G6?N1<YGBKjcP>?F?*bZq6\$LFJW6WFAci@+jd?k?@
8cD?&a #R1ZG%VwK%F8ci*1FZ#=F85CWVeLVQ?hB86&&Ll:Pn9at8*d9tZVenZ%Fab:>&:j9ZjuYtW=PYWhZXKH
aIRh*A Ym198!%?E5!Q4B!\w/ttND5q>uw+Qq#bBGDP%h%qij!pV@Cq1IT$kp1Iq:*D\>>jN%jpJphHBLpjN#M^
QQ<:i= %NhtAJi46Xh6Nn=5A/L/eqVMQhS*y:H6>bj?<aHin/?:Yy:eNVDe6i?Rlj%^B#8pjnedHdF#eDl?*MHl
\HAIYL lJi*J?yQ+kp!qkI\==*!>u:<+i$LNEGMqXZtwe&iNNC^>^J^m=*IK=G$TQK!/MZ\$LPBQylN+&$dq64X
TT8K:% pl$WLNAj*i^yhmwMd4B+J:I*&eHi/k=4p^NC=R65:mp&pdpqG1/8u#bhSpbPc8D=H#bLqQ/XJ/^WHkZK
@>SEGI DTy#F!84c!>d@Yj+^\pQ@!AWKYWlyQ$uuiQwHn+V/DT$D<65cWwQ5%$QhNbByN^+I4c8PjHpbp*AW$6@
\?>Mc? @<twMwHPS:H?FkbLNSj#eHATZBDwiju+?BtAJk*C=bCRkLCI&yqRd<in8>j4cu*@=\CFSie5Pbp=hnZ6
>*jQXm SAjbPhbFhI>&5#>AB8BMdP45/mI/tS$e:hkCTC^$Q*@iAkd+!!dX5QL^%jXAy=CI\MB#Fy!q@\ZuZ??$
a/?i/K RWXAeG1j=>>cwj6A=<ThK^nQ&<^w&l$!tl%9?6Dm!Hk1nmQ&Q5KVI#@4Q9tDhh4b>?q%c&tC9?tKj@le
FKMdj8 i!!AL:c\?eW:9N9#bZL$N\hnjG!WPe\%MndPaAKpPHn?NKA9$>?<#jnkWT9k%N$u<N!FT^BCw%GL@NVW
85<It? nQ^CEqFctj#!@^W:>>nXMGG>VHV%h\6iNhYRa*Wbe!@yIGDNMD5+Z#SIT$1TWt!TqWAyZnS@GdX8iP!4
EFIJWq kT+:KCu<j9:Zu/G<=:<h859/JW4L>Vj9NDG#B#T8*4tjXXV%6LY:B%MccGT\h49XKR>uB=6nJ65*d\BK
LT+BD6 >R!Nndd5*4N#nhLM&T4LqyG/qI/<:8:a=IhVqA:@@QKtw:GtJJ6%BH4C@8l/#Td/ZM*XB&*RHqBp>Q&5
QVciPc $nwIu:@Hj4>94!9C16db<5CP6W5ukNIFtm5&:nc%h9WJmeB>NW11IN*<>A5hwL#6dt$1Y$qj4t?\jR>=
Q>?$YY aMc?*Rd/c:d8P&blcYX6ciN$/yVdmXMiunnZ^JB/X4>:%hZY@KS&e8eH*=SNVYbF#&8ZL$hG#4keeju!
u6=I*e ^dD#\aE?y*EA*d=l1Y%Ni#5D%8pk4FP84m5H%dt=tV#5y+w:mE=GB>ZP*9%akMuD^X*b@e<1SScj$jD+
>D*i:j 5c</Yua!ptD!TdqTW1#$l>N@HCQajDaKwny/c#acIpX4ci6+$m9kHESSDSqTpA%Q#RSWKiH^@$LXIT#4
au6AYT iYQcBi8%GFWIyKF=:aWly41Q/b^/Sp/ZC@p/clKDdde9$%LnS?N>8VpluAJYDEk/PjqbXeQDR9#CIwwi
uRXACA AY/YJq9$6L@>D/\RT8jaX4eSaAd+ud9G8nn@YKGwjcKD&e:iXR<&+PT8/QwZXQKJQ14B<FXD=d6C@L>c
C!X4W! YK=1CqRWGqm4n1Zy\RRmp&F$M6NekP4$qbb\FACySN#X/\nXY?S6Cu%Ee\G4MdG^#DmPtKTeA5k%5^Mb
V^Phid LE+H?n/?cmtJ>ht@uMWyA#nqAQX@kT?=w8*%^:/BWTd=FaQK\$TWDR$PpQ$CA+QDI\lYkmAlw51Qb<?j
V/w%A1 6%l6/ey%t*j8NV%tci><!n5A6Zc=GlX>N#+8Pa<Fc*Z!t@<u4LdXSD5VDNdj^Z%/$:!be%G4eK:=G&<*
MW>&\= QZ@PcCGied#<+m^JTLHN5KZ6I4j!d4P<&+k*5Eu5+KnHNyb#=m>TWFBW?N*!H!H%u\\W&T*y\CwqJb%X
!LuCT= G\#*HEKHnPE*+qm%SC>a8J:b5&uNX9PV:5:&N5j&GY:c5E^XdeXYw>$GP+%*/C9PqFhh6u#b58ZWMwm1
FX%B*$ h?>nZq><@ItPQFA6WZFY<6&4aYi<ZP$P4\Xi=&kbHLM@+SWWhn$8LS>F%d:l+Y<9G<8#RP$GuLR>9H8D
JANG:5 :nm>n//u8*:uRR6u:*MZWie:%HeDJDS/#!<>L>1j%ajL#%XAb6&+chPGXd4L>Lj8P&B//Mnla:bwiwTL
XFG#dX l^iBI!y%c1/*S^Yi*9&+ityncHJ@PmH&Lt4wHZE=pucbnBDH6HwnYk@6&d=^1Y%XY^5VF8XE=*kZ^?qN
K&=Z#N 5&GXRlShi/8J&eJ+^6H<<4MDLF58Y#A=##cLP+%keG^^YkQ=YKLiWk:NGbYY@N*!l>amJY#!!cD!kPWl
!*S9QT >/>TuLXAaat/>9JX/\&&G=peN4P&h#u6i?a<p</nITMMXKHShP!CAylaTwkt!BDmEBaSFy+RbSiV%mA\
X?eCh> 6?E=#=<?PG?l4>qH4/j#ct++Ej9p/X&u>jX$Vq%Dt:AekddH1SienFh1$ih#+MHeQIleZl=iTEwb+A%G
c$HVNT +J*=SBcheLe@6GPN48c*@>&/BYy61pDb6nHcS#9GP!i6AZy*#c*GqkuAqKQy^ce@=8AFe##FiScJ4WHX
mM>c/F /%uK<QD!<\9!@*4&F%!5/ca$B56*:X?yICkklEQ5Q>pw9qXZ!KD++m>j9Za>/mbC>!b=m:4NFZ*u:y&a
4a1QJC GGa5^>&EdAS8V6#+n<pClR?9Yw48i8%d^4yi\>Ae$PLRNZc:^y5JA9kL&mZ/R5&AjJVJGB5i:Q@>/?iQ
S#&ly5 H#>@@i+jHAb\YWF&F6G!SFb&%kJq88:1DX6&tS\!R%WnQyC8SpSG*5$yJwBcn9K5*KHQ@^!D@ki&!GSw
DKYm@c Ca%*nHZ!B>q9%=Cdm+dELTIZ5!@$d!BlFbHNjE*99</VqycTtnGDtME6Lb6XDZ/P4KN11S11t11!MbJD
QdXtd# KtQ^w8>QaAY^hFulj#6>/:$4q<#Z$NFd8&ZZARm$98hAD1jn/wBZ:^G/IWF:N/$^PHdm6JP>NWJ*9a/K
ayw69B t6+Yw=$GP+&&4%ceNW>Dd<Z!=T9tA5Bdd6>Q?!>$m#IB*R8Bu1/&l@RS841:4I/nDq1*:&YYwEndQ@d#
6>TP:T ZY6NRi1h!<Gintb:N?6yIuSZLF&#dd?Fp%e\=KtwN^*p1b*9pMn??8+XGt8Z6AmdXw&?hCqhXXX4=ib6
%KBHQ+ P*ed:#E=ct%qd8j8ViA\C?S/u44SkniPELkFW?CCFI:H+<I9RakFem?JIuID@yC4a%NJ+LW/%MF>B5\8
:AMpHV !5M#\e58=jeaGb^w+uu*SbIQWpA8JmeZD%>thV&&N/&G4Cc4yltJ+:W*A?!N#a*54VTJ:S>lk\\8Q&jB
-APtdL 000f5dd8d53001202b3 Page 201 of binaries1.zip
9i$jDd amW%VX^h9&99AVSC%>ZD@&\ak<+6!<KYmchJVpHLmcAXRV*uJNXb%F:MdY%IDVFj^cJY=&BIju68$F+6
Nc4d>e wFb:k@ubl\I6nStZ*W#ZcY6yKuKSdAR:Q\iK6>!ALS?AT@K#CRkmeuqFyLdbtSq9Y1H%>j<G6@L=e!ca
hMcaqu a:Th%5FpGWREGaRVDQL5GhHMcPJ6@G5Sd4BIXZ%hHVqypJYXSpI<1Q!Y@*9DqEF!y<mhYwDaILL<AqM^
GYtQ1m >+</b1H:uEH^*L>+JjLcnckd#Cn!JuYLG?$yRhAq:*LG*GZF*N#a$S?V%RwjZn+49PP=X^hhmtYCNkb$
bFTZ#@ %^\NmPM6jwb8bw$\IPRKIHRu<A#X9q:!8&B9*+?jCF+ehH5w8iEh56JTp4L!C=hwL6Qj6M*w\GFLi=iV
B\b@bK u9=BkbFbJbnewpiJ9^C=p9?:*^6wdA$&R$8IdJ>hu*#8%AqZQJHIa6<t?q!=8c^Y?W4K!p1L#JKcpWkB
C:lbcH E*d$jb+4J\PmtSj%/=wVP>n/l&K!!nbIj?=enQHZln?lF^p\+wT66cZ=5cPHD?:b11i?eI/m^6IXc#d9
j:DM1W &Ij8^kiGZ$i*bc6\S=!41QRw!GTD@1dD4meh:SDGG>jy1Km8&LJ:y<GP*ab/C4MZcK>c1ci*kq\^i@QN
#tC=F\ i!!KQ!GKQ:%8l><L%^+F+uwG#Yd/HE%>W%5Zn<AL%&Ij=FW<:aC$h8l4>>QT#IV4wd+u4A>8S<&MkYK6
w?BJyT %aatbw/i1CNqdHJGjtuN$@ciZuV5<?F%F^wSW/W9k<\<G&!CNM/!Xi5&d6/<de@Bk@8PujItJ!tih@KW
:MnRX= 8*>D&:Pu>XYQTqt:9%M=bi^hNG*u$1YImCtM#!GM:T$P:h&?Tei/k5A4X:R8?i!@#&C&KJN*kw@hLLEJ
^eyRQk tb=5FP*w?!Rl!M@LDZn\C+uiHGn>/$CyTwpkjZVpMEN!^yi@K#lHCXd9yQYQHD=wDNbjIDj#@!Q5QeCm
S$QWPw !yd%d*Kt!hpACmI=NE*PRWGCkyJWFETT=A\1AkICppGTBAEFCTI=b^AXFbW5=1!wtABJ*Z6@c?$Gb?di
Jm5e=e ?*??b<b#=y^^HL6/@@d:X1%cXV6EAhJ+XW*\9keb:nFuD&?@WLkJBDC>qZYDcZKHH?CclWkY+6ZNRyT=
@D1IDV D!B/yD4?lBakikVw5KF@!j%:Bh=/h@A$BN%n$XW5w?M6iYihVhZkqkT&hWy/Ktww^LS$JHyaH/bkZtaq
Q?%$i% +tlXHA?d//y??4>aFud9H^5nkyk\*CbH^M?Q\heLltRdG#&JHJQS>ajEWe+HW%@j@!ep+^6Ew$QIwHc5
GbhB/l Hn&b/a<nZj@MY\eBCj^*RHb!M&$knYWiY@+##?dYP54!LDW#/%JPdq+8@BQJR@NyRQ=dZER1ymp1LKq9
:1eq=I Z&?qc48!PQ?*Biq^S>FyM6RpDGwcNc8AT@Z$6&hkB>I1/VN\*BD1Q\5@=:@P#Z%GQ4F<u99!:j89^iW%
\yk:mn TQXLXDB$J*#e?AT*:bBRWNW&M4Y$h*D&<ApKmL*SR&b/1Q#6^@@ZCc9dABa/t5q/&^%dETFpC:1XTWBw
XD*a?H B@qTqc\eWb=GV9ueQjBA4a@TQ@?=aLlDiP6Y68$:^Zb@YJq:mA*VGL=%m#T$dhBNFQ=D+49FQ>::N<8Z
%^EGyC :db6&TIEjq&n4h8F6wIMVFFXW^>pp<hejWPnEnML!89c?nE*@SGD?aK@pc:SWj<R9%MAbnMnA\n#Q59>
\teA6c ^986#LRp6+t4/!I/FF1I>4c>8j?FiSLam+d4Sbe&tyMi+wXXD<ATXZ^/RWXD%?&^b^>?Lu>@M*/4Dc6R
pI^/*b iV5h&1P&nKG5dYy*\8e$iZD<#bd8\bHJq*P\C@@DT*mL:iHwA$hlEF%iAAw@u/CIlD!<>A6?@\jM:IIm
j/qGR% N%FGR$VPlHhn!/l/Pn8\tnFGMn#dK!+AXnwNwM!Vpb/YqyyMS6ud>bnhAYM%6@:H!BkJ9FPy/&&EBSF?
$<w=Jn wkA%nwYJmRRdChca1PRmSpkk:5kD6te@j16!5LG!+Dl=?F?9jH=IjtyJpGP*HbBnHn:iD!Na&DEVlDdT
pRSQ\h =>66FSIWEBBElLb6BR@HX8EhWJu^Kl1/SmaYB?&PuuD#>A9C%t86+&tpPRDHJCb!@!DCR4P^mjcjXkmA
lAdMRM eZ4L=EnXBceNnFZ5+%5tt<>dE&:n1VZ5#%:F*b*1Kn:9acYnAnBY+1Nby$Ty1AHINAk6BS$CTKbpaqpF
:+k*@& INP^:V=wbcSP?QS@udmK8QWB+SldH/i85>ptkQCl@Ak@NR5VQjamIAhpdbRE5kqPEBAXDl\=IK>YQw?C
dBRe*@ =^D1MnK+deBXGGLM!M#+j8VjFPjdR8$DCiEYAVbYB5k=lBniePMZ@F6WJw?m/%6D6/XuAw1#e:K#e<kw
/:diM$ p/6aSWCkC!?ZNHaAm689@Q^LMd#Cil1//lWqBKPaX6uIPjb1F@&tN5>6ak\*pZ:??IH$u9HD^<>#*:=n
ZjMp+t $&yIL%C1RkWlSICdH>/D&4=LF1?ld&^?!N:^8E>lF=aJW:jh4l@+?J>Y+KhV=PEXcVE&4mB8KI#d^E%%
ZdyVLL ZwTQA*!pLjAt/!+JTSu5@4M!R1BS\8</XLR!k6^q8DM!@iZ*ZJmMKK8+:j&FH&<j\RI<!MmRQu1RlTRd
kdidZH A@/SZejFh#$jdmFHELM%/V4\DmFta?C#JKip1kXJhnnyBehD==XX\\WReF4X=^\+^iJC:B+hk<P?\V+i
dw$VA\ dp=&bwd/KkBqE$6#a\54e!%JaRp6jWTZRkjX&c=6jKum9!#jH?!wJ:Q5:?GkDZXbH?4!?cV5py1Y@u6V
^Q6th> 4:<5LZ&c9h>Vj#WuMeLj^h=MT\uC4K&pbYLn=B%?QnE>>$wF*AJ^h?#Fb*l#=?Pdb*C:+/PHw?iplRRE
b1\i/1 ?Hm+Phq^HQ#dSWGKCjIaA:%>:tjQ@IX=i*BpTPGn?*iG?44IMNhmb%+A=m9RZtipIipdMCequI<MD@S&
q%yB<k e:T#NFF%:Z6E\uCt4qXlapa\Wj#NVM%?5BCdT$C/\#E!Qjj:p>>&Lq/#&\9j*#+eG5Stjk9A^C@btJMh
^1&YlX *t:n+Zq?1*tV+payEHS6Xqae>y^m=XXliKMhmLGGDy^Da*QE!iYWh\Bew=tY9acu=tblBlVDm&1pnTNX
Wn/nIj /LVJFM8S:VXGeb\nyQkiEGM>:<K:>\w<haj^%KwHR+5al&d/!^Q>:jhw1bAIqML$1=RWXCS1K1DHCB$%
KeL18S 5NlMEGFcNkH6jXw1H@@dBd^B5G59<wn+tDSGhaNA5\:?KbRi^R==X=qyaCSAIInAldDjuRKl<IYlGF:+
^cC#Yj @taWSkL6R*9SH4TdJ6taqS:4&&B:Q6T<AZAnuG89VRJ9E^V<pwK\FQ/Z*<&ye6leKR#k>uYWbmW>M!MV
6$YEJ1 !WI9IhqIDyyLk>Y&mIZW?eZ%GL%X##F/q<n$Fy?%%+DDyTn\1=BiLi8k:Qyl8ytZH?eZX+maBlQZ+TLA
ep\>hZ 8a@9*:=GZ8Ji9Zu*+hQe@M?F=ZYw\m>Rtq+>ITFBSIDE^<1@hcipQEFDj=@J$d\iAP>1P*ZZWMZ:V@?n
lXZEuh n@@BeCjY^&@4$whkV\+/L6!&l^@\9<t8qK!<kyK!m11/8wcG8y1151L9LVnyAkcR:8:E!<?@FldRBeaj
hhF&l^ :/bHN9Gq/EX/9LyhyLCMiyi+?P\R6nGtAcRp+D?T6iAlE*#d:h\qKTMQ:$BDjy$>A<@GJYeZX&^K<j5=
REuyYE CQDF?Pm>&91&ZwE?:1=Ph1cGi54T58y:LW!N#T%NNTYEJdWN>jS$hXHh:V4/CaC&@\Qkm^nAPw?kGL6+
dYXaIV \=hEjuqh=@Cn&R<@MDF84TyMn\u%QG=qwQ\H<K89yGqm:iRhFl$Qh#4W\E6^n=>>lI*<eCeVBQn^+$eF
ue#^m8 1pLR:jB\\4!SS&C4mKmpApFS/&VEthQl+YFlCPB*S*Dw&dA&KMbaCZwV*&6qeBeE?GTyciuycD1c^kEB
Kh<4RD nw$<Hi#6:tl9bcdt$98RBJ=hhI!!#RBll45Lq%twtiX<lyC:/*hI6&u8nL@+>I8$RQ9n*hVIAIa8FWAZ
4NRwqa /ca?KeuPnuDmAL^QBy9I1+D4dnbKNhRuceJlDy!a^kCJEaZ5K1q1/lmC=NkG/$L$D+aTuJEHNFkS$p6p
^qQLpE R9+9i4tpaP5VVI+l9ee%!jRTDpdZV:VEYBMA9RV#kF#tuyul/9SRy@&GY14klW?=t&WbK&!lAB51imde
lE>9+t P85cnwbhSF%N/Z?!m*Z\m=#5RS+T\cNI&cyQBJ\^\DI&JA*<uqc^TA\T:/!DDILt#lkYCb49d$EpN5qF
6b!RQj 8tt/Vp4RA<iNM4KDRMB%l9Z%N&?CaCSyamhaY?p^*h$EF::R+IdYj<>p4%yHGauAL/Xq\NMCBMCL=qDq
%jqpP/ =8YVL6MXFlVpF=Hb:in=!!:\#%emntm8EH+Cd8uW#X#m4ua>yu6K:k$t1?:/M6#J>iHN!?ipYh#V=!@j
MEt6/d j9n<bS:<dRn8e=S!:CkC8iXu+iMFPb8a6JKmWXJ*J>K?$p+>YN>K?9#@8DFuB/MFu^iiFlPlLX8&dmMn
#RVlpS K!PQX%bX%>DTIiuT/&l41p91SA/5D^JBqGkG:$%PV/FVNGP*i:8:pT=TJ>KB66PHc\uB%cjm!G/umb//
Xb#i%I P9KCiZm$Gc5P$k9wVEVFJiW\*&b/\Nbl+*JMAV!uGRb1?@#6^/>Ap%LAp&!54Z9RI<Dd#SZK4c/KnI#/
\b=Z!D ZnQVQYaHVDWqh$lyGi44/?u6$NQX$@W99>HeM@^+F16tjZm?RY5YtXbhyVG<MMmDQj#D#%@MK1=1:wYP
*\wbKn iGHyM>Vd5t^Md$$$q9Bj<h41^6cPZ1GSF%K!C/>YNdV&*HwI\X:/Mjj?=VPA/?V+?Nl+4RWjMKH<QN#5
Gt:S5L 4Dl&hk=8HwH6an9qnpceCR>HkNkmIYm\<PuA=F8D9b*pCnT=9RT\Cti8k=RA\p1Sn1S^a4BGuR*&>Vl^
\ciD&> =JC=?5ti$XH+6KKQKX8M+CVqFVaTnkL8SYcqaiHRmi^HB6i^S=N1aGTCNEZ>iLnud<#=&5K$&PG/M#n6
VTHZC< bL\d5IwSY%54hRNEub%nR%T&CIM$S$yYEXl?+JuNLY%A:898=S5eFuE?Q8%T\S1ipyeF\X\#JBaRAm?H
&wVM8@ 4:BVmJL\VAT#9/^?BcnTc:uqDD$5<6c:BWk%<e:kdJ?/*=B:#5QP*EldZXXbYWYPt?wQJRMXJSW%#H/b
6RXiJF %qlZeXSe+wRQ@>jFPJGV*R<R:MNVNS9RE8pw/De+bh++dN+IRS>^kAliW6T>YATwH6@1JuWluTlRJN1&
LyW/c9 %nA6Xuwm%Nm^:y8%DSmw5GkX1+ykw4%%R&F^t^I48LptbjjttyT4/!n6itbGctw/A85WAFa$t!+H5<4=
^@bV6e !GZ1@II/!GydX<e@8i=ab&uWMi$X\m@AK4*1*5QBRGTucYH9MBSbqLRXNnJ??jRiV9?euJmauJy=CtkF
8YIAYV Mk6MMwD%GW4#iVBaTJAEcEZ=tHqkX4Q4cQ%RY#8AqcbnyGIKY+ZG@%>ct!8LL!ZaPue@GB$qkbn^Nlqn
=L1<b# i%@J5Cwy1&qw/?kdG8%B>nL5MVLR$>^quNT>*pQCHlcKDmKIF61Gaw<NR%8C5dAI6BppmYPQ8t@C@iBa
H6Q5yZ uc?t=4!cECAXQC@\Bc?CHVHcHZQ%CkKwblcRF!M?\wV%c%=&Sty!a5\?Hc$D49+?dm+k!#ZRXbcYWVM!
XJI/ih NVHch&Cjy6RPcS$nA$S@l:/i9wF*Pb#?@GkD%W%l*dmCw\hSXh&QhSYu=q&6:SkcjjJ8j9uut+ul614C
Xbl@8^ 6JmRW<e5>RkR%i%1i\<h>\!Bw>wLT8F!^EH+M@<5\/$JL=:PQyptVY&bH441LCkI#VEuiI\=PiE+aq=B
>hkC*B 4cCwVXqFk$YCRmL>!@1/P<kqb+#W1&YqyZAWM@laKiC%DXFqV$*BWA*^<*R?c4Nj*dpd\b=Z=BFqp!GJ
-A!bJ/ 00019d35d2b001202b3 Page 202 of binaries1.zip
nJR^4T Di+4RDpSDk4&FVaWS<P/#jlmN\ICVkIBZ\jlS61wY$Etm:T#6:WtGG<le<4D!@8\/!bTT\5DZqWyXXN>
PaAmX9 ZyYVe@M<BMbhD1?541WQPIY:EWF!/^5aima1Lmpn6*AhV/*I^<K!luWBI/\4bFDlAi<P4KHaK:XqAuym
w+41u* 1K4*kc1cucpc/:ykT^nCW^t/J*E%nI&%FeZ=PhqcGP94cGuy/P51dFpE9lmlyKcma<GSYFh\XG\<p9<d
Dey8u% XiF6R5Iu88/V\IeuQcS5%ENAHp#B\ERtFTda8NZNAHVBn$<EH=?Ejj\Y?QHy&qyd++&*AD$qMXKPhmG%
Q8WEdw VPC#\:JChZY$Ckp#%q9Jcwwni\\?dG*yj*iZZRKRIwWZW%JA$wJtIJpw\JRCGGJaq/LP8*!VnGn4*^4#
eJ>@#/ <:Gi<4mVluC1?t<Ck+1l6Wje%e=HV&ql><W1wE5aGPG%yb>jQ:*dtDb\:<Gnmitu4>=@?k49wkNIb%H1
ac#^@Q ?TJS\PkcQ<yL#<?=P/K#1:%>8b&/8/9!\>#GqlP+^BmPkukES$GWbCjcPZdil\<J<TFQ9bHIn4>\1t5A
GYeADa N9ictJ1T#BqM>=u5MXCZ6Gkna4EmheA*GRqd9aw&w$&MnRh&C=Nu!!LT^?/&\%BXXqTAiF&9PK5Ch:yl
he/b8= L*NqhY&Djj86n#m=iRijBZSiL188:\C&q:#CdD/jZFI?wKXl/8\L<dR*%>hXpbbTMhludLl9Q<BVVFyu
wLDmnt n!FmkPwLG^mi89ajQKj?ZaR/d1k$DyWWc<FI#C!/*6mDGenqL<>Gi^6k=8y*$5=EjSHDe<@Ba/iCI&K^
kP1PCj Nmq+ljZB>J69T*Ay\66ZL=:N#yKiILP+8:EmGJ+<:NlEH+ThlqZI/9RbbANPNAkN&Sye%ht/eS\Ed#WA
LWl@&u N1<WAe>:mR\uh*wG!FyV5iqNwRFiL5j6Dtk+hmIk<1SS>CFquT/Jk<m=#wX\WuAR&iHaFF4Y*Sc6*h*E
P$Zl=W 9+<t&w1&\LZaTCQjAjHN^+/Q@$+dDQd%m9K1/>iqK54QKENkac9iD8BhbBTk=VYAa:A^Mp<BM5>G^mTt
qMCR!y Z4y<BiT5Y+D4Zj?LJk&eyam6G^Ml5=uTQHG@Jl/4P6*H$/5=yucQq@5dDPKyhE>e+Kq=MNXVulJ/!5ui
5#b1Sw !6#E&AV<G<#%yil?ASXqBCL+B*AyIQ6^e@CD:L<GQ\k:h6^D:lQBE$hby$$CJFE\$yNbawWnZLEQV\$?
w>6tp1 jA6<$6a&Qn1!<hGyG9cLp^nYGRq*Y16kqc?mHQ:H6VME8p*D9CGe<Q%EluJn<bDpByZZ%qCcy5VW=BRp
qGQ#!9 DTRmGZR\Xe*Mkyq1LyyHub6Q^4K:cS/8H@1DVS+b9JH8B?ejL\A8GbZ%LJ*D588Gy%@Rp8@hjEFFaHqy
5&\:ml GX6*@&Sm>M=kZ&@j+P*S<buud#:Pjj?>A5q<kqK9hGl6JRI!/jq+PFR1d&Fe66:6cb4:%@al<8KD@ycc
l?!tQC 56#p\<e*+:V#8kE\1S6Wc81C4>QW+wDXIi8Dl\=cHdA\M#bWpdbwILWSY$qaqNAtWmPyAcu*1d6=M<=C
H1EpMj bn9+?BLa\p:ykWc5WS1c9K6Z!$PXAJjm+P%NWIXVR9ddPnl:?IYik$IF\G#4HZ+ALC:eKQwnu=!VP8lw
!PCBe? :HZ\<ZE:/ZVa\pBHSWbKYh>p4+E^tW#hQTSD%EDacI@4Jym\N&4n\Bc:bu+&!P8p1VIAW>Xm<#aP?cnu
nP8H?c &>L9>%P*&/8LREcK/TabVKPD^#!C#y!@tJF*yj^GR%5jLD+64C:ADi!9Z5C?i@R=:6u5SLHKFqkpB6LJ
t4d9YR !wb\$uQkYES>I5t!TRytD\!ICI%5d!Ej<MCiRcTWycT+1CA@G*!pqNV$NN:$#QS$+A6k:?LyIG<*y<MH
dFZY5y Na?*n>\n*X>@RF&l#eXF=Eb=%uqSHyTdA8AJb/DS58HaReVZYwuk:WeCV!XeC\%u/R4EY5lk?SWQN5G#
/RD^:4 9^EG8k#G@KyW&dXRQP?tbP/YpqMp1G9yGS1dHVlpi@T+5>5yu+CR$^HSF+BwFyWBNEZbtbuZtCm\tYma
bWk?J^ c4LC?R&AVYH5ey\u%llFQ1y>kGhRMkwwHd&X/1AC+NS!mPc:hu6t1Ca:M9CW5+Ph>TF48/QH:K\5%Nty
KZC?i% FmlyKKmaYXtZAJ+e\tR<+atP:F<<6\mDD#?CkI?QQKC5$IRJJRX+R%AD1uAIuIGM?ai@MTCBGCB@a+CC
+Bdt%m GFDZkmCRGBBGElPl9\F?@nL5eT8>F14+%!69tq65q>CYdYSG^j?%:46!DYWbnp/?tJ!Wpy1cB6/jTDyX
kEnanJ SmbMTuQRZP1e*B6aL64VACnFS4X<jQXpyKW\+yn&B1Xc=5j<L&D*d&nk9DPkukBTI6!K<iHq#NnIRFhd
4#>m++ T*NLB?!JuZ$FVP:9bRnyNE4%<wk\WaCKZ$CA!E@LJYlb%\5wyYu4/L*b<kYdb54*##SVPPD\cq:1pYMk
KPMBy: Z9i\iQHiKhPZpJTGccmclw:B*u*tkFJd?<PIQdPh4e%BT*PVQZmyjVhYG6B/IwkWYw9eRGyI%X=u>wl9
Ip5p%/ kj%k+NQL!euLhh\wLdqTZF^cWuLqTqtyu^#RXTmicnwG^8aHdS%e9iA<+FVa^RAlBZpwMLij9@:+Bi8n
ckART^ RGBeNhRMD5PhJE=HLQT%qcWqCZ4Gi@V*Yyl1Ta9J/P=FnCkMh^kcGi%%&iD$Hhby@HJ1hLm4ph#DGPLn
^nP/CH b1$=ARSW>+mHj%k$9JyV*#u<?PtHu<9#L^/Cy#4*IycK1m<AV4iyGqp=iGB4T*KL4qZZ6@TM\QLa!6KQ
L>Q?J? L^@i9Zu%p9lC<CZE>Xtj=ZbBKKFaP54F^eHGTRmIRLA$FAuCBRcF?y+nH>=eL!<HqLKYAQt<DNNRmGp/
*S%?1/ bWatp5GYqw1NNR:&A+tw6hc^N6IIiw>+u?yPtScSF?XD?XEBTpEBlJ?cn=iZb=&LkbPDk=&NE+S<HV!e
NEj@@< ^D4TVRy5Yl/yY1n16NE86k&bkHe!Pt:ApBjBtBhLqbd+!eI1Qpn@^TSlWkF<C=BRT&6:l?Mu*V%>A$LC
GZmiiN I<:HAlHN9*INwC4&H%RSXk4kLTub6&NZ!p<q\X:nbDe>nFN/bb8+=5t/eJMBQJYc*Sutw9/bpedClLQk
FtBZRZ 6iPMPDGihD>%<6nSI=ddcZ=VW6G!5C:kkE*?6Auy9^aJdBE?%ud*L9#\!H*1&&Z1kDa1RBWPTmmeaMwB
mktTS# l\=!eyL?mWANFASTHjH9R+hW$aMRMEMiETaTM/G>Bu#!wmL+#IEw?MtRm$>@^SRdEwi6/<SI^SJSYXp=
QVe!RT XJ//HbB/J!wy<YJTepy!K1AXTcNKl>XjYD/m#5/y^p=hi&4u!j5E+DZK5b:4F#%NXkqLT4<IVJ4:Du6F
?AK\XL b6<etu4^u8ddd$^Qh<DC$b>jZ#??jnJ&8\e8eK?8dYn68R%Z%H&i@:Y<DqmhR1pZk<WE%\CwNL^ec5Wh
!Lj:bS FB%@+IZY=y19GKk<@^$:ZF/Ree^lI&dwjjV&4mIhYVtF9=^cH4R>jQnweTeu^?QHHa:c&Xlb:DQC:>aQ
!mXML* 4EK11cy8\AGLqcV4/HXTBXLPAh=qFiZi8tImw46&A>nqFBRRSajG!1LCk56FlaWFBWXFli:TEyJA4PFJ
kYYyIX AjT:n1:i\Yjkuw/mDYSBQ94!@ii=?X<LBTAuBcdZVXNh>=CHq=9#mcMHALM!Eumh9Wb/i!#&ceu5p6E#
*4HBEX J8*b8ehw#%/uc#XN*eMQb>?C>QEH?Y=Ae$%yZqy<XJm@l+MlaSI94GJ?$m9wdG^K>yY1=n:5QHZy$<^I
h*:SJ+ b?&XnLk\#?NY?kTI4Lm1pcYDS$B+hEJchtFb%e*t:n6nL#:?ZQ:#/>6u\P!d%/>i9Z+N@\6=TV9q9qNR
mwm6H% kBjlaiQE5dB^eZP!5i%!C\5NDRqBkpqBcPCYEQ@AnTI9!EalQWBc+Z5IbD*y/cSM>w^$iLK</Zq%HXyJ
qP4eRd &HhAQZ!:TJ$pkAyTCK%6RaXRAYy?Qq++p=AL=cTDn!\IQ1pKSL&Gwyy$uRnmnq=D41LqQF//w8D%Aduq
!b!#qF k<h%Rw&XIPTZpWI1EH&$WMJhCqw?aG8A>TYwcRG9bHaAjLjHuTC*kcFAaYQnp#N#C1>Y48Eyh:En#JSM
qAJpbC RKkk8^T5!*@b*R4bNjbI9Qq+4CHXA>+VAP^1iiRNn?c:1AN&XR+GC?S&Vn:88JaB*yd?*q=i*u=B<LDN
QRpeCT #h%Xu9+*JTW%<&<e?GW?@=hh<ntNmEQLuV6aFIabCyWlbIA!ik^e\C*C6jd9IARRK>EcyJ4m?uwF1b\C
1hJ\HR l1CMwj\cCAInB8+/M/H^P9n<q\8^Ct%lkd5pGh6@BBa4bQ:qFtmMNPBYnqJikdwbpD8XpJTReDEJ5y8T
et5DFw k1STycYDSBXYp/k9bXY%4:XThX&buCe9%@:!:5ZWeEN88I$cQK#=SYDYMLb%C$<y/^mhjj&JGtcke=Be
b!GdAh IuBwu><?Hd@h%XB>>WySeYqqZh9A/NV#h=?@@jwD!b%A1ZKpMHCy?hlFp!ld89/$$*S$6X>j?+a6CPDb
89y:++ ZBCAhWwA5C+hP\wmBmiM<><cH5:ZWTLA\yE?N9Lj#l=R/?#1k4m!8nk/Pl\G=J48$hmqb4h&dj$1SSqT
cLt@// lyTmJcR48KADlP$a5QBIXlGQKFFZqiVuIdtHe*J#e*L!ep?A>#\i=Ey/i<$54S%Pu9IJBn+a444EnpI\
#=DML> aN>CJ@^4CY5QTpu$N%DZ*P<KmHW/ctYpBalX%N=n1G6pd1w68$6G%&T9<b/>P@j8&YP<N^yn>kq&N@*#
uF<bNq /=qH+IWGS++tSy<P>HK^WJ5CM16n:?+ZGwpNAt+jGu*!F6cS^kbd48euS\c+&y61@5bp%6DT\h$@LCwi
@$Xw5y *4P:Z69RBRX=@5@K:@t=#^@i\%$d:>/@j$6<R@9&kkVRYaRHB+YYp=8Vk=Z9eElaCDDDIE$N*BwRGBVk
Ti#%6S XdpJ:BZ+$4>M#qJV\bhQ!pI#$VT&=IVa1NNB98=PS@TP66!?VX:yeI5!Z+&$BhqK9Y*:>t*Ih4y6Y:jA
GhSL6\ <!AE<<cMZJnWmK4bZWY84X$qqbFKKW4Y4&\Fkh<K!<?etNeDE4Kq<pyiHkl/Nwl:6qSi#wuhMEWD\MwB
8/Nqn% m/P6d&S5B9j&HZh&>jD&\+CNm:?aqyXjjK$cEC9Jk^FLBMR8d6BK^e+ynkBe>:nG*^khd<u\NkG+n8Ib
LHhTS> CKcu1<c/+m!XAK<Ee#@BnKdHW@$%?Yu^$YjDR$QD#$bHlReH?AeEl=8\4FBTWBEy1TmaYRG%@IyjMG4b
:<Lmi+ !V8^aZ?E/I:6&$TPNmP*+Y+Lt1Fd6@IJ5P=M!ayD&Snk8\kY!Vb!lL>^5AX^IGJ^REEeGI5DD^C&RGmb
j46NdA EPb%FkIIAu#\55p@VwmV*\K5WL5*6Zd4NtFaV>1AF9lmPZqI:c%XqLE!?WJ<RmKR*CRpGW&lAq<eKaMi
kGHK?j JLGZ5nI4MYlL^?a*h&/?tl*68B4u4Aj:I*+SYNV*HHIP8uC=Fq/C@WINy/LNAi1E%@@<@AI!*bG8?9Km
k=wAdl uK#MT*uFqR*hI^NQ5iZNpNy^qKyDDXCL<NMI<A6\<qD:N9b%LdXVh>=+S94?h*ejia<QX9t6L5q%QI#F
=J6G=S DLtLD1G*JHP$XhW%hjTMnE$QYNucH*N$huW:=iZy=iZl:84mhP!IDdDHl44m+y1HC\yJX=Bm=DIyu!J9
+LahXG QShuw!a1BN&^NBS5JYYTCt*y=a#$>C^aWD8aiTuLaSjReR%6pEwh6D@8:B$RFlpH#HFbbX%#b@>jewE>
19KV:u ZqmCy^1\?hlGW<*E/bV:CWiHR$bRdPW%nR^%>M%NhiS&A*SNEGNp4+nJuwmcy1=d&Q&/qX?dR!ZKC:PT
Gh&TbX amPCjh#6hbTt<eLK?$=+BtKD?5t6^%mF/WFQZitq?NQiVwiMqCG=Y%WA8Y=?<LAtK:?p9Kcl+>dD&Zjj
-A4<iF 000f65a2cb7001202b3 Page 203 of binaries1.zip
DAa*$W FqeZ5ZaW+kjln=<?AwIB9l<?XlK\nmh8Hp=YX5k8C=6^\JqRBDlpNJAWIPD9ta+hytJtFdQHYSqRcVM!
Jye?>F KiAbRBb:bn45P#+dG8B=<4nB+Ya+&lt>R*GZNEThw\19QTIm/A:&uV6&mIkId>?&XWlAkB>cbaTdGV!&
%^@#@* :G^CIQ1ZC//Rm6EmClB?FITjQ<hGdTeHK^5dNIF<bDHbXuw=HYSpthRbYbukT=B\EAXQ/m+JGVqF+JV%
nX*6YN +jJe/!QHV4m/i@pEBIiSCW:N!Cp14dm^m1eRSymytBk^$X*AGle^lHhBlI%e+148Vdbu?=6nCNP4PmS*
QiB>?? VF#*%?5HBJ6+CF&<MVJ#8:E$Q!QyRt^MVF^mTqJehEVE8inaSDeBmQA/JTW>JJlD?88@l@S9FwSFDnel
k=!=nq \/Vd4HeGB+iG59E5bLNMn/p8+BjlZihDiTqALHAd5hC\9%^RZFSenBVBkbF48dR=&TAYdAlImPESNe11
:QVknP #FJ!PV$6NVM#I#$4E<Vm/E=!c96QVXmRuN9?q&J=XIH/<S4KmJRq^5bhkB9Vpa6wEyyMpaKpWeQVX!TL
Bq1Z=k P9%/i^9\#b%qD?hSHGq>ijHH*J6uE\P%tZ+Y!m5Ew6JQA18cpcYnZ@Tq<4d:5/<?#qM94BCBhh=JF8BQ
WK\ZZ= d=/M>nbe!<?+GA@iu4tq6i*D+:N9NqpiR/qt4VCY1RZ+?dqweHdqA#&A=c:YweWj@>uD?jd=%KM:MM?>
m$T>wV :G!QSa@!#mA!JJ&lwc%4aGT<d:?XNRd!KW>9Q%<@Z%<jd$>*F&jHI#aH#jeb/iFFh&9b=PWVke^T=BJ#
Mq<mPQ $P^Rb$6%<c$ma46&T<uIKmk1Kc6k*SX=q%KTp=I8ymRuy/XtyN8LKRQj65jE\64i!e$4?P#=lNV5+uKR
HG/4d= X*aQ*Hp\>m?cq/>5TQElVSWnB*e*J<hnl@bwKe98q6W\MNDYNh8uK!<lw&P/#^kTLYK!>$^%a!ee^kVH
liC$ym qu==<<?/uk8Saj/uuE!Wb@AmTqw&d9B8dTwe1pb8hq4<MDZeZqYaFl*5j6SeT\pCLa+B:R54bbqAq/41
tQ:e#& P8CFwT?@+b/Nd%@tQu@?>Qu#HQn9V<lH\W@k4?/c\>w^N#eQN^54iDA+ee!1y</ElWD:VA^kCQR:X+RB
88HTHE VTymB6abK$8qyeNTB=4Duy&XtRc$PQIMiPYeMLJ99EWCRFMMIIQWGaThP$tmc&KwKNNPEhlBkQYlI4\$
a6HAu+ *CD#+$DacdcB+PiT<pkk<1S5pSMk<9\5$Dq#eY$YZdaL=&YqkMBjVE=PTp8SA1EZ*Tp1LmEnn%hX%#Ze
RM/qhe C!6VS$C?i<4LN#Aa&^$MME/:hQuK6c1dkPQ6CDQkAHlRC1BuKDDR6J9uKkBuMaC#p4:V?jI:W%*=\ba1
MH$1N# *@AQ5acuwyGS4PQKkGeqA^i8&QKlJ/MheK6ySly+lYXj#5%ISlLyp6M9=TjKWc^mwp^DRejC^4cIw&IV
hcBJGR X=kHXQ<#W\*LlLj95G<Eip\cb4\>MDA+tC+HjkMIG\W:A=qy+H=Z?hF@SaWYm$wiMZe>B/Tuq&lPHFAZ
:uHYEF =$MacdBDIVm>pbCdqR\mpkki!NTW>DT:HXlbi4NRICAEbBt</:C#YFm6&kBcASD>jBZh%u$?Nmd&Rn^E
GkN</y G5w#VIqV$%LB&#pnI:Y<9S%yR\DTN%wB$uC4J6#%QDQTWlS^SQMhAch8iMDB/&^KTX$@Nq&NCm6cwTRS
$JBukM +nJR=8eV6%4Ke%Nm#=$>G^YjZqDXMnR&??dnX#LPn%G1iY<Mb!1AM^$9l>1l9H5kG/dy:1%8@@kLA=4*
6B+d5N u<Y/MB?84!l&NwCSR+ayd\?RBtYPK8$^NnHdd*ZI@mm\$/i<@H\DAwICk+L<@d!>*b\hHi\PHVA#N6VX
ecE&nb qN<yK4ju$Fwcpw1tuLdh4!&>E?NbWk4p\ZCw9+cGyycY=1uWC*F^5Ru^F^LmRTm%^hS%DI^M>>5ePiH8
u^bQH? F*I&Lmp#6^md8#%$>?Ha#L?AZwdZ!iEb4a8/51/h1=9V<YQYi:SWbHjL1PkbcG8d:6QDT$44tytc:nNB
//G<GW >?$\*4jQC!A>?GD1FS\S@9ZhW&!mcXXyZuym>Jpkd>hDtnMkITaQ>Mi/ucH\99??@PQ%+\G5l8ZudLNZ
Y\aK:M :Se$%!wGqphhjWIma4H!/@Zc6wH:W/<?@%yi?j%nH49PRjQ%G&CdPCj\=i9<@E8*DcB=PbtlT4P^mCp:
amR$wJ SpKi%\QwkwK>knIk#T^\1$+&EPSWaFc!$G^PtGye!5yKV+4H49T=:nFwRIA^RwhJA*TDS/ZF^Zj9JpyR
Tew^b# TCK:WjE6a1I:5e&H+A9qA+p^D#jWJHa&>1&mepcHTGuEXCSF$NbCY*wHH#QLbn+M4*pAL!$5emwFmcPL
5X\%Cy nRjl9*BSC5Rj!*5W<Kwc8kat=kjIC+cANkeBh^$bA/lPTe9MLT!61Kqd^hPI5VA#M=G\5W%A+8DhAt^<
5F:i\u E\9GNae\=F49iGVy$E^j<YqdNek%QYH@8h1J%mn#Zn!q:nG8e$W>p^MDVVjKT+5KCk1L!!4Km9KRdQ1<
/H1$=j kyL!/py#DP6%TtwcPtc&BS#Xqy&!Q#C1&eqFcHKPLC^m$DBIG1K<NW\ewD!/m\V@#b\wF!MGNK#YCSIF
1Ik:wa WH=8/F#?G=nW6DRTmA!c#GBDnk$V%mBC\\yFtelGlaPSpa?N9*Al@pJmRyL&Dp!4!YjeEP/6YJ?F&Q?A
5\&m?K G>Lh5aw!#+cjn#+jG*5BTnaCNJ5tGhctTiuWKXjd&>jd1D4d4u@deN$jZ<<?:1qMhN9#keC84G/+@/lH
MKTBMp YPLq19cSJ!<@#Q?t\wyewkmJ6La+@@uN#Q*P/9#p1NBA@<C\1I5==W$Dn@>l?^FKVc#RpF5HeKQkM>N!
RDWyb: 5M9G*AaJM%*H/N*!5VZTIw1RPLGiC*K^C/:RdK+ye%8SI<1mM1k=l/WX4Q+:8b*!>QMLCkwPDRqDkwWC
8/*GE1 @H&>ZE<eQ&J:eQ??Qjw/G1wKP<HuqqLSM:HaL&Bl4K55KT1!hb5w%l8G>VC4\La1dWTHWqh^VSRXR*cl
aHHFum +qbm8uAL1?$Sb#i@pMm+m=j!4%VecME5><VM<>j@RL%cXpIY/tBXk1cX5/9neRhdE&%A6bT!44/t=4=>
IHqTNI Bp1TM4yt=1d:VMXMVjcbtl!yc8kA@L*<@A8P@u+??iBYh%QN%e6bTZESIZ+iDpcEYd\IRR9P@whdh/=W
aHeW#A Njdelai:j?ci*881LetMC@PEb$mR/!%p4wMnalLVe\yK!&?$>w>M99n+jRt<jH>?Z=<Z?@:n?@!*d%?@
%@W$AS jb8j@@:#>?>ThXpBjl:ke:qatNt=PhqbtLhcSaREpTDZkbESd6GZC=G@ZKeCy*ayt#I*l=nHDC6i$HiH
==mT>% ?J*cB$NQK:NLTpyccp$cqYImL+MWAY=dEBFR^9\&F#qJbMQ^dNpM8:t^Dwm/MD<4?ZCE4DiC&NpI$B55
:E$K:G /8k81X*m+n6*T<4C$mJpGYVKeEGkq%>kTQmbe%E^F^ITW>I!59PL4%dhcFwF/VI4<l?YEZmP\+Jdb1MR
6A:Z+R IPGbha/iKi^:MuR%!pFVcS/C4Pca%nN?#WeHkK^y#^YY$@Jw=t=*T%%%bWZF>i4cl644X=FT^15X%ZW6
6C>!?! 9deVh9K9WcJAwcpyKBubF*DW4AKTmn?^Qk#YnZwZ&Zj9kQFkpNt?$jSF^+$hnjEnAt5kHML@n*BatP@X
jNq+wt IYDlYMePy$qA%cuB4@D*/h8=A/w!P!euD%!Q?b>pGbct!iRmCyRKm6TQX%HP8aTaTMl8HCRj/DPRbmTb
hh4u1c IRYY1!?Ya9B&hFX?k$=:BVl6+H1HG:KDD1y>JLB4G8$@:Baet%*iCLhdj@/^SAu4ZABiI4!w<tJ<5KEp
CqF9>F LT4I&<Qh$#<<:qJbR@?nJ*@ljaA!>K5KCtK#&BB?B9k8=^J^:?u?$$:d%6*jWu+j$m8*8VRLT=!B&c/4
#PVCV: KL1WHHM&!N9h?cm>#cGDqybYX6a&l+</unny=8unF+TEWIiHlaenwj!B@4+i45/PS?&5kVkd/Yt41^AW
d<BF5h =Zd6&LaN&T/&jh8&4h8\8:$\InJ!<umCM5m@6ZX$>jV$\S?/&q4ctywpDY6NLS%>R&N#T?5n#8=?\bG^
+F&tK? IEp61:4b%D6$=<Gn1huu4&GhikQp%Y6pkW/LNCKwtl+HYd8DuctYmy#+dmX6ZR$%+*$GBGqyHR5LW#M#
N9cK6i T6N>mKt\LTV=*5TLn#>Zqnd&:dVWqlhqy<bH\VE^?>YiA5?6bu#M\#<5KkGY9%wB>/?@Lm$A$>%cXbAT
5>6B*# Hil/&FVn=$aTjSS8?+Dh>5CC\yuH+<@i#!?8@qu<>i5u/Rj6#%@\#nR!9^Xit9/>6L!/$ppR=Pjq+8Ln
NS!JRT \VG^eZF^5PN+>WNDTaG4Ah\laRF8EWY\ay?jA$qP#<m/qC8Yt=hjpH<=Q\>dXBIZFS:5/?H5aG6qDu!Q
*1::=M lywKAc?wwCC9IE>TEMa1R=kHFeiPVPFhH$!tMbeJHtRES\NEta?Q6JXGmJidnaZE#EZ8FCLZa#ikFmYK
9LCyK! Wi$T&+YIWRC\h\MQBXjmR1:N4PBii#hQd%?RQkQnHSPZpJTcqytXW%BTWX*jDMCY=WYamFkiTwIL1dDl
81!JJR +^TRc*:A6bbhcG:u%N%K<w1hS<B+/@5X*:?V+cAM\Fa:6CMk:idhJ+?Gi#6cGl5ctqw/i6wcd>/w8ZG#
/yllHy wcYnj&V<!bQmdSV\BlFIy/uwj?GwPAX&pjj1CJE4ay9YG:wV:DN#RuyJHJTeZAk**abCI+J4Rt#@j&H=
aHMZnj l?%qhwS6BTiCHX*B=tS?AeG6=M\bQ4?\i\GiNkGpTR1wI9Z5Kp1@*uwlInL1jA\TT^pZm%!klEp$I@Dd
uYb:<= kPtEK&$h/&%wB&Z=l:>P?<QL&hGP$tlH9W<EDnYn@ja8@qHyJdYhh/jl^9R@qPR1&I:%JRD@:GlubZb5
#I@1/4 <CquJ!eZ#?D#GcZ@ajw?!9Sm9/CAIJ^>!5>Q=KjqFnl\5/<VulJ**1&+8+khQt$qq<Jkq>Za9cHP^81!
FIFWWL !=tJ=<<E?*1ihHR+ikT^S+@IH*M</iLt/SeRFB^&>9VyM&jPly<PDR$M<QN!^=CGj66IZ%6DVXqJpS^%
Qunh+= CkuTdm=I5/RWFGY<EpFNZW6dX>?RcIRcHnjRl#eC6HWA+QwG5ASn=\DhhtS<Tp=lYW%Dc*j@9aeV$G#@
cYF^:y t?j%Ct\+VFbG$kpX9PFlb/jnS?$5hFVqh?>Y$NVSWNqna1R1LcWN*5dtb1mb1Ktb?eHe?ud\nD#@<B*P
a#/%H* 9ZpFi%Zc/!6L<nLky@N^5>hSiwaZWha:/PIN&!?#+Q#n9=/:9?FcV8Jb*^QYSmwa$c1AcBj9+DQSCctZ
mebqdb <w9K1yy:dw@N99$CVDeeYpL/Sj6:eZEB4yJAj&*@9dC$541!6QDaFD^#ZF!<jJ#M#P^euP^5HI4iwWGB
=Y5=QR RJ?SRP1RTQe#TCFLRV/APm5nDVChp!iVD$%waXElhnmiGH58QNDH*huB#5ym*%=>dW%%NSX+b+=AWCaw
JDJ6HK +bZ\mwk<w/!$yAT=E\ISSAZwMIHm=pI+1Vnknn^+P\BlJR?4+eT8qpQnmF&BEaZZQpnm!G+K<EMK9uR^
W9hH:V uhaGL5uT>wmn5/8Z4*>R!NtI1QP^F^KTkE=ubieXZ/&5dYkF6q6^J@C1/+^$MBEF1Tle1\N=y8TXAa=d
%Cia$8 :XBAb59+cG*KKYMMcH1CbTVt8H9\qMwYP:$TK\ctypd9DMKbHn$D\*eGinycY>5/8968*b8auZp$ZCbH
T+VSTa 5Rb5>^wqJR$L4I@6&6!V^aM>YhB$k\?M%SAk4h\IF+tVkk58CGPENZ8+jXyIcH$LlhBtSHn?n+m55hLm
>qB:C> kIRD!6pyPImeSA/+9\>lS>pw5L/SdYT\+RYddhnLd/Mu/^?\KSRB&w54KQ9I&dMR:ima&QM^5ZG^ejFI
-AT#a^ 000f24e2a48001202b3 Page 204 of binaries1.zip
m+LTwQ A5XFJAqNyw+9c86aA$c:1k>1>hwjYPl/NnFRuiJ64n^H+FR&QGB@$m<mCiVHk+@lK9YFFWyw6eYA%X/F
EJc#W: QTJV\+*F!iGiVpj6n#m/BaA*REMjRH8#LHaQyj/c+:1LKEDB9\/+=6A5:P%iAX#*6*i5pdp??DiLBpd:
LkKcSe Vm?R/8Le6IV#b$N>QN%eVnw/PntieD:y:8:yHSAWElIYj945tZQ\5CEpJDDAH*D6hP!I:cED=1b:DZR$
H?C<PF IhiKC4LAJcFTESK:+i\1!LYeIq=JmcC11cY4b:DH!NDI!BD?MDDW$>MBaP99MVdhd&X:>KTHj<m=?JV5
?aa*m# !%i4/>y:B8>kR9*&+?i9@=C>ZwpNb<9PVQMtKGkeen4leNV?kJ/K9MS8iZX6VSWDa!N%YaD&j5A&cw/c
Yp!bPm :VA*C/q4/+N:BPCpXt!5?TB+eX$6!E1PP^eKC&TE=@khBA%VB\?+hmA%6:T/mi!:q:<<9h>Xi\Z#*Rh$
IjSIQ: qVdbhuCB\>nmW#L#mp14G49lMkQamdQ!b&pJYWTZyQ@A&WRL9^eYFyj?RLb@@=!jTVk1!5jF!eQQ^e#I
ca*?#V B8nG5amhCA$JDA\IIAZTBkYiDk:IJ@PhC@lPB?a:::JIRSEe$X5M6J!<\SaADw!Vk@$l!*%:nQV%6DR%
j8%l6Y ER%WuXNXVXWXp*B=PSqyCdGh+GqHlFABKu:!wVM6N@AHdDn5#k<4TBqbiXmatblbwSuH\Xw8N#ajiL5I
9/?E:> 5yMGa4+dpcCV&4%dHBb%5SaA9A45I#A>aH9+?Aqk$tDbP^LIhn!b<$8=BTZZ1t1d&qj\FL5SkDpFqyc8
HTDuBl dELP5RNA444jP/Z8+Xl#q9<BFR^!e4?qu!/AuGDC=Z1?8PQ^:NVn?!P*d><bijB+:MGhY<kA&>D\!PnW
HmAZ&d :M#D+e//dF5CI\YSLN\$#A5+!t&K9:Detu<n6!d469A&e1$RRw^\wh!$QJknS@pyBjkSRRSR9m+ID?Sy
@c5p<t ?Mt9k9<XGqy!cBBtBlbYAD^e?I6\WGHqNRdw<Vp+PcHWR?lSn1*aEVT@\Ba56h++k5aM?q<=B>S@YpHy
PkLVka j$TiQSMSGStFSHQGAP=n+8KkWahF6LnCXpl>?<&GDaePl#*M*G*MD:jZA6S4Y6k:?=^P!Cq9/Btbi9+P
N&at/T Np6VADpZ\!#/q\@QH9hW==#*h+dL*B%e@CQVTwCia:X\4I@pLp4@hVn9lBS+#/*^$@K\TX@w/Fq6y?:w
GDiITA 9D1=kDG@bTP=@9n/?e\nIPdNNiXF8YtJMihCA9^<9BF*%IQB$<9HQ!A+yG<FRYnu+QnEn\lK9?V4=?*y
$><m/K h8I4CcGb*LjQ1IYE$Q>IXXRaSq=IwNJ<dYm#yLVpu?hJMwyKTm@SMXXNAL!S\S1C$D*TN#Ve5<iRlB#/
aaQh/$ pt8EuZEjQRGbm$t?qH@%SpNL*>DIk@GuL/E^@#4@c&GVh%IXJ8cAkqkNiXY#a+=Hn^!&$qhSpNkqw/cq
45+MRp wc!*h+?YuJVYjp9EayiFPjnD#B&P^AKS\NaB9Z$&<iDYyntQBk!=Y1t@\P>RWnY!QpqiaZ*=G6tha!Z^
b&Xd/X &&%XBcuSRhCh@+B=Nt\wejEPQB%>IVpD8NVKl5=dw>QaBe:X%SZTM5WK5p1%59\HYSL=5\#@4/ZjQ$BE
Feq@DS *#&5Qu>\J\eZH!?PEeeJiGjiimkwbD$RDcIJDuE>Z\Bll:u&ya!MT>t=?aW:C4G^cGYqX?DN@9TWlQQu
WueXL$ \wJ<QE+il+iHy5b:DR*$>BBhPl%6LW*%1<5ImjcVuJ#$:neImjI=MKSW@D^jTCTcEZb8ntITTiS:BC64
5Qln\l F?pbI!6LFX4N^M1<>C!cBXmKTjR^n!DWe=EXlER*nA%:pmAlqHPb+P$MK!H\lM9$\EE:B!e*d%@@pDAk
Q^L81y /LEZ+m<ty/Ttb?Zp=BXmF4%4BW<6#<dE6AbRZ<VYlEDM6!F+F8X>H9GXI%Phq<Q6NbT?+^@D54lQ$enI
Sm:4!m JWeXAL1TAcQn&b#G8#P#V/dGpVGl!iqb&P4@+Q/D$eiVM:QVw:e/dybtZ\\=1mjGSCKnV5&+lKQppj!=
JZ%/Tt mj1GSaiTL4J>k*ZkaWk<CNalS<X@/R>CyQ$pKCRp<Bwl$V?Dy%Vp!N\qS$bwHpTtE+6M=Wbpwyl\dK#n
i&PM<q /CMYNpA/J#5ILX$9nw&Dk=PhSN4?PRY*eaVGT=b*YEMnF<k^hWjpKPTJCwkmyTKi?5MK!4RejV4<#NtI
Xa>4eZ e=FSkHZ$QF$MqyWuIIuW5bhdP6jc1N6dK=a*nj8*D/>uH*XinZM%@pLkW6%4j>I:QC/#6LbniG\Y:1d?
KpHR5N 5$cBPjihtHN@e1@6c8yyD\h4T<6Dl$@/uaPwQ!cnD65:d/P$1:>/DRWEWIF%jnw?%8&?#Z&h/?%W9dY>
e:$LNM 9%ETTSkt+yl6l@IPM9GP^y14Sdpb!VGSb<PAkkj/Ij=dkpNC\<NQ=:/+u=5dG*:tVGn@t<c/h/mZy/i4
ewHhY1 \@lhJJe>ay@Ju8bF<HhVHBRX#4!eqWJqLL+T/<E:D:&lLI5u+IuwwKwtRN*IaPZb>a:=N+bGi\H4+B?+
CVYXZN aAc$@cDh5SN8bP?eX\K$9Zj+*5QJtZ?pHcT%1<k/TyKw\iR>Q#9#w1+e*6D88MQl\+iMXBRp^cTWNhYX
Bk6@#R 6jd8%bcZ%N^96Z@@AZGw<SaYhyW6eKH%/:qj=G&cD&@*6hXl#n$G*85:11j$E4>DYejmGF^tnc*WJJ>V
1?S$=> a:$wt?X!/#$1EHhBNTM4B^i9\HB+^!e:9^l8*:\@mYXTAG=$ldSK5WJe*dc<BAe8jH#*/9u5?EmSGneZ
w#=FmM D^<:I#M:+J!J^<k9dD&RNnneP:lkA@P<uE8bYht=iRXFcAqq/XZTNdY4yhnp!lS+V#nI%>QNGVdtHVA*
\HV%Q+ A/V9NhyncKC91*WS?!KA8wu*9+bjBB^H!RY@CQY#dB#5NhkZaeQC+9j!CTML!^!^nyGJEd&^C*DP5a+P
&?!HBM <kmAS%XEtQ\>:Nw6KTqB@l/AeXhWW6dR$nZeb\E+h*V^>CEjkJ&QV:maBA@u5uN#L^iZXh=wcP>i\hMy
#J&&?5 eDI^MbIHaC%65M:B#1iA^^PM5GY*A&ZSVuwEnHYCSWVNiGi5yXI*upKH:uB\Y6ZA&M#14PDMp>ubtity
SCap9* cjnjW\<G5ZX4peGuuG^%8WmdXVaG%lWeJj8P:@>+>$%SJ=NPLpP5\eEhAu\C5Xlp?AHd@c<dRGS+aYVG
TRQai8 RGTP\MlWa=G^ByF=Ra:MVZJptFlBXw+PMPMA$B^5K<<1&8hj\\59dPVIRC?E*Rjd1E#?4bZ@w?hESSRQ
?G!J\M ZV\nciS$iNlyCDwTmWVSSWM9j\Faii4#Pe$a=S*ZmS58@n6IqCeHcnMCD1q@I*A4/%p=i+jFyBhX6jR@
HunnjC tHwGF&&8ECtAnh>F4yl@inX%1/E\Q8mpucY=lbY>5??=>NKGAbA/jy+u*:Y+lXIn#^^*WG$V\Dlu+:Y4
lFbkan H8kp6XN*hq@:<k9VhC9M^=M%ji#ieG>djjZXw4#MyA5^WbGuRSwihn4<>GtRlWS+6tY11/thnVkhXqJy
+%hLbH 4Fe+N?Ltj9JwZ/c5nI#c9u%:Wq?tTpn5X5R4!uY?#6$9J@>%1Wlcy9hqpJ!CmwwTm5=Eciwbkkj%^*WX
AJ\Tup +>blH<P>i@i5=W4L!m4D:i>HuF!>@MNmEqN#m161Y@8G:wD*?:NZH?j?5jDIPpKT1N%W>ZSjSVt6k<ee
4?m+5* D66d:%XVpN1%Y%FhR%uD!FlHWWy>9>WB!\MWB=D>P!*&Y%e*hR$>tH4^CbdeQ4=/<ulpwKNl\<cH?Z8i
#HAq<b &Kj<C4?VwG=5/*LKQ!\!Qm&96Lwbt$@:c@ud<>Git/XbF<K>nq91ETDw&<mkB+SH^q%MA$q/iX*:\Mn+
kBM!ZW $:h#Q^cZqqhYXyEXGtDuq%jYX*i8@Fu<BYq@C&mjul^@XG?^XaCQD=CBA\<TM:8!S%lRIBJEG^4tqqbR
hD8Z=+ RCypl5Bub<GhWaXZ>E4L4yXj4/m51Cm@YqJepJ8bhnE8/p^IkI?H<@Gn>uaH4YCYatwCBF=j=*ldJ6A*
KVam$9 icD4Jhj*cBdM>jQ!<*L&bmA:/Lc!edDF9WlFSPS=tJtbPq>jatZ>8qVI^NV$MwmJqa8LA$Yu#@J9Fh/^
Ci8I6E R@nHhiW>LePi+yJTEt8=8!ZA<!8uAJM8HeM>yqc&>5hQu9IC\u+cXw\9aMKiiTpuL/@kC9D\#i$>!*mG
u>=5^y *e\RiK\De^F8HQ4D^5/nmMe4/Vte#8?c8q6><bRJ^n8>1pNT?&S%5GEZupKV\hw*5dSn=NHpNQKEdtb1
KSiZ%& dQVS%BQmLQiV/jF:A&&%JYVkD^<$$?TqypIA>AB<Cpw/%nWeFT8@*HhM*np&=B%p:MDKa>TDLEcRBDJY
XpuGGN SIAp!Chk*=aB5lJ?IRH?K^X:NAw?a>Hy&a^PLI!PKSchX%t54F<Y!hEB:&R&blCh$/\kS?hk?%GldNR!
Hi:Iw< :IHn+GBd#RXK9wYNk+6<qk/d$nc8cwC*Jc#JIZIw^n\FHqC@5I\!@I+A>ABlQI6EeJ\Ddl=mD$@M+tPV
ZNdPT^ K$AcDdB91F@HYqyYqwA=j@qpyKWw$5pAaK>y=8AhGy&TZ>:RhZ6<FwwJhkK?C#c$@Q:/+jqa*+&ecJ@n
KElBaT %lbt=kB/9/mM51cl<cj9N1EjSCujXFP::^aENy/bp$Q9Tu>Zi*6Hd<Ydu@>!<bm&Q=%/hHiw8/&?y4!p
dN+i&c AKTMTaq^eel=^en#=&NA%lF#5uE+MmIm<q^+WFtny$@YTQyJF?en@ZeQAiEBmZ9<$\FNhXWXXYZFyPFm
CHhiGi XMF5cdu*wN^K6bweRX%%/Z=^?$W6@V%A#?iLNa%/!uYMnE*&4ud5Nh=u66@K:5l^N$?@<Kn+%G!AWZN*
CWDM\n Q<#dZ4^=l^ZnNwEupTS8@qZ&BHW=bjQD+Qt*MhXWqBddJc?t41^mcK!Hq!IaY%qbYqJbHkDIm%l+%<Ec
B\5mI& P:a$DPd6+@iH8yw^H=<RjSw:BZ?N*/tpwt@yCI*FiZmbw:c6@>:WK>kc@8S8S*XS?9qkn/QtY6<B<EJ1
&pqlXX i\=m\J?LVW#N!m$5B/?t8&P#4#?BSGPS8ET*8QD4N<nZpYZ$n!cI=@h9e^<\+CjGHw*id+m%&5uL\<:C
4Pt%<u \MaGWueYTbC:B\WHl:6jLC!AP\Jk6V$*J^5p:WZFyik%/w4K1m1p&1u1Pq!HqJiXukV5@Pqkj!?Qp<+k
m9tDpq h:G#PYRJ8Djd6<jR9uFaqaDHK<45Lt6\&Jw?p54N^<9bj=iDA=:@5EW<HaAd+uG5VEt*Cqqb\Dim#4Se
*\q9/R 4e4E^5P%eL?+:TL@XtRHl<l<5dJwX:t&PEm/Xn4kp!8qwKT5y1/49<j$ALdY\ee*KPSM^Hta5!jDp#%w
Q+jP1y SjILT514/y5:iyj^NAweRPVJP%NYtGuJq+mZ&hnb6\Q86Y\CM=4GHnXiCn!wltG9e!y@iQT!1#4AZqXt
p>u9Nh 9$h$jpQj<L*SS+<jnh+dHlm?>&l<ety!@QHw*d+Y<n4pW$=&q95M6jBm*LRpPDWEpp@N5w/n=JMlN:&k
CK*ij@ <y^R:nFnn=E99H*4%m$pIbLk8lC%wGZnLWVAXGmLIF>y\^Hi#RDh&R#RdQ>@A>SDDlA4B\+LEA6&Gihd
+R<:=9 5TIPBAkwQN6KB$ni6&JqD%+?:A+qHBSCQk&G1V5WimIt>AD/u*@RLjFB\hAXA?1BbJ/D$GNmj!E8ywB5
+mEYVD /J68LM&ndNDR@=:@>Pdy+=:4Th+H%L+ViNV&&41HSmjqZwY4DKcj99+Id%S8WL@</<9:&hHP/^pSy^!5
kY#&\u #E*N4R/j>I@PKt<buun?jt=?Ad9\*I@TwmXKR9DPD+5AQ#<Qt%^!V%hdX%jND+^/hFX<R?njQkiYHtLj
<pSSB9 YF6=>ZJi>1ZWqJTLTShln$R<?MPqHWHFQy?LCA88@Z4@%L5cI&juE@c*WASb#Da*M+=@k/+n5&41cpyt
-A6LeC 0002ff3211b001202b3 Page 205 of binaries1.zip
!YP96+ NdjNFD:NNN@6qpX#h!pw1!tn8aTTJuM>nQ4^%D&4&SJ:VQab4</@Sma>5iQbW:=BEVEZM+88ZY@wHLn>
#5\TX1 cQ#b1#j9Q@+%</S%Iptm94d1PqcI9=TlL/NkcHjW#6dGRl59I!at1/JGWNLd1$?RXVC$PtlqlXwmB>D>
HKeE$6 It:X:j$A!:j\u9KZh<@l8Xw4MQQ=GShn5TN!R<Jd9KmT5ydyaY^*WF^KhnG\<%l4?b>j:!b9ac*q@m=&
W%1VS& JtwRiuH%9aek>GHua8BG1wJ46T&>6^>N9@#\>j9QZ:>@L@#?>i5u@K5FbBFhRH@^#u@>9Eu>\>F:I:h9
%=li@w Db/Y+PQlSHD5ZDkeK@M&8:CRwNDRW+YFBaYpI8bC4F+HwL>TelY6mKm144$Bl#jWXFhmE*P#+Lq=SLm@
>MTyiJ 4=ium@PJ+<iP&qtDh/&F!h:DdTD<:\H%Eni?>G^=X/MLH?ydIE@:Fe:J^S:^Bq$nQYFla&M&4LuN@Ab<
\iqpYM I?&McP+YFk=8DnSZ/p1V$qcSuV6*jB6QFF*NF6<6JTP%A4/SCReySYWXhW$>I&MLT=5nJ%#h9RND\5@B
aqARt4 @D*^Ika>$Qu<A6mwY6@T&jeHV<$FhB:btKGFMyGaKcDWd\ZYZuY@X&L%@cuPw4MPYpw@<GQA&y8Eqn<c
?qWI4b TLauAPmX8W^PuMtwc8*8H^wi9nZR&\q?6X6*pBH?8<MDQe%XSXpa<#aY^u1\Dw\Zwchay1TpamdlKNt&
yJ*%D4 jePV!F%8bKZHkBjF6J/+FXdumPBHkJBXG+nEY/E6Au\*9uV^dESucDM/b@<XuYEauV5\PpJMPHaYNHj*
beqTDQ qTayNp+8V4b9+:G+%W8:AQL5K@P9TBQ:+Z&SnTqX&HH/LqmmJ>j1wLXjX$Rk<W6@WIdt$NCkpNC\5NQI
QLe?e$ GjR5Heb<hA\Tm<bRkSS?6a&15?I4=8&ZF*:Mkij#Xu%88IQiD\K9m1HXmaDwm>tq%T&>I=P#L>:P@X^e
=t\uau JTI\lSiFKj\dLIWQ>#kCkV>+^DWwN96/&=&yF^@t9m>8AI?mNB%:6<ADhYb+wM/&Jdm>6?Q/!k@\&hH%
:yjTQ* :iSmHbB=/P\j*B*1:Ym88%=&yjl!Vp=tbuytPmqNJnWq$iXGZ&=8*LuVaeEXj%D$99MBJ?hn>q&D8dqb
@eBcPQ L1cti&Nj*M:NDXZV$FBS/9y6Pw!W/hb<eb!QWXBTX<>DC>S99$4RNh!:b<<*qITPPKwbt=mb4N:Q!R*W
w8Jl#6 64b*eHd%DnkhtbmiY*K>61*9>4*^/hq*:#@P@jy4/hhJpml=C#%&p8/5KKhlieVP&5bTD!?#T$^CTbWk
XT&B9> y:*HWFXY*5D1$EE4Cm9EEn&\\>K&6LZ*>5Pb%*P@X?EiuiqHh@8B1T<4!E1=AHelPb84A6+J/u5PPdpD
LqW+>Z :a=KkK/?CS5K>tQq?/9H@R%Z5^QQ?nlbG!q@^*@D:%dTNLa?BwGQmEpA\F??ikQYB1ci9=*:BpiP\>Hn
45=C<w *::C9!L>p9n=a@:LJ8/QS^@e8\6\:?>NIQDDKYBe*K^MPBb8p/D\EQe<yHC>mAuRuyidZ%lei4W<54Kt
$uhn*k =tbhZZ$>Nq8??9yXdLJ>Cn!DC\u&>@b$h*X&huR+dGh6bYFmZ\P@EL!CnAV=C^HmAT?W#kH\lS#t+GR@
uQEDyi @S^?IT\+Nldt46<hTJqG#b#S6^ktXt:8iLTAb@lq9JA\lB%<H*ehSTYpbKXZ:wH9R$%KTWXNE=dq5Y*h
&KCLYA dy:?IiFuI1NnElIVp>LV+aVJ*L!Ck1J4II%9:SwA5P>kbYRpMtA#lblRb4lMFMPhX\=p<5auw$AtQ%ki
!!4V8w =&JEkLnVK>9ENp\&uVQ6^FMRJA$ekm=i8hHaCyiE6RKF8huT$h*V&>9V&hbRWbCSeC+I\G=8yK8lTqBC
t=E1da <FT:YCuY5SptqFRMCI=TTQE4y9EmEQq@M!<mLL\h6uF5^Z:AQ@&*YGGBElRW+C6jkwET=N+IXCaY1Gj@
kIpEe$ I%DXYKCa&hqn$M55\!<95LJD1eeC^eWG@kE5WHmPnTL>=p%5<h&d>#9JGV$Sa9<FCQ%KSHAk+B++@HD5
uhl#m5 !J45<M@Huw@Jd+da>>?a@wc!ah:?K@D&>>6L+##MXZ+S?FV$>n6+S!SiK1=5/By?BBLhD>?k9Wj@J9Yj
Ch%iS^ *$#jcT=JDuMH=J996*d\CIuQ1?/+N@Z!\=ej&LT\QlSBcS+h*+KX/Vt=HF6d?8a*NF/D4QGA?ce#a$Dp
4phjCP ?#9d/t>WXX\4Lm+w!M<FcTa<Dp=%KV!6y1adeVw<KQ@y/&?qFp+uuI:bNMal$uT/b8atMa?mEAp/VT%6
YA&85D DiYmN*9SGT><B:4a9yik11Y^k6:XuQyhwY6pa4#u&>e*d!IXAjJtyw6b+MWI6Q1Em:h9YES<Ttb^Pd\\
CMYLLw e8jSp&e9Qu:?<lZ1P:KK41?SWFTm1cG&i8P5QXqhYttj4b&%6cWlRXbeXF^SSXqP*elIR$=P@/D%\aMI
RTj6lV SQ/kTHyL>!&R^Z@<8d#$@hN4iBmHtj1e6MVw5<HidndcT8@^akSXQR5Hq%M?\YiB\RC!*hw@M9HmM*aH
kM9BHB yS5&\yEViam<8JKYCWViH<:QTp4Q!m<D9>il?^NQ**!e?\K:*:=>@VL*ci:46@Z=*h@t5Hq6GP@*S?+C
@wEl:< @iwHV*KPpRApuwMLS<jI#KwXFBSTBBiXIMXwEYQl=j^<<1yb9b4ct@WN#e%\cCuehXy=9c!$MC<:QTW?
&Lccdc Nm4mhHCk4+?u8=8#+:HDNqdt>wYubcTqqSVqJQNtZ*<6pRcQIA>HR^\mR5eHFCu<aSRmLM?Ca<e^F:%B
9Bj+Yn y4&aP6Dj:Z6bkK6jSt@#n9&8EBIYFh&BjS?m8!WBN+6b+8IT5qLkG>QYN#A^Q&l:?IT4l$>kGL!1HRh9
WFt5$W J/hubq:K#5/=ZFBae1&!64G6B#K9!A/bl&6KEYda!w=S#\Kw==KC?j#S5N#P1Z8%1h:t!ln%G5+bQiQq
&RGQF$ @u1Ai1ZhPndiMVtqFVY%hVh41/+X=bhY%na$NnW%*K!?ty>?ITLR\>HG*FBLVaY\n1iT+5S/cqDa$I:n
E+kp4S FQ8CmV\QJB=4Jh45qwQ*ewVZ6>QAG*bd?dbaFy:iJT+1ICnIl+XImw5Hlml&M$Tnpan\99<bItdk/$GI
X=^wp> YB:@4kC$A=Z@?8b%JD<5+uE5bP*a5bMQt+!!ai9l6J>@LwXC%6ek/=?YWL1M\CD@kKARalldPFdFP^eb
cnT&\j HZ$?Pn1uCaBP*hQa>Ij5/Q>knu/54!an&F:uN+FjSe@<5EhwjBbYK:wQW>#Q*/GuJ/NP@H5Mu^Vtj9VR
kXtH%9 jk6LP!i9$$tF6V&nM/<@j9$JWWj/\Q8J>t$WLGeT?ipF8DuMk9Kdy<pCd:KS^\NH@@Ly#MVDi*eGiq8d
S5N?D^ G8y9XF/@i1&$8QBKWXFidt/c/@ZMC#HuI!JCk!:Xl6=++P9p:PSk$%X&<PAl!@$Y?&It5k\MDSA>cm%%
mj%>kt m#4nL#tKlKyQZ&QFqVY$NhDZ@cP#Z$hQ\lW8*>1Cd8V9*Y61dtG?pLZ@EL!X/P4lF*\tJmE#@$yNR@9A
IwEq%E !IQJ/bi9Ai9#Q#dXuaSK6DVY*hk+jM<\p\FWR$h44Ca4ITwtT!DI1?wdcTuI/l/$PZRIBdTLYl/$C4#S
&EZFNi PVA!>9V>QLc??Cq&EueV&9tp&HPljl:H>^I?+HeSqLXMdJ*h9j^D#&F?94=n<ME$uMd:eib9Et?l4RSy
lGNSWk F%LT&teD>?YFSpSj8JmctX>c%Rn@DW>i99@+tVlH@@unB@AZe*PpL?ne:w@9*:^<Nn5FaL<*eth+CMLi
KuSZZZ %hFYiymZq+8Dqb&dub/BmXui?Jl9LAK*mF%Bm^tL+CZ*p19qXhX$6jYNVc&6dcS&6DYk8cH8SuWq?BL!
:t/a?N e6KTE8QQu#5dGlLk/*uK>cTD9e%???8bPyy1BL!5JQcNcQL^<*N#hJX^eGHhu&HnYVl&DuaPDnaY+:1=
5Z5?VS dAXt?IWI5ZD!eG=<Ijddh+1Kjt$L9JG95F6cXq=8IXMiV%CSWqZZBq:M>MDB\<hPiHn:B=<?E^X>+RJ&
l4/BRh :\LTDqL+Rw#&y9ci\TW<qRAV+#wDBTMC=H$X@ICke*CIAD89ehA*yiH^YE6PmI&/$p@<PJ=B!eC*/P:>
8$c9jN QBi%DpC>yh9bqP!Ca1TWwdkkJ!M%?@KXM1Te@XyyWW=K*JpAnHMNNYZCKy=KXuCDe%wKGy!\tBSb&mup
%TSjVu ERYTIlQYjmCN#ZBAh1Am6MIm+A>lbD9%qkMXGTSBW!EB91\dwVWQ%Hn+RHA/T<uBaj<@k9MqXwmbnaMX
j+$$Sl jhW@?8V4/CE+Mk+Ey!bQBL!k8Vl?b:J#Iq^CYC5i%t<nVP/np=KT&Y^yJ!18R6A@LKHe:</F?9wHBkaF
EV#?LH l$BHD&E@G^GJSFFHyDb$4dSSDbdMRW%jY<cP*ch9N^XF8=m1LBIE%QVN:X$Cw#MK!$G?iGeMmQ4:L*Ba
HYGQ\d ILKJPn^utl^1KEwK^+:p4I@<=$kPc:uyR+pw:c<1YYElPLKMp=yQ^Ln&J\a/8t4^H>IjQdk:*NQh*64T
TFL:?N WFeD:QNXdLyY+TY*66dE?JnwmDD@kt8GX9*w<SPPS&&HZl$<hMnK/wBy>J5uSu9&Glwc/Gqy%P^=+C?q
qeW5+t i1T%?+mct4dP=/uwR+/ime%Slu6N>u:NqV9S&tqmbt=l5V^\$N4?mMNJX^?@<Km+%K!m1#Y6Qj$nn=@M
@Sa+KX 9u$QMQ@^m+#=Pm4S%6!\Wb#Q!ayTp%W%6:M?cGYtKTeqKmcyTFBR$nZT\e6wYAH+KR+lB%G4uba&NmZ6
\m68Kp jeAj\J*F9:/?B&u::d:&l11!kp5yF/LDA:^eLNW@+ueyKY5aYS=*QiWVGB/hpJ/H>e=k=*AdmZ6KXKC4
%\B\Ha @V/NiYnpCV1t6lnub/QnRPwPjuIDZLI#@j#N8\<jQu:<<PH>8#h9*4:@<BH=lH:Ej*n*=5Y#J^nyh&>9
/M@tk* p6:i$u\>TETAq+8NqaPDpb/btaGFX</#1LmpBJ9tkBVSZmp44/!=EXuj&NLcn1&u:8tGT+5d/&>Y\\YR
TmMa*S eQykeu^5JHD%AV/uZE<eP&^%8LXXV^8aZVuJkt81Xu$wL#<jN?jRT@k+e*P#l:^=k5P/SNlbYY48?@E^
PnPw+= &:X&H&dBejP<u+w?iN\#5Tq1?\+^$c?=8<F*IkGj%?WBiAFBTp%L&<DR^MLT>4DnTZjj\KD\mPnw?ISp
JeHCP& &QKbtbWD6#BB%194tn5k/=T!HAkncYMBPSu&JiDqbjF+qZ&8ehj9V9XePZhMl+C^V4A+W#ZYj>GiAFlZ
pT^Y:# *ieWHJiTeRuJFwLHEDGJcXubiTCu!e=IPl@8:*:eG1APdQ\!uqylJ^$%pSKlIqFT$dD8kGu:FkXFQIGk
lSmqHI 4K1GZaJTX%QG!$yJACe9C4IVpS$pEXTaiy6qc\5m=LIFwH:=KkHEl98@5Zu>V&!1!dHyP5#C\5:?F5dt
pImiAt FIkNLNB>!SX%c8uA#8mYB#k+8dt+aE8>ADq6^^bBpAeypiTJm55R<%iL1GCC9/?9u*>AaBAbhI^#pLiH
H1lH/< J>S*4:SSD>/+R=^H&Wu4&Ju:1>uS485yAZb/c55EIXW6I\9:p@+S!bi9aVimwcb@@Qad&9eN$4FP?IuB
8P65N< l8Lp$=/P+IG*P?+iFHPy9PZY?NP*eF+LETN>FcY?4T<wCP\:?L*!T/YSPh?@8p^P&RHu4=>n#R=Dk\N>
mF9?pF QY%6VW*%eMjw6c8qBjtHA1PTE8Kn#wWFikh1:Zh8c#:tiMR84j$N?u6w@*+#:?Lt%?m:VAMnR#&6XPGL
?&yZuq by1c&ptlBA%6Qh&Se\y/i9y!48=G?$^N89\qhcK!Ze&R@TKnN??5#/a+8Zn/BphEZ<#KK+P4bG+>tHn&
L@4n%p A19N@X4AKF>DJV1At5PKQDb<*qBC*9DkIT9L@ZwKWtI:h<54KTlw\6He1qd&%6cTl/\QHV^wbYX:KLcy
-ANkNa 000e6388a99001202b3 Page 206 of binaries1.zip
HX=S4Z B$RJZq>buQ@\e8dS!EBu$\*M8<ieDjb^Q/^H?A\MPRG?Q$>C$aLq\e8\/Hb*:Bp=aS>w9JaLb^VcG16B
=wiCTM #k<V>M#6HQ>!uy=dWquj*uh:hQLyK+D*8*h9*:^=>iLFK@mZ:>?D@@Z/^hMuW?MR<&E5q6%heIq$a<QN
WCAcbN G:G!eIRlP\eLA#PPqaX>&?GT>XJGkQtX$9LK/61G!McY>1/8*6/?\aGBRdl&FG/+1kNjRnH5u$$BtEhH
weN\\% lAj=i41iPGJ4HBlq1K86ym\9=S&w5M&=4aaHQMlydiA4/RPJyZMS@EymkL#mYFIV#Xla6q$MJdB!<HDj
T^^9JI QTeQ9Ph8X@j6w49EP9%Fh$hqP<5ATeK?pTRyDT$>pLBdHLKHP#J<A$LPSJ/QTeAkV\N/uyMHq*?ZqEQI
ZYRDp< i+eY<hT<DNC?W#A8MXE#M#HnkG@uFAeM/n6EFA$<8ZW>*t$QSnm>m9&Fy1ttTQN&QJi!$YH9mJn+^KTL
4=LX$T mZBddZlpdEITp5KcjDE?K6VZ%eHc#AD\@S6QKeFMyCRBIcitw1Vd?k*IPB>iYSW<W\bGi+^NRCyw1Ki6
6^59aR SqCRAZ\nw6R:h?#ekalRdFjj4lMa6YZL%m%dBQm<A?V+uh81aXlTaXl/@+dqQBcYqM&\5PA+&EBaEFab
:E?K?Y MXh*YI*4>Bjtm<^&bPjp+ulRC<KT\EY8!tHnq$RB*:C#SqcYJE<BZMWjCQn<Ip4jFlLp=iQu:+<E$kDE
Lu@uV@ R<PReQw#ESHu\tM1P%ddcF1:ip8?#KNe$LI9jIh65+Q%?ihP:6?n4cbCIt^VWhM!MLE<jNL*VGJPYVXR
DcQS>< pbGJJ<>i9h9\:wB#qCRKK@Iju5MdL!pSQ5=H:i\euL*DE@P4P8=P9Zk@>@j\uSJaiHRFyZ=#XFnkD#?X
F18IWu 5Q8Q*^8Kd4/<6IH/?>hA$/etwPMe:894:G^9Bk>uhYXFTcGPuGyca5L=1NNBm9KKdyL:@b&PH:W**H</
<XtTy5 N?Z+@9$YBwbt+dpSi@eAWhe#bNPV$hHTP1R41cP4j<BhX$ajMXJR$hyn5t@jWT%JW\$>ud$HLC*h>@6p
#Xm85$ B/m/uQINPuM?Lm&*?Hy6e@jA!KQyF!<@jwckL!D4SNIKK6GJ/Vp<m54Q#uVB!/ldYF98Q&BEpBLdITcL
>#Sua+ X=BSM>SZqXE&6:P^y4c^QtRNFN%c=NnX#wF:+<@l+P*9u$GTjt<I?Qd4$LiVY&bNXij\8=WI1nwt%p=R
9$89ql $MMmkZM91kCJ$d%JtKh@jV//PT9C&pkFpm+P$mh:S:mR<&^WdEJ!Y8+XdHQ#k@EukP>Z4%?@i9um?i#V
*IbM:w =!>iEX>49RI=?5#W?CPI?iBAj$<*J55dk:!#6QnlLGF&HCMDC++F^/ijY*d%Ky^JYqJ/:Zy%dZ%VJCC>
16a&GK y:h@+Nd\<J$:6?Gt=h=8EIQGPukeX+^hkatJQB*5=?q/*F=JVuYQ91//mwK$w4#a>6*:@iX=8Dt^:?Ra
1n?qSM <KY1<D5=1<WG@yJXV$?cqaZqpK+RnyNd$X%ZCN=IXhHT*!pthqSLXEJhV$eBiE>*C@mXTGuB8cV:D>ke
!8PF?i \Yd^B+YhnVwjC%AHyKhl6Vq!Jd/t91Yn>^bAZSSH#6V@AC&ubGJhatMVBGK8cS&e*V==@&cc4+WKS41Y
\%j5^u T$dQSGYRaV6?J$HupF9\/amw/Kl#b<MC9H&C\!Nk6Tw/<t!\6<9SR/d/GmwEBE?l8Imup8Gpl4jbcCty
b<bIAm 1Kl==L@nWeY6<IwhHDF$+PAl<IWjQGC^#%BZT%qBc9e81PmpubR:SDT&T<1yd6C8KL?VB$SG:u>HS9Qj
Rl\IVY phESa5Y^!:ny<4EmPGpXLS$&h4anY5J5cuw/Y+H8a=FSkjNjBLGb%n9?D9&YqWQpWRXEESkd9BL%8$YW
whZweQ /W>T$Cp9H!nyAWkkK$d</VNuI5/e#Y#5BLd>#4Zu*%DCyt&jGYt@h6HQ\hy<4:/864a8dFY&eZD%P*$l
A5KwK/ <$yXA#Cqn/iB1H@+km*E&cV>D*d9jKmyND*T*<*S\eHJI#A!6jlt#+Qyq*@L<S>R!1Zq>!kh<a+n\cH%
#ZJKb$ BSWSShbR&l?S8$D895JQLYR!Tq#akN<R!D\G@?j*RPmj#w+@j9nk\i*dA\N>+LF414>Shc*pTq=tS9LF
bwl\nA &Pk#\WE?u8+8Lp:Hnl<:at6nk?u1AR6#M>N>JBQ1jebG/9RTekb/i9K:>WpG>IaGlwB=E^NpH+Wb$RLb
EAZl@P L&aJ$u\d8<MPJ=^l@Tj!\5XLlcZXnS%>\@jHu:=???WLQG>jA9K?nEy$h:R$*K!=DnI=+PKVDCWX>%lb
KXRWYQ Y8#jy!c#i<ePcRWFcaKikd1<9L/NuT%mk%wnl*ai65/B+by>6=t4n\:*6yE>QLq6%qyL/R5\=myci!$h
Iww9kV ZLCWNDwlLdip1wE<i&J^/jQ5TBe&n5$LntQDdL!1\Z=:&A+Wema1Nn+yNcea:8Rb8ki?qGeV$!>iQH<&
L%<AC$ ?&S/BtD@uQSCC@!Q/ep^AQ$hAH%QnytpWi!X=yat8Ctu811m\E1Il+5h^<dG\5mMa&HlqI@Flt?YqX/4
1p=+e? 1ALR6#J$hQZ&D>//jYeE8Th*@>:hP#AQ/P91dK<HWckwLkLea/$*91ien<G=9wb/tty+GWu^ueJdBQpR
QA1n\\ dk4PXR/Wja$N=cBl^@F5=$Na?RT&+>nJN:cE6kq9^\yK8&FHGCLDKAeTc!YCm11GyyRPuP6$+KD>MY\y
FGi@wl bTm\:4F^CRpycjB1QJB%tKh95N+HYXeRaATJP51+!kTQ*mnlnXWPht+y+N*N9bQ4H+&%=Idc1m9>\p@A
#qF^HZ qZb?lZhGC#&$&9HTTy4tV6:?99+l\WH?Zt=PJ$@=BkA5RpPC@W?hPG!%V\@\n5e4muQRe+4JKK:k1iRF
de$Y9I cWmW#FTWkH4\J\W49MA1y1T5y4QH*M4c@1nDeceVVp/PDwh6Le*&/tp1!W1Km?<TI>6=XJlmG&p48wXY
JXCZbm EP8pS:mykZ*@Z>GlEhnGmmNji&Nnb!i!LdNVe5Dy1b#<G=je!JhlNyyq5h\e*wNb\CCjZ$AF!*^<QL!<
GGPQn^ AiXA%\Nkml+cGu:t>JuVCR&hWNQ:Y&wZ=qHF9/:>eX>6VwVZmTQYqldt=lcY%pClQRLP^GWWZc>9lTe<
lw:&R^ V=/@i9hyHqy*BQ&Km5M^m$5a=eQN%:Jmkn%huE/+?aSj!L/&eRj>J*qS^!iWq6RQuQCn#!nD&+4c?9LL
h@*ZWW GeiQ$=S*nH=dZEhyq!<VBAWl:aKKNZ<YAi$IwN$Iw^%Y=iHTuyjaSw4S$d6*d\%$>*T&N>!59Zd%em+e
Im%QML lZD?ZGlIkJ@*KVhub$iua:D9\<ac9G/6LA@56>!@H#GnM6%u#LB*#%:n9ZBtKYKMtnD5M#W#N\h@HmBc
i1>F!w mwEZ\/FDN9b&+N5/+i4t:S>/:9#F#J#m<41Y:kFkpJ?@jj@qG>D+JTJyCbZw/Y!DL^15Nuey\$bTS6QC
@8=y@# e4?Flbc5^E+SeVpFYWW6A!%FPW%4i%9WF4XB4EWQ&Xq=*ikbjnm#pdK@tHy+h/ADM@Qy=L=bl:*KZ@ET
jKlt%@ BBXNpCM=8*u/BIaCN=>^?YyNe<@\I#mw<jiHneuGIS+PB@R\*uiyGXpihkK@YiB8a!+p\wck&8c8kbGH
ju!C4/ p%Mq&jtZG\D6W*D@\615QMnYRWIEZNJkVh#q1+WyEj9N\&LT4%YTF\AWPi*p+iHC5dDlGJpA:S\:jK?R
Ka&NC5 !8uJ1Lh$MHj*>k@h9uN9hQVSw<jII\X+Xu<Hu6/%6#dX*:^iZq!Wp\HnH?Vn+iSk9h>$4#+\6HLA$P:e
J@+6wP 9pWA*k/B%$M+WT+K#n<eFP#alR+eN#6=#kVe9An9eJHd\BA=JpWFJYXqFXW%VY$hQu%D+PDl$EYa*RTF
BnkZ>M lJ@DaIiDRbFL4NpkV>@R>e/?Y?BJF&FGGFB5=SVI$kH6FM!LdG#dFjCEQT:pND*!8C+BR=%ked4m$c&M
j85!+A +!46iHt<t4H>TYMyCdtDHm=PS&$PP:1+u@L!>9a/li$D$%NZWeLLCHIA><NAT:>hVEJiaS%Qydmh<h?+
WkbXhQ $?>W?I%uIcl1/J6c&S%#P8q?!l9^=jWB9+T#k>%B5:*c19JT8<X*aWh^P%ESXtH5LI+<pwPZq<mD@1@+
#t^ah> IDl1Nukunl*qwINVKVk+PFe+6uF!eZKTG?kA<Nm%XyHNiXC\/E+E9\8I?>ICTn<dHiDt+iuyljm\diV1
m/CAN> MFMQD+88:kA=i8hA?STkui#kQ:>=QuY:yVR^*N@n=HGHI$iPHuN!<jANmdmRn1&uGd\*Q9MWTQ4en+Zq
Vt=%Vw Na#&Zb8$9=ked1*ImV@6h<4N\#5+K8X!hj96mYjpRY?A>p<w$&49?NjZd+c:i:<Tj/DM!J64Ne$h#T&6
:T:F*k dRP*/d94tm14b8hB:p?:%tC?Bcw<nbB+=khpcRN<*R*\9&LpQ*5&P#MD!S<bHl:5/?=w1K<yL:8eu=tY
m\1eV# EBebeVw5\AhiuHM=+RS9^S+=jNni#5+Y1C\h\B@\d+cawicwKYyGc&=l5Z@@AeTT%81k%eGD%mRdWY5:
LbIT&d P*6::FM:8=#!<R5=Hb&ajPq!&e*G66/:D/ijkDV?&##AutKbSFyEJZ1:&q8\E#nM*ah4T?GND%matl9k
jmHpjk JWXFSGZpbYZX>HWIe11Yl?&w:G!B%CQY1L*Iyc:BB%M9=*:BI@iZM+>HB48B8T@N#!R*$y+<wKE$n=hW
B+N1pl W6a\MLN&^JR?HNn:T$Zpq4quH:+9@*\#j18q<uJKhJD:WZN6<LQuRVck5ej1!Ad:=!<pkuTk@EbVS@@6
dY%4=A $hHCw1/?B$%q^aPQHw<B?6iuNVja9*Wnwdm&99JKZub^cX:miX?j#PL!!9J4beY?m4#e*G^AYykaeT#M
pAu&Ll dAJP8SZZK!11d6R%6uS$M@aND6$b8j@\<jkEMmp@MVp=AXj\*d>:8\>8?/t:WX=YtJ8XplB>J5Dd#jHI
%FQ5?R \j$tlnwc!ul=/h&mI65E?ZkSutX8I4\G!pECV:MwHGuP9#FMH/kXVEBq=aCX^?MJBBWXNVkeSM?A%*C9
@FqAqu 5buqRj8nVkAq@>A#=!Kn+!+pZE^BWntAw+e*iQL@pn<M!JjtSSkRilTRn#B6@1DAAYQQB=Si%!GmGKV\
&XJ*lG FjF8i<u$1>nH%p>$Z4At6PP=<ey/q61<dK!59IJc?\?aYhwehuB!Rp/\kQia^X+hNSWqGREeC:^m^<mK
nI:+#5 a&btFh\1LchI\qM4m8KwpH?>Acm*!T:m6^QW6A#Nda/hBL@u\NDVb<?iPZM/LMnj\<ZS*t1j911CFEpe
WHwIDI *aYKM5CtP#mTb\5mCG@K<XGAX<A!N<yFBiDinBMpj+GVBF+J/>n%YV=+$AbuZt:Mqjq:4A=Xuw#>AqD=
AnS6Yk qZ\jX#iQW=:kBidn/?5ZkBZnR<NC\p4dX+DKD#h$E?hSV8#t&=j*L=/MhqhuJ$TG?Z8jRn!E9H\DR5:C
NXniQy Eh%Zd\AN8j6+clb1@NhjT!94@\Q:1d96XjuJpTF?*4=BEjFbyjW>D<l=P*aQ:lPK?>L<HX=AiDu^8Kq*
kHp+/G htX6EcY@ZhDR$hHe%IR$wk&M#Y%66@51!//PL!EwLZH8@pEMjpHSk:G9@/BEDH+DLMH@Ma@S@?dX1^e9
9lhYWY up!QnV><iB?+#P:&^y5%X$58=&YqJ5bGuRM^D9D^>HS#P*uT&jtak<QSw+B@P%9:\*apc@RR^WGTFipA
n6#?4G ycWX!LMQ$aN<&<dG%6/ihHkuaN:l/QHnVmjh*D*B%*W&PmE=M/?$9L/=j@ni+!i9ZkH5=<uaL/AT@V$h
el\yGn 4dB<S:d*!RjEydVN#QibG16JmRu9pJCVpeV4/1uK+e&Q&KN&CFB<%H4uad6#dRMnE!<?@mAj9I<@GP=y
=ny6CV 1/?/Y4l^Le:N*wD\HT?qSFDVM#uw+AKHkaiiAR+@=$yqQVd1+6P9qjtZn\ic!9PTIkNeD=6ydZC9bZLI
-A:EGi 0004e97622b001202b3 Page 207 of binaries1.zip
PWTw^W +aT:h$DItZQu+^IA>>h15JTp:&J4a??6@9c1K!q=>jhG^=EJuetJmZF+>H+:Q/G<wd/<IDM>M!M6Qm4W
GSN+ct \>9X%hM9?e1%56Km#ElqVt=PXqbk>FqaYXn=XP$8XY&R*/e>PH#u*wNH+^QVV=+<jjyph9dJ#NRW:NAF
wBmE@< cZ=jh&6DVZXb!iZM=A8SaZ/uZB^5Le&N>dZWqBSpJDHq=?Mq<c\C>5ED^:ZP8SQi&edcRpT^Aj$a>wyp
D:mA&& Z/<PX/*y/l96+aGV:wHkP=+AZ$yRGHm#ka?atImpeKbtp965<m>D<B5&\FjelnCR/Ct\941@+LQ?Ah4J
?naTtM Jc1I%:AJ#8/Al?/??%YXjkQ$/VXQyHSM%Wia6?Fy<RT69V9amDmWuWhEYuQjjyDw&hud&S+$M>JTW>+N
aD$u+Z 9BAJV1NnyYQD<jAKTTkkAH1=*S\IJe5t>JR$:EI!!*keRW%u:\F:S\<@<IXE^X=AEup9\8ytmJ?Z/*F4
iDE&pS M#$%iTtJ*WD>h+tmP%q*aMM!6&\Skn8cAQ4w9$JEBPm9e<K@Z5I&ScC<&F^1Ra^=EXF5QVW&n\cPw/FR
PPTpb^ @IXB9@kdFd\h+PZm/8+B5Te:@ABatA<PTY+E$FN*>X=>P+<1pLA:eHAW<qBncZbKZBT<Vl+YHlEbA^/l
IAJjAl R9kIAitajIIyQjV%SPS@MH?91:a+I!+mNDnpdG#1=e1Y\ehQZu@+<y*eQj5byj:X<8\ycaaSyJhjj@c$
ud8!GI NE?6LKP5TF^RdHquW#P&SdAB4Wj4&B9:?>w14#VeZ$XSbC+Ep*%WpNL?*md+/DIVJ96A>:@P9Wjimd%+
V\6pLq >8#J=PTni*iG?49dY&644leZ=tiqJ5SFS=+JD\1A8u@K#hWXPWu9DFM5^?QHEAj$KBZ+KlE:pk$KJJnK
ZHW?^p %5/PbE>^bP$weu\H?DpuZX$>9KDRu+%JTM?<jPX/dXQ*$N*STbCtjJ:@<YMJYcak@WRqBu1:&y44c/HH
R>dCWJ l^X:L:\Ejw@bQlM#dbqhI69FbGRq=dZ$%BWWDG\QW\G#AcEZ6dc%QXLci\ii9@@Be94JWZn*:$b=ei/G
lkJ:W4 !Ze!X@5BtXjXNdG$l+PJkhbH\LZXyhYN<EDp%h#9Q%?id&\Y<ui^*/j=DVA9RhDbb\$TMMD<cVk<Ec:1
Wem9Ly 1&=w/^u1VTt9:^n5cct=h4Yq>*J&h6%>$ykY:A$j8V*p=lGbY\LZL/biPPQniPV\maCp!$WJkZ/SeDJ@
B9dhw1 ymp*F^B<NqatFtD*&Vk%+&68N4T$h@eN/k!QQBl>DIB@?9#F!%e9Z:%/?jL=$/i#$%Nn>?@i8RXik\$%
jTu5p1 %/@pytQ6\Y=PDwePtBuy119k=aDeC&<V=Pjq@eP##4*K6a8<LlN85mJZu1BDBdl9LELX$6HY$#e$M6:H
$=DH\q cYy^+JDNpYQPd1jk/Kt#pVF^kCCKbCTFI!MLT?n@Bj^9QQX8hkaGIka<BbdSa&MnadWi^!iDX>u9p>w\
qpwBGT B5@i:VRJ9@GV<Ec5X?:AYEYRWS8iH9!:h*QkeHC#Hl59nqhMY5QWHN=wNNGH4dMC#HCdCCRi\VG\54A\
@RkBhk 5@N5*/&I+Jup?Q<Cn%BSW%J\TK!CL\T?6I?ilM8u+yNVMwAl!e5FTYn!BYnwHG$6DFVJ%I99\5GYY?F@
>8:NRw 1Ej+WWA>PWkIJ@V>CBB=IleFN^V/NW#w5iuYY:h6nwje4NySKCAd%H<G%H>N<kcP%eZ6L@i?@kFBReHB
I:=Zh$ =&4dq>8wBty9A/FHTJnBj@6m=q=uhhuqT/tJ<WmeaH^me61q@C6\juDj<IQ^/hpZ4+HPa@ci>G@tZ$&Q
qdWa#c >nTW=TVHuI5+F=8eZX4ZNVIJ*Q*ZnV%?kQtHp!?upSuTNPQW>N!9h\M*?%+941I5!\9=X6=yDR&6:W*%
896!*/ hXV%DR%II*6VT%64b<*Xt>&LSLSeTpBRaJYjYpBR6@pj:NEq&BKP@1Ce@$#/mL=Gu?&eull>hP@8WFh:
1\jLy? e%*X6bKmuE9yGQXA:+MC@H%<9L#e*h$RX>TFHlD6e9Ip<G&P1CQJkiII<Tn1RD1GHpehKW+RV>I+8:1/
EK!@yd 8!NiRu+BAYFu#pXjVMuIK/!wd8:wGd:@cP4b8<?jAjRpM9SDRPk^j%>&BVdh^Bn6p6R!MVHib+AZ*:F>
L^pt:1 l+TM6K!cu1cTuQ1lI!mt>IkN$QqEpNe@\T/@k:^??6HIaNi@:L&Zm\&eICeNtNji8><YyFdaaXSWZEyY
K%F8^I +VZaLR9@$TX5MYhhcZdCYV>uP^MNCL&u5y/b:dGVG>DHZpm=XFBYXh@cQXB!?YbVd&>L:dW4yiW%R$?t
i9EbVR /#Q#Gt/N\wbc+I$/t@*%:ILTL5chQ8Xkh>R>LKt\9C\*^6N&4/XL<PW4yi:d8KHY+=mbYFmbeX#Ty\H$
eKjKQl Zd&D\:wnkQtJthqu4?Db**9+^>8*4%<@j#a:@9DB9V5DQc%NNheK<nKTa5ID9X!Q&S?$MDdRX5YWj5i&
tQNq/k LjBiPJF*HTkYpYiNY\#PWh8!VYSnqdPM4D^I\YFG4/cyycPn4&>k6HjQQqM#Hk84k>cHn#1=iH4:BREl
kib^bZ A6Ibq=mRVE4l\Dy1whV@C*^KPRG!$m<!WwEpBXl:LuE<\hk6984iXFhSlKM?tZjC98CTphEmL=$&QI1u
QGk#S@ qPJa^=HaBHF5dK\<P&VW>a*A1\4i@%FREGcma+R#bwH<a?+i&B<P\i&m+AWqRkhwS<kNhqTWFE^m/*kP
HR<c<< RL8b>VF*9@D#CYubiaWq=SXIFW@F6T5F&Wt^=$K<+Za=bSpJTRD<Ltd5Dm%b=dElN*DH=Yb5X4lJZI9e
bDHiAF SB+1pMIViaZ+?Mu/DlJ=8Ll?a+\N8c&G6EH/$><wA#IV=i=++1T4G?LP/uH1qJiQn!@M/AND1yiBy?@4
**&1pT 1q!eS?ZIu9:D1>t^kcadFdBXMm5#K#5u9@DK%e4cSun>i&^1>6qL1P/aw@>LPup:!1PB=51CnI6^eSiT
KaCVBa L^XX6R\<uIcGuy#HI*Mw>djGF$?RtjXyyyuy/Sj9*p@$N6!jY$Ebi>VpnI>eBN4X!6<EP^ad/?94/85c
DBZ?AD &:94!m1jLLdye@Q\A>KyBGVV!cAnG/An9$lj6u%??@dq!/hQy^<@8De<$N*XWq6hZuaqB<=i8ZA?M9IM
N<e/F: EpahFBnwS@JFjXB9Gm>Q#%PumB+W:lV8SBj$BNEbPat/IK=W+Q&HuEI>EP>69n:k@RejyJmp%E5=^YW%
htua6l >Y%>6??QVV%:<i:Lq^?@mM5@WIulkb=PcPT9k@eJ!N>Vk#ZFFjYN>^wd1$48*L=>q:T$yKKP6ww<+hAS
Z6mCX? t5Q&RNbJ6465Dl>&c+RXh*LL@M5ua@h8>dSmSn+qQ9y$pI@:<Z%1BMITZqcJwA\:HG!P8dmh\wR>PmE%
*MYSNe 8/nmJud^:h*<u+WQeH>KThcF$#+udE#WMelXDT#5n46+?AVA@RR^F#a*i#dFZc>4:&&98%=<yd!/49Qi
6&dI/H ?QlAjtSpWRjYX>jZ$>&SILqLVi@RpYPuAtM8Zc8:ul@q5q>H*enY\<9XQiF!5DRdB^jIcXtaYiHb9LA4
<@>Y?i aH^kiERd/945$^i9aB@Q=$?j=<Aju#>?AJ#QVE&PQSki:G=91LqYiCuq\4uRkFMuHG!6#I#$6FTXaCw9
4i#Ga6 9BXK%#LjG8<cn^mjkPBY4D$Et>a44\nH>RJNB=t:Hy\+a4^*H%SYuwPHdPGhh*e9Q#kjNky<QPDqW=Bp
Tae+Ac 4yRMiEEtP?hjlAN:Vm*FT>d&SWbKBmny:B^dFJV$HKNKl=+MqMi=t!lnmC6dSXR?G4=$W4$NV+&ZE\RP
Y5/TI/ u5SG\mG5>B!<&/XW5B=bbuEtcqw/Jqak>m\a*lVk=#DkYFu=6$uJm:GRKJuIpk=?$G$q+cXkA+Y6E>!j
@L&l4w uyyVCC@n6\C%ct%89Fq>LV<L9QK<ui*M6SYpJTWphwMMupX5J*b6dl5t/ZD4NDp\K#^L*P6\Nkd+kjCS
kXEPV^ ?QuI*y$<VuJntmTEY+G+\jdHZ/nAWwuneWeu==M84t=8H8=A!Z&\?4^Zd8N!G*X:Z?$+SB6c>@tQd==N
6FZBNY nZT*%MM#yyI4JcXqX<54d>RDFS5ciVRFjQ94h^?@jMiMP$SddBQ6N:Nn\?&%yZq\8Q?qk9L/4n9n5&?k
l8Z!CE d%@bIQ6#$@6bbGb%tnVDBI#A:Hl4h>hHFCGmDGQ&HF^T?8=SN&q::4R*%NiV/wCBd&By/Y!4K1!8N8bt
dWmyF9 +SGAdG@^ZF\GdJM\6lEw+9QIX?Tn?G8R5w>QQ4y@h:C*6dG?y1L$ClDWbMA&lQ9e/hQlaTBHCR+KRkLS
pHmhBV AJyAj>l8+Ij/wb/I%#4+kZkD/9&w+JGpQ^1<QTkp=QSypA*CuyZ5QMBEa$j*\N*S5bpZ:#+A6u<B?X+F
MW<IGM iN<i:IPtHVdNawNmE\+Km/5b:VE!$bWF:uTulNS8YW$hXWW=a*9$MBS\p8%8G#8dZHmID4L6yZtRyp?M
^hj\C6 *8::c>pnR9^Q8S!Cy:5EyZW<1wRTbJVX6I*M4S%Pkl#CF!w#MP>=JdBbDy6q6@#4*hV6nl1RKIX:P%pd
dy@BEE 1**Dj<h:Kcpdkj#R=SS=c%BMZHLY=hLKt<&X=!81t:w//m6Lmp19*&m?NZ19y!Ln+5XLF!>q%k%kDZY6
%5<d!X &d15dAKmGph#t@91m!Jh>t64Gh6:BAd/8n9cHD#lyeDP!5EBWucAPR5#n5imFVA?1k&u8:^+Db/G#%@k
qci*kN lPq9<>?@jj5!N@j^\<5ZV/au:6<b:t=y4L\Cd@FHBH8=Pl$?6H?jwa//Mq=PWl\p:aIptJD^WaAuili@
jh9?<q EFD^uhm/TDu=njM*PQXV*&DQu4*GJ1ctblaHLA>c<>nc&V5+Pd6:?jkHl\G4ElMDME>ISyK+W6I#+GBd
WMVIFV +I:@q8pB\>RK\tVPF^kyYBdb&Dkp<X4&+jp>$*h9yQlc1Tp6RM4Xn5VXV@RpP!kD!8WF&AHlSDaEl:I!
\/hcXb pyed<Y<ZpX*D+/R+KCtwcPkb+B%cbtbYEl5Fn5nKntQuElBlyKVabB#+hnpi+EFkt=T#h&lWRpdB6S5N
6KWkYk 4b*\@HJwcKC*8/&^5nR9LT+M9Jd*15qK\Y5#4PJa6^&Re6k@9^ZbR9wdtSY?u:^EPB8Dn<mQCKCCjNni
MZ1+FX ?G%@q#NA!+PXNDe=u@8FClL9uZI+h6#yBJq$h+>V\LH:?jq:y6aD6+=&Wyb@?I:Kp89^e?>i#D/?ljuR
Z<>/Zl G>XXXhW%6Vedt65/i+hGHwK9>ntR<M@jjm:<YTMS@?H<&/e*V!j8hnhWZ5pH+T/E+$>Hy%+AX@?VjLw?
GyBckB l>LPQH5&QVP#Np&ewblGylluu4!ajhub$Q>#taVTj\wV+\E^*e@wHuVnFtC>44+icWD1tS5/P#y8FQyc
LLEhbE <4EKaVK?j*aFZRM!VqyFIPw@pHu$5?Dd>/>iQb$iG^8>h/5dPQ/c/&XZ+Pq9iqJCAlJHEa%EWWRmb=E#
JmF/hN /GuGeFkRDR5NDR6D\6cC1APCk\PSIIykWmk^nCIWPd9qVESENHC/TWtyGVtFJhh4dnd%DN+hHb>=<i4D
T#=4ew q!@IL=Ca4*=HJi:iIy9$#e\<!W6GYFdZ$GCQIYGZ<HdlZbITW54cGukbR%5ciBBkn>nBM:lh65h1S4Bm
&dPX&j P4#d@k\i9\GdZwub>ElanuM\N>JSW%FiI<k41/ly/8$^Q*VplI8:J^D!5LQSeeq\^ZBn=>CDTVkQ+#8&
/!DJ54 uL8IVQqinQJnTqy:4a/RD/YB&J*HKL>i&%SaYFHd&6=aZXy$=XyqZjjI9eHcT^jmM1@e4G@Pmp?4c&y9
*&BBM< dYp85>:C!e:Bc?L1e>44wK/P?VG9+GD9p$h6da/iPPZnccHK!eKFR%makJw#5*BwZAhiZZ5Tu5t<i@@y
Vyy1&6 !%h+#i:Z:%@k#^@jadZ$LX!:@tBpwK?q91I+J?Nm#Gu@W<:H:K#M>lyw1SEWaFq?/^cm+JIAjH4FBaY&
-A!BLX 000ee33ffbf001202b3 Page 208 of binaries1.zip
F%YiXq C8<Rk^NnMbiP#jZXM\Amd4S9u!qR<RMH4A:cYN9c!l\?i5\J9QRk+&jA6^RVF=iREJ>$<YITZLmRAhZ<
L1JwXu H<lXAeNWmlJ5/@RI\!wnq1!#LLDl?PZWD5L^p\<dL+We%ma5+Kj\nEycJ%Ncy%4n4ApAhFpYPP/NDD1K
^EyCAk a\EPAI/B^HEL:yJXIPGbbjqyKADW6HS$LNkSGRL6P!5hF+/SD5CPWG*bTNQbbLCGe6@\tJSLX/1cP98G
R:AX:y d6>:?BB=#QQ\@5lRd$hhSWHtlZD9a%c/m6JTpyITPG#\nTlYqTi#nkmS++QC5&k?ju/?Bj=%ADw1lG:l
11uDZD &p1i8L8=6\F4k+e6?V<^%B@?RQu:nl+qw\=ah+FqPhld+?6h$91unc1u?e+<!kF:cZ=>@jD//hTD&\M>
*^KLLl HY$6#WkVj*NLc*6uD*mFQ\Rt:Spt=@P@FwFV*<Te9Bj+?hTD@6dc<yIm<D#hcPwbGb>>nXq/:Hn>K$1Q
VnawWu #LR@uRGkR$GHwJPtPb+<j#ZSW@*m+!KK@1+KqiLq=tZi56ZIQ9XtW$6VW**Din*cTN@T%Faj5JYPd\XR
?uD%>J n8>aSpGC5E/EqIPMjQ8Zd><?A99^dGd<$V*\G&:9cG/+ATk9#M&>BDqQRlIw+ppZpDkpqlSDeb+WSSFF
c?CXGw m1R+5*/YFLF?nlSJm1E/H^iHJAkpb/Su=q+8K1854Y@8HL#*eH^<>6YHD%?@@kJpw=D5EYDQP%1A:cww
NdQ9T$ \<:XW=JPmwkT>AHcGlI:6t@hKTG=Y$=Lm!C9aIEiRR@L&YMY*hdG*md6N4tQ=6iZ>!>tHw<M@iQQ#<DS
6BZN+P !*cYJpc/Y844c9IcYuyGJlcHnnm=8Hq+?\aC@abLaa4Kc:GSX1@tj1*M9^wddKp1VI<N<>yE&+8kA$98
Vu$y/8 dl5?F1KhZ%J^I?h<YXXnG<mLC+6K!/6dl$b86X^PnE564L^bh:P86nkl9LC5y4G^M9mRMBiPqWNIcyj1
4C$qB% AciA<BAA6w&N:XFZ@@CI<FA@a&=/V4KG+=mb&eW9Qb:E#aA5DaA>D&@&L!+6Ip9EBjGj*?e@9H@:+8ua
Q5j:pV w@8D*T*X%+w8JehGBQ8/uRSkt?:S%%JSpyMYF>&?Dhu!T+kEH6S6=KZh$6nEjVWA6T/AGw1&8ju?@RBy
*JnIj4 ^J4Y:4D>+cMPM5iPu+C^kDhc#\D6Qu<lLn:?+5ZEm^jl4q\+9CIud:N*dpmN<A6Q9a8Juw=ED#huW#CR
Y%V\?y GCqaF>q\:L8X#d&Tdw=PhBTeP&FEBy6k+JuhM*W#+wBTP==CupwAl=FND*DG\XWJCD5F&#1Ptb%nK%!Z
ca9&I= l%ja!W?H\ITdlwEbDwIFiV94Dl\4A?Cc/t@=nWpYWP%*Jm+6@%yhY>?6i+<tJyFy$mVZBHk18=11m#LQ
NVYuYq l*wi&ceKl%6IetI*Z<u**Ve99^JBeFaE9&EpW\kTlZBd65LWt+!#tLkEIppQyb6<1aZM<@kQqPFn:GF+
%9ByM> QH#eCVuBCwkG+8*y:iQ6u6pIqJ8ta:B1D9pBpF/HE!p?9**^bQLl!QAkTNGRL4Td6/h9+Bb+?eB!/w6Z
\aD\yl WLl@RIiPIW%i>j%:j8:>m?uH\%%N6bZq=hh4G#69Qby/@9dVF>k8m=AwANJ$K*$@@p*$?nR/R@jm%hQl
YF6FVl ?8a9CE1#QKA1\I@n=^MW*Cd4j?XcR&h4A%S9=91/=6cP:9cLG6!C9LDa618ACMX:Hak*eREKN@1P><Y4
#SeB!: &euH>+j9DQblTFhhLTtB6>/RT/S$amwylblMubReH:<YV+yhn!NikJ51$ERpFe%EL/GZ8ayK4qZh9NuR
VQmSAl CweDQ=/ejjZ1+>i9+HY^nECW:>$i:P%5c\Kb>6W4lhm86NQc&!W%>QWMhBZAe!w58q6eTqXdXWHY?NVl
c68q<D w$ePa$INYLa>/6WEN!A64Q#?>8HqLElK@&ZGR@&BZ#$C?$8MDQV%5EKTCb\&D&HG#Pjb1NnE>N^mpHH*
DAdIJB ayhnF9=<jjFwwQu/=hTaWK>NP//8wthte<#b*h5j&%wCyV&@yQ^/ZHZ=#hcY&w1mk1K4%?6/:>#89Jac
4$8>Yj u%^ReRNiHTm@YyRXHSlYmnVI*wmZ=PJka?Ztbijdh<4N=eRSP:6nd4/l+eHB5CSn8+8Nl\P*kVN8T>RW
#qEF@A M!!=jQ+/@@Q*\8Ij$nJ^pYIJYhn%i?:#^*i9u$\?9n*R%un>/8YMm>Hl\ZBHw9X?p#&/G14AnI96&L=6
W%C%FH eT9ecC1^bV6\+SIdLMPDM6k+95@Ma4<qdGIA:95whyIJ$pl&F%hZh$<jdIqDSHRWTLmSiQCNZiVGNnJC
d9mV/+ qe+4BP?1Pkm#y9I9QK$5H\M>HeAbBVnD+*NKB8nI&de1:HGJ1:k#*XeY=&G814RIkGak:A559DX&QY^j
Yp4<AY G==CqyIbPQJ%NlV1L:autA*t+G!$:G\e*EI!CFB@eTcEuGbVM#C#+PDjJ4GTeNS5VNVabFqPCDR>+cS@
u1j$N! SH^G+jZGd9kIIVPCW?Nnn<jGJ!etJ^<Q>:dYZptNCZI?1KMIS?T#TJIL/lDyHTIpaZR:kkXwSYlbeAWw
B#jmS% M\y6?Nb6\Iq9l=64MKc^5SNRyLE#M\k%m1ei@I:TQZK^5:M@+wAe^&$p*>CRu$mw/@kD58+:4W8AcM!M
Be!%/b @=l:@?wyuLB%:?:\LiIRP5^>>>:w+<uyJ>CH9@5I>?:?ASp*=Bq8aTHCHbwjZ5%PnQS*NNdX%6a%hR#e
A*q@y9 ^@cC\$91bIYtI$:eub&i^uBGAe/4$?kp:bQu#\e4J$kw%Wh#ASI@G^<Q6+CCT%+=9G6SZ>jTTt!udi56
YqF=PS N8HpkTCLlC?9wK8p6ZWWA=u*<=eQ+F<=P#p?PkyB:tl89FqdijW1WwIYwaX\ZSw^G:%EpWY<lGclYWk/
Ta&AYl SRayjT%#Ka8Wk^cAu%HCi/&1C1N+?Q=>mQH4n^?lJC?VX8hSmRjAdHi*\+#/Ykte8bCcqPC=Y%lBY%hH
!XbpP6 Z**Z>1%dSeA*w1mykbjTw:S%IB&S&%BpG+j#6/cAt1+8\m8>p/N*Bn1d@*46IB<Q%=QHD%6d:Ve*S<\W
D:mj6C kMi$54b*PPHmC6/4<MtNkKNj<$84+H^+dDLN$6!#$j/tm9#W<^nF/yBmDVXDC#6!5$#aJ5XZ41ctqFdY
5/+bG1 N>?<j8X!IZk=6R:h:4%^KVEy=>1N?44ct51T9QVWqPT#9ltpiwE4Ky^eHM^5*G!M4F5IykihQj^DRkQ>
Al&C:b aZMpEpAdiqKiua5DacWDIDP^<4p^Quu:ai:4>%<LT!9IM8YjSYTB>E91>?LT\8<9<K:S#QnDwj/Y?9LC
CY=a$I *JV+!NMBZm:HDl?$MAdblDJ\&>n5BYRd8u%^t>VYdeI:^Zbn!^uWNPG<@V*Gy8bAnk>b&\CKkeMGau#C
LbGQYL GSlHF#eZ%J$H48kI\WmGPZX5@AYk!8T#eLI!=&I5\$61P1w@<XTTPH1ED5H/*%AGKpaGaL5ytZELdK\:
nyy$pI ha/j8#L\bLk1^h>ck+DB4G\bjuZpaYtAWV8iWwtdE4iSZ>NnY+\\tEq5JHa1N4:hJD!qLG/n%aYTpy1B
>SpFh! Fj\WE85Knw1blwKEqeqq1Cny<PGJYeZXLd%*HkPltly@iQ@8uh8\aZB5cuLmVu>4VXHTPb@DJmy!M6LT
S$tc8e 1BR1mi=tlAjm&G$&pVXlmw$Ajh/KdEP&p5Bjp+S=SLC&\F&:^CW&EN/+djwDM6#\HiXj8tJud&6@BHQd
>ah1%e eFw/WPbVut/ByS%LdhT*K5iAKp8S%qdkwjidF:ASe9#^/IQ:>?@h8*>@>PHn<TuAMHDbd<HLGYn!MlDG
PBCHY& 9\!DFQ#DG:l/6Linydt=6SM<lnM9*5L1&y<Nq$$:@iD=%QVM!wam4+AjhDPQPy6449iVWAy9CqETHCLF
S>#Yla \<WnwuW+w:tyyZY%udbn5N=SkH8Xu$bk!=/Rb*C&/h4/P5!l9/Aj&F/B=H^<HQA:PNDX&hLamNRmqelX
MnRaYm yJRK/DFTnBVSZAHKZE\1Rw8R\9ZLj\yIlimX4WZF^WWqyTZqFVW%>jYNdV$>@eQ*H\PEZ&MII:?IpPBS
W?**@k 51uG$tXa<p=LVw!$&C/84KY61!Wu9HZLh4HhwyJ1t51!BMIBl+*iPZ5k^DbHHe5t!FMn+BcdS^8t8kAP
LRBmZ4 k#5d+8@q+idm:PS\&M/YbCMQ9kWHJ@AYhV@q:R9#R>lVeKukcuXD^?A>8F4q#?Ku&Ri>DiZ=KihDQMpE
pB$P4h @<B4E:V&Y6w:8b#!?SjC^Wpy^Xh4t?11!!=jLm/41P<b/t?/uH\^?&yNR**6nc4!!=uJCjG^IRHiunGp
kN1YFc ipq#RT=8HC5ZJ#MnK=i\$4HkRD@a>ARL1AGBy*&$8Dk=ec#AY:M!M*P#1*9e@jdn%?I!HBt>5QD:%$@p
VAMSC\ l!T&*&X^/ei*L=@jA+49DHa**mm:uJ$We!:W%>*=8P%BtDP4E&Tqh8%aF@p69E$Eb51!eHK#qw+iGX:L
=u!u?1 k>a&REqAeu#CCZFthHF%eZj*QPZ6/TpLD&TDR5I^jGM^jC<Ai5p*$FLVwBnuFycWX>$E@A:w1!u>\6Mw
tB&&T& dGPkw!jSWhA9\+!bFbDLw&kjq6e=hd<?P<^Bn$!8tu%$%cPSAt@>Dn!XCle4BcdDIA>tw&BHMG\Shq4k
M4t6T/ 5Vq+^Wl+Yq+c/J&JqLSWNHVM4K^@eDS54CBZl6#KkL>B5%Z9at*:\L&JJ:QVn?:jGi49lZh!?\d9QBmj
#R9&+u ju^9wLW1Q!H$^AE6iXpbcRyySIyTenemVkq91TE:pS%4I6?F=:cn\6Vdkd%GlFEShAi/p%JWDNqFCc$$
6Aw8:9 *Rc!!Cc!%?bS@qiB%8BXB:56Ha+=Py/An+#H1SQydXB&Y&b19$BpwbH?Q9j8%a8uYLjS=MV+?Nna?MRp
^IA?E: N6IY88n*tP#CM!!I4DBEhuZ^^=iQd%@MnN?@%hjh&hWD8>ii9wb%55WXIuVS*%C/6a/*$@>!$bBbq8tH
Z=EJha :c$hHX$6hi5Im6LtGEuCyl\BBn=8hm=^Rty:^\4R*aGi+F%e!@#W&@VcTK9wEkqbJ!+lQ=C9:J>kTn\>
bPtp^Y QV:/<P:hwaH?#p/pBYqe4/Y81c/8IJbVkj>c4%m9wCw9KXp9ZT6d8W//\X<HPCYDPu^@jH#/&i5N5X$k
VlAb!& 4u=DJS:i?#i1PSDXPH?FdXL1&yw/1tJd6&#bIT//C/?l1mC69NjlGP^#k+%8pNYV+j*QQu#@5\!d?tdG
jdac^1 :wMZX!QYYZ+S&%Lm=iH8=8IC&&NInuJPJ<k=DDDMtNdGJcdB#6Ht4q5QJq><?L:<?<Q5@S/IcuTI%!c1
5mCa!T B=XBAp!?Skt4Q?im+EL#k9CTK=Z%hhZZC9MLT/=Y6@j*6bctJYXi1c=41L6SW*HqWuLClimkAHmEF%IL
N5m4>& Q4mH\naiVlb&dubtFtatkS&HTD/IL?KQB6CHl=wKeuC^5bBaWYbk4NX8@IVn:PBPl^<@9yQt$i?:j@#<
JY@<WV Dd=\kPtuh:MVn&:%hh!5L5qJn#>@J6DZ@eSSG!9V9Zyc1w1!E1K4P>h*WAF:mIlI:^RXq=KSX%JXl@&p
mK&qja i$\A1qdY69dkSWXYCw>VH6+?Q6/?9n/?Q9+B1D<cJAqQGM=B1d$AYI&H1Mbn/?^V+NyN8DEJ\N4W*nP\
Jncn1$ S+MA%FcPn+FIl>LDi&SEBk4t*&\5P<#>M=4H^qwLI$<cK!@my@GMTy4H+&?P*e4&$PuEW!5yM:NSAVJZ
S#ch9d AcWw*GmAPYaT!IPJPC1&:awIuu+dC!&Y/mKW6BSW%NSMdI5+Cwa%KLC\&&^H*NDw%P!V<Ri*B:9dY=wc
4nKGX4 G^1d&#4:l8+?tuw<$6h$LV*T&</RICeum\JWweRm+1na88nKSpkYSXcF%$SYh1#6SEWy+PK#*SRTmBTh
:n>qT= >D?WjwiWSkNKmR&H4R>bR$h!?Ank>AR<iub#QF*hBTl6:i@w*#DHm#?@jun#/5Z#y:A6eAbtyS^Qbtij
-A<LuW 000578900fb001202b3 Page 209 of binaries1.zip
YVyu4< Qu?Jmi4*Z+9AGYPI:5RRZj4=>jQ:X:NVa@iGB\eGlpeiVe/?iQjy!&dy/l6K6ha:kW^VAFXFMGPMkq?S
1Sd4Dl NE&cwywbdTT%$*di4um&DDCqdnDAJnh^e@KG%:Y66NP%>R!qE4n+XwA%q5qe@AMRJT+n9+BKj$VjMD&d
Xcm<Fe tbteiAkJHWL/1dw/P%hcKJ94pWbTE>yMdFly?HNn1RFySn4RQuRR9aPPMw=Qd&KJLK^DK5GLEcT!4b6W
NIy9:: bpE1w&%&mMl4cGm1!&+ZE6wtKma14cc8JK&pai8+RTYY!^+=tnQ:Dk=YlBh1J1AJd1t>ZkJM<IZwM<H?
q#Zk4m Q6/iHl=841/4LnK8+HtE=ljThi:<lcTM9C5XYEWKG::</<QMTE@DNWnpZ@G$W>W*5*a+/W:i%$etMn5$
q9Md&t 1@BcVZ$%!Ja9F=iYN@V$hXbjTp+911y41K?:WXYYt=wah!HKL!AA/GPwX$+%aQK$HDiRTA:\k+&JpYY9
F9\^S! t=eQkBL%b\wIDA\>i&RHP^e:<HwWLP^MLB!:p8dl^yZjeDZc@D#y1\Re<AcH$j&c@@Ly:i#+A@Dyc5wL
LIpn4D 5yNkNh*L:jmSR#CXXTjIT?#/L4yVdBheB1!mDqmEl<Q:LR@ba4im!IpZ9H9wH+AE$aWEB+iGlAc^lkTF
@!D?Vt leGXN^mNIIjhCtHE@C@pEdljkCPewh#a%n&\V$9=B==1N!5NETnuKkMFMMBWnK#5m&!5uCyiTdWQyu4K
VWD$BS LukiWFNc\wnWhWqyu8^LQ/uXBa!9B5JG!RcAJAJhlK+Z!mkSALtGw^KWll&jw5!W&BBXPw^AB6bFHBWn
<a8muD FeWc?Q@EKdtCH5=PQd\#$N*YiLPt/94%!1wd>e&hjZeiVa?N>NSjTRl!NFXVpJNDbTtpTSmQSHG1ZYJm
#w>JNk 4$V@:Q\6mwmS^NHhqBKT@$b\ua^k?DiW@*eC9I/EyRZAY#k/Rujq:J4b&R+RdB/4@QSna?:^@Ph*d%/@
JPa^uZ jQH<&hM@5?^Qu#%@<j4N?$>#<#<^S+6A?NnI<Q*/Bn#6<=uJ5RjICQ8D^=NQu4<BTTtR^@WN?H:$#!=6
Gkhu%w TCPEeAP<=9X&tw:S&l9*/apwP8$pAGem$@G!YAYWhZY8AjT/l1:8+aZwCY+L@\nuK1$9w:<w!PYq6?l#
89hY5& AQIE?lC=m\!6>c>%p6yZP^a:%y9Snn?hTD>FH+ISl+/n$:VQu4>>?@p#Mw<AJj!KTn^?eHiw4/8%<Ya%
\&jJu$ uJhAb8=<8QcYZRRNNR$XWcE6R66Fh+w41T9LK5tbHN8WRu6:IIWuVk&>?dKALT=@N9X\bBC/%nLkYlQQ
8TB@XH S+RF?96/i*ti<9BA*BE*8G>F<yTuN?dTI1JnE%K!<p54/>4kiESaCQ:=du1p8@+9hl4j<D@^hpwcS99J
1^F+J9 cYjRZ?:Twm<ZZ/?61TnJ#!8<Wq4h%66Xt=?Ti4u!bpND*e&cc\XyCdG^=*\BhZ=?94/uQj&Vd6dZbiy#
hk/uS6 edG#5HG\5:LntPnpDa+nQ1k9K:!wE^B!%p&PA/+5Rqm%YSkb&jtCZ!<6AP4kbLY9Z:=<@jy6j9:Hn=<L
NL=m^p T:>?#u@=?H41+d$?iH/bt=paC=iG\w1\8at?q11CnASJjEFMhBhIPBWJ1q1/RAZND^!$5V6!^PE+iKX:
^G/CDH i5H:AWHaBI>\=C#h/VNu+IXAHnl!?&^p=Qu#5WAG+:C^65C/IwuwST=5CZXGJ6!cYFZd$N4Xd//4?l%Q
\:na%H 6a8iBp4lPkNKn#JR$nMD+<1?:Yle?i&b\c4WAD56Awai\ek#5&P/M>qJw\6Qw:KNqa$N*hBCKk\>5lc8
$Tyy5@ +lna8Lj5X5Vnydm\Qk%!/biPkYWJS<WCW$=aD$cwYCnyV9R@8NZV&uDn?6WTWlFQ!hZ4N?D>+$hnn+jd
Zn%mVm K!?hhdjYXyTZw<FtHSMBj<n8bjE*RA<Z^haAickEIFIKqWbqWDpEW:>=mF:kX=V9X/4bAW84k>CuR9p:
N^KmDb D86D^<+*A+6K$>4be@*XV@J5p+Wje^@i9+Z\9Zn?HHtGQEYi5V&Hw#QiaiKH?hM%\N>&!N@cEq#:<?:q
Aw8aVP $?uJ5ei\\DZ#:QZ:V%??a:ipkV&hS/tZGl>PLRHq?#iA%DPVR!%4:hT66=?&MuT5w8mZTAEl\VX?ikFG
C*aRD= C9*L9h%6AMGPkVaHAS=!P/ZDBETR8E!^mkAEEaAk<l!hRTcRl?5A\iXBbGl>eG%\9Y?yj&WI9a9iRVD+
%9Z>w# $Gh$4!F>+K$P/Q8CCw/Nn6#1:&y48qqhWX1<RX@$8YBhIWpXSJXbhy8R+FcSuV8pXXWXXKV$HI=9*LnA
?m@%eY JM@P#u>k:6e1#BqjkBRCGNEG8PRw+!JRliAkj#>jd??NSm:$qJRuiQQ:B&KcF=iatq%RX6ZR$Z@*<bM*
Ry*P=t kL:9d/j8A94!@p&jD$HdGF=*lBqn/Ab>Td:yBYZXNSYqq*M9F%$yd?#5dClKV<&y1IZ\%XaYb!ZGSJ<@
!hi?/5 VYdQ^<5#PMwu+pb>ZaphF#eZnwYDA:aI$XCIH@cDtTN59ApMPSPp#eZJ\\E!S#bYFtaGFk:d8>k>qC>#
J4icAt e/VQ/J#EF!B<**<8@Qu%+?8u6!<u:k>*N6?+YyTVplB=P6nd#itI:RG#9Vy1T9JTE4@ElZhLR6uV$MHa
WNnyGY 5:K&P\IQWYGc:AiuZ+cjPa8eI$ZTuI?PQBiNuPM+G^EB\I8B=MWua8RlF!kVE$mJ*BiVMB8cjSqd<>jT
pckeVI &YhywKaE$JPmwhq\wXD&tHC+SVaYuLS*ej@MTH%&?HHDDjSM@jN/yq5VHNT/<dVKG6^5dDmKDjdIYTPC
h$JG9B !h+KaI?hc\hkV$/A#B:MHmpwcFn?AIiKw!X85IhTM81X\C?&6CD*EyLBt=thX\ViuK&>h<dGS@5dC8Q>
GSF9mT n8^SAwItS!p4k\D+EMu%*TQmJAAhlTTRRtpEREei>9<NRtj*BiY>h>VCAqB*CE8taV*H!huSI:6*CS4P
Ep^qCc 6t/AHEKEb/dj=n=?kFNyZ4%<8j\C>@LXt:ejMLWDXyNM&\=I&@1j*>?@jQ4\=5Z5#NVp=NRWHD<Ce5cj
EW=ia/ m<8dane%Pd5?VVFF^J\tCumDVlPbwy/i868<$p:X%u1j1ijtD^ShKyLiBXh@$A9\$!wt>9c*4ddVhA<G
DJ\baQ mHFD5!qw%Q$XZX<qacklADXplnm^>uB6>M>D>PHH8&5QTSQkq*?P9EYB5JGAtj!CTw!Qnk#*h:e*%eEn
XlX6F% Vk!6BIDYtYM:6<51E%RIwpKCR66&m8#C1!w^!?DNV#l5KB6mJ&b4a&?d@?uu<l?R+:&ETeBAb*M6$J#M
H<kN&d qQnw5&El\aH?@4:A9Zt9i!HiEn:ATwdCq64+yI!ew9IcdGdj:J599%jt*$#h:c4d=M1E#JY1u1u%WYh*
qD@bk% L=nidZB%P4*kTpZ%>dLCuN!Cw4Lc>1/Ym1#W4LLcBnkiwKw5J!p8P81M4#?p!5jd!<9VI>k*1L!?:44Z
&ecywy hmF8Vla&VkkYK@XYT@<A/P+C+I*#5LNtk8\<uG!5CC5#M\M#l%ahlP4#S?IH1a?j+Ac!:<C&4C#<?Q4^
=Xkp%N >T#etZT#5nR9K^qp5H/uZI:bH#KHHeiK5qK@JaTqyPZIc@KM+j+V?/QHV<A:8:+BRTHk6*@&*Lpw=D^F
IWl1TQ QJLAAQR4+WJeVG\$XXS$NBKDAmhJt\npDHJFE=iALX@u8kkhJh\>XAaEyKY#>/CSt6I<uq1IlycYSIjR
X<mMYp W#HRa%eLKSqbj4E^Y?b%Vn=5Ka^&NXXX?kQSWn+RZDR\%Sl*SBYkyeMJ%>m6an/T/q>?ekuH#<c?DS=#
md@V<9 C6QVauXWVNRw1Jq\dM5+TnaGdFA@FRZGFwN+FQlc5>PTEyA+*k8JKSt=^iY%dRQ*y!hGP59V\y%MXSZp
q8EFVB WRAZIw6I4\K&=mR?:q/VRQ/TlYD#6VG!6PhR*m=#&MXlijAkVPmP\H#8?QGw6ubAXu69=hBQqAZ/!N@j
b=bNeI 9<=>?kDRR6/k4=FZ!E9$Fi:%t:j9Q=K4*55kpaN$deQwYq:+Ae#p8>e9aNwHD$LI/h=jKcQ<*Lm\IYS@
Gk^j8@ W:nbS$%L:SS6#Lh/K@9iwY9jY4SlR^E6p%lk>#CAm4:nh11LtmA*$Da1AeZ<d?kc\IwE5CK>JV%jt@p/
/yXjhX <Y1CPEMCKCEdKM&lElNa8cT>8c=tA/WpkFLEtZAdwS*!!pwE8T$CApLCIn8pqXX\<6Lc^:CLkWCqD5P:
jLTLuI PtJ&V6i@@%tB>/FtJ/FJdKtDJnE6MjdetjDR+KBA/Nb<jXh>yEBtAy*iPVk6K^Ptbe%hR@jGu:::84k<
e\Qepq @&d!VqjhXR\qS+ATiGy?+ZYAR:T\QRahamBe8S\SEZWlKkBwY@X%IBI=?aZFFa*6LhZ=/SqFN?wcRYJY
ti?E%G Y%/REleXFiGDKbT*F?Iyje4D*e@HI:1k:pdycTpiLqaeB#\$b/HnNjAN^1==aJe/w^$5FZk+PLC>mT\M
u?ieuQ nDnJyLqQH#?<j+i<qZ:*@kN+L*/bB>@hu\YRI:^>Quq*5K8=/tylVt4C?hQ\t9+SY$6VI=mi!T^ImW4L
FPQq^Z Kmmy\e+IM?AQwWSlb+lAtM>mm&58JCSiVEwmJ6PuJCWqJmVG^>LF^MdG^JMQF>F+wFDIBaw+an^9RtIm
bTCY@& NnA#QV8@1A#4Gim^Mhak#PPyXHFWCC%C6$^Q#RBEcwGNYhm>iY!!?&1C>$ENAkcTt9Yb$8GJ89Q&eHth
n$CP#b llLI#HB5@>5iLwD@#e59Kw%ZqBNnI4eGaByF!aBnA!LFKM+HY@ilemFW>D^HL1Wt^pTiSeJ=\Seau*Ky
t#6%<P 5Q^t^>Cnmej>N*PmQC$%FSXIkCPTLEq/TIyCpmlFA9\kG@^<lj!wAH+?S?&DW!L&A*E/bG&LbYNH9C6/
&D\IdB F68w86y1wBiE^+R@=:@PpcQ@:8&jN!#9Q*#?M9@n%?LTCpnCIDkWCEJmI1+5@y\HtL%>>RJ=^9L<^c8*
K@Dj85 <KjBFl<MuP<w%b@/F&6@bapC!BI!k$AdPD$=*LdaV69Y%h6jMaYk%K<elAE>hG#dVnVhc\WtpL:nXp8?
BD$Y?@ GV5d\IhcaFj+/ma@yM@E6!9Q=&hi#/\@B!S>JtH5jEc*VD:CTw&d:GRChtKnI$/Hi/wImCpmiMdhk9^<
+>*e#q R5Ld^SSWCEyTBG9HnR!LjDBkc^*#Dd!u=#?DBA6c9Hc!^W9C/A5LDad+pQ#Z@XB@meBk&DAVe?Fm/mZa
ZDuw%V <64TM@^k+6u:?cW@*%=Q*P/<iVW*PVwa51PJ5YPkDQ!h9bPdy\>pDtQu9Gh8Z9H%/%i9=MF^!/Y%4c$*
@/tAIm m#QT<144Gl1B9/8/pupl<6!=WE!FwK<E#lJ^b@Q$<ntbYX>Zq/jD^<$Ph+4miFkbPNSQlZu:?JHlCa5?
W9WR:R :/*E^pdJCbI5JlatBlal4>h\>l*!Gu$n@jdhl+?jIV^LK/5@5Icm8>$6hbXFibuJMSGlAS+uMVECGSbi
8bjEln Zqd/n=TwnJ!m541&@l=VPCdq1KP#/!q99+CR5DMSWhG^ejEJF=PVW>QTTPtMcbpbcYpyTepZE:k8\HIG
DBk+SM XKJE<B<ZE$B?FShQ9MAdn\GWpyJ?mh^L%>#Sa:>QE@BD4cJKRW&mycD:A@TIBjLDdqJ:j*1\Km*+mB:k
<W6+F/ b\dQyKS^PLL<:6mNcD9qZn!X5kaVpY$NP\>a&^Clu#k1ht+JBM<8\$G>pXZBQ?qa&Xh\KC8NtBANBem8
q1YMXj MHKEGdWnI$JB68#n/^<aGuE?MdP\9L:::6V5*bcmC*:&BukFFKBDppNqEbpX/RhT/>IpGbIeCRQuC\SH
%ITt61 =nQKP*@SbK<J9AeAi+Tl>nk+HD@Z$::aS6*bY9H:N<wKLS%Ma4>l:CAjKN+n:>dj54\D4!+kJ:?ZwKhd
X+Gwek *aBHAG8B@#wHd!5A<\i#LGD<j9#?5!p/XI>Gu1$DK$eEmkM6Ha4hT+M%nH9NC?%wP$6Hb@iN\ZWWZR!V
-A/*=Y 000e4f80013001202b3 Page 210 of binaries1.zip
/wbL56 lEWMYm=B5@KJwhX&l4clpTy:Vta+Nybt1@%LI8pH84yKZCDP4*@??Bb>@9d=/q5mIIi+5Ld/CbYajH\j
tD5VJc 68\%%&?Rp=1E#TMQC@bW*!KPq%hWEBdkF>m!ZWTC\E1RqhF^I6>HQ+J%wh1I&X1HjaLJ$d5ZM&MQd9h*
He$:Mn NEEHq=YTEBN%DtMHc+kQSAKI@yKB\YVbTWlP#!/ER!X:aVu\A&Du/!9IVlqp=>SjhnVX>E\QHZZ&<Mce
yFTWXk *^uAV4S9ZQ:q5w4!p58Ze9I9F%%9dGt+hmp6?^yAB:BSe#W:ITwm<w!*D<nI9EmuKD\Rh$p*X%e*h@eV
BKR6+h =&@Y%%ei*M4NCR?Dkd\\+tSQSASl%RI+<DQ/R1A&G+/Jm=&FqbtXtaGS$?#Y<?jEF#I9MeeA%$8C4\Y:
eEa9M1 XDS&d^C:<R+<clTeDuHm1P%?W$NhPB%CnmT#Lm5ty$mA84QQDN:=hnnl+kH4tdC@FLcRJ\F8+KV%T$k&
qEqZIl t5?Rt*MJ<JPSq5S%MTHyatJm$5YLmRuJF^M^hm+RkXZC/EqPTe9KK<LP^h6:Dy6yKZ@DW/61M>F5\5PG
#<+H&* ?<*GbNR%i:e?=?\Ja&Yqba\h4iM^XjejX$ZcRHaMlXk&&XuFRZLteW\ewmA4W8CnAem5WhJR$dK!k:>H
+YtiZi B$\8M!*qJnZd1Zih<HS*PZuT^hZDP!A<KnG#1LJ=aQVJ\?:!qJDni=WXRMan9!:*Wic%>KwMEa=WXXlV
hi>YeE uIP+KH%C&V=cGlwba:^A4&bnl^!l<t41YGmn/t!1@4XSewBXIEnL=$?jQyI?EN?#jQk+>+Y<=R<+6FZ$
LGINic C:1FZP&D&#I@a/uT&*j9Z:/d?\bjbtTb?aFTp&a/b<p/k<=RVW>lP4M?VVM=MVQY@d8hBFny4c@:>lNF
>=dMhV C>YFlPDmR^+B6XNb@b%4AJd&@kd9LjTRIBwBddiB%i<Aq9YF>juF#<9AuBHj9u/:?uphk?WnKnH%?MF@
@TSHlj adq+Aek^MFkB4q8*TC4IKWwJ<jEKd6?&R==XYXFc&RGcNK!RB/>8::CLYju#<?8Hq:MVw<C>RIhYtJ%?
+Nd6aV MR+p!^Fu#+SDYpKRaDTIFCkJZ8ma#EC#ZHT6GycBHpJY@m^>jVp?*FEL$yYw9/!kmw6+jaIt=6I\yaEy
=jNQbR V<Sbu?BLPeWX=YWFq:IALtW*t^w1kWp41c%9BC/6>uyBe9VbmLMBQ6/\i8F^!6*hnimK8Im=8y$IKCq9
=#+htK cQCS=Ic+RF1aYWX$:aI&VFya&Pu#acb5QHVeHK#k::A\MLA1&qXMI<@R=:I9ADBpl:&+54L\iYNci@W%
a8?VL\ YC/JQl95=?F!%M+K*4NWB:#I!$Fe=QHKGuC%wAWeK8aIdBy5aV%::u^5jGJTTlykJTeuL*@6MpNSAdda
1ZR9aZ QC&XFqm&m+qJ!EZG^PRpKDTAqdW+Hw\X\FeY%k=&5?u@I?^NAGL5\ndkcY@Yy6Y?:&5$:TqCmKIwTbJK
/JBdcP FEL&ja>CFEZ:ZqyEi#Q6SRkllP#4?>4*6M$<#*@j==u\j6@*@*?yR^*Q#D^#Zii?:uQ8SX#8dt>q@EGp
pG=BBL cN=LRcbCk$=n1XNkbnncLp$NSZH:@S#MnAlVnK!>D=%68Hqty=QSe=HCiINZAN/ya:mh\Bic<IXFdM$H
bWmY=w AX8n:^l>pcmjPnw%W1CMplwZVJGM4<SVp#NGy1mpM&VcA5yXd=HHW4<%t*aHS!VtTC+**d>$>8V&yZct
=&!:LK Bm!D#9Gh+*:16+=Fd?jbGNdah9%P\y1*!J4S\Byy+$!Mw8qTcQMyX<ZFS/6?aPjjM%jA^kAbYu@mcV@&
5iCY5< wZqQ9XN/??<@+HD!@utLuQn?<%hdB$MeH6tta=ReGmQ8/%6%$hHq4::>dP&R!#Pqn9^HD$CdNZWR#+c/
5KtDS/ 4*AQVA^>X?ui:a1m:&KytF>TZy/e?JKtT+Pt>P^JPwd1D6+p4yCkR155&V6eBZqD>%Aeujn>M>*Y*9Gn
w=y?cT >hP:6$@j6u*1@NHi@kd+$un>et$ZZ$mHt+Q:\CHb6GHhtwW>i+<c1/<@8L6i6%=>?\@qm\#H/E@*/uJ1
%&p5w* MMYBtn>ptcRXw%$iN6&<i4GmJC<4LV+!LCRweQ>iMC<:6t>D#kByPniP&II>cA<EHVq?Mmwl:Y\?1jV>
&eTRTJ >J@Q9%4iQ&t5I!%nkT<i!Je9?C+4ta*ZH@>LNMWE1^b+Lth5DP1#:h+uI/KVW=QnV=$<FSpbt=GZh#d8
$HiBDt SFl$hq=?jt=idqb</Q+h&:eHaDG6FZ=?\Bp\MDIj/XJ/&RA*u>mCwpA9A%%hDb+Gd4b^id4V%&=aS=4C
a*I@RW \LZ*:lI8:K8mw<*ue<DG1HGEk+N8WM%n@l^^wJFy?j#1<h*4&HR%M#:1^JGD8:eG4QD^YPn5aDjN&5LW
aqh%C5 TETN\+&tRiNFS1aYp/dP5Hh$Au*tBjy!*cc6GMehhCRp>GR+1jhN^Zet$QF15ZE^$cjDV^#VDDq!LARa
1RLNP= e=l<C$LcaHk:FcmD%Dq<=NkJJumnwKS5<b^JJl?ABnb/!k^%FLuw+ZCE+&L8qKeiDuC^pqQHb9tSe:ec
VK+>5C $4a=G4$W1a\h$c9*$QF9SEyG6q^By\cGWpy@T:X*AuYN:1NFwmG>8K^&LB85\P+RTIE//4?y$%8BQh+Y
4iBIEX C@P=im##*:V*cGScj9ZN=89FWZ9>HC$MKIPP<c*nL8t*ni5e*&:\L:LF?B>cq@1=iQIWnJ1hmbqde:ET
bkMpNB #1y<5DFKp11<kl?$pMJ+1SctT>5ulnD$Y@yj?l<iTLJQZ+th/bSS!JhibC8k:ii*L=@i9@8*Wb\VH^b=
!Z$8Em JnW^M1?=@a?h8XD:ADXbP>FnW8LLKN/9L@+Gip!KwhPXCZeyY9uBAnqb6HR>5m6L&<Y1=bL\GZ4h!J:&
M+:DE6 \F*@jKb@6dj?iQPy?XQ:n:d&%@?lCaa$AW*A>RAJl5e:9wQ/nkTm>NjX:hc##\DicMN^aFe<mQ?!pHKq
yImw@# ZAdQh\a^G9eDuiL:JL\aNFkTXpaICn!\d??i*V8SKhSYScAK6YppdnQ9adIPMb8u5LTt@6cDb@>?cj*=
dB5E?Y :punSjFbdK/<\a<\=ahI^YDMtHGV=/n+iC&&F8t*m$abtp?^e\bSJ4e!aECYdn>=Pn+%JV/T\C:=dG=P
PikpC+ euna1R#kC=Yui#a%+6DP4h5*4TJ<ainmA*TSit9+?C:*DC<Yq!bP%6HS=KFLR*PWiKc?G/pN11SL/5/>
Me/Mbe W@d+GY64/&wI\M^\%NV=Qj%1TMVMa!dI:hP*q9bjZ><>8ZeDY\XpyeSFHD&$i?9/%d=i:1=#:YbMuYly
pId:c^ bk!MMSktMnR!5<DP>HNAp!*&IthhYCdtWQDSa&EwJYQnEyKTWqI:$#my&FedCBN^/wSP/DEpDQtGwk\w
IqiSuK E*nkALYjQpAHclQPAGW\lCIu9/VW\<Hc=J%I!Y!5mnIFqJG1Wc1$Gm*+y5H86d5tK&!#l+&^aS9lnP*K
F!?R8m pL#G1$tdb^9>I?KPGV/pu!:aWa%iR<i@BedNG5d4APc\kDu6\B#eH@lHwKA#uBIynlc!KAYYwk^VClSW
ju%9!@ iFJBB%?S!%iZp/iZkpw@m/uVb5=^h9hb9iXAcN#b$u4RQ5pH@b&6SJ$G4iM4^4YQd#Q+B*qn<b4YiiM\
ZDw^9C EaM%mV9nmBFjdq9EanR!qYhj@5B!Y8&6LT$@CY??hBGHi55qP#Djj+Id&Tq4A</Rw!AMd@4cjPN5Tmk5
pGky>5 uJqb/Ypb1YqSTR*6MlqFjcYXPm>ii6=JdA^!Swa&lwK@K6>68may?T=tqdTZ5I6Lc>I1yVV>iTNFAmH+
X>/RwF $?K4!6DGqJdqbK@8VZnV&:Q=E>*T@9SH$+>j:T@yEjecG\lu#tj>^SqWaukp81SZu^EnS\@91aQGSYQR
^SEpYq PNHa$baiHq$?Q?W!DA6y8une@@#8>SMT!FBYhC+#Pi=WGPn9k\^6h5q=R&<bBe9*#6%:D^\/HBKG&hVu
C4/Q*< m5w9%De&Q*@:yjZH&<e*L=SpJ$aE:$LT#Jlk?E8pDwb5/4!FT%c5W>8+ih8tAD9><b&m!ebY$^$YLQaB
QW@T!W h+C^NN8>h=+/GbPWuBl><pSE^Pt+nHQu$mLDVmch#!<AT*Q?VM#lZX8&dF/>Ek>*=d!SLbX=!:^w#@:i
?VVF\: !#*&m<54C%!%6ZZ+QKFRIAB?nQLe6AqI8YZd>y&:%jj8*^Zl1ci41WH^VLl11n^6l<Kty99N#a<^C\6M
IFpC9P #a?&X8!!eR6:=YYu^yGp89X4jL$Z8#w:#yw^hbKX8bpJbV#e%B^+M&&tQT#K:p6IdAdY*n=$?FkwTMwa
BKDNy> aE%KY61b#M!5LFp&N!5V8>WCi/IIh$/ElS=u8BMWHHRI1LN@Q:YQ*1>:IDARR=FCVy^m8FNe/8qwdRLk
N%S:&J u>\jN\RwNXyXVW$X96kcRB@%Eih!I*e65#e#I8\^6q5hXuD:e6#/Yad9SbynSk:14!QW$PD^8Qnba+R?
JMbd\S YC&nPRNW&#Ype9HGYJ<*AnW6QARc%?$Ql%lKZPTRp4cDpVKq$KuaW$FS^\A<N:6=:59Y:kk?qXb+wcty
NI&^?X JnNp+$J4\#cD@QG@DF+niec>yuXdV<!!uIm%:wE?#Ec$=@qTaA<6Xpl??yQtkP^1c@*X<lQ+R*%VI@\l
JWM%YL BPK?@$lMDyFwdX$T4j*6!/dM$JNJ!XTG\yqWcdJccqytVNK4V&l9jlW<9T?>%>tES#t5i=%!+6!@Y%ua
<4B<6i A9ct6aR4Ln>@L48Xqy:8VdaA8uENRm4KP<YWSLt<4PnktDdRbk1#cn:T*>yj@&n?<dQ>?h?<\imj<NCn
Xan%>i RRj&:EBF6uc%@/4qFn*:DS<=cqA*Hh*89T*:DVMaQ&4<Rk<tmqaiCP@5=PVmj+Qp?yERYlSqWTiQl^\J
d\cX:k DmLMaT\Pwe=IWQJ:>keGH$WQNnW#6:nm+4ZG=lj994b>@@jlnb4m4IV\+J*4@Sa:AY@cSX!DMbQ6*Ba6
5=hi:D Y:EtIGC>\@w%jq/8<=#5>MebmpTGb6a#=!*$>CXBCkD\uX8ZuD^^Pn+yKT+C5:Enp:QBu#pSFyMD=MuL
CL5H&< !<%PDN$Dtt96myZE/CB*qkJ*yF+5V?tTjy:iT:\&T&w9dNLVldXZA\HEWiu45upV1SK?e#ed@K=DWS5G
8G$=KF /&kBi=b\%XZaA58EP$%MlkR=GGl6\$/VVR&pEla/N\h&dX/*c4tZ&@!=>nPuVdG&ttBl#yS>uD=#>6#=
&hTACI Zh#B4N6DS>DpSMjEJTcuyRN%55>&=uDQbthtyKXkb?8wCQ*\E\^%kDuMQR*e9^@8KtuBHSkIhwhRl+R4
njn<wT TBn11J1/DGAy11m$1m1y1R8RNd1Va8MD@b$6CY9aJuMCIp48ZwlcM@&#TN%Aj?!wkV4k%dZ#KL+Kn/M#
*MTZ%u *5n\5$nJbLa/H9MR$>Mq&q+JXIYcjeiLSANplDW$qwZp!AS6jMWySn^KwX&^t&CptiYWtjQe@Vd5QS/j
:%6Z%p W>u+wP:emc$iNwdjDe4H@#S+ma#Sj$q4F</*5JywQZu1>K+pu\MFyh>LqE84M?6q9=AGui*IGDqqhLy5
@V@?lk D9DqC=wd$GkMahR:9*=+hm+m:GRKpmXFqm^LwyJXW<>p^J&1i@tNX9=bhP<?pKWVN\KAMB**RcR%KX/S
?\^&@b qQ\Th=c$AF*K1qQiW9Sqy+tMQ8MN&F=YJbGJbSLX<t5q$bN:hMPeePQW>@V>>wd&b@<qT&^p?QEnl@d9
>^d4Kd *5:wMu<Aq?&A@5NGDP?u4cZZR>C::=n^a$bMeYPW&WJ1kSKTlZKcP>?4<M&L^@iaINceM$p^EYHHR<k?
DaJC9B D!!Kj!\N&AT=napkqc^K5LXBM$aPjH9V*FBVqBq*ItnuPq>CFpwpNBw@b5JE&$ZikK!X1%c8ZL:E#uZ8
=QjL!X nPq#F/@a9HQXDH$nI!#d+4=$BS=/wE:d58Sw/Muw^MV+TN^@mwk:p=&SeDI$Mk54*PVq=/TEH>m/ehPG
-ASGGR 000dcba0b94001202b3 Page 211 of binaries1.zip
&IW%Na XZJnk:bG/mZ%yJjIQPkq9d&Z4<!@XJ<\^XBQS!ARCnZ+HFX68+*dGF5#GX5VSJ#ib/m61euu<Hl5XXZi
TlpM%y mEP*:&KC+QPZGNue$9:#$#>Q:>?<XFtTA\:emTPB8:c5<@j%>qk+j?=5p9yGYR?dQGZ1hGJweBhk%b4%
+@+=Z< t:j9QlAE#@qWJHbQVM9IQI9hE@M\#BELdy:Q!eyAc^N%Tn9<JCEMtBy!X>HW:JQ8yjjyaJ@6R+R8JL1u
bcYAF% mNDqH=Hc@QGKmm11Kmy61kwe\XeNNe$^&+>8eJ<KbHpk+lmc#h5aXZ19Ku#qqP@AquFnS\@Abt>69E+?
lFV%Eb #XQl5QZGYll@A/ZuKBT$Ed+\bwaYKtwKle<FHGH*eTdtIq$l1dqEAYMW&SR\SqXkMF=LTRE+w/e?!GVC
>^k/H^ =FuPu9:d5D@I>ic4?ch&i65c$/IWk^hItL+9cP%/l\uttPE/DVjR=nk+PMYZTwA\+6y#bS&@eBPkw@%9
ib#?h6 ^tnJGaQ1DP$L?nS6>GicV@*<>44pXGlEe91bM?uJdWq$5m!FVqXN!<yImWm9?WE49T=/&!RqlFF58keY
1/e5dZ B5NWqi@ic/\wclY*q@\w+Wm8yN>8yipu>mSEXhlnRi#=epw5qcmXNlbFVP>P+uRG:9kEj6Yn>5d&S%&W
>$#R#Q ESie!$^LnGXcYP@c6uun:$k%l@:>l\+j&p6LY&>*n%+D>QXHnHBa<mjil6mZiZNhFmW>i@Lkh5PqtqIR
FcQ4+P bmq^y<QDRw@Be9lj$mBn\L!A:^wSp=S?Ft8GN6^=?QL>>:c94^>e1!4MmA5:6CQA%^$wa#^86Lt%:TIQ
qNDGF^ D!<jd=>q!:\<ZPjNt1b1N>@Vj>P8@XTk#i:%>5dG6uNhq!##:>y8D9CLCkMdE^>>M8^p?IuI%I!M=NNl
qIHPdj Ecq=lDHuM/KD6t@a8Gt%:^<L+?%NiXGi4CW@QZw6<X&Yi9qtw<ScV$?InBH\%Qkt*kHdpDC4kDAHk&JQ
Zk*^?! dDWWC4WEZC=aH&X%uYWZTJI<!cl6cY@=<9d=k%8ZmX<Vm?XI\c@^Y?4l=8LpaD>4^uTd1XNBje#EYIGF
nFpLbh :y:k$K#hRFJFR<LCTaQl%DPb&Vuue@Q!C\w:m*mFwCl#58Z>&LRa8nCM\Z$A8J$hi*Z*EiMCF?kmm>l4
<ytcVt 44ZJG=H1:LE5SYXq5C$5*leNNYE@:/%Lb=tB6Wc1tL65nc8/L#t&dFKLTG&e@ylB*dTE\BRyZ<cVeXW=
PB@!R? /t#B1AqVjwkWJ$>m6Y1$Eb=RRkXNnTeCNS*>mdb#=@bthVD?DQeZZ$p\1JicVKFDWXiyy<lmm4*45k*:
WdjTKL V1RWZ4=@w!S/##I:p$=S65EVI5Gi$%4HVe&^>lyJtAWZ^t=Nh8Y*E1ZT!/uQj&F<cGeuweh9jml<@W^>
pMy5:T +u:?!lkV:KQbSu?nBb&@@4%<K9S$<yt$6NVpyKV&SD1Jqh!SRmY#W1q$ydnw*P>66A4%Ijjb9Td1ZpeV
VI/Jye &TqDDZbZ/X=VZZGd8LZpY\t:L8><1a#?5SY:h/uycZP6$<5q+k/JY5*X<&/D>JA%T4$Y*bP>yF?%*&8@
\1LYXc S@hGj6RAQ*I!W^NmVy%k*JbNG+u<YpH=5bib/QahMuSRN$$6T=$i9acNG#QMdIFuq\D4+5heF@>L#=mD
eVGY&Q @8K<:LTEKHKYAE8kuCGw\1mhX49A$+e*NjVp/Xm5*IEFWb5i9@:+w@Z#!*9%Fjqua5MC6\e5e:P#5LKi
@4Cn*d 8el>pj8T^S/iul/LFnncVb9t8MluV5DY*j5Q:N8%hh*K=W9hZcbQuPnm=dhtA:NV65p::Hl+dEI<tDNR
ENA!h* LPH^/YhTw5JPJy\u>Mk@t*l5%<b%t\J<=jaE&iEF:KCZKHw5<jm%tQLRZi/%>?Th=654hQY$BH\BiQpe
hu96<^ hbWSK/ph4N*YlCGHV<RE&ZVZ$NXpe:l<NYWX:w#eP@ib!w/jj:TB=@?m8bH$?p+l:eN&dk:\Z?dy96Bq
yR$<pF u5N58=tW:hCb5?#t#HX!eX956W^i9C\\GFaK8V*J!npQ>Ck1K8+5+SeZaYik5*KGcIcjmtBIE6Iqc1t>
\4Jw=b %B=14\/T=KDewGDRYwpZGJVZI5ZbHBcqVK6IXbXXXFZX?X<$XIYtc%dPt&BEcGJp8YlZ<5Yt\tBQ!*aS
Y9:>5a G!#KMF%NIbjQ:?B%<Ft<Xm:NW?X!&H*H&b1%mbRMJ<^T@WY+\kK8kE%B5tlwnnB^<%%4*k+TVEpBw>jA
dP+JZ! u9BXqWn5Gt=H/!lw/X6Pt:9Ej&hIZP:Fy66q<j9>by9?EIpNHyDD!?i$>5inF1ctblcY+Qdd\Mw^e*cI
MHj&JR 8BRwW%cc<1RXk<!p$5/P*/V=\Zn?u=A^nD&S!q4yu#SZ>9=&^QHVmYtyKcuJ9+A8XHJ:Ck6WGD5=JVW%
hapekq MV&tBi65Kj<5?Iw!4PM91$I*1h^68uPl1KSD*AK5+SbZ*T:Jccjy8PEaN1P5MT15w1JDwq=cXqh&i9>\
$tnCui QLyW/n&n<tMhua$Y=Vw\ymR@J!MqIby$Th<DnNpR5JbwMD>jH*iSdy@Bk\hwc?*Y%8ubi/V?<GHVF*9<
<A^p\4 #bl=<?a/#uXeX+*H?^ebFSbL#lM\jXdPGhDa8*j6\lN8MCmk\iJTM5<Xq6be8eGeWZ=<ejhKiX=c>QED
LJ4Dy+ c>*6bnnkAilCVL=^Y?DpPG9/FL5FZ9+d68<i8u@9:1*kCtASK96b5^!e=u9P<A5kS@?:6m/JC#q?Pn+B
tAaY!+ 9P%R/kR*MmW>NVw5NQw51TG8hm:%=L/NAi9ZWL:5=cV+J@JFBu!SL9:q*t9^Ew?qc:*&**9&/6lAMCp<
JH*WlF 5Cq<Lqi66<j8Zd86McIF*ILnMci&L8?6w<ZqeHl5FTY&ei\qiZuE:?D6I%91c!V=/P&HBl@a8ZY>9=<Q
S/i@H@ yn5/#*N$wPdRnwPe=48/acPEL1/kEMZG%YBKtQ/YyYZqHSZ<<4JTTZFl*ntt<=>P=KtICCVLMTVLIea+
IlckmM :/F&h>5DL59@wE8^y?Mp+>emJa6yG5AZnJ/lXSSX%dmjNJVNQN!5=Y!^>n!RWh?a5<@NVI4i!pk>dR$=
E@yd^h YTliG=hFhJk1S%9L&WlpKBWyt#8^BMJYnZdm6YCNibdGi$GLlp!kJlRa4hq>&I*Z\ek\Vk6jlc9hR:YL
YWD5R^ M>wK@JEYh1/?t\>Fuc&?i:e!/iA1S:P>TJhS#&n6qm\dI!NVW*QCq^p#y*8p%IyBkBXZZp1=&WyVMpYk
AX?je< C>Y8CH!lY4VpG&ZaMk*5C/w9aE5d#Yt>j#Q1SGSTepy!<1<EPyFKpmZVKb*JuWAdPpWqQTW?=8bdGc*e
%MCpt@ ZQ//TY=kcPLt!$Za:b1mD9HQp1<qhDGuwl!eE4y1!pB!WKubd=8pyp&mYqYdqY1CJpc=q/XuS5hqaE59
^pj*QA aM8qt9KT9J\#iPIC:9%9n&ZXT51Q+?9n:V/^i?<BA@6yLhjW%89ij>TaIjy#9j<HY^\e=nq:uu8AS@1q
dwaHcX Sie#W?Nnw!In\5udDBw:mDE^8@iA?kL#e9#E1imENC#!YF6@/#=#/9L$>1ZT4MM:Zie/L%#kRnuyPM>*
h5&<j& tV@QEhV?FN6=m=eHdNpJ@*&H@Rd@bW6e=<&ibR6?IYm9Fi5*4Xp%j?pcIM68@:Wun=/Mma?QCk5NC\5N
6Npja& V$lNnR5QQZ&tAMSMHy=pH6wTELBl#VLG8CBZ5Fk8!+NcLHX9Z!S#y#&/LXt/hQPNN?@PY@d6ywN6u@ke
y/&QRw n41Y+<:ATjm5k\+jQSacGS?<h=mYN9!C^%FXXl5^?%kVKSaPD9/*>!<jMu#yC9di5GdFMt<QIM^<b=uV
mVtY!C WPj=4k9hq*k6?+56y#BHmhmXRt\GY%FSYXWq1>cw11!wKJiWaPh4#LiK%w+<@b5^/K/RLSQydn$pDMPZ
yyl^&u $#Haqlt8+8p+$jmXTNXpYt?Yp4J!t+1mGq@+SWNFPMVi%6m\A>mmdVVN>$nP#ad$He:GIwPS\:6ycjDA
Ze@w\u 5i?mTm5IMSX%De*be/dISEw#nFTE9*+VBW*Lb@B?PkZ1Bn9CE*aN+!kwTpu&P<dn6KP#I?nYu<PT5$XL
:$ib/< kc5:h1=*\L/InI4Gyy1$aQ?=FwR5I=@RY9Z#SFnIk^T<u&+#a*6SVSF!yi^mbtpdCZdyI?$p%wX^YZ=<
>IY$5> @@:6/#jWa4<aMhbKT&qP=<84ChGJ/eqJ!Rt!iFaCFT<qqPqIbmX%J1Kj*=uCQbN%L1/pkZ=j@Qa8EKch
eY=iRK :I6%MpiYVZh1<#8Bwy@AbTqQ1:$n?*4h9R@t>tl*<<!:YI1K4L\&=/^#Q@V<qZ9$HBH+:RyDq&6%NYZF
S<yI@T iYh^F^pejMbdYSjA1DEP=wS:#P#V5??AZyda/KQH\NEnlqk6<q#+Z?QmMN9B!VWen@Y^l$B/Wu^ehNRy
\X^B6= 5C>lSEPkW:1j&t8%D>:iI/nSa=LA\T?88HAXh=G@69=+?%Ae9ey6$TKkmAMGne>#uGN9c#Nq&t^Z4%Wd
dS!S1Z 68*e9ZQH^qW?HwMZ#J%6m@$hb#t/iQm8Yd%!=cy%P\/h*PV66*9V1qPHR/QkWW<ew$JHlEWqJeijDk%Q
IGinHX !m@KB:aWkBnd5Y:N8nW?9w^qRdI5<Xm!bQFm!4%nWahd:$Z8:w5>QJb+LjXQ4@4\16cqb#hN>F1+HDYB
Jw6iJ^ >ddqRj5IZ+/jCI>MQBbw4cM6^M4mdGXqh6?AY<>j9@*$:Xjd>\?9H6=tt4uGa?Veut$dA%d=?ul/8L9l
Tu^VSX jX1\APmCuTu\yHLd4u&Hnl\HtCiAeRG/FBTJJiWXqhXWndTY48GV%56FVDP1@>CF8C9E?bQ6/4c:m!@H
?d5=*i j9PqcMpeK/MZIyXJR=WWpC+5DqkYaY<#M!QpC6@ajp%a$b*L<i66StAHFH+u4^*+$R:/m\ah%kGPC%hX
heSHH* mYZpPpe$cSJLKJSy5IRaBjDH4u\SjAK/5Ij=BlZp^Xw4K!w!%TIWXZpCbJ\1Z:8@ECSbJ@^MR*ZaA9?h
MV*yD/ wYtTG@e9bB^i/#TBeKZZa%44^ZIDjRMnW@MJE/&uVLib9V&*19l:mW1^yPb<Vq5:IR8RwbQ#&:>H>+WD
<dChpG Iw#aFeIXD9*mV8dy$*GbKhmC?lh!JjFuplR+$kqtSbc1D9emMTu6>5Q:54>5C4w6hJQm>jJmtjl4!eeT
\t=LBS n4m5P4i$k@/?jTm!SEjdIiX!XTt\yK\tQ&j>WDR#Tn*/L*%Yn!Sy8uY6Dk^BdubcE44$nM5CAt\%CDBC
QamM1* Em>+w?eP/hc4j:j8Gyyc8n&HnBw&#NLXa?EjpqB#y#4M\d&@ujZ%IMEKRM\qJbCwn9CVe4MCKt\@91hB
$jL#t+ \WiQE?&B?W?Xhhh9Q*#^:8:X5PXL=m?eP+i!/&$@G@5h#y^8M&Z1LCDC&p%dh?#a95q@1j6<S:9y+&&t
5Zbm#V VJp/*e=^948Q*:Jq!%i5*dL*TES$ZELMnwY8B+/Guw/Nm+5+jl!<*+m+^IVI$BM^b+6p?hwF8Ypu>/^j
DAn:!b 9Vbk^jLqZjcEYpJ:KC=&h=e6?8uYi/HdImcJa>q1*#PjY#=5G6lhY\N:CZLadPPJAWiDMF+q>GVE/bmW
m%1Qa1 mEML8t6y<hq5Lkjpndd#lbj@j9#c$9:n\/6H6/<!DIpM\+#bVi9<X!^dCujPZia&BHNH9Wt+tH#uK#\!
9bFpX< FtChjR:wWRL$1K1y9ZD^w4SPiQFCLZauB\%GYnuESY6FMR^Bl^=MM:HM$n<EPZ\M9D@eL<+6LQK\6#S/
:9m5t+ LqI^H/5KB1XhSWtXLSB?%qDWG\$Mcec>L?hNWTquq\:w!bWBRTkkCH^^yd\&MCw!IL$1m>ZdebaGZ>mt
+<#?J+ RYNYKdkyDDY?C6+DNhT/>hyb$*DFt>@JEEPFC<RAE/Vb4^6+?i&KA8Z?m:cGJJW$QKnLPl4kQKFYSB9K
*LD!1E nFmGq<t^=CNc&BFwMGae6lK&uDlq/5SFCdXjTkVm<1LV@98ij1G\?!bFIme:P@?mB*kwnCEB%hXBK#%@
-AYJWV 000825983b9001202b3 Page 212 of binaries1.zip
/9hl+P qSGyFl/VBE6\VDRX&^bH^hNAECpTJEGGa#I4Sb4KA^etLTM:Qcj+?y*:^JLRVS%Mp9bh^S5XlVL^q=L*
F+$9q\ RJI1ehbutw+h*/5uSw%ytaZYZmn6qNCqcnYqYaiMTjcwat?:1%ebqq!61\K=qJYYGHNKjl:b6i@%t!Z8
#mhmdp C@Z%i9d8&%%D1Kudb?nIRYQuiLw^P%?p6h>eS<e=qD$>&>*ibu:/8eKe#QVWyMT+YLRtnIhQJAMIc\b9
EF1?$e y$n/FD4&BSXBc=c/LZT$6:PhaY5:$&:YVLAWNyPu#HS!>@Fj9&Zd6m&d@L*huPdMtndF&u4T\MuV:S#t
K$cZF6 8/El<Qbh9ZujpjDw/NNlkX6Yi44PeXwYhDw?LnKWPn+/JC\/IVH/^QHVGWWF?iA6=&hFH>!<i9ZcFV:L
T9*9$I q+EhIT$kq!#&YL#IjbHdIytdI6C>a!H6&u8lY^hhjQ!Yu*#V*u=/dHe>$GBCAXhXdiJRu!QHn^\=Fk1?
yYyNM! iHSeipKR:&BNZW&PPwin11VM6T4A%w46Q#/?juRH&bKVqpA!kub8Yd>tqb@QWnBe%PIl=NK?K@:411TS
JGlu\L *u+qIL&1c!:W%X&/LL&mijqTZh&Ft81KWuFZjXZ>1NPuj6Qq$P?#*q&:jlQt?Et5mI<ZK*T*t&D+DFC1
4ykl@: ^GEyKdWDuduCV^w1Y6%:DBl9RAFqXMecG+$i%p%Dmq$&=QbEB414nWh#yS!c1<bYWiDAC^hRJPkj!AKp
VtYFPc /eScu=wKRw*9ku@B9KkK@T<&N?@yTd^:JR=jRIG*w!Lw%bPNJ@55?PL%eA>PKL4cjQq5TIC#=TYS51GS
SP/Rh% 5atJ#FVJ^NnI5B:JM:PbFtcanSk#H5p#$Z1T>bK$/8I9JZ^^TjL<&jN>M&6jjQ5yJdbq\N@eAib$&bZP
AGE9TG =:ej=WTimE1Mm&HFT1QytQbaPw/Pq!X$JKL9$pF<FmwX9yLyJHbmWpyT?4uTt\@?i#l=X:Zy:wXemXn<
CK8L&4 1iShCW>eZSZ:?C6hQNPkb+<i58/1i61ndQiIc/RT1qT61mI#jw<X&S*4ab4Xhl*+$:QyJq1G\uPb1int
>PKHYH H\$/kI+Lw<Spjy^qT:$\c6@NdWL*j6%:h?N4AH?GDS?w:?nl?we?IJ@t&N9dWdMM4aj$H&!/d6@J8LnE
J8*DI= ^HnG#9#lD<mG\!HH\<InRaKEH+@b96#D#Y$8YBTb#cByM/bQA^M!&ZwKS8/9CNm<hh8YDc8>*idbV=</
YJ?D*6 icKX%eVJ$&cPt#*Z%Z*SI9eq!@\*:#6<MnL!^JE>/*&eb$/bNHYY$:J6l/NAll$H=SeSF^<Vjk^qGJXQ
hS&nia F?4pJB*d6tdqtqZiwMLA\m#B*n+iqD8%mHJn8XLAt\/5/?9cW&=49L!Z4q!=<?w@9<:bnP&tLSAI?V#X
YLJn1+ bY1>Si=BJ\l*a8KVMnPC6*1M$haX1LFBn!tynwy<@cYq@TjlVt%bIZLubEnRQqmGA9^Z?C=dmlXV9L!Y
u++A<! auZBNi9?>q9T5<:q!e*Mld4LX?1y1>R%4c9%>Xi\B&=q8d!DTH!$hqSpF*uR&>>Q>p!wuh$JiZBXPuI<
ICPab= HCM\CZpY#VR*jCJTNhRFYC6nZI!!pky+MB<%XHq1!9!iw@WX^^pa9BJ^DMcMGN$QZBilAHnV\beTD9&C
LyClJ! 9%NeGajma8XeNS+Y^Pb4cHRKKR*yZ=45q?AFGCHP9JVct+jH/LHI1a8/wwKT5nyjkL5G!9#8jZ6!ti+Z
P6Gu*^ qCJZi$FWRZ*#qb^n/?bdZlEyG^tdtyqVE>R5J%mat=pcG%%FL5%:RG9WV^</Yu?<wRpawku&ReYTn!ZD
#QuELl <:*6=m^\ZS^+ND\8w/H=k/!#A=nW>8Q4y:h9Z4=+<9nlw!8JCVFSWThC1TmXTLlNy!QyTDyKGp*F$MAp
I>I//X K4+F*J4PBCt+NFR!qWKu5qI/p?kEVuJ/>4qmTZHy>Z9*yJm&Ta+61Z5WiDVZJTWWaSLR8LI1L?EG@Y?=
EMM4?e K%BJ&q%hX>DN?%^NtWRmLcW4XdJ9Quj4%4P>8?LRA%<cpEq*d>Sj\C*tnGR<+Yh<t6>!nR6A<CSWY4l\
=YBXX^ 8qXQ*S+/QL/YZ4?lk+hNeZNn1ET&tB*t#CF6yY%6y+$eMunwpNF#=4y/LN>#MA#%BpDkCPbR!:d**LF#
1Md^uB 9b5:Pm>#uijQ6y%lM&W!jE/bPuZKqEtWhh<y6uNeFm@#*:B=$+b%K#%hHGjcVLccaAH*hjI$&>q#=%M8
cAwyT! p^b/?Ql9&Ze+LQ#p5WQdXu9PuV=y\1Rb#55*H#l&ImRElN4^pCPlWZE^EehDRc9q=?WXFPcql?>i8>J@
8ilbTY NZFtTJPe^dR:C&mpkt+bBw<Cu^c$8@S!:bJ6\CY@Xd/d1::h#=uZHhM=BV\4hXXqkY%kiNnJW?VIJC9u
TCH/V^ SH#tFI%8Yl^%HqhFTdud=8j@m$4B?*h6&:S8nj<K9?ZLbD+Dq=GmR^5&a+pV5B4w$J#JQq>RLCt9SA6$
5&T$YT yj:c>jaG#i9Z/859%hXY@!+EDI46j:AILBC%p>/q>=6FJF<GYJTZZ?A/\?!STFXjV$qSVmI\RwIQGmy<
n!FPkq iQ+K18w/yI&c99:+DlF6wD%?*Dl>@dFn^+\b*46Q4=+>hVYFRu+LD:*=N8DWV=B^LGKZcHJIw<AFqeeT
SIV@a5 IKeWNPAdGmcyJ1bNQ\NTeVY$J$YW^t+c!=L*n%EBX+jLB%+1/R\jw>ZFKR=9h64q=uyC1c5mXTNVM*l9
<h=qd6 y<y5%KbPutSydtb5iA%JbZ8j%um/6D<yNtb1dtXt8cY\>E5JZV^YZLb=n4&h<^K9JX:LNt#e8HQ449#M
>8iS>/ 6PVa/NMAMV!uPlEYeiVk+iDnJ$/Ga@e5/yR5WlcqHB$VE^6L^Z$GS5pTqbKVpyPqKc^pKptcIElMP*88
TAdcFm 8LT5XCIyL4=<q>Ri\MA#6E?!8$4ZT+4E:$9iI1XKL%#J11VyX:6:apK$1ydAL4t&ZNJb1q=iiV+:b%Xj
ibX!EP w8%/4H^&A^tF4u%FChpqmJR:RH?pHhjZ=#in*HRhB&6&$?d#lV4>lk:1b::AnYEWNa>&bM&lbk>ES5&a
L<ucP\ dn88#/AlR$iP^KK^bldYE/%>Qh*h$Q&jdYe*m:Knb*C54TbN5ka:BNce51atWSQ%4CbNtiuk9GnymwAN
T4ASQL <NB?T%^tV=<CZKLMPaSNhk=#=<%%6uJ^^#4ll<QCnkj9&in4cn@Xc5LE/jN<N8\JCV<JkD6</DB<C+tI
i&ljYJ map<Huw/9SAIqX>apB$V8H:FC9>q*p5yL>yDbVGJL/Ze$CnJTLF=tW9u@F+LGD+luZ!Y?c*bEJD%<X*D
\\<hJt 8l=/P5CuCSy5NSWX$%%SEcima^PTW<F*T+kIu1Pqy<6Z=@LXqBVXqnRSPwEQXEd!9MQlN8:b5YWD%k*1
Vwl/=S >B8$alXGaY@h5ah^jln+a!?ut61LhXi8Zt?+ejPY6FH:%5$dDhi9%q?/!QT>IaY%GV:JN%5PB8::t$@:
Nj8jX\ 5K::$T=>CH^!5VF>KFLY:/t5wNTl4KnCB5>Fmc&t1nJRYWFSVb&u4hPnh+<iI+eNGVTkd??i&M=aX$hZ
8h&t^V !PX!+JQ:p^#bIJX?AJW/PaykqD4SaGHXP1GM%MBmZCJRh&&CJ&CwKA*i$E&yy:bb5EmPNPt+y5\FE1ql
KdA8V& Q#bhyc:6cLdT%HMQ/uNA+E%wEKpdGwGMt#ynqn$%l=/6dn>#?6TJFpCq/!TH<^+6?BH8JBw=GneTLE\t
?ZylQ1 SkCV1PJ^p54IR<:Y5?c=8L1Dmjhd8RaN@IGDRWhI8c@\W!hDRJQ5*Z<R@*$Ci<+1uww+VWW1SRGbj1Ha
#wP8n4 m=ZGwaqTVE^K/kRumW4mJTaqJ5VFkV\AG%ZcLqESF%>58w@bNd?*1ZHu:XKi?B%RmlK4q=VX=y::Rdet
CN\1*m WtCpXH9we5%Dc<5:T6ZL!154#l<cnn*TFGbj9\tE/uEdk!:^:FL8K?*b5jY*%kM?ij@tp=/:t<uAuqye
a/K85B 9kaR1u@@GR6@d!kwAq5wP#:l$@Syl8N:>^p!bDk%RujW/NFn\HlnC=<JqlMukd6nQZtmJVXBBh5kVLD5
\%i5BJ tDDee8K$tZPeMD\tIGDNKy@F<&dcVJ^kbtymctw&aiJpt?t&h9c#=<^%eX<&QYD:@5QHnl$J*LdG!<q&
BjtG>* pwYb=jS=Zt8*H<RE!FAWp\eQHDy<PC\!J9JE!MtpkkIpW?H=yKNdX@86Y8YFP&%LQElKA?XGL/Se/RXT
d5PNC5 F>d<F8hiyAwT+!E6Zddeh>Y/Neei9Z=+6L88Lq>k!Sh\%XXbI\Nmw/QnEyK\cZFBceu^=h%$>IS5Ny<N
B6chc% 6tq!*e?Q4^:ljl9DyPPH!a+MCW8T4S4pV/wqdQ8Qb=SZJKtwBt%Zj:Zl^1*G&*hph?p:&4edG&?TNt8%
?iDPN\ qYYp6DYRci\jMl$PP9m@*cP@Lytj:&S6*C^TGV?\G%hS1XNbRaWHbBL!PYyKK1y1VA\$KVYk!PcApP5E
h>lRby +$Q^bN^9IQBa9QhkkDw+Hj^PZk6jWTAWTwtHlITScdKE:aJHwP%Wi5$?5NN@IwWbA$khSRXqN5yCJZ/j
5+iAc1 umwWKVAkW%R##L=!NtT6p<XNES9ie\94/ZcPVm+!X</C?e=#b<<pHhIa+6!l8YhNl=C/Zcdt<&P?qMmK
pnpL#\ >eWZ1!IZtq4b#TPqVL^J+i$%/#cR5lG:>^$+iCn+cMnS@Rj&B8KBRXl+BB*BBtpZCcRB&uSE!$DhhRJ6
q?&W?G KLJbLW&tE:pJmRpJ<ZEJaIb!m%wp11XFbVeiND?R!Y$RhXi^1cHwZ?CLXM!SXBSquttu4w*5A^bISa<*
DCiNi< eu66bWeyZcbYiTp@!1\Q&mZFHmdb6=A\nhj4tLMa+l^lHF1ZyJMV^5QhHaNw*L1=i*n=VP<6=QEEPu$H
j5<S6w D^k=T$/a8bTnuwNe$e&adtNnc&QRY/Dhh@C\pTPyEiwnS=Q8!@4nKAMFpTFqbAaiy1tJkelAbA!$\YSk
6KtCyX l@qaBAAid#qcuppYwJiNnI&SMTSP!ZcY9aPL^+wNP\?MCV=/=ND8nT5Y#dc^MkQG8Qm5&d!H=GiFHAQF
4Wim^j E*Vw+L:>l+=Ha4jn$Pm#SXRiP:?w+E#E44Wky!l9Nt+yMPubFKEM=cI\*=tcV#8*PjWtXaYBPTnyTHuY
F<Gibd qY9YdNnb@DBuTHe>nRtahAQM/iWJ>#<^=W^YDtm^5k8St+h4/?u!%PF*!5wnEn?<\wPhWp^Wna=k6DEi
1%d8Cj n/&X4St<NtDhB8#aCY48&AueYpE%X+LhBIu>cd^>6/qJZtBF/?:6^q5N%?59ZcnCc6KEPby@M+jbYJD6
tqnNIi w9FpS*+Tm1=YenwRJ!@jecLSQbHmMLbmB+k+@u5NSW$lZ%pN+\ewNct/nC*qKHA=uWAZt59m@CKE?RTt
P8Tmd@ S<cZeV5+iAlKpX*4:+R/8FXN@/bPl?ABWEhN8@<au+XYcwyT\l6F6R=iJ%i>S^<&$*^Ay1k/eF@YphX#
mh@llQ #S6FQhHakE:HIG<R!6/+ViZ1:GmH>b+b+6!t?XhuDSk&ek!51mNY==iJj=S$Fw<6Eqeq?hqPtadX45Eb
TMB8dG >9d^Zdq1VRBVeYWQieqBS$JDaA$=iDkpNP!pPtq?m6!SSXJSMpIhGhtip!ZKp5D1JMwTPQF^5jGy&ieK
PWk8yV ^JLT:^JiTWZ>4SiQ:#hltXNTPkDhw46Xlj?Y@IM%N4Kj$y?YV?tL61cd5M@T19y!cTqXyqb?5#B:4$QQ
>L?map uunPM&b&@K<:RJ@8yHTV*CM/VtLTNnH/Vi4HZh:FHqhZN%N*D$<j*@pDNVke9udjkV%MuBi/!Hjt\CG!
QhSt1& b>VdNJ8yW/dcGA@R+ZB:>B$\c8!w$YQGaDub$YPw5bS?9*HaRe:adILX^IqYp/jd#%9wAa8<n+@Z+9uA
kqD4yY t\ptSyRBdclunL&uJtEaPWk*S%h9@!&:DkRHH=1?d?5c:@t#Jq8atqyNe@L!*:^4D!/:l+IPM?GNB\@5
-ADVwX 000a94df76d001202b3 Page 213 of binaries1.zip
ACFENt *:Mu/GSC>QGnEctFidq=\J*5tIMd@Jc9<9ME1?pln>biKJP*<&R=6#6%#8564:\ud>t$nLS<kHY8@F:h
LenI@y jJNiYDcAb<^YbYuMTelP\X*u*MITmiS/W9BTK>*8tl!8kKPm%H9T$ec@tZPI!Z#hIF$*mKS&k>kA>@?p
6jP*1! @DRG#e*F!%eddna&p6nyb8wl%c##+Q+>$t*:G4a<p9MtX89*YhuSL6:5yuby!R%P+CGTcJPRpy/XR?Wy
VG>$ln &q5cNwtWS@AXFJXp!wyKdHCFKKE1u/&111c1KkXdI&X*AuFpQGYWdL\Y:pi\M%I8^XHlenlE46G<D*\c
C$@D9j 8NIq%mnND5F>nb@k:*TjQ6Xan$i1SFHM@nZcKK/Td9<iA5dhATiw&+l=jw=th$S>DE$tVLch:Vnj*ZPb
^ZhaX4 *!w59d4T#>jH$>*FehbWT%QDBmTPhTQNj?=uNu4E/LHn^=88#!<Z@!^yL^+6qlTpd==pPeN?49PCSS/i
+nJ+TK *6nlaM*cDS5*d>$BbydJjV$Sitk@EPh+KB*GJc$FI$+S<5mmKMIe*J!n!HaCK=FK+MZF^5dEyYTjK^SL
WjQ!eL JPK9Eqw5KI@&9@up$RMkDyKHSBSkAM+@lD45MuFNK$$HDP+J=FHS:tZnuq<8K=YY1h$1cj4t*=P+QkQ>
P<8lIy u>>F=tCW9^k>u>nV<tk%E1!&ekXlDm+Ym\l#6Aq#XutN//:B=t4%GhDQ^Nq%Q8W$GHjqkDl@tDN=<1TJ
88\!Dq J5P/<>WFP6%/D<am/EctqBq6Tyqa+LuaqPt&>uMZLHTGt:N\$cKFV9dV4TiaGw:DQwMGB6lc*eKT>G!#
58^\5& tYH96Gn=81%:Dl+/6H>H\HKdlja&X1dGJmDSq1^aS$I+pVyk\R<jpS?$:>1=&<<8=GSEWu=Bdt=iaiG=
F<kV1e yKNdXm:*<@Z!A8I5Zp#Tk^ni1D1n#ZS&?mqu#pI5>pDWt1@jCtVPyk*^X&<&LFV51/6Bea$+cwye$i!a
pd<WZS >A#eS^NL^PL4YhpZZLS//QE+IPbWqHVeT1:WTBnt+M+tFldb9Et&eiAtpq8$L#D+cJjLu%>MimaBei=m
X/Xl:$ !5:D^=%Q>B+@i6nejJ<\l!q?uu5YmcMbVaKapDn!bL<>56%cZbE*tA\dGa6&<B!Xy&ALpPYP$XFZWXSY
l/%yVk XqJYXlh<Aw>FSckl+Klm$k*INAX%Nnc*puFqHJ14\AEc!bAyQBublYN^KJ+W@1YM?&1C>*^q4lyaHldb
#yl5SJ mtMJ\i=whA1cNH+IPQ\^lpcG*bSaaGTpGGjN^TMpbiEIA#$YepmNFD<ebYN/X>VZ!N^/%q^Zh\?jFY5\
H>W@*B /Hd4Fk!D>Qj%Bk:bYy5bERwb*/L=:ShDlk$dMZ1<@qn9SC#$%Fw<5KTm=JAhH9TB:XqIT6C6>Mh!Ybkh
^GwN$H 5y5EiASVIe4BB\<iPCwk^eqQuD#=F+QwGMXa4EQjqmCLX+?LnaqN#5k<X>A8@kdM+bZtHbk/6/4lIYEP
5M^8j/ WY#*dlc<Ah/$mVuqF#L#9>ESa*4*IH%\Xd8Qmm$4K\Zt5E89qa5:n@ekt\qKQYjZhh:D&LYGK#Zq^dqb
QK^%5& cZ>&6Dh$BWL:?94>VS>hRy?Xc>c/ViX#iF1>?@ZW6=99DG/Py1Ne6aGZk?!^unTJ5nI!/Ni9P$@AF&ny
KMCK^n >i\*hLT?!Ml5+yRb5&dQu8QwMM@J!hHidwc%JZmMl8Q%S+@C4q:/+<edGCQNLQT\Ib1N4eMC4%Yd68<:
S+X!mI eGDj#k$4QS!uVb^tdtJ5atZ49Hnb/9YdMJF5^$/\Qj5JkaIPBi:j6&j*#l$:N5$jdSKeZJl*Q4i\PP>M
PRaQLH ?M:XQ56ZMF*1=bWP=Kudm5=PV6J=LZNyy=:Au+YEQ==p/*uqKu!u68#ce:m1Zt9>ID$ln<*t1Ct4<kah
EYAVa/ #nl:Q4?apk\Sq%\1m4/^TckH6wjH=\I$J$SZaLJNak^J>N8*G@m#qhyCd^&+jTi&pn:MPCZyYcnZ1m=e
t1NA4V 9uc#Ea*P\$hQun=:nmZA>J+>^d4P>:FuAud<plVqERwN@!?FMHAY4E<ZlWD<a?YuJLTI\CEd$>5mJaNl
DYyHTq 9bW:qSVW?J?BRLSRXXQIXXXYXi$A$Wc46+F\p*IXiX^A@Re?MpjKyeHtKQPRNy&CD@A*4pCN^?J*MtwN
/^IjL5 YHNZ+#8\y5@A<cJ?1k1ENYB/&D^iG%ibN<BwMI8TF%JVXNAh^VK+J?LDt#VZ#Y9=T9>%Y*d5*p96F?#d
FWYFqe 5^N\6eb91d8#9a$F\^9DG#V*i:#V/KEn^+:49:Gw:FjJ#&JcMnV#6M5$/^q#GG@Hm?q9AIaH*8#hSGbk
@dmRRa DaYR@h6=B++eJh&!\mPANhSy*M1tw=XnawE%djG!PDZ\VYPT#y\6?Cu?IbGJhTRq1SjGY=Xe9ji$GXmD
@ulc?F NRwd!+8SM1*k=N!wV*%FF=8S!l51i6$Dm!4KP+E9F/9Qjm<d&\N@16VL?E#LjiBL6\aMPMPI@/=aHFBy
aJG4H8 VCkP:e9#/#wDR4/Mp9Nq@ibNe$aKPeKijdXMuPjQ?&%68w!N>cTJ/Q^*M#McQLB9h#%NDR%NLS%6ZX&>
%pQwG/ uu$HDlp^jIS5qPLIaWPw\jTk$aMH>l<$hDn81^C9B^6<a\LpnNu#q/\I&Ly#*@/>8#c9Zn4j%64C^Ml+
6#:6Q8 16pp&*tLq9t9Yd58aQ*G#TVLBw#*jpBNWBDDq8*d6t#i6G#ZAQ%V1ZpqJRXb$aH4q99+LmY&lmq#ICeL
$*8^9J :eS!y8b%#t%%yPj%hHdBP1&LFm>iR8m!alY#5AWh&yLuXZh+6J/&kMeBX$bXTdAqw:C\yLSWImpy4lcj
wTp$hI 9ya+RL8uH4bPXXhRG4Anu>AF>%aP\9MtGWd\DHj6^TIBe8@tLNa#R%9ViQh?</MuYL:n=T9b/?=aPP4=
Fu\Xq* $!iQt8@hdTVF\49a<yjBpejm:KZ&$H5%>*Yqy5t*B5/iB:baG>*C#1lCFbtTkkL:m+bWKBW1CHmWCk6<
E!JH=9 HCX%Nq8ha4h!bF\<P%YEq>VB?\piDb:=AG?AM$4ItXaBmnZF:8M+TtyeHq<tWME8!y4CV5EhwA*FX?<^
Sa+pBt XnTW\\LJ%1GwwM=yBe:$tDmJS<pLi!ww1C5MHN<5GtBpQ6XlwjhKdA1*J=B^SI@Cnht#jhNcQ/?Fe&$6
<X&u+C VRl4^ndR*QcQNhMHDB$=^D!w6L!6=H9^5JLK!9TaFXMtVy<>d#:yC:IMc#Pm4:lq?+=hi^ncHD6!TCX+
45%>Ju ^/EnIeiyMGYkDdJGLVI1t8^Wh<b%^4JnwtPV$nP#\dZ=AcVyFG6K<898LZA/YuD*=ePty46N>/+Y@TlS
$ki8!E FJhKYwA*9<Tep4JLb&:RV#iI?yCKNWL9<:YXyb%qhLX1=4Qu5\$\IpGy==Bnu^+Ad@S?l#Z@yhFI\KjM
<>Cc:B q@5*c$d?n5Lc9t8H*^AP9$iQ9lPhuPe=At6t&@?ScNdYE!%qF9REVYPnWaMGDSuaW%hdy^5a6?:h>GT/
Rb9?$! iu4a=4%***+Dl\\hAc:Q&FFn>WGdmTnD9pdG=ydY$?&hQbc9&RV*b6iPLY8Z8hyNutB1bG^mQ6X?19NC
h!Ly@X d$R$%m$nlVEAp:6&p$%cMNWMb%AGdFm>P>nEjH%+ZpuK$W&?*56ZLGE+\%Tmq:uR^L=RaB*dHcWPjie+
Kwp9D4 #uN!pyiD^INVyA&nB:b5&ZXw5%q5#StZ+h&%?MAdFSYY+9!$<qK+#^J^TXFJeYS%ujYwun&EQIGA4cTw
$=cuH@ 6T!NdEtiPHd+WCA<H>uPRd6I!WCTSTHQnTt64AWLe?hi<&Nk#A95QT:>6#9Y!u9^+8tVl\?c:tC%:<yT
1btYuw lnS^Gpmc<DA<:TH=N95/>&wS\l\pNRS\V\BpH#LG$9CtTNqAj^ljkXIC=$Q+DVnVKXVTFAnW5cwA4TaD
q8ZI<4 !5nI6kAL/EJ#P*phewEtA#QV!qeR<H<IQkFLFLVH1S9$$8Gw<#W$mDmVCS1BL#K?t8=I$SmMLPlRXGTy
*+E6RE eH=^&Z4&ZpQ%=D+Q<Em=>:lHIk%nT%6u#=Wd68<qPWESy/pwnhMSYBy5*<=Nc*\>=66dt^K?GF&nPhT@
VEc&8K c$aQG#daaHN^hZ9J6?KlSeYq=ZpH6<?$t8GANjESd!nPaJHe6GWd+e9BwKAnId4HDt@je?k\Fqe<ES:P
nj5@PE dA\AZZ:F$NH5tNnE>P^<jI8?mu>JFGH5FG8WX%ZRLWE?@tGZZ#+E?!L?WcImLn!dY!F8LjqbIm68LYpB
H8tw=I #ySj#My><P*qNtTHmk=9V6Kq&5+!ZtqbSY=8?c6>DmQ:h8>BhXj1$ej@bVQ/N9L<GWcX:!j1DK&Nu=@W
:XDF%Q q@9:VAhww$hw5\Jy5!j\<Q=JYkK>:n&NHb$yB&M\Nu>aM&uTSC6LC*N#M#MLC:P^?5PGnS$*apC9:6%:
$$tBXQ >5GtnAMGD5LV88HDS++cLS$#a8#w+TQGnMW&#tlnZD^>X&?E?:Nn/+a%Qt=#$JW^MnKbMBYeHP?byJp/
SiQVl> >qJj9ZdhBm!>Ra4c:6%:+ADkcR@RdQ8&#b5&4wjjdW/Keb:59DaweLZ*Wq>Qb9j=h&/h$^\HF&1idC:q
F9?Nw< &PakuhMdYINF\dE?MedVaLeyRy4N5EkGDh/?Q#E@#XXZX<nq5FXXYK\yeZY%aG\\pnu*jFJ5%y&6>5P:
yW8Q@N W\JN4wwTi<byRlw<E\a*BG*CRA#pP\LaaYJy<pGYZRSD$@RA&<!>ijQQQ&@j9bP>y>>%i@5QXl%@?4n=
86i=!^ @q$5$%*XSS6l6D^t+^kVJ4%@u&!9N5PdR<HB/N5\<cP=XB:L:J1I4c?uw1!pyM#SEQ:W/BT&ChW\4X6b
K%QX\q ljF8eFPAdKlJiaweL4eX8aPlBd\Y@tjBF>J%q/e9Ek*9\%Qlc&1BjbEJYnRw\SPNu\IyZ$&:*?n^a*51
<G\aAD AGiWFbSBtdX#&V\hK@iV:tccKkw!SXySRYjMW=HR$G#!uEY?/*aePBIK9pbMR4I5VbmeEIMBp@6*d9Sj
bRK8XE /waq4t<kdidZ$*THilAInyHi=!+WT$5?FR<1Ea5La++95Lb%eHbq/6u:aXX6ZMQp4DpayHH+/LEn8@eH
Xdlk<G ByMnuIlVy&YSHiDN<KKmMeWmK^<<#=KTn&KylC:9YXE1L5#N!e:KPJPiuTHJ?yj?XZVEhW*^m@8T+l<q
EWPWt4 /qZSp^^#1<6Lmn6KYpya=XT6\5X!\mBJceYq$m^yS>#\H6L8uB+/*Aqlq/=YqycX!W4bFhhL<#4d#//#
Q*5AFe H$9%WP:iw:9Dnaiw&dAN!HqG5l$?TM+l$QV+?ZWCl:#@eGmM?&LppH@A^t*AwhAVWW+/Y6&/n:GjV?IM
^IPeW6 @tN=pEK+I/Bubty1MG:IpQFtFpbnl\<b&L<9/XW<WDbwQPtnNk4wa&R?\e\T?PQ5=4qm#ec6wLp&BQl=
6W:>+C 85!catq1dCk!M4Ycll6\uy=i6LehcZY/clWYkX!@aVN^eZd9Jq8XIJG&dR^a9Y1q:*JjZ=>XjmeTw>dM
e%WLwj N:Nc+L6<mai<&A:VtGn?klpDln4Mh=+LJJI=@J4Vh:cn<@\FC^iAn+M8Dy/M+6+cHmHkh5=i5$Pl\d6K
YJp<+L C6d&%hQmehn1cm#Y8JDLX<8LC@QQu#8dhddpVM1ZH/p4yk:kc@DXqbZHB\KN5D\>Ay:cN^AQL+PQHn>B
R>ZZRE bBWyc+d6qG@ji@np^i5*\KD*:#>&j84^pXThj9Q!PWm&y68p%u&^uEV!\KhR4M>AMkNq?:T/PMR+Vaty
?TZp8& b*BnVTHZ?K1INqDw1R1iB4n&LWCmF1GTkKi1SMpy%MHyAGHGI95DdZKLR\t\tmCM<C?&h4ei9Z4*:h8@
J58H:/ Y#eF@klKyDb8yI+TV$5LmQSVR+t61Cy+B!=VB*C1p/<t$P\9MlmwTnmqyM:nheAF8H#Bp84Gk:cDiSl^
1WMYGb wKkkGQFeNNVIa41#=?16B$ImalJVW8Et=GGSl=^M>AXDk@h6C@Bd:DSN#15%q&n%iGjnkWMZyF$wqyX<
-ACW/K 0008b6f4dcb001202b3 Page 214 of binaries1.zip
i\+:et KKbK?ldqJ1!!t\PtCQ6>E@h#DTqpnNINuF5hE6piEwkqZdGhKG+TMB+QN!w!Km+=LTNQWqa1Bw1KB=XI
D?5T:R Tm84Kw4#M</e9hH?4cY%W$yj9%&itj&Yyn894J&*L/%aLQ=X\mt84k+e1Vey/QTF1w/T%lJ&eWXSWu^M
E:a?Z+ /NqTeV5\VCbS4/=Kj$ZZY9dwKi88*pNHwP<hXubJ$qt1Kct/tQ!Ky6?i>:jy$SP5ltZ?I#ST<4wB5d@Q
X@%m$B TjHEHC6dWM6yZ#W=^SbT4m!GamVdeh98A<HHI&KTqwpG/HWdN5N=>t?K@dFTyyTb%JR&GY+<jpn@EcIJ
tXN%RK E!hN6DR*MVIe4#<Yi+CQG&>pk5Tc=inm:4QM!<69#Vy1k!+YmZF#uD:J\6kIBJ?S?iVyhp+LF%H8mw5>
LMM^J< q5#&a91P4pA#FdB8QXQ*dPe8YLAP:Nm<\6N:jenS5Ima?PS>kb8Z4\lLmI@bdnN8pyP:??Lj/c*P<=$Y
>*/=/T LJ\%TNnj!u1?E?ZRMaii*Yuj%<F?t5&$!R:MBnbyZ:Hen%EWt:FYwMtBk<jD6meZBa@T$hQk5Nq1T1^?
/66H8d C+<XX?ciI<5jPP?uuu^@j!NmkaFAA*#%@16lTR=FLTaN:AMcnItnJb5H&Lu8$nZ5JaNqe6=@yD+yj9:!
T<c*q5 qjyGj?&BDSPAbK>jQH9TjP@Pnj1/@=6nyEwWW!SK+!BV@QaE>yFQa*aRew$8m>V/c/kyKKqm%q1H<IhR
Mpwlu* WaQQ:qSXWFPX1T8^%hpeCunY!XXt1+PHlDcKlJWKyMC!Vn+dqlC8y8:A5actqKFMSI>X$l?qd$CJXQYH
&=ktRw /uI+jKAbY/DbR=Pq\PaJlb<%XLCRNp@RCa^4B<d%%leN=:FR?Tty1EqBQLL=DyILcV65B@AXeG6dkVQw
::=#AN yWnV&M4PhjtGQWem+6N#<kwKmmSqXIWY/GYM!+\:hj#R:p*?Zm/&FpcEeA94cLZ&T99?a#jiEqMqd+y:
uuDG?Y q$nEKb6eFnnQe*H#<Gc&F>cV%lc:>?*jQ=CJYka45V@\eMk^5mpZHwGem$%PTV<9Lm8VmN6K9w4yE9Z1
VwSSCw t81m6JT4Li$@cIXZ4SVNyX1iujL$&bkuKWYdSbh!##!:5ebih<#?W/BJbCX6Jh#!m^qPR+aP%nEQK=YA
/*lNb/ XRM4!K/<tHH=&&PZCV%J?KtP=kBjTX%H1dKp/pyTI$X#jnWiYVP:b/<iI+=%QEFDl5p:YYpJWZm+kTF#
>eTHNi cMh\w$/&uP%L#wm/iDcY<I#pj8$/EH\5Inw^QjPATL8ZcIG>@X<:D>cVpGbk\*/cDB\*yQ@kMabtE&%5
JSu:iK b&FyS\iH8W=kM6!ZaBV#/nX4%@4:iFL8jX!h<IVI#ElpMN:A$HVmqPq#uBi+LyCjiZ4TZ5:i!:yMGBGC
cD#XD# 8G5Kh*d4Tt@@QZ5CTj=@NJcYTW%JQl/VEB<Zi!4I*ey$k88mSjL!Qe/k?H#Tw8bbcPlcYD5+k8tFleGi
&>H++b tp*d$*d>:ihMHcK6ycuia\4yFNP%Z?jQLJk:h8@nH#kWHHy/V$lY%AR5+$/^dbXbK6&><mXa\Ta>LVW=
RY+XC/ @Y#alZjQH>TuLy>nCQJL/BS?Mk^beikk1bkG:#p<\jlpijj%K/AHt=?Rd6Jj951?5d=Lj@V<Vp4C9u@:
anu6>c #/5ZV^+>\LLie1Iq^AqmTKbDYFnwMZITSkWm#VV@qMpF@!\=uY\?5HL4SKwGR@pKmt^NyNpZwcKA4TbV
ZV#@Iu dXj4XG>q5#k!NkXGVI1bewJYwBdNb\9W%hS%SllPMDJ5AYVVBnKSt5G+5j*=aJS?cdCFR\*GDP9FWqDu
RltuBi jhXRF@JXMTJBlTeFb4YCV#XCj/\Yq$W!j^SX8h\&un4j/un<Zy<ba*84/R4AtKu&NuknGt=1:dDaj?9B
$SCMu= 5LmMQHF=XZX%#eXLq/>e445APk\LCWYEHNkY+IQ%5Rt*Jq&k%b>5/C*cWCeyKZqX*FNeYyb*c6<&d*eZ
i<utV5 lM*!Fhn6CEVMNuAE?8^nWlyDR++h&d@@aDDYGR+:Fb8RqJJZWXEt?XH!Vc\t1dqWqJJeJ@&Hbp9#R>b5
<1qRGl QqNhLRHq1Xq*Bp^P/?eVc*1NYJeHp+8BT:!ew/6HDl5&bKDtmP$TeYjJV:BcZHHb^cK$m&>8d?qB/NSN
lt\FP# 8>8enJ1!#qIXTeYX>BwKPN4&:jGyVV%:>uaIipa>B$IN1eat!eq^j@ap%1A8^IwA!=j:!9Ml*AmnSkPn
Ga4c&n 9PYM&l><LJ^W<W^\$8kqtni:m%Fw8K\Iw/Rt4ec$mc=w>DBk%am^B5cYW&ja!c6!L/LeiwIee*K\6=%m
LI/9ID bY+pEw$jy\@YVGR/aiLpYZQu!b#aj+=C^<qdbbM6mVZ4%1Q95&9jbq@9NWjAp>qQ\temkXAyTKmpyESM
D+BL^T 8KKVBt^adD%y:mL*BjNJaIZ4\5#1tk4^8kX/*R#5pE@\lD95?p?%M8@Z5:8ilw1YPhuPI^+Yu4wTM8*e
R8p<lq 9hj+AHm@whHH>^&ND=&u1/9JXYi4K4QaN4F=tYjT$%Lk$bI#R*MiN#ZWqb/Q<dHn1KtMe6khe9T\NLk9
JDZ9NX wJ%EkCe\i*mXF?wdd6>@>A!dD*:>>8Pu6EZ&m&:y<jQ:N/DT8:h9Zn=:*I\yZCVQ<W^TRy^GDIa1kM$K
R5#bBw p^hXpRZTB*XJHhCnIZ>WaT+Y$:wkWluhDZuW46E8@CSW%8B^PTTwl%b4Xi<ELtE+ZAijJjkBQFLq1!u4
S$T%Xy nDc&@my1EctNH>qNt<9VEHb1KHD:TEW1?pNXqhZ=*#ZaZHXFDPlSXPJINX1ARB!iRH8+@yliLBbt#!pw
SJ&WKN eZ:^XIj/dQP\MVJkn^9hF^=hTcQZtHemdWM#G!j9kN%Hw>L!JCCE4#hec:kyc>T/ei*KlWyJaW=1hFnR
P!paAw 4k%?m?\6GRdN11ZXj6\LH:!+YFL!9LldcZYFPC$&jJ*9Ep@QL68E#t/QdilMa+?m+KNB?+QD\mPna^P#
K+a&^9 ^JWXFcXj\I/\T<TqXSj#5<y@!X:R14jEZwuuc11wE1Ymt9K#HdS/dbnX*BYyF!>IYMYhJRJ^ahmKNd/i
D:N#>Y 4w+#J9Y^!/mRq4CKj+udJJ!cK&ZucVyyYC<<N%LS%VKK4GTwW*e?D&Rp8?NZic#%$B/#K#6j+HaiH4k!
cPn98H 8^L!RB>@\l9bM5=!*&XL@\@i4N&\hie?dQkYu=cXX%!a5qFu?C!:tZ?=XBnld6b8*Gw$&5VaTH@M1EH>
F/?SF# B\\iPu\phlR%NnGF*&E8Cba:Gn%t#KmSa<cNN#R&5=\/E?MQBXm^c%:ZMcmHl/5u$*HWh<XKkQQc6REd
E?kmea 68$MYLH/GBFAKKTSNcVK^t@c^GF1hHdILp8u8R6hub&e=4w5&FBhW%6*8j=c:Pb^+<bMhZDEQj6b5ypD
X=4^cp :F%t#:PdcD^&eE@%kR=8INw>@lBuE:FC4lkTeQ^pdE4Mu9QuX9j8ym6R=/m4KLKGH5yPl<en$XjyJ$@j
tL>Kli 9I+qk#PVNm<b^PPMZupE/>+C9I?Hua!ImpZtaNiym@W*:n#AyG>5yh#TKt&V6hN6QX6d5DR=X8jHynBN
<XBiGw j%KEE%D6SVL%RWk!ThClR>VBdwjpjWJIKn\n>9K\!uc6TGZ<1IEKcwIP+M=HIc&yLNVk<>mWPp6Ny6:P
e>d#KP qlIdyMDFwAVBb+%9AnWNHq8%?@Ayly>FQ<D</HjZbdM%NCpNSb=kLCZm+q6mbhbhW+&nIY#VWBB\KDW%
GGP+a* XSWXbYWFFd/MMAt#WAiISINXYJTCFJnE@5XV/V=^@pSDwAQdaQ#Rjn^qBeFRk+>a!ZZGk8WdD+Rq=El1
@q^dWy /t@i^SmB?\?ct^<<8Eh5dtqBX8KypH&dX!&iLTiV1JyYdT$jab<5LuqYVJhwq=hKm5/uy^<>ELl>!+c%
cK6/t% G#cALhwtBIeZC#KBwn==K1Yk9L!CKqeE\jclyA%EuYy6@eZ5M@W6n&u8:iwhJ!88qShYqGZ?dKNX*?V/
SDh4V/ iB:P4XcwBD>LWJwdijL\ki*4@D^ebp#dX!$4abXSqR4qpuc^w1T5VA1G1LT&?5\#?wIyPaSX$SMPCm!9
1NP&1y AFqZXm5?</&NX4u9N&XB^4<9<jm%nG^M@I:aB95DjlQY%<C?AA!S!PdER8I/@TdTwbAVpZEyYNGky9b$
a&e>b\ :%E&M?Z&^*1mFhd&M#W&@tppNcTNBMAbpaH??BFDl\$hPtVREG4\KN!ZGD=m^MlSw<ck$bqwM&*/DN8b
qtmACa 5=mYK\/P\CVTEw\EW455<jL&>9Fb=w5:B9/4N&:j/46$T!mYJWEmab*NMJLtp\yEpnMJdBE1uL#\IEjH
qcdTtc Bi:PD5+L@MW%6Se9%eNK&Fl=$5uCjMd5&WCnRdc#=t<L<QX\uDbl@JBi9c$YL%^E!lY5ZLYT>EuGbl+H
MGQY&6 ?wNtRPeuKnq=Z%SP+FBhQT%\u>TXYFwBKTtJ<ZF^5XTMXtLW+e4c<mKtNQE8$+HnQjbRS@6kVHH+1TlM
F:*aVt WbZ#CL9j99\H&:@<c99S*1Q6F%Dw!/j*d>?<iQK\CY6ThDFII#acW@CARqnT/*B\5C!ID6aq>AHbknqb
\ZPVl1 !W^cPBCwY1S5dMVt<1WcdeJ*RyatJiTR#pFeNkiiKWWCFeCSpjEXBB1W<B*IMZWNAX6JhcmX6jFH$VeS
JcL4#G h=^wTE?PKq?V4#ucpBL^ne$tVLF%tGh9%EhNVRCGTXZA^\8BQcNWFdlCmyBI!qQy1T<c^bF#TQ$ZV%p+
&*QB^M &ERp/lCynNLlck+a?%uEN:T\Zdlmc>Cy6MK1?5b:Q=1F>^19Zc1Y=KXFl\b8Y+&J/IR$@T6wqT5iS+w1
RT+?T! Tl<Db\Sm<C?BYtq^!epJTcpb9C^+J@MLm<DAqJbJ1GJYpdV+jWpHW1YtIT<q/&:uA%4>@h&WW?K:6\w8
/ca5D# 6>DK$14hm*e4%q\TW<W>T+8LC4KTIw<h*LXyqhi<>aYTp4L1!wKC9MJTCda+Lc<51=JJ1FJ&Shub#D69
9\+XjV uZ9*IbE?*haWZc$G4qSWyn?nYtuF15RuTBShTZ=PPqatJL9knL*^^S\Zilq@?X<d+R9hBmBQME>=\=ch
nZYZ9H i\<iDV5hq+\h*/59Nh#J5yp\*Zd/%MtW6hyEK!cnmnL/d6klal5cGS1BjSHyn/H$iiQGG+mM\PcaaSaR
LubQII bW%Q:nqq15$$wMuMYcVYHWMS8WSd5MVVC@jW\F!9YLq8t?>m4?&uI6HhBwwEAWY\>l85=5qy/Z<+k869
G8Q\Vw DqaX!Iyb8<B=5b9dmhwLtELReKQ^V6Q>i/q?qwc#=<!pdAjNuLQ@!N+61^dQ5:WeP:mj$RK*SW8Y?m#^
&Ii@*X \u41c:B6^:bh?\:&D#1K!>uycHBSR+QCE5^$i*dDWqY1LGZZtLQJ5VE^XLSlXE#5\R#MZCRNqeQDXm*e
hJnSwF H5I$Fn&NWw1lTN*Xt$*NV%?>@jnqi$6di*8d4JZFjLX*J&V=@QEhKLXH>?Se!Wc8CIA4YGEH*ClMdnne
q<DSmj Gc^H?qGB9ChH4a^KK!SMWVY!u8<$AFNN&+R9<hBH&CtRcZ\HX9\T$B11/1\iFyMtG4+ZjRKnNFmk16bh
N+AnJb JlIctXya&</b:::W#<Nt5LI/JkHSAmW?l<8qPC!\W+11HLkGT!Dnh\4cMC%Xy>9wehw5LJm41MaV6QGW
JBJ^kB ?D1nSc$m^cH>S*?B!%uMY8T@<&lM61V8=4*tB$&*1eaih:Hb@X&MAMV1=BXF&Xn$NeDVeTLDEI%!Y9Z#
yJjY%b #u%b=YWq#eX$Ed8p6KK1511151Je6c^WIlcZqH\DV9DEJjnZ&y8=b/w:1L6kmh:ZbtVpW#>w^b@ZE\h5
jF\4pl >1?1EBhqN6htuT9KQ^N:<5ni#d/de<4E8ahNS+<b$e@*ZLqM4CwyT%:8G*YJpplL&YWXBXZ$yaAlQapc
m&#=q^ E:wE=NX&qK1W%iSe@>ubT4Mw=IS&WY=tcu#WZ:dD#*hbl+>k&jK@h4WZMkwMCLEG/:5iQAJ8F!t%Xqq*
-A/=uj 000da304be5001202b3 Page 215 of binaries1.zip
Vwd=$M 4jH?nbY#y5?aNup!8m$VLM^MVa\:DYYmhkN1QQ1Z6AH+tacK^mdGqPpwM^M#DDe\6:CaaEZC&?TpAN6l
h?$yMh N*9PHIi@DeeIh&VFW4Slc#d:8QuBk$alVPTpCDy!HQie\FKeTcjT=nK5IKW&<ptPy@neMh?FP#BF?uL>
GhSZuR >S8N6=9\<Q>8RjCCWZb&64a8q@LBah@6:#q@l5uwwabPm^a8tNc*Y#ehnRt?AWmKuZ9Z&QTdEZA1BMGN
YHpkQ# NcDVw\:qHZd5$%$LXtX%ShbE>+npGGtWKDI1@plEVqbGctI51W+ZmmpVwL%?M$KCS1Qy+dQZ:<Bt6Lc*
Z&GCiG 6@=1wZ=&6Cn<c1Zc8:Z>?9u>K*cajjcaIWRSEmI^ZmM8Jk16B=QNG*L$mP^\N:uqCA5:iVwG#%LQu554
EcIcy4 KC^AT1kdYn4/BE\cyKQSKu\5dNQ<Lu^L1lC1ABptVnd<X@SBNMB+bL@^IlG5V?cVy5@G&9b4N&%b9eST
kBdj<u YW&wIS\behlpME@GXiF\PY\PMI9FwbVBhXEnJ$a1ZDW%N8c51ktHm$d%WEduSXFXnhQKW^AMW>AHn%@Z
GZ<iNj $GKY??4h^^N!K?49N6?@$%B@8i:Tqc8!iy*4N&:jR$be4bZpyy+?5u8>6?NEa!TE+ye!Y4Z#Z64tnB4^
%N*da6 9YJyEXZ<99l6CX&5W68ai@cC:Ac6&Qyb?yXthcm?K$6Q!e69w8lBh:QT<p8#p!KP:n&TL#un/&l6cTd1
ajGAje PVP86FR5L5$NZ!W!tB6dR&FtY=Wp?#5hNcwZ&R:4%6$<61/MK1WpK1WXp9V<:^lIwFZA:DV@>n6Y?C/n
&iEFSy jKmq>Q@C9V/Di\#A&dE*<HAwKeGbX%J^Ah:W^$?4n$!!tta>Ej$PeC&MDA$NDKRmtWHdiKpBQb+Y1SmI
\aw9<i DA^FIyulTCNnNAX@\S=^n:CjcVh:>y\@^kB\9>5hn*G<9bi8*PDq88^RCDy1AIdj5D>/uP#nyy:JPJPi
wa4MjW L9e>mBR9LMdM=8wcRFHN^dyLkQ1GY:ApNV@EmJiuN<<EkTcw?jV%?:ZVB#b8<Hc$G1>9/i\/d<LI99*/
jQNX48 /KpNY+SHw69ZPb5I?88adw++EZ:1NHk*<auyTZ8!mqd*:/tuAiBRXqIh5#eq8nPTH^WVhZBHjHJCDEE>
lXhw<F FW1H>RHR+!aC+/5V$D>@<+=$a&66?jqh>p*/9c<<E:?>DR#By\@@9u/P9S#p5E>PnPhlCamwTK^eEBb/
S$&uER uA1SHcXDhAutV=#<+/%nGeQeKlHddJdHlwN:q\*pc:aLL\LpP\H!!kD=!hc9Si>FaI5B:patbqa&>p=8
thiAEJ uu=4N8*eG*kweM6TVZ:jp*qqhdp4ddVaZB/ILK/GBq>hFV$MBSY8FJP\%bYXXdkCeM<HnleNX5ehL<bh
B\SC+Y X?V%G@i9TN@RjKd:/n%l!aW%N?+@8HP>41cm4K!<51ac:9*FK>edAjH*dq/1KD\VjY#9^1YPp+kFWH\l
9H$<wi wXYqcS8n/<SF6\D5:$yWJSh9F?VYW!W$Vc6RV&9V9qM!i5CH18Tp*N#p$<tTuAPdA%a8Y#^@68H!#HJ^
9GGd1Y cWHE%k%4qm\/ZmMDmLP4K4M1H>?\An?d/1:cVW>:&MHc<k/JeuuN%Y^!=K@#u$W>aQW1Q!\kSuq4LkWl
YNnL!a 9w#bpyInjBAk*M9Hh?Z1hb5^cPk+%tZP!kYj+HLD*ajQ@*pj=&b6M+tcwG=8ctJmJBIbGH\b*#qP^YD<
h#/I%% ?HEGAQW^IpNTykHBQYGC=j<98NHS>jSi5e:Dbipi#D<BYWPm4jCpIyDEB<Q1BunP#PmCN#u>^k*/CwB&
i9lZF! :RZRPJm/j/*lXmMy99#$BS/$@@996ZN4ZkDaY66j=\S/P>8atp=j+LyklyqINHbIZ^$#u@Wd61/hQtdE
!b8XH$ $AHDVXbFaMDjKXA#<Rqy/aiQJpjyh?8tLiC!%XSa*XeqSHYi=pbG^/X6Q^+ZnhZkbGGDVuSBP@6<IY=D
MCS65X *WBw9@@<+%e:L8DaQPL#F>qZ/y5TFq/q&uXdY:=>?ak8AipYX+biBVn5hB\9B8EhTi#E<YQTpG=!dMP#
9RLXp* \cy1bEp9Km4MS*Td&Ln/:+$<9&hcV$V*9^1WRJZQW&X%5=:$W9SPNATkdY^1bnq%%q^ZnKna5a@Jyw+I
L&:TY1 e5\Y%%^4c4=<jHF@Qw@m1&wIPG^%pQ/1m5y1jE4A=uM=iEDL+jN@<hk>lw<h!Ye^#VZABYnqKjH+Qec<
>9@I!C Fitd&d4=:\qLK/=4dG=11MQI8N#e9KKTa6D\FVX%X^99N#?+e:YtJD58hD>AuBE=mp@E6G4:y#6^F<6L
LJ8Cyb 9lT*Fu$CtH<wWT&69yBheFXYSQ?k?@><*SlbpHe8Q@^w<L=hAG<jP:?W56LCyQC\w\i&d+&4KJYmdCt@
Ta\&bm Ym>=@YbBD^K%4>NnlcRTjp/ZKyXj!*/AS@En5L\+L6:!$+5X!=qcS4BtA41Z@k*8$d@B9Yu::kQB^$=G
TlPI6e ^ciC\%6cZZj>>wPud#=<iH*Sc<4ECibtGER5pw%unj8wL^\@Vl<?^&MkQm+l^mcWKY%PV^A!/J:<B>*W
$CSYFG dN=@+D$WyL#ZM6<F<^b9a+wdAYymwmIJ8k<haNIWa$Gn!DLynLquEN&\eJ@QK+KdTkwjaVYZK@Z%X$qW
cQK\^/ @IPHn=?T1K8*:>=@?IS6TZ?Bitn=>%4/4AuYe#^YL*Gaat=qQt=aH%P9>b6Z&ylaGw+bdGm#Qw\EGy&P
M?HqZy mwdFP#p*N@L5?cucQdyn>LEcT&*i1inVy/nVXKS/VMdiR?SAn\44C&\A8RL?cNd=AuFF:bWdh=8j9Zu@
*c:Ypl =We4QN#*d%</Q5p?>@$m4!wMT#e1FkddhR!&W=ITqiQnatPm1TlXepaaFmw>*p&P:Al$u%Pald8a\VdZ
Y&b@\G cNK<=h9D55w9yp*T:AS$@/PlJ8C^XRhcY^8?ALE!m6^$M:MJp&$h5XV%^8*:<NcS/w8F+1w4nR?cG/?W
^6wC?T uFmyn:&1yS!c4c#PXqZnWTBYcJ+TtCp8^ejaF*Y>MiN$YT\G*R11dV!Ky/A#<4%wuPp$%%Y:\>LEq?<?
bV=<Fj 8F%jJe:L!aV*I8N5V5/=*IJmeGEAG<**dq\5#WpIC>#$G>:@F5M/@Vaq9/T56jlNWS8k?%PJcquXya#L
t8t!+n :/RF>Di/4?##^bRWaQmy+$eP:h&?!Z64SuqJhpyKRqV+5cMy=cYhmG%JSjZbC!&HyyJ$Lt$6^?#cenEq
yp/haK pbW1Znqjk<jk&tVhJmjkY#cCj?445=RWFQbmiXM?QKJMTQ+nwG&<??Iq&EB:heAtQAeut#qaJcu!+6Xd
&*NKnE >^/@i9j%X>8n#bMtY5C/dVniADNL^qH/*<dT?9SaBj&^qD+>V5%A>Ajk%IS?@\Qj5?#6@:N<L^!JqXMh
DAkjF/ ubi6^=w18G$VFS5Z&+Z9@d@VeDP!5:P!1E^HYMHV$4N!<kyBnqjY@IH*NiKma1PJ=*J<j@#$Gd5l6lFl
mDQam8 <Quh9i^F@n5&LX>kc#%655tawSPZd9YjcnSq51tB\RTH#cmC5YQicdKAy/TGSNc5NP*XT=5QEGi^#INn
KAPPKe w?V=h#FyRX6PSaSVJ@1jSICn?+\SY8Xk&P+$Q\YA@&^4@+YN5D=>pL%Z?QBS?1uQ=!?p6%\:cR*<G?Sa
BGI>am Em+>NVtJn$iNAHNTy8wpMIeXTwZyMTA@Hht%kljCMqtWu%eq+l6P5QjeiCTq:Nd>AmhhdSqb^qWFHJYS
LB\X8# p<\Nu+p?m<cSi+@?pKZ%DAiZ^V:?G:d6DeIYbck^m!RXhVj8N#hh1^GjT#1?*qDWV=NHeYtA8/KcPml#
#6tn!\ mwRV!&AbX?h1n#AaICVKZEGF$<GV<STEk#?K^y6Mti?*M#SXjKZy\e&/$4!56MT+/Pna?JT$6QVM5:tF
P5>Eyj p84LN=1cH#Si45lLP9pZ$F<Z$m46D!Tq%bZT+yeE/F>kGc?wVc>9w@LwL*R9LFH&NByp/ct\+Q$dD=!6
^1KKm+ Lm@K!e=ITa!N!T=6A=T4q>XI5m>&JI*FIm:cGqcucm=WTADp!tWZTuLd<SBcE:hlRw<e:HI=ahZ8>NVE
Wmuchl Dji@%jjCSYMI^pp+%hbh?+P\V!VY!!8y1EWn@PL6==@69>=jm4C^MDZEE:D&5V@GWGNqa^VH/86VKMAN
T&TaYQ mjCt#ASEuYCYQAN9cwct:S>+M@liNHT^%?!=!:F$I>PWAXb9EKRE*5Ga*utMiF:ythSbiAXbhPcenDPb
$1ly%^ b<HdJPkGdDQkJmt$^NqEhQ@::6&Hn=>\>eVFp<D6\>9ZL=+>4qm@dI:6dN5J+$hQZ4=%5juEGXQNnHhQ
bkwRWH eh5SjPVw$YPlGFwZGS$D>E1KQJ#aGD!5l=/tkMNSbk*jFBejBjDGINLp<IAVJ$<T?SCFwktDh59A5nW?
H#@Lej iQL/HcIdq&1t:?ldINu:D@BM5Nk%6wN4d@*=Va=\W9RRBHl1TyIAD#ER+&R:=8SJ/aq8euSH+Taw48IF
h8Ild< STZmEqDkqTK?&R!*NaE^SjZNN$1PLi=BAd:jccn\8iwnJ^w>Fu$SMjji#I^W\dF*hq?/e6%YkHe+%y#P
?edbp: IRp5wFQ8*/\4#<?IC>8@eaYu+@ABGll&^XdtC\RcGnKBIy@Lp^KAc@RjQeqCA\G84M#t<jpWV<yV=Qe%
wbqWZK ?CI!MJw+%\jL:X&=h:?ly9l5c6#yp/HHn+P=\H=ucbuum5y14+LF8F6jtb<TjlBRdmWZ=Ht$T5*=\y1!
6S4XdH p8eE+>>KXMw1C=P8hb/n*>E/Q#JnwtJmVl$I#+!JQF6Xin+:K#%dRyY^T65B*#4q%he!9%jMHNC:b+@8
Wmp?5^ QZREa@aYqqiBLFi81pl@V#%DjKjESb+IId8MIFBIByS$Ci$y>F41k@4p6*9=H+D9*HjwcNky4J1K<96T
mupY@p \&$\\^?@6:Z>?Q\?dh=ME$MDjj&&Md>GK++cQWa&YkQ#&MiNG#?iCHACekZ#CbTq?t?RW>NyY?E5P\J!
L6CYDD ?TK?$N%%/QVb*6kcdw8<dpJpVH\<C6$V^^Hpl*=ZbJVt#D5L/*ltJ5u%A@FhY$j\nRB98HGLRjm#F+l\
+Y&wh! pCi\ePLKmRIFMWhPqB+%*:?&b+ZL:EuGB4N<Ze$6:PdatFww#%y^KPk\heR?lFV4\NTB!Mnw&NRnnYi5
l!aIPb ?@dYBTeVNK=*cHRMkZlMVHJmRBAt6bED/6R#JKIC:h8Vq?<?@$CEj!EBT>I*C9??yh:%i\<R@@!XQJP&
<:GQq4 qt?j*9<nB*kbl68tyTa4+#FhQBYuBAk@VWZI\1pIZTapt^DwLFQXYE#\LVT&h9ddFbF#5iq8#juayWQ:
FI5+&\ AMC^IlFZPH/m+WQSX=G%EXt<J%lPIqtcd6+4A4d8PSmCRmZ4QJN#A5C:ZX>hjDd=>JEhc*$YPp!jNG/+
d#/1My DlhdijF=jIFRTGpw<nFd>!hQXVB+!iLldBZTVpXJHZNDAPE>^u+DE+%&JDm?/FLV@Y8XBSu^y$IQH\\<
tc!yjn EAlkRd<pQkYdVF??eR>MSZXlc5VBnh=hEQ?iT/8?9yySYT58jFZWY9!&?FiJm4m<8nD!hVd>L>&6<&LW
lT&wS8 pin+M^6H>dW?GqM8!e<4qJ\=uTa8d\i^LbXwZV@Z@KJ<@dmBQZ9$%NWecL&/CMMkqK61p=5:Mi^lSGJ$
tYGCLY BFdpIDyqBTuN+LEa/?6m*S#M@9p6\liNSbA9ZT/9Iu*\TKle!$t1/1+%*u9!?9&*Z?$6Z#@?i?&5l<lI
Q*B<W4 j<!a66F6w%kn1XHWcHwMQXahaI=K*NCIMqa\NcQMYRB#6T/aW>NwZM5B=q%c^eZXicI#4PZLX/:ByZ\@
n#e^4k yt8jAu$4l@uS+IPBRd?4i%Du/ZNWn8dbdFncCp6KCe^lEd>&uY1\8HEVjW\C<%h9GJZ!qhVlqP5We8##
&nm#Mm >QHDB@j8*4+S8&c!1bZL>G/eZ8dYNlcVh5@jiGDV!t*B&ER?nG!tuD+XHu:!bHLIlb8=@8Q/cjH=1kwc
-A&^^D 000334d0680001202b3 Page 216 of binaries1.zip
W^a1:b w^iE^!H&a8QmW5=5*SNGhA1aGI!BSTHi>PnF9=??6:c*pDMt#L%+?jIXTKb@@u*L&BY=cQ4&?V>I#$lL
kj!X<L T^GRR\IAP:PXiEwY$j&WuFP^#E+K1WleKm+8SK\dYe:^&uI54cL^@yYm=GQ4*eeyCDW8CV>yKQM+R1Q^
*NJME! >$ZjSLQpqYc5y>nMtGpQd1jj&5&:ApQCw+qaKc&59ZV%J5mXlk8T*QVa5AMd@Sa:#b\<\eSaNFII#1c/
C>/aN\ pyIKq$@cp9N=HF+HCHR6d9@%^\<=>%XHmc/wyKRK9GnuKi1PM9klEyuNYLR&MC49IpC?Im<6KnS+*<=6
QaV<Zn Y:h8&:YjHL6G^1XtF=Sh8Hc*Ghd<w4TIR^8>HiTad#%H1:/9#Cl4pBT<Ibl9A?%TXut&@Ke5m*=D/=$!
8w?F!Z tdbny:GYn1:iMQ@h?YJJ<uIL%:n!5l<TdjGNR9GHL:eQ#4Ac$48u6pa*^/^1AL^T=cZ$c+l*Ihp9^C1D
%6%D1t /%c9>EP+T>&%thw&9<9+@Ea:mb5nl$iBl+?HS=H!yYK!cjnw^d9QLi&@$Qm?9lG>X6>kVN8wnyH$CB4\
mRlm9w VkQi8TBh^w>u<G=MtdBMGd!4!9FP&ilMu#GDSNiShZ&i5<85CR+8m+d?y/WBma>LRL!HEd^*qa@GwDE/
&WYb&W q#/9eT+ul%E8XVY+QR=w6$K$a?&QB\<J*9@6$m%aqLqL8ZT6/$%*Gl69dl5^!H#!aAE5bJyDlp>XZdLD
^uq6J* #/CdcRB%SD*p?HH59wZT8%6acQL^nKj@%8?!FuZuk*=lV#kTH^$XE$jFD$:NPdA>HNj%JFJJwc^cd9F\
PGG9%Y MeBnwu@i9H4^kuyP9^kMpH?DpCihu?DbhAH?HkF<MRA?QT%XITXbq1RP4#1Y:LLIV15R6MhTeSwp>TkZ
Q6+\p6 n\ZK!4C4R+XI\<#YQiBRjQG%=l9qtSFB8@!XHE\%?F?ELM%H\1?\^9N+jT!Nt$VjSXcGJ1SFFiuA+#nQ
8bQ6Zd heu!Nb6&Bl+>EbYW\YS:ZLq?E#V$4e5XlXqJEWh&4q*1P69GEyNc^uIWPiyKqAKZye#tA8^=/511*Hc?
1>hnL* qCjnc@J/d<m>tPW%yKe1i1ik&Zq6QAZNwV>BM/HNPbqh*jnkipX8<1pn?:b9DFm:ip*A^8$aelB!Im4^
a!<DG^ #Hq^Vj*6=ke*GPB:!aG9^DyL1*!/qbFhZj\Q\d&$SF%eXqcSp*L=J=XB@$Q*c4V6*t*keFnP8?91GK^P
^CnJQ: #WkMZDy4&6:mm9K1m6JjAQ>L=cqXdjVnY>EPa*9%$NE!nc+w:!^X4D%@kcAjuhID8:h6\91$!:CRCLYI
69+heq e8hlqdVjG!/W1!LAj=\e@16I6!cAH4AXNZ5^+*k>@?eVI&ui\66:<>\G\:Gn&pjKS6DDGR1wa1KhZL&#
5hH5b^ DCpn!pVbFM?LCAMtMR!ky&9b#4ThmW5?EGD/BHNdB?iFm+jmk4<i!/:L>^ZnpRGuGRae@FN4WJbQ=Vut
PLS<E\ un>*nmt:hlH*!Y<A?BH>h?VdLkV?u#+^t^/@Y9>c:#HI:EHVZaB@yqXQ9S=>iudV=uHak9:G#ubPb645
/ZhWFJ um/Bl+?A@MVEFh\Hkd?GSIWFb4>:X=8*e$JjHq6behlPLGISq=CauH%<P%H8!TRtt=E%+LdD/9AhV$qj
Q=$%KL 9Zn?:Cu%bCnJX\WG@Q8PhNdER!RG@+?:<J?DacuKiBTRVCYyJKDZE6$b%a*aqjmEBJLaneeDyiZawkHl
F9St*u D=:l14&u#6jh8%8dG^h/eKjKBl<u$&+cHeJYIMAQDa19%G8$lhEh$R<pkNqEt&p#dLFV8>N<X@BTN?:a
Z#>IpE j#k5Kmu#ZKGa!c5FZ@:8XZBVMT^k5>@m8dcV#LB1WuiYkyImyeBZXFBWat6kPIP1Cl84!QHc?B1c\%eZ
&iCjj@ J/^*MhSSb=HhhTCA^1AYpbGlld*Z=yDW5l5QdqdqJwWH:h!+i5X!H^>aV6h9*d=4*/GR<JmW5$YXq^5j
FutDe1 QLlSC\\+?IeB*C^cSh1etJNdRlX@LQyX@G?^iwt+w4KmMDQ=eTwIH9YPjZ%:h>QY:6cD/1+=hq>Cjp:e
*W18tR mcN:%+RWX=dpFXcIpRNXX@Q#@/Zy>yiTubc>itkMPTC8pJW1%XSth!AJBpYEE5G#ATR>KYu8=pb1RGMM
&LePa5 5Z^4yw5FBq$5\B=@&LMM9Z4eX!?6^mQVy&<?MJ4u*h5*+A$&=:mbnSubPaI%uB1tnHE%etNAn?W!Gl?h
Eb#ljK KVAHypwMF%RaLqBV/YuWDCGwu#pPD4MutbqQt#q::wJFT+a^6wAyMpm$V%I<hkIKA+%@KIl5ycXpuM$6
Pn*p>V LKIK/RIlln@tFwD&1dq+1j:/nX8*1Ed/h4e:yC+Hd6ERLu^t&4:<c1QcB*Vbk6e9MHt//Zdn4c54?wDF
$EDXYd %NdVE*Da&mQGmLkVLed$H#DYhh@Sw$HB%DE1qD:PPmaLYZdpSE#R/abHh!?jC%+\qM6l/c!IVwlLTEnM
6W:<\< !6kTKn<!#YEYm49E8Y>4@jEF+\YiQ**!?QGnS+?jkGpCM4^=k:cA&SH>VaZ4JHw6J#Q#VD1hlmYeB!eu
BqlF$4 EY<&Jmbc#wVE^KTpbN!SKmkYq=bZpHLbRAanT\ijdcFuKl99%^iuSwWiXMM$N49S*ZX?cDaLY#XWRc%4
b8lk8q >S>qhk9aaGF5NuH/LQ9bDw/wM^h=?K^c9*%jeFlpakbJM4>$>ed6i:l*CE=6bpJE<P+Au\Z&W!^NkA&n
JL<mR8 FXqaL%/w#PEVDeSqe#B6ke@:!chBa$*j95=%$4kSjZk5TyGq%5=V/GEAbDC^YRkihtH>@h5%ieulB:i8
+P6tbh >jQGnp@8u6m@D<SF$QHVmbpF=ZW*H#!+Yj6je/B#lqd@uytcZmCSmI8@AB5?FhNFuPITTWX6Sh/byK56
$LSCLT !eCIQ8*%8@V:nl!ly>&6i+??+!^*lyaWJ=</Gq?X9>6>*yaLLSJc4FSXhQ+tSR6qHW*=C$b%$@W94CpH
VG>mEF 5=J%E>%eDXBEi=t/!<5JH&T8k1:mtZI9X$dwaPm?tCu<#$n!IC\TqyCcic+An%N8Nn%??i+LEWWjMjpE
Z?bw1G *?:LG%%5S<1G1\<hNt#+d$KwM4Zd^tFqKSb+A@?dD:1+hVuVdw:>NA9SiA64t^q&D5/8:q=Dq/%A$!B*
+HAdk5 iXEeMaR+kehPnIXK!#1ZZ$RX!+1$C\9!<$pbRYRDGIZdh?:eyby$:nFdPt@?\jdkeq$EdBmIH8@un:>N
mVh?bW \=*GY#i9JQ5M/V=p1J/R1<+ScP5NF=lMM^p$#NL:!QbJw\$YlB?qn6FHYTHTw@RSp:DDIYh9ZK+Y=+b8
hEGKEw NP/t4DL@hFyTWp4c@t$umVBKa\#D6eaHV$EZ6dd>^F*Jq<?iQH+wc^:&<NHny<@RN5BV?6>5\P=I?Vuk
cD/QQB 9&ewuEtZy1tpJ1Q4&^HZDYkALElPTTN:X<mDK8^Epq<8EynN>NkRuFB!4jqt^htp1DB?<J+6c@&YPBkN
Vpm5JL //<q%BT&A^8\+:Rcn<QXG##PHHD&W#RRCVF:Lkuc\Nk:H:LJe@^WjQy=<At\SMth?%T#5LG?8mRuNi4+
@MFTtD kc$4QidNtGltLDNTHeEu+pitKFRCAaTiAbjL^^JZ/wL9jJ=kyN$Ma=HIaM\\HSX\D%VBIXdpc\>9Eipa
Ph@N?Z Ynw8&*Em8?b8$!YAjPBY@/Z8L9Mw^:=P4l:LAX?dh^++El=*J1@$+k&=mRBYhMZl/KdTuG@u$=QPXbTZ
VH^I!9 F^eZ@kSi@CkYFlYL^SK+#>WX=ijmp!?*!BJBL@Yt/H#*!ImJA*V=86$$6H1Pud5l8#A=8#lyu@?TddZj
aJS:<W Jeyq+4QyEmuN@jy!=+VBC#L1115Le=<mKdCAM5MJynPMdAH6!mPyLX%iMWMK&6$KTiH:8%6McAV^FJk>
:j4Lm: cqkB@!XTCSNF*9$LekDj>?9d9e*$kSHImn>Yk6bZJqcCM9!LFM1EFNSWBb5b5quCKTL>$abtE!bPRS5^
Wl9/kb *<%n1cW9&Ik6P>A@S4pW<^eunkS*QSW5<$VCp+1Lmk4SZcm6R%Le8R8MwP@y*u@\AEu^+9W@d^qTELXE
ycNR>Q 6R>1I&GS9&*E*h8NN&<$ZK5@dHe+&FlLZbuD+*C+jP*?@aab&Y*aaT*WHDI*XHcp>dD*piNHA@iGaD^4
A>b?wF &8pnM@61VD&YubESHSB&E9iypqFFq6XeB4ia4Be6*^k&QG^?<PA?l9ZKm*5\#?ddn#><8C@u\:t#RAk/
ubYA5V R*yGndVCBQ?am8>B?JCTpy1Yh8b*jjn1!uJJMXLCbK14@::I*L1tyw8F&Tt^\9CnB*b5<Qh^h=wyG6qH
5T&8Ra F@^btibDIR&5aQQa<J1/n#I$N:wtclENNAJi#Ju98yA5lp9lVR:a88jR5am+6J\m+nZecuwA9Gl18FmY
V$<i6c q^EjH4^:\#JZ?!pVVCkn&yAY>ik8WMjcHwwKRBEqDIRY<QkCHq6NZjCX4/ndi+lWyDli9:e/X\&aA\=a
KWy9hH *=<ma=Nym>aFJ$q8QLkt!a\<6HYXy+9D4BuVy69cPT:\BQY$d88iwLCa6F^JF!%PkhM5n<bSEmdVZP4y
Ee@5m# =dn$*NLKCpqJeX6ST*FH5Y=JcYqbSYXXVW%XSYXqaZbcW5dX>p+1uu=Jh/>j6&Yd\%R>Nb$iY54>h%hZ
*J&nln Fljub!SEHw<5@!JSKm*I\YB@/pjl:1Y?y^4T*^BYBAj8&d+JZGjTLttl1\5%Z!AQ6jiWt\1yuBWYeqa\
^5AB$y 8$ZkQ<Q!uJ/h^$muB*Ly>P*4b:L#>?aq<AJe$y^+8\unSw\eSj$tBj8*hAJVMS!4*yydYFlbVdTiM5ZG
!<qi!H blyIYt6#w>EnS+8MnE#MLc$^6ebykd8u#^A@wCQ^w+q&mw%QAq:kKWDa5cNhM8=<Rat$qJL\^TZFJiBD
l5d=Dj %NXj\^M6/l=>u\Z916bDbtj$:j8Q9#plc^@EGAyk<59uyH^G+/$dDeCJ8k6Sdw5t>?9QXib\&RIqd8>l
\Qk\lF S8=4Habw>:j\Pu!ICyLBF^X5jQnI$YPl\d6#TD9:mKQLyp>$PXC+hT?J<5i&N\Zmmw6ZG^<<??jVn:dY
TCkM+p :\D/X<?iND?+L&$ch9?BuBjk%MAV?w5YJD\Bt:Ti!#tduhYS1Z\tLT$q8V%JMVpqqW1n$#W\<KJaWqbB
8mJ^k+ ECAyLkA?GFuNZd+nLKPm<eG%<1KehP&E!LDk9X9Z4jB&t#jL\tS\d%&lRQBT!NKkMH/b^<Y/Xq!h@5PN
w69XhI #M\8m*+lK/!t#*F^q>e%>X9qH:AF>=BmW*Q\=IK+EqT#=wQGK%ZFPTqwLqb:P6tC8cCMYIa!pbylj%WX
XFQPQb FXWF$EnKLEYi6yAT$B1KjC:uE%>Sa+BBy$l>@LA?t141@G=nY$RtaCiY:+w+Z*i@5Vwu>5m&XS=PM&&5
baIhk* J&JX5Jq#F*u/?K*i8DQ\iFV1ietF9^p^mYHEwASc@jQ4^nPJ/dq=SVKJcqq=iaqaW6^c%KPw8BkDte6A
P?TZd1 XlWX=lielbWnZj#1dX5HFWP@wL6>PLLGe?WK4%+Kt69PXX?/WM8eHtcXjkcDWb:\44PDXu/W9uq>Mb/C
L9MIke CeGb&L^?VSeq5H//M^?nH^e6ZmLjWi4m^DS\Md1PCWmH%>NaeIIJS:q%D@VV==@64TRXCqtB6TcRFR>1
h@Zj?+ !<?5e4aiQ*1eQ9nXIJ*$biQw<awGI8JbK!EnyBNwC!X#C=P^%EnhEYQ%TemD5ctF%YRdY?^V96l4?bCX
VCHHTh c$u^@<Djnbib^t@l+E+epY>8=SXJbBX$8SAL$tQ+h>$X\wn:D/VN&k>S8DNd1B>J+lb+EhL&\Z?bCBBP
C6/u<q ><GN8NuAXGt8Pi<:b=TltTFjkTM\NBp^^HnP9EpDhWjNYu5\WHbRKjDkwaQWIV4ItPTmHD?^AX!IKGSu
M$Y!#M !JcFM:*YpeRZwy^k9dnWkKdm//@&u%<@9u*>@Ap<#F*buiF*5iLkI*Rt$Luy+5V*Lp=k+?LC<#qACqb&
-An^I1 0005e2b0cab001202b3 Page 217 of binaries1.zip
VQ1Y6^ b=b1JwuWTJEq>$AdpZ:tVEaGe?!H^Km64c+wLTpwE@HN:V\*kum/?8BPZbW+4\>&XD\i6Gh4AKHGyApt
p%dDTG a$eN/1/4w!ZR\NB?TwMq:ND5EG4BQ#S$hHT^$qB@jTNna*NV++8mX6FAR%QLcZNeQH!a4L*Xc\M&dN+X
?+BM*e iQSphEy&RTpTBh\MIM4>P>e9qDL&a/QjwnqVGj5lFRpM^\^TW%BSW&RyeITcYqya1%$SCQtB4>B44FSE
Nc9IL@ mbVHDP#PH9BVbGJ5+:a8PLt<<j:q\8VRZc5>=&FmL4dR6by1N>>6Cem=dj6DIqQQhbtN>NPHNm/hc<&R
dL5:RW SC8PX1Xp>Q5LqWXW1uyteWFBhWZ%^T8!i91K+1Y/C<w%%bYTDC1NX!w84d=RX>j$AhdCnqQ$M%1:+>n8
RB6<\T /e+:h$Sj9Zu6/6W4yL^\$RiJT8tFqL^/YRi6?QuqL!SI@*$:6&#w+keY88/KD\cy!TmyVnp@jL4+$hWm
^=u@T9 HH%e=4n@Cp1yj#=>c&*H?QP9j#Qp<WQRJk<9y<cE?h6P6:K\uDB?QNbEM!W^!tdtblaV#E%MnR&NDdC<
Qk88!k +IlS+<bVBqKSBlDEdMKpKhNu#buu+4bp1h<R\5w>?$pt!&t5bm:9?RbTKkRnyhP!e\5qFdI18yK8$C\9
Py8KWb K<Yc5hiaGImH\A:1MjXEIN>#JX9/+FlI&+i$ky?Nb&pw@Z+dnP9Z/!@Z%XbZXlV:Ll\#&tLChMF5+!Fn
e&G&>F ynw=t9d5a?1&c@@?#kP!RNPD<mVHa&HS&#b5^#TCw$ePB?@hHa\6hcKINT&81K*HjRm\F:?ap?CH>=98
yQcaPy TB8H*!d5iQ!E<j#@I5i@L+Ee&QXiWyl:@q^PV5hb=c#MnDQy5nRYtA9F>DMbXCchybHVFe>$<YJNbbt+
nlKtXa EKlla8P/i6@ye:X*HtCX%REqiWCPW<iD\G/5ZP48bGe#&eudh@Z/Jbdtw@9&/<Qn<#phdJ4D=jIEGqy>
YEEnc8 lk\bC??G%J^qLDP5FdWBM$!AGR8YLEhTBK#dkPYYhkaiPSGXqJW91c1:i8QPjYCG#4$:N!>ZFy$FG^K+
mb\#iL LeDHbca%:plSl8$m#6mS1m^%Dp>VY%6Lypq4KYkI*9PXiL1DSqEmWFZnSw@@KhI!u?&#M?L<yj5*!#NQ
?E<Ymt :X@u:VVh$qS1*M<EJJ*n@EYi9t8*:D$ctZK?m^NuIkpuVMn=\<hVNF@&@QGN514KFA^@!emRucE#Yhq1
FpZJT5 b<@umi?@ij&%ubbTy?ku6Gb4id1qYh!q/:ecdq!@i9umlb11h^Lq&45qJd?\IG$@eCHYat@J^a6eZdB:
hFA<Wi Mb=8+caDCKdF#G+46WAJ#^5<F=HnNV^\\K=/?+NINehpp9uH^Lt>j9<Fn+pR@uID<a@eubDHyVhhK+mN
4IP/<k P?Y%*H9i#Bp#dYjPkD@VdcbN6bu6aD9hb1Kb$R<E9atbJV4Wn5/wp9!GwNMCymkI/:dk+T#+q/mV$C^k
I9Tp#h tB$lZ%q%b+%GNjcG4dy\?YyD+=%:yNI4@XVn&jQjiQ?PiJi%D<N&ZZ>M\yQjJ8Ec65EARX+tKRncNLnQ
JM=Zad NQ:EpeQN=4uPG666?I^X8@i$:>Qhj\C4YBLIA<Cn5$LYBIeeD1cC/PABS$JIYbupM#u=p51//*ei95C+
d:Zw>X 1J>jQ9##<mq\/udnLi4tmF8a8kH8\&N$bj:G@AjE@G%5mwISpPjQubQt1KNaA1@/#Bqbiw<#GbtbYhub
*+/Qh= b<@m+cGEkL/84lb4yRQ1TbVd<VVJ%j5Q:6/w%!jqldEya9C?:iBBLHcb::e4QLQmb6ZbpI*LZe$M^+<e
wakART LK@%M^=N5Aqq#DI1A5D*N:c\tdQA$&@6^p&d6&#hT4J+D^\Pm$#M^LcS%&:i9T>4%t1/jiN14RR6\iE>
HG\*QJ G%e6tV9NpqmCZ!J%R\Mlm/8yyc%FcT4Dh/HkHX?F^>EccmD/JNI!5ubbe!my4QFiZX:<+T*LZY\6VV1N
p+FL*y ?ltdYE!^u:6k<VL@VaB#EEkZd!LPm<>EBY*!tVjb=K=IEVW%w4*^PQnVLT$j*9#:ATDYThHj/R:1NQ&I
lEXR%V =p4@8VF4/Nc#F?@j8uGN81JaISc@q!mLL>jp9G<ChQjhB9/^u^#ee^%ua!kP\H9?AyA?DLlqBN^8uw9?
>uZ*:K dKTT9Z%T:yjbGKt+mNIH9PS9GLIF<Ed><=u^qq?@iQ+W5j&>6i*:^#i\eJXL<6P\4P1SRLAyAj:L9h^h
:HnF#H ui!uVVI*NtVAdY=q#Tkih/@qK!*YwPLB*TJ=C#JM8CXL?5p\pkKRVW+</?w8Z4^\wdcty411>qI>kjin
\4NdtV J$>q#/nu%A9id*n@JQAikQAtC#w=?ZlK!p:mku/N\ZhFiSpqWTyPD#jtc@RcQtZSkwpD?l1:d6t=1&PQ
J61p^@ *6=>VJ*YIAL\5BQl!bH?8:A!^ECta!*//1TN?&X5+@/SYhFjQ*@e*HV:%k%b\?Ad6^ldk#IM<A&?<e@@
hTWMXi +96CycRI/:ceq==Z^dWh*IH&VMY5:LNWn8c=9!KeLq*A@p=qtBlw9&VDwin#Na$Qtl<$Ddq%6c=cWyl#
Vimd8c Jmu/bEnk#p%4@Xd8mem1dG!/iQdE%1Y#LR^FwG^\?V$uwk^bwubSj!Q#1dMB$\Fd=D$*5KAwaD4lVG+J
=XG4M$ 919wBik<cGy58H1yAlj^$MD6Ad=8>yQNnSHXQ$Y$Ic?*Cqek%AJkc&6yA1a^<FNn\QlQIp&VGW8&lPZW
IGTD5S *d>bh8dpdu>*P!8Vh1P?^tcVdPe+L%419^ERuZbi\8!aFtekwy&ttDcJqAACDKT4>>I@/HaA<Z&ci>t1
SnFBk& 6*>cJc\TDXhLP5YjJC4mm^i#Kq>lDhe?ekC:8e=*e5V1iHkm/#kZh+Yb4HX1kR4^d>&GL&IK#@*Xni+E
SW<I6j &j*5WmjN#>/<?@!D:Cac65w%!phtpTaId9*&+jYVyy9%NcSBX&Va+RM:6/^nED^:l4YF5iF*SLCyBVd6
^VXhuh t#%9@pKQyd:?R*D@j@e?W6D^FIq>VIH%ten&E!RI?q\B:qjLLk59AawB\/Ayd^H<Q8><Rd&pZ*H^9IuE
p*VAiD $lD+DmL\qT@Q9#%a:FJ$DTR:45<XbcXTCc8Wj*K<eP#$ccJiI/i9kLYK&5YC4\qM1YFew?WInplM&Pm*
+Lq/%l cV@yGHEEI$qJZHa=cJLt=&?^8^?5$C?iNN?:jc8lkdyPN\^lRw/atKQ@CiEH6^91L%TYFljpW*phic1=
q#d1dy iL1huW%q$huhMcn*@HpMZ5jDQ5D\qj4LF:E\e1tIb&4n8uJucEy^ZePh?<%>+LGa^6bb1ZGuR+Q*d6>:
HVESc# K49/hqNN=9HNH4bt1TIYiE\5a!ZA5TEqal8bVdbj+Lqm*hc>5pC6k$#dn:DV<iuum5pyQ?C*B%d/8*1=
p<im&I BqjqmCN:N@9:8NlP\wNlR<P9Iw=lD$W%4qBdB%dp6>mnnN>Vadn?F=GYlaQj*ymTG@e9=eWFk#h1dYyp
IYZ11S JAXu4R?IH46=C:%Zdh\dEyYYY$4\i/EpM!y+<#JuG:N:InXMB#A^FCGCL?!qj>J6DIJd<nhbDHVaXZD:
?dEe=I @1ZTNnFh1mAy@TtlT%ZKc^y!L<5\XcR@\dG:&\LuiR/#5ZwY>nklS*%8yFjEkkW!F?WFGNukRW//@t#N
!^Eu\6 !AN?p#Hnl?#N\GL<#+i9nIDF>y8+IH>qF8S*u:?*6Z=:@?y^W<Nqy6@yj*F5P*tCmiE*EY*EN<Zc?LkZ
KQIk68 5&mJn^@BMbHY<1CGqDRCbN!RCYh!5a4L\S?m4qL%Cqe8W*XeB5aaP9@1Xih4/k$dn$$@j!XqD\DFyCQw
!CI*5! N&dD@6X@XAdA?ALC8F^cyqBi\T<?8FBj1$j9@1d8Y:h5*Tddd4WDq1w>5FKS1uKHtRwLy!NnE4MP?8*B
:y+>9L W8!HtSD%4D^a\c:jijV!@Vh+\dAMQ*8ERLk88#4!&9YGt+%NbD@t&a5*@::@DiI9BMS*5C=pYZFlRWF?
RHp6^t QyXQF/kYF8Vqkidw!FE<h#=Zq1ib@#6A1j+1W!AjRG^p=iC%IjBWy1Tt:616*pCSB$%MSPi=#KTamGPS
$HiwFk PVX*:qTqHh*wdtPTKqI\M1M5YPc$taayb18bYh8:iK:EE/!n$lANVEa=EStjukM$9HLnLpBa>@/hY\*%
<RwC\u q!=WFGHSpWM:%/@\:FIYZ$TeeaN/111\lh4k\::nh@IWidwn9+t$DTi/BB^P1&//ZbF=e6hK%?utAHmy
@V$w/B cACGPp?aP6QS%Y9Xy9>CPDy+!@L=NtcGD$V1GGFpaYbERH^=L>%C@/Im/d5$8?tWZdeJC?QQXyb&mFZL
HQJicS #?*bpqyY?p8mXm1SqFW*FNRnm95SEC>e+A^4<W#d/hN5ytHAlkQy4pBALJYDiDF#ZE9c/t:a5y&El#HN
@iBk*Y QHFF9FB@+!:JZ5c#@!+e@^aYu>G!9u9=/G=DZSZYca<uGN+e5G1=y@8CidN6y%mcGH$XcSD*ePwMIma<
mucT/* jXc5Hp!W<wFDVMYR?KT$M\VEJHR?p1^:tCR1dcC9</@X%%??ey$y899mXied&V@$9&\G\D@IPn!\1^<$
6d*>#& L5T+qjn$<S<l\WC+m11k!/pKX6Ye/y1L1b5tC4X/#QHd8tZ#F5D^6l%:%n9PZuiA4MYHMVd6bESpXG^<
QF5h&1 c9/JXZ9&Hnkw#:QI#lNZZYwALjHyb*9LX:ITN#Zi8C/6H*aXK#BkunNk?CXm?M69DL>FDN@A5w\qSWXW
kKW4VY IXWwK%I8\MNqnLFV^VW+L:?AKlVm&S1J5kNj>qJ6bYtSSMR%t?:16?%IVHc?8KKtX>*XY\VH&GlcWyB#
N9&6LX JntuF8CWEl#kP5WwXcS1cDb=/6Ryp+ZYXlQM#W^MJ5/c::q!+<:Aw&FW8DTCh?y$XAJAGNQZ:kCE>i:h
e>=lP+ 9ut>Hn^tYIaVVwZ5*:y&8j8eKSbpR@GDTH*+ADXFJT=jR>APQ1C/P8<ZAFtJ^>We<S*E5e*m4TjP%#jZ
KpX%Dq F!WEd@Tea&X5bNkl/k@T*GK!4aP46@@tjeim$@QK/t+ln5XbkGNjq?qtl5%Mj!/4TiaMpG@9yZ@SFCYV
5$Bi1W TRHM6&u&<?LFa+jwd<k9p%Bmhau+*E:nwX/F=c$ThZFbVY%=hqd^LaJulLP4m=Pn@T^d:Ie\bTyGIM%&
lk\ciD hHJ^JTWEZcV#qX$R#?:p8NZLb#q^@?VSL/j\kJ?eyF?/%wnJ^:?nF*@?Bit9APi9:%+<9ENK!GV@kjM!
</dCTF kQNe?^qVLE&N9lA+Y@:Y^56Y4nFdV:S^EDp&\1\+yyBVA8D=hE\TPF4mm64LDdecG&>lF<PGc%i9*d\N
$+kTnw iAc:@W@dY?1h8l#NGEw\>Hh:</<aZWQ<9phhP^$knBHQNXYXqXTFWtXXhR$jP:6hL#46MEmuy$*AJt4#
wud#PJ ^C&d6@yQWFGj6DPRNA<m&mImKnEq@1D9W9?h8>E>JeGtb@Mq%Xh8QRBy<c96^&i!KN?=&ZD%CuX=?BWA
i=KAQ8 +k$=yJ?@jQQ&L$l@BEk*p!1I=iLma11IKqI9^1M\QCH8!FQML!mWF1tJtSm/c%TD!4ZLF&ABB#kdYe*&
cJ1qii YLM:lNmuu5Xq%j>BhNGFy5d!yEN4ZK!NWpT1J6d&YJ^Pc?aMG&6Le%KRi8P8k!ESMZF^5qk1nlMQh=V5
6\M1Gj bN+GNQh18u*#&yY/t14!wy!$tBQB8#j/L*YhSja&DAHP6KHK/PG/Cm\%tWDGX<bkI>XjVANWJi*?R$h?
*QHCmN F&tc&9u5mSE*N6ZtuN1:!6ZG#Mm\HTF6bG+>A!G>bj@^tDN!TF<Wb<eEd@XdMMQe/CHwFjV?y>yatuSl
*$Q6u4 8lW\*TtVAcb9$h1ju8%j$M5*C:5yFWS8Zd4A*8%5SRek81V!auXPV9XDdBLTHRE>j>+ei<R#FnpnRZZ&
ZmJwH@ D9QtW/+KC%!w?bT#CyNt6Mn6n>P*:8@Y=?ub=*?ZAZ9?/5$@tF#^1e9FIwKnlTC/?ja%5Ft=tTDpGET9
-A?q4F 000905e112d001202b3 Page 218 of binaries1.zip
XY&hYD >QFe=PJwN*$!IQ4#d$VQun9jhdH*<qX4l+Il&MWe?J\tcV^bGFCFT*RM/FKTDI9%M8>Th#T\q?CNll8*
>t5yKm t=y^@j9u*c@*/l<?@S>+JnZJePiPqE1@#TlqBQSFhBiyKtXMb4&+Hi6%*L#hXF<XaMi*ZLF8+?a6/>&M
c*LFSt hNS%DVeh\ALmBNBSCZH:q!*%*W\cn8*HW?Lw^LTek6Ic$Mw9*lGXAjIBF8mGc%e8aa+XA?mt@\C/>R?k
\mHYT: 5jISmAi^4IR8weW$PDZphLi#RKY\1Km+8IRTC$6JZN!%ll5*d%/@kk8/YMR^ui4p9Y+9>lmN:+HiJ8b+
AKp9*E *:nL/I*/i:hKE\L>uc$MW$CJY6tVI1icVw/#b$&jQN%y!e1N8+NCV<iuydiqDe<+S*cqGpHL\@?<kYm8
=%5Tak LJjpbTchQlc+jb&jy@MMK$apj^S^\Ti#5uYeb1T1#PNVAnW?D<8i19Lc?Kw<Lwi4M*A+c?\ZphDeehYl
qLlG?p qP1t^6K$pC%LHYCbd88C6PNCu>XdD+VGb8TXZ:4XDJCYuI$=9NZQ%hdC/BFVb&4K>Jpk!k*qk1MNMN$8
w=<@P9 w\DVN&lNGZ*&^NE6b!=Zbkh6*4y^^b1$M1qEVR!Cw!V:+pN566dHE@9H#b+%\&c1NbccbWKnaa%&JqZI
Ei<u*? P=!XZXB^tLnJbdMjpe$:>yD?aX*%\pG<+ydq+/hMIAiJ<j9TBcj?LX@i9tl89FydBtw8Pi=WcQB?eK=Z
=N$wQt ?C^^t?<+c=w%kQtVHM#Vb5/b=+KP*/1A+Zmw9+@J:eCeuY!5YutGES^JGVpahH@%=q&tYSd@DmAV1%M!
AN>:>S WX:TV=$j%j/kYbZ^?d=V**4l<5#+jZ?PclDPq?w8%HdYKNXi4L5<B*P!:=CF@6?+A%+#9Lb9ZVqnSE?h
TP<<WG ASMD>lI5H#pipZ^p1ji!Di9Zd<BPc48a&PnE>J#C5k9Z:n^/@jFHi<8Z>&?iQ+c%GcTB4G:IJW#$@k9K
@^lt*M H@/G<m5C=W5%Fb$TT1JiYwcFXE1Km#8L/GKFE4FMwqqKaulA5IA6\w=T=RlnI\6dF=@%=Hm*i^nt8tiD
6CAt!# aAi^eB5i=MFNTh!BqZMuAI1XDC%5ZTq9Be<q&8AcPVuMt46+^ea>\Sn&iD:*QGn!RX$?D<E^PH4kXbcJ
Kie6Xk aXtPC#?<h<8cbi=#dSmq@AteG1:bbIjF@n6CN1+ewTtk?KyeDw@HbuQd?Yw<65dAWjwm$SiSy1GX!:1R
:*yE\B 5=id/\9mA6e8tkF4e^iRdS*hjNb5DR!L!<!98NSIkJ\Vi*ndmwY#LBHI^tbYaJ+hbp<B/R^A94/Z:kAk
KP:ea* 6^IkZ/Y:*#%*81A+N?yI$Q:68:Q\jK/514+!/?^%cTPA8Bhm&N=&&qT5+n4BA48PYW?bBqh#euGb*?c5
>d*cj6 QB<lVL56YMS+jmmcN&@H%yFMt<e#=GRDX5idh?+@jQV+!hNutI:@#>9j/#KDaKcFK@kn^+Q*+jcRn<hC
B6=!ww b\hdt$pYJpajGRSQunb4n6MCQE*^D^B5@NPhEtN&1S!65%tbb>JTp^Kb6/5Y!>qSD?qtDi!$h@e&A?C*
+dlB*n RB*1T>6uqT:<nyQn>>8*4%?bEyFEZ^C>nABGu?>THi:kpdICq/=eHaaL=*$5P@:&+=ej%=I<jj!YPBn*
mkW<Xw /V=/^kd5G^S<QQLEh5<q/\IC1LWPyI5tPa5qGC/18EkEe\9SF$<jImbk6TjqCkmIRYA<jkJY/*?A?CuY
?lKd5k 4ERbZEyJYKX1APQ!C4IZTPMCDe8#I9!IKlhm=A%1:>8*G&@k?m$8EdGNLYe8<CF8nB:+MTS*:A\liQ&N
bVF>TX BuH5Qn<Hm!TS86t$?e6Ya:5HHi#d=?45:4h^#?GV5Yp=lYKpC%XEF/wXqbVZIJcy=l=p$?%CDatN#E1K
u&QyWw Cn%Ec9w#pyp!@AwPHmDT^5p4aG>ae5HFkkm:IS41dIyQe%k<KX?F^?ZyDhYZAy!Fl6d8Y<ILG8=h!Iua
44#Fpe =ihpdY#$C+nR^<Lch1::54ZdD=/I#!!w8I^k4kM\H>t?$5*P$9k^?LMA=qpP<=#uV4ekcL/!q?+ENLjI
<XZQW% cED#FX4:@dZp?KT<tCQB^@Mq=bZZT<?h8@w9>m:9+i45aDjDb9Ip!\qam^k<TXmQaVtiA@4CtZcm=%FP
?+CjPq K1RN^EJ=i&?=bN/$>d<NlI9qdW?cTKFAeuL>Ww:w#%<@9**?AMA5KVmdlquhRZ6*dF#n=:$a>!?tYJpb
iWqL/A k\VVAK6mNZu/LAhub9<maDC#j>GXX*e&F@hZ5a=\cuIT&EKT=*j@5i!JBuc@i*C91jp^aAR*nn8@hZ/q
TAucWb 9!p^WP/L&1aL!y?J/@j1d!^V%%Y8%q<G/$>hyP8W!dI=FBd&B+?i9un#:6QZFlAJ>*K&inyb>?%qQG<4
lHYq:: QJ@\R>8>jFbl%!q1Fi$@i\&l>Z+54bq+=q^SSX*D9Yj@jt%6a/VFZh\F8HkBK^Se^qCZyu9!KHt!\h%C
1@@ZWX 5Q#%E+Qq/=h41<yqbc^!F9mkhBXhwXSiXq4cKXFCbM51NC5^NkC<k#6*t?:e9IdlJ<WmhSP4tjQhq*k9
8@K>EY <>MqS/u:D<H1EyiTtX5pKa:b/#9HQEtpdG\>d?q/c19C=w*h%1%b6h^4MeD+TES<Sl=+nNYXTJp!1qTF
5bFHE> FDb9wyy:NyGNC#!dL<w@q^+jEZJk?:wXu1:&%llLInQ<LlwEny!q:aLqG\Mn$p88*L6Vp:nFd4CGKyjQ
XQuCK# =@L+jB/d1#N<:QkPBLKSnijPGMthP^Zy^#b:&X5aGj+T>VM!unB=qyP:d<CPR!eVMk5JpG@Xqb/LQdyn
$T@=8% qd9>SJMuI4/S1cYNuiN<X:j=M!&N=h6!WpD!V+LpT:Tk>XF8ZE#t/XNF+J9t*9l\DWDMhbw#e>1WTbcp
\w+ny8 mBbqJDA&NdielM8^I#buuTidT<>VIduK49SCb#h*>:>EMm4D+/VN#y@&eDhIVpMV/SEHRH:PLM*@Qu>\
uItbaG /$1NJD<:FZNWD?*hnllGl&</Kwy*CGF#1!uV<cB9pYeZlH>9>5HX5idu?S^ap6QV$LHCGtD*HyH?e<Ku
NKZ!t\ V\CV#cT8QBQ4Rj&k9$8@KZ>uaN#uD+!@pJMcJ64*MZP/jbN1wK>4kK1+jPqT*TY5FRBC>6aRYN+jQTM%
>Sd>GI F#Hp:@*4J#jP:X5+eyT%/:aD?:d:4Fm@lhV^p@uP<X8^cnYVS59A8Ln!$5$H1JB@jj*\=5Zn?:hSdX:A
W&V$<V InJMTdAtQI$EGGQ+:FeG^n@pMG/<j8XCXYiFYkY/uiCB+yaKky11$K85InY6GSDD9d%:/#w=H^TytXnP
nZ$&Jl 5J<#%*tBn66m4&W4%nAqN5NP^!bF:Xqtd=aE&5N!ntjA*pB5btPFWhP4@LACjYJYaTtR+9Iq5k>jW%%>
L<Y<hL +jJ%VKqASa<:F^YTp5K<<>py+P@6*dLY%&Q?#EpMmH?KB5JmdD4J#t*F%8Cw4NJ4>&>XyIX5>yk1G1LN
GlKmIJ =uL=QJ:t!HEG4aBlDiPb!@auXVZhKEpMCqk$#SVYa6#I5J^1=?#l6&=ueESThqHqFVtG++:8>Hija&*/
V@=ADI XCR\NJqka#h9Ahn?ljcVVBDEJZ6y\C@%A<SFFH&Sbuh?9SmhXm#J4@q<BjC4Q69Y^6y1kypJMSa<I<R9
b>Re!> PFy&np:#=ua/$uNXTQ51%@u!T8?+qW#M%/+@ilZ#EpCl%IJ\\$Vnt>nFHhbmJmLl^e6ukF*kT%bK*Kt\
Q!Z1wD I+F:6t=a:i8F#Yl6<CV94S!:iEmNY&?AZjPNVK&Kp!SiKmeQHB*eXaWX?E^tL5bApNy5d>/<j9*1JZcD
4>RZh> i@\Mwj8bSP*JY8mj5l>KGK<pc?@:N*I@M!EpL$AP!/F:R>ckhP%1jd*5Cq&9elW*i8<P8ahE?QjD=??@
cd!i<> &q1?9H9=8KulW9ubjhNt4h?^ihYPQh5&BYA\yA@qQSV4#/<mFeaPHmWbZmXXq&<%9*#@uinlb\<bjXqL
IV\@Gp %R\q!L&JJ!Gayjic5I#JmCQIJXQ4L%aDZC6bXX#ELuM<YXubTdbR1tW%tle8ZeZCaGnkeDdYqBcyGy5V
?AnRFd +ch6c\iPBLFe/$mG?G+jP:NEEeh5y991ZTHa@PG\XhCBQh5*d6l>=FSTVuEF?IBp4/ci5Lc?wSFLIN+n
T^5Gtd \K$1^%!:<#pbmbHHD?*c/P@n:t\:$hSaB5l6JeLY&H\K1PKhIZE=qVj9Z^euB1>dbIMl**&=dK=R@\jm
EEj*=d %5S?ShCb8kj%?hH:XnpVDVEAuWIdi^jQFS6&H#/XhLcwCyQld6YXua<L&duc\*G!tiE#peDaaw4hQNjF
pGSPiT Zn:LFn6PMWQk=8&qcRD8N\LeYqyF>4Y=:8/9T\Bc68*WTbbtJ8l#TpWeE6\#EaN:=qKPqAQq1Dy*H6EN
X&Ae9+ 6P9elj>DN*VXICVCwSAQtP1aMlCpCkSGFVBL:@&dmNuM=NmIa<EHht%h::@ee=H#HJRMS9>$RXc?Y?!*
&PB!lZ iy$yTXwtnna=YmH8iWFi:4t#tin%p?wq4>/?i@9&Z>KM:VpmqwRN@cLc/Fd/X&iLA8+We*?LZ\A5>Wu+
e=Vm#h S#Qeb^A4dXC+hqXY4<+<YeDW:C:l&>4&<>Nd*Bi51!nP#akM*LDq\Q/hY#i5YiYLqeM<MPtX/R8^dZjk
1D@CaG pVAG5QYND%>>@Nu?<@M:IkMAABhpDF+dd9+8FwC^FZ@\?8:%5+eEKnXWFX*N11F4XMCSlEYR11G4bXY5
DlWp$W c11GXT8:wMc$Cd=*u&yY9Zj:S9*FKppBX9dA&mqcblcYp/dc&5uQ:hi5>=qqtmnmt6k5YLEnJCa8Lma1
FD*JNT w5?Ja+eD>?\/en4q9KRc@L^:yDp*+\CR=IR?>&@ne$C+F8ThP=6FYlV5YL>1/cJ=$/%MnV8MYId6I61R
lE6IGT N6I^5b#8:BY\J!\y4:d^*yYCtAQ?L6bGuTKF<RdjEK^tn18Q=6Vj4<8J&LuM\SJ%AwDXhNK$Pc=i1#d8
cPQ^8^ QZw/JchaD6d!*LmRZY8YPE+%A$R4GBtmG&>tQZQiRkDA!yYi#6QMDAG!TZ6yF4MnIi$p5N$LcFYhM6HC
ynlX5A %Al>R++<JMh&61ND=^^%pk!M&wB&HanLK/MNXnQu\BnJRHyTEKVmMbK5bmV18W8Z/*Gl9WuAi9N!qSlk
d?T%MD GlMietkj5\@5=n^:89WEE<M*BKaVy@\=%Fk@cQPPQ*q6=\4puRcL<9QP=iTXwCb+<PVXY?1n<MQ:h?<A
tY>uH$ 1T>jkRZH!k^6ui%$G\W+@aQT:*>RmyKkK/Td9E*TG*RD/#y%nd/8%pDmGJwjDZ=CSP*Q66d9u@==%6^+
dyMFCT >WJ=$dtMyPn\pKB>P#dneccZl:5d6ZA8>mQ\ZkdQhe9PA$^$kdm/@9anhNK?j!LHFVi9a:\yLyP+E*j4
Vu!9C9 V6hP\@<C/1N:BCS\&%m%HPLWMb=nb\%h1*nl+pXbuicX/<#J!MNH8LtMP:$=Ip&tB1E=klS9*cKbAE?i
EEN:&D $eT=!:ain5pCCbYYLImQA4j+<PuW9NLc1&D*be*$A:Z:VZj9NJJk/L+kY?CBK<5pSanP#I#p/BPH>&+N
<m!yT? YPG%$BEVnh8NcENKSAE<ha*N4P%eq&*aH==YlQpK=$:6>uP$BKMI$DS*Zlic%>BWp^t/^ZPYtS!cb4lD
JYPD#i 66S@<:/R1NTep84/P:?l8hb#uw&=WS8!DA9t@^T^DGXGG1bY6uMZim=j8Vyk4e<CY\8EcQk?tpZSANFP
?EaKu9 kCk6l/mTybt^$W?5l&^K#5Ft#=db$:QXtRC&?R5YWK/DF@/>u<AenyE1+KRwNkp/L!5H5VWW=Xj6BXL^
6$<*!D D+^1A?A#N^Qj/INkk6c8<QF\hdLH?LSZ@+Zu5yX4Nk\mh4<4ncY+DD$EdP6ZtJhdXFbLa1d@@Wl>$jn<
pFKNe^ mRpaI8l5cY*:%W/%Th8X!iJJjXQC&u+!ZD\^ayS$m!ZJ::iwt+1\lHa&1PM!V^IqB:$EWH:DLLaQd=:i
-AmGZ* 000d249b198001202b3 Page 219 of binaries1.zip
BkBGj< 9$YmNhIVwp+eQdluG##ZbX+im%^hbM+8yB<Pd6S6&wtbk\nKt9w:V>=<@wZiFmNVL>jX@Abq%<+B&eqF
:#Id!5 WLd>DewdX!?Bkc<FK6N%KuCZ\AyVhjSF/kJ<%Tqe8p^h$YR8kd5#VH?M/6IeWTe5cPyEup&eQNWpReR#
#KA8wd 6@jeiCn1LCaLF8RK#/auSb<<qbyZZ6h\q=VL:\SRM5pN@jA^/<liX*=8#6uMM&pJpcFB8#i9>jN$hWBA
ZIky/q 6wF>y\CM+Q++8966Quk/R%J@:*b%b6n&yjdt@\AaBSNeNwaZNh/6TD8/\Z&/1XGLmDd1b#F==4^FQt8&
tm&ZG/ HnkiuZbPZHMX5ZmyInj?&P+Ad?jyF5ah^DKdwq<Em%<u5^=n*WuVCVaP4y/a!:Syw=?ducWSLYLSLIW=
:tpD8k 1ZNTYjn^S8EiT%PS=5FKC9?cIj@1?k%?JCq<b?tbV4c%@@Q#/i8C%@1i>%4BWtB^j5?N*Q9kQ@?Q>b@4
d1@HH* 1eNehhdjH:NWq<F*G9/RD=aCj4>?ucYIa%RWT\uHbe6a!nmKSC\XMw9FW5Xb<De%HGG?Pw+\u+$n#Pjk
tIGcIY CQP==Gw5Fk?9B9Q=PMJQBDnCjA$ead+RS=m9TS/X^hLCS+Z=&nnCjB$e+Vi/PMJ<QS^ljnj!:Fm5:9n5
q4$d4S aH+QHGF?V^^ljm<eaWb9HGF?H@I1YK!?NHuN4H++\9#?PML<AVnC@IE+\5^B=NY!YIQ^%eLjl?AI<+jm
*<kd<C CQPH+Rn#l?MI<$iR8<JmneT:Au<dhb%<5Ednh=k@BpiaQ^bHtK>Qj56mneQj\9#^PMJQDHCE?TIead+l
?4<#WI nnDjmF!F^VLG1<B<E^^l9mtP<B5#HGG?Pa+\*+I<Gw5%AS<N=q9mCQP6eIV=E*GEGbN\lQuY=Ft^YJQ^
CyPmpl YeH<KVnC%%Read+NnnB@Gw+\e#y=>wA9jQa\*^bH?NqMHGH?LB^l9l&PMN?i9EwYc#c?T9ndHB^l9kPP
JXWWRn MN<SS=k@F$iaQ+@eDSdLCi<G#HjGEZ+!Q+y<5F#\P<^jkCQMh!W@bdEY+p>l9l8PMH<Sn9Adh^^l@tIe
iZ?BTZ ad+H?h<5%lL<*#DjE$ia:+Wn#QjGEYa5^SHt?=BHkX8An\L#q?MI<*%^lC<@HGH?Cl^l=p4!dFm5Xjl5
p\JMyY aL+@nnB@Na:\8#W+\9!%PML<AQK5Yc^%?K#ld?6^lQpdeIV=G*GE?b6\lQtd!c6n5ddk1+Q=Y*GEu&#D
uDF&bL Eib9^^Ht:<AS=8<ph+HF&wX*Aid9^lHt:<ESj4N*Gjqk:eQ9MH<@?SiLhRD@BjMDeaV=B*GE?ah\lBqB
8#w#9Y PML<aQK@YK#D?L>k@lEeaj=SHGF?CI:\hR^HtHteZJ*FC5Y4\@\\HGH?CS^l@ppeaW++nnA@kn\LF85W
VMjKm+ Qk9+&&peaZ/pmDCFSh+>tB?NI<!QIe?Y^a4Fb\9#+*CEu<VnCQMVeIV=mVnC@CV!1qm5bH^XMD<FS=mj
K#@IR1 mmQ<Jk%HtJ?PI<\@R%+>m=YB4^:tb?II<:N\lQubPMKM5!L!\ewl*%t5e@kh=y@HEidu+kn#<*CE?jp+
#\C$Xl \qeBte%mFVI4NK5IS=ljnCQML<ES=w6^lLpTeqWY1^T9Cu<4\^Htq?MI<!6\lQtXPML<K9LwLFa%Qn4M
5GwF8q 4<ESjqKLI<!@kCQM9+kn#K<n#=LF8wVQE8bj^lHtZ<ESjqPQI<!@mmQM9$biDV\I9l1a*+An#L?BI<!@
:/jK+J mTQM8IWn#G<p4=4F8w$9G8dj\SHt*<WS=njlCQPJhaPb>#>@J9ju\bMubG\8K!Qn\/\5Mn+KCmLn+<&d
8j\aRk !jnE&btMV/hPJiP#kRQJ?F^Vp+\9YC^!^be\Fc@+m5WmX*#NayE49tG^!BZ@adHIFj>q5ekX*:Ja=I49
Cd#ThW YC^!^je5F4umB:\wZQEnijAu4E<+\lZJ5+a4j5ES49kXS:nmN^#lm6>^lC9?\BG8?BNH8GLLb@LB?9YE
aDuP56 jLBc!<kH1!&LjLDck<kH1&M#?YB%PyMQquR1?YDJByIQF1XJQqn$Z%1kT#M\I!*VW^D1jSR1eIRW%9NW
F:!?R/ X%TZaSFtTqFXZSH@yWl^PwR1ipJ#QZP>F?b<?G/I@^CcC@YEi4@\@@ZqCQ<@Q:<L%jX\5mH<*\=#cyLC
dJ=Bj1 $pt@q4Kp4=?4F@laiFl+?C!hSJp4/eEFbeJP9GA:QBE><6mK<8jR>ZeF^eeKYwwKj@$WQ6YX%D9bCl#&
*^lSkw N++Ct!Nq$&\X=leh&GFVZXHGd8Mw+jN+T=+HQk6#9X@tCyQk1aAT<qatV?/upKZZkR?PSS<XqiC@Kcm1
^ia\jZ Kcwy\JhMpcW8=emEZH#J=8SGtP6>MNeqw!H=bG+Ij8y%CyZ\XR@5i9u@d*eF@uRI<bGFZbekX=cb1!+%
WlP\5= u:RWQ68YDkq=>l\?*=HQ=@LQh%*ju#<LN4i&5QBaKnNZEJyLlbSRXj/IWp=Q6lJd1i9&\S@!95LN\M>9
TyP@QV Cpy1Cky1uR15Fp1lb+5C9pV<?b>:!qbp1<Q@q<EhXeG&Q^\P^YayWY\X<q5%tRJdVRFu\^^&J$ih9Bd<
<+>C$P @C#W%BQC!+HZ^N\LjEG6=umVyam!q1=:nEmn%SWW+Wt\MdNeWW$SHyDmhA4X=HhCKDNu/#F*&6^e4<&e
B\/c6< BVhGCj>B/cuDd^u$6RwX+XFyV8@jh@V@?9\y=B1T?<^k8NPeu1TE>:hq1iwlGh:Gh>R#%49&=#*pN@4b
ID8qFG 8?jW5/iLLSbdYQnkj+BuSQ*BJX@yQ:mpFAF5?AwwBY/LR6iukq1:Ap6N11CEj/YAVt1WI1*P?\8$dHWb
Pd&pKS Y\u8LQ5#S\q9Me*YXYLn8/Tt1EA8AP?HP6^ihn8D*h>9L4\e94tRIIaAB8<WT/<hd*IA4cjEpBJ?\EC=
qiCI5@ P%^CWS&91CkHM#=#9FM!IX>QKL<q=k\nXPW*uDLZRYDn8&BI*pWCi$N+/^DbHJ4e/c:dT*Fa<KXI@9aH
+k!uMc Cb%CjI4CLqLAJ%+Yd9^m8QHWWla5AG4=BM<=eQj:@5H%<&j+D5Cd+8FnAi?A^&J#R%\YKKFc%\QKPF!C
I\wWlj dZ\HFQAN+K5#6\*B4cdR$kc+q5Lh:%BRlLhCy1CN4%^SWi$Q9kHeFF5b:m&H@R8ijR8<1^SdVb%eW\Hi
WCS#Hq NWySGSnAX8:k1Mwb@JdeKTGl8:u<nuZmLX?lBC?T*HD1D:ayNk&4B\9iiH\#+a?/8w!nkP?lDmE/j96>
ZRSEql IZLu%bq@\J&t>FVk#5Ej9F+ue#$Y4puCHu<YFPd4#>LTI8Vy@V>5@jq#HHtYH\m/^+E+\MQBI=mble^m
y!T@mE wT+Y\cM4/cFSi%m9InTc#F:64GcpYwCI%KT:%B$PNbpc1ZZWqpbT1yKATSQPuT&Pbw\eAda@%NI5ISKG
Fhd$c! 5DWVdj?E@RNcM>XKkMVSX*W^8@ImGdj:%@h>*98/S/BKGdlIIwGI>**9<#:9jh@BK1/jY8RW/lB$1%X@
FMT@e= SWA:P5y&un<@XKVlS+\p##YwHQwpaSI#@idRmkT*S9V$#$&\X*>Bw5&M#St6**%GEJL!c/STWQ/mtXwE
b\Qdd& 1X8&YCLRHdJTSQ!^Z^:LpTt#VM4N*$j!D%q*EmF@cYpdbRSk@Scn^\5mYj<QeTXD\laR!jG4u<KSHKPa
E5>GCR It>qR9*KItMdElp/d%bTNeeHi$1=BWj+^&p6qw@u6JajW@d!$DyF=!j&IK+pFIhGemc>99RVyVXb1#Q@
#H*@nV CRLHu>YS:\FXZQ1jI!8GSX5m<mt$Xyq!w66+QcVMR+aSE44w<*uSb=^Mw5?p4AVY=AFD%yYJ*EeEn5YT
X=S<CL Nyjm&C!\=E5=?5bC<yJI$eyjYRa>w%MJ>nwPi:VI!WNkltH?c#wuAQm4SCpn$yIe>IJemEHT#^a!YA+Z
QajQ+e YteBK4aq5Gq4F#Bt?Cad+S@IYq+WCKMnGFk^np\D?EVtPF#/y\tR+%ludQdk>ANt6C$1b/d85Ky@Sc18
eL!cXn n8LD9IB+hJVne%CHGj1nPmy%YnXw8$e9nJR>L:<GI@59bFtYtcKbwDQW*RRWFDTi$<55+BMia:NCS<Pa
1iITE8 ptl>FwCiLjIbSH\G!VukSMJ!yk^mpkXPKdNaaA5k@S@klWepj\ZdA:S@Vc8?DTqXYFph@atP+X@!IbDZ
kPLqdt a=%qdMnldA5>LEe8m8/H%qWdl+Cjw^X?knZ/A=$\/:=6Md4CZeS5m*nQ!%Fw\/VuyZ:qEMS^YHLAPN$b
LTIAb9 =m86?w8YXY@>Q/Mn+QhSl#YjBH>PjC1>k:REAB^/A%@Sb#A8A+!#yQyGMe4MciZHAak9BN:k$>l<uV*n
88kBWm 4\mj9TpliyaecYqWQ9N4XIA^tST&IAmQ\+\#PS^Ahn!^k%>c<?K!kPnRaH$TDp8QyL<P5Z@FFmDCmknu
LRLHA& a@a&BV\yp$%kcL&YpDqdC^=jP1K4b?m4CXY5MFeckMY\:PQ!*NSV%&@KKp&EQ!Dl&@LELQ$ne*ZRSXL?
8<w%uZ i6V/V95@RQVQn%LK!D#^TANRHHkPCLeL>BEEBcW=K@Ak*EDk*m!P#LPJ\t5V+D>F=y6+yTcjWHHKw=ca
19HjDt 4RCC#l$n95pd8VDR</mWw?<*mWN!iEH@!\m$IZWBBBRYA#MIl*AeJu%=9Ga/lA@ECTR&AQMFFmwG^#E@
+cdq$q KY$F%:YYCkaq^kD\h@CVHZpZA5/E6ciQXc#klD/JlPYpinIA@=J\lqpT/:?4>S>PIB8T\CNGuank/L#&
jcHp$= 6i\VQqZpAl!akBL>^&NeulH8q=CbIpMS$$bT4%?!my&Dw#$Y>=Cd#adEaE+qV%J#A@bk=dA<w:*K&M\L
=?4\>R q^S*t?N9A?y@ce&#Ew4d=SiWG4WNnj>ZELXwjFcpAGwDat8R4M%MNlJu?=wNRt+qCm@14cupcREkY\CH
LJM<Nd *yXq&pR*mktXKX<5V+5/Xj/yQ\\6#RtkGb1!p6cV^Q?mqYtHKn1caRX@jlkiXhKRmV+4WuckDV&=qN=A
HYKd/Q *$6c!EqWYYBJ$@8b49q4n\k$l&PWmhb#lER!XaL+d$#pd$&etH\bAmiKJ?t*haFe>P5Ih/cy=aWp@E5@
yhlF6Z <<5q?j?>uKauYS#TMIqP/Tp\yaj9yYe*R+e4$iT*Ku\M#kRkYQWhY%Q+CkMeHTchF<GPmThZVPWiVYTi
Kj>TlW Tu=k#Y4q+J<&eQJCK%<\*MV6:$bCe@=ANF!LQ9q$BL\B+NlYcaJ1Ib^YCew?t?INCZaw1w=DRKBm<8tp
LpkAay DIeDjA$X@HNGwpETdaliFquVSd#=CdpSkyMlPSAB%\B9ViVNml+u:GdIeSdnL9*IMR5+&#PLyPw>PGRJ
4A+!y& tT\uCj!F#kBnaD&J=BuXe>4%CK1<dl$V:IT>+/Ye5kXS6M<A*\Yy@JKpQCayt?F@WEjG<?n\#ieT?A8%
%9u%b1 VGKqAD1?WuMVHS?ZEc^dHQTuQ6JMXQ^eC89VTl/c=\85+\u%b/hcTnW<u@LjZ<q1MA5yqEBl/Z<Kwa$M
<ab^u* /!GASy@A=+#YEj6XSD?YCN+Y:CZ=L?9pkPJ9VBptR!KuKZAMyA?lRD8e^F9yn:CVLA\$XG8=VjI*dM&S
m4Gttb EHyyE!$jy@QVY8/pY1+p&\A>@+JPIMRJ:Cl%?I&n==&n%K$?F$&Zn==ZlcLdE:h/4mRwW>TcdDJu@BM?
ewbH/i Ap9+#aT?F<ip&:QVuGXMaw6alcDiWeIhC$ARpt=8uJ#IL@DeJd?BD!S8l<k6GCDJ>b>\iA4J>pTtM=IP
A86=dW KIlWT+nF5k\iR?6!^hcpVpJhT:m:yb$\T!eS?CB^ZXE=$jKV^$NTycMd@PRVW+pAt*W::>al*X?&w4c^
&YY8Xc w+/?AadTEbJ+hKm#AC^y>RR=kG4NM!kkqq<FcZDeZ$##Y!Q#6iue!#S4wXh/FnS!kmdbw8T&YK%u6A:$
$pDYWH Th^lGyAJeXiqp^#lkIh18n=lKq>aSdbbmD=MNbh+qYH?%!d@FZ=t+nku!y\9cPTt=<Qi5&h>QcEVLHd\
-Aa>iA 0006423cd5b001202b3 Page 220 of binaries1.zip
NN^5jp HpF5S@I#qnPpH>RZ6H:4YISW@lX@CdW=qa1/\8e*ew#/b!%t/K%&T:XQ@AjJiRpynI=PC%IjCppuLFE%
9=ew5G $/$YQD9lJpklbhMWLK5!b\#N\y?c%1>Jhq^m#STKki#eT&$Sywk$q$YPJVL#pkIINS*=Ph9$TYk!R!li
*k:Rj% 8S%Ctm95?+V9TW:pyL#kEyMd5#BmthL=SCV^M^J?cujHbtFV5Gp#%TcbSQ^#8yyT<+ea$DDq5cj^Ghw:
LEjRbP K>k5dnX!CuSE4L!@IPZ>h5l<Y/eND!Z\pc@pL#!*YY9Y<nXdRMHI1hIyTVR^%AIGlta^$XcT!=6Vcw^R
jKei\? l!YiIkZ^Qh+T4d$&u8BuLPYeqjA#TiDQFE&656uEDZ:BIyd*F=D5j$F/?wL?MGBTSHT!KEt4@JYdN>??
uSPeK4 epQJ@>1%*p#5Z8hpdKcH#kS^Mnb!n1#wajuNCiW@J5mJ4=5wKIinIiFBVDD:XT9HJDwm8bw:ETL=N%P=
MuY8*\ y6GM1GpHH1>bALERJa%LejbWKVQJY/Z8#1Dw$Tm<MI&MMp<q8ywFiRMInCR9b^CM/8ija$eYtnt?YBl4
pE@6Wj p$<kiSiC?&8^mJFiDC9utEtGVt9uJbGk#G#lmn$Z%dK&b#eX8TLDWa\V4&pw%SmdRC+=^eSWGBjm<9un
Yhkb4y mJ1IEe?&b=XV^?haa@JXV19?=!$VBl:9tI1m:4^E+Am@$\DpmQ<C951h1XXhm@p\hJJIp!TiSC6JiCM#
IF!hcd ^*w+Mk5>IR1>!J\:jp?ApA<mVD$SmTBNHyApwPeTdGh^W#Dm8ASQ@*>uKcd1y<P8$lqTRW/Zt8cN1qPn
k<YeK& S*XP%iJ1^q8yKZ6p=Xl!ESNtb41PbuCYhu?9E4ip!8h?Nabk/RGYB$mYyk>+i#byBNH>q6Ei65n^%$pL
wW5R<B \@cyHYG*#*ZCXB*NmatLPBFhNG9Fc4P&wut6Ky&G<wnVb$ETJe&\FQuKyR<TREb?a64*p\lJABPK>Yiy
<b\958 Fmn+8bCn6&Jyw1wS?!1n@A^T@C5n?t15#Z4MtRVE^AahJ%>jtVj5mESaIFuce*b%L1I9Ze?B=pZc=%mT
p<L$ZL luC5JBc&l$!Ey=S^*94Q*Gcqu+d/jp?84/c+E*<c6&dc4Zb:y:$VEahXl/<@V/?\u86W1iTFuPaMQW5+
MLhATW ulES!q^JAu8?Z!G%CDuQtPH55>EdpA\LKVCYMmN!P+bR9V?S*Eb=ey@J^p\cGIyuEl*<GR!iKNJ@TY4+
Sac%T= pl%5#Ep:<Db>jt>ZwaMZ:F1%Fqa#>6!%1B4XMy:4KieNFyupDeTCp+kCby!Tw^mp:4n/9dBPPFb/KWLk
WRAw*t AiP6p+6taaYphmhIXCIYay8eRyll^u>E\1M+>?lV4%a4NGHEbaG?M?DyGb$%!Il9XyI!m?Be&JQAjpq/
h$u\1t QS*uJqiumGR=d+QMnhdAQ>XHL!pEbG8WtiQEei4dwZZ:?p1KlLk$$u!uu>!A/D\1&dG1qcw%Mti4bqe6
KwT?WS Xd%+9Y4Vu&^/#JFkG*:DhS!6kqBH^\&>k8>/Le?%uK:<PQC^8YM1y=E\u&VFVmZl4mXPJZJ!Pmhe\Ce<
qEyb!A \6c+ddBdiiMIK9e<5iVup1X@48LAY<pVLqcdn4l1C1Qpmmqj\NW#/X<?!aLlj5uwliaybMNTLy<6RlEq
X/k?y+ <QqTuAMSd$8<R!V1TH=wB4h:nImVG:NRW5B@l4CY@+dE?6@A5\!b5uD\n<M8!EZBDXLFHISaG%dj8p/G
&t:npu ZTNl+tHZuMa:u@!uQd/k5G#H<V#/#u16XcQQl1?<DJq@PLqPW#y@qElX6QTXXc4wRM4tiGk5%^!jc!eh
Dl\4p5 6pd6m=Gk+S>MWS>>+\GSSl=BVbPi$ayqIWBH9m4K#LDN!8*#mBNdnI\p$N:aQJpK5mV8thP#e5b>1%DS
c+9@dn MK<auqTTp+yLJ=ADB&hmun+Y+9Iq9a^Q4htJ&yBAQXl/N?H=>KR8+JjhuIP#1XAEN&hDTc9&hXLWCmpy
wpb$=h &d=D!q4:=JQ/J*YZMa/pPNh\pFemM/VQL8j#^q:Y4VwWw#BeuynT$wRHp>*#%X>qm9aantdt>dw#l9ei
Bp$eXN 6<?KX8ydI/&k/1mwM!1BN%N%RCqZeGqWbtdPieM5MqSD:dSl+/>M1<AbhB*Pm/ebVRR/aKe^w:PpR1$n
XC\&l: qyi\c@4jIw#6LS=Qp$<C8<>E8ItZJjW&#NbaA<GIZSGAQI5u8HJB%R1AAZwuH&VM1iy4FhdZY9WCjcl@
5eL96G <5+unV4lwpjm^FkwXd6AeuhakYyX8VQRWqjinP5^iVqbQmdwIj@8epW!^@c$N/1V=ld$LRYDdN\16w?E
RKEcC/ Wj/BPn^:qQInDw5/SJ:Y<Z^ZCA=5SJ^um6tM9mLmm*SEtWMPw4MC6$b9cM+Y$1S+TT/DSn1?/WwiLZpd
MX%dl* YPFW1Ru^dyW^p@!5bDnw@=B*BTqQ*&TRqH<<tyDQaYIGWipc!htC!/4BbbHmE6LcXd#XBHCBDi@YQ*t*
\:tSAd ^TqwLie5=K!1=?n@c?Jh!>u^HD/K!DQeYSLCqDwnuZdK61bTL%!&Rt:M+hVk4AlcPFXIqNTm!LM6!SKR
^pD@9/ W4/PP/YVJ!#4\/PkaNMyN/6XW8#VmDlL^WViE:$Gp\hTKQM$FN9WZB:j4lLjXCdFQyh\\9VN1pkXReJy
D6S%Wi +6I5@iAiDAVykFF!%+W4^1q:$cF%Yk5@bV$lD1A==1!YDlqmYKFLZF>XM/T&ajX4e=A/CdIK=ca9Gy@W
Di4uM# **&*npRGSJwnmh6EKh=!E6C8Pa\ten*y%@#YZ1P%6%jc<@j<Fy&Da@>Tq!/B:4>!8H^FFJy9H1JYHlT4
6bRCZ* %Xc6amTJRbAFSeG>bFJI!ERtw5NP$c9SW@PIbWZq&XJb=C\*D#FZ4GR+F%mRClVekB1cMbR%<$>I9#m=
$QQLhH q>dyTWbXbD+t*SaCyLP!EelD6yVk<qmuBc!JbLXw?^D6B<LSpdFKM4FS!X1b+*CkAlydBWJH%R4?1uwB
9LKPMt cq/y%euujXL*SL=udSE48$e?Cjy@!juS?$tu=nec@n8:8+&>*h*Y!eb8jc?BQ@mic>8jAV!e=KawhCK+
l<RE+K 9K>cJ!BuXthS/A^JPt!ha/VY>\+TJHTihNSl9uPIS#bw&l=QRPh5dBb&4nIFSknV%NWyu$G5y9C\IkZ*
LYJ?I> 8ylKS<1qSHh^*$*eFKWlEuGQE@TIm+#SpG>+LPmPn6&BStp&EWmS^cellQ%QJ*ChWD=!E#hC^twAL/u$
SEedeD !VuACH%h1iI9KTD:bL:^#45NAS4YZb5Bl!VN5KN1GS9HRGBic>Rd8!V5?6=iuiR>8>emWhj*Yw%*G48S
%n>qJH H>6h%NR=?p=H+Dy$tGc\#B$SPlVecI>c<THml\5pb<uAR6+5c@:RKZb1FI8=#cw:Ly<A1T%tha=\yNX/
Jj4hA9 Lpt4MH/dA6^qMRB>mW!aubLeQp:ATp@klDZBEuJ6/j%:CRtZHKhuE8+*bky%?llqyje8Tbha!Eelt<CI
*69%+1 qX#uB:>Z5qeeLWwHt59aQejM8Rwhy*<pECG=p^du1kCRabWIaLWK#dbDkE1nWXi:=ZhI\H8:4d*/d86e
c6tV\1 a:hFZ#X&jjye*/$*ACep>BpRR=*wSnqeDkWW>Xi+9ceHT>&yI$ZLkw>cJ?86nm=5ie:XeYYSi?iRDpB%
lpk=^N nMNTJ!BcRp?&TdlmqcTiSY=&+C/H1Q4y/4w&Pww!b&SJcVNy*e1M#twP<iSTqeh:mFwSDT:yQcTWQWSt
kQC8Ay 65kqewZpcpZ>m61ZJ9h\1MpaqLNbuMBc!EpWI@GiETGldX?IKJyu9pEpbX\>k@NkIAGCE<ARYKncd>mM
b+\dMM K>Y1PFSMIKu^ChZaIQCN8?<$*9F*>*dyCHd*@F%#h$@6u5FSNHad@1+QI\Dk&CFu^mXVm^8qWXIk>/yX
i/cl:N p1nFJjYQJL5#cJ*D/ZV$6R<e=^M<XKj+lP&A*uAMhA4\wqH=FFSVZ\EBhVn5$G=W$lCA>hqCiyG9KW5c
n^6m:t JZiQHWXaKj?/>16TtR51+By\/=cTT:q*P*e5XbAe^C6emB4t9%D/i8Q#FJm8NG5C<!SQT$^kD5Gm^uKL
pyqH>G R=6*/*6%CF^TR\SA+!w5kN:y<%qIj@jhZdIAkltTQu*#*nj4Qn$k>69?L8^k6\H#1P@=HIq#/GkDi$bP
L&Aq^P Hy1QA#klB<D++>TX*MeNY*G>/LRPFPD?MP4MpiV=EQSuPwV!p\=bkp%ByG8Dp&YSck#b8jau:J\#4XET
LwuKkd QCa*!p^mJ4htZHYN^?iXHH?iKy:q^FAY*D^E\e8$lLZ<=<4VF+:<%pe<u<%pePEbciAjVNI<6wNMEh+N
5Q>W+w p8q9A<9uE8&u<Pjh*WcN+akmJLIQATlH+mQJ%6WIu\nb*!FJA+JI+YEE8>@Gl#*S@^bBES$F1V@=kadj
19luM: $yG@8F5WmBZa^:cRm!9LEdASnJPVGiP9/e8A\<&\p#8A@KNPFpeRh8JPhy$MkCIMYEBYq:=^cR6TTHAD
<e%^Sc R$pLF?RITwu?q+1lkH>8K6#p6%eAIK*:a?65GmDB49l8CJy@ecwII:&l5cdnw%hemajeE5u@^!Eh+?jY
8<+:Xp JjtGqXw6\Z:PndBw:byGj4D&8u4*L:?#%+BBMECB%M\q:FIkCND#L6FMCJ*$9\Z^R@94@1W/uAF+Vk6<
ne?aB& l%Cy^Z>Qj4m^=*E8XXjFp^HW?R^chWuhwb=qS5l<9c>LnTI?An1Xhwi5aNSSB<ZPAV*wID41Th\=@cRV
wMj5dt EMPpS*ZqG14H>b&H9kSF=BS1W+DjNQp?cK=kyqj?PmPXBQ@5KuPM@:<EBSJVGDD<wL^j$<9ShI^/b4yM
jGJC4n Xy@IT!bmKyM^/RD?Re\?8M5?RCwJ!4dHtJIZTl=Y#Vt!ln^:AQwH1@+85IjPkFpPIbP19muPAMpDdRWN
:EY!ey ?Pl*Yi=:>ZB*ltk<Ij:8A9RiF6HcFS5kF44Z<GEDhCk6LmnwE5nM6EV:B+R$PSb:D%JuCySnQFJPdy<E
u$e/5e jcA/tRAjT!^/?9DpIP1RM@C1h6N8anB+?TVHWd1$1/Bb$Fm49ylARSIE^e\\9dB@BXqZIG58Jl@J#h$5
wuCM&1 DyDXucB1uF/bHXN&4jCcaQc=Qm+QI+HHVhB?^BtaG@m/PVhlQEt$/pl8pLZj?iRVwAqJjA+Ph$=X<*PE
C11tM+ ?<^B/h&5XqT6?Mp:u>R@cbCW^*5bE1@c#dG&j$6$u?ltw$XR+<MA?A6/I@V^yabn=JV4ttK&IPIVPpWk
M?AWED \D>&Mt\Vbcp%+8PIuAKJQinRR=Htt=&D5DMnB>CbwZjQd6cmc6p6q:N!R%tMPDeDtZhDZeKdq&5Pbb/R
V?lNa5 K5i$lHGc@\@b:j+b9W6NSFamKnPVBFTEP8iu5<8Vh<tah1Z$X>hh\?NG4QNjJMt@JkH?1cwPRWH8TdTA
#8qF+y @=nj#=A19@6J+\Pjw1w=S@AiGp>iASEZB%hR><c:u?#idnDt%@im*RLWG?k@m$<N\TFj:b:%mj*kCEnn
8D>><p /V5dhh>NCGmBKch8DAldSba$nkA8aTC%:BD@&Ht6%RtiHHSa@CL#jj4m+ACGRLwjXK6NPwD1myIAAM4Q
4!EejJ 8m@KL5JHKatWXy<wTwJMDkAb!1pMh>iKTjVQ^RlMc<4%Ryw=iP*T+FmhcXw>m#>w6Gjll^D?@=mm$&hY
T@>R\^ 4W#<?\JVHV9FjZ91c\GTh?99:D=VKkl<Qy5=BL+%W9!#nE<ZmQAVJL%DaLN:i*e*&n8^P<H<9j1*kC5p
SQEl>? j!L@SHYk@@RZ:@LZlD9?ZkN=h*K/d>S%aM8?66XKLaD?45<GEDyFNkCH!ime1/Z@:?p>IQpjBP!F!Tdt
u$Fa:N <ViEQ$D?yw$4lXJck<RZPN*pDEB/RIPIj&c+%WX86=Y?^euyAFmA/EZFtH?q#TBK5tH5j\9\H<C+@9HL
bCJZjT i*$hB:=9quK1NKN9*CMe^J%aVPq#h8YY=TE>\P4Qn:Ac%p/LPaD&pEjh@cCnnyTKP><KQM@BQ%VEK%?\
-Ae@cn 000b4b08d53001202b3 Page 221 of binaries1.zip
IitByR tSpSNWJRt\kiJkDRJ>ljkCi8I=hDZQPyj&>@Q*n/6PX@+IMNWYlM:6kjPmXYj&:/W8^\C+I@AKCe48GR
#h=*na GuhaBJ&Iw+J#4QmBQkAeSLDj&Xih1QP/l\BklZ^9thM:JdpZMw6J$R@!:1n%K8kT/$ItqZ<pDElea<<!
mPB!PG \Z$!<=X=A1L=*yRSeQRFK!lK9n&yQyn:qhJq#8qA@GIHhFy$%8RMj1V4*Re/AmbHwG4j%G\!eRR%IWIe
%JXn/V ?Va?kXh6:c9\1ERB$K5aFRC&wpD+Rk$YMXPH1@mEnMCwD@jK5IMGGQ=8@b6<KI*di<?CjZYAuBkiS?yJ
$RF9V$ <BQ+kV*R$Fdp9J=akdViJS>\MGMPDMRR?Ky8+L^BMHRRBJ%%!J*E#+l$\IeSFQG%S@J91t4JbTNACBBq
II+cBh Bm#>W$q6B&:bTjwS<k>FqtNSw+@F\qhAuww%+kMI/RB\CCMeRwc>5q\QF>kZqE1=QnhLGNbauP<LXH4^
?ikLqe +c5MZ/>ptZd?t$u>=Fi5@ncH4VwJYiX<V$J=TK^ZGmVXh?8:V/h8c>YuS$FNu%MFuQ<VkBD!C&19wG&k
SBj1Sa wZc#i@SZ$X/^ASjkB\i1m&Tpmw<P>kMCykcBEIu>A96iJ=G+>4H$q<PybnTDBi?C?u!hd$><%9!J?PX^
F&Q\4q AQEd=JW94u9XqSyI$LX!k5FFuZcVM9cRn?I5CCedA4iQmR?i1tjw5RjwX8L=jGWin#:>pZQ8wc:a=$5T
&t:#cY mREW@Z?+Qm+pHlq@lQIZ5\KBML<bbp>$D9>Ca>A94c^NRK=1*$/aD!5@W$yHb^n1BEH9pA6>kw8k\=NT
J?Lj#L hlkHFA$V@Thc!8qqe6V9NCnKk9nH=Au&tPH9k9!$59VSJ#EG/8lm&ptKpm<e^>GVy^<Amu!j>h>X>bQJ
CeD=Ta pZDwSTelJCk9FbbTG&tRc*nDDiRWAu$PB?p=BHp?ILKA5+SF6y$akdRYFAdcC=^BmyqLV1TKnDFm&kbR
%lS+q= 9YkNK1hb?lW=BD!GFaWLRKuXKZI^YVc=Vy%C@=j$c\pDyh=1lD1KEwV@4\5Ja@4eMq*Th>P8Tp=N%J>I
DCBQiw VyL!wYm199hM/h5+9mMml1h1b@SlNVniBh%lbheiAM:a4P<S=>q66dm<\w?T+tmCH5Kkd^$!Bn&FG&/=
PT>ZcR LHqT<Fccb!c=E@\QuBMX+cqPey6FD1CkP*ucKnlQRn=8BAG?LPG4he?8NqhW>jTK8IF5$6eW/hl4dL+8
D+lByw dZ5TAb6!*%KT&C8=6^wtb\D<tTZSy&e\+KREdCHt=B*KNTL6EX=P>aTm9#Kj%RZj8P%q1pX?8J%e8Z^y
6NIa#B @Rd^IW:TX/5%?^kheyII8Mc88L:*NPJd8?n\/$ewA!Q+6#pCllFRKQDP4l\A\hFk4!VukaV#Gbe#dbYK
bPecJ& ViCl=C\X8kc+CpAh9W+PAh/+=ZC/wc+QweXRhFyL*NK>Db!uHp?%JEQjk*<j4K5kR*=+HPVaIb#m<@C1
Jpa6jS VcSFt!:1TbQiaep>n<#V+k8$D\bS#ZC9B1lRPNYywa>lCGhRWjMbPwBwjpbd^cnC%i5JKPFTkKGGj$=j
$MdYn\ h/N>WT/u/WCV<^=e$FHG4jm@mjXXC<:CSBCe^$X6nYM5MwiR+wHjEBjBN6Ha@iDkW!uNE\EGuKNnV+&d
y>cTnP tMauDdcHiDhPZRK<k+?M1P>Y*yAPJmpBhAuPpd#WqRQSpWHHai*:hd?quRPjmQR=kaBC:Kip>>uTDV*p
bMa+TQ u$<p9Y&&+\V4aSC9G@>iBTj&/RlCdSjBQJ%SJ%muAJq#yHb=alab&MXW5^?Ln@+?!lS$+:DeDa#pD18u
DL&G+! 1itI:TLTB=Ln+^nDMCw+n%CIp6\P$P@1$nq<Xm:Kd&W?qP>!dVHbA&=njn@YIjkZ%q>1T9&d$B>NmuT$
^hlY$y #KbS^^WM8h%uWhI#ndiAeE!juMYe/S*6E@AkakVd1Q8:8&RNeiYEqCDKjbhNAuddmGwQ5#nW<hHyJ@DS
bt^!MP HAh\ib!nCQR9yE&E89mP?/t+^#dQiY\*DI4pEhk%:K9AIJ9I\p9E\RqCKk>md%dJJ/nTdMJNpa#8t8ip
dQQu*: k%6!FYpHRnTyTlwp/hDSqBYM=\8MTe!S&A^RVplBGnE8M<:EZQj%^%\&\:<NlTe=99LqewX@A6IWe!5W
1KqI#V :qDmc4p&mahDJpIeeX$Sci@8HV^Qm*$QQ%XiXY:AdMq>Ik+RRe<pCTC!kc^L8u=YEt^!$!Xje??i/:X\
Dj?<9c b*mPMAkFlW@491M99hL\T#q#8k=HF>?LK#mXVEjACdnBilSE/&PYhckCM\4m+DX+B=emaq!b*p#MH#kV
I1%=C1 VyybI:Pa>9GynPRKTHyyI9wXwwBlbWc:*>G<IbIuH=!9yHwiq$:R8ZFuN:8QQ$XHb:dEHb$lk8Wmjm^e
uRw=6H A5HNQ=b/#=mL+j/!X$&VRQyGWZ?qcSAJqYT@%*1Y6F#\lZcAC%$Vh+%^a+a+/48*h?6SI9dhIWN@w<WF
H5Tcej iii+<F9WuG?>dAtya6eMIuXak8ADBy8ZY6+Z>C\PceSQV\=TL&uFh!1p/Jq%mN*ay*j/uNpQ!CGDDc%D
F=e6&y +p%Eab4*pGALPkIiT?+lw$iW1GIy/dRyJ&Zh$+=*YMt^hu<FeKG9ItI?cTaC^+YYECtq#@$e5$@awai+
MCS^H# /tF<n+BZJQQ@?$^K??X!Fltia144ITj>I@1:Mt9/Z8PDA$XP6mD!:um1hp/8iuEk:&4PR=IP><:YE*#b
$LG5Pa R%Sda$!a%jupbBwB+*Jcn*QK>R?mJ+hH??S8wie!*iP!:9Y$WqYZKTLeMi5pPIMGR%H&IiVjkcKjJLkl
Va#uiX tiQc1%1Fu!$L=YhpWWuNZtl!F>/p\ctanTdyuq+m:<K<ByT?F9t+Im&u+%V5DN*<5jVu=WK&uMZAA<!L
BQB<9! RRWc:KkpKR#I9bDEY!?6*$k9!@X%mbPRuFwT=yJk*>%6:V&VWlt8>#\/>B\eYMXPW@!T9>?VLH/jWZ*Q
aD6Y*@ pa4T4ISMJ*Zu8Q/kYLGH!PPkE8ikXi@^be5%VT!qF%uZ5E1N9&+eh^LdAeRRqpj4I%d:MFDBtZXIHji?
k>Kp%a >Lkth!&KT?@HuP6<Vil><hnWE/*wtl?Y?!L&WTW96QI45B4?p6\1+H\1:<t6<%4ZT=?YDV1?9N^8Iw>6
%HE!d$ Jt%uMe1md?5KqK?5$*\4Y=$piMBuXQYMeEbtM/*hD#yHHF$JIi^+e1FwpdL99wMRaFewQ1u:GYH+LR1&
J>4kGV @KRXFRH1nJb+yEeh>DqyJ4uqH9@h&+q?P!Jq*iWCJc<pudPJnqheH#4NYl/D#WDH%\QQdnbBCcw*Imt\
TyHVNA =R#PyEN8LtPtR!H$ycJKWn1G9qNM:uSHFZP?<6q<61JS^W#::nlk=bI$pJ:QyW=I6>5WS&bYXB\nTcTC
^nwyT5 ?q<It56%mtpVX9^NJ\H^tm=htNJ:BuTm/MG4TcM8IW!Nm/L+P^8::#TpbCVl<u9%EaJciEiBZ!htqi/#
Rl51yK Gw9EPWuGZDH^t\pGYWq>5c/@p#I1P/pZVqZe<hbJ/6G/GbAuNWnV!ajmGNc4+I5p?lYEMe!l$S<Q1cNX
hR1NGM %b!YPM?mm8R1TuBed1=GqT#W?6N=E?KPhjCppp:HW&DqWlNSSF*uX?YVyPRR8l=%\<%/\6p^KEuPp^V>
@AY85F FwQTX>aJ8ajXck=<H=PYZ^E6S>pImjPyT6I+iHT+1BKqj1m@*N%>b*hAdCZcP=WC?t=L\MP5eL#Dp%n/
P1bABc Y6yn1ji4T*+5hF+@Nk#Lp9aMKa/QmG8i%+=Wn!*TmPIBWIkp69EbTB/9^$Hiw&kJyXPuX$4J>SYu!\1T
ShwVTq 6ntud/^K8w&utJZdQ+tYJ5!e%F5SY@qC\:m1lQ1tL/q6lYC#aiqXPe?m#9KACK+pLpSVdc#T$tqkWJlP
L!B4>d e*a^LcZ&ZYeK!J*n$T18SbAV&*8ty$6Fl*pC<yyD^9Gck>yK*Id5VpqciGNyh<>*^PMy=+@q#l9/uNPy
YVRCtu 5FPY>wEmaHyB*^Re$dPJ=J@pu%*T=nX@*cQHpLR=DKJA4b6XEt#Y5/54iLW/Pb>W@bWESI9p#SS1y/DK
$JNWPu cqLVphanDBNhq4^aSa?h$9BB#I<n#Jl414KM%1Q!1bJemJXKTT+kaq+w*nI4%Vww@?MC/yhY#wW<FVGT
jXP6?R RyKdHNY!pyd<H9G>h*bJbb>Giy\S9ZNVGFT/!y@18*9EWakJR1Xu6bmJEVL4b1^?=SnMQMbAcq*uEiqp
#\F?8/ %/tKVMBJG4TWH9AW<y!e%=L&iu%%L61<:kZ?iN*\R+kb8aCa9nkdiEkA4JCLhK?X6MCqbll#bAytM5EP
1wHpkP Bh1\hSdSyC?%K@TdhQuuRA:6FMMEN9k!MF@R<ip5=:9K$Pa5ynlqJ@BSTNyaM$k5eIq^DHcT\FVQInIh
lT<=9B %j=tWtw&aTpJS?FWF/FIK@k$maAk>@Yc&@BetdLkV%?DJI@SZtb*4!YREZMC*SuXe=^m/iGQR9>+VwVM
G9pi+C C*L$<BZI?/X%WjehTpp*K#%n8Ri5b8XY\c\j?P9?Pl%AP\m?F5BV4u54HPbZ1=/6d/GpuQXCtuHlG\>?
>##++e K$4CbTV68GuhS!l1@q\wCZ%FETd4\HRNVy^=1!nbS=:tNqH^6IJ=dGaq@GHNHpH8LTE@4/!eJ%w?4Bu$
ZLAI@u #5pYw8WND6#48+VZ/9A%EVX46=a#wRi<+%hy\uG9yhkBGuZ$FKn/KbeVJ#1^!BCNt!PhQqGeLJG1M?m9
NJISkK ak=t@>J/T#jWc+!8mFcVY4Pe9ZaWFPl#5P+Hkhpt=V+Q=Td%Z1qXX?\p85RpQF\^YaXMWy&N6!^Gkyuq
AdjYdN $4FBKkLX4N=@#pGqImKTet*W6=:pFpK686B^EVZkP8IJHBuh+eX=^WnmHhSjpyV@eVH6AS^aZN*$N?&p
PhKEKT DF:T6=y=e=kJ#kFTh\>M<Hp!n!=\QK@BdRiPX@Pbhj?/i986Adyn*L1TG4%nSRTP*GPV59PMmMV=ejMm
4PNE<V XQ^#/+1MM:TVhnI?A>hqtc>@CFmll^hA9>eD@\*=A&hTctDihyJcB?mi$hhLW:Z^^XDQ8k6FN9*nnPSQ
:htj&Z tRJY\1u4QRcNEGSdHG%&#NMjIjymNm$YS=cMwc5pmMKc@jjT&pEDniRPKjTI8eld%TTBCQ4ZT5lIe1*$
ZVL:be ZHqGuh:h!C9k*lwP<SXVQ6F9l%PA1y+l5TdVyqVTcFDuakGw@>A=p</=$tLt/a%G=dq%Pc*qVX4NLMm+
4Ye6c4 LeyNpmZ$\Bj+Kma?Eu6#Npt=/XShP$%XmY:uSd\SLya=\k>L$dTjLCVhB&Pw>y<qjnKcp4E1jTjyYhLn
8#XS@u <LlaR#L%&ZVpKZPS@ITKkMFuMLHp>!L?W>@/98N^ucw8^W5@y5mNEPbhZMM>?%RQDMFE6KNAiYZj$!$%
&ynD^B 91<+Y*6!Y4hd8:nSc*#APWBX#$6y$yBup5!mWmDJXQW%1CVDc!DhQ:dtdD%mL^*%WXHiieKVhi>DD^nm
8d1Y^S A:JJ1d$kKQn<&Y81/mpE<q/m%ID5p*4wq&/anWkbS:@G><a/WjJujE<cmyhMG<TE=SkFqVpnbej<pLq6
nuYZTu GS&$S5uhlMaR:1@BdJLCbQmYkX+/%N=SDJtln?Qc6%K>%wYQLd=iTBwLQ!YI>D%jidP8=*wEH!%<V=iE
HGW9j& uY>^lY1aNMu1tq<y9Pm!SGeqiyhYWaWJNyYjM^H=41:C6YWmp8$&IV=9uV/6VRVd>kM#cEZ4F##mSMA=
XiX=/$ R8ppBelXiDJ<XeNE!Dciajal1d>?\9eG$PI@FS+>BSTS?EAJQ:?S6IW#J=<MpeH>Kw<jldp\Vk!%ZF$>
YA\kae @8J:#QTp6DVX*<bWAlD>GRVNi&+WHb==up\aIpX!jhj*IF#Vd/t>N*iQkVNZu!In>dVF^X*D%lepaVey
6LHpEQ 4RmVi\SNK!R/@FL1Eu1/=Pwd<4h$Au:Va=lwp8c8?@+cyA&NZZ?h=P&S>uyXiEKQNXe1R%Hn&?Xyj:yN
-A8@j# 000f7caa264001202b3 Page 222 of binaries1.zip
t*9cn1 GSLYa+#TqLcb58p@+u!&$yeHw!V6\ZNj^8be+hke=CJ*SlN&nCdkIQaR+hB+y6F@ZbkM4WV4C@F?hHGE
\@jMp! SDZGBMpZ$#6Pnn=cX<Luey&nW!C8y*#VI#!P@iLi:d$QhLKyICLijjc!bdTNqtyupXEcAJSSqk5Wq9!V
4@5YLS dqdm9NIZTcP8#C:+4y%M&:F=IJAL^jZeD?pn!Vd\BbDJ:=&DaNel*BZewnqNt=56MpP#uLk+k56ZmeZ1
cnWw$S HB:K=ll+@?lZZX8WNwTjV8wiE/tGtSQe<MRFAl!XcHe=yPmXHN9j=<c<99XNY&e1hDbWw&*DTbk#ci8:
I?<c=: cuit5ji?8Z^+FHHLTkYNt<ABQEluY::@kZ>:n!KV<lVk14%5jc>N5k#dw*ct%Y/n*N#EdG\W=WK5XnLH
VVlN9V paie\Q^jehwqTy8GeaQ*hRFdl=VXbbWq*Y*:Ca5L9Qb4ARBmniL5YlQb8>1K*JEnqeV%KaYpKl&$&CBw
EW/N/$ MHNJNc+ka!FyBElkq>EB>#FV\B6^<!j5Z<^A#+kNyTaW>ck#Py$ZVWThbh%>l:FlkJpb6RI:6?yEe$*p
c<AkHI N::iAGNDYZ@>mnp+jC/hYBk:CWtVkIqMMDLeXl>pIh%Zi#uWucMJ9DXwD%q*S^C\K#i<MlbY5#CMAp6G
D$*=u/ i1S?@aWWj$VYGTJ5dlM/8>+pX$dtV@nn=b6Equ&@58/VcCZ51>bYcm6&M9uYKA#NGR+<T1SiPR+ZCHHL
JEnM6k MF+JB\kNiqDeI<aC:ecG$%CRGYPi5TtVGw5!n!:D\:^%Ym:XYkY6@aiF!h!Xc!+uR1WdXEI<A6i$<N^B
+S=ABw RkLZla&YcX:ykCZMRcS^B&EYZmIy4^j=<RhGK>!#ywpCW1Q*9twQBA9C%t8MBZYhkp=T>^D4C$qd!TTL
cuaYAM yJLQ$lmF<SWXPLw51Y+#>LLAZPYZtJX=RN5LLR>@<Jw%ZCJC9FtJ:FVT&1Ylqw5aXCtQkDn6L8Ljp1R@
cj&N^A ^+K/?@QpBnVtytQH+tI8I@PN5=JjLYe+@/Rd^kw5@&^yRlRK+mhIej>1yEqc&Wa9J^4T$DF8i1T!yI<E
eV#d\9 \5IYh6@lLyVh?p*/pV8J?1L4tCRNl4@iAqL+6=@i@wAS6<jI8:9dd8@$&>th>5=P6DN5t^B*lmP<Te1j
G+4kEm $@k9hDXAl5jnyKcLRd<K9cRPKVBld6VMA+@Yjik9@ZuhN@$k>E/:8L<mdQBYJGW^MI9J=BiCBGm8mFcC
*i!HCn =qjJ=Ruy:kEV5LFwLl6RZnLHIZ1N8K8WR@G?ti>yyB&L5b5XWh1@t>QP<d1u:\GbG:lJSnqN6=EE*$HM
=\Sck+ %tlhwb<</JDKuyP=?KR4d5C8BK#TX$<#Q8+HV^@V&pd4aL^n6Ij$H8>pMcBp^NJ5%Rh<#/hn+bhJi$A/
k=bhea XZtK/*NjN#NiC$yL*4J=tpNtkAC\kS!ceF=eqeCFpi>\T#KNGTq:*FEdtXC!B=n6NJpMthT@>pXXn?DN
y#$qbb kLCTPw/TJq6Mq<\CE\de\M6NLh&yhI?TDCbH^TVmCCL?/*Gm8nE#A<MbEdm1&w%GLTpFSB<d1qSdnS9I
n^Mc6K 9%/J$q=Z96+H#TSN>j!kyb:P*Jdd\MFiHmtk9chj:w^&#QbPmDbb4tkT6+Y<ymB5L?uhV?1%yQB*Mk:n
!Ih!X? JT61umK\y88FVWX5lBChBG!$en:aq@K?dni=%yYDlR!d1G=dqn/TLKm<waX/LQV6m/Im+#ATSa*L/Wk^
@=5N*q V4dup?F^ZDjPWSn1yFTm4Z$NJGV!Q$k85<j544:4Xt6p?:au884Y/9m1KtmLLD68p&=j^Y&YGbLGZ8YI
#=IwMW DJE>l/ARK4$>c#%>P4un$!qm?6D?emje!bD%l?$CkT&ZT\/eRuKn%E6H&PGK:c6pu5BZ<4wh^Rwci%uZ
&lA@#: Z!iQNRPCRN:49I@Q>Aa*T%bja/M9>5&V8m?YE!/Jipy\MPBASKkY1?e#=CjNmqn?kHEW/aEC5+y5n/61
kLwcdc 4ILJ\/RKTRw8m<1ZtZT?F1MIK/knbSqD1<S><il1JQ?jR+N*R>ZPie\ITEiBw8mkebFlM$5*P#In:Kmn
E&S9Hk ?ALuhB6w?9Vb5/j%=AK9&JDYNQ@iq#6DKGqETl4ZPTuGR<*+k5:8VdiP@uJTp5k=aMAtKibKp@S!F1VP
DIb+y: Behc<@\5jW&ciSIl:AwMcWYGalcTnR:/W8*q>BkPCJFD4N&$htk</cCZSq1iPSGctb+MjR*NQIypmu\Q
FGa<A% B?:R$=RMC9uZMu\?n5QDut&wHkb8C*V/DnjF$#?%h6@lb8^G@WcJTb1=y8?HD6iHmMl>*EC&%dQ#V%qu
^NW$i9 yeFnn^AB8BCFZ+tNR*\G$j/TZP@IhA9tj*<&WV</YL8tTQPMFWW!!^BBE&5&jVLw5XetJq16icS:dpqq
=Y@Rki VtpcDt1DF^tT9BK6P#eb*MYQichT4>TQ=uQ%ijy/hn/hiY9bI^/>i%G*kJk!yJ5iQd\Z<jlP5ZRXM:5u
i6Dwic mD9S\L?SFGPFFyhWPaTTHmbtlPVNG&mVPcNXpJ\=MwQ?Dd+&LT>*hH%R5N+N!J81b!jcV/Z@uRQWcDiH
RXEtWD $JR58W@CW?^\PNdZN#k<j&6/G8E9Ju%\L?ta!ZG9pLyFVeNXZ5+u5!Y8bQl\&1S%=LMhmpS9AMeGTY<:
yX9jk5 N>S%J#wZaYRj\T8=k!+WL=w9%Pj^tK?@tm@mE>:1a!JHGc/AKI1L+@<yI1F?q*@1h\lui@yS?I/tZ5W4
cDFH<& ^XLyc9qcM4ZHSCIhtWHS!15<LwiiIacNiKKYd5PSNuj/1k/6SJiRm$=JNCkZS^&lSy$knALn*mCIuy&h
a8iHp> RCQ*6bB&?kiyQWi5pDN!j/QHi4<wF*X!9m^#QHYh#T9phJy+n:&VbM4EeTqkI1G&TE5S@141dA$Dh/w4
>RS<K6 uI?VBScwXWQ1mFQcL^IE5!Q4jCWy16QcTR@T#<H<4AlaBB9PG@Xwjpd@%T^yeK1&I?6T&cdHNhLM1/W4
&JQCR\ yKKFayHEY!RBF%uM*!:md$uG1DLB6>yybS#Vy*?RV\bKta/L?aNX*P^Ad\5NHnBTdbIc%>Z8SdJpEl@u
%/:dAH lNni44SFe=NT+9%lwP:NQBQpXH5q:8CqQ#TijpG/1%nP5mPCd^GMlQDy>4<aJZ:/KmRL1i6Tt%jp%wqj
E$b4pE RwZNFWIDw$XiuZX+:J&mmKtJhFWNKk^^T+q5M5TI8@%QH88%6WQ4uDS^Y=Xn1KBTCZ@F<5b:qk/ke4:P
45l8JE *?FIi5LlLRkWVpP^F*Ad>B%/FK>p45m:j8A+TtY:LMP<:EG1&Q</lqwVF4kwE5BFAbK14M5iq\iTu6jl
M=mc@$ 1NAI%QB9THXFuMuj:QB5y$/ByS$F?/Mk8ueGk^wEc@pVtpc@&Bp\W5BLqcTADRnaF=lNBe$y$/!E:Q$W
:C1iu? $*yI@lBYlKVkSSj=B%L9ytLpJjW?!RNK!XWS?JKGD?tJqYTqqq^EC6>FDVHuq<n?L:C\K8u<Vm*8?ZqX
+XGXyw n$uG+j!dY5%VhW<?!L5Fm$k4F&*?tTel&G9qMwS<6ZlFFiM4Z!6itZ/\PX!:^9y8Za9+Hua!uwCP+X?q
>kSF*T p#ew*51#%!NCt&iRweB4waw/B/iG5T?E%jVBuY4lL9JbnD5#??nn&i?Mk@M@8Zj9Kd1wMeEB*i4wY9R@
\/%:M@ pKPIYma!mHpJ?&S*Sp?tQ=ctN=dSWW\Pkw:LcVc4R&m<H+F<EY%\!R>ckHBEBm5+l^5<JumYTbL5iiGi
p65HRD FG\SEeP?N5KmC4uiPHaCDw8*#8iRF+tL$y?ePkF/jI&6I$We\pmdLaB?NLtG$mtT>JXTI9e4SZZqbPuK
y6\u5\ %iJX?89V?Bbdci<Bk5:?p5*kka\$?b+NA<CN6+#iB<R*HA^M5$GL*ea:$G5k9KQHY<+TpK+SB*/CNm4X
S9!wYy KcPXeF<5R8&jiTahnjT@9LQHNWG:Q5AuynPI/#E1C!W>QpmYma\Te$kK@XSGSl\^CA*V+^labcj=k!by
/DMVQy Q%u6Cy&HK>Aji51dc&JGclN8m4Dw1q^DIGQIt!=C9iKqMn*1u!W+Gbiu^&HXeSw=q48cn?89HVeJnW=!
D6H+=B b4m*bc&1kphbD8j*4qp+p&9pDBl?44BQ\NhZ?JDw1^6Z:Y5&HWyb&VqLnKukYFN&<d@tp1F?tQZqeREF
SMnwHH 9y^F44LY<BD4NXFGt\QHc/nhGS>6W&m4iaPH/c@DNDwh%iE?<\Pe!$FAS*Q&*l+*?NL@l1b1yN4*wm@b
Z+WH!L QnDPN=VqRitA5kGhT#u6S<h%!/\WQHE1SSam/FHe=%$eChGeH>BuMlE/GGI<BFaGM6JE4>qWWPlS>c+p
lyli/k F^B$Q1w+p$q\K=<E:P#t4%p5G>t$J^%qliS&N1\d<&M!tZPJl/=QnKW?H>dN?Zye##y<\=kFbCu:JI+G
nZ1@>! d!WLjqyhQa<V\hFe8WFj*JDHNY65^>cMdiq#!hpy8j^ZYSuY@V$Hu1JK^tLLFVM>+DYc=E:InBy::&Bw
@@Qq#5 V/6Sh!%MLpDZjq!MT*Nq6*QW+Rp\*Q#M@e<XA1:>k/i6yBYdT#HwV%<RLaL*RBJ=l5%FL\<cTXt<lL^I
>YRl6@ HA^+KuhScmFt$8G8Bi>/p<9jtMDZR1@AKYY!q>k:nSBTVMX8%wm#<TwwGN&aRW8lSS&kJWjAJ+AYDXVh
8!FSZ% %PwPAWP>:k#1b:T$y^?1u5XjDi5q?md/Z4\y=^L>#+A4hpJpG@c%$!V4$!J^ihMjR995NRE&@i%!P#tC
GSP1@^ @Q<=*$QNew18!bQ:8b!<yl19$><%&YjWiT\abmh=ZDLGW@18qZLq51ew95V+I^mFa9pHB>H?\V=JuN$F
=8tdl= \m1+nD4dR$#CN?86CHXHVP:%J5GpHCnD&\J:ZH?qTW=Yd@$dpLh6N1?^?PpRHKKqYNpG/e6q?VjR:</P
#NLjt= k:TwtJpEV5XmM6lX@iymkXP&LNlBP1bGd=F#m56EG9Y/9H*TJbMkSJ1Q/H%a#*&C9+$Eua4+Q&^/5+d&
aF5<L! GbK?hi*G6S6V$l@jMP&4a#6d6i&1GA1PT%e%5P:@$\\@m<8&T\y9w&dd$jWXu1SKyLN8N/tLc:k<S/+m
ByGYWy !WP<yLLN$%@WwVy<elk>mV5bR1dwaP+yy$nR@P94N4\9Yjhnbp+#iqn$cDK&L!>w^BQp>SSHA9wwa=ap
@BMi=$ h&TyJE$&//^eB!lXAWtSX/nBX&DWk<e^4ViLaL<J/u1V+*$bbIwCPqpAhqcDt%BNEkpbRY*Ew:hI8=%8
X4<9Eq Qj58!X*XM?IL?H%aN>+hEjdMeA%Q4V=$5uSm%ek&4JF>u8S8Z:X9<D5>@1b>E+?idbHpc*c!V&bCn:lC
PWIl&\ a$:Y5aCtc8@515dZMMdck:>8eM8w9>6w?HcbuWBG<eWCCiPT:ZbpXWDuMCLpiaKJC\Ci@R<wcQM^cAQP
<tbYKn ihh9AHAWSlH16J>iNVQmqtSw@DAhJwnauA6NyAM/N$y8L#JP<:y1u8KmY?dW=AMe<5&t+%t5@4m%I8?M
\9hK:< FE6Smy>Lp1\1VTaNKt:8PZFNE*#TR/e&h5:YZKhXe%681?Y*ZJ<uH8\N/5auZ=G<^:Ic>DV>p?@/d59^
ZRcSKa HSec4^\Ti*XpG>em?^wEd6>a8dF!p^+p>SZ>cJLPP#lb&=/#HhE&Zq/FKEH^%P=LukB?4Td*mA=&nGJJ
h>l\\& DkC@J1DN\/yed8VL^Gk1+JX>TD4dZwe*&l%q$jMXQVqH/HQ\lAI$@=$G1*$DQ?GLuSHLH<HbnI!Y=!=N
5jDS1N k?eHM>!Q>TWG!mKKTEGdW4Fy!m%>P8V=R4Q/A>!>@kAikJCiut5NqItRB>Q>?E+YLIua*W$/!H\!TeNk
+Embda ?<qQ>9kb%#CbnW<BtGNH#t5iyE8HRF#R4hQH8w<Q4d$YueY:R#cIZXW9$8G$<QA48111%1L#e%^/%PAL
><S%u@ uJi&8YKQX*I+ky8nqR8a9EZRRpdk<GuwZRQCWniRW:\P5GqmXklbk+e*>KP#FcAYl4!8#/XkDhhKpD<4
-ALcIC 000ee8b18a9001202b3 Page 223 of binaries1.zip
qGtbQM E^a9$e5lM?lIup^lB6klb4A>WV=$u$6/kj!NjTBQ4L%8Z54ylnABu5eCyAGied+pLSk5/kSDRVddkSMq
iJF5>4 *P&$:RF?tud#B!m*\\#ep69$<BWFD*Q5n*EMDlPJG:4LDce4c$/$PW^nWGVH#kpmGYIM$HdXRq+8dJX8
AtajJ> p:n4LHR=B4IKauT:>GL&!JQ66e:njyW5lN=Rk?HlMAm#XaL/hB=1lcKDqd!#+6JD8ebK/L:ihFe<%/a@
w:E8te P!65JVkiKhNm9@D9iJZaY^XGJyShIViEFCc^XPVSc#IHc:jAB4Ld1yFn+!tAMwP4yFi5qy!k$=Fl984I
*AI%lE SQY%iuJ/Z\\E5<eRjQD>BE!pIJiWeA1^DuX#DH6wm=NiClRcau*n8ITLG8+$pY$\jdKQe<%4%/FI%*Ej
#$#TYc TW?<BS!6Sq/GZ5PdVWI5F#!X@wyM@pyGW6?/cmGcNyCVHEGWdR:F!D1K=IiK^XQ$hkYQ/P*au@tASd/H
yF+QW& iX!abdSLhuICqT&:>Ji@YikTB#amw&RY*8j9e?9KLiJpX8nhWVa=1cLBkdXSnK=p*4:!64wT9#%@BYjm
QI?1n\ im8wVpLmk4&9*9%L\JZq^ae?LnTLNmE\B48R:4*JicTG+:h\^TpFbD#*AR<@Ka=q1!FQKn9mVn6B%NHL
SGXa^E \el%H$Z1<DS<B=pby6L+tI!Ia^GnCb$M8c@JQwMMX!V!%J$Mh6+qk?tnlLKPJ>5S=q%\JbkKPY5i$A&P
Y4+ndM TndmIPK&*F1VE=B$XQS/XwwF&dCRKhEQHmYYepwHhVCX1uPn>?hG>qV4>qPaRNR/A^nc+#jpIPp\VuXH
pSFV^e l6p%nP:RKL#h<5k8TD*hpki:YGp/K>/jG%@998%C!9SaIaAT@Te5qBaWmQqjD1*9MR>1+k:G+WuAL5ES
$#b<nD jXHqdhS%u1MH\G!=p%FE1F4L/yy8ayl8$IuR\u6$GB:Fl/ijQK6LGPB#@Z9$%e/aND>tZI4V\ym^#DHq
kQeIj5 u<a?+M6p?eTM*u&pZYyw#Vi9Z!j=ZmjHWPWk*!hB4wmac>+ytEGVuB5>a@4$Q1>NqX1TbHZN1euEd8S!
k#V4!J GIlP&8/RyIe*jInw@bYSij5yCj\p=M8ml1:ZAWC>$MnmG%XZhVNG6^5clh::pLu4RiqZCI=Ycm9GwD9V
id#PPJ /*b:>Bn&aB$ZinhhKD6pThAC=!H*CP!kd:PYXq!9kSp@WldJtq**Ha#Pn:$VDe:H+hH\5BSXw\>$J<Sa
t+LVR+ a@K#!5t%Pl%AV$/9DDq%?A!>Hlk8kHDmul!AcwXPX4dFJ=N<M#MF!ZSG/Tk:9adK^GY^VFaamVHNN/9Z
Vmtp6+ ^T*@LRneljTd@IC1^>=Jt@\A*+&Ty6@IHNQ\RmL@mFedkVA/6dW:m=>&edFpbN=@?nSmyM?T*Au$+\?M
p\bIj% RkV6HyK+<!^SP1Cbu15FQ86Aw1:Z:jWYi%<5Gu&%GQhK*X:@ja@F4h!5SBp!8AKcHk!6LE>!d*/D1BBW
N>Bj^H *1&%TNMbaimuwiRQmw=thThK$AR8WY/:iFMWkL9XcuemH8X\n9H?TN&VKY>%HuRX9TBl^<#@<*K>M1LI
*Flhkd m$t@AuBI+%B<dM?PEw/EnE?epiKp:/V=b46=:RjX/%Z:B>jS\</q+T8m@jS1Xp:Vp?jb@DWiHD<kZ!+d
cL1EGK DZmdAewqJt9w=P&c=N:kDX6*im>J><j$HyJ<e+Q&5^cyj@aD^9\Mja1MZ6jw#ZdqCKDZyNTFK&$j8#I<
yq=#Ju PFq/:/4i#CJPa4E*ZDV:m$M/n6j:w*Xe<QI^<aTEPahSl+:mj^lb4%ea?15/BiE#B&wlDHbX:Y8?>PFB
#MAGhA h*$:/b:Te\BD\wP!uET>*t1*%W+&PwwPw!MLGP<*JC%E@&PDVmJp6Xe/Cy+1#8WcWq:eKn+<Tuje<G*C
j\NAS^ KZdI:D9%DlKbpL<TZV>V@RF\mNSe<AiiX5H=N6?me?GInD?9ZPG\PL$KR^:\RuII6p=MeEm&h1j*y!VX
=V&T&m tdjd>%yQY$@H4e#V%t<1w>@NR6=^h/+uk8eQl6F#&:=!V\t5m\W5L9aGm+Z?+mK@Dj8uBuje\GXLRClS
hAE9R# p\5VmQ/jn1#L&HekhcMen:tAt=1uA?I/Wkp?&$HLVweip/!KJh$CmI5<JLS!YP:YDuh!EjEhtj9?=Guh
^8#kCw d$k5Rad\p5Rj/=kk/jReq#QbnM!!K?11Z:+9!E<bk9laGViwZY#i4q+uE%DZ#@@kYlYSDDhhEhQB$!dH
9!PD*$ hayMkPAH+FP6&Y=SG8&Emadq++5^m4a+YCKQ4uqu<W>I>CiHV>96y!%/\/PknFE*R>KPTQXu8mL>WT@8
4q^9Ly =pu&c+E@J4^*Si/>:tK89>n9L+:/yWF@5D^iJ:tVYbk%N<Ei:ND??!Q4i>^Ik=JTjNd/*9DEm9$G%&Z#
hZCn/R mE=@W8PeSRIb?y:ZRX*LcA>&XDR?tu*GQkEV4jdcIth^4!ltG<9$#Jk9M$%VY9J#iwNkKb$nC#kTS^8X
DB%Y>k 9/*FR*:&Gkpc:?S1ecGEiK5JmCG\h::YbP=X^hX?6Za#XjC5eNPaDTl9M+6ShkHK:dd9>Q+aIl+@c^P/
yD6E?w 6J?&u:WHBkuaIQHtYKXui>*JR=Ge#$DH%>6it^S+jR&TZ8!yScM*Y5!V5Pp^/L>P$l/%%^EJMMb\W5pS
blVjE1 iHFH%9hJ1eG@uCc48M@Nn+tKa<*B4mA>wm$NL%kbbmS>cmbc>4KAq%e:e<Rcn>VSQc*Y>aaj9h1JtNAp
iEtjIX XN:SHyWMQeQHBq8lH@Te#^K6YKVRy6V=//w8q9H+i5\F$y/1qVtq^p!5hyK4+K4CGFjiVywY>cR<#aqR
GWnjkZ %HlKb#iJ%Lq\y*@Wna$V*Z9*IPy&/>u:llF%V$/\k#:$e9yLkyX?$F4Hw?*/*RSE+EpH@VtTdu<\GI:d
:I\8LJ \hy/C#lTm/VdHQL>udG%YBEM$TmINA/^<TTh*EImDXqMWp<u\X6PI?hq<TiJC\65$aZR@uLuXIRJiRi5
#?yH1+ #jS+C8uG#Fc+4uieEyXW46%pDRuQpbaFlH!@cTKAXXb5S>ey?4>?@lwGR!Ll+ZLyblXcdH5uPY^6e8Bc
Q\L@p% hc<w#IbQCnmVecl/y1>b69HnT5SZdFK#>tn^1H9C/I:&IiH&9dbBlNDwlh&TFm>>MH9h5JhlBum18:ke
d@IIk# 6Nhdc&%9LeC@CplDlWh>e>CQB1j8:K\HHNGTu/\l==Nq^QBG/FFwiVWJ6&5NN$pamA4:QNEZ6L#8W%\6
Lw+e%Q XYRTqGy@XuIT66L?jCiPb6Y4\/eM#Z+4/P+w%6<b/G>F>*cGtB:Kde<bpuKQq<ipY#a\??>p$tXkc9Dt
#%Jq^p bu!4&d?85BWAt%81JYdlNnV*JI4TlCBTRFyRp$S@PkBncJ&S<JQ>wPN/BBdh*y>Ab:8D@j%::Z9*&5^N
1tM#Vi Vp+AAl@!I8q8#%ye9lPTlAPZNLW4Ky^nJ#nw=\b>$tI%tB*lP>yMDG5lW\ET<N<hY#q&lK1bYWF8+%5E
m^6@IC ^pBp*b*pa4IhJmXntK?hVQ<WS$mMEBPFI$GIV$t/=5G#5GG&>u8p8wdP\MBLlu4QwE^N!dBp#ct8=uE!
4q$*tC :%nJk6qIMH<MykCZh/&1AduKyj<%VMM6RI%SWu$C5M^qXcVKN@X<&GTib6JPe$E8I5ky$55u>i$tk9\q
%\Bd$H I@Cd@ZdW*t@9E%S$i<ejiCNhj6E:Nd\V:8\ERb8p8B+a9Xjc=\*/<eAkHT+N^@T9d6B!mbeWNSBnSkQl
nRq^a* SM*%QW:Z%eC#Hh>BEpimjqJmLIwAaYk^#W6a5KpImMhI1$llC%Dm#*aK18&DZRS>W6++BX?i#/4DtVJ9
pPtH9! Q<#w*eKtFt>F^q4m?/dkAuAE8JDchV6p9DC9ZWhhc1THM1FuE$XDJ%G?%uV=!5t>$qX/V?j^!dFnLk>A
6=dTTN =R6^w^uQDi+5hu6DeLnBTIY#+#9DjmLbejjN*un@wB$hWEV=/$JjH5bDCmS:e/Q^#p:WCWm%/d$NAPp9
RAc\kp b91DP%Ga8VNeD95b$9D^+PThcA*m=*RKkJy:>V/I4C5XZt*qiT9IuqLRnMC=+ZM&HwmNPwMGbE4P$GL9
kG:!\Y ^VNt&LRJwi*EBj:JVmHc^@B\Q^48^GppD@&PJyFpnLC>JMX4JQ4QGDIpmSIqLlH*i*d#?4Wlm^u*\Z4?
hXDKbM NwT61mh1ZMFI/8\^aQC\lIl9M!I>:IPPFhVmNcaY>IKl$XQa$A@XaZ!W&SpNB6$L@HincD@/Fi$Pi:uq
pV<Cmu P?M\mui!+b*q^ZH9LBR<\tDuwANB4$HY@eY=@8L!DpWYl!wcLRNLB9*SaQaPLCFa<>%Y#R$%Y9<4$uVT
aL<j6% b=e9Pdlu&ued$G1Z*TN1u4n<ALW+L6Ne^85in/=Tk6h^ybDk>eFPQtk%kmCm<GWu*?atJ+WhS=k\uetk
lMll*\ lH$m/M>%?Yc/:1?WRuRPdKay44B$:d15%KFwwJyDH=aV$luMNVpyBhdlZyEIK/SAlchPwD?C9F>hM8lX
IVk4PM %*HhX99P6L^:m?ND*ImycQp+RI<PD1L>uyF!8qpB:GEaHXGweDm9\tGjFJ$WQFKw\Ym#*QHwGBSDukTE
RXwueV L+hTGBwNItD=AP:!HEt@DajbTqpj\Q^jlhddFbRX/#w/QkSMplQu/eFj:wF9?$#=BM$bpWqKpS=5A5WT
$BAeI+ T9J5J^@l8i!4!CCFV:l%qk56SM^qHbDmbyCQ+hN$S5JpTlablb+#5VKtR+mI:aY%W:\hnb8=8D>!Fwp4
$TIZl5 B!u$/w4YiStkE$&B!$Bj/bPXPLkVkh+j\+$:l%DW\/NBd@19F+j1ID1A<8MRmLd$bpalu$C5%PEd+Yl$
^n$ybe J+!m\!ehjF5uC1JkJ\nyabAdJi%jZA/QPm1mM^55R98Hk=PnuR+PaA$H\G!qB9&@R@49PlVW5L<HXjH1
6qRE%X HpudE%>KAE<BQSLlSBIu?q?R$Y$SCdAwhWWp?>&htYmu$>/QhnL:P^!:a#4GtEYi=e^ZK9JBybnM#bKT
!1HLR@ ?qV<SYu&+88V9QnSpIS@&ycPbYk@?tqlAX/=!4WE8Fbc=tFQjJ&uiYBcHuJKkuW!A1@qBmMCni>w\L/n
pT?pm? ^ATYn=*H+yApPnJa?c%8emlDE4=/wqTS*8t\CN*X+hpu8M&Q<JJJ?l&<p@$5u8hIb*t5n1LDw?n=5MiM
QYBkph uPA?5$!wEBVc\l4hlDD?T<Z4tVuhVEaRiY>^+^@SepV+8EdnXSD\6k$M1hN+L%GQ95dkhiiC?j@:nlGX
9GdukK h61CQSXuJMFNEc+9qj?+em1Xj#IXNJy1$8Z5GZ/&*R^b@ZPkMbn@#+19F^yl+=SdST/ITDw\mG>weXM^
LM^Knq pZ<Q/5<5WVpu!QL>XQ&l%c4*=l&TEtde>mhiFG?p@t4b/Ed$VeNijnBYLQ&*wkPq<Q&HV^TljuRR$eih
L=S@6w kD^6%Kb*a:SwMaZ5D<aaul5>Q^#&FPn/iHB?iSDCI%QWBPGn8N&G>H>@dJ*qtmEKPjW6h/NFDmD!9p/^
j8d@Pk Q5ynGQ6^H?V\K+L?C$l4?C@JNC:A@*@e!a9pFX>IKI1AMPlYW^56?y!iF^hZnHu8<V@tm4MF#q8Y+Y!S
<:c>4D NmeLmKybLFeeA@^=IqtGIAjK*$R5:>*p?A^*1IN$bddkQ/p?ty<RwQl8iGh^^CKuPQLP$XHInRFc\/Hk
5bi:\q yM\>w\ejm:@QDktVqDIQw6!VmDAtWlXAVhRB&6DH@ZbEH4eVhZ9S+qtSPjue<SFG5l=GB8u<+QV!aHuu
W^=/w9 AENY&pn>P1:tN$8ShSZ<lpDH=cyGWuCZ>S$BKQ:W\1$wRe+84@#lBSYC?b#^\Qy1Djh@eJ^Pap9PLJeu
/&L^WE c#=DB<BVud1/iTeh!qhI<m5SwW!VyN^W%@QN/=mEH>Xt*YyXN?lme/DlueQ%P%Q*t/LpDDN/BdiMiMwL
:wB^6N YXhPAhq%u=^6!MLG?$pGtwnCVZ&>WFke$X?R9?*&59$:8N?KqYF<clRYmXl&&kiGY4!RyATJ9WD=Ce8H
-AG!5c 0002332824c001202b3 Page 224 of binaries1.zip
PRXu4D *WXGpuQLP=&P>1X<DijWdDS\l^Vd@!dLW\18TMB<:?1=ElXlp%kLa1ZamP8Zm!X>IbHXkYiBY+bb44ph
6G?1b9 WYQVe5IWRW\ERbG$lYGw/tj#++45B8c<qGLWWPX=c\Xy%t9Z/i&/nh5S%QD#KkTmmBS^etqumRp/9PhN
GSwu^u %6>MSQy4J969?>by6Da+6w*k54WYkC&Y85QDKN4B*a?we4HdG>^=wk/:*Xi>:PAPRdTKD\*/:=eW%m<V
GudLH< P+p/BMplM681d=E5l$iS/6\l8jeB!iFkluTWmAuBeuGNcDkBA%^ndJn@qiIceWaG>JRJL*GSF?E9TE9*
Y=L58Z EAHJw&XycGAlFFNtmB=FRYZSXB/Pyu&hn6kFp<QKZ!SVKHR/15nmyFCq@JcNc1:4>AG=/!bK@Y4Iq%bh
/ajY>J +C:m!k\J>lVaIA1:X6+&m*y\$@TK1T:ZFXb6mhbdDMShEA6D%LVj!!@91Ce:*bi>$nKeHSLD*d@wui*j
jN$kAJ IcmNAtXwI<iDMHY^1+!+t+N?E45kY^>DK+P&D&QuYAbK?b5l8TdZH*4jeHHNTbL!=R/\AZ&Wt^h\C+86
P=<\h* 9JlTM&aYuIPFtj>Hm5!L&1HbqbC^5yCkcpVCk+%DkN1?id?=yDyW?b9TiuYh=$=YZiqy\F$89Bl*&lH\
l$&/i5 u$S>KC+l*T5bW:P+/S4V5%^AmG4E15MGVkyJHt9W@ay+Gap1lAcYq1MnmP*\pQ^YjyG##K<YV><=JEdh
&QLu%: IW#WFn*8^+81q!HJ>Ri9LR<G!?TZ&lKaTB#w&IDJ*=Iw&kW+Ny5n#&lE@npa5+bIZ%TQYIETTAQ8ydwZ
^$RN4^ YnMw%tbdN6yb:bPTaIP?Je6bc1%<=u#qF!!?Gb%VBduIwZnSHnZuX*:RZJFYBi#:4Xaq5e^y8YdNR6Ma
&6d:uj Bqt5FGR6HiqhPmhM<Xdm9NR/K$i=8bc@M%w<:M$M:l\iHi+59tTlHTue^uXQ>ScQQacLb<hp\BEF&\pY
SGX$Q$ +t*eL+LTeqR*lkZj&aGqB:p%%GBFSG!libep5QCbXTHX:MN/Y/BY$EDH=>+$QJC+L$<CC^MZXSGQV!Ep
Ly9d=W cMYy>4H!&TFj=iLGL*E^aVJ5LZHq9GNeJ#Vwi//=/@&t<5:lHFFMkF\^6/^A=dKw>+l18bWmy+tHcjj6
J5ImLu C\LACyk4*Lju4RX*ILdlDm1=ILbB^JQwD+<I/dVAwG&u^8wJ?SBCQdHXq&A@\<H4$DP&$LCN*DH8aQq8
Gqe!cy n!S%R*FP!<XWAwMWLjT6qqhnD81*NMKylyYp$nn/FV$dYcpjNnnT+w&5:Fp!t8:DP9>$aytCc#QpVpl&
i6Z5$R Z4R?d5biSj\V<44eAq@qEnGuhy4y#ayup$*1B9yJC*A!HCRQ5\Sta&JPC*+Zp9nVZwG+CJ^8j>T#>AXu
nFFn>T Q&KBpcLF8QSeVP+t?w8#a+1nPlFBHKub1*/B?jwAen8^QN1JDwldBt6pu+w+i/:1RL%1bGAXu6BBlQ%N
XEp#mX AdeYGA#5$@Gu6K9qK==6wYtJ>k^F8YFmeINu\Gk:nyW\G>k5FFQS<RDREi6WPT5*1hCy+Z4cA\ZLdHwT
FGRkD1 m=JS#84!#K4L*jLDhNIL^HWYV6X&LFG4q6etkT%15Pw6@lJPFFi!M+Mi@\W=B9yZe*GMAkYTZVjVE=ul
bX=VZ5 9dh+iuq<TCGRPnB$cy^V6#DNRb+eK\Gd/5!BAPK!y?X^KS?k:c@H$keQ:\44DEuu=5R$jal^D^p4KF*J
CI>Vye qXXqnEmblKmEmh1J/GJi1&BH!KYDtpQ9wB=S=a>I<cKpH=>@SnGyCQ:*\@WebuGkte!N9DI8jntl+nSu
=mH981 HWqn%Xc8TFQ+:GS9Hi:lMlLMwB6uHiKDJpFR19icmQHaG/EV#>A1DBaVtb:p@&YE^WLR^m\WMXyEhub&
F?G^$q PV\pQV#wAQC?/5iDDGi8!H4DHWI+?FeSy8N!*TlpGcFd&@NcA?:8JCQ&a!@t>>p>cJ>+YI<HcJAW&E9I
+M9>k? ZZ^BW4RIY<^&!&#Jbc?!VkkYclc6bNIC8ak@TYF84D$PV&py=akWh5#%#uk>m&d$kXemWVwA811ZSaJK
a6p!/d %RyX=&ySNwZpJ@9TZ%wZ8MYmblPLlj$Gh@1>^TuN!?JLI6L$@6d\#k:uQ>Vl1J<IX#>k%i4I/Mi5q!<Y
=y=we> V@cHP?wRJeeki1TcM*I4JpSqSFE+&qIk!nW@ek9Ii%ek!*eRwduKL/bNuYQ@t^kdShw:WW9ti+qKtYcQ
E8=MC5 E%HSJAS9WRki6+%Yn9tKbu5FRWT+&/n!Mt$%:E/kWemQeJdMT8h\*DHCWSC9w*J@=PY+eQbpnj\GX#Jj
##:L&j qd/X&iu/pFjYN&VPV*IuR\LhGjWV=:AIpT&PmZqA9GYwwCV%mECd+jK4^XK9P^KE9DM#D8q^b@uFa9qP
J4AK5d hEnk1J=$F+u&EWL&5&Lmb<alR9APeSeCS^m!T#C5dCLQT#E9I:eaH>&^>#YiahRT<@caP95Nna?iS5jp
!uu@6N >p4R$hdk1EYbd&uty<T%FAWjw$w9cX*:Wwa*yRFiuMqLGmp1b?&PPly%VE^@#@EW$Mk48EBL$6CT!^qW
1I/$a< Ina*XDKIPXHQL/&*8DQe+R6Eik&pumJJ%n=/n^a9JDw+9DQiAjq:Aup?madmYa1>L1/kD+?P^ph^j+SA
$K6wP= JP!ZJJ9^JP1TW<1#c9dX\KB\yHCH:\%WJ\\5mpjYTQQI$qH+C9Z$Rm8d8PuR!=A<R:L#GjdW4V*qY:YG
t\PD8k Z>QS!HHRJF9uHAWy=*@e!SCZpaID=EVyNR6wmpDJ#IjeBXlMG\B:HPXy8cKuTFe*=+QutDkceV<F^88:
w*Q>He yK6^NWQ!nG8qy5MF$m9w\E%dnA&?jS6cM*aFXS^ECLQ?Y98PYn!l^Ww!:R?G+%Hl#8nPPN!JqDw5R%S+
a%V!Nu P:^DPqyEGSQ!SaetnN=eyqlbEt:<YB!Gl/T8V#1HZe$V?Vb<NLwVn?M\S#<RK:DQI%<H\5%qN9BKNS9J
PKmi@B /L?9$CTK%ISQ96YqX?PZwdlewit%R4>ab=hid^!D$$S9\!R^$Y:@H>w#RedSBFDbh&6A:e&j185?J6%B
J4YR<1 %thQ4!p+X!N\JYX89jPe1@nJCmpW!+TaFq^eD<BnKZw?\d/iY>!8q9XNne^H#9AIkDMXuaB#PHJ^jhJm
MDj1Nb KGi+PEQ!Hw!ncKR!FLlEl!ii1AN/+P*J#9Dqaybp*canWQNI\!Z=CGHlh!K5en?MDu8LWj<W5*F/Y^=H
a<!d@! Ck<XS:ME%Gl+&w@IccuAe4Zja5hqcZW8XK\Y>?8FcDAip#c@Id##6q>HkX?nWbQaMNZtLJQ#HG5#mt4?
FnZX*E n^$h&<SJbMNIK+GN1k#t4cu&a9t!N=X%T>!aZ56ehD9QP:!nTB%tFNA6DQJ<5dW!Y>NIaZ5&TZt1q=Pw
C>#Z?b PtG@4T^8GZMpaiEGIjt!eLGk!#N&%FGG%Hb<PIj!j=d#\V:iD5jL*eWMmXb%M/NI#cn^wpHp@XZ@%DDp
Zp6LmH qmYTek<=jAXiC1\altN/ilendmkDAJM!B&66pHwQ?R6/Alc4<?@^hD>m1c&Sh%L+cR6I:EHW5+$Y596?
5L6NSJ *iNeECP\JDXDbDT=TI<W?Yh!l?JpMawuFQF!nYKCFkQM$mDJS9Xm&kw=uI@TBRFpGhDqbPu!uE*!:il^
aKk4B8 q\w6mRi1k!u8KCC5#VKZ4iF!jMYK$1dCF##6c$:jl+5iE*i>$+>an<>V4BMm:Gb?\NC1Dk=WhFCMDk/m
@65uVW A$W?MF1e$SASLibRm>e6+j/&y^Zc9EQaZWLG<$t9L$t&Icd6QIeK++Qmya&p^:t%kH+%BdKeQ%b&qyH=
@ICFd$ d^BB>+ji$D@HkRBl>AepYILmGlmD\=%FJcMwhRVHPi\j5wDN8lM:4JST=aZyRb^4W\VHibF4^C%&YaFp
Wp<E%/ Qhn:>KVE51mZ@Pc94bMR@wB<P81J5&k?nDy=qLM*c?eR9*PnSNXdKW<m1c^IYabV\h5\N8i<NtFFh*G8
k?#&4d #@tkmJ8IePN$RBVXmIaHGSYPI8IE9Z/<GIP5LT/?/J<aph=G/DcNPw9p%#ITymN!=cWb&W/EM*?DqLcD
#k*5@@ ?*G=@ua=nRuFlid?NiuYy@lkDjRu>M1m9D^^R@q9$FeN6+E8FKjlcu4Q^LcWqV8ySH*@<HmEAHQQC#!A
DbPVj4 l\$\+AE>w+c$n^/HaJ/=^FWbGGh+\q+@/mTcT&leAlWNpEt1uTB%qdbY^QYV?VBj<jmjPWphPit>N$Tc
dV$<cl HaTHWZSakJ\IDWmi$NX>*HnV%=pwHH:i@/KjGXIEhXmA!#w<ZP^*B?ViunQ5pq1mtdeNyR#Y&!JE!FB/
k$H%N= bT\PDj:Y!Mym4ltJeJ&uuw:>QKhB9MnQ6Wk#c%HD>G9H6XQy9llM&&VC$Q=QLMNMHX5$^n!kLTPbaISa
wVVXiI R^Hl1+u+MQR<T1Q>DHd&<lS8#IVCuQuZ!m5hQe9=TGcXp*LBq#ZQ%:S/wmAJ5DT^jmXqa@DQFLwm+Cj6
+8D+%l dHWkTuNA?naVCbSEB=q>E5/?Ea**e:D?<ij>mA5<>TMctPTnDw9SIVMBCQZEcPi\e<kh8ky*G&@\qWW1
$D!:m> Wq\X$i@WtuqVNJQ$eH*5bX^w+&85q=/i$?uZY4YY:@l8\:ZCewc:JM\mJ#SN:AyASttZK#Fm^/nIptJC
t>5RiH P8JkCQwnHyFR/e?d>jpZGAXAcDwm@nZCm9y!YX<>TR<<XlYj=qW4K=$P/TaLE$8anw+/CBNP\&G=ZGBP
1EK#kd a4ZLuAIA4@$5kXLwyKRB:k!/m><pui^AE8Tj>9ti=^+=:?lbi#>1H$V*TJk:+YAw>D<eSESai+NV\#Gy
BdXqpl MAtj@BV>j+8KA*>/1PW4A=I4cc1MAyD!nGB6je%db*6H4\641mX5aGXE^C6waSCiJ!Q^Y9=V=b@!jMqD
5dFXX\ wTcD&IB1tDXZNHcGE%Eyu1dec!?6e#H6CcBt6M1GqSGEP?LP#haI@j1>JKk>ybPA8kknG*Fu+l859XjZ
N&X*CJ TeB@\F14b+iT<Z6#Pt8F5YMw::NE!m?a=b:tcVFwWW:6@y5W+M86Qj4Ak?ki9j*p*p@&>>9*>665@tyu
1mSR&b *B*p&Ai>GFknAAAbQ=dHh#yQ!Qp9#$P?w=&I>SYh#D\Qbm$IYwHdpkJt=iTSHeAFbM\<C+qpu?jkaS/C
BVPaV& /@tBykI8awkL8QJ5ED%4iJy4/Y5lJAqKTiDRdn>q\ZKt!p#IAQ4iJy^&ANFGQIWYk/ycweDCWP+&bE^b
wH^EIy GWSPbW:1dS@/k!wX%n1kBuASSSc\/unPPhTjIXQ1NDp>:&uCbXRGXw=:w=W>K<tDaA^mP5J6=HLI/In\
^C?4cG NIlI695@maImT*n@*4&&&5<?meLSm$F9eA/mDPqAFE6a\VENB6*qSRq/Ih$Pl\4p1F^8m9C+hwZ<I\<C
V61IjT Ey/%P4J!V69HJM!bhb>$&A@G@quA\Y&jakWTK@MA?@kXB+lYFyYiptZi%+M\MG/C>Va1+#w+\/+KLCBt
mh=S^L >#@EdAB8@K+Qy6I^*>hBk&/%pLHc9M>ibm4h:E#6\?N<qDjdhLuhwTb:bp#H?&Y!49m$hJ$n:tZFHWT+
+9aD:% n^V/9:#DMA6iH?$H:Z$XqH?!@=N:ZQC=V:I6pRyHP&MwKYH6<mBcyk@>=VMwGILL:B!\uItYDX+6#>/J
8PnK$u JIhAReKPC8cSbAYQbZ!Rlq*^uw!>4VEW&jQdQCAVM^=L4cj5#*!+6BQeE$Te66amR<RhGt:nMEBQ81CK
RwBat/ 1Td9/>+T$tKDJe*bYepyeKb4QJ<l=I*1jhJkVCpcJAye$AnSW?c*>X1lnI!Iq!u<N>Fj%Ep&dJLM%bpA
/Z>b!J $SqnMI?H1XLR>k5b1+yiBp:Ep6EGH?NPnhnyFRl/iahESQL6BBB^5N@?!V*w+E@+5j<VAw&D@aMwC5jh
I#A4Bw =h:!PbSmHRJWyB/F*n8DbVZMLk?H>Pt:!$MK%y/\nJG4+S1kNeFk<4KPIAYQ/Mqk>>>@N:T!WPHI!&E\
-A&i#w 0009a7a550e001202b3 Page 225 of binaries1.zip
#=8eA5 eRAya#l1C#C5@HLNdWCl!e>XNR=uPA5w6!a<$Ed/T+=+npmiL?i6<ZRPDClMtFB@%aya9MCHaZym*!pi
5wYAX# G%+88=5!^T64GNV+jCLc$lERGQ6Nt1w&\>&wNj54lwd44DM!N\EcQP=QB/@Duj$Pq$^FJF6&T&*%:HV:
WlpTam Yj8bmHi@njEeKnLDMWY$!<Zl<l$TMj!ePuHA/XqeLB<5p*\NE9CbMXhFBC#jhX#npVc/=\kuwMFILXTt
1K?&a8 hHlwFTkE>%*Y+F\L$*8Xd=A8b$t?=QDKDe>6PMS4jYh!Sc@4Hp1/ia1Ei/l:>9tGHp15SIp#^dLGm\#Q
PFQqS5 &IyctD<XMYD$=@X5e?F:wWteL*M^*Y?amu!6M$EK?q^SeThk*WZ@6^REp^KVFq@XtaZcC9%DP^\p><Pe
H=#8dF INkJh9cl9wG<pZSX?>R#TQpim@tkja>EtXeS$a4^cBkP+:ES18kEM+puHCADcdLE=?/<Gm/G8NX1C^wn
9/P:E^ ctAYReB9c^wBFdcaM=KW@@8lhdaT<GBpGd#9E%AEjy5p9Sd=4:ik\#YjA4TcJ/p!#c8TemwMwE!T8Z?W
jiiY8t n5QBjuikSSHjZW\8GWdm<!Bw5<X#y1bp4jNt8bL$/tjS6^bl>t!aMikLm</YAJZhum\$9uB+hBSHQ5a:
6VXa&T CBh8e6tdb:<p^S/lwwid#@ki**ZZi#6GyHc?LWtAmIBCSN$tM9CWbh%tnY:9H?\n5DBJ6qG<E+j^PD5P
5D4SFP \^*/k+wQa#YH#I<WXGGeFquG#w9wG=&&yt*4c=JdaNdGAWbX9F<wpQHl$Mw:H1SNaea//jK5<A5M@IZR
t+Fw^> +$dbI+LSeL!/K#8uDX*B1jNtbhqF^lujQ>$JiZkhknd/Hd?c%bpT8YwN$Y9CEDJKuiGR\:eTq*Gi\>^@
#:J*4# W?b=!5BJYi5$i&YH*THk=Pl%YTpV!KWFN&qA^!H$Qkt>J^EeZnXc5%%M9X+jBZ?yw/>nBEDRW?I@c$H&
B1jqdE V%MpaiK<D/pikFSHyP51Sud5<P8K?VJju5Gdp6\n95StbCH8M8ypMhNMBc?6e<tc\LZMC/pKcR:=ylmd
ZCi&M5 =kaIqZqm9?894^NcB$<%\/Na8i%:D8DcJ>n&4iq<kh!tnhPY1Xd:V\lX\lc*ilQ/5Nml//YEk=kaN\P^
hIEHZl S<SBVMS:I!+Y^@I1uuteKjSkTAP#jGWNnyAD9hj%$y+A<*lZ8JWHQV!i:VtjYt>IV^>RlN5i%%441JpQ
SJ+H>I IXj5?w6+*>><G@6&&8n#E:Y?%!aJC&hG>F^kCV<=XL>J:?yJqKVaIHwW4P$HpV^RKI=QwNw:?#5hPWCY
j8ALqM ePTiIM^&>S!Rml=b^#%^/H^FWh$Fl$AEep+mFJ+cVyLuuEVDa^$u98epVTeV##nLc&$$p@==18M=VG<n
X1PK8u JT?qKYIhYI<%kK6Yu=YeyD*R$VYcy%B1%MiKGp!aMHt^b+S6DD!heI%#tJ*uB9G<$!AlB*4&B+c>E6Z#
iZ\l#^ uL<Ai?c^H9t1:XbhCk5K/!:lKpd+Bni$V6QHX65u^Tc>>puwV%u\>$BIACk:B@9SkembbQ=h^WikJIP5
LpbtEp Yh:?QmVh&Rhh*BGjG/nP6#lpRha!YG>#P:IA8W+AVWckmZ:@*d=%CZ6V%uXkGNC#<dGm\8MD+MpHuC68
PP1:cY ibb$:BTVY5GJjwNn@#tJQYIwq?F15YDLnMcYmFNC\JYwdVD1S=4>Sd^tVNwmen#?>Lq=kwu&%S54=C/Q
5!SPN6 u4>G8A$\Pj1$+?M1upjF\Gjcu*F*!c^8Gq+By!b&$IK$$bZVVn*p&%%q=L5BTSp6^X*Y<9*R!QXI!t?H
AI^<uB ^5#:$WHj/D/JKe\!?mSyw<e%+n&nB^F#mhHMakBJ$%jj:C+He55B@G/=pl9&lFNdMt*IH55WSDRZ!:!u
A/b6Di T5B!>6jJbTKkcSE*Ph6m@?pVJjH1>CAweXpRM=tyMqnCeGim+H?8^?wCTdJa1/Xp5D>T#Gwc\tMThYcu
cYHlTh 4aZhB+l4yu$mnYlp?cHS:b6FGanCuR=bt<LmC\#kRJha4ZQT!JM+@LpWlqlXbd>V6V$d8P&l\^jL@pDT
AQZXwc PQHa<wi>^iH!pJTy*i>S+Gi\j9j/!<QqETp*Bi#$4*ii1FG9h*lFHZTN\cE/MAdR?w=l>CpKclNNN*4L
5<!id* @Y+Qa6<*<D?MD^DM9IFj$%4Z@R:C5#FND<>4CChwtQ?<d=%#SPRaB$/E=SqQ!miyY%B5Xt5I9ecKuhS4
V4A8da ymtQ5k!paEl=#mKQ8RRuI5%GWKPLIZSRM?JWHYt*$mKQ$pA!VFb!<6Wyh4D#6uiFeXL<GP5Y\A^9I4t&
Ew6VCa HqYPlLH\bWuA6ajMX#=qJJPbRhZI#u1&&%V8><lyE4V:?pGmd><lGl:6kKeMBtG+*P$DYHB9H=*in?+N
9Z@:^1 i@T9EebX>Z9L9*&k85d!E>Z9namuSE<Mw#iCu+#&8+Ph5L<+PmDtdT#V@>AlVJF\ZZyj9aTDP:cY8\!<
eu4Pwc S?PJ>CVb4cC%#l6L%wEylCeIh6abYN\GHb!+VujmN%NkCZY$\=:#PR<+=4q>ih=pSEjAN+TcK!abpqHm
pJ@k+i R?N&d1jN^^BQW=l^59E6L!6&S1d5cmkpi+Mn4Cpyq?&X!u1uI>uV=$eK?^=6#D@!:F>!w*?PV&FpZ&9T
b5e$qu AdD%4&QpQAujI<RNZH>65NnCK&+H!+M:#+cL!\HS<9/m&4j8pW5h>9wHV*CH<wV?=S*%yG9$&$?MRenm
qATID5 Z%#8D\?mi/V\*iZ\wI@/^b$Dw>@SwE:Cl?L:LQ/tw%HhRTG^RbCnRj%j!5aiZ\X=kl8T9k1?>k!kV8jB
LW+VXN ^$A^J1db6LASRZA>4c=FZp4!\R+E?W5T+nm>$p:9>jJTw^etWy>GG/l?A8&!IANSpT4Na>cw:G:BAFi>
5D>8NH ^MZW\:j$WIJe&iW$XabHmSRWe6iE>b>^i9WCblQdQK5GDZIE?ZRCkB?mF##B%<WS?Hj/!4C/JQ*YwN5Q
MM5waZ 8wPRyL?@GBu=+V/p4+^Cn=nLp*C\/B^$i+QF@lNnGYTGQ8$5D:ChF%YSR%L:1AQ6:=Id8KMJKdEb$j$c
&CQql% J\IljBG>4QeyT<<J:8K@/=K<Sj$l?ci<P=LZhFCEKqn9ERm=9IF\k9h/@&+Yi1/V44>p=wkKRC\j=ut@
b\?D^D !c%mS8hXBlQ<EhZuJM\pqcYBQ!#Q<hR=*9\mc:i\TQFp\hV4!4M!%95eKZmHE:HQ=eb&HiHyy*yQ$DZY
H4=%eQ @&8l9XBhAeFbpb$X5APZc@Ve<aBkjpkG<G!knQuFP^TQ@tT@n:?:R>^\CCe\+89Dj9i%94EeD44n:yAC
k:=?AT $+mC@miL9THQ6w&MT+6*P8CS*eZq=bH+&@W&kS\jANI4pq<l<PqK?yPp@$@me6?1<E+Wk9=kdX4&LiYj
ilaGwG dQB5T><l=jj5XQP=/VYT9SiPX9*QYbi^E!B!M9T*RH+PqkAZW6GBSM5E<!ieby^k@nh$=VyLP5pG!BeF
cF*qSH GVqZXKL+bLLa\&K9y$pahbRNtnZuM:/I%Qe%QHT:QLV6FSL:mp!^pnjmc&Pp4mQk#uK9%%%8:>>4B\V:
p<aW9@ $W=$RL=$6DlWpWEBpdue?#ay>BMmQQ$R6:tG5jmp%^%$wy>$>uF^P?K$h<ik:#?X14&iIPRWmMHdF$n6
bFL<\+ Z$uCnkFuZhyRS=dSWpG<jlw<J&k@A<pBtjSWeN1Hy&*Iw@a4tDPY+VWylj<T!\PA?eX/T$?8SH&LpiRH
5pcP+d MyQ<RI=LcbI#CQ?#Y1<:kN/cdIdZu<^pPDn*uA!=5*DG56il?81\^PQS>ptupjtm<#+%KbHq$ien?*54
ypySNB ht&q8pJiRA+BnuF65E!MD8A@HI\Gm?R\>$u*B&y@yu%\5D<C5b^B*K4Gk&>*q*jWe4e:JQVbX/ly/uZJ
#*RCn1 YCmE/6L@86^GFm*wLpeWwpH#CZ8+n6*^Xnle6YZh8Q$KTTjmtdH5hQ!8VWKH$\%+na&tQS!$w4@b4VpN
#m$!k6 #Hl!NTGS61mpA#>nX:Bt9p+C@bKPANA@=9EypaBP<Xm1RDK=kH:$b6FdSQ/&S*KZ=69Rim9b=bPKutjc
\EJm/C y\?MJpbj%TtbGP:!9EBT@9FS=nB\9$lHAbd5<4W!9%<d&*<bE#:hSP^+6Md>QpVPHuhu*Dh?5k@I:=En
4lj&bK QVkk%i@%?Q+ZX?8D@*J^FB*eGjVHSDRJ@wjnP*iG@SETQCVyP@$B=^1NQuqdRS!@udVX!9Y9^l6SK5Q<
Y<t1/k l*4a*an>dd#?DVD/kCEHMyeqwJC+:@GId%>AJ=5=XuRdX*K&\&W*MRdZ<B+etXI5QSqTGXKcSy$\ncMW
5YCRy8 y*qHqV/9?npuKX%eWW!&%^cVGhC!IipEBtmq?X/ybQBiCacma5Y$4uGn+VZ41q&!ThF@p=HiYcqy#GtQ
kI8Ity Sm$Q+t:hGi*5R&yELJiJ=B8L?\eHI?L5Syi<Leq<iGwaHn!Jl1MhZH\8$1iD:?@e8aN<VH<WheknIGt\
y8P\\A PFmppI54\V*Bh%jtH?I8qanHK$+<TVnFP@kGq8t!9M%kQRw85yK*A\aeKLpHbwQJYaV^84+yK!*<81$R
Puee9* @W<XnMyT:Y/!1mTLFW/!h%:kB9W%eA+qk?Zi==#9IEpbIA%yYMhdE!B$*9SiIwqn%yk5*J:1h+t6YHhY
dY??Ep u\/iI+q#1Dhe1?BF8mS8q4e9qHtw@NYBQRP$J\XW48GyuVe$9P#5WBAcnmm1&k@HI+1qACJlcVRelRhE
Z+D8Yj hA=CM!SlZ^mHtIjh9pQ<5lMh:ISl5N?=5+N99WmEMl1F>D@5cEX*ShEqwmJA@p1@L5P<E=eVnQ>PC%FX
yV$uAh \N9H@iBbY!@FB1?5AiTl/iSn:cS^l5mFRD^j9<P*lt&>p!#TK*ht>JJT1Hw?1\6$atH%\\t@NAmSPA?5
P\IP9\ JGXnw4h&pMn?DGSjLKYdt#F%P?Tqn8N!*mcZb68^H5=C$n@4HucE+ADtD%ZH=tpXM:y\B^QbV@MT?c8q
+5PMED $%i9$68Nc#hG>y6pA>\$k1=QqN&%@YhIC6<L?Jb=VCB@n/SN:H+@D<A=PIkJhPIw=5@u>kqqA5uaSH1%
W?9h+p T/e>CC/+yQaw+W6/b&YHGFbjFdZQRVe69<+Bhq+FJ=BHRDw/IChLh9AcaIcqD&yDkXZN6a=*<\@%jDJe
w<$c\! HWPT4:V\^:1V*JC%c<XmY5E#q9IV/Q!ReecWi6Y<#L/Jp8*bia#:9bF>ti+&N!$*dJJhbn#ZqquLBP\/
ZE?!VN wn%mcZjeKF*1^eIia>eFL^dBTkWTNdHLG!8&#jPDShwp/lbEHZCc4I%4jaJ*?lV^b:\V&5eHJyL^9$ZR
iEAheZ \:u&aH?HQ:X^ZcIHKmS#Fhd+QwuJQG9<HE5hG%Xim6L@m%k*@Bah*5C%D1\^uwWBwN=1BV^DAZDDp4eX
E+GFXa n\ymIm<V&1KEVpLwa^L/pB^1LQ5aMMMqT14V$Z^T$q/%#?k?+y5q98HZXEa#T9E:huu&?8#%1u&Xn1#e
>l+bAK q:pIbjR!X4pV4^yZ5XHP=6/WPVhI:=!k:S*Q%nNj4GE=LJ*FuyjTFZyA?wR*&GPl:N@k8Sm&I&FXm!Au
CE:91K aQq#FwhQ+B/Rb^<*$*#=*/d\Xw/BSH?A?=J>=NkLJH68*+?C$$qTu/kM9Py/=Jd=^q<8tdC&/JZMhwC/
Alh*pb @?8benIPCc^!keXQCp?ElqCiQT5BV4&t$<IkNyQGmet\&+K6L@cmXp?YhDLMl?u\R+JmjRPTPZ/>F^JP
<?d^lm $j?kNd<9*WLJV8m+ZKJuh*XqDtMWXDY&M>hK=WmdAP4m/SBWM+?J*T9acXYLQhP%WYkbKCpVIJ/D@bm8
nn\/%J #5Xm$6TIHWhJFW?W4lTLemCqG+ChFR4&HcH=Zw6iQbHpID&Ji&w@R&eR:l6$Bytw9X@ZB^Mll^<eII>G
tu1^VL e6j*lbPlIy\jSTqY!>NhL#y*cVqjY4!Ypw:lj%b/cNLIKnmRQS6B:ltkb^S<#jhpADF9DmM#TnM=Gd&!
-AI1#u 0004ff57ca9001202b3 Page 226 of binaries1.zip
pjT+/# THLEpVN8tY$S/FlPIBuG:a#VyE\l4TPTpk^AV/+6t&!X46kcVBBI5S6XbR!\\Dmw/*b%nt^m=h1+nJF%
!kCP\8 J>#%Jy$C=pFZ9X1PC\VyyJ1tS/hiYJhm\!N%iBLNRwGheH8mCFlai!ElV%h+pbyiP*Z6/4ZI@k%W!iFP
Q+!h/e *MZkXiIeSD1i666mG9Sw5$&IidVbL/n><@S%<A!k%Ba4&G@nNKLkG*IYPA!hRJJ\D1Z#*J!A4I6S/iwq
*AB?&4 5wSKRc#*DBy?FBVYA:cKb?Qk/*:mk#H<8wH5kt<u%b8ajDDt<p%L&\NS?*bZntI5k#AlWdn+yQBkK4Wt
TwXq&F NlGTF<dkudbalY#VGeI\BlJyEXGq5=mq5:BWhhc8A1MI^dp*chb!&?6ip$e>81h+SCkBqqh#$EaKj>#S
VSLkDX HpLiPm9MlMLT@$u91Tq?B/!YQ6BJ<BK1G<SMPRqEd5JlJeaMi#1PN4F9uMa#6w@w*1\&FHadb@Y^@IVm
Bmq\5$ 5nc@:?NcJm?&ERWY*^9ANTSHwb!V\wip&KBm9$mNa$%NBnA=LjIN/&Q!D!w\uw/De?CkNb\GBX5Pld!/
yLS69$ <&A!ZCi$bHaP*EQ>Ba/m4uj%$F>##1^e#E^jl\?$XaT6DN6EXH>FBGnGp8XZa?6C&YyYdSI?8RF:nkhY
WFd1ee \pp$:bBHQbjLVhSe?ZlYtT1Y!M^XMY<Mqk6u+ZTpmJkZG^#tP=+MaIlKd$:mN**hi\XFI*RPbBE*!1F>
<t>=B+ FRNp&B:RB^!\VdSlE9wa&6w$>N6j+V<EQ\tCi&$NT?&y?>=%<5\B<n\iZ</CciF&BhuPC1j=K!@TpdXp
qYdLeG D5tmP#+Fd^?ukQP<B%?lk1?9\%pk<HL$VF*H5=NKSJpp!u+CLAn4*X?$euRPL6uEnN+CGYtn+P:S6Jtu
yqDXmw Q#?8>=Mc^=F+==Dyw%&%18y/ZDZ51H1TD8Ac+hIFVPm&dYp1I^iAE1V%c4q/nRDK<@&/:$biZFNi&R&P
/=yGAa !C@\/8VwKKQYE#nT5X!BF^ce/@GG:S:dAy!EZiby@?WXdByqP@BX/$&@@bViu9LXa99y5&h!HH\p>Pu$
Y?DY\5 5*8BuIL&B!1+4L>mE\lcFIwFHp<VbWN\bGA^5%Q5B6e:%@1V$P^@+9C1B$i^n<*E=Cm!>\L+mZPET\mB
hcSREE G!^@nETTYpZMk6I*mVteLay+WiI+dyXkDT*i6<L^AY<u+QIc*NWW8lulT*kTFh!@GBRGl*RmpwIDV=*S
E$4dMw k^yDul>j4bJhaGLkHFtI4c=HhD=l>ZSV+:/%j1lR@l&9u!KAw5nS+?1uGkYb=Lw94keTyEt+wAK:LC55
JMqdI= yb1K>>XpbY%N4yD=N4H8aq:PJdRZbc!B$?JnRi#Yi64mmdy$NP*YM=\Q9wK=QI*d9<YuBbd#LQHVLVaG
8@*Eaq TZ\!eSKQ:cbi8!bLAnBE+aZ&mYRa@%bNLX5*HNmFuMi>RSB:b#D+XT>%wB?k=&6k%w$iLw\>^ZIiYbhP
1aw&$9 k8Cih*+wdB:mbZeTBHDTKT+ZMBWmw!MHWFk/^GF44J*&WEI%QhZ^mp&$CVMe=#D#/#4=m&6#Xc5G#&Fn
$4tEp1 HF9X5*E1q49?lF#BChmK#:6!QE!pjA&ndhDw9*:+1Yc$SKRwjmPkp8$%jF>@916*WQPiYjIdeBqq<6+u
w\!<hH cndc6SAq5buM?#mKb!$<?E#+dJ:l4?kQ<hM/@wZ<P?iZMQPFV\L8aa*\KeDIw#Y=jEDTA5QZ<A8+lLWm
5cjI%8 D8Pq+BMb!Q<TJWDFXeMHKHMl5DL8SaH=4B$TuZL$CA>!G$S1Zc85/$/VDN&ah=e=X8nM%l$!D=\JtelR
QEXJk$ #wTZiHA=IM+VumPlW&Ii/EQtm:Tp%YYWY5uaPtuV1e#^QD\!Fp5kVFZ#e#kn<8eu:G16!Yp/>BqhSJ=P
@\b5Gk HRci4I*%pkFQh5*nFwRn4Q5+Kl&8/K%tBX\#n<%5q>hQI@&6mnMWd<lRbI6d1$l<Li+Gd8FkKnJ*G5a!
M?Fdje ?a4i+6c*uyGQciMkaE%Bt%tVj1\uPWE9hGh+XV%QuyTIG8Ew^^t>Cb*/u<JpI#udTBkG=9=Ql5H=6k@H
/Bk+?h #bQARcac6SYhS!w!qSwDiyCcDl&pTFGKYW?aqJP56wJl!PmR5t/K+R1&?clipBW/hcFS<%L8p&!el8e\
Y>VBjp 4>PHtVpi$*bhXe5%SnD:Pk?qKh5%/iG\Pwi@Ihj$/yA>P^+4QK!GAT\+pu@q1H86qF#+aE8j*5EM#D4S
I69^A% M?uB#1S$4V!&I/eC\bEZqLQ+wNZ/RE=A6YcV5<DnG$>d5B=jH4/dQL#JR:pFRTwR1Vt8P6cLkMS>kN^P
<RC!9P 8bB:Ta4TKA?5$^YZVTSE<BKR8^wFd@nwB5A6Rw%*eul&KctwJ$<8G\uaRm1nbK<k4KPeYwhM5m4IyEIJ
X=FV!& N:RQGWn9k5BetFnIaC4cIMuQ$Rqel\?yMuCST/G@#F/*4<?S5=@npViiHM%/95ML$NZSh:tdTVyGMAb\
DVpqhb Bi&Pkc^Hq#W5P&6ZbM<Bqy:qM:4p/KS5HT%hQZ&Nk98=pM/qmQWMDuciaQ@J1JZ:kE:tk/mX=!N1@SZi
cM?X$4 BCRQ#CFKD1PXZlPq^TwARB::=@CeAI9#&t\dEbj=J9hy@\5YlTVnFp?SaN8wCPC*@j$BPZaZM&#JXVa<
49QHDG !V6JhcC\ZF$d#5N>!C/?\M=ePRiwPX6ICRlZ$E&qpWa195jQ\n#Gek=hQhF6S6byw9ZLJh8aJb4LeHYN
FL6d\I 8C:b!&6$MLQm/VFGD$hSR^q1&e4lc8E=G8&KbCpiL:/Pc8hRdF9nHtBiW+T*<G$/ly+!T*JDl>yGbb+t
XNeuCa Fj5&9M5XdB=t!Q1cDFhuHeMamFb>q<=qq=e%:WY6wm^LwWhtD&lt$H9ibSIR8WbL8iitnkTZC&nTA%VF
winjMa h6GS:bkkYdw%!$k&8VNp6WZVB>ab@K8DHc%<HumDnbB6\D+<FG>lw=th:IqI&T/KEC5wb*pq/<:qWCyJ
G>ucw6 LF+1b=PLHp^K/ZQe<TJFKuLt\$w5W^t\#BRGWCXGNViH+K<1LwVuM^QFP8FI%^tYkXt+RZd=blpmn+/?
uGhaXp H8mhI!/ZLqd>#6GlZD1DAuiGbA=mBdm^BuaSYy&BY/e+5HT%ZL+tp>:6$DqJiMB4Zl6aW:c4/6a8:BnL
Q$kSq? uptQ>9D%bZ^w6LBqC@WuQKbHH6^+\uNVX@li&eXt$5S6/APaPw8?LGak/@njpGlIE8MF@D5S=++KCtG\
q5ewD! #?e^J5V!yI18^4E8khdXayKn$uQ%C:^1ukPRLM=C:mAmRT%bE&yHeljG>qKanL9w\qc/PlV9J6EkM:M#
kAi9MA K+JTXRRp>uXkFJuIGS9l+T^u>?c1Mmhd%bC1^TRBi%&yR?hIL9&QkpBcl%Gbn8L$%E:aua^/TP%L+WBT
he?ktn *+:nTTclZ:ZpiPl<^5Bm4MCw:$d%5%lyS5em^$N@\Km!9?LZG*YZ*84ek>#CedlM$^\wVt*FYWFmHC\B
qDC6y\ &be14?X%>B=JacLH9Qw>R/ij8tkX1:V&Jh8?V/i!Q\4P?qwuGdb+E9=X1RLIJp6NPE%m<\Hw:hynQk@b
+FJNqG p&d^:M>CMlNu!w5M>j!S?u^9&q+GqhN/cL^dBe$m+A14Ja6u?PEQCh5/Zc9Kikt+mqy6#q6pK8\>V%w/
14XLpe n%Reh^CawDGY#c1t$:9wWD!/5udFVCwNJt$iCBc=m%u&yp9V4IWNKGk>Hhj#hB1:&QGZ&eWJGa&\H6i@
4HHnBR VejlPA%5yZMe:4nkyYVTBe8X9Nl8mcpp#k#9RW>KaRRZ>C/CyA1!DV?TD4k@!:J\&4Lhu5>FdKZGiABd
+>$%!h <S&Em#bZDBYV1:8ShWL!8bceT8TeT6bu!:ppJX=TBy>N*EyQ:nIG>d\$$mN9epJdCwW=tqSXNji>Q1i1
wKcWPR SZ!B9!H!bXXR*K8Z\jAVQF@ndnq&K44jXl&yhXYde*Td9XMNPnycQL^AH*ji%pdCW=B%BWlp9wbmEpRt
aQ9P^m /ew=#5/S^BWhR:>8:I:4^n6SQhPw%&h+Sc@V/D1#jAR%Yc\a&Y@yI*EaS!SFp6lFkqtVCyu:iy@H\D19
S@ReSZ 9+hbFy*DAaQYjlmedR9*=h5pL96$d?k1tb#GLNSeP*y*dWZGEcP>VnpqQl=?DqE!FbwL>VLJTLiBDEDl
IqZkMk l?bbL>t@!*&1HuDnEtyX4+jXC*N\:*lDkFm>Qui6Cy?QqjK#uH^&?XTeHBI:SQD@mmRT8Tj9/PlJAL<m
4T#1NW ua:\?Y5h#du+J8TtqD^qT5p!dFt!w+1#JhRc5KGkDK8A6i:ajE!H<5p4PylS*RDqB:tpX%&npJl6Aa?l
h$maF> uZH5cpVBqHR&MNP%Nd6KZamMFic!MhmEkZ&a!hSVHA%uZW?%$h#d+S6DZGYF\i8TdPiQLwLE^5&Jb=e%
QR%Kej SN?\=YV$qTydT5XP&C?4Sn4KMbQM?=Gwua6y=yWPWdTykALnYFDK==JlZAZq5tAy5?^eEMSjS%^!9ewD
VIy:Wd //H/eK4T6i5bu1y>%:P=6CtTT$C81\pREdCKeR8j1@eIa&EX^Tq<n!5*/hlk4Vl8#CmCpDP!DJCEKn9M
wQkIGh /lW<%>!<LP*Nj5KjnAb9eM@RtR&ep8:5+BTb+aS&yY449e6!LQIHT=<J#@!mS%j1YYE^@/<+5bkLmXY%
AL4%S5 D5SteAPJL/KkkleNc8Hw95?c!\ZF&Ie\56/$>RkVQla?pRT*Kku9C58uPC&b!bd+alTLWu9JlAyXu>GV
IK!qP/ Xq=JM8YE>mePk%T@?p%pWVmjeu*PFkyY1Y4npP&1lCwF&WZnpB%?Q$kGL5l^<P^Vd5:By@Yn=<u68Dy5
L$e4$\ Z=W:>am\1$S^?%@P!Abw#5Hb1b*k^hVyVW<1tj:EZ%V1F:=b==he1$#$Wck8Qid$dtDm%nHRpCN&5be!
1@Z6I* D<>IHL&e##Cyh9&yWW4VKu1BCJtP$?ccYdSeAhe\c+dFwG1upX&y?dY/h%NMJ$wZKtyM$\iFN6&K4EWX
9#hcc\ Mt+pI&SLimJG/q%PH%8aul^TmNaG?9e#GQ&L5?Fk^adNZFQ5:p>\QEq@Qai%+cy&\yEkESeGZ8*:DG!I
lB#Kpn a8ny8ep8XYT:DkK9!bN?1:JHBLp\>pQSWcc#bweqLHlG#qllX!i1kel$TMp1611e^w8c^#tq/>%Q/K@w
aJ!bB% 4?p6^&ipuKKeWSWua8B>V6qFYiDPLc$=9lBS8uHPT5>I=4Z%JpH>w#lh6VXkeMide*CkP6<ldCNL$9:H
etdla+ =+Sp!$P=qA#Jh>/YTb<lui%J@l*MM@DEXPYELYjD1RSdt=CPZIyqjYjCa*RRW$:5!G@XbXdSkNp!9d%Q
ZSt#mL y$EBjGpPbI^e#T#u9ZnFVFR>^/#VE\6K<%\XJ^qNkBIn^$9u:l^>T^*/9IkNI#e\m*T>E*NCZ+l#b/Ye
ZNBZt$ K!PqZ^Cjk@D!k1^MpEYu6q#S$SHMP+wmL+*Dc9=EQV$t?5eVkl/YtI<$XBtV^mw=w6Q/5Cw/*#J^RZGq
Qe@J>% 1DM\t1W^$9&9Sa\T$ji>M=yAnC5uKimHK>1Q+Iu&w!CLKl>mP!l?wNPCL*J9tPqc#Ml/W$=KcAkndTYJ
ww*:1< MT$ubYqGCV/wP:Gp:u^Jn=N1?Z:pbimw?qK/D^h$D5<G@F?Itn!R!dimc5:CBVB^6h1FKki>uQ@CiZED
uBXaD9 M!@tXLZj+Hw\P+kPhe@?pYLw<#^ik+Xay/Mt1Hl$8Iciy*JYqZK!Pm@b&aIpucwaVqVJ\t4GQKpJl$VQ
j><bFe H$+JS/R1*$nDN?9ZH@LyK:tT^WFwanCnDYtWAN^HeRJ\A=pQDqpWuJ@I:I>w@?6TT^S\56Ju!5cZF+&c
T*C@E9 u8/14&ZPc&Sne=GVAGEemPHMqHlYF<e!!XVKL1ujcb+N=M45e+<PbCAHepwW/nihPeBchY=W#RHI/Ali
V@^e4* +?XMbEkY$p8%JEGEDjeWcNdeHB5*kS*?tlhbw8k=PnRR9*R\#6^DiIQT&8yNNE\j!c4m\/Q&NRVAbc:9
-APQn\ 00063a3c5d5001202b3 Page 227 of binaries1.zip
:NVHe\ T4aX^WqmHG&XqSJbDS=%#Halp!iuM/<1GVKuE46cj8$9NDVb!PLc?p:ZED?V^ATXyKRj*P^@V1LJIaL<
MF/uRt bEqX=uenk4DmQl$DR=kK5m/@5DqeM>c^S=YmGQiKnJ4n=@k%MeQEKnSV+\=hSE<b44+$?LJQ@E9IjJpw
GKYphR Ya9u=6Xphq+YEDctR!kKqlKFH%i@c$5&dE=m!mwCj8bt#M9aFt4cBebiltV<GyNu%EZ\:mQ$+c#\hJDu
K<yjkV /uAi!8@!D8&cDG?6&m+Z#PFhHbphG:XjPYbwYNHN5cW55RN9Ke#DBMkY>LVDiXtEaVk^<1tTm5>KJ&LS
Syh#^h =9Y4bW8YVN6h/:X$\b4aSRJW8G#WN9HQau&J#mdS1*#9N>9e&*8\#&Tb*u\plGVDMKMWwpw?C:cG9uYi
#wJQI8 Pa8&B#6%I*$L%TM<\y89V/Ip5A@JFmJjicbdG&E/EeFV1it^K/qWp86G1\JZa9h\YTKPHqt\&clceVnL
J>?#uY WNP:SjGe<Aeu#=@aMIBW^JdLJS6:w*pWVuS$hl%Pl#eIP>XthYXFc6Qnw!Lmq=W!?SI/BR+wbj>$M8a#
ZND<PM 1^iy\Sw\\n&c#@M!EuJ/$yVVVjTdh$/#e?=#d89Meiqd/e&&&EKR+Rwu!H/55RyLb:L%Nmc<1IP95@\:
^Z=qpI ?^KyTKPh\^hcFLje+C&?5CR58=*<jF5PPWuuDBQ*WC=q#Pqy+EkN6=S98EQ99DR>5F>&5Sm!/dt6?u!/
GiEBe> *C^&LPCTyXQECCdJ^Z@nPwe6&IBa1<%JR&NNQIW&Ec@IiFXn8J4qFA68S/<GlFA<>8$6<lm\C>=<lp$6
:GPY=S bBhe!<XJAHmMtX^J&+YM=5M$:*:qJMR9P&H\md\H8#ZlT5u+dTGmZKQ/yZXPT#jq96wGEt@>aX!K>XI1
&$I&4y HVGCd++1q*+Z<*Z+5e<6VDAG4Ze%9nX^mAG:X$5/cH^q#jFFyZB^<h1&=PeBS%qiHJTSdLC+Bky:@bFZ
Vw4?#* =L+jQ^uy&VR^pFc%S94K=DhjX4?Z8t4!#mlLtRPZ$nEJQ\>=Z9VH5*\abLJe8eRu5GK4$lZ*D>I?yE?Q
b?ZHZe Pm+9Rt9Y8M1^8h=J/ujy5Y/ZE%5k^%DM!Da\SAXl^YLXV+ZQYIT&a^QmSNTe&pKaZy1@aL=9Vi>:uARi
KuXi&Q X8KZ#Ytt%K%pY1C%$eGd\j+Bli\?X5*=NdkCDAwRi*C9bpjpn5>Xp9BV5%46>hpdG*1*M+iCCHqpeG1G
icjRq5 QDHG#ZqpA!$T81Pca?<m4uq+GQ@9XyKu?V/kj!/SQ6Em>6HX/:P+iMjjPk1*H/+?nDSK4LqYA:p*dR\8
hDK5Jj HRdB$9^KCjN*>F\=+Q<Vn?j64PA\XLZkiy&nDw@eupWyNX\$QHSpFmSI6JLhXGW&AntFH164p4VNeCF\
^w:SG# 86:kJh>Euhab4FV@FjjwJ\d\pbEGFmNB9JiX:@\8n?:m<R<WAqKp^L&dZEHABS$w^&1+61bWL@E:LM&Q
C+a4AK 8jmSCJG5y#T!tBKFueQ$6G!H^!54d^cV\F&bt?aTSY%/K/4JW+>=XyI@>I49C>N\uFG%kQ#IBaKlCBqF
teDLy6 ZJQMkcY1YwYZ#utTKKmJLcBkdEG!nPmQ>Vn##9CEP+P*h#w/e^WhpRP*c<&\itIFV5HFViMSN*Ieh6bY
j1tWwX FJiqJN8pXTKcQy\ByC:Y!VNQm8uMj=En&*6TV9YCn!BG=91+T=n!BuhTG!lW6K&<18VJF#!B@M*P981<
G4Z^d$ hpDMqP?n/9RC!S*w#ic8Lin#Elj99JlXj4\>$n\I1+Ra@c@ca/@we!G!B>W*QZ@5bb6E%!N+aqj=M#IA
&q?&:c &^q:y#FiuA:Ae8eE?cN1lm&A!:Ft?R4>8qXqh/!<8Ga=W>4Q#@K6tyVRe\1c959uM/1=N/:IwCR>@ZNY
V5X/ta Be$1>q>/BET1Yt/8BL18q@=^=6DqqGKp=#:1R6mKNTVWX@1>Z?GS<GM6VVb:c/n99:M!hV#JFC44=QE#
NDM?Yl GKb*WQ>Ii\GP&ZJ<BF>XblAiQPq$\wM*EBwkhQWqJpJ6KL&\iwNC6nE=GX:G\XhRnyVuEFZNquKbK%h8
XP*\n4 E6VM!+SAX/a\<y^^X=cy4cB5$#NcEa=D$Vukn!jwH?%tE!8R*jh@h%VNp9bnu^#J@#8w9wL#bV=/RVc*
A/cNLe C9QphKFe^utN<>nJYbQEB&@uhHldJHEnLKIdcR/KA\kRZFeJk1w&HeAdK?6Q8Ghd5Wha9=1Xm\<yuhE&
aMDQi1 <BiV1Nic%9=Z!XbBSwSK=Vn5J+<$=dT1W?lVY9>X=XILM*eQiLShwALeZ/DQD4E^IAh?DbtNRJwm95V!
GkC5%N 6k4AQ&u!5M54d8^tYMM#^G!WN!cRX$AY*n1FEpH<lb?Z&i<pjNJ@5%phNWQ9N&6PpqwT5nQHF^qX99aD
F65D>% *IMAJG=ZM=+GNN/yuc$^P!CC^5&BAKE/mj6:>P$*MWPJpJ%VT$hHeaimACJcKKqGkZ6V6*YES!hWeGP!
1j5Cki A#pJ!IA=^9\4ZS8e>I8Y4e@aHq:JCNjKNL9l^?S/>S<c<4Q/F8bDjXG=VkDYmpm6MeMKhB<ZqPnAeB1+
P9RB<8 apW:NVb\%Z\jX?I4D5WTSW$\E>ildD$QG?NcicXDF6X$DPRpS@nXmCZeakpV!^<%a<#J>dMN*!M>t=un
t@uh:$ Qaq#p5A4&RB$h1ql:aJZT>kMN?I$/PV1MLwLCM#bALpJXy<D^+yud%+ytIP%n8J/EBDIn6iM1kd>yuNN
D<J6SE 8:4m8bNd%/QPVa\<=ZT@?NT<^Eijy$ZAcFI8yu&1u<PjC4l$hZI:4yRtpp=8IXI+@<lI1@d%n@=q=Wwh
G!L:qp W#YB=@6E/*q^IncIC19l1:wY/1Q+>mlam%#5<Bn^DJ!KHiF1EGQmTJdkLtM@T$IHaM85dPKLJHj/^^p>
*bkNjL R=8PA>5ASQKEJ5$X$4WXZ8/y@LM8NwclRFA8/t4Cdaw&X/*NI1p/Z=5EYwD6q5:Tke#W9d@c+BNClkRD
A+h8eh 5:kXjHJt:yZMqS64TeEWtkKk=da56!KN6>aXA$<ilQQ>+9SKi<!45AlhpqEjPu+lNM<lwXaccG^lVq@=
d*Z:$p XXI=nid@QAq5lXZmP:1y#!m&Mj9=Cac*hd:8i>^Q/9A5Aaj$6R/kcdS1!EX\qm/Hj5lA8dNTG!eaVlwi
@!?6#A nKDl?K8R^?MSkHi>9q@W*?GS/LMp?1ymk#lDWpipA!uaVX:Rm91$PYn@heaa\l5u14*tC5Q!=IwB=WBw
%9PGPC RTB6@#ady<Q5u6XGY/&kjM%>P=P=Tt18CEntZtH8M@Cqi4%=uj#ICku>4E!NQ#1/e/X4JwtGwTD/C^*P
Zwpe5+ Dpqpitjk1H\C%dqqj9DP$ktqQ=Qth/d^S5Q/@#mVlk#<5:@kEP%KK?weQntWCcakBC*h<RZq^%BMpQw/
Qi1tqe IAe#JWjBnDSdB/VK$GlTijTqD9$CJ>IEXkl9<qmCAwW@y&jHM?d+iySCNYw1:!%ZnAKm+9Cjl%#m:WJX
<M<lT5 K5<8#X&4YlSa\Sk85MJL=PRk&hER*+Ma1>b/G*?Dy<8aD@=X=?TII\/Yk1%m5dSCWKQSl4Ai=Y:a&tn@
hb5Ftq kI/+tiBRhDRVZnGLp+LWTjAn>a6>K\6^m?1Z!8NT65\NICbe/&6V<Y#qYGwuuM1*@b:tqNyub?dSiuY%
P6X$+$ hWDu<ISl*@i+#\YFkBkHne<ESuZkj@CE4?d&9\^PaC!lVBKnL/D1B8t=+R:am^bE&%&mptEV@MX9lj+F
E$qK&K FnY/6qnM>BYFPImmw8y4HMNC&<t*C51\545N$MkVH1h#iK1RY:91adcNhAb!TP6/i4?+Y?Q#eL!XW5tY
R\HXlh kA1R<8*Dhcl<p=T?iu*q?9WXV@/Nm>Km=Wq!LSF&Q$Z<IXejtXD:4&TWSKL6A*c\y+<qe!yJNbqY?Z?n
Nh%mjl %>!tX&h@Z9tGe^Ahp1A:uWMm:tT9hhF+TjND#ykWVjy>EP@HkdEje59Lc:+i5mFV&#Dq%PhlKS/<==mI
\+Mee6 amn&EAJuSPWywFZN9C#WHQujR\#W4My\^lXADhE:ZpGMCyucHCe$diS81tH6Da?%6kHZD$@4?X!A!Cy?
:NyeY@ k/&##5Ph/5Ah6kXZu+A+lPdXeut>$>HSLEw*1uPRjjM/*8\XL=ASHQFlX4X9JnLm=MiM%q\qcK<L<<bq
DQdH^Z lVb^8ZnLw9Pa#$LHtKD^%9E$Au$cVB#99>Zl/Fl$@59KnE=XnC9je\Je@YE:RCD6WwAk#QDBc&/AaaLQ
i\bI&A ?\Em4p!\9#<MnHaaFHkAkii9E>Vkp?eXlMH:SHAM\1MbjRkn4+kqnk\<pj@jAKRetVnF&h<XdI\DI9NP
:l:AHm R5eL1yJpSlb6nnhHe?KGa%XNjhk8/q!q/>W#NXnI%:qQ%5MMBJVAwYFRdEEZP6pWe!Kdw++Mp9yCb:&J
:W=*IJ *yl4emJX8:^?JL6DeF=4X!ZYPV<S=:R@HWq#c^pByFEPT@p5&9CLIR<eu^#Km%>J1^$#Db=mqb9&M$eX
QHaN$h hHkhjyPeAMcHwb16^wT#\T/kkbu@>IL4jwjuV8/d1MR<CSMIMB^1*jeCwn%\Bd:SBkKF@1\?AF/pCAK/
8YG%/% R9=&:F>BWqMpcZ6I@dyXYR4yaHWHd@=!k$/X1V&1p!l/45$#4ij8i+?ui:B!%Lk\9%G::8EV^6/\TVD?
uXLKHl %JJVp+<+dHiqZPdmVD1B%$uYWXQE9<I&5XJipTuZ+XFi8mXH%yR/y:=WM^>F\H<TQjma4<I#5<ppm8YT
V<iJYT *w#^/6e#t^m/wCiMMnS6SMj>!?iT9?lZF4%AQVpEQDt5W4ITAF8Pc#/<AEKABtD@kD\!ueSQ>6Y>?Nq=
C:?Wua hEqmaEGA4mn@caDThj@bDQ<JdlyHp8P#WF/8CicJjm^jd<hABQyNn%jWiL!eE?<4PBNRw=wM1uihVphX
8Bd+Vm 9#9L>bY%Y1ZtJLpFQh&Q1SGeA@*Sh/A*:CSkG4:H!WFjp6B8VaJm#9%ZQawNbVKKayjkEVXm1FLZ#%SZ
4?SckA bFcVJPi+d*KTq+@T@w/B:nKt5!GWPw8V+WE+84pTDYaS=t@y6SDY4%*BDKd<<:?N$/!dmaMSjn1w*JCK
q^!hl? FKBX=+p9HIp9APBCiC8GL?hDh8KncEb+/6!>+Ch$PQiiwW9N^\E>I%LcI1JKbLY6ibV!V:b$<5F4p58k
aY\/Hm $^u+=RS=HKRy9/P*YtL%dJPS1!dyam:I5>5BeX4CLLKZN%t$\9:BRSHJ\GmaH6Z<C\+RqSTL&<9bwB#$
qCt\1V G<kNVT$LB/J1y#CF$m:d:Eh+VX=F4Vi9+YRI8Q+Yecc4X>5aYw/E*cHl>ca4I%<qiX=ikmDupA^4KTXd
WYc#F4 KQSk1F=!cX?8@G45%p5e?j?t^EWqReMjXc:k=IIP61AEDAiphm$pwSt%Y4^=Hb9B/\$T:::1GEG$u\9R
EJn:4\ 4/jIw$hBmciy<ICJ&J>=Jw+>Iuj^86/BLa9ubItZwLm4kESeiX=q&Xc^qlXu$YVpI1FhR/GS^d*ASGPb
mP#WaL S\ucRjZ44Q+6>t@eLhm1@TW>KI*i>i\wtI1DmGhmJ%nR^XGlbd6e6\Tuj1FD=*Ch8P5Q1qX/Y:q/=j$^
anHTeT %&6mZhT/QW+S1JIptjWYBetCqq=DBe*^kXEw15%mRtccQJaVQZ+8TK^PdPXjcy15?hW9iWe>C8l=lQYm
&5phlp m@Wiki?\tjCCp%1hpc!l6@llD#Ha%H+uHAhu:/G#PRmi+8NVPy5YGW8?^Z5SqD@\nPca4AI=yInS!8Pd
K>p$XA S1\\%XMpIT1CFC^tS1%ZdiR8<y\I%!Z41Mn%yPTDJGd&D\K8N=V:dP?%Bua8pL$$HQanhj/?YuJ*YV94
b*B6Tn %bJKT$LAFTu&H^&bHWK1%*AKQ!CTi:%/M&M84+WhTYwE>mDyJbZminaMJX*HY8+<4m+hYa@C\GSW*8hY
a/RaeQ QPuR!TcSwE1e?L%MWnd^YbL?VtbVZTM9m1cyXPaNLJnl9aqmGdK@8M/!:\Vl1/Dw<%Rue8WGWhh+@Z5a
-ACj*! 00036c79282001202b3 Page 228 of binaries1.zip
6$BFu% @Lnm/Z&Y&ldaHB!=d=QMy5iGeh:qmiMiCK/Dhi$wkHThpSZdYdS^K86dVl8bYl&q5V+\:a/PDnBC!8F\
99&H1D y^=:N@E98KZBSpLpb&E1?mKjPdVtDY^==D45n6+IS4=n9WpAJahAAj*NH5q#bc$n!TW*T1wdn4YeSPR9
K*btaT nE^ByI@85dPa/eMX9Y\ZJV*&BWtL99dYWw?j>kn*LHEahCA@nJMSl+tQ?k6Plih$$eX9&VmWtp!KI^$D
*T#w<q #?J6hXQY$BAQ:?8!MbpM+tHTycjYVY<>#?PMmXLq<Lu%!9<&y+C+4:Kl1+Ie<S5%4t@kIbNiXdqbl/Eb
<I^A?L Xi\L659H\hhkCKH4GKS54+XHl!S$BB%i+\LyT4$GY8W$jA#&WAheME*Yq?H5ZwpNn*i51P44VeKuRP@A
NYt*aG P#1K%Vy^/B>\6pNXV/%eRTY8:c:n=##^lwtdRGCBp9ET#!#q+bpn5<mdbtXtcYwIyeSZC=WcJZdA\+NT
buS?B? P@kL>6ab9u<dYJjYDqWk5bKQBBIL8c:Zu!hj+ZPh*DABV!eMb6Hb:RZ4tNZ6#jHkcLBdDHjq!E>^iQ$>
:mDX=I 8M!Y^*qbN!q*pPy?TR/lD\=VdX&Mq15<6&I*dy@\PT$NNpjEJ!I/89beAaD<ll9Z@kaT8:m><AK\Q*Tj
ayEH\S /6nc%ajE:SDRikjBNMV6yR$41wQyPD@k9DX=k^6a5t&S9%lH<:D9@L4iw+pk^=MQnM\Z=t^SD+tF84NZ
CTEQV& @tyc\<Wd>/h\@=@Eiqi<y1?Ri!>X<:m<RL?dZ^9<MYIIKLt9=i@LX/w^m/@RZ$b$>6/A=:YddeS&tG1A
BpDTt* ?j@tW/K8*&yBI$En+h6q#l!@!elt?iBG6Y#Xhh?QWl5h<8%ddJ<KZF?!R@S@<\mWw8%&&9BK*wtGBA&p
@Va!A= /YSjKum4e*AWiD4DKl:G$#jBIF*N1Fyc\d!uDt=m5Nw/cqbZXLXm!+*Bmk+ALMe>iKI/#tmC?JGMJnX=
WktTE^ MG@Z:EdeDbunnV51$jJjEVy/j6JBWmV$*#HVkP$#p9hZ5yNDLyl@!#:E/N5/^6<!$Q5c>Ft?EnL\X%B>
Y5d$Ct qukL5WGkGYtJ@P%V:MS=T9H#>d4QLX*E+4HiTc:%?bbH//He+nw%4m5pHThSX*:BBlud5V5DRhj1:lDn
NRYmXy 5%dcdZwPBaebpF<LQSM>+jHBN**h95eqhCmVl/AhZ8I8\pTJ=?EJ8ZTpwKDK+5>l=5$Kd4\Kh4Aj8F#K
TA*IA/ H9Q\VEWleJTJ#WnQwI=a#k4XY\Zb6cN$<9tX:yQY5+Bj+p+ltY@:?*4kTeZ/FGXiWp+^VCbkeH*$Y/Wd
WDe:85 c%nRYNPTVjXcWIZ$81\%HGC8GntEBARcPi=e@T:&pjp6QyK/6k1TM+>V<aY4C!qpjE*$Y>YWc>mn>Mb$
C%*tQe yJM4kL&a>\dc688C9N9RNlQnt4I*%64BcV^NmyJdXW/C?P6eK+:#W@SDV*wI8mF=D!1514P5^4dFCcL\
b\QlEh 1Q#yi9Wc:n9=H@MadMF#NEpVJwp&ASMq@a8^cZR@^?Y<St>T&e?TZ51E\+!pd\yFV:Fl@6@TIlMw>mHZ
@LDCt9 j/bn:?K%:^Ni?k#h#4T+SZ=?w6#+T@/T@4$?d5RNp#C><Z&ekAjP\/+YQXi<ZSMDR9tKlHSd$JYyIiGH
4h=abL I#hJj!FncbN=1DcwnI\1!cQ&+?yNi\*Z@4=:=Y%uye1CBZeC4jh=t$HAJtIVX!E9Y=XLFwn\#AyQaJY/
%DwbiJ uqjBP5Bc6LyyQ>h#!#CWStWIIEmF>h!NtRLQi/C@\CITZ5+qSbhT^mQ1@DK><mW>9t%MYQquqYJctNLZ
e*eQCm tm>FIK4$t<W4N%5?J*\cCS1uty^IhpJQEN/!@yK+j$P?5!X<u9>@Hup8CXY*pjV!JEAKLe+RGZ!SMFp>
YtFZih 4BA#/BI>pnwbpuSa!tFcYQFd^S6+jqe!yuuq=p%+Xq?taAaBTqMQP*^=wL#bRGHZEPaBkZCeIF\twI+/
PVY6*M QASLMWi9qyw4Gq8c#=P=8jtpLawu^jL+AD*8lKCnXJBGpPR/RP<=?+wH6E>\?RiMF*>GpN#q815BYYCN
CnZicw <Z==LhFM<Zy?I5jn1y6mNbCCbHqX9qN@X/*FET%ujH$bj+XiuBduHeA?wq4ihS!Pq@NJ&n!BB:%HmC<6
q&FYmI Zplh9k^&Pa$lS&?:Sh/TWHn:J1@&yQCWAPK%A?Smpe6BGBb+tqW\By^4&uc%k=Y=pq4&?F<IG*katV%k
lPR8i6 XNA^VmcdKa:ST*Pm!B6iPNRybQyt#Hm5ppD#e/*AZ&pwa!D?d<$$Z@\yP:95hKptm8Hm#F<!C%ji4+qL
RpX$6c t&m81Pk^#SXB+k9?<&Z?llcnd+&XHR%u4L8eiQadtq@RH%W6n>TZW@tCu8FuQNlK@I%lDcCwa/lRTia6
>E@k>G K*I@Stb5#lcKN?nuRaK?Q\4ilu@n+CtR?#?=DeE>DAW1%94SH*Tp!P>wHcJiEck\t<VVRREtjC$ne^Rw
=B%>l6 Yn\n\TLEmXnFFH&XYj>bQZl*V@lcC4T@P<p&@pLH/eqWntFmDuFStViK:*QcyD+qSF>Whw<E9NjAi!QX
XYCINn Zju!86dm8pkayRwe/JP?AlB\ii6^L+W9uZF%yZ>%X?:m4dSiT?Iu@hSS9GJKQ$qS=uV^Rm^?^jTC<^pE
?l$9#Q Ct>HKM+lL+wWKFKPLW@=d:a<$p&uth^\C/ew<:lIVthqPwDik6b6=$WTD!yPGpd\aTVeW?p$b=QjAe8l
*Yh@Cn iW^>>@Rkb&:NjyiVl5<qHNeMne$ly&5GM%h88K1^PAGAQikqlP49J91/J/JPH6?yc>FKFq/$%lGPywMR
e8w=Fj V4YGNa#A\i@WED9k&:P?9LIZ\k1pe+yjWk^JbwbtVXbE$L>ee%&?NaTm&nXlnhm!ZyMp9T&mZGFJ4uR/
4+Ica1 Wm%j:pnXDC=VXhZ\Zwk!\WDHbw:qbp&Q^T:Iiw1bapdZD/Mp+!u9dhEiq/6n\5S>@b!BXchBbA$EcRn>
1ElIA: >Mn<jwaM#SWN*BNF*Y8pelPy@5ynWXRcc/ASFwIe6Vl6&JL:X4=\+6!8C&GKpu/qTSew:6!ptDpy5B1W
+BRQ!B V=ZKitmYyDyXJwi%A?SZ$N6bWB#nEkEqkF8S<p4qFVE&DDpPV%Y9NAWVSMd<ccX$I*#i+X9Tw!hiW&cj
YFXkje MlZ#iwt8^1XVEqb$#aKi8b<y/Y^4^CMqI4PE*VhCGSSZwQLdpZW!4R?VpP:><bVtS9KJJ^<P=D^BjAkh
M\$EqR *8bmcaK*P56:V=B*D>w:ndnHHye$*t1<+EAPC6!RZpWP/5AX*NbR^=C9EkZP/WZnlm\dL%8>MyhNkTGR
E\T5Pi Iye+m\dHZWBENVbqAD8>%l!b=&@bpLZ41<MDm1*4>H6A%Y!pCy5w=BM8kP^y<i$:ua+mda+QP?8w9tq!
m\DG^c %:#yPj$J@pK5wVtnA?XCTa5/kmFSAD$G@w1kJX@$XC^jytQ>TCZ/4E6XZ*GcklXdcy8t<RiEJHP6tLq/
IbP5<8 R:RdeLAu+6&n4@ecp<hE6T<JTE\A8P/#X\NT<J$1!G/6XW?uqZ&XBpJu$*uFYn@\^dleRJWJ/l!m$m!j
$FunnS Q\>i!BT!w65uiY$aWyi5?iN!upJnQ!BB^mwPb8FCA+X:Ca&$w8T1?5dNK?cXWb69FyC/aP!RPmSutNdH
LS1>B\ b4M5B<uN$T?QTlj+<qqTR#\/AZ*V?QW\LMdmjXuFuFwww8bIttmM?W<=F/j96ZYA\ZGK!R%Z19T>G&=C
bZVKba !q1:4hVL%j<#n:hT?8c^C+Rc?*Ju#X?4Glai#/im@n!bP!V1ZDkta!uqmdk4ZNLC&Q%6FwdEJE\&bwk*
Wqi?>i F=cLhwk1Ld=K@m?iQIN8Q>9jZ/@^NS1E!>nMi4%!w=C=ilXb+CPimm^8pMV5JBZI1tTmpHyGNtNqEV@Q
:ZqXek <jW?$=tT^81^tie=VZT/lWT5j<\#>9XqJ&V<n=Y8#i&!mE8VVwT8dFdWnJBiVGliV:bTpG=D#CC/?LTL
N6Z6l$ Q@n@tei*y+CqJuEkTDGcuP5wj@Bd4Zt?hEm8A%<^ZA<%XE<?eCXDZJ4l\1pTb\\WlXy^Me?Wky:ddJh%
AClnSd myGW@t%WQ8WtE^WPn#1?Z+@<PQkYw*EmW8:aaLt9<ARTi+%FV1Ci=\p%K:wh6KDZplXl&uES?p$!GJjP
Ai4@mB +#I58RewCJRZm#\PRF4AnQJ#!=y5=$l8pH<9Fua<EDnBHiWL>yTVwZiyJeHnwy$\L>BF=8I8?I%hyul:
wW!wMj plHcT^uHBLi@%9mXA!E5$j!++cqYwV/j=EjwpD@VQ6I1H*>\>d$8qwK<5jK+FJLSDe\VBVbj#LLuJH5i
GQJ@QF *WchVuV$Lc\iDBA=jiC:XY\XY5iREq6:\S4:S<#k6$:bVlAh^i8Je9j=Be>!m!FLMyPNWBhS!JX!iq@+
yC=en& nNd5EXcVCX4QcQDD\P^Qp&8!MMu1@#PXIElT*N/V>1apMbV$XIA@a#JLYT?dk/!J1Lljd@t:LFyTeX?V
:FhT4q FZ1jCQc%FLW=#+ECh6^tNlw%LJAh#?i+8ThMn%dY^M?Xj%ZYEn9*$LpIDCutRR6\>HQR/$J!#RV%#\*L
yPhJt@ ?bX&5\t*>&$My%Chy<VY!V<<8^eEpDQuQXGjIS%JpLi!!4b:kN/A/>Y1P=yK@+nQ+6aM@Ha/<Ln<8tbE
pJCFF? 9K=A/6Xq#?RWaC68WIKK\<QL^Hk4Zd*nb1WeDNQSAC^=TYIw:V1#$&1i=<CYZ86%&j$pcwYua6pEEa%h
l1P@YN uju<>ei=NBBH9lwjEAXGLQt5>QJki?duLHRV^Z<bHm<@Ly%P%>B4&B=^Aw^wmC^V^#>&!>?$%:^k9*Q$
/=QL>Z KTwQu#^DJc9uj>D!Eb@w\ASieccJw6?tP:SmN>hi>/=:@YRLAYJLalhC$4NahAYjwZ?=VN5beVIbMH*c
M!*qc9 ttRuYC6iJbpY*jtn&&FI9u/GAiTaYCP6+@n<p9MbW^TIAb\WTRtWwK#m//kp5q%m!%4II8lJlHkC!5%X
ZAnp$d EjmPWT9D\:^+#EelKSF?QwE&K<pDSYXWNWZ<Q55PmT?JtPq%be^nuNHhwVD^L9%j:qwW=A+@QWIX*^9%
tEu4Jl Glpe?WnCC/=l5jtmum5tEKeR8ZVe6ZXuPHq=mCppe$q?wt!m@jSCNlqQuKK#HMMWtaaCj<WKuKV4GjXt
iCVbw! EnZ?t/#GA!TW^VG?$9KX\yKyGJ^ZVkmnX\!Qp!XP:BBKm1J#6+Wba\&@&%AN\?iby?Q/X@P^PIKSy6Bj
Ck6G8e <C&bmikpw:el!I?bBRAu?aPS!YuF&WL!8qln*?Su:4whum=hy>MnLNwq!/k%daIEyIK=DEXXm$$kBGt6
NBISuM HiqA*8tu*IwDlypC^*ubWVp1u<!X6e:!!9E^N@X!JQ&/qSLQ+^>E81Ge$WmGdGG%K#jeRaLVVZhli9**
1CPKe8 Fb95CFGP1FcJX\&Q#QqC+6?bXYXqPlLtVX?=iiNG=Mc6k68TS=E?%B&$i9@=bE\DidyjTQ+9iWR/?qiq
HM\HLi C9?<I9SFB\i!N%4^XWVM1aMbjS5SqX/WF=G*h/MPp6aaXF#j4Vi+=kwZ6wK/WNkc%?1T$F%>9\dGu9l&
mcaVD5 E@\%#9AmHnyn\9@e8DTjpj9WlB>uT$qyYyJ!njV:CJu8cYe>mXn?tpETJqqYqQa@TZ9ZtCZeV<R^/YnL
/e+kdC <:lwkn@<<yDWLB$?FTHeL=ZTm5QK8QIL@FTPMYMJ>nkuT?EhedS^cW+TYeYT48Gmq$Ft*+9M5i#Q%XBa
PAVGtP #uZL%>Pud?>E#@acVw*FtZb\e1$WF$%S#Ph\64LpVXX?^dLJuTh%5uim=$#kZy+6qVue+MIAXqXJ?9AA
b*1w@k /WT9>IhIl>Py&9aTmQ*4R?Vc8CW/NZ?XWkqJ\*W%#P1d\ytMJQTGTJ#1pK9EVa?I<XZTBM@VM1JKQG?R
N5=%nP jww5p^qnB6>?96D??WXcE=e>X8?n4!Kb4^Sp%CH\Ai%mw@L*bSc!IlbYj:jSTG?jyb1!!c^A=!RRhnmP
-A8KCB 00048782798001202b3 Page 229 of binaries1.zip
G5m$ZE JdiXi968ph9DTbS>$5ubdFpMR#J4JRFSwX/Gy5cYFF%t!5LCMBE!L<Ihy$d@6$RjI/&QckyF?%NI&y<5
&I&@GC <tVWl1<atkcTM1^K$XS9!$nKuupk!C>+m5D<bQ:ue$GhX+!HJaERZeNYt14h+X<REbCTiuIYiAc1T<Vn
+@1K:i bjt*ytn:m66S??RBc#Xd9BFjK=Nm8qX86WV?LItCW\y9yu=ZpBS!HE!W5/k#D%w=$!GE!nw*HVEpZ!dN
X:/K&D q&Y4u&!miZiM&!HhQc:tC@JqA1YFia&64^K!qYaybunZa!Lhp^Kw/k5VZ4S1apSDLEMcjm:?Qlt%B4QD
IdGKm9 Qc^b=wEWjXLRe>qmM1W8LWiVH<:wcVJ!5w/G=PtlwXu^56?!X<Knk*5iK5A\llmX>eE/B<R4?MDh>H#J
M8\Nk\ =9B<kSR$e*mm8V+J<^ThXWuuN+CcplDI/k^9!pt6BD!XL5IYS9YC<B<ZF1G?blNB#8kAPGK\VFR%#YQ&
a#qShA JcpYqW=p?EyQ=@BHuMVT/nuk^pD/AT#AteyW5NYnb>GhXDB^E\49^<8YymcYJ1MaB!#F$\^9lZRybQa4
p9*muG *SZhL*@hYqu41E/ARdYwZQF<hSm+upnQqy6*8?p/nyLC94PmYNA@QZ5#K=bPqCum?TIbk:R!^$1SDLcd
W+!Y?< PQl!PbY1F18?wR4LMu>DHND:EiQnjGZMI#:M+\\%w@&>#8kME&pW^W^=6B=Ze5pc<JtCPh*ZA<tPajS@
9/*jN# IlS@LF^WLmKaL9iTP=EMD:VKeeeXMXE8aNY!lcquPNE4Ln+p?k<!wXBSJ89cZ4BDE>+>Ku@91l5iBy:u
^LChkQ amyVeG>@Q&l!$aM6&b9tCt/cpn5<6u&>#IQdI45paV\N*CXAYWNAKRe:!CTA?B>LjmX8cyL@GJcVtRIp
BQwJm+ *9<1S1ItMj&RbK#tThXI9KuXm@K?tw=!Yh&RIXJF5I+Mhp^Q:>lp1!i=\m*>uH?iQ1CimLY9w=B?/ZZJ
wVAd^Y tQNb/SyIjyDC>ul=>b\yF%#kn:LFNQeX@d?9/DSPFDM*d/J%4?4/KPp>TjLnLBk*:n1Sul&WXt$I8XhM
W6u6IR qPku>enw?XyyllE$k%Ie%qYWLM^wMa/%%ycuepnqJH:m>45^du#?&$kk4nh@WyC#wkty1PmL1Z!MDuG=
9\VbEp =nCLbbdFChKb\p5^CucW>NIdqV@Y4t/WLy58ytcW:u:N5VYQPP1H/b$8<G&4dEE8<LS%WW+nM%8R:en+
uMyYbS ^WZp9%=y>TRMELJntqeG:&P1qh>/?k#hn6\ja*88$^Y!h%y9NNi:+Ey/6T!lKA?GKaqZbBTXhBPJ1VTh
ityDFc kD8hiKS!K8m<>DJGk1VjB?B>MhFF\hRwCXN:AwD5P<dIT?6T=1Je\CK%y1TEJ+Rm19p@qyui!jDwTi&M
QTemQe 99cpMLPIE\qLM!p^tmq\/wSMDK+>^!MlV=t<TI*=NB=j5nLP/NhMRXV^^98+eHn18#XCVNR/hJP%IK!D
AYti#< MB5>NmeHwaepNiaX:Q4M+wnnIXLCPPu&FG$4JHwaVmpu*?aqWQqdidHmX@>=JbTe%SVCybZk>FPGcP9m
mwLQ+% yG>aNLQ5h$\M&wFY#@@JNCe!GANPyDB8cTw\^&$\ZCiS%S5^IquBkE4PmE51RBIR<<%w>1/K*E^G4@:u
y+\bL> LMK5@y<kHN6&qS>:iT+8e:=M49/bCGF&qe#?iAW$FGay^cJtYi+nGA=Hmi8GtI8yEW9j59SPtYY?jCV^
k>H^nd &cRuu+9wW5t^t>G@t:%%X/::b@RhH>nBYCSqalLaH+tY/i8eebIKpLVmZEKM5$qhMj*@ZG+Q^CN>!*H^
:EM*Qt />nMh#HNt8SF85bLVp!YLawy!6tjq>@W9=#%WVhPYuaLPIkm#/<$A+=$XcC5H?AjId8I&XAXL5+$<AuB
GSB<@E $9ejTh:FTGQc\tTCm1bdAq$lpP?WWjtL?R8XlD%P%E+4VCHySl:w!mc?!^<pCMh8an#@^#y&Ge1<wyQJ
C\JLGq NXTmwYj%k8YpX+EQ?*NGNBKd%JXwuTJIw?j&e*1BYdq5n#YmatkpIlV4M<E\JS^RJ8!S+Ti9GLFKmeBh
a=i89W ImXEjRtFMe8JSuXbw\^J6a/SW$q\/?R9W=KtE4D/VJ@IaHLq</Y+HyZk@ImMVFA?Zj+*amebc5QZ&aY#
>dXLQV !eD#XBwM:XL6?NI5mp/\*pmXYCdL5QaL5T?&pCTAHE4VRKI6nDjaNaIqTaRBR@:6ajq$dtLS#KM+n8jI
W/%FGN VVVpqSbGq<6>ED$YyA8P^HH&PckXAQlEbV:XnM4<!!VkV$8Slab?Ke>1ZPtVV5Re#$$X8E=uZCANRD&C
@A:EjE npIT$cb^ZniSCaWM89DI$69RT=KTJd9+C^bKmchiJmNp#ZTR$$!1\##hR=YF/511wn::8+n:<GXaI+!a
NWAk!> 5K54=pyC?EJZCL*TTJQXq<KGahD::*#4h:=q+L<@M@@RtM9EJ+^a$b>?Y:<u@+L@@6@tC/Q!q@@1@@u@
/6e61t P9u:h@>^<Q8@>@@=uh8GcbVV:@%*H@&#a@?jei#ubil:M<d$j@?Z:@@@/GPYuk:@b=l@qj<#M9>j@k@@
1W4lpP p9/Z@E#?ZB>8G^enI*h=i@9^%tnX8Q*=htb4+:=cMt/P+5#QqqdDdjQl^T?M:MZ&*e61Y:YXpep5ZP=9
1XSbu4 #&!84m:NGecK5VHiLn>5j%SeYCl9d>&?Nh+\N6YG8Zu:%Zd?%5dn4XXjLYZm@tEWb@>\w:t168NHah6a
:@BhaG G^k#^Zd:adH>MGwZ6^<86A*nw*b:8K%Y++*5+#PG<djN:e*^64ERGjqL&>6dt:jD%h!6Lj41%jb=?4T/
8+D:e\ /m@hZ%4!wnn8@&k@>l>5*/aj9SAd&a^^<iLR!H=ppGt$w?*T\1Z&\pYn8HB=wd?h9:&/@A*DYDW&%Qdy
^T1#ER Y>9dn>wZndZm\?*6#X5jQ++&eq9$1t/@*D/^6d1=<eB9Lm*hnQ5j1nkdNVjwte<<9H8Su9VC&Jn=!DCK
Hcd5Qj >KXcPHt=*d/:5E$CMI!L:ain:hK6^^5dH&@kJj!h$jcb8?&QLlwZTVK*6ndj8$$@jjYY&5=5dn@1d<i*
YiI4YC 5>8*Xy9SW8bt@GMX^#<&@:Abd5>ewl>%<cQM$CnkS*:W9m59+8GqNWn?<tm:8Eum&Gw8GMdjN#i&/IAi
Q1Yb:Y @XRbbwcPb@dY%6cD#W%/&>mpZ=PqF*b*9B%9^b6j&:m@9ERCm@5@nu@W:@>5+:*d>G@66aYFa9Hm!KkW
FD4tpQ M@VXyaYF!*i*<V>hY1Mu*d=LL/j+tM:\%laJ:jjW64u%YG&j9Z8S6K?NM!Fy*dy%?>dn:T%TI@!t^>p6
P41Dte PylwKi9Smc5+$%%>kAPj\it8GS?NnQMZ<hZCyWiQH6I9i9n\E8V+<QJ+8:S=i*9#>8wtme%jYKWu6:t>
#1nD\9 *ed@Xm^9d>@iY4&%9d4%<hdta@#>*e6+b4udt*Se+XL=@wj^n$q/H$ad1>F&d8Fm8=*yG\X/RYZT449S
VC$$Vb h9HT>6$Fpqd::uC:TM?QbEM9y#ueNle8K8QWw?&64h8Q6#c&ty8*d&%896#Pd>*c>Dj<eCuu>j5+GZPZ
l1=LB! %KY\<BA@A>I146G#99mRDmQeL6:FihE4ikn6i4^F*@P?RawdQ+\Ma$F6q<pp6t:Sn!eDI%E<:G*u64bZ
DDM#!I q=inyjLNPD1MD@5@Zq+q%e%jI9W*Qlwa<RK8Mi@ijVRmjcPjX4\L/hBQ&h^c9a%nPLpN/h#Y+4qL9?L&
cWVTFA Fw=mp#:hD4e#n:ajneu$6t+*N<n$K1VFQ#/M?%F<?LMNpl&L9J*JnElC4LELq<ddlaj6>pejpdRkwM&6
*ZBVt! &>6+Gd?ZldXFbILK8JC=SQn\iGN#>hdt4ee+Ky#C=Y$T\Pt6:e&NLj??9:SEGldHH$b$:B8d>I1kZRcJ
ibE4uC 1%Rp1%qdKD:c9p89/XEd4?uTeL9\iJ6?IL&m>!C9DFtREwq6d6MyQ>/mZ:H%en8*?bn5cdS$>5PwH^<i
Ih<4Dn :pi41>9dC&VR^wJSHMIR<S4\k>6*L*/$5HBySHbX&N:Eh^uG*+&&K#D#l@V>GYAeZkIy$>b6itHtyaeD
@<RyF! Pt^TP9@BiCun^dGK5nGb861P&5k9$lPN!Ayl<k6*H\&V</BjX6#CGh!mQ@+hRnwT>$KSnLXN/4C%ja5P
l$>uB% b?5&HYu&Ly6ju5!D>Cqe!neJVu=E?nS:&N#Ap+I?pW&RiD:KAA\9D:j#q>5ZM\8ZB69t+!*CCj1P>?k9
+GqmSb CZaMCnc*!@VEN/C6jDA^aWEPq4+=ZDJ9>qX<mpD&D<q&F6wjRh<@Gl4=al5&QaDaCSAZTDMM?4u=nT%I
9Imtih =*&wJ*Vmy@Vp%^=G&\W/i##=#ZDd8E!c?unLl\/h<?<9*j#^QtF+9>>dyj>l+hJHPFkWIF#EM^>5F@B1
9:*MX6 m8RnTQ!dEV>^%/A9#yPeLq*<cG*:EV*qLVLp:R*THj1HtHR6V<b+c<Mjp6aaQ+:m<k>JK8%Hc<X&pXVB
Z5#*DK LJJ^^ypeHM<qA56&%1BVGG!Vh?Ej9$#@@<P&WX/>FSFid>@c&Cckktp<w8<lW<654T/HT?eI\*<eS/TX
aj<bXj @Yl%?hH&Y9EmRRw>>a<w4t!dD%p$D<tuZZ4+mu@5W4S>q9V?$X$nW!bSA+qkB4hH&?bhPy<bW5dXDd>J
/9Xc@% DuKb@J4*Iat<>GN/*k<9E%TVRmIX8YDeJVC+T@c=5QBTDqHd$ytj669jIW9h9p<jNqh9p@R*wiQd1+Sh
T5P<&P T?iZq*^?89*w<DB?#>??T#@T?Ck!!9AE>Fld8E8m\BMGLKSQ8ESQ<mEhCiG$&m=8+IT&6l?VpA&TSj\+
&=/Xj5 S+K=j*@Idwci:a>&N*@9$cP%m?%MSQKN/dWZ!a>%TeJ^^q#Ra9n9l9Vu8d5dlC5\@KZX&:iZq9#*TK5N
wS5?+w W5:<=9dG^m*!ZQF!9DS*p#CM^BD@+T*kdNG+TQI6\C:d&?AMGVLqpHDb8Jk<=jjytV$taX\5d#!?9j*+
KP/<5W \ic1@>:nn&?S^%*1$5?Gnh+Qq&LT9NNSVFaj>j>\c@NS8**^I5tC/R1klc\6e^8kYtDh94S>8e5@@Y<4
J#jh6P Q9@Kw@dc>%a*Ti/*6ncY6l<5L^N&4T=6$5p<JmmF9A*C?NQ^Q1uHaW!R6jD\+l1Aeac5nXV6Mn*L4hF&
Pu6byB ukC4jji8QHN98F%=iHGVEH&d:P:?<5ejd&!6Nl?R#<QQJiQeZCL9h@aBGR!h++>@*I@*8=84iPwjlRd^
nhtWSn WnJK%a+jGwVcPZJ16\GVh^hktQV#CcNcEi9*le5LH&>8\GI&jj?>>%dlknekH6L=#h5d1$AVE$y+?5jp
4=ZFuE wcDiJQ1HC<WFpk*>BnJ:iG<C=!^BPepm@=DhibeaAd&I*!WdjYl>k*AEmH=4ijunY=8*H&!1XRN1VSTE
9#LFFn *jktCTl8tp9EBc**TWCE9j84G*kyhATlWaCR%8=iI6VIdV%?9H$:&5/&Q<w59N4PZmdHRt#JIH*Q6@>N
b!4\6< p>SedSWiLN%c*TA91FdNJwthaHHn<eed@9%w/h!G#$TP6J:\=hdY\:5Lta9$ItIC+Lmh8dSA9<Kp@*G#
NeKtjP BE654>FyLBA&*RYt$$8bi:S>Gcj<?NdG^$99$eq54cwN+@=w1RmIZ6%?:>cDeCq#j^uT8wuZ+Z*++Z8*
qB>QNh Hn$5jqR5lpSCDhKhey6\eWM>N4jkmiuu64e9p=a@jQTIZ549$ypRtew>JA*hWJ9bdj?B4#b#6^?9dt\M
&\bQ>+ ?Le<J4/*RV@@@Q*t^kMCHP?R<Gc@@=?IWBDDybM9pj&Tqj*$<5LhpF/IReLKEcdL/+A9?>*l>4t:1*A1
%=:d\X BIn*q#aj**yMbuH4juP\FD<?Rd=>%d@jZCJZ:t@R!:mQH@/nR&@=<jaC<C^pQ4yR9E8TI9c?1Y+Z6^+D
TH<L4b E8mZAm/Iw6D4?B$+Z%Ldne*Hc18$6H!L5Ihw:+Qi$uqTlMi4@wPqJZ4!G=6$HM&@Hej91@%Ch??>j@jw
-Ae+X* 00086d52850001202b3 Page 230 of binaries1.zip
V\9DbY y&6E\mt$I1b5CPpl?>1KIcw%+?JD\GL&<1PHD=Z^P<Q65+<*TK<Innic:&%DeVh9?<8>ySpm:B8Mt=Z:
qIel*j !@:GKuHS?Gj:@S@>/Q$@*NwmCtwRb8R#C?SBHlE#j$^$b\Q?a99SV#<mcCa\iym@jPqmSm!Ej9MeP*Hm
L&\bCa A9=Te?M^^Qdk%XJ?qR=<hbqJD&EI9b#t+R>994?@*@*l=8&HFG8R&u+E@F?+@Ik<$P%+/<R&AS9B=iWm
D9pBBV $aP:iB$Q%!nEYcZZ5WH5ppB$+@=>inqd5MCq?\NTyKZ*ww$bu+Cc\Fy6#Qu*N#:<&j9>t@SCdt*hJS5t
PJdVH9 #T&SdX#MEQ:hJV59\Mmct%5E#dtjjqVeJq/Zi$VGimp!*l>8u\G=99Zk<Xb#GWTE@PF>@>ZTY?Raq=id
k*4\ka T\?Y<Fj$EqiZ*9@l?@5@?8EQ6#b@?6P%m&MC:5#F<kL>1FYC6!%%i\aim*CE<P48I#Ik+t\jmAqcMMB6
htBchF wt**q&+VjTc!%mjjSiB*C&cmq5#Xyqw>$:#@\H@@b#j*j:m@@@:n^=jJ4YjkjYjwaNa86S<1MB/A^iat
ILWuj% /MNQ&<YHh$tX<&S:C?&jSpb48D&*Re!SQPdG$5$j*4:>?AHBiZey?&ByiXZ=<j*M<lKb=h#H#idt$k?Z
/MZt4i /De6@Y^%</j6NWIT?l$kd1SYe!S#!IME9p*8nAkn8a?b8=ej6l<6pLP/NeK^$*MkFjidZ9\?TY9Lj:q$
XC*iiB $X<meKVV*1AwnSVuQpYtQ%9/$j9:H!:h99*Z+bDAJk!X!XJER#>^npD^9iWNJ44dD!u<YKDZN$6BJ9&m
ckqk=V NtId+\MK*B:VL:y>/@dn?$6EDL9$8tCM*/Vwmj\kKjI1tRw>tRip=^6p5W5@??HNyS?8d9%&??JcSPbI
jkeN9I EeLFlW9kk@ReCTpALDQpyw4$T+l%pdXeY4lIQyJwh4S>ny+HQb*X4W$a*+<P+?nY^6d!aCtKL*bJdp%/
wqA+SS dR>Yt^5jQ>=ejWAKR1>6/aj:T:e&mT1SK8R9655LCBK?6upL5e$G$a6HdRy@mG>jjul*?^LaI?pDme<m
^Cu8<i hNt?VdTD9FP$*!N@SRD&tKChZ8HT59Jj\\6dja??m#+69W>Kh*Ny/d&6*:qEEEMBXbF$?mHbJ<LpY%5S
/4G*!y SX9u<JLch$F@6lj8@lSBMDta*^>D4%jJcPlBMeGQ+#><d<Q*S$89L&>S\Q=lHDiZTPGYqu&KnDc*PGBY
@R&5u= T&Y<Lu=Sc+V<BRwVLlLjwjk6Jq^?wDa!bA1pi/Vdq:jd^K+9dX<1K!P:RPhF:M^1WqlChMZ*d@d:l<&6
6BaJi^ Y!A<&:j9l@FdZa4pt?Tl!SAid#^aZ6&m+*y@Cc@5<idFn<kJ=Ne84q&/i+qA?jHtb9MY8ck6e5LuRQcJ
&in?qT \:Vy5NwQ/dWSq#cMj&S8E#EwI%G\kXl!/ccK5/S$!/PqN>+ne8:@mAlF9NS<5L!$<aC$blPl=T&!5?LQ
QRqhNw TQGdt>8ZCE^umljyVDIL+jad^AL+b+FTEN4S5Y*j*d::/NH&SSJCqpJ6+^?M!VBYES!#Mu=+?KG@6WZ?
X58cZc :j\1uiYt9$T@n*VjB=Wt#N^R1/i*Q5aLyFi+9QX::a@kT&e!FCqi8p8@<G8*H%M\Rl^&E!EeWa>L>Qwi
h=Nm%V *d*d9p5l9%1InZ<+*4dwJ^Fy&q1>j^?/V#IbL4%^t%V$%8dG?@RZ=Cw&Xkp+N!B^myZXW8tH>PLi&!S*
kmGp*4 SA#6Ty9P=CIbL^Ga^<!ZN^C@d&/DTT%ejpk9pNldERE=eln$<l:eJp>B^4?$>GF@9$iI6#^iP4%M@Im\
eCeL?: dZZ4=w?mbiSjNwBBRMqdH+?Y<58*H6DlKeDHS^j=ybWBq9VEtpSc%jbb5tS/XR9$?l/SyXH+Ce$$HlHM
VP\H1I 4G:myY!Bc%QASIDln=jijP<&R1qdn&>6Lj$aVlB^EAHE^5jE\bcc+bL%Huu#BRPi@PJCea&PKh!?8LY^
tPDJI+ kh@=Mh#6*jbH:a6Iun^eKBQwGHe9$!@<kH:ha@=6SQccbA4>*Ri4bAqjk@dei4BF?QE^RcT@ChRnlKXA
8m9SYN @6dn+XKP+4PQmM#qM?S$&?%wi\Gc6I1Di\>SQIJw<8y6P4mjjpR9dkHlHIJ@k1Sw6aTZ%w>@@HNElq>:
T<m+1Y DPh%i=te=jJ1p:YYGAAF:YVCJMhV:&&8+4#AV+lAplkZCB=Jt?ldd*Ge@>PQ/P<jW5^*mTkARn!SI*pY
mbG?J< kA*#aIy4D!p\y>j%%nIh\u9NB:jAmi<@\MqVVEbmjQ^a!=EPd49N4\&@:nIb$\Ly!Cb>J=GuB?T1HpI#
Fcb#K> /PAiQX^:lDD@Mq:d:+jAjqneLcLa*whSSLK+Q/dj6+HMG8EqCajiGFA&KRc@Vd4#?D=FkKiZKW/u&BT=
hDiuK6 G<kTYE@jeb8?uan:LayDMk@J%lbPRqe!Gj4XD:W\++%bRBnFI?RCD9jX^tlyj9p&MV\jcL!=*AR9k^Qb
@TDGnG bQm?6aF#&&\dGYVnL1wFk%\c9dcQN$py!S88e8S55Ak966jkcSd+L@/^Rd#NI9&k\!E?R#aRh%qJ9u:4
p\a/9I +?ctV*KlF*jLl/t6RyaIwTu\<b6Eu9H1&tDC^a9$E$pjI1TDpL:/?L/QLM!=l/R4c\8ZL6/Fd<Q9^1@<
S*#*Wt S^G4ya>AmBD/^+ej>ywdlCu^cyqC@1WHVd\?mkk8QCaYS8?I4WFNqlCkNl>9QYRjh&ul:kL>\6I6SCh$
!bLtwe /4jjW/8X&*lNSV4c8^eZwFh$j9mN@#%?+\N/BZSGD/Ch<e@+NebEwb4LQmEKQYW/DpLk&!V:Gd#MJd#C
*hwPXe QMX6:VaHNbpm?b@^>nhIWM*:t$9*kZjpiyDCdc>S@A%D8M8@:S<bn<ASAS?d:>$t*l#FQ>wqCw%ZYG4i
5\8&Y\ 9$@edZZ%AV%he@Q^tHM6G=ZHG<5k\M6L&=5QRRI8j9RI1ahw?=8dkNcQARt46=ER8ET$h&Hl$ph4SYnX
Et/PG= I@/Nj^<^Hd*CVb\aERIKmtMKPWtte$Rl?iji**mQnwSP<ZF@?\!PCMIplWb/t5#9I&T4V$LcY/9LFGQe
t8e@#S y%?y6p<?=CVwGlH>n\#\TaTl@+D$lVCVuladH<Y9Vb>iG=E5I6m^Z!LnJc&nq@>+6H&cwGZ#MZJ#iN9c
6%\1X6 IJyiID=\GZplit&*RYAid>\m*CS*TMmCXQpc/YiGXPwTTSQye6n/k!%p@$lGCKLI9\&Z#CabaJF$=RGe
M/IeEM CRZAJ:jwCJGYZ!ad@&pd+X6YA9X+/&8*+Z1Z/iT&Xlp5wdJE#SB>/Xj%>+!HjGmAkp%!hVj*+\>Zq@#:
:c=II6 L=aK#a?*d6&?6W&<jI+MdZ6:8Zq@mjm>9?pV/JJ1pBi:C&L%JmpQ^YL$T&A$6<H9TLl4TG=VwNiY^JSH
@\/a8% L+ha\P1GV:>p/i@F@aliD9&TB/9LbKydY%%mHPh84ZI$6Q^+E*mE&+PFT?R:Vn:iiw?MH?m+VN>LFB8=
AKaia# h*m>VGcBYEtG^QX*wA1udt$VMcVVZq4/j^#??EQ@</Z<a%L>#h8>da6+H8u8$9*:BEBd9$&H4#:K6pub
BAB@1M FQ*m&e$N=BR&Ht\$H&>E&&ejFWt4pV<%pQ\u?p+9+HiI@V!t@=YRu1LCYbC*=81LyZ^#>V&CQjwFn^EQ
k$1&!^ j$\!w6??9LG^Swk$W:^<8j#\Ij&P&W%EX$&a&+NqSb=!q4PnyQB$>Hj^w<<a^6>X>FM&HlMmNWHlktm@
MXyHL8 &%#?pk=m%Tji9H&:9/$i^/6u@PZ@j&>9H>:WhicLLt*L6m^ndMCGjQAlXAm!CEudE>w::W^^W8kRy?pR
Q+Qmju %*5LmRmaVLTL=BnTNEI>yEc1J4tnKP&WyElp1/W+K6ywd<iRJ6m$WAJQ=@Tiq6:P=BCEG#6CuVuNF+TQ
:m@Kl8 JNkC&>4:@6+qb<==u95<><<:dVPP6dVZj6@%j9#i4&WyIIHQbKl6edI@\NiLaX%l:lTaTTXIwIST?Vci
#>ZIp1 EKIR^VX#CuMlZLDu5G$/iC%b!taqlS$p$lEEbiPWCXHtel1AjV8k*VEd^W$\qt$I<wN+j5aLH!PHqG1G
i$+nby X=ltRwK\jA%qqViVLQuI1ZnlD45FM%4Ak#+T4V+KG!b%BuRPa/ZtEJ>Cd>J1KF86/TTV&YpCiLA!9tAk
$WdD!5 :WPeXNE6mjk$4!ul:Y5$$uiK4k#FDt*HC+cEcHG<LM+cEj&SMQaJyPGHy9TcjJJkk1uNw:^AVlHl<8t<
JQ+yXw Ei=piTTCcCiu\ymq9VIIAT<w6HWpHFB&kh61ZhQu<t#KdEBAknc1tNwam=na#B4&a:8KcMkCwC>iK=qQ
FXjJ>! =IptiQ6W\Ah%X#XE:JRZeL9#iA$YtyJuEV=TjD!VpwSaYG%$JQm!Rn=9Dw=E!WA&+ZSEeTM:ECueEP$I
#?V&dl dIAq@ZRMSkbBZ>aN<IQu6RL>!GI8+QXq9HpC@6AREtIBZ1Ym&EqNwChinam!WjKPSCA@XdXkwIn!eYA^
dWDd@j \P4Y&BJ#HCFyAjDAZ!mG\\YaMbpFy^E1/*BkW@w<?J>RCtyQZP1kMCPS^T55%nJWaR#A6qAE1\KCl1ma
kiZ!t\ CM5MC&b*IqdJ!BAG9MH5RAb9BJES^Y%5STtM$!yRFIA+ANbGD$I1*W+Z9Ddpkp:YEqAMd/Mc:Gh\L$C6
qe#d*S JHe6GwXZ*kCeK@\^nBIP^wcABdDBpW&CMy#Xh/DFaLMckNB/^c!n6n!PIN5V4wm#@B=^JB\Jm?RJbE1B
JSe\WT C$uanCRFkKwcRlTdkp%JW?pNj5+NVm=GcABNAut\N9R@L%ityNQSu*AtdST^1HS\&$%!=#wHNDByCddW
+pI#E& LIn?t/Ib6lF>BTBMDdGwP?q!&lJ8598EdMBL^ClRZllRSFybuW5pbcDTlLi>*lV&#TlEw8/MJ:I&He/Z
H=/VbP DN\Vlq/St\Mbmu9lK98K@wJIBB1iqklmSnm%aIaKXNt5$%qJYEnTY#WCT*m1=JMXmlqJ8QH:SXyG+Rea
eEN&p8 IJeHc+<I9q4de8GEE^V<%XBN5NjWBT&6Ge45AKIEKSG#H^lB8CkYy$W:Nk\Z?DG1XP^L<CmW=^NWVRZy
AijIS< iKkCq<+wJJ:YLTHXpN6<EM!eEmA:VJBay@wEqZm5GTy>jh9W=<F!RLw#<NImkNPBe5Sj>p?LnZ/^PPL*
t\Mw?n lLunlqqIbm6aV==:ZpaGd1dH1RFK%!Pm#MIY#iQldTA6ImAEY!qX\e6>?aTP+=mtXDyX>d/FqS\p\8<E
VX=FRT JCh#QFPGIRqZypXYNMRtm5MXZlQN81k+akCut=ubMqGubH\AueC&MF66MM/RF=kVL@$ZFqkmS#m8%+EX
/W+VkR bLcCy6/c!^DGI>\uJ^#C$4=m1Y@EM!W&nQnDI?C6VP>Z+<4GdSWKCpDcHPkHV>@J8S!55NPXBB@uBSHY
qu1V<D Ak8uA9TQNKWtM<F^Zq/1pc5u^6RyiVdAum<B^a?YI<X\Baw>^?MZ5R>aGPV\LYq#WCFC+HmpShbTZpZ!
%+M!T* BWMlTIpNMY5FFm%Dwp@?tQaCC$GaV\:h$G&KDl8mXW@MwmFEdJcC=QP!eBWHwtc$=JpYG/Dt@wkHJl/m
#uD1$B *Jn9=<Xd:w$1kGG/D9ZKAZ/tKTB*\F+d?u^KZInkHZaNyKpwk=MD%&:1DXA!8D@!L$?aiq5KeBbAEt1\
QGkZNL EdDjqT5Z!*%SpGmHlQkyJJcwDnkLiI11*kLaTitV=yAM4AtMAnAbE^\JKq/TK5J6VANWTRb=eppN\cdQ
YjKcCy wu+EHH^Iyq4nVlBJeZALnqkTR+mmp91Y1Fp8\udiG9cES<KWt!Jl#qN\AdRMuEyGEGk/R/J5KDWbWG<+
uw^LDL KaMB+R<R^Aq+AaNFZmyPKX=K8mKc$4Re4L811*P=hVGXicwWpKH\$5a56FjjX#E4=V/adI<lYuGkQ4^5
l68ITZ I/@>WP?A\LJWi%By^*1RGcNMD6\lbYel$hSiAqLd9AnqKjcVA#+9ER15+PTM@T\X4:$<^^cCmLy%dW9S
-AFNM# 000fa208447001202b3 Page 231 of binaries1.zip
695e&# NI8RAE<+DDE6mCuK*VpV=CY#Ti^4PJ9lLEMbVjbBXu#yEJRTy4!m%\YVmLK!?k*^XtlqP:utDL\WjpQK
k&:F\J TqltKch\jkwtG<kL/l=!^SKIY9bVaaZ\6MemltHCjStRTHYWdNKqE>/y%yp5KRCEPm&wp4IkqqD:y%l>
C<XFR# G&\<XGI4w6#qmBP>i/ba\^$\6qWKh=l/uXiHjbZ^?Hah$A=?QlWyqe!CSNa/:IFq+@pkctIlFADpSN$t
CDYk+J 5IG/amCCAV^<pTW+6LaE6$:B6wG6*XQMtkwE%K%WP:EutMK#jTD9P#lA8bY5P5!l8K&j=EdZKG!Ac:L=
!lcN9A !Z!HSSuBl6YFn^CS*\LRVGmV/5^iTlhy/namn=SDWDMdJlq41+mNHdC#$KSc!T6*Re!#iE?Xb!4uewXe
b<mG@D tkyCj+B8SFFQWwFP#%A?1RLi\F^DcKnTZ89EGbKlNLMt/WiT<FWPpc6e=<*A1:1JSHWnht!wmCc:qYLL
h/PcR& GIPa:!EdD>+pEc81cqW:/tTXWChp8Wq*Mb\!5Ft+4$KXSKHky$Pp>HWNpA1\\+Kpp<Z6%jI8@C:M9bwZ
$E>yp1 <Ab8!kM1&^^^\&cC5ac+eCP#^Y\^l=P%ThIG+Ka<>enk<DJiEQyp5//S6+SDkH#t+\:I^RIq=jEk\k&I
kPw9LN j6nWmAlXy:P$W#hAQ?\c:YE1nV^@ECSCiPWtw&:A!eWY\N$MmYIH+C:mQlc4VRWieRLAWT%BVAE6+$Rj
@mti8K Z/S4/SC5Ic^+RNV:EiH4<HXm&F>GLCAYK1JFk8WSZLHaVd$P#EFeuCFkaweT1>=?\CN/B+RpG^%Wtt!F
ILVe=k \MdAYCiRl>MmiVjAQ=Py15>=EYjP=TK$kl\t>1eI&SY#WTWBH4kR4Wmm*?PQ?MGApJ:wb?=JjWEYEDbB
RMc@\V HV+/bChD<hlYAbJFXbjMLX$#LZ/^JqFp5bmVjFhCEMWNSya$6n/HtI<dk5Y/JtjIXeGHTQp5EWHBCGAW
p9DK9E ajq\tK1XPM=<ZEne%G5w!aeAne=TBmn5B^\q=PHR>MA&SDa5lu@WF4wb=ZmA/B#bqNkFMptt5cZpI/uh
eFKcwT &R/?\qq:1a\u/RpBbKwK*FWl:PpDZ#$\QhZYE1id&NqIcM^GGZCaI$N4WDP?wNJBMRTqn^b8EKkyIP/I
k^Ma1M Nj4jAAJPCI/+I&pZyR$A=NS8wTEGqEFy&KZnuRqMy<TAuEhMt>RB=MLlCPH8XFW@Ki5Z5^6/k$^/TREQ
nSNZ?y pT9:EIGwQnkTJ@lhAYTWN<cwKAk>idc\ATwqPG^\BWDbZVl#N?i9N$RhWN>6lucuA!uEhJ^ac4/=J<lV
ERMldI ^<YSMGR*R6XAZi<u%XWSGGmW?8BtkG1iqQHKKVH+L^!cR\&t66umAu^>LGayuudC+6h6T#m@D*MGcyMy
*:F<H: !TB!kaHA=ZC>4pqB5Dl6mC9yaG%JHS4nL+Sl+n$:<SYkEBl6kTZJ>aX$?li<Hq/?MS%C@A?>wTc!Kh&6
$GG9el Kq*kR*R<JklL\^&^8C*8EjPJXITw#i9:mqThJYSaJVhH!V9+i#GX\htCZGeA^ld^VSEA!\@*CimbTNnh
1#b<bc qQVK\Zd!nDXCl#^eIki1GbnnLLm<MmPLG^BmSCybl<Niknk:qpjNddpwCNmA+PlA6Ly^PpCG1X+Q?wnH
IV6Q$F mmHiKhEnAV1A!\6l^B<EJeM\EKCRPeu%bpJApJTb6!Xl1^wyNa:jHtRJ/yI#FhhGuEBjCS1eLEQ4dajK
RkTkQQ =uqQEWFFF<:@RPpm*#dA/SZ$ZMyRVPp8j4#>MhCq=Wl:Skm9?#%F!DLJqJQc!iRAlW+/>Bc&8EpN1lVD
p^u5$? B%@ENqV9YK1ykSBR$^a#:wnd^/G:#kNtyN^ZLu4E^\Fp>=jlAPyAS\DHG:qdS?BN+TL?=>PhJD/!/Ch!
e#IbcG \*=5m8@+RtA$Vyh/ADJBWtJZnFKJnYq\PSTT6#EEtbRbXyZWSpjeFw%CbbMZdA=uQFw$ATZDSV<h<AH#
I?EQtW Q/CGwnZN6ikPQWhb+WAkJap?<NqJdyWILpKp@EWINnlL!X:>h5CERFyXwEa5:wcM=+KItkGh>!V5mWuh
T#&99! IZ8*JS#^LYY1VByAW8/KGTtYm5XC+R$I@@:mGXBdAIGEA?5%cBFRFE=*YX1QW/iekp*DabkLQ+WtXQZJ
@Bm^=I ^\R*:\6XXG4MVACjX9RGL/tRy9RL&HMi\mqaSpjj6N*tdHndpak*tG>QM=5Rj5Ky8\?aTe=kpa\^CIZ?
9#w>1T !JSTFFP?jJ/S^Kcw4l1twGHE:/hkIiuAX^d!qF8cGyRekw9/C&Ad>YBc*k4$kQAD+WqkI$KtA%8Bl=<%
bqji/+ :IK#9VR>#iaKpehB/PA=P=eutYLw<Gw>q\He><4<YGPM&tdFmIiK8VlhAm+!CGW&MF&qBBQFejtaDXmV
pFVEu8 am\1kt!#\RM8%TCZZZFKi5aFwj%Jl!9^dGYcApKZXn!LR?%ubC6AK#tB!C1hamcStlLEWD=4A/pBM9=?
Kdjt8> PHReKyblH!e\amdpVW6yR&/qMyVVKae$1uVAdAZ/+=V?YBmCkh%GTTmd$>Z@V>iVV8hKe>4y#McV:iHH
lq/WVj AiVIY>RHC/JC%D:?YekE5L?Z+I6Qh=Au$FLa4aCNS$l9!WRqGC^nKl*I=hI!Bew+=XAGLp86!DYlDpj!
bn$?Sn JnV&Ny<4np$k^T5t<I@u#LeViXe??&#yCS$cZb>DqMB^^NeAR+IkE@8qjdAGYbInD@^1AbaC^$4^EkmF
1b/Y*M b\kFKbSYR4^@PbpClpcaV8u<SJIZXBcBeuFd*JYkaNl=cAKP5L$<nSA?/Z1y@IS#Ey5Y^AAQhL>KceKW
*wKe+D KINRWGpVCA>ScAcQ:mjjE=bWQh?QI%XVKTy:EEilRWt9TnGjDBXT??F<dRk8NpJF5\+nMijA:kTSPa*k
cCmABE #bX>FwKWB=u:aIPw>j4J#?wyH5^SIeGHS^MRF\5nJLlmIRJX>aI81K/KPNtLTMT4WpyMeMNDi/uTA*F?
&yq1L8 lPMqM&QVwDIk#yaE@I<cSKa=*a>Np?*F5>TpteJl<8m\XXjqAH\6yiElH5^F%RW@#DEFc6BVWXJAF8\n
hMeQ<l #AjQjkT=^$uRcWliL4%bX*+TMmRn%E5+1j?5QY4ky:n=QdeVY&4qJ^DH5V=D4QGB#G>d>b^I9bQLW+GW
p@A^eh D!Kh=QnMD>NL^+q@!qW!M=SKyyy#Hc!RR*CtKtI>JdtCtWieN@XF\LMl\H\uDnJZDtihCdhyJQLbyQ8b
XBmj>d $nZ194Zq<D!bFPXJW%56EZTB%bX<idJDwDFTQW5Q?XR+tZ:GP?iylBZkjRLk*TFDdQBK%DCn=Kue9ln^
iZX&JN dSBtN=>%b1E6H4PTVL4:n%Zk&4Qb=iWu\Fn!4\1b*G@ZEA/iFqekHNWh=MaX:FReEa5+V8AHtZR^TX&*
t:uCVi HK6TAh<KtLc!awn%*wA9wMmQRDkYWIPN/LM:1cDWFm*%QiLK8p=X#Epk&EPqJ/d$lq\EXqRm4^biCMct
\PNIR< A!LqmkI?KCC5WICCmVBSmmQ>DKtqRGF>C4EAlAaTt<<L#9!YTyFpEGT?mJM!NXP=bX9YqXT>w1hTLt&D
ce?1ck 6DbH#c%bq*/wjBdSDACVB>bF+u1!5+=A9kkWI*=JIyht%>WMVD6*y1C&CI>Gc1LCb\aW@IeZPclXdZ<J
n8d?G8 mF!E=MwlN>S>aRnIkSkbnXLN6B#KJ9QjL^Zndn&:4?<G8JQ!SCwS^NRbp1KI1e&ZCDqR9\RyC<+$ALW5
tT#!!^ FEAwI&K^C@q9TmGDK&pmFyEQlNPMq9D!<De9IlT@ShNXVRu+*Eq:6G^GwyHT1F6*>m@aCDkyHDCjALpH
>iIDbJ VDNCMlLk%XcL4qXEN#bPRS9n+DHPJ$#BVJEumYD/<kt:VwWc/wXS$qSF/I@d<u1pdJakjwb<R/<Q1RR=
>yAu1y >V:DdCmY?5=uuZk#lnnHZ@\aG?I+mlF1dCE=itK?4qCcZ1KMlASCPXV^WB=+GiY?\lIFWInu+M5k1=RT
Q>tN?? =aVC+P$9>btX<+bC9bwNRKq!aCNPNYwW#dKqPEE>5NP/EDX*\i5iAHA\^NyAl68E4<K#iRutk^\j\WF!
W1RK65 b?Gb@J/jB&%JKGmR/5S\i/pMHTpqQ=L6=XK=XFCl6?D6uA!\5i4%8dNb9&pYm+mEdmCELWiITA>BBklh
^R:G>a kMw&n%9l61un<c<CRQMPtARXl\td^$$<LDIE%WE%pRChiN4HcRR1lF$:EI%YKk1kEuZYWFAX<EFZw?X\
1<$Z9I Z:FT4IRR@S\1FWjyGM5ST6RHM@\aq?6BpS1n\Fna&kVPl<\i&ZW+V#@=NV$Sh&8GWk@VDlKyaN#5R5\T
kBN&hN B//5tFVTV%N9DSA+DC%P6/<$E9FE69m\+d+?+8p5j=FeeCwh#FSVN@>FDQBJkIApRZCkJnL%SlXAJbWS
\DuFRM 1L^Q8ktPWHhiEPeIwMIMy#&l>bXKWT<X8ch++nauk$S*Z\qI4?kjPV?y6&ySM#K1bpJd!Kl==T1NV>TA
up1/A* 1hK$cJeRPPXyqEhLGj=dEbtPWDbVWYEm*C4lpXSKt1G\H/F8\5t&XM#!iXAwV?5N+LTYTY%MbuWnWkjI
1DlL9Q N6IZDp*yLGeWY*byi5bjllBKXCS!<qlaEBX9Sb\VENQARWtC6!KSGQbZ^PY\Q\/+WY?A&qyVElp=M9WC
YW>DDE RmJZDnTPW%N%1KLQw&a<DWnK:RaVQiVym:+y9XW$K?ZJnKJ:KJMiwCItGTAZ@DJ*SyBYTZeJVwR?Kcyj
>M\RAR +Dn^VapmF/i8\ADBiHkXVtlLI8bAbBJjYc=WVE1!k:X*\lDpjKC#DHedF5PqTEHVcGluT*Ep+k91Cnpw
b@FqWj mbIlinYuI8BAPcp!#nQJEZWEeKRR4wl&qjAhTJXy!j\k^SARaaFTn$Jj!a!i#%DL4H+*KA%BS#bC@9\+
cq<+X4 VRlC8FkbJZ\wX5y>^Wu\k^PdBn:Z8T@VLYS4q=J8mkC+qD5KEM!EL^9ldXR/&b?eIqZEY+laKq%VP=$k
NAe$ZC PP/8\PST@\tw6YYCKwSeK^R1+8KIQ?Iy!lDILYbjPRJR1e:wTmmwX%QIR51La&*^k6baLA/QVb/qT1wW
CXC:8+ CtYbG<mbPuBNcaEQ/Ii/B^HuPt!5QXI^w&>S4?cpdqGXmtnCPC?B^I>Ew&F1dm/Ym>SdCcdD^1YDXVJ*
K1H!bL eP:CIC^GTIw#ya!dIqIM:KFIPKlYdS+%MNjAAkEIYjI^k:WJnnk:EC&bE%Va1I=KcdyeFp&Q4Y<paycn
u$G4Qe FhM$Im*?MDq?MiAL16ZPp=Cy5>RW/JMC$A4K+MA+AHpSjV+!5Nm?Ty?*J1kEeZKCk*1>c%eW#YKF?pXy
&MyZL* WChDde>tiKGu4%k$T>FIBN=9^F?p=LM*#S6WuD#:9##HwRnw>i4=8NQNp*FWTS\l4$w\$p:=l&t^EZkH
GcnNG& ad%P9it<=&pLRn#JpBp$5AbupLwl6pBD!tZ<%!^HIu*AFtGAF6keukY8%ly!W&IhCA9FKa%S4=K=KSAi
RFet$N 5FPKlpG:bVydK%W@NaMQQjL8DSkX5&AwN$EZniI=6%wpXumDZYB*@?PNA\%9N^W:Xunae1AQL#T^it#R
%NFj^G j$5PJ1eqwEnd<1!Ki5KRVL^WI=dy@VB^AZAT:!mJcc@KW#hVdJbNeP<9qebJ6?BjhXMXkEpN5T&Wp>!L
9DWGwH htp:*j5jiQ#p*Y?9C9@t?$W*Z4$t4ck#W$CQRXS!wq#lNCK$T^l/c$cpPk1qyKTMCthI/CM\Lh4IyFF*
TB>8kd Z*!KNRCupmZ*KnIwDCtR#FbjRWw9>%W8HDEj8jd/k8@X?^<Im18wdeTTCXbL<>AEyp&JT*B!9m^%KYpc
JKNumd VE&+YCB%wTRj+Iwe>PLXc?FZkwyGtYMuE^\Gd#CCG#\9b&:1:YwwRFWtu!n>dHDWE%+%e9H^u^++1+%@
?m4MSW EI!5IGuJ!D#uWHWekmct18TFplTm%!pyK9B=AHRkmLe/BHA=XY%5lAalnKZieEy$Ge=/q:/9FBqZjVew
-A=b!: 0003cf628b4001202b3 Page 232 of binaries1.zip
&me^4h a+B\MdDSI6&S&mmE&h?Muuu=&BMjiDy@Z&B6eMSiZb?bH>4P6<R^LqIAq!tB1yI:n9nD9LlHBkbW!nA\
$^JV:$ 4iDiVHcEyll6PHFEGIdJ9GZhqG@^!YIKJ!n+S*MZ>MmNb=@8?+>@L==i+ZjnAIEDbjBWaDSBWBZRVDIG
aiH?84 /61CKbEHHtBwJyRHlqMINqdEBSKCu5#M!F1C/t?\%j=!>K$JjaqGa\di5BRZh+%jPNL**SX^@&<iCh?*
DZDVHq !uM*PTe=M@%ych%CW!k6PD+=#%PatTAqMCGihlI>q$BXjqB?C!ZLk*!w\8tEWcGYaj%A%B!Z!@16Gcyc
A>^*KJ ?5VNGV?PduBpapY<:#h^@?>#liX\MGqFD<=IJ4Yb\/nMB9yEaEkhC#t!Z%VAZ=HlBw#/<ukSt6yGcWR4
8<b8DQ c+5qEn!QmKkIPn$?wT<PRZalKPp9d1\Wtp1d>\jL6hLR:*5<!\pu!My@p5bwM5ndBBAiE^J\K%:aFMnI
diR\MY LIpmNkjB6VTN4M\JTEE\qnJ+@T+ubTMVFh%KMCy$A+yZE>T<eJRLe48E99/&mZ&Bap4$jC5w=uNW^1Vl
DA$+L> RJ4G?Zb%8$bA<FTi4D>E^BCdwRaTAnV+hDi<WkA/NXjm$J51d$+capARpaXPHDLN/Ckiqche8=D^$Z9l
Muy:Rw GIKm=P@4K%DbBd/F^5mk=qWCh^nepDZBD$Ha+6\jiAA1butl$HuaFa$tRT4m4YSXiQ6/Iy@IPt*blEb8
A$!IJ4 4kliWmPIt%IbNYw8mKXNjnk:#<lIKRKDLeLWC:I*a+St#Ey%Q%P&BlB<Il1\BEH\LItw!#JiG+WC*I+a
E!k=p4 qVLB$H\a/VnNSwXT&H!LYctEmL=p9kJ#yFL1IlKGL+l8kY@ww<kV&/XpwFbmJ&&tEV5y1pnE58Cik4$X
leh9HM P$qk#E*NRDBj6ZJAD\ZBD#Qjp5nu+hqA=/Fw%ATBYeNywZ4t*CDbFcwllTQm?EkpkkmM=m6>\D>c%aa>
XYLAY+ Zyjp1T9ISmM%K@iV9>NWTGwdIKcPkJDH?mtSq>DFNK\CPa:bTdjhVb&apw=aykS8tkplT%$6e&ZCe@B#
<\B4JJ @pKb1l%\$AWcLJJD%a+YMGJKdISB*=mIWep^A%1cPCJ!^8kebhJJE&E?u=@FY!=MbF@!1qyK>?wH#Iwb
>l@M=n $q$Jt5HPW6e$we8GMKXDkB4E+lSXlDQAnXY=*FdS+Xy+q6!d!XIl$lLE\=8<QEYj4=+djEY6pwd81GZ>
GD9hGD Nue8I@1$uJTLtKZ#iydtHKnGREE!unTCmDJCjnp<KhctAFi%GTa?b8YAD&hGJZiETJVFkMii^Z&cW*D#
d6cjtw dnmK=cEARPdBTZ%lJ1pQFBA\TMGRCXPT#TeACG%PF=WM<JL%j1lQPPL*VEKNc@q<uqcXSXC%LMZ:A1lQ
<VtD=j YZh\LJ?naEJY1H8e<5ZBXI4ect*Kt@QTXCF%G!\MIecWhGwPPkCkG\IVa#EBZyq!K#l9NqIYDRttPEkG
*ZjTnA E8#4bT=kWn+ERGMIZpwBa*FGw1TWVEulQE&*l*\BGytunpYcLWA$kCn*qkMXWR4tbBy1GE$/HhTySYlj
J?Yn<@ ^YuZ\Jy:cERIECyn$hR1D&H@X\&R?WNI=A$AL!ek$6T8n>mEl9B=ankXwICIh>*wND1H*XyWZa5YcBu$
HCjE1E 4GT+E4^dK$:5Wn/mnI$WWIIE4Gi+S$&HL9KQRFjBRQwS*umLAD$qEkYApmRZKk*JBSCcXGRLd*umA=VN
PwW&CB 5u:MHKi^tZ&ST9p?tnm66VtJ1I>=^^?mVXp%bwT9q%1@b^Yw4\n8NQAm4=DWB*t9F?Y&Y\Y:G=BXyuRJ
4^m>4t Nh<y=M&$cXl+!LX?1A@aRNaWwK/NjMKD^Y&AF:B1+?JetG/9:E5HCe:PAIQHYBLdl1pA@*Za&FCM!6I1
wA!cT# >WjKmw>AD1eKmAiBETSAqWM1aS?Xq*XD5p>DyP=XJNtQ8C6GViBW&Ib8y5dlC^FhBXK=wKwwXSX?k5F5
Vq?Wy5 NtZ&m=+IQJFZql%pEla19BXIBdQ#MaFTlGpiWC6$kmHiL$<W1pHhE#YLm1aeM59tX8yl=/M^Gl=Q5!k\
dL+Bby M+dTpM/Ru6B+i@ZaH8hbb=Mue?!B6PmL&bN8ujLHj<Q>CX\cJd\XmL&C6>YkMPVXM5RjLiNNl*Lq1Aua
Z<:<mi :i$#T=M$uBCuPZhXpRHSqXq$>HDnRWSBhATER::D+I6tHiK\$a9u<14jpyCmBtecblM&pyJAMEA=J$Zm
66Ruq: e!u1yL=AXSBFSM6qmGTGlumwXbK/IiBwkQLw#kiKViu/ntb?G+HGB:*=IWcw5jhlXR8V^qEn@Fc1#jPS
aGTa:u J>t4eTwF*k8c^w+y*6ce$VTce1eGlBB%9i$*w^X1YT&b=6aaE=mDM6X!JpAmTQ%H$$ynlq?$wBN#bmDi
R%#W<S h!*Wnnw4KFI^Ska>n%DNd#aXLlE9pjTA8%CuPh+AhaD!eaAMF^&e#9Ie6X5PSAk<1+ybL9>JeFIZK#hp
\SpaB+ qIAWIZGAl*JnWFN^KqA^:XNV6yME!SyT@YLEEN9Ve8BFBkNIh#mEjDJ9d+6VaXu&y1WA=Xm1k?A/:JMJ
dAlA\t @u$P^uYLcW/R%!&b+#A!MGeWnbJcpdj!ynqEBJ5%cwcY>SqVE/EdCPd9C@8LhLViS&*WDe?u<uke+RGZ
%tLWwZ %TBJp6e4IubPW!F%S6Y+XC8lZCqTpVN!D6^i::aqa1R5M>R19Hedl^STKhnPWKA*E^D69NXNjmIVAHa8
T@w/&b +AZV*qmeZ!mD\LMT?kKeP^/nbIJyCu%y9C^D6!V\p>LyNkd\YT8dWd!#L\4EFM9cuL\ViVa*I=T%WalP
ytR@N1 8n<Dn5pTt8F!tAHV#hh!Be<I\X>9IEaJL4weJWkwaB$pYche6\LQREmZtKX^k6WMbWkANAB&C*#C!B#Z
tMbSjD +>RW^k9dEDSS\Z8G/CwHKnSacby6l5tQ$?TwSapa+ZwRtyc&Enla^EiXTKITqQQTFJ+E>1blwiq>JuWZ
nRM=@1 XCwDp?XLqW5R=CDbmG&8yM%lh?wb%c6Kpp\6bkw=Ndw4AMc&:6N\<=9<GFX>9:<EJ\L9<mK=SyYth#W?
nc6M!< ==5kF=IJ<8yGkH1Ek*RuB*FZJX8XpqQyJE$/!awTmWauEnThCBcGXK?l%PTWpE!*BJk$b/jQtKX9E&9>
/6G:!Y <E8E4YkAWa4d?jWbK9Xt$*Rth\@yFE!<KyHq\P?%GcMdXNNBkD=>Z^T^4m\DBa@V:RmWaEZwG?A6wLwe
D6N!\9 K89&VCmn#ln/d=QKLAC*epYIL&?\y<pK9wBCnRWILpkW9X:IIciTLkulRuFdn9<c#5d*V\AA51JqItW#
khj\u+ qHDc1AJ1W/pNuT1RE:^j!\#XcnNnN:BhD+ek?iF!iAS&JJZKW5WajAY#Kd%M!SewnKkRtcJKw+y/>i/V
?:<KDI EI*A=STA@?!Y1QqY^liEJI$/1RtR^B:dRh!wT^/!\=%Sqc%Q*M=dJ#I<DScG^bEDG/6N*uk!@Q:1BBuC
?F@#4l aA4CRBQMCl$q9<8BK!lkB>\nA9AXbuRep9I6cGp?:mDHZ$?Vw&yRS8DYXLYbu$dYRYan1&LjF+pWmEbJ
u!AWtp huJjLQQi!^liN!jS=T%y!n14IS1@!hANBDleL#YCB%Kbq&AD*\Z@\NSHuIdNyG6IcJ\!Da5X?ymQa<<E
8qkDHP b!%$#$$tRIq>$n5^CZP:TNY+68iVLK/4MCPTtKEPa@ntclypMaePQy1Z>HpV+PPEwwePtPaw*A9J8bG^
6I#P+R <y/Aed%Sw#!Zy5$InLPmN+Zkd!PSaylKQjI&c9et&FjSG@5hdw$5NFmMRP<Pd!yDI*dEFPy4BGqBPL>W
X\Thy+ %\yk@BB<i/qW!VIKkP1$ZA/eX/h$C*X$$^!Au1t/5Tju$XqqcCRSaRDWIyD!b5l:W%+NQLP:tS&tJkWJ
GLm@bk DS1Bqbq$1HwVB*XWRpBVRcl+AMa99wX<Tpd6M<&#VtwG$SCQYTmP1EuwNMFqydie8WZqP$TtGb1qbjbF
T&*!cW !tGc#EyJYT4^$n$#i4djVaZWRE1XJTw#BFW6SHPmlu+HyCEky%Jp%1ZA%kXS<##E+wAb*StnhkE+BRZt
bLLpw9 l4LENZuhBWwNcH>\S954iuPRLE1\YB#^WZ%TpYm&pMVaSp$<Ac@pA%j41F<$I+y<FEK@*b9K$X\wNRkw
%$kTlk /WedK8X^^CPIPCwJ<9?%aHPG<JI%te*t<>P/HaLGtWNW6lLMweE>XhpTDXP%Q$DXN6wWi4EpN#NAqaQu
!#@DP# p4&TC5iQR!NQC9eB:&%+F/bFACR=nyl$XM6waQE&kkl$cSG@:MjMI!!tEZ>LcAahQEu#t#Kpaq?^JHEm
WZ#FXM ^SGS<pMcV%8tAkF9WDHE%VL\NI^AAIyBd/8yW6yHVaa$b1RwG*NAqnntR%F#p5+TGlRKKaVK4i=pNytk
8/m&uy Dt?/5YjGb@ZPJlND@\+c#HI+aKREMSC?Lu/bc4e+R=HMy%jE?YleYCu*yEDRA6R?L1p$JRM=%8BF1J?H
j=?RiK yFEl8FPj#YjhLn*4u6ad1tDmQ>E#ZZpF#+jw*=C5MJLm?IRwiKqPaAacAbul:Gm!pDwnY=XekA1JXD8X
kte6St 9eGkN*?1a91wYAjaSiEatReFJDtVDkVFPE5!?y<t%Gd4lD\#NJHl#bYLZmNkmpIkEpbI^A5EDXB^KkiB
yI8iul RpNdRhTSNcM8Z>=BLpqKBq\<n>@9/#NHKckCC5VS%iYVIM/YuhK6GpDnDCij+I1l6lCcCEanEp*@K+nQ
T^P6@q C=PmALl5AHF:SeBS<T=iXJJ>hHd+kPM<&nckAPFyY$wXRt=S/D<baum^cd$PAEVI8lJpDdku?F<Y4nXE
4bC1P+ IFuNKi1?TwGQ85qmJEJ6&+Gd\Qht!mdSQAGAKL=n!HMy%mKP$pC+w8V*t<VPt9$Xe=S5qe19cVMVhhqE
WFC$Pl *ycp@ue:IF%tSmt&%!c=<ViWb5liwFRp>Aew=m<Y/j1lt?IeYDjiX$c%i$XNl*ZhWGaB+IGb*p@:Cy1%
4LE%QB mttAy\Mqe+I<De^M9h8XeLI<#iI$+AA#XW>BTEiiB\&WAR#>bT<QepSRF=+Rc:$$$\l&P1m@ZA:?JETF
E$WN/Q QT4GEu*\uNR#pRpBuhP5V/X5e5qEkGuLJ8JPqlTe#mq8RKyGdRjnDdC#IW\I@ZKX<@l&m4wBLeZCVZEq
clkndA IW$cncVaMSSM+=>?uS^Pm4wY?NEFEPHIGSIVeHMjZP<$6<AN41\nquAppwV:c!D$\Yyc:jHdiTi1#5jH
+ty>?A \h\6BVI\%DydFQ$RtF5CBCyEml>qaM+R8KyJkL$B&jA&m>ZnE+uFY5p$RPBL@lJ+GcS<VE&T4m5RLA+u
*eW6*u Ze!ubj+#u*$4%YpS1MKd!KFDjVV<KH1y9d6A5^diNM$iW4^9!EI\p#MWS!bHIy#cD>5m!lT=XZ8wVyW4
lu<A$I %Pm#9M<p?E8Z?4peN5NSp?AV/PDynKN+9J:Q$=H*DqG&&S:^B1y&VQSQIVmV1T*cmunDt#cWh8mDVJGD
4RZIti KAep4\juVH8KhDpC6QMRJh5!t4DQ>FFm5mEbB&CMWXpQG\b=JEpdWwlDJByy81FGQ%TkYBNCM$pFTC?N
qbtFV8 wqwDeIiWc<nlMe+eZhMS:PMSnL<R!Cu<M4qw6AK%!:b9tiCY^JLQGw:ctEB>>lY>X8YB^w#6BFMy4J\b
>#*91c :wa\u$>X=%wlykWID+%:%*4VeAPbm5J<p:wVh6P4H+KGmKu!PMIQGtnK:DNNtQpZp%4F^=>6eeW4#P1\
NXXF1> Cc:pyG:J#NmZkAp+1qL5qM8yQBdjV$AJRmEGJmm#=\YS+Cbq%KFV6+4ykE8956H9JTECdaem=mm*X@9P
KAJ+8D W$a6pdXNM!FPR@dGVMJ*1$GCG/4qSWm56D<HIF8h%W*hFGiDX^IlG:ymCpe!1T@PBVJ/wy*9E=GqwJIm
QQ4A%! 4\pkCNpGZBaBY=lnm5?Knu?cjnKWiStbByMyZbLmLW%\5DmtqkBlY<wC+QFiR1GV?1&KL/Eu<H91558B
-AG5FD 0004b1afdbb001202b3 Page 233 of binaries1.zip
ZF!?B< nCCRJM^YmKAC!%G&N=/kDY#^KiATNqM!C6CMmI$Qm\i=mY=MQkQ=w?a=L^XbG6JpVGA9Awk=KA><R:>%
+tJZa! t?=$&4$TFEH&FKF@K1Bh$T#wNPdL<6Zd>+R+VRDSBS<#^JlKjWaP$QXW&MVtyK\j<e5I6PDbC4kX\MqR
CCtT^^ jWmTQ>EZblNbb@5&P#CK9$>S@MD8GSn<aDW&w5qZqtC&GF%ybZQT%ZnXQFBkup:nlmF?GRMQWLKP=ZSX
cq9cDe V5B:p%K<ElW%Aa?>aAiVJ:GNuwSJnTZ*MC$km^/ie?PRAGhG5M/XyiHWGl8@ywZNHH&RE^PpCjWkPX>4
N:\pWH Ik+@V:6IFZF&T1K&DV1hqJ!t/S119T=$P?F&?h%?R54LN+JQ$^E<V<m1B5NPKdXE\mtAiVV\1W*?4<PB
k9QVRj 1/SyG+k$u+yt6$ypePiq!QqKNAK4$QHA<P4chd$YWMISe^l5dwM1ppl:Ka#%q!BtQAth#!aM8pDT\c>1
E:XthT 1E4c6&cSBMGnIiBKK%lq##M:#&4!\cbGTynR&hAXFuTqFwR=/<^tdZVjC^Me:RH1^1EGcARFWB8/%pm9
X!F\T$ V!bwdM@lyC5XuNW:&B=6SZBL!S:!HnyQH\p^q4+lNyHt$E\j1a!wXc>91<<thYAH8kSqZ5IiW$ZAPwX8
pYdLuD ^>P*pKllXXMiqLKELWaX#PTM&wScQ!XGWZ%iH9QtHdb&I>AAj8FpwEXp*:#pSmy$K^=6qW<p<k/Euhk1
49YmI: y46Fn!SSwpaN=cIX1pWBS>HX1T+uh1JS/*E+D/IHASYN%6PqPlyqGc^Pt<DT$@!GRV5XKEkGkHwNhaK\
IdP44D EB\MVi/c6tXPY#c%yiL%E$LJ^FNkYmbN\%<J8ncY/GG^V\<u$KTVK18ElHA+WCT/&8qbuM!W&EV*L!B/
ly9FP1 EHqaQTN1m=Jby!Q4TDm1>>wtw%FVFGp$Q@lm?=aKaQ!5LLQF:ZT@GW%YXw<tNJ@88k\TA1Kn+Xi?^Fne
CLPTPI piMC:TXIL@GJPWtbwlI#WLp%/W4cEnRA8M#y$um#uC?E1F>L=C1<d!F4e#AIkC%le=BXK>NIMDtDJu/q
jk6%Bd L4?equJTl6+MwZda5kE^WDX^NLwqtTJh<Au8G*!@PpB!b<IJeVIh</BJ@tlWEuN$l\l&PnBK*kB$PY*J
Dc>E9S BL?W+V@Q/JEtuayCCPnw1lI%XGXj*P:&VpEImG<A8:IR!GnnbLwTT=&WyGTC#buRe\jM5lkwpDGBcIi=
Rcq<#T PdE^XuHY^SC<R?VGb!4<cn8@bmKIk\yX!<%$8=IntTQFAQQT<PXyt8eH#CC<k@>qK<:dEnTDSTQqd1hd
G8AR4M ^CtqJBItSN\=4\Hl:tjPSNKX6jQ:hmb$c=d8d\pSQj^KYT$NHpJbt^$+y+Rn1ayX@yElplY+dw*//tla
ES+E6: N=?FI5a14JY16:1i<w^:SX<%>/u4CNYcuFVu!Tb6hCMNT&A4N%&=$#5ZDE8VdGhw%y*tC=Qkj:MA<hIJ
hhl/:# awI!G8<ED8I9RuiYCXtc1:Za5G/indtTMH46AE<BtXNGRiV5QPR1pemThQ#9a4G>n1=dC6AhkGdGwjMd
GQii1B IPmtFdy5n:q=$#I?y?TuVD^GTJEHNHSZEnkCtL5qVnIBinbH/VkcD/SLhjua4eNGF>HanIVJLQF5YViV
MCy1lD @NB1/Nw8I%Mu1/EkHF>F9<*Fd\kCK*t#FM@^TkE8P>yNZcBdK8l/R:m&&&J$Lm:CFVR/^dYjWu/pMpaC
TwcMHL JldWE&p*KHdqAH%YJ1kR>k$G$=pML:#TVXq$l&h#pp<@A8Q^8+6X=cb8#>LRimIY+=iuNMh6Vy\N^ZAF
I+cYSE YhHTemXDWL&J&k9l9YlwG9mPdm*Np4#*#CdkR^JLl<dVBPB+>V=1!8QlW$Py=$*EkC$*EDHlWF$8kc/&
bn6qT1 k6V#k4Ay*1:/1Kwk/&p?TkMnt$>p1^hIJyI*/Qc+QL>SK$TuJhju/L+MZyA!E@Wp$*TJEq$/4WA&MwC6
%pG<Y< pJBMlt+dh:wT@RqBeCVm9B51m\*h41!iK*l#KnWC!FSitb*q%<GANQI9#8^N89/RZ#t%*WL#lVaqR>hF
4PEN?t <k/%Y/uhkm^bLEq6$^SPeY\HQ*NV6:pkI$peKbk>Z/CtDN*Jd<q&:=NpyRD&/HThPM\8anl+NChZNZ/B
Ijkmw= JL>5b:6FDSlKA$R@HTRMSwPYTbyhNhkeuuDE1WyyH*FKyX^^R>d8TnnmAw9F1ljZAiynR$V+YqkS#\hX
?I&T&: QSZKXL9FRdTLc4tMu=&dW@ipJRn1:EwAGkiR#ZMS>Rq?bdI6RjW6Bd>YW*CDTqCDVdVu8XGEE*SAKp&H
IWS696 qi=iTl48yT=H8!<qRkD$cya=S8RqZZGTd^4jy$uS8mS$pB?mtmMcM>S*S=Q\lu=L%yt\&WAtL\Z\yuP/
:jic:/ i%qYM#j%&u/dI\>6Ak5YPGmpLJ5u&e^t+$JP=BQ6RiyjlMSp5*SS56QGL$9KVqPmA?JKMcTF:8>ywD6y
M>J/J@ eIn\dklWdDSLq5CD=GtqkYJFli=e#>C*/Dwyjtu^F?l1Imi@/\>!+W=JwS#Qq>PhiSTDP@u>AVAZ?i1q
V5HCZ4 AG+>+iIluTWICq5DG6&BVVPAhIG/M$5#D$=C1BZbT61yGLCZn1SD5LtehJEDHmZacFlNh&dhd6*qaQce
qZ$qub qAwbtVp!9:wI#<@up*RDNKYnb#q^FuD\d4w/t#$^Y!EeG@KTWyMYA59uY:N$wRimYc1NWMyWRS\FwGiF
$y^>G6 9!be5JCnM4w$l5/S:ukZ1EZNT=EcJRbN&&\u*T:lhQJ4EunY\ibP/4E<DVW@*k#Sy/mC4ppuCI!DNJI%
TDq&ZR L8BwICY/qlB8uD/E&b<CVIRY8lKV:Q?AMdR:ZjqpIk?ByC\+ZdFFHR5/HFCCuEeCDl^/kiPnSBYM6X9k
@t>eG> NDa4JBy$@%hR+<NjhGF<I@TLE1M1>9Ic\Z4X/!WuV9acpN$St&T%HBapnP^u*TAeXm=d#bH#J8$a9$a9
1Nb*9Y Yd$t*P=Pb6%+HBTwQ=@pdJY>9kC@+!\6=#klNXthBn16NEPEiNbCMdJJ&e=5FaDEdXP5li//65FtW*5N
$jeu*E 1KFcwlqcJ9Qi$##<6J+F>MI=Ck^CC*HGK:mhVwF5HQ<:Ea8X^e1uj*qln8Z@+$>B@G>@CiJF>6j@:#@c
wVRi8! <Pu@d*!jMa6lYm4>j@uQu+$*@5L5:#EYNW^&b@ZHSjn^Xj/nhW*ycuRWm@Hdbm!?HH8Hj1/6u+yi@dmn
EcMCCP ?uPhPYXPPcw@%=lt8hJj@hqmSw*JQi<\?:9MYnLN!4d1n?YK8j6w>eewj6%h@jE4=mqV=#?!Jhl>AI>+
p^e>dY 6:1qFu8Zj1=hMudC9Imjt/ek4Jj^CqE#e9*$8&\&@u*Zbed1<dXL::A=CJk6!@NZGK9Bq/j@@C/dm$C1
#p:&8# >y:el19XZ$%5iJjNt&dY&n@Mhei8+VZLy$+>6j=hNu?c%hi&du8lq:GlV$CJMXYij8Xh6tCc&X4jdH8\
lCq*VK Ldd=#MZ4YB+%VTQQq#hI*99qmZlZiPZ//+\+tiHL:Y%4%ih9c^^Mc*J5uH=@>hF*&T*+jYnINn^?V=et
y*jTee :i<dB&i9Xm1yh>q6FVdL+p11##@<E=?19#N!jaJbh$/Xhy>:q!&55Cdl<J>jHi!>@@+8jhlZ/m?#&nYG
NH6tBY cZdF*tP*+$QLR@P@u6QjYi:YN%*6Me8M+WPGq%lWadN4Z>c?8VJ<Y<E*5Q*+<N+*d8Cdb4u*HZ!VQ4Wt
M#lMHE e?&m:<^D/<VZLl$*Q5TuT$=NtihtQy%@=uq^p^=cFV4&<MuT*$Z\chNqe/#4>H65eaW%#&q@XH@=*QM9
StCbP! yQ#q<+Yl\hM*<YZ#hjPmw@4^ZaZGdp<YF9a:9lQdS<ei^<jNq/a1lXn%+*c*>5C8$iju6?&@eQqT6QjZ
dJBeb1 ?Ll?h&u:>Z:?5cp*yi/@/@:8N\eLP*ciHBk/l+?d!tZ#@J:*IBi5^TI?%KtQhL?RH>:><YCQ:<IY?94J
pQGCyT !5q9h?D#C19N@*B%&<pQDLF?+Em=iDZ<<YuwjiNI1V#=!u8E%8aIl@@!:JpS5?9BL^b*HV<@WN4pwF8E
NB1d$I nRq#a&JtRh#>+eAPe#^\>P4k+TuVuP4Hk9yDy@1M*%WZ%Q:Z@A9mMZQ<64Eu#=iQtPdqc@TE!jGSZ#m1
GeqC4l C>1?>uQ*+bL=RYD\!FQKBtQe9HPT/<Z8D#jPQPH#9>J@*Fh/LBWyn=1uIW:Z/RucF4P<j8aJL!aQZn=%
MYQeDG Nj$Hyi61J%6mt5Q<CiQT4&aY8B<Ij9NLJjN@*GPi>J%pqqQtJBba^C*tl\huuuBQ&>j@LY4ihTT*+!4W
B99t5@ ZI^P$aLK%PcV6:#HqmJIF@j>>yG\aYd%!qD+FhmB&+*aFFd+@be8u?E4bl*h$:9TH:t<iyPu6Q$$eGYN
%t/Q\V !XeWnbNQd8Cd#Pwetc5NtBY6h@LTc^$XbquTV\8&D%+6?jll#Sy!:SV:VEQc>*hjK5ctGi8k#$>eGD/1
HG+4wp 9<h8M!H&w1hh@D6n9P6T#&D9J<^/btV5@LPRdH^W8@!lXZh@Ey*c>NSWibm$:1uJK=MjX4<tuNZQ/pjM
y4QTSc <j5jFH*V?N1HS#ahuq9>1HdXK4G#hPHm<NV4X@Q+/FnjqhHe#Ei=ZQj^pc5V?8G^$Ij+!Le9epY4dtbN
MaL8Rb hSW&t?dbI&Q?95hy5?&V^+eH1%?:QcR9Z:uF*J+j9D4Rn/<N?WhG8>=nC@GSM!YiKX\!C=:!<e4Y//#P
NKY+X@ 58qd@plu:H*?9h6EKdn=yDqi<F*/8>Q+Z8@JQ?y/hd8X:R<58&Ri?cuue6@%$:Th/@#X+ii1&:uWwb?5
NMbapc myw>F$?pn*Vkc!N>>+\i4Y:u<Zh&qW?b\#?=MnWiw?%Pi1:8DM^56^F8=@kBa@VD++hQ^9C>ZQiQj>L/
B4Q5IX H49XbI$QjmupHqqm?n&qwV>?DAJ&F$hH?GcN4@=laF@Qtm5DjcHJW:B+FymK!?*Xn*Lh:6CFN4N!1HRp
GXy+y# @DG4qWbE@TB6%eR5D#$\6LJu!i:D^hD+CL+q/GHQ>u*9<a?C&#IDV#adA#5G9uL#E!/Sw9+@?EjC!+MB
+npm*u @$?d\Z/n<A$<eCmpn@qtH9nNX$h@@GS>bW6=dQh%?yb:!QQwM&BXE:Q9>Yu?6&8N$bM>u8FQYJ&kd^p/
\BI+Z: EeLZdt%m6Z<R>eQu/5$hI?c=ThA%IP:ZSL=Zdd6W/H1qynIiDWajynj<lW<886>ndu\pci=Vj^I8qAcP
V=<ij< FR:mNZ:Rp>F#pG8LdT*h^$hZeX5E?I8:tqld%/BiiN^!>cuLFe<$QiXd1*4$X/hlklwk!a^bHS$6nC*4
Qh@Q&9 5Dk16L#yT:uP!C9MQBq=d@Jq9K4qe$Q/cAcQFt^Cm<EcLC$NLXa+?lb55dKJ%j%&?/9/G/#91uF<pIkY
d4J:P$ p8hZBVy95mcHMKeqb4Y\nn*M%wHw/P+t%uBd=w>>@T^//wR^S9Saut\j!\#B@ZR5heR/a5#m5B4M8lVI
R5G*ZP yeFku&%mh@%d#$1yu!$bK$b/8:G?h6:4h%+Wy%t4aG96^n8*YB^:4NB=>^/K#%dleQ:iZam<\byNe?#1
w%C+QK &:SB>=9@9FKea5$Y^y=8ec^*:Fuj9:b>GRPQ<Qm@YZ#5@6F?8N84jc6DYG%>+iHZ#mZ^?KYP#p:L9XbL
/tP8BI 1>$1#GG&HKP@RaL*d@9:6#!>y%qN&VT9$PMF^F8D+Tp&4&%Pm<5Yj@1?q?=6ai98c*EVnQ=eE?6<@WH*
5FJE&T <GpAwKuLQijwhc#uB\Q8Ct8##pYW>QVcF5Fl*SD9eLS*^tIhjIjR8l=>Eq?PS5*9$XubL?:MjV/HHjb&
aJhyZC 45?%^B>1i/J%cd9>ciiG>Vc?\<w9HjZ<5IQebYXE\91GPe@9HM%kB<j>De8:YwTY6b&%9>q4Fh%cp?Mq
T^uZ:C SpT:%DG>nB$c#XI9J:y#<\QLH/$RkwK4LV!$DpLlZ41B5hcQ:j\RD4@&&EAj9qB#!n^&Eq?at*6#TQpT
-A5?TD 000f1ac81a6001202b3 Page 234 of binaries1.zip
*F@j:C nCCNQLRtY9IY%9+m\pN4\@$&95Mnmu6A\le5JZPW1Lb9&Kn@<Yq<wSZG6/:RcVC:>bu%#My1%//N5d64
T49<:I &be8n+5DFXc#^4\cJT+%D+nh^&GG=?CyVaJ#ia!6Fdy@aM&@MQeZB96eLZ6u@wM:?m4MCph!B9aDG##y
!Dw$?Z G%mL6:Fbb:GPtMY:y<Ic6A%bkh*d&i&kHXd*lMWSkKe6p>9yC<:@e%@u\cM+/K<6e*Sa84<8hDma&C*e
%^1!cV &>/1CTClqqHteR#4F=nD6L/q/+QR1*9w#*@X65L^d<1#8hba/@wP&>N:B5EydHB&+QmJZu^BMC=%+A98
M4H<cu Vu*w\c>Q5:4%hL9p51$k&hX&y@M?%:48y@hk9WZ5DS$ilp16Pj^uLL>*iZi1/^YeYp54Zhb!?^=\#>1a
W\HuL1 d:AJmb+8@9#C/5GBMc!9u?nH?tX#89VnL&J>:Viibl&PXX5j5uXbckhbh5@!9%wja/8\Q1WQQndJLMjI
jd:#Bd C<^6<8tyQMlh^tIP!*^?>d1an:WpE@9Z64C:<DcQZV\^lNY*$ePj/ey%hed\<Lt*hNma>jaPY>^mP*#W
lBt^!W 9hdlhL<c\*JY<EnuL&B=:h6a:qy&Sl#/LydHD4L/k@VuYm#=i*ihm#XijFa/&IF*5RS/i9yCN^tLnENn
LCjI*h 9u@:=@QR+LdYle9896c@yPZyyuQNqaj6j*9>+P%hLeTb%T8H:54jbJcGjm#9jmdqYR/jQd>F?AG49&by
h!j5MS 54LwyN?Vj&uqbJ69qIVHe8b/aYR*%q5&V5C5N9m/<yt6yGFhR9NGhni::+8XTPXJc>&N$#@5YI8ZF+b8
c!/W1n %@@48S9MWlidaLZ>!\6j8$m$L4&#=b>8Y65k$<hM/i$>?:/*<8=nD4c!%9KAQ8B@?ENYb>&:6@XXh#>i
^w8Qli ^RJ:+LuY5hnGw8daXLj%d+56Q*#I\h!%q5KJm/eiydZ*iXL#hH15>S:YiM$=t#uLQbhQV8>beKQ%n$hd
$QSdej cGqweHZ\%%k1KN*m?wEP?l5Vi%>wQt%d*NB\AaL<e8*j@u9!46>*+A&EqGjpmE=QZT6&H?8PEVPi9bQX
*YKPW: Ql*:pWPalHlh*#B9/>dBIj:a\lN@89lL4K*>nDn@YZ/IHYyLnQ:MFLTdYd=Z&%F:&%*hMXw1d6y?:GW5
\T>n*m dZ%SPqMI$hKG#<EdPL:TGnee/&6@9eHlTK+<8IG%%>beHE^Q@8qDHN+@9H1\M+ZDE*:c\JL&^S*6^nQY
!RBTGm q#+WW1**99+t4Ec65Gy5%?CViGnnD@!dSQ=R%:K%!#ym8!!YC!%h:KVL>qZ*@ye*EGQQ>#+ZIedc*?\?
P>#*#h 1LqBqtASjkbe*LGtySd9KlacPnjph?b5>NmB*p8d8tu6/IZl\T+8t^$hn9Z6^649Z>l4Fca:lM:c/MhE
nRbiH$ Xw*+liPZ*<jT?6/A6?6qYu19Z&mAIyC=iu:yl@b<R%C#$ZG^5*?+NQVZIK6&:QX*Z+d>th>m9hP%ht/>
\u*WTi $YC>M6j&*QYH=4/TNN:hR$@h>Nn?99?Gy>aW*@!Tt1PuL8<WYQ\b5/MnP9&$bh1YdF$^<HqmkiYDa+ZD
9^V5%Q %:HWe1W!1L?Kp&&#dGQ*\ij6ch@^h9#ujW=u<5VqF?myR94KcGHnJXadNT@t9HT\kt&^h89WqW944F?=
qS?YJJ +Zy\P9F5#+/h?R+ekYX!1Pj+WT^h$:8q<DX//DQ44jYuVpXQh!!=@uVNl<+Xb8W6YAyZLj9GMj*C&=ew
e/KV!^ pJpeQ>EByX>%*!K#jGId+kHupi?>5M?MdH@YRa<MDJ*w/edCb4Q$WD8y#AN*YyyQVI*q%nNLT@P9%#>R
dGKpaJ H6N@6\iQ6I!PZl/tS>bE#e6u>8CS?YW@MnijjN?/=?q%+wjbj#d:\55aH5uCh$8ZR=ewEK&<TljA6VW<
lSW?IW &CFh9qV?^WN*6LeeMNyYqCdPhNFK!?Cq5i<e9em5Z#I4*T<T=S*LZM&:ne\$uyue<6nikjHlIWcW5=h:
=XXIPW i4::NqciMm<i@l%Yh4R>dN%*+e%L9X*&?%:19j:$Q%<aE$Pe<9L4^YMTXm+=NjuRa<S*h@#8e6?Yai6L
19#j&W 4p/#$8Yb8p^&FR9%%+d<iT!5N!1D!<qZh4jMH%TQq6:\me9Lt>&Hh9n8YPcklYPdT^i9ZKV+j:iimXFF
\L>MKL 5G*>n!ctBuy/G8d8m+=uN+%jPt9RT@b+*6p%nIYCcR=$\q/%YZ>1i*B5Xi?J>*P?a?P@Q9/N!j#>!@ni
6j^V>L +iMuD=@=kC*caldChQX\^:y%:4=C>:@%mY6Ly!:ZHltWqqu+R6@X44hPj5C5$XPV!cQ<mT*N:\+NlM9=
@H%BKI u?!cGH=4bWS:9wM9*Q#NC%h?m+ZNycq\Ck5hj&6Pjdt:PP\*4ywuy5#K8d&^qk=c/Np%<iw\61+9X>yE
MA6ZZT <nD8u%*?9dS&dKJpXmwun%&aPL5HV%\Bd@q*A^e8j5B85=nSWS&@56#@D%>i$^Qy*SLhPZL+@PRqeV%<
ayp#+9 8K8P@e&pEV\S?+CbymWu$m58?>tb9/T?u4=<1dS:c5iSp+QL+iVbHdX5@q$D8\iBhSekm5C?HZN@*96b
SA9S1b i>*y4b@::@PZ^N?+c&kDiL8mnu*^&FX>CM?41d>/QRS8C&&?\b@1/=:Jj9Vj9>L#@V<QF?dc?d/*ni$1
u89\:1 ?tmh=hVWZ8#dE55FAlijKQ*QZ@=jP^j>%ZjG%9?8A&?>9I+%>\/EB\G!lciM:k1dI:w#i%Q4H9#!><:<
Jdq?<p euZ1^#6QLIXJ\K4G:idtZAhY@e&ydpTeN6dYiY:?mu9@jGj<i#>V4t%ct/m\bZY5/XnQyTFc6cTe4:AY
18LAE^ h:!45/9^>G9j??!9jlS@6WCKDkwci$:?hRpd*6=59kG?CW!<Q*l^:+F@Pj@=Q/Z1*?96tp6I?++/Xu@+
M>+9NP $1Z&4i>VLQw?CLW$6Pmy?h<a&VZ=&jidZ@nFec&nld?b<MuJp?@&a=pqc8L>a#<RY5j?+j/jd#:?!Y?W
>a6>#Z 5@?/%\X<lDi4>%<y4N:/HlPmJ9naa499%jT/d=/?6uQ5CjQZ%^+=<*TFjccP%R!j&H$?n$XLcFG#^dy?
in<AY5 ^D8=/&hHiw<WBu=&e6p$8<Np%1qLBi>YmNJm%tbi\/MeT&8b/lt<9M8a&n%^1VMQZPY8a=dB98mPX!=D
/>e:=c ?AD/Hw4XZ:%lMLNqh5jkJq<=e8Sa:<Dtp^i#>%XaP=cPtV>b>59L#Aa=1Ju%9tB?CQkpLF9c%ypbGm4C
c54<jH APXY6:SW&E45jWY@M4aYK:Q>#HdS#cbMHIZXN1j%#FDQ=6Gi*aZB$ZM//#CaG&8H#jDPw=hb\:P64K&6
9u=Ed6 $L?Gp@S>/:*6$9A:peE*6$>>Rd5ZB?LC$y*HT5@S$wQ^YE*u?4eZt*?85Kb+c&yVbnl#&c@@eHVRNe**
d*whNN *#R/@pH/Cq6pZhi^\VJ^WQ&Sia*FYIhq44n?nH=??PKX9?k95j:18*+qi8Hq!T65Xw*LuYYVt*ahMt<\
mR+t$w SC=Nc=Pi5GjqyyZ@ShI#84Y/>56Zi++69\LIP&>Qh<ec>dj?1Wu\aL*\WQ/bnieP9q*\m9e#w15hc^j%
h8RM@N XH+@lLYY>e<=N!!bQJcNu5Ld%ny5/iMD$5Dj6n@a6Z+Dj>9c=4=nl$@E44KF4b%Q:*ZZG:@\ST8<ctSj
X\F=lk j%@!@m+6PBn\=i#X6W&q9uBu^%ZYPM@SqZ*ia9:4\I@MGPZeq1<Yhdi?>@t=n9Wh?AZiwLa?QFIaPw&%
&1WyAF !>LQN5k^YPi\ic*CGni$JNc9!/:N*jH!e$8u?FQ4T=MjuuhebdNc85SHX&>ae:Yu#d\BqDFL5Hi/N:S@
c!6W8I Q4Wl&=>\VLM:5datjC4$Yn?iK4Y$#t9d8MRe/DaNlB5JY<^mtb8I*i8i&:%5D/pRFq6Kq<wQ9+LF#?4b
@kin=? k&h!>ibdQX5M^IlCQ4q?ii9i&H4LJHND<mdM$M@#%$DGI@e>&LA/XFPi!J\k8l4ZC\+lhn@4ml@5EKbb
<8BF4u P=a?NZV<%?i85669$S\HB<V9t=Q9?E&EbSa+84*=d5jBqk%#Y$EXX9abq>YniGnN8tY//k*%S+*Xt$pX
GqKA*D b6pw+BJ5LVaLw#@eSE?>?<VwWDea5Qj=nnu8%MdFb94u=nZ/M%8hhy6FYIywl$G&X&DqF//a9mN+c8*!
B4^*qw 4qXTdqN*w@qB>>Xy88AM+e4/>dGahbLhabDQFw@<I9aSc:K?<MC>e$><9XB9D9tm=p%Y%$HB:u&PKjbb
Z!dlq\ LLPd$>yQa?M<Aq9W%4ZW/*6PFu>#c9LMCXAF:+FaElcj@tC!hby@wZ=p^:u*PmbkpCwGY&B9V<RjiQJE
?%b%u^ cG8=544b@DPSbdY$+DNt5dhME^61c=+14>!@haLNY^Wuq@t$=D4+l*YDmVZGtR?mIJH?Q1nFa4*BXltW
<Q&wXY nK8<HHmq#FwdRyN+YPjR*KVWG=d?55RMye*yKc1KW5C^hJL?u4F%>=En\!>mehM>9q@mFji?tD%$^%DZ
b#GPPC 5VyVQ:6t?nJdkTZS!q<Kn>$A!u^9=Q#Zam!*dq*dR&N69h*@cF:WL+AbVJlkh&LhF<8dSQ$Gt?@?1W<d
VuZl<< /th8d?6>l=hNDQX5NTi%L=JJ5FK%FYR9\?LF=4n9CBajj?@m+hFj%8dY@4bhLN<8@uVQ*edL#=$/jaZh
MSRl+% WaFYVR$XZ+yN5kX*@i!wu6*^IM6&@j*!:8h@:@@Dp&6M/jjt6i1!t8&nZ:6\G55K@^Ac&9KLS=?=6h*&
M:Spm? \5D&mB#P%J6J>>ZyK$SHda%=?jnRb/jaLZh98nAmjdDDh@SkX8&WWu9jpkK@1Z#$/BwD//cb%VVPnJYt
QqB51Y &c&Ywe5>*p&>#*it*eyD+8nE?S&dln<VHj*^F9MKc=>t6bHC>ki@?WcF*ha**K5>PLm#KJd*Qt94j5A>
bGt<QW +5+Q9FGcj19ilEX\V:NqT/I>R*/#u/$6y<iG#$?WB:wP=:?YE%ei%aMF#<d<GtQ6#<$@X=jiZ6t:KVRW
4X\wYF QV!WtS\8jHqV>>9/RNe9jjh&>^S?+4:<LcuJ*HTLic&/6L=W:n%5+4&8dlpV@#lahk/?u@qc:J=>6&/?
c&?l&S jHHkX\Q@bJ:?d&8t1$8BX\<Pd://=cu\^ah/h%=i4R>8H@l<u@BtMh8>??YZ#@%L>LL#FJc&V:HQtQ>/
B?1e?p /wGB1ZH#%P4Zn@WP9:Xy+wWZ@mnpZ*:pTE@<E$q@!Q#aX&@mwXN5&bcQ85an$XNu#q/+XD\@?LZlB$Pl
585e6m #:<@d?ZQC1t?d\!JG=hW4Gu#>DY?hLa^=6>jG8y=15jj<%R8NQdIRH6!/Q/Z*@RXB=+w>K:jb&c@i8yc
$H=Eqe hYu>lKmjK=nt!XMnJ\cHyPI8:e/Lmk8/@*<QjGH:\GM@NHMP<*y%1YZ1e1<uitF<=PLp8dQ/%Dh4^Y!:
661e+X @E?d#k>GVw/>JpyjuZy?:yad%%n:JQ9M!h9Gn8iiK8$?iTS/?Jkat6D*u*@?!cFXBd%dj>Cu=W6@GX^k
1*$FZi +KGVPK5S>>m^%/?PDb=a@>1t+qCZ@l9*:?aQ/n5H#w?FP%<?GL$i9<?ETcCq#Y?N?h:/!Znj^B?&u^n6
QN<ne* y8dR&LL=8aHnj^48>aSWja*^pGQN#FLl@PDk#m5uSncFZ@6n:$kQ6wRDHu%:\bF9H45+QCR&V!*d$@nu
<#4Jm! n%n:Vhb!&jjW+aEh95FN@1j$w*yPIq>/%$D!dHHL8Nmyj>Z<R#i:<SF#*YVN1/>?+%L9mXK=iPHqIa>i
aZK:yW /IIj5=?#QBWcMMXR=$9t?!JdZF&+cQu@ZD$$$NM*eitI@+*S+R*p>EjbwtP:Qllc?Wni9Hlj4Ppn6kIL
^BT@w9 /\^@cZP^1G>/iQ#<tyAYt&c#q#Fl<Ie:#^RYhc*bhVSt?anhkZYY=+hj@TV$&w:BAji9#k:+ENa$*eI5
<cH$XE V*aXw>%@ju4BqQ*^c&#yDhb$ajnC@6iL4=/@QQTkd*D>DYbj&LVV%CjQQtjtbq%nD1^aii^dBcp\6uQ\
-AttX9 00018b3bf17001202b3 Page 235 of binaries1.zip
%R6^ed =Qnl*Q6q%qC#i9QAh**@cA/69eaY*&C#tpb@FSuajjkuP=QjPD5/#t!FT?jQH>Tm9*96Gq8Cn&6YZ^p6
kKSMi* DwRuS56Dt+jGYaQ>&Fnw?YZt?NjB><Xq%qn<wt>meHmkb?QII*q<dQH&lEaQL1k+P#=mm@C^b/l$><Zn
T1QA9Y q:?<QZT!@#1#?d?<4jPiA=X&^$h5abubd^9XSp@>&?4C5TH%E&c44\^$@ibi<$!??tHNnuK+/?mX+d#$
cqtQ&E J@y\>=HB6n%H#ub>^G/jaA%Dj*X5/yR?Yky9\GiN=5lL*X>jMJtwj4c!/F&X9#LTI<d\&bLw4pF^uiYD
EQ!Pdl dS?^&!cadbGujH=pW?@\$a@^TQPQ^=P9^L:ZW9%I1QlP:NCH9B9\pTW/eZlwju@#:#=m6+!#?5bN9c>P
+Jid/h DS$G!jWHJp?8G<&#@w@akuFYX#5&PPad/4@G/n%V$yQLN:BZQtL#4nQ41y&>IRCR&1aHk?9&@9A1t@5J
kT:qH@ E^yimF%BqD#=i8d51:F44QF6BLi=V6@i@84Q>1Fe=<F<>ijte$QhQ&/=^8^n#H1y<:ZH>P1QjV$j#E%W
9b&#XT j&^iGV!DL>yGtXAa9?e1@<H#+Q41D!9jeXS@5D\J?%n*FtP@8<KE*<:<%!Re\K#@<T@M?8@@\lmV4P<?
TbQERk j:SnLZ=c!CVGN6#@%Y=Y\?!NJ$\V:wSb*@*SZ#ei^<<%e:D!u*@R?C9<dN%1+Pj9N9/Tj9/ZP/#9:8qu
cB6H:$ @@@<*@<DWE5DBBRAAkAIAG^XdTWH+5wyNGwDAIDdBAA+AAAAa&^ybY=$e!>\b*A9dYFnL%BHWGN5cYX8
L>#1in hE^yam>#d*X!a&W9WEhRW*B5aZNwWFA8euN!a!=mcY/W@RXeXP8:@kHQ$J&CaMjihk<lhtEZKnawImLT
P5+*8A *h$6Kmw1Kkw1KmyKC\kTCpm*6i*GStJt4jZi>:MG%HQP?@?<:@q>PP/6dl%t%9i=4n5jn6L/bi5*&qtb
bMl\JT PP=j9*/Kk/PDKij@9@@d5HHD+k$d>bh\@@=y5aiy%*=M6$y@:hZ=@?W@>Qe@?BX@=PJ9*5kSc><I@:Lb
?pPEd9 $YKDmbQbGte4J\5:K\5#B:G#+\iHFXw8hN=4ad9M#Guh@*1=V4aPDk=:><F@=GBq=n=b=I<Z^MD@@i?@
ahHTiA F%<Y?^I@Dq:p:LnCB9=LG^M4jVj&S$MdT^6dX^8^M<Pp\8:5k4>!lbPb6hk=V@Y\Iy@X!^a85ZA$6dJ%
kFhyV5 hHa\&?SkaYJndtWtGqa*IK#I%Hc9tipcC^5Lc&j4JTbPJl56QM#E+w<yllZl9!$*5hq4bic\!h$Pj4Jk
qm\9G! WFmSJjqb?NM=wpyHqI/R%@Pc&<JSFtHpPA\N@:be?NZ*K@l@Th#9HQYbm%c5?j*#!^#C:jbj**MA*pcb
8N+kC: @6>:Au=pR4j?<h?KpZ@8?#PXPCM+wl!y@@ZY>Q$>?PMC$TZqnA4X$@u>c<iHh/>jQ9@9!cQ&66dYF41b
Gm#khW c8I$<P8HNVR%6:T%Q*:!:MZ46^</Qu*<<QHny+:Q*::@/P#1/SXRA8aJM+ttBQ!i4q?huV>@jQ@&>VQ?
K?RXwZ TT@?i>Li&9Tk>E=?dtd/6T8ZW5/hVWw/q:^8pKbAk>H<w1E&WG&KZ%XPV8/F<N5%dW>i9P9+*6uNy:kW
^Sp<qC HenWM\^NW!5F@N/i:m:+M:>>/jn$+h&d%!@aX>jeWF%SZqJ<y<DJ!huXK!D<WGJKWtLC$eN^5VHS$dGH
\:L4aQ n!ii8=TYpXheWh9<<NtdV>?:8u>?bd+\u?tPRjD1Z:XZ*<%JT#+SF^u5:?*l=8^kb&N%aL@=Q61M8>iW
$B!W$@ *nQibQe8a!Nn+%$ti@cctX6aY69cP:6/iH6=iul/iuu:?keGl$ejQJJ\Pnu%PyZJbDC*1J9eY^tjM&X8
H*ddFj Z4?cmm<nQm=/cFSEiGl\wL?jD@+F>nbYF96M61=b6uniLF$hdY$6AW>BT%NTRq^TSqF%\ABqiSpyYqJH
EFXA:T Sq=JWWFPVq=STWqPTuYY<ia6Y>j!>LidY#t+iRiG^<auJCcqZLy!LV$#=*bSYYXNa>9nb/@i99<w?CV=
Gn$+BV <j&:N&@jj@lIh+l?@9LqK@jHL:1H*<*ywn5=Q\W@PD@yVt=ZN>*#V@i9#y@p\@u$<j*:h&@j9uu#?9Y4
AlSVVy q*%9cXN>ZW%%>RN?FjPA4y=iW%eQH*64?/Mu@#&H9/dn!@jPuy=jQ?ASij91?hNHde*%%bZqJjDSb6%K
T@Njwd 9=b&JjZTBVyqZQL=e$quV!iiVDl/JC+&PmI$GN+AL\<*F!eHi^94A^d:#E!&G^15YdFM@!XQR&@FDl9@
1CNiNC ?LT:#e%qtVjV4/jl<*H/lQ<c:Xi<WJ:Icm/HF8GICLm>InTZEcHkT$SWSwqYFBp\d5b:*n@cim8M4H&m
5&CeD1 E$+uuW<?u=S+LC+</uDC&bVW1>jTd&cY%4c$6VR*NhHN+9ZXFjjKT1m:A<48XXdZN:i%6:jYX><98bPZ
XyETZB tZ:%+9tqb$+qHD<cj#k8JnI5!MeN#yXh&#c5Z4yp+j^=e?jPtV6**9!Fm@TZ4%1*cb8^&RF:X=?RtPQu
1T8aRY 48YY%4c%Xh@NTp&M<ZM$*:b14w:&jS:DE=%Z#mlR9d>?jQ9</j*d%!?iQZ*!mG+ZAbAELV*NVI65G@6i
9Pablu 9uu@5cPD@5S$!H#??8%H=/@8Hn=FI$KV@$DwG*ui<b%?*N:TWHt*MC<:I#$6>WJ!$lqk/H#C=tFClkaM
Y#:ZTK XB?:4#\*P#e9@G:d$=j9Q<QH>BhC$*<n>QZ#y\@\!q+?^=jY*64eXFhhYZG9*MuS&e$4IPJ\a54bW<jn
=utKbD D^&MwcQXEKGpm+nR@b1t>9>ij@#Y%jQ#G$Mkan1GjQyIGL1Ye9JRXLC@4=i:m=P>udZXAR8kcF?9GYe9
55EE4y be4bT=9Jtq5e5Lc^h*S&>@L&y4$ad*qj@+Dk5MmaR$hQJX&+tp=ue:JwRIm?JbKStetHj^bpWZ>#FBpi
=uLC&J FmLp!NZJ*5b!9>q8\>Z/C?j1CVpcyDX65LTplKTMEkFJYpyTWpycVqEBRcKXJ5nKKE<%*4=6l>H54j86
+tPy@e Hh%>kmIP^y>An1=i9\peFbhX%nd%e/VAekSuY\hm>I*d&WZ%eL1yHt:*L:yV<JQyFQu%Q#u/\ILEe9V5
+K4A5p !iPHdT*AWjYD1518Cq=q%aN1+KkSMH4+=L<Z4>>>@Q!65:8u/?i*#^@j9RcK&kqFh@GASIw8y%:<Q!pK
JadVSA \G@j*eZbEh>pm@&AphG&#S5NDICmtW8*Yjpi9q#W&HI9N#5#A#lK9ZD?nB>Lpjm<hdIeLtDEB+\aLk$+
M6/bh1 ma1ITmqVm6^@yu*kVhci6e4a%nitD/LneSG^S^QQZaR#=qbt:9&G69dYq8cY%4dYS9Kk$PZm>!wi%NR*
VB<u>N $?%!4R$Ew1#$6E9JTRQlyS=HmKLCk@$<uK#NVdb6ZK&@aP:5d4%@b<&i8&D^56WGt+%MLi^ejeQmVq:M
^\lL^k 8FQb$q=jqy6&Jm:A&YLH/uqCjtcYM<yWd>hQpKGQ:>/<kuj#!cPHD?q&1w%y=de\4RTky<>jwkb>FuVI
TuELVZ \Cj$@TewEF>A<RGjKaBQL<EHBAn^ij<GD/4&q44:^RY=tVi9E\E/Dj!eT$/$?HeR<6PlwV^<:T&ky!!8
SN!qt4 <Pt4>%>?@P1Dy\Ha?W6@+NQ?CQC<RuwiQ&#H</Yl91+P+jEPnDl!P9uM!YNH+k:GSEhF^S+?hk4k8bXd
<k*MA= jK?/5j$y\QP4y@Md@Y*w%!>jQuh$jH4XS6k=hVk/NNDQ&>MNQqhdkIi&+P!u#iq>QYb!?\AeK&5:B>Rh
D*Y9QB H<yd#Ri=Ca&Inw6QPH$?>XyGdt=PVuaYWb>MVyak8\9RpTHjIZ!KS\=GD$F5kkL<jd$BVWe:/\Q:#a\&
NJZj4@ 4qk!j@bMyKcZ6$^4^plbKRpJPTWXNVWXpB?YGyRjBWXqJVpblZ<*:>lldLdM!MdJ*Ve+M8:wmhNJeLkC
5K\cAC NLu=^iXXhW*6V=/>imiE=9*dh*mtIVMIVZh*n&l*%/>jjMRFCBwH8Q#+A=h*@dk<jjK\9cYyAZCy4Ll@
$&BHP= 4:!eL1QL6i:h4/mwjFBhY>@R*AIj?LPZ4>>@?kwjVHeuH1^kKl+DNVXAViF6R5%XwCcFTYGT^@/NVSnB
aJYhh5 ^6Qh%SuW^>dcE5+t5:%:hl5dGRE&8p5&Y*nHZT!wd/5w!M@L!aLD>jLF<:=46F:^Rulm5#aM+wDk<Lq<
tZ&+j/ In\C?PJKKwD&!A?d<yE*VH9Pt6%&j4Gk^+nN/aSD$ZEwQYuyGbubBXYAB>%G6<5*5>>ZSYXXhX%nC@^E
J+=b6k H#M*$?B$P#Mw<RS=weCM9=i#4aZJ>p%4>PjN$y8y1/NDcVM/@?4P%NPdQZ@^m4YGP$#&&:u=S<TjVe54
1+\1II c&l94mm+ei=I5P5Bw#Z#liVwqVMDkJ^PwjTAk*9/=QFnkIjj#wiZIkQaQH8B\9Q=C@Xbq8ZtX#e+N^4B
kHJX>V thwHn6C=jZ#@?8Y#J\@dtt9K:>#P!eS*JnuyhPLyM!A<Kii<6VSbeyVGHMuN#e/yPyH==AN?QkKKR\WI
qlVp9y 8Su!Q:l=B?Ck#RDbAYhJ6VBPa=*h9aPm+5?eQ**mGH=ekE*MITE&Sji1G>1i9Q4\6dPu<\j#uRHhGa4k
6%8aeV 9AS8e1?qJB/JDmPm+$4A5da<eIC!wQhV=y^>6Qt+@WmP4d&Vm:8Zn=?9n+?9u*>AWEk+C&ZKqjT59D!k
9in+VW J=9Rp<Xp$#u\qWZnX/aMt6SpEMHD5WlRcDARlE?R5+P66aZ=*8$G!^aJhciZS&5NGKewITEyy/T1NpAF
YpMYJi hWhKTpbiWaGYt/Tk1KR5J/8!jKiSpjGB>V95Qj!Cw?KPuV^>Dl/SG:i!ek98*u6R%>#?=HpjRCDK:#?A
Q<&R8& wj/M@H#u@Q4XI>:hBRB%$4@A6%E>59lP\pj#ycQn+\j/@TBYeBCk@+mPN>VXQKm+Z%=YXqyKqhCqVNu$
mKXe?4 <98AWE%hR^MTBQd6A>Gh#8>jP9+9kFI9IWD@w8#<D+DkAQF$h*NlCYLquVIDjHRYdnL*mEt?ZhQ?wLmw
M>8PRN 5CA9B+@ZC>/4Ab>ku1nP&8peEc+IeNND#J5A@qqWqqaWW=DVuDDnM&?+q9de6Td&@4HHpTB+6lIP^<Tj
AWpbKk A5eP:$=PduFNc*i:YB6?X*T%YE%6jXM4*c:R%wn\*M/?hi*!BYBPE*\dYJZw<PAAd#j:A/a:Dhe5uceu
iPnat6 QN*?%hLY%ytyN&jl$nWd6=qa&H5E^TSe!C!8dt86L41benVM*Z4Z8kXChEcXM+wW9:8V1A=4n9/nu#CQ
RNVVAt /WjM\==&taiQun^=ByL#:pMHDibH>85*nH4R5\twZtCHwcaIi48FWR<JWhmwy@FBcRE+a#R!=<+tupw<
eH8#A& nc1Vp4lYW=Nm+Su+V&SYZubY$=tTn>>?hmE<hB<<k+Z\hAyhIJkTyAhPT$Bc$E:a<RtPnp</S!IiWJ#I
Jyy%eQ TMLPldTd8WZqD?ydu:^<@/Y#=>jQj?BXkSb?BZmAubLe/^eT+&QCR\L>+XN%eadQ%Mdc&51TQ5AHjGkL
PtG>Yl &RMa/wCiiZn:?XN?R+Ed<G15=q^K8=qVpH?dwJPXqbtXue*Q/RXwtE^b>8kE>V5WG#WpIy^%c%=@SD*/
IXAmDl C?cRD$c4l<hw1e*RqAK:J15$RE%XtSWiYRZEbmJkw!R9w/!@e=j^dwhNyy:?whGHny<<e@=CH#Z*H>Rn
ThD4:@ Nc<JNVJAnXB%96LjPD<=Zb%k%Z1:$K:J@idqE\Kn\TwP+iW^<NJaD:#eK!568h6h#L6dWqwG8KDkAC&Q
E1ai>u u#=@@d:nK*\mJNS=A\hli$5@LDh9yAE5F%L?VWpt5J#=u:B+ij!t^SIEuhuQ5WBe=l8a8WWq=V=w4!p4
GLF\96 K!p8^KDy?mZ9XaBLEE>p>uIPYDSRt&:\cEmLNNACY1\kM&n1b>+\Li%=/@e+>MF!:5!JI*HH#/Se9k+Y
-A!e^c 00065ab4418001202b3 Page 236 of binaries1.zip
HbLSy! LT?@4Q=Z8\^?S@X%>iA#+dBZdG811TmFk#9n^qW$QIu1J@EymR+QCjB^h:R!M#Je8*T?u1/&%k@iTKBp
B*lwJE %n#>XRaAmcN*/KE#%@I4t694TnI9JWS+&bkaLNSqGStG/RF?D^8F5$E+9JXQBWJM/Ee!n=>AbAQG:Q&u
pmP*>n #:*jyL@@?MptBtklI9!i:u=dByC^WW%>^X*MC:D1e9Jpa8KbyHQuW!/iYD?e%ShFbW*j9Q#M+wKpl$BI
?nndqc :=?EcCIlQT\l1C<5Iwn8W&RZ@qIuBSj\LhHHpnCMPA!8nI=Wk/nnJERhN*Q9qFZX6#^=<j:#V@k#SuZ?
du6CE6 SHd^cSE!e9ywdARKnDed8N4b&6DY6BWDuMAHipDG$kyCGuBtwC><@&HATGl+>EEmLyi9b?aX>FECtGVu
FQGm@I =FC=uD<+Td$AEi=SCDaH>>p#V+!e4CG1&YY+c9E<Xq!/AbMq&6M$yTZEyiTXCTep4JGXX=TH1EbBTXqJ
JKaWlI ZqJ8\i+>8@iddZIKCI5?jQ#W&jMZL+Q@!M+6LLqj*ajJB%bemLck6H#:*5uy@6uD:^d$VGDQF#\bABET
tMNQ=1 ^BBV>l^EGtKaQpSKmw8L:9RYMuhtFBZjLTt:X%HFakK8:P*H#>@BqQ*<SlICREpDT$pPWwLyAHBp#Qt^
16qJBE LCWu?mplwX\@Jub+AFqbYqybATZce>j6eR+@uXuSXk@SS6uhwkIIiqP>pJJAHujPeqE=wKSZGMqR<CWy
lb?XJH A!iHuQLw/X?AEy$FB1bA!VElJTjnD=>I8yTYuytVX%Ba$hVbLku^dtNnW*ML%c:W%q^ZYXbMun+TWmeP
hP^/E/ TAAVEl$BmHk+Y?@d6YZh5kX/8qyjiMP%hjZtLq=l5G&Qqa6@XMLF4NL/>1d!*C8J$d:&i#a5E9I^wJ^S
NQcjR! yRR>JCkEA@cPtF9WEWCEip\>pj49Pdk9pJC9jBaPXn>/tKjMnL/a9!>4>9:N!?hQH4W%%>+4!58/haQX
&#S:Z4 n+RVJ%FB#1he8HS&yhB?KTnMQHe*N/9wdpyDb:iRnpcG/6MQRkeBn8ABu!==Ve@w@=lunQNaX\?@pNmE
9cYc!l e$kH1GlWbEVpH*SW%nW@j9/8+$e*l4&nj9:Aq<dCeiQmtYN^WckkQq:8d9kJIl+&At9GTtDJYEqd&>k=
y#^JlN PLtkkAkCNAMSnckawl<Z$>K#<8@$\WFuM#tCZCcHu<&A:bK>hTP6L>+HM5B&pZDj*SpDF@P>P#e5Z!kW
?Ge^8m ECTD$X:E$\AJAVVW%FTX=KRADYqbBRX=pnpDNCTGdna**YNl8e$lQPbIR8LbbJcM9D8qFhZ%LZ?V<bGR
Xb+DuD AYB<:*#jI\>BC>He#$LhGIJ9G<5ECXV1c=GJ8<X*C8Ed!ch9$@qM\jSCIKP$9KIT\Yl>?AVqk*k6N5S@
pA!\5H <lC+1Q1Dm+5ZW5apu#>@DpKX9:nA$\C<JwDl/8#5mKiPLY*D6dWnZK#b:Sl//6c>%5cc/11Ki/ZF<Khh
ke!*>H <X\FIZ+An/M46wbD%KNZ/LWaETp^VIDIK\!j>lZBYLnS#DEAAu6+jyLQu#%%ND+^?jJ%iEMK:lR@cQub
C:Ftb: #t%4yX5+dXT:eq6#@aN:h#FY^tR68K!V15jn+dRKDRR5:QcddDNa5ZCY4qaH@1F/5^i8MNllb85SjCky
t?eIe1 @W=%Y$6F@4W#B@$h#Va6teqTwRDlQC%kV&uYY!EZ>HMGu$EWn/jT!AX<Gy<?j?N@q$a8YNXAMHl5WNKj
/IWFdC C*6QnNZD%1d15wLj1yGRePKWEI##68MJGb<%FNRH4Wp5#M8?W*K85=9jS\cARR%m!TDlKG5Q<PRnB>>L
%=M@T& /5ZEq/?euh&<@MMPJy^QPkXk^EbHSRnBTLtcuqPIaD^/@4dni*hQ%:@w#\t%LBuyq<+in&PDVndthER&
9dNpI? :Gld^1ddY6dYDu\XKwb@WBAhPBVBAGN%=NkyCB89*ew6LC45%+&eHD=wBy>wlq#G#i6ZlVF>XMRkpkuD
ScT18@ pB/<qT%+1#*d%8pLE<yhlA\F4Z<XIc1ZqqhSH\BwTNNTwnL\KFB!e^TXIc1ZH:jJ*M#M$uw:t$^P:p<t
VpX1=8 I^n+/GIP?SP<K@m&jP\n+<i9>#$V?#NiRMbHwX\I!ZlE!Km8^BP:EL?Luq^i*8*<AkCnyP\?eNHR*Qd+
e6M*HR Q>CL4#?:i*=>@\I^QGDS&qD:F^ayKSMSm/VjYB!Mnk\QCRK><QXG\WDFeHb$hIC*%eHBEdDRt4*K!D++
JeGGFS Id&58cWS@9/1?&X*:?Sj>XnJa1En9tIml!9!h?bLRybYEJFZGAFacP58NnS#Am^APqNTMIPeeBaQ1X!k
NBc*cT w1T&4cih$@c#ZcY6yd+c#BVw$I&$!?mtVmYw\HMBSQl/PN5j&LN>A!HmA&?I>5^bC%h5NN49/B8XeDu9
Ga:4/! juNd>b*$e+iDuQh6%lj!IAhBPp&Clb@jYS@EypFiWIBE:*?c#^CG6@C?j@$GJ?:*H<BDb^eSm8+?H44@
cuklX: $Ip?F%X=F+Imab!SeP^+\pu$WeBDTwLqiD:lRX=b*9Dt9c!eP%i!8@nWH#lwCQn<un:^IX=AYBl+\*<>
\yVpHw <e%db^h*:+D\8JMaEejDKSWbEW=kPE6kKMZc!9M*Hh?:iu1a:qHC!p@HC\JDcqLC+XnRmTBmeX^hEAeH
S4H>/Z !y/^a&\FNw!6HI8Dy:hjRHB\EB&5ESwYES%:CB:Ke^i8*MnMK!JHLQJA=@RCDXR&BVwlq\H^?WZM5^&P
/&^?FG nR#Z^QCe#a8!Dt1*+iyF4E:<InCIc9HGKhKT/&RWXRcw1!4KTp6JTaPFWyCVp\WLyRKkVNqna:dji5@?
e4B:ZH 96IKywV#kaccl4>y?Mk/KALDV@L6@8!bLM^8CMXCiI=kLiYyMCbumTnI#$M#!M>m5tjpkGHH^\6LEZYN
dpl+ai SI4iw+u1?pHm<1iQYl641?:>BRX#unuHJA*6k?IRkRLF\k@W\69LE:B\hiE:e%%epRm>FV66A+=i8>6M
91Ejm= kl^R1@KTwm8ECH?iKG@^bA=Neqw$<NDLFbGRX/RX8GwV9@GGc858Mh#uHABS8JCG+!jQyX:Q!Mp9LC+y
$=eK%a 4?@BKpdd4*dX6ydGGnBPBVtbtDYAE#n^^DHq\\in\wIRB<8>P#i6Yn^dX?5hd:C&:1^F1\%N4N&Dn!Su
^Ru#mX qnT$%>@NTIpQhdZa8qTQyWGyuNGk1X:laa\QNP6A+TS?<cL48VT\<Pd>B!\!Cu=IA\qktXAcEAYG+pFA
i*JIV9 $ceMH$EbIEyD!*T@/Le!HD>/:DeK^<NY5+E*\DBRecJubu=PVqHlqS>@\mBLaCCE@jlPj&P?mLPjdM@:
u#I&d/ mS<?k1Z^Caw<p9m@WdkCKJSW%DT%Q*9>/S5?G#%nMHeDj\1mWJwHKEDAFl&J#lejXyS*J!hHkwQAn4cZ
FQd@d\ huSG9?V4H^SCB\<KCR%D^*Vp?Mt#!cqwthB@w#RkCZ^\VJ^54JDIb>\TBlMk#^Hlt4>%\WFwtXdMb&MJ
p/+y1h FkXFLS=9PIaRew1a:%YRwcWYT&P&Tp=YDqlRXyDTYG^t5j?Auh*i8D<V9YYXNR&6D=@?lRKE*ERZ+Hn1
Z?hKSq SlR/i/b&5%/V1IP\I9JctLEkyXyA+V/meD5*J!5#M!PD8wX=/?qb\APw^F%TtY61i@Vj1*hkuTCp?N4^
PeH5Ty @5&L@+R$*QqNR#JL\?A@cIkC8+k+>QHkRd5#d4R:%<Q#BW>Kd>p&c:<nX+wc/ZbbCGtR!NLL:m\PDE>5
QCXG^^ 6RTuV^<w?FFEVF1iXlCXX^k#+\eRMXN@5:q#RHV<TTRCu9TE$!S=YAD+XnV%6w8&6dc$hdWQcG661u6\
b6Vq*5 4/RR#V1<!JS#b?AJWaJ\P<nQE=A\M#be5&VPVP$*9EFc84PZ4N%t=8AduZn>VuX:e%u&yaS\>\Qdqk8J
FZ=8uj pC>nqCHK@1NWl$lR4=qZ#M9iF#I9ARm\T1kPYItTSK@EJ$V<^?m\WaSRHEmSn/&>k%qCedmEL!9lcQ#S
/:nWhl lBM5E1uun+Zb/\%tI\qb/Wt^bZBIFSbYW=R@$\SBBEZJ>?FAiAAkJIZFm$@$S?aV$#Hlm=8:q%>\hQ!b
8F@LIF qLMun^?Jm+GD/VeV&RX*:%e*p44l4=+i1te+Y86Pqwmdq<?jRt<XV8ycSNqhZYlu^wq^bB#+>4IPTIT:
T^Hdl9 F&yDKB&mBESESl<<SI:w!>h8=SVR^XJ*mM@I#RF^+PcANkk!FVJ8@XE%DA@X/A5mZNp$FF1q8WRePkpS
MEL#&y TpDE%EG!ED4IK\%RH$C<$mIII!DCFmIlQuChuiWBK\hHn#<!6<ZqXdYN@+PIQt*+<jNub$<9qn//846/
p@hyH! yuTVR$AaVZ\T^tC@wYm5J++Faq^kAq=<h@1Mt^tbkES?ASB^9/wGk@kZd+ly/5Ra??X@n>4?BAK4H5te
mcb$ML <*RjECjl<#$WF^MXEabEBCITlAucm?PJyXiPL^A^W*@4Ab?+T\Z%kudy%1d/t14:1j$<mP56XTRB6wAE
k9N%e^ %&CaPKK!myRCX*EK<1C*hK8Rl*QA\:uVJ#FXu+M9>q=XT!<tdJ6d&:wBmGc\VGYp+wciKbq<Iw4S+eF?
<GSVP# um:A\?/6/=dPuRq@ycdY#LuLNlld8wehT<&4cGty!L6!K64Li8eKIR=1ba\clkBC=$uCYLbukZyN9/Jj
IW+5e! M1@pEImQHX?\t9H#J+%IEJGk8wSI>Qd<?m$T\tJkjeZh&!V5B=E:eV\?@8l^FwtL1iiPlu6c@C9RwDT@
uZIm1u cwl411m69*mH#lG>uj1Tn$\IRCMakV#J#CIWlA4BN^Gkk9w<lb!I:l:i@1E^^=LaT8D@CeVV%%nW/BH$
5waP%X nMR@BZpw8**#TuImbl@R:bKKFW8EC\XI<B%quJAGV!IRXBkV4lEbHR8B\<p#=!?CW<w69H8*tHZhIBCC
#HHqWb ZFHMP@E#tR!FY#iJYVy:/lk^alyEIV#h5hcI%eBhl15Y5R4B<5DSwupdym8DS5nIk$TwK51lZWIk\C:J
#djA$* Kmm4K59IV6yqc&%qa&<iijyej$:&H9L\/H@^<JZF+Sj\INaNH\6SCpp&B@n%C>*^D!5Vj\LSlBpuFwnM
/95F*6 nJ9yN/=j8!bI$:y&@Wd/#X8b&dt*<Wt4iFDZ&Q4+Gd1tLndCj9Z5eX5VwTIjc^BA^aYWbBEI4?tpRT\X
E%inGW ^?IQw&CHl+YGIBiBAWkG:e9+ML/mj9:?kT>+$lAKYHkhVLqh$!bwq\K>11*1w+Ltmi8MFiH&lhhwu$VE
Huy+Lu =eA&mTl1V9&JXC#d6l?wPHLmDKHmVPL=XQC9leXq=SW%dj^&mdcYl5cY64dihnZ!=>:DEpbGPy^WJBN+
t5FGV= KEalI6nj!<Zi!t#*NwQq<@T$Z$C+4#h@%Xa#B@?+e=qqVY*XBYquau%6nFdNa4GRLGPW<LAZ=uja@B*>
iyiWGj uuuH9PY</Z+6SbDA^lJ?y^VlAVWCkYAwHZSNjZWK$1FCmu#*muJJ9J?EEuHpTD\B+n\ApSRj:tY:ilRa
IbCH:T J!ET1ka*m8kepd8J>G<m^NtIt8/pj>I@1P<>*!bn=PLl=S5aHyh\VwlCXMSjKBT#>d**Z#1:8@p>R$D^
9H?G1u kITc59^dX%NPp:Ad<!EpV+l/L8dtCnS$P$5VDu#<A+QDBPGcpXE^RqEAu\RSR<pjHND\^e$GXeDtLAX+
Rd41=Y q6L/*8/I$PCB<ChnQPum:AA^6QuiHRdL=^Nl?EqAEQDp^kEGW4JK18mWbGty1hI!5mkL4C:ITE<&6:i^
hj49!t 6ZM%PZQ?Ay6aK5S/H9mZQk4wDkWIpwqN?p/C8B+?F9S?+ejSI>&uC%<@$^%nYX%kt\1EFLC8HTt+qZ:n
mc5+K= Yq4c%T6ZLq?t4@C8yq&:uu+#M\5<E=KATh/uL<E\@TI^>d9Z#^?*E!iC9TS@k/D!J\n+WRAKktB8WCB+
bc?DSL Z*<tRC\\KDk+>AXQXujlyu*8$ih#H<BBLtmZcGt598VGapD^^BhNEPimPQD:wtpPX$Ii^EF?cChQVp6:
-AcKJy 000fb57aeba001202b3 Page 237 of binaries1.zip
?<uS#I %k4k\D<KPcBV=M?jQb%!>TdEW1Zq>!94i>5qRSRc+E>6w>1bNnWRH1IRihk=%qh\nbRQ<jh!6djc6*9d
#KmIQG ^lWL>dTjARm#qlkaY*qGu4yiXN>iX=^?:yC@@c+%5:Y%KlAEpVJGqi+VmD:*CaEa>X+EXIL@S946P\#d
>+SA+q 5Na6/GS?TaI*S&$AFy+^iu%?/Z6@Y\eG$/&NXcWFYbmMQI?^hQ#l\*$\ZCI\&P*qDiJ4$JyjNKRX^\dq
#Ik&@J k@@I8*tZ$^HANDN<AwME\kAjML>V<LQuB\M&deI9L&@@+MlDJ=L@9/AkLNh>@9t4m>5FNA#>^dKRpbb!
pnGFVd =kV=D>k?Rq@mdwt>bX#=L6K8d8+iZn=?AcAK+aMnI1PIKlD9uua#P:?+XIlDdt=9DyQNaX6FduF8$8q!
:tN/H+ dEcJ&KTRwIF5lh9XGZ84LM^M61#Su/PL1XcYBn=9*qA=cWqTllmk4CA6LRW\aNJhFmJybSWq/aF4dP*5
mdSL8h HS^6Qa<L5/!FJjj:aHnD\5B<p9^IHNIQ:EQ5BlkpkHkWBZ:Q>P:?jl*&+!Pl\&<cIHVAN5<Caut8yX&>
t:?\ZS uJ4K9<Tp#4l<Ji*cnjTM4B!AwRR%1P*Je@BKED!RWQ4=p@dt@=5FBbcF+@ERQIBCS>DlVBkX!kuyDYbC
h%bT9j SMQCI/Ji<PS%Ft\\e+5<t%&BnX9\!I1*%F^$Y$XAEQDE=ml^YA=w\wEIl!56WBBS@th/F*I\i<W&C&j@
Nq@kTX !MMJLAhJb!>i!\CSL46j?cCSD^^AVIN@ct?dYnP/4%L$Tj*y:+NSwZIB*t+PBILXm&dyQPWN%J&:aw8b
TKnikS e*B<c9/D65bTCKKDHE#Y#lW!IF4GDMSH8d>:w<>6Akj$i@+:=4$cIQAFT>ch<D:@/liEZ$IIi46@CRWB
Zpp:+l ^bkNw?51m9M!?1JwiJ<IBGiVpm?pIkVi>tbd^@TT%pM^hXZ6c<X\%Pdh=DT^EFCWJMRN1Alh>K?9ubQ^
WB\MT6 L@V&DRmNQuI1lTS8YACma95A!GeBiQH?M:^EWZ\w1B=NFwGC#LTLJA&LPR>pABTB>ld%<9V$wN#=dw#:
/5\1jt YA?&G#e5InKCJiB\jMIyNEdZ\bn&IbDHql9wdBGIQYtAkLuJyC9e8C+5Y5QJA*?&Pl5?8#mS?NuMcPQK
%E?cLB lZ1wCV>+aI!RklpDycT\YXhNZXXJXka\pJXVXJSuNRFWa9l?b*6HJ&iHMGFK>W:y@Y1Ykqh95MyAh>Cj
bk61!D bIY&mPR!RBH\!j@XBjFdD>$>6c<CSD+@5Eb59RdL%Y&pRc1T#j1VC9Vq%E5ZiqJ+F!=iT4&Thn*>F9^>
@Swhmj BeXEES:?>@4>q=@hJIL?G+Id9!GkpyVQup+W>4%m+$$p9H&>+XRaHT+YESphe@AFV$F:uwGye*lm^4%1
KlWFQY iF^dkAG^8k9>CIl1ca6!cNKc!=BkRaRnKm>R+CyNJRnMYdphEIk+qHAcEWlPPyh/I?6&WTuYDy9=/K@1
eu%!@Z 1?5ctq6cBY*1La&Ed&F@?MZ#tM?IDk8WA\c5>=q5&+mHpSbAwKY*!GCZ4i@B<>u*Y=49bX</H8J584+Q
qb8kqp A9FT<DcKk4<#tTC8akRD@u6yNKdp?PtpjnFhpmDC9Z\KGZnP#BaKAcq\Cb6n@*6MA8jCuHSl*H\M+mwY
G:qAp4 Ak\VWyPPS9k+tP?ePWSI\aDBSli#/S^PAjhTi/CRApakS1TA/9wBj?WW<qiCk\?QmV>>ISuP>j@JRXb?
&@F=eb Mhcp5iwG\W^ju?tRQlC8ZV1ZiPIaTV!^ZWta:1C>^bAFD:::iA@Tq^/A=dcw!Kkw?A#nnl\qGj/4N#LA
=Q\EF+ ybiTtlXG#Fl^a#JFMt:hwpELFMFq@\/cR+L<%WlAnw&twAaRNK>jPqiZaMAAB4&<8cMXIT\Ac/T8y1\w
<&w96H J+NmIEjERA:ERFqPcia?P\niQc^n4=D<ETp5NLMWkC*>SHXIjmK&CJXA=BjGRh#8Ly1$CjK:b@RQD*\S
VGJh>W T5Ed6tt5n\GIq+8FZSka@Kapu+hutVuHP=?eemH%elyyY4%>=&==bY%V?^P\SmSG/Qn\=kYAWQ@kjpuS
8Ml4kq H!B\#=<VJMtiQbN+/kS<9peP^eXT$V%SXCRV^WTL\h6*KQ+Fd!B&KVtFup\9JhW>$IL&>4wW6>WEA#=Q
%HT=@Z hN=RDyEAqAJMIHEq=TkFEjqBW:5Sk:t4AAM@MMGu#%Eye8jRD!GqXhY%4RJ\RcPd/1y4RAyc\BY%6pB5
#+DccJ kMEQBDEbKAbuV^+:FB$i=CQ4:tl6d4IhPJk:W?5^V%%uD5mLi$SmipqVc&ZiqbQl4taG<+RaTNR#*P@<
jjFJ/^ Z<\AXlC/TitMhQ?\PHA?WS?bD<^HypPCuEPhuaI8KjJkCwR\#BYG#L>:ZX<<j<KG#Qtb%@wm=5MIR<LJ
FeYd\E $?CKW1>eVnwY/ih5adSlw1c\?Ca/RDE+E&m+#d&hn#V$EtQE<EWAl/>\8E?G9$@kH^kTEZj<:EWYlYkY
:$p/SL leQHYBS\8IG65<G4HI9HbXj*y$=Awd&&9DD4i8y=nFQ\=MIJm&CT/QBFGlk9&yQ^aD\bd\qjdQpLm^BE
GRiN@C D+yBWVl?<nRdJkAKJeZFh>AZ=YSn8#tAeFPR4k\ayKHmkSM>enA1QDnAZ/*QFbHiYYQD%a6u>ipByh*D
++9eVq t#NEYqyTt4kmPQ*SFjZLka1Kp4#WBu5I&#$<9Q4!1MT8@<GBQMpb5YLR^ZIAISRDb\ZX#ZVNRBC?p>cY
ThM/## DtGA<IL6!&CdbetVRy=qWILp<%k#P$Pjb5:\TJQbSb!B\PC<mBT<H#>@<\tDBImY*:=+mk*u>$8L@yep
?9@Mnj !A6>EY4C\hnaH#FT5Rjn+k+hmV?YREBa5<5?PPF/eYp=QMD%VT$Qtt9:RPnqmil^@=ADAbjLpcaWGHuP
dS%y>F ^G:iWC&h8c6*YDn=l5ehl%A6=WLK?R6yGdq*T8=X\6MQWabMY&6DVSWIRqN#M>$!EPIjF9P<4J9ZLq>I
nd+Kj\ TwVIID#a%%*G!Zw@&!C4y@&Iy\=/5MHWKjna%V9%:hWF%^Kn*M$*LSB!INuATDVe!LlZ</CVbnk$#TnC
Gqy@wW ih^Q^E?T!&T?mkAVXAj%mitRFIby9/k8B4SanQDR!d^k=5F@S!Lt:<IEEytMct>64m/HmQp1?1NVJPeY
l!ALLW h@kw&A:Wl18Z#^&Q>ui^*G$+d#n\RAMQE51/!hm6LXJ\5!kIwtbYHSk?y@h4D>$LQ\ywcn^+tPlDCWtZ
:+HVW\ @8Al?u@\<BA@^t@jS=NuymL8$QZ5c@Y%>\1#$m?uEJ@GKpywCKd?cH>SSIL!y4\ad$qjj@BIwA^W>PCa
S#beTu YCIM<GI9EB\KT$4/QFJYL+GBTth81F!@BnleRX$+Ea<^e/C@:\DTB+ynQFaY?$!*a<\MPH#9\&HmAAkN
<ueEn8 bBXXBtBHB6EFicE8aKXNb6R?J^hZN&?ZADcJ?u@mRJ1T$cImDyIa%PG@<d8tC%YBVZY\#wkMY4T*pA:4
#b4q8K m9K:Shl1CVBeVDtQ@c8J@FNM+w#VdFd9Tl1\pIiJ&#1$S=l?/+J+?i*Ly\>bFNlE=SXEAdPyXJI$8mPm
4b<Z8m CwiyPPykV^^#TQL\EW\WunwNLGDb&T:\cB4JjFbW%!c9MA4#&4bT!ILw4It@SaHAIE1KCuLKp*y+R:TS
/<QTc8 l9%PQtGElk9\X+I*\8QlRW$hlAjTbKkKP>?dBM*1dAWSA+RdX!?hQ\*lRYT\u+i#6M%?p^$5Ci$<Ni&=
L*u&&w 1+&5jiM8*K=84!>PV+4^5nBe1MPCwN:EcNL%8Y<i%h>@pHW#<%d>+\@jBaRF#P9VuYIplWq>E<QE@thB
uk!j:k l@Vu@wTFAEARb+WBTbk9:MXkl@Di5^<ACpMql59C!nMKA+ckmWRa4q$=u^Ad=G=68uZNqD=yaNVFAt<B
t/V?iY C1L=6!>@CGacGRE6IC\\9XTQwLiZ#<BjPJFtkpQCa+/eQA<H@atnLA$S&GAuyPEPKV\@i@*^/>h9a?D%
IJZ=Ty @4l*PM4i*MLB!!jIP@:+/hNJ=MXAhAj@Hb5KS!C+j4+$ACH6R&kIkV?SmlpWm#y@LCH^LMupbEH5i4hj
9SbIYF HCBiHu#4bu4/nS9ZCR=Z4/T!?kBGKhnj#%5X^>yI@#qtW#i9YRJlM?GB%ldS$hd1+R$aKTMnJTYuSCSC
ZE^*@V Sl16p4!mQC$:GkNubRYFDR/8dt:iQw:uYCR1?=DA>6bQ@A=bayQapK&H/yEmy^hL^LVjQpqwp%+KS!ua
@PI>L& VuBMH\tBTD=HH8ciBB:dRRbBHARwGVu=&A\FRVMtH4wlb9:$:6X@D%8Rl&L&Q:*CXlewCJqqYGpkRQRi
H:J1i^ ak=#n9Dnya+iT!Dq%iRZ9GFc5%d56QE@py1L%iK!?/j%XNRHD%IdPtna$HGVJp?h<SHA/PGJ#BLu5F^R
V>QleX dLXNSpGBp8j?M/MZ5bm*b5h?S??\k<eRm+5ZWm/u=^TApWQZ^RiNcK/4RpV1G=9w=wHadFJ^D#R5=^bc
GQKw@c JRkbwpL<Qb%6yT#&:CBh+Dy6QDW6Qj*N?>&n#tbX6DcXbmVH?Xl8YT#pR4PJGT#IiQ&\ycY6:iY#65eX
<$KQ&< >*K8blXXQj$lVN/AH\W!cCCD?T4+I5Z&\MA:L\BH*k@FT&aMK\?@ju=u&#FanTaJXa!jL+JdPuu</JHD
/8Dyb^ hJ^/@QFVb=JTLq=P8*E%?XSemKi>&a:%m<eL1&@mKl1HEa1eP*uy\W\>R^Ewj9HBJqEM!Nj+pLCwk$eV
uKHjSG W^AHah^AeDmFPGSmX^5b$Q5A>I/C%@wqKhdG^N#SK!VAM<A9^NjX\#5p=kl&$<SESYLtn\+YD!I=eN1Q
!TFcJQ <yZ&I#Sk#btKHR!CV<KeyPTLq/@h#M1:R\JwmB1!M#MyCJ#FEIj4>DW/Vju1FRlCWS?PH5L&MD<jd%WQ
DpI4HZ Mw=lS@Sl^+aXGD<DD^Lam1?LQMlQ%aC+YRaL$KkS6LTauL!Cwl\6P$yBTXXFTW:B&M*h\<Qj&\M:$?C#
SqLpnG 4&F=iIuhiy<EHZKjlYtMLlaIMc!V@pVQJGD>puDCTBk&CCeeG:CwWA+QNStj^J#GGjIwH#%K^VNHiZ$Q
CM>kE1 McEmM=hp+>kk4I9E$K?iQYwSX4Q?kIJ@nkGSPJQIRlFQH^HEe+<iw+@VCXIuVkpyi<FV$6Jd95*KJ?=m
SZkaJM bp=i@y*m8#a16DKn^MCZqI11m94\$j>MtQ/FSWNuKweTV41TPEJYkbaZpbMjS>CaD&k+iIeK$dl+Ii%Y
q/:Mn> :y*T?\>1/l6cBP&!dc&NNSYpK:ilpY+cKG#/8HMdjMGFyFMRSaRFiLuaYWmSAau=inyc4d\BP9QZ:*EK
V^R&=L QbFi&k!^>IWn@6dd>H>L^yCTi+@Am:Y$NDY*6#&Dk/Y>1TI4@WbY<j89\Aaaw=@MD?b::#jPX:BS*<XJ
X**leJ $%+*9+jyFi5ua$G@ZQTHEVmu$6JRXX1RnZ/F^NSHYPMEeuEl>i4%>LTW^MQlQw+Y^y9Y#B4E%?AkGRPX
<9lJ8? hq*K#^HL8X%\wVGE1RWcEA$K$PkBNQnM?LCI/EQH#%#<A+*I/INH&Dtj#D#5!!Aq6+/P#@@CeZ4V%*:Q
5\G8jh Qpe9Q&<**=BDmiiTp!?hn*T#5:aQm+#yT+9V\TJAS+@@&IDAaNKnF\6t?CDIBLktCCK\a++F+\=4tnJy
wGT+Cw Eph#d%!u$ym4KpAFPQL#@VLl/?&y\paSNmkV8:hAINe9E/I/8nycEC1Ppka8=FEuXBXpAR5bib!HpB$q
$M!IJi y+A/IV*Z^59h$#jAMb+WG9+uF6J>9ku#BWnFL$IFDY=&^8>Ba4SNjS>D*@kDt$<T655R9+PGB<=*Ju:/
h1<LCW 5aRVmcjJB*QnX9d6wqLlGQ$*EqC@j@*5WY6DH^ZyjZ%KTIWp1k%TRS%qnnHHtRVFE!hQun1XKG^iBnQ&
?%YIFy uKik6*V4Ai@abDb9FVTMX8=XEqFYW1IXJSXWBk+cMtLc>J?ASVhQSJhXnB:Tu+GbXkp=Yy/S+\/b!liC
-AE/qY 0007761ed63001202b3 Page 238 of binaries1.zip
yBqYQw aY:9FaKN4TpZLq&<hC*#NnyLCCWk\B:V%6JRjb?AAYR$NbH9GX>^S61q<^BX^IRHi49cH>k4cYT+hlq!
=bEMWG $eIdwDX4Jila@NYmSkm8W+<F&8:R%>WtZI^wb5V8%D=yc8I*M!&DIGb9j@V+<cP&%411w49b%/<Z6:=?
8e/nh> *$FK\9S*M9/AHW$jMeL8pinqC:q+>chm@I+uHn>5dc/=Z*\de#^uId/GAI\?yHHp?EpIKDCbtHH6+6tn
auPRQ# Wj+8XmbdDHa5Fk/6mk&R<T9MFe@J9uM:4V8W1TFpIBZaDnIia8pnCWtyj%ESh?R+WwEX+^JTmH:%@qNH
uE+Y6# ^?TP#%eDHjd55@j$>*Z#DIw<uJB+:p4G#iV+MFeHG#5Lp:&&Hn:iRYGl\6KyIEAGc$WlwTElphE^>EEt
5mkEE^ V9N\QIRVy>utPRCDCAb!pZGVu#/ElNXZ5aAFYIC1p&=#$I5kdJFXei8d!$T>YCuWC$tmF#N%6L6=<nNG
#J@yya !MqIa<=XVXWbBYM<BBYKdB%PXWXbZtKnn=iZh=C@?/*dEE?TlwqHV<kRTl<a:PFE\MB5/\>YL/k8Hl6j
k<H$ZC 5=Mnd%?@@y>k>PWnp=NI&R^Q1wMH/Xn69wn+FGGD#Tj<484@?6d^+jZ#^$I$<94S+CV*uyhlJ?5TV==I
CdVTpG PC=IWD%^Eyp+R$d=p$tRe8Qte=:<VQ*NFl:STSC?b&S:D1RADL/mIw=FKaNm1GpMHDNy!6VyA6=QHnPD
elE1<p P*$cQTMiKhHTJq%>@iXynnT4H9<TTBc5&R/jduBMQH#/F!>hT4&SnVX:VD!%wZyk\@j>Ty^Sd/Ac%WqF
%545kT wmkj#8npM\u^5SHBQt:&qtbGEy9beaktu8yMHJ5>iCG@F5L81\uB>pdLb4KEVG%l^QLdHmMlXE6Q1!LP
d&+G&T naQBi9m+K9Q1qc!!N#VIB9Xh+$N>Vh:y$^A%H:q+Kjqc$diQtH:1++PlS9jyBqu%IT\DkY/WFide9Iy^
@S@PQ< Lu+c%GEN$4%MCp/bN%KVEtKC*G*N6t@b5=EEGy<$SGX&*TkR#<uN8*M>Q=TyBny?WQDFnI?Knw5@ii+!
EW>Rtc IaQW+mJI5=&RDQ\\G>AVj@n+cWLHySA:p:%&Z9+?dy+B+RiQuVy#+j1NyCMlHt=i*q:PZkG?Fm8t/&@d
4=FnlJ /$XEk\/c+P6wd:=:%?cNt\^&G8$$6apKQ*TajXKEcBT!pyENbNDy>A%JkkbYhqNXEA&eYMHBdSANuJ%V
5u=M\l J6N=%qbENNa8uVeV&bAmdPnN$6Z8+5tNqaYaRk+#5T1KSDZpmG1MJGW=Jaq=#n:iQu:BH1Fam1m1djmd
BYJteM nV+4lY#RyB#Z?iMHpR&tm@p%qY$TID&b\pP19Z<mCL+N+Z\AbkPQa8a$lw4tSNHS9JmDeeL9Pjpm/CRI
m+b9u= S%qX*!^m%@jQH>+<j>\tlAQe&DW!TTiTjQ/<IHq$Z?Q*1bMuWDERDq\XA*Bk^9$1+JGb@b\uN*P^+V:*
mNucNZ !NNwGP\XKYXcmRNjjEW^BWXFJYYK@B8aK:Ylw<hM=WE\4nS>+5S@%XSWqBXXl\$dPtLM>GpJ9C/\Y&Je
#>n=Rm Ytm*YGIp=CkkSu&mAQ6YkSk#P+@kcEJMc84q>N^C5F6%De$Rma#B\cH!i&SaEGTqEWQ$<48F8bqyF=JP
&\uLNX ^5hBjI+Vh5bd^Ne9^:d\Sy/1>4#%y1/STVqXEJ=jV\^#&4XCn\XG6=WS#*u!5JEqS6DK6PCQEt$k:1@V
YMP^jm :\MQQ#W@NX&@pFbaine@:*biht=lRi:X</hQkT/$jKjB@uR^4=q@TjtCXbT@Nu8Aw8RDG8jQEEYlnk!K
yb$9jN ^^E^QLM!54LV4$AWE8aNZ59I\pJ*EEW1&8IDNiVH^>&Z!M:NKT!+>DGM1RJ5ikCdL<^+#EWqJq>J:Y>5
Vk6/eq Rt#mMaZBauP9Gp6+aEk?:Dkja&?!%>+d=MVDQ#R&Q8F$<4X4b\<H8:6/iu8=ikh+&&/iw1w<aJkyeX5B
Ehw4nH #nat8@j5&4bl\?a6Y*j5*4*LcP8P:V8Mh9phQuZtLD^DlJ6?dNKy/<\%Jp$E1KFV%T/BFW=JPa?yB#Km
A>$IBA Ay4m+i/mLF!qkJ1!eiYm&V1a5yXlNYW&Y1>8u6+WhStRFZqqhdWBIC5RtPQeEJEXSbAX/eEtwh+?95El
<e>\LG dtqF<Lt#=PDiI$KPFGp&a<8WLDk@?<ES?1&9@eqC*BPB*JDbCPRtm:SmJy$?IY#FmI#kl&8Spy9RZ/cp
ZdK&NQ Z5Y5HQ16S?\A%w<9H><<j>IGJl?Vw9*aeFLwbEGKlHBmt=<wV6bcuKhV=C:AM!55n8jtQ<itnw%tL8Eu
G49ABk Aeq>m1kwApXGkXHp>8Em4c\!aICc?wA^QB:Np=\?TWNNCWSYAL>FSpFiVpFhDS#b^PtuES86j@1FBqen
^GN6pC mHJEbWBySPWWS5/kiWP$pJ^6bud8RZ*pZL&XS\yAne&6TE+VjA9*?k^ba$M6HkRwNieTn<XFl@y:PFu9
+CAQEX &:ZXRI#MW#V\XMGMGh8HuL^%D?L*>DMS#mc4lPDMdGep/K\*4aReRR5F=QTCK=9YDB/9@qFq&16jub>1
JCpt=! W>QLTp99*mt/W%lRmD%B&Xub&jp=N<CLuDq=<tyPTh9uL>%<=m*D$A\%pm<WHYG5<yVpFpF$:8ViT46I
ZPeiuT LAA@j9DSE@%hwPAlL=!Jn@S*6h/#%>b>*!nTYj=Nk^uIcIl1Kt?@KXGep*8:<Q4hMKaCA*lR6$@M?Nm+
LFT9la ?IR#F>L?aCkcj/1QwiJ:D?ydH#>@<?=h+6#nD46NdV*>@V$<jEKmDl$:ii=K&yqD\i+8un:id1BHhy8u
RPXkTB KIEyY8pjGSHpdG=8adS%</chi*H4ka&N6dW6:Vna%5J<4?tP:ecY#4=^=!:i!C$wLBAmhQ&cIE$Mk@hW
=PL!XT ?mLuAy&mnC5#E5Eta6ZD*\hLHpwa^IM4M!jKk/%S*\qBANA<MMyEi?SqyKVqqNZW%dFBTu1eLEa5enIA
n8y\jW pyI1YLY=HpG?@wGlZ4HFbj<DIKyDmw%ZkCABARmdP@<E1H?/la*l!Vah+Y^SAbuCTYZV*Z*=QZ/IXtl+
QyKwZH PPtJbQQcq$F+5MG51j*bt+:9YA4@>QdFp@bGhnmXAHV=$5YW4lRtidlRhj1p=5IqPP/9ZE&:uu+V+Lqh
qm5H6D YQ!eJ+NVye+l^$/h*1apWPaL/SFSWkcTGGWybEh6GGmN&QRJGmwR\uDk1$ilX^/CGjXlw@/hPHZcnI8<
#q^>5p Vl=Z?k@FEZDFSLkTe5Tq1W:=na/6i&B$@Eu\C/tyGM1Ww/N6Abe&6k$Zl=DKT&$h5kM&:X+JEb*VCae^
e+SEI+ \Hi&IdN=ww6t/&4Z<XS$>dhb?^?>X6LeWy/bFP%t8taYT</Chpd$hZbHI\*k+D+hBEiqybtA$%=/8/94
jqE5nR 9<6=qXZ*!/p!8hKTp45+iwDb$D#TVEhu!GeZ=&ieVVq@<h1%b=>:?P@J5#%K&Ej%>hQ:@m1XWH?\NIH4
m4wB=> 6a=S<WPQHp6kq!=lmja&MY&^\b:&?!^h@Q$*DEaF?1plQXBhR&Qw5GGca:\+>?leJw>:5Vte8ehR>H6t
=Y516d jN#lw!iVL9&BV!R:L=S$keWHE#iQu4>?Y^i%MZD*Ht5QQ#<QZQaWi?V+tW6Z#l+M<kB/jD!<A@\ehtm4
1upJyc K1wP*BwV:ZjA\ZdQ%5$:>6tRGY>:b*hQh^hHHL!$5:i*56ludtql6uP@ld&H>+X4hKa+$yPYSq>q4wmS
mbAD9: KJ>KGTDeARCQa%^$SGmkH>qIw5Vm5^<XcNZmPYVRZya5yJk>d>HC&RmR&6RlJLJSkaMZJEmGqE5W=Ymb
qiV&hZ +jJK/kQXqAebl94=B\TH8CiXXj^jALHi4R?kH$KA6HAm5X?A?4M8lB>ly#p&Q1ieI!?a6BKEBAeJA4Y^
$^6@PD @T<<kpWw<Y#!yc9aV%u&wL:6KXu:%jt%+^$R%FTLm/w\bZCh:KtmWykL#EWGDlESWwkjTBBC>dtcqud>
9:*AZ$ BwV*Yhm$Y%KPFM%jd?IRhPSa?H\X%CCKWIVJMD=<TSPKS9J+W#R+<BM>m4<ADWbBVqFBZqqVa?n\EbPt
S1^1/& #ymSllSNIPp^6n$hT+%eKRXKjwVC5Pp<HnK$i66iG:iA1CPEwe5*55miFcI?a*GP:^=BCEPh^ka&1bih
#9yqTS uu48SH^5iKC*C\T:&#i5Ym\!i/b&LW>Fi@=Ge/?+%KLG6w1eqIMib88EBC%>!Il?VZ<LBDHNuCaK=Aey
iC4amA /t1Yd&1w4&>88qJii:Z+RW$qZVGt58I?LnT/X%+GJN$6LtJHlpp8NTQnhqp^lQ9J^$<tm8dqXu&kGA:X
9>=<=< TTc*S^M*B%4W<iE*VjDcWa5!41Yi^\46Mj4w5GQHE$/^Bkq\Km#A+Cn^eLm95/Y>h>kl@!EaBj*TpAYi
^J9!&R Bk$jPY4p!BEc8:pq6?qe$j!<>N+I=kw#@lC+6*Py%+R+\dMRJS!^/MPy14:=$dQZ4hEB5$^NLD$CAn#h
i<a>\J 9ALDa\+hT$^JBb4euD^<jV\>A@!eh?pNXFTYH&j9bYG@**ndVuN:b&eui%6uL#<RE#jchcTHy+8>Di=Y
a^Zd*? NN8:%>S$u!Y<#aa:6&\%<9IIP+9^V!y+8TGZTDNHj\!ALeBSadmcEXe*KRq^MtPu<uY\WXii=Yu?I9$q
jqjB>L e&jm<K9eBFtIl?TW%AcTuq*y5cR>T$bGXqFXa^AR6Tk$MCA\KC\$1QkQwN+RwLD??\MuLjuIW%ejV+Jj
GiVqYd VPi$u<J^tnjCyblp4K?1H!beSaQnQ6mpGacn19+CQ<cjF!Cei#>!FDjNpjui$51/qme9!WKnd^*9Zn=6
R5i+GK d!K>+G#Q?yZWT^eyaIt?^BBS=mVV=#W\<wGuGK\eh5BupA:+P#kaAnllPh+8IC=<CWkP+NTnmIERw5SS
X4hE4k yRcID^\:j1AT@A5N9<AwWI4jFNly<AEDBt1MHn%&cn1kJDJDuE5L>%6^SWV=Iq!8SK@<5AqCpLd86Zd#
cXIQ8M n!RkZd=Cbn&^/N?GIDZD\>kQWpN>:aQ:yZhAmqIT+\?TjMEB$^&dXm?b\=&yZeNV$b1>bw>4hDKtC@I8
HYLJ<% H9I&N=nDe4V%ETQ#+WbHe!PaPNAjCmIjFmR=RLP?wTp#Nj%XT&$N@\FVSXZKXh!@B!mBwWNSww8aP@Kp
:HYMWF SyiXCj@L9ZZn18!Nc=hPu4>\M/9+@a>8Acp1nma>pb$@9?G$MR9TI?\m14q@F/m@ikFm%+Vn>LGS^*Ek
:j$:iD /n!YP#K^iuWuD:lMPlah/G:9HlmVeG#XME%ck>L5%SAd1Ka^bCV>L?ejinS*&E#y1K1e*N!<pw89/EnE
9::uj: CR:P$!qZj8MWBVkhF8KWkY$@YMD@4!+m$t#yLk5*@$D$eTFSejEupkqND8=?jq=k?F#&#NhWWFEh6hW^
YZuHFE !k1VCK+iLp/P#y+B\TA6ulDP+\TNnbYq^aEDF4V=pL&:61*Zu/5>hj#I\aQ@GVqp^y1N?/\<nmYi8+CD
WYMS&X CHRTe%cXBNRJS\<jnA+QCjV%e5iEt!LTBPb8D^=*&N#%p/jRS>QTFe5YEwiuP%%DVqbGXpFXVY&Apn\K
wpN+/H FNb1eK<X9A&DNXVHtMRAV1E^Znj8p@H8l$@Ii4EQu&nRy:+Rmh@D>EmTVV\AFNXJ@b4i4$=9&SK?pKiK
ZDR4Zn 5yIm$8F:uR!5pHlP8D!%%%9LS>naS1am#=!@SKam:>e$Q*yBhl^>/*n@/tq:M?Ip:G4B$lS%pZNJpMye
>mn$W\ akXKA&Zy<qYMmt/SGT6A1dkWm@jQiXJaRdj^<>NXwyS:mDJ^CE/>Tq^qXeEA<TGDXJSXqDFWR5WTKHIW
#yXA>t cQk>*ay<Bd+myTT4w1!pPtnImJH@Vyp&I^jAEy<^Rw#LDqHSZI+IJTwRESGXX1Vpl<tPtpHkY4ZF%N4X
h&ib&G Q?L\CVkc41Vl8w$KMH169bmN1/55K<FXEnX%XQ*A/pyYwyIT+1JC@N\h4QacGc:Su/9H$Z:AW=/=*Mkl
-A<5nj 00025846387001202b3 Page 239 of binaries1.zip
djC$D8 :E^PXZ6hRY1<4<YG8RAYX$6dhP6nS9#46a>AFl?\+4jRwFP>#h!tB4yi9LE$y:!?u1:q%6XTNZR%DZR^
$V=w6t qSCn*Pji\<%:yayw?VB@C#JF=nRX5*N!dyiW=8hhT#q#yjHq&\/c:1Wa\dJi6m5GSWw+:>#Y&p^EK9Q/
:\Qe@? =bT#J^MTnl@H#R!J4B<H6PD6^8@qT9KyR&Hi44+S<Ye8PQ^D&PJ4KKkNHDF/@Ll^a<iMHV6t#D@nSQdi
@p5<KT #RP6K5#J/CF\^S@H#XaEL8Jdw1Jn&MISkR8HXG8d&?5nDy49Yt#8:Bjw+?dyF^\ii@n+&hS#5eH8>m+k
P%u<bu SX:?kS::qk^SXFae6CQWe6jPja=i*t=PVt=?IYEAl1>@eEmA6+8DLRSR66d$Aiq>i:c9unhn6Jw!QApV
Tim%<Z qXW$Btq1Dl+<bQAI9cW:k/IP^1NKuW=pC^%HTP+ByAy:a&\XMjXkd4dZiQQcQ1qm6PX%hGjQZ:^5=b1X
&iiCB= T>kMlK:&Q$y!tIEA?/hC/JKSH/AP@/!mNuDI5CEcR=iGBRWFl$TGSybmy!#RSddG@n@yk9mye<dQ9lXp
^TXSbH 4#D*\Pd516n?iTSD&Qh@KCbTPF:n/iFB8Y6:+NHmn!9!a6mAFNeaFbXZN#=<@4dnS*jZ><@9Z@@*5Lu8
kqp*%* Ah55\&=eVKW9$cuWbaw\yutJ8D+RK1A4t^%!S+&A=@w=V%J:>5whXp+/Ku%<IWewX!LKKmBZw5yK!m1$
^lMWB9 MpiJ4>RJ+XMu9PY$M1ZCX&bWbFRBQZYN+iMuVbqc\Q9JE=5kKWRLNK5Z!PJICPTH!TqPIq!6*LLH&5Y9
KBWulc n/8MQB#XlDi9F#T41ccmyKRM8aIATmlbGYpyy+/\iRe#?LmY#6QV48Ky/C#ccl%+Ani6FKWh>:e$uKi6
wba6V5 XeZncHN%=w18iM!I*K68y\qakn/\Gkqa%TXXdR&Cip/6wI+DdEqZ%%R@1K114K!wwP:LkRe5LTp8Ak<I
jD<:\A ZAp!/W\FkC5:=$=beW:ctcVpm5eCZQ@LH<+/Q>\c$#j@$N4eYA&CqZM#:SI<@FVC/BQ5SH61GtH1d6t>
L:1T^W WqT5m&iQSRh+l<ThT4pc#8=AwVTp%NSH@VNq<1SJE@pV8PQGmK^IK/J!Si=h@pcRktn5*KX4kNVbQ1Sm
4jkD*$ mX5=^!KFK^Cc&m@/Yi<!&?4wG?nu+iEVGBahh#V^R6LBIHhHF^>@Q??ARC@LXTPXXJVpJy4c:DJ*<9d#
qPT?/E euF&>\<ND\5PDA!NCA@$e4P*5:MHKK!5LQj9*4Bk<tAXSX#Rw/+?WENVR%PVHnS/<JBl\+eQueKd4i<R
y/8^i4 kn!h\My<QFtJGiD4/WbT+I1EKDN$=$6\kFi4p/ipyc&nP\8RY4ZPaA%S4B:iVC*6TclWew11/4n5RWbK
A?H:$Z StuApKGDkcwBGpNGnBm1PeMnDKAKP^^R?AhW:^A1TYGy1L5ZtJL1a?yud!j9>>yZVA9%4eWCwMntSPHa
+nIit@ ^6FD5bG+@R$:S6%eZYpZ^yX^u<FPdGJd/>EVb</uywEJLK81d@<QF&b$@@n<+jW#Fmp5w8LYZtCKTlY:
Cky\KR jPZK%c9$FSye5Tb+Q#cP!5+F\i4dyqLZ$NL?uCi8NY9FNw5NA8X8yX+lV1#:E%FXBmEDwXL/1WkMwBK6
!JJ<\A \1l?k!ALaB1kNqB##KR:mNJpGiE$X:ewI<KIe5XqKjtle4JnEKZ=K#j95ZL&C#?EKF&>qyqjnQN6LV*6
VHND>T M1*+QPLLiFBN%Y1kRPXu*dl$>6nBeE^CtP@i8u:=jD$hHwCpQY?nlY@<>hLt=yL4J+K5N!@R%14GYyWi
8!#eA: h?F/$i%QGQGtt:mP1=j%j5$aWItnFWTiJBy4:qa&N#VRnb^/jkPuu1/V41?61/*B=iRQKNA5&a4:+AdL
k?6&RT T8@p*<:I+Gj&bDIb$:N!C&@j#4y<Q9%cBX<kuEElT^%^wSdBmT!<4m^nN*>DEE!j?Ij6mSK&BljlEXE8
qmlV>k qKt+5MDwlKVW>NR=k:CQW%bDVj*j5hPuVb$&hiwWcnI>mVNBbIdNA#yZLPji>VJBFECqpHD!VHL1DaTK
$LtMG^ dNGtw\i!I%pIFX6F4&qM>:Hd9eh?m*hkkL8:h$BwbQVlp!uunkS:PD4:\kQpH?^48*Gemw1!<9k6B@a/
E*daJJ iAj/8:8+?+hFAR>BEVFSwd=8D9aPnp+P6na&%ldGK:XGDpBQykLSM$A%WEMDtKIHM$PGD^$&a9mIEiN+
1cwSZj 1>c:Hn<PSB*Bcj8RRD>9#G@aYq5yE1V&aPq:+T^h+jakbRLXp8Y4%&<$NFlFyK1ZN%NdX$>DAc&kCqlB
bTkie= bXpbSTX%#THDl&t1DWBDQH4E$NF4D\YHlIahDn^b>Z>llaEXm^Widu%aCTiPTFVFL6c1Jk$J?cVN=nIP
K$Eqk^ c?Laelk&&4H:S=%wS^$ub%!X+WY+mmbThiF1iubBTWX>K<qWhQ@<Aqk>E5/j=&Xuy6>IA#ewDpHt=T6Z
RW1kqH i>Qw1+NJdmKh=Cd!!Icm$4L:8NKcdP:mTY9yLh&!jm\wWn>Z9WKbEqFSAq$CdTI&pK@+A*qVwXRbqR=R
XNYL+8 KpbbVEX6<JB^h\E6:uSqY1THK!amKmwt>pPWK/qA!R?SWb?GaK$\NLF$>k$@qIBk*ek1IL9/\Q1NI@tJ
P1%:t6 ayc5cunRH>\9Ke!>hjZ<!ePSRh/8hld5/m$hLX+qV*u&&4$iedn\8!\>Mhl&&$J64X1iGB!Je=b#N=8J
FuN5Si L98QpcS15%<*N:B$$WAZ9+pDlHEc/V1^y14e<ubBE/hB$ER*Cl1aiyG/Y8IGyc51:>?@X%q^N#?LA1b?
X@hFew bDJbt:J#M*P9uL@/+d5Ryt>+1eN9tPAqk#lqkPWDtp/i\kZBPDdM\kV/@\A?l!KlQpZGu:q+LjN&^LSB
y>TNXj qIc$ykbEwlP$6Yd\/Bpm$/hN+$@qVBdXMm>F&=hjj8WL+nRia?e4/hhT?=dT+%BLQPJ$piB$y:VmRc1j
AZmadM *>:hqq:dAkI>Zd*A>EWhQHd8@NFRV\eH:+AAH:<RQ<j6$\ew1!m1LuY&<k\K>uX#>RtJAw/CI\:GSRb+
DneQ&J Pnp+PPMW5L&h=i+X$+ewIW811kN?+#SwEAW+MWPbae^\#SEnS<N4*lpce#n8aHRE<Z!8V1VayGBl9k>w
yDkD6X &kdW#MPyMZbLuVLBceWcA<P6&\#ZLwhQV=9QY/K6M&8S641<LHF@15wDB1nDtV^p?MklGtwI%L?nl@?#
llVY\5 ImwpJC\<<pl\$b>A5b6P<d/A9+H/<bMQ^8?HeHjkK#du%>^Ze<4Q#iyd#<yPN4BdLb$hHYle^tT9=iAp
\T:MlY ZE5YGlF#CJR1JjX/=8*m?:ZN8H:=X$@u%+>9uk6:+Mn+GibARcBEkKPic%TcJk5Vd1&+W*!Z\FSh%>ne
XbVWY+ @9m@F<@lwhSd5uAIJYRJp*%eSAqpC8XKGE<lTInSK&WJFYXX6SFVyyj#j9DE^5tTwZ88mKlAnBGq^ZyE
*9*BDW PbJ<?eE!+@5^<ktLT!BVHY^/Ay&iLMqPFJM>qR@wcp*5?MuQ8u:^>NGaEF<*?\N:ht^e6Ym&4laQMb1=
m:%uE# ayhLhEy?Zh9>nDNl>n5Y/&nXp&=F9aX4ndmYH1L#@&Pp*q>>&hKATR1/pY1mt<XI54!dpCViWJGb*>kC
%8TcVK kME9<J8aSkcWT%DHkQt411!w4C1>uZ%LACB>ByD?#d?XjL1h4DwmCatZRwSc!CB$$Y%&I@lyPuEM8L9p
yRGeT\ C=e8E+RkRkY=^<51\AFm=HRwMiZ14h\:q^hA+CR=WH*R&Pt/8nwCdWbLmnhnBt@/nBuVy+qPZ*$4H!nK
y:/XKp 1d*!pFB$/5!=m&p*4!NFCWKKD8E<#DpepkTKT8:j>k9ib&#lF4AqCCIu*<DR!Jknb=KQl*w=&Z5GBQ4=
F<*pkA Bj5::hIimJ%wW@c=?aWGi:q=BWdGk8MJn+8QDjX^hZS\eZX#6HN$5Dbh\^8mAkbQYiX9m8lBDKGIBw1a
PR1:nt ERNHnl4%##@n>d$P+p/pAM^KPJCK4RJCbL\hWbtnT#1w5WqPFTlcwL>m#adN&+!M<XaBdIYkiQ4kJBa5
6QA=#& Y#IERXJWXl<^b9Vkki41tpNHnBw^TB%AG9H9&NGnhQ#CR<QCI$+GZP<H/dWRJGERlTBJp=PNPD/1W/69
888CAD Gyb5S^AtKDB:j1ekF&6HX@yHy:FQk?%+6dWSYG9d&AyZ\9wHl$WhQIL?Glibq%e*5ZtK#1?j*n^@*I1j
#p!w>J >%&YTy#6F$<Dn1=h::!lCST^KV=+i58\d/$PlPEl4kl@^lPbPZ5+W5V@uihVaVH1BalAp\lEE8ShX%F=
CH1DQ6 4M\hNPpiMMTh4ETJWF!PcI<aB!nmw<pV!A?TG5ZV%y$HCB%\<maIZTbJmM1cl8ai$tyhYXb$6/\eRye1
ED4CaE >W15M>&<jC+lL6#j*bEpIHCbEa*</C#baS?iqF9hZyYhFPFwyK?n*RDB44n8*GYGy9be9%nSGj<^awZq
cn!S<* :R$N9RAQSRTwy\pDJqClpwKtXqRtCt8*TFiDdH$DZn@#+EFXVh*hdkDua?dP4N6FKXeK!QyI58:8!cPH
hHnd9+ iCNFQb^68KW!HWeZTjpPbij1hRJNGbH#y411<8L<#P8Zpw/hPI@N=CXFt#W%NhRHnhPiM&i&*p!>tVNy
+:?pm$ ZWcH%1c$PD#bGZ4i^dl:5cn+Yue$WyN+Nnu%&m$lNajnawSVbGjPZ:^/@XaY>tEi>4A&*895F:VJ*>Zh
e9NCAu &#<wLC48=QpV+h/Ph8:?kRF?\aH8i?eQ\5ukcbb?ISGBH8=?whEHD$bF^B!Nn\4\hHF$hZN#eZS$66?@
!&H\in TYi+K5+DKQ%FDc*SB\%KD$&kGV*/u#HVN=tFB^Mj=&SQ%4E4:DM#Nh/?&YCXQ1=$%6dmp$HNAV1/5^jw
Nl=KLp 4%!*ei9PZZ9&GG$^YIGhEDSTw#6Zj+*BGAZkStu+FP%y++eQGnlRe>mwj@<b4nqRa@CIj!iPGV%8i%Ra
mtJNG$ aHQ\WHmqEB65N9$Dt=+itS=&\#d1D@<un%Yjh&C$lXpH#Pt^Bh8@pAu\\ZZHDua&%qcYkkQcq6a&h9bP
e>K*:6 AI%9RHB+NL6?F4h5Qtl<?Q#h==<>9:=>iw9>hDYXbKIlG>Vu^4X4hBwZmEpjSHLmijt+Q/#<j6>iaq\:
iump5J <Q+VIKM:ZwXY:kJp5Fddw<SXJ5VR!yTT1LKTpmIF+CA$DNGnS&DlSFTH@%5B%IlMX?ZTI1IkQKJj^RTm
cy!C*1 yMR$TFb?ItFt>\FH:%Bk=5LqNG^81Ky6lKlI81&y61LpDqnJi+IK6j6\uthiT$tMn\:!emcyBj&=M:Wy
e&p6XH JEb:\Yd4+FMbFi*X8euS#48Y/tw*kiWES:B+:R+Lq&B8jLLw+8iM?M?CIwCt8^GFBhuw:aet5:KhclF6
kiEkpi dtqy^eRi9+q1qGtw4+Y\1Kc&NCeLwZtZ8T:@:yW$ewMK4kAVAqNVlT>L8Au5:Ft!Aa\MS8WYpydb^8cY
y%>Yn= =5dcC8^+8J1TtETGp8:h>^1uMZDaDHwBb^+>q=p6Mt9&dH1YyN=M*bt/P4wAn+llP6cW<1yTZ^Jw#5BS
+=B1l5 emMDweGX&*G^yB%MPI?QnV^=eb:&8$$hjIMCGLhFu9mb^^\:i#Lc%>uG^R?aCR4!5Fk/WpXbSX:FICI<
WG^i\9 I6DhM#Am:6DB1KlD^\=H?Hp+P4y:i4k+P46a:%+&aRDkAtbe:9<BDVPCGetMwpe4@#Nt*MSN+Na<!hJW
?tPNd@ aGcjkyuy48&dN/=h9wnhCEaScHblm>AC@XZ4Ddebti\%M#QbcalJQG%\C>w/5^i9*LBFd+CC4MKR!Vy/
%5$RV1 9Mtnl&l1ADbn^w+c11p^iQm@p!cMHVQQQ!I<MnI1ITmZaQP$H^9lhS5>QYIEG?!db*=kR!SQ8AiWdLd6
Ja?CTh V!/\6TY!$bQhYSMT/C8<I<dT\tI@bc/#*+JeTkdwiQ5FlWah^Da44HiYXNc*Q!M=8&>a5mZ4\uD&RdlR
-AYnNw 000dbfb4da3001202b3 Page 240 of binaries1.zip
lChL+V md+8imM>@Tb>1#hnWJ>uK!%n&YppTj!Zd#=$jH9PE=p&/t>/$Lb^XbRFbH!B1\ntnXaWpPmISam416IG
WDd5TF DHFXS%aCR1I#lp4klpp^S9\ZImR8J=DZqB4NEtVl/B&CBF$lQR+Q/yyclZtFal\iK4>H*%i:X\=lSZy1
:<aVZn $9GDad+86ylXYDbQV%8ACGuN*YDlj@^GYY6h@wXaN=MXi6w6YF#Z$X5AktdnFbHAVe$S%ZuPmD!@>bwt
@ac*!J DJFCdV>DnTY*:4dR4R^yG&I:ICn\dqINEAZXNDViVj<FEL*NNM#K9bH$?SP:m:6hmBAecRY=YVi9Z$qN
l*L>Sl Pa>#6tDV46@M^K=<M1#T*NIKdkHhYub//upIh9K\KTFu*V?<Ba5YLX!$ePGC?jR<pdu#=6J#BLMaQhtb
6u/Y\= 89wy?cA/&bYbBaTjyPTLX>M#4/j&ZYVZN/6=u1*#F1S/?y1a&HkHB*p8h9XE^^=%=E^mnJ?#nbN*RJBj
L5decC WLCZ%hw^kI?m+8Kk/MlAh??R!EPHD$bHH$8IC@N%hZL^>HS*hub#56m5QR^?q\1elQ>9jPmS>GntH?bj
b*W61S lVHnF+HXIe8+5R#4c4y4^=cN/%jyL=lN>weBH%yaRNLS%b8:ePp1A<Q68$#N#Qbl!k:5G1aS+ISd8GL>
!baE1G F8QNa\bwDl$%YZ9&#Bunlk@THDS5>Nn^a+aQGnRE?Jp<aT#QHdh1Sy/IQIH<QQ/VH=JGIQ!AlccAH<GQ
+*lJTp Gi#GB5\lCL5e&EEjWpem&*DJXmH5!mBdMjHcLN1M*58aciGqbEmQl:e@uEGHTCWeH5cK86cu4#>>:+Pu
eDwHk@ 1i+BDmLuk?:kHCCXLuL#Xpb9Jy$%CP6HleX*TVhdDi+%\q5nZyG:9TDwtVlASXu=q^JF#F1j<1n\CV1M
&Mn9tC IpeJY+SAjwTbBRH<Y1M!X&XRFi<:V*!TpwmatDljnBL@J5cSSY4Wy?9PY:=yq+YDX<lByPb/b9:hi\@1
5Li8?& pbyS4R*X=WWFtBe5K<jLZ?:pbcRqu#\eGiB8#!aM>HV+9A1i56+cM?@DX?<&N^ct^4td4y1q4jYRSKk!
cED5ZD M?e8NVDc:?Rji#1Nt%<qP9MFI>GV*6ycV%J9DZ^5FG4p5?SINJjj89jj+*c/yd8Xc8q8buG1dT4P#P\E
l6c*M6 bF=u454KPNMGJk%?V^<9=YVPuG!KVSGPyYNV+l&!5AeZH=C!$aQ!+68bcbh\Kl#LyQi5qm=dT85#T<RZ
Ph%j#D I#ML/RZMjGaiA>S\bw9Q%q5ai^9mG=H<5w8EGe!F*?yn=pleLD8yR=nB8qPPn:i=<RGQkCBj%+WiQmk=
euaZV8 5ThQ^\Y+&Nl=BRaHBAZ:&G/c1K!pwmI^I?l\hIC:V%nM+eP^MdEJJ?NCjF!e*L&>*J^e*S^MX$>RR&L+
Q5<hhC @#<T\+!SG/>n=$I&KkE\y4IA#Kd%c%cR!^>ydS4Ebk@RMtj?wtX4DLd5BLHbb+=*W?*cTn+#QM&Y4VW$
AHQ1JB MnZYHnht=KkJYuQt/E\iPZV\+GGn^$&eMH4wpCHD@=p+dhL+1j5nw!Imw&KQB@<@ijp8?Md@#tQ#&G@a
8:yPtn NXjNDdZ5Ryq<Nw6>+V#yww$PC\J4/W^$B1@K+y6wt?+%&&?B>%?T$DA1L9+pi/@b@h1YJ/<\=jc>+@%L
Mt!#bV *DND+ly&q?ZNt$!/BLCTtbtF>!4qMLtDlG8QehKku4&V/NpL<Gqj99@1iRGPc:ATDeVRj^In1pIW91@8
D^VdHa !mJDKatlWTdR%CtL1KlQ4Rb18FQXBiICMj!mkS&88A!AI!e#Vtj8<p*GAE+\k6PjdY94^TCu9115ABk8
Ja$ejP L1FKB>\qTi\#S&PC9b$5VaWyAkLP#BWt:4EZ:#R%F%<=+tYGY=ei<ST^FZLP+nXdVc*hR+/eT:@D4YpV
YDBk9E ZjYTpZ1j&hleD?lALCNwSN@GpB?XG!G81c%9KDpZq6#!>P*D>4c&*6aiCH%E<RI=1q/pyjntD!Dwb!a*
N@P66N C>+5P15:e*uP^h#@un%=?J5n5lJc&HeF5uQnJ6=1WXRK*$<V&WyC41PD\A&CNT\$+ElwT$QR1qYCbS^k
LENNF% mdPEZ5\5wliKLJk@u=wuN&@8dNPewy#e*Q!TT:>mpKLpC=i9b@/t/CDd^=>+FmqK#$\N>LM\NuMPCA=\
*9l+pK eX@k/iMZGBy>LQFIpL86nZ6AeFBAmJ@nDm%%HQNZtG+XDTF>SP!SI!BiJ$@GBup/P:9:iL5=8*9aGT<c
6ZcyQl VYTu>*>BJK$=cQDkIWPGDl$&nB:PAayEINclYa:Gny8$$^dZ>AFG8&RBI+M%1=cT!^>:6Sphlbt#=m:W
&1<JX5 Z:Ft+#cnQYbt=96ym@Ztb1bGYM&d1VN#@6I%ln9&tP%hMGum/JEViHQt#b+^h5RRwGn<=MqnS\^FmtbM
ZTlRaP uVS^SXk5WHV\cHBXe%9:d+4/et$>QSJ5IiG4+B9uP@YN%=<hiNnZDWVTdJm*9yneu^^Ant^Ae\Anp>&:
>QZFq+ KGPhZd6NVM*MkTWHb\kak?FNTnmVekWm:@L1=me9**@>%j*nM?qp1P>DE%uKaG/JA$nb&VtCZDy9MJcB
G/dcyS :yL8G:#cm$CQX:N?@hHX$@tTJ#KFBapm&ValTGK1m4K!JHW61kmBD$NAA1mWSeHcEbK1qWXW^<&wBbJE
H6QZFA \LkJ^Gt^Z9kTAEwmp9IKNLL$D:C$$Zm@9Yh\dEJj$4&jyh1K8@t*C?+WFhN*B^RZFidi8pL!Bc:Yb6m9
y+XEPj MGithm?!yKN9=B^=Q4?l8TV6tK@FlkW/&w>=nLcC:1!FK+FT*Jy@IdPpu66YI&4+plF989&&64/?B*TI
>qmA\L d1IcilyX$cDX%SVj>qAd8<dI4/L^GRTcXP89Ft=#E+%b:Pa:/V>AuZ5!tT!y:J\e:F@I!1X9M@ueuC\1
*@J!8I e*qY\e*p=pe5WPAV!8/T?kC:VI9wWua8hqjlN>YCQD$T6k6X*C*I8ytD*!&8k48^c&Q9C6Hq!=a8yWCk
mM:b#E tMYeSaKF+k5Z#DNPK<Ke&@&dFRTuqE6Z$:P\E\KiB4\TM8+9uE=+ilmdP9mFBL1:ie#&>IXH+ZDm$SB*
BSdkH< P!6Z9?Bk@=AAF=P=k#EdwKmpMtT/#p1@1ITneReQuVwbE?nl=P#y:i*t+8=86Y*&WGXcBW>L&h<$IW!M
lCtAN+ yq\@VePHn\CctNET@+\b<??@a<dRa=pJW19&H$BN&4XDDtBc8&wFi=Y1npDdDCXy\bJqiNu6LyApCDIP
/A5Bjt 5J%C&NA%i?a<@VWd6=9A#^9!yw$hNa+*b@F<*Wtnl\$b>5?+KXMunB+?hQk@E&d\yp=c/u<\Mmw/PmEm
Ek<\Y\ lVXGL<thB8\TP5IVhm*<?Qdq/>iid%4>iaNH\taFVB9p>5%1a&N/DLtW^<ZBBnXyn<p8I/Ph%A/huWdG
8&H6t8 8@iatS?\6uN$BYWKm\aZq*\bu58!9wVd#<<jZ9>HLq>BRIY4^&q!!Pa!iR\<GZVBILKLH^NGniTm+&h+
LE4?IW R&9H6=@h*b%jZ@LE^184K9?FE$R/nI1+LEhEZF\K%aySFAGteA=JZBtH>JRSy/jKHAmi^QBjXZ+ye$hN
=VmEWa 4?N>+$tMX^AZq^AH44/KW&JeTamINKR%6Pa8&&lE1Dy?>mJ:y$JNA$6Xa@Y>IqKm8pMZ1eLLF/aWQP**
ZTl%Tw :>1!d8qeQi$ilEy:+Vd:5DP=6c%qN$+EYBp8%6X?!qQBHQcC=Rdd#Y#ek?NPZ<+yd&4qX8YKt4>m^N@j
LG9N&j iFFjX><F\pR%>Db!G?4yYyYt?+Wubmt4K15Q@ujYQMQE/*h4tnwB1$c/RdT^8VD>P%DF#&T!y&bqZn&X
cNpRNI eM^m1?FY4<nA8HMy6<lFeJpbSZuH!@:kClPqtdjT4%?n$:S9aLh*Iic^c^Aj^PwJ&+nZWH&9PC<HFSu6
A:h^lt <<N<<$%4X1>iA%?4X1/kqnQLtKWm?p9$/TYe^e^mtZt4VlVi^9Se\TZC%$Xeeeu!hRJ*5?FRJt=uT:=+
1GPnt# JT$>^aYNppK<ZN&>buu:BaVGJl\Lh:i*e9RNDkpMCjLe6*TEInADb/GmuLT<p8c+CVM6ZKPPSAeAZq/?
>WqtZ+ kJiH&\FD*WEE4?+?9Q1$m6EWI*nSR?YHDB+<AH=l$BCIZ$d?T+>l^nLnyChNtGhM/NwmC*T6Z4F<!aK=
WiV=6B inN%BV4:eH^m$hKXc#h5*tECYwX\YXqdpm8^$c4Q%X?>eh68yG/uDt@T/HE#=m^dQH9/tBHDl9<#j54$
%%e4/L KYNHnlk=i5IM:StVhS&^ZTQ/<KHRQ@H1#&n*pJd\:>??jKG@+kKLGj$JBw!S&PaFWlwqiduVyCwWG8n4
Pyc1%a /iywc&t^d/@Jd1Ph&?q6#Fbtt@d&uWdA&Q+D%9cwYCGSeWhQuW8>uqqRY6YA?duPu5+9H*EW9LGPdaqk
*l6u\B L:1R!kK^!5&:ub>QFVCFR?/REm9/9mb!B#I&Mu*C!!m:j*==@+4HuVKR@y@BpyK1mwI+l<9B+w?aPDai
qBuY&P Mu&MkYIS!ZwGjCp1K5nRp1K!<unQe:e!h?mWikCNP$tbptDEPYkFJd4BEuLADR/WXbmA1Judi\VHHAeH
FT6=YC !*dhaeJdCy84C@AFC\yW<9Qa6EPwn:MXjmwL>HT/AVMX4ZtG%pEuM^?$Xh#Cm85!QY&6b#^XnG9%%&+^
8\>w<R PiDpE*H$*QZ<m8cYCt:&PXHd%+#E#=59t&94/8pGVu%9A^bc?a&!/AN4G/w141^W^mhywJTc1wKp>I!k
ALBBHy 59a8X5bEt^4#d*:DGDN#B4!H%=KeLA%$yp%SX%bSG/R=eMT+!V5eL/cn6GZeKa+9ci1:wc*wD5cwGdeE
Ptck8E /bM!5*EjcuqFhS&+A^c*y/V%qdVuFbIBX?V6Wb*jlk&ChYJ4pVl1Jd&CYe=bSm&XYK1@aHq5jkGYai>e
mk<6+w /I%F&C=h8b/S<!h5l+<ebYG:uHdbM&T9paXHWImj1=8uq/c*Z%Dp$iQSZk+HdL&CRwKDR*&5%p@A<Aw?
QiFnyu QBFFBRXcWX%JRXye?6?6dy+kbV:i:m=idke&cY51IY6hPI8tI9TF>EAGYB5#cQCR\by1/kMAXtpyGVue
9Hkbtn #T<nyc\??6>^+?F@p/dw:pDWN5pAcm6ZLF&<aP+5Qd/8pl+^lRcG/AwB1APY6QWGG&ANhA@V5j14N&#d
HJ4PE% 9Sh@\Y#lnPunELYq<:ZHn^w^+y<J$*p#J9!D1E*Z$=/tjTA1Nnw/=8Dl\Q4@G#Wyak\@j@:!SjCX?cLF
Ke$DAm ymQIW8&?lwd?dASyE<eq?BBT&qu6N#MFJh8^di8Y#bRld@QYdV5Icyc&Dm/piVH?BD!ptdj9an:9VehQ
4yABRX 6k#:tQYG=E/b&*R8qT6%P^?CtMI:SWX$<YA5&XTSLaZkCqHIQuS<?h:b$\Y8<8Z4@ln4L&5w11w5\iut
1VA/lm Ml!8mBSZpZlE\ymKC5uw9XTYXFKRqbERE^MXeCXFpEbyYTY?MwSttqMcpLXyk!pJQuAtEGepcHFGVESe
HTe4b: VFwk#<mynb/:dAQTFpSw8=XdXFbb&>DT=^b9a@I^n:/6CkhG^qW&a&Fu6uQnTl#>/?dh=!uQ&ZDA@@nN
!1!hnF m9c14KS\B?QXe:Y%u@MGaI9D$p%G??#ek&JQZ4^%=$F4e*pt>&!W1M<dSyy1!u=TX+j^q/Cic5B1LFPQ
Q1b4Z\ Abk5J5l4/^@e#k5d4>1D=:i5pt9%R:1bcbF9dtqydt=5dGlwd5^Q9+ZkKaBy#Ltc+nS:wI1muJ!<Gn!G
Zap>Nn cw#/WDXXcdqFY<!V<k1!d=djPQQ:cpR+<*K!<RL:1bqbyCGQVBeAipDi$@?iQi5dl+J9Yml%+DKc\#h8
d:Mn5G &pAbMP8=/>dTc:m4%>C4JWD&Xm^j9pJ!^jKqT!!9q?VR8TJFN=wJkKTjwl@A\*GHePZCTVL@j9YRw=*^
&@8d8N ZyjApEAQN\>QV\*9kLC+lIM?nycYdwElIaGl@9ddiGyKJNe*nN$nkPG#nM\!b^euh%<jN^hQN$6Dukd?
-Ad5Km 000b97877b4001202b3 Page 241 of binaries1.zip
P&&K^J np+qSwXSbRdk><9CJ#Xp>MVS<qK!C9K$*CBy9H%TZp=PSp^EVuuA/QEV^+?dMuG^MRbpMt9Z4ITZ9Znl
>n@?ya 9Dt#BZ4t5$qj*1c6tNa\^#!%6a&6Zh>E%M=N1\l<bum>8aW?V&9!iKB9=YK>!cNHnjy*+uRh*cqnS+@/
aMPi/$ b@#$YVP%y1<QQA#$^ebHylQ/Z9^NZ&<Qy%8TZWu&?VQ@C@Qb6n?@Ic#bpnWPJL&BT%^^pS$dqqqdtP$B
T^qLwC th8&hdQl^k$dDA\&dDLenACc:4MkWkh8<nDEbtt*<ww4eAc1+$e*1WVlFqFYRP@k*XS=VJ+EAjAP+Mje
mkuB>1 HXyTTlKCj#V5j8#Ac:G:TI4pNa<:Zl$JFQ^bpYJW8QImuX\8S+1nTQjbTGWY9>jKnK4aACX^ET:F+bPL
\</^AB aeY=HHEycRWcRneX=XGE\PuDBEBjL>CHJGK<S5t4!&4MRj^\FBj^!<lD@BwB9^G54d!XtRZ!py5Dn9n/
BnQF=q SbL*eLVaVT1:Yq%Au+4i&u*iS//X6hZpypT:tBw5%NHYikt^t148*BYGyqdP98H^b/>pq>T%NbdiT8SG
S%\jc: 8Iyc9&HE/\5:c841884=&AZSIA>R%hdW%FjjLnnKW>d5%lBVE>qW@1!:YdwSEY&8!$QiinJqek4V#=ZX
qRLE/J q?=TW^6Ic*byGGl1TMpy#9bQ8H*9>8&#CYYI&h*mI6KWnnji=?CNReYq=HcWF6A^R6u#=!?Ep%I6nhZq
8AV5W< @bk>cV$En?etcmN*k\G>uq4H4JXa5^4%dyW<$LdWQK$M*+Qm9BbC&SY<?p%IGi++^aX@R5ym9RPMh6u=
=Hq:6p lwb+84y:iH4N<k&PQuww\NuK\5p9NDRwLMnXbL+tPp4<:BVJJkL<J!W^u1PH9d5Q^C+i:ycd6hYFqAu4
lXt!Yn >Gy16D16MWB#<In=8/$Q/M1R1$\X<NINGVqKZpqPRyR4QZnWlMtVJp&b8&tV\V4yNc6Y+PEA$cbk481<
J5nAmD lcRqa5h8W!J\X5kadd@in5*ekZZbmA1HpFpjYKt4P**C6FuLXm?dP^*ltnBDh>cM<YNG@#6?/1#b84\%
ql!>w! AWimwtNm+8N8AtZ5tPHH9yJXX\>AJwb&<nQh\j@MhGl>:E6>NQWHc:nu=DLJIB+>jJC>KyIkl91&^ZCn
5b8td> \jy%>F4hhi5NNkFp^mb:#R@aPL1T/bjny#H@WZT@69ZJ/+@jTN4>=hPH4iTcJnlh!eRep<<WTBaYFSjj
aH><hH 9X6TTyeN\a8cc%nE!IEAXlK9cmab?=a*QJH^ctVLFpiS6JwVV+q>5VTRJ1Ik!9uFFiGIK*L^RBTmlt:!
/q\JB5 6dKE/1B@J+\jIE1L$MILD8T+HI++dtBTWl+\cuwV5Ca!jaTWAED4AZ8JpmemKWhkW=&#%ICIW9T^yE6y
Y64qC/ bHAZaPP*!?HeZtqB=w&dtAtqM=X8yX<YJpd&dmMl*C?Edia1W@iD1ZidG\w8^Zu5*/\Q*9I%d!DEeDQu
C5dQ^! 4>^mS1+8V:=?8^^9WE5@Fe=%*mQ1<JcS/4:?4kGuki9yPkH\S6j*NMnW%hVW%yWXbD5PX8:YEB?w58B<
@:EBCA e+8kmY/Ydty51G>w45qJ9@W%k=@J#etZ8=F$?iQ*:>?iB+$a4Ku=W&P6=pA%lcHVHe>pF=epZTHMAZS+
=m>:Fd !5E^h^5PPiIy/=5\bR@KB5m>iQu!Xj>P&911G6bXQwFjK4e&*py9aVcLGY:c8HEV6aEGwYMAQtc6&PwX
NFKRBn y5pqXC/V#:%IH$Vw4q/@qbNHwCMdVBG/a!^$KT+Si*bciIYE?8E>B^:iA\LCD5YHPq986@MPDk$CFA?5
qQ\&VW G1$EIS16JAdawHebmHe&nh9qdP@5:i9y+8Fl6%%Qk%CJ#IG&CbX6wIdt5Ku4@AIDA>!ZKWlL!?M%&*KT
+/jl+P E6K!NEAuL!9FFbZTHDNy!4Ty?kd4%pkle<8Z/T>iSC%e9&n^p8Y4\XRck/pE5m!BPZ95^uY$F!dMh&$l
:AmbYc /SEYS>P=e:RtAuZ4Xm@Tu9D9/H<u<tdP%y$<>6<^RN&<YV14QA>H$#F1B\?F6Q^9/uy^K:b+=$<5eHX*
qL$M9j &LFFL5!R>NiH@$mR+M/aID?I*&\P:AQt6t@hDKjFGnnqX1=c9Yc6\edN&*act=ml5uu+BpjEHW*Ehyk:
&S>EKQ =VZNV%=??NdX@cQn@c9@H4i^iia!M1lcPBFNJTAHmqbYZu:9Qk=P%DiTDVJE%eBZpn8y*4=+*FL@q5ih
4<HT#u MWmk#FWTI5iRwnAmJ/11wmL#E?@LWicw5D<J6Kt?ARPyQu\/#SPbPqkMb^By59bPGu/nDF/\wnc?mjiX
p9dZJQ J#FbXWJCWwIIG!NJT*Ba=mVpFAV!ckynq^45BPRCEdq49=EdnyMi^ZuyPMF@<>c6t?uZ4@bqVa\&RnTu
D$dbD4 *RuE1iw5*?WeqXLa%F^<>cm9>e=Xe$Hj*9I$TP9jc4!jLj^\a816\w4t661m/!jCuLptc$WQ9APHY%Lc
hYa8Z/ ClFeV^%Xn!qHy1/*kcqncmV41k5#9Q>XRyYV%:4<5k$uSKRk&K69jADIjetkMpY#euM9Kq=<<bW5+*=*
&KDmkS eQ>pdC:>wTG44DJ5muu/k/^D%$99CwyF+M&uC>RL:<CdV/+/InpV$Dnp:SZ%YpP+DS&C8ecYQ6/iX#8a
ES^4LF dBh5+\B$6KFkE*enEMhb#/\ZN%m=KjaP>kLt=ch&E>#RTCJ8F>mLHaA&IY+ZA6!6nQa/B+aF8d8/k<d=
le9jCE /kZHHIq\6>q9=SaaGlIe/ti*iiwA:I$XTy\TK*G!w<#<HB!>ADh*V@9h<\eyIG+@@#CT#EB^neEVXuwG
%uS%@@ $Q:Tj4/i1:XXJPWWFYpFCSqJTYp=iVCYaCm=aqIcE&hMu4y$#T4PT5EKL1u?LS&\jMZK6S8*GtG8lCAF
<ja:Se 5Dp/We//jV9D>l4*\&bud#=@kh/WcdPZGc^jPt9KtH@GVPRBbDMtnEHc=5@XuY>%<CDTFlhe@^h6\1EQ
qqL4E4 d9e9Wb!<wV+JPylQ&1l^8PmbZE:R6!c9Q%$TF$%5yJPhyduy4y&keB9Y4%pN^\T>VHj=mqX4%kN\aCZN
qBJ9Q: LY&h\EqCJHj1ZP1N:MK!cy^Z@Q14B%9W!YZycFHLT#GIKGKKtPK^h^G&i\BdSTZy^!C>VK@i+wX@Q#y:
j1ldby 8n6JL%SLjTZ\>w<1^jItEEwe!W!K1TnLmZC/8GIe5Pk5lKl81t?B6\HDy9J=+6PH1WqkW!%FF8yJp+BP
8wM\%! WWXba*I#ACe!XW&CqtSA*BkJkYTZBCZPqbD8qS<\CqG#bXG:uyujl=yMc<PD55L5NJ!1yK<4Z+Qn/P\^
IC!yeq NuG!bR*GeRR%:TW::MQP=6Y%qKYjDHa\MXk$W%94HW<VG#aY4ht?#>E@?9m=1>uF%c&6%aXyCTFPJ6!%
J!DTSR e$RDkLWQYV?1c&y48$Hh/DwciJP9d/m44RdJK!t?wC<:5EhDYqNF\dL^TS$y8AtdP/1F9IqqFcShdlF>
k9h:SR @?*4b/yD<hPdF*e!WtMN^w/hNEyVe=Btn+cW814ttuM%%++YCaw=h@uFPunW*eMPTJI%Ac\A8Ni9*:^>
V!P#$= !>=G\+=?6:V%Ge+ZNW=:nZd8&EH9bLdVY:qdkD*S#acdN6EdJVh8&Llta$SlQyW4i96Yk!AP8JP@uy/b
6%1yuk S:k:h@ypRn^>SCQ?/HG!Ji8+T@nP*db?wTHiLt=8:t=i@84lS&K>dC$5uANCR+QDk6*RYRJ&Ktn=me1y
du!T9B ay%Nh4/4m/&Hn=id1/iV/a4Sm4RK64IJ!\Cp/ZdwCkej9E?e>qd^eue^Nh1!ewKc8wc!nKRWm=&54BR<
V+BIpD J5yniXNu4qyJ4^Bb8Ywq6YLn!qX4%1\#AFi=X$kY*q46=P#m+81Gk@n&bIeq?VXLRy*>@kYL=<&aQt9y
ale!aa J5NX</cNG\Qa#b+@V*9!8HEVy5^e8EB94kZBLna8K4*%$j?BZXiuKA:wWB?yV<^HuR@9?=Muj$S9dP+p
Wu?m=+ RZkLPS8>tSl6&+Im6*L=Wu%>iwt8@6LqK>eadN1!*RmF#5HX&#<5?5kJiF!#C5wiNLc#8e19H>?<iQ1\
F^9k?5 nYVN:yiZqh/>Y#\SZTXTS/B:WN*jR9n1HX+<?@NZD>piR:A4jeeVtVJRFaK$jy%nqCRWqZC@PRb!1mJK
JY9qZ? EtA9^VmTaQ%b?GmA::Y!!LBJ$*6+5nPtn^@::#BFMVE\>kLkn!<m\bXRWFd>b$aL\MihPwAC>nkkhkJJ
F5@XkB 9kRHBI<T=$n#=hZpXJdkLi8@?d6ZXhjaKkCyc//4KLq>K@Wm41#BSRwZ#y$+FBHkdt8&\$AjI4tj\N<A
MT\tEy :aXd4ANQbn=w4<k<G?//j<9!PcB%u$n#l+dP4MZ4hyk:?eiiT4tSX%dZ%qKbj?W+ILmYP%hd%P5>I@Mn
cZ<XHy 5:abIc!41?WVDu94eZK+Y9^8*p&HEc4hmJFlXq5>@Ac1ZkREn/+XlbD\=tep5QDcni@jJHElL*5ZphK:
H1GFVu 6&@i9LmjieXunj:ceb1DB&u!NTVWB?nGqcYeya8=h$5EyW!bYnq/DjTbjiIGFL=>J*m9Ih^D>:ChhcBQ
GKicPb Mil:?Tlwn$t95RmRTG%u6pq5*dJq<&bDR>yRdL%l&P$CIDD9ZmEjCS!NA!P=jRVmHZhCAp?/iywdYZmG
#M9q1& l9t:8hJ8Il+?\d#a8ECH@j659EQCkwFL!%Yn5PFAXRWE4%@*qBT%>n9b8Hl:8#q:8FpaVCYqkl>@&E#=
Rd\>#D kSyDDIMC<E+lV*Juq:IdZwG>d?jYliNG@1MwJTPQTSXycZESn5#wGbQu4GSYeqi6F1#SYL9iaIQlbtI^
=ZadVq ?/RNAZS%w>^%EWHe4t^8S6\u\8ukaL6<<TJh4hqLDdi8ZcR%Hp++4VpLF?qNu#l?+6Tbm^dNut<iT\k<
#htq>Z iPJM!@<mpN<n$9&4W^R#KNRH?mQ>kZp@w!?BW99kh!XP&B=Cyl#BcD4aEAI*a!q?^XL>^j!FPw9%q/*E
9%Mc5u jP9PZcdtX9dPu9+l$aeV#q/<qyqj\w+<@mAl&56udG/tCkE5K!%q+CMjY<:Cl&NQhXkniQ#$PSdl9u#4
Z9dDS# :P4y?pu!uwBjYiF:u5m$aZ<Fh+!!FQJH%tMT?XPTFi*pmkFXTpy>$<WeqdjKZJXSZ*qTM!cNG#NaRX=S
LKIly> AqjH>I1Ime841I=H>pTtD=KmJEY\PAj\WSIIwlnY/qD>yBi5S@wCkD/&KSadFkZ6\$n4Xe:%FN^+e?uT
6J8hRi Sd\jPD/c#cP5uK?u@RQl$=1:ad>Q@I%:dhY=KdHi%5b4F<:W%9:C\@ajVb*b?86*a8eXPM&C?\*6Vjh#
\Hmu%# W+<FA*^#8hw<Whj*nHlN=iP1/y48Y4wP4TbV!\EEtVyPDX$6YXPhq*Nl1R!IwITt:MDDD?841X11nq6V
VyqI1: VhiIqGdh/5mkM<YL$nJA@SVIZXL9!K&yiLi&+KZM$+wH!TH?Y1M%Bk&mNQRHK9<VWBCdjSjeS#q^H=WQ
+#Fi9a TDMwa5aC?Pw%*1Q*+iMuh4Q&C*\??8mEZ**%P6q5L>>Ee9e8a&Mnw=$:/S*m&:h6&:y%m>TY4X5*d#R@
*&CWAY Y=cDe<i*i+pTytjpFAk=QJX\qIwjiI^kGP#96NQWKTk<&AMihSeZD@<IqdlRy\NtF1/BaYA@@S&&VRQ:
p%L6=w Tc9&!?BAVGM1dZc*69MAK?d1b4%hn?R=kWLN*$WEnYFdCaN+u!4iIWp:e=\wS<bB#e=5*+cF<#SX=BW^
Qc^?q% yTpl\lEjMZ*cWqEItNdSB4adNt+!*LJ6y^FJaB+kViw+JaX^1KeZ@GH5LYGYF5JIn\TBVy8Z/M@Yt4X$
CpWL81 <@aN!&bPGn>?w6deSW9u<Tanl$9$F<^d/*p$PmatN9dE1id@\TFP<w6$@jwy?9*4=$>h::Zj>Tha&J99
8Z5>E! !J+b5w4&^FF&T^6<^:cY=u8M6&@i8B+$WH@^\kZ#1Lt/<^a5$q?&cl*/V^P#A&A@jaMn+*DqZMd68^X%
-A>@wR 000f6257588001202b3 Page 242 of binaries1.zip
AHS8?y tGMl4a%+L>nDXm^RXFXW+F1XmZ<IIM:HC@5bZ:@>&QEXA:%jbAZla*aJ$Z5ih^!<@!JKmkSCG1\uabGq
9Dt&V# nXFBFi#CmwI5L8d5c*=<w<\b@aEuQYQ!qH?HDyEY+!B@wuI1R/i%<4/AubYqJAWTjEuWQwGEmKR5lHkD
+IGqnq yBA<G:iA/KMIZkF:\!cFF$uYXbaYbF/tp%VQJ?Q?4VPJCZHljylVYd6pq5=**n*ikFq4VN*nL6>6dmlM
ESn*^S nR>!NDNeNwi5Ftc$BN1DhPj1G^lbIHlZ5ww4t>5d!uI8^kN+/?b1M#^S=\?MSEjcR#CcNZR6y+aQYFEk
RTXDyk juK%PJlTZX8ai>NTa$C*l4V/eN9T?1wHNVZXXI%pNb^iNXYb/emhSQGX&!l/wkmL+LWw*tdj@b^=N8P@
EGIW<^ S*hLM<>9HVN/=HANDYWNm/!Vh*HPy^J+1\HktwV8E5$qT>^HCEbW!LZF<Dk<I9WE%L^Z>G9S1/ABqKu!
VaeAYR Z6M>J48B8%&I*p/\w>5B9t%dDy\4SiSK#9+k!GHueG+GIwjZJ6H^!piQJb\+hj1w4hh8a!8j5DAjuFkZ
5u1V5* hjWKm6YPe4e!M:Q*A?5bG8T/b+GtEyIEWKpwCW5H!p41m/^64J\<QX&e*S^Nqw%A=4+V+XNm9cjGTGPY
!&4VmW PFeZ!qpW4:uu&\95GF5q1>&:61!hAH?TAnyQ#ct#l1>b8*/DwiHtLh8&G^tdtP:FMI@pXNn49#&<?N+1
Zu9AKt =Mwb9GHDk6W:EEQciiR&@SWLhYe9M\SZP*91lAtV6Pa6YdFIh>1pTXNu/m>j5uC>=%E1bpD5Wj?c9$nD
EciBJC npkBZ5:h?WMeFP@D8*j<><\::djC%EyDVSWJ>ZLbiy$\%A5QCjDFhPd?9d6*dNt+d5&KbbmAuV8dt1W:
Xn#9ah b?:<lj4LX/@j6HZu:4$Y%w=8QpESeehP++Rinp<?b4M4u#?<ijHja\kqpdjKmw4:>=u:VMZaQ6d1G^1F
4dhG&% *eN9Q*S<?@G4y?jZ><?+SF1+<85DV&41IGI/FBZJ/p/!Kb%TFGY4BPK1Kp4TZLCh+qKK+EwWBeLMC$j%
NKq&:S udKIm81@4*nmM!bQunBGqecC8IkwX$yyDEF84D\m%\6K^?>HVqX/<846j!NZ*+^T%%l>4#k*QaZ5=MZ>
q<pBhu ZCiPH++K>MCW!9K=8qyIuQ4MFedPpepFne$q%$=G8F5c4X8E!$@IYLqAi!l&lm<F/y#>a^I9==bW6:VX
5k*kCF q&cqHAq&&4N?unc8k@L?\Im>#Yy<WN$N&IHk%VI%jJT<c91BbHXli6:ySSn^TR^WtHKq@Z+FZeW<aK1q
p%<JQb 1mw41/y1mnNA:/R#5$18FyHLH$Vi9uqN9&SiWM<=#@n@<b@PaDiwNSbh>%&=bPJk6W$lF$541nCRBJWn
\8E491 QenCBM54eyp+Z59%lj/1nH@YP#JN!\b<!B*#S9!GqiZ?jj6we+q>bu6NVjj5wW$pEEDkn#aT*:uN<t\J
^5J1Rn wqh+>T%BD?<h/pj9GB&9\cJ*^PdA#u&8\iEBAItL5+8Hd&T5k1?6?X=L4=C\pNBR:\N4S6M1wnnLB&+H
qJWHGi N$ymEqyFd5kiF*NdN$>Zi^hum+*VqGmXd@&PW\/+M&Y^e*b&yMq5L<i&%+b94Wk/8E!*4Nai1mE4J1w/
5uDwGl VtdS?p&d6&*jcdVL^JR&W<FaD6BCkeQdqd&<jZ\yQ^X!F/a#GY+teb+DenjKbii!Nj1#=m#j5u9H&9uV
IWkkyd J$&a4D%@/Y4>Yd\yp/j1Lqt=dLGBS:\kSnW88LTj8!>@eQi4<:9+6<?j*4>>K*nH9NX=<=1$myMeC=t8
numnph #Qyh1a8LmRkN<9N!hYTh=1b%1%hkiZH8dL&b6K:&VL%be?e9I9YQ:eb:\G?/ikiGH#!ctH\que^dQu^P
!=GPQ> =m*^Ty9uGE$&AHwQ18lKyuL<d?!ctu>#>^WD9e=9lL9Y?ke+5u:>A$><k1I!8bYkX!l\T8SHL58h54KC
<#k+Yh PAmhKPbccHCpkn/yi\@kDSn*lCe*a?4E+e1KW8Kmp1wVb4RDhBJn=TWqyTRqMb>JTaqITpn$RJkuImtD
tK6EXH :Mt14!L5SRF::F*^>e$WtYhG6d8cqJB\kn1ypHD</JGaEGGPSW@:G/Cu14Npt&%\ap=N&@&MyDl@?:&d
ta%kRK X<!jTY6#6H1BQW1d$Sp&W&@8ktWdCH&uW4Ml$G868b8bjDnI!hSkkVaQ<VQ:!Ik@LAcJ1?/1Ajd1KQn@
#>Q^nB FPFQ<ED<h6c6@a1kiVJ1w$K4Kwld4/A48SZ*/R1S\w^du#Kp5<w8FuiRG!c+4%@TIHd$j=!uQ=+MRjBc
C8GR?m t^64K<HG^Aj+&G\/Yw1*q4Da$i&Kn@:t:t99N+W9\wtP@%l#Td?Y\l^MJ6/^JLARb:eI$1d$HqEWQu1Z
jqV+:! 8QFP1#ME8cIddRT=#P#d@\h!aX/&^496@eNC9X$kmuJ!A:ELp*C$MDX*CR1nR=VAZ$:HB9<Bc115&GGW
Q#m#Ga wcT5PNDA*5LC\e*X$hHF%umlJ1*!XWt6#%%1@L9H&>QhuiSF:P^wY<cG68/$WkJZmM61ht+&YL%Td@4$
5?^!F# mb1Te#b8*YG<G&FV&>iZ!i!u#hjQ*=<K$GM9u<XLN+X&$ltVL1/:ql85uD6*?ba>^kcL6cbMt1!>aNt/
WE@ZM4 FjN$yp&iy46+%ZL>Di:^$XTM!8G\:L?B?>WqILjn@QktmnyH9/HjMt@w%##&89j/t5y:j=RR#yL>NYVd
#u?mGT w48#Hh4KdaaG1%jwL%1A8PpI6HX%<AFcnEwH^uKjyd&LX\CtNe@De%ya>1CBdXDBNY!9Wiu\!y%c51mF
pt$#hY <+C8Hq9DZ4>BD6w?*H=$IY=wSBE*uQ/+pjwSiFNH+ClFju>/like?pw^?F!pRic+I6IWGReRR$PCRmjp
#AWIcE 4RZwGnqmmP!@lDT^eR1TWqI$Xk$pBXKMJPh9$6akcj=C$pw11l6ccZKQDyG=C!jn+\ZH=QF//HB@h%8#
/c/9lJ uRbL=?l<SXiyQZ?Vlh?^hJ#i9HR5%N*T&GDyZF%c8^ewG\+KN^645l9RYpcjVM$14Y>44T/?hi=RwKQy
JDld$G lwW/NGJt<bGSKY!yieB8?KkYkNaJc1lcWS\>w^=I%lVi#D$<S*+k&E5X:a9NJcZq><49Wjeq:tFequZ#
?hF@mC W+bMbpqT^Wj&NpmS=<@?+#>lHnPQ?A@=n/aV$5k!Ac!VqyXj8aQXA=^Ia=8bMcFJdCZilE586KJ@TPMF
%ppyki p?\YF91=BMS=4>?<iW8@E*8j+&lu#diWPACQ<4=>b9R?EhA/iw<W!J*J49&HC@PwZNH<wq#BIT\y+NdE
:>Ie>+ *:#F^^?FkP:EKXhjW&ML:>B\j:K=^huhL#LTR>X14/tNd!kwZKDduwYD+ZNXW^6AKa5wKkB8/C*qS?=&
#JGwWb MD*k:Pbp/?lw9u+Tyj!6#%kCdYQN&VW\D9c&NyR%a<XaMkh/LKkD$wT*QTkT>G4SNi5Mqwwb\GMK6Gpk
*uqMXI deL\#dEQN*@@\KAkPul&EP+Y^QF>B%^SSZl#hZX#e#hbcdl&\d!XY$%NDJjyVy$/SYjlTwM%C&hPu+4E
Ma=IaA 4X1&%m+8Py1PWVq+?GV:*<l%W#*miJZ=>&?mPDda@b4*/8Z9VI1\D+!>M?Ga<JaHV^h:c\9$qS9YLNhj
Dq>HpE NH@84JuC&cAb88^W\+a6P*cdYhk/i@1H+q:w%P6b\qW*PKQ&@jQH6/@I=F5#>lZTNW#NiKGlFL1cQ6y?
$iJ8mD @caN8&:#5>K9yAB8w@9qDV8b@=a*<Q\KamB9iK<#4ljAbp5qbW1XP$DqA@CtN4Gi^=$+4R%SG/>IWGNA
:h9pBy %ASTjEtGaMiXqPHL1<4JL6&&%>1XJT&uANej\dE9%/>yS?MPHccQKB!PP^kVGi!F1bNXC@T$pDX%LdLn
BmTSqL =pyJe<Ph6NM^jk=tEN#N%hZy$l/BZuLB+tY4%l5cY#n=Sb?+tHt*44&=/p=/Wq!Aw?uGSdwWw4dlE!Ni
<L6W:* p>NRXjYk8=yjR%hnKChHh4I>1MnL9tp8w$aELd//CK8eyYX$8WRb%q>!Re>pM+9Qqk99Hu+t>9VJ+$iQ
^XI#dh 1IhWP>Q&1*$KWMaPW>>q8*%1/6tnnY&%:IeM8>*b$Zlq>tJy:JwklL*FdKbac:Cnk+*AY5VK<kBqRi<Z
*d8FjD B%$#&&9G\iuEQTKB&diB5J!c1:?RMQt5*II@CKPQcmBljm+&S1a8\bk\eaEk!<W#JM4QS6^5#*+QFDSq
?EB\5L 4\Q4^5GS1V=RdRAIt4KmIw8ap5bYB>P>N5:PhucP%paLNYnq4$41\9:tkiQ&8yQ:DMH$YX5iPMC*aQbV
M$e@pZ =9#>nIZTjul%bPb#:Y15D&#cMu!H<S+#M!FjX4<B<<a:1QF?ICyWNTR+KIAk=pV+\l1CG?W?!t:6qp&L
j%XVSw =/@c95>5K?nn%Kt/m%b8YK<@T&9chN*Fc>c8YLE*MqaR4b\a&<VmSi/8@>tHF#b:miNk?/6Z%G9tqR/=
huCWVn IJ%pTuA#NV8Dk?WChl<*dn!F\?RA5bB4X?k9uD>HD@iKcAq+86lika%11\$M6^8dY6k+8j6l!nIJX^V%
S:NPcT SY?@8u>?RXF:Sm=Y^L&$hZWV/%k=c^b?=8#+Da/^hj*5b$!+a9d5J^=*uA4%l/J^IIL4W#RXXLSPLpit
yc9AAX X=Et6#Gw9mhpyYB+NqWDbW6ERlKaElAJA/cp=jn!!8L#6\1S8w!dEm44tyEwMn/ht*:^%KGaYP1kjG^$
bk+^pw XHmI4+9%*8*4>GjyjPGX<\aKA:TG=4KMqKPl:6b:61^bQFeQ^#+auSHCKT1e*AYtwlI8*C18cY81KCBM
TZLc1d :h&$iKaAthwIVN&84\cE814yGpE%A>wqbPyi>1*etEtKZSwT19NTK@ML5TG8SK1$BMTwyDRVAnT=Y\X*
:%ILE1 Ey=nKR$nK6FHD>9d1Vc/6diFd1ZcJ4i&NA6d>py\qWM%&$Lb%:+MSyBaSG#>\\XmQb$K=K+@$8/HTAFS
t6H/Zj >AjSn/heZVHV\LGl4YlRB\/A^bnV=8L:#E#>5\lT%XhayLL#Ck6#d%*:G!pun#*GX9:l+d=PTIGn1&>E
<k1HqN mKP=ywpy=pNCR9$e68ETHFW%hVW5\RFT&K/u1DnP^G1Ztb&V9bYh9htG1cw$ET%XRyT/81+neae&bFMH
qkjDXe bW:9/#cn>nHtT5kVQJTGG>cTHMm&uWN*p^FRRlMy84E+?jklVmFlhDkV\aR4lwWAW6/+RRQqCuGmQWb=
6TewkP RnC*hNH1:j56h1!i\=5?ZYjl/p$dX<#V=W&j8YVh86Y4>pVGWNHKWTinG@<m1w9C!$6Ib=ew/NY4Zkmb
8l?!%W iZmyK<SL6XZ*j%?a!Kd?a!LDkpn9yNX?W?Q6lkc4>BjPt+P444T/iVP$hWnD>X4\l*9&Y#8/?\bHHYL:
E#Z+Xl J>q\:N$Z59Wc8GW4PM%NnZRD$#Bi1FRpta^ZAd<uDe9p*pZlNXwqBVq+A<iyV#!^WW4@!^\T6cI^CRLt
e\eVLa RjRZBGNm<py<SZI>k\1q!qH=mC5JB5>I+Z*tTa!WpbKTqyKmJDqT6DT1XC@<M%eKtbKa$<eWn8PXXhY*
%JVJM$ AFP6#ZXXbRXbcWuHwmMm1Tn=!HC\!B:&?+$*4bk*W\8b$6Bb9M$tPDG:81$!:&ym4L@#kh&Gc@RZ#MEk
FAlHB& hhSM9Vu#F?19ZM618KN9=QGW>MIH4e**C//jnR6\&t8w4<hH1Qb%MFL*Ttw41#A$=V>kkC4+kl>B$G9q
q$4y#P &T&mNaZyPVe5yEG!=AiMQFTSp=hjYFlRkF*jh<TKmw5\+T?ZuZi<?5WLZM$GWbhIi&8LwJqypt^5cCDu
tXpF?: Fh%M6$\nqJH1J\lhSYX%Zj>IDy9lEEL&>b9\Y9Jjkm+=>y+$nCIAM^w\w#+!u$RT*N%:HWVBmWHMR&C#
>m^::@ wC#E#M$CM%ul86JNKM8=jRe?94<y<@C\Mnb%Da$I<uB&edK*h@aIn9A<5Eh&6+XZTFlwTJC:&bLl6LKM
-A/yID 00081e3bd92001202b3 Page 243 of binaries1.zip
QnmC?n &pD%AVk&wITWMjD@B&/*N#dib?hkjeDP!ql@KCZMPVK1I\G#KYc+bNTcdLXGHTYJGSPV*d6&tbn5Mh*L
<JF!!# N%QeC:V6&G1+aS%yl#I!ae!GC8h9dElZmdMR6pDe&^+iGSXFST6GSwTFBAN8Ht/Itn8kSuu?+?Y>bii8
6Y$L5S qW9Y:4T\Mq/*RH5/V*jS&5%dXm?a1cW%e@E/k:X4>wVHSFNST1imt@?tnecl6%?+n4^DDBi#QBi<wJ>Q
%V5C9C ^^&>dALpn^/V*=i^iLlkAtV*VnCI!^dNt+$b6X?</X4c84QuL%t?b5NYI^N#K\e*u?AI$ptb*4>j>Eh*
ZA=XN$ %+<9bP*qW=L:wy1b=9EpFGBQ%Gh@#PD<b1&$pL%l+FkHn#NG$I<cGpP?wnC=RT6#bXC$bAYKIk1KmtTS
@C/NN$ 4=A$ESYNKepI&klbKYqyaktqKGuPu/CNqJ!%FXhjS^$:h=Y5^twA?N6\bRb1X?IlCA&wMLtR+EB@d&i4
>dWimY QX9ZLNdV@w!e+e+Q*@kd=Y*%^dhTnwX:A+TGc=e9YVmQun5Ke:Dada/Xj^5uu+ln!VeKKq6cK&=jP\Pa
#Xdc1q tRFtYwR#p<?MBD?46lyA/*=AXXNAGL>G>pFXbiYD58#M9MkS!q$cp9KL#lhqbijp$diyAmbj6KARyW5?
d!N>nQ 5@SE/bQ@RLai+b5y$6^aS>hR%dJIJy6HdGmmt5e&pVSV^j%!+k1dlSX5wq/9RKPE*Z%+5RD*X^jhVjew
eT99=\ hZh%>hQ%@9&Hn^@=u?kPpWSQd<1JeSb#euVA6IKpHi:/6Lc$yC#FLQaF*Lw6!BY=i:/N^F/=?WWIGN5k
VX?<6C ei#a$YQHnl?#hVdbdiMjH8bNFl5/8Q1GBhn6*cY=%#pA?A4^66+$WW%bbeDAkY1+hE1F^F+AtM^Ep@*d
c9#Z>G h?/#5#6kcY8?icacK&Mc4DEea+#*CyHFPYb:AcRh&:jV&+b9*dIbW@iaS\VI#Qd8&Y&<p:V:kn@e5e9W
XJ>^Db nMeY5EtX&6Hb&XXIGN+%HBEXHaPZ15dGSphHlIi\K\t^:e!V:$X:n>!?i<<c@ZXGq4atG^dy<Hkka>8&
84/e<d 4X5$T$hu=8L%G>c9*SMKlCqH^uquQ9tQ:RD?RkI\kqkuC6wuESC$u8e#u9**qE%+5K9l@*KHtNn*hAQh
=j5CWM Nwja$ZDhmmZ#b<<p/:1uc/GcLX%6kGN/qu&=^jMpKXhSJ%^/\K4bC?D*EV#BhP9E%4d?GABVYpK<RQW?
Xyu%y/ IX=+i^e8c4=^PiXM\8HQQJEbI!Dp?65ZCpM9>IZ!I4?+E1Bq&E6PKanm%u&K^F*1p<:@u+SSWl^yGu+p
F!W8uF qCuJDF&PqEWjQ=?YAYc&ykuW4KY^64K5IBQXLCmRCyILDQAHe&!:d?iGbZN%P*lq9Dq/1@i+^%+1ct1=
edBpm% u*9%VF!\l=*=41$d%1^ay1?@hQt16YTYc6<BG$e*u@D+e>h8*&>81!=IP*$\\Nq5!:JbtG9pmY+C^P/X
4S5RQJ %qeAa9RDC4/ackF?%VBXhKXp>b&dPYttekP:NYVXqb#!Mt/^m@nyQCcZ!SQJ#:4%PWQlX5G6lMbHn+X=
CS@*aj \#1^c1^Q>ya^yV45lm>!AVkwGqdnKm98><*cCM6tyFZp@Relb<Idenm>XI<ePZ4^\eA1hqiH?Pepd%<Z
P<@GGm F<yXDLMVnlT:C6PG5lG#PlCRnwVh8hDIEqaAlN*<m#B*V<8hb8+lEaEaLNubPZpEl#mb:>w>&NIuGAVD
R&pXt5 **u*9EFK!kMGck^WW!FVynkNAEbSadY%$Xcn@VbY=lcYJt9G1Z+lAwaNY?1c5@bbYJK<+X+$lRdWil4d
<GSTX= yheMZti\$ZDL6l%ItMp8w=$:!MCKIbcd#QaNFSdLTH8It:5H\BZA1li\FSeuPKRRh^B9?ApJ\85pQd&<
Ednm%C 84$bu=E:>8\*YG1\!>4BdNPTthyci9wdh8#a5G#iVJ%bm>edG1#jE^JNS#GSk&N>dknq/#Pd*CDZwyNS
NT<L?= t\>m8Fd5Q?wb<>?$y$<\@eD1%=@=SNa8?4GnNu6*:>l55G4y\ntA%#jiNP&be^dw4%^98H&*&RE:b/?A
X*ee^$ <BmT&aCw/%=%*+$P*:?Rm\YIq*qI6#Q6++G5*!:qh<<@!^a<&WY*5>K9+A&M5b>=uH>S9AV>^VImZ9RA
Ql=H=N ChLCI+XJSI=Wh^>XH=XFXXTHVThanbRnDyHFmyHmAFc5W!SanbBVY\laBWRuJKhq=yhW%DWD?dkBq+&:
nVhm1X \u^>KV<=Z^<+!S\5ht>i9XBQG:Gc4c8QDbC=6i&%^de8uIkJhLjdd:J#!!cD>hnwR@yqLG$h*d#>\?PV
$8KP<8 $uLLG694m/<qHk^$*4h%^Y#6H1S1@lhG@Q9%B\<1K481BA@wK5+DjnZ*RSXhIXqhtyX=P$bhlRlZR5cN
wTAhwp /?t*/A#yLB#KBlHL#9!ewZn4h9dSY4VaJDqaiW?p6Ln\X+ECV4&Z*/><AD#X%hZY$NXnRAmFj4A@Kj@&
pYn5p! QTaLj:QW$>Qd!?e#9R!=Tlh\wn1/QnNjSC@+BdwLQMVe*X\BKYjcThRSRl=eLT6tb?X@k>B$5i+CI/C@
WhBpZC A%F!iWBW>5$$qmnB5aF^Xp+t^4aBEYE?iG?Rnd&Ld+n*kh%Gi#XeApNDk+M>LhiPle>NVYQk\AH!Tm11
h<q4*N !pJHKDX%::/6t<GG:Vjdd:=Dj<ludEBRwXYX%hS=&D6FXwpCT&6YLQ&qQ*nbm6Zk@A!*:nDCFyWh&J?!
R=AMXc bjM&64>nmLC%GCYK%TnECCR1>tDe+TQ<iPpnl?PEIFGAEPXL?j#n/&i$%>J\=WaVY?j>&=dN$6Gi6h#R
=*d4T+ cNjtFR6tIWldDA%Mk1Pn/EmqmBn9NAITPbTIDbV1Fl=F:$Zi9H4i?=S?M9q^P<qk5LeBCj8M$RPTLTLk
5hX\yq AY$6><G=5HHNek#a6d@!iFw/8Fh+4iE&+:*C:PASHBjF@Wtanu@dkj5LTKtNZG#<=QHnS+?+n^:VV<a<
b&IKYL :V5u!YlcF^qNi@*<TX6VLY=!l<@qEq:GGQtF^=$&lAKCBQ$C^XeEqySy5pKSI@?V!^YV/XaAD/kpWQtE
&$?bjA WhcR/iiRwXHIpDR\\=ETEIbwaAtLZT^C/k6M4h$Ca$/paGhtXV$<tLlbtCRDn$WHiuyTZ4KiYAi^*49h
=M5PId RH?P#mekcJd&ApNL@+TdFY*N>&>jP*e$!6@N@wCbmjHP:h6^bM@M\51PVKhHHVq:Jd8$94&^NPMMALS@
u1bYPJ &<1=8IibJ#49C!NXXh^<4\LL^aJKLB+LCEYeK1yC59LP4h#W:awkT*ID=e\!4kt9Y:wy8CYTei6tB!BW
MY5%PL puRSG/LI/G%JeRE*L+jKyLLwdBueu!he^5K9EXTQ\qW<SI8ENc$Qu<m\+w?j9?uyEemT9jS+qu:><1Zu
l*<YB$ K@%F:P8*K@+ljC@GW<RDRu45^ZAG:$e=mn9aB6!+uWeBQ=i1L#E>>A@p=*alZ5>M6kWVjn#hdHj5>aCA
<hBlk* !6ZF!eHG&5E6MNBln:G^qabQcFl\mJ?Dpc/GpyK1Jlk?^V@=pX#taL^y$<:>B<^M>=68%l9+SYqRZ^=\
4y$1%> !KKh8$#&t8:cn9VwL=\:i>a5ina>l=+49YASiG*Tb$96/N$8\VayYk/^64HDqk%Zh\<9Fy<\FCFe^BX@
Y^1aAB >LkkRiE+Z1B>EBAKD9V#>jMV?QQ>S9u9N4jd964R%MHhe8jKPdw/5=ed:6/#djYm8Z1#qll5*d#BJAn+
temDLh aTIWa:^Vu:C##J?@j9?JJp<K4!wtuqpElKn*CjN+<mM5<6a?EN=HL/\m@=ECSBYCd&j>Tu$AXQ5Ld=1Y
hAu!aj 66:eSe6^c=CylVYt@pm?+84N9qZ!iM@>4^<p\RREka&pu$^<<yThNH#%t5*\p4!/5JtjLJ56\QAytX#I
@4!6K> CQ!MWWS?KNImlT1EcmTtDHIQ@IkwTlIbp5Sd:9CLmBFNk1kBa=KAI?=wPbRk\Aa\+5MZJWZTj>Qp%Pib
YQmh$k &4kHH#^%<WdPujL1J6TkY9nLe>M9+MW/yInlm9p4c*Nn\=WL>LR@<Wy=c8#C?PKt>61:YbjQ^Ej+8#9c
4L?:5% YP/u#Icbp>XiiBFBXF#</e8b^VXAYW=KZKCL^jdX<*T/pJ?FZ^u^u&qX%je48mwF+PSE1l+<wK8bB^^Y
1bHhI9 k#K!e5NWXAEjVcYS:ne85h*Icj#4VDwHLJ*T4aKd$jt+@\E>PLcVm1bj8*1XTqP<hl$=!!VZdJcWX$BM
I4B$G% Nw/$G6jZ5=d8/VM&:jiBFK^?W<VuC\VhqJRAaPwln<I*pY5BaRIjeX@lhVc$t!m&XXDP+p:&AhhbkFI4
&ib$b% Wyp8?mhtJjL9wFpRAuTeQ1aSb?G<B^Ww*B9iN%64Y$ijIQj>^n9&8twElIaEBZta4@^HYWqFZXNnwKw<
pkZK5F 8h+WVLt!pw!GwjXYk+$:>=u9Mht*c>*pAi\Pbk*Y$1tQZ:EP=H$#EIV:Q*BNa1<Pw!8DYTH5ZFm@cT8>
c:!Pma VYH:ny$:na!Mh=EbVp94wdd&\5+uVKMHkk4l4ccEwwTVy$:SmRy+Re4S?EQ5+t^@j*=A4@?wQRienhb8
$85pDD &ijpbY&<i9=M*Vp46y1c:Xm4Q&@YdQ&N&:h5MktIm1InlwSH?/RI6>9ApeR/8n+limPKhTVBa?dS=Ij6
4=ktV\ 8CTE#cdu>I&a5jid5Pp@t\PkSX5*4qt&eK+8GJ!y&nQuLq!G1ak>=6aP:n:BpZHHEyM9*<Apip*#+^j9
TR@Z+c 9=LJqT?EyJe9un?uu*Gi$e@HpqwIcZJnW*=p9RGPX#?+l=hy*:mTe9bE@MGIIG#PHcKIN*^Vj!RnGCX&
&?#W1B qc?IHFeEc<JTZjKwSP>Rl+bPS*=ES55V:!atmZJE!*CpBd<lGmE*aM=iY@jk8MVWhNK1Bjcw@5H>EqKT
cV&Vhn mk=$e+DDX<aBq*ibdF8:bLdPS$BIh?a!I<j\yN9Xde$XBVe9JS/JDQTGk<WY/@YPL4kdL\^9e#8VtqH$
pLt^AP wLZ%Rj:qw<G8Fn9ZL6D>lRkbjGYptt:Wp!:LTpEFW$qXWbY1\FEX8TVw@9&1m9!M:E^Z&aFhGww!T+>j
G?^qjS Py><+iLFT/ua%*?F95yN#\Rl8uQ/PAlPeWtS<JBdiCH=HLpj@RL<V4L<Pn8Q4I!9i5C&edI>liDuMCD>
jX\4jp ZbSmRTIeWSTjymkJAWHyb@j**t>mN+Pn@Q\wj#E@Z&<9L<1V<SD#>AB4l:GTjeC%QHB#lXjK4#A@/W/M
\+QYP4 n\wAyp\YyyMaH^*%6dLbciaSGlum/8Jwb&%6=?L9d:6:8=GN6$bIcFC\n>$&LZXqyRGDATa%8Z/aXCTt
<duBT4 :#jd6Nbky>uiZd6M6/<eDV@Lh6M4p/dCkbNBiXc5^llhV+jY=t4^BFy<:eFp*!kyY&#b6t*HV1Nh8$*&
=E/FW9 5I5F4P$t&V9>pWFuTVyMREyMQHQ&LH9QJL^plCpmqA=mk8E4eDbAFSARcGdqbtK\#h#X^<=p:aJbi9NY
:ldjBu dVe#N#ba6tD&HQ&NP:amWyESEiHlWV:uun^:?SyL\BApkdhnF<tnNL$YijHj+>/HVQ6EZHBbm*6EC*+*
ych>we Fl+:\8:C>uB%6LQcV/RJ9ne<1/h1/<=i1L<Kh$L8\:/twQCD8HQuG4F&ni*Q**b<^/d+d?!XSK>j9cSj
\:+ZVW VMSJZFIF\bbSdJ5uw=q+aY5#Zl&A6>&pZWSdF^Zm@=ZHHc?Kc/5+ClRkSjiLE=5^y=SF=DpmPEEtJmMu
!=SLiR %>NQFYjMYSTqj+kwmTJVFCBFTjEJW4IE1hqthy/ll<>e#4lhWkuGn6#&ZaV6FHnS9LWNdT8LPTV#9V5*
PE\5=+ a9+ethLSZ4nbKmDlXqqVi*%b*w$LmjHSwdkk*A*DYV@eCI=EJcjiLCCVtDhPld6bG1%jPLMVpX4?nbH/
ki\e// h4t!/6=>kI1?V%XRqXRFB<BTkFCt+6/>m9LdwE#Hb$N$JDhRj9Q=5@Cyu$Na1E6m1bhVd$B$yJThE*4m
-AKhk: 000bc63b663001202b3 Page 244 of binaries1.zip
Bb=yW* Pt+p#d^JG1^Q##6=HQ5ZVy=KQJPWhB+9?<:I#5MF&cRyHu9GTB5LYan?P/QZTidpi+EuttLwHwclcWwe
LELwKa :*H6/8V@BNj&uj+t>9%SiFRIQ%ATb:J<9L%>KG>SL\BL&6$N@8eWtEbp18B1!XZtl=C5IuJN$cW?5tL&
!^b*b/ 8=n56QGQmQS^^d&CNk:iAe/tP:cb8kXMDR$PCuR%Y#bcTZGAl1dt+LEn?&RKM?nTe&!M%1>c6**Quy*G
IXcw>i Jq8YDFNRALVW?ubcDS\$SRe$ch=55kd:B/+$$tc^Y4q8$?c6&*ec:>/#q#cV\IY=N9aPk@>K+:FMHTNI
Sd=GNl Jb$:V!ZL+X*m&B+cn>eN<WQwaCcICq#596QHbi@GuRjejS**4F5\c>c<%V9MD=l5ZLFw#l#>VV8*d#d^
Qk5JK5 n+\M^+Z#Q1ijQH@=lmRhjuc!CwYL=ZELM@jbp=:&!Y&6Le&admDZEGi\i$8F:aJ+>#KtG%CiNwA<#hHX
DcIyiP ?5TdkyETbl6&:Da:RQ1Ya5lmHY#:1YV9DCL>:aTuh&@jWK?b%<\d=m*#j9RH$kqKj9q:*%4Gm6Km&^m:
:+Fd9j k5p:ElMi/Q&NJ#q6ME+DKTwITD/QI8LEWcbAuMVWl1l\kTW8S+!YA=MHZ%\F?F*9qdpDJ=*qjiGJVqGZ
*>dYRR k8CIqtKpBVKWXC@<E&Fy8J!K*n=:d$\IbPI&P%TuKwnPWJ&mA6!5LckDnIYWPeT*t>e5u1Z>AWuTt4QP
5JY$RN #DQ8ekFwV@Zh*P5ZVl?Nm\wLDwT#LDk5Im4&$NGVb=I9yh*M9>ja*qCctSV4ddZLaItiFmFy%VhG4PNT
hDiD5S ?:%:>H%PBj>?N<kV^En5yc6XJbpbPVtHJ\:1%qDRqB@4ilb9?eHd$5<u$!qmF!/tZM9<p1GetZ@YN!pb
YHb+%a F<1u+u\XlK/#w!NICE&in%N+w:V\Xnq&pL!9:jab8a@n$^<JP<RIKjwJFDGWGLpNth?J1>Ky:&JQa!AM
4#M4*t y+LFkkID@Q$wZ<aQQS@IqMBV#CZwCw9R6V6yAF\jRtAq4q+CC$MRmnJ#&4uHQVR!%A&$!e4T%5ZQ=+DS
M<9$dd %l&YQ5HVRkPD9G&&#FBVXFVSHKV=##1ikl\kyEIRp6decLX6>jI%&*d9&t=p9HHiEHq=SWZeKTACDNED
6YeDHe GHYSj*lc6LawE9Tb*R/4N&@^m4Wd!dwLW>yMm4k:NHiD*V#?VDDE+hc/W/jQ+m:^C?V!Z!bF?u#TYTRw
CXyiqV LmbTEM/EmacGBIM$@SQ5ciV9cd:F&M4L**u9?pX#b!>aa&^qa&1+c9He8j1dnHb5*iMZFWGHKaTE?==+
l#\QIe !yb*9wLNw*6p8ny@CDZy8inVS&&6XB68Qb@RnQ5:!PX#@:Q5=P*8+tB4cT/WyZq/&l>=W!Fkkt>yuiG&
E9uYIp ZZ$bB%!R<+jQ?@\h8+!?++:lD?@j9cQje6??w>:@!%L$FhN%ZV?@jH#>@FFLR\*GciVT1KTVS?MmR@\>
cuZ/$$ kcMyckRnBW#eMjDFF!wTeDS$$Tm8TDhZp5PXpyYXp=Qu!\FHqNIujQ>Hu\GRJKeMBEYTAb<u^bHt!=C5
c#LHR: uR#Vl>MIPXZh@Xl@Vd/iW*T@61Y>9du/QylMXKbRd\h#M#N/u\\8cVZcb4B5:p!6D:\T*wCb!+&eIyI!
c*>EFC T?9dt!8L5/>jQH9!/KGDXQVkk+jmn=LuPT$><*ab@P4>*I9^kjatt=dP$9/JMC*/#5n<8y6ZY*aQlPui
nQ@L>! 9h::DIkVW<G9qEieKpy#M#MKd=Y8$1R%PJy<DVZ=ibEJwDn+FMBnkQe!JChh!RKp59MCk<nhCWtJ8MR<
64E@eZ LNlj#>id=HmF6*Rm#?qbiAqYFdt>khVSu#\q6@B?:Qk4aAKkPQRZSkK5u1C*y+9/Jinp@BV<WH>?KCaK
R*T!DA m$JliA6<aABAFalk$d+ed<yH#D*wMp9Wnj^4VA@?6@R9yK1\8DA*+\a:n*V<&NE+b<6>Syb\k98CLqpj
+P:e*T 5LL*<HM!&d4X^Np9bFJ\WICL1j+ISRWX#eGDB8up4FCRW\T1qIA1biq^8<\NX!=h9Zuu#m*d6^9wDcIX
LqkBSp PI1@mPtVbKi*Bp%=^S8EF#*PkRln+?d6=E+GdJIAi\j8#u&Ty#iLEpp&\J6%AtRI@DC=NQ5KGPjL1be8
%Y8K%W yJ\:m\%*ehFWJLbReMNCBeGL9ZaF?S:a95jPL<l%*+dFe?e5NDC%5Vjj8pb@*4!ql48M68@^RV&CN<du
!#:Gk4 GN6DS@\h$cQ9Rn%/^u*T*66CN$>wc1nFy59C&>pbN@=a<!c5LyFbbcJH5*Zk!bwC+hKm=Y5&ah+BY+/C
Ell+A6 w?KPJ=:@\>=>?91#G/\+e6SBytc=:#@RH<h<a1@??5d&1Z>/??IJ8SPF\H9%$4uElMMwS&:jiiLVS!5D
TDaqJC TLRC>d@$TF^q$qphBAuNuc^5n^^Hum89\HKpMaX\NFXD?k?PPETccCCJp8LI>5wQXhc^eQcQQuElQi<8
ZdubGl P4#Y?p15ccE1?d6c:?GdTPFP4W&4F8yy9\iGiMVhHd?TZ>He*qlSqHMD4\YBJ?da<SPJy<?ia/>eLC!4
A4MY@F dY86Kpk:Ei=1b4lmn5+QbEn9P!Q&Ic&>4L\LJEpC8RGQJ/lWkH<1L/<w!e:I!W9y9n\IESJw1K844D/M
p*HYAY P>GP+J<MX8VW1hNuEqPSwd\4XtBW\1MP^8GCT:#AaLc>4S%i$8SN:y5=uHAYn:C<P<KqdcR?@wVh<9jy
=+MP!8 <%?SEpZS>ChGHCnk>@aI8yljhKjky>m4w\hnI?l\man\MM^X<!GCEEFqAq*!DE+q>PVj#L*P>NK><AeI
5J6Z!* /eH8>C9aXaQ$SFm+:nS^DwpMe*h&54M<aP*p=Zqk=?b6B#!DRynAKX=Yt/c1Km1yDl+<cPTi:<tK9?tS
?DP<:a t::Z%GDy+tWd6&$%*Lyq4hbAiZpFwEhG/P9WB/1QiMF8YXm+dC&:mw*6Qdel*:@ZIB@@@9\CSEWuE@ET
XblVE< VE#hyKXhw/:LZ<P6!JhT#4Mnl+JweRl++H8pR9:^NRu#6>yy/lAa+4F@+=J=e^h6*G9ubLF>*hIF<=h6
yh>@NN Nndi95e:Mn!WDlpe/u9+9?hpBTF4=dw/lXeE9Z:?qQ8wDi><t6DaRDbh+=ZCj*Tm@<+$tJ9&T>B:*tS6
@>tn4b PAiYCnMNn8+?RSERGTXh9Nyu=X/>:$C#%wYdV\Ei/lQ#mi4+q%D#A:DBpPn>1@@ct@Cc<MI<e6@c&SQ^
#Rh?4P ebHB@y:P*$FCNFTI@tCcD4uy:hej<aEdG1QR!ItK!<nIWuIe?EJ\FDqKHeyeqiGuTd?iJm&N=GC&AZ+Z
cTCK/V LTPClTTIpkVTHLqi?YHKYya8kReVW#QA$DYnA6$4#5??ARwW+tY@#&kubTT%e<i&Lb9Y/5@SjRj5#NCc
:&AHb# 9e:MI#dybuF%c%6>SXH8LZBY!iiT!N%\1Xj^awPC8@jk%&1Ld=/N<ddc6uKi:uhEb?5QS1K*wKCt4K!e
h@SlT& 95eyF>\VLRh+/H9MjZ+F>@+>8q#/juFYS5G%@=m4SIIwDWXN8euPiF$>PWNBm?kE5SMun!Xuj<?kM=Z#
CPbp?T +m*A64l:?iF?IV9e@nB#:=/>=ldYhw+8Hn+BwhH^y<=hI5hZbVZyiTDdwZCDPnp$j@bHS9D<9&NEcW4A
iDu$!! y*1ad1cLA\SSQ<XiJ<V>j\l:C:A18?Z@t?+YJXX5CcqN11na1Nmw1Fl$TaqKq/CIwImFm6IKmHTZhCkk
%#1T/6 $mb&kEHH*9h>9:QYB8Ye<@6j:@W<uIMQt!*M9V+#*%q4%5!XT$RIYq?AECPIp^tKCH>PQ/@#!eXMkuJc
HjAkXa 1B@ECMWk^?BhSmpYay\AlR=cHhGEC+^Rnh16t^GPVyck=pI8?WIw54P&eVn4:ZJ5@@=nL4=B@1wBj1iP
W4Hpnw 4bp4ImR8K!56w>M/>pBEWAlN^AYc?Gb9QYK!jh&cDd9&G?*ib:SFhcaATL^SmEY<p^$%JCRY91hJ+4EM
DiZ&^E P+\PMu6nw<J!5A$wPl>y9:<:DCkdA8j&aHLaQJ1%I=Tb\b#8P*tLu4#CjVp5NQRTEEYeZ?B4Fl^+<ynF
1NB4h9 1jMZQK#*dFm>c4&S%cuVNwh*G?m9Nnl\>MllM<@kC&RRFTn6e\XNVMBZephRKBymnk/CWQTG6d8D^AMH
A/A<Ed FF?$wQw8XE&Wq+XmhDSV%X*A<<qB%XtbHV65nHd9XtyyjEjyEby*lBy?tN5/V1bH$j>p*j599d@SqWTA
?K/^$I F=n1/!N:FZ9:WC#/^h!SHSphGpAd+K</Y6Bw<PL<4LTWSCSaRwMD9N%eBtt5/k9R*TkTy$hI%p&kTqjG
Ni*a>P DB+^WVGF6M+\X4b^Xl+YNl=AByRh!W<BZc\CW&#NYIDaEqCSSp^N5pZ\p:^5<Aqnpm^bWb1>Y&BE>KQe
8did\m 564uuh%hLR%wXtI!mptu:a/VB!ln*kQ:>^u6&t/\Yqj#G/&Cy1c>!eRq/GbTRZXLF/BXZyTdtjawJSp<
NW$@4? H^yiuw8dC#c&hn/9#p8+F8B<jQ5cHR%M%5bBm9QZ+/cc18wSRI81wYyb/ln%XJ%kVZX%ZYX8bq=l\mlS
k9iHX+ NR<%mCaqb$pJKn4mqBcyjLTFi?*cnana*Q=5KwjKE:FFW5dc#lG=8PPwD/Z/@u*Gl+?iRL%LVu9+BX?=
%+bbu5 Fb&I=yjnwe6V>^Muhh*kFFJI%H&tPBBTE+^^64FS!JMEZ$de8kJ4K!\5FHq5+kIb#IHXHZGPI<A9QKPa
d%?WTb WeBYqJQXRu$mCPByBKIcRW$Rk<R9/mQ^k=I9i%L<>&\Y<mW4=!QHVkXiC9a+:iJka&Z4:P=tjZDQjm9*
a%Syk# kEB@FZ<Q8>*KM+SFb<4K!5nw>\/ZTR5Kma1LI=:+b&<!Q4l6#c1%lpc:h?:h5*tb8ICkEMKJD\eu<bpT
mpn:!A E4K1VJ:$DZahMDGhdCmDM1T#IPwCyAI^VbQbEcLyEY4wlRyGmD\SNGAEkE4B!j?6/%i9p8FKABV\lC#8
^SPSc+ dl$i=GB1e@dmJW?d9S9$%&#ed*9G@iVS9h9Y/l5aH#>&%Md9Ilp$P@DePb>LQZm9aXLcwVPqZ*$+Q4%m
S?qbnE :&y4cTFipC*!#>GaqEytlH1I^h&%9/hKnudYiF#qVwMN1>DcY1clyd6/@iahi<FBYD8/i1BVyX9MKbD+
nAK>e4 ZQahlKk@pAmNn\+P@Qu>G&#?m@m>mKuWS!F8wauk4:yceVEF@99m:/MAFiVuihyypMcyIwQ8ACNq>#<S
qZ6jNH Tp!%9DYSh+!XDXAm?ed=YRSaBRSBV+P&a=XT^SA6t@pjEPFQecnm=!N+YjqRnBJShjAM9l/dXqDS<AJC
@kiZat XFQNp+L5%ARIWS=P=wh&:!H*<8#b9Y8uweHc=XyjAcRb/F#YP#V1eWqhK*CH?e<q5/X!<9ILmqAu*Lyu
eYVPll Li&hL&wKp&>hPG6y6B:hXkTPDICnV&uhFbZXbA%LNXFDXXM%LLWEjE#W5hTT%j\%bdubSaYbFDYkl!Wi
JMH56P Kep8MWQuLBuAk!1lL$Kp8p^iad<cik>HKLH<*BP:h8<FjI+hPdmj&jmP&1KPi#<j6:B%hQW<F*4>ZkJ1
cmS\p4 yX#j%N4^>*\YQ*qWtIq*HJC<?$Dl@Rd/^ATJcYIM5#YF*/hj+dtMaRwJ8WmGeCAXFERFeRFVAVh!TlFP
tpC+MC 8Yp6%AiCBZAcJ6lIBtPE?EGMWV$kRPTuu#Vh9BFw+ZVR$nQ+W5BbX&e:!GJPidkeMVI/+8\V/P?9+8N/
R:4byF ZH?P5NAM&hp!5w58Da#$cR5Jme!aCVmJCm$&*L69!/wX1:d5*tt+e?etyStA$^nPqHmt?6LQ:tHm6HZ9
^lFDDd wiQM\/TVPEjCe*&qklFM1JpyG5@<MQuS++^MZH6XWEkWTSYm%8GbcEbVa8#>P#i9Z:<YeVZ<C8KJCF:u
9G^c!1 /u#49JQqTjjLah/&?#c9Y:QS&N:N!@Ha98*4%t+=cH4mtMP=+KAkCNn?Z5HMm^CRwwDcG^pcaE+dk8DW
-AjSTF 00022ec4705001202b3 Page 245 of binaries1.zip
FR+1GA #hd?+nt>SjF=e^MiqXJcCKHyEaTt8=E*$IS9XCiEln6aRtk/5Ged*4u:TqQT%NXdB=pTiAe4!JS<#wYA
lD*IB> *I6PTEuQLc/wdYy@<@+#/D&$1#CC4kIRj/k@FB/1^#w$VI:PRS$491L^h&lAQXJ:n>Fpt%8RJb*#eZN%
nN\wdy GKS^LJNE+:^^ZCI^VDk8<WFep4KycGqc^IaGiLMnSElRe!R@E!nlQqEYtTm$h/ek^kiyERiGmMHQAlBB
pC/5<H w5SQ<bFVMCp:iX?KVMk5Su19/$XDbZFP?5Q:%!<^m<T*p#6+6l5cd6t<Zp>H<!86uKc<jN5J%<B4<Xqq
Bdh\Q# DY*hEE%4K!8iqJckYT<XXYkIeE6db&h4jWuc9XA9?<NdXtn?RTkbDqF5j%Jd!WyGNZ6XhXWXCTmS%c\%
ID/l51 6a\/1yaQ+qJNbX=tduHcG=Lm#F<mlRd^T5+Tq>:t/iZynZclk5/jS#!FlF/<p#iaVRBLCh9%%/:jcLB6
>>HX!l y?GYVcm4!PyXc16RN?ihi+&QtNp+u9Y:iC$KYC1yRtnn:Rbt59TdGbcaJL%DRaqkMEk/=\T8G!PGPXwm
FaP$w^ wmMmmK95+Xe8l=Gl%CW!qPQTSaCJ=<L=C^jPB>:ILkGWC9MjhXGDSD<hhB/DwBNILDItCJI?R9<I@*YR
RQVhwy GKCw5mYF@</dLqt:HV:1hC:$w1i4m/PNydZD/VNYB@d55*V#Q?j4y?Jl6$h%lyCw^G^bGXuql9:l<e#b
:9>i&1 pEDNFBMYESLV&Lq>q+Gi68+GR<P6l65*KM*kF\Cp8ETb8?LpLE1TSR+n6Z!>+aGn1FW<<>a8GqZ1F*kl
!tCD9m SDKWCXR$t1PbDMEyC+$mLaIuSySJq=aWF?ISGI<j+aFK6&:hAKkRW!HE^ZXuZP+EP>p+?%/>:G&**&Dh
@9YKV+ YwNDDl=in5j*:%m@h18J1itJp\HBkYkj^5@:HE/kRP>N^Th<nR#mW!h4Y<6E5\K/bF6jk/1G59E8J*PY
A#Gk4P \\XWPI/GPXmcH#>!eN@PLS6A?Z!lLWbdD^8*:V=\?ITq4hMb#+ALahem:<Wl<j/p?tq4=&5$N9Z*INDD
D=yMPT Pn^EDLL$w!F:4IND^QDewj/jjh<?9u9b*9!$8tIT*#kWt!/h>@e//&I@SPNWqWcnlWmlEiByauLLAXYL
I:1hE4 e<?=Z64ajXMIcIL$mbh*qI?XH+PEW1e=tCVF@!EJKJyGp4CTK&1TqFNY%>LX*hFWW=cjpS\ZCXHJ$h^+
E6/Q*P 8+EB5aZLaQPGhc6%6Rbw\?1E?t9cwQwada:&lwN&H5G*H8R<1Z@S&htGPk4Z%qVZ%NdZN/Dy\GRHj&6D
<K&amW cZb<SICL/T=>:h>a+R%SuK<jh=SZAElpFR6<VFT#%E#W56dAy%\qPhtFldpVJCXb6\!lBQ?KLDl&BnWF
Hj/Hae R96R@kHuk5n#:MGBN@KGAKWb8juuhDT%6NHNcd*q8n4cYq1ctm4wu5^chFy?^N#P%j6CSFSmYq=bdjMp
8jh1=I T8n1IHP4CX\wJ8p%^aIEGwPm5/PmIeaIS<@%&P9Z!AlP=KM9Z=+I++DRFHKS8Ml^IilGFwRn>5KCbQm&
%4I46M WYKEQnE?VGeBlkaBwqH/d@wAMa#@&!k^DJGyhGyu@Qc6G*+&y\/c8\iHB1FGJ=cY%p=uuW*&:Du5+H$P
*\wm#A F1GK/:F%<$TEb<nMpb&6ePZLu/G^mkYRPauQEBZqq%y9cLDNaIYG%l1DLb8*dFt9LM+9IDmPJ+K!aa#a
a8LuL4 JTTqqtKP>Dd6Pt^1#6!:e*E>\##j8*Sb=?y%%H<$dqLmbiimmVhq/E=tbXWXc9!Nbw4p+luCpM9e8S$J
5X!i*N KAFJpK?TIi6<HcNCuP^QB%!:+t6@aP9G>X8QPHq+Py+\*4q^9iE^e#NVi:@ke+kpH&>@YN!>TPqN^mde
u@4=Ml &\QFyudYF$%nnjJQG/4^5ZytY5wDbu$+cndw++=#Zk5WtQb8*:\YAyQ/D^1y9uR!dhy@?BkwDBD5=!>h
eiW56i 9ZpuPn+=Dh%^jh:?<8&HL@AkB+jSIjpRPek^PDR$MMAauDe$&Q?4>!8RlD*<Z&/ndq&:jDHRF%$HH1J^
8%Bwq6 KM=EN*EuTWITn=\lkF4\TB>JLG#wVJ#BSkih^<4F+J*ka?Gu?EqBFmGWK!*BMCuQ@AeVub<N:iWBVHR?
XJyTFH qC4NFyI@E*k%P4Yk+tpdCppXSYnW:@WRCEqH>^15b&#kY4>PZ&?=65a+:bj/CQ!tu>Wytynt16&t#4=l
nt>T%b h=Q#u6SBl6@S>8I=&eVX*QICFSkRdRLQG<y#Et?iQ&6%aLP8B8bIe=nmHC>w4m!9JK5aqWRXBjm\X6jR
A5b1a5 c@q41m541<9#5*ILW>5Jm1N@M%BETM$TuYPE:&Cj^wiL*4:?Aj:u@K:tD&e#e6l!</*@cJKcCmC6$hTP
Ia5qm@ +%bPZ8en:n*MRCK%A<@a@jD=C@cTwPZGJ^A%*WANkR=kadtQEcM#B@P9SeG!8Z:nBqQcwPq&+XiIMBcI
TtuqiH R%#AV@DN#BJEVqET+!$%S6Dy*<el?E\M$MpJ?MQ++QkQ?C<V>HFmFLn=6*6*M<LB</mJ9h?qT>=uVnuc
JJ6K*y tF9cunyn8Y@ZZ9M#j8h<jD%W:I#Wb\1K#yw>Y*d&51Ij9\dHi9YFBWWkR^IXtKY*beMtA%%%&9KNt#h5
E5BVP% &L^8&W#kB4YMbBYdRayD>JFkqbJ=B>lw4>q1hN#eEqHnjP4$YZe99+Ck+NA4ESI*d$hFI!tZCqIPIp<^
T@Ab5^ tkFcXa&/BWmDt$Q#ChBEtI#H!iCw:$Zh9S&J=pbeJpQqL+Ye>L>>!eZSI@ntXV>:a<QNG\&QPZ6=Pywc
Y=984+ :>!$aciyydubTh@#==nHAJL9tKZYI<#\<?9un<u\$<d/9BFX>%QQ1KhLct6\k>#5hL\Ne^9Xjy>ucny$
hewCTG mHVM^HkjtlT:ZHNCjaBGX%ipcWKTbIAunFp:+H&<5IldKA=BqqV#:EWH\IPKqND#HGaMnk<8RJPM?u1@
5+EA/G ju4*11P%1d/!FE%6R*jK:6&?ES=/AZWEhdRhyuG1#^MYbpaka4K<kepPmpI<Mtjm<&4du!:D:LB^+85T
ILpDST /ITID$IME!AY!d8$Q#S&>aWC9ARjmWMR6\ApS!lHa9A#MEB#lJciDd+Su%=e*h!JIqFy:8QE/F6Zkn\l
cnX#VH Elt8Zd&G$Phe5&4qel%NP1%Z9S>?*Zj1\nydDq1hCdl!L#tu6Ab%q^%8E&=>AZH$TY=T=CY9p<h&4NIp
8ZGcE= %ZFm6H!a+9tX*qKBjh<+5ENX5qbXV>V\A#SXqaXbPjqF<d$Mmn%TYW1TqJKWEF>\\NdG:mT?i*$GF+%=
+<1J9c iZ5Fy?YMb6MBt<\Vj#Rbtw8BGpMnE*NH#@QZwyP#T/1dy8cEw8wFqQ@kTEN&VNW5$PFSp/Q5@TtSh^t*
*EkH$a iJG*BYamIMYPwMLbRL5SKPLe#m/tk%yLuHlHnaNGa+#@HEYhJCet?5iyCba^^nlnhGkWlbwJ@BX+W&KC
C1bPp& pm<6!j6:F#DE?9Vl+/:uL\i:8#4dY=qduZS%P4^:y:G6J?4K+Ky16tplcDVy8dNu#>*c<l&X9F^hJCCE
Bc8\JA yJ8A%PyNc>h8$qXX$X!#j8*cDY6XJQn=BHDdK\:eqwYe^RE^S$wY$cP:j5elM\9IljCi6+eZyEIZR<P9
mQ=$lL *>K?!&RH^b9<klJtMZ\><\atLl/y4mk9bh=uTEykXnSE*4l&>Rww%@WZdeJ9l=+>=S%/P<LQ@8D&#b6&
bpu@qW uHD%>uA\P:VdaNN8M!6LC<AH$mE@Z^>94:hj<RRiqQEQ+h9K8L%6h*5Li>QVlkdmKhY\FPDBN=Q\^cT:
@REBGM 8L<jd5TCCwQ\:5L?9ZlI8eauhTWNubWkH9akAYjujNwVwp:+nh9wEBcN@Y=1:Z#%DyHD4JaeIQ9y@a9?
5*+HuB @Q:%1?@Hh>#&F6>A\9Zq!SBK:/KRE+RdChwM$#lWbk6Q^b#@bwh9l1L@@c!1>5:V+t\V4K!e*CVQGC<L
mV8iHF H!qACdKI@AJ8$tkMnWHEnywe:!R:pAkJ5KM>BuKTuZHB&a9eRt<@!Aa%%6*h&qBStJEWe#9mw6>yt!P:
V5Nuc4 N?t6YEG5=Fm^HHYdwZ%Zj/I8y1t@/=k>4mdC\+/dY%yd!BhEm<l#ZPSdqJMThhuQ^h^wk</EPn=%NS!l
WyHtX< iMm&>Ga$J1J!wwK5bKpmK1q1Sk$@9wL?JC<4y:C\dIKca#WdhJ8W^E!FR?dMVciVV5:I5/Ldb%+SiiQb
9y>?CR +#q5ihHd@tnTNSim#ctDbw/i\VhmW@PRnJ!cAIZ*nJBGk&DVmmWcB\NXhbNnuIM=6?@jnmS8e$ji8wum
C*A#+Z #VZ!P6J1EHZIK^#laiFJ^SNA#wQS>>REAWEGakw^#AJCkR//t&%pDNkdH1hG!VHGKGPabbk?NDEMLI&n
NBHIuR Q\$PMwdl%SCckDtkmdt#kLywZ9i$5V6p/SX!PeAN^THWMMS&:+=h^%^<A*^<QE+1GY6LCwqJ#J+#i</T
c&dQ^P Y^??@i\jHS<?KmawPqNeYGn&&p&4>jS%qBXXX1!FV@VXyWq?FpET:!&\#lAub=ITHJJT$nKRC$qycK*e
llBLk! 9Qj+Z=\<9XEihBu$Y=SEVAJ#JG%iRSEcKF>Vn*5cNn<uY>a?d&=<%qBZZXYPG\/B*EtIn+*BJWJw9uqa
&/we!e &KYVX/QC*M@+S>!>:k<<GY#idZHc%<QS:QD8LX9&t$NP=*/iDJmDeQI??\1NbpRcDpinQ6RbEWin=!!N
4dNnaH E@XW:XLEWtpBT9alP1A^65CT9=jHGV^8/<TSR\j&:61/ETISDeEEEk/QK5eNX6^<#kYHlh?<m!>SQKqG
1^w*!w NL%EJ:>jj@#wR@9iQ%q//V<Ywk1lV^@i9Zub<cISQHkS5*ImQlwm$XW$PhpVheahy4E1#CCFCcHS!WCE
^lwiGe c8\RTwRw@/!>F??pq:h&Qh*A\ebkbWj6HWmieX=YZn=CkEZwN$1J5ttW^1ktm<aInpd#?aAwkyjpJ\Wa
EkM>wW wPeIRGqMWH1&Y@m>qQ!1^w:8#8ccpy#W8L9ZR\M>uCAI/a@yetl4chAkE^yRG%j:wQ=LdWJhqLbm$#=V
NiS+=e S$@IN=I!<w1jXFZZp9W5hWTNTBX#b#QyZunkGhR>RGNMHbi4&w=RuBNq#<4Luw^WAEeXLFZ$c11K4/K<
BWyZA! 5l#mWG=Bcm8kqK$qk%CcJd@9/JFnJ$#NLT%^NHI?he4%6K6Q@pV&GEJyH$Jy9ydill*Gyw=iIbEJGaXX
wqV9Ck nYmRSM@WGhH\CJb6##FI4Pl<mGQ5V%#$jjyhV1V*d>+pd*DjbG1*1!#l=FZ&!>eiQ\GKKk4G*%N$XME/
Ii<9+$ VtKKTFDbDJDeHEMnI<QDk/M5\?RIG/kIawkeGB%ARy\aHwBZMkbH\V$T<CeT<\RpW9Iqj:eXdq%%en>m
Lb6=@D +uA8NMRdJI!q1aY65<PSuh8NLM?mVPK$ya:lWnFlMcu=\NQTnQhj?@yH^wiVq\qBiBIXpqt%acZ8C6%q
DLdWR8 <kwciuw4X1*TuIN&YQGaGalP^E\YCXKTZWycG9Pp4Y>+$M#KB8GEDyH<$Eq%^M$:>?NtQbkc<D\=udT^
L</qCt 8cYq6c&NcDh4c&%B*bN4J>MX<PYJCZHAE=w!G*:q<8WR8/l:wb=i=&@h9\a+:h^m5Nj/nK?Zp:uJ:1&G
tJTQ5! B/%54G\>k@*>A^BPAhE>?I+1mp/wRQ5H881Aw%MVT\MJRyKCS:/www^JdV\pSSGRFAYlRbGuICt!ND%&
kuMpji &HnjdpPD6c6$cISc4#1lB6J8?c4%8A8E1bYh$^uIm$LCImL9^!iq=^bX%D=6j6HS@Sym%BhW1py<a@qG
YJQmpJ jKE?W=@tj*#j<@aXakyhRe4Q#tCYWh!=mja!A6DkX*94EZTTSGCw<DS\kGw1RlEky+<G*Wy>$6L>#F?T
I8JHhI qa%kbYQnRuMMWP$CjHD^<9ELCQALILyt=>FaNElNAY*h=T6Z4X:NdGA^mtPZDIyhTBE!yyP&K?B/dFy^
-A+m6+ 000276d524c001202b3 Page 246 of binaries1.zip
T$dA9J dW6Zh%5D8tIShTM<&NeXa6dGFcR&wePJ/9yy6FH%*&4DaIJQc1T/9Nb1\+MY#q+Z46=NRAPqmw6L!$yL
NVFql\ mw1Km+wK<MbJ%NZ#HmiQ:%/u4Vcmn1<u*SmlPH+@dmw6I<8yJ@S!1wK4Ek$:\66=wAH=RSBYFIF9LZu\
4%SZdG t/SV:AMim/SITaqb<:ajPGB</QAS=qByCGTwP?4bQI^h:6&Nj#RuNPX$%^piMHQ!Ca6K!m/6i>H=e9It
Lt9Ad1 #S><=AHRpW&+yAGCF#E8@D$1BSbT%D*+8HQ:htRp+^duVTV@4lHZ&MP9Q!1nF:Du%^SQjJ^pD1LWMB5p
DHF>C4 68RA<Yj5F?MQCaTlSHh\pD=MneLHID6<n4@M<t95F\E9IAeHMa\M=nj$p/nWhbVECFKA+N<6mb8Z4F\P
pb1S@C HV<VHHdi\>ZJ%6#W\5:F%5l\?/GVu9:iZl=PJt6Y!\1J#yw4N*jPkpPNQX>/?+jHl#<:Tk1Imw5L#>Jc
TaWY=V 5$JLc:u!+5ZKP59lPY9P+?jl=b<ppDpnGY&ET4QMA\a%hVj5PYcBS*IDk4+B1PV+&1&:$RpQ^S?qMWi5
1H4R1m X?BYGikCGP=b!QKT:Dd6^JPKWdic!h1FyAiI\n8SENRk8##9?CD/p4j9yh9S%@%5D?:c8tYj4b5jJAqH
I4IeS: >t#dehRGSL9:?RDMwFhk*Q99#GE/p!GN&a\YR6w#6441c4JG5d1114K!w4TwAMJ>epIMKm//DBTmaqju
nSDYb> p&l4Ap>C&LbBj+W&dX^6WH%eVX/hy1P*h6M&NB#M#MdB^h$4AF*88SPV<Ck#9:T<y1Gyyd$dqpLQ?\@p
SF/$mY S:bQH#?!j@#\+V*b5@Ah9t/Ll4p&XKP?A8Bh<BHd:b8R$kZ=w+putESXtZ<p5p!T!N#6E^JZ6A&+uqV!
9cp$&X 9Q6b^na?NtCSBR@9tiABiedH!wSR4kAQepR:aX8*:>1>h<<8\$%4WG8LeVRGRXYCnnFp\bWYJB@B#\by
EYe8eP &CTP?!=EJta>ih4PnH9JMdjCR\LeIjuc6pcH%CTbN\QG%IjW^qXbXAjAGEN1I/1WGw91tJwwVYj>VlP4
q@&K*M W%:u4>\C!j\+QTPL#J!SpbtSuw+*cY>j9iDqbLdjaDtNwVctnt?#*^tFJLA#5^yQRu4!bKKeyaI5b*<C
!V1WHW !SlbKan*yy/Wq?bt=?VuF+>SdP?MbAnJYRyd$G?$d@?BR!bHWWlEC6QY8aAJbakckuK8n4/l5jpy@/5^
14Xl=d 1jpXEAuj9Q8d:+:mZP#bbJuSBDuP@n5tJZ:m99C>8?nmV!TmE8Llni55%<pd:BGVVNaXnH<CJpuMJDZM
yK=!l8 QVk$MQDu#/>jbN@RD:KQ@MZ^=*h@Q>A*M5kC:FH>HL?bZ/X?nPG9p@C%Mj\%?P#9h%G@1Z=1pIIRCVpi
5B?^!l uW+wWCZwhJ@bDend*8KRqe?qMQ?#y^!6VW$6HS!Q:>1&/@kyd^<94:QYi^c4mk8JTm&Rt#6*ainLu5?>
@eqtMe j%D*u&aDCJHmanL1855%%DTWF<%jwp=1miqwLlKGFF6pGy&pFCZNJm8#DQDW$661dG+NGl$hC@8hC$IZ
XLip#y AmKnalKTWthtRDyeA6G^D1Vte?d55hh9*lB91Ve!4>B%&mcIpnYRY8Xuw=QmB/kMEPX\bQn/EMiHeTE?
9BFSQ\ =<L9SX@#6V&$b>8&A@d8@l/PFpj*d6>6ctiQ/jV*S*RGSZ@w^d%lJ!QpN&dHYuRSqK8t1kwNMCA4q/JW
^:ihK= MShM<#D8@8$dECI9AJ^uWjtTqhq^jCSy8Hu>Kl$NNhZQck11cnV6FY6Rdd$^cq#4iN4D=>!FT%h9*aq>
dhcAwS ?BmX>NR$QH8PDmqj9ZyN9KFi5d!ciLpAnc^@$hVaWFNXXyRQETVqIc+nRVYNF<:=Me?lkWwFEXKaXWmR
*KEyp& FBwD*aqKL1lyIXJIdQXJ*/5Qmy8/G\9DFhuaTFaYNyKVlDDJ\ePN&9j^5KP#aMBVjFp^HwTqw:jBeK@^
%WY:HH $SNwk1iq?VFn%ASVW&MCEPXRp?duSYhmIE8bnKK/DRw#Pm+wK:R*JCw=9:1bGVLVE8=ElAb=8>we*d%l
GVNyeX lScN%KA$KR&KNk=?cpB%DE#!VbYlJ1!^a6Piw>cuQM@ljhT+BDKSNTGPVBCJS^6K%<ICQX&5D8*R%%JV
^anmlu yRPe8BXb!mnFVY?wK!$yK*5!WWa?aTpuuyCR>=EXcJRTN<VLuMLpStKMpp*SpJGWpNLb8HHL68$:h8=G
ED6<Id jj&Q+I+qqqbYn^ub\#t5q#GZ5$GPGX8hCd1bpFFT?/L4%X6<?NLQ^JIkGmkBb1TeGB>:FbtWRI@lSDiI
aILTSy :6+q:uDh9e*W1de+dq/@taKldMkb?+!lyDCW@IPa!d/?H#??j!i@nZ$l9=Hj1S?ejd&wtId<A@L$D@YL
9kBbI& =@jQu%M9tjlCjpW9wVClhM\tBe!T*<t9a=>S@SQ/t5DQ*\D*IG1^DD1PAQelZ=R*%c+m+9RbyGM9Z@IC
<6eXSk CYX^\5#c$Z/@+XanK#hjL$<Q=?MdX5\ZFlYZuT<*X$+qwjQh=^<a$=>*q1BN!pY1cq41!=cyLJw:V+FG
@pt\#P W>jRqBju+iWS?W>KKXqYGiZ*NGpNujY:nquaIE#hy#bbd6?Li=CTqmYP41SXM8eT6/K>y#iwl#*nw#q8
y*^!@J *NjX*9IeDdT4REi$/ctQkNQJ\YSZ\*$>ptJD@IN9^5be<:W:9Gid+YEHD+#y9y%Gqw+u:i#Pu9j*<$Ya
Pun!P6 u4@:phq5BeXR*BPPPV:l?dM/>m4I@wpK1u^^/YV/GS>>=?dX!&l#j&1H<nkplpc:61MPFX41hNYjcuSX
S^Hc1q bZXN*XZ4N&@j6S>C1QXJ=:Pi9wHBaXen:<Yle6FTNPT*<Zq4c*6uS%hHb$hHJ%6:Y#9bS4W8\J%9G&14
<nFpht <C?WqyKM!+@Shc@LF>GIhV#+iST$:BITNC\LllZXS^ERSbpubwTw&M^NNq=ZEwwc8^5LEw?J54G^54IV
6JGDh6 iDAJK^e*^e&Jh9b=Sj+A1e1qNEyVYt8=@qcnI?b&V1/w9/tZ?^put?Q:DFcm!\kMwJXHTa!QF=h:wJnK
pb=9&R ?M54uS@SKmP$?\1cY>+GEdY/JD9y*9ZRC/nu4dHlGl&NMh1E?wVc1P1+Cw9KMNlqSHXWbWl%y44tKkPn
kjpm>Y w%bP:4=BIYFZ4>&<FSq=<&apiW5RE8/\C\FiL6akn*ZWJqRJ6ZF%*Qc&eyVm@JNeX%JeMkKwWtXWPRNC
lj9NA# KXZG?1Ta#GHQK$5iGKZp^qJ$yTWpcY6Y/&@a6Bqa*aXRSh&FILj$!54J#l:Kad&BTbZX%6>?&Nan=G=T
:u:aeS dnpKwM#Y?RQMHSt!DwGK!#nGc??D1!Sn1Vn8&Jn:>^C5=D*P8*ekqN=t8W%G56?/u%HCKKD!&TwL/J<y
i%+hRu ^mT6\5PDk&mpN=1d<9ZLq$?jmA@$H9ID?au/\9Q%?:j9**:</AMw/SlI%l?>RPp*Nukb?YECZpb>+9*!
iRB9B5 ?i9Z:>@S1<b^tAXW9%JjKPd:9Ce@mnC@*wi8DTJ&S$ECp?Bm=ChV$Knd6!=bPS\G@Z9=9Q5yJ^6VXBht
9\1WQ> 8Y9L6wMPu4=iHtj6D8m5q^RTtdX\*6!=<$*486>??5=E>@%NBYHStjL!Cmy1T9KKm?jILqmt11K1ymVN
ad$Pc+ !<Mn<E@>TpECKm5:Y%aJ$NXecYCMSpPiPkQpBq+ICR9HN+WibiRWtPCbu<@Rhb%PqK?n&>lj9*%D\&VR
:uaeNT KCdWKLC%bjLTjW+tpqH+MlbP%M>iVa+JDR1NTwmJ<LE>9Gj:#tM8Q9:8AK@SdtN4J\eHJ?>#yN<eaNe#
wd\8Xq IQaL:y/JR!!#aRX1t69T%FCD>BdnmV^pV&nZE8&Qwy5R=<>NZqBBY#wHD?#h9YQd=uY4hVZXXFVGXahl
lQ<yFl 8T14cim5%N?\biiiA+j^GBSM:=X46?<uy1BLTGYXYNCn66VwEK8bybq5Y6L<DG*<%6ZXIHV#kh*pB+q^
lcJly& MjjS^t@EqhCL1J4@#CT<16KpMAuwn1ML@pL5\u?D4QCMlZ85*WQnCl1:u^WplP\RkmnLVuI\PAFekw9E
@tZ%C\ jRhbBIDeGW4qNDp$dHL%bnVm=LVZ8iDRK?FZI/=i9unP\<uC&GAXp5MEwuiJAKT9@?lqk<@SblCVZttl
bmHq%% k#eV5<5dP%Gw#W?Nm:\THPDyau%$#<aXtkliAmAeWBtd6M8ICw9!mAyhhbE/PqW/c8EA+mMk/ELISXRy
A<Rybt GHIJXiAG?u8=P/MBS15$XEpXXqWXRyWEmCpEejWa/NLZGYXF^cPqbBqb!5weip&YE&ZelXp=PZu=PjRS
>@5M?p cp/Q=S\J!WWcP59%X8tnwXDdDHj8RSeJkYTH#J#5\S#YKA!^nQc/ZWhQ?wVHwMt&Zc>:Qu=B+!<tGc/h
w5:=p^ DLaAeZFe!wN+IwEDDZ1Ju4nQChpyEE#h+d^:?$:!p*\G^N1T#BbEL\WCYB\%BJmEF?*Xjil=??:Nt:HZ
DEFRQA =B8lh&>:Qp!N>APE^\FMIaD=K&Se<DLW*i*%/G91LhZD@iHVS$#wPASdkY@IA*#w/ZpL!hH4<Xep9IRV
LHAntY N!TF/M#jm<L9bQAF@W*IM#NaJDX>HW$QY98El9theZG\QHHC*Md?$DcDHehhjd\<*E?bG<44mwuMpF$\
la1+d% V$=84uh#%=8QiGBBj>@Zt9%mktJ!m^e5WXJe9GnSZGubSe8WFJTX=AS+iQnEJtj:pXLeMknkPdMXkYA6
$HAZtm @X*HWA8l$^lkjNW9G6?6KC\XR+G1CW?$R?QIQ/NiC9TjFu%+9PXd%IeV*W^Gh^1B*%S<B!\T%*?=*uy<
m<dFYt Q!#+cp^T:FX9G=P>&@iaujL%h*i\Pt1$^<Vi&eHB:RIIbBS/@h!Ki*EbFwViQ/kn&phtQ%+I9XY1V<1i
$l5Z+N kDy:Wwc1aZL^pX*W4i6ZLkXnkF%PVwdijd6*dnQawL>Tt/bKX?qXJXRY11y4wZ$p\>%w$1/F4cQLYW?@
haIiQT wI6Zd6!JjjAwQVMZeuK$k>uA>dRBpG&wa/841YFWL$AbYXq^aZ+&/4KhGB>:Q?w8*tRPC$E*4V*\VY8k
<KlnR< X\qpMmXICNGF<YXMCwR!mj6DAeIM$SpKi<*hL5WA\W@#+$I6=:P#5dK^E^\EJ+ML>dhG>YD<CGDFT6wC
&EGLCX DW*6qS6&GJ?\ejY?ePWtbCZwF9/D8KkdwZ/8q98*dhDV%6Rk$S#dBaJ<mGETd?N!CjL#w#%BRwDBn*Nc
JD$/qE WiiwqIL1F>%h#hZFtR?mIpLPib&&N<MBiJ^GB+dyaBhYbbXSbWKbXWX=At^EX@tnQK=C1m=R%>Hj86jE
XDdJ<F #M:^FP4@=aMiCjwjH&>RGk=Y^@abktatqSpa+\q%FwV^>#GKl%:^yLmw8KT$qF=CquKYqcJl9=DiQmFK
l1%aqC 8R8#e*KLH4RV\=V5::MLJYe8XqGqcit5$F8#h6*G#X5Nh?#a6Zi9$iFH8RM=4HGaa&thDZ6Q8ATCH*4!
<dTFT/ DJ*hj9tPR#HiZc1tKFSqVKjTYB<@wCeKJkDD5hE^/QI>cGe!mw!m:4Itq?IRZJd/?k8GGIXk<YGpq\Fm
J9Qbh* ^DC#C%lZS\jS#6LKcKe/lLyiww4w6?>/Qu#/BDnV9+tltAR9@andu:=?&RY9J68JN11D/8J@&j*1>h8i
1Njw\n uk<jAZ+/D5VWB>/ih%P9k%i>kI>&CZS*+SZ#bnj1qVBJNkKdI8S^bZ5emPy4#1iQHLIQ9B#m:iy5d*:M
juRN^X %NLPbk@cbV*4:iq?%8HR/6u4lWRpF5!dJ#hQ=$F#=!Vaj@1?9G<<MW6IbL/e*CL=SjQt#=YTtL%IactC
N19$cF +pJ^Ht+i*CyaEkXtGSuE>b#bCl>wMy1/BkhRRVl1dkSkw/*ltIVp^%qwB%?$D4l8^?WQH\F4=8!Mhdnp
J&EknG <nN1Ce@5iXlSYwDJ^yh!MhuPTiqSacG*+yQm\n&6Vjd8&G6%&5@jDeDib*Ve$eZS$T&I>J8L\4K9c^ZT
-A*ha& 0004ce46f9d001202b3 Page 247 of binaries1.zip
6eleYL %Qnp<nh1D+\uwKK\ZF*BWp4C8yE9Lmww!EFdA1lM?R1#*>5yJ+!%!eH>S46*GBy5ZLeKBYbCtc+!1MyR
DL%jT\ IbZqXXR%hQVYdN!!jje?+!PtX4aP#tjSNuH+#d8^mTtQM*Q#m+4LuqSWXqXCJ5hcZ5biXqJcVJa5LC\w
6V<9kJ K5nQkh<F5S$djT@1#8%d1KIl:FI\/AFe:tbuNRdCimFVYDPE/Dk/I%qNm4HPkPk<T%^#y?uym+n6l6!a
D<\jC* m$=:bDqbAY+I$K!eHHRR&BR*!eMm$m@KK1bRVSMD89WM>l/%h9E+h#pT>ce4KCJKlAy#$=Q8ZR%$NV?E
8n?b&% Pm^4I4\==kwC#uS<=ppJW9\5EKAbAkTGY$45VB#1Sww9pcLiIwHidp=YS%B<b4JNkFZw!t#LqJiS!m#\
1bFPe= \c+Mu$=Mtt6eiYRbt@K!bR#+<\JXt5:cLZ9RcSY8R##qkpdP8cKBpQdY=md:DVe5X%et+S$IkJ%Ra$DM
wwlNN9 b9<KEb6SW%FeYDSi\q/MTlNLYE4HkZLYwm\!l/$m5Y?Ap4t6ImG*cKtm5lyNT*eF^P#%kQp&\^$:Dj$#
J>kIbp <mFaJ/5n!KX$N??*hA8JikTP1k8Z*9/ba4!K+kP=DcF/KD+>LRqhaib<?CAlIS:4dm1YA/F?u:^Q*YNN
LtZTwP awJiH9*%C$YA%yaiH&XiCpP^GnBHQKI8/<?jN#W^WQjn=+I9Y69d<G:IG\R\?auA<A4lqtc\!NG4Z#^9
DaFk&Q Iy6aulFNkpnR\c5:tdln\j/B/lF=??dN=B9nh*:&nHlKNWw*w$/T4i$hL#H^8DuKQ>+XCH\JA1YmET/P
/+!#iN l+?:Bq<=:?dmcHQmGK#a+>5*d#%+$5QL*e*Xc4jc#QZCanKL=5?d6&BuWW9H/\>M*H5@>:^5e=<nKCMu
Ej&1ma P*9i\4t#=$mL#=1#cNHmya6p?Lm=BBH6pqKTmQdbRQ9e8jII>#W:n%p!Y=thA>19*dwdp=CTqq%RWq:h
mcAFEB IMcEjY4iBG/I#^nhMMLeM+ba#y!b!?#C!B\YCE4<%w*4+c+yGZjC4pa>TI/>+tpF\P?*eR9\Q?6kjZV@
EH8e8D AVMuF!jH5+H?yP<eAN:Q1ZF!WkRE<l?w6ipd*Jwa/RP1lCktC^inad!y1HdkbpValeDJHYlL$&NIli@c
n?MP9b 9t*Ly9X4XpAWJ&HBV5A1bFXSuXBlKC>aywLm?dyNY:j9*u>\56$lBQSL/Lk%@tF1ilbIS:KI8:mpGHSC
uhYCjH jy=mZt=iVp+&t6&ipj++NVu=RWLM@d6*d1Eta6em4wTFZ4\RFPDLdI8HpX>MC4MJCj=Fuk$EPRN+u!pt
LcilYk yR6/K#k/9:G:Q8j?lbNGK?h!5:IS:K\eENFJVnVqt8KtiJAmb%qcR=NH\P<*hZA:F*4njqIt8u#VDE9p
CeH6cS Bbm%wmA6:q1A5@Z^@X9$6DSy6H+cy:1$AKciDX%dEtV\$/iIq@b<tFQSnKJ=WWdC:jBkZ#eZ&^MHDQX%
Z5q#n& NCcAiBKIJ<Awk<9G\Ewwlp>ccZ#btNIE^qeATNe*&Lu9INy:5&SaWVcC6na&%tn?\6:6G@W$qEpqAq=I
yCj<!! \9iC@%BuXci^>\QwE<uFlaXFbDFX^ACHTSY#qwBKy=/RbWRJh#HI<>!ml\Q>qQS=KYubPjMB?GX1NA%6
Qwm9dj ubY4X889&:nJ\GBQdCHRupbD6E91dV65=^$iu%pGEj*h^&>>9/hk4$T\I>4j*wPwRmTLJV%<<CA^MV+?
QS@??D Ln+ipI?Nk>lP^ZBE*+6PLmEAh9c<b+q@9tLcbj:TnuK<u6i98nwA!GjQGl1\jCN4SP5cGy/mlyR9&6w/
D%w#t6 86A>*LiMH4H*8P6!X&hHG=y^kpwJ/mb11F1l?1hQtR%b<F:yc<bd<4ZRyQ6wkp\P%jw!14bYX%ZX%MH:
h>Rj8V w1FVdjCi$%FHty%Pu<1+d+bdt^<!>\1>HACyyeY^a/dY698*dNy=@BSE>VPP^#a8F6EREb?@aQ:<ijMQ
1HQKpI q#%9u\V>>+@Q::ydG/$ESTTpb$uPumMnJVXVhKa58INFe$Y+8LnFJWlJTy1T+YF!Lnh*/Wic4Id8Jwn4
%pA/eW J\ECZ\^/bFRMJKa=BcYX6e?im<GQ?ab=%R9@pGP+Hw5cw<dZnk$QwIqtcBbpF^LaqYYwt%w/<?eH&IM8
^eI!Qm bKZhDd<S?!kqJ5#h/wnS#5MuQRJ<#\D4B\:buHb%eV+VTQ4PBhR>Lq^+njjLWB?l95p8+Zk5XE%=1XwS
y@$aey LKPmAmA^J#8ViiIWeVpa^*bWCw5G*8@d5*Q:%5$d%/@SY//yy1!pSF>GKA@DGta5t/?511G>enX1!L%u
\mlNXb @<Eny8a&J=*QiKJtEVj9*I6LVH1WuyHF!PFEeKiu<#>PVWZ64bKVRVcV<dI^$dkj$:YImQA4X<Ik5kQu
a!KA$^ jn:a!>lcI6BuMEEulBlM:e+mVBhC6#bA6+9JLne</lJ<Q:?^1!+4K6B&q//GNMqKAP$WB+WtH*K!RALP
J9jmKn ^mM5Nkn^jWph/uP#$tC@Pi1!en<yw/Dm/a9&4m=G8%luh&h4R%qGZLnjGRj#A\a4NVWR:e6E?KdSV9BQ
k?j>FC aN4HBcYE%%^LLc^6l@n?JDjq@9XLAi/u:M%NhpN<b>IPnIL1aT\dWl1jb1aJyRqFXmXFllIDuIAwtG#N
A$VtWw yt&:>1KB5&mC:yGn=DH1KN@lk@6&d>8+Tp6FTaFWJJTwbhRp<=R/ye=PnqM<bE<cQKmmwtK!mAW?Jwyb
>eC+V= TmdKBMCNqlVqbijp=Pipn\%R:GVdRekalYZu!C%aI1<E?p6LB$*QI>i^liVqDiY\bt5k=mZY:D#8HBmb
kL&jCk qF@h$9*t@bej8PwVIX<^YaLP$S&dujcIVKbT1GSYiF/JjAtJ<A<c\Bwd\^WVC=4?WVGV?SjJA><tyd#$
+B<eL= Z?a@>1BnVTD?KcyQ4aDMpF=CkaMTS5X*6R%QWX5a+L:4JiMX>XIEhZ>8kZD>qDtw@Wpb9LSpSnHpKcAP
X5*/Ay Ij84a>IQ$b=+TZXSHaL64eD>5\be?qyYTke*cIC!t9IKXD:S>Q^FB+L@H%cnkD:1aaE&4K:=&S$>bBh\
+p=dkP ?bL9cYe:5&QH#K\6ht:c9N91DB4Ibu6klc\\VWSmMWJ@up6F<&TLa6V*<Y%*!>P+6RLCM<ZF^CWqb+1L
Q+CKyP m+4MqJp#b>=eKX+8VtFEQn?T<:Ml\M9J#X5C/G91:aAa:*Vc*TjkQCajSC<p/tXX>a$6HcI9tV8b#A8J
5\#B@k cNdNAKQjclDhy^wb?N&LVwal6Y+FBR==Lmw>Tp/M8ae1i<>h#u%<>>1hB&tQ:q$/c*qp:?/nVq:ujE+:
jt:p9j YB$^QtKHSlYjCeBNy##hR!:%ML96DWCM@+wP5+B:bw\9y9KyA5ZC@Q!<*C#IwHF=:bYLRZ/ib=n*HIF:
$wRXnl w>%w&QDGhY6Y4hBYX%tGXmY^dBDYM/E$j=t!t1d8K9$Nt:b6^$Mb#c*5kZ#@wE6Zd>!?F^Pj?DAqlZ^M
Yb%AqS yZKtQHwEMaM>ARIGET5eE*$@mqtenH45lwYSwYTIaQCF<&l\pAe/R$MSupYJSMjM\Q*E9<%!EWKMLmw8
M9i%Pc y:9F^QuC@aKt461M&*=Y&*R$FEVaTFaGG+t+B?w=8LlBd@YL5m!8y!qycK<%MuQ&Da%MTC<w4&@ySIN/
8a1dJ$ $HJ=AkwL@6SWuuH@e1CZp@u?nd1cRD&dwnCT<ll/RyDC>@=B+Q>Fj?Ph#LLGLkn$liu^pjCN4mi6WN6u
5SH#=j FPkbGH%TlXKGWK$$1Dn&%%RMJd4m8AK4ItccAZF<nkyNT\@EpiHP*Z9&:IX@njd6&:>9*^:WPBLBV<1V
<6HPB! CyRmmjtuMQ<5\D?H\BnFY%^WtA@<k\ekCmiKYI5lKRNMTntLILp9#CS#&J<p9mj@WDL9jhjLTpqJTE4Q
+lql#M qq8\iItm5w1/l4d8T4$Xi!JLe$h!&HILNFCN%m#6>WaYd1HS/TXQP%:%+N6%&APWWRl@6w4H?jSWLuSS
+w@J^5 P8uBR@IB>bD6RYICGe<T^+tGMCeZERXEQq9Dk=F9EP$S?VJM<u?AP8$BIat/5>bWqyZCn=!Zt$9QyuJF
>/&/?R <9ILm$yK!!11c85Rwm&6bQ9Mn5:&>qbe+6RAd1L<TXqSaWFiHp58QWe+N\>hDTpF?85cEQ*pC@G&X1#@
^Z9B^% G$FCXFcWqeB:=?dp$DPy4M*b8ju=lbBJXwJuced\j@n$:j6j>uEhMnywPtq9Ak9w!pZQW$/&J++iN:M/
L/:A6m 5tZDbtN:N@e#y=*Nh/nPFNISt:%\\aL=m>aq%#Y%9<J#Sah?jj@$B9W?iZB+tcn+VDHWJ$yMXFBRDAV>
$MFSjq HFqlLk=8eSpycSqTqyyD#YYSI?i^IQT%N?#HI:t>@INCMQpQWnJ!m<yS1YHZc=<iQKl6APL>&AkcEaIQ
q116E/ AZ@$@tV&PS@+lR/%*nQ:?VH9>1PV?Q5RL!Qh++1V:>!MTW=@FHZ^6KZJ*n&tLn:u9F\hLI<eP8Hwh64%
EYK?/L nL?jD&4q/PEiFQL=#^C#iTAiZaCGY4YlwF>SYpnqAj/=XM/T4A!e$N?=ki>&8cE6d:NnJ9lm:VcDVi9Z
5pBe*N A95/Gt4LFEt<kPuL/LCtTTYG+n\qYMjLIZ%pnkw+jA^XkJ$GtS>!?h4N!H9*a?IT!RjemRpJeZHA9HnW
:iAG61 *V8*+ahHw9+G951E4tGRF%nPE^iE#8QBaV=i:thPPb&$5S/nee\ZEldGDwCa&4SDQkCJjEp^mYY/Bwih
*IICE& #6<9cP/5V49qddaJ>Qp!KRE&Bm9JS4G#eBAw9Ti=YHtEB5ALNNCYcT:je5VSJ@S8Wp=b@a8P#lj%=RWb
+cGLQA n^:E^/J8j#pqhc%h#cYyWhe8?nmd:hHZ$kA*5EmIn?AuWQWK+*?<kKV\=4n</ljhdjXqPWqSX+PS*Dy^
BTTyIq eNjGFXyMJ$BlJ$CCl/RAi:w<yeAmV@>4PkL?P/HIWBkC^kqkuLGMD=<<wmVe\IDeRt$XM6^88G*dq5$d
JtI@\y >Fh11T4JL!GZW6kjWEwe!=TXXTd%AMjCMW4keY+i86BdmD@IR11IKtR9k1!jLGW4KT%tFHGBJMk4jQD:
Hu&l^Y F!W>?P*!EmpyTRpJTStWDC^SWFJSA%qAe<w5SQ/kWAj=k=t/Bkj6jc<@!K$CSjDlc^<19AX*WI4%AQ6A
u5b4GC dE+P+#FHYm41V=4E<yBMwl/!kC1kEmn+aE$yIeEj5JeW=bDj\H?R>NtwXY@@d?\QRAm$Nn&6\^YM&iqy
km+1bc 1TuJD^pQqB+tQ*1WtycbqaP:cyiDeEh6VJ8iQ&>Ge:Q4c151!pwL$adV+$jJTT^J^AQSyPSHn>M#M4Q#
iDXe85 <w6\G?//y@Sua1k&5k4hGtQ8cTeuQ*#ATITjLHunw#TWclcBB/qnqmL&kE9wuZRJW&uANWj#k!jeR!+H
qnDtDN \6K*QH4$8Lu%*w*4Da</8b<>:Z4!!QwFIpId^Benn#D@WG=>W^9!CCNnk:??j*#V<d!?wnk%/9A5hE%B
ZL^kHh XFSIEBJE$XpTW6ITjB#5R6K!KNqH8d:e9Hu#F!^T@$!d4duT<KmX9SMI=MCLq<Eq^D%<qJFdZF:#>Hp:
ARel/b YN!HPdwSP\StahkHQQ*><:ej1NjceD?/DQ1y=$%*Y*NDdhXW^+BwCKeSHqu=D&@jVp#LVLq#+bVF+d%:
5icwAe LW@:B*4BL*VE^QIW?AT*e*/?*n:iul:iH6E@?:EiRNPCWDE%t6+K4l4$RAGX\=JL=5luk%SQTW1A4Q>1
#1T=mq KLmEM!+PNlaunl#cn=PADi9$X?86$NYGQABCGq:GlNIaZ8:1C9JLq!^iAyyVFV\D5$@4*kPR%X4cPy*&
9dPWJY <A8/GHaqAnWi8l5XhR<h!h/<ei$1haY/#BLK8ESh=A6BF?$DWRhDQ#JA>F^AAL/VlIij8Vmi6EX8RX^R
VPd&Qk YGm/Y$D=AIYFkcm$18:GR<k4QP?wVL*8juThJpqnX%PY=cTDY&BlJ>ubPhk=RB?\<wqAR4BA9SF%8F8%
-ARjuD 00026264ff7001202b3 Page 248 of binaries1.zip
tH>YWw !<L6$y&p9M1t>5/Y?9LeqJld+cHB=+M8ZA!N8Q5ky/Kq/%qBTt^p1I@nWeMXtkQ\l4Q+WV<T4BAak1lP
hB>:@9 DVX/yA8MCWwKtccXNHS$NXeXQI/>ES4k:tS6bwKHY>Ku?RX1GbiTw1KCk4\<8bSeM4cabRt^qQkQI:In
%FbHI& I=KL^^i^kTZyT=qmaEJJcBuwiP*qK@XY4X/%i9WcjYIh#%y>=JqXFJeTm<pqFLkJLkXFSTYqbbA$\F?t
n+&T9S ^11t#1E/V4GPJbJ=LQtnBjSC%1JmikpLTAeml#$@N*twn?Kpy&9NqyWmJWWpWCmd6&C^\nJqXhZq=!9!
cabhH\ SuQae\8Q48kH9!C86@&+!@twXKbM?IGKF<E6qDDh\5?a@G^/Ptjca?RZJyLbpl/CX8B<<DD^RWwS<kl5
R@9qbJ JYXbW\yl>8nW>6Ydq&*Qu>bXqBVtwHNZ=6HNdTJTHDj@mE6EtKM?+eYq=bXXNil88\kknnS\=tQp8cNl
E\8=wL @XC*!X5Kh>D4H!TqyKbub8eZIK%RXX%hY%MDu1awQ#e:I^ZhQwmijQi6#M/Lecl4Jc4VSY%ju4em4@Bq
!?:QI1 $m8M+:P<8=HZ\<!QH:V$CR$LPPNmd*d$!DF#5?*4%??$PPX?^6ZF?5AKGTHSDbJLF!K9aJXZ%+me\l>\
Zl8lDy Cn?@9Z@X*qSZZyn%KM=8n6k5eYESaWF?Qt=iaVH^YdNE8Nk=^idk*Z:ID8cDV%kwy\^PRY9>Q6AJ48/w
mV!Jbt +CVmF9mEXPRVcy?%aFEt\l#ckGe:wL6E4%?S*dc+b^pTdKQn1DH\n/<j*:%CW^YabVZI5aFTCD>ZtQek
lL8Ew9 /u=!btb!bJCL^cG>^4bu#&GleQTwuV6pPthRMa&Zy/iHq@e>6BGI^qumkZ%wwuM4dkqiYylDbm6pRjwP
h^#YV? Zn5=Mi+ic1kAL5Hb#6L$/KF>8*hMVa*Y%1Ty1/ww!bMR5AkIi1Vm1BKy1KpADtElQl6b5GmyEky%iG4k
NDB#j5 L1MD1FWH8wWSEHR^ND#<&4Y4EdkH^cXLkB<u9p:qT@1\iZ6=ph/!<DN/+aE&Z6+?IG%<$NWRD*kW1GG*
5&Q8>9 #VmNR%%eTFmIIanP>TklF8\ZGEIW/8>AI6e\S%Xuk:Hn?j8FLi*q!iFuD1*TbNDa%Sj\a5W\\a:&CqkF
*l#VVc ^abEYTYYNhGA5uZG>u+*HpIW:G^4iJKVHH*>wy?:1/P>HcyK>A!<EyXi*6ySW=CiiD9W$>b+9VcL^mCN
u&<D%^ ZZWGH#kGc9JMkFNIWHCcd=ARMEMVc>91T:MjwA/W4ubtS@b9*@BQMwmyKC59Y/aIdkH56YkSnndpQLwe
5up<@S !#\8YCWLF!&i6C1lPAbY=j%4XdtJ8bReD:\EZkH8AtpFTwGPZ4BWZpFJYXXNucBStyR&yeP9yWpDn:$W
!*YKp6 9jhCelG%YHRJiw$ChlkkK%SX%dDH$BtuPL<?K5#N#S9Ly^i\w9%FE95MqkL\GpZylYP>FBhS+:^bVl4e
CJ^/MC BmWlAH=n66#CJjBY^kqqwCWK#1=DQtPG@q=L>!9^PbWkJV=??+p8HVCII6!R<5&D$m^GJyZBqe=$G8Rn
/Jb&yY qlR!tZlIRwKSBD/DSJ8In#+!uaaRdmPH!pR?k5@wHCMwAZJ<hQDQ=KCVh?VdtY>ilq&?DIHq:u&$*\Rl
1VS>># Q^jWRTu>CS>YD=tyD^Nm1mawBmZ&P#u</k%RyuH+5kZ+m?JTw5!$6Gl<?Hj9D^^aP%/$QG8w4$E*!J:p
H%+cS: ZR8:jQZcnh6S$RpRydQ#m<y4/9EqwR>V*mJ6M1W+b*Q5pQ&=!!Hi1HLuCDmLR\b4N?!%PZ*&%CpHW=ST
j@m>Ct mLLKLTIY4qd$K1yF5#GS4^n+?jZ>!:dGt4KCnPT+P/j$q/Lyl!JC@D#eQAImItI#?Dna?KZu#yp>h?+<
/GaXH1 8jqwDT!i1@!FNphn?VaREM=u9RI8lDI:DcGWw4d^STj8*CW!PDw&MknY\9e/APIZbM9tF/*6/Kj?mtaE
FKLZkt wp#n^=eQTEKkMy=m%EwNFc#h9ZDqTW:m9jnW:K\HN<?=tB@ec&L9GSnk+iykee#W\e9n:Gq\F1V*ZAnG
j$FLlL =+Nced@^kh?+KTa/l&mdcuii4b/bqb&btREQNkXhILq==YLA=adu#%8iN/NBK5Z+eBK?BlqquQ\T6IVu
tqq9WE L=\MZ1VC1CI@^L=FC?dLtXc>H^6nWNV+wt>QLZBuc8bMVjCTdy/?=+KCR!/F9H9V&h/GB5mCElIEd%?a
@ujuk9 q=5DZ81ll=MV\=pQubThPiQt=8:yRZ4!wZd&y%&eRWTA6&BXSp%k5LQkkm\DhXmcLMbD8+ymC>T%%+P#
qc#N$< mC=/$X:&MNSq*\yI:6tZTkm!Ec\WG=&Nqb&NbEi:mmNweIhmM$%TR&j#pXQB>#I4uui&XBip*IPWAQk&
btpP$F &d?Z*DX#:\EV<=Q8\djV1#6i%JSpQakMQtP?a!W4tnuH4mTKC*9Aa:CAt<DuGRIE8A6IMaTYS/Jyc$&X
?u6jZq BcuI?b\>cZHEiJjBc4VQRIC@aAEyMR9=m@Z*aMGuQp:BnS6na>G=G^HFel99Qe?X?&@VLyq8&nHin^Y:
BRaQc> <c5YLCIZW@A/Wy=REJJjplCQ/&$mRb%FSJBZF?FYTBi<hSjI#aXZR>ACb:Nw<iIq+D^AdT^d^9RhqB4:
a1%Dm@ $*GKw?NSRZd8iB/bV^Yk#cYJI5:Ck9#<ku\ml/$5>ue9^W5!^whj&C4I!W\/D\upQidQZ:RuwTy:LIi>
&&/hk! $Fhda$CVwVqDb>QBp@/SKWWNHc@ij?=F?^J$wlBX!VQ!559IVDKL!8VMTEQ?k$lqiWVmHeypMyp6JdiR
pYcp@S /WAcpRMl5iwRbJb!w!aMdW*=L:>TIq<m$iCGi#H^#F6ZiZqEAR<5u$^kIidZBMZGGBqlHcFQWMLQLq&?
Jm!<SH m1=uQWlPTe9M#wFjnC$4ujGN&6SZeC$M*kJ!?ph+N\?mNhM#+A$Hbtb^I<Lh@Mllq\6ZL4k:P%whM#q!
j&l+F4 *HL9B9*Nl?%S+LI:5uG^1LDalmZk:Se8Yy6cQ8pbS5j/j*:y/Z:^4Lw$L?%lVGV+SYeh/Xp#SME%<HL^
my#<** <ApKmRn#5LH#!<!Zt+5E^AJ$^DljEV!Dy4+St1:tki<Ia<iRX+\eR>edhAF$YHl5bPAZpQ?PPZ*$YRNS
w8p>&X d>D\4LGqDZ*>%%SC<LpHbAVcH<A>D^Lna8:hhZ6apSEjub!bt=WR+i6phuCQ1dNQpL?:/$tL+%cu\B&e
:hKk?: <acAVH4N<ZT:eL+NhaRGEaE&GmG^AL@\jE1VWBtm/SuyICKTHmSES>&MCA*!CZu=uSIb:<*TSS9XcEtl
n&4A8E mCR@y5ANK*Y?*IP9BIQmaI\Mn>AbqAR=qIkd%KNPnPD@V1NtI8eC@Bkn%BAqVH=NeePnZhFRw6Pu#=Bu
hNDp:D KVji5&k+pyPn9c*6PI%ZRWRISYRBRWFWJD?qEin+=BBJBLFbKnV66aB>VEq4Y$uCSahh8lynkPk5LucC
XtBy!D hbRNMkh8EdFSSL#<e=1/l8+&M@j\^MLG#yc1uIV4\X+8%5j*GY=AZX>$q?86&dDh&ML%jFVP$/:Y?4L5
l&MT6F lP5BDwe&5GyyA9L#RA\m=HqRV&6BwWupGWklCPuhS+N+/p5!E!LDAn&e4I<b:>t&dnqYCC^1yCwF!RQH
<Aw+&B MpZ=I!>:KR4M>mNV=@<$Y!I!G\8hHGcbaFC<^J?dIDjBE$\!V5m#LXuI?E:J$q?H4pbjRY5IqlDYAu>y
9GJKPV y6R+=wIM!EuP#e:JliRBQnnRhLq<Mw<hd#YknRdENTmC9IL:\DW@RS<d:8?JQdX<wa\WHentpbTYpXa<
K\6TQJ Y%YeQb:DWbC5ycE^mLBiaZn<hElMbuqL>>8Q**<NDKQK9$KKI6tJ?PICinbuF41hp#d^tC9%EVwwi5RB
$kJmQw <kChMRDSSSXJE>?^JBDGpkB!+e<kiy<*lIaMn+>P5NLl>=cwSa9@DwD>MCpF#jSCh*&TIbFFJmFG&Ab@
Lt&NTy >uH*>R<QD\&NMElKaPl8!PX46/Km+^+<VEpq$#p!Hn<e@pu&Wd&+kQedL8H>9Q*V^+<jQu#5G!iI>*Ek
X\dSl: $G@kHZ\WhJ?%6L><m@eaB+eu$+c4J$$QHV%:/ZKRt:PDyapJTIH6c>h5PiaI^D6aH6CdI!\m^dKEZKT@
l$#VeS eNHPqQKc^6cZH::*n+:&>*%?%>*TWFYTp=y+:<dqC*/88=dQtTW&R$TRq+8Ln=>jpJ?LlZ*G@Qu#FtCq
+et*5u B$>4<YIkZujLEVS=&#9\+yZ4h@CEA\S<K!wP@nW+P8w#?A5qY6*61F6%VXXFiVt/Kq>Xk\+i*u#<*w?d
%?\BBP 6@@8?@aS#dJ1^LNK$c+abA=?^eZy<jGQe@M!a<P>HM&M>%ti>n@9=?b/$9!EnS5IeVe@H*T++PHl=SQc
1^IJHu N+VQKyDmRK+FSYStm@u5hCyh>HEc*46JmL6*?^4pDb:HR<m^Z?P5/Qw6%=<RGdTAtR6#Ry=#!eJ=e=@V
VhP=J> TdS+S#mHB*:&>9+llmSH/LA<ip^SF\VnI!hR>hByh$>9V@hl>J#IH&#j9*&V?@d%/=jQu#>>Ryjc<IN/
8HlqFw F*He%M\CDjq#SFj>V=P8*KheZB\hRMKQ$%ltR:kHna=cWyH@+\qEyXSwY9wHHC@Eq4c%FMaE&Y#VH1F^
RSqu:m 1T&R=8NkbYXlHYFn=?AVk?DQ54CFJ1Gl8>*K=&b1iY6dhW=5iIC46etiLY6ZcGqP$MR%6Jc9&*ZCNTT?
hB:C^& yKY:@htVnJnL:la:&Fbwck#V&Gd!V$5XKCFKpBBkkBeaFb!%M/it4j6=SX=K%NWL*1/&J\:8Mh!k^\#:
Wq=RbP FDkBHlYI?pwKT:XC^5cG@u@M!EwjIahu>jj%@9mD4tkmP^Jht&YSM$DiAG$<eC&cQ>VZ%\6t@LjeF?Dq
klAa>% @9=D:^nBiHqYSuaPlBqtjwE>lBLPFeBBTEP$j@R+J#8Hpe8Yp=5#pe8TS^bREH^b\E8kZIHKb$*w:+Zj
6DMGha dYJ$<Ni*>&$b9q5Y!emMTuJKKDuuqtSQ=HDtFS$D9#AEjpFM*<nc?%yTRV%E?!<A/NkEASKCp^^KKC@M
kaAdXJ ^cjH1DJpIw%/#EnqAMiRPlupT\5jV\X=aSVpi>Fp61+ZV/5DVuR^B5aG^+e+$JE@TXLmpcn=&c$:>/Jn
m6mNeL +>H5JFnuh!QHTI1VQnI!kFyH5@ST9T\@!P>maK+S$Ee@Rm/kt$u*w8MTH=JJy9H*ju@5:pK#TN4RARRc
NEh+5+ Sw8K^&811/wc8!EXj%YCZl?JG49uFD&ySt1k=^Q8ZbCC^&NeC:e<h6DM/*Ja\Bqui#PVR!dHVVc9%6>l
JwlR*9 =u\cXKuyVy1p5Pl<%TYLIjhdjCn6!cSuGB9y:@*<y9N=QY:dhQec^M!#Vyc:%cVF^WYFiLt=iEpBMZ=P
%Pm:wI F5+bYJR6SI=l1eL<bh>we#ZZ:J$cjuL6huRm/ymNZeP:##>?D+<N@#/M?w=&9Gl?YqhhAh1=ADq#%Mml
+>nt%6 w8ayuwW*kL6u@@4BHN/ALtuu+tcw$bHuK+9VEl>t=8YqSah=Py#aj<nYLTDI>?!yp^dtD6:iVN>Ai5*%
B>qdZe hQh&9+ZPHhG\eb\qhDLu$KM^Lutbn&e>VpY%AMuwa68h/?GZA4*P:D@S&h<@PnA/KImjGWWNd=PbM&@l
?e*t4m IkJYN4GWj<tmiZQLCI1CB>bQ>lH+aXHjF9#+nS@Zt=$d68#ej@k+c4H4+u4&qNQ9D>*wcdYnel=F=9NC
ApAQFW 9iT4K/8iheH#iqq<!8VwCR6LG%9t5G1ZW<+kFykPkqWKJRiA=kR1>ShGY+!+ylBpkymMKp$V9EN\jFu:
*LZR+8 <@^:AScdIc^#1CuMt<FNIh@A#meKMwFXR1tXNqNDh/hN\N&58w:Gk9l\Q/eVS1khMRl@Wc%XP<#e4/bY
Jmb/h$ 6*S%QC%J9SQphJB69a:tCI%XVb!P*RIdW/eIpkJ$:BbtHm>4:P1wL$/Q8*pJpkF#p:&Gt>jwcmJyIKTt
-AJTI& 000f238ddf3001202b3 Page 249 of binaries1.zip
P<JnQh 111CNk?WFPYZKB@9tPkjHBAiGBpdt@luRP\dmKWC!IKq!ILD\@*akARaWP\4m5Nk\ZaXYXDmiLPBZKK#
=uiydk hKHe:\@akLDiY/c9><yKbMBQ*jp:\DukjGDKN?B>BFbX<A$VFMhwZE=tJn&dNTid#KF!SdJ#$H^cuA5W
q!?W#L =PZt=iYChClJi<LwyWRImB<@9:#4d5!>ddFtu1T$%IRpq+Tw4Mtn\6!JHLdCG:1p^4AtwTtt9it\$@tw
?qt%Ee >QLuKMClH6WMIw<TIX?qQ!<8SEiG8VukJnI#!HR!k!MN+u+1?bl/#J1cn6XDZqX&EhNXmDLX\*ieDnVY
eJnInX QjE#/&L$>\*MGpWZ$y5<@C/ElpjemL^#>>/>?@em4$iVFAih/TFI5BlchPT*5%?@\A<\RXF%9pGRTIBZ
T&Seu1 8S<VG*9*Jqm51&QKR#R#Lac/@XR<KT5yi>dTWH#B@\IcwyKapqtAjRR/n?n>*a<:S6/ICDq?\6nc:$1a
Ed+kbA >!pu&?PHD=ta:68k6>dI?6Ryl=P&S#dL#^Ci5RT<>tL>bd:=<N&64#:<AA@^=<iuN^*NhiWFGet^6/?G
=!KSiL uENu$5c4%bdITRwL<@N\khLp=?NpaSih6=AyFiZqFbe5Bk?la&CC^IN9IB/DtaJ*HB6jkIQw:Wedtb>>
XPCT#m iq+^!\6Lm\5kM$JKCuYRLTl?W9&$yj9>6%?+1KD@J=IQ:e?j%Xa\J@#G^aVeiXGeuy!YX%mRGlZmaZ@M
GctMMu /KmDb&CRn=8LuaZXKS@\EP/?8DLB$>*QK*u!1BN*aP=GN?\dJ\<&$l@NiwRt+cGNk98w8@l=Q\?ZjYch
??=%an j@/M>R<M<I&P\<N/KCW:n:tZST+SYL^k:wwl=B%AGMLm^4et9:F<Jd@IjePQKu96=l%GcEa>K1a>cj9:
b@#^n= @X@9<H\?e*ZZ%cE1qZL$4J/&%Bj=HWCVjM!6pIh\eCIeYS%PpuaVCFJTCJ$H$9F6Y?HyTeTMSiyM:=BR
\8R\e1 *6Gae<ju?D4NAS1d88wTnnuC:K#5w&^5QCJma/K5ak9dcGLkHt\Dw@Md&/6V4@5=H68=Xqj#N$%Ee>X8
11m%a+ t+Cw*MytTAZ!E<Qh#hm*/&q1nNI+qeRE$JEDqk#@jMPa+K#b:6W98q51e=L8ZAu$hLI?8t@:b9$X&yPT
Z>bkBI kaK<kSe=B\Z=^e1tHiS9+5>kQ/Pjd?T@:ee*cd<J:B1a%tMKkm*jjmH:QbTYuV69AZaQm=e5tQQ:@X@#
XIyLc= VjtG!TKj$8LTl8h%Sc:TM5#hlaYLqm!b<k/WKwjWBMV%8Q\MNLicJa8B9AM+Cek\mH^REKAm\DFpq#%1
\<hCF4 :KXtw4&Cj4T<1#N8uV&\Rqqyn4T$yBSDppN$duBXHkmIkl\Dtkb&D1LL6=8=lTjp%dY@i9<XuY@SmX^1
PBRLy# ^tn1$=wuV<4KTw1L<9N!pHNA9juBQcTukaMk$%kK<bFqdtQ/i/b9EMN6:*>?@\SlD/J8wdh=J:aa!<B+
H^?wSR Q%cmJcje@e>jDEXVw1>HZA+yyTnGTD?BLWb>b=t$Gju=%Ke?5NpuZ>?kpM5S%&>F*kd%??j>NN@R>G\1
h?@*#n HFYWw%+llWWXbVG8*kHBX&=FJTD9WQ856j5%*p=kJldlwehPHHR+j?Yml\8plkeQtbn6Z18*\hnP^itp
<EZCFp uiYBNjNElKYYkABe9GCJ?1XC:B$?@lmARQ@>+?9&^y1!@QTH$di8BQ8=8>mb:>RqcV^1Tw4TIkI<*L\p
@<Ydn* Q!<*C:9MWm\iTHq&SaWFcn>wely/8<%ARHnBV*RDDjj</^:/WL:!@eN4wR+<6:MwH%WIy!RqpR@6eXNe
FjFAtS NF1q5i*%y^@wK5Ha+G<pNDyjNNbZw1pNTau^Wih1/51!$@NL!\yV:kTj6V%mbP4mi!HR//!L4aWhmAe9
:JHJQ% yu6AYed=\Ha<J9Ru!m*i+M1F^1j%%WlAbD%PaZqEJA5@jBAji\>QDjW/:dDZ9JQ^t@:uV#@@MD!1TEpb
G=Gq9> HM:ISj!LF</d:WyTDFndp+8d\K/B@D#*$$j$yHwMN/IBQejMLK%5LE%@9<eQC1>6^YtBD!@8wwKm<4Ia
a<%RpA B/Q>B$&Pk*=AZXlPPnmeBPXkd\?=^VVu\CwmQCHEki+Kkt?aITc?FI*HPiB$<WFq=>QMt?+t1+B*dy1c
>kY>:^ p5JMdp:YCVa&XwEbE/KpCP656R/cKGRY68hnm%ycT?KDZa:9YIMt&\q44n%+KnRly/K=1:W!+&/kQd9^
dEW9Ed Bt*NMjA\WpLwjm@^%#qRAlPRW+B#ENJPjNdb&XD<PPb/5A@pE<c:DNc8%NWeu*RPkyBQKCHq5Enb9PQZ
w5qtjh 4>Hja*@wj\S?D$$#H:GIb<y/j@+=BtR:/lQ%eXM9YP?N9QS59EeN+uZidLDihMj\h=p@\T&TC<6Lw!&q
cE5R:< yGXu#=Ydl:KKTiGk\11m!p=NWF\%5hqwEniSSYY!btYnkh\=8ZT$A=HDkmSDduFmh!<qV6DHlu=@j@?1
5TM@hT yVVypy$l89i56tk&IW%BenFLQdRwu=:DtX6+aS*VN+nw::ML8J%c&k!/+eijIan#PbSWh&=ZJV^T<Qcq
P/\D9> yWWFiVp=YimMK^5NAReFRSR\<6q1W:=<u$\8SHF!kjwl9&m5Keq^6?n+NRG&a9TQ@=EAY/Zb8/I:<MHB
DiDDHT ISiD@Q9BmR:?am+$+n9LN&y!1TF#<Z@wG=9+eS:hdR8>Rq+%DR9/<*:KKW^1%L>LDb^YRZ=8RibXK#jj
ChnWtF C&HZw?JTMk9L/=yRik?ckbqWZHE?h8V\1a8Z$Rcn=bGDB+<eM%!66<upyLPD9c*bdl%bESG=ya\q<@X9
Q9BG1y wGpEdc<?>k/MD@<C8:W%XyjpQE/<h#$MbSR&S#h1$tqm/mwLJET+8THKeLN^!T^FWwFWaFhc6pRB@IHY
SayVY1 ^5NY>1jeje?HZ4<Vt=TYk<<e86DWdHA!Z*8/Y\TjMWhVQWa*?tNnmGl:%Hei*Yb+W69e?i+L4tAaae+w
dpttm5 SbQuT\8!$=IjJF!K:kcDFn!y4Cl/hCj+nI*JRe5#ASeCQN%edK$e9FFJpA>VLZm+B@m?^twBdT/mhKKq
V%!%99 Gjj:aK1FbFTQIwI8AiLN^jN?:5+&8!\/GL??@icFJ^R/T\c6WHIl#+K=M9ZwCj&eekSMn+&iD9qBBl:Q
WWYJiX 6^Md6/F/^8PtbmeP@?u=/\tcFp$Le<lyF^hCWCuIDD?^e?<B!PhR&\^dY#5:$y/!a#pJRtGl!JR9IQ+/
tP1Y5Y kkqS5XtK+AjYGD6hT1484p8:h94ACw*jNILGwc+!d+dABB54l!BDqBBlE=&^1JMt4KG:#Vww41T6Pi?&
%F$k<l u>X8jc%9NCH64ia?%?N#Kq1/G+5T4=^lN>&Pd9=!KM=kunhmH$D<>RGnk8KcGT%wAGSCbGmA&$u#\*8&
j+%>^@ 4NZV%S1H*EGWtV5\%eFCJa9&u#@H\AiM@=d/NjHZbPAC\GS%aLIBNJ&M\K/VAI8^jCI@Wl?w>^6/S!i?
W1^**j dbcT^X8JC^jJ!j#ytiIjJDAKe>Phb*=8Vu=G8LGpNHQ#EeRB>kDK!5kBDEHipQw\M#$DuR:!btbqbpHM
SQZC$& #54Ptenq!EEJBHIAJhE>iFNlbBDqDM@!:9peZVPlKcA<Z$=tq1TW=E^b=\!Ej*:eMW$NnSFNWqNWi@MS
1K$aF^ %>C+uBw5DWC%MpB!5KW*QCN41Pyb?AyyTRp/yWAJSDd?G#Ql4&jJJMEJ5JiYQCT?@>MGpDh<keT=8d/<
F^W=:G MQ&MbejE4??@^ikW+YHqjNwDDjD&hu5HcXe@A:PQ>CiV@TqdPZ+dH8u&PP*qH*RlPQlmwE>@#*@A@^>^
wGtuc/ B1&84N!Hd49P?kRB@kpy&aYXDe*64*6AFCR\B*Tdu#l$:G#wqcC##k:tl+&Nn^l9Y1t*:aTn5=&N#XFD
9lNJSH %XtRL!!qqqJL=m@X9<q$ACBL^wh?ju9j@iJyXZF&c5Lhc=B+u*c\&1<*Ry8qNEhKnIhjpI?hVRKh=8JT
kTZ9L* EwYqKu&$iSw4hwIaPPN%:tJ+bQRDNKYtB4RA&maaG@:=?W%:W/%kPY+X>BDIn:wdGWuiPlq=??/>tAT$
5wC+Jc G%LS$Q41@Yjkj*S5/NiQV?>i64e<4Z=TpINi:q9hZF8TY%bVY%&ehC9+4QYl+@ciRij>QM</Yh8i<ph1
w+W%h+ kCpGQN!>9MMG<TC<:<^e+RY#J^=8R\#9SD\RVW!In:=*B:SAkQebS<96F8%>=M@lZ?P@J*:Nt1CIndNt
E*T!*\ !/Gh4AX#yR9kEj*yuX#M@&IbCR>Iyke>IiN%Y*d8*Z@\<JFD?@y:<AQC\Y#SNQ/u@HNPX5=D6\$:h8<#
ndlMhT Qk\iA?$u&BJ&4QdAQ<6eWwkBLDKEGMLnR1k9#:mwKIbj*>k=NKY&8@4SFie>84>w+#SPSXqJaXbYpw&D
JII4=P qW>EXJRP>M51h>PEkH/Le:Gq:e<!I5+i*cV#tTcwb?RWiC$ly:1>w#w>$w@hd4<?aq>YWEAA&Gj8J#KE
:+\ntd SnH*M$Z*%ZimPZ6S+ie>uc&PGBt8%>NFnd/bwX>kE9!qm^ewY4R#?lk@S*/N@SL@?b?t!khV@j:BtGau
Hp&FT: =pKtinc<?#w<$4XKWua8QlKeK@*u*cTn^PJ&&qLGp^F!5:N!H4lywtIB6KPI8WiBu%JlB&jD?@BS?8P$
aZ%#N! DLSjV&TRtS\bCH5ml<!qIEik=:AZbtiPI?wlH?lF?WDcNbe>8tPc:DVXbZKpFNe5kTN*$:LBQZAW^?w^
niI558 1Shb96QC?$bKTTMP?5NnhAn/:GS1X#%bS>cKMm<a\E>Yk8?j=iSpI<HBqq8ApM?6#c&auk:$j98Ehkwk
kRN*XX VKY+Y4YVjeVQd:@EJ/l*J8auuW?hPZ9Y?jb@4mj1C<5Z+m@!XI@n8<@>*\yP84l=?jpHBHmj:u@*Z<#@
b=/VWP Y%GFiEXqbq#ieiTMh!BRu=mYW+1tSL:><K$ZhjCFQPDEmRMuQMLC@E<:&=$+bG^<%Gnhe4$h=w=Ph6aY
#&dnLy B#jK#^AGiFup!cZ#FY\iF<D*klV9G^wj@IqmhENFaYbK:P*\m@+iy?#N6?5M$hnXqiXqTV=PdyabC^S\
5>T$l# !Vtd18JCRF=#@WFLmQh?F<J8SCW<!5VVnL4ij81FeN@*<XZ4$<wTkj#M1VE*%!QCmT5u\/>i9*u:Zq^T
@?Lt/+ Yt=JhXMu8qH!i^kmj6?Z>&?/Yly4!k6#WJjHpC:RHmZXDR*X?R>8BJ&&QG#l/u<^&N@L#euP@t\AEP<%
AcQN6+ Gi@h@Q&!ed^uVyVycEY:l:Xw8^IQ\H^AJI4G^?H:t1EZ@N%hdE$N4hy/J@wtkHuGV%FRyVMp=/DCT#uy
K^VE\@ a@?^mIt@5FM>%D8yV@%j<>i6&:J>n>H?A$a:?6@>yj$b>XV?Q&LZ=NCe>M5:%ln8*LQj?QA^M=R9RM!*
AJ+:ML 6ZeA*tineE<Cj+R\&6NHB+$5I1Pmw9QXMjM8acu%ubXJq$+cc9&mnhL+%bYZ!uC!5:G^<AwKV+m\m5=>
<9ciF! CeD4dLQ\m!=yd$kNhh1*Y8MVVXB#p?tb\P8JBR%hVRX^IS!8^#anlFpqBPpah!=BIXRwDem#CA\Jmm?<
QWFy9D lEN>@I$RZ%jd+\h&dF!qm^IESL#RXKlj8tVSjEY4Npd9EQnHpV/SCi4%Z$5hycmlZ?S*^9<amu!*@8*H
&FkA>u Q%>#=TTb4tGPbQ>dy1H?h^E#*YJtPlkK$uX<k4Bk+YLtHkC45k4:F#4FT+@JVp&FHD\nnbHP!GDN#CK!
CPmtu* !S!PdIn+cABAWZa?$I:T@#@jQ:^1KZq\\ZLVtCclMaPt1nbjTtKG$JcIjES6j6bbhW!:5Q+Bl\9StXX6
EH*V:I PMTQVBDbFFhXeXe>@F^pQTjik!5uu=Bq9KWqJWWF?Layc*aYD9B=%SqQ@>EPK9@LB:#nZymS/GnhV9cP
<n?Wp: >@*<TjWJV@\PMDc%5n%=$6y^&twm94Ck/iHV#ET>6i@48GZ6eByX1=$=&j<P?<Vy1PPpA%5JLcj$6Hkd
-AbnR\ 00069710a8a001202b3 Page 250 of binaries1.zip
d^dDK# dRhZ:/DLN/Mjyle<1Y68j\pSunqS??JS5**t9yhDjX%Aw^<<aH^<=&4hNWcYn9dYX1bG1?cLCM&Yq/jp
@XwJ@M F+KCe5=m59:==@Da\M@Qd:8iw^4*yJldX!:+8eE*d>D5S\Jjha+IQ^id<H^I8JTXXXTZK9!p#hM%QIFm
TZliXD i?CqmN6^TSq=yhXQY:4ijQ4SQ#dW?/G:Bh+t!!e%mZt+GS/GBlmi9+DG\Iin/8ZpnIL!lljMYuFtVjVd
>*yDZN :6dG&9ImIDRy<NG4b%ZFXjZQuqbt^%@%h#q^#N:#R8nFe::8V9cujM<B/nm&i*m+8@u=q8Ha@t%K&TQT
<:WTWY K=pnBqIiJM/MS:jLa%CuwT5lAh=uHc&PddF8?$H9@h4HPjHLYq^tLmuHKc%A@NjmJj>TV4&q*pn$6X>j
WEq<WS 8haAZd4bcVC%i8G^QFQ<q*SN<<HycZE&/y8*:Nm##>npGJ19bRPp&#9Rcb#1W8npuy!GPmHEIpKI5wnR
1jkK6E SXpYp5C5@pHZK&qQP=+pZLA&$Q^FG/L^k8qu<\H6*IIw8M?Wj$$V%NDia8+dXhVipB^58$Q*QW%kybH%
9pthF+ &jP*HyY>cK>M9edlbdpD:jC#LlIbFiAVEpTDDwSS\RBhcEB\l8Kh#5=uJcq*Ly>#e#A@6M6kDYA?Cyln
!V=?Ma Sc?59A#H>aZ#FK^d9=M@Su4yja!?mX/lmX>YaCw=8dqMW#H\Ay=8KLS<%:>=@d1*QYIt$!ZMpil@?#?a
tX9+p+ @@PHENW#$l@H&TnPRuW<e%A6$YIe%^Hu#!Chn<qKVZ*<PJ&iSp>u!$CWW%peYNen!l<?SVGhQn4+C+JV
^dTF\E a%/W%&G>Me$^DTGF?dQ=FAN!C+6!<\4V6\HkqKcIq5F^6/6Jle<kB9*wb&y+dmK6B:YDiWw&<E#/H>V+
Mhu5<L nRh!5%LWi4iAQT<*9+Ci#%=RpjIBIV/Ln8d\aRu@51P=ym\*Ji/pVh8QH?P>9Z%C9eP@H?$+eN#M\8#I
W/\w&P EDW^8a/aiR:L6JXE9uX+<:4?n4YS8b&V!&qZS&8$p1d5<*RTeK\6m1aY$8NHZ18PPJ#^8SB?P!+q8:n!
LZA4@D YR6K+YQRYNC\pIQH>qpFlIX+8#lcH#YGtLJqle//A#aP6ycY^*by!R1LLFSRIPVu$RI!ki@G6niI:@/?
bJh9hV #&</tt9L<6Ii*L5iGkSm%<ya4=jG6ZTPBB?juDKl!1c889kZdd/t@kEe\wP9kG6=uINH=mK\S+h:**e%
amY6jI %=VtymZ=^N?@DZuEyiD#kck=4a?9u*@k?a6lX&?l/ZpR^h6\:idRbH8D>1c/CuRPtBV/49FySZuh5/cG
e6lInL 59V:ah+PS<%Q?aimG<N8#5:8=>HkWYaIB:J>QF@mGQ:=\/Sw^+*l!%D:5MhJCjFWHBW9kt+Bw:LmAFAq
WCZM<B bmcd4h5kLj@^6Xh\/Hi!mMTe8ZNqb*/t^9>48bL9YjB!yh=R4!Z1dq89Z:=&<^dD:X5*wQZK>LjQumwm
Mb>eZF FVw>L8EFt=aKD&VXJ6!Q^PVwCibe%=PPE#RPcWElkWt\GeIp^ywWJRF6X9GqtP6D48Ebni$qMijM%\QZ
C^ep<9 9&teT&Xt<uH!$!F<!:/tCYl6M9P=p@jmcjJ=K\Q6Hy1A=8cDN8+lWhu%Ze>!wnmCVl4yIcIqBMeE8HHe
>d&IZK B1SHAYe^=j#8XwncESi<pE:j8uaFPk&ewup!bm?aJ&@h?t*mP\PY/*k9<WN$/FjTyHW?WiM@9**:?yW^
iy/<8E #VyMtFuipK@Z9kL#cM&WS5X:5&j%9<F8d*w+t6Lwp&+Q4KM*e^aT/pmuM?M&ye^iT1i+i8/pQ$y=qEy@
QK==Bu VE>nVRih#5kmMlmRp^hF9YHt=Cn$hFcuZ*QcyV&8PcRl5G#8\1$8?bWqiZtJS81n\LH\<q*Y@ue#!q?<
mQm/q? lEA>mAM%i%6&S<QEW/1iDZ+e%HPiB\ZIJ&Z\R:EB^QS<n4#!pqRGAqmeQytDj*1LM6mm4Ij*:G^dGYCV
JPQIpd ::*<9/8&d#>\&GV@Ja1B%\ynM1&dHy8h\Lqh5F&9wuLE*M:?yIPN/eDd/jA!w<A@EbPN#SG&a/YX+%u@
MhK!HN pG6whBeK$K<@jGFKeZjn\$a&=$KDQXG^#+H>^99Z/?l5Pt^:$6Le\tT4mwTR?FIFlWWK<9IKitGb?eB9
mLD/iS P=NjTGHcWV1StlB%:hI=L%h:<=$/*&kCmuMpJPcwchDWAF?XQ:V=Pq8PY#8m\H#6d5Kn4ML!?8cPN^>@
8N&lm< @Bpb:u9j%XTN$9hwu>6w:n!\/?*q:uaYDTbDI^1CR/>GSn>Ewjq=?<6*u+H+5j/jZ>?@dt?84!nJ!$m>
&T5!$J thnbYF6Y<:Ty1c+k=Zc\t@X^Y@j#X!=jCQS#e#pDan\w\Ajq*J+IZ:@IES!aJ!W+t8balTwG<4QS%cN+
$EebX% qqk!SmV/@6*dN<I9Bj1A$nl^eJN6K@q6@H9jD?1:<K@KBiI!e?bIYMI#?dhCmYqQBQE4>i1<#ZwXSW&>
9JIKd? hS5&G&^eM@CtbR4kB5XyEiijS$%LVRudwdJ&+^ceh^@DDY66Hb#wNHcqtWKRhQ<u\IRIJewtNp5BE*#+
Za4cYC VEVY<:dCi::H%\DBjVR8^Vp#lRSEkHK&GVI1:+Dbhei>d8e<d*^$*tKV=q5c9=/lmd%*?IQT64cTBI+\
Z%6+h\ %<Q/tuRc&&Jl\jEylpYES+TGBGeITht&w&#:#mW@pN::6&@R$>EeyyE+%^bCFPPRQF>P*9dFX@1*\i>D
VPa6RC *\X?Vq4Hk1L@BNM\ML\EtId<C!@%cm&!#bIbp4M^/9%9@yytm6:@<G$RdFJCh<\Bj1Y^:tcGa>bq!8!D
QZQw:# hI1n@9dn=JTJXQI^T^4=YAmX^&XtbKC8K@Ab%6*S*d&WAM1!j*^<*X4&MNlm\=ntkAc@85KT6ch8X=eY
Kc?kdN qVmynTGKIb5JVem9^?GEGa#b^^91G+HmBud+8Ywuc1l1%1yK5wINjn4Y<1L^jLd!nIc91DeajebWW9&&
YB6Pn5 5:t8QD<>+a/%ZS5DQB69+bphG\&MLK>WjKj@wH@u:*>q5Z::*4&GDP4QD^I9HSJ\b4%?pihmSELQ?=+i
MX!GKQ XQ\9AETj*18%VHYDpjFSC>LK%P#\+J6@TNjZJhl5Y46?t+qZDFP\+ICetyJ$R9YE6a6u+PXd5SCTead>
#eMB+/ CWu8!=heDlpd&RcGBLp=&%5e*t>$eM<cVb$6S&*6LM%MD&^WuCpp5WSSkXJaIK?\+tJtQy45@8dL4=FS
Qapupw bDC$1b:>KQ:P%a5wHV&?YjMLVWBNjy:WIkW6VR$6iWZ%RhwCnXXGF9a8KCdjmpuK!H>T&+n/m9\bGju=
tpqbQB wc8^5nA#Pjd8Db@\T?eDjL*e#4m/PDp/PDnmCeuiAShC4>&Nl/le</!q+#X+V*\4Gh>BBQ?ctS^X??Jy
9e%h\I bZpD@N1X&RuZ#:tiMHQ&8^RiimHR>?^y#+8lIiiDjL#?^8R!bp^Ga45NF?XWXcB#jwnJKRt^$XRMFT%&
:%8EmY D>&M9HI^\QQ$Tc8nB#da9jn/hj\d>b&*AD&p9bcZ!:<Nw$i$Y$S!64VaGQZ:P*MBE^?=Q%!@mB:RZ:^q
B/99jX Z5EDWq1<XFqhb@ZchS9Y4ll+#Z\?cBE4%6Z?jWJFp#pSe*L/CcXXc#h6*dF**/EnwMw54Y%PA8C5C\B4
&?$$4& =1+cmjyhV!LPEGEZFb9JJN#p:QYeqlh=h#\Q4>V+Sj8BuwGemCn<I\I?RQ$DEL:/5N86:McYNFniGt>w
ylwIlj @J14WS?M&>qQ8/wje>#\QL=Bp$FnW=@NQ+/L<#n\BaEJTPdypGYLL41HE8!+1+Ek9A@8&4SKX&5ay>jC
Xt/P9@ PL*GpZ4l9LqL:X/RZ$nkuGjKZE>a9k=@E@##<1?>9u$Bi=EaiI:4\eES<TT5bmd!/$@9$XKTt!E/R^LX
=C!^qb <e8ID:#/^*^hVj!p8cKu8WNp45ZmM!hFPDNw5!wy5#QwFGjL#hVp=BVGI!KXi5\Pan!NlI!dTGjJR5Y:
>MLIqM SdGj?1a!:je9t\8m9R@4nY9?%lCp1i5wH@awLG&<4Kt6yeHRFNHWNnD%8yu/yAXH:qEW8Vp45q8iQt%k
>t?YL\ AQX5<JMS6YRhXe6Vk>\TPKa1%4KCmZ#&\mhJ:=ukT$!C@?F%i%N6ci/n&J5Yhm??jEH4mm>u4h#ePdLT
V!N/<b t1+FTPJ<+**u9uLVhwP#%HnjqF@p8GY:e+WT%#LNdiaSNYA1%#i9k<#$qSW$WGP=@SAEVyki*V@+il4=
:^dD&D NhhY!<&BN%Y!m!/admtdbajN:M@+BEM<V+ea&hL=>kNVm:95&:@j:q^I\Guup&cH>?$:6HMqDbJnY^5#
=lMXAt 5&N:>SiJme^YWFRpFia4d4\=Sj:9$bE@*#?<dH%cYbTXHB8Jp&*4\&9R^k%pjI9t!&6y4%Sh4KctQpJd
N$^wyu wLZ=mLZncc@A$P6SCcDG\ii<SL$FSu>>:G/5LMl+GB%=NbV99L?*?&pZy=Q&N6cpqaG%Ddy^=8dqH+^&
ZWj?L\ B#IKKuA=Q>1EG\FB@1aLqR#ub\ZH6#dXqhe<c&y/Y9d+@tYjp!h5*IK8lIieQ?h%%5$@NC\pPMCd>CI>
*LaaB5 =4t=?*m?Gl9?$+h8C*dl58Dc19K@a<@mw/Nbw5u:ImDGd$TEujj*PGXudtK$#1+FZP>Z<l6j>pwBju+B
nF*mp1 Wby4Qm^q@uiuBGjK#nwEV+m=pItQKl@RI%JR%EBQ/A*1\acj$KLbC^dLL/Ny4>Sd4d>Kb?DXZ@V4FG64
YT^^Lh 48qJ#yw%e=cm*j&CTiiMH6FDG/Zq1>h6*4dV/MBl*I+iB*i8^TL+Xl&J<TiECYa69?m+CP6eXSK+Zt9m
i>4@i1 hnP@>ZuP#dQ:q@?pjaNuwK!<aIcamKmw?AIXFZX\^^4LnX!9bVT&=aScd>S+SiQVZthp/Z+=1cKnMben
=AWaeY !6@CAMluZTk<Bu@B%M$kBD:cWSeVWm6G+j*&ShDwJu8*/C@Z$ylGQ6Lwm$Gn#%qm%$J?u9lCjYZNZpF!
XS%&B! 5jMK$%^b<:?AIQ4K>?Z6qMq/CY\\+wQAVYR^Ba%6bqi4*\D:<%<Fk5WYmAwJm<!alW:Jb$9QAI9>k:@/
p4QPW> &p1Tc#/*pL#6jdRDNlu^p<Bka8JI5?Pa9&Rywu<bi!@RZ*@uWXJTMyFCQGKp5n%/uDcSVwJ&#$Lq8T^y
w<qHKe iJN6dAmq*@XbN$<l$V/1RhLGNQk%XXb86My?bLNZp$anAj:q8?*P^?VWIkGKA#:I>m!IG+\G/mqZA:CG
4WE5%< an:A#%XVY\5JX!%4WS:K8<5iX*@B/I6Qd1*%9G^>Xq&e?jDiNVP:F=@yZ^lj?X1Q#MYWK6#/MA11udjL
#Qb6lN W*9NJ9$P/8eZPnaT%\j@nR6uL%lALXCTt/MjXQ:t#W*Z9VyLq?k5S<NEh8:hh@CRmeuBZaP9@wFjY*N:
%w&n:F :Y^!DmY#hj:nwpqhlCbCQLSZ**@W!5pn<QL68NTe$6wtmL%a^\jd:Ve/eQJe5J?45=*ywZ%GB\&Z$%d5
NBR</h MLY%QGF/bNeKPXHSBayKmwTm*QFHGSn<6%@@nI:<@9/?8\XNCE1K9lpGYdmDyhH!h#S?>YXLq544cCuI
W9!j4l L%bTHce6%Fm=!>\PBj#\!Jnp4KKKlyd8u1?@l5j?jP=81m^IS?Z?\RHL9h^eui^6LM%Nn^<@h8#+CVN#
A#ZJiG c>R^#?6eTATE@N#T!94t>yj99@$ikh#@!:98q1jw>Q#<$?cG1wy/5qG@Pn<JXL!b1dQQJhS$*6@D#j9m
CiRCm* =dBL\Z<D9yhH$XVA^=h@GqDXd%qJERS<NQ\&?n:LjjKi!N$:6/=jCeE1*9Vkdu*kHla!*\6nRYElRZ:i
R4QS59 ldjin$Q?#hQyJmA8NcPb/mM@E*kN5@69qPMu8Jj\#FkVXQ:/>R%+Pw8pJKXu#%5p4/!twc&:a8WK&4R%
cZH?L9 ZK6aW^&yD\JXRq^<>8MmhPmK4k8mSY!9y4%!#ZwD%DMRucXb&Vp+$@GRC$FYJ9YwDSmmHwZ<CSFY+YWE
-ANlIB 000183685ca001202b3 Page 251 of binaries1.zip
FpP6Y9 $86HQCIL&^w#4y*c4jPV>kp>kjq!5&cI#bk^S$HqG+%j&@BpYGy>i?FX?<$cL&q<G4wGl^$Cw\yc&pw+
y=J=YJ Em:adNNm$FntnDH4<IWyEXIaKR6E9PmCY/m5L8/1Q?n=jad4Xtl4DkH\M!cV<pp=Q&i^Ze8uV^Pj!T<<
^<Qdm? LRh+?Ql+8VpZ56:1Gb+!XBMa/lQnI\NW@cTlhwGlAy<\DdX\B4?AkJDwnJpTp6LTM4LTakP9@4FiW*%4
1&VhFt DSeQ9CPZiG4lQ?ia>MBiDZ$HV6AZLERCH<E?ALDu^ma@iJlEJnMk*LPA#CjV1HRp>XtR8M<9TELmun+/
ZD9LdC CEq/S>YnWJ9N+=ynGuVcCPC8wZ9I$iZa@k$46DTFNjWQuR=QKtu8:9pCkb+Pkb:6&/NYE9L#?u1!kc1u
XJK!Mc AHTmn1wu/%nk@>q1c^1a8BiXJu/cln9cb868jXbbtJ=+J>#W98WV@VQnC>>41#u#=<9NqyGMj#pMm!6a
^N<H:$ deWc*dH^*5?Vm+uLb=W5Kk!mFu1BM%*q:Hqm4iL<yTy1Y4w4>VecGP:a5*j@@kNG&\hjNj&D9Vy/w>Re
ic$iKT 8dt#bYZn//id/bVPtpPt>th<R/=HJ&PN@:IHdc1HBy<+6P8A\:qkH&hu&^MHna#&G?nR>HcdYb5jP*HI
u=cG>k WE6GiMdmbWyKqPJ<JeX>1G+i<j:6#>n\4&<>cD5<Q^*68kYm4N%R/^YNX$XBZqF=/aK=<=jTcR5%%^?&
ai4ML9 etDG?MR$WQjNHY<@@^\c/@@//uqXRXyCFH!nn^9QKiaIm5PHCPN6B>HWIHN4i^e*u/DLpBNpFcL/&p:$
mZP<Ll dbPHhp?4!\wTL4>w4H6T%jC55cE5I#de#>HM=p#AqamR+CA@D+>#q/?ElX^E>@lJn@u8Hq=?d<cGIMb@
$E&4<k iI9FQTV5qSDmm\1aw$&n:>$D&KNEWbQ:!<GBcQQ\&IGhc?!ij!R@nZ@ti&$1NGPG1BA@V>#L$T@Wb:/Y
Vd\w5+ aH:^YeJn+#<?VT=mVy>X@F#eiJL8Il+>>H\WyEZE^CXqb5>jLK?p4EdV%NdXXl6<lS<Q#qEX1/98d^TV
ht?Y?* qJcTtDW46n+Z9QFppIeHyKVLhPIHVBD96w/ukHh=+j@kuS6m9lBp&wA<ZaSNYEkVMd@?tNihp9cG^%ee
tCeYQ\ DdX?$u4kKT!SERjmJia6/RXB9<Hm@IQ1>yJI=&&cZVSi#XY:#D$m$8w:1#mTR^%&/BA$NtWJRcV8PZCR
</j#P* b!JQF^wVFBZTK?8wL$1JDHa@cYc<e!Pp<IQV>8H\Dhy=e&e96t8G6j1J?M##/kTj5DBam+5%4u9+M$@L
LX*dJV lWq4EYA4+n%Z#=T^h9F\ec>$>nm?XpGCq=hQRFAaAJ+%T$JTTqycTt#\=VVpK?>9+PIZE8Du++&y\/+S
djN8>l ^jjpl+p8P8Iw\p9LV8q:^Q\RubJMVuta?ABCjFI!@J8TnHw4QuwEMn?XVPNAh!\!Ej4ycRn>mbH?*p?9
QIdLQ^ Y$5V#l%jQc+=4nEB/BPc*DVIV9W%NYlC?t9Nji>tXKPMFAZ=LI16y9AyWW9XpjnWuK\n/wp/F9me6cEM
W!RA!R qH*ip@#<L@npdAb#Y@*VY^\R$?J8Z#=8@=!EFWZ@#Q@YTtd8uNt#bTXnQkL@>M?<nbiW6HVPWH&jJ%eW
hH$5P+ ><W%kP@<Sa6>pICTt/P1Pq>8<SIF%F^8Jiw86>X\^/:hi*b8H5JttpT?Kt/LlA#14!N:9y5yk*BQweRE
lJ+AtR Qb*>S/%h9C>eBZFjYAuS>m*c+A/=aHJ5=*/ue?i>Zb^5V^n9Nh1#ZyPt9<@e/4nJeYMDNTulYW8AiXJy
^KddtK u51JFI^<^:69@YQDQ:??/&18K<6:uBB%LTVAA=L/DYlB1cp5Y#S9#4#Fm!DlZKm:*hVY&R*F>>mW:BJe
D4hKIn ?6w:MNd@:W%LhYF/\6&Im\Ei4w+<N8dHVR+iMN1:t>m%bdeSPqI!5#==!l%9K1duFbinVtPwuB>X=/G:
1R$im5 9$<K4/R%%qYX%#R<jX1Xu*#uw48F1aQZSSVi#@q+?F^E*dQ<9d^IV<yn9y8*d#L1DjV>e<@4Lu^&XwPG
FLBh=w kcQ8&bqyn^:G*a?Ktuu9Lt1=h!*<W4C@q?6Jm!Q:h/!!d@+AD?CV\Pe*bkKm1QWAZ@VHV!Pj?SyDiMXt
W8HRW? tFG>u#=?yMMmX8<JZ5PHL^/n>pc<9Kw15\FIJE>SQVlmZqXhR%Nn&XD*Z?K4Fc54+\^Eb$1k!RXB*Zua
jaL@HV JiMIu^m96%S:?iwNY:d9&Z@w/AqA*ktR=%dpS*h#?jtb6@KR58jC!I6CqGeVqF1NpN>\*D816KM8JhVP
yIL@9j RQMu:R&NX%XbWR=%uykn@=9G4/Fu+l*>yL$<!t&*XkiNS&jnIcjklI4PB5:$1</:hWHV5m<T=PijtMa<
=&lF!b cmHE\M#Lu86?Zy+XE?:uatt!G>*SGjnQdd6@$H?a?Mn^/a$yn^B+KH+i68kQH$e?<V!d6BhGu8\=@P/j
kCn/aY 9jl=8duBZ4\<QL#<A8nZEb5l#5SiWuT\t&p8BH%Xbc\BJ^@K4kV<8/bF5MV+qVQ@lZ1p/%pXqhlj$mt8
dNERLH ^\<jJCR?^C&+YJPTGWq5AD&bTpCC@!kFEX?RYDY=p\jycZNBqMeB*ZHNCa%^IH=ep%&Dy1a1yLu6=MYE
cyqTuw kthh:#:@HMBSu8hnA8V6XhZXNSP%XA%bm&kuIPw*qAD5BTWy6Rn&tXNucHn::pqic8#NT$hQNyMj/IA:
ckk@$w *&6#KXpbKTqymi!?<e?MV#!lT%XXa/kj#JZE&=NmLD%:L14>wbcTT>\ZLy/*aIuCMlX%VS*hqc9Z466w
u+WitF 5GZ4NuTEM>TN@iHpBtiC+W^JKWuIdc=@KJk$VR1aJtGq>q+VC$ep=lQT<544IGbGZk<QC#q9etn:Aih#
\6#+Vq Rb:PnnbH>?@b8%NjR&QhAZPL+!bH>t%WplCXXqBi6w^eJ1jqMpZ/>@:^wb>j*1Ll:nty<ZjCk*ET9:1X
<n<uPX S1py1mnJK>NwGt5PYJ=$^YH>Ai+n&j*?i@@a+Qh*dZZFGaq*4/L95LW+eN#E&Ak%^Vda9GtV\bb6P@d5
#iT%Mh P*nEDHJ?:@NZI8NT$Ru>W%D@*@/kVaQ*L%5dc<wjum?91!w64/q91C*NmI*\h#=l+iwjimWEVYZ^QHe=
=ZiemB QC\$^A@Hhey>u1h:/inRu>/9H>:ke#TW8tQIe:Mk4mjGSN&>M@Q&uV8*d/F=+pG?Hm:&pL\d/y%5j5?A
aqFGht b<Q^/wTAmDAy^MaHV\aeL%ew4+n\Liw:e<*!9p5^F8VmEaC$p^TqSBaKmjMJmpCEpyLFX<!Z!C58Y/cm
bXyjY@ 11/1MNn%><FWK%bY^G<VFlPjAR9$&wh<yk>G1#alj8WTVh%X/#ad:6wHpJ6d&V8hu1C^<\5ICyB@EYeS
5TjcXE awDmby6EjPp1nQkJ*@9qZhXJ\XadAQF85D?:m8IT=h<$Qy*h44eK&tyn9a%%&&p<tu1:4Q&mm61iC?Ve
WjpAER hDXc4pGnKe*C*kM*/pQZeWRIajTZwB$:pjqS:ZYFTdiC*Y!QGY%Fcj9A9=DPQFtVt!P:!L/JiD@^kjQn
l<V\ZB 1&M<A9Bn59C\b9aPj?V=eAu5hJQ/@wEBbmLi#Wp=MGpu=DGFBeT+iRZAV+tB>MCDYkkJTqJdRuT\c^4c
ZQabJQ FZHdPEHF<@ILZutju<ZMhjAIZ<T&?K#@bD5dXH^tatJeamLnAj$lqeTbnNwqy^KQ!BRY#HX<DZDNGB@?
=:wZdt @i%>h$QYDiehYlQA>Sl\Qc\y1G@mhn&%9BW%w<L^t:$=1dKM4GC94EJ#SWu+wEC#$^HX#$4!kP1m+5Rj
HtZk$Y W%Tnk#Y<KX>dtyMTjV*pmEM#?b:?kj#I>@LELABRYqcP*n@$pi9!ImZFqwu9JDaJ>a:HV^/jFC=SIPWy
hyH&&E Bj8qm%F9RYXaLWkJwq:nCG!DVjyDZW!N\#!$TNk%A@!kyP#ewb=<LHJR>H/REKi66e9a%Q/5j>m6&NTe
lh<V>8 J*ZNuc>Sju:^@BHnHRhe@IQeuS&5n8#d6Yj:cy4tBtM#M>KEh/@?WuESPTX+tNT!ie1cVyn1y5/i:\Pk
kC^>ej u#?@ceid<uGS+Sh<##ycGc%+Tq8pbZDe^5uN:\JE:Ee=JVXNui??@l+b:u*j*qCT?aDb$NH1lAtQ<h+h
Ymt8e9 Y#h6YL6tNduKaI*?iyCyS5bH#Y&h*RNCd$RuyieWqhe%h#AQ>H=<iNZYYF6?>&bXbSuw>>4cm6\pCNtY
@!EIn5 J?#ek!/HBRih<@H$8Zn%etmau^eBEZ8B8/ju?W@MmQ$KNDw#H$i*eHN#MmBmJ$Vj9ZNuXmTc@Ap\w+#e
aNl6my &ed$$J=6ik=NQV$EQBP?:1Mw9kmL#1L*n$Qe+d4MI!V+jPId<b:waeAVYe#JDdTJ#TVF1bpL^WXFSMYb
tkHj=h YqMYLVX$ZXNltdL!WqmqW!^ZA5\JP+WkQ5&RqB=/q#@qb6E!%X=C$%/y9\uNVV>!*MLK*8W$ueclP$W#
@dl@@t R^C%*EI5n\LHm*WS^^6N@YI18mwVA5*$kiMKGy@tS89R>PdGyICni1$$dl&D+&:Z5yydBR688^t9%KVS
KF#hSZ Fk8n$Ih84*Cm*?yjhAb/SdhYN#*JmL:m=&S/aQ8Gqh1c@bQBYSnlP=tD!!=!cH^H>NDj<*:wM8FGDSPE
!lE!lm ^Xuyj+a?eIYBabwu9nHALPSdH6<y\#DEPeTEReYMm1&iIVbDDJT%^C^ELVaH<%R6jmeuD!<j9:Dw+L8<
pjiQju cRE=Vu8t!JRR^<p*wncEVuHp^mdE^VMT1AeWwM9?EPR+teKNYy$@VM9JIZLb<l?Y>qECiL96!:9P/6R\
FdB<eb t$*np?TPcLJwCY/^<L?jW>@=B6&>umC!KMG1%JImNEu/TVtcBp%YepN\41ty4RMq#qLH1Ge6#aieP/?p
Pw+ctN JPW#E?Cy#jZPy64T:PS:%!+eQ6qE\HIlQ9C>6=YRl5k:>\9>?@AH:m1Q?jJLZk><JQF1+T&^Rd@MdLpF
NFXNAi +#<w1?:Ni89Y4X&Jq<aW1^XJl<SRJ?F==+ii=$^jGcw4h^\+aij1i?qthAy#P?*tNWm9k++cGS1:?AYk
&D\D*! E:RnSn6*d%8yy4Z^wPu^R!at8%e6FlhdwKKt4E!yWKy##ThljR?\D9RlYK8K5=Jndq$P<n=>$tKHN5C/
BmCElA e1?F9c9u8W5+<qa\K>^Gj*:wjQapP!p1I6nu6L*F5aNG*D5MN8n4LhjXJ4R&k=lAt$lGB+>bun#6G^\S
4E&P%# qbnKLJ==>cpQW9Hin/@dt?w445YWqlVpq%XWXlTq^$cee#ql/8khA8w/$N@VK?A!!P8LjknXii=8u6+*
&n6je9 S5G!Z*A9*mb$@?^JcVE/1MyK^\*^!N55piR6pi9Z4waFu@M?/&S>+8D8LT6PNyG\Ilu9?Zw5BWRkq5:<
K<h*/% QQF>=AQQ?$wQdpH?%@$jCL\m\jk<ZL^<jALCw\^mlGRR+mVSwdXAZpFl$YDZZ#k4FT9Kp\+K\4KVtu$P
>jD=:H ukH&q<#qGK8/XF$LV:+#PuDp8DtcY\q$4kEC@6LJIpVHhLIK#&aAuJ9M@iP1P<6n@a:ycj!pXhL+RD4:
eZq\5l JhT&bkcd4*%B+<dF/a@1&*qL:uphZkX\LlIcb:cyEGdBtVKVT&EJ/>cc@Ae*#y?%Q4S4p=/8=l?Mycm1
KwVC/L mk1/me:EWtcljiNd^n6/D<<:C^=BIiEbM#/^Vu\dj5>h+eE6\Q?1@\Q>HiM6*=9m9#dwJjRadR4CM&cK
mHAm1H C\>$VtQ^!WNnpMhCw8J?k<*b#F\CS>BaXSEEw<SpX5!EMaXB<W=p^<VF^5Wu^MeVCjSEN4\ylu6EQW^u
1w4nC^ =LLuFeT@Rm#m4dA*:cDCV1!b^8J!kV&PwR>Lu1Mh%!EWSmZI>M#euN#<R6TM8lVQN$NhKY81mSwK5tL&
GDejBy y!X=mMYCw8!M@&K^9Ru6hphhDVyp*<l+^?ml*9Q>8nyu*n!61*V/:$@$D@V*ZPpt<^a9:96K>6DjEY>=
-A#F=Q 0006d8eba79001202b3 Page 252 of binaries1.zip
dtJhmk $+\qbYSu\#<VLPQ$AcKj@MQ/?\?>*:wuZG*=K9$%!>G1?M9qp:^#5&RkMjp>%Fte^i!=lwJw9JuKl8*:
Vy9F:p n>8i<5E:Z$\\RSRGB=n5*ddj&hj94JP>lRtA8XXZVZ9#wiNHD=ke*LX!\a!bT>VWXXWy%Zq11$PTM%AS
D86F8K h>j:H+PwZPX%&>QK\w!p/B6+*<9WRQMbddHtilN4^:M?IG$lmydYkTTG>LZ@e*hVSX:K@Y9BQ1/kQ@j9
CiN!Rm &5K=ajX!dVSEiKPGy1:i&5*dnR/d&4y+BaEmlllcnQdD*@?AWN**/W%:e*%q<PPC*I!ewyK!$1!H6!>=
$?i%j@ &S!#QPWdEuwlMMDZ$#5aNaj$JV$JWMN#Qh#9w\D//h&4!V:n=cZF1Bh+Xkci:Z&ZnKS8WVjF4pYEl%+I
tpPNFB RFhenlu9MqkP/@E6&LtH:%ia8ITpTll/CtMka:nTD@MIC9S?RR8Ti5Q*?AD!@jDQ^BkBD+H+R@&t@yD>
ak1*u< M@@$>+VQq%8$hPuC\W:ta$CqKa4qV@ICSCYp=quDk!mc:mDNXJVW6Fc5Yd>q=%=np?MYNk/u*Bp$Vw&%
yT^!=t @+Iu/pZF^JNNiL+GCy/d#e<q%HcWSu5jZ5HpW&8Hc&SJi$tE*TcNFl4Z!q&&RRqXZZ\IaH*Ae\+j*\Vt
C&88n\ p\Z4ZVTqjWSRTP4M5=K$1FAj^?N:Dhcki?YWPwukbLcJADnu#ka+u:%lkDX+jwcJmM>eFp1jaQ*%eRS!
V4ljTm kVSpm^?j*:&n9!ZjWK<FH8?j6Md+&MAAA=ap+#jdu*:+j:%*+XKCw8Lm\wMhVE@F4EdJDiAXFyP^?DZW
!6ec$Y Wbk=qSNka$AGnJLb/dCtMmm8d^G^$VG^5YReAjGVQjEBTt9JbC1JLjE^BE/kNYG<D&%en\#ATu^SE86:
&<&TA< cAZT9KP$WhC<LQwCJt/*$19d**#5:ajA?b1m!JjW#J:4n^<>V59I!5uD$#JKkN5uFSXEJXZFWp*Ye6R>
Z::%y\ jbLQSQb^$j?FdPKh<EDnp<?I6^Q9&Hy?M\mKm#He?/tu=@%wD%ipq6^C9eG9BJkHq544?*wRQtXqbKZ:
Y/y9QD &V/@?*8EV:&p81tZ%1>ihujut!:SY4F1qjbR^>?MwPLJp@IZj!mK@8jVm=K@/V=cMReX%l98P&y>!mj+
9VqXQ1 ?n&$ch*W@lLZb*45&YP\*>uH=:TV9jul9V6*d6bS$#E+hP!\$iED&*Zq^CZqWX6A8a$^!iuAdZQZ?%/I
AHpy*% hD<?9u4SWFGR<jDi>W9uQF^5n/*ZAG=%6y9b8ZkElF^DAdWTuYZ>Hl%E8%WF1VHZL@1/&y5hNnLe8IaN
5N^Eb\ u&?8%>BcwY?\<<BST$i*kNCdMR<km\Zb&>u#4Z>5/Ch1VhPR=y9<PDW=QTe@Q#5qPmLR>eSSt>MBq!CB
R#BJhc >jH$>L>$JjSm5D<KyJT:uJ9:tWeD9*CHu4cy@BWlt=$BkjSBZQRh<lb=e<cNmK6ZLy**>\Spn?:j8Xu*
=##REm =NM*d?l9mZi59?A^5MNn?DkPwbM4WyYHj>ukX@kK&J999k+ZPu9l+@:#taTu\u\CSDh/C8Jh?Tip=m^a
B=@Gpt 5tV?WMhjbM5Xu=R>ijEdQ+GY+8^yAVZ8wL!m1mdcw61BSqGc&#mihkNtNVZ+BJuMEtn1FDw5EtESHlhl
iJTk9V pYQR?DWNLAIj%4eZS*pa/@dS1mCp/q6e!tmy8?i/ZjM=nW6u1:q9XGpuV@YDRLMNtnSFWSKRJRWJ+ZF<
VXeL@w 6k!+!kSX=mSeC#^6bd^6Lhmhmc9IQ%#uAc+L:J?T4$p\Bi59PpG^Mab?5H\ai5h%C?!kNQCFBFVy4+Xi
#Ph?GN *j6umLjwRJq<^jKT:Kc/\BbhiupuSASE^YeID:bQw:Z5TR9aaRLbad44mnXiImVM*H8c*HFG8MaC46@D
C<knQe a?:hn++la+p+Sn^dR8ID<mGSSD&awnW@admQ8heMYXF#RbTdpR/V%nGkqXZLRMDmZE#?5?=*Z*+NnVHI
6\uy>p >>RIQDClD%hma^MTp^+>#5nM#5:NJ\9ECp6A?cJ?bbZX%cB/1+w\4+XF!e<R4%LViH%YnW?aAk?ejQ4/
BuQC:P NXw4%D9YV:*Ed>c?V\Q98D#u#yt*=9MuB6mH<b4*>pL+jYTpbcS@5d\n8%k/!R/!ucYNdKXiWC$5#<qt
8m>9Pn 5/PL%dX%q>Nk1hV?SdY54K4%#i88^4K<:K\y<RFSNucV@Q?\il%6NZ95&tq\\NHd^>ZS#9#\ul*dN&my
#N^h$5 /t+:iMVa/NA?R?&=M&YXCNBKe>hF@YWXb=A9$hqTYtJWSIm@8:PN!iyu6CWc1\=aPb#&S8hCKTnE99#a
:@V+M% N##T%>NcY=!SeC9W:#Tk8tjL8yXcLB4>6QqcK>h6*Z9a#Q/$:<Z4>?KV$WWPbwZK<M<9d:6cutX+SJQ^
1l>>n? 5ptQM#JTat?FiNphPYduFkma?uy:iAYGA1du<G+!=d:R#h*D5?^Q*:iQd%?&M*NV6M?ED!NRdI&>F*u#
S=8!&1 %p*!l8n%mHD+dj*hZWHt:>?=TjhpA@GciEP<bj*aT@=m?>**cikh>bdde!a*4@1uV<AyA%an^&%bVl+?
n/VpF* pyiD??i:Lt^?1w%1JX>IwbLQ=1ctw%I!pFdNlSXcM$u1E<Y!$6K1F/>jh#+6!<&cCml+mY=eNA%XW\6d
h>:EXS =#PihB1:Iy<k=JIEkEyMA=XXWw%AyF1hV&ywK:l>%pkHpe145><491+q^jiAdnPNT*QDWjedBY$<>euB
q5*^uC XkbcGpym+:lFG\8I/H:R9EJC!&+XQRJXe9LaL5lENZ=lVMYtMMY:^DILVnc<ipWHP+AXmF>59S@jD4:q
#Qp&C? >kAd1H*/CIVT@%1Aud99:h@%S:=aQ&tA^1Mm@MJmawKD:hMRLT&6^Aaw#eWLeC1m^t/W?#<aDRNGj$de
*p#Tmk n\JITcCWH5eXD=A?TH#IiMCY<InJcPJAH<YQh+jjh#@L98t!jS\nP1+^yMt18=9jMT!=:MW4hAw$RZ!k
Ee9!+< THKMwMl*%MJQF/@hmL^#L#aSVYFI!<nM!5/F/F1MTc&wBEXepw?FeGFJ+6Bu=u&LTWyj+uQklN8ZA\:a
:tm?<c N+B=!Djj**KutenMu19d*aM<F@GKLZ4?LEKKVX41J>8:#9<Ap*yPNXNN=weZ16K$6NYRaj/TYX1C1n4#
^l9\Qt <cu96JXlw/t/kaptW\EDt1@S*9AF#%$:DQa=iHt:PN1bHh1>jh6cDhZqlkhNDlkhNN1mMYiYuLIt1WHT
N^H9nY =84jTRI&c=1:Q@RNn@=BhS:%V@IiJ#A*i1$Q4AR&NVehR=6IF>E=E+VSny:9@YN@QuW&kG/>e=q=#^+y
8Mi>85 L>y9&ma69a$:nI>d8*lh8HwuBq*E1MJy:MnI4/@98q<$by&P8Hu4huVC\+i^6<QQuVE@CGAG+GqId6:u
K55y$N L%$<H?V4+aG1PN^J6@qiRX>@j9@<@uXZ/>@Pdil$JTMNAtl<VNT6G#h9E6hF4kKZkV:8L9dtS@d6&Kln
wt?6=d *$CA!iq9j4@qjt#C!eYn%QYP@l1N*PK:L\uKnwiHF=dmQ^TbuyB1t6F+TEJ1>4#=e\dd5eH^WqR5^TMd
@dQ1eV eZE<e!&tMMPtnib<JTcM8*CLXn8Z5>+MGwi/QGTmDB\&TcGJj#VPWpW$d4EPj6VatujVhbhYH/&c^18^
4m69+Z \j=/aZ6B1KqiE+%La+*^1T8bLV^Nn$Q66?5CnTR9K^<9!Wj!5\yADKaES!B$Cwy6!e?MCR>\6hl9wKin
@Iy1K! ?ZMcpqMHN>L#:i6j9tT<Gu9NiDQ$llidRLH#*Y6kEbSmN@>jI@T?\VbANLIBnYV#t1dG^tiHlQpESaHH
GZCW8K 6mq@XQc@1\/H#QlaG\&STS=qy@F+A*n<jj*8ZRCTBCLy5Y^^<jHnmi#^!hq=SC/X^=4+m\unu&<>*jWb
HmKlaX +jaG#F^$DMG+/lC@Y&SGDcwHGB!qp=>A*R+CnP?ylX<CA+NCLq?>hTe1Jm:^aXJK/8PMdD\PBwBEi$bq
VE6D5d BZqMmX9&+Ph$GL>Mk*E@YId^c8L%GHn6<Vjej51!5?hwNL$q5Gq+p^dPqJTTku>@5L*ytDVNQ^+6G=@6
t&G<?/ Zcm5y1GlA88n?u?B#J+$DVNY:qt&c8MP!EqhjWN8S1e\e%JMyQe8\$%G>y=iLk/&bkh*G&=bw/G&*ND+
EFwmK\ <D/nA$cd%YdQYpnVIwHJ8Y5m@+9I=*Xq8cu^cNntYWjLQd4QcA6%h=udw#Pct#FAjF*LK!B5/N84y9Ke
BFW&kE =H6Zk>\hLW#&GK#YJkFIjR%h@c%GJlbPHwFZI8<uyGaZXVT<iIui?Qi*>!@dt9IeA<=jDI&InLy:/<y=
!cZWuA n=NH>l>Fjat<9V#P8H6jCA+K>QQ!JD%IlKNu\N9i4^@iwlqN#A\W$bmSkY4NEtL9*:%=@eaNq89pNhF\
IdpjBK pMHVkLT4:!dB:wQkB5hje@5yeuF^L&q/P\E&J:9=H$y#e9N\\:@j*@\NDqM&u>u+:NuiYinK9T^cn<nt
P#C8?n 1IGNInBblJuMaY+DVAZIQWyLqhRlAh&+hhi?R@nE&e$ZRdqE+D?lbBWSHlNluatb*GwhuN4$I8i/5/Et
4e5@i+ bqL*$LtW=9wwy<$cnVVPqZ95kXm?q1^\y:$4NJjN+PEtiTlibmhVNkmRE<#8R$LDkkKmc=Mj*k^&6#Qb
/<@/yI wc<L:@SQ$j:n$1/PAEPMk*MctnJD+^5T#ED9F8:/c+h94>9d&/bSTVY6RaWAi\Z=BEXEBRjcyq#V>LYH
hj%?E6 qi^WtI#b4TVAVD*@a=@wGwQmGdl??\+C<#+S#amlaqum!HntNCQ&8PTeQEa8Y%:TD+CVMV:$?!9c6A&%
HK&XjI Y5?Ee%^nWJN%p#uj8hmCy8:***+Qn^PjKBb!kmAbE\RL<Cu*#hQb%h*uZHAw:k<aHS9@IPqSinypyLqA
R<DHR5 KCBcVGA/u##+Nn$B@WhutQ>?8#wT:EN@%jic=>+8TYB#YVd+dXk/*d\qm<HLTAKd*!HjuEat&Y!DuNc#
n*TWMd uYm?p:4!aN9@Sib@mAnd=W9ZdNyydGy@^9@T#Xm$n>9e!WVVb?jYnZ95QD!hV>1cG8@cb4BcZZYq+aFD
EjmtL@ i+*&:>twQF6!mba&CZDPZZ$>KT&uyPb=><ijmKCiLuTA>Ck8<5y=H:TJ1>XIY/m^=yC%+%uj+QA:CYpR
E?bdSH LD9j@^ke@hu#A1ie\inP&%/DXXwE:Sh66cdiyq&H#P#hA5JR%:HMk9L/=%*9j\!NAjK9&y9#4S^Q8*5H
\#SnP? lq!?jCuR!>u<\F+Vt>Pi/PLV1dP?IGZ>9jHiEPY&<K!dy&@u>$?w<%lVR$$X*l6CiTa+JNV=Ni4&>Y9Z
ild>hm 4%QZ1AnSeEm8#&E$Vjb6*/lnY>jFAJ8Q9ly/#j+1cle*!eW?N@9%K\KYJNWqYDL:*=ypLptYFlKVTVXT
RjtRn$ #&a<*VqVAmTN:GD4Z#SL1GJ=ZKe@QXcAR+!#YV=Qjyt/6y:?yt&:eh6T^>Nij5Ct&wL@ayQCcKwAtq4d
WXIi6Z dEQTu4hpZZZaApDXRLne/H!u9QY^4=HtM^1u41FXREK>RF9inhQG1#TZmcEymCRQCZC!wn8NdIICA8Pa
A5cRTJ VH/SqXFSad:PbpcdXtn%@m?a56L#dY5JMAQn=eT4+Xh5&Ay5e:JinZe#89mLy$#\>hXj%+TabGppu%FQ
!>D=MN X?:EHiwFB%4@d!nV@@ptt?WT<MyyNW&VS!qA=ZDpLa#qQRb\KS\VG^ejl+aNJ<VH^\KX>F#Y^EEE=Sk?
CEW!RP 6c>I8tC&bk4KIW$&ub$u?eKT!>6iw@$kP9pFImbBnDIaRPWHT1:Z@@B^C*5ZN/?A<!Fl+cljSVTcB5Te
/E1NL% E+bct$>T?jDVj%CJ/ya4C>I\qdc%JF+njc>+W<*pbNF<4$eh!GeSZd#NSnMqJCS^!H#hN5$?hlnKy@h&
da5VbW LqXWWXXXGtyqTwpyKmjq%HR65W=l^h168\>dPLnlctX$::D#LedTh>iYDd65*Jqa:6^twKi86uL:AiQh
-Ah/Pj 0004eae7f9b001202b3 Page 253 of binaries1.zip
<jSFIB S96*d%CYqXdR%mG%KT$=:ZX*@uI=M9L:&:9Pyy1TdMn>Lkh=8>1dd>X5yC*RNDl8/?ISePu/@cT5p41Y
YIjYMw %=A6>u@8dCnJTIkM>ZP%Pdb9!&yNB8$uVW%*ucH^ed9Vj1HZ:/B4T&W%VS%99\?kLcdZHT*FN5auLP%h
T%KwB+ *L%>QN%edA:9&uuR$8p$ia4H&it$V+Cj6:eZkyJ$w<:P<jS?nl8TQ*>YY<*e@MqG6:FTp^<t^EXHSSLZ
GbNGHC bq/LmLl/Ji#TlRAjN&hdM!cT6b%E%$R*@iZkK:bWM^pGF&6KP:&d*5Zi&dTLp?Btl$n=m9k9FKtuM/J&
1lyt<# mp9I!M/YHt4>=\AX@?1&9!+R4<X%<w5XXGmwbGH:ZtPVE=cRTZ1ja>Ba%iSIAVwi+nPN^Xq1tEY:T?p6
*$+W+4 ##P8&G@GLQLwtkSu6D+JN>h:T8QW&uVe/%:X4QcmP^=H%&81#PLp=PLp=8ICdHn=?CdLFH+JCkkJc%/>
<DZi<C FunY?yDlct$NJwk#@l9Etw:PVu4ZcDj%e8Rq&!Q$&:Pu6HjDd$>&Wl%5&ACeaICZ4hNRbBykXWMWlqFa
:NKaEG aQAF$^qN5VmyE/dWGan*&HYkCIR^nM^1lEpa:\KMw=G*IlGNWa^:=H%&=5+QmyPeejE^TVtkaNu!5lPb
BmV1qc J=9+NPXJ+4qni1m/eJ\&AWGTdcZ^Yh:I#L18h%>?Dw$#EI=w6mlFb+!#V6BJB9!B@EnNJiy*d6%%+Km=
@k/c?B uSME#aCk+LC4pGqG^!apJ1e?V5@K!tHpV?T#qTi>R%SK@niX6<L<>&FLMd4G8\hie1dc1kKXyB^dauMZ
Yc=G<Q mY*F&?dJBFQ!P<9L@*XdFne&Lqba6p^bj8DFj:m6@@Dd#HC=Wbt&C8YYXm/iRXj9MC<RhVQB>N6q5H/u
dQ@MY> 6b8Hp:&N/aEhY#i9WFXdcdl@@++>?*i6W=KXXhLSJZWwdVuh:ZGVaH=m=wAhVhWqYep^N<Q\+eytAHP?
KWe6V? :t/Lp/i>k/=E^1jtX$C<:B$i@9Gt8V\uKTw<$P&p1dGl9lah8F!n6Z1L$XF4ENXZI/MjwL+:nY%999cQ
=yRd6< D@S?i6QX<9T?kiH8A$jM:W:c&!L%8&Z9MX6:?=Mu:i%QiZy=wQ+pHmBnKRB#\Sp94@1Q:%/mCYLM4DIZ
i>!H@X djcpkw=>pIBd:ESem&CJIK?KZA+LPS@knhp$&4=S&:cG:KBkkj:5bp8%Xcb#keW:pd*JD4bYN%mdHBA1
XL#jNl Z&J#V:GJ#C*ieH*DnJuT$4KTA!@?5qt5PF&iMFN=FCk*K5>j11Tt6Z#N*?Ejy>#>AqGpqIGR>y>$n1N:
6ZT>Dc ?A!k$>A8NKPqKT*WbkQRYR8Se6PytN4tlNNdNABQVj&Dy!NL?V8j^QmbG&l4LPXt=!A+IhD#<QL!$RFN
yYbpwQ FkmZR+L<R5K1=$K<HI:9&cC4?YQcAR1V#nt!$9N51>8JD4J#4I9wH8%ti+RM\JHR%NuXSZR!P6nd5RYR
p?dkVE YPl?<cIFDQCQVcylXj*%DWCuwDD@\A5tuCZ@Bie@::SStX>kcy>ui1*RR/B#+6+%nPhhSlVLQVKKDY@/
DNFh:$ 5MTTeXR5i<^DlCh:Z8bD<mj#6LQ9<=9Ypuk@p=ZV?F^*\y<*y1D==Z8<&@N%e9R*P*%<dJR^#Dp!Np=u
TZ8Z^e AKR+iQ+!wC*Z*:Lh/QB^T?DW#V9k\1W4EEKnWI9<qJV$9AITWX1S>P4@FV9*&Xa#aL%MhQX*C%\*Wbhq
VSVc%\ hlq#K?+kaM$\PnliNplJTJCT4BIXRCqiNQ<a6Y1w>%FHq^$W=j?<?PjQWN:#*\:hieM!^SZ/Y*abt>wB
VSP?VY G6j9Qe\54H#Y&6&DKR*ac:B8l?Wbh!h:/^QGP:b5BE4%DI*&d6&#d>hc^hq#qbe9J*WyHVuhQVFJn/ew
*%b:@B Hj:%>Y%Ha*X^F9MI>JVh<R$cVdV=Gt5PY/M>wImwl=pq6SA?@+#>?hBiY+lX4bQFwb*46CiA$pWcK#j6
X*&mwt MdF!<R+P^*$%mm5l*j#<G^&k9P68dTyhSX8ld:BnH*qw%wE>B9y46^$+aY=lcYXl:ZntnP8yM?+iPNjE
T!P#y# pHyW9Z@h%hd<6Gb!=\jjqE%JapdQG%i9SpVM8ly?>i4q$I6BAh=ueRDh5XHdy41>uR:4hBDYKYjZ6eN1
QA\mBW ZF\Md4a#SS%EJ:&Dctj448hueHN!XZSQY/ZI+4Mc/86>%NC!p=aAp$@KqiIm^d?eVuPMaQP=KIn1/K*h
F4JI$X bIkW4aYN\&qQ@\5RShYqTRFYQDWVWKYE^9<LXj9R#BiN1bi5%tFWIbCG=LaZBJ9w%6M+>Qa/Zm*k:clP
Dt=BCn CLLb5X^VqR?N>?ZmkHAKYNEl/iVka%aND\9!CRp48Q8:Yll9%hQ/@n?\Rmmhb%QXSwAb+Hj8G89m?G8F
IXG^Q= \9cJDpa:Y%eh&ICD1:^4P1npW*%Wk?Gnm5y*Bjq?6#Bh%STwKDR\X^%V$+MJlCjD/GTt8RnX/T58a<<H
n+nMp9 Wwua/#eS1ujI8^V/mPIEX1Nnalm^:NGJ&jtRc&aq$JteD9S>i6%THPN>eAYVW#y\!k:1@^J9Wuudt$>>
d*5MI1 A/MM<l5Gqb8BKB5cHCD:?ReGl$eR4ASBRpTXG<>c8GCy19c1>X6&:Ve=aYHuhMdLH:X&8S+bhV<8NmtZ
iGNq=J CY6X$69@J/\&XWR:A\#Y*!X<h9PC&e#?9w5Mwq6BpuRR:i!99nyJEJK55&^ahyQdiLbd*G@EG>kphuBW
Ayj&nL 9dZF9IXL=PWX=Q?$@EhIubcBI45qHq161Km#i1Ql9mQwpDH5Xm!#q8kqE>h#?#c9*Yb&&5*J#94EAeQN
aEBP^Z G=i41K:e6uiQ\T/nujwK5?XWq1>a9u\F6S!m/9&HtNiZu*/lI\>WT%TWtZV@i8k=V^jdw?8A%*tcBmj5
FD6uZi VupGl6/MVe%DWdX9iQn:1<c!VFC:@1h6n8:b1D6P//Qy/Y:ahhne!i9CbhV=D9ZhAAtN*9N4#<9&=*Xl
YI&*6W e9QqpXp*dh/<edZ8e9%6B\/bHDq&>IRNtl:l:P=J+IlKubu9=X/Jy*jZX$%6DE*8V<jH*EeN9eP9S4Be
4ND?bu JeQFMK%imNan?*b5$4cydG6n\KKe/B#9an?:iT/5Wwmm/??*Mn4w:i^64::a\:Lq6AGVe&<*9>eIB5eY
Z=tqc% b&pk/<Z4LGVSuFEymV<6j&p6XMRtu\\1n=ki<8B1lVtL=Jiycc%a9eFk^%:nw/bYh5=uje=hbNC+%cYF
*aji=: kCw$tw=NkB<VT\t!CNAF&aYElaRtSNlEyhRJ#G%a>w6un!/c/&9$$iywQBwdV<W<jZdjeWMhnWQZ$Dw$
L^$!$d t:?6Q8YTw>E1VhyChn!at^8S!<QNA$pyHd#BCL\#4@CTW&=&S*c8%hZ+@4>d6$C6hTWw&#b/?&nHiPip
%?FHAP NWD9449@wtPmuY^nd**=?c<=iMAe#*CiSYJ4WHX/F6LeQH^<Au!@u@<DF&8/Ka*B>F$HX<pL<A9mED56
4\p$#Q G<Y*/w4wFG@e%i5*dpdiS8niJ8>Rh#tn:6&@F^*NmGG@H=?F\M&PHj<=YcD\<ZXL+Z*QA<8b%&9wGkPc
iN&JPL :LyG4nh+MpAAj$Y:SF?yYbCQM8ln\+Q>j*:@?9u#%?<@@aQDAC+#!M+lYydJ!M^byEVVZdN^/&:nI/cw
w?nNKI c5Rd$6Z\mIn:&WWEWM6iqyp#>GZcMil@aI6MlydRiMhaJ%?k*R=%&RX+Mk\y#:dpZDMJ1+l5+&*>?uPl
GWH$+T qJTp=K^b^C\8Kbue?tukWuZY?&TSBiTZa5Q>F:qVV6>1@/yqC>X%>Nb6*Z$IA1*QBbDDcdk/+QWHlG=\
k:iDDe +Q:Nc\%PuD44cGiF$N&kw/!16*Z9LwNhi*i5Wbm#RF%9=awXK?eD\F99Qp#>L*RLM\DhT\EiLnbH>BG/
kC9J\d 8456V/IPYuejbBTnTN5@>86>c*X?!4&4RS+Py98*/GpkhFh14>%?$N#SM\n!XNTdD9LW#9hIbH>:@^1N
5KNV=& 6W6ekp&4T6QYy1twcK:c5u*ZH1N>^5i6LM%5*d\IHGcBZI<#6%4\^lECN*<KZJDCeZle?BWI5WD8FSFE
#X!=<i 49>jeuY5K\m<Xwe/8M/B&WY+8Th+&CRDtyDBmXd8L*$T9JACenI+PLq=e?4@aW9Xmhj8E<PLd^aa9G!T
SCMD=n &\LFTY:@Kl6pedq=m=a11t4k<94h?\?lGdw8:u:uR?p$Llpt6\\<VuKKYk=E4VB1Pmil^5V&ep=4R$1\
ej1:tb &Ywt6n1Hk@Qce\L*c\K&Yl9N#n@td&qM9?y15q=LW$PBp&Rq&QnaWeDqAt==kX!Tn=XjAKHLI!!=*hdW
GZeCnF cQNK#Y@@N:pXL%+\\B/n:T\hDKbFlJFFPMAm:i%EG:&X=<W@p*CBTi1twd8/6tcjIDe1\PZ:*j#ZIqQ5
hPD^i@ Vm%BdBEbQ9/y1Q6ZH#QldcXV*A<9Z+8+eT9!FmPT9E*h+WK:TlB&!j5e$jibWVeub9VubL*C^%jQC?==
dHtucL :NhF%&IbwI+B*4ZH@YN=my/n8%pnhAm/@AniCV^F6c?Z@CHR&@j#F<IZl>$iTub+y+!WyITM*PJqG59%
9=pLja N&@ji?mwlb*#cR?@\ICI#GLMd8GVlN?IZau@*jENMLICw/FFSLdQ4W8/ePcWC==JbH=k5<aC&RZMXq^K
H?SnG4 !=ayLVXQlyiR!Ic9?u5Z!E1DdPbB6@@uJ+^*@iYa4LP=5HdBAk#!#?byDnA9N@!WnbYF&aunS\@9&/cu
l=+9%h 6umik44&!4Xdhl=A6?MD\t/m?:KX8CjPhXS<FGm<WZ@#WbjVD4aI=E*4hbSXXt:h5<6k=^=DQjt=m:SY
GJh*wT 4>LVY$t8uL9q>kMt^=<S^=@j6MQ9lc8QAuBFk$a#db/G9wtN5*9AyS5^n*LLu*XAan9$4j6bTWd<#SCj
yFSGc$ W%cHh/B&^5C^=lyDa%MHD>TVMmayQc?p?qq:V!</?Qu+yk5NmcuWq$btun6@$YKpeyc9Z4>y!=d6?\+j
Z8+J%Y QuDmnBe=!jGC$&je@B4cun?41*^T\6#@uew1a?/niV6Z4wTHV+F<AaF5b*=p@+:NPqdqBF//I4XJ=/e@
*cGht/ A#pSB5<EL=6=E5Ie5q1SX@$@^AZ+iLmAD#=BpZ6nZj>e/K#ctk64$cHDLIqbjj>YeL+mMD%y@YNHD^8B
<^%GYb >SjJ#y/@EJmt/c\En\<=:lFVc*9HM&kYCEA>Y*ATctcNH+A6<Q@^>TcAWLdj@#>n*<c?66F8Z<dalYSL
TAFBYl KyY%FJW%T:cpTI1m:FEy5lRl58<:WTwXtcS>p#d655*e>@>e>>D#QN@j>@9@QJ?Kacdte4*Pib>#ui5e
W4cS^Y P6MXV<?uwt#<Ait?pyP:DRHyQ9DE/\J#:>!?/Gh!p<JPNh+bZe#jQ%l:QtKQ6T/cp!A+!<yFapP8tIPV
M<LjyS \aW!^C^<p\J$Mwi&1:PN5e:a@\c#4FjH\AAh%wT:q:pm?@h#B@mmJXpm!MXk45uk:EQ/wMnAp?<j@:Mp
$?4RSq \*?SN4ub&*6!LSeV/5@*@1+I5uKy\j>ipYXm9HNME<HH\9?$6Ptd^jtjJ1YhTV>::9\=>H@5QJ:JDmH\
bE@<qe yY#GJjd54N!Kl6p/Wu*P:@G@XWkQG4MQMcqtEFT#/&+JT1@k/l%GSWnVnA<k8lHXj*=>H@@<<iMHdI#@
1#ZqEc \<hQZ::??D$=k:B?ke8ELWQ:VXJt<XJ=hb$%b6c&Vm=:9Q%DktJKY=qRh^i<ij>@HdJ/hlJ4^#=W+dB$
N9wMpu EdaAY+k9+yXikC+QEBhq/P45c64S>&FH#R=!9j+#ddbMd9FmRhuqK?W@aX<jwm896!EK\Y+68hu49RI>
eQSdFL c:Z</5@*@$*#Jieqm^a8kBe&Y:Sp\TKI\nS$DNbCSLuVI!D5cH#c^aL!?k=CWd<ueD+ScGb56mQ\\H+j
V1ubD# \HtDtTuCid*6J56NY#aaKm^iyYiMGdEaat5YY=#:L<=DIDE14&cu#^Ww*cQI/t^Gcc1VKSeLK=6:B=/P
-ALjP6 0001419b30e001202b3 Page 254 of binaries1.zip
\n/QM@ jy@<?u4\Sn&SyjJ#&&c8P$uA9Mdcedj@IYd#?P8%LX%>R!<?wp4<$SjwJ68>@48854C<EwCKqKTMuL\c
XSiT4F 89kL@@:NG^^Dw8bl^k@IHR=9IRbT6Va%EuqnktX$9ujyI5nybIBbQDWqPVpykRt#u<hP^<&Y8y+hD:AB
jB#@E# BqlX6ky:YSqMmm:NS8du=YYkawIbZyLc$Z5MYHl5RQDX^JT85KAAQ%qEZGwWG*<+9&@^t*m9tQe!^LK+
RuK&mH yMTui<VCE:p19I+4&*u^AlqycSq5\iJF5D<Y!T=F:ytm4Y>5b4X^1?PP*b::>weRR:btKi^K\5A!k=hb
m<$Gb5 San^5<@Nw@&uIAJRV1ph/m5?+VcH54dV!h1lttN&%F+Kt:=V^GZ!LX4#yYQiY+!$AYXNTjbbXy#EBnC#
/thRt@ a^\5uBnR#M4LQ\$\e\18*44FVI</>4?h8<y=6pPMP#A:!Fb89%kcp<TqMCp&jq+8\lk\q&StpDGAQ^CB
BThIA< JhESJnPZ=B$&QkldEc$I!$&5h*GQq^^mtaiQ=?P>j/Pe:aR<IATGC/WFBdkS:IlphNNNT8b9eyubp1=n
w9!%1S Bq?epkawb=#N!DnL=Jtb#ewGN=%%Idi1EXB8!Qu?F&X$qjWRW6hVtlmBMwiY&b/a!<%e<^:/+##LcCLy
MH9eSP l@innHe<w?<@jQ#!qilc\*mPp:LWF&DTaqLwQ6TTqTwW@dYYN68eZHj=b#WVEVFdjY>F=@9@qAR@wVGd
bnYEW? YCRj6@iAqeQS!n&<4miBTR4BY&LipFSRXFFXy%C%GN1eY6SXnqeGH<:Au8J?<QDXBQa:WuYF\P46NH^t
C&ypXi jPR9#X^kDhP5Rb1nCh$8a@j?Kl^a\nQG/DIlwYdRhqLX%DFEPL95>WX>w5@uq/BJEKl6%ai#1J*FmSl#
@AtTe> I%QukFB@d$<*^\*4%twD#%c&Nyad6>kaK5nKG/:FnFtMeKMqc!#VC@<L>J&8^kwt$IHiLt8Ri%/L*QP^
u&^Wt? $^t=%&w:d6Nijb1aGB8=$%y^?Y^<bKC:$\bDVWV$Gp%DK*5*9@Bn<Tuuek4SPIldA<<@wC5<:%<@SYMi
hT+SIL :>@4Q/K$RFycWq^MSIk5LLXpPeTcENCat1#*mnn<q?kqwXEH58:j8huh*5\p8w\+@AKme=DPVp*GW8cI
Za1Lnn Ql%*LCw<&M@V%hHYT5in@V/DaJ16VJ8ZD!N<+$<?NmGH!+n#AeaD+eFZ9:GjwdJmpy98+>Qn/PIl/tAk
?Lm@RY nR4H$1^F$GcEKQq>@%?R/^Sl$a$EBMnESmZ!4LLwcn9+bH$n%JDGj48d8+>jEJ1utb\^R&EV+?eDpNGN
+wNJQL Nede&TyT*E!RXbp!t\A=%lYBjB6<5wqj%1*dF@eb>%DahLcGbjN$D*eW^Ae/tS61M/m55q#V4C\pBl5J
J1MB^6 *DLG!RbTt^hS#CEw9Yc>wjd:@=aD#$H5$adhy#>kDJBK1i!#<C!eC!hPi/j=&NFK\ELRH?D*lRbi\qKE
1VBka: wKY+l$>@Gd:#%/VlQi^y%kJeSAGH+Q8:<\Rnkb%t^ACDk5NL!1Ce?F?A=>9LER&tCIIdbuH&1bT$%DV5
?<GlPF DJ/PbYBu<ZQ5SJKLu5YYictC\Lj+GaH9BBQjT^FP?1nLFA6qG8F4cBiTWhHDPj#m@jn9KV4lmit#cCLk
6KinI4 ^@j9*4#CZyBj9u+:P9b^@Q89!Xupm=@n:G$tC^dIaNIMTRGySe5W%Kn/c>hd:VnjC9SPN:A%h^i?G@5j
a<1dc/ Bj%*i=1Iku+H>*cM&Du+wG!>8SRakHq+qaBhLS%hQRMDELL/in1cIj$a+I5YpHQk?ehjhB#?^#Q#>hZD
#PZ@M% iZ!SCjV6<XFtl6d!<t@9@w9j&8R%/LTJ8CK+WpFbDX&GS9#8&SeeEb8Recq\*l?@?+kAQuW!&tLNYkjj
NMhHAH aH<9D#hH/*WtYpw1ilad4T%6dK$N=GWX%1\#MVE&^w&ZGK&NA>4?F+BQERAd*Wei&h$QGauMk9Ktu95n
F@^mVe w><In%^ZuJX!QG#j4m&tYu?A*:YcBqb&du+Hw$?m+R:Z$P&+B$@jw+y?NJ\JAj#k\j&LPk8R=lEZRjGn
TaWNdR 8QRm8iWK/qRN\:&Sl\?Fl^<<mAG@T$QDIk:YI+>M=KLu<d&Tn+bC\D6LTp=J\XQ\bGEEeE#WwXA@L%iu
y?YbwL LS6$*h98MYD9+kP5>caaH^ymPMuQ^1eijBie$kQGjjaH##:<yDN\nyt9L^@iJ6AqAdyan:m*plC/c\*\
*=6dwM 94u#h:u4FG64pk^SX\eS\5tAn%tP&NZWMVBcB$G!QXGPGBmK9HD1iZDDGwliPm@&9>E41wl1wFCRnPnh
^&W1!= beCpq:w%88Jl:ZE:K6BL6Rp/^>e/*FPTE8c&cb&lnlbGbX*NQ$qp8HDAl5VFT=+XtCG#C<uy/Y4?V*cJ
DIZpil Wu/=9c*aQVy5Shc/6ZVknB9q5^Fy<G?cJqdmD9*B:H*<H98Dy<SK5E?Q9^#<T!:Y\*:DY=ELlDjPI\RL
wcAu$N $h\$D&=%pmF^qLYIm*C<<?Amk+bG6j/:PZ9FLM=DB>GWuI1PDVCAF#>LPue?p*GBM?9m^e^5J48N4Z@b
/X:w8: BSYhE:uhaI4/Hdnq%N9kHu8=?RHuE&cSMNQ6#p/m+X!n4%<<a+!Ru#^:<Yd$\/h^?DIC>^uPP4ADR>^K
JIL+J$ <W6KRPm&RpqV\?^$T^QYMNZA%qXS^@n\j%!he$T4ljcLSK*XkwWLF!?bR%cD11Nu5Mb+4Tt&n56$4jEc
WTAeZA bhP+?:MQ/Qe^YLcS6?>H<XH&X$N*tj5H+a4*?B+#RXE$GnmqPLiBGyk=qqPGW5\+A:qdR4%bd*b\td5w
Ci5Q:F e^Gh&jTA\**&=9%ueE8J5Jp6%^l9>R:!<@SAH6haY%qb#&KD6jtG#haGCp5XDhi6ZY6m56VE&MR+5KC$
dnD4u\ y4Zu\RmS&Sy>Nkj5GTc\^ywDFFtImL$D\+?hPuPy8KaNKiNjE^?R!<*QIF!8qj+E=VNqnb/quc69YNTJ
yB9AGM ^I!5!<YXhc$*:mG&J:=>jQjmKSA:NDk+MFm&WSKp1JT+tJAAYWlIYE^ei5tKbcw:Ik?Hl&Qkd:EDiKn5
bW6t*n wiCEG%%6Ve^5NLQWBHBF@helNEC<51Sk!TIE4$enRkP<h&@jb1P*6:Y@H&%a@AF44Su11n\q!CC#wBuJ
%LiT!M A8#<I1b^>#Da4hk>9J>$@@Ed^mnd!+h*@4Z1pnimVaRFWi5VMI19d@>nJSX41p<bCAuQi^d+5c=YXNEA
G/*Mbh <R@c&edYH8JkL>?A$IPS^$+ty%?ewdBK<GPEipdaAmdw19mWEM6!BwYZ88E95J?BX!=D#:Qh>:L>VG+A
8KPt=h 4qb?1TIN6D8X=+=+P>1a4hHV$hLTXlWn@YHqJ4GT&FAp#D5nME$tmc/mn9=9%?Vp>4de^am*V/w^=cB#
JI@el8 5uDN\ew*h@R<6\n>>Q9$i%k@&%%mDhmBX?RutL^!*PmPNlHkwmNZ??w&5RB#tc^Vilnl8^jNPX4!9KiX
cKXh*5 tS?d5uy?dE4SLM+^t=ccqJTCwc\FMI6ueJ+qJHMthwE6<&I=R4c?8jGj\HikKi@w#nXV%B?ALJiPlZMw
umhScS ?NyHHKmYGQqcuLEIFVb?Gu8H8wEPQZ\+SB6?A6CC6\Y^DM\?^hp@hIW8pGEA6Lkpu#mKd%d81Pm8d\Bt
5Y/@I4 &S9:CtuEcDTy@$JdW*RyQe=lV<9h@u+G4JyE6TZ1QD@H4JcP@lwVw6ML6wHdi4&Ftau<^9Q*b8<#aPpa
\9RbLW h%u8aHj\j&&hjVjTdJa!<%/KTww9dnjQE%6VZS&un=1VkKqZWFcuMp<hHZh/?IaA5YpZtdMT:^M8>9Q=
wnIdLT nNTplQnn/+$MN*5E?u8/R>B4c1!qyK^4bt%q6u:#ikQFyWyGb1da&1X4Vhcc?lYkl6D*=+mhh:F#6*JM
9q*HEP ELE/t+lC+/V#q<5c8@5j9^&j@Q:/aW>>eXd!<RM?P&%N1InaJdwY&*d6P+C/6%@MR@MT8>B*@yqEk^Ti
?+I&G5 Q^q=@IlBY@mw?@IiGSppp$XkL+8IwA:FEnKGIWjuHT\iKlh!ICw\9:&qpbtFJwC>uJ?Zl:w#\>6KBAPP
d\=XNW mBXKTmTIQdB@*=+h>y9$>4Sk^KdF:4NY4&MIwlEG8An<EywS^Mu5A4Id#<GZGQea5PcM8SXu:qVyG>%y
:@YXn/ Nw8b6EyITn:9?$64nYJ%Xb!iKH4<4+>XyYnyGc+FY6G<SAl%A+LDDl?NQb%/Lt8Y\1al!e<@R%RGa\JV
RNdQpC VF#Swi>Tw5naN/u&IbLH!MHiARi:+ZD^RQMJB&w*ldVP/:Sw=eBAjZd5jniHnbb4nR\Nnhac1!@<DSIb
DZd?aD a&WnejKVGRJVbJKk8ML@C/#5+kY!8=99MPDhM?/^XyqkEBY#eQM!iWZlNuq/jkZ/$j8uE??jMdjn5B:P
qLFu@C G>*h1VcL\Le!iATj>e$yDGK\?EqhBmG!F#E>K=tyN!TJYcd@HYmYBcSmYceTE!GA\XP^NB^abRF^nDJX
qM<:GZ dPe9ZGh!Y9e*:j^5wLWkh8</%G4>J=Xdi=&hh?#qy96QPFBJ^nRkJk8miGdm??i^6*M6CG:j9j@\$bPZ
Z\adJh :<a?w\91RPwI#nci9S^AubHCJdmpSFbHNnW*NE\&5LW$F+%?uB6>kmadw@+R>%F@mN!MiEjZyn6wt>D9
P/W*^P mXiaw#H8e+RcGAGkG#b8*5La^4%q</aNXpdKh4jwj^eLR$*kCD#^G##hDwyLX+KJWqdBXHe?:j6HmXSZ
Awk1!M ^i1m/e@EL6GGKG4>J496dy=?wSHA=+Z<pwyGpMDM8Ydnte\5<&bDji5>ARlRJ=8%^6yKm61t/!*liRDw
Plb+mS CmWn<*YaKd=Y%uTh#=Z@AE4:h%b1%#4NRiSTmd1M?LV51%Y6N\ijn@&a@QT$9/$TSdH:>#yc/j$tADZj
5^h^u# 86MuNDKG1J%C>%49Qu4>bRJNTun#<9uVpSHGa&!EjC6GnkBWZIlw<+MJ5R55&HLwMDcHJ^/CH%kWY6^W
RIQW!9 N*hGlK+/AJ$=&cB@$=q+m1YpRkTdSLS$Ck9!hh@q8Fuj6RtDqYj$+@ha!$$a\ykILnw4lwt!mNCFMTFe
h^w5L$ pIP5cHj#*n*/9*aup$/YG%m*yIQCuKmDCPdJ4d<Tyq1^1nJGl<kdEFEN?FJ%ViJumRchID^>AM?I1PQ^
+Iyc5Q TipZemCGZRk1iQa9u?!w!TI^l$!PCYlm#eM:%$+Tmck:FC=h%/TY\aJA$!+K!Zn*CjF4h&t6BaqlQt=P
VN4ei9 Y&!5LK*kd:Bb1<n=A^\1D@nDQ\Cu6M4:?a+RK9@1CCH4&ukd8$PHZehcd5RAtql+tGmm+J8\W&kB&GAB
Z+4Wm5 i6F?w@>>?>ne&!h%&T5\8Gh=1E>8@w9Nmll6#upSQihFSXD1uVqwtDtXTGGP#4IbuL$/QmplEW8G+CTX
<>X@G8 E+Y9cYhR>HwPQ<>&LyPJb$9%PJyN>IhwT>JXt4IjNWj?BZ#!cJua:ntaWh:#/DpH<%LPJ%\P=b\tj+^@
b\i6Bl RMeV@Vi:&69c8*4:B+ij9Z:@<i9QKWVwa=^616F\ES$I=bIWF>a88pH\YZi46j4n9$aVMcemhNSi!#?Z
6*==Wq +L^4j1&YZX8HlACVV8N%F6cddP$euLd9eHHb5h*Jah9tDad1DnibjGK*Yj4\PWK^Hu<\b^pPGp6Z!m5w
5WWB=^ 1/111&8wn>#/S*^WXS:XBwplD#6FC#Zm*GD4+LLHi*@aEiT$ANH/6y/:wH4S\NF9te^I%eXI*<LF*>>#
&C11wK 4=9#SqMndYXF4dXYF1cYVEcN#Su4eFNbM*PQiWSS/hVeiT=^C#$m^Hi96Sak14N^@4IP<^#w!<VQh:Vi
hY*d@u lyJ5mFMJH<yE%G#4V8?R\<hPyb:QKTm64G>HKcqj$:@RkQcZ#%FbQ9/M@HVp+TZ6lTl@DG=WRBAV+SIt
FBJSWV <!@*n&K/WEcwWHBRbFlWR!*#>AiXFGJ=@LtZ5m>tb5BdTp^KTbbITW6JAa&ATl5Qljl=8nq9NhnX$Hid
-A%1G? 00041c141d0001202b3 Page 255 of binaries1.zip
uE<FK& eYj&Lq8Jpckw/1PET<^K+lK+PA8AC5AKe\kJC5P1#@\9i%R/*WGDDD5R+qTWbZl</!?nXa1XFWi%JJpH
?H1q*? qWTWmn!w!V4LDb8*Pi#a6ejV^#@w\KHI/BQkR:Q#AhLqRu^<M:\5SN5$\wpKwBaQRKp5eZ>8H%E:^V#M
TK#y<H 9W9l%nRL!88@piTmDbkc8pSLZ8ph:4/YESZ55<jF$Y/duiPPua=dN8wJpZ/^54PR?AREJkBWaXpt1PnI
Cl>X4> S?W91A6qaRH/MFkC:C=4mTEKNXuAXuD#M^5$CSM&/=>q/GZAMtD@YkaeqwG6C>cB\a*^MHmyn&<&@AN4
q\1l+b ^XH1Z\$>L*tJmWMw8EP\494ZWQD4M#l@V*VC1aVVmWqJ!YBR5SSTcl1KYM@m=>nPum5qA6ZYT5CXcPn!
KBBnmq @8Zn9615!J%4=uA%6NpbiIK+yePP81KBP\Xc/Yl&^8mL+aG?#8d/&y4cSqR=P@ITyP@QTWV4I=#$a455
TuND>R ZbwpJT%Nq?IRqdE6d\Ne&i5d&/:ZjmJ/up4?$@MW6WG<jD=y?$=a568\bI!:+wYt+BNSmKy9bG1Bj4nd
yd>L4@ $V^y#IN9:=:h8*a+d6&py:cNYDV<N9$@i<e*ebQTEuR\lB1wWdYw6N=@4F^q^THKK1BXVXMHNSZblCci
CT+%&u ?KLG\Wtw*AHlCpE1TN+Qu:@>RQqVeDwi?41t#tl+mh9&nY9ZcCpyWE$5#hhcdLR&XF1ldG!BtdG5Y:4P
HjC6$? #M#Cja:a6$SJ<k6cj$>#FdQa<aC@y=*BR*C1^68>A\>Gw#5<FW$>D=/Mjy<ej*/9w/4k*CpmV6Z:BeR8
%y8Yy? %nHd+8JN#De=q*&qyKK&6i@lC>SJ>h8u$di9Z:/kQ=h=keB>&t/:SAc=XTJYFSWXFlTlBpXmSI!KlbCD
y<EWq9 R<ICnnBQiK+YFAC9A4ukWm?kGBWBt<KctwcqCmauEj&QR@hDqGyu8LPi$RiLiah$6*ANJwFL+qK+NC/D
/lch4m L<BpPFChm:k+R+^HXESEYEkWXy:a4ZVCVDLtFu=BX<ItSTFELhGMi?FCMEhw+SG%qawX=ae$mCVK$lY4
&$kLtS FFHAwW<+Xq5:J=hhi:*&BRRhCI<<FkP8NVQuCtC:+n@aakI5ID6blbaRN>B>V1QT=ASQE+JbLm*:&J1l
h^dE<e <uC4VkyJ%@E\Z*dHeF>XXq\EtKE>tB9QZm?j9V6*dLhh\9/VqeVBL@CLDAy/dB:aj<$hYCm:5@:YLdRE
ZE+Mcw nD8pRu&knkS$<jI#p>1w5h8$GQj<??>lELDT@<KKh&NhZQD??SCXGC?Dn#4W\%V>BK@ql>Tb?ct@9yXw
Q5#EiK KEiM>mS+JaJWFSXXZI&6Aum>ijS$@KuVCapJTeA5qp^KRRqmqGFm!#ldRl#Q6ycNM&eQwC8ZA/%ZV?&#
YCFSlq t1bPcQ/k<l15h@cN!4niVZ9?n9*LV<K>LpY=yV<@Q4>@>Zmk6^WNi!<y1/^4:WZn:D/M@=meBYJyPN99
>aAThu $BW!M+A48+Tw:1XGq5a@/QJ4#dZQBK:m@&%SZHA^hcjL*\XdtYi51pd=C/8nm>6iV&@jkID>ARG??##*
/uuGc% :6y8d/89alMQ*lk6G\Q%Q=@dNRJhWi5XXmAtNVT%hHR\ZbjB@!^e1B1RVNHYY<Q$448>ApIQw&pi&ZP<
9F+mQ/ Rwn/+6&Hn?M@jq&EMBXW5KiBu9E&d%@QQd6*dAbkqiWySlApt&>ed/m<W6uEptG?#N#M*ML6!4Z1qy=:
V4tD=@ I&<kw9#G9EFRe!*9jQLJw\eD9X*YWaew56w&i*%DItITM*KKc>1JE>iJ5iG?y4Ke%NmD?*b6YW6F9K:T
QnKqHX MdN%<R+Kn+=L#5nKL:=i$*J#+Qu::=N@ju#=AMC?j9Z!=c6Z/A@5BRjNc=tM6ARtLmlC=leWFSMSFF#y
tGb1LI iVA5:MABLJRSkke9QBAaQJeBlkA%N#eHiXlplCAMTpqlyAtqy1C#=*pSdP^Tl:4La4j=:8VyT$9L!C^a
*D>b*Y 5HDSI9ymjBHHRmL^DA!Le+8Jwk$LT<<AY8q#6CLjkue6PLJium^I+IwT?a5YD@VW#$WiqSX+8Z!wK61h
&4niIm SJT1wcY*l9C^Y^&eh:plZIQD\MuGuE^IP=6%8YmG\4yTCPNn=RXHlbBqEbn<m?\mlK!qh@#%B\PXTh:w
ASkqkF NkEkc?l>91e@$%$QpNZiGmy>4tuwRiPXXDCXkZ/?9u::R>BJuKiZl^4ZV%bYN4/jbHmbD@>FqutII?hT
6hRdk1 i@Mtk>mD*LucCC>Wbn^HGLlE<bq@4$HeDP\<DIBqED5QkP&EJiAlkJ*qw\:etDNYcN6hD%Xl+91Qi$Y4
jnSEq+ 6Pk94^C1KkG911^1/t#NRC\6:uSe*KuVmNuESC!JqJ\CeT9KMLGqu!q8tKpnNieMnVMHeH>/?=#YW*p8
%aPcaH *F+ZuiQ<wQLyY#y+lmjtN@cQ9BynR\HyS$R5HYVcl#hQBu8dK$58=&Sj!m514?@5y#%:??HLn#?I&Ie+
ayP1PT /c\mAT!dyND!$/!%#Z<c&B8dG/:PjCGGCInQD^EkTmt1m4LVh?/A>eJ8$YG>^LPN1hw/?t9Ytq69Aq=*
<caVTj i*n:BacEHeVC!RhDR@d:ii*b/d#NRtth#/%bAqiY*uqSI6mX/GcEppdkuNF5CpN5nh9>G@<m>uwkMdZC
iKwF#c kLl9kl^5+EHR\&kmJuFRRlD:BmumH^NEDXFmjKCyu5EtD$DYdeeYM$NAXtPN?VynM^94NTw4qa&6LC#N
5B:PE/ LbbbtJ6dYpRV$D+t44B@iDX<H&\b/p\cH*$w&Nh>w!+NuK!Sp>j?5CmmZ*BDh@@nN!m*NNBXi#W#IT4I
SbSp$R \<uc+CjlbNjb8ukFHn^/Eq*H8%yY&a#e<jmj1b@nH#?M9pMnPh/?i@iG@y4n#Rq=<LKaPBt=YSE^EYEB
K=Lin: TieDB\?AKIdANZlSWHBIpG@SQLE=RG#&BYdetkR@j<abQA%QFp!Im#q/KCVA!&&:!a:c*q:a4@R?W4di
HX%RRy Rt\S&?IqT&R^PY!yyJ#5p5YLWPNuKWqJCRq^a5e14QP=mSE8l9F*^!/C6benwCZWHwSt59i/@+1de5Z!
Eb:BGV 59%K#FTlM5T8!BwVR#yBGMQQh#<Bdi#JW<quMm>hKRF1FeRJc8qA:i<=apqCI15\RNde+&Sy@&B61y<X
G@4Nk@ IN6Q+cbcH!wicI/%%RSt1Vd:bXK4H>A/4tWtu+!PCA<LC+?IQlwiGlRaFBy8^V@F!pKm5=Ja?ATAZCtN
JFlI4M V\T=R5#y&cmGa9uTJa9qh6Sk9jlNiHh>4NqcKCZNKpDtbZyGIuE&K\WKSIJujmt<d<:PLRSPLASQb+K4
kqq&m! pT^mq^jnt?Yu>uj@m>&!@a1<j=Z^Z%i:cLE5!nLN5R9mYFWN\h5>njMWJb\+GSeQH9e$qwAup8CH^$nq
H>N?PK kyA&@W^cEeF8*5D+@HnPq!Q>nbhn>=mkEwwjXH+><&%:Rp=eKEQ*bV?^wRb1H\E?&hp@*#>B*N9ZZFGR
u/YmXS jjbMY94=T$YXLZ$Qu^B#ulG<k#myWSjk^cVaycYpSeVbA14ct!ec&JyKu#K?@l*#^^#=R!TFT*LQ8V4@
THqN:V ZVV^VCM>A/P%b5VwLniQjj6D\k+jPZwMP!=$LPyIiGnkQk?*HjcdXhY5k&:?5+MaaQWD@T!WbBZuiwcn
4%qa+^ \=>%/$^9h@&L*4J>m5\GwDawtCZedS#I+@!m<y1tn4@$kpD?NaEPQXCh54&B4yYdn>h8X=h6b5nn1lta
Qca+XK 4VNcc&N6yLwc<LZCLDELPT9#!G9X#ViI1*lVQ?d:V^SpuVphE^u1:?XpyQtII18%j9i?aKKuQ:NKtek:
//>+wM *Y$6#$5@ienQdb8bF1J*pVdR/:pjuiYe!e\68FdbiPQi!N599/h@E^W4>FHb>&Q9kYJAiQS>EbWwnBIV
GmL^B5 F^ERRQ#!C%wGHR:DRCQn\a\k/eB>KeS^K#ldaBeJ=DPy!N&ty4Gk++E#Rtpy1ER=Im^w*>=hy5+%1A5$
&9wlVY ?kH\biw8RhPhq!%j9tIFa?YCFe8ZLbXDNYR!VISl&\wL!eL1>/J85@>5&!YhjlcKwtVtERY1=wFwdhu6
8qJ^WI 46y=kM9^M9q><58J\FcD1t6watdFnH%&i*n=?kiFHtRCuJS/Nn895HTc\mKL<bF+iRm@?+8wd!RIZwpI
%e\>/u NuPQLd+>%JAScEMR#KZnp6D+<G1kTReAdPY>+FSy**B9XX=t/8pVMeiQ^<auuw/Nnw\<El$V:!tNCJ=q
eJIQSL biXCAA54jj=*N@@=LLGee#ZYA&LmJu/L?:\tQ%Mt<\4N=d$l/y8X\cWF@:WY/\N:d>/p#/$Ew+8n5\PY
XGhbDV RlmD1BknMtk+YW8k4&6PjlAF&#/4tR#@!@<!+>9@R1!G1:M>u5F=5Q#+tNkVcLa/hkw@nTi\JGLJdPl+
mWdiSK Fn9DquK%wS=We%Q?9ZGe#Jmh@Q*6+?8uD#9L$9b9%J1m$nY@W\X$#Y^h>$iuF>VjGZu=jy#6%^RhlQM!
m^Xw&Y yl5ii@&+9/*!Ttd11bNkQe@qqVZ$DI/<uph=ACiNdCFRbwNATbTh:FnR&RwwN>h%@@:&u+thd=:S:6>E
4Bh^nw 5i/FQW:E<1H8y$4y/EBuQhH4HaEej8SadN#ylKTpBInPnpWhDk*\&dQVec8^pwbNRC?5INbD/4qBKLm\
!?/8c< w%=Yc56Y1^Au8abGc>ila!H4>d&h@%=FL\YRdmDK:daV4nk1>nT/SAiSbW9u#d5D@/J=MtjPHY<#$Db#
ZwGK\a <jJ$e>&=#h^RT&Y%m4/y/S4nDi8N%iTXnc#ZY!Km=c\5DyhWNcG?VcnD/cjZ@$#&PSF%MNDH#Wy4tCKu
DKFy/G cYn9mc:lJ1H?c<^!1N?n6J/G+1#p/FC9HVcGtknwXRVRATl4qkcP1dm<Eh$6?9RVniV+<8unl\>nH#=<
:&M&BI lD@H5Qe!a@DSLS8WWRa*ITawICRmKpLt$@E=jQAA$6D$IP:k@Wi!CcAb&Z!ku+pWXZIK!ujkb+W!#1Rq
/iV5dp k#?GSjZ*&t*tXHYDRi^l*uS6AJqbmDK4IMQe+pSJKQ1dtQ=aiDt5j\@n:\cYm+LFZ<n@u$595C>:P?dh
qRkT&S WHtbI1!?QMw*kB+!YDQum!E$<9L^DRkPJTaNA<9J/Sh!4lSjB=mZaH^AA/lSFuByPAlyn9pVF&B/BVC6
Y&\^CL 8hd6YMFNYuNt1K*&F<w>wmw18/@9#C+6kF4V%F$$y1D:eZ<ntwGctk^YLPQC8hRELJ+#ITW>M%/Xbby\
&^\586 #P\5uQ!Ck4@JJMFX/8PA>n<h&IlAiMqTy/48G:A\>F:8M?wCVQ=+=:GGKGN&Id=A/L@4+6@VT+hqaaCF
RPdhY^ \#9bw#!6%BbkQN##B$bp8mC%y&Qi\1Fdc=/4tGt\@?GemhNcbwp?Ada/pQ%<Gq@eem#tiM!Jp\l6=KXS
=6ZG*d aJ!WuASGPnW%1cClAc9HAP*TPpAd#iFE$/GH?&1#I:ed9KYT>hb6h9GNTM\6:!D/5bGIBBdPpKNQkwN?
9!G!E> >9BGdeG=^JknESFHV/beLK:6Hll=@j+#E?5HPGuen<CcBFl#Tkn4dn6@G&Jm>yc&pwd*Q\m\Jj+b^a8m
!$*ayT +w4CT*6M$iyl5HwTN%&%4K\*&6w::h#nHSCCd98iVp=L#<DPmYipyTceQHaEAnpQ%?%&t+!WXNc+BMGV
8#h1:n MAJ4<XCjLdyK!^YItmw>R&QmMGuVb5#YLcthCVc^m1ZYm8AhRL!nq=@*$pT4:8=d>\cG@\Z&JL1Bn5=\
+^AtV< *jY$nB$>QN%&:dR#N>SYYc&5dYK/bw*%ilPKkyL^BnAhX9n/ybd4%@5C&q%*cT>SX@HQd=<RVXCL<</u
L^*><< ^EejD9H#&Ga\DNE^e\aAWS!NHQC:4=QjZn*wJLJb?@jaY?n?REJd&>S&l+j@kekaIl%:6c!?<\:6=aej
Re$WVC p%M@9+$V>#@aQ*<B^8pjyV>>Hl>@+VpH6wRIH@LYk9\46F!nENi#Rb\lwd+l1al1jnTIJ\Mee%JK!yp#
-ARALh 000eeda8b24001202b3 Page 256 of binaries1.zip
leiLZ9 iIdI&ZQu#1cjPbN!?mS^C>DD*LRTqlF&MNdL=/wmL/?kkP=<1KnTXYTXFSYIEmI$V+pIpmZEpd+WZ1/!
:K*yW5 bpjRnb/iG*Va\56D9djwKm=Ah<dSGRlSSW1eVmwp69%q8$!^>Jw%!nJT6HRNnau<5!Mc!PMNdnwEhHdW
WFQ6Z# eYA:MVu6ZFbi+dZ!cR4:Cu+?Qq+G$i1J#w<Pnbk6u@kJ8wXqEh$t8/L!8wjdL^%!$EX$e%E*HTq:YHjW
:K$Yyk yw*Cc4^V>El&/>DD#84Tk4#5m^i#L8WZ=tij^#K+#q@MLTky5mHkutXqa?jpE@^FJm%ey9KNaF8ItbXt
+McuTT S5!!e1cXZa^8ql9$Hy=i%>Xwnk<k!D8Q>5JFm&aZ++9E@y?qCWRGkaBdJISaG%=t4M$<hJwXwmc&@w98
V4jHub E89XlNER?djZqy9#&9?mG?F>hS4uG\p@Fu$5J8aE<6$aPG@&BJTwb1T\JX=8cJm6J#ZXZ@$!y::j9^y=
+X!ZQ* $FwW:&p?TlZT$q8*caj*\jkL^R%>n%?Mn9<pEdt8=SmDMjN:@MQ4+V6NJbpJS<PCA+MQHn%%61C/<<E@
S*eyny eN@H&imF?11#RDe8nW6^CA8yHP?F?Jt#5j>Y\eAM+#iPMWTI5k^t#k6N*c!=q8@=R%XpM#Lm8#%SYH55
59*lI% LwFwV5ZIZZAy?$IG:EAAJMB4>\+HY=8%Kww1144Y#l=?AVJ?i^*Z//k14qmyy5+e/wGtahl5*tJu:+A=
8L9Sne 5yn?W6&mbIQPL>!a\VKC=VJ+cEJ9Q^^?>8wjp1j#e=qiPqTHc4Bqn+j4LleH1#YA51KY<XwDk@Z4VVWX
KRR5qL qI$*&Fm96%=lDY4Acu6^bTNA>?LDD>Rm@NuR*S56%he8Z#l#Pnd!\H=9F#Q1CEYPcwltBKDyQDuFXc&*
j*!YEl $Hu9u+>QdniZ=cdFH6!HDyMR#A8bMIhGHw>QPZ5^4/C$41N9/Qu:4^Nke4>@uS%j<jZd%@E9Z#=@?VI?
yaMGmc @9Z:#=>=im4TW8KmayKm@H^CamJC@H!L6pRiCGEktIPnIn&nL&Slj&FPAy&Yu5F/:m#>QB@KiTHSjYC@
uTW&tJ #@1j1n!4mP&m41/lRciac1m4Km9KE?/bmJlq=6!RpJCk>QL=>jdh/\DLLd>akJjw?!A&*><VuRA11=n?
8YcinW WeXWX!8A96bG/R>WuP!M<yZ:@QeHH\mHKP4+mdn+^PVWnM^Lq+6L1/elVBdA@pM8^5jGD?BPC4JIM!l<
nn?p8G Sn5Pb:W@:4=<%MXAe^^l1?8c*Dy+^h<I5DX\En%+69d?<K&Y&9KTw5LC1!XqqYXZL&N=QJeLT<y4&*4n
m8@IEG qpuN5PLkqhqaYHtEjyHbBKRXNL+VXSpCe:p8ylyb?qPXT%cICSZ9QK/LF!?bqeYZ!Q%jK?H98<jBmqkJ
YJGtHP nFDbuMn4w9Ek\ykI&udLXk9P#hTce<Iw8@YZW&Wty=k/1:wGG&$cF@pah#\KpSwL1CJ*DJ+aT?BPSDu1
PWk*IA W*pE1w*NSX?R\J+CkR%m6/e!I&T4:u81pIHbJtjQ$JmMkmw$@94D6\qYqPRCXPuwF59#\c:K*PTnIZ:i
leXGhY Z95C\&QV<!5::n@?m?yhuL6DS$cGcNcGTZHDu=Kmeq/6LZ<cPPydPtwL:mBYF<>Q%TLCbhDa=aZb/RuH
paLeNu I$JRJt8:w#%tJ&d98B&X&P\QQZ#$SEL18R8Z<k8Km4AT1TLWpDe>=XVMpdD>?>^hui$&d:Bey/W1L+<y
tZZ$bt SIHbZLqKXXPV11&n1\?iGDueLZdw\918ZiBFZZa+Phy9&:J=$/cNt#aB#w+:h8%F99lwZFL/lX#\^jX6
L6TewY *Vj9*1iNQH8Fe6S#CE>jaj4n=Ck#1w:%Lui*uT/P%wdc116Yc/+^%6i%ZG>KXXI!&4nSi5MGX89%tLY5
Mu@1cQ A&L+>5Qu::>QVe^N=Kp6K<nPTDy=FDYT&cV:BKT&48XP:<CDS?NR=15PmH@%iiIZcP&/+w8J$eEi#6d/
iYR+yy *?hm=^%wHkk1\\jbmdwmD#=>N@=:?5@9H#??M:=^jQ?BdqXn++9R6i1jE=QVW$%WGTpJWXFJeVK9wCmE
6/W=jh etTJ6YFlnPDyILEDB+M<I!F59ukl<!^mPCZ%VQw=&ZQuM!>tZ5k<V+\!mV$cHl4k9ejFaa8N=VynA#$h
X*I<e5 LW%NnIJ4p1lcY6QceqyWmwc1p5K1=iCd=qJk+HmIuI?kIFqRhNEm^11F!^hKC@E^E#wk6kt6Ldh5=YyF
pB&M41 JSXXha%baIYl4knYAT!4uwG^1aZ%=1%w/DXKiKGAGXV&eamupyLV#y!>tF6aWqEDSK6IaL^$I9SpwFqX
4IHnA4 SF>!FkT$FAB6/Bl&4wq&1+k=jie?1P!%?!@h8bu1wkXE/&=dGyS<@hdn?#%6ndXXqbZX6a&6>XZZT/?X
6u%6Pl Z1?5di#wG*#<?NJmFuT6CAJwE6eQMpqEimX#=I+WM\W&4:MZL=^HXwR8nI8\w*!%BP>eLu/J4K#eLMwL
h?t<eV @q?4\nt*Kk#mZmMZtiuLSccJM?WyIVqlpj@X@ew4M5?bkG8GP1:BNnTNe<*YuamMPu45PBdDGl8DuYBF
IawKKH AVRQcG\AP!/u9uG&Ht>pLSn>1/=HZ+#$N?bF8=1MWaX%#Va=8ReiVep6c:4%CM%X@<QKVIA6ub$AC#DT
JPpB?p *%TWESQ15<jN#Z%j/LHW9Q?AjRjujd=JSqwGhWmXp1JLealJd::i*wSPmb68Fh:/VS\:LYSt\anR?Scc
j9^Dnp Fb&ZtSwZjTnE*\h^k?$R*it/&<MuIQnkpblVKSBJ=X<68X:P1F^Rj4*pcq:Y?dTEE$jS9Si*HR=dN%yd
RdeZKe 4nM^NnI$aNZZa?mK/8pdGBwB$lB/w!HaP%^*8*5\QHp<*Qi+8dy5h*b$\P!*PRD141m%R%lp#CuCK=jZ
YSdd#i N4X**+LA?VF!!&PjEhTI/hqCwwZMthVV8:Wy/=#*8P*c+dnSTEh6>Yy%A!N>dZM4M^$q^VWdN>4adMA*
1jl6ck LLjiaLQ%ZEWDdJhuw%>Sh=!Z1GmqwcIw>*^1@DGIVn&hnDTjW8T$VLc/?/GK#DPwT@Jjth%SiiX5jEVA
?6t<ab dn5#daJ1HcDc*T@$eDVaue#5@PKc%6/BpVijRGin%mcMH^\@j@@?lRbP+D?Y@Q\%MVW>NjH4kVX5Q%FS
$\N=h< CWpSQn+leB8C\ly?aTHB+J&^aLaDWX/H5T#?m=pA>yuWbPD/:QpqtWl&btXuwS9<cCdI\TA@V$L1YJt9
nAPluj NVLW%/Q4584yM\\\R<\A%%8pw/Ylyk^1i>uTyTm:@a?DIna^J5DkS@%5^JqhI+m8ce6Z!cN:JGB56Sp/
@Y6M^$ tDbDT%FLG>$yMYKYh/BDSc>>wK+QHD\eESYN>HXCWpycP9^Wm5w1/$Bmc!\DIGb=PJGyAHGK^8+k1Fpq
&l@@i@ qEFh/&+LT15h:C>L>LEp1Pcm&paS/41X\11%ebq9jGEunhb@5\9hI&96:Lub&hyaX%jj&NJ?+@dDpiH:
?cMCTS Qjt1LDMk5YhaYhu=WXy5=j\eLZECcmT\mcVB*Q5Wt^HqREBLT9E^QT8#XSNnPd+MZ!4!j/+Ik<mE<SAX
GIc5uM I5SM9Fp$k$!WIaISBTPLtXL>@*HX@#DNwkFWD$#lRu$SEan1/PM^^+:H^MdEu5VmYE=ly@EE6yQb>a$#
EZ1Y&F IK8L&=G9u9tD<q6QH*cYJQ4bcH&pmtm6&?!$h*@pcRmH8^/kYi8@yqmS5F+B\uwcqajRi1w8JaV9e>9l
VJ%nRQ 6N*XM\nk4&\H18i#adh^65>uQXdTyXtpbkFyaaP56yayRL1nwZGGmVSq@w49M\mci%444lhpu$$/ejSR
leH?j* cMA?V@i>8*j9>TAPGCPnmiQF@K8q=bW%ha#/BR%%%iZFldpZM=Lnn$eeCQB^h>*85HZVl9WY/$^Nbw%q
4RlleW VhaC!=d4dVb6BV@5mpcn?94:w^Nw@*$?ul=:h45!ht=#Jccm:#>\PQyp+yuMuC5qqZZN:V%>h\ejnV^:
hu5CI# <idhGNNHk>iduT$m?4bqyCZ:WhZ%6:u6Bq?@&WSdVZ/%t6+cA&%VT#M>FiB=E\CN&?Adq6y5PFBi*+=G
LnZ+R< DKAt4pVH<//t1yLLF<<p^B+JR\p^/nQKW11?6a5*tpmRhC/9yJwy6Te@QduVZJbDTP*N^y4#RL8+w#=6
#ncCyS J^QV#tjuFXi%wDpH1Q^t/5@EBQadu%D/k>wY@j4=/>j9mV<I/J@j^+jnhm!ZFBWSq^Lq+^EEyMu<K*cH
kNbA4G HRkPDkymBHPEBB<KDeypRu$PwAb!M5=jYHa^G*Z99bS><RKcqBeZnT:^A>YPY#in&Z$tSt9YGBp^nPpt
q=MIl/ DPNq\LkPXWNFTZ+qTue9@ee#Mje\&5VpTRF^M8GpmR8A1^YXmYN>MLYaId5B/qiC/TtC*X$DlliqQP&e
>CkY1q h41=w?wQ%Ka4EpF>I9=$IuLXF*KA/81GKR4Lck!abtcJy?cJFq+KSP65<p559#hRe!b\5#bBNLQGe4<^
?bMH>V EE&%E9W+h1u^\Rn6\b&?*6/djZejDN!>iRQ4FP#8/i8unR#j/&p1#*Ck<4DRtc/cui<ZtZY^^k<mcJce
pbuc&e C=1buqy&<cK=kFmeRhT^5TH=#Rq?FTY65GY#!@EXW9<@K+K/hiFC8DAH<$!cIaFLMmR\eX^5XlTH%^Pe
9jYSaN W@PEmWBEa/6^BY/mV+YKC6NNA>I*yuC8d%ES5ElSS:FwpiMA>jHaYKVCWWI5N15PIh%\9ZJPj1NGD<P*
Lma/VS 1nLDuR\BcaPNVu9<D<YhLcl5:cM>i+81wquAVc<k>Qiu$ceQYp9PHk9ek$c=8:kHSmZuky<t<66Ebek6
hhJ=A= uP6##@uhm8Ctb/R+^AYXVnT&Vni\NVbhH9yFAK*PBHwMkB/<jcP%=uyl:9p$%EA@NDDA%>jH^>e*IPnA
#qanAh aXR+i!d#E9BeYh8ANiP6iI6MW$N6^VYENMn9mLAkEP8:6n68R!Nk%?NYtCX8JdLii5QG#X96HJ#BD*6+
#5ZV6Q ?\aEBwjRR:qDk9d:?@y+i*ymH4ciZn=??$MPSl/LR!>@ySTRd85GyB<Pn#^@@idh?<@n+>>?kjCiutaW
!^uHT= E$+c+55ajVYhDV6hh&^**4JYY%%?ydK8wd/YmaY=wc1m+TbddPQKnVd\*\a9%BALXwIaB9Vt/eP:N?cF
9JLK=I h#TICw<6i5<yT#X%#P#&MkhaZ:nCXN=Eq48*99lmWuRIW6:jWQTMCpZe@aIQSWQ\AWK$1LLyS9<n+6dt
+6kk1G >QRWa=JqCy5tVW*?\Tdp@p!ml!b?jwNw=8&>ptNdq\tLTp1RiekmkDVjwt$lB&cD<SD&$AMi^!+muqEE
Q:1Ahi ub/cty=^LnN4bSc#KX48yc#MnLVE?Jknl$L&w<NAAN4G&6LCdN$/$*Z4#M\bb19N#e#Ytc=FkpmH11/m
GBVdMJ 8J1ktnmIu696apS/X$nwn/C$ECA6LVN*\$mNijAQDB5dGe<a+Wd!^mctbydYe+E$&Fjpw!Mmn+KtlFD/
YK&<kA %PtW6LV$C>tZm<84t/ewdG1C9L\#AQS9anIIkup^S8HZY8>>51mQ%uRl*Eqj<!9qAey6?&j*>cY:ckQP
j$ee#w t1a<4lFu1&+Nn#!tDYIDC+aincBC@46*:9a@GBwiihS@w@F/Z5cyA#6MX9A!tEC#<W!RYeWX9lNAT#DH
>:eV>a /1F\dnpB>ELmLW4MA5*5BH/<e#+c>YmdZat9pQk@FtPCRBpZ\WVbpZ8ZtJdEJCdEyj=G=Q>&!!mE^qSa
b*hHiy XPq1JIlQYDWwdJ%VPP>p>KH\\^GSS/KPA5n+Me:nSD\hl<Y#^X!wdb1yb&8wK=!eX>6jSq?N*G?/HP6l
khuMKA ?ap11tQl6Ne9QDa64/!^b&AEnb*?M<NC!P%qlN^?jL9?e6Ild^e:Y>66#u9*H$EeQ&B!nGw!i*GP/S>6
:6W>ED //TqeiqbKW=JkTWBNi%N5\&p64K&u#mDwWtE$N@RJRuck:+dLdZqSjpZ$yQna/IPH\\JC6\jGBmMc9Sm
-A>jqm 0007b9ac7e5001202b3 Page 257 of binaries1.zip
kY:EbF V!Yqu\jJXXyS&>DT%w1%L?^5S@jl!1<X=tThVVpXG^Wi:L@Qa@hPb^RcA$9aJqHd4h8Ie86h8@h/?lBl
QDmF+6 YjllikVZwjADweGB?\Ma@65C>keGH#\WhV\8<e#=:C9FFZZNuX$*??+Q\k@//R5R&l<?jl:@<RPm=>ub
\9P6K% c+Sul6%>!qmX55=^q+8#<#a#dZYFFaycBuycllaYc>RWDDb6kaB<FZLQG#e/F6YmMhY9Q9=k#5m<%>6i
i1IwTp Z$+w:iQwl6+PE<$ZqKXcSl6*wlHX^KBM=yE!WVw!u>G&M>hGGM9wtt%^ejeNDpi*hDI!L/GbtuiGmMkH
tk/><4 wMYuGNM5W@Vy^bMV1H*C?:e9u+$M>tZ4mwtKT\4^<ApB9:#mb95Q#kb#lId:lX/e\@j<&jT$M^uu#q@M
twZ\Db ^uPZ=1Ft*ilC+dp#!ilI>tC\9#iEPp=&Y#h6*GC>*54T!ty&@Yw4T$5LC*M#$:WRY&m1KcP1CyCjEC+T
K$Abq/ 1cD=DR5:hky&1#l1A!P#YG+yRT>FT\jkBYSu%:GdIt8A4=M*M:haV^^X:IBwB&u5MQDH5EPnn+HMl8A=
w8TY@Y JSZmmm9F%?5BaE=%EX=iHta41+p=lwYFJNWyFKwbMdi&M#@c#aSKME#hGHq65CuGX4PF\tLE/S!cZN\=
81l&BN MD\>InQ<iGSp?BH6Ej1Vh4iLtJ\YFi4n=tA5!ylQl*ELVJFblbb?JYT&BD1mWkcHnABtu5$SKcFbTX!K
ZyG:wQ uTCQB^ZVMQthZmu=j!<HB9D!mVJh5RS1cV!Ne5CT$?CXSbpnj8GFtI/awJmlmKPd?k^XZA%V^!q56Cte
8c85Ad l>F*KQ#kIRR^FwWh=a^GC95ECG!&a&h4CIId4>Lu6QXZmF!HP56Tk:dyjcGKcbq5&iN*<HlKhuF6^%*c
?GZ6<M W#Rje+4PA8J/JVN4QjcTh1M!/&VIZphdt+%duQaEHEuJ1?!EYP:DPQMY^A&eDZ918yT$YJykYFDC5cT#
XRJ<R@ mhHA%6S!=hMQ\luLwG6KH>?@Glt<&>9iWF%&Njhmi9Iy&EmH\k+\Rmlll!Kma?JAYF?<hKY+4K18wbEa
TB&?VF !htKGK/yKCuM!#/juwRc?wj8S$ZQ8%AkVLK#6<eeSNF>mX%88@i+k<MNCAVFB8?jH8WcGZE+@PCBpEBp
M1YjD% IeD\l^<?e9#p1iTMm#pFyXZ%#i$*it@h/Z<\TB5iijL5^c6*EDKnmHq/6t#iGceEcKkcd6*y+8^pb/G4
nS4P&H 44l!6aci9yc?tcYSl1Liym&ddVi#dMa&Lh8+!c/p84u:L8*=GM1C9Z@=?EFjb&QquMA?GLl9>*16q=Sq
nB%N:: XD%LB*ij\INSJ=QQ==ZWEE%qj$^?ihdjin*9#Iq\*%&&JqVE<YIt^$HlWdGuptF9F=R*hQaNQuu#<h99
udDhwH mety1Yq5ml&E>8VW:QT!1V?@j!Ca*\DMn+aG:%h5ZCR6KRpMpEYEBjtE6L\QlkSnIS^lB#&VL%=pbQEl
eCq<>w unQPwEFQYVqL<@K9FBRYFPVu=aC?ll@D5TQl+I?>>448eLVj8kZM$+aNhB9GBt#>ap5L<*WtSka/ttw1
L4ZdLn <16Z#QumJZPiTlKWJ+5wJnInnI6Km/E=HKmPYkHWNVwlSCQC#RBlC<\eM&M^^<%^!%Z4N>nad4X**wu<
iBcZT& Mj!\Dl\MQ*V+ePRSIByC\jmE^BTI4Iw1cq5tKh!4?SDPSBupd#Rc/I?kpLkGlcJy+uIw5=q&1?TWn^XB
RFbcK# M=iP!?tGwbLRhe$WFkN88+D+9Mc??$PQ5Mie\:TB@98$^@RS5eiQBt>*%yjqMuF&*44BRIKNlAHTkDWL
8EMQ6$ K/jADJppIKZ/>i?FCYXCbC>jlylGEVGGL8BJ5\QRC^h^#Vup=a\X&E1^FT6Z@6?4Rkeq#TYPB5kVRLQA
eNtmFc /&BT$$RJ8!lSGM9W%5k94$aHkllAnTun+J5^NSdCM+>M+6\@I<QC\DMhn5Amla>EEhcQPJa/GbNRCNE4
qRQ^Tu eF%bMW5WpE^NkG^?<dm9Nn9K#ST+N6nk+leYublbWNueP#mC*AF^#4\Tqa@<@D#/dKC>>G!$@!/:nS65
CDJ&<$ kP4>S%Q#1:5Hu:!hy:wLb*%h\8c%YkdiQb?I5EqPS*NDR&Nd+i99VKSSHiiHN$?G:9Y$NXSi8=1ZhVa6
!LMSK1 IT+tPk15ECNMJQ^\FGyMm>^S@6YTm8418n15khEw*XBdid&pMD<:M^$hnWcFl\V/iu95Stq4Tbeh\DIE
N1S%HZ \*9hQd&>jjd6<@jjH^IYjmkTm<Knh+M\PSIbAe:=RGlwTGlwGE1lEtNaMlHThW%6Hh$>N&@h:46::<Ek
?Iw5tX +94=/>E^iMPV$>j@88a+QXW6G&iWHde&$FBc5XJNX$>Li=&qCWYSc4qqm/$6!Za#RC&*$c<eJdcJYX+w
?6J6SH bl/<$>%eR\l5qPJDJ<&9KM5$6hjc8u4/lS\?l1=PqNX**Kc>SLZan&<%qtTuHA9%*tFn?BYRZ1B49yXA
t$4ntY ?pkMBB4u5k4K/mAiH*p%N9:n%&@/BPj9Z#>?R1!MViJ@DCb?@jn/=iMwkjVDkj9>h!yn6m!VEBjm=^aW
YjB%i= lLCbZ\Hmbun4+X/u5m/m%9$w^Z*8dAaE#NtZ<9A4m\89FlWYZ5:L#wVA=iT^I+jDRkIR%D8*P!DNA&?N
Gh+FlJ jjPt#b5&aVdLIJK^6AT!%!C!qhDyM?^%8dq/V/aIFejEGLCLMhnD+8mK?BJ$/SMXnYnykMk&YdjPHLMk
QK!MGN YXya$m%\T^E4c&8dVX8&EjEReYRXEw1FmS+MD$h$S!HBnWy6m/:ZNp>T&NYF\XM#b=lM<ZE\V&\uBaYE
LDFjJ9 qkDil9dB1hWD>/9Tk:j1EuRd?YV&>F@\$AP/hbR*iWhuX4d**P/@@?B?@?&i#y:dwMXwR+MQ?t?%%#LH
1Xk\%8 E@8+Ph18Z&hIYTHG\WDNP^DkdQ!#bFbJbXSYI118y5a5?IRai6+Xa#I5<+ADqQlm:nuCX!!jZmH!@:M!
:5p>i? <Ke+K*!K^D1EwhM!8QRjKXFy=K?Ja#Ct+%?=elWE#\^=HQntJFJm/mnH@ikQ99BpTGlaPDKBESGSpaT\
*kS+#@ IZ#&mhnnF=tc8:y$al\ZSJ4:=@na/!eQY1?i>685?=W14t9l+BWYjj4ebVSI+NGVX?@SqeW=6mh@jHw*
k6Rk>q $6>$NVZT^&YLndZNF8i>khFuCty:Hn=:>*H<F*G#8AQu\HM%+R%lW9\kYMRFXSNct?8dt/>>A:aZwmQt
mL$HE% H=@jQ+MIy4u/?qYA>W^KA5AcAh+/FA5SC+XA/tkMMYwqM!99!6YT$89Z!:D4YAXiLut6/HIPc6!Gim<i
i>VbPJ PZRk!G?jy@8i*d9heFh<6@liD@DT@5RNDH>@mJyDD/CyqFkpL#l6\tPHleL4m^+IP*ka%Twk9C@pFwKw
jc$l5& d&#Etk%d&64dP:68*Pn68@*k$emL>\n9m4Lm1$TPP#%%4dL/P5ehnk:&G>hRqFi5WNHYyY1cYK!q11m9
iX8G>/ &:J%!^deF68Md=L#LGuwAADjwD9Bu>+?R<hYhcC:M%NQ^SBu#?8wd!nLNdWM4b&J+V&^mStZRHpVSh6@
PS$BLK j4\h8pEWdRi/P%4yI4^Z/Xq5R*kjQHIe@YM9Zmt4di8>@?nF/Pi9**@<@Qu4=+<j*>FH9:Dj?C@<l<V+
eIVy<N =\@#jN@49>*Zi/Q4pL!p8AlGFlIqp\Z+Fn8CbkpL<<uK8ynF!PdLI4JmkHhP:tY<eEqSeWuS%T5=F<?t
BY/6\# uw/Jnkk@EB#k/?&?i?h&J*8:4eD*Jt!nDPId9DeIek6#W^MnR%$6DXZF%T6kD!@FbIZRJtd8a4TN^eXE
JVTFQQ mT!8GC+lBd/dcLE14/T5nt:MGBmBFF>udtE=c+GdK%yaYq16*:DShk5#+?Hy+\8SWiD?@aFB\WElwRhR
BR>pEn /99wmhNu51/W%nV@wdCJk8jG=4yY+d\MQldp9BiBFNjb=B6jewjYqB*la1n=nVIAW6\14PB?b+IVFjnY
t$?Ah< E4ZcjVm%8K+FLHuQne/&y61t>l5*5V/yY#&h4VZF&YeI9P$*Yywa/GyyW8T+YCbbYWq<DDK4+PI9\Lc+
SkycuI P4n88X48PZ?MT8WtyVlRkhnClcSFcHwIP$C=dCq>Ge6!dBu?@:MwhApYTV4Id:4WqDSDmkF@+6K<lIEk
Fw+T9B D1/YaT9\qT\4/C5b1:mbB%nANV1Tu9!De>iElaZAHn=+CD8MS*ATbEej^&L\+!TIycj4TW&Fu\plDwH6
lNcbaT S>mCN!4Pld8ajKNKcK@d5n5w?qSGZpq6Y>@R!QM*H:@@u1bnKJbintLy%$R5Hi/>HYG>hd6HTE#G%j1d
tF*nEM 6PinH:@?u5Mc^>pdLScmM&p?hCa68DC$wc*^/6R*CKZ^ceqj*#/<Gu:!cQDiui/m6MSVe<*@k\LyLb4Z
/KE%Nu awLSFhZC9yGSu8!#=:N#c8/NnQVZ=Pbj9qJ*=$=j>6t$^6:il6nnWaiL+VuZQAD1pqc<hjFih&>j@$A\
CK#kyK ?MHhZS%6LVYu+dNTNJm:NlX&Sn#Y#uw^BY8#9:^@j$S:i$hnSG^ZX*hQDmyAKmq4G*^G8%%^?%:@9jd1
DMA5ck n95DD\j/l^HXp<^l:<S^>B+NXZ*d:a=&>4atFPYXK?R%hcm1c<#Z/cmwtY:b6uWL!^dMF6?<%Nal4//6
D$4I5B >>:\1+<@y>G+tpj*d*YADM?@iCd^BBw=6MhGB/mt/yq9e@MCZ*\$D8u\c1Lq%4iy4!<jhFSi#wmQ<Hi#
5?<heP M>Q/T9qCYc%yaGt*E&EhCdE@&KDLyTlay#%:<@EL/8!NPu^@?a\?a9!R@@=6@NM<%A@/:>/?BXB*6MXS
heJm\: yXCQLXE^AX+!9=lXTQkB4@Na%t\&L#B>@q^t%1Y<!\ZLm1/XqF$DMZTJGQ9bpB4k/<Q5?qT@dS6^TjGT
MqB1PC %\cG#c1V:a?Gc@hAYG%<yIXGc\yXqF?=LKC54FSn<cKp$6JpFHNGZm5yTRDhtalh\!G8S+yVi8Fma6=I
:5KeK8 418TmpbGPXdBY?AHtu^*VW*65YC5lmWFN&Qbl6Y8KN&\9d/?wVHE^ZY98=jZ?h/S8:ZB6Y&6dih>M>5:
I:KStJ 8&6np<@qFXel4JeK<QDR8aqYQd\+H/4hIMCYWIWa&*L9Wam^8\ym*e&wCG\8Lj8a!1H1I>bNFBc1k1qL
@FuBmT !KpeEGqwEqhhXSuwACK?c&&14!!<tBy*JAT\6nE#%6ilctIW$pwBqqtmKRk4mS5n5!:RREPWBNYSLC?+
ARma4b py>:KY$dAJ5%i=EpKbHF8Ml>%AAXh595LeK:q%$!RYjWu5Zh*WZ854J!5y/=8Vq1m^jF=PVEwqWK8bS>
ZItTWT /SlDnQ9ayW5=1KBQkm:Jtaj8nCjdaBI5S^pZibM&TWqKGYbqbd66^4J+AmWqFdK#5qKpqSnbC>FLL%&/
H!nw#k #Q6cV$$/NV$uN>h48XhPZ9+yiWXqFXXeuc$WHQyWbGk\pA>/Qj\Re86M9Z+5=6n^#BwEjpjyw!?+IKHW
cKewpZ Q+NT9>PRF?66w@&DK1q655uFL#I?@XJSbZQQ@iGuL$i@ILGP@+*BQ:^?hLMtN?GkF:B95<uP^j9A!jMq
C1X%B< ndhyL$a@jTNcedZnGM=?j>hCIl$8I8ycX>5?D4/ee*4!^@n:y\>tSpqD^\:QnLJ/ie/M54j6&^@eS^>q
I?hkQ: j*Q!hN4k:Cn:k#Py/h*aKF@9mYP$$hFHpaeQl4=knHL+84t/Ql4FS*u&wMQ55QDD+YE#w&!D@y:\HLcH
Icc8Zk \d=u5FHYlpl5qP&J>:=5dJS$K:CaMe4bE=iWjn=*pD:KYq+LD\:uQMXG%d9cd/Pb>BQXqYWqe+jTCZyK
8RXYCN t85hHP*5dNhSXXa6Z/Yl4cY1b&ct4/1/h19h%1$aRu84ZEy6!\&I4>>@u=#+P9aKHYASa9^5eu^$SKmj
i=jRDE y@$c#ZiWFXRhp+$8:n:?wSHHV/YBE/:4/H9+@AN^V/MF%a5^R&!E>myNR!8EhmB1RHW/=W^t@nWI+P<<
-A*$$Q 000a5830671001202b3 Page 258 of binaries1.zip
Z>9ZNJ jQL/@ehQ1En5!?hQH<e?j9+!P::/!$im/^uB>b&?Y?CVPtDQunYVStRLm=I=ijkEDENCDtTn8S@aJV!d
$RCQJw J?6Cbmb#em9LNc!M@X4y%j!LM&PpIS@ZtVHYVVa#a&CeLT%9$Mja*^wb44<#P<b?T&8y:FX5nK>/ke#A
&*XL5K &NkA81n^pnHG5lwVbSuE^uma\TN1w#W#^9bAV*qkhw^6\Mw\HB6n4ZDB^qmipI^N+4E^W4hbJtPM5*Yd
9b1Dc8 \*aZu>9$MhcEe@AkdheVdI\4K?JEYlbIGCBaR\kSnCb:au!wuy6ktB<aFqXEpjYPk?iccLjLp9^56AmG
PL5C%e >jip6k+YBJwA\=14ni#>ny@NK:^YBmcq?Ey&bq=SYYXXhVWEe=e#W$=EBu8:&685M>VXy5=TTIwmSK$J
Nq5=RF n11/!TI4QqE+NbD8XqKawbE/FGStcLn+DI$#H>=cPa&G$hkHFm^Wdy!q5VewL%y<AcQ^FT!R/cVSP6Fm
q%&ANR *GQRYFdCauSm6LuFpAK@NpNnc%<l*n+Lj/!W&IHSYM@4anT&t?LmjlmNhF$!ppHn9ILP46T4/DVYQWH\
&BN\+S aKj5Va#G+d$KcCX8S!bM+J!y\TEwN$R@KBlPyM&PSEXHH+8PQq5N1LK%XqZ@aY49Q+V&Htm@ql41bQTV
S5\qdq K1X6a8Q5HZd!DJGi8WPDTQQDX/T?tdDT@==Gu#:w6YQdyw&&nt/?l$=uqdZ&D:>/@@p:klX4^^p+^=8n
?8GdG? 1JCjL5WqLTc<ITT#=lH#YkaHG6@>5Gec$QKcGeYhy$hJF@dpAHDhB<L9Vw?!>WSGNVJGiW+FD+!PD8+Q
FBK@Hu <D>JH?Y+/PnwNACke4l=?P\@eAk:\uIIuqdujA?\d>>%Amm5e88D*\N*heL9S@d&Ah#Q\w+en:5#P$4K
>!N8=N PZ$QG&Y=mw%1>BhW66<iiVj?1:c19HV81Dq%k#L\/Gm*da8q4w4<<lW1XK1c#qw#R*WX+/*&&:dl\Pq!
>$K1Nj &/%dkp8dP95Gu4\dJ?d+QmEPyc+nYZ$cXdB=::KknqJYW4WM4S#&iQpGll$lhHXFa>jhS/kd:j9l9&H#
ZnuE&N ^nYcmNMFtwd4:hHk8LDI/BPup6I!\Rtl9?H^m*j9Q>A@eu%+Q\wjjQ#I?IS@ZQ*?*i5ZV$hwkPu69y5>
>X>?j> *RnV=5d/QGeJCXFlATE^IT=8Zn+%!=$BMSkcy=YDZ?KB&Qqmh8:qk8IT:4L!!9L!c%h#M1dHYG8*A1jt
4MHaIY b6NnyGVnXEC6XWj:=9RaY?QmlZtMMb+Np9%na@eqJCW&$5hawnESq96AKQMKAt1hBe<1Y>$Q8Dh4:Rj/
S+Si^p m9X8\8@dhN9k>:&GN^qnHM?6dDb98VE:Sn1/=R/\t+mNejh/BWYhPq>R$VlBIWu#<5^!5@Bk+F#SlHwE
LJe?b& y4C\HMlt@c$BmbWQBt4QH4DZ$@^PGcS\c=wGbN?/e>=h6^Ew6jYMTM!+iAuL+:+EwWFT^wYejK^A/Eyi
t1npbL >6uE&MNBBJj/8q4WcRyJSYcPT\+Yh4L5C5ZQFA:R#MwK1/hy4NuTM#SYWbFyGmqW:AAGXLJhp=T1ucc^
6&!B:! qWlLb#BwQBcTdVScG:^=K#1NJR#ijD6G+=^:<=k$QC%LyAZ\9my1B:ThEc&F*#XFT?B*M:EcBw*nLn1J
C+J&RY Ky?qpZa54MNwLQ9k!iX!SJMcXqX%61eV8NndI&ERERcniAKpM!I!InIKP<wYtXVbQFXQ/54>mF#u#CS^
8#EWwN m9!w6#w:&6%c?#hXYui6nbN:eHS1XkHEZneH\Hi??+R/*YH#QKLnqcH8!8#V+eRlqN*&@^^CEiWl:Vkh
Xab&I% =@lS4CK:ACWCSNkp=T#L9kPNZLQVE>>Gu>>4^Wa=B<1jnI/?6MhGPWd!<@J6dLBS44=4L$hH8?^8\GQ:
F98NV9 >yae&B9DGMWjMpbJMj88A/F*Zi?Pn6:d:idYAaRPdh^5i\?=$l%8ukFlpWinw\=lw<L*m>B4&6\iHS*J
9K<Mly G^phjYWdDukY&=&E%<:i>ty$hMnPA<BQ&liaCu=%?MFw/1GaX@SS!88E5%h18khijQ^SZ%M=q:I?i?cw
dA\MLV 4w1PnTPEkl5MXBYZ4%DRwKy4Gy5bWbV%6\C?wQY&+q8Y&h4d=#c$*:^QnN@><jphBMC>:R&X^jpZ$^NQ
#ZSMq# SIeH?d4d/4&u4NVW$ni#*iZl+^<eHl&Zey/w>TAPu?bC+MTn\S=P/@ZHpXmtGqp:EKSGSKPIHd/=E5&L
*cN5CD ijV5>h9S$jj9S$jj9Z*>?5&:$jjaGQ/iM94&>jPun\qYd@ZP5>yRY*M%SE=cRqSRRFmal+8Qn=6jRuXj
CGS?:& >1ZeZKLqAJdNpbNjWHT6qL8m51119KR\P^Wd+*^R<t^5:LW=pQRWtDaAX*i:?QZaYKhPN#dGaY&a+/Dt
uwaEJI \SmDu<ea!WpK9CQQddHda&N*^MSE/\Djl=kR!%*Aq>qQc5ET&YZatQDh4Kj\m59/^5cibD/Bn%Vekh$<
KKp>F% #aQ\$8tWN&NnR=RNaBRmVNcFkdN>hG@5kKZLG@wa#%8ZZV+HV/VuqhXQWFlXlDEi^6#$dCdGE/CSXTkW
Eka4le :jWi5Xh9$Xy#n8\$wlIWW#eiLl:wPPXEBay%%48F^mctytMbC>KTV<Win$<?p*EiIwYM%NQH\kP>h6pB
Y6>pGR ^CCQJ!q5/55+&im5GIuBTtIZYDyP?FaXJjqXRFS4<t$c:aEWPL1?W@H^\pIanc5l+\GNXm=eAa?y!mWc
D9<I&e m>p!cHkZk$c!FW<C1J9EtmCkkCWyA1m:aWqc\e*P6hmCmBmnCdepwyeWc1DS?8L/$EedAiqEaXh+/Tll
laY\E= iPq8aSZ\\49FJi*B=>=wwhqJcR*RcX\DCw9qq1>TWEK6j5b@+#J^kREBKF$R\5TdwB9C+9C+mycyi4c8
cH6aXM $y9$eX!IMW8eLd<e/Y??tlnpcKI:TX&ka&m&$Yq9aGVClT9EVX*pd6>@?at$<S#jSK*&\/:KT\tH>4uC
pZbIEi Suje=SX!QL&k>5dkp#iwnRmh+H5cb?6hK!MD&lnpqJSm<uieG@%%+??Gi&8A8Y9dRc1!tAHIL&:e8G^m
n4w5#\ AkCiM:k*P6y4jk5ii>q&e59YM6C=iZbdL1H9h4yMH?W:eZN$6G?4HiK$A^6q6#i#8IMA6>?^%#e5<6n^
bZVSHt w+nqA161MB$tQcPnN>dpk%yi6\>iPhjcGtB9h<NG?YP6W5EA>I/P%nu6k8@pK9H\DD@p+*5NIC<+HHi?
+D?uqB yPZ8p\@jG5Ehw!R&$V%>ud#c81*d66l8MqFZZLF56b1t84wB/m&65<ZJ#p=lt>&&4X8*dHHaFqQhCw8F
!Whup9 Lqn<Hl>>MZ!@4:Py8yTR#eenR9&>uE&wH$ALW=H^*P96F^kcCeL=A5yi*Sy+!w!JP/88uEPN>S\5hSHt
Gi4uH6 #qRVG$jZ9=muuM561tlw:?$ji9IT/H::>5*4%!?jQ*?JQu#*Dn=:>j#Ja>wkw4!u8/8#9dYqGa%D4wLR
ZAYThS QpaF>h$VE8du=mML<A56h5/h#iMB!uQ!CwyK!m1=1&y1c!9L4tRtAZ^F/&8Ad%$A?qXQ#&XNCyB+X9u?
l?+@W8 &NlNFZC8HK>dD5uLZ<HG&DJpF/ZBh?iKyaG$D8mB4&QCdAB5C*^NmW!?BcCnqmJTcJIDkE//5LAeDMlm
R*#dIa ?Mad56tkyXh6l%i:wK\M$LP&deLG?A<y^RQ@9YNnXXVhW9lL<\\MZHc8Me+D&5>95N<hGJ%!1c#?N+XN
8tQCKq kl5yclciCX+&Qq+?MplypXWcFPycq<n5#5e*4y:$NChR=>J&PqFN1+/!ccCIcyp=?$WiQ^q@?qR<t4pc
SD@4j6 HlWVh^yLFEk+hjJwYICHm>$GW\D>J+XXuw@P!kBj#Wbm=X#$FYGPLypA=1RptX^\wbKA>Q*c&lRlRYD^
abHRhc GD>+=%y!QZ45tyiReD4+:^QC\nHIF+8eyNQaQi6w6AbaFEC&DL+tV!a*\9eTm!KN!dAA/1VVknqkR\S1
=dFnqS cdRc@mVR%GS#iPE+RWHA9p\Hw@F:Cl/k$i:D/?TKmJ/HL!YIm^5bmW5pAP=H$bCmqjJK4Cy1dIP@ec:/
kElb4T A!G?@95DA:FkhkAiNjDkPl\biTV<iFHnhD%:ZZNd:1h^ZBSy/%>jWbquX$Ztpd&d#NjwcnPwm:X%DW&6
j#DDt> dJ**Bl!PQ=6jA4/p:?Hny!@j#wq5wB=uLEhJ:6Fu/IbGa1V@ul&Pnm=:@MLnM+5dd>Gi9@9+>%mcFdR&
SEq&DI QwY#9h+lK@%HmmV4>i$up@9Qd\c:TpFm*>EFAh!yyRXw$8+A4!u/l?GBS4MikN*TjN$/dFV\^9yMCIqH
>!YEd& S%@pA5VtFtFkJ@aC:uGGc&+m*Djb8@1ESB\@j9Vk>CnuZi*P$hHu:jBCuV18<BKbyt5#5XGle@B5W<N?
W>Vw*1 $Ayy<NH/VYBVeEhPJ&eZX#i*RY^We>Bnj%V1=jydI??@NSEi9TAj#SJMe/ew/&&$5>&$&a!18GLyClYK
^R4*u9 84L884W/!qw&n9b&dQb&&?#Ay>9J:d#e%Hq:<Bu1HQ*%A+VI6:6Bi%>F&y6b=Gt6<=G!YyP1a&Sq=+be
>bS*<9 ?5EwWN@blSC>*B=CWjLub@*#*R#5#LRS:K5k^uF!ShMqI+:G^CWpu<5l^lDjHZ\MmL><>i4qm?jQSy+<
u9e$i% i@/T@54\JWVI\:VB?+n$45/P%ycYJpR/5^Q%GWMy%AXZmM#D#W@tJ$88Qbh@?VL1ybtLnk*KK11=c?5d
4wKKuG /19KLtiiA9uh4\dm8E6JEake:khMp%cH\AMNT<Gl5!%cIC&JnRq&CTiMnR&Qnd$/Q#dYVTcnGNkT9u1a
F$EQ1I u:<HIEjVZCRZLJbd6u^/nLNj8uN5:GWH9E/u:BdkP**%/w!^MiG^NHm&<9J:<Q^E?ElJFT\JN$XVp/1q
IB%!wq w/5LMVj9wJHb=y%?S=K!4#WA+e9J#Jn=D@l!Xq/BCWFBGZDtBuclGR%Dh/+uB&#WJkA*hE>6jXkW51/B
@BYh6/ 5w^16M$#>BBI9KNHIk+G?jtHlpimJFB$XETwu@8Pdhb4>dYyGIXF+#iFyC#Clm=cedCTTG#mc6?bpC5y
qP<\@b !aMid=EA5X!J+Gd6cRE/I@uhpCwuFbG4MS1DnNEE1\YncdSiG8%iAlBLJ68DVVAF6IQ+?WF<e^BLRcA>
Cj#/!A DeKA4\1?D$RA1bLQGL:utIDAea\tBM?@L<ujT1NXS5JHkpKk#BpmDCLa=8+Rq=BilKdT5c1w5+*<^uu@
8lX5I? uA:^<jXHZn\IC^ak5EcH>+en$11cRJ@j9QL5C$/h%?jDjR%ZV8%*5dP^YG8<bk%^@<Zi^YQ@wSNyPYnR
DP1e4p @M$Hn>AB:ThmjM5<$u?I8<@h%ZpyWaGi4m+8d6:BWWtZ44jijjVmd+J:FGihtH!He>J98qJh/y/V/Dk&
!eKQpe k*N<m%wJpjTWFN5C1*:/L=^4h9LZ=^eQY1+C+K:1\HP4m54MKMeXVR*15ij$WXaQCILbVQV$DIH8#nYA
8WEVjj =QMp?DW/&1t@=nw&!p&>M#yKw&nhRHSd&1LBk?DM\!CihqX6A#Zia1wGRRDdGRPD>jDT^SVRC1!uAZbT
>S^8S< tApEA6!:dDb6eZde99$weB&%!@9k/W5%N+jjj&6y4K&<j8$1SGYk%E?9W>A\*&K:ehN/ZiZXT=e11c54
4Yin&d WW%M>hVW%61nC^/+Hdb6tdQhYdSPI&@uI?4?u4b/yp=u%uucGYy?A9G6dYll/?KPZQml/Lnpe:uFqe#?
6<5Q6y B:<uQw#$NSN>\Z^SZ#BC188aduJC%#pQHCcP:<=iRyNn86Fy&6PHn=+@j@b$=QEnXBL#nQHeED==NDRA
VLhc?a YN<E4F9QdqA\m<ty1c%G<%^Kmk59dqpkLmyEFlVp=?En<@PL1MZpF%^BQc!9FBaD%uZenW%NDVZZ4=\:
ya/WkP CX!:KADG:T6Z#w^^ZF/>hFuET@wa1*MuaC5uId+IwP+RQAGp^5C95dEPj9/4+HD=:w/NQiLq/\Kw!WIm
-ADk84 000f445c7da001202b3 Page 259 of binaries1.zip
@#tT=8 aqILqm^d5RIm:G$T:WSe96AcmE=c5WJudA\E@6Wq/tA#VnwA/*/4dkDQ%5w1c9wWKnWAiQdZM>uk:BPS
B^abRA tFYKiFcZ=wE\G?ib=pWHXK#w\1T\pJkm/HMd9+TK?\P%=<Ie>DS@WB/mmY9:5&:&b*pdNqCWNA%5*Q\C
GAj6EJ A\IQlIaE?u1/:jWJCAIC\k/EB945h6/!*kTayqA$Xkq#mc^R%ymmpNSp&Bt5jCSYIB9?#!KkwQGVtRXV
hS!ZZM XXMF8t*Eki=!IeEbGti/KC?9:#$ck<b1ZRqwT9D#m\Heqj\SRG\+@AI/?jp9k4@qc/HSiun=AH>mTTRI
w^V6lJ mR/B6^WQ^NX5bjK<?9D$I@#<!?Gq#@HKk8E+cAuE8\lWAe/ckpJCC+XFSJ#ka\hSectF555J6Nuqj8E!
X@Vt6$ ?j:?*4=?\Da1qpISiFla?PFDl\@FXValh>%SY@b4HNj+K<<j6JihnjVh9h*Ph1PN#WbdP*C?*pGHa%P#
Dj^6FC 4%ckYjY$^<>i9l$dS^wh\#@n1%Cd9\tC:b/cK&iPl?=#h>96/S>?I8QK*PZu:<^bEtM+B/MD6P:>D#n*
/\8/Vw t<K!mwIL1d6&5Se$>u@=Qa6#VF/k\95F^tW$49*=Qej+9YaR%b#D*S$FY%TXRck*w$wcBjDR#$BL&<54
%i:1>$ cjyyYFaBu@ESRG!ln5+XqQ*TVwBH%CFP=&/uWAH:=&*Q+c9t1y$I?I6=X\Q>\\H+k>kw:*BZS?FtFbZY
c&lZe5 $XF+Qddp%R1d\QGukJ9wyI?T61lCBI@jR4p%:YMAQt&@b+YjuaNnMIAj=PIbB8Anl>:cXF>hMZieqb=1
Bu5ZaD 4/B55NF&$<cNlm4!!?SY1c14cBmcGt1wG6k=PiAP8D%t6*!d+^dj$6cii<N#Ejy#&4%dua&EiE>l%wc/
$bPBuj YGl>y5lV6R$kNELqF5FlwN=VL%!?X6Qce^<%D@\=P6h$>+C*!&aVA9&X8tc&#t/ijwGw=Q%EjFJGhpFb
eaQ*?R VZNu*:$lYt=G=wXKAJ?GJkZMnKlBeD=\:&+jaH<6>5Lq4MVIVVaHn/heKYL&1e>&Y!a8Lp4tF!V#<AL+
%t*9*c \p5DelkFZE#1c^8=Y%1dt^51CnNnRX?QhHeYdq1>Cq^$C&MyC?l8qlhA>ybFT%b=LnGwBGBnR5EG=C>e
d1SnLK tAjeBkpek$h+l^ln*K&<jGAIZ4c>lIhXiMGB<!TjPWiXZCm*jPXK+Qq^b@5XW*GJ64E^iDt&SEqyqAI+
8p?yW1 nT%q:WKt\GIl9Cn44V=+dyXeBJmC+V*&bh9XKb1:+Kt88pdYaA1TLyW&@KK\!9Fl*Dk^KRpChVAGLH!@
c5%8w* BRYZ1FPw=8:MTD%1q#GX5AVWnaeK:>>I*cZhRFGn/Fw/:dXWqFjh/8*865Qi&hZh!<jZ#<@Zl^lnbcKu
CdTSjV 4WqSqlEG\eQN\dXpld!c?m!FyLGE=>@YkG8b?m?\BmA/6HTwwLq9XXiiM=KRAAhilkt#Iy@Q$k<Qt*L#
e=P#/J mDn!K4LpA<ylukB*81nwGTDct!<eH8H6b6C+!*u=\EDeK+h9J!u!k9*kALttITHFqQT<N/51#84\<F!u
HEBaV: $iAd&I=!e&9DT$hkjC^XhByJl\hiE+e\kHTb#^jMR8>tp!\#MBFkNLnN@&Wm&L/AT^&JD9L$*4jQF@MZ
K6GKJ1 uA9pWSkjjnC/yBEC?KdPAlyaCKck@@D/Gc&*Nm<?QNB::!/Z:h6*:HS#>\++EHpmlSm=$uX:eQkJPQ?Q
*dTPF> **=N#lAYa8Y<lZk?%FNZiQdpwj$?u6=?wWeVL=R$>D=<!8^PBlbmDPihdl9<@Py%V$9db@w*uA>:jiXc
PGuNDd VYNNdX%>b!>ZT*q%WjHI?DTcMFSy5^DyAjaF1>JG5V<+F+M\Fw&Z\Xlp4hYnW6SWb$bbX<6nw*#J#\B8
pqK1*? JWYj$ha+lQIPk?jVw&#QnVSQka%R&eAA:cD1N#ZKq1:eQpwj=V#1h#A/=lkE>u#u>cuItwNycG1E=%uI
d+Pwy5 &+ByTAdVEMwabZ8w4QS\cyTp4j><hyVh#<:SPRS5R9BP:@CE@Q4dV#:<cG681CZP\RmXH:=GpYK=icP%
u\\@J: nTqFadueetW%FSZh6WbWXS%db$iTw\MIA5\Ph=JLd?//T*9^<Re/+H+^@KC91\XEjq=tG4QRhP>tje%^
:m*!b5 mwKtq4:yBn6ZRk?Ek<^Q#&aYuD$h@V4=@jZknh1mC+uSIX+:dNdAh+>DXKB99tZ:uFp+hmIi\wKC$84G
jHNbS9 n6:?@1#5=9c:%jtZ88+@GADDMQ9IaM+5*CmN8%SYWbS#Q8NT*9u+a\H?cbeKmk18=F<K$JARE^MWIA9!
y=&FMT <yD=?RTq*e+XZm$5LC+64/y6dPF8:&l4d/+1#w\H\*BBq+Jm&bp^jCp&^yj<Apli66l>4C*&NqC:Sj:q
ucKGI+ >Bnd!/WC$eA^n!+k*eK:c&1MqM#VNn9G/TC=TG+q@PVke>SMqEMT#EB#E*^1JLWPFMHyye8Y?a&BYcA6
yy#KB> pKHBp%c5inp:^8+MVL5S?J65&P=*JDuuilQk4!TBeYNePPCQ<e:@amGD\JeENYD5EupJI9nCp=+YVBPk
:hGN8I :SSV<dDylB&%kTJG$VK^ZTMlKCAkIYP+cjMGY*VD^A*d#i@ta4jS\plZY%Nbt5!Q4wd^CJD=?ASpFmty
HnE4@Y cnAwdB4L!TV5Z&cAddHKd\wu/pyybGRI9J>eR4S1t/G^mkkD9NH>kK$R6#*6?kEYSKu=w9=yGq9@a6+\
I8MwWp wJ>Hp$EnqjE/V6FIMen@p&#uwie:lmdL<9AC>Ni8\hM$8LW\G96lQu:?HR\c&\$iut=+n1na9Xpc?:w=
GV8kM5 &m$J&qi5XpKCRBRE\XTt9+iu6<<?5G8wYm8ITM8HHV^\MK>lCkSBV&WLjS\ZIc=$jZ4*@HF@T$qGZNVB
^tS9MN RD<j#H5B8qaXkSyKZ!+FB*Q4AY$E!aHQQ!ctb9<H:dSdDeYbCXEH>95FlETiQJNZ$Z1ZGd$VF:#GeQKu
l=MiAI t1?wGQ@F\\jXdTNVM?D%i!>YNndYXFhnXZkqV$%>jY>:Wj:q\RpM=/B@9LPXaF=t?hcaX=NM=q@hd!+A
miI4ZD =m>bGKHpKVC9wAleH><D^F=Z/kM^j$6N*SiA>>QTQk&Q1TtZ\??6cqZw>=bt<QuQqNwR>%F?+hEua$BE
d1%dtb <F%e1/?n4c*XMV4cRwZ9GqVdCLIn^eB\niEL?QT\/ny+$tB#M$V%yENckaB@kMMPF#Aatkj*:w>KK&!=
Qja+:8 B\S*6DdYwa\iM^lI&L^Kee$Gt@ZYq41KK&TZ!151K%CMVZSWKVdduZBHDERBd4jM&jFIjYjj\?j99#GQ
%tlNV6 \Rj9>4VYX^Sj#y1:>iZybE4>TqHWyP1cYG%%IT+9ll&GiPB5VqEF$cXl:MjW?I5HuhWF=$>HBZp+d#Ce
N:WA&a +>@Rcy9Ldm?@wAPHWaM*+Q@K6c4G>y+::cj116y8hDRW=!Ti4:nhQ+k>NBy/?HARHaV*b5aXXFaWZE^L
l^PwL: TW6NQup$#N9Q\&Qj@wTeK@q=&YqSYmJmIkICEBd\C@ALTPw+yljQYaB&:1:841/&?6L5SDAB&Wa/XA$\
Slc8wR \&Q+C5D<GNBJKyi>DhK?V%y/D@D9TmcDHmD^<ySl!ACW\*bwaYtGn%<Rb5Bic9G!%RwKaD*TF51ki59&
A+mu&S 5dEYWB1pIXp#MAMJ1C::FZ^/aKEPGIPl=8al?CS$mVeak^$cXK&>aA#&Gyl6*lX\QC&@HBpDneWaN+PL
#u1#dN lclc?&5MBQ=AdCC/ZIPmd^?c$amP^kM&/Yn?BHQAbdA:5bFYEYqVV?GkWA$6qk4T!dmR8J!T\jyN&?\h
XChed9 Hb$eHdb8MDQW%XwNWwtBG1eJeA1T^TWY!K6naAlWX\6n4Q##lwCXZYmB<mTFm=l*bGXyB1dk>A4mu6eM
b6?mZ= DahkkDXpC*Ce\>NEHM5%<9Lck^%\+PM:CI@!<8Sk!BDpw+Q95qL+9S?bA<=NcC/4nDS<jq\A@kH5=VSc
huj$me 1R^<%mWMEwAnkl>?P9jkW$<iiZnJ:6LTL9nEk<<JnIKbmKnwinAKXtIwAaCTi141:Jw@ebuiIF>*D!>W
Pa5q<H ti*LDBcI&4@RA\qXaBVat6589^uH%SuE@VDW*di:Km<nMjawc5S/MD\TZcLK!EKdC=#L$GNCAKARka:>
9D:HR% D=6\8:u5Wty5bFnwkamayA6F6X$QH4<c@jTXYdd/AYj:Wj9$CYPaB<LW#>>dc&6wW=P+ABadEqQRXI*c
1JmnZ! pFXXX8IXiLqRXWh:jXFP=b%yHMe?HmDWAC:D/uS:Ck#DNBmGkjamMA!Zdc%StTRaBuWNIQcpE6IAjyqD
91TTb= nFHPRq&1q4bDP&PWw>%BX<<kGRIKLW%6CBjcheDVQ%hZXY1B:>$%J\5P^=/Kl!CAQ<@cdN%cE?M8?Dc%
N5d$+I hDA%X:cBiWljb&=lDwEK!XA4E<^D8Iw!Ek6>Pka::nBG&d%h>umkbMHSkQD+m?YhD>><@6Zb%q^jW%GG
H58QJ$ kkcW<9iq!FQMN/!*&4BGicZeplZKKky1lmb//81tD5+pJ$jCSC!*e*Dau6h&E=*A@!H!BWQ>N#5c1$wL
%d/q$W Ly&dm^4edHT@IR8la&^q/+R/:+JCRQ$nM9NK16DB!58QQ@><ina*V!jR*Yt>\Si\EQJWw@X&EN?BlVmE
5EMFIn PkPmTZWqqjY6*Y&JBSYNZc&%%/=e4t&:pJFSjwe^aInK596/8#&>w<:qwkGETTeP?:68h>+hhQyChq#\
\h#!+L @1n5*N!eNG5^WbAJkkK<@BA@CIwauL^&9dK&wcY>m:9u=5&i#8dK!&qkIQK6VI$N>jXt^qkXqaDhE<8S
kNp5K1 w9e?>+k^^uq=?eIFC!#cGYMe4Y8FlRSnWd1AX\^WSK5aN5d?Ey^jC>kWG<JP!Mm6XFSSlp<#bBqLPGY:
Lk?CSJ ^5dcF5DL5?c9B#PS4KCwyJkD4!8@JAQMSMmCBcd\Aujpqt:5b+!^&%J%>d*BWQmaYn8+l=++Y%DS<yQC
qHjQ>J 6q1It=6PGAwYIwNAhEbEmZ?!yDJFi=N@W8WAP1q*NKD?yA!l?/K?=#wHCpQM/mqeFE&6%eJpMlw8J!lB
>Hy%?8 qqmlyG>6k!+DY1%FBc*TjGl\B4IWGJpdnaeZEq?!YkPn<KyK@VWWGItNqWXajlwmEq$ne=56Y:h8BGPS
Iqa4E< kkb<!K<G*WAAH+bT??\PJ&:RcDmNNX$W+&QXK&jRPM4%RAMeRwpEZqGRF6jB54Dj+$WYq5b1!dRb$k9R
5pjH%J dSec&\qBMlpV+Kmm$ey=a?DL/dwRN^^lpFpT+jZF?W:C6:n#<EDw\6:E^&@a\1C^/+mKmhtA%dCSRKtc
5lA&:Q XR4K4Kwc:K9Acu\?:ii&^=%=w+P\G\GBRTElwcFH!lwt/$thbd$kJDAGEVi<iV=<8/pp@$J/W9^JLFdt
u%=yBc bH^CeuytD81q&>/DtmE<j\W/kwkcGQ?&GT<j>dhY=y>NPH+p<plMRpbiiZQjEARNu?jG*aHN8Dj$+lE&
ZC%<m1 #HnER*9$<ejd#8964*=Q+@!V9#K*?CXZX6a%XFiWp!w1K:E1wi4c?41tc=i96@!t+\YK$nLT$%J5$nLG
PuqJ\L NhP+QQ^q+?>wQbXb<YFi4p=&Y:h56Lbec&Tk4/?un+dLcqGJHt4G%n6*awbmc+^MVNcc:hyqmm+lt%6c
A&I#Vt t1FmdE!j^aBl!Kc91$*FNNuRhiWwMQmduh&Dw8NVWp<jQ?Dn/4^6m?$Y&+*Y=maGIDNRJ*RLXDT!di9t
n\<DAm ni9NVa&NDA*SZ/WNV#XC<@d5@V!hZWG>B\j8D\\=jCKnwQH&!Q69E>&kMIkAI#<HXjAeN%8yaGlqbdui
ZBke^: qLJ1/bKq<5yKK4wtBy11i68&++VE\P^BaMT*>6^:VF\1@@#8?cQ:jX*N@+w9jN*6Wd<%JVAjc!\&PWBA
>EPK%Z l+bnHD+ct+m19t8bV=$kSq!Y=&ZESi#j+&mqn?#HQm&VDR+:><:bn=kVmipZ<+54/qw/e!>e4&=41!&:
-ANnhh 0001068c24e001202b3 Page 260 of binaries1.zip
<!V@ZT pyNZeK*:<cPK6QPXN@yS@Y^Qh&hVVcCJa$n!1hlDQm/PP:\Pu5+1!D>*jJ?Dlc%:/IYeQK@FaplppNEk
iM^WB= DD/!1NIl5B@NdX$>eu%*?8@$h6Xj!#y%iN<8^!&ddDbatb5c/tq4WVW%WXMubTX$^$ycYZ?4:a1=c^$4
B@+9!a %q9JTlB6nGDQC$!kXtyE?!JyNMFEe6E!iSWNDZWXyhY4tI%aX/>e6lTV=bNDh</X%hR%KBS%ZqWqhJ%p
n<LGQc PdwGl5p8pq6KnHe$hN=E$WbVEhjCDqm@hii?mIRLShY6Q!t516JM1jGdB:\*mnhEX%Gwqy+um&@Vt4Mn
m<d\RS Zhe!DRh%jYl8Z*?&4%E>Bci\Kk4QpltCMtSBRRH^yey/c<*MnQX$1QCZ1<9!e9KkqwikQ+mRA:TZ5M!T
q:Henm =jA9p?ME5+E^/@BI4C!<K&ayHFSha?56n6lP8i*dNqwaG?ny/8lwccwVHZFkMSbKT+kKCcA8NRJL%:C5
k?9YE& ajA#BNkp%/!S\ASt!T#@Yl5$*WXEDLYKZ4SRSky%bGRI+aIpMqIcPD?jALQ9E&w%AXaE+=?h/:k18HKh
<:%VP/ Nmw8\CS=JhC\yMZwiEGFXW&DjjFQuB5dQ84q8u89l!jtJiD6++QcyKA<R@CBpppIPh1dm*/Q+/4MpGQ$
*=V*d< =elAb*XyaX:Y?a\#cYe!#tbtweaeXR%wXA=6=PpLJC/IkPP9wYDPGdujYXN$MjXWdP!JlQV5+64Pi+>R
ijqaNT 9MHMLtAjeda9Xe<ja<P#n*mHH#%/@9dh\:dKP^?ueJ=YZXZL:cjAVhbJXcPmS>S55/K<11GqQL@w<i@/
eXWXna 6ikRhX1KJK&TMwP9aM^P@un@=HbneecJR@6>9D#eh?>!*4byk:ZX?9ZYXqaY=tbkD/\*aDcMDb\&G#jd
Hy/VF= E9e&!J656>p:PNnd\bc%6q/@H4QtY&>qAWdDiK&ytaYF!Q1NY=%&B$VEueuM#EmKCh?@#>MDe%jd9hN^
1l9TYY m+&XlaYq>Wdd4cm:#J+>dm:P>q65$b%5K$6#M\9L>S5&dRW>85MXnhA<\nm1ij^$Su+XWVw$&hQb&wVm
LeM&Kb pK6Ze4M#M>KTRk%Ycc!%6LC$%FFa6tVJTmWqBR&nNhy1%G*d&b&hRGe\HFdcP#6:X1HnBYch@a9HA:h9
taD%ZH 6NaSeWnmThV@!t9Ziq$1haKmkw:VDM$&&8>$>@RlqEb$ZFJGh8F%+9dd&@E@9$dS%JLeM!eP?i?&6>In
!TXWa1 VIYP/WdHZi:i@pFwI5D^E@MnN16n4=a*6DYWZ:&WW%BT*uS:eLA#M!w18=Ew>Y69dYtMW%myc:J6?$/j
6QPePa +PQyX<19bl=%*&Tpb?dk:i9lFZelXEqRYBSChdR6BjmFbD*AWuV&>Ju$*\P^$66iXZA?:uCk%=:h446e
Cq+lM\ uP$&4Ve*M%%umw!%9m+!\Nyctly1#Ka4#PEi/I1ulBnShGFTECjV\XuLw%dkEk9pX1qR\DKn1EbXVaPm
Y&4n=H TWFQXJBHA/QWKXywJwYBuyIP!n&yEK&b=Ju6DFZBmGl1/c%bc&+JG<S/+>ahHmHHW!?X%LbDwMGtKMFW
XP9nXN G:>=YLtS!BATZ1m8ciJ/NK@:eYhB4JiXFtE46LbEF6*9Th?4X$>lw/nKRC#CEGRAiq#CEp5W6atcZL=X
j/CpS9 9G\euL^AIb1LVZT5aRl!p\WEyBa411*kb:D!MpWG@PJe^KC5wP18*RA@QP>>Qq=:h>l9&dllk:Y%qeXc
9?jX?G R%%+A@C&Xm=d5qBKVAkV^IXaBPtCj+StljG@C<I6TE^Jp%/\CF9M8WmG/HVQEGNH:d\EMVI8mIcwEY&p
9dJj8+ mM99RpIMFD\SHT!++GFWjCSNq?Fc8FkYXSCyI95k>\PZu5l%*WXeD9Z\>QV&AnHlV=^Y?J/4t1^uc&k9
*4>dGS G$VtAWWj+?>jQ/Z%6hSYwPP&*J#e9Q#LBWYqFVYN4h%>>&pRi4^/?@:VX!L&RPbl^d^=iD$!$NNRquei
lp:&6B >hyQ9%lR$Z^#ePR%Cn&t=1#Dl?y*I>n\>CQGMC>wpbHB8ydt>#lG^:pHuISFFhh/Hd*P$Z1#wdKmkqEP
hXpX/Y MWkqj&%VjZFYTatqGL?+NLIQC@iB1yBkECeZA>$%BYeVV$SHSWaeAuG?h^jDbjXPq^*PVw=P#66*:HLh
Hd+RRC 6Y9u#q*\juj9Bcnh+E>*V/>>?*!<Qjc/8i/m8?A:iB#BZG#dbthu:&n89MQXe@@lp&i!<\58b/Wu^Eaj
MwP>Q+ mamMnDkIPP:b8h%=8<58hEwRGBwYFl4w:?P^h:id/$/Z:W:EZ?T&&<QV^*j@kTQH+=P\XGycB4#^646Q
@Yq5@P *w>QVQh&6cM\BBWCE>%h+:dK46I%M#i#MqbbL46+td#mclWDI^$NXW5u*BuyCIdDcu6H?*Pw1GD5^>VE
eSHY%Y ?Nm4pahA&N<kJQJAwI@:NuV/VhYeyiCcPFXbT*iNta&h!%:WR\eJBAlH#8im<pGmBh*pn:i$*5b4EA/G
58JmlR ?:ubYiy?wZ!q?G41tY%&euZ*aR::PS/dePbCZ6H%t1JnlTZX#a$XSdubiXhLc&:$*&+6VD%%K9%Wiqy=
d8Nh$b J%FmYJhlLCAw9X^@^:tc>w45KQhNc\\6ud!Dk\P<ZP&*:9bXF^IRFldkS*cCu+<594EPnEV@5kiDR+MQ
m>nd8: $en!k9Pua++ePklL8N>u:!=uS\eHP:861CYRqTXtLwZ8!CMJTEFTRb=\yw5Y!Emm1/JVw4nInDAt\m<t
HdDbc\ 8WB&lVIFNPIcR\NMZ^J%8\BBy/i44cYq4c6uCKdi*NLK$wIjZe9X$\Z#k%RLSq&w4cPny&hkcLVYa9%G
4wH*wS %LQE#6HFI!Am@8#q5wb&+J>NZbbyI*:^5QD@FlRWX1AaPwXu6n//Xbwa5EXZ<^i!EL4da!5i6mc+cIGF
ccyhuC WJMYA86AS!kK<DB:Ip56pXPbwbAXlXqbTP^e*PlKLl?jAEPRBZkYAl$pLejD!nJ9H!AKpShZy/DcMWe*
<dqTST u$BW4S8!*<eDZjLe:i4mcG6n8R=$5c/tt8LKyR5qb$ZlQ*RlutlTlj>4SemwRAFNt=n4P$iZ=tA&1WI>
yRl%uw =jmIau>JKYJYA$MME=&FB%uEMHHP8ca&nEZecJV&TupqFXXYhR4:/l?+DQ&&n<6P%A!CMBJi*n+Rd?#j
Tdj4jt H:k91RJmDd!J6YD$K/:CQKV+?Qd=!IMdlE\8LTp8L4qYh4&!y4/y4d99*6D\!DNREB??jQ@%b+bB@<hE
KB/HFT jBq:@iVl4bdKwy#MnI^#YcmncV@6PeRp*=uFCS>^n8GuV^<ND<<<wk?#QMJwQMPQu+?<cK45?D:J\LuG
mWq=kt D1+Rl=Zi^PMXWuwD#ES=SRXYmXZ\XVa%NybtBhlKCm\kXMTtERc?GB&&ju9*yL?#4mR@K@N<iuycW6!^
S5V%q= CNRKEj+jFMna#^wWnCb$pap46Ihlb/JL5$im5GNe$WemD^$MDR*Bk9FAWwC@H?cD:&Q%<^jcH*nk<QGE
NKWc<p <@pqFXXXbRY=F<+!Mlcuy+HjQp!<dBnw<^MuV!imphQHnl\?FB+YG5II6AkKDpXh$NBq??TMm:u=q<Ga
$jVjiZ q6X&*B=?A^Jm>6aNb1k^u/w+:c551&K<#6S<HZYq:BLbqR4!mqy4>CuK/^#a6#8Dm5Ae$TuuTwih%@1I
yJWeRK M\q$\j+yP8CEaKPICDcmWDdV^edMCLmawcwBGkat=ndd68>&>>wHR8JkSHS5Ayw$ZNZWjZeI6h*+Tp#y
#a:Z%* #tacCR9CTP#WNLVa56*Nk#pS:Pk^\pleLc9P!mw51&8wK5uL#4qTXN:Th:84LQ%EdF4P>a1cM!iV!/5d
\8\$qA /ty4<8$YmkkJT%l=?B@!*Yy5bLQVN#VWd?<PB@5h8**<>&*WEiEZJYQ<9KAt?QmF>c@&>V<\GcINQ*=M
hqR#\H 8*i#4ibcLkmy6JTWSLB&aWEB/FVRG@W4&apcqt!D8A=h8pi&Ry8mlw4=qm>qy9#yWuSJVAIVy$9\TEw9
d9@:SE qF8yyKqubDy4#tNlbY&#ChTeqRXt^tX8kea*d>&G&dN5+\GQDLaChe/cZd9IhJ&b8VpTi/nh?+/h8%#*
/j&dH9 iAYE^/SpFXR$h81AATBy!A9PetHe$#^E*wL@q!BbTqX*K&w>ic<1@aD#G8w9Cw*Cw&t+N:GPXlh4S\W4
k6$Xu8 weKQuDZVT8BpjpGmd=\kYW^tyaw/k<KuI5ZPAlcBk=PVu+#BN&EwABHkFCZ#eIKq\Ekme^pLRYYm^NV9
8dnwyt \JGaYC^iJ9bw=PHDEaenDl$I*Pi?!^uY^N4CYF>VbdY5DF&TIaqJahLwwm%hB9@ZtyAS<R8JHqbEy+*b
jyCP9h ^S^EA^$ylmTP\9MFC^kL<RWpGYtmb\/L^K\pm^SDtk5iJ%4YauLecIkD^G81c5lTTH*Dyhy*:GBcCnAX
+$d+Zn :mmumT1dA9^!/@:Wp%y4dw:n\1mT/eju$XhQcHh:P%5d/&645G1yt61/l1bY<A#*Hn+ciWwImjEj9!HP
?u<Ae9 tLeT#HHB#&l*P?wA5Y#ab/ZX4Z&DI/?IkIRwe@mMe&HDDW?G\W+kKaH5BPPS<PNuL^?&qn^@@^9Hj^cH
R+<Zlt KW1ITjA6ZGVtqHT>84c/81J!6kK9+11641<IY5RyPRXGk6KI+VmDD&tJh+@SHjd1e1!M5:k\:<LbqGSG
*8Y&Y9 Iy+\i=w*IVE=KTpBDSw=k/X#u$pqimGj#YSeEM+<t=/Yty!etJB\Pn:8bG^5VA\Y!*JT/GS<R51=uJLK
V%$I^V yudR%R*X%/@VT=heK<!=pJ/YDK?Vpyb^Qn5*:@LqQDTVBRI9a4k8qtCiCC>:J9*58a8ZLliXX>ZW%ne&
YEMw@Y hh^Eq*G@VW#Q>pGa$XldlZy?EBWRmcj*!m&u4kWVwT?@hAuE%\14XR$N1Y41G@H68LP1E^F1PNk:&Tj*
6<4!T* Mw8jju^/>*#+RX@*Q*HGahT<&hHY!5#aWG>YX$$jDTVc8G&:t:8u6%>AMMkINHWm8/CMcLD%<8PQ1jGZ
%RbQVF A%&%^XpyMRh>=$&EL>WIuZ^+?8+QtVeStdtFyYiQ=ShZ%Xhj8=KXuXhRW6jhh/Q&Ru^5WqdS>jL4=YYZ
6LBYMG +5K#<1>XXSYFdyMXJR5IL%Be1dQbLTn<ABkIi*8HHS/B+bHlaj56^dlEtFKC#Meu6C4>\SAbZM4#=<<i
TDCFN6 D>*yc1p6L!9Bm6WK<4QQuWp+FZemNmd/cPRlpGaBj1C%Zde:&Y&#*aT/%/:S%>apGq5TdiWZ$^hlC@<5
j$QqZ* +F?+cMt!%e1c?1AGdDblt/Y*duN\&8/C>B#wRV6:>Mp8&Nd8i>^+h8%\IpTm*XcGLd/b9pX1&%b:NLZJ
iGAIi# *RNXLARhQyb\Nk@5cIe8>RiFdTW9F!iDC<*kb8Ft<LAI@Acb9q4L^9j$>j/HnSiQ:Dbn&km1/d/MX64%
1HDNiT !M&cDSRYNbI$tVATZGTWQIEIH+N\aJdMJ!T<TEFJnWJSZ!dFmcH5A#5*H$btCM#CL#t!ADiaCNLjyCc9
JkaBX6 mw&Vi<Cl+/jV#tXqwiE+Ga^$TYSCw<JDA@&<>?/\5#E*$qbc8tnlwwWLGR6bF6FlLjDF5$6\ap%?L!Cn
Y#9i<m RT*M*qmwZiC!&cWeSMMP?CIP*<mF&qcnu6Zaa5cmGZmI9ymh/QCBLehYeK%enc+E11t#cqDaq**D8h@H
QN@m>j PKPTlX%8&G+B5A&kI9d=?j6=yXYBlGB9:C4?mH$D+#CLPuJ<iQQ<<hC>9y+8CEK^b4^Fw4Y><$d9ddAN
kt%qi* EGT<SA4mG+w!CPQAuCZ?e@#n8?iQH9R$X=eXFSSeLc618uGj>8#N&ChW&+\^YMA+eE/%j@8*dbl>lA>#
NE5d^e Qu@=yKim=lPG5$>&/plLpcWpbYRY1\VtZKq5116EMwK9w4!t44Gq+bT?tI#E6NSC/bWZ/YAjWMZY^*hQ
EGI!G$ H6/>%hQh*hZX$Xyje@*cXc\R9+wZ$1@k<CinkLY+lFHKW%JeWqSWWqbiWaqX<%SiL!549u1%5LAA8$#Q
-Am9>5 000fff39804001202b3 Page 261 of binaries1.zip
<8#1in RXjtlHL!LliYXVh&*L^#@>:h96/8Vu4Z+4dt814!E9m&1<ZZTm81\VR&N#ZWXqheL:%YZF^$FT8\8A4K
RKVnJJ 11T$>DyalecYn8/d6&:h9u8jllycwX48&:%hdW*%%iZZ4q:P!TKG6l%c5$SBj/&J1dH/<mWR@1%iycm#
DLCVFy Sphh^hLHiRjEMe=M&?C\\:ecnYL/NjZ#!?mLpaG:Qj?KMeICjV*e666654a\M%%45lcqV/^5dP$I+?D4
9\By^d n@VD$bn+qHPZC1@Z6SG*wH:>?j#<jtjN%R6J^<N<=/MMQY$VmH:*iKHyp+emw=Dp!M\68BydWuC>44c5
lD@w+: MQ6m>8Y4=Y$*i=88JJ%M8FlaYqF&4dnke9cb/PCDiXmqT8qJBXFlRRE^CTHJ>V/i:48*P#48>A\IC\<N
1%k+$i SRp6l=YC+5LpPjNAZumWb9#$^e9Zd>?<i9y+<P:NG=*6:c&6#R%XFTXZ\hJi8yTXiT+6JRE$YiVlMMAB
Cuq1*! \N:yDAE=aTB$RGT9Z4F<PdaMY#w4N!W4L:h<qcK/q1Gyye$YP$hH=^$:h$N56e>uu:iZq+e:mGL9jZMq
yXp*9% 9AGCjmBNQN#*I6u8C8GtK:bL^yWIPNG$tEAp?\+jR=iyT/8dP\&$jqA+XCT=8VnBS8BkI%DXBC5*CniE
B^ej*m F1td8<eY*u#Wul@4dcPn?S85BDh%jZDYnaG4B>jZW%lWYQpk*JkX^JE?IDKDkmk=IalGnI56WMbAuc#m
D\XQE* ^bn=B#b8NB5D95\RaJDbBHubmEc+T5lKeFH*BpciTD/jY%Scj9*/6bKmR6T@LD9#@BuaN!inI<Q<>nl9
+@\P#k N6hZZ5GR\?V\yR!\A6k!?6#K@JHF=hlSL=:XDHp&qM1q4<JZe1LYQp9q=LCq?DJ<Pd/CHdZ!kme\qnLp
p+hhG+ /QAC?HI&%L!H5S1Z=&RtcyCSaQ9$Fii<:?:wCIaY&$Yi!$mkWGN*ZHunu*1&ly6%E&AmmDDn&<h*L=?k
!bmwjQ QtT*d/EyQumQ&K*d@R?GHn%GEedd>&lA<J>yPwaMBJwRR$i#Qphjnn#5/&m5Km<4K/>8:L^DDDBH*RCa
lP@%tn +wGV@9DY!KNHlH*A\V=MQ<KHPB+@i>bX>JCBp>:dTDPpBCZF^cVX*e<ZwA5*FiY%hjRGn91&T%am+6NT
F*qGjR R6J!+bM+k:AMcI4n+&EGnZQ\\h&?G%$hM!&M=yqYSn8y5:5d/<R/&D1:i&=m6@Bi9Ii68/PnDY9Bt@Et
hhbu#J qkc5phGAN=BBCQZijpAdij:</Rl6cIn?mHPI?Vyat*lH%+*8u4:dh?@i96*Z$>$FD*c$6dZP68PhPK!C
$waLQd +c*d>\ai$wbHSy/<iQZ?M&EMGHelqtlyRQtGK:qbtekc^P%dLc8?^6lw4h:KJa5Y!c%i6W4DRJ?mcML1
9>n5Aw +MLa4nwuFP^hn6&kkbPj@w%8cR@%*?^519pdTwV+i*6A6I:T1ndaBuYdnb8*&Dt=kAMEw+:t1pTm94ib
AhQj<? ieYw/V*SE&nm+>Q?n84C#KSnlDHRR<bAZ*jhSphtThZBiYPRe#pyMc?ww8d/%b\LYdqZm88/i>6K$?NQ
p8IwMG u:%TYqFih1$w>*^KWtJCSEA1w$I/S%6EXJlQWE!RS&Al%Z44Ht<ItaNS>=^ALIkndK?cpKk\J5AJ>wBZ
W>LjCZ RNKV@QnN&:G^D^@ik#qABXha9%Ij&ASpEi44ctBVFBhiS6h<E?KPH#peG8T@#&8Qm^McDtJ14K?641#A
\#=Xl@ YM%aNdN!bwZM!6XK1qT>NYdY69ddh!K1jWAdlacFH\\L\\=\lacFEZ&u5EnYmHD?k\hCkwQRQ<uj*<<Q
cEk94F <&Z5a@mKB^D>ek>FSEahn$<>u*Q%iq%Ll=HPh\yJke!FeYJE&TVPViLllwmCqa@<T%BkthG8I#thn*8K
=8L<4$ E\Q6>KtEHhC!Dd@eh!<9!K!B\1wy^p1i!#6\EZQYCD9AEGRIpRRqX#Mw4C4p8iIwXqa&duSi\BCaIyQ+
Zp6!?Q &Fpa^BtGQItXp^Iiu=b>6dK?ycP#9dG8?91%aqS=qk?mNDj*Ruym#CH@QR=Y?51MqhnK/XZaTt#XNLEe
pNtZR> E!5+tL%9GW4Vml\K<9K\qin\XZ\%ZS/H:=liPRWjp?RXmL/cuMw1^GRjuML&?C58NbHn/IVc^KKA\SYq
Z@eLHu Fn!>jQb=B8e%V6T#*TkcADtk!JmbRpWQ4=?nK64BB@%*:>!=jj9Puj=:D\by\DwECt>GQ*\GMVA=\=n>
=pC=kj !@194^>HZ/M^1t&N6VW%hW&\Baij9$Gy!V>#kRLHw:9QcI?Gy?cp\BV<+l!?*%S#:YwHA&j^a%uPRN&:
<Wlj*w ^EZF=R!hW&81c?8tG#kc8!yeyeYtyRTqF=wjiMwE@h9u>?@i$h?\9$Iq@hPDW\@+B8:jH^l+?JBGG/dS
d!V+I9 5Ie+nZX+lQ+EB%PCDiIQGQj\?/#>>^l*<d6p>BbGu4>?>&=$>N&dN/>t+WYikWYnD?JDdI?GS==m##mi
5K8@cw w1/yn:Al$8DDl>kAA%+NG#ap?t1?ijj8@j5Qu<hSG#+k9J<bC^DbAuVmpJ\RH:X^!Tw6\#ZGl11!m^a8
98&Wp6 YdF/8aK8kbaKqd4b^YZHh1dDh+DR&#Z@IdMDCJ4je*<8F4mIG9JFHAn$>jb$S\ejnk+Mi#Ypj>*&IwZ4
ci!PI1 F\C<Hpb%J?pZL=hWNudhSnNq@9\iG:udXqtRtZn5\D+t+h<wc/mGF4bPd8+?@9>C@NLy^E8Z!/4LT@I9
Z$95Se ZLmWZ%nS&6%SjTHlXMdqc=WXbcZFBSjTE8JP^1AGb<ebFRw&M1JmbAFSEV+iAXFb#b&l\j6S+S#KWAeF
<nP<m& H@I*FBWSIR6ATCDA^!ht4Ph>/>Q+?Nj^#&D4u#=>QA!4N\T1/5:68@*wWuS*K+m/$16=YijPJJ+A!8G9
i:Z!yc <N/#$&pdcBwVA&BeTYqGEXiaqJhTXFLV%Cb<9cPL1#9S\@lAiAREM+#n=Jnw+/lNJNGLHYIM:8NSWcnD
=d5=>= &8FDYQlTqC5/EBy/AQ+LSbh+I1PPHa8NnW>B5?I4/q4c%?y1@1C\1!@t=8SmeLJ\VcKekRAAL1:lhQB<
Z:C%S: E?%PSebBF^Mt+LyP$eZ*?!:/4Y&ppLSFBXkIV+?!?T^CGEE*J5RBwaG\^AwGlWPCHWq?Pm5Hmb&VV$Dk
9@N/WT D=qhWICVqeBdDL:A95npXGq>Y<?h8*h/Y8144=iYaEXakWlSTZq%XXuB^hSnB#\hLLRW=iWXGAw#mlm\
LQIq#& TmhY+1e<45CGP6M#XKcWPXSkjSRXb^R\?CyhpcGA\*hPKtJK8DJhBXhqJ$b&Ahu=+:nW!&Bt\LRh$Hb%
^Qj!/* *a%&ndjQ:yS/=MX4l<5?IdKS$Q@/<i*L=$>GHkM4R\<HB\eGBl<PEX&Cpey@S*l^hNcI!JbFbE@@@9dy
B?!Zu: @b9u\+N*d4T*NDY*wmLIJ/>RR9H*FB&y@C<+=$#nt$j@W9pIdj=H>^41Gl8dc<6uIdduPG8tIC$6lWq#
p\^?SJ T+wJmc/mJnW$VwEd:&\NZTp/KeY*&KRP@pbmFN\*?nn?tj*n&Q6*d!bj5d!aiwY@aZtH9eji+Y@\h@n:
6YJJZw &R@+KP9dN+^Z&A8Yq>M95Bee\PZw^<@$ebdQM@BMN9SM?l9GP=bS?lk?Tu<*>YaYu5d&+iQH#>k+@w&C
cMAP>k =pNN#/K#%H8*@\*\YRS\dKD/apY>NRbGPm5kPq8/c9qKm4/P8yKYBaTpP\mEpYK**^9i<ZV$/=>JXC+/
dGeSkn QHAHVF+XecHlXM!S<GB@Z&<9V*j*Qd9h*Bm818C4mLALhSXDHnw&QlqXJhe$*:k:>H#$/?VQ$bE:4Rnk
T<E6jA /AP?<\B9%aJwj5h8#*$BReB<=JGncLV:^jDeuKKK<yI4Ybqb8bhLGn4c/@KTV/jqqJSZqyhiK<^JV+k:
9ub1I# ES$TFBIe9Q<ABD+X*81L^WZ+leTE?Qn=iKYZdtQ+a\FaIB:EFS=tLTM5K5nQEMD=&AZEhK>>^Z=y@Sn@
FA>6@V PQaP*aS<<i\bYMDHn<EaQu*</PH>P:$h#YCiCuI#$=NP^S!NCENn4=*6dViaG?6V%j/wMJVyTk6X%Ckw
K=X8eS 4:ql5=$#<*At?CCcHuMmDw$S^bL\bF=mpGlKepy!$ttYW>kJLJa6=9m^a%m$LHB<JDI!IkJ%4EGNe$?e
L4*tj1 nD?FBu5XZK8wd?p$%/iCn%cX=Kb#+q#w*mKht+Z9y!D@Wy9A%J1Bkd151L&YY4<yn!k<tkc:Vq+j8JHl
i56D>R dhSEahQW+lMpAcnVAC%^FEhIhAa/*CPVBJhwaBT8^j\eSMCP5ZK\pNnaiAX@p%t+b%kXtBYMT&M/:\\P
YqbkHj Dh#8k9hiYqJ$6cAAw5LT/>YNdY$N%/?eQSut96YEkmqn!qM18QI*YIR@SK9dGhWbNaa1it\cju%StXZF
mFFm\q %DB%VIPFAw\iApdyqe=&&?\eHJ&eudeDyYkPm/iu//GTbtC$41P^a$=y@@:?ijV%!?jQu5BQauka^e#C
#XR&j8 n$iaQkk<:>ej9$FtE+A8I\Ch?Q:=\:8ZI:TB&#%hub$>jjiHSy/@Hj5$u/L:kyNt&l=mn%nA>YKE!kdZ
8ByHdd PM^+^KCSl984GA$eVd&FV!eBW4bKW/LjqymISHl=@XRDb*%4h^JXXHJKmphcPjWua^aIucSQaL@aj*#:
V#hqLM Nn:P?I!Q@@4MMn+L!GLjbu?\jMi?5w>@@w#c&M^<bu^tH@@&:ee9?kV>F\:QIeF#ywu9\:=NnWNM<RQ@
DP*aB> ^bnAJ@FyqqtMkiQ!>?@elAC/dl:HM\nHcQ8qet4/?kb/Kp5YLFm<jMX!JX$>VTXNjRjZPS!JCH4:n4Mn
DTEl=u d%EHVHTh/!HT#LXqX*NBM=?IQl\c/P?*#^6mR+>yh&WQABFybaVXpYMuVwMTLCV!cpVH/^?n\*&6qXeR
dDFPqH mu>>1cQP&k%&LtniAyyd!ER^I?^M%yX4FTWRw%?+qFhR&h4iXJKipJJhZF=bWX=cuH<8KV:&^NH>RWHk
cMB19T L5N<#=aAnIhW^eBnC5M9RX+ijk6QZ*?kER@pDRwPDw9a9qSIXAnpIR8@EC?@<MyVu!h@@@#&/TMc5Q+P
P+!%%T i/Q\/mZ<B$d8Qj!Mu\+@9H8#w/tt9Pl!%6t$^LlnpeCn8/8#@id%ywdcGyN1W/yL%VT$>a%M4Y!&PG^*
pLte!Z >hkHMV>/4#EuV!etycThPbPiejdeiZwthw/Wpb:KR?SMV<ZH^<XlJ?XP^MakKKPnn/IGn#EuV5TjPy&I
!E=\Li =tkWqqdY6ZT8N>V/SmG6FtCuk^ih=taB#W#mESD/LTkkw8%:88\84VZ@^L:N8ywVBI:G:wp%R?$yi\&d
*%pIhM RT94a+K5kpAnHZ\pE54IyhKB^lp!TWaJqSA9=&Mq&66!E9l^C@\tp*lILDQ\&CyY$iC:+H5Rmhi8Z5qH
pZi:a1 k#e8F^bj4&458NuZYZ*%jG#k#9Y/c111DNXbNd41D:Z9\N\*>h>15?ync6QAHwda&@wFq@wb6*ZLqt*k
9y\#%F ImHY*REiE8t1QS=yVR*AZ5%A$hm*8cdV+^@i9u:%+9t#y$@?nAk>ij45?c9ZcGnSh$L9awk/RTb%Q:/A
dKFD>: +u$&QDS\F?5V896k/QG#%^DckqieucQ8Y<jI^J^HSQVNEXe#&<Di&F>YiwiLn8PQ*KSSR&yPCj+6RjuN
m85LaJ VVQAZHQ*bZMJaI=DbuH+P*mlYRaR\ynGJqptJu=NVnAtb!ctJ^q@GL<bQ/h@EY^NM1abp^nmCQ/pV:BM
I?HHl# MmdRu>npV@Vh$^n\liH!D?:i/t=9418/ZwJ/d#D=Plc?b8FK14/899d!BR5ZLFt?dJYtuycKy14X#uq@
PXnZ/W =?RE@t/*V@j4V:?IIi%Qcjj/8yBk#RjBGu<5<tB\aICj:#+jd&@MC@QE9HB9Bb>>1HW>eua^eaquM9PK
@@k8d/ !86SN$8W89:?>qFjT<Xj^QT@WL=VHDZ%#Va^I>KR9+\qS%?+hLZ5YtF8=9t5uL!T?4dt55#EyA6F%!54
-AEkGa 0005f98a763001202b3 Page 262 of binaries1.zip
JM8eLb !/>j8*I^PT+t=plAEG4dGlB\cF@k/i5X=Yq4SWYF?AYFlRTE!L!ec1c:MH<<RIBw/*wk\qNXGE%4\kTE
BH4/k* ?Hq+lCSDZ@#/Mj:q<^lANpajbd^jQ9d^<#l1RQ@5$aP:Qc$NqTYZL=$H\KInRkK<>?=$*GynacT4?W%>
*nW4V$ 1actn1GJ&ZymXJ1un#@K#^<>jmI?MTZ6dMd=#A6bYbe8MZK+e4PJ^ynyyLVpbEaTuwmh=nwXH*j!=Iua
F^k%*M YEcMBJyFAt\qJCYn\XNFySX%#S$&^nyjKcTXZP#I$<%!+%\+N!5ZH<lWweW:ak6/l:8Kp+IeDcpEZFT#
VJdBbe jYtNn=wT*QTdKi#cm\WEBjE=X$em+GK/8tp!6/Da\6WcFI1mKFER\<^Qe*L#V=BJ@CkPSWq4nCVA!4t:
t!5^QD @ZbZW@Z%w55=YSi^VQE5%PMe*Y8@%>>XY=Ac/Y%9SFFZ9/j?ViPZPpQn9j1pBkNBbjAbq@!S6GG#:bc6
SX^l1n THkmn:aL=a>&H15B#eqi%>S/>iX*bl?eZ><?R5CF5H4?:Bu&FH8CQSX<l9149CZ<GTE+b+C5Jam5tRp$
uj%XXb a@V6m!iQlkaiQBkaHBy??84h&Ki9^QX/$J9nPN6E%V*cBDm#j/QFNn#WZV9V\FdZ?/TP8*Ec^#>FTT?R
pYqY/F tbHmp8blYZ8l4cWi+G454HiSFtiY\dw<@M&k#$=N+:QV$^DQVW@PV5=k5@Syqpq<euccQ98HMVE:Mj%l
w!*k:\ hyyB^&WG?968hDTDnC<y#L5$B$@$pXDnBR4ctA/j!8IFMw9pqm%X$6FS%%a$ehuqk8mb<$/PnwGhH*>M
&QpaA: w&n9?cMH6$E5Xq+4!D/Zm1c+lIaE:pju199&?jnR9ZEj^Z&?j1CiCQeWG+?GnShZNudei9D+NeD#>R*6
Q=4lZe F5B#@6@\?FQZYKKd5CnYC=8D=*SA!5Z<pt8FiSjPZenPKcl1c14MVpp/Y%mG&Cp48uRt@un$5WNMhQ^>
5$WnTR >+Wi>a<54TnQhSRXE!Z#C\8nwmy&qqZP?%HMl&1Tkk<eDqpnKmI8DDGjwAA@H#i@5MP6d<nSj^kda:^Z
PVCaRm HB6>@?Hny$>j99*<la#u!!eQduin!Vb=<CbQ^$ahDN:u/d4hjyPqmaEY=ajGMkyXh<%ce?9N>5+:h*9+
P6/e^H :A<JI/:\J1Ayk=uEyLT<@H#GbT/WD5&?pHtYK#$NTejWFEa!S^J!XuGMp!\uGCjF+8JQu$=MVpHDGK?Y
Cp&Ai+ Xha&6h8c/twCR+45:HN1EZpwZnL=6!A@Yeu9W5h\Z$XG?K=%e\^bB==9jXRZ=/LdR8HR$leVFCT##EHE
11#RpN DQa\\pNNwjI9$cWApcw$E!IW>LG\5QQ@ATXJ=1DQRaT#<ynpNqTWZMtF#aGqTKTtu:%+1cC$89uG9cH:
QI5H=+ uXZbeeE8F6wcG9$cQ!kQNQ+kimR@+SK*h&#eCQmAW$L=%=&wIM#XP/N6AwuB?lbkB/Pne%8\T/PwB^Gw
K&GmBI <<uu=Be9Z:<bJS\T!EAtNp5SN4N@ju:>NDd/?9uIMG%wmEbDZYakt99?i*LiH>GGStaj5hDwlA4EAS!p
A@i>W^ AnEc&!Qc4b1yBqJ>*S*i%89jeH\mY&pqtu*CJT*FwSHj%qE@*eDi$lY$Rt\KeYQY<kejaM#R@#BtGN@^
k&iJk! B+#j8Q^kj%>QS$6DhVp/FmZwmAM/D8>e6pSFm/yNZd=Ab5HmbZI4KV1cjMwWt>$8e:+Fe%#laP@ppDu&
Yu*IHC jjIQlFI9Hk@i:i%51mpD1+<KPTIPw6FFkRGkqj^tjVE@iZ<RdtHlpcnbR?4b:IJ4SA9Fphijjp/N9/dh
T99+$^ cm/jS<PKmacPmdZhnn%i9kHELCRCnWMyF*MKT/:tb=$>h#E:9/!l8dd\VNKb@LJK%AimPQ@5/hnww+eD
=?pNnB AwtG:u/?998<R\NCCm4K4@w8YTAt\m<wk6kRaF6pG^mE4k\Fwi+CB!M&!AmJm\kKaAJ<jN^<\wdq+=<@
<J&eBR jj#\un/1?G:$Qi1>?9Z:4#@M*6mQ:mQ^Xk49:$#m!cPw\HV*D99NXt5NWa8p=XR6QTPW@uDa9k6%qWSX
+9NRJB ynEuV!YmR?+L1Hqe@yW4BaZaXi:Ckm9w$Q4mic/#/iqu#kAhYAyHeqJC\1q+LA+@TVy^<mRYJ^wQwXe!
$mCXAI e%=FKhDS66XMX*Pe\4cAuaPD\aq^pdm=mP8m4D#<Q\V=dM<*Dh&4#a4&5NdS@IQ\$Nwet6%J1+4h4kN+
wlTqIV GItAm!Hp&:!Hae1*CdKWwNBmhDA1!<XBbDwJD<QC^p5YuCT#CuIVE\6ILARj*K8P\99PTD+hl<XKuIlL
ae$k<^ TDtdjcY$44%9/NHh%1LW\?+d>TtWcARG#$hew6uGGqWVd>&Ka1Z6KFVc6i6wjRPA$hBY%Q$h=$hK:ijZ
5/<y$V #^@HSwEM:DZ?Cu8J9eBjpq?lcZRjCbe!CVETktM^ARj<AEC89Z*%HEXW/MCCGWu>hTt5H/y?#VtW9>HS
NHy=5Y !Q*1mRcYi4+ddWZ6d@GbL:X4WEpVB??K+JaiaIK45VjJZXhGDH\MTXwn5^huaL@^c:n<R!K^$FBVjt&P
+apB^> l6NAR?VleQ5FT>Y$NKt1C/YqF<nKLXZT$mc4Kc$ByRW+kK>\SuijXnm/Zj*/b\4hPS5bRp146l\y4iV+
j*K8X+ tCPHWRqVMJI<ARHV@wwB?\t=hAT%L$6DeW^Ne@j6\Th9Q@?iHH<>hLP=@DJBk!9RAD@*H^RnpFpdHZam
$kqqMW tSYMSnbHSl+>eVRIQE#J%e9bb<>tbq$14G1wLeqMTe$8Lc?CTKc5+GJm:NGnpj/Eu@D#^jay?Zl::jj*
^BwZa? n4=aZyy*TFFeXIBM*DLk==R\DRkq45IRF&8nZY#X^aYFae5ICQB#<=AXVlP^#F95njLdh/Nk8n/Nj$Wu
+e#aNi SbNIV++M*4tBSldpbeGdSQQw9ji/PNyct^uyWnX@A^MR!/!#&wn1\jh/?j*DBB4>p=%DVQ+yK1IZe%$6
<SeQaV 8JKjh!p4p@NeSkbApacq+mq5TapJy:F+qnn/Tat+iCT+IAVKAHhSiK&m64HX*qKjPp+l/bBJGAjGPeuF
CpnGLW ^k&?+yeku/^Z#eBR!?W+9/*/XIIFZd9DiV$Q!+<=wTq=?ywR!=AF@%?=>R5?q=Bc4pVSWF*B!/\HIF\F
u!I:J1 K#hbEH\F#!yJhHpBPSCM^CY?QV$y@ulWBBa8AV@Bp+uyYRZZG:99Q/d%XGWi>:M#$mSRIPGA\win/>hd
E*$LKD d:DbBG/CPiB6y?6&9<LY*@Yp=9y4TF/lp:u9+^B%E+9<>5&j%@#9Sn><G9@&+@jEFER5mAEYDGQ\$1h?
F*9@RT j^<Ha6/<jI+>=Z@&@PWd>G&w+Ihk+C6P?qQ^jPc9k&ABB+ENa$lbQS411j@h\FHj*NbSTMN\6ye85kAC
&Nl1!h y?Dm*hY*/$BZeVZi1M*eICRIJLBJ4\!j4keMFk:hJ@J4<^mpARa^$bGH\9hyT/?A1I^u6a!W=ALbJT9W
J?w886 6ctcmqR:%:tIk=pnh:A:DkH>4@EQEHAk#hVA%E!uCbDRZA$kkSE+8^<QqEeXjbGk\XHcKK@wPwV#h^<?
yNdS5m jVe?<ijL1+i>Vhe9u$8IDpWaGBAatG1BaHJ!R$p1\IjA+Nm?e?e9Zd%/Pih<^6pLF@QK/818Z$yNQq>T
AcCMMI ZqpFk1p+J?%E%JEnaaSQREINyB4tJdnQ%*>9YpX=?ZpnTVF$kRRnm\6\C?9=HQV#*<@p+GD$MV>NRWFY
tyRFiV ERk/iQq=8jpZ?L=CjRY^X@l4^Vh9RVRlDmcty6FaRVT=w\%hkTdcw1Dc+4$:udb8MEihiCaIDI#N=nGa
YEANyn h\&up%JBMtYlImckwLmaZ5KNYyyeSl!I#uEA!mpqPTtSmQFQ$p>IuCSATE^E5mpQPKlydHXcd\Ae5Gu4
ipibC# 5LA^PFk+@+B4+EeeCFtX*ZuWXb\e86$EPBmt<G41P$eX*BwwnZdWc1PR6QS=/aI#SFb<b5+jjCiVlMVp
DQQJmV Ma1R5nDdZLTB@5<yIDSF^kZaX!^kb+Gwk!BAqthNXGRa^I=wdpya=LH+6K!CmybdNDV&QD=+?#w1E\D5
dMPwdh A!+^j5wKFR=8*AV?kHAHLm/:n4R&@K=uc/w4@QpVF$AmciLHh\nuEAQaKM5::P*5G@/*aGuA\9?eRCyy
$np/=L ik+CccKp@nMI1nhIV1EABA$p@9qu*k?R:9e>uRX^SAeukERTVq!%R+H::byjDZkDj&NVT&uZLI:@Q1mA
XuIY=y IuePWbpNBR?:y^8+/:9:my%E?FDQZjbFVm@wnCdpDIai*EEFh#WXe^RpuV+be^SX6P:VY:mKw1clLm56
&JZ&1b Jd%\mb\<XaC1wt#p6yMynwncW95XDuaH^%Dp<Qd=<MDh*w:G/nJCP<RhQ*1E+ABNn\wJ^wLwkRyw?k#!
mn\**e B8BbmbPQ?ncW%lwFDn/@SB#pI\=<@uJkwG6m9Y*HHt<@RqMhBk/mA&I#L?RZF8SiTEiC+&yXdiYX>PTM
^Q8jVe K+AB:QN4q#QmnpbGHjd#l*DFq?HDA9G?k1iHl/iZ%?=n%!51m4a8ElNB=/Bk>ZuIK45nR%CnBcI@c9TJ
A4YdS: +DYCbF/I#RZ+BQm+iWR&*Hn&nQ=e?RZl4D><Jyb@E9W>SjwIw1M4KD1KIXJd8=!&&Xm8NhVXwp=SXtyT
&%=tQZ hR#?J\c^eYl8##p$M!4@T8HX+8J4%?mq*CZFX\8I\n/CA$InycACRRKDE*RRIARIwJDPuEiqeiW%Dc*P
5hn+l^ G\!%9qDahNd\55>#IEn?Kel4%n^!1?J5^G=LLe%JAkQDZeiL:#\wn4JHGK^d\D?Q\VRbRVBP=lXinm:T
9/c4yT TdLD:y>lbTh^CAnB%#lBP@J^5M+D5IS6=i=>Z8=:>:y:iQ5FlS?NV<5818u5j@!\w#kq*M%Kt/tFTGP+
*KY8Qc +H9dhYcYBABID>p:a66J96YN9?yJVhWqQ?dC/^@j9^HdH\K!>+^S?n9?$jejQ^F#6yEKt5a@+R8bPT5$
NdMScQ M9MDEW&<ij98^h8QZ=AFa64@d#kda:lylPpA<GHTI^4lAGaj5R<>HB=w?huAkM*jXqH?=V8Pb?p6YICG
#d!Fh& I+yL/@1e/Ymckh*j$FHy6=ALIeE89ec#e:wb:Z:ck:9@*j&uVwDZA!EV=LFwwaK/1wdmAppJtTYLq/wJ
Ap1&T6 cGpwcdpkMWSpuVBHl9%T^?NVj:=@Hu$^<4D@Xqe#WpJbGTtuaw?lc!cH\>H&Q+CF+mGMaAY\6wRQmE>M
+cJ!PQ Qbh>lbt:RJ9@#<VuF+M>nYYk:I@?*j!+^t@KY1wBwaaIN+Cmk<kI@>D$5=eKC@I9ymQBuZ?>84II^FB8
+qMc4d YWWX1KG!1^eVwmMmI+L<@XC5:8*n=iXJ><DeX*l+:k:KLcm5>FeRR@5jdZ<?AVqn^=A=MZV\+KFnB/$F
<ep#uc ^VuFlAZkK@#e*AIcnwYQ5Kj+M?ZuRABV4j/itpJ>>l<Q>HWT^X@uWdNLhE@X%hq8p>W/%P?DPw5A$NJF
:N>ACF &chN&@=NRH^CWlw^Xmu9TkECwHTtnL8$yKn\CkKAk\AA>BDQuB?A@V<VK$:5@>MJTYjPb<H&9%:h$PJm
<85\6% 5$d4M+Yp6+CX\aGDHGLl^5AL<Iw/$Qy45+>:d>cqE48jc4LubGu@@c8S&/m9KK#1Gt<ydJ44qQqtkRGe
/5Gcw8 aICFeAYj!V!Cm=XXKbRq*En?$\EDNm+?<BRMAVb?4npKGCR&5SZtnymV^I=hi:$DDpVFb?TYNh/pDjhY
6KBj\e uD*m5XGZ!aAkMEAjYL>&uduq9BC!^=^IP^Qcj/E=9qh9kR8A4V*=?>jQH>@SJJ6Q&Ei&D&Q9IRLnj@<B
ZYQ!>? :ZAIqKhttBn\E\ptytBC9wL9*aPiC^hc*9:+QVp#y+Lab11iQkaJSJ5lakF5tQWSiABWIDDaY98#kh+k
Z=6ku9 WN@Tpy@:B5id+p^qbIkbwiLLD#T$NmIl%Faj9byDllnASqLK@hqCWDB\>&dZQAXwtFn<mj?Q5L<AmG4:
-A?MSp 0001ac32b0a001202b3 Page 263 of binaries1.zip
$V#eXN @kjRaclyl4T:P+bGEFSWFBCWEBESFAWL5d5LFRWFyS5pBGqtcFBWdFSW9QdXi?%Yc8ce6>a?k*1@9@>:
QABQ5G D<TN5J$+=@Qb/:Q&Z4EH=Q!GhY5C=*Z9PYL$tDED8^y$/hG::&Cl^HDWtGt?uT+B=lhRdwPY!Fw\H8Nl
EZl^4B $<$4F!yL<:MRH!GH>8@hnV$E6&=BJkAXP6aQ&:Rb&\kiPuL<JGpnTP1YQ@uu+<<jd^<*%yMG5MACd&VB
T*INTW J:^*1tdn^w#:Kbq5knWWjJa!ykAq$hbFJ!Pmp%PV+$?hQBWbGb8Su*<&:pSahHb?RWFijq=YjPnidX8*
W*K^9* BtE?\LKAAGAC&AGFu*\^9cTjy%>5ajF?*@H/?qwCLh\\+k9$y/%i6+d$paHH*4%DQK?*8y/8WMkDW/DJ
CwepHP E\<<hIN1H9X:t^%6\a?Q4=<*+?Ed5^YAwW>4MA:T#ZutXB6Le%QKCNP6BtNdVy8yRAcQ?R9>An4JEHL<
R*<u4< SESWDFkD%EVbPVt=Hii+8VubaBCTkR:cDB*RHB\LCeF\<RQWjtwj6X<QGZH+!LEVy&MV$#J#C$9LF<!!
VVmu9+ NupH/La%WGMa\icnj<AVn+&=W=F/PMnhT5pI&/XHet>hV>9mdQSCwn=/YI?ik<i>p1kc&jFFHXwaKCn@
yW6*My JbDimDlcZWhKJIN/<Fq6YAyblh58pkMnPL<a$XPFP<+P!^B/iC>b8YH*$em$ky1d#hhK+9a6u#PBIWVj
y^TJRk j&l>/98CTbM^GuTGQi+k8dt=i/\wAKPkK19PL@^Gm!pM+9uBNG#:\HCCjp*@T@<n\I*8#<\l8IJCT9Rk
Q4+h#y @uH4>!?jQ4^><&?nNCe?LQJMctJpjuQdd<N\98+B11I&wwnp^C6k*&<w?RKKTI/B^FWJh!qc:eFeJS>$
dp>b&/ >L&#1<4cyBwX59DyBq*Ilt9@Hj>W@k<dMG+G&ICNe#i6^+ME@\G>l\Mj?yIinj$EI\*HkqH\Jy:BQM1D
T?LBDp el@w=kwTMA:<kliQ:yNRYXBETXlm+hD?jZ6&:>1=HRqBdYcV8LDl8CP/c\@Y>+:AnJtm561GY\?i@98y
!@$HMD =j8d^+$ZyGi^I@K/AEKId^L%<cNGnb$$T>*Qh+GNbE!dbITl?YS:X=BITlMB1@@m4ThQ^/it^EhmjpBW
9kBF%8 <6t<uPV\5FMbRA51Z@>5c5VB:b8*dqlBcMG\\k>aIX?p=ii@%Ci<SF1YPEqQV%8A#kLNW^Ya?1?u%ttR
D?<yj& d1ndh$@iFYC51/89JRId\hQpCL5H%JKanEhM6NYHL#@cju=?<?K9P%jQM=ZTVwa\!WW?Zyk&QeWGW?<w
K/C!aS +!EtytcYE!hQ5*h!>jD!aR1udehTcLmLFI5YkyDmZF=HQk>e@LNIm<T+KL$@cRE1/hABppY^q>=H:>eq
\q$M/$ #ABm^AA^ekyK!:!hdE#iTFVNS184WWAM8TcqRY9Twm>c*B+:c:QCNu4dGl8&EtdaLR@Jd:!T6NHS/B<J
uNI!Xa j>VRRZ*$\Rl1>Sk<:nZ\c8aRRV9\k\Z<cAN?wA@>n$lFd!kqaa<W5!kXFq8B5ja1/kK=1F*I=k5=Tw4$
=6Qh%j WFH9a#EFmP@1=dh1$::R8LNqDTBRpwNZ8$<$JA\b>bLYi?W$$Sy5BuEhuMF#eQQeJJYm^ck/??IdX961
W%i61? c@u^+#6l!KhPmqC9?YS#+m6+#pCQXtAHPbHA5JuQ#VjPywVC1ymbqb/YpbwYqZT>VcGk1M?$c5iFm<</
KCPawC mMFAhmnRaFD\4h4hy18!$1>TXtqdKdip4Dc6Tp:VH>hV=IlhPDY?8l\NSqq=V9c1uwRlQZ&c1=Al>^19
%nBkkA E+ce!@1DITmc<Kl6aa>i\+cQHNyhD!&G%wC^p6EnLd&>P*%u!u$IWMVF*j9?^#e9H=QD<QLm*M#p8FNl
hECd!% eF5QMCVbwYRJ9YpEN1Vh!Y!yaLQm*PKK<\&N#e>ij&4=>94S#jPq&apS\V8RI6MuGQ/WeMA/Vbp#d?G!
9^\mAl Nb4khG<I5l<#4pM!!hl1t6QeBZ+4X1>q#MjYSh6Qua^JTp/MQupmI8J$ZEb8dqyp&Mtpe\YFaD:Puap=
I^9Huh 9GQVyw&4MQ<*RMpT^YLFIwW9:hN*$XL99hKK1pIQZX$>wWA5FwtADTN<Nt\ACyLaL5:89V5mjA#$6dWw
C=BpMy kRqjW$Pk/%VWlLG*n#B@Ci#H6>aYylFIjTYiRWTHl^#a6ZuhTlJaPt9t6Mp&qlQMKdPlFybYN4aaT@<u
PiZ@1t VR+#4pSmM8kwbEp?MF6S!C@I##?Zp=YSq9K@VFGtG?*hT?&l>?49&:@@\MHk+JAVy^mtqJV=PN8aANRu
kuCa5L >WZZt6KpNVR%NiCL1\Xp+R#L#a9e5eVB#Il\^hl?XXnl:W6^c&ec9yXwn^w?wK?iYE6LIPDnb:hla<AT
u9JTcY Ge*1y>GtJXj1LMcm9BJy/8Dy^Nk89^uDW8Wna%S%ua#WKJWPhueX66=+pI*&e:!Y4N+YjC16/H^VW&%t
<<=i8? !Q4=p+\IZj1@yQXdV5!$uInXZaA\#M/4#:p!+A56XWq?<y*tkYy1dju=+#5\l91mTSlDKMN@?=/aE/K\
EQ?*lw Yn5XX694F$&bwTiVp1pMqVPy<tVN%LVMtKT@Q/A6?Xu+=L:<ZpeVHn&\:uWw1ZL@dqZSD:AqLcX<ceY=
+pGb6< *P\YYu//J*G\8@DHl%SYhEkytXyFijGBWc$k4XSt%qd@q!paM^KPmRY:61G\Y4%1=a1qF6*:DB$?apAZ
1YS4<= Qj&8QT*:DBp@d5T+ih=MKKa!&64X^eX>=R&TF$jmMFFdSb$<nniYeIY^KIR5\:h5&:F4L+l6hBqVM@NK
=mW@cT Km>edY^?@8b#/>h@H>/wLeqKCA@i9nbkkR5\yW*CH#>1p4*u@CZLAwPC%n16DR#\>bnnan>t4KFEatlt
y4B?J9 M&QPQB>@e6\NpN/?iiHJE/jnp=LmIp/ES$SEJtiD5*EmLCaH/JKju=ihGLwLyNQ1be8JWWG&LAc&!H%b
N6dkhJ Q9KFjZ\YLjVhKK5:9<FAH>bYLaRMV:&*?<aNG=lRTC++SRin%k*W$\G?LPS#%Lpm!+R:VW#IQ6pBd&uF
VJ/MC6 FyPpeY^iblKy^<&p<M>#e*c\\*:yXycYX6a&5PA/#MdTpA^dh8\=iAVhD8\Ql+$8ewE5lWWh^j!m\u#M
t$RW\E H!FhjMb$ppWy65C1:N$LX*ZQu4%:kT%kX\lbWnN#<p6pDFp$VN*:5hn1/m$c1yweEjJE*#w&j9>KX$9C
e$tJ8b E/:J4KCI$49uw\KujbS\^w<bQcK@H4ledRJK1C:k/a$#M9\wWVX^=PByBVE6uhL4d=GGYL9*PItpu+L\
Nj5k\= lMcKqV!F1FZIut\pwFVc&F%E\<$5J<?a+^Y\d9j^?J!1^kj%8Te&i>5!HBu!k6a6e4P\ttk#cR4tywI*
uk!T6Y Qu9P95K!4/X1bVYbDa1jCQ!PN8TIpmS/uZaFGQIJVRwwLwamuI:Q:=:tSwThVEF/yCmTFWqW5pd1ta!+
EMbm^e W@W996B1*+99*Rh/hKAjDlSy9\?T1+q>YXd/W>yS?kMIWq/V<y1mL:qMbNTYwN@Y<t1bR11RcXSeLa&i
T^?%9Q %K$LJq+dy>d<L$XmI<PQa=9!4a#cYktR589Zh<m\wZ%$hR!/mZ4&HnX8%LDJuw#itpjNXWYKWC/#*Z!L
>wDq1J Zn%@hI?JhM\=p^RVEWa&W\+CTjd?6mkaZ5@apklT/KwWi!\$+>H%q%jN%&8LM?NPHN1?^y>RlJKInecN
JT/T/J tnDSd9+meGTZ4%m?jPqCi+@b$/jNZ4B5+@aX$<eaGYHBFc@F!<C5EQY%ciHS$JQSmau^pThPlIhH^J*J
I8*KI4 #pk+GS1blSX5<k6!W5L*dX/@ah$KyXFBt!L*qj9RC^Zi>MKim=a8L:napDDb$EAQuHT^qyCuwY8@jk6n
e*@<EX W!d6&4Q9WMVyQac/&6yCupDA%hARDD6+?!+t9n%:kSG^Q>1?j@nu!j&dF$uS?qkM%h//j9W!Q=@=e%&e
N1^*1k HLC&DVXyCC!ih9c#=tBP+yJq1:AABHDpPKP:\KCe#euL^&a\JayT8wR8=lbmZ%l\$8PmhW?jInSSmm>m
Ly=#qE W9dIh>N:>LB@>pFCpkRpTVEl!V<TVdh^dLc/l4y/1+aKV@SbT%N:%Ncn/:!tAEWiTHmGbuQYS=Zh1\=j
k4!q<S Q9p4eGV5/JH>5HNe1/BDTA9WiX!D$SdGZ$C@Pa6F4aRqnDtl^Y^65jmbmCj8P6dEZKI9J9YYKPAJt$5B
Bwc&CM V#SE+<jy1KwAW\\+A$\tVJ4y/4N!C#ay8hb<yiDW>pX&^wRwB5>y*RcuCic\bGAFmJpP5=!eZPLLbEAW
L:EG\k cX%8ij6Q>Ndd&@=pmw/TKcm<$JKkb>JKj/TF%Qe9L$6QlWapy=<=p=:etpRuK%LwXI&$4I!WmQVcd:V1
8Qa*Z: !?LZVZJCFHdVQdAqGN!wh9hia&X^m:T6>F5yV*a=@ZaLVV>&IIGN+t=#a<>XWFK=VLP55VlmYqeTC6J@
9B&LFn &\j1@G?1TA6#M>MTa$?jQHaa*QR6G>j@muB!/66*<NDBQZS$DZb&/>F9#Jll\=\Y@k:$INbp#t#*?WqQ
DJCilu H#?+jj%mdSpI4=T+$?FlwckW@p5YbAwaE%^Ca=LT#&KS$86*H4=+?:Z%<<5HX/8LM8LCDt+L<9eC1lmQ
RMlNW+ HYq8a#jj&>9Zd=HjpmY?*l=#bp:X5Hj#Ydql^%=19?*P6R:G^uc#QSa8Yht=qS5WEBWGFmW??tVa!jAV
5XlI9@ pcpbGetu\!JT<\qV#tXEH>1/d9&GXj/@:etmSbR9=eNc?N&:^$L@JctZdndKdA\M^MkWpWBVcLIwcA5T
tiNiH+ bRWR=eCl&BPdDeXmHSGjD:bGncP*=D^JH!ebwn@cju^/@i#B4W9XGEKqQNQDpGE9D:jb5^^t&E*D%H+:
$lj!jn i/!#Q^>nlRQZa9#H\cPl+chnWHlqbIQ5K5Rm&NIPtRC#lFB:aciJcJ*@$PRR8b#68@Z*EFMTnJGKDEtp
Z#A51= 94N6VF=JNB^H5>l1ctBJYIJQYy4mQw5&L==yB4abKYL89nt8?4:5&BL4H^LN5YNGDimmI\cG!IWKkaK9
W$qT@G \iN\STMtVQ+taW?!b4Xw6SJ?WGIXdc*HIp&>MSQ6b5@8!Yyu9BQ?V/G1cEAQVaXKP%6j6d9Ea4KD^=J%
nV\BY/ i$/pFF&/j/M$i6eTi^QCm/HQcJ*ny8btYQwEHZh\T?\D5/8?qK1YZWy>>lPDCn5/CC%?<WLq<$j1A^<d
Hd^<bu 41Q^\E/d4jRZY6V^<>>Ly$JQJ=>J\$QQyLbEPwtX*J=CJdNT1ZVX8Pm<4/&$P9W8:?t>J8yii^Qb!pKX
#QbeYu hXj%ZqN>Tc8$yjSLKde?@%!bk9/&Gb8IcS4w<t*TK&VThyqt:bX#ukMMpC&1QidjW%#Ap##pST*\ImeV
C:<wi< &:YjaN!SDi8J!FyGBZCZtPn*HnS+RBh6HW8>dn&GnB$%^G!8V/jM/8VFdQiXF=<!b>wq?hqyCW#Tj5nS
1B5GYb Vtck%1K&Y?$Aj^%8b8nJ$:Fa+\L41#a>i9u?Y<9HF@ecKk9P^Id6*^1$^NQi\5yt^u!9?X+LF*n:?HnQ
Nq9wT8 u?65Q*Y1<*!@YWGdh?:h6&jH=nZLq!:&ey<&ecK:d$DkPtbdc<Pm5PQl5Ru^aL=PuAkLn$<@p^IXhnLl
C@YmKI HKFF\huEa#9Y4>pR=K?$H<kKZ&AF9bD69hD:=\LKY*?y:?/Vh=y9L>M*$BEJSiC4<#n1\=bV&%k:dRk#
#XX+8n Dy?IPYVdXW6jt<9nC#ZX%QuV<?:eb\w>j9#YC9::<?bG$5w:ldR8&:+^CQ\T:@pi44PhHP&ytaQ6\XX%
kFidjZ ejQ\\4*h%i5&pY=FaE8X>mM*9^BwIbPXhbRL!&T!$8LCQCW#6H<^I/SV8qK:1X*Wdn$p^\GqAepAdyV/
G5J@Z@ kkF=KYE:<qmWG1$8%%BV%>DkCD>ycalNA=jQtYBE/GFpPZ>H<wYtwtAj!#aJF!#IEH%6MX<wdBi$C%tC
-AQ#yD 0009509bf07001202b3 Page 264 of binaries1.zip
K56HFi Fn+6$PD#8L*H&yt%kmM@acdGV<ISFuAEdAmTSE6:tItu@&4#NlBc1mwaLkZ&R/mlTwKqeEhaV$XunPZW
X*AFw@ &R6Zdk?J!:9RhL5<jt?Aw!un9V?nhh<j6VA%NdP\BBjih6wM?^tPIhI!wEy=Ye4nFk^*p55:&u?S=S9n
KE/@c8 ^Z>AynD&R/=wwd@VjMZd&^HHV!ityccpJ9<EtqDJdTp5WF9e=JVW%MV$tB>a:$46i?FuqF96j%kS8pu>
E!a*B& d6Ph<<Yq:hIj\Bb?TjZ6$y\&tw+dmlEkcqwn\mw4&&Ye59L/<6N:l?KSu&4Q/XZ9/^p4ek*aWq1Rp=GT
=pAk!@ EI*P?:=h\Jb%Rc8J*k4\>@PT/QecPLCj45=PZd*8QaiQGVyp&kL9Q>p!b\/Y#X^Vk$jjF^nFFS6%PkJL
iyCNIT Z9#mC/nwuV6&:N1>D+$IaCR8JVP*1K#&<k*t#P@><:8ZK@LVww@9Y?%qQ>$JD^Vl+V&>QPhmnbLJ>uN>
N=lmN8 X/:d8uQ\*6&+6d4Wb=+LX8y#euH#tS+RSI:Fh&^iGBh!@HS<R6!y5FD1BD<!JV$%Pm\$?m\yX//bt*y!
d61CQG #@1k6aGWQ^hNCMMXBZBF98CuX+<FC:$Z4@dhi?@y*<j/k^pSkB$S<9tcQd%*:6lyk$piIQ!Q^=#c9LTu
X@paWK uk/j^^N\%XY=^4EZqcWP9+IHn$#B5=D5XD\R*:h><>1XAZ/aFie/^>tJtpW:D\CiiC:whN%J1$/+CBkc
@:Ewte uy&VX%BeIyYXqXi$X\w4!56paEN!ta/DiyGuImKRKMRjPeka=F*W#m/:\Cu=H/1W?DldG:?W1FyM%RK8
=G>t:* aI\I4e:Y$PS@$FI#<@c$WVLF^thjSpNn#l=QM#u/I<MNhLYWSKEE4Z\Y$X\cQF$hX!PJwX!mb8:CEwqd
D6ETa> 6N1IZ$KJcY&Y%q9SD!&FTFM5Mk4eihlV$M=IL6+QwVyj6=6GJ%>$XaVDLi\>@DeinDyde@h8XhKBFe=t
<@kI^8 lC+nu6K/Q:J5na^MVe$JZ/dQtPchWmeF\XXThVHqbk6NKhlAF/1NDZ!lj8kwN:$?jju!Di\K1m%kT!9N
uYEN+5 c:q@M?yEbFJ!TuL!#\R/pWyTJNMyHephRB5/SS$VhY??X6B1#SW9t=TGlTaP9FJ$*c+6dyh?L@$M/ybZ
@C$HD5 YbH/q1c4J@eu=+HcjddIcq6qG6X%YcptcF4Wiqn/bLSjA4d$ALbe4K$w#e<=k$en+MD@<p=YLKeCiQ=?
T?>C=M m:\th8*b4*<jucZc8kbh?++aNYnM:EZ@\^auy#t8Q4pQ<Im<4Qlebty<dFSpSDm=#e^tJy1Zud6AeS*E
5n?aQ8 <+FV$RqyYI1^48HYjib+=Mu6m&Xbl:h:#HchN>ihe6F#hZN*t?Q5CE!^t:NkchCt:jDj6#t5Y:qpweee
Su8YT\ ^=q&+Q?B*q1&hpQkC4jFkWCYuT6Zu#^/Mma?Qmw5NC\5ND\lNVW8QQV$teImMC%+pHl\W%DR85AqnGFB
YJiqGj 49n+WA6b*6RC8XjdjIWZ:h%q+iLFG&?<iuQP5ueZQi^EJiV^PD4P&@hd+/5?hQnw5hDI?PDhR*S$+SeC
WWk+*\ uwcc=nDHa$&p:nm+<F@i9unI<KW#5ulh+LIqm:!BMG/8CyjB4t:au5>*!S>5PaY=K%knI:<I!FJiYXqX
86eXL9 Zc&w$c1811!5AN6TeA/:@IB9Euu/F&QRNTGdI9KhBpkalm?u\aEH9lRBZ!ac@!*SMJucp/Y1y6c1#6aW
RRkVnR mn>y1a5HPhkbG:aDY*TNy9wj!dq=QZ&d1:Fp@QClZZT$BPC/h%KqBeTZPphL&*HYbIXEhd1S89nuL/Kk
wdI@=> YjpIup/HmDN?Y*nCnmE<FdceJFJn6EwdPncmLu%=LCXdhFV+?1NuL\4cE=FS&hlWt^c<e4aFIe9\^:SP
Bp#tZt \^#JiEMVM<8J%yN5y>qP*%yeY+^eKd?RYhbKkpS/!V8IhYFeqG>j9*:=@AW%&E>GlLZRey4Z<iJKRuSm
lj4n4V iuJTewImuyXA^e5Jbh1VYWphminQh/V\#&Vq^yXiy>?Y9L+LlGpnP%+h#Fqm$=&/kk/k/Ah\WT4T/8+w
wHcV!^ Qq@#/wYJILyhjQI9qKET1/nLPi9cB#%<6Y:hl?*@eytl!>Z/&9KT@LP+M\#PQPPl4AqmqBkQW+i>b@V1
mFJmdB *46jD$65thi6@<llk/#t?<#:4*F^euS!<RnHW@WK$GLyTjEacA*&Ja#wB*SA>%K:4jdA:V$TEkdCQAte
lNlTDW ?bLK<%h\b@l#!:jZD/ZSK##u#\iKPGH+<l!5<GM:ic1nl??KhX8&:>!?dj$KQ??Be&e:E4p@$>uh&#>\
=CnPww %jLqK>b5P*l!\/KAuS6YuDweGkZQi8IaFVw5LCwyPj=$cHlTRZEB5KWRlNm&NaF4A9*<Ge8CbFuw9ZDl
q!pXS$ kkYWX@9<h5?i<:&<5J1p:?KX/hZ9@1=#:>=FG#$XQp>VbLNq/cE>lC@HV+SHJl:dd/PuK<bT=F\%NY:9
ZJ+jRH wF9QZ4:?<PXu/>h*j#?<#VTSneiw5q%d%ki6<Qj#<ebCpuQh=<+F8un:LF//@JedD#BQAPPC#pt^XFbS
YjAt=j YXXD%e44/Fwl/jle#DVF?k>hmI6CHD:Fnm+:P@q!:BhjmljP5nJ/LqG*H1!1kuSl<eC!mH8ctSplX+VG
h=h>:6 DwFl^Ze8^c?%Had6X+RhkndkS^6wL^w$YD5+K*\NXbcS^!!J6VWL1+/!^HkI@>88jBJ>ALy\l@kjK5!Q
VilyQ: 6XFn5=uCA&\NkRkby!HW:T5GPhaBQ>QTGDJ*=jdRNNtN??e#D1>&tWC+$8MS4jN</jk^++%M#ThM6Jp<
%uB%T4 #hb^c%=%!hhT>SJb:dte%nbCFmBDB??ZQ+>8C\>EGLE4lC5<?9th#NPu+#JV5QQ%V?SK+9epPZCpA<!K
CX68w9 IyWD%!I^Ki*&\@8KQ&\K8m6$E@6cSaqC?4u$jTqQYq/VX>bPj>$/GFtmy?8We1t/DFlTZq8R5*a\tluX
/XEIRF du$ZQ&%ApnVh8qwQlmA9P\&##w<^:kwI5FWk\AlJjPFG#^:WyWjjLq&%6HZ$8\<cMYTIyaj*9N<pwYbQ
HK$/Rm eb1Fi*#dG^yAklYCtMPRc%Bl+TiXbkXW&F/<y+iCn^+u&8QM&Z^yXj&%&\?j9:q:JY#yR4h=5&hS>n$h
DQlpKa HJ$eHi^uVLPhQGWtEGH%l5*d6t*h5HK^q=8#@dS^6yMuV=qt:?#t=Si\bMuTbc5*:V+TES&ZELN6u5i?
KdC?X= w/Gua?QmIw=n&t^EZGJCbPmJtLQFmkLh\4!$p:9Y4qwh6G#y$p=:Rm&p9hpL9L\W<:>:>y#uPb>JJ%m!
:pWl\R !9@M^^@9N9V9118F:R%=ZK:^^KCnl\+C5$NQSy!PTap+PLi4nw/R!?Z#RN:w8y=@<i@:##@c94*:?/@d
<PujDn X^mGSIblJ8YGNT8ZLXpMX<=L+VqwQ6BnpX@Am6Zw9wPZElwiGR8\#pajySVwWX%dh@:CBZt>?ML=Pt!K
eY>i?t Dl1MhIAAL#/KaRk/<YCcmYYY@!dI+YQk?iGPeF=S5diDyhE#md4=cA$\KG*11lyepjmnF66kJDCpGji=
6BDX5< ZDhEyb^h*K<:Z!HA!6^6?MYZC%4B1CmA>Bw5Xp@utXyCeT5y:N5PLkyDne?m6$AN#T+>66hi9:^I&MER
1IlAc/ R=$Q^AAVyN&uC*n&dY!SY6@=t$PTT1<@1M</G8R/wW=CG!1MYIcZpB\Yj>Hm>9*nS+&XGJ6cYE/eQGZm
Q8/:%J @IT/V/WmcWZ^/bX:uu!m5BMwSTIPP#4?wAh+KI\lAhZXV15??#5nWnM<JktY+JlwK4a%nw1ukTB!JEmC
tetGVh A5hpXww<XRA8VFyGhuyP!dW:>+pqwb9ctXVi8?\dqWWK/cjT6$CTctuYS=1PHhinP\bu/bmF%y$9/=DS
ARtu/C bb1%bXpHnWt1Id8u@bW4DE88%FiDZMyKT+\=yV^n:N#4?5WT4*qnDL4*:N%XT/!6*&9\<AGnb@q+M46h
FJVRpc 41:w%D5:#/IecEe9B%8*>N!mHN#QVI!LSY9CiQhEMwC\b9AGtmMqk#n%lbYHAlh:#uN&5Liddte*\*:t
ll:M5& DLAW6yMt#*D^<q8=h6PYLb5&4F#p/VILG=4aYQijNM*i!e$VDeEm@%Wd>^\Jn++?Hdb@$*Ijn%p8T\/h
n<=4H! nw?LDKYPn\\Jm$=InD=^@HSGeYFBRYF^RXd$ka&4X1%i=4h$ChkSH:RnC^h+L=n9Nh>#95KVDZS9u$h:
XnepVt >J#u&WpZ9+CqJ%?%6b$i*hWANJla^NjRuDna:<n^I$iPlbIa1@TER@+D6jY%iS\iV$NXnY>XmA$j&:/>
?\Bye9 j@uZHYSLVqwC!X*b9tq6+IwAQ!^9VC$aSB:cj>q@ZbW$$tP\FKSZVi*=?91Lq?TZ6T>h4K<@Z%6VYTd6
&&6F=a 4EI/J84$1X>$Pjn4@HdHnq?EPZ+!EpNY+MGK9P\uGD+FqK4!YK11dWBu99mDq4yP%&:>^w&ukDIcw+&N
y?w#tM Sk:ywmZH6l^Ki/IA*hW1wQq!H5*Z=K14<PCNm!kT&k=pAhJ$aEXM:PQ*XjR9tBeN<ewL#e&:8lQQZyWu
jTLjw4 FFHk:cmLiuVu+6p<C:+E*d!CE+19NF</G^LpcuqSwtbwbG^mwnBX^SLADWmiGe&$PMN5&Kl^TJ/JN6a&
Bi\B!6 C>N1Tn/XC1Yq!Y/Pd9/bhe?@jJeV&>L9V?+Ae#46T5i#&*@qSJ/ITw!LaeZKw?ta6qk/nw=ZJLRuw8@T
l*c*68 Vu\YKlY?p8ppdtJTTqJ/d6uNB@<>h4!4$ZV*jJ=MK9%R?1bWIK&ynu*$tT/bMd=:6&/K4lwG8mQ5hpq4
qy!AdS =VK1VLP/MnN?q^ZbFi6tt6X/DjnV9iptYwcm*M^WhQPQH61Hnk8n^BRB9CYLjVGm*hN#R6e?ZZ6&EYwB
T@uRqD j+aM:V@G&h9nN*%AQ5%!eLCubl4cDPw:$HVNuyN^eatJ<a!h?e$jpA&HR+/HlWiCBAp@H4N%1diu=&!\
QBttN@ KA4dAXPuV=5KJtTT#YTMcq<Y6HH#qp*4Xm*!uPM\de1pmXbYE!hNuVHYedcH%@#=Zk8Z4N!+=@DJ!MkV
@9<1A* S*c6>ZPhMhq/!p!ZJX5PS+EMP\:KL!I8Qmd<GMw\1wA8$56JP4aqeHukmpYk\5DCLCS%%Tk9cn:q!jKk
SRlANt kDj6YQ*Yw:9T%9k8Y4^<?ja4@@#M6S*hSXepEk5FGp5$i$1<Dy$k*ItJV<4MCN:5QWyZZ/VJBV&t1nEm
#^&j#N <8YuH&*jCZe\&A8+e^J#&4FR+nL@Ja8^lIc9:&K5hSi+=p?@JV$4N%>yb5:ZZ:4eRF&l48yecYm+jBHa
^wR:Cl W%Yl:BaTH/$dFhqJH9V&>=I>E&y:X$IiZJYPHA@HAElCu9p##A$jT#RM>RHYclnbw1c1Dl:Mi!$Nkccc
I9YX1t 5Q9IMi!^+<j@LiGNH#X5bB>\ZeRm+E&:WE++>BP?y@kKH5ZH?4KcA1\=LhVT/lBVY9I@NNqQ$ZM\R4\=
euwuDn KZW*D+<!aJEVFk=dSXYNI^Vl4wGc5G99:u!t!\ZF=89PnTy5cL/ee&!Nt?XqmS4&>DcuJtlcV4A\N#M%
4@>6Wh N4yCW65j$FwN$\cQHDQP$ARM$RTHR!Y!>/XDC^db#=445YD@$jC+nP9N:^Rh:eCp%t?jQ:^?>iL=+$eQ
hDwTGc @:1etBAVFZWmqIyTn+VLhD1Tn1Tn=NFWDA%Mw8J@kF9VpTAHq+bKyqLwXFbKS^Kh\E6P#<+6pbYWZd6*
a$ddWN V++JlPS+p4yHkWh#VXbKETaBnc81<^N8$Q>YiJB1\B^>WbhF8dZqMyt<nK=T#::=#LNL>:c8:MH:Qq%H
t%idk^ J6&>$ZAi6=e#p9EMu@Fyj5p%9n<YmWe1#b5*#c1:jne>kXDHwM@kkWMti*w!XCLd!$/#bwHMtnuD#t:1
qRmTJW <EEDB\<cPY8&l@jTZRjCWG<ABI=k\1=mc@h6&>h/i1H#M69X#hF888*pTjA=ie1W!bP6Kb9ip?%t8T>a
-AF5$L 0008d1d967c001202b3 Page 265 of binaries1.zip
RmLH#< 5uLh^k*4%m#*eZiiaV9JcwIFZNhJW?$eb:6S:6d#9Q%Yd6y#PC#<=LGDY%d=#J=tQeF/889Tnj8PuRkJ
9NnS1B AcF&QPSIcFSeVMV^WNB1BZkwuy<i9uQ%<yY4mDPDjn?>kQbmAa*W$T*DKE@k$>\&>^+iudIN8BT\\u>n
8?Pw4h >bj:PZP/a8KlTGDF$XAV&i$QJ*Fe<WtyYVpu+nMuc*ZS+ZEEjHXX6T+du@$jKkZ9*dFq\=yAWlyS+hh@
^\ypQ^ CcqC5&+nq4+A1+EP#bu5e+Wq5ww16ECZG/=ic:88ji%1R<QF?41cZ&X8RdH>D+9AAqHd/S$G9%lE5ptA
>yN6n1 SjpFlS:V#j/TcI\^WGW4TRSGTQSPT%$I4%>Fk/M*ePDkIeQGnBuZL1HH/&IDci\jMYyw#%+>8ujZ%^cL
?XXiWI lV<E/M&*A1i?k+^nEd6Ep+MbFV/wQJaIPcYmBZ?labJ4a+:8W!AXZ$9ZP1I5h5Nwq4JQnD1+Pu\l<FJX
PuyRyk d?kwuW=P<RTPcbicG\mq4pk$nDBed6IWlc*tqEuYq8bt^wbZpXS&>&t6J+9:Dl$?i4!l1dtXtiYtw4JQ
8WM^/e yZVJcGu=^qpP>1+LjSj/Lqt*j9*&#V5KM6PTa/NQS=CRwLAVaSFHDl\PQu:mbDnY&1BPKTIXWY4SMVG^
<#\LCJ 5XVeS&CWIqE%PTp=Yb:CT1cT=Atm^LT#8TXq=YW!YWuJyd5puS&D!NA?Ki/1Zm56q4+6ja&WKn6@Pc8K
FQ$TBS y9@i&S%Ve#X$SQdJhSY!nnJPShY=:J\X9at&/:d</R%pFL4&qcXpq!BT/RD>qub<j:>jnQLWh^/w*WXZ
K9KX5G KBV4>Sp<wI@=ZE?GWhRe&yp%m*L5n+!cQ5%8dK<Bk\aQH++qVM$5dCdc?Q6+icL:n=$$KH6/P5@G!6wc
:=?dXY 8\PBNch5KG61wwGX>iRbV1:#F!<LYkhQHdDR*ZHcbPATbe+ndLJ*tn%u618X8=hj+Pc>l<QCnkj9Y8@9
AakT=Q +VDFc5LEcZQ<%8$KCV<JkD6<<DD<FSISE^N=QQS$ilER11CwMD6t@>yq!%a8YdTa<1Y>%SiRCFHKE+&T
aX\RuI kySpX:l*8QYa!@AJ/iT*JCB\ZXDY?#jZ%*R#$AM?VhDmc114t?/ImnkXHb8RuA1?Y$JE<C\hA*$ll!@W
k&Gt!D XGX4Lt\mhAIjmAqDDwjL8G9dyuXaV/anaMC!FSk89bpe$aD#\<Aj?#dX%q&w9*#q&9WdN&@JG*X9*d^^
uEI8*d @h1Xlw5ZtP+$yG\$\!jqb58B@Z9?=NPi9j9*p#PjVn/=&=w?qKmN/c/tw618^qduk8im!6ZWWP?9y5LY
?mm%J@ =Al$>d4%:NcNND#1*dN:X>J^RF@M=@Qkp@?hHNekqd+BqVy+dDBKHYm\5LKbYEEKI#E8Ecm:X6FnMFTW
48acCN qtD\l6SVY!^aJJtZ6GlV+\PJNLGBt:=1=*a$X*XK:wPGHBB+E/=LPIbGIPPtVJ@yRM&mHVpPM/bNtYkB
!8j<1C XL1GXDK=S+8?ld6Ilw@EnRRLp+pS\CT1bK!5K9Kk1<*MPi+iZtDmA=aHp1T&A+i\Vp*amjBVJ$NAp?#i
M<Kcqt i+CyY^MiH5E?FZGcmqTNAnL>SLEZK+>DE<XPVE41ACiJTlIpJmWt^MYBQAAdXhatW=iYZGm/n$p59:cy
DKac%H eij6a4:$DXCKpuJK!?9!e4@SLaqayq&nt#:jQLT8w4&MW%=SW*u8+FB5q/dmiP$tEK4ddR!p^HNLyc?$
EWpb$V c>9tZ%wQ?LVwF=<M9D^N?ujZ+R8%kFB>?$/j>&6DkR%5wi!FlE@Vyl1P/>q4$KCl%DB>4QWG^69I^A#d
Hk15WG aqmD8&M#ccIqNWEht\XM5G!jMNS!Ipc=a!lMWFDkC4<Fe&daVy^kbtymctw&aiIp&&q&>k/P5&c:i!&b
pHbpkn F4S%:?Fn^+:5*^Lw/&JudYFtPY&P:?16B+/C9k6FMZqk*<HDl<Mma!JQlJ^MKm^EMlYhT#1/iXZAmlY?
EkN?M^ 8NP&$J9pHqCi>D#Kk=+4h&i=@ZD6RW4tMB:T+mXL@Xi5CV#&%<8HS:91/\6FqpISu/QBGl+WG+$yKNkl
cARwbq 8dC5>QnTLuwGam=Z!AZdNKu??@8@@<L>NwbJ^\?VHSpTk1SaMYAq!i9j<l@QKL>aXqpD&1:l!9Wd6^y9
p&wX&p *%Heyi@w*t=59Eqc16XXqbNC!$Ct$d@JhQnRkj@4H9*^pAWFLndG#SL%ej&:<Nt1HYw1/kIkp%nI$%SX
4XuXD/ %>BpwylJVn!d!\Ml%\HGl^Iw?F>A+LEEd<EA6jQclS&CH$K&TC!YE\<JCcQRbwudSH?B6qQ9+dl9?<1J
4JIpu5 FEd&I*ZaKtyeqIY1\q:h%TtTCc>kc^ytZ#+d564F+1cEm$*#dKdbP:8+K#^+e>%eb#9PIJ*RGPLewjqu
99!D^E VReNG#XYatJ1:ld#1XSSMpb/wVy!u1tX@S#Z8b+L\KuEM6CBc>cSAke:TjY$w!FH>?:d9S<QDMLCI?kI
XZJlib Lpm:TCAN$Ka>YkH14kNwR=HNcup!uelQTE^ImI>LADPWX@^DyqFYZH:nRjMDlhIGWZjbVhiL@\Y?!KW<
S>:ceC YYX^=yp&/84\ZtCB%A$E\:jYXdYZ$iYcXSeLw5^/wX%mh#QJ9wYEcd^Y#=#FEPeIa<+/Jb&TMN=iZlk+
pMHbcP +>uF!>9Zd%yQ5WAk$85>5N@\tW4C#KceDb!Wmt:/NF6dP>9^QWY/9RePGV/eG5abD1RbQZ4MtLHWiBYJ
8\ED>Y IYXpbw#64ebL^p8\@R^VZ\S#*iH=q1Lq5ddAqwdG^5kaEyhpN>QB!h%:&d46?$aFH#%!ePj/bjMhdc*M
GnG$Yl kDH8jwEdh=H$1JBnwHkPHV!\b?@B+=HSaElDw<<YW@uek8LCM^E:XwPewlb^eW8BTX&tCGWwh^W*X<1N
iNQKPW ht%%/at%y6AGpWLWYMX#iYDk88*ND*MGhVZRtwDbMeCeHn=\@SNV#tVqkBa4Q^?=ecm8kd/AA:>VW^8Y
b?Hql: ?P=9QNky\<VQ/AlGG?Q^&GyF+MDXRY9Ydhm<dTjGLb@A4SXWe/ZaPbDau<ddh=8cqKW?hP:id4^%@X4D
5X<&Rk ^jQXYJTaMEj:V?a\G\8KHVTi:ClQR6HXTp+H+8RZPE<$8mhlD?G!&$HECh>15dZFRnXNnB&kNPWeBXjP
PnKHGH W?H#PwA8NJ@F?$pI<\FMn$Kw+Lj#<BCWI49YZ\q%eK8c@pYhh6EDwI/td6>Sj9P5NNq!\l8&b48kk<@y
K\HEnC %w9L%NXZ5DZ/:<p/5t1&icPpP^wd$Pt8Hq:whC:CdTwQX&h:&+qt^k^^d6QCK#Q:DSp?CqdXac5K!1Zj
P&pBAW Tn6KSlhL1=MC:CbQ^cLJ+A\9<9Nj9mI\mKpN5w8<=WNHRpNkDVq\GF6AeEmyNPTPIyKKWlD1KMn&uCJS
W19*Cy pRSYJ%GS\I8Qm+%Q#e+6qM4K95wEybWN6=+@86?EyVBJ/n!/SZi4m@+6@RjLSYR@wV<5uh\ddW$Zec@F
ZWFwqq %R$X<nK1ZLQmbqH&d1j8*jGeb=Sn@M<:RJ?8yE/R$mM/V8LRNnD/VS:AZ>4JHk<QV%M9d^<@j:j?Yn!i
A<^ZEL WLh*@&+t49QeqV6#+BA=MPy618&W!XN5nj9y<jnhi9edMZ4E!FHaPqJq=Cl1NDYt#%l5<Gb5N5F1+pT4
j?8>J\ ThMe=5##lpZi#<>*kS5&XVR^w5dVlkdGylda+tt!:XTRd5+im%b8&4E9PQnk6D&dA^i=#b^paYy1NhZF
8uAJVp h?XGW5RSD&CPMH9p?@d8&uZwbEL$<cMS1WZ=ijuAui!aA?5Cq1+I<AG4/c&M^=/uWLd8bLt&8ZVM/cp5
ED?Q+W $/d5j:TE6C&Ahc:mZ4&dTR>M1Seae#XaY4MT5qN\%#t91FRt8=aW9NlK9/5&n!@m1c9&6D:c?Ch#DnKJ
De4&LZ y?9pc\cRXGtTRa>iEDtNRZN#+hKX/%lHGKPnt/tHXLQik@9*t8/A#dtKnaGW9IuX?ZXYh4TVN#8yHVyK
BJ&JF1 k:Q@IEtXTWlJ#<1l<6pPqwbNE4XlRlY&1pKN4ewFX+kTc\m=Gl1cGly!5DX!dkeRS!FRR<pt?MF@D*bG
9eIX/Z #1h+/u\in<k%Y9BPTI8wZ&KN$t+Z*hj/D9=P%&qVnA$EyCRS^i^jw+*m1?4*:Tbm*B%\k4wMt^QkdHbH
G%T%Ii $59RbMIpP$huN!?jJRE4X1:C1wn?jn=i:5+#y%mcGq=H+6k$$5JuAYanl+$eQY/e/h1CC8u*$4cTpXJb
=a4Yd\ ajyGc$6TlH??6<?mJj:LX\Y8Z4h?+?b6aGd*:MP>*SPlB@eCea/H$tH<E<memFPEQIwwmnAHN?ew5y*A
wp*Q?K T1RTBHG^5VF^Kht=SXKbVQybSp6FFhE4d#=t1kjnF$aWaADPQ+R/*HJydR6NB\*5D8SS%?%l/%XRwTmV
Z\J<!/ q&9iKt*/54I:eZ*/4*^&F=tDej^T>H^mV!5n%Wmk&9JqlDt+YM\u#NEq#FulP:c4Fyi9$/6jH^NZD#jK
/<GlG4 bTD8!kF^jnNu$mV4mTbD8kw=I4$8QRiPGV6&uJEybWcdWmaYiC+&ib1h\?!=<%#l+5!dQ*?im<M$t\tt
RKHCYu l6k%eh#+<Wbk8T$54WDXVdKh:8A!j?tc#d5PHD!+h%9RW66=D4bYy5atINEYLq6D\na:/=<iWS/$:>m?
SmjR:q M<A?=GSEWpFlZq=?WXF8$6FN!=eG?GPQA?<FC$nKD<MdDXi$tc+8*=ZMtahFEwlc<\>al5#b5C:?!5*4
b>NJ^B <>m>>dWw9lFQp<&ZPMcpb?A?tqRtqX:L!n:946QNRMADMci818hbi4qY^nAHh#c^/MdGDa4%@ViRjKE>
qDhu=* ?+PQh44<BTYpk^AR=!/t+V^<%QHa+NFjD=8d:^QtMDY!<<+medTnTSAVEpib44hL5XPuM@IG5%ana>EP
+>8BCw =qL=KuaAYj+wQa+/Y$%NXW&NI@wAHw8/YE9E$<BEGyByKl\86wBT<BW<t1@CA^wypCpCBhtFa@EwkS#?
VRla?+ yad:c1K*RnY?JqkiF6tKa+uB:tl%mJ1$9wq+\qGGSwbhXFqkbPRaW<*HI!R%<dD^Bm#ppCaytVjC%9T8
6?utq? yLiS8e*M&S=i*u:LAnHRh9MtDIHE^CJ*b#5dM!NCIiNd6LD6R5mRIeNGnl5#iqEm%m^1KiqjYqq/$B+Q
Vp^i6a ?5D&#F9kA:hq?e4ANW#?^$+T+BFMlckFH#m\:/kw=Nn^5LAVJ$@?\TA/ll$dB:cuNWES#+tLnaqN#5nM
F4%khK LY!VjkHtCM4!>$&bZZ*>IYEPWY#*dlc?A6/$TupX=#ML96ASw*4mnndhScQ4mNn!<nJkD4j5cwY$+*k*
jVQE4> 5ytk&6&^98Mi^1=h9%^dWbKZqjb:S*6hb@C#9*@Au@VSJ@SbH4nce+1RJ>Dy&cj:GH5*X*B#6J&X1w*$
CC9=^E <=w<!edct4I!G6?uV%iBTCnTMinib@DIMSIn5+tVy<>$hJ#q:DVH^eZb\Z//nTX+nIdn^w\e\VRbHVji
&&lD?l GGqtaRB&!edY#tt8:+wNY@j5&:hu?:4q*5=VJ$+%N#E&5dJ#ZdBp%hwNtB^GCkn9JRR/hHD@*n&:ht:j
*PtqM! 6t&D&$mV+PTm@HN=STZ=b<K*4@Jd8k^Qkd\:C\$we/#b4m+8<np@b6M8*aE@<\l@jMnY<@IXiKe&:hl%
1$<$$Z 8LyBb?$AA/\j!hNW$^AMPJ^^>q^BCTWdJC&>YB^>a+QaAG!QRMkHcE/I45R<@5Rap4!*b!j\b#P%mh:e
EaNd6! u:TiP*CaeW4T5%C9Xb?@hQXtI^1hl*<>j9L$GXc#Mun/BK9@*5j!?%e8pm4XlEJD@$5lDJwF/>NJIY^+
G\K>9= la?LFlE+bG6/Y/I/jplQ6R=XFW*lS!ARLhdRF9M%%DR$&pG$$b^YEG=!Qq9AB>T@E!J#=H\cdI/cAGuV
nS99Qa IZwH*@FFtkKY5INSc<Cc8%yjkVY>?w?V>NFRIc\B$<MXCF4=cwJ?SkNbqLLmF%6Fj\S4@D&JEG:TdE@j
-A=*WQ 000827b9b8d001202b3 Page 266 of binaries1.zip
y@H/5N ye6Z45Gm$NSi$b=h&\FZkRGL9X\hdC$a*lniwQqj+%%GDl+?it#j>eZqQ$8@q>C!\btu*cjcVJ@FiD8?
i:C=h& VBu<hXnqHS=yD#qXQHw5bP>Y\d+nS<HDDeQ<1XPu1NP+qW%H1<ZEAt6c+^X^t8Cd^mThPX9+ZjyNyyD1
L*j4ww !WyV#+?#K4%!:\uY?5h1ia$XJWmbFuB!dnTp@p&ZtJECF?wGZjeZX%b$AF<8%J#>Yn//G@=W6aj^tS@*
?qCL>m kT>h4tQAGWd=h<dmkEynRuFwj$FA=^pR<tYEpm>4N&/aNX#ME*j94YQm/nduq:ZyNDa&%lQS?i>mbnT\
PMD@\\ j??8B6ycY6w/i44/?kdhi@ejNG#wMMWI>9Alk/mB>ICSA@9*HVB+KP/4EK@H^NVM#N#Cc6J$S:iF!+I&
tl^Zum d>?#h@iPnc5Y8>qlDTHnKYdYhuQtL%pb8HyN$N4%G$qGDSn99aCcR+ea6yC&m$6&>B6#KnY@6LR\K*4@
<c9c:d t1X?@w8J4YH1ETnJR48\ZKp=HdNduPp=*X*h5jVu@AWLFlK/LF9BLG!HDt:K>/$@QNJAX!VkkT8nwT4c
NpN8Nn qFFWXF1Gpe5qNhLVX^Q:/Za*\Q/pHBZXj65KCF%\d?WA9G/TVaRq\Zj9\RI9nHh#F16&wc%y9H8@?c@H
qp/\CH YD*n^h?Kq%&^1NK#J+?^G$RnKTLh!ba@DI+!Fte*6a9i4d&uM@qM8VX\>l!\^edwFnajFc54XFXW8J?$
5u%\SM =GK=YEWpwNSb+PPwe4leD5X6+Tu+iHdKl4jWL9kPHk&i?RB9kDP1!JpYEaw%h6i^QFXN9pCwEKp#4eM:
DPmyl* SHiANyTR$&&$bDCQBbK6uc*C+dWAb:yN6BbR!m1TKmweqj:ntmZ>nM!uPM%d6D\IhP18@a\nilR8#K/6
$LTQM% G%aH?M/ddYhyRqk#?n4Nd*6jP/*j+PGD#A?XXdTYjm$bWqyXqS/#dQLEca=#*En:CP!QFwm?+1c6&*d5
Zp\K\: atl#:MlB>iB6B+?EHKjC%IA&!B4N!Klw5qQhEheS!+&Jnp%K#<\G%?adpKbD1m$41L<*%?Xw+h$ZD=8c
$lYlYW :ndh8%L<4bR6LbQ>AN:<qQJK!!?i8WE@YTjySR4DmBih1/51/!muc#R!u#=#HI<SCc4hB^*:<AB+a@A4
&wi!Qa 4QpQnWaCQlZ?@D>bM@^ZFNdYHh5CB9GE*d4%u8nmPkj:nD5/@JbwNnaVLSWY>AS6a/MSA\aM/6>hZ%i9
X9LMX6 C^m*4q$MFNl=FV58>8:Vj>DkaiD/nB+^ik^wM\qq&N9I&N#Tby1D1@jT\A%\dZb5&:S/maj>yAttS5at
^JH<Tm =qMey4nPY+TI^yyiyIIFaHLHV4JJC/cc+R#KkHY4hkcdtK<N#!>NPd4Bj>HTbR5b#nAX!lZ8NLE9FFnH
yQB=Ky Nti=W?>b#uNeZJTXDjHkFGuD/IFNt*ae*GkYY*9GjYlZHTH\Sq&h^ZbL1!mD/!!VqlcZqpVY%N8M/N=N
RE^\A! LBCJ8Ky5uTXybE9!^LHDB@jD/%F5H+C9d><BppGl#Iey1/wDC*QuZ9MnaM##F!>j@TQ@6!9Ymu9?@Mun
lPlqXE l\?c:tBq/Kw!lnS^YpmceJK!TZJ5>uV5%mGEPWC1APCiAMk?bI!q+W&J&9k^R+R1qCw+H?I9\JpP5c1&
6A@yj@ TMVB8kC$ykIww!DdAm!kC<*9ELR4BbwC#E!LWEWp@Cd/AC^S$S*LGh>Dn<eSctpSecaRNRJjFEJN@iGT
GAMVRE WSlb$M=t5>S=Q@qeA\jj\RbKu\h+yNb#:F<TLYNLP%ij=i8&:mb=RBGu1Tm6$^Fact9Q>k&B@6=8Dnct
Z4Bb?+ lC>GX&pi>Y@k!CFDBw:jYFLVX91qbHB^TXqF@wG6M/!tP:t+i<^H9KE+k$WT?\Z6IHphl+/E/B<:9HZZ
%JkRI& \eNaR9BEiDm#MRB$?SqDS*NnalQV5\9\Fu&Y@yT^ai!RcqXWX>I@D9t6DL9$+mHaF?t*WuXy$ht<TtqL
$1LGZD /jhTSWqL/R@kVMYF4L\HZ%=5RZcw/\qtJX&5/!kZqJXZ=8XX@L*HcZn946&w414hi1%<$a!?nVJ*lqHq
pHVpk9 i+p/R&5VECD*=@</$\HcGBDcaA+mLB?H>%44mA!/hnh&h1YenMHa@GcN6jXEK$5Le*M#M\5L5>Fnlk\b
91eCnD QZba9^=h8*dHN5d>5WQy\MFDlk+hQtKpjNT\$TPHDl5%il\y*#9h$h*Hj>X/8D:dN1<L>QPelc/MpbHJ
QYywC? lCuk=C!cRb1ca$@#Xc9Z4MQmGcV</8:h?@aBuuaB#db8&dll@X4+*ecpGNhJ415Q:X?%cLG@D:Q:@C8j
8NZ<nb #tYYp#5%S#Gdet=%p5@1mh&m*h\^m&EB^6Nk+!JCtw&\TB+c8HX9apGcl:/?tM@nc1m#YJQn/89A&GAp
h+\T<! e>/=yNm5P=5hlucqSNy<hXZ8>NPENHktDG+I&wV?GMl*BLDD^NIWkC!:AIct/RF&Nu9%/y>@ZtNZA@yN
plcFTi q>j@aCH4J+?c:>@Ft6DXudRSS!6nNw+^ahJ:>!l&/#K<PSkenL+NE#?cS?Y##K=K8GMM%NXWXhX+Y8L9
iSb+p> Yl*mX4EtJt/41VQiDY+KpA$%8aDN+@NdpD5aYmD+Ij\w?pS/$\4GTCSDi\uWlh4ahF+l?1FFmS=4jSjJ
yyD<Gl lb1/jWcPG>%hBVmny1IG!1!N#^ZwYZth>DLVXqhS5Gt&m6/wJ^K^whtpYjQ>%&#dh!RWjI&alGSFtnk=
$8AQDG IRaDJ9h8Z:>!5TjYW:/B6HF4wPq&#mERHMMZ=b+9pbh?KBqRKyWY^S!jc&Qu=Ey/hC=iAw=tb=e6\ywD
u:K1Vb l:RPH#%&bPji@eHpCCjm%GqFbD6+M+KwcE!^!CwA#:P$>L%WL1M48qiYTa9!e4K#M5/pb&jI59/qj^aj
?W&/@G <Rk5iZ=jX9K6qFMhdi&eX%NSY6Ji?1PWXWHX1X!wIA!TqXXiLM8T6<eN:Td9!88t^=<Rh9FKXXq=8cKM
>d!>wm Y*t6LL?n:i\cl>FWN:Y8*dw/*ZmItk*dR=^nJN9lA?ReAp%QREAHeGnSd\/N<q1AHFwb6H+LeCn$SJTL
G9t:y= up/Z41Me*Eme\Z<5D%IIh\RM#E^N^+<hNGmetaZS/KGD?9j6*S6=%F<^aB!&*l5&A8lnbD:B#BL++?4y
A$hep< 5!^\@YdRZP8CAu#eb$/&NDW&qBmbYp*FDVkjH%>/pV%y%:qmBbbIZL68I*F^h8+pY=Wkpdc5D%1%a4u@
X1q5E$ Wu>@9^WBJ^KnA6*M4Pd/L%*w4T!Z\*T1eb5:9h>kJ#jZ&WAmlhQQYd$huX*h=5/dC#+P8nl+Mwy:c*mE
uKd%8N kN5=8<$Plkd9KC%e*h6AS<DnenSb4LElq/=WaK?&*LNbb$9QyH#/q4y5Tn?lqyCnynb8Q>AIc/En+Kp>
wZuune @jH\M9kwFtCKW%aX\?dC6?<>jQ#<=T6k$N8*:#5?hH6Q/mP@i9EMP?*hJwZXT=RpWka?lYIFByIX1Nmn
^5i#aD $<pl^tqKVD&DG&51iebZJQS+qi+c+GtAc@<DTQSD4CwTcKlTTk1%<>yBtLHI@pC4$8JRIm#RB!Q<m/9d
bh%j!j yX8Qu4%:>?*TSWW+nJJwnl&8y!4R$REmjhhT=dI%SG@AbYwHVuWINWZcjTZn?&5RV1q!BIJ&iAC?WLT\
c^YH69 y9GA*WABSl!\XWVDuppGG%qMe@Xb6ZqjTESMapw1ZIS<LPPRp+t?aGn\um%BAR6eymy=FZmS=5T:G9ej
u:Q=!R QDj6jItm>F$JXh1:PC>llj$5MEZ#=m@\Ii=uIKuZm>INuF5>E6pi5l@LuachJP:Pcedn+WhFS5Wqy&Zp
F41t@Q !<4LyEBS/aBTYXqXhYXJRecb5#jc99^w/bDV%&=ZbGc@y8tP!/9u:Ep4pWy@q9JKct4&D#i\QuV/jHX:
ljc:WX cW5y6/T!PCp?J9S5tdRNGKcReY11$@?t/!!:hXh$=ZVVE+%bFFb?WhbSym&49yD<N$&@Q4jT6q6*5B1Y
E:!qA> BZ?lpXLYCIn>hW/KJ?ba8+JcT964Kmp&n@JkMSSdRmm&p@SnV%wm/YjRbel$X<hjFQ66yW\yM:pydVLW
=&up+9 iN!k95MpE!bcV:R$N#E!HDht>CnT+5:IBIp%$>uh!&?J4&>A+By1uj:cRQ>Fu5:V4C&MnWD\GbqQttd9
%C1JN8 Mt<?=eXi+L*R$bhyhdpM#XVRt4XMkdL6P&DB&4h6+#KjSY6DnwbF^MRu:>t@eit!5IV+tK&&a/%h9L\Y
5V\kB? @Ey6hZX#tV69=kB^Z!5dN^jK1Z$Y:hnl$N9Jac46%EqP#Aa&/am\NIBSFB6lch^n58@A<dC6!eZBI@RM
Yh&!uX 6Hle41a11<?<a!XXidqp?RQu@hVn4&>9SM\hL>ICZ:*9KqmTR%GL!jj*Ak*G^NGT#aMmeIe8Z5ZGI%n/
1W:h4H =8%:/kQ:+/jQ%Bj/e:hQH#/<A=K>jQ:$ejP>P#ec/9@jHCN%uyk!V%wHtNK\J$+libphlD!nT^LN9q1c
wiiMHK K1wctLZYL9+tbt5J8S$cKywcCw+1q<QqWeC#D4+cq\MiE6wwEqa1pkQLPwSeYEL+&94>S^8cWwaKCV%c
EimX%i he!IMiMymeca\jw<ulBw^lXyh>Nt1ZAFa9FHLZY5F!$RhRDn&wB^QehIlkya1Q^W%VZqIB/=Rmjb?dS6
nnm@N+ h9&EK4m%4eId<EKmdY^q::F$*c+nEjHyPjtFleY!e1yTB@R!^tZGuVy?ePiGqd:8hlbGlHD#/tuN6m1H
ae=XPZ 91QZ*=JTyc>KiydKyCpd*Pi/#5Gc/<#&\q4TS&Huu4%:?#NS!&Aq>8+@HHKMdM1FS!DuayNV$5>J!<6q
*%6@I> $6dT#%K/qFNVY%PequLqS>5*Y8Z9Fw4tW#?iu9L^Y=<9K$PdSbj^##!>EimkQ&49KhApm6LYWu:FlR!Z
\F>J%V RaMH/ytHqeuA1wEX=Fbh!Ln$=bH:lP+p@FSQ8=?@4L/>VE%YjVtypcJ=Q^8QBDy&:>F6&LH&^&nIMHpu
AAwibT K!$lCk<*MGRP:Sl8%CtYe9*JGXEu#$aVunFqY@aFH+8IVp#Q*CjS:TGb/?D\^</DnVZTDG#ah=Q?a\j%
/#>=yY HVnK$G!m4h%M4Luw=DVdBW!G%$KMaq+X8H4%Tn<j!18Zl\8iEJpbTecQG&>wPuH!6Ft8e#*tK5<<jYlj
RB8MT5 %$XLPp$aEaK+c\yZh9Q!ST6*:eLV@uCt&qJ1T9L^tIV+8NlVl:!5VCh+#J?9LNDnCw4QL!%1nwYY9wYN
d5bZhn p#PaZqkaHClH&wG&:?5\c<wkZS%6V4jJyQqI=*:hTtdB*Lb#n*Dj\iDR$:6C51ItaLX!mt8u^qL9/q5k
@TL&#h P=8NlbJVp>QQly%@<?^BR?4TYaak9<R8+TjDtKKAyPbbCBba^nNR4Bhihj+!/MFtLHQ\:5Pu#+w94K@!
EPP%u1 d>&@p514d%@@<@j#^*<>\JLZT1Iq^IqI<??VaYGl^<lJGLWjccd>8@I5?GjJ/YV#kbXZL>EaQ%mw\8b1
^9Vn$L I<$?mhpm41bCw$&#k>QCbjEWZA1MtB\#=WR6RC%c!BX^NDq/\\\uGBu?AGVV+^WT#jFnS@eXkqH/1eWX
F%dGnj D^+@cpkQqkyH<FtLI^b1aETC8pAP#GwBu&4atNE/jBdJ@GF4<Qt6Aw:R/un<d4@yw*61/w9AtGu$HQ>K
j?Xiyi M6VW^tuB!5$H\8I!<1WX%VW%6Se8Z4y<1j+</DB5h^eS5t>LpB>Yn!de5n=Qe^/9/!qbX!<4Lj&:yL8$
u/GJN# 4D#@%J+6m:#e==F&nm5RAl5*dRFHwNeiJ1W^NPVapd*a??Qa<hC\W:EJTTu=qbZq5t?qZ/Tc561L^TuJ
NB$qbF >jJ@cK/<ICS\+=tcGlpwV?*/M&B!Yn/iCP\^dE$?VC+BLkq!n1+cQtVIwQ:c\:dKyB&q*<F1<cZqF+4V
kuShEu L4!/9cpdwXMZ*T/#Mt4LP<4WbbYZ$&5y+Gn4q$iuNuV9*6Qy$FQ1GSB1WA*&&p&P?:$uEam/EK5BLF*1
-Ai:D* 0000fb0ced8001202b3 Page 267 of binaries1.zip
4S?cAe 4<!H<CTMGktMY1Sp%N:ka?Gp*GcCm%aQ!S#HVpcl+dImnJKd6BnVJ91TpWPAXeNGn#i&uDLhZquNin:q
@PQk@< &S*pGFcStY^qdmTSnB5:B1!b^HVC^Ep#b<>S8HB@H+YPXZbuJq5TkY9Yw8?#a<>G@$YBS<CV&W9Cb!KB
#eyB%> WCqI1KTpSE!+wyQ/4X6ka#%:96heN^Ja+VE95/c&W4yt4pGZ<jdIJ*nB:jb>y%mb>?ui%WBLZeiedPeS
j4QWPS D\6QZRtb68@edd\Q9N@R/PN:n5cH#6HZ%?b#8By1LK=6dH:tGT\/uymRuBtck*ZZ!5:F?Nu#NNXHPP$M
<RWMMl PZyaH6\d$E+m\BPaQd!1<\*Zd>@@/!t&1Q9<=h6*?R@FV@yH6?>j9\CX*4^?>iLyw&bM+TJ=ntiTE8K$
Z!@Sne anBWAY^YtLKRmtI@jWCj%P5<G9JdFibl8c##E9YSZbBHdXy6+k>mNT$Bu$iCitnNFp+HeAuD+h1FLNE*
aG1ljS +JGGWFNNd/T^#YjJD+ut8PFhhQpCLZGHqk1@q%!mQtc\llyH?FYL!?i\McCH4e1Vc@$AA9EEI6&la$d%
j=PTpc aLE\i$=FqjhVwDHad+8*4hF+:6mS9iHbXdX/nHwn$VW$5*XbFLV#cFSc9k!E<LZ4X/@jXDV1*Ll/?Z!X
AN+<p/ 4CkuNV45$I=%AjMhLBpG#c!nNd@hC^?+wESY?1!pT%qNyVR6Nu!N@$Iju$:dlM=86!*wVP@bB+9d$WN:
/VcZc@ k<QCI/NnE:PpXbYXbb@AnuBLyYZXF\1!Ku+1u6Mc6/T?mdt%%XTycuF6^hq&tqMZbnX:Yi1F<#JYTWiy
<TipeX TFwW6m#R*<jDidy%L@8MTupy1?Tu6FZG1:%ejw/tp+d$\HMnhZ$hw<k1ln4%=@JBSuLdj%dE&k#8=qnX
SXhBcn <S!*<@DAqhtXWAd/4CT<WT#lLjXj59n@\b9X/#b9*+QN\iLV59JLmqLY/\&hcV@nD=eKI>#N&w^dnEcc
Ab1W9C GB8NGVXmRN>?A\eQHV=m%FlDa^NV?B*tptByw=GnSw$aQt45PENnM<5yM#D?WITX8ib$HwN/i*9+MG&P
Y/^S+K @be6B#m9Zl&$d59&wGY4nlEBlEIcYWQKtQ&mVS!tStiH:LB$tV*Q\>ZFbdd:*HW%6ZZ%q^18^t+eP*dW
=iAP%= FChu*LPj1bnS#<Hhea:>SPQSA:6#?n6=ktn*@p&eDeRKiYBI\QGV5Tp^8<:q484bSX@E+ZHW&c#BB:QV
Xb8cWF +jqI>FZ/!hM*4&F6*<!pnR5HCHknq^<=i8V\ahLC=TRYAEplVX!1L#Ve8QMAp::ja*iHFut4ww%8:h:!
u5&icE A!8Aa%X::G@T>D6FPAHXZmSVG+Rpp^\/iJA/$PYk5l5GTaXu^F+?F4t8p/mQG>FjSXQWD6^=L/c%%eSc
BEHaXa RkGZ+4A$Fb\&4y#aIBW?BmYIQty>EYq1CdkcZahPN9\w?Rdtb$^ZjT=ZT=9Tak6Ew!pJH&?JqXqZdW&i
8l>J$j q4lXT$ZEw#R%NhVX%hSW%IWK\mVMR8$upR^Wb%E1etAT>/hA9i6E6+tGRAj8?HGD?\nWXETD^:@HY1#V
LQB^nw =!=h9!<5IWhY&*D#L5aI*H?AjW49Eb6dXymXiCyp#<aXC^!XbJLW$Bw6FeMep1YqV$9wW6&KMqu^8jV$
8mkEpn w@9&d>&$d9Y/hYCL6wnB+eWmVKCwV==KKc!w1KR1&CDa*yY&k1nV1G8+pH&t+eentu?:b69J!15XSbZq
RZ&Tpa th>dca%ZiZ+?l@N1XK4A#^KX=WYiQL^9/=wAd@jyW@jWKEyb=XTXTwY5Ve1YqbjL\SCX%hYeiW1jN!YH
BW!h:\ 5PwG+kH:K!yB%yZZTe><ccZX:\hMuy9^:\5<jm$uG^P@I4dB@wDjlQW%5M+?R!T!PVGQ8E/@mHR\=ESp
iTKFEc ZAyYNKm6P>%#lP$Myj&^tYlqBWR!NVd?dmR*yI%E\BuJ?DHnlk$iMun\wAGD1IEneF>m/LBl\$iMGIXG
M$S6*+ b/I6XticMbNyPiLpDE\m#cqIILZ:R6>Fm@#<q9nnn5HKXi8*d9bj9CpW!=IkpeA<HA5ncV/yRCRqp<AY
YDK5bP weLJD#@p:D#Z!>ZJhi=KcY*hla5N5BI&Xy%$5VCj:8kINBykN>N6T=C@6@QWCiMG>ily6YDijFK8aQtK
1DH/6N =cS^:1c6&*j6/\8cAb&j1PVpQXE=?\j4G?mA?<SSbipEycRp^5jF^XI^PwqSl/91Kw1b+5I:VQ8Q<>=F
/8^<K/ Hi&FMeZly/I\SXZJI?!S?8IjdH@!5@XdY:jYu>l/?MQd%/?iQ*:alDWyPltpFS5h^bVZCYZ/cCkP$eH/
VFih\K lD+kY#AuK=qJC\eC%WnWnI&+jKFe1%Z<S5#Ty5R<$mCH#?ZBK/XIwAI+Mk1lmpmLE4<BPedSEuFXNRbd
$wK#GM &Sm@q*!S<MhKBuZucRm%lhwnDTtJ$Nl5\tR:y#pPS4$$NWXktDSERu\k5GiWlkyjVBET!RZ1*ehIS9CW
!/8&JW HPL<FKmJB=yIJP$T>SF/jP%?w#>KlIaYh9PYdV=$K1&w81H^*4ht<d*G1^h4bQqy$cH:6/#CSHSCt4/X
#TF*KT 6Qyq:!QFqYYQkDMmKjmZRK&$8PVplKVWDEEY*MtCwtI\MGZqM11EXT\9iX9cnqTy9b/jpuY*+\HNiZ5*
61#LiL =bV$:1*CT#>wNZu%#kW:&dWZyXSJ>:KT+5K5yMlnB*b5YPE:b&&S4LT<y11\ML?wVId>MC81!15XM11M
5JX\cb Y%q?N9QPc>ii9WmpV=jA+m5%\JZK19TuXA9N4p=<nEVSq^ZpyGMXR4IL#6kdj<^^wbeIq@/^EV:Q5^@!
/jD$TR BQPW%&*c999A$dDVeetb8WXaXiyPq8&EcZdVyp!mdDRuYnEbXbVSX<N&ChjR!NAI:I6p#Cl1nGD58QET
R=/@Em I:A=bykFSNuRp:yQutKLSe^t#CT%:SmKKCZc*IW?94muB8b/&jI%Y@\Z?G+>Fau8NqDp$Q=>yGRt4PdJ
Z5&#>R cit@PaL4d\=YFemKYV*ZhaGu=+t/<=lCeQ%G+=&t?@hTA!\NHYjNwP\G#Jm%><n8VT5Y#LG#HD&\n>Fe
KZ5Plk #@pLF@56>QXhm8FacG^&:DuR>>BSZM=PS+PLGuwwLMFM9*5ZLFPq\XL#mDtdHB5VR$WdS5ZEH5nA#EZT
lnFd*i cDe<dMY<4Rnt5BMSy%FKMSTy9*K#1juJ*/@jj@4/w:Y64XZS\tK?&4wT5u^<@\cW&q@*qF#JS1/IkC6a
?a!d%m aRjeKE^8PN\SdEC/LwG<J$i6nEw4Ip#SMLJ^e?tH1cc6+lh+/CQ8ECt$9kI4jwywLR$P1=8F>WVD6=IQ
@c<5Pd aJRGmnR$8!wpamNVC^8:YY=im\P<dRi1eVAJmBcyCuq<Q5Xnkb%mc@DkMXkmldBD%Iyy1ZyhSw:XbYES
\l58#D ZLctRNR1WBZ1nbT$TNmD?+:<BA>uMZQ?!8%Ha:Jq>Vj9NV>w8p$%h48LDhH9akRk%li9LM:G51=BQ5+V
AGS/p+ GabwXhAcH:j9!cwwL&*GIw/qbbZXXhZXXbWXG8XqM1t$6QRLeEIkLeX9/&:tucqyy?/CJZydq=FSRH&n
5:b=Kt &h?9Jjdd8LK/Wq1e&X!ZqX6eeCd&=JHhG@$*=ySL<\/dnl\%4I>@dwXC1mE4V%:1H*YSp5uL8PYXlhZ$
nFYZ4A ^cBB*apcE:5H=hi%q/tZ%?be?>:SR4Mw=IS8eX=tcu#WH:an\H>J8=>w!hI@h4ZuMRwMCBG+h6P&*RiP
lMT!aW kN6F!1^X%X>69H>n?e^y$/hPtwS8!\RLM%MV+\=DlcS6QDWP@W6/QQmblt^nE&QKhITbmStGG=ldYE!\
Q?pIR% I8F6TqKA:dB*uDZL/W@DMe\LYdEadXnkSn@QAHnTKITJplTHnl#HQTi\FGjT1dVbDC6I1a$Cp8My#V*t
h*t?&h Q&<dypljc4l&w@F&E^:?*!$Mun9C*6:P#9%mAVn5P%j/8E$*GVua$GZ?9LqVi*jyw1e%\V<ITdF>h/B6
1lG@V9 u?qBy$IR*Nk!LD*1aQ=l=%=hhYBX=4BbE:$mptQpWbLI1QknEVqbGctJ5cR!ZTmtVID&?5WIGS1NywhQ
bG:m?c Z:+Bt>HT%6d!<\j%9j&H!5<Y11%L/<@9Z#>n$>Kun^lCFCMlE8P%+tKm$Hw\&d\lS+<wDuhSYw/\5JPu
5yb1+* a@A5Fi8/ahHeGkuH$NLbL<l/kJ=Ym@mS8FZ:1@k%1V!wDtTaPMu\Z<p:TV@n+Z*GTTT\QyqdV*QE/9T4
A*8*XV N&^c6hBTVXP5JS+iehlpwEDBX?j^iX\iMI9Fw>VAhhEpJ$d1jE%NL8c5cw1HTpb$W$Qulc&l!Y5S1ImG
h<&nSe 1I\Bn%@j$GKt%/1h^^Q!Kl98N6?@e:*lW9*F!%eWDZ4Zd6!?l+!+WmjLT#%>bPjcSe+VnbER:E@q6EdH
*mw6ZQ 9dTNGdZTi!Z!a14pdeu4W4yE9c+^:?^=^R&c*jJS@yqt6Y8<KW>Q!T>ww8kBh:QTC51!p!KP:n=TID9n
RAlpkC :&^ncTdyQmP84E\1Le5LZ!EbQ#8&q5LM6tyb>qe/cpRQ5l*Yyc6=dH$=XWdJ%M51bipFZ#GRRKiR&Yu?
1iE1ZD =Ze5<%>C?XGL/j?D?#EM:nEAb>98@ahDThuN@NLK<*BVH#&yPYJ6NhXtI9wh+FwaGS1PH!?ZKMc*nyPQ
VaY@D# y<jSE9Z^p9GGEwuCeLmSMb1CQ&CQ8Eja#:B*hJ#%&^kA:uh/+VHPwpYLq/@#>Xl!MARhNRDDL>kjQW:&
p=:uTk eXQQbJ^JV%j/HpTKF=XkbuNNLcCw>pL>SWD>>X8\JDW@^ImZJ#jQHAJNWQ9l<>i4y@i6Z:jI&Y4eGE6Z
MPpa9e n#pVl9j8$<6Ae<l<QBLh85dXSNSZ#*Sn^Iu\W/jB8+qQVE@cqXY<1t>*A!$Al=11^1nhKhEhpeKwtKkD
STn<95 &?KVE&II/1qRP1#ZTXIDZit4E>A@i@YGhCy4?jH>1?KL@G69bTb?Y!5akk@9@u*=DL5^KGGjuBk9\BIR
h1Cbaw WbFa8TA5>DkXwnlKl?kV#J<+?h6dL!+G%FhL8Ga#9heh&L&p9%C:VZ\BIN<BpFeD!E?!iTq=K\FdDHA*
L!qVFF MnG#5uX\<jRJCN!\jjj?k@5*LhaY>n/bZ%/j6>^Yl<5ZkMnmc&pJPS4wacmw<?YalM%SW%Qum<A>:#>P
L6<M!: MyCDP%/M8<+Y>Bu:4&TMwjpM4%Y:\yKLct@ej*DuYu%6bZq=SXX6DX#:C=i9NRLm:>&<YFq$J94a:9YL
\BIN4i uc&JBYA@q>Ec<4V%$jZT+q5A>niqG4IL6\9#G1lTt1dX1Th%cX<yBh*9ZZX!Wq=i<8qpYe/?nWHLq!^\
j5Vn<1 e#SetqplLT8M&L\8ePH<+:WKkDm*8m14/6ENK@C#1c+cZR^$l^!w1&mZ1XZWZ5ptS@=/@%uWk%c6CMAC
!*iW:t a6Rm:eWk^Je\Y%JKlA<AlQ9/?T>j6YanBk$h^^4MYZukE%!/j9jl5*@i^uuc&FyVE#ntymatSlLJ?QGj
@dCuWp ^uYMXS<@d6#a<RD%WSJDW1aB\V%lk8Z@Z*Cnw?8#cNpcd@jF8#D@BGRNmddCp+4>JD+aXnjAe&bGJ:#J
ZZ%$YV /Vh8$FeC6P9Pk<dB%Q&4%&<%ppLLV=:nRj8@@%:NDZ\PaG6yi=t#j=G44cuy6Lpie/idTTTnB@ZYM@Nd
:%cimT 8&:#/ttnlk*8N>SpSRRG@J$CNSPjpJb??Gl!%Jk8ZZSFjK/tP194mwTwn6Q<!Pm+6K*H+/K^Gy\mdMCJ
#@D$HI Vtluu!9CdckdCP&*H:@>dMMFHB6BjQ!p?E^>WeYC1%Tdj58QL=@iw$6A81?Xw%eBDn5hJ+lBiEeTP*H<
qmmL/* tD!pm^Ld<G1\1lyV14P+1ADSdYL45ZJ*=LqhW:5n89@XwpRcRwEG1+8N>R9JG<pkkLc^1buqqJt#QVCm
D:CbQ: a65iJy5/+yB#64V&cqQ#yiML?kwFqFBDT<VnepD/c:DXNIYWmC9p<@CAqmeW@lS\8\$hQX#Ia6ynkA9R
-A1j%t 000bdfbdaf7001202b3 Page 268 of binaries1.zip
+/X*LI IqAXCL8Nim$ba&du8ZJZYFyJjYM#hlmWFiju=iWZq=cAl1?54d@TiL@=\b$46cZbecF:AiKM!GE@q6Ic
%nIJJN dS@8^F&wKQ%W$qL<AYD?4qTn4Pb<h8EXSVH>ni::@YXnbGF?dpH+$iA>P:BQt*%ATuqbWXJ+&NF>Y#jH
%pLp$h XbdJWdbWZGtR9Z\%6^8J&6j46p^YBV?u!%R44ta@\KQ+aXlKHBh9=iuF51XMLTNaM\Hhm@<E><lj+N/\
<ACq=! hii?+GMuw?JV\iE61/t@h99Bp%j9*4&<+D6=+kS#M\\mqmnG5ec?H!MiN*aMjI:DRH^eRw^NKFQcuJ+k
4G84pC b6A>/Vi/KWjBj?A>GKT<:^L@8ZMYdGGKG\F1a1ImCdwQ:tQTFGNBw!k!/a#bb^Dh5HCj!!?Gm$wKH&E%
E1jWpd q<5NDXhIXQ!Dl+?ipKm4%&@i998AdVq@ku4+<i@X>JpVdGb=4%4wNNue!u#5pF/t9t5*L4e%5VReNhDR
eZ*F*4 ht$aCVR/HSWNm*h!Zq:p&ZNVhL6%^ilnVbdtuFQSy$>Sy/qIVp#G:wQpRI<K/\%5ALpC@tnY8WJybh*q
=umYhY G*idu:=/??qdC##h%!?j&n<wQ9d?yK\tDE5*KlaG&@WM6qPTE6Zm+&Jnwmu5w+4:4cH!+%&W!I=A>#tF
5>hDNA YdlLGG##nc#uLN$cqqX^Ie%c8\QR@a?YypnA%il9a&Q+HMVKCHLS#e\tVLJ#^9LW/:j8\W6H1m<YTc59
JBD?aN N#=wd4^eitL=GP!1LPjSZDWPX$NVRIFawRY1aKd+qBBnZ#kGw<d15%kM8qW$YkYWREX9?F9JYNPyHm6&
mHw<Ru l1XJL>%>eL8lYy1jp\u*I8N5Vp=8ZtEJ8DCAnib:N!/W=TTE:h@\C>:@q5A/@V1qwLT<yiSXeT8k?$Py
@E1TAm Suu%^a^Ld?TF>Bi/6?LnlbRWaQmy+$eP:6//ahHtnI4T:JTWlKn\a$hVK5w/EN8!!y1#=*<euELT8ZS%
y9DEe1 uLQ4K1TWVFHG9u!8Fw@Bhet/VW:AN/$H@>Vjd#EyJ8#LYpV=Cak!IjtQkLb^Zk5YA4cZ4R4ckPjkbDMH
M:9<b^ 1!SXZdl!/>/n9>><@6u/%$d4mSc\dl8PG+?bJYPyMX>G$&Qw$TynSqNn/LGc+!Y@AW=N/QM@?J:y+QCj
/ilb&K =Z9ieK!e/8!/bC*YXMF6t/na8NlPjP@>qacdpb&hqWXqP5MKuyciqbNjBHK<19a*9K<TF^XdTV^V+99>
G#a@:c l+@ahLCXCIPQd?=q#%?=deQT8Za&W!ibnBw<ejHtqXPMJp<!HV>?k6NGXMEuWJ/RBV\qNTT!h4qyn^//
/6WRLN RwA+m&WiHB8q#L?LTV8$/XSEPHYm:$pEPL4QGKFXAad6V9MVAQn*%4cj&L:1\#9FY=X*:?Wjiu*<SJ1?
\wp*8n 6bHY8L>AnmZl$qPVp+S+%Ak\J&Y15DeiK=RKM&BAjn1!e\W9ktY!8CC@YmI$uPDk5@=IT9t6?+W8?4wK
TZA>iP 5w^4mHn1\/*NDb>KQp4Gpt8Q@yCq#ZRu>\X?K>h6&Z$IY+tl^m!YXhdj8N@ehLXYty6$jK&lyI?&kPLV
59JKnR AHi&JkiWPWZCmSY\nHQ+85QG>^MVbc/m#t5ZKAR1+wH9JiNMJ45FdA>NqX=8iuC#9m\@K!$^Lnw/Nn+q
1Mac!k LT$><&^ipc#t$w&t=kiNq!4#p$:?AjTZSdS/&\NbYW&X9PRFAjwuYMa4/>IdY1q<?lQhA$8WQapGYZw1
=#^d*\ LHn9?u%uc!1Ke:I#WlJna:LLYkHquQJcYjcF>1VSYMSFX<91XP*=TltAZK*<jGqiG^=Cc?M&VPmSA=$8
Vi&Rq> J/#cHV:c8PH?y@1iN*<W\VkJy>1<a?<ldNPI>jJKK?9RCD>@@jF:&<?*F!N5LW\N<RT5djT*WhSw^Tn&
K+WcB@ /DFnKBVklpS+W&amwp+\T=/BN#Xh&?+*9Bq<#^?<\Nh^>qI5*WlY:=P\iwMkJjAP^9VPa<V#T5?p#5I:
VpibQ5 !KI#b&Ye!V\L*mbBN&CdAVhJwTZPJ1L:*#h9*4*@kK5uLy+Ed8>i9*#?>FHq&mY#:B#6Jw\dPYuy=kZt
B>I16@ E/hQMVQiPhq#Y@CSw$iQlYJwZYS$DNA4KjJ\atQ\pG+G&mIiV+$%hENejBVAG+NIp<PDVy\<TiRDh1+n
\lN5kN /i@qaNpcH#^??RdSnW5%$>:#NbD5:V6+JXn5Gy8+6dX<@/JEPCq/CAI<NTXJlIeamHG!HZQ!yQ^EF!Y/
EaTn6X w*AVFFj^\8JTcTpw<C1J$G!/b?D?tPKG=l8q^^b$w\Djd:VWlZ#P<IqGn!TjJM!%N#MnXZAeZL$YL%?#
:w6Yt^ GiAhnnYue$kCC?mW?#j4K\w!+5L&4q@t+#!$u^cGZZHXlCKSqybC^Bd!BZICeK&?I/$66BDkctyekXBI
b&EmZ? CiRC64D*?E?T<WaVb@6l8d*L>?=j4!$=t^y*?tVw<iNkLtLBc$@L#C$84:5CF8N8R%XBT9kBRLtXWyDu
R5/*S6 $?1%=+y1!$8jEa^@KXW94!yK861ST:?l>d=q^pVF^J#cF=+bE*t&88^ehqb/6w\1b=Y%Ad:%Kt18bu/6
8WqlB< uNG9b@h8Zd9ymWd6L11wBqt8Xq&b@yb/m9lPma5<EWJ&GWGkpA\w?WLcS?!:&A@%!T@*<n<A*::u+NG\
IR?bWj W%k%FiZ*^i8*\R!@@>4c?8*n&:R=M$\M^+<b$#41=$n&mJGnFCP%MI>>:Nl^++kAJ!BZMb>AYZJ?kb!c
94+YI\ S68Jb>wVpC5Z<ZqiHwPuPT+KYBtE?=4M\Y>MjD\K*SQHEiRHj%XpqPjMPR94iGat!jWD<X%ZV@CNAL>?
MthtK1 +^cD<KjQEiEkV&Dl^JWVBRymny\w@hX<@?18bi/P%5dnb@y:tF9a#:I%6XCd8i#kweQWEaeRW1$DW\em
+AluJ% I/NnW+<$u4Hy*XMjuE#R8I6Cw&MI^GNmplPDDtFTG#tkVn%DIm4R9n%?<idnN$V+J^K\JH?q<8>4/p&j
<eEd%5 6\D^n=@JK&u><iZD&*?WAC@HeN8$%GR%QKcLy?JWAiGu1RlFPBYl#+SpE\KhbcwcT\t?^ea&4kE:IuI8
qmSyM$ NN&6QSi:iHA9ADlYJPKL^$$$jCn=LLE^Iw9*BE64p1Zy8Ylb$PbhB$JR1GTha*JPAHm*G&yK#mcjQ4J6
>e*PpQ 6h<<y&uYa+j1<dE>q%AkFIuFqBbdmNt/*\WcwwELF\#q1yQYKcwe#A$BlHed@RXMNN1S+Qnmm$**4%aX
JVVS:/ b5TjCn%<aQ??@RAY>E9mW:By</Wd><BW%BTqSl^a9/kV+q@#cI&ZX#K1/1SFj^i*qL\8?Xt1L1&wKay<
yd5wn5 tW*@T*jy8BB%JD4?#QwS9Y&P^qVIC9KLbGhPy$p4&pB5!&W/%*Kdu%i5Hh8@i:j8?64>dXaXa^mEYuXh
Y&itA% euMHln$MT+!P\IweSKe5I/Wb9BhkjX&5t+QbQ:>E?Q#SCQLFT=XXyA<eCXX1PXq%@hZGi+>j99*!5?*H
<G:wl@ =@j@Zn*4LVEcM&yW/<nYEc#l%Al1JD&KH5$BtKMTN#TmnFXM#Tl#F5Be5^Qt%FRc%*KAichYejh\uikK
M>4:\T c@uT=aG+qP>qt8uEJTlljnV+\Q=D9/y:WPjwZCyH?&\&LG%FyYWE=4CIZ:%GZdi+eSN>VAL#9%<^K8W#
6DBMti 1ePy%Cup&PjJw+eQ:6&>jTM&eJKyqj8$L4\i=nc&F6a:*hd9&:B<T#A5=5jD!GdK/XQl+ThQJwie9=t*
i8FLBp et\jHcFRR$X4=N#\PMSidF^e!yuN8<KIVkEVk#G\KMTd@u4?:+i9LY$@!BpV=q/<iQE*TKb@@u*N&BYq
cJp$t9 cQ4!<V>I#$lLT^GSR\IAP:PXiEwS$jYWpqP^#E+K1WleJm$yR1\dYe:!*ZR54dL^@8Zm=GN49ec1mLW8
*RMK:^ mn>w1Rq+a1N^>!XjJDPXqYb5J66Pu?EAdtjA/w$:>wiES^P^WqbXh@HKVbA4%<@L<6Jn\@c6D%nkMtQT
wJdZh6 BBNn!ZA^PJ5eXXX%9yC$?SaKiIJ&EPk/@L=4n^>$:e%Bme=YXhWAZ4RJ&Qwn^u?VTM!t#%?>Q!4@ApC?
Hb/PZ8 Mn<6KnS+#@a6t#h9&dGZHL6G^1XtF=cj9*1*Ghd<+4TIk?5ZPTp^*=JLc:!6!mm@Lm6<SVDjC61q9Py5
lMiF1S ^ZhFF9&KNnlqMuZdhtMhQZ&DIT6*Fplq!W56QPI1!4@JhKW*m1V9Q6$?MN%1WM@88qyhuLN1AQC1XSjV
JP\VFL 4!Li^YT@EK5M4qt%QADlL9jTbY4d@C4n<\96JG/PHB:6Q*\<QI1WL=YTVeP@u4@=?KQ6J^4jq#imX+<b
Y5yl/A Q/y%SQ6\ilkNiKeB:*!RL8QGMZk*yp^ayk#iNbS+y&#%yp&jV1L4!Lw?^>X>=kRu>@tD@>QTkMVHJTDi
5m#DnS \\niP<6Ha>AauWij$<4N!YGWT*W6dw<D&1$R:Xn:+<HD^$^:i/X8\cLMue1qe%%986QaiHQL5AHtp\cK
98q/Se aCHVHnS$m5dCdRHn8=kGWWe+IeiQa/e6qN=h\pKVn&e<?dhll+&p1^D$C*jCpjnw1Jk+Ku=kc5/?4iG+
?Hu<d* 4miSTk4qNW1Ll+5BHlQ><?49=<?yb@V#kRD=X\l=$8pJZp$u+P<S\JeA+NQVWqXTplXJHHnZ5YTZSZFc
e\8BN* ucA>qw4VI1qHiZk5WF/PZS$1JXythq=BB?NL4ndj1MmMPLSnyc1V1bd\p=mq@bj+M/#^ApE9T?Mt!XiJ
TMZQBb qcEJcWqFP8<+#@Fa8DS\\@d>S$>EJYW\&S/Z4>$EDZ*4WtXSXqLEpi&4F*5+&qymW56wHy9HWcXW?C\%
q+&+XN Ll>kL?CwcjDdlHKBR1k6/Lp8:$KY:/D8G8mhktaZ6AyW6Ah@B<&EN8hphp*nk&8Xietun8#b8n=w>c4A
YQMwh^ wQXdMiRk=ESW+yq#$61G&<$QdnDA>%WCZ=X%qqd@eC5n8/dpH+J:iTqHYq=itbN!/V8XRj>D>&m$/>1q
Mc^8LG @%Ba#491/+%jqb1S8H@^#Kt:T!w41m9LjkL<L%cpX4jTn&=FP+*8$W%Q^#T/51KnnF%*:n^BQ#1q?*b8
wwGcht &aD%cbhkISF1Q8Wq\Cyy9#beKA<&\H?5E9=MJ^1AH4AXNZ5J+*k>??eDI&qi\?&>td9PeQTI68GKajSR
Q6GE4! lkIctGmuXP<5R<1IMqE#^jMm\kB4lkH$NB&:GZa#eMpHAp!daG:u=Dy9\YBe<Nhm&ZZq9tI<M8A$\+AD
A<<@KX 9&5NKk1wjPi<e:t=VNt%C:lQjkQAn?m@w>^&IjD@<IHb>Qnb<5h/n$FtD=48A9\#4dwdhP9X9a88kMeX
$At#B5 >VX&6Ze^$?X&h>>@?AnIV$^e\Z$R?DapKt^@>y5*hjudJ@RYeNZaR:bnEa8+lMVp:PNdmZJQJnHbnK\B
nCHV$K 6^%Yl/>+T94*<&hQu%CQB=N<XYDA9&>I#$\<SGL\@/kV@#paq11GS\HJXJJ/Auw6$S%SZalhmW>IIIuh
Jtiqw6 iD^RXwE6GlD?+Bt8&H*1ZQ&>8*X=ecEH6189<*M^:cLXLt+BAu#VwwT1QWbcGN&SjEMCtE&$uV4hDq8w
+5SpYW 8:l=kJi/j69i\&FSTbt=SXIt4^b<?d6Z\E*F5ICNAR6t&%tdahYp4m\XXVcqItT45FY=YlnPwKHP^Ty!
dd8ZyS kqclq9dRXTWJc>$N>Vk5545PBNAc<ENmbGnl+L5^JLZ<^wPd%ZqJ+ai&4%?%dKtjH!!uc#h9*dHuaEl+
5wHpYN VM4b+1yLnR<i*KkDBl#+#RB?F1$8d$:M!T8qT6+Z@!#=6+SVK1&51m#KVH/WCwKH$:/uh<<884yh8qFh
PD8Beu 6Wj9TTnImV6^hHhkTEqXcZ=SySR=WH&qwPBjtt=:Ih68&cPd%1B>$pyFtYy6XZa:ptBASCkSQP6A$yPT
9j%tH4 =y/iyAa$^lA46&a/YVC?p\Za1G\Z:5/AX+@:/tW%iGV/=NW:S9P<ij$K9MHtHE?#WeM:l4GGWpQWMK=G
-AEw*! 000a65a0256001202b3 Page 269 of binaries1.zip
:Z@&Mm cR#w$Z^G+/M#BidAXJZlkn4DBYwKQbYcLkd%M<9J!hHc#H#1DMjbe?e9HMLaA1dIINE?TjHaCTkMNQ:B
6#PEq< R&R4LTZndF=SMXXEF+w^@DG9ELSQ:aYLDhh8*LyFNhK*8>\lhVq\m+b\+TQV>8XuK>ZY4>MY9H!P!hNN
A>eAK4 6^69ZXuYC!!t4wGBmMjXHVbK\y>wMcy99>Eii++iQSSMHcNC/iP5a+1RJWhP^B\/jj&98=h!k?eP=9Na
ujYcAn i58mE?ITElK#MncFKw>Me=mF+m=^:q6d9u*CiIFuV^+@i9VZZ+<ik&pCM4^/ldcA&SH>SaX4JHw6J#Q#
T=bSXt VD1hlmYeB!auEY<&Jmbc!aVE^KTpbN!SKm!SqqXWpuLbRAanT!i@LcFu1l49N=TpSwWi$MR$N98SZjY?
AJR\GB cViLY:R$RK*4>B%lhk9aaGF5NuHcVAhHJ&jWtjP>@Xc5*dwuPC\!MaMptX?<e8Q&Qh\:BKe&M!EmiGiR
Nul>^+ *%!H!bat\IcSdBdYm^i4<aSEA@G=QE^dEA1?C&uRYNP&49G\Hn85q+BF5XtcdRKXd8PBDCc&<<DDLt1+
qyRQB@ j:5&Q#u<\PdXAa8\+=PZD@d5A*F^/Qny^M#Cm91dD^:e4Q89PhA:R*P?b1ctF<yp$yJQ\IaQJZR^4/SW
AGuXNc XqqZtZ<t/e1QbGBE4:cGHYN/D^>twN8qc:jia!&*l=cYJJ</Gq>h5NN4#1d#Q&T$XLY/?N^Nmla4&y5K
6SEIl= =w:ww4?!1LaC#E4YVZS#6WAS:Yd1Lm<qjFB+mD1Lb!1>ZAYlk/HZA1d\Q!QJD&GS5IVW#N^CQE/=&jVw
#Zp8py ^b6QSBT>^?RV9N&Z%49dDXeM=R\iMtVwL$JwMLZd^tJqKSb+A@?ZD@1+hVuDjydDXA9JPA5d&?tpwdu9
94u</< +CZL$DRwZX+WS\\lV8C^E&Pl$4J!C+1yEpY^dqFlRREyI+l5AKN\?</h8%TV*n%tT?jXQ>n1Y/tLkA*>
qD^Nq@ $iQ>?Q/ZcdnViP9t=YT@RX$HDVaR<#p<pc:BWJHJXJMBR!\ZHhq1QZL<*QCn%DH/KC6EjyR?alJ&PPV5
cKSAdZ nW5%$4#R>ebh%NVhV1eqJcYp:h%!pkmnNMa\ZG%<<AS$WW94h>!XjQH$<cPHm8alD@>/>PRy&kb+Tj?Z
L>k$M@ Dhkh1TAH@QeMqVQy<nV%%GS$jh9n8kANkAZJKYqp:\y=WI&hTAw1JCK#Gh:4klNK4#dj4D!dFBWtDN/%
FDnG#P cZZARminIZ%%^N4mNtADhyHYFQD+BkQHtkQP9p9/I!Eeb=PkDa!><!PdQMhQ^cijA=<AT=Ve8W<%m^5d
^#=nVe cpy#W1PP:>8<*H9P>Iqt^kwnnYFCIu+WdLE1CCD$DQl<Ibc++wm?CkYm+jdVnTYT<cPG/KtDi/ABDnFd
B5QGEY 1D9$l$VQ$NJ=!daV&dX*t!+C=Qh9Z4ua!*$P=h#d^eN:KiB4+@b>S<Ln#8TZZdmlNBHAm5++HQ%Wt9jq
5yj9SP ZHyTdtXFSWqJ$Zjk^deTeZGJXC1D/%^VYbEdu*#yl!IS>FJQmm:\mw!a&E>j1N>FT/j:/Nu45w8T5$8T
ZEE9>j >1^e8KZ81$!6ZHw&ZTcu?b>jdJ<\eG=GjW%NWh+VJAWYWGa+\ZTGWe!qQRRp6cZVK&bIRZ6bITu<j*YL
aQqNBq Ca$kukK#S\$4+L>EKtGm!J6@RR:kjd?&hbHbGGAE58K*qcDH1BE4RSu?RRw%Rky1mw46hMXM<YVJtJGG
FnlA&c blMtVpad+idy9hnTH&#Eyt*wH/Nem9tDE$iCP%<Kqupm+Wpq^eXF/C:W%TMy:6\FS6D*>P<@iICpiQ:!
X5=/+: u>eMKalcw6wG6JK\!F<&+8:6^y5*4q>6PG^@PNlal/QGE@B+jKF8*#=DnP#ZddMSc\?cHcw+$uJ+$bHn
Y&6pc< S@j9D5F+%4VVS&d$%yy!LD5nI#ww:CV8W!Ynmm!99RS8MXp9ju^l&QC\?eGD?^nY1!#8\d!cL>>?<?G?
8MLE4Z pk?=b+ERhId<nCbykRu?MSZjnjAlJTW%Li*M4@4\NXWX5lKplMpWn=X:I9Q1t=w8FGYu^I4Dn?:d6t/q
=Z/EuS u=jLDMu\Z94k#!1$H+yyaAXZ\IZ*%HYEwduSXepQTZ<n+MW5N+>=bDFeDDe=cQP8k<em+6J!mwuZeK9y
BMjM>k AjCm/j1F<9!M?QDkui8YiDlMutBCGhGG6KSdX^EHc*8\XaAm1lkILSIISRK8Jpj$YenY:#qILtGQG>PV
B1LS49 \>eE=wAD%98:^Nlp/9\%\Wt!G\?8!nInD&=i+iQ8NHQ/%Gq&>5=#jWA>4ht</%BaVF1i4JMYy<ByXpdn
iTWp%S 1I1VcV:%=FJeiq=bXcY56KT%?EhJi+q?cXqbiYXXhY%6hYXXXXF&YqLGqdaPKy=?RZh6YLNym>MWA$&>
a^/kQh dny1jZjYXJYWFGRpSB/Q4QkpW!$4#MFkj?yd$e:F@1i8y:<m4Ani9&94BuChTd8piS:8qJ6IGY49w#RX
aJ/kBe emW4LJT5aHcL\H?G=Vp>P=?SVk?W$8uL=+>p=?@XC?AF8KR=<jaV^k+dQwL/SR48L?pEytIwX4$%6:C\
*4DBCc 5yywM*t!4i%WpLR&=panl+?WGBtbtF9caG1N!%\9H:>BAWBH+peV:SRdu\T<\FPA5GNHP&Ze8eJTiSpq
%BXD%! E$yLT$4Bl/l98IwuY6R>?n+L:14PR&bu>QZd>:<+wYkd\BkKaQKLb/S<S8P6G>iBE@Zuw##uV?4Vq/@G
m6F4>m +*NF19!iR+!<Xn5N$8%4+Z9+IHXIAX>W5QHlI$iQlRd9#CEN/!PPLyp&$Z%j$idhJMwj&>+WTm59ZGq<
Vb:/ST <QTjD>>cY:+C/Q>??4n=\Z%=$=D:D=T<AKeGZ6Aj6CDlChmkNVjudHbYi/dctdT$qPT&JHb!Tm1XS1h4
6ZV\wn aiBFmc!<pmBAXqIIjDC!t4%$Y%lGbiPD1^ZFPit/CbFl\d5*4%t&!HQPVA8VkV*%^TLSC#FLm<L+bREj
^Rc\Qc /%4^>jwPNVI#8!V=mc!\tndL*W6b%#Sk^e1kVdmHFJ8ck!eZ^JYkt4WjNF/8L5qJRZP^!5jFD5\FbeR!
QY<8iI XEk$Dj611K641IBGWtP^BdymTpS45aX<*kelY/9j?A+Jb>!RZ6wcHGGZ$V<pJtAuq8/IPFh@9:EtJ@dI
$nEalX qlZiLnN5dTbmXdAb5?j:?AY5Y4>>@@Gw%HP!<*<!\yyl^IAEt9Q^biPb^QT<@GKFVKP<w1JWKm6yKi=Y
aVeCWi ZFKCke#qIK8Km\wK#<LKpT:>?*X4P^XDQ/i:9D5T/LN<tY<QFi$68VWZ#>e^y+hbbS@BaFRp9Pqwy>Z?
@YWLul T6?+6kSQ\eVkVG^eG>lJCc!j:m4E/Mj=C^a1h=R/PVEXZI#Pa+LhbD<HC$+\+Tm*:wF??9m>4aYpRmE4
Xk1?RZ 5NaE58JBZeYbFc+&+$cPHRN?NWmuMa1^>Dn&iAu^4FYSEjIJ6IY18aZJcG1+@4DSa$nIk:GylhWpY#5H
:YH<S6 b%iQBd=LB!%jVa4@M^6LDCG\<X5+8BNHqJ6d?eW!STXhIecC>Bn?ZZ?bMPL?A*t#:pMW:5\Y/u8T8AXi
y%WVku lL^6+B<tAwVVjZAndq=u1nVZu9PjNeLR#FCw\lMbtk\dbD^4nuX@@SE#X^@a4#mk89@A\RQWRj1RMeqF
M>Syha PZ=mHdkRWenPpE*#b9m8Iap9SDuBiuH^Py1K##@d9u>?@@4q5<j\NHeXh+di^a1Dj/E#ke=NJ!i?huIC
=lyBXH t^aZue5BW4C!P:I$MptpSwwm8S9cmQR#b#I!tGM@JEbhZW%qYYql8WSwd8?#H5VVqRh*/18q?d&\w?L^
1@Q1$C R:5&B^F1YE<\GV%mRFh>QS&SFwd&W%w5ed6&8%kH@1Gqy/iQqad/nnE!Nna*Nd+kcbH$N#T%uD4L*h8Q
!ul4<Z !hyd6Vyw*eah?+?inE:JLm^DwwCdAWT=j?jc?VLGj1\QtD>4CtM@=BKS+ckBtm41tt!YCp?54cPD6h4b
:=<y/t RMl*RyWiw?WTT1I&1u>Zd4@9ElNnY<<%\epXnje9FTYH:qnqM\eVe:GF46WWi#jQlTDu68\NmW#N:VRd
>5FZad /ceQ4q<<&+almW+e4WEy/Lju1+1yXE=tTYFlVYZNle8KB9w!?&L>idZctmybByWtKJPY%b!94&>/B&6l
>cud:Z ?!u/Kc*djt#uNNj6&/K9*L^/=eyqWq/+?J%M9i^<Tu/Dwy%tj*#^E\uTh<@&Vi5/?aGF4n9nk$F1Mp11
Fd8GXV R<pQ9$=?pQdHVLlICuQej^tq%D<j94T$aj#==#<b<8klcJPHq%Jn\qdcVdP!5J\\dl#YSDMqMeyt=taY
t+b>Vy E<^NVI$NnehnieFlI<cPw<dLJXyAELMJ%yPu#b\%^>%#+iKARaTX8@cTVJdVYM%e&jMNyFRISp1ubieX
NB1tql !TwX%ZRXZcqhWX/GNYP9MnERD+Eh%CQ15Wm==$1&>MG^pLeNckE@G<@TWQ4>MlnZ4nXe11?41cw5<b<*
qS%\AC c1VFlGpmS?NBw/c+PJ6&:&Z18YQ9*w=>m9&tB=SJn5jCw4i5&+yyBEiQHA:i9VMaY?yEEY6cWquZkQ5R
4k/ZHA aC>?MmjBD?<**bE*D4%N&QHwMiQ=@$GPj%<APdDV9c\w:%^8Vp::YdY5#I\#/aw$FykLh91bDC1V#6LK
MZ=u\@ /a^u8uCl61yeYkVWMLH%YLZuhG:huRhabdXjcV/R+>V^R&A*qm@&e4G*uiT!!H@X&wYY=mN:>?pqEAy=
j=XylY :X!c^?eLSFw/9RaNGk%*R&:PMqaa%pqckSpt\I!=C=emKaLY4MN!T>9*H#pSqbSXIK889*Ln#u%kl6/>
uYZ#8Y P#e9XSYjBS8!j$8Ru@5MG>!Swk#dJL#S\#XaHJ=AY%hZS/FN//lwmh+KXRZ/A$bREqBXa$iP?!:SMZj$
MF+@&@ &^=^:8L>t^Yby@c8YiR!#hJWd6#HBCTh5>6<H@@Xt*ajnW\=%<tJM=GEE!dp@PH>KX1wiQdwSuq%XR1G
cS9cqP 9&SpKM:Rtc^5#dQu<1Z*Z:*<*EdL1XQ$a%1:yTLh$m#8+4Xd%&>e8*Ly\9uc/ne!6d1:ycW@5TB6H*Al
YP>AI? XtN9!RZ#Qh!^i#Gid8GtA\mtBe^8K#XZFe<djPcV+#W<eMC8iu5QpY1P!TV#n+q#i@u&E^+VIj!XB8Ij
#5@@w8 yV8lnE698qwaG*jKh?tmPVPt#:CdMS*?VLPhP5ZY$eq8t8%EM/N9CHwVM$6$1J%hWTWFDEKuBW#SIc#d
D^h@Lh kwi#+F?mVpK#kGF&lH#qNS&%YnZaG:d/@KW4%^99*CPXZ8puYp?j@eL:X<T:wt$I689/dSIi@#IJX:EN
FIijhQ Bkn!equlwR$Di$$XVl\?%G!P^<#SZabPZ:F#X>5i@d*:5IwqkV\AQDw4JDA+=HA\hakP:ueplJTXTV/V
bjt1mD W!C414>&=?F#nI9/@8uhQ!?iAKh8N>/mdk/:lcpd+D+<RqjtV<!@R<#j^1awGAF=LnhZu5NB5RSi>bp#
4XNYWI m9S8b#I!M:P!5<?i^eNDGRF>jZ$h%pwH%JMw6?Ny5m9*H>!>$VCGqBjGywnBi:cCB:HA*T%kS*lt=e*1
yp6EFZ 5!H4q*1aGa+dQqBb/&eettAV!ylqXA!A:&65aV644p@A/9WdNt:c9Jqp<i+:HBcbtIq6I/@i9H6j$c#V
ajA+G6 hQ9GqVwbYwLD8>c9YDl:1mY^BD<qHMQ^albjY$hZl>JYk:@FwnhChRFQb@B+!RiJnyGNi?DByQLGi@Z=
YK1Ban <ae*LZY*5#VyMPyndGI^&YH&*AXLXt+AuINA8uAVeX=!J84RB4<=p$#8T6mw1SH6nejBu@:^+>&4j><B
N:FSjQ ^Dww?m9hVy&t@/L=<u>8#B!<?i!F?:h8ZKW85!8q$4e!Nitq&y!*VaD8*q9AQ\=Rku8&5!PG+kC<*icC
yqL8!& >GHA4TDk>9Tb@*5nqi#6p*K@#MbI=RYWQ8Aqj<GRLaA*/y?QnLj<<9t#J+n64!&6Z>?@kwY4RqcRltXX
-A!/8p 00015bd38cc001202b3 Page 270 of binaries1.zip
4Z:?HA n?\Ht^K$e1t9q+iL\%S4e&NDB6#tXncM+9H!Zd4eIlAXD?+YKX8RaeI6YhJQlyEWkG^!+qqjj?HC?jN%
iaR8VA 6dW%%ZWZG\m<@*4<SQGWipa>F@!C>*eC:*+Id:Kkp=PQJ/V5JC:wX^q<X%cWW#LXp9S\a/FYn/GV=<?h
RbA$uT &K?*5eit:V9ch^u5*5QWcV%EAB=&In\=e8WP4A#Su?qam:+/ciN?Ch8+9&hY>JjQHnW**d=%R*F>+I%d
atYG/e nK%BGRd+B6@+?*@^jd=KXw^%Y<:J#&uk&k:8RF5tP!9:LJYnuj6HlNQF<>nj1S\VA^$Y4n5ajc/&<WH#
hJJX+F k/bB6/:W%<mKe5+pSb<M&d>>\?1A=d5m51wct!/eQdF=5cPFwRTWDT/@8SLKpCXyp@R%My@mCJkP&1V5
uwJ!$e 8aEFSRHVCYj!T9G8wlik>/Cy<j1Xm=Y+mIj8*^4p:?p\!h\aWj%hRl5Ki14#SYIhALc8nnbkGkM@6j1N
/kQTY5 ?!DSNyt?eFNaV9*>t?XuV8=e/YX9bhJt%N9a#Ny8q89<^T9ZA/LV#5taHhPTDET$!&VVJwp1RICBhM%8
AB?C*p ?l9hBmC?V@M9YjXetXaF1<V%K/Wh$k<!hitFC%qXj&MN%%=KAH6/8Lp+a*W<QJF%uw&:\p#YPnXZujm*
BnIltm upQuM+Zu@8lGh+L5juc1p?cu4>=<@Eb&E\%dqB4qQdNIE\T*jHu*<uHV#abc$1A4M8#\98&d%nAIhy^8
T%BWC% a&F5?BWSdG1BVj5e=:nN<%:59*IR:9@9*EMKPy+m5a<y5D+V&Z/CBEHuF8J?6iKT?CKkGDAMt9IY\i?#
SB5QwZ n8jWC@y9Qy+*pXkcA6<BBL:K=jtZB+6hm1/CbMj%8dK<VC=nqRqQnlPQunbX$tQ+6GY\XqE:YQA%kTp%
RlNekM nG8$E5ESmRu4A#d5JS$nntApKauL4kBN$9#5NZd*k^Z/?iQti:h9Zd>PZcP9D&JCnymaw@?F<IQd%^9P
X5A81! X=YXFBbR?i*=Guq+8y&hVYZS&X$^1QjePR^i^<M?\QDqlp5Z5DB!tWSkc88^jH6wTpu>>V9*t*9Be#GN
AVkHYM 4dNT+$/HB8@i896Wh5*6y64M+^8>:e^TJT#\tFnG1wBnR$4CNVKd=DDZb>tc#d5X?*WPMG$@\p:Hy?iY
Z!&H+6 pFN?\G<*4QS*=XI645wSS*b9ZPuudtiNB<PGly<qQMN8dE&?YFeQX8VZ&KNM&F%q/JlQEl$Ly+DhMcW*
Wlb1=y :q@Mn\5Gd>VG%MlID5=cL^A>>uQtLX1^juhIXFyiGeH9?hLM1PCNT%^6#i=JNDEh\MSRkkk?9=9?V4e!
eXab!> CQ=S5MGm9>PP\69*L=c%T8p!FXubh^qhyq=Si#*9pkJVSjwTHH6=#uYh+?TI%dP\^\p=/9Mp9TLt#qY+
Y*L6&u 1<*F!Ab9e6L%i&6GGjCdnBp@bG<GF8N@*u%tBC!&*<RF?VP#IL@=?LY%=e9d9^<%Zd@E>D9>L+:6Jp$\
?\EjGS Mj\mwa&EyqkdH@hm=m@$C!A+J6JcGhTRppcAnB5!+W\8XppF?EQWFcyB=jIq1y:Q\BlD=@@?8?Mq>a1L
BNTX@y ^/ajQ=P!B+Bm$lH$C:Nl@@h@XAdA?D#C8EJi4qJSKT\=MG?MV4iijW&>Nt@c9EY^%YwdLFY:aKWmXiWP
YtMAmX M^WYVpjGJGahCNmFyhkQM!H1Yjt\kq&:<>iL6%@kDeM!@QR9BMI%^bZlX/>h9>uaSQbnun=@>i@dZ!D?
\XXwYD SEB<B?6CqyeWFSaYFFAFhKFGWYF?QtmP>l^&:4p<Sd=&\c<Ayaa4VIF<ALGSqbQ989&uMtY%>Xh9>RTK
ZE@Ijd QGlmIny#M=NmIw=F=6Vi8XPhhuT>q/%J1pVF!I!!aJuVbq1ttK%tb8Qk:4MeV:CP!pP$MBuqSGS<ik:R
k<AkH& <QKN8\Bl@j6*dq%98Hm?5lmLnl#e9ucbV/i!?CVlnS*RZWPhK>aFH@cN5EQAF8kQ@!LSNb#wHuR+4cdy
+wGJaF htZt!S*LQccbA?Dqpu+a/n^l!k^uD><XG@+L+inkVW9hdM$MH$k+GGFpaYbERH^yN@&D@pqF$uhyd6My
MM!1^I ?!+V=5Yj4Ty4q&yW=P:cqFyi>qPtYTcVqhheL&^AFQelIJ+*%^ZY+lq&$/dcV5YADTjTZaGAYK+E<RLt
&KetFe 8Jc$%X&*cT5JD&PciiKKiL:l^q&T9a^u@=$+@mW5Q1JqjjQm4:9Z//8^Vu5<\jDGwBXLjd#t#uG$t&^y
elw%n@ a9SbwpZe\!uVmbn\<X8&cmBS!95PMlXD+yQT#lARp>D=TLL8abKw@Dy>VZm%wiHT=Y6M$h*uj*i<W9^D
puLcK% @<6qAQ!N4MQ>P@6B+$KMY+qQH9$YEk!E1/qK8wK1bFZQ11t>pLylwqmu&/!A#b5&dkIed>t&c/&#+=y>
h!b<uN bC$?nLFyJ!Mmw&LnW\6P4Nm%i><Bbb=Fh4/$?8J%$BIj94j>?E^Y+1dGG>jpDWP8aAWG#HMGDL>ADH@/
e\qPXj liHZmPEdYJc^6LmaK1KKFMX1lZm+nDF&G4kG=^eWWpXmQF5nWZdk!%/51!w4qpu+b6M<A4aemep8pFdY
Ec^iD? >1m@ew9kGB6N!\y##mVu%AGeWwKDQCadyWw$DM$tVbp!ibLa^t1C8btJ!eTbdn:L%&@jj#TMCyhHCE/h
lh&jn< npwACGQ/&l&A5MG>&#i9NaDHDM6\\1tR9b6ZL@YcNhtCdCm?p*CG>6Np1@KFY1I&<AE=HMFQALK1kK<>
uTb&TS :C8Ia>5Ft$?ec&l8KE+IZ8<#!<4a!LBh$lip8eWpP!iQST5*:npYub=jZu<LeT#NAl#:8$<#M&^t?uNb
m<n%\J Yb5#RL/>t@=JW=SCIRe\*/c=#$wYnB+$bq%B8a!TetVT*P*Gk*&LKqypHGq=dX%FhqdJLaJulLPH8+8#
\qDGM! \$\::Ie\iRyGIDp/8:l:pBKC:uI*NZjE5^e=d9Z%Y$4eQ&Z$!!p<+Ceu/Si9NtL!<c@w^i>@RQw#\Qu#
PG8uFG t?eQ:=ATM6t@+d\E+D#dajypT%PnV\VPq4?$<bLqkYb4mVa?SI/NMC8PKiTWAHk?HbMEnyc$58:T>X8N
E*lMN= ndi\m?H%1%i8*4\NiAc:@W@4c?wNS+qtDCWa@K8>?YiM4mF?*%?hP^$knBHQ6hXXXXTqcqX%Vc$RP:6h
>=k%C& K#:6NEC98&*RBt4n^E$dN/?ewM/^*4/jNA<m&mImKnEq@wD@+yZdh/J:TwJN#^dIcm:jikDT+tj46+>p
QFYj4d Wd=#<@1X!>TqwbeBmDiWpH:&+6Z4Q!D>HmDhVKwkXplLT1lm1ylVkphliELeu5<8KC!TF&6KtSm/1>S%
X!A/bn >c8Z#5MCDuA&5uL$D6\bR8^V>=L!t9<k89l<W&NF$5FAh^8nFItGma$DF1jVtVHh%5dTuBTpZ4@nRElE
/4=?Dk VF!eIycK+<ZDFTW:tdeB#V&cd6?<i4t?641mPCe6=pV\#9W4F*9MJH5dlkBu&qB>=FB>FbctR1RR1tG\
h46u/% pebQykG11t:j\eP@T4SN:j%&^Wkdt?y!V8%i+YF4btValyA&M4ibnyDi6Qh+#BpqyC>I5&PCN\jMuY=8
Aba6DJ >BD$Cu4@W&\6VVw^*RKa:qAwANP*cN$QV@jP:iGjlh&WCmM*L=:4+Ht&5l$RZXy%wTauy?alNkuymwB&
QRy=h6 t#QLAjGMSe=IWJ&D$^\*!pNq4n9qS4t1M&qG<#%@P*%4@t^>uy=>:qeb5Gh@9@wHp!5?hLyaSHD<IIl8
$>qXKF 9u$XdFbiJkk=B6HL@Z#t8#9dV=5EmQ:+C>GP5>$<Fm^c8tL%aDAEP=kDu>MpnTeLA/y\ma+BZW1TadFi
XX!JYG =q*1nld&E4^^@ed6ytbe@@==<@M6=>&H@\iiTW$!*LpnyhJ9M$wbAZ$B*WY1Yk&VYT>5^ZwhN&<*NXRH
*i#X1D &R56q/%b9*HVYp<nQa/?+ab>YECeADw1IY:9p5Z?G$uD5d%+Tl!htJbVYFaLY9u=G/I!RD:AAu*>/8YL
d8N9A1 tGQFAL4yQ+B8?R%w4H\E+pG1KKXLcTpNVk$=*i$wXC<1Lm+yKcYp+nITF*j%?w&dN/>h^kXhK8GbVuFb
m$N6kT 6Ga*>lmN:+diJ8b+*:nL/I&Gi:jKE9c9hLW!VAEqc8XAmy^18#k:#y\&cb4L\8Z4h^+KQS&jq6/cNnRn
tSjay& q?^KNaKYl@>=A>FeXTHL#$\/jY#@%nWBQ1:V4SmS@F:CB=@M!5==1yGGtpBImVTFAm^:1mFwFYwI?D!?
9uJ$Jk Z9?l4NGjJGJ#=^WHW&1cG59TRna6hwJq84WV$5:#@Fb6*lect=FjejFYM$Bchndt<PaAD#5Lw:?aPqPV
1bDXj< y<$AWY/wFB!6kPp&BRYa9pF4K?m#J+=8PuPyK99R^5*4q\Ytqe6qtqIRHKZbF^=m5:XiQ6k@#uHthN5y
SjDmSR Nql1qktNlnZcqXRld*hXe$jFaiKyqM$BSDb9&$Z/l*ZYC\j^mq8Yn=+\kS\p^8>VJ=#/@9n$?uq#+=Y/
^W^/L$ eqB#!ZGuRwQ*kuP>#G?ly=9##Kp&APaQTnBQuVF4nn5/jm8Cl8Kl@l+t6\N#h4K^c8WbSuApbiSk$Q&X
BIHWiN t*ibbquCP+BM4E:JSHuJQ*T<%@!Nbk*G=@6KjitB!#Qn>@$?1pE+Z/\@Z>hS1%y*wj:TLM#J9pMY?u@n
<5%!#S >9qP>>&/iju$ah*%?p$M&p&\jPS+SQKS^a8Y4F8:hl%&W69B^Eauy8eWqb?@i8i9q??@6j*+>QdX5$i\
neQ/9: NwM$WNRQ8wmJ*u>A?h&jWQ/dRQqmdYYHnJJ^!51^pEyyTWqHMX&mWmyX!LVLTA\QCBc\ShlS1kJldGSl
?yS#!9 =?/*ql#9hk*DZQh5EP\kFt:Dp#!+Ka9d6*#&BEC^11GFuRi%TMXuwT/+Sm=PM&e9YLb?X#CGQb:LP\ic
%Sih>A jECu#$N\DI+iiJZqWqmY+<IQ:>+W8MS46m&nqD?AW<M*t?T$aPY&pQZLl&tLKKEGu!eReLu<N1GtkK9X
h#KZlQ j<RamiTVSN9R!u%N!NqL#R&Fej6Z#=<Pc*MupP&eQj$CN?<Qm<551L#aTICeE*6+!:J=M!$S!MbtXtCi
h+\e:? uS\uk*RGIF@dVdeDpF5IpK@RZi@tum+5!a5/etn9%y%biD=ZZ6%RqZZ&t4\SRN\DMi^kN*WKXuGhaIFh
9I<j8H ^&\tV+XHe*F*h&6%XZNDCNPie?e#ul?K=w%d5ZWp$?d^DDubkNZ^=y*:D@>/>QnJW$#H@?j%4*YbRVDV
JXK\JY \lZ<piQBi*B:!M>:u18Vuc&%lauSi\dBp/dPuPW!F$>VXkcJ%9@8Vwp^8%TP#6t5#DNy1WtJ#P&1\*J&
@>mi$w %EP/YR5::h&>#RD+NXCH?6V/Wd$V9&PX?Q*!=jNuypRp$ShEL!PA$ii:YI<:iKT5\MZLX+dk\upj!+/@
DllFM8 j9@y&>WpH:?AlW:G9d1PuL+P?\aFH+<<5hXu+b1kIG1%E?tmTe=mCacLK!<R\j!D/I5uD^EV5N1VekWE
MFPG*w ^CA\Hn$G1@W@IH/CNT6SByhSMqcbJ5C+wyL5BhK+RMQ!#IajWSXmnL^B:Z*:h8MNZL?qySK85iYM8Z:E
WX#+p4 nVEAQ+dpny$lBG?+eX$c8!jA!TJJ\nGd/4bpFdb:$MP?jS/8ZkH4h^$?Gb8YW!SF8qDFhJFteYqFLYKb
nNc8yd c8=GN6*P%=La!K!p1NCDyKa@I=py\<@k+AEmdX%<k*cHJShiKI!\H/VF+XJCt5eT!IZ1A4:AaQAaPeBb
hFLW?5 dGnn6Tt<<Q1><#pSP\JedI!NjkISiqua&M*&Y4J//+EV<btFqbeR#QWA=mNdq*9cY^w@Au<Y\D#Vca:4
EVMdZa :GpYBM&Zh>MhkPajCl4RjJuYjZ5%PV+yQ?bI<QECYWZX6dLe*C9@a8@!dl/8V9dVdThbY$:AY5VkTeJ/
Fd9BB^ DM9^LNAZ44RLQah!WTh6IPay&*54JjPG#j>6IF!mdH9TSAwFpyQ4F$yEj@#<<jY#B\BtYiHbNM#1Q4S:
-A$bKW 000a39abe4c001202b3 Page 271 of binaries1.zip
Y$ZFT1 &@4AkEWLeQ>m5yYbMWk\LdA1XyPt#ZS!bja9kka!?^ihiZXu<*B@Fi5Iy!aukT$piZ:*H!pic&H*8\j*
^1!QBi tywjAWb\+:nnT<hu?w51A?Zi1G$/wj!S8H=@@+qq/y4/qabLaQ&yC*T>Gqp&B<QC@8C9J<>j9ju\?RiI
jS@$Wj lH5=t*%edH4*MJ/#GX=Q?MG69u+45P5W6aJi/SlIcL$ZT&5tu5p641!@j8@y9=>dYlqyeSh*AT/e^\wF
1hPb&u q#DWyitiMp1idHD@IFn?@IHB<4XLhhWXmuJYBR6<WL1c4qT6KC<4/=CyI4IXqhyXGB5A*5Gh8$%*dq:F
q/!4ey <JMTCejEcwcd%<JFT\L$!XH1*wP\85TqbPaX!$ymh99QMp?T1Bud#Ft<q6155uF>q#YBK=d/LkAaH+tI
yqtFD9 #<kHn:GtCmqVVyYyp<LtVXS#>!c!eaFu<<WF8iu^ETH:61=b=8QlaIP^JA4D4=IB+Mlb&5%h8u=@SH4y
cJJ+#Y =Z6*clM*&R@W$8ALlZ!BWCnk<9YGnl:ZnpA&59ZbHmP:e/e!@hlGZ\eLI<Pjpn=G^lMt#ZV^<k@ch9Bp
m?JtN1 RtaSAjK6?4Le&KQdXuk=VDS=LBEctX4c&n8:iZm/#dA$Xt:L!RHJ*\tTL>Kmq4@!+tI!V=<1B6<$:<c:
AGNW!T 1\Bm9585GXMuY%8TIq1Wpena%N#TGyhnb&#PPpe^t=/nVuKXQil=4y=iZu?IbFTG^$tduh@6+Y/RuIat
R&i%4q $mMPkQ!MYb4@jjdk%8XcYWF&K8cwH6!>FVGMD6<$XBS9EMLtXyPu+WHjjJ>PCQ@c:INH^=1j=*JkTW=Q
dBZSJ4 R<eKc+Dh?+9$u^M@iR!adCb%=bqaD?wd@XZ?Si$4A?Ni9&H<mb#WMNG?n=nV:b9Whj1cF1mKT^e9%q@E
YmZtJt YkEkbG<Nk8Z>4/ip=mKG@L%>?jlG:y==\$jaiG#b6&i4*:K%t$khQ+Z@4IBqK%a^cdRMnE81L6=<kA4=
>mVEM= =?h*4=+@8u<d%ib=LCLDqAS4\6NIkDGG#*=taQ^NCiQGc=jQX*hWcqcm&\piKG/yIKmyTwP1cqLVtkE^
:t6uLT ZN8:6//S<$GJywuqhIhb5%*u/up8<F&!LJAy5Sq&Pnayc6eTB:Mp$B/Y5*!Ch8@HbnbYGDY>IkA4$Cht
FkMnX$ FbWBKT=hJQ9\6VW%=!>h\=RKXQT+e%EyK!*KQ=ihA9:i:p&4@d*hbqk#IQ+8/R?L5ct%9ii!#eFSYYXZ
DL5%/H :>?1VA9b/D%FMpmZ!?eLBRL6+YQH6\CG6a^uLNtdXN%$w#V^WND<1cc\F8NGl8WWi%j9kDZdk!PT5w84
GE/+NM Lm5^HHh$?$19YVctV!RmR=MJ69b#=wL6u?hkdaIkL6%NA*/yd!A8w8kLNLjn<+Zw6BJbRi*H!+Bjn1Ph
d:G&q% 4a*XBDMVam\ESwljeLV5uX*t#P=\yti4p@bXHt:KT8?+qW#M%+:jilZ#EpCl%IF\\$Vnt>nFHhbmJmLl
h&&hih ?a8ukF*kT%bK*Kt\I@6*dX/*!6<Zt>Hc+puic!X&<bAc6>+A8?d4tXwXJ$t<XE+?PD1+1\w4<JuMQI!B
tj=qQj ILZbZ4%/?jL9F>kN:6FVlP=HE4Yu?EF@X*^V^ZkqSX99Q=H:pRpliR=!YAuhG+441qi9NDRwL6MN/qh\
tc:e@a w@j8wH6IlH@jjj#/5@ZHy#e9HnXh9%l^h5@WtY8*dX!^dhiYDWEaDPqHLS1M>ihZpAynB+/TDK@T/p8*
VJjXi< tq?<@W4$<NPHnL/5w&wHE?Vi^JMR#NJ:TXnGbMRS=JKyDSh1AK=X4Gw?aye=u1!1/mBdKDYKY8*#F/>k
CZMhFj aVA$eDkdc$yLNI#NmjDV6dMHS+Ja4nWpR*!uu:%bwwSuN5N4%a+RdQ=\&P4R9q%d%/@diiSWWp=JJjmA
1Yi*nw bK?tkdC&+ZwnqpC<S+BdZaG=h8h!MlInn^@e5Z/qu=i4*WSVa\Wk6+WIY&Q#!cCK6+jE=XVh9H>Ntlm<
/iEbWK b4+6lu#*=uQ=+nHjELetD55Pucq@$FAR9YiFK>ER@hAy6HX\>%t&d8jlW$qum/5^Gi=Yjjt=8JD61:!h
9l6PTq J=pbQyYInC$t&<@^YPD46&TB<&R#BG:?dywG+H+l\K&n%SYjt?99@4\IwPZcVdG&NDNBu%M8+bHkuwpa
ae:y?% *DPde1ceKGiN&ZPId1A>b5@:H>*RYaPRCIemQGC1b<yApCwRGFZALL**d!JtM=NnI++F:>8^ii*KyV:#
%#eypb ZYilbDD/y^P!!6*mkFX4VEuTMuG$!hEKee<L<@N!#&cm%$?1q@#>?5*4%@?Tbt#QELEpdPku%W1*$D<:
<VenIG j1nkVnH@q@kF\FIj^L<%\*$G5jL4Kqi9KBw+#I5FVDq&C6?Y%8<jZ8P?aH%qTX=G=Q=%t@d6*d==ZiAK
DpE/HL j/\e=w%J4$^jmC$:>^<Ja\Dd$Qn\:@jj&:=@jENpAADk9ILB/@Yd9+wFaG#Fd:!?iju$IaFKLXXN%:B1
9Ajbcm /Xy%eCSlEcS1/SyFNc8G1tZXKe=4Mt&C:>&utnZ8*d:SeKFcXwmXQdB&mw/blcZ%FD6:=dq>+F1@tccJ
u:betC E4/J:h^q&$Jm+8JmwmJ/uVl&iQ?8HWhPy=!V%aCjh+<$=&aeAJKe$P9?dZ\NCNjC@N!#YcSF\dc%K^dQ
e1wqIj u#QN!6T+*alq&CclDYpnQSQLcc/?Rd9Cp9L4G8>hLw#b6>Lh^1lDwnJ8@BeE1=u#11M=Djj4e!K&L*G!
4N^X4/ SJ$AaDY%un4L\*jF?6%HV/jpqCnBYyEZF:IneKH#FDNA6I1SId4^bna#=5\DAC^j:8M/%e\RIJ8$t&a^
WCcJBd P^L!DkLd*aBYnepVLW!N$DjpKWN!:B!huVyteWk!MGwD&1M@L1?MNqnFuANnJAQyTWGRm5hIm64l1Pe8
XY>Wky Zt4AljatAi9NT>XTkGqMiMnBQe\?5Ki4+#TdCTcG4\lMJ$:?jcm^h5DGdd@#&uILqb$Gm\9!e*Q!T%EV
IqkQKX QHn<>&919jnh&#h9AKp9@kaLnyWbYn9c/FaKeQwdyX>@w^RqRYhIN:qN<l9$hha%/my>VjM/mYNw@t9k
1Wi@XX a!J19:i&jQ*\#>Qt^m9uK+y#M=Km\$MP:ht&Ea<#jd&>QKq=5:Ej\cIq<Fw*dh@HSBhIc^y8@+XP&6eQ
qml&4% =Lnm=nYMN<XqEujmd6*y*Gu+Q$D>/^+BCX\&Xl&QPHYM=>lST>i^#%?+wKnZ9u!NPSq=?Bh8L8NPd+=E
h=?AT@ t/qBcI+k^W5*j\dAW&A$ejcT#ahn5pBCyTYL+1QALV=<PnY@4P+K&H%FM@%A<*:V*V8NJBm/N<kYiPK1
pFA:?h eqp^wnM#I#u/^PHht+PY?e=#^pVnNmQcpJJRAE>>a#Mdi+<q/@cGy^Xn9pL81b$B#ybkFAGc=1=4R9P9
nD+h9J N>Xtlt:!tYttlKab:yA6Z4q^V$lWcp=yVePhZ>Be:VQH%6!wFXtGBjP@T%mGCmM6W!8:&jN<qm=jFdVc
ypIkX& d//hBWI$jA@NwtmAcAhAqFbCXNZT#NnwP>bDNmZuaI/PCkjcpeME5LuNuW6=DJ#*=*+Ce#lG1wCVw6kp
Z:>&9C /L!<A5VYaJSjhihJ^V<\16eBu*tbiKMQkAqc9e#Q&<QFAiQV@9+9QJe5D%\*kNn>#nTYpuL$ELC6Z%F?
qieZ*Z ZuF=Hatb@9e>>Wu4+\etaImk<$hL/<<&1qZiypaYV?1LK6d&W?DmmSGnyF55TZ/@Sh%p\^Lceb&D!#^J
euqT$D qB#\ApD=BdQa*4%/e9<YmhbIV+k/ejVA4m*\Yyj+i5@*eFi+8yN?PLlS6&E:bk+mKG5d:n^?>jEuiq8M
laNBlL VL%WZ@5LqJ$:B&RuF$Hb?mewd%!=CAc?D1lM%/9DXRI4VNZVF/n#<FY9e9EThXtdiRneuYH/a>TW=Wk/
qW*EQ6 aEHnEHp&ehIWp\TJ\N#Bb@*B1LPaLFmaJ#/dulS><qS1jpZ>>d8pZH+HkJJJd8mD#%qQ>4wK<uLPby=J
Y:uTSn T+kMQdS#+?wAH\<uBGR4&HeK\An8n:NZ\MaDy#NpDjh8%&TGdX*5aQ+QkFE$\Z%>iHHn*e1$w?8<yypc
$=\t99 @bDRSu$5J5&aM><9eQP?+>Fy8hLcK+nFm=X=<eh&Bm%!uYbl*E+55!u/SdD+hVD4MhchNJ%k/?Vlk:qM
9RFdmm G>aHiNydG6ETF5%TeY^*dGjl^!8Xi!^6Nm&AqSV?NX*=%jpd@ElT?ew!MJ%p=@D:=>QYBK@&Q?i:nKZC
BQ@/kD +9&cG:u:\Z@?H?5@n<iB8S#Yu^>&?\*ld^4?pA?YC9=>:S1LnYNWFE5X^!XLYGw+TmR5hVKL^hLAYjCh
^1PX9> Jw+\u+Mn#PjmCQN=PMJ<Qup$Fp8An\d#lVnCV$R+\u\6HGG?GEia4$&iqeZT\YiF?dw+\u\>HPE*?nnC
Ra:VTb jAMeaZ+Z<8ya4K:+/tB?N^^ljueeaZ+QHGFGV^^ljm@!Lqm5*nS=#/\?PML<9nnC@H++\9#?PMLMAiVh
=kYZq: 5qkD<h*C>+N\lQtDeaV=R*CE?WN^lQuD!FXl5adnXaH9Sq\nH/!S?DjMH+Wn#B?NI<\jR*:Law*F*<L<
LytM&B eVnCV<dnCQMqPMJ<R^^l9lF=FBdLGB<F=y9kCQNNeaVjtPEI<<%^lQpY=Nqa4Au+dDDjEpiad+Wn#J?I
>B+iEN I<!\^lHt&=BZ^YJN\qeF<!jnCF>VeIV=6nnC@Kp+\5^y=NWD99DX\*\:HPFuM*CE?VN^lQu&PMJ<B@I8
IP49Ec YT^HjJj\*T\ead+VnnDjGWiaQ^6HtD?HZA$Y!\Y9B5^*^SF?+lbFQqn8?DjMu+5n#QekQ&Y^=8FQad+u
Mu/164 nnB@Qw:\G!<eaj+CHGG?N@ujLNbC@N<\*\hHtP?LI<^jlCQMYI\n#Qen#\KZAJ<F=m@FEid:+\ljAVnC
Xnj5li @GW+\5#q=NY\YC9\%eD<qVnC@FW+\8<CeaV=1*GE?WHpXdNac@BX\*h4eaV=/*CE?i6^lQpdeIV=G<t:
\:EWdk a:E&+d8D?b6^lJ>5\SHtd<WS=t@DEib9J%iB^h1BX\Ht:<RS=8@CEZ/#i\u=aP*B9&H?Z9I9Ft5j@k9t
w69dG^ :<eS=l@AEiaj^BFtHMIS=kiV@<XmHed@BjPQ+An#n?II<$N\lK>nPMLM+?VSYc^RjHTaH+an#D?BI<\@
JD@i\N mTQMCeeS=piRX<FmueJZAh?h^lHtS$wIW%np:5H<cB^ljk^=6T^YLL=ctB?HI@\pHpiau+An#E@EEiau
L*tJNJ pZjFamZn8+L=KVnC@FRe+VhyPML<hB^l@lu!:qt5DH#*MD<VS=mjlTQM#<aSby!XpA>YD9td^e4F9&H?
>$G5>@ PS^ljl/PMD<jS=ljkCN<FbLbLFaS5$K#muGE?TW+\9^THGG?FEiaK!PQ!tKX+cQCh?W+\9\KHGF?Ja+\
>XFG@K 9\yHtF>Nuy*F15Ful@t%PMJQ/uCE?ih^lQpZeIV=>iSX5qkZ<XZC@E5+\9#LPMJ9GuCE?Xh\lQqZ!d8B
#X@6N8 J<F*A@P9+\n#d?AI<&@mCDN8+Rn#G<t:b4F8+=8G?Zh\lQq*eaV=VVnCjGLhaPd>n^@J>Zu\?DEbt<9L
XcEhhQ !jk\K+8Mj^$/SMbHG#iT<dG4K^tjVJqC^1j>?=Q^tda&Gb?#YPRSZ<BWjMT@YT#!mC>bLQKI4%k5<wn@
jFcy?% 5FnpEj>q5ekn9tc^!CP?adHII:=q5ekn95MHlWh<V=:<Mi5Dn9CI=FZDI*:CES:^M+:\mF>\lEj<mmM<
qBAX6p +nee+SG@+\mQ?PMn?YD>jE\?YC*q=IQXtpW?YG&H!Ai4jTQ=aHY+pk?YjA4=aCu/p\<YyW$?YQRjY1BV
h<n$@i M#An4VBRES8<F/9\^BVY<?T\PRw5\p!^NVl5@Bid+4YL%R*E=kdtB5@NljC*Ij=DdC+&EB9<^Q@Zt!j?
w=kyld @@u=Xe\^\MtG<H@d#Tq4qeZYQ^i#=C?jeR4>LL\69Q$YY%Qt1kd\kAy^B#=kG:\RA@LedPX4/Q^ilj%I
-ASLdb 000b44143dc001202b3 Page 272 of binaries1.zip
6IHB%D Sai6<5hQ+bPn!8uk19C+Z*k1ZJ/eT*QXtX?$a+hNDq9BdiYy+86+VX+H9ky#k=@tK6d\WpAJLXInL?/:
1K*9WJ tGZRnp?PSS@b19DjXDR$&bw1<KXk5#l!upLM^:h5Vm/E8eE:e*$!GyJQ=wLky$GHYBZjhj@P6@@@:c4A
!X\t#m u*a^Q4P+<!HII!9MNScdY!?G#>dFk$KiQwQQN?V#tjL#Vijj#=+Gt>6aYHk9Xym4mM*qap15wZ^GPc<:
>&pcYb X=Y4&uu=+A?=4*A^<QPLm11tmwytl\44B/ZT@aeK9pZ<?i>4!tX#PjD@FZBF%dH6D+>HeXt1FFih@FbV
bYH\^a weLXXMHbMIjd\iPR>+KjH<ZcBtJ+P@CitG8Bd/nFHC?!HFH&w@McI>JwnkwdZkRZM<9btt^+Rw4ZIhbW
YnJDb4 Zkt^\y^4\F^ye*PDXuMYZBlX@Ahq\IHjM8l4EdQlYYqi#%>Z>Q@%?X*MN!VZteF\l#q64a4Z><hmnaMK
XHe9JF 9I^91Ki5N&*Q8mp9>NM*#/muV^baLLC\<MQ@AK?I?w%Lwiy@eEt^AY#+DmkX@k?X#p<X#VaXq1beSSY@
jaZbVA yaBPtlTd=kn?AC&Zw?C1\yZqj8Ty+mYt8j11ZL^Ltt\X<kB\Q#l\idq6DHb@*X^+P$J#MWEMAR^iKbbB
AGNY5J G%:pINyAqTEq@ICBeqh+CDaHH=G6BDP?e4^TC4HRRK!<JPaMI#TWF=\!%$Nk+%$\JHiS\N+Rdl$mt$iV
h<VjRI K>%=iTpiC::a=L9jTPkR+$5Wh=ICQ9Fl+eI9kA6QLYdBA1BbRQCeA%i@>&>eQ*8Kh\B8m4ijBh\B:\Zt
8@>9XZ l4k5WGLN#mhW<QkE&*kHXQAGCDuMbWN\c/4<cAXe!?H16/8\+XawXHV^udQbt4@^DiCt8Gy\dZueu@D1
B+8@W? j<BhydmcHQKaKuDZKLacMIC4%5:VWDL+NdqTapJ*e?WX/<BL9p\X*mT=+NS9dFNeGqaQF6^+9Ju\l<NS
H4&PV5 <FV\H8wSw8Nj9^/IZHpP<\?+$yTBPq\=?IPQ%<E<Hk9ZJHG**\5K<@X:cjplFlkRmC6jt5Je$^w9>PLF
b&GRtK %6>lwY%@yy4#=5%VClD?nK\pd=TL!qM@8MJ\tiGb=YIF5&/%\<9Z?:*&K4?BT<98WNFR+48F4CB\qd5C
448<ZJ yBD<HJXjnAC+1ZK+5Pm&EXAw!N<69A:tqqE1QAA*tRjZZ$/\$*tSQ+8XHCW4AME*R*y<R*C6N>MGdLna
%m@9F@ #CKmS6:>H?8IGquFKLBYKkk@HuPNDjGK6Ju*M9kFe@#L<A>\M?5IiVkqmyt@>bRw@\@aiY%mEh\@lk?M
NBAYWB KbE#Bk&8M?B//DFKmYRquMt@<ILn9/quj6/+1m!A@/\R$<lwMZQJ@%m6KVc9E>9+jkDMdYRbka9P+Ftj
@BwTBF \VQitW+<A%ll5RaLKCha?Z*h&&F^=HCXhPF$1GmTK<>Xk+tcuY<JkMd:ItdBK^J%44*t=5TmKe#X<aK^
L6WlJQ YC4:+V:lA9/>E=RKRIpc+kJMCA8891wtG=9D!eY/8Kkamyqq$%ByAn4I<k$eIR>IWM=lqnC+Bc%mGt?b
?/%w#! ekH@je*^=5K9jm@piF5%DIpFl\jRWHKSM6i\NmhR@\JRy=:SV>YbSX#^VI*eB?wyG@=JQiQtLLbA6H9D
a6iF!n G\P\1#NQk!Z:8/mTc<ut1HT8#kl*FX\KNJZ4Pd^NVS#\5$QFAG+NYXM/Wc?KC:w1l>\DBdpHujeB:+me
jB6NSQ ^?clMFHFhayT+YkTBkD?Y@GNK?D/W<k>ZNy:KKF9mFjJkIDXZDuAdhlGdkJaQaJb5ncw+d*X@IuNpVpM
+1^Gwj >8ZmWab+E@B^qID@9haw@+I:VLB9KCc4K=wLtuAS9>TbY/EpJ4\8/u>8AtM+^M\N^484RjVKa889m<ZY
M\TWAk m$MW#*D>jybDpA<ZZw?^1jCFwmWaF^#+k*yFiR</iLka1\L$YS\FY%5Jj4\BnC*E>RcHDyX8^DL?#<Wu
GQ=?*6 %lSYhFW\yN^&u5:@pRJpVRdAcnI4QN=Mt1&GN$C%+#eQ*w6:MmaLX*SE5QJPtJP4B%h@L%:&L+RB#MXT
?1A5y6 \DyQE&8nmT>KlXCkVh!%W<\bKm<<jt9PaFWH9956FR&IXtyFFWP8Qe*V@8PqK@>Ra8:9m><KF>?RiYFm
F#EDi1 =WP1YcNeBQBdK^aQQqTAq@:N5%?TpinEb<wFmA:&NpjB9RBZH&aFSWtn!!\QnDbkqu8X@\>d@?IeX=4q
nH\$Qw l+H=A9IBQlIpK%qX#cytw/i/&RWWPXP<KY68lpPbpq$qK:S4c%wApTZ#ZtptL&dIptXJu6/&Jdi/CFl!
d8?E8> Jl%84tPZ6IDhni%qSEEpAlpdaed?IbLhw\JIQPa>4P/8J@N>:=j:?=*#*W!\S=WAAaIwIQN<=@#P:#!@
q9PaLW *DB=Qqb+c\L!6!n=Bq>yWp+wh<Kn=wY6EII89ES<+#i+MNL#KJ@B>!jBITY<\Q<!JG&a8AAASXGAtaSD
kwVPX# Pa/R9lt?bl#Cl?wEal8k?SILnaDnTJ/W6aJ4Xp5Xk&JnIQm:@Mt89m5BF<Lc6ei1XuDKupVMemb/$mj@
pN*%=R $uBGYJLw9&j%u$+kHWLkpcBPBDl/^jyc<RtjG4kAq!bkXQ@=GBXtqj9FbCauWCT$Ei4%C%G^C*T$L<W>
#<*EGk eLQyEA#tVQ\pLVeRD%aIC:QY1+!TM<wq%h%t=N8I?q<WL+pT168XF#R^cwec@!<wc6Z+6E1B%IdENkFb
a9qdcl J%QyTJ*61\+JiVFYiFX9T!ZQKkA=Cnl+N<YpA:1Sm/qM+ZLlyKku!u@mL+Pm=RVWDE6bwjYR?M<d1Ybw
8qDiBu w8NbWjDuS?F^cSI!+cPB5lN6<PRt>Id/u4hCn1QK4Ekc:?e/!d@$mEl#JEcbc4%ETJCyWeS@jT4@+6TJ
4?SItk /celeTJ*G4?6R?VC4\Q8uKTYF?Q\d@JSZm:p@:5bT$@TQKSBHJ*mKRmqy?@F5=9F+Yw$?Y5qPRb*ClCm
Jw??XD ?1=nKZ^JAA/HmjMC:CV==HIV8WhVtW<p*!@PYiYRu>b*b=SYjmX\M&=?N%Kc<&>X\/*w+\@H^B5CnqQM
IJX>*\ V%E6yNQKW>uuJukD\R=W%ZpIDFTTenwVlmMB9wWK?VqD%TCNNqR9e/LyK6/bKdqSkyPCHEDALeAZy@IY
TRyY<: SS@H:GakebdkLu:pTATe:mb#WQW8HdKGVEW*D9!X#lBncD&^=AZXM>d%KK1<Xu^J5FQ&#yh!^qFE5V/D
eC9V@J jJip<k6IiRRyJ<Q@#S\uuphHd##Z\F?ybS\46cnn1^W9%9FSkeF/WaL?ma>M^my?aRL4J=W<VL/TFS&Q
%qGt*M 1d<+%j^E\&et@QhZ5l4CR4J=Wqn<V!G%WYA>JNDaE@lM$DwT9<4wy/mCh^S:Ij<Xt^\\<w$VlmtRKGpK
Htq1:9 HkQ$IXSwy=N+e@InuDkLR\&%Y8=A@kuHemTGZ6bEC!@V?bNc:p/$*Gm&kZ4?PW+k=Au5GuQ$4iQu:iPJ
SSY@!J Y*&8t1=@?u/bm8=M*i1F9KJM#ty!WnnnH<5SFJZjVPq:dkVhun9JYWaRY!R1SQYPa8/aJaJA8yqSjCJ@
9@mDVL \ii8?R*?AZG:ILhpkJD4j!QlKTZdXbuPcnwk1%LNM^bLC*kMmt?ZHE91NNR6Kue9Yme5$wpF*w>hX%TI
hPFMHB 6j#$!!Gy5hENj@KyE+pAS*S:^16T84>wSM*E4nu?FlqKY$um<bHNAwmp#SQtAMwXQ+GAYH<XyTF^j&/T
ZBS^+C *^wtZ#&bi#uJY9BK#=NGV6EpuhQeq1n%4NYBH5RhVkI!Ji+tj%wmHQJRT>iuVPZ#ap=5q1IQJ=wLZyXI
Qt!9Mb @8&pjIp@M*ceW&Yi!X4p^9MS:>p6jnPtE!J&<l=FdFj#M$X*kB@WW:S?</WI1jA4@yJ1e&am/yKe*>BN
1&6a5* XH@bEIdicDbM<>V@ynp9JaZS<XqF/mMq/eATW$q/=c#9^N!EKcV$JAW41m\b\&V&V=LF9!VbWX+$W!pG
t*9qwl 5*NjY+6I1pk#cibaw8TMykBCT$j?VG#/NDXbIJT9*Apy#XZ^je4*NCh!Yq>\Z5lNMn5WtiJ<Ipn<uIcj
h1J8dR %6&JYVkINl&l&yBJJD?ua!t%@DEtNJ#\&Cj^thw:y>m5dnX!5#kmWh/@kQK?FR4j6tuDI\%<>DQ>k8@X
%lP/j= K@ZKVMXSWElpVQ/MJywEckpDk&R8%qdI=a$Vc5^RS!R?RR4\Qdpq&uy6Q5FjmyR#^bmjcRJ@Nyi$Ky8P
w8Xm1/ *iDuItJ>@+1T@a?ky%@lL*$lScCVPW%c#T#h8QH8$uYn@&8u?Eb5>#au+\k>hKiIp*Kae^SFD\69VCu@
=8@!NI T+Ke?41ykpw+GkIQ^wDbL^5bIhES=J4enSnJ9#GS/!TcWVX6$?QX5!RY11Vn@Dl>Jy?c=1$t:m/B/DGS
\dmc:i @T1bTJuptXlZ$!S9BIGl=8WTkFH:@DQm!MJpSkwLI&9!MTV9WZD@!XnFmBen!npTptHV&nPcTDDJhHdJ
5E/JhC ta<1ceh*/kc8KPEc\aqZLbScnI$lF$+^NlZBlZHlqbeSNSanu&&*YJk+Q4e+k1>!G>W@d!Sy+PQhyEHW
5>$%>! QcMSPMQ9TRB!LF?k4@JtK&Y9KH!aPkuTyIpu%WwId=nMmB+Pp>t8EwX8qJ^@8W:ApI<muHkmmGCTQIAp
N<9+1H 1PecdKhbKSlKZMKu@:?LFCj1b<P8@DtwwKSLp<u4bdiCS*uiXMdqqL>cMe/\tBHJSWKalit/q5EX4j6:
c5NwK# Ed5qW:n\1#GETI?\*Gi!hQKk6^iVblDhc!Tck\aej^XcGDdQ:C1:jY+Vy8b+Zp%e^euwwq:Jqi8XXe64
I$:Lee Vj+5qWih9kkTqDRqWyTTT+<pAEb?/1V9l\klkCuF?6PJFln/8XCm6%^?111S?KyE+Stq?NiG?G^p#Zwp
Wa?yAY tRVG^Apey=T9p6ihCCLMRydP9FPin@Cy=:9W9Mn/uKKtIh^mHA5:A!HCJ=V^W9E@WM&cjBna?y/Y4$=\
hw84F/ J@p\c5\&G<*tduM*Awe%S/<>u=T\u66W1icF*Qw5umWh#^CEMyQZ\F:1K%CLWQKMKep?J:y>!DA:Aeb<
W@XyW@ ckm*p%C1><ic&!lM/=qm#NDAWD&V/8DQcQCkTH<Dc9m%PNm^JP*I&?#=9X8tDq=$K8XKYE+=<%ineqSJ
EW&RZm ?b=9*NhFbJw*WA8PI\1c<aRenWu1Zqc@4+1u*PKpKAL\wQFY+cJFYCHW:lSEyYIB&=RW\1\\@tMID*H8
H>6KC% <ch?ybK6$+kLCu*u!NNVNt8RW6>5NGWY$dtIJ/H>RuyhG?jGyXNG5yK*aidGc8Cj&KQZFAK#NTcbpeV^
+j@l:d ^LhV/\=5TRyCZB=c96PLK!A&n\w:NyX<8RJ#Lqcee6GWL%<4P@mdk<e<BF5Lcy:4YlYpP4yi/GeD#&@+
=*@4AJ Z6H6/I<nH=6@TiW5E5:EYdE#edldXKeT8StdE<:!A^>la>SMmF6=@bk1>#!&=PicyZ>8^m%@hRc+YK/:
1bnn8V /1wSSttJcTdL$nQ$d!dPk4G?qPmG!VQMlp&+jDyHShVA=\6%DmDiSjWPpcwn@NA51*8CmNPKYcky+D>q
P9IknI YC6jkXn@e*1YkXAYCj==&Fp6FF!HKtaw^M1k@Pa%GHaF\8VD1dm%>#:=>@6TwCk/489:?M=1yXHB^$Sk
qJBE!h @BVMQ=!Y$+#NH<XTXT%>We!ZdCDqTD\$$nLHb>bJl+%l<*KpcQl9V%AjY@GkTCMjWFQHM%w6FltkM%<X
M&byC/ yYdFb4Z/QJVEqmAnBNwhJW>QBJqZ>!#yYV*nZnFd5nB9BJ=MuJMc=$<^B$:PJD^>yMVqC:!MV+6#W:YB
Am>9+K RH%cimjt?ZlTF@uLd5#V&bRR\e$:XNK!e\&KYwKT\9bhKG9qp$?1u%R>\VlIed:tM1<EM<SHV@J=I#@6
6EaT&e qX*EKAKZy$=wce!DajhT?m8hwD$J%#L#c6Wh$Z8Qt8hXK&*X!C1wPe:bnE4Lu!&:yJT4LBwXlJqL*nDN
-A<e5B 0002d1fcaf3001202b3 Page 273 of binaries1.zip
tR?$w# DNZAPt*c?I6pMT5bhB9P1/ebVkZcF/e^c:PpT1$npbi!c@^9Ehj&=q=Pp$<D8%?1eGM9C@XPJB5nC\SD
<=Vy*t eWWE<nTj+PyFW<pTB9APH=TaN?XZT/K9qjJF@FH>=L%QcqZkwk>^em&W1X!E*F%SwEybc\bY/5cj>Z\l
bcSKB? L/eLL\q/IL?:WNLM5ZQTG%Yl8XqdySCRHVh!#YNqqQ@YHJ$@u9AnCa9cIE<djL/4kAPHEii=ZDyqT$ST
eGZcQD TGiWPbAkP1%\t?kPpuQbTXI<4<Ykwa%9PyyHm>@/^jBE1\q+6$pq+@!5bnn\j?m:wbSQXnIk=S<Qy?S#
8ZDnub EJ6BqL<KPSjy5my$YXBeIK%V=q6FAbja<H:%p@edpwK&ep=V#1b<Aj>jui>Y#1:9!qFEj5Kdk^BP1DQV
&++%CW cYie+wuWm:T6\I&=pl1eW$E4y\yBTa8IQJ8cLCEyqZLeGb5<EXpjHdi!Dp/=Zm=D5e<!+5#uauqQ>byM
4cZhn5 upllptiy&EuL=ju6J9bNBTn&lbkVV6/KJi$mmDuNPD?HH>!qkVAhMI^4ZT\^u1mLDwyu4jAu4CjpAhSH
4pPpEW p6Y!IePaX8mB/=6!Ctwdq4<^V/qDpGW1N#/yjXJ>@@$1E^pWcRaTh$Ay*uSn$K/+kmbcuk\1RYP@%6nj
8h8&^R #?<H?$ED=?A/9:C6T/V:L%^yZ%GFq5yD%Jkl^Yw$VTMZcYKRbMEk8NhMCwRMMlEh6ZN?BW@NB<8KCuQ=
lTpEbL k5ybK\>n/XlJTT+\1^$w4IAtLGMwYPajp*=%eq<Z#$+#1m4#EZSdCbDN!papD?q<nM5nt^awVmX4Sh8n
KL:1M& cD>Wn5/MXb!JnjLF%ZpJB$1p5YWmhFR8<W9qm%V#W1WKu@hJ%Xj=uuhW4PIi=TV\@<L=+j&$Y\q16iC>
%MFDt> 9d*c@6=i+*S64:yj+%<C**PeZ^I<*LlTFLwSZh/ZnXPW5/m#KuRKpk+dF\Tydh%Bk+V&p:a=ttpj<bF8
wZ/VN* %S%jN1BLNnbNP#iy4CBEMtt:W*=J5TcXl?WR*N6tKl5y=&Qhbd$d*JT6ISy^n&L$GPeEw!uj<KYkP*1y
6/E<B4 BlyN5wqEmnR@DCn5*=@ChW#=+Cc8l+LXBF/w>Pq=\kk?L=Z=SRSpu%!19jh?VaFGhNeS\IGpBZbMJiZ\
kC#WVq GADtqX1%6khlX@j*1=D**H+Dw1:8N&49%jcmaP^$&FQu&y1P\uZwC5$Rtd51hCy+wnq5nI<aQ%!EuDWD
Fi8YwT T*tL4PYQh1=hRT#t%e9i1HCKyDcZ6nuCwXZ4?Vm6I9mhXPA81AHaInI\i$J!i#!B+8REVlYuYALZN1t@
AQ/j!h ==q\!Wl/J8b?I/FRb%?m4Hn9RLykIS?FakJDWZKdH@^i*qq%4Tlhc1=k>:\\=#J%HQ<IEIHeweYbMkFp
5h=^I@ WAaBLJiy&W=IWKuX1tc9<B+E9L@Z&K@8NT:W>l4+4LaZ+GN%4%wnuEDw5!TGN6HNh4kMG!m1L%m>^$Pp
!^@P#* :qcbwlZBS+*V%WddN4a<q?/+k51>jaRDMP*EWd:hAm*Bp/$DX+y=:YjS!k:h=aBhQ^*d%+cnKElGFp1d
SK%y\W t9T6#N15=wBQd1L!jA@bK&LBbXKH%LcHKJuPTa6eNm/6tF>S?@!$D5iinH+luiaJ4IiTSEuE*nMCEn4P
<M^cX% ^RnS9QANpJSS?S#QR+CECA/AAXma!1<:km9q5nyWdmCy!AqX^CD+nZ99%h+L>9d*eAS:?<Fiet@j:J*n
Jk8qRF WhV&c5FiRCMk+DmlbMa%W<8K$nB8pH9S!G9W+pH>I<*8>B5ZiDy6Y@cl+*#Cl&uuuwkh+I*HkFPkF+$K
+#YP=d b/mc6kSE%JG\\:ySVWMR%8i!p$K?yT!VKLu#$qGEyeJj%u/VL$lDBX$D1&+Ve1q%6\59yR4mk*nBktkm
qM+uHh ?e?NLY><NkGtyZyFaS:!LKwJ#DNa6FliqNDt@iy?qRLZ%BAAcFTtBiAhH<>V?u99:<ECADPRQ4==@>9X
DiN\&q AA?K@Zc\S#9a1>E<198BSPITPn4Eu1E:R<*uAb#TA^D<ec6G/*GD^4mce^8HluB@FLZuIZp=BQ5Sl%B+
^RHKD\ $waqPAkmQaieLM%Wa!nP6Vhq==JyniLkMc+wC+tbX5&p/=1Q#$wb?ZmmiXaTR&q!<=ANL!eqdPW@Z#lb
eEClHq eJT*H8Q=hC4Fkthpkd<@VjM+LnNFjE>Ayu?VYD+jc#@Cu@j*clYBI$SI5A<FKFjnI<*YXaBQRQd*IGqC
5PBq#b EBTiS4D*F9@aX@%9AIy\FFB@?IFc$LCS9:ydNwlq^ee&tI54/BGIEa#mp^u^!@m$JiFt&M+eW9=SP<$n
L<a!j9 CN9nhuwDBwAIk^cR61%9$64CFBLh\EDV\qp>ku!5@@qe1PCjPSF8!65LAyDX@XH^@CSAwq%Jdamcj@qE
bG^d6> E<cpRqM<GS?>pE+<=yak@^?HPMdQmqj$G%a4qSn:JVemwuW1F9uJ&19t@d@/*u/NBmEASXI#H:NLlTBC
:D:lM! #@8ktSR/>L>B<XQ:1<GXKy$BiW/DjAiw%JC9\\@Z>u*Jyh18iBlBXe/kWhZWHj6bbyZMX*8&%TmTI<Cy
j<j@bD NN8\ktHdHPdcl*nkIN4t!dl>>pt:BacJS*u%K49Hde*DFpEbPaZYFPk*p%IQt5<tJ!X@t=GKk*>^qSuB
\8a#kS @%?RA1py>AX?&N=9/iZ\bI^/:tTd4D&S4+YItXR1mRQ+S&Q^\S*^AhyJWHB<\bRbyiSlPVpQc=kSD+B@
w*?m<T KFdjJ@dkDIVqAJqM?R%%Bp\iYC8w$Wi@L*Lj4+b:5/D^RQ!>Biw>LcK^y#aAF4yjC&kDPJTGNBS$ADK#
?Xi5NZ DhZ?QyAtI&L9W8yCkVKCS<dNHEDRl/chc9HQ9Ikij#\=nNy\Bu:b1V6%Lka9uJa+!4b&bT$LGquXX^QI
?/Xq8T cwIkq^yMC9a9KP5TbT*N=EP6*M*^AEZhAXYnTeu5JYY*Ct<Jbp@/+&bwJQT+MhwQJRN#ub@Z=/iMJ+=Y
L>6P\d Ze$Nm9c:u*^CNIHE=?q\=$%=bl/+L^\W:<q!!XS!u:#*TjYVG1R<&p>B9Ga9I>4?c/4:wJ8%B1AtwAHI
6ecV6H J*kD?kVc\#F$C%XLMS5W<TtdIqDkH:py5atC>l4JeWS8FtJ96jE\$Q^p?#B5#?wB6Gj^:n9%TqR8iIXC
=qcW#T Ym8W8Wl!M=S=J:R69DNc=nDJW>4qPGqlQMu@B?J&@^V9&lPS%wk1tawDK1DPK!i#!>N*#bl&6QZZ>q*V
mAEYuE +$cm<=@H!d</AQ>M&ackJQeRLiF@LP@uwM49j%L:MEBWNi<1*qQn+SWaeWq\SZY99j@J*8&caH=%Q>4L
%4*eYS W4&J@uQ<WFMeC5#i?RD5l$eAneh*%11BF^QR4FBPP^kRNuImcS+BZWJji>py@yH:c1QhiuLaF9G4#A@\
9<$hXI !iElDRG/*!1Z/#mA<14SAIDKL:19!1:Cb!8J6qcj!ttCVA?AGewVGi=PeR#SQ%enTBbQ8F=KM$P9ui?@
P^/lAm %Ge//b:qZ!#cm@BDC9>@uKDVL+8XA9n*ScE/#kV*uSPjK=C<Z*%9:=p^4Xakb#QQ\LeC^V<9?HRSlB?R
=kw%Qn >B:Ab8@&*q/$j&y9m9u:%X<n4pD?IQ?kP6S@jPF>?S!+E?#ZtHiH$*&>ckNd<dYN^5RC<LYiGEDw=5RA
9tquwK ZCGn<=/X@4@Bi\9!Q&!JF+bNZPJZkD>E@44DppJ?$wMpBb^PjAapQcSB+J<yGZZS/4c^Xb!MDaAXmL+1
bkG1BI JT/>5GaR^hp\<d>b?k>mZP@q+4$6^=H9J@Mbp=?%FjiIB*Fu4Kd$tdn!a6FuipDWZ^=lPc!eXZMk:aFH
Rw\NEX *j8\da/NGdh@4iZ:L9?lyF:=wmQMCNTIRY$5iJwARS?\9$BQZGW8B%##cZD9+KD%>Gpn?DAkG$JwDHee
ld?<t8 DN!<1L<MjSq^8FuFH\JR^9b\cI<:LRIu+y4YBXH<qn$AHpV4wH%k&qH:Nb<B\Cy<d$HTP*t6C!X#ehMQ
Nyt8:8 <?:5>e4cF865cmL@TBtR85b8MWu8p:yW8kRk86R>aRRTjhEKeyy9n:5Q=u?qhXq!PlT@&kFPC&eNb@BD
y%ABD* &?@i6^E\HIGyjN8!!hkSXJRITiSd?+Si6ZFk\8M<A1AZa*aAPAcB<MWKLYK&Tqj^Ca\kWS*5F&kHNVL<
tEYXt% 9i1*=XB16@ij6R:MIZNmjB!dJ/&j$A@5p+a&I9i%&Ay$>C:?k\e#p5BADWFKhZ**heDRac9X*1DeIZ=B
PS<%>K yEM=nFcPu@8Rj>&W<=+aAWPAKNWZ/b?Ji#6abaj$I?ajemLHuEYjwknjEHqK^cEeRIkD+CEMiRky<eyc
@bEXye H5/KL<nuM#$bqpkWS?y<9&Kuq^!?TWq=JT&$<%>N?!i@FQX*JG!%Tem!=H6m!kP^L6Wk%ji4i$>QXG9N
4?*CSj y<i6mn&uEnu@J\Rl=ljMj6dcRM*5yjj^yYk@X/MLCF1Hy5NpyBpjH^/$AE\%kBDEjqF<4^6L*QyajHF\
/>%D\w alk6IaL*TH&?KhYVRDS@Ku=>HFL<CZnq!^6?idXCEuT%EGN\#1dh6I$>qKM+V<IylmDna?1DV@R#hMWD
KcNT:T hE4nT#PqT*#$<FjJ8ai&a%?KJBwDGQ^@LB>ua+@M9%L=e&tFRJ4j4LAuuMM@6^n$m&LcAbCd!q5^<^Hq
uTSYjD F$4y&k^DFSD$Hq#wE^cCnp=4&?G+lYka>B?$XNLLeNV9%SBqWj\niIJ>ajl:JD?NNQ+MIMcYPd+<tTSq
N9*j\X !^iQ+@nJ$\<JSWEk?8?b/8u+TCV$\ppwCb4SDp96nW#ANd#86jRWY9aeDmju$J1SA+IFuAeYPW=5BDyc
tCtMM/ pP%dL*CPKYbyPhE8M5GIp#dA:5Xm9*SYyF@TR?BnWDI5AG19Vp/c!hJ^PjWE?u?NZ\5M%H/4Ij5w<lV?
#%@VXw 9<#GnPt#a6KD9mih58dWXQ%Be8KWD/Ky/9+#a/6^WmMC\#PXe@c\clL9p8/I5q5QRGie4P/D<?\%G6Ji
lAGk/d EWS^e#TkB^n$c$iCRW@yll8iTB+K*ynptTF*\H@jQXXTu84G%T\+kK!h=Gtc%m5R<56G$PKuiZ/&+V9q
pbc*Z# ?1wyu%%XN=CP==wmG*8Np1@y&J=G\Et66?R%>w44XwQ+DIk@e^D>=A#/pyTkLa\qieh&nel/lK>Q#IS!
E#$&8J 9uItdS8?Yi$X1kW@*I^LLq<Wj^%<TJL$=ZLFiapP8ZEEZBFZZN%@GpuXLn4/=nHd\AD@npVANAKEA8@6
RAL/ql /REAn94:iV$QJy#QibJyK=WekIjS5#TeGyA8AHQ<Gl\C9ZHDqZSD%S=CR/Dw4JX+$e+&TJ=/hGIptj4i
SQ<VQb ?ni6DhNK\R?QYlq^CGjpQQ^!uYuS85h?$ul&YHQQ\?Sb>RZYB=PwytSYk%RwQDGyaa>lRGhRMyhTPIDw
/H?6MD $1!%mtFJ86hnWGJSRKBGjp:QV1N>ZmlM$wFJ!Z6IR$iBXjF@NdcqFy=FppH\DA8%Fat^aA+l+wFjX^el
a6Ec<E NqHd?@D\W&*NW\G&JEeuuy1XtNwuNdGH<h=++lLwHRJtSAP9>LyPMGpLwAe+b@LThk=E^\peS@Ek1AaN
T6p6^C /^#pSHVPmRTWan?n5<>FP>AD@*\1ut%#ZLi%EddGG+q@a%1uDuAEwdYL%mYeWd8%kRBbe1SPaYwYKh4F
a9L/<l mYE@ES??H1Y!huBac\ND4YF%LVWhmq%E>pA!el\nGpcJ=^E1WhL1AH=ZB?j\!$JPj/9\wbtP>BdDHqmN
=c:aj= ?ehnG+J@Z9\4hi%@W@ynTbGNq5W$1m#B\P$?m?Kbcd/%kGQ&=I4Cth/#QwEQECQcSnZa&+M%nE8u6AXS
$95e#4 /%$PBP\%GhWiyZtww?P#V?mnJR/R>nnZAQR9VwaIdjPh#FQJnP&M=LG>5JYDS^DZeGBcChlEtq=m*DwF
LS%BFC yQIy>uwbQ5Hp=&J8!tS$J*qBJ:k%X#GbRImtZWu>PB$/QGEFw$6b\TVlTGIGdChEpAdGqS!u^6L*>WjT
-AZD^M 000dd60a5db001202b3 Page 274 of binaries1.zip
WtqZ1e NmP@na$uGTu=T49Cj$QTNJbSKNbR^8XCbSwQl$KEJPJcWtu9:S<?u#V:Hu%1@LJY\B#NjVIPWEHQ^kpk
:S^QiP &EDck//j%\TdX44$e=uh<@\Gc+aZkEF5KH^cDX^d>J1EZ<ch6*$+69qiZeGbiD5CV<B4dWT6cGMp5k=N
95!t+* K^t%^1%Z/S$<SMR5th/I#b<+E$/HYcNpdnLHb%KcK+D$JwuwF+\CB1Xb/*/Hq^I1ijnkthJE#<j=W#k*
jINkYK ti\Y>@EuuPlM=&YmM&T\uPPQyW5A*Q^V:jeeT#QeZ@ZLp!TR4Tnc#!\NkqAl?@*G5*npRk4cLSb$p/\%
dcmH5b nt8#+Kn9*>/4S4Ha>\aC@dYGNPShpMb9XZPyinpcWw&>bC5!S*pK9mXk<:YX>$Y:m$MH<TeuS/uu4iK:
>w?:1w JTl/cwNmV^#kHS>VB!$+bLKlDW1<#mnM<l+INt5n+JHtHqJ&SauJ=iNJt$Le%u*T<R=KGhH8L\p8?C\C
Z#+<cw <=qpIuleHAuSX94Mu*H*mVn$pKWi\jiIiAYb@%>tJ:Sjm:QM<PRt8l=K$n@C%\1m/j8%D\<NuG^Y=h*&
X4uuI? ViYCquy=IP>d#kNJl@9u1#G?:DP14Rkt#Nq<e4!NRHB=$w>#^k5Pw!hH^\h\6>S#*i:^6y*%LE=WZdiI
8bQDI5 !MT5G?MMB\^X&RiWj=8Kjly\A=t#:FW8$<<YqQIL5ym+b!>M!lVihMAyq+/t/b=8LP@5JR5wQT9!WWqH
mL%JqR VpeV5R6$!=@=Q!>p$+W$F^=\Z\\:$GlHiW%lWP:bPN:/89n4p&K=Lbi+Mety^GE8BQ9?ZtQ@tddKTL@u
a:^mIV <bH9<5BK#mVF4@u:je*m>\VX>%*6KE%4!HVcVw:dQ+\w>wB=HHdmHDc1ZTt&ZLZEWtiSdR?4>9nd\ZE*
Y4MjuD 6l%CDLA<&lmK&we6$#1*Rct#:w9HXc&%GGt>H$t8<%Yq>:tZ6y=aSdj<5NBV5R>LM$w49!T4pW@lXkuu
JdFkM/ J@KiMny9hV*@cTGB+=9S/md#&Mq+:G#M68nd6kQq!?Jb1e1Yy\pi<lqVQ1ieWhlMa?@D>4FEX$wI&:+Y
C91&Qw FI6R>4**GAL5KeYH8y>Vl6>A5BZEw/kMWGi6^CP:/1AuTVQNLZjqc?@G?8&1qP&WC=Y<FE@P^nyi<kL1
5lGIkR 6Gn=tG!GP4:S<y%/ubTkjD*TBq9J+E\u=PbV!eqTCF6WNHFKJ&F4muFNh%lKZm4><qK/bFEqPbt:p+BX
y>wp?I Y6JIin:VQmE:dyMdJ6P1+q^Jwl*W@%#SZM5yTRha<ZjeGMR46uZllN+LwIPm6%=MB*YBMBXymyL94P&>
k4>FS9 X>PYpbnL:%iHDG4yHSX?*dGwhE@WYCW8TVLlm4HjnDGwGQeZ&@+:dcN!+u:lma1:@kcpHt$pY@CpCYk/
ubdEWT jCmQacNM9knS4#KMER:N?ZlKucP1!bMTq%%WpbcmFMi%enW5ycuYu%=KW6^nG#!biNL^DFt=>pVp&Nj=
yt9*Me biE$qJ^C6/68bFlQPV5ZJiq=R6F9CTl>YV!qhXm4=5V*EdS<TdYedTMR=%MVy*H+cE6VJX9>&H?=6@ji
Z6Jd/n Zl>5Jhw@M\H$9acCS:Ip<a=5a8qbca?$*/?1?dHRji&qbXlFHe@R=9kIZQMX/$n6&mKLKD+BBTT^!a>E
:wLh$e <9HG8DZnI%ym/>Vb%Z^e9yJ$YXdVNlh5^Ty9^*l!cc*?cdR$bibRd\P&<4tFeXMKdcW9:t&qaNNl@pXl
C11teH SpThqkWS$ptenW/M5iyIb+KL\t!c5<N6KbZ98miA*H$=YtXblDt^@Yh&8%S$NAMk4:k\nqhh>qc!G4J*
KT>lA! R6LKG@N:?+G4H5?+j/R%d?y#^1dC#lT6D%RB+\X>Y*HE:mdTj>J@>1DN/<GGn<eA&l!&wydbTJal&LV9
mtDJVq qFj=ct%!Q8:/!!8I=8DNDH8u1Myt&6M^/Wea^L15idGTZV6q+RQMV!LM5jSWyRY6l+W#iT&I=jN^LmAT
EG5ti^ Z1niM1*hPt#@p\d14+5bn@I$aCVbPDe=4KR%Ljp><L**>1C!V!P:#kn9MlSGqT:Ll?4iQnkKtCBXi5/K
\<^yZM Ga^RYLhk>R5*Ie^nSKT&jS/SVZchKipGuHlA!>kFV/H5!Zp%H1?*yZQX=k&@Fa\&EpFIMVMZMMau=%5?
MIY5ku E\C4eJHi%d\X8QaMe+>MNlq95GPDNt%hSDThT?$w@aa8@^tS\#4FMIaNKRdPbG%<Pmj=4kK%Pe$6V8py
k>bLlS jGVnMhaWE\9Tan\tP+ql1q5Eta+1j!h8Nb8!qJmnTKwLKNJwjSyHRJV:S5Y4?b=8YRlPqpHm^*A@6djj
eMDTkq WMkaT\LhHXa#ptLy<1>K@&SQlP+Le8*!Fe4:/?JqP*iwLh&m>ILqQ4FcqN8$=wJY5BF5+ACc4ha*Y9TW
\pqh/M G@/1lQuq58@aKyT&5%/ebF!p+mF9PW&+DHWeh>L*Ec1cQ%hKk5<RaawPuP#BGcji#Gu&Wdc=VXX<$5E<
&miDVu T1a%@BHNHqL8DTW@L+wbZ:X<WEukZbI6wPW%Ch!4i<B4e@T1mq1$&<wb/EH9?PWp+dnjMPIAE%ZPFJn1
A=H$jJ GW<TJ#c^KBDN!yFNu^lJqtnZGjZZCAh#jqF<$\:WY+\81XbD4WZPjnN1bjG^6SG$Y5ptqQ5XKnjWi:XT
*&l:tb ZuZm/JKd<FlmKtbVeZe&*>JeCba5=F>cyKJRLi4>=^JWGlCSChhtj?6yGTG$1p5hX%EV4mQb\JG!E%/T
XXl8wI X+\$*tH@JcV<V*PVGeB?Wd1d@w+V6<F4?6a!d\p#!VqI/8/SCV/Q>>G%ZN?9!hmB/%eCah%@Yd&DSy@V
jRdn=R MX:XcI@iT$$E46c^wi!!I!J&jnK<TBZ@4Lmp/\!hiJ^M#5D#SPadQ!K5+PG*1N<d4iB%@a6pWmyp*p/e
1GRi4J Ymjwu4QqySP><duR:4wLXVc>q^uJu\kFLIWu!u5CGmHJ6n4c>Em&Q%L$8jTpYb^bMwG89CKKcQd9VuwH
F<?LKm E^\ph/HRR?Emd=dnBCLyZ!MtI*Fb/du^E%Y<i=Gjbh&cD9GFWD:Xd%hTkKcckqnndXMtHnTwT4MA%Z@k
=EY=Dw uy958dJmq8&NmhL#+68VZ6=+%K^IGVhX8TFbwAe@+Yhn<JG^Q?>A!uY*:DtVXJZ1>w!KN&JlYTL<MB?h
+M&I@h >JQbiQykSNZ?$>lQSmhpdQLjmYiY:Dw<chdRVH%/59JW8MnMqI1R\ci+5iV*I9qd4@kd4m>>14aXd@Lu
I55/dd BLpb\4#QM6!#V?*CEG=EP&+b9^D+h1RtCI^pc$?j%P*GHm6/6R<qB&m1M>1cNJChJHQ5FIk#XV$LK9H!
c!Fpj: Gp4*n+4#nq&^N%u%WVL?K<CVDj>HQnEpIGSD1j%YK^9IS:>8!tea!Q8^WlP!V>8qZ*bkNwI!D9<T*^9b
/+uH?q SMtjTy$$XC<=GSBVqyQIt6R=dV8Yl?=6T>tkNay4E^bDbL/G8$t!$?XdCe:T5jePMYRKj++19#dSc>9+
5A/Juw &JD!Rn^a?CpkM9AD+<>=98eDQl4<uk/EQhPRD6W\HyK%Qd@ciNESme=y>K/nwwaddEy@JpVp8:aL%>GN
HM6QmN TI=Zy@n<DZ^au\1&GdTT4Wc$ehEHJ!LPAcZnFKB$+iu!XR5Vwhl+T6mHy9=/Mh@4W+9@SHu$CcCI%Ah1
ECe8+l ?Qt6iC^ePQq$mR#41:J?qPamPDG\e9Z5?w99ChQV%6KJ@6bPJAA=u\Fw*9im/Pne<*nDEBVJC:#Ay*CV
HC@a9q ReQ59:H*EnlL>!p#Wp<d$6\%cH\PCZ6^c$Wa%^E54hDw<A96T?ncq169/Xh^ApHhF=mwR*M*ktCh$1dG
cwa6aK d4\Gij9RZ4>MV?mL=tyuKH6<P:L6#++yW<J&nhEpyb&e5Pp@qH!&5eYDab#&pL$9w?S<>1W>!DtbnAb&
6YDVW1 DKjkwQaR<hBpy>Hj#p/ZXuL$Bd!jW^\l1MaIpH^=W8PW/KP^FD:Zew=NkZm?CbI?<Hke=Qb9:*>wp$%b
BS1YPK FjHi5/<dmYcmabyybyV/BGY&=SKFNj>pl=Wp4@S=QKm48\8?/<Vdhl^bCPSSeZ*9S@kV5t$FC5n\i^ew
L$#ADQ &A$Kh=XXNLj8!LBFcyA5^C+PeQpm6qmd\&QduAD9H@/1c+5tA?Fu+::HYKyl/yRMQEtDkERq%q$PEL*C
uu>ZNL 5j%DGe#4Fd@6&E!F#abc6K&=MZPG64=9>tb4?#iVK$jHpa!5qDm+TS#kA#4dCIIQk>9:mE\KJ\DZ:Ki4
VW:>pV ?$*IMt\Pt/qG5<q&<!S*a:Myq&I6^u5ebepJ#j?FyF&m!hA\K*njXLB%wc!i1C^$6^uELK:qN%>6ETDY
StC\B8 EYhZ/5#iXXc%S5=Wp9TubPP8hNLmBKAltat:eSWb5@EkRA!:kk/5^=\A*pmGQ&u@ckb&S&!wQcH5S=&%
GqwZCd /d^wK81$/P=:kk%>:5!wbMY=qcict&S?+=5%Mnc&>XiZp9&n=#1J^dYVqDREDDIl!HDdjJmthF@5b>l*
?mFiFB #mH\S4<=EN$hW5CiXul%Lc^qaX\FF1@$tQn%4:V=I!1iA&H#/6VbnVyeGe\j?PQQ%EGYk/C$EWC$G9cX
/?JwTd K/8XXTjijJ9IDyK#EunpwX+bCSiA8AWc4+aDRIM8Fjha5MC/5eFJKEmN8M<+1b5ce:1QLmZL9G%cd1K%
NGRG>L lq4:Z&iui%i8iyII%YqRDjEA4yQGe=eJCbaLc+%pe1qNqnBQpa:dDLQ+E1G<jlTMQ$\$\9*mTcLA%Pm>
@Y:YF4 L=6>^aK\<cykRhYtwPQWQeZ/qcc6hJNF*MqZ6BnF>SWqP4w$XLei?tqm4ku!\5y<w8*Fl5?@?QWKm+kW
epD$a> d%wnP^PQhqtwqTaGp=>lRD!bLyLjE1e@S+1/B=jkBm#tV6cPnZPbqP+*Vt6?6bCT@JMhGM8K@NQ=KXHI
DTK$aD 1y?A+9:%!JK$k5NbVk/peYI</WNqwa<AaYWLi?@JFMyi>Rb?=G/59y\/l1VJ<DecSI4k>6QdH\4mhkX=
*$JAbN >@cc#h%iM:*d*N&NhkjNJMYhpkl9t9KZNQ=Z6l5kJi6^J1dLSd?G5/R8FBmaG>XumEedAjWZj><IppE4
T>$w/= >M>/4F<BG@^XVXu$p:q+<\5kkb14w6Yk?WXeQIH8HkwBG/utmkHNcPa+=K!SVJXKKN=L#uR6$w:W&JMq
>KheH/ Xhy@pLHP<by9/+DCDd\+w#^J6$GC:#Ft1#YY<JQ:dcn5Bh&LD%*^Y8JK!CwD<#RX5D=+>mY64VWPS:8J
&*@nPX =kD9+>$$F=RMSb1Ncq@1jDaY@nwiD=l5XV:B>YY8Y^l9pWwLd%p@K!E#RaDaAIituJiqE4w\?A+94>8a
^N?a\W tdJunV1SCnX:\N%P$<&Rej>4V%Z%tN/MCK8y+!ki58X&!VR^wT<D9DLW$ntS:nGc\bTwGCKPKPK@Na=X
y=h/t> h!#MIPEPAc/te4%YmX5BPejGL6XG:V4#4$9SbNbX!98pthBWQ&k%#NQb&%wN:P@QMAY$@@TL*iF854pd
n\9lp6 ep^YPy4WdVG91RndnYj*+*+6dj!h45Q+YlS%BlFa*jQD8kEdAcJD\IqGJmD:M9+*ud4$8p1\pBIV6YQL
Rdk#WZ PpiTJyXQYKG?FQ4&XFGbeSm1ww+Lp=Xmpt!jmbjHTh?+SGH5p#K^69a5pMDp9^<Z5$jm44:4qT8\jehZ
#$1:NK ZjW1XZ=YX4Sqqy*XyN995J1XDKG^:$lE^5liRqAKFY@QGp?jVt6<NpYMQ=yj:Ic:KXl@&M\CdKXh58>t
C?ay5H ++yTh:LCnmY&L?N>Aq@1/*cNKPnaV*9BBn#YLApC9Ne4AV@mnY+YXq<Sw<@%p1j6ZK\pZGL%%PCkL+GI
RqCjMV Wm%S#&jMV!bLc9q>\XGtB:LCK6Jh/cwybyP!VCwdy?DT:H!bui#ZElRSBZY%LYNR#M6eQKec+j<#HQC8
*Ybk^? tewFZ^kBhJRw!kpcn^t&bQ=GY*iEHdiNFHDPNwttV=<>i%1NC*m=tw/tBji?&B%RTTMw/dk1TVFbcmaF
-AnDGE 00061096437001202b3 Page 275 of binaries1.zip
^EaySq P1h:euV$F>PYSMpBE#cltK6%/PWeTb%Hn4Z8B&q<D5$<#SB&qac$1p5^5@GND4cw>9ZJNS\WwwSai=Qi
c4/k#% whF$kq+HcYZuSJlMhZZyc=meabNMV8y\=A=hT<twpQ>JT5:HhYZb5$QX+<J6le:AqcF+@FNn:#$b^1=X
EKFZEa 4?iFyCZZdZ*wcGQAmD^kBdJyu4*!XHSYB##&kRnElTn<Wt&e+p8A>8i%9KQdLaV@@iqW@ZC\V5XA<^K4
bcE?pG BnJLkcCyNTeDGQVIL+CJqm5?hM@Lt>RbT<NJdjkmR<k4%4wL$<Xh<4npq11q/9GqVQWTQy?:NNq=Y*TG
8??dHw 5u4*5l$BTi1Tdn!/jM@^<b%e@l*8:J+m:qRD@<>^M%baqJa1F!nye&NGCG>i+=nMPc8CePdMDAdZyY^c
iCP:<B YGud@1DYS1eFd&1iuYw?%jq*CXCn9R^DW%l!D<I#+uAp%4eXHNt@hZId+X>M=?C?^nHDec>C*cJ/\nN?
@D@GLn JwDbkm5qAny6cB%<6w6I>Dy^4B@Q656AZYi1e^FZ>kFi+R+/XL#wW4b/ma>L%SiZe9#A6?wI=CkqHSA=
1=id5a hZH!Q$WR/ujqy*+HPN8%n?^*LQZKLiZ!?ZeKX?P6QWpt$ypbXK%<S>dq+Bq!&am9c8uXZB%#^&hXcmYu
VHMia5 lD^PTuJAPVh5K#X16<KwqdnZd$ZQ#p?lWibcwJ*B+eTiI%HIYc*j&LZiZ^X!Nnqj$D&i65@tBZM/hd/Q
FeF/Ny @hM\bZBeBE\RckNc!9DZqPe1ZLlVZyX<uF=k\X+%yw+pyj%XnGBPXH!qFDjXYi*EA@4b9#TuAqdBlyeT
+:y=p8 %inT4Q*THDS+w4dD+yYCk<hXcPa:?TYwcDcZk*l#EHBP^Q^Ynq?FnNqq\t>%Jy%^Ry@?$W!<WC4yi6\@
*<JwHp YGbql*1d4etCpZIhcq\%i=hl!SCj=IVE*ycc14q^K@HBwGZ8#V=V=DV:ibuk^X>1V#?H:l1S5>+SIXYE
&4di:K SE#+:QnjtC%?6lTTy6S61<$L8HZ\T/y\elXwpGnA1+5Pn@\#mJn1VFhX1MIW6:dI^p8MbN4@>E8#6p=a
#=bp\= 9KBD*MZTT/lkJlL?W8VN>#RPwQSKXd:D%jTEK:ekIJ!tam?\G9RhQHJL1TX>6\<iS::kFHTbq>PjKQc@
?ejk4> HFP6kRWit\SaKGBTXZVbq@bA/HtXnw1DRLZk8ubZnFM#N>1!&/thFYqH4aNlK:y*nw5cFG9qA+hGQ>@6
^\bX$X C%LRT?Y%ka$I&FPauRlcW1byDhq:E$#4M9pD4Aml+DtQ?Riwh>$I<pK>V<8CW4k1kC<$jIAuq6e46dRR
%<INZ# 1Z!ZQeTTZ+L>Z^SlqTd:P/&+L%$!%VFpHF=/\/4=SN*nQ@T>TI8ahC+/<nNQW:BZC\WK?b*ep5tNq:/S
Q9:R<E Y#4=EHP+iqZ$9Zk%pn45hD$Bn8FjVDb9IN/cEc<HRn5nIIQAc/HMQki*\4W9\G4<+b$a+e:JYa#c5\ie
A=t@Ih +#qwn%19@PVi9ciew8aGB$/4e&w^?FCQItwptWGe$dBQ:<:w/9dH@Mpd!*AW$+QAedu%iuqAnR<mpm@R
!y%jYE Bk>?5EkIb&T\!uP+Lt8C=+Rp/V$9MyQCY$VW5K<PiXGFqnhiPkFZ^F8Xe=lSmc9Tu#=^Aul<R/^nknnA
*aa>ND TEe5AD<c4mF@ByJi!5h!Z<1byhQ=yZh!:?DLb@p6n4Hik\Sh@KYa\RNhcjI>l\dAm4i8*mjE%%\8VHNI
Jb95E? m:*ci>S4I4^4%%9PAWnZ\aGjeI#K6A5eJV^Rm#AH==:ySCQ?q@j&yThwL!D+nHEG+?1auaYcH8@Hq+pM
b6\ZMi a*PIG@%MTqeeCRkNJ5jSL^de?9j4$H=a:T4P\%QwD**n#>i=I:XPN\W5ipjLEM\a!p$Zwd*myZS!%d>I
j5Pie< eLw8#/:D19I$MmJ*e&qejjXqp:DwyGjG81%wXbp<18lKj8>1pYh!Fe=A+GhJjAI@Z=JD\tjZ**G8PnmW
QcSB:H kuE!SVYt4F5<aSj@6$!<%I?:9u^ywPCue<^XXtw?a:$/&&k#=Hk%5#edeG!Ka#Y9!#L>DbyG8&*cMth?
&y>k<8 !HM=dPFw#6@dq\Fj@G<e1tc1jV@/R8!D/*^D9V^w51C5n*MyVPdSYY/b$+auTcZwlRl&Fje4Hw<ENPj:
uuCFin ?AkV\eGA<RC5E5^Ik%/L1dDSw?\9^RWIuI@J#cbm*J1JA*b^<%iLIl8>cW<u!4J^hVc5Jm/NaDIZak>h
YRA@mX uSyL>XJaVX/1n16yX!1McWKYeW:#cQmYL>JQt*hi+au\cJc8+=Q4?4lcHDun+1^V6PiTeTdp<q?phXu*
/AXXP@ >%^/mnKM^hETM^:$GuY+E=lSdj<>L8%y%Kyipb5LPLW@#w*#<\Y9jh!YDVA!@C###!WA%<Hl$$a<mm&6
5ba611 GQnd=/BF>B=MI5?K8hnLk+dcF1<lL^MHjhuKuhNimNuJe6i5j/$8:Y>C+C8lu=YWM8^q:J>qCKtt+6R4
imGS?1 +G^!FSTNdmTkbVmmV6DTI=AV+IkG8&+1XSjAWK&/@iw=K?&VD%NN<$8Dcl:jlP@qt*G9+H<tZIpVkt$+
kNj&9q X<>C%thX+9yt@\mh<%eX&P!*c*X!TQu@M/qD#WtK4m/d?/Yh9GJ14?F4hjEbXXpL^6%J94TM!bc?1@qM
QW=dLh wiAd^Jhej$TnMCL@%tF$eHkAma8:aFlFq%EXi^lD?Mq1I&LjpbB:i=Nk*A/Wp65C8>J@bWqP&6:/%+i*
kQ*Ey4 4hi9m9l^CC=wKc>5w@T%YQ+6#48L++AY=XLV\CtZm^i:tq?>YPCMw^j5MB%V\X9puyE&pX1%1t?jhGAT
6X+%cb RKSLEh+H%e\u@G1p/JVn@?Hk4Vl\#pH/^c9Z4%+@Ij*S>cV##5lJq^&u4IdC+:JhDcL:9=?Tb@G&+$Hl
+%/!:\ Hjb58:c@\6hWmW:Y:eX>eVXQ>5mXNHuIq%S\bQ8LPVJHV+/mJ?N&C5kWHe+@qSRJl*<DP+d*lin?YJnV
%ywcPb 4F$YQb!8:b6SNJIN<ucLI+A?TmZ#tn51tnlNN8i8ZmMwqRqJpb?6$Fh\%aM9Mc$@^&C@V8y/R?J>ZYVK
\=qL#a Bn1>AP!<BViqtlAJnKA!qNXd$G/*W$&@D:tdcpy>kd\Q1wu*l<CiYiul1XRHdlwuXw/eSHHw9AK=P?<+
a+AHBj %?Whn:@n*PCn/^Rl?awV*!e#yWjTwVG9%:GRyq49:JucN:nG&1i@45uIcLBZ1\XPRb^A!pllAeK++ul6
PY5J$Y 9T1kjSRBib=\+\KB=?BDBG$BF&*RPi<FNRKP+TyCt@c#X<$MbTTbGn?aLBNpdC/NJnwBuSuG%a8WY:>t
k+D/d: /tip/Xa+NZ!AC>?ehQ&m1D?4X9DPVLHp6Qp=4<t1@HVVwJHluqNZLeGHH41XpZ8?+4tNm6j\Gw&k+RY!
bl/QCt <YC@Z$%<<mZpQhK4Re@mu\I9<By8+H4WiPNC:PYlp:kcPXeyePj//9ZXG*lA/19&WajP8#^b^=q*ZNW&
EnXDkR 8d!KWaKS4h%ZjAZ<TpZ4mC:9GPWqPRV<mwK&LK9!bJA9NibRkX#b^/T#+:jqS49nNGi?wmeZkD/HV^Ck
8wklp8 Bi@XSP%4@Atj:\=F@k#PbuY%9E^yJtS@5MD>!Ba^&BcSa\w/1S&dTc*TV=a<Z/!Z9<@c/@jyAaD$iK+X
cG?ILZ WmakD:j:TW&YLAu5:kaPemdiyJER?=tb*8PZ8M4NdHIK^B\ueq@%KX$eA4mkX<Yj%aB@NQadPI9*B&IR
=1*Tap i/cc\?E$?AlK6181$5D=8S+iFjwC>&5u8i1MXnM<kl9D%a9e9AXwkSG+el4&4kFq1b9MKX+n&NT=K\VY
TN4I&q +QPN<?lmBi!FkheNyBY5=lXn=E@4l5W4iDp\k:dt!R^*kB%^B>5VE%D*ycYZ!F<:IQKM4hih$Zc/AW%A
1A4wKt >4ERcalupm?bNA#tdIIl1#jdpSQF*P&5+^N?/p:>?&!*+\:e9Fj*?StCl*u^^#\GX+nEhV9q^6QXc$/5
Z4e>?k Pb#EwMkb8/hAM6Ra1P&t\d^e&Mnjl4m4IuR>BqkFGN$iZ5\?QNq?+^ZYX&EliGMQl5@DAGcdGQX^HtaX
/FhTc1 $eH1nL91+YG<^G4w9Xd*Xu*Q\h@hXdETHw?&caqj?Nh!qhmdJWEt6q$^N<RWJqk1<?kX*aP%q^WD&Y6W
ak/#KV +NlpC/D8+M4dK%d#d19h%tY?=nnJ:t9#=P!BGkl*n#H+pQwEVTT4SWw/ldENhVMCi^!L$%pKNl4!?5bS
u1#jta uwWctVVS&&B/5I<L>c9Z1EnZYI@EE&<RS<8Su<J4iKMP^QLIW@EqtQ^TTqQj6t5lPtpky!YCKDkTm5E/
^4QJ1N e9BD8h\b9C*^Ed$:Dta@FJH9e^<Zh^u6\W=P5dNqD%@<#Y\HHDkSJjLJ:E*=Q1>19B^QblZ94uHkyHIJ
q\a8tC Cc\V8Yky>i:T8&by@P/qJb/J=/?!P+tJC@G?>8=jAFhcLn+MYNDMPWBkLucB:4$licTcG#Sa+6RGM6u:
1\KhcY \EeRN<iK%eCV/l%^b>%Y%LcZk<F%H$jt/C^>B<!MY&pCdpdp5cnSlG+K:t6/u$FKPlJq/$/Kh>:Fm?tn
+H<C!= tLKPy4enZQLIqYk1eNc!wJ5eFVdmM8I8iyY/JCB^XHk>1:t5*4CR!8MHD&NLPYPDPyyK&d*i@jNE?p#n
LTC8^Z >qPcRNR+S^ncq#jtIHEab#4DSLKVTHRGmi!:DS>&AjZ$<n:6a4Z849y@u9lt=%&QW5bnFRCq?k<5%BEW
t61>Lp m9t@H^T@J#!w#l1MK=8AQeASQmuLdhSX&cNH\G^+$%XE:FyL&==8ME!9%a++\u6<FB/Qn<+?iXdXMCCR
wn/a&< @9jw!>$SNH<58DTiNMcMhI?y@DV^AX@Eq$@M&48Q4E5Nm=j1%/=B96jkGMwT=AeR=K1K8iKjwSuW+h#\
h$Zn*M nQHlyq!d14$p<hW%b/ad8=uLETA/:ZkDTI>9@CQC?+6E/6&uEQly!qhEVX&9EwC/aTLNd#Rh$$pqPy$\
EmnL+! pi*iyM\>u$1@Cnlc4c\t?y*bd1jV^YQRyZXe:N:\1P!WJcCF#pQ4CPKkd+8Yqn!@^l$@&laytq$NZK:P
FFtyCD H@8ucyKQ+/Qt<%JWm#:WubB4niFunb6y6N8Euw!>M8VM$VQPiuC=AMPJi*wAylG/cd$6Q6:pt=4Nc1a#
q/+$dy t1!!5>hRJXp5%5$KR#YtT@Z!NZZL9$YBi=S?ZS=W>dF@&wEjpNwwNQ%//mWN#<d!n?S1I^JG6:J?b@HV
Wjid\a Dk6LmhVNy$<nRjw$=A:RH*?a!EdW:kHEQTMT^RHNhn$4<DtZE9Z<V4i:&Q%<MhE#m?N896Q6*jSF*MbL
S>k9<^ c=Tlm!8w/c%BMT&d*P9jAlYm!u8XBnShEAa@nT%@XHRP1:6SnCb$mX46py8mCN!NS4Mh!T1HC+L*^?ci
Qd&B+N dut4!1K4/C5Ii!#<j$dLK$NEZpL/DaFDB+jGL>&#a=RnMiM#Vtq#$uet?Ycuj9Z:=Y6q=@9ZPMM84iG4
hN5F^1 19%+Nc6u<iSqN*>FF5j*+e9%SkP=#aD6E6N4/QV618di/A$dh:yjR@hHiA<l*$!@?c\B>W>@KJmj\wew
+AABJF $i$p8uMhQRL1NbR/8>RMiFiGV!iL>+:y#m:!JBc:k<Xpd*GA+*m6N>^kkXiPTVap#L8CPnmK@&=ajK$p
9@^@*L $F?&KalAPFCDadBuK6<IhA/Q8l5+<jTW*RMaAk<KilLXc1QbNL9y/Dk/mw/L^Qmkytpl@I<%uERwct>5
HR4IkY FH!mPXh/TPZmX9Zl$iTPG/ptuBGHLL:V*pGmG@JZw&9u!6<uDpHNFZ@wcR&hd@%NuI6EbQJ^hWuC+ppy
X<&BFa nHuAm@ElPDa^ITHb?y*8u$C15?<&:#YiNy/PG1tunh<$mX+uVZtQP@NhFd#<pWl$9Ybk9DMK/&wBm+9h
aR#Ak6 @tK&6:kwd+Qitj+h4?YJJVCW1GnBlKL@@YH^dh=*wH&nEw>=lJ8Kd\QmKqMJkhlB\=p5Qac5eup:A5lC
-ApQlK 0003889f320001202b3 Page 276 of binaries1.zip
Geww@G HlNcGX:8%k^*M^H+n8=>j@K$G6R$qwAljA*^n&%MEE>/nk1yhEy*&iX5%/@WC&bPGIL/YF$*cF*5nFP?
mZy+R5 BlM\%%:=@6W!I^pb8kLV+hPG+#wDE\D<EH#KFejL/cChM6G\<QLFGDqHHT#Iw=i<5@nHEQ*y\hNt<&pD
*WRlJm d*^pVYLaTWHcEXS@61QTH*dHuSuIj4$XnID*u51>&%uM>Bb:9eXlL>@9>XhGG=A:#CJb<YL5+S*c@*Ba
5A^<Mi @J+M$4CqqB?696h<6iKkJu*b51I#tQa+y=qAy4:Q&KC8pYn&h$$$Py=:Jn/BG/*&t!yuhc>5bl9y>5!^
BAkwCe FDPVTS*J#>kdBQPVQdKEI*Y$WiE6K^:+&c5RNN@lcqqRa4^XJ<RA:N%9%IX:qXucL%h8VBR<4h^$LAa$
qEtMeY +\mLMW/Y!8$%:*V@mCIiQY5CZbyQt<?c@RREuIB+M/LTe>*P>GEk=*QW<a&t*+RCd/^V$w6h5=nwDlhu
e!W5?+ IG\<?4*ZIP%le+PSkGCMJJXelSh9YQ\NKDZ=q%5ZFR>p?DFYeX=#5KhI#&nL\k89DE9Ee&yJn8!qCT<9
kDy5dZ h8jBGw@N<V&4%6XcEL*anaVR^FVi6S+Xly/Ta/P6+Ae>q:QpKBaWP1q>@4c4T&R<8ncYBtujXA1TWlMt
aT#/Eh Xnp6ZZBqba!4:<bDm*bVu8XEdGw<a:PdIHWi*ipjh5cJW=%:>!n1b8Qb#WRm/y!iakj?/Gd5y+CXZ18^
8TY/NK \WjVC#w^mNCV>u9#pG/9*^?Mt1*%nRb^yBLy6Duq?>8n+tJJMeTmINM+aPN^P4uBSB1#tFBQN<bdTTQQ
htGpl$ /MYjEBe95PWWR9PL*VMSN?Rhmndn<bVTHR6dpd:i$aTwVPVcmc<lpV*TikGl%DiVDGBNei^E%^D>Z*9q
<$4F=: KlhDM8HlTi6ttX45?KeqdK%L+F4&qk^*\<eNuQE/XL9VN%q\?PQ!+C5P%K\=ZD#8uEy$lkiWeQNiM\FC
!hDXd= tPmGud\XL@=Ihn6lN!WM<E^uecZX*Gm5N@*%F9>XRbw1QP\q?:&wj?dP:pbLIq4+!Ry#QtqBDH@IGaYG
DX@eDI Z>F\8%L#+wTB1uAkG*%J!/5B+t46I6Pk%Q1#9B8#qibu8?Nw#4\+im4RHDScuX$n?n6L@T*b&e/R&$Nq
KYB*E% :DpFKZjq<ynJLS9e@Ze/unJIY9CYaj^m9ZjN<FaA*6^T#k5Lh/m=y>tWykRSAYuYVBQ>p\Wak?I=DV@F
mcqh:X D:1iD:DwhQ?aP69yH^#ec>/:%^S8euwKEQ^nSmZh/SaZX?/EpHDLk/b&XIW#+kV:9W!@B!$&@dpl9/My
8iJC%d ^LATClYAkQ@B1JkSS&n11XZtNu+NaE^E66NJHnjdeXM!q@p/<jbQhaSklN\wHCqCjA4yJk?jldXp+/AL
Q&u$y9 %W*aDA!>bGn9GhT6KTtSdQLEXQMw*uh5>ILbTDF@SKbAq*i%dAG=LK*@FY:D#XKN&XJ>m4A5dXXR=S6&
NEw5*? Q&!<V#Miy:twlRk+Sd^<1G<uF8R9BIHj/DYn=pH#AFDS/d:<+B6$?c98teGheHi*%YyCml86SQiF>Zu>
Xc/b?e *4mjkA:uB!Q<1>h1iPAqPR9E*NEAuKl+kT@y8ky=6l8+VPJw%A<q=pWSJA\NwZp^C$+cAQGIcSX6dCFK
q<iZGc @Pq8%nRD5w6YD<w:uwC9:Gi%+W^Bdn>M&d8Fp%c<JX%4!i<:ASiEI<KF>1+:wiBF<8w%>1XGhmpVb#db
kTEi%L NHTc:Y6%V$yP*qLH&H5/Z>+eP=L&AHc?kB9N?q:4#tKuP!CH/\>NPDi/M?nFpl%%*8mPDk/d$TEm!4<5
\?YZP+ >JZBiIBA5n5@HP*8S8$YXB99VRJId#HX/>?J\6Th\W4aT$HDS@*Vh/J%mq@TKRS1thZ:MCw8qiS1K>>j
%BK^84 bjaWRVMD=%wk&ZkmN95McyRyuGFS9Jj5tBHVBpI:5R9<+>%5hMDq+WE$&B%QIuu1h#TNJMeM&@Qc9AdS
Z#pphY @%IkR=MwWi\TYh>#/6i8DpVM4Ajd@h5W6mtj1pkHI>VbF<CRbRtSXDMm8?\D^$y1<cyRC:^kc9RJdPmF
ML:<D8 =tl<uNwh>98hm@K%aZRR@ay&l>*M!y%SGI%*$?GhqeXS>#\XQPJm=%cdkq/u4H8L<:*FqX%EFpetG1+R
@/#EVL T@1>aZ@8Dm&l6S=+nawZY4V?F>B$/LMuSR/btR/<G4ZcE@jIumhyQ&A9nme$X@C/K/84nPL%8JTN<jy\
G#LNAJ h/dX1LXcEeKZ*bttDDpb*uHEDhPyFF9ay+L?#Lb9V1::!$<kPpM&W%hZtL>/Vc@WRVSR#uAP!\%^B9N%
liC:>/ TW1ShZlLGtGFCFSp/\VuI?D>1yyBL*88=#Ych$:K8:5+PtJF#ER4L\Q$<QA\P8ktJy^8VkF:EEdHCBYP
pEA/qZ Lyq\$IPmR<En\^/My5mhn*aCMiSyR9lK1I&lWV<mq9jyLm>A?p$/#McE>SHM@$XajLjE6tLdS!iH\E%!
YFRW=i /n^>?56><8%AKJ?m8TA!yBVb^TbWLKWp#*buIn/ZA^MqwQA^6$=Lw+YK8YADWqaG=Sk?ui^ItG:JkqHa
+4<:>4 QSP4I^^CBLaZX5:I:Yk!#CZ#pZNMZLqMwbhZ4e:4Ay*wBLn$dWpjX8K!JpK>j\p*:l^SWa?P?>&VZ%+e
m<VX&n tMQwpM4QR\B6/e+PR#tB5VFH4+jD+b$\mw/i6Qq6:ckX6ZbdIS+J8FFw@?JKiN\&Ee/59$n6H@SQD*jd
EY5MDl QIB%HwC\qR4%@\:$**MS%Im@J%Z^1#/p:c59BeAnwGemHCS^19>bZh$YRaA=:T8C:Qh&b/Qhh9Mk&p$h
EXPbIK :E45#8$aI^F=YnJjE=H*T:q+d=c&%E@Eu>NlL!tj#KkjDTH<5+=PLFQ:PW>LC@ALbipqaFqySba>TVuQ
ny::#% <5BJi<kbDhblBH:Dc\$BG6?^kH*H1At59HRim\NIhJkR=T>&+pMbRQntmVE=9PP\kP:t/Q\VX9Mn9tSI
a%N915 9<%*&M@mK^Ly4I#MeZS$HD$jhIYSA?=VK$CFX4cy4NGLCiN@d?S/bpp*\\km@$$b@AM6b+VQMyyeBWF9
NWAVYI Y?PTPw9*G9ZaMwbeh//a@:@9J1L<dqP^y?RPNdnJ$jXN=D<1ubuIQ>+KGy$a$yZ5GZ?&W\>F@VPpMh#@
$i*W4J L+y9L#VmnXNitdpkpHSmpFSwYcta!4>L>SiYcN^V5Q^kw9:Wc6N>+\/p^B&*9cpZ=S9W*/\pPlG?chCh
BDE%1a /a?MTQ@N/NAaj9@SE\QWn\+n@Ludk1iNtulQDBiLRmF:@SGZ=$dQn\bhR:w?/4?!$k@ypSE%Wjl5duew
iR1CHJ @Z<<Ky/ZumGEuLdKZY9AAWV?N^H45#%G5J@%IFhiEjXjRh4Cj%/*eSH?@>*8nE4iTEHCIALmwq6Ldc#w
+8A$?Z M*bj*LmW8CR#@m?=+uSY<yaFPq8t#YEBWVuN!^XHBH@bTJaC=FD=/+#q@S5Tu:GG&y>etc*+D>Zu<BMD
KQ!>lV qMAL:!\PSiTII?<eH+e!GGA%uAwPbi+t89T^@Hy/AE\!Jupabb=E\JnIqAk%Wb6wk#<QtlE<dn91hKQF
wDyYE* <!y#?N#SMXi!HpWJ/H#@:Ey@bjiRT%ccVQ&/u8W*!%H^HjIdkI+uZa%ReE@$uREw@>bkXSTR5!hZ@5kF
4\8#WL Fa4=p9Hk>hWY:9@6!*TT6?VMTZ8!=VM+ANu1%LHDP=PqjNp+9^IBbi1Re6%et/qj+!d<1DLuqe6&RJe*
Dj#k5D B!d<C!!@C*Y@wWw8MGP9+NaXV#NK%w&dbZa>kLMNShl<Q!%AE!He6PYF:PIRZ+C@:ZVV9V85d+%NI9Fy
ukQpAi I45Ia6q8HmdM+5W+JRn&R8WHqk</m+IpF%b&&&*4T/WM=%aeDuCHmP%@W?TyDXeR5NShjW?nI6+p%1Ba
m^HJ%: ES6J@*I8d\5TcS6+btXpYPTc&XW%VldheIIkTRbBpa/Fecu1L!?NTuw*5PTqnKCGKX\14nLNi9Wc*1+=
Ke\DS4 4I/\l%?8RkBFSMRy4b%=Iin$unhEj%MS>Deb**@dK=:qcIQ4PA\8G?5655X<b*AWSd85@ck1=#4h@y$u
>Q6t6I =1nVihFN>?<Aw5*+KIH@jwG\jkZ5JGwDppNt6p&9CFpPnmQV9kP=>\nJaZ<YPkymAqnP4aPGA^nwG5iJ
#YknhF =H>1yEhepIE#beyLQPbF=BNw/V+nIH$$mlacSAm=CVQpnKKm5t11LEi#95=G:I4Jaiuu<SaKt+:KmVkS
P@diin 1lVihNnNhR%@MHhhb/6jljuT5pjebX!bktDQpA&!5Y9%*YVPLt+/ieXWS@wK!+=G/\$B+k/JSWLX6Nih
\+1in4 Yhp%V*a:Z*j#K*S&VA^*j6+>*:5D1I%cJtGNuA>k/tLHJMchDQWV:AK&Q1JY6ywBnX%mGT4qd+b\VX+\
W=WW5J <L@q5e\JTRXcA/^SH:Z!Rt=SFC9QVcmbMA9J\hLM@^$m<=^%cE+yFK#M^1kcRZm$eR4R&4jed//yDqQ+
\J!>de 6w=iZbP>p&XQb^ya!/WZp$p:AQ>y>wi!CPp6ybKY^b*5MV$9DaV5Sm!:a8BRTHm5aihL<DKIK1RG=qim
GwMqRK a+46/Al?c&bS55\9F5@iPRKndkMV4WYQi8NF$$%Be4*?1!9>@k4<WqMDE+$DZae\?S>4FP$SHP9%wb?w
^4tMwG SeEFG4PF!EBXD/#AKKRS>!c/F^bu&c\66y^wy1%QmwMNjE6c56SY?bKZTu<l+y8%PXYTm\!dF=%l@hL1
ICL@wq >?84P14A?*:LbW$5T%18Zmq!cI!LLFc#im$h>G/!J<#I4eR#&865ZPNqG5H8eQGwP>8@e*S<6L9+6Rn6
y1>YN= &LAc%#uVZZ#yMXk<Q+IBS\m&a!#p&/mZI/YX1G=EC:/#T$69bhdbk^YB&FL#4tlkERm4a1w=wQW&TK&w
Eu<k/> kY+k5&q<MHFjtAaYTSc1IqtjAmSwnCjcJ<4ulFLKbeW9hnFl9G\6h8X!^:lNcPB:4uwd9d4^L@Ae&W#A
MGYKE= ZLGM4FDq$8#*mC1b%b!pmRiV/h89AIAqMqi/d>>jd>&l&Ac::PTm&Q1SdKI@PkdTYaFS&</M#BQ+EKCi
*MHtL= &84ZbD?D@t9WM:HR5MueMY8\W68DyK+d!Yq=*E1RkKKFRdHlX+TDBk&LeKbYnFNyE9&1uk&LE#?epElL
ww?Y<N dtRX#=K!hJ@Y?ThV!%Set+W:ki#<cGNWH@5q>W@M/<wIjFqc^N#KYcE*1:+Dt:RD>NMS+Hk=!A#NpynN
MI&hS= nVpN?q%K+p?/YZASP6*i5F8$Be=iJAKDww%b>F!Mc^P>^dpS+1l&BImDt4*wbaY9>!t*W!9D*ikR*LK%
q?:Jm? D95$+P!b5p9%15DAT4KlA+V>DRY*BlpM:hMNVtlZI#C!&<LTE85beqylEuCnb?B1P+tX8B5+te%NSCeL
E!SZR6 RIimW+Y$XqKyW+PN!R\WLdQ8c!\Kw=!#:bqqV/dqB=NNL^VZiVyX^!&1YnZ<JkT&cMG18@kLPqGYbGj:
=iKqXV ZjpCHAQ?Ndp+awMCbNhJhXXtjP<8uq$bHTEEMweJt^1Z%C%N5#<D^\ykM?%=EpAYi^1?6QIS&9:YYPjk
FmFN@R /X%yuTF$dq=NM/Aa>=t^w6LqQd&1VBAyFSPXMFa:Fh%a4qX\I8dTTe&yh%TQ1QTHWL\wu5iZu=GLP+L@
KLaBT6 #YAn\%$eHCd#I4@A\1<pXN#/uK6y4M41pk/F#$*94YMhL1ZBDKh^Nmk?clIFbd191lljikM/!R/6dH<^
65:Ljl q8qy?X?G9FmI&ymtIpcL#M:P4aSH$MQDNkH9!>/+u=LMFc\**AZC$d?1MF%Q?pay!+nV&4:j/M6$J+\+
jpGy8/ GQ6nib@dy@cyl@XqkRcpIF=Cc@FbVhE!dEp&G<tGFu6N<bSmwYZSSne6\EZ<<RVtS6dn!JcYjAcp5J*e
PINqIk cI<&$l^G:@6=mNIq$JZ>NBNWyyI68?@p>KcRtiq>/X<ZL<1ISeWBm/Z>68:$8w5uNC@NV$Gp<j:t+M/8
-A/Gbw 0000aed5337001202b3 Page 277 of binaries1.zip
<BbkL/ =D@M$dAZC>e?cNZtPNEdm%=?6Zm/N>k%S&\=J6GDc5=1XW!J!lBSPMhTKM4%IQK!#H8ZKM9@klGcb+Le
4B1*^G bKl#FH!dc/Pk9XP%FL+Z1%R!&bXEXDRN\S5I\ejNSCMnjMY!9c\mI6%6XQy/Mt4atWKnpl@qLKuX>6Gw
NXF4F> uRmH4jEGP@iHjpacb$>Z+Dipp@phuX8bP>pj<1L+Lh*#E>hpINDhaT>&Dw5W&iII#IQmLXAFNcpHA9%1
FwjLp8 8LJ+W1Vh#qC^<5:5KMVn#5yZm+W:$SFk$n#yLIIAAm6:cVZ&e/PR\ZkdLAa\TbQ&AMnGAa*?aC#ZpleF
mcb?Y1 Kd&S@\*bb6SRR@iFSAe%m=T?^et+n1W+/Xma6EKhcXkPcNVJ=BRyw%I*HtL:R6e+VWK>eYyGE$ySIi&$
L\aD=B #jG\uiRi?I#5A+*<4EjelK:tQetqk8JeN@FK=qlS9!m?KVQm4yRT<S1k1CyVES4iw<Y45jAGh$c:yIFQ
F!uJ=l KNpu$iAqW4Qa:dAtjZS<QILChlbQRV$%8jEES6@6#amt>p\@kikpi$jKCKah6wwIV>clmDB<>5FTY@>i
a?IDY/ YE#HZn9$W^B1CLPjFejh&DhB5XILKna+iSqDaj1T5wC8@49hFKmN>l<\SawZ4lm1WwZXD&RwMDibB?^K
aLZBYM $GiF!^En&?\<$*4PBcTSnFh\&:+H%S&ZW^D18JK98>I99e1B*MuEeWKKeaQm4FNmW\j+aVyad>+^m/i5
#q&qIj dCHaZu<\Gtd9DP?M\6*ItKMmSeY*w#6>qYt+YGA:S!eTPyRpF1V/CX5SL\#CI&n6p?mw5>nyyj1D+jDP
bCcJF# iDRPM@ll9A*:Fcd8!L&q++aP18I\L**LeF/WYawAd6dDK\pK%F^y%9RdabC4mui9%q=C%ql^\#lH$Y#?
ZQ$+/q H>bJWd:SFF9FnX65:X+/W:WnVZca4ChP*:J^cW!Ry54MS98=NQVDDBGXyWI8D5=66ElyEWmjE4e9$&:9
9BBPb9 FG#SSqeqy&Rd\LtT#eY=E5S+AhTamBp8#pLY@XEWlTaSSTa/PkMJH^w?EBIPKGQ%@PN81yNw+n5MQuaG
m#pDQ$ ed46V5TL*a@cELKk\54ISEq<p^qHe\B5Dn+hSHBiyqZ$4Q<TB%cpH9<i%dHapLt>pIQGI/n^/<w@d\hX
SGKYkh N94XclYNETh1uBcTulE%buQN@:F4a=^^HPEI+t1Aa$4>T<WVa<d/cjhE>m%&b@b/=y#Zj6/Y8+4MWewR
Dq\Z\Y &<LYnBT+X8e1Fmee*+GIV<^$k4LDB#mtKKNn4ma89FaIu^a8bt&d^1+\1TP8i56#EECFHB:t#GlF%VpT
9iXKq/ inZd:TRT\<nMtqGZXaCScQMbmH5keME$hMiY!qjCEb:u=Wkt#InDWPuYiyM5*&hCA<?pKEwh!Lw@$NdG
VdtNZ< $D?6lLXBRQay<:qck?u?wPyLepmAYLPeIXPe$4WHhj/bFqZeNHj#lCyucX1M<cLQ=SwReXVNVYanB=im
ZNKddE !a$B5A>1hH\L<:\DRdj6@p9DGeXD$?bch*aWX8cE*FbaLX<6SyMy\/>p@hi<LbC4NwQM*8qFw5&ImH1l
w^G^Tt pu%#qCMRW<kH+iF5hBkht6*lWF1TW6ITcSJJywkT?H>uSb99AL%uPdMERB/TP4CjJnVHb=>VpjtHpT5e
KIb*Da we&b>Sb?L<Jc!TadJ!*AZAhhD\d?ILkkaREk?pNIFWleIZ>\be+wu<lyX<HLnQaQSL4J1n6&SVY%=+8:
dyc1+@ lCV#bwDGM!4WTAd8$w4Ih5**&YuDbe=i?V6#hRQc>t@NWbLh^YtPIpd6GVc*%!5ZGM*L&EVbZ!%M+/1$
PSV\SR mqlZXhHbCDSu@Cdkw4Pa:wXHRIm#qFAEQV\+lE\QI$k*jYDCAjGpA=!AWFPh4knYMEM5D+n^KHwC4DBQ
cZuHbn +Ch:md:y#bK1SS!<TLenu9*4WN+&C?hcF@ep9$pFykdj$DF?BA:4=EYlZ%AqqqWeJukhu>Y<G5hV*Jyu
9GCA6^ id<\*u^cm%Y^G9@B!/ED:Z>G<aIE4e@ND^\tVile/e8ALM8ayF&Di\=QPS9H:XmDke%=e6RYW$!XW%Bd
M4$qKV uZhq\D>hHQPq:AYc%=!TP!tIW:4JQpTWk&!Q/PMRYlYm\+Qw<B=4+RkMW6Fw=dQFpYn4lb=6Gk*=:eBj
CC\4dj CBb5YXtb/iQ4*G\El^#J+G?VK69ccKyeKXch1!qKGLE/LKc=A\%T*bAN1cNkSqItjlSpG6DdTqSLByYZ
T/Xbhj hhjaGSy8=lR&$j#*I6bWqVh8nGTbY$1#^k#HBm4XF%PJepF/NMpMyHm@4&#5=9+w:1S@6dDc6u8jn*Y9
L=&RFF PW!c#1:?T5W1L=8ZmFlVaDDcapaHnnCZ!RHwd1NN/Sd:wSSdAd^6$hy&hHAK5t*iP#m+^:?QQq5eLM=b
b<E1TP \bKc:SJA&9CFy6%hnKC^Wi<MEAFK1^:9TV5K&/>LpYMmYBcZ<J86!1/1!pJBN$b?!1Pc9mwK/>9NupGq
/qw8kF WYpEd8DX9GJaTMqeSVIuKhApd^hkDtyQinjGd1Kp%^wDCpHVtCcIbKqC1ZeyYd*$FbeHAG/HwGlDZtyj
YljM@A KNlmqW:N<*Ln5*I=!&1:DcWXpjLcy8QnNkPL5*S6u4TpR:lPRbIG=L?@nLGY!11Jk#9>#8JCQ?Se<^Hu
4&ERM4 CqpZ8ujAl1VtQWmVu$B9h$ijL!=a+:emleKPhntPCBjYNkiGmT4kkPqjJe:mZ/m!5n=A&\w&%5EpBRp+
t&T5/= HmMKY%VmEA^B$FwN:5:#ha6iI*l1knN?wKp46uGAPJlc58Ky+5=K:twC8lPP6n>ynWp/W>SNYe$NT$NK
N9pARu h!nDuw$lS@!:eS^<^8aNdh>GPyJl^6hFmh@bkIV@4Tm9ZVeKYQDudcKLt<4aEXlWMZ<qVQm5LJnlXQME
\S4T6G Ed:hF\aL@!X6LyR4@4nZqBa:EZc$P*wlMG5WE/!ai+NSJHQu^l!P&<uDd6T:dLM#9j=\q#JtA\e9=&/F
k&AyY# BIaG1FuEBtnn#nC:\AIta4kjlyKIDtTQH9eyiH:R55#Ba>B^pTZVGtlh#dee#bcXtGVI^=FG5@qWyC!b
d$%^9y 4tVMHVk*N!ZCjew=pm&&ZHVXCBW1Bqwd$VXuBSJAp#y6d\8^j=l<h4%NJpFQplNyt:d9ZtD@GnP6dq*T
mX:l^R ?:+qcwqT9=mS&Y4n#Gu!wVYm#Q1L4/?E+8HlnF451#mAD9/p>c#=DP@tZld!9&h&\+GGF$t&hT*mp+YJ
RR%w\+ $MNhRnhpDmKGh!tRcQdBTBQGE%/:ndhh$8HZt%c=jitJkciXBWNK%*=@YM!+#aAdNte*Aml/$BwF=\pc
qWpk/? 6\MEHlC*MA4u=hIJ?X1cHcTc9V/\C#c+^pKWP!1\#J\TV$e?MSamMiDPASpw4@bQyHq?\$akhwSD%*Y#
TCC<i^ q>Si4HCnjiKiQeq#?ZN%V<awKuy@VhL%j^Fjk*^Yy>pbSa6&>!PSZ4n+ubXhccXwWiT1*BV*M?p=b:i8
y*9:GD wEtI!DBNGNH@:d8LeWe8MiXPGD$SYD?W9wD&+iKmqknajJRd:54$iT5KY&?55#M/J5h&LFlh5iD%Q^qS
p$IB>D *j&kKY5+8Wp!**k1unCkM#\qp$ek!yWGdJiXP6d<8KbQb/%!E*$@5BM5$QYE!F%!\J19pH#c/FIKcB%X
yb&pj& i>B#:pL1^&1i6cDTNet*:PXFKX%E4:9?d*CK1S*j++pVMPhcDQ\E6&WJVSu^+F@w<qbPVEm/%*nJ%5i5
Y+q?6L *JEqR&X@a&XZ6leh:B=A\at%#^BC/TAFyQ/M$MJ8uuA+1WYd^X?L1#B+k<nB4RZ<&@KDY6Fm*G!Z85ND
YikHY: PA$8J&%jY65!*tqRHSt#J18W*WC<d9AjDayycujpb:kL8WYSe^>4k#B8kpLF1%HZ+TnLF5hVpunWRw*5
bJ@4AI $NGSqtNbZVIn@RDF$et$G%EeMFJ>$alE%wTW\iV+9yN:cX?/ZliX!m&6p$E>u<w=j$\E==W1hXPbqRHa
N8Yl!8 m9PqwMqjE\ZTXR%W:6HE+$p*$G=dP8YEKD\D$nci6qVRKt\w9Dp+e\kp9#Py?!>?%?y*V=we/T>%i\6S
w%L4/5 KVywLXyawaK@ithZ96!TTpXV>X6tF+%:qp?yLL9@a^WjFLMI@kNQFD#V+AylE!Tk/tqIHC/$WQP>tk5P
&V*>@^ HdnVQkHdjJG*E%\R>=FhHCB6A6S^w#1i!lW58KSp$XjW+BK5TNCqh<p8YFemGTbBJqPZJ=e5Vk=l9V&F
F>ARPq FZ\5tZG:Jc4NIZV6TwcPR<pZdE/n5wy@cId>TbEc$45VNWW6Vi6:WG<IP/CCB%dJu\Ji+EQB@!D+*hG\
*Ek@pn y/j%djpBR&ulQawSlRI@EAEQi6yR6^n8!8I:elVw>:wjV+9KIwFKWVT<KM\WI9?9B<Z#ybc5c6c4AQAp
>Xwq!p IQat^L+iBc<%1PKXAEFm^hh5uiX6eaMZX&LG/iW@uC#w+a*#SJae9#5Zq#&G/pWy>YSDNq?hEL^N*YZ!
J^L1\w 8n$k#Wt/mN6\\%RCu^S^$FBYecS/^jLFw?QneSS\+aR!:4w$+9uP%>D:IZ8MbB^PPk5<d?QFdnucnc^a
TPCFC+ tp&<#lcdWQC+*Yl<&LBK@$#wC\WQ!ajl/M/h+jnPN$elSA=Mai1JIH=I1XP6aV4<y<:86@RHd#R*ylJZ
u=m+TG DLjMpQ9>BFN?j%CeeZ*KG?HMBqS:VnpLq^BV:PNc\Rhy1dq?%hN:5BP&1>Rt<Ay/Q=4pu9>pN=TFiw\Z
eH9%e& <V6?NeN$R8mtMiD<m&DMePJIB^I==1Y%>AL9Ipn1nqFhk1qZVe$6:aw4Jh+e9/dZ*LT$pCKDI%S=m4$H
/Fi+Dh 5Ze%iPS4=4m+^$*eG<NYAlnA&@H!EH*RcHLqR6l+LbCJcMmiTKMcj^DhP$SIa/Ip=B$qVQVpLAptImBc
QZS1=T !#*/kt=44n&=J4+6XKYqVqPw8G6Zq!kbD/Xw#iGZQwN#8V#AC#a&eQc6y=a5Iny9B4=LGA<A=$H^bLJC
WDVZ&e C*8n!jSYw@uH\Jc\IXQu\CCSNyW<H>PYJDjjWNwScE8T+iSR?6b=n=c5Z$=q8:Tkj4K\6E=9KZHpc@d?
=j@mpM wBbZA/@KXBHHmZ#Hh#<691:nla/:YyEJ#QWG>M^&N=9YK@\IwXy6=9aS4wKJGte?nF&t/QR>^DTH!TiH
GXa@+\ TRn+MGGGl:tD>p<PKNRD$:4eyE*<l^/5L>NLG8<<uw+uC$u\Z4ITN9d&#Q?K9Z$ZZTAHbS^HQdK<HFKZ
DYcC:6 DEnNF:WGQZVn&biy6=!V&*W5Ij?#mXyu8ERPiy&jyKh6#D/!EG+cQhF4TLy9A*jPeLHn1eide4nwImu*
QZQ!FM m$c<FEKYJK=LC4Z>QAFciJa5=hC8IPHPYVBD*@&=WJVRtTp:Z6qDdJEFHRbh&IC<L/qeQL^WV*bWXIP1
&Pq=c# %It1ZFFkGpX^up*1<:QwH4Mp=nA<QH$k!Tnm6Tce=@VH^Ke+\$9LY?Gw>jw$\cV6/KLRIt+Zkacn?9!:
u/dZSi 9iIXZ6t!aRQMX85b$IPd+pZw5uSB$6MN9/nDR4t+VZG1#/Vlj\=SS+Lb86h64BA!c!Epp1RV+TN1JkVi
e\#CdW I$5JI:ulVCe!M4J=>Zu!qHD^h//9\ppiQ*<XAE*MPQ/$HdALRLdW$FM/u^bQE=4ulbSA9u:p9dtlT4%8
>8!yJJ H*/VY+&+*5kN16#+WH%>Z:cEjKkPWtlkW=\p*uKTlnwEF#eHd@#p+F+L^QEuKqw8I&>!A:RX6tpXt88V
!VG9Bu LJ:^RPIWMVm>/=!^lWw6ZCb$^h1\PF>1mdTDDZlISn+N<JL#DZGZAimIZ<WDAPKJPGbVJ@y\Ahn8XLZ@
8\PL1X *P:%JZ/pic?Z$b5FtNI&J@F/DIGuhy6Y=D$m6mZly!cln>/?tPn$pnuh!CKnFttujZS$WhCctDI&G=KJ
C8+N%5 <nY1@:q&y8AZP:Nqb>X#@FZnP?9?8k@^d\lHR$\l:X^BA?FEXi+cE9Zt4XDey$NRcVbADP?ND#I+kH5H
-ASNIa 000cab05b3b001202b3 Page 278 of binaries1.zip
5ju^$6 !RP\^LutajNA+%L<6iXT>uk$mB?N!dq8NHY!TFYeTTuHMt@b%iJaX#ut6jd@4Fi<+K4k8bWe98PbLP!H
pPtWud :I6WeqF^m4+mTl/*nW:TKAZhm!GR<q\EQ=bPwAlc#1nH>tVa1GewYWBw84GCn!b^b^njDCy%Y%+FL=jP
YknZSc G&/%p5jIVmKt=EKW1^6S/Xlym6S1Y6ICKTVqW$qenS!&t1//^95tyND!PPLhRwVl1h+HHwDF\?81XY6S
$aFTE8 hY+QiM=XPYRy=tuYplTIQ>p<GB<pkVEH=b@e?<p>TJ@^KjMqjQn!S^Qk4i1@Ec^L8KME*K6A<5a6XSVQ
>D&Q9V Jb*8/9yW\jPtnpa=?CEdeuHKB9EqENwWdAnIiDWAqLyNd?w#J!AV&klI9Pb#&dM5/\Nu=EIqHIFWJ!%B
6h<YFd nBM6\>l@ny8b*cae\@kpc^uFF<@N/E$@\/SiGbGN4!?PiF6KwiC5qndcdW*MQn<&9HdT+Swt*@tFuMBj
hk/kHK 8!wdR<14n8h+ZQ+IC@AAReRFcGnk!ZAu>>@ACABCh19ZZqZ&FDY+$8JW<^t#AJL5PnmwNi<J=9!pBah/
=9Mn!> n:EW9VLicRNWh^:Elu:AL&CLnm<nL<#^!MImuMc=515L9+4^Zpme^I@%C1EAQkI@APhkY6>+S1nH!emB
J1\LVb IALqiy$G4&lR6J?$?#LSyWquq!L>BeR=tlVXJ\ZGGY$cDGQ=u$RjGpEM?HynB!Mpp:@E=ch/tR\*!6yd
n5<:Ve bbJ&G=nhpyAyiJL*T5q8p/^lkl\i+Jh!BGtP>IjPd:4?1m<1TR#!!J@FFCAj&kJ#iR%twZEChq?Su5CH
5nH\my V^9S$$JV&R%Qaj:i\W<PY9h\AD>lp8AbCI%yZaZPTkIS:=B<1?qyHIynpY$ADa6C1!:aPp:B8Iq!=M=^
V>*4Fy 1=F/AS#A@/A*nu<ZH4?q6pDlQ=Z:LPZ1EKmL\4<QSQLpX5TyC:B*A1iy>Dc4?\8lpP^K=IZI5wM+Lt!t
c1+iMB dBctQ\Wn6RNJ&W#VaNaZlIX=&aRu6>HwXYC<*QF$Ntt9WE@419ELmB4cp8q>46ZnDWc4u=L>e%>ZidSW
JwRyT# 9RFJLC*%q>:69:9SiueJn^Yak6>5*qlcZF#!iA\*q:4hyb95ndtJj$dkhL&@NPBhTVjjjdi@a8/qDqdi
!R%nAM 9hn9!SqIw1d*:qL@*Ze>uMXK*!^h/Z8Aj\?@++dZY*4*^pcDH>:h<Q4+p1+Y<c+9hbiYQLPW:q@*4phL
I#Wi>F PYdA4kwk*SpZi5YT*NeCj\ApP*EGDSPe45ui#eCFHjnP^AlpIDjTP#qec\YjmX4#9wLIViG4hAeTNBFD
<S<Vyp 6L&EGbtyI=mTuqH5CL=q8?yF+uGTRD@J/n1<uFEdkQZ!nllua=K6MejyX4*m@nLiCZAXt6cJ8yq56:8?
l&by+p EZX@@c%P6:Zi:d/FS*eJ844EBRDhDyntW4KdjT9d/eEk*8%$P?<&um%&8w6Q#dNC=!%<D?&k?>dFdBej
i/5c5i aRPM19C#P9k^m<*Ya5h$b>:1LDbcN$**G??8e^K:%Sy$*?w5NY>\@tPJ1VB91jPY/e=i9+F@Z9SN6=C>
\KYqc\ :wky$BD?4#w\P!\tG1a%*nlLRkTpI^5m>@SN/&^Ab%#VS?XZ\Gmpc*atLQ<LZuNA6=C4N8!PVddiJPK<
Ek9+=8 RY1cN<lIq$><I8F@$Bd54NKd$#95:ahp9MbeytMGMkM=Y*R&cBDtKC?L*A+&QN@=dHJdt9P*Ib%p=/*5
!XSCqn Y^AWQ*a:G!%IZ5dZd$B1TZ/&%G\6+W8RedL#d9Qb8@n&d1P=BMp>c@*E/?I<p+Qw+GCy?=*PY#?=%/K:
5JFwb/ cD\LiIV</j$Y9qP?1h<chyN9+i?t?>b/C+je>XyL@GFhPk4<Cu:@nRc54*PD9^b<&WpLNQ*L5X=F?X&H
aDbn^9 kBd\Ltui9tNypkT+HM8G5/>^NbXuCa^Pe<YLA%JPCbdBND8P^ImDGMuYq$l^KjhTNpFV\*RRHCuDY\V@
SA!AR1 *MWl/M^\YH\#9wJwek/!mu@!+EbqnwPh$WZuu1\=lF&MnqNHLi?4app4y6#9/NRlm/WXnwG%p1cdZ:t^
4pj$\$ $t4DLJd/y95dT$%K16qckbB+MI5>Y5#Nb#I%8Zm9B<6w@iSiD%>Lhlj96R+Y5+69hR=cQ@qJT^J5?Q4m
h$BP6\ !mJpjNDDn%qb^B?6hb#HCk?nM&lF*XT:Cb9=X9c6t/*YVS#CY>$iQ9Y/eu^h+XBedY=h6DwJ88u^^4ea
pEJej! GLREuukIiypyn!D\bXX=wACXV4*WQD\8bS^Z&wdGZMAn>@uw6tYhLhGGq9^JlAwuRbtS*QG\%JM4m!=w
RFM!uW uykqpip69Lq+q:Zi>HTKm<AtTYV6\jBjFQ@YbIZa%dLnRK+4G%V56ml<4>@iliwP&wCJZ49H4@X861I?
\##p:h Qk=cB\MIb8XkBh@RjY5I6X%CWADy>@F6#TjS+q8bd9dkJ!*#:M*t$$c4t<Z*LpG1l+9h6=dcK#mQ>knG
im$4iP lBM&*i<5lVC1wSkc+P@hX9P@\Ge4dI^6Nj6bYF#*BmIIh4cIHj#Qe4hk9=n$SQ:J%pdW8m^Y$G\JQNEK
hnAI>@ jBIpdkTDj:D>YtqhVYDHJVuZXiIKMNQ5^Fi\yHp%XTRV\\yPdBPma<pu=B^/ppd8^#pIJnMV^bhHLukI
Rdi:$i ewN>HmjAHYy/pjmJPb=^eY\u^5?&unMnhGS9:nc6F$Y>?:DA%jnuX:M/FjuYay9A$?$56h6S6:#a#ZaG
W#%=eT :YFT5KkH1ZcV4FpS%A?B<I5A4kFP/nC/mT<%<Y*D\<Ni>t?<%WHE#C%X4chNkVd=\d%P6k8V!C+h4ui!
NV*dI% uS9SAd*DDj!W>mHMbYpAj>J8<XjaeL1+!Q?#JaRbG5Qn?H?PC:G4?E/D<X6L4q5QY5?c>lb\<6aKjRXN
bw9ql1 Aw:dmTiF\F#WW$n*AB%&&LTZ5EZ&n1Fbi!54dYItdZ8R^lw@DKd<NRE5p#T#$iSRp5QE@jlR#9FRe9uJ
?mTydV XhXeM^:KLbcn\w#Vc4eeb&!*$iBa#u6HdYXQ>BbHy8*Iiw+Q+15jib&H5@wYHRaiw:bCjC>1!><:d/&$
W^qqR4 u:THZTL@Y*eIN?%DE!WBRIe*IG#%J4*DR%4PE%lD>>A5hj>cy*5RHbBHIh1kM=Cj@GTJeNb>1:jdJwIN
NV?^<R &8&R9/8VZYtHeBPDhj^q&Pc9CE*:AqMi?LX9DVu1/wFLCX4>K^FBu@h@6W+^yaF9i>cCG+j69E1wpwMl
w>EPmi qWJ$X@GKL&<&GNlhdT!DW<k9:LtM:FS>R1?k!?WtVW5ndc?luR\E1=Lc4D8ni+Cm?Cd^Gc+?9y:?iuLQ
e:*AeB i:LwlZZae54*HN$:DY>l\?ynPam&F$&8RNKJX?P<5p1J>JbYSnANtAMZjEee/#:#Xujh6N6*&tGj?DE$
Me89+1 *aX*w$N+q?#\!RD!jdJEp%w!V$maiwV=*eQiY#i!d/&<8\I4kjh8hiBWquw4aj8wq?*AG4KD>qH+Xkej
9I4AZt D66LMD:<lmh*eLBLkMc*?wiWjjjt1H<H?4TPb<ZI\@NZ\chwJj@L&I=E=%!=w&!D1JX+F4dwSI1I*T8!
Xup$TX tbFEC8jlGFttJGGF:4CLaqLLw^nlKAd\*YP>5aJdd1K+j=@nPZu4\H9mN+bT>yIiBp8lLK>XE8WW=1:N
T\Ian# ZT5::?AkC#*hHFHk6GhbblZL+#L9*HNpitjic$$KanTQ68>E^j>!alm$nK841/R88?*hh6RYG?q&n8DH
b1\^$b 5\QkX4h6:tS:N<mF\na>S^JMN4uaNwN5J*5WAwK!9Th*lDHBjn1DJ:*5Nik:QZ&#EeCQ\B$ht5MuV?CP
WeC\kG *uyZNQ>wlH??kXP@A?9KLl:Bwj^cpmR/t&!*8<1l8j@tD9B8uhWDV<IMHMu@c:aR4=Em^%&RR+F^MJ^9
&WDTB8 6MTVA:i1Fb9HJ4PcDy^Mq\SuHX8LnByh9h^W*Ek+YSwJ1LhXt6VLFepReIj@\XyJV/i5+48$^+W<u6$:
%V5n&1 1@NeQ&HKa!h%NX?I4Lq\mkBHa?w#*HT?!49AKtM@/Vu5S&$bdaMA$iK>wnTunL#T5QD61&ih//9$4p$e
F8AqyE $G/dVwARD=N=c:AP@Z&*9amRIE9LPL#VVWdhN>@1*np<FI6=$5ijQj:b:jZwE:yHT>*^Y?Q81iVwGa5/
cHT^h& AZ:A!1Fy@+$I%6Xbm5nF&nnWL9^K?^D@e&ja*5ZQbwML@hKVP\J9&ZZYm@F6DEHF4anF@D?MZWI%LGbh
%GW=Rt uwtaVPab+Y9a?pdk/$Ju8at6+ntVqFVKZkGqmi@IHVYTVSZ$TE<tZt:8nmdbyi!p!WydWRljtcdiDG^5
GhlJm> Q%6@mtJG*LeyeCEI%&6he<4#5KDX1/MCX\Ci<nd1PB*8%!::qa#$XiIE/$pj&yDh$B:Na*NW+QBXT!ac
pYwLM: m<QCZQ:1P#kd5Ky@k=lu>/?L/YR:+qaG$SKM=<+NiF?kQ%5yt*%aV:dZQI!iME\\V=:AI!\bG5/Vw!Pi
aw/#iN #1kHS</jAh5JGpEV64ZTPtAhGZdVi\JH%FtBY\GZAGCBMTVdV\CQ!iEVPBeTkCj4QRbAIj\?cHDuDpjV
ja:=H6 QehGl@@V&F:ltAmmXucnJad#dNV/blB:i?+X4#FJEnl^@!8ZTw!pAdbwVRdlS:Pny#LTHcMWL5qE*GB^
hPK!&Y Iq&wblQC**PuWXMNS!<1G6B&?lwckn9nYPb\LEXVuuQKBLhX^=G^4:tm%>#\/:JF$#5n&%iBhH:F=aT8
J\IMF# Kbc<6uW+?6binV*NPJ><J&?8J&@eNP6ut>9NhY+8DRq!iQVc1hcwch1=R:d*SM&\HS$tD1LDGWn:Cb#@
yGC6D4 wZtTQDVDJ>Fl:8BiT&4@AQ*<kR^>!H$W:cI$\S&$&cuC%8QDCF<:bM85ZyjDS5S%<K?W5LBVAe@Chhkh
4%t\@K !eDRVLhd8R&+qa$SZI6yJb/PYlhIlC5<D+TEL1J$P<5^*X\WFuW^EV%L>T5iS6XilIR9T@/9pE8h4P#*
!eJL4G 4atEnbRaTFS>AdI%Y>Td^WdFm+Xm9i^A@QAk#4^5A/X@1V8l:NE8FP4\DGVyFV>X=k$><&W8e/Mb$<?+
?*jj1Q Mq%!qJbdI+=Tdd<+Kpm:1HqujPM*X+e*:/#jYS@l5S:mIEI?hupM$PJtY?@kcuLyGS5W?bijTN5Ym$Y#
Tya&Kh ER+Eu\+P=!Q&l4b?wpXWY=YdqcyS?<C$b*ZI5eqC>1l%Tu@wwdbbSFKD>hh>4!FNe+yZyF4@a*!SwB!E
ZN$G:w j<CDaK*9Hu&KcZ%#k$/FAcF4h^c:9lP*di1tX9EubFdGViAwMnkKD+a^c&@bnK^q!HV8bD11h&qW:eWN
\4D$bm wWQ%:cGW?y%!5Y!8ne5JJ!1j^lqeBW=h=Ab$^>GlQdkK$#=5dbRL=c5ALD<I1wEZ?iPK<R6i/^n?R//t
tiG??> nw=VbkN&Ne1uiYiP8bEe*k!HM*jYiR#S?ypt/#\u/=69&W?qmR=^PV<<a=8w6IyG>6HM5WZ*tXlDa+pH
c\C8$k $aJX6*/qJM$mWuQn=Bj\S>l/VbeX4HP&RXcMX1S@V8#l@!=BZyh8++D*Q5N6yP?%/DW8AJwatNhE?q\+
5yTqhp yb&e*LSqm/WbZw9Nlte&kI+cibyDR&/#pYBE:u/R9mGYwLKhqHI6V4TWYFbKIDkQeS/cSCV#udX4MEQb
\X&Q4k #q<8\#C+n*EiJ8Kac^FPJ!!j4V5&D6<+MwnQ&?PNM<Aw^K??NHyXEP4C\b@jcGtw1LGJcVtkdGF?uM5!
Za+pM! lV8+eYNkd1RG?HPalyHeGc#@^5a/H/*%%5tKj?Nbw^p<p<I%8:/iVZ5ekiE#?ljV8MTcD<8!9H?Se%yM
?\BhSu %p9N%q@*G5b@A%J9?4ye$B+LWFGc9ylwn:^V:Iy^6M1EW>p!J//$V:m$Dn&Zi@*Y&D@H>d4&/k!*+6k6
!4aC$A J6\wbFe+<#bwQbi$l^MB<p8J\QB?J:qTWMML!bGNC%u8*pnbtIR$GIe=cI!5K^>wjGl*b!+=IFueqDuQ
-AcRl1 0002aa627c2001202b3 Page 279 of binaries1.zip
BadBu4 #Y4Z+D18#yiLFVwSl$99!4=aiNHdiAK9eIwYE<mNSD:*j4:KBWJey:B^>Kqq^cBhCBwb=KS#*<p6=cKq
BA??i> <?@&*?%#GQ*GkI@Bnb6+nL^4eTiLJ\M/p<j68AQ!=eh66l5<%d+Q8RaP=^N=^WC#/VL$L%&<pjicj5WY
Hh&@Xi QPV$PEm5P>iL45\aX6k6^ZmQ!?&nGLip!j1R?Aj5T6!LY5qu5Lb9<BIh&bkCS\I8:BWL6l$*#m!P=Kw+
pRenQy 6^m/e%WZ>5LD\XMe/PHIuTuTC5tDyT?J&bdcC<i?yYAa#^INJ&a#Ky=&eD##5u+R%qNWSDQqtZpiFu#<
Y!M=p$ Kche1W6/pXNeq=qjNEe6Z&@y>iN>Yp:Fq!tPa>/8en^*6EwNa/b5Khhd!5N<iDy+lDjMc1J81L$1P/+6
m9qtZX DMLGVMBmXJZZDITN\whTwJZ&BNNIBqDDPb/H4yHt\9RpY%$V9G4AN9nm!dl?/M*cA^q+GX=!Wkq=RbdD
pYWSVX H9iCb4j?8#C?>%%5JA^d!aPjDPB$Auy\&dhPZqY44N15Xp=a%akR^LS//DKn!?:Vcp!1*QkCMS1GLtky
^\KP?W &Apn/e1:FFY#iqFSXSuXJi%pm8@%y9>IZ5Mj5@P!DP?cKSe1ktVPNXu>W*A1P9%TdB@>Xi%FMEjm+9qa
baAYnR qbXAAtT6a@%ZmijZNXPebF=<eZFy5d8WpXJWhD%!W6DNpb8T*jPyY4WYXnP%>@A\%VP<qdc/y\$KiE95
\Dc59L +TuVHCyhN!XLPE:4hY@c9PR/wj!apBeH!Y*mi5i>%Q&$BXkcJNmCeC9PqmaK@iLbpmhtELdAJF4*Y9iG
dtdt8t 4heDVp8\*FGSc$=<J^<QGeB=/!WQakYqaZ^XI!&kMLEAZR/Y%iYQGuFa^>HZ&R:F6DC&k9/JkANmuwi+
pKW5LI 4>F^qAYq+Ej\^jR%=>w<@Q8<dBH!>S\&b6y!y:\=9m=#aDyT\<&K1=\editN<*1#Vdm?JIMn!dhT9F><
dZ\l&N Ea@lWtJ^6DS?J*G>:!R4KpG+9$>=CNXcFjT9FqYL9MDXZ5p1C^TKR&iYw$/PY?bu&8@#yb9Zc<Y+S!dT
T&upY6 C$@beeBdXiLhqGek58cl6A*#B8iDQ9!$^+Y@<H\%Z^NV&4cw4NY&8M5tJQ#!#*uB5E1a&m1Kume?bi*p
w\ZpV4 dYS^S4wN$6TcpW1+a>jj#i4hw^!H</Dme/C6AnbZ\X&l>1>C=HQ18Lq#pEK85EP&WM!\wAFAma=#WHlj
w$5dCE dktQKw65C1:IqLVe/WRy6%iTWnVQy4wyZ6H<HX/SuX9MLyq86ASti>ZILZnF/VZ^E6daPe8S*QebXj?G
Ck!9L* @yP</XX=nu!ahPnJNehF?*Y=Se\=<T?<V%I1QW/e4$+pj%<%6%<<S@d8<lydPRY?Wiil/>S*u$%t9QVN
u<T?cp mc@TtBBYNpiY&G4#Rt?E%/Mw^iF%9yCPm$yeJ6PV/PG4Ce#AE\>Ka%%e\j6i1hBq$KL=iRb^baX>YYEN
Kmdn\T uuVK%YE:*yhYbE?JJ+X8Cnw/@tdLZ59mTW6qPYkjK%M/=1S#?$a&VJ/*lX8kjm1*^C9kwTSSdy!*lj8M
+^:9q^ mM?WEt=a!5c*il4Gud^aH8>n$bmBdajL&*6T<VdT:X#<@^*yeyh:DJ%S1iD1Hb+<J=$hp8b*=kum6HtY
dqM5F? @<4R\:T!IiMY!H+E6QG%5/<m<TpA==%euH1!%\^p>jmqZbX!%>JFyImn6/a/ph+TJlcSuY:@/NAcPnb<
V%>5Yn :5V^t%Cwe/8KMGZGD<+%+k8M+J#DkG=PqkDQq*X68Kp\Y<6NC5/GMWiZXh4t8NZT\Yu&!LNNQy=L^TG>
!ej@Et cabh8TR/i*LYIjhY>1$p*uJLJn?&lewTL@QK8N\M?4ZekX+NJRE\m!>Xwj>SKe5u#Kj>JVT/n*eby8QE
jMGb<n JiX6@<a?bXH$*$4a9FCHA&/q^wF&FZPR:YDaPl>a#SLIpbZ@:&lLRV1?9WYTFw/I%q+nQlJJ/+X\SXq!
Hu!8Vm tw&Z@=#A>wFh6FK>%D&y>j*TYd5h*!8V+AB$\uK?KM5K?bia==!6qQWiDRJ+yVL9Z^e&/n?Q=%GQ#Zne
TqPm\& bw#ARX<^npy4&yCGA!HAt>T4J$9qTS$YqAHc8DTe=EY#j/dWiEbF?$!//$@Fc@^6T%C&EDhMjy<\QquG
+#KpKD j%/?!&&KZFY$15kXMW\1e8A!?HKptTkZq?Q\G#THYqVBS8/b?Ky9FY*eB/d6<ipa%d6cc?lZb>SRtaa+
4#p>iV bhWaPGiyThpT^&9#yy#nJ@\KKE!^^A=ki*GNQMFZKnKbJ=l8=**N5hp\qjP8dkCAcDi5LnM1Q4@dn!h&
D65SnJ <1q<ZQFt%*jK=MWNnXTwCAXLu\y!>KSyia?1wVGlHW1ntGY8WL14FXu:^Xi5+IYJRKTHAk+Hai6<W<tk
E>=5W8 FG/p&hP:dl6kMlad&GQ6&m6#T:wFthN*^5&LyAWewukb6VVtyiJNeu%h6CIQ!$Y?qti9=W/:VeeDPyT9
nRR!F> liYL<*TWjGQEXL+&j:XM:<td:PepS?8JkN$M<^$k81>1pp%G>w/Qu:TI%VJKk@@l&*/#HS%4L!9W6**D
pkJiqZ hnXN=D8=&!hiMTkTDtWS/M>q=\:AtWd@qYSA+nuLpa^+1+<Smjh$my=R@GEmZ1JKpW8t<W##WAbThb!M
mP4P6i Au>Ne<*!y<ek1Hbn/kZ%X1N9PTy^T+hEtTq:^%:*LueD&5&R1ZlypIcu$9F!!Xk8d4Yb>I@mbmPiB>%>
/eGcQH l/TEda#kIyJbw^1VkF<4!@=:L9Sn$/NP>Q1IQTy@^ZipG!qTNJDtq=dQ$TYG&uXbdNj/%NaKqJL#*1<$
8y*%\w I%hyNVMycZ9NVt>9588Dp=ik$CtIi&SXknBL&y\wjC4\Yn!BGcZBSLe@GMi/jhF?R/q^1Ny>L\Ji6LpX
Xat$h\ 1eTZ$cl+DD16hp84L!>MGBdjeP^8E^G$!DkGm%LMP5LCGet4yhJ=\T11TDetW/a/c%i\9FC\P&Yj1m9I
Y9t:>% $C6@t\pATRXet*iWkJVKXw*%?qXEEFt>4McF^d#Vtnk+EdB<L!j$=PaK=6EWn5*S<?a:qG/C>*NC1$$8
d:w$y$ !VGSDLN@?TmGaMn&M^*cGj/KK88/5yqa1P4iZ5SnL@>6In<J+?*>IFBqX=PmdYLHIXX=Sq?E1b^qNF<J
ecwWqn KqZ@l1y!NLp9$YKHFVPubW6//!qJybHFEaIeid9ZakLIb%?/D#$YeWm?lH<@^<&?qK#Rc+e/jNYIp#5q
kwAdm+ 5R&?QM>d\W*qqK5BC%QYj8ZZBWDI8@H$9Qm1XKbbDnpK!cHV8p\dXDcim=+n<CpiHdjZuZ\<uJ%LR=q=
B<EA%# Qh/M*u$\XD$tM888LwRBWS^8hi*/T/N<nSe^YYYh1HTea^ZJ@&A<8TG4L?DIN@j\$LT@A\!Bjq9<DmVD
>Ywq=Q %jDbHcT::h%*hWFumDM:4h#h5VVDqE+=KuNJdVqY5T&d#lX5Nq/Y*VC/tYy*$Kn1c1G?5D1<*aTWETVt
NjSt/c =$p6ANX#pn?St&Gm<kXb#8P4Zp@!JTW*Zk@ADl4Zu&#HPj/tPY4^P^*liL#C1V&P@TZ?8d%1CmE*QGmZ
actG:S JP@Aa$iMtXT^a+@+=cXb&jyiKpqV*\5y1y$1VG9<*FGTu+w<W8n8V5Dpu?Y+w5QYCGj6Aa%Ky^FLE4<Q
JEd8NW I5L*RhSK5@HEkDu^@qjAN^Na%=PV1!tn+l5qG$!X:NcpWmpPaw48lH$p<kV8#qVhP=j!hyXVI\kmQ\Y=
H!GZuK >:S9ubl+ke?G4eXKRQVBjG<^KtiKLB1Ck%R8qmY1p8\IlT<V9ZI=y1qeph+qy^Wh&ju&a!Qw\9l#qYRE
KD+q8Z pqhH!aW9lP>CIXQI5Ek56>hy^%PM&$N^pq?y5pQ#a&Z9cXBPPe^Ph9mq6bS#Nqd&wn&Djk\&@&\ek$%j
8:I%Nh X*H#JYjhu:SqK%F$<M%IXX+!XwHRFMqp%!y&pc4N$d>mWWbWZAXP?6=Zbb@N!#w5ahQ^ApkE:hY#5t*H
W\66m$ $#ZnQ8ViX:tj$Yj:t?+<Ica<Q!^uCC1R>K6!D^KW9<kl1$1eZ8Bq<klmKq=GDBLA\!@LubH5+a%$a>FF
deiNti tTmw/HJP@N\dM9IpnZT9Hl&95+mRKWl4WYy/6*Maa$^GqL^*caad>\tG$nHYJa%YQa<9XSb<@:JaLQ*1
C\Eq$Z \\mF$hQlXGpe!R\aP5a*RcX?J\Lk=A=p^eAlk<t$J!>yu4YtKm<4Bj*&quTJt%Cud+nam:HcY@+mI/je
Y6+j*F 8M/LnCPwjT/h5=6$R&GHICwN&WlZ$c%$cRLPCPLQKjKB5I:K**W$m#K9<W!bacR\FtE4w8\X/+nGjkwH
8^b:5^ <R&lmm!Y!\XDuDJbjc:SQjH<Nc:epW8G=VdB5nP6%b4nbN6lW%FGYM6E:+hFnmcHyjRqpZ?Gmk>MqLV@
G@MVl# %^PuG5Z^VLH\!?JW$?QHSPN@NLaFW%H+d8q:9>qp#jd\<EBwI6+A:+G4X@WK%DDpEZtL49iK4#lC8%Zd
iLkY+H uRt\>+y5G=Bh&JIan?LAMaTtS+H^p%=q!KW>\Jl<*Sh\L=Zm!qK^SHB*8p!D1$6q4tR8KyhemYI4>yJP
D4^JaE Qmj?^b&SD/L&lB9\^MK*HF:ALEqBd5GtcjBKE?/LKyhZX:WkP/8WjJZLGjZm>=#eh=JLm?+Pm@*T9Gm/
F*yy8u jimXH5VCGRYR\W6*%q4$?NJGndHkJ^y9A/PJn:&Zp4+ZH5BI6mL!?*Ca%Td4=?d\t*II:RMq/nw9=p1>
mq/=@4 A4V>86!Jt=Ku?hwJPHQ$>#tK@HmGF8kL?XV!=G=6=k+dJpl+A@<XKc\E+m+>Z4Na>:%G>hLp14C^Y!V$
+iQVT@ FG$PpVETQP?*4kq4=*&CCPF%P1?mtG>6\e<JJFWEpiapnteX:J$YSQ?Gk9>^!?h6BS\8+&mNI!Xc8dep
\kajjA nXNdn#ldtJj:59IyZVFeuLle=4NKim^GZWCHKNR49nw=pbeYY?Q65?J</TYD$EPMW%m\l:G>/MtGVTq^
#:W?q8 :Xh?S:ce<HERTS+k1LlYBT8TNuhBP:%*<nb!i5Fj+%mL5F:a$VR8$Te6q@GpNH&wQ5C6ttDw=#!=ZmLi
e=TJLh nXqQe4Y4cR!6Z@9N4<9jt:liiF6&I<!V/FkcL<>Du^j?iq/PBNa4LT6!D18P4QQSJI5=@la:yuu>Bmi&
aKcDIW &Z^Xd$&:SI?PY%h=MX\ty%jDMW<hct\/pF68Tw4>%mTIRID$np\/&>&N$?1wLtJ/Jca>J&tu9dN!ApjJ
h9ii#! p<!uW$w%!Dtn\#hcB>^lE@D/61BC=PjE8%1F>$=/CL>:Rdm<Jm5F:t%8S>^8\6/ZLNEVF%#1B6IWZC:Z
kYPYl9 59t\lAcE:y4/!L@MC4E58Q?hW5!Sd^Ly=&Qyk?cIM!=jt&PbqX>%ViYC4?\?6kL=+BX4#BFbp@B\GECw
DpXyH8 @C4W?WdWqy/y/QkX+*61BZwDkCepCQ<\^%bh9STiNnCd$^*eA@ECji1@HwFX@Lty868?nWI^dnu:YpKe
TwwPRB p<Ruqu/5@V>JVCn@WC*5/>J*jke+%G:LMuIEZalNbAySm5XT\&eLV5%#LQS>ditXc+>AcI@i>=lIe#$T
eFQZE$ L@E6bI8PK%8KnV@H%h1idlZ#\Dj4@11y!@JkYR5WDQ#eVXi5%HYH=T\#BBiBSBHVZp!1#=N!tpyJduH#
Q@<h^\ NdC81CG\Tim*NBZGTW>je4iCWB/piZ&*dajJ!DJ>LlN$!4!tlu>+:dkn+jmw*X\XFnT==QMp/^@JjX6C
M+F/#C ?C>%^W4^N8Bt>Mp%=9aReyN>yl%J*J\:+a@nQ#RKFW=Ee@nl^B!!5ht<KM*APV#lcTVb%jQ1Ihmw%DK1
%uc5$/ iLu\D@dmeM>SIQ1cFXi=>%RQ*BqcB5Tdi5Rh9PPM@F#kc$<E4CDyB!M@ZReaS@VQukqthc8$P@LQeu5*
K1ck9K n1Qw#c54mMwyMRdy^ytV&8t%aqte6QHHqcJ:\lDpYj/%mubqT>aW*^ZwXLh*udYL>il+tuGwP:AFB//I
-AP$IP 000c34a740d001202b3 Page 280 of binaries1.zip
M$H:<: y%JjdXqRmw=u&%=iQeKJ8$P@JmHmEemi>bHqwTL+SJFDI*J*lu/^1$5mj!YlA?pPJFwdJ=IjYnekRXlG
8IwjBb BQ>qcbcB\JN&P#^<uWEAA<6Ak^^&BZLA5+aadFV+Rt?+pEKG1>$awKdyjCc%6HRDYHNJh?l=81lRXub:
&um#ce ipMb^$mNu&lEQARD/jP9y@CQV4*Pi+Y>t:<#LKhlAd!pDXL@Dy68/IPFj%:W/%CXcW4TVPb!jd>&kShh
&eKYqM XnVhIFhiEpM>:wqaAV$d65%SC4wiHSeamLFuCncAiG/XiYF#uBJ9QLQ^Vn/Z!5WZ?Ep/N1QcZpye?nwP
mta^%C !w65I:K*N*&6%:#m$!>5t9LWTa&H1=Al?h?^1iEVY9=q/W1DG&5Qnc#SM!&t&Du@^VCZkEPZ^w^DT@91
6M@?Th 9?BhcCZmj6hiT8AWX4&^q^KNVwHcGH<EjDjEFduEmS%l@EI\w\9WIZdwi:JiH6bD@#e4dy#KWda#L:u&
@G:Tl\ 5yTNmQV$@dHH6bTuSk%*K>?8CDEAR=PlNWJRXaGuewMLkN4KP<jHyZEdSNT6T$i68F:9pKw@P5/a>n5^
W8y&8% De*di%8jT#b!XDV^yjA@u/\<jeG5+$tcPeZ*$VRl@A<Vitk>eS!jq/:BYlwSY#G=ERmMu>W6>81:Nhdu
uKLeyH PAdM&/\1ReDc/c44hFme6pXaI#6KnGN*TuPh1X!QpGa#ntA+lEl@Gwq+G!JiEQ%lje#X5pG/F9l%W=/h
6%aNJh q#5H=#XdquiI=iJK\<yF9^K#GBup1PHa14T%X^l=m>*JtKa>BDnWSd>!a!td:Ie!nCjM<1n6W/=qAwm$
ttSawj qQ66Y#$!S+Z&nXR1&Vq=4e>a8N=uWka%A6HSTT:#qe^%Jmq\=mnuj!YwK6pp#nS41i*cM*w!9!k6XZty
%?Q>en JJH:AI^idmB5XGI1I*YpBq6kyB:TYw<<Zwa^%PK6E:t#n59qb^ApCe5wTLPBDhC5P/bBEmF$@PP5*V&N
:uuhJ! 5?A!jSW:EKT?Tk!XY#JNeJ/NW*Z&kGpX1cKEJ8hIQ>Ie$=iZK6NAm\Dh5Hp#Mym1@&yNnwj=D&==p4qq
6y5?lY Z!w*yyL%QWB=j@&=d1a=ane+Id\8tJK6P</G\TGE^?Pn=BBcu6Y4jP#q^L<RQejLF8Z8kQm\^68j*lu\
Jw=mbl qaSYj!q9KRE6>j!nPKBXC5q@:ACjnL#utwn%un!S=8S9B4+MM4w!?P=CTc8Eqq1n\n!DyNk!HL^4GY>P
JBTDHc F6M4YqP6Y$P1Nd<W!tw*kHZH:\W=?^$?SJ/G!M6G4PAeyE%Q^5b=y!+*uLL%cJ+1j$%RBRnnSyXZQYXW
j>j^+P 91dk&TLCSuPw?BY^TFiwjCBh#*HbS1wi*9XW/l$bK*wiH1hi6H^VulNa?d:\tR%:EJ\*Yq?K:<G\dcEK
CtH!LW 661yANa!WjcweI4h!RX=!M^^p6\8yT&jySQSp$$d&^p@DtjN=8PGTGFIu$Q$w>JTA%#*!SEB*dVy?B6&
w\hR/B LIm1#/&Q=QFXwk*\=tDat6Zl*^aWtjwMliea=CDITyJMERXRM<P:SKn8F?#GhaGdRQ!y==in89Hj>NRp
ha\w$N 1MCI@8X&N%><*MY!hl6htd>cLmKYwmqeFHZZaMqq11PtQwhlXcZ^ZZ/FV%eWZ%1tZFu#4chS<Y@pe@qX
IQ&$=> Rjk*KHFmjM\19\>8XNjyL:u@w>D5CjyRYKPy/?6Kdc!p!WKJF\hmBZq&Klj!$&9M??IR#9/1Nd!ILiF*
J*85&& LZYWR@k=</TZw6I:nWMe\^MB@MCZpRd&juFFMn<CmcyE@6aV1X<hjMG8@KCym:D\CjW>AYXQiH%^uqqX
H^<JiI iR?MMc!V5ATNMLkwpmdkKyMw4!K/bN\WqX?X1JW1D=i1ECMc:>ZIFp@=p58SyVli=S&j1%q$i1!mp<h/
aF^=@& mdGucRaIH4#ech5mFaLbw\*?69K%?nY?Z/%dEm?Dh6FKd64XPhc<St>!T*SC1F<Cw9=Tb<X5?j?FLd8Z
TbjNa* @qKybDBq/j?D9T6&W1D/<>K**MQwCHJ86+>A#\H^XhX*#hNV#N!hDP$?HB?MY+tDWEadZk*5NknhPec>
Mh@bN4 ueFGa\PKVLe=AnEM%SyCaw$1QCJaW=@SY!tH\jewt*yb>\t8Et+elJQ<G:59K9PT5HTa5mtHqhjJDT9$
t#=T*! QK=5yQRDcW\VBj<:ay6X&R4XaNJJ*!b^LV@Y*!pWN6y6uTjF?+bMB=XZ9$@yZ!89?m$>F:bNNt?w:G%T
:1@EFm bhbtAI#h!DLRF8hS\ZAwPV?4K*DVwX+YPJde\aYVcj6T*CW#wi#@1\%AS/4\Z=Stdey8XQ1i&&J=nW9j
WLdR+Y Y#wYR@nl%lt?+lybyc^ucVG1T4WPDkc6SDN5bYZ&*R<&ADQ<+Q6b=i5BiE$CYDS4n&Dw=*kQwwBPFQ#u
d#1w\X BClZ6!Y^nwh#+AeTiF:4=@1651cRtV1dq<8Za\CbMB+^m1y$bj4XXIZt<R$:TPpJJupc<:tYkJwKGFVl
\!a:Sn &?V4ilmt9aGn+EqeqeN\Cq!q4@?aPq1@dk%l:kRdq+y*c8JLC>w&m9MIYVnu4HEwG:mV<j$ulaKG58dp
Y5Q==! n%F4/5j^F<#nu&i5i=h#PT=^t8jw&*ADZIDq%wD<\nb4+kS1ZImQq%$N&wi!tV9Jj4*VNIPY#@W/kh<C
1a+jJ: :cE#CBJNkqAa#NqnpB5J!V=Z+ZhH\SL#tTyQB^EWN=^1dwW>L/6!lbdZcyiF%LN%BuF!=bLIW/c/jhp*
5=kb&I ITyTpbd4Gk!GH/4RwK4<p:%VZZ+HS^YL46^86qykPhePtd#c49?YHkR9Hd/&Yqm%K:YMPe/$HBHM@QRM
KGZMGX TydHD^V/VeEA>p?u6XMpLW8m%TyGRpPnq+6bJe6ey^thj&$dT?N$&tecJ9hKm*/LG+cBV/:RcF&V#:8C
HkeNXq K\G>AMq@ndDQ>eM+ly<etH9nb/>\II=V<K&uRjNy<LVFnc@B5%u=G:$$#!MnB&H<VJ&$p%M*kd%Kkn#>
ka?u$\ &:=e<PLLFbh<Z>Y<q>!TLtViddhN?d6#$ybZ1bR1dy^C5C91lB@SD9DZ\F&t8>AljD^%G!N1WWCQS1ac
1ubT#W Kl^+KK\?WhtLW@D4PQd9<^=wGPJ1\Yp@q@bm@qQdk><<P<tSqiICiy!?BWTh==qI&=u6paKFyHqB6:a#
CS%+^F uQtXayj&/R^QtMZ@QJ=p&yI<F?Yw@hJ%:hwkZ4YjBM1RJP>QubQ4IkI>H6lI\MaT=c4#>%w@\huei<dF
R=5d$T kkHQ=^tIcRNpFaT%cXtWCW+*dLLB4<Nq+HD/RTHGHyh=!i@a1!F=j&6h5I8F4dydq&+^y>pC4\X1\Xdi
<9hi&p EP6T=p>9#ClG4KI16a4Z/FK+Ac=SEa?8jj:mR+^EeX^%//p!FLnKB1=mhQ#tBpi$j\8u\m8//??<$&^H
6Hh$TM >5mPn*#/n>Pqp+F81ce>G+l8iVYAupdeEymQL&ewcG*\e@tjZ\4aJ8ZH@<YwC+?Dln<5LjH5Y&*iENAT
ddu4ZP GIBcNbl^F4S1!NZq9Fwd4^C$%dRV4ikk$?JIqwE*n%y=Yh5lY\uG\i\#hiwSuMX4>lJy9c>N4::TNpnQ
\MSXaJ EIGpL:p5etXJyM=#1A6m%W*qKuVbLe4EJ\m5WClFPaaKXVGDluk*GRnn1lB?nSuBGy6mhLiSy@dm^6G#
?RbMTm HDmn\aLnc<MDAcyhN>hi=TukNPDY4!<NS&\mQNal4XE5#GqNMWt8t5m@!5/Wq^ea<jb/FnFQhJSp+@@V
V^y::T YHCKncR91$Vk$i>aJ&Xb%T@piui&\5t8=WYQF:t$AqiMR&:/1FRF9t4&&n6i+W5PhhAPS/*#*Gn*4NX/
9bIjh* !n?j+qRcMJGbl1#?N$HjV>SH5AZtm!KBKAquK:#>$&+?>Pp\wK6TReTZl6/mLBD\QNlETR8Tt99SKDp+
nVJGGK dAq#qT1%Z@tQ18I$+Dw+ckVYJW=j9I%4G+Gp6cwmRjq1WjdPWhK5A?Mk#ntEKwiHeTPXZFqutmM/V4ce
WRI^<L \XTTL!bPI@<GK$^Y>4JaddJ>uY$4?dkp<KYm*Mt&64:$d>9%<dJDWVndL?Q<c4\p/T1eJ<hlJwLuLjN/
+*cPZE &/Acl6:@Y=WDcLjCF/%eIN8E+MEVaK*nni>=wFT494$Q$y1CYIP46VZj!wb&IalB><w4SAZPZe+kDa6n
\pHQ@T J<$4P$*^%>\tp:I&QBPqEMahHS>!hbE4kW+\49\XwlPu9tAii48S@A<&QcyZLw8>MZn^HF$:J+tMp6uk
P$P@yE Bwt/uAImtS6L!XS?hd%6n4l=!I9mt9BIGNBa<pXSQyHK19C=%?+<><NIZ/1aS6+8Qpl1hTcK:>iSD^G?
dh*Kq> $yMEKp=mjS#9+a9L^D?Z#68M@a*@5eQV1PnmMlk/ibXe:*dCFt41%AQd8KY4IZ^8bQVNS6LjtJFq9KBR
B/^&\R GZ=59AnipyTQVMnXdC8Qc=PbZIa46+hBT5bL8^J=JwAKC++u=!C%LkdNXY=IhhdD+!PK&yX?A6=y+pJ4
A@BEQZ RLYCF6QLl+GYcY\nwm<ZPd6c4phR=^chqkb#5IiC&RBy+$GW//b<buYJVciP6>EC5*4mn/d&IKyeDGEP
R4K+ZT 1dT8<LLdHwjJuN#X185&+=th4/bM/pS4$Aq4?P&JNj^e*DXD/m/?=e4/pYqy5BR\m!RT4>yL^PQQ?LEK
t%&uJQ Q\\Mcwi6PW:\?1$N4y4&=&WHM1p6h=NK/Gep9Q+iy>5d9tSp9dnZRj9PNWQE$Te8bjW+@%J/Zl^:+?ay
w8^+jc Aj5K&X#Fh!KR$jZumH61L4B^n68:c6#lShl4n+@iNpe\aZIy#YIwJ8p>=JKW4n6FYj!upaQ=N*Wtq=#9
Lcd9$b T#=9>Vy#y&iKpD*hScDq%m>68Y@Mnm%IPJH/QDtZ5<6N<*GjVpjTjLNY$F>PCP6@M:b*4F5jVWq*J%w?
Qy9+AJ Lm#k6@HX!A&eDBtw++GXiKCjthweQ?Qq9CC\>@1!8V*bbEDHcZZ81E<?BXu>6RaXp5p$8uVhc!b9YyQT
LM^cJP Q:!wpm=:*5%w+1aG\9DG#ytYF>lI4PbJ#m#uiP%tm\N%e@n6RwACj+MLQ61H^+ldKkt<u%N@#VbcV\ye
TKH#P8 qjJ1XM=+:NHZbZ/5e6ZL9^YXZ*GpHLtc6=XD%#6<a6y5alLtE!PM:M>M!m4bV4IVJSQbpP&*:A:Nl+ZQ
>:?AMB 8LJ\p5W\eShe*mbWKjT@u=#Eb:?E9L@Wc!SwQKd\H#6HLhtnVF!9!MYeC9amZ\$T=DM18$m<\YmkbWqw
yuC:T< H5:&KY>=ia1k?S1FA6$Ed?i%Sq1/q*KPaEW<6?AKachY5^*+L#VCh<di4PTB16/AW<m4#TciR>c*:n@$
5RiII9 PZp>Q5\G>Ld+YTGwqC:&l/BZbi5QbiuI^nl\#in+#JFG=a\Jkit4:K*KP1&DqkhBhK^$yc<=NW=GhtN!
CnAGG& JDKY+p^Y4+:leI@6?ptW\8p6cS%dmSK&H/VmDQiuY4PuM^*Ei\&E\4/b9::Pm\\4X1+V4XaWkXaZ4H+V
RB4Z#R !W$6\^kAIJGS&iu9<pw8i/q<%hwEyC#Fy$DJ8i=*NbY<$n=Z?8mMq*CG<1R%RIt:Jit@GPR:nkihVdN:
lCkA+5 MC\p8c\ujZ*adBX1*EMH98uW/=E@c4&6+$ZMKNFHMFl\lDZbnVFRa1jI#ZDmTM>@85EWXF%48+#MyNCc
D*Pi\? \9?w/W8hm=FPeyMeJ^Ph#=IbEZipyeI9aqj:bX#VuT4!NQF@JQ&dp+Xy+@ZjACkGk5@8TSt4$IJau@qF
GVdIPP ?SV@Zl*X^4WpkL9&G^T:V*wn#yWnQ*L%JJhTTlHEa@Ry#Ve$eECG&^Gb@q\8n=!5YZQIYmlJuWjIZ:>^
X&qkZk ib$q@MBdi6hhhcV>S:e6ky8$u##l%HhWKbCP\GM\mYHKmXXV9pSXd4X6dQTm6XF*6NAq&1^*u1u:G?iV
\$TM5b \PpWeAHct&aVk$uPe9N/p84MT#Jp<tVmB#<VhenGwDEkXGm6WRbLyw#<q?^>5Q$uQh8:wNl9<4?bY:4S
-A^Q&6 000d4000b1b001202b3 Page 281 of binaries1.zip
W?4VIq EAC5%GI\u1l!LPWyPYFAK\wM$j?/jthD8d#<@:KmY%PwZm$8j8kjFXHnFDnkX&y*k*nqHSiVbY\QRE1&
4*tNwL ETWqma/+MQe*e6j=>JbT!iVTnXW&#nb+KXLFd:HXFHGF:^Phjd<q*eu%!WPw?SHF#1L+tdaX8DbQ%b>Q
RtmPum jN<+q>c^H6qWT8wuF#yV:Ccb#<1!?*#KP5M9lQ6^KEKkV89uEQb9CYL<KTC=I%ZJQp/#IuC@5l/41Z1>
LcHAtQ IBdp!*w<\YymBaV=nu/u@c=KR\Jb&V<j/G+nX@iFW/tB!FFq^uNh4Y#G!lADlL*6J1&qWbQQ5p59dZu6
*h6n!P $46int1Y!d=:k#uShMWLN5JY?8CIZuD5u=jNqqJ?%J%T\8Ye%@StaMpt?=Ty@k5@?Y\c&/VT1hTI5*cu
eaQ&Lk epp:e<tQ9iR+NeiwQ&*4V%@cYbJjTpAbE+!@t=#pmD<XZ#jhLTMtCnlQ@bXph8qtSV*cXHNXSX@TZJWn
\kNq#n Q=G@9!*j$BD+4am!e:BKhFiT#WHN$k9<%XSttP6!T=@LW&R#8*1eSLG9mn1nm$<LEn<u8c8<\?Wl?i5+
PkVE:> NGdAktDaiwW%Lc$W6L!/4ZPZX$jq5$/l>d^6?@lAtIEcccK6KTj4#pktt/R4V1/?pF6!<A9Pca^IcVJG
*D6mlQ Tc1&/td/hM/&Nu+1+#tu:I=d1/t@P$$^@wYN$?NXC+N+4@E+b=LZe#eqaXI>IelA6ZajR6/9<d$&WX@>
4$!B/y >JyX=KyKtb$JE8lDbRpK#C*=MkIScD&$c8!9:5SnSePJL#:SGq$w96A1y$*qyhl\\a8D!KVGkMZ4ly56
#?+a## JDk%4jN5RLHZZ@1TLbH\a$ELZZYHAZ8d$#5Ea+5Ym5eAy1!XFdWZIw:w#jDL#p#GlbQ!VwkPp#M!H#mB
Rh<1nP +@&Z1Ny9Td4\8Wdnq1nJRYaEF$BQq1=:y4a+^aF>/meFG?#Fi489+w+j*/qc<Y48ZdZZXcytw\>yDRp4
qe^+!c ZGuC*&tlX1Pnuy4tX?4WCqI4$Je%y64!jk?VjEi?\K5:QZcLmMcCt^HD=H:!5lSKLXG45#c?/9CK&4aR
j<41lc lkJ:bSRM&G#tV%pC#VYb:HJ<pnI5u6#VuNZ:Fhm/B!b54@6KFI=WiY%VMGT/F5ai:e<Ec8$M!ekPVEZ+
yV*iC= FXH!N%K=/=/uC4t9i46jt+lRBj\4n$ZXeN/d#NARyIGXQ%IG4dqK*WpT9B:q1n4:yTXm>AV#E/YN/RP\
5ZJ5A/ kiWW<4DyY8TbyF!\dyKuPuwn4ca>ViGNXYt5=Hd@wME4FkJ8Im!ZJchab@Pi/QD41@u4+jNIc/XQN1^L
ZkZj=K p*+FTHwE$$&4d5*cCjh+NJn*t*E:ibVMh&V8Puem6*SRQD%>?mLu9#e/wd8SjyD>hu&FCHwRaMT:$lpN
5:&pm1 qJNLY$T!%Fj1:$u5jiq^^TK9SR&J/CRA$&qAmi:IG4#G\AcVL&IX#p!tEI$1e4ek9XJW=nqbjG!%KbH1
C68#C? J8iW>Y9i^wAii>Kpcw/aa\IkXTJ@LQS5ZC</>XmjX>@JZS?&I*M<d+/j6DjKE%W9?&=jjnH^pRINp:M&
aBYhA4 V5:G<<ES#Im+NCIR^!KGKu>mF#%cBQ=uJqdmup4&liRuP9HWi^SZL\TCTE^TX*Pyh//4TlMP>qY+?@l<
>BRLQQ 9#b>VQZ=mwLEFIT4kZk*IwZWW$tAK+*1bA%X:IHD+9taRy:ehV51bNqj\6/GpLk^\eJ$Mni=:Wy**%Qe
El#kbX tdD\t6h8B/$&1&hHLB?CE=8YJ?q^A&X&LDjP%@9j!T:h+LY%+GnG\4FFa<dNF?!Ch>$ZwIuShC:KZ=T!
In^=Zp 5!cGbJ!@p>VeKRNyP$:>S*I#<W5A$wl$imb^/XNJ!1Wu?ZBTRaqdp1JFJ9?>/%=M#^y:nat#1@+HHt>P
V?4MZI mJ\9uyB/HGnJYn+HpY1p1=et$9=M$w=&:5%MP&BF#N4HE?XQCj*X%=eDJ^%JXGDBPe&qT>>^RqBdY<A$
Z/9>qm #*k@/:&DR>5\y5HeKkZJ%N9%bA+cBDFL1+5yb#ZM448nCjM&?TTuq#IW5p\J#?jV5ejNY=kiJYhwX9u+
>C\=n6 5lH8aQ:nCZ#ELa#@^NmGya+IPS<Q=hnt>+H/Rj!?XC=MZw99T!Bd&qN!#A>:@E9\H*m<hRJdKlwkpmB4
KZAL?! $RSlS>BwZJL1R:#D/+X6tyy@cd=EHwVMYitd!p5C\ZA^8DA4kQRwYhBd*EVN:B$db#!=/ejI6Y=BWI&C
hGV/nJ ei5hhm@/ty!wE:ShCJcS6HTFP88W89H%H/?XX@5Vu5Z4JyN=G>W^+bb@lb@E^RAJ@dJWAlPQP>LhQI>d
9WdYli T!MJ@P$M5DLq9pIKK=Sjma8eLnKL8<pq*DE!m!#YBMj5LRT%QcF/?=we&y?\nmq!j/Q&K?eBQLFe8icd
4@9ebE S4b/KW/Y+I^@cb%n5jD!k$</dyKm8E@yjd=/A&R!a?<bt&4=WFJ%S?&&BB9nJ$+Lb:<QJHh+Ge/Ghy=d
8Z?NDA ?5ae^1ypKI1P&<K*d$m$6%y*l=MX$aIqEqGd%FnZGcjVBV#$>Gi6uk>=!haE\HWuLHZ>L/cmq<4Z:=5a
F@CqNK V+^>:$wVZTJPGjXQ^JueHqK\IEdBk/=+*&\Ei!Ju1H6kKR9iy%J?hRLnpk^l:#1Lt:XclhijnnlYiIqV
1XL9@W ujE=c#=l99C4k6ik8m5*BKl?bSuyI8n6TP\\b^qDYy5Ij&N%9X+Z9cY8t@dVB1lJyjH5Z15Xy!=a=tRL
limyFl E@6XX\ZICw=*TA!@Xm/:E!ZZpcT=4F+SIb%^+<J4>CL^Nu\h&IlN#hmGZBpALj#<^IBG1JIEm68tMC:Q
4mPMMl I5DMcGdDYD?cQ1u9HE1VY%/9ybL^4lV?/p\iqABl!y:Nl9:q^+XJeM+eN9>kcBmJ%GYE4T565J?J\KYm
NKu=HQ tyIi\BEZ@5jL@tNb\/<MtFlkjWQRNhM4=I4P86?Cp@#WHC><?8SbncYd+MMG/Vc*Cc^Y:A=$CBtw55wd
lV#tjm m@*tlu@Nh&#jTEFBNBI8\q<aY6Jy>AuwHWFD!VFVq@QVJF^p/hVZ\tyt+lEa&%lcqE!w+MqL\w&5qpe!
Rqc%\% TeBMS!<P><eK=:Bkw<nCLw69<8p+uq=1SqG48KiB+!t16:SI<D8GnbV5k=K>GNt+h?!=>T#^e$!J@aY!
p#**<q ^+L9b&Q@yJh9JyQn=NtP/yMaG\@mc@^j/?6S/#6Hu^/#E+BZ^%iBI%==qR\d:^C+6l:J*t!\Vhhd**Au
!K4Sbu :V%pG&!C#p=1I/d\na\i5^L<CX:4h<RFhF&d?/W5cau9@JEyq+\&Jj=NWib?QCBJPyma!Lq@MnTZm\8p
uZPKKX kkB:QbXNy1cZDbt<yGES6H5NL9G4Bb&c1TWCYY5=1u==cc^?aYk=>ihT%Ep!TqGqDjQ/a?bTeW\w*n:S
>$1E?y /ZPTnVW=@PQZXA@Q+!wJQ/^>A!C$B#TT%nqQ84XpILZMKXGTQM?JdFn9>8Luu!VDG1e!QJVM1DDTP$8$
FLH?NP dawScJw+RRma#ABFTm@m&Ey\=5Rk:$kHF/t\6=PWI\XZtGR:Ca%^BjBL&:J?Pw:^BR5Sh%:K&l1nJ1ZE
Xa>e4B itW#bG:y^9Z4pVh8bHp:KB<=@FF%T?/q$y>Qh!*A*@*FbKDQ8wiWDZw91abRS?I+AbKX<ma$>B#%NB9H
:dS61y kpKDMy*CXZ&FDnp$NLZK/SRanm8\IDX9l:QSdNXqP^b+>I\*1YiHE$i9!G5hGa+aDmA#!yhTYq/NCdNP
m1<\e< /lcWl<cWXJX%JB@nAF:N#pJ\nVPN*Plk4AecYI$hmcl:5X!tR&!<6XKeP*>:TIXK=j@!5KSe^VI1@aYM
:dZPTq !#QwHG9$>=\KlHkQ=#*K#$8YT\Rc=\@/aG8#&dlR*JGu?da>DGe*i4aQdAZ+XNpi+t5#G>ey%QtHJ^#=
DyL^D/ FDueyI&Mj45aZ*/1pRiiLeC>MJe9TPkljRKm5J1#+G<<W#\SQapkV!RF:KM98AB%@X5D*e$A5W%5*$!a
q11pSb lKdtPlbnlVBHyCeCMkNtXKXZJ!WcbTRScPJ=S>tIEetYp#?*kk\um=IG$1Pd5bM!ESqu/8VNVVckMm!n
Yh<lhK RWta=#wX+&mc:45n!e@4XpjdymX\Y4QXcPuGkKdciTuZyn4L1/:L:LRh$?HtH8IA#nCj/WM%=>KF@CRj
^6K+5E yXtKqCw8AwW+J!kD>B\a$XJ@puqBZX9:Z/k!Sqab#RpI:b&A$h:$Gp4Bc#Ak!DKSM!pbuhdk:?SGPqPT
!&EDXD yS>@\i$b&6KpudjQ%T&<KF#T*aa^1eyNN:GSV+YTWS8D@eVB1=S/9:SZa$YF:^bZ9h&nk/j:XXqC6mwh
LS\Iyn VP^41bi%F=K8j%Z$M%h*J%R?PZG+SlAV&N!j1tdPbmG5c8yc&Xhn@n$J%I1V6W=nP/JGpnlna:n@*M:L
NahZ!! C1p*q:L/cR!up&utF#Hdt8R5btY>Z!#d$=IYTNp!mq\T1y8QhC&G*jiZtQTZ>&WpQ%tRySR>1PjbhP!Q
aiX+K\ 4IVB&/XCM!Q1tSV6VN1PBcDuC*t%86EE#?ehb*ZdHN:V@w6/ye\:=F6e=RHq>KVLiJ4>qeX5W?CW%ebh
npkpMD mQWM!KLIXZ%<S%MEcTQ#T/eLJ\!i\n\#6Zj=?LXX$d<d&mKeCuVYS5TS+GY55J*yYl!l#^ECJKu:&S#@
J<K$%n WBIBXpu:MmGIH!CCuC&hCL?+Dc$Vu$tp+!k<uFJcek1yq/\>!^RP:b#lAAIW8^!VhPCFcKtWn91F5jQt
$w4Jp! Pu8ZKE8HmiAAdF<8pC@dHlSV#nl%#*YNh9:b:WmVEYB\?^:hWAbQmR6HEQ/PpluSpBlB9*Wmp^C#9lQ!
8:AI$H 6L=X4t!Td18dpTDqyhIIaBjy*4IyWW%b@&<VQaNaInp%YNEt/jLT5HM&1?8\J5MuCh$%><j^%1J5*EI=
/MqMh4 %NJqh^LpCPjP!BSYqD<6Dc&=1eb!lWTwpXdEIJjt\Yc#9LnA4?I^ZCPDLbi898M%Pj<kdcY6i\eH*DLt
IeQ:FF mK59\>eZXqtMm16<Y69Lm<bt!QI#Zamac&<L5ucMKb%<S/@K#ZNh+J8@EleYV$BCuFTNJ8S$#P^NDAMl
e=l\>X bG!+h\@muTCAK9CLp?G81B^>5<pS+qP<NjupLbD^Dn</1D?Vu&eQ1K6m:htk8bj@ltVD6Fly&!Q=up*y
wMDa8K Xe!MG+8&c#K?kVcV@!PyNa^99P/%9LL9!TYXLRmR9FR\XVR$h&ItL8+:wCMXNcZb#&nF!hBc&Kenilyy
bc1^aL D$uBZt*I>%P@Ey=pdLC1E=GSNj?@HTumhT?hQ4GMw^V4/%euEnW&TyCY^DR9YM#qJ65up$yXJ@9/TL5T
$EmI5= yV?!jt<+8Ve=N#ua!Y&qGW&w<KP5w#8qi*CV?1+6TeCA*FqbpG9hFTZ/PX=ty*BPIVCbZPy:ulR%u:cM
:*TJjD u&cFAtVj>>!P<4&59b<:J@1aJttmqIc!GkPapy9l4/MlcQ+JKnp*qTAFiHw1#Vn5n@R$CyIdkDRha6:u
mXlBwc W%XWYI*maLY4GCl8bMVckG%$68=nuPNk@EB*h!cJ^u?pm/DnLeVV:lydE$Y\tiNylQqb/>&HVQIVPqIV
QI1jML <DVJ5$t=qV#8b5>u9ywWmth6PB+q#?Y8I$1D?ALQq/&qdECJd+MRVcVyYC1mC^Ekwk!hEQ<BJ#MWy!<N
ih9P%y pdNYhKPVGBLG@5<&A5W/YJ6SP*:^H>bBVX?h\LlJ4k5@beBbL*pCaa=hK6yiPSTq99VHJ@tS66Tit4Ji
c#@nXZ T\#tbVDGaq:c<m%qSpt^bC9IGcy+NqZIVl4VEiMuC@p@E^tT*bnp8c+A6eMWV5Dhm>C@#?MGAcFG*GiX
8#Dn?L pR&yL^RQJhlRh1qyZXqqnVk?N>G?WY#cG4\qJD*M5T1byBLF?=/5^#!6e4VTE&j#lj=&<h5hdR5RkhtM
%AYM<I %tm!ZDP/>Ii1dLdeM+1:h4SZa#+t!HGHSl:@9@Vp&*y*I65VV>KXJyWW!/u+B:kVVY^SVpbV!LKyXqD*
-A$jb! 0007bb2f419001202b3 Page 282 of binaries1.zip
lMZH*y XNGX!1&8F9uc58HINk:15u4b$bEi&6eP?yYY1q1MP<\=&M1I:TWbVP&&aPZX5=AXMpT<pCn>@NLF!Vc8
mXMyGq 1d=bVeuGI=6&nA%5GtL4^<ktHtJ$/a>5ADQR6VtuV$SZwqjudbI6Xlalm=<JtA&q%J#MFT!Yce+%pju#
Q*5FDV A5eY$*F=Q</MFa5Pa=VmL^ZH1EY#8t^imp1Jw5%LptaZ:GY*nABnAyNp*yVT/+pJWu5!El&M<4ykXSVw
AuTp4D 6X>MtJ1J+i1Z>pD/$%LRF%4YNDHKD&Fnm9GVc?CG+mXDP*F9$\*u4T!tqFu5Tq5mCXIDiE<JcQE+I:pI
AlM?VI MW5l#*?lq<awi$@!Na$uD98ZE/YS4mhiQYEy<pCiBYq!9INR>WZCikulLIQ5V8VCh&M#V6tC=B<kt9S#
aIXkD? <m#C<cq+j=9<<ZYeBPnH!Vl%5X<wlI>KQYnJYMK<E?&\J%$IJWQkQ^&V&$pCuPEj=EJ%Aj?#X>5Z+w=S
eTTqB= YWaMKih@Lm1Vu/nMbL>Yj#K>P6D:*!SV!Ik<Vi#ymi?LC1jTBb6XIw%lRnayEeR#C#BynZVHmWRC:@?k
!!PPEH ?\?/Cj:*y<p@TM!u^1eTa+P@@W*:H9<L@@9@JL>KqQ:1Z@@Q@p@V4:@@V%9@?Qj?9:>>P=FMFCdj?/<@
>mc:@* ?t>j?9<TL@&<FL+*qVn=**@&9@d\b^yQS@=LJQ?/@JhI@j@pQ@:L=L@+b<4H/tAueVqKbN:i&Zt<QX^L
a8GyP% *Q=5J:Y>ih<5J&+M^/tjLc?FP<tHq#>QyC<*::=6hp#VJFKyldh:P:Ndc&9L<+uEctJ#6FN+&Q\w6:BR
:WPB8/ &Nt?jY8$thk!t<t6&!>&bt=6Q6=iC<^!c6\:m5dyQ>m54=th<cP\tXn9J&b##idDZQNl%M#6QF^wJlIj
4tFLd$ Nb8DHdM&*p\@QyhI@L*p#6bwJ:ERJYc8:P^5d>$P%#K*69Hbm=%Z<GF6LXm?9:#5S?N^:+eH+?DB#t*<
<haF>k /IX^Iy%KZL+<TKR@TwA>NKPh@MKX=5LqSG:l:aZi#5#66bX9JSJ4mW&#e@dY#5/n=8ZEi8:l#5:Y4a<j
h?F@Y& S=8bdd!1&%@9uNyi&>y<ENTZq&?Mi#<!+*SW*<R#u*%+>#Ki>MIwMj6SIyHDy&dl>N9N=6&FHRkkpdne
=FJPi: jDne!h>/9Lu=<Tbj\6<j:y!:&@#we8I!JHN4i?8D&@nyc:jMVty4=%F9b*\:9ZN44S+6y&/Mj&#G+^<u
L\c\RS @/Ai:5^i\a?/@FF1pMn!S*:W9K59+8GXhW4?:iFPdk9m&K+9JBL@MLt=nRN/>FPVTKb\QHP*64ejdG*l
S:FipY dZML9!cNF*b*6DQiHt>>a@Q?!nIEN8:>iQ#DZ8>ut^@e^4<%%^eYe4uL\$Ryq<JuX^aY*4/:\@@y!n1i
lhhGY4 hQM8Zp:8Me:\%ncE>u6tJ:u>&P!e9*5b&6jptWBc6&:h99X+b^61^N@$PL&Nk+tY$#=P*I^VudWHQQBb
\@a\ni u8=/+1Nl+yZL@G#l!1NHD@GLHn/<Rnp?jH8$p>?/9dN%i&$Lak5Y%9Dp6ub&t9#jewYhuh9dc:h&%4a@
b/TC<6 *6=/#K@jjb9QLHN:C<eXLlj8@&n<a$n9S>HtY4TVYdnedKb/mT^iWAHchVjc!X*b8d5AcVZ9Dub!iH/R
=CwV/P DX=PjdCVZLl5Etei:Y^9**/<9dqh*:y>c&94/=&b:X6d\YaRLtj<Zw<up>!D8tRZH9JuWF1=hV#4!\>^
Bh5WI5 GPFP:m:QC/@wIdZ4<Vc?=&aCmn6?GCWTC&cuAJQa9wWjD\PDKB=&h#LdP&54K>F!+ea+Plwj>Z/<5kdX
6X5p*: udpC>W><%E?MF=kC9u9*$SD/ly?Y8$9y+Kh5dc@h=nGe*1F$dq9^*MY98L*Nw>nCl>9lV84S#1MSVG@:
K5wwAd hu$VyqiCF9@+cN!L^pe@&+V5SPVNXGwICauGLq\b:YRjNy5jjRSyWWBd&:h*?DJ?L$%4m&CCJuE^hRZ+
ZXLA^k <Hl#c?*Y%1*HQC1i\65:EMDb:b&6#i*kj4C<DA$dn*<W+hk*6@CK1F$JmC8jk>Y5L?Ri:h#Fc*4W=G8/
It6R%5 M6nJQ6:BD<R4?wD!T5GCnEy5c\iu@Hkd9&L:/=*M%tQa$*D=@I?m*9nw/CBcY>9bYaBBJ^aT8RENpc?B
bae4i@ Q:l=>@JHC\6Zl4C4:M+Y9\9RHP&WcPaQ<j$yal^jAySy?#biYQLK\#+PG$wZQBk6y@#^&EVyMW#h:ESN
6^%tCD ylu^SCNaIW%?+i/nRZ\i?GY=db:BLj#%:\QyIP/FHI!%CZZa*4tF\>t?nTNN*^Z#t+F=RJ@C=bp/+PTH
%+^Aw5 $Ki=w@wtu^V%CVaB<Z!WIlm?Qhmbid6=PdX\yd?VjL\NuMB*jIA9AuaTCDN*Cunmt>SYPbk^5CBDT><c
84l$W> LCh9>M#+DED&D&A:C<&Q1P<jDSI#8Tb68p?^A^AZwBpJ@N!b#Y%K=!dXp#4^W##=>ajSVlbu#!i@Fi+p
9X6KeT *wctQ6+P1EMZk99LN*=<AA#9>dy4?B<Y4u#Ek&XQ\tW?<@=Pq1<tB^<B<Y>F<5T>BD==BZK/e9tn>b%H
RK%D4e iM4dMPThVikP@tEMZb8BMh:cDAdRt5TQw*HlB=BK<>F/4ytDKmS#MM=^KpQHe\Xk&W\ueA4>HZkZ?jE4
RESd/h ?Q<jNlPF6X5S<H4u%8aPkI1t<RnjA%NLdc?6lM5ZkPE@HpjR!q/$69Jwb#%*GbCCy@+Sw5yt<1GI=mF<
pD*dTQ &yYHL?VHLpe:=/H*n?+tWkYItplEM:k>*Eui^juMRluZNwM/HPRK@J4@I+k<@&M<:+h9A/1lpK!aLTV8
jadN4b Ak#8\n+ZF4:YR:T&hP/u#ib*aKp:>@HH%6y6TH?LP4/#B8^cjtXqPbCu&+8Pn5ajBD6*<TMVH$YJAn$B
X46pN^ H85Lh!EKQtHC\8RJ=@EpH?JIkNNtJ:jJE>4iiR\lJ!CL<iMMBHQ@@pDeDJ:6D@i&j8@Sw@ZL#XRE?a:^
p=N^%> &uQ\a^%IiJ^KLqk^@JeD@H*?:mb\lac@9Hd:>9J!<AG$PkHquNuc&h!<Be<%Zlp9#><AlpEM+#?+Sb#N
#@:FAw JT=D9qucbZPHuCEFW\/B!+uL<XP?mYj&GMK+ZNl<jH9u<aP66iCD^^@jk5hh:8Bu$$d9l<6ncN:bcA!4
><*N>d n*y@5L*%1Nt<jBt!ELyCcIG%yY+VXLPm&%h&*8:IV@>:S5/@>Km=@4&%Len>%9dt<5/DqSXk%>4!Fp:t
K*NLLK McCW<p+A+<?PD/AiS&NA%5LD!?5E^qqaG%V6dV#L:iHPDAC4iji8QuN@5FN/iHpLmL+D8:8@<9HHt>64
P<%Y%B >Rj\ij!=MM/6bZm@<\>kMDnHH@?+N#:wdK*^1Z<WJlDi\TlNe@\\AhVP\KuhJp#iZcBl+8eDw^1S/QjF
PqDd5P 6^e?*61p^Y\F\Rej4NEFd%I<$Qt6&=64SJMpqjD5n?Gl1N+R@ePF*AJpk><A5/j*BnmuAiYR^e^Deieh
nQnFeV MAK<mN?BnV+5jk5+RpT@6dL!<c&6&\?&#F1Cck$KIt=<C\Ic%=QL+ILFt^AR5QhkdbM9BWeRJ4IW$94h
%kEdV& K$CN#Qdn^#8*w=%$</QW\w8h>N6\LGBLCin:VQNj%cHtbn9:aQuY&mc<wFqL%mF&\PLt++<*k@9S<wZN
YZ&PL! RIke6B:+et9:+h&F%GY<mDEAiN^MZXuA4$nmj>#K$^Kd/#mNBYDVZYI/Z54<w=&*ie1Qd&%?9Q\BVtb:
Q<\a9u #Y\t:k?Ze+Vw6b$Qdn$Iq%Q*X!m6G*\h@w>?>MG6S\>#H?X!IWlwA4yVcAIZN<*n=Da>MZ=8e?h6cQuD
q6XKWl S+@\Wu+Hb\I!qZpIDh$$Y?th+EFk6nK*H/>6d9dq6#\G*>9E#*@qju*#ARDHQ\LiHQV?QRkFGC=PQk@:
CqYE/E lbZ>>P&F8!FiTALC!kDV>ZZRq@*PaPjC*VW/FRDm@iY6^:ei\!^8*c@*q<iQV<G*4\Z*/<6\=eEtZ5b>
^aVyMw @9AjH9p4n*eYmGil<NGF*F%IC8^>!>#PdV<tJPCZEm=AWjA/jy9PF&1:8jZadPiZX&+Bi$B:H*TZZ+Em
J$4?=N QF+LHm\9+<q9d8E+/u>9QL=yD4Kh@R@?>cPj4wPEI^aCW$+w/aF>da<y19ZE=aiE^jVdn^+?NIujH8!e
RcKb!L j:\J9RIed>a@&KHmd6$PX44L5!D5t+Kdyj54\iac8Pn+b\i>H@:\=l>5d+PCJwAbM/pFiJBHaPcQRZe&
DjZw5j /T>&H9*$I$A#\Pnl#N6ZL1jWR9Cd=<YJk\5E!@ZN^^Vdk^jLM&5+<LWXIV*AEL!e?6EQd6\<PPn<aP9&
item?A R<RcWN8QmQ<Ld#?CB:w>*n/%A&ADZL/hA#&+!>j^eB$l#lyi^!daJWB$<@=>9J^6Y8D!@V+WcjtDcHM&
haYHbK AFAD4M*tjHB@<$e@8>t:kSh!c@58dBmct+h6ZE+B@?:C#4M$594YN1A=<>PQen9khbqHMNa4WiLtaPee
tycqhh !jY6B+?*/!5pI9CH>+MZ!&@CMc/5%JejLQNLiIq4!#h@eQQkl#@+\jdYV*?/jupE+E=hLm#kS/$B*4dN
hki?dw :Xq/LPAI<P48I^kRPN8HcwJFG8APcN9>=h8k#!B4Qjk8kN<6twqbV1:X#h1=?9$H\e&j*Vn+\eHB#eiQ
Tten*i *+bdV>H:#8Jk%1<$H^w!HwLF%ldy\$?d8ah*wew#5L&F=p?nSGP\M:<J=kmQ8dq<+\i*d#>?ADn9LKej
cEXhhF LK?5tYB<Q:Y!DLPe@:li*%4?\VJ?$@LQ%4b?&q\Hp8B*pLlB4iale<wDA6?BP\NllQ8a9j9&\?cnBVm4
mC6:Ql Y$MiP=+DXD!w??PdpNb&<QZ!=YAb+InV*pTWB5Y=n<n$b<5@9Hu\w?Zd6@<YHSLbSMKp$wlw<BQuAawj
C$Nn>< 4G\K$h%=mQBnAc>9DpEtjqGV5W*mR\S8n@GLd6?/@jn?MwllB/?L^9l6SE@\k%DpNbkKu5\D/QptLHd=
/XZiJ6 b#?+5j!D6i&@&d!<H5EeETFeZ4lCQwnuCKRk5M#CViZ\T<C/aC%ZFm:DS+JtS#5Z<D#\hNc&6&l<Q#\c
hXB&:q S:e&6%j/!>H+ekh!1?P%QXm4d*:<iG96ASRE4&*=B\jL6:bAqcAKM=idlRWGCh@a85ZablQ$+qEV+R@+
y^$En> >65Q:?=eIZ8EQpB<ScDL#t*RDumu/KALj\WAi\^w^!6eZnHB1*^lc^@k8@Bl?TcW:5d!<kjd9*$FEIPA
uIh8^E Kkihjkn:bJl<c#6C6HYBL/q=q@Sub?H8V^pE\<H<+^H%ik%Gk\hmkl?Q@?CD#TAaL4?&5w&A@WjneZ$b
QGDhH^ C4i<EmA!&61YkNp5F@m/=EY6A@t#CBM8k?<kjl5Dq^?a#SSMAdwH*Z=:y\q&jYZuT5Ep$k5+L:C#al%l
Xu<bLB CilKEN#w>a:1&:hIiHb8*\@Hd*aR!hjlwYEIn#ej4K^6+:l8L9PXQh//@BGe\M#/=jW4h/<AqB>9dhX9
eKW*@9 \WX6\\qjINpHl&um5JwQ<h4AySPJj=LeAVEwMFG\!Xl!?aaby/F$K<Qq%#<APR>?CEI^Z1+@YFuijAC6
pWVW\! &YJwiR6&q95bFL??6ZMFaD1d8+\#TT&EP/?DBenQI1WA&8Hah8:8*H*$cPe!lJBG1J*+S!Ma^l1Da%HG
P*G^ZT H^*>KNnilu>:bR%u8SW5+@hB>\NTcYDtyqp:8@$^Z!Bi+e4&:#W@wm?hVTFT9HIZ9@Ad6^<nGAGH*YII
AdZGmy B?y^Bc@9$h&:#d5I?e*CPQFjn*cK?EpkVh64>?>V>!GV\jL46/Gm6:a&d?ILeBYdc\DPVWwe5dJb#9<A
aqdGN& L?/DLdknMLTqJ5:pMw\ZBPc^<PXN^8>dP&STC&<@^A5Ei<5^IGePA!@9\Y%+Cln@<9KQikhhIN:KcQu5
i:EWZD C9kS5G%6?<aQw^ZtZ#cJRWVJY^<Qq&hYdn*A+SuC^$iZ=cWXCJb+auYRX4N#HycMX:YA%@eIqwd\p=1b
-AuFqn 0006aa27e46001202b3 Page 283 of binaries1.zip
ZWbnWF iATaYh9mT>pt%$dABMAIS569jHCdwhT6^:i&q*>MJ<k+CAC^?VE+&HI>ZC=?AG??pKAu9:!RY<e^lV8Z
IA*?iP 6#e*?V5@y48>&@!wibuJp+eLBaBP+8:d?IWj+6e>q6<G5qiHKjV&H1#BE4=B:du%aB9+<VEkM6km/kFl
t*b9S# Eenjin^a#mA??\lpdmaFy>65Sn5L%KR%H6\HnPIbSMP4N*F\Q@$IL&/B+S!Dj$BT6JduT?8Nj@^unA!@
aS>BL$ <bnP/@aKuPZKYq&$Fk\ARV6MGHI<<<HYG5?L@AREEtJeAD^Ct@C66!VP@?qH?QyD^H^ZRAEa+1pe+XpI
M6%5<D N5KDEheiIVDH/*y#Baj\Rj*BLZLm?\>+<wnJIMdHn/$eeZA:VZq6@HX9\=kYwCNd?E/Ry\h\XR?yGVm+
j6Ybpt S\@ZH#HMj=89:S?H^H=c*C%RdQ>HWRSb*B@l>&$!5\c<lHD\JwC!lSn<NuVu<Z%EkGhZEKenNtZ8l4Ip
hZ4I4/ %8M:d8QdRh^9IR=JQaT6Lb!t41ST?NWQ4VDHt*PEMMRneAFHB&b#8H^y=VaaZpA$*q1yp=jSmY\JjN@c
=$XKq! =Lq6NSMyb8M8t+WEZByi&<hdWEy+\#YJuBMm\59NhZ1cBjuCQ$&A6^YlH#ke<Bua\LknT9LNY^@Z6\LI
k!VTT4 BT@8XpBVY/M5GWIn<Au1IM><hW$!+h^q@EVwR<S$ENNZH><QtIY=<BC/54=\=jJh?nd?d9:Kj^KJYkaM
J@KF:m lIDRQ#:/Wdi?CW\b4^WR<m<@1QQ%ITK+?Bk5DP?M4WqNqltk%l>9Q^Rjh&Zl:kJ?aj+Yw^Pe?8$Q#F4y
SBRMdP Nq>VDph:>@IC>R4u^>@+Z@E*Q5A4\Bp>wHcPj!c9eR\KXX<JkCl+!nkPIQB6!H/YL*Pb4*AGeX8#KWFN
SBT!NV Kkj@M>4=FkSX9:?%jJ>+B>jDFG=#HjE*DiG8@Lb@pulEnpn+&Q4kNul#NQ:lHmk$Z&G?j9<?8N9c&kM<
>It%eL *iVY+=HpYnbLn#hZTIBZqui&HyIEZQ:wEXMQ$e/*6\m6H^MT%t+#IZAF6Hhl+eyH/#q1%TQ=nj?RMS%i
=&$HR8 +SbQDIRARjEaIThpPk<KKV@*@8aHPBKe+8Qi#npiEaWJlYb/G8d*EdQXy!u6:dWX^Bn*<T9N#8tHpkSh
nHwN%8 B>H@KEE?!VD$H$FjkJq+YtJ<mF@4AX+dTBaI>nnI\*mlhZn=n+e:b\E6Y+?bt?Qd>mbwilb<+G*tljDc
AQkWdy dyQAQN/<Bh!EP\T!MFY?D9%MRcY8RJyMq>QYH&\#?\ebMamCj^55J?5\\B^$=RGhCRLk$>5+R1dqX&Dn
mQ6nc/ Q&$!jE64wD:i@5b686+XuN#&twAqXSdWnNGZjXY@t*kwl$aw&IK48*E\@6HceuD@1?X5@iQ6Y:h9:aCZ
&!:W^j #<QRhubY/9iZ\i?D4RCkC>YAF:6La9WGqAi^GH+Jnia&?S&E8<:pNkK>ymctjL\e5IC%#RC@bQq*^:$I
uc%4\p L\i@=MHcCp^%i:5D^uHl%yyER!8Q6+lH4B+5ZIH9PQ%+?\MaQ>F^Bh<Lm5*eP:%iK4WAXyKC8Q+?XiHM
5Y@pFE 4S$RR=#&<9L@hQVnH\YjLe<<l8y9*i:8FMH#wL9L>?<DkLd@Jk:jjJS8R6pMj9He%mb#Cy5QN88QN/Ph
V&599u <+>!$G4tV^NM@wP?+\Z<N6nQa@!9RHyElZMpd@Y%4=bu/t5jAQd\C^+#H9+aM5J9Z>ueZAem#idij49\
p8XbGi <CF?^>\Yw/5/#i*BmwGuuJQ5KBRiS*?ZQ@yeI9EQDH:K=tMkWy$W4lWhhPw4Z?Ak%kL\=y*d9S*#iL^&
?1HNXK LqlbCXakb\J%dy*+A*:>J6AXeLeJtN!<SXLCXH=PEpIMWc:aW#kH=RKiA>6&IP8XbG<e*eh9YKGNICn4
<l%8VB MBP!iW=iA:l9Fhd>Wa=^E<D!FRV=6@D#6?4\MY8*N#ZDt\wV1Tc=jJybba?/>AGhTl*8<P?t^n@?GZ:R
JS4d8C q<8bD^k&DHeTaPeA1?&QEb@Cdl=5**/wNb&:h^?GJHlAtR>8BR<?RJ\W:TTd//HWqQD5$+>y:+!8#GaB
BWIa+$ %w+uiD9%++NPd@uW9%???eMj+QeED?CHSn9yS*hJE<cQ##M9<QHtMq\?#^9l#pPJSBD6jL\NMH6RZ<ML
BM#SI/ kT\a&q=8Zwc^y\T4h^:9uJN5!lqRRFKd:iZ:1^@>eI^jq9uBVj!/cNt5yWB><dV8Qtw?+t8C6:<jjAB#
T4BmjR **/MmJ%=kdjjjwTupdk>Yn6Fj4V=kYST:pI6MnpiCj:uVj1<iS#J=lb$E$=uiZp%<j@?+e@/!\WEN8CT
cy^A8q N*pMbk6B*<P*RZ:\<!/A@c\6j^#WQ>m1Q!L^l+XRmXQ\K6FtkYaCP/p@=w9KMZqHFZk$WkVDK&I?DmIG
EqL^iy Yj*:H*%#*EFI?nQRk=5@P@nBD*+GGF6L*AwSK8@Aka%&#5Q@*L+Q5/iW1k\#tk@^FN=<9MWKa\B5aRT:
n^:BN@ DRy/t<XEIDMR4QD@4?%6k>\+#nVBSKG:kj+kt^JJpdRwNXk&JSAc&h1+tV98uZcwGF>5/PaZR?81b8EP
kD8H<l RX4nKlQ\jNAc\%A+%AaEi$aq#P=cQ\ck19bw6lGDIyCPnh5jP#G#i^>1*<dFdh\jV#mtSXquZQji#Fn!
cP+<yW !GP%dDaBh1P1:ut!RI4$*P:>Pq5p$btJ!u4#@Z4iN>@M%lG4?A/EAY>\$Qd^SlAb\:k5u6!1kq8dnAIR
E%qhBY B<Dc!DKp51Du+dWlF?S5!9amc#Ew4\8+F/BY!6&lAeM4!+b#lV?GWRJn5klaAB6!*SawA/>?H%1MbR=5
&9u^@S CK%qhHP#w%$E&c9X$Fk14Sw*1:Y1RW@kMAY86YA#Yk\Ak/CCKLaNt>Ll%l9<ZAE4?VlCA&kT!IP%+S>L
QWaFaj KXNL#/&:im9LmCWk+*+*yn8ZC6DAyLumXL^yqP+aeVXL?ncBMAiISR869J=%C:V:SDbaT<RwWF+aWESc
Va>eSR ZcpppltwD9G&bdW^4??SSKp**Y=Y\9uT\L$W!hBb6u*G9ZCXc<QTypECw>XDNeTMeGyqu^6W*c/8l&/K
K$YH%8 pu=pRLCEy=yF^&QMTPFG?&MD*%MM6Pu!aP$S\Th:Y*q\&GZ\q?ci+P@EWl6$ByF*$EcWaL1Nli5*ET+c
e@Ram^ \+t^kAt4t+1NAVj:ZBYF1u^CMAlAPl:1\cWLl5RVtcwEpZP$CMH5iVd6MCG^=Q+E6*ltjG=>jVtYl&E=
Dh$G<! IN$?9LRB+HS>XC8NTlNn5YRMd=bY1<y^\!!$8mHG$*Mj>l*kbn+85Jt8S$VblT$/4MJd8&MkIMT!MqYl
?%de*4 699/4kR:Jp!qe%j9m^myRCL<nt*1I9eHI^mTcnk^^DA!DnAP>>TicDjQ#bEIPD*&D#1p#9PLAJ*A6nBd
G\pT:1 S&GeIT<\J^d@k\W&/Rl*=S!Yktc4HM5nQb<an:nQeZQc1dZl%64N%Z%n@tcyilN4/@D>$9q8M^5!KABy
>BLRPj D$E@XQ4P/jXkljX<C?6+8I!\Fqm+djP9DqPVjuqZdT?quaSnI6l*DkL5FX$wju%WG%bDKQbD1!WD<&AJ
PMYtui !\1?6dI=dpSwCw<eekb6!#PL=WwFWyJF#B4Cw9pWjjyn#wWqBGFFy#KYYW@Clk\Tn1WGCBGZ#VJ>Zli8
e&^\8S +uw>4t?6Vw^=1Hty6kwVD%Fi:K?4#X9qnWLAMCtlZn*A#\+D<l#5hTRjaiLC\NylX49DVSq\D16&S<=D
#WQc@P !iD?/F>im8ZSN8A5kCVW+AJkj:+*Gw:Y/mB^ASJTapl5el>\CZmK8>+cqyQyp?YKA/\JnAI\&hB!Lne9
Hq<jPN 1ay\G^PAKnPmJ#iDCt#/E85S\QmK\:*G4+JI^5GH\GLV1CCKc5tL>Zk$lP$<WX&6*1\!N$Xl:nP+AFwG
IFd!1= V1WSBJ4&Ke1Sq@bBjcR#k\Hl6\q^dA5\&FBd^Y*Qa6IX$hSk$IN%D&V\5LI85Ze+MG$HCt>i/EJ:=hW\
PeCN!A Dph4MNt4pVEDlld^5w61:+i%A=4we8<l+I\bpNqkJkj8pNqbTDVLT$D1WR8lQGM@^!=cJBSaRXeL?\\*
w>Jy&n 4!&Xa/6ASA6!eHEa^$NI\G1%CnHhNN4M*ip89YT*lZpnjSuP58IQuCJpyhmyRCql!pM=X&+l!84K5ZEC
nmRY$q YutG46tHq$ILqbXa=yTm<JE&VDcRF>T>pt?+mF18eYPFiHw%bXSl\w5?TPR?T4iXq<R:!V=V1k&AMDew
aQYqB% B%RY^BLB?4:IHIYNl$yeRyS:GuGm>ec?tH<C^ncl<QhmPYhJ&FeHn#<nAi*k=>8%4c%+$/T%41:C51q<
&YKwWC EI6amAKAuFl6Al5w9RkSDPDlt<JX$DyX94RQ&+bq@h!?tGudhuCJi!eL49BW6k@p@V+a/B!lXae=NC/9
I@@DLc W&:pkGEDZFP&SQNhNS\EG#N=hCEmQ\:RVLVJjYcL/cJBeJupWVt$\D?@J<VS$Fl<DuaYtnS4Y5+LEQM8
=YQ+L# *nNRte1HqWKicyilQ$A*lmFd*KCVQ9NJIhaG=lyC\=*&YS$<yKGM8#H%w$X<%WQp/5^bQ4^1kTRGF#Dn
^S>nL< jGnE+kSn!+cAtL>BG+?%cTFYDaJEP?cekKkV5u^A=kY+DG^YZR8=p/l6q5lEy1@VRC4AD5hc8tk8JN8:
c^LNJG <L5\>$Fj\^5WtAj$L8icWVdG\pdG!R5m&<k&e4w+cy4ukb9/4JEB<*\LlH=qYR:wLiERIJ@>bk=!ee^4
5eCEFb 4/+m\4YNEt^1#aC1p=eL4Abal%*nHLG*1QIHbSKmht:<+D\+%#kGh@Pul9Ee+C:mQ6Gadh59/kB\*E5\
lC<8Y: &pDL+PmX^?TkW+E%lBY*DdtPCF@C%^uX$km^kLEbGmpVqpjLN^y*=B\YB*G^V&C!ACWP4HZAI:+DRyIL
u4/YaQ PY=NHwHAN4C\PyCHunK6<@DQNFYbuwW+<&EqRp@TaYJ?S5n=Sya:CjDAt@ZRNE14yXwJC%CS:4ww:Mqn
6>I5L^ ZWBaq^W?E4LnM^/:yEG!8P9mH*>lY6LZPGAaw6HR/d6e#VDPS%%1dKcHtE<bk5jq\QHy18BD#H/ZSDAa
A&FKkV Aa\mq1>Y8X5Jh9cdtu6HyyupR+BGZnwAli8Aw$Ri8aG$L!P!ER*<Nd9=PeEeD^Bh465&ZkCbqGqMcSay
M<XlZD 6X<>k*YF5:c+nYhKX\PbkRh*6XqhZeP/45L$JKWqiwHL8Wk$qtWGHPawG5\Hj4H5Qeeak8tnp?e%FkW$
M$^I/& e+*F$q<AAd6c4yq4LSntiRB!qq5MEAM/wLTcq*luk8t&aV6>^LR6CTBZ4hcI8>8JjnL4%%mI=L^D9YVA
6$/H>@ R*KhImKRwAlHwtP>R$BG=$KDt+LRp>e*#$Pq6F\Y4kAw?\Z\9KDY%/1\A84qbYl*^&+nyqQE59ntX<51
VNKnI+ hV!<YaZ5%4kdKPW/XVhAaDBk/pPbAi==M8QX<^4\Z&BcLmm*L&idGu^>w=Ecd8m\?HPZZj%XtDNR&&1d
K>%aMb EepFB5I1X#N!aJc^^J*IiI1M#dapNKc$YaYJZ@$19kIWA1P6mSbhZ$Z!B:\iZu/^W$H<D:%lEht?LAVi
!YD#Yu C%mH?t=D$$=Xu&5$5<%Xw??&c/T&L/<P8V6LbJmR&&Q!D9:icQ9kLenXdSld^DhDAK\T*Ciky?58FJn$
PC8<G$ /5F&1w\%Rwe?ZKIC1n:MeSi4@JV9GPeSa6VCdm/*5AX^#y&8^=h:hSB\H5HS>Zw!eeitae4IeyF4:EZG
m:mqD! 4=l<JEAHeQqtFjEHwYRXBkIWCy&8%/<ARVI#u&*BXm$!Na:YQ^E81?SmL*<BHFndkkc*S6D/:I%S@Qd1
+ER#%h EEHFC?D@>c&@XhQcmq=N>61SF=8jX8^hd+C8Ra@ce=N+9dR/lC^VyuTYp#p&R!eJ9aW6QlCWA<d\=Ve^
c1XnJF Dje:Vk$C8\LWhDF8=ywL8>Bh@ZyeG/&Nl19GFRDbc!M+kDuRaaP>6e>IBN+MF@GuKHYKn&PWTG/%lEu^
-Aunpu 000caedaab6001202b3 Page 284 of binaries1.zip
\il@jQ uYIFC\*85kdAL%PJ<\&tEle:YPXK^dp5EGR!M^^+:R8=b4bil<1&@1>5Vt@Yl#GkbHXaIwP9^@<*%NCa
dlZt+5 /Tk6ipL&tBY&:dbyFLHPP6$1CS=CyEyDCDbYq5qi?Tlkk6$JQKmScBak+:$!wtbA=#jeBZhQ=l#45y64
AA6u^e Zl^^b#ICpm1EeY&+NS^8d9+FlQ@c<Q<A6b5kpDk\M+AYAWYB8=@1!Ca4=V^MY1*CZJRatuDZy>@RC1w8
A%*Y$^ %A6atPpCu+b!*1IKDd^%DZMiSnkF!=ldt!^p>jpj=h#tjQ!nmel1%bh$Ydki6>RCG#VGIBV/+#CqcLTL
XJN1ZT @d/k^Lc=4%yq$HC#XGK\$M4lK!hX!1*DA1Yeqth>AY!nLHieT$AQCD<Ru6kZEDJh9\R<@H1$wPqu6maV
J^VHTk <dBY8\JC@?XjLml=ellDX*>N>u#Aje6SdG$Iq5$c6XX8=wK:BC+PCBXbLH4ABBQn8H+nC/#JGI8dIJi#
eieWmu <ICuByDLF=yMina%:e^Zeuu*>ZDCkDA@GQ+AVF$Z6BYkqW/k>4Sp#GT\KMGw>L6bpG4V?Jjk$MFWDMM<
nKw4%b PnCmZ:E/bmh!nuAdT6ih!wA:HVBd>u1V/a?VFSna!$^CbjZ<?t8*Y44?XD#S>Y/#hcb/BWCP*mJV*nR<
wBF?E/ Wu9qGekE5L>F?FKWPZ1CRS8#dYLmt>SdtmlZ\DK&P*c9%*EaKIQLFS<8K\mhhPY=ZP5PNQaV^Z\Vp$CK
Y?Db:l u:!N9@+w@yHd#@i:4&?>JKHStS/mBIWn@nFkTBqpa4=PEhckT#qclX@hlKWAY^p9kXB+lp1bwdSZWjZL
+jR9V= 4Va\NMJ$y9Qhq6yRiR!WG=idibjB5H:nNl#lthEEIZ\4@=*ST@wiJ6$$dBZwjyby\4dlkFBRthYIl^mc
pHN6mM \cPZ/H81bmD:/&By$G=#&+M4Ck%1YRFnQke1FK#D?YaSZF!Amub#pj9R>c?:JHPC+C*jjS&C%AibX&GD
aH/@Wa YH4>qYhpY\X#*Ekw+6EE+5dtVR185XtD1q1kC/wdIE/&EIqaAXNmYkEi&8JPD<V=SaYZan<:kM1A8G\L
81cjFT <L<ipe^+5w=JY&iGQ&CSbl9MXNHlESp+Nu\6$@ARD=Hu:pIJ=ymBG9VWMD&RBj5I</G!H&ZqeX^!\:TW
%c11ZS >Hd#@V*IpINR#>Xbj*ctH8FVM*/qwGQK\ikq^HFmLVLTSbD==SubM%k:idy66+5R/bdCb!YaZ4IVj#5J
Xe!y9/ tV=V!h^#uwMX!tq/P#R!VHKX@Sj%P@I^+NpKaL+PS9bG%c:8F8LI:ZhdlV@a&tH%ddcH=#qWqK@Ek%<#
9!%ebc CX%khe%mu*aINNaTZ1:Ty<LJ4A6XPe<6LF9XCYD6dpVG9GY!aMd4e:9>eeT*bbnhjqj9Rq6Y+^Cc59=u
NEjLcb IX^:6*6/>BIYq9:Xw<u>eyw+iGI<mZBW=8nGQe\$9GpM\W:kB+i/&GLX4eK1*MCjAW^:Kw!MnGWZde>=
HTn%SJ EeL^GA65nPKC#k&qw@Y%WSjp9lZGi<D*N:bi&yj#9S151Et9Xn&Jli*aBuNFhlEKCC6pM=mwpqK\>JNW
!Z4p@F T+%ljS8^AIRGE699c*4@anmpDILMN<GyiBB:^!>*</&AXdqd>e5\Q<9%eB5k1nj/AcIbAKbXYBhV/eqZ
hD?#w/ =\n!DcAa+:<$/hIYbPDD6C6uCt1H<GlWp\A?$@d\j:ZJ\XK%c%6A=Aap%/pWwP+uK$APZMl/jVWinpaX
Yq>cp9 &L*W%ybY$A54c#6aujb1Lc\ly9aySdX+<IlJ=MB/CTwLiGyDLVe*Rckk5bmF@y5ybK^Kl<Rm<wF\^9W6
=:!j&i 9D#<#b6hypqqMQD5a1G%WB@F6Z1+>c:i:c<j8/D%yd\/ikupZw@nGtZEqptS\!A$Cym+DY%5aw*Bu!1D
KA/8>+ tcFKE5H$>h$F!a$c%5J+Hi+m4Di#jXpd^X5R9<kb!$\qIPTWc%F<cFkd@tY@^WMiWJdC^j4QPYM+HNba
^S$9RL &cJ<>!QTa=:ibE4CBKWK1/\!Ej\yJ4?1JmMwBHS\blBY=pRXydB+%:dY+9D6!GP^=n^k1tNjAF94$ZB?
X$P4YQ NB^>FbN&mb4V*jwRdE%jBHmInFudy%&wjSdi#TLWB$qFRpK/6Pw$^%hTkX5LTq4tZnFeZ>5uY=pAcb$b
aSdl?l da&&NkQwL6jZB#+P4GKl&!%lHSEMDd6>tbje4SkM\#Gw9W4\AQG#8aH#qSp+eNa?@pMd8D+H+^CA4dB?
@apbTn !6nDNpNpe>\h5eu:VqESC*!I^%&9%<QRA&ncq\eHDK@5I4T&Q11P%1LlVAZW\nTti*GNVL$+1nF6Z/dJ
91^mGR E>ZV5t!\VA14DM94kq5$k4V!eKWqinuyNk8D!M9A$INadl<9=^HBNIE!\=kd@J$KdcB$aHdB/:W6TGK6
bYtM\! >kIAaIFd\XiHY?>m%t64>M46VytpXtQ=u^t&Pl^kt!bpCb4n5F\K*#T+5<Ahj/w4qwaFi&X\F6lFSQ1C
$CNK5t P%nd&1yd*Qjiq$iDRhB#RK8?l8CpYnN1JkA95\WZS:9W%+8e%HKt6Kc^\PdEYDASV9X=\GjRnpwuEK@i
WP>dXM bI:VC&A+CkFST466VmqhS\D5/8JmGI@iB1YPa15e?P$L4c/5%haRJ>TMZeq/GWC<6c&LZ<P5VC^mPV6B
w#<l8G JeqAcIbulebD66EBRGwS>^wp6FwKnhM\VDu+X<6t9Y9dyQYnD>ARK?X:wHTZ%hcXWB=kqh+AEK9R16Ya
4a%eq^ inyRK%&RDLycX$h4c&V56W%8MuGDp>KWl<>YnkyTdM1<ymM5cuN9A<!FAJmMcuVy\VnB5FmiI9iR&<kl
Eci6DC ctp?NR4DtAq+4QECnET9&PwYkNWu^qLNkQaY8wPLc#e*!Xj/Ew5qHVLJ$tuk1/LXAX6dCt9ZAFR&1/G^
:Pl9Lu EBD=kXcHR^+yM:1ATG6MTty4Y*H>db@F6HIJyFckPSekm=8%mZEAckj5$=Z6$Xc%Xw^pcGVd6q>JN9Xn
*BE<LS tcIFQpX6NRB:tXG!CV:l+Y/1+myJ1>V##NA+VnK=we$mP$*LjTcEIYbXC8nM?PWA\9=/de>akmV>bpH&
9c!$cL X89XLaNEE5k!FXSYSR5k5t&Bwae5ENqwNPHE/Y\TG5%KyT5KANM5!w*Na$WAIlaWI9VNbeYbYlnZj<n!
AVh%1> #V&bCnBCXMjG\#jZ\Kq1DMPH^S^TbM*ItW$KR:/pqlSY+ZFE1GAnE*Ci\bB+qaF^PWk5IP8b$#BG\EYy
b&JVl: jmMTS:XeW%!9d<Y*8e?SuJ\cTGjZPIBXCa&dY<MS@JNStln#u1YCQJdk^%K$>$GZcWMXtM!BbRAII%%F
A=Ibw= tqyMuhBqye6iGc#Tem#:uu%!GA>Dqw=mHTQ9qnFZbiX&4Vw!=p&9^&wadmVG<uSQASEahE9&t*yByiK+
h/TBF^ n*mVQyWkewHbl+t^CLTDwF/!Mq%XQF%EkIhFaXGjByT=d/V5NqDXctq*NS1t6ty*nAXc@!Al=LhATG@j
KaMd>w tAMlqTa#GJtAbtYVWGCB&SpBFZdI\^q8jA+mhh=SFY+M/uG<GZq:Mk%cAYI$1\*BmXhFGNX8G:GVKhP5
wl=KDk J&KR/5GcHLI><*JjJDCuC1GDdm=cWPJ%GDAd/\WpbSwhK%C=tu&^qNWK%:c&h1p!eKk!:RSWl^uH6qkJ
dlHIq# 4R&4wEmAwEYVSY5D:!=FY5>\RpWVwnk*pph<k%5t#D/bjkC*S/BlV+\5:SRL?b4:al/RqGdc<y\:Wm9:
cbAH:/ WJR$DIK=d<\kT41=il95:/qmyWVW^GDjYAF*mq*YIR$GMBnX+TdhBhN+#aJ$!ldYjSc?w8\NtB9YlbcL
!dRJ=e XApSuN#dn4<H>RXBHScY\MJDeLYd1/YwiwiL\kA:wii*8ZZHZ5YnF5Q9Pc@N#d6XKAWp/$SP\+K&p/JF
c@5D6D RFmE1K#:blI4$nN=iZY46l5W\TdAeL#SnM*Kn>CITtua<6Y^5hA&!!#Dw\t?wmaD4^:#AIKbFk*wYt8q
1c9JTm 161!w+EAbR:+jARLNe%=<G^mFt^F*BDF\l4LM:&KjKHdLy+^%>9FZkX@*4%lGLJZqG$yi:@bpddjpwuT
&Bk:$T @q+pE?u#Y\%Rh4VeNqSAkYZ$K*%kM+>\MDTPtRlt@PqSNJj:c9A1yXH>l*9!1d=+6THPb*8ZlJqNZbl@
ikk4GL 5j*eQ*9=D/1qZQPCh91=N$/99/qb#=>19DG9:C/$u6RjA88e9pyR?tYtJ!GLC=T#9Ma>jK#AecdC!?4I
laHFhT lK:DS4AkYF/9^:9P9u#1V%#>ijhCA$J#Aj?>i8uc<&jiiZLX!Pd<*Q^9?LPNa5=wcyj%J+4JqLRXB+E9
=iFRau Ej1^J1FHp<R6?mh>bbNaici&tXpa!pNa*Y#DhXYtEHHQcBV9a54?R8PTQF>+*dZPL+m9cbjc/*>WQGAa
hNt5hK VjjN\19Q@@H4?ut6p@*Pijew1j^>VntB<VpA6N*RZHkJC?aDA4NpMnVLEbN%iDdqIh55a/Yb1q9Q/$\:
ycY!Z4 81GeIW11VPSV@lu*N\w@?JZ=S8@Fy:698m>i%%Ln$=9G\9dbaQ/=j#&jinHjcSyFwhJH$#tlm*c:V<MP
w:XjQd $atMbcmEmZAMn4wAd&N:wjG\1aA&>>q$HqpAHPlCQ&:Eej%h#Qpuw9u9F/:$@?l=:hKjdj#dZP=QV:Zi
RpSFEm PXA%G91dC&ii@*d#>i*8j*:KMHYD+94qTFt9A*A!EMPtM9m4\AyLMAi5B1d6wpe+RcPm!6Zh969X5%%*
Ey8e*e AAe&GGJqMYQjQdZSjEe<@WL8<tQ@@w<L?Y?ut?QZTwa89yb:<4tT99n<?WjtDTNqPl@QGD5#N5JNAPNW
qwp8bm GWR9tcT\K>S8KJVnWWTq#Q*CE5A\N*pc16LG>BjnMASCiT4Ri<?@heY>Yt1?ecQ^<pH^Q:Y!^dt&wR*i
a=p4$* !j*LF/<&Zq99u5=b^muDV#SEDLm8DCdeSljL/PEF9AYKb1QAGmCa5quHqyX!MJF^@^?=@V+<GMm>Wc@H
pm!HMb Si:i>ih4q<RQ<p@@y96CX9@c$@1@Fw$@#:YNX9!!#D^Zjj:yy9luY5yI1VZ>/q^LJc$kLI55W%/ui^5E
wkA&c* pPCnRJITwcCK<68G&n\*PkBD>B5HY+YFAt5\Vapwbt5*p4>T<M<a#:6Z@ulS$&:qZ6%dd4#be9<<i>VR
VEV=a/ T8></9Zu4:%+XP@QQu<KiIRL?*5lDMGm*Y=jeB9ee9SB%AGFi@RG?iyRc&PE?i4<LL#BQ*K:*:GCRX6c
u%AKcM <uwe^lYT?d4^9+y*uul%@a#lQ9t=%>:@<<>5H&<iNW:X99by:Vj?hQ8wh85dF%+%NEZtd+eT:pcq!m&@
DFNY!8 !>*IXBp#HLBWu4/j5BJibBc?#ZKCpV^h/QqGehA#i:X+/&&AT%c@%Ykcc?Ht1Fc9nZmMd#M$=t9^$CkN
P=WP4: /#jZEH*NtNVHm#MK*+GL*H6HuMS$By#*p9J%8qbRbZEM/1EdkX<yM=@bp6@hSK^kqm5^4E+ZnLhH*G:e
ClmkRL HJb1\>*XZWT\E#lDE9Ndwj^WY>WE5Ebb=lSm:#F1eD^YnnNZZG/*/YFu&%dQ+wqCXlwe1TC?NCWLk/+D
NFGCeM !Fd!QJd8:Su#<JTqXRSmF/5:hGFTuWjNS@I#19cjy\<5bu:BJy@i!*CaC?:#&=Ym#bQ!LFVppaJ>!i14
Wh4tIH \>hD\!#*HJ=qiBjeDT4\SS<b\9\FdL?uTQlmKJ@?Lw$k+l#LB9y%IeM5!$i$\eQ&KkHe6luq1Pwc!TN!
JKYJ4@ iQ!lRA:1t^\G:h1KhB$/PiN+<B8*nNCd^j6CY5PpLw=p@C/4C@N$qkBTbd9#w11\STViN9nPAIupjeDV
X<yAL6 eIAbh8mpXG&VPmt=:Mk@m*h=Q8b1LS\>:!J$uYY^whei\#!\p1#5X!JY&4QYPKudbcZ*$mdLmE#R>cdc
!8CEuZ EMtWXYpZW>qH6IWCIKuD:Al4:V\/8eFEH8dJR*qnDWDBGZlAYm?I4J/W&nyAeDaLTu!uW<a#9C!5&$AS
-A$GTd 000c180b199001202b3 Page 285 of binaries1.zip
461=db X^PI/LR1k=:@Gpc&$8A8hMB!TMe4E8kw&wB/EP8A/aFVCal@A4YLY*GKA\Vqqte/JWSVZT*L!4ab9$La
ZHKL1? +D*KLV&4a*kDkB*y<^\%dF+=<iI%WanpAj?c5Xw#VMB+J$iVeNJVSWBBieD<QbPDHSW<i?Ry*M8uXiu*
iNbMqW ALHCcn$iikQ9Sn!KL+pe*EKY^a*M$!bHM&^%tDQ!D@JwP>:Z+^ai+%TXhI=XLteBTK4aYGkXJNQH@%k=
RF?\8L GDk/=45>TL=uP@dA<RQ/Py>S$<C*PyZi1B=dYQ&%iP595%uNZY@w!uHb\P!5#8GyVknbZDCk%TGM%!lC
$lSA8D BjD$l5KVFl/8h9=Y5CLqchG5t/WA&YYdiTjQXGhVkn%=LQACZ>bHI+m4n#l=6>HMcXpiNyPL1pcH!Xqk
+hLjV! ?V91mF=1MD$I@lL4im<Gk!w%n*Z\q:k%4$+<PhbAWctyW6APJt841tb@MPAlh>ajXFn$hm&8l/^a*R4D
/tw<C: T:pt+y%eT\t>W$d\#6&GkV?T<>Q4IinLW!^EZTwd*Ib^RMYLjMtD*LJEcESB\5IPI8<l!&d6y#wI+C5y
eqHH?@ kqE=%tPl=Zh4^NKBF&@F:&ybul9QehN?95%$VMjBZHipKmeR$+Q/9$$bt1pEJcMYGYe/n9&t$QNKCCyF
Hdl<^u S>Y$NdtdnBW!KSGh=QT*lCYLuhn:JA#y^Vm?Veedd>%&YXklF4m4Z*E1=b/umtJ9TS+h=YT@^<5GH4qc
Dq4%T= LR*JRi5LYSc?1\N+Hp<c@myYNClVcm#LREDe+b/yXMF&I5biydhXC^*j/a*m?Dh!41:DGpIT9T#V?m#!
/dZ+mc Hh^taZ<\FhR4J\4$AL+NIL$J9>t^Gp%%b$\=<MQKb?HIIZiiZ\b6uVJQpQt<CEE1WiYFC%nR\Tm8+%&L
CTJ8ti c*H>HbWK=GEb9K>9Pe^uaV=K#h\$&AiBwZ^p$N6e9epM9GW*tK@m#ThkaTl@FTI1ten&aQwJhAh?Gc?u
AZI%JD JMbumkN\Aql*M*AG%$in*ZW*=#a$*yWBQEZnlhiG^KTBXe9Jkyb=IDVq%cJ1B5S%#E85bH%MuWCm8LnM
+#+pmc Y\$<qh8%Pl/pBjQ5!YXwmR@VXG!Q6mCkyl*FD%j$qlDMZ$I5jS4GIJtJ%>pwhjme+qWk4=Y&+C#c69et
p=4wH+ *X*A$:kDhY:Zyc9\!&1*\tdNd=q*dHAyA%1k66Q86Hl!Cac%F6h9A%MJm9e<cPQBFD^qlNBb!5mjLTib
eWH=d5 BT:tj\9*e:NYW?eJ#icC8k$nwFV^5CWAT&B*&nDlkWpnkQdB%KmYk$/=DXN=6d/%G%nBnSy<iWGwZY\5
!k>IC9 k#4H=Q8*bDSIF9LLXINnYJ@iEMKyK8X=SKLC1uHiV*AMMRTVC=aFYK*I+&$j/ucWJ*81GY/p?B1<8SX+
AM//J\ Zu$WZ%:ZSYLWcF=+@WYFq/n+/m6VZanp?R4p8n11*wTVc4i:*Q4FktKXtTbt&kV1aHkp$Al+=qAtq=lW
un^d\m iJc6=\HZh!@Y+^>/qey%iuk*q:k=%5ABR6/T1RyZM%C4?d8Q1kIIjL8E!B4Y\:E9JKZciC!<?n>$ce@K
cKG>DH dhM^iR:bI\QXnR^K>+AmLKiIIQ9J8L:4h@\9\4T6N!p\iN@R+iq\pFjB&p+Z>E5mT^P^eLXY&!S^RJ5V
XD#BtC ?VmLItk/G*pAJbQZ4*TaLR+1QEDnA>P8kJ<YT:u669<h&nIRW^9FkEnp*IB?N\*i<l/S@t$=t&nhFbd>
D9JpNc \#9=NuQ#XC?nBeq/LBkwhi/*SFMGlticl5<1aVneJLQ^1MIDSb==LFw8q9B6?Ku4ej!84mS#Dw#k^nN9
4^NAeQ CiJlpK#HW$ZKWA8+/AMX?M=cdXnqlw%#tWZdQLwj!5Z%ZGFk\NXnmV8S<Yt4:jPkHK$aPRQ!!uBj:Sii
#N6$Yp HQH+YXDi&wKtC$AGcAdYL/IDWkiXccNVjmYSq/<eJ4j+TpFyiBQ/aLe6u<c9E19dF^aKakFYyR$BLWj&
V@:mKw p*/up6!w\eyI!Gi::IANEQwtZCDh^qwe9<Q#$uIPiqM556R/ZXC*<KTl8FMl4bLR8LI$<K@YSqYi5G1d
8h$QVm ZY:X<4+a&X$9eEQWdkiP!W&CenCw<L^uJE>D/t&u*cdNN8%L^:C$CAT9R@8dImuL<YA$+EVT@Xc@yVK1
uCR%Gb kjIEeu4Pc:qMY%IiDt<Y8hQwtV\qTDiZbVtPdbqF4P\eK#>>\$m<&cNY8<eVu6#1>#yjtIeBHjmD*qae
c1=i!K 4yPd5#RJH1h$8>^aZ?RFN=Xya9H*n^C^<Ali+F&5X:q9d*QjnJNCN%b/$/NRQVkt^#ID*#dBPBy>&BF+
&9dC@i +<k/DI\GB>t<YA>NVH5SFwCweIdIB/I&&=e69e>nBJZ!XEP?\yPaDmVn/uDLXERcN\&LTZTXkt#d6qZ&
na/8/= I8QZHABtYAEdC5JFGkRtjHqHucwE#46\I+^9+#%8%PM>Gl^8?9I8k+mZ<pD$RctT!?u>M:>#pDaG?5cD
4wAMG< njGwcph6#dC46+#@!qRyMhQkMqpGjQJACT##VS=E#Yal8Bp5aDu^?AFE6>FTWKe5%Z$k*d:M5eB/$bjM
t&Am#i =#lVh<mL4KBEeHP4c<QIuIGXNHb9G=4F4H=5L\INi:bB*E=Re5V4&h\T=C/wa=ZLX9h@H5XFcBa\^w6b
w$<pV! P9w$^B@4N/i:LXhQ#l:FCCGuaPbLB!ZaTCAG\NIdDc*Ink*N4qZHl1b!?9QRhY:pkMlwpCPBNGw5&XZq
pTq:Al +Kdy?Vi&+4jSjuW6jkiBl8d#l4aM4#:kuSEMBTBCmeikckTHCB4K>b4Je@\iA6DNQWMDmI$MDYk@etLn
1BTRyV M&w9!CtTh$T*^G&e$@cA&Ad%i5kP^LB+hWBL!A:I/?dhq1:#SA>Qap@B^beaPSLyBn$98By81nN4nqG4
PX+8/c 5j:c9tNEZ6#Ptn\aAP!Q6+/eE+!q8KDenuPeF+>lNTEM%<L+ZSc5K6ymh/ty<>/XRwJey?=?61YMj?R6
#Aei:c R?:54THQehmGZSwPiauRHiPlNkEZ\#!jI6iy\uF:l+Hh5I1Y1k=kwjJ*/*EI$@Vh4jk&^R=<CYYt\L96
=lw+?I %ItwPEkD+W$NHDBm:B!GBmK?p1YSyaIY^Q1%/t%n%8LySC^unyZmV9qjXLkj^%%XEknZTjlZ4I^GIW<B
:!h/aS lPwjH5VJh6hh%9+%iS5b^htjH4SWyc\HEW<BC@VC6<G>N89/W5QNP<bVLD:mIWiGlbX!B*?ZJE@m6%q@
hqJ=Wm wFnHD+F@FW+ZAPb19X=WwBGV#8hdYM\GKPRtH/<+t!LjS%XX1XSH\eH\m=5$MT!DHSwqmM^^t:nCaHDw
JLjw9t IC/6aG$Hy6i^dTi!qk*FRc+$I5++nmCR*/qlSdGe9Mw6%<mKLID6H8Qq/YJ?NbauBm4YAE:\ue1NNb=n
H^QVn> NC^Yct@!&IVXaTKFId&Ku*8Sh>49Wadd%&BeDIiF\R:>SiZcX5mcuhP%YCFb5LPdd:Lwq6Y+$H!iZK=M
JkVDKp @eYZM?y+HF%=lhjQLNR5P#FtStujTINGt<pb+KhP=D$FyZBwKnCScc&C&b#Z<K$mpH@\Q<S^ESS1X:ji
186V1\ qeuT6y1kp?hlRGu14lZ>E1MZ$lq%iPPM9LFyEV$a=l+*DT$iLb&^+ScbW8ll8W:%iP%Gia%bNK8$CjTw
Xd>tAY Lwi4^TG\$j4k+qeJaBd:*b!/DIQX&uTAmXLA$=:kj5j$uDap?8%&epRXe4wJ/iHJ:Xt4A#@kl=+wAtuD
<BTkap eF4!B6VEcI>&P\^5a*@l&qaMP@>tc^AY>/F@E=HY5#VW/WBhXKIqY^*HBkEDw%+9WEH%NeIqCISl*&cG
q=PGyb #kJ^^M$E8@5!b*V59E#Y4$S5^#MK*\YTRRShpFjjXkZpZb*Z9KR%\SK/hAKBPNeZIkKI!m^9D1HnZ@kn
PVupiX wNup=G*:nuERK&WT+jDCKHBpV=:w&d=$#/nbc4bCt^AB4mBWYBk\n*p*N?FSD6aYDSJ#?eYR>5F*iNTa
PbB4wi GbG&KqKCw\YnD6pE8a#yMaXFSIyJ9KI4ZdRH61EIK99T\eJX8AG4>TnuKX=Dy#Xb$\\#ZW=+>CKQjYVX
qeqw^^ ?Y<iCEGM*@wD!CD4+T#85M^*cFZ\SN8KQPb+^@LEbcu4C=aJlVBZ%##jRQk%YI5*Jath:W?*?DT\cQe8
!hK^m> KdGZRhnC//a\R%buJw<4F6tH<GAQ/&X#6/#D+:c@pCi/dqe@e*uBN/#T$LFLWFK@6lYYQebYm#\y4Yq/
=9whX% Vtk=X@u1+K=B@MJl!jPDFZY:k4wp4y5:#d69dP5Pe:at>!tBq1$iq6*bp#A^4WLiddViEAQI!WYXY\9p
&:PtGV DT1T6!hu<4tGSpJ!4GeW$:nPWeTWiiK<VCtbeb9\>y#EDI&DdbPFF?SN&?u\6A!@h4Kkh%%%N&XDc#M>
+NXEYh %VbWbtea**cp6!?ZY8wmIXkqAiapc%atY?A6iZRGe1&PPI5VJt*8+Vch4<u#4J=m6YZL\T$=t\i=nX\p
4DRTkJ Hy:*%LFy^=HPt^i*RmkknP1BQ1@@!&Y#QJ?y\QIkIimLT^Rk8N!k+\D9lZKlL^bW?qKhXFyp1R/b\#5y
B1KL!5 iEjYu9^$X?>&5:#ABY9VMtkpQiqJ!5C:BDMXhiYIeJ8=uDy4t%!1>q6HEN%Ca\I/EcpTRqyDhMdGATwQ
m>Ai?A D?qSc+^Bel>dy68TlY!Z6=weh4MID+D8yFQ^1Dh9P>VEJbd?<8yiQL5=9ZL8T$j8$8IFSW5F9j%e>p^p
qJDIDd #&QJ\BuwEP&dSXimZB=u/468Q?j19Ii51SZc1=G=mDB<EQV1IXN:eB/<u<X6<uaCLhe5*Jbyp9iFYC:\
Ny+\N= 4D^9!Sp\\J4S5=4wVNTXkR9eh/ARAQ^G\Y*i#kXH!1P+eVdP/%*natlh+?%!qYa:jy5JI6u9N+Yd+>HN
w?t:/h HG?yT5VAPRCmIYeESGAPlI>*Nd$P#8\dB*mlA5IIR+ZZW%qdWeA4=?dW4dLhXu$6N1wP1&VjQHN^X^Lu
hGGjJF bun9RZQh%Zq!Q%t*<mME>&XCIjJGZiLTEM%eV+t$SYl91nN\J5TXklQ*b%4=X6dqpd=QF9R#Nbc@IjmH
Ck\*ql GZX:aXqhN=uNbR9=BV&u<$#tdb:^bXS>RN&S1&/d^Y9lhbal&Lq5%#d5^ML^LJabG:!^W$EhVnjZ/4b$
54j6N\ aCC<ei=\5>A1%YMYGqZw\PV%h&ueDuS=VYwVYKLBM!lVJ9*YAeuNHwS&9H\p1CV4%%\wYQ5RA!+eEK?n
\PL6%D &j=kX+y?=D/5N+T/JTZ9hu9Z+^Et<cLBI:+eXJW>!Ry>RRhp!hK9Vuu$&*F\S6$eWRc4K5qiM!>M!4X/
a8!dPD 4D4D/uZk##5<w8<VDA9?/ad/J=L5Z$MBbRMWIibuEp%KCCu%XjA6FC8#Lc^jq%i!XEmR8mX&$ME1Rq&Z
i66jA? e&CWt&5FS4KC6EYPB?<>aKWe#>@CI88<W@FI6kF:J>84LFYWjyFASCJtP/BDmbyhpKZS1GK1At@S?b&H
RJF?58 5YIhT4jQ+?5<M6kCB=bli:8TYBPW<eRt<JB/EX=DlnkeqKY!GHe+K@K<G@KMAj^Z6AN%qh6EH8##!1<Y
98pZ*< qqDhEF5a*SYMPh/kbQNc9>lHyKF&RZQK?P1mwP1R$e<py<M%*5jZkBALwR5Y\Pk>wY8/SQ#Yw%Z$HZW:
5IGnqc 1$^eAAAR\wQ%Bm>I/a=p*FJMT@Mt45mjR=lhl8ML=Tj!/6IjLKY1eqIbZNNY\nP+I#XiQMEdC:PliKLB
QZe$IE C8\?IIdDM>CA*\M/hPyMn9eK=HpiH/TNwTbyFak5?YYElZbRLuh<c14Y=?XZ9Jb#8cWPNDIZ!?8IA?<P
%dIF\a +CLQwWPP%Z$wS=1<bKZLaGNV^c1ICn!Yn#EdCJ+%<^B++jIt$1//cPpkRSD9H!HZQBcBaetVP/bb?Ini
\awyPF !M8w\tCAq#FCJ*A%u>hCpahMb@9hRk9pq\!E8?Ta:AT1@n\HVub=Z*S!QT9C<:/1IK&RZ$+t!X!48+@h
-AAk4L 000062e72d1001202b3 Page 286 of binaries1.zip
tjQ<CB DKYcN!NF1mLK$Z!AX<mI#>1#LyD?816B#J1SiJL@FF\i6B65Y4b91t6VK1wKW6Qhd4:L!+kEL!!i/$6%
y@QTF! n>V9yHlwMP9=9ANTFbihaK$F:?X66FkL#ilKAV*a%n5!t+iW6QD&YZW:Fqck+Eb!1hCTX$*j9p%q+/$L
hCL&!< /9LQk8!&em:91^4^>kMXn/eCP@LtIj8hMqEaD$?&iB+%Ek?y*CQacucK#B+GVBVQh^eA=b1ccDTT!?ne
iR<iT? l@DcLhq9Dc4\!M\leHjtIF/+C!:VYQHCn#F#D/V8K/p!1F9\dPme*YQ+A*Q61u8R5!/*4n\$B&$d%JWH
XH+^uy 5I5LjYWa+jb#pM5+>#CAE^^J6:DiPGP%#YK=S@>%wP5&>V!9kqCwKYyyp5e@=%y86/8aGQSIyM?!PS=9
NPPncI n?V^48:CeVjWbe1B1mVuleyP+N?S5?9bZB@iEt9\XDPddiw6H4SX*IEJWtq$YtZiMkKG5HbF1EPCE#mi
R&!tdp 9t#q%dL!Wy==ZnRDJ5LDViS<qkjEME+/E&?iacQHm>S>jw6*SKtdmFPNdKVH<kC$D\c&aIPFTkRY!D>\
4IRCTZ DInDneRlq<j<ihIjLZqXVbM1k<In>wAZY*QHW!GWLk<!/L^wMuSt1J>iyC^tD6bj=?$MpVnLP/$lu+m?
LN@FlV =d1d%Sb/y5&eQpT>t?Q>pq%wIFBhemESiIG@C:\QY%\=/BHMXm!1NhWReL=@yM6dPlDYe4?APXVQk*WF
5jNWc$ $wVQJndIcL#@6/FywR/8Kaq\JiA@:<yBQJiFVwA8hShPGt@FZBEp8hHuPiW4!^D<56hYN=<VBPMdWT5N
\SYYi> D<LWK&<clB>ub?AH?\CL$MG<8\iqkPmAj=G?\K8XtNYDqQJ1WRpH=EIqI9&Im86c?AHiA+6S$EnlT<5i
m:G\Ei BaNZiyWH/n\Z:+BjlC/4^DQt51J!J4AaY%Xw4:8AN\lAVth=\#EDjkwNlKNLA$kT5cn<@RIFCA*B!TF1
L#A6u* bAGQ/*d:/*$8^p5HHR8ilNiYhb!iImVhqa^ubuk5CCF6muF!#LSuX!ER$e#8m$PcWHiP6ky+eDiZa*d#
!M:eq# mcDeTa^&F8cil!AWVGG^Mb+I$hF%nScP9@ul&F9H*44:8^RiT9$uj4uDjd@d+W*^:N@@NR^*@%%+Z+l$
!J4QJ$ GI969^db>\R?:Q!%YHlQmHwWm$u!<S\?Sl>@DNXI5SLGTh5!96V+G@W^k+<d!Wj%#PSn/5GQP*<n5n@t
H::6y* VGP$@VmbcjyS#jV^^/*p+<4H4e5Qjy#<nVm+L<R#j+iyp/j\^$5Q@4mBH>QJ+PYJTKWc?DtX@H^$\m/S
mP$<Wc ZlJm@I8pFW>@BK%#pblbcc#Ej*H4ZnMHL<GWulQ+iiPY?Ln%iCSt9=+ijT?Pdmq!ppe<A#Mj4e!IqVni
d?mwBy uVcjtInFK*nk=C\c+ul<P/G?<YQ&bLd^MlQ<^iWcJT8Au8MVph*kindWtp<:Nu+5Hk*FdA1Ntd$waeLG
ZnH&hI ?Q+?Eybc*wuW6<SpuK#n6C?D9lZ&ub9E9LZ>d6?JWJGiP4eSmZ&$VH8&j!\?ET41b?y+q^T/h8+pLJl&
lKF+wy HYeZZ\bh+&uZV6J%F6Q\%=M5w!9/8P6+KLLQ+Fp^/h1L:!R<T:/V9aVZn*j\iu5^j+jD@X&aQ^QHG/KP
mu%\9b 4w%y%^lhpemtN5Rl>P&IP^m>q*D>dlhtYWbZ/5G8^>GXBl+Bn:ay5S?^?eH8nBDQuWM*bH6tA$!dVL5u
lq@k#@ TjeeuD&/N<CAGaEQ$ejhK?lik1QAq^ya^XpI*!@*y$?KNARy%RDjb5j1Fjit$yu$H^eb>m8?:yA^h@8n
emh$dp H^N1y5?KPj!Wiw=m6I&aMB$*>8<N\Q6q@yW+tMc5DeyHCKb9jN#>GLw9mbQwD6uhkM\?>*H95akTiSd4
DS%!8C Gd+i^4eicN<Rb@Gt?@?CLd<RTj9^YM!AAXjI*4j8:#kYm\!Yj\h4QKIp*t$@km>k:djBjG4j@a&ydVJ?
!cJMBh =@:GPbHiIM8*H&lMjiQB^5M^qDtXcaDLG\?$yj>?&<uMe81Z&+:Q4cVS%4ndhnRY5!<jjD\h9:X@Z!8t
ja$S>< uu*t+K>u+89:<e>FG9^N9n=:=jFuM@EKG<ZZw#kbiPubX=cV69T#ctDT?QJ!hH@nI&nejtY<Em%DIcMH
WHE^5S tnjG+=ZJL#XuSG4n#5/=i<%u:#W*>6Ge?Z9N4?=9%<h5u6#juH=%lPd$6QpbCHjTuB=6^@e*J/M#/ZkD
/GewkF GnS6#1utw&nP5Ft\?TPl^Y>^eFae#MVjm:j=T^ct#bPpiVq?>bidn/utd/D=ZNKen5>NW8?y>lZX99^A
Z#G\q% P^=#emZG4M4j1MieT=:?:H?p?X!<nPd$6Dt1R:YQ#a8#dG=MZh*h>nP1jaZ6!l8^@S\5Yl\#Ac8hm&Eb
M51hG& 6Z1<HawuMdIi%bZ>tw/e%MhnpXtGI1hk=KF8tapc>#J@&W+n5XZJ8C5npct4$PRew8HWPV!:MCi81HGS
WWh*9! 8Dj5tZ%qhVQL&\IteZpHR=il=9tW8BLGwZyFn99/hF\&E/Wd6C@$W?p^wy1:A#N1+Qn8RA&YCM?KJ^mZ
pMQ^p+ \q?uW&IunCiaGJ^Nnd?i+#A%AH@X%clIVc6GycHKWAaMjPZ8\Q1aXGB$tuR?pSIj1aG\La&jm>VPK*9V
*Nw94^ acSkleQwLQB&@+Gp:16%^dn6b/jn#mqK%dmNB<bq+t&PP*6**Qc>eh5jn\M/n&ET6NVGM^l*Wyt>8@Pi
+FJB<D &?G+%N%^K#61ZP:?ejY:+</pWu<%HbiG&RJ$8CPPuBSk^pwD=km4I#Jn5RJ&=/en+eY?nwFyDu\Y@PLA
J!Jk/C qjE!BkJ/*Dh\eki!AR\l$tM%EE?lL/=#ID=Q%D81kjnPPBtZ9V5PRyJNHwl^?uVe*\1?T?cX/bn\\TH9
^J>MZe VajMJWN&@lNDD6+h<nnSYnalEi::p\<M!d:CbeARmEW!=6!Da$/CMI#bWGMIiilNPPbVmS=!CH/m$*pq
D+c*^W FJqjJ%^SPyP8S>!<8V9w&jH@^+BZ@9+Awk$>GjBVwS%Wm<klZ=??!uVIy?+PTT>@L!Jw+blwPkb+JyWM
KSuaA$ T6$hBQQ+\KD$9WGu:\*KVAeSe6\*Kk*GmmjW1QFQE#8\9beM!\DX@:<M\<MWV4k:nJaKW/qltRiH$VF9
<RMZn* VIjSHNWu!dB#<jni1*%AFLG6RaNi+i#bB1SNbCd<4I*9Qi\DkDlAuYRaHDuA%5wPl?G#6uQ@MAKt#L%l
BGjc8> &+RE!@iG*b6#b9u?aRLKty/P&4:9adNa6P%qTMJ$GHR@9bIM&:l@GG#Y#9LG9YFnc8t>aceXdwbAkIL@
H9WFSu !ClauE@iG+ZFYht?N$1JlBwX*jipqZl!:6c>MbD$DFX?td8+pI8:w=dn/N\iSn%LwM*jt=NPBp*8Dw4?
>PtRCM qy!N*+49Dhwk$qPDkPqkLPtBMIwWjn?GCbwP\%K8JMP&qaqY\*+CX/T>S\e$HVZl:?BVw?A=Quq9FNbl
mRXm6b Z+$/CR$H\:HIERiF+5VHa@D+GM56Xu/Pu$Q^?Me>tVmmVTjq1Wq/yBd!5SR>>E@ELKtb<Jhu5ZhHnBVQ
VRw=Sk V14i>@E!1i?Hme5Ba</NFh@9h5J%nCdVVyyGlWwjX=&m<SQ1#@=i$k&%YEb*R*%*bh1hn5Ph?:5u+6Fy
/diVhL =@6\>>GX=IZ9>n*&eh?=PJi+!?p4+dFaKlW%wZiFm*:w:NL!>*ciQj9!5?h&uq*?y!>@H1>>?8M^!%#M
e$JinT I<iZ$w*6p<e=bmu>#dQQneX#5BGyJQJ>u@+J:@hRF1M&q6TwthR*u>uaPc:+^$Hd:>Q=S5!A9=I/5LGW
6+DN^W 9ZITk$:>IRchSKl^h>S:eEQk%>FW>8Vu$/@>wS4%#Z@\#^@c8DSJS1YVWRpkPeIJZ@9DtT@#Ycq9QjVN
lmJ*VA #$jLDdyDn6wBN!EDqCG<jtdn6V@MjZ/J4@?6%D@>jL!m^1YTeZmDDMP8*NqZMn9@:y@uLm*>F*m4d/Wd
SqG!aK #&^l*Pqp*Qk><ap$Ve5u^$8jjYQn+DPZqnIjVhLj?wb+bwYnalZd9!<ijWYFjiu^$8jF>8QQQDiDWci?
:8?ITk >bw+8\Lu<&R<Xb@HqqJnRc9Fec@8@Q4b#*+V+@:B6@:*^$>!*QG:+:Ly%:bjBy@E!wi^l5h?Iy+CN*Tq
^4t<En +qT$VJmahD$YV:HdV!Awtjk>9G5GI41%y$#hw?!qFGhk/paEKilL:!pn<um5w8YjmP^KZQ>I9j&hYIPC
b:AV+V VXV$hj^8N$\mRhY9l$w5dlQTJ&tR9%XGY>8KN#=k:JCI^RhAD1?m>eN+=+HYVGad4@CLiJ!$Kw/1XlnZ
m?=%/d P@Hp\hdqHb1WPQ=AHIqWt8aD#D&tGtH^jny6^JP$qRn?RL5id@^WQBJN%?kDpaYe%PQ/>?Q6Z&=?@%#<
wYc\4A %q@F+/SbAhpQ/EatK@H*<SL1!TV/A?n%HFaVpWH<W+d:CeFJLtZ8Xbmwe#F?wp>Z=P$KFWm#e#8PRNL&
uSyKBZ *#HkVPm=DhAYJ+H\*E+>jkc^@6<^Yp*p<DdBN8NWWDiH>*lD^GN<PXRWnyTQ*b:&K4dZJ@l!PKXyyPK^
RW+wEV 8Z*%j4QjAP@Q^Z<uVwXVpSmLYc#nPIcD+IC=:$EAAQb@^m1BlQw^QKZ&@Zluw5Sp:m?ANlD*@I!@FnRl
aG+R&y iW@MbSR4J6Ml+*M^APhP<k^FQEm4M^:CAER/jE5+:@HQ5I:VBhlQ$mHdE#X\>nXTEj%MuJ\wj+HY%B/C
I1BIu/ jqmJ@Zn&i>DIqSk9pD!NBqMkhNVGGRywcy<LVQQj?FANwTYN!AYKhH$<HVI=y<n+pCi1?i$W<!jyKE*4
:I$XB8 \cVN*B=YAWS<!E!W!Q\ej9^eFK1u#DKp1w?VulS/5Knw?R^/@l%n65tH+9m??EYeumk#1nw?W8@<wVkJ
J5&PX! R88*+8^@WK@c+KS#:\Pj+JE:1uN=N<=GK/y*Y>!BNAB1A4\uubuhPQ&S<4cyh^C1#+*XP8:5eD/SRk>M
*X=aAM /Z6yhmT98CMi&SMj^VM\J66@^iaWnWKE<Z9K^cFDuH&MHcK?w^JMJ>C^DN@HXXm?E^QGeyWdH+tVFM?j
%TC/?L K:XQ\!*DlSIHW<<*QlKQ:1tXwNiDAW/49k#iLdYDL\L?uj9FFP^E=Bk/W*k@<i^H+lNM1Q%CSWaVclY/
6BNytK BA*8\cR4e\8YDEBwETANMTmNdB%me\Jh/X8^&N5Zm+kawaW^cF&B\B#nmN%a9D<Y<!jS9K@i+$QXjk:6
9=d+\B /&kHSI%H++V:S<h1!WZnN5*jl*!^:cR%jS6m5!5!n<bdjCaE+iGSRB8Cn:q+m$kEjD+!RljM=VacX@ni
R5^qi^ !^G?neaXNDb8MSW\I9=y:KnY>Fmqi>D/IeN55Q#\dVFYmb*M5k1Iq<HMw<!CJwtacY6/uLR8:!YyB4S?
tVc/Da G\^/Bh@jFW#*wA%t:*>B&?Ma8b8pMeHuYIp?\1?Q^JFhat1<%R=bSFG?>JE+iE5y?e>w6tHcDmBW!<D!
FbE#Dl \CHny<!QGMat@/=M@%*i?cta@^En*hV&#$V&@^Vc%>QVD<9j*$p?yQkl<!/D&?Vj=it@HDu*R!H\n@c@
dB/Qn? Vj?LtSwRM?@?E#H#\*<mlDBuu9:P#K>>G=>PCqPI<@@Nb#<u$tJl<Z?M+^\cb=:?hud^*?J#?6CdM$>j
AW*DVY @?<Y@\$?#%#5wQ&@Z@^#j9:iG@n<%?L@u@@>Q%BLA\RWAAIACAB5XY$q!$yE#XMaAAAAX\AAPRAAAGN5
aiV=nb cYX8hHM9eGh\L&%la!>RS%BndGqqduSMcYI9e&>%etNqL%BHWGN5cYX8hE^yam=\eG>mLtJyd5^eDbAe
i!@&Z^ ^ZZ8&V9huW+@J^aJJA^wRIBAJpLwEMnHlYN9h$<e8n86dw@ny<!l&h*S:cDhtYXtd8<Pa*VKn!GSAA9d
BmWnKK FIE+^ktFC^jBMW/1+1SCKebPFa=hqZJSFe1BSE/qW9#aSHbSRcL\dh:4uy:yth&b9V?:MpW#e@8t9*:h
-AZwa* 000ff4339ef001202b3 Page 287 of binaries1.zip
lQ^CJV @h:4>%:*mJ!Z&bjJq#SX6+i$*M=K^emSSX&tbicH:$#8qkK@n&>=?V@jGu@qn9/DISYQHj9F8*nHmke9
<a%Zin ITRDyjWVe6GLb:aP>jZT?#!:!=8h??/?*nX:>8:ie<Q%P<jT\=uE+MlaimR^pp^dqtJylt=b!SnyH^^J
TVHVNq >MEX^9A4i\>e#y=GZ&c+q**M:yjj:>!jh?:@\8=Z:GD*:Y<+>#Q5j9Y4#6&yj<$N#q%*:k<=>#>&:p<:
m<Lpi> >^ie?>@BubAL!Yw/CM+I%ty6?%Sh4TwPmVRtybL>p=Y1yp+naZ$!YXV#S@1NtZ&tMXYSmLTG@!AQy9CN
\HL5l+ %NDIQk=DNpA=SGRH8XanW1$&%%K4uY1j4=*8?8Vwtc$@u##d>@%>u^#>@4:=Ytyjdd=S8dX>/#^ye$y4
V5Q+wJ *#\lYI+/yecKSM9D4T*#jdH&V:dYcti:c4W#:dZccY\Q&*Zdl6?Rl8@$%Y1jHK*X=t54iCEi+kb=\DFA
<ZH$HI ?6#SaDqXi@Rw/Z9$adL%$ahI%>\McciqRq4tHun:NZyu#$u9?X@y@bE#yPZaL#>+:hkb$8/W4tPu!hau
wL&Vq/ =5nSa>CYYQ+@ZFRPyDqCYp/^$ucIqdY:YNt<tbA6V^QT@TNY<9@E!t89$TL>@n@PaYqyPZWKT%9L1WN6
@R&\qK $6!l6hLe44YE:N1MCNLe=q$6y>bmPTVN$Sc\NV+*d996y%uyP5QK%4P5>H*Cmm6lNXh&8R^^PiK!^PYJ
y^PHi\ !^TZ1$c!BhcHt+m#Rhybu\W=Y>5Y8H\9AQqNh6Zi=Jj\kpD8d9ACJ>ji4HX$VMD@c:+ZZHJ*nhJ4*SQm
!twMNB C!+bcd^+VdnpSuS+kbMuG6KQ%Bm>%9HdwHe:ySEhj?>\C6Ljy1Qp$TuN8aD?>pR*D4XA:^DyQ=%kKI*y
@@$Cw= hKAn/B&eHEd9cE=ujR!qh#ilP$MWS8>8R8en#Pp+Hk&1A@%5:W$QwNbN1TKb<Bi/J?C1VhBLIBQ*Bd#a
t@y9m@ @*%p>+ZkhWSRpEk!9uCp:kwwcC%W\X9JjLPLn$w$9iM*TP@8>6F*$E8p#\6$IGHHh8\+%=DP1PILRQQw
kASBPq L6q:RiSQIL59?Pk?\%qH*^Gk$^hEP5HyeA6yRK>9aHF$F=@<B9Eb>!K>8#8!Qy<:EnI?n9R^jD=AWN*F
^1eB!d u&lRZ=!jB9Rh4HwIjReuW@u4:9aE#:uPuSQp^/GiE!?@jDjS4+tq$/u6tblj/mZ+Aj^C=!Dmi1qYi!tC
@+$J?V @BEctI?m16>*Z\RAXP@5nACA/y&h+RC$ikRA4S+PkNZ*%Gy:\kC\P9a@BMBlQ4RL6HXGd\VAtGj$SkCM
cuw:Bn iahiD?D&QYRMuL=#ilDA1i:Tk\BPha@8B?DXQdwjkFhu+%eH+Fbu+%<H+FdHZ@tVB?BXB+A>ub%BAKG/
LKVFk9 iHEAZ*Y9jShA4P:%#\WR1@9yDMDZ8k?jA9m1B!<A1DXtukM$9V=1Rwai^NEM6Q\C!ki=bGIph&A@^M86
*j+LQH 1$t5aFSKk?XK!5nhZ+D*imEKy#G+>KH$BWpK$WIIkMm%\6<dYMtyp=cDe>m!b&^w:Z*yNNp5+aZ9hV1F
%Sb#Z^ 5AnFj$q!@Ql%tbK1YKy51TW%d<6&WbYQ1LMYQCm&QG6M!hPcXbS6R>dKFeP$i=#Y?m6VXyH&:^/!WiLb
l1nLqR l!/+Fd*Y5QhCc^XkJe8cTbSK^EFKPpkj?JC5ANIHRcR%D6KIwc5e/lcE\5EtGRbF!&eCWH<alGyLKuyi
6XGwK8 hSu1wTk+ZTLKX\Iwj^BEmS*aL#pIB/e%ud+49W*Pe/hmDbT4\/dC/ZcD/be!^DjQ6:B=l85N5ybnp\8l
dcSM*$ ^KLt8j$PT#ZqRT=%jT:KLRLK4=1lhI\4Jc&k&dN%MEpQS41yKW#TXBXdM*RH=taZbllluBiQNaNy#YwQ
mwRq>K 11yi5FCqE6up1AN*t&LqVVd?$ncJV\CP@%+BLtT<khdFuqy?n5Q81P5aX%hd!XYSJ9%Rpq*5YBT4Vn6^
tGd&kw RyBZy?!EH>>n^mB4Y@ZGaIIw!#AGuyD5Jl9e/i%!T4mRbFY#1yw>VXG8nEc^FZ9K+mk*PadyHYp%R/E\
y%b&tC A$%+PWEC%h?61*:qR1wHdRK4Z1PC9*Cd5LiTW$CmY6+n@<*pZPInpRmhhhSd!b66MMM^!kimEPqJN9eb
%idPTe <@B+*h!@LG%j^6#D/Pi5Tpa9Te?VD%$JZiYWJ6cua11H+iq^L<5i@!IRBQl$Ghm5DGjGyYjIV%\&EZ4L
6\wLhJ kw!dlE*Rect#6\PC9b&A5u1B>6cda^FljRAlhI+De\Te5Hpml/C$EhKPPZNVKjG/1\c$pt1=j/ZLm8dT
mEj^M1 &nQ:MtXXu?J@6#GN+u>&JAyXdLVAj&myMntwbka$Lke<KR<D@Fc>lZIG8LpeHLRue#MW^!TZ8BPFC<Wq
4yhZnE m%?F!QQpC!I+%ey<bmwu/YTLC^=4a4FQEGHie:ueqJ$DCQJhZCWF@6w+BKYKq^^@:PK5c59\i$uL!@9X
!lZtAY YXQVJ?WlI$?Zp>jF#R/+uJd!4CXVk=dm9yaTZp6ADdS$CY*J%K1K4T/$1jBB9&9FB6*Wqn:w+j^>ccZ+
wiFm%: G>WLT?j9QnyXAFE*XR?=W+ZW\FS6\cpcXjTCWbc#1qwIuTbQ%%5i=b1ZL1?\=4YCBb+W@l=*B@%l<yVd
dl8DQ% 1ZZE!SR5e6Cjm^>uNphw+XC?tJ8b8hP5pQ@AShJ=E#&i#+c$EJMimJ?+=p:DLMnVyqKS<^AGtL>ncbM/
@1ePIn nF=b6T^qW4XpmAH!Stt1:Dy1K5!\m8%eTm=\&+H%nN\hP5MdaIbJm<TN>VlqhZl\tL\caQY<KFc*k9<1
&pIF\w k*G>Dt1t=itm155+pcmTKk/GD#&hWmp/EhC*ScKu>d\=Y:FqZb*&iy?dqR91aYY1bQPqqcJuG/D9mWK@
SQQ8Dm PA9D&kScw>CJqCyhG+DiF\Y>P#FqG&WR>d^TKmEt:eb%5PSwl&jbMBpXXehl+t$:De=!=++&KM:D=!KW
R!d\bX >au?EeNYi&VLKK8!eSnnSbkZw+K/b5qqbXdYDX9P1dJTlWqSemWXApm:KAN*e1W$Ncuy%p:BC?d4:u4T
/T@<pQ k4ai4dCn*t^VY\4h%K:Ni&4bNt#wT6=\TLHG?>&+6CeKlh^w8e1m<=q5*y\=ANdGY@B9mB<Zqd%%GFd!
#!n+/L %5FWtm+V1<hM4XJTW?p5#jMuE>p^+61u#lBta#*e!k!4K&^quuMueDj=qD8BN+44b!Q9ZHM<FFuXeZw5
FkiF*S XCyb$&%%$1RYp<$Z=kGWTkWYYaXNLe5QkG*I1TXnG8mtMVZJ*1MAickJ@?HjmA:8<5=GWbtX1FVI><mL
pe9a+C Qu/9YElW^uyVKTiGiFR&ZS\dF/M!yJF9p&?+Q1?LFY%lliYHibIkJ1VZTWdkNW<nIL:<INZuTeajc+Qj
AZAiyl h8:e/a<=WNCCKLh=m^kXR#@K1Fw&111\S5Z?!+pT\PWPSkupa@LIM1KEMq?VIKK=\<YJVBhF4$pZe>hY
tBC*!h =kKYAWhjNXZ+#SIc:uYD!19Ii4hlDKW&Swu61lGq4QaE9Sn\RPI?Waw9!a5l>X+MNEiiE^leqBe#!NcJ
9bhq#J 9EtiFG#4h6\FmVDt^?P\^qt8^\uXqR4ZHRwI^wy<QkDaE\X+Hm/cWK5!be5yVTpbp\*nLqFK9+X4$cLn
wb+h@R LlFBC!A5JP/m%l:Qa6Vd:a6IG#w&/HTk%+B4P/:A8FRChSe/F$GLQbSKbGlwlk@MY6<&NydlL+L6#+&w
C+l8lV hk:CPC<#&!b^R:&9pcH?+R1/k*eJ:8CZX5Ih=AG1$EdK%dLdBIFbC?ZBKCFiq#VKwL8&QKVy44a^y\<w
uJc=SM $8YC$+jH<14SVq?9%PJ*?9w%<6eBb?M!DpGyRde5WbyYbm*8KtEcikwpiqnJ>&8/a5:/$FNJld\wtANE
LXX%$q V$W/jWpqD<8X+#Ql$qhSLK6TNDEjj6k\@W+jwD<dRL<*$8qn/PlSw@jql$bJt$!qB=\t45\4FX6NycdI
HG=*NQ VeL\@C%tY>\t+w>#?%STVLPWMFMkMli/L@>TnGayqh\!^$mjb=tMRQX5ZjX:lP4b88wNYe+&aHtmu8Wl
AiXXX< PwRDmpY?E=n?:1kl*AR%dNZEDRq=pw1+pDMia=/?umi9BVC:wnA9eWSKhS^?ECp8ZhCMaB+@K&nyNV+6
LV5W>d @i4T6HRNyw*pP:WKmIPk1Y!6kJ>JKc\jqB4wS@^P^hVBGRNlRledRjqc+c4?ZRLkM^EBFqZ><$ct!npa
JX^a>i dHD1WXbXL*?LA1NpaQIEkbG/uMGkiJSKTIjViXtWN&?6*mKw#+hS/h?wejT9%Z6bSkScn=N%46@Z&t!6
cdpn5N q9aGalC?D8$kuYnw$BclQWG6S%%ClWD^SZHD!YD>:d!BLStnqq&j9:>hP4AM:!#l#tG9+IM$*e#4#ILH
=QuG4@ dtP816=VPmiMQwcW:T9qKWF4=GjIyVQ/t#C68bDW@BXcZ1>wYH&D6?6D1:4X%@^I#F&=&&w*CwKNA*Ly
q4Yk/B E4dXD94:+t%BZa&T^NP*Vdik$C%%IH:Zljm$B!F%NINw!^aXW:YEnu4:X#iTG*$h*dtk@T6/&RDLI!Y4
&qNwJI 1A!JpSLTyC9JDe8IqEde#y+S^k56Rmt15^iPGdbTpqtZ=cSSaqEqF>j>wcm@F+Y/$ae/w1wFD>LVkP&i
AA%=@T BqD#hj@!NaDbH?kG&D!Q*&d&=:m$1%FK6w:B8bXmEEbppR#&mVqbh!Y<pjV:^QHyyc&E/<H:undMI</E
wb+cjV Ci\?+dB4R?C$*hjW?XEY=c+^R#dX9KyX\iFmRtCy?TqVLe*KEFGdiJDBqHYu%d!l/!B%+EyeK?hLY9+I
yjd^hH #XypdeY$be=bd51&DZ&uGAqWkaanEBwJlI^Aw!$b<LW<c*!Q5\T5mDYGdyC5aI&d4wWNh\jIV\L<ZdXT
+8^N+M @CWkl9*uyjLudWluApa/Tn^PBncp$/Ew%$Tl4AjYm^AdaWwM#I9AXy4G\Tm%8lAH9!1/PJV1#@eeZ?eV
1$EuC? PdGj>+b1*Ptqch^c*A<y%i9dI?=RuFmM9tXA*=SCRXaawp\>Y<5GX:VApwCcBXyY4p!B>?:VMZbtS/np
J#k#tS %:NBPyBAmBnIAY?#qR@piZY+>Vp>#FL5F$Cjk14ZL?IE\K%86kSS?I9@E$Cy!=b$JA&RGH%Kqj#b:51+
eYD\#T ImRjXu&HibLy@hq$uTj=pLS?Gb=pMQtRh$Y4TN=!6ZAbid<+&?GYB*WISew$RlPca=HjpGcS^?nyDjie
VB^iE< GQqBXPJ1E>T\bR**iBR#Z+RAS!<aQAX/kPan:lkhAmk9H#EY1d<d+me&ewuemR?KQw6*e9a!u1QwydAb
Zm4:BY $+ab>5Q&SeFK8<k1YcyLd1aE9*%>\HP4M!&?=PbA^cnpKluVAJ@HM<KZN6bJVLQWc6LJ?QHXWMM&<pcy
m$H=G% l<E/cJQ8jN>PBu\e&W8d:\9wjF5abFma!yBVSquS^Du9NWF&/i5FhDGFE!Jhm%w6d#ILPh5EiLJSGIlX
4Kj*FH Dj^>N$p4tX:ktcDXS\!hnAi14\wXQSNm1IR?/@SJMCIDXDlTkS!aVH%>B\!yRiFaI+4cWcqFRA\Zqj=I
m5H%4K WepIy#B9D5Y+K\1n6YGA?G6lqMch55\q@%b*!j@j^T#=1*99$I@w^4S?C\@Q\%LY6F^Q\+Wqy1\yS?<H
>L&j6V EJ1q4Lpl9+15S68G6kkNB!w6!m5KHW1D5LP+t/#N*qa\l/DpS4LX*Gm&PyQXJtikw#PJRtFtXK*PnK6t
CBHh6b Lk&$:Gk&Bi?BuF:Qe>LbFh5<dLky6>?1Tn4S*iuHubkLF4+yb$N>ny*NFQtYht<S%l/pTjiT$nJC#TE<
K>hD\W E+KnS>+k=@6+dJA9u?NuRp:+n%=6<y@Vwbk+G:Bt8JnT*W$^eX%!V&?6<tQ&Mne\Y!YDk1PBjD:m8aHb
@$Kaq# 8t&@%lF%?9ZA%1GD\X@L?VBG5/Fdl\/Knpw>tb*XyTPp&<jJ%=bt>C<B4H#SNHV6RYhD*&K4@qVF$H5E
-AMl5G 0008e3baacb001202b3 Page 288 of binaries1.zip
wDM4Dy nW?!bLp&CXGDq/N=!dFKLJ8J%EA&e&*YTbQn15I6E+WCBTHQCqD4jFBIDWBh=B#qRDVeL&CYlB=1>!Z$
R:hdwY eS9*t\EibSja9<uLE94\G+LmYt%hq!uCct6hB*y4HFFND6%QwiFHZ@jZ?cCSGwBik#DPV469IMEpmEnT
K1AaQK Yq@9^:&Dli=An8QJD&jZZq^61F!qA*L%X#/=TniR#ZSB5:qW:cMaaJ%kZh@w96Zq\$B1AKPLu5$!DQDQ
n$PSYh tWKKKpkN*RPCY4@VXAZb&l^RRe<w4:1hG<%EaaXQZB^&jcpYM8=!QLD$nd6NZFalcE1WJk$VNK65NjLY
t<ZEGY !d8BVal6T%th\X6QqE4GNISyDb8:tRyhMyGF%hG@c?l8HXB1RPnwYSkj^GA1VjaIEGM?CKRGIjCWDjec
LlCFK6 KER*9DR5RH#bB>FhD?Gh#^E#G6Tbl5/TH+ebEWyq#9S^/p^@EYIFhudBFAjK<c5ddlG%pGGjQE\5ea6w
tY*u!D #J!C8GjaKKnmb1/#i&yPpljCP6F\j#PqYbYTMm8ZFZNT$!H?4#yjd<kq6c4!I*Q*5luV1*XDJEilZ#YG
ASacVA **C+&KXbl5/?HqI5CN:w*#!H!Lw\8y@<LNDI:1lG41c:ZQRat?w#/:RXh4IMXCi%Z=mXCYFY49DN!4iY
ID^4WS Nm94$nQ+/bM<RPQdSwGP4/ZFy\XbyJIi!JPM+IN*Se/9GV@SteVk\6b!Ji+h>nqAlk@wn=wBhTBRTdZX
u@:L9t Bn6m/PKCi1QPw6Kl51Apw4#khCLZ6EHT>yjM:maN9Z+*:Njp@YZpMQm=b$Q/C!FLqYt&G<aZt5>wid9p
!VHDte ^G8!:$#^Pu@%?G68>YVnR>$JaXljRimXTw8C@!d%LD66Y<jjkSW<D9Yd+E>hKj+GNH$F?ANX<jQ*8iZ#
QGXb:V =?Y56#H?F4RDe/J>$Ge@/RhItDV$dRljK/JR1ui%WAWlhhtGLWL>enM8X6H9@eR<mI5#IiVPM*TnPmLn
BXlim9 $IZ^mc*K+EKd18Xt+u6D$WaZuC=LltIWw#DYk5SM1tdF%HR*uZJ4KNVDWXC4?WiSQYEbb%wGkjLnSYTe
Y5&1VE ?*\bb+:!=\GW8tSHP^nk\=yb=ltQ8%*lQpNGjb$/8cVq<GSHF4jYwL9%H^@nDm:ye^5=u$S@+*j!81S1
nRM5p: &m^eWZ9YaR!w&FMtQKbu<pWF=1huZXK4FFY#b>%6mqZ$jXGaH^9KR8Dl6ban#d+wDC^6#5hi:IM<<1Kd
lRRacN M8&8Xt#%+8TwTue$MN?YNE1GcTX5Y<pZ<ZkeCtkttXD5jBE/9N?9<FiDSFW*PLZBb%Byde1EqMp+@#!i
mIuuXD =Ktt:@%?JZ<p:H&B>e%5=jQPT<K5\=^kQBn4bP9\\N*yA<F%PFcX9li&Dp5j$p<Bw6bl%$:GhPq^u/q6
jNZwH? ZachDQ6+N%cTVwStnby@9Q5P^^+4X<d>kYDLP:G:yEjDQ6/NySy$aL**<Y=hL4LH!@dEhnp18yBe=N*w
6WpI/E E/Q$Tc*C5kQSq9S%AiE>Z*::kjn^!@FRL@:#liu5tE^q<kki6c:m%mVEpRPGdk9jGBQ^H$h5PZn>q<i@
aXwtqW CV>hHH8GhFDlYph8H>WKR*D@%hmMdbJ&/bqpJkNCJ*$<tB#bStK^Nm%j&k9*HdcTk/k#NnKeH4tDTLF:
eupZ/B ptN*k^tJtjGV$kiki9Vjjal@BR?Gu9>h?9\$PW#Iy4?l#*>CaFK9HKDQ#?D*ySj?A*%?Fp?tjiwt?9!u
ektyj? =P<J&W1Q%<Y@Tq+u=LJ@w<>@S5=BaQqV?9\%Cil:1KMYj$+CVW#RCa>@ZjwBIb?iye>QTqB9kCaq+m@E
ZI<5#4 NlI!\6+=GaQl/H1K<atD8?pdnE><9uC@\?ee+P^*?H!BpE6bY<@mP%j<8<Mu<LL%KwjQh?D=B5cu%Ab<
nLF!WJ Q8@\CiN^<+PMV/\:eC@nE=?9*MZ+^Pe>**d+*E:?d\!?FyB8KKMeau+HuCiq\i^iSqPki//C&Z&k>wpe
M&JMmt iNBc1J@SB?kGdnB:AtPMA+N<E<T@nMCt9\4E@bPa\wHtj+b%e/HL=StEDwI#DLl?E#wE&5LL&AS6CwQm
<1ipk@ 8k&1B8li=m/wGtA@tL$Q1kcaXdkukW*4?@>jkWE<E8y?aMp9:\X%Q#BPXj/A%VR!AjZ/k6MA&wGVuMEq
6bJA6> ?RWKu5u=ib!k@WXkFw>#amp+SaPFCTpRkW=DR1d/wc9h8bG&IQBCF$tD6!Yk<eBLM+8ldQDiPp^^D5kt
Q6EXA1 I\XLZ8V>DeWCMB=5?\MBcS/wP<G!KB\8^JAML&V%8+KqkqN?VkwHnCiGI1#kDM#^RM?q<MPFQW8ALbFp
N!#eDd eTnj$ABXuRlml\amYISS#R#KVM<w+RPN?wGHa5HPR?QCJ^1LSaNTkTFjZJJbAwpHTKALRS5kC6A&H%Cn
K5*<jI EHTCHn^uCFYFSRlaYTyEkqd18FaCR>$@L/eTm^DimypLYk$C@e=AH\AAWE5DBBRAAkAIAG%XdTXI*C5n
WpaJC! S\$CAACIBAA=AAAAa&^ybY=$e!>\b*A9dYFnL%BHWGN5cYX8hE^yam>#d*X!a&W9WEhRa&^ybY=$VGqm
TYtkpd LuJ#etM8atq8=JwQjFQX>eDQc%JT!y<AIqbFE=^5+LR48Cp/S1RFwYCB6VlBWE#d%#atVY1TWmyIY865
*HFPF$ ujl9@6&tAw4m%Qq@R#ijBKwmmwD:+>TyBFF^@wGWR98T9L!:e<@:p=VKy9:<@D:PjYQ!:y>###u9*H9Q
u8PwJ< ja<K\?jNtFjq<+n?<Hti!5JkKFkFZ+4!m9KTcaHGY1F95:Z>#Ei/J@miYHn%mmMMdG%h@CK@+pD4FWXk
b6ey>8 ZXEEpG<Lie4hadG5$Sj&NKBZRi8c<eh*QPih&qn6Ce\R\*MHV=k\ciIbE+5K=$<9t$j8Lt6aYFc+4GJl
Vi%#Gd tikJ?EM=WF\/b/wLPbLDV<^ciy6Yi9m&+5bR1V<5B9%8*@Sq&9X<9>ejcQJdX=?a%:F^Cbw5Da9%%u8Y
n#8GIe n?1I4n^9^6SyuqCXL^B1DI4#k^/*9>auYny&n8!IXkY1^cw!n>>V*%k@#S%&X*k8F/&**t:9mQLcVLi@
$CaAt> &meG=#e*aKN$ZEjWT/&wHh&+tweAS8N*D9iKMj/:y$6iMeX^\^bid5plh+jl^&Ct@8ZlE<CI9b@@1BAB
#i$$V? X+5ncw@b+lbbWHlDm!91mNunN6tmGLJ+*ackNYEckY$n\Rw\+q4<45L9hjm>utTu&cKPIqhi^B1^5l#<
tDnNH# 1K*+tcyMXedI^<b6WRD5n:9pmBJStGy<iM$qP/kjdQnS>KDepwN#*&@j*Hbqc$:dqi&d=:/@=KAl><Z%
8WpFWD HB5jI*MQ8CewlX=^:%^=n1I9y/ik!JuZMH4bbGYqmnK111^eN4ql6DP9+M9wKVIYQeA:lDpnPj4Xapk\
<k%Lhe +m8P!cHjeq6JucjKZS8A4<yk@b1LH+PVwBw@eWE%@aASN?iZibcJ%e:bauMIm9L@T:!?=S9y6bXd%!tk
qQX$bw Z:h\MjhDe&ZE4RAN?St:iTX%:tBX\P*:&8$KX\5H5?#iyN8>b*/hJ?RMwXWMue>VGZRHt=&i?kcjYI>u
tP9^i5 R<kb4lPh%S/*L%AdetI&e\c\Iim5C6VZB@#P^lCYQV!V%4m4SKhwDA4W$Dk<ay\N\WB%a%ZaGY4$lMXC
^Dt%=P b&uamide#1B+YcPHt$SNDRE@nn4!IQS!CqmH<a==Re>TQChwn8*W$Fny<%Sq/8Zwa/DiYTGK%jt<QmMa
I4>:p* cG\I>X$L?q^@1d*/@#ZtC/@VPPSV!^4BBp<JF%m6e^6E9*dAa586&DKk^P&9E955yFa4CB?JXB\DQVBB
uBK5R4 YK^*uIXn!uBM:9SL^c1\b9X<dQNkt&&cGQKGA\%c/^p\BJ/GLu&eA&5V#XyaGACN\wJwDk!m?4Qa8\&8
Vab9a: !B%cWShwe4y>QtiN^!iGhPq<KBDKP5dN<+u8pPkM+iLBGY<PNAchl$$5niK4+QY9dZea8YTRGYH>dDVJ
:@9mXS #!4uHKGej+V!\K!!Jc5<IFPeiVte<5BXM@%5=\NZ$R/>El+V=8cM!Myu>?mFA>?CtS+q#P$aj/Tb#64V
p@*A^G =qS@K>a*9?5n4i?5SQX6ZN>/\IKi!5d\6?#PdkV+:Cy+Se@Du:h#:#ZQ*j=>/@VC@?Hb=G8QJciRu1k?
w/&kFQ $b=NhF@9Pwc9%DLS*?meY4&W::b1*K%mVckl@^6+B?Q+HRlBIbb%B/9=c/=#n6lE&WWMLlYD=Q9haJt%
\N#wiG MNDw4G<Mlb$mj+DBb^Len&/Qu==!*E=N&Pq*%+9+lPMMBK8^Fk++1+ImV%b8y^?XXyBR+Ytt1n4*W8\L
##\dm% P@ti^!ec9<m#R1AJ+?d&%RcCuuBhjiFJ@$bc5%4+Da#81SVhJ+XHMt$n%w:E1Dw4?LPn5!Vk+\pP*<Z:
Wtd5\l QZ6@+iikn:+qPh@SN?i:KiHVI:cY/5Z@8a^+*%jQint#aQCR/eFkIHm&e&^w!JC^weZ#<VWlE$=<c*DV
y^#>66 \c46y/1/REn$+&aYR$=@II\9GQ/\61&d6WH+pBEI$18GF%h9yin^%/IR4X/^8uCTQuhcW8BTDi=R1KE8
FY1RR4 !B8Nkh4E+1:PiHF&@utiWFn$w:c6k$wCjn@jDFnPL^i4SM>TZ5\4<RXC9DCpI8\PlnE6lb5CRi@kCq!I
J%dC+y StXJ*/XniMq#$8h/%IRy^htE:/y%QDt=G:HdH<a*X$^SYPjCRdE?kLXRM*yZj@cn<*YN?PyY:c^5:m@T
ZI#\IJ Z\>KXPp*lP><Hm&5T>$?D:+N?1udF/l!?:ncIN=iwXP@B+^CnThaV^JwVu9B\?HeQAc!Acem=NR&NBt6
$J9ZtZ DAVDl%p4LJ89*!@NXYNNDd%</yPq#\h@j&*\ieKpGC5iQ#qu?lHGN%y*Lc+B#K8&N&%9$9ycI4\?ZFk4
=y=hy= HIBSp+yL!@SFl+$#k6e$%D%cictk:\J58kMtG<Z?%>\6VFD?\/<N$m@^c=/k&Lj!\5AeFTI9c!WGN1QW
=a/E:k IqByiA/LCn$MWnKDnVG>JRda$w$6Ltw=!5LmEPqq$JuA16ptk\9d&nJ6I/*a=6kn>^E<PleHP?K&SQ>Y
ACD/An 8\J>Y$<ekKb6cFbqXn9d^N4TLFi%M*cu%8$<F456LGyu<tmLCm5AXnw/bWEiP61%cdeyILC+nepFFtW$
qtnQ4N SuKq9VMYp\iQh4WbAqEWpC%MGTdIW%^6Mk45n1@M/!MAVBGaa6ppS%D>Tu5:FqDAqmWRWXHA6muP:J*!
:CM>lj bH6:t?\TqCu&LAEZ+\K:8aA!&hdiy4k5!tSHqwADd$?^b\p+dMypq!pk6NlbNE9kBlKaFCEBS\GLY1IP
k=kc?a Fw8kRI#bPyXJJZaW5C6FMd$@bwqFYN!qPHdHa4bP6cBQQ\?VJS/L!A:16&N@y>+jMiNwTWSh5y$LMIaC
9jWNVC i#TBTccLeX8/^cZaWCAiRaFl8^$ppLqJuIWYl&LSBbkR/!hkaiBR?\qp+mmVkMAFZF\knkI88=KbCaWE
LbTVZu AAXpl!dRKZMBT=bAm!tA/!u8\4qEAZP!eS=dHA^YPHa46l*SZVmS5VkZ$NeVa<eILPwmASZ5WReK^IGl
1?e!Ei RNRWcGG^EIMyiF56nymnZatk&!kRI\Fe9APmnPFk%$/#HtHS:H4M^X1!/#LYX+DD4C5PFy&5%<e\X1Da
W!k^<N Yc\AHD6Wt&KVdaw>^XdH:VFZNQKi+bJm\>$FnucXKT!^N<FT#K=G>4Ihy5<K*:*k&IA1:IqiLlDkA6yN
t<9Dyi pR*eA!l\Pp/QnRVWYnWTa:wNLwFJSeX%L4B8%p5TmwY4aLwZKkaG+\bVt4pK&TddW$w*1nDehKl5FG:p
#pP%Dt FymTXt&1ZeFQKy%Tee%1kS815q\MbBRmP+&1C4m:6i4kNLQEeTb&<Ey?mkq!y1kIbqG%WHFkE9PiYYw#
nnJuVS T=9MWp\dp5RqyBukSWW4D5Re6ZHu+Yt&RGY&Za!6nDD&45Jkl+yCd@PPE%R&EthNZS:4YqZTnj$:>nC&
-AAl%9 000b753820f001202b3 Page 289 of binaries1.zip
aQqDhq eTQd8I5!uM1PZ9Fl+4*l$c:^m:y4F6WP&uQWuW<PZ@*+Dt*uMnbKZXbeZn#\^id^XX*FC+6LZtpc?M^a
15p1IL %=4Xtj:R\9ILb:@a9K4paQE=C&b5uil>jI%nuT9V9:^$^IY#w+u>m*4tXL>X58pP:**4h/*Ven5*u%e!
&uXp%u 5dk$qqlX*FNe9Zu&ZeQ#%6=$%Ly4a:49?i>5eZYuGbN/YY?cDhn\HE66aL8wh%Cc=i^!hY/uwKRa:N?i
@PQhn> CejSKYdyZ4>*4<J!>#QY4C/uYI^KMY9Zi4b*a%y4bmq1L5D%&LZiPtd+<>QG4B%cP9!TteYPh+!PD>cQ
Vj&#6l 9Y@D%mEuQ?!jXXI/5*!J&SHDn5hj\yM&pNNbtuNebpS$@eqnu>q/cF@6*IpqySQLt<!P:i64Vt9hht:l
wLKQ1> bjaN^%e>WZIMhR#p^>y4NMj<+It<>y?Q%Q/@8LAhBa+C<&VGM*M\MLZQH<$!b@i@Pjpl/?mHP%4j/DP8
il<Ke/ :^@l<qA&::DH<uH<d*tbq^/XkJ\$AScFAG8KkN\pARMTBNlpA9J/CSnaR$D?IRIGHTSkeDeBR\+RMLTL
>t/58: AH8ekGH:CSm?n+ASu^F\%KeEnQ!EkKM@JtDWQ\p+=mMCC9aTeP!HBB#*ARHH9$@A/D$EuQAiATj8J5AS
k!6bLZ I<C=m+A^:^J\p9/+@=&*CVn=H\TMja8A::=J\QjiIGDe*\pa@#wBy@!NkP@@qaBV@$LAcZ<twQA%Au/\
tpVwVc p+CmHRSM&E:A^FeJPH$dAV><laAj9W#AGX5JPQMqAmb6IiC5F\p+?\WCj9\<AbM:CjnJbkKtdCLAFTZk
lK@ui6 uI$EVH&PkGKJkJJuCbn&J\Kt@=GAe=<laMdVBM#eREDyH\ma>Z5Cbn>F\HqQEqD&BAF#Hmhk:tME#H8W
66t?5+ kJ<?RpD=:\mwiJmA?R<SeQ/DBQ#56\Se<AABC>aV5QB?Am/<n+BF/\lajC<BF>%D\MX4CXm!lwBLXlQk
le9X\d 9y8A!45I1L1VkP4jECD?twCcZ^FRi\eBhdeV+LtNkE69JeB:C\G?t\tw@!WB@y5ICN^IRMMNBF^&QRHB
l4#CT$ /\kI4TIkjC$Bnd<kaPp%BDS%ELC5uaDt1\t+@PeELL?KkBX6BF^^JRE4Y\tI6BDREmGkhTWBX%=BRN5K
ME&LX9 A1=cV5DQL!jk/taC&yeS$NFE\DXLCjlFI\HZlkqaFTLk8mAB%%>G\A$NBN\aIPAtQ\G@4Cjkbl<B6*kJ
!5P>Be 8QXTAt:#EHB:HRF*%BL\1^wCjm$T<J61A8/5I8C8TkL8hlP\?lIC%m\laP*FBN^#ERH*Lmbk*TIC:48R
9VSlDE kQ5ZE4B?AREQZEDAd*>G\IQuE@DRjAIi4mDkh?WEQQJVAl/hS<Bne\q+jA+BV=RS<PS=BD\%t+Dj#!Lk
<&a?:C D/WEdJlJ\NM#CHntZAL?PJ&AQ?u@$<T#JRSI^RR<N=YAnieREHWS5GpKAb6@RpDubAKi@#EBL=^N\I6u
5QeHM\ EdBqEkE9uWuA%nMIiQqHBL#!R\K&uW:A1^MJ&D/BkB%FBP#<ARG9FSL\=>MI?M8yBQ#%?\V<:SRCZl>Q
YyE89< \N@HEjDG>\l+<:5E9DYYkH?eVMDd*!HkubMIiHeMAd8eBMReBP\?paD*VmBk#&kC*n?ikA?PI?DDa\ua
Bw1PL% Y$DAS<eR<M>SBH^<NAGjnCVk$/MI?G\EAj8GE:B@GAF^P\FhR\p+MITA:5EEHB^E\KF<AuwGE6CdS+B5
edC8A= I!A^kIBpLkEyK\GKlaB$DkG1RADLilLw??<FR%8qXttDBG!d>JCEa9t<*94X!pNXTjY&b?wn$lJ+$<C<
#mGX*8 1:LcFG^La68NYY$ydP9F6q8!&yLahknAi%8t4TBBdjj!Z&t#^L!dnb:nbi1=Z<4^Al!TPmZBC=8M#lN:
dV1wAb 1jMB@FY^<\Y/Rtd\eV*W@!A=!@9VYYN:yIMwt=RW:+dQ/#?=X#yA@e!d\l8R5tT!LKAHZeC>TGD4S1tj
=99G>* qmZe@Vn$/BL:8Ij+VWqy:$EMcR=+9VJcTIMkWaiK>!qJQEK>>E%=bZMI\!5*#yX6N\\5p1X>cFSV*<Zq
#qL*dk kKT^J886C4pkiCYF+yPpZ#+^?Q4uViqDiN!+?wTpkKu<E1+e$FMb8mTMAq+Viw!=dJ4*/q1=JqW*qmaZ
FCJ^Mk $1CRdya%R4PZlqeNC$8=95>$G?A>RL$<Fq!XL5:L8N/a=uycW$kqdn!hbXw#1bytWFFc6=\pRhN8Ndj:
wj4!GD KZSVmDT4jIGq<i+%bWqJm%Fcn^e*yin1FXNjTmIu#L9V*NqtYKunXn+lK$t!pkLFnI^l^albMuP4Z5NT
N<*Kub &8^J/!P=q$t/WY:yFZPtE6LHYP<tG\epI*mcZEI!S9i%\c>y*RcZThGhJCR6by4p!+cFBhwYBcqZ6/Qk
:PiEba tqBMZ^J/bA^hcTtJZ%Y*aYnqMbTyN\%dDe*%jG\QYHDl$=LWqHh4M?^Nt8+aSqKtPVIk1b>nKK&Q=5d+
VIa4yQ np4DT+c=kGcP/>V&nELLL&NNG=8Y$CF9qnLNyB+Z!Tky8qFFL*GD&w4ja1+%YiwBle#5\%%$KC6G&q/S
\SLX%i VS5!/4Z^PGCL1ek\wW$I4@ZmX>B<!>!YVDQDk/N9Dp!q*FyjY<^4A!>tHj\9a=JHTNY6MZM9cdiqTjZ1
?&TC^: *tVF$Tj4KRSVyJq#iuDci\?:\dl8l!@hHJAwhC4*Z<&c1IT?^nXV6Bb+6:qIL8uFMMtWHYZhnu!aHe^!
^SSSam ptEuF!mGy1FWu$YwGhHYm:uAK*6%#d&W4qPtW\q#8*Zy5YBk=TEp8=Vc?8nQSM^a6/cNe8PwwP!Pp=Pp
TLB:w9 :YCMW!A8cj1XQ4wX/P5=Z$#t%n?@S<4YtNDVldGlD?ni+Lty1Wmb/XEVVEtG5%!6td5YeXYGW8=$/4A<
B*Ka:M $j%=myNTJ5pwbl^T?9!a/ZjBIW1JQNd>qY8y1b6eRkh$:d\%aYb*LRH*/pqa!S\wF^*W=</IND>aWu1M
jmwp@j p/VF!9e%H4=<HQQmGbEmI$p>N^tJ^DDR=$SejFB*QEp8!qpbn+@REp6Twl5C%W^j9YVKpDEeV?yl&YFw
WP+w^q ^@M9yS@\&8JlaG!!6GV%<w&dpC#<\l<cE6TbyIlb?Idt#!wC*@dce=m5mjacI/#<A1c^eh1B6I?&aaIt
HIca/M ?q*<*e<NT8@l:%yDe4V&ZBH@F*QZAmBHYcV@&h%5d$Itt\S=KEI&9AR&LJtPcI?iD6GkkQLRJPKhLDLy
X6y$@V te%P:&QYtX&TCEIRkZD+RD\j*HpH?ECMePL4jPBCBHpHEqH^JMRA\wGT\BLTQj8c/j81@81iu5$tlBDF
M5&hK4 th&y@9?89@:///?19@/ium/ihw=NPMAJ#k:JnG&HWEaHQRtQkkDylXBbSqqaE</@cb9wKC$Zd8&=yh5G
WCIaby ^&VbJL9jId:GG\^5e%\kWT/nhwTW$YPynR14a!yA*BmRZd^Nbp<4!uaIpMTuQRj$JWajQnGLj=1DHWT&
JPGNnT SEk$N#ETcW\RH+#\1kPJdc!S>jB#bD%1uKaKu!MW=SEhIktA*6El=lS+Ae$8XiuTdeJJ!t+VNTb8Z&BD
%81y&i tAIt8dEiHE>=labPTpInKP5ihuABCKy?5E6+J6jCDZV4WCRj*S4y=pZ^aYJFQu\a5#8m&hhTmVE88NCS
ec8J?G bmAW%QqwY/Ye?T6:%S&DL/Jb!PLwaKMmcSLSS6b4Plyl!44nWiyMBpZ#GhMY4W<FVc4<@+Z=>%u*Z>KB
D/GPQe J>XRmD%IIjaw@9W^jEFa1:YHR&HI$bQ/EWVh+RRe@H>mVYTWL/6%Xi$<<Gp=W^151V@+CRV*Q65jcj5h
XBMcV$ %VM#H?aqPqI#?!Gtwdy8n&C6b=pPStwibIj\!<l?:AFaVSVnjuawET1#:^NjGi*@Z5cK<D4#dq+6I#W#
XPT%:% :wIpj9ZKP<J=JQF66Dqm!YuJq!W!*+V!$@n@SwB>>9P5iN6pH<QlJ#bi=eFbyM\$q@LS^RkK$/AIeam$
IJcRRL aJSXl4bPbNDdTSX?ESD?>qbij#B#6EQhn^\:@ZHpB6ePk&Lq4?m>FlAN:4CL#nRP1pE!Ji4RH*!D+udR
LL&5LM *aAIqTqk1mjG^wp4ZnaR?*Z=9Bu#yWMP&L4p%Nkk^#l<?1/A#X8&<1mdKGwaJL&9hB$\!EhW:yLlh\%1
Y\Lmq@ Vu%G>45cB8t5b4TLdb>h^B9DJq#jNXkq\Z/Mt5+eJMhC+?ThK*M&i=CH#k&=LZ811hY?:+^Kqbej5HIw
F*@dab Wjh%^Dmw@+k$T\=@bdJpFpKb$ZWATb!V1eYXMMHDHB#ya4>IkmK%G^@eQ?l/pHuVlC8DM*p8NJjeMZTk
cp6&Jm ka6wY6%e*<mVZ^te1^91$TwYTCCewBK^FZjI!pKB&^VF\^kdNFm&k*1+$@W^p>N<56M9D^:EjDBbVXyL
*+Vtb? AIT:GuZu&4&NV<dun:Z&9*FRD%aJEbctqu/qc\y#1ypnbaMwb&lXbeHwMS!16H/1LlGYEwc$iP6bZdSM
cuQFE> EH%$HTH1IVctbcu%Rp?tak%9CkXFZN<heH*^Z=kL4bIX9XRFdyqEW8>*WdqB:IVG#tF:YR!%\le\@C:6
94+1PP $$hkihyTYNBq<Sc$jp*ShqeTW1HSHQcp%5JKq/^!Q^uekCa@Dq*eJ4qM<1QJZhTCDXwW>W4e#lnS?!%E
=jwREe M#d+M59cq&WbGl<$Tt^kd>DAEuqbL>11/#GmFLTT%V65e5qG5Clc\DEdYc^&b>nNDey8m>Y$K*B%M1Xc
GpNp!\ IcwFEw$mt8RFXJNGa#1N&lna1*WFB4a&aGH%S6m^GKdtaZbwAT1$&ZG&qC:SmQC5iIXBnW>ZwBT=Tc*l
Yp>BMF qc=tWZbjYIWqNaYtGZJ\\Wc5LXP$L/wMHqn6NLDAL8&H@c=yk/H&RXJV6dETWqq:B^b+td^XncqyDLKP
+lPTcY KiIt15Q@#Eb&a*4E/GVYBAe\GJyFw:CmDaR@RYCchpE<NV!@d^b:$b+4>Hb/AmGVccFpB:68D4n+>G>+
X/8$SE XhBBBC<e%HtqK/:$kmVN!+N/HYE=cCiN89&CZd@itaMHu<%9Q*G:%F:S$4C@?Eyy1yWy=GH@&/nyH^CF
XQVBy1 :am5<wQ5d8@d??8@4@aaj$i5P&Lh/@#h?Q99Q1Z&8*H/ZL?idq9&@Y89XjWEP#4$4b<LF1kyepNyI&Hl
Pj<CZZ !CAI@CcC\J>KEQnVCAJ@Q/ct%HTmB9\+RhVMIAn<bwLAu$pR?LP+X#k8/lZ+?^ME@l5I+5\BBIF@IEHk
Bi=a?K H<VeIcIp:wD@SwLAj^NB+B>CEBl9Jkn<R*pWeJ\?n=u8BKEj*>LhQpwBj!=B+B>PEJlH/J<A1!Ny6Dk?
u&V@Be mmD\n!aI@LeRBQ+^BIF@LE6F1iQpB:&6<6*&QQwE@9EEkh>GEQku<Ftq=6Nb+CeIw5apCQ\FBIH@XwLA
SJcFkp Q=GyKQW&wkL<6^ME9pWRb=IEkj<Pk5B@J@it%D>Sd<B@F$Hk9=5k<FMEkZHTi9:&Tm%p4yS/D*EF@QeT
dnW98C ^Q<mk5A@tTD\*$eRtP>u:1Fj^D*\V!YI86MIA9<DBIH@RaLAQ=%H1hRbNEweuWpR?GeSBQ/HCAL@\\TB
hnEQWC 9=mqwhRTpkd\q^JE#Wjp8?t#/SQ+H!WI@H@tY1Z?lY1B@#GC\D?HIM/$Z<9ju1y#CRL@+>^c1jPwNjDV
l9$*NM BIG@nCD\daLA!BAEjyb:WjVhPM6uPWHkh^LEj++k<B&C\P^mdyV1Jt/A*$MR?L$EeT=QEQl>BIH@Cibc
:FmHmP 1RJ^ncMmRiD*E\V?AEHku$<R?C6+hE16yNEBj^XB%H!!k:?>X^eRBQ/FBIH@KbcCWliSFIB@MWHk4!cI
mbc+Nm M=jIh<8jyp@kZ<wqLB>WA9=qBIF@PWHkZ$ERGG5IA9>Kd1ZW9%I4+F>FEQmjJRn<#^HE@?eJA9MLVF&y
6%#>=a 1+p/<L>IEQnZEAV?q\kC=><IA9@L#IXTZ!E8eQVXBZ#*mQ4cA4aW^dNH*+$VBQ=@MLhKjb&+Bj=@EpVN
-AAe<n 00000618acb001202b3 Page 290 of binaries1.zip
ATM>wl j^EE@uWEkZ<>RiDj\KNT/l5$K8B@p!D\9$WRb:=NEQk*EkV?h*n$T6%Ew\j?h\pCj!%B+H?QIDB8q8?G
?I$H%4 d?FQyj/dQwH@jaLA9=Wk<H>AEQk@JIn@H#E&+tQ6whXQCAL@j\kC@/eEkj<#k5D>8V!$+BhEFWi*/WeL
Ia/Qyd 1F<TBQ+kRiDjVlD+h*D9&N=T:<D@FWHW*EpR?HeSBQ/9CRL@d8bT1Z8IT?DjT^D+>^HEtj5JA9<Bk5B@
!ABekF pEiDVtk$\H?IIQAjJkn<DRTB5bEk<H@Dw%d1EZu<\t<JA9>*BIH@i+LA=>WNtH>++RYY#@>8*5#\n:jh
FqP%V+ ^9C^6Y5bdq1#l8HnK%a\*L^$KeM@<WMYqNy!?PEMu=k%m?GVTnHFy?nHEQV5B/Ya+6NKMeXuqGKK@/eW
npPBX6 W*^YKcd+uFJM<T>KMeY@K5WWu!imwLmXP>?56lEESiacFF<pCIyDBEGSj?ICm69=YR?L%M9<!@4D%R/C
+%&*iR wPnK9YPi*L6Xpu8Yl8YiwSG=X&bW:qWbp*5$^8WimdLeG%CS:?b*@h*+6E5eiu@Q<X@d<c!KW=>MJP$%
pKl??< %cwD!w=lKiY&tpu:e=H1eWiba/4im=9&F!QXa/kiX9YGchqj4qdQHpY%1=V=qY4hITPP5qCZ?lche?=$
QT/GES atd!#8Bp!#A1QSX#:i<+heB!uX<:>ZbeLR5^Dm<FGG8htF&1APX8%CAt1%I=#HNW!XQKYP8wbJp^!p1%
G*Auii l?juqhDWJd:GHCNnYccXVNp@B%5cX:q$N*AWY^taa&9WmTWV+^lp\4J9B&Xk8V9SQlan5LeVj<MatV8t
B@^!jM ay/=#qHulG^WCX>Gk+W!GYAub+/1P6i$Z*TtyG^/q=$y6nYeMG*ZcW^cbm5EP?d+hm^qq6X?:SwH:+\#
eNld:C =6VlaNTy#\CMPIb6tcWEJt*Wce\EyPy5!/4weTXHuAc8*SC\$VQ5RMM>D$!WSmCVq^#XQ1b<mAkV4T\i
p!88/L ^mn1MjQ^ISXLPDm\RAu<%J5R\bkVT*pnKtdchGJMRbhKTyW1LBewkFGBNDJlh^hm@qM\4aTLhmAMTd&M
>4lZwi G5nXhY\ZDIB#6FcGcV8&wXS4&XG6/NikjqGQLy^/V@PDcY@\pw=N$?@1*u%HiTmb*H&K%BLRjnnw@R8p
caY:?W jVB\C:%uDQV8JX?tpcI@%/HiEt/b>aKHmD:1WbuEpCA^WG4WWt?uISE@%FWJ@ECZ4DK4BIcDk\V1nZER
!tQhHB lp4FHH!kl8YBNnck>XDA$GjApAuQa?<AHFHd8iMG%%K61a1t:&4/CRCdT/TuY1+1ld=TbSp<#Wqb##Jp
l/KX$Y yCH%y=uCl^uwkHB84k?+?CT+KIELF%NlnVIZbiWVXSbjYXNQnnycKGSXw>41VDw*4nqB8e\6XWaE&D4P
V6tShP Rtq\T<yLn9GWqDZu%wNSlanDB=jR6\qK:ubN$SJbBYMmHei<i#JWh%VtCKiH^^uTcWQ#wd#Sct5dy+$S
Zw$F%m qu>Fu!$>EQT?iwShXM^1HacMZ>bhp$dTMKkQ/nyVaVE1q%kXMY5SbKm456PICZJbX+WnclYu<&Xh=ppc
K!GD66 Bk9%KehJpZdeZ/MBu1w9Pa+BHp#hh<#I:NBMtMKEZiH!mLcCXDqTttE:D8pGPY\/4Gl%yFdtmDCDen6S
A!eX5W G?b!+#tPR##jF*C^lk#DW\%k#@dIc%u\A/%waAkdeH>qaaIpWaF@T6qJ&=C?&ypZuDJAAZ\aaKLi\1F\
=tQVdP VuNB9JDi6ayALBJIZe1l<hklJ%eA!!+^X5#&kFcmKaSWZNLlqKjb5WN&VM*P5PmmVBP/u&W/XG8SZS8P
1Y#uq/ R:+1/HlEK/FZFmXlS6whNw/RpT6JXMP5<A$&lGXk#CbywPY^1\GZMkhq4TI+4nlVT$dCKMXdT@F&4TZD
6bm&!l Vl$cNTXa+BpH:E:JPKlJqK6Tcc%w=wBiIqcT:DQ5WEe8Gid%qi!/MiY1qJMn*&!CD&Pe9P6\wA!<hFZE
$V<4TB dF@mY9TjRQ<8canB!nHFIqdM!aXSamKpynSX<bCFV/GQ%DAL95GGbGt65HklJi81aWA$XbEKcRFahC8D
GN@T^6 nW<5R\*W6!$1uCqZXhVRDJEA/69BKJ$K:ZRX?MI1w=KA>nC9X^TI1MSIPPjq11cXZyJc>G%V*/dJ^6<A
8cDK#b aNCJ#DmlJ:kSVWR:IbjaRRZTC^*WTyytQX4</&t*5TKtS1Nhb:VB\hX8b&8AcF#XwD!ZJqcHW8B/VM9c
E:C^Pm EP>pXahM:MX!JHM9:HpFB8uS&p6BD*wt=TjnhP&^GutL%#Y$*$dQJd4dkPTbGiPXR^5JPp*JTpthb+bq
VX?ATE PWDHn%GFF/+Hu$BHKZV5BWMtccN5%Qa::w^4l=ZWSlT#1F>!*Mc+ZwTILB\@8!^bPLTW^<Y=lR9lkA85
/Se4VC WTcnJ>nXW4jHc!b+ZC<T%k+SIDyN1ekJmS=Waq^46#$84q9LiI#hmE1FAeFFIFRc$!JtqWc*!SFi9cPV
#6q*Wt P<dWnbJqa@XQ!QLc+J1y>tCyyaWbC<$IYWTFFX$P^1yVuNLHtL<\HDy@l=kRSI$+cp\%aB&\A!Ha=c1H
H98T=T IZYn1JcDE^FMwE8<tyMweFB9YCb:@qHSR?&<+WblF&G@1!uww9nPe/c^W+NJb#!!+/V&yA*6S19Smtm^
X\@bXd bLVGEXnYJSM8BYtGqWEkdIFV+1MiPCDiaAFCP%E@nnk&\XEt6T>^i+PmWV8P5yHcGHCR$85<lPHTZDwN
//tAQW eG!aAqVT:D>BaT4m*JhSD\ACV$9NN\MCS:!py>^+CaG=G+!T6QZP/udn!CE\^VEhBt\H6wN+SP<ZAqI9
$Rw$p? $m\RCS$A/ZCGlB%BP9\FnqN=LTLZ+<FVEM>SuL=6iy*!BKt8=NnaF!bGuV1DLaSY6JlLQ4jEIhtIykX%
kF$aG/ 1&lG\TCRp?SqjJe5hE\QDCPNicRD4W\kFPQKdR/NK9p!4$p^\>*Bbqy98c&aVSCm!D<#Ru+R<X<5p+PG
FnjCi< ipdblp?G$FFVe59aXtBT1Yaa\d9lala1h4$1&bn*Bm?i5VMXMBXnh=WJi*c&PTMmnY%5*XN5qdSXP=tA
hQqJnL Ky5^C/%npBKPWnk!T4RSIetm$#nCm4y&ljwyGG1KSl6VM$4PFKlV$pyl*G4eXHdaX&Edl<e<m?aL*F6n
/^GXnE HL$bJC$np#C<8Ph/&Q/aeS!/muT$FVEQCXKQ$69BA$THuy61X*HIJ1MTJT4GY?Q6\$/n/XFVN?##9K%5
D>FPlC cLET^?daI!WSpdT45l6V<S*p/*d\iEbqcMqkcNSVpl\S8WMka:L4e8SkapdmSZJZaR<ZQW<K\d8RHd#L
lFNMqC IYbnLl^*Zau&X\ddpPHCASkJP9KIdFM4uCQYFStb1ebh$lCMnukl&/%#CW?QL>c1Kt/h=\KnMWHp*G4@
IM1IqG F@!FLBd>G&TD=ubiM?w!q5&jCQedLhQEH/cyMeqHGI8S59kwTT4dcJ6W5tnP+ZD1dDNH5&#T%F6a1^6V
%<K=9a VAHuA%Jl=+e?C=b=l%!mhe*EF49>X%XLP9Syy<+$ZNJ/Y9MNmqdZXW<j>1VVbNQGPP/bYASWK+#Xmy!j
<B+9H$ @VBChjJph$V1HkIiLci*S?4Y!&I%YK*d@$GP!GCJpe4bD&k*/$WSH<B$pk?8wZmjZwFK$b:9%VFiDaj*
SRFH!b \LZB^>mSRe?<C/ynS9*Z4m:bjQC9\LV5F!BtLAk^E*:eV!1?S8BnX1\MXlFck=LpuXP$KZkP1Fk4alq:
t@YTkR G<#Bjl:8<PeB6YZQP@Y6uttCuI*qPycAEtFDD/heMlNWtGY=M:A>N\*H<tc$P1X+!YB:>^\L#5c*l9k1
XbXF1K AWYcF4GWw4&98S&iJ9tLwI<jdYWH=:VcJc\%qqY!HM9GH#Rpha=nq!\4E!?b1ES$mGnhVM\\5aq\byY<
hWe\@Y lGQGHYkB\6cWq:T^A#\5Bi%Qi6n=t:tp&&ylw&ET4W\CIGqbDcd4EQ9HiAbCZ8/1qERjb5:JJIbVTaVl
wkY@IS Ch5^ZI9Q&eM#e8QPNC>qR$F#lHbZ\QRQ6=LXXy#DdhhKGI/HRK=>^4Dn&TZQknBeC$:KSKZF*4W^dy4k
qS8Ac& CY=!Ju!b=cX\QpH?#ZWSFB$G?btYkYDRLNpGVM=PW45W4hh&!dZk5p&+4GM5\%b&B5/N*Cu/SV@^W5wG
H*Wk5h dlLSCZBNN&WpZRPVQe&#VT#lywNIJPV=X8Ib*B!P9l#ZN64lQG\DldnytK$y&kmpE1cDXl:p&=kIiacW
/XjJ+Z M=:ukq%<tK%Gch!bDhh5JE4kHKNHI<^TwtI&\X*AN+IiZRGCuQ*T$SmL+<d6p>^TdwcH5:cLLaVCS1dp
9<wunK P6T*b*yY\pW$%PSB/^%#&HJ@FZD<</*PY?CdHRhVtqKPB$ykD1DXep\TFC$RJy\:FKDm?GaD=mqP46LE
FeaZc% %MS6&uLClcBDbYNEl$F<TWYVA:%HM^KX+ccab%Kmi6M%wNK6Kw=qk@cFPenZWqB9t!+tKV6lRplkyYSk
#M1IXh m?8pZFSYtP%GKGJT$S:n:wD%u#:9HI$F$<\bJdBu8Aq5\PQa=1GAWea>R/Xt$QR+B9c#DRdEl/Z44XkM
EjcN*F :LmBD$!:R\FYS6HGG!J\IbyYYIHbmNGABiW+=Qhy:lbaHtGRNME4DMmA/wE\hY^CAXRTSS1GqeS?J$Xc
WS+E1N ld&PM%*LP$HKc^pl+#@/1@QtqEYd>TT/5MllMGHH!hqPBu8%m6*wpPPk%RC8BdH4NB9wThkc%kd5yikI
:<5S@: i>#>mZM?RSNwW=5W/SYh6nQ\$mptR#NnyG!1VaI4H@<Hyc!MuZM5Qk$lk=N&eEScPV%FNDQWjVJVqZdL
YnlXIZ p?STKuB>HyaW*+^=yb<+G#C6Q\+\*9kpB=N\a:V%5%I@444Mw^=\/t&\SIHkI^RMPm<:?9wRIqH:&\Hc
B/wbaZ P#e+VYa<k*tH$PHd!L*GcdN5@=GCSG1FqaEYiyNa1NBq#LB^J^ynNeapPMMJ<yBPn4deYM?^=eZYq&TC
bm?MTK +C#DqiT1+a:L#A5PKuRyF^*R=uAem#<WPyeyIc/jRpT\t$D>h<QLSl8h1XaJXtpVu?DCRKR%C?dTTn+m
Bu$!Ld :tXMXW1/eal=48uFp%/e9LcJPecHb=lRcqKj8IXCK!nZ\dkQIiY#p9CbPR6^9yhBi*b:4ZD:FZM1NNWk
Rc1%uj a#c56REZq+ILdIwWTc5$w?Ie+MblI^tXT!waqiP?G%aJq%q&=4L@!JC4lFN1l:Zn\DN6L/ZcLR@YB+XD
Z64\ue QGDa^!BP^6Dlc5\p&aQhPE#i#ZY\IT^SAAFWq=!l1tFCGacCuVpJiIRD$S4?*ZX!L6t@paSKRVAR$y8w
AiDR+R GE?WW8$GuDM<Z\4tcnYcy1*k%8yhJ/PkP===DD1CF$:S<kALhFM^m:^jc=\ePBab<lbGTyXMM&Vmm6<+
pSZ>i& $!^abRL6uQk\eYHS8pXLBFp9PVY/Hwbl#w*V/B!&iI6enpNZ:iAyHNKeqILE!4THd<X^A8aQM&a8dI<F
ViNlF6 A+>9KjII<Act!wC1udE!6$RbMeqIE!uka9+QVMAL\\&YcFG$iKE$+D^aM>A&*t1!H$t%+1Q$Qqw8/h<A
R16X\$ ytet\EkT1yNyVVIt1DkPNkV^$k^1tmEQdbGVlu@BttdqDD6pbNak&b9q*S@=wkqXqtip:6<**%96!VF>
Clkj@K i*cBm1&pB&J%=Ptyk9Vk5m=/cP1KdCG4H?lFD<R/Q%9IhhCn8?lyZjpPiyblduq98u?kpA$jmSW<tc=*
!MY@wq XjZycT6!SZ/IYK/un^@EqheQK\&i/wZ8V$Lky^cy4\:@5PG!Jjuu4GNRuQC!%IZKH@dH@jGLl#G:P=$Q
SHmAy5 cF\%jE*D=VijYWuGaqQ^n5YM&P#anFmhG1?lWWu/5iBhwVihJ^4$li*1&E*^/=6Z^!/:>HL<4+/6@b+j
AGZY*L ?a4Su@R%pa>\LG6n9uwBHXQuL<V8Xb?iMJbSuK@Wu6?Jl1Z8WhjEDwkhEy8m%1yHcjRV=FFSFV$cPtLy
-AyJj> 0003d135a49001202b3 Page 291 of binaries1.zip
859tL% CI$4RPM:+=??/a1#8ueTYyWGQ5?/eGil%6KwZBH4tb4eyW#>m8>@!p>PI6McQl:y8hjcyV#\?emuhn1@
eWkiBP E+*l:u85ZewDu<MZX1^J=IHh&?w*uVj@%5QQP8qu!#=/!5<Y4*#H$IqDe=+\XkeDNqdQiTI%qB1/iFm@
PQ9$IY /Vl!utuW4b==W59%/m^%$$quNh*$wdPP8@/A5/bhZ*&k=b:RCQlaYLFny$=hQQYh5SPNPdMNpYtES8Xm
=\ZmH$ u>+y9PhWnH&yy/84mQ!>9Y4Gt^?RQH$4<IdW$MQVu/DcwZWQd>8<ia61Z9?m:=iHNH==1Kd6Z4:&nke/
YiR/9j +R<S+kb8$nK$lYBh*ja686\m=Ycj!!i$DPp!h>L<$PdNR!KjYl+t!E%G6tHwq89Z4X8*hM9RLjRDj$D>
tJ$&#M JJa6R>PuQdb6?uTWH>kt=V@h#GX>jq#j*dBqJ<u9K#uIZM\9D>HVL?5Z?C@#dVaL=m@ky&HY!%$*TljD
Bw<!@: 5y!9Z$B@?6Gb<%?#Qpkdj@$GQll9Z5?!Z6i<u8hw@ab^Dhh#Ya&9Z#<W^bj&p@A\S@MRt/X=8G*YDdNt
/+\LwQ #XFD6^:/9h688$MN1WN8iPtqIjZT4Mj<b4Dd9Pu:4%W9>+wHPpE<pL/AB/&V$NHZ4JN:IahW5=wQH9V<
SH&8Vi Aujj/ePi<$DucT=+juH<t9WljDZ4M<*Dc//nk=H%c//>nklMZ*MqaQNu:%6#=dZwi<&cEF=L<FwWAhZI
EG&Ryj 6he!jkCdS//>dmlCh*j/EL:mt#e!iH#>R*V\8F1@ut/#&1lljN%$\I$1V9i5VaAQWe9HWh!5=EG%VG/#
4W+hFE ENSkn*l+bVuRJGD<Z&ChBJ!?ju\L=MAR+:<PZA4e+EMP%$*jRHQR:E>j9%h?5lq?pt::ky>WG8y/RQlJ
iTitC5 DdhJ?W@ZM=V#i?\ua=QWVYnk8/+dZRNhNV\&ZCZ58<Nn>Me9u<5wn8quyDHC<QCa^l:^c?kH=X*$?*h:
qV1W?\ @X%qELVk?<#%k&mcA5y?4Kty!Y>c5N6!$<S!qXW1?$$lPYqjHRqI<i&wE@S6X#KaZDj>TbZKR:p<W6bQ
Tua+iM \QN89ZYE!%=N&a8<yI\t+!QS<9nIlQQn=Yk=&6+dmd=&#>+@ul:W&MIt6wXNAhqNt#clul/=X/%RpTJZ
d4yG6X SI6K:X!ekK+tpK6y5mu<jF*>RW$@94>$/hJInd>W?ee6>TNFqK5X@6Lnn9Q>&9J^^>W$1Cu8SL@c@=:I
IicW\\ wK=8cqRGhdGyW/hGbFB*:4qVy%/yu%Qqe:q8/wI4>jQX8I#&=%+=%ce*+RN6\bXw/58N6@/Ce/@$Z$@j
&b9ZGp ?HiWkdRIbBD/SC&DmA<Wu@t/?5T@n^=5an*aFPlB^F:FZ@^D?aP@nR#CcSBd1N14$H%h@eE8F5lw/ctu
\!qE6A uu1t1wdQuHac!5<?J^Z?ciw$RulY:Q$yPq%F<QYnYmiYu*utPTp@<\\Zu=Y!<y?qS:/GSiW@>?!##>LV
mKhaQD aWMGjC:=8?J*L@#BJC>?Qt/p%NycGk=4Swhhq!w?IlYn4w1YS%9yNJXHSuYbZ1X18cTLaZtau41LwySS
Jj>k?G Rc?\1Ed%<!lHSpIGStpN18W\Y6w*M6kHilB19=:*mE?We8AD6S=EjTVyReRu5l=EjTLyRc%QSQ*jL$/M
>D8:y+ /VlSD!l&//$L8B!4KeemL!q#uBk6n+>MPD>inycn:YMLw1>>ECj1c+YWI@Y</hZ*^*jMGVy9?5ZnAbLP
+%@^Gp TSy>#^tm#%*8Q&Zu%<!:6m*a@HHqupNyS#?hyXHN&Q4++\<>>II8Vn4M&B+1e>RZX?N5He9=<k#YW$:^
Mb!$jk I&YF6:?d<@Vc5@KE@mIMeiutt+hH<KcQt&?i1H^:QyjG/wQQt>6*@NDK+bZYlT9QPQnwtWjPQQm<Qd/G
IywuVh 9b64CX=Huk/<n5=P8t4k4itp1\jNc!:9YLNtmGEH\#WhuRR:WNGJBq:u=S&W#>V4:GAa$NuqNbY>>E*$
#uM<4e jQG1d/LTu:j??e?Ba<DlXuy!8EkiS+RRXEl=/>bIYSB<ITeaARG1+B:D@nRBj*J?Z8$cyY=XVhF$QqM@
d5iL!+ NJA64KKn@e<1=P%5pSL/6H\+Y^#w:m@i*:R+&=6l6EZb:1#P@:MwX$\9//:J@*QP1$#!5*NGuq!^Jh?Z
jTX>Be Lin9?CVSn<+h>k/?BFk*=cnECWibncj!h*tBTnaQ#Y#C?^T<CXw#4=:bN*Nt<^Plkk*NGc==D>E:QL>/
V:uHCH q*NQX/Cu$%Yy86t#D!Wat*9C<dw<S<y#n/<>Q>jZ=i%$6bL\tR:Pd^G/R*89plPMXbc/<J1ILGXljC>L
uRHlF1 &T8Wc@CNuh6ZF#58@:YycZjdB!P!9XC9e6Z+Y/b=P=4V9F%XN#8T=8%4P6N8Ih8SLYS:wjPW+K*8BnZq
i#>ue@ /mYeQEw!?T:MbHKpn?u8qpXb8:C1n=Z#A#wuW+c6AFn=Rp6Qn1&t4aWT+huyZpwuBd4Wk9Nb=Rj/\$SS
^hR\Lh djG+GA9u<Rw!cBc#>pAl%\?d!jVpiuQFjylC96B&DVH$!ML8FiqX^bAp#CPV:WnDRIukd&E+RS/4dC@#
6NNA+h NK?qM:<m!>u?11l>pyYWDNQPD*SuYydyQFiWJC\iZ%4pVMZ<>V5/KGay#h5pdh6PC4Q>Bh?=S@Q>TT15
@/Rc\T AV&?<<uCYaDCP&ZA81XG!P@NF&DSSH^^dnpqG\5EHAy%TbBmm^J%bdMbNAKDjFPAjNqQTi5KYV9Zq?Np
Cw@yIE #b\%dXp&&<9*CRChe+46*RVE4%1e:<qY1i9:E!lHGp&!$Ji5a=MPyc&q=YRbP!1$b!6tNbtiNKX4k=#Q
N6QqRc #?Y:\>5d:JBM!FNj9n6u4&yV19E1NZ*y!bLipZJYE$8hhLiEVyt&IkhSyQ9/58pC#R6^Sdua/KaJuAl#
E?p8Xt 6ey5kQWiPQ#$<t!^4Y>lTP?XTP&GDGSj%KK*KXjc<wGCFk<*1bZ5@ciu:jjpinp:6<:K#du9P9KFHuTu
J#&SnN 5:qq?%eRLYDti99#^W=P4n&A$Sel%4N#9bu<mmJyRlGm+!VhP6h&L5?bLW>5P:Eqp?iJG8nNAK8jF1T\
p#5haY &*uwhKDap8MB<iAHi9X!^QyTHIARKB>+eS+n$GRFh=V$D^S/bhH1/Gm:cDEW41nHGFupe4$RT$<i+\8#
FK$\e& :QXBnVy!qD!#J#<kGeJ#WK>m9u4ZTmdj?*9JyItiC6un>R1ck$9BTFjyBw!wjXLdBc>Q>/V:dbe9yQ6&
T>/Z4w 8QQAc:Cm$D<R!jFB1a6yTli+G\=*bwAMjTIDSLW*8:J@b^Fe?91!\cK+5ycH=huiLB9^wqNPYLS+5Sk<
yVhF$! /XRHjGY&AAYG!/Z<$C9S^cJeB!dt?FP!*h$>/X=TaXkWWNn*aWWBA^TREc@yFy+HtBKtqRTRqWEE*1J6
J$^h&T !<:4SSCSlZpi$>4pI85IpRkYkBWI#Zn>!Ic8K&BG8\WccnBTtRT/>\wtwRY5Fcn1H%cRn$yVwpXah*e*
Y*!/IL %wni:mBXa?m*YbT5w:C$aIYmBT*cT//@:c!#$+Ziw6#mBW9FPyXLh?iZ6!#L4/!!#pdhte<Z6YQlXY$b
94C@Mm &Zaj*XbY!P5$nqnG8>18u%^>ikh/qwGRYEtSuR5Qj\ZEuG*Ju<>itL&YV41ycVNQ\Q%>Wa<G1%>j8l>V
kISe+1 *p5#84CqM:i<p=dtpD4yI5nVtye9mNjQ#t6bB1$6W1:hR68Zq$#C#1Shk#5cJBn5l?MpF6Hu?@SNhK6c
EBD\i< q8j#tXBQ=9E19WBVE!\chuybMh<NJ\8Q6#LZM>BVZadRCj4T:e!*aVtK4XcN?auCC:eAjV4n9h^9y#QF
^Djn?n 65D@htGMGCH9A41LNW*k?t*YwWnEEVbt:Ldh>DhJt#*9eGhthZ>HL6q=KB\&<ZLh1#Zw1CYV>L<VX858
$<HpFE YT@w=PuFMHq/!>FLJ1uitcST>XuXiNQCkj+<lwLqm+^4STHhX%&TdWR:liPnwSAye4DHC6eEG=Qi$\8E
Qj1:Y= VH<uyMblV$</B?W6=JeZ$n%FCp\KA#BB$i*kHp#6L4R$k#+yRAIq*9uBi:%>QkYFEPdy6a15?!^TjBGt
6tkCe% jGZt&ZPVn!YpKQ@Eilm#9InTCciji94J&mHJGyk>Q5w&paRjT9jBj>LpuLLp>A>KpNHQ!k!a6n5y<MFC
GF1S++ V\FC9y@M5!eQ:u5Dal%bGT4FIbL@YNmA4E:6d?FRkE!P:T^D:6\t^<y4S%4j^%1ETCqGZ6Gb4&d#%Tt#
LStjFw Y<KSSHpH/a?hQJBBMMn?59&T&tutKATKWI&68S9K+^%PBJ#/JEJyc@uaGjtY98/B=dqi*54w9Qa%wZIl
Xl!Y1k K*9/kV=>?!\1&!?cuIPm^L6@/?+@Yh6>5CcE*dEm=98!yCu:8G95Km>VW:>bc<F/9$Y/Lh6B9R>a8HlJ
H6k^1C C%c%Vuc?9G4ti4ZK$S\FVlw4H!Xlb$:y9tXiiaq\GDwE<Rl4yC!>Zd%aidY^lBuabiuW:Ld6Ea?uLny=
$BqtQl +i9I+$%:\8PTR1/9P:9w=MY9I/P@*Dp$$QEnZ#!k*W*E?q+>t&R5i<a14dt5udwVeY6BjMi^WBD=>PY^
y/K!6= e+aR&*/\JL><PaW?pGyjN@a9<KceTbwYe*BAWX<*VKAa:4VT<Et>&SN$L8^8BC4>:BLVLe9TlaAKGVyn
Xe%V+D >cRL5KJ$>\phA&A\IE#D4&/Qitq@FTBGP6jPV>?bu?+N^6B&XW%VY1QkQj6DA4B=#b4ilWe!a@PqF^aW
&=F%uQ ZXdpGAlBww+<1@EklYE>YtIS+cWuyh?&cmI9XcK!b>\XPbK4%1weeXuMI\kMZR!Y\+YLQ6B!#C/9Ll*d
t51&Rn h5:Eu6MT$K>pj<TD==&AdJbyX\\>I:9lLuc=I*=d&@!&P+k+Z+5R?m!%Hk1Tck^HP6MBR&ei4W>hXMSG
na@^*= PknIIR$>jZ1H9>5?5WV8ayiN5*1V#T9eQNyjpe^$yIwAIn%l8$$y#/iM1jm9KbAk*hXlSHm6RX<#L8wi
$pAPXH $%LWwKnHSt5W:#:TRjBna#ZGG6E:V%8hLwRtT=%pTeQPJG6epT5mNAh@*ZpTkB*IV!/W=Hw#@EMXFt?c
9Q:ld* hm5:>W%C%q&$HjVikHE!QLkC#Y:dt#?M@Tk%$qjBbe5tJ<@a*etYqnNkX8u#5iL^QJF@Y=c%$?R>i9PB
Ay*V5T PCm@9DS5??dT9k^tw^l8EeP6EabW!GMc>bWwdllP14=pJ15?BupMBGd#Q4T@iktwpD$@*=ZNHK9D1tK&
jC8ZAS N%Pp<<9Thqj6JZ/6CmFND4Xc$kmuC4C*VLH6:Nyq9#8j:+It>wumpFC%6YGEey&\I#>ApX^9VTjpGI4/
LDEI1Y ?\\P5>w?6@hnV&iaDI\bY<Gi/AkDY45hbq1MZ$KYDN^y&&X:#\%JYt<MZw&51/$mZH#^:E+h^YIZ#mMM
ZuH&<@ w19I^W/Mi1CZ%p=iR8aFZ><\JauEba6BW#ZRF+=IJtTT<XT9/IL4hHT/&>=i8\Vd&FCAG@liHdt^^=uM
pCXcA& FuJ:&i:X&>DZF&Y%*p=8qeHFqpeK?d#+k<J9PWyARFC6Cm/Dl8w1C$n+P:nqlV^p1b%i<F&b:Fu/C*SB
F8^*m4 9nPH&wLh8Ty!98*lj&VtZ4&5qa4>8&1+K84?wW:h<9NAZlhqK>uJZ&lka#e\\WZLX4X*kIKchQDDR>La
P#iG>c Ktip19^nR61E/5+D<1LBRbh6:<BKL9+:Wl%aZeBp\E1W&daQcq>iP!>SI1EL&IuMC6ym%^C:hF<Ti+YJ
&Chacu mbK6ub%>@tXiA>:Bc#=@tZhtZV4!bh+%B>P++Wuwi!M5FJ$I+#@JuCu/Ym>&pyyYh?aHG5/Ae&9FkPPL
q5Wj>a Fm?PV:nei5#JCKq:MQZh^<by<^bjjM4CE+B:V8HDm^iiW>k%>npFRn?uAH##w&$u#p??E9X\T^P9NpEj
QS%J\6 i>#ppGwV?1<=h&D6Ph4lWjWdcNBBbVC/QbEETa^\w:?D9L*lB?M*XG/?JPi*4J*:8$QWnMq?$%u^/biD
-A#1@T 0001aa4651d001202b3 Page 292 of binaries1.zip
u5pRE: qhV9=pVPS*>d?wWqu*n81M1<T?a8QYS$^4R1W9T*yYnQ9#&eMTNCbA>?G?T@^L<N8pQN+h<G!atZ=EhD
k8TpWa #c@>B%!9+9h1jyq@4:bBNjQ9%jdbD^#*#j&tPI4id<w619id%4d\y$/+R>X@9i@Y@69ek$?*WEZ8\YeK
G#&41P ph81@6F?%VM@>JFKHtphmKXPaH&AWZNH^6@TS^>JQ448/L4H!Eh4htdjGF@MZ&1$jCTZZbE6>FHKne?4
:$l#ZC GK@mRZnJG?yCN4mw^^5LHh#4!*m45u1Q&CcZY?qTCu%j#jeDhKdqDw8AG8@\?IJLP1P@@hY4jy:9Y&Bi
@9l<$j :F#BH8mlL+Z6dBE4%!&4d&Hdn4YwnbMuFPE#>Dw5TB9CNX>d9dHt:C:TlnT<c/Za>EFD1m@!<QDa/6ZB
Pw#1Kc uQFS@i4XDFttPJyCJj\*$mikwZ@w1=4Y4Z9<eeCyN>:+\ANDR&1cyQLiV%J?V=jW+HF=ZQpMTV*iLCuL
\E^H/A b<4n#GhJ19Vb<4n#@TY%@B5pFj\Bp54>RN?@<EL$j=D9e$4/k^>>XKp9jWt>ej%/9mH6VT???Pmn>>!n
8+X/ej DupYL=^:<!&*jQi:X%?6DyWjjB+t/R4tTF1HFpq@MXeiY*?+QN:@CEtDeKTpm#lK$tweLiqH*mKQ^V>G
HqS6nu $keeK&pYnyN$FK&T6tPiyDe=Zl/:*!dyCW/RNA:#Jh%FR6KCtJI?baE<%9?6p9:kSEpV<VbJy@F&TV6m
>AGNt1 TZ1YyKThiIip=*muyDH=J*uM@45pHeG:JY%DT6JduCSyRBbK8yV*!GQ<*!9yDlbJYwmVJZ*G?!VN!Q5q
@%=/@k He5ypmdkXEtueJ1pujmAyPj+wKR^PX*T9b\lcRnPqHRNb$qcm\>J?w<QT=1W^bJPbwtpPXk1/TA?Itp#
@\*H9@ #yd$Il?XNC#@LPq1@pZTVH^M$uGeI&qL&mY>!:tTB8jnpwdkQEuZpJc$F55p@ae6cXI!pp+tK&pPPmRh
%wWTP6 ^HJJt>Ey/WX!pwdFpZR%ZbJGwX9TVjSIYw=iTX?Tq#R9jbKi+SPT^1Ik/V/KplcqZ>LHDEmcujMq@eMK
LMVHaZ TbP^W6K64JK$NJ?W>D$ZTF1JC!Z>^1epne6Fp8:taptd5%4T^F\m/TI?LYqVLyX$KJ?S6DGZTj1G!!W6
jeLwPj ^lYTDtTNyKG=W6L9@K8ppdlK$t%<X6KMjE:T6*^i$6^<RhL:ZC%yQL+w/W/8pdR\Z=L$Pj<tcac?LPp9
!G!b/6 9mJyR4+1cXT?Jtqu4yZ$QQ<8ca#?R>J4jF*TpQ!uyF@=L$q4e=&p@:qi$mVhIGp19mFyQL+ycW??Jiql
j/ANhA 9m%yhG/W6BjjpVRlN$p/qi>K&yt%py:ui=LG/GbJ4*GLyCH=d$uV<u%Jc*P4yQ@=kcSH?1Gp:@mSyDu=
\4dXFh 5cTD?atp#jpjTT@$W$uD>DNJD@J#TcQ!C$p*e=8p=jtqyC<cqDSQ6$9/pV5pVe5/TYQ#K$u:e/ipS:yL
kQ45m9 $pn>Y6Kd*C*yaP/S6Du*Tl1R?!S6!9&TZ8aBTeQ#wKR4Ym>yuS/ThCMQT%1YDbK&b1Pp?jtNyEN/SNJF
&K+9X+ @XdTtj^P$4:<Z6LnQCyylQ+k/bd?X>JT@XHTyV\tcYW&Tj1h^!XN$YbJ=@RuTZ8%ShLXQCHyjJ/W>EhQ
\GDiIl Tb1wQ$8c11eq9e@@5@iukbJpX*pwtnXGXb*Ke#InM49XttelBAnSAkFGkJRanEB8+JuS&BkMLYMIdIMb
wPEuV4 BJlTZ:>4Q@8?/!EAZ@wcMHCBC>l+\AMGAl5DGm\%TN&AMDakwSFm!Bn&nw++hW=G9QX>c$ii#P11:pb/
dL6CHQ ju<i&X$uetjMi%#jG4:%jyhG/\M8:e+HZZ14Q*Sykj:w^*=MFyHuVJK9+GiT89Rh&h@lb=L@E*+t/:j^
8Wk4&T M!q?ly>J?h9<VCwuP>Z9=YhmEu+t68Ju$nBpypQ+:5tJ4LQ6D<uuS*>$$4&Bu<t^p/6889R^J$:TPuXy
=EdDWI YDa8ZXd9*I6*9GNHtWG*#*&u8YT6Mhait%:?udQ&6@HuBH@?qiu4mZul&p^5amb%d<:XhThj=J>>J\wu
P4=aek ?QP9#AXe+iq4FD/I<#4<8ap#1kbj@+:=nQibe%ZX%@Luynt%DR:6nXhZhlkcZQSCZXX%c<:L^84>i#t1
?NVe>d 4*@XZKq4c<9CK?*4C@u^SA/%VhQdn&kcY=8/5dH5<>1&dK!ync&<\yMV=F5nZ&P=mD#qbTqcW:q9PQFE
^+@VMH d5:4F9HGiuFSqHJPjhNe^F==kd=?&F!yVGPKLK1c:#dt$%^BdqQnN4EuCM?LK#t65WYcFY&c^aQFG>p&
4!Vi#y diX9XVhqNn@$C#!D5S9#!ZL6kW?J5wu%dKq:W=pB%=D#:SBucYEH?Wu16Jd1mPP!\yQ%>njMNdq?$<Sb
L5m>D& J>j<RYN8+L^5pZlDI>W&^Mp!<:JqEp8XDw&ZSX/S6=W<mJEuDPbB%1+4Y&bJtwYlZKC1yEac/+XBKnXt
hI%bQh =FdN5E=YcaqHN#6*19GGZSa*nj^81twa+6CQGnpMjiK!QH+yV@6Pe+AZ\cG=ZPKHnHpqHm@*\#WiV/+h
6mHcLb #NImuRX<9IGQJ*W44!#X6FkG!/NqbIem#J4BC:N1cQ4/e?ZyMu<S+GuqYaetY5*#b1m45eyC1VJiP<:C
IIwF<y Xm6NGpBi!e<49B>cw&/#65a4@a+<+NqLtb>!>beH+\QG@14#5yW9%:V4dDFdBw9bKq*dwY4VNC1!JIu1
J9#C*M ab&tlheqAy?4$5m8TC=t%=:$Y4qZ%T%CXy>qS/mnNEj>a$?iSu\K9P%!H9nLiXLacXQLL&Wi=1YeIJW4
%pCpm1 a$51%bn4:kXbqhXQGQQb:qE>X=j?K9QT8a<iI:Y*TqJ@6elKP=SSqlhFqGXwiC?eHTbiGjtl%/AmW1u8
pe15ME \jdt+?WKld@ILc8Tn#yYIHyEpiX^\#=RFh*!aHLpS:FWdN$Q=+85/Ih#/ME!SR$V/d$HP@&p?6jY9EI8
!wq=#S Pbkw#FkQ$yc?*//:STa@!9Yn#DQT<9I8$4Vyeyq/ba^S$JS6u#$nYaS6bZt>6JWH\cDXXyc8X@ZtbZLB
a5h:mK ^86T4&p\Zen*LPN*hI/lYE%<iV>y>6k4w6TZJ9NmI!N?ZdS6WjV6iSup^l!\n/c5&Q4jYQN=iQ$1T68^
qh&ydE iYR81L#Yp!+mk:nI%6IZbEBc&SYuS%Nj?/K$id4CYEH#NpMb44K/#MJCVnJ>he:IQQZ$*Tjei%wbi%Ej
a%S<%T Zp*+I9J?!>Q=lcX$et88X*p\Z!$Y!@p1>P!yDQyVe%$i5KucuDe&@>cc8@BDLW%S5bZp\iSM?hPdV:Ct
deSKGc CQ&8#j!\MK+L?9NF=<t<WtZ#bXbkD++9&%A1KE8pb$l4a8b@&b$jh$D:46HVl>1WWn6btHqXYb=k91=Q
@pE$I4 bWa8+@Wt94Biq=XM*QLLhe+5Wc8#=R<WP4@j%Gq@Wt?Mn<+=ZT*t$:t<1F%LW^X>>I\5Z$94F%:qya9X
SWcTCb Mtq^//!RTY&SXZlB*P@a*H*HS=ZKpy:RTN$$\%DLk%#E!<4>J5*^eK/SX6qI+Vyd9HM6@1PX4AXGnye=
!/K$N1 5Dajb=6%q8c6>MBKy9aCI:@\QHu=By$5DyP%6LbWt=hKu@aYT=pIV&R>9Gtikky9!n^nR:GZbZtJJ64w
Y+^y<n C6uLC#^%h<D94AMaW1$MjV\^qmB=!L$t?Cu4?pGP$aDHqmiX:lqJ9WY^9K5<&X!tkVDk%Cj>W=/9ppd9
/bL5e> %ym6m/H$==pMRHMQJ/4cDXD=K4$Y+%FP/cYX=DF/ccKuwi?aIm?+B#*eT^ab/<8aa#u!ulyDJW>#69Db
nn6EwV AJL*iSCQm1uIu<\\Ve4LQb9%$ldTnW^VN*EZ4PbH5$RKBpQZ6pu9H!W615!jLeN\5eTM^Yi6*e4wyut5
NHky8R nckQ/WXTw>4>DuSyYEXeG5^hPLI+uB\YQGqdmd*=:4ET&!+16SL9^cNLD<9qGPue<dw5I/+?qc:ThSHK
&hpw^e <qNdDQk5#PNaDyRd*<*BXibeTdb4uq^\4WQY4RY^4kZtHn=H5pw<4KE:5+$^j%9GBl1<qQ=n/:WZq&8Q
%8C+l< 5wm<lG$#cRBVTj?B&NLd!\&EA6Q$\!YLDm9QiNX!FWehdb14+$S5<CAel=#yI/&$CyKXCGH!^%^B9c^S
lNQB<! L^6#j!HDwyDBcY:KH1pmI%WpK\mc>ySn%uLkuyiukk^Z4%X/1n!9FPty>QTJ*&88!TQ4t1\%eYK8iG*B
W%jP1R /&B&EpG!@q%=LypiY=pqd:K4!bW#5=EP9:G@y%NuRnH\XPiMV8ZQ*%X=WPcymZ&@ZPbaL&Z@pHjySYKd
WJj:AM 9WW8>+Q5E8?Td=&=?ID=N@4uSaZBWnYS8$=5cp=WRP*pdTHJY9u*5:#MF&@M^X1EGbEPISV4nGZNS5cq
tWVhRn T4PV?qE?G$1uqV+F>54<W6?W:ap:Z&SyKj&595Gyij%FmHJYXp+4JR>VAMVAuw%ZYXuVnX#mC84h<!mG
RY!G$m ntL11V#nVdpqtu^mWVyFK<mq#56^G$=eGW:=H*mnEu<i%S8kY@VtH*<e^tp6!%uNtSmm5<#kB9PNmHXD
11e%qk JjJ9k^XAl4DM8>yW<q!Rq!88#D&H?!HtS1!NERSqtc45AZ@ARwtD/t5Gk4mi@&=#*tIX4FEde1XP!5&\
G1Fl5M cT/k9@:pb&CT#FdVbaalCKp/C9!YHbVDdZY$+B+4kpI\F\uB<5E^*NJFmlEqe%9Z?=<WJBF8^$q^eVnH
Z&dR$! khJ6bRJM@EDpmAa:51Zel<8pDJFpN6i49hheajPmmw*^hL1&W4WmIMyNA<!\hj$LB:mqn#XV%9uij1QZ
4eS=/Y Lie?=m!SeEwb*b+Z!4I$/BRcF%kWGyYym$DFcBF+@EZamekwD<&=XmcV1m1q66jlMpm#hLHEK\%^tpSi
pT*DZm qMn*BkJQX:Rmw59kQNEYJb\/+DQL@nK8bK%+Yk&=8&EhwptcyqkeLlMjm/d=yS8Wt&TFEJpEYMV#Cl*S
pqKLk1 <un4LI6q@XceWWPiB&LSCetKICk9I:Ypwt$GTW$cSl+>!cXFiKi%LP#bbCkkbMw4JuwjYWW\Re9Xm:R%
ik6lY5 =\c:+bny*MmSF<B!$:S?pEuNh+QABXtGWw<mqE\:pG>VK\5NlN!*9kcm4D!WmP>SPYA&dFwuRp6uSiQX
!hqTin lA?RZ&XNwY^L$VFQ$!!ZN6WZGLIBF#>khbl5KE9MSM<H#HST1$n*8I/5A9I&tBSFD9Q!TIbFL@$Ze6Y^
m<>?^k DpiLRZyWWT+Qbw6IumA8&p*^#Bdk%I1a9W^a%=k?bcBkqi*ptw@eRI$ZFCbq^tYHnjS^c=Y?5bC&eqt#
S^cK85 ZiPc&k^+9!LK5ZbJ9$/:1NBy6mtn9Fl:Z1XIqH&:DXMBMTL+lKp5GKp9E#+FbXu/$5=:Nai+NYY5I*?9
We:I8# WPM$j^bI6=FuE>k#Z!=ZM/CVGm9R+uAl5yVFyFDFA8iLVy:<+S8/1k4E\EblX8hiTd1W4MhF&tF%whR<
hE8d=> t$Q<B&!Sw#%bNQFKXmVVFWALS4TIZKEWP\^<RM!6RAHpJIA%VVnR15/Q9CFdljF%FRm<^eFCi58ti94&
CyhLP? 8=^e=wp9en5tB*paRSl>?W!B$RC9tA&L%E@!GPlC^mEBZhP<Vh@I:4:SYTPl?<WhEFJNmT%KFkpcTV1@
>ehpI8 RQ%KbIKlWaE*n4Ppp?qDbETbK>bh$Mu:+d+ALySDckw=$^tABH+Nq+6k6W#L/\&SSDGD%CS9hM@&8@#5
:h*#1% ?hPq!FJ%DAFL^5:VLCB\LCP8YB:+pPFql:\&pjI:Z8bcy>qyHZa\iZ&mqhVQncwawID^bBD&#Sh:1e^b
>C@Mk* XcdLN=cjaS#X/#SyQc@tlGF*<b$$e!IXkV<mQYH!TNM8%hiWZm:!w*VTVj&y&??5Quq>TCS!VJZ:<9b?
G11B8G 5F!pYMVa*/SmnB5JabC^AZ=>HEGtVYWERe8kw1el^Bh=M5phFyLt^tnB8LN6MA?T+HBGYhLW/QBqP+=!
-AJ?Wc 000668cb8f1001202b3 Page 293 of binaries1.zip
\%?Va$ tTFKD9p>?C9VZNy!1yH*\@CRTwBwhR/\ib\FwQYTFZmJ6+E$J4W4@RGAXjB!8EtjGcdwZt#ulhRjYke6
S5X=@l ue6El8:=!%?Q*m$6WI6EYR$W6iY=XNVGBCBNIA6#*YBS^8TtHbE#Y:nk/wntMhyFbc^BDt&pWjDYbleQ
aw/$M9 RRpW>*aYC?=8MPT=$5mduyyVYi/im1+hi&6XR&FPqLaPF$CmAyiPeB5By=nW=LF4te>FKqIB+Y**a6II
nynBM$ T?utdHy19V1u>bKV5JDqIcj4iA%6D\@4:VhJjXaS/&F9D&e8taSV4u1:?lLypYHi+G4TF\^kYl\8P*cL
EF@>#i ckiB1QJ1:ySZ/EAq^4J$P5E4<5D*RM1Z!=TXckJq5Hcy48X9ukMe?*:w??l8$m*CSd@/%pWwGEF8Nn*!
@pQZ4q R?qI4hS+uC:<LA*<1Pb<Kll/iVSH:^JBI@C:hLHI1ida8Swu1VSW%ILS9kmqDTEy%KXZyM6qX++I!$GY
lYMWAZ VZXX$M^!SWZZ1a1I<6wR88wDR\qPq*^bM4F&=>NJKBNSYd@qGVXWqGk@&ewwKNJRb5=Rla<m/>NbtGJy
FWZ>%5 N*Ze!q9IDCtC&%YBBY$cTyj%N9bL!nd%@dTwCaW6b5y6\a1aZ/p5B5WRdkQaKnl?JcQZ1QJXtpSlDy6H
LymBGc Jy1q6kmRAFTMGQ:T>TdE\yj6KHhh^/#IIa+G?dGLS8GPS&WylF>9M%^muVeu:JiRX&ZYw+\51@I=&=\P
TiVNc< Ab>V&6n>#GZ86DqQTX8\#Wai+m+=\I$iKuHnGmm1qpe+R$dZHh4XGjJa+JqeF:I5K8FSy!HitG@86<nw
<GMY#H ynpSTS&+S9=RpFi%t8CAW\n<XZYtjpaN%LLnHQ+AT@SYt4Ft\&IB=m/yuuN+/t5AYWY:^nt@RWD*?TKW
/#4Z/# WFh:$*SAB*J9B=NP^1@Wwk8tP8e$WS5ukDZ<HhnCely:YDZ+L#<qjD1S&ntlEiBS1cqn?TeRVcBad/F/
uyP&Bm 6n^Gn9>%Xe/jaT9?Pj\6Pj=lPid:CZ<@?=TuA/FQ=FIZLS/LWt\tQ##1*kCKIB#$d9uZ!L>T@y*\?@np
aLNaj^ k6l:Lb!9Lh>nR=A%k1%46YycWZ9HMqdc/kK?hpSpq!9h1c<9EI1XIHBti\u<61upyiTQMTjW9t#e<Ylc
$PXBwq 9h1t81S6%q6&AjPjn#lZt9HP\GduGuu6c>KCuwkCC8ipFW<E<5le6Bu8pkqbldZGG#A=D$Pni*w>HtD1
d*MQM* yJuIG#>Db4m5Ad4*aN@A<WNGlKm*!mai$L>e!M6/8jMF/a#T?dYZZ<SMKlilhpC?!F:yX=9lawMduAKB
CtJ1n6 %ia6F:qw>a*IWLCV%G5SXtPy9uQX8m<86!$lZq<jAKjJNCHmdXX8m156RcT<?91$8NLmX%qS9NQmijI>
PGlpcH =56=1RA9V*bAMJbL<t?NG:S>ehAY/>4hV+4Z=Da<#I9q4lhmZ9ac:q!dhXG5bX\<5<KZ$8MD\eRnq<T1
8K!$Qw !lXKJwyHd6SWbC+B&ETYKuPS1%a1MkD=#aQqnPkQAuK\<5Qq\c1qWu!%YM1!Blkl!BF/@nuEMi5q5/QX
<^9dH@ a4GcmTA1p%i*ZITy9@Sd\Tt4!dK6&8XpFiE?\Z!?t5?D@L/!IbwNSJKh!WyRSa8Dw>S4F=NbJ5LN+8kR
^@BN6W cq^Wi4+/YGB=dBeH1>\Ly\hJ*MVl$RGW<HEcJKpjAAk?@M&RGqbabRJb=/HbnqdVJHdYyCR4Shn!IXPI
*<q#m> =PWLummCwIY?QMqm&RN=TiVdEGy$V*ZwKIneE+qWJyA9TM55m^cL1PHXwCCWc#a!\m=T1h6Z#+e6WICq
?ZL*kp %C88Ik6Kpuli!cX%9DRpkBjK/<&=bM?ZiR%qjyDZImVL=RdeS>+%^iM<elFQ&9dDndJLIyE*M*ppYXWk
$!WjIA 4\ES6dYAIp14BD/VVEVX9JKDbDGRQbBYGp<pNY?TNaAaI4$CE\tT\$uWNtXb&WGkqZNEb1mnnK66p$EN
X1BqKu QKk\K/Mk8?TXiX:K/QuWPI8M!Z!yilpu?JFcTyHa%1t$km##RT4ayT!!FKMVV$KDAeTHZJ:^:VN=XE@Y
N>/SBF <4A6<k\c#iI$?!JQ8/DkAaA8&W>XGPb>KAey1eSWWEC:\M9FiRclYKBTXutCR4M&F4EH>X9FFE%S/wiQ
ZP@mEV S+XA44PWhkl1ctAp\YKAm6R#!+I8DTRaT!=N@FmlmXnVydT5ZNX+8RkDiYXc?TMXT1WtMGd=<FiL>Ft8
NXqc+X \+MD9^W5DL$thP/ljJM%EJwIAV\Riy\>m+wHIHQIt\BMuWi#VJ:n6S6IatpamTk5R4qSWXVNE@j\c8$c
p!meC8 j<\\+lKKidLaR@=HV?mdV:MmwCSlyPwKJ<%YlC6wp/mFkW8pD=GwI:tq%ENi5\@BTIPn*@HTTLB#pahJ
*$%+\8 Xpnq+BISlH\<QicCw&W\Q%lA%G#XCtD/=qpP4#6RC>!/uM&Y1uGTMd41=>hq4A*8nYVXcJ/tF%5F1!QI
AR=aX& l</RyHJ4%bij9Z%&G9&PjM1&bm8iW$pu#T+9E$qHpq6Lc*kCQV^==k41Yh+cd@d\DS\u:>K%c#pI&w\p
*:CDL1 <nIj@bTw!LMqVD5nX1Ch%nZSmNKy&=A4TJetG8&<PHhN%Ht!#KT?TLiiam\AemljyI=hFX&9/l%R8YuP
dB8/MQ 4cGDC%q:#ckNkB$hk4dInSt68*Kd9JVSI8<ZqV#IX6yED>?Rq+\!j^XpBbV9bdbC1$^qqt\I@kX*W166
mXZ&5+ hMSWXJw&\AWeSqA9\Cyh\q^WW4<P#Fb:um\S/\+4^DwQX#Iy5$*p8Xp#>Sq&=B9BytZ%nV+Xh=NcpAiw
\bBh#N AA<//N=qNHtqHCXTdl4LATX8E?NuGZMq:\PFbBF&/$jpndI&Y$^uC<#G#V4Kbaqdb+DKW16hXMyaLjG8
^b%P!L e8&%t8ZLE6AQbquAHIPbHLQZIFPD6P!c@hDRE!DmdC/%u@P^8l#VA^=S5XiG^RX9%KZnG@ZNNjThcmkT
nAm/hi \W6><:L%Yj9XdTd#Rl6n@Ni+KTb6Z$bL=Y=pwXG4H=:L4#Ln!&Z>LwbS\BPS+&/?lMP5WH=m!Y&VNP/H
V$dKw9 9!WLSIE8BI6DF%Cj8Xb=S@5khI?$$XyDyci<1*bbXJA<8I^A5\<u+bIkS:XlJ^jDKmHdMkXw%E6DWyIN
uGPHFK =p4VD*j^1Sym/IdVu<GmFQZD^TmSM^>?jXQu\TKNM9t#64I5L/MKM5FS/NZS+qCpBH?BySjwZNBbFM=E
6QjDlH wqmu1<Nqp6A5JZPGQ=MtV9!XVA=&ue+QF=umH&y#pmkTBFSa$!+QqwWy=K<<pILK#!CwNNFmFdabqVX%
5ewL&t ZjnVw:S5mpBEEF^/9plCj!Y>LX>Nbq%5+^TDRt+DVVcM8K$$dPE9$#bhapd=6cjLcF=*m%YR6mIuFVLb
?Rc?bH !=IpR#8Ma1K?=+Wl8%FN&WpEH/^D/^!cG6pB1Ck4%Gu/lZKawPX%JIk^Z%6uLbAXj:FI<nX>AiS\GeRJ
mLE:il APWP8G!AWRRE16c<\kQp5c=D9QBLeGHycGEwN<b#bRX8k1tu<PWNcEkMXkGB@L?j%qVL$#FIRG\@ZMMA
6*mdEQ wDl4ty8D*%BXWcN4mI\tK^+k+YZ%1tt/+TLEclZIV<!WK1XTn1Mw*R?CPmpL+$4#S8Gm:DeKF?YA1#\R
X@>*1F N=N4mW#h+HnLK==94I4dABJVC8MNqE&+*D?<SuBLncM59D*SaG<&>WXwyKSE&\+u5b++WT+leEXR\paA
6l6/N> &dZSF8F&/\X8PmTyaFcRmh9Z%lNBqS8Ft=9/5qFV$ebeld5FHW4M6+/aV$@d+NBntN*WnEXwhdMtN5SD
ct8AXP uNch&4qP*N$*Am+*m4\Aq9S&E#qY4uM/Z9C$9pRkJDjSt&*MZ\L\P>*/n=&1IWmRI:D*KT%8J$TVG@w&
a6MbI= >G4aPJF@G<JMu4w^^*cny?PR#ZkahlN6Zu@AyFKCkjHh?+XuFR/#@6Q6I\tRi>RX@5C5iCu?PXcI?TlN
!ESWPj >\Tp>Rjp?^<RwI=AhEIR9HG&S^kK%?b:yQX8<6IZFBW1yl>@uK1&^LkjP+e!h:Dt#6h?B=8i@S$QIj!<
>RbH4y TVQnpcYVl/HJFSnyJ1#GWEhAlXCaj+8&HV#XikDyZTHedLAMbPedw<bdB#Hq:ab:bMXH9=bN\<MAPVQ?
WkGLPt 6lti&?k9HA4iCEdqMKye1E1WkiV\1T!hA/:/9Jy&GB@VKpVIM!<&AMPF*$Jyh8w5t>BZ9@G<\Mi?YBIZ
:R?kZQ +wehcAepiw>DwnZXYppR=9DTM+IbBV=?NNCkuL@FtX/JHaJJK\JF@LSY/CpRNP/LV^KE/iE:#6HDaE<B
D+/ju: BG%=PqR6FcW?tatw9i&ey$X9:ldSP=DbHpQW19ZEm&9PPY??$ZnJ$hFmIT9IY8yT$X^CNDiC$AY$$\=R
1:HbIC ?piHWJ6&1@q!NX<6ajQ\\pMBl/XAR%tE<8ZBLJSqJb^NF#tYJ!:$!?p14:Q=SQB4uB\I8BRIPR$F1mVV
jE@/*? /c6qWbL4#bd?<tk86*Wc+J!?WM=J\Tu:<XM?8p#S+&&t&NLmQaAXC\HB5F%t^HAbMb!u!FNt/$BRqtj!
\ASbN% IK\>G<:qQRVwFCJ+bmZpJGLNYkAeLkQBRXahEeY+F@=I<l>&RT8a4AeD#C4kJ\!!PwPd+K5LmAem>R5C
GI9+RJ Z5n>>#VbBCKbi>bdZL<c&K>W8Pb:ACHGqKkm5\jeJ5CdNy5WKSELlL<M/=SHjJB=ZVG^knTHPI4mb6Jk
HqMiQ! M&R^JKyM6Vamd=SbHMuD6*KEQLi<KFFFM=qIXeTVTpVyX\?R<LJ!p4YWnQaih%ehdQjiA?cVNp8=h5y:
<$b/&! 9DGpmq4E>^IC+l=kk@$\L#N*Lm^<R/a&T*tIhS&FWd%Gi%AaqGdl/\yGV1XTydGAeAZVba5$Zth=YdHl
SNNpJ1 ??##bCt9cTAw16bH@+Y$Xk4C<YFY&*<N6Ie/N>d:4<EhGh!u+G$p4aFhEIAlu:tnFAHRIXFpjcwJSNwK
1HSpd9 EymCwXNdm%BKJ%4B<t6uq^6NY6JeMb1&yiPP=$p*JF!1cW6dlVR/WliR=bCqZ#$+6VRN/6W64%G4pL*6
/@A&N5 TL5?d%IQM8&kH6m4SMbK=H+yBPE>dCaaWFBM+1Nm+aIAt^c:hq&Z^M^A#9KN:?E=LCcZF&ST$yeSy8hC
%IYiPA SpMBW#hSedhIXa6F6\ZwpJyZ%#RPXXtT1^F<>*H*DLD:\\cGFbq9aFmS49mt4+STZ8ci=RJY!n%EllHt
<N<Hk+ C\aE^1$k*bS6q\V\!wK&*eFA#9lu6pWcckwBS6RLCLmM&1nQ@pLp%jZPhF+VGYi?W<*BwkXR%GAmje^a
iX<*W$ 91%@=\C@N?qcNJlJe:!E^$X4qh*Y/PiEaRJh=Waybm^P*mIp^qW@*ClkH/hjp&C@Ck/ec8quQ@Fw8<&n
^>d*^m qtnRRJ?ZFHGd?DJ#!LE6JYYylqyN>^*%E1bY+!h><M#ic/l9tG5w*SG+>/DTCPAtyFH!VilYuKuXeA:5
c=1T8N JX%I1kecu#a6l5cy1d\<>&y+N#mD:6bk!L+wS/!=B@4RVIbjTRiPhCWn6%lRhTewKJYb4YP><\JAY9bX
&XV/=4 EB1liY5\R1Q6KFn4dEyLj1kN5n6Y:By4eRQ@?dW^d@#VD16cB?!/SB//wh?^A+M^P?C\V9%<\E5JFN6=
AnIWA^ C4pNjGn/+h9aMZSKy:heZR&!^9uX+C*kSEAFw*S14kX:MJEZ1Aj%=uB9Mj4C%d68nq#a*X^Fway1iSFV
:mRI+X *mk4iVmjLWN%jMMnLHK9Y\ZTCuY:tELd/jp!\\^qPJ%uleI9iie&Ye%YTT9XBeMSkSqe<uuZbPdVuk+Q
wFNM/u aaG^eJ!ZYTM=tATFLeQJJIq*L9B!iSDBkaJBp<ZKd:iDA^:#qZGPj61^&Y1nZ?P=tp/+5H6Y@?pVyT5L
bwYAdJ 88wKYuZ^DHKdkD+e^Gdbt6/Cuw&nLA8ZNCjVYN@%/T5:G8qqJSJA=8h\A\LPMX5u9u464YWkiFD4A<RJ
-A\l*G 0008c9bfb67001202b3 Page 294 of binaries1.zip
QcY$n5 alSp1!wbZPA1L!CZV5M?uZQH#p5AG!&*nyQD@p9AGGTHu#<9ndIB&BKS>TQl^yyMn$KS$Pmm/*q5taGL
q^?::& 14R6@J<M*Ymd$&Gt$NA&?n8%%KP$mXkVNh/LHH>BIYJ94!m5=NtVltdEt<PLIh*T6y!KeBbV/1a#QnWR
t9jqQ^ <t+m81Z1QY4NBWmQy!$*@=Ca/MRe/nA6<>XMJEa%Cja\*Xy/!tIpuhA8iBYLuWI&8EJ8*TE*DpCi<uK>
bq%=5G \*9Z/D1SW1i<kW$SK*>a!F9ElQ\WqC<E<?ZmhHql5b\H*\Cnqq#%86bBCY<?R@@uu4nW$M\qTPjt%49^
LPGu8< QZKue*4M#Sw:+B<J#$Q%TK#nhhu#F=mdTuM^Z1@n8F@*<dq%@Lp>Wh/ll6w+@G:w&Vpli88eVjHhDqLB
jFcy6T B?GtaL%n8X@4ZK*\&t9yBp?6%N+1V@Y*=cjGXYI8Hj!y8b#:A+B\nVMYY9\m8?#n:H4KG#YI!j+QSaV$
b+eL>T Py*al<%HjbAk>@&8BuJ/h6c8>Q9e%#4D+&?b%=#Tlq1aT\%Nel?ENSnPC@TaHNCZ+b^&!dKnNnTt+tW9
H6\X<m \?=uajFF=b%4:G?b9>?dT+4eP>dFbc<RRGN=kklK\Dpwu>I^>aB?Zq+dah^6?NQqpnBGc9BbRE=i:u#6
5C*9ES /cdb=6V4%LDF+SCQ1Em?*>#mZ:4A64#%L%+nyFF@#=QScjXc6yy%FecTJT/Z1nlGq=ZFjktE$J6u$+!4
a5w?e< PJeP=+9XHFwkDBmc?8XP%:^pJyMQF+aiEWGb#Xc?8tqJF<=pR5$ah=K6F1$8LedRd%Qh\/9^awb/FPiY
ZWd4=Z i<#&8eld9?$8VHIty<T1AWw%WTQeYF88ZRa8?FiJMYt$yXck4!:F5Iw%9Zqt9dZtXlB/\>^d$:#ywH^j
cjFyQI TRM$MaTQVJ=/a#=F^t$Xnb:PCATTwWkHIl\FI%Sb+qTA!<^=pcG1XC*ACAl>?qw:FE#L8Q8d=6Y8<\HN
8PWZRp 9=6tkTp1K*PSdYAbhkw\^jJH%IyuGYGh@l#I$hWk^$jYwZne5=uCb6^aYMWEA<u5h=EPE8yJjCyhlLb4
$EM!4b KJKiT46eJRZGSFV\kcKuXFY4Hp!8=5Gpl6q#$%^&LwW>H1k=L><i%5C1lY6utT1K#F?E>CR^I1^:4c@L
Ru8p&4 DnF@5pkLGw$^=eySqMmeN5C6RdIi?WpYTji*nMPBNly^j#Xt&4bNjWB#l9QS+E!Hn:Lw&<<TZI<?Ruim
ba>^pA T9BX/>F?Bnmwby4ac>MpK8GF^NCj8KIX6ZG?5Q:T^*^dQ@\=mybhhBj\?!JMqpEpZSV!+6IQbeFEbA%&
KpQa^\ 4hI5weeRdLqBtFL#CeF:9k#>iXD$#WXA?qt@@LbRDZnJI8uTaM+wF=/VBB1u+/WcRakiYwT4=ZK&+8KV
Da:QXR $jP\>CeH+hw/T=4&5*^%MQQVNA!Cdp&BbyFAw\*Lq\kZe:?VS^P==bFuakEJE^e&B<YTBYatPBEBb>q:
HjI^^y N>yEyGbce$XCdXi4ZK*PH5RklD/JTJ?K!NYKuDjW<K6Mm=LLDBT:A8c//T!DR$/:YEa+nBbKtbY!$MZC
IqlFYh Ia1!dAqQc&wtVB5EIkLZ/u@=A6hIbi1*XTGTIdRcMnt5qmJ&=^l\#4b<5jYVw9u%*q!EbXKt1$?E%W6p
M$dnDp %J#PmIITSb1cVPk^4BEKe6qYEDZRC%!A<mBb\\5/199l$AC!XYwbql:et:<bu@qB$wE6ScpauT5HnYQp
N/h<%1 nCi:T>Y\NLBXT59L=W$>?yQ1c^i=X!F<!+MXB$a@GD+E/5QHqL/^IuN*5d\PhZ\ubp+W8F\i#iBNSb#S
=R4Jyk &?eSVhPVGBMeylj<kNYZ94iCTyiL*4?^YAY6wd>d=\S$Hmd\n6bePqk:q<nGuQpm\=qT$JX^\nK/=YRm
eBW6J< *h?Wqi69Lu+Kj8Rq#EqFF>YN&n>lnKpHSamZHd^<1NiXSX=HHm$R^E/#yaJRpR8=4Ynm6!Y%=VVLtijm
uZ@F=L \RYF?a6EiuYCwiTecdh95+c9mH1n!@&BeKn!IN/L%E?$N=>Vu$E$VN=JE4yL:LmV5pPIJN8Y5QWNFYPB
iZ&Lu* /l!tcE<Bn8Xn9i&WR5$F/L@/+iWq>AE$i^iI+JB8Yq1c/DBd!e!PLtHlb8?HMb^uI<!5Ap9qnpSPc@RS
P$8Ga: a?B<Cw!VA9P=llp<=#S?B9u&$Cc$IHGh\@4jXH8H%XGt*a^8Eadh#ER\GWLwl5Q!eAG/tVhde\PtPLuX
R6nePH ala!umGea@kK<C8c<YuKnAadieMB$cjTE+b%!D*\hc@W8h8>l/^kRV5$+eEK\?ZY>>lCNm\c48N>eqN#
w*bHau ?DXND8lw>+/:>WY/!LkZ+jQI<PiV95tcy<l<5A^p9y9Q@cn&wPkI@AW<YQ9ta:%\pYVyA9yynKiq:QKZ
\#Lh@5 6Pl=+TyIM=tbI=q/&8BwLu6TV</=+IZLbS<5/XFJi%=X?AeR/>Yi>#!%=<Hb%Pq%cyM9Mhuq</qj%P/\
=1Te$\ q@C\cD=N+$nthbuk5#mDA$JXLA:t$GyG!*taljNqbQEcu<GR/EWP#+$Yw:4\yL@t6K?=GBh%d:j$?a=m
by4QY\ VEXR1?D6bVSmPkeci+p8QG:8mV%EW5mPSMAJpKCA5^$#Zt<@^<AbZH$+KwT#\>8jRHLZqXT?S8W/n>am
dj@LR8 QWZ4KFTnIP=pECPZBApeT<*QYJX9Bc^AX5dM&Am\Y#llkX/a19ckELJy=w!@dDS1tE/b#RqEbWSCTw@!
!tBdCy XIX%b5Y#6PJNbHwPaPG4/M+Ew:y/6jZeNXFDu=4$/LmJ*i+cl+$KMjwp6jqBI!BLR#L\YA!HXNKCdclY
ZPpmh4 M+1Q%cci!K:4BIia4TB&dtm$8\b<LV$LHnP>5\NmV&>t&LFa?5=b*a^R:/cVTKZG?P6+Fl^AiXM/mQ:D
>19AIY T9d#Y%>j$MQwSLy%pD\bAiTJP^CtNQqqTpCjcL9Ww@G8N%%>BI%BpTc!CLJ9EYb68I5\$N*t9D#YKYGw
6L1jGE t9w8$mZlt/4SlHj&y!X/aYum4H1\:q&&\&TTNe/mB<^^I9?8mPA19^wGGX1Hc&CHXQMj\bLcAdj&9?pQ
&k#*EL G:dHi/ZPj5H+Q!LQmGA@^QaB#4*4hn@h@eM+Z/CeNHH9pQctj4h=/kMtw>aEh/*y/HwSCLu?A@Pe6<yS
q$%heY Q//BtjSeJ5MB9D4y@T5+?bYu>JL6=Zn*eIB^Q&Yi/<J:cM^GtQdIQ5CFXV&c*t>iB^hNw/8lN/Kwa/Id
CQ&nI= ckjeRnqTK?A>*tMtYlGyiTF=FtSFXN&5<#yTCWS?lu<kkJQ>wQtZAB1ZDPHRBy$CZ#jP%NnZl&cEXw4b
\!BM#9 yc6wdFJyEcQt:JFt/\mL\pbha!</aPVMtQCkhj/%p>F^>mcL#*el8QV/&BeeRCVlZL5&lPt@iNFBCt?M
IZ:N&5 WkK/+G\k\@Wc:JXDR+ZNVaKjn/GdwMB8KtpGn<M@G$n?pitIl=qVdn@RHNwQ#&=\GC*/$E<IbGj<i\QL
+8BupM k&F^M*^Ea<&PGqTjiq9DXZYtBqWD9cJNa*:%+^C+Z8cBal5!QT!C9CRNCShJ4KWIhEHwti>uMD4&>n=Q
Addi%D jwRJ5mS?<c4G\Zbu*CS!l*GVl6<TckL<pZQL$b:yLJ&\b=1!&LRjYTkKaw!dSnu5BVTyNp9uiSj5/h:D
ew>1PZ @PwNRSu#SbnKQP/kTbCp+YK?ktmV#Jbll4pN:w&F9$^TZ!MnSCa@tC?Y6FS+!hG!!G\*l+PhF^=Pq1&J
m%FEqH \+Ny/GZ#ceIR1&R/#>dl\TTJ9hk@tPe%j/uq9@u$p=LSuLtc#lp>XSua5N!n:#cFhcK+SqJdPQ8#JYCV
TAuu$l >ceLmDDABRR6pG/t9kBL\S?\wE4XiCX6ehILp\AmiANZy4Y1Ran&AiaAXSC&Ai!TJ&4p>AS:4m$6TuG/
I#IG/q Tpy=F\%iy^IA+T?9q41Vc$jGSu=CE\m%ulD9#61mhpE5Y<5N4EiShJ@K$PjW9Qu=mEiCQ=mB<lEScM+4
y^@*i? V6b^YM/kJ&lEVqtwV:tH$FCL&51p5YTN8\ESCd/EnW4H*l4YM>8CMWDRVTWa9c81TKSXPcIV<d1DBLjn
XjF>tC TI9q&F5nLm9jtm<F?#tF^w/:I\8y$?#ABwcw49umQK^M=w$ZGj1+5S/ip&K>9eF\D<e5M<CVS6&VF6Ay
:jn!eL p<?mw4e4JpDF/%nnCW$R:!ZaN/h5I*XcyCKk\SwyaqntLTdT<BbYVXlpbekl=qih5#T!puWiy^<NR>:P
im&j1N c&#jKbdL4VXRNyhj!!/lae@<<pX%jVSud&F8iKQ=CNRG1lNGIW&YM%WHKC+*ydPM$y4QZ%nLuliBa5F/
19^a<M iRd^KpQpK1&X\WHk$h8AQeXVIwCc&1qWw&RwI#jQ8eQA1M<Gl1#*q8Hn6jtXG?#^tFHlPquT+KWYupGX
:$*Idc <Yl@4AdT\aF$<:CnpR>pGZBnde\AmGdweTnaA*MlQCHZXpFXtEXh\yAl&GnCLk^lVcVqCH=jbjMJ%wY+
e1B5ba Ch\8C4hIXyG#A6*/E6KQc?Xy/C$eZVa%*/EMX@+ckZuP<ZkLTYwZQah*MIJQk5!/Nea/P%Rn</k&lFLV
T6eQjk NAPNK9/e<b!Ck>9qK1@c=SLIybEqXuyRk5Mkt1y>&d/weya+TM9Ay49Yy6*B*heH/A\18EN5P\>&GJq?
/1+Yhw +&5mKj5L^S?d=kbkBp!9pNDY&ZK&YkRJGC4pVR>ucS+8$JhRd&pRh5pT5Rwk$jCVaDaX$MLJlj+aqpR+
kj#Tp@ \cIamwZ<Gey$P9FLWHFMW%p\DGQwK+&4p#uYX$@D=kYn#\kDFG>h::bGtw=SPn@*jFwnQS$ZnQDNp5:D
@P>hQ+ d\nmP5MVj^EYJkR!WP=WjS1eFGtp\h1aFZB#N^wVRmekXWSX?kjPkkJTEL\k/KKCAtb4j+RyC\Auw%JS
9n:wZG KaQw=4L@<Jm:P%*FSS#//a9$+KCdu^M\bGB+SP<MLaMS/Np1eRPJ%M/iyKmBTAZj1eE@C\e>NT?!GqTt
9^mbDK 6GQDX4/\Wuh%yP+*NZ/:Pd^I#WqR<RVL4B:MuplE:\G%64:j@JN:9HB?6BK$bVppGZIalT8EHQcMPL6K
^<:HN4 m^L%&!e$eFqFIh/+wpQaQXbw+i^KEP?9t:INF:Pb*%a$njXP6H<8Ke:WpLBdm&yR$EuuA?a:ukdj$dCn
F=bD1R nXqX$db58#BN<#Y<DDiW1TpMhmMP\hNypJ5I9&1Btl1C!nRdPTh8!yM?uWF\luRQ#Zd$G@j4i<!jQRjn
#lM\JI wNR?MIb<k#etYV#W5pTd^48&pAH\:=TtSIT&6bC1ZhAhCDwEAV\N:\&e<<Q!V%qF!IFZC+L\J%LFnj#:
du+lWi WZt!*=QDj?6&Q*$WaBJ\Bd$PK#w4dknE*tXPFRt>uheE5eyu9$h?d\&IR&1%RHmMYK+AkHwRp>VPa:Km
%b=m\4 1!bS\G?e@ZI/S1&bL*<Q5hJF1:RmGJX/=<$YM+\WJiAM<a!G^M1a9KCB9E1IX>j9lBMn:A@8h##t*%w4
M\hV$< ?9LeqiTuA\*uF1GHQu!+#$X/JQdt/h^8mhbGaK9GMDA&!ak?LV%Hb<h+VQVEE^H*n/ZC#8@<ht!qNu>w
AbM<@k 4id5y&%=Elnq#Wmt=Y4B\H*kZJqe:#NG&VypaqpEudiQlDmXmNTNY/86qD:HutXRp:@!IdGSj/RIHTK9
#?e@EY ZYSldia+1JYDCl\EWTLw@a5BSIpjpd18\i+FN@\M@qX!+pBZ=myd?y/uh5#Q^>^Rb4AXR@G@!5y^yI?^
*Gadh& !%Y&tM@lKh+RIcXb^%WD+8wmnhIApm9HX4IM!Il!!yEKnN>Jq:5HNiJ*idyI/IcAFXdiEJQ6V!KWE8ca
#udIZQ nZu6/HyVcm!NmLXaF8A4b6cFS>DpFY81$lkPq4y\:l%ITRc&tQ+5$uAIy4dAulX+EERRA^IEq^9FKVj=
nJ@Sil GHcdE*8lwh914GpDMLuWAp==kw^Ln6%@b\A@MNT^TQd%$!*n<=a?jNpXN%L:AamY?1jlS&J&6B=<5&4%
-Ay6AB 000afba40b2001202b3 Page 295 of binaries1.zip
?<EiaL #iK#n4ZKySj&CWSqwbQ%=uqR$SdJ$TKV^eVn4WLjB#hF^R+J<C6%iq*/Y4IAha!jih8R&a&=L8JFqky8
Rkb&iG KiAumGq*a@/DNX?G!Jl+Mbt&kLYwwTCSG!^BZRI!ASG@G%RDy9qbIJM6VC=W4wh?1KSki&Iu=a/5lm?/
knjSip %V4?8Cl1M=qq&#VMenlL6FlLXSKydIbkj+@ek@DLD:6MbISIJkkIi9Lt%^H1$?dTydIw!*61u*:Ptlhw
dIjVFi d\nIXFMNIDwV%Lk8I9CqSE9R^\SWjL=MXp%BAJt8SjJK!SH>YQajt&1qJaMP!app*j/n<mmmFCt\NM5+
YNiRCS 8yJq\nWj*X<RXATCnEG>:Q9lGdCh$LYkmBT$mpRXS%*Yiq:ShilDG@PV6eb9u=1ZAM+W1y85+A$J\JA!
PcQlIj Z5FSB4kaNXmn?@p#F$:+B<&BP8\mc5c#:TLk/DI9!LMw^=$yJ=LYd\uQF&QXFVI4PCJPwhk^JJb\lENH
*#n!X# hP16SI188\NE+K?:#yy@diEHdbYFqJwFWIQKttyAS%eNL61\RT\epIGlZ/TMikPN4A<S&i!IF4&=*mk#
mZ+8*Y k8en>5!ci@P<^iAFL55!nL\IQ1MIMkW*Zh/GyKcpV$^X\6<6nGSRLm8\#AEq!+kCj=@I/HEtD@#V&yeH
XpHd:y hVqVQ!1N?aZYR6*^$MqKTDV$YjSI:kBiFdIDqGVhMI=nCp5*:H$C\WCTJ\><ZYyZkN\cck4$SPpp#VQa
al9=\p EABYEWPA/IyFZT^tXLL%cVi?JCi*chyuF/RPe&6?\JyQhP\Rnt%PkN#<eLXakA8KMA!&LQZwKlDN5#yE
lBpKH4 RBqaVqjTHcmjiI^+/+X?mqBQ1jH4/F/S9$#ZhA<$B?Te!hw8Ed#RP4/=m\I$wdK/DkNjE4bXDJlp#jhb
NH*&5A <=E$lNA8w9b:4DRLlwEC=>PkR6IDpZ%P5+?WMybjBwt6/:1/SSyWZ>DDcXlmF4$PuW*WSyGIZ/*h$CqI
X%6BBd tR\^!KF^:B\b&wt=qkeB&4Q%F:p^*&9NT@SFA@hkkI+pTY\w?ChHMpuS=tHKhTtX@=FN/bZp+$wZ<+X!
K&CbHY RP^1pB4yh$4^AT@j/%K@kpyCEmA%/4J!nV^JM4Lpu<lt+DVFZCBV:GIF#\=4@nj*XG9TFRG^XS4jy@/b
@C+t?% yH#^My?PhXC<>>XX<1cBwTQ6\&itn9:4VApBT%*dNK%G5Ju4cm#^W#4$piXSIed:Tc+w5uTCZbkG958c
abLYnb y+!8F@w5RQIEJbcSHnJddWAq+ZV9DP&BZHw/QIQIaLjhBm5>KAnwD%\bFZHwbXGeLa:9N?jqHTGhRwd?
^SYqli ip5i%T$N#aqcjw>XdIck=wnAaC&+=>a=PIIC*$unnCY1qb<kH?$J:/eKY*?8#K6K4t+=*eAAE>b1uNmZ
CyL1=H 8itGN=F4\L^R9$tqWABaih9uIe#tk?yilckiqclQ/lR@@Sj<Ke!5+M?@wy4^?49NWaEh9$^E54GQLV@@
dX8G=* qN=b9j%h$9*y/<wNJ5y@bpuh>*un!6!PZNV\TwKY?%Gy$Iw?Zj>nyMFR>4tT#\Hm#@NW149\K%JZY@N%
F^P%*8 tG\XZlRpNcVd&8uICF1V5>V$#VpbCuKjE#4JuSEBRhE6#<nYR4?@^/FAw:l5hIJD1%9#D\++I$m9M5Rp
G&FDPl MGk<Sju=m4Yn=CQX6WNE%=Rh%NH#AFW=PQMB:CKSZ$*<1bRpyZtl4e8TS<8EZYwBuc%e^&T/Xq@G56Tq
8%\PHu ?ke@uZk#tAeeTGcHKJB?ANu<MQR$<BbSnuQHbAC%jiE9PW!5%LG<eH^cuI<B5P?ld@hI=?jewJWJ&Jyu
pC&J5P qbuQ<BS/1<qe%JYI<IM8B4KHZ<A#$+9cE\WA@?+bEFXpShV+$n&qKeT+Vjc5QKbRXZui&1t#PanCljID
F>YE8R $Z\B:PT^P<84>9PLS&CEID^et/e1G:QGdnMAI@hHq!MX6W@NJV=%$>6u\MM/SkEiylBB!nJ8!X<H6eRy
yd*d:q ei*Q9+yCc?WecSm$V*5KVT^X&VBwF&bm/JN1>Zck4:#ZF9y1bJc1ZP?V?9PVLA5VYX<c>SXdt?iRt*Y$
9qD%G@ K*E^nFGJk*YVC\^XL^#mQEjeBLmj!A5N#V8E&AEpjIuAEnIquK1Xc&Q?!!EYCKKXFN+BY:4uy>Y/E1u4
nW@cJi 9CQ&CYeBteuAChYw6>$>i>aL4Kw=bEAI<tT%BhSXaRQ&MZY^w4P?W6ZT@++nq4GapD9I#XeR9EHHX>KY
1V*N@G $eBau16LGn*iwIwn+>E9*W8wE+wk^dkd$pAunkbc/h6dl\&JAV8G&1mu:R6pDX\Wk<%w6Sm<NBE=aB5+
4iSCeD c$iuRtQtI?A\Dl^=ib@>ccyHdNFBW?9e#PpPRTK^^t4a5>W=G%Hi$nV4THW1Im>qE#BZ&?1Zblk@4emY
bq+IDH CJc4qBu/GYCG%1qblGK+5<FybcA@9@S+Yw=9tlj8GT\k^CZkMCdqBLquS!ItdRG:hSKl\l8<tuBTF=CZ
8+^u4c =1pGLnD+l?$Dp\AD!d&\E?EX*L/&VV5b\>bFN^WJ!D>M>ZQ*e1w4a?X^&iYKNk^qtS<6hb#Ce$FRWeV*
Q^p/TN qM:c$IhK#SRY#ClHCbZlkCqDP=*MC*WqjC$tw&+%ZZWMWRd5FREFwLit!lu\k9JyNy5J:t8LIw4mGF4W
\K@I!+ IwJi51*A$!n!Z8VBp1b/Miu>9*BwS9awk5J6:*?1a@^D4HT6c5\Kel^qZcq&iA/ybcIiPQ5qTcj<p:T?
u6!X>W neS$bmcQt49Rcp\%$t%ThB8N!m6EnM!VeA**nA+9Hue4j\*hPl//A>%kZRkwmmKbklcJ=<lZ/R>b@?lI
&Ji6>X Y*61b9J*LXQ8Y51njyPl$JhXITpnpMDn#A^SpTa6:cK%HE8%#Dq*$kc<5!K6Q^NNTcqG\b6$CnIW6LEu
kFH+Bh M&$yNjXeD*##IQDCmqjtWStD?I9iTNqT$^Q<jTW#^&I/uI?q=pEnD!EYHFtqQFYqHAc$K+DEH@R4jKyn
VqNlAK by#A%NjTP@#VSP=M\HGPYd=YN#HybtpWW$pEE^c+>y#^5@JTAh#e5*Be5mJ+uyjL*!RlQBTmHc>:n:^l
TLtB*/ EE4FlEVbYAJd^XaRcY8!kDK5+Kb:/w*=hDR@lG@Kaw^4cL$m%=+Le=MGw1EdS%pd4>85!:&GuHiDptX@
kQ=qlQ D?S/D!dZaLHqjG>%idyHP9S18pn>k<tm=R^GP^FE9XNX$X&%DHC!qEX/=<:>/cQaVWGYdqTt:Ba4\Wl$
>@IdyR DyMJJ&=lnY=kP/1!aLu\I:JkC%!p8?^*mNA1%#%bu!84*#EiQD8VMP#/:LC61IuLR8AiGRJk$?h1\9un
!N4PJb k?Tyy6IQ&QXi/6/qi/W4<CFFwQEi9M:*\:\lcR!<Y&WQ*P^!cP1S8iQdnIblTAj<HjRK59pM1p*H>Mdk
kyEh<H Y8tDBlK#lS<ZF@5QGP>5:Z5t4i%k&$lZm&m6qkFqFwcT581dPjjRAhaDWXF8l6ed!w%qZ%$RhFj@n4qK
WRLP=D ZWINY!Ie#<EjYjZq8X1SBjS!mA>yeG<ub=?aK!1A!V4Y^!?1$DcR/$1Tn<4=JCSD^kMGK!+YT@wMj&X6
*Bj?ZB n8%9k*!a\y/GbyBnpl:XIu4mnyk#M9y#%jJ\>JjlIchp$qP4A@%^IK=PuX$tlB:N%F>=1pES/1ZTcaE>
+i&8Wu /Bm?K*DWpJc@:KkQHuX^:*@pXM>\CCI>\CXCjhpnwlEKEGihE9+9dX!a^p$FDKytl#jIVRclKBQ\VREG
hS96Bp F/u\jyRW*d*n4XQ1QM5IGK5lL*mXm%^*%RuqK#d81Y8ZBIaGNjwnPWG@$BiRijuhGy4jcui<8VYAaG:d
nP%Ku: P8!we>P^$yH*@>P9@?$kPPhTjapJG%AudGAm8$%D#wTd>6Cw#ep+k>mcdpcZqLH9J5S6ElJjyEZ1Jl1w
94P9Se &hDS1u9MQq+YdnJ9jt&q1yFTM:mM@J1nMDi/#1tTQbZJqQbe^CNH4e\W6dN\lm9Tu+A>V&:uHJk&=uYe
!*GDlu tHn%&uHq/6y!/>X65*jB<S^u!1d/4ut<e^=/LbP:yC/PFNiwW5y4qTa<YB$8cbLp+Awk!8MXKb+pnw=V
bpiGRT SNqwPX$+l1!JI&%+#k/SwM!A/%VJ%&wEpqZydBuJyFb>4nF!m?tK1$lF#^njJ:@9?Fk<S^<L==\>%ukP
dAKKQ? R8l^nn#JY#>jA!mwi!Xbp#KcEVmBm*$hI@%CA>Wq*dMh*Aj>>>yn=<A=l8nE8XHiJBEDmRhj!5pR\>p4
4NAikC tKTp684!MXA>J86*5c=pGY=pIl%\#d=<KaLy>KG<A5Vi+$Q^jQhR%S1E<SRl!#/?!AC<6%^^QA8AA*<c
5#wG=I 16!<XY88p9$XnuYcbA5FQQQhHnk58c^N/!I/P</Y*1a+L^j5/$QMaw/EWIpD4$T$/ekbt^aiWkI&/9X^
d%>bhN eSFd4!<te8yHpcl$nc\9LS?F#^SJTR6+Jp<JIm!aJmb!*upy9PNGI>Ll:GBFaSbiJ@+eiFHb>*LbM#<4
kc*5+G HB&5M6XWee@K$e!nRN&\IcIE6<N<PX?q=SpJ+SKW$a8n&Tya4PAqW8ZLR%u@q:Pb@=#C:Xw5=*Q8Yl!m
?e+AqY MKM*CapH?^Z=mSB%5qw6=#Q\=tDQ/huZ&Z!qlWh8PAbBQ%bl*%V=@CA=K+#ek9BdGIpG1#*YRSdtB*wB
A\mA9T RIqmMW$<DhJY9/y&!ek6WkMcbS&W^Sbtc!p<QhITCAt::T=**A:6IPb@KeA*iX9a&/PFmZupSpWZK$el
tC@hLK iQ6Cje8i?uH&WP8*#B8dC<cM%TMGCX41l1AbZmCPh6AX:65yFj8:Imwk64!DLuSK%c^naZlM+W$ZqELR
IeiFbu w@?+%ND696b*@QYGBy&Vk#n!<lCWDTQ#IQPXdepG9iyJF9dIBy?\eEqLD*@BHuQk:R96HjjAD4B*GMFh
VY=GBS H:/iSIBd/pGbp85h6pG+YP^TD?:6&T*5cYn*1Aj9ZHn+c/CFQtMPjJ!C>&RPW<4^dLqHQXmD/jn?QddB
yP1DeY J%jaW<k@jtG4IZ@+&k=%aN@eyaXeiRVQCu*#9N95!S=:&BLiepHcESBZY?:B9u4h4ZTDV/ck+T5:LYH&
QK/DpI t/W:$%te6hFZ:qEHj6kFRI4Dk/Z$RqpiGL4T!N4@X^Fq8We*?HmFhF8+lcy?J>CIBSieXL9DIl/GjBH=
/aEn8I GZZkVpHpAJIKt698!ee>i+YTwV6St?W^/j8<6FQ1Eq8Y6>ANdk9*RZjyT8TX&D%8nDG!b+&$w$8/jiHl
E@BSqp m++/<C1D+#/M\1e1>!Dm+/wwn$H4A?waGSB\a+S4+!:hwI6JPm6+@jAbb\Y*b#@a/MpXH4t^S^*+^!1a
X?qpDe &?!J@et5c=H$dJHG=B=eSEW/Y&Y%+\SW85F6adq<>p=yd^eKL9DwKkPQu4B\paZ@?qjJHYkhh?BnC?dJ
a\P*91 Feb#?Hj6$jGV5bFiKENM%kyLYpCQ6IBuZ/6d9*+mD:C*$NmjFbw>D5Lh\p>MTPXH9#EN>:t/JSF<wn%u
lVNcG* lcQ6ai:9bylbw>pe$#t!dFbkHAVF>>:GKk$l\=M8Keuk:d/Aqi&dJw:1aYI&i>6#=9F&>Pc$Q1Kt%i8Y
A#qkR& M#C4IZ5ej=+\jPj5?+d+G9>A/AD9qd<&PiME%C?VM$/@P@#AL@^#yKa6tiylFJc=9uY*$*>KHHk5n\y&
&LSeL^ iqAP+u:>/I>*c5>yG4#VubmlDZ*ZwFR++ZeiIlemB=?nXn?^VKq+#N<*VIy%$<WY$Tn4auh\5W?9tADL
lR1Z9+ 1NXWqSIhNSI:Q&8q=D8:P*qu/Bjjc:/k*kH>J/wXeED@Nq1BDMA@baK@M+YAP!=VdeL:@the<164?np&
P9$VPX hHbW#cTyn%%<$5&6EkD8Fq5h\?TM>cFquVF$j$>ykASn+/@9NV>l#Ye1A%Cl!ZRX6m8=qTE%RDpGe+>?
4:J8Nm bq6FRqmWZpFFktD+9I@Pi+KPNPpDTSA?jXh9wN\w&/\j?%wJ/kCmCQ+qi+iXY#i6@#Cyn\X<9lbM9IK\
-ATq1y 000b0f173ef001202b3 Page 296 of binaries1.zip
nC5%h5 kbAaSL/nkc<\1#1TmSwYGhwNuLaA46T1LYBIibmw65B<LptcqStm4P$cIB<lCXRMbHMSGC^Yijm@\dIB
FaA+XR <kpwB8BHBl*q*tHGya!:Py1Ynapuk6tuc9AmI\bND1?!VB6mC1yl^wknye&F>N<m*#EWIp*q4eH+/y#p
lWAatM Be6/c\>?V6b=Halpib+&kCNVSCWVDTCBT6dFmICeRR9k^hK\A^I6DW*bi>ibEaNHCeV4B*SCi<4bnZ/k
B$@ym1 IFh&B8y*VMyN<SiaFRBWb=+IQKTASqAT9T1Z!8Cl5YwcR?6aHnYn4/Muk>8J&?PqkjJ%$BlDb@t9XeW*
18^WDX jCK>e8%XLm1KEL=ERY1n%L@aW>cq&\P?E/PSWu1PWeyHppbG^dyTVb86w8BIe>E>@PXam:i=AeDT:+NC
*Re!\V +hC^>C@<NCHLCAy?tQwICuKi?KE$PKJEiFnwL<dD6kYnIR#!>&6N:e=JkpBtWR>yAN1!CA+PpXL8<CAw
qYw$>8 HBep>kS6*AbnaTGF^aTHVchlCTKycilSlIC:n^LZ1hHel&JKSMuh%AB!+D=Lj#i!>JQpRWT%dq9a*dN@
c$QlbI &FmkV^*<GV\tR6a>ISbGJaIe1naM:\N*jpkES%yIF8CqN^ca+w*=1A6N>=TD^q\:TX:RG+Fp=hXRWij\
qSlZ$A n6e#qL%&dA^*b8u@WAy\tE44wXkElYMjH<DcCT$H!CBFRCAu=BMYL8lt/TqbIeANctm^CJd#^N5$%&n^
4N^JSZ nypm:SGp/pN+D>pGa6L$y:jR>DQ^?PMZ#EkP1aXK>/kQa^cA8<!AXb$iGW^@=ynCm:T:D<c1detF%N!&
SXG*MR wK!IhcH5pIIqp1mPyet>kVm8nbVK+=Ed#B\W4a&!V8#!>H8:QQ&:yQ%46/i=+^+>B:NB8*TpKG8ay!*+
<ZTa5? E*PE9G%#$6*uNZ5<lZ9y/9aaJZiwIke#pqYTPyVY6uA=a^dZS&/I>Hw+A@5dw&H8!NV@wSSwAX=NMZ:K
%I?SYF tq&npLWQn1w:Tiu8&#:+*q9ey4DDGqt4c:t!mLcX$9:ZbE6yPDuA18%+IP>I%j?lFI!!TTd\kRDQTTq4
N>A!5: 61e?C&j6ewhY8p%ln$B!bLeqyTnYSukqSJn\MJbcHW6MEHDG%X@5e@Z9MEcmED=lAYbqt!?TYQ=Il$AE
Hq^S+T XJVBKRXIhIhL$4*Tqqu!#kXDhlJHJwt^=HhiRZbSBlBmRkV%!5M9\XGP##a*w%jGa:u/Yin6%ThZiD$L
me^&eh /BYF/m>J>i/HeApka/qW<bbYeq5aZ&J*#\::=C/lI?tPX+=uhBSkiIGHu+uw\$kEHE$ReB88@15=jMVJ
n^:y^/ I!tF/LcF/JdCbb/DbXa#hjZttaQu#$ISbjS1pFTSBtK4E?tH8<+K\@/iq:C\u>ePQc$wK%KP1ye@8y&<
Nhn?qG \u>>!q/CkH&8@m6d49:Np@w?*iH&N+nntaLAKk+QX%tS49!md:=$q&Y!iZKFZbyKT%ww**uF\1/*<u&N
8dj*PK *Z::Z>^JDGD4P@Q$$+Hu4NDeW9B96&ep9Qk5?dI8tQ6n9FdMk&J:8+K@Z%D@QMe*?W#!VVJyAh!MCF!\
ljc:#a ELWhp+dW9*DPyRiw/=HE*&!1V/hMTXLiMc@Yq51jBTYY9Q$iFt1#14dHXZ8:h1=kH*M=lM49:NuTVt+G
T+IqID +nmmMGRb\QQ?*^PCdpE+<FEJ/H4WnPGDT9RQ%9W#%u?#=bM$8\WehtXd1EmE=\1duS&>ij:Pqi><MYYq
<nd*/L *NAD6+Ki+F5ua!/BdWaA9BPS&dFDcHjcF9TkjSKHH55>V8q*++D\^u\&cE#I\dE=+?DadNH6tL:84L!l
@a/>E@ >$Q4ek%$yN6k?5Fd56p>dd$q@=@aD<n6j%pPj:8/Nj?FDSu*G*wdH/8u<dH/NMlDudlujpS*1E?!*LV1
l56:Cd $JVXtKFQj:?=#ZMHPqCT#Q#>1?1$lS=&qkReMXX\&Liw&AQ/KF8N*%MqCuH>SXyT*:NqQD*i?m**>Q+&
eZhRpm dL+VBjnda>Tnajea\&N/<<9$Qm:ZyjKiZNWMpG5t?*//LBb^9M$wV8w+W#I^PBL8qXBqZFh*<q!^/X:i
AC1^1C BcVK&%+e4@jT5+8Vd>dKH9yhMw>umj?Nw>%jM+yua=/&h\1amL*^FMRdZ5AJD*$JjSNhlqKnbMaL>X!t
b*=TR? Et>/+J\mbWFh4eIMlQ?\Ic&:aBp+:k?Enm^XqNK?Vj&FI<R<Nc?46nS/9AWp8aYn6MVNq=NqweRJpJdD
j$I<w< ^JFCK*h4e*cPe/ntPR8%D%W:Wa8Djjk4ZM19LiM*5yXy>qB/?wDQDCkYd1==1%GB#tqI>mk6PlK%BKH!
%TIiKH ct1+5QN1%W\Y/4J#qc/!=Fj4/^qjV?MQ1hbJ??SnqWcB$CBV*#heCKuNS4+WPy!i?bV$@y#u%H!nL8W=
aJ@Mnk d*/KwaN<yh/meCw5C+?&$6=P*R!698?&H&c&XphnK1w\Luy#CAiF:jy5dhhe5w+d<%D:I8nJ&Jj/?pX$
GLK!D$ 4RejGSQNk#PK+ZdPX%<>dMlnPV!4<5cWFEQ6$X8@b4ywSHG6a#J+88TKWq<Q*\DBbieHGmbn/4kRmEWY
QS5*%E ccqqEcZ>MV<1Ry+B?dqPpSR#eKTaI$Mt8haS#TwmiAyPEcj:$LTKG1#1QNVl\8!qnDJ=thY$a8uCn%Bl
a!E5AI 1p1S+^AWA1X=yCqE/XyB>atMwH8WVMdVSa5JF8pRIaX*jN+b\cZeBaZq6qCqKK\Y8wiF?aKy+mw=LQFZ
j5=p>% b+W\ZCL@MX=:+*>:+khJC:qRZm>NF<k+Dn\=q*QITKpEtYiFWAwB*Z9&C*8etLeW\6pW/cN*C>n#!I$>
b?Ei1i jp5W#G:B*qKwd%@aukNHj5FwihNEkkGk?yCPGIEkE/J=b^\u=k=B=u%c&68FRwF5>!My=8nYhMcRiY9B
#hJGym dA5Qj\Xp$!*F=S:jJScL*aL5cZj*6Le=^>LJGe:i+MtAA$HjZAYywuG$tFhBwFE@aiEVYZABb8*YAn*e
PYRCw> WwkiY*n+>j5$q^>8Ric1^Y\/ZjwmVdb:QJqRS!LYX$uYqTj#C<mV8djHdk6k$N!q^u!TBiq&i$!Z6!%$
q\IhiG &$L%iIhqbFd!&*ZGmNe5X8^wqCy#n^=#y*BjjMhh5h*q^#T:lZ19aHaQi>lSZq=X!55Q9VDXRkVp=WH4
miZAw> jbi<Bip&G/MbS4a$tbeEB$WAbbl$4&yB>?\XQq=bq8!6F8khR*Y*d:X&q6\><55uW!kj::Ae*#MTbNaX
^qaATd E^:ReA:*qX*C#J*CjeZ&8F6*FhYHby#i+<EWEinDKqSRG/jla8pn4RCV*QqyG5Chjw<:e/j\:L%TbQaL
#Z$ZVD H+J^YwdTLmjtl%&AI$%T%F:1I$$iLSVpLtjM>ltQ=p:l94&T5Z6<t<&h4NVNui*Z9:Dq^:\!NI=dS8be
GaTbaa DSq5hude?q$Q58MbF*DG1ZMY@\^%C!%<JNPyGILMGF>ClqyJde+K?*6G+5%d:hZt5ad4u:^16p!bAJFu
?e%\t@ *=e:DJ4tVkjyh#y*t*9e:!=yG1w%Y/u*4KAT=4>VXy9ud4<4teqi\VF\uy1VYlMc/La**>?j5Yb8>K6>
Nmd!Cd w1>t@&69:ta<4cuHSP&%F=G:16/tJ#enS:=?*bI/:9!/eVb^6bGVajMd?=FC<*V*!+d^ti/Hp#M/VS4L
RTi!Ge J!VK:B$BDIVln5n&:J>TklLpVuka58/hb>c>*q\G%<**t88>C<q:\Q#ejtHyPb!npQeu<ijN=m>hW16q
6N6LFc 8+N%d<G+8#CaBKu99k*cld>@^^<&SyQTn>D*8Wk95hdkRe%nwCE!Y/ctQeB/c8:cWW@5H6!VEAnpu=h9
1enkJ5 e>bqh>aJ@RePHeJYkqla&\F>j?:=VTZVkZQchknZKF4a\/$ji!jeYn5?hRWaCNJ^IQcE&wPPZBdZHkNw
8qp9VM 6<G?DK1qe#Sq>91$QM@<CjPhk%!?CMaA%A:^99ZLRIn6V\:TtySVItW8q?A&AK=XLQ^ERJXaGC!QnF=u
dEmq:a JGRaE4Yi$XJwPMiy?VINC*BA%nwkt#<?pHZ#p^/Y4ibnnkq=J8bGW<=$?@du$#5kYhB/YwFNQa<e1wYc
BptYSQ cw6RQ+:J9S^CXSLGMCHchIt^HSItSb8D1@&YJtuM9*Cje@/u+q@n^KDwZaeLhc?uH%Lm?<#bTlL\qNt$
^L!ncG /aZRMBAPtn%NPIG/:<HNaA9T?pB$?1@Z!cBW%lFyc#dN1?mJ*&naN:n&&KyM5%RYSCVMjXFYVHX1uPeS
i1VK*l 1FA=S&My/P%C#%hYF%XtTQpaVAW1HyW^Xa?kQq&*RL<k<bJ4+&jtQGiIPkeF=yVlRqpW54uT$BW*HwcN
e>6MIp Qe?a=I8YtpTS\S/=wRTtmdTNmG5qen=L^^4%9dKHLE%Pab5wD\IX^wm<nEyN4lSu\aLSVLjEZeMLkltw
MS+Pi% nWb@+LCwKNcX=n5^<K8<V=qTybh+#IGCknVLYkcG$V$pN/wW%MaM5Ijq9<m!IuKyJ:lH%9$ai>:!jISt
&Hj<pR #Q$5uW$CWJ\\c<J!+dIt?C8@A!#hNFh^XAyiKA9NjwACh:n9M*!@99$hFADh<LZpAhLLH@l!iR$%hkTy
=YFRRV a!HRAqIdyLQFa\5kTB%1W1lCpFu=IyGBdpQ&#Bl\QyM>D%>$GSH8cwNqbq!8lGa*X<LXh8SEjjIFn\Yp
Cw!*Re /&!@AXEW!Q%XkPN><FcVaD*55/YmaHaL>ycCa6k#66TCSIhd9qdNR?u&mHm?Va1AhBTQVbhkNF*CE^Z1
K4AZF> &^TRWtP?RmJP8YHb?jJCdRI?wXl=W+ql:$QMDF$PHI91&c:dFMlNV&hb+J!S86Z6WW4Xl&?etW1l#u65
&*<dGN #wRQ^@Bc!Tw11\*?GC@6!1FhJB/<G*bCqV?=HubKb6nlX>*dW=NIce8mTt9j^5:$ln5:>I&&&SFe*kV#
myIV?S &L\JH$1BHyqYR^Qy%MDpItZZiV8E1y@MVBdd8Pbt9:BD9N45Mcw/S6ibt5>*hn^!w^!VJJC<inh>\6/i
T\@9<e J%ew+>$CLEX^8knZtHuBuinDqAlHFMi8&kk+9a@J:MdT+^ZP/FZBA4XL<LyD9Gy4#A%Mq*CZJuc+VTKF
I!pwJ# 1>##^!8<ukZGpcN^!FwSB=NF#ARTtkB\T:d1C86py?D6Fj^d!Fa%hh/Y:uX9#/>>YdPdPYE9y<Liumhb
I*:Yu% &M9DACyG8J/?49GR<mFZLcjnZjZJ8<yC<DmFaDbhSQWi:?wP<T9$&#6:*91q>W+ClXw#yd9WCu6:#J$K
IlY=*u !D%&X6nhe<JA*NjXZl6q!B/l/?+PCi8VLP!S5P:S\P:6ie9lZtKFMiHC1&>J8HDuRu&uQeRY<m1?HVNI
jnHGid 1Bij<4I14?5VFwI>bqbnHT95uMh\V?d&@F5thueyGH4uDh&:9P#Yahp@#ueqGh4?jAcJ9jH:/h:QL#8D
<>bk/e $%9YXqJQuHHDk8Nwh<@*V+m6#6MHau^mipuD%ulMEKbtTwjJ#6N9YtP>e:QNR::L&uy/l/<9Hd?i5dqC
%qTNmE <N6nmN*ha::1%CHV*t**#dMdt?=upHBjVq#cSu/=TX=ZMqTMjLAuY/4Z*9kV?+D=dZu4a!c&l:Z/:p8c
N4dKaQ $@MB<*9PD@+t:etVaVL=uGh@#4Mu?Q#E=A&V?jul?tVwyjSu*L>^D#:QuJ!dZN9?<u%9iMQi*5uiYXjp
HicHkN &C9+e9GX4=@y#454L<Mh*iieP@@<bMJ9F>:\Bt+9+pj=hkpq?Zebj&Z4@SI@p!8@>E8@?:8!9j4nQ@:Y
KEwbj$ 6=dq=NyFjmaHX@mbZNjQbD4ub*J+F#?Vw/j#M=p>q=@J@MZ<VQ\9=GeT9Jcj!iLX@E!Yu<VQ=K=l?M:9
4NY$WV qQ9jQR!jJ=@JW>:=#5up8:>:e5>DD&ZbME!iYlV9jPid*nS=&kjqI@8i@6M@@bM@?a@?$iRb>>/46Zd@
5QAN&\ @h\?/<EH8Z*&R\>^?=#JlEe<>>=:8Z*i@jh#?@\HH?V&BR<>^P$Ll+HdF$$t9NJH*H596!??@*=8Q@LB
-A%tPT 000b97ab037001202b3 Page 297 of binaries1.zip
9hc%#N B:q>!WMQej6S\<D6S$<t9PQH*H596!?>@*=8Q@dBB:q>&WMQej6^\<C6*INQ>9J::?Z&+??@u>6QiQBB
+Gnj>B dq@^$EQej8I\eQ6J>><@wDW@?eEH8j%VD#*E:cjk=iTJZ+tuqu?jm1iS:cjlL4L>hJ\6&%jlcNt?Gu>q
MDSCp! 8:1Zu<quwB=p?/hSD:L>VNTDdD<L>TDdQ+N/pP%uw^=p?^4Wk&\@B@Wk&<>FQen&6ckH&j=b%IN5:$M>
aVl>a& !Qd#WA?!@Z#Wk&!@AQWk&@<H/pG&j\:%IN59SD*I>w6RD:L>a6TDdL<E>TDdL$W>!QdL:4&ZLjVuWS?!
A:yn&C @ZLWl&#@A8yD6u>^GLn>C6TL%MXjR4*I>m6SL@L91%A959*L1BjbjnZ1Sdbjk*1SLY6D61@D&<n&4?Ay
p&lAC5 bj8%8L65@!18L689\%t!@Z1WbB9i#<@pG%A959%41Bjb@uZWl&#@B8yD66?I?yD6N/E?bQ5*WS?!@YdW
Q8aa>9 l&!@BjWl&&>Fjen&&%AQ5u$>/pG&*+=/pP%*VCd5ih?J?yD6*$I>!Qc:WA?!9aH*puh<A>=V9n?A==B*
=K1KND @%@\Q4L>&/kH?jj@^H:b@1?wL>u?Hd!@dQ<8/p8&@!?<6&#@H1+u&:?Q>=d6@+d*q8*@G@Wp&@<hV!@d
5:AK#> j+Cup?$@SD*J>l@l4&#@MZ/XdjRkQ=Q9^u9L>u9\*4L>Zn!6dQ<J*q8&@\j/kV#D>?H>yj\k*q?&@!ji
K:eVNX Z:d@FG<q&?@H?<9&B*C<dH<R>TDdj+b/pP$QwV@I>wj^j9K8Q+L?IPZ@C?<u=S>FQen&^%AQ<8@H$R@p
4=&h6T 6@<d>TDqu<D:!jauWY?!@TuWl&#@Ph=Q69<C>THdu$b>!Qbjw6Zq@H?F?yD!9<bd!QdjwFZp>=@B*cZ<
K6yM1+ d*EZ&j+:@C4dj+>cpP%@\F9I>tj^%LL>n*k1&j+e:mddu<jXbQ5LD:JGJ9FD@E^?EjWm&@?EiyH6j$c>
hX!YaQ !QcZME:p99<F>TLqZ$c>!QbZWC?!@hX:hTb/I?yD&9lN1A@b9lu%IL?@BjWk=j?KiyD6Y%EQ5u$d/pG&
eRB<y6 HHY!@VZWk&^@HjWk&:inH8V<h/AiyQ\\/pG&n/Ai=QjjRD%I?VhSD:L>LhTDdN?JiyD6d/MibQ9j<QT!
\iCaL% @S$<yY#@P==K69<DX=H6:/IibQ6:iH9b@n:iT4d9\qQJ>6&+1>#9D*AXKd<Hi&Z:Zn!H9QQ:5F?&:<i9
N:Fl8k 59$AjyZ>H$SJ6u?I9:L>w^@:MXqEunNJ9wKjTj16@E!!9<QQJQ<u@E#Yd?NuW9\MQ=Q!6@tbXL@H#/S?
Jycdta L#<Vp@A#EhpMu$uV<VN=hBlPVtThdZ>IQn@/w=Q8Dj^Mnkhh!&?!hTcVE#:XbHKKH?ZdBmZ=%?P9dAj>
$@15d9 :MpM*Aap8K^EKAQn=d>t81&QjuVM/t%M4hSbpJtk4K\%:hiE6wC*W&=::cMcLadA81W/VeXMZ%8Y1pCt
I>T8?: =yqepdRwZLWXYKQ\=<VbGP4/jYCt1a9Cj8&^?Z#bG&XXA:@^wtnLynEkum*qB=8qqV^5Np>K/pX4V*X>
<5?uJe ypDmVnD4FWyQkc!@FtqBQj4\>EmZDXTC:Mdk<^c5IHj!eWY\dk%ipKaBenlFjj/1GPSN\ZJSNG$88LIb
FcXeI! !QZp6<amFZ^K%^1>l>+QBt!Bt!DSqR6E<1e#J%X4LqiNmTJ49?HajDH9XPJPjyem*&i?CwJX#kk1lI@W
qmS5MG *cw45l!p!iC<p!6uTV\w?ZlG/LuYBM?iQ=&q5aY/G&VLcA6+eubpDjYR=9CdiV8V+&JNHBWF6BANIyEE
6ehCEM bNy8Fqb\#IEuCH!kw6CLC>CZiPc5B89K%cFeM9Bn\eTSJyW:NyjL%E<TQ>?wiA!%cN6Ke*:n5YAHc@R!
8P&X/@ y@aF+Cbh?qC%C+1Vt\pRnJBNyEYinnRMY+LEnZtY8&W%*lIccA>=@%^h8nnNW<dcuRQN!&X=1%n1+85j
D?h?%q XcPXy>SR#d4QuywLKMuD!M9!8lyM=6XbWYjiEIdDeG^t4ncN&$ku6$?BB49P<=wElj4+NWqJVpBwK<<a
eQ4myA =dW$eZk5:#1aaBYn$5<%bS<>6bC>idBcblXPc5NE*1MIjDAhh&cKF&4SS%1<Z8?<Ve$SI8^kkJT?%KGK
#k5ND$ V?^MC8ZSESI4cT8dL*+W4+4*1#diQRmychwY6QF\1pPh&^15ZkI^Dt@y>Ela=j4PMVI$T<NmcERS@LuM
y>@$Tk b#!1%LMdC&>QGIy1T:bZ1:aAElBi6i4:l1BDGC5KiDYX<9y4In:#qA<\cJVE8B9:Y@mTETi>*BpNHZk/
M?R?+* QW6S=$J6V:j=MXKbej/I<<mHhNJu8E#^=?qIjJGiNd$t&dmy/Wa&AtdbY#S@8mbC*QD$NR%l9du@GdY&
d*N*Ka BWMk^=A<R%P*Xj5M=#ZN5\:pdS9ty4Pd+Wmyk>V4&#BQ*kXe4Kil<*!F*QcZ1D5$**lJS66m$Y:5Rd:I
6a!PB+ $Wd4Lkmm*4+ARR<M^lmKIEK88HDlT%<C:>P!E\Ddk4CyFjTJ#MT>9XSqC^qHy@RRSwaMA!9PTVW#^tW9
C>DJ@1 6^Z!S%u#ujeNSTc6Wk!tBJPV*LM6l4w4GlNd&RY?<mwLC&8cIneDTJuK6B*pm#T&#E%R5HW+9:F=P*l=
S%B4*A %dnen1#cK>TLyTZ\:%\iQ+N^RB+tCp59>aa**Ghp*4S=BLdhCMb$QFp5F#YkdIuISy:l1bwm#htbm<lD
h8*wy/ et#P$CpX%uYX!5Nu$XDKqCa6C^5+l*>9uqWQFiiSMq#/5DVI&Fkt%aCW#6bESZQn4=kI:uF+AP*+HD>e
\kD:HX Wp!/mlwb@t%eIJGSl*AD#M%?GGckB6Mudp!&YtXW+ci?#H<!QA<^QK5lQy^K$cc#htlmeG6LBhSqM:T#
??NIHH XLyCW&e!FN@\=b#&bVcZG!QVGjyaH8I<ZKH#yH*VNp^BIR6h6>S!qk?w:Sw1XKpu1bk+V4HA^EYi^YAJ
8FVN*4 n&NuAJa8@e!tRHIw4aBFllANQ+AiXFySZ4#/>99pdb5tdb6^tbB%^t6mn:tBeENVSFHaXRn!aFqY81cS
//%Wty LTeV1TeV\S\SIbp:Wl\&5qb!jhbXhwlDyFea?kci&^%wDC8Z=ii:@wyMSAptRk8TRVk9b/5\qKi#Wbn^
Z/iTjW q6L#qmGykdwplTpRYtK5:y\8K^pFcT4Dww:#RHbLnbW#4j8%4L&NM4bBwaKPZ!tXL!dV8T<:9?M1J$kE
YAwX=: JFcdiCJQ>RIqRIS6L1bJ8=J!^jLI+4w&qt!B5ln^dE\IBi!tMId4@GtHHN&kb8=McJ%P:CZNZcqbd!D\
<%$Ib# jMEqVmAmTF&5hc1@TQ=$qNXt:\R1X6TB^y%#=1p$Sq+tGp\9YNJ#=jX:h56<N?1X$a>bPQ>Ap=QY>WQt
5N5J8G /Q*!@d*!:=h%Pd/%@E&ZtC:XTY?cRjXEjWJe>D1tS=hmE:QpESpTnX5C6#<#%!Ve<c4NGGiB*E*ZNapu
E/<LL: R>VycI@^?b*Z5cV!*cAn:bZW>bI1T@9lQPjQm>TIk5DSkMe^GNujXK?KkIMcS$GPqP%WW@k/Pk!==N%$
JcWqpi J5Jl#KR=PN%8dh+\l>h<Ih$MNmK+\yS=u#+hGR$dL%ppmJlMteKn#BF4BLjLQq&EPacIu$DNuKWi+mC6
G:GRuA 6$qjllG#^kti>NIYcYyK#dhRF+!TT+6%t6WqR@WR1GV6A#hpeKbIVmBm#>!ZiXcGj6EmD5CVkbItI4/G
AaKabK ZyFE<BjN=TFEbEm!1p&>Jp@KIW#p?CTPp%!/Ph/A9V8PSF=1&5V#FlqMqBG<W8Ik1P6FENjy5yX#=j#R
w^/=*K tDB9H4nlIep!+8wRj+ly45lqNM8et5ue=wu5XCDMW?/+Sp4/TEcY@C9!PMdM$E4QL/JlpIqWByjIhk&a
8&aj/B lIa%:JL4IyJqAmR4#HBi!=8k1t1\D5pB?Lu^<9kN4&wnL%^qdhHEdiXFJB?W1dwaKKVWYHc!ewC5W/dL
y^KBbH REa>VFKLDEa?thcpIb6m+#?VD/ALmD\AbF6dle5YLP++6dh*q*pY6ZqiXnJL6kY!VMi\:u5Q*CnAnN9K
wu/6KJ P:SBtASe#&KdhYWJYS58NIZe!YQedkH\kP?iaA*=&Yd#\G9c411/6lqueI?H^?yMkuXVnl>mMttHel?9
<th>#= !q9Ej5WFnIi!D$?RyWEmwKEwKqT5XL#BZG9#HFRFentp/p+FjWTk==c1\FbY!K^FKHey^%9<QE:llT\k
XmPNE% c^AM^+Z^W1cdS%yRcYpS:hhFcX69cQ&<+9pmepyHnQ\5<*Pd#>Pt<lhiFc=C=L6w1nDJE*?>>yhlptA%
%\aXQn YmYh:*8CTbI%HCT<JM*>6K1Vqii6pu1e!e5p!hNeJ56$q6q5WTDubmduSVQj%Q/1ZRi4w9S>SlBu$6i@
D&W\9= /<ZT?%8p$Knm$6R!DR5tSP!PeqDD6RcVM?d!elM@4iVeVPkw#SNl6lapYYH&q4p<AK>:HHp<PlbBXH/Z
DZT8yi 5?+yGcZDI<8%CL>FDX4@%nV%=<FQ$JGF\D>M<$qjSP^Chd1qmDZ\6eNQli\!nHnTR%6m+t6\W*GZ?j1b
8YlTIm V1a:@$:h#H!i**5%bI!?e\e1HP4B!nT#^eHPKtIQ>!+H1jeT\?^plnQItnt^@+Z5LDR<Vi45n4@jj=Hy
ZIcJb= *E=GwSe?W6++tY?1n#md$&5*Zd9$!@wDD6N!9<$AVi<$mN+ZEKTC&#VtY<+lC@4%4YXMDY#dMtIEbVy@
Fk!h9a TiPt<h%@Dhp?aiuE9D*?D9?ii^w&i6XGI9T1pIF$k>J#GM%uH#Zjj1/YcjwenDYi#4Pa%mji^4/mSjCL
NYCnTl RddRVtb^?AVAPcAIpYI$LGTLcc4A4F=&ti!Z*#5B$F/jQqetetq!tacNhTldGmGH6\t+Y1WVYip+*@G6
\q^%GF IkWYlT<Cqb6kbWL*YymK&/T5klV?F#L$M^pQcX&ucdXPWpA\4+Y*S^G&Vdbat#T#JlWlKp^4t/XqK\I@
b!dMM/ lC$+Z+m$CZebEYL1CBlPJKEkmB8Bth@^NbnNlnndV1$!qVhDJCJjnnRE4ekyI5mKdG*cmBJ9E/ZGhyEe
Xy5Tc@ mpD9R1dMKAY=6q!n\JSZS\KJ5/abkV=talG\/<MSjXi6#Kq%\@iPP/t*#I!#14^Lq5F$:IWJYp4pKBuh
>tYE9N bT#TL8<>iN&/^PP&dbyGWT!#h^nckYG?RCY!DPRhJL16p1GPwDy\!lTS+hL%YkCE*n6elLI/FjV&!JCE
5nZZSh GRb>4Ib^q4TCZ+Db=jpnlS1acCI\jiR!G$6@pGp*TbDkCCI=FtGyGM@Eb@e&YBFk:Hi+PW<FZ?amjH*Z
:DRmwG 6\+qQJa1uapFn#R!@^d\cw^p^t=#e8tC?JhqiY?KG9J?k:T#6<^AelPZM4&N^/E5@$4iP+aLwem<<6l%
PAyDBp E@QiNbl$%l:#:Mm4R#WEhhbRlLu$6KEPb%GV?X:VLYW/F*lY=<6qlCWLZh+VeFIuM8qY$8XMtRleY<*Z
@<M4+w %ZL8kY$a^\upCXMSyhuh#EA\BQEY$jdW<dnb=>n?na8WnyHAI=<5bXuBVE9Y!/1WaTp\SPuEwXq4<akd
5T19:$ =1%eRG<kp*AFnb<:AqQ&QZRBL@!8wwMqyA>dhZ=B6>nJ?5Td4Q<CWn&Yum^wLj$EbQKq9^/!h*LT*cm$
IDFZHw QE4Wn8!<yW9BE6J=MT+aLTmMIK6*=q\Yd6J#ajbbF%VHBQWGkwI$NH>CbeQyth4C^iJ8XM?\eYt5wNTW
RK!/kZ L+$=Hq:$KIX<#E1F1n%/EyWu<8@a8T?Z=4l/55h>^Ib#/WRKQbMpn^tFTJ1%Wcnh%?<**:Dnu*$S&GBW
j<nKQ8 tX=p%GNQbCDZqa4jILaccmWe%cN8dBq4cuKwYnW4E*uNeaR/ZRMZkDTPd**PtG>BScFG5Td$6YhM6Mlq
8Z?Zqh MpS$>VZWi=p6e1^$W1wb=he!K>YL=h1iL^NdSjKZNAFe1=5<KIc/DGXCwt94amtDjTMA+kIilq:8nQa^
-A<%hD 000ca468fb8001202b3 Page 298 of binaries1.zip
K1F9w5 D:\YmR</!+BDcy=p*DC9G^W8q4EQM46E&:J$+JaiGh1851<6DX?&aXdbn?EKA#WjtKe\C\\F=klGyVLZ
M1hjE! ?YAaZI!1p?5>eNWPtamuM4Tn*9>G=LdL@TSIEKktR$hpwed#k^DELKZIR9m>YM\ZuA5F:QwCb&XXT5J%
<>y?CI $=VJw5Z/Ac>TIQpw4#ISq!BHw96H1&YGeB9Q><Pka*aWPhF4H9nC5iaNjh*pTqqkSI+V8NBBVm!lwKqq
T+E>dV Fcw#C9Me#ZaRGBC&R:EkG$k%=Btwb%6X>wqW&jd&lekJ5S/&!lmSwRwShhh/QLLIa^bL+^685H^lE\X?
\tH@HQ pMn/k\Xa%lGbyPAJLF<>JD/9K^HbF/6P1n9Qatt@Iq?L:AwAJA?XR?qSblCb<TX9<Vc4YYH:/5yYqN/$
P9MFVP <*^6I\CTF86QXc*#+5b=k8QuFmF!\XTDVNn\YI54#MLX85JCcMMeIuR@jH/D?W>iY5VK6BnYMm%CZlbJ
+&dHyD ic5bN#Jl/?$L4$MGF@i:!M8FJ@%FRI?5YqlepW5:m:@n&H^4LW&=tHiX=/>EMtc+Wb4=5u/Aq&$lW:Du
^ZeXaX m/Rewne5RY&q4Xe$ImpZ/?XmQW4KWQ^\cW9CyynLAHC@=+6MX6e\m\NI%4LG6*/cmmV^dejtI/q=MFKl
@5ZeLX yR^a/A&Aa<%A/9JKGkAWSC%>&M5?DlkV#QZDCetXE=KlaaLtCCye!M:Rk%#A%$$%q#p/nypbAn:5CE>>
!qhdPe nXL*R+u/hCeFWm?lJGmE<I!q4#4p8GmDAJKZ8SwllTWXy8<%q\H&=h!@*Kle8&FcJ&N$w^P8@wM1+:y#
d+YPy+ t>1benHu+<h?uIlXl#1lLP^?eEL^+5$1uKwGq<cwD>#?^?i<Tih*KyJFG4cVpRhAC&9#XSeyt=@\bljh
#t%hPL jZyPlYiQjGW4tjhtdt<S@5eu^X^LG+1#H<k/BLNWcd=S<<bDW*JRWZ8mIcCd?8YI#$Gm<XH<%kS=6j6u
4<y+um 4N5m85l6c+n^#/DD@n4FXNIa!n&\1/!Je5D5?P$#iNmZ16p1K!dtcF+JMb%q5MjWiVFR=R6YFW5y*kuq
4#yya9 nMTmwA:u<acMjSDRt/in&$F11GGuWb$1jFwyQ5C*C/9Zh@^%tRPy$bblI%<EWGbBq!*Ia?eH+JRyqp6j
i\@>>6 Jpp9!AT1iwP*YHqq5QD!bhdI@J6:!$XhBZ:qLSJ4p+XuI@AyS6L>XE5/*q4XB\n*5Sj\%CI\9q1pH^m#
$<X9Vh +nmMBy6p5mc$!^a5X=qMd\X##QK%l$Jth*lCF&qySj:^w4mN%wKh%%tj9\\mG\SKcEmS!lh1TSH41=*Z
TD@9%6 qnKEYJpCFwkYpZ5@d=\yC=plBeTw#pDcu>1NuQVwWX>>uk!knEwFcD1>ApT=iS1CN1&yX18!KcHY\NR9
XDBcL* #bRn%bG5ySEE^9HiI1!tGcL@9BJyEpTtiQ$ZCbnkNIqy4Et#S1bFPLGc8qkQVbel>S#jG#1kJ9hkbWDa
MKW&Z@ 4%XlZ84BItYRyjXBSF%wSpTpLQ4/cbkbG*NY=:KY8mRdwQH<%t?!ibC+%p/TRGw6Cmm!N>$5BW!\!BpK
:IMdWP :Z1el5p<4CCuJkJ*l5IZPFWM<ZJiXjPqCCiX!An!$6E!VBibHiZW5+=t6KMBc=y\d64CcuJB/ieCka#M
/Q\jP8 l$<6cZDtCm1H^ZA/B8NELBPuw@=+GaSRqXJXuhZWw:R1R\\1dV!D5^jI$qdCR@b4nn^@LtmS<DbPX::Z
XKcD>= e5KEpHE\VyR\ADt6:n$/k&:@qh%!phPpKBLhEtMi4:8%TqA\K<&4NbbPM&W%FD84djmh!\%#MM+/tC6Q
6ut!TV Kb*K@:VVI>:5+>Y4emTBibTT==qkm@\\d4>>#=qM?cGh>XpVyyZ9tSQ$HAL\9HGPeywQNe66/nGNnlLZ
V+HLm@ 9E@ucc4cbew\j:/l?M%*iB+uGM%YcVk=\XSl#$!!CKJ#tyQ4>Sk5!kk/J48@TP%DZ+@bmL:8WXXGj\#6
IaKYKS $+!aLYSK!mpQ\@#1BZ=b?wE*Y51liA9#54jLXmT/C4$*kjbPb65\qd+AA?JNbkM:AmWdR9SqV^DIhQbN
1CIY!Q Lc9qM#E%lDDN^\Jm9bb\^CChTTHkC%\N46%qTLbF&ndGBZWm/YESh9IIAu1LB9WD58K1n<?l>^:1WTKI
<R8RFN =wI#K!W!Fwul1VKkFuQA#HZmy*=GeaA!eLHwk/eWY^Z+>4+&FhGqBA*Y\wnaB4%&X+A:JiF/a99mcT$!
GqG4dl @^E8n91hNt@VMM>cw+*&#ejtFVZl1uV?NtLtFVDd?E#KpR9El@wpZ/%!Lwm$Hh5m!5IYXL@*kA6?cASE
puC$ZD !%1\kB=XAH5G4+YtH^a^$1m6p$TKYXEEtYp#w<np4^?dF+%ZM*pcIW&EC5AX/PK1KkPVSe6eH<+MIVN/
^ZV><? YNSh*l!db:X=ZylK^F?EZCF!EcF^WuMGk1&5JiMyWiGFwXhE^#D*j\J$B:tFaT1ek+cHuk/IBtpZRWAD
u=>dTu bPcVp>h%IXtqpJY/M*h:ih:qINa$Ty5qC$AKq9+NFaAdNi=+TMXtw6A:Nq<qqXwNbblS?!PawbFYnj%F
iApayD tpct<1B><bC*GiLZtW*VK$X54\hB$J!Bbea>N8iq8&?KCV$H+J&B^p#<Rt4?m+:NZZ1Ll5uLKc@IBFy/
DF<m^i XY?j\d#RtJ*YmAuhhykmChQYMBe\:GR$dy&KAHm=5Y8IPMjt5:m9wy?NA/5ZqKtLi48n:hQYtnAR\J:C
SF=&pq JWKiC!%kBuu^w%6jwBM1PMeTyy!JHC*q@$H*:Pj$&$^ZJ$/<p#$V?#/C:Iu5i8InQ8&TcpNQ>R=1G>Qa
5%mnIC ae%&//VJ?pVhMQRA@RG$*X>>mSHnI:Z+Sc+EEG/NppY^jCbFu6Qk^VZTucwYk@+GuW:9F!C1kiY1My!b
8%4>RX $EF\%ni@a4RyXYQQ6?$!KbEhC>R6uDE:EcM1qS:S&bm1lui%=1mSIcV1^DCEq^Lt+:8>EF&/LawE9MJb
S?PBFB Y*YCQ&^dPAJ\<@yZmDRlA<TD?ww?J+mFAuJpRuu/IJXFTZ=/#a%6I#?XWcM8Aw?cPcE8iw?k9#aHM$y9
5%e/*& u+4/mkDRYnpi6tbEiat++8XX4@^l=66iIZJSm9\XhR!:XR#pWdRX<wa%Z8e%tllduuGWH$&YIcTyPTXj
Q8M>Pa &l#$%+XFZ!6p9EPj*BjQlikmpl>EPal:EGGlhlRADEKchBwN>Ze<T<ScphlEIClk8\c=jL6A^S5wG+9G
@CiG*P 1uZ+:5dJnmLABnKQRdN*NK@kD@STtaXE+IWE:T$C&Vd4Dp!/nTBA4&kF9jylpZhFZYI!>YK<NIK5#Ve@
c@/$$y T%u/aGq9wpnGQcRZK4X5*Hwea*e*Vt/E5nJE\l8MZ?pQ4ju+8G$^u:q=Dh+FM4WJ5tknL\8K&G8:DJFu
NS?5T4 kQ!bL=ehCn#WN@R/BX$F!IS5dIl<pEycLmwhJ^5GpSX^u%Sk:4m1e?+Cm96wN/&XYbhm4bStmq9GQTFX
$@:k*B jR8pELhhdI*Wu1#Vu!?nQk6ETM#?$B\N^VIJn$IThZX=ybNLDa8PhPFJ6bEtp\pIF%k5Y4XW!yLl=ZHB
ZH\#9M My4JtD<LbSqI=iYCeKGnWIeXQtq^Rdq&:pPhI:QXe:HCSk^t#iCi+m*ttT#ADe1!M5etc=9QkMQiH&Im
^M>:LB nhDhCASdic+tD6GwJajPRc%pAQkn6ZCi=1T4%DIqT%pG9lC>=MRy%na/5>Db/yKmMhS=%hiQc6Lnp=$D
i!RHqy y5:/W16EeCL6\nl<CnKZPNKp+lh\T^ybHVWIi\6BL/B$\4dSPhmT:^I@A%>VqcwA@IDD%yJRSAdPXSJ>
BS$nl> pwT6@@@y9d:45wk:dc#5cHGEeER+@HGyRNye<LKSI5\C>RCBGbW&N=yWY<+8%8AD4P\/h^wZcy%151>d
9T>K=L ZH%6N@ZT^6lhP&>CZBT:H%lCJ\lHKBq*YWwLkhiFSY<9qpWi=4&hN*EPq1NK+KTQ/SPG4<<?<%MAp$AL
4mY*wH ?WQP#?BmM#CkX9A#E8BAdND>%dmj@Mj\aFnu+A6@\?56pJmlJqWkB4ibdnGyah5^9G*$bJByu=MKDLSA
hC@%aH YmX=AFwDq+SP%8tTKZ9H4W\RShw^SFdP#$k**tWR?K!*!e==>wG9EhtHHk1X<%Tk^$Kq&/DcL@P+ad$M
ZIbck@ &1!AJ$MV?6Zw\ZDt!TDmWIc!d6YDwc@9ey+M>T*dN%^TD\YyhCP966%8:IZhat?@mF6EtM1h9N!4My%n
XD5&HI +MDRPAeGdJ6d61MD\=&&D>#aPmk<!T*TJP\=MkkwlHMV$4*i5q$GXFtw%9XPY*tC$WQl!Y:naB=TFa8w
aBt?/F iFw8C^lnSp?GY<6uQtm**#=\a@SR\Hd669Hnd5FyLT5R>Rb^QHw\*Gp:cq:96H*kS8R<FKLX@naj!@Q>
DjB/yT 4dj!!T$M!caN@jZw\ZCu:cl@9hQ&>c>TD\WSPb!uAwkl*jdY*:Z5nGM!:CNbS^4+Iq!A4i\&G/iC*h5a
+P4Eh$ 1G9QXjdi#1kZqy1$#9/h\CP?/wJwR#?ECYE#@9$*<:ZVM^YpaV1Vy%wF#k+<P:h:*Z@1^FA+1yF1#=#a
&icBDP !%8ulP6/qD9bCiHMk\9a>bY6PiDMd<cFaX:d*aZB%GACkSYJ<e4uHV*yKE65X\Xqi4TG!\J@5!w/@<?@
4\?cTW \*i1d1M*L^VbJqy:MScW%mQlp+mjXHHSqk!%X8/6!>=iYw9+XI<bk1:dpZ5yFknV%<?4bL*!:Ndb*=Dl
+?\AD9 w<IQ?F*Z<FNNY9V6W8@Dm@E8Mt?E5EI+pbb&cY1cm1/DH:ue5w8p%m@Bqcq1PuQ9/E<lw\S<NdLPyF$#
$/:pke IAahXIpN$+mBVpIpt^RcQ/XS<b!G49/8=iny6p=#SB<+F#XM46\e$EIPZ!!SWVj&6Yw\N!15RA<a?DLM
K\CR!i +#ShR#May/G*V4Hh?hh^C=e=WN$#:\%85wnkB%iL<Ae@N@muYjXQ1?5RGwL661ye8hwyY@myknpqD&&>
Stq!i@ TJ9S4cK/\:</>T5VyyDAA*ljmc^9VFeMD>\a%m*$9G6#m*@cE&&ql4QRn&pcK9!$HJ$4%NEBLwN8/<1n
l9J*uc e\X5cbFkL1VAA*uqA#e<j=dE5qde/1D&SF5BFT5juLSb=iXFY+\8Fuje\5ZC\*KW4itu6wb&y&^pet<#
RVP6Am KLKLY^*Wutk4hWDb9wlpWMAE/B\6:4RhHT&cNV\b5%1pwSK8\>IKuwCCQK*kwFd5PKk>$XcYt/aYtFb*
IJB5kT $lSFXt:hLi/\Hh$6GwG$eEAi!4!T/=kHd1#>bRyH6*W\L$w@&V1wmS!#5!*P!wYY^&t$TXhb=8M+>dm+
6CG$db $*d$8LC!d6XIIyw6Ely*d+!Pd4j/1D*SX9ZIWK&YLXK6na+Z?>6t8:XdlZd5^Ww1SYQm/+BH1y8\Mw:8
aJKq8E dNcMH5ldL:u6FuVJk1NiCC8pP:T=#cF&8=&Rtu%mZuGS<9=GW*&yQ<NN^&li8?<F6SNnVMeJhce9e/yk
/c8mWk DRR=hp:M^?PQN=*V^9cHS#?EM%=#F5NAZW=%194wnY:i6>%:+nnmNw4QV5bwPQinVP898$S6DNhWT\:?
SYn1^i W#XTY4IAdP!S&jwY/QK1%HwZFAi1BWGl6F881AlTLbJM$KdYXHZj?dGXLV85E#Knh\ER8e%tRCNAy9T!
Q5@Gwh b&kJjaq<H:=FJ#R*9l4YSqmLct1:Eh5G>e%1Bc&\nbBm4PF?c5NNG1!lTC*tK\@cyRkJ!/ZZIk$^Fncp
JPnI<9 W+wHpZXMTRhN$HK5&W6F?5NDD=cKWuKFPXPn<m<MXXHS$c6A^lpaaAn$=j^a>#e5N@Yc\SAI^WJ*6a^u
hCE?*M MR?ec>4i9++In!mSb=bHq@JFSu^kY*Q:bh#9J\qMa\npkF>Fqjwl\kjKeEq*nVINaL?HYL=pPX\8YW+Y
!p86w@ 5GSLheK$ZTPpkpEIeTK%c8wHQMMk9:ZIIBjlqnH$>88=Hh$$*Haan/5S!AF9E?i&Mdy4*Gp:8t6\c=9H
-Ai/1h 000148b9866001202b3 Page 299 of binaries1.zip
Vi^Jb* qPHGG@lBKP9C:ddJLX9=QWatV<Fy<A1E*<dw4?G&%c*d&9q4nN91q9ID4^=hMy:5Xmd\hRST^C+m*S6h
La$u\! Nm=Kp:y6&dp!65<BBH<CkQC^w&PGd6N19@#a*+5??S\bH>CMl%tT%V8PG:KXlZG@ZD$SRQldZ?ueM/wu
<wjDJ= &Nbn8aqF19QYeBbMk*KwS@iNeX9hW6+HCWbBkqYR<FYZGJqY/<\BT<XFy&Hi*YL@^+>V8k1BGLJ=GpN=
GYGq=5 Wa%bBG/*jdj=WkcK8Km:p:Py>T\RV%YADZW<#9qB6++p>MI+#iqW%+?@9\L8ZwA$mDI?t:Hly%Eq8>Q%
F4BH+h VShY*H%+=**JSdIWnqGBn=uCi:jD#i<$FD^&puj&ZLyZZ%JZ/jB\XMTaecJ*195L+*S?bYejA^i^!Kl@
B4<jcZ !jdItyHTukI&imi1^E*HQWiFa!jtDc?R1Z+K:R9MnIpGTHX8Q8@ejL:EjH/&FPm<*46Yi1XG=tA+<#Sn
6ZiJbX M=^YYV%NlJYR!+D<:wMIn1=?eQmJGL<qwtP>FknB#ILYk*deD4FP=%Z4pjIWVG<WBp1Q*uy8PbCBu=d$
u@Tjb# 5!6L=p/VTeDAa$6YA@ByMp<DVYQ\?DN&1I5TB6?mkPpI#WjKwkiiCtNkPA86TQdJ44iedH9@K:%6ibAD
WBqmJ# *P<5p:ANbN=\5%6&%lPluA+uRVbE8t*&6w8\kePJ!RMc$paHqDh<pu4HmY!H8Y*HY+:d%t%bd5>?q/*J
JHKFEk N@/4elML=m8Y5k/NqkN5e*mjbLclF+1YS/?V$a6qLCPMbF*Z//!k8%^*=m/H*>&&k6ct!N*98babk!YN
&+W4aw Z4SAeAmEed+udt69Ka??J*Xd$JhqLD>\\#uICc:ah=l:w1&5=Sp>b:KklR5$w=B!Rc:PE&X*P/lumu1k
LkV^hL PI?Y5R\Xtd4JuduNBT^#G>^l/:jN1Nt\+c^L1VyVV=R:dWhQFP8/\Xl?\!6Gj#u/#<Xu@uNQ6HX&q4:/
^Thj8E FQ*b8cTM&>FFSZCVqpi@qNHF^bY@=VKF>Ww>Ne\LuM8hij#6w!cwZhtwY#K*QiMS5Z&t?%&EIu1ynL+8
N+@uJB #t8q8l<TLZ*j6w=+F%S6hPhNw=8d&?ZD@jFG*=ZiMWi:8G4b*uMBA8#*G%ZVcPmK?#=MJn@<=*:+#=G!
E?%?pH /6tVh>!iI+6:>nm!?M9*9iEhi*99!JH%dcZn!K4BqQEuHFq@\yH%J^^bj<KS>TeeYZ@CpjWuHFu@@<tS
cMapw? NewM8tXm^5NjlB##kHGBaT>/*!kVMi!lBMIVXQPHKQ\8@9\ueyca#*&j8i!e@AppDYN$tTwPcQqTyepn
G@S%6b CF?lp:VP@Giwk*!WLF6\b+t#%nVjYhBJ:WyN9@\GuDS*X<nQt65mAQGHyc5+\n>E845/\GdDAD<aE?tj
<!^^kT i\L\K!eit<BC&p!#i5AXpQi=4nX=mLLdH586HkEXWMX+%<F?n#Yj^pm1ZADXWDEIMPw<&>I\n\D>JDN6
Z@:K9! WpC%Aa$PHHA5:NNFMJ56+YB1tA#WYp$FA?<n1LulpCDkPdCMWAw%ABdtK4pR\DHkJAKDkeVBmw!H+p6*
EPlGM\ <5k@cM*Z<KG!ie1Hp6>Yp<\Gp*Bw\Bm<V1S8?FA%a4ePJm6EdhuTD?\RLn!GkiEX5<PDkIT&IH*&byPe
#b<5tM ?Ba?=uKNMK&G941KX?#1kj=Bh$uDqe5bLHyGA^DX9@GhjGJWGi:=I>d<Dc&#5<eLJyFNJyp?H89Mb=$N
iTN1dZ SdBI5@BwJR@qlX$#SAp=@GFmL9^<ueLl4aKXI#9$c\aHGI&ybhQDl:$KjcXm8d8y9dWZ?pXMJk#+qmF!
qb5TTX 6KqK$$tdZD84\Q1u4HuN4VY+pB4$J?pAD>Dq=GA/Qb^M@FkcLW5>cT?&4GHI$>JAJYClAA:JY<c55INJ
Lu/TaB b65KbP&!BSAE&pT5GBH/l<1jVPd#/YT^BuXQcYA9%G\V=tb%AWH>6VuA/W&8y@?ENX>!!/NYm&ql@YqP
SiTY^N nWEq:&k#iGcnp9!&!F4i4VHhbJI&XZAkWA>MRNIuLGJWYdZ#kJEY9Zpbtn=PjNX$w*HCnK$N*/\!qTya
T=L9p* I?mTqQB68EdaVG%pFl4PRiX&nS%F1qRP?Yq4Z4:VC/S:DGY\4K!@SBPTd5nV<eGRn6qSI9iE\4!*jlZN
8HP!ki D<KaX8VBRG>9T1RmRpb8PBYhtJj^SyuBnX\:/qQml6H!MC#^@NbL\*A^>$t6a&W8m5LpNL^AQSE6&tNL
X1Lj:b GQM#%9XbBlhL$*\cw$mSw\T9nyiFcneitlIDNqyNbypL5\kQD6KK8cE1$<V?NB&K\&W<RAM%!A#!eZcu
Jm^$L+ W9T:1%E+Xe&ma4qA*VhiE9m4&eIQ$4J^S1H4XScA@ewQpN&En:^%$nVtS&yPJEwTeZwY5ZC9ndQqQEtD
L4HQ#b &RLJKE$J<&@1!*6JhepNl@b\5mJ9Z=6GYRI91eb^+!BAbPeJ*bP:tkXjWk&tFAdA5Q*nkSEd/lQewk<a
lumwnn dTa*?@:#!nDHqqFC5tN=Nm?e#aLFjBbpMydYaXSujt!:FCpX!&FID@M/uEiDNGl1t@TRcclW4:qZn@5>
uNC:EM W#&JNa<RBp<%D1JV65GJ>E9p@&HWm>VWSWd%dSBCMXSh8GbZN#>RpW/5awC!8dec/FkP<InAtIXjkw:K
y^Wu5a D$FLLkMtpitjW/L<pWhbLnk9td8%D+ZWDL4?^eXu+%!?Pb8jVWZn@J@y@N>yXDN#XX*HdiAS\Fj<Ahhl
HHL89: /?RkwVPcqWh5VJb+Mj&cc<\p$?Xm5WyklpGeETKRbe=5BlQKSPVNDq9&>PW6<&Yh55ij1JM&86%!&/6$
aG1RY: /9htW^^StcYM%Dk+TPpq^:4nNNGdCE>ZeX+Q6J?nAy55nK5$NcT6T6M5PFkWNCc#Byj#=e!Zah4E!eFp
Llwu=a EcWH!*KRH5$dJqL#ZG9YCdllKq6wQ$I@9/cVQ*?8=bGpG$<t1^k/ZXcaXh@X9/8nA@:FGKd*+C\?D96M
$9ATAj HYNRkD$M?y!:6A$wJ1DZ4/WNT$V+!+J<NwN69/Sp@n8wh1d+G9H@!mcH+4b1N8adC>YM=!LtKHeWP+A$
6SnkXY HTl@1y8cGp5#tTEF<AZW*64+&\/?ZcVA@Mi?jDbjF>BmNRmF8nJ+ceSZ*=k9KuCybG8b8IKb5EWYye=q
19B\:W A46ec:K*^F!6^kY1ile8:Ybaa*QubZRbc:yW@Iu=mLiw6>GnGwdkVBG@S&G15Z>+qkLej\98@\PeF6/F
mwDed! 4/$=iLMe?9$+=Dh&<u\@@>S^A#!1y9JiViKJ&hmMX?46V=5@w@FVbWZ!AI1Rq=YR*%EAqEkGL4>uyCYV
Qk/?\@ Ib:DkqH!be91b=%lbGP?p9t#pQRJjtXW46eut6pdc^AMFZW@uDMM#$D5FbKna<d6MdGXenJVNcFPGH6q
$Ml9cc /6?l\j&!^u*J<Q&i8:EEqJ&j1!FA=yhlna19XXbcl$+WqWc%Pi\PMLheaiIauRB8%yV&pDp4Rjdk*6HZ
@NLpGk $CB#F>aZ8VleH6k9&+TZ?H&/Y/N*IVY:XN6B4ZG5nBQ+ma>Dl%uMbWtRARdC&DmbRL:CVCiDd^Y5DlL&
wkQ?NZ L=P9qn:TFYH1jk*pkMXB!9tucXiVw>qpy9b6#HeHT:?LRYMZVk?Pnk+Qbkm!6IMZ!H%pyYTG>uT%YmJC
Kyuqi+ 1QwDlBBDPt/MccFIdYmJ8TtTVb#NJ\e??S@n%+mE+Ae%dAWYkShSpKTyS6jKDut8IX>A/t:KQJeKDHYI
VpG*D+ \i$nD=A^E&?e?=Gy%wka8=emw:!#?w?6@ZBh^YZp!#6A#A!dIR=RI\&>=J5R+kh$48!H^&cK+GY=YXR\
DNXN8\ a9K$8k:C9ByJ=bV^:4whwwMn4@LutFj@$!h!4pipKiaIC#4E!Aq<<LSDdXQYRNPIZPHpDpS4>PqlB65w
MEw+qW y^h+kF85CmKE!d\i^@DbA\e\%MW\\XkKpwmt^hWS5XpmN\/1TS$DY@+>kXMnZ1BMDycFqeZ=cZL4jA/P
++y4KF BE*by\LyWKcw^ne@hcnIckNiNaRket%^eq69Q\wP+lSA/hnu9m8$TI8M$%MD>:bBb:I4Wlt+PJ\XZ<Bp
u>P=>% G:ya+mBtl8Q4R</wpI+Y%Jt>t<1PGSlE&?WMwXuT<yN=ka!BFN/PIL\bidmn\$^cwyTH8%bEH9wAL9tP
h\T4tc 8#F4YkTq+H+:knNmm\\Y@FRY@F/pCjBu?JS68GKQT+PIn*/I^HI$>XXhF^eCV^1N%jywwJkFw5jAN8qL
nE+c$w j%@JE5c&R4ahH&8hwS<T^:NIpYeFPHHKThMA/#:p>B*SD8KM#cdV#Cw9kC\@$u*\Rt?:RRpM5VSaDZR=
/uVNtK $wbSYlM=Vyh!5I9IKB*Hm+CuK6VF4wut5!R+=LBE#u4Itin=JDcwpYeKZb>45w^@9BAY!%W&XM8D4Hq^
5YuujW w&GGB=MqF>t>kpD8\>CIiI+qZ#8bykcXtiDRTjD!mG&Atuuwd545>N9bj^iI&+4?mGtaH6:I%ITSNhlP
>#QbMD Pt&eWNknJ+BIl^nZEHpPP&SS^Et>?X^ikLAe9Zi%TJb$a=HKT/eVpc\bNaMa:8XEbTlZCC5%&/c#ieaW
T85WRP %bD+n<8uX+:=RT4#cBp=ml*ucYT$y<uLaAne<nJjwuNpwQWFB#4EiYGe\cpPC#6HnNLTYIWe1Byeq/%8
>HS!^e h1CI!La=?JV1SHBRL?Id:M5FeyhZ!6Xdc9:KV!ZbVcZbPpXKVciHVC=ybI1i#k+Qb>MD?EdlhbLJ4GXe
<5tkPW MS+#TGw?=y98H5AJlwSM/FB:L@S<m4!bXXtWFGy8PyP?hZB+yNC+N=>cpZGFR^FmC&nLPa$ayyFKE6aI
lCy?JY J1%cinl:kZHIQGk=TJX&Dya!1tkkyp>4J1^e#DAMVHpe*+M*dtSmt>M@l9:jVeqk#6:<=$@FlI:APqK!
XhXF^1 :k+aM8ApWyYW#:Gc%/Z$Lq@uc!<&STLa1/<@Vibctd>%D/X=iR%6F$18wRycdLEGhLMh@B!48Ebqa9Tw
8J>@n% 1bC4lC:tw*:uAGPn\VkD^/T>Lm?j#j!a\F&YR:nB9jqdclDbC6leliCyRp%ubGQDqJ$8M*DX+u$ceMMJ
hCpnbA CF8G:Au\IIkXEYG=KLGH$^Et1k1D^Cn%dy%TQ+KWmNpC9P=lkDeVKie=eH%#8F@p@KuK?Z8/wI%myKay
p$iN1X BbB*+EP1C1?BKGwlEh8lQb4y=BVQ6$I?Gy&CRn>>?kFpCM#yB:QbFJpLAcAQb<F1qqdNy9=11KitB=MA
8cd1<Z JuBM<mKeaEJC4&tZ1+XidK8Q1lYZbuQbk:GP1KFp^Z/8tw$#dECXmhMbpX>RPc<ym1D8?jAHp+kQ@%NH
1<9FZE bkeTkHC+n!j+B!^cueVuTpc>!h1F*INwYcC1PC:J5k5+Kn6Kl4qi\>VmSak9hNG#N+$9a1n$Ca>8yAD?
1G%ih: Eb:y:l$EkjT\qi@AScjSbV9mHYqVDJ&e94djIwlV\a?u=1bq8m6K5LnbmZXJh?YRt!1/IpGW@pa@1uQK
44I6>E TF54RTVl^DWM%+CkXmS&J4k%j@dWwahnJuACWaMTcl%LCjwH?9!*Vlc@4BKyXSyG/=IWm$Si9%%hnX=!
Pm\HB: 8qWV@=H/y51jQ/T*cp@*H:w!@Sw^#>WH#Byu9YpHQJ#>?dJKS5=Nq*Za^T5k+*J4FXGQ4MEd^^X&LAej
quV#l9 I:KDJAJ\MV$lenuXiI?iD1pcj9JQi#1*%9V18qlBl*DVuFduT?lKL1ueV/1C/pLJ+ZEV?^D%ZQPd>I#L
qE+LJC n6wGdP#uc1NW\qIQbe<DV6^*uE>?@>MK6P:X8XIk?abPAMCFTp><YnGb61GL:E@&%KydQ5L=GmQ+ZEN@
m4*VL8 +8aEmPWWHcXlmq9$t=9DJX*c88EmA@m/ASX#uiq6dcPMaD%TiDZ\T>Te+^NE/@Mdc6Z6QC?u<\+de\E?
FIJw%B Sl6yi^JP>AM/c4Mby4^BR#aLii=j@>M89:p!#F8Iett4QQ4!ZeT6JNWeFRA%I5V+wDpE!c#5RR4aTk<:
-ASqbX 000734f52ea001202b3 Page 300 of binaries1.zip
GbFjHF DV%w6L\8VDjlJ!Wh$%mWkmBYGhJ4XqE1%\EBRq4I\w!dyM^EVLYbK&bqFjZlu+4YLdL:+dyyTyqT:1:W
uFSKqk CecYtb#qhRtk5N^MLpi>?iFpVpu\+T>kkMh5PpX\G\b65ylMKBWKlywjLJNphlBmyyEJi?1Z<SJ#pBjP
5jKHQ? y59EZ/$ad^p6y*QIj#Mba*d6H<^/@@ZJE9#yInnMeqQ+S\m/#ieVMADNJkFFjn?aH!/DyNW*!pS/uB$6
^!EX4B 54mKFkhHYhuPSXIYALI<uC$R<mJ9FEuhRN:PD8WKZwmJFR<CSR^YIY@Ib>Cp9P&b<1TH9tjmeEa^WZB4
dlXp$@ MM>WBwcmSB1>>cNNe#=jSGlqYWQpJ?/+t1>E@4Lk1h<MX+1Wcpb<Q:Kb6B%ZH%t#klZQ/PTMR=BPYlJn
?e^Q^@ R\e#uJluk\Y%:uL=I$J>J18T\DYR&R?GQ$LH>EL=dTH4Y^\8Sh+cBEIkT!#e#=\<&Kn+?I+dR:/Wp=kL
y!TKp5 P\JjWJGEHjXC\A%?K$JT*GX+SRnY5aYYZCRNpdckjp=qNeTeuHw!nmGBwSDG=b4pjkQ$bmcY%W^pWq^N
4pQ$F< ?tMMNphTZXZR8%jq^n!HccQqImY#l@nyEM>FaK+1ZyqikjJCXbV+INaMthT/aN\1=SFXT<66cHS/^#Nq
iKQ5Y9 ZdiR+pI9q@+NCcTIR/S5AZlFG:!eMuCVB!Py1X!9kSStcw4ENI?B^N+4QBbECC1/99A4J@\*5pT6G/A#
>w\<be 8hySwSAYPC>WLiX#c:wp^qT=k*R#KkI+>Fb/Ni4lbccQ?9R=Sh^TyV^+ch:/A4MSVCL4&uwRpc>ySZl/
9Ni1j= ?IakSSG4pqqTFZ+BVPcZJ8F1I/??ZKTbV&YF&6\1AmKnal^Jm4wc\8R!VFbhM^kYXtG/E9t+1V#*NNRY
P%>w*+ !6WYC&u<yd<9C4=ATZP&/t$waKRXuCb+1@@itBjpZb:qdSVyG!X=uT*Xc5H:AGADcD:<q?Z>yP5nbFQi
!F$WI$ TEVDNEj?aVJH!B9N@ZA^ye=>^G+%^Vu*S4kjZtL8L?d\*&hl=mik+Bc=pp>Vkc9?4^l*6YAPw<mieF5Y
V?!M5e CKQi!wA!pw<C%V&j9SDYAZtVIk&nGF%M5E5t<\*<Rk5>E&?Ew^>?yl\ZbX/?dAiE4eq6q>I5^I*wq6JN
R^+w^l Qy&IbDS4Ya&Q&dbSY6Q8PA\ybke%K5BpkIMy8>q&&W<9?&9Z/d=m:HSuBmMbKkwYmhJqpIhiP5<H5n1P
I8ep%k RBLBHTKkq@/56XR=!J&HJ9G>It!hnMk*T86*jFHd6XHwH<%dARENa=SqAwbG^PK=Y$FQYkh6ALti+1N%
Q@dF4S d%TD6dCl%FtCu4Awcm%aMMZ?VhweVY!R\d4l^SA*pBT*+I?a1S>eE?p\dLVdc$h$L!5VW6#+p*cIjH$l
Vl%@VJ K>>$lcN65+S1LG9iMbMcmVMB68^cVhF=t?HXun#<wHYIXBm58#R6l!y8BqANWMppp!^C?+^CGGy^cthR
Q4R+lL 1#E%@W*BTTIJ4^6/@iw=D6d66bAAqdmSPpA><+XT%B+k8G5l:a?e#1ya%WdcKuGcMAe!:mMVuepEHV><
V=1b8P eYlZ99TF?\TI^iCS<1SNdJpm/#m%ZkbP$FID5ud=+DVNbpHJ/t/kibRuXt^6K&yL6NDR4uq^MPE</+ju
%t?L%q EqZ4%ad/4IqGmFWFW#u1M=Gny1EKHqWHlGS&Lw$\EwCt$8uRbAiWeKp9W5^k\=Z$i9/%D:>i=khb*Bi#
#R&udJ !WwYdXni\R&!AF!8yCVIiV1DtkS#/twTJIiVFBFKp+QD\?tSV=<CPY\1lcQJXJwK8/c?#qN+/6p5VA/Q
KdbCJQ +MAPFWhdhbQJHC5h\haZEG#bhZm$CwNqlBe1\?upADLAanKL?AT<>GFt\<upACGG1<qpq8M&B#K@h=Qq
Y$j&Ge YlbTE$+Z/j\I&Pk6V&Q1p$=EI56R9nmGQq5D:51V?HtXm+%Vil:Ii\l*A8Q>\B$+<nT?XDIP1w@Qq*C+
*V\WHD tMKEkGSeDIG8?9l!yTqKSJB&$G6KdeiAw/T:8B*ZwZiCK:K::I9BAF1YbQ#EL/D=qC&dnmIiR1CwuDj@
VtDa8H K>N&MLwae@HyFk@e6PeN4AFZ1iSujAl@Ewt:JXVwnEe+%Ym/6\p=:#6X%T9MPmWqQkIa&8%qG*9bpau%
a5^AwC Y$6Cd:+XeEZVpa^lhVj4<\^B$SVAe5Nc$\P*>adyhJp^iMLac5$5jK#k1!KaPGWpH&SbZP5WV%nLE>aZ
FM:pLK ciI=We9I1ZpG5M:9!4>*AC:>H9/<dVVkuN+YbApEi!<k&MQtm%lJ^%6aNiI8jG<hQR4=!9VL^EZ+8S@/
S%/#tq :SH!=LcW<kh\+:Z=i?hA4kd$BGTyIPjWac&dP!lKkGT=1T:BqP9a&BR%uReZEFJQKe4cbqG8N?:9kacR
%nG<n? <u>Bd$\n*bR=:hqR96SKeXYaH^FAjCLR=\TGqC&IERAFnL^lBm\mJmC@ypM8q\dRCH?Sl?+<5:cec\Ry
EknnuQ ZYma8YYEVeVbQE/PRh+Z1PF9EwaFqPnVk$pC1+ydXE>BHqM5aZebdelE?1Z=qY6ERVKJmkDc%^?=C$@&
+VmML? EFYN!JmD!VKpS45Ip:BQZ^MCPmG9ii4XRE6bGcZ\pWD1iytX&=RA1yV4hEZFpyZ=8m8Mq?qlkwuA\NTG
Ajy9T> !Tb<KtKqnVyllG5tI64KG:&=t?EZ#tQI:GlXc9PtG+$AH<F/5<pC\y=M/m5HTPwSSqEHJhhd#CKVEYPX
wwa1RY @tER!5=\ihTJlD&h?l:k#/!4eyqpBel=+Z!/KLLyRXLW<k/LA\FA&eFpWVR^LAq!#<qll=m*!jS!B*^!
S%?kbc 6Pn>y^=NW9kb/dyq5Ry8QZa&=l=>P?h8AIZainbJnJ4l*@kW+J$e@lBI\LYLSdaRKX9KemJ4dmAa/DWR
Yj<YJV EqWEl\PF=YWSI+mkTX#Gk>RpwAdJ551M\aQ!RGA^Sh=EtKTpCYRCpaY5d</L&CT*YceC!#/^klG4N48P
!iR9XZ E6B1LhSS!Bu#h#^qyAF>>W<\d:=B^!+plcE=dBiAAPeWMmCy68bWY5NhJc&=+DhbWNCFc%BwR>kD+>1!
aY!Vh@ aGA8Ip6<YW6kHjLC9BdyJb6FR:TA\liyIGYj\Jj1BXTq!#9H@6Kyc<</$yui56jY&L1q+JZTQE4W%MH*
d1VthL kPJbil1Fnq*eRWnWwBbVk*aTmI:M:hLX=d/NTQYi@Mm*wq/j8AaM=BHALXY8IykN@mRZ1eWdIKVLwECi
bh1F<e CQKYkV1>p*?9S9bGbA:4qyRl#L:QD#luI%WX:P<A?Y>LY\iW5&??mH%=Q>!\iIW>6PEputK^RHV?WM^Z
#jhk\4 pI^kPbL:NpRuMF9!&w*myRG6I+k^ykyi/pEp=tqtIqwawG1e11GZdyBhunynm<\&:TiQ*Yi*&nEG%KJB
FLKk&Y >/mh>+CeL4JbT^88qWGPNHp4Q\6ZIwHaQa\lYGa&Pb\ip9eJYqIb8VKeaT+l*KQG9dH8QhSeAQ??aA&^
cM=YS# EhA1C\8T@dWyLK5XyK=IuSHSLScaQiyZMXyWAJZ9PZQM:8Q8N5li9&1RPAkbATHbt#h?QTFbpC\RnFWD
4NEtQ* V@A%MA4kbqiW5B:1=iWB/uY!m5lT:5!QbV%CF8i1Bu6Kad8A4X%$KVku$1\F8ZBVb4*@NE$bTE8e:?!\
j5tc\+ yNd$PCN>*N/#15<iVR@:HtcDTcFNkFWe@1#wXB+:qTcB&/IJQ?hB^XC1AeMK\EF8P\4$qDRX\qmHW+^c
d>Qa4: I#thpI>%+Pw%>>etCkLR!MBD6nWyjj*&IAMMqw95p/Y!e1mK>6?D4:9RJ6^:D=qNYZiaY&ZK9WK5WhyT
!npP:I \NiZKFcStSTX\:EB9%8MQW^L$8e51*\Qmct%LTa=AJ<>+mwHFXEFZn+bXEh=d:>WddwqAJVb>eLE5ANK
BSSFFJ XEB@T=jmKQKVM$9F8Q4StbAtP@li@MyXN^6V#L5tW9a1c/VFXquj*CBXDhwdqnScAkky$IwP4hC#RGwL
wHhRRk ?nE%+RBELKey@jPGcnFBBPF!BZ%e5R#Y+LkBcl44Ri*EMnX:k8AWL?+5HM@ai1&1a?:ii!ll^WT&d:uS
Kk&*Vt FQQJXN$@RL%w\5Mpt^@R5%i\^lVMuQ=Ey9k+te/VeDbD+$y>l\eHl?yQIw?4<IJbRVtID#6PSuSNc*RI
=+q9IP &ua?PbnupIaEP?%e+GuT%&Vj$hF$6ChX8@LH<1!+9\Mi=nA&qtWHZj8@>I^mBSG/D8Y>l*Rm<##wT&D:
jhb*AV iTa5nwAXVh!81!#I4ZLNE*dIPem8w6nC$49wa1&yPm?weu/8&cbKEpeR%\AEdM<>X=W*+/P!N65GcN!#
mwR@15 p%TCb5\>j$e:9H+manj5PqJHK#@5@R9y8mER/i$%16=HS!eaRpc<$bJ+=ESF<R&9AN^!nS/+AkBF>n\^
VT6Gd= Ah&FyNeLkq5CGc4S>=\IniG=JA$JK$:kH%MYc?laA$G&SBy>jWW=9?t5hTI!N6HGH<lPq/pYX1Nn\VAZ
Ed*Jiq WRu!@an4CFYR4Q=1dT:TLcL*L+L%*u?^ES^GB^IA46LqC$9p*:?ZX%DKqh:tWmM94NZ1bbGE=&<#ye!E
QPpJFJ jLc=PRj*HaGLcPiDVCMajp5/:^t+iVw^!H5$9i/G1PV*tQbta*@V9P!E/ZI9AGC>*=GE=#DD1He&*%GP
NpLb6K 4yDmE6nmN<%K1XWKA<Ld>/6%^Nb4iKEJ4JBV&B^EG$lFLIDuI69uYE%^=^4:Y!cE6M>MLyY=HKp$u<k4
tTXe^E %qYS1tnQQDXhRkPHNXjYcSJ^i1H/YchbdV8%9j5/FijI<wmPehZGGiGD1j?d?jF4ZAt>HAG/t/*Nc&P8
/lmlGX Sm9ZBWk^wItDiPe<lduC5VuDjmyC%tIbIlX4w&B\CnT@q5G6#tc>i/:5MLVdbc6e#A98#a/+XmAbHL!>
mY@8A< y19XRthciAl8=EI\^@*KwW+RM&h5pX4HEIN##&A/1EE19NyqS6BZ#8Bi1$&lG946nl/i/mLChp!Sw\/G
i/!q?Y 6jTX94wGynHK^QBn85dVm^R$maLSyG8bPIQjG^bHKm!qX\ZktalhtY1NCk\$F?u:51uQ$=@le5ZXZK:=
D>5Z9c %m@EaC=YC#XL$!MSFuWtaBb=kt#iXl$$S/DynMwqbZR#pJ!I6AE%M>HY1T\eVI<Ea=@W&BFeJ!C&/@y8
H6VT84 mFTBTeutIPD&HKK!QZZPkN$8WQ?pi9V=a6LtdYI?KEta4*DnVI48wS/=RYcQ/da>&*A=P%AWC1t<TGT!
PYyj=M X4DZRQP$!KFGX^9j9F&u1nWW=Hw\DV#t:Y:>?bL&PP9<tj!+=Eyw<#VKD8X1ZEC>#keANjX>#D8YlKG9
<?*<AR a\ILNLJayQV+=+L6YmXQ$>WpNjpE@kp!Xwya\DdZT6keXkhVjaSHdpCYYl&wH+DB>JyYc^?!K/mCDw@T
WG9Q*h $q9Nm<Hb/Y!b\BMKh4/pLBL/GHFQ%BR<#Fd=+tkqW%pK6#ZR:bymCePlyVIQ>Q9w>@K8/YIG%Yb%H*uM
ID^9RH q4=WJdJBPj>E:*C!!8N>hZJ$NQHZ&V\6WmKE8WDiYMGi*PnIn@EIA4J?:TyGh81<VVEHZY5!XL*ICAem
^VXa\R DC=4CQJ11IQeAK?cjCp:u6KEkAXdE^/mRmyWmi#:KQSZ\V#T<admcFuSn^LPKRNhp&!6+$kFX?q/H+Zl
k@DS*R Ce\EX#5nRHkauBQ4cBESMY+>SAH!h\1m9d8A1/j#JM4WuthlhH5:!YId?8G?B5dkMEtDqd4<JYE=qFXD
+h%8#L J@A<pCcVLkJHh1\\VXpQc1pECBSI#d+?G8Vk#9J<iq#TBNnTJIC$=Ja?mtVY#b\#%PjYTFulw1DkGJR5
#<G%eK @jYAeIP>%uH^LYw6ktPHN#1H$q6RukD?l?b6nL!wdy4umK\%Z!Zlc5/ZehE6hQ+i4>udV<cET6e9FRic
e$=j9A hna=tnuSy*K&PQ1?1LVt=G+?Xh<enV/Ek^5YG@M=c6bV!R/C%LTDq=#h6!$%iA?$DRAnlYASXHpJ6Sp+
-AuRTL 000bd06b575001202b3 Page 301 of binaries1.zip
IaV$!c u//*dqTHiMGte?pnZ<hb6%KJS1wjV/#tl+ybw>WiIn5wbAPpXPY/nL*+FuGV\Kt$#jk18AK%<L5!QX:q
n*?F\\ :C^\mMViKtCW\Q/45FuGX%HLl4+KwVWb8iW=*&nNN\y/kB?9PmZCHRdJ!&uCwyPyhDWR9^wChNtS#$Iw
&w:@>L kRL\HK5iiA<X\MY6wWR8+*%<m%5hIY>>C@Thay:Rc?p^DeJG8jW6?DSt*jA=*&VNJ>wW>kmbK$B#%yRJ
9auN$T uSa!lC@CJAJe+RY4TEa=TeCmye^RnYCy8cCRV!A9juXtS=Gq8WdI\^wV5>NVk9wLtGHHW$*G!C/ahyk5
DHeqJ/ T8k?98QRb8%?a/lSl6lEJy$FdE+bl1!<^6jL6DM:QFlq+YR1e?95ME\PD\A:NFB!Nk>t$^A1jmlCD!a+
mE?IV< dkGlQb>NF+9DiSjDKHI\tcwZJQKK=ZAdai!V5=*IiwB>cn5=w8&EMX$IEBZlwb/FtP1^ny&bYF:C\\R4
J^qdua JKa+YNdihJK*kqD$cqPB\+&*tK#<I\Vh%jIcu<pwX8R:ZeeXPHRFd/=nySt9/BSYWJEDZmV5RQa!cp%6
pQmIIX C<W49aPBG*y%Rb5mKcAujSLhwwa=yRJe8Rk55ZXbk^JYjjQlAqkV^!lFIqlR5JZD=yWtlWeCIh!m19S1
bZBeLt XS<jkpyS&mZK>Nu?#=1AAk*a&\N!!=DB!DHBX@VdXM<ummM%HK18/JAk>hT^%T\SySWbqV/K8%cW/:EH
989p1/ 4TDCtC4%#6I>BC&ZqKT*=@F/#nYpMiWhnjpHCCC1%TXWtcpEYpP5l5*pHD#X#4qAt+*?hy+ic5iw!p16
NPp&Dm c@PWl1LNcD:l91baVA@wmFk^%?PG@+=ykLq/q89IuZTmN?9NT$4%ccPLY&<#+>FiJ1*>Qnm+^t9EJ9&1
TbHPJC S6I5@m@T/Xe%4C^\SK94Z#DVH\Hh8:H9q5*QtT5QtHjJ?9&db%>tD=mWcS>/a46*t/j?X>u<tHM#hCFV
je9pVW jPq*t?i?Xa:/ee&?ee4aKA*YBe/kLi<>=tQi!8Dmu#LQlVYmVClt::wmI>k$tTpiiL>=A%Ikqe/1e=+W
1F5>*d PYP5#aT=QHAL=1Dc5B%:q@<bN1E68@JwE?yhZmX$n485/44WjiFMi\T^*eLyl81BD=kjQe<etljklZem
+kKVFh AA&EpjYlSy4V\InAtR$<HX%iy15XQaCRe$w=h5BKyKta%EcEd?1^mD:mjn^uHHu!y8yyjwLBcYPiS$ia
=ee$t: nLL9@5wQwVd68Qb<\Q#5iiu+9X%8&WMNjhIXE+4wQah6$DRM%8EiBGNi18kd6YFTcRZ9\Ap1^5PRJMI<
$qijnA dEw88R15VYyWwwHJ1kMjDllNVHL1<>YKAYXh>hkHH1P/n$hu$%@=Cm>M%<WCPl^%pt$Zp+QEK$Rk589P
&EWn5/ V&QwbETRlXQ<enL#$^\5ccbh!6iRLuWmb5Q1yJDV!/lmY>N&%IaJ$p\>#/PuZRaVFD#6WymaEu496Yym
QKbnu\ KtBmiuFYPIuE8NDK@VkI^kyqL9D9e8%c&<K1+ep!IRJX/eM:APp9WlHbn\:tZRq%<>JjL6w&CCE\#$G\
1@#DwX QKW\Z8j#\$YmpStKZ^$<ZR8kCYlCP511:GCcXiC:Vmd#R9=MRlF%A9n4^d:#8y5i*E5V$&#lJ<HpIIen
%<R&De QJ>&/\X$%km%m^?*eFe+1NphGu4$Y@QGV^1c=DAcEM5J^#MI^DLulXQIG6I^\pqkpeDRW8M=nBiqh>^t
XP&:<L iJXK+%L=@A9dEX%qdJG6IbutT8+ten%MVIGkPjyyXMmKX$HZC+dK=/%VESKGPKY8uJEVIX*H#F/pALBG
/8J<$: wYFy<ld!/uS%AMC\=5*Qw=&wmTH^hhcJ/>VpMkDcB:+w?@18kc+jM16DT6SIJB&!N+lRG?eB#*!$//H5
?1Y4Vk pH:KhQI%uYRmkEZA$*G+YC$#k^B*G!ZW=I5<n/+lNh4/:C%aew9yRc9?T*5nRqYAK$bbpqLAp#hbFijR
:*a%K+ \>@$@GH4p!V!t$41St$$pISXy!!6?F*NPyqPq#=TDa=a6GGpnJ1mBw&lkDkP@4&WidJFdw9>\%\6X?kW
j8J?DZ !$p*AJa\+Lb$yk<Nb6mGB#MjJy9D:nZHW^kEF=JP#VCMdHBBI6d</qe!AK8SJ9D+G6JX*jhlhLCu#Aj>
F1V&Ru SlpZIh&M*MWd55E:!dNTwkyMl*pJ/!S<&4w$#<I?@jM=\+:1dDXn\K8lSVKLP%!>%qn1*PpaXY%%y:GS
VdZw/c /MlZmu!cZ8Yq@55N5A1waI/DuT!PHAuDu9mN4?TJ=&8SY+NyV!AKW5Qk1ABw%e8/ZGMjmtASiiqC=n1$
a#>NE+ Wnl4t%R%&FBd?mHCPq=acXCIhDFG5nGtCyE$n^pdI+EBDQ5ZcX:4yaQ@+k&SJR?STqaYN4BEa6$#?WyX
p9NcdZ /48mh?ZLkm^>JwF6CMNMBt=J!8&B**YPMl1jGhaMcwIlw^mm!S^tQ>kY$J6F*Kh:y#Q:9d^tJ5\eZ1C$
bltCPl FY:nK&/*5wp$QLy:&6V<*A%\yHiLA^GKRYp=INd1$M<kMn6HJw4IRPhHMk$8b:DJwV*Vw>ZmCCRKM5C:
N\T@#6 &ZT/Ekp?R<9CEEI9Q#9cEmpp\nQJPTn=MR/4R&wIZ+/cTTcIR1Y&&qt=::A8^/=Zj<D<m&i^T\\IyNCa
L9k<l1 KX6=yZ4MtW1FdAnQB$!W\Lk6/NH84mHBT^?H#I++GSmAMcSPtBjSSXb#/DqHJAna41PQc=VGpMlBV6IJ
qZhP$b hmThbC9yNK&Lb9?A8ZFAX:VGPHKAc*S\Ji/m$E\qPaPTGXHPmGdybT/PGV+&#5HyG8#?G9My?+@q1b@D
lWFdqD RN@yX6VdG81pX6ZdWpT>:\lk=ypCG:y+eRC6juyS&kI8T?CA1Eeb?^JVShD8WDHN*j8e4>IW5Ymn*Rjm
AqNabq +p&SWy>B4FPb@cA*qJkF@V*tNii1pk#AuRn*a=SNQjJh8NB^SycQJyW@W5u@hI<ja&J@*##:y9TQE@8n
4m^@&8 =1aI=BCNtGGEWnLmQZ:jBQCXkk\9l>T@B<H=N<&%u=b#@^*q:b&9\Y?1=%Sjy!:d%a?an*&QFD8!IJZX
!RpY/R :&8$jCiXjyP^@#WDaPS8d*ReD/Z=k9hR+D/G/WJ6A9b>P/L=mdM!XKipP\Jql&Z+8i1TV<mqJQZ:G>8j
>b=5IF K9QA?<%hw?BNE=ZGuSe%w%Kp8yna4#h#QNF?qVMTcDM<4XG@wcw6+kLJ1Sl9n8YYpW/ZPjNc?$=#1CSG
i\aqqG XAcnW=\kM%X999iD=1q18R4ceTa**Z!S#GGdqBy/N6u<<ikk%5Ga=tbQ$AiZ<#44\/hB#R8Ht@p!<w>c
e&hPPQ yVCKBaQQMlF&/\NIB$/Qc@?:8aji>kjkb5EQtIBe*KQ=b!WJnj<t=c<&%SA+t1qFl1JHCHZ16XHqh4MP
w#Nt*R E$??6InT*\<mhM:bmN\k/&<i4bH&Vj$^jXqAq%D<+nHdI6PAXnJP!T8@*<#pIAV&kaYi<aVqcZ\BeQ&u
idV:M* T>iNV5$*ab+Ky1uMH*TtTnFJ^pWl$ABi#daEB%GMYZ@B!D=E:><T=<l/%KXW%cXY<<q\?TyEcE>FHtbM
de*ZCK Pwl5+MuW5#p%%\Ndy#1y%S9\WKSt9$%F>AA#m=FJw#i^NX@Ghp%uIc&XZPGuK*?=&nwWM!cewem4=Y!/
GiBKbT Ym/XImCT!T=VZ+#>b+adk1^8GK/deeD$=6+&ciNp9qn=Wbc8Tb#m^aq1M6AQ/*W5<*cqCytn\!P$>4CS
RX%<BZ >dXp>NZ%Itt>aDydbZEY^yl^i9Q94jqm8p#M8T#K8W$Y=NKG^VK^>DBB&EhJ4qk581%ND#6btBHL4YJM
jh8K/h e+6<Amj@w&p8k?HtN9Zhm%P=yT#IbbIXTQGHjLuLmXy>EEKjCGlaLPDPIA9N\dw1P*kTGMb^Ii#1i8lZ
!&^YN> XR1%c%GI8G4?Dc1eS418%jnV&E?4XwTFwyYiAaZV&NjXdY6w&nGP\!SHGYj!9SpiIqMiLbXK^J4ZlyHZ
M%YIE@ !SwVq^B9/SnnJ=/c46XSaM&\c<*uY15*N^#q&6BQtbp#TS8V#JQMR@6d<?PqVDbMYQS^CDSRZnT/dFp+
TXt5T6 iFP@^TCI%nk/A>XA#!aIW#y^BCVZwSiMl^miDBm#L\^#D<JnTbEP1?S!Qn@$cbTVaiXZ$WyGNLSn#/9N
M$6haT ?L4pVR1YCRQ^bhY9p?qKWAi<RM!QYjQyi@WC6y?+kM4TiWSBtCCNM9#I1GqNNjyC/+AXc/+#JpY8+CN5
mVaHtZ *b1:\n#PkY#Yhy%&YDJn#%9n8c+Q=ZJSFWelLN4TW/bdRmCnwJ*Nu*STKRXml!wBT?au6juQGK9AAPbu
yQDlu9 ZTFCJ<a9J9qayZKbDu!bk4IbM?:B$VNaCn1H>FA49h#Yu!k=#PZkEE+?%:P$dFeb554LLAN?i<\cMKEP
WnY&&L :Tw5M=EFdEul\uw!SnecDwplJyNSjlDI?ELRlVZ@VPiGpXkI:%Su5<uB>Imi&\^jpkbmVE?X#8hHW%Ln
9^l1TW NSklm>X<FeDA8kj\hVXbBZ=AN/d4yalC*u\TYtnwN@S=SllnK^A?t$M<:<c<YPCj9:=Ppk\=wPI8/KV:
HY?=c@ ja?Fpl%Cn+6&6nSL?XHD!XJ1uYc<tJFYTVVWup^#EJmAw5q==kDmh4E/pDE5tHb/TFP&6P</YWSq6W/Z
5pTZJK ch$+c1SK%yNCBt#V!Ryw=Bmpjt=5*M$S@&*?wVW9I9kIq8/lnPMeBDpjP9b$Ec!PnpB5%68Z8nWan%5t
DDq5B8 p<tW\RG*tAna$IMTWMqDaHtcH5\RNI@hB+!hLNbME@>B/d%NLVQI$eGenuZt:%t+:wKRbVFY$w=\iyhM
TnHQD/ 8dE5t=HuFk8*ww8WXjZqiY1Y::uqcimY1C\4euhwnKYGtVmuly&hacyw6A?R+cky5SPH@qW4#:4nKRBF
B+wkmb Z\YH:T6M&+Jk=qLpPSG+>!e*tWwPD1eLt9LXpG?Xh1bkdDLtl9iS<&*<*bk@c#Xi9<1=ul?Vh?\!X$Vp
$%C#mk R4=Jn+A#mRqc:XKVhCJHQJ^D/EPmP69KQLjTJMi&Sqn#H?^Jw^5wiL@Z?AXu8X?lGImi<h%tYpC\@GZ1
wtZi4q eQ?88R!J<??Mt=ii:whLN*4w^L:Lbjuy6%8/54\c+ePbw?Z5uF8TE5SpIki@T&:+d6AiIj!AtTdIl%T:
9i$WBR BK^M!*w@5/uStRk5ZBY@*mT!pCyw#WYpGKml/Dau%WVE>W51RLW+9iACkK!uNNqcYkP$MMbCMP&QNZ?d
BQ>qF6 *HdGYRj61Tch8EyNc1leKnlNJn5bADYW!>J9wp=bN^GljA4Fy*RilG$$T4wE9=%M&ZMaK&@Lw4B^T\y:
iwqc&% T*y@#*GDN5nhdZ:pXWCP@t1=C19SPn%PqqkNk<Pb4&+K$4tC%X#%GVL&\RVpYAb/y</?D55Maw8l$:Rj
my5yq1 NQhkwR\u++!DXYX^EDwZ<ljG@mF5@dIK6GplR#%n\ZS?WYdL\&YlcceLc@:q1#m9m6TuXKjtdAqm:HSp
:/Wy#/ nhLaTKZGb4BJ!AK>abNKHW=G4jh%LQD#&Z\?udeN\?SV<+!1eB^XuKmD4AnJ8PBMHCjtlbd/wSIKA=GD
w6e4VE TIEmMk\+Gp6!Mkp\L6Ie$jdTTn@*KXTKqHR@8JZkEq1H4V5/Gn>dltXVP$4Q5nIpSN*199G*ZASiuQjS
G9<Z:c iVtHZYS6upPi%ilMmn!nqZTb!&T$9bAKP@kRR:GnBWNMn@RaC=k@%&B!&NCRAa?kZ:!ZbFVYpXGh<S%c
Q16d*e =^lbR%h4NHtM!icBw*8n@j5iK4+Hy@kYYV+w&4SL8*LR9PiY*GLQ4ZhIq9nk=iBwWGPp8^DyCQI9hBpk
wi8bVW *Mk/F:BZMuLbIQiJ=!@cwaqT4:G1pq%RTDK@>ALKSYD#+ZM=Hp#%mpHQ$whZ*#@tIEen8E\9\b:KY?4e
9RPHWw Z^hhu$$SqkG>wWLLYkFA5\%wlh?!H!RSuZ?KiTl4jp+Bl@:+a=!wKtBWF%8BX#MKQT<hDeMNa##pe4>+
-AElCy 0005cd354f7001202b3 Page 302 of binaries1.zip
C<S&@\ L$beHC+#b=LjIeipi1%4M@1VaQnXX9tF=Nqi8KjuXlEyy#JKqd&Hp%AXi@4$Y$hcnd+J%LAEW&um$VSb
HGH<AJ %+\hBiiLE:KpN>DuFy/nNk:DN5?X!/iGT#QZDjQ#nqMDEW*k9>yTbSIw#A<Pn1ndI%mhHCSp=bFu*%N8
mupZyl !<6E$$qThB&jZeddhPI:=5iu1K&T=t4\tDV6c4a/k9N4Z@$yCKCie*%IJ=QW!*JdIC=bRHcahXE&u?a&
Ze!S%Z V8ZcpVT:!JjKI?WCt9==:>RZy?CdFP\6M#ICntCV$4S/IE>Baqldt8j91dG^TNhbtpM=B1w6c=Ce&FaF
jIMupA HF#HTL@Lhitp+E?uXLSeq5W<EbG/nK5!C<9Ku+y$H5e!#aSyX8SJ%yl%JXNK*IVV4nEciKC&6j>DE!%h
VnVY!R B$$a/SS4m6MdEkiik%l\D\YRdcAup=^&iaeHQDWZG8eT&<qTiL!Xh#<hau$w+A#?HnXI8+4WE>FWS4VM
4I+mH\ RQKCknhF\5^1K8CLby$EiW&6RHCa5j@<QWPd*PZTM$1B66HXeM*u&cp\ILMeFXaN#LXWQcy5mcj%MaZc
DMISCj X?JJXpWbID/1w5w*Mq/iy<!alllX!*YBQG!bmbH1XN$lpyk<dN>l=dZkH>iuF&tT??<mqk*=DCS:=Q4B
/>VDGu IKmp#Vk*ucl?CPLMi<$4ReERF+G?p4S5Gyw1#Iw$=N\jIh5i&EWlL!QqYF/pcWtT=pEh4L<Vk1<ZL4ap
*l4&*a b:k*lDKS?KpC^PI%FFtiS%!n44myBX1TX>y%WXtZLedwhFZ/S:Mnpi=4btN19K!Npi+NWtX\PJe>Y4e%
>hXR+u /Xjp^e?B+iTe4j?:1@Y%!L4P>GH#qb<6=wSy%$tRK@mFQnajyJSltHXZ*8FiF^6TiRkhk%+AehdLXdAK
Abi=9i G$e%!n&MEwJB4bMDZp@Q*qInF*<HZHk$y<GwQ!W=ZCdLck1GbwBG$HtXuZI=j<CS^EyL*F5#R/:MEPpm
Mcj!^E FCpAlnnnyWEk\:H6wHpCp%6I<kSbA&J\ihm91p%u@=5=GJpEDd$k4uH=%IXWbGp!l^^N\GItAnBc9K@h
S^GL:d jIZSBQ@AH4G1ZKH:aeyitp+Qym5RHu@tj\L81<uYYVFSYEt=6mVQ/n6wPwjX@HS4XGi&ut41NP#4EqyE
$6whiA <>JjyJ#MpawFh#$/Ij\c!ShQTeJI@ZXDm1Ku@AKFXtyp+R4<5!yn>?bX/u@</MmN%HQw=IkkycV/LlYV
Ehk/Pe 8Se^u!pQd/mHSdu+@<IX9tXDe\:<6!@V>t\aS*5<91L!DY6EMYkKLSk^h<?wueT:e@V^dT>=#nB1RitL
<I$byD j@t%K1PFI\</lPZF4B%n=<1FIGVX#VZ=\h\nV%tqSAwFcW=IyF+5nyJ%R?Hqy55Y?nw:ZlnDD%KWwm>/
J:VZQy kFm>MDW@b>hT\>:&HQe\+#u8aclQkX\%*9<h4?Z!QS49MbGZ@1G114BW49\8WK<dpa!!q4^>WA8CZC<K
lV<n:4 NW\R*EDLw+TC8dy!pDc>X/a!JYmTF+yB+hBX6AjL!q$GItVn*qW61/ijLyEXDq!F8HImW\MVjiLS*DuX
4Vk^R: >y#^$hIqTN9Hy$qIA@1t<%VkQE<BCGTCwWJG5$wX<cB%nA5qG=K^haWE:FC&><MqNYwC=wm<ADwKAM^#
$5hyiF 6a5QX4>4q*n&hJlYHll#/KlhSuE@#B1!#hcRWGNTLWGNhDJeyK?+DPQTR&CcQqHp>eNe!i#\SJkAIiBV
TbaaFN <WRa>a:Qhl^NNCKT5Ettjp*p&nC?PK1W1SLKQ=Atnah6ib%a!D#aCd?E\C*MW5ah:*E<cc\!@peTeh!q
V*MW5= p/NRAHnKTNup>t\Q$>6pZSIY9b*XWSJtGVTRMpy^ZJ?iF<\FItWYLnI?+yEd$DAGp$uH6lkyt\bZ<Bja
kbwe:1 a%*lMaj6FuSQDejk!YRiLk>VP>I<LiAj8Mj5XPZL/Y\SJQ=5ib?HZRi#:c:h+*nZ%ZSFcmeYb6PqQ^aY
6D6VE> </Nq+I>:\ACF\y8?a1SyamQ6eVclEP@6Yi#5&V65Y/D+ql^FR\PFapPmy/5X%D@:*E:%dd>d@V:q:%6t
8wBl@> J/VTiN!99ZupStX&GJwiy%A@1eMA^!LR/NCt+!micIy/DK8VK>^Z*HEZ9TyHYmhqJS$L>5=:H4t&\>HW
hDD*Gy X/@eJY!1dm&ph>!#9eANpJ#JuAq6lXYTy%Iyw^@D/@RpCn98*<d5pD\>VtFmH9:<QbctD:5AYdbQ9*$l
$I:jHa k8yk>&miH5Q5>CRKn*Hh8Y%l*^ukpS9:LE$jdkFeP/tZ#/j$mD=D^e^:MVI:qd5$V@j6qey>B1kQ+bW\
&*Qj^4 !i*SNH&+Bc#8$%uT6yq##6:!QEtH&qI::jI<*Yi4Y%tj#kyQ:yZ&C\>@:n=QE\9JHR6!YLBjcQaP/?$p
M1AGua :+Q9tKh%BVWk#BXYk@L6ddmhu4D\wd#SR^iW1PtKEnX>TN>9<L9kuwYX8l%1pBcW<JRyqiVy5d^Pn%?I
uLbd?T ydC9QH@5+?@68d\hSD5pVjH\yA44^#q5KBclnj&$KeMP=5tXD\<65D#hl6mJlj9&T4eW>tMNhttihk6&
c9kENT n&Q*pS6:LE$jhkF/t6RLD\=A^\\Z8jp$FjmFeQa6@hIW>H=K<#TdVJ>>X648&l:u+k/8$1u1CR5ZYZn#
FeJl$9 u>8lcc41J%Ww:%nR\$1\NC%KS:XRHFCY1l$Np\ju/<j:it/Z&atp88::yei\:d49=&ZH%#pjywq=*C@1
$dcp6t aL:#\<TeRIKYbw=#pjQS#PAyP95Ht6nhj*Lt%$&e#>KEWRBuY$a!/\<dWncN&*QtdP>%1C\Zp<PW%P/6
lYI5Z4 @HL&d$Q?*J8CB+@=4#hHQ\y8iuk!AA%<u#u+Eh1N=Q5@Mh+QAjJ?n@uam8SQb>B#BKwQ*\JH@+nj*99H
#nm\=E Q?HQX%8<Tl/QM&l/C=mFX8FhV\SQn@XA=EwScQ59NF#>6WCmp=pkWRTNEVA8\91MqTN&/JYAeVpC^1dJ
S@8Mk* iM+Y9TaPebaE1=>&P:D1TKl4//=V$=C9\JP8Q#nM*R+BJl%6kmYhwH=?T?jdt>hcG@qbEeDN4XR#pABS
1Xy6M+ Nh6Ahic:TGS!ZTjbRmuj+itHe$wF1?8FZ+R4Vbl\whbAa@N1EIdn+kI9K!1VT@>I+CY+#C4AT:ua8kFd
55L=G^ qeBL9\Y<qNN=&E\Qk!ZuHNKeIKbqaGDL#$#5#iE/5^\*R>QAT*e#jF1n5WXFY%IDlFY=c^5%BqqcaW8Q
e^bt4I *?8!HyyTE?bRke6RClF6L=IHC$QKC9d$CpaER/>hb5ZyeAn&XmP4DnkGl>*wA+<H^XqLX1#tFQ^at5XK
H5eWip XlhNp9L&q?*^@ILPSXdtZhdhk&XPq%HV^Pte$eYd?mPcKn&e4CJLSu<Gbc$!h%TbH5u<c=TGVw$c9Zph
Ch#Ppk h^^PqwZI#R&=4\yV!N?<bCG&Eat\WPk<pF/FY6lTbKGR&=H:Cl8@Y!8F5cZXWQP4QQ\Xi$T@6?Qeybia
j4ZLyR <q$XVV+YXm9be\R&ZlV&D^6=iyqLkLbh/DS+YJ*NbnLNPCc5ZBBtYut?FI1!JT*Y!JG%bIF:ZAFMYDnX
81S=SR b>Cu:F1JQKVWk5:I8ALh%MMZHRZ\X#N?>5:M8#5F<&V*NLdIBA&YERJF8KejZyEjyhJ6>pm^1w\F5%6\
M%p?=H i<+P/+jub&AMcillW5M5tYXlywRwHuVecweW&S>MuTJ%pP:*#6T:H$wB#iIniABe<!:@q=iA#hpSbAFi
&%RQ*q *qe%i*Sb#W=lcM/PK=5hlm\Ek<j?+TybHGkEP4lPl=cY+Ii@^mF1k/lmi&j!ZSdMHR9&6kYR:!jl$RJw
H@qTHF >QP#FKu6yR?E6*Bq:SS1F8^8ad8HVFjKqcZ?=Hp@#A9pHYE<XS9IXCh#/mM*+t/=<5QM5dLipZ#*R!qw
:h<&Ci WkMZ=W<d6MmjFSPtuLFN*aj$VV8pVYi:#kw8EtTQNk6cB^KyMWPQq/c=Q!P6%TM*bB/aL\JyJ\cN^Hhm
NBj:pA *@%RClBm<^uD6&6L$6l5qeQ:eJh=/4:Hi+5>w1$hBm%q>N6!14HjNT+>\CM*B1bFHJRMd1VjZi@S:$yu
Gi5K4N 1ji+iM@&JGq%S1cqi?46aVVE6eYT6p^EN5X$&Eip&6p4*d9dT6q6tt^d&GHV/5$FyXidc:\$nw5dGVyT
@TJG#Q da>wqBF$5!D>Xb99:Rl+Q=RCI/5HSVbXuIG+V9w>hD1PYR6Qw1%$^4PqEjR8ttX9#!$JN8M#ynX65wHB
G!9#*X :HkqeL/N9L?*wiBhK\Z9l%JALkyayhhFcW*VLqcbX&HP+Z%Gqm*Z<dVW:Sc!Y\4:ZkZRma!5c+/lYC*!
nY@Y\< :@mLi<T@8^!<nWcRKAh95$jI8%<\h>wD5^Nwt!\htEGVMinBjjMy&TIdGdiaRYY*pN?&5PNykH+uLaLw
4VTne& VeVHTaj&<<cR&P96j*GQ>@jPFL\k\9nnFqRT/859ILuI:NAQ=+^nRlVNqu^4n+u4Vu68ai>1mqW@pbtA
$EXA*T BwCluW*>aD1BLdb/!=j8Ej@itaqZC!=u*t*&BI@h$>LF:VX&ZhSXy/Sdh#:#<Rw:DF+iH>iqhtQajc#b
BL4@FG qQ+^<CMIkEH??%kT*\&mW6#*M/16&*$4tRdQQIpnh:<lu\9<E:CA$P&#N><\&dICu#1iwbM^=!GM4h%a
+hTTDX eJ6LDIi&ya8N9hNl*B!VyA5iCC/+=NT<NB&ykh6d@mY*?i&*dp5j@J4V4d>m8@&n#kdKRh!MKTA:=$Hj
ZSti$b *Z4C/Fn@q#j$nY^eNywLeG:5NNbI9kKAXk!%/i9jJ:XK+*LQ$G*$iI\58Lq#pX9*>ib@kYPmTKeNE5k&
/J\!@X #AkPy%TpZVuR%1=IC<#WJ+*/d6y*niiwV/TeyjE^6XZT+DF?=<=HZh6G?Sn#d/?T/am=+$:NS<Bew&tp
5te6%= CDlp/cnyh1TJ!&WYL&ytE/4/\1i@w%HD@WJquA@\Cec4je#P%VSBXi4C1ujDjp^%h5d##@\6>a^I#>kQ
>:>R>Z FH4LjX8jai6<tLi8pdlaMJuA^R>VSb\eL5MkRCknbLHFKyku<PFmZp9RPcqj%5a=6dcpFHnh4be@<:!p
WY<KC> Y+NMQSyn!wClZAPG>6&a<Wn6hH5PM1QMaY5%DAlb8CCnZ@<TGT/!utRycTk\A^cPGyQ/@FCRFD%nBL@p
ZV4DmZ b5kYFFtSDV1K&w^tW:AQiMqKX!=Ceu4Y:5S9de#>>JQQ\N*uQC:lyXp^!h:R?t&hpi8hYY/m8M*Ytn&$
9qFn@b dF^<Kb+d4I:XtJk9C1I1w+<%+w?!#G6#656XVD8Ynl8>iSpKhW^mMPMI!G4aWdRAp@DkJqVA?aEP6<?F
R@^*lk F%5Y1\uA<SRa:cqKp5*k5Jhn!T^L//+5$&6yNA&ylyBlDLtk6EcVqFyc\k@wkc$=E1Gqy#5W&dI%!!#M
S\9%1M $qmTH:=Bp4GnA&jdqMJmhnDVBI%Xt<miueJ5e1m/t1wIX+e8$EpK!ZJ?yBe\kyEQRm?jH8cpD\PL>yK5
ELn$>m MKyXPHDpB>l#^MLu\y$edJc!P858/R=nRbuJwpwN@GDuC!NuD6e>yc*HRlKXtM6FkCdHYK\ea+=\LNpY
99jV9: 8myPh9dE!RIPTiPi^hqlu5?CKcL%PnpMa&V^R!V\54DFAuFHY%/!qcM9p>WeJGXQhYSt8:9GRt>jBtI!
w^^\CB S$yMq4KneTThWbd6Fa^>CF\kt?GK5w#h+Z9>8N>9/Hi1n\4+N<M/\GBk\ZABGMy&TetibMH5pyLb^!>+
P@H%m* a?tSG*5pa^>&RYw1T^aAIbAIqcZMpKX5n=l5y*BjMh^yX:HLVKdn/ppW*9GXCELeWw*6<a+>:y+:HCdj
ES:/i* F@=5My&Dle!lpa*>YluL8?^pV/J\EK!H&=mup%65%a@b<+knHL6K\4H/nwZ16wZ84HCDldyal5MkVXPZ
ZN1l$L c<H^#pianGXdp4I%iDq&Ge68Z?Blj\\4wZhtu6=nH@8\C:ukebNy&C5JGAVA%/R9&&M5&!ueb@h&:S@*
-At4#B 00095b20453001202b3 Page 303 of binaries1.zip
bAe>G< SAdC&>y!9*/Qm5^<8IWe&C8e?Mk9d\beY\SE#+e#9>KZZTX>&SMYQyGFY&&F6!@5G\=q:1=&YMpiy$D!
qaMJqm 59q8+ZcHXcp5dGt&tC@t\XyY^t^&8Jkjl11&Q&M!&!p<i/>$T?FD5SY?@eaiR>tHZYmRnE#i5tk>PnWM
81w^># VRb1DyWIlyHXdLj\VH9HZjd&6pHN!uq:t?FQZNG$MTR4/*iI!@/+*%>ICRbBC=DRcjb5&9uCI#iH5y=S
>eE#X? \N1qP68a=jc:&V&wj/#B<j5%%V8b!=R?tD^qy:8@*9:4>6mN8X6@QR96V\>XN8#Q/M=P^/@&Dq<*#nCy
EZhwHu @#4aNF?%&ace*i=QT#jmK?TJ1epG*I<:FBP?^X#=Ibwh9>eqp?tXljp@:H#:R1ViFMuy5in9DBMie&96
ly/1uX :><iG:KAwADnn68a9\dmBDcd9dtDEZh^+Zttk#ud=$Dk8@hRJlQG:pBEQY&n4ND&DDn?:>i\\BeSHMGb
bc!wLQ e^^R5ZSRWhp+YtLKt:8+d?i\jke1HnMtc\iIn9qd1*1ZEiKa?#bpt*=$D$Q?@QME6C*AVDYt8#:Dm49w
m5y:=? :tY:/HIZD?/h5Rj%NJj6G1R&CqK4W@QJh\CJ6<BK5*Paa:ct%kWRdu9WR=?L4M@=\WTD=CBqH!$eaN^B
X6S*>w kib^WCBByn8u4/:6eEn$b/\jq=ZkTEdIb>N$9L&5*eG8BI4:+DL!cV\?P$!ttT%ZN8KSS<+KLH/@>nWk
+lNXmG 9FqE?W\bTi5&N+&ASmBIR%*ddVFkA%=Mw^nRNkw$Tj/$C\lhWFcLJB1u=9P$F!9eLDZTC^i8T+hkiYEa
@%h@CL uk5tXEFGJAMKm!nDeV\M>!>n1R^Tc15@R&Xn<q^+<4T@QpZ#imXmCyG+y^<8G?MTYu$5@bTb*$B%dTa8
F6AqIY S\b4aE\CQ<%RDnRI^t@#/h1uti=d*SQDcawwc?XAI#ZKqkc9Qm5k+#dnAnX>5jS@JeMDcP!HC%Cj>MNF
E$SMNV bPJ5?8HRK6>*YTt=>quGywhjWyHBd41aH/Y&Ych?G/eV#RyQlw!SG^4lwK6?i1<4IJJ414kQ>8#X>GC!
\Le5Yi WKa<*eMCK4/PC/?99ldJiMC*edAMW/q5<4WnSlTY#:&ARSVKy51VuWJGJn&T+>ttJDpimEEm^I@lQ6^V
hH^6a$ MYhVZ4:6!#u#^!D\D/TbRut&yN!nlt=JDe*C&9FE:=FGn+Zqa\wI1@qcY:6VY^tkVdNQpleiAm?Pld$>
DNKLMn Yyml5EPTB+c4EEF^T6P*6?j6B$4@ZMIYFCE*aLAqlt=&mcGH&^WcX<l8j^lmw$:D?^AbyRjJdDtV?4!F
$F&HaC Li@JFS^duki&9KhW\ZSL%:i#b^ki8iHwu<ipJw+aP6pTR=epll=bwtuQNdjda*j&cAGMWGj^XuEID6Xp
8?KhK& HmHGd!i&<EYD*a5$9GPl6*i%TV+!=#tVJdu:iu56P69#6m@ja+F?LD?$eZ8iwKAZ/P1>1:u8SyNnikTD
httNa\ bqj9lS$?!WI>%Gj5iTM#5e5q8<P4J<&#T\P>yXbPdmYIll9w64C*=<+FVAbXEau5J4DTp\wpSWh^hl<R
=JyIW9 /h$*eq!QLdLL5Ze4+X/$bhLd+@Ld&@QInV%P/D8#SZ>IldQyYqcl%y<HicZEM#8$iu!qHbK>P^h&iQYk
QADII! YN6l>69dI<CLYeIeQ@SntcQHQZ5$$p>!D?YB!w5yDA*XelLKMyWlDN^^:tE!8&<\P!Yt+hwy:P%Swn%N
\Cj>&! cdNH>dhD\XjdZ@?!Qc:w+w+5$l>KacM$C/jthdaNb4QXa5cj>=n*dqM+9E%BLaM8N\ieG:dej:6::N5P
&bnM6p 6=#SJM4d5pt@cwhN&kp9b>VTV&LQAKGN\Pl%eF&4S<d5QT/?EaN1wd:nul%TQ8QaANht>Puc:9u*VBY/
$kwF6S Jbp?eX/tX:c@djc?i?Q*$#5eA4H?y4qKHqD?5EQW6*tm4*iL^DaT?FqnSqyAYCT9%:6:@tqQu<cK54Y/
pM1p6T 4G/&SNkuP=Va8^6N9XtSuI=ySQu4VYWPMd$cL%!I/6t*q:y9by@j#%EGYw%?P>6V&!><DI<J+%ChVjEP
AY6!GZ KQQtq6@9%JAT<H!FLu*&+?\B<>9$M:$y^&LLH$BnBuMt#JwHq@VJHnA@c!cVaVJ=:Z><:Z?e+QMVp#hM
@??Lu# =8iH/=Plq>Kjej@GQjk<e*J8et*:!@i>+R%:i!h:b%&Sa/@k!<XZ9u/tP?<&k<Wh*iieP@@<bMJ9F>:\
MZ!jGX Bt+9+pj=hkpq?Zebj&Z4@SI@p!8@>E8@?:8!9j4nQ@:Y6=dq=NyFjmaHX@mbZNjQbD4ub*J+F#?Vw/j#
h%C1T$ M=p>q=@J@MZ<VQ\9=GeT9Jcj!iLX@E!Yu<VQ=K=l?M:9qQ9jQR!jJ=@JW>:=#5up8:>:e5>DD&Y!hp&i
GdFuyV YlV9jPid*nS=&kjqI@8i@6M@@bM@?a@?$iRb>>/46Zd@@h\?/<EH8Z*&R\>^?=#JlEe<>>=:8Z*i@jh#
LJ=*ej ?@\HH?V&BR<>^P$Ll+HdF$$t9NJH*H596!??@*=8Q@LBB:q>!WMQej6S\<D6S$<t9PQH*H596!?>@*=8
JjLm^@ Q@dBB:q>&WMQej6^\<C6*INQ>9J::?Z&+??@u>6QiQBBdq@^$EQej8I\eQ6J>><@wDW@?eEH8j%VD#*E
P?#K5L :cjk=iTJZ+tuqu?j?9>l:<<DJMt8<qA<8:8/w*811!w#MuNG/+^&kTRR$mCJZVAyLFcQ&T!EH^cLJTSR
@&59Y& kAWaIRuWcm>+iR5+5DHm&ed5NkcDnSiY\AaDplECNMNtdBalCRqmn:k*J1K/KmN?=@9Pnc#Mut=yEQ:=
!ke\Gn u/ic/dy%M!Jn8ZHn*LN<=#8+GtqjmLNI?<u+64Tjk4&q9R?@yX*h!=@Jm#AP$u+1^pHc9+B^pQdFGAhy
X1y5de Q\*nIP&ua^!p@R!Mk:TjmZGR>4M\D6J?N5bB&4?IebD&jw!D6H<J+!D6=&AeyQ%enIP$u+h^pQd#MR:T
1P/PWj jkHGRh1@nHGR>mWaB&t@EPMk:W5^D6J?$d**<ku>Fa!H6Q<H^pQcL<b+TQ6Zl+H6!#A8MlbjkuGS>p5^
m\Gy6W L9L9!#A8$u+=^pZc9+b^pjdqGBhyPS4TjkZ8S6yZ+m1qjSZPL8%Z+8nTjlY?Ji&4$bM&iAX@Jq?NebH&
N^kw>W c#A8$9=%nIi$4<F+TQ8%GA>y9\:nIi*Za#!p@S5aD&t@AiMl:Y5^H6J?I<bB&6hlHKS>QebB&niIPMHM
qCXbq> ?!cMl:VjnHGR>w$aB&t9+d:pH6?E?=T@4?M/=N:@J8=H&4?FebB@j^9dyj$:GC>y9\Z*L?*j^ZlJ?@h\
lay8IZ *>L?jS^Q&u?A?=d&@<S>T@6@ab!p@d>^>hL?Q:k/cd<X+!V66?G*6Q<Ru$wd9yp@p&@HjW9:n*Dj$9=n
tZjF@B ZK&$*+H:q9cjaB:INZ\u:q@/d<d>T@6h8H>y@%@eqdV@FQe9:V@D@6L?e+!D6N?NebD&Z&A?TQ5>8D?=
dPEaVZ %?@FjJD?>?H?yQ@>GAhyj\DnIQ>?EQNAQ95lnIQ$@!Z8V>y@lZGV>we^H6L?c>!j6D?C<bD&S#Ei$9+d
dJcNRA QHZ=@w>lQKV@+:kLcj<6uwy<@8>\h8u@BM+m:d@Hy>L?B+!C6Q<Sh!H6j<JXT@8V8Cyyj\yup@cueVSy
>dRp>D j?dNHJFJ>Hd?VH+Y+!L6j<c+TQ6jMC:T@l#iE#u9#&NeyQ>jMT:T@kLGShyj9Feq$T>lQPRb9\ZnIi%d
w:m^Nl MR:!?Z@DPEn@q#EP$4+N+!D64&AeyPXdJ?&9al!p@VYMk:T@nuGR::<D+!D>B#AP$n/IebDQj\QnIQ*j
D\jGc# ^DlI?%5aB&q@G?Mk:i>kHKV>::l/cZ<ZX!u6@<BXTj5@eSSyj\@nIP*9+?/q@RQeqdS@mK8T>y$+1=#9
9iMATX n*AW/d<LY/X>N/=D:9p>&C:6H?NVch?LV&Z:?>CV>p@\Y>w@@aEjpEZpmbQ+bj!bJK@q#!V>F9=M58@k
=\PZIt #!V@Fj=Mmu@Hu$u=P@!bXL@Qu$u>d9=MVM!jmTm^?Jp$HZ<tD\*D!at55?&@pJ@9@@=J>!d?VI+HZe69
Qp?GH& <PqMJmi<15upFB@KZ&9$=F?Q*>IP?4PnM:B>:pQ16GcShMIi/6:^A=>RV=T6^+B4aR5$^><!H@?RK5B>
L:C@pL nYnH&5KXdJRYZjR/aMH+!%PCRH#>QNq^RhF<j/Xe$TA=Eb*SP!w1FHCIRPuWqAX=HRpCpT6yyLMpdXyq
lE?i^u ?a6y@SZ<ZZ>kLqbNFSdNX^/dR+VHP1J58#bM1::ym$<GyYeV?dFw/GYH+t^k$1t!pFtkXeiC=wmVbp!5
Xy/LJ8 S@nNw6/AT#GFyWS?b6EI<XYRWnc9Pna#?WwCl@DkLdypZk:Y/=Q:Ak>EbMFeDEI=jSk!%#SL$kLHLJal
eW=$a% eFK+PA?WYT&1BKJwHAAa*DGW<*YmIn=pLwEMS/\#8ctZ+Kbae:d\$!TYc\9uAjqjmmV$Y5<C5/9<*Jp*
nSy$Q! 5E+^L+\Z&=YE/1eiZJ%S5n>4edMtA<+IL5wMD$#8TW:*8tN#L&nAYF<8KmJQ:N9BFtYE54%ID5t6QIAW
/j^&#6 iCm^MXQjK\BWme1%8S58aba<dE1i!h4YD*K^J#J@5aldq@nmSapj^H=Lhtj$Wjbdd1N?>WQtjFt^9M=V
hGTZ+K Wc%5Nq?5Rq8XhbGpuyn!cSnMR>SQ!&IWa&A$=Tu%#nqqeyXiFZpw$tBDyt+ld\%+SRcM%8bT+<F:ciR&
CJeFKA q@BTi\4!wc*RSGEdF4%>hLJI\/RqnmY!TYGTw9EDpGHLHH>lZVhitwQ/wpkn8L+b&IGBJ4MJ>w$<kJcX
<VLu#Y :m5cL4Y6ibct=uDd4#:GLb9=ZKdj5dtuKdMYG$\d#PeFe=tL&A@B^BYueYa:5/k+IaHjB%:IK4Xqd+/5
pX@6=l 5q!:KaYmSVQ$wwMbRQPawYIEjc/#X<:dK8?nS!qn1\8GA^nFm:ikS$V6ymKV#VyQTlVhVMBP%8D%SVR\
EimE6V \&P!=tMjWmbGTIkLXSR^?1jnYQWkRqjuik4VLWeWwGSWT9b?:B>4YLCZe%:AcZ<LF=i!l8i#i?ZTPRjd
RnVH^Y hI?p9GD11ZF!pCey@/Q5Y<e5=9qu*j<9ZVTpK\GR55JW&GP>TnJ:1/DTwKMFH6I$nYPCZJM=$aWIbL@j
5KIcye JtaX*c>/tn#cApEnPY\JXJW<+>anqnnT\FJNa4Ii6+<E$:5bV&KBekB:ETb^*!?=j\EPiSc&MihJ9RKJ
%k:N== KXhy/t>e\8Mib^BF!dIF6*edJHHc&$udJ<@li#%pIt@AkiXn9^wV1IZRYCRBGKJLyI9JLiTwc6P5N!PE
d>WiMt w4*I519pJbqm?ndM%9Q<STDV<b8iJRJ15Auw5cPR91:CG/4Pc+DKK\B65^H19+wkc$Gjee@kIYNID8FF
NXN#IT R!$#1RuVwaE@Pm$GL/6qZEYPu?DZKiDHwb@KZI9/emamCc=uPCHC4wtTjLl?q\nDBtIK1I%RT^LaZA:c
yM#AFG t$8F*IXy!n/:!6KXALdJYh5??\^yIS:CV8=FZ6Wm!S8dlpPSIDbWKjitc\*wJbFZ%MXJkPS:Gd:AW!aT
<T^#n^ pd#DG%>y5uBwiAX!HdkCYblTmD^dy<BKNY%lC=T1>5ICyFm&<<MP?SA18pWeJ<6F!yy$Mi4/!Q6=8DIA
R<#HVX 886:cpGAQ4BA/^RM!EM*#XD9WKT/6h><9=!?1XNpQIq$ee#%nqq*EIpHc9B$EVDQhPBTpdaehha:#YW/
B?IMMH lKqeRRG\h>tKSPm%8BiZ$48B>yhSWIE5y#Qbp5=l!NLB%G><=hAtVSZIYiRyRy4Klq!pB?J!eunb^$Q%
i554+N Jjpm*L#Tq:qmRSHPlSVCL58Gl4J4KJGkMeyCnI&88Ec8Ytdq/ZDaGGbdIDRIb&h94q&$XT1Lat?uSV!j
qde+Wb I!1SLkQjq/eb>5Fu+uyqqm\TMypHIm4JmBPH4C4I^WA&B<!&K\LeZn&PPTStNmnwqZ!>y>Y5X6RwHEPD
-AbLEA 00081d010a5001202b3 Page 304 of binaries1.zip
DiIwlp N$9pb4@^RJtb4L:8%II5Z<5:tn11FWW4At<1E:cPKwaC?jcPCbH!jbEL<B^/e8$RQBkwiMGcFDNl#TA?
J1P/Ij /JM5lbJ^FehieqFF@KpK!:*^:M!Clw#nb>cwF*X:Q+9w=RXEKM&wuVZMTYahlH5iw1DXj:%4@$nJii9/
8qmttI :id?h6V<V4pS<l&Zh8J&>4VABc/ZjMEwi:ju!6?6>bc9nL6aYdn?X^@94?<b4c%Mtne=X1Wq@TyZKW$$
Jut5lk B\BK#IpM\qGqEGjCICB1hRi\eX&yN=>1FdY:/8$>NXVN@>>+%TXZkAqtpG6CGYQ1AcblaTQdN$?q4GN!
8p&M/* 5^&VuDGXYNIMlT561&m5G^*!hZNk^$<6CtPlGPJ\6mjPW:MI9c*j6ITj8M9JDP6DN!n^ywb4?@LM>?iy
QXm1/W <YI@kJDG^=nlJpYL+k#+I/6FPPVF9MQZbW@IcBFCjlCX!d\6=wpeDt>XZRPbC\yy#\@1EtjCi!h4!QX4
IIdW4@ !E:#SKtWbYWFddIJp!wKCtSlXwQwq#cWw<Rb%F%9pG&NJ=Ii>JSyMA^BLJI<5TZRwcI!b8AXp&EypBAq
E@<C5w \4nRVFjY\Cy>*=cL\IA%W+SPKj1:LDyle@&c1DF6Etci4J^yTkE6+p@?KAFwAV&n1H>MNQY!ZBawpW6y
b<EApD XIbF=aH=NC?kB#WRmFlBYlKQG>pFCc=6TkGJHVGJ$1V\Elt#wpN1Nd+QHEq$@b1eQQFDYh&<5MICl6#?
?HbWnq ?cwaSE$mAE!WJy#XA#55TPTGHDZHG?1qIH+D#MH*#/+AKAEwb$$X#^lGp4QAIwm!NA8#4K4CNk8L5PR?
lZMmKA 56lh9!b>Ye6D4\pZkV?ZJdXN#TDTQJI^AH#A!6?DJ&6!piai!DjqBp5^Nw1858pTRjFWFka<la4GlS^b
w\bHl# 4/BIM^qpnIEu*<t>5A&/Iw6pIeuVyMWXaA!</^@6JYtGGTanP$AbqY@mJ9ItR!G#$JP@l\bXCcI$=:1W
=MZ$^J !#*%=5Y5=ibqiAw!1e+Yp5LQ8S:LYc$ZqEnJn#Ck<4<^wwVC<GyFC?d*$>Sij%%VICt@5Np1dcK=H=ZB
knHS+? IwmyLwk%=!QFjMGyZ\dLPJkHyWqZRe/mJ$tR?Jt6@EXi4BK<C%^LKqu^RYBhBdNMhKSm@F+&C&R&Lk6Q
!In:?t HuHyB/I9>eH=yG!?+XI6<!&*FNWW8uhyYZTS<b:SkI@XRnY>pp$C1>iILcK/%6yMc=h&MXRiM<=1BeEy
H/c8Ct $VtSI9LFA^bWbcaN5DVjiIZLmtNa9K#e>6^>9:KNpuMcbAEyDWdQ19RHhiWTH6!HKA//S$XTbFl>Xl@W
yN=YLm 4T#??Lhq:RG5e8a9Z&TBCWjkjpE#uhRN$G8*wVjk#DQ\EAF%J/4a4*WjLcPJI%^Wa?X?lKwiEtt9yQAu
#*!ChI >8tnjQ>A@<CmRpjCR/+?Ne&c@>ZHi\Wwpqu8S+iGFVnBKcKS68wbyKLHR8H?uT$c&l4Z*!\=Tp\9c#Fk
Mudc4= e<MNLMWQthhPVN>eXjmRCu9yj!KZFyba^^1kT\tC!i+jF\e8J&^SuaVdnYZ1!:wlWlZ+PJkR4YGbA@aW
AQdt@j ?hR<bN:\GK\SwuLdWed4pkLh1i9>q:cNKwQI*lDVjw/5DiS+?AWwMi6pZyV^QI4<yMbcEjq^bN6aqC?p
L>=V>+ y<kd/1FPEa%n8b+mIIPq1J<AS^?dN\TD4BJSuDcnhJjXwjT\ttTmb5=VCJR$FHqVyTK98p#ibbE1cXK%
ZT=:AA TTVtSIi1#BGWYXqhdBYIbbCtImYkdkKLlqTGqKB5$h%q\in4T$*8?!ZM:Di<X1=LFL5#8T:jEMtChR@q
<&XM%R qn\4R1e6SHKJqn?IuLba8iwEJw5IH1<q^*A1+kaMI!*Mu1KMpH5??p*eRtJGN+8wwG$tF<X#S$Hc!9YP
T5cEA/ El%GBlKwpYWKMpm^9WI\>at%I&bTmBV>HAI$#>18C$PI?Dkl^C8KA+c%dciFFy*#\?L:h8N+EhFc\Z/T
d+69yC e*>Tp+5t+AEDY1KAqTh4STk!GwDeCw#=<E6AN^+6LXquY*^k$1BwRYn=9BBXWqqQmT1>VYZJ>%nMmnWJ
!RC4VV c//?t*Qnthkpc@m<<+!/VhWy=%4VmlWYwHSK!4GHp+dFRDI<C%!L#K4T%pP\4I6bCEaQNTjej1I6!F1j
lE$BRa X5:@B4baZqVNRbZuDbljYb4n/y6ja>Lq9IWbHAY^LP6NGe#CJ9N#&MN^ANd=hDEZm+w&A1k5tnyIpEmT
#Ej@L* h9JaQFCbSPX!GYG@BT!9bBpEwuNl4lH!PV:+we+<^j!J@LMGyY&@kawt>N6$/w6Pw1+E5/+ZZ1SAA8MK
t+YANN @FHG>?1cW5l\D/PkXmt4I8n^MBIW4mlKG:$H<p:J#BXXLWJytZNl85:Pyi%Zu?i/hGnLcCnqtY@E@^=F
+BT&>i 8q8GL8y/56+%Lm=8phP5##J6n<1!Xn^1:4H&h&P<WLTWMM#c##*Q+tB*+PB<#KNn>%S6#BHd:dS@/9MV
K4Am9> Xi^QYG/bIZV*5R:e<^+cT/HW^inh1XwCi+<*Dk6ZFYDQWREhX^@e6#/bXw<Ij^T%=i?HMFADWti%B6+=
^46uab &=!a!$!=%#^byNdK*=qi>Nj%iuQu8S^jE5ZLMqtd98/>TuSVGFd\uD&VibnkwTZT$=mwnT!6PR6PeZ+w
iVc>w% I1cy!!IC6MKY<BI=/\=5$LZ/$Z6#@Twkt/HScqqm#X<5jLDN>PaXEQBG!#GK=6Rw8yYiuCTF@%TVIp$W
tcX^Hh 5^Ay/#9AuT#cal8LQKmC#nJ^Vt^qyy>c^Y\VwDJta519N#$P>aM#XywR&TkY9h\CL^:i4/K9utWcWd8L
A>:kpy Fl/TF8=%m*iWSqIERKm<=K%ZmKlpQWX/EMG?@@RGctLJEk\6L/A5SIp6Ih*!q9mlMkT9:@X4h8kYEhC+
bCjb1? ahJ&1W!:hJppwtCL6E>ER^cn\=h?T\/dDtDWa4H$E*C#^&pmKtDVLkKkpGX>YeA#Ww61/^emjdLY^NMC
p89PEA 9laEAC1R5mhBcD%@tXBe6>KZHiWKVBSSP:KSq+I6y\8RnFyXwN>55#1C$QLVwiwk/BLI!ld5!LCTCqt\
ZDFR?S SJA%R^w&TQ*Xtm%DA?e1HBp6%DyuK5k<Kaw<E&&>p?PAb5cDWC!9ZVBEV*%?KqeEVl+<mB#1e&+mP+kG
c<*98t Zhw1FHW>pMWi@J<ta&Xw?X^GWW:WymKw+XW1$%AnH!YeS$&^YLS%Z#*KGR1i4HW6DlctNLmK4K@Pm=!@
TG=>Y1 yyLt!+4aDqqRD$&HQ%IK@<F4K>q*mPdbWCW!PeFcDep9V/\M\kGWPVDKB4uD$S^\#nJ=MkZYCn6?HwXi
I+ucTn Z<\!CH%b:D&59RNCKt<+N4:NFu/</MTW<ANW+SBB*khjYwnCLq&^DEV\m>$qtp+^u<eh6+5FIYca9@CK
XuCVIC JdDIcklaWh:^8M8+G>yX6#ER$pWdywY5uZQbj^YZeDHGRh/<=6l<lMn@56HkkltNAGa9\!ikTq&bN+M4
i/eh!5 RkYQV%ZCYuJbMZPud%hm5TbeNPuMWXue1XQ&CqTJltG\4%YT8+wl6\yedS/<C>A^%@YXmyp%<G/=w^>c
i8T?jA $<bJQ416Syq?XV/pyX69?a#84Mi%cQ^ZWj9@9EbqHEW$NjpdqN%:46\4BQy?+%\n&Q\R&APGdVj/ttp!
:^Bbnb E<w#tlJ*9%WhN#u%dWltLbpD<FThjcDNV@6DhGKNF@C!>81tMcP9Vb*+8jt+QcdEcWRAT^GL^$Mw%:!1
Qm/9qQ 6!Q5a+5R&HjV\9uiqBqhK?cX#\INwYcCYXj!%VJG\IR6*Gqh=K/I1ZGP6A6cIhM^<6P58JP%pV!mGhXy
Dn@h^M #Ywl%AJay?C%H!XZXwTWcVLDG>LwNXYSY@bbR!$JIS&4W5$KiTW9%%XJ%k^#CyPpi4c5a1P*TmSwyTXb
QD4aI@ wJGNkV$+mA8NRtC^/WRSFcM&Bb!/ciMWhh=MN9jq4alA1lYA>46h#EGH+wp!H1IC?HIXqR8@VJj!k1VL
diHt<8 MF<6ddSK4LeIG8QQI!lVkL$chWd#nq9qAGDNd6E+Se^GNbZkNKH5kk!4A#DplC\$S&W\F@%c>CmMM6=%
@D+?+J t+KeLBG%8BS^W1byFI1tE*aJ!%%pePkM<lIMSW6ud>^S?ZY*LaweA=?6H!QMmHPLjJRXPQWwF%55u%qw
JZipdI 1yJG$L!Ve+8!nn\XC@?%DJ4$C/#ubTkLkG\1l*K/FF6JhQ5CIVI^MBk^ly<?Lb9Njhi5tT+VL1<HpLph
^G:QJ5 t>h@k$%<A=pF&aYF$<wC$R!wymNLRkI%HmPZI^A<\Nh81AR*!H\NWVyKlH+SI9eeu$NQSZ\Z!/8#PM:G
*%XpD^ *A54S=S6Wid*6X<uC!SeI\*<@HS&bCIKM=pP*Twk/+*aNLE5eLBD+pYCwcP6JueSiWE$iK8=LXj#51JG
An@RXG L!M61&5<d%H48>W<<uGtIXdC8kH!GkVQLyPMjJSRHiZldRpaEP6T*WGCAPJjEhK+uAJ<ay>6NNcPc1>b
RR^!W! EnYcVcXSV6HkeY%+y>BwAKE$4=y:mT?&Dh>cMX/:TCGki:\A%mt\hJPkeXL9<Yj?D!4JbS1#yN6GaM+w
66#d:Y QJ!ERK^F>F<SLYTbqEP#VXYSuY#48Q9P9RCYAJuKE^YH:#WjBZcdG?T+thTMumc1tQdYZXJjuc5SCK%L
I\M=>m ew9<td@\mSN!wn4H?ctVl=qV6wuK8GK$^yue&V9N=X44ulyGHL/pNEeI+18jIGw^uCj%ZcN@w^=qycth
J\kH1? #*wPnC8CeT:A\TF/mP=%FB&@MmI+SHKX=?WBjp%D>\#kEk\?k&JhHq5D4<XHY?M6jAM=M\IQbGwH1Lyy
HK9hB? RaIySuRVhckpSAM^LkujZhjuThS^D94/WeNTR!YTyYJb:P%4n<*H1mPN:<ueL$w#SKtIKR?Kpd#ELdDm
cIEEVS ba=eqWc6b:!IJc5F4P$C6Y*TNk$TWhyFIWDB8%w?Q!>1%nw<q+@klT9!b1X6q/DPW*QPt1?Z<<yq4qd!
n*$BlZ TwC<LRWyT^GuICSDip*k=@wmw#L1mLI\\V^CBFD8/auG6FtclqqcmQae^HBRDlWML4ER=QM+EXq/JR8L
Vph/R& JGuVFm/te<b<4hk@Jb=GqjZFM*Auun>QSNSS/$IRWkV+k11+aV^iQm?CFCdPe<KW/SE!^8*TS+Rk::yW
I?Me+j hyW^y?NYLnaPRP*kia6W^KQSRM*ZHJ5ZnF+Ht@pmLW5pGdC1ECKB<P*cMtMEGt<=#%wG4SEF?hk<We#H
=<p*8h 5C^FRTZdFhcAJEXqY1^u<MVw4QVCwk$/4\mQ#c6^Q4X/wb&9F9Dm%Cta/eWit^NQa6#=^uFFZ9^TFDpb
cP:1@k MBt/L5*T!LnZ\GbhK6QL/TtKd5ln*/8V8D\&Z+YVDYWASSVWd/DT\eSL+6a!^W>Yaq8He=@C\W&i\l9C
8LFyR$ 4ttPDSLyYNy1VbCWl*VWQQhe+I:Kmwj/h&KS!KY>=NkeXCBFbPJ6=iXcpA?X\*44e116QPcy4P>PuWCE
Hmh>\\ Q@Fp%u8n::DFweYIhZABPB6jjI!Z5QcW:KYuSGCeVM6yhZLY<b%GyVN=h%uyCjuF1CCEDyPKQ+#\EhRQ
ccNW#i 1$j\%/pi\t1=?VHS?epnHKQtuRIlX5p*WIDyBnRn!J6H55?uZhVK1#DG6@EbLtPpwWh&qG9%R@wE/ZKG
djpC>l =\V#6qcZ>X>>G9E>h6VZ5D=WlbKYqR/i$XR!RHL4<LXClF&5RSA$P1>de%jN&Tq1F?mNbjEm*pM$l&Q#
ZaVTHK hW<Z<SwHjAG14IXwNCGiKWAlHhBSiLFnlupujPc!8^<A8nCSRb:Yat8l+up6Xm8Yi&bE*PZFRG1IjEI4
qBpnAT %qiXwh=9X8k^99EFMAR6*G&mTlY\1CwGh1D:bRpFw!!\TKXGITFeel4VRP#X8#$h+YWDFJpWD>5?CSME
khRcd\ E\9wnm\d/pV$pml8B>V8^EI6*@ttP/Ey?bq$m</Q$<JRcI4<4jecSKHkyYJP:ck=G6HX$yVY9=iV9Q6y
-A1I1? 000f47247da001202b3 Page 305 of binaries1.zip
<?R@+m +NFTPJ&<nmIR1m\LWeVRINaniyAX9Wb$w6+imHk1KyT#mA?KwZ4>QeDJ5E=I*wwcE&t>NELA9AAAM*Y*
ID9aab *cYcw&l9$Z#SbSG!/9cZeG!d=>6mMRh8#^bL6CIR5X\$+N<8&mITjdbIk/!KSPCHu1\XyJ1&=l99MR:<
jqd$!b k<KRHHBS66Z$X+41a:Pp$mlnkQeVWlj!44VPhupiiiwh4S@RYdK5mQKL4L5<uihqBjTi!PDKc!QyR&aB
HLXBV% =QWXdu%BheK&!M9%%w9ZtmQkMtyketT8+bRI9Yl%cj#:eHZ/hKK#N/b69T\4l#wXKhcKMl/GiRdjKa4n
+#Wwa< %iaLn\H4RqGn%9/yHFeM+^nFKFD6TQa/yplB%E8tC1Vb$$XCiSVtaXc%5%qwMtnnZT=LTNY8b1F<nq4u
@HuMdK =9=P*/1l?SN#l&mLJd&I1LF!46DDttVykTnq%D+JM1kFTGjSIlbc?QP&FL5IjXEEC9A6jXGuh5?whDZ!
+j\yC/ 5u8m%P9d%W^WHEahNMG%k#ce<yJH5>W&9WXM1$EB^D5kW8ASKG4:mq/6\>G&qiZkqQ^:6WMcEQlSI+ti
wiL8EH =nhIAutR<<!W+8=44RDM?B/WH5l4cp@5E^4\1w8nG@FCR:t&V!I#bY1E!GuaRFTjM9jw5ww6Ak<8IN!D
6p%@!Y /+BmCe1@SuF:89Y<BWib/EMNKP@@N=:ynbeR:lD=$>ejJ5bGlJAEc*ek:!8BE^P+#SVQ1epZeh%wYA\i
K^Ka8a WeI&KnHKSNFBKep&IHMJ5qmleTQaD><m61@4JVe4nZBJ9b!d4+56D*eVmRXVqp/^upI+w=#qmERNLRD$
YCulYK AyRVXVmwM4/\&RA+^N:*pL+KIt>WF4JmSGEt&kcPN*IyiIZYQp=Xd<Z&*q=!&/>@=RnNAMbC&!AtENYV
NEhu=E huB>64IjQWT6:<ehKbtA+WAImJH%bP=c9$6m6kqcT:eVuJl^H%^A&\h:wKkwEJj&:QX4wD!N+eqqC?Xb
mHRcy9 YlcXhT*:6645N$VLJJiuBk\HVGX=^RcA=dbcYW%e&%Z\Dcd\R=!%Ze1/X6yi9:dBbt!*^Y%caF&lEwhb
kdY+NV Cj<EMB!mcEbSKQd<Vq8I:1q>kuph*<G6&88j5MFtmM11:e*>*day5*T^nBVD$b5Zn6mN&:Wd:Mb6YltD
45*DGY eKuanBGn<dBY6m?&?6=!Jty#nYklA4+nhtQVitj>9KmMA\BYI+dn=9d/6SGdej9Y&?tdNJPqSXd>NFEM
tj@KJ* ^+nh8E$:PtX9%%/@NtI#Htqd4IImYEJ9/aLW:/wSk*G:h8P!9W*:K5Xh8LAJt^9WLeh@B<yQtl/Kct>1
Jjyc$t X&j$4Ntny/Ju=81YV%Vp%iGI*XDCZ9M%ZJ%>>ca/SDdbn?Vdh#IIk<@HXkHtc@M+IwLV^L9b/i4e^Je*
S:K5Lw j#>E>ZmMZjZt=WDLPTKqZtGDWHm9$8/tp+VXRT:whqu!1Pl4VM56c#j98&bp!eDLMEduWGQG44qeAFFA
Wn4LHM \QQJ8IkeYTY@+pbe@X45J?Wmt9K\ZCq\$>94CBB9*4nbXTQuHj*9QNe*\!@^ZNkBbhK%daTq*<XHG/CD
EAQ5M= c$TJE%qGSC&T:TWCMTKwFL/!N9j15<hm=htKm%WC&lt8SpaZK>TEJLRN\a!K+h6L4n4thTkwd+A@1BEF
4<Cc\p X6+qqm@I8KyWNDJ=Pn#j!A5:+PF5umFt4!XQ#nAl+ISEuSSb4V4Ep$TIbBu1%R%Sm@1iSqa=SAQB6$T*
yeL@wq MeKLFmG#ETuw?aqaJdIRPVR=Y1DCWX+lCNFtwkGj>dEH4LCGXAh6:jq?=M&DTN5+kn5G*w!#N4CXH$et
%PnClt <%pNuWaQpaR&A++pE/pnTq%+l9A:c=QBB61c+K#jFKGwGBH*1=d!#&FD$CK\KK&6^#/e5muKR59*+AMJ
ldy4KN wS?p6JlERn8p+M$IQ*lSZZ6#u!%<T*+Cd&6yM>GK+dkFRtSEmt#*kSRjETJDulRicmQtYRK?CHpK@m\w
Z6KalP bSLhnQD:RK&5&NNkcGS@XDAQQiN\ItNd*>RjeTJ!!VZBn1ILbWHW8DH\P8>tlJ?&udjdQ@5e%B4ALBhl
KdCST: tFbS+w%wph8%I%yEhIkR?NHG/!wEQHpFDbCCN!Q<Nt%*W>?%J5<dA*hG5LDwn=mS&:YndmB9hkBhealE
TXNYMw QW&#=9yMJkcK?>l6lN<iAwn9y@$M=VSk6WGdm1bG4*1mKJ:d6CQCBFRhyMaG<p1P</bkk^W$b&C@mGFE
ElNpZ+ BaVe4l%ZH+ViH:c@9eZ?SqjCA<TP/P%t15@ZZ%VRaG<?akj$^\YMWa*d6J$=eQBA*bQPtc&YNGbu/JJV
RcTJVB B\FlFdLQPM?TY8i=FmEw^+aBk\5MwP1H+*jkSb/wEZ$YWn^S=?QH>M==hPL?HZN^y=Q<dEP>>dhdB#:w
i<Rc/& L*:ySR:V/IV1N:/y!*YnJd=GRE9G\INGe*YZC:W##j9NJyha6Npm>*V6iiySaBmnLEwT^^WSDRdQR@cW
1uKXV# #BVQXeW1%BhjcS!*WyBl=TF*dwGp!XKukQLaqdqZ>8b8cY5>ipYuwJ5!YkBQBQVhiGGwWEL$\96Tb*Q+
teLJR< CERAyWpt>@jFSeAm:p$bBK\EQ%kHiCZ\lG+\eyQYCi4b\NCJ1dTEZbe^na#wQDp?*YKGQypGBlF<@Qd/
^/4i/p J=k/!pA1l8RZ*KFecelRSB&F4WEAN5<$ieiL+jt%Ik^=5<m1/15u%ASCP?\hCijLkm^$nTuwl\b+AaP$
=CiLk8 #JGQIWjIK=*LyIe#%=<4Nt\Iy:I5Xt&CX9yn&\E$Pja#iLjp?G*YJ=?iwnJTtm$DMLwq1Yb@mlHuEaGT
=dBtja BK/N#^AuNp4tLdMXk\YT8edQbbq$mJKH6?X6Q9jm%wn/+bAuI?JE&5c%\$:dDK$/^^X=euN:@X46MCYQ
dk*^5l wM*RiwHaM*:k=R=:MtJPd6iPtJPd&u45Z:<&wpwich9JTkK16CwBiXXdPhVJ&Na*6hWHNtSGdMpndZMj
W1&@ZJ ^u9mNTXL&FkEZIE>8X*:kR!b/<GIMBqd\$AdW=F9*XbIKMCcQ\S#qC%\CJV6N641*\\BQ>#yG@MNF$p/
l<1eBB SeuPNKhd6Sd6<&wHh/b^CkFV6?AJNCNGSeEyb1hjXYeJmChdh5=LLm1e=GV$<>%\?Y48%\k6dB4%/1p\
cG+GiF ynl#N5\bIPNEI^j<>IX:CGjwiuJn6K%PN:>8nJekq*et@K5SB&u?*N@@<pQDGkYc@&:$Rl??VECRN*aD
cY5SyZ Vy<\VjcYT\b#Abk4&ekaeRq=:XJpATKXt!YD&hBI8?YKRuQAW!ib4mm!&T9l#nSAl#/P<yAqD:BE%L6L
IX9G^L BHA6@N\+wCQnIjByZ:?C^EHEMESVTn+1R?C<DuWyMB&ZEq6\KSA65E6kdbk\^bJAY%V8>bN1VbIcw@1I
hw4@9e uAV/QT\S^wYBGTyFR4JmH5*+ijPtF!E6QIl#iXuEFPITWwY/FPRhqkJ4<=bLAVCJ6RMV%pnT$pZJAAY$
uY#\4B 4y=jIt/N1!wnwL9154SXbFlEZYH>pYl4=Rd!mFEEjjKdZkB5aDwLGtIFE<WKc9W?^R!P&MGtuZjTD8Qu
TtDR@w /y>?wZ!ehRjh5AHiLNIlt*9wN=uQX99LaKnF>4KhAupA^Ku>iTT&BcCBKH^&E%SRQ*j6#Z%y/$!#<bGF
BAkDXp I=K>*MB9ZDBq6!>LtaQjYAjuGX#@?ntAA/@CSN+CC?/XAN*e99$MIP+6?WwS1SBVMT%GEM:6YkjCpThe
WVMN$4 \D@5nj*4%\A:BNVtb4nk?Qtt9iq#tc<hR<uBLJh?QWJ^d6emkw>EYRj61ej?6a<hRaI*k\a@WK5yn=?W
CjZ%M1 LJI+nywSn*P:FukeEN?N?J/^j@&Tk\#&>WhR^h>ACD>R/<JN+NHX#+uM/i5>%%=qc#cj*?ukPS8pn?8@
8GDD&Q @9t%R^DinCk$LAm#&>>1Y>Fe#&!Ni6Q1PqM#ib+%cnbkuSH&M@bjh6F8Eyd$4ZJJT>9NndMN#hpub@@w
GRHDQk QpLpR+q:J&MpSN4H:RFWdj?=A?Z$dE>hCmt=&*:\@A?iJ=ZcE!d98DX*G:j5eLj^p?><$#6&66/Y8?$d
:MJ\JT T<jhbmiVD*G*jam::WQedS@md95Rh>8H8N5?^N*&@%Z86qFu$Jc%VC:@4Pk8%<%D=yt=tVAFw!HV&q16
\SpnLw X8dwXd<#M4d>GC%M<&tF@H$MBnetm=?4!Xt:B\?jBaM\T+Ck#mp=eRpeW^wuPe\9E9wC6kY^DL??kMdE
yTN?Sw $k<u>l!\\p?&Vi&%Zq/pdcZP/clF9lK4ZMAC6Xdn6FCqdnATK:d9pnVJaNWyAYQTFyd&GqXX/9wBuNTK
AX$ebb GbeYy9pPC^IQm^TBpHS\wputiXqFZqV*>lqD*cb6Ecb6VT@QWKK&BACZVS=QJtI&NlwcqSNC=%8dy%IZ
%a*H+k ^di%Xl=wa5w5CT6\8H6yX!lXDQlJkAhneRqk5*<V^VkSMQNTtE4jde$%up@$?yLFdah&8W#diIapYMIl
t&bCXt Rq\YLlu$Qc9DShJGkI\pSbGAFL%G+H?w5<W!waMjVE*6ew4c$c=?Cp/FG=C>mnR5B/4R*M%HScq/At!4
mcR$Ha jJYXbH>d4k@nXPya@NB+jVV<>QwYm\\^?a1b=nL1WSF/IB1*Sd!e?!8RlR>6%>aa$kyERQJ$m!:\=?BM
PeI6<L ^#lX!RwbdyXn%!qVXEwCiZyVJKn8#P1XKFPJkGSVH%c5RlTqyM%Gw88^:H^X:/*Ri@9l<Vw:9*9+PNc6
PlhSQu j*k\Y$**b<n^m<C#X&SJX=mlDXLQR?^6EJ5ht>J<IP&QadZ:lXmKPw\XN<w*YEbT4+Y*=9tHS+9F$cH9
<6HEum HhK>buQbX1q>M1tQK#l=>m8PcMjb>iQYjKbi/u##!Pj#5AkYHFIbcd>LA^p5bB/HchcGKZkBEc/eVILc
4El!k/ y55+H>^pc<kY>EI\@eW/F!!jLMaS%\eCCJqB<Q@ltijycnJbyq=FnMNR!TRj6KDq9kYcY@?J^dT@NY&1
9eFpb: j&9N!*WPJL!BG1/JwABnpn\49C6lXBZpPeeeYM&#CPSq+Q##9Dci46ITkYhdhJ$HZJp%9Q15Gpd4dnAF
<BEm:: $JlNZ>&J@XLWNhh=QaT#w$RtSq@6S%/SIXCu+8BC=SZ686l4C<Cu\TN?N5L%n%u#&Z^mt<hEKiIpmW!q
wkkXun LM6LZnG<uX/<Q<F<SPpp&!:*F^kWXHkhCu<SXtJ@\\uVm:B:9F=4t9H/pQW/@t*p<TV4iJb+CPmH<<PD
8+Ll>9 w?uB\T#\Gp$C8=wH5+Pn&i^IQ56qNK:mZFEa=lRVQ&yB@aEmKbquGp=^&+AD/X=WC\&!Nwp:V:FwM5C#
@X*KhD bTjuHL#=Wi\X@lTZdw&Z^uGc!W!JGpi:iY>heVDh^byl=&K#MM@D#CNB!NbMPCW%CZAl\$un$4BQ=YyF
KeQ/8u ElXlReFy988Q8RkAHZIRL9d*y:PD!VVJt<44m!e!e\KyYBF!V9&=:<Q$L41\nJIbJIM<kCh9QZJitY^*
t>PjN$ n=\qnwlN%Aw?<ncq?nchM8Z/^L%VJ+1:qE84Ej>Pudn>y\Y8Zb/&tZFiikkQAbMdJtudF+>9IZTSml:G
Ny!4D! 1S&KwI6MARlAlnB5W=P\Baj#eDm8Fmy/TbB!VwE@?>9C1K?9uC$DtCVu!WQq+J>ZKZI#jj*5Q>jH*8Sh
Hb/hdl 4B>be!@YC8C5eWd+mI=tRSe9WBqClX5Iyy/MVmLWLpLFB@ucw:qGSiQ:mIMp+$R*n#/dTjIByG1+YGc/
%9k9hm %V!ci:N!n/%&l5=<P!=QlFE^t!\yuZq=ES/w9PD!hGTw=58n!dVnMp9B:T<YqPwtZP=Q@ZmFCa@L\>bc
qpqRT+ ^n^CmYF=9Euu/RyceD:6:!\C=p:5$$*ecVhDJyL6H?HN^654T+^Sy>QYpPGRWapRt>eM!8Wq>!^!CdAM
>H4SiZ KBE!\i8!KCIbqWi^qF&Vb*!&ZFkLZTI#?8K9:5l:N%BFQNeQ65jJ@I%TNI^C:qIiQK9FR\DlyRJiw5cD
-ALYj: 000acfa811c001202b3 Page 306 of binaries1.zip
ibAXyV QYG1K?d\j1%F$cpdGZPZnp!dbCL=MT/yG=e@N99dR4!pe*<j!:ZY&#Lt!?Y#PmXN/V/FZb6^qw=1ET5*
96>P%K PJc!pt!deMyZ9jXMtRMRZ:<dWK1N+JW:AHj9FbR=%KH6#ZMLEXd^GJNAjjCGet>M>E&eV9h:<8>Q<EF8
5\l^bj q9>NtiHGAI%51u@n=p41n&K$=jjp+L?LQ&JTAW*5n=nQXIl$S$hdjaN1TKXqQ!=bE84al#S/epKCIKM9
yAkZp/ @VFTnt86lCe:@Wi1k!?@RwekwGLR6G4Gk1:kK?Bp1LZKSW*F5?WZ=LFVucV111ZAyM8l9PTPk:<wpi1j
HHJ&6G a8dc1jtH#%Yh6MkX#MeRm>a%=B^ABJ/aLmRI=+WPda>edV/QYpi!PS*tniIBbaeIqTdJBZhniK^XKAZP
@89LMw RNWTV!/Z5?E+j/m=NQX:eAkWDeM%@<mu+yWP>mi44GayL:^c<$LXtKdMF98VbRm&TX5ZAXRkD4Ll1?/9
c?IblS wHPAZ6hj>dPQ<eNc!&S:\TFEPpDP/ZK/Y5=tQtIl1Jwq=\t^SmEdh#W=Twk!iSj^:!ItEYXc&\ujen/C
D&/\e: G>Au5YcqqKQ@<hwAYibXSH>BP@FuC/^6WElp8Y&HKqmpNe4YJGA5T=J<aE&#yp4uiupRP\H!*V\Mu:!p
4&GiFa \ERQjE8KaJ/$BhJR=Pb5G*Tqla\j1L5WqS#NG<+%mL#JXN=ucAtq9&ZbPc=e@4!>WJGm+?yRJ$hVnWeQ
$=di6V =liiL5yF$wK<nQJD9lNBkFC\/^4nJES9H#PwywkZ95G/HLSp1yaQ9Z:+tAaQtl1c9Q1IGlqaL1l8*pK>
INkbq$ lDa5clZ!Dm^XwbI%bE!npWZ*Nl\k1C9Zqc/YkPn%\^Ph/tcmbN=X1q8nACGKLk$/B9@6JR%WW+^FX!D%
/9QhRA ilk&?yFlqF$8EVw^^<W/dbh/aCK4J=KGkHPDDp<\^IAS1jF$%nS!ML</8eZtWSGL*4lBAJRPdA+aBAZS
kA6<+? kneF#Vq!niE?dDw>CGACWKi:t#yha%4WNWM1uW1:k1M9%@VkNYk!$NPy$PmFP>YeFi8l?GqBHtmRctnl
q5TF!I \#B4C>H<$BH#Jm8<58bd=&XbEiX=yjqJYF14LMD$qHW6SwEhH*Ib1^kKQ<81hu@VPQP9hEni4R:W1Y+&
=5?#By VjkW<tS&MF&6yke#KEkYy6p?!#c^TC<Ycq:=&*BLND%c*qI>Yl9GeVj\mpwY9Wjh9!ZZCe!QNkLAW/=H
dNEJtM nMQq\j:BWli5Ip*mGT9P&$yZQl^QBlX1A^AukW^tXPJB=pEkW8A1DVCdHW*<CP4&w<</M5BiRy&EFi<N
D$F9>Y iLpj=XViBSnJ>RwdZiWjiN46d+X9?dn1>idLbHGGwTM#c+m/RF:RnlbHW\Q^D^$N1/R*u!dGyJRZ+@JJ
lbNqwm ^RL1&Z^j=BS%J%GMy$jVtW@4HwRhY1i:4%=+%yE:CbiHecV9l>t&ijA+Tqk&1<Mkc6T$%AVn?5HN\!t&
R8Gyn% :$ljHF16apin^:LbLI+th&Fcb5tqIiaB<^M6FAT?%dl?#p81tbSPIbTSwW=SKSCl<GEANWIdm9GZed:l
6RC@DV FjYK/G!?FdwEwc^p8=4M<cbWhb=AZC>Z$!ZtG%<6qNQmDeN&kDmRc@/Xy^JQVGpn1kk$&yK*BQB!#beY
9k4c+\ X%C6#W9WhMWDlQhl6bn6V!H#>WZn6/B#eZ\kV9Ce6\^=updiJ#XCcZZYYaCdhiVb^>9L::*\ZwkcN9N^
@Ch6DH tYYSyYtGj+YadVI&$$P5XmZLNb9C8Z95L#!jM6MPibiwk\ETm!p@StidYKeb=4=!::1HEIX>?8Jkkjqm
Th\$V: YDAdTajaR9Y!edKG<&&n\pQ5!K9IcRB@CXbW*Cj^F1jt5Z\8uph6T@WCGiFkBR4?=uk+^ACp!&XKH^P#
p+Q>Aa WY8ZdQc&b\#AR$MFSSAb\&ScmLkGbYNq\FCRWXZ<1P!H!!Cek>Xu??GP15XFX:4qT*YLCK+k\!4CSab/
5IiN>& 9nMR=C@MkVwNYuqWKP:5?R6cB^9LwPEpkKmc<XJ4HS<a4CKaVX96%!aQY:jK\E/D55<1u#KKd@%enN%<
SaQ4@H McjEMFbt=NHS>HD1m!HXFI9JkVyL=LcL?ZRi?E8RnWC^>=LX@8RI%4Fa=C9bI4NAlqcP%5*:^jNn9tIG
WF%4eZ !*4mPT8&<Jh?9FnRi%Vt&j^w$XJJh@dE!5Q:j<hwc\^I\:6DMjNMKDlt$m&YCXcV9wwXNbu5y^!wu@%M
Hwu^YY qRF?16P5qJpelqpc=u\VR<#MnPq48HSa8VC*?GLK64Aw^!&RpLc9q%^Jk/#W!4LRBp61k@j8uMiEm/qj
nM9Fmc KPtE&dFBhk\WbhY5tI5Cp@MGPinyA?W1h9$!jbYc#Zhi:9jGeFEhqTeDZc:u/etEBkpRXLMiaLnX/6?<
@*J=6m $BBRhFqL%qwqqVni/uQa>M>n6XSp65#yVKRLEh4%Z%69DBM%&hhP+V=^u^?:@1unlDl&u*ht\8TYu96m
:9Hypb T\6cHFlXX</<\d<yN*=mQ91W>5t^uP<G5d?6PdZ1AF/LtcF<F!R1/8TDZ%jM%=Z4Jwec>Sb#?dwS/<??
^uW#:# =Yb:=W845a4*PiS+u#AN<9lM5YW%9S8<<>+StN/kjiJ1V9R8LYSNmnn8he/+V>TnEwLu?tS#q@C$8%6j
WE1me4 X$4!hFIyEFwHD/bJ=\c44<l5WdM&?kbyeMMN:WtqyIBXZ%>mWjYcw:6^tHkna$j9^u*6GE#@A#++4ell
\\G=SK y!\t!Jc=1BYM%/V6/+eJ5#4q<<6Dw#=Pi>4$P1Wt<8eiF>N^i1$6\Hwm*H6:Bb+@SW:$#jtlac1!hE+d
=TBMBH D!TqeA88t@PRcM&FkVISKd8c8k9#5#pkE6^qA8Hki*!Q*4bHu%FQi+yFMJG64W==PKTYWCdy4+B+m<Za
chDnhb cJFT6!/8!G/5<q^=y<Zq6m&AdI9p:!i*wK1AZhdPX$Fd!Qi4ZC\$Wjuq$KYiwm@&Y!:G%mt6W>&4mMS\
qQqLFI \@e4d%%<lKe%yiWV?km\1a\Kim^^LK?pZdNE?X+ScA>ik<<mZS+6IIN4WdytI5M!cp==eDA=Yl*8m+$H
e4peKR 6*9X4SbJMJ$59AG%$1i#\&pMAbRHS=N>PLwQpEpcwmDucuY\9^KyIeJ!=1jhEm/cMytICqq&a58J\JV#
TdQNkR :B<eHl#M\@9Bu!LG*?#kmC/>KDtaHHbFJ=%RBQq$MqH45VbmB5KbX*YHeklSTFF/G9W@^aCVE<&VXKTY
n\Ya1M TPWHZkc6abY$!XJ8mnbH8=l%qGHP/bkHpP\wqJ4AE$=XY:h+<V^D6Y\QPyS1GwQ%5qCMLZnGIqCX6@*\
PYA<tZ /t!PlcJ5Aht1+N>B51+:lwMLabtnJ5cnYb!$cMbDP&Y\>Sem?d%+tal?GKW?Lk5HRX$GZ%T=KwEK?8Ci
b<CXn: ZGpuK?$%WVycC=ud?Z+HW=DtpX!h+eZB<\44Q/iGFDE$yGySW%NVH4ktm!LVRjGmWq9J?kA:1<Ca<Gm1
cC=T+y %XAQ$eBCw&SHMy5jZ+q1I+wtHG%6=cH!#RDT&WT>>4%=YlZ/5udRK9a5VAI=ikNL&EClk^n%wQR>iA$K
WW/=/? n5#Diham1c\ShRqcF/\Kc4wDK6&K!qwlWNQA9P%pMeiYGpyjIE@YIHRuD!h6<=ytmeWDphWIbnER1P4B
WyBuGG k\$MDSB*9KX$9umMA%m1YnIBmm^M%Wcy%Ii6lhbN%Rb^/pYFZIqucqtFSj<!XTkD!SQ%#S+DX?@+enq\
=kYKT< YjkH$\RWjZAbbq:SWTeXp$6$FT@qpp%DpREuAGX^T=ZV<&u9bYqAW\MhPSIDdpa9S<#Thj%wPbleRb+S
kGWDiG $4%n/@V&M>TFm*G$6beFeqc+bDhPiZ44!4aV+:wwM6G+DY+:E?8wBHPQcy&%H8Ih#\/^q>^8/<qGiM\L
@CdW^A WK!LE5i\+MF$84<Q4YynCc@NS+:*w\14VPPycF<bylDWClETM%VM1N$qmk^>XiMPNn5+nJ*tGG*5A5S$
F$y/Ri ^mCClVmaBlwZ*WRb<IRmcpd!/DE>+NMRhTn$=Ey4y#b4$PVB8<JW:mkLk1\R&%:iNH$wZhR*%*VT&ZR8
:ym^:: !9Bwclqq46=?Rka8tElNM>ELRjjj\ptnQked?4QyRq+GQX4NkVq:SDCTciY+?<ennu&jc9JHX?+yD#W$
cpGXEN 1n#LCuu&waj#!Wud$p5:iXJF6jPMH4^LLN+&FiqZ\FBw<pDMjw=p*#^dbu14n!I5NiDbcGaXQRD/H8Gm
G\q:Nk <W%+6j91tk/4cD^ab%S!qEW!u+PXJFNuXLj:H5H8##cth/MDJFK!+ADyN6N&TF\M<>bjylFtEKI#<1TT
^yTW@N SB=c^ellk/5K#1ZqA!<S4ViViVM=twiAXi6NyLVMtS+IcaG4=C<DX%ybaW6ad1Sht>AESDlkFE?Ap#+H
jT9>>j F\*jdEXQN1IbnGukKY*deI\C\+LMbGw<#4SBYlqTn%k>NJ^DZSdlVi/ni/yelpaiE4ldelDSiEdQa\$p
GNt!<T 5Z*kdnLAaZ%A@Kq5\\n9jl/KjV4kT94lKZpH+\l*YWH$?WnNdGp6B*N?=GX6%R>LYa5mhPTKhR%yeK*>
<9+mCN <H\ITINLl6GB!lSe?i^w$dZ#BR\/uRXatiVG9TCJSKeB8aRe?4LI1$m8P=iZ<t/SC5kQR6=wE<a?:4nR
!aDF$G b<w4jQAc*6qbuM!QbuLVwmk5C4Y$kmlKnmbHm?X$C9i6mPSp88#T=j:eG>4=@9=5MV8mZ#cTyj%kJ95h
p8kN^a mKbk&4twHct!<MHGt5Xl8ykFpZ^>Z+=hykimQNk6\?=?JQ?8bpGY^JTYWT1HT?1tui$9my%nm>y\tJbm
^u6CZt ?W%EjeB=btpXBVMab&JALJQWZ\W!Jt>@LJ\PapRGjHAi4C+=wWkY4!1LhddWybW&1Yk4T%!5&D=>hpW&
XeqFI@ pG&%LE/#L=Cy&$ct#66MZRl$%<QYtm$:$M9I\Kc6KG#+nW!\dGQk+d:n&b#YbI$N<1=DWIa=D9\5QVB5
dt#M@l RLt?CI\XWR=ulYjFmkeNCW45LXT/Xn<=c1kZch@B9mIIGYcYdW/pIV9$Bh&J8jn!1ciF8?E*8KmKM:Z5
jZmRQd E=c+FuN69%F>GI1#?^1MQFcL<NV\W?bV&ZmF4tlYA#mteih59QEcaAimX68BBqD$8<b<t^wEI=DbtSY\
ctQYcE PY:RNnq^BkR4T9AV@NZ1n1jXMa5>uC4uLM\S6XTPN%cM66kBVIZ!^jP5$uPiBDC$mH1FII%&!8jBcF1:
A*X>lK GNScVK/Y66TJtGI6C\e%hMPetYRu6MB/VjdyVeiptb+:4N*PN%q?@DY>dqIZ\aBD@=*tbihRR4%n*eyV
KC6BjQ b^B&a:*A<ZSnpP^pa@+yhh!tbq^Q<:FVC$:?Gw*eQ#Ljh5:RFD/tKccnk9EWE=Np94AB<h\^P9Yb+de^
hnD>TP >M:R=yh4bYS<&E:na!I$+EmNh:AJ1It!bp+6pE$Q!W$Z=mjQ\SC:1DNl:c!=m?1+&LEJ*iSl5lJN8!91
e19MIR VCXA*y/u/ViH%Yce<Wb&TKV&!wau<Y<:@l:eV5^?RlpqNTYjTnh=N\N&^>I=N\bmG^FXS::4au\L<\9u
:\@BDS aN56%Vc4h<\4YIPQcq8>ah&!mnP^/C\M6*Z^qdV:T1?F1RhVL6jj6TpLjEd4V5&>nT%a/t<QNmXTTYFE
/ytQ+Q <q8$:w!DKCH94\d%\km@aptuE4KeeY+/C/5wh@GD6%+#+W4MPAlS&Z%nWHZTmb\h!Iki61#md4=@mFI:
RVZ5Aw @8HBEj<ZPh58IGCn>FAPATNPDtSqSSD#LEA$WFRHPe+1nAIE*b6mBj6P4Ln>BA^Ap@*:bKk>@&B@6n!e
G4N:$Q VMHTwIyj!*YP<Zh94IStEjq!5BKaZi%KI#tXqj6\%qabLBGV&ncnNmaiQPhDumBhC=G@cqA%V6aSeQy8
4QeFLI #L&5LdFmm>p^$B8NV$R4N#^DKj9G1eE^C/D91PjZauHhy*yeBabeNTbWPcSeJ9A51#a\8cyN^96kbGGy
-A?B++ 0005c37483b001202b3 Page 307 of binaries1.zip
D:t*/d dpdeB+$$&K1\&HD/c4Th1LcI9l@m8%bNPYw/k!lXqclywu@JjjD:$C?kA>p&by^j#BC9EZWt1k85JllF
kw9t%K ZCh$MF!Y:ACVYBRD:#=+T^EQnSn46CMM1XT@99P&\@jtdCm>D+ImW#FeTpcB*nId%P9Qq<k+k?pcDcbG
jKYl/I 5a8t%j6kkKKpm:%N\44KP5>/wnjc:eCdtKb^1LA\MH1t8TeQMQKRe!X:mD1bIYkwmw?Z$EVKSPt&RF*J
+L*=6^ Ipupt>:GZ14R4/hA/ZRAL48N5#I<l^mE%M*NL#=:jKkqbMGPC8+M#B#qWReH1kV>!+5KEBLmL1JRFL:6
uFPHNQ ANWAndLt\M5hbcLp?+5WNlb>+MX<qil$Fn%*uZ=1qq8Gw<Y/CBmc4ualaYiISH1l#?=lRHY19G+bX=Su
=a$#!R eR&nHIkYH99MSqQVTE%h!K#bc8Y*lpmXdHF\NHh?++*%Rq:y4d9A+iYqbdBXFN%Y4Q$Wyt?N?JK<iSp6
@Hj*!& H6l1+YIFThyZL/VDZ/5JtB&\tAPAcu^:b$ySK:a/YmK%*@JbeKyND\/JD#A*Q+5pmKESInAFBwAwnFE^
ed:h/d hBP^yZc%He96t^p?>/k?Y%H4$:AN?@TLm+kX:$J@pYnIVK<<%H61GpXCNR/G8*WdG9@JFc&*QcQP4A*b
%=qYVi *:#qtjRw%hTtnBq6wCyDeC#CZM5b?/$Sbmn:+Wp6*THdl6jP$<Bp/dNA^cVI9WZkSYCiyR+8Bu/cnNGa
LR=:q& keKM5XG?:/XM^>CD&VNidWZ$1#+wIn1*d5PI$R\VA=JEd8P6M>yZuqFAC8&i*q=VQ=Qaq+YB#$1ip\c!
%yaPZN ENIITemHtJnm*HbCZPDGC?W>yp1NwI\5D?F1JY<LwnAkncE+\\Fw4dHwJ/HJ<5+nGKhQ+/u8eqX56WHH
E?H=pW =:F>H%XPFQcie?:@&nXcXhaleb&%a%I@\X\CQ=JCGwc#LjIPacLZdcbPQ\c<aCFlatA\*c^HLcLFWhIM
Cd4$h? :ZLS\l8aMByGWBTmhcdAbLTZ\Gw5D/pjukYktNpT8LYLy+?R8?&*k%wjEjGmKq/AZatR\T<<%:TL@ep$
1nT*V8 %mEGHt?ibmD/GSwacIi!PBcLKhnW=@6m&9kRPZl8*Yy@@+k9%5a/WtEp>#?jJayMK?JFJu$8Ki%1M9E>
@u:9bp C$h5kFyPHTJ1QEAN4<=!5Vw+RltVTuEbm9+p*H6ECh86bZBCLCmku4d/lSjRnIJ:n$kutdk^uL:\aySF
!dJWB6 /P\n5dI1D\CeFaN/LMG?#n/l>dSG#JqNSFSV=PXKAX?ZWVp1RBF65q1M16B#**<B9&>kb>G#=FX&S!E^
WB/c>= +\QBDi$wJPC^FA&WEail?eH#BwG8<#TMD1pAHm!:5G%#YqhZ%W1m5WY%q1w95X4uYSdQ^WY/4dnQBVZM
6M85#6 iu9bYW*aY!5amVH&+VkYL<*ju+KJ\&\A:/DWFnN+*$XapTXS6MjF?da6@8p=R/94%B\&4J>VJwhVMJ8V
AP^QY4 FqM%iXyWa:^HY/XX:^qGe*ZWJ^6:ahV?NR1uAcWuc:DTPWjMmM%IEAkWW:8NGCp%X&eH$>pW$I4b+eHm
kEJ>QQ JieMA%h14hyLi68$yMbcVS%nbcj&ZdT%%w!huam=hA!/%+HW$=i6%n%Zp\QD@/VcAY#q$9+&LbqG#Te%
Gm#CYP pYTZ/ktp$@?dnt\cM>NtBN\1Ch6p!+B:+u8^%:5W5km#+B\T?CjeH^dhd=nu9W@nai>Bw#ZAeb=cQ$XW
Ab<K@C 6TZAtaHHSn@>VjMmS8wKl1diP$d9C+hkwEXF+G?n?KcYq8wiQyFBeZ9@yutXYmwikpEa+yVkRJu+6Fqa
mQahKR nWCMDFkeECCi^w5ASZ!m=1?pt4?!TTLlk8k^1FT#Z4b$kB*<djM9:&BNA+X@u4KG:l*^@nR%Cn</$hA6
Ply**B \ktS/Bk#pcGKa:lKGK$@QVkRld#BM*!^%uAJX*Ah1XSY+E1!%B\Gkn:c?b\l+N\@XQ\lui1AJl/+%==V
$BjZ*l \6XC/Mi\:Ku=tTQmtSMZ/Vd/A1#NHjDd1%5SX%5l:?kPAm>WZV+LMi?QTm6w4hWWjnElKtwX5E+KMT9W
#>Ip=P &F*1Aa\WZi6S!=5w8:4p/WWWSTNAYF/m1&yXK%?9$TTp$Tu^5%PCEu^jNZDIn9WAZ1wL8CDM:=NNNBTX
$e=yE& h?CHATN#+<Kal&R96GPaT@bbPM\\kciE*PE:J&h^Yed4#!G!@^!Z+6AR$HAG/aNIchVnk=I:muiklX**
8uBbC+ T4A%:BGR@P9j4E<^WJ!Z*Hpd#&cA:KNWYqaWChh:XaDl+$M<FJ\Alc^jw1mqicPC@bBBT@y6@TBECFTt
X<whcH I\#WJZnWkF@N\:BN=$6a5ZImb!!jt5?TCT=T4/D^1>y6:cpl9RH&\Rpu^@ZdW5ebcYSA$qCyNjRB/9u4
T%:WI> B#+VcS8LFie+1Q$R>E\Y^GhbV&+t/H#keRde\hRQ5<YSD<NMDlap5S?$eEmLXS&pkP*$#bMSWaYZE^SN
ZFtE@! I4nujyiK9k9#8\/ZW#B$BF:j9LRYm*6j@R!tDlhH$!Pa+RNy%MZ1KGbmY=i:<ST^9XhBE9m?1MkN<mmY
WD<PE/ eWDpKtM\!#REDKyy*nEqDNFlZkDE1j4l4pkh@MZ<KAD?m%E1L+nDjul?6ymD9JHl%GIPQCA5d>ESG9p5
bZem/G H<^tytE?!$e!i+JD*?8HS<pw^GI9bZG1!lBjCX!1LHcD::tIINInT8+nS66#6mJiaw:qmMJYHqQH$kZ4
<6nj@! PEJLR5kW/qwLt8K*4aubiAEY>$JMlI^ptk!kmdwyZ!WtDjRNCL:CcR<N9+N8#K!<j4nGC&NYYbw4a^Bi
Y/&bF6 a!=j$JLhGFe6Kh=4nb!1pw$54<yqu5B#t<SB1*pTa&AIHalXL<!KuDIlJ^/M=9KA>hGaT=W6keh<8!5b
I\5Mly iKES@dKjQqcj8ebCGk&5AXLL$wim$FHlBXaL$RuM8WPwbIj\V=qNqBM*A^mpY8t<GhnZ%6%M+^CntN%d
\ww><E ^k=al1iVR=jt5SPIBGRbmN!wiJ\wVA\hKRdaDl\IT&W\m*:JtmiW*aLVypMW>tH*IYhh%%>l6t+nw?5q
b6&DIw kKXJF:9iB4Xpw%jt\NDnM:EnlHLLe6w!hpRAlF$TMDDTX<@h*p%t9IiEnkmtQD\FSDJnw^4QYLLpL6=1
hic9c4 #VZaRJdPF5DMkBeD#B9bmBYCh%\LSNl+DBak%J>EBIkDlhlw6kamT:pC?#&mGnWbeYBR*tl8T*MGNVSW
kpkymQ w<jd8I@%5lHPu+6eyRq>F5:C*MK<mqwpw8cnHh4Y15CC^SqZK9h^6%w*^Y1YNTIWwukXmIAQGYQSRNM%
?8jhn? +QX1*GEE1Reeu>kD\GHSiRPe8ae!Nq1A9y*:?XDNASyllB**K@1q\nI&eEQ4uGRKKkd&ZCShy=Dq4SlY
KC<\t? &dbS%D+l>EyEy&C?F+^%=a&ciAM<JHKqd:HtLm5ChdceL&bHm>CE<?q51aDw99pwC\ljMJ<l@cyl*6^5
6cMXNn Qley:VEA5$mCFS&<WVLhQ%4NX9nP%$HeV=eM:VXnTE4t95nZdc!l&ZaFSQHlAnZFkFyBBcDq+hGS:lbM
DHAqDB DqJQSFYSkY#dH>&tW:!k*ZV1B<5DEceNylWWh%C9SRBJiGEdqb1*bY8HFwcM=tKLaGXPcpLh5kVK6GGI
=IeLEa KR9HaJTC&uN+twc#TBT&dWimFFlQ^QN>VTXdWQaCi?i:ET8kVc1e?KLR!$GtLwinZed4mj$PmtL>$$mD
WFR4&G y4b1Cicn\iPWlDEIeGjn!HZM8J9Yh?&BEcV6^9mW5^u/+RDAiKm>t&AW@jp*l48kJbbRTmmYaX%CA*H^
!*bS^> K8+C4td*QSed&MTpLnYK%HR^MjQhem=AV>X$WEX5DEQ%Dm!H<Fh%WVi9N!wcLJ+yk&q%/^<y/pFWWeSC
SQc+W+ %w!4GN%ild+aP&1/\lVyN$R?^#m?jHJH9Tq+XXMh4e:P<41KS8EaB8yHCGE*w9<WSaua$aHCJDSWcVd^
/::N%= I8BS:^CVLIYRI5!!h^dWDd5i!?A1Lb!#4SSMiNj*pawIX8y:pQtq65nQtPu*8S6+J>8jMuh<4?#@l@K>
6hQ4N& uV@u%$&m8nmmeQn4uibPlMBw>S^#6icj:#Rj>nd5<$NML*PadZ@MHFhePn>>q*u&&?S4Q&Ki/uIQPuY$
+cHEZS 1/6P=dt/6HRli/@=P/eM%c*6?bGd4?iIudI+JM@Rn^W:6un?6kJ8b^@%8\G*6Zp19GaR<:uGnM<YiypS
eD:9&> ai!k8@b>=whhBTTZXNjZh#CWy1y@:?aT=$%9y8y&4QC!cF=c:?4<Vt5Zk69M%LW:*MZ^TGhY?aWSmuqT
TJK<&p HhcddGnC$9414t&$TpZNVV$d:#Z@Ti*KMRqM$bq*/u9puw%X&*!D&@TMWYIDMWZMw#ZBnRhl!bNNKM/8
kCS<iM G/ZHe5DL1h&K$dua*b=XH$ujjJm#1qSyciy/B&FVWWuVc+b6tb8j@>leVFW9tK+$Ia#?+&XYqkWFZ!nQ
GkS?lP w9AZIPanZHQbFVtK\#K45!?iy6BJyNW=p%jlq4YcE==mK?8wL\:LW5%kF/L4m+PI$E*5wRG@I+*RdX^H
khuaNW <u:j8ZQ6L8tGtcn$ybDj?biiE!:EMp:TaEERIa!CNI%u?&In&HC=9+1D\F<8EqSEYQmbtEcmZDjZmPCe
+B#<b8 HSI#Fc+tC%E=@IM=GPPYAGQCcdejSLH<ApkuuE%tIh^=wpP*<uh4yVMFyN@HdnI$B@8#%d/5W@ZA%&/<
!kK&je :J*lh=qRSJ*6<&qDFiDpjM5umG$$yjEA^EKX1d$km/BF/cnI*%>/cp&LhEi&ClQTStIMtWDZ+Iq6pT1F
Iw>^l$ E\^1ynICN$BDM$Xd!wWk8TSqakPMd4LS1:P@SYm8R!RRbuLVPIwHDR45yNlWDdW>++#cKDlclakRuwPS
=N+>9H ?6b4kQwkP#LC5+IbAK<Y+&#AlCF>V=Ql1JePq1l:bRakmh#G\qdB^ERG%Eau!kc\w5+HTk1q<5wRNLca
?S:1<m =bZVw9Gh?/Bdw8CS*khnD8q1yb4+LwAPQw=+1quQw9uJQBG4d\F*nuu4u6WA!DX1&#k#C511c496aacT
pG*S=D hDTLR@ll#idk<PHktwyS5&@kkQiaywGl!aw\umNy86C<#>XBwE\PWQR1*Cn^cDnV^@GWFXMbekI?dZZV
a!a:^/ T<%pK#>#AaQMQjecp8RZu&P&4Rd*6\5uuCE=IV*k/k&tB:/*dy+&nlFbdDN>HLTdPMpReaj!W9VyyP8V
mDE*di L?+R6WB?&8wkbqaZu$SalJwS:XCZ6HCbKF?F*W*9l6t<G+*tyctiSRiJMj@%=dBHwhqFWMWlHYl*WSnR
XcqYM> i55%qel+LhCISlQTFJ!wtV?$&lD5AVKaF=RplN!CiVwPMpCq9N=?J1ySJmmpaIbcE$TCXHPBNZQJm9=i
aT@1ID <8Y\*p$9l::lY+E/JWKEBqTbu**8AA<NA9K+Nw$iD?&TB8w\=LRKTBwMi\GSqDR5CXPp1q?IiwqIFRlA
Lh8Mn5 jhCA\mM+lqBR/Yk%L!4</wjQSPKT%eTqaV6pmp9tcdlw:bJS:L#jpP+be&S4yp8W=mhjKHed?+8bG6R!
RLP&/W jQ:l+ZL8I=I6K6#B\STJjmmJR<>/G6NkaC:\\w>ZW!A8Z?MF1>XmhdA@d<he=>VN?Y\SSQILe+ilptyR
SNV<nt @\!V#%BSmXe9I9bkPhhLPA6Z&i$Xn9\KhEP+XjtuZkKuk?iyjnE?ub^JeQBubCP?DC/8EA9ItDWE\Htw
IwmtE^ =Ei$TMt1\^iFSLP!IH<SRmSIQ&DipM^M$i$Nt^Itj?nmuGbMVmKwdSMClV6YL:^#F\=dpYl4teu9M>?%
I#pR88 S%P^H#41pyeAeS!RpK:1q5J</lP#GBN@cBI+F&N#RmZS/dt>ib\DpdpGRd5\eu=nGA@QeKERFbYcd:W%
ZD@e5G I\BXu89Cc?VT@9FnGV:#R+Z\MY*iT=dIWImM!*6^AbFny+&4VdBHDa\dtXun@t$\WdP/#n5=#5EeIVLw
-A8GGh 00096a2d247001202b3 Page 308 of binaries1.zip
>Yby9/ cm:>@\pEMqPZGHXYZZ/RAei4iI>=>S$8IGaaV#4kw!1IjC/NKP!h$qCym^8c\*5e>8!CMal1ZYSWC:cF
9HnkD5 /L&Q1^%D^MNaaDT:@6q$?WLXP!dwm8:jH#\LV5XK#TZQAC4wH=1:Fdn*pA9/@IDB:@i^DQCp@p%#mQ\q
>RMiZ+ K/dI>$u:w#h*:@kN&jH*bMh9Me@:I=bbIGMAKdP&pykiwnq#TywI&DpQWIMHQ<Zu9+8/?::L6DPcnL+b
EQ6aEn ?DZMKDPcDeidJKkd^L9lIcL@kBpjJNGG=p*9MbjeX>dtEHmCEmWkIi?Sw#Y^G$#nadQ:%DcS8#XKA<u4
tb+^pT JQ<yuF^#+K^!R!kC4j=6SXmK5Y8%MJMFSFQ?@tjKZjIaXXTTnaJd!aJ<MQQl$Te*Gw!P?qqGSNaM@AQ#
<<yBNQ k%WZuSphtp=JtBq<*QJ!tDdw+:8bnwqE!uVF:EkCFyA:w==5=d^/NL*\5$N%NEMXtM*wFYtc:!=e5eHQ
n#l6It wRRJS\MHKeYydXCwaTDBiFW1CWdWLbA^EmXL9#A*c+%IAh1uJR!*&tu/iB^6MNqmpddBM9dkI/9#MQED
q=%#!X F+\/b9D5$WPh#j&5DXa^$%N#8AZX*jEDqWdAENP:G+I&l?61GFe&cJlAG+tCu55njGaF%lc/pA!l$eM8
%h$+96 e6@TZ#e$=GVwbid$=6FqA6+ZEdkIlSQu/^?wpYFhB8T=b8TJQ!w:We%F\4V\q6Z8GS9#a>a<k?AZqPup
lR4^Mp nepkL@aQX9PkJd\AT*K65/eN=t9@\6#9<4==T5G5Dim+=p#KnqSlZ1N=SG6=Y&RPlpqYyNQJ1p5bkm@D
w4=AEE Q4uaPa#YXXEIX6MXE4nV5@mY6G&j:5<uE=@EN<bBeM%QYHMQERYHVHbF8TmkCk8=Nw\bDJ6ePa49bibX
#qAbjM uC!AG+BG+mYLyc++8^a^bmCkEbwV</m&#cBVi%*elTDYD6Np#9S55W=X:Y1l1hEZqaalE&H:5^iPXD&i
=Rc>*K X+V4XG/B$8HjkP!KKq8eqmN$yk?uBhLp+Pw:&y<6%hX*J%bQq>VXeHYYSS!a$8yS>da4RZSNj?EWW6F@
@n^8N8 51jB6&I11J>a8LQ=QC5hdCFQknV5wG<bCM?:pTJlZBcj^1DpTaK$I+\mYXK6?hF/>HakciEbMF$KBDqa
^TFG/w W1E8puu55u*yD4DPn5C:&W@9PiK:8RQ9lA&Q1lB+R?TB4:NQd*MW*=S4ycN88jKJ9SjDWNVCpWPyS91N
IhTXR? WS&\=mBNFk^ehG%h^yPDqE=:C!c^V>I%JFV?J?mtLdu<\JA!?wMS?!Fhtl%6LkVaaqG\w81M@ca*X<HC
+>F<^B AHnKuNSh=4pw!E5ILXS/!wDW/dZ\RweykEnphFK&Mtn^hPBwQhG4cRmuchIXenab&^?^=lQG%<WyZVKB
EYm$H+ $mKKQJpKt5#tMeADbRZR8WI#b$V\Fq&T=Z*>GF$!C:%h&e>tT#<CZp8$Z6PHX%Lp:GCydpu=QV!i+Hda
FN=cdS 5&tYKCPl$dJGZHlQN/@eXZt5GXGMSa9cZh>6#ZM$qX/DTiC@EC9<cD1DFtjX1PW4SMG>D\I+YQ:u/&!%
PEp/Lm un#1aJNR6Xp:wC\Hjl?el/\^X<FAtS\hBB+MnnQ5@d/d6Epkd&W:XlE/MXiLqJ!Ka9Rmc>B<y#ZQbBTi
&hPA?Q IXJt\bPTEcw^m*yp<Mh4+F9?dQ9mGZm%TWDaFIVb*lRGI=%FuS^MwcGb1!n<BwBQmkV<ETtkeNeRCV<N
#F#8&+ Ham%8XwtwtCD5aD%#<&*Y9NT*m5^T4k\S%@FkDq+Z9bF$X/C5RLYDc$\F5lDB8!?cGell*YdkJHpX+/>
c\RciL StTt&B#VtanNn6lKekGC%kyb8/I@Zt%58#k+tl$TRY:N*:Ztcd9ZW+<RRl\dTjR%B&9Eu%#S<8B\V@Zb
hR=G+I +\tBWn=IF%ZEP%TPBA%M^Gi+^&Z/w&mX4FD9qR&&aaypydnm%%9#YQjAXN/!MJdnCpZ6TYSQR<P?ReZn
QCZA^: Rp%$$iNlw8:+FSBJQDyTk$kP8&jX=Zhi>5weZi6:#S$5CMtlqa9/!%ayHlZ>aC1u9>ju%C%bWF@5#cN&
6GQ:u\ =15%t8yC@D!VP@41Lc+>#^JZ#!>H:qYn:GDKX4cq$:1MqQQE9jV&F\mFtSj+!u@qNcn?@w@M@4>S6Z%6
eY+S$D 9*$L&HQ\Y+/+q5miF\KhqmlGy?QX!<tlBaGu:AHhb%Pkc$JT5D&#MRt5iTWb\%kIiTT?>iwN<^j@6PSB
THBjFT A@Nk/q:Ih=p><pXwH5e=%IVA<iq8*18X8/!*q=#1*yMB>^>\DPyedIhGcYBQ#cP&8Y&bq%S/PRMCwFP!
Tu6<QR lEVT*tG%5&aCmnlXy<6KDRjQ+WVpae^RqL:TmE\Ej\FwRjeB5a6p%8Ie9VqjAVj#k!9\$CVV@aZcQGjC
j>&:y# p/WkQHW9R8V!^V^KIuJ@qHT*LENFthML9>bmbhG/8IBLjS?$W%EuX\+I\?Xc#DnHR@8$k6\X^yB=L%\k
YmjNw< :\#$bGpRq5pBWI6\E&YF<?*@!I9kM8!<WyRqjT&H4elBNLJMNymWEeL@Zi++dnbIHPiT=??4i5<HJEpd
kGQH$q =FIBYW*tkVjm=I58Fq&Y6IHtcSFyPl4LhMeePhuNwA\1XcQ8WH4MV6X=9#d@?qMc88!hi*/d6uKV%p\Q
k$!!m$ \jm*e\/R$Mj^B<5/IWK/d?Sc5TmkQmTBiSnYmkR/V9RSmCC1CWIuwy@luHtD9Hk+9#!T?mA/Lh4VHdKa
FNZDA? b8Dlpw6TVp>=bn@^XGJ*AiH8qJ%^JQ>WRAHkBeAy>>WhIL/c1wP6=^yPRPRhY?:**8/Du4SAShBT4*Wp
n*d*nA *%I>GElM4I9%\NLw<wI>6/C!#?1qDB4I88MTeE&/ZBTwwKIPc/ATqEd=9>/LJhAQpnmG*qb6M<H8^JRW
XRb!Ki !qwwqHXNWZBmu44nddh/\WmKWLaPLnq<Bq?$YRiwS\IuEkRJEj@Inmmw*pHHwDQNpH?Zd6>TNFVmy?u!
lIuNnj G9p!aeCX@tTT+E5@i!<X$hpBdD5=a#k@&DDEK4>q!NhWAcL$mXM>jN1&q^%\bS<Kh<IdBJbjHZy+\d=w
h*t8pW ^D?:JSdMCun<BEN*XHa+iM#ARLyGmjK\H14tbHHYDERB!P5t=ly+MSRNT5!D1Z:1Z8j6$SX6h>I$XdbE
jwI%@4 \1k4N8dFl\e?IZX!>S9jPu*TpC/H5bkJEY4GD1cdVPdK^YYiIa@N*=@M8wmSehGDX?RFBG5%Wm%E5<S$
Zm#@Ay nYKSTG9\8Ibq8=\eBekk><X&BmSkLyww6jlV$NNwD8N@Yw?<J$<h+YT%8k!+tKuG#\jkFnanF**tTDeD
NjpjdQ HZ>JwAS+c1^&LuHB9NRTFK%eQ*KkZE\lXacJPMhX+!W4m=b89\IAik?WZkEa&Q!p1Jky%uw5eW$1!cnX
>j+A@< SNZ9h:VB8GmqFVW5+4mBAHKFl#QTQHwH$1PkZmS@qK\GBw5:yiJ:V1tAnQ:bt?e!KKwVw^=I6CF*WkSm
>Wwccw FDy:JCh9AqK8C1C/SJyRKpTB+!4@X8lc*LiN!B:ed/l<XI6+6FNTGG*l/AF!=T=6Zi8TiwP@%?cVRapN
mHniRL QbePYK+V5MHECEL5ledmAMREHc/bF&W^tJZAjA/WKmdt*^NqK=L^:B$6NHSWiKh!<&m\dcjD^p86F>Jl
LDpHWt Iy++M6KH8DPW&p@GM<+!l+<ub/#M1^ApkW^^WV+#mC#C11ImR*ace>KS/tKw&X&6ETWE+VPkk@<D4yF$
aPSKhd 84@$X=QJwuDmbb\6I:Hy8<\uq!Jee>4BtEMq+yJiMD&amwa+A1lEelwIuMJEY%8M5m?a%^yMHHDwYQ8:
cTb$=^ ^wiSq*R!SYYY1X4e>eEFwqa\8dcI=><uP8y=%lm@X@qy4he6n?c6Ay:EnJRFMuM?eN$!/KaTAQ4tc$c&
T^w#C+ <@>8>l#X=W#D$ED!LPIEXCT!@JMK*R5W/j6ie!IC?q==buqNL:<e%YZKRWD/4d/9e6Q?XM=u&#kSdVeB
!/a^\E M<9LK+I>:G?JjSRy6115/MlVJAte1Xjl5P%tB\!^Xj>DCZKy#1#6GHi*/+ckpV&Gk6j&K1<ZpltY?/j>
\KiecC uKnVaQqXa8hVe\#:Bm?1+lJq%9&8k!DIyL@mA9@e</T?\^J$SkZ9tj>b49Z*#%T&Z/QVXL:=pMLeNZ/9
ncMRHM qEa9QtXbQ<JH/D@8YauKA8y!W9?BC4THN69@>G^9Wt9mdyC?c@:KY1:1wSHFMaI=+IMFw>eJQ5Pm@99!
!=n&Ee +Jy^<$XmF1^899udXHqXt@:@=:G@>dK8NnK/N<^<XMlHI%$JS!>y1kaJb&6%AP/Q:H9a<V&P8NiP@L/1
4ydkhF 9G!+B8F6h8T?nhuh=<y+F5Me<>/<=YNIP6q6cQV4aaNhWT*ZbhjS&b4pI6X#Pp:BTDB#nkt5%WiK5kcV
>/hE&% 8cY^A$V+X+\HX$IRwn^8hZBY8mD6LXcj5?>Wn?k:ek&@@ALTcw!kG/kuZ4#TT+JMnYWFJRhhW+iB:!>u
L%D4HT ZMYNCNk%KCDAFwn1BQMq+XQXGXp!bQ=ZKZM1nl?VacaG?YRi#&KQF$WP+KMFQX8RZ9=e@55eEiLbh!4*
6qWc+I HVXAiE*/HYdH+V9I?Z9Hb^QeWlil+&uZ<CWS:Kkp+mELmVVj8IlG@/:w@T/nQNi<dC\GC#JSXTwGLmln
nR/F#Q >^uQ&We\DX%PW/l9lP5k$yZJ4Ge<4#JmZ#Wp>^cL1/?i#TRJ9VS<b:\$jkjuq$84c9$P4/a9>?lq@cpF
<B:iV+ VIG\eAukL5ieqQhX*ljQnMn?LLylSBJ?*w^mYW14Y@kNPk:pDtT@$<JHAwpTCD4T5<w:KT+y56+:LX\A
?Lh=N$ w9KPm#*ZiklIKL8b^\^/6!MVW/ye9p&dFIu$E@q*Zn=?<ByR>SPcXZA\dHPYnS%%mtuHcc68T*&&bcaH
w<5IQX kNWy&8VlEhJSHM>bMkY:KcuNyw:cdK6#9$h9KHwVcNhdt<CcRt/#@RP\%&\SuYFXD/da54@RLi\ewQQk
jTDt\b Nik@G=w!#JVmyw+c6XVWN^&*yV4d5uLj1auDD/%aX6HIe^a8tIT\VY$&h5L$j9a!%#94EQc?\&*&@n6K
VJcj45 YmPhB/@6<JS>EJ%1b\9nXE6bXpHac+Gn6w&!y#a\^ehM?T&m5@9H*5M*MW$WEQ%&qAFuVGjXLdbRF#a!
Cc?5=P <db=!5bP8N*J@k\hF*bH*uSaqa:wDKu^P>^tb16#j%:9$y=6::eL@IH*a46V*4L#\Pii<bTB!t&H6P#Y
q@/k1L HZpP&%91uT&$4@9khZ=Ci1W^L<k1K!/=#W4HdZbGhGb86aYm>TaI$BcAa\eQ5d*dP:+e:w+#w4I@d\jt
W8SFZ: hSaGS&A/5%6Mb%?^T&=tH%Huqnjpq5bdh8V8H9#MLcI!<NTJpdjX8j&Yl?<Yp?pM>ZL<NKNLcGSnb&l/
EwAY9j q>!5jpTh&>!SiV?*N/ujeeePWhtXQ&@uTcd\D%BpKM1nt6mpRZqn:Dc=&bXH$qu9bwBWn/\n<u8dy8#Q
Kh&pa! *aHXWZmlYPp!!kSqNhd^uP%Tt&$/>?@$d8y5J+QWP^ppP&pmP=$HAlybI$@b??8En&R*K&cJtK&FQJ<5
#&u^RV H!JqbLEIuI@ebqiW&!\Q6#w:Y:V#AuS&$pei%4G**QLk6S&i5tD@6y&D&*c&h&6up&ucB4K?A#6M\8e&
NbRy@S bCtuHj/^4e+>P:&dPmA*/+@8QCS9&qc?mC^?*PJ4<wnqFyh\<ybZkce5GuuKHGqbhP6PhFMuj@kYR45m
Btwkw! L+T:q!G#$VhQe4M?*Y5ne:8@Qqab!ua#TZaa4G@1uP*&w^NqKKPDmc!Rn1:5k?qe%8RTA6Xu#bk$*M%S
D8K$A4 l1$CG=ttmn!<9hk+R4PLc9W=?81hQ^BE?1/dtMpiRehqjdm@#Zy*J?S$HDG=&4V#@WNGCA!y!jS*Qj:t
q1Al99 6$b1=8%&:dJF9qJ=!qkRbb5T&nFBn^@56949$Hu^+J?CRRC85dN@!t\G?@Ya@*y#<H$P9!TT>y?aF\Cq
-A9/bw 000e62ad713001202b3 Page 309 of binaries1.zip
/kkPNm >d/Nj+C@G6b+lFe8&ZE8QKRdtT%@j<YeF%d!&bnuIBwj4j5>bkW=?^&b>Ye&@Mc&9#Ec>P@?Z*/<%^lu
LN%:#6 >56#5pl6H:$EHj!mN^u+//%>ua9kZX5?kX8/FbSE*NPnt91Q#a>M#Iq<<qq1&M9:&i1<4hV&4l^F?&&e
JLF65< AhXN#kBumBh$Mn=VVZmH8>/a<Qbll+EJV#eCeyc&h?9yRl4LJQZt*=?^<H%1I^yHDBP?Na49\jH1EaTi
4tiFCY ^!/5w&TIl\9/:tYXC9#=c84Mjl9/@j\CjLF!\hXHedThA!Fp$k5NjCC>5B#YMq&DqS44aAuK+nX#tR*&
9h*H%6 mwIXcQ&^cCyL^XlW1Ve@D<9:<$e8eab>YQ\D/i?+XKTPY?d!Ic:DRkjI$C+L5WMm^KFE^8Y\p#^>XakR
CCPlHZ 4AtS4e\VZT1Wea^!51/nWk>IaMCbBR1y*5=+p1nmYT&T*ew?Pm\=5db&<%!%EIAiMF>MZyC>^Q#/JFwZ
<Mpal1 L^*J^CPQNut6LHJKQ/jeB$!VB^ihhhZ+R6qCBmpF?5%e?W:WXRJNm5L>/=HL+?td9XBl!4HWSe^/ach!
PAH<&A qHXqZ##LK<8ImT+py1915>&aNIlPZZ1FWp#$hJQtapJ4@cl*@NWhSuHq>ka=uHJ:^^68:^&m::G#/M+/
?^Iy$T Qw5X:G^Siu^tcZ$FD^cpMcBiXku4emY58&ZuaK9VciiM5C/Jcq#%W9u$nI5hM$uhQunNMdE1u:lTi#i*
cB=t:X wQd?kJ*/+S$/HC&4j6uN$eln6$Xhh*<=:BDb*d=D:n4!EaZptW&:EPXEqDWbtSwiA<u\81T5IWjtN/Z&
QCTbZI Lt>B:j*?P>W6P$QX#hNtTFtiD^a\VlMD$duFauh9%P^\&6&?A<hhy#S&jjMwIQpQDk?WVpGWcakZlCKd
Vpq54V B?:tW&4kH=B:PcQ&:ndW*qjIXPe/h==%\C/?6YXu6>hyhkRPt5VLPjALWc4<XD:TCZaI:S=ly>pR&6YD
:k9/tG yp4L:+CiXP#R<5ua/wF4IC9HPeA*F=Hd8:5X6@eH$/EHbndXSA5b\W45u/^Ahc56I4JuSe%P=cIh*n6#
:Qi&W1 M&HbP4&d5Y=HE8n<NHLb!Z\/I&9Hk>jC^eE?1a\R8Fh!:&/Z*H8<XNjy#n4t6q9$npRpynPZDCAV\=k5
&5^pGb D18e=Itdi:k@c8!6d1J+YGiL/c/mC+eTkB\PP8*cPSCaEA+RBP=46!j*@tA/ME4B:$Gi^4b4Rabjk1M9
EHBDDX &mK>8%?Dm66*eb9PD89hDkim1:JttcH$+DXa>:BjTTpPh8@1F8#itm#*b?$MyRm*^1aMGlalbuR$YQBR
P1^\Vy d==L>:Cu6LZyyw+46i%\QYSEnJRS$bG+N\lF!qMmyjlaREHb9cNd5H6@MB$d6XD4<F5=BqG*mNZ<65n\
IemEEh ^1i$wec:dcjib5MnCH%!MFWT6=1mV1iGVL^6V9Hd$*9@GV5hBp?%*FwlP$&:YIdnqm%i9E?5l^&Y9N6*
A/yd=A TI^H!=*$hX/I6NjiH1LWui\ZkXqGn9*AZ>plFd<>9je&t>%6PkHXmK&PGAekY=QtW<AyNh>jPcK<&^@N
C\5HKM *4dV&/jp!aben+Vu5$R$QCS6l+8n&ZJ&ACy%?:b#$L&@\LGN%^8Pd\DHh9n56n9%I>#CSC9#I1Ryy@Mb
e:HcM/ W#y8<hZqLa/#%dEn!h:htp/piBTHIIZ&B^wd/A@@htK*TMXH^8@>Ma9LRS:6lnn<!kj?ZG#upRB8h<Q6
WB/ZL! 94%#wQQKqhi5FSHK*I^>^HRdq+Z=?4Q!WKeXc!?QVPA*QpDL/p/QbMedb1VEA\^qn>F:eHN@&wTY+CuV
NV&5^4 +I<hM$HHj%wHKuF>b&B49cpdNBc^\SYC8nY:?FHG<1MV=t@bu#d*4bXuuEH^#mnj>\$tXkHA>kh81&Nu
%LRlWM PPX8P^?5#bi9mSHRA6qnde%VjRwMD@Jtdt!A@Z<pX@tRR94AGcjj1F$KFw/$b@X=8ZKhmIL@&<8%bnGk
5Na?Nn ?NmHdRNWbRJG:p<ktKAQX/WYSlN#JJ1SiY&4BGXX9=eIX^+Lb@uI*cQXWcTkYLPh4XX9j?Q!=l6>jhj6
tQbRdF 99GY?:ZTN!E@>KkPVdbeEMMKK>mjHLnW\<H#n$R&pQlTCX6YwPct4Yqc5ZCa>nwThb#RkH<bNa!#k^5i
XE^jch uQ^*#G5<SNCTpFRnctARc+LZ=n9%iEEPXQ9\:@V^H4@#!+?HBW>CIpe^dEIT:VuC^uZ\EhR*5aJ=4c9w
wPi*8w C#Pc?S^c9E=Y9JE:X=%e=+tCBwZJQa=#wuY%1HtJeu!NSIkG$\e9nBqe$nVtL6F<pi*EX=1#e+i:^ZiC
pHiq^Y JApAp/6y6uh>ikGa#q<pX?N\q>LV\4<HK1bGCjC5eYRYFAkuA/9DV1\4qG\$u8uRnWdyPphJ+hn%:lu4
1Wyd?G Q:6!#JkZJbNhYDGyp8NjIXVT$eyeWID&E5/jMuhI\EabA4Tai>@5Gc%^iMt=MhjtX/<yTh+1$Eya$kqY
VV!A:S K?WRMZZb^6Qbbp5aV>YK=t:TIdFi^T&4bXB\Ylj?$cI6bjlRd&1Lbe>J?cQ=tBbeljQyWt#An:J8cVla
6m\@Y% 8yTu4a+!/#u8VmT^F9KcuJ1Fj8+Kpw*$i/jt%:@YWiR6PcN&?QLGD8hCe/56&=$qP%Gah5lKTYC<\Y=e
NB^Kpj JGFC%P8k6H4^!m@Y#YXWFTHF*41=51HdG*y5&HD9QhiS/lELB#R/!G&dVYip&+Pnh6N=+IIT=F&JZN&q
#SB<p# D:dnGQaR6GmR&FEmnY<5PIdk@Wm1q+FWd>lt&B685eX!!\/yu8J%6#9l4VwQ9L4ib5w#H$Su>\AGGV^W
5D:Yj@ 4hNmm&wQZwAM:HyZK8&pt+/=Xihn8N5b8^:DeNw^8^%#%1G+jiACyEW@9cLb@RP=<<+/b%8ct:b5hbli
ERlt%q =@n&16cj:p<PX59ypX?M1YV!>4:TnBS:S/Da8&Zu<PGh5c16m=5P=XdehCjp8BZu@6K!A>8lI<:d/k#N
1n1\+w :dc<9$:ty#Y!y>K&LTy*quZ>KmQG#ldb*k:#*8$:%ReXR>*l$Q6#h>R^^hljDSJ!iJCXlG?Hh<>%IG99
%JGc*\ *?uh%HppahPd66RQ9G!HV8@Q*iqR1DhbJVZ\aI/Q:>Zp+>8l+H8@uZnV?YBm1A><Aan%Xk6H4CihtZTY
pXqi6J b=$qPuQ6#JbuY*c?5=1NHhq4/j9#Si<jwJC*dF4Em>p<4Q9tih6pjM$n/#BR?1!HBWy4%>tKy^/NY\D1
nP&YR= KXN@=NlDq9en/h#<uR%JH:JG^BSF41iuBdBycA&t*8Hq&?4e9>P:1jMII/k:ub@@A4NN6:jD9ii&%A@j
\aht*p <u+/twXlWjBWchCXG^bJFNTD4nl!n61Xh$Iq!QNnYX@Z&XD=tb$R1*I!d*?CEP5@/:e=>Vb@Knui\#?@
mw+XM# *T++myb&PnAclDwCTZVqGQTa=dbnut%@et4G!P4&d$Sb9:wjcWhP#&nkd9ZHby?6?P9cZ6W<4B!wablC
u4a<Rp y:b##N%c:Wtn4Ce8+61dP::H&WdjaT=>n^ll@&nL5H91Pc*GZNi^KK:G=SZ<BFp*TKwu9&L#GSM=+A&c
nk#!=b iT+!8nHt6w&@Q:#b!6QMSyjPatu&9XI$/dKMm6aSCc1=y>Viw#%+R&&+!c+=mBD!P:j&8WVmILWAHZS:
C6VJ$P Vbd#luj>d=:TkGJ#qt/KX<QK5<:K5@W6:dIuY!LuS:65?^6uS6y:#bqbiY!<5&@jiS84dt%tb>dmTKFP
lLKS@Q 4yE#\?>uZ$1t4j%y=5!:@M!<&:Zc!66bdd5t+baJX<mAjL+lS&4wd^q!Nq$6#\=#+A=npY#u^&4<eVi%
=5PLEk >$\XHG^+&MH?db&>J*@>+k9ACbHMX%4Z*PdltXqH1?9>YGy*1/WG6M?YKYme&YccW*X!MM@&yHwC=ESb
h:5c** cT$IHBF@I^8bTjHIq81VK$GmYWXXebw?qyq=qilqKNQd\Hk:I&kZ!hJky\8Ad9:!DHtqEV!cuTlBq4dV
\1+>dB <DncH5!BeEacdSEcchYG^XAJYjDcD8j5l1><!cpHDSyX$LW8QVheJIYl&G4*!QSTyRLHB+PAw9kHbZy$
W/J?Zc >JuNa$b?SDR&AnW=!::APh5QntWV=eu&?QtD%^k?q#WVDBPpHm>VS+18%PQPRmPu^p1LN&6l\1uLQDHc
H64jD= waFY8<=CC@yW^PmAPSt<K>k!A*6/Z5N\1^EL>/wX1$Zu<lR<X#1/RB#ZI*<M>:MnGcJahdJRKe5l<mDd
TaeARG bKa1e6pZq#j<l:@&^WPX#qbhEi^Q+tkk>*m\!#*8V&Hm/G/PmB\h5JJQ=>w=w!nj/bDk/c9kb8K*$!JA
?Cubyd MbLBJYHPWWCA@Ij=tJG=p===e\jWA+:!ME>t5!SLTLwadyMlwmS#nJLMh<4eSi:aD9M+eJc!JR=Im6/X
%VhQ6V I\&=K?N<^ZY+&:YH:&am56P*6J&%I6eR#w/Ce6nJ#GTC:waM<ia6G=4EHj=DFu$bCSm=ydupNpH@Vn^I
Jp&/XY nC1LWeuWWbCLPhYMY<dkDM4>dHX89&Z5cGacKJnq9KK+ipQb?VG!+dcwEP>Z485NMiL:/b^^IXyYajBG
?Ww=k: N5chLd@&M6w&h1!JjF5i<4QhHutH+I!V=qX+m#PDipAqMLGdVE/C/M</h4n%Fqm4P=TII>Z=YBH/dM5:
w>1p*4 9t!Hh9#&lPTQyJQi6IZW5TWKVL<TMPBIC<EqP1Ju?dTQ5LNNn4nD#5k6th9!\E8Xj:^Y@9G#CqtPth!M
iVdJ#@ Y*bw!l>by/??hp65S&G\AD&SCdYM?BqS+kjwtDM?SVD$KFHmDqZnDwZmA>h&tMl9^XGP88d=LtH=4V4N
kdCtHD \:jRIeh5HNcWYl$Ew1Q4ie=+E$Y<*Ld#*B%/^Y*i^G*t^tbu!/><$R+y?W%$=iu$cN!C*Y:ZTe<P5HP$
LSmmjV W^e@8BI8>&hB5JIQ%<$Zd4Ew8tYRuZ1:5:Xq$T4^R?J4tNy5iB#%%5m9cQSihwnJw!*K<uJu!\jVPYY$
j99ZiK /C8\*IWB<^@MVeTKn/^Da5Xk4Pi*Vi&+5?W@:#tZ<pXH=9B\DuP6PuZl#>\=bl:+&p=eu=X#ln$!K1%F
9Z9SPH *^+bGHj@j8#td?QaF>W%:#kiSX@i@9T:?m&1hKW%Q#Y*N5S8dDK<>jQK>J9QS<LF>j9>?%qKm\*m^j&D
CKk!N8 8SdjWH:HVQphS$yGwkG@d5&!Si6N+EYnd4&L^1%61tuA*R+d?MT^4TNmLL48Fej$RN:FJ&mk%G!^N&JD
%6JIJ# qtcb&@L$TZ*h@P+b8YJ9N8!L/?%QH\e1t9>8#wKWb\Y=V5%hF=YW>d4=jSawQtZ5WLaQp<qujhqujhpE
iLW&!p Q@>!<1dJ:Q^\hVL$$95$>&@eky?:J?eth&\??e+*9Yqu/&VuY=hq*<9+a?<VZ#jXnZe%cak#8y>#:99u
F\Z8\a J^Q?hiFNd&K:l\@q4+9w!d>L?C&6>*Q<tX#?8b@:9h?V>5wQ@8Dd*qcYp#9&?DQb9<!j!XZ>tS#M?DM=
%*+8>N 9JM@p/QH<Ye!jSJ@J4MQ=<@E@\L?VPcj#b@J+n:?VJaj!=@JueQ\Vh<p=:>4GQ/T@E\i>h8@Qbq<?:hQ
#cYD:5 H9*&6/jyME\iW^T@@h69ie9p5i?VH>u&8B@>$Z@%4::6&!cQ9@hiHdXZ9IL6QY>?M>5u9Q*6dJ<+tZCQ
Q5=d6\ J>%:L>5u9?IXdJ@!=ni#ji4d*<:&ceQA>8tVCa@$ajji!@dDZ@EK65>+<=9bQ9Q6d&j:4GFk?^GVCe@+
wT&lL8 pjji!@db4*kF&+>/<=9bQ8j6d&j:*GFkK?jkqZ*$9ji!jh+4Z5H&?Y>?M>5Z9Q*6dD>tGNl?:C6iMiBy
ea&nIR j6!d*<#&+>@?h4cjkJ8VK@=EZLZ<?!SendR9^Ftp@YS<Y>yQ\h:T*wjj$1:8=e@pSSkHcV<X+!D6Z<A+
=m/I%K TQ6mnIP$u+b^pQdVMR:TjkdGRh4Q^DlI?%paB&p@G?Mk:X@EPEl:Q<bB&4?EebD&e#AP$u+8^pHc#<M+
-A:SDX 0004c2d64e6001202b3 Page 310 of binaries1.zip
BdCwpp TQ9=GAhy9\DnIP%j^nlI?^KMk:SjmHGR>1WaB&t@/N=:?aV?C5bD&9<D+!H6F&M<yQ&4\<D&bSkZGa59
nLdZcN \dlI?/WaF@u*bSkZcd<e+!L6Z<P+TQ6!nI8$HA%y9\J*I?$4ebZT9kyuq@a4eZSy9\4jp9dX/Epd9II@
ISL6m9 p/@G8En:NSkZcj</^pQc%&A<yQ%cnIi$Z+j^pQd4MS:T@k&Ml:VjkQGR>4WaD&t@EiMk:i5\D6K?H8Mk
99MXT+ :S5tE</<d<J+TQ9NGAhy*+l^pQac:p98<W&+V@u:P1=D:9%9+u/p@X5aB@u*6:Fh&4?D<bL&Y*D@$9=h
AMZ/86 nJi$j\@*Li*j^@Gp@Ri+d&u@V>!*6Q<Z^puc@^6ZL?*@k/8V>q5^V6J?G*=L?\@^1dVlt@p#?Zde6:V@
B!*SI8 CQe6:V@G%W4:Hdl9cj<J=wFe\*jm@1Z@b6!@6N?F?=j&@<XhTj6Qej@T@nQ5L?$@^#lI?>$aB&u@BicD
A?FmLe 6N?D?=N:@X:MB?q@H?=Q?6?QebD&B#AP<8<HMR@p5^@CPEn@Z?L?yQ%ZGDhyj^nnIi&@^9%J?!MaD&q@
@$BQmj FPMl:d@BW=j9@^nGR@w@n48R>6@m1enu@\=uq@=Q+C#T@u6<K8%@\ClI?^>^F>L?J%!%6D?J1=L&y*A&
&?H=48 cZ<cS=Q&b>:MEbqEd?jQ=Ge^L6L?b+!L6Q<F+!L6#?E>pjQ?QMbF?9<X+!L6L&BeyQ*Fi%WT@SLGR=:^
I/?8a4 Y#Ai$4+X+!Cj@#iMk@S@GiMk:h5\D6L?C5bBY4=%$9+1^pHcZ<M+TQ94GAj=@n5\D6J@APMk:aMaB@u<
Q61Xeu N#AP$9>NnIP$9+X^pQc*MR:T@k:GRh4@n18Z>uh^qhL?D%!X6Q<VS=H&>#AP$9+?:q:cQ<BhTj8H8Cyy
LM9Da= *+t#!9u?CEiS@48\Xhy*+#4pu6?D:hL?MV/X>4*+XLc@D#%y@\T@yj*VH@kBYWTiPIqj^y>J<q4?VNJ9
4cqJ55 +e<p?\:?VQJj+e?p?Hj<tbT@\=>J>j9<thV9=5@E^Q!b&Iw@p/dn#?TlaVk=pZY&@Sj!<@*jQ?ui^J@J
SSyy@y <cB4?R$?ueuplFe%tb#mR@q4nb:</@Fd&pF@huRG6pjM?@qnWbF?HE+*<@!H+GaGwSp<>KA5hNXWqESL
?iWWnp qXD!h:t/nd<P*n@#8a/>bA:9YpQ$V^q=^HbEJhmKYBj4%KnmTwnZHdbE*kS?wiCRR!#X:#EZK%8HZ9Q!
=<:</E a@M+Mh:T%FyWYjCKEJydFwcbKJ8NCd1?jp/X#AI^LC&epnpX:Dy4aRyY6kqV^wMKiQ/1yyInGqda5ZVJ
MMm&14 Z/44ypm4=18Q#W9pLEpmb^t<XSw5\L?HQN#TNuu5L^j=pGXDqwKE!&awEYM15jLCAi!bR!TYt>mcaYwc
A*d1nc <M/$eReGBXPqwiEaWSeEdZdX%HIySp@Z8NM655RHwiA1um>b/>+4RA?j#FI9CJ8tEw8WYZBJkHK&5C/%
=HNy1Q hKAHe%A5iH<j*An\R<HHjE!RnE\h=D:^=1y9PDajLYPX6tDj!dPwdXFB8BA6F=S^!YFTA^IATtkp?1S^
iV^JRL YYD$9Eki:V&%ch1WbSPmFDhyt*aS!Pt4hLFe?mGe>FE\n@%=PJa=RuZTWG/!j5$^uQuGk^NBhN&u!u#w
$*&4+m b9=m%TI+FjykEp!V%5e>F&tHC8KcDuLVPcXZFmYPk1J&e5qW\GW@pEti1$l<KHcM*Kh=NRuP#XQAPtNR
I1Xtcu 1K>NY*uKTh\YchlWR^%WVbCdJB4t/hCb^>eaSDiYbXMy/kmICC8Q#9c%b?6C4%+baApY5n1R>yX!/@I<
hKjM%F b\6=mMjtH4uYNyMNNy&9qmFh&cH9b:ayquE\D?X=HMwEVk4p+Yia#YIAHFuFH&&t$1thwbhQby\biqGj
dkWh1L d^p!866YZ8=FTF69bBm$cHIW$bRBV$hLyqEMuD/1A8nKJMcWSQ/eNVpi/CXi9DE9iklnB<!u^$\8L=eZ
6LmBED jJ@kKadu5P&T%9&1WnC6e!AcVV:c1&S?T@6WBLVmVcXj%4wGF=I<BZ/cWp+<^>qlE>&Le1Vi?qK@XeDy
F55$iS RSJJ@6t@eS@TKypdXeHY=:SkJX>KE:XnV*HHa*&8*lY#@lPDk5QIT*#XSemlmkY%!P%<KAbdcXk1#$RP
iky^1L GFq4#ABTd+@Dn!5hWBVJ/LjlF16l8GcRt8CTYbN45\c>pBbMM6>\6/*V^d^F^Dhb!cMEZ5CZQpmV@TB1
FXMDeW bPaN+dIa11dw=$?m/I9<iRa=8QVuC*ql/lV+MNT:Y!SSw&>Ea#!q/SQJZe%\&T#lclyWCw^5@e**D&$*
XW9@1p %QC$qTmuLw>cJEcJG1BqM+RbmyFETbJL$+dDIBN>!JGSJqhb!D+ICaZ+9nja6BmKnAd&bwV94wD<TllL
?q?Xby AVX$tcB!pH!aBwMu:>*%J+4WF9HZwncqVpK=*%!PK6eMAT$V6e<?Ct$dbHC8Y#ncIbypTLPpcpV8NXGA
Z^N$W$ K&pHL\Fh1IqKQAnZ*n*IIMuN=j:TZ<k4KKJ1FiD=%ZL#<pbe?\l<E?iGDPe:LEI+VSE?4?KXLBFDEXcl
l@T9n8 QA?AXaK$6!>I=ttek9^RyGiBE!dVXTnC5@CVSa^ZXN@W5dZ^NB11EyG1tb\*cwd$MMN=MBn&t=<8h#>W
V+qjM+ QD@pC/M>HaW/nmDQ5a1Vhy=mZJ<!qJ$uh^4K<=FY4m!RI#ilnAAT4!#!\FGK?Z^b$Sh#KuhjLPJ!MNF+
&AKTXB >!JV@BKXnM5AW?#c@WPamAV$Bq$yIDQCcClp@FHJFtey&mLIKE@aq@YMV^84cAbJJW?>pZG#>YCCeABW
+CM%YE 5uIVQm#\k54Dn8JW:>/WReA/Kc!/LJQ^&pYb4HE5w@1!R6bVANiVcTIQVGbD*Qpym?REK%tLdBkujwwe
%=BA=+ JP#QhV@lT?LFTTDQ9jLTSaw$X^u%FWjjY&YRun8#9!LqJJjyjdu9/t5RYId+lDV*!KyWppJSnqjlDX44
FDQnbZ P<MiSY6J*>8EK>L+%aLJ5EcqKRK%HRW5m@B69?!N?aKLllZ\ICkW:\CiaP!#^<wm4ya+8\^\4qZAmNIF
wJbR56 Cm<=w4LZu=PqXm/m$/Z8iR/@5Gd1?Jy\>Q=MI6aW8BCdVpF:F/>@@5jT9F9?9a9@8E#j/4P@eXGb4Z6Z
=cyBpi P\L?8SM#y5Kj$$4c/:F1B+VwpYP+a^HE5+@J4Ijd1Nd%SiQ\HyTiS:Z81bPC+@H/1$StMiGZqF6ky>^u
iW*eVi PYI6Yhi5l\6+I1ipEbDiHDIJepc4WT16+By$iclGN%^B&m+1&MH#?ql!&+Ql9pE/d<Nk5IcEc*N>Jp6c
F$/@N+ &$ITFVEpu+tTQ6n*eJymQyjq8?mDn?#pNawTtZ!m>6Yb6Cm!K9yTDLL>JIkKZ^dhA66#ibt<Q9n\JJK=
6JQJ=a ZlS^c1JPn=5FIFaNCp>thB+AEW#W1Lq?4RpZYilDKBVVAInhNBAN$lN^F%hDpMn4phTFZ\A<Y+kiLBeY
a4Lt+6 6LaRcTGChjCDSq1V^+XwMXGT51BkXaX+9h1kKyd+uuVp$&nlN>E15HY!KIbW*1NWZw8+Hc=jK:11TI6W
IFqa%w LnMEdbAI+G\aSGE1$TqE5&yVKy$m<$YuLWVP!%5bl1WwwKJ&bDZ&d/B!PNZIPMWVCYGRN$:JMqWTiF+k
S%Gte+ ^&nqRw8$qw<B!K88Z\6DL%=tdVHpwjXE%k#6Mq+8w!FCbAYTwe%\%klL&S\TLQeZm\!yW:JG!=PW@j&=
NFl\R6 mBLXEBE81&X*^N4nFdSY1qKp1$8#N591KkT=jwcLkLaWZd<t@TSB:dJ5FiBIMB^pdbD=+Gt>8BDXB4yI
NWtS!D dm^1bi$em4V$SE$8p1yPy9IFEbaX>uYmZVaQPkc!qMnDcaw8^^%+ci6*5pHG$i9TWK+Aa=BE%:?+TDJW
#ljtdY !=AS>?R/ERwKEY?L4C\Ck+mj\bP&T+HK4GRXpeGS65bCY\^DFMwXbYI4qBD9LeS:m#yYHbA9wV!<j4m:
=BCi%5 #P1lVKM!LM6K^6tG?bD/4Z=jNFLMSD@6SA%Jy&unLihq/c?TGDH<K9dVSXAZm&W\q/Y<nGh^II8N/cdR
^dl@y> K+AFV!CT1@t1LI:E1HEC99VnLJAJWeXH4R$YH4+u/&cbHkR&Y1!Ka4u!wtWkM>%Qk:l599piqP:\!ChQ
C>:l4p Vu*IB!CEEQ:\AJuy1+5q8dJQZRHYCi64!qcEAX$yXmMC*yi6R+u!aF18E!\KjjZaWk6\8n*LG5aJp9KA
5hT1eI ju9nuSBDStWVZmK8ZJSe?/mmyh?C\L1nH1WhpmcPKp%%+R=KHZKbje$ciJyKP%$G#\/8WR>H<I#Cc%@t
d1Fc@e RjdC?kDQQ@<+JYE9=jGc>w=Vm>%ui\^n4Lut8EDHH8Z*CRMiul+ET9NFtm*t/Q6HWp&Eb>KH>d>mn+Ht
ph5Aq@ W$n@T1M#y?c^V5L4YLmS$>8w1:=i8uE\i59n:jXGc#mhc^1*aq%AK5aN<u>?@VuAD#eT*lK&w%%NB#Pu
C?*=yM \#MdJ>4%*!nt4j9d<t@6R<w@tyXNadLLY+:*E#Z<^CI#<C1ec?^D=9Y#Pk&C8MWa1?mF1Q<EWZ>E1%:M
y5w65l SdSV^I6w>?IkF\Y9dH%pK\biKM5ASBhE9ik*^w8:Pk1TEt9DNIF5dXwS#e/IZJ8DLM:FdlMNq6L\&L#l
I@X5?C 6TKDI&<SDmy#C+BS1kL=>Fp<XM6\cNP<!:\p4=JW6B=bIYISdtqRlZIYK@K:Tih%BhtRBQI!mpwyYt5+
MajMAc y&*eRnX4VJiBBXTWQXGw=h^N9wl4&KX!dyE/EEYn6B&qP=Vlym%E8FhbIhwtqFQId%!nuE8?+mXyBB=*
Ji#MJ? qHT^wP*\&pR$t!!9bNtwS!8>yyVBPTPiY+SRKIi*PLhw6X+blM$wb^5b$!Rw\j\hb%lXT=HZVXSSMSjX
a8nBSD Euy>lMLhYSF$Iy>Fk98hFwL^E<C&t$apIJqMuaiA@yS/>E/Itq^:eu!>d>>Q=L4q/8T?SZKHZh1X4Gli
+k/m4B bn/$jEl1iZwmZ@GpGlpG5XDp1ep/IF<$BpAe9J=Xp6FepahY=Zb#*@ZRRl5h:%9YbqG9&?Ha9PpdIHM^
SP@NXN RmY1J&cJ/PIF6G?P?TAuEcp5M64\9kjME85lNd5ip1Wyb1AnTGW8%+QdD+5bXl\he=k6e6=EuwGe8<N>
b6MQyp X?CKn*JukJ5*9Mb$wG8XA^b^&EFp?>PmTeRiCFbb+IMXI%$6Rk8VVh+KPXyV#cF<NEpkc&5?FEi4My18
#6XZYP 1uG@&q<F\VLq#ae5RGV\WPFVkc>KhWa=>:H>twqBFY!b5yMa>Kb>hRGCwc<8We1m#9aXK6D5>m#lVAF^
9hu8#+ 1XaJCW%e>e^HGYwTm^TCWc$AY\c?LQPhCG:Wl=JjZ:hH!T4t8llFnbh+Ym\G!PaLkJK8^=LKi^T$#kq\
MhbVSN WG>eHT18*E=>jbjYbDb%#yK1eknS?Y$F>h?VF!Hy$mV:JK$njRiP4>XY1dYiWNqY6V\bp#/X#iqW@Siq
CuK9uq 8VFMtte@yFXTbLeCu%yY#+MulbL>qE?^Hw*/+@4Q89?H4!qtJ*Wy>&QF5GnXX$5H!pR4L\Bw@Met&MJF
!YkEiI Z$SBKXh5?\R$%&W>w1Z*kL%FG1@/^/yI6G^bGDDqFPBRi1m%AQeHX=1!QHY8wH:$HiMMd%!/$c!=YMwZ
KqnNnw 5\Z1Dc%S6M#wRlJ%C@lFMBM\?EWMbCq\%M?T4*mLDlAm@B<H4EQdyA9SiE1@R@/I5iFmDp<9#I+>6T:p
5D\SV6 1m<Spt9MG!>YR#VQl4=iNVcub!V$/NtBeIK%X/Q+pclhKILC&l>NKP?me?pMWQycnIwTR5tVdy+B<p#S
Ny+pN8 m4Fw\c!tl:YSeT^JMFVy\YE:&94/l^6=9W8a$?p<<EYpGGuuMbJ>jNG9SLRYe#<JWFY6u*?8VHQd#qb\
VCc8Hp 6ncFH*TLBJu:eT^>t<NyKqM$tT><EV%Nq6u+5KD8mT6Iy+5$EI8mpGWN:kV=I@Dqyd@?WuyncSClALJI
-APPEH 0007e84cd57001202b3 Page 311 of binaries1.zip
nPVSY/ $!CY1=dZP5GcpFw+5p6S4C5kw?A/H%yp@e8T=\*lQAIGmY8H!CZiK>blEiD!uQ4$TYcwS6iPLB66EWFn
4%%uG+ F1EuE5wD1CqM/nhhWBj9M/*en\?ujXyWakjpii4bCJ\kYXtZMD%E#%<5+bJK$://#<4uNyI#RT$*8ABd
&*SJ=i hqC#VWujpWmJ/e1V#pd>:4!\qV8$YhyAlT@pKPj#NH@D5ZqTK*bVt+y>tHcwNXJZENJm>8hhNFS?C+>a
MESp+C Q*\P$nAK*4!5i$P:!KGR!^hqtJ&CLYIb1+@IYFunbC$iQ!@d1QY<$EJlN%pJ&\Qu1iVe4^ZnK%/5WmP1
tBmERG hD!QI!!ETiK*KHL8m$whNb=MAbuq6q$8+1+E!h<eHpFS4jNm/w9PIaaQ4EhEF?VFKPjJpB&qG=Y:Y^Xy
=Fcu*h X@mlJ>bVi^SZaq\t<V^9Zuh5Qp\tPd#HRMDZqb8aLNEP8cT%k#*R!a41hqV!:dNDLqaLJTPMjuBcH$C$
i&PX59 <uuT\Ai%9Knd&Cn9tt?wIT96jcQV@1<nm+GF:yGDL!6W^iZA1KQkH6Y5#aawQ%*/$Kn1M&X/kTbh!6l5
ISuBR> cbm%a+84d6THG<Yd%PjtbTBBW$%/:V\qy%8m?Y1n=i=G/R#6ic>B$qb@J4L^+RFFtV*d</Ii>Pm6e6ib
t#iRe= @K5lS>@:5Q/nj+^itjP%e%C4y%nYE@QZ>1nlu!l=Q^&ZdwFRSNQE@d5<+yNA^4Z=Y@9u^58VadFiaT^Z
$BmaAM W8m:bTEnXJm9P?@E*4y?EWb>NDX16WIRIuQY!NuA/%P#d6@SRuI&pK#D%M\>pW#%GEaTWa5kqF6!Zn5X
@6M/aP aXi15DM=/ptc99qE#Cy=yTQ=DySCn*SjqKy\uLEwk!ckALCQSEBHuY:w%%p*n:L%1N?PukZ16$P6%pX4
DY:dPq Z9<NI8IT9B<RpeHTn$!!TBLIVPt4GV<VITnhXVcpe&qu!!lj#e6pJR1u@C1t<!cjBdbaBWM%u=iI\wqq
nAj5l/ K11buApJ88:E<yKueNVmAR:RQ>/\dLwE8q&Nh/EWlhkM&VIci9NZP>HyC8VBb*Ti!#hFq+e@J:ERB$Xa
5/Tec? m>$9j$Th/Mqm%wlaRa#QFNkGbd/C#@u5uy51wBi$pDjjD/HdB9L8%^CdEJhXmC?qIbI8tnJa#lEBK48&
BaIM=9 S8G+WMYj>A594MRm!wIp!$#WqIh#1K=me$BKmt4hyZVB\e@SdJ$:q/ji%=e<WWFF/l#LpN5pwVnL+b8J
#=a\Cj =RbWVN1/naatGRPYjHJmV=RDHFakASQhQ$^nRA!VVFSq?cD\^ZCA9baQH4S+DZl6l4\y5yyBPe:Z#4#&
TDBbZi 1&ZBnPGAkG4QR1&yTMqRdqj5MJkX51DH1HHXSHH5V^MEjQ%EJQJR?GW^F$p<ZVdS\X^PIWM5#:lJX$G<
bT4DqV dGG$6PH&pEP4HVVy=CH#%XPnwW>p9hRNF4:V/6FIqcp>#i\Z#SN$Llc?+&wMV+=C/LTiR4aNXJeS:C8l
1INDGp d>/JpE+Kt<&+WERHw$Lp?16u^Z\yhl@nH1#IaF\F!k5Rqt8E?jVNyC^e1$KLWuP%88T=NbKJ$JL%lW4%
IQGC1l &9lW/Ma:bEip^Z%An/4tmq\ZT5!JwmhQXZXdp^@We!KIySBPYjF=W1QET&a?EZ/CG/=M=pNWVhW#ee4N
Jk:Qd% a#ZuCY8S&NNNNWDXCj><*:+QDBK^B9\R<K:GMt@WaVXBdq**Gw1nZ$PWZqICcB^RF1?ZQnV8DHZ*KdI&
X8c%<P w6mP$RR+>VE$#WdKwqTwYM$EDk\MSRP!aAqC9RJJyt9L8yEnj\XC4QKwQ^LQ8KAF&VIWdDWB!SR4*?VL
Z4YT/L iVpKXaVj@K#1:aYWkbLDG6TECM5XQtL$pPtqPWLcmckM%A%E66t9dVpY#+cXq=Rm1n!+cpW9BA6pkj\D
\bPb#B ^M*KnZ8&ki>SlNc^<cMk>h1kp!9&+nteq/BH9a#MXm@QI!cH+k/P!qlWmmT^#K5RtTd1^MjKXD?cmW!W
&^6pVh !\lTWc9q6B:t%>C8awliI9Gn5=i15ZE5ykGY=jyia$JWm8%El/t!BK?!1I=l$ab\h+kEV^le\a1SlkWK
JJi896 b:XGH=je4GmK4GTj>i$#\N4i4lb!*\*pDiT5cIc#bXl6Hyt<&1Ga?=ZeL8mWl!cE^*4tS#K8XhKuF?RC
dG@iZw t*=aiBqEn8nnIk8>aya%YcwML%>>dJ+&al1AYQBIc6K&4JduyTJd\i*X^wuHq%HG!^5m$YLwC:k:BJ%e
/?npm5 JDIcZKB!>#bJ$$AENe8n6Kqn9@R!D*pLSZb5Zuq5Z1DtQSd%iLwEWEItEEEktcnFmQ>G*X^tCl\@<PS\
dMnP4C nbkuld\pX+1W>cRncD>Z5QBmqF$lVF^cEa8ctAdq5Zp%VnTWjnnWeK^pLTTqJ&1p#LqKBQ=RAk&N!lS&
wA5?lt I/ccIlI:aRD5A$85L$JZR&VI5IBF41@wiFhm9\Y?!Q^n<+ZH=mJPB9Q4kmklZt>t<N@ASMLDSQcj4heq
T>#:qm <A@nlAuuAIY\C1iIhGSYwF#>Y9RKn<F&?iDajDw*X/kQZQinnABtZj?i1/j&LDTSi!D^8cAGJkJdJSDn
Fau:k% //w%V*^InY61b+$<?q4Lk51H@%NZktj\BGaEJ^^4Yt>>R#?h&QiMmAZ:b>u%a!?1e>mF@#V$%t6eHT<L
9%@*B* /K6ESM4MAm14P6E8$wFjD5kCwRWe:5jZ1m4B8\Lhm!y<yYXAnWd4KiXF:y>9LCPRwt8N#kZ+S/kE!:Mk
HE$p@e DIL+j$RFZ\CKM*lMN&?B1EpJ6aa\F8WL%pVkw/Ad>W&e1\&RlhPVbZw1V*LbeyJFAAlWFMq*FZJEY&XF
5AGBZj kYTV1C9KBE/=4Pn%Hj4GF$B^18FlI>=F*ti+Ik6%QBIBJXLKNNYbVyu/cbBkR54AQYRPpJ?Hb+=Rim9m
iQkTi6 FDX<aHQembpiIl\u4^mWNdk#bj%*!9Z4##XqH<!kDutw$=DLdh8&dY^jQ::^8y#iLu4<m/W1qTcB1:S!
G?LYeG wh<Y4/<eH/<9$1w<?B8Lqk8A*Ee4i1VN^J#GPmC:iTFAQwM@ESZn6jeA8kaHTXYk=LnuDCKe$k9kXV+&
:j\E<6 h&FaCMawWCqC9n^+p$WDZ??#SiR8IhjGX6cVNBH>8X\pWT6Y14hMTHpb!VmFZw=ahBuJKd@&dm\?tDA$
bbt=^d +LtGqRWI<ET%KTAR#bK1JKN=FckZLY+PXM#Qm<B\VGwl6PYRB%tRmVXRbHt!KKP<TLI&cc9Ic@N$AcJT
&@/wlP ?BY1L<X4/$#Eu8<C$u^de>T$WJeS>pN=lNJN#%NHqu+beBdeqD#L^+h6GTK8B!%cSp$Ei=tJ>q1LKmlZ
M#E>qP @mW+R:h\$DV*6n%pnwb\G95HCjAQSSIm#j!T*E6i\qcBJH6/&ZyASYDl1NKX#M+&c/#<QSSbqT&qV#TE
D=HZNe Nb@XtWt#Fu*wV<\F&ce<4T>lkbhbnDPdJpXA5lLn<$paVnEGdDJ6m!Rc&8W1lB%nktpLn*Wq\@4mnmC#
h8SGn+ Q#GZt1KX>Se9JFk&dWh+t+>dKmt9nlqKWbTqMycnm*$YYY&@RC5du&eY@DpuXC\5Y>n=@WdSa9qZ6\e$
88Q$yI 8V&kJm9WVAaa1n+\L5Tnm@BZZ<SJAAZh=<uwtG*A4\/dnX=h8Q1R#K#XnEj>5h4>CwRPnQDH<*&Fct<c
V?a&kh FW?w9<MQ/9@>y:9&uN4taWu@AwM+Nh%IEC6%tpWp!RI:Ny=/=Hi<AK1e+Ld+FEBNwnCCQ/lTVKb<8<8w
wi?=^y LKKMK$#$uN6qS&#u$VPG1JBHdP#%=\LeBEB4JZPEkKEGdy\GlpYLJXB$QXGBADk!jkAJCw*q$=5NRkLF
YuDTZS yky\\Mn*C*C@DTTKNjBB6cmiJl>AZ<H^5e#n?PAt^ZbAa1>jW@!DIa+BMX%S\#ARcGGpnZ$1hVp>*mId
:$:P+k +:RtVpJ5MA&inWE$6EGcBGj6mI>At:AN8pR5$:G>@6Wn@pHcI&*dceD%1=nG?9ua%?$\*EZuFPP8Ik/m
*@?*T: CB\?Rp/j8Va>c^WjAZYAPAtb+:uIF@mlFVela%CHHWhh&@4>6H\/ImHtdbGYI$=mk+@ad4P#hw\In54W
LpkD^I ^6^$:jX4R^+&^D?MPIm#64qX9!uDdLpwt$lMd8Ipe5XHnDmJt>5SH*G:>9w%^V?Ae?wS66=1lnXP4wA+
Q/q/I$ mSEjec8&wCLywG?*dHEFI@+BAcKH6<X&u@5%YhkYhinb#8EpSu#Edh4SVZ8:>91%Ej@\TF8bn/&@FFY+
XbSYc1 >IN&H6RnQ8J&:ecJ/=!&N@hj<<qu?IhH&qa8CD?pS%CSmI>+?G>#1>@ucuQ>=TQt+e@T/kJSBnAR#Bat
V\FcIX +ud6!AC$X/5Hh?L/!Dl+#j:w=YVSRu8*5:@%M^ZY%9WNX:IS@uDBEnS&am?=4<Pli5ib#%SnWEd4DJ\+
FVJ?=@ =J\5e%@Ytu$8A:W8wF54B=aH%EEaX^85qRkeXmeP=u#4%YuNVadp=qRq@#ie+4WVN=BQ\\6Ebc&JM94K
P>9Pec AeKCQ/%B@B4teJy/1NF?WXaqD*Xp:/Zhyi6Z8Xt@IGH=V5wHZJ<&u^86uL&Gp9B/1D:Q^jyVFttRp@\E
&*C4P* cRPXm$#DH$nPdP5XLYwT!P\PASQ6#ChS1TB$D#ln%BaJkDiYNa45+e&AwuWI6=p+R@mN1GuPBlk#>jXJ
\!u!*T $Rh9ACnQE$Y#AynP&Thwa=\VlDRi=kI+ie:/+^T!Nq9GYXF=MeB:TZuYQ8!jYPBJYcN!BLl==QmAda8R
ViV=q# Ek5cwD!A/SwHy15W&EF#A8C<C1A>>LhcGa&lcm5FYc\AGRQkA@kTBZ/\Dec?KApP<IHRIQkVB1?VP!+H
Lt>64B YTwanWyKB/a#I:#nA:YDF/S?nD@LByWacwiJ9q$:SIGw<Bay@RWMHnD<+Hqi9%a5bpEbmWC>CW#*khy!
c^jIWI KA?V\en?w86HtYe!BZ@e55YXPQAHA&tIYu4A/6WE4Cpw:&a\*eQcd4e@FHGYhJmS<ptWSCME=Hd6CAFy
Bm8E18 =L6R$Aa91b8p=XQIAM1VCdWLy96A4T&RwTF9b?Ad>A$C4n#n4h5NEKRM+mAD8%N1Eam>j5%VWJ/>GW#*
+AnuS^ kh4N8\BETE!CK!JBd6iPTBCV#DymwBPe6&!??YMB$mMwD&GtLWDhB&ylwZ!+4A4/wRPEQL\hh%=Zq!AG
TT*EI6 1:JE^w?!Phc9ZY4\!yk#QB&eHpSh8:c/Sd<Xm<l>5GB4NpC<*RN5+CNumGm5tm?cWBRVWeHXSaEX@BNt
%KuZ5> bD&8Pa4Fd4q%Rnd6>Tdi>=#iiabPFK=6&Zu*=pQuK6y$H9wk99EZ#*I$Vy%D*Jp8<Ai1wbn8:kK!B:Wd
&&++eq d@yM^Q=ZZhL^IW?!mtPqjENpESTytt6p<@ItkPKi5#<91p5K<Hab1XQCj!=k&=y%l@TItJ!6iePnK%E8
<J8e$E MuJLt<C9pQ!YHAI$$Hm>Q+GD*KSLAn/5l%ik8pEE#**\RnWqWltkY5j+ylFna8qlFWyhVpGpS:c%D<?X
N8Wlt= 5iHSIpJmmAlH&Z:>E%Hun!WAlqJMj<n?Mww1^ayEPw9#p4qdy6PITtVlwYLtRNQZu&TGCQXTWEi4HElb
nQ9e<1 ZY=@Z&!&lu$EHQA1%uIpFFdYY9WAln8aCFmE=&#HQtAh46X?k5@LLk/A>&nKPE/Y<yJG<:u9w=TF:<@>
qVnncc E8%m\j=<n6dt<!YBc:t@+CA14KVG=\ZA<hhGtMkncA%dYR>FDlcXk=MRYSF86iqNjRen8X%:@iWnVkRX
/EcC/\ S9CI$S>d@^b>#@hZ1?Ze!>PeiJISS:Ldyy6YeTS>jhYW#k#S@mYn?JL4>\E6Im6XM/JGQqA46\dMnEHY
I+pSqS DXAqSJQI:L>q?$Sdj&B#bMTM:LT#&:VAq5#niC:YQL^G^Ja+VIt&/eQ/6#BHh64ZjapmS$1#&%c*db5T
jwCyKe >ZlLQN@Ad+b1SJb56>=Y@:bt!YZn<N9!Y8@h%F=%RD*n?w>^KAi16QDehBX>L5b1$5%8/+*Ap#M#SBNZ
-AR+1G 000c9a7d28b001202b3 Page 312 of binaries1.zip
t*nPwK S4m#!9qZA6/!BhWaWY%u4dqFZ+R4AYIZSk9FGP9$?k8nTN#?J!i=:+Km!S%Gd!QB^>^HZNQY^#je\pKj
4cidI4 6TP:?X>\mM@h1^HBhG9E#Y9A&w#EQX\jGN/+>eKB/P1^4llj9&Re5BqZmNw6$YLcdIu:ByV/8ut6F$lL
V#8&<y A#kZ:KSRHBjLkLi@h^:Pje&kXilm#?1H&QZcFYQV@SkBhXp1H1hJbLheEHRyYh8L8m:$RK!9#We:@JGI
H/9/1L k!VVhISkDq!EcYj+q1!b5c?ACXtadKW+SpANeSmwy4d&QAB94S&M=#IaCyyHbSllPdBqH8H8bbu\tPtq
HBMiuC 9uA=YJDApTu>py:Al8tpXtRJc!+AZRkemka>?LpB6XQweS&l6TmV:$$jK!bDEB!pR:ER5iBRkDHE9*\P
KS<qhS NCBmuYmHalq4j<EYCXcjApVhIkmt&eAkl/<Itk+IG8q*9t8J1EtGenE9bTpP+nmT@aIG@i5jy/C@8ARI
FB&Ia! eNkCAYwd%Lj8B*YhL94=y+Rm!/MlBWieBn\GB/T=8bWL#$SLl*6hAVpA%KB@@hGm*RNhGJ&lAM81p1WB
D6*kB+ cMA9a!6>V>9c6hkP<Cc<1tFd?tpqhyiD$h!8HYE$hcbw^4E9&4uD@6&MBj^A:VkN!tVlEVum\DT:dVS5
Vhj$F& kY#EqyQH:<A=I:lGypG+TIK=ZBIRkXNFBKK@*ea*6jkeQ9bQpZjJu/d<&EF1SG>!:Y=jL6lQmYlZmE:y
I^*Q9d IDdZZ#BGiY+GBu/k66iM^^jKN@S#B/@bci&tJhAKL@aI%lu:**^S$aT>8i4<X6d%>:bc<:C?/1a\F@Db
dCPc6@ SWZd>PanSkVmdn9mdS^&b>N@BWE%P>DC>Rm5&VVYnL&H*E1!*4RZhGE==d>#C5AlVHB\eEH&H*<B@8l@
D%aAky 6quHJ1^d6PtB<?9Hu@Hn#!Dy%^Mt::k%!^m*:LCM<bQ9jNM:h4diqtZ5G$9HM9dRbQIlq4EQ5a^>mGZ5
cJAZpT R!^nH&Ib?^DL&Iha^9/@!nI&/k#cQ9q*SnYw&>me9#Pcw#>tCD==#u9GjY/AIMP\DmK#%?C<jJ>Lj!NA
ApPNBA :5i%iMiuFh^$R!8C%tPX\k8GqT\W1i\kacnpRVmMX9/\/Q\<nMaKBR6iWnH1%6ne*AGV51:l5CPM$XSS
E^NXFa ^CSDV?86AI/PBJaEYTL<M4QiKlJ\AKV+DuMbNhqcWGt@5RJ@W1VH$1IdLwH5!Tn4=WWy!Fa1FQ8MMlT%
$DWe<i FZX!1FKj6aylD%>p*ZwbL\jcYbDwlKY\G@BZhC&+Vp=a6RQZ>qc=jmA/QbcZ@TjYQBYqJ9KA1j!XJThB
XSYAu& tcPAGcJ&1KVphdBt?8w9k+A/>kA%5qG*RE&/llt#5NmnktXQNSdyhYLtpLMDy$J>>Rm+E*jP5cwi&P6F
upyeY< G//I9jwNX8W\1GcPC@<?c%/D/@L<JVB+<6iR:m?>huwIyA415&cSDKCY4KnT=ZT&twQTIjZFNAVPD#Be
>pSFE* 8S5QFjcKtqd/aIL>Se:#/^mqAa6\GDG?klBqLHy#F+wtbc5AiS\%DjP!IG%*bVyd!nYiDX*%L/*=Rw=h
<m\mH5 :MbP49F\+SY4GhE&XSHEcSd+kMQJPM:uTdKaJbXabCDyCiJwwKXQ\9W\pX5B=uj\=mkaXXY>jT/QuaD8
uNtJ## H:tMVS8#4naATq/dJZGA&1%c*k1\G<LG4e!84pJ8=^%ua%u>pDZZiDB@Ed4B#Kb#4%nPCQ6Jq\jV=ZJ/
QnA!$5 5AA*h>FqShGtCW#tI9aD*!?GMpR%AuDKk!&iMZ=WR9F%LQtMt!LkM\c#Vy:1$\i8a:=@8Jwi4NL/WD&*
>dk$Nu H85$<!a/&j91PJ:<:k>a<?J^RLWkT6Mh^SG<KwAqXbtjiCm4bblPu?BK\%BP^ZKDlbhMF@Ie4Fc&Z#j:
qmD&AI nD<nL%ti:Ny<FQBQab#Y5EQ^>N*kMG&5YE:&W!T@\VKWJ+Kc$nXi%/+STRmKl:Q>@/M%L>G4=l*Z1NQm
8jYC=a l*WSh*mEwQX9G=8S9S=i$5Pyi%Zq:e9V?TIw+EK5YMtlHKIC6aTc5k&bILW&#>%/d9S=laqYYAH>RS:M
GZF?l+ qlpL%qXb:M>Z!:pj6HZn5uI9iIu9>@FFj++Q4dpKwiGq1X:q9:jt<:at4>FpE%QVP&d+hFFjnV8D<tq&
dj&t8? PG@ykJPy8@LVwqVupWquC/@1qy$hFJh\4Je<Z8dY=TPIEe/DIy$uNjIE\!V\q$5@TAyeM5V$iT?NV+P>
am6w\R YD@lVX^qBDCVCaeD@LA%u%%4SeLTKnSCBTShiXW:u!:niDZqqImR\SV+Mi19N1$ja$Ie^q:DMenTIEBN
QLL#A9 XDkRSV\@t=eb6D4K>hawY=8LJAP?6hHcM&CNpJeGZN:HJFX*Rd>Ve=W!PhYuc:/*AqTWBWSQqS!Q<dS:
MYJT5? /<KjLYJ@6WmASM>T#<9c!pNS?c4EK?tHkB<M=AD!=qPW4&cGi<6^=aW%>W$#6uaiQm%wi9aGaV%A!ppM
tbd/a9 iCklJXhaKJ*CyVj@4tdNyenXZ%IZ\ct=F<XCWIMBtXwXC1KETI?FeJSZ5E=Spd8NR&5!XLV4ywp<?6Kc
buL%95 S&*LR4#*Z8e8wl>Z&:X=HPhkppRWV*VjyDymmNci%8i=eD/1*q!YWauw/eym@wYXq$>PE$/QWwlFI%e4
#i4SB+ J\1nw1QE68F1j:ba#8RFHEXlGupJuIZFjBuKFFmGbIq:qHZm6NmIW>c/\iS@4My=4%KW5$#Y+MAjZ=Id
%16h<K M1cQqqjChAjVDCE:\^GqGJHN*&dlPY1GhuyE8T$m?F=IR/VPbAdV9p*VbLqK6BwYq=*=c8XD%yy&j4lM
Kwh!5< M*?J+p:tV4j?BVwVN@M#I*@Z91+NHAR=:b&+!uk!/bSGd#Nm9ju:Sl+/1&qX=JuEiMp/Y/DYCIL^Xti$
IF!#!c Lh$1dL$5hGu8qijXVbWn#mlZw?PX=F!=m%F1@LFemd#YG?F9:6SnbJEt8&&GynhjW+1CqdpRPXQVcl!w
I>#+iT \?NHC6hC!?STb:Bc&w:lZB>Liy5/@aX6>Y=binjCZM/m&5/y8X^t1h:=&4!5%HNqn6RjHA\5teRF@Mct
wYkjXQ P6\i8N&aqw8IkJd5SaunQ#SZ#mS^yk!S<m1ZHplL/^Q#Wj>h=9YEP8icRj6&4BwRP=*^D=!P?Ihc/j5\
9$@!4B hM4wj!GQ=NZ4=q%!Ed>9ALF?ImL>j/4:wdTc@QGu<pi1c1m%Q@II>9lLG1j9GDiT1:1E*IDcpKDBMGeZ
epMYAt 5w+?RyRbb:D5BDhN:?ENj4uqjh1jakG:L+a4p=Y&8FG?jEqBlKnG#yHml<46/&wZeA#J+nCyn@uJST$y
X\9Ju= iDK1/D>qhN#@#lXZ^JCTCTmNS1YqXl\<4&:h&y\&Y56CbbkYJD^Bbk1?SBY:5XwT@kTX+BtZe/W?%/4t
j=t&ZH !lu?y?P>KFqb:=!YCwPL>u6ZtF+bGDKhZB&<DIwWq>kt/8c8InN1Beh?Xnbcl$!F9WPjSKjFktXn8K$I
=X%\Y> F6R^dbYjFI?NYE=WV<G!FAB5B*+GZi&hEMCc#!V/#=wF%kAQ8eyKZ+YueL/j9mA!MPpZ4^iXqlY5w*S&
MeLPRY qQBQq1@$+?W!^bLciAHC8aE1&^BT/ZSJ=dPSBZ!%YK+Cn^Y8l/ydLiMW6&qq$X#NF#QY:PLlRGYH?\j<
:^=tb1 Y9=PGHE/XaRILdE:PK>IyCjc=V+BmX1VDeAMY<5Sy+8Pw^ahDSd=jp*uk#TumhI?iEGtd:#NFwGSq=ld
dV&CF$ SGRWYFcwn%GEBA5hiFVkdCP9WE+SqJ8TjRaL51#W::!1dAQw^HJLe@Dn#EX+%wQw@Gaw>Gmuc5?S8iw1
ZaawLQ L^%qh6Let6a?%ym<Sb&nTw9yDbF@EEV6*IiG?VMjL91yKHYDT48/4PZ/*byYi=/I#mHuGmj#yLiQ#*Yd
HuCpMS TMe<VbIWJGQ!SL1M@IJ!9XNS>Z*Wc/iGlh!!j4lHlK<eYlj5Rbh64QEkd59\GBE?FjNS*l/E5Aewam5A
/!j#A? $:4teZKRCBZNpA+QJX!?#kJnATV8L#*X6kuKAcPPE\VmiHS1/I%ek/:Q9Z$m$AP=p?hRK4I5dR%up!4u
lb>uJI iE58+>8$Np@NW<qhY/a^Xq#eK^bZXji#JEVMpnJ/4VJ=a+kiTSMq1^uW*%yX$*6<Q$CqE^VCY/aq\&lY
9QWwpq =K85PDAcB98Pq$J=FL&^ekwb!JuG8+CeRWEq*C=n?Y&k1#t5F6EIEtwEM4S#Q\=C\#iuVeNYVDC</4&=
YaCyTC H^bIBPYk1cC$!#SNF9K+cl9/1XlntJpDJ!N1HGyb>4w=/<m%l9=TXGTMHP=wHh@NG<L!XeAG1dSmJk5Q
c@SQLJ ewVj>qZRnMedc6Rc*n!Y$eLn!!RTa:d9<?YDcX4I:jG/bRw5+5Cjb=ljy9Yq5%m1GaNZHw?hHht9Z*&e
W4XByD Cka^wSbbul\6cEjJ<j#JJIG1aLe:B8Yh=MadXEI$VV5<F8CIWm:iJIi4pLMYk<6l4u@%Yw&!Y5*Dd+Y$
9%kWm# Q^BbjLMl*EVQaMFLWB5C9q5p4N+KN+lF+ZN=b+$wER8=<+TD#kPWHb<uBJHaMJAHnh4\a6!Dk?$btQi\
K$P\d< RJa6FVEXiK8RHVHAX9NMVZXVi5jF+/DHaHJW/YKXiB^6VI/P/@89QqXuttlD1uA%\=q*A8<FWFX$CZ\l
SL>yhb 6k%6AFp5n/KLSPnK*IZbCQyS9IWRCc\@y9c6hSc^GqMw/k+Niw/!ZGT#L#$Y8aQHTK6RRl8@1P9C1VtT
!InNa9 w@nVlV^Wpdew^6\9:%tln:4ZbVJFPWH1TTJi=1uY<@!%c%C<\BlDj\FXyKV#4HyBMPiL8wwWKmGK6u9d
1KI@JQ !t+=Y!+QJ/8MSNd\cBqX#&6WY+PDl9KJqnP$YT^tMtyRL%9e4k!$VJawCQLlDq8yHmhjXtjVRK#IqM5<
nLW:BR *B<y/qbGu6ju>*liDk/pKIXiQQB!EZmNhPt$=yi8!TZHND6WTcebbtGVY/CEW>S6^EAnBX<iVlFndJGZ
b91=AT Lwb^AMdYm4qQ+^da/8Z+T8KqK#eYSwm1lM:M5nVjA+mE^%SpWK<eDINJMEYmT&N9>4ttmCLjmXdjDXjq
hZDi\j eZn^ZN/<l4:GC*mwy?bZZ!yZ8W!1KF:k9VBS:1X?uQHit&Ilan%QhFJkuGZP$+%EklMQ1j/\Vd&6LRNb
Gppt=V ?CN//9415%BV6qMVSl:BQLN%6+ALAw8#=/@wniA4$l*PR9i?dLuA!A^j!mXnZ6R*1pM/h1JC^wuX%lES
Vnp!6@ F=um:<@%FZ@4e?Bwt/?YNLW1$SXtMuqt%DB58^Cha1tV%BV^enHHP6Z$>jNFP@Bu$/NqBmuyBdJqNcha
!\##?Z k&<SpEN51NTD+K^dwLD:^dQtuIlqGC^YV9bSiG&MHuwHX<:wYwN?DNIBCqSH6&#DYYBQiS>X4QhS&=><
++5$l^ @Gn$cHunKyj%S/bq^N#wMq>:L+k1#atPRyS9w<IHk<4LI>1wdp6quiqmw=diCYm!%LD9BMkG6Y+dFyaI
b/Hq9B /jG\c8nm*Kp#qtS>VYi?Z6aNbtET4ZcSkpC%RkBLZX*n9*?FtTFP#*Y^jSTNw#=&CqWaTq8nNZFQYPqB
>SRPjc c+?BM9p<C>%=+\GANhdW?jF+%MD48l561*&<>L+1wLS&*wZeEydk?JJ?a$8y#5</%K+p*Ep%%4R+bdY#
XB8$Cd 5!J\4E$>XwdV$5KhYquHcyQbB^#8?C@$DlI>%6I?&XS5P!bjp!8<&#pjSnam%RnJ1Mu/ah>m@H?\TdQ9
dVbwbn cM?<^X!?duLb?bi&KuF@RT&&#:GeyGQIRI/BEt!h6B&N8tQF+AGcee\m*:%?wM^>N$b&:h+qId8mBN?^
B^&De5 RZYepI@wBwF\LIPuI/J=VmjXiiWH4I@h?B&V$tSh4i6>M=I#XX9JWb^lGP/L8tY6@FuGqbVVGinX%ZbX
!c?5%a >ett!MEd?$&X9nX9X!:5^Cy<@TIp+>C5^Zm?aSWNnt4t^$1@!IL!<w*cFWQZ$VnYwbuRAD:Xt#>&<BS<
-Ay=E1 0006f678d09001202b3 Page 313 of binaries1.zip
Eja9Z> eEB4pt\wtM\@BD=GGu8Ww#JFt\qJbW/c?iB1$cNWARkd<F1jNJhajNuREW6<i#P%YlY/lp?\BkN\D+NS
yuc<?A jm8p@EdDB#CSQ</VK14uDnZQheJC=jTT<ZNq!&$PcZmM99:c@Q1KaL1mnbVBEeyi$8yTIH?LPpd&WFJn
D>SkE6 IMT\tIP^NI#>IQb>Lha58/*nK%B+SY:KquZ<a6<ZaT/TPQSu!!BBTXwQVB%Su5/=Bbw4Tm6V<Lq8DA?9
QGVh5R %@u#yClTHpCEw@?S<QDC>p#tkT:H5Y\Ka%F8G4mG+#TuBV1nw<uWD*\8hP:qT5R%GSc>LJlP/FY9daR!
A*YW$i $tp<Y$I5A?m*#M45cD>BchHyK8nmBa=SS?q1Np</$V%qKVZlan49p>j=T^?FnJNX:JZbe6cl&5*SNDXX
L?59H% enlDPMbLA/\aRbaV?!:hiD=dJl/Ph8B:XTKcKI^EYV1TRwe*PSTDDN+:FK/S*>P$qkZ\CDXB!&TF%SV8
+Qk^Ib 594Bb#dFjJqmHb4Dq!4KTDhdRC<FcBLKASR#&IqikA11%/lKwPa8m+JDW^&cAwYT<SqWiumcbI+Zwkpa
qLDGc^ YyWmubhB^ZAAdLYW$ccc?&Q%J=aWXuHdwdK:6KLpN5peFl<?XG<1FyX$+SjDE=y\kT8X=^h49X%+bdMa
<Im9HC J!1:YK:<\cqeKkNqWahm$pQh>5p%5V%ak/dVm/VnPGYJIS5qmA$m&Ad:I<c\$je84\dNT*ZEG=dG#RG#
6#!<ia 4elpZ\:8cK1?:@mQ+j?pB^<nPhTmJu%<tT^VcML1+>i/CTaC?XA6<#wGR\XeuDLmEZ=y=iG1waZ=+DWw
1qH?FH Y5X15tkLqE8Cjq^pRc4tJm>TZdLWY<Hm$ew4^!*!/yd1k=bD!KCqYKHqm5A!ITc8F>Xm?EBH1uMIAuXE
milb*$ d&/JKl@eD9hn<aac=BVDy5#T5MP/S4iI$^blV54pVDLQc:8EFb4V4JP#S%D8>WRcDG%?:TPVDI4edJF=
q8#%@Z 1V^=QQaGIWeR=Im>P$?C&R\*PI:y&u/p$XGS\cNbc<Q=\5ieaM/%hPL=516yV8N=!Y4>GHu/e1^FEC!Z
IHWtG= YIK*#bP%9WeDA*nRnV^1Vm9\pLkQEV^<86^Pq<16FlpKVmQ8kF#>CkEiYmymw9IyQ*A?#a1?jaa<Bbpu
Tl+PE@ PV:$pJAI>Xk8aiq*!YKGKIycNlXZ1+@kE>L:KSn@<8P=4:c+*M<<ET6blIRc<bZZF%<yn<5hdd:a8mGh
X:q:/l hB=11a=tbWMHXcK\cBhZkn%J$/RIA^VAAkPIZGKX^pYWh9pR+wYTP/IcL*M8#eI&nhMwl\<nD&cLJGdk
@X/qk> DK?S9HXDE@yJ1jLBP4/$Sy?R4hV@nuHKIS&R\yP^1k$&!>aM%5N<hkmN%1M$WS@S%mPTPah=NeC=\9jI
Y4!%S^ yEHYcqC#y1ILl+BICHCMqPF5:yXyF!EE=A&p6p/>IaMHR#$Bip66N6@ju*eyc8LACbDKe\u\DMVR!@FT
am=RPk \mKnBY%lWmJ%GCakwPZ1<WmD5BIV4+CZES%=&imaktZdqHticYZ=^Lq*eq4Tw^q=Q#khbRG$yc4y8C/R
4&?mbP K=Dkl+eD^#T8FXRR^V!IWC^I>wyddE&kDP8JSL4lnZ@Huwm?I88D!#:N@LbkIYTSyhIkR6EQn$hMDL:V
QpNV%S qFbiFdaX9GR!+mD#\i/R*@%\AJENai+lww:5MSEe*u4+SHC?\QYZWZ!H#yK5uCXy$pZKb<RH4n+KC=1l
IN@<B$ AaRb1X#Hp:BA!F*J/!YGWwXV/%tKIJaHB@ppi%&WK^Vd?Ne@4?^k>NTln@W!uReiVh\=$l6CQ\/>9A%<
KuI^MA BydVlSnMhdyE!yG<PtFbkMlQ4Fp9tI6p<%1RdDW\Dn*EVd=?AH5LBIIYRy>nI8G*CGK%KWQcqPF1quIh
lDGV$Y aMK%F!!+lM9l/=$Dy<6=C*8G&hA<mSYNBK+VuCeeBqu%=GLi<cJGV4Xc#JiLVqb9@*AckFylhdkIc%EM
/%TYTa b55FwqkpT1=ENjDu5:p<LFuJ+ZcG5T>t4YlG@jIVF!5IpDJhHp*uDNQS^A8Ye^F:WEi<?PAwmjS*5&NZ
GFiKET mq1#/Ph*J9S9!>Hp*LdJX6Mk\1HZ!&jPeGV@<FCPY/ZL\%tT!\XM^h!PFkiJ9GSNIS1KuAZHi96nbj$A
5Z1eXd dbCG5tZpImTH\QK41/nQL*yiL94Q8u+eZA^kyeSia9Vy=$mFq%=?/8&DHXFiGA:/&u\1XMXe*9CeMZZb
6XI8Im 9c\1GyVT&#I8LjeKpT!48$Yk+aypG+?:>y/S!+FLjJ?ZqWeXV8KXVh*CDpZ\HT+IJHcaj*<BcnYK*bAH
cWyT$B XiNwYl<BabE41t:DZtVqG$bR#q86WNaNi>^6NAw9aLqeD#+XTl:D8pwL>5b\$GmaWE?l=c*:+ZKnpS\^
p*lN:\ 4FC>HB4>lec+KI+ec><S6eJE5ZlF1N4@p+5pe*P+e%wl?l8GpR#cnVFYKDaSiINLX\i<4Zw^JXtyAmpC
ikd$*i 9YPAS!wS4CBbVMwV&nnuaA=yii*#S15T!beSWqItat#ae<GyK+:QXt:9NTTBWMPth?TS^&4L>DWV5&CB
d$*PT@ 6nV9&1%Q^@%9KG69#eCka:h4S=8^h=T<QZ%<WDVp\$j>yn!HZ=N@9+?>*#a!YJ/wSiyjN<pYwiZE@8G6
P%9wJu Q91Te!nt$TLZmVa!cn&hy>uXnZqn:qh@b5H&#p+>c&HHhWb6SQL%4m9GGuMVuqPn<llGhXqyZEW@GIij
5d?c6w >8wF#am:5EtMP?9$>cXN^6!S5&ShN9dYZ8yAPPGSL#8QBAKH*bt@k6C<*Q!DCc^XWpSQh\^LR>=:6YQ*
1G+BM& ?Lqc1JwZId?WZhq%^##4C%yS=XT^knDpV&ATu<nBK/<wtHBLLAy>J^ccy5kM%JHM#R@DXVBc4V9G+&nM
6ak?Z@ t5*HKDAnC:R#W*5\kF1#Hw%Q#Bhu8+/Y:IXdhNke$\^iR5<1=pS5tVMkWt@&Ia5JimH^H%$=ljtqF%R$
+pIIkk Vih^YJFy>M\!4NTcuc8?yXC/JYKAkHMk\QE1&y^l+P^WMWP4Dpa6&Q*twtKJAR6aDR#pNMJZ$4J8@dq?
P1#6Qd ^?$GE^YdalmtpaL9aQupiB5&EBi=@EhDDW@m%1FeclwtmmY#=1*ZVL5+uKjB>BC^$G%4$P#a5LSH<>!j
ncjYkI 4FCTdkuqD@Wy\NY&pBYp\mItm!e</S+ZKdE6+/NFSk%tNp*KKJ+eyKaJX*Kmyq*8k%M#ZP*:><pkljMq
u<N&qB XK<DlFqyKwY$@kCe*D\H&qBD$dWn9t\\!iR\JEdRtq@/uMEY5A=LPG%qIQ\#E>BB#\C#HABSET%%mAK@
F?wE+w qj6AJeaE/:8MF54Aa84VjlYV1Fk*4\b?c?DFSMkT/:nFS?\FbFMGEXKQ<aqwwNwP<^d^$61lV5Kcjukb
8mP/?c Xq?SNac=81pDTeEdu1j1t<A699WcFFpAWuudG/8QIWSaiZIMb/!K8m5LLNW5Winp6n5#lNKDdq?Q+TTw
%nDdeq =KKtSVIMVbQ=aXPmtl@85^u!PQaeNA$?<LTBt6deJ<y$l8BT6pmw&w*RM%!<IlIhltedS+W:FLMwVh^N
n1=N\p !u%AT/<HSe4JJhedW/>lDJVSE*tQ/G$HS$5PuwBCup6TN^uwWDN+a<Sp^FCJKSk#5I*LLiK$c1e4MXSR
dqT5+8 QRBAAV@I!B6kEbtIcP@jB&Y6BTp=k>D%qkEPF5%BL<YFyeaNRP!BqM%=DBk!$ch15#m4h&$<BFQCTlSC
=dF:B& ^AV\h9mlF:EawqjRclhL4$CB6/VR<J+weymZGVI$EjaS1!pK=RZKW%mI\C+8GXqE%FB$pmCAp&Jhj^L+
:#Z=6> aB\Yh8hm1#MWt6t=Qec\55F&DNFc<=dH!Vk9XuE\Z$IZBJjMWD1:Vw/>uq*#C=L>mE+WL%iLJNiCFiyL
MayH<8 IG%JN6+EdIJGuwA%Ki$jVM1mT<I&!&m$mDV\Cc&GW<it1\XHtY>4lliD>Q+:R+/H<eR^e4T#lZNpDFjJ
y/#$8P di#SDP/D^%QkEq$<&uJAR^hmC6ZE?Z$/wlSmJMn:duhnpHk=Bwj=A!RPBn!hDGWaBCEl81m4k9GuM:Ly
LCki!6 /<@CAX#WWh+A&&LG%qA#d:1QZTV5&hPRV\F@\BTG>9dYT*^:t/F945taP@9N9R>mqtEKplDiiIYHh!MM
NBD1\j ZNB?DJZ^ecnXCDN?1Nw$#DyFG^V#XX1ZeB$mD%yMTa<8LFQyATn*Ge8m5?=nmMuaZC:Q\kELA5ZH:>^k
JAk#tS G8kpkBE6:<cX$VwEe?d4NQkHKh8NH5EwRLT^19tASD#1jhBYNMN8uBDYL#!b5bm<VEl6X:N\5MES*q+/
9^NLWC 1%V$K$6DPS=A@84!jukBua$:wp4n1=uQ=:GD?NZa5ImLE8X4j9EKVeImb?th4%XwjNP6eF=Wp$bNEdH9
>And*@ WJht6TyGM\/mN+WSTMSIFM^Sb&#P+CBt@eGM!=La1$hA4TjVYKca=^MeJA%w<*tAPGR>%Pitwnb+ZyEC
dRk//N m:/#eI^Ij?IFh^cP>SlycEVB?$WbkPWWLtCHmjdmSS#D4t$1YatQ+My1aSmLGJn=\YJFdBP5\u:&mYwV
1lc>Cb :ll%PCuCw^^nkk9l\aYuNq$h#JKw#td:T%TF^\H8+RH15q8J>dya#yby9d8G>&alq:/JSLwHYT9X8SIj
pC8t@H RNQ<me5$@&DX4e$LeRWHp/MC$HldSYwYmq%ZmuLqqjItFLVaEE\YM<@FGVi&uNJl5%TKKG^Q1nXuAk?4
8H#*N1 yIX1=E!IPy=>Y$!\Mn4^#wGB@R=KK*u>CcP>$@q!5i:X#D>\n$Biw^<>B:8MMeJD<G4/TcL/IM\=u:\e
4Yqy#L A$85N<:TY#PAiA/IcWTLi9^=R:Nudw!FStaR9X1FXR*G&lKwS!9^bQn\^4GwAkaQZbW8<+w/SkaMX4w/
544G?6 e411MSikH/:>QXET@jSdS*VlAaJBaGbpkIS&uYXB:56nQWi:h4dDGl1/j6k^DHbDm<1m*MtyM$9PLI&%
n*j%Ze /SmX8%VD+MdaV+u%TX5bEynjM8cFteSheD+P$m?H*WFaA?u?Nd*/nPPybqV9FQSGc8F%I@8T=wt9ucF+
VKB6>t \uAcpa$D5mA$h/jJ=QipiWJ6PlR%5H?CL@<Hb*R%!k!!46=yuqA/E?h9niqJy%yH@dniA*>m@c#M&ZZ9
#nLKm5 qu?JASj/PdBYIWD1KwQ%bBh9:MV<tZd??BMmYDG1:?c:pL1+a1Wt8?GH4iQBa8*ml*VLd=nuA\HL$tV9
46n6\V aTEKm^QIk:G+HeQaK&iX+/VTZZ:D9Ql>DNW^1a5&EktPGeT4%dBypDuFLC!CYm55hL%8AwMZecK@cZ:+
q^Xa?S qDQYBYNQ#YYmh^DWP*dSa#E#=VXq*wDL6#<FXluYRA#4bp#Dq?Q5G*uda4:RiAPinInyq5yV\:P5\A5Q
GebV*a >aAd#i1@KphCAK?tF$SL\G&M#?Q^$6dt=@eBw!>SE/Cl1+dY>6yeTWA$dZB@J&=ckAH?eqSp\bJwEBhY
K+?^X9 Z!MuRiPGMPFR!Lq&SZ>4I?56?NK=in!Q8XYLqcaD&SI$=XPF9Ei^:DdWybbec9*qe8H$/JwPFZu:QPJl
j!\&TZ ZaqX#EFD6+4e^T<4Fu+^X<XKKRkWlHCqIWAQ58ZWXelAQQt8$d6pY\yK+:dkG%BVcKnIne$buFbL$A#$
:K*\k? q\@NCc45!eLS88Tbn&65*nIy!nm99KI<kiR5$\&PEA5=AuiecXBP$X>4pa@la5Qme:@?BRTB4SJD\HpN
Jnb!9k yydCe=mQVAc*dL%G!^p#S$^D$hkNXeBdKlC<6mKm?Be>lCFB5I<cl:Wjt6:iCj5>1?1CZkaKaDhGE*kF
J<D:Hm ?Hh9Q6pqX!n#CHKWN5EVMjM<tT?SS+IZ#H4S=cpnk?=FlpQQ@?AhYKiYK&b<>jaiL=EFeDyu\LVMp4Sd
d&FeJ? \H9c8HT/w$YjuM6K$j8<?GkclCq$Nt^b#GV6^t+&V%dVlT>LTA&GHkI/9SDEW1IdJVC=mdP#XSk4PByR
-A$@dI 000b23c7af8001202b3 Page 314 of binaries1.zip
F*K@M< G$TtZZndBX\K*W1k=*lHcd!a#h9Cb!:MLQPDMJ5jLnN+K:D&#@4XH4YCB/?B$j4I+bNA=S\ZLM9b5B:T
1:6l4% \d!I8tWeRT5Vp<e#:iwkRGS&5en!NtcSiVFGy:+ZBVPpM^CQ=meBDAnV6HP@KNQbQ6C*5tAh45I!Y\TE
LM+YNL tSWJk?AYWbG1DiIp\Q5JAt$9TG&VVA+Tqn#eApkG?:MWMjwM^yawP98L6mD>X1%l:Al/<GB@:awMMk^&
Pk6A+/ 9kCA8K?HJ#P<IcdtdPGl9A^Ml#FALXiEAFhe>MMXWb6EB^GF4FkQH%<R48nC$A%#BtMGHPNbktlHD1eC
4Ip8KW ZAe6DBAZA%iNVQTBV>JVwm=%Y+wyT!D\h1cinbK51bQEYFmEM4++ttKKQVHY%<MiRpQD4%:WXKWd=uPk
R%dLm5 AQ9?jKWa6!^GYTwGQB91nLXwT*CW6Wq4!M<*b:*ZwQZc6pC&/*CYa!a*I>?ZTS!wSRTwFiwpn4DW5&m&
FCI#NM &t>PuY9E#Jw6RkXM:8!GF#D9<BCkQ8JwWCK^EhjbSKWP%N6PYcQnCdch4+I$%q5l9NjCyTbub%T$Ih?8
Scq&!P ZPNtk=\?C1bV/J#VJbu\NDDI$1K\X?XY<H+*#KH!tp&t%*dG4ImZ^5Y1EEI:&whCXa%Y$Hk4<6#Fypw4
ZXtGS$ 8p9GaB/QRi^8:W:>>q/VPC:kuitHc\X\*DZ6W/S&aeRIBIXMk<cDD&SDqhLKWH^?+VFSCPG>q8Zm>H9k
h:t9bE Gcen4Cq+hnEER6PwVieR1V5iGibKjZ!KX+5MQIdGw<ai=YdptXSqS=#DXtTT*+*KlpdWL%l#Qw*dj6nQ
pmub9@ %a\d&uqR>ePTw\JdEFDRB1AmDKi<K6+eC%Tb^QuJeBuSj>1H@jCNYC^!PuC1iC4CRqccLC#ycjNIS4!J
E#H6Lt H6wht=4\XLG4=C$ALuk4!BmqLR14YRYNqBpmpupc%5CBAGAQ>=Je=X86EXE:D<6mIbImMuLj$&qe=Cp1
EBmQ>T uCI\N<ecET#kFYuFuQQcGAl/JpmuWXWkNAnwJiN<qQ?k*k@#=PAwlWNL\+YFIyjQkKm+Z/A1PN@8p=EI
!LXR^k tbRcL*AJY<FF=t/WAQ1YpFwqGbW6Mq#k%=aV!hSA&i#tLha<HmG<w&YT#1h^%CSLQ+qZ$^X#P^Vbii<T
&TbTTn PhGGwd/nSbIm@$&ib4JE?cIA:kJE>&S=Y8nck1EI?9R4=hbh1DA+PymH>T+EFhD!WWLA6RCZ\6H$=wmm
5Bp5d> 9:<5!tTSXctI@HS^MPZSDwFy4dQFcm+CCk>Wd8M8cSD?dWw94&!EwF!P6hV&>VPS4JNqH9QXSEdZtF4a
ZJtl/8 lT:4ZBdLmnlW^9X/:*pqq&PA+We=i^apFM6?J$mI=d@8apJ<Z=nuFaGu*LT>G/KGw91K$GTWWJ+Rn!cY
GEtD/@ J^b>8dcem@=QYcjW:B5NqdBKi8<mkSh\:j%\&V11K6q\l%W#WLhe$4Ch9WEY1ei!$HFbcLd:X1C\+T:*
E!yeV/ +I:Lw9YR//S\Zc*i:wKV559MBTt6FuFE%ZdEDT&cm\*VYq&$$u^QVRQn*EduBCm&%LRpe\JnYbpZ<JqY
Z$W18K pddtBpt6NJRwTnPD%dPkpF$jFm!<E#y^NleFKNTERliT&64qQQXduu6Q8e$4l4@WkF!d%/idPPFI**91
^pB\>V +t?Z1KNbSkdFqNAk5&te>6?:wB8!t&l<18:1Iw4/Hah9:WenRdjwihdtMV@NG6IVB@X>>$dL@lp#@#/#
RWtIAK l$Gy@kl\VkSRj>w</u9q4P?Wj%cVCSYHc@@\>l9</!bX</*R=y*tu4jJjj<AWy!b6Him+Wwa^HkJ@5k<
@<CM=Q @dwy#D$\A9C1KCiEm+m^/LN??G=#9hhR=DH#ENZ8PYhH@u&H+B#H\JZy$nF#Edy?DPC=AX69l9QJ%PZB
ZF+B:8 <n=/lnR%A$w!9P9Whh>nj9m!ktNLiAmtdMeT5Xlui+h4Xu91mpN*p>*6!qu+WuG%Lu==WdG&c:NW9K+L
A#FTAq iY=&*6BEn//Hy>AlnmJa>mc>C4/TRCpj:H9N>?^libiHi>tMyBu>5GeWlHXwmbHXk4Y%PmXPWeGYD1CG
Z>Anl@ >6ka=6&Wt:RV=+?:\=^X4#*h#DBk1=?mYYEiVeMhQRu&4hMMhj^V<%<?*6ICcSYYRQB8/:GA1>ID!J%+
y#8PhF 8XE?T1?k=anaSe++F\%1LXSptVI*ab#VcqSW:Q?b8qMcS+1mkhA4VH%*HiXW9eG\/JNX4cA15=5Y9?YR
L\n=!+ ZMN%XK4E1<%du=wGcb8IZ6a=$G&\t5:V6lPqyR=>YbA>lBc>*q/VLamMI5%Q#J*yC6FMwHBDLNFDRZ8@
u#a1?6 S1AWEXAGQV9<kl9cJ#kZ*<WY^EbnYpGi\ueSX>9ESnZVSLF&P@h\6JY@VqidCGnWatP6wLhic?j:RNSt
HShD^9 DGyk<Y?Bun$Rp$lMFEJ!=KbaT%yWmYJ=KIaD1tZJ5ynE<Jcdak=&p5mH?Y<I9AYpTI=yjjpFX^8?JR4K
:6J?CD bI1<!?p5FZX>iSSA#@RQ=@eXKJ!\m6NE9yN4D6Rktl59jtiP\^BNpQK8^umNkq1mD4GT$q9*ludym!y&
beAY6D 8aWBAYPmH?+5%KEk&6@5EQq1?Jcwhj%\RKT9hYlctW@Z/B!A51dbtRM^56C+KukaQDFXkIyCWMPtjqaS
<@6Lt! 8Ip1chllAJ9DALkNJu?1miXWYq^Ii9e&wN9Vc<VAida<YCX6ikHymZki$KpcW%I>dtn9mASW@aT=l?S@
4hIbQ% 5NS&M!KTEP\+P:yl9tbP:S**kRABCnhlplXBcI9X$16ljEGQCqa4Md\BLpT\EMq1aZ*jIJhaGp%%knm5
emIJuC l%1MbW*?&eZ<+wG5DqQtB>w&:wy&jnDD?+D:1J\hR>$1W\Xj#be#SkwMkKmq1<ZeJ&/\eild9tacIB/A
aKnHJ= C+RDR$^piV<a*bGHX<l<dXGpamlFMW+uB?yGq/Pl#kW8@V+X=SF6kFwyRKw\$GDm:p5PG#Ntu4Z5Bdj^
Z4t=/I ILIHjQVY@NKZGNlP6qSd^6p#@I^?nTC5qEwacwbZyHMGH9VkMF:k+kdeh?R&p4HK81LIYkdSmm=J8#:=
8<*HD8 5BRqB!%Cp$8YaWjaJ\qRAaQeC&VC<G!Xm?*/HH$>8y6jD\V8aM=6Zk@+qS#M^j#<HmHy<ub\d:XtnuJ@
1%n<LK $ew:RhCmP59Pl=*a+Ne\V+a^m1*VXK+i4^FTSqtKIatVnN=G/N?I\C%wu+48DERiPI1\XItempN%tk=X
c*byQN !CNkIuK=dbNdQkwk1Qe<XY$<4EYR8bYJ46q&IW1bq>JXJMbjHPbMuaWjRqSH\BTlEVZbdJ1mXGVC<CC!
TK45E< n+$?Zj=hFR6IJk*hH5+$:^SbZ4E%<*&+PEVDZ%FPIbEXwdl\^bn%9VZa48chX:c^V&#^^w!:/d*AC/+$
+&LeJV YlY\XcZ=!ZNq%miH<!QtNG91^>V9p!i%NaE#1?XKR%V\EM#n^TyYGl?b<<6?<X1ww9TWVSj^HD5!T%Vl
Ka/wXk tuAeb1mZujI:/Y^@&Xw$a8XDVwV#\Hp#m@q$6XnMbnnSGEi<>XLhK1tX/BE@<6t&lYV#!G4n*I@A^CJH
^%eN&K ATbF:9LjELHK5$+nXp!AbECELqHq=BCn5FIW&nFaZ1!!9JSSD66Da%W!jR\F1Zyk!lQ9ZKucE&+Zcqlj
D84bZN *%W%b*\^KAeWPJ#Qi<**QyblVuKN1>LVIDmwy16TQ6Aj*%D>NjYJW*<hXRSe8JbK/1pGaS^HB?wDPu^p
Pi*JIj n+#NMmyG1keZ4pL6/mhl8tiLtEmM:RFqEZqNtQqn<@ejR<c^8KA$$64jI9=t5$XYt&PuREI>hMqcJ>YJ
BBdE+6 $d!8eh!WHYe>cyDV&lT^jF?uD:\>^@KXi^k%JIHeD8EWpkI4XcjjiFpnpVZmWQ8cyeluaE=W^ccQi<Qp
we!WaD #4Fm$IE=eSMZmqD%:!4^1m=E!iT9a@NanZkby<?QDuBqaQwn<?#J@/?=h\G$=K4KlK69Q/4jjY?he=KA
pKGW9B JF+BR+BMqAS=KQI/wCKQ#mTApEG$$*$:cbL1d4w:/TTkuhb@tF@HWcd\RSSSEjD^k<@@X<i@SlquRIW\
WRmwX^ tnmmM8J#JH11/6SnX*Yh:4:*%L??d?$/n=8?yAH@tVuJ:XY:uu99&4Z&Yt89>T%hXD#H^WKu?qC:cQlQ
G9qI=Y b6J+QE%^L9:YZHPS?TX%aiNDXl+G1kuY9j:KZPGIBF4KH>ctkJQ!%>KMn&/$?:q@y$AQG9KZVlTGlIFw
$nj?kC !B5G1BdG>KGyj!TdR@P1Q&N\uH1TVq?A\!Tmhc6$ZnBc#VWd\IkVH4Zqm?aC%^FQ@:%G?<qh1wYt5tqE
aq?kyw 8cR$hajhZe%1R196TyjLHtTm#q&K4cFS$NM59J>l^pwDX>8CA\AnhDM?!+hTjbNQa4aRWW:c>+PAY4@G
S1<A<Y !\hM#X1=qR5b+Vl>WkndBWJtbyRm8kh#Pa&J#W$cyGqRI<aBWdSbZY6kN5c*CGl\&$+$Q$Ft>8EMiZJ8
4mFd%E R:iHF>QN5AX?IG8l5b:WnqjcASDV+ZZ>RS@^YWm#8=d@T/:n^H*ld#IL>:FGQ!?VaAIbWN!Y6net/9w!
X!HwY@ B>HX1R4ndq@S@uIX&BZ<1dDBp+X=E41m$%e+kB!i=^N4$ph#jRXcSZY*A=<mA1IIGERnpP:V>i=^<V1V
#CuIcm \=P@AiMK%ytNwY6&P#=nZiAI=hdIea**VN5dVGIDBnYbaiJbc@GclSBmKGPnPZ>Yphi&$\%KBIyl6m8E
PayCd& bY/G$il*nCk4G1eNni<M%Jlw5S@Vhd\%IlM?A*JjSueDwJXXCi#^eFJ4muXeVDcBI5C+@5J1cBk@ceej
uJ^bh: mw!X%uA>qC1:5hhVQbViR>C*1t1LZJK=<4bhL4W/>5Qbq*4hKQcVnH/L>DZuTQ*N$q^DS/9iW1Il*:DF
4N=S?M >V%GDXbe<S5*L?D#T\AhVG^=tBZVY4NHF>PbRuyCQZXMmwD15dpIkDXEBZt>:kCJj=G\\I>myDSRMDww
#6>yA@ ubq$Wc/Qdm*\<I>iNZ6H8HT^L/$YTa4JSinq<88q8R&\LuELtkH6Lyd9a\R+F$#%k*Tw:5F\MBY^!i61
u>1$@9 MJjM*$5A4J#wdm*H45LBuu=hei&lNFjF$5>SBY>Da1hphi^:HMZnjA@iZ8^ccIh\:G+LSZiWV%c%a?4+
\$9kKQ jy&qRal+KJu<ph%\#j!!MY@mjF$QFdkE\J$!C^ia<&E**TP>1!AT4pbHMy=LuyCKkm9TEFeTTn%IZWRW
8EFhd< 1D1!4yZt84kP/M?KNb6cRVp/RWklweqHZy^CRINmNt/?1w&y%BnYDn$*CqGQpSM8LZYX+ih!?py\a4+S
RI+/?j Zta89QSw!!mHw$E!XDMTZHyeRm?IqCSjele!Fu41wtaZ&a$q6/yJqn1EmDT9nY8S64Pm+IIHYYJZ%!kL
Y5^BjP LNRuKcHlNCpt\y?wZhGj!^5\K6>kSe4dB+pcZtDtI/XM\*aIK5PJ=i$k+dPBe^dD@<dNtuqTp<FF6$HY
/l@N^P cKJ#mMRCjb<PKl459tb&X%lYFG*VG$BDq4Gd!9uTY<PR!$mR^XKGybk1:5dD1C@cd1b=VW\LyD1td$PD
u6CnQ< 8YN*qPcmk+k1LD1lXQcDMuBuAFiS\Xia4l@HI+445IEEPj$pMHCFJZHN5BHXJ+$/9b+I*:pXNTc\S@l/
=EEhae P$MbpwpMd4MaB@B<T$SIq#MMk$mYhHp:m&RRSGR=PaAGYuHB:JbZM8lFhSKpBGH/kIZ$c@FM^?XmGC*6
wQ1&Rk &hejIJwIdC$P\Z&45dtS:kjhZk>CebuXw$GuA^T4hjKR9G$EF@dyI!RQFGHTDVwDh!khW!F$BClXhG^P
MRTS\S jd1K1XTkhnq+$i\PQC<KRw&1E5ut^<AAwFu$jQ$aEQbLGB^A6qLX>RI*4X&Gp:4Tw!IuB+Wt6l\\^Lw\
5nLRVM <+\4h+Yb?Z9X^<L5\qy\HWS\yLjMcDj!L+9Y/<Jd6M45QypSk1E:/uaCkM*<WKp\yptZ+bWYRAl#GPD<
-Ach1= 000f51621df001202b3 Page 315 of binaries1.zip
nN#Tuy GtFMmBkXbWw>V>SEn&^1M?=9/<VcaR!aG@*wT:MFPw*wKq6WSAD\1ZBRN!eHje#i1L?XLkA!Tu?kNM>C
DlbLdi 6dq/^@4\W+LLDD\CVikYnjZPkAm#qn>de:W!9MuF8w1b:TcPX/>&XatZk:5kjacymDme**jyVATuM%M<
!j1>pZ y6qQR<A&ekT?5$SeBB#@@Bc:pSbTR!BAqdicS1HnAQukGt6N8Nk<yX!Qw$tlwc?iRkZetlmhcAA81ILq
4&tEBy @=nhYbm*qQIMcM1K!Z8SM9aEFIN!>/wXh<jt!4q9XB+<hNW<u159nXQ<AVMaKW=DaX=aVNCdS&1pl<jY
?iVT*M Sdb4Kyc9VjRkCMAjq:@WhFJ=/P?yq=E8wQ!\&aq>9!GHj>k5Y=R*RPTNTdpT<H%+Py@^lCh<k+bPFaMb
1/\9+T B#Cb^aya19iwtwk%kAkh4CnelMlBX9td^!%W+HpG?:BqhNudSB\TVAY^Fd4@que?b#qyJ8jZ>Ea:n%Wk
!=&I:+ lT^MnD>lnjnAS*T#1?n:bZeC^kK>tQIq4wyC5yWy:IqayQ=F&RS&eAi>k/4YF+tkmXZV?pMc<%Maucd>
R:DC@F *NjpX9VZZVQQyA?Ny%GLlyPkS&uXKMyEGqpE%MucB^dyL5LH:S<+mw\CE9K^FyWVw@Dc4A:\bSXeeB\T
S@mP=V \RbGn#wbm4lLq^mk%\=6Z1>j?NaJ8q>BG^&6:ncGG%QyEwe*E:PJ1N%SM/E/lm&PKD@NLtH51lC?MBmR
+5p&MV !V=G!Nc/6>imE4LF@Y/k1L*ZB6%PKm^JQVNmPMjRHh%HC1NPF&/9hC>w<+L>!p5\G!SXMdK?*LPI%6W\
FLICQh ^j1&hjuPe5:L\CMkqPwkwRXu4i*J*jD!/It$V^QNa&bbintMB:cl<KPZ&hCQ4eZK\qSCiF+44+HHtIJH
$SW!my q?B#<J&Zl$t>/H%jMYMPyw&^?b%hhwYEKFnn+kdd6hdmIVPq^Y/qn8F*E5WawDLQDNbAGy&8i8\GA+Y$
C6@JY! SqMeEABVueeuZnpRc^NlddRXMdcd$EJkedZC!^Eu%SbehZCZ/R9kRyR\ce#SeMjC@M/NM96*aytQP1pC
C1TwhA !njl!EJiY/mE\KImMM<jQhPbudMmXNqXe$5iSkTm6B+SAHETeudd=CX1>eFa4iIJhyYqND4TW^<BJnYY
w4>1N5 #E*Gk5Y>Bi/$MQIljH6w/IK4Fp%q@?ptD6>iV&Gl=1C\wbt/MFqy1nhaVqM%k^E4Xh:&$?jYPe1a\Cw?
@CRK>@ $S9S*GFkw@n$BTTB5jwwllGn*A8VS^ApFd<BPT=Vc>$G&l$K!WAqjT+myFlN1AlZFjceSb1RQubV*4IP
^ZHN?^ l5eRGd84!Nn!Z#Aa?KNWuYd!eClFiyeS$<b<>j#/B6ANSppeK&A&+LF&JVTGTkMKlyjZBCXEVnpSD=Le
6WM/+F l9q=WV$mDF<PjA@S\YP*EDW#>H8^!TI@BS#V$E%Hwp$FLmJ+%BIRKE4Ld$/kZC&Z5yEPIy^iJT>u%F6e
H1Th$F ay%l\K5%VyGM\RKQ/JwG9KL&>tPkV>INQ@jdIDqnuw<*9Gnn^cuPA!wMWpEB=QRIwPL!?6#Pup+TmIVp
?<^?Qa h?wtZ644ned^hult\aYpM+=*8mERCAkZCWZ:q%Su:Fy*JGW^+HClCCP4<CcFu:&8Z=84%DZN4q#w+teW
aY&&nG a/TMm?&qTl=kIn8t$iDIQFlpc?+4mc!R!bCR#uWnSNXuaRd5lL#8m<khD4Ml+Ed1JJJ*QlR6Lc/LFMI+
:55VG\ ^pqyIRuN#>5pm:9u^N$&5hh=#q=TlR^X^cCwWm=PEK5&kNB9>I55chp/d^$KF&ceC%?ylq:wuKN$BAm:
$Dt/B+ kt=KRTbVB>cu8XkRAq=l^HkpaZMmqQw8q%VlXptt>&P4/kt@A//%:lD49/5V<>qt4LeP#XYNSiEdejEB
A?X>Du J1h+NI1JZ$<=9Kc>dyZZ1PQ#N#I5MFY<!B!PbbGd8aGtnp<HWPWMeGWK58$<VKnuaIp#MQT8?*/ke!NR
T^hMXZ %je>L5bC%l:SEPkJC>nu=/G*1\MnDXBep*G<IF&Y$e5BVPAC#+ap@qKw9c=G+8EN<W*/jwS%KMDSAP5W
IYa>k$ tIw$c8VyKPKSDBPcPw8bB$8#Ge/mc^d9@4Pwkd?$%P*I^!KVN&wRTk$&+$58/aA8NRy$+u4M9DS#l$Zt
M1R45E l5w&FSSD%JDFSZ<IWCB=k<NA96SReX6VQaJRtK#MRp:ny+&SMhM+=b?dJ&G+yLD=\=wQdh/D+kD&c5^P
c%iLGk PISFBFuKQ&>ic9H&caR$uAm4Iw#&PF=aM%kMEK>>4\+X$qKQIPA\ySFAQy!:QmdK5d^/BIkSH4IktA^5
HEpPGV LmG<tZeJn$5nG*:*?Tq/>NZ!kSF=#^%FRea\dLnikktHRb&6qW5<WNH9%@YZjFFEjEPn%Jm+<u>8ZBk^
*HTlLV R9pmNjJnC?Ey+Xwkn>m665Mi^Jt<?A8#y%Cab@XNwn^Snb891JRZqQaAF*&YF48Mq*=SaT/Wj$1dy+m:
9$a^F\ @$A6w!SeiFp<wuqXNb4B?4H5Au5BwAM?86eQFbucy4wbYL#1pVWRy8ydI^<K@I\?L#LBk4G^Rt9FF59R
p\l5KX HNpiV+Qp^?dMG1XmG*6^9mX$pEKjd5X*qlPcY>:u8Vd$aCn%#DLI:@aCFdM96Pj#Sl4=a<EJ%%w<<VEZ
CeIInM k@J^^u!MkY6W1JF&dNYNXjld\FPPuG5u/1y4GNIaS689w8ZT#Z>n\hNHm9K6MWm#%&+1>IK%ti>#Y*Gy
C5HNw= y&!jYDd@6/#Td%mA@wKcS^ijnY9VY+k$P/T4&BllY1GdA=#Z?puqT=pF:c?5Yc!F/J6EpGBW+4/!icW8
?GFVEQ H8MD=@!Q#=bwh4wRqP@YBRB:@kYySu5!$jZM*MtdejIuZ\Ne<Sm8C+YC@Fb=%FjNH#l!$d+qFZRBIwik
heVi6& AZKEk6tKa5bDa?kkXB>4#Hu4FeWqqhZ<Lw1D\BL!+pJSlEZa#/PqASeSetVd*d8IQKyT+D$nn?K\X11>
nVTKZK lyYTc!cX$t8pWdQZjP41\8INp=@tVGqkk%ckXw#>SWSSC$@PSD\SYXMcNm/8lF\9/kQuaaDJnKRylVcq
ha6@?> SbKakCni\4iy\h5MkYdYBNi8NwntE9p?VEccjkl*ybBBJ\djZyP98&dNZ\4Aqk6dEewq@@tbWG!5A\&!
DcKi!G E5M<415cAQ+PbVPpyCL9hh#5pPFpIWQZGE\GNF5wAImK6tF@F/6>nJySJEb+up9V4yXHDIiER=V9la>k
p<!:@j mDTGCkIIGGam+%8?B?nI#&CX>Q!&Tt4hbbZ5?XImk8Rn4/cqYFh:DQEYB:FN?TL<j#CAZpMN#w%d5I4T
1L$*SM \nKtmwTwEBRWV<jtECEZFW8S:mkVnEceJiL%ALmMjI\9&+yREiECPRR=\S+bKF:=LDAnL+y<tLZH=R+*
#\WhCN G9C<iDk8h?qFi6wnd%cR^d/8GcP\BECK64A+LeS!bMtG$<<j5RYtwmyN&uX&DaBnMc=iXW>SGkuMKJII
dWA1MJ a%LYF^c:/\5>l1=aaMawGcISKQTB$nkyhQ\pSI5tldJ<=D8I9/ekm>SumkumI6=\*J<4hCcu6Wi$MJ4e
@ZR18T AEtpqn4AaYQwM4C$:p+k%4jAnA1<YDEI%/I$4n5!^Y<5J5CMlVWIW^<lN55pma<iWW%FCw<8AtM^mpcK
adX:qM 5cmAm#584*BtWkktN<ny^i/HLiwbRSwbwH+JZMauLM#bn?i5yC^$w>qTY*n$nMXaHFB?t\Ne@IKFcQ$S
c1#y/t 9aElF48\RJ@jnkXyJC/1+nKPFJiS4qwEch!jq@PRndMFBYcM:dL\FKZ^C^Z??HaK%SPM^Y1nRqX8XJm:
c6*jGZ AZYniLDWl%I^BYt<$<#lMq=taR/#+VILn=/bS%u<5k8\4NZIE\HE%Yu5p\#PYYSG\Dud\9/=$44Ci6@A
M>jJ*< iWjB1cj!@LB4lwMy#PK/\m\A+&#lC%^VJ9%h@XEh%KE&me5N5G4MR#NPC@9uT85Ke!FTq!ye+m$>e9Me
JhKT:J #PIqC@&&+M<Y=p:#y#mN@4n#npE6?16dl5!9cHEcH\jNYM@lND:?TD&eRnQ1l#RD>#<ZRVX*=I<&K<4m
ZJ%p1? DpY5@hILF1d^/tAkH>XwTAcPSY8+WmyMI@\D%=46LVCndP?adI6YNXh+Qky#\I!#lZI8tt18<Pm#=pAY
n1m+*# dTGdLekSZ\9n<p^+/TPVG!C>Xlb\FSP\5^EY@\4a#ADe$+qd@ETAKY=RTGhkF8imy$#w89FZ6iD@e/mN
FX&FTH e+XH:qPe^X^^Fy?wpMZ>QdPF^=$YL?*!/qwW%4+CC5i>*5D4A/kSIXbaY?*DpXCBGuewWPMqCm@W\u#A
<yMAmX %iWX@9D%e$CLG^dMbb/YcinV&P%tFlEy&4QE5D8L#knklp6869CN#?PF5/n@e\FaG^:=XdiFYS\*X=V#
Sd>w?9 tI9VI#5&LP^dj\*eF&FnYFTISbQFQbtVaF>TWEWTa/cqLSS$L&nT1#aB\FcX=8eKF*BFah:ZRm#CS?%L
9!9\w< *d!m+MIlkb81QPp8MZkQ8I1AYJ#<Y^nCNC=aLMd%Y&9Y6YblEq6%X+5L5\/ZeBc^eALNN#*FFtB1Kc!q
WRF>%4 hp#AR!S>AGD@ij9ZJk=AbNC#5dBcjqcNLRCheJkRnWcV9=+p89yH&j&*=w&=tp6!t\Q6ZJ6ndb$ybXPS
JW4Fc9 4^EJERy5jKqV%+yN!JcGjZ<H/>85wYHe&mLPV$$La:PhC@1a5Nd$:Gy1qlnST*J!%hVK+LbYlw6MZNAi
Y\1^A6 mNXL<H@Xe*@c+h/iNYI\%1G%i8D1ZnFud/mKIYI4CYI#b@cA*#l#R\^yj41mNXkaa>Qa$aRy:*>:Nd*H
@1db/j b1!$4iX:4R<AnQ4DZNEjK:NbjZF?E/9^>Be&X=b$VR1+>Kjb$ny&#i6G4p5RFau8bFt$b#FYyL\1:i+d
n@DRyG JCN4=DC^=$iiLuCbX:eBSnMGDaLGmqlCk$cS\Re%m@almCb9DSw^nBQTwV!6n>N!^mR/NF$X/nQ<8=4e
bQIS=W WFZ*%!1aZSi+8ACwleh/#QXwCDPqBWMw=le?wTiq>aC4b$\tHRY%L5&hy/9CM!&8y4HS\THVM1ptNY8Q
wKJ6T> !PLB&Q>KVR5$b<MwJ6aWSGZKHdhQ\pDH=6P\L&!%EJ@qM?SBaabqhaZ:Jkl@C$8GlV5/e5mu9ybiHSwt
ktmwqy VSHlME%eJt/GL$/djAX&WMY<yahFReiSk6u9mGtW8\lLG<ML*KS%ltCly?G:pKiZc89TJhuCkt#IA?^y
MHRhXk &#SG4S\Zm/WG+St+5hQW>Rh95ZaGVjwklSGhSbHRRZE&i\\T\#y?+9Z/um/5X5mK5?R4=wi$6L9W>i5Y
WjuNJF t>Q4\:Pe/:8XPT^96CQVh\JStNFqwaLJ=CkE?ZDW5aWBQAJy5PCSDLBjER8a?\MY5wCbK#Seu=AMuY/H
:4ZYk/ %4n@il8#QeS?%/8BK6>^>5Y=%HJSE!@$kI4JliB%Bd<jbeNBu$u+YHA>KqcE=&!QEDpLH?ph!PGJpP6F
?Y^qRK GAEI^!u%JB#ujKG#y=hIaWpLi&eKW#lPEZ/SlmIiMqLA1A<BwTG4ZBRTt\TC/HGchKFyp!=AXLYIt^b?
B*k>!a M!j8=M\SFAaw=Hyc:LWFIK\pYP&6S%m+XLBAkPuWVCIBKeGIbL8@cqNKKE#uHGduZGEPt4PytQ6M\=n\
GLcY$\ DcSNw*B$$mR/IhyWD=hP8nB1C@q5IZ9CAmBT+5yh&lewWtIIE%EHPj1t1JD%@4KcVe<*i$kLE#SQ\uR&
KnqA8Y >q$\^WE$/8$nFw5lB8kwWkTZb1kJ$=n1RbM8yJy$RTEyLBIuIN&1jFIIbk9JFLBVE#ZwctBFB8X%8:Sn
CXZq6l yFkXp<1QSqA&p1kF:N^jXuQ\uS5Z+J6tEV9B4lq%W@lhnwykFQ6>NS<@imd\q9wh\QDn5p5tZkA$TDtH
>SG6Mm $HuJkuqeAeaH*?pN/i+uw/IBwGwBZCWV6P<q*X<&e$mi^jVR@JFtB4!#KDS!64FIt5BJn#&CeE1Vck?&
-AKeGm 00085fb4d3b001202b3 Page 316 of binaries1.zip
P9&j&n Ru^&e6uGtSe85=DaA1MlC?IMkl5I#?jRGQl=A@!pGTVQ@RySMS%4G^YcPTlQI5c$!K+/<B4F<JGBy<mM
E\d+um JX@8^ypZ9yRCaZuTGNA<JlhFQ\9p<!c$bDEF>h!9!WAtEJ@VR4*?!C!1=^#IK\1II!Xe^KNu=9I>dJ^=
i\YF+> +W5yAGNSSq$E\GJp1+8RBkPbK!5L<GubR#+D>%uNau?8P&ISQp6/u=tp6?Sb^FhKI$kymmZ%S/=8tC/X
laQtda ?S:MyZI9:JB1Jwl/%RIVMe\eMbe/<wAYkKHB=Xy+wRIkKpW1H!aZueZ/9M#CQNcuePmB>BHBZ&t@B6k!
9ZbN<l 9NaiQbQQJu#aPQ9Cq%JRD%GdF4/K>!:Y#GDEKPkJ:8e*#JWc5&GluAH?bBC9F&hnSk96L5PwC#hhyLEw
K9<15R H@qZe#pjb9I9FQQ=F:/Wk5kNY^X5dt^iIj*W:*nhL@%8<!mk1Kqu\*/#Wc@4i+8Em<p@@tcd>eFR/kWP
P%dba@ =/YVMH\yBZN#N5#!T^\4L45\m!ScFNq\:C/EnC+RjTw4+CeC=j<*uYuKB*Z/MiN1c=8SadM1jk6jhIF8
#hyWG# B>ZMEXNihtFVSWjwm<%Y8\CyiKT:/Xdd^nm@j=L+we*XABRP$/J>4y1684p/8*i<aTGdR\4hb4e9GHh/
caPDH> R@j^^!>PjLW%XQGCnR%cM?>\cF%aW>nSF8@#IlE&FAb$/$ad\<ij>IY9R^knHJAYmMc=cy+d&=!HXi8X
ZhZ4@< ZW&MF@<$&hL>>6l@$+\TL^yclBj4dYLwi?KW@:*%/K:%H\d+%ZM:l%@i^c>hk\6d1T:h+$qGijyYYiQI
&p?yFQ =@RM/\I?Mle%X&R=eRm9/WcDkjD/NV4G\:?Fac&4BV^T/KK5h:e?1y>n@Ka>/cItA/@u><HJSWjZn&!j
n&=IM+ SLSitLmI4!4WDZ*=N&NnnYN*nRFa<N<wcKAw@u:mtn>:4Y6>h?k8apM>tWcS4qTZPlZGqq&VW/Xtu*l^
m*G=Lk ny^a>Lhm48nCwlGwp$DPhN\MJ?Ned:Kcd4/XeaMpRSDaY4GDTam6u\l#TZD<\M/&e?dta@QtjQdtt46+
ckVumi 1M9PNnAWV4EAMMl49ac+95*5NbBSllNMiAcV+yyQ9^ka6t%ENXj&$6+im/wJu^Fupj1u5Nc+C$/6L5PI
4&$R:h bXqcAn4VPQhpHEY>49y\c^TDGihVJNVuK1J=$4Xa\8kiQIQPFW!W+VlAQ+Nl\pR>d$BR!HH?HGAF?iG$
4BSh%D Z6%>I>aLWV!AVqF+H1\EDET>l6@II<@ZDIA%p:*V:qE#$$JPu@HE#YGckBe!E8pYmWWHKW$+h45MGCSW
6LycWV BpLDnGJ4AeTq5EEGmw1Kd@$1&KE1?^!%/>k\@*H=tm1M+RKutaRRC=Bq4paB=^TT/4b8^e\a!bLEVRF!
<JPLX> awMmNXVXFJ>/M>\<pEJQMWNFMp<DC>QD?By*cGP?ybLDNLVS+GXVlpSDK&kmcyM6$ME6HeL&E5Jk<w$&
TMaGBb LR1^WSY1FiGIc4pb$uJnIXVq51!$iK1AYpZ$5ZSJF=>ipc8bpI<4?hZRPY>VcaQ@N>M<a$REh1N8j&uS
^NL\pJ w$$Pdl9h@n:%TpCl9:m9$^:yTtF!yN6dtmqITZFSaa#w^wG@=FuWp?=m#+<RbW1R%CZpH/A>Q$</@TXA
mwQj#S 5P#uG=H#FnXEC6c%L5L/Gb\lAk^SS&ub!RpIyDp9tinKYwNKQe&CBV>/B8/NdnGBNS$M$y\FPJ6:F9C$
eAA=Rc $TP8tS!S$+yLFYA6C:4hyGa\G$\=aS+9+q6SKNTlP6tn$EtJm:wj?Ku?9w+d!1HRHtJl&GKlSnc/RkyM
*K\$k@ /M$Sq/h$Ncq5IYIBy*%eQa>%edDk66684<=8#y:Sdy5yIKwlWq:Mj@I=RFVFRN$P?MkN666#Z5D>?T\A
/C&d+G c4Flai+$PF4MIJy??aXlLEw&kFG<KAM44ZKFSK&G5!mwM+Z>e/X\Hm*%<a9+w\%Y>KiFS:=#D6u$!!/p
C+1/HM k+:9:huX:!:%pwKt1&ye*EW*+qp$%M55YNiSdMK8b^ySQ1=FG8d$1MW**eGw*GJcEM/HEQP&WE\Le/eX
q:&M@/ :bE#Ywk/1e\Gjp4WQwW*5ACye=mwq%ta\$S>kwLdqn/8WKe:LNVyq%#ac\8?\kGWTAJRbk^15Xmytcn*
a>mFbB F&X&!5*GY<?nEZ=t6Z:Dyj9=Fj=H=<FP9?!CL+ye5LR9GkJm4yFDeRdEGFHuAJA/ckFTb>BT>&><KJ^F
HTRLK5 TJ$5$D>8/d/eL<D?MwN:?tWZ*MG?JV<bia^:RVdIjq<&A!aTSKHVWc#WKZD1jyTGKLYHiN+EW@YLZ48Z
Re*HPm J5%mwM+Wm554#F+VIw\uTESEqHq@CQe@>nuC!1ujVuFVb\4:=$44Cl59%Y>e?JRFiXe<XAZ/8N^CPXQa
C?tJbl c\FXtSch!@8iCN?AY^55KbAcBJt%bwhNc1=I1=QC8kM6$Kw8+69q@T?$#5@q@a>Mel!&mT%tCt5d:L@W
1CRuPB TSaDl@Ct8\%Fac>4Hb6=au:SWy84=HGdZE9NFPL!9H*PqGK=@=+LBQ%eJiIRFtJH%EnPWS6ShKJyblH?
4I5G^6 5=*Rb+c4^hTTnW*$5PHYhPFjuRDG^98ADiehYcZ+I&a9d@>#8pn@\?bF&:lP1<mu=b#!TtZ*MXY8b@j@
D#tl*6 I%hJ^?Zk!:6+@%nVaJ!jWauuFiF&@$XSX@@/eWw!\1W$*KNpWN6dh&LS5mI$FMKSXT$?N/@%Zy!1!<lc
Lc>SZG w6+Q=iP%al6?9cbKQGK^*46VSBTE9&Y<9hYJX!?y@tyiE:tlT>MPea=&&AAI8S4l*>EZWwdSbLhXlXeu
9KMT8% ^+Fp\Fm&mcIM+junV#hl$6t%V!Fj=6Vlap:L9ZGhqk8wtHD1n+>4FAy919ICFR4SL/ZFWu%XRRC<1R4M
u??BBF cG=XVGHydY<IHY?mNpND5Hn!le^WN99I16p%i>KudwPt&uQ&^dyAuMh\M1XNQG<^!T/q*b1/&&1*WLNy
qVFe!n /%RNG118#\nkjPL%eRHnJS9u4:HBFtZk/htEmuT:?@T&e8QW&:NHd+5knK:9h^q<1/e6nll6kdRp\N$G
FNJ:FL WAXQm4yMajjIe^mE/<chEd\wSAX$VScwL1^TNQSc48XZSVC!i8*V1#Cye?1%ew$wpE&l%^An%KYTC=%!
9:=EYa L?LpNQiY^d*hlERm4\FTAlQ+1Qw:d!Jby@:Y4jyLq*aNIkj5WBSM<6#K&&t%=LL+w:*!XpS*FTWTikS+
q/IdhP >9%bG%pnnCX5>hweE%:R/4W<+1yiC!$bEY&XNj81a5^CB65DX4WX?Iw=VIn61#C*19M!=D9LGMGt+iPc
nycjBP +YbM1>Si6b@C164IG#F4%XiWl6:pwaZtlSNEi+%==QpEI8^:9V$>=q9$k:m#y<>+cpRDL9Z:Pw\RZhj4
W!a$^I >iuBT6Tj<hLP9pW@VL*F<hLS>nT=bttJBXTCMIFcc%epm1+*mGVTb8+eKCye<QIGDJ\t+GFCuH6EqB5i
aByIb8 1RpN1ch=VC5B4BTVB?Pw&%G\ZmnRtuwW+S6@@Bat$5m!iHH9!DDFS8iTKVd$6JCl1!YV$PZbyLD86N!i
59\Q4? ^1!6#h*1F+IDSia=i&4=+D6L<5WM9TZF#J$F$QWRpBnPH&Gl:m%Kd^I#F*/a9X$V%N+bNN&$@IQNtptn
8wyNLa q*a<>%IyN4cuLWL8#Qb\k@$8qG^5T/>h>N/IhY%*kQ5P@V+5c@NB=bhZ1GbBe\Eu=I/dJeL&#l*=+:hP
X$:CVc 5&nA4+IIW=jK4:G8pG^atDqNI&49bpS6+MXNE@inNACCn1Lu1q=+taWb>N#GYQ#ipk8yp!NaH9#$Y^S+
mFH?Gk 4eZB*VDLlm%Wq!!W/\1FF541RuMZMG+Al=X&QX$Lu<QR9h#CFEP*uKay+j44:JFH#$!TcZAqe<M$G%>K
pJplN& kakKG5SetATwb>&$KSEa&E#ShQjD6&I$^hc>SKFyWZhu+HTLYWDj!SF+w#&<GWHR<8p\6ea$/adSyB5<
lNYBBu MLKS$t$CDn&\jaQ6R>!iahR=$BS/\M^Rj\uF&FXe*VtR*a$LM:m/MyRT+9w8Djte>knY^^<=lFTmp\Rd
Bbp<ND M/p*<9uWG*Pu/bFm>5mqCl1P=>I*<k:k*eYXmSYhd^bq>#ILnFj5&<!\e#m@M@m:SjqH6:Y=NtltddN\
P+X%>H :N*dtYdl+JE95pC4:>mG:K/c@Xue/ZW/Qe*wMRi<?@nC95ehEZF4DukZ$L>hRQ?!PdNHQp$V?mVy^t\/
H+CNT< ntKcn5Mc5CiudXAwLam?Lc!&mJy*=MM\a>KST9ZqKS49jKHe/MkeLP<WD^lCk#*C5KHj*1^=PLbT94yE
\%4Ve+ kw/F!a48=Y@414F8M:Nb5/QW#AY#kL&1:M+X>tqlC6a:NqjRc/KFB=+><4%RmIH&614yQ6y5n:1c8&tc
W\VpD/ KuJ%juhPyK/LXthht?B&VVZa/&d^iiY^e@C@e$jiSXX14AH@+&tY!LECbDnVDe$bapP*L:a\^eu5KYPC
T??>X\ ^Y18!SH^chiR8GG!@L>ty9C@5n&#@/qPihd<Sa9G8&w5Vm>^!IkS6tc8*yVLPb?hhMqFBtK*yT8*14y^
bCj@da %u!Pn6!wANcnHch^uNj>\P6?\MH9==$HucYFb4jVnKZ$Ljc9QaLjNe+tb?hp#*5jjHD81DN*%Za=h#5&
>yA1:V 6u#n@a6/<M4cGD#S@ndb/^eel%8dH*!RhA6&!6bYqPS9G@+X/u/MQ&j:^#:&q*<yhMiHQ@#JV&cb5*ML
Cq:FRN j</8:j\=8@Zu:Fum#>q:BZ@P91j\=!\?qV>u/bu<Ph+d?HM/4?ZQ/d/eQ/j*R9/eK=4tui?W=%@bNDjL
9TLiJA #:u1M=>^uQi<^*uT\\@HI1R+V$:V#*#tE=>\98I^?et^y*#$w:@\C?>?6*Q%VVhy4^$?VQ1XD#%E89#\
^MNYwJ \/Sj=Vk<+/p**WV/6MPHTb@?$EPpZ@*\\/VZNk*yM^!Hh:48yy6Iu*u+MPt#Hu1I>NpQQ$^/jhPR@k9H
9QKjT: +SN98Ppt$1<=jJn$c^>/mQR=D#>MitQVpMw#YLQu*uRV/hehQp#/9IeiIu*?\\?V91ByTF>+?HCD6@u%
enu8dC D#%E?k$QQ$#/InSPc9!N1LZ<9Sm%EjwTQEZwT*G%$JjldKE9^:>C?#j^=:\C@TD$qikHwh?EjlD/#ikH
X?FdkX wh?CjlD/K9TD$G>FQ\l>NjyB/G9RD$Jjm*+R?n4$k>D>/AilN/MjlQ=L>IQRY>AQRt>FQ\l>QjyB/B9R
$JW*5> D$LjmH+R?t*wB/F9Rn<IjVQ/Ril6N>*EN@T9$B>C*+L?EQ46/A?ld&$c$8>A9$ljjCj/SikB>I9<*a=?
%5LWyk EZwR@TL$EQyF/A4/STl:R?khcI*RP%FLwWj\hKF9\>&F*wY4lN/NpqD@MH@PWjTL$GQwF/HH$S>C*+:?
Q=+KtY EHwC@TH$JQyD/Cu$l>B:$B>C:$X@CD&N@lB/H@yB/Q*wB/EQwB?E9pQaCWdiP>EjR4<L@TD$8>EQR5?k
#jpX*S ZhLGB>FP&V/Lipnd9\j6Ej1>/Aj=?#>\ZPm@Su<JjSjcL@VjwL?E@y>w6>D9\@&Ejn@cLjVjw6%Cj\D>
Ki9Q&C JQVjwjbCj^C%E@yD/Cil:<c@R9<>>kwNH8LQiR@cLjTH$Y/lQ+LcC9%S6F9wn&EeTB*im@bL?TG$Z?mQ
PTA>tA w@%Cj\K6E9w?6F@wV?J<wi>HQ\n>KjTD$J@GiBD/M&mj6QWDGA>T@qt$V<wjSD<I@SD/Rj+?nHEk?*+P
>1>6H% @TDqu$j:lQ+C?p*wL/I@lQ=jcJ@Rn/A@lH+W@TH$q@DY=jyjSu>I?XjRC1G@m4em?*<NV=j!4?MyR9>9
LDw!Y4 :BZ/@/AZlQ+GYmH$N%F4wd?FYku>D*mc$N@G*aV?9\?^S=#\aj/e@+l?Ejw:/Bil9+6?Ejw^jCj!*Q?E
lj#H%N jyH!:/FjlQ=u>I9R@*KVe1KQw#@pHZ<C@TH$>>EQ59<Q$A>T@pQ$k>BQwl?Ejk4>IJSjuhBQw^?E@qj$
-APdP! 000e4949275001202b3 Page 317 of binaries1.zip
Ght^>? k>A@Rn@I>Z?MjyD!I?kHwa?mH&V@u/AjyQ#j$A>C@^V>IQR#/Ailj+b?EQ4u1L*R9$A6lZ+Y6SL/**EZ
A=t/%e wZ?JjlD/PdSi/F?lXWL@G4WT?nh+1n#9d*EZKj<hnk4>i>SD&9\@eF#wQ&C9$M>n4^^@DCYl@+l@lj:V
Z9LAjk l#+pp<lZPaQ9+M?JV9Qu^P@m#$q?qD>u?Cu?uQVZ?HP!Q?QQ!V@Hu%Q<QZ?PGjDumETMu%PN?HQPNe*F
I@V9G^ m#LQ%n<69\>?$Bp>!J>#96G=@ALjn8NebK$eb^W:bY5NJjpd+%?lnj:tbAdTt</ylLXb5b4Y%HdM1DAE
+VREBS =XF/Pn<BE<YiQ#W9#8A!^QmkXaaR1kY^dGB=Z1DZ*!bE5:tFwy<\H^pp9M@Cct4ieE:9h#YEhby\e/CA
DXKeMN M/#N#iGQ+GIyGZu%!5dm4pqyN\/p^LGppLwFS5@<e&a4EyJt%cH#=k%!qb<A\TJFGqBp>EuePyWhXh1L
dT@+@% SHJQjV<KaYIYNdNt=H$+TB6EbFd=TM/4R6HpWY#!KG?I9J5X=YQIl!/KbXIbiekd=TFinIeET:W*pDdZ
Dh&F4> Z8V:GSL?SL%PZ5XJkjSIy5yG\KE5<md8bSZ5pKK9M6+mnm8/Sk$<J9!Wb<9=n=q6Wy%SYPX9%+j+AS/T
Vc=Y:M hFM9cpSR:5RDQAVwcYqaFcNPE5ASJaQ/AZ8Eq&leh=ZESEhN+^\yhIaD^^9CcJ1N$nLZ6Hj1mnum?$pC
MY^*5y 1e5D=<%NkQ6BZ$n*=ulAp\WtVRHyHi&VB^iq/*8nDQ4jaJDFKZRJ8h%Z64jIG*iEB>JXZy1dnd\i+1ZG
dFw#H! lulY485Q@MGAbacaASBI&tyPuyM^AX!ub#K?WGw/YQL/ZdjMRqQH<dDKk!D^SJHPp#4^apJ+4=44bl/L
lG%#S< hyw!HAJwTewtHndY=RyYZM*L5MCXp&%XHiASy\DmK+QPLei/iDM&Z>t+TbwMt##*8nH5PZp#HDTlL>WJ
bZLEBD m/Yk!e@LM&Xe^aSwDYLtRtImV4l6TZ@AbG&Hn@V8EyVQ9B:C#JtNPKbY#p8nt*BJZ1b<Su8SM!cY%=+u
+EHJ*p WZiRqY9FdkB6A@DJn\hyNVK:eV8yWGW\M5?bjS11KcMw:thNnm\iT!mqnw<BHmSEh4lb9m%pEhqd=tFG
y+VbyZ uJCtSP:YMZPcFE\nYiKEQVJTyDeAaq@Ic<8pe*SaX&aHRT>paFYI&#!HF%n^R%?Ri!JV8KFQG#Jl@SuA
*wKTn& i1p5Y^cS!\qQkW<4XEHwdcWwQJ>S@GKG5#=u#Qh>D9mP?T4@QW<R+\Y8$T$\yHSVpWi!e$C\=!@?my8*
ARJQH5 E4LDb8aEdH!8EF^dm1ySy#j4iW\Pw+pQkYp*QWh8Jl4p6pJb&#$9BD/=C<Y>p4hIVV?W+a5Bqkc=P9Jq
QXkR$^ QCAchwlkW!NMKRZ*G+hLKP9%!69kDI4F!=$EuhDiHINF<pNAmlACjh@@1t4wS*+6*>#R/\+^!tM@>twk
weFMmw ^a=G?Mnphu=Zlu<Xh\iDqE!1E!Nn66?JQY>aAcqF4ye*Qa+Y?D4Jq#jBD4INC#5l$655EpGI\RqB#=Ml
&%>164 ZD^+jSWHVSnBYTmMbajJW*#k5LA%nS\1CQkQ4yC+\C4h$6Rn$C6!F#lKTQpk%@6T^Tl5AtDHY!c?8iCZ
&Zcbj6 iE%bbXEuSVl^mIlmJJe4ChcjCJM$=hq:\YI!jCDCm5FNldGWce!MADH8K><Q<GD#M9b<=lNJkqm@!5KM
$Y#P?* lL>Y/TlLSnLt@dRSjk8\HVbpR5QA^\1lG@pnQ4!19bGLBV/=6VV<#J&wRa=HXQ^Z9wktp=5l*Hkp@Kmw
ET8qL\ =D+^95T$hmN=6QEG4m>#lH!VaSTCkZmhdm&VT8wNiqKn>qPhWK<@bH+L5k5+*uy>VDSF+k6=<HY=QD>E
AR>jn8 &<G/kZ9L^^hM+\JiP?#+CDYWVpNpeTb<b6kMEYewM%MEk/i<kmF<eQK5pLpLVBBn@XwMiR^e4Gcp\N$A
E*@jT^ WlhAXQ^iRQ#PaXJIe<@e&eTSVKR!6el5\\p6neweD<n\BH\J\*TAtwW=!#K9!e5Vd5KbSJw$$kcWXXN:
<8A^eN IV88hku4HKIl>HjNaHJidbbRD+XRL5wRcWLNtbjBm\1BWWd+j!jKT8N*w&/EnIWDu@8S>D+SNy#+94DP
@/&D#w AutwNStam:lN?hVG@6N1wCF:5EHP9IC+H+KDekpalnV!c\8aK&%b^D^+el5R+R$GLhpD\T^qiEn#J^t!
jNSa1k %5\iKX1Z&4!$KH?!F!+/YKRw*JD=5*ddFHTSCCZ+^4jmY$eYWiX6F#qBne&d6lyFq#P45Jjqc!4tqDtZ
!LTGYI #*Wd49CdIZ!6p5N8aaR/W^Qple*q+hBL+^\qN\%9j%=NLAltBF*V?IKL4Y$Mb5SC>+$6In6k+mEw*Dwt
/=CXQ* u:L5e4W>Cb^#6S^dH=R&&T#K1^N\CR6DRaNhi=#iHQ>@*QQEF4ymYCBEyAPD%ZEdbC+d>#>G*Aq/QP<R
H5K6ky k%TQMH&Jym5tKHt?l/9=SbG*mYm9=HFNe<I@&pyq%*&L%uFJa>4yWXV6d5llEP$ubK*cVQ?ECln@1%Yu
$Y>jVL %EPek!9/i5nL1Pm$W?&^iXq6>D^RJ?pRZhq#ed<!SID8&VQAA?h*HuR<nG9Z<*\\yLKIlNQWqRkTA:AR
+MjdMj %?9+qJ#<nn@\5QA*GACSS^lHH9eR4PpNQH^ZI4pPPuE8=:6BQ/ueRZiEL#D1IwnWC&9lZtpZuuRm\eu*
/FYKq> hQbMIjI8Qu$SP=aw!\4dhu&bd?JSW\*mltWpCKpn$<SJXhYn9KtnIljy*HV5eW^k<wtDkRCJM^DS1lHB
IF=H>< Kl1AF+?R?6AM8%FV>\QlJ=+LLy::Nbuk&VNJaQ\wqX+I++A<MpuAc$T8#?A+V?pRdLCy+#ANRmMW:9lF
LTEX1V HTM^9dB:Pb<C1&Z8TJRw^<w1ViJSTj^^k^1EWi!tYQ!Z&cYwp/yPT5^D=hp#ea%%>TS6$1AKA6E%+q:W
YVD?Yp /+L*=BW@>1T8IIR*1hj^bJyA=Kh$cA=BVWTEA8h*BlV@YaN\!PcZqh94l9Byq1iAH:4A>W:1W5RJiYRm
5m=9!k kl=1GijwA+VHJqpb!bMH$wT+dmD>!@TFqAEmLRVT@plt@/S\ZbqkyQ:ThJQETQLmF#kjE$e:\iDP$n=W
m8P^Nh I$Zk1>a?ll6Gy$=nac?lVHS%Ka?Ra!MbB:YjJL/MRVeB6IHwBNL4JX:pKEFT^K^KSA1AJ/#eyWqHpJ?S
HtY1\4 mN:kHVc%uI8*EE*jR8!XuK#q9Cd\TR%4EE6HTMhBtlnJyMX=tPMATlh$P4?ZR5e4*E+u<pcIw@Zqw/nL
#>hNe5 wP5y8yS<C#LGbZeQak5TD<5*+bdD:mCQbaT%e$\w1y!Ra8n%*NL*R8I=!*ZSWq!tQT<Miy%\&E?AVPEQ
c6AnVw bLK@:#yKlJXm1Nk$$P1PJh>dYFYc?/JmHpGdd*8QHtwlXSTRb%GpMXhlPt$//ZG=XW<aM&=64h\FH&p5
lEN#JL cTKe@?$:mLlPS1XcnPn8MtPI@AJBZ#F#^k18k?eYAGZZR+R<^5=XVmuGau=A:$W%m?&t5Jt<ebXLnmeH
I&ZyP+ n?\\XkY^VwYV?t>8YZZLquXF^8=&%LNGPj+C9hNY!et*&Gb85$*GGk/uu@$PZS^%8cdm&h95w^XEyJ!4
tNwJI$ k1c\6>8aL^dw44ik?XHpB9@e>:9dMV1u8Ha!pQqnq:1^qWTcYe&jZW^tF=9J*NlpmbQ>hyKbVFDWSdnP
aJ+QVc yy5ZIKijM@e/bnK^/A^R#yb%luq&PbqV&lVjhP#F9pd*/%@FPYe9JBab\kqTB/a\6i\yYTyKXb^4<<C>
9EeBhN tDa/TcYjm4B>P<&acmnVSmiEYC9@^YZh<:PpN!yGQjqEPwM\E1E*>PVV/R/K6CeMC>NHL#IA>9EGaG$!
aPMyQp VWkZpBuA9deM\AKEy+Si*iRn<+:V+F1aQ=Vjm\RyVCH%SbTNlF<IE+$DWR4e1ADQ\b<LK$/WmABcltW1
1T>Kdh dD$imLAK$<XI=1Y\A4?IjCcFV&1S\ITS%BSASYDGw$YdkYAyi8W:Zm^e4&tCKcjHFVuaaSR$qS6YTY%G
=*C@8K +ZBWRDtBmqCNauqGJ8i:*eBN^8ZZAW+aCp4pRqQKW=MPem:p$&JlnRlqc#C^=?Hby&YPCPLBeMLnAc8H
1wDm96 lNimB\/kq<GJ^lZJ5qXNwC9XMZ#%Wn<JkqK+5HR?LBFyN/F%BL%HpWT6JSYWCltTcnWyt$Vt%/m5#y5H
Y^b$HQ *!4DIc:D5tm=8<\i>RkkcnBpeD4ALAF\NdadDlVI$bHuWVTM@SCGH#m<=HIi=*Rc5F!*6P$iF%iwY6I?
QTPu*? P=NZAD*Aekk$ZmaNiTq+YbtH/QqcNBASc?W?jAF&pmlGMmkABCGNnDF<8q+#Y51c$4/I!bTPBWISQqAB
LDSw?t D8&<W9&6T6u^AJICS#&jj>jdSjeb$MnuikNj^4nd/d1XnJnC>$aiXI#R:*wy4CZK>8XYWpQ=hpeBl*G!
@c#AB4 =Pjypq@c<+wM$\%EL*q&&1mjI1bYWR&ytlnL%C<$VuZe+c^\lVS$CVtp&\qA#l4tXYHq*h$6+#i1Ri?y
WSRDD^ %QmpamV=/hkww6XXFKh/?LlL%dXK6+P8F^=+IZd1A$\h6Yb/TALpKkmh5Z<qZhYLNiwXJq<FD%wnyH?l
VlBk58 Nl>MEtPieSGGFAnhCPJ%R\CM!X^+5h+W8Q9dSMG+S>pa=5%TlYtN@BR&QGqY%c:S1&C@cyj#6:BJtZEd
aIpYq= +E%XVjWmVRt:4hSJKqWZd4BqlDZuI%X:4JE/X:S>SQR#\i!ZhjHL^na%Lntukb+tHd+bH1An:C!lTC%w
?yNL9\ S61!NZP5W6WicMNP<$$Zc%aV&%1ueJbhXTQM%kLP1?kDJNuAHII$$hSMyS9TIAh$YqiajIJQD%aZGDDD
YiF\TR Pm5b$8ptmG:Ei>EeVNnT/Yy5#uSFYAB#J&RaBp+CD<!J#i9/w8RiR*5AnV>SpMl4FLYGGY4\CiJ%X/XI
9Zh^16 :iQm/TKcaSCF5y?ahwFQ4Sw?1uDBK+tMn>ld9h@b%+nI*^6C#<+S8TJhG4lyRq>9pYZ#DMB96Rqwhw>4
<SIq$y PP!GeHR48X?iI%yAtkaF\%QRSX8KeBlK\=+l+ucXl?CkFV@$*K*qj@u&54K8!iVhGQV5QYZyDiB8c&Jl
1KuQaj pHXX=INi+k?RM4GdmPaCZCZK4%Z6BbE9LW*/*mCGu8:Z*qJhqZE@GYG@mI?\9&XS=HpRtEh896RJ=e+l
JNnwRM LTQSWnRC8p9c/\4#F=pm<tyjVn!:SX+Y/u+c8Z>>tKEG\8RTpeQ>aXMF6e^TyuE:Lnql:5h\@=SSd$#6
!:b!V^ T*j:M6lEW/ykq:h6LiFtnW+NpLRFcVTW&dq%paS8LDyQI5\^1/D/CHe9#!#RZu+/FLdt^+CHC1FT!B5y
jpnj^N <k\\&VWMcnKDAu56RkcQWY$!GT9wV#mNT%&yHbS&cTR4aXQKT:m>$V5ee$E85>A\hpY@KGR1T?Z=w9!E
8paQ9m <l4!h=\*%<b?$+lTcI\ZTa@ZFTV*5p=FV*GdwPh!nt4!eF\8TEZpC^uK1QR/+@LFwn*R<mSNhuYXBqYT
%BlY^G b:9=kDPN:p?VWJR$$VLqjM!ydnS5lDFZ<8\qpWwGjmewE%EDPylX*dF@8:SVyBh9=I9eIXLNAP:=$l+9
B>jP@9 lyP%H<YmE+qipCXL$eV&lGRG5Mc:udwb>cp:e:@jGa/C%HQ4@mCLpePkFmFHJ5?V!Cpp@aLy:cpM5aAN
D+pdPP 8Mw$aW@XJm%DFncK@K5mkYXlEp>$CGZwi#J*GI?Mb4\#XqXRdYALJ+q^8b**NhK>y$cIPTGZ&WL4@Bm=
tKCIXt thZTyPqH4PYD=ZHlaZ/IB#HN%m1Qmp1\V@w=GiA:biRX6I6Xt!hqnRqX<AikB!cRMC5n!/:HW&9P&y!l
=Jhncl cW*SS=96yqX8XyW#dm%68Q+Yt*SDeW8*1w/lT5NYFhP9?u$##lQ=P/><$&EG<D#i?MBV@=4LAYPtPkjE
-An!Mw 000c91ee0a4001202b3 Page 318 of binaries1.zip
wdyRuY AbR\Zj=TT@<RKSe=j&$yNYQ+qpL=Llm%cm1jJ8?XAa:9LMH+4+d^5JI==N/u\A#LQG>$wGMLaE*W55#Z
@nP6jI XXbnLdNXKNdK#j1?h18?aYE*4dPc98%4Cm\6MjTYT+IRnhWM\bt=GJpH45mKIkpawbHGwen@J5!cabCN
PqGPV! !&ip5W6<IV@NR9qP<aiZHeKFMm8+GJRJ#ed=e<LMpIGGBQMX4pyqR4=bFSHJXK&BB4kQPjK?9?N$9hRN
w?@lCu Swm8FP++YI^MQ84KN!V%ncQW/^Vkq4+QG$JQyP&B#FYLZyp8SiWAuNL9liuiRSM5%qWk?4Qd<+WZh8J8
?t%YjG F+H6KkyQDP%XpkBi9nTym@RYpI^LbQiNS/I1tAc<5^S=HkkQEPVLpBHkBV1@CRKKYFmQCIP1p6q%pIaJ
V4qFD\ QhKnVKcc8ld=W<Sc+dJa\JFHY+ubN49K8qkFK&MkXdkXul$mRc@\M9BKDAc5IJRb<5BFZmhtFCpkZA$M
@SkB++ :qkn1YSTTGWtG<cJMJP$!y4WmTB*C5MVqq<A!N*X/S\Gu$t:C=HFe/\nlqYD6*ZiQNA6\DQntn\6/E1q
QEcuk< T@LI6*J<\IwTT18R#E1iZe6MJRPwK%W1t4n4?l=5PeKZItST4:8ajwTD!nHtFwe<Yp#:uJIFBuHPpZd/
quAJj* bB:HWTiA@8j=eVRW5d/L1BNVDL1SKCW!dAQc+c6R>EDl4Xc<N6AwIPuZm%GVLpa!VXN/N&ZWqhqV>d?k
#9iEQG tS%yR#9TIEwe::mD&llXd<*RD!4qDV%AE?d1Pk6kFd15I4W^9t^IR$?tHEKBGMpYyBin!Pk14Z^eX&D&
eNaI6M GGL64Q&&KyE&<CWj*y#/jnA8hwAl!&cTC=>nytuK\45KNa5Rk6cK\$?bm5Qpyt:pA!dilnC8tpXt:RZL
>a9Qdn GFa1XTjtqm$MmLwI&SF1@umYYRJy&q4mmi6E<+M!DtB#YH=1e>l^GhWyEuMDLNaZcLi8&kZRC<yEJ@Gy
:yVde/ #Q8c!V*4L@d$@R:DTMiYj!<IY#695>W/N6d$+5ViZ4yGw<dRSikJC9hdCk%>JRV%+ZNp#q<6$q^GS&&5
4b=dqm uHK%A\b*k!VmTQ81nFa1>BSFn!Zmi$a&yLq*T4mME+NwVRV+HVT@ReQK^?GCCC=9Q/iV!&9qbAlKW1$w
nu9b%E m48mlNtI4ZyJl1X\yZaetLKYtS?DVVkEq?6p6GQ/1?wiByCm8Tn&F$B@htDq$=eV!uV5L\m>l>+ElZ!E
ZL*&eI a@P%wuhFcWaDbnME8F/R%wAt4cM1GDX1:IXaEEbFmM>X?8bKTH6%EpM<!\N?IS#:5FKqebAEtZDAHctH
ZX?@M8 %BS^bbmc&Jn:#y9u!bi#c\BtqZl^DHN:+6YyKJBN$lX=l!d6:pl#Rcq4S>abGK\C4^ZZmwku<u/NDIA!
5&wYX$ *j6DJK<R5ZtWAuM%RLJY4w?M#a/SG@m^TQC\W&&mqQE</5%Ia8eG@LL44k?J8/SbRmcIIXAAIdpZ>J&Z
!B#*9\ @T+AH</d=!S^WDWGJ<h>&FpS95S%etl/6Z#5bh*BDDnKku=c^wHS\ZQ<9Hu?lFWlQ#wA!/9AJe89jdI+
X@Kp&h pXibm\n9kmdi$HN#ETYq<^LS14KlQKeab%im=4:\N1A1\@+Y%Mw%^5LnZZt#dyCiN#+i&IRDNm@#?<AL
diMRH+ EQ+YkD*tpSjBqeWk>aFLC#/:X/njm*P?4bGMwSkc?F1=A>\MtiPLX9BSBe%NP*/YidHMMZj\cc/u:LCp
\@T4wE B$6Xh!J1YBp\q#Qta<C1Vn8E!mS5bL^Ky&/nlT=AenYbNN%5/C145JaDX\d5\JPBi6:eh6+<Kci?kZGj
M??C/X 8=tCE*FSYW:Nu$^9BFWt$T4!!cR#kMu<QHG<EJa=$y#cyTPudRYAq?lQ=q6+uL+k!6!k$Sd1h$@hiy9q
Aqk<BS l/Inw#Zu%IW5b<l$IZ!aI16<$hhl*hJw$n?!P1/wM4IinQ^#NDEnh9p=>GcA+$q?WVX*iW+8F+PHMh&%
j?5\DY P9jRqpFn?Sh@^dh5JeAT<&ZQ8wi5Mi8umPF=dN*uWL>cP%#8\*>FD>V%Riu=&=>Bj/C1FRnStnBRD^J/
pnA*d^ 8$F8DQHNnBmGty1>6neyYB459#J*aSwI5<#F/*M#8yTWYec%T*QQ>VJFA+&wcB&T4HR9^VTPmGTeIXq^
b\TjjD MdF^l!LA?Bp4Y=uFww1:R?YI@AcbE@HK&5MHnZ\i\NYI<nCYYZ+al>b8e>?iJwlFX1!wntemt%\HZQRR
$^hACu m?pq*CIkJ#FRY!XTGXl?FIB@GmbC=&eN+\aYkyJae*\Tu4^%AIF&/mMa4=NBB=d1DX$=+^%Qq??^k$ZI
ZkW/Y? LBE1Iyp$n*h1bXiC*w@NFc$<tk>mIQ\!:%KID6$GDbLPWj<C8Mmm1+?CGQdlZBwCR!t<HTK+Cwl5uEIL
HH#uNN KM9?puDR$$?X:pp#?H1+6S?:eNj^?#/jYZ8^&tSY#bZR^mGNXtuQE%+tZXSVE1#NnTI4k$pbyjIt+pnp
H4R6FB N4eZy*WctKAjB=HWXV:5Wb4YuC/qt9j8$iGIJqbTe*kCbDqX1T#p4Nm#Mml\<PumKEJ@\bV&XI:G&Sbc
mFB5RJ q<db5!B\NVIFpMYqRVaamE\dSKpdyZul%6uAR+eP+IS+tM/ZBABJA:BiZeKHYi8e&Wi*D^?LulqCM?tw
k:?lQ\ lTiP8eD@VMmJEbI5aXm+MG@BK/ZJkk\9*w$DBNAGaET*\pNPy5Ewe16@\u*:96eQ?F4>yAC<A>BZkQq9
=t99Q^ uyG=<lGk8&Ximld:dmaVF>CKbKwyS%LGXAS5=%9Pc?lPYj!VhFKM5FBlSXWm*S%YTN%Rby$PWh!jRc%M
PuTkdC 99pl+6pnL$\VtYG<kT9cXXXI8WwHd8#q%X6HN1p8Q*\KPq6LGLy#Ze4j^KFX1wjytlZy%yRJ\6!=p#ym
!j%/*K Sa%?ZI*LQT#C68!Ql1W=A5eQ=5$E9AuumnYdHKNN>MmDqB!bGF$VE=Qn6wukq\4%c%C>uu4<PF<4h5MK
=J#V:& RI+Q$i4+X5=:$HYyG!>WEE!*EwqF4jJwm%yQX?p>RuG%>d!AKZSXVcEcP1?bZmpKIl<AX6RaKa?uMN@I
1@9bRq @@RHu4$/4%I1F>JhWeR8VV6aNJA^N\4TedqWIL5#6IJ$MhaW#w4w<py%EeqLh\TQabpMSlH/E6inQ$W:
eIJHTW G8q%<Cmtml\bi*@$5D%?>pbyHZ&daj1HcCiMI\%e?QTFYCGH6hJNZYmFIRC$%bHpK>R/qNFn5BE%GCCS
+T8%Ej +TmDZFCP$/ikTbWwtjAC5ei=6ADLdVFPh+c<d+1Q=i\bE*RG5F+KSZypA%mAEQyt:R*k9#ayB%!ip</M
W@FAlH i%nak/ADj^LZ/$Sa#HA>V?qkIJKJqpGNCJ9$I=uRkV<AaJ*T<8^Y>SMbF%81aBH$cJY\6\8YRijL8TmP
FP9^>& /VDKK$lyZk\@Eyte+EeT=a&q%am$AG*>TKa$uKNu#<BQBPL?=XKSV\e!F=T6Q$qV^=u%I:E$ChQcqwY&
A?IEZl W6peudE4uD*V\HhD>N:LyRn9:*8\bc5@TbN/Zi6H5y:T9&V>E^>jk+tj!GXTiSuhIB%KDR4+p=T6H<qG
VQQ%\n 6LWFV^\Y%>G#b%w@pe8qtT?#aSnuJlJ%Cn6u@Ek8SX8h49Xa#J9%jSDJiIcjTES@Ed>w!@=p@?#^1EmY
<jbhV% +644^yD>jYBk6H+pG>GJ4?IG>N9Z!w:/G:Syh=Sc<?DET1nY*R8mQMmHQ6ku:%j>S&d@Gh8$V8*j&B\d
W\1<\\ R:FV/$SyiZ<=5i*PqlWpqaL?8NkBaVTPwR%edFNmF:8N4mt6<^ib@5tP6>Mud=GNkJ8D=luC919WpISJ
#T^H/q Vq$jJ<h^J@J&5uH%GYH\56qD@1\uF:TJItydy<G&lZe/GkheNiN1nX/VI5qnYynPJZTj5#MJb5Q#Wlqc
YHje?k Y!9d%=l:mi@T#mQ1AqJ^QmuQc<DC@:RHjVeMGhjSen8Ik^4CkM\LSHa6a#kq!JVmaW1ylnk?F4X4HC@R
m5A4WD caPc$W*YQWht1yk#XT/Z\XnFtTmj#qT/u@+wBPk&XE+iSL$ikL1elVW#jFTX!5DNpQ1wTJX^I9PMCah^
E>X=56 DQSBIANqtt!KA/T!ZmuCyXP5b5D:8TF\W%*D+5y=1yu5S/>\NJb=AI@+5$5!QjuRdP68*A\:<DMe?&?n
aHAkeC +hGQjNIw\6SalZ+WkcJMt\GRhIRMje?QpNHG#+Q?1Knq8!Z6Suuha#t98/Am1Qamp!H:RpWLIB^dbIb5
@GAkJh @SZlb+l=Bu+u8mLZ$pB6AT!:YlaKSk&9Ri^Qq>RZJdR?Ki%jPENFBtuk^>Kp*RFcJBhVhbI=G4=/RXSt
QLRAPu RS\d/&hayVH<<ayT/cR<T=Gn\k8ADXmFw!k8Yw%J9VVeb4aM&u1daJE8Ba^EGtPlMn>:y8:%amP5Qw#h
uiw%BP PV@DDYnSqpYu&XYLVyMEXR^iue<<8jYSthcEdwZ$VcG:l:SWiHiIeT=#hFLDWGdY?^p?EY%mQ@SFe/!D
BBMICV BA:wb9/ycdY8*E\<XNJBYnQtBm9Bd1QnIPR+tQe#jCJcDGYtGe1I:k/cA8XS1m+1pcYnih4PS#J*^#EM
:$eS$% h1t<iS<%1K&@a6Ch>#N<Ipw4JVR$peA<Pt*b+^9R%1Eq>?XqRH:!8W^1999\^F<SuHnG+jCJ1FFL1jAl
S+SJyn e#uuY/>/#k6\^>Mq$1N4^Ya\B*D?4iy+PLc8KFP/&*I<QX=QV=\@5Q:CNhw#cELj^8XSa%/4VB=?<4P&
y#A&<q iE6KP11e5@1H89:NHq?hcIAZPVi>uApNL:R??Bjlyt?a585mejw$jyIFu4R/8?em4jD@DLh+C^aW1+5$
l/EBV$ WHG65<INtQlT=#EdWDupGSjN4pLVchC\5KblAyyb5L%Di\AK%hjJ!IGNFj#dJdS&FhJ<Ji#d#RHGK@w#
iV$wm% IyBkDZC4%uii8l^j6LX!aaHWJZS:qRi$Cu+%pwNAV\6hC=QPE&E&C?qi\8NTA^l6aPcB8VYyhBp8KekP
>Z#@hI a%m@!nL\+cJRCE8H*^hAYcD%L^h$lcVLk16m/TDA>ekaGMLNbB\@XSiII6/@!V1$S^tpP5ICXS\l48ZB
W+T1!k c$&Y^q\6!=MIAT%qq1wnV8=m4dm\Dm@nauQhCWVh?bwk#q%+8FnHF:tAW!qYBNtb=VDAqIwkMS1\%:Iu
!\<P^? k?VypC5iGTCB<HEDpXJi\lu+5$R\Y\9*kF>Lwj+6lu+8kcZ&iCS6hP9An/ZKXiDX<TL$KT?AZ\9K<H8S
<#5!IS etJyEA*w:<KF8lLRb6AI4j>LT<>i$j1#!C!jS1BcHyi:ZT&ZyPQ!DZwiXnde#B?&jm?69+9w9Jcte*Vm
RS$mp> &:MBQZ8t>YmbwjWGNIWhMluEHY<\>Z^yQX+&w1*HC*%<4C+=T<?icj%cLyj/aaMaJ=MN%Q@F?4$aT<9R
lDVPHW $ub@/@i!EV%:y9X88X\1a5hINQ5e@1V?KC^d:=iN/BNyM!eQ1I<LPM=qW1R4k^6/W*Wn+CSX/kQ#PD4^
4EY!5M nXt9+=#5Giw#c6/c$9HE?iWq?j^^ZeFqSK=<Zq!*db%k4D@<6K^lYi9%uANdY#ePhXYbaj16<<9MkhZY
Qdk1N> W9Z+KYXC%mckSpyj9RXykeGdqiHQ5ZZ8Y=*+Kbd4tV+ZhcFNuPeM<M>=4#h6\iyX96yPIJ6ty^chGP!S
duGaTi 6VKl+jj^<+a8qw!6D?Y1#mVjjaXJ8=&MWZMyb\+E@uFt8L1hYVk#CMjYteZPALRQWm@E8:/mYDhjmMCC
>/D8ym ?WKi^uZnedFL>/9d=b4b1ne=?^\A9CHKCC8REShNJyadZ/iFlNNCldW<+i1aH4cD%!L\Zh:am?%$k4BD
>pGS*^ ?FRZVcnVSSu*jNHj1qKuC=%GVJEA>yY#4J%G>mP$*S6kRchJ/$4>FyMCktuNcRE4=DZu%lD8iGC@VEtd
!S=J#k W#?l^5nyJA8FG$8d%4JuM:8$CKQalSWBqwG9twq!u/n:bTd1GyBN#?+ya/<i:W6EKi4SdjFwJNPBcAPq
-A%ktC 0001b79a694001202b3 Page 319 of binaries1.zip
^?9Dcd hX<WG9kD$E=dJ5YeVuW?/1Vi44VSBSa5tKiNL\$TYmt6YR:/AS%?e1>Z\+Ew/Me5u#$V?P1t8N=6<apw
iY^%+^ IpP^BB9+Mq6E!hV6^!/+VM6K1#yR6^?piw^HbYQhkM/iRYRXdG^V^$W66\/M$@I<ScJEKQy^t9c!LMyd
ji81bc ==@H$$Thk1##V&chmh4!&VP68?J/><WuwlDcA#mqhu6XI>KA8kAX/&k?Kde8RK%LWX5??/LYcdH8#V5^
&*JSl< QlG%!?a9!V\9wmPW>RVcmLciRK%uWX5??*#4\qlap>nEyZEhLhcZLd4ET^m1&*CJPAPZWX15K=9YKem$
XDB9\E Qpb6?d8&1n<nhRn4=1:qLeW/t5@TXjKmNkcZ1<cZwNiRtwtjEB!PMD?%=V8*qta?X8wTe<a$=FZy4F=!
iu9D%^ edJTQkteddcDKXcVqbWG6*:KkuC+>>uXJQZ=Yb8YG5jb<m=uu@iKqXMHD6/=etn=%mN*HD%\/y+VK?@=
qZY=t4 6n6Znm:L9wN*4S!/j9uWuT9LJ>6n!$hPLl?@?<BBPj@I$iWD!!hZnl<+eiDW!9LlI*i9*LDMK?<=89G%
M$BMQm @51JP?Vc$$hP*cpHn>%#+1BiLVe<hR!*QHL$DmphQPdjj8TwuM5::*4>!u&uq9jje?4+Qch?=jH%P<aD
Eu5>iF !+ePuD1Ay^\<5TJ%$mwiZZ:b4j%Z9Y4=<LEV@9LJi+/ePuC:*F%Ke9Vk*jeep1jlQN#qFJ=^:DC8YjEQ
<iecRy HLqdcu9!=IE:NtnZ^5<<eiD$56V>\Iu:?hRd89%nS?>hPZ41!LGnB?=ij8ZSk!j8Q*:1@jP6YNG>ek1:
LSy@#: iPWE4yVd*aQ8aI&Puqw=IV8PH#l=<9mhJ\/eSIihQLX!+BC1jP!wXPnE5u>M89u+QdjjjiVk<q$4>=?<
=hck1X ajpXK=Q:uql=?#%HV1!eqJQ99u@=41QHV8QYcM4Ba!hP4B\<NZQ9G@b<&=HnK<9:V^!=R^y!>@jPX@dA
y9aGhE *ZjQ94tV!\jp5ej8ZVq^?5TSW/hY$P8HePPn!+hY:q=B4^\+LLYjdcT</8MuX6A4W1?D8Qb?6EM8PuJC
Hb\Bp5 i61iKXeiQCaNQ*41=A%:dq$=mFH$^mM4y%hPQQd+RZBwyd&GL@LA<iM4B$/e6PQ$?M4BI>L=>@JmPj*A
MhY/AM KitkqiN!?BVP<Fip/?/@j9tIL=%?SF/p>NBy/REi9?i+XQnk*ehP!8P9b>5PHVpyZ<H>:hWH=It?uC\Q
N#yNZV QTXj$%%6$>DR\%L@T\?khjYX%&=9K*8P!68ZZ4:@ly&9QZD\=S^LZ:@\8tNdd@WQuDm%?e$4J#@FP#:/
6=!QiX 8tN@e4&?V>+Sa%EG#q&&K?%*hXJG$ewlY+qH=iI@$R1klmjtV:y?=18RJ!@99%Y::4AM1CNHMTaQwFZ6
:FByGh 9Xkh8h9$acj8Q+/Y!h9&=i8XD6KK&H9N*AJQQL1!epk1=nmdlBq>%>e/Y>:=6a/#$*Y9@1$*9T^$HPey
=4G^yk :t*Puqi<b9<*P*8eE/>+%i6j+?#b>PSDB$@hL9V*Z9Gcd*/V5&jldeiQH#nqPJ8>A#I/lF:Vj<M66#1d
N%XA1a N#@4%6jj<nSu*?dd?9%Z@cLe@5p*9/4@itjuqt8QHD#=NGhy!!<Kjc/#6QX:lL:AYhy&&^He%*F9>N=D
=pPQe@ 1M^*+X@9l^%Q:pteSi>HNm*Ih5H6j?>pe5?*ej5D#uZL#9dh*Q=b=!ZL#1=QeQ8D#1&!@Zje@puu4tXu
+WFW44 >\>!?/ie:%q&>6#M:b>^Q4n5:Q$qdu@I?i%qb@HQ8j*iVX?*:L##S:khdQ1dbii>6*Q:\\9859Q?dh^?
wHR/ZQ D^C?Fy/q>iV&*&k>t&db&j!nYp>5d>t4>eV&6lh4QdG>@V16J:b*ZKQ%^Qd8G:Yi*C/%u6nii+9YE>9:
luTunP QK$u66@=R1$u66?4hj5\6u@!F>5/!B9?9YthN=&d1jNH&nyL*>:i%6N^6l=6/!udH&n4Kh8jcb@4PN6&
9dJCGt 6uX&uF*n65/P5@6ndb$hb?<%db%q?/@cin4Pa6uY$*F?<5SMj*:6VN$?Q%P*>$*d51W:4ch:+:TiP:%y
:>@\NV QZjG$:46j5FM*T:M%P%N$:46G$@d>e/ZVP9=*6$#>j\Xd9>d>K*?5C*p?&i&6c>?kN5Dd9<:>4uY<\i=
XX<pWY @aD8h/=ih4bi4@8hh<8ajCi**?$<9P\5eY\<6ZD?j6q=K>FXu=y9/m+:>*>au:Zy&tZukh8+@WPdZmbn
VuVA:& +Hi=@bFN6!$:b\=^?/Pd*4:5@G9D:X@c>K=q=>?e=9a9d@1Jbij:hc#?!1bjZ*dijaVd9:4yD=ihH:&V
GuJt%W ##KdnI!qH:Xn9mhn@kb6%<KQLY<=#Vw+D#a1\<l9%\B>$4tZ&^G&9?JYd5ja@9yn&N:*$\6Qe=#*e&#5
15=+l/ ?=tFG=%N4*pF6#?\<FJu$+@^8j6?htG@5@ACQiiDC><8dIB>58>DC*e:t/@@Ht=@iPEBb@N>@<n6u%9+
Al*N$H QtjLM/@k5*+L>Zu44*H:Q*Cd+*#Zd&Q:P:/i&!G*9=9d@=Hd@C=&@T/&9=Qj#1/Qej6d8j%j8E&?5i9n
BAFEb@ *H/W&=@A>kF>:8>#t?>m%^>!?@*eJpd5AiW@:<Q&9ewHjkLdy#@Le@+e&\@+*Q+pWV=%@/i\@iQZVN6%
V#/@qj ?:ZVh6*?m>N&Hd^l&1/D9#b6%/HuVh6%/Liu:Xy=<dShK:<*dhjld=1&/@Auy?&/+*ZVh6*^/LShh:=^
w@Pndk yq&*VN6%*#W#:j4Xcd6?@Qcbhu%?&1+:Q#66%=G@t4d4dZ<*dhhhu=?&/?:B6F*?eN18w<Y$ZejPVh6%
/d8:y> @MK$ZY<jV>6%etHc4qQdy8&/b?hM8#+#$/+Q6P%ch6:^hhN&@eVdy8%/*>EbZ5F9bPtdX+/8uJC=i@?4
Q\EkEj 9/b@+PnBqd6*V9j5@CbM&K<:IFL8FdiKuCaC+M$1P4=/=j=qHP!$8$<e8ShC98\@icZhh+9IRej<=X6q
P\6Ae@ C8i=X>#<#Vj:K$j9YZ:bwZ9^yEN!%e4lp*6i6*Kc%/&eEBt9k*$m^54^p<8*unwla5dJ*m$m@+ppi?VW
ITa/I! QbRLZmF!&4E:q8^nd4$V5mWj5P/<p*4=:nieEpuh*18>Ck&\><Ht4Z!+uCS/!Eu5ti#kXZ9%%Lc+c/cT
q*/$YD X<qDn^\@AnF%@1R4&I<mWdKX!!<Zai&a%K::VbTH%?%<JdYJ?b%Z#9jVbH@Q%t%?:/S*=*h:wqpeQmKK
^NnSbI #T$m9?wL/6lhB&a/e%=$um@6@TaSWJhj6u#he&//:<duQuNQY*#Bje>=:nQ%+M9uD:=<:tB@@tB@:8A4
G6lah* bk<iRyEHi@8Q#>T8:XLuu?9*@\FRT\MEFAACAAkAeFX6Jd/lC<\JARAAAAIAADkAAABndGqqduS#L*Bu
wiCEq< eC>6aYM9WEhRa&>8hGX+hG%qduW9a&>pbT>RS%BDVXB5hYhydm=!e*JnLtJydtMRCHAQeQaN!CqN#<#V
mpp9@J K!w8TtakDRRFB#t:=JitM/KJM?c9*:BAdaP/>m+eGl5dPRQBCpHaFpmA5FFiTqB1ewt6mwt#5&P\K/>d
#j?*w5 WYJ81u>baw/6m1pBTIVL#MLC$qk9^NW*\JkJ1MHJ$<@SHkkR=tKKwIIN4D%RJ#EYBTNM6\CbLlmRtJqZ
#tJH&h kmS1CSb%LWw5VpWThRTJCuutqcWYIT6&AkpL8GZt=CAJk9*BA@cHa%G!4awb&B5<aI5e\cF6!eDG+b1Z
y5?aYS ZFSbWHKTNVk#Qi<pL=T4B8d^8/TCijyl1WYbcbWuYeM#C%JQMkQnDV*\tI+6tcB^BMmTaVBmaAkPCXIG
%nIA>T 54taZ@#@4+A4NABRT\MEFAACAAkAeXX6JjI!EIX+K\AAkLABADkAAABndGqqduS#L*BueC>6aYM9WEhR
\%=cH% a&>8hGX+hG%qduW9WEhRa&>8hGX+hG%qduXRWEM8eHJ1LtJyd8^hC*ke%ZY?5:8YLFq?G:?B6a$jaC^i
F>EM/* CSmbl?TXbM9YYq6Jj5RpJc9XYFy=6d9M:GIdRnAlQAKpMc<Rq#cBtEik+XpikTTW&wEtIVWRRkkRKF?@
/1nNT1 NG*Tjm%j?4WjdTn1PVQ@:J*hubqhwRWM&m9hP@@MQZ9uQ5+=>=!bP#Qm1Mm/TC!X#Km:M<N1Ml8JlB4V
Ma=aEY &yAwP+VDET&$6cNNpaiWB?:n#RQ@<b94H*4+n@@k<5QLLu6=4^C^XCyBP*:/%R1l*QbDwh#?V$JM@nEh
Z#WX^W 8%H^!WJD1Z=%c%VV+mp6GNFTR&w5I<bXCPTRn@64%8QG%6m9VWhnP/MD166QJ!G@Wh<#:JR@8YiQuqGH
YTu%BC R+tw418/A+FTS9%+4Q#$y+!=yV+1yd=C9Wc%tSB6VGY>tKW=%:&B*Hc#5p?y<%&e%@<K\t%mkmJGS1!M
l%V86$ pSHnKMNnqF#4>?<Z+6\S@1M/%NYEW<qwLPW>9m6E9ZLR6#i*LY/KV+#*wARc+@&JMSRRZJ8NJ@yJk\^w
n%5Ij\ $iFk!FS<9Z9TcmkeTYRH+5uY8Ec/JcZ6CX/<1d5uqhXm1u=Jm/:H>W\$GXPd<JN5NBEthhpWV9XuE/4i
Bq/J?$ =FDT=FKu?pl/eQhJJ+nMymiEtP=VtlMuw%8dqYa>die9yZqDYqTDW?AJ:T$l=uWK5hDeV%+>YQQLA*64
nd5hPZ Z9:h/y4p%j5w*pHT!54A$IwWA/!IKNbR4KXaS:GiakQF!STuWJ^KeS4FGSSuWy^F<TmK5!uPwVmZ+n!K
J\^4/P <!p8wLmR+6EWF%FeVHEJ^iN+c?lRljTIi#mG+mtK1XYPK=jib$+?!&nVTQRLT*YWH=HChw1jy!/k#WS4
+pZkMq j+PwNjI&k8</FZPtWe!jZYyw&KK$^tX/Clm@Nu=9>4*b$+4^d>Awm6%GEX8W@ey1@*^qtlBZ$NR=?c<L
PRlyn1 J46FRm4eVdIqR4hN^1VpnVb^?IG6e4?tYA9<S/9NXQRCT81A#/AE$=#T#dM$<E=KGwB9+NpbtP5*BjkZ
SPl8W% qE\FjwiTcbk=iWmtA=>L!R#kGCW#kd>M!T#kP!p=C9kbTtaD@=/TPSlE48>e+PMytRhM:C@tA@QM6kD+
GQT8=p GmE5%9DjT<uS\M?DnSn@P!ZHa6:nQkkCu+B?b:!Sp5ZA4QGZAP<VJ55!jymTyeA@Emb4M9+NJe6NdA\Q
/mma^# YH5C=^<Q9I/TE+DbhFwJjCWqJ\J#@/\CQtT\9aqJ@MXJJ1=lHwEc4VHEBHkNJceCu$jJceB5XH\K?EbK
!+h<eR Qk*<ECYuA^?t=A#kj/Np6aq48VFuAuPdtwA:KFpD#Ld:YeBZWZI&<D&WuAQMa*$8<J8YCWTaidZF^BN=
Mhk#!# uNeCe%%C\D&W6AL#8LRBZ$%JP@C*KXpH@H%K%kP@SEpH<N8GCnBCZc&lBp#MjNEJ#P$LA&?GHDIiyKRL
Yh&@1Q ?DJKI5A5n*<C#L#SDj\5JV*A#B8>JndEd#M\<?\YaB/j4eBe*nbkQ8>ukL<ANed+Jp4PA&dj=:QAjN:Q
y8KBl/ Ad>G!b<C@!5q=\PQtK4SMNSbh1QA#Q6>\M^HMYD8%*=k4m@M@pp:KNpB9IiTAiD4KBpE9wYTPQB*KIGj
$*DB#R N?q:qP\E@kpq5LAt9W\JZIbJZGiaLJP+#4BtG%m9\FSwaBt>AJl=XkNiB:*JtMeB=ukD6!pL#Me8BL/C
@MnTjL pq*Ah:DSA9\$JZ8AiS1?CQlhTtC5V&bh>RXkq4qLLCiHpm<Ce=58BYc?ldE>?T:&T+Fbu*\JtMj8e8D@
w=>9Iw y8VLJy:C+*WFMP8JK+FbQ1+C=9G=Gyl@>^ZkA=SeA@\WJheC5#^iB<!/@c5tu54/@5?AYY>>Dblqdl<\
*k^b?b <<9%\H!8G+D=ZDeC5?#jBE!864nb^NN+V95/MQQiLeA5*><A:5Pe^=n::M?Bd/jpX8CDqQ\F<P8W@CZ\
G*+6T: @%L!VSNQ=#H/FnD4q68AYhb8B&c??Da\%?WAMJt8+k:kX!m=E=nL9<9EM*n88l8a>jF*kFqu*AQM9H\9
-An@db 00038e58e71001202b3 Page 320 of binaries1.zip
aZDFe9 MQj^Z\E@R5q*kZ>F!Z*A#QQ*t*kt##<QALN8i^CabiklaP:9l+EjyRV&^W\8<^Hk>!l=%MT#8M#HkFu9
k1=K\P Qk:MM9$>aPchJ+C=Zp<C@+!T:\Q@F&\Su6yby@$RtQZ*W<Be=6<AM$<>De#6?F6ku1<QA9?BppMtu5$&
Bl:EY> \w?AYV<@A<\/:FqkqyY@A?d^?VE\d*<C@D6Kjt4mPc#@u\Qtj9kbMQjD*\P#Qn5M#HX?HynH=AXk*4+I
kkQauW @I?W@B!abjaqE<>qi?aZ\D#H9R#M<?p9kXq*9RLMi9yZ\M##4\I#n:\G#QX/Hjn*5Q@aXGL><Aa\&!q9
B!#9J9 Ay<GN/I\SKH#a>D^u<QewEK*D&B8?VZtn#ik&%?AZl?CHu<SPu\aPn5FHZ$BhLIPHb#FuQS#>M?d/J8Z
VX#%>@ MZ?9^*!>AjN@P?dyV5#Lc#H@d<J<HMH<&+*=6lj#/^dMy>5\j&:HjNpK?/wS>6VJ5M>PlB%%K8!tFdDQ
/\II:p QkX:/ZVaS/6lD#ZB@npL>5+=5G?cae?eAJ9*KNm+e&AdV+ShQBh&:Z#a#*Y\N?6lm!?FHd+Mh1XmZacD
R\@pJM VV+X>8>C&L9H\L+NT69e5G5Z\<+Q\DC6kb>\Mic5T#BH:eLehmuty55\N?:BuHR==1A4MPhelVutK=lV
LR?/V* 45We<qZMGX@DHHw#hQ\6$PuZa!:aD%%?K?cTX#Fj9Abhjll/@J9R&<>Db><PHZ$AP9qP/PC:wZQ9\S^p
w\/i^F !j*4pQuuwD<jlL=<GQ4*j8nJS/AZ:+XM*kh=jA!/+ZHw^CikH=/E@95B>N%V$G>QR=<hlQ:/LuVZM=Dy
H&pQ1: b/GunuP+&DuL=9<Fdj:jeVd@4>Ht@=%6<@@Y&@!@#$4@#=B4?H?G@FtZPT?V@y<^bk$&@^L?u>Gj<Q?M
$yM5p8 QwQ@b:VN+4GZyQ@Hq!k5@$@<y@V@DCea@y<!X@y@!5uT@%QPq9/j$mu>Q?W#$9>Vhpn@V<qI@$@bLj$@
NmbMjj =XLy@!u:yQ?ujE9/j<1D$9>VDpu@V*qS?u@Kc>L@W*+4^$9=H?u@?i1q@?hdIQ$@*%Ly@@qPq9/jd+*$
Y^CXiG @*\h$9@#dbH?u/>Q?u??HhL@<&Yp@&heJId@=:6G?u??@hL@<>$q@V@jI>L@<^&T@y@lj<Q@<:$l@V?j
*$ml^M #j@#9T9>Q@<W/j@=q$n@#><p@V@@G8u@?VhL@<<@JQ$@@!ZT@@NjK@$@@/*T@@M@K9$@@$?q@?h@Zjy@
SEMl*H @u?Y@y@@Hiu@?j>Q?u?B!hL@C<!Z@y@l><Q@C/!Y@q?kVjy@Ab9@F?mZ@q>Aq@=j+BLy@\Y8pj=j+P9T
HY?+A% @\9eLj$@+@wB@L@Ap>L@C#\4@d@AT>L@C:\q@d@A&>L@1%laA>=am*FwlH!ikZGjm4+<EjK=Ej&#Cjyt
#=#Q9E A91>E*&:C9$$DZ&$CH\:G@y5MiSuCYT1DtNdD*&$DPQdAFp=GVyqP9l<Lul<H9l+FunAt8hQk@#:IF<B
$uq6%p /ELwAaQj#\c@4ka@L+i<ukQhb<*nW%^5m\Wa6@paM\Y/4kc<hm^pQkkih4>5PWESFdl>>dEQDimEluA$
aSw?M? 6q/N>18c*nnwhujN>T+qLkBQ*SC>MIw:m+%DWc*\B>5:I5H\%8$SqDjFLNP<Wq8@PhLStNdWHjHh\8Q<
iQGA!H jKp*:</aI1<A&\k6i/*R>ywI94h+9kF<b>q%$<D9M<BZlZcpbV5iDS/$:MBnKu*4/&QiB1:*GpZcWea6
4INSiQ Xhb%D&W:^MnI@9c1=I*deKc9tC>C9HbpbPV8SLX:^t%a=dhQMmbjuQXRh9&@pK6eX?&ieS4+@uqa%RdW
Hwhpia aFj&jc+CP=hCT!VTcXkckhdPhh6mP?P<XtNwc$<pbC^HK#RG#d9j=T:B<dmB4SSbV:anDCj+ewcNp6>8
leF\>w j+:Pb>^/LE*H1LaMP5M!L+PP4a+/TSh\w&QLyL/M<6l/tXRGHW9:=DLw&AKcWkahY$nVJJ*jna/61Pqq
5^GBIn $LGqNcMMP4dGbybB^^dd4DLw&KIL84bZA4d/FyXB^=dl+nLw&HyeWkahY=nHqWHHX8nTM8naWq%YBl%d
&n9L$C 5<9LwGN4h$WbhG\SH%<GHX9NJ=SB^=d&!nLw&GN9ebW*ChmVd!&nQQd$&<1k+/5Bb%i1QPta<ZJJ8ZVT
aRp:tB XeFZ/cy$S#chH>+&d!icu5wVB=!I1tGel:w!q1CZc/$Kbi?&9YP9EyiZ&!qi/5+T5LjC9SAwji&\Gpad
>1=w== #n>j#$T%n@SBGMX%8Y$D%65YQGBWhEHZbnZpX8nKM8XqZBkbykNGbX14/CPSWK9cq^$RQX*lwQWMT/T>
!kmLGq W*VG?:TwF8e>Th$aT+6RV$cLJ\ea>tS/wli1wc#Y4i46<aVK^&I:6IFGLi>Ht1:FSDkcc%Z%ubqW86Ha
lY?#5: aZ1hj$A+4A/u6D*tejIma/y^9V5t$kNy!mIRTi%T6Wkmt5^R6cnKw1XQ#&nSYCd*MEAHhbG&I^yVmWCE
I$I8By i#1D*hqpJn/5<lNb%1FRw:XHnW*%<XNR?4*BHTp6TPeNh9YI<J=I=H!nP/\4>?ua+M1Xw5uYG8/aaMh\
4<w/<D P1Xqkq!V6hFEIyXKB6i4CY4L%tDwyNDKqWaP:WTmim!cMQc/%a5EdX9$adE6%NZidm<n$yc@K<>tn5*t
YWG5H: quR/wdbh1Ca#iulA+%:ddQab>n16*nh/tZ=m^=FwJnca/&9nWK<YVieh/FTnP/$Dt>ShnKn#WSSDEInN
Dk>qVZ ^4EBMABSt>#AYjbPcpppSH6e$#QBHuYAGDentp\6d88>$%h9FPHI%4^h1@?\k@:nQX5j<Y/VPXkG^?aQ
48%nL/ X4:AGGNu*!>/aK?R\8#!InL#5HCkhV!9QDkenTh/B1Pc&t<KAl&KpBD48d$6XQh+CtLT%ETM/Xkny^!^
XChe!5 tjddh5jWhIbLMEipVhNTtt=KW%eQe%T\M=:e1YymW!1ymqBY#/TGk^9XQd6TY4<8YtI5d>VXtWFh>Ec%
8#B!QE AbWHLbQlWSZMX!Rh/dT^b#!TE&#dVcKuC=MSXC%w@pcaA^hKDcjyN^y&6$c%yFqRd+SPpXRVw1M:&EZX
KiGGRe Ha=jSFSePZ++eb&cNHB4ZGeXNN!ZRCb1#yA+\N#mAWbVtqA1mbe<N>mteD>ZtY1wluEhJk44eS>j5@u+
I#qW:# p6JW:bZ^jq9A<N1dVVP^!k>Xj4D+RSEB/?q6Je@SEAXiC*pZCpWj*+?tGQD^*Sn#Ic>cH>@=+L5c=N9+
9^bcCm ?G+E*&pRa11Q:!V\%Z??55>Z:euuwVmd+l!Ke!uPw#mj+kKKC!pi:iP4=*^quK>/C:HM\b>ykyWRDMj%
^*dwRE tJQD$^TPD5Sn\XA$ddw>Nt9Bp>k!TD!JemcKA>ZYiLI:=H&&*c6Qq%cST:=HQVnd1\b46hR8*iY*dj*^
=k9*=V VMw=1=*5V5iM*qR1$c=Sdq8!H?caE%t?+ihA\I8hQC6ibNi=$?S5QT@ikCZ4SFJwJV9S=FuPnl%66=ih
dE%>VB CMmV<S^w#5<*mX&IQLmB5:$/6eB8h!j^:NJRi>n\$y^/&&:n8?TZdKVhF*DJN9\D6#\944L:EW+E?d/F
eFEBwS p\AWiE&P$yQuTXpecB#6nP5bh+Hw!tdTYa@<LYEZbeVPu*tn9/lyJZuet<FL661^!aZbd6LlKS1q=eJL
B&1FJ< KD\qwyR+qJIFN$H\%u/iI?&6F%&bwG\P<FCwJdYyy*CZqt\95ZcXcW?B>ybtd%H&pkXZMjCTAHjth?X:
pSXi<h N=d*=HaZSujneR@&>8B5B/b&=Ye*XudqameG>8bhL:d%+qk*b9ZpW^eYhiJPN<b$=eq<ht^JJI4apI@q
#Wn&@% 5S<jKGR:QydQdu\pn<*+kJ&>4Q&<Xq5H$Xy4%&1SWd><>yGHe9%6HDLblYEit@ABP*9p>8&u5NmBeVEd
WhIA%P <NHC+deh!/8Gjdm6@cIG&+dZ&8Xl#YFd#jKGpR<WclQdqXpulYLQL6Ry>n\H6YLQL6I5>5^C=YLQK>A9
REN\%y lXtFEqCaL+YkMMjG<*qhWKS4muQ6ey1Zt>M+>1PFT5iiX/B*m4JeKtuVQ9dDnk4IV8Ckk^!!*byZwIpK
HXBY9* 5:!GIq<jFibAJSWhht=<wYK!=*p\N@&5BH<#lRiLe:a*q#PFF/N#9ki9e:a:8%8=H6%5pVn&6JZy*K6G
MnHh#+ :*m^9mS\aR?D\EpAPMNDBnndZR^!8i:XhlaG#mpqD$#nLSI&Cw>t8\8GqX6m$F#F\<w5qyBent8@iMkJ
CSFNYa b*8Lm18#=WVtLVT8nyeVYRu^eZdCuGk<BeuhIZPne^5hS?jM5T6LCJidw?bI=TJt#p/dE+&u\Dp:eK+$
V&tZ:b V1Lu+e\=EbaWRqjH#yHMT^#huV\*P8?lh=XPS:jQleSDVy%hRCic+t8$VqRFq&uhTL\dZZC^6pC#qK1I
TAPWy\ h^$<V?>>bl6VhpcVA%q?Rc+HWY51XtyceT?t1ITeG=D:nZYppK1kj@mR9Wi5jb8BZ$c4C%e&8PuZ*JIG
w\Me\c n/HNLe:RZYiQp1j#PyQ#TdmlleWcZtK8IK54mu=cDhZ\5R8%\q#dFLVbF>XRDiMw<I4Led=kwdytyS4i
Jyi1JH #&6VnKiG8:8/i8$$E>b%d+=a4BXkk=IQ6uh$<4e/FG^>&Q1^DYB4@@GEGuQ%4=Dpm:FhbCQ#?ZuX9SCV
he<tc> pXiDdT&&S&E:G>5=&M:Fhkt&<:C6\@bwdPhn8\Ddi68=A@X!kd&R4bmF:R^5F&I:$@bVj=%<WEBY6kFd
HnCP*K 1#FV5J&K:VVi<5wh:F69pG9&H>6NZZFiitSEMb+jW$=>N*J=M9W$+=FDi5*Iwi8*nNmC:cEGc/!5y^?Y
w86<Ek $QFc\!4\%B4<Bbc^5l!9tVQ>FR@Va:4=DNLa\8hb$/jVmW1WE?1/dtey89DYIDjMp!cW$QXKqLNlTN9S
\TiIK@ THE5:bytuC9WYwu?/i:yDqYmuN/&dd&NjaPihHqQpdkEw=#B#HBmnQ%nqDQpQS4qnJhSVkub+chiTkZY
X%a!HC ^tQqH=dA:jF$i!Z+5D<X!%bm*I*uPTyRDwjGGM>ta&8ZWe=F<jSa?<i<FPulcT$+$nShPN!=6lSh\aNJ
BW\=Q# #m&QhLbZyJ\Kccm86S6KT$:?E%dPWuwpc4yaTWtYn+y=q4N!bYZKmXYwQ8qKqbP8TDu1:nF@15metea&
/+VP=? Z4tbKX&!HN6VkS:%TWj%!yRVG^^L8@dc!9Hm^QLLTYjH$1/>Fb!=nZJ$hYC5@HPp#dn/aKK9FF*B</mP
>6La*9 Re>pK%KPMZNVJ+&qZbHe#G*eSHRt1n*Tb8+netc1kPS<tJ^cVml/XQmVb6Q^k>/X5Pue!@ppi=*q&tK8
Aw!NB8 9VNKY/^pPdEK%Thh1ZLTFTuu\:dFZPw#iq9M9YGn5<XKqXPtLibT#Kl65bLqqG8LPShWiX85lA%k9u@E
JiBMuw M@DLTW1h1?kFJy<<t</XEWhy$*qIjIX5P9PKDT?Meb//G$b^udjX1#/n8M:4YW+=M%\yn1@+DQjlZqj%
YPyDB* :J?Q+L11c*&c^cm81*1&1^^JLtjeS*E>6LYWjJX=QhT#uK*^=GtuBt*L#A4DqFHbWFSRSY!wp8ZEKqTj
CSHaJL hKZKTXipuH=%VHiRSt%D8hSu&tl6Fyh!St&#qCyHK#u8^1LKp9&n1b/#ASim/ykG^Re:B^4qJPJ>bjy\
DPBP%> Hl^E=cV/l4#K/iwdKq%PLX/WMab&GY<u@CljWYl>Lc&<n<tIHQZw*>%89i6\98QL%iSJuh=%KPVu+cyl
#Q\M!j *Ib\V$jdhPMXpEtXZ?8SV1T$$T+B:XDNu=EV4qb:hB!GtyQ15^5/i5X:l>?!qFQk9XicVTY%b4$RVi5D
G<X=p/ :#**h8DXd?\>mbeeLXR&mEul6p&dlW@$<TJ:PubqV&<*L#!/ISJJ<ZV$YHi<u!?dHw!1Gic1\=VQS9q4
PP!iY9 :apw$@?&N&^eX9$D1#uc9uil18tp*iyd6STbR<4mkM%+CMTND!wau#+QDBp9@V?A8b%j5Q?PWieViXGW
-A1qq@ 000bef7f074001202b3 Page 321 of binaries1.zip
T<Hw5E au\cW&pWK+JCMV:yy/#mV<\yX+PiY@W\<AalJ6%9#i^XjiwcJyS?FdZ>XhN+DVV%>LcuQ@C/KdcZW99I
X+A:^h JqL\N<:D4PYl46c&=eHq4T&>LdTJhIS/q+?uDtBb4nZiyD<=\B^eZTR>:pQim^/bH#mR</R*yZepttKy
F4SFq\ +iFW55wn++<j&AI1=wjlcK#KDPPXH&yNjnCjZ/m!\dnul+pF?tEkHi9jccmIhLc9!l@nnl@1HQtBiTGi
=R8q<m nCY!@Y1XJ<aXQ$\CQ?nXCcQKD+I@E<w9pnjZF9bp$*#VyApjc/p!^#n$N^WHj5k>Qq4qmHHHD::1l!c1
w=ipI@ \eaQju/ST<tq/NXRDb@kWQ!B8uGuEBV#Y*hXZln9E$Ph?eLL49j:?h@e@XliLlSw:X!*Lda#*5?9@>9c
+!Mj9n R+LqN>aS=T@X!4$@JQ?%Iw=lkqL>Em<F>/>Dnj=hQHth:nR?*Ph?yVwGBcGP9G&!uQByy<cY5RlL>V9b
*J+EBK %YALS<S*5t8lBpKtchT:J/%cZ>HwTMa#<YkmjyH/RjhDS6YMbDminGbWEW@&=uA=aaJRylS<9:e\^IcV
6P+RQ5 &hl\P9:l>*DiAmLVNT<9FC4pD&Qm=tW6$XLQdqRD#/$dY4c$eJ\cXnMc9?X6y+=Z@K!>V+mY?=TdZ$k4
+E9XM< ?:=+$@GLBZ>heWnMGi^Q<NLEk<bTS4<+dC^^#NPqy=#b<ipXQe6d?:XFT<Pdqm&Qd\:*4B#8ZZS<@jc&
P#@EH+ =w/?C\bZD1*d%NG?>LTNy/#c5G#X@:j*LMB6HNe6kJNIklJDTbT5&BFDAwSAWQ#@DMc&lmAAjpAAA4<G
?Hj18^ !eRFBbACTWCpAKl6pyuYci^J:ZST^/:njN#c#dm6FNiY$!1%anj?JYteJyG6PLXnS*KTVtP::hkSE*p!
/E9D$H 6tTu?&=Zh!AF*B%%J^ak>&tEP#\?9L9hji@6*6::hMX11/PPykq*%>n$$HkmPnJR/@FZt5j/9Itc+NBR
@h*=ma 6NpTC<hG?111w*cnLiB#6e%/898:l1Q8RP%5^$Jd$NZtChTMPRQ:k+FI1Hpw=GwN&me#6cuJ+#CGE&%>
@V^M+V ?\i1jYM#+jl+1C:e=&?*>bk<wjkij%XqbiZASE&$KX!#9/%*\DGFGq&NLhGP9tFuh:nZ+y$J8peunLck
Ju6>/# 6:HX$?W&BS&#uTcd6/Y!eTVmHkn:VJ+=T?Z+wLZT*DkW5W#aS\==Y5!%4ddSejN5b/nT:8mhdw@%lI%n
Anb#1/ E#&PWL!946Lq<H5G8@wCZph#6ch:*Np%dty*hMbeR:ZhVuP<QhG&$FNy546HS<anp?*BiG9QIXi\b*De
@h&JaY cK461K4b*YIJBb%^W&6<bNI!EBmaNw*H@S=9ND=8N6W%Y?%D*a&Vw#%>E*8C$>*N$b:c:ktZ*^1*Y#\h
GlKcn= XWduk4<1+G%^BM^Dh4<4$DQZ%6jcc8y1G$u+/9bHy/PY!4dJ!WP#\@/l<iCikWHdRP?wdh4ZE?4wD6u>
A:CAEF W%$^w*M/d9KG//yeCZNk4Nw!%uWw+9J&XqW*h\!GdW=Lj&P*yj@RRN>MyHpkFG&%iN^#HXH#uwZPt8HY
>dP&Bu 14ykeNw+ZSWj5RXDNt6m:yB6#lL4H*Zatn!nNYN+*CM&h<6W4L>qi4DQHa@$NNd$it5H11!?\iG1WY?@
#*Be\N &VQn:$5a&!8dLSb:Z&**+GB4S>S455cGR=X#ZWP:><VhwdGcn1E15/?**hI+*6*S%VLY/*L%i:6duDQP
19iXhT yy4J@bate=P^ceSpe+/P?P&tS9hp<&T$D9h5#D+^N8mJVL5H81!&X15ZtT?/@Db$ZnSh*Q9Z*4@W=de&
CP^cpe AC/@>R<k=9K::y=5NFlA/4ENNY1&W\wqhQ*:@A/j8>+hhGit/^TY\y^\9HV>dYDD8?Ryact4LMhebSp\
pn=ICC X%pGtiRBMXhbBwm=!nLIKk@MXbaBe=XqpE$itK55A?a1!!Dd<!b#qYZAZGWbbJMHA@Q++IF=jF\B!AtQ
i1wELY n<9NQ*a^>%w?i+1\>*GbaRQTde8RJC/hJA<>cQR4/IBq#ndc9R:WTh#iyqK=wA^YHmBQ!\PE8@cYI5Nd
>48y*V WdSn1AIQ>cIB98<wL6YjD>^<cjLp&yQ+:=&Gp4Ld>ijDF^Bm=RFY9V^A?ht#!QD\CZSXCQV/NS%<9&yu
lyl%IZ I%dje=A>YXi?&AHjBdW8Z/^AbW?G>KG*I\Ij4ewD#ERphZX+jn:YueC&&u$\I6p8XtbAtw>&=RGmW9yP
Dd$t#D !\Q\Cy>N*%q=kQ\1D%A1X/*^cqc5eZ$Zc%#XFRA4%1mPn>\KwB/hE%aAbRi1Xc<AYLFGhZ\T59$nP*pL
8M^\I\ SSaq>BTbDCZYINbL+=E:<E>&L6ZV=C@Y\I#ddy@VbMdN!pi#GXi8HplSdyaD!dE!Ht8\dAa9aVqWy1LI
8LM8t& J=Nnw>Due@b15VitTPKhbCVp?eTTeu\k*LnCPS>jtIqh$nllSLW1FKQTbyR1uJMX<=HVHJq?F9wuqXR>
AQ:utM :5WRqTWqa/Z<$<jetjeN>>h*I8:BIK4aK::T&b+/pa$#y4?b*<1<4VeqQH%w\Ie9qpc1T&ZqR+6CIjE=
!/kTHQ Pb%Q^%p+<5ZTNPDDQ*%w$C:?1WEDQlijG8K^:H\!FX%d*m/^/N4q*+@Al!?/X1?1u?q1dYbBa4^k1eaL
DbIJH/ 6ARj98kcSKc1GHha%9NF%%V!EXb>Gw\:9?4VkA<@h=Hmdc4c^jPBAGCX@iPjQ!n>Tp:u<\XW=/CCEbW#
5<Dd+D lYlL48*E4KB\yCVNCkyHT6J+blQV>jm@&qq!Vbh1Z6%Cq9K4w>W6bCtykT5wbCqJp&6Q$tp&XXY:BJ81
D!l9LP 5u@p6y##@t$^&*QPBW9H>y^Zd<>bm?hp68i<Pu9Pmw9Tb&cphP>c?X9u1RN1=Tj9>/::Nh1::4?!i>hp
4l9FG< =8b#N&WtK5m%tV5ub!aNNGe%JXWJ!Gbqbl/AiiwB8Ky4MiaB1I:Qc1@F=D\AtiiiW=8%YGbG&1@FbNaA
Q!Y/yG ^ANREykHaH==AM1=I/DN8itQENdwjuLM4!G14y>L$h4%n!B<ymS6FDCbTqLqRXhYe*k?PiT9RjhiZjQl
mL1b#a LK1<cRX9dF^T@dPCN#cTjJT5XiZtL5*Z119:lpT!j@+j*yBp9b>P6KI*JJL6WnIuK^q*ZuPW9hq\!it:
$^umRp \nedLwX&R/?ER1QaQFaXmeE/l$81Iq$T?L9GkXXFapBtqRDIA9@Q5V?bTp!GW^j#G=CEWi8tK<15#u$8
^SQymi 6:ZC/uIMP@Al$Pee61=d\YD=9NN5JhI1h#8u+T*yyG<+I:BKJ+1AXVylqW=aySMFqW+8LAwtl:9\VtlJ
AnYQ>F ybMLd=X!>:%VZjeGY48XV6n!mT&jlNqhl+T1qek*%Pht<?n/ltk16jCSlkda&K%QHn=aH=/QN!\p=mPH
tP^@*q \/qp\&^p41Gy91plMl>PNp\8#DT5*$hRyneMtN+5*b^nW5DkC5B&ctb%p45WCMF48=+e4FjHh1YYd9K\
Qb6h%5 8bMBt#9b*Mpkw*qp\ICBBt6CBk\aLNia*NJiy4<MtBXu\GCqXu\d@6>L>=d/cLWeD:lJa?mu46qi6IE@
#Jkhc# ?1mG?hEt@4mQ?9REKH/AH5hw^cF^?96B!u?I@u&a<l?l%^8q@G?p>EEyq*AYKC4Ll\YK1tmZ\IeFmtcE
j@MTtb EGKBwyLZRT^RqAYKctLyYKBwStCBwm^R>QL:l\YKTw<:4#t=FCnK@QaXAjQdb*::#G?j?i$nPd@>Ata4
Z=iV=< M<Bc4ajManRw4Q5anh##cNSyq6bDZl<+wh#*?8/H>Ra/+mZKPwIBA\b=BM!YM%9PkAEDb58bLYjAkAGD
m\+K*y jLDqY8<%cb\=Vb8>Jn*l6$E9?PD4qq:LINBBn&%WRAhuBR4w+JaKFhCBX&tSTMhqw>8ID$aF@PDNTdEC
Gjpn=y 8mJ<&K!ADuaRT^VRkdh61Wlu!EaHd+?&KKAD:>!6C8k?kA@dFNCBi$cbA416?FCS6d&mZIFQe1WC8nJ<
J&+^me MCtk&++QbkX$P@ClTkEh9Jt#KKDdmR?:FhB>EB?5C8m8^wh1BZV\66CtkP=D?FCnkG+ZQ8^SRGjGB$hY
BQ8Z:* jSQy19DByaCjBS@eC8l&+<Ni4jmqLXDS:*<Qd%6qF:KMn6HqLy$idT1X!*uQT5:qcet=eNjiWtS+K+y&
1R6cZ+ DFZkwX+$\Qeh^cZ/<+GdL@ZP4D&J@>=yKCt:ZZ<?jAElXuJ8%TPJ!5?iSacHV/C4R4DKjp$H*/@c&amX
?EE^k6 ?B!+b?4KF#9k8/Dh=a5X1P#JpD:$hpVkw%Wp$W^EWqiH=?hn*au=k!u*\alp8%lEpnRj:TKJwqL/VmPJ
VqHEZR iIZQy8<5pmm@Iwuw#N%8:<<!e%?h=#N*%pLMK=!=5@QScPdi%?YypKQ#BY/W9b?<ZkHIFdlZ8kKR=SQY
/EhC+V /H+Y6PK#wApj8SXAQVwu4ADKDqT4ZkFp8b?X^^Jud>nKbt+=Qkyu:m^5Xn^#!@FJ!QcQ:PSNb8/yA$lC
\b!X!i V=HJWGINa4$$H4pD<j6G/Z1c@MWctHHd:ZPc#Llb?Yk&+<wF:^dqb8^8n5Ze45FaYX:Cemk&6ekuW<K\
/95$8V $Ph#>mINRJHEP<qI!QPJJiZ+RQSllZM?9nAV8/S^\wlG?Ikc>i%TcVNKFe:Jm9uIca=MQ\9>p$11H9hm
44^KTc CLTVp4FT@8qn:5#:l994P^H*aBBX:BY*@diuVtVnnPulSlF*Y&>KiQ4RkA<jnW*CX:Q!wXGuTH^PV8jV
NMF184 eScPjDT&Bu#+y\<N&5W@NYnA=?JVR#!YuW?t1P:q:SKn8m@@jkR?jFS*9cy?y18%tRYJ<aKqGm@REu#+
pbdwnW 1G+INqa^:4C5=/P/XjISXu$cnD8@/6PAD#>*pil\Xi*m?WBM6<4?<e<juJJ?QiL#BXRH8eGI!yqC6CZZ
^YKWWP htJYpJqCptaFtTppcV!#miq/@F@6LJt4:&KpIEe#bem9nqa*W+cpB1+kW+apVc+>TcjbXFZ6Et!1!9/S
hcY#E+ &*LP?:jFdM<=F!\h&*Ni9V%uLb/V&b:#/8\=K<=jtbtS$4%4=Y?hy\/wqb?<*:98%&n989@K:q&Vth5*
*wlhZy qVmR=cGwINht:y!etVVRuNYWXCWk=\DIQAD#%RN\Xhhm#ANRHS?YT=#qEqi%FyNbA:Be+p4Zam!Z8DwL
J+cZ?E #uKJZ^ajqp8e=SJu8eSX4XXbL9GM$IqaLuF=Qw+CCH8NJ%QLS1*\5\kbd<d+bcK%4SklA?AQL5X9jAS@
q?q?$= XGQ<5t!\4hhC\uLC*@CGmN?B?ZPWj#4?G5^jS@tu+*Zk?&9p5\d4jk$?wVR?XhiMQ#mCj?MXJGRn$LYL
Pi#W8D ?QFupFA6ZQeS@DFL<I>BZDX>!/=:AH>WEj\W&J\NFQ<5NI:k@@#4mMVGA@+p@4mD+K>@GkqblQW*+R<Q
&&dYaE \V@/PpK$wlQTH\F:S9BuclGJmRj<eSlKk9<u8GicSXQ@u!Kj:p@l<&KCN?DjGt+l?Q@bm^C6QIWK@\l@
M&QF%# qBE<ZBb6wS6epPG+Iy=K^6CTtF:4b9!*I@HW\nL<^y@mn#?Py&L#T@EFMDtXa91byjkQ++66>MbVB=cN
GpkNGA a@$*eB61+\9JtcZ+5B9@@KtAN=qC8ujjSCRGGjn@q!k@/jVqpQ*=P@m/!YZ*e$6c8<RMFLy\W%1:$nJV
*AAMpY jNme^meNZ@BAY49T<J%@thaQq&T+wQ\NGjDJyjmC+&u*ta:@Thy%M@Dl4=8GL+Sa@K9=<VX<<G=<@nGC
tFJ\<C 9^:4F>hI<E@>CmN8I9mQaZueTPVNWQ$awqt$Eb4clj9$E\T@/WdSLH$I//P8kPA:Id/hVkYFEHt*p?DD
EhYat9 eE&/imkeFQVSeBk!eXM4W@lS@FFC<Ke4+dGI+B6@mjpVQVK<CHpb/Id54n8lERV@jelLRL$lhy$W?h\C
99#SqX iR*wuu5VqnjhK\Sj>CJG$Et$eFdRL<Q^J@A=6WP:V8PQbwL@Z<kbVXe66&K>*^Ak?J9i\\m/#mn$C*dD
-Ac?Em 000849f2a35001202b3 Page 322 of binaries1.zip
&J!JI/ WHahQ1j&d*eL6J*k*\XhyE?X=bA:\p:\d*$bu%P:YA:##tcCH+F?u1h<:ld$%JAA&$N6iQtR&J<X$DiH
@I$@du CQ:V>+DeE9!?W#AXEj#6YK>%hF\idaQHNIL@LN#9EaI@hn5?y+9K*WeFP&P+H91EQ19?Bi=dQi&*LpkE
X\&QI@ @+jWdq6=?W!tFydK+i/ZBDup4u<Pu*?i+D?H=?8!S\mjV+L<*Eu\Z*%iqMQZkihhBQ<VLBjZW9!dj+aS
@MFPK% j$Z\D?wFPiV1j++Sh>Q4Lky!!MY\4KI9EH#L$$K@eh^u<Qp>FQ<DRZ/+%ny<@pYC@<emRR/=INB?mhK@
5iSwYm LMkl6?YH?Q#L%A+eEQu5l?6?liAj?wAwl$hBH8/q>IeFPiR+4J9w4/uh&!dK+dQk1jW*BQ@I:$R=@N&j
Di6GT: a5S>XA/*muL+qXF<jn@BH#p6!CFu6iQ#9!Z+Y!bEPV\De?XZ1d=9EPTRC$I&jJJBH^*hK<4l?$D@AMYu
$4+:T& /jWVaIj@n8Aj@t>BD4qhIJ>@V@D@$mQK+Y%A<\<Ej?\lWR:jBN6?lLb*SJVDb&HMn^K:jW&VIIheG>mB
uBe+8G 4>F&*TZK&\$\q#%I<N@5F?TN5>VD\BI?^c?J<9dC4VBRBD@:5ml96<Ea$RwAS@>EqLhB\B&n%*%IqDhi
bH@npC bl?li4Fh:J@QhiD#4>N^@=RwJ>ih\?ip&kD/$ZuS:y&G99>u!9?:w4^Xk8$=V9Bj8%Y$i:@hl<?@RjDQ
c*HDiP /RS=+&:<PHR<yd>LqLh=pQNHKj+?Wh/P\+KAiDV169>TpDi8B&V1t%ViTkS=+\^n?Q\^Pq=*m@IY9RGj
q6Z%TI Q$:\#@>MpDi8Ac::4@T/y$T:><!*<Qt*KQ=XWh/PkW%=k54uX4E@Q\u&@EtCQ:XN6H8jl:a?SjE9mjJ&
w1/&Qk BPcYy\u?^:<Y=i&?6@H=M\V@\n&m9J$C*@>9p*:a<l6S*4bB4wn9WHwaF^PQ**\K%k#jyjj@G:CHBQ<E
n1Mwl> #Ju@S9n5ly^Ah@L+pp&\B9\i6Y>IYL?X%IJNjbdK&$hF@4?CQ95?:ihQm@#jlDd>P<E@?kem@@*R>#?k
@Xh<ph ?EYSj!jM!#?p>+Q6ka:\MY+CGj+S\X8^uB1&E9!%IPeuCb<V%\u$Si?B:n=H/HjhINK@C9QZ<\SjXm#T
h\a6lL @^c8i+4kK\/L>AjBJ9&a/8MulQaY9RN#$\8$u<<K:VYYQuP^\:B<ZmP$%&mB>eN@WD:*C8$%HkPd@TLB
CVuS=E %?D^%BeT@Ab+Q@aT\hjmjnIR?T@/wk%njp4H^TQap/L*IH9Z!+Vi@BtBV>H45H@$C5E*9Cj\Md4k6#?n
J1ZGE: >@tR!Pee4BNPE*#L+!Kj^>@FtDME*@b6pe@HwT&9Wn:jE@kaR&Adjp:HEideVjHJ&NLuL=$hbQ9i?KV/
W\w>hy h+w!<H>RT\MEFAACAAkAhFX6JVG5qm6ZC\AAAE+AADkAAABndGqqduS#L*BueC>6aYM9WEhRbY%lcY^q
pGFVCb em>TbZN9hZJnbZM9WEhRbY%lcY^qem=\eG>mLtJyd8%ejY\W^^X@b#5a\=p:<%XcRt\XqFSA\GCclkSE
:n\mKM ?Am^1R$HPGqWXW:A*lwu68>$b\lIqWK11yYJtq=DTj<E&1mK4p+M@/c1:CJbAjjkN4SFc6B^>I>KcYL5
dhayTm ShZ=e&?ud*d*9DN:P&9AXAl#V=4d?e%9=:*b&bp*H*h#+A8<FJDcD4T$T8E%wXD\IN!qlCQl^4wjdF@9
lMKPXD 5cZZHjyaiYQ&?c:@jmVI?M+:*?1pX=y^%$<AcnAWDB!Scq9c*>\bD4bXH+ke1t&JhMCi?n1y4VF$DCM%
IWMHPE :h:%G#h8YQ>M=b4/F?5CYN!hyh8CRT#:#tB4p^S8n\B51>t>hR8K1MDu@@D:9t\SI<&\9VWapi1CVahd
C:4T8T yhhiY%hX9:<nLB%wM^J&BNc6N^Q&HyaPT!&BDa%l1RpC+YCnFIuWBB5:Y4e&9ytd:\n5CP/VI5HYI>LY
WB?L*8 y1a\*qBbZ^?wtYSNBdZB6@D=X$JBW#DWGyBiiT6+<I$tLNmt=6ASbI4qkqe>1#&/PD#IEk!4Gi\*\pGy
n5yM>6 PbLXe/SFwuw?l/hlIi4R%ST5wl<$A$F^$P5^A1Qu8aPHP>yS#%YwkI4e$ll/pGYpb998=WZ%ST@dNQ!N
T@8<4m $:Ca%%D+ha/GjWZ:yjctmBuYaQIeYub1C*YB=^NS*SX?iZ@149A@utXY*Zti9>i/K@#K4i/R6V>=dXGh
68NF4V VeQZuIb6h%J*Nk$D44W@pKNlh>Eit+bduIdXNk&*enREm9dc*6><KDKiq=ca&1T=QQA&8RuH<SZw\ail
nPCT5T QA4H9+qlm\\>N\N\byMMH%WEwG8qDGe\:i^Q@ZD&kl@PFBmlS@NQ=1i/:qbwHpKW?^L8^Z/&DkmSwSij
LMV9JS RR@FWin%IjbmKFekyXTC@ERI@8/9lG8LRmBnt9\ZQ<n@\8A^Rww<@HXA!*>/%A>SL+a=GLA>uD\dlYlB
9>npic AN:@h\DVbDl=C9E1Q:#@qB>??&e@jHAd:@NktpiG$!R/a>yBR9ZD^XpaH5PA:iGTLMNFV!XeCy@D6BBe
bywHH^ /pi<CNMZSPG9N#AeneJF\DSR+Fiwa?d&lbDSF==R+Fwb:SjuRP:D6K>ppLE?=AZaF/lQYQL\>\Xuu!kd
Y/<D<i QuG#DF*jS9?+PRBuV/Bj@EeW#tC@PQMp?pS5P<e4b=bQ9PCLRq<$AH%QXpLjl!Hw1<BRJpMjyu<&B>9?
JpY%ka #/Q\?c+wZN&JdcAj?\Zm#\yulp?p+Yjqjum*IkwuckQ\d4WMJ%:A5B\^y4?*!A?@L9ZD:$:=+eNj+9mI
J?+iLP %=PI*=9%5I?NSeaWk^h?H4ZKL8PE=+h6I8a%FBe?R$X#+VW>mHlNW!iwBV8jjT^6PD$<PncS!=8^nD1l
MNBt%8 P9Qn?t^Z#K9/DYL>^t^bM<YSN%SWEaj/M*uXqVjEtjhWVawn#+44?*N<9?M=RuIt+m:6K!<QY8:AB/l&
u%h?pY GiHdkDytp&u\6I8+<IcVePE%GwS<%puaid8V!PF6VmKZ==%EL5<:mX!ih^KPjNbJPNRj=!SEjNbJPQG5
S4&V@H p*DmYeulS*Ip:\Nttk?ail:AnTIP+\m^twPAV^6C^wk:4=6\+yFIp@VIGLbZq@#yEXJeVB##/^4TbHni
Hq$d/: I8Jm9&Bp4ItI:CMNe<jE>ppX#C$VqH<eic&11pH\jHS$VY9Inwn+>Qm+y6EHhK5@!15PjJ4y9/41<u=S
iFKKy5 %Q\<ID<Q8Ih=AD8KPQJYi^H\qyN\=/pJS==^Em:=DTjltJ>^Em:&hTel5t</CcF>\$p+q>>!Ew+<+!RE
6<$!GK @KTVeK5@*Wp+<L!V!JpH<E+mQ\@I?+By<HT8Q>XcIPQG$@Bk%\Kw^t$6+PSntLYAw+?^%kLPQtb!LTD\
mB/Ku& MXu>Il?VZR9wQ5bqLWB>#JnLYpDV<t8BS*W6eMh:k4RHV:WutHHn>jBA>\SSnh8iwNNc\>:F^Z8C#t5N
idd#&T Y^eZ:ktK%lyeF*jbE>RcBG8%!j4N:\ut=\H@9*tA9pk\Bl\uuw#TEakWwJRRb=:TuwcGkyI1I5lQCpwc
a/=HHq MH<DEiW9wXLXKiLyDXWNuWL:iPu5:HR8@+VBq#TWPM:F>YWP9eGSJ&pauVBKKPBHJ>JGCWW<*pFe:I?P
\:<a$w V4na%%@MtQtG<u8C?ZuAQe$DnM%CI6nVG/bhFD?NL8:MW>45+wL<p%%eqD@d^RZ<5NuFSjd^R48+a@pu
q#u8V4 DJ=&Mce>Ph4F>S5eidPLC@PdZh\q9>:FZi!Qnp/+&Nhj#LD=l9LjDV=!WkC?:J6SnBR%dp4KDSQC+j=a
E<GBn6 VPY\&5>lMplIF89:S6:LR%qM:Z+!!GDblt@ll?%?15QC<&RwXiMM95FnFBau1Xna*MpTQY<tca1J:jW%
=A5&NC E>8ANtlK\5VbPuDFKbLleC#Y#iH8JIhV&qDYHYkyc4\*jtMT+<ie\RELq>w\9uKj:Z/j=X+w^qcVtm\j
GmM\Z\ ^Vh=DB^j1yjI\pb%bQFpt$k<Pt$ky><unG=mah*B&*BG6jGE\WSSL1hWn9i1CR54SQHF%*K<e4tH#i?D
tnSbb< bX#?nGe6w%?G#HZGZtqTumAJB56JAkt?jJAatMSi@R$Qe5>L!EDiD:n+AcPdYJlt>GX5PGZDnJ>RjMVu
B9PXT4 VSKP^*hELN=HRL%A8Q#i/\^QRQGp&Q\?iV/n9^S<!S+GJ=P?HyZFyTuFt?H6i#WL/%%AG<4&CZQZJJF9
iIRM8K A?=n\Si^n&%nRa#H!hk$^\LCn\XYt#HGA19N/GMB$&d$5aByM@4>VJ8la$E1&ePQBV$bdm^I1I@&YPCI
4yq*e= a#H:uLCL\%*>ZhPdE!aIQ!i$^k=nVtmNHj1epBp:/J!RHV5W&>lB=+Tb/@!eeIL\#$j!e<K:>ANaVaV^
TFi^$H >cqEB884uMFJbi/=baVlqcY\qMHJ&&XqZ:A+XZc>t<&jHI<^?wiT!h9uYX?iTca5uII4CbbQiY<tPN:4
9^5<Fk HiL!1%i+@Dm@^cjL#\qh@WAC/+NhG/wp4wDHYk81PP*/p!jF<AuQPW<Q!=iXLi6teQ#&5p@b@QFE4N9T
IW4>dG 4!FiY5:M/Z#^?ITFFi?A!9LKFc@K<d%ZPD+SH?L!^?tEN=FjG$:SBknlMN$N+LDc#?GEDW>9j+C8?9n:
Q?#hS4 jR1@Q+BNpF*@E/@G:\>+:Z!G*S>R/QMSdt^R<@5DW++FKbLleC#Y#iH8JI?JDW>9j\CLc65jIQ#?kDjB
ZuQ5Pp 4j>>T5K&Q=DDe@5DZ84t4LGAklp>F6!@:\1MM$LC:=#NM$Jm*nknJPT%KjkHia=IF:h#SQw5%8WeWVw>
&lyie> MpJe#lESRu@VJ?d%*@^NqX><npn@bcD+HBH:&@D<h\YQ=QiF>?5*A@wbIVF9PApZZnPCmNit+B@pPTKd
%>?e\l p*DW##mJZJ=^Ew:ulBku+ek#VpKeZ*!PmHWTD4<bMJu<d\aiV4Gh4V?Kkb/Xn=8lZIHVTmXEu\lB%F<J
LwL9TE y$@lNcXAhK5jQnnkN/+awt@:+ZV9DDqdn*ZRm*ZRG#eD<*<nM6bBC86A^n1R<dt9aS*wX\#!R%+H:H>Q
G=?A:+ Fb%aEcn!a6Lnul6RFAkED?INK@i%NNZmhS9>Q^5wkS?&NLa?m>i4iN$AJb=hlX@1tndS#&IbXtS%a@y<
%=V<m< %Dywyn?D>/#S^=>c1Ec&TI@ZRRA@b?9^*jA/\GNiQd+HJIBbjn&?F<KwacEiD<A9AGa9$iQ:+VeAJa@4
/c/kYA <Z*\S%\/XPn^i5AT9hTl^%?GEaD1w/dhV\Ht4nD5Wyjp?+=lq<aZ4Dd5$9k*Kk&:NL=$k&GZ^58jNi#T
#Z$HWK ?QJNlq$cj?wF$?+@Adc$Guby?9cRcjeC\Kwhq6&u1!&:c&568?5Cq6&1i598h%?%:H:9S=dhnc?dh95B
A\!N*A ut?!:G+?SPNqi\=*NAhd&y54/1SI=EC#>J^DTp%:a:DNQcZ+^jdG<LFRl<?<XqT*6Lb$TE%F?%8c&:*$
1?S6S+ I=8!$L^nLb9wbSMZj%</XqF*wB*%6pu6p/4t<eqbm>u49B&TwiIXKh#!+&Q8eDEQ5!bE49b@WE5DBBRA
WN>5un AkAIAHSXdTXjL\tH6\<AAIAwAAA+AAAAa&^ybY=$e!>\b*A9dYFnL%BHWGX6aYq5bZI9WtX#d*X!a&X#
tE!*C# L%BHWGX6aYq5bZI8euN!a!=mcY:6Yu%5Y>h%9!SqjdmTTMy8=VS8hEW4<Jy158^d#^>STqpjaSVWttw=
YLC1V$ dny51Gu!WiJMpVLjw&ZBepY%>iJ$R>%6GDD*D:pdnKW#5GFJkY\IC5iPmqnJKM8ikXyD:WSLlmaDWyeJ
Cjc4X= aaXKcL/he?>>=H5W=TSamuZADuH%*8?in*9i8iiii=>I+l#\DTkn@uBEmdjF%ZmAjELcN:m98!iYGGw8
lJ/B?@ /h@<9Z@+?b<<<?!%H#?:m8LW%H8Q+>WG:eEJRq1k&i5N:t+%1B^Xw$Qd@KPnpYSudT%&18HRb:c!:i$:
-Akq1j 000056dc34c001202b3 Page 323 of binaries1.zip
:hZFY* 64j6:>$:EI@>5SLRXCY1DjyHSmQKF/N16=%$>jZ9<RK6=9C#=*5Hya6h*d@j@?Ji&X@#ak>/p+R@$ZBI
<V=yj% A&Ru=A8QG&#Taj8qQXVXXZ9V%daHjFIGa+qw5C</t6AI1Zj8Gi!tHNCB8BJT/dH1ZQ@XLY6dH1MhwQ9C
$MVn9h M\@R/qBq?$+:Qjnpy5jIinbB/puqyej:kXuX%>?*Z+!^ETeD9in4:6?EHa/*H>*Z?/m+k#?@6@*96?:c
+u1MCm 6RQH$LS^/w9FkuAjQ8wQnLjC<IE&P4puE1H^<NC\y6K+wm4^w$1\DVVd!Tiuk?R*V^jJ@**C*LV6*i8Q
CC/HcX T4!@8KTwQ^lW/cGEy5YmK6Xm6D9mn+hX&m9b&4Bjw&NltDMqGwmQn&4WH\%TNV\Wyh\CHXFW%V?p1DmH
Z^6Aml LtK4/+*Ha@Hh>EG%48=BFdLml#lk$5ZHyjA^/DHbCKtAFXalPl*:C9\Km+aF&ZR>/hD%m%Y/98nW>ZTV
!4@Z6Z 4ti>8y/d%QY<@mpT&pP:cB@H\jF\ZKL4SS@!+EN8M6*$#qDY?#Njd9Ju94#i+>Q#=XyuXXPiXMyY+e$V
DNDZ#Q kt%TNq$$G&@j1uDp9jc1FYQn8IS<GR6VFal#Rth$QbWmh9^:=k\B\XAIeAYmWIm5kV+C%$wGBNi1Y:iM
=aP$1w MI>Jp4BKbb^&DEn&D5qQTLalQ#bRaK<9CAl&T$EA&Wh<LWh<RwC#+:/Y8E<IeP$mQwD5>TY+=Z?M8>a*
h#WJNG ?<c$#Rb8>uk<94E>Qwp>TD*cik68/YwbM&PRKME?K&+y+C/B^/!+y+DnBjY^A%Z\S!8wJ\/T4$5FIW:I
Q:&A=+ GlVw/itSdMIFJB*A?K<y\ITwlX?*5EEk<aRkw%RiCAtT/?*<y:</>h<CTp/Y6w9/1WumQjW6$uS1knmV
wSCYGj ^$kXd/QEpV^!c+bj^Z%*<j+G9#/XJw/yh&@QVKXJqY#P1WZThDyJJ1hkLHQn1=F5>?N8dX/hjFZcW$CA
+wa8w8 HZJXXy\BA4\G=\NYc&F%>uAm%TK*mFPE@FRJ+Vtk5bkQ^=J86*6upZ*/I@G/4S!jlQ\Leb^GjBIt$h+#
N!FC1h ZMD:CCdwARPjyHb$1uea:BHA*!am+b?W>kj5\85DEqPJi\&<SehQEZ6K?J=!<q5?pV!a=*kh5@I*\NNc
THJ4Qy =PH^RQ+>?BT^ZNCQYuHQp\KjFLmFQ#?a*>jC=/wZ+?PG+MuXFlw?JjW6<d<uutLMkp?Z=DT59:@+>Fe4
&EZet? Q$</+JBV6TmcM!%cW%a$d$/$\m/qE&Q@M@bAa!<&>tNnV#d&bYN9L4e@F<dHXuqR6Ny&$Vb5IPT?9!cE
*qp@Gb yWRL9C#c#A^968>eTtJ#PC=i^Fdy8Hm\$ya<YG6L65PSy*$DY4AqN:R:L6bmP&lL<lF\NGN@l!Q4h!EK
D%DX<5 qhc>FH45eyW/^HTRCnG#bI%euW:LCR5nbmb8\pRb/&uj?c=X\duXaeG/1<FmIPN!i!*1N9iY6Fuh=q/Z
Q<u1pW N18:*YaDGhj&RbMBWQ@tHbMBWNh%p\FRB%\$pPG+aABHS&\a\NESG\b\hMTGka#E$kC18&F<\\C18:$b
IIG?iJ 6&EA%h&j@b4dMID1p4!G8mR$\NYFQnjA%eX+*EDGlMGAXBj!aECwG:R84Z55yP5>F6Kh%9TFAi*EYdJP
lpcT$+ bS^i+1<P6YtTVuH!iQmqmN$iM*:J*Y##6By+:8kIcZDbGu=Z+Lq6t=>@^\c95A$in1>:Gw+H@1pBTwHd
?RS1qh R>K=8Y*N#b8jj%n+VHZunKilwjH+J8LBIKVV#89N%H%=d6M%G!Y&Bmh^^n*8nSMu696hDeSN=+u#S9QG
6/51mH %56#V^^16qF*K?CdS!bTE!h?$tF9dtlIAd=%8ZH5<m@a#SSWe<TZJ+=+Vl^u5J9>Y!9m88lLuu??<QC4
a*+F%! =<@uWwl4u*>#&<P@@Pt4/dWT@&8IZVme$t@nXwk+Nail!6ZP@X4mFAd6H&<D#5&uPd+15V/9e@\4R4l<
<1A+%/ Gmkq=Qt^F?JS!*H>XbJ8K5RV<G9p*hhNGJMuX<T*pIyaVF:PND?T$mSZkp9u8%\PbJkyB&B^b%lHMRea
4q>=w? aqdIkSuAcaaCIkea+luGbA/5a^*wE&M!B^nnPRACQAjY5ZcSA+^6^S\A65mBVa^BDnnaXmMHGIMeaK!R
+N9pDN A&D+BGQ6lS^aB$M!b5wBQJCae\BjDm\=ANmTA+DNPaD/8<$=\AKMtZKAiZZGmnp\\>1Jk*&qpAPMZRZM
!GK\mC nB\AN8RAa+@IHMA\acCb!IEbDBQpAAbT^E9pRIdjRD\:bA+\Hp?M9<mBDGN!jtRPCF!e<bp!iGWPXN##
+cleKn /M54t&WQYHK>d\I/=!?b!AZ$9kG!=jk%c\5TK@uI4dHZkJGXjG%/i44iD5\c?AMm!^c?1>Hqty+?6/6i
I:ucAX CNm=pTIj\N1%KPDdbRna$SQp/%^:LSIZeJpJN$X>ChpPB@Kuh@95hukKRVACum\$5P/\&^*c6Dc>8@Me
:q5mi/ QwEekIhQu$b%?%ypV*ii8%InBEChmEjRWEB#cTl\:6\XF+<B156HlG+aYlQ/ud/qP?mAC>lLln+ZRQd8
11Xn$@ Vq<>QP<h:4#BZ?ICGCDpL!*qkbb=nGWIy&huNXhnw\8896tq8$l=!^SNZ=u6:G#$#e=itX%c8k5HpBL?
jSN9lj pudqTtiuaPj#8R>^lJIyuDc!K4>$b!t:@GEyj<uI6L8=D*Peu>Y#YZ=!M@kj&JBMjD&LYX4k=:lA\Z+Y
Yn*BGJ YRW&<Lt/LT@JGN^IMM:uJuS:nd+!Q!W@B@\c6lyjpK/Z!Y@h^kyWqt?tXhcQliVpbqeq@TNidR5H:a?1
8?YY1\ AR5L1>YABX*\F<4ZkIWCj/FeDXk\<ShY%wAFk$?pkLWGLBV=ZHVBYkN+X/EGeGT8Ad#DXAPpkFEDlLc=
&XpCV! BpkBWRPE64WG<D=SA@n6mlwkBcAGeP&XNWAKCHc=G5AF?N>Xc5CCyFX4kMFi6Rak?^+%RP19XkPM<Xiy
M/ahtX AZ#G?HTZ4RFeFdMK1E\N+G^eZ@^tSR*k9cIG<N8TGmCM!^wkuDVZAJqNSk&Raeyc<5heA$SH%y^@%lwk
Y4LSce uLVp4:WGFQP*pQ@YGtDlq/5Abu/=AmD=H%$D@9?dnN<e&Rm<5/iV6tS%$4EIdYh%58L:%etJQdNVd>Fn
#Dw@kV *<u<wQcbbV%@I=81QJ6?a$*V+u@WNQ*w&NQ*p>6j&#D%=494n<#:Q*j<>cq%?ypy6?/>=D1^iMqFP%:=
uJ:R>> \i>$#F%6yc@?mHyup<%QX!idZ/qP$pyw>81pN%?hJIR*HB8dLlbK8bdDVjq%cGjly8qnNyRFuR@8abi*
NbR>!M Tj/?KYKR6mX*bl&L^*KPuhpLFci#b!i/*#:>%8d5W=t#j!bmpIea=Ne$LT@ZNPuby?@*Rk#PRk\tIRcV
aRaLWt GIN@l^nwEIQ$JXh/+yW@#$:MZZ?u+>XuF4&#y@@thQZb=9qVF&nXdI+/*5=/<%pa?Bm&*++apE+>Q@ZG
wjl!Re >%<+i\YG8#/ln>!hZQ:t<58HZ#=?<4u9du91QV%j?QD@<+mQPDKJn:B^/jd6C!?CVC+#1ei+nheP=+@j
Ql*HAY iiE@9@JY@tQbTB4@B+B*uJj\=V&Z8ut68jWt9I:68QCe!=QY4*8PQ?j^dIGZyLp@c4B6eh=I#j*W+=q*
YyCcdE *l!:>al?e>:=&y5ZWl@p=y$yiQyj=?d%%Q#X?q>BCFQ#m$+IbT+%Z:?ww>*=Y:jEqd@$F9@@WQRl$+E?
m@C$E4 5HTGkR?dYD4H\Ai&DZ^k^*@C$Aj&CN8GQ5#kT!L/\KRQnHEjtJh=\aebh6ZB\AjtZZT!Dn*D\IeM&P%A
NqKyBp H@kXltMtH&!qbbHw^kHq@jh==bea#mP8yYYJG?GE9k8PF@l&ATY/ER+E=*#muAAtyq*\EnANS*#a8qFA
1PnLKR HM4Q<d%+CR%MI@qk>%%i+ln&%Np45J9mZmwG+HPX\/%VHAQ%D@DI8=#Q!tPlulNH&K\<Ji1&ZA+QuIc@
8WiSGk P6>dVFl8JwlZqQ+!MSA:nanBkt/e:ZkMeDjl8=KIAh>hhNule@H#Ew<B:<ADpBGDBiM$beSA:L:FGHBe
M+mP#V nMGC5V&LGQBhH#8!^4caE%6+XpISA?EQ*/bFDIyapQC*NAaXi$uhN@aQK#Vw%@\$HKX?nWaW9/4SYFTl
!MVqTc 1lLR\4EwnaYwNl^Ync?PcVCt1DRc$?mIZ\5MA$@1m??i@T4@8qpJ6uW@EjWjmmn+LjXSJS+PnZPGZ$9E
tCbWdD FdD@5eb1&>\ZDeVmeiDTWd?1nk:H@c4TTphSE!#H^/q@!B?P69&L/T6!WA<pRCi1Sebyw8CD<aX+LC/?
!&bM:t D$i@wT<TW<ElFb@iMnKqjTE/Hp9R5dA/9I4?TC6NkB5\>wkTVcBRMEdD+n6*aPM#cu+bIlknEhHC$TEc
1RjN5* Am>lPFXV@MG&Q*^mlaN1PByRIMCkEkmQl8E=XHBCG/cHw:G^KD&5nANY+lm$CASGCR4jqcI<Dad>phlR
F=qiA6 &&/aY=AL+*SSVVttGbLGXI/Fw<HaYJtuc>69<T5YXLki&wDIDIn\n@kQk^M+uZ#1WRAC4<d+FJTMhCkY
&H?>JP HG@:ehFw^J?IRtRkhQk<dXS+P8Ij==q%CKetqlkcB9&SGM:!Wbld%G*F?J4EMI:?TERJ61L4PF?e1WBW
GDKJaQ m1PATmkiG?EPQR1QnD?WmQGj5\m9k+y/YI8N<nR?BE@Y=uuwwahwX/?94^<>yIN>99:iH41*h*B\n/?Z
Xccy$a A4P8#qNZl$K>@V&4m4Sc4jV&h?@:^5D?*y+6baY6>8+6@Fi+cEP^TCR&llqXVIpR@wmwNQaRtGAmnwLF
eZlqXK BelZbDnk^%ZZbp!wTCnRncq!V5$LID\!Gw6nC5E>>INSJiTHuMdl$Zyd/Y?9:J:#!eAd?DMp&&*mHN!@
hk<+Xq d^MIjF9?APtHZj$>Z+Z4*<tjKD$ZDw\k@\Je9\#Zu<N%J%^9h*>X%eB!bZh***t+NkVCkTm^&^+IB!Ik
4#<bq@ b?8CK<nb@wD@^Mqtm+eDKq/@B%jp@!%epj@Cbnk@WYL@I9?qqk99/bjED/GK*@:I?<?a9lZ/W8HHWwRw
PKe>FC @Q/@TD$l>&&S@Zc+uJH><EJ>Z$D&+>h&h&X@A@SjL61*ZiLYp9#?tnEY?QaIpd?ZwYVNL@m>Hi>4uya&
9iQjcC K!tyc=I&1!q^!y>$pdYW8DjL@qyKQq6+Lpw?@/imH?@9Q!*q%%P!<T?q@Pjk@wd5*$DJF?/Z@b?H?:P!
W!hVji j!MqD&!T@R>R$5VH5q&:>?h@=/Zq9\FRT\MEFAACAAkAhXX6JV%XHD&uX\AAADADAC$AAABndGqqduS#
R?aHL> L*BueC>6aYM9WEhRbY%lcY^qem>RS%BqdYFydGX!LuB!cm=mcY:5jRq+HMY%d9Z$cN>5iWNibZbmLIJ*
M%q6PX =IRk!=I6I>tDJGNCIDAini*B$w\!M:I^q^hI<4KTBZKV*JCN=PZilJ5FL99NA^:bd6kTICH5P&cJkaS>
@+*&9J Mb9jPXX@X*jQhE5FtLB+i4:Vjd41VC@X6j^%88y9WS>dEW5P^XPD!Y#LeQap<WcZuy=a6u%hX+jqB6tH
iHNahe hQQt@Ej9QQKCC%@=jMkjQ@Yy1#+ySCKVGiT@CGEhKP#JF\6:!6%CVBtt5Ji6mH9R>5^Aeq$<t$%q55&^
b9mN9Q dPcpbCI9>1mF$<LCN5IyN9E!Wa&+/t4QR:\p+M@il=#dNqRWZ>i*LbhQD4WQ^uP=bK:+@?ZLS6IDk<u\
Bi9qIN 1:MM:5C&yFm8dhVwj&PpC?Yh/6&T\ycWlZbn=M#w%&T1ZT*5:!%W+baW?R!iK/Z@&=n?a1!$FEiwT%e4
KCA&%t dNhcb%yXpZ@^Hc*F@4m>Z@R?#=MW%lIT?9?M6BDNR8/j?aH$41ic/bGWu<q@Gu:6^AMyam%JVq&RNaM&
BYB+8E S@N?SN/8Xcp&a9ww>!L@d<8K#eliHn?1Hpt>KFjQ!PLFVSlSK9n9qa^*iPVW/PY?nHe<!aqCVQ1mEH5J
-ATb*9 00040125c6b001202b3 Page 324 of binaries1.zip
>C#llD :LiLC9tH=jK=C18Dt<HVh4Fi8C=X?8@Xb?<iiNGTI%8:iy9ZDPhVR/qVpquln?1Jd$\qt69n\<*!mVT*
154yJ8 b+cGPT:W4D8X*n^K6IPT@QH4W8ui>4Bnu:^pWVMD4SZJhEBM+Qp+I9lMCG*8PDtjnieKI66He9uMWQPS
6X&?dF !Y%dM>tB\6m&SCJJKSCL=#eXSm$dTR$PBB?VJPV1PYb=K5j=jGl><Y%#hPDNeWV\#dWj$n=uVqk!1plC
qy5QS% 1?qWitQSuZj&$KakeFX<T#\5GiP=SH\\:FTIDVqZLNaipmIeM$1KeHSkmuBE4KM#KDV+/tQ6ddpliyLy
pIuMww =GBBXG@!qLC:/w>uN!d##Z*JjD:k4nyJci/JD\<Z^!%Q4l@bPEwlW@FtJc*RNmk>Ct$CE$EbnXd\qEXw
XQB%Bc /ZPn\/<l6B!1/NEKw:Ia6WR1p@Bm1iLD!/cKD!&kduS+uuS6\lMl6L#mFpey6F/L+NIEm+Dm1&LC!#Ai
61P<Wu \YkF&Ye!&9qDm:RdQXacllX8N:cwlH8mS4uB$LK8+5ML9Iwj6hR4p:CmV/ePK@WebXDk@YbF!iPQLp+E
Pu%#A1 nk<6+S\bZLmhtMD#BShynkp6#S\bZyA=N1RMe%SI<iYw+JL4^ISpPCe/<PcCm/1<@4BT/paGFBAbYXk&
idJwPp PVCpYMypDC&Su6mRe\YZR!htqBRJLH%PlL@k/hDk1\<8dl\XW6I+K4!Rei\w=Y9WyqZHt=Y$Mb9YAJ9A
pp1$qk SBmnchWYwcX9qKdXF#9K&We4nGM%4hwp9FmP&4V1?NACPtdV/4MJV+VR<nyG$%ykEX!cRyyYHSNil5h1
eL/9TV Yk6NSn6@cJEi5&u%&aTuaYAJH/%y>WcHqQXSt%ahQ&1yD&^cpcqqcHe1q\>>LG6G<5Mn+hFH>\RZ/<Tc
\G6$mn 98ciJF%XaAWYi8Vkk+=/QD>AK#1wQ>y*bA@AH@Z\+WePQtnA<aL/^EW>+cC8WZGH1KmZZNk*D8\SF@TD
Rtqj#I C*8@AZ*ikJ/8y*>d=P\wVKimd1<*8eIV1dCwB*YCC:8?kS*ikt/86*Nd&KW6/5kYhX>Di%HBjchR!B5C
GGD&ZW hIN:YIH>19DiXFAjK4DuFNbjC85qFjcNk99lkeW\8QNWXCSHKaml*c9RVqXkX!1<A^ZWdT41LAX&paI:
LA>6$> SmHhwTDkZkVZk@BdMYw4k9KFAD+R6liA>WKIHkDMA?C+B+RZ>ekK1@WmdP/6*aQ4>CDMHwVWC@F=ICw9
X8EHYA \PJiBF/I8+9RhlHGDwX/\RA96F$Pca&DaYAk?A8HjEFAL^DilaG/MClZCPCCP\8B1CEa+SWlmFF\R!kG
$T*a9^ DEX?kZk9HPWFad5mSBiI++LSY!Btc^5eLMw:HPdLNl^RtGM+#J>bPMTZV#nAt$Yejh>6PwG+R&jZ8Sh=
RjNT?K jj:5+AdyyJXBKlP\/u9?HPB>>H4ji\4ukdNi@K\=6QA^i<J<q?F>8M=?$R%:H1t#!$>V/=+4<#%DDml5
*<#\G/ @>Y%h<jVG$jmG=M/bHpt+eMSBZ*X\4e8Bi>cC6?\?F6G:<ue+II#BucSA**PRb:taQ?!W%Q4C*BC9PeP
q=#Wah ewpXP5IK*F?FVm>jQiA>YjDhlnwEA6$ARb*@wC/@#yj/Ay\R::p=4PC$HPR>w:Q9!ZEF#:bXuu%nM685
mQJ>W6 m4qC>@$^D?#pj*TeuElT8e1pe+YaI8D@cE?<B*H95ilI@AkKD!Ill9/@<=CC@ly<EY/n=n*IKBjBKXN+
4pRB@P EFuQ/j<:cXj$%>JTY6/Xm#QtaSyG<jC!VA%<qE9eGX:AI!NJ!1D@kAhmRQ>9pk4wj!cylQ++TSXP\&Ea
MFe%i% GYH6V/5c/G&$1wX?HA@?kL/FB!yA@!c6G1CjS/6^$K?l%ZnwD>P1EaM\?D+tRJ>C1+uR=>F1E9Ra4TbD
l&y#DP V>N1C9R9CDWRl9Yj$1wJ?1>yNSZ/4Wk9%y?mFRbR&Z^QM/D#Qe/E9y^Y5/CjKNRIL>bQy>X5/L?k%h:R
JB<<1: d/LXQ6Cjy>Y?GKDC%:kj>EY$&l>/Q/$PkM:nbR/E#8q&EHS?Sl?Ajn86=pB@mXaHK:&Mn#<Z?qJc6WD@
XS?9Wc KK$PkZ+!4V+I@V8$PlV/FdTcB=*Vb#:$F&m%APN&PC$ZR9<R4SbB@^m6FpM@nXbLwH?jXwhB=?69lZ+d
ikWE?K 4bbCj=FYH%J/BX@@l/G#:iHR?jkjkd:FGVNDPl?@DjwX!Qi5*<*ni1H9yNX!yXh!u81A#tuYCb&*K/Au
^>9<a9 cLWTPyiZL8njw>W1/JjS/pnwZF//wZNi/qF/Fbid%hA=L/!B#6eik*+<4a/Cu1XXL@T9$KwQ?5>y%R@>
Ca/LKR Yk\AbH$:B9h^5iV!5k+/=?6nwQP#@Tl$96=nwY?k%eik<#$iB@$eYl$QuWecjS#/ZdR/Rip%ZE?eCH$P
leVFlq /ljY?b:YR?h:TWA@m%aD$M?uFab>%h^A1\*RPh$&K4&Yu>Et/J\HW>A=QVCI9JcQ9^u/6&mF=4u&aqyl
G$e8l% PF46#dSKR?e!tMHaNM=n\>A=jV+Bub>DFn1QAMi+6dy@w^XGlNhhT15S/HjTck6$LwNdMVcP4@>p/F!i
9uF?Zk 6pHub*5KhD+QSujXe^p@FVwj@*>B=:4^p>Aj=eF/Tt@kb*$/>ANRy:QP=iDV$Dp9jAa/Z>j@l5=y>Xuw
!<qc>u F>D1e>C=9GM$jRM@m!<wjS!*D%?E#uZXq/B#&V\DP8i4L$QuQQIX/J!8Z+ZP%@W%/F?u%buR8Z+?C#4j
@$Pa\b ?>il@+FY@\4>Dqy>A@wV6QwthK+*91Z$<h\&@S6$498@Db*4#4Ple:*%Hil<#h?F#6j<Qin<#L<Q@VNw
ddi4Fl I%uu+=$Duc@=l>A9w6YQwQ?PX9<H?q>y>YQw*K:>P@VZcjWjTt@pN8$u$LuP@mq$419Ple:q>V?le@:>
%FIlTS GZS?Jn?H#6j:C?kZ$81Z$K?n%ZuRH?SJE>CjwhX@KZ$Cy>5F$Luh8^A/q:8LwQQ%ZA!h$\1DGCh\H4<W
PNPJlI Pn@D!/D@BHmChY=#j\Yh$?V@R8e$8S#/!:T/R8pVGSheCb*#&@?D#9u6K8n<:H+Nuc@uN>A=9@$YP8i*
w@@IHc *$HuQQX:/J#G@\Ph4@$Q$Hq:NZVPd>hA=@^&LZVPd>eyjSKu&@ZRPd@>EV4u6#>B=@^&A*T?=l8l<#Zj
nIlF4y BD$H9MW/=:i@RPj<hnN$98c@R8huek6$94>dwZQ<dhA=dY?H#9u6D1XQ=9^&J*VPd*hB=?h:N*VPd@hA
48k6jd =@^&L*VPd@hB=@^&Q*VPL\>A=:S=EDy96$Qu@QcR$1h\8n$MujQdI>A=9#$Kuc@ud>A=4ZbA=@#&GQT#
8Q!WVm kE%b=@#&BHVPF*?H#tu!D?l<#mile*=:T8q:eZ=:Gn4u6&ike*=:Fnw@8?ik<@W<D=*#&\9RPd?>CJ*#
BP^\t* &$9R?hu6lM:=:YZwuN>ike:Q=%ZwjB?9Rijn9c:$Jp/*ZhD*emF@$$FCn*>8+4Hk\Q>NhM$Y<H<VZdMF
YIVK+@ @N>E?e$C@t?m@GaB@#hSj4PA@=6?C1#QP8W*C@m@mjKdBj#jSGq4Aj<*Whyc\Q>NhM$Y<Q>Wm4iA@/eT
6dEucW n4cA@/eTJ4YA@/eT%4PA@/eTd4KA@/eTZ4CA@/hTi&kB@$?q86<C@y>KhcEF@D?X/kpL?H<1qS5L?H<1
Z+uAu> Z^9\@%S/Dld\@#T/Zk9+j^ylj\9+j^4lGR9+j^4lW\9+j^1%*Sd\@#VCHSd\@#SPR?D@cb!G\Q@V1D/&
8:KYmh kQ?uWj%pAj>Q+&5D@y@&KQyS4FP?5ID@y%jLCY6Ky&8*kQ?u<:MG@y@P/Rd<Q=&jNjD@hE+*+Q@yuG:A
T<RCwE @>N=Ak4\@*S1E!#k@?qWZ%4A@>PyV4KA@/hVtdPA@&hRu4KA@&hR&q9A@#Mw*kL?u$Ha&RL?u:FYVad=
IZ$Ebt =$^hG&Q!m$$YB++TH!YL$iLL!GK$?HK!PHDMD41qPpG!+HGPHcCAP<yRmye:pNnyq&@k=$>^h#wYt=\M
>yhtb4 +Xme/KBmBHC^>=?AAt+c@RSp<YjDE*nuB%49kYT95NREJ?Wd1WWFPh+*G#Y=IZX!$HQ!#Inm/:Te^ZG$
9!\hn@ qFqmN$\!ii@:uD!#d1mhcYCjNYd:6J\W#^ccH>5Xc?=bh&\M@11IQ/>k?1QQw<ZHn/kJQ9RW1IhFWp@T
iDV?Q& T4KW=CKTK$l?V*IV!b>J@pJ!M<qj8Zl^ATK=u?RBpkhJ6yM<SQI\!cMpj!QbRjIp!hMp#=A<T@Ie!W5p
lHVMBV P!&iKW\NNet4JK?S9E/!m!@ZptuA<+k6uwSE%&lS*4DKTTn@YbWpXTVXJDWp6TS$D^dhk>XAMw=pQEpn
Gw#AQ@ !RTTTTVViEakHb@&^WRTClPVTccR:EZTSML^M$qtpVTV:E&!Q<qBJHNI=yLMI%qA5yBpMetTmKwm&K6t
p5Wn=K p$SJ/pn1TXyJqyJeSHIy!iWpX=NeR*I6!ZWp%*N6\9WF!Y$p6=QeRZIu!X$ph=QeT*Ij!j$p&$piJutE
aemhSi =FGT9=H5IHtM=HGTJ$n?V9IQpmhJumJ=t8RbpthJumN=u8RFplhJZmLbTjI!!T5p4=K<S9I/!c/I#E<Y
ldRG@e *b>F>&jS@Xq$j%abTVqJBe?1JL5JJBNJJyFMJyqC5lhJW$T%eDNJbyE$p?^N5n@JRTS#TPcT#CNbRLKI
ch$qh$ bHGEHX!iid5!J%m1%j51i4yuwtj:JjTI9++i:VhWn%1&/q>Gm@=NwKq9wSj:dTC15>Fn@T=/1N>Hn@Re
^CXMaM >EB@lB:uGRy%MhymXMBIT!K5e>F:@Bq/m@?PZ8a9$E5<V@XTJZ4+CbDD?WBp@+Yi+aXAbSilF*kJiu&Z
q=RR?w wbj*K@V1Lpe9:n<WetQE^8mD$byEcT<AId<ESQ\MpQVLRMK9KmR8$eX#RBc9AWY>46C94J4*^a#ymEK+
L#@*Z% nG\b$VKTbRVL!JWS1$T1#!1$^TmL$RpnLNuP%eJLZR?9hDY<&iQknY/E%^9wV*yJJ5BD<kW$BBF+&CjC
E^aVu* I#$bH8m>+HGiCk>#Jd#LM?CFL+QZ9RIi*IQl5Y&By@eD<NS?EJ:bA?ESuRYQ#n^+e#+LL@S5iJ*u\$8:
%nI@Y4 EF:b^jDCHkc9/\H\8H+Iu8q>+auiH%:NI?HF:IH*5\9i!#Z\X1/Aq@B\iJ?Pk8jy$@DMHkFQdC<<q@*\
6SBVjH XB+N#?R^<ES&\k9=MZl4&+FRPkA=VwJud^Ai\W*\/KZl\h5A#>u^<JRN\$6&G4!XJ\C?jALi9B!<h!Q\
VYm:k1 %t&Fh!+J#>\y<GC8l<h!AF/E*<F4<D@\R9\G*wK4+S&+Ewn/%$DV%/IHel$<A*>EL?SQ<ALemF:@u>HL
Bnd85J 9^t>?q9Rm:>K>XT+l<KIuH5u5qh!N*4p>/IHjn6/:9in=@&k/9qL=H+uWQ6&>GIiRt@:EjSpHpZQikh/
Z=Y>nG $w?n=@^*>JTjSM@+D6Zd+X+PI*@8+emi#cqn+wI1Ec*#DWl>+>CC@>/%816@h$GXn>DmVy+9tqj:l1ae
:8N=^t t:?S1%KnT>cM=N@<XdjFa6&!5w58:%=^VGJ#cwBj/K@4m:W::>ZkuX<d/\1B6Q/456!tTmnGkanl=aVP
tFy8bL HuidRjZdZhPhXi*8:>S+i!m!W&N:int!W$MBN=4*t1JnuwA5d9PhkAJ8NV&BhMBRNYhSqYh^B=t1Xc5L
$HhSQe %ikt%jVL+n+N#jb$FN5+15>8V%M*Ea+Qy+4ckPc5DXZiG6XpYHVbFqZu%yG1KYIaIcHBPMCDB6W<Yh%w
L4umYb 664S>BW&mXNWW!EhSFQS*DuN%nk$i>QR6FYybyQbL&R#N%M%i%cHJCJR/eIPm^=W8>\W4$d%Zqnqi/9/
a><5RN aXVnY\K1<p?m/n+N#hGu$D^?&6M<:pB%@#p$&=<9kFNjBD\:A>D1!+BZZ\HE?twB#HJk*a<Bye/CM><L
RByK*J :d:yl*HT\Z<&aNi=cH4?E<*5YtRXB=:>Ap&dA<*P><P\Ikl&Ky4A!>CWBeG^K>F<ZRYu?Y<CtniuTj5D
-A&wDw 0003688b29f001202b3 Page 325 of binaries1.zip
MaZDqt aMa?cAaemNAM&FWG8LG@klMYQ>QDAXH&Bu^bAhm^C&X1QiDqcqT\T\EBYkE#awAIS\EtLFB\\91Ikm+Y
BA&d5W ^Xu4AAQ:AB%5PGijXnBTP9kiR9QtdSc*\<H<eHE#J=8%lRytT6n:GGDtpaA^FmBpw#5RkcGQlPuLAI?i
#jP%J+ A+R6lLa9\+udwcCahKDPX^BZPqajX=BaR6L>\B\#E$$8R%YCT6c^cnCF^jWH\TcLubFeHmuh4MQRNM>Y
B8hMDa $EQClWQk:D5a<QEXBT8=ktL+LmH=RR4cT<k<SeEV/jShmFy=Fcw>JlCl=&LSM:Ha<Wuyd9W4CGi6Be!/
b9dMjQ XpE>c\$1<^bAW+IZ%nIFk!RWASR!lpG*Kakn+eahkDV#AHt<WKkcePkDkNGiF>&8Y+EpRtKVSEu1TPyJ
hGu?=m JyBMJJqEMyqpC5qiJE$pM$ltp5\mtW&!D<u?JAiS#CGbT#KQbD:JAyKFJI6IFyM5IYpqYWy!EetqJJiV
^qBMlq ZE%!Det%*D^^t$X!C<t6JLiS*E=!B<thJHiV*EN!L<pDJN6JHmJ=tPRSpl$pn=E<V9IE!h>J@pH!JMqV
6u*8Pb JE?VQEQ!LMq#JM?V9ED!I5qLJD6JZmb=liSXp6hIZmjbbXPYJ/E$5!nNLEw#m>LMKmPyaKal5A*6Jh5e
<anScH ?Y1Bu4N<VSBANmMdRG4*qN65lSytSP&j&8?C@Tw%6IncK9u/kNwpCRiwuXDd%dBjk?$/BZ8wjKn#^LA>
=j#9Qa C6jVC:5?HL<j%:eY%*P$6K>RAAl?9k1qYCiepE1u<1u+aP1W=B8EckS&$t4%nm=l#E+XqnjM<abPhtGc
Z\q=>h HA>bnB@H>Ib/ZICBMDJ1iiJ5wYGjj<ccb$?$^?L=^KbpNmhmuh&md%M<t^^wy9ntSGakKdyV/:Q^dC1b
5%G?Y5 I#5Za!cG9d6Hy=JdbhC/XHwk5:W*8cE6t+%9p$F>?Y\19bHX6juWID*5bE/G>&^4H<#pp8wj<kwR*JEi
mcS9c@ YD5<EM<u9aF>!j!/@qS?$B>I8cd+@?9m1j#1=Mu=nm*JhN/NwK96TQMhWe4LnR#6V\+N<&l:*9F/1we#
bNSy\F /:*:&X\&EZRIFT+H!M@6/imLCXw%>!b#tbF5kqM5M=nJ66EB<q&JVDwH<<L:^1Z+:>6Ja+@8V\Mu$J<G
Ln/+\& CQYq\jJWdnk5#9PuuummjTTd!&Vy?jDP<tS8e#+#4Ha+nZK\$9ju&HFGXqFTX<jMiaQ/5@FlJ/AuPbVJ
@tu5J* dqQ@Zc*!DYuW^?KJEe=BXc:lHW\CpKuI64=>tcD$YFTtyaiV*Vcey+jDG##T6S*yLcq5Jn%Eh<6BjctN
mAi6:B /Zl?JJ95!>Mt%$MunY>$u4</Vm!i#etRbS*>dZ\Jti#AP41DWj:8ZAnuF*WRFhT#LSa:Rd4wX!dnqGN!
?<J&Hy LePJVZQtmFltc#IdG+!u<!4*WCun9>Nt$bLNwm8hV&a*^BNJD8/J=#jSX6p%H:kkhemTkaNcPGdNil=u
FQZDZZ *nhC8VYdq/b>*e$>/=Sq:$k/u^yK6nnl:T$+Rte<T\e=\VpIb<\MFaBejtR>y*hu*@AJG#LD!ZSLItDt
ye9:ZA 4Lwl1adhEB%W^48#9?W8d5$*#biLDt%W$jEhkTNXi8DmKcDFp^w!FLjwSBXQT\/+Kl#a8TVS/1<YKcm=
949Ac6 c+nV5=q*i&L49L9L+wPDtW!/iYX!pDL68ta%Y$ac4t9GyBZi/$&iItIhuh/@i5:nQRqjnn+RhuAkicX!
QEmFKl pww+yu%Nb/j*L=/D</=*p1dA@>SP&?Ck/E^qe##BcCMZAhEcd<tM=Ltme51^bIq6HS=b*?16!b\A@Z!/
FAdRS8 1KXYwj=KdqX1KKX*=c&K:4aEn?Hu<mLXLet?SDa#mIcn8&%+iDCXmL5tVtPl6C:K@QF<B4d=jD!^Kd=i
#j$qF+ XhHahey!>:J5Jn/RmPj!PLJu9&Mkqi>MJReHbES:jFmj4n$#NBSQw\Zk9iG+i::&VDyQq/1PNyLQ+#?h
G%#!WL teSIdqutbLt#M5+$iqSFJiNDM1A*QyDK4MltStRX$d&eAE%tw&QNp?$hudJmI4p!M?meQEc%ZJ+il@yd
GZZE9m QB@*HHS=JqGaWBR$w8>>iVc?5T$>5D!d\XqJ/S!Md>TS@jHeb4unV+1AN1F:Sb6#lT9c9Epq\>$dw<ml
bm1?yZ AY:K?1u><KTPDC<P+>c9d/9VAqMIuVXBnS@Xu9*bXD!>ER>%SS8TN#8k4+jQww+Y!\#4$\ii8#8Xy$cS
c?Kh8\ 5p=tc\=BqK=D<i\&:=ZLb?V:Z^<%+8pBMuQ9ZRh=@>tZ>GcRFY*><jY?+>C?uK9m:Bbiu&1iXZZyJM&t
::=/jl bGL#injJXcwYymmH>a&p<pq9y8SW>Gc9FY*?^?6NPp>AV?4pqHhjH4h\**<id<InRh&V^pb!t@!y\MnE
X/*%%C e=b5jEPM/meHGqJAb88^tdR/=<wWFjF5a6P&jq&!?TI+GXFt$y6%+hFKMw$E:EttS:T!LI=ARtTD!%Nb
F+Zy<> clI#ulDXTL4:BDTGCV1w?ta%lek/y#?dXGjYq^BLbqPbATy>Knqm1RT*?qI@cmR=wnS1kh#K!%jH>iWH
>I1%\Q 9KuyKhe8IP/t8*e#tp\KidR?8kFkElZcp$quXmR#R<q<hy5uhGR\u\wJ:p5P88pkk@6TZN/K\@WD+u#L
p8D@6/ YWu84KW5m#6S&Xi1S%NHRF?qC5G@a:HMitepApN>44tT51dJ>Y!W^%t4JwA=jRG1wLcT#mk1/R*kVwI/
G\9Anp SAF8Y!5u9!d!uhuMWF5HkhPEDP$e#MS=+1^G1^TG11e*Q8V5W+9dt>^IYWkq%F4KuePdWwte4$8!hkWB
<Gamj? QXYK%l/b*EcRN<@+lueXbuZ8lQJSjFCXRlXNMLdkD:Jmy<6!@6KdnKiyBCHq%?JmXM=hT^putW^#cbG:
$?etpa @S*<KN\thC*9EwJP=hY^%RQJAdItBnc*D/cTE8EAd^WEASd+\+GDCwK<y8:BCmLe9?1D>?Z:+q8T%H$k
9Lk%<< HPB$y:whbZnn5DyHnD1:PRW4%^DA>P#T5hb&?Y:A&jYiYIc=b*h&AW#S%ilP^njL6BuiMPmeAY4@68Ep
&FQpYe h4q5W14!#pdbAi^c+?y>\<tEj+<P:k?k+8$QPLy@Yded+5qZHPReuQ:qQSjqK1ZktqqFd/wa>Y9AZkDt
X*Jj\Y 9XG6AaC>6eDqIB$BSWuZRc&u:QlSn#PZG>/WniiT:aT$uAjwhwF\+XRe>G%\^=Fu8mNSCZNtE4:ik>NH
Ewd/%l KHS?!NB&lAY/A^AZ+BNAVJAQAFElnkDun$WiBW?/cB$b$y<dY@&htNckn5iKtMy<V5j\cKwb8D#LjWw$
G@Q!Rq :D8wkIQcBwbT8qC$6tdYu%VRPRpI\\WXSMm4Kk:Vq=dVyV9uKeS1F*ij<^V:6i#+eCdt!yR1#mPel%TF
i6tRL8 nTJNB<AG%+mik>6^eNJXK<E*W^TAVF6\1ISVnZq9^uNaV$DBHi8L<MT4Kq4iDNY+!m@mXLnPmZ\:V5$X
BiRn5q XP@Tec>#E>6SX!j#Y#Qb#RWZ/IaYHMGNCLIWmq#BR@mkAn!ECK5JjIpmTkw9HWWlFaYjl5JHRSE\L>%L
\I6XBB P%DE8PPlH>D#+\9wJ\1wJ?A?eKiI?<kuC5qc9C\ASZRjHnaAl>#DT#HkwjIwyB\y=ymnlHejReG#W+@m
9k9DGN P6>ieZ^yGG6yiTiY1HwHGTG^TcyJ/pn1TTcRVCTbSDKbbA4JZmSNJDNIbyLMItpt&b6pj=KDTPcR#CYb
p#$de\ S#KjbAHJRyJFJI6JqyC$pm\q8anpWyLLTc+t8adpYl:a\cM>TP+t8ajpZyL:TP+uiaDpRbL6JA?SQE1!
Emu+Gw k?R^p5hJumB=p8Ryp1hJumF=q8R=p8hJZmB=piRqpy$pL=P<R9I1!Y5p4=Q5+5<ZpFDcYJR&F1YNFTWy
!P$&9: I!pu1TCyJKpmwVT#cpl1Ti1mcy/Nnhim9K*p4!Q6&9ZK%8KS>cYqNH1jB?*$4qunG&NZ5cJ*de^=q%nV
ASTNTh N:J?YDXMPjp16/8:k+hLiY\5#$k9HkAEE<e$k1&N:V*a*w96jhnin?$D&Lbmi^G&q@KYB@Sn@%b5d<P&
+6!Knt D66/dJh/LnFT=d=SyB8E^RS5J&I:Ch9J&E:Bhm>5t#^H6G%?M?ti>ZF5b&I:C>6tdC@H>nF5><b&B4dZ
P<kRlQ au5N6p>ki#Y&?*9PHY$wjCNKV^F&D&Fdni%B&M:Bhki&n&L:ILdd5b*4PW>F6j8!kph+\iRqdHhm?=#c
ap56Md YtZaCwT@m9$cdKQaImNa#mY?nP*#&L/A:i8\1<RYn<$1S@\4&L/I:VPI4<Z?c>lH$qlPSu\Y&%$Ih#L1
9Nq>YW $==dL/6!Z#LnIX68F4*da%qXny/FEPM+&ua98F:>#bLQPPKG%&G@A9aX5J8G\#?q+6Y#54G%pQA&Ey1u
tAT^K= m8A+VwI<mi$C&N?M@aZah:b@SjlmdJhkP\@d?hk8!9#L/D>QLiKMky?PaZ@PCQebGCdtDBt5^DDBc5>\
5?R>4N \\WFR\/h$jeLQeP8^lyhj#lGu:hm/Na!DCXdlYFtZb=S:<5^w4$HI>*dMLK?*VQKjTXG#HhkKN55DI*!
<Sb+mm n4V*ny+@$DN19*A$9*eW@#\MAV8kaHV?cKQq@#qL?Mnie16wbLVWh8PEP59/J+/bj4P#%h:5YP8AmY$F
Pjii/: CX49GV4VJF#Gyu&E!>l$kAi$LSa8a%PdeBtda5JqdEwI#hkpB<+/*:L/qNCMVZJkK&b5!\G5tLE6B++/
t5D$Gp h*8n$I^NekAqbt#LRbIPa>NEwStd=C^wDJTWM+w^a%5PWMcMdS:I/DA&YWtlGb85uNCMVhaZlGb555+S
E%LL5G t4HJ8qlw^md4%$I#Nqt*CM*abD*8#6tJXAnN&BSyFy1^KVJZcMctTK9RnE&SV1Ebt!J4lYb5m5TFbt!K
e6yFc* =IXtdIy<XtnGy5lbRnM&Sd+4NGNV=GhCM#bFLlPc5Tq!6hCMVbE:lGb5mn\uNGPVZTE$a=M>Y&nGJu8?
$SGm1k $I^Nh19RnE%&y>CMVjb/wStd:BGlGb954\nN&GV@TGnGJ99uRnM&&j<6NGPV@SilGb95:WI#N6t9CM*a
eDlEnj FQW\NpWQEJ1^KVyjcMctcKjRnE*Sn\9N&BVhKnSnW@S#RnM&Sd<lNGNV>IhCM#bFL^Cc5Wt!aaG^KjwH
<YW>&% wStdwneI#hkWjWBw^1dwe$I#NyXXC<*aXDbbcMct59&Ebt\1Y!A$a%Nb8>CMVYW^wStd!w+Zt4GydLQR
?d9yQ* nE%qGcEbt<w?KVSnW>tZlGb5Kn6dcMct5y?+NZ:b^i=A%4LLlYb5K98n$I^NbZeJ#hlWhy@RnE%qj^Pc
l*y>1h 5cu5CcEbt<1iF=1^1Y!u$I^N=SXCM#cX%\9N&FR?W&nGy9JDlGb5Kn>CcMct<k/lGb9Kn^Gc5cp<JVSn
*u@ARL W@qtwStd!4eI#hlW@pYlGb9K#^cc5cu<^$I#NyXjInSnW@u9lYb5K4>bcMct<8%CM#cX9!w$a%NFyhCM
a8ZZ4\ VSYVlYb516lQcMctmpPFbt!1?JDRnE$XZWI#NqWeK#SnW$XKcMctm1*8ZKmK#\nN&FV^4$I#NqZ<WGnG
Ij^JH< yw4#lYb519m6$I^NFVeK#hlWeb@RnE$XV\nN&CVb!<DaXFplNGNV=VTlGb51>^Pc5cq!96CMVbZLlGb5
6dHVwE 1n^YcMct!4VRnE&Xy\9N&FS=66CMVbW@F=1^1jI*RnM&Xh+1NGNV=R/lGb51Z^Yc5ct1ZtnGy14bRnM&
lnF4:b XT$Tt4Gy1qNw^1c1w+XtdKyKC5*aXLXFcMct1m<K#hlW>Y&lGb81jmE$a%QXH+StdK1/XYnGy1yHlGb5
dYG&&u 1uyScMct/k1lGb81y\nN&FVhInSnW*Y4$I^NppENnE*X^\uN&FR>JDSnW@WulYb51n=DcMct/l<I#hlW
Nwe4Cc :W#&aQ%mwStd11<Wt4Gy?n1lGb81d^cc5cu/Q1Ebt/1jFy1^1eaTt4GybwLRnE$%?\uN&FVVInSnW<&H
-AhT@= 000436eb9dd001202b3 Page 326 of binaries1.zip
@HL>k\ lYb518pTt4Gyyp>w^1ccE+XtdKwbEy1^1ibWwStdcn+9NGNV#hiFbt!1PWhw^1ccT+StdK1=ZtnGyywH
X6G</w lYb516pyNGNV:ZmlGb61b\uN&FS:5NCMVdYLlYb51q$tNGNVdd@RnE&%^\9N&FR:KDSnW?%yRnM&%Z=F
E!4Il\ cMct&l<I#hlWi::RnE&%X\uN&FS:m>CMVdW:lGb516$yNGNVZa*RnE%%5+XtdKw:YGnGy41qRnM&%ZWJ
=#\tAX #hlWh/#RnE%%k$I#N6YhKnSnW>$bRnM&%b$6NGNV*dqCM#dX@Wyw^1c/c+StdK4:1>CMVZYQC5*aXLhL
4%k%1I cMct?pclGb91Q!A$a%Q>A1Ebt?4dlYb518<St4Gy@nmlGb91l+XtdK4jJnSnW@&ZlGb51n>dcMct?uPF
m1:FYH bt!19$Jw^1d//+XtdK1@V&nGy91ulGb51u>FcMctlt1lGb5cyknN&NT\n>CMVR&HC5*a%LBMcMctln/l
iHeFWN Gb5cppI#NnYeLDSnW<QyRnM&NZ^NcMctlt<L#hnW<GPlGb5c#uMlj<M%LtNV\*cZ5culSbi^cX!q!>k$
/Inj5L 45yqdBw*%YX5ana?l:GJ&jke^1b^K%*GyuFH8+^N#MduMDa^G=@D&DV8&!=n$:mLZecteVi+nE*nh4mM
QaXHjb ViM4ZMct<dNh^1d^e%*Gy9GH8a^N+%i=nE*nQ?w!Nw$jeltd^9?L!>k$@k!Z5Yu<D%#Gy9Hu8a^N+*@4
:>ubHp MncN9<6qdB4@yM9a%FnyMna%N41MVa&#Zect^np8a%Nn1<9a%Hmp!>nW?HGZ5cq^$GX5c5!=nE&Ny:tM
=RZpuB Va%u8a^Nnh>^Gb5c#*Wbt^y@=VI&Nh:wMna%*8$!NnZ?\&X5c6#qMnbNtPA!Np&a=VI&VYl^Gb5t6L1M
wnF@j/ VSM/ZMctCd$8a>PE>T=n$+T6LtQVlNQWBDPyj$qNPJQ/D>WpNKu@Tp%Gp@y%cmKk%P@FlEDYu<RpQuRF
^w*=6@ LiD@mYZwE:I?CbQFYN<dp$Xbu/et5p4>CDYSXPw>cnK6%I>Zp&1quqKVc/X?Cmdb59=bNSqY/thlWm#4
&l9Wi8 Q<REYNdQ^<SWwSkBLiD@md@G=DdY@/Rt^Eu>VnW^V81Q1Aq!Wu>SVbVnlVqGLPD@ThYaNMj/bDYlWi4:
Y?WYCw 1ItNWy?9J9%J9S*>bNb:%ESA1YM!wNSQA6M!//i1L*/@aj@@?<F#%@5Pi?<KQZj9%L5e=%uP^L$/#*KY
<wy!HZ \ZMeH@A5k=/n<@!eTh<HiJ:6XPTd6>5dP^9Q</$?^@*H<ML?<=e*/&MMa6K!4Il6iYjtthM<qIF^T=?m
9w#NFi VuwLSmN:m\bq!LjKAjJiZ>:CdFK=!Ntp&j\:iR8FZCFnXpK:yVa!dXXMcmPHqYkycyl&qQRnWb85Rp*$
mcMwaa ahR\c#\%$nLWbu&w1S!9Z^h16$:WV4NSe?*8G8t\h:SqKbEeKq?Sn<*t4d&TE6dy^>#@%m>ydDIn/@Vh
yY>b?M uAyWuK6Z4%uh%6QS$uFMS:DNEdwqGI*VJ#^LXRab9NY$j^<5bTI!Xm45d4w5<\cC=&Lcj?N1iq!y#9Dp
+/ZR=Z <dj=Njd8I8+Ki:*9<q4/tVKKZ6*4YA/wmFkcN9nTI*14Qnbje/YBHaPHKkM:4tm1Di\aXE^\:cJlhk\<
Xw6R1h Jl4aMSBy$ucS$QM!YJq1aMiAby1BHRPe/Rb&DIJtGNk^mJyyaMhAc=cBHaP8jdThHY4H\HBjA#5GnQ5b
6L^y*p &DHI*N@AnpHckRb&DMaPh8%C<\ED9EP$ZVV$iJKj!MCPAiJ<%!:$9A\cq&m:Mn9MnkF%1+EhA?!qBuaM
1WSWhS Vn@5&wZiB\Qa\\*5GPRt*QIYCc6RGZCQD!9uHtYy>L&FqF?Q\1@JGk&P^/<khlna<c81y\*5?BZTc\b&
pG?Dj! @H4yhRM:j9Y$!<D8bp?^6jSdltI:@1mDbYDH4/etl/V#y#^&:C1hc&B*Q:?cMLmQB>klaYD*IL@GMLDn
9wQ9en %!<NBuaQ<i5QA#9?&ISJQ8WQQ$\^!KjMydcZkS&@utp!PC?:=Qe^5GMc=u$N:Jl:d#<DP*+6%&^k^/@5
#nQl*= =lna9eT9QR#!KZ@\a::B<jnnG\5M:Qn%*&$Gh9^1MGNk^/<N##Y\+%iK=^uaMc1:jt\:1R+b&LGiN4Dn
8IHiam m95^A#6?WNec&HFG#^9a5XQyV\b&:HT/^MCPHXN*Ghl^d*Y4kS$:8P+&5GMu&E$Gh8\wP<*Any%yY\#5
L>\4MD GBh@\5CPejGXBud56L9C\I/:m=ec&LH#:\aDP*aP*tlk^:l>^MCPZ$58G46?pd!>H#c\t<G9/Hcnuiq=
4PCyC& h/6hcTp6ycY$/IXc!/Ky@1Yq6P^B!^:QwWBwRZGmqQLCH4%ESM#>A5mi9W\<wH*N<w+Dtk>a*6djSy6a
^9A/S# X*9@AZ6aGqTJcGMAPhRdYh+HZ\F/Q%DLl=P<9@F=6NG*Mc**&PYEE*L=?D5>W1^C9Qh#i8ARqDw@p>&i
D6RTNc 8AVNam<eJlya56>1C@DiL=u9k#GkyaFb\e6:bGCYV!<4yG^/N%&#D=?l*kpd8BTC&6!BT/Z8TKp:+4bN
C$Bt@5 d#$QSIyd8Dhhw:/%V#C>i:<5GnFI^XKyLJZKaAVJPCQiepy18NTnG&*lH9Y161QdYBy/p9p5E@X6#nX#
EJbuN8 S%!Ibd<Ww8&Z%5:nt/%uip>6+K:W>MlJa51tkWGG*4@6/?@hl>4XG*w/X1@XJZe^D>ld%y=N^9NJTRt@
/c1hCm 9Di=wY>dPmH5Y&QLXnI>96!LZ6@m&%$eY>cZ#Hi5/bT:bh>1<i%H9^bd65IVQcuF6%@SNVI<*LYG/a$H
c*y#Aa p<#qVhXQ$D$6n@XqEy8ViiidG@^641:$lw\w?<GCI\/h6$CWuWMH/wuFKCKjTYTE?mCPc%h?B<Y*=jQy
tM6bhH *5^IQyXP/klSVlHHWKjPi\tIPwL@$^<a>aR/ZWBWSa9<X*^\e*<&u5/qPFL^9Y8LcYVSiYVHS*XI>Jn=
ly+:l$ S!^eLMwYW\Tqn1cIX>>9eM*YphpmWZ=WZ*/kLW8yh%<L6QJ:i?tGM$Pmau/Lw+&uj\>!yDm*^XGn9/E#
\enB\F LE>8TTYT*buMML=\+b/kq$=\1Imp!Wy?5ELh*=D*/1P6<+>aeJkwZ?Qa>CZ=8!q8Ty@Qy<nGN/:I^4j%
u#p&5H duRVJuIQSS!%jFZjJ9+!nCI\h+?/lI//YNk*T=5%\$^41TQ61&SwdCRjT!Ze$GhpKKYZL@S#HC4/D/pi
Qb%<XW YWZ+6jKD#W+GL/6ee4y1Rbi8FKJ%bXuq*A>G#>q=+F^t4Jl84SI%5n^E^HytEKi\#<q!ElFj=$?J$Q/q
$lF+q& 9cpBun@&&*k!##&=G!min*+uj?PI6w@$>@AEH@EMN=T$jZ$L<+%cXnX@B+pbB1KdQHApJainT&ct/EuC
4VqT:m bb$=Ze=qp!\W%5G:hnuMDXcLPLAbM</68V^W%@wC:I<k@WLw1+TwAZPMuDhYctNLm&yuT#qB9D>e<aYR
+b=<hn TVyijVN$c9Gwc*9mCiidmJ6C8!GF*TSj9JiaW@i4T!M?T55i98!Su8!C4u=y^EhyKXlKM?WhJ$bS+>wa
AeVqny <PG4QY^=a#PY4VeS+!KpE6l>E!M#*u/9etu5^>8\9C9GjyRJ1/Hw\+:?=X*^X6Ec6jW1W><mj$86nY/>
D\lnXb hpP:<5:\9Hm:k??&6&c:n+bt:Idw@Z#*d:^%KL&*$<5i@>+8568MuM^wFaK&Rn?Z>ny=9y>bYp4LH4V5
+AJQum 1S%HV^Na<n1XquenMC6c/6*BmAdny@Tp?:Ed#akl$X4EpGk6apm$FnEpYw5aE1%FDIuYIwbEc^FDw4YI
WCQ%cB IhFc^JBwLYJI6Ba^JF1LGBK6SR!J%mKGSG5SR/K%mCHSY5TRcC%mTLRYMTScm^kT4WWMmhamlpS4EWPm
I<:=^< 6alm?F%1aGhE6Ba^JF1LGBK6SR!J%mKGSG5SR/K%mQwt$R+DP@:?$NMGh9^hwNeM:Qm:PK<d&QH*lHab
VV$Tpt &F%uR4RYph<lGy6wLcII+<apYw6I\4m^mham<u6DX1*Bjh^8R4RYpWS\a^P6SSRSZIPB*X$tSG5S?i$n
hGWbac !!Tj*t6C6BcS*$pct&k6wwn1tk#P8>&EcC&mCPQ&NdB:^ISwLcK?^>S5aMen*?aa&DG^*AeN<8qnJpS4
K6VJHS Eju>y:GJ%mL1&%C*Ghn^h/M!Bud<Vcq#Di#+i%QuGhn^h/i8N:Dn:%RNGhn^N/#TBubMyQiakS$V/X%4
&!uBP$ aMjj^ewd&QE*5@=paMjj$:4E\I=HPh=qaMjj+hy1aMjj/L4d\I+J@G+!5GMC9>MM:JnAd+8BHSQ+jeLA
RF<H<q nte*ZVt&uXT9MLBn@XIDP\aEN^naeRX\w+EhX/AnBubM+QhHA:6!@qdX&QWRE@lbT\*5?N6k^?$88>JT
cZn\!n YpyLcZt:F69R:&Md?u%5R:?Qdin*5R*>Q4cl*<e8>Q8Eu>j9>\t*<@6>\8*<jy>\P:@jJ>#P:@eJ6@Q:
w:151A jeL6b9n<PiF&M**?uHC:YV=@V4nhdJ<@J>^8H=>jK6#P:@eJ#\h?9$@+<j^?u*A:9><u@L#5>%pS%8=:
Ik%I?# :QnLVT5N:Bd+@Enlhk6>j1S\P@anhSua?j%I+ium>!PF&^u=pY^DQ=J6/Ei!Dj%I61Ej!Vd$I>tGjmVd
#@y?n^ $I>pG@1SdQuh/dH>Pdd!D!$*5L9FlGDjq6?tH699a!5@W4&B*i$tjl>d?bHGGhnhciL*5bX@cIyB944H
/=Tylb ^P>nK#>Tp<F=H#D^?>nKQ:T9kh%DJu+jY*&j8>uA:lEV9+?6@D/Hn6Z95R*>Q4cl*<e&>Q9alu+j&>D9
:+QJB% a^9/jY^D9+>6/Qi^Dj$?61Hj^#d$?>mGjl@d$P>nG@y>dEP@n&*w>:EN@V/&wh@HN9V:&Ib?H>9R:&Md
c#4NCp ?u%5R:?Qdin*5R*>Q4cl*<e&>Q9a$8>nLS!:jyH?uA<b&LGj=1P:!//$qJdTWq4iBR9:^+?#%Fa6ekCW
RYESpE Ni&CC%@=9BBN*!pq$S/:HB<y#ljVKX>ph?*/<kPq=Nqnq+@d^jqmD8YLw!nL@KYWQH95epK$PF<eVQpm
KL$e4* L5VtV=TTb+>hVm##>u%W9wlipHu?PTF!hmq=>6Cq%B58LcZFbJqp8ZM+Tp6yaSKaK5qS*lDqQb//Xp1X
GN1N%Y Qd+^*WZLEckuYupbVK*Q6R=9HE+MdG+hHqujtpwuBpeGp1Y<58jpB!Hpq*PK<<NRQCH#SCty>4V<wN1L
DYF$l/ %4=N<Y^!wQV<>@n<EC&wH#aM6ma!R$Q@u:*4na*n8P/#^!NyWdJ$W8\t5S&H5BQbDiYn1D?&ICMPn$jT
ZHPnyK I5PnVn#TykNEq?Zipq^^id9h*bQJ&CqWNHAVwB?CIJ<Tw@/RjGnSPKlV%HEL6#Ce%9&DXGpK\*CDIpyd
CDeadT J@GZ11/K%qbSGJ&b9Z<<:5#5ipaWJd=uW*6:N@i:?jQt9di#5:@uXEE*h1R?:N15D<SbRB@6WH*w1?8D
:BHCCy D\+D>AGSujlAqRL/$NKHQcE?FB<6G4bqXwMyc\G8LHc\Q8\qn#YiDQuWTnZZhd#kbJEp*CucilY@LQaZ
Eu%I5M QSNHtK=qt=Z?ilIB$JcdW^?GR*bHnn=AZ?$\jWlF/EQDC5^XLbLbTLjBL8\ajinm/AN$%M:Vl*TEQpAH
\VASyL :X^>/Kd/AF$C?lD1R\@Yl#&:Cd<+n/y=L/ZKH***w4c?>k=KQZ5CHim4ND<><MKZtd?$9u/aHw?<@KM9
ZLh8ZG +GQPhY$XPHud>%HYIJVwVJ#C+&GcXS#>&J6^996&YCa@11I?M/Yb9A1e&dH=&i#CM8LlnPm&:VlX$m!Z
iE!%a= %T/K5^!5&1lYSKtn<&n@IZL^<H41ID:Q9IZLcqhST49/&p8%C@R<M*SM8#Jn+<@y8Zay%<I=S*y^Vc1j
R&:W5T Ka/HLJe#ZnQtF^FXSA+PadyHJP&\=LlZHKPta4\<*#NW+BAJ%SqJ6a9mpK#Mp9&VEiWN9CP$CP?hXYMS
-AmlC& 00022fd9f45001202b3 Page 327 of binaries1.zip
yhPJXX =HEKlcpSlKiP\eGb5ld/J%bJDESc^4AI^cq^JVnW55m*/@VIbL?wQwZm+<L/lBbK9n+NC&Yw5FAG+4j4
aHahJ/ <j:<aH=kwNW1F5:AAFKCa/ABJVm8Kl^ZTd9MNT/PcN^dHkY=4pS>Mk$eF^uLA\M<uKL8G:4hBlVbLqj*
>\wFPa pSIea%ttu!?$+YBNqMj^pP=#&pW<bYQCe<jhN=hp^=%/TkKp\qM1\QGZ:RXEBy:VQ<Y^ecE>>IPcEl#1
WAQyQ8 eZEu!jS#5iX^&VqVGl:*5mKQi*tLQT=8tSKQ!<aJQi=qNdG<QM=%<bVN*yH$qEKetJ=TmPP1\uGX6G84
^lSlGA QTYnQ5p>bR6I#qPKeGJ/Tpc:Eu6KEW+MV=u#+*lKQk/8BwbBZJ#=@Gq5^#\8Dmp#*tHJI1>NmTI1<dn!
++qQSt PAp>L6M?J@T+VB^qH9h^1*4$TQ@cmRebH9jY88Y%F8JwQMbSautFPDE64^DHXaZnKtqZZI9J\Mpp6XAM
WL1j!D uMRYTwTDJ/HAktM>^BEHB8K9uyqeC$=AVL<?ihC%uVpW^:aYWL!I4hqDpjX^F5:^&uX/+b\Rb%hBpGn\
!#JanM RH=14wTddm+i4A*V>hDM8/<*Q>*@*G&5q6Q%WQJLq*J9D#hnZ6!FHJ!w%cEY#6FKK?cX^\qZl\#d=?B$
TWiKyb 4k/SZ84E1X5/Qp:H%T5dB<<dJVna$muB5Z%8jjL>NLh1j#:eS8X%>QPFhw8yyD:aa14A\i1MJQT=laM6
R#/Y*h kkSPytZB@WWX>RqnZq:@dFnXajbQGQM1\MEiSYK<Pn!KQE:kI>q?uuc1J9<YacFRqE:dTm!t/Nam&l?t
db=>Q5 +bcV=41GAy#</h>hEbX4*EQlCd%H1RBu<y!*tMX@M8*KNNbHFQRQZS>SkNNaH?FJ%QyIy:V8he4%V?6i
Q+?btl y>^+%c>L8WK8T$XC:*XK/k?bkb?#*HEXipm9T^YMP:$8XaDVh5>W1q*Ni/cT@TP/ba48*G/Ynpc#AwtK
Yj6ht% Rni%uET#KuAWYTkcFa5$Q8Ki/cbb8l$6uTGe!b98MWZnDA!w\VEW%ehXliM1\TE4\bJTn+1q&6Y&Em#C
/h%F@t &ZT9M:I?JCyYktM5!:T4I!yYkPQYbNy%RcHud6=:qbV6=uHyT4BAw8/bhkyhCXcA$%#QpyBm$*MZVG?J
DWG$*R eXHW8>$<>:d$VAyt#qb1cl\S*bT@+YP/6964WnEhG?ht981MG+5^i!hlLCdEMSVX^%YF+!4B&iyanFGj
$8#>Tb =LEa8&HJanESV5^anAGVPBaV+5TN^cKB%Mhmklkk9L9QFZy*H+uLnA55+k$i$#EXMYFM^=u^mtK/eMXt
:Stbt5 %DEa4u6QkuZiWX=>E1##euHmiDmS^m9*eF8:4546u?8\4515##BK6K:KdXietS^u*BP5l+/K=qjM>XA8
&e<H+M ntl:Dh1dKIb1&&elFWMJeR^F>ZFX+dlKeMnh+1&MwSn%!TTNYSk+mYMYEa+uHQh\u+/wj<k?HeThFb9&
C&j/K^ /X\4H$l^!D/hiNh\HA&1:>QlTNR?uW&TR1l9?9S$4nCYHb5ja=6Yt5mc@FM@#tqj$*cqutw4Bi#hIN6P
D>kmNG 9aFKHKSDkEweJEwjWI5KFKnERS@c1IKBTl#$kWWqD6VSP%kjiwFcHtS#/ktkEkh>ACy^pE*/AFVmIEAq
:E@E!< DlKyD<NAJR/CkEwelKpQRCWPAqVmIC^>ACy^EKATB!y^wBIHKuGkEphAJj=BLSSRmjN\kEw<1n=AJR=W
SbM/tE +pAq94qhRCWPXPJAJR=W+pAqDqVmRCWPXPJKLC>RmRPXPFCJ%:GATl!w^IFKHKnEQ^kPWIq@MCEYE/nE
GZXY=L bZGATl!w^D>wjekMBCy^wBKQ^kE1ecATq<eBKuG?b=IdL/ATB!4^:iJ^kWy<8*l8wBKZ%>R+AqVm$nlA
6IWWN+ JR=W+4I+RCWPXPJT5bkkBkA1<dm^GFCJd^KkEteLWIpDqVlRmW9mAJY+mykF1MSF%*DZut5bCMBBNq!%
:tm?yp \M!>RYa8aWuZSXEBCIp6J*PQ=enj9wIbiITcceY9*#\iiS/l*QQc%e@*c%htu6=Z^X?+K*WPjZm=ayN:
WC6jtC Bc?Ybtj8SX*watF5i1=yMS>KIZSC6$j%\EVyn/!WZNP\hD89??cwy#>=!uFYWQj<!4lV<$dYA#Q9XHC^
bG#M%8 j#\/QHREyY>dtZ*Tcd*:Z!8u1&d#6P6dK>P6D%M9q1!q1qpld/Ci*%1b>ZSnyiBW4EZL>GdZZVN9S:WJ
EZ?M&H u>mw/:i#yYwq:%VyYZ4+WW>*q!*DD=Z1WVQAhhhu#EZVM=Fluq=e>M$kX/%MYc6YkL1@qPYW4&+8j>Gt
PdS^yW ^@V!^1?XBF>:Jb8wjM?d8quP%@A<9%\\jX>jMthS%#jKdi*54l$djlDQq=/^<8\aKht>YD=hGn69XwQe
uuTQC/ ih*CBj/1nH?E4P8GpGlQ8jHhum?XeVPu#Tedd*V>Tdu>t@>eJtM:%P#TP<4nX6599%!t\>Q<iJ+WZ&1i
cM*aXG @p==%9TD=t@>1u#K5m$!#9ZQ*ZLJ?tL4>D@KBih</@R5Lq=yuj=j8dV5NP9b?+jqWe6*Hd>bwPhT@b%t
>Kt$Db W:=Vdt6aiqh=#1$$K+Q?i:C9Nnp^m*d>&S<%FL^:%\<#ITjF\/eRPut1i>eQZpu@^LG#*!H#R=6E8?q<
p!uk1y TKGFYh$n<?RbPp>T/P9FwpM5=I5#XwY5\d?1t\G=kZMSj$/8<H+/d88p@C>uC*TN@w44$Sn+jeKKlVT6
98qGm: d>S#5D*V:pt*ScJyC>&KD&Z/G5>NjQl&*h*emj>>n>d=EPHt$@4w/!!/9^>yb?n4B>B^@P>Z/8Z^ScL&
kau/KF @j44TaS&j/@ldBDlBSdjY\AB8atF8\T+E\Taj$Ek64/85ZWZn1$D#%yDQZ?jucmT8MA5/QTN%Di6XbS!
Ib=lMR Tm9tp@X*89+/&*dY@de?QyqH*Z>Hnp?kuyj%BceY#KPiQ/e9upBhV5uR:Rbi?yQb>6PiC4u@biLmJupS
tn5w^5 %cd5nBQkwL@?lh/@4JlLuwp9WZ5@lcP@1t?*QpQQbQFd1Q&6ut>XVD9RV/GiQ/A9HpQcT#kcucnkINMK
8^EFlX %l8NjCEd<ib<*uEdJ%$Qb>9PWn>dHWKyT/6HWPw\CcBL=t@WTQDeKQ\9&al*6XWccPP/FZXQZ@YLkai/
IZbWRP l+#XTnquBJbVydH#$?T<mMN5DFB#pja@=ZEe+l+bJ!$jI\Eq?XdKKZ@P>HC*+pkiyh+4V%RZ/!i>+@nL
bX/R*B ^54RMhV#%SE4tQWD%Q8#dQ$Xi1TJyZ$m&*#h<+QyEe@WX&d%Bh8pqS4biI/i<qjuZP?Wdm@tq*WQ%\#%
^+i5pG qQ%X@I8YG^S1%TY#k4y@*%<6%1yGMGP/yw=@>c6#%eBbMc6NFG&m4e=QbF5u&1hd>W@>b4b%p9:^XIH$
u!K:LB w*j?#KpK46d@bniey\>Y\qiQ/ZaNZ>bNV^ZINbPH#6Sn/>%n@>CM4ZhQH>+RY?<i?VtJ4RhVN*F5uWIl
CIH@5+ L&=C\dbAi\V@jRd@Ddiqle6AYnmReDyBYnmR#j1AYtqhIC$e/APplRQy%AhIA\dCT!MKcRJ*6n:5l4S\
p&ywda IB9TQ5HmMPkD/p\VCGulRB?wQ8!D6HAkpBaPlKEQpBaPBNLCkdD$AhLCkWBcPBCYQ9VAk#wkILHpht&u
W*kDQ^ #bXdWPNS9lT>%wC>MiA:WN9iGIkqRB>R&>yWd=%\tpiPCkJ!E$9P6ui/RRCjAEJmk%=IQ5DGkiRD@Q/B
:Tew*/ =APRjEBt*CH=\Hc^hJB<AJIQ!PNA<kG?b=IdL$k?AMpH6w9HliRD&<X#R@IBiW&NI=B<RBwHpk>A<kFb
YQ!*Eu HEk?AMpHyGI^RR\A!Rjm^tKRjGCVRQIB6pD!AWk?AMpHJHEk?aCKtAWw#EZZeNii\n!FWN@$/iqeaT\:
WPK1^i Nn@GN1$wZj?ujy#V91d6Tn&%EWpk*SyCZY*dRq65a99TDZaaBLKVBhnERKL$AY%tC\I&5b&6D:eAt^lI
5d>TSN BF5R5EiBQ4T^DRK:HPnDBua=aBMDjYlnn\I&MhAH1k>:kE$MbAQdILCJkV+kaBMDmhRHaBMDAVa^EJa?
WZFT!u AJ5aCLCJkdD$wRj$AYTDQuSBj:V*C=+ji*cL!A4&$1e>S6?>1K&99aNT#==AB@w1#W<Q9QBq=m?54^?t
u1qc&n ^!M9@?kL1Q/$l\Ie89e$*QVH^Gp<8$\&i&:G?i:dabu<1I4/$D&5CuAci%l=PFF:YD9d%h4DYm8m%NF=
aPY^t+ 6Q<R8dl?QZWRu&jiIwpb4/KWh9Y%q&wZ/Hqt/Jl&bedGu>N#:XK8lWQ*5K=J>ZN>D/9qe5cL:QYpm5nB
pmk8+? wZ6a!TbN!ZGu8>EXnBjh\/wAl$l>D/6W8!kP&eM1&V<b$WQ>h+RY+d&#cm!CQA=>@k6QHaPDE@W5@mcL
X+d:wm RJ:@WwFDLa6<8?k#@aL/SD*V*%tj$ELJ%/hlwR\XF5yA@HbFQAMhnVM\kJVkGGlACa/4C5hX$m:!HJuE
?u\\=c 8Le<CuJhmj1$QWhGNm@#eDa>5^:bL9IetSIea%ttu!?kDZ8!=ZE<yQ8ehlFQ&bn\*HEu#?JLnn9%qASI
+8=tWX lchWkEPj&!ID#?tj1GjwP@8HQ4iqAIh/ZLJuZcJh^bdHbV>!*jC+q^X=*M6d:HGdV:=Jiq\&V8l^L/8J
jiLh$T =iX^4w8udH8?WMyVCuFmipwln15K^%ZT41*&qI#/JQiWLTA=V!uCmipyGi%K:CqFPDE<be/Q+!u=PQWu
nKai^F ydp+>Euy4MjFmZyTP9LcqCmmEw<4n=QR+#L6e$KQ!<SS=uFFD&4iY4i<%pIenY>:?p9K<ky^aqyiIa/4
l#nGGS C5hX$1/+FyPBp$q1wSk+mT&WCAhQRwEFD=?9^ED<%VPVc<Gnu1?<XnPH+yDuK?NFdM$im1\Qid/T$//w
RGR8/M =!5:eZaX<u^8>\Q=1dpTIw<CH/\N$@ZR#L89N#@h@>^64JdV>XD!T=h!d\<*a%:elS!e1NYlF5:STm9t
BEtW8V qeeJX+eM&?jkhK+PpX:1^KqdPn=P^>W4G\jQG!W+&NIy\dF>du*!@Zt!<61jD:ebil*>jKHham1yD:ca
kHGtaZ KuDIp?$T?6#C\SbBAmjV58D?ww4/lDE94*<&4Pw\?!iMiSZkaI<mMX+hHpWiJ@CSdD<DD#wdB*nR?j$D
Yk$ti> QPnAk!+#:5CD9q$5HjCkA\?/QA:\wQM>p>^+AR</<KB9F+<LQPnd^ZMDD:1<y5aS+EGZ^kEihPBBq<WB
BG<Sj* HuVkRbiK^RR^AQCk^+*FkAh>p\AQPq8AB^%+$IEHZSIHiNBX^C#Ak!//l49&QPn6ww+VuVCe/!KLBWL<
pZmMte *tV85S#=&%e\A+@RK1*+>S6dI<<nqH6i8@4=j8*K#NQ:19kLh/ZPwR<9X&!!n9q1cZdtZ6TFLldGy8j1
VL9?VG kBy/CI@JCR<4c9h#1<==!=^%^m*dQF&%%<jY1H:*yI+QD^$?hl^yu%$%K=b?y1ddX4A?/8tLAiwht#H^
@\DatZ %<!JXZ*JHDX>\:Qe\HK1a&8BYjZ^C^\6b$XF$4@KXTwVWY&mH*h@M$5?b*=h?=Vbk94nS<&AZdV:>:Le
5E==Sj #*6?5iVy:4Jq?AYuayaCV:iYqwPe:T:4I:bb4cDWn!j!lXE>$PiKSbS/\<CqnIu1wnQ1tH=aRu6#^X#H
4%blcw ZSmaZutmGylL&G9&@q9kYcXAD<#!FQ/uG1BW5YI8%Jb!B9u>e5tyiRc8EZ/HFE<jd9>\!uq!!n^9&5&Q
bTM*E: 6jjL#hhhK?WT@6WSe>uC9=*?$*JS6/yB+@TH=d^8G+@XV:X@^^Y!kmIhXH9ECuL+#h=jbP896Gej6*Cd
1P/JRA q!$<4KuJdP8p?<k+@u1J>6bMDZjT*&R*96F:B4h<#ne4CL*yt?/$E?Rh*J<?dYq/^F@>4LqiMwNS!=5l
I9jY>Z *VqqaqD$wL>cY9hu5EhLjeNj#T@4Hu&@=&=@hZ!mSHh#aWne&mX@hcJmP9YBwi?l@:V%/qLB1T+=61XZ
-AeRl% 0006c62c38d001202b3 Page 328 of binaries1.zip
^R#I:5 <?8+&HHe&Va/NhlZt=!aSZ9?/ieNBi@i</@D+ZQ!D=>C/PTy:n%99JQ?mYMQpwD4Lt$T:cd#IaWYbuYQ
jM$hHj #JNu/D^Jwc<Zm\/^8!@PYBY!Q9m1dkbpejpm@y^Eu#<h6*XT@yi#Bdy?iMZ%1H>?u#BcIW*4G@WedM?$
F46@5Q i>J6ZnJ6wX9^wW^j+:tJD>?8P:E:<d@9$VwjI4^/Yl>>uWZ*>!Q6DH*>AD1P@@%K9V^y%jj44!eS&9&>
AXKCkF lk8nq4qIYB4yj#6ed459j*y$:L:??$b#5#q<KE:pb?@dih&R:u^DA*e1LiY!H?neGQCcm+b/NW%&QGp:
eIu1@A 4thndkFhapZaA8uMFcR\V^F&HpVCc/jT^BkM^</Y=TB\V\+PpuZA4F?4bk%uhhD%uE4NCQ#Be=YX\cH5
XKZX/Q $CC?=9WHhhec9Ap:AKIyEHBdIB5YFdFn*E<8>L&1GjTQ4dt&+=pJH:8aMMP9be$%E*y$B$yQjhqm:$Ct
*DIe5k 8Y!^>/m:ahqm:@*>hNumL&:mba68@L?ihY1em=DQaAp*dGpZ\n?CPQ@K6Zj?=JidRVa54<D!TmlAS6wY
nVdE*W H<NqI\leNubIYwGZTG%i\JYayGC#N615:VhC1ZkXB\EBEen6>YAEIlMRmE#k&kY8ZWDAR6!w%!=\FRQY
#TIL=Z C\T5X^#y*B!#Lc@#FY*ZkjWAEJAp/\EkwAh<!=qAV:44j*BQGAV<MRnIB:DDMGhA\HKCkKmLaGE&kaBN
1tLW=$ BRFSbXNVcM>8WW/M9YG1V@t$+tG1V*peTuEYep6JySWQW*VK%!hM$TtQ$/BK$%Tp/KSWcdWmVe8!@>A\
D:PKY: @9V%%EF<uupLq>Y8wyS&>dYZcljwiYdwtHbq^1byYjD=l9R*qCy6Vc1j/%Syq55bL$IySlYSk$Py$km#
HBF:T5 n8T+W>JDBiNF1hIW+BCyW/XJ6a9mEPIl!j:JmHJHNJL@uqYW@Qj5Fmj@bcbQVyn<q+$VJ9?XdqiaWI%j
cj@eZE u/nWEb*%1TeSQu6DJlEYy1YQteyTmBM#qcWR^%YF+!yy%%auEYdWJ*pT+ScRZBJlEW:MFJ&Mhq%ACXN$
L8?K\/ muBmJBF8VHn88JPWD=LnHmd@^WBKp9@K+!SM@58$l\tV@#J^1MhXpj^Z^P#j<LmZFZue!%95ebuyp^N/
nw+e%V ZDbP/HE91+uq=ZG8m/eWy1YQ/TtFPDE>ySDHXaZnKtuZXu6KSu&Ti<wYpJ!uFPHE>JTMhmZ&qCKeGJ+!
F%\Dkj =<j^qH!ePmE@F+eT<te>Lp+WIZ@p6TqSSCWiX^+uwehq&8iEHyiJw<#nm9nAd/%dZt6BTX4/tJbZmBQV
tX@Clk <ky^ZFW+4yJ&^dYaDJ^MWk9F\Eq5wWR+iBIKLHlI++&B?K6uJ6iCS>F+Z/8bR*EInZi<mK*bR=H%IVVi
ZBpJ#Z uHbF$Zl*+8\1=LpbuhGB@NSeCSHGiap$%eQNtBh*IReucuYwM+%*GQQK++T4R+d6<>KBh/\P5hQAI#=P
h\TB1! :HV!iN+w\VEWydi*jY=><9&WwLp@:/!/qp&XKDLNPdGaT81DLcaKHJJARWX/i&ISJHA!LR98L/1wV^n#
CKc@k9 <9yu\/wP5*@CtFeBD9awE8QX+XHpeRIj!jd#6FQqe:NylWI^Ii@dbmEYW*S4Ei*jdkpLE/Sl+ybJpIcJ
:@9JH\ Y&d!uLia^Z<!:e1kt##^+hctliJmZai$WN\btCA6FLjMhp5W%*dQXKyh#Z8tp9$n8tX/\/htbca>Vymc
deWL<\ qa&n!ELS1Fmp<SH*VDjN$l5=^c5\LZ*M>GSCHENSjX^XPK+TuK%P<e1wV@IW4?!GJW9^K5KJtT/NAhMS
:TdBkA FT9Amb9mNS4wAqKh+6Xep6YjG#\%K%PBE1bt=e^WScqb1ie8tN+T+/Kwh:6=:t*ytSVMuK*W%Dkm8mq@
%YK9tm \<h$#LVHCYM/N5:NjNWbN^aVy1YQGa5JeR^F>ZFX+dlKeLa/FtQWJ*p5^t=a5qlMlBM#FtQAJI:FlDl^
N:De#? a:FwIQY^tCAGCP@8e+Zi*WjmM1KE<nh+VMhW^IR^HYjGK+4ytkuBGc=:V+J%Zt=c<RV49F!ePB+8V64%
^Ni4d= G*lhqh5@%&FhqXtjabSwZbZd4nk#Pe/+J%kQHSZN4=n4wX\e$jac6DhSDCXMT^<#llLmGI41+/4CebZk
VBYtcT XE!yP$mJa!lGjVJJa^aGV8KaSaVnCee>*Ken/l?!V\h^b<YtjV4Z!khTHLJQJ>+%HEiD/96$PBK%V$hY
e:Su1E 6tMd$8G#6L&yJ59Llph46jRd#ZIp/<E6MewS=6hhMe1SZFS>Me1S*FajcyXL5<46^ajdayV:ED=<NMd9
TYL9!y p6$Hh<Rwh#6bN+qS:6j\+c+a=Wn?4w@FKQeSjLk:S4tQ+5QHa=V:GD:eG/Qe*jn\mSnqQw+Qu+^SnpR9
X\ePX4 B&PW8\ej:w>S:mA?HI1lB:?PD+M^<Ik%HwyS:kF<PB4nh+@k\/P6eq&5epj^+XTMe5j\+WTMe5j^+YTM
4PeXW: e5STVMRw>^A?jDyG9=B>wI@EKQj@:X%yhBXXE8=?iepLCb951CA#mIbFXwMRFyEEWDa#DmPLa<VnaTTR
Zy4M<D B$kCHtaeWXAalSA&ahlECVI5RXtT5Cbm&CF5CSLbCTAIIw5I!D:%9T1/PnuD<b+#M@>+Q*K:9*!=ZX**
%Zaepe 8$9X:bh8V5Wd!9Qed:!Kw8Kl?>Zu+4Ykw8L>&5QFY$=FPaQ/M1p+a<BdR<WqA>=tKt+d<LbReeiA6=YK
hS=Ky4 8\c<jZn4***<<4/LX$BFnAH9EQ&/yMF%D>NyKRQiEVw6deA:T1hqDHnH/LT5Ac?RVp%$hb^PK^9w/kTh
a4BaAB XnHkucVV1kdZQW&uNR%+b?n$eRQiYV16beD:pawcB4^#XNR%+F*AG!n9N:/+iBjy6IEB:^KhNnG+:5>$
*NMW/q ?4RB:#IXBRc<Z/kacMC:R5X<A>=XK4+$+F&na45BD?@>>B9\4qM^\IB*k+1#B4!dXG\%+N&mI5tAh=8K
MFi6n< HRc<P%SpGQD8WuH\6*tB\:eNiDk?bMDDlLddkAilD#jkaWAbc5DDQ:=>!+AZRpYYAe>H^XwDH6/@uYuA
1<?Tq< K$HFVkMi+wXhB4^\Kwaa<EyTpY9Aw@nDn946eemt?MQ8>d@mQjk<?D#+QQn<@#/llRm>@aqJ^VLbEaTZ
5lXkyb AX=5w/S%I9/HP8EDmpXp+EWRHq<5?#RNKR18Q?kH%@:AJM51?^:Z:<dd9$9%9<j%8*Ej+uS9+D*wwY*^
ZpKZcq QVpJDH%QPdk9HdpRGWl>ninH^<\9H&>b>>+I+pNe>nn#5:?^=B@CE*+W<S@n^#G*lRlP/$y4I8NVpJQ^
jFl/\J mh>G$w?PZQ>D4RAI9kQ=J<cdnpAPnQFu!J@Yb@/p^ITm+@8E9%Aa?/5@cXA^9MX1Pw*%J!WMLIy:J!Qh
b8Vkm5 VQ#+wum\?mG$$q\/@y*knSV9pYJ^@kS+yPMj*^Y<4:/t+F?4j&dM\4HkJ^#@lHb:EVph\c<+@kt6BJ8i
PTHT#J aD^p6Q1uP>LS<5L^pD*1u<F+ymiC<ia>ZQ=^Bj%Hh4u<+<Jd$V4A:md?eiHi8T:@8HBQ891l/nyL*6lC
ctGSyd ?E4F@+DN9PeEZ/9?ta@&qiiQk6w:@kp6lY6I:n!wu@1uD8=Juk<Kipj>E>iTn8WFM6:Tnu><1epR98A>
Y:8u:A %D>NaH<H\YF@DjGQc:F\edQLQ!/<$^&Zjq!+h/@LQ!:ejq4:WTy!HK<J*p#><!V81djkLdX@Xb=D^:IS
\H@+P? ct>T@e^:t++q^&&jXj>+b!LHI@k6:X>j%1hn?c=58<G1u:/\W^=m>I^#@PQLSk\p?#@ip!:@cJAhFH#T
plA5&d =S>Z<Q*tNJh?ZHm\%?Wj^Y$Q>a8\h@^Jd^ad4@4?SDdX<\>KnC?K>/>Kj>+t6uNmp8ZLjJtA9+9?9>h^
9?F<TA $5$j&JM8pp9ZVT#c4$iYh?E8QZ>\%IY:&9En9\6**beQ?jPHbX\/l4dn?!w*BCqc^9$$Jq6ntJ<cS:cY
j9e%Th bH\I?8^a=nemjqRC+*?dTEk!</P/$T>>nQj1V5A+<Tj!=%WaZ+dnFGuHien:M^/Mhl\9+\Dm%hKMQ+i&
R^I%E? teB+NN&QHeJ+hA+$I>jFPN&T<WJwhyLkddYita@R<YVGS=PP:AQT9/D#V&T<jaX?*L9j/ZR<SZA<:>!a
#?aTPN <ie^^p=qjM$m84ha^uPl%Z?KWPyyj$ujV5jVGI<bl4:A84$NdL4kB=G*bZ=H>I5beq%\TnHiu*^4#SS<
//Fd%/ uw+Q<S@T<T#yL?ZXu@9?TMijM6+X+@eG^t8mDYe#u4\RiTuG>&KP?w#^ejD6jMb*H/Hn#/X?:A9Wb*\=
ThZe+J hDmH<RW$:uuEd^>l4EkXjmjX&*:aMJjhM&Ch/m$Ka<IZ#N<a1*wdnHcj^@#phc1*:m<S<m@ty@lXd!$Y
F1j9Bp \Gc=*@P16=lVMFD5/iQ+^*eDa>XCYb?E1E=iR+=%EiPLl1uiX1RSpCd<C11*Fak^F\5i1@XM*apeD8NL
T^pKnL +%X9I@GM%FjCn%P>=YBPZmL4ww116<t\eTu:aj5y%X5@:JW5E=*H16/Y+44LGS?j=Pk6hDnt?uTy9+Q1
Gtq1%4 :XZpcDLEuu/1N&<9m@Qe+A>Z9T*GQLlC^yquXY>>kK>pQG&+/t$K%wm4GF<i4Zy4kH6c#Zn/K/1*l6lV
nAu4tJ YmQ&:%P>XV/EZAQn1%JWd?W^H&W^@qa6%X5i%tnb:LhDBc1*p<lhje*+u1c1N!@8bS$QT=*c1h:GaI@l
J1Gadu G/=@VHQX&:ClBPVIhb>X9XYA^6jLPnqP>ZdlijlE>FqJhSKD66:I?Nk&14hX&FQbJQX*X:&qaw&=YjBJ
C%>n#L Yp>h&LKF<eWy14hp>It6\9>e>bcGPZcd<F>X9a*PS$/S@XQRX9Y&Ai&dK?N#b>Xd?J?Rp=Q/F/9i=5Au
&tVk\E P^pj6Wn%>mHt1X&Cu%C>^YB69F9\m/1*qXmV:BF@>uZ%Z@k6n@G9+qX9YXnD=nP?=CuX&\hak<p*!nQK
bXwN6h 1N//aC#@X8aF4?16Fhc\5mPXeh*St?>&c+9*R#A6iXX9PYmL:%k@6Y8y*4K\S64Q@IJN14ht/HMHtL<6
i1yhIF ZjWYk=nmIQQZB/uia4GYQmVZ4c=//+1a=dDkVdW@npB<hEV\N11VXPn1KPQd?/uiC8D:a+!9uKy/Y+M=
5VKu+S 5FD1/c4%yPHbuiPM:^1nim8HNn<l8wyY9c*5akZ&N@D=%nY?FeLG:>pQw*!16@*w$/hEd>%Wd#Z4YIH>
@nJwMi n+Ch?c1*R8#^!Xy1XcV14RV/?lt^=$ZX&\LMLYhqjG/uin8C99tn*P?j%b<9wF*PMd+lVQZYEu5EQ#Gi
@cnZ\E P$n%%lQ#!*uG>@SS9Y*AZ8+F^uj<\>Gd:!c+F<W@HZS<&+b%^TX*NC*4&PDmWd!5>%#+/Hc8>dDmu6W=
*%>=Mp 49Z6j/ku5B=&+Sqb19Q?$MnQQD:eyZ9*NtS<A6bFq:q?d$*XiT9+:SjG\^yaX9Y@!4!Jc%\SQ%^Wuj<A
>La9Qj t/@KhR5euj9Pa/%*VjAL&m/#$Rh@qZa=494MlSc8M=+ZwV4@BHQ+DiFjXJ%*Rk^!W>al>dTi!anjd:H>
4KmHNX !c==jAN58C*<KNX=G/#S:nC?<=41jDn/$X&8b$1&/4#GG:4W><^SuZ9I>u8J/F&%XieHdqnPl9mSIa:P
jBn=@l jbi\F!p^RH=>S?i?1+kyJAawtKM/Q$h>!=a&*6li@dq\teZ=j#IuJh4S8i>!J+9#@aTQ>/uPI&l85nu9
N:6#l= +bqbYuX?5LLF?Z#M9^N%ZH&Ja4XA@l:<VNX=NXydB9L%YIekVu1W+1NBSZZadBSmVH>m<d^H5>M8*BWj
AhJYXE 6X94\q*^Wj61Lq#nI<?uPhkjD6kV688<^j5ClM?tiTcI+>c\c%Y5\D=A\J>aa@?i<inbXmCjH>AX^pCy
dG+cA1 =**pKMw\jnnQmZQDqmEGKe9?/X@w^Lqlq^hl:=t9t#4W5Te<an$CNeduJ#n&lFin6dbhu89jY%u6taY@
-AlTKF 0001ffcbcc5001202b3 Page 329 of binaries1.zip
JXQt+C qj?c5tcG&nPC^pt:w9Cd1#$d/X:5TwJ9X*6&XMAiN%>*$d61V/NIcID^6HH1u:HRdXXbH:/k>pVTtGa@
%BZBSN LPNTa:Wup&I??^Eb#+QXu6E$y61QTy#TZ8*JI>95cu#hnyF1V>pihF!h<Rp#%J/:$Q>nMm@+HZ9Cc%QM
m5R$\S bNiR<d?u&uPH=mqd<td=LhTi*nRZ&JI*!>@l&BNiMS6:<Z#hJT%XQ#QkB</dibb&Xu8!$F/eN@N<WWZ>
<99Hn/ <^*1iWLTXHF1#\Bc$>qQCn=A:VtGb\W+d?aJLN@FQ!@VZG4Zbq$q%KXjlnI?DQ15I@!PbA?QT!Y8a5$y
m*yeAW V=utcZ+k4Ey4mYPy&FLQ1chEYlciGSH:w=^/\pbP\F/?nPi:6b/QwZN=b@Y/t&4QCLSnR//@XA86b&Ic
*6E$Y& Ek#T:8PhipweSV5&bu=b9>aVl@61\9nNA1&uS4dp5&BQy6a#n>dAhmVd9:G*%6PZdLQ=!WnQ=4:1u>MW
McQca< Y>uQ!Dy686c#N$Q!alnjNkjt$>eVm8ZJ8!BY*iB@@d@@@8P@AXBLA\RWAAIACAB*XY$qE5*eW8/EAACA
F^Ddwi !\RAJ\AAAGN5cYX8hHM9eGh\L&%la!>RS%B4bZq#L%BHWG6qiZM8eHJ1LtJyd8%hB=\WShd916uAL46p
y6+wdV JMPTVCltSW#AEkSbYFpR>e+\#A:5\P:PMD54aMTe\=uVthPbe<+=*HuG8#Ph<jTMu?HWW$@>@1@4VZhQ
ny=?Dh /1qqSkY&/4j@48416#ZhXc>i9c=/>h41Yn?6jpq+Sh9aYH!^6R1l41+?Zn6@?lVlbyW<@RlFN@^=#<68
lNtVG/ 4u*:@l#@iPmlb:^8YcFw6BpuAe5T/%5qX+i5pt8P6/^l+*BiJ/SdcG&$MV\@GI>Hw9Gc?ul$eVmW5DyX
kNdk:6 KLG5$8Da@TM^!\Tj5Pj$?ywbE*idcApN+wC\IX^ctXLq8CBM^j<1FX?m>Z@?RWKMXBdqaaRC&n*c:mhu
5%cm!p JuDQ6A<e#^PumAy=kIi1ilZ9wESal9</Lj?b%njTy^nTy&1X:mBqIBTnN8up@CY5*eTneuykwAWqij:S
YB>cBA qyk<EbpSaKXqDS>kYcM5hW/S5LbCFHY%%&?R&XP%1q!B/F8p%yE&#<mDp8eBY\&Yl!jyT?#&qIew:hlt
FDy9%9 La1:KJZ/wMHy6%l8yIAJqq\KkChH@&Bb//9#u#MDLn\Qbl!eY$Sc%mFEqZp56bZmVl@KlEhai%I$1Kkc
h8!m<J K4hHGMHC9IyHt+H<8n$=9KB>$e:laGM+V1@i+aYS=eqmlD5EPP<lhptC4/j<bEXhPL+wZDP:jSZjl*hC
uP&Hk4 tFljQ>Q?*bLJM/j6HqwTccSZ:QpN>dXkBJHS+MJ=!N^5+6cDPlF9Ei@RTRnuV%91#L=<Q8Ju9BuuIj/#
*iPI^I N?Ne^H>BGY?Z<5M@q#=cTp9<1+M@kH>=Q%ti@RNimw\jRD%<p9ID!Qk$?i?cV?D:A%BB@8*@BKD+MQtL
A^nG$n Hj&BCnAKPC<am>YnWR6nFI^=8:>XiA?m<y!VVLZFWtN45ihRMnW6E\wL??#VqknGj>QbPAFlK=Km5/Du
:tkQp\ ?C$jBn&*!n5/bCGJLa46w9ykXXK#^$6AMZyn9l4&>FbYZLWHTl+HSi4AXt+uSMyAl#K:#\n8F/^6D4c%
%XYPaq lh9GLk:G5:*w%e*j5=/%FJ?l$VMCRhVd!qB8dWj//EIpN\K?@%?G6q9jy*T?q$AkVjD<69jq1TAe=?Y>
6Cy+HC u^TFS9^i+@/9AK+E4kL?BF\CZA=eDX\DZA6enNLtI:+M<i/I4$M<CSkDdAS5DNCIhV*m5RC>mh+A*Ane
mI*jp\ BN\M*ALeC6\GZA4RRQwlcQhA@BH\MjAH+FVkNPB$+EVkFPAM+E#kLPAE@M>e^Chd1n:PSw#?JVaFNkM&
T*46?l B@Dib=&DiA6kT#Z\$tlMR:V%S?AC+ELkI8Ap+D$A1wuaDjH:\AjAh<D*AHS$/*@A%<B@kS?Bu\BTwQ/D
DYMD9$ @\u^8&En>^5ci?8AYeB5d5D6kS%5DamWFNInLEE/RBtAQmc/<Q5pNACBh$kSB4wCEB/mF>Ad/AQ$Bd4S
^+KYQZ i!i>m\L>kQ=ANdAR/AFAJAt</\4$Q4E4MAhwAAaCP=KRAAaB+Fp^BBkKDAN1kPFAh&AEMBJwwtpFaDV4
nJ*lJ% K5<DL\A9A1Vb@BX+CZkb?B5A@W45m@lb^EHEj$i<M#AhtAH5k4^@IB+QdIj$K<C4\G9A/<Ad\D?BN\FT
kw+Y5L qElt9k*cBanjAh=qkW1V6ckH1#8@e/P8LD!:lZ1^WF?pTXq+St5y<*meqVdW6+Y/6FCZF84TRl%c1EP4
Y%MZ%& Q:&#A\Na=k*p*m@=jb=$E8yDG\AdA8B:c%%kQRD<d+H@LjC>SjY$DhAGpE!kMRy%ccE8LiwV+FELQG1B
QXkQNY S!*\ypY<TbMTNBYB84i&B6AtF64ERy6acBN4MnAFtAyMA>D9LPy41FeL>Y1lZm*mh:T^NR+Au%qwb+91
YD<kH! G4^wkSe6<KIFZ4V1iWJ1X%L6AQCG6T&A>4CwQeCuF4Wj6h$CyiNci>P\C+C@LjCqBV/#>1KyE/AhwL/+
PE?kl1 H$D>iE?AlpV\nWZ#LLSa8RTk%WPTST*A:+BY$maB/t<pX$mtHAnRQM9B>HaC$K5Y/b1pZ^+KHAa5R:QR
TK:BDP d?!QtMw=HDH1S/A6^H4&/1Rq1K/PRI!&E6SYS\JHAWeD^\DHA5eB^\M$#$N9DJ>cTqb?B9\jeA>\L*Aj
RB/wPd RE8nh\B*A\<AD\IQAdjnj/ki:pJMhjR\a4TSRF5K6KMAH\l14$eR$$wy%jPn\GQA+<AV\JQAW\C>S>\J
C+aijV jA=<AX11:!?B4$mh?EX%l8R4d%>Yc4K?:ib+=j$%Zt^#9:wtB$cS?jLN/GL$@l!V+QYY5JJ%%/qDu@X1
m/#YWd b$?i5q:NiyMu#y&I1H=/:h#%PqMFqA4#kt$4DKKTJiDY+*bbyTK<4*&@#6SLyj8YM1FIk1GnL+%KE1eM
=64+Py DVRF1GT#JhWM1>WFPB$+B#kZPA?+ALkE8A!+HLkC8BL+E*ANeAN\E*ALeBh\N@Ac<E@kLiBj\Q9A6$48
FPLK+? C%w44AS/Ad&B\eARaCk\DBkJnAE&A&1B!eAWaGhBSp^RqaH=\P:AH5D9/QWJCAELkWXAE^ABFkNLkGck
cKYHH< BYkFwpAMYA4EkVakAdRD?\HLkPZACtB@+ADkRPAk+GDkEGAqeBl\BHApeDS\DHA5eB^\QHACeCJ\EuA!
>!p8wl eAy\KuAckDwYb\BuAteBb\Pwe+E/F/l#eV:\S\B%L!+ELkLRB8JTAP$k$A+C:TDRD8I1AG$l4kdRH8Jc
<ulj<D +D4kikB6I&+EdkdRQ8JY+E+AdTV8Ai+F:kMiAB+EHkIiBS+DHkiiAJ+EukKiA=+HZkBiAq+G@kd<A*kX
/eT!De RJ8L%\G$8*kViAj+CQkE?D@ke?AL+E9kK?B4+B9kB?B@Am\IkA<q?EPYABB+5l9RHikB>AVAM^I<I@5C
5nX%/h /\D>kQ:AAGARAF/T+CWJZyI%\HBkBACip1PA$eB/\Q4AlkD+VG+EdA!MBVaBNkZAi*ILaC6kc&AdaB!\
VSyJ<w LVAi&A:aCbkAkC@qhGAGAF/W+EY=F:A*5A?\L^AEFkDkWSpG\KeTjC4By^I<K5GdE4\y\a<T9CnBm*Ib
aw\YeK cY$Au5uCM%q+Jk9>\<J#YZk8c$5A>&jlu9BcILWGpIDZ4uC%Y/ZHM%VPtn%4a6&W5XN&u=KhdwI#<?!*
H6:Ikc T6@NZV=CtjQ1y&hSp>Qu4WZGP4$bd$*\ZhawbBu!6%>+VBeIM4M:tqCA&6X^pb#:LbyLFKpLd!?1&XM=
P^DV?* S<&e!kbkLnBQ#j:S1mi6c>J11ukKPEdNkNB5mDlc#cVR:I\+T5&P$8!hPFLNCN1#k<>:bk*@#nPHDV^:
D#\Ni# >Biijjwh#!LPX:P!NNNL5:/!CclVM+<$e$!#RVSdItkt?TT8uhh=b1pdV89XnLZE8b#9#nCKn+CQLdXi
q&aYK+ *J%uD><E#i+<c#Se#ak/M=AH<c#dP&1tY>CM$Ye<I=teQS:y#l:VDC4NeI9>%C!*QjQ+9bw%Fw<C8A@b
t/J*5t m9kG^DGiAj>Y#eVKKM?Gn@DMcPcc6S!kbm9FP&1YpYb1^h>+XyFu68!b$ME<I$c#8ZT9@?SbYH4ttV^#
:wnjLa 8T:Qj8K==K+<I@%@cwbRlwEFcubMjI:$dDWnVDQ5ek?i8b1pblIq6RuNau$JjAZRLQuZAJXH#@lj+D5A
iKa>GK >TF?AQ+H@An<BQ#M*aHiHyCR+F$J^yTqAPyR+9=pF/ACkIwk8\JXRDXA:a&&qGlLmZ1V1DiJiyPwN+q/
KhDNE@ p/k*mZ1V1DiJiyPwN+t/pckdPRRaCqD>w>$q&q?m@mZ1XKLPJPyHwu:pi5D/APyTkp@pGGAnaGNkLM?a
Z%9LSV NmJN5?!uAjekVT5q6\KuA&eA%Ij8Ru+64$kpb%WZ1hqGebE:k$w#@DTLK1G*mJ8Am#$#1m$+9\R+FdlW
:<S/Qu #c4TckC6W6k>P51#l>i1tZB^w%4hEhj!:Q?bcqYGXmJwlWbPXVQq+ndkLJ:FV1T8WklcdVqb4i4RckZN
9!4#:u AI64kH6==iIeZm&m%a6#iYb+tb4NFcj\m5dd9GJB#@wH@P=pNSM4d8ibZX4lPE@N@w4#iWZmMX:h/Mp4
J9*L*K Ik<Ch\J@>K!PRJ/IF*tX=AI%w&!9p6#BM<6j1BqeY9Y\X*:t<1\$4eSeyqctdA8aC>W5NK&m$E!$8I>u
hLpZEc kHF@ekLQDF?1bt\F=Jm+V1%<PVQX1Ge=pXhed8HXq58BK>V1p*meX%&iWK6p+mE%8!$iWdQZk8:^iy=N
+%JLBy 9l8+pti/eX@maVY:uVG4jb&c&dbH@?MRQ/>Y8eTjkK9WVDT6^Nk#&6j\:QjX!L8bX#Et<?yje1YBX#6E
1K>X<w *LQm$eXh:dBu&66+%YMVyBQ8/wceD5^IY?Zamqe*b1yXBnKnwSW1i^ZkKX/%1PPXm>t<KpDnCjlekM<q
5Y=9l\ ?wjeSc%cJGj:ubW=ZyGV/H8!pXem>qZnukD@m/Y<Kpn>I?yb6h!Yb>+jX!6Z>w#<I&yFqFc1:JY<uhV1
K$QHGk uV%#j^Y9in*J5@k$++?^Sn!yX4Nw^6>iGbmqXtj5%dTDiZYWX$Z6%aE6idYT?Q6AZ4XEH=GwA:tnb$Z5
n$V@5Y H&4X$F+q+>WAi\X9kq4%5Fh6=/mXG:FeYiKI>*u%m@wH?ySe^K5Qj?jXRQR9Td\AQyX$n=A6A9JEEQ<h
QCFS#: \c8I>D?H<+wt!Z*IIRpcTi&A>yD$Q*S98C?Bi^Y95bW64SdTtEDn>q?X1bN+X/%wmjh+XiRR#+1h^T6Z
w6=^&M !XY5wj\mX8>b@cJXqPN+BZMY4/\i!!84E*q%e^I4L?N+lY\ZZ8FK4lSCq5nj1^W6Cb/T$FWphAc=4%4h
TeF/Zk ppG%Km9SQlL6IwtH\T?T^nc$qWTd!c%bi!XhA41JuKXYNGtqZNB+j/JctcaXaZ9X?mT%Rp$4=9c1>!q1
DV9yd& %bhY8MWJ9JyMa&C:b<Z:d4Z1Vc9E6PI6n8hX:*9W!4i+tqi:y/6XJ+t/pZltTiM#nd9kA:p>4>c6imm*
5Ku%t= %u\4uXW%@F!XXdCW6Tj:WFKTXL5>SmTyKud?q$AVP5S69:X6t%q4#QE8CqGQVyYISy6#4c#EF5Z1%MJJ
H%FkY^ q?Tm:aSj*X:P4INqVB>qNaq#JGmHJm*ej#Pd8NL9\P#dEqc6?FS8HdB6*8jnnidbZXjB!qSut+QbMJhY
!8T*uB <b8JN&R<5I&u+m9\98&8lPi!eX:dX<LLe5#Zy/1NJVtEZMibh&$\njiPHYqV$KKaa6d$&%Z%XbC&DnqG
VMlY#y >yX9B\=&P:<^*VCtG<b$a*W&*bDLcZh/S$\+cAiqXI5yAcALWAH<EdkR8Am+GLkM8A1+G4kG8Bc+D4kB
H@mmlp 8At+DdkD8A6+AHkRiB6+D/D!Q\a?AZ:E:=WD?A*SA?kQDACGA!PApeAwaH%kW&B4aGhkPnAD1AQtAL5B
-A:tNi 0003f850e76001202b3 Page 330 of binaries1.zip
d!JkD4 9\j&A9aG>kYCRBP\BGkGYwBYIA4EkKXAHGkDEpA:5B?\DFkP4AD&B\+ADkRPAk+GDkFYAweCl\GHA$eA
WGTjR: S\JHA<eC^\EuACeCJ\EuA/eAj\BPBW+DVkjPAM+C#kdPAe+F#kQPB%Du+kIA>T=R:\L%Lm+BLkXR@?J!
JdjIH@ +EwA:TD?BKA6BNyCwC$E&pJeD/A>^I$A&pVeDN\C*A1kjRVcS>\JwI*EjRDcTcCh^EQA\<Cn\GQA+<BV
T^!Y8b \NQAM%L659$L<C#\M9A*+P@AK<C4\G9AG<Cd\F5A&q&<C/D6^RjA@\FjA9<B9kc?Ad+F@k6<B@\A@A@9
6dI*<^ mkIAH$4\l\RjT9CI4AT/Au&A95A/RD<AjCQBN*IRMBkaAk\FlkHkJRqip8AqCX/T/\L4AiAy8RG\IVAG
$\bS\t &BkaC+DQ=GdA=5AY\JdAXkB+V&+DdA65B&\Q:AD5CP\EVAAtAqPA1eA5aDbRD+AZ=RIkBDRCaYAl5AkA
EFhBR^ n<wIAD/X+FMJQyZkW\piqiBQCj/W+EpJuyVkTRq?qAiTq\t!XAL\4Bci%eK#YnWAu6jC<%4nyN&jLh!n
Lj?Pp/ 6TQWw*KkC%ABDAcGAEPBaWANMB#aE6kK&B4aBlkHnAjPB5+B#kZ?CF\MZAyeBq\PZAFeBX\NZA@eCN\M
+=RaTF *AueB:\J9AP<B*\IjAV<kJh:*JQA@akiRF>kHRD*IuA9akR\EqkQ&AVAjaqy\M:AhGAt5C8\B:AQ5C<R
:5$*%Y BEJAI:AEcAYmRA^aC5TBNmAB6AQ:Ae8A=eAKaH@kAPBA+CDkaPARaCX\KHAaeDl\BHApeBS\NHAMeB^\
W$*G!Z AuAmeDJ\C9AH+FVkNPB$+A#kVPA5AHW1WJ@mQPB<AQW1LkA8BC+CWMjmEkD%LFDQA9W5WM@mTkB%LXDZ
lR=uMa +l4kY8A/AQW8dkBR>?ItAQW9dkF8BY+Ddkj8ANAt+t:kH8Bi+EHkaiAS+FHkMiAJ+EukKiDQ\F?Ab+G@
tlk*II A5<B#\Q@AF+BZkXiB>+A@kt<BcC6^d5A&q8<D*\AwM*Fq<BZ\LjAj+H9kP<B+wWjkb>KMH+DJRD+RqaC
+%dVyJ ZaE1AQ\l\S?!H>AjGAAMBMDLE4\5\e5T9C#BQ^K<I<E:elR\GkAQ!jYBDaANkVHAS5BaAL\qN\M&B:aA
mQP:tb $AepiE&mD$n$Aap?INEH=QdADkD/p6\JtABMBCaBW\H\yy\N%AQkT:pAAC>K<KIMA\8BSWAVEAEYA<%A
ZZ5@1: C\A?qiBVCS/X+E$J*yVkS\q?qPBHiXAS#SL>*l4Z5i%q:Ap<PW6N454b!k&N4Fe9BHJZ=hBA#qEq!Rd%
myP#VW ?m9u<9p<y6@NZqppP^y:yp984t=J:5H^up#@P+=@#?Z9^d?@N?j9\?Z6!@eV=N>j\QTy=&dN^K!bhLw%
nE#tTy p>:JNbQ/?61c>i%b8A%Y8#YVXVYHVm+91Iqb$:XNMKGnwc>IG8&8j656#P=TDy%?h&u?=YG#ZTl#jJS/
n+t@H> R/I^YWlY$C?<!!X>Q+WuXHELXNWFR$tn5Tcj=9Z4HCt?pE#I4C^>e^PQY$NY1QtXM8?@4tKjhZlFc5pa
FGT&cw ncj6+AK!GZZN1J5M^w?pM#!dq<9ml6Xm*8mZH@E:9MhT:=</Y%kd6lKWY^b$8>pNNVRVN#QT8mReN\%4
M&nPT% RteK^Qt4bAm/>4^mm9Hnw\5Yn#i<$MtuGw\PcaJ^LJqVKac/^H5HeyGpPpi*b&$u@PwLq#=W8V+#cIJZ
XETyGi F>=/*C=GF#clE+bX>R=1hGEV%11\Nm@ehkah1DV@jn#9IkBQ$NN>Q9l4*mh>\T8k@IDSN9R8RAXRCR\B
VSF44S lkLDkBykPDACGAh5C+\H6kP&B*aELkA8BC+CLkY8BQ+EZA%eA%\LZA@eCN\K*A:eCh\QQAK<D*\IjA^<
dnLSBd Du!Bi<N>mY=AD/AjMAkaDI\CSkQ4A85Ba+A6AN!Z&AYaChRB>eA<aC<kBDRCaYAS$ASEkVnRBmTAhtA@
@R5XZ@ aBt\HFkB:A<eAB\IHAReDB\C4ARPBR+DDkiPAI+EnkKPBw+BnkYPA++HVkBPAp+B@kCeBy\PuAGeCb\F
niXcX= uA&eA=\LuAieD/BiBiyXwF:F^eAqAPyZZAbeDq\BwK:FXRD1Y/C?BiydwL+F/q9eAKDP^W*A#eA6APyj
FSec%m *AckDeRhANyB*AZeDh\D*A8kZeRD\IQAw<Dn\BQAp<BV\DQAu+G@AM<B#\M9AC<CL\E9A/<Dd\D@BN+C
*eVXmK *kdiAh+D$N:mA?Dj\EeA&q%<Bu\DjA@<AQ\Q?BH+Cjk=aA5$Cb/R+FWJZyZkXRu?pN$B<In5CR\E\CeT
<:iqtp jCLB\^I<LMHDE9\4\d>!JAD?piAjCh/S/\MdAB5CG\EdA&PBVaBNke$A<JdeE6kc&AbAH=DkNap?INEH
qM>P*4 JQ1A*AHaCbkIVAJ1keuAFGA1MA$Ad$4\yy\LkC@qdkB+WaIZbRSaDC\BtwEYwBWAn<1qAQlWkp<q?FTC
!GiZN% S!Z+W+I@JZlTkmeqiFKCH?Xl:khW!iYl@XGh>I@6iD/!p%^C<Q6+n9QluPSHe/4bnX^*&&$e@w!^nH1D
ekAPKj <:kyY5Z\&*?CLe$eJ@*e&ahQ*&I5WR\n#Zay5%*KdJhce:hLARj#l:c@N5bPd8n$^p/4//6wuyDVY^H4
PH9\kl KXIt!SA<D6VGp%qkDSt1lEPJqA9#I/%#ct61w!&^THM+uuJy?dm6ecE^QC*etyHQ$:ny&hq?wV:aFkw&
\h%45d b@<J9na@GG?N6C=1T:uYEG&Ql<IN\aXlFB6itQy@/uh1ym^Q^IPy@%dd*ycI66V5Eq/^LBy9VL$&MSRK
iIhZSl 6:ZX%AeVVcpZJ4XHtl8#qWbV%6u1kQIuS>4I#4JqRjyViic=$:P#XXD6J4Xn^tT9H*Wyc@ZWV1&nYeYW
*\SGbX Y1t9#Z1#>py<4y9%GKmpb>hQtb1bq/&F/&5u64YkYq9D#TpZ=wV*#@=ee+Q^SiFEVWM+pel+5Ktk41pL
Y?&CRc ^tIyX&^Lky!e:F#N\e:P>Y\<uZI^4TyT48Z<%X!5/lDp/kQyBBp6:SJp=*nuim/&h\m!<4=#NY5HeK=t
4qQy^> /\WyF:N!X\yF4u4N%muel<4iM>K8=//$6D:mXtcYnyJ!$j>=5uTbqG9ijyN/IhiDb8%B#6Y5*em=t159
Kb9#uF PRR?HR1@/>Pl/Kyjl/L4PV6W<tK&mpyi!@t499*FR=C>/auA6$9cJjl$KL48&/GIIHiHw18=P^Sh#htl
*auW$? plh#M&CTIqi>=8^R>pQ=hCn*i8=c#hcl:M4M%cGTF@&jJ%iHTq:L/FDPlb\MqLND$hZeHa18?uawI5ni
BB\uQt wZL&Jb>8qK5H=ik<8j1NZ=j^/!%?HeYun@l%n=\>I&iu!NWjjL6Cnq/R1\Q+<L+Q&&jl?F#M:59uPXk<
+d#+pB G*jua8!eQJ&Vuj$+PR5Ve$9d8VMndcpK*9R=NdNnmWlLbQ<$QW:bhTm4?l!DX>d@hc:tLwD8Mi9@$wW5
X=<#Nd @=c$N5*pVPhKKq</&St%=F^J1!MuQ=YQui\WLp:JVYYLqE6JypnJhJ4jjcw$:p&:+QK8i+E=%<qI4W$u
LjqHCe &/<8W%k>JVjHE*ubQCZVb9LWuI^uVGX\J#8F9dQy8lu1dVc%KFMV!6B:$%Zh4Ny6tpKd45NtWX8#cKwi
S8i\C? =VTnn&V9F8q1c%bNNW$=>i1n/Tywl6cbwYncV=/%S:qZ$t5>S+>!4&T$RLai=Ycu6Wc8HyX/!Z*/LD*K
BAt&R= <%Rb4bT>S*p8PC&Y4Wi=&XqdL$8QT5*N<WTy:buYw>J!My+^9aY#>cm5w*uGKJ=6NMpeSVLG?QT^Qi8a
Q5dk>c uncYy+@lYed8LGP&b/#PGDq!nSny<m&4bE8VcX=yqm:HMmSacp%QdG:P1GuKT/qy!pm9ceyL4YuKTcqy
\uEZl$ !9DYhQI<=YtTtj\$!hQpE>n*q%4VdybV$*cY1tqKy6R$bYVYNPX/c#y=uuF9uyyPuqJNP&uQjcdWNGXp
al6+=K %HTc!p%bZqW:ii:=Qc>1uYW!KZ*?KG*KKH&Y!P%8tiZ\ldVTQLpbQV=F:ZiG^9VZC8hC!p6FTt:G/J^Y
6jSXSS eya!$$6LK!iqBNSnnqHD9bLP:#qGDjhKB8>uG#Ze:LS?pG9WTL*p<pGYWeQ#XBu>I@8w+duk>JX5w+cd
J=F$Vn udZjbBp%WuN#QFF1V$wdNhJ!My+^9Y>qG#Ze:M^?qwWHW*M#:m!hk&bFY*M#pZM^k+?eK>qa!dta!W*P
wGVlMp yR!Ge1/p<%VKla^GTLu1ih1W@P\QuMqjchhTYM!>=uKbp=jBcM/X:L#tZE=u6=RL8S<&niqT<yN<q=1b
hSeC!^ 4Ra!8M?=p5GA#yW5QPleT&jDqA9bdni:1LYuhtc*J&L6Gdp=mHi4<::dyE@QyF@Jwt>/j#I6N*PRTj/p
QSQKk= S@qL?<tMK!t9I&p@q9E#*l@IXuVtJFN!Q5!66I#1<qbW6m4KKNRi?6QwQHqb^G<Y/l!%pM1FYj+6@YJt
YkFpd< @e$M6m=1D!+KP#tVw/FediYq>iS:@!PNwb#@TM%Q?+>M&k\114FWKmiHG<5=V@?Z6GK!*q=c9q6pNk=P
IEDntq #W+9*1u!#F>I9iV=phRLPW6Lc=4^>yXF+ZmNGn#WlMHei5@4MRtGKe6DaenWcG6d^q6XqkKT?w8*GM?R
6dMi1m q%Ga&:DylZptyb#CWuY+dIXqK!c%kP#@T1&h@1@&T+n#4$q>Ph8@=ukEn#:uLed9EXIcLX6=:1CiWtTK
Q8qFw5 LM<w%RRV#MbLE$#wDB59nSMT5@HTlA1ND?uqCTui@XaYjp8@kZi@+t*&ZQ&5l@W?Qtq&M=qkkp=I?5y@
\X^Ju& DHkeiAJ+EukKiBy+B9k#<BjkYiC9\HQA<<AL\I9AT<DL\N?A9\Q@AF+BZkXiA%+H*kD?Cd\J9AY<Dd\D
ypdWDY 9Ai<D*\CjAy<B9\j<Du\BeQy=AkDQD5I6uR&AXnYVM9%cl1!&KW^\kEitZGYiq8\\!&Y//4w4&4p5MNH
j6&B?$ X9KL8jatT154y+hb#ni5^VnL?e!wIB@D*VnhkpN*Vl?BR\>Pu+>DV$:jkWM9VqQ>>id$9&m@C1hyk&hj
1ZD8$R Fy+DLj5:SZb/M^#/eb4Eiu>P:<Z%R8u>eBnI/bN^GMVyc*Aa#Gq1/!GejliHwd#6k8y!GKh4eKnl>Qa+
9:AVdX DPj$HnmM+QV?PI#p>Hp+nPL$9VmM=nT%@d1ey8jm@VeqhF@4e*ydHQkLLmY:+dAly<t^>BlPu+:DSy!?
qIQ4aw CaiNPW%<PJdV^C9<?h6Tc5>NPW&@9^tuh<ble$+*+4AFy\>mj1L$8Vl5^ip:Td*tNQH*Ny!t#dunXL1M
C6\pX@ &thdVqMb4IYY#eXlP$+9^YF:Vy?I\\/e9l1HHVqNja%%ldJQLPh##iZEc^M=Ve<>mhP#eGAj^8W$*#Pb
Ad=K:< $<jl\MN??bW+VPW$>iqyuCb?&%tq/dPZ%uSPW>9P+DV>Du6$/dIu>#FKL<Pln6Qu+DCL$:jlMJ9VJC91
L:<9^= Pj$^D48!kpd6MwjV^A5NuKb:te6yiw&b^&uTnZdnNQHajE=V@>&h$!Tu>8A$!bR>PW&dyH?u$yZWJ*:Q
ZQJA*$ cY4Q9VlN>:W*y/u@:5Qyw*Daq>MZ+lDpNQZjBb^?mYWNyipbG%Y/K@YnMKiyd!*pNQEI9/J%ydypb@lh
\Epa#S /j<muD+Wl<YeQl8HJb!?Fkii$?9/KA+6uCc=&5yy&nRiXip1pnE^VqP@Yeyy+nYiH/tm8tSHHFZ6PLDY
QJe=Ci ZHWcD8&e9l&H@VlNeuIby$qY5?Q*cyKyK#lN#:5@y<i^@KW$<eKBuKa/PInVFB@McZ4iR#l>HR/5F%e@
ARlBq> k5PluCb=elmu9<dleJZ8S4L/CE/VdD8T$%VuS*GciQNwVqMhH<Ny?5%nPj$HHI:nNQYh+#q>Q\+ueJ4G
Q+Pn@K 8lM=@TEPJ*GcN8tj4NLhcW\+lhMpS@@AcbJDy*Kc?9SyuCaiQ=*V^D6ueJ4c+W^PH<NnGKYyL=#N/T6\
-AJ5!6 000f01fe60d001202b3 Page 331 of binaries1.zip
Rij64p PIjV^J@uey4G:QM+VZ^!Q1i@^PGQK6&D^6WLPE%!=pJPW^%i^GtT4^h#t8VVJb!tQueyy+uZL8M$%h@q
!AtZjB uCdcK#l>F\=Zeyy+/TyP$=n:J$:VZ4?4XdwunaHZeJ48+XyPp\!:n6MpA/:uNQH?Db!th48S$*V9N*Gc
WA9NLc ^1cdPj$</\GWyuH\Xp/V\+ZdXLwZniG*e=4p%S&eJ4q?J/iyL>@FcbIbh*Pc?6p>uCa?9bjV%Pd*eb41
^IC*b% +H=PW>pQeJ4$5Ae=VZ4WR=!tj9e\y<p=^CM1*b9p/1PeH5d/HKW*ad&P$yNb9/N$A?6=qN/H>V%KS%u9
p<ja&* w@SK%9<w@RjYA!q>Pi8DqL/h>WJKQ<&/FKXjb#&S$y?!9pnyH%q9JHYuF?8QqB:PimTqN&N>p6KVYc?p
b6DQF1 >H#YL!t>kQXMT4i^9puya%u9yQR=4H>T?u4YR!q>H?8nqH/K>XJK9<L/KcW@an&X$n?\9py1YVjYY!qN
DyiFB! 58=hVt@M8m!qcY#@F/j4Yd?qNQHGB=!ti9+*y$u?jMny5%pHyVVh<<iejwS%bE1@\4w!yd>pubuW^C/5
mM9F+H P%N/CP9RqN:C%cQZIX*kT$/V#QtK$!S#@5Nypnqje=4p&Vieyu:<LciJN@@LcY1H:#lN9@?>T9enHj\H
AlZ$pb VyMM@B?uTdj/phPpZ@#EcSwHj?d$Rc:K*?<p%$>/9<8X5^M:@bB!itKu@/=<YhnyL=WVFA4>!%tQy@RA
bXhb>= =SVFVt?muKQa/cuKTa1h*p5=T:HV?!tuKZd/BPW<^W=j4J!w&Pp:qDMXP@&Te1ymy#?#uc8wX^b!9ML/
4N*5Yw @\DwwwL%@\HR:\V4@\MkT\Z4@\M\^k4Y@\ik@kZ4@\MkK\V4@\QR%\Z4@\QAy+L%@\FwR<H/@$B!<5L/
WVHhV\ @$D\y&D>j!A>L?9@A%Huk9Z@kRj!i\/q$h<F/@<DIa<F/@<D/Zhb@^?IjmNa@^?INli5@\@CM\uY@\hB
\lT:4M j^i5@\>CZ^c5@\?Cnmba@^<E*WT\@n<IeqK\@n<Ia=Sk@Z<R%VQ4@+Mki\V4@+QR=\V4@+QAy+L%@<Gw
kD&cqw i<H/@&CWJ%n@H\#hZLD?Q^m<J%n@H\#bIqn@H\!hT:D?Q^l>W:D?Q=nck9Z@\Sj^i!CqMT+J%9<Hw%<I
9q/hIe %9<HE#?\@n<ajX&\@n<a@WC\@n<EdT6a@^?!KZu*+nV$c<H/@^DwKwL%@!HWS1#@D+F?IXn@H$K<\j4@
B=qtWJ EI\Qk9Z@IbCFk9Z@IeRd4Q<QJRhB4Q<QBd<I%9?Hww+F/@>Ded?C>j?lhD?5@\?FLm^a@^<K9W?\@n?W
CYSn%* /wj%@/FZ<L5^ycqPYQ<jCup5YQ<jT9jD?9<\+qZY@+eS#:D?Q\#%IXn@H$d*\Q4@MPnWk9Z@aSmuBP9@
cW*M+4 \/BDChd@l&F5F/#@D!Piaj%@GGT=aQ&jYF!\@q?D@mha@/<Bn\9Y@&9RlwL%@^w<u&D>9+bpBi9@NTR4
%q=>ba YQ?9wZbl@d<GPyFk@d<GMq!\@q>Djbd%@^4IXBE^W%Hbk&enqnWu*Gd9+&8#J5bm#bFRpP\h4Q1yM&91
cpNud* kmG4Q4w5HK>9D4at4JtSBjFkQALC&tl#ND/^PS^QVA>FY>9G^69mIc8Ydb45@LG^YHRBLTFQmeinecdA
4W@c=5 4:aEI<$NVeF+8NHJ5t>E$V6u/qy>#eRR*W^NR!JP^qJP64$5b@<P=$&cMujmYN#C=Hl\$h#\<5TW^plm
utNPbE dClGGhHauHAwHNp9HLe#uJ@\u6R&S&ILw5F++>^k&=KWK&V\tbFbF+!$#w?$NpcZyYSu$FEGdanL!K!Q
wj^TQd S^jF\&%6p!QB=8mm%M8+?<!CpJuqB#%bcMV&=kRKZ>Ae>tc+JQkuXjFVYpQ^FdHE=LAh<TY:9N^ZcH6u
kcpcmk PB=8BbiMhS66ZmLCFVq6a9bHcpmw<=&D4a*N!ScIlBL6eZYZ!j?cFFVZhk9H&>Dk6WHd/MdPT8E1bICu
Y=/eLX c69ndeSWIV1bHG=dpwnG?MV?Nd+!yZY@TJ#aM?SlSJZiL>!c+DT%eB5ZQL$%Ea/*llQ1Tq&+JSyjwhK#
Jeul^& \58abqb:T#kiCjF@+\HIpDnMy:8&S$JLG8QBbi4W/X41NMuG>5ueiDDGqVtQ::RFh&ZZ86QuqGp8Py=F
#nGK@e uE&^ja5Lk/E\uiB@EY$>dkpKVDRl1il4%6<!55t+^k*GEp%h\<!c&4F<aYw\nt9:iK@X#XjZ=4T*JmI6
@QXQmK aV6@>kI!dY6wS/iMJ@mH:BbQjuE\FtwcM!bnT/a%LS=6n>X5chW&BX5ZlZeG/%MF6paVahXTIPNcXB8m
\CaQ/l k+qRp%Q=hldZm4eP<Q9&JZe:4Z*KD==!D#/*S^<t!!!Ve4u18KKRM=cjPQp#>lY8H5@q=I:T%GL6DL6b
$8pj@m 4QFiKa8Mt8p6XJ>pWtQX%e@*up+KNnhHIil&DninL8dZKHN6Jb**6?1uVQWTi<6%Q6W>Q69*8#$@cn>y
ESu!n? 5tD:Jt%dcY9*&6qVy*1JQD>Gy?NVu6V=L56MJbtyyi#pj8GGWD#c#H%<=5S+QLnCVW$H#\dBC!wupRmG
h4FMyA tyKCc8cpiDVaGA1&JjljQiep^chG\5&N>kYQWJlbG&%ykWnlj!FL&/D:A:ZS%kV8^W=QDmcC/HdlaI5/
>lIBk@ ST?c&NyIw+J#uyT&M%N@d64E&1b\cMtC/QLpcW5nnZcV&lMJ9k5u4/E>pkl:j*dc^QVCmK\85n#T/nt*
1>QkDm @!*>QLYa?tm5QbbM^!M6\jmKTe+h%di*NcZe#6^Iwnu5?bX+eGE>GuK*mJJiM=PDpb$I6*L%pYYnTpC\
#BZlM! SS8lAcljV&uSlpTn><+<hc1pty*E<GPLkPSJe>l8@kc$VHBS&M&6m:bGy+YnLiFEjIWuF\NYyCHeDNHD
6&KnFK LYquP*ijVM^V%y#<w@QRl58RdpkEXYWtM=#SKX&<#pP:pRI#J>kTW?eRPp$R/jRjpWSETcS=8+SZaG^I
46?m<C pD!lW#Wc%C&!:&\i^wP$/*QC\Xc$D></Vliln8N1ZJ5*h\wN+Y/jtYeQ<@FkJGH@e<4YWPyq/CY8Lta@
*=pEJK @K:6+Zc8Ra>?M=NM<?#E#lF$5ZmwcaYnAnBViSnEH9atS>ym66^XXX\ZdR\*K*t9/ww&5IRTW?QSqwqV
JRZY=y MLcG:F!/t:AcNdpGIBbCnW8kPIYVap@hjG^SdGa+8ISHNyA+X=Imum@n6%*qbPb8WC\hj8G8Ga%NdR+8
R5PVLb T8PQFLcblb8*@&N8QK!iGYLcLeKnccA!qG:k>l/9QJp&pjQuVY&PBtunn/NY+CyXw>NJ/5K6:c!8&Gt*
q56^i1 F1EL^KCp&L<>V#$d5$/$Mhn51CdIRM<Kl%8yc:4@QVpTh^q@H9+=:BYZTh=Fu++8&#P1:kX%Dc=EVTQB
#a@KqW k!6Z?4#y*ndJdC8*dhL?kW@BnFu@NT*j@m<uL$*V<CwcV1qbCp\4K&X+W\X:^!CXM:G=&bwcmdjSQ1%F
YG:M>6 XDjYiGYlNN/!dJM%hwl8q=h/#pX/My%T$#I6VtbZLilKSmbpk951a=?w%=NkcEq:#K5EV=\&5cE=\kNa
@WDaEK 4hKZ/wN6ddGtiLA6:FGmy+IZ\@EaSK\:uEDh>54t&tpp!t&8^W@PSe>8wV:CF=8mpXA+ljh4RiWh?Pke
+JT?Nb Se!Q:I<*IM>QI*6//<Kw=!&DmujiMJIuM+ML\9\ckC\Q>c^$:V=bJ=^&Z!w<Q$w9c>CuG:&9AMlLyD@Y
DGVWiA @CcMqeu^#Nd6W==^YnnlXth!MKTlM#tI<L%+inQuyA/C<#\ck#8kWFt$nTeM8SmG=wFHwH!qW1d<Q#>#
LBGC^b R#nPL/A#J$hDcdJ>*4V=$dl1YZ1dn1J?&^L6C$mE#w/FY?jGE6Q^VpKcb>VNWC<164JPYdmHN6LbJ61j
u6luy> +E$TJuPJ4Nc6D&j$\L&$P=LFd5\GMBGPupF+Zn*^H4KVk4<?8mD=qYk%tKJ$H8%Y8MLW%RMeLapG4uV6
n1I^W> KVPQS8cGbVSCPZK:LhRedaMku+5^kt/QL$#F*dhNm5cVc1B*9QQ1VXq@i&appdCHG^dT4u:q9jM=\ebI
wlMD<b NPZ@G5Iw4VFFDZP!9Q@bEQc1yFDNkk6TXdZkAu6HTjI$@j=WQ%ICS8uF:6ZWpa\/RVKN6=BRiPhwe@Kj
GN?bhp :LcDZLSQ8L+WySJGHnZPjqVuCXL=%ybwtT@=TWE*GcwS#d:kH=Lhm>J6>n?:A1MlVA1Kh^/DGmubl&e9
AJQB5E ZNltD+9e#VI!:JjE1hFYyVJ^cW+h+8+t6<j6QyYmi5eYNyPewRI=PZhF#H+l^/BJ:@:Vb:9ylqk+qH1G
B@Eh5F u*R#QQwlbcu@ZNlMinGcD!hVG&L:LIRT$Jyc!G=#J<%M#aE&4VKR<N/EGliVN+!1yY:5*Q?m&MVGqwl#
%&l>&L Z65RYhV1mp:u*=XPwEbXy\*VhDRu*@NdNKKq1MBbm:AyM?lTFR:<AM@pJBua15XREttNJFc+$6bdm5%K
F:RdQk M^9CLhDEw/!!NWScwHZPdRKL14iwnPSM^Wn#*A51%id1HN/:h=YN6F^Hy$qXcD\b*thMt&#J$HSWqTcu
ec<MB@ N:pmuHP:qLG^?GJ4jK^>\jmM8p9QVe%\Fbm$ZM9ij\/>1GH!Ludy#9a+P>Wcdh&+Wj%nh6WuZjebu%%6
C=p=i& Tqi89D9t*K6yV=TiubcVYd1*%68!etBdD6dP9JT>GG<d6*qiWy^VV4u@:c1=<&6+E/<>piPe$V?SmMH\
WTp5Ie &\^GWEtqq9M=/ME#W>EB$nNeMuyLm6N56Xj11Xq&qTcNlV45QPkAY&>ym#/Tm\*#I#Eq>G*JqCc1<Jwa
ewB/9m u6LctBR#/q$&iRcy96\=5WiANt?cm1IP4M=e<R$CFIpSGjJ9Q&b!qtuJcW:/Kb18JWeMLCZBMNGRpniw
e>QaRw XI=!6X&8@DSP!ea>1c!clZ86%Q>&@5>?e?j1V5+M8J1jtu1tyK9/$Z<=:=jy$#uiPS>?H*Y#iEdFidie
F%dXbu YMe=$>ZMBDLePS+*n/a/ImFTGbJ=WLuC?+YdW\tlVKZQP1WXQ&&m*cnRCh\e?yeMMw<t:<uM8DYwQXq8
KW5uhi ne:Tj<ihVp4tiB=A%W%La$bY/u@\1VM@=Lq#Xu=TZn>typ&Z8dj1VK5p:#Jqu5Ybhyw:lbKyE#p<$?iW
jpdbnk a5?SyA=nhi*k?:TS#X/Iecb$TNqK+b?WI8%y!PSNbcmF6k:qiTy\nJ9n+RTi!@T$Zna!d@GiS4ZjXF*?
8#:t6< \*6FcIt1A/e>ubhbZE@i9q6Cip+Y:h8d=bTcXKJJj1W4%k/S@T1edGR\qyPSTlGPP<wy/n9LyHYK8y@<
KTa6P@ *@R*AFhN>4^JlyLVGYyeV+wbJ#6N@Dn=YdI!B<NR&q^JG<?XiIXn&wCbweap<?!*9Db9J$F48ntiQy8b
9$Fm*T cW?@&j1&$?MWuX5:6hqi/YtEeX+>p<1>81hb+eT!cH\J/$$yGi:DyPS=u<m>+Gmh#4#T&CdX!8t<YG6*
GnMZ@i 9Td:Deqbtt*A/:lujZZt>Jdkw9D<eHQ!=e\=V^bT*^SNSPjl@Yd/bH=C8%ki@mlJT4&6wwhdG&upw4!&
WJR?cI =J!hb&q^un8>^\N<&n1iw%nmXV/!?bJY$1XD8Qp+S1EtyBdH\w95LD8BuGVGEpnDlSFKJtuC!+PpWCP%
wXCKe% PBTMSXywXFDJN96%bHEwFA$9yHqkP>qM+^^TncFE!!KXdGyj8NBNNCFBK4&h$^KM6IcT!jmTeJ!Vcq$H
mFG\n& !TkEaETq:Q8m@/ci*GLu^b!ma@F\nA61e?<*RXMbqGy$::#S9jQGaAJcj!KblKy6J>*ucZTiB+>D9>*w
!w:6R% Qqbn<4edp+@XGGtN6c9@e=?4$Z&8S9i=Gq9IE=Khey/lMSb6T@A@8e@R/D!Dcn$ukS>emL6b&G#@l=%5
<BAN56 e=KSXn5beRpmLpEpqaC5KmnbGty8d\^V8T$ah5A*qI6pa:TNW!*&c/&hWuYAXG8\Jb^MSlepKh6Y6NpF
-ASM\y 00031b5f58e001202b3 Page 332 of binaries1.zip
GtP<ae aikKLdSdDe^E9/qT#ZbZw^R>Hj*Q$9bkc&I#J:W=yh1=%!>P/wqNX4^^AZWt^Gkb5IchZBSbcMiLa+9A
d%&1T* L*a!FqN^*K:EiGQd5wk>NaSpIlljFES1YX\X6T!8@u>b*Qu@bZH%@<9m/9?Z^bQ@lH++a$4>NE:XV/EW
tYR&%1 lGEYNawWdlcF!bGCyqtC<edpkK9P*QE^?!mcSqddFG\n8\d9GJmT^+SK%n*69wW<uitbRYX+jGnlqT^5
W$Ql*< bVlA<@w<T*h#q84bLMYbYVduNCt8B>P>n*w<ECc>=KV=Jp6#S<bL?/+nqlV*a?p8S%P>E/a:E@a+KW\/
tylVTV D9b+PHLhk$%ymTXY&A5+/5$<*aNWty?t=HJWnejmcXb\9<kmi<1JBDV+CBu$nlIJKXp@pbj%*Yb$S:1$
\\TmK% AX!Ndp?uuGXi=#E6e*Ct@I#FMM4MZBa$\RTQj^hQq#HBlM=pA%6j&:p4\Ql*MeH!:Nk*IVYWyQaY@5c9
XDRBi\ &*6+$/:q?p/kQWXJ*\pnQCZR*y8p:\VcA=Q$udCV=jyPtP6yCh4QpQThRQ8Ep==icB<i:=&!>/#!*mq:
:R^Kmt Z!n9udL*R@LiKZ89IP?h59j+<h+yi+<e:=&!>=kqjTjRjTX>J>Atn1V9BLyu*n6q:%jl9XQ&jk@iP!XI
X5SCD9 j?C>W+L&NjLiKWH:&*n9qKA>k4^*T6C><h+yRj5Aii?WwL%#9HhK$uQ\*mt=98Z+VyC$6+j*V5ubq8M:
:RY^:m RhJiEh+:bZ9e+d%Vp9au<>+yTjZGi/ep:auq9XPT>yV!*mqJi#l=:=S<&ZJ<J$ncw<l:y!V6A?T>W=L&
VXAN5P +QHi1RC%Ii?hCqD><h/yAN$n:=$K$HZiP^Yk@W/<h!yAi+y+:%TA>84\*1qAw?Z+VknR9p#iP^Yk9cT<
*pReSI h!yAi*N=:%TA>l:#*1pA:e6qCS?kQdT<h!yAi%b=:%TA>yH!*1pA:a*p9XMq=bdnP/GE&wH*VyZRe@Di
JAtXcZ 1SK/b>+:XWL:mHlRLcE>Q:^*1wS+k@hPqhC?hN+:XWJ<\u8uTtlQM??hK1G&+L%VJdV@qjhPqhD?V>+:
<tcJ@q XWL:J*u9XCu%A>+:XWy%#u8uT1uPii>WKhW=:=$1yZ9u9XPq>H?<h/1W>m#^*1uT5PZ+Vmmq??i>W/Y$
L1BAy+ b=:*VyZTZuViP%XKi:>=:%Ry<SZ9uT1q@cc<h/1W?J@*VyZTjq*iP%XK?%h=:%RyQSj9uTwnYeJ:y<yI
PwDLSn B9Di1VL1R:^*1w^+p@hPqSE9<N/yMuyG*n6XS9ZEi/jK1D#iP%WY5S#jCYZWZ*n9XBu6Nii>W&Y$:=%>
q:8Wm/ J=VS9t:&uXBGi/4bh$Ib:X6t*\qq6B?ajTiWpb^l*\qq6MiX*#:Lmc@ah$I=6Si@i=SVi:H9lHL1H?\:
/IEMja wb^+l*$uqP>nPd+V!1q5>y%RV96>&ZhCPi&9bh<J=TS@&HhCPjWF>y%RVu6@&ZhCPi&Sb6<J6k<Q>y%R
>uhT@T Vt*B9lQKcR@6Tl+\mh@ah$IZpw95P/EL!S9&uhCF:y>>J*Tlj5P?E:wR@:L9lC:ES?\:wR8%G@6P/LLC
mHdAyC eu\uhKFuah<JZilb&HhCF>yZ#:+V8lBj5i?EL4T*uH$uhKG&aN<JZYl9M@6P/EL:lNq*RkYNG?\:waJp
XX1aR% J@6P1CCb^L+VK8n?&ZhCBjWX>y%REdRe*\pX%Bd5P<H&L<K?E!4w>>q*RkYX#d+VK1m@5P?EC9Iq\L+V
c=<RPc K5muAQ6P1CA=\L+VKpktZ<Sypqj5P/GC>wi#:+RK&q@N9lM1cj^p*\tXA!#Hh$Iq!YQ&uXBJew6>J%ST
9XJT^4 H&ZjCbZWX>l*RmZ^IQ6P1KR&bN<JqXTZ:D8lpu/jjThWp1<E>y%RTV+C&HhCJi*ub6<JqeSn:D8lp9cR
XiyKB+ 5??E41SV5P?E4nS85??E4uV@:D8lK+$#:D8lK<q%>y*RqYR1?$:wTnKQjTh$yVbm*\qh1a?!:+T8B%8P
$CuhC9 :+T8^D95P/E4%Vj:V8lK#<&?E:yTiR>!ty/LjTh$Jh<E:D8lK@pIaN<JZYu@QQ6P1KLua6<JXcT@5P?E
!dhtV6 K6IL&HhCFa&*:D8lmtRZ?$/wI4uL9lP1TH/\:+R1/6Q5P/GK:y>>J%RSV:H9lCy1B@chWQYk=jlP1KL:
y*=BBP a6<JXTTH&ZhCFjpAaN<JXiVnkH$uXFE@a6<JXiR9kH$uXA9L<b%RVVwS?$/wJ9&CjThWW>>l*\uX>C#5
YG/i@E P/GcbDd:V1mt95P?E/1y::D9lG41^?\:wb4+<T%PW@8\:+S1it:&uXBNQk:ah$I%>ZH&uhCN?nn:V8lG
X9!?u? Mwy>J*RnQaJ>J*T46S#jCh%IL4H9lG+$l4D9lG+pk>q*RniTj?\:wS9%hjch$I*/Aj6P/Ea<\4+V8qE:
ilEN>> 5P?EduV9:D8lG@qNaN<J*WtQb6<J*YqeaN<J*ap*&HhCh>JN&HiC:h?FjTh$y@GKjTh$*>>!jCh$J>=k
:m4T9e *\uhTV/^:+V8%Njbh$J*+t*&uhChiIy>J*TuitZjCh&@eqZ?HtY8:+Ri9X*jCV*G8L+Vit#u?p:wMeQ%
%%DY>J uhDn>/:9lB=LZN<JQR=*jTj$PM9%uhDnV/:9lB+Q8:+Vi4#p?p+kZ!>J*\up/!ZyP/FuL>h*R5@S48?E
lV$c^Z u68+9lN/#uB>J@Ve^@YhRH=jp4+Vil:m?p:wibL4P/Hulc:9lJ+*8:+Vi6:u?p:w?a#4P/Hu*%*jCV$@
ZnR!tN eH$u>Q!Q/#8lq*B>J@V1=jyP/DZe>b*Rc$9Zh$K9ZX#jCd*t8d+VikXh*\t>E1:9lF=H84+V!GhM$uhC
lT#Wq# 4<6e*\t>duh>J@S/&QYh$P5F%*hC4+>e*\t>9ub>J@R8eZ$u>P:l?p:wQhV%uWD?a=K?E*yQeu$u>J:l
I$jWPM ?p:w:jGh$D9p?p:w*i:/V8l>qP5:wjeb48?E*qi+9lN/*?d/V8n>tP5:wjhL48?E*8?/9lN/@?V/VmBj
8n4FR4 MpujCZ*YhZ$u>Nui>b*Rb=d4P/HQQ1:9lD=^%*hCu<Ne*\q>#uS>J@T=#QYh$Pe&%*hCu\hh*\q>uuX>
lQEV@m J=A9tcV9lD:98d+V?u#9?p:w&>j%uhB*Zhh*R6@NZh<JjZh$jTj$*hQ%uhC*!jYh$Hi=/#8l:=G8:+T?
1kybAd =:t?E@yi/@yP/Q8\/#8l:+88:+T?::1?E@y?/9yP/Q8D/#6lub/8:+S%S4m?E>ab=@yPYGi//#8BjM\p
GS<6IB jTi5$?L/VqnuENh*\nyu84+V%4uK>b&\#9&8:+S%ZuF>J=CQtcV9lH/X48?Ej8VjljZ@j8ldk9Z@j8V:
FmLByc lQZ@j68#u$bKE\?#@6<Q>TFa@?>HQM#/j#@w?IL%@*=H<N\BycEuC6d@?%Hh59:jD*1NaQ&@H@q:aQ&@
AWZnhD H@tjaQ&@H<bT\jy@Q/yu%9@:pX<R%9@:$*P^@6<jep8\@6?juw9%@@:wj+L%@@:pY+Z%@@=:8n/F?/QP
cI:^\* BP9@@at*Yj@9D=%h5Q:j@\#&X$qynItC>j@?^N85@>8?dXn@:$><\9y@j@K=\94@AJIu4Q<QwQ:I?9<A
nkmq>M !FHB?9<A!DDB?9<A+luY@\ikL\4Y@\iA*\Z4@\Q&=npcTqNd5Q+@kPRJ/@<DmH>a@^<AHXt\@n<A?1Nk
Tm%>MN @Z<A^uVB?9<A/w?5@\<kien/@$AcK%u@H+n^RdD?d@9Paj%@IMqA%9<HEt?#@n?RjLT\@n<RhT>a@^?I
M6LF@i ?^Y5@\?E:m%a@^>IMwV%j>8uD89@A/tiYj<j?B:QTXGc^l*Y@\hl*Bc5@\?mitd>j^D^B89@k&neaj%@
1D%Cdw EQXH%9<HEb?#@n?I^uVY@\iBn\V4@+Nw*GV>j^CiV:D?Q\nqChd@B^Gj5@+@CQ19aQ%@EQXV%9<HpR<p
#t4&dl %9>y?BT5@\<t8ej/@&DTR%n@H$^/CP9@k!H@BP9@k!GHBP9@k%6+d5=m*#!5@\<tu!85@\?tMaZ%@<F$
\ehuXj u/#@D/d^ujZ@\ZTj4Q<Qyn:I?9>kGqNa@^>C@tBa@^?CMXc\@n<E+=Xk@Z<I?Rqu@Z<I?aNl@Z<InZ&5
>!k+>D @\>BZ^G5@\>Bt\9Y@+jk8RZ4@$Q\j+L%@!G9<J\nyiuiYQ<j<l*:nKXyS?lek9Z@wVSi5@+@qGRC/@>D
weM!ih !e<V/@>Dca^t@Z<wbKFk@Z<wbINk@Z<w<T44@:d@H6d@l/JiBi9@R%G&aQ%@KQEu/@>D/h=a@^<G@W/\
1qD#nE @n>5CM?bY8#Zl@Z@aVT85j+@nMbq%9?H:eG?eCqNa^#4@<MkF\Z4@<NIh4H?Q\^>X:D?d@9:aj%@GI$h
bJGYBS 4Q<QR%5J%9?HwT+F/@@D!DeT/@@DeF?C>j>lXPi5@\<n?eD/@#DTX%u@4/up?X>KE#?#@q<D9W?\@q>D
9FH^dZ j1ha@/?BVmSa@/?lb&j>9\a/lYD>9+b+u9Z@G8J=%9>4!NeS/@<%T>p@MKW^QknY@&6w*Gj>9?bph=1@
eYG*@W B9WnYj<uZ$TTL>Tk4$9Y@&9Al=L%@^4$A<u/j\*+WdL?Z+P/p1#@%/B>JP9@Ncku!jy@Di=h59+@HL<y
b=c+\# Yj<jD6%j59+@HHWqYj<jQyVu#TpNjXc!@n<eQC^b@^?P8yK5@\?HHJP5@\?H:mNb@^?Pjmhb@^<PuyG5
mFtGER @\@HiCFb@^?PMXP!@n<ea+hp@Z<+%SZ4@<QQbZ@LqIaMq1#@D+e5qK#@D+hMp1#@D+h5pK#@D\hjThd@
@G<W:p l/P9TNd@l+NuJi9@\<E:p9Z@+YlQ!j4@CNT^bQ%@BJ=d59+@A4<9Yj<jkXm!@n>mW%=nwDSpytV>j\V$
GCBXbG X5u/@\nwpyL%@^HRB!V4@!Pkb$uY@$hA>=G5@+?AdmJb@^<BHWG!@n@mPQa:VYtM1=L%@^EaA!Z4@!M\
aDFEdy FpuY@$hRZdH?Q\K!X:L?Q\K!X4L?Q\L!V:L?Q\L!SLL?Q\J!SdL?Q\L>Y:L?Q+J+nQZ@Eik*p9Z@pbLZ
aCaK91 X!lNQMd/@$m$8YV>j!V1RLL?Q=J+mjZ@phD>JP9@I>HZJP9@I=i!d&%KW#&\@n<T?wXp@Z<p^pHJ?9>I
%*?wKV !B#J?9>I!B#J?9>I/n85@+?ELJT5@+?p95Q/@$nICeu/@!nJ/$PWBw>L%9>Hka<p/@?n$G/T>j>S1AQJ
L>YRX= ?9<w/li5@+?m6td>j^V$cMu/@!l/L6d@S$E@pc#@n!L?b@%@FHRq!j4@KPk9p9Z@WhAZJP9@w?=tj?PW
IAWLdm J9=u@Z<W^ldJ?9<w!FLJ?9<w!GQJ?9<w!ELJ?9>w!B:J?9@wZ4\iStu$D<u/@&n\ttV>j#VcRdL?Q^4Q
IkD4yc Kqu@H+*4p9Z@$hDNJi9@w/E9T>d@S$MQqc#@n!b=!Q4@cGyH%9>HE/?!@n<ca/>p@Z<$6hjTNhl8A1Jt
/VI6MM #8#be:&bbhQt#K6QEqT+Q6Xwbud/#CqwtR5+9yDn>#tYKya4?D#AeSeXm$EeD?d<C1bj:9qF&hZ48\%9
LmPd:> ^Q\@Q@D@ZMVu>Z^?Jb@*+QM@eZ\%^>h\@CHH%*J<Qeij<#%$=@PQ8V^?F9EV=>@K<i$e*?t==//X</dZ
Yw\*^S <E=!Y9lmpm<+9yS@kl>Z@Mn=N*1K1C^VP&qwQhCVQcCEDHyyVbdLGMk^X/Zp1ySDPB:K<VCPl*M<k8PS
8#R+Zh HI@miDVH/*G<Q5edeL\l^^6^uL!Q5S^9\9GtHG@G<Saed<u^%l^9\@E+n4jqiD#H&*G<Qee:eL\V^^M=
4KIP5B u5S^LeiVPb:C<XTPy*G<C<e#Pb:L<V!Ph?N+EeeHeX6%+:c1>DSKXTC&pPTF>PSXB%1CIdiLCK=j\jW4
mM6tDu %8X!8V#B>T*+><Wan4uiSLJiiul?w&hqnQ^#^Y\Zl4kN94XHPGaYEQ@t?H>e^KEeH<:^aW#Q4GI^1%k%
Md>Sej HDQLYCM<Q>&6LBS6cdE:JHP*TNdwIZ#PNT91PQ:G<??>K#*PF!%4h<?qQyZ8>pPcMQBe/66#al$=<GwP
-APF/a 0005bc25734001202b3 Page 333 of binaries1.zip
#wAlKC $/cTyECw=N?N<P?EPQ+u=:h^HPZ<Sw:DuG@^?i6<u9D<+nw>y$*M@EWYa+J=R#S^@LduQ@9%cpk$b9/4
yWHWAN aFK?Geu@K9jn@DnH!b6i!8jQeb#k@Fa?d?j+Ja:j+89JeyLqj5V^i^!@\@EdHC@n@$6K8iWe9<\^T*C^
n9=mS$ Q<eHeH\k^<u8eVDHTTba!VH#uGBiE<^:+kmPn?V+ia+j=Qkwnw@t?BmPn?Z+PI/Q=@9upWW8=9\VPD/J
K4Nd/e +%M+@kQHy*F<P5hu<Q<9+jM#PV/L+:Q=iyIF#8H+ZI:Q+@l<yt9l<?Rw\mPq+BFT<Ikyp1Qa^S^j\9EH
!ih1bC HQPRIT:n?BtP@<#^Z#m?uPNHPZ/e+!e+jyLny#m?k8Qp1HpX^#^1Cl+%Ba?c5mij</kyj8caS$>^A<e*
mF4ewt eu\V^#h#jA9HQH1K&#ntWXVe\jGhHN@F<R5e*<*^QS#j!@GLHN@Q<RPi4qlc+dy*heTF^bT!tj@nE<:u
SWdA=5 kelmkT9&+4kj=&@9KdqL6dI^h$6QcpR<jFp<jFp:Wq^mCha/^Kj1ZHJ@pkj#>c@+?9h<u8!*u*q?6d^c
5LF!DK :WSJ?%YBF*EXY/h#9K&K^h5WT?a/$CZW8X#P%#@l/%@!?V6<@5EB$<KJZeI4b4e&lM9Qi6Vcb=>6Hh>I
!FDFw% W?8*Xw=W:H9c%BIdHtdd*S4nTlP!9%4Ri/QekYiZlLQM9Iy$6pYy+nh/ibi&#diy=p:Pa=d%M+I>tTMN
p!kL5A Q^l?eQlBpDY/9ZjWjQjdlE+c!LhwJ^eIbp\\IZ*@p&W?AF&M5M<?daqkQQHd>t>y%h69BibN%P1#Z8*5
Pw4>%$ !XQY1%q9<5T=E^HXV/?h8%=u1wDmjhi?m4ty1m+aTu4Gd51ye8dKJ%8KAQ<e&W!R4WR=9<tTVRVbR6D/
cVA8c^ N/&4$*w/&XjSYuyZT?&HJD5I5u?khZycp/i%iHw5YuPt>YXcX/d%bFw:ynXnYm8tNYKcPKJ%aF4@ydXi
BY#St$ Y4?q>Xqcu/AFJqwuycilhXFcD!X:NXwLJS5<54&n>W@TqeqPpi\V!T/S:A:JqyB5CMqipP\E!hcP:AJy
\?l69G ja4YlYp6iX>L:X&mcTyc@!i:Aqw4yVXTYtWplaVYiGuhq8d:cV1J%yFyubnYnYp6tP\LX%y1@^G6GhP/
a6L*DE K/&Xp\$B&SiRHRnbj=DhB>q:pJ$H&ZeR5=N6B>q$pC$H&ZCR:RdbdJC6B6qwpG$G&T!T9TVbbyBNB6pT
HJ6D+k py$l&SGT:S9bFNXacq<t&YPRHRdbZ=DhEhqipM$F&V1TnTQbNyJNI>p!p5$F&X1RnRZbPJA6ENqmEtiS
yD5NE4 tCV:Bqyny:X%5t&mhZ8!e!D:BqJV!J/B:BnIjwF5w5l8mi\ZhtK?JV5F5p<k8\T!S/AFB4KJJD6H5t<p
wcYDM9 ?!i!i!L:S4J4JH6G5tMp?$Y!Y!S:SdJVJJ6E5pY<!FJ:n<ntpG\N!S/R:AQJFyD5DeuPpP\L!c/R:AuJ
D^qy1q nyD5Aeu&n&#?!NcQdQ#I6w>5?5mYn&#+!HcQdQdIXw>5>Mk&n&#!!BcQdQAi6NTiG:K%I^5:51*:6d<9
hpPKy$ u@!&QNtDpS%a48@Lp\$Z&Y/S#SdbcyGNF6qtpW$Y&YKSDSdbZyHNFhqc@c!/94*FY1w>FLS*k9bM$F+J
&ekVTL &mNBi!NwV\V6lcA>ELV*kja<$F+H&8PR*N8\TnLp^nRb$w*q!G<qR/:8yHLpi8/Q&iVI?^&WI%@=!JH*
1&?&1! <5mSh=nHP!JH@5&!b%Zq!LW5T/:#pTM*4AW!=G&Y+@@KI$P?>MkR<?ylkkq/wc@I*%hEWjZ?pmL$Vwu^
wG>$Vu 84Jw$>uFi#c#jtbCFka#/&etbPEH+jyXNP6uJuVP+H=+y6MKBDMttGBbyeK<6/1JPJFiE>KG%P%Rn8>F
TWFq>E 5&Bqk1Zt*Yl8q8a*cZ/Y=9FI=NLecNIQHM*u$h\t#d@TuCLN^!du>>Lu>Yk8m8ck9QN:!jqitq?qPX@T
t/I6Q= +&m8L#t9q=!:Ty@jw#qh:^^jeu+9jW/Q=y!V<*uJ?V&c>/W=RJwLyHqAt8NdE?j*cQ/W=9lwuyZtdYq8
!p8>#H NN9<u46PWAF^1d:k8<ylJ+TJ>jZpP&Dq:m5Lb#I1##uJuBt\ZH<kSR9G+8IZCK8F^RWc51KP9lSVM*6X
&aEaJQ ih#ld^wNT!dQuLb:cEtppd=6Md?l96a1X@N?w6Cc?m&4!*mm#1FJ=yiPZ8uHpktn&?+Q@9K<:bGV^1:I
!^8TuQ Cec8TP9>KCC<w>@c8+/Aq/BDdE<!GWj#qtmH58\6kGHNj9MV/4\RE:PT#HhKu#hW4:J1l1XPH?wcyp@y
jZdPnC Pd$%Ea/*llM%W=dHt1Q^np:6V\?4j^5dZl+&Nhwbbh\tqi$#y5?%1mM4p$K16H4yY$4!dLi#ba*j8dS/
6ACZ\G +Tpq#!i/dEStY+QFDK64*bSb<#ARLcCQ:!H91Ic=e$dm@NV/?mmbe6$?J>JIbtkQB<MJ+1yued&GZ6Hy
e#8@h+ a*Z$?n&*nySC/<6aQE^tZ#@SJ^kl:m4yk*dpP4jEI#>LI4dbt?%!1GT^decq*Ct86E&+dQh1a1Pjj$//
G/:L&T JBbn4jX4&JY1&JnM46mF=WwcF6t6+Ww!qi9KLlF6M#SdwA5#/Jqkkkq4WnCcwNEEnTbwR6E$\TQ*hVZB
X+mFI< E^>M%RRQm>tc+LNGE#VBBBNMMJ1kCWaVNGE6%ASL9n*F$RSLj9+<SSM5?e>FJSh?6@/a*a\tcIIJJym\
Q?R4Cy tttCbw8kCb=k6kmcpIMj#BbBE#y>wC&C5/K6uZiZwNESVKBk64*a$\4b^p5VCk6t&$8Hc5y5i%u>\y1#
AZdJV= :cWn8=uNJlputE$!?j6AJ>wpa+b>E$#RCcqP@w#LY?Q!%4m<Zd6e*u/#Y5^T@VyZdMqFH*tun:9dH*Xj
AkCnNV ^@/ki<BYXtcy>!M=&=bu>BF*Y&8T8>y!nn:idye5G>RiWntZ#?e^@Y/&@KMQ6Xjb<i=KAbF:eL\u$@?P
pnCTjC +>>#?Z9^:?@N?j6\ij9!@RV=>^ew&T6au?5?I:ljpD>4QZb^MGN8j<@y>VX%<@i5V#+*5bi\SaX9KLNT
4j>46+ >5n1m9^6YN^9^6%we+@I:<:mem\QC<p9J@T\ZM<*TdG@T^c^9!8L@dp5m9hpph4Iw6a4>yi\GGlt5Z<T
Qjqc91 m=M&FkFJ5d?e^helLJIQa:F<Gw9yuXq<#&jS9aJF*ba<dC*q+YRiD!$lHwIY<yD!i^d^i@P\eBRQL$j\
*X&Y?E WBLnIY+4Hp:TSZ=jF49=SQ=RF6pH5em9aZF@Mk>nN:DaV^j=w%u54<9DT:4IQ<En<5j\pQ+XD=WH<lA/
J?iKdh npZ?Hm#&=?RR?V6/^H+8pV?Fl<NVYPTj+SH:jmL@n#qE@tW5:1@qwT?d!L?c%SMn<u<dph>S8ZKnlq#y
?1X8YG \dLq%=R4uW&tZM?!I=6M?XeHbe1ZQnLq*V\!JjpXqw:IqPSZYFbXyulX!X\!bY%RJXjqC!!@YnBjF@<F
4ZqA&G 9m:?Stya#X+EVDDBlM!JPdP+a+ITuMRH=hLlmqSdl>K4HD4T846w$JEtZ1%BS>y/N\$/$8m:P*ST=KIn
Id:DYT LZTER^jITWic/pkNP6JtS&uRpca:YwPP6PF%NilIP%=Qk+/$@@EPZYuAT%dmwTP6j45ehN:!TF9iTaPP
bdG?dW NPwJGuTpPV@66t<kF@?SF9%cLn:\$JGt@dwGHYund:l$Ileh9bY>yWFHY9^:GuTp=d?9RWjc@\echQTG
C1l%*+ <G<NPu1L?FCDn6+!Q6ckw:iWV#Zw/G*qC\$/i1Q=TwPP*um?%1CnN/AjNPn8>wkLQ#1<!anlGu!F6^\^
CFX^K< W1M<9AYJ$Sy$iPMXG&4R+a%bnNGk?^dH:jLV&a+Ec#Zw1MQ?T+PP9ui=T@=?Lu4lPCh@Qa9iPDbw$JG<
Hy:*n8 u/J^j!V94>ckI*p@XaPP=Q$$DV1c*hBwN$E#Gy6y$NFM%nachDTL<dAGHe%$ZKXBS:MlD&uR:a#n\Sy$
=qj\:H NJ8t\ji$RXPeuIP9Tn^$<*E<ZcP<*ZE<R+N8D^#Q%KD:Ha=uc>D>H5h#NPlCPF/pRdeR^$5%/BdliJpG
#d+6^5 ZSPPq&9RSZC<RwN8Ma=Zc6A6\XGH@=y^@JMGHe%<Nt4R$i^4YIPPbkD@1EFH5/eLNilwqucSBl*N=Dby
8:4Z^l $NGp#kMchDSVHNGkw%uWJSy$NG9h4EFHM>56GuR$?>&1RdeC^>M$/GnGP/yBS#Q8MR$/ttG?VwPPb4&Z
:>BB8$ c6DS4LXP@#$E^%M$/Fdm?AeNPqyXPEmDnqaFL6ckw=YJ&#ZwcEXkyRah#j4j1WFHK\N*cNDS/5F>GuT$
@LH5b$ \1AnJ&pX+m+NPq4q8WGDnqcCD6Ykw>YV\#VwcLZmJk$/Ywt=WaPPXy<P%/Cn>:\nNPlwFiXIDVycaVqK
&WnFWX k+=Yaa:SwKPXt85%/Pk>>HkNP4!HCl%>p6=D:>ikw=Ync#VwcHZyYk$/i1<>RaPPX1y$^9PLeD^Jk+:i
RTyZ16 p*ZwcEZ5bA$/iy@YpZ@$Q1&n9>D:>G$chQR?4TNQ4<L^SA$/i8@?ZwQ8cl^%&w*i#*ZGRXy^%NGLcWZ!
SD#Z%/ Hk$/Y4*X$a6yZ8A5DVycqd>Zk+=YR*Z$b=w@8F8DnqbX9>Pk8^NHujhBttjRiS?<B<ihNin8^ZG/B6%>
jYKLa? PM:RwKPX+YM%/B=EhJ\G*WM+Tk&/S*HWGa<iI></GuTQ+^nRwKPXdy**5mjJ&a<G*XM+*1JB>^!PP9#*
w@GS</ QI+/@i$FHHZ/^$5+/w\#L?Pw<::\N^\j%KD:B++/<\!9+9mwBl%bFB!6Rje/nw>y$NF<*SMchG@m?KRG
6WFm<K He*4QiZT!X^$d?Q+F@ZSFQ^Q/4#FTk@hP#n?XYQi:CMe@/F^j=@k?KyGij?Hw<d<8CAZZ@@WwQ5C^#e%
yS:Ecd /L:EWYP?ZZ!F++5chF@n?IIG*Ve+91^B>\PPZVZw@wjn8@uydIw6NinATEJn*WDTS&A$%k%pCa+c/\c!
K8p#L9 FMeQ<@PL:Idnq^4qhehSa==j>5D^Q^y$QZHWYA?RNK@<nRah#T6@1$HZF$eN@WC8k/PGZmj:+cm^ZmH:
y&+dn\ +@k@DdwBPQ/wRVeI^=<%/Addi$Q#$\$Buea+LaiCVpM@pDYkK>GkG\//Wk&/EcA4$/AdCdy!DdySwP8m
lXL&P@ RVechBWchP8BVpP?!QXBX/XB6!Hw8tuRnRFhh\&/nWDZR+N8a>D%%KAdC:yiGuTdkK/*B6&twP8nRdeb
5k/CWh /Qy1$G$B8u+chF8BdwAG*hckG/lB6\*wBtuRnRQhaA&/dWE*SIN8QPmGc6B6B:ylGuR:kW=nQXSPAN$w
!RXG:Q Dd1hRdiSB6%$$G&5RWjdheb1$Q$PhD6y$NE/n5c<1N!L@P^y$P&N+/pchQ8k9IpchQ9m1KN9BHHWch<F
*ZGyLe PN/1RWj4Xl4#KnKM+!WchA9^9JM$/BcBVtMhY#cBd4IG*YLRcd#9!^dRljK9V<6Y$C*WwI8DVtN>SmbA
Bb8GH$ %/1l4:ZniIlGie6Ru5a/mX\PPw%%E4pChE8LYM?Gd5&pY\I/njp\&RA/DZ5GPSh$+#Vw=wF8Y\&/*WA*
>@$I&8 ZwN8Q8k$:Gup:1DdZwN8D>D6aPlYne=Th1ZuC4ZnT\Zd%ana=?dc^/Gn#j&*bWJuDijJVL:aY@FF+l?t
+LEkW6 iny6CAW!?iIa^ShdX=91/dVl@JJM9nkYjLH%##@ji1Gyup+dum9%:mXW45^i8tuQ5?ZQQ*>1uGB*&mD&
9M>n/i LM9pm^eWZ*^#9KtjV55Z?=du=I5HnnV%a+IJ9%!kDcTX6l4Z9aTe8Bmj>WakY=:9&lA@nG>wC5dDnaa9
th=XpQ Pne@YQT/b@QD?DdDEIajLHIEy9ll@Qnt!IK&<dGF#iND$bcYcK6lnW:JD&Yb@NATDBqt/K#<WJ:GD+6m
Y<*#Ah weaqNp9E&lea68l$@NAqK#<aZ8m5@FCl?CG/aLFlkE:QD!W$E&H#R@&$?qB#JN!ctBqbaKSDJ?cH1m#<
-ADYde 000ee5f6434001202b3 Page 334 of binaries1.zip
$J8u6? aC1wE\dtl/:&h=dXl*Wd&tP^cD\^9n//LB!9d\/&Jk^4hC4=MMG&jCN?CCjm^ASL&twcE5HY^tC<pd*&
Rqp@P! 4nA5$cu+RYcSD#8Hk+*liN9+ic&S@SAHt&8TPcd1%ub?CQn\k/tw#5eQJXu+\XSR=?YHW9BD%/:$LTew
TXF1TM DK%L\6uN$/46d<>P@9bb5YL===a<j=#X1:LS8h44ymN!@6KKFb9c<id*@uqj^BNn5ibmqFQd*NbtnR*S
k+wY<& =/h!qqM*9+ci!<Jw%=^b#4Z@XnT%p+6^Q*Mc=6RYw=!=W*cjP*bBp?XZ#1Ske*M$&p1QFe9%ZHa=m?uy
8EFqkw q^hWQ*a=eT5T</uuPiH>Lb8BjM1l4+Fba@j*LWjujl1nwjbm%HP<LS+1SnpWFB6cBV&ZZR/1^!1\juww
\>Aq@I !c/?&yG6P\>WQjt@i^iuJ^hiVq*h#EpYYD:pW\=ibY1t6>BaSW?Yw!jZ#=^cqHJ5mXD+e<&iNKMt*@*W
Z&DZt@ %e@Qi#>K5lS?Q$uJEm1GbAqb@5<%9/b&p>w^a>!u!qZPtDFYWewJYYPKWp/5YPZEm9Je+iY?=iS4h/ie
6+t!im Jm5YK?B?imVLmXtlynFn@M1yD:cF<ILyFyV%8YLBN15w=aTcC1uuqb=!\ItFq^P*kt$?#$WnbdLD?:b:
RIp/+w Y*lSwi%8n=SWWDFG!mKW$>dW9MCml9iyu@wyW@QK\:bEi%HK5WheXFIl>X#9n4n1/%^?I?=uSSy^Q@8X
e&hq5! S%\<YXFG*N#q1BH*5?Lw+IYZ<=8MqE:6FDlT=m%He/VMY$/5YPZEm9Je^Swy6We+>+aKG?H!qcM=\8Yw
?BuH#t u\/QeQuK$SnlJ4dynHD?=iA&WI#qY<:86dMlj?K?=SDN%DRJqQYhplmwKCNq+iX$eKVMKXe:PFLtLKha
BXuk+C I/XhVt5$ET=k=5wieihHY4ja9Gd=8K%#nLnXLHpnC*S/D5wym8VNY+/t=M%dV1^a=eTK<q!/:^a=!8uS
jX>+9w WWtZw=\PT:y<=cA#=^pJ\IjRPFCR@?^b&HepwELCdh\J4X?lB#bHFql/Gy6VR%u9J:yk5h>##X/\PG<=
c5^^Zh 5/K6@5JA%NZXF:^likK%Xy=yMY8R4cWZGB\69Rnq&Fy/uyB6Qm5>&Fy/MewlLd$I#&ZQm?WJ&idF$wP6
DeB9!L :SjljyLc9q@Iy8&uB^=#@J<4!#^C>uLGnCqPPcEm*W?5YPZEmqIPcj5FBl/:Cuw8#:^a9uI!=4P!*k?>
LXXdSH NSTquFBVIe?XNyaYwb^ai!HQ=Zu:<A*$>1HX:nT@XtC\*^1KIH@56+amqGP@NiVVu4QMm/WH?/&lCPW+
eD*9F/ Pp8B&4+c8i9C<WW=XIZ!%Y*pZm%HymL$uF?VW*XC9wuZNX/u<<#FFKVV=T/uTD4hG1&L=c!hD8ymie5J
tL$XVt Fiq?a5W1J%cWeu=6ZT#H@ZSeF<9>aB*V^jKXw/tL=Tmt\:ya*uJ$hdH5BSXjF<8nA/mbaN>k#\Sd?Ytt
R@bYC= =yGIc:lPq=MSP/nV?jV++8l$?Tb\4S+hp8Citd!CJHniepJF8y>a5e1JFcYey5L18iPTN@eNhW#!=m6H
yH6n1M W@LtKKdDpnh9Pd1TN*6B48VN!+h1bn1j=KYbcb?RdYd/q=IIhnp$M/&u$jy\NM>M?+S5M>QyIb>B6NX#
<d^AGK hZ8*1J%>\yK<d$^5RiwZdM91IyR#a*F<+XmkpPj15dc@w#RqYywL4B@Z$48\>m1YVthdiljIQ^PwuEl5
<tt?bN cnH+eHZV/Y\JyT#GC*w88^!!GC?\jyltenTWR>=XhWC!VQadCVwkYZ#L$iuJ?Vl%Di@J99Z#G@VpuQjV
1E%Gun \b:5?%\/QXCu*V9RA!ju$&\$i/B@Pc+H$8wT!?ytQJCcaD!RtyCNH!#nkhRE!*kkNTEuQ^kQyCaaD/Rt
qd=VCq =PIH++HWBPPB%IT5@GB:GDRiTA$@8Q^RdV!RttBbHw?$^kPypR?Y<WB1Rqb?CBkQyCdp<VlyY4@#<pPy
c%TW+: <WB1kwej!w\HW8PB%Hkk:VRiTAeaD/VGA/u^RN4JQJAc#/HGe/n^HGw<l^4Qweb#/N4yPXVZD%/P??t+
*W:K&L n&*nkhS+IDWiTD5$+l4Qweb#cPET!ukPNb=D*YA<l^4QwVtD<S^1QIht8&+<l^4QwaZKH?M=%Ph*LPM=
B%Rna! %HkP#Tp%nPjRR55^upPN=>BC!#GiR+*u$IJ$5V\/kQEe118LGe?llWq\+#q$qew^upPN=>BCJaJhn9Ee
1Lp<tH YpA=^uQwG9mPan!Hbk$VLPM=%HkP#etF^uPw<S^cRL6*wAj?Py=DnY=5hGPnG^9h&PnGSne&84HSna%8
RtTbBd dHSnw^8d=/jR^VKlp+i/l8qVip=9VaVn4iFE#bVq5ibwQN^B1?nyajX9a<QL\/bGP&Ew&/T!jed$8Xb=
p/cWZI ?a$1R%mq=V%/KB<8&?%5YiN*Lm$9idDp?WTZnZwlc:CaaZY6t#J4umY6BZPDedKZQKyl:y!SPD?%9n=K
GEdw#S d/P*#+p$$u9i\<F\k4n1YX!uWjHX1e%Bwu>@dy*>H9lqLB/th=&j!G8aJWVq=HkWpqGMKQEwGCWS1^4S
$^McPK Qub/5hWQ$cZ<cn<I^@@c>:\S?dwXqZb/4LX?nTX&6hMdY%9liA#Va&AXN*N/ltX%9V+=?F9i4:S$e:^m
yk55M! G8:w%MF<yeYEdQ^k8X>lMF>yMj^A@FB696Jmk5>ZPe^ZYnw*Q*R^Z&p^IjP4HPa4LaajdH/wNF>yMeH#
PmJce> Xa=K<=WYE##<WGY?$tKCbZt?+tT?$tLpk&Y?$tJCXu/R=m56Jtl?6ehWXPjnl^L#qSaV$4:ca::Ta4:T
8>/\>9 +qiP?WyL#uIw4FFjcSqw96Jm96Jm96Jm96KThn@tK!*tK!%b!%qd9>Jmq>McVSSm@K#%6bhB=t59=t59
W1YJlV =t59=t59&WhK<:WZ<:WZ<:YZ*&VpNq?NMX?NKX#Ttc@GtK@GyG9:BRbH&!>CPic4Mic4MaYZa:+c+%8P
8w$1<P ?Y1M?Y4MKkd#%Sn#%bn5=bm9^lVP1V4BjDYt+HLMX&QMX&MKLeh<Neb<NcakZT!QDtC?G1P4m=t9^lRt
iqby/k \e%Za%cyHQQXGPMb8%CJaJhnQGMZWI:^nL$G91Ma#>lb\\VLiMa&u4F#e1H^nG$<a^jR:l*wkd?cb&\V
#i4G:k %1/R5qNQCQ\JaY4FBBNMYMQEtApttJA9>PZ^Zbk?a+KSuCcaaCTuCWb!ttDCL!\=jaJb^m!\HLPMcba^
lpSqI? X@X?JqltGhM5a?dpR4PMcba^C&n*D9VAZ&eb5/RI148$Aqbq$X+n#Ch*P*$\u>\%wiCR@PS8hYSqW4mW
qVQZe^ Xm>>K?YV8>WLV:E@8W6!hG*>=G+*JiHXc&jq9Q4ya?utI59>JuKE@cpD1#8NH:W$YwZdwB*E5+*ThjQ*
N@9R4J XLdAATP=VVCT&+TmTi:P@4F$I:qNMJLdlDXQeyh<i+wn8W6?@n^Feyj<=/KTC:>dj<^8SuIZRZIZ<E68
VQYZlw YM5Kpcanb5#RtYB1JG?NhFD&&PF=>L:B?ew8b>mKb1XXTn&>^IIwy8?6t149%MG#/<bT*>>6cA4G\+&G
=abhyp L#w*Q%n&Lm#ml@F6lmEMQ%nP>:pStmML&5dHFncQD$XdY1K6lnW/JV?WbjJDT#BptKG#<pN=Gn<5mwWc
69Ady5 q>k5EY6jaNmm$@FDq/#<aHml5@JDliKH/ILFlkE/QV?WYFbZ^R@%$?yD#bF\c&JtbIGSDy%aQqSu+RhV
wiGq#G Rb$\5H!w5mV+Rdp5d&mQpjjB<jZSbiF+jZP\NYFaw%QJl\tY9e+Ejkku+5RET>y1GlLB%5bk9LEGpmIi
6<H>n! nK<\LNGy?CGRSV:5HA+&l8N6+?i%StklP6lep<\^Xdi&<$PJD#?am8y<@FCclS>MBZXijmkDQ*V6t5>N
D%KWp8 hdZ/l9t*#^duG?cFq&N9uqT:%9!?4Gq9>/VhmyuqiL<>Z9n>1G?QF%=PelPtKMc*^?*Np<5L1l@iQBtJ
+IuWpI ?hR#dVK$GemuHH9#JP$PLLC>:P*LSclui@NpEe1l\J5uC*w88^#cQFqk@jVI>+HTkcwu@*j9+9Vp\58^
ImqueQ 9&WFqk@yjW9Y?W=eSp?td%pXw^^dIlV?ZQd*TjQeV:d9p/djn=I5lh>QW4KEmmFbRyd@e&Z=utNB*<VP
P*PV&$ Y+:tN:H#qlM4Xnt^wn\ZjSP4kHb*!6H>6ucP?@F<tTYW=%9YGh@j#Qye>GYYwyTn?c*9HM?%$84k6::#
4W/%y8 qSP*kt$?#$WnbdLD?:a:jXi$\Hc*S$w11BknbSHK5d>BSR*9W#@b9kicZn@&N/mKWI+>+ldlY?k><u$?
EaYjDK ekCQ8J<XceV>:Feieb&9iBW++8a8S+&+u^XHB!?<uN>pyQS<K/&kpVJ9Pbwnbh=!a5W1J%cW=!4YTKp>
Dbt*aZ \4p*XNkIq/<e#SE8S@%$iIVLX+:GCDi^VYiE<!?H9>dwY+:>6ec^eh>!5u&6Mi5:JVFRWWdK\59y+Emb
iEXFFI W/=&eKVMYW:SS5y<u&85bwpbYcDD<b=94lWpMjPYw!p^<=aVK%a=5cI<q?+:Ra=!iuSWR8Wwy<MTKq<=
w?yqZj /IS=JLn/1mEK<y@%C96K<G^jNj!qiw=hDu*XWE@Vetww/@*RX\%>um9dX\*V!=pXdjZjVC*1/8w:8FE:
T!Eyu\ M$!\p6>t##&h6eb@t>*#SypcP9l6>6#qFMql1D&jqThpt<>KD&9$N>=#QqWH9^Ce6=^Rpi+uX1^!apWy
/$G@<P =>j?^u8P??u+q+b#Q%nH9nTe4^#NL\*uKCb6LC%CPdyjG5=ipPi6\Vjwj?M>9KlR@quD9<&ip+E/?G%&
t%!Mu= u==cuC<^1=G:Ll^jqENXKF@hS8:XetR1R5@=NVqXJ?TdMF*nhV4QHEyBPq*8e6btJ@C/8qnP&8tkLyc*
Fm<%I* uFCS:mhY4HJmSTuu%>dFe6^Q^*Y^*A@YMX$5Z#tc8qmPan15m?W6S%eZ!%=R<ZY^QD1At5H%DjaM4yYj
Lp1GNj btwimdmG/*R=GdGDPy%Qn!?PVyh9A6j1$TEJ:yuJK$mC=!$uXKV:mSY4uFlS!tp14J+:Luq#*%DHJG??
CNPC\k enRqd+=mPm^=<=cnK*t#F?SK*4^<1Gct<$qityu&Chqtyu<ymYCZR#QVil16D$j##LSQ!Da#uS=ttA>X
ZdK@?a FXmP?XCX?XDX16:QBM6<1My<1CwuF=wQXbpQXSZR:l*wkd@Pl/yMu#b>&9Vy6c6Qt<>PhQykQn6lR5HB
RqRE5@ ?hVdpT#t/FN9J#/a?1t*\&L&B+Pi6hdi#$+IkV<lDEPaaIIJc%A\p55EE$\\p55EE$\\+beQ=lNwSycd
C?NFyZ aIIJSyc9jeG5LZZ/MHu1#LpF4!$X>8<t4Pql$$$*JV+!84HSnW$\\RTnG/<NNhLBV:$ddhyw$$cdN5Fw
Ih*Xh9 $$cdN5EEE+\&daLSyp$\&4RJSy5&&4RJJylkRph%^@LX!L>:j?Qj*jl*#^YMj*jn*#*d>bS9p^SR#p14
nA8&yN !Q:WnS@$uPWaQ?m4!\lu@KAZ#1p/Ic<j>Q:GD:4^k==*#DF?$A54b:Z#k:/c?S$*@5JZN>%u:jEZZt*<
N*:KHa lc?J@5JZM@@e^1@&d?>Z8+@^1&*<cli5</=8j4XdFlbcSc8Xj&/:HPPjP&>=&i^qX4Gek9uRL5j+Fq:F
Q\l>D@ u4PGT!nnY:mAh8?ASQlXjA6LbcqaLyXXmLBEmji!KL*KwR5k/1JBS%b:%Sy$Fam/chCSy<@8Dy$W8imG
WcytS\ IB4l$AX!$k%FNFKDdlmmWSy$^KinNimGI%yZk&+Ew9W$/PlL<iMh86KAq/:WR#ei$Za=/L#q:WBhSwN8
=VC#9E S$R:chD>EhHVd98t$uu+:$JE4?ZmA\@hSali%/C:GNEdLy*ISZebw4e$/PmJ*6Pk8^4S?^y$%!D/RIQ8
:qRLZd YpV@%1C:D6GHGuR*IQyak?+tSJ>1$N&G/A5N8n5RjcXBh^im4#ZwHpD$k\dhk^=^+Wj*Np/Hc@DXi#kh
-A#?q# 0002f85329f001202b3 Page 335 of binaries1.zip
V6lC*R 1XHi?#kh4WH*MW+*%KD:BKhnNPl?^Pq&?iqEPW=4NilIQ9>Lk\:1k>kqj#<Z@ZE/J*<>m\E+dhCkI*p/
$iLaDH SiQ?TJ=i4WE*E6FWDdySmKby$K&QTKQh^KcIN6Pkw%tRdVVwhpd$5AdhhESZchDNRQTRBq$hVk@YwJ8D
=ulF&M TIQ9^Y++QVpHZ=X//H/Q!/h4qLeZV5@RwN5dy&h1$EGhE&h4$EGqF8hw$PFqRF!pRaj*IZGyBl%iCeSq
JZ95kl GuR6PL%ek/+Xy%hw$EX^i1WGHZq@%?G@yVn>p\ah9ZW$c6CS=l*YwKQy%D>1$NGM\$IN89$RLhKkY+cw
L!mpVY TaN8PcIHNPlYIIyw$NHL!^IN8kMRNY9RHamwSaQ8IET6GuRH+@R$DdyDEEW%/Gm1Q1bBh!mm/#VwDpP$
<i%Vq4 XIQ8eER/@jeIuJ/mRZepV9?kRZe$wwM$/I=FhLEG*ZGId6ikP+GYSVVwVpS$y\dhTan8$KA:GhF>GuTu
e4*Kwm INKSp*>AhJeG*ctId6CkP\*SwSy$y!M/VIQ8DER*chChlilGDd1#ES&8RZePwmM$/M=FhKRG*ZtIn6Kk
qj&6F& P^@SMSy$>B=/9RdhBamP%/DD?/4R$TjyjjX?DVy/Z:%Gk?+TSNh1$NEZW$:RwKQ*Z=*^@HKeu1SBh!Wm
dt8cpG HVy/u#=bk?=QmHVpH:%*/?k9>N=>t\ah9Zj4!FP<h+5VNinw!#Qjc>Dl@X#w6N8NmHVGRZ1Q%>GL/T5=
iLb=by >&nR*aJIS!??FhFbGuR$j*C9Bl*NH?nw#*em8q8Dn8ab96Pk8\?uP8?DD?BW=*&R=mN&%1B:CKjVNiki
5QCWCA ^8pMDdyHES&4Rjeaw8M$/B:H1hTki\1uP8QS$:R^WaQ8Gb\GNPn?nEnu9i\9>IWwDdyueZ1LB6*LPNZl
GV1=iQ 9:@lXKi@@S&uP9*nFb#1nDP9+qVujiE%uD/wRjeGVuZtGh:E/cMchG<lPq1Dn8d4H6Pki^iuV&nR$d#i
$<eH>4 p^y$@<LyW!/h#LGiItn?:<?qk9<uhh:mWA@hB/B:VtQi:Q>\?k?N?@5Ty/>yqQejuPccH@e?^>i+@E?N
CRi=H/ *@$Gy&>1$H&LW+*=hpFjihMbX:@D/a5chD@k>AWN89@l>PZ<hERl8t4RkWHE8^y$=am&%KD4kqPN>RXb
+6HtYp kXPN>RXbmXPN>RZbFcej=8e4&RiuZ&1W%^iuG85Bel&e@piD4l>PNhaNJM$@j/NBS@QQ*&4RDeKyll+l
EPy:64 B?NWR@?VR*C15c+ll?L$j^y$\*D/w\dheJ#?4EE*I5u>iilG+1k^u56SPG4wEZJhHE5$/NdD5XTDdu$e
L@t>VX !#VwN5C^ZIN8R^!:cNCN\dFCk&=nHHZp!%ke1#VwN5Y^t\dhbnl&%/DdHMeiGuSd+NlVk&=LHH6y$G&F
tVa8XP a&<N81%^:KNB6\&PjVZw65Y^u\dhhnkP$KDdH5iBGuR:+DlIk&=HHAh4$P&E+^AN8kp+D6Ykt+nnMA&/
S\XALm KVl14J9K1VmP$1CdliNGGuT#eh^ak/+i^:EchEEeh>KkY+BVnjqVGeJ^kkbhI$=Q%cAL+#lSk&+lVuZ$
/4SQbD nWW+%YqjY4i/XaM8kqPN?ShJ/%8ZcNA%+#lJk/+FS+*%d6tK+&RN8lmPG9MCMw=nKQ</6t#DecEG*VIe
&tmV?R Nhb^=HIeY#V$6SW+QWTn9AN\%FlQpRjm1LGiIk@CMi</mRpttGDC&laCt9c&AW%:&+Ct9Y%A$>+&pG=9
WhkiFc K$R88qS:&>^$1jc&8iqT:Y%#$>XaZu9d*HTy>4c=/XL6dZQVyh4dm8#&65nF?+LH*qaEeyXHh4q%GuS+
IhbEbu 4:BtchDl9eJn9=8dn8^*/#ZwcD$$4%%8RNu991=Bh=GqabeLPq1@jE8Dn6ad*>Pkw*ZE>#ZwcB*^A\$/
tL!#d< Ypj<6\ah4TN?1EFH/+Mjc>DS86?uGuT$@9cFB6*6qwbhL8lwZi%4Dd4:LR&:ZNA>wtPZG%B&6MM%?PyD
?dk/A> Hd9ekLK*Hc%B>:tPZT:w96C^!\*aC\Z=:ZJB%$*HLnhk&>9t6<5FZV<h8%#RDhK^!\ZhaB&:*IC!n=&m
FtnhDG eZ?nLR&:ZNC6c&ua=aJ8QW9DLlh$6L6dy>&&5DV5epFH<u+dDV4!/jT\Bl*6YL=Kk/:P$4DLBX&>nq$8
Ju1j#& /PbbGuc=AYXHi:IGZ+X$:HJB%/lnq\8/5I=hL8kY/hnqByT>:VpchFEh8>!AdZ?c*!+*aN8j=4jLDhn&
lPY%5c y@u6ekP&@Yq?8>!AdZ?c*!+*aN8jCl*?Y/=nq^6R>1iNGuSpj^4YwCQ:$#>1$JH>/WINP4I@ZcSBh:Cq
EZ/qN1 abedWQcuD&nR4dR$:HID!9=$mRah&b<&c>CS@YtLB6$SqwbhdpDbu=/tRZiWyYGZG%B&1nEN8tM5Dd9e
<Emmbi kLJuZcyBS@c5P9**iB&:*IB6>=4jLnik:FpQ$1AnP>YLNinIV9X&DV1!Q%&yRWj&y*h1$JH>/S$chGhc
y:Iu*n Guc=AYYu1mMu!W:%Lk$/5qP>RaPP:FRQ%cAnP>ZDNPnIV9WtDVy/*:ySk+:i6\:ZwKQ*4TM$/Mn?>EkN
cXZIAn P4I@QW1Dn6:jn6GkI@9V/#ZwL4e$:HJBh+YPZY=A&cui4$FHd<LZcNDS??Y%GuV$jutCBl&>Z?1M=>j1
8E5/h^ &PWGqQ&yDl*6D#%bk+:iR*ZpH>tj/8k9bH>/t\ah&b@1!NNdhi^!A<4?>H5N866%:HID!p=Xb^!p>&ph
/8NnwM 9bn5XP@SwL9d$4DLBh$>qwbhL8n86VV5epFH:@5/?nQ6%:%dk?=BT<M8N&Dd5\1h><HHhi^!RjiEnq$8
KbkN#C /J:W5e5NKL9ZGSy$#%kch4pBbe>/uAdhZ*V5epH*uI=hL8mi%:HLBh$LPuc=wH9S$4DLBh%LPuc=AYX9
8hKbj? i+5G*i5/h4pBbe?1$>@?1YPZG:D6YaZPPQP&nq$8/N:S5e5NKH6YuZtG>*Z5ekP&uYy?8%#R@X9HLlh$
t&Z%M5 H?ua=aL8a^&:ZNB>wtPZC:yQejqy558%@!iHZT/8jRc/b#ZtN::S5e5F*je+jX&n9B>$:HID!p:%u^1@
!H@l\D ?/PPZT:wj6K^!\Zh#=cGZY:AZ6:Kd=edWQc^L&nRBZV5ekQKQ4c4Bq&Fnq$8/LybGuc=wP88a=eL8l+/
^PuBd\ h4tk//qnq\8/kV4&6kFqy/w^#&@d1j=Hk&/In4%6RNtyj1NBN$#H*nck:FR%>AP!W^Wcil*b1R1N>R1!
j=/>cV W<%9d\8/$V4&6kHdVnY@9Y%A&cq14JQah1wc+:S6y/1lH<mNhP^6A<yP6XTDd1!P9T*wN6G^6\$wi>a8
?^%l$L GuTd/hndByTh1w:e&FLH*nck:E?:chB6w&N9C:y^P9c&AYYu&qPDd4!P9Y%A&dQ&%1DdZ5jiN1D5Yj61
#wDPnn $P&pa&<dWQcuA#VwJ8ua&+K8X5jiFuTVhi^6A<48hakG*XRhi%9RVhP^6\ZhLn4&61Cd1YN9C:1=P9c&
CMG\uF wJ8ua&<L86%$:G$D69%yju9dkLI@%bkZJj9V@Qc&wF85a&<d5P%W<>9dBt\:XcGnS:Vw&N5GdD9X@Qc&
#bPeL^ wI91&N8Cd1tP9Y%A&dNP$1B4$:G*BX%C^>+YhQ9y&N5GqN%4KQ@/NNt>=4i*DTk:Xa*%GZp\/Jdp%?@q
PWPn4m IV4&61A:XMjiFuTH/hndk8=\a&>4kkpthMbRw8\*L55*4%Km@JFh4pG*%Mji\p5Z>:G*<NK%?hldiPpT
5V$Ipq Q9aYZn4!S>cwRWj?!MIchPTQ:I<chPTQdKEGHhtDLNKkI*8RJk$/5kh=RIPP:EEmGuSpD:JEk+:5Rbw%
dV%Qi* /MkiyEYDd1YX&>:CT*iwn:&Fq+:5RcIchGRQE6PkI*8R/#Vwn4S!&%6+/eki=FIN81N>:C&<hMj+&F6+
mMAdHD /enP+!ANP9Jdh4EGHjp68%&Dn9!S4hTkI#8QP#Zw!M:nDk$/<ph&u\ah&aQw!Et!B:qLk+:5RY:RwCN:
+wNL\T pEM%/Mki=DANP4IH8WtDn8\<d6TkI#8Q\#Zw!M:nCA$/<ph&yAah&aMeyWFH>mDHcNBhbPY&6@DTpV*I
8pk9B@ <Sy$q@naY*ny!B:pjk$/5ki=SwPP:EG8%cC:\5y6d?GqI*5RujH<Kl>:C!<h&Zuw$JGh^<pchLTQREj?
wXY*Hq pS>\Hj&F:EF8$/Ani^AhiZ1nn:&Fq+:5Rd:ZwL9b^>:CT$j&ID4nIP&HPF&Dn8^B:6Gkw*$Vb&4RpV*I
%LdKmp YSy$bA>!4\ah&Ztew$FHhl=*c>CSueh*GuRQ?6ldiPpi>4G*<NI>+tN9+cX:%Mji\p9*tI?>lbj8CT8*
pn&*mw 9aYZ:pp46:&Fq?+yH*5LL>&jji\69HS@<dG*<NI>/&N9+cZ:1=Zd*5JL>=!Q9aYZ:upji\59*V><:C&<
IcmkNd hK@+&F6+/X:%5dj\$4*8a&@lyZ9D^>:CT@hQH*5LL>%dQ9aYZ4y*jP\69HV9Y4u6Ld^$:@uaY*ny*9i^
P!i6d% 6@DTjiBnd?Gq?:iP9RZwcF@YM&S9aj>Q/4#wTk<h&aM<u&Q?%F9iq#:&Fq//4*D=Fa*!96Y^6!m^@bHq
q%=DGC 6Lj\$u*ua&@lyj9i^>:CT@iDn^&Fq?=HH#5KL>%QQuaWHn4d*1K4Bq&Jn^&Fq+:&HY?yRXjya$jlyi91
AlaEZY a$jlyc9!5cQ\$9Z%5cQ\$1*na$jlyi9ua$jlyi99a$jlyS9ka$jlyS9wa$jlyS95a$jlyS9ma$jlyS91
!1yciA a$jlyS9ta$jlyc9^5cQ\$w*\5cQ\$w*$5cQ\$w*!5cQ\$w*&5cQ\$1*ua$jlyX9j^+:CT:iBn^&Fq&=D
@hY4B6 H#5KL>$aH#5KL>%GQuaWZ41^QuaWZ4yNjP\w9HTd?hlSiPp&>:Gn<NJ6+YNH+cZd$5iP\p8*qa<hlbh8
dm=F9l c^<:Cm@hNn=&FF//eV=&FF//<V=&FF//:Z*5KL^$P@naWZnyh9T^w@DT:iSnS?Gqt?BnS?Gqt?lnS?Gq
>1t=>$ t?SnS?Gqt?ynS?Gqt?bnS?Gqt?%nS?Gq1@i^w@DT:iynS?GqY?BnS?GqC@uaWZnyGu*5KL^$aS<:Cm@h
&q*:b> Rl<:Cm@hIl<:Cm>hp+<hlbe8+tNH+cXd:GNH+cX4>4Gn<NK%?NlSiPqcji\w9HSSH#5KL>%TH#5KL%*C
G4+@H# ^+:CT>j8a$jlyX9la$jS+h>h1!^YXt5/KE*q5/K6ae59mL1/?n^ji<$jIPC68tBwhpQN%8N&!jXB>@/4
>\:w51 &:je/?ytV5yHN#P!IQpXi#^chy1/?yqVm%JPpd:BQu9TnJy<hHZ%<@Qi#&4=Lje<Z>T6t%>V8$u6tDG=
>K81Ch u!yb#yk^^TpuXKV:mSY4uFlS!kp9n^Zc>84L%wY%q@Nq/%mw1bB!Xu4K<Y6=:ZKK<IX58=!&<KJC/:p^
Tu9>Zd Gtw9Sn@X?WK&Vnq6Ve$L<6HXV=tcX@/$Jh1LWk/F5a*Sky/6*lul/5L^SVtG%QLXdaSdLTX+EZ4P4<ty
&cDj6@ PpF^Su%>:h11??DSm1L:=C/uTL4QG1&#=K!hD8w5ie5JFiq?a5W1J%cWeu=6uTZH@ZSab<qSVwh%qu#q
5M^j6^ FE%u!VNY%6hPdG9^y>t>hubi8WE$W@NInnXe><uJ$S*WjZ^/SuF$u@tS%m$&4%p?d86eI%^%l!RhCm1K
<mIa&5 yM6dV1lI>^M4Xnt^wyVVXFk>h%lC=Tmu\^I1Z#u^9P$FS9Rj+XW=aX<bSaYE&:n#YL>5#:HLca+5$NTR
AC55aH jFwi=WRZLQa4b@cC^ZuLtSHeL=m4E>8l#?1t1>dPQtFJZk%<jk$>tC>NdZNdY#HKtdE+9uA5WMl#>Xnd
A^5?%E hh/tSE6#kjXnq:Qa9#X$&558y&XlwXXWNB%1#?u%NeZk\#$n5cuFKGh%$/F5TSh1D94%Xy*u556bHI\Z
L+Cy=* Yn>eV5F<cJi#j!SY/Q$\#iSwKIee4?1A^J#5N<J%RGL/q1MnwjL%uDXeR9uY#&<kYZLi#+TPTSdj=>KS
-AqNH# 0005f155537001202b3 Page 336 of binaries1.zip
6mMTEn CD46*kGJMDtj^1dbA@*LMT84^b^hNC84c>I5yXqbLc\e5:J1Xqb@uhqF5:L/m+%\btY%eE:XCYbq6iB!
N!aYFY #M11YXp66B!#5tyYX6e5*ei54Bat/e#K/m1Xa%bY#e11YXqh%ZLM!1ybYT%El#I41@:q&JLP4K#tw#E4
MaYj9p 1&8TlDI41\Y$i\ep\1?!5q1m>1?Y=>?XdH?t1I5GZVt>R&uRhWHWVaPP9PFwiK8\BmMcwWE*BJGGq\J4
*tEaK9 KCINL\ZYMETnNimIu>jXwB8PcD$N8m$Sne@l6cuEp>kK$Zd=9V6byGZZchB6R/<DGuVn1A61$I%HNE8D
?q$$HL n4!W91dBL@VX&6e%/Mmd1aa*K+8<n&y+u:LIC?l:GuVp*XQDc=NF*n$%9Dbb=N%V\&8VSh+>Q>Tkw/?+
!d>jdC j1^BS%+:Q>YkI??bZ&nR$XhTNd^FYjV%W\$9WBb=mhV\5tVhS=e%/N:E=iEcjEXi/*VpC*tn$=Ed=BX8
jEP/#w R\$/<kw*SwPP9KS6y?H>DHJecHnVECTj@/XBS%>#&$ZD!^^=F=8V9=+FiSh4$KAn8V6F+@=I:8y+=^&B
G+$G6T TMi:=$lEP6+>%$Pp$Y=mE$TdchCS9N>Gk&+cIl$9nD5n$9G&Q^*SR^y$M*H=aA&/ZSFy<L*aA=hQ#n<P
&hRC?h mu%\Yei4LhR$eaaGHXSqwiQXq4\E/ZkXdeSqHY?%iB<TF&uR$XiQhL#Ft/<>bKe#Z*9IVti?>yCh#u#6
k%Fe+Y IV8h?hyDhn4#6aj5hPb4D>uy#Nei56Pb4#%py#Nji<lPb::&pJ*PjP$lP=*=&pN&P9P%l?^$=t5Q&iuM
L#H>ku %^/!$=t9QYTuM%>:!E=Za::&pJZPjP$lP=*=&pN&P9P%l?^$=t5Q&iuM%^/!$=t9QYTuK@dZH9aH*iL<
ey4WP< i45<AJeQ$Tn9IJTu5j+lD\ch^91HQAS$ihe%VDDBBBM/Hw=hcXtn4Jc&SJy%<X*:Yqa9!p<#ki:*1tYX
/D#6LZ WZ=4cu+q#SP9n@^Ic9+#KGh>Ln@\d#j@?@QJFFTX:<*j?BPW^iX:<<9yQY:VYD!<$Cy@e4:qjB?tC@Rd
hi\j/p c=VKj+nYpHlm1A6bA9hT?X5ec>HubqR?4SPj19JQjhX!dFp1<Q=5#XD=P$K*6$w=u$!*6%d=RdI%KPN<
ca1tCH Yli5X9q>n:GWjT:qZ$d#5!4@FF4#/ML%R?6CjXV?dX>b!9+YaS*c>:Y!JhHYdHt@iTM8i>K!N4!1JSFL
*Nb*H4 #ditwE+CL:Wpt1Py?bZ9+NAD>JHW@NLld4*>NM6Th44$GL8/>Vd!L=c!!/Z<h4jiQ6:HWuc+qH?$Y&@d
ZLA%&b :Y+y8%8E!dX89b*b#XJ&6yS@wq5Qj@<PGTQ+@tp>iy#Kd<e:1DYT<=>\/*MR%iWw#u@J4deZ:$J/NNjd
q@AJIA >==/e!eDA!@$6c\^Mc+*#!Vl>H6^<S>ed=:<!m<>>idJq^i:>Za*dRHequ@kidjiQ1Y%?9Ge@:Xdd?*E
V+9Juw Q>9^CF:8%65A9H6a&*Q?PY/>dWG@8\Qu9?9Y##&ZIL&n!y@\yF5@\j8R*wu#Z*d4?S^1p\p1j?Lj*Zy:
Nq=ec$ :mHK+Q=Lhkk%ZG?85lQ+<WlQ9ZtWwAMQ<NTdJ:?4>NTdJ%?5:>ddw4iRMa@4e*i**wa@n9S8uH?kY&<9
6HA=Pm W6*PX@p:#uD4:SG!qh8h<%>*/&*TB$n9wjJ*Y6j6y/>S*y=e@pq89jWlY>njMj*9*Zw:t?4+>%!ji:9%
t%59c* 6n?6bi#F>Zc*y>=eydNp=d8ij8ySSk?:\>NQQjqhi*u1#e$Zj+%bX4h4Y^KL$8Sl%^H$@6aTc+8p=I9?
\D1?h4 pJ?XE?yu6mY5<1&yV!%XF/yu8ZLaT:@F=@m=!jnh6qR=e@J/!N?h<%*?F&eM>PT::T9PmZ9K<V^ZNhqV
9t$ymy DFV%N9M^yJe4?neQJ^Fm=*ebT9J\lcJ9?kE!yW4Sd$B%yDb=mJ>A9>XlK9?L:5k=kM8u>h=!qj@>F5Ta
kC/NK< K4<d4Zj&=@LyN\@mjG1:TyXjViWj#Qt9$EGX<#d^%CE19!jiB$Yb!6@/Nui6wB9^&Qa1@*RcI\=X?h%H
c8pYhj 88ZMJ>98\%S?L*wji%Zq*$^n/8FM9^pP@L^VcY9REb^Q@Z/B!4?R&86I#4@R+eM8I@?H>FGej+9#ZPXd
*NK!j> $>4&$T1@D?*HiXVqH@\C$5iw@KG*E:N\@!Jbh/#K:%8J\%W1j<YQ6QdI?YRHQqdqZ$?&Pei4@GHQ$9!b
m4*F*X !9?YdQNP+Q8=#&u*!1y%pD=Shd56T=%&4*mJ/8ApSb<wh>1>alm6Rb?5/B6A9>X+qj<knSiuKQ4l4#46
JqdBpT Z6FKjjAQjJ>9Pi%i<RA>//q<Q*>*/1jmlW?SQw*y@?8$X?W/NBcj49JH9P&$i<Y&%C=u1Q\l4#46ZuEk
8*qXBL !b\#ih#b$TtuIpb6jydK**buy>$4XyL<Pb9yb#46Z4GEdIQQ+Zbb^&u*!wFWu?e!@V6P8%ie6lHT=*H?
@awHZ! :5=#XR/t@uY?!6@tE/jhK?+pG=W@19#6Snn6Z4Ej!d$LXQ:&+=%&4@mJiQlCqV@!A/jhK$/u@W<Z1j\>
hbH&X% N*Lc9YJdK9>m99@qd49*yD%Cq/l&QPec6>*j?5JT?#IR4q9y698e*ydcl\H/P$G@%hM1@&dT6T:u?*#H
1+\bSk djjtn!!%#+KGpL=88:>L?5cXLJ@*h>6>&$e66h?C<1>&&?545qH+E+?QH:96@nLJkK6X@ylY6>$@JB*p
PnwyVw Gu:im>^!H1E>>6i1@DpH88*?QPpJ%*E=X:96jnHJ!85=@*c**T8J@kcX9%F@6>&9@J8q>t*R:=:1Q6jt
15hBL\ yD9eyQJ4k&/:H$c<edQKu:8d&?:9pa=$m<1j%?1&i#*J^q6b*>:ddjh:mM>9W@uBT>^&9+h$nh8b@u/u
iX4N/b *T8PI%/:R?pQ\#*69q$jT?$VRjl1Z:jh4!W?9$9SV:nG:i>@Jdq$6/Lj/\!u*T6:Ej@jw@LH*im&?<e@
FJi\9\ I*$9=#@y%5@nyG9e^@p98P*%D=Ib>/9<$QXP8%hK/4<QMQ%dd45j9CHTD*K@H8!Y<*?p4#/p<l69hh1>
h\anNQ ekPTaR?4@B$?hN8>qun&EbY@>@qP8%hMy#y:qPt@>9S*p9?Q5b=V+V:ZR14L^*ue*Mb6>>6Iln!l<yh&
X?Ltq? h>6>d^4ju%V=<jZeh6?E*n8i+9J:8?%?\Xmpu%d=S=*5695!+4Xu9G>#4PiWy4>F5n:k!c@i#/M9ijL*
mZu?5Y 9hPn@&Ry^>cZQQpVLuQ+4Y\Q155@K#%lNPS6mhI#!!cTq+T@1Q\Nqn9<X9w9+wXuFd@hCn+c51im::I^
*4u69c e9:KJkEQP@^Y?m@m6ihW@1R9HH+4c!Zh/ut?u@8hhmq>5!jTL*B@4HD+yK\Q/da919^dVuD+4Y^V$qFj
Jdmaa$ W9u:DHD+4Y^Z?6?Z8b^?dnudWS9>VV*ZJpe+@Fb/LPpMj?j*4NEP9=ZX$n9eQ%V?\yMejm6dT8qZXQ=8
h*nj1y e^%?K=6Q#@W1@?=w>:t?yH6+ViWj?yVDd&Z&=PQ4K9?:bwjj!paS#S51@+AZHZ+4t$D%<E>8><Mejm9>
h/<tP$ u5ceN>X#ddc*\&?qL=Ku!:i+*%HjH\\>NydKD$H1t!N5i9Ec<iddZA?pZ@XR?c>$6i#>alTP8eB=n^C#
A#ARiI /F:iXjt*u81<S+m#/LjiW@t@H?iWL?6wI@t@YP=h:=d@DMu6>=q?V/h<Pa41?RQP@<R6@^ZTJXpZ*@kE
jVu:mY 6@!B>A:?Ie9@nb#!bT@/*a>W@l:u88XjSP@RH/9<Zie/=e8qyNN>w9LZ?<+6@##cP@Ty!q>@pH9@V%Qd
%Gm1q4 j5d=a>#!8%Cj@D@P9<<6j!ViHc#Q8S&jhM8@+Cip9&D=>yN:@@&wQ*/y<9j9:ba@n&VhX=^@8X9?RL4*
kG5la5 @&TSM&W==I!dL$:@!CNuQQquXH4pVFpPPiQJQ*cPI&i1nmGi?%1XM?EaS<=WV/R^@S8XQ@qPS<=WlWqH
GHA96u ?Fc>D$:h^JE#%hVh4j<1?ltQPuKtiuw%hTD%8:i%PuKt/k!T=>?#jAk:@dF/K8u&Q#D>Wa=<1N/WhJu@
Caw4i! 1jJuj?:ItiwN1a\j?d*9XpjPXFjViQ$V#:<h+ba#uun?b$Xj@+$nb/yi@MF>Xa!:+%yXM@X>ZyGa<=\n
6S=?#X b/yPK:YTlqqmq&eePXQ%*G&Y5:B!&HZPe%WhlZhlZ5ASDb5:e1c1lY^ATnu@G$jPXH%LNu/1#eT<dw/e
n<X4PA 1jyl9tZ91:S@>$%H#qRhk*wYZbn?hpjPXP$Q?TuW@J8a@:DD#%ZZd+iMT5=@#?Hu/t%upY$T=@@H+ii1
j?+qb< c&m8w$4q:*/W\<@X&>KeVDZ#Xe#tR!ZH59F#5#6*tMHudu=k?AEiQ9jtu?jl<@IejP:tm>&je@m<i8!t
X\ZZB8 !Pmt<yhj+@L=CBy4819<A%>#?j^q9J9TjqQm<>C^Ly@VP:*w!iX@=QB=%Rhp5>hL=i@ln1jXw@APIuw#
a<@qy? H:4/djWP$EFEH$Y@y#8iX8&Dh%Qc9$4=l**k<9pki4hhl?u:8Z^iAhpm?uF?k<9uw&p86L@KQ@^Vq<?Z
kXtJFm Ed<NaQ1k!?jQ+4%XDFV=S#:l<9q4%C<GMZ&L\?jX/^?MnME1j&c%?%^%$DiEtueXS&*k<9tJiEa^qQM@
jljjGj hjm<ilVb=Ky=X*FM1e9uZ=FNaA*uZ?j!?ie9Yt1jLiY@=9L=TYR:y8bh^ZEjPH^i9hW6q6yHm?n+CyjQ
qQeJj\ J=FN&mnPH?D\ijWt%I/nPj<cl<?4j5BaINdqei%%D=>:?HAh/l?d&@SVB&>41Z&=XG<uaqm9X@u6G/y=
R1>95R R=8i=G8JuV@qH4I=*pDqd%D8#I6Pdh?A>t=#@p:P@N:WA+pQ&e6eMPd?:8ZR<eXG/u*#>N?=9>5h@!5&
Kt:1Pm =9i5<=*judw:&W1PbZ%yHih*y*^@k/Z&C>N+9d*:8>GiNPjJi6Rt#8>P?aLcc#Q%9K$Z8:@dA#1P&J^@
y?I94$ >*4*h+jVu6E6?D%wc@h=h/D&*bL#Y>*j*Rw/kL$9tjVT8Q8<R@DPLbS*N>F+q98:T/G4mt*+h&>&j*e:
FP&GnG /Q^mHI@9H:t@i#9JAb:**tii?:8:R+eTc6+:MGTmP%@hi#L6kij<Fi/</!*EQ>6#@qE8@X&$h*kH#4@j
YdhRLL yd<Z:$%mS<=@^1E9?!6pmFD#*wGlAbj?KFy#+Zu9ScNJ=mn/8<=EY5%:m#d<d<uhm4/KdE:a8*H<c=j?
?YttRK dPwZ!k?S@H!iT>>j$IDQ:V:Vyj?e/t&KKu?jN^#/5u9wh>p@#n+^q@/%q!!%Q^^S=AP*@EE*YYw@PJ:4
D+Mi1> 6IBDZ:+h&elQb#p@%Yuj<mC6le%R?cj*hh1*:I\=NAC1@HQC:9$<iw>q:\?u@A8G8jj#?k#/9IjK9*A#
\cyL\W 6@^!tk8h^jply@#!Kuy*u1*!L:9FLj<:tp6S4k\Dj&y^:*>:+5>hXj:Xl#nqq:%#GCpPuH?VY*+b!hWG
bK<CB9 qZ?neP6u<X*Iu<9#i/VZB%9c$6i=i6S/<n*4PD$8<?S:%mq/qu4!QjQ\I%+u?$V%Z4<N#cGy>R8^Qec>
Plp^*R kL4@!yjJ^yjZL@a/\J$H/$=nE/>jSM9he5Lu$eDI?69ydnt:$4nD/^i:Z8DP1*^K?lY9Z&\\$!&uDuW5
K86i!G iQ%m6!c*uL6Jd9D/^bm=:9&eVVdBi@F+%M<6=^dwIYJ9q8hj8?YeTuPa?:D<uPtY$=@G1Z$X@TWQ88X5
uwX%<Z muhwwX^d!c?:8?Y5D%1l@FtK$!=$!#pSjX<w4$u!9^Qhep:h^dL*/XQ?>>Qhem/q?k>#PZi==i\EGT?W
jPT8nk 8#:=+\F8PYNwD=j/YwL<?ZC*uBD^aSPZ</Jd#y%pR^#l@E@6<T9auLdi9T9NX>#cEm#eW/WV@l>RT\ME
Z^6DLS FAACAAkAiXX6Ji#@XJ#!SRAAAP\AAC\AAABndGqqduS#L*BueC>6aYM9WEhRc&X=e!>#etM9WEhRT&X=
-AyQ*+ 000f0e317f4001202b3 Page 337 of binaries1.zip
Mj?n!1 e!=\eG>mLtJyd4Sei&\e^*tj=WPpKJKmdFq?K/PZJc5pVXEQ&1ym<*TpH1bIuZm$Jh6^:Z$M:>de&#*9
bBtmkZ :9FlIcp6YDFTF*+kSwDETG5WN8Ac5h!mRPMmAh1+dYAuTJyKTN&kVh<^k1aF*D@cwm+c>96tb*hu>?=Y
<:&Mm6 FCYj9NLh:5^9b4:=*9P6TZjlcGGCLZtD%c1npT9@8J/4V=:PD!8y?:@ai8HYV=:=@j>a?MMtHb>=y9N4
4*MtE% ?C>&@K5QCjp^ZB5uL1#:%<w6iehky%ZZNS&ZHl<dy*5GD>AH1wd1M*J4*4E>*/*y98QP5E1XD8#bP*VQ
9CmyVd @yH>\@8GHh*&Y1IJEdIMu@y^eX4lFP5i6yGYH:=*wY@d6#ii#lXu^8pa1#l$X@:IJJ%X@V94&9+L8dCl
IlnF@c :/<*FQ*c:P^^u++9XqZdaP=dDZAJcdt\+eqN/\9PAuPL#J%u:pClpIj:t!81ce?ddAEdhp:Cn\jll$#Q
@+kWQe HSZj$5IY/:HFnKyb:IT1Me8VG&/h6I8/y:5Y@8nGlpZhhT!L8ZK4Nb#tiA&Vd9l:udmQ**9k/5XSBQH/
/M:Lk8 aP/VeE&J*:jChRh=PwVC8<4G9y#t%H\KuDTHuDR+GD:?CnpZ6@#95&*nl8t*QYAdDupaJnCA>%9#Nb?e
+SMCP= kSH!VuYJAD*cC/wHG@$kjM6dVHZJ+dByX=FbVQhy#4JID1cdl=YyXa@^G+@A<+D?@Pinacjik56tte65
X:dn@H ujGb#RVV&hCIJhM*PhF8JG9qi<9Lc++!t<&49D$<Y9=q5u%j*Qd99wq@+M66bDhyW::V5wX$l5</BLXI
C\=t?5 PIaC>FZ1^\ki@dLbw&naBw?c>%L+u!c>Gp=DY6XQ?Rebq/@1eYWi&X9lw6aJ1wRi6&eh<t=ZNENqyaCN
+<Pk\H :t$m8?D?D=VZmMVC9>jFl<eu4!wnyD&<*=p#DD1qXll=5/9yyKGZampjphd\&h1Ijai\%@cK:Y6qZ?Zc
hMFNab 5DiQWuVMbC+ZPXtMd8ACI=G@dZDK1eK*RcI+&lMGjKQ#Xb?6#RNSiG?+A%5?E&LDl>uGIKhVX:M>/TY6
hk^AEQ &5pJ15H56L!LEC%<$QQSIJ@BRV4#BXQ*c:\Bj19CSTdkD!EcK*tmcd@LQG9>+d6P$<L^@A!hbl:wX\/u
XjEN4? FAyC@jjlJQC^/DPIjVd5G>BM@\y/*aY>466#aFZhl1>$NG4c@u\uNEY>ckT:EnYteF*4h4B9u6m:Sp\Y
IJ>Sw@ mh?!?MV:&WLI1ntVew/@1BSmYXlZaK:u&KyqQ5YG8nJq/HZqJXtGiG9k4mh4yt@Z=tC6uEEd>h@Nb*c@
T^@ubI <u+5cVikwPPmZNW*Hb8iNy>TZcM5MLYySX@L1:bYePi=u8!1%/56R8X&Shawi6SFY4T^ap/dL8cml5*y
lNnite FmlZQ%C8kSycW\VDwbjJ4m=yM&IFQkpE$=%\19P8BwdD!4u8CkaLqM:HLj6mW1\6tmYdwk@Fl\Q41lhP
4lCujl Dc>k!4ew*=YtjNS%cqW9tHKnQ5Ht@=H!hn^!F>yV!n5GC1<L^&#:RD#iVe=Lh9y@Y!cKQYMPPl5$<D>R
b5j*^@ P\SGpkT$AD%D^^#dl=*V^VdA4WX\^b4McT8j$<9KY#Fn>WB4&:SLaIYb/\?JYYtHc$9cCh@NbQ%*Y<4N
Pju<GG YF@=i>JmPFZ4/NmJw$JG6=eM1/V$w+KDc=TMl4IY>D<Lu5#bZpu*nZn?wk@*%m9nbEnlH:k:^ihHGn8L
hkJZ\= m1RTJ15%4+!R=A&!WRqb>tY+J8L84ieV*eEa*JDVhXd%/YHXwPDaiNY!1*w5BL%ZkQcAQ^PBK9iuRJ>N
wiwq84 k/:BDYJYcAD8AX$QH6@bQ8ASG8*EneKdp%b&6n6CReiV6KeANq\YwCed+L4LA9TtACSF8kpbG^9\4i9n
bpP!C@ <$HI1&C>%8/Adiauny+YW#$W?6HKAjJJ%Qie:NDCQ#il5bTw*lheEn56B?\EPQ%pu^LmwGki!YCuF>:Q
@dcMLi WZABcFW%ZcyDKGN/9pihYc4Tm>Ycbyp/Q4=E$a*FY/+=D%EQ*l8<SGjKnMcN1Fh&cybBNWbL=n!#1i>R
HLX&9A BqK>=NmMLnp%Pte:C*RZCBA61^:EL:yytd+J=lRcAmjC!GDt1F<&9V5HA?^+NAq<D6qZ%V#H19uMkmhM
$%ak!+ h=p@KMn\p/bpiC/LDL>#jBdu?GPDY8aew^ZHbVCbYei6BPaE@q5w1#B8VC*V+%Ry\/J\VR8PP?j%W!<I
:J=/Ak CT:m4YQM1q/m5/=VkXW^@yNYtF$d:Pp=CVjeBhNn@XRH?5*^BqN5$chc#jhlNImpABkwA=9mt*cNlR6<
M<b5Sj 4?pC&:MY?Q^^YIRL5TCFShE1A!bpCI@M#ueH!AniG5#Q<>RTk=Zk#WwNN1WWYFWtLS=Y<JBVe&NmLJmY
Q@lN=m SXZLe*CHcl+#PDdcIeM5td=1WeQSc:B+*^95mYY5>chCH1b!8Y55D&*k%Jcp*$>JhL6q=ZVLu<b66<GF
PR:*!@ =:9N\F#BRk$D@EJQap4kZ$e*kWkGpMI9e!=G/mB^:lM#!IW#AIu5Te#knw\b9Nl%yAc$^TDmwAD/XRbA
&w?Gy5 QKyaJnetkQa*BiwnL^D!lT&6MkSEEqahlLbTmQFwPc?tqqQMYp:9PChlLmBl8KTjNiZ1#&j6#wWy^&eH
58SnL* ce=PdR\R*&a/54K:^Buie&ADWTcDh8BP5=L\FGibmuEKX$Mw^FT6?R/K9c=c%6IkHbiStd#ywCbSdFFL
KV\566 $I5kLm/!!TkPbVp/B:<$TI@A/G^S4aC<la6>NKLeTdI#Ym!!<Di#Fu6H45JetBW>cX8t#R:&=J$K&G6$
=u?iVj uR:Tu8P\JNhtjnnIRnVID/SBnM5NMu1@W:dHHLd@uqHX5Rb%y>I#etD@94&D\*8G>w#1$an<!SQR%uDa
!YXQ4t 1CuGHwSLCLeR<Jc9pldbQ!LQ\:h@19iQiEmJDuw55I>ELHEV?GLlA4w8I:Bpi<Fm+NGAmw9mEFSqcN&1
Te?L#A T:lq\AYSIEW$&p!/E$N5#lnmjB9KuwDII+RPP$EiVpFMbEF$u*SL1k$^CuJJA<%*LmEDyBtW<Q1WVM*H
#D5C!e bb*BuP5$*$CG4MQu=1T/aLDKPwmHL\5SMwTAPwk8Jt=*/GJ!8Q?E/#i#ZM!Yp^PK:KRm5!RR*pwluG@m
CIbwJ* yE1le69jlN=a<cqQ&j4<tq@TF8iQ8qWkwJ$k+PPZ*>8/#&9pjA@G8\W$9WZkeGtpR&/yPm<$cV\T8YI8
ELt5nQ 85<%NJCNX6#m>SHPiuGFXJa^YlTZ9Nk=e8B81yq?CDMc\LVX\&!Lah1p6FWA5*dQ$QC?Bnl4/uFGay\%
Ni4C\S hhNb8&j@*kMNeD1VPC<uq>Xbn#M<6K@S8444ecS%hhjn:B$cGbb^:pWeLX@#TD/%4khDHQ+$lhMB><BK
QE^e:n HbRE/:=AS1H6L5tpw!&i#nLyddk!CQ+X&W9Sy?$ThI$u>P6\ue/!G%&:aPMH>k*he?BPcW+jTta>6*Ku
:/^SSH /#Z8hHtw8mMQ$*C+S\w?e^p6himW*ph#+IhV6&cBK&&ydwq^4^V88eKND^#djuT51YjlcRh+4&mXK\++
J5yCND 6&1%C9+*X<Qk<!LZDaSdHiNkTk1Ac4P#yt/CD^9/+m>!YwEQkt1S!M8:qLY<M+HZkuNAk/1C45BRcCq\
%?TVIy Hbu1Ymc5ApIuD&eqdFa@uT:t+mqbb5Z$A#e:a5*ByP%69V6Wd?PL%%m>QTcy5$PJjZXZy<=/Wb&NL%dN
VCPbL9 \Cq4w5<PZaW?P<RFdY4ilWA\KYl>Kb!EIt1j\lk&VNq\DJkt>E6mdG<!F+=BJIpaAS=%iY/9S=JTNHhd
1mZLQ! Rkn?6E&e!mAptkne!NLa?BEB5$NZ1#+d1:u\<LwIbt6T@d\Rn/65q!SSZdpp@n8EiXSZdbAmQ*CnSFDD
bD/APy k*dbWRauF*aQI1Fb<AXBIuZt?ync\%NTELnVbYbHAKK6CDJ=:Gk:%HJ5qF/My4RkPGY&:m=l6A?SF\cV
5aKp=B k=RiA\GGDSHl1R4l9+@hDSc*lMjt:BIG&YD9SY!LV+JSPZ<F*YFh68NV9c#C\NV$B/Zp#<?F:B^q>nYY
cWGVYb ud84G5>jEtW4/W%+nDe*bikCNlj>n$k:&dQ!uX\jJ5j6Et:BB=KQ@kjlY1jH49FcZ=jt8uQqe/%E!RyJ
u<9W1C $\NQ&Y\B=>+jlHM8dLbVkXm8Cy1hS*#MaAd5?\^!DuKl*KKjXwQAAA^JELXbaA!AGtE\+EjB\F>IQ8:6
mw!6Gd eP*Nt86u*/CV#4!IMTwPSEhmYG8y=\$/5%TNJ5y%6&Q#$iG:=1m8EWcE1E<Fudaq/GT9Vy>&V\hnH5iq
$lV>hF y=qQK:kq<yHEjJ5dcEETSa#IjCR4aqLYb9SHIn*Z6thwcEiat+$kNpwSW@6qIL:WM4RnFXw?Hy1*!iq4
#J!ZWS !:dKYwq6C!6u&+5#tQYS+p\/^4\=*/uTI9wkcPE^</p^WIY/a<?cJZBMDJ/jAP&WM\\VhbN1RVi8#VA:
6at:nV AZaSPS1BK$\Fd<BH%+nuXj$!!4LRpaE4IFmLc#j$EuTZBSKj!M@XhYp?6CD51YnQ*yhmeTVG=:J!Qde$
=$%Y8h BR/FdwidX/9/=QTE5wN5TABZJD5tGyipdhtecQ#F4G$bt5qcatkFkC/BIVApM>DTKuk5::nZtMe?5#wi
YDe#EW ?*tP\q!1D6iIiNCH8+9LmDpL>^#&Xq5KhFLP1Jm&/juR\*E=L!X=yBVdBe+qWkI*ciB=PleN4P>mYlkb
p*w$QA y?FW\Ey#jlW<l*q5HM9u9Phlpyu#5EnKaMwNQN&h5Y5:4%1tEZLibMS=*:kT#69WeGbJ4wMttX\Z5+F!
KZIYL> ?/h&dQP6%cZ#u<&D5\VL1%qB/LKFk1P&E<#RE*LGH5>5WA$q$@cl\:Wk8%4<HAA*%&W/M?hb?n\k<5Gp
qmDQ^K SL/WTdt*5b#MH!/W4=JA1pTknT5u$G=?QqGNVnln?ZDbE$#uA5J$FVk>bI4HyaF8T\#$=c!B:5##<=8C
TI1cM= !?bN5Q/B&^1+\Pm8^DPIhCucit*!XA*<9+GE@@ja1t^>kqy#QCI6uN1nZJ<Tq$^1:Z9ni/kYu1!yQA+F
l>q86X H!E+?1p\<J^=Aq6u1BKkDV:nl%MHbbiCX^m<I:pWI^u?4HAyyKlI$PREA=4et1DJ9XhQp\Ku!iTJQiSL
DL>k9! W6S&Yb4e@Md*SCwbjV1Xwlc6%Cyk&yP&/<R\8W&m>R8m8nJq8\/LTi\q^/VGd%>8E89AJ4p15K5dmF8C
Rhbi>N Z1AD/8l%?>ZVc#bIcSi8pIj8CumIP#dl5culkPbA/\1@>VLuH<e%T!ca+XT!A56W8F@K9!$YdWNW!4R$
^auB:i 4l1<n4SlTy8NX%R\+Lw#y!=Jh@NPJV^SEHjB@nQ\^1T&ZcRFt@JDMNLiEYy+LK9/XFQB:/$8Juw?WGnT
@8tT4N pVma&K44?EKbLRGLT51GH8e^pXpBK?m46l@bZL+hC!+t6A^uIVl9q#ymdAYlMA?tQGG#RRmY<K9LK1!m
?@b+5? MVjWbA>F69q*W+J%V>bK61bX5*TM/qMWPX<YGuFm&4&!4Dpi41!LC%6CJZX@lQV=FNJ9bTFhH!QSW+F!
ZjY4%B DBEQ/&X6ejGacbAHJTu=Y\#tRpV?XM+uQRq#k*5M\$J\TYRFY6WKy^IKFBu6/!8K!ecm6d&eY68*5>dY
PC5Z^w p=epNVwSK^VaLINXA*Q?TkLLCdH\/jI@6KK$aGMuPBhiXq5VEKmd$lDjn!DkKWCIDpe>AjF+jIjuwE@6
u8>WL< \h%K=FZj#qyS*/SR$ct6EkTi=kSPTQI*XpSkwilNP/Hw*$HpipWjyYjIqCRWQ:!eWK!QFV%QlAp$I$L:
+N=XEp 4=TIHe6CG?DiYmBYYECCmVnd5RhW1%yYNRaiQW$bFppVd!ah\eqPG\tPXDy=LV+iR:DkKGIVcWjiSy=F
<PLNtu d5D6=PRq4Y6V^:*QNV:8^eI?QI/V+1G6pX4eT$cnqW:Xq&\q>@\ZaVnD>X9p=MWiMGk*DJaqVTnSSpN@
-AhTWu 00066262e33001202b3 Page 338 of binaries1.zip
MA9B/k Sy?Db4W1BVyB!EMN$=5LckdWYibDNHQC<VB?mJKZRE9STkjFWEd@!F9!jFaBBcuXVC5wAeFm\dI/n#%X
LMHuMA QkmM\B%9q>p<5!Zt#T84MIPy?1wWtY6mShmplpXFuli1*i&tdqhF=T>XtlT*mdc9TFVhHdYhlP8BLKw?
i8\Ab^ GqmQ5qp1R?AHIaFV1iC$nhmMmCXFXLGDemZ\p=llwy8EFW:aZKS>ib&uAia4ewV#iI/LuED5&LNZdlDy
uWh/np <Kau\i8KKwRul@u\aW=$DKG\WqTGIq?VwjnVFFR**N#yC/^EDTT9PC%IYIhT$%4B<ZJLNTWM9\Gm%EAa
D:P6pj $B@SE<JRj*\e1aGQ45CFQd>VPLBBRMK*AYMTZ5$pXdeh4C6RimA%!4cMWb/6L%Acd\y$MA8weYqRQm^j
9bD=L/ IP?VVSHa=?RmDj+$ic==4lMLYima\<lwXMa\\cFkqD1w1HCKQ$%B>V&BST:<1M=i\5IZ<uRE!dpFh\<+
+<<Jn6 JPcYX?E/5^J8pa5m8F<1w@^nC1XlWWR1Kdw^^ZNjd1!A\!J:mejimXVFDyJj5RItm>!d\\#WESP$FJkd
P#I#p# XK\mw#d4%GBcqAw?FP>LLTX:CH$/!>?KAkhR%E:%m$\YuRKYnX4*w:w>BdMQ6eklJB$8S!chMmL:mQ^y
WSkGyq muS6mBG1n*HERHIRW!L@5I#Bu/a\ilI#C@j!PIL^q^jPTYB9!tDm%aaE&AbBuAn9A=I5b5:Y>/tN!cYK
1/+RJD tbY*k@nGmDNaAZ><ydFPmq/apA=RihpN*CeVehtNww9$Q=<GF4DYESy9%yj8VElF/%$!^k1pbeSnXW+R
:#$jm$ =RJynR1AWL$5N+%?Z+4h8XE?CZ\VSF=I4#\J#PcpJ>EbyulCuGq<4\qj?mGL=PPXKiW+CP?+&QGnn4@5
W5dVF% 8NS^TZ+wdhm=qCB@9ZulHC<TmVi145J1bWZ<WwZX$<qZE!SXpQq1\uG8CwI585hQnaWc<MBmG#\6#ETB
qE/q/# NHkT\Pk8ipi#ZAqk+ljE*Sl\dG5y=ipEL^I$=9!#*YGE^?M^jDZpBeqJ9%Eeuna?t+h+:Q4ABXlRZb6m
Q>FSNM nY<J*BSyF:aph?HYM$%&+aV9yucBe$ei&KQqnQJT>H4HC85Y8y<P@<kQE@^:8LaWCSF&?t&+w8\%j=4t
YJN\&e Z:lHy=!FLTHPb#pP9kRn+@^QAmh+STcB$*+CqLK4TDdu9ST4k9Z4%Fdq=&nSPclNHwlwq1u155>BN@CZ
9q:lGI pjkdwMLbpW9eInjqnBS+>@KV!R\*yVQqwD\5Ha:F*w/hWSZC#$T*!bZBFGPAAe>Zb&hqS$M8Mt$+$d8#
hjky4C J61NCT@Z4CaCjP+C\R4I^=J%Ktii99blGHejVScDAuah^MlqIcRebtQQCd5?idYiE/m6JMwKQKjkhb?&
iSKR/R :+e9!I6qhQH*%8D96n?G/$@k?k=e:<H%y*D>GX^@D6h*SceQiYD?nCVp@>!G^4!9mMe4^VJ1Pj#N*+kL
S>a\>V ZuX4#%8P^:C+L9nNHSN!KkB+MVnbDLD?d:pNZ<V9jBDQ^$!jC*n:DJ:F<Z=aB<yj*PP9QQM*XH9!@Q#Z
*4qC+X AV<a@%<FYK5W%%lF>%y#a>\\4JQaJb=j^+#nYKJmyhu4k<GLldiRNTw5Wb88#G9AaN^>KFa6hdwI9KH<
$^pA4A KKWpZq=%MKSHn84?K<lQu?>QBEN1EAXluI?SPIbFHt=Q&dEkPk?q=XDVRPdPLMF4q+PlPn:uPD@BLQ:X
KBna&> <Dt@Nk8#9BKnH5hSu$nB#!P!t51Pw:+R%*ILpipq4YFCZZS6^B*d?b6^4!kLeT*:iu\99lnV?$*^um/L
n?9$eM ?Idu@=8mKde14+RqewDGyR9bupQ!%%:d*\$e*8KE=!Z+:16kZS5aJ^\^=jCt?T:PS8hTH5c/LGbaF+9>
$M6\jJ Rju+SqVP^NX:YE1@hlXt:9Zp<e%IWJT1XyRYNBdCmLcFa64MHMuHeje&ZYqtI1AnIH@hK5q61XX88Xc4
#a#Z>> lAHJDc6h=YQSLn^EllP4QL#KI6byXuF<Fma\yNtiDK&8Mm4JZne@t<w\tS9=?#ck4kdq=MN!\w!ipXb^
=iHWFa LLGK5/6dSeeW<:EwR=y?a*:aqnq>#k??/6ec<MPm^A?#Yc:HFjPD4+LhZ!W@^Ft4GYtXjiEBZ>P5Xc+G
IVB#YD F5VGKlpIc?wZ?&?y^i/?Xw8FeeuQ4um^cR>Mn5a=#Ljk8ukFqwtueduCNmRQ:QwWTwM$d8RTiWyn8+I1
NA4Sqn W^#YNu>J@!dqb8q@jaB&yXB&jPjN+C&8D8*@&@5T/Lm8K5FZJct$&+=6\yLEKWJYS/+5bCHGJJEqP^c&
<4t$dd FWYTuTcpE:/191TKT%YX@$8TSbMl<S1dBAmELHAIDA%$kGccJaSAFwdyBkIhCDmEyk>M5$%kt1cBPZTV
BdYjqA Z1dJ*P&>@>/9VZIelnqu:QQ6Z?@@j?>d:u99d8>i+JbCaJJ&+:Yy/E&MiCF1JEVCy+AL@9#E1D<HX:$h
MJT=bT nEMhQKb?c+W/RN*Q&P#ELu?Bw4?$@Cu9N<NR=8\*l&wLR#WP9MZ*t$mP6^tH>>D<YiyJKS9CnlmEbkN<
Tl@8/k 8bpZG&Ji:+&$Aj5/cWMGyuT>e$BqI*C*b%1L+JWN?VbkRQmATq5/WhMFjk\E%BG%!wAdeR@9:ct^h!>*
Eq8*PZ HCbPcd^*X:!kRy#!i68B*$P$6kQ@B^THwmJI>DV8\K>QNby%+am%/ZR%Ey+cL>hhhW=N/NMPG/#qy/8G
eP\9^p cL8a$\+4LBk:GwnHjN1l=nklGH8e<m/aQW:9+56&:?KThJ#yZZ\c:%%4XX5YiLpyqhS^XK1Nt*41ITum
Q*^CHR WPp*CdD1?L\\n8ZCXtem*/$TQWH%SC/Ymn=iX8j*Y^MtE6h%JLP/ApwZwM^ZdD@FmE<<#l1B%#dmPI?C
P>*EVd V%V@ct$mcH=4cdmJ&L1=@NnYIcCPcLh55jik:mi5aaqe*Li4b=^PPjWwZh\6?eHt6h=q^MPLLD@?4ta8
^cYu1N /6iNq@CR6!$Flu*yZPBNwaCaq%Nq=DBN91*FZGtinBEe9\E*ukyD<NBkG^knMEXNMM=@<PG$XM+>%L^8
APMhp& /d&R8Mwh$ek=@$#4bEm1CX9kHGh?nRF^hkRm$hEMSI4*eY8+6*llNknHBpclwRYuwc?^ANXytEbTGN9T
>%=*G& n?*D?Rnn5p$9d4BS#8G#^Gu1BpP=BqdnVw^:$XYJaX*m&*F5GFK@eQSmYE$Bmk#p^/=?a>NHL$DJXkk!
6EmGFt tLXaJ%=y8?uR$/lPYZ54bP=phGbP4Rj8SFuh@!Ynj<cuLui!Q+XT%y^j:j$$dM$wXMl>9cH*$*kJw=I5
GS>pTH RtKqD9@4=>@l4/IPH%>1l!jP6Z4<%hSq1L%hd?qMS=\8\/i^Lt9BMk8MeZXY@&D%&eX5Bc9jb&jbjbai
F*9yVE >Y?e#Rh<WECPXPB!mP:&nj5VPK=E#:H1#>Eq>?j=VTYkV&4h=!Ib=H/YkMwFk1JEN>ebk%LF1Hic@X+=
mGZ5Hi E\1dbE?w!?E!uDb4W/tJTXKZ9<E^G+KwkyHe*yT+wj&LGyewwAmdCWCZ1B$NpJZkn<Q%Fdm?K&469!XH
SqcK<J dPD+Y/F4Yn<N%#jlk9uX?k&+HwV4CVuI@\BeZ=Q:#<L%pED+DDuX:dMW+:?TAHMpTNH6X@GkPqT&JL>D
?q<ZHw =DYZDbHjqySaiuP^:I\EydIjaBkyHYXPQcH&SukijK+XI?G%IqumaZkRP+Gj>!i>&WJFDcL!G/dGCRhX
6M8=eX CtXD651*D?bDe\?CaYpZ/?6Znjy<6JSwuIQGSQXJRV5\u88\Wn%Yl%5%:8Tt+E9d+Sh\t@J4p*/nN&wN
he%Q!q qk>yDWT:8quhw9cwA>C!R>mLmT@H6Pu91G&Z%Qh^8?VR!NBA+n91i5et?W##Phu>m?/jh@<D@Q8L1dLI
M+TWKe yn9Wck5/Mj9bdjt58p&hdml+\PdjqdyhZn+QZ^d**tkb?uj:=S+A=Sj=PNJ/>R:=eJ*=<N!I\W+56%uZ
#uF^T+ ny%<jB+?R8=l=$C=aqh^=/dSMa\&VI6GR1yw<d&*Y+5E>Xk@>>k#T#&B*9*=:wi/Q>j>eQjDEbVEwDXl
+P5h4Z N/JdtIH$4ETK:N%Y!5JTK#b!p4eHbkQ!n^u%R/Bhm@LE>nIBZ$+MFQ!J:cXka4M@9*8ptC69HeMAEKin
4q/EZi Z4u%Wdkik?5S8J/C/+nM#Tjl?nbeV<PQi%FjaY4#lSRHbt\uZW&qyE:a4>1=kq@F5HIyCaJ>Bh\P?kY@
ZjC<#a WnX@8Ia4?d*$WLETqHK#YSkc8=lu<naMQWj$V6lmlY#\lBF1@SSe*+L4P\D>$Sj1iJ:/+hEh#@6Ij^yZ
@F%5Wu DQbkP8du<9Sl4Ru$qeB%Tj^E?WM$cPWpeF!in^uDkkWWW=yMF$ylTAh=b9\AAGiNRLL=/M:ZLZhd/S/5
d1*$9i k&iLQFnHY*Z!LH*+a1k/C6^+wqQXt*QNl*GZajE9Wwj1SdFbm6RbQ>KcN\hJR!&y>IQWa$6B\9Sec*mW
bJXB/? 4yklyc+W^JZ4H>^1aFjkl!$F+dQEei1c=!EF9Zbmayay+GiYj1dLZdJnj@BIN\Ykm\daeqAbNlA*YBB@
=HM#VJ *R^ml?awa%BnGy!DFEQM>NB^9B/qB&B!VbWC&D4dh/D+#Sb\!^niSjyI5pnkV+wMn5j##R>6RF?e%X\b
N$Vam% 49p&8#wG:M4B@PSp*q?*^T<Wb4#mPaP$E15YnmFMj%/yd4e@6TwwdAj%SIe5y+c4j#thMY9RAVmqV8My
5d=jRS Fa=+%jE4Q1SPWIu+S4dwKjYce1p<WRb5Kw#NedM!$qQ?<^a5Th#B$VinIBaM=E4w@XpL!B5hIFiY@ilM
?9aM4b ZZ$k@iVFGAH=nRMEu@Kj&^wBRTa<X^eIQ8W@6>eG\m+^+:CTjlSacB6I5wqL#M6d/pb&8eycpH@ndn^9
$j1ZdF d^SNl4^jDN/c$YT5/RTeA\+Z>nb&F4aXG!Lly>i1LtMjAc=*Aub=+nNk=!cL?WlRukC&q4VEK9E#Caw<
1$\>Cd u>hEh!I1!6T:XjJppPMV@$*h%X/+Cj/uwI/1+aL=X?1H9KlJ=^*ZjMHWK*9qC1mXZnDlZp<AnHPQ9^Pj
eJiY&I Xp<im\W#eSI8d\kq#uNHu>>ee<E<1>/Cid/GCNBQdAdS<RT1Zwc9MqB>lpyNGY+GNi+GXL$Ta&!y6+mY
&*AGqD QD:W?*twp!iy:?NRJ$?KlqyZ1%#I=paK*w*Jp>Wt4qd>:t8/Jj@RBS/h<:5S>be!JXa$<hHa9$4YWHRH
ut4WP\ pnA6n95P$4\eB?Fi@C9dX+Pi85L>4eLHJ/wemW/L/yWacqc969qyQ@D6R!:I+XjX^MTQyci^t9SR%yK$
XLR!$n SKC*NVNVI<FM+tM1<p*6Xb^N+GkPED8XBBFEZYNy1E/%:h:$NF:J:Sm1dYC/BPKiedAt6*\WbS^al^^a
Q>q=Nh t*qQ5&H%Rlp\ADFk:B<MMlE58!8X:Y=+6nt9PXLMXjpHC&YMAN%VKG@kDh!hA@d%L%u1+%65!lD=C@<e
$@%uXN yy*n:jGh+?I54PDb/j+A#Tm/Ywu:G=y+!qXMWe5#twMiL^>nRim^w#88jJBC?FW\@BGIH%GecDwhkmIP
+KC<+p ^hq&A9q^CP=$4qS<8pLB\99\IHI?4H*?#AwLXe%ySSE9yBZj5Fy^=8KQK6?NMjj!IeqTS$1F*L1\5qD\
XHRmA8 u>JBNVLy:SlDEM$>Pp!jphZ<*YW@T>Jd:i1FjZV$D$wYw4k4ST*laemB/MAlh$^&8qTCa1mTd6Y:/<c$
S<c:qn Lnb1XdbJ5HPQMl%kt/NVPZVEEpb#5THPc<R>hRMF*uq$<qeW>^Tb:BekV8ARYd$HkW8@1*:e$&4LiR%&
4>d<d? Z:6^EEBp?\@Yn+BcdWbHReGc=Jyh8=B%*P$e#c%kQ6thdH!L@4ema+<ia^q:?qnL&C<GDwR$4DDjYSAK
bmY/6B ZqABG*CpDd?ICC$BG=<hK\Ed/9k<Bi\aMTVF&J8MTEi%AkK<X15YaPwT=6Ji?6G:KjQiLjD<F18H8C^J
-AuAuG 0005b3b75ef001202b3 Page 339 of binaries1.zip
B/bWEn q@+V9e6ZhZp4ZhGj@&F>*Y9i&\N+>5S\:aE*>>TA8Rjk:aq<41R5BXh:4K\D45=aYShe*VXk>6Dq966L
TGL>\E q%8&nK:1:=jVba>X+4u*15b@#qiJe$CPL^i<ldDtY59H%EQKNWEdCb+?tqK64$euPFyTi*6*lD/@mV>N
h?Rwt1 $KcR4EmeI\Q%lyN<VDKL^\4EV$H&G9kCn$Kc9Hmqjk#PFi4wZLK8i&qnq:JPLQCyieRHn$y#9ucdJ%hS
qe!u?4 <u\w<wq9:dIKN+YC:IBW5VB#Ml%%+N&$XQcL8mJT!<^8QQ4An@WVK#^9J1$=lGp<AG:H8KKapCcWKKXn
$$\%yP RN$wMM>WJZyCMXBK5N@8<npYcCZR=@Kl1>9j1ybQWjcmPq$>Y?RA^EG/+GHa+C\jWTYI^Z\b+*Dy5&$e
K8Vy/l Tqk/ZIKLq1&pj@hn\pE@4IKYTR?bLnEBTwpV1HBe\bpbAS4+RElbH/Q1?EHiK$T>py&65E<KeK*RA/XA
yd!F6@ +4bklM416<8a&bDjk5$$^!h^K=mFBL:&M9jY1Tk!JMmbFihKlVu+DJDmMQe^Y4yD!HVD5JEIa5DV\!Y+
%^tiWe t@Q!BiJ=PB\bBiT1^liF/MNlKQwbu*$AtFdMmWIC4mW+:C41ySD4Y9HS>kcXK&D<BwyVEFckAIaGc=QG
kQ>1de CHeT+G1kpC>VdM:M8*+9YNINikLuFQXhcQBu:l+wqjPNKmWHLZYkyak1pSC<jDFMp%VJ#DXu&1GaqSkH
PLpSNV CJ8TP:y&jL6=9j=9XE5A<h#Je#T1^Zj&A$NFaP=qWeJIKln+Vmj?MEk\dlEY/KQ4?wW<ja\F=SJWtE<d
T41GEF Ta>\QBKpwAWuMt\EqJ1wlRA/Ky9#!!KG/u^E?AXPpnt>%GQjji:*YiqaHS9N/\1Qd&l/P6:p#PdtM$/:
NR!FFj %iHI$&lX15HMHS5\T=&b+*!Eu\^6PV?WH&THK%a\Nub<LGVp#KIw6iP^bt+le+HPKl6!^eMT!<B+Vy1A
NeW#9i aH^b#AhDpY:!aS=1t4tPM<@GQqp\5d^>Cnp#!*cTKLcnJMKbu<=uy<pG/XW1ZubcB+yFlwIt5thaGW?V
NK/yG$ uTjSqDW#Ij9iAke6M=8jPZCH\tPbnMG+pYRL5$VYWFwyqRyllkVXyCX$cQb4L:CPi&Q5+%=+e/@FQuJb
w1%VAI K%\8/^n@\??q+G1QqZZA%Sp4/+K4P%dYA%h9Fa8+F>nG9ScL!GW4+D18^454/ZLjZRZZ/l499km8+/MG
TkcP@5 >J!1n9<LqI#1eT*M:im+&hV=PCJAtyN>HM&VtVdSS=D#cltQV!Aq+qh8YmX449jJY5Bb5emX^hJ1VQtX
/&4mhP Gq\8$e:h/D\VE9&btTt:q4B*HGhYpFV55MeS+!LJjYAKpE6PZt8G6C$e4iDF1XAHPC:NA:Pa#8h\H6LL
Awdt59 iSPG??tRDPibwj4%c4RKSGF4#VL\@nG@Eq6/:LB>Hn@L5R?T@am+ydD1a=tt?pQ+aAdVY8umeB4D?Eud
:McjlX eVHA:H*S:Ic%AXQ//ZtHY18j@1FZ5EtZP=W6a4AbA<6inq@GLq&%^uS4@WhLH8:H^D=dG^k@=ClkYN<a
CRe=*6 NVjQjXAyYaHAkH\LSmu1W^5w9E:WIRIdc\kVFGTujAZ*CV\qny!/acS#aqVPdG6a@TZ&^h?\81a?eRFI
#pc#Nt imZ1ENG8w8q@#m8I8<w8/Bd#Cu##85X&FhIuLl?WTeW#ZnI^KJ\#\wKRm@^Z^eX9qtK?caK<blH6Ym#J
G%=Y>+ ^445YjE1#P5SmQblaWnma^J=H*KM>&p@K>J8EaV@ANNw$6L5=#nyVeYdkjYT?C*wNm>H5i5+Qp8&FAT#
w/Z+q* =a1NFPhyj5bHSQ*FBZ4jipwBuTT!h:tMhmW9yQl&%q9yjLdEkeLukh<lymjIR$Ywy?jEbJq=\=Ld9WSc
Pd=L#% 9FMTZmB<9RM/yPR#Z!N:bH^@%Fy*+HMwqTpHM1j6MuRTb$a^?$^pdI8PcL<$de8<6ZcqG9LMlmWW/cYc
=6nLHZ ==h1/#CEu8%bSk=wi4bVK/hMq8#MM/V1\dw+kYYS1V@CTy8u<F5bQ?APbpwplln%dNpnd%XlGbGp!Dj6
aWc=pN ByAe8HiB<mk@In^B%%btB!SFyy+=FBdIcLEpTCK=AtpJJyS%kdaZRWt&Iq$V*NBN^lBtdAI>1#Qj?+Nw
!&hm#B =cK*NH5Qp%D/EXClAhTDiMVy%>HlpW!B1pCeVS!5p8PAT9/Z$MttJd^eqeTb?Ry:KeeZQyQ$q=Q*86kI
@$&>&S AKKWwcZZPC\eHyTtkFA?c?P$$lCqAh#ChZ8%9B/q4ZD!CAm@8SCLmB^GqnKjW81mtES?DJum<&#HE6ii
84L<Ee hR%%9jGq:dwq9d*p!6B^*%y1@*$kS?&L!XL:+M%>MXq1H<lT?!#XQyi%\bY1pqH&kT!%#$tk6^n%?IZc
G5!d4< LM:tEHVKy^k1=D&jwkQhhN5l=mD6/><C1H:ES\Q1mWATSBDZ&mq/5T?Nhm<iZX%TY%:SV$q#^DPEm>nk
>YpDIH /SGq\HlIBVk6G^yWaYl\tlFn&+hD8PDTL\+Xb5YtEDR8A$Q&aMj5GtdK=JBw6k!1A&:Q<J=ZKE*F68Nh
lX5l*C qlR85Y:m/ZE%4$&RJLh*L9L/!h^WG&FDnT$uDGD?a!LR#JN$#hY<V+p$B4$HVb6a$CyAiNe/>bG=DH<\
QSknBR W!DhVc4ncK<n<D!X=/5Bb//15!VYY\$FTc%qpB>q*udMIVdd<6%?p$Wj8wFdtFu5k5Enh@*TZt?!\DDS
M8aAQK &J5WPjyGC$\LLRV:a^bZ9WD56>:W=a6cJFIjWX$BB5C1N>M4yctyk1<Xb=yh!JaK5#QFWP\^FMyKT@?8
8<jR*I ?aujtQdFW$wdyZ+%VtDDPF#6i!eIwNhMCZ^I\WBCa+FCdWwy$p:p<WlAIi@QTb1hdGYYhBt56hDWVK6D
5y^NcT qC<MMJC1b\K>aTSLDnQ>wT5R#Hk=?W+4:PVMkXF?Gn$Kj8uuw1R?KI@WcT<FGw5cT/pwmSWmSTV5/X4G
jBFk8a =ATAeSS=%l>dId4qATa8KBw6qFEA^Y1XVqMC\Wlp=QI?$pSd:ci&&:G#T:cKm%hKa9m6#8F<R>?8$&:$
yb8It# Cw?cVd@!IaY=>mmZpd^G!W4qZyd#9ElBwTRk+lwRC$qXkFqEid^peQ9VE@pyqG\JFDQyTBSca&BI^<y1
ku4INl 14W1/G^WDKpCE#=bZDuS/WThS4FZ9D&cWpJNk*1pm:Pa/aH:edca9*HYS/PLX1CFch?DbtDFe*XRPE:$
1=+/DT Ecd^1pimAMl=C/+Kd^+ISe:MbH=bB$uML>>FE/X:yCTWEcIK>n%bWQLb/Rkj$kauy8#DjyYuIA59SXPn
X6>!!& y?wa#qHDm$ZGc8biKXGtp%!LA5=Lq4nM9>hyd9@kX4iJYIBDXt!W*!#KNAeqwcpZ6\?@h6N+&5uleHu^
tnKudl 6dHjC<NTN8<JI+yj&8>cNiI1ew>X@AIduFEyqb+1+MFbRW&%MPd6Tb<q=N946N*!Tud:IFj%AA$Le$C4
Neq*aA SM6B*y>$*lF+yM+W6YGj%l8J@kLELBAXAqn>L/^Vt>lPwmX$&VQwVLdqP8M+=S!Mda^eq1^S%qLqFNS$
ZkVA:e p$!8WC&*A!%w%1%Kj>>AkeYTF\8*qAF8*8S5heHwCL<qc=tjtT%W<tYaEM/4jyl=5>TG#R4PHPqQq@Qb
LyqkZ? mm!mlGeT9S1pCkBCNkG>lhnTKi&diXLp5^wyMtLTK:^W\X^/V9Bd+n#RY=Bdl$L>ktkIk!bh$&@ip<yb
e8!$ZN $LS%VYSQtm:pi&P1C9$E$*6Kb>C%p?%E^kplLI%H:/:<P+KqE?ilk5RQK%C*K*H@>VnJlh/D&S8ISP=F
b<*qDY TtAQYSVabYn%END1Ia6iw@IpZVc>H1K4NXdYBqe1X6aPX$eNtJ%\heZi:cdLLi8l!@#y9E:%jJeQ1nb$
MnZ+9V qNJmjpm9pmP4+@RQ!\GjS/WZnW?4iV%HJ%^J5eV1NMh8d%+VIE!F=5B4inwQP\CkY&B=Mq\wb1iBtei>
B9lE%n *lIMI1WS\<6<nIWlm!?>Pm+H=T88@MQLw98&=\k\p*uhHdkneMWSaKuw?l6+&Y\yIMM5b$d^ReBBLTLt
D6#N9@ W\b/qj:LanKyIP>q@yHQ<+dXTw6+d^wGE99?!A%8hwYuIu>wkyiLj&&a1CJqJtREI6JceNK=E91X5GES
CNC<PQ h8=\Fn+TCQ=8I=8L#I4CPnW6tNN<D!^#PY$amhlHYS$#4%>Kc=iw5utYV%NZ\#+#QC8CHyRA1pHBndVK
=T<1&< cmYd:ZN>!clB6H:Dy@:pJPC^XiVGp$+4^8&5ZddG%dNCIEachLPtWt$RS6pQb9IliVtT%aWtqG\I$LVM
4GMFpl w$jS:1X%dX4w^J$i&m?I6Py^JcR6=E#B<&JWE\eKnJw&yhY191\V@<<Qt1^>%1k>59S&@?EM&1@$NMbb
j!kTXQ QkM4*Dy4$hb4yLM1^tb*u%aeFGqh6bcLTMK%yE*QCK@Y:mBK^qt4K5RQGI?da$eyC*b:q>nWSX81=t8N
cMY/:% $Jj6BbP%TJ^QMJ#Pq:WZ\LFd&@ANi+I+=GETW<y8nb$lh4Xb4^C=mAq@#:YqKtb?niEyGnbCyyDdlN@Z
uETSdA @NTt1IynN^Kt\GyHP59^SAwLLkhnKmqP^1Vi?::F/*Wdn8$AeIaHa9cDA@CtjZGbi*Fb1*N^Yb6#eXuK
/eQLbI 8dm5*dt+4MP=8K#V8cJ/h#tZWth5B14F&BWWYRl@?AFIAMXKiuQiL?RTqN8BI<PiVmE8JQ:MmqE@m&JP
RlL\V4 Lk&F&M<J<9YuN>58=lM*RE6ZP$hpd%HJ=Zkc?wN<G44YEXtMEnlitAmTJ/5%/upipW&M^I:Ibme\NKk@
b4$H#T 4%/mZtKPj4db<Y@w1RHc??ee5F9F+Le?aEFh*d@SK<Cu9$5p!Qh6GX:&ISnCP84QPXlj:tAhNWq*EP9H
>\AR$y /&B>5C:YdllL8K1\n8YuHK!9edDm$\n4j/tD>bN%5daAqeNXlSXaGRj4/^!5?DVC?li%5c4qhdD81h>Y
H?NLW= **P\#4y6NRiXEi5u/4V%5VyaWiKn9%XaaYX*5N:laMYuEhbQ%5H/TF&54RAL481&Fq&5H*jdY4T^j1wP
&H*Yn+ %1@Y\d1@:4mPBGWH/%eh4Qk$\94yPqk@W=icnqe9\15K/>CMm@WbB!5?ndA?WAj4b?6mZeq@1:BmYAeL
qL!X$C K@$dacYkD\d4b?ykjck8%6X1FX:Xy^\Vd%a6tYmdnZPWqu%EC&!bj&*/it*Je:yaY@R$Hky/Y:VW1G!t
GGBDAQ ^YMHn8l=^AG$TPHVcJ+6uJFRm1ikm/:WG^hKM&Qe<tc6d5b^^!^/!TAYai/??9qcalHt9tNmHV!HMiAT
RtapY% VA=6nW:matDG>\%m4N%T\KiTWGMw!pHT?^F#lm:!FN<1p^+9/jQR$a8YXd=Q\9LT8EltQW1<<^T/^FYI
w&>#ua IeL<T^M?>HLAEhW\+YBJMyy1pID=9QQQ*Z*iBShpG1b#8YtJRjMyVAJY!IR&$Cu5DBS/GwQTa#iqaYwa
mT??Q$ >bjNA9BnuHlK+n\>NCmRVkH!>e5nR+Q1buYQPct/&a=PdI*#tuK^A66J!>p$^Aqk8q1nEZ:8Pj*YSJD#
daI9*9 bM4#Y!*&Y:EV4V>uutp4J8!!icddXQLECcl*Vn&Z!CZP\!9GM+%X9It\QP=NJK=LuPGeBF=EN4+^9#LC
llN\p1 IaJMFAea\aRFj6NMiY/?9H%pJ^/YN8AS>E5Z^bIqEEW<#<H=1keyCiZE*Sm1jLA$E\!ZktA<tA$&:i\Q
<aEbND 6wM+ty9#ktF@LwDulj=kECnyN6Z:H?N<eGeZ?%1KqIIF8CJY&CFPG/F61=w^bER?<CkNwDMA8lQ/qIW9
it4u+V /?jSMp&uQD%6cT#pm:9IJ#R>Y^SEXAHLwbpMI\H<%PJIbGwJ!b\uGPtaIC*EF8#IcCNJ:SEAm+PBN#tb
Y#KNlc #+KE:BWY\u!a8cCjK<&BJc1qX6K*w=<1?a&\qnI#l$yldhHR=ujd4EytaQca=VAWJB@T8XHZmVPh^jNS
-A?G*5 000daa6fea8001202b3 Page 340 of binaries1.zip
Sbe??I p\95+=IQVWT?Ry+TTWN%RPSuV>HMHTn*!Rj<6w9Pa!>TB#!dGNnJDeh#q1!W/M#G*1e#H6w6RHAnZLG9
V8KQ%V nhZe$6C\p!+9e=p98VZ!K9Y1bedWMXBaykZZeGm=ABmN^@^$mjWQq4&EnIFaH/V8hXFITC&mm=p&lHK$
q8pGed MqYpI&ndApGb#/bq*4&pXyn#c4bKSq+ZX@F^1Z6WwenSY8@R=Hk^PX8\QPw6Ha+en<pel4&ypJ>B6V!N
AXmdF6 \^SMCdGu%pVDZEdb#/IXK?&9I\Mc5\>>+5FFht51ac<RQEkuP=lpENS9utI^Ichp?5m%%nTDBH*VdQKB
X4MQLD bu+EDhKbi/n:G:\6lt6SF=DilM=&mK8+h8$&Dhc>HL4>/BnSwWY5wWGc$Q+V48E?<^+ec!S/ud1NWB5D
K$I?PA QquumTDJ?!+&H!KD8*Sc9c4G96NMYbd&:aJ^dIp%QVNAjAchdNVP=BYu$=$?Z6@$>d1h@C+>P#!#?yuF
M&$WK& NjK&Maeh&R%cFE<!aRqhKL$mD84MdEaKn\k5Ll#GHMX4\IR@me+u5EJujS<NR^tKF1$nm+\h+<km:^hP
EAR/IZ 5pZ>G\wl\6pkL@KQDVnJQjpBMXCVN^D%6iNWDn!<>9a&8=VR8c6h5:X^E*VtM=>qayHXZi4=yNR#tYlX
k@Aq1h y=y/a65idXVQi#l@EP8/!iKPwpVMi\ny*6LGWbp?%lL/bR@hT6B@SC6P6!Q*#Pt%>SuZRwpP5?AmcL!X
Z@?!A5 Iw<^nLCkV*l!L&V1BXqSQ:YC4F^MwWeYHYTqAw*XRXdk%wqmm5@W$<<4!Iypy\c!/:hmlY&kiKHXYm$V
M+:YS& K/\X!4+cT$nk##p\>nk\S15TR>?ca1jpPJRbB<4nMTk#NcDacR$KRqIJIQ$il@R@%ImpLl^*TaBq$&ln
ZXp!^A NFTtuhL5hM5nJtBk#kyWe#GFlY<R1KcLHB@Vt+ECyjBpN^DlhkQ*6Sdeh#iD&$:iZZ=aP:ylFLb&9RZ$
T9ntuq J<&AtnTy6eMcD5ip*4%15Xt*Z+Aw+jFM$klbLSF!#$p>J<Ljp*yP1kh=FMyk\M<&\ih\1u>?EbDQ/Dph
:9Nami @y:Se+d><Q>HtV@KKQNS6ne46Wjmdb\9R=aNjFyDmueT<a%eMiIp+q9nRMCuMRnh<@Q#tjJWtZJL/qS6
yquddy HGw!<NWq%l4&ZReWQw&Bcl@A4dWTYnM1?Zi%R:VQnXZGuthp\q86/Hh4Fl?b<Cw:mlCIYpQIXBb>P1la
n>cyap >CY8###!TXMpjyBH51@FNH&W*qIN/8Z#u44%PdNSjd^^VmmqQbNBd9C>MD1MTIe$@SBE9S!hLcTamSZL
aC<\E< I\!6*cYbthpmY\1JbiNKw*AhLi?@6i4*K1h?Y^9X:\6SZMa#Kw%:DY1M4A#K#XIMW!4IV$%Z$lVPEiS?
/m/j%n pdqN^q=w#TncTeX@m$=8VbS&y&iLe1=XPFmPY/FHwbyX\@lLAZNBa4e%Wc+p^m:F@$Tn\Ehnki+Qt@mj
!*C189 a%Z^Q>@&+nw%nTk<ha/^<?&$KS^@J>ep:w/mGMj5h\$w9BaDFpIqAN:?SBT9%e&@Y5@?><eTFSt?6?Mq
4iBD!V R9*G5T#bt/k5pjFK%FdyJ^?yaTA!+Z+V%&G@J$\hE:QQQ>#9btRCJub5&/XYY+p:W*WckX9Lh%T/Gt4h
YuGSZG =4DKMtE%l#F8K!HG+%TmFpb/GtF<P4KLHBXG*8#GKl+IF:&tA>i+dh!nNa6Cmh65Tm\R=WR^wI<mKmb^
l:T&di Y@QV\=//$8K&/5BbjM#4?ithu44IkulqM+lNaq=9bcnnkRN%j#PwdcTYceBw#p?Q=S&RD#h6ik%G$&*/
J1QN%N kF9J@>Y$/j4eSG&wI\^%$&:%/kl1+w^tWK*<wdZlDnHe@pF%tkX*wlueq9:B4dWBdtPAR+Q1HA9k\YaA
bQ!bZR 4XRPhYKh#$<Q?t1VBjQBbnAd^D1*=#5R@4ApRTZa!YZNAK9GkV8BJ<SXC%eKuFR+DbBwpe1RLuAW5ei^
D&/%T@ p:BSlF>%HDGKqm8P5cIquu4+YlQT>dZ1dLN56Etw:/MI/hy6?hSaiLbNVW:pJMubm^&4!mJC^@wAE!@/
NCiI** 9V^l6?e$Rkj@JNbnWkiB&?J!*+hn/dD6Sy@9NQ4IWVcc#<^6L?Z<R5%5/1<k$TB!\FuikA<:%D=WJLYq
%@Y9qG Vu>Zu9AC#G:6JJqhb$Ply<w/q#qmEjcqX4LRHnNnqnYy^eF&WYBZ^dX@cRTFwp<*lNK&$&4JSTHea+=8
Xm+Pm# J%j^%=YXLyiiYy\bS8&8!p=>96Ydh#Z4#e+h^a4Vpp*EH!Kiaw\@NPtph<h1kjHlMV<hShpS#d/XY=AA
e$Vk:n dmy//uILaEyb!djycR^kP+et$6Xcd#ZQ4Xb4k?d6c^pcZF<%SHEIL&5EwR*nc#iH5c+lDD9>N?iGA1kk
lIL^IN l$h^5C>^Lcl:+k8D&ta6DJe5Wm&+hYkRL%paEqWLA#:d*GSleGwN:cm1hX>%4T?4&$&ZN?wt*6n>uN6V
tG$4uW KF@HeX/&FJ^nDZGKe5*FmS+>eb!n%VmqknYG$1>??hK/Fb^5XMH&kZ^=&k>$@X:L!k$9XDhbm$RHb^nT
/#iJV# !k$9nGpp>1>pW$B/^LnaGt%9SGIH%H$G+9&Ne9bEJIbPE8RwwcK>y:E#ST%Ti/GeKiV6K=B*Gjcl>!XF
%G94$Z N%*ucWeH@IKi8m4TY^PZ^y!+dHAnkV@H+ERR8e5GS$@n+DdE\Lt<WHhPM5upy\ah%i5>ML#AbTbQXa<u
+RI8PI V$$M+wXjw?IcdZJY*@%TW%m!%W1D$N6EEdV@5^5ZnB1<Xn!:M<P#?p\&Q59tQ?GFjJcYXBHwwJYDtbTX
i8\\G% +Bj4$EGLHLhkEb@!Hi<LM5Xn6A$hXnQCXC<IkBY#EF@G+^c%qAP#<D9bym:Y*qdW?l&L5e:\@+WhR+Pc
4J>=%V ltj#PVjVNn^L@JP/eKuYtdw!dm@@nXF4=Fk%E4p^JY/AJ*?tehHV^w=XbAjCWZYkjMYGRp>nWCk@4Fcp
P:!+61 9wq*:6*q^Ai6FR6QHL+6&4tN:/Qb8VhSqBDZ>G#=eiBS#id?G%yhhV$!w!Et#6mp*1#5yAy*HS$#8m#!
$1l+1E bwlq#wl!JyY6=1=45pD9Z#ZIDktnQ6yTTRP+*ptHB5?B%VuiRMRn1BMN$1H6Wi4N/bc/XNQPj&&du$:=
LLn#BX wS=Z&\%%9y^PIm!FPnhllk=$9FJ*YB%RT:qly@#a9&!+XF!*!Vmu%K%+C@?%Kn=PCJGdjD!GeINGGMS=
W45Byl VWB+Wk*upWZkd?P@F9=?\4>yb*>Xk$*H$hMa@1=FIG9q9^c!HaS58%?yc1^Sm>QVGLI%Mjik>CJ:P<X@
k@KeL9 a+9LJWCkBSF?X#ldSE\**@%%R!eD^Ke5wcZ%peVw5j9l^TKyyy*/TDdEpH^n5Wm5Lt8KbCTG=MuFI4Gw
\tYbGS $EL$q>dYjaKD/I^Gc<>6G>pSSdd9Q68#^ZJiRe<QQ9#H4qucIbCeDti<I4t$LEV?LZ%PTAM454D4I8M/
$u8^1X ^ikXi\98QPm81R=bL4&>>5=DV&M:#+y?KC!mb<iXyIaKqi#BY&\?p41wLVaYt#SeijQ%6Gjk#9TkGnS1
>m%<Gk >n<??n*D$k*Y!4Tpl6Xq#!QV$kbihwFn*NB+84nLd65\PqVXydN8?N8lPm\c8=lZP?mY%a*u945A%ihj
QH&pmp i8B9y?1$Xi=XCV\S*SaL*cp884jZBh:Fj?*/T=LQRV9Jy!wJWJ*pE=nnT$Z@iJP!p*#1M^Zwtj<*Tn$N
:9ntE: %?164h5:%Tb$nn/^<>>W:<DI!ASM#tD:^u/W>n/@QV8Vk^b?ij8t+S&1N*Hy!ElyRy&b?PpweId1#Jan
HLu<l* +:54kX4b>6l<6nKlX1e?eQZR<KBc*Z:j\Qn4SqTm+>&\R4<C8QhQVe<Wb%XH^&M#?F=4=>1^<hFZ1M:P
nETY+? TW1Ty+#lF!P6p%%b:W%5ASuw:ZT@n@RC4EP?4jMDT6**G:1@9jMByh/*llY8&JhZ<@5*J%Ec9JHh6%Q\
NbyI4y #1ZQM9#EP?HjQ&FJ4^W+1M5+C98?NmCBHj?dDRRhV&MTaK=D^#KqhuKW>aMh\$yhe!@hH?4+4qK9P!L%
Redyc9 kjyi9%cW9yl?<bQmNk:T%YYZTd6iDj>?V@ACTX@&F5EL>#9@TQD?AQC?V9C8k9L@K4l?DLm+dwe:@l:8
Y?pnYT tYN>T?eKyc=:u>VldKlDS94pA4nQ$@%dP\H@>i@u?uhC*R?\XH\L<6L9&<Lj6pPh:*<V\$\<46VK:e^H
ck*#ly JY>N1?=4?X^V<4%y6a^*kc<qj=JYW\@R@X?*>KdX/y@V@SM6F/jXT#pc+>hdb6J1:V@V@bGYh/dXcc9w
?tV%c1 @5tY#/ZXTc\I@$dLD?CiLS*:YtF<H#/Z?/EX8LdechJZ$B@Zj+u89>q&a%1q:/j:d:ZPy6W4PP:HW/&j
i4M=mN Wi4$C?n?&/%R6+iG&ciw:RSaa6c#pd96:>P1p&H8VX&8%AQeu\hVt=W/q+ZT\!qw>!8H/Q+h1c8Bqn=I
<V!qFW >?>MZcjWla?!KnEF@Zd^$*S@V\1t&NhKhQ?i%PG$&uAi5:cyP&HVQIC*J@^S/p?BA?b/*y%/VKq69L!<
$kWNkI 4S*w+SQe*4i*\#!:qu*1:pn>XKuLh>L>9i&\cY@<Mw>nB>Vum$^:>*ZA?H<+JdS^6%JDF>H>$^&@V164
k\b<W@ Qpd*h*dC*4#4P$KH5DhM>Mla\?:S!ukQ1q<C9dF%+nAcaNh?TPah\G6hI@RAhL/YPbS*JD+Ni@w98W?T
yL^*Sn MJ+yyyt:pljD@Vibby=:L1%T#\4NQAk$<DPltZ>J1@cXRnPuyBXZAYltFM4@SGntbmk@SYnt\%CiFyy=
jaLcN\ A8=QF=y=FtD!l4MQ=@5Z5$I#=<C<aJw<kPZiL+XtdwJ9d^icPRD*:?T^c+X??<kNRn>QKNZ?yNAQ%HQ6
H\IM/X #WI@b$H=*@L+6w%B?dh+jN5PRd@h!?Qd>mDe@$lwDL:6:yC^luq$?c6p4N<IDME9bK#9kQL#bc^@C?P:
B6H?>F X5d/:?B?6+#9T?D>QVL8WJe6Z=P^luX9&*@u5i=WcZX6Reb/T1tbn<4/e=W&y5P+\&/jPC#4D+l9CX+4
EjH?%6 >8J&pjk<>&GmBZa+%l96V=\E>&6EC:aj:m<SPkF/Vw:V@c&wE$5!#S@Ca$XJlu<a@aGT*^PcAXy6iWnY
q>t?tC yj<E6MV\d$><GPnuKY=ZekFw=5jeQ$uw?>S@eQ?$Rn*d*!D>A@N%LeN@S\jk&9EndliPd?JJwYiaw<pQ
qcdIuV TV%l9Wu?X8n=#XCHL1FutN<6%$nh@mjW+R6C#>AHdj<p>H\!%GFa/BuYkhSdlc=iA@ZyE=4=#*B@4>AG
49Dc+& $H#:D+R&wJ<:Xkq6wKd1#+R&9kL*9&LcTLWDj*!K$Ad5G=h#Q>@SD9N++\clAcDbnaiFBwA866\y+@=^
Pkpj*V 8Q?hnCu$Y?Iu$9dQRZ5@J&&H>c^qndRh/LQqXhL&nZA9?$ZmZ/Bhc/Z6Z+V:Dtp::B&yCYp:#KjWB/V6
ulKjpM 5Ai&Z!=6l*Yq@iQThqlQ&u<ndb>K1++#yP*R:w/Hyi%AD=$6$9dnaX=eJG*@Qw#nw>J&&Fe*npndwZ$d
%b1cPb :=P&R*>58X@cDuR$6FLcAuVS<m*b^><LhMW\d<M%b>h:NR?RXnPj$HRC>>@u>@G?!Q9hZ4#jjXC9ITBB
P&YbWi ME*8^@9D9I<e^Q5:NuEh<Q/h@/#Zq4T/d=YGA=#Z8hFchPDKcQ$=ZNF\wKH*cnnR&X#@t#8@qFaquqP*
P9^m>E hH+d:tYih9++4e1Mc&<u4PeL9J:9/@^hYl*+e/=u%:K$?8Bi^6X%I6V=H5dX6Sd1#H%:1A9&+n8JD$p?
u8b!Pn $uWF4HZEA*S5>@JFDJ8/HG@GWZdi=p*+ldAHj+>qA$#VF*V%q#F+&*c@PN6J/j:wnlLm+X$*9m5SW:4H
&1Wy*6 PM4<=qK^$kGj<R*G6b@#$yh$Gm#&N<9$a#::6e4<LQmVqZRabE9B!$#bSKtRT&j=4Ae>Yt$i5T<bFd+w
-ACj5y 000d6f7fe13001202b3 Page 341 of binaries1.zip
*kZp4@ Att>t6yIGj*e@%=1Z6&IwEenIC>^u&\#6Yu4^?m+>4@LB4A>Y@J?RK*4RI9CjCuIhR=5>Siw1A5hFLm>
DED@ST uj&=*I:RD+aGc>/bj8$aGPGDyn%epW88u5=Z@NSa8iCF$?=@!$ep=$*?nTTRLjY*NeLh\!Z$cMN^D89h
\TyQRa 9\kde+ZJFAD6i1MZ=JbT8p^K=ih1@XP4hQDXq?nCK@^KGu&F#8uu\IF%H/^!whK+4dbj^u6WeC/8EA&W
dqR:J6 NR6jFm?MSPEGn%d1S=G>1XHSRAp#Z+Z&l#YKhM<Yy&wW9hm8#KkH^DiDwXC>i8Y68BVRQ?*\B9:j/<SD
y&AidL Y9!9Hy$b*T9/lYZdkhT!yW6k<tDT9lXSe+I!>qFXRTi1w!tkec&:+@Z4G:&e%ZF%m5$Aw1@tiIphNG5Y
QEm%Bd ynm869#Z/$VbZ9!9#tFjkyZZ889YmQ5H6>4*!$b>L$jBGneFRTqw@HQF=5D*=>H\6KM<FZk=9*uBM4hV
yehicQ q9R#Yu##FR>VIlSmK/G5yNEcJ16T<!ZDGq:VSe$cc&%BJlh6+:9qWDHPXn5NC+IjLQW*Wk8iPbj/F!m1
5eqw=P =9H/jBb=u8FVw9YXGPQYLZwlQ1>b8N!+I%Qq\/Z?d5YBwH?P\^/k#A4yHY!FZE^Jl@\jH1>4=dcp?w5/
nCeJWX L*alMZAHNd$>#6+eceXQdl%L<a!P:qK<Hm*ZW$=TSeS@H!jL%wBZ<chKRh+QP@V8aG=wJ^?4iJZbeIY<
tbqNV= jmXF$mwF+jFYSuK4QZYKbYKhh?+=YP%#NlbkGy$#RA!L/e41iFNXacYY<ic>EeN+qwylL<$Q<+9aCjPL
%MEFX^ k5V4Z<6q+VJQmS:ML\1u4*@%+NmbD<WlZ@@8%Dju1Sj$#@<BWE5DBBRAAkAIAHyXdTX:/+jnXT\BAIBC
YdA<dX AkA5AAAAa&^ybY=$e!>\b*A9dYFnL%BHWG6qiZM9e*JnL%BHWE6qiZM8euN!a!=mcY:5YZ&RHMX%:>p=
PNw1FH *i=>TH8ID=%qSV54VA\a>uCRA/Ye6V4hkXBpyLNPC1FMEe*8#6&N6V8##M#1:qRK8^mdjFR1I9?qWmtZ
\Zl>9q HMePT1Z5&EteCwb+RZ!EMl>CII#+ZD+CAwT</HQ9dueu::&iuy$:HRw+@mPy!pk*@Z898%>*9*:>?4%b
&Hk$*R %n&<aZmVNtWuLN6K5$@@aLel5#At#YYHBy:@l=FH*S?9jiD:H>Q^449TTT!la&l%H\6h&<ja+8@qYbLh
NkSe1l >$j=dun@/j:4<1!Qdd/jjiWt\$*h>+j^^#9c8u=:>i4444<85i&Gt+i#Ge*c1XttthW5J#&iGM<Z^pJ5
hwWX6+ @edNA$q+Qt:CQ*4n$8X<m86Y4#je>:?<l>*8u9nhBP5cG:=%d%>@P1Q6T9bZqj*:44:FQdV@d^VDQdV9
IjZb?F Cu#@J6Vud$p!m!Wq?Ah6aF+9=EN>4K>d&dV=*pTM&q:bq+B?*>*BR4hB@V9*Pdj8>hyiuuj:&Q+>q@?B
ncB<Zn $n*GRt6^NJnHNc1&!#HXjJ+^?V*CGSN&Ru+jeb:nD^DjWhAh\Mik#%?uVW6Lb$&D5jC#H4aBH!J5PB4k
dRY8Ik =\ldYld\<+k#Y6aEjJm\1W$CjkH^HYd1/+B@kZlMe#KAZ/R&64+d<BHmP=wP?CZEPZMZ!u<b5c$TjwW\
qeh/hy :@51#P>JYpeK=>9%d#uhV1i$MinjhV@m6JtjA9^V\9qCC9ADlA8PA9lB^BuVluX*@V6mLWN!jpda!CA8
1MHBan I>b#a^dkl\ndBhBF%<PIe:6$$EZZAeS=%ed&n!DGXVQYHTP<!$L?a+kh^<wBjl^^\eA&Zj?B&M/t5e$V
MQi=Ch nHZ?\DQ96mXdNhkGpKTM\G=wZ>mtYVqdeebXS>F&chcWA98a%hP1w=8Gaw?dlY^G5R9=9AuDkca#aP:?
nR+%G6 TXp!+1lGS4W<Yc5G#X\Pinppe6T$qJ^yP$GB>1C=XTMJpWY++Xy$EN?Kcmm\lX4cEbbkFLK\/!WGZPWm
&wH6w5 b%##1tGmypIhYR@aj#65ut/MMTlM@E9ciT&6n?1c4W!Mc>DNWtATl8pw/ZHXGAP&6/CWy8C?I+BycmRT
T@!A@b BP%nIh%kP$j%4J4X:e@l8IA%SVhAuy+i^>G^u>KcEe!^I/M/1kKtyq&&XZMKqpHXTGQH%JRD+=1ne>iI
/1%e+M qkuGQ^d#t$KLqqT@I!MNZBYwtSlHljqDKn4yBBbp$hlclubGltP\jIQtpE^1nN9lV+GJp*IqQL*d@DcY
XW@*I& tR88na@??aXHZ*Dk6y!/W%6/M:\WXVG$CWZLcnuNeMSJSutj&<Jqme&!cG++TKAD!PI&eC<IqcFmy=uP
l&DcC$ PqN=dRW&VGhX&^a1t>54yDyMN?^^?M6?Ac8#ytjM16QcSckFq$9h9c/\n^P/M$=4\#@WDNZ4l8:wc4cq
9?EPFX ^WAu&Q$w>eydbl+Ek8Zq4a\Dc#XZB@98W4MF#jb:6%1LNdVp6WGX5YIL9LkbiW4KiD6\8Z&F<LDBM=Le
yQ&++N $nwjKCClDMJty*AZ\JIhHAa6&XcCX6DckRTeJ4awd?tG<^9D?D:j&Qq=a/<LnE$mQ8*k*DHl\d1aVlha
Tcl4R$ 6pc>9EQQlJ@tw*K4:AtMmuWpJSR<9=@@JPeZ%qRCt:HbcNdJw*%h=@hCT8\QLLtAG:T\KDTNEyNl%liN
X?ki:u \M#>NS/&1a1J8?Xn9Bw=NZJR/NYppGM!aaGLlaGVBiHB:k1+$#VkT\cMPT+ddG9MWuPpnjRE1EQYne!p
hYcp4t wia$PH+c4wNJTLXDZeceaNktM1De\muY*b+!+R1^YV=qbP:IYM=qPAQm1ZA=kGYD!^<D:Rld=tJ/YAi=
64elE\ bVYX%edV&XRKay4+pKubkVdKPN>eckkmJ!HCcZh$B&dF<qCi4\<%W%K1BZ$YRa$&the#p?lBi$qDlX\K
I5KFh^ uj%wwC9wMnKcNWE4eEQw>tkY=X<!Z#/%\FB4We:M1Np<9LHhSS9u6KI/dNWBG/u9^qZtLZ5*68!h&>K9
R/ibtW ^>cS*ccbR\LG*=*D%59t6ld%1AuE1IuhBYy=<dp66W!!l:Zl=4E<9HXu$qtGVdl!=m!?l+Wll6B^uqDT
K\cm&V !9W=<4^cttWiLn?$HRc*9Q*Xwd!n\H$Q/5^1w*B#t1cX$R*X8<W<*iIVEaiCIikeWIaE#WJ#b@tbe&dy
hX4&bV h&WS$C$=Gcb:84@&J6Yii?lTGulD$R/8QTQN#^*eAk/hRlE4T^kFMFti$t#+4@TMwQYI$MGAiaeMp^tt
*5>J8? wq\+bFJeaAec!K1>E@+4K\dkliILeEj+kaS**6t!t#GI!&bXR#ML6mImIQ81:da&Y5lmEGW+ZpCqYyy^
@nm/pG tH!Gcp\yJ5t^MXJmGJ*^GdhdGHa=%&/qI8AjaWCeBIXReP^AcudKm%1kya*:JiLAwF@ycZZupkPb\&I#
wtw=d\ p:FlmI\CWcl>@Vc+JMi<1daCI=m6Ddct&CK&w^qjycRKapF5C+mlKE=16<GyyJ*QnqC^+K*BSCS/H8@H
V/M*p= yiBh**1Y5HH&DjcWhJR>PVS$VTh\qMSX9<Q4?q4N%5^Nnm=qelkT\y&REC/t*d<SZjtA9caV:mVam?$W
>dZw6G H4Q\\QD\X*mQeH=5iC8QcRF8*eyCAw/\NwV*WPWK?N8MyP9m?/&Qcu9Y^9a?n4lEQeDj>QnV8Mu:a%^N
T:=JBZ H6jAX=MXYdIWK$e4+cyep?4IKCZL5W1$G1:JhhEY!mjlkhGpIZy<qS!Wn4GuQJZe\&jLNpkK?=y$Y%6w
:*c1wb !!cmP>pt6pc/:a?**\#JD9l6PQ\R:1E4XMBI5\qqPK8y+IWh1AQ>1>t56p8HM!:CE*ANPalASYDMLaKj
&kbq6A jV8liNaE@/=tX?@nM:nGt#iw:FX/@FYH9FIYLX^/AH*:9=t>ASb1k$%C+PYbQQwQ&F/+Ft\F:\CIyBPK
bdnb>% YI!beqR<c@#C>D4+MT%&t>BT+Pw$yZ@eejJ4?9wtJmaT?dF<It*t?6at=1$K=><NIeYYVi%kP&qMR<?l
^/BF\t @+KF8<nM%19yuaY<X>FLLAmph1FKN&qVF8wRnQC#k*VKjM?Vwq+WdmTY+RRDjY^Q=nI84JCCK#+w/^J1
B\Ei=h ::NFe>\K%%*I!N!QjcDQDwGQH#>?DA*9cRBaQ9p@bAVGKM<j6</jK@*uj^qnAV&6at%6G+h8GPnab8u=
+116t% 4Db$\$nd+MDI61:6lyepW^:$NScJyE$D#hH8!YDIRWpw=+S$8%$uVleW+H9Siy%Pn6Hhh\P$>VED<>Py
LZHe1c H6/$^WA4^K*jCJ9PYHRj$DF\ikPbDMRih8V*IQVN/M=W%=AGq+Piy+8h@NtG4j\IQk*iD+NG*kFhk!W?
5y18Ew CYBR^:<CnFqtIb>a9Nk:YuD:cBT<i:$TZ^1A6HuKLMD6+IEJ%TBjukFj:npT:6bBLy!=HEVc!YZdnb%\
d%kjej DS6w5FjlT>p+lBQw8YE!n>eT9$bk^p5HVdlm<#C!#?4$&k^p5>%?:RAqBDi!n4dNEHD+m%?$#T4aV65I
t$TdLc JMn6jJVIwKYyRw^8EbRHlndNW%PWTcSe:=#bZHMnt>km%N\R?A4$WNKNY&?+pXkq<BJ*kSj:B9m>d+J/
th#KwY :\d86#aPd4:$uNy9Ri$*kZ5Q<P>k+TYDytHk\8A\k>I/9qwA4TQSP&!bchA\+1&cZelCMEE?4G5ELt&9
=ptnH# ?bIlXDJ=e/^cQKVdEEamDS:9R1DTLiuWA4#94D^LDp=uG!/R>4F9:GN@L4FPe5!S$LwqWD:%q=!GJniJ
>X#%t5 yu+ySbw5FHQLDhaBT=QA^VSaJ:n9cNNqqTdBI5Bcp*ZAlhh\YbPRZHhDJaawC1lCKAcwTmkJ1E/wCKkJ
Rh+#hT !tb5^yY\qKA5RTqDYR/WaTk4ZqtFMpyqX%5WuX:VqY151!Qt8qWGL\>DN+/V4k6yG9khntpbHDeFDlXh
ue>ZeN tLk5eB$\eM/Laeq!<l#5#5HXV+HD5/&!/Jj%PTZPL%JudXIA%AnIAwSSCRmmAwA1KkTKCMJ%XFibhVSk
hHh<nR :W%WN1J\E>WQcBEyqFAMB!GWSPGEmmmWSSwkA*i%5$qCeK5nHML8\*ykNp&PaDy%H%X>XPEIBm9:1BSE
u=I@ij cHcAGl=w#kP^F1n@1mB$>u#@5XqTnQJ@Di^ni@i^8<HTF^%hhNR@!^iE*G/G8^8IW%8u@V9TCZdJ>i5*
#<b%66 *6#md:D?JD@?\>VZtiS:mA*54#AaL6$d/C9QmZ$^Hyc=+=##BL*K88=*m8/JiPV6Iq/8*i<Z*jjmpje+
HN^Tb? <YHSjVMi?bAV%cL:cn#!T$/eKLyH+yGQPHG!/L+Rn=#p^Ptmi!kiPe&JM$Z*aD^!llNum?=V<WmNE%D<
PbQ:M= QB/b=kRWV<RnM=!A+9F+bJaVWD\cn>RZIKA+EI<$jPLliKVJCiA>JIkLkZmHBu$:HkH9kM\LwiywQAJL
IpiDb\ iHeP:@%+=Dm6Z9ApLIF:nLlTm@hBQQI?%RS+^$l4kueBw%bH/W&eKKM&:^CHjVL/R>1Ya\9T*eiCBNT<
/B6MRa >TtJnth<hFAM&uYRiDVlPjnb%pK/D4YY8jkR<V&FLZ/Pcn!1?*tm9E$=VD4$mBiI<Qd8ShwHn#lClLjF
P%etLm L^HlYeI46JGind^KlGe>4+p6S8J%I5=!wpKEb*=9EPEb=y5p?1SQeH6A+m$mQM6?t+m1V*AV<akQ@KQ^
Hc8y%t u$Re<\qR&\eLE^?T=ZnEej?k#THiwYa6+nnb$c?hcL@@%%F$9!6M@@<JI5Ank^8?ujZ<Q9/wM=DJ/ab8
FyVZHB P^D8RtA@dGtnN9?$ujdV$BS?!T$akT!c5yT$k#G>SWt#GyTTYDXmYlaE:=ALcJaFanEXN>QykkWJ^ByF
#@yqWy 8i!LmdcN^1kblwAdRuF:/dty>4wBVMTXqGXP+Bi&PbQBH!@wh:t$Y8A@DQJSYmQAAH*dk5uFVm<u=4<^
%9X8T8 LCA6ej&AM1w/cucBGXMVm14y\+e&1qpcyQBeV+p4eQL&9A<FqnaG&6A5H!VTa*4QXw>R6lkRmG6QHAdX
-A>+8= 00059efc35a001202b3 Page 342 of binaries1.zip
G*NHT* nX1cN1Fc?CZVT\G>JJFG&+AyFk\EiRupWLAB6$IYqXPuFNRdjcXLa<+mG9I9eNB^TyuR5%t^SHYZ1tj^
M9LlJn G#J?1RS6GYq4Kw?BQ?+w:B/thMPcbb5G4J<?L/TuTLmwZF?AZAMV\SENXALJp#@JeYnGp+ySd\/J!Qd<
mqwPuA tKXt6Ce8Z?ALT6+!M+Y$a@5AFdMwCb4=<8*d9C<\G\&HKpFSN?tcyX4y<TpqB<pc41YR#/m+w@+*G#AQ
e:ZZMb !EalDS*M/8th!ybN>B8Vb5G<iRQiI=GDjJbD?1WX6IMjAPjL\W#VVw>4tWIYB8E@Zu4CNDTbmjpDaTaG
1=awTH NjRLZ&A$mG<9acE@\!X=KT#t9@SLBiZJtQBCZt*5\t\W6wE*59%q=9F#dwcTiYZXNbP4cD6cH&C%TVl?
JT$RLj &Tuqi9^S!AIM8/jkV^$k/pbM$CjXZD/44XG8tj#md%$:5H:%+JeT>&\V*/5Zt5&=^^*#SD4k*8EB$RPk
MA$:VY Jh\PMk4<&pBtCRhKNd!iLX&lS5!C>:$Zt1KSkKVE4@ah5G&<db\+JnM9pPcHu<AW+ciIQwHq=c5>kn/*
Q!+Ew1 dD@NGGRe+VNMpmHYnb#BqAn#E\DSY<we4JR4HQSLXR+tYa&DKy8E+PR5Y\R%@S/1+Yhk4K!#qS#e!bd\
w*np>V 86/pRQ&^pwetw&WQXeMX/Nqba?%TSc:&e!mZyhwpl?ET1%e=nLIh^R1HK%p%Yic\Z/4EMI?8MZt6ZI+&
^#K?Le CeZCyZba&VRLThG>hha=Diqj?DY&w$p\LNhbqePwXJM1HtR%8T#kunDtY6PRc:G%$acHam5Fmn+kWLkG
LB4LG< &j+Mc+M?eyZDJXEtXVmMSSp4N!Aqb%J5:\#4tIE8#&DTmCn<T:jJEYc6HGG&Ytj6$+\%b%lpqwZpeyGD
aTt+X+ YC$JAnAD45hK5+TK#Ymbw&w5ZJqqubn8X1J*X#%aDn>W+%A8!iY1kFJqB@T1\\SK4DInWHW?PqBG%NpA
<=PY1& RT$w9%H^8Y>WSjiQRIpeXi6!tcQJa4k$k$q%cDLyVlQwn#YuMTF8p$4>+V1HetYqXJtt9C^eZetVT4pi
*%SK:j Qe9CDTc=+dPaTaiTn=h1qQu8mJ:$WFYiLhhay+54qlwiqM85YPER%lH#IP^B&INkt^K$ndk\Gcq$l5Cp
9bk5nj ZPckGkbP&GXTLZ1c!n$4idt&@#V4eMG1J1ZTYWLS1q\?m>>:XwR4aiBF&qlS4pVQIHD911=EILuqYn<C
R$<+w^ ?WBq#!TC<F&X6XWEWXcJXSC5bJWwn6:Y#?w$8n\yNiZV4D%Wq>%VRN+b@qpJJmEuw>E!q4F9l/6aS86!
MST9jW Be6\VRL?Ipt8uwT*XMM*1>Q:VuwuV+I\Fm8h\mJcymLMC=p#JTnA%*Re:#n8?+mF<&DlSe:nmFnAE*q=
pi^Rh% eCZR>=Qq\WF96c::P$X*%5<n9q6$#@4y^6<Y*hMmEXu?9cLdmEjcmt+<\9@1ItFb?u&1tmEYV&mY@l&^
9*qtXX c5V!W6L:mHYGYCLX*E?<W@V&iBj<QdW+TV^JeGcJ$^SJ=Z:m<H/aJN+u/CdS!*=RhKX+lCa+T<pQ=%@<
a^RB:4 R?4B8Yh<:n?K?e>TC8ZJ?JFa\m!qZGL5bV<Y/=kq*albj8cj^FytTR86FT*@b/JPWA$q#R&lqPZ@Ikcl
ZE\TXt /e/T>4pKi*<m1lyWMT*W*j89kayyMR&9wp:4cNA/GtInq@>E:FcDqEFn<T!!F>MbGyJ9XEMpc16?&qIl
CCT44F XDElqHk<t?^>kLVC=*bYcAW4Hy!4$Idj+$E^/dya\KqkST&\kJQBm4PBBb\IXy\JVQ!naMZy\LS=I49$
Si&6p+ RVHk6Qmi$@5I4Z=YDDk4<6#iS&qy@wANpjM8j$^aPS?R%ME#+KYQpRA?q=iIhhGn4V**W?Cqn^CVBZQj
/HH/A! A@Sq\M6YH/c$?q%PQFS$b?KSI:#u#+Xib<RIT=<tp?EY:dGiwYQLYT>#%5Gmi%K\Z8E4jDb\cHuF1:#m
BtGk?u WGA4iMX4jpXVcJ^Z9M+4u1PKW<JTG/LHeq=^WqTR59kwT=<Z1wWGl?i^+Q*C^:GYH@HpNMTt?XY>L=G$
FbSLq@ BTyiDt#c1Zp>G5L/V\jt$u6EHFLjk8hWNISZAQ\<4*lSXM\I8*tP4?FF+ZNkB\=^%m<EC@dyYd/5N:%q
9Y1B>Q %eT&%PKSk%#!Y#T>cZF$+Q$WF@M&DecQ!$Pe>SbbN>?El#u4DiE:tn:4hYJ^T#%A4BXHY?NQi^ddFJY>
mj!wue @<Zai\A$5ZV9\=PEEHyV:A4&1%:dXcpBA9a8EAlNBLGka5MGYMCGqalkX#wY\N+dVi!>>>/:1QSpN><=
t1A=D8 5$pI*99?@l<mE<Jp=uqPt*N&b*e@cb!\S8NTb:p@jNd+G9eHX9MH1!<c^aF^u8Qi?p4j?pHHX:@%nd:%
HqQHm! qRyV@hb*?6auudH1@/kVI\>^@Wy%k8Bl:1&jPt<h$4/qDTkH6S@WlyID*F5@hILIjp+h*@<n/y*Tk6dG
5wM*Xk 8>PeGLmqSDjieZ$dXXHJKHVmHZj+1FE%XdBCB>+J:k@\T+ZtD^#I+@RQLSR/y14RAZ!M?:NT^@61hMAj
#64Yui =abqNNdD$y>A+An*B%anNFc#%uHTdKJb1C4yt#W/Wt&mFW5%@RMXDmhhe<+4RPt=*QBEb=ppXBl=P5N4
pbeQBT X$4Pu*b#j&L4LJRK?1t>uP\bPnc*j8#l*qJ1%MF1B5AD=nBA19c+P9!Tyn*mD4?pc+@F\!<b&1Q$<E8t
j8d%al >9k>@JKqQdIQ9&S#9=VS1dP%J\BaVVi#Z&yBeL>m^1hun1p^jI$n+@=hZeKdj%cZ<Fch/lJ?@*eLKV9p
<^$?^/ wR^6ST#Zt8Nb1p4Cd:EQ#%9BC:GwmH5SJZnJ9TnqqZKqG?<qWd?CCnSK@c1WPKn@YpZE*AiWyBu*akG?
juCT9K \L?F8Gqiqh4ENiM1PTmHml!+q+Im$e5whREaJ!nXFICEX/$8AKE+WKpLRCkPa6WFIJRHdq!^X!YKW^iA
96ybD: TuNmA5!1CY>BC\X>^$%M+4m@&WBG4m+PwWnk!pBcJVC$\I5XqJy#yb=1aXWLKE$XiI1!TCutZpK65CCK
>j:/w+ i\uXkq5y>=LYC>^LYnF\L&uNwKV%H%aNCqwtR6*AqaqaPZDFIhaP*C85H4k1$ARLCP=qC/\lFLSA5^GW
\#iHm+ eyYc?eI1:wYwTMt>EL^e\L*kqdyX$@1QH%hqE<iXk8a9==pZeT>6Tq%F/yh8XVaC/GDIAD/q?eJ1?1y$
XNtDni u1lIZRT?hBY<XBiBSe%+yh^LWX\#wu+JtmMl/6L\bbT/NC\6=X/EX4@pZ4^WFZE%Gi>qLFbmWMn^Z4yX
d>bHmB $L?BHZChT5&L8BjVSP1QqR4WA$*nXZGjq$RSJc*yiGWPbB=>JXDNI\:1X/wmC&=$mI\X>AMmqT1P@6GY
=ay>bp S%>B:ViNPLnSI4CWmQY^uAN4FtPhByWydcE5hcZ%G+SEdF8wY#A+&wK%$Sb6DX8\6GdaLtlBDGkhCHbG
&chQwY /$Bc>+twnhF^\eC\dAV4\1KPX>YC%ubKMY$YSNHG4bR&Nm@4FINR@pGhKQmNIeHA!ED4/9?nCNR+?@<S
<#+5jJ L+lP\FAZkXh%Q99@4\nWDTwT\%^NEYm+Y%MBG8:SqH>aV9%Z:Yi?4&:lb:/@d6XujpAuS+hwdu=RJ\QD
IN+j!< *\@yqH1E?%%d/MH9Jkh%!n!VA#w%u5q?ueK8@uF%/K*S1i85V9!41LM??c?KDmc^Q9Y9ik:jQj&9ck+A
\W%!qM N<#@:$4P9EBVb*DqY<QCPmqL6TaD5!:/4>LN8qku\hQYdR&LhSDyFG*tSV1aQuN#/cCyyBXNGaiyWpMh
T%T6qa Qt?i4=P*\P@Y=@?X6MCu4C>1Mlb6jk915L/pTXi$mEAG%ye%8ayCy!J1j1X8w1KDDiSnjdX8uqJJM$L4
Fth5mQ c@>KV!AB5::?4>\Eem@4G@>KT!CBdHn#Q*ITTELNd&taXNJ#\Na*@=YR9PZG@CMZiRhnZ9?QSAVK5wd*
C$+C^t /yV4ZDd!Hpc=4%P4e*KHWe#9/$kCEu@#i#1@R&%kjqjuh/k8#P@w@A:%mjq6uh?lpGpM@@teH>dw@AY1
*6@6Qe P86uP6ttRqQTYV@ZTVY=u@n8C=$<W$G^\klNZ?1WQh1@EV19>T6N$cLW#A^M4F@4lAD8J@C%jqNZe$4K
By!FtI *Q16Spi5^8Lk*ad9hQ^Sa?e\l9qdHW&BXb1@$hHSBbDD^>yCWEhLaNZtu#VFP%h<tH@Y$e6b:i?e=bh\
?d4h98 @dY@u>Z?Z1$yT<\@/qnkii*jPR8<wQ$:F$EA1ZWyqXtNVq\B@&u!m<1Bl+ynNGTX>E@Y9!qWwqPGI8Hj
m>C/ew >KBBFS$MynE5yd?D?^6?yc<RK8j8<Jpj>Hj4Kp*F#Yy1hCDa5F1uJNa+B=TC=nW/=VZET*PF^wuX9!5%
w:=?E5 d18pla5=J@#9tpLGuNWeGiF?d/^Skmd\XY4?ap%$Ay?&ELL/I?4lY%1Xe&H<BQhblW:%VtlJ%FlVRNRN
9mX614 jIe=XN4Ah+SD4R%<S#lY&yB*tGP6DZcHPKqwWeAKbF/6M#<5RybXhicFqem\p5+I1/FlBb$L%p6D4t!A
DTqPTI NhTRY:>kZVZ?4baL%pCRDSRiL#^P%&A<+@Qj&RA>F@Rj&RC<@/>5AQ9TdGDlT=*Q/9&SDhlCNtD\4&^A
iZ&w\l M\?&E9KmXK4u=8Hk+QbdRpd5qXdLFLK@@RKDQj1/>^+\iMm\Eb:iWq?bZ$Dk!PCqc=M*dN1<NTW6QVN:
6WZIN/ ?<=hPZt:>?#h6&>@%aE8?@j6&:6uh%:P4l*d5#QVW:h6&dSlZXJm\14q<W5Y^5/Lmbw%a>4pTSQGn\$L
p5iGJ: HVW!MMBQKj56=!Wth>1RjYnBk4$Hnl\>ejJ$RYHStbJ#F!=i9**9\cMu#%/?j99?+?i9*:/Z@9#%8/!<
daGcD# wwK6JFX5yc1me*ub:%<@T:>@?@Ly+@8*4%+<i@#k*y&d%/=eQHitMQ@p5eMH>8*i6TM:A#G5V$=KXM4J
B@9L<b p=>TqWVqSF^?TyBini^9j\>*N@e?A\aPHw4$jH^q@pk9MYuhlp%d61YtbYSt:?DwIV>&9?1Acn?::&>p
qNFyh/ tL64=+:54A\N^VWJK*WwV1tq/K?W@bKV^E:!:CZL68\:eQnI5SPuV8eZFy<=i@:Cyb6*:n%+@QS=Zayq
akuK\G =hWXZe4L!u:>K9*^@i9uV^@i9Zu%+mtR8\*pLmC=E=SenyweClnIQj<q%jN&p#k:qp4I\Q%TI1EEjX*e
hqQKV= ZN*/>l5\cQDR+b=i\BD$F#S!lwbl8walcuB9%d:Pi@j5!RQ6AdjMnDS8>LZ@k%6RkD<nI&+@=Z>ubC%d
lV4<9^ pLN**<HDS+FejtFSeRtR8*44#9&Hn=?>iQZtubye/T>py!lZqZZ?@a61:86u$N#4q<?jQkJ&N/=h@l@5
E\@\=H GDqbRh+C9$FmS\jZH=IDWy/*G/W*&MqJLPuV6@@A89ayZ=8<j8Nt!m?L<56FFdJ:&Z&19i!iV1k>#pDV
*<L!u% W4b8B89+p&IES#E+KNCjqjF<^cDBNZ?9myt%KZj**kPHDwPXIp&\$9MZd>!?m%cKND>Rtn>Amd>?%=S%
lG!8+4 yS^Bk%<+p5?i@DjJNDZJNc!eyJFZ\NLN^hHb:aiEiB?W<kcJKW<ZJ$i^yHijjy!qWn&myc/mikSHVE*Q
Y+CuyY %BDN&%&=y@686SK#\AiB+pcp8F1H+9RyESPSaklT>JQJBn5B^bWhE/MYb?dp:iHMFD!^CM#$*Qu4cKcW
wkL@^9 +%9K<T6\LGX@KZ?#9:wn\&>wyNRDkiJhLeYVGw1bcTtW+6w%e9tcXiV>L/qK#Hh$RawDkcKdC%JWPj*q
#ELTq6 KHb#:+&&m44$puK&PpP86qWMN5B^^/=h8Y\i&c*aw>16!88Km6V++b<$b%Pc+iQGnA+JHpqy8mDN%b%Z
Yi@jb5 Smhq:<#J+!#&yMbmL>&+hijiR:W:A5<9Z:?D#j:<1jmq?1p1XZ*9nJ1p#pl=*91D=$+\J^D%B5CRKJi9
-A5Awd 000c1830a5e001202b3 Page 343 of binaries1.zip
kPHQw& VCT9j$pF#w/P+8<T$9ekWKcKhHJ\hHKX8Nic4A<%&jCENYm!NPlwcPaAV?X8N1>dL1wT4JWLNplTZwjp
GmTGuM XDXJGt=pMmepGh>y>6!X&h6*=i:ih?ARDc5ae$4PZd\GBu8jKlNbjkKYaLJ51jIuY>1NW!XaK<j^9m:H
mH=P$G I\j*:eqFn1uWuMBiARS=k^#6uJBnd%Cq5!PT:PJw:?kph6Qa1#48?AiPYW%%8ZH#XlycpTXcdG=Num1*
iqLudq Y\/uTHBJnhj4py\=ji4pTWCT^l%WybMDpF#aij!C=SDA\GV*H/DB=*Rlt8#=K:Wt?\bCK<j!?+?c$u>?
+$=q*q jAiPZ!nJ%$n!+Z?R*F/:eK&S^<?tJH9&epcTjbCpHdXZP=XVS:EL6hmBk&yXPYdqc4ZFwqhCiKW5h?ZW
@1YZhM =Ky!XL8/wCKSbMwjJPen!emyt4YSe$6Hi!Ab&Cqp<TwIa#6#h8@dD\b:ZBN:Lq>VG/\8T@c:+wj1i:h9
>+@YZm Z:>?BtQqk89nl@j9@EE!d>j&LA%JMNiF+#H\CH4%6HeBpkPAbM>i%F#6:S!e^YJ15L1lb@KKXZKN\cyb
YZ<Fi5 d6?^p>&q!GF*hh$Ji1VGYyjnw6n=e*W=wp<G?Q9b&RHHkM=?$>htbGS6*+ZB=^BhI&u\8ZVq&p%14?CX
S\%L<a EH$+pq?@XZ@9Dk!yG6?>jjWu^XQHn^#cD^S*bHE4CLZY\BD!DmlKi9b$AwwnkGK9uplS$N9P#yEX6?jM
&$tiBP hhBkGuyApR8Y4>TaK*XKn8PPuXY:8kFBXCI!*F1Hah#<8hG%DNElWa*&!HC!!1@Lkk\abGi8J8/eSnYi
$MT4n? 8*D=K11SGm5EH1D+<VQqCKyWjXN>:j1FW!T+yC:NpmKP=6+<#HF\Gh6IXSukS%+CVe?iQi&@+#wy+WlK
>4dPV! :i\eYHEHX#VZ&5nn6*VbmqWaicm=$6Cnb4qV5a95bHiw5n8B5aKl@MF#\h#wPVMny*HSqjQJAQ@i!HN=
1#ny5$ b:?kKeA#T^N/%K1E<HwF:QW8yASe:FEV4j4cDRl?WnN<Bk#9/VI<i8nA*n^eR6VGCy1e+phi@JRK:H9&
@Vc8N9 ewhMy\>\>ATP%VK?w=$hI&:4K9Hww$q*yL/nq5T4>cm^Xa+m8$MB>Ly5B$PqEihQj9Pm=>A<aGK+^qRD
I=m8%m @Z*6j<1:n9RdtbYStdqhG*NPuwJ<FhLXT%i9e&y<?y!/I>D:BQ\WZ:6Vjtmw4:tXk!N+ERkYuDwBBNX4
6M@=*L B&i1wMPX@8SB1XVXE#MA!PQ51&XXEG$aeZ8ZP6yd5Fm6QbwC1Q$R8Y&9&6EXmKGBI4QNZCCnKVk!w<6@
qGY4K5 HSMN<Hj/Ki<5D@DDAVnF:Xe44qCnPI&Fc1m^u=Xj&M>hWHF%mWH/ZXIM^HBS*JMLaWbnuMqJc+QJw%Iy
cZSjuu j*BQ==?kPM#A1&V<aZbPnQk9nDCc^TIwdyFGc<u4NacJ!JCdakjb#tc4Mn8C>&uIRjc&c5W!NVtN@%G:
w^u=a$ DKd5j54%=A9>Fti\ti&!h&CEWWjSjNVd=c6$4iDC/P8*HL81#%%SbYmVL*YyuT<yLn^>Rl%BMdFSK\&+
T*p>Y4 pWe@yH!9u8=RP:u9AY1XMy/QuXLeBuVYl%5k9Pa6YKnYtTc8yKmb5hpKaNW=K^PhDeKtD1&qm^h1ccG:
ZEK9cF wVtPGku&GQBV4yL#X@qq5=q654d9SKWhSKYhPA%K8/Cn6Pie8:%uQ/w?Mb>Xu%RjP/QT/qK:hQ+5WIQF
*QeZS1 ka8euD%8ykcbSG=@l+Vd/dhpN@C1kH#aGj*MVcP^PVH#/&yMl%lqhleklad+L%c^ZLAEJ$NVHDM/hBTq
ItJTI/ >XQP!9pJE:Qa#LbbYtWhPZaKqZZ^MuW!LwckKRK4D?^H=lQ:5e8H>#1e/KJ?=hIF+JS@E5Lpkd*ka=\y
pSYkX+ RkK%ah&/bHLn1=V$1=D\*L&SXbtM>KjBk!y4cPV5cFRYe8IedCM%R+kiTKw/Y=Yq!8!p\\4TVy$qaI:G
*lVCcH \VlqBa<eGjSV4yV#=mMy%NSi$NV?R$hBW&h$NjY$qqRXJjRYQi5=S\mL9$9e<pcDB9lY4bcAEdu*Se4#
E/lnAe e1?G=V5ZCQ&YETt5cy!YbFMnb$ZNZaBcY9GuqmmnLCYq>HhG8m+uuZBac+CkKnYyu*KFuK^qM>6uRVDe
6#mhQ! C!5S%P@HV^WWq=!@!KWtXE>wjS!uD<1Q1k?1>*?Dt6T$HmK6/$mL^5Jnl#X?^iXH\G5>8j5X!qw9:^H>
RqEy$b GA<!hBhXXThjH%?9*t+Tn::?+!hNtV=#V5!<&IYeAha1m%wkeK5BwhjqqjRu4&qV%MwcVatl4nwq4F1h
9$yjXH tJ/=jhi8LQm^b@?la!j!C&G^9kTb=i%cbWG<AGa%H>l@5:1KT%l^AWaLYKW=<?MYW1BFuyXKBX=>uZw^
w+$pSX QRY>HQ6+:1C^WPDVZ&#Q&LY%h^:kN!y5*ITI1bG#1hyw$KCLGFWdb+lMJyQFWGwRCDqj%XBVi=jcDnth
cdjwMR IdhSGAqZ#R\NaQ#cBaVMqG@cqy/%M&@jRc1&&pC9Xl8a+66*:H5G&HX?>^b<T$5QI5bXZMA$*1Y4NiC*
Zw#t$> pd#<LVZ\<uAZ>:T#/>YV/eZ&=QZ^#1EHqQS>iw8h:P#6c?^cP#kNG\Q/m/V/1\$kP9yL#/nM:E^%y&FI
B<&y@B %&l6@PC5pkaR$F=aKFD<LieqLNdj9n\khHS\IDP!dWDR!Hpyth6#>8\@jP!pPwde\JST1$JpYWWb9wdw
KQ+P^5 \VHWmauwd6R8WaPbNDwDE9K:ZG4a#>*D#c%@j*h*D:aQ/e9&EZm+PjdbA/8Al*8%nJHyD*B%Ea5>*FpZ
jen>KD qT94B4FF+m:^tnB=&w#c+KK^X$/yTLk/W=YlT8>aq#FE#D4&mp4qKI<c%L6eLwnh9n6h6C%9j?c89KQH
jB6/Lb qTh5D&>j5CJ:F!yY5^le9$qDnF1^4>t*=F*N?!/wXVZy^\<%C\HEGP1M%G^ypPFT?hY:TWYqXL?Ql=6:
1mEChQ @<H8VB@mZmul8+8>Dpn%1CC1bT1b1K?4&MYnu>mNhTW8NYJdX$la?wbn>KF4BJn^/nWcM/a1b6NXGRwN
m=PYqn =bSc!t5Tcq$W:bnVMlm!h>??9V$1=eKFi:d6QHdWaNilw$iQ=KXtkDi$ldZ>$Md5*D$HDl?nWinTqT6e
:/iXDH FNLX>D9qi>W:%h6P@<Wd*SXZ\APe66GkX?<:5m8dXFXLnRb:mD$G>Pp#1K?L&!>aNj1BKQ^nAlc6nJq$
:<eH$+ Vm8WcyulWBeuq>+T6:+T=\y^T%e*#EZ>y5&e4dd\%apVN1X6*1C^eI+@A@#bY9+d%>MnJbS@4bX#P9j1
><=*>j */j9+KF>18Ym^VuLe$@5*uNeeD\^Ld$1w\&tdZ5PyP:iB<6KjmGaieuT^e6Yyl&qbp=%D8^4*4E/#PuT
&?LJ+w 4\qWcn6Z1#^4:jGhB+wKDyCj%XKS1$5jD@iBdw:jeLG5ql4KRqjPC%1$Pq4te%q1wBXL6e#A&euX%cY*
\wdF>@ 5/NLthkYW%ZID1dVAAc&Qtq!=y1JG:b6+t!hc4//Dt9NkkP?4dF$19dJw\d&:V>$\IClA+D%^nYHe*ei
8ELCB\ V+ptYiWbXqn+\%J/qC+:cPa4F:FLVbc9#L#:EM$eFe/?Xj^Jta9NF<?jQRQ%^Rt66nehY*@5:NFnb+4J
VKVZ%D n^1y95Vi*dtQ&QtVlA!8pS4=?j5H4+n&n%&>e9EX1aFGHJIcGbEI:X&e*J!ejwK85i/A*D!MT+iYVSwh
jThadE HyGcEJ/W51XY%+wMS5PaymHJhZ\dAncu/AH>B\:5Q:TQi><c8WH5=N\q^%e9T<@+uXGQ/llTl$Ma!5DA
?B:d$i +^e8Y5\8M%/%PtE#GDnXMj8Yiej<TXnZ9I>4qb^!=6mlpq%L>yB9C1q\1KP:5:9ni$nLFXLYZ?YuQ&yb
&$\h@K nF@e/4HZ6LJkJRwbd+TnAP#d<ai+Jham6F#&^&C&JH:P^LEla!M!E<h6#61<qRa#Jq$JCqcq6c9DX?*a
WFKicC cNl1FW<d$ZhR9$F>?:L>FHL>?Pm<SV8n56n$*^uYYC6#JTSu$p9nFm%iG5?8MF!XWKDY4^LmGQNY>ca>
WTWGPw ^@ey#bS1*dt\X5QJ<$<puh?$n6%N*m9\<KP:&Pt6lHkwyMTQ<Sj=nX\YA@1N8KtSlBLa1y#+Lp/P*%C%
1yb\y> 6P\cPq#K&ZLpuKulwYMmht!apLI>qc1YTYewX%Y1cq6d85VVIIbP4DFu16#\@wQ:D?\:aED@jpBYd@Y1
HJNnpj :BZ#qit@Mq4SVHj@\eQHVuCY9AaKlZlaIFbB4ZAKtALXK1DbVp8VY/I$l5!Fc>B4=14VTWiZHYD*pN*p
4b\nLD 1%I1>LD*5Hh^i\MqTa&W!FC^wqHLw9$ZSI+J8/PYkpKmqQHh:X%+D5=j1X4:eAhkjibn*4F!Xe!5TbND
P#!$IF \/j9*^T^LS*$CqSb5GKp&nwF5lp8Z1?q1#K%a:Xib\+iNAV6tB%A?m9q\mWVh$>b8%YbVpC^nVL^YNdi
WJ/\/8 A+ikCKN&jPqmG6Bh9u\q8%y@#iGLX>S5P!LdF=R6SCy\&#?%ty=/hE9C9u%:>?:bR>+#W1Gu9d9a%jtX
8\j1tA lQT8B4bKj%FRjFSA#K1w&je%pqBIGJqACn:Le*d/wk%TWE::a*nG!t#?#ApV^+&j5Y66bPLtDeqKCM@K
iwEQ+h >Lc\GuNe%XE1aSXu\&1>?k+a%u@R\EH5RNWASm=MmNm=a6%TSV1dZydSpp8NcVFNw#JpYD9mq+FmX<4q
cCp%l@ CaqJ8@i>1Z#dD4#%FTZ/l:6!SA<jVFqRGJib6^>QZyB9nFVQWT^^hH\lIeP1yMTZ<Vj!C%++*#>1>bL\
n#^$5y YL<uGmuWIFNHJ:Enej\MbRC6c:C/>w/Mw=pHLMNLb$?bMmF!hp4!#JXJc#c8VIX$Ybui4k=Z6d>!Nw\4
&R:^&Z $a^B\\eQHkVj#EBG4nhHun=*dp$/A\5Rt>+tA$wdQHX\>MTyW=k4a^F\i@@!FT6Z4ady=IuJKii#u>Y<
JCntK& @R9yc1KV&q9Xbu\c?S=aqJ?!c?QBA@8BMQuPW6W=m>&iT!1A4hLjKGBSnF@$1yW4q\SNjc/YSdYEqiq=
Si9w5G PLk/Pu$T@%X4\q=TMGHN+b?XedMny<&a5$p?i@tcqT6Zy/:ua4E&PKqZZe/KPe$PG#ae4HkI5B$Elm\Z
n++bmR Ly?/i@G!4VZyQ>Qdb/kXC!ceZ+AbFueR:@m1qc6ZJ!T5ZT6QY4h8@dcHy=m*:VX$cZDmXq\h>S/Xd#?/
eeV?at Su:w+MED:H+CjFYkRD6*5a9#M\uyZ!+qQpy@ahDC8dKw%e^Ku1@56Wae%SKXVPkNq8#5>FH5/cw%bP>^
+\&L@L tGc6XleLc?bBlJ$Z6W+?b^qEw#YJYDmp$h^T^*PyNZMcule$^HQwpGFDl\^lB/5G5ZK>eV9pc?K4$$9V
lak^lX t&bS:WKyePI$yNGRZF*uTwXmIM#KXWt<^GVqP6ZVht@j9KtNW6S9PZNY/*jH5yI6Kj5PH&IQ<pHDyF\q
#Z?Bc$ %ZMR8+phu$l?W:JYjk9G!tc9ZPW4>a>a6R#WMZ8$:%iNVK1R6IPV&MqS@FH5yX=^$cl>FqL9%ST&/^bF
CZMRSJ #b\iE:%&We!K>S8mMla8!>1Y9Cy?bjKYPtc>altu/VqD9aaQH#y5&NClR=nBK4q\<4K$=ZM#pLSZBn*1
:8NwqT DyH1^KpCMPtLiDTcK&89JCjI=Y9YRDSIY4>?:h9E6i5&J!i6**QqmZ4SSdPG/K#Y<@G+\l$:6l$>jQkR
lMY6t# ECeH!C>>cS>:D:Ha:Rt5Rd?APPNj#*iA9*?AVP\dEPDq/TYXBe>iFij:ZT&hTwqI%liW:TRYj^AH%S1+
a6BFXy V\A/M#%*^FYGt^bES<XEVa?bF^e>a@Q<1Jm=5&jNtnF#V9StHR8uBTIE/lGiZ5PHnllBmaPS!=hM!q8%
\aq\9/ dF6X?w@$nn4YZXlMQju&ZZW%j^hyJ/=JZL5&Mi6Pa8Icyh\&MTu%$YPNeZP^C=Th9!L#SEd!<cQAtn&p
-AjF&8 0006d330fc2001202b3 Page 344 of binaries1.zip
!et#\< Ppl?Cd$kp*B!jmRlun?qBn/RXW%jFidu^E1N@aeNH#:CW?4nP*JSbKqW!IpGPQ9ak/wy=&G+BqML>@L&
FqI+5m uWihtl/%=k1uLe6nw6b6YdwpInMnhZ=W%K^yEXQCb<!a5$y4+SnDWNqnl96+D9j$HDGCHcac1lwmqE@I
G8M5A1 ny?@yBIwh<B5A=P4+!hQW+jtDqa@+nLJi!tJmiu4%mc8j@j8?Rb&nW18TqC6dyb+mLN\G4A9uphX:%y?
cbD?pF ju9GpYQHnl=qkVZ=48jk:Pdw@BAY+P>Tqb@Aj?d!+B1ywjjkkWk@I5dn6%R6qR1JCA#d$hEF&ddXtDai
AR9@yM ==W6Yca=yWRQ&WCbtJw\K#blT^1d&aGiw%<\ci1$MXQt^M:lVB8VcFS^4KiQ%+kSZpl*?LBl:FDlqKXd
u#\LL+ =<btIN98GXqw&AelXy<8RG??1uP\EJdjb?q4%!c69@9?@d6*L%<?jZw4X=:A44bNP54Fc*WAP%P\4Dl#
e/tlw$ W?1J+$n*CNw&?cyu:?Hp:QyARwb?q\4>AkJG4ayWTE$G8>u%:Dp5\D>$myPdX+YWE$1=SM@i^hHStSY@
l@JttQ B<J1p<c#E4QmX@#BN#%n&dLaSTuydGd:nQV$qiFlw$Mu#R/jPVepa1$tkIF/9cW?uy=Td++\P$\+hH#8
AQ9^Ve 9LmNFiDHLhLTNSaN/*DStZQ1/KZtC%p#TYLZhq^@Ekt@jj95^wcE6jKX1%i6!>6:Y^*AWL*!:BMd6=+?
dw$@\N maVbw?\S<puk:tD9hE@!Vc4uE?C>PqRlNZQ8bijWd&DjAL<IF/mDSqSLlj&ySMwqAlhHi$iG+\1t#K%Q
n^+FB= 9u:^!%jyeEY1Gbpy1/LVwCy5tyE?Qm^5LNn!4QA=w$PC\%b!aY6=jIT*H?56BK4AqS&lD>4Nt#W=6l!a
c>FN%J 16Lc%lw!?m/GLP&^i%wB9:<Dhu!dlVK+%h9V!b5P9Z>@cjt1XYq:59bhyVELXH6w&iW6KahPuVy^+nl:
GDS#i^ VHXWBXV=L9bPh!Xp+Feyj$lCwFJ1PhVJ*5NXLHGV?Hp9hLS*/PW\YEq6GTSTJlE+&V8/INpYLyB=>PhY
$lkKIB Jq>bBMa1uWQjiBCLF=&8!G!#h6#amiQHla<jN!h<*1nk+MCk8VSRLbd/T:&<jH\+15\I9iEJp?hqqKi4
<15H\J wLcwBLI6M4LX1>LJ$+ZFJSCwd6:YpkY8#H6?+91u#Q9Y:?+jTu%%8inl9h54Xt:I*yC/K8W1F/qYZ%&*
6$ajL^ PmZ@NHJqn/8ALQuA:?ZpepeCSIe8u/CW%869:?a5pZmQGik8uiVt+tJu:?#Rl+ZE\^Wp<q9C6*h$XkLS
/PpTHD =nV6WK>GMn>\&VZ1QTky*ME/jqbWGy9Fb615GD6l@IS\QJ5>jZJacElR$MmATcBXQ#?b6%Vt/?QDilM9
T>8##Y F6VKD=&dZAbFelZ\dI:&8=9tX1eLm$w\P6&8QTEDNIWj%1/@?PED?::h?a!:^?@iZbh<<j4!NVeKV1*h
&wh89+ 5HjVcXD1=8N:=h5kKAQVp&DBwFj!pYjuiB519t>T98iwFWyy$<FPawuE#h>9!dAl\Y+Tmc8Lk:%E:DdR
H=#AkP !S$E<q9C5*hWmN?Jt:4T\w>#Xd<^NBB#i&&AJ=9JbkpYLNtb#Yc%#F\#j9!ECiFS$!cNt^I?Bp<%BRWE
Kq:6W% B+/bLk8WTu%q9yTyCykKSwVQBbYTnKwMTCZVlth8*\YimqppSKb#GJu8%nLF\<kjp=I&j@#++eQ:&\iK
mh\=pi H>!>D$u:&bR%N/=jQ*M/NiuT\h!TnI8L6^+1BKweX?a+iWNed5K1A$S>b$R4yWbmN$q@q>:i!?j$DqJK
C5EE1b XK+mS#6Zh+>ihw/@JMTyBnmPeKG4DX%ljj$CFpE+WuQp#typbYeu#>8+I#5:K!6#\pV<N&jCiD\%E+bu
NdR&@? MRL<Rce?Wl@RKLKWiwQ^5y+<Ph16ttRLtm6DZRBPYuTt=PIXZG#Wb+Dj$uMc:W<q4V6AYSdi8Zj=\iYE
m?NEP^ yQTT%B9Z4%&>Wq!WtqB\:W:e!t*FleCTQW%P5TjbE?RbERNJ>&>Tke^@\m^Gc8RmeR$aH^$j:i4tXmQS
=9bbXC h*X#/8ua!?YutmLaK%%m8CkWEETnpH4@TWbtqnKd9*CiuMp&!Jw$eRLWCSHl:LmGiBS=hGlIeLC@4=?Q
e5LCFN Z\B81KEEYY@Ym/!8kB1+MpMB:J4n/4Ju*!E8BJYe\&B:Z*6??\Pil^K5T%=*nQ%w?/Hw@8PElA*4Em>j
H$bMGu 9u*n^nYkh/Z\dQcCLa5QqBRZFSakQSZRI!jIl*JA@qFCaN$kR+Gpj$DRAqb1PEnmH8AuHRJXRKXE#\%!
6#FqRX SQFQTdYaESQHV?IYd1/%1/l@+N\E:d/?hHw&ph&8q^$*d>EYN48%jPLE8bE#y+\jH#b8LFXnCN&i+Pej
w4%9<X EPCuweq+<:\k/9A!=4F1w8*V6!@Q!XP:bVH8!MA>d=4#&^<?j94$?jQH=HZJGi#Hq6j9*%/Db&F9=$Eq
MwHX*e m*1<jPuT8RNHe9cXuPGaAqZ&FDqJ*qbIiGKuV@Cnb^qEIXYA1j@IKj=T<M\l\@8=TX#LJETM5tCAJ!9t
R49QFc PVq?FLh\$41p#C<\1A=QQGuK:9k:P!=/#kJ=K1l#+ySyEYC5+<iy%atuekICeT8Gt1kuKLRmudh!Qy6S
pmQmP6 AWYTI1*F/yG=uE6C5uDt:HqeWinP96je&XLte@6*iE=6>=PQD?:j*:6=<=Zdq&@hSGPFSPHT^R8Z>pK!
H9GQMK WI#YY5nt/&&CGHTcQK/W<N&kZyQ\?@h$BD4>9$4%bYBS9n:8L=G@ty$D1LH=IChZHY<Mt4Ktqq=Y>9cc
BV8jBB Hb&Z^</iNY@PFPAGATh<@QlcHiK=6<AADVeyLmXTJ1$tuVhL!<=tYhB<>MYnJ>AZ#=/@jKPY*Re<l/@<
eNpDqT $8ywM6BL9A<yLtV&pQDhyP^AlSe9uD>@6kVbMaZ<ky%d&H^!t4\EdudP\E$k:hZVHel=jwEM\SeC\T6K
qWAV:8 G4ty^LB!ADpdQ!ju9ny?PHLbY8*i$!#em1Ha?hiPlAW^5bpSHD%kN&+My#tpF^Twyijq^jkw$=l$RWda
C+NlVS wkX5By6BMt5+lwpnk@iw@dGw8PV<Bh^b?@ky*cd\+TQhyQDZq=LW=M\QD#mG6&@ZEwRT=6#bpnPwQ#DV
lni5QL =K%5Aepu4/wpk9=PV5/jJZwDyJ+>:aCn&*5yGj1cEph?QHFj%9G#&Lc@VPd51ubCZ:w*5=aj*SyX5+8*
$HQ>9u e\i:9XXmLV<\VNAiSFKky?WHtS*4T#mC1jMYLGR#XBq5Jl=SXcdbdF1VEB!B?i\^L8Ke9*SL!^C*DLFj
G4%pSC Xh?a4^&@jQ4+?VYaKPWIFkwe4*BKQIhKBI=FSa9TW\4AWMq#wCmFeQJbI9TTTl%:Rk4*V54#>unHMWiP
k>$EmY im+!KE<?m&&p5kCJC?S$*PJQh^Auc:jZkk+4h\q^#%BtJD8^MS1wXwQ$*HBRAKW+u5XDhL/WwH#6\8Yk
R!Bi\j 9\^qyyITdJWwV^wZp4Z*\PFn+IQFb</h9+m4wyakdlhm9yN9:Ne&Z#=@@9Dw@9&:Ywa/Y1RW#\E5yyC<
VB&D!@ 4=dwiTLBL:Bw5FK?T<>i=bI*\LDjB+++bimNDL?I@*KS!j^:m>$$Rea@eGRILIt%FHGHY$=8dp+P8/5=
@=8jW1 *S/XPW@ZYDqqwm5G5kGCJdn&!\lRbhQ%IH%jHM>tKECXLIVWq1q!iYLE1QC>B\+hW+edn8y#dl@^F>#<
ntDAeF bWM*j**??PHJQVZQ/%CVZEbNen#bM*wqB#N&F4NFyK^GI8\4qa1huaHwIBa*D9WWX$LAiTuqDZFZ8yY1
wJcF4N ^eBIc5Tp6$1temKPZ<S6B5qpjtJu%::WM!H5BAbNlW1@qnB8#<^q<%T=BCm4hnVEDYG4J&9M6%c*dKA\
D/HPwT IC=i=8QL?lGbMp&XL6\1q/?MZ%nL?K<N\Dl$%Pk6tA/e!5ehN=h9*cuD?Q9*H#>Kj@^k9#j:Suq@jQ@m
=8k4*G Z6$wBBb<:m^dwuj8:N:5uW\^iXMnAb$/m=&?TBky$^Q+Du<P88*N89*WmIPSKMR<F=tGMTP#eZB&pYn+
45?&SL BkR6A4+dc:hR:<4NXRDhNnt:huF:GDNTI5Q@WC<+/@lq<SCKGD?p!54=<e6nc=t!e65%keGl+@b4M+P4
NJ=5&6 N#E^iK:iP@$XiCyKt>M6t6#&^Zh9:1t%i@Y!tmb#X8@<8h$:M=p#yFRl$jiWTq*e^E=jJeRDmSLuKku^
uCtTm> jmLqDZL@1baA=ip6$=P=my$e9+1JG!P#Scd>ICb^MZeFLCkdN?68F5>nh4N=VZP%ZNQVW=hM%CwY8dJB
N%?4&H :HKXVM<*\N<j8I4T%<4q$%J^!iVI5tppqbHdBkTHlmYD$?I^lbJ#%#m&L+H6J&/uiCu#p!*>/\jq1>+D
+ILJ/8 >?m&Y16c6WKVp=5B#q6CKyWTWS?yhITL8!6TH5bKlb+>i@b!eK8TQJV!QD*K6AJlJEw^*$Mt$@N&kpwW
%eA+j> cA>ubc&p>p+8p9+$VCH9%bV*Xk%9*D1?t>qDkHwnNZN8e>!/!b!T\cTD&bH/m%i8CA*\p#EB\H8dZL+<
iLlpVK aei/8T!E1l1Ph#I4d:p<aPV+tJ$a4YkTj^YY%F4mhFi%<yj1b=6TWDXq#8$li+KHF6VlC6bXTB$&Fi>J
Shj*T! b$9IYjJDCh4W5*h%q#l?Ba5Y>uh\hP4qXk%c9!eqk!y4yaK<Ybti9dPLGFmD1ke/m6&$eT5kGM1XhS5&
ED<\PC d$&luPq%AhX:G8@P\\5Ch11*4iItndm^w/qX5<EG+%i6ZPIj=C?D!MYpEVB19Rpdh&VF%DIGQWjNtLhp
4QZ8H4 $t:8PCH\9RLXGcTBqP<Z*C*@p@&q?5*?c9K#6LTYMh&4hE?>BF%pL^lh8X^<<QL^6LQu#y+qFa#EaISW
:AVq?d P6Db*h*NDmu4>bYI:i*A899jRW*ZcPZBTBm^\FMtG/#u=PIm6pjT4Z1:8L1+>S?wD6cVX1qJy&XpRiTm
#jBLA& F*95Wi=X:YuNEcj:4nQWG<@YlHQ8HJ!\i4W5MCnIn\qp$k!T=QIFm*bpd^&H1^KnJh+/JZ%N=CSMuw:V
cNw5a? +!4@I9:4%?@jdJu16?1Z16TcZk9^Td&ZFZe%ZWM4b!?K\N#ZuL=!Ia$=S%mBhIRE/t5leHP%h@ptId&B
q4DwTq P>C^e\V8\&>BEB8wK^yGIyB=8ZnAetK9=?#mdP@<VR!SRKb!6uWST@yyw6p<KG<k:cmXAF:Rw<ALijbw
<SC?#F 4kZJ$8\D*dklKRyMQYTJQCE/ePVIRF<Mc@K%cX6b8VBmZh/GTapcGVDy9LS6DFn:^uYVF8:Y%D9uwh!=
S@mYWT >\C9Y$IleNj$XJi%@1&>GPRD6@Z<KS+!9aF8D8ZApX%ZL^i6a5=DVJMKJjaidp/khDKau8^^5ZP6pq!V
XMIT*D <uZq\8DbYItD\FZ5CB1Hn4KYDp=m5RjN6JD^5yX!#EE$nQH/q:*X?>4wENb1HQe94lk>Ea1VkKDkIL>A
B?u^Bb mG$K8j/Ccd6V=w*L$uBXyyMNnH#wnFX4Jt#Nk$TLW4$ABe@hB+@4WC$4K!?9KC<9K/5q4LF%QFy/>>dq
mP4e&J !=CYJJ??jZ46WjaCPW@i+uEnP%eQS\hawL&AeT>uJ#5IcBe%kqDmGWwji&i?C*RSE!pnc&$QGSmWQJlX
18Yy#d TyF4A5&*hLu8&/ja4>yu1:qTT**%lQ4WdHJTWtLmlICR+AA@=WmFZBm&MY@PDClj6XRV\dRDq5bP&Jtu
G9>Ned #pPK#%@m1L:k1IJqI%NFSi6!DXHNlSQQ8SMjtJje&4Qy#6t5lE9MBjITYL4a>Zb&hQ\mWW4%9H5/P8Bi
pet^&5 QjhLG9L$QK!#uT9jCd1IqdLY9ucPau1kEKN%RQ#K%VV@$HKElH:jj5YBq8wL:uLXX@6wdJmTVAkaFSIa
dVwcN& \AT4Sm4q\4k^??Knb!8BJJ6bDTTX<nc4@YdQ#FWjFm$wPueJF1k@KJbZXDCXdIY14Lu/i1%Q>JwCc4%A
-Aj>+k 000717e6e40001202b3 Page 345 of binaries1.zip
my/8W@ <6/hP#hYF>%N&/1+TF+^W9*lQh*hi#t/j=EwyH#Qu4kY>:8p+W*Q9Z4cmX*+hw+8Z<RKYW8y9R6*JBTm
18/iB> %Ln+FdAeaaKFBHE^Al*8b\/Rk<\B&@*1c\y*:1m%Y1T+Ltq$RClpqcPW\a^eQ#F\^//R&hpe\!15jPT6
I^VmaQ X@k9*epXh=Rk#Ve+kq?@@jn=1/!5w1JTYhY!51Km9E^:Sh1:N/>i$6PV!QD8H9tn@bqy!p9pIupHK+?D
i\1d=6 w+i>m<5Zip1hN:\ZWB^&YW5ePcweiK:&QChuMFZZG6pAd$iQQ8yIQQ5Qn6SP>^<+eQDkIV\BiGC@#1YV
FI\>@5 GYt%NJeHlw+PGMtG5KMI<BSPmhwdpbmw!PBubGbYRmAtcVZ!q56CedME*eqZhP+mLLn*wVy+@jaDLLjI
n94P5Z 5:!m544KyqLNp45pna9C!QL?4YY*:1^M9<=i=q?/jJt<kDDV4%h9X*9H#@SePt<EtPwqDjWcQNuc*<=X
klLw$X :ICuqwq:6c!q4@yRp4jQw1ZLcXaBicPG+4=>\LDtpM*BYu=cR$X?G$aFl+$eNTyWERIBNmFp@?byMVY%
Ei>RV^ *FJ1=IQZ4M:L+dnqF=&>iIZn>wy!K@&JNqybXXXhZXNhZXYqbekb1ydl%8#HG$?ilJYY9WI8p$i\h61=
\XPp>& iNm=jbKRAXXT$1<G/ZGW/dqpi&hZi?hQanKkYtadPE^NdkGTp>iT\%WE%HiRPcR/#B=1DkwEjy\n14ji
nnCjYJ +&dI1JFnSkiQG5&Ek9:p?8PV>+*hty/8!PBqbJbq<NI*Xe6dJT*u&J$<XXS!AXjRYudkkbTew1aFpEN8
tYB>a8 NNKw<!Zk>8VSlaSu=:j68MyiEX!>e9WKic1TC5Z&9TE?A4hlqbAjipkp:5M81kunGXT?&N/XhRS&\/6q
6?CM8+ @RJGBR<ePGVE^JkFC=e5^#!lql$%VnDN\+iQ$LM:YwL1cIw:FLh5HlW&Nul$tHI$G/1Tm&It:I?b9$TH
j>B&K@ Z*K%9HZT^6Se1F\QH#6X1Pd*yJajK1?/ywbS5DY11tcW+jh9Z&wbQu&!wjlb<1X4X/>hW%+qF@YqI?#h
ChX>*V *S*EH&GyPKFlYmWS!d#5ZeRPVm:ATqw6c^WRQH4e^CtS5@?d%aEDRK4tTFQk^FFT8^#1dN9YCTHnRpNC
&bbJY? GKBpKF<>hhiPKc5!phDQDJKI!61\NV$:b?<ln5#%PtVAEyFLnWJX$/\c6QZ:F:4cJ!&Z9b6j=8\?iP*c
YpQm#l heW%ep%j/8DaG?#5w?TtqC>&qH!VCnq1iK:Z\SE5$Xu<TX\q/?<@W5%qj6!T=T6yJ1jLBSXE>VN9>p1P
wD*N?l WG$M\W*Q!cQHnR5hQZdMGEYacLS<i9T?mjEdYe1uT6=!LYY#=/Cc#T%I*uVawGcWC68c@BNuFVYWEPhb
u^HW5! HKGZD>MjQWk>ii9Gnb44=Cbp=B:Pnp+jJHipBq&:&>5&MDh6+FCKMRNJXp4+A^*A/FTWWt@@pcFnJ$!P
q$qSph uB$NqDBS$cXEdR+aHjK%dX*Q&EBpNjpRBA:kyFuF$%LHlIYHlmuH15a\aeL=M@e5u4PAWSQ1q:llT%4&
<+%Pm6 4n$Hn=+5LDq@?R>CaG1kHEZN:wi1E<6CydNQA1i!*#>@%HLK#u8%>hmFt#i4d=Aui5=mmcQ#B\n$>/Tm
#*GmXW kT*@ctSm$4kha<64:XptXdP6pKme?GIHS%aMkhC%T6bSVY^Y>L#@JHdw$JEnG/&5VjZ%#iw#q6a&8+Ca
*INmRX Jn*JVF</h8La5DHn&ZGK5jynF1@InwyNR%/@Mplcqd^V+u4K:MDSp\Xu#pQiBe!i%#IDVTpWd!:<VB+/
D!kBmq hP8*R9bM@bL!CkmEct49*=:h>iyw#u:&q9It@<dNt?Ttu4&H9cMa!QY@L^Zb6Yqua61k4W&NLc@X<Awy
Y9?FVW S=!iu4X*hKLe?qdJ@8K+VXh#T@kZ6<NHJ6T44!<!4q>6chpwp^Ln<84\<SQGnFYPb<c^a@Yt:Jp$h:tT
kEa>^D a:YqT6+BYKXtAc5n@=QX^eijl@m5iF?kQKM16m#=!bGmYjTJkwi:D#G*idh8K&/SEwGLw>n?9aRMiTAX
1FikwA >tuV#6C+bdp6BuilC/XcLlGA\8\bbDPpT6dYV<$tcq:eam=@=Nlk+wFPhZlX@jy/\nJLe:ucu*bpV^<Z
P\DZan MZdeiCbeCTwT4J&#jLKC+:G?T6+?eb&c^\ukecpPD\nlaHdQuu%$:uP6YHFGYY#?SWQm$@H6d>L*=:N*
LIhTt$ XLjJHeX6W1S!=nt/ARuQB%K>=t&MnX1W&/y5!MAcmA%m=FetkjVRRappyH?RmK>DaneqeeT<uqBw@69T
@^Zlyi NJEn5ZQd^Eul+iQamYRC$lA5mb&%YW$m5W4iLuHhbmC^G$npF=?4R?Iu^Pt1G5ZlS@%:u!=ED1wm$!@1
%@G@!y lPqX\eY>lhu5Qjb8#S%!uP@w+9^PR4\jT9X5de\6GyddMnaA*>uP&huSDiA:PDqT?L=X5nb?RSV?#D@k
8kZM!q :>DA:&llaGD!$>Ka8u@84wn\TSQC&WpMwFiE<&epLK4lwK@SRN>bC@&8B9wQkA=89?Hp1LA%STB?yyky
9ZAR#1 MkG9^+Z$VG4?5V$*qjhX>^S*TVFj:P#&V9IR<9EYNyatNlY&Tl6my=TTAc\n#<Z=6+Vu=KkRR%LuW9q@
t+@w86 IwiRjGmjlaYl95XQT%MbZX+TImbNtDR^IwIB:KwJ1uBB\8LWNGX/DT/T=Spp9bLDu@p@<XhZuVwXMi^p
QY>Tte MiBuEZ@lR=4tQDy/aP?FW?^D*9$H!99MQZJG=jJLR6#KIYTB?J$ctBp%LkMYpJh:8@T$A*yA\6qJIc+T
&5cXGa E?h!CFmX56b?RTFAbN4@IlJlLBKc@4BWHSD6*:h:/5TJp!Pa!T4kwb\wpCip1Vq5BA=yqjLY@?L\RM5B
Xl:IAN Rt@%nYXT><$5XRFdyCw$kq!6:NjX>hpZ<^?!n%RQqR@IjjaB8WCej$q+dm=A\kNING>wc6peTSBQTE4h
1Fih=: :i*FLm:eYXwk+RRpJQ<QElCadE^Ella@LE%#aHGMuS\^hiwW@MeCEeWpRZ!/t5a&PhBI?b<$QkINGyGT
u4yXV6 p4\uHYGLXYhICc8lWkEL!a$>P<>j99TEje\?1uqIHyC4^QY*lP@8/AyMBkKVB6btnX4<Bt<\eJBK9eAj
XNNE&X ZClS=^y^6bnukQwaWCq4>j?kat\5M9%8cS^<?NCi/bPuVb</jhw$hm1b\p^tIumVN4ByGFqJJt@&B8C!
55nG*X /d?+QPT+jPP+4Fn58/GR+<JRLlcFV^W%9<>pF><+?@#y$!hQHkMj=TN!l%#<JiG:P1JyDRe8>W#M4G$w
/>GMLP q:?qW8hin1+8\JZu:qk64lH#uB*L^MTVeku>D!:$Cp#pa1S9aA^euA+jtV%6&w#I/bHVy:QASkX5iBM!
$^Z?YP %F#Y</JVkE6TJT\X@!iZt8nlkW9PFBijPXNC8VBFl6eXmyL5I:h9*u9BQFM>XV=SQia>&W8Kj$qW#tYT
>d5eS8 B%KByd=F@b?&4I&w9XS1*$95Ikb>8AIHlbn9+kkpKwDC!Q@!e?+m$9$HD^pKpIJS%$PHyp?dMVN!=w\b
qk>wuY dCRBF5^W@yVJE^tkwM#kbT:tLew1#/mR6@yQB8?AAX*4cmd@NYaBKpNXw1VKML%ew#mRiiZPScm*Z#^@
P4IZGM #n^nu\1iQL%^mBV@qkleuJ#h!=EFn&@XwBSYCXFH1SRKc:Ed<pMT8N/=qCML@@?dBa>ulC^/Hnw$NZLt
FIiFMy #Nt#b5=pKR@qNHB%npNTLC>i\&HLu&9EC^$Pl6cS<S\H>HNaJc:Y%P\w8HQ6NY/CjjtCASd<=+Z=yLlM
h?HAMG IuAVP*GKEBDDSn>5>Y^/TWe+5KAFQyCncuB!hC4VIVD4j^DRJ@4kFRKjA#8uA@LbbBa#W\WM>KbQt#y=
JQdC8C MnJkM9ky1?d!qtb!FNd@*^SI:\%IkcWWVI5i%9\?jQ*G6Vh9kMN4>mZ#R9Yej?Q$GZIPKVlnbpF/A\qd
Pyim8^ Rm!?&\wHT+e+m5G#Kd615XI5eHN!wIH1Q*m5$?EB/%%jjF!AyVD=\NbypbH5LHa&@AetiyHVy$/b\1Ry
/^m+$c $6pM@1L+GTRiQCK%R6=Gt#!h!D@#H$SGESJYZM\CpSwka9C>?59^G!Z9Z4>t*1li5/@aq+Iuq$+ADWn$
<5WXih Bw8hHbBHj?A^tQAMkajWy:?n&BX$AST4^I^ad#ApH5mn*^<<q9&L^?E5\lMCn:*:=hPt#&Bu54Q+5?hR
VahiR9 LwJ=$/bPR!K1DMGtXR6uplZAbDQHJP&Q>EtZ!T6m=I^MGGDCFk841y<eQ*>j?XwBSFT9BJjQHV^H#kIN
%jAI>H 1a9aCSiPwjiqAlHl6!!%FZd$<iuuDCaqRI1Wl<#b!SGn:VA6n<k/KY%cLa<n=wV*\%Ladh??XXPuK+AH
/JK=JM M%5%T&@n>PuVy4NyNiuCnHS=$5yapkRp%qZI&/*qck@hZQdF/%wTmwdE=B#EJ$XJ>Su>1%XXV+w89qG<
1nXpm/ b6?w*w4i9H%Vi4Zp<GX!6pKm=!%%E+9LIAi<J%WSakMp9H%<i1NNeRS^Z+Ti4$#5BL=B9C6p4j>hhG!y
nJl*Yi \?IRYGcyyZDZ*4$Ly$%XkpKaYc4b\ntHb</IuMH^YCNQY:Y<HM4%6Vw$n6cq<WXDR/FH<wFGNdmHRWXX
IaRYWN %j$LliDdLCmDjc8u8Hi6?C/=XmpS>yFKJbTG>#$y*+Xa@dRqHXpjqR6^?m$SWwy$E+VRR/bt+k6McNqi
5k+mXj y!+EJyq1JqBkHIwnSn<6TXh&D@n&qMlIbkaDbIRHD5?iPYM&ydJXL5>c9kwKJn^&6Ada$H1hFwVI=41Y
j9Hpe8 #ZeNt^NpG4CyKIFF<BydJdl?+>S4JhBl*8m@4Xc<8ZH%LdqeKXFJBb+Tb/B#S<wjVq4?6mW6GS??m!9E
5H<Y#F L*&PKejGX!aFNtBhL8X1N84CjhqK:mBEHVcHh9F?YbL/#B+D!td/hQB/aGT\?PClYVNt#E=L1$=Z!RY4
c:\AJj M?JZpQV1DCc>ZE$HC9cny>V%LS:q$/XV<+X*/e!b<lJ!q1upZ:%VwHnFkI*yj/1yiZj=^l6!quIbKuEC
E$wW@H L4iqQC>#wCJqjFkZIPInSa/WmEwtGC=&XBP^CS\XN4:PEak@mLCHiQ8cqFu!LjL&5L9=$/bPXW=ukIul
Mj!FSy #Q$HethG#ymqJ4Imdj:!tk\FydF^Y@4&uL*eeaj@yFFV:uaPcXRAnR9Z4!yiKX/L*qVZqL&>hQWN8WJb
PamhAl DHJ#^1DX=/cWhKt\=dZ$WqIiKl?>aeBQ\&MR^<ND#YQTXPSSi%SI!?Mk<8AjQBBaaTt\#61>t<%ny<IK
p6IeT: PF$bcVln*::WthMnb/y=JG^hKFht%KTVdSZ!qt8TN\GXZN$DRu>RaYy+G<>Yq9DQqqW!Fj!4N/+4Z4Kk
RXdHp! FQ&1/p?9C1?<JVewtV=8#4m#dhANKY>E!&yd$19Gl?@5+pdyDJI+8&nw>Hct>nYwRtd4^@GbWiewX%$?
Khq\L^ ikeQHMm$14dpi?d6X8bBcnXXMR$TqEnS*u*4I1eBw!1PWQ^TXWbqP6tkJyT^I*hjZWL9hRkyc*kXEI1b
GATJuE 5:#HqawKj9Gq^%ZATQT/184>5=Kdd<mVKwt?B#mF1#MGa<?dWpN9V/@BZh1&chQYw<yHBcWWeP4LSRCS
ekPTMJ &FWte?MmM5T!:yD@@6?e/HHI9d6!pl!dN&=5M*5Q$54qVa/wBtWbVN?#b#Gp^DNAV@1ye9u!6a8TtI#1
LwEin\ hLIYic*dqJK=I$@D/<c@iVE%^lXjj*^=kF5N*qXY%qRImk1i9&SjwL=Wqc1u1k9pNTZZX!y%e$F!h/TC
FMw:CD +b*M>Skm$DQ6PKVTl!>%e1=!b!RmD^<jwP>KCjdG&++l\ZIw&INC^wRD9Vp^iDD=9?n6Gtqn\BB>k!c!
eZ&S%X 4Z9&:GcAuCBu=/RIhp4XXINy5@L!wtEFnc^K%+hA6$/?cG$FqI@q6H#<j=D:9LCVMa<qA8P&<=/#!K*5
-ARiDp 000db8af142001202b3 Page 346 of binaries1.zip
N!k\#N bME4B4myRHMXFVh9q>^>Vb+B8aFT1c5#dqm@L#Wa*4bqjcKu#!eMZ<Znp+:iaJVi#5=q:1J?Qn+kAw:k
!M@!+# RJpMWp%K5D&5SYQCI/dPuDPZI=lWq?APmcWS+i9^CANanH%#<9J\#>C8#EpSXYCdw9p=8bFVJ%N?G?Z!
YC:Dkl nW8YR^%VL8?Y8B:!btS*@HSSHZdep9Sn@bZ=iw$cY^1atJ1a/R9J*J@KCqY=+Eh?$e9KF/1ZwueXFR?8
J:i!hY u:u>tu#lTV^1JMIlwD:MQB>K/*h6*dbF5^:hY:h1$/FDy:<:h8#R6wXJJ<bH=e9*SJ1Gk*%>\W:hJGIZ
iNZXLd lXljQAVYKphHLmn&yK68BFR*e*ZPC&maBnY1b&Hi5pW>K!94Bk$dN&#RwJ/F9mhRbZj^W!hNLJ>5NGZq
1Xn?l< 4q%VI1bMubc?6Tbhj:%e9tZB\k^PtZ>lYyi=M&@@acB:>p?/&&+<L#n</MPbP+<1qa^KV@Hl^JDXdAXd
nFPjeI L9l$?8VL<limV?ZqD<=i9Q?KqJ5NQ^=&@jYlJi+TL!D5kJ55i#?Ymn1&dh/1l$9Lnt\Hjt5dt&ydRY94
D*1HIS +V/5L*<EEnaj=88Lc+Bp\Q4P&\?9HAipyWDcAWt:q&5Ty9<muV8p94qX!\/YDhpGjC5LC\k=X5bd&X&C
M@!%J8 uX5uVm!d*DB^^<:Jp!KtVq64dtBt/Smcqy+wq/jPtJ$NqFQK=S$k=<DDN^^q#Spitn9>&Qn!$I&cm68q
k9C*c> XXZqn$<WFm9Q1IyM:m:>lGia*^$@CbYS+nu#R9T%4P^Sj9HLX?T>tj?e%/euZ9?\d=CQ%E9mbI>y:XPy
ZktteR mW8d?t%/hinw*LqSC^8dMqk68kHuae=P4H8ql:t*4/?:w=P:?>@Pb?ThWuJnSS/+pD5/8FSA9p6Zep$B
95=TwR Fd5wZyj&uH4G>Xw%cjSZE%PLu=aGu46&:6k\eiLp!SWSDXP&d=<<aiLW1T$M#W\M#C#EG%jL%&R6tJIF
1\Vcu% lDiZ!>5t$TTL1$H1ED=!Q@cl/8qLS4u8XEFliVH@#IWDdJuk?epnL!1j1%/Ij9+8i*:\!J8Z=K:b!JCR
R&D@%F KT?QlJ::<Pd/WIuaCjQiy%KDJk$:6G%q*<#MXkpF84CX%Lij&LuM\>^H=8Ql:Pn8*5Pt<#?Hq>wp/Pip
hLWPqT 4l+thpK>Dm8Z6R!EXEYH+Bw6RVPVB6d%Yy8K4CCj6<naEV>^AlNSNepkNV5%apL+qMuY4IE^=YjSKmE#
/Wn+Re jm/!Y%e8d/qP89:Ndu9m:+e*tcP!e<1m*<ZCC:@KdlTiKH58K9*%+@Zy9c>jpp6tw$JCS+&c>9l+<IWQ
FDD%?R WSBlkJZZM/t?nYF41++N/u&^WhpKZQyAI8bl:m5d:8E1>uD*5Y9VwEZu+<9$G&+=Ppd5nI!p=dIY5Dbm
49lBA8 KntLMq1labTS@dhiQcPG^5cjLQZCFp/aEFE?!VA>M*HTlQCI!jXF4IESc59WZJc/Nlc>MdFCd45tGZIX
VEEa4F DbucM/99Q5/#j#mVYVG9kCu<YeRYC=/hL<kHKn>@jZl=>5T4q/VRVPKQi*SHVZy$QQV5l?YkICDT&/!%
<X@\1N XT5#&\<&@Qc8LtWiKyuyAHe*5aiH&Ep1dt@X5KN?<j4tGeetPtI\di/uV4#?JLFRbGXpJZy9!i<$MX\=
Xqma<@ 1Z1meZ4G\wpV\mhNT9>LZ<RamE!Sk@><aFA8d$EVFEkb@<Sj=Qh+!m&j<!#k@%:EQ*PyTQqe>W#^ZQXV
YYXLDG iPjynj\ZL<k=qeVMZSwK?kmi@8l\cMttcbM4kaJiA?8Y>T*i&9Bc8bb:GMDm%l9Cw+eH%CSPA:6$MVhw
dGRBQ4 $iQli686$VLQT1DR#C<Ie=RyiD<qKHqZcM<NG^6dGS8?6SR$unByW5%EhpKnmLV$tiHl+!bPTp@jLNEZ
^N*D9= mR^FlmdGB1b>b=PwT1DSLHEhyCZd@/V^/6*KbSeYlTwLFIZqSY\lY!R+e?u=<<yuB5>LT/@i9HQ1?R6!
It=%Sw YmuliaW!IcIJD\/GHZ8*b$i%=LqW&EdW^4BS5#e&yGY=B:?QVMc/<q$<QJSm9pPjNpc64B9$Kw44HJM+
SHKPdC IckcTjnVyPSjJHwI/kqN#h>a<l4R+:4KeIMy1cun^+$jN*GmM6&w9:/BkcEl/EJp!4iW>K6Yp$nJkGV^
/PZT@4 +FF//EFDI1H4W/eNB^RFu\9=SeZQK=+b9Ck69Zny@Juu#<tqGkpb#wacl+!cjKWw>PD:G*PLl:ET$9iF
I8P>ui XDnWwKX%+*19dEmdCk?D9yBF8akqHl+%a8J1%46V^&dhuFMZhb$\j@\kd#hYVH1Z!=4/n\\bR@QjPnVY
CWLLTB /Fpbt^t@56S4n689c<INy1cpnB5:hu^+8CLhMM%QZ&SkIDI\NhMZthb4FhFqHb6B6yZLt<KTDApHMnty
XA4Fdk bwIuR8@*84W\dZaXEPGhjc=+^n+%jQd!^+@L?RX*kM1bckq@5Q>wJ6R+:Q1JWajj9uy%Y:bt<A8yuqpD
@JR4@: G#P#F#dE96JDPMnQ#>%F#HyWm/$Gn@B#@chnX+iEYj?ESI+jP<yn?KB!YSPcaQ^Ba9M&a^MLpeELT=+u
GWP=D4 cIEbd#B*&:b^a<cMH^?8VGe#SB6<DWZIRtXtwG>1bXZQN5F9R:t<!XyebnpKBXwK#:$TCkIDK\11C15K
SGiYIu qIZpL9NM<hVk>jj9>@PQQ?R+tA&Zi9dHdcClE!?jHHuwA@8c@!y\=G8y5J%lG/9/#b@dAI9ljnJ*X&hp
cJKy@G WZ?EVPw!&LFZ%#/PC/j*GDq4?4VyM**>KmtQ5iE$$hZ!&LC=q:C?wdH=e$5tZDHiaQGY#YQD\5cNH$<Q
FK%W*A q!VLX+c^ItIkFBtat?1dMXd<iw5YXe1d+eyJe!MNC>!A6$H<NHLi99#<h?De@KJu#/1jG4#@@8%P!eFH
VPd:JZ #=/SF>WTjT@yMGjZ*1Qa$H1nS=ZEBi%><!=AGy4<>5u:h!@&Sjq>qR1HCF5&cFn9tR*=8<yD/PZu+!cl
J:>aKQ hB!p5lFP#8LlL6*?euGMG8E$i8GTu4Jlw*ap^pWEiZ4=!kKRXRT!tp>b+hu1=RI4a%Pnb=c<H1Acby^\
bd<^AS >bb%aYNG5?PRqmlS9mJ?a+mXTGYkE9%6bwn/Eeu%nT&dYFw%eJ&<Wy/pwZeM/X&p?\996L&Y5Dcc#j>W
!=1+M8 wMyuC>lCZ6GX11eGH:?>9*L%<FMk?K\cCm4>wYI*i$tj$WA^wGhI/NlAc:<^aeMGn@APuL4u:RY@:%I>
j#MKFD \@w6/y5>5cu!MQD%>*b%h?uhG\m1bL&GP#udm%$Gm^&e:hw/T\a/N9DGP$j$:N/>T\>uS*@MBQ+k1G>p
ZieZAE aT^/a5tMb<iy^k1VN/$iQTcWHa8qwuDX<5&VMqcwSAIDpd+iK&19**1c!EBQV/k9MnT*:mn@D*KP<$+9
ldc=y1 CC^p<u<YXFJ!yEn^%QnJ$/hj94+w9uZ$/bPu=A*TE+^\huXpJR*:BwYPVu$*h=T=XPw#88?AARPHiM5C
GP+Y>G I1=uqW1FHR*cYNh9@5TG6FJ+1H14@AXidl=PdG@pKQB&eubk^X*eQF$eI6d+ibuIIN&^5?9c8tqL1&:h
5piM/Y Zj^G@<uSVXDQ&Mn<mTY9MbBp^1w&/m<QHS$eFncG5q!?hEN$i4yb?uIdpcmhyaG?tX!?!FKQFVcHPK=9
aTK#&P WG@E%nT<!=mY=c%:c*5<Yn49eHX?bWGbYwMq:FQqE+P9Z=+Z*<=?<9k^iX1N8:ihZF!WE9*ipJ*pQA%l
u:p51A yK!*wbi#uT?pCMuH&@/YCwiLY6a#6*ypR%^aD\ab?4m/m=ElK?M:Pnpy^jy8AX$GSCRMa&R1u^diZq$d
/G#DCB 6j*L8L*E=?>chun%:Rw>T!NDw$iY9ACkbnRtdMMGiWlw<Pm\5G4e:L5keW%/Py88u>^YJDK^mGZp69HL
CEceAF F5h9>wVwdtDejI\85?8*4ui?EBM/w!1@81AmZ*Yc#XeBPXWS:?FV=wuw<cQQu%@tZ#@AQmIQKL9BLt=R
t?1#D\ na\KC=9?Lp5BGYy#QWL/nlp>i:N=C#\Ld&nX#M#!wR&@Jc^L9aZ?ARG8:8=5H+n9L1!MN<!yYm#$D?\*
=M9Q&L dEPMR6de$b^QTDQuBp=DDY#DcWlbSJtJnC^Elqb9LaqFlTW:qw^l\>l%@FElIi^wTm%Y9nW>uWuZV#MC
h5Z:wj SXpPXMmdb?^4yt>q#De$cBMctw&<ILnn9lD^uANB++wW?YWFXV1<TDH:lD^tH\p@jj^+>MIF>mG=Z$Q*
T:qwkI /^J^qWT9@%m9D:MXW4N/A1FFF:8@^+=Kctly$uBk6XVaZhVG*LLJR^8i4b&mN^9A>*V9VaqJGBq^1lL4
P@k&=c >Sq46&Y<R6dMmMe*dNc/kWNDD^NDjc8^TA64!wGCikcGbt<6XeDKiAC>YCk5PTqy$Tk&lIVYyJMWSm=a
G@HXAB uyGi4p\Zym*RF%yPXemd^Xm&Cm@>8a5aGLtHi$:dlc5YqFdZM9=/GD^^8!L@X$ENZu+H^1kCZwLmY$?A
=ZFCqG q9:Dn^@iZ#6*m:%QdkG9ReDL9X#C?#SPKdX$N^i%chLAy4uNKK>LJkdGAtNuJhync&MDm\iRyLK>XZ%I
:Lk:%5 j!cRJ?qLtR$Cbl+Xa4=>TwlT%p^mwFjj%MVK$5Kq<ZB>QZ&i@6Ba9E@JIwGXTM@kDjA16#RC<^5>ipLT
mNTARQ &4YJI=tRG44=XnAuQT&6Pw$95FmkqDhjNL4#m?&44%+w%lQ>=hY%n@WA#LW9ZL:e=eqk?*EF!9#TApW?
Y+Xweu e%1qy1R1Nu:</NHDl+@^C9j<??\>e1hGwyRT:\wJ*?Q=T1Y$Zk?DFqa&Ny+L:F9=JDb4%FBwWM?+A!5X
>6<L56 tnbycGl8m=^+ZWFLbARVTQw^!EpGuH!BW+>NM+BVV#$LI$6Lt/dYq6*cY=1cCQTMlh&Bp/Gb5b+BYCAL
<9^S<8 uIT><QKJcDcS6&aTE%!V4yRLE4IwI#*#pWy=5>G>VpZtF#S58QMwcXm$Q4FNn%t8Y$58ZB/i9eylXLE!
<$yQD% H^hpJSDVJcX@=hHDB\?i9&Qj<w:ha??Ti\wJGckAQXXJBB/Dy:%RTy8K#S9a&nRLHZYu4?9p=na&VSwb
KDCuF5 m&\d6LA*d!p\d*Vjl4Wq\AwWFSVI>FYIiRNpTlq^4SIL*F\>h!qq^m+G^lcY=5:6t%t&d<yctymb/A55
Pk6HeW nN5MM4Dmm$#jAK5!T/MR!AZYJK/S!%eH5!MX/YTVR5+HShYpCXL%ShbKihPbRe8LV=<nBtbdHc!Lm5=p
8VL#?! dSnTyTl?^9HRK\$D6!n!c\11C=p@cJE#:AQS@dh+K=WZ>>p:=KETW4+cKjG1qkl:T:$D6l>STw*1N:j=
W#:t:1 y%F:4?j:&$%R&lk&cYw1dN11LX@j:B/RE4d9$&haaCAVSQ1#jTG4lR\ZiEplbplpu8JFc=W!I&MLC!8L
DA*uN/ Bw:Y>S4WW%11#EV/AnP4?n!B/LWqk@dZKnSpFuBKYL$/lA%TyyM6NZJ?aq1cIp&aI8?9d?!wqB9FHnth
Xp&6>P iZc:$F1<&bpyMM:Q*n/$*e+:4$$:Bla1<lYaQSW^\I#NX?yc+bu#D?+@jW99mZPQ9WWiMFC&XpuJMMnT
k!layW *ai^W5HIpNY:GcqSR=8ta=eijZCpTjNtNVd/VbydEBN?\:5&nK*AhXBkIB8pGppC&L/MtA^qbRwbGcEW
wKI1Ie <%!G5#JBZ/eJT^tbpctF?V@Ndb6atX6b%Fn1t%tImD:j=BW\K:M$pW=ik:SY4X\cBEyQJ?81=L!pNCY>
MDYYQV eAZYcTMQSt+Wh@wCIe$dtPjtqTkKDI1#D+*tDc$uL/4JB\PEKwNX<<JA!QE!P%N<?>Fdi1ijF<>9*dyJ
<G6Li\ 49IqH5N?T*uDQY8pk6FnJyT\WpNHt%bnk:*hIN&66NF4ah&wZkNpyNe!MDAwTDqTKP9dX!\b45SdYj5P
&+<>hE >%dI>H#:PA&Ia&YG#laY+9chY=ydGqSc/qpat^mcXEBI@&/yBD4t>hX5X1/aF^CRuyJeJ8jLp^MXe4%X
-AQ:1# 0009a249f60001202b3 Page 347 of binaries1.zip
TbJ8eT ENS6YduyyNMH>TD:IQpBlju=aGnCk8NLp&e94\chKA5XYDWBF^XiSR=/W6GWk!p&PjPY*yV1?dNun&@i
$9kNd$ IH9jT%XlymESt$bLdY^cTAb$c&dV6B#m6*Y=DVH@BC<5c&!W69^?RWGKpcykM4Jc>pMt<yF$:iR1>jbq
y6w:E= LaVNYne!5#R96?SbGbhdEkPE#4M!LLe$Dp8k$Je9Z:b5/W>=yh\m*plpIPwYI#>>K6@Z66ZP@J*q?j^#
iSV&mB m$H!dAG9eBSdYKMFLDy%?uVJqQ\CmqlbdQBAnjeyLE44*$u%k$KDA@%<Y:&$+XqdKCB?@dVlY^NdBWle
=8k=N/ bWNA*p\\GXW6?!dVh*D4<Jhn=*4XFl<6ieaeNtNTb1qc4X1yYp/Y5jEEwJZL>X$\uiEhaW?VjMZyd\BI
^p5wQ1 5Hl$IXyDMX1EC4QS$$IA6bmWwLtnGFXFSlRWd1X+@Im5iTNX?jF>9L^i&jBdtFk\ILNjN9\i^KRGjBbR
%^qwtA >YJAik!k?mLVe@4uu?:TWw6jqu\LjSGC+u5VjZBM<e1XIK*+?KXLq9!W@=d4nYmp*##^\&pGXCjIH^\K
CJwiWK iHB*FwhHhXy%TuYc9\8<lNwym+C81QHAepDYQIha?h1G4&hy\h4W&Q/&Een+yCXKm:HS<^+=MnlaCYk?
K6%th= !RR?9nLZV?BLjL/l+R>LlaWkXa>aqX5c#qpBYADK+5W@=V@q1qW<iRy#/k5+l1mk5QtW5aXFMChEM=lZ
9JjiNQ yWdEunI=ZTwmF\5KC8G9^dlS+^G>>SqGemJ@J8X=6Z%uI?l8dtGFpMy5>P^p\+mR\!SwAbAWAPthnCh6
$c+C/q >NqCcTtRRCL&A<TnN!R%kjDLLA*WkBa6?mu@J8eqHm$@XR=+>A48nlwV\aK45thWhiHeLu%AdI4WeNkm
=@M>W= w<ICDb#:JQpJ+Pu/$WdjX64I$64Gy51&*EdwJbPbp1bKG:RtFWlIFXI6i\PA&u?^aC*%/1iaGBwnItFT
jj<n=Y cpwnAqb9kIkA$MK+u@I9AGuQ4%M%+G8NC\yjdI!an:PiPcP??yniCPA$wDL?W91nDhuFwcL&>WV%TQYA
^5Tp:h j@@iQdLywbRuccq5WYwnHCJ6YK??VcX6BcV=pQW&J9\K<EdA^AKt%#KBj=C:>ZhE6Y!dmcHSD+mA?k*V
\481dL WqM/EX/FyYH>?QkqT^AY+Qw5F!T8&*=eidL1FMb4k+KHL%bHS1NA#ylw5BWmN9cWaWFy/R<Qaq=eCPFD
bVQABC XYla\F%DeP@iZbJ=Z<4#dM?&?Gtn@:hWcq*QpwMGCduAkJAGqVa<P:B9Xak1FNEJ@RJHla/!KdXRYRy:
ANl&*n d6=1dGTIAEZBccud#Ak^4dR$hKGCY^kZ8\ASClPVN&=JP<Ki4D/qAI^6##==6nl/Emi?PllQu#4%EDBc
nb+6mT E!I9LFTC<A\9e^D9*4qDW8>Iie/6j64AaqP99kWF!MlaRumXNtR+ktMB*C8bKHBpcNm+CS+Njq8ILK$&
4/$Ge< dNymbGTA<AT+T=^&6#TeFK>GS?Eb4Euc5DpqQY9j!S11*:aQHn?Lnl*@*@l?An+iITI%948QH#&kq>Qe
KjlXFQ Jn69TZqD&=ZbmAbLyR%dYJ5DRpDYlyE^lFlX&SD@Yw!GATNHla$Nu#R=4HpFCFF@\d1NdT!MATb4wheC
m\RVS1 eeJHnKw5Die9BVZH^T%aMQ?u@JQeMGu>yt%ytV6&:V*Pu1w/dbS@<@/n+eeYn/dK49eH$DMIqCF/5>AR
1p$%Zi qaY1S!JPn4h9pZ*ZRbC&XVaGHcZT\R%dNqEn:ejKlMMIESk%1$bVbAE6R>Gc?AiNCl$#j8Lp1bE#?$P+
6k**Ya NdD56Hbh9ItX1RkBG$aD+ATR1>C<&6LITmQb?jMR5pum8w%dWnP!h?d6&Z<MMSjh9qi<?q4cTMC5XIeZ
%q&^&4 Q4&Fl5pdAQ!AEG9Z*aBaWYlIBW59^mJ:4+Jp&$C5qRyFVX9btwE*w?/FQa^N#RW6AG$dHdStjy\BVJw!
cd$e5d dec51ImtC5A4V$#TM:P!lHC55nDAT!CC>EWG@CyLw!aIq/KqeM*RE4cqb?*aljj5PR:Ycy^@@hch4689
B?uYK% u\8kmFX$*!CH&QAZIE:w/^*c/FS%wXE^h!P%P=lDHL\M\eiP5VEeKJZcY:X1&W^jnXm95+&%TA>5wSiH
\qq#iy q+!8q4&Wtj8QHDX/LCjj&XE^$S+kXM6y1>eEG>Y#M8h4Mj>naTJA#M=Lq/kqQQiu@KQejP&/VX6VM>R*
yDXVNk n#y&<lS#&8DC6S8JW/=h&6?YKYd?njqcj9\@nTB:Nd4EZR1GX&1VI^ipJwN5\TK<Db1$dmJ1CInBJnwA
\9=><q =wbNG8tdA8cl8ymd?RWGW!qQukckw?jPn=6T9<PK%Rq/y9ZM>E!@Y^ybhEZM=tctjH*AQJ=mS5k^mLq=
WLH^JP a9KGLh9T\bV^Pn&<Q1nkhQ/qK>h/yn*K@GehLD$c%Bn4VW/jS>TL5>i*qBaW%BRc*hFeyujnB6q#Styk
DG@PEJ a>mtldt?Lb+WA<k8ANuE81G\MWCtb5GG1kD!C#^$l&KiEIGGMTht*wK+^XDwhBDY6#ARjLW$DEY<ItMV
ne\?:* kTuknhjF?$F8w=a^h!?ua>#N8T@QhH%/JLn6Ydwac9G!?acQEi/Abc8cd&aLFIXG/15K<ZJ+pq5C%cbi
QAIZGC p#ctSk!H%lQRC81b/:Zk$BIRMIi&MSZ\&HC\m8qwFjQ^S1i^jLN/I8EZT<MNiCGY9yEB*$INq6yDDAZd
<S1u!a lG/#T<6W*&EL:/^Se8=55?%Q9Q4u+#ycB?6*jNcb\i^Rt=NR!!BYNGJ//V:JAc\NlP*1tbt15jwAXt>m
Db%9Fk a6RTQK/%D6nu5pa$R1A%VKZYkLi?4<i4d!RTjdE$!ET5G+t?5M4T8BF*B<MFINjwu@L*<5b+In$F:>ij
6:yX8y S??1lLi#u&L#Qpa&wyBd<qpKqeWe:bj?#>L*9CF8JW4IHI&Lc/FiI*quyj4>iT%dCW^d14H/KtZ<+eT!
QEMSba !wdZR+&WN#15Y9bM%nCA5\I$ZGwFC!eR!*w<phWZT%Y&Qq/?J!iGkNVlV/S+AiDYXI\Nih#6QAyQG%/:
9#l1<P W*@ESS&pZQbtVB<kX@1ISEDmnwjJnC>1\N+A5LquyWJD$:aGDS5yAT5kdP&4pQEH<&%B4IMyYLSaR6E&
@Puleb AC5ICcNGP*$GYpGe9u=>QSNVMIFt/t51q@IA:Zm%DZBw*<pdcLhc$p9Wny*Kh=K?:ytW^NKmS$Y*1YI?
/tq&Wj duTGZkXd?8PKYSF*hMn+LuiVa5B/HdCip\1:<65%NVSVeFk:IFc@IT%4dQm&I?8AjT14:$>Nh9#ECGwF
a&H&+l <<T<?8bCk<?YSq*W#:Qd66T1^6KpHuhdYkw&/1j<4d!?b4?a?w4QXP8Qic:?#J>RL\HWZ\D%?@ZLZQ%t
8*4#q# W9SMF?88e%I>@Wb6ldB<KeAE?Hc?aAR1Q>JNaTP\HXpZ:BPbFbw5ZaPuwl$IVP9##V=bG9u5&K/?^uGw
uqt:Mn \6LWm49Z1Bd4G*q>>e/Q:b\X6N@/49WB4GVaIq+^*d&5LDR88F@GYeD*:=5R1XqlpjwmcnZTQijB5$V6
PMPbN< #C*11cH&<\Y^19#MS4T^6Y$>IAn#>%F+8I<#&5e!!\CNj$&dMh6cWF<pM9^p&YL?V8*X$W8c%/9ZiH^C
8KW+%X :W%\NZDy8cIWdpW:PLLLl+DS5:S\qRCZKdRyiIiQ4ERn?Q:6ZZFBahEDjCwR*q@@Lkh*=\Yy@pDDXm&N
?hj+P* GwCJ%wAX<EekZ6bQ=T<IkB1aHctuC@iS#AJ<DBIGNN4SiqcYRtM4RL6F<%SD>cQ\6DeW^#CLX96cZk@R
KJnIMh d61Tty/>I*jQh9H6/$=LT\4wAe61K6kYyYWcE<Bul>IuF#=@14=4K+cB#A6TwbFbP%G>y6ZWYwpQC!cA
8kjha@ PEYIM$nHCBCt8X?Ab8EXm8wLDM$?Y4dIXV>iMqZ>%B9Ne#pYcXC?py6#pRCVt6/?::9F:GB%MXcWq/tj
*n<X*I H%u:qM^u/68dI<dWm%Jlh?P&X1dtXSTn!phFhe@//!QGPlAj!p\ltRqBK*ZS4&<wM9mAANWZW?5<?t1F
!SVtCL ^1ER+E8c^YCm8H*c\JjV9edtc@AyRh8IV?*!&t8tZ?m+EWt@KNY4b&%4bqpJ<Ky6?K%<6EJWK>8AKn5$
VlSFu\ hDRkjCA#WTeCS5cY?wbRmh5$$X\wVK?D=nSNd:86658j<lh!W^1i$nMn+!:+nD>ND#K^FCBdcHPtw1K5
^qH>@5 XwS1NV>:14uF>uYTipp1dGna^5C59lym>%1IJIANFNRKEZPX?#InnE6n/89XE+mMQ%nc>NpNM8T8%Na<
he:E:L bK8Ppu@Ku$QiCkqKT4D#m?=BC@L4+48Nq=^4HWc6+li%KmcdL$8FA?w*M1%9WEH^ERt4^Yip%nGKpIN*
FZd65Y V&aApenL!FSpyQji$td/Hq*^cb+AXl8Fj51j!R$k1bdQYi<X/<B1wYFBb@PtWm$:4a6\&u&5Dn%pA$C4
uQctZV J/^uchJMDY$a?/h&Nc=eLd54E@pHGjGNDQVNAhm&QY1^@ipduAeD5Kh!$hy%<&%unl8T?\i8u%Y%M6N^
eR&A4+ C:!^NuXhpuSFK8^ybtLT$LIC<p:A=eXRZQ>&m&4bHbq?D\PS$MVAAqD6*Q69ieq%=QXV@pR8ZBk+jMD1
BWaW!W Ka#/YGaXl/t<1w/\99+yLLLq1qVj1!HSd&DXApHX&BBd=Z@FE#/+AlYYn\pStBmcY*!\6K&HF@Q?6=W6
9*BLCX wXcG$qIqCHphX$$:4n$6k$heFMW%SVb+!jl@CW^nbCV#1qVa$qBp*dBlPS+Jd/c\XWAcIc*Fb/Jnb&y+
J4$i+% VjWE^1dGFlbqq5T5*NK&&aH>j<lP:c4eEwKFP!l$nqPZ8ISXy*WldqiAAG%Lc114/M$Z@yi%pb*ZyMJl
R$5?hA quyYni1X+WtI=k$SJL?hFFB!Ec?P6@JCR6EZlCMMiact^unYkYhlAnA:Hn1\d!?>l9nQwKjPI1lD4J#W
a*K>&A apy!VEE6VqW^:&ACBZ1^Su%*kVySV?8!>?/RdABcV&DT8FHVMpkWYyw$wWD6yV4m4PMdmJN9\li!ylTt
8VF\hJ Qpw#/NBB:yLk&6YDmqQ4IRlVGNb++Mc%tc\YycC+bHktSjtpSpiiPw9HK+&ZIEw>A*:>S9X@A<mtbm&W
N?R:Vy cJH>YVXIhBVh&IIa>jTIEhRbFlYYjDPSPaBehjnR9=T?Rie^SR5yTAiLBi6mCuXBb5mPKAFp!<LQCnZM
^BiN&V @@RdkEqTAcYiYcMGLZ=DjqnQpwEFVppX@1@\nAkFQJGy5hKm$yJ9bYlabtt:@>Dlk\jWq+#@i+$DlAlR
C/CZbQ 4%qA$tIwe4Z+TmKuutPL1\FjSa*mj&mdY?MipLV4W4&B^6aNG9!!$Y6pWc<qXPXKHV$dc6^/%ClePQRG
*bL1#W /y5aW+ACW\MnK^Al=H#@%4T8STJCkZ9<mmXKLWC>ViPm#\M?6yBZX5uYNQ%QSZQi@bCpAEBZp\cYiEm*
VENTt% 8dW=?I:m**dIC?dkmjXNDC&XWAIKLI^FSmBA9JQm9*T5a+qLeY*VY#%p^aRTDV=l$bGqkdNL1mE*5Q%b
kydDR@ Z9X9Dc8j$p:^pY*ZyaK8JqcNj\G/imd%!&%I8^16R:McjCTa\855MnT%bFB/#a*$new6Y:dF@Q+\=>E=
61bdMh tu9CdFW@ay1tk+lQEDX<S11Cu6SqC\Y#w@yH%$Bm%jLen%<X%j@TL&iANBF<k8n+uT*1k&=hGqkcI:y@
YBmZ#Q c1n$/1Cn&DwcGF5C6myL9Z=Gl94GAG+A#ikQHj\nhG9Z+JZLKdm+5ZMLFiw##uwuqp+i8FBSyCl5ij%4
R*T:q% /i>K#9#?!A<+@*n?FFZLd%jQE6BJG%qdNAJ$H6W/8qWF1AL=aH5Wuw&STA%911t^wTuAt\pX^:+Dl?p>
tmXEpC FZT5V\ejldh\VqmB<nT8hj1FBZtdFw@d#BSXF:b<>Qud##K6e58%>ap&BZ^P+VX5aQddS5>L&5K/jypN
-Al!jd 0009b581afd001202b3 Page 348 of binaries1.zip
ukia>H GXL%B#^iEIjP#AVR5al8@GRLa#C<q18!h8CNk/q88h6!bPp/B!mZwq8/YydQwVMw*L:4hH^5aXFSXYG4
L^TA8I k8ej9u#@>aj^%VwH+1P/dhDaw5^G&FE16c*jAQB=Xj/Bn\SSiCctBkm9&qLab9\pT!QE6+W:Q1a%Ql*9
PubiF4 WANEjQ!Ft$MXuQCPbG+@P#@?hBWWum%j99*+Fa!9VuCyC+>5BuVYDSwCPt@yEN6/%tW&FXIFhR5NNpTt
S&XZ6q M8Ed1=GFnA&&MAK#c&YqKTaQHc1NjZY^WYl#Xm>Vuqam6G%y&\yn+9L^:HQL=/@jj@ycYqbbF%8yBl6+
tjbwJ! B6tEkt5I<qJJBi+&=8kX68XceK\@L+BmE=matqChCpQClqkaI4S//pN$?>SBd*h8uS5=whhTcQGJ1#qw
R4BuEV \5*d%y\KZXBV1Ck\iQ4m#Z61hG!N6eayND:LRTMdAbtXhVPK#LG=bRNA%4FM:c?InARkML/S5SpLRWRa
YS6+MB HPymdkk=Rc58ZEYdw+=&?&49*cN>XCVFNVF86^4Zlm*4>$?YK\64Cq1XQH4&<8&H#:4tXljby\>pHRC#
%qhbbA 6GlBkZX5X5<KkDu>%kGG5HmGBm\54eLAWi*MnCC+6bJ!STGW46RQ@wTFn=8q1MLDnnKuFaBK6G=V+4/w
m\INmk &aYFqRY6Ln%+@P#X&+>j8Bn*H:C?jCJddpkFZ8aY68W&?t&p$lcNLVGEDQ/q^cZ!^*1ML#W\SHHyN@Aj
Ww<Gi1 &ekER$i48jSaWCa>CH>I9V=wwZG*HePmVJDkQ:aawcpK>E?5ZS?:j8yty4C/wNX%imH>P?wD@\MeYR@a
q6Z4\i lqyRdH>Lye$cI4bTNVLGD*HynVA\6ACB/diTBXy^8HAQu9ya!y+Dt6lS=*=wt!t8=cGVmqk1M9$Dc=LT
*cweC6 =FM&XBT&LqBjEwn&@^6>5/bKm$5DnCRB4AEY=kkL<4pt>iw%Kdj=RYHX\IyA^VZIRFSt1j?Q#N@M$Bk!
5SA?=F 8XdeSRLeIet>@+X1&^aEJX\+P4Dw>Gp<9c&@R=/+jecC4QLCX8y4Q6D!Pcj<N!km9!Hq>#W#l%DlByI!
Gm*6BK 6!!#?c=GSDlE@WTATPk5p=pdGJbd61/*p49*YI4/$CQNpZRkwZXSMe*%CT15#teKlPq!?b/\!iWkI&/u
ITp9F* Mtj\PqFCF^BJAD^8bmbqN9yD\c1MVjC<*%@jIEC\94<Snn5KTDlMJ4MRmkBP&?W4E^I%l$Ly+ZBhQJ^J
+1%NyB WVkSReMLEI=?5q^?w9?\C!AijM#DHY4ykPjuj?IlmRDud$5#kDNeP5#Y\lDlhQ>K+bRluL<NDWBju4Ll
hI*:R9 qkbC1\4L%p/+5+#iMXF:jF/nM?=tT1A$^MMjNTGkPq>bwJ<pZ*5?#QqeVTFV%KL\LG/TW><w+w5cW1*P
+J6dWm &F?<u/XWRG&ld4LS>=JKdP8dI!KQL^SSPTJ1m+mEWyuE\kkFFEk*J/=hX*9<qTLc4:&>W%btBkZpNZ+5
C9:NuE BbRwZ*MtJ9B5SXHnRt+#+n*8>kJcQCAn6pJjLTMKy:Y%FR%PZXw$6IRkMP\#wGF<K^GN4Rqp$m1bwJPF
@it:lw KX4QhH#A$81/eA:X\1E1w&mC+1jmLlqSwX\?/<V/<eWXSc%QF=:SdE^?<Rei4e:IcwDVyKp%iFk41dSX
:^8Aew +/aY=VajyVWkt!yE$<AMFlL>?nJbW#M#A+CDV>QES&!w4!dR^dNZe?MlCmh+?#LenKTjL=jQ&=w^84#I
KIB@\M =pR?>:\d8tH>Q?C\biR*hT:#^w&+ENtkRj%/=VajKB41YWctEHd$G<qppNXD!G/ND*#ES^JyL#LbRS>9
G=WRMc S=NA#a$L1T$Q*J^ewKVTPTtZL%&^MK1<1Qt^W@uF?ECQt=44TlBRlRaRY<EHAbFp\GQa8CukcT?XN4c!
?W&Knb dKK\Whm?A$TER!R$lbmn*$RtM#ZEpNmcQuS#KZW^DTS<1AaHmd8d#m=EyPi&PdPkkAWJ<RyQ5HJ?^PR5
Cjaqjq TEPLt*JuWKmjcXGXquFlt/*Tw&4DaM$*cNEMRQ$DEenT9AYLl%\/9\XaHCkL1Bd%P$EAMnTAmN&tA#:*
+Yl+pd q8/=VXDjYy1:TH*@Rd^9GhXeZk:Xt9&^QZm1Skt=5Z/8ZL=*<1lDVHFNWe9V>Jub8CXXDa!:S<B99MJS
Te6Y=G I!?1P%HD=kDLSi4h6L=ye@A#=#hk&STW\ATKdZ$Htc?=pRlB>b%JV>+5+b:D\/HK$q#b#Eq4V^+F%Tu^
&mSnk/ aBXWE9yb<wThC#!QXSVbHKH*B8YiC*bLi%QCd/YRE>S\p8JXXyBX1L5t8G?pu*SI\$ct/Gm9yA!F\^Pc
R!hK^A ke@*qR$*MRYjd#MGH=R:n*5WwRbNP4&hp^wNCwtVWPcbTyVPF9tThi6q+GZN>?B=lJQeR\c==&&wd::#
+\&C\9 C@ZG%klRQBTMcTMEM%#c6%=Ve\Dn?WK1+5Dwt\KaEdJ?^8lndeKueYiKNGm+Y&Vn5^9Bpk+i=8BRMMPV
*IG^>D PDDJ<4maHTQQXBT&$b\6K11DB6da:%yqXXiSFilq>REMlCAQ/&aGAMd:8bS\aA!Mcj#^MDdVA#CV/NuL
9+JE=e 8Vyw/E&ec!>C^#9jejF=*yu!AyXeL*=?Zw<mkEIVKZ44!BL%\=DwDa4je@hq1K#Gc<&4!ZKAaqGQk#Kw
=H<RWK ZlM#5JuYV/WWmKESBVLE!FT@\4J6\+t%=!c%WNT*beYuYuJaKJKJ$+wSmTB&h1c5w1D6/Y^/elL9SI1Q
yCVPkG TNhA\b8S$n65eZIlT&=IiT&lZteBWMNGkKPhGpeV\MHK?IatJkCn?RV8lBN/qQ4Jqi1Ha1lqAmw/hJnC
Ay*8a6 YDC#1L\AjH6M$qyAeXKhpHA\%E?$w+>KiQ8?>l+QKA?i^IKmEDhED:JVw@CA%aBaAR=ZE*QAaVhi9WEm
EcRPT< lkMC95$>>&m4YmL$5q?Ka%y+aWWBPR%I^1@bZ=Hjhy>t+V?tlZLnNn:1l>+uZHMHPLIWpHln6jEZI?ZX
a>C?1? ^$Y#u^1KL<Si$w!SEYndD1QuC?uJVWC!eDF>bLwYC5wEwRCRBN/1tQJ<eylJ+M$94DnhNm5Fu?Y+Y@&$
QhIDmK P*#i\KY4%#tbQKhtRwGRFd?p#:^Ja<Dl\HmVq8W&4:%4AEcN:Jp9kalCinK?WA>b6k*BE$F+qlX$M*h?
KBkEHI dJ#&8id4Nt!pV:*IRmSqenbBqjB!NXqSjyypM16=I$=ZuG!4VwdwKY^/$?GTe^e8+=Qb:6=@YC5XpqRy
1h&ple %R8iKQ84$:M8yGN=i>JF&dtmHiu\8dPwW/9?w+M>Qd%ad$cKn?QYC+u\/@A*hP6R*qdSycI64$MZ6m9V
C^e:4c niuP@5Q$aH1c>ikW6G^D<9yN&%LTISV94JRLp^Pu&9i!X>t@6CQ&=T:EZtqHZC4FQCh:%wF%bJ%ab%dM
bWt<X9 8LC8bm:PM@hjl^Yh8/##K*Gyq9J>J9?XSpTNR4!GDjj$<taBAh>9cwe$a6R<LmElCbQlnP^1PZ>NWneq
b@IRHC !TbG4dM9ZLu%ALLeh^?JZa&W=^i!qSn$G#ER:*j5LaW$NyCE\n8?T=c5T6wIp18S<>bG%bBMalB?4PDC
kp8NCY 4ahQZ:+lQY1pJHR#Mi#h9??kajC^RH?qnIVBG<Nu#%8c5G:L68SEyb^EX=MMIk4becD\!y$u#<k9lbVM
=#8FNW WBA?4*=V6kuVtG&pcmlw%LlSI:cB$y1y#>bVY1p5SSdtb1ctb8dt4AZQ*I\^bW&W^pInR=GBwcHTkBW^
YL=a1Z ?w^R1eeVCbVE#Fjei<BRV?@R+EB@tY\tWeLA%5*ayk\MLY#W8Eun^w*alp\DlVXdu/tu5mKY4LpKh=Sb
5QuIT> YXyctJ54aY!Xmb/^wbG^5hKIleEbGJ^uAAPdVk!j6ZBq$5dNG=IV%<k*AtCSVS9T84wX&=JySX4mCXSF
wY*Y#q C>Kedea&X:XRNXe&1&/1c1J1#DSSNm+HTn\#9yLwL>!ae?Lm4ai<aKYWF>JXTd1*u=N@lV=56VD@%Mun
KtW6S# S+:5\&i\:N1SlWjRN6Nn>>!Jw1YLqmb5TE&Z4=nQV8\$bh4$KSEV\<iQ^ihdBReFnl*qJ@Q^>9IeQuV\
&@P!kc \AH>?@b&h*N^e4V9%dQHIGpdlylb>ZX!H#DMe%^a/Kmk5h$IT$L=ZSaWZ:%Eu+cJ#!A:iiJRVt:8:6&=
Fa\9=d P&p^qLJ6/&d%p*XZ4Xmh9C%:^@4E?Buw!@np<?qVJ$hMuBA?d5!a!iGlIcNGBkZ+!*!qZy+nlk$b%L>9
*ii48F H\>*N%h9@:aMMc$jFnb>\a1%/h8&dF!*!b+li6dnDn^:1@<cd##%@Bu:lQ@+$Z*qnidZ/cPZ<NEKb?q#
KAW\Wj dSBR+hp46?=e9unt&GHtpBp8?u6l%ejMj>i?QY^Pk%$:cL=Nd#/1949&81&L8#JE9?GTNhuH#6@klT1q
Y*yjqk bD1w*9H\e@bKEH&kDIm+IL>k?>\q<S6*unl@<Y^^Ijh<Y!\4h8<?ij9l^h*J<+J<l*pMCbka6ZAqJ@Wq
5RXGjc m^a8tL8=MGH1%CtV8Rjin^phGw4QuRn!>@Z&G8a:w\M\Hh4h$YQk<EpV^w<JnTJESZ#=HmhieE>PPH@&
u/9#pR LD=Q1mlu$Wy=/8:<T=e9AEqW>wun^++e&u?k+N:n!*8T=+@!<^4kNZ4G\lX4%?ND!PqDRSiquptcNZ9Y
^cb1Ca #Bu+DHL/NB+t\tBeYEl\pF>IVCiGGAhJS$?QZRG&p4JqG$PEDhc<@9LkAj@B@Z95Zhth&:h9*d^%+Wn?
D%+YVb 8V8Qu4>>?+aV?qQe>9#\@wPZyh<jHN5YQ#$ma64mqCNu#=&u#&qB+SjqZ:%*dFePyMk:h?AD%VI#6?j6
S+#6d^ P*4m+B+R@5:>S?^kutuSChuH#@Nck+kD+NhGKXYd?cJ!k&amQhQt*j1QZ=tZu*@!?DF<49t?9Zp=?jjP
hV/c1P 4Za*+>eRK$H>:kNH#%wIy4\\h5H<tNudl=Hj?1cG>h5=DQZ*<^w?bIDjiD&YtDy&?pjeh<n$1SEV^wim
AGl%LR MIY&YXXdBAaKR\XMIVT#:Vq5c6K?+8LC$/j\+itHD8:dY@#\QE/lIQX+ik%:iW/c9%!?Gy?+8YVlk6^l
LP$n!^ yAwe&E^p%KCD1\@Xt6jw!RKYGL9*p+/b8YlQ:w:5nClkEZ^QqTa\LDN1c6nILtDJ959*u#%HaV%<?PD?
WJ:Dj& @d6*Zu&@qinB#cDjNuDF@5KmM@Sld?C#6+GFwcqbK+>^c*j9*\YF/aH%jJaIl+!QTew=Vh/BpLw#SDDk
H!Pp*m hpZTN&Jq%mN$%cGVuM*6!Vu+5MVH?De^+>X*Gnq%\TIR!6#wYXpi*+tlZ8Qijq=DB9TN:RRCch1?5=%p
NppMhc +J!bpXMu>$KBCL#8XTdDaPaPE=KPFZCGhGD9$Tj1\SyI^5>b8kLb^<*dSRh4Ntl$pK@ZmQm@kZaL%+H?
kaq6wh E&MPHhmV6<8DJj1Gt#?46lBTC5Tcnhq:<iFV86H/@4$:n*>i>VYC+jn6y8\>qW?yuny=1\<MJ?\T8#<H
ebAI*: /8@<LpC#ViCplX5PpM6A5!6L>A#GQj/%>k5^c#B5@6=n>MBu#5qu<<&?E?MGjejMB1XH#=tS+jGXmAS@
A9PiIT ?*wNhF<&BPk%d>QlH*G@?VFS5&j$IESInKa<@b$Ea#V!ZZ4w%LGn\G%Q\R5/S1MlW^ak4RX#h>A^8wWE
9Nna1Z iR?Y\^nGNk:8\$MnRdAH>4pA1$b:9:GdCjqG#Dy6L4u*lGQ$<u55D9LZW1mqVwQ^uLnSB\aSn5nN!W\:
*b%Ce? P\!+6QaPtTZjRa+Dq&/W!/QT^M@E&H#AwkNk!46#m&<M?EKM>LwHVy<ZQYjY>DTQ#$Va$u8wbCt!cNG/
YTH:HF jXjHQw5AY*R9n5Znu&9l$^ciK+/Aqi:ji@atjqywN#b/eX#5k8n6?Pp&RdLB1^G@dT?ZkRES^cDM\+m@
t%BP!J !b=9DPD@Tw!d4Vu:+PGDB@j89H&KH#ea6i<ERn>?w\><ZL^nS&wJSV+<aNLTXJKn$eKa?>@ZjCKGX6Lp
-A9Z9$ 0002d810e49001202b3 Page 349 of binaries1.zip
@NR$YJ k/CB@J5PH+qB?+ByIPGy1i/jmF=u:>/LB/QwY:Z4dN>:ij!TldEe/ImHQ^Llk@XHdn+Kam??nS@<i$\W
4KJhyL 5J1VlS@<b?T\qaMSd\@H96L^F<?hKV#6T9F?aVaS<wWa65/<@QD?@V89u?MuB?<>nk>u9h+HQ8t#J@*M
+:1<qS WIR/^Gjekw$pZRM%:N+*?Wem/nRqb%@ikV5D*lNS6%E#bpXP&adVCZwQYD!I+t#:6=&HjQZKbW95KM=J
P?c&l= D:/9kW>%t:*u$L+n>@BV9eLuRpnJ^E@yDjbiPRlBh4h#>^^>+?1q<&jeAGVn*X?WAQI#EeqP*dq@>>F:
5jN/EB @NnI\<hQHD6/4Vh<VLl$F+h\pGhwXDLbwpE+?8+ZRKl9+yY$L?j&4HhkMm/lM/hQ*m4=TAR6B!<b!PH4
\*1=Wj bPi?Lmp^acW>^Vj^@njAy&<Y8PuRuu9$M*$u#a8iqa/jciP:m1L4%566&Kl:h&=i8!^BhHtjFS5SuZ:D
mW@$ni >M9*:@/Ikk?J=l</j9VI6h:\IbhhJSVdkBHB5?SpuS1dKPV&y+RQSNl#Z8/JW=b9mZ=>:<myp#dnLCKQ
wye6ti iI15bh6P9h#^bFIml!#<:lj<lNPT9jtu<SNNS5dMtbFKQ#E+aTC/WyeiLpNGQu9<+N+6h<TX?/pGeH$m
KH:Ehk \ppqh%=i5ICQDN5Neje1wnJKQD<EWjWdPnJ!Fdt9RSX<<<P1T1Ku*<4hwYEF$dMN**:V@^hSCT1JwZ+V
w&uTY@ P/<JENw*8pEHa<6tj=qYEH/QFdXR$%MlZZCkWMjj@4Rcilt$<*B1BMP$uy=:S#PMWW6J+QR=M/iuTKCD
>5\wKm YePYHZEay$TK9@M@#wMC*4=/<jTlB<Z@5ZwDIhXE4<FAu+HNaS!Qa:i@BQ/G4NBAYEYMBP%<q8<<hQVI
/nD99y +e8>ackPHl=P=nDW%C8WX><lAhNYpDIN4/D4:%bYEtG><Q#n&W:R8:=@VwFqPhHu%dMQHC>6ymRtjK58
iClSde \<bH#yk&ihL+>eBR&K:Q<JBJVTwJ9<P1AX1KP:I#$%MeKeY^6%BT\wdVm$@9E5PIDWd9K<ISBW*e\mdL
FNX<%* eESlI*9@cVF#w&dNtLwXS?\<\u@C>Ka\ayjpAen&:&=PA&SjQ4=@?:I*55*=WEZbCu8hi9Qm<kAa5tQ8
^D\a@l \&5YMKVqwNn$%Jt6aemG@iJ&uVl%Ay>?n1TF+Z6!D/c%lCH>4qQYjRd=Va+unJd%%de4K5G$JleZq&\R
\u!1## XBGB/jDDC<yJa$Hu!W8Y^c>i%wpR\#b>S$?jNYMc=EkV^/%DtB&Hik/i/k>n&m/yJR=4#w+5J!S8PPdG
a&hDL! i!C8*&nY&dMZN8Pk=9+ueFCS@i^Xe9t/lL<JMj6:^KTa?ZPnIAPKuLIFB?*8F?kVFRTD6q%NNh&y1$Nj
AckN/@ u%?q*:=</I9eh*&wYw@e>Z5ij@u!\&E>GLX==15qMK46<wJ#b<>jP&XQDL6GyB*B^PEI4MEHL*uA1PN*
:mk16L :<\1ukcnD4!E>F6=DQTh6IlHNQRD44^in9Ru=y<8Pt+Ea+wpB\bZpCcC9&hDEdXthhKKkaQG#%&<KHbi
TVw*6y VNTeGbQC^!T:\1B@DS#cN&a8DNykdm%@ZQS#uTu@5P6W1A$nm\4QueSSDRej\XH%HSapd$=bu:^bQq\/
VLa&1< deuKFSCc+&LukpF6SkF$qeyGLJwHw#bbSAZR5a6hH?@1!4JjQ@ySAd!9ZMeJ+Pn#b/?9+LAN6n\iA5M&
8ETcHS T!k+h?uc^R5*VpS6QeGq\kZ=y++eQHkSJVB&X*d/YaDDh/EB5JX:j?tEYKLWTMD9$56q$K9?=LMZQ&!5
*aA/6l JAKl?HCdCtLbeP^1iiH?XT8Y4%m^FFiRBjQb8eJyj5Flc%EAHV\Dw!:/\bntM\C1pBMAe$m\Z$#=l%=F
i#qT:: 1Rwd#dy\>SPPKiy*HMb5an5%ch&bk+u!BLq<%Y4MaSa9ZBk*J#R<amPP&T%wVN^XHLQ?QB#VypQuZ8+n
WF?DFQ &By?hWX@yL@#ZeW/#9bQ9Q*AdwXSG&&=*^yGDV>?>9#nT<iPHV&Sn&uy\RQ:>?@dq:Nn:\HKj9#?9WYj
n\QDw: A&BW6!LK*1&j>:n==J9Kl%Z#>:*\Il/^Lm+/9NRcS6Z98<?<EpK/@iLqt%eb/4Mm%1BcJNV9Kl8>^kZ/
wkX?Q9 >W4epnJiD<a#t%G4iu!K\pEZTn*p<m5Wb>MXb+:R+R^HHMVlDH19ZJPYaKBja/Cmh>>R/i9blW=cn:!h
>^/uAa %1it$SG6=/HQ6@n4:=/Tajlpm&4Ki<jdew=*n=N*T%dkpK&#LyuCpDbdm5@e&tbkWGcpd!mc9G@@iW1*
Y>:Hah yGB@PMSR@8A#%N#h?u1PmaEE#wen/*Q8&XIakY>mLC\uAwPkHad\GZQ9qW5&^yaT9XanRlNe$AVMVQZK
QQTwCD Ch<m54?YIZ*GE/je+I5wMM$ay8N&+SnY\Y6Zy!!EMVwEVF#uYn6G+^kaR>TmZeh@ZAhZX4JXlHLc@1a5
L6eS\i GVpJ>E^NeBD:I!hFMMnA@YiLdmdDIGN*W#aCpdtJAAaJLl!MZF^/D^<>l&T48ilL##=h<wEI/5h5F5Ju
D&T+&5 t+%i5Zl>:E<m=DWbF4LcBba9j1Pb@dV+/iQ&PQ\nL#^jCy>49ukdj1=NSPLKdR9^e/*>J!Vl=\T6=/G@
#I9teZ 6YnZwd6+aDqVwaH<P^pZTpHR?Z&kLGH\$SI%%4^>=##ka+b#<!qK5ei\pFppl@Hq?XCaZmYQF*<pi4^@
%CmH$d NmZm=>1QY:b\*RKe4=Xu<Ew^jNC+%a!?Yy#$&b=eEAp/@*RJjFDQJVWbQ>l%1u#=qnn<aKik<Y9^k?dh
TaSdhE =kJRaa8&j*X%/5?Y<e9LKNL5%:?TMNZRc=B$K%iAK<C^M+ZZEi4p*Z9Q85MH:hijHISRuTXDkmQJZqct
$K:+Qj <8XE/qu<eBFMcV+tY/+QH?\!buH5&up+ya%u$HJu!KJ+DVyP:cMFm$>%*5/BDVn:BFp&tJ!VlJ@5NYXq
lV/MH8 @Gc1nd<C^/+S\!j=4i#u>EY$dhy*ei!LD?nn=J4%/miHh9nS8@9\w&PQF^XeV+KQ<tjp:TuBnE<$c>N^
VI%mu% m6hJMmlwK6tuqNEMZu>++j$+!F\E9bQVNy9kel\$L#cS\t$6>a>H8PahPpVW\p%LV<@M+Baw@#PQF5FH
9R/Fc> Dab6#p:Bn*aa6#l?I>XKq?C\BMVd$M=8J8A%d6+cp?nT$y?@j6IwuQu!=%4MlaWhW!@hLAI@FQa@qJ>@
1Q1d^h DRH4^?d6ywCqt=KQW5CP4kMDyyDn^I>SR^/Yj#ePppCl$@KW#Tp&<GGnwSH#E&dAl\Wh@j!YPpHcd>18
ehRPkL T>6J9dYk6&%LTW&qwA*<ml<5lA<d>q&Vtb=qC^<&>yt%bN%5?LC\X&nwctj+eQ$iV6%u>EHaNQiuD#JF
qRGPZ% &I$!ZyT8^bJD9?QG<%i9Zt+Lu:dcen#@TkJ<&mIlL/@a@R6pPkM*dFl:BJG*hKDI4^N@^w>DQ8V$uhk9
h!HakL SFS@^Py6t#cp8%aR\:?DIlhF>i:X$<?4AmVbI<B*mSNWZH4%@?4T5jYEYkKd6t#b8yZtR\c?SjeZjmWG
hX*uy4 9Cd?!Sty&*bIaJB8+&JY#P@9=BnpDaPa8IYNY8pMk+mc>*T!/^bbT\Rj!91NI@L<S!Il*+tB$cAhF/=i
pJWN8j 9u^:KI#mjjnEtX*lw$jHBMIw:VhBMTiBWb1M&dklKjHIRC$jul:n#@PnhAcj9LYkp9B+A1YB!6CwZpjQ
jWN!qM ?X8A%:4WCBmN%!N+T5\T?eqd\FJw*mhA85myA44!Gb/^u5m$ah9PuV9?%T1<q8G/DS5&diIa?lVeneNl
cVw^t^ >XlDqaGJpWtn:9=L$#Il/e&imkM:lM>b6Hy>$S$*GLnB<LCSK!DQJD\F*%lwXM?&8/PnZe?8$*y4TZ@/
wXTPDj @PZ4X$w/@hu*NSk9iRJDyatJiVQu<Tpq%/=i9uV^:uIeh9Vlp$YZdu=>:\:DD61Sq%MEiVMSKk!M#X6=
&u5PCM lM8*4E>ct*laS\4%XIG1AJ+@!pE+<QmN?bYp95tADS8T%/=hPZhJet4c%p$d%meqd&^cRWR<&$FnWm+t
?A\eYQ h1\k?9\YI@!<+l!4TD%i\\=h@8:W+c?@Pudy&8Z9nl*c&a:#$AwneY*T8tTc+S6+u:+NM1=9+dq%//cN
$iMVph G^IZ4h1eqa&:R#h6*pdHd8$bpZqyLa+6/BARG4RelGHXwyin9X*QHn*6uMVPDuc>@8p<yXai>QHutA5&
8mH=GJ Tu9&ne1nj8h6iQm6<QTJe#h8ZEiBZL^<%ldHhqt=?@LDDS%kdMN=8dt:CpEmXu=4E%c9Y4X!hhLY4S9Z
lVhVH8 JTi6qS@TEayIFeRGe1a?+Pk%!ML1t@96*wPu@4huyt@DA/bJc>h5DTmDTGdT^JIHKdhlV=uQmAYPCN4i
tP+njN ^huB9qjQj$AeHj=1*/dFGHi6QFau!Ni5+iVlhjIt!44i/AMH<dS=:5=5*K8IY:k#S8K+yp*y8Gd8wcMC
B9DlSS +qEa:ZwQ/EiQ8I1hHH4%:NG6W+THXlk9Z:%??=aKI@ZJN#pX^n@:Hn:AJ%Hj8Zu>/lZ/KQn#6!QLaEG#
@H=#^V dtqSS9RhWuJ#hlbAwtp%PnM%bS8*9=$?uFFZEKTeGepLw4dS:<mXtEymdic#c>h&84hN9Z%5VaJ<R%5w
\aGa:C aQp&\*!>l5%HCVV4/iSk%@Pj:q$:k%&$d>8/?YmJXkLLX/^e6a1Yy\ciJ//DbK&6S8*bk=5%5?k#\Pki
qFw4VB >uXdeWSBS@?RpZ=LeMR&En#R:i4mVI>$h?@cebK:q99Vb<>j9PnDej>C8X6*#>N>^Dk>*u#^jGea$uLl
Je8:aP 4y!hP@JS@!F+NBpQJ/>jq=TEB>+Q/NBY1EcykupnKjG?l!<D<Rct*n6&IER<XL?B:5bNYLp8W8<>EXt=
+juBQV !/TiR?e=wDM$@ahnDy:\X@6&dXw%Dc&q9tSy@LJqHQWS^>GwGqmN#M9D:SLeE?5&d%!@Lnq^!&\e5<uR
cmFLYp $PBA&YLp*61%6:5E1KNMi@#V4W8HmdZeH#=/@PRJFwPNWl=@TWD8Dd4ucy:c4KF?48V/Bl\#eAj8Pe%H
djqH=$ ua>KWZNQV5ddHMqZH^lRc@^ElW<::I:e?^!<FF%JGyy/wh&uce>T+DH4bi9CiB?Jkbt#n>S4^JAai&Vj
iM\%^: yJ6>L>BPb+kH:h8&cY*dbFR6?:mFm^a9yph$SMPPZwX!1cFXEJkkpE>L\@Mj>CVEG9uYeVm1hj>S\WEB
Pa8RQV 9k5hAG54F\?JG&niAej8%4X#?@Bc@9j8*Z@\kPQ@/BQq*:B:L6K@yu/!L*itwjl/HI+/QIM?T?w$J\H%
=X*>kN a!^BAItJc?T4>86IRJ<J=aXRAZn5Q^>XTS1bn5nKW1QpLu8DWtny$8RR9e@E$N#JS?w=a6nAKC1C^q%/
LK<Qn6 >RCRuV1CBF1*c6tm+Wk*4Rnt#X<RG$eQ9wtGWt>1bBt\c%h&XtccY9*JTaq4%1^i6TXMAPM&:D51PDDA
dYu+RW V^1HRtnyLHEXk@ZdWSq$/hS&uER4lF8*:6!=m<e@Gt%:>Gp%C1FS6%$*d+IM484I+E^^<jZ=km@EmP?h
XTLcnX upMji*aK=SCM$W\6lnXk$/9&/enBRwl*nR1qpyD5P#8:pnR&GbcSwdHX6at++S5*>T?Tl#j?Sw#=Vh!y
#CltYb LId$u&&H\tn$N:WGGkSc&6w$c^BaK+#wtJm=<#llDD1MX6da\q@naX5AE=XF\1wXK>bH+NB/4abRejl/
#uKckh LdAH&LcP%CR\GHV4AnP$HqM4n&9Zd>!<TiY^=iFHKw@GII<d%&wjd*&Y*lKm5PlKRk5a&uyehm/ibe4K
D8^hBE Pkt%m6XIYJ@Y1=>Vm*iYY4qHS!KNqGHpH%\Y*QNKRB^NVacpyYp&$6L>?h^XT@PZL?q4ZEyM#L5Mlhk\
LaBeJ4 jNmRRj%tWap$:KTNmmCR=p*4n<LF5kYX!K#be/K+A<wGR@bjBLN4cmHL#6bGSh^G4L+8c5*K@5a@mTt9
-AaeF6 0001d5a0d17001202b3 Page 350 of binaries1.zip
41LQ=& 91NjTHCR9=?9hMS<qI1Nk/5tRwLaP@:XEnM9+^bWKyi9ZLq/qS+q&*d9\!1WT6N8P*Wn=Fu8uFBBRj/q
?Lu!\X E+GtML^Su$T/T^%Q9=&kp6tmmbcJiHi1XT9&$:!Yp<#j14G1Md\\8taPVVpVYWqcGA=KVXYHDA*!^R6n
L&JP!E F<!Nu4h5npenjkW^%:Q/i/BMlma#hQDA9nN/wam5P*ZVSE?RWLNG%w8e<MRIFXHpnJp#b@Zk$5jM<:Nk
TqA+!c DqNyXqa/==44%*H#+EWTm?IY4=uZ6#HPwh@I#n5pFG%H=8M>QMaPq&kH5V1cwyk/6G&%*BHp%JVK/eKF
=GThMP m=e8+XJ1uu4n@R1WW+58&:tH\qNZPki&\+uy>KuCT#9>djmX^ILZwP@TuN&=/uPXGeild4aKAtty\!9i
eNlXKj JY4qmpKaSGnLTY8eem!SMtTMT@VB>YQG+5Q6R$NGBR/i6k&VI&/*QhIAY/LZAe?iGSW:h@^\=*cNVA\M
Z!EZAR nc!ch@d\>QQ#wTiBB\*5%!hk?F<6\b^cNG@Y6Ep46K@&:TD+&Lbw%4TlSj>ME^BjF*4Wi84WchMn@jG<
<>#HTQ $yniC+>8Hl<iQu+e*5N9yGhWl9ycIl1DWLjLqm=i6DB&@4!+ba5tT%*cN#a%NDb4&Mb8TPDw$FFBkj+!
e*M%FI H/u*mGFlQq*?Ap&%dh8tXe9PcHw>eP%DA&@V\m5dJnd8ClYVR??T5?jPuehVd>Eqn+<6mBQE^ea8aPiL
NT&K+? w^aj8+b*@L>+<V#aZ$qJMcb9*AtdE+Xun&?e+h*V64=F\:a8@uP*:htL&?4ST#M#$9MYnRytS#aMCkT6
=AMRuK L6kE$Y56S1<E^B&@</Rl!NuB$ZXRIMmbnGjH<edPaplaR><qi@G$??GD8Hp/P=%iL+h?K%jLtq:dGn%u
pV$RiX >5#I!FuSe&hPG#QT%>59CKKPu$#1:RXSdjDA@9*/DPn4LuEV$>n#D*Y!>t&w1J9aiPd:M<T$N#%@MTqm
G5*5:= <8Ty<%DTaa%DXl$EWmj^>QQB@dudM#ZZ/tHMSXE9=$T>aF=M#Q^Fm?bFVS+ZMuL$8QD\Mh\bh#>jH&@Q
WLh*P$ ETP<QaePGVRAV:yL\MuSimH!+WL:h%C^H$PM?/Ck?^RZu!p=5^<E*Yuu?Wj9*w=<<^1j@9*5/j*cJbGK
bk$$&? GqcDR9YJ9lQHV^ceLVq^iQjPHVpHD^@cn#5Bh%FL#5:M#NmXR\NAXpbG?lb<5LXY$t6&9\c/Rm?W<%Vi
@DuIAM KPX+*5^YDAq6%Hjt8TeQ:6/=nYuu=a9uehiB=k!+i6e/9i+FSICSaS%hSVl4+/=?^t$H>PD!lQHn^wTF
Bk$RF/ lw\M\1k9>cb:DwI!DkBZjeMi/Kwi:EVXJQ:eX4nJwetRibiia5JLL*i@i8tCi8LVMQNS8q>?h^:NN4I!
N?1e@4 $qLw5*P%F/W6%>\qImb1#8^biAKi:4eaN\beMulpaIBM=nN&?$GaXtVa5#Wi4mlmC@qFb#5^SK@#$tN9
5A/*XC 94j:?8ZL=$<jQ4^@@?:NG@YN&=+?^ZQ9>H\!bPC*d&JGw4lc:<wqd8%S^\<Ah?I+i$^%yAHhR4i@h8eD
A^tpX! TH@9nVNI%cmjw>8RphQIC*cecn^9*G\q$iQXe=C+Mc+1F%dMPnNPnCN^WN14:Nli!y/pl@Ij6n9dni&1
$y+5k8 /1L5#Q:NhtI/1nw\j:H6&Zb5Y:cN1nY@c!<VJhH9&^Ky>GEtCTbPmCa\D<@cCi\cltXhGDHn#MK\KlmY
Fy//aS 5XQ%au1!Qhl@tP/1d518dBi&M/M#LNPP*\$HNP*Z15%j*b#:WeM1&KHEA&h>B!n/%@SV>K*yw?^h+%Hn
X*bSEF #pl1*BT8NT:Xa1Y#\pukKHE\AmRn:J*el+hEEth&4Gwej?\E4<*EHFc8Nl&/m@6Nul\SMYumbQyYl%b6
eIbKjF P@b\HZAP+$SS\WT/4ikj5aNLZ?ua&eSFMbajNuHRXtLa9tQL%8*?:mWbMEW=tVh^Clt<qXn?%RuAhdH*
pJ/c^C GA#LHNlF+iqR8yYy1=8Dp@9kkEq#!XBtnG15*ynR$YPM$+mS\K$>nNG^8*PjIjlIQQ:pmAu<<HH$L?=@
eieTCY 6Y4V@8<iL9&H5bhE5B1eLVm!$w#81NIjKub\e859Db5SS&a\acw^1nDSKQ>k1cPN6hpu<&I#C%P4^8*6
LGnYb# 8:h1%cbh^&+P:kPHV%NP=W&iJBwjEmb#c6HA:J9=Ja6!e*Q5=jlQ/>b6&@@>n%Q9IX:5FSQeYHLt%J/W
cRj1$? &aQcN1q*9@+9//@%1?1bY#Y\/V/k4/PVYNLje>TWiW6=S6XlS1EnbeQ/86lDpRC/b#1^HbYkJKd>:*bq
PD*Q85 dS?*WdW%d6i?\>@hHTV>l*4m<@=WW<pWk+l^\V/D*B%:hti/Nin?##<>i9d1bYj9+Pnw=C\Y8:m+8ppp
u*bb!R :1!H1njy\@bX>XQ%b\d\B\+c^A^YDYGHhlp&hMlkYH<GDPnj4&?j*l=kQ/+8GBp^T/XLK!a/:j@1&KYH
>+!GLw p<ikEXL&tkqYwlhKn8@iHD<4QJnu=<9/1H\d!Q#<@Pq%4<HBiFPC$YFl5CKPG<iP4\quJnAVqbMWEZ>Q
LtTLD1 tnmBY/9RKaM^JMkkLH1N\AWRh$FBmiDt*ui\hFSE>KIXQC6&6DLMJDRpTDb<kL5aq1XiQbpiDHkG$+*y
qA<\?b !uSShC::?*au\:?:hP@q:N=@!Ak9NyKh4y4&#?SJII!ljh&kjLh*ePBEABJ\>@Dw*ch99@:>B\\eNHn\
I^=NPA pKHDlk$jQtKEy/iZq:e*K#Z!<jYXIRZ@kAAt5GPAQ!CD=eJ#BGS>IB\RDaJ#+SIPYB!:hP6l:>J:$HB9
9MF#?e H@cGCidwq!?iPbG*djYCGT$tnR8n=MiNG^<?aiIpYEPtVJ$GK#atQdQu#GGntGktlyuL#GQtM\6W5b*\
WI>HMi *pdSZNCcDpF4$wV\eYMlakdntmGqC>dkah+BaXPmFm=j^Y8mGK$KM+QFi/VMc?kAAPZ8LyE\dmyZBl!i
n/9dyR RB^SPTwh!5Hl:@W!54N*FL9%GVl$lJh*VTTb*t*1qEunR\P<l$G1$S6FMRAqMZVw5PHR\h9HS+d/C^1J
9CX!*L D=IQHa$M^4Dn^JBeVPBIVJ+!bT4!kMA/GdhXaYTqC^9pa*RdY:<?HyDNP#p/8*4$H##C&<j*Fu6VheMR
W%V&$\ FyBLJcj&b&=M5F$TC$Tna?blBdX\+iLFT?Lnq!>j5Yy%R5Kc^MTp=PS%:H4XBucneyN1M:NF6bZb^1S$
u9T/J* &McquuTH%jJqpHqmlJ<%a@1WmAun^mCApLGVb5^h6H^XA1?NMqR=&lDYtpDM%weQa+iVai^Rbkl@MNn/
V1%?dk RNWA5Q6?14=5u@LinEi%?$8J!6*Rw$?@AWPGiZy=T=W#&Mny5GyElI<NCjRDw@TCh*%<bXRtw$JC\<LG
>>6^6R npN%RpI\dj1MGVNuk!1ncQW#H?6B4I8Z$EMD!%i5^P8QF!?Mt#<9lm/DIC+R%1mSAVKy%@AlIKh?A\aQ
5kGuuZ <=VC+Lh9M:eMaXY=e9q5\hG>P>1u$aNa/>c6*:ly<=c6KcuyGSqb&V6&:5#J&<$>hQ*\+TNHn^+:^l^Z
iD=C:y uXChbE/yV19!tRJXaaem*Bq*HDh\:e*L&RHFPP:kY!6j6Z#y\kW^e&bFVw8eQVh8/ayXCRt<h6Yl#GkD
TK6uV\ qF^kRIB@AB8wCqD=1@^WM5cZ+Ap$d>cLiLInqMPbahWk9P4BL\ebk46RI=FKqVNXM$kpG&p\dZJEPCkk
INb=k? hBRVDAa#G5\>jCJtT>NukJXHwXlm+^a8Bwp5y<iK<JBb+61pyPS%/#ak8T%d6/Yp$56TaRGHAuF=QGwY
baKq!5 #=qQunk8dFRRyMZDeW41q5w:S4h9*dy=@j1Xm!WFJ#wjPalZ>PZp+DPP<cubS+<hQ*p19/ARp1b#F!=e
baBbpT 8uIXT<hd6&>DQZ***n*t981B/1H1pi1^/kq=1u#Y>9GD?*h8\qDuT\4#V^/DVCquS!aIQuuN1tYL\T1Z
QI8E*Q LpiDqQNcXaKeTCkdwliK>%ll/Y5!mk$tI>pkJyAE5Q:En=WSZ<cHpXb:M%:Xu1>G/NF\A4?DtFTS+/hQ
=nQLap A*?GtIhBD\W$Ca$ue8d5PiAE+AKLqm!JZ:bm=Yw\@:Xk@i6BM1l*qE^/StbY>9ahP*NA>d6#h&:HHaPd
Jk%m#Q NmRuJ1^e6tRS1HVG6Mula$KC@H&pQmAmS1c<1:ynAEK/Ai=&<X!QE4yH>Qm^w<hQuD\Npmp8PZj?+1W4
d/6N$q IJldh?:i8@@\$bPu#%/<i9Z/#b8*d>?>i@@?\+iQH=qQ15@pC@8%#dj9*@Gy=^@i9Z:^=NG>P#i8ZD^d
*5$MJc ZHD!/ME>8h9V6&%KVq\JCq*NJ1np9MdKpBy/H!iM%GRM4Q&\aKyG1$JXIe\wXdAKJEWC&RA<+<DI1pFT
/lLmac NhKZ*nXT@5^b5<CRblL\8hEaWEBKIKaJ+SMk#8kIKG:Sp1ZLq5Npen\C9Z/DYnw/+6tXt+8i5j@A@n&=
E^DHY? 8:buycX5*dR8Ce^?Th#</FtSp!iMDR*&>@Y6pTu8pd95HhW6AbdK\ZRdLb=SQ=%jWHTt=C!K=8y%MJt:
JM9*aL >^<<jQ\WSQQ!>b6*:#>?@QV=<=e9Z:>?R+u<KC*>?jQZ4>>qbiZqFSYX=d>?jQ*$@9YLy+@8*:=??j!b
C8SLY4 kyNHD8#iqbY/bZ&mMwGS<?4XlClANJlD5GQJPGa<GejhQ=/MbpMJHy1D$weiu\=k@QHCVMc*^8iJ6GaY
?iKhyB teuTb/<Gk&Ak%E=G$aBayqK^SMXA:MSaA*IBd=c9Yb8WDGc#ijQYPqc#K^eD^9+DB\<hBMHkMit6t>bD
=epqqX PAADB:qMB>MbFXkqW>=u:+p\5eZdIVqluw>=:SqIc6XC8Z\XHPp&&59nJ$?jk%Di999\<SNIyI=Ajyi^
5:<ZW^ =c$1Km841164156@k%ni9Z:?YC8X@d6*bKS5VJIu%Mm^pCKVHTa:EQ\1JXHEp1<!ITwYjl8k@1@=C*=q
>Aa/W= <H/SBk+iA+jY96<@e5Y$<H&nJ^IiMhL&*SRZXih#yM=+B6DZkPl?Dbt+nXA5K9yFiQn#/qZC^*d#bmLA
@4A&!@ h6\+wwh6n^=ETH5Sww?>+JWIY?l9kC*$N<RY?l6lC@&N/YmEtPBw$N<WY*nHDF9wd++6>LjAF9yd$qpJ
R?1Xc1 5eJbwZ<>dKF@jY#lL>daR9<G&EL@llRhIa$RHjS9nC*$d+I6>G?KLjSwlm*$d$=bENJCSVpVG&!l9!&&
B>KiC$ $L<q66C@FddR5#XqT$kdbA89&&IL@h6lC@*da\9>@<IY?uikWmGpI$wFZuY/T4@I*@kV?ujGF9y*\Sd/
yG4K46 h/X@JcRd@lZ/h<eY*9pHY?njA%9w*^Nd/N?LnpKIHa+C@i&^lj+P&MJjHLGF@p:aRu>uPl5lay\N?46k
jc&YV\ C@%h5aZ?d6lCD\t&$N?hwmLEA%FB@>:a\9<?&EL@96lC@*:aR5@?FD*aF/KH@kP^ljeGaR9>B&ML@ahk
/y:all C@&HWycEDEPY<Gw+66B@BLdR*^Nd/P?FLjV*y6IkSI4TkQ+?&MI:9y9yF=HlV?n9l!*$>/j9ElKA:$L@
6bFe8! RG!lj^C&<JiS&EL@aG!l@!n/cWJC<NQRQ^Sd/D<cY?kjlm*$GIM6>B>Lb\ES+C#Rj#!&$D<eY@k@AX9w
BPIYQb Q^Fd/DtJwmEpA6FA@<uaR9<y&MLjytIL@chlC@&uW>TESCJ1iDWDY?k@E%9wQ\6d/D<dY?k@l:InJA4b
!n&eIL Rj>wdPGhGG!l@%^5wj<<dKH@jCwFRlckFKB@LLdRQ\=d?M9CejTLLMKj$H<^@a&RJjkd>F?KLjTQ^^d/
+!w:lD L<MYim#HF919wJ<mbCX?C919\ld/4<aY?mhkC@@q&ELQNZS$RlJ^hPm@Fq9wu+R6>E@GF915\^d/4/ew
HXBk4= CNtAKPDXSt!l@/ai%FMI%S:$*+I6>N>K$SK!DhFC@^S5+b%WdKF@G4dRQ^%d/J>BYSGTmc!kj^c&$D<d
-A%e:W 00056f480b7001202b3 Page 351 of binaries1.zip
+bSYA: Y@nLht!l@\=5wj>P!y/RZeki?8hkC@%#5aZ?ihlCn>$>/BjbR*<T5lh@R9>>&EL@@hlC@\QaR9?D&ML@
kVVW*I R:R*Iai=CE&PaA9>n&IL@a>lC@&Qa\6>V>BSCVtJw<K4W>lC@>QaR9><dKF@AddR9=DPVpkS#k:>m:GF
qkmC6b h<=kC@%L5IZ?b:GF@8ewTpLPI$4wj\Fd/H<SY@nLJY!l@&X5wj<X!katRVdR@^1&$Q</66D@B4dR+!c&
9Bi$Gp $Q<YbW*IdTRN@i>kC@*9ak9>:&EL@i>nC#$jjQ>P=jQ\&VQcQny%m4cQe*Ny?&V=e6w?uVPH65><jGn:
+uN>u: 9E<j&4=w%a1&L!$6cj8KED4mc?mKI:+llI:+qlA/+n6C/In9CcEnjmCEn9mSED4mJ$LwmJ<JwTN?\WFl
^b@:&T ^K>$<tjpG:a\IpWNI@:AFpa5^SbG@Ip6nQkLY^n^N:a\alt&MGL=h@yFKy:SL%J=mu/S1q#/Sc1Z$!>T
XpjB5@ M+h?EaWQ@TLKQ9TLMK*wF&E6/ShS/iRCty!B64M5+4Ln/u/#8Rb=8Xu+L!8uJp5X:bpTHR*j&/KnW1L\
>J/&P# i%6W%Ic/*>9\t?5R#ZYt*:Ey5VFbedF@nk@j$ZQmFdq^86?=8hu\L#+4N#a*K!+ui&qYVt^YDk+Tybp/
eCZ?QG MmW!ipN$*ctnI#hG#hBP9a&dN#a/K#wPy+/J#a:X#BlQ=+tQm#KB**K%*&!ebY=<Zt+<^#e*J!54P!8d
Tkb?L$ !iIwS/X\nGBptB$ttwE#\5?NWbFItd:YIISJeZcaNDW&L1W8*>!+:N^wM+ARy@QN=w:N!<W=pZRYbR!e
Jl4$?% 5>T!+?aGppA9pyQ+6pn<!iEA\68m%ZN#uLNldlS*uI:E+:Nly6^wY/C9<\>puai!#1dT#wtDu&!Yh$+5
t/bdZk nlMX#ZHiAJV\J%CFu=EWmbw#J&m64FHeehHb8y#n+cemQn5*N:1XAq>1@5NdiR4WeW+&Tn5dyA$6t#Wp
^iV8aw Xqje1E+N&R%W/#lyyI/Pw*Tty8LP1yY%Iy8N+?ZqSqqp^<Pe<B?%nm4Ia*KNANLT*K#+4J!+HDbL8nRd
X8kP<4 yK%qVeiQnN+aFc*tTDGkEKKmN8yTyy4Pnwb=\eK+1hZCl5q!w<^kNmyp?4+mn5%V=j4GI?95HQ\Htwb=
X^Fl$/ q&by9ES49QAh!hFGBchR8>dKil9uV>E^YhF1\nk^E&hAlR*8p#hVD<%d\eabRIN1#56V=yytAiQ5HPyR
?a^?*Q aF>5%pCPeK%D\/ScAFHW#Kt4%Rw/6k=lJB4LEXdG1jKm=&S4dI8TnXjtkVNqW*@K#euY@M8K4b&Sw<\S
WlXWhB nI#c1CaLCw=K?biWKXuPu#mdy6cX4RB85!*nc&$LbR%$Fdui<WAYNR\iqRX!^lCp<Ti%NKP+PAb5hY^K
wa4GLE h&/P5Ja6^EPRMu$F:KLueIdMGSc?R5c=<YDS?J%L+%i8^1:1^C>NFMQ\kZyGAj\SMY96ta8dY55ChqHt
E:caSW XK8ei%F^5*p?IGn/ubMN$?bk#M!PyR\$<8at=YSMk<cMcI%/NhFNLcNaGpQWbtYpeiN5BhW^^16+dtcP
l%$6aJ M+b4bB\HqPP#$bXneh4a/D>tyyEVkua$Fdl&Y6$%Alun#KnndLX6$RmbF#%J\VqT@EK%q8MXTw+\mBwA
Yqj>d< bPWk<%ReIIYL9%G/A6ec<wa/cw=TS\<%bXkp5tNmc>YM\w&8F<iS=4VN9elne$Nk:t!aFGmDWYhV!hW/
ujAAh& qMcI8HWT++lc?uWa/$/M<cNY#hlE@^Yun6Qe9PDc<Aau:*maG%jHuLnw&JmWYDdcPW5#d+1YG&k/W4M<
S1H!X> @MjCGK$ShladS&K%uGGPcE56bb!iBqM&d4Rml$wdNb&VDZB^aWZPc5jTVn%D8!BF%51B/^Ad4ZEyZCi!
y+VBR< amluVeCGH%ENFN!/BCKIW$h5dPKa*BE\dT+aBVwn#K^4a4XSt\y<w<c?6tpWWT66VAiAiB!wGYkLPKjt
bSXq$< kb1dWLI\=*b%9NatB>u^dK=*HBIGLRF!6K<W>c!%eVqK/$adc9%JQViNAdEy5DcCahi1ta*nR#QVPk/u
d9mlPQ =TKuIl=D6mJZtdhdtWiA8k</ap^5hB^Xt5chNi5n6Yeha//VB1VRWA&#\8hnRN1cBRw%QMeKRth<4bdn
IP4Hu+ \K!WVB=S5uu%Ia^q$*=WRS#+FLA\6aJ%b+9WtHm66/q6G8dp?McB5DGP/FHP5+#Xi1X&yekqPY!8QykV
:6qqKy @tN#VYBK@EAYJt\\yWiYntHXecew4jD4^lD1T*ShXH5TCFtXG&XIF$acTylem/Xb<SCdq*LSA*?\8V:b
!w+^M$ MC%wq*LXBp&PFnjd^n?tnhJcFKY4>tIRGwwNJ<caPM&Cm^8=NNGKlSW+y#^*SDaG!l!MNbRw&HF%ZHX%
c<!j&t nN1C6/uZKC*S1D>aw1jHWihFc+!ll1RQ+RCT^9lwAjwM?nLtN#AnSKw^<VVD!<&tbHMAT^akSMXtSYjZ
j=jRCP XHN#\\T%5XLHtHV>X=NyAXPcWPMQtDeP%6uauCuGcl6iqyid6=VJ=YZHq?e&mKhyLTS+IF9ktqKVndj8
dnVw4d mYP4^d+yPm8D%wn?^bS?a+\C4qTnEPq#56netjw$P5eytF\CHEt<MqjIKXPbK\PttPhpw@qGb>ZELe\G
:e?RB@ unHA<+<yw/q&%jV1=uVS%Pqk/RYXk5TYay1cQW8Q81w!X/CkX5PHibT=\VA4/De4H9MdTLFRLtC+eVX^
8tXP*K Nhq^/utyGY8bclP=dVySpe8iMTTCa4N^Q5#MaWGjdEDDMMkX!YbZ=\1\SIKZECecAK4e4NlW5KEWtBEu
<=B=P* 4JqbHXP6nLc4ZiH1VBi6Zic=JAMwb5ZRmw5t+4uVlSCDaMYq<wV=+%k/Ej:*!Wa^LIY/CD/CR/Sp%&\H
<H+N?M yeTAStP1w&N$e+q6hTKCJknGwi%k4y\Nywq!BcHqS81l8+ATiZu^%VASk*IF/hbDjYLRl%tyMuFKJ6wn
SlWMYQ BRXdA=QGXQ9/S5jwc9Sjp>KFD5$A9C&HykqaetVQF5XlBbKdC/YZZnaZA9kkdTbZAJ&!qdtmPM#Q+V<d
kQKTtc P=DVD@!L!Wd=yqbZb%j:X99G1BiZ81KNXmic%N/nIh!ncPN!5eBctn5d%y6qiTlMN6e5Y^%>1JISAL=4
PFETBI n1+KE5:J=q\Nk1AEBwX=+<CP$JS<aYy+J$4HjHVIy1nbw4ZtIkG54cacKPK\5M%D=!D^NjS@J/#KMIFB
^*Ha8& w+W$qYbPqGkW4t:INTa8B4=>1&Pm&JmPMC&ECh%kpIZ>pY>MXl=1M^b#RQTCYj\+nD9/<X!1\qCDBZK$
@yRZYC WiTK<j&qYA9ER%#k5HQBF9:HwG=l?RFun$/Nm$8NAia%RhY%HNqw/^T\ImAJiSe6yDmc8VQ$MDiC&p:I
#$M9a? CSYwbm6!G&c4E&MIXFDkRy$J?TqcBS66w\$*KenWN/atG<lSJhPqw=1Nd1H&#qnKFCIjVwqXFEe%K$1E
pRCSX6 NkTD1>Xu^MXa1qD$XXlacCkCt+9H\\t^Y4L1WJACJGNA46w5JS8DSq!N6mdpX1M+/1A\kyy4>qSlZn\Y
t@Ab5/ G#W$<kumcWBRP/\!6&MP4C>b/Kyb/lm1#bPmw1JneE48WEbWTlcVVY4a8Bdb/ltyEhD5G!&HFw^aJW@u
aceLEa =&ISmRGQ8me\$<QbIBy%y8E9t!+CTLFPVRu@pGSM1t<$S#iL#SbC?AAZb4PdWp%RlnVe^cLqb/pL^RkS
KFMApM ?mhHnBijnjK6S1Lb\Le#4ucaACQFuC!PILh8$uq^1lyj>c95dEWY=FuX!t\D6eXtA\kVhP++IEkQMe%R
uEyBFn RYp8=E!FwTGI&myDqX1j$/l&WaGFD\blwq8mCFQwmw%e5*$^*aX@WNQHaqWPJFpRd\PWLA$D5PTD?aET
<>dZli IYLubp$Z=PX1*B:@<>CI>NA4+$C4wMX/HMNeSJ1qNl\\j$6aRKm>SKZG^NCnM6HKLFYe5By!+!!w/^8l
4aN!=Q =lAq#BmdSSHu^NHDK#PWHLX5LVZ<4$i#A$m?cQYIpR1Qm4Bb:hWFDchF5BjMkMBSPN5FmpCtJkmYTCdL
=9+a4Z DF=t+<K*HZ\TytT#SDk4nJM%maeelemKt:TcS9j1*E+ajtn$AZR=5Xmkw?=RlYmbuIPAyXcldFuI%ZqB
5H*XF% eew51FP!G8J5MFM&q9Y^>KACjIQ%SKnW\X^BZa?15J1GG&&htEQnPwb&6S8tWM8BQJdYblkHePw5YKJm
!1y\1h 1BC45@VAm:J#&T#VHKyaRL5WyVtNwc/upcIlF*R+$aI1th\PTn#?kN1D@4E=uFN\B*hwGI&m#l?HPtT#
mF>N!i XNqGeTlR?l&4!LJE6eXtLcZCkYRA=y&kwlPm&?ZSnIhVwV/N+^n8VMBtetp/lpjV&K\tZLTlIZ5dHm&F
/>T@Mu HHbdFHl@ZHaMC=I5!>JDJaJE?SA5tC\SCAchQu8!KhcZNKtBpK4IRWI=%ZV&d8kIWB@peuKQS:m%GVyZ
G5pIMR ?$SG$cPEKVE^&XE+84/cX$$YbQ6b=9R*it\ZnAXEM+X#PM6+/8@b8dWSqJP5Chl^jF\iH1jM\wN%@^>:
C5qc1X Z\IaS*EqYn&HL85$NlA8Da/hNXK\HaRZA$p5k$pMbMEane$SH<KY5al6iTWLc\l+&l!K^j+jHD/RtJXA
Ba>%IK $a!J%BKMuG\&?jEtXw/jBFc&uIDMaR6yh=N\YhJIqtapVZjZj?>Xhe?MLJ5#!i:@&/NS>/6Z%/6/:>Y4
*6@TDQ X>W%tAu*ZYBQN+X>d65A99yAwGp5+CDCW8F@C/yNQbCmTiK+bYKwRl^I=GCp?AKJQ:tQNHLhaBXS8#Rp
+>Fyhh cG9!RyJu#qiQSMd:DHp#Bt*wS&>Am><MPtGkCXRw1CyS6MAImJH>ncbGm!bpuacJ/YB9:Y66FcJP+%MA
!bwQ=u #J##mVy5#BwTiJ^am5q69c>yHA4VA$+5&RlpRCIjn4<+%GeKp\LtP5kuJkt:Kpd>*F1c#Lcm!?aS=K>c
eGq&l5 M#DdV^^C:Rl*>P\KZ^#%wXA#&HN8IlJcQ56QFKJCR^>Vqikny@CJ!HEiY#XVn46w=MEEyhY>n?VWDBVY
pMEL*! C5e&pjh6IR^AWn%Slq+cMhG1J>ceCPTl!5RilKEmKD#F%acYZa58N#H&ay9cJkcD$TIdy:Y6/I\D\!dw
tqCL$A %=Bh=yD5NalY4EECmekGKK?!*4KVWe>Rt=1BZL@wXklFSRQQyYp+khJ\mlMF:ktAbppnL5WykhE/C>%j
\&I8NZ WD>MSayc6B:KHDAuLSNWtnXb=B/wSHKSXW<GMuC\DbBCCt\uXYt1/TkHcK<F:WpNnka$y\TmYqH8!F?P
b4*&JM W?SL=b!SylYX/CttYZtXZCH\&bIy8BR/EI$CGJBkCww8\5$kAMmb1FFcJ+SYAj5ZdVj$<=ucFj6cWW&n
KSWu9# 1NNIc@eePiKB1kb!XhiVc+98\kc9N*%GkD$CLR1KHj1Akac=q/6KLXA+4SZh%GV=68D<A4:VlJbYTRIB
aTebp# yQWR?1kB*jhbtyZmQ?Gn4lE!TDi5B6w%EIH$8R>EIlQaPwmnLR+Rkc&y\miNSD1kacPTVEQn/5*AKnG1
&He/kQ C+lERC\$Wj?l<MGkRK:+y!44Sb8K5tk=lCLWTHQPL=wWnY/kMkQh*$H1RtGPmtuyc1ubXHLTk*Rmi+4%
@N9miV D=>RwtT>XDcRT^m>\uCZK#=XSHh>nT@S>+BqI9ME1Y?4y=FDl*J8qcKRGlTcHHyWAT=Xd!CywBGJ^FBI
B#Xi>Y a4*$twtiJHJ4K5Z/GkTl^NRuFa86CtwNl+&AL+*<TVyNyhJW$n/%1PQYY5P8S4/ZGESyIXNa\!HW<k\*
Sy!SGw pGcDRuBBDV:%qh?YuT1$k:VwlICTtSlASahm6nEXZi?64T&6+*Ipntw==IwHmY\FA%lDNR!!j+:qGpX%
X9@*t= Cw*+dTRVCkB=#LjYYd+6qnQ6cS!Wm8ISuAn<QjRt!F$Lmq=6BE^QMWAlw\19uS1MwYPT=qH*YaVXmHH\
-ABkVG 000f46d2c9e001202b3 Page 352 of binaries1.zip
uG!@iy KdNtkYDV?51uKyGLupJYydXCcVamnR%wckT65cVcXM>8qSwA&RW>PVR8wmq<C+%S6dTilcZVCwe9aN9+
&cKC%J enBEmy/!F84p?lt/Cm9^j>#9RN!n+&Ab&JKmIwpc6KcdiIat@ac&R1^8CG<LEByReSw9ywym4q>XW\p$
56:XeY XXFyqWCtiKBS^K1Pn^kwTQIa\LG!!p*18%ZM>aWFeJ5eMJDRGApJ>mYWm1:L??Ip$pAQC4V!KWGcpBA5
pIdp<1 5I4YS16IGTGNNTkj<BF&+@a$c<RIY4N>PXYMcT61lc8ZFtn^@k\/A\Q^mW\X4V#Y%%npQXWbDDaR\%wK
aGK6*l TFl&DR*BJ4?k$kkwMEA1NBWYW^pRm/>KmTR=EiMn?Rhn5tSRh:Vi=I89p>XV/$yc6XB#cHBwPQ\MKX*k
lQI9+k y*wj1h=/IlXMLCl&m^8dXw#E8nRWI%ycVQm#NhADT>GjEE^8WX#C68l4/G>?bZm+@aYYWKljI*%AC#jE
<Qq?<y N<Gh!K9TeAR/6/dAXBSZJe#+#ELHEXy1P!EuyuyJpH#wAZT#^qeM!ABAe\yKDaSiGB+cdP=9Mj6#YpL>
$VZ=9L wRbm&u1!i&Ae\WKnkYyV!&/%HLjWpnk*XPWpEWbQYmiJ+XKJ1Z+itnIw@Y6Cm<DwK%t%+WV#$iFRT#<W
lM9ahh lIZ%6$B=\Mm+WANEm5Z@XM8<1*CS@I@dNn?XhwM\CMTKniAdZCV\BiZcwhX@!CdRZRPl+YFS$pB@C*#/
K&u$y+ R/EGRFDDk#y%BaX5IK>?nb!cpp>Nt8DZntk4eF^B>%\\Jp1Fyk#/@Au4t9XXJACX>XyLh@ekFBL1:!j1
6:8XIM RqmkYG85CbC&Ci\ER^uuG9h8Eyby4YSKuCaJ=4RG4GBM4IbbT?9pa4hWkPnBBlL=@wH8wZawdIDc6TZW
lH#9kj MkBAwI4K^hqWLJDt^$LlL:AFG*JMpCbw9aRtWNCW&Ht$JpI$$1JijJG<CkhDWN&XkeH>S>6d1CXDYN/A
%p6pDj JBJa8AEIlAcFekJNMQ8H?&bV!:ChdeJ9I5VnT:SVAQ?\XCwR9bR?9:%TVC9naJ^1k$Qh&JIl/4wY/5dR
*VRqp8 RA6KJnpbWudTyHmuH4k*SdKtNc69mYtYPN=c1$qB4I*J%pV*65@j+I8QW$JZX\+PDmGBA>mD%JV>%KMB
RY9R#/ wBD/MNAR<Njn@$CVEZA$?RQd4Xpl#WB%c6P%R6iwWk^yl+DpXLGYbe&mWMGl9SEi*n>IXMw?yNaFJmK&
B?VCB= kSK^?+B%tl1kWaGDk69$8MP66NXclccb5F#=WCY#BqYj/k5pLk!LLSWk=N%Gh:lFEIe6G!J/kZ%I!\aC
X4TKc\ >aGGJ9mHleeC&^\p<nVHS8cJ^Yl&M\*NXduSJYmwQHkb41?I%T9ByGL*^qM%jCR<GAyb@IuqDCCBLVZ%
:Ph&5Z #=k+*>mJ@LpVTk#+tlyA&Y$Y4ud$JyJ:AT!b!=FAFA6T&:Xm5i\bQ&&>camdEGJk+u^aG$Dc#Q+5=J^?
aFmk6? &a8XNWakyV/AH=^+%ATcRHj:PHHtNE5ia/VH!dPHuMVXXTRe\bm>mknCGQSbT>=w\8CwAF1<qjeS8&I:
iH%@ip pw=4IeGEkSPcFA4D*69bXANpI1uB\Gdl5ESnHChVenKRRtZlXlwHFG8wYWAw4cEKkVS<b#>F*lMk6IH#
d9YE/A w@FPNQyVTS^BGQXAF4SpW#&!cn&WC6S8h=NDDbw%nbdGlN>!6eYyEI:hGBM$BlIE5q/cN%B1be$IH:E/
=!cD<% pkn5J$WH+wlhl:IQDPPHj+H/tpDkteBt$nc1T6w:Sn+&4ny\i11/5XB<!AmRT1W%Z6N*XkQ%ImyWWC8e
WH=wcZ !&=Mq!WBiYdNYV+5CJ8$AbkG!G\K+ET!PqYPWKm?ejI98BYc>H!yWWEN!FGj6l*R5mYW?Sp^5/mu&SWy
pi=KH4 M^+YEpFFC1tE@6WD9IpH5y1RSJkK\9AJqhk5Fli+K8:I5=twWGNBciDw1w6YtW!jk:!Ju//l:wMlmC#l
8JF&6G ln/yWPpQ!$V4!k!e=Y6CbdP#khkX1wY6Y<&yDe<lR$%4VXnMIPGQtiybTGi4XD!wehAlDTTm/X596pPk
PF!wE^ GajD5THWt?nJ@9+cuF@1kV#$=6CI+Y?CcRJ!$N>Lb!tcn5FcIj^Z%=L!^u?^wFVn%JH*&TP^&HIDT4Y?
8+a/$S lp!etmA!K6AI%5cFLVlA%%D&P=F4/wF^+LpT?cclcah$qNJeBwdpGC/KPWZZ=qCBNFTJ+hFR9+#:E\LY
:RZc?T wP\Vjkaw@Cp^cZ&1JmSGpXAwWEP:4CwDyMlS6a1T$T<QaQpEViCkL:XaSL5CcSVnFNtLW9bXHI4q4N^u
hT9=G< #eE4c/!!aKc16/RHEMBilnu=hFKqNQn9DIAewRKwVJGiN<E/d4FadGkLeNC9FhcN*HKp+m+dNPD<TWXT
ATNG*< H@1Cy5:unJ#eJ*bXjb5C!hLA@1PGDYA#R#5*diPpXVQpbFmISk+=WNYkNTCD1Z1y&QHli<b94=#WpQ5E
>*/pD* ZR>cT=mjHBulHDRB@N@ui<1weWDlSmC:mc!dBmRW#SMnWGYABSCWk/EYt!B6B+w<TBNG&\KZCmek9h>p
:IjHdt NcKKA$JwHG\JuYk^Z@A$9>D<\k9>R$Fl&jtEPdXVMG6VkGRG4Q>:5&wZ%q$?@@LX/E$J+p^APKl%:XNB
qm@@>w 1ebX#SIQwRV8A@u+6LXClMwcFHl#e?kFKP>EQ%t4yGLDQ6A<>eRt1PCp/RH&4SFkVjjt:K/d9:B8+iYZ
pHT<=H p^?\6SWcPp<aQ4VqR?!\AYQ=K$Fl#JE4wEEc=DY?b$KDLe$uR5*Nk<J/dJEFl\/FktBh?kLBJw6TTT%N
QQ+/tW :P+%/qJ#d/>dtLh\wY4I>TFV!$iKWVDqQFKKJ=JL\/Zj>M&yJ/6uaQAFKLS@TFl#yGQqiAKjiqT1b\p/
XLq*6k Wcj:Re9Y?LEtXhpQ%6Z%%NW69L%uah+8VcMFXqV6DIS^eXC%lEWN+w/JkBm/GlywP1MhdRp*D+dBBED:
b&1+Fe m6RQQAmDAAwPAEeHMkTX>M?5+REH#ID8XdVhbl%@dF4h9IW>C/i66ye*VP%e&lRanAtbpSNaj?A?HC!9
!tbFdh Iwee@A&F\mGke+CK^JIHlMuVL+!S$CE!5wR6R4VYN&DH%wAt$5&/P^/41=5QDZ*dlG&^%&ym%/WkX$w1
^wi?DY pk9Vhdu1CP$%PNk!&I$YD>E4C?&*=khpDyqRnCuFB$a!u=kAdhi%4Flh*YQ\td?&:81FX/$Y6mb$41yb
w>mmZB G!?qVpKL9iE?ae@Yt:+m:YnwcH5:&n&cWLkDYCd?d?tHGtAdDLR$mX+X@a5C4DRF6n9qKpB44I+9uF&*
9D<J%? >y!4J1/T=m^6^K8%6T=<GuA&BG&<CKY&+YnL+C6l!*aYyt^IEA^@Y1mF>K<t?%YRYpMV>5wJWP*Bd#!p
ejTLaV %/&@@Gww<81#4/yhDS1?X8!ZwkGGJkpN=JTR4X9nG^wMDi&HAwl%5HYlqH:NwlQJJPwD<W+F<R/w&N!X
HCFBD= ZE5ZC<jwuw@X8SbiBRWdX*M%Y?^!6ZaEku%!lh@!lGC^&uBLPD\kJ!NYb/L\WJh1@WktlwZReM=AG1E@
mKS$%< eby=4&JN86\11N#YB@Y/%Xi94X8dt%eZ4F8:eGHi%ih5?Ia>+/Q6N@hb699J$GB:PCV/n91\BjSCQ:W%
muPWt@ $mlEmeb^wHRuhTt\QVV8#5AYR=wuKh<k1?<lw++>d>RyJ*jlk%quL9tmuQRFkW:R*wLR+ZDL+BCR$++>
a^aSAu S%PVWH?:5N6DbE?H1Gl5=+qAmmAVdPpcaW8u%yL!SYhVGYmKNR5jitkE8Gj*<<@Z9jptKw+q1<XYbnCL
KB6Gby jHIVBQD5aBl/L*RI8\=dE9I@lQI/RB<l8hVY@VcbNYSIR>>YePFEB/FwJY&@A5yh8%CPwCA4?%Flqc%y
GZiA5n yYLqblyR\WhD+i=\TE1HwI*59ua^H!PK6Z/lHEQnAX:n^P+$A#Yyau/kkWyZ>5pXGQ:R6L1H<6cR^$DX
BZl<bB B5!SY+!/u4IN*X*au#/\WhA\Gk+Q:P@G4yVhKd6^wEZ\5Ebl5tl+&CptS#=jVbB+iA68SlLtpHD>*QJR
Me$Fn$ *eIJwiMH#bQhL#T*%@Y5Hh+@NEmFawuc!XB4>!5l$n+pmCR!Ic5*RV?$C%YMJeK>JSb\\Yn9l@:eIjw#
I$*MqC VTk=VbP8tLZQ=>GYbLY%?&SwaBC/1c:u11GV\?bRC/q/cNclw>%C/&n>@eL=MyBIJ9ZmAJGJi4@jV:MG
J48waA >PGTu/8c$!I=6m=8&KVyk+EV?ieZ4mcX$Awh%^K1P//Fum<L6R?iQNy>XANSGS+aQN1NbLY$Y!I1i#Ip
6k%HB^ &yRcRiwHtuC*GAH*V4Rbk=J:aRKG41\a&y$dld>R1*6wIYt?XqA=A!<D?:d4^\@%6:#TQuR!FA=4*TF#
Ve\PW6 TEMhJ!^+$ciC=HdS15nRYAqwZ%RS@T?n#kXm@VY?uT%?ZF>V$DlIweEcY@p8qKC/6diSyV8wkTlw#:>/
>dnlXL V@5*pa=D:RQDJ:XR<:6Hl+V1pZN1tuyK?Y#HIc&>yX?wSkT\:BA1ZV<6VaFG15pYc\Y$N^V@wSMDc4E&
8StC!R CKJ#G?4AeClWh&#Dc<WD&556a4l8:?@t\!PDw9PEB+kpXHI^/CZ+cm>L:lwRBn<K4F<5FcM&jGSHFya1
VSekpF DTN%F<!RWty^j$>MNi6TF8JcR4>t%m%@9m<$%C@>MJAJ1MBB?al6&CI/5F?THY49F<P=cQF?!YMlEB\$
W%bHFA Q@\%TDBZ#^Ydt#Z4LRI^L<V^%Km:de$8FbL5N+#&R?$6h1hBaaMlilRt&hCAwFTnS6j/D=Epa!Q9:!j=
dKyddL EZWMNQqwVRJK>8&w$tKJA!jbS:W$GaXY$FE%>WkGGpnwPMG!\1MA&MEl1cG5Q^Jp:InBh$NCY%B:9?##
cIhDei :aTQ*@D=8F1NuE^DcW\Xd/8w$kLGy:4uh\hJZAaE4@cHDwhICdWR*WJTl@d*Y%alWW%/j\BnBjq\j:<q
F9Vj%T W>D<>EID5DS<d\=KylLDKhytankQ!ki5khAASF?:wKajP%jM%kd/#i:8FmG/pLubu^wTTkPtn#N4PBh/
w8X>w+ VDRQtI$:RhibQ8d*8eldc/wXt6^1VR:^YyyYaT*EtCBHqRE^Y5NI$!=WEu%c849*T!pte^H^^Q#6MIH$
6^=PZy <SHmh8EEpc*h+Aj65+%wq6%KDIa%RCNNXCMwQSBc8>SFqI65k*b1CN<4?<Q&IIVF9>#j*m<WC$^NV9J&
l:=SF* 1du:KVJMZJ#R%5BkNE?XL#=bVpj4SV6/Fa8I^qjl^CknbEm#^HckyeH*TnneIpkTN4J\:!AAk@5SQmLc
SmPDGE A*%dA!$kXDkh>j81b<iEyWT9+/DSJp%Vqd\C>M+KDB\Vcu+:mSJcbSc6$Ht?tnDSC/Abtw8FDRm?dlpA
L5XPYm A:#G=H!R&DNEXycjlBp?NdP5q$N1Jdt%MVt#1:Yd&%T9%KR:K\my6bCpqMRZGDWM<tTycit6$+m9ei?H
D=5WQ/ \e@CZleeH$CFTiVYyGlCciB?d?yl&8@?lXayXdLV!dWqymFBVjR\!ZIwBDdHWM9kj59REQJ4>1el4kX>
M+\:jk WFB\GF5JB+q?LNIuGy146&QP$JHC/cyJ/8M9FRSq1$5h+%eDRcm:J9TWB6P9\XD:pP#lSAai$GCPhY+D
Y@X4dL #PmHB/V8lI=BnTqI95LmK*1*Lmd>&pKhmLilTK#6%RPe#IMymSJ:JbAFFB>6Q+TcjIBtAtKKPWC6$a<4
VP=K#% deHlwY=VGD#A/!HWZQA^@V5?K>:XqG<A%X1KY4!TXB8VL%mKbW6$5%**DLwS:t6BBaW:!tH$GnBwnpX$
m4hFJ> Y9N+aHyeIYwJDS+hpe5%aQPIZbna*9mYtZAWmEFC5FT6XCd\6+?eF*F!ca$N*<IEp#%$CP#uw/?EDl>6
>GtWT? q+M^#Y$%<RTmBDQ*\XjcV\/HBpRua$%F\Z:@nutTYLpmcp595byay1GtJuptt1?FauGc<A\ai98HY$Jk
-AIZP1 000ac723689001202b3 Page 353 of binaries1.zip
l5#%%G n<u8DRpnl=m:lT!4+WF6yF$EwAV5FC&N+uT8ZDak44Jj/<MHR:&DNHc6tJnWTwL^XVGae<J5F!ih=pBw
e\9HIT cLlje4V$$<ybTV$T@G=+/KR\XLA6+9V/hwDXa/l#k9L%FCuQyEiCCe5aPITlJ@#L$9%?H>491m><E8aw
<p:+IP \=bal!SLC:6b:KQ1G#wcpwb$T*?NLW6?Z&bMcGKlQp\%Z@JYVJX<VDTVNSdD6/Wk!q^<XR$uwGBP<NAJ
c:bnJZ e>mi&=I8q9M\aPtuRJ41jd^d%GSA/K%AnTV=M6G=t9Y1qbnE%$4b%iS$N!nhn4Z!lbwq?NaK&QNHl%1P
ZAj4M? 6k>Ky+pq!!E=kckltt5c?1VB$DLkq@yTcyBL^jJ?4X#+qy&K4FR4nWAy!c4Wc#\+l&n&1>4IC\QDR>J4
?<tWa@ IuybYHcp8P4NtyqWhEmP/C&Y+nL>DASK&q#pbc!X9dyL9PaYC%y9?qtmHK8%qqq\dS/E1iWpDaF&Q\>a
=:eWmw 1&R+TPD?S>Ime4#&w+@Ky9yP1ae%%iyYPXDaSG5^/c&K1jGZAXGm:?5??WJ*h#k?KSTeQTAeDmFR%hVQ
TNpeJ8 ?JJ!C^pkNV/j9<Fm:Z59R5y1dc>14hDM%68/MYD:VCq9al\#Xbm@1q>5CAJjHS$Wbu6@+ph$iW&N&I$q
CTDJJt NmuRl\\A/*P&MDKFWybhYp99Emw^KKM+J4le!J6aLR#KF\KHl%++GY+Zp$JlhaZp5mAF%KAw%@9Mtq!4
LGW/=F /H1!>YRu::lML8jYmnW/GwX*$iyALd&NEXV6<Xwq$^61wK6ZB%8HY41H81$yIyG1^YX=wAX>9bY$V/m?
6lY5!4 S8!Mlm+Yd$Gk8Xh>9q%cM5ua+WD&+ylqiJFkcYTi$e6&cuk\NNR64Xi:q<YWtQ+Jy:hip+1LdWm^/ZMB
&BmQNb b?*$GYl\cbcFJdXG$HwZYyPjtKTh^CqtdZdyHt+=P6R?IBdRlVq6!#Gbu4RjLIFiZ#$YKe\Q@PQ16bJh
e/Z+&W bZQCcKnF*=SX=eKI>S1<XKqR9ZD:$PBStn\lnYa@D<&kYaV$T9dn&k58kyp%M/!mc<VieDFK?DcK5X=&
P4qEhl wl\SlE5\J9lJKP1aJFm!tVywl9eQT!6&\JJkRdLwhLFwY!NJB4uK<kuG5kS=4ilkcWZdyy?\PcWTy&j:
!HbHJw tAW19uXwcHm\Y:wc4JqVTNlnRujXmEMh/yHtt9m?VtV6Bm4@EqWM8*KVt$adF/lIYm&qXyC6d/1LaycI
GNH^>k D@KV:YHS5yKyR\tDFD/I*Z/X^GM%QkNJFmyVYNa\Xh$m>wBkj6Vi\9BE>YqVLLTHJqRMWl\?iuS\EK%a
>#kMIT RdHaGNI8CTjtdlGuYiAiT>She8WVLX/jE%8:bm+=4&LWld955\Wpd^P%k8?R+K64=em6l5*8>4C\+Y#F
EmRlJ8 NVAa=&*+QCZ*PlLBIFAt!FN/E$!hlMHue>cT8*YVMAYp1yd>ZS6V+<99wmFWC8$iGY+@*E/>&Y:L<JAY
5*nT=t :&jk/^yc&eXTK*&p\?1FRIM+??8^/M1kPAcFl5bci8FhCnZ%N$+8$B1\h8ZFmQPQnk!&l@6y5u#Itqc$
QY?!uB D>Fp$iy6c&?Z4%LR:K5SP&y>RLZyW*d/hym1S+\Ca9%N>LGaRkpiC&I#8$mlpQ$V1^$bcpe*!EC@=h5C
p&K#HJ Y5Q:^jK+ZFn\!Y%/hGSIja%a\Be1#Ej#bN>ePW*TBFML+a4Fb%VC>AuG^JEYayAMDy8Dm/Z##QL*cN%l
HE=QK* 8XaqaPlj8W8+C4WaFT1aDGmtX+E8qjMp%SLT?BSCqS$dp%QXGC&ajRuKHl:eH^Ii@kGyw65Hl<LT>$=D
tkH*y> XV86*NPc5mVaHl>4eNba+!PXLeVZLpu+I/!Z5kZ6a8+Yw?JleNy@tBlLp@:Lq9:Y\iH>W1#J4n^Wk*5@
HquE+^ KuGQG+%WXKRqYPS4A%p8FB+I/Z+Sl%iw6hL16p=+EKaCtkJZcYy4>/AeBc*Ja&B\@@CkbZklB\SInIq5
amnwkc ?+81JFYM#jZC<Iyb@YqQwIK:^Fkp%/:pT@mc6Im%<H+cD/tL!btt6k>&$:LKwZa^PAaccLZ:KYS9ZQC&
Icu@<k %wi6IR8/?T6!V=p<$pEKNI&>6hIDI<ScKBm1D$:IlW>Gct5%&DIa^l+&R*<n=m*+Zkb88KQqd^>SLMht
NqdbZ+ +X/E9*XCNa5J1qVI5cA>@5dpBmq=Vw/\BMQ6*cKSedcMM&JXjVueLt^wPbWB:1$WP!hkkD\LYX\RddEb
5&A^lM 6nbyR$F#\pkl^q>T*ZLZa1$a!G1J=ub48ayGBkkKlX8FKE9@XI%+Z/NGFE@9dCT%PjD&DFKT8?neC1t*
pYCD!d !Ei^XyM:y8RYSqX/ydBtk>1k<L?L?XE@%Kmqi*Ak99!4liSimm4c\mHPRBJYwJS5FC1^eXB8n4LHJiyu
!=6q/y MSSKWtQ&&SdB@iFZR5K=R6b$CLytwH5R%%#RDWaX\G&>ktmpG@ehmQh!=H+4%Ce:XKp!5TD^GLQ<tnSk
qV8/il mwqMMPF5C:Y:Y%k@\yi4AaNy:YHL8$tCJ6<K?Dc?dWG:bGy1JlGNF6lbq1$XXKWhSQ/tc+C%9mHhMLXm
\LYR4P LCHND6#j*h%9i+d^Q%mj:YFND5wp#9IXCHVF$Gb8$tcTcKuBjTZTi/&KBR4S!EJXmhc*nDJ^pkdXaH?*
^*6?=l hF$LN5Nq<<H\wB!q1WKtL\eqy<Eu*kJADY:YbAy>InY+:&\=?de:MTbGSqNhHSP>dl*+JHhaAh*hR<J>
RBepZ^ 1kq%AlX/Bhqh&mZaGQVmB^a5*9qAtedNHZL*6SmqQ!QQDk6KkddJqJcJhYKIkhQdZVT=HSIVXi%qwTml
e<\Wup VtLJVa^cYLTQ*9PiKe/a1MT8F8>>IMuRBR/5pXhMBT&:R>k=MYF$TReR&d$^PbjHA\PGl5S\%EJne\6E
@8uX=a GlkiD6pPZin1Bu#Fth=Xwlhec8R:GHV\E=EM4D>H#BmFP%GIntXuChpXY:^N>Ta^W8JC*Q+lT%?$9A\N
mqla%D DyFd8w>c@p:5B5$9Z*tS4!/J@j9m6aF/\iR%9696ZRX^J:Kt!yFKt5H!=SLS$d8$68=81dIFP$PX\S/^
DRHqtk J<&+EpIFt::#/B&ITuwlVFKNkw*dY&y158YASNaXYhQuYBc&uNNI#+CKW&W\ln/@j*C@6Z8E?qXXY$Q6
+VSu!8 *db6At$hqPjANNn9a<1NcQmYmF6awnX8aeMcaG@ZY1hLYW=5VbIh6DycdRXwTB956>ai5P!ayk$i:k=J
JN:/VZ /\V4+:i&l%4HBn#qp=9DpG#c*qn98%Q\4XCY$5paDMwB\#dKyFWcw&F:?JX&i^pXS!4WIwQhq9&FlV>D
HAmGn9 l:HkDy>#=Y6nhI^eJXtm\918<cWG^TIF41=TW&?WZp=4NmeMA/HFlXSD!YINqRcLq>6XhdC:8%&TT*cR
udlhF@ *&@6^LZi*9VXQGZSVIIF54dcWp$^LYmdQ>L!T9BBB1*N$<AKMHNEn+AtF5Sc6GC5j*?*bnt\5RI1E8$Z
LYbypB S#iedjW%#c/ip8MH6HccWB+$LH=N8NBn6kaSwDmwWFkE!Q$uZ>GE$/iFXqNStAiH4J$:&AN$ZI@a9^C\
SpDEpp Z@9FHbdjqmj&aeQZ4BWCI=#*6M^Jp%dL\!4=LP=QkMwhjTZWd/&SR%tcFt8H1aZe9aMYGP&>Cj4E/RcG
>yF%#= :!#^$4l%VKGk&*i:JVicjHhJ8qI%i<W*bt6S+aIF%1c=m:W<DlEHD\@JuV#W&HVAwT<I\8!ZS%e$%ImN
/lTbF& %@JkS9##8eW5$eR%C#F>1k%cdC#<d&Iq#ty1CAN#Z8#hEcMX<EK+@YmIkAFcPeJ*1Q&+m!Ik#qQB%@LJ
kn?=\F HKkmM/GTDFJlFRTF=$WewWbcI&c6SWwuyHA>mqpP:wMZ#W&DM>S4eECPZEK!5J8jRi=Y4jQ5Gt4pY\NX
/hB/EK $nIDKT8lVhS1*PmW4C$<W&I1L?*\Y4pE*Nwh5y5d96BG?\jdB?S?AR^Cb5&<#\?>LZiAN8Ba*WCnha&\
bVFciG #Ilt8SCp!6c%qq/qX#ewGF&#HCl+yNq?ZM&$JLwj/#KwphHbL1\Ec%WDV%Y^D:iT4??LE@#kZ<%<PbES
JukdWw b1?e&And!>=+KL!>$8+$%a9ILSKm%idRAFW!dG%q\4+&%I5D%NMN!PLYT%uY96h9+!6l\PEqRYqtT^6R
::\dPd tET&j$1\tY4Q&MqHMkl>TkPp5ApAd+RGcCYYLBS!iGjnG\^I>u*mqCuV^$C<$8#Vwc:LEYPW$Bt:n4Rb
4aA$p/ d:e^\+C9*1aai1VNadRbWRAu&yRn86:G>LG&*CN6dea?1SedWDqe\qZZQtE!54d@+G#EkP?@\@hQQG8E
k<G<1j e$Q%!VG4=t\ZYZkRd>e@<4S>j4GL5tFGKuY*F68%q/iCmW8K>!cuGB\uPDNn^uVVME#/!J6yG5Nt!pqV
Bac&cN jM^5/\p?I^k\wyku*^8J<ST\ukNR#m%eHCDYbpCqY6YC\wLC\wJwRVScaEVj<VLj8HecH6Zpk+>jXj*n
Xw9GcK K9NQ1NPp4WTHd^mcA>wacDQNwAP196E6HDkGh+=w$aKJRmXccEchN^X/jca*J+wqRBp*FWcnN$Y>N=9i
CS%^66 :GlByHB5=jm8YP5?LGHCt?*#\5j9LjVmBp<5%Au@wX#FD>X$:>wZlP:d=MaKBZeb*NZqbT9=?MnMp!Mn
$&%5m% jTMnjMSw%XT96^D!n=aWiM%wckpYMc/QnQF#EPj*nRNh@uH@8M<d+@^hp:@LJ$c!8Gt$6iI^a*m\EFTj
M#/j&i 6#1lJN<!6!<I8kFKhtwS6uKAy:=:56Z9nZ:8Jn&c+m&JSky*nR##LKMX18n%i*%*?8:$/9$<#hBwZhl4
uH&Gq@ tN^l6Lcc\Y9hhEbVt<qhyn<!89I>ut$EjWBqkjetd$ul/QnIAJ>t+G5kWDQ@jX:>Qb/ClwntnbuedZV6
$#lA9X c\$G9?CtM>l$!GNEHS$hj=i:#X19F/q$FEV$h*p/XMPLuna9AG+DcQH1tL166VYwZ8tt9Yqak=N1AX9=
qFtlnX Dp<@1Zy9nyb+C\4d*8by4c1KSZ9%h:kLTlay8@VYjeGFdn4?WcTMnI/@#XPlDW1m$an?J*!EA5i>?69R
A%&mJD SEEj%jaIHubZyKA1a:wwd*Vq&#^qSEYCJ@/AyFFSpKc6X6c^C$1/#E$mSK&pF5^i?Sb*6@1<BXEVpuTy
/*uYt@ Q4>KTWcC5uJI%:X8<tHdqa6C+:T%/tcE8\!@N:L4V$BtF@cG*?jXAZq!8M$amZBH1>W$?4:kLY=!CF6X
l4T\SV lV#eS@$FWa#9QAy%HwG1D?NRd8k<E=?k<mAVKpb\6!KDGFH8/BJh%ZaEcqZmJu>pG*YX!NH\*%^a+IWe
^Q1YA! V/4S<XH?1SHN:\XY>:b^j4TXVuL#a:b?pipnIA&:IFMD1/tAYLi!&K%8iwqdV<n$/H&FKK@ecYw*^TIw
WG@8\J hL/X8njQF\9/jZemt\M:&ZpGk=wQEntGjaL$N1ww#SEE/aWFw1IF$F%SptAn\th$kV#h:F$JW8MhH@eK
LcAGJJ /jEb18J6\$!lIRymtPthqPpS!HTj1PlVqGqRXHS+QBwhN=H/aHRp!nNQcpD/!lF8k5mi%EjTPay91=?c
dlNNAT %NZ1>a:6m5mKe5QbimTtZittJaR&1/IS4ykk:+/n@4EIbK>CW+/HIYpR5ukLP5NQTXtd&j1*duwj^G/&
S4aI5< 6:m#C+1t!kNNK1V1A8=wk%T6@lkXCJ!%D=LlbFERARWm+&uiqSFMB1J8F\dlS#ZXL8$KN:q6:AaF>BA$
\^KlmJ ICaD&cbpaeuHaW%$^BAK/CI*8b1wq5GCk9F*8HI!cGK/I@+:jXSL$E!?NyDPLw*KE#$a8^I*4Nd+BHuS
VTqqLV CGkF=cStiBt\yN8ECuwul4l:SFNJKdBlW%P\cYC\cL%tWyH9eYXa%d$MGAp%mW?N6dd8A5B>E5d\P>6P
4H&8WI eGYp!>Rel%Zm<&E5@ZyBLjWK/H9k/*V^*wkJQD*lbiwwKlbRT6/CAl%!G5IVYQXB:nk=*BWVNRE!nFc>
-A/dSH 0007b14b29a001202b3 Page 354 of binaries1.zip
Dq#:I> hctdXtWEGeTI!6FkDAclmJibw##FAFIK^+%S:kbTk5l:4G6Ee^*YD58&GIL1FHPjW%buJFkTtRBiP14C
ec&:ie RDQ5bd6PewhyAMipHMY#E#ADQCw1PIwE&d%*4S6ZKu!6%H5\jyEt<Ec>WenB?CNQHhFwF:YPya5#QXKl
YIAF$n Bq14:BB1p!X8$GE:TTQlGKkmJTy$!M$S4^PaZwX58nR<TuQe1pNEe^+iVGmLL=6?:tQW1MGd5TtACt@$
Qp*&#m =qG9G^kIeumLy\*SyJF1+8nCk*dTD&6cF%SFT&mPyhAewJ!StyFcwkb1M8JNA#/EMZde8\9GAP!S+CNA
$%q:Qe FhK$Q+4$cK&DCW&!nQ9^5BHSyq/STVD5VeFP>cytQ=<&$qXLl*N15q6mGn65cCuaMIMJ:ZIL<^q?TSZq
P^y#<S ++Tt9Vu1#S#HIS<wA\$>Hl9pteMcdeQACc1@#caQmG9XB4ZDCi&$$9R:jH/lbL&F%NDB1FebB%5ne^^H
m\RWdl R5yV%aF4uKC&k+ccKq!FQ1#uWE!dB5VmH%S$HLJ^t>S5Y*W@C^w<y>WZ>W/wE?w8@P^T%VHkS6N:FqwP
m%c@dG wF^l$IPS#?6Zh:Y&kYuqPupW%Ktyu8*HW^lX6I=Aj44wM\RjW<5?nBRel5b6HR!4ZlNMk#aDGuk6NDCa
k#*!<R D?MG##SAZMF8KjSGT/IqJ:&Kd>#$=pJSwACkXB^&5FSDuW/tWXCe&R&<lGe?+16ZWYy=%/Ct*lRDa$pH
td&WED 5:W%6n+FnVm@H<!$9KPc4/AkE4H?+GPCmZc#EW%beDNw?bLwkQeC:A%ReGDK+PABZc@iCccLZ=lnl4D@
uLE4$u wK>BH1M^HR\qB14pK#E@W&NkB8w/c=*Rwbh%J*TRd4a1iy5B<Jn8d6Q^E&qnS<\&%ly8!#1m\%ne>9$&
M+!#iN +I:96?tRPtacpF%5y8=*\PnZDNd!TR=bRcCmc:unjld:S^nX&+bdDS\P#?F?=6Q>ZGWn#@B$KAb+A5nX
hT^:TJ FkPZAch^>h!adykn<Duq:$W#SV:yb5aI&M?6dXCLIikMSXPZSj%k%GyHY^h%6WLu:eP@jc$9&9@^4>Z?
lpIFMF $:9EZ%54DH%6S$R6nFdHLnX&y!L&Vil?QMqJC:jP*\iDw@X=Wh8*::j+F*\^8A<@G9=9Fe@!M:dQmeYP
lEGWWd 6#4Bwt1L6cc%+RqMPNP=AnM&mhAWtkN4McM%t#KGjII+%ki%F+QK91C?V&uhF&q%p=hc9R*1NPw@S:W&
aj*I<d +MnhZ4X!l$k5iAHPDXR/1eFQ@^9\E*mtIaCjcIM#<E#ktZDRBhX4*Yi&ypLB6M^Sd94halhB#P<MAKjw
n?4*a\ >Fc#u>:VAqd%B/Ctaw>qRIeyX>R**@IpVjH^+hVRP6Nb8C>\b8uETieYIMGR%J>EVqHlKYD/Q!Q*V#V+
>/e?k4 =BH#AdFCX$@utyCLY?+>!KmZ:9=/jJZ1kkd:VEm:PQRK$tpZ6iXYWjmNIyiV6EIN45HZGj%mk$^N@GMh
JKNkVA YtKhwaduZ/DH*Xeyy6V!REkX9!BP!Gw/9RH^>!t+F&KuZ*a4q8ct^wPAEt8Dl6kk+1@^&ah^T+i!@NtR
t&</Z# Tt8bEL&?XiLIHNGtNN8&X4*Ja^DDZ!$=c@6b&#@^*$:#uPG*$^\R%=H<&&uXQ+H@#9l9y%%DF*Q5w\5^
=b5Yk& W@?&Ty4BYIGl9a5Q85dW>%mtiBlkDmlCAI$C!Ac1HFPDGZG\PSu<WFkJ^p8%AXtjdFFhC<\\<E9XSpIe
L9&J/q SInPVCnuZbc8M&iGynXTpMPlci?\%BlV$l4j\ekPRL*NM4BknQ+P%aG!:1hme#tpcYwCZCMEcI#NlIAC
*R&EhR 4eDWZM&RSl%t#kII#iF5RuP1LKNktHGN5:Pkb!a$X!QLcGwcaT=HE<TbDtHntyPqcSpRqIE@*kQSM5a%
%4=+jR q?4RGl6H+&EF+=SWK+C\Ap$plVA*qKk%NpYAMM/tM#ctyWBIl9cwJ$yBb#FHXDPb<>GtJuYeCPJ5lkl#
X!EWV\ yVWZ#FWuIDaGu5M!wumRAuMZNDZ6*1*1hukBlDhCPJV>1KbBiAGG#^VlBuQQdaIGlAeDm+6Ak$FaB9Bw
=DqHCi kTdCbw1\hGkymNlMjRF%HaY5$6I\1EDFuyJB$MBRTWi#CDy4FM@Jaa+$VKR$FtDanFE1%=WBVjRwhAIF
dBaMuE bw6A/HtkDdIc$=^RYTnY/Yl$NI%BWBdEcNcb$5\\\4RSKE9JcMVuGhC%n?KZD8WB^w>AaP/aDNAbL<D$
$BQK^n M#kEkQGFQNEak>dB\HMtBWIHW>>niIaXnp$ep?EP4VqD%=StSECH/MA!GQ/yTiFI416SalwLdM\a6d:A
=w?lGF RF+1alwJk>*6WyE^bm1wZ=XG/L+IT$Z?\hC#Fa*F4MkSaEmZA+NuKGpPCFal<mlLeVR:LBcWPa\\6!hD
\PP<5n =I4<+GwCE^n8J^PaEJM:+pF=FPSTwhVtp<TD8R\EARIK4IC#1X&InWDYtpepZ$+u?XCBJS16wF!YMRG5
epNmB9 !mB*\a/bGDAwiVCZFW^A6XtBulkRaR:*16eE:?YMA?mePiw6NkX@kl*ZHGYynqXid+upSBttyD>kil&T
wSZ*aX Fc$\>!mEFW9&FGH5HMQ4YC/+#ww&5^8m*TdC<tT$k+bZ?Ty$eD^pNaTWPK!RSlt!ppJ!bWkWbwkbmRE>
$wSC&# p\MMK?A5ZRMhRwp\G\1dcR18^XB@WtmBaBK&GC6SkKHuVk/FBua&I<6^aDeLp\Pa=RWTe^=HISRabSwR
*5n<X4 LXCNMyFASSlDVHEBHew!CVMVMM#CuM%ScKEH*iuaHXd\8ZcCWecy4TXmywkQt6K>pu4e?cCWNhYAjp=^
#4^@4A eENNDt?p<LW+&cJ\S#\?$DdH5HLH?J>Kic+ABPnSblA!Sje/T8\Wb#988AhTRQmetCRMk<>%iJ>4^lEC
!\hTD# EDNn5m&wBMi1P?/SmG1abc<$SQmuHE@8iAHD^$FShZeDBtLBRASbyYniP?+BmSqum4Icy9b*^BFQiy<V
ChJMA# mNS1RK!WmLNV6JbXh>!lNRImc@Y+X\aDec+=*u%Qa@!Fw?NiAJ86eIj*nw$aZ6$>:p&=S/N\cP5W^:=X
IBIbX! V&/+R\Q%%V%tI/C4W^&c%@6Xd@X6BqPec\F%l+%Ke&n:dq<?5^it1I!qS4$yK\Z1jEJyK^6b89e&E&yt
wpI^Ni nNp++INMWAyQdtL#nXZFnC&MiN%&lqtAcXuH<46Z*e@an:1nmHJI^Rk/I&$h?/q*Ji>n9bDwupdCbAMG
Pp$n9u NM+t>pP9h%YQe#Xk:1A$F/Synam=nVYAYD=\=\Qn*nTR>#5cGbcXw+GMc<%Q5+Zi%h=X*cNa%pwXWiit
J5IFMn \V>R1nQbVGB/j#hpmG\Gde$chiC=hZP<QccZXa>/PhpBM&QM1c^$:+Bi1RclZAW+GD/tk:y@em\iXG!A
TXA@KT tkD6e58+q+*1Z6ih*X:9eklDJR<yX?qi>/ydbblpyD5^*9JSpAtD#SlnD5ZddZnbLVG91%kE#kRXN5eL
K!^uMn >jhim%GLH/DR9AnV9ewTKNmqe1<Z88$5pLl$wMZbDYFMlwG+#aV+:twK/<cCb$CaA<K!1k&pta9cwJ^=
n$=c:D q!@E5BJHqMKtu&VPH^d@pIKW6ZcRW6#hdRWB9ZuDWPhZMiR&b\?F=A+DC/$GWye:H:ADe6bmAI9H!K1t
FcMkZ\ kC>RRA+EjAH49b^qid$/\hZWME^BPH5a?BYcbB%#iE6$qu8T!6R^kM%ey:NyJ:FIpLHmMZ4P1a+@#*pk
GI!Kq< @9!F:9n#nwR+QSkPA&:/CIlphMIdychy>qNP6@YW9^1j58DyRqB<dLWyIGaaZti%%:5!!4IBN\w+BE5E
EPmS&W EuT&5>8Gik\Lq#QKFAhEhc$T&G!ES\E>cwFMMd!8Lh*^&DBG8c+D?DaBK%mJXQk8F:C#G9B8=DCCtRI1
H6M:pN 8CTPV/iC=<V^V5V@VS!9aFE#+h?/BQ\=!NpE8+tMPE#+&!/M+/hl%SLk>P=1:@L<SBmKQme=@9J9w#BB
EVIKkb &$B?dl^tRJImCLtJEA6mYalduRV%YDG#5M4XCGWLuG5hCM#KbLApDld*JIHZ^LE=!Xk*k6$&/EV\TcA^
cL**/j AX^wk>DcLlZpdZpE^n:TDCt4hpDYQV$k/C6BZ&VANDH%He:GDDaNHk??\^WD6Gw/#A#i+t!V!ccuM!e*
ZnP/S^ i1K>9j+HB4u#ZSnm#p6l1Z#V:pjunt9Ke$@4G*pbB:uqE+C/PB?G:Kbbe=8$yqt#H6WidQHC5NLT59jy
Z/1!V< P#d8*j95SCNnHmidH=q9eB^K$l1@^@uwQT%QQ&9!%Pn6*4WS5M<9e4L<EankMy1dH1$#8NP:WZ9Y+CuG
P+cSt% e*iQA9wCRE@M%:u#nWidIbb#>PtN#?4e:d*d9AeGAE!dD<mI%8VZ8iPP9al:uSKiJ^M/#Kc/GHh$c+mK
JmAMYQ *G*eI%AnmDL8?S/kItYIM8+iSc%M1YJe$ibQePXykVB9E+kSSG\/CEtM5thn*EWyLp4BFJ^*t%^=\^@n
liBq/X :8/uu?W<ckIc!:w+k?XHAQ%:CH#d=HuG6:u^hBpAbRe=9#5ma+#pe@+8^LwDa4!l?i<wj\=m4IV9Y<at
B9Y^a6 ERPLiD9E?i5R+^:61ii$&\F:P\T<lbYAj5kjAYAF^Hwh:I>:6Bd6/d%YH6lWut^Sn*il&GMRR#N+=qFA
$Ht!D& *8QHLGTnnIYA19eEX8qGEqeb*^GwCND8?l4upSbA9YFVV/&eL%CnV<hVYb$VpmnMeF!$J6J<AiERdPZe
:j@XyS dKF$AI&8RuK6LuhHYyEWKk?SXPCFM8Y$h%5A8heL%cip*qXIbV:YNGS\^/nYa9KWne&Ajl&=chS:N^Jy
FYmSR$ hhadlkdhFYp%8SQdEXReEZw?wCQaFVA@<$>\b=uAWeEZaNIRJYXIw&Eu9Eek4aTIHH%8LTHjRtI9VBGh
I9W/@a <+cyKW>@D:FiK?ptkdYT6kD:9Q:WYtRtYY1?^L=Bb?L:DYm^ndJY4%K*bmLBpF4Vu6Pi?^:kS@jiDlta
c5YueW Z9h1w9lm4LdI\Que$?X?cJYX*mijFWY<lWRD:<!Q6D!%EmXZK*>8*%1?54#M?/S*B^k/1$JEkB8MKP%S
RwCIDH tLW/u>QKNZPna?Z6V<Y<:8yuS!H>y%JBQc#dQY6YRWVLLH?/jP@iJ=@e=B<ZHDCNn+==y/@&h4?/8khN
b&X@Yc mFY41q@q*ik$II*n9B%w#ASF=H<HYuVnJkHMB&B$JWVK=nB4Z95iEL*!H6RqMLq\cE?Z^#@Q:SWjw<Z=
\!ZKpA HKmnjJQN$AB?i1@<qLj5ya?=X*t/&TR9T<a:Gt5!Mi1u$l=6%4Rt4Xq:6AAity8$A1$JAP%S$IkZG8\e
*^hKE< n\Pt=<#BQCw<PNKa!6IAaB/a?j?d@GQwh<6/Mi6F!=PXy=#B6bdkYj5PVqRuP<F5b^majDNYiCL$eG*/
5KFw*B H9E\6&SbBLY&a>>%unEaiTu\<q9PBc!LKhj5@yZAFlVPBc!VA86&N%MkZ<w!:CVj%@yE#N&Qy>tB&wyt
Zq/Z!% WW4G>D$CY:b5ta%N<<4K8GjL!4k@A^P5XDC/>^VDuAjche+w*V!n\A%M8VSZ*L?%jJSqPJq:%n@AHM=B
SDJK/d Kd?#DFJtydCTFK&a1YC5ZwyR^8<ena=ekB=H1Q!#4<>RmkFc^4JVFJh4/ZL&iA^M45?\:FVq=SZi<>Sq
1I%DBc ^VGMt=*mt469%1@ahMC/L&a=1ey%cW>eWy!?DD%6V\PeQpN:@MFmhnHAcR?#*LT$Z?^?+4:q:D9w=*G9
L&kEN/ kIC#L:@8$+1H8XbA\N\/qyjPHqt^4ESqTly\kYQ/QT\9b&ZJC8%^aMit5^8JejN!bq&ZP@6dT<HeXYa\
a:T8Ym y9$VlD!?=/ZHT@a\Ny9BbPMc!CjHY#nu8t9AyM>qq/4KnFpRp49:<iXZ*kK5yM^i#kK*RenV\bhY:p/D
i^$c$V eX6^QiFwTYG=:mZVL=::yXcD8dZ4HhN9kTk#Y4:!+Hecm=uCdyu?8:IdIMyLn<\y9?b<mQLwd$6!Me4T
-AnpVl 00084828c8a001202b3 Page 355 of binaries1.zip
pyRZCm $4!=LW5ctXL<aMHMqTW5#**JE!@NuA+Mu?K=@d1qhXl&p*h&$\%a@^uZ=X$!C?6*Ti:nLdN?AYT=q:<T
WQS/!4 @E+#!$9b@jRNM@dMSc@eihNuQQ\wlJT=Gq>c5kLMA4i4baXYBmFyLijqLZlpBwVp#R4ipkalJc:4q/4q
hw9T#4 !!BEKbmV8bHqy5\wcQud:<+BMZHNi9K8/SD\C<Xh#Hd9kaDe=W>eDAF#@:dp!eaX!!DA@Tk:n?Yp:M=d
QM!S<R EYVZR/<=>:W@DHDHE&q#Hm\yBnlZZRG\=+d8FW6tNcMuhWEL\Bju#cyV4pi<5tR/e5!9H6?\c:aHPPaJ
:88ANL +AuHmt@NWLXG+ApH5wk!i>pK^cWC/LwiPid^=*c4?#*IV>MSdH:<T&\GSuc>BByul89/Wnah5hBupNXL
9S:\G% n#?lytQcnGcY=W/j9VTD8TcaI&<tt?c<@QEXnVBnt4PWbV5#H4&nIedeINWZ#&E=#6t*PKB&KW/h5cej
6Iw+$l B@mYk9ICkFPmKq5/G?CqhdM%kM<=5I/6?BdAqY$FcRDuH&6*b4RBuQHyd&$A?I9>4:FND\K<jQjTl\G8
VPL**K Q4nbWX5A<A%B:VLEh=>RKQ*e+L+>AMh&S6I#ZkH+T>N#9\J\^Z64M4/dD9C*u4@SA*DpaIVhkPYZLJu:
=VKT+i BMd9QuBiC>b9lje#MP%MMZd&ym&:H8D$8Z6kuyMT:S:>#PMc\E&QZI@%M@^4$1=#Ah!<dnd$S5wD*bE=
4=a^@j q#WBZQmb^*eD9NQ<!b\</DDu:t?XaHp:X1&b*wu=4dkGi!@qC<dI*D^Mj$P^l9kLX*%%#k&@AQmTFPhe
E+/bw\ kHNmd<>il9X>ZH$N/ZG9*qa+B?M99Y+P^uhEP*JZQA4Nja94mV*R*G5/d4liAjD9Hq\KC5H>GXb\!dpR
\YiX!k &=Ni$I/=Rie<@AnLh1^<<F5^^4tLZZtbm?W/e*j@He\qW&HY*iG1A\b%q1RW\!R\Nh>4>1$5!+CAq?1R
ZJ?*VD j%QuD*V@?PJeN\SW#d+NXEd1@Re4TnK$e!HkZ^=KcaTA/H9Xbq</Jlt5PaJ=@HVL\a4CbpnmPPiqPRbL
D^bauA W/K>w#><=d4yLM>bYQupPyPqPi?<6:j*?$@MlTl%P+>AFKeS8&@m6SWbEGZjFX>5lCmyS\<?8:a5I^%C
<&hkGL e1i>XA\lYed9**9%J=6tk?D?H*jX<<5bt:dK@<B>^^?GXDpqij+K$L*=5V6j:S&>:BII8T=>+T>mnF*X
X*@59< &*@j8#<DDbPZM#j#JydV^?bZ:\lX9D6:DwT5eQ\9>a5@b9:iN+&j44$BKyk#M?Q/D9@Q&P41P@@=%ckH
Y<Z@pN T5@b+%m1:8n1mB:5:=*+WVQte+N!td1bD=uh>$bC9c?+ITVwi4nQ@<QB4%j$*tqWL*PkwuQ<W//Zj@*a
JF9ii# ^LGiXRj/MBWM#65icD%w@1!@Q>aVVwERWJQu#nPPHZ*9\I:X>+Ji!nXbb9aXjM9Zi>?E&WiNCEk%d8R>
kNP>QX Y*bW*Quic!JAPYjm?S$Hj@lD\>mM*pI&Lc5m?tcpF!#lj^F\/k>ZX<Np=<SwSMDK\XeQ46qmdI9<BM\J
1NuY>Y uYW5nHW@?:PDQ+/>IMD5w@!d::$WN5aE1H^h!#j<!<$&GNSnLH*%#!/h9/PQ/\LKQuyF:Pt?&GaBKY@9
cq5l16 DQuZ>j\aVJaJqqc#h4T:$VklkHQ:D@B@8%hmFEQZh9HZJQDQIj=#uJ$k+PV*cl$@G^PA+>mQa5W:Nkpk
DyAnpS hTD!$+/46\pkP*dk%iKeSkFMG?n@8y4XJ+ALw\h@11bA$&bMMNhFQ?u?EZBw?kS#L1:a&cNV+BYn^*dk
pj?D+k 4A<i:#6a<WQ=&N9@#/cMc9^w<FYIGtM8^V^&*$@qa@TBk#LWiiCj8:<8HqMHi9*>Xtn%8#<Tn>t>Q/4+
IJ=a/# mZnMiVe&?1b<>QiaI@K^hejZ%wnH4Q=nB>?Xwjj!>?+Zn^ei9MM+KnQ4j8>XGby9qQc$meiLZn$=eEI<
pTWPul #u^k!a@?SWcI99ZG&#KH%cXeJ55b@NK^hlqc@Xd@c#KH*u$HN+uHe/y@5&>M=9DVL=5!\qYD9>!!Vac?
QZhA9K <b5jNa9H<\c9NeLm<R9X@@PFI?J^jt>ZXBb^>V&@8WNG8NS@I=ilm%8@?d\X\Zn5*k+bahYNQZ$!5>k*
@atQM# B>iJ^*pHe1yqlMW>n@ZK$IW:@1Fc^n*unWh/m/*1%L:ZaXW>>REI#XQABPP8\hGwMYl!S^kNE4a+\l*A
tX8SpP 5cpK<+>!#qKbM5KXSndNyjDRkS%nZNpD$8ee</VuMw@nBt%8m>h@BEQ?/Nn>!QV>B+MQQjX*#=>DITe=
B9TIJM D:jp<QG9?9pwj^hCWu@D?emi^:n=ZblZ*jkKl9!Te@%SkLdA>#&I+$=>C&aj!&Cc5R>CatEMiSqCqpDI
DK#&qH CM\>@>YAYn9@\?RMJq<y:&EeKE6J@R&EjByCSnGjE^mCeWIRE5M+I^n!MwS$RekjIJ@aBJd?H@\*@DGw
8MuHju *J*?eZ?Mc9kYD@BB@m9>H@*eV*Ge4@L9<X+?/=w/@@nm&D5m%T>=mP?><8?+!a%*Seln9NeMehM@=w?N
Xbn4E% aXq9th^>pN@MPe!aqBFbu+^uVV<j\@1M5l#F?T1$PeVS8RNLpnH+jG+5=4#@dR!BZ5qac<J5!+<8Ahqi
yGqhm< =qww*aCR<Z<VbjQ^^Z\6u\C1Z5ZcPKM\u*8MN%IeED=K>i/iEH<HR+!iEdABW/Q<+V6Y\ZVQH%9=*qFw
Td4qe> bPe9?i<j!cEGNH=/eA!dQeydQue4lA##!MD4:&DIi@^ZV>^IVS1LkFcDpN@\:/h<F$KiA6L9@AMY@lb@
qwNC<^ ej>ZwbL9La/%>qQn9Mh@j+MDTF4NDjQA8GnpF\9/u?W^tH&9my*AXQ?&NjnkJX@t:@#IH+9hTWSM1C68
*CY9w8 *>i89ZBe/%pXHeGRpa8XyhM#bq&Vj5l::&N9RInCj<4>9V#GB/K>Q?w>A1#KkFX:aM:FS4uDdAb>!ScQ
Cd%qZ5 e8Zjpc*QAdciAC5%l/Zjj9&N%%>jj8uZ=5!=hZwnl4nt#H/qyPVJ\C&*it>j:eER^??QFn!yBjh?68V^
jXnZeX l^6Xq5hbX64Fn1Y8y1YPye9AkMB=bpw^VPcKe^Y\=wdpH$#tqG6bi8/TDjiYdq%j65F#<:d6=SXd1:K8
tt+4AC Kc$1Z&>B4y6K6=SN?%L=%49LK4hXqt@h98Ht4YYimp4QqwyK8G@$dN>W=9qctc@K+/8w>qTXdT=d9^*!
@wm9yT &q:l1T1@i/8uFCKXd1+5K>*kw\BA*iZD1QM<uyJNbXW!:a:!#b5>h=X=IAbp8&Hik8Yd!$wBYdb%i%pq
%&mne: FdG66Ky1&/bKDN^aIaI\Q/kZ=uBX^9JNFh54:1+5*day%d9%c%54ht!>8$VGKh%iZXp&6?wT#@1K/5$d
it!+ka QF546tNS//FTYNP:!6cZXpP8tGNb#dd!!qKp&:MBpEpqWT/iVcXXNn%aJck4VGTLL&Kqc4G/1%n6&FZ<
pZqh6k aIhZ@X4jSZ9a&&\:?!K:mGW!?IhdmumH?MB#*$XlN5d86@B\1T!Hl@ElS<@M\aieD6cBh=%qbk:TdLtn
^9/$Na 5^jl#M^DiA>*hB:C<J#MR&>TjLNu5KMSH*m+<!W^H=@+q$c/=:ScARhpkBaYAV^lp+yCATb6yJEZmDI4
ME8KqG bKahm^jC9!m#akAY\eKanGATmF8tdV^<C5hZ&ukEw?M^P\MG$Hk5un?QIXnA/1\R1A=uJRXyhaqdd*nh
Bh/dS@ t9eQYDMywI+udh@l!cB%1jEIwwq!YL:\Xml=HAaJFn/R>>&<9H\Yd4?\>eCBk>A9=*>*cCnMl9Li+Dqb
>pK<Ta EQ>aCK\tpj:I<TNHMG&Yew^8^@PP>hBD#\HK<<mBh5JV@Qkh:MXFdCu:^6n*Zh@VH&#?^9LN8a6?\ya1
Yb1JM= 4$LkV&CTua9+?^pj+#y<^unN@icXZPHV+K6\cPSFNl$=ppm>T+D=m+t!wX/pnjhimPmeR\LWAi\XwAGe
dMXMcp l/B^QIedkDW/8\b#<nu9:P#1G6I:+i41NWA>h^:9G8SRTE>QL^h6c4W1FX#MLtC#&Xih*<qcMH*h:CQZ
ZaA+^n :@=j**n8G&9hni+jy@+tqiF+jRH:QL9jPbaV#8>dHQcQkT:G+RP8**DCE^&YaQBDqL5P+!J\jE+uP\\5
4?mZbb D@ePpACRBH/<5&eRal1e?wuyl>+ewD94:ERC>e#DZd%tu:\QuH49/P\eBH^PY?eAH/AC/Rb$yKwZlQ@t
dY<bDC 6TYh^Se5YDS@4PDHuuQu:J!#hw=@#q4QF<@XW<Pycu=+<blj>?8L^?VHZM#ya?aD@8Q!Fe<l9mK>APq#
5:IS@+ yQBP988>CZhwE<+uBu1wdiA?BX<h&cJi1T4\eSR:m5G+YV!J4++<IQHPDtiH\H<<Pk+iQIl$@C6e+SmQ
ew<6pi 6eIX+9LCbd$\eW@PL:wEIj!#<$XS\=J>8Tl#Ml*/qyYaR$c:c:p#q?%S^mdSwaNlA%hPPDZ5lAwmZyqC
A*q$A= >Ht!T8APS#yQBJZ$>HT:5kC9YbPiZyhPF!japX+Ecke9kmH>t4y$nl?MD>GK/nn!hbHI5GmNWEqKpbJR
CYd*&n jyFTqAdj8Fa8W6^Fc?#/FlYq8RE8Kw4nm+4Y^QGRH5yQTB@QQ^+qRh?jn9m##p1E8b8@q1Cp8d9In5==
8MLC!p WSKaNmXa^JQBNBy=LJAZaRC*5\J<Yly$HbcLX^yi$JEAy6pZH<j+tBbmF%F<$VEWXFTWRFGe^!bV4MRn
^nmYj@ JGEK^?NB9LCRa?dnPyeka+ZAYiMmAGAMKASRS8DnlRVKDQmELN/R<FlpapLZhePGGa6E^5at+9BaJDbt
w^JC8J AB!LVabnH\TPWH+^tb=^A!Ed6B4Ek9=/5pDTEJiFlDIy*<qD>Q9AQDLPy+dH^mh\##@%kS/dGBi\cB1E
GM9Rqm @=y6WERj1\&K=AYNpYa^98D&!bhwNp!c&G\a5!mJqVEpma^pPFE\%FQdII\KH4/k?p@C<<tmeE+SQMM@
p@DQ$e iGRaWERtSW=SWVn^L5P6iHa/ta?X:/qZMj=L!:%k$Sj9#\i:ILW96R?5k:E9*u@Bw4SeK>L:+FWYElVq
QWeG@I bM6&PyFNa=PBD#&>aj$RQZC>E^?MZnBy+KEZ:=&HhP68lPpP\=KBh#CPek^^^+hDB6kK<AB*MlaMVuea
KH5CR! yDCeFZ?i4YX9nj*9Z*?#/1G>/l@XPYwBjC=jh@t=<%LtK\jb#5<#Q+=Ry6&lcPtCBbF9y1IX6^Qy!JG>
iD<e:j E#=$BK^>Fk+jPy+=eCm#K>^#yKQ@WGb98Ph+J>$QHaiK\d&#B!/\hn4ym5PHEM\<@h$Rh^&n>^#1qiXm
Lt6qRt S^Z:>V*V>@!8@X96*>1V>>mR1n\&6ChhjN4l+#j>ikINy%^?e&4btpLcpmepjCbQ8MH>>he=*a+qBMSB
p+a:At EbAAR5D44!iCFPF%ukkii#$y?VHPn%p^bM/!&FQ4e$y>*?jCNkB>u^ndaHymCA\^ESEm>aujC9H:@ckw
NQ6nuH C\wTRmBPRWE<BAMKC8!RmVmMIaWVXu\BS\$@=YjBE\V:T!\aRc!RCLFkK<RQNdPGDk\SeH^p<hQREp9T
nKlS9X MAR1<aFaE5qHC$H=+tkXtSkh=RIGMBaD8BDG?>EJ\5jGEb+RMETP\+WEW*wBF$:I1%DC<Y6K@ESWZ1Mj
@<CZ&m CidJMPR?D6jE?MSEhGKC5%NW66LGym*/RN+N!=XT6RthKB9LN=hh6XatFDnL>iIy*dyl/4^&qG@j=Nt^
KBljV/ 1Z#>JuVIqFaDi89&<9Zw&kAaI%iYdcpA1MyZ6d%5!%Wb%%b5*W1q9ym>JCH&lljVdm*d81F</>$9yu?y
K</V:l jG6=%cc!DjPt!eka/qyc5dY51YS!l5JhpymS1BKY9LFm<?cKHhJ@M<@n8d&m&4Pq8t1:b**F%w*qqX5k
lIcB=F W1pkMTEDGS*cyGLHX5>hbbCDy:\KpqSYawQeXdaS9XK?m8yK$Y#p>TuFtNBtY:jQt*N1A>=K#j5qcF=!
-A5hYZ 0006665e48d001202b3 Page 356 of binaries1.zip
D4MJaK YkGb<>KZj*t=CIeP&:#6:t$*El?:6>&>jMX$^C&99t6#?Z4QnYY?T1kS&*d*mlXuWZlq?d*a8BK^:i+9
%jNkui 4<nA<C>ZXqS91+J+6>+a#^6T*b1D$A4w9+w6uq9L!nbAKbeZ6Z#8!m5ZiY+1&:/nw9J4umXXXSZ4!!HZ
R8lweb 15>/46?/jy=u!idNu54!8#h64+LG4m149Fj+wMcpH?tdIGYN!uKZ/?b6bX5^\KY!1%%H&N?=WycXd>kk
mPC!&Y \6nQIhdLEC9qY9V>dcc\R9a&Y/#eKa&AbSDnDwnl98+icCwSXkylXSm&FAk6a#JXJ95y?^P#wD<CFLHH
1b#!TF ab*6WpyEn1+bdIdL^:d9F4n9RX:@G@JKZ%1PjXhS/dQ$^WX5Pu9X>cqdSS>hY\%>8*Y:^+=&qan%Y<y6
ld%P$t N?W&p$JiX:+cH&yTZ/b*6p/>yDMlDth&JW$Aeqkuq:bJYMI\*wj#+Dww+8Q\4?Rh!M5:Q&#BkG=Z<5+Q
d&RWiW JeC=Fw#yKdtFu\^njkV@^M+QJ55TLiGeA\eP@CRel#HCRbaE:#<NQEBPR1mkkMPhl<PEV+b#LFnEl\kC
!C=6GW S6eCV<CHM<FRCMjVl\>*Hpba+uM!B@F#Kn#$Quk4j:&n5$NWWMJR*ABXWNdHHBkRHSW?cQpEYJK4c>Lq
wq!h14 TBl$LDhJy:^+Eu!w$^ASeK=H5QCuAIiEFb*kR&T/huGYq\@bhi4CIc6*Vh6@HuTaL9%PYNRd$GH/t\MD
cIDS5# BEQ!mj#<@M=DQV*aXIeHFVA^hVI1\<TS!5Fi#F@CiZpZlkaJ:1eCl!:<mhpBytyu^=5Ee!*EV?RA*C@\
iAeW*q @Q#<Vwl\1QQN+\V45j#P4lM=Xu/El\lYiaV9DJ<\E9Fh&h\8n@A<Zy:iya9&piZb:YYX%!M8P@>P?#wh
t=iqwJ *N@bijm+ZS+W%NtbhRLLM\u8:?<<@Pb^LA>6cl$K/n\ETcA</Q/p@An8mX<aQ*HINV<!D$la<kDL6&DB
mDpd$I A?V5\n+SQCChZkCLI1V#C>8IiEA+\VC?+AF$luX%JjV=5bDM*?wVHZQT+**TmY11K>+uuX&bWLiEQyG\
e+S44T %TeIh@aim4e=\F$<Ci+/yCjnp<8Dt8wJ=YF>@9@mAS8Yj6W+VFZGTbKElS:APTQBWk@$>B+#SB5JQYDD
ApIJS$ kkik!5eED+p&Abn44C5BNk+i%*66QRDy8aBFu^nAaMe:i?$?kjwa$MWJjhILuYnEiW4HLp/CwTKJMFd<
\an!DS iGeCD^#CDp*pkj@9>MAyQNDFlX\KHtA/VdY:LB/R$<FPR@IA+=pVdLCn5/6L<ADnYWctCbIb=5RDMJ+i
nFM$JD !V!i&at%QST&dI:P\=b@Qaj%hQS$hQdBVjlMMmek?RDLNKWQJjNE%9F5^nKQR/w8tj!E1AQCXQ$VuRBt
TCJ+Tq HnIA#lF\J<95jEuHeS9/8P$EhpGQGNh=b=h?GQ$jZMA/QB=G:\L<6YGGwLRPm#dy$45p#$AiFEE\eR?\
apQj5l uh==YKetyR4k9<Mu8t\iEPPJEieBDPCJQDCwh!Z#RJj^Z&k5+ENJa<FBqy<$F5kE>qkkB\>:LJCDl!&Z
$IdZhb MHlwtldZ#VB+QD@\dq9eHnkYi1H#eF6eL4p8aH55iMq<N#TS1P6^:VkBjtuk*TVa\9eu+?Nnn<DH^^=5
4Z/E<% #j</i5D%\Z\&y/\aVMcQnw&hcatBn&IE/Vy^!+6Q\k5ZNXjeb+9QGy/a9*SkE*4NtppSdL^I9aayGGGN
WJWWuT 9e/hkKiWmwmYkJjq^$8juN:C^>FuV=E@WDeFPkEjn=CAV5R#L9#pmikp9M^lVZL:J8IB9jd5M?Al>hyJ
G&&J\k /YM^i?eBbb?MJ@KVIy\Jn^HPpD>FTMJ#cH/+PJ</QYiaQX=<!9Kl>BmYd:NkeuyE&%?4ke/E=&h@9QTu
<ZaKPp %H>5DApaVY#BTZm/Ey1IV&1jGF=J/*KV&uj1Jd$Qh4uaJG@pXC8EpcR4GwqMYlGKSBP9<WmWn$?1aBR#
CL?TYP VeAZn9Np@WG4Tku+iASAR>4EXTdAS<jmMnYGAWt4V6FEKuC>XF#&KqS$ZLSyHI?qn*G=KkZpwQe!ZkBE
y%qP>J hcRZ+WI4qM#HJdp&Z1SjA*m4@5q+1qSSHa@b?LFIdD\cy^C\IQG^5XE8<SE&Hp9A<:w/ZCYWERAjG$>K
5Kt@T9 #>QZaPQJCIBHhAI?\kp9I$!8u=%iSnkXd/YQ<6HaGD>>ipB#QkX><jS<T9wmWb5=y1V9FQ/cSJ@wL95/
>I$TXP 6j/V4qQ\$ct8JD^SqH^L\lNF!dh^*EX8+atm=B9khh*Cm@CpG?E^^tu4b?Eu$Y>hh9/u8@T@4A/alE@T
PVPE#W AZH^u%IHJI1@lW@WAeumL@CJPmByEh4mwRRhpLkwdeq\kk/\F1qS@KiYeSVk=QyQqlETEI8CKYRE$Ryh
1R4T+6 cZ^KGWE<4tKuFjHV!EkTj4IP5QByEn?FDAk<=&jCW@buTu<t?6LEwu:$NQSF:R:?d^*\@/IPPBYj1APt
4!k:n9 ^ChETBD@/FR/IM%m:kS<wk=A=kM==iPJQJTkA/dAJ?pA\d^4EuXRIw<IQG=YIRtiEw@bF$pStm\nwu!i
EIcupd lE?WEWlL&19IIuK!nEkn^^LBKYYET\W^Hy%clm$JQm%iT9Dy<LLF^/i&e#AB6Yk$Gn&6D9l9P?D@e^$R
&9:aS5 L@qWHaC&JLMKL?TVhWD!ZnmIMEpHED=mGw!%<WLMB:JL%AGEu?C:&Bm$mTkC6#HG=\Lw&B^dPRyj&1%l
?pH!A? 6Y6$jNJ&GC\h$KhM!PC&eqiE9kK>emKT9I$t\k%YmKXV*wW&:%m*cC^K!WZ+&K=CYSbQLq&QJLRDhXN!
VnF%BK :?uIuBb/yVpipWyG>p8lDuQT\wnIPtJ\1\A^Z>%qSAEjt+Aapem8mRniLD^GMQqaXF@JVe!mpJ8mSG:%
$&eR@\ u=n\/tQn+*CLSMdlG^p#:ByG8eVVXTkTt#!Pq#$K!JWG+k9HI%kDu1\DbD$AwjQCPJjGY+BdBeV$BCbP
Z:<R%m +E<1RqTAV/$DMAdqjXwhAClk\nQyAGC9@=+LjNJ#AeCecT=AJb^?LnCylFQtAyNtG/j/A=JuG/iPR&K&
AbCuuj aiDFy@aHRHJnIldVDYNKj\DPNk#pMh&aey#Eimjmy=kLGKaiM@A*b$=n!=8SWcnZiM\<Dh:RwZcA=??V
%=\W@I uy@GDplKQ+WhpJS?Cn9AFBju@&$HjNI/RP\iTqXBG*R5:uA6KQc+\t18c$ut8c=jyGY/4tE#ZN>utc=K
IL$niu 8Q?e#ZWX1<6hHh=%4tJQl/6nX4G4iFbHc5e%^Yu4buXp>E$9V8*I/Dl*\jSmV>15n6uLylh@=XjVP=b?
WI8%Zl bbc<R@m=GS&i8TuFF&=#RD1q\>//BPYuR9tyaZ>jcymHW*@P^%J@!ZZ/uySjDP5AZAjE\dn&%>?S$:ea
?^6+iS 99u\uNPSH<:9YD!&GL:=HZ+h9+9qHeN#+J5Keb\J=T65MS>nHyaJ*^9a%S*y:E8ibYy>@t?L>?&b**i\
MB<j:< >/&?H@?\&QQXP%SQ#SHtKR=j+@u$d^ZQ+n@e/Fq+Ya4u$p<Xi^bt1y=LkdTF=#k<q&a8<Z!GVjN+IJeC
TZbj9w VaW:E>>hDw?uiNiCYj@uH#=@<WMym!EM9=>j#Hpa!%<MZdKat@Dq#M?=Cu*WAh<?/?6Q?C:?/F<wm?9\
NKaTAC =jKL#?F+G*\F9lq5Ed8iLYXy/njGqlX@*=ZV>#*>!*$QNnQQN=aZi#aDLa9Mc#\ZK+4u+9Rd+b5C#<Yi
PGJ1AX m%Pb=&Lw+w8#Hb/LHW5<H9&Vd\Q?<iu@\G*kkVd\RB9+&dJmXe*yi%n>Mu!bS^$4>n#$MQQW#d:G<+*b
#acuFL mtiZ/$dQ#k6TQLPZFZ6tL&Ki&YuFup?HkW+GdjA^?RC?1u?KN9kE&8S>&mBV6pE/?^5#Vb&4yBW9aI@%
YbT>4R FT%a%ZjFk5<CHd@$iBVY6@TcZM>ZPlh+q8*^=Kwil6<>^S=q><ZQbcb>:1uM6Lt=dQd5ZLdl$&E%#bNZ
^i=AZK 8<CVq4LPp<IcQd5iknd+++Jbn=#*?a5h49h6A@l&VEXHkp!E8j#C<>nm?FiZ*#FJ<$iYlahAFu+G54Aj
ua9WSC bPG:J9P$:T4&qHQwV=RFW@Fe@i5dQjN?DdLARRaWpIYViAhbPLpE:6Mk@L?TLPBLKdu*j@dBT#=*/ce9
6MBFB4 ee:>=6#:F=W59j#Sp5e94!*=!8YL#pY>tZ9@=<$4?Sj+qZ!S8in?SjeDiL<J*@5@L@C5&N>Z$^=6=94k
u^bHYw \!ii&QqQP@/y/8EhV&#:J@@D%<?+<=>99<J9?99<ajuKw8=Q@yl?iyEC<%m*+Gh#*@#<#%!DM&/>@Ndb
FDe4:T 1%!*#4ny<tIZ=uHL**!\QHmj8q^hy6d<LP*u9@$@e*@i@K>#j:*yF:@>&dLHh19bck+*wVW^n/p?yq^B
RqSFn^ q*u51XHVhw$>u9d\4*a:9yP^i>cnGh?b>WnKR@tu=KHV!!*YJ!GQ?tXNNj?/?%jLY8b?b>MV9@*&:5iZ
=BJuQW QdQ:\YWQjjMD%mQ?\qKP*At1e^btTyny+S^&RPpFPEhyX\+mnN51+a:dKSHQe4RRa!de#<?H=JBBLJ?F
P=iPiJ M$?EER+j#k\V*HGa+J#PReKLVVqJP+nFT#1$@$49QE=94iX#*RnDjiLARZ^^a\ka1ciZeaN*Hn@e!*JC
F:eY== yu=<AP/<c@B+Q>+:Vh\=AnAuQP@5JH^QV<>^DP<<ebnCD=<aPDHR&=h#?Qmduj&>A@Iqud/pP8mhXAe5
I*j8ch <nnWIjdGAj$+%GEwBDDYRiimnK=PVtZkHi9RBYXnYX$>A6@J>R>dB&6LnW/9l<9:wdC+A$LHVVI>$C:+
elE8%J 69kl9Qj&al$Sy9d1kRcmi/@SJeINnAjyDJEQdywS?ZWiM96$8eFDd8\+6R/+QTpL6$FBtnhqHZCVC>RB
*GQPP4 \k@nbl\Il*S>EH/aDdB5CMh5M99$N$>$5M+Vjj1lE=&bJ#4:>K\VJ#wSjlN9AB</jLm#<#DW+hAA=wVF
:bQ%ZJ Dk!cW:hDF^j6EMbHwE5bAu/Ai^:\FaaQljM9NBA=qHei*jM9QHmI:lNEd>iFR:%$=$PTjkF*+wdN1hyB
NubNe+ Pj*:XjFZB&quC5:I^F8NjI^AbR%P+dnEe=m8$R19ldhYhCX54iBc/itaBdGFk<66BdlCK9ccnIwAk9pw
wl8@5I G+8JHCW<Fl5XPX1\&Dqky:i&Ykl<wtiJu?/F1<t#iG8JJe46\\yw5m6u/SRVJ/@Y!$pTVdMKASjS6Dk/
?HDB6I FlMJ/nk8da>Ha#E4k!kEAD^8\%G^?B*Hw+>+LB/j/tPqq>MXP#=E^Ll&jIkIj#GKV>MhuD#FwqRi#HBP
6bhnHA thJM&Rbm!tT%kWYl%Rb4eQyP5GmD>D1J6>5k!yNwmPL:yD^Pk\&Q&:DqXye\P95V$phF@u??Nyn5#dFu
$wZHtJ \hI=a<<1yVMtD55Z<TL&+y#5N89%<tke^nh^$*k!QkFG#pqL^NN!S&J<+1*^lQKK$t^ai9/m$iV/mbq9
%@nR4% $1\Zb:4JVZDcNwmKN4C<m$^+C$A\SSun5WlTG%niD6pGIu+dZ9H+dbS*t^WjH64c/ARdm6<tJZM$wqQ<
aC1j%A 61l\5:aSHB%9G^54HAWwRnDEB\&BV5k&K#+=JT$<=K@LCLINw8P/DnD=A8Lp/&h1k<q<IBi4LV:km5QB
%JF6c? +&$A&yDp^iaD>IJSFC6?PpWy+qa@CY>eZS^G:Jy+9&J&hRu>mtuVm^L\yIPT?n$JL#4wA@PBR=+kIT:b
Yy>JDV He:Lb6H%/YJ=PMTuJj=!mddmF^Zd/Gq&BIGibphA>IIjFC:+kalA/M6?MP&!H+kIqN4GF%&H/Gq^QMGF
uc9FQc H^9jZ8n=RhHX9:V\PMd>wPljjmBlD%+H4m/$aER:yu%@YqEmHtIWJiI^l!S<+R?T<hQ5<696=AK?#E=i
btmK8w hJ$V@q%6J:><Pd5Yd6<H6InPtA5nHDl\RKIbSbDZhiTu6pFCJ$T+Vn1!L%<148Y!k/@#mm98=^dZc=P8
-A/M^L 00098d58613001202b3 Page 357 of binaries1.zip
+Tued1 TRQwc/?hqZT>Xn+bQVtD<nPnE!QE$W4SFBETW1eXub1DnadEkE@Mwn\yhX1S@E8MpJ#=KjnY=M^Qn$@:
JpL#ju #+BQW@AQ\cK$W@Bym6\ckGnbTkq+?!w1R9Vy<Yq$\5y4y<iLQM/Mj?&M?KJV<WXVJV<N9tkK@G6VJRi<
qmEnk1 #jlFW!aHBm1jFGETPmGC9Ccl+^Et<Z?4LRDqb$bQFTEJnSHKp/@YTRJe*yy<VdKNGS*5=PehKVB@!>J=
c6Y$ep ?H!hn%*^l&j%mn<<c@d?+Xq?eQaWZ<>F@wQ5A9mt\bh^<XZp%!t?cm4*1/ut+w+eQd<9j\^QdW1FMy!e
KBCAG5 h!me1$\i:aLQGIa+nJM9jXS?j1aDJV:alZqkZynuqPZdl$l>i?#:4phKK6=iNJiPVW8/+whI?eeYLVwX
#!5!by d?Z^D&PQ8&4ddnc9XJS$?ClK1nJh!XaecQpp=EGH6MtQmS>c!!+Yb4t1NGe%=1nKI\@X\qhX6NbJJ^Kh
9t@>$5 cZG!tHWwH1jH%bhYuK6i#K=l@<S&5*dYEe?kR?q#+qEyHju1a4aVCl:DA\YuwMX8D$*lMCY?u\kaWH:D
@X<P&: Hy#WHlN$%F\T@yR<F4Fj5<iXte4=my6y:Cm&+KR&NbtyYMjYmaQ4$NeGiTnLt=lT<tC#i@p!qu9cjwH@
<>5h6T !?<@6YNPQWD9qDkjMk@#G<1Y>C6Q&:jI5R@\K$@6&?S?ijCS*@^+IH^@S:#Np94F@/D^t:Fp9G!QanaV
%y$8H1 &5NhW6AMdVH*I@Byl<IeHqh^GlQ<<VDp&emKQ\J@&G*/?!&@YZSc@wD@9*@kFQ\yia^6@9Ym$@IHi948
X5KluY N^hN\S?+Sudi8kZ65=aZ@@m8&=d>?Ncc1<IL\@q>1Yy<DR$QFMRnBeWHu^Q\qIhD#T*&NLLq4Lq+iX4#
B@V%b^ Le5LGte8#&l$5\?VB<c=Kq\W9l9\FcjG?aB=CF1YtP8X/>N9Vd>cYbmcQ#%X<qlCH8nBlR<iK=l9ymdw
6C5/jR D>GtQ*Q6%:>468$1=^:6+qjPb>qV<d1J8uG^8jmX@AS<w6\?X9L*d<<^Q:94a8@=E>pb<WmJQCaPN<\*
=w#NlC 5:MVM9t#/LGH$*/eGVa:5Qe#<c#eW@k$dT\bL@JwhK=L/e91PF?>k1$BVjndM?4C5cq+jZIicd@NdD>D
SeTG>\ Qect15eu#cjtEmW>@bd$RtXt/4Vy:k@BH+9X+8J4+FN<@=JjLH*<&5iLH%!e:bn68MDl\1MREi@9wA?8
YVSP!Z E6Bu5iuW<TQ\<d=>VKq#Q9a=>eaH4*?pcQi8S=\QJ9V9/Whn/^DN>L:e9k9Cb+e9Ctj&KS%kjhCM%Mue
S*ZLa5 cmw<Y@mLV5GuEu+K@qn$<K>@@QlR*5<@yTmkZ*+NVJ4eL+6$e<\e+n>Q$l<Z5d>S4%Y4P8:5?LybyKTt
VpRuqa y/buKitk%dP!#*FeyGe!C@>%^QNW?GVBJF\^5<^<E@FVH+IyVnMLb=+Rl&Ai#5VD\ZD>wL?uB@*uk=#n
SiKWtd //Ra*\kuyj&I%$i4A!J+GCN&WSJQtI+ZeVmGi\Z5pVAhy=HD=u9CA1bCe5Rd1:d*Xb*1qetEN&8:\5<*
^@%A+9 huS$iH9D#&jCBjeP8u4DtSq9>GhtA9^T9+VjdCNa+PW4uL%Vd5Pcwl&5M$A/=X9d5<SbKb$H/B/?RL!+
GmY?N@ 1$\ZaN:<SND+8Vlq%DktE5e?*MqiH=5jFlnlBentSj\p?YTKFlR6IM?L=cISwA%L9LMI@?BcRH<jp!hq
9w*K<A G6:bJX=4F!&b$=FD=$:pmJi>/jZ^L9tKhDk^9p\j4$Pu$Kib<qTmDu\jHeI/P9E^p*X$+Dp!CGSmj<P>
cDW\1? 5#MVwpJwW9yQSm+?^AHPPjIA=+<uu^?yDwnAP1De+GG@JJ5k1^>HNn?1ZCBQkX\Rn/FeIM?lZCAQ<w@C
qyZmEu p=Q=kdwj?TFV<kP>95$wGPNc*+@HC*a:>Mnn6VQFeh9HP<Y^*E#en:BDA5!eCn\8RC5SP!+#/@pL<iVm
WJNt1E HLaA?EG$LR>@k94lR^^ADZmWC=J*ZEj>8Qyl<uqePYP:u<YH<e:hi=?qW?=*%<E>=*@<hujhZml:>&::
wTS#\= 9lj9i\GEP^9j8=jmY@ie<d*Ql1e/=&8K94C94B:BD5e:D^&lD8@5:CE?wH5YMm9E!ELYuHR@lCu^>A!M
jc*1<m V$MYbhenM^T*D%RH1^%PFm&te%XuFX&Fctn+F$XFeM?=:NNFSXwan%e>=Z+Xu8W@ATDGu>A$88hMcKEQ
y?JENF *R:9*^jICNAHn=GPkn8iPRS>RZjwk&j^#CF^:<LjmH<&5+5PB?Pbui>nQ=!YJ?p5Di5MDi95nLB%bpdP
b>:uWn ^%jmH&Le=AcNt%%AEI/du=!^>*=&XA:aWZBDP+1J8\mHP>lS+6+9+Ved/T:^j*E:cy&$w#cTHdX^+<b%
6bMFnV tCjeN#J^Z!iK&CmLZZjcP9TLPyl9mD4$m=?5MN<IJaJek4&m1a^DW6$INtQGS:VqQu+h%5p/dKR/jJS&
jjtQpR TL/!B@4w%6>DD\M>QY@meeQ>+y:hk@i?yQ5A*95B^ARDiLH+QZ6kRGawdy?RupTY#SJnRBjiWT>ah>CV
LNqSdj hCab/Mqi$k>beCj>pNZ:@9yB!AIPML$mwuE\?h/Di/*k*55:M5M=l*1Q+calkGu#WM/^A\eMQG&GV4nm
8hM!=M +yRbeb^QGK5mV1*yqReKln?edA1Helj8$PtkP?ih9AQ8RPZ8MA/Aik:hedeXlpQSFK>L^5@WKd$<XtpK
H$9*HD YXX^PBin@AL^+JVDQk#^SZkmy9PZC<T>1JH8:CyY%CnMAuqkyqPAVIK5eSJb$ymAnKR%MTu?^>MQiQk&
d1?#N1 /Ai$B%A@wQ$A?wH5B@=l:Ij$9Z5I*mMi$lpV>:&Ml14$%@iI?>:\Z81mb>t#auhk?4NkS$N>$nua%ZB@
C$4dwX F8^tB>^lL8!bV@c$I\h@XY\9\JA8@jXuHdPAP5lIhMY#LQEhAZcta$j59W+YTH8h+kjF$%/u&Kk+@5Zc
P>N8ZF /^Rd6%?%wd%P+uXTuyS@<66EH?1+p$@$?w8&kd*:kk+mp8eEYNqc:@&jCW/dDCi<FEu9>ejQ\:jiA4bl
KKe$1j ?hd9JNp@ZS6M4TitjyeMZ^$#^k&=BcY>jb#kTBKe?K1PlCGJQy+I/?PV<L1SCCitn!T@FHQG/u%IQyn<
\98tcm wq^1h6J:d>p#b!c@/4ylR?J4d/=w$q6\4tq=H^k5Tp9QT<\c*%NQLHuNJLdp@/XqIWpjHCN>eM#K>6m^
?L^a69 a^AP@^MCYAJIAapka/iCp/K#ThpqJVqt@@?4/5VpI>i+%?6N@D$ML?MFZy+A+4u*hkD*FlS\uk\ZFCRq
lZn<%9 TAJQ!V>i@qS6MDa&qkTC/lyLBBpGmI9k\pJFmRwXN$c\wpTm+8#/MbFeKa\1a@mS&WYma&P$kEEbSk1n
E54W6y a&ew@#@F8QBu?%Gq^B?T?T8PpZ@BNyAy4Dc\^$d=a#4^5XCPuZ?F5jE9QT=aPptPC:dP55aFT/jb++LW
VBE<6A ijF/@nq%+tS>IL>^MFIaThAHAPKjlS#DH<wwqPeCWISIyFDEnw\q=Y@Bj!$>eKw54F!blFk=tywa5DI%
8Rh>ZE NSFi!Wa98!\P4%Rew+XJwCQ6A+PyIBE4p$w1VC4=5<p%t%VQ@>I/<Sny^GPYVp#kXYp@@Ki!D@=eQ#Bt
qItHQF @%IYnR9^<X9t?%i%D$+#cWmE@9*j@@&QebZ<^^68AQm66!&9%k*5Bw#\ql#:@l*S<RmaiA4+n*><Y<J@
a?PVDE @CPBd$ta<dj??MeEpQG***wLIB8G?lDEV%jjn!ALW%#+/#!JWCGaNZdI^NnwKAc5qAEVw!\SumlENMLn
S>h$Cc E\LGK^1Hw\K$+VHeSA?klCEAL^6pE!9yGl?*K!B?+YjmhQZ>bNykMl?<>6y4^?J<eP!CC\A?*tQ%$\Yy
Q&kGce F&CE+:IdZ$N$QAKZG$ku\eiP>Wn+&DECn$8a<iMw/VdIiM@^+<jSn^#uA+L?#H#\CelC@JitmQWVdCRJ
!E4Zie Y#cSpIXEt\qqIeFGIqqI6JFRFyJ6JAn@iQ/DD/<V+?i>VD:j=bV#ZE+=9&Z!iT%@ii9/##N9=J\u#l5y
c#\aS$ l+S=+*<!d>#H>TMy\w<pGF6yd!<mYEtCqaSL\8SHTwV%<Wq+*WmEE>M4SauZ@*N?yBPV@EkuV5V>TCjE
8JlwSd bhj#lBZAp8ApImcB:MTHdIQaSQKl+6dQ^NykA9\?IE<G^=P/m+?QVV16cn\bH9@L?hL?M:VBmWq6RH\\
15HW<8 @yjnk#Ni8n#T!IJ&:hwX5$Q$&MREB5SpkD+^ukn48\mN5C=keW&Ca#aep/BXkl+Vq%YkdwF/R8$t%#AS
S=@K*= ?9QaB*@/$=@m6mq@??6jB@l*:%mD<>jH9++SjmiX>=<R@ci+jjAu9BL5A\ud>5Hdd!jBnQ@8dVH?Y@dB
yjY?#G P:@:*i?T:aN**yH+V>A?+EtyJ*q\4INe#\SdB:t!!Ri*Vn/whjLB4JMQatYVDq=N1FTCq?uD8I$?<dES
:#Tu4l j%^BDQ=miI<KGPb$pWRaV>cQ\FjCw@SP<JNQek5iBXRm#M>Km5@QP855pcGAI@!5yQ\lIGKZQ=y$e6pH
RtCyCa GD6qG$^/RjM%CntYAGJAHH/NIl^:$+JVAbeI+&MC#QAyAcR+!TA:M<nijJ?it9S?KhWwCZ&G@Q?c>wEW
t4IZm< FYpjYQN:!#/\@AjTQ4D>B=cJ?Au:D%/CK\H*EwY<uRBmRB^?mTK<@a+Fd\heIw!QL:$Wb#*E9JT<^94T
Gtd@SW &<q?+:jjTaIlSbIj?b**<TNDnSIXA6awWTFRnSIq\c/4cIQ@!hJ!4/$5E#<ET:?mY9ZmBdiY*w6k&hd%
A\5=ye qd=6>m@tXq*qtdQk^i^d6&$8*$:Sd!##9bkBaVLhN$9p4?j/K1w>?BP\XZdMHiYdN*8&Xuk&X&!>8/\T
+id9*F j#!&>C:^<:Ad!1kMV$Yqy/4<:1*$c:aX%h5>qYZ*XJS9^dVmS*Z@941<$1:IQE>Y%lL^5:Ti1t4=5KN$
?&KlVD /*dKEZ?H6:^1<iZ&:>?KZ@I6>Y\6*XLtKh<KbY*AZ@c6<JS8&ADBqPitm5$RPP</yGF4&a:ERQ^6*P4N
8&w+ja G/D?P##4N%XWXEH6E*<VPQ=n\iZdQb9KK5885u/P&I/>WYREbh8@HX^Xit?b?Fqm?>iI1?cJZW5btpch
6?c*S8 <@#A8:Sn=AYYuZnQ\J?i\8$X?JNSCPNQTb$B#nqFDhLP1QeySh^DA^yHTM@5jBQ*m:\\$Ed*$<H^ZV\h
dBWbW1 XtF$Ntt<dHpYcS#G*:HYV\9db+6K&D=L%MJdb*>P\9MQmLjQ@y^K\*apXQ6nWbEA@/WJY5D8b!d:NZ+Y
$q^1RI >*uYjZGh?C:8a%>pj4aiQ@ul^A?tTi*I/e6eq:p8Q=!:IH?B@IbylXSZ@wj!Q=^t+wjKKSa:6*LV+LMM
pEdLZd QuljqL5uh%68dw/>H!+uuD?Y>KETdd^/Yw5W>+>t+4=Z^@VyF?Jh8Zn?yRLPq@DFq!dnL?aCH5=uI4:a
\K>E:* pnS>it@C:4iQcClQMm/pk4h*$ZAq&a/WC9^>+KV+1citn+<ABL?dquctledW6ETV<eQ=EdLbJ9akP/Ke
\6A6dw aIiZLq&R\eS&h:^e6uXyNbV%m>BPK+bh%B/J?:LmaZe1Z*W=dlc@?y*BdtSZKX@h9daE%LVu*4LK19IK
H=KqKP WMwdQjnV*XLVX*qK6*6RmY:*LNt&4c!$Eu>W&@N*yX6Lej#+*L\F<!/d=@FINX6bX4/%cu5yDDGpV!5&
K<JCYA d6<BKuXiKbYYBb>L&cYND14^V*B@G%#jWFLbQ!14+4@y#VbB!Q$Rp9n:*jLc=YLK&?LH8hNalJ&4jFWm
89nh6N QJDtepknj6FdWQ6=CF5PacqL!/1?64%mt\m>EG4^LB8T/XIA?yRN*ctp5K<16*W+&DTCY%kt?>@5juj&
tN%kcK 4b6k^EG!cHAA#L%y%<Jk5d/mhQNH>Rhp&9*wT8w%1%:^K!$J<%L16VB\qh=h\V=8!Y:tqq#kPI*abTR<
-A%!DC 0003e7c2930001202b3 Page 358 of binaries1.zip
XquZ6K P$:#uHGc=@TEb?hyulp:F:m:ZduYMV%i4qPcScqZ5hqFbDtW?5k?RKPlCkj5djRV>jP*!X?pS$NuY&q=
SjNLNj bbYua86t*:^LqqcRFRKt%PdN94k^W4c=dD8N<<Cu=h9L6qR6uq8!CZkdu#*4T:iCXdEh:cG158&i$mym
m+Y=dm +A%qG$84N&?jX+!&TIKhkhq9R18BnA$\lpB/!4i84/nEu*GQT<Q&T1n+*cZqY?jqZqi#Da$V<d99IGVV
SjdT$W 4/*a9Lq$G$T!k#JpuCYdN&jcYADP<&:>Glk<Y#&*kqXYX9qbNQa<%!@FMm6Pc*yXq6%d<dW!M4?\jSb:
ViC$b1 QDin&G+w4>yiYZ=ZNXmTu@XWAIuRcGRSA6*XY!%LWF1duk&q&$5S6uKbh#P&R^XX+&<wBM!yTmH1SAYc
t^CPZ6 laA6*a:XYT>NNY4WnSZXRBwwF/lpJcc5BIN!*9p*XG#c/qqcWid=@D$dK51K%%h5kTd\#aQ:F\66w%Hp
TmbkX! DauL$DdhWqFJZW/eWFc#4cJ!?:\XXK>6bi9LN=bDHc14RDNBC?&Ad5V!kZpk>K/!>cZX%Qek!eAeG*!R
\ecnp5 HNwD&TcbBmR%?<9AB1LF5eF#CdRmRMC$Y!Fk1iCQZH^iZqt?ySR/@CdkW9hNbcBMC$<^i#hYw@ENEaBH
9G+deL =ycZjhbn$Z@JFVhXCKJ&qFXc4RZ$qY>B?6Bc^R1m<lHhdbE/4$C!tt!n:b6p&^A9qFh6mth!%XhA1SQP
?9>L/A X8#WF/Zd6$Q%WP?Zdle>9d&eKml#9k6:Cl8NGAE1WXt^hj8<1?%!ScFp$CQ*d1=aZ$1=Yb\l8pm$KqE\
B@#Z8\ L?5/K\nc5iw#e#/H1LqXq\AZ4%>jXqYF4iTDuAWuR%>CY</d8dK55u!nn?bGFw6X9Xk@icIDIpe#FVGn
T#HPcH pFWYYaDEXup&qpINNmTGd15AZiKDCWLb?1>>qpm\BKJ1i\ZJN4TMb*ub%k&aMbSST1TBkJZD=PR8H?X%
Fj=6$u 1<l4!aa6MFMCET8FyQM!qt?1&F=^h&Zy6p&yWwb9y+G&aq6byYkp8!8&w!a1>bSWA46AtT51K4bdtWIC
j&T^G5 t#MqI$nM<51!neA8INlX<:+!JTNk1+y=DnEETiVt<1?SqChM@cT&5GV#1n6Q%T6JTaGt4cKM$49KaYdy
!Wk6QC t!KViPQHyR115@n:JceGCtX/X%ubXyG%:KHVb\:5ca$M6u/*Xb6ujVWwaklhZ:G6HNwY:JuJqSLb+alS
>eu1F: /cui64tmhMMW>ca&lq/d>>ZJXW:YdTK#8IISI+hRlBA5!#w%HWu=9JJVM4i$E@I4VG?SmibqbaGCINWH
$SCLCH uLKXhCEl1At\J$uFIh6V<<D\?RlL#%=^/^LQelw5WhV!qm/d9@VYY^NCMnECDmjLajnMpYkLV9WKNb1F
hyIT&9 kddMbYETG<yLHJ5wSDkq:E#AunkdVC!<956$>pQqK!:Z4hDbFQIklD\FIi>u/L$Hl6+6q1EHcT/HNEtG
I+6M=I HwR6l:DJlq+tVK9?bB6WtYDwYhAPN5F1qJ65R/<BynZQ5@?Rb@H5B8k::D>&y&FN\SaRd+ueB1X5X4+m
lG?8k* b$d@BQu>t9*WQiQ/4i5*X&<wR@%Q%kn1NI4^Y+n^Gt6#u&*F?N6=C##Z%aC&ST5d+$^<+pbp>y@hqE5>
QYj=1$ nbGc<j:t*yb@h8=<I@e>D=58VV?<@p&=LeH$p<6G:kja&YIMhRK:yRnG#C?yRHdj/mMlKh?/5RI$>haN
C>bS!D FV6IwY/h>^nyX9kD?Tn@9/%ejZRW%SX@M\uJp5$TA1Z!=VtnAR=yIabDRMBT8&RDymTkTV!Ay@Te#i+p
iKEpQG Ghp9h*aLkjIHdjGWHpGlwNICkm*65T%T\Z1kXSRKTMKHBAJXY:AwwAFEAwIkZ:**9yt=8^kRi9!H?i*M
/E6M&G t#9*9jh:9*99t!GSu@lDS6CTCknQ6QiXRHZFcA<EJbEu&aqAGqFZl/KblDka51YVhBjnj^BFHnW\mmE<
mmwl<P aTp$=#tWQekEmjLA5A^8Sd*56RGMTE*c?k@J4p:YamVP<Q4G8/w5KcL>LyM8kQGb85\eeGud=hj>\$hw
C?&hK! 6RdpK!B!/DZLRWu^!PF$TYc1qlYI9IaXb+LIVN6k!I@bCN&IjR*Ru1QX1Kn$ympq6eM6NM8<nC5pWp+/
N&y%aJ FeP6\RhZX?ulKP%d\mP5bBIjaN$I8dcqkKB@wGR\R>=II+^l&pduniHDj8yN>!>4hZ5LE\d@Nuaq&&45
&8@KNX YeM?aPqA59wXj+8?ii<$4d#P1qFkwK\$ZbwaSHdDMN>Y!LC!EWmJci!Bh8DJaHIZud8NnuyiutJqS@=c
@*Vw&t *NDqeN4l>MnE#e4+9/=8/LC9HhaQ%tDil4?#yqBityyL$SRFwyE/w#/JPbqj\+9lbBmL<8l$ukBcPSD\
QS#NRh Ictp>iCp5Xbi=LAZ&qDPJY?I\/KIR!?K6B51QZ\8=TWBYC:%MHX?!=/#p\%JaE4:%MHn6F$QaZaR\n$E
$9G:1W !C?yH@E\1yDXwnccTEVD58GwVn?MGyEtjlWkHY/cJG5eDK+&b<p^8V%QyIJmWa8Gk1u:&PpP+YtiMbLI
&ATVaL wt/q%DPI%uautmCijFh+MmjwM^KbQq\VZyujy*jPKTTCSa54WbbyTHZcP>LDpGhD:^J/9cXAhdyM&Y*c
hZPi45 kAJH+>M$j^I/Dm$C5qc*ZnpkL<pCyDX\n*p4%pVDMCKW9KZh<1CYM^AFe#BRwjAHhyq\y<J1$/k5jhan
uW&Y9R Z>HY6L6knPKR6nd1jqktWC?F\e?k9:Gw&l5B!bNBRa@HaVTnAeyXk%1>H1Gc\H4LIyii@i+CCm+@eBeH
EPtw5S 6lS<B!YIc>ZJGJY?<:B4*tDRRF@<ITlJujWMIYekSJnCD4LPRbwbybA$#uw8BpWVq#t8+TA@8</I!F\e
@$5e+A DPE!5Z&lAW<9h^clJ/ZSPLmFI%I6qa1i<p$+$LHqY:9$&Hl4#p&achPW5?QM6q\NYCbASlcpjS^Vl@uR
F1@T1C 4i4Ci6qpVR&14^RJty*p@!NT6/hR6=Cu^VnGQ1+61t=bY>#=IHhk81NSV85&FB91FyHu1aDKQ+VNeeMk
inZ$V% 4>T1\cy$M^qKtFcKu%WNc!LR+PqjLLey!M%jV$#b&dFE^KS&Y1I^J9eybK4tlF8i8uAM?wX^B:XDi/mt
BdI@%l =tG6F4wW6Pw*p!IaTE8F#*9DFbATYpI*BHJ/<E&&G*:WabGh<6w^pS+>5B=L\4pICq#Cm9Ne@chXt1N/
yQ#L5K iFPc&q=1Bh+$lbVbJaWFiS%DR^<j:Y$GNYhaWZNpk>+?c:chm^ny/hLQpE\y@1FL&J&pKZQiqC4apB6y
4*IyDm eWlDaP*NVPYPHe&I41uS\S<I/LEE=RRaPLA!yntT&aD5<?C!GRFhD*J*R$baLw1^Sl!W&jabq8L$mK#D
V5BkHN cR*l#:TlqjTN+c=MNEt4MCJ*XiG=61nYSZEb!4GDba+:C#F@HAId#B#YiFCG1CZ*CZZwjWJ+X8eY48\:
Md@:%u >HEwS91/L+mijn&akF1t&R?N5ZL#XqVXCFZJ<yZZXIlP!ui1c/wK^LiW8BEIF\lXneB^BB\Z\dEEn1<b
\9jEda mXA^tH>@#ASjBS!Qn/$1G!5/1YjLT!eWmK!MWWakNAKPC?BaA5eQnaBbIIw!l<N^lCnKil!PJcLI6TIG
>a9*D4 hIhmc^<5^X1l=B^?8L!$SuVP8VANX4AR:pm5QnainnN>FSQHChZ>bBDdCjijjBZnJ5Q9%>Ji:M&lq*pq
5*du>M Xm*iG@=6yT1MQnVLj<J1XRkn<*6C8<RDt5mX@+6w6=mkCa@<p?X:FL?t>6wm&%!@D8hu!VcI8+!p5uG@
aHDHEu MqSVX8!R:iG<&65qN@5JL=QXH?J?e/*1iRk</!p/j$LMAn9$TW*GTSEBjJL\GVEQ<GZCu+6uNhGX/5iM
J=A\WS m&KXJ9Ky!5!+K6aBupQ+mukV<F4bS:EhCqF=@4SwAd!VeL5+1Iu8R\ljEpe%ejhC\ljEKW%w=\ljXuI%
MJ:IW/ =Xj$&nnn86JVW=dFCF>VJt61>#Y!L$yWW@68I9!qMpNVC?kV\a!#!q^NHdCS<BjKjE$hSL5LGiiXXbyc
we!5!Z VPPb6^LHQ+@?FwV:IGD%4kYED^Dia4iB@k/$#&916:Q5>wCdW?^5=Z6:jJ>6>ulS98nFN4pNnL8%yb^j
BG99+L L*qCiJQpCiEt\4<kVJ\SQ!jPTJ:MJV8HHV9KXw>nS>tY:>lS69h\:Cl9>*L8XZdeVjlJ^E**PF>HKi?j
Tema:! b=6@Q5<&%%=mt?8955$NC66<9SQdjK5#&##a#nbjPMR&X^%lt:<:^nbZ6:HNQ*:KNq>1b=86hN:#X=kL
qq94a/ =Tpj+d<kZ4Ca<M8Iu/bZq=/%mJ@yS@kX\5Sl##4EC%<q9Ad^e<RH#/8Iu=>M?G?Iq&45j*N@>4@baQ?d
ZhZKW> %:D@#i*5@<=l:Q@PS8LGB5V@y9F$d$V<u>GE@$/a%w9:H+T*EZ+h<TEcV@edlC5Jd!JMc<j>J8EDlN>C
<9k:un jJnt&4&b<FVCY\m9I9^Q\nVt:1&IQ!kp9I%\tQB&\1<Rjy5\<eG>A@F@TZQeVaSuE&+t9Ju\V5SHmA@8
qbc8>Y ZaVLCi<tQJ@\H5I6lN>B@CF^%d&Z<BVCLaTZE>=HtDnn*w@+I=wLh!6ltk9*9\nVZHnY+>^>SHQljyjY
<\iq=V >RZt#Q^e=5#Cm<!bSXiaM+5Fe&bJJuQtYSh#bttRPjPdB8dMd$QMtV$HtDQ99Mie&Z8IPhN!lDt#:^l#
\%WM+Q bu<de?d#Ie!b<<PaM^hGMti?GM&e8ilq#q\1a<=<Ye/e8X#JuLu!CHQt/1QMtY6VtDQZy#1eWaZj+a!1
CeMHYN /A=uXNX\PKNtlB*P1JqQPJ^SP!Wh#1lbnR=u%P#bDthW%^!HM&4u8R=u%J^=DthW>*!HM&48Rwe#1tiJ
!yTYnk \^t%!%KHM&4iewe#c6hXDtjW@NYTM<yEVi*&p5$bVi&=KWXujytmM%&bM\9ibe+<9VJFb^yThKa+SYh!
m\aZuR tVQQ6VJuuq@GuNu=BuNtq=e=5&5de&b*PZNt>&:t#J=HtDNHl#Funt=p#l\d#b\=6yp=e:!MPZP<mVu#
PDTKTu eTX#=8MY=5\un#JuQutQPhM&qVuVhwS%=wVPPuPmnZZtbJl%=tR:/<!yJP9M1W85M=@Pby$=4dDPuJ:L
!>68*e P9Nbb>cb#?c##y#Jb=$=5+S%y4$Z/$#:e6cb5@i\#y^h#Vy#4yB%=6\c%ytiw#l@!Q*A!8X?LERZGS@*
VC4\#! mG6C*E9^&nWe+*n*Q^C?H@FhbN<%A9G>NP?8pakHpH*ZKMVF>MipZA<kLqpue#><%9jwE::5jam9@JS\
@8P1QN C@ytdCC<F@H5ay6npC61%p8MjpJb<a!XR*w%=aY6uDj&jbH#^kHL:jNC:hX1==qC:jMau?@Vc4eZcu@!
&<Awja 5$8X@V%4hhJI/DtqYIMT:FJytAG6PkHFuV<iNLQLI9Wl\&#w:J#yXlGh4qZ1WLW&cyQ<eh!T!B8nJ@\y
<+lqRS i$M*@5+6dakcAh%u?EQSip<bdkE>BNbCeG98GH>kYnItL?X+R@XSKFAc\tbZYVF4E/q1nMdN*HH^cDJY
8Q@wcR Gk$q\^E#m*/aPXB%Y&e!$Y&Q>aIajE$p#Y\+^BQJYL=q1lV1JVT9t@lTpV@1etPq1$pQ*NW/j1=C*@l&
WBuaNF tVkh9+IABLX@RQjky^A?A#>%kc/u@*Ll4@JIZhSF4\HB4jSH8PBMDbcE8V:hDMRN&1k!5?E5*6Rhn4^X
BVGT^H MetaCeQ5hIX<9=N*a@<DWE5DBBRAAkAIAH^XdTXiwWW#<CkAAICHARA+AAAAa&^ybY=$e!>\b*A9dYFn
n<yY*^ L%BHWG%qduW9WEhRdYX8hTBNSXNRL%BHWG%qduXNSXNRLuB!cm=mcY:6ZRq+Y<Y%um9JhlI:mSNMTEmk
QuknPM akpJAS\TIARDJa:6BKe&WY&HBMwTYXaeJbIqJDpJqCXR64KXW1DR$4K%LC%ql^RKQLc!q\INqH$yqQ&>
-An?BF 000505c9e03001202b3 Page 359 of binaries1.zip
WA$V@u ^&9jc@6iq:##*#t/t//pc!Rk^DQ?n8@Stduu#uLtuLp#e<?I5cGFwWS$aLC#4V9WtE19EpMMub&lhM9T
FdTL#u >ndNJGtuu+LLVi>>%H:LaPn9BY+<?iS9LlWmpp#G/aij:yw86DYHC&$6*V\YCc:RjCdVqtSjhGp+ua+q
#M:NtB $<FRP4p1G5tKaSY1NdFyW?:Hyp$cA6D6NcPTL4%WmIM&+a>ItllbR^Y%IDqR4KICa4wayV*wY&>eHaE+
Jt#m+u ?hA?DS9EKCcN1ktFI/9D@hFCVG5=9nF#dMI6juV*5bq5NNETD&e!$a^LWieQD9VFw+X#4ZtwL:?tk%p:
L#atZq hNem@&XcI9Aejw^=XQndQmdcBp@e9AZJ!YjWXLF/%#l<pT$4^Mj!P8EtITdK*/<p:p#e?W1CL1@e!dmR
KRMnZP pV6w<1=he:>>itH%*@$E>IT1p+WaIjn*MqGnQ?k\ZaKEPF^9DALnQ@1>n@JZPP^A!caWdtMlV6J4L8>@
p4ZtH\ haHG1hEqR8PTBP\JLLLme>^/5Q<t<WHkB/dpwF<RXGp/V#GTwJckntA$\SmC5RV%BPMI^lN5ShBAMIFk
SZj&>! G+KJBJMIylB5S#CXaBiC/Zwh%:E$%ZYGI\hH\**ShKb^ydjiEAw8cn/$tYQ<Rqb:Zpu%Jmlek#==p?bc
K%P*yT @H>9YhA=b?:Z>wDScGJ%HG^dq$&HM<Ic%VKa!TaV\c>Fn%&dVQjb+=wnpYktE\!F5!96EjMHa@E?N&/E
T!\Gw$ BGEHFpaH<8m65R!$TcI*Hp*uSZdEBqc:pHN&^JdntT&::WbQTcSmVp+!mw#RRG!k*%FPHdiSFwZZlF&j
:w%la9 EAyuI8G+?!M+#9WbwXCLc?qBL%l/SL1WH8SR&+J<tq6?R!*NtRT%$$A$dw9wml:uZw1ieLw@tk%&S:Qb
bD?Q\Q 9FI5wNVB#uA1qa5l>wZE!Il!ETMn#mqGSwSVnI\Il^nb/M/K6EYcFYpnY!4N#HGiGDtm4E%5SlqmbNbK
#J@uGj 94R++%^bPcVFSm>aTL8$&Mk5LZccT<Gh$tJEPKZFmHCSFmQPLm*6A:F5W&i+Q^dJ=hJCCcYnpS^:G%ut
e%WKqy WTjNV!jZbuL^dZ&^dJJ^*bd1YH6ZeHE1G$9En58q5*XpC?iYeC1wD&HManqm<#MJ1w*X$6lAX+8D\d1=
laB:q& e+!tM\lYZ9l6+?LwPn4N&Yh$w1&#!C1^>lKha8$iB5EtMkdXtmq4V=Ab5HeBC<$RYEtVRm<L+yB&K>F?
SQDA:b q%Y?DWJ?Lm$Tdj!GKJ5@dQXwFX/hayNcuiIWX!p@NnqhSPIV:IytpwQyTJVKqlP%QLw8huqWt\nt^h4E
JGP@bQ MT?&wGkYTeu%W!SF\ee=^De9*m4K4yGFut$X<d^Il:nu^V6FQ!?B4S9p^h1/SF/56Z8+S61E$DXFwWJd
mRuuSE 8%B?wi#h1WC<$Wu!+&W*!/>MS=e4qKA\b&6ZhI$5ZmPYL8wcl?:1HqFRQ1#hPC@Y%1Z#ay*hP:@Q&4y/
HI<1^E VlS%cpe5p^ZN<ZmiAIJtp#pRuE<C#e+eFJ5\ktCX9>^9Y\ZumF!u8b?=&6L#b=eqp&R$5p/TEkQWyyJA
++pPJC $LZR+5F5cnB4@4a?Rmee&1un>Ac#8D9aGcZ!e1PA/lR<C<&YDc6+=Z:uFhkmSLtjpB5D6?VMJl$k=P6+
m!V8wq c?qMAyYGVdt#PP=Ktlt+S^I#F+Z4bG\hC>uc\ByljXki*Y&Mq58Aqid/dGQW:u!&@T*HjLchLl>l$QIj
&jZ:uu EXwa/8TyS#i>:am&>TBHuLM#PcIhuhaici6mnnl4d*PJ55tlT#!LyE6M4q&eXYD9tc/^S8>\^54?/1Dc
^a4/*I t5+Sb&$>6/kCte\%4wNe5u&hQh+>8qD^4H4AJcyaW%m$k$5MFIWd&d*\N9ZlmLNyE58<P6*nJ6#YcKh\
j!b#>Z Y?NelN5cuTje%pmueF9nHML6nHLY1DQi4FFunKZ1dFYRJ>#=5hdY6<Wc\t&qPwZdG8eR:4!wAyt$CLiX
tkN4Ti :C4e%kR8\8$TZcl+D8F&SlX4C46\P&Na8QQI:wX*C4e%#mdelwu9CA@$D&I6IEhyVWcK/k*nByhI^:%=
dj!8qM #YK>%^qy9Sh=ed!ckGS>G<u>6k\c4P<enke+tDqm4Z^hw6\d^@E$c%Y$Su5H?@8n/cD5?HuG4Cjp4u:!
KVZ9j> e&tNhiVTGhY&LlKq4yRe!Lk#6=jEGXPk*q^Ka6Ne%yI+K!e9R&knJ$N>$G^\!dXm*1$1XD+eT*Ae\VeJ
aXjVw5 nmeaJFlHeALBmXlFIMAC%ReEc\p?qE6E+qt5@SJknjldBFmPP=ZkNILVCe+kPJQk&\SuEb^NeA:B8RS4
c?WSw% CH=Q<CLBS\R9Ed\5=EJPFT@:%QD!nX@I6cmSYLLp^bAJYE5n\EyGLeEQCT:DIk6YJdG+IiVce#*BPIL^
B$qwbl BF6^iS5I6mcaVIAq1i&\SEe\mYBdk1<RBQWqK:p<6n9BlRRZEX^M<H&CT\l&JNmJaGiC1RT:EE\n\DIa
uJciL5 q6K&IblB5B9BQAI5=M#HCnnBX\u&JDmIwJYknYAB\aEE5\m?VnCdaC?C<\n&J9kP\jpE?^DMIhmZaA?C
\bY>CF SwKbBA5JDmbwJ%lE<DYCDm#5E^^CeADBa1\1Ee\q&I?kmYB@knBBL$GEwI@kcILqBFm:ZeHLkEeShBGp
wh$6Rt CdwJikm?T:CE+AKC:^EeT4BWZ#IWAw6eMRL5SFlNkN/LJekBkmVBpRRyktQ$yWW5K\4^DaInCK+m8J4k
#ulwM! J\R@Jjk^\bWE%^BeT*Ah\a<I*5D&AwI*Cc+u?B*B#\l?VuAD\WcCZ^DemG$MBDeV*EJ\K<F6BLeV*EF\
5yRkky J<HqBG<S@IHkdaJ*CQ=IeA@B9RV*Ej\d\T<JjpX\Q<EDBA<TdCB+q?B8k9eIHmJ+u8Blkq<VQEL\A5Gn
8uy946 BI<SQE:\BMGVBE<S@IdkcaLjEn^DeBjBK\T9E4^Q<B4B/\Tbm9h?/q%naZb=Ed>^XVn6VHJ+i!na8jV\
PbmntT EC>TayXWny>wWQdyHuwRlibR1ENj$R!$hm^eFqph/+Q6Yhwhc1Hi1<uXVZ&Z\yJRi&M1HX$SY%h55S:=
FMa!:D p89a91HplBL:CKwIcklGE6RT%BGMJllDMJckutAe\ZmC4RkcCCaRdEM\pYAT\STC:RmtE8^CMF%jW1@T
%hTaVu SAW*Ju!Jh:%w#5X=T/*p%LNtWjqPW&A%AdXFXH%P9W>kFV#Sw6y#K6@4:kN#u+P?*$DL:VjRMV&miLqK
&dYLij dI5IcPdtpTLdFk4qww=9tGAjhIZ$9tLda/B>&pi:dV4kWMZAFm/u8a>pT:ELY>C6LSb&h:bYPR5=k!*G
!RnAG? X:mbD4Nauy*bKuE8DFGa#^dueG:/$Y^6kt^qi%qeS4E%1&Q^GMem+YM^Y5lYMte^8^!Y5bP6ZIC6yMaY
?=h\Hc il1LXRNd@&aY*b!I>Xm5=lT&*Ai\Jb@DF9u4dQWQbP9:XS+J6LDX*we6>tIiDi#BFu=Q69y6LMy>LQc%
XMVEmj QAIb\cPTyh!qbu<8ZS5%W>P%iHGQVc<8:FwT!nXjVde?NR4n%dCk9cMNCyi9NZ\h!hhh?V1h4%Q=8k6j
dJD1/b c@p/t1>n?F4H%*1?n8Z4iL=8^hje<:jl/$T?n8Q4JE8?A/M:\%ml:p&H$#E>>\FP=iQ4BL=P+i6&:#@\
/pwHT\ 5jlBZ#I!TCNV?8%@:>a*M*S#iCC@&t:?<Nh@uR<yeP9G>D4t1S6@C8661K+18dHPEcl9XIWdp+Nq:Mw$
YDBn^? 4L9R%m>dZ:/Akb@^a+q&9ndT>$&HCK/95E\:/&cM6RYGMCLJ1&ZLQL4wDMeGlCqiq1nGTE4wE%YN<Xm9
8n!K>* hZ4jmmMS%nFE4ujbyVXGWa$S$d$!8Scy&mQJAj4yZK5R?1VnL5H8dDwcVkn=Yl+d/NeV+ktbqiF$6C<S
TwR5Mj VhDNHWkM+lInub:V:w=k%?BANyaA^<dt9S5yF#1%ySG#mNQ*nl$>6&>ZSCB@w5qcCWRI6mhT!ZR&mP^$
EHdbSp lybcj<+Q^?QJ=ED\+Gmeu4M$KPeY>aSLk#\Xl%>h$iNE1G&B>hatc:W%$Z?n&Qy!FBW<ueFedD@%8c^w
j6lhiV pnLjui$P4+t&DKaydc/\4kZypP%mNIS5A:IW>ke%yRb:deZNEe!ekYC@TVVbNaFnu5aYVZ^E$b@IuHXu
X!d!i\ PF19M=yIyw@6:E@nX&yFHK1t=>kW/a<Ij4apB:LShSCiXH?1W&>=Rq4mMcwwJEW!a4p+FS*ku:1$61ZV
E6F%h5 !VVmCEjh=ikpYykyqX\R$b&KSwk8H=bncIt#@#1$b*/HTXtTneXn&bmi%RZh1cNZJCpZiKdSTA9Cntam
%aL@b= \e<p1Tp#&eFijqL:ayNnD8@P>lp@P<QbqZT4K#9K8T:>ZDwhD+Y#pbXGkZXTV#1e5lE/w8HXPwGi^VlR
8LQwNp =wXpl$VZe4!qkY\@bc&l4kjY^NJWLnIQFN<&$Eetlyy6VVThmiu>*JwtIuXJ$DLZj$l!IC4!X4i6T^jP
wkG!WQ 6R4:+wS6NeI=q&hhn5ldj:Bp\4du#4HQ#t&LynAuCG*4BjdXG8j$9YP?ZkWX96nk=:eVjX=Vjqh#$w@e
1FtA#a *1=WGPal<Gt?q%GliDn//E\&uQ=CQ#4V$L%L9YXb*/L+DYiiEM98@?^#b*ujKnL@I/hTiuk/bnPb!4N*
6DYPXB p#4LhNa+#w9ki*N>c+bF&i=6?iBwH8hX<D#MCMb:PP?C=:6!u+m6+4IIZ6Gwa*\>q$*\cpu8VjJ!L19k
NaT\%h qa6/^t@l9AyihSnQ?CPYFc!NZDiCX?P&=tIH8K/An?M/A^:p8kM?p?5R?AFeq<Dd8X/AL#Z4X95G#><B
=?*##$ Z<Z#iMDZ<4\h<NN=@k*+YV#9B#!*Tkd<ey+9A*+d#?<Bj+4u4wC@!QPG\N@k8Vdkd@GeIjD@=LuDZNQP
I@\w== aH\e#$MC*=uuGwFQ=jp#+Q9\@CQ\Xy=VA>:De&9AI##uBu#RuEQ#uey#iMA9aFpBjmZQ%\G@pij+kG@k
*^!MbY 8V4kn@G<I9AZiZ+S?D5<6\n<E=+LBQ=QunPE!I:liWLkp*m8EQk$unME9l@LK@APuyME9w#uT+FuiH+S
$we4yM ?Lh+@lH+&V!jCQ#:QMeJ@B1iI\Z?IM?VAu?c=$8B9<X#1MD@^HPZ/Fy?u8eEQwduWwFQ+uqN+D6^9\I?
$SX?Yp t?hikdj!@Cn\Ly/ZBd/T=&PB4?F?CQ\MW\EF#8H=bPCZ<V\w<P6=nln+ZV#QDQ^SupeG9yHu5IG@\*$d
THky/M ?Ce<y<&VR94eN9A/u15GQyHu4IFQM?i61?d\jDV\A*p?G9lCu45Fuy59Bl:tiYQk^@C11\yj>6XMjRdR
jZ9JAw ^aS1^66Aw&dcJ9&Va8k5inMkZVhnuG4WaS9&>PZL^W#=^unwmcy/lt$IXqtH=FI8hmi=?GVVyw*91iwb
aC\e:Z ytFE#y+J*#\Mnkq9W4W!4APEaSPFijJ%TetDpwieQGma*hCZkc#4Rm1wMI\C>kEMe+YkdIIK&Fm1tXMT
8*/L>Y u!:w/!yj=PLKCNYM48HV:q*:FL9y<+Ku8\MXYNj$Cd<Hd*%DGCjXa#jh+8/k@pEuh1M$*tFQM$>tZj:n
bjwEw# c@:t^C*F=?Jt*Wb#=1+8y+$$EhPi%Ed=>YW/>miyqMt\D=*h:Y*n&ki!$jSAFD/KW9Fpi1m9TP%SiX6n
?L$t6p hF%W%ik\DNW#S\$8c8<SS&!<Q/h5@Ei<FyS1iQ?DlYk/&H@E5<@+Nl$\h$e5eW@SFwuc#4bDqyC&:MX?
*ZiCST T1Kh*6*V6SQ>9mAWTtI=<e/8YB?YX^<MS:PR11eyunmKq^jE\$n@dp<u6w&IQ<HP$@Xj&BbK!u^Wc#1b
%FBaXn wmj9GLB<XBCI/h5V>KZM\Cy>!<DXi5S/jV9A*@R<:\/@6y188:XGMV$wNH&JX65DT>@ctb\i5\1*M4/I
WF*+1j LNtN@IkiZjiHiEQ<5N@D%DC6bZF4&:Vk6Ndtutc/lNydi1aNy\yRu$V1acV\nZF5>B>1cE$P>uh%h:XW
-AZBh: 0004e11b6fa001202b3 Page 360 of binaries1.zip
aPLnI$ #PSSQ9\j/G%V:@/qnZ4#hBNwWudYn#^e\tc^t&>wd*Tj@e/Iwd^d59@/Kq@8BhZu6$WHZnDTaV9jdDPh
>#pXB! =94&w<u6jZ6:TIj6juM<yMQ&9:pi$tH4$H+i$5E8N*qIl^j<@V&p\*dDA#!p\%dEA#&p\>cW4*yIl!&M
6bHkQ4 B*qIl?&N<#!p\>dHbk@y5BY!^WM/nHqcQcVDN1<&D?t\#Y&Bl*Vaa6qRTJ+6CLbj:8\lHda/L9d\ZG!^
NQIc6@ DHqIl@Fwq+h$&I:bZeF$&D:/NYkMLFWXTai6yS$i$tG4aciHhNk&ipmyhAalq//W*91<$/uSqS^ZmQ!9
ldBE*N *qSRaSkF^&jD\!?w%W$XENSp9u8w#KJPwGK>%e6/wYQYBA+QNw6bp@jX4MtYP&5!/yDFl#S*6nY&LY6#
1E>d+n V#>QhmhSjKFSjhH:taVN+w6i6eBllGG@\PFZjhKt*!1uRdW9!Xkt@%BKyi8*HF%9j<We8yS=Y<u\iX#J
9E%a@N <Hqe!jB=ZMu\iX#J<Hqe!jB=ZMu\iX#J<Hqe!jB=ZMu\iX#J<Hqe!jB=ZMu\iX#J<Hqe!jB=ZMu\iX#J
ylXSS^ <Hqe!jB=ZMu\iX#J<Hqe!jB=ZMu\iX#J<HqewSlCPp<4GV/QK^p?n!5b9m%qJWNN+c5\#EPbM%%d\98D
H4ZPMk t5JZRW*l1/D&+/6Rj5n6^\>j<puP\QnDX+b5?@HDF\9@uIc?uZGa#=c/H%@yW>hk1!Q:?>JpaT=Q\4Fj
8$EIBF :8WXC%i=1V+eh=X#Jwtn$ZLPJH<5VGiTh%l1H<e?=b^J+yku@nyPA&>&J1ul*b?hTi4PG>tbyIaNHj^y
b8=Hq4 y\aya&iTGw=4a&iTGy#k5RM^*ipmP=QW+QmPuWu1nldbtcRG/YJup4:ekTuA+WCSuWu/+L!PuWu/IQ*5
n$qCWb VNIHl%V5VNL*jYE+p@Vl!C%&J1p:RtSupn+e4eZPJH*@EIa#TV@!EtRe=YXupu++GtSupu++=GNupu+e
LV>P?@ Z<jPJQ$+ww&hTjy^:Be:p@Vn1C%ikjBduEu/@$ea#mRD1Fh&JluAji^MMwBqRHatGaCDRHatGaB#THat
@AqBWL 1V5lbGiTAdR%P=MM\JpuP=MM+Qk\hmabRH:atcV8iJChTRb\lBk:p\!kLhmbbNWEaVmV4EJi&JqpFh+I
a\VVXc &JqpFb\h<qC=C91EuWqY+V6jhmbblcQ+&JqpFX^P5#QJKtkJZ8/5\yFq<^nHVCR:p/!Ca!q&JqpFB=Z<
&<h>wd NqKNitNup6XwV=:j4$bb&bqpNc:5VLIcDl*btYR%=JchTXdn/EF&JqtNI\J=\%I%6B<:p/!GDLM#!i4:
1SG$mT liFM5lyHEdI#!i1*liFM5l46!<+pc>C*&JqpDYTRuWuY:GQ&>lw<p=%J%1A95#QJG4R9P=P5Rb8!M<pc
&4damD HDjH#mS4@mIMb=In$F:5VHIE&ythTa=AH6tb=Al+utBupmQPEaa#!SGR&?YM+*k+hma=A5e95nQJphA4
8$?Y5R :E^!JGTbuWtPSD9\8Gcp^bupTPkmhma=Ek=L&h/M9I6%FuAe9:mK<d<LiYRjXBL/Pu9JGAZ=+1?TS/F8
B9Pd9b ?FmdWVnPL<p+!yJmHEj^HeM+?n/Q%pclLQ#6em%$Ie@u%$J@DDKP94YGeentY5dSd9#6im*Kim#nTH5e
Xh^k<! +*BI!<6G6Vkc<unGpb<VGIh%b!h/6hDDJ#H?yyBPi+F@^HwePHVWKSK9k#:?F8PRyXMbl!+=nZHp?ZVG
/aBA4d pie#GEe:uMp+!9S6^qF9b#GPQJ@NPI+:QIh^PJW>q*HW=*tM+@nM:#APl<DuM@=ZIb$P\&#AXq#APHVd
e=K*V6 >^mH#F#IPQJ&EiPwk+5bl!Qj:#MP?d?EeS^6iCun/He@aB^%>WPJn+E?9+^^!C1:8l?#kP$meLVn=a!n
Tl8E95 91>kHNe4Gae#=K5aj<paFap^@!*pMbE\kZnYV^tH@F#DPHVM6a!nnNe^n4c/uuHp>&iMw==@#nmPNd&B
?c5:P/ <j<R<nlJtFnaiS+6%MNi*MR+>N@NnKNj*5I+=P6Y^qHY&^lHH:!h<Yh+jAAe5uiu^Mhl:LCBehm>Z#IP
Ey&TjF jZ\Z+>Aqh#MPGj<X+&mVi^kH9*5bl</<n@H@E9JwT\\SMP/+u*GW/\HGITeQMk+>>BDn/I5QM\+=?nZn
8NiI4u 1I>HGIeii=S^HK@=tMT*\nnueebl&=>kHDduTeclP=>m@HkiM\GHdD:NPN4p6+!D>#PM\=H95^LZl#nQ
*^+/D* Ma=^$P<aS^p*Mk/d>n#nKCP9^DYk:Z:QPGV&SedS6m<^nuy/tZE<@^ZGwW>ibj^jRl:qmYEY^p&9M\+d
<lnJq# <Rdn5Gq9Mk=h?^dn$CX@aB#!@ndncLh*GAj6n+#DS4<4<RuR+i\ae5K?QNaEDn9=AiQR\S<!D9*$EiPw
db!w/I =+?H=e8AV>VwD6KK#p>&hwdKZyZAeE8im%=ppYPe*AlZZ5DAwntXmqiCV<9me%cZuLNbGpVBm1bymYe!
IddKVP qiC#cFX/STNBPiY1%=@X$q1J?1uEFqQ\/Yqd%6Qa8:JwP65=cRYC#thqNlE95*=$Q18K6+cZ>6L=qPk:
hC*:L8 PNi6XIBD:*LqB#*\<Fl1RTZpWD@?5RL6u5/pI=Zkk>Aakd?k<51q<#p8qm1*jp18/W:i*DShb&jH@FLy
+X?Nu1 HPea8ye<%LGkIu\1yKEY#%>W88jaD&S$:/Ydw/cLqP#J=tGTSju56q6q?ER1qJ>WyjmpK5Iu8m=Xd66L
NR?WX< !%Sii^tYKXYTn?Ze$CL=TaW#qiEVYXqP8hbd?BTVSP><WwQqqG6>BT&*#meVLj8ap<*N+tbY^u6LyZPe
=#yeXh X85ceGJyJjnwqy511b^!lR#L4j5EeW>W5:qb:5*TMqYk=*!ip8wqTMtA4<\6hE^ZeQjXEMh$ljq5!Y?h
?K9tNy Z5hmSjc+DYp5XyJQyEL=TXYKV/wmjD:95XmB@A^>LFc+aEMdm=Zm+*E5XwDNpMhmJjq+Ha8=M/4<YK#E
V6&16% GCDW$y^JFE?#4GX^TZ&INA6KcMR9?bm8wCAPeW^ZhNh9Seb$e5ctNSpyaL44lnDQ&%w5Q$Pa=!*K^+8F
MH:9$X K!Z^Fdh\u??<c6H/?RLtXR9tb=+a$4^1$ZJ=/eqi&u$I</G6yj1Z^@uRwu!Y^kd&tl%eN*hPwdH#tCGN
/Jac/\ walSSebRJjqEKyTjXKZ+yC4Cy!>c%k4TpMhRBjJVQ>R^T\E?R^/#qPKVL6u8JNDFNdVpE!%1DeApttE#
JQ%<Ye KD=dG/n#meh/Qd:DFbEk+yQ5ZXYM#?LiXcZ=nNABP$>4A?wwQ^YE+!k@!ENVW@jKeD4c%>Vb%l&p4yIe
j69R@B VEimVcuBZmWy\$piSE+@/IGWYKay6TLiqAlHqB\MW*pI8MlDJJqIJAiWTA^HicnK!WNGGk^XPeNdHt1e
m\LV>R ?1E@Fiqd4R<hakPS?GBjXIuIeJKHEi:!kCGEGp+PR*pacZ?@WHW##PXlqDw/ZkZd$jHK&cpSl4&#$<*T
S4bSq$ mjlu:t:WQYDiNq^1VWkF4C\8cn/$GVC&M=yNJ>hG$/5#@PuA@F<I$j\L:cJuW64=J%/+K:+LuPJdJdbb
jal8\: &SjHV6EHhi<dj9G$:yWn%$+B5j/M/$VhAu\FP#:*uLH+X9=8*i6G:iQ+Ju54I\bj^8uuaI8/R@BXaEM8
?/\6dF yy+\Z=&M&R9jFY/hm^pjyH?>MtbQQGiCEZPKEJQ@Iy@nX1bENlN*TqMn9pENJdKy@Bl<?V<mpa$uuVG/
W/A4!i m+E^hE@MGSNALVZIHJ!QL*kuGnFaa>lY=uyjjQe*!iA&lpycL&Qm?BJ&Y?MiLIyWT&/u+%9\!WaM991i
*m:<<Z KGP8^n4bFCMG*+KQp6^P\NP*M&L\likaie>X?Iy+i!MG*#R?I8>blY?u9=KL1eJi\du!u46S61ASk&?6
J4IIEA 8Z$c<B*tD4taYeSZi%uGHI19W*e$:nuj=QduQ\uDh\VF+G9S$VLtWu\y84MS<:^Sw*Xh?Nb:1lH#kXuT
kS@?uR Bu#N9E58bnbc:tEb5\Vj>^1GaK>:+MqD^1V\yj4$ZM#i#=p!?p@+yNH>WdCZt8Z>lwD:q!iZ&:#WLP?4
/FAXJ@ %:*W+Q9aLhXLnZKpdVhF1n:5>iHDGjWcH%MQ@&C1Zwb*YJuNyyyt#5R815dM+EBnJJtatWwu?\an&e#M
pI:kC< XZ&4b<=1uDY#L^uJ#A!uanNXjZ$PRjXSFXRjXV%CBhWnCk@t%NpwK1kVeqSR\X9aY6PW=qSBcW+XXQlW
tHTNwj tqP8E^*Ke/yL&Tj*M9dVjSn:?n/e@Zq@k*9aEi#V?$n?jSTuQ=4>iC>uZ>%lZ6H5=Y8E$@j^hRZ::8:u
N4=P6i =$V%1>LtK1n\SRW?J<&u*pqX5EmF1K59=dJ\Y>&:#aMQ@p9:/!X:C6@hb+16B+&XbDFlTpHQLySi*!9m
:n$MiZ T/&PL^j5*caCjHV9N9k$5kkjN$?DJy?nhS@>8uidT9CBh=5KqE9*YFkmQ&+iC=*=$Z$IXCA@PS<CpW#t
C?@4RN Veuu1RcVV%I@X<DNl+D&?61k#8j$K/+R\9CTW:^eLl:iuPW!99C8CJ?I&K$mjFKX+yP1TLukJciMhnj+
$6QR&? 4BTyXBu=5ZnJ\cjb^jnpiiS#LSi<=FTEV&SqPjY<Z6m?PC?jV%1EM$ZKBb<Q8R=j6N*lcdBIQ\Wn*R5*
Vpp+:W hhV<ju1D*p>%4#RRwDL%l8:LwkJ<hK<$cQkm>iQtIhBbQ:yZtk4\RhC@!C?nZNl<Xq@KwS^d*IjP1+#F
u/5*tI Lb@QEC&8+hiuVI6dtI>8ee59q:TW=jQ=Rm!q^Z6TYbc!JB?Qq4Ipu%Tq?KR1W1:Q&%IY!M@RLcZJ1D^L
hK:4BP Ya1QS$6bwF^D6yTq?FVMWw1X^jwy?+EdeLiW5y@1j8Ac$$Z#+?aH#ytjL:uFLcmjl&l^C@KytMW6=ab1
Ja^XXZ NG9iYK<Zmdj+6mqL<=dp+%H#q8TV1lTjXEZK=XXnF8BVQ%RNXaDQpDXWKV:WCW6wePp>mlkX4S>+n!4C
CwVTAH ^<%:%GjXe*R?<B:qdeSt%JB4j8A>1pm=*L^HPjuWqnyKcI\?h4=?y^>44/<y@DdpXuLL&=A^h1+AH>$#
httLQa yHVJX=BQ:tTSanbHH@NYID@/tLeCjHJn*tJ<QI>=hR?VV<#V?W!eJXb8?85<:YH/9e*:u+m6%8kuW9+L
Ftyc@V W>j%G<FuwlDVH/d+qHdSR:N>=&@+^PCni=leW%a><%knqm4TZll4FH/dqu^$D=Q+ZK:Mh6jHCBXwL*&M
BA&wwi WAE?ip?YHmdLKyjPB%<Vqqp@I#6dml+6J5c*hC#yFuB>?QAVW9h5<+<LnhmJq@>*\bKVlPqQIktdb*$L
p$=9*W L5LHhd:a+HNhui$68E\?e4++E5<W+iPeL$a6Pju\&Ke+H<h<XtE?bEp4\wjGQlZlE<<W#W>L5AY!HG^J
PNZiG> JqK^8C=EXn:44YPwm8TH^qCX+ANQutZI5<tH^klq<Kp*^*TbFbZIn@W6&L%?dQP<Bi9H?lbeFl<ca=dS
JG1^y= Z1=n#HL+bDPm*HyY=#+Y=1QPjT^iQ?4eS*Z8a#u645=>*F\$uV4*Wb*:YD+jhi=nee6WZu8ye^@X8a?d
N!Jba$ m<XX=#=8Lybduj6a91S/Ci4e^:L=1HMj%dtQ=jJS=#/1e^@LGw8XGAPwe^?>n5ZW8a>=Rb*:YDmwe^@X
YHwFj= 8a@1*Me!?cl#H!5^bqHuQyb/l@5<#*$eye=>XAFBuj8wky5<CHZ8w\y&ijC4e^>XeD5HXJ*:1PTBL6Z1
&!i66j *EeXTy<D15=>HKd!MEKh?/mC:S^Rhi/npkhlP@hS?WJV96AK=Ej=RqP?$JR9NPWLdcl/R@qCK%\8=R6N
p?Ld1q ?WJV96CWL#VqC$*=RqP?$JR96IywZ8WLVjqCW::RbFC?$E4pS@qCW::RqC<$I%d=RqP?$JR9NPWLVjqC
VlyQhC 5>!kjKEXC<wZY9q<qC?$+pH=Rm9P^#IKLc6e^mm$#QyS96DK=1N<wTqjcPZ#Wd:Rm8XH?WJV96A?JS@q
-A5Q@q 00083089a4f001202b3 Page 361 of binaries1.zip
yIW/JK C&%#5h#KF%4=p8wqKF>wbjNS96CWL:S!?TljcMwZYqqn5SJnAPWL#i6aVQqC!\9KF%4lwH!lKX>w!lhc
lF^\5k tZ!WL:SKnFtWL:ST:*Cj9T<$Vcmkkk1q\>ac>=Y1Dhn5tMlpHjd#4PhwCA8/a*m&*Ra+CTL/kJ*8Q=:?
GBamWu VTh/#E:jdS1eSEn?@9hN?6#V+F^G<4jTy@+9uJSJ@qb/%hZ$4!GXJm6V6*C1&hj>@/B@\WR&E:j*@?W$
tB:%A8 bKtcu5mtHQVAL^Gb!McVh44@J#AiqD:tTQ<V+:t%=%<p>J&lin/*5n#Zb/a@hwdq8Sd/nl55#:ZR@dhd
#qaKiM ut8l?$:E\?X#u/!GktV/KjS9pc!H^C&E#&V/W@S9l1S9m#$+i#L>L*kZpjVGc\tj^e@F5@cW>MNiJu\&
5ey5ut $&ed@G6Qi=*\9TT>i+KSu:yXh^HPP4l:Y=P?\$LC>&Z/>lAmTh?9GR*P>P9w*</THn?M<Q&an9!Qq<@>
M?6d=l M#^J5BPJd8VlApt@BH8t>thdtDL#ie69CV?A/Zide6KE8n/RVeN$5:#h5H#hVF>t<4u9i&DA>K9MeuWB
G6!MJ1 Z<4$c$#/@Eq+KYj/#+#!%n+AGV8M/*>95:!H#<C\u8uL#QJ?:&VC9<En<Tcn9HZdnCZ<CKa@bid#j/<k
J5u&5# @Ent5<1W#!6SX$hJ?pH:WQ@1TGV:Hj%4L?1Q96$V1W#MVy>G@W/dF?4IbEZh\j>BBB+<?B<&?:W%@e=w
EmpjeR @%NJdnQ&@nJZ5>B>V4ZD@cLKlb/^$\NVLQ*LRy@/kcY@8QDS?=iXD?SmY=c4n\uu&bE&19MA!<Q%w+t\
8>nj#$ S6Ld1W>Xe*?bk:baK?pZp#:e@nlJ9=Z1X1!V>J&&wiLZTQyPN$AB<HMQlc/R>HZRqj!C=WeiSpu//E5J
mAWKSA @!cuS=w^LG@w+<hL?1/QE9>1Tb@<HlFPaH$IQZTALNet>K<Vte@^Jy@=h^J?p1V9R@K89T#ya$j#\BVy
jlEapm ##L%\#Ea\b<5/V6AZ<&Y>C4W?Tue9=/tb+epjitLSQkY!>555%@E6+aMMB@e&!9#ie>NlJ@G?lB4duNq
AP%W5F ?lN8Jj^$#5@F>G?$yDhA#=@B=X%8>89%1Q5#tb+%/:MN6G@#iQFi?9i\jP+#Q$Dj=HE4qW@nh6pijjS5
Kbwb\w Th>*D@y*Hi6Q/Qb#PJ<wZ/PpZ*pi+ij!Y#:yN^@Z&$/*EiE<Tj@\jq$?M>tWZR=*968RR^H@mQAjT@wh
&j9J+y HcRG4yD$D*eu\8YT98I:ll^1M@=IlC5p@YP1</c+VL@w:$T+W6KQtGHIwZmDbEbe^e@h*yBDeS>$:hXM
$WuKFP *&nWt@nhI5J@\9VZDjpSn:aV@qNJQ*KYIajmYhC8ajue#=BD<S4/=LZeV@e!?dT@nd1X>GPtGuKwda5!
iC1HG< Ze@yt\$=FI8\VQw#Tj@1caaemmMkG#?Z>CeDll!KR@/hCDi\QF^t!KE+F#L:C?c#\bBDEWIj9XHT9*/y
5adw#W Iahmj>n*t#k@uaaem66jIQ^tqyQuDVuW>5Ad=m%ed&c@Fm@AB6+1/Wj6c<ml8Bh&<#bJn@@RpEN^A*VT
84J+iP :b#?:+aecq?BHd>D$w??&yBDeh>@EZ+u#?=5M8SR*A^>6aH4+WSV*1K9E9=Lccct6S4!yp$Gu:6p?lP:
t<kj$\ VHudE*4:dyq?9*hMiV5ha+Nj!jVSM$%=i^u6i\@Z\%>MiY6Gu8@q?n#e4J<@aH44Q1d*tZI!mL#@t/RQ
q!\lut >B9!y9p\Q4tj$/hNij5H=6piaQ1NBl>6H:VSk=K?hy\ld?Ia!M>DuQ+iW>:/+WQ:abduRXQi%m+l@NiT
tB>49! j8ySy4^hk*y+lP9=CFQiqpNuQM46>c\yd:hBJ#$t/VNiM?SNc@kN+a>#jl+#=i$V!P$VVLjI&=/\dW>!
RuK:Rj Q1<%/qP4R^><T6KVCa8<\jd>S6K@jcMyd&@kYW>Lit1YIY@mu=D>**K@iNcW6@*Sh5>I?1Mjt@L&e>Vb
ttWyQy 5=I?YE9</*Z/?CV/:*PT@kLbKd<e=+#@Dh4ph=L?VI?Sj5LbP^Blw/T@NMNIQ?FH/IQQT@1#jYd/+$B:
S*JidK RhKj!=4yW>AN9?j^Et#Rn4J?H5Fa?EY8j>TH=KPhnjR9<enlNtQeyh&A5hZLp4=t5nH8$1bm#QaK9%@5
q86Gyy bjL9ki%/qh9qFyQ@c$n#t1R@@niV@&VI%i6e@!?b@B8ka>/R>Fiy:Z\nbD&Ql@=@W>Jjd<WaZhJuRXdj
/TaqS^ +9:Tb8SHuQJu\9@AhutTpS@^JtV#dT=Z%NRQ6&A5<A:VV<4q</SN@@hh\9<w/W?ebiSVnIAe9m9y::Yc
y>wLnA ?X!Q9L<u>Wa&bPc#D:1h^+=QdDTji!:bPQGByL?%^8S#:ukaWpq@?$TV#!5aD*\p/i9?b8EDjjI^/&jw
5Db1^X #LyEPP=+d*$ZhZ6lIq#?LwnKlj<HWE5DBBRAAkAIAIJXdTZq>$5qhkIAAIAFAAA#AAAAa&^ybY=$e!>\
VFktp< b*A9dYFnL%BHWG%qduW9WtX#d*X!a&X#L$NRS%B6bY=%LuB\d&I8atq89bVQm^J^FMDjh%#TdhjNIGmL
j%$ARC BTXm&WnEH^Al\c#P/mL4/mSCBF%$uNR!b*C?&6SFF#y/cm<hP6clR$RhPu6c&D?lV6+1/SC^B\?!>tce
1SwA&R YWh^mC/>L&??9>::9Qh>Z:+Ddw:j=b?I>YbAq1Wm@LM$qIc\j+<Lp:u%yi/H=?<@j&RjEB9Hk+Qq4%19
n\SaKF :V8?AVCw<NdqDVy:AM/i>^e:dI@cw@Gy&dRb8*I4GA=GIwF<ay?QyVL=SCcY+SLm\/w1T*XF+SmIy#I^
>V^#!J F5W8+W?*ieFMERNlA>l^>6hjBd9CWV4eDS$i@$/>#B+ih$Qy5HAWY4&!:8\:?>+lP&1j6p@HF6Ht:Mk:
/PHG9Q hQbNnnWR/VDd#Ddy&CXCPw/iA@9#\GAFj1APeHabq1%G+@G=ZdE86kyaIDe\JWt8bb6$S!w?K8H8udLe
hW@\dd i11#V5kY&FTcuKD/LR8imSdF5tJ\:6J!WhX6j^KGtJ\qR$E:/!K\wjQ!BtdkKWYw6ZV:AaE#?Jt#Aje5
y>@pjd l8HileuI<b%awHG1$yc??AXG6qCdnDFYb!dF%S#Q^bB&E$qE4JeWW+*>1N^WK9wq<ZDJnEbiw*1t$S\9
YlY^bt bpLJiGQbQYIY\TAMRJ$T\GWqeJL<dJ=\WX9$=TWjX/9KScuRKIGSYkA6*wGJn:SpKt=\PXGlWpQpyRdq
LAi*A> yJ4WWGKWFwRKQt?KS6wlC%Tw\B/&tjN9Xi8$=VG<p/m/6=+E+Zun6/Aq9ek?ZlAi&>qQp=%>=p\9+Wyi
Q>XFDX ^>EG%MFl8F#LXW6y:AN=qY1\KJi@#&Pj>G@1\B9c^:>y8hpP4PF*djI@kc6In&yDN+h9SMbuWm*WyQLK
k#SEEy bPKnwp4@X1L@Lu<AWE5DBBRAAkAIAINXdTZdFedm#R<AAAA$AAA#AAAAa&^ybY=$e!>\b*A9dYFnL%BH
65Tu%^ WG%qduW9WtX#d*X!a&X#L$NRS%B6bY=%LuJ#etM8atq8:X6>dF9Zhd<p>WHLppubZ1aXtjWmK$q48dRe
t1:*+L ^wu6!bBpptGWJ4Rt&a::V&iGjJTIW1VCS%p!EESW9NVG>wi#Al8cFY$#BF6ZAW9Z@qWM^eKPRYFu>K\k
D5eKJA RMblec^6RJEG5jMeRnVqWL\:=>::9mnKV6y$/FAj+4::j9h<*Q9PQi@e?=/iTIh9NDk/JThuQGpqHTGj
i^96>/ tedG^*#?%M#EjZZ6*4*@<M+*99@n\NIZN%BeYDn+M6a&KQ*nlP!Bau>Q+^=Ww9IyJVu^WHl/PyEhct@H
cA9$j^ SmWi&@^I@$Q>D*5>S\NQnR/QlI+GR5MlZ$CP^iitW$qF<huJ+bHR<CDRSkQ?<j:SmDbE*=HR/$?J>p&9
H^\Q/A ?*E$YVkp+:EMID5lj@mE^maD6q@aa/&H&>>%i+blVQJ+cmabHWqP#&RI&iIcH9hJDEmncVttTHQPctly
H!DphG V%99+>IA/Q:V>*hI#qlL@*/:hQLE#5jJh8>#bA6y?hpVIYC&nwSGn9I?:5Y=\FGM?EI:5eH^@tNnkej+
ctRh!8 GS\i&jiD9RePQIy>bDKuyYA1FaZ#?Kq\=QS8/D:mpicHE\pyHb?a#ClTYqdp>Cp=/mF+KZjyh=!c:44k
>9^DXu L6&q*&*1@^X$V9+jnC9*@>?%649ShVi?jyPEi&DdLmDm/BmC<#jF#q$KS/PKFJdaiTaqbTbq/dF+Mm1u
VLiF!e +VTepeKJSGyYpW/uGFhPS6Kuy#QlbFST+lNJTbEVemRnS/XaQCGDGYmQySKk4HmpEXSYW9Wh/C1+Pa>H
+Vl\!> \yp+:L%9$=iph=cS=#LTdD\#GW?!aW/uW^Qy<JVHFDt\VduCTL?l6M&4R=PknPDMVY\hkZR/qV+w*c>$
hme^Mt hN!9kNBjw$nY#TRq?Gu$8Cnak$*dDDuG/4bHtwaF&TnNPmnN6XK/:KJW:cc$Mplyhb:TG9$eCi&lZdTQ
!enX$u @YB@&C?Bm>ZHWIM^XPjX:k<uKwN9BK9#d\S4%B?p6Wbq1LY:SqyEcS15EaJqZlVKm+&X==5e6WF:/:1?
l:X?:t 5X>CHu+CH%SAuH9il5hCkhn^?QLLBASnMeBNmGI^$k^6BPwYL^DW4VCdktaFChm1iBp>Pm4an\4?nGB4
<b@I*p <4PnPu8:L5Db9dwA5y<N>n+d=AKMuR:&ywNekGpd?Dm!6>jl*q<dH>=?Z*A&</CG:?9y/RuPDkeF:pH!
DVwAIN b:bdeP@l*qp#Bwp/HLVmZl$j=unYm9$/V8915<hd+bDS%YhPp1iFAleuyBpF@H/@aBMtIPk+?4>bl#M<
8DkWaQ c#>6aaQA#DFPYqI@H8Mp:4jF#@@8yL<FqJ&9L#q/dy+Muu8ihJ>:n4m!e/TXqYum!D=:Je>1j8+##9?h
lBPj@c %YhX+qm+eV&@wJJYWX\L!/V:jJdML$Bj=5L#+L+\94<\*=*544RZkAA:^F*b>DIR+GceD:ld>d9V#+k+
GKV?^u iY\SF*j=8V4CN!P@d<VDZLc#5*P@\V=@S:^6L<M9R9#FGFaS9\mVcQhQ/umMaIAi%@CLpl$HFbkEi\V\
W&5$HC C+RH@Aqlj>VPS*%eaEukkId*WQ\b8KiP*>NIj5>upkj#DG@#Y9qheLWYidk<pQ<ajkaYN@SnX8\@\jGL
&S\M\k HQi!/\j#a:%54kLwu$=\u4ndayQulL:F@:jFC%/9Bb?9m&t+@::=?h?6:A&dA:bn4e8<8FSi8m8<DFb=
<%R1Q@ $XeyT4V%V%5D6dXaY+?%NXqdq:Y%8hH/4QiQyiWpL?*>9HS%EjIH*!LEY?Aq<uNi<uqYdGh?q5ZmePS!
i@FKQ> YFwe8bM668#Jhq8&H#bu@X%w\bd6/ujp&4Ge6GXbD>md64+V<5mjklhc4G5y:uLEZi4k$$Gc?M!TbuF*
SkQYVT 8m^:RjTatbkJE=Y5:#>hN/\K44$PC/d84SaDJZjuwEZh%4qHNc9dP4iyb9ZPV4PBpu9j8MpA1Q@Jm5pA
Dc#L4p 1FN1MkD1kA$DJab%A>k:a5$A>w=aM+C>I>aMqARYBqC>E@4ZDKB/=&CyW#PA/y&@><ihtkFWF#Tw1R6C
^tII<$ A$!h/#MDVJ**^\!WVBkMCHW8D\c+8pddXNynIW4>F1I8c@m18B%&%h&uiBt\aX:mV\p1WTF$S$iQ5S%V
KZh%N9 i\E\BPC^=tcGC\ZPl!ZkyM+9ZQtA&*46C8jnET+XF^ANA$jHXVkYe8$cy1:&\m6Z4tl<XRY<ZCnpPKa8
aDNa>M AukJ^6DG?beS\@yD6nBeaDlZ!PW8tVBZySd<=8Jm%aLXNk8t%=pC\*k%%jbLH&pa4?i%/!c<yPH1bS!9
nq:^68 iw$RLp<9W!HQh:q\QTyi=baq$qHq%>@P<H5/F9/!aQaMa&D8Z\Md6B=Z/*D>jDiKkXK@KRdk=m==VVHk
k\PyuW Sh!9^$Ai5P4%/nHkSb#*HlR^<Lb*AMiE4T\G9F+&^4!*u<XA*n9Aa\DcMRck+nGR>^/CGEC&mAE+!:tR
-AVp!c 000202007fe001202b3 Page 362 of binaries1.zip
ALFI5m LYLkdSmVA>pmB5AmaY\6B4^iy1*QcS+&KJaa<HwQYtIA5DpGWN+eA%=9!V6ktuQYu+HSS/>/nSkAq+Cj
SPmZSX Dtp^kMMnaEPLAYBDDLAL\BlAN5aA9*:NZ/Tn^Q$DX!JmkQ5QnmIGpENK+pIL:CwRG#Pid+DZ^$DVddi?
9SJdSm LLPJBD4Q!b#k!=V^!?YXFWIY<di+KFk4K!9qepZ\pR$<J1DyAq9uM+GQPDZR:/85LqVZ#PNc1!/5X9wM
DJd#ME QyKi?GtFp</9qJEwYX&F^n:kq\WJQt<AP*$\pQI/QtXDLK?BQq1\<9HH?hYX9n/$aPE#N8i94wB%8NCX
^P?>Nc NdP?:wI!61LAT4Y9dJDB:$PQka*!c4pl*/Ac$G*+c$lCwK<SH:aZG4?Bj1%Y@eVw\iB4e%PDIXbYQ%uQ
8&E%&W F>P#X9&p&yl@!+bp+qhkKmuX?XWtaLIQ#A4X=ke&Ra^1kw#=+eNujG:CT!&hp:KJZ%*QL^6<Vw*=N1>P
DQKaDF Djqt&un!:nT=/@uq!wbE:@Bw1&?$:=RDm5YNepCSeu/^eR+w/9^mw^^RFH#CBiy#RFHu>?FyjR:ANn$H
<\\9FB cLJGD5AYW\=kZbl!AGPde\A&GDtA5!$=AJ8$HCDa%l#ADLAewLH4ekD#E?RAuX&ZA+ye\GDZ=\DG5dK6
S%NNFB aXLp6HEPaP#d=ADP*#AHCQ5d=RA&C>#^Di>^Hkh5+l4^wb*qAIN9!RFF\c?^tXmZA#R&=AD8A&5PEG!i
yPW?wt A$##J*IAm\<nB%ntZ:A6PeATQ*^P4DuAHH>e8C+HGQFdN/Nq$%^w@Iab\MS9tAC$i?KPPiD8*%^?p*@V
*%IQ#Z k&h&NX5n#8^4WN/BA8huce&b#R/^<k1Wyi^R&$9bwR+*GhwE^iaGSVebkQI<qBkWcuQVM#b*6tS#9%Lc
l1GCNN >NI@u8qa!6K&X::lhGdQR5tKRm9PLCF/\d/^WH/ndFm8Wu44i*DT@TpL!1LPui#P5?hN:wQqG8qTZ!Q:
e$Zi$Y K??R8b@YTAX59H<?/:6\Nl5<>&48mQP6=c?%9dV<ZIh:it/Vi$/%8R<6&>#hXb9dXaQ!C#lHH@!Q#j$V
HkYiwt <IEKQqA@/Zl4tdc>?9Mh#4NuZe:#Yhi=:&a*Z@kyZZ&@RpkFPy:D<69lA#JEc?j64*><:wWLb!/eGXwa
ttbE%c 8nF$+<ldldj@6jVuQij@P&8uNj*H*9Q\H>>W<S?*edtFj9C6d%=+>a&<j<F*\*jn!F<W*4=e?9bDQ@\k
+bC5:S %@KydGT%>\BXe8\aQM&4%jeAZaP/5FdA^*JcYH8*!y/eQ$SM<Su<R*ni\jw!=VXqNbm>mp$%AnW$1hjk
LGlE19 AE?w/uX+nAX::HFXFe?m19H?\SlD1S@HpFi4?PS+dWC6=tEMiS#DwZi4A&n#*WKJnTE@MMDH+Q$lNhiq
/6<:RY \RE&llIy5VF+4=WGaR^=GEMJ?l:AMR!wJj+WbB1D4V+6\q=1Bje9m&^9km6HbXZ5PhbYK\#DEb+<1Nlh
k6F!\6 aSKu5CFkY@+KV?yX&J>1GA!!jZ%X&$JTda9N%mah%$!aVXX%6ec*nHCA%allab@CAqYDiYTa:V84Xdan
Quy?bG 4ZB#?8yT$e$dV!94Wu<DH^SNQmkm%9bhc!6F=kNw=V+wqwWQm5\HSh$H1$Z\RhHpA<BFm\>\m&H&kSXV
m!^:6@ *ETWVV+w+yy9?AD&H:hkmhh<WBR?+PPBunRj5QGcX<=mI^?Rwhdey8X6/4*V?B85DDZNN^qq1Gt\$yy#
QuV=YA LZi4*bWhe#9tBm9#%jtc?ae9tktpYyhaVNXLX@lLD:y&Fi84X/=iZeJ/!YY8SSm/CL/D8Eye%#>aLF#/
X6RIJ! cMtXA+n%uVB:L\CG?N\a*+/aX*Y&>:l=/>a6a&h<<!c\nRbIZ4Cq^cPB6YMD*PDqAQ4%=5*KK68I\MMd
9Yy9/? :C^9XtD*^9Vkb4kJyPNjke>*MkK9G5SGbBwQG/DnK/V#:+<q\<<pbQ^&IBGiTWatyhHk/Njq$+yHPnwy
K6lkNN y&XyKu^cT1a!$nP!JChVM^PV$yR<qW1jq5Ku\9EE/8/Y+lt#YD!ybMKJlB#hLcZT:MME^yVq1KpZWItq
?m4^4m W%PYV!hT:AQcDG8L!54ZM/qyKS4PlJ<JK:KuiV\?pd#wDQAQHC//^Iu$kMRaL4@M<J:nenwiP**Smc*T
BGXYJd 5HJ^5!aI=%86T1#J1whNZ#&K@WP@eCXTPCMq=LCTpXJJYXLpCH==IcXmMMc+Ay=RqQAECKhplX*>XDkD
HENJ$E %=dS>NpHG4NllZ&KIWe>Q5Qby*l*!Alub5DQ1W@Zq/hu%/=h$8FAeCTEM!YNn\SDAd@$XGB<jDkapIDb
FX<Wuj $hHV$aFCkbB@R=HhXm8BpG@51/NHA@+>DaY6>t+9@Jjw9XkK9$1JJ!epDCXyFkMyly>9T?I#FM%#ECDS
5hYTbZ tVRKGy=k4lEj8ZmpWZTJLL/AAh$WAPbZDK#b8DKJ*w^QVcjTGVAP=>APS8XaiCcS\i:S8mjeKM\#1XVm
!uJ1MT M<W=nHcDWQh$+BP@::L^%!H/9iau\pw11We5?&M>m%Z&N=G/?GX6hVHMNJ/PV<95#QbqQD4F:etcNtpZ
1AD9GY eXH4%<=T#bnVN^qPS%Ll^K@#=SN@*YF<^N^FwmS1i<q?AyMu#=?:H+CHwdd/j!t\Q*!nN:Rj9//*@#Qb
:#eJYQ Qu=$dCeILI49/9<qHyucTi#p*/B?GP1Qwh=Q:Lb:+yEEaN6B1BF@nZ&Sd:i>EI<wYQ<h%Ml@E&4pZ#<e
?5uJqq <n<J9Y*qZ@Ddh@miXDJR:@L=StA>6n<TnYTikjy\JB=JE45>>FRkBH5ui>w@elV%u9e@GV\B>b@=u#\T
E*d54V lQ19H8!pXCKd@\m9/$E*u9h6+9<HaK\R956+*nKq@*<AeX=m=:<pY\nyGVdJ@I&R5eM$&aRMQKd$#Bk!
S&il*F 4e%CBu!<TSa!Y$HtQ\\bIk8bFwue5%jIPCZT6e?R5eiFVJ6E9uBA!LSLbMelW%<Z6Y8S!M:9eBp<:>ZG
Y8Ilu% 8X$m>@?6$L$H#u>y/H:ypJDyp5kDZ^a!Z+D#H=qpFwVM9SJ=eJ?R&TGSL^+\bHa%t@!=&jSu%D/n9i%L
$dEbq8 4DuL#k@\GMQ##c&cQM#SETI?EyQIqt6c*E6p/:iN9n\uNF&JiQ:V5PQ=L/N>#/QM#F8*@**PH:j?L%BL
uIw4#! A\RWAAIACACDXY$qLM8lw%1WAAAAeReAJ\AAAGN5cYX8hHM9eGh\L&%la!>RS%B6bY=%L%BHWG%qduW8
:C*P:j eHJ1LtJyd8$>CaAW%dHhQdMHLLDL4cK+*pb$<R/mmeC!\PI8nLAItpRhbpea&GPetWZAC&?<<hbwEp*!
:@T/EW e&umjh<c:!9ih?Ihw<dd1DEJ9?1>tu+>M*&<aWbe&HychM*4&848%@Zi1%i9161wmW!NhMc:il1T1WZG
<WQ8SJ GyVY%pm1eY=#p/t11yKL<ZDqS%?>hW%4#iWij*nMMci?cBm^:8+P?BE!DHNdw&4<b$dXZ1MMa>iIaXkN
$cY!@i y1YaNuc*^?hGW/qEh/w?p8yiFI>qnD=XR8Lj@1@?%nD#@nP5$RD%l4HZF+a^\SC@Z?/<wjPGq#9l<QIN
d>!eu^ lB6Y+DW1kFuI<TLDlqu!jX6\=@*L$kKt+KbBBQ<<HJwW&n6<Ij+a>IAS88V<kte#nMMBVnRF8ck@Au>d
X&+DNj <mKjCW=jG=@:6D8RXWRd8u9<BHGCdEd=D^*utK9Mj6dl^n4h#9u6Ti&?S?kH%pjl5+QdQTSF?p6/ek8P
bu8=P! &@yK9?X:9kLc$P><JXD+uc<Cmt%>Y>e5/d!R4dAWk!?##bY>hRqGGCyN$^RuVaMF#+6KNJNlN=b5E^T<
F1H:#8 Q+ZQeRmiaZSB@eb?A?4S1^Ey?Fj\#d&uM4X*yiiABXiS4%&Kkh@4:=W94W\NbJl6AAed^9AHDYMD?Z5#
lY!$/B I*JEhik*M%aa>WhWY:>bbS4XSyWyZ4\e9V%ij?<iW!yMw\#9eb$9A/kSB4SGa>Qm$jb+K6&\$H6t#!ul
wL\>&/ @Q=eP#&/JN4aEW&u+?tGShFW@l<e$B!yd=%:RIV+YZq@dlc?pq$AyqdKuu8lIbWD1/kHHA+\\nG+wXB9
YcN<ka B4Al\CaAt\N5BABc4>EA5CZAXkBDAeaCdAP\A<D&AB9VR*?Qyw!hAHctaYWLkGEAI\F1AEAuNEAuNDaF
knX6#n GAPApnkaaG8AIWI/DilHl4GniAtGMSC:DpA6RB%AQ^^>ALan*hMNTmt:a56Y!S5=#&e\6tt4=R&jB*hy
KR?a// b8eB8MW=pYba85RQTT#%WRnF8Fqy$6?b&ZEn?:b*R@:>=EQ@XL+de^j=lPc8wyWMe#jSawc=8*#@=9jq
&Qc@+C yG&Pw:9bR\:8=un/9TjS:!Xc$nB@IF4bMH<w^hdet++VmH+mHciL6&Ca?>B%J6G^pi=uM6E%Ej<yhH>V
tlLNuV /Z/tEZ$#$5E6tRAnAEaCdAl\AEAMIA:RBhANpAR+FCAFpAdIAQRALAE+DGAy\DKA=RCHA^\BeCVAWRBH
?ji8SM A/\APAdkYIDnAI+HPAHkSICVAFaCuA^\C5CyAKeBuA=\B5DbAPeAuA6\H5D=ABhkd\MaB#CJ=LN?kERG
iK8AGN EhRA>AjwB%ANWApRBkkBYADtAJSyd:t1NA9GFVNZ9emha<Jt6nn@yy@G#BhR>wa!MSJyAc+4=1$wjWSF
948:D$ j9aQq^pY4%QtRS!cw%>4QLWkZn>#VX9CdkX5*@Dpq1u#aw5V:dnTu#5:$kn9\uTjA@VLRRiqM%H^V?1:
q*<=Vy MS%+ThaAWniHScbGDpq$\SSI>ymCRT%@*M1V!6^BL:i8?Nq^pQNe+DB4&MP5qV@BR><hJCiZ88#9YnuS
NMRH>\ &L@4=KR#bC%IWmn:EuLc%X=IFCB+&\ADARaA%AD$B/kG1ATwAAkDlAdlE^YuIPRy5XqVlCqu>/B^^Vq8
ZSJQl4 WJ<GHZ9iZh??HD6GtB#=k\pyBtACnAAaCdAl\AEA:RChAF$A*RBJkEMBWkBykA^AD<ATkMMAqkI5A%kP
X>=FFq eDnAERBHAl\FeDVACwBnAI+FPA:kiIAVAE+EPAqkJeDJAKeAuAy\G5DyAGeA4AI+C?B5kHMA#pWNBGAe
#6FSTt \CTAKVVctPbBB!Y/EyqE6CP^QF=pI*XGE%*!u#W4GSkF=D@^NS%6%Dyb!$RS6N#^Z<:+VdV8cyh#jHLS
8y!C6I ^AN:1Q1@!G:u8@A*5%e^e$hVL*Wly\?DJtaCnAAaCdAl\DmATRD#AKIAMaAPkE/ALwB8kCVAwRAykDSA
GE458q B1AHaAuAaRBLAbaBLAe+HPAIkCMBnkI+GtAF\DEA^\IeB*A<\ApAJ\KeBLAT+GTAW\BPBVkN+A!AM\FY
LZa<hL Ab\FeDdAPRDuClXdNZJPw?dPNnq6qJ*EN5!b^CdH=@e5!J5*Cmi^Nb1iT4kk#n\AA\EGANRA>AiwB1kE
kK#Qe# 1AAIA+S1Bcp<XQNT*dY51bdk%5p6N#6XEV$dGVaT#?XmcadLMq!T+ZIM?lweehH%D+D*AMeF$@5AH\ld
N@8\5E wX#/ZR^\CeDQAH+P<A8AT\E8A<CS?CeAK\FPBnkLAE*h9\V+FeD4AG<A9Au\F5DdAP<A@B*kZaAikCWA
4lj@yq T$pe$dmAt%<ZAb\CeC4A\Vm#m&WtLl%^&TmZ/dC<N!Nm?TmZ>t&$#P>Q!@^?$uSk#mL#\bPA:\9Hy?A+
9J5Bej G+=QA#\D<C!bAJ+DiJ=ME@qL@<FpIllKJkW$WdRCwHu6L&TTGE=tnCw!T&^CJwd9!jqj1HWdpQpA#Sk@
@inNNL INMEL1%*JyQE>tIbnW64GA<BbwlqMa^=ANQE$qmcQyaBn9h!JeC9Aj+Q+EcA@\BeA*A%\G<A4ki/VRHk
S1JWIM Zp^<^95AnkL+Hj!Gi#Z^&6B&J4TZme@/S#nCQbu\:Cdi/=<A4kI+EPARM16eC@B:kP8AB6<BQ96NeMT&
ICeWSK SyQN4ZCE=#jSlHM:\G$A=<J9cEMV*<Mj!MTC#*\MGbS&JhQNN\CQp@pBq&n\#k%5n\cAueST*nC^:WCP
-A:\jn 0003720fe6c001202b3 Page 363 of binaries1.zip
uHi?T^ DbBnA?VaRDuiH/Ab+DR!:&SwnA8SCipkkNMBykQMA>kHaC=AFGAB\H\A6LE%AcBM+j&%CJMBtl<M+>@W
>u4X56 <hwBFyQJ/Z/A8\H8IhQVZ\&eJ&C=DuCBkea^\@nWEB6u^8eAq\M9pB$V=MReIXjn^y<BnkZ+MRDK/RMA
J<5e=Z D\I<BQA\\CMAn\IpAR+F\CpkDjAa\HEA?/GbB8A%chW\J8PtC5DjAF/kMYAt\I5A1\DPADkVAPZ@AIB:
>&TeGt AX+TG<&G<V<+wlu6C+B@Ac\YJljDBDp*kaiJ5wl6knIKMtmC9Jww!:l=<^Zk$P>M/H>tQ#uqC@M&tm1i
lcTh>Q AJkIhhl?H\F<DDm?q$<Ajk9\M5A4AK@TjDRFAQ9yn*C^L5\>PIcltRhNQGniMa!EMP?A:mDMSId^V+AQ
Qcu\$% Aa/WypN#X>yk?m@k&H?QB#kJ+AcAE\B\cZAu\B%\H99!#cn9GLm>cSm\ZDC^@%<BS?##6=AyE5aiA<ec
*D69i9 8BiniL?AeLD^q55cGVBT*/udk\q>*/\mn^E9In#hQKP=di*juYNlYwySJY?H5cDY<q:E+:#%Lc?$%w1J
jmKh@S yElq*E&d<%=t=VYbM4$PpH1DMHVn\H$&&ua4mGkXcTDT#p$1R#JdAVTZpSEFN%J4AiwABkMMASkKMA^k
Ecc:Bk BMBIkFEA$\FcAGaCSAD&BYkDtAh\AMAKkGMAVkJaCZA!\CpAy\KeBuA/\BpA1\DPAnkd+AKAC\F?AjBL
%PZ\kZ kF<BZAX\NeA%ANeCZAh\QeANADeC*AS\M<A6ALeC*Ab\P<AhAHeC*AX\N<A>AQeC*Ah\Q<ADAA<CQAV\
+h\<=j CMBnAI<DQAH\F+AuAb+GiAdkYaDuAX+AiBHkJaDZAh+EiA9kdaB*AQ+P<C:AQ\DiA*kj+APAD\E?A9ka
P@VEP% +BPAV\E?A@ke9YRA9kH+D<AtAKMBNkYwB>kMaA8ALRG&A6kcaD8A:RF&AGkA&AqkF+BhAZaHGAi\l!tt
I^+6j? W^QWQSQWQSQWP^PtV^NWeSNWdSNXPqDLVFC9VFDSVXDBVXR=eByD6R=WPSQWSSQWPSQWR^QWSBNWPSQX
PGYhnE PFRVaYw$RaW$WbY:VE:lam4QV86l1ecmSPL$KFVEpFR:WHZEcXcwiEPpcy1n/w!W/1SRN#iTc1JRET9p
jP\nwu >C9W!C&qimnW$e&p8w11JcwtRu&6q?wJ1l^C>em1IR%TJWTXVcmIP<6qBKwA1EcLbePt6M\+VC+%WH$Y
!aaHM4 1qTQZBaJXjMI1YJbIcp?YtGyVyl*p<y<6FRd#H6IdV&YXLDnTcW+pXTM:FLwFKt1tdDMMGGbaiG#\qLD
8I$h&q jE+6a*Dyk81>YJd6KhX:XGiE!wN1:=i$XQ8KXKCde>Wk<^cyBkt%tFSXwdK%pNw&k%T*CC*:RC$$WXWE
Wt\>lt NeiEybpJT#MVXEkVXGEV%GJ#j:qeMqH6A9ZRBBZM@LFeNyu@Jp<EWNFNYQKb1PdD55A<THwutKDtt/BP
bt5b>i t/BKt/mYkcy5\9LRlGYDCT1&Ci1%mY4dI4u<MtFJcMKT$IRqm\uLRlPYlTcMZTc<A^Qinaq6B$6BE=iw
^8pM%@ 1M:D8#LlHb1kjy8w%5H!%ETXFh/yCe5ME=iR8C#CbT/1hjBPVZmuJ4=DiH@t$YRXluhu\45#+h&b<P=M
GtCVc5 GDNNYI/c5B\%WiYFydCJT&F+j!a5Q$%aWym\hDDl@b4\Zp%RwW$amW$ajM$V=M^u4mSjFXn?t1BYt4AE
PwVk6# NtFkNuHbk?wpLA6MYBca5C\\aXqk\9LYlKY%CW64E=dYJm!6VXlct!A@Jm^BVXDhLYB5k6y898SadtiZ
aKbW!Z %bjRMn!:>Q8NZKbdqZKJdqXJ%h1<X!:%^HIN^+W@!&WI14c+%BQL8!6ymZe%LS&9qW5:ZP/d:\N<AQ^\
JCIw!$ LAAX&@!R%PFdcXq*P/uWN$6XY1nWh<qqy>XQLk86@uKbbN=HT/X:=dLH9J?Yw@j:LH5iw?Wknp8\hDBl
6GRQ!e /YDlYASLB@NV^@I>8*V@C!*4Z/Aq#$6!?aGdu:n56\dK=ad=kGQJAe5&<$FcM4&tadJAM\L/R5KT#5I^
cmF>Je EJbL=4>w?WHLG:G$ia?YJe+qIMmYXT9NK%chZG1bD>F!K:8MiymYIj?t=jB@=DIGq&hmTbdX8!^y1nH^
I%1cR9 iiBbLB^:+ZuM9#w<FY4I:JD%dHCcNWBY4CF!cYMNqcaY<^FcR6jJ=dL=KC$bDSeVTNcLa!TbNT4Ik&Mn
H%KH>/ =hqlDTQXJW\ttK*JXLI6iYh5Tb+d&=H=A?aCc:le<q5nyMbnQpcK#9dT9GR?VmctnepW$pDtqB$h*l>b
8I9u?I p<JtbE4aue\^/BW<pp\E>ZJbKycwndS$*y8Y4W&$DJ$1q*#YBuLJdG$wFT:#CYuTEKw6>8&@$LJ@HJpl
TFhJjW yyPJwaZMSDNwGS+l5<??6N\uE+c%Ebp^>mJ#&wFp5nmaq5E@JqQFjLup^cY:NW1c:/!NyduBjJJMD8*T
N<#Y*u jGa?Sic:NnLVHWKtnwX!?T!Y5I9J*La@/a=he5tNbkX4E#KS#M91qKJWG%uuaG8CXP6^k8LTl\5K\&ww
*$+CMB E&lLniYB=aHpAX$jImw1w&?Zah5$#y#e6E*>NyMu6p&ER/T=5Y&d96RAc&SEeViawGeMRC*AIICBAAMA
WyiJlQ ?kNWA%RBXAJW%KHi<1&dl&\#pcHlXyD4NYhd$MRCwnq4!<p8YG*L#l^c9hwXT<pWh%tFa*9Q>DMG:b>n
Rk*^q+ S$K4ny+h!bCLpYL9Dj=pR:%:5@L9#T41*pLF*%6I?>=CWkqT>?cpFQeGy@dL<51>N@buZ$9Y&VZheVih
I*mi!k Lt%4!AHZXnP/8?JG@i:n>1q9TZR6n1j+uZQyT&XmS$hjH?J+%eMF:Y:l8y#hXbkVmtSS:1*m+NkH6Yw4
kiB^<# W@F&d:Y9ayqmH/pT@:X<>pZhuQtLZpcAluBaQ>V<#IKuHY/w9i8^lk4lttIwn+$jP#R?>L*JS1!mQ%EX
A1XM!l +d<n$^mY8\^ykMYCl8l5WCpcl&9w<quD4CE*8+Sl%yAdRXqhSQm6%SKP+&5h+dkbNbl\NDwPIS\N?EMJ
/jy<DQ S<Q6MMLjyPe$=AcHMNwcbGkhTVk8X#akHMXqR<JS>>&I<G=D?5Ekny6dFEh5+adEJwVnl5Bw\q<ljS#^
kJ<<!h 4\^yeMWt^u9enHB5<<$JS!QyFwTnIZJL\6EHeC9C5b&*Jl\*M&n>HEInQT&=^G9:H8F+n>5SnkdYMaTn
<IR%PH :>Q&lKNj%R/Ew:G:kjA@pW\knpduHRqH\@=PE1@A>:k#+Zlj8^CPjpK:Ew:Z&w%\ZI45VnkcpL>QPG/+
#@BN8= nCMeDdh:EI/dD8P#9e1RStLE<X*6SVni:\<IS<Q%D\qHA#J%@W4e=J^APC=lJlKP9umVCMiNVq4CX8LG
jWW?9n !GVCejPmTiJX@cq9II:9b!4liM%ylGP9c!aene*VCejNWlwN1>CQ6IZ\/\%yJEeenhk#CMhuu$p+dwdI
jIh>!! *t^Ww?#9T#m?=%tE+#QNJl#:LA&l%V&$DEReq*D:Ea:9h!:l8Pp!n*CWyj%yQMe&Q+B\qN<jEV/B^kZE
j=mlyp $YD@E<K^uR<pHQ9tRaTnd?dBlPQ:nSKPt$d#chYBa$CMeJVNh5L^uXDER*@peRnlK\^y$Ej<WpMc>lHH
kV5XH8 ndpE+jki!Xi6Q@dB^SK9\dGEhLcc:Yulmnm?N+4Q1MH4hBN?wtF9A6Vky8PllPQtH+&?NR@V?Ik+?9VS
b8/i%q Y1<G^#*!nBykb6jukA@JL5$B*%!8#AYPjYIb+XQpAq*k?N=w/l1A#*eE+Zk<puDekD?KeN\MPby\HDhY
lwC\8V EI/dqeeRnl8R^^KP>*\e+ZnQ^$6<IM+JJ^CPa>iJlPN+e^LliM<4Cej*hVLlKI?uEI:9<%VC5V%PI@^$
y4cT#G tp5R^:cqDdiBN=LJAjFu!N1APG+8umZ^RRP#JkuA6<ycTkDHjup8+TmD=^GPdZ<?+ZmQF^CPG<kZEw+d
NaLKhh 6BeSny8mQ!WeN!k9quk6#k?ZEI:n$<<I^#:$e<L^Hj/CePS>KiEwM=eSny8%9!Re@W=@JjE/:PP@Jl#H
DLH*%X 6@<nHMiG*^CPe9yd\p?pPSl^@L9jE+=n&l<I^&il#E6%&Bi8pQlkuNQ?TDmP1Z<mHQ9$qaTnDF=FPD:*
i/*B1& %aVjbMlNe<S^:L1YeP#Z%$q<CM:#%^PPe>ENlPN+hmQl&G>8Il#d@tdCeV/>ljDZDLu^n6M</m!*Ea=n
VBD+h< +P&E+%l:B?Ha9?<p@C#TT^DH/>>NPLd@QaVnJ9T>bK4G?iZQlPPee^@lPC:iV#n&wReI^@j\IPG+aj5R
8!6AMX +hmQHmbXC@YPS\nH@9Iw+Vk&Q$a+nkiQE+=!>\Vl?H^@IS\*8J<pHDjHu=L+CNSBumae*?M#lPQ+@T#l
!h9!&e !Q<=\4Ghu!j<i5Q&q^/B@F+pHDj9Z=L+TB!9Zmae*?M4lPP<>!4lPE:@qZAeT@=GPM4Mc+VnP*theK^:
u!AuDh R?Id+Nn+J8GwR:%FPM+%d^PPe<+:lPMa<ujCeR^+q*CW$*<Rnt*=H8HwkQC?^DhE9i<D\qF*?CjlPC>>
/<dI^^ TQn^yLMmnu*8a<L^ZZ%CPNJ?K9GNeE:=nHDWh#+uHN9@C<K^@j>FPL:jL\qHYj/KeG!#4\qH^+h@T*\W
\T*P+# nt@jEI=/^H<I^:uw9+Vn?Qe@\4HjWL1EWT<4qZ@W%%tDL/m\w<mSA9Ejpq</+qGKm$H<PI1LRj!Z=GiQ
^Jl!Va ?J<y4kQ^6<nuHXZlpHTeE@lt$wFP+JNJ:$e<T9:@mB>N@8cIZ!wh/\S?N<XpIQ+T?dEn@4X$6MM!imV=
u@hVIj 1CP?P<YEIB/SDukC#$lHQIGjL^*!BH/VhM\V?HMW:+H+%>JSV=nVS%AeB?I:Wu\H+nPpA=@AP/YDu5BQ
VB=YKd p\=<A9<hPh+lj4h$+BQ+1:VtRj^L<4<*bMT#Tjy@@ddTIXDkVSR*k9mQKa+F<R#FumB?J5W\IQ+HmtNA
PY*$Fn @HcKWWD<Pip+KQAQyRMlq5&1yCPl\EhJl$KB:$G^JwnQwbkR^A?XnwaCQ=qmh^D@DeW9IZ+:^TAk@mVF
Xd\aqS <!D?D?tRmGX#T#4=CZ\W4j$R*$M//\t<#dA6T=8uKGaL<VPpE/HAj$<^WanjT@FRmL>B5WPIj$P^R:nE
1=W+T/ Gp+^E+n9LJ$NBV=VPlpK9F$/Gk4<cPq\KQCLKQ+C<i5wBkQ^l/WVw5Djp</IYLc5y9kb^LiY#wpCu!Ch
!YZi%q FAX?pHSYFQlT/dRw<DPp</LAj!ihGAX?L<X^Ij=ZYmed$yjYJQ%@1<&p5/LAJ$8HSwHHyePn\E?Rnw<C
?B1JY& @:X$kBV+k>ISW8D9TEhILF6ZTIhIkY<nHTMF*m\hIkWip$/SAn>PPpeK@JjTTXLk>$lHTaG@Kl$t5Y^n
nXL%V% TehJkY<qHTkFQp$/Wky<kZTwFQmy$4FT+L?ZDyaC@:N$6BV+t>LlE58&Iip<KjA6!KcA?EVyBCu\H$9H
C:4V4T TwE9q</ZAn>jPteK@G4yyCu\S/T#y5Djp$/da9phpp/dA6>EPt<KjL^$+lV+ZPt<KjAP/eAy<JPpI/jA
wyV6Dp L=MPuRK@VVy%C9\y/h\y<E?qp!iY:i4IQwJ+k*V/FQk$qiJn8\ZTCXVkK/R#1MDQq$/lA4>KPweK@BHy
w4&+X5 /Cu\h/RnKJa^@cVDy5C@J=%ABh+mHWWF*mphTRX?8uRwFjkX$4FW+H?SD1aC@%A/tGLbj1B$NBZ+YPq\
GClNW< K9B>ycPy\BhLb%PBu!1hVkZ?B?q<K9CHyRP1\N<tt^GcQQyLl%TB:!AhW\WipR/1A8?Yn1wCQ$e/4A4<
$qTLLc c8t+K9BHyRP4\N?Zn1^aGt1pI:4A^$lHhaFQq\:tAn>EP1wL@AVy!C:\Z$yHh+HjIS*iBj/mhH\Z?NjT
N!/Fj% AX/a:wbKB*mBN$lHiIG*TIh+kT?TD9ECZ!Eh+\X?mZTRF@mN$qFi+E>Ll*tB9!eh=:H5YEP&N5T*p+:$
-AyyP\ 000c70042f5001202b3 Page 364 of binaries1.zip
D#hbb< At?YD9WCd=iP>RI@Zn4aC@#u$6Fi+NhLl*8B@$W/*k9<A?uwnYYuc8upLjA6yhP%\ChJl&8B^/RD6MBQ
1KbDi5 qM:QA9?qhEaY?F*TEXuk4=NVP=18\8VRn9kIellGjD6!Fpc<tb^*EX>En48Iu$GP6IljS$/$mD>NV1&I
=k1caC j$+P4Ykc&+AeVBH@IhpwEb>LVy/Iy<nBE@FX=GmJ?FZpbIu+R?V5mQld=PmI=nbLP65LjHQyhC@\*cVn
HK>NG* 9eCdyAP?\N8p5:ZA&/ZV6eBQqI:ZA9<@e5BG@F:ydC9\N/VVLbdh11Vn4eC@S\/+mE?ZD9eC:=CP>\I@
DLi!1> YV4jC@^Z$kqj+LiS4Sd^=/S#9MC@pk:!YHajKS*qBd/dhF\ZiJ6$aBj+whKJZiCuTth&kj>cPuRL@A:y
p/K\K# &C*\9$4udwF@R$:icJweKb&8Bd/4hL+Y?Q:TAX9kl=MnN8KZTMhwkh<lHcRF@qjyJC*\d<lbG5&hI&YA
a4$V>G k<B*qWEPAy<qA^RE9pkGHkn<hBq<IQC4bPCA\B?VAREC@$IGBYDba!nb8^Ejw<#<i<!R9naCQ%V/6kn<
9$:V<I DA4?RQ\GCkBB@GEb9CH\F<nJH9FQ!NEiVdSDyJP<\Hek=*jEb=MDQPLLyQP/\C<my*VE@$!P/am@Lb*K
W1<Z1W DVL%Y1V@::p%Pa\n*mKh9RZiRW:emF>An6!IZ$QP%+k@RLb?^Q>Pn6XwQ1+mb&nEN!Mub<TupKM#+qF!
tGN1iV Vpb<CVphI*+?PS+njkM=C!Q?F=q/&Y?uqIQTipFR&u<B@ki\tn\#!^!pX1d!ZcZuDyjNLaCh\Km5D@tn
6YM5@8 kyM!\dAj:TjNQ!MASkJ5CDAPaB:AjIB8kCVAwRAykDSAB1AHaAtA&KpGYAc\HPB\kCMAnkR+C8BwkBWA
uZJ<9R ^\AeC*Ae\ApAJ\KeBLAT+GTAW\BPBVkN+HTAM\DPBFkFeBdA&RDuAJ\LeB:A?RAZAF\IeJFI?8tc5cBW
ad<AmX >+b%9bRk9$1IT<qakQJd/1lpcw?u11!yl/VwN8HmZZVD&m//+WAZ*dCum/=W=+1>6$46i/8WY<d1*nDh
\<lYR9 4L=4e%Z^>%cqjY>X?jhYyZ>9@a#\<Q!SRCRc/%PPV1+nbKu6\mNpd^klZd/w+J$i&e^SEj!DQ@CQ$F1G
@Cb^=d !<Xm?*c%h6?8#k?yKBkV1^$^F4q>&#Y9u<l\E$*$bV@jhTZQV!>R6YWjVHSFM&8wcyiTNdnRb^VNMeZ&
ANcetG 6Z:cjc%jaF@4=>ZZ+AHQ5PRYNJ1lckH1AAaDDLGpt<e\kBEAI#GiCtAW\HTAFwCbABGAjRHcMGkK+ACA
1=T!1F FRDHAJ\E5BLkbIBVAE+FPA*khIA#AXaBuAX\Q5AFABeDZAL\M+A@AF\PeAZAH\H?BHAq\FWAX\NeA*A6
CPdEHY \HWA%\QeAHAn\E$AN\QeAuA4\G$A6\QeCZAZ\N$A>\DeC*Aj\AMAD\I<BQA\\CMAn\E<D9AE\F<AukJ+
1/?9q+ G8AbkGeBZkb+BiBXkL<C@A*kNaDZAh+AiBQkLaB*AQ+P<C:AQ\DiA*kj+APAj\J<CLAJ\GmAVRH1AVaD
S*Ze// &AJkT+C6ALaG&A=ki+AhABwAhkLa^bIt=>$B^kH5AVDJR8>IDut%T=<QieYT#d5&GGcHcDLyqZVNeM8:
Xl^Jkk FykFYyb5Dw=5=te$&cI4^Tkc:>CXIy8TFN$a5up+$C!M4k#wLwG8D8n/MJwW&#F1CTQet6HWnY+acD=G
a=XAXY <:DIWt>I>&%$=$AZCuT%RFM&t1FSCSyG/kTc\*e&*FP1b9PWdG?W?/51dHy#/Kujekmt!lPib$IITc<1
D?<I*h *FtyBckDGA\\BGAw\DCAERAnMTRZaFSIiqCNB6kWwB=kM+A6ALaE&Aykc+D6ALaH&AGkAYAukF$AhkZa
mkwMhu HYAe\B+Ap\CtA:RA#ATIAP\L$Ibl8\D#MQaEaEXIjwH9JICXACeDuAJ\K5ByAKeDuAt\C8A5kQMBLkC+
$cqVaX GPATkJ<B@BHkV\BZAq\FeDZANRDZAq\HeD*ADRA*A6\EeDQALRC*A6\GeD9AHRB*A6\FeA@A9RB@B4kQ
GGBXQ1 +H/AB\EiBukE+FGA^\AiB@kL\JMAV\E<A@A5\HMA#\P<C9BZkL<B9Ad\P5AdAG<C9AZ\N5A:AH<HiBjk
$!4\M6 QaD*AV+A?CjAl\AjAZ\M<GpIuj!kQ>iTKl!JNK:SAnjuG!?94a*qj>t@<RI1Zc+=NGKuAPlXC\L1lq1y
imhGRN J>jki%=?H\?kGa5HkjX9EAmll!@dCn#Z4@%u#J\^5dYywYqip#9NBN8E/Qj=^?C8&D9*QA6*EhbkN#hu
iT@L<a Ji>qj!6F9@d<+wy6>m9<!IyZiG895L8kicEE8$9B!F=eyG%&iaI?:IN!dCL+nTn6jR>$i^@pd%KyhjDL
jc$w/u @*M$y8AhlK4\*#AdYd=#I<6HAB<DjAL\KZ=L@F5^9QD/eI*Ki9NyL*/69lP8bclp4JZbthyR8R1!TYKh
i8S&eP mYMH>pKNmL?p<T&WZ9EqDS6^5*S/8/d$M<IDqi/*Sn=J/+E#Ru::5I*GMD\&5+juY&*/tI8Ge>W$R9We
wkSJCy 6!<F81/c9Dem=B@WTR8@n@1P?V1>%Zh%1S4HNDdE5Sp\!nEQdPZ+$?<bKn@Q4wdK#@NDl!lMh<^=Q#bW
Z9NLJ\ jy+i\<:QI?/c@QNF@wD5QHm4wV#lunL5@D\mQy9<<$YMena@V*cV\/B+$&^?uktG!5?#u/H!<*Rdhu+i
MqN?S/ EZNG@9pmZw4<<$ZeE9uum#ki<5<ZeVQpu!@mQMk@Z<SXbQQ#XBw1Q<<\R?Zu1Vj5@D^Yk&Hu=:GtG*b?
/C9I^+ Ht8?aiju5R+#:Q\<%ltGub@H85!\<@NaN^y&jl:4MeQP#&P>cNn=ic#QDV5@V/nc5QQ#lEadhu/i$HnD
\FN5eY #5<Vtt*a?ZqCl^l&jy:RW5QP#^M/\:D#<+R8N8#<QCJ*EMZul1+#:Q\<Ia^lw9neEMaAWZ^8CPN9KD+*
c@nNk* lLE9FJ<d\ukWm5<Nw^^SjG+a*\@F=+d^8Tp?N+#Zwjne<GVD#5<VS6tn+VDebhn=ieIwl^TjG<dPR9:$
#A>XpY aa!NI@6!GPQJKD+*nDJACqWaa==wISVG?J/yYW8%aiju1WB=y@nemyGGub?uA68My5+KnMiq?N\KXMpy
wW1VcH Q4eCHTewQ4eC+!AyQ4eCi#nF=%bkQB@F=%bk:B4F=%bkdBdF=%bk#BNN6lWai$V^8SWa>$Q^8bX+u^Tj
QwBd6N Y+u>mPJ#K%H8KD/*E6<6^ihY+u8k?N#K/achu/j!aMQP#%PJNptK#/%EtcH+*E1M+#!aeI!QyQneTt^#
dK:^lP m5?6^Qk@m5?6^Bk:m5?6^Qk=Y4bWaq\c^ihYa6\aVT1XGI>F<dtXGQ>E<dqXPIbSjG+Xnn$Wu%8Fjbj5
8C1ca# y%XnDD5@V^ZKP!&!1qCtKD/*c4Jl=?iy\9hQ<dqX&H=p5/qCHlTjY+W^51V5Xb%4&Qq=1nDtp8J#SX+t
tYBE&? m5?6\yk@tlP1MIcQ+uP4MNcN+uP4MFcMy9M1:C<Wu%8FeXwWu+9jp<*t=/uG5aVme/8^4>QWZ+*9piJ#
?SpjD9 1%GtKD/*G6<J^ihYa>6RjG+%*mQF=%buQ<TDPMc<Wu^8NecpWu^8Neb$Wu^8>X&Gub?uG5hQm5?6StYH
=5ZmSW +uP45S>SjG+@HD<yQ4jjbwchu/jjnwchu/ej>ttK#?$*$:D#<@R:!LD#<@VD>$d^8j*\8Tp?6^>il?J#
ac*!\h ??HaSjG=@VAtqiJ#?&HeJ<Zu>5Q+TI4Q:aj9k8J#?&Gjw9ne@nmZWu\8=5jP=8jyn@&I+uQ:+=l*KiHa
#pc$E1 %!p?6#@iM<Zu>pi=wQne@9lPKD/*Q#+V^ij&^?6RjG=@dGiK#?&Q@aZme@9nQXN<d9?@Gub?u9+a!$n^
eH6/$9 8j%Sjmk?6#@8JFF<dk*P\^TjY+N#BMZu%tC@wQneGl\9KV/*B5edm5?6Rjtl?N\c:B<Wu%8D<pn^8VZa
ySa&>5 @lTjY+N6VQG=NZmQFJ>dk:G=FJ>dk@&C+uN4unZ5@D\%PHhRjG+N^pSTjG+N^mbTjP+AuD5wQueA#5N*
JLbYli Ea:QR9G=A*C8wQneAVltW*#8AB\LKV=*AI+^FJ<:AQ5w^iiKZFkWu#5Aba*me\jki/d+*AHaqlTjP\D9
$kEe@$ liJ#B&C5LeZuD5C^t8J#B&AeJ<ZuD5CaT+4QHanQR9G=A*EiyQnekh5dhu/ikVlHWZ#8RB!#KV=*II=Q
ue^y*u FJ<:EQ5m^ieP^Q8p?N!B&QaWu#5RiXB<:pCMw/Z+*IGwT%B<:mDWGTp?h^D1Z^TjK*JpWZ#8INRFKD=*
aX$l4k EM/46MAblHMZ^ieP\uGG+uMHwe^VjP+kqHPK#^%$4YHu=^tEdWQ^8aNRump?6^auaI4Q4WY=yjneY6RS
C?mY&a KD/*F95h^ijY+n^D<dt%PE=VjG+66k@F=>bm@/Q+*F1WHa4Q4eZ*S9G=6jneFJ>dm>ip?N#c:AiJDGpL
R6SXu? #?du1WPhq?J#/%AQyjnePt\*m5?6R@tp?N\/qE?K#/&dchn=iiy\#1V+*D1eq!k?6\:Hi+4Q4eP^p?J#
jn==Cc /<=ZKu@hL%X?u444XH+i#PYX#e>V>:DK#%Q*k54QW@iP!5>V>:ZK##P+Y8ZuGd!6!5<#iA?Xu&h\1<4Q
cZqai\ M*l@qb>u<EKXu\j#kGZ#<\\?WiZuGZ!S!5<#?A<1Q<@k/%X?u5H*1@\<k%>Y?ZpG9/Q!<\#?VPZu\e*^
bA@wi? dH/iIS8w@D^D6qj=iabMW9q=l5^Y?ZtGLFD=iaa5Wjq=l1^W?ZtGZKn!<\#=k<4QM?Stqb>u!EM1Q<?R
cDw56D q%S?umH91@\<R@/6<9MM4XH=iab84QL#DN%i=iebPq:q=^p/TiZuGh11<9MMncu<QEPQWQq=ly/8<9MM
md8nCN 9W#q=^q/ne4QM@Siqb>u/IM1Q<@Rb%S?u1F91j\<R#>S?Zp\>Dmdu&ha4e4QM&^nqb>u&Qa1Q<?\eTw@
dwkkaJ #:Btqb>uYJ9K##Q5aJYjb%m*!5<#:CmXu&jaCTw@#:A#XZ/iabiw@D#Dj1@!<\!:Z8ZuGZc@!5<#:EtX
thMt8= u&jam!w@#:C*XZ/iab?1@D#D\!w@#@BlKn@Q<C%Xjy:lDTw@#@Aj1Q\<\@hS?ZtG@$Vq=^t?TPZuGd=C
QY&><+ =iebj1HK##Q<TyYjy=eX6m/94>dqClltA\^@9eJh!%WCT#X\4@5T6F=EqTq9pm#G$RJ&+YkB:!$LLu&y
?@bb+Z 6M=8dl4e*JYJy:4mtj1tyetP:qT^u^X1n55@c+k9nZPL>5FTPdb@#*VRbcdhdW>AwYpQHT#%mV%lNVB?
R/5hq/ YtncHZYlHc>y&\V6B^9DT1Ct6YuGHJmV=4hFW/kZuVm:dhaY<Q95TKRd%@R*#E1$+:4kutle8Bk?D8h^
?LK/SQ *jnTqI+w$4@V%w4d^ecu8I8Ic@$q<XRcJ44?p%Qh?HH9#eMLHcy&R8!4CS6<iJHa/=L&^SXmH$9aG<#6
ewPwI4 X/@P46Fl=dh6Qc$6aEY+t=%#eRZ8uXAi9lY+u%FDNpK^^+DncdSliTLJI8FZ$JN#?5V>JmLW65a#1i:D
RMWCAA +1uF/Zy$AN&:\SkAMGnG#ac^#j%nG+^1^LbdMiQAGV$#>lM=F/8hNKT%VnX^%?uXX%@>45H6tZ4Djc$Q
i^M\\y WLHQjn6Y:LNR:E/I+*4:4DTiNy@/tn&iNy<:IYe<dX:=Ma/uw$i9^?Pyh:\QS9mkTVSWnj?G$j8mNS1d
FmlZEq Pb5@nemqn=a?um=Njlw^tanH+tu?RtJjLl\y/F:Yqc^CdKhpP&Y&FB$Z8BaTWJVm#$#&E4jJ!<kQpNin
SKbNp5 pyqa\8kVWNEQ@/*p5CSb%nTQcP/8tDQim=ai+REP@6I9w<:=J?lmMeJRPZLRuRLhHNCXA6$n$M$BZTq\
^\hCT% 1aR8B8nikG+N/LKBdkda\>ENAh$T$LWCd?l:l9T6SZeDhDQaleRI*TVR9RPZaPlTk56BZNcl8\Y/PKA4
-A#t14 000de9c81f6001202b3 Page 365 of binaries1.zip
5#6C^Q BL1IwK5E8whpR/@RlTEdh8ZMqaQ8K4lp&<+wb*+e\!k&*$MyTYCLH#T+^:lIP/?y8jCc8m<u&PW%NSi%
KSdM5! y8ch4eBT:y$68@n6F4nSBQ%NZ>9b$tuHW8nZ=H:Y%4Q$1ncuuc*yL%?XuYBC$>?1!>ubt9:CZYJuC/P/
E&jiVL %6ih4Z=GiEmPu&Z^t5X/pElkjekHM!mdtq>4wYyt6T4PW:l?=mpE?ALkZ\Bjlk*nnLAMH<L9$6RC%AEM
>y<a:d BlkCMBSkGMAIkJH+ES1AWRCdAI\G&BTkHtA#kC$A6kVaCtB4kP$A6kjaAcABaCiAZRB&BhkhaB#AHkCV
?l>4dJ AKaD6ADMBIkA:A9Rll?1AbkH5ALkGICVAFaCuA^\C5CyAKeBuA=\J5A1kLMA#ki+APAmkJ<CZA#\B+DL
*=<<Q1 Ac+A8A4kcwB4AK+F8A:kiwAdAG+E8AukbwBdAG+F8A*khwA:AP+E8A9kdwB:Aj+MeB@A@RAQAD\E<AnA
P&HHAl w\CQAV\P<AVAp\BQAV\N<A#Ae\DQA:\A<CLA*\BiA*kh+A&AN\HiAukd+B&A9\P<C@AQkQeBQkD+J<CH
h:8>:u AB<BjA#\CeCuAJ<BjA:\BeC@\nJ!DYeRnLVGCG8M4Mb>J9Vm^tEJI*BSd<bIWLTkaGR$Y1b^F\anZVG1
P?nG6F GIiLbWY9V4Qt=H+6mjtycCwSS>any#T*NPG6+lE#w?E^SL@^+*^$@kw/j\Yh9=LPZ$P@Q!P/#/n?G/L@
j&L^</ pM/@T9Y9W@*LSH<:HtG>EMXnQ*Y<AI>XlnGFjq>I^+9w?NPy5?bpu/m1budQ@GT1i%E<q5Fu5yAGM@$S
eAP4d= dVMiB&AEpn^t#+jwGMbnLj&8yh>wIchnbcj#^@+?e%1\9jJd**ARt\+l!uG4NSQVLl</AWR/ildA=BmJ
CpM#te btILWi%y:W:Fy!R/RFImW%1R5H:&\tk1*t+wEY1pQ&?IJa*G^8:p5pk$uaqQm<aYm=1yE%8:&/Mh5?Ly
=?myJ/ uw=MinLM&6$LuCjk6lip+ttZM+&ScjK9HKiIVX6$jpheXLR8t=!KH6aK%=<WVaudy81y<e\?<YXyb%X#
1jD#@+ X#1i!mC65^b@#+=*kPk+c!Qh!VqJn%M>tht^XDVy4J5h#:ne\>^wInMn9nVV6CVi=YABDhdWFi68n/et
bZj8yL ^<XBp8M#!$ihtwwiE8qPbjbL^A<V=&buWwp8&RK#w$9m$AwbiDHmLpSqY:\#mc<Jj<#P#P=JJ?Nh:SPd
4y4ppl bmjnMYA+Lh4X*mG9MmiV/ADXKb:P*wlMTywE#hn?qW1uapdnqFcRl^%ct&bHDQmuHm:b*bPK+j6&j*E&
M%MKPH n:^Hp>!/P:yVE?EiM5&^:1+$Xic@PYwI==8n14\*q&&^*NhD6Vt+!%9MuuK?Sc4Li+6Wt@MYJ!jTTc>#
l9YCq6 nn>1Bl$^twqQV1Vk56&ybR$^%bYcqtbTWZkBeD*Sq:INCbjFQ&&N^ly:W8u8FJLAn<u^>PJMh#L:A*eP
%$jllu JbZA=VZV#1w&iKy5ldkk+c*^V41VcG!GFC#A+P4\XuHjR=#a6!eSY>\PL$d?6F?:@CuqEH@Mncc/ABZ9
T:<HnE XLbh\dPIq=^DJ&wtNdXNBAakKjJQRF=T!=IbpBe<IC<+Nciyc$pm%h$FAyt6wk6EW&pl=uP:W?%#Tj:J
5!9^KI YWNT!K6AN+$eJHb$y5YnIIjyltS5+bk^SkVNEbGPcFhGTnmMa@nueNl>*GJDSDaeEw*F5dw%tqpIS$qZ
Rt/X<N 9?&8mdHn&4@ZIM:Md1q9dKAVW/IyPHiR<%#4ZHq8Xp>ZJ6EbF@W#=?Q5NL5H?pp1k^ZaEd1l!/a#QjP^
*5VL@P ScjMVl=$TDh$ZNp+PR5><VRC>Zwc+CnP!\5nA@GVup8qY<PPDRjb5ZQ?HE@KqlDQRQeP6a=H6u@JynH!
%XYCEp $:kX*k>^#h/MMh+^&eD9?8bPdA@eM#JcI*PhQ!hFP#1/8:91y<W:RFDu%niPdS\#SlLP4ae=Jld6EL>t
#IXYLJ ^bedpcay#n@NZ5S=Bd\St\9>IC:mHmPNE>Ph^4#GtXPtPQ@E\Sq@V8#wMKapW8qM@i#+AlSPa*!$wS5t
hhM*$M <9GFDuZ88\EFijuhI#@l@YV:H1\RF^unp#*#^#5H=Y!F@VKdaW$5c*QH/?tJ#wV>W#n/RWiY\#BPCBPV
#weR\Z !a/+GL:T4R6TNIHAHANnEQ^ShqJy!TJ#=ClCyHQEYBdLVEq%h$=5kyE1=l!IY8LS^iIm!RXJG4kRyYyn
64Nki5 n1ldRBNdjw<HR4mWIIQSCIltb&BA^VQn<*6H6pL?kqhWu>Pt&S1BF*V1k#\/6jMW@DHPC>nM>GI:/Ti>
WDWw<R \P^Q?cweFW=y#NI*k8KZ:HFwNT%6PIP$J:InuTPe%5Zww/4w+8yZVkNR6dm<k?N+F=dne*tPh&E/9pC<
G^Hk\8 ^:9L>@kCAS@9L8HnHaQT?Q!ByGXmKlXhJlyHaHI?:SbC%>La*btM&n>^6tmY+^j>Lew1#FV^cKekn$T:
tlA>P\ yA^u%Tu+m%n:ay6?#1#+kpRc=Fl!u#w^$yNiPKpup?u8ww1&SKan*yyatyAXE&Pb^BLW94w:TK%1!hja
XCL?Nq <B+:w%&p&:XMTuXH&&PwF<9jLZC>iBj>mMSVmi:&BI^E>JhhGiA5?kTJQty6cZuyVCacY=nXjq8e>#AH
S=eTc* qCb+<k#PD9kVlRyWkWSG@8Z5VL8De+9TKF6WW<&B^$k8VMVTPY4muKpVlj+&K>wybq6w4&lZwnQd@5qD
nhW=wa RBYMH+I>t6C&bWtlMEA:#+V=#D/:INuapWA>mTycJpe#WZX%?G8<R:l6Ta!95Ztt\qGd#j$FA$%8BV^p
IkuJPa d5X?dbNcXI*n5dBKMAeiVctW%LckDnna%\XXMy%PLkSqLh+I4T+ZHGKkeX6!+ItCSRhY8m$:^Hnk54wR
IeFpuh ucBkjhEyKDP8q*Sja>mc9XRVHPPn1yK9RYlL<G5@pJ5ETL#+DR%B9/Y?Ih6G1X#+c&J:b<L=d8ZEpH%l
mal?ud Rw8FXWwu9XIaqL4^bYY*l@MGJdhcGmaKVwpB\/&&+A@!Bm!QE#=@quey6%F5jQj<SW/qJ4@ClW^\#c8R
c6a?mI bLMVC:1mtS=a&5Fp%=N8BW$/8pC8/6#QbN?iGAFy\5nm>uTSHS=y+CM!mhqEepSELG&VyHNJ$p+TNZ#m
jjyLp? tt>yLJ:MJPTA/hJ45JQJ/X*$i#tKbYj/PiyuttRZ?NMl?*KpY1P$ty\j&Yi$EbhG#@$qCcTe&88mSqyZ
kmuZXE +$A8S4^$:w*KP*Je\FGS%$:&:VnPm%aYA/DNRE\>yIuBQDMd%5^h:hHW5puhT:N#WRyGY46mnq\b=mkN
jewHb/ &TquVq5VwqmNE%T*t19w6Vm8u9Mn@>d5S<tbCy9q+I?#IX^lc11:J\p*yYyye5qY\Dk1J!ea5FShNJPI
=n9DcH 6apBQthG!lLRV*9Cunw^@#y=j#B%Im1!ctcG&<my!E=wckLNt>8#E/k>d#5j#uqFt<B?KmWSD/8?ppXu
?\!VE> ^DPHhceY=$tK15$VF*ZCndLR4$=YRBjMX5#w:wyV4VA8GuL\4ajbCQm$y+&JMX#q\+wu5#B6+M=wHJe\
BJ6/d\ tR\8=\&e<iydaTAX9!d%JD4c//YX\yA/in^XL@@G\J6w:G/QV+%*CZ^!Iw%ip=&kpcRM^^$mGyEYYWP8
1KcBJ% 8XB4T!CX@EtGkVSbtw\ydbF/jQEhS9P5?yp\tHRtqkM^4P:WZ?IDb!?PiM:FHc&BKC#e=JF8Rm:\/BKP
ZW=9A* q1IcYk11T<uj>q*K%/JiWN/dqT@1+b^jliiNSnFLV%\TVZR+LW\+I8Yh!X4C5wNeQuu?KV#Ble8cB$+I
&hlJjl Q&+<Xq@VYuQ=/6Z*jJFQXMj6^EX>i#edG>DQ!Q$5m>8*hIhT*EE&%mH:ZiANHdEN&i<An/b+BE\%&p:^
4<DlK? Cb6SHATtGh!H+lm!eSAHW4#ChI1F&JdmH#BX+TVc><TWlJlteCw=%GA1d*Sj\ZTD/I\#\bDy\A<&bMy9
5=WMua VF8IKd5^NT?t6MW$*bl1EFMMa8y1VC<+t?IiMG+Ca!<\BkQnM<bT9IR#>kJVPtI1S$#lmKpdMYWnytyE
MDR@uL N%qM#VmF?l?tb5TWnJmKEb&RMJ$+y1V>MVpbwRMViy/ka>KCMt\pq?4pYXCC9n9cF@wHS+eaanmRnVAA
BS/!N6 qK*545XCR<>FVC95^&KQ+%:neV!9LWkB#hq:<Tl6VaJQe5*+8Hweq%VE@T\$Tu188m!jbCAj^*cW#@$p
CGIEQM w?u!<Ip6LPY=Xnn+nBqVDn:JuqKi!?aVEHYG&+X?lV!PY:bhaZ5e6?#+Yw:Hee6Y1+VH<W945ee^S>Zd
5u!qjc ye>H%jMH&$Su?^a>&@65/SZ=6*9F>:E^m*MJ*<jP@<km/<QjmV:M8TW=6?S/tX8!eiiI4R<*n4<1S^>8
Vy#pw+ HH8\6Z19ecQiY+@%ae=8\cYQq^IDWNj>\6p68GS%/+LCGTQSIN>@^5\bE%8dGy4tNduVVLCZ$tH:/Lb?
D+c#<5 ><:qdH?k^n*:qMMNlA8Z9nW@?*%CnPhuLu&n8Fy1l@S^>ZY>?E+h=/Si=$1j*#%#ZT$M#A%u/a5F?uJR
4Q9R?L K@TT9q^MI8KA@1/ZyL5W%/q\@yLMRY\9uZlHq^49Y<:>91by1jP#m48qe\pbZJ!>\BIj4!YVAH/up68q
E=uw%& d=iFtW^!@Nm^m/JLwk*yu1/GYHju&GT18:$uqptQZhT?iP^PDV8Ndi?PyehGp+t^/?W/1HV6$!yeVbZR
SEREuj Tj$Vb?uQ58#jwFp+\#BuGPaM\^wblmhjiGq&tAyN95#I<Y?ajN=X/P?:<Y?M>hi@wjjNFY^DaS9KttwH
9GEd%& alXX=Wm*5TdF6n/+4?&5NZ5Wn/Ye^&auP^%@C+Yhn1tW/uSebBhR>1jmQ:uqbVm#YXKj14d5uPq=!Y?*
TE4VHS 59<Kd:8jBl$GMa@RwMMR4=EchBkM9aEGHRbMd/lBl$HXG&uRaiD%KA$/DM#iSNGF9ilRB^t6Raj/!iac
9RdB=4 hBn$9cXNb*uiH\cGd/XBl<HnY&9RwW/&nRahBy>91$GHRiudchBl+QwaDV4E66ik\?D*HVVwMFl>J=58
pPQy$& :EtH\i!:cNBl\Q88GuRaFL?dBl$G#I@VwMPA?9EchBl$9/eGHRdq@$CDDwQ&>%b$u9KMkj$VdLwKV*/a
<DLR+h uKDby15MihFlpwIi%a<5L=WbE!Ae+huQFaJ4n/M$/DDJ\dEchDlGH/hBl&8T+#ZweD%!pkahJta+$&N<
V&$ZeY PebBl$pW#6JwQ$!$eK:GhZEj+lENP4!HS#ZwVwLDW^y$8I=:YwQ8bDk<w$F*Cl!i%cA:FR:QchChBwju
*+?QYK NilPl<MLGuSu\PFFDdyXeHnbe==S!Fq\iEYD:t!$EYle>\I+jKlBl%EmH&qe>^h\?LeG9<9kZ$6D:u<J
j$W9R\ l&<$?KE>+V<chBn%WcXBh#Z<Y/%Bh\*<P<B!j8QGui=cPF!6\i</PF!uRZe>HQ=Qk?+GPQ^Gk?=GZK%y
9kh&l\ $N$El>>4$KG6>TaN8q9k<F<N8q9leLpG*Y%\?IMG*i%\8EcD:k++4NTk8^M6Wly$h<G@k#Vw:wdD:Sy$
C?uDG6 ><DlDk&/i?F\6\dhjZD+4Rdh@ZC+XwQ8AVle4$H*IB#8%/B:CA=@%KB:BA+*c6A>Bwe4Nikil<NhGuSQ
#ALwAk \PFYDd1@\L?DNimilH?HcNA>DaidNimikZ?Hc6A>C+jdNPmiS>8^B6$L<P<\DdwZ$jc5Rah=K&:SwH5h
k@?KFm @l&lMV/@CaeYDd1*+N<NNK::N9!:wRdhP@D9Sly$j+h@S&uR9R9@d1^B>\@+h^MN89jk*>EchP@D9=61
!68\4H $H$A@>b4$H&Ii\kchB@B9%6w$H$M@&/yRjeJ@L8XB6&u<P@YGuTj\d@dcNB>D9>81$H*Ni/PcMnyN@B9
*yDu5X SIQ8Q@D99l4Z@T@<P$8D:u@\:&\NP6#4cR8tE?kbRe@Bbb*hE6G!h%1c>p=L$>=ychw:LW%:y/Xy::R$
-A#kny 000c9b01b16001202b3 Page 366 of binaries1.zip
DeXl+$ :b&Yy4*V$4S*Yy4&Vp5p5@Sbq!p/Ld8wyYpZ6VV6wyctZhVT6I6ctubST>M8ctucST%N8/mqcSi%NP&m
wD%EG$ q1bh%NK$m%1chqFL$!=1chyFLW&:1KXyF:W$:cKYyq*W$4TLYnJycw5Gubd>%NK$u%1c>qNL$*=1chyQ
IGIV1t LW*:1cXyQ:W$:ciYy9*W$4TjYy4&W$9Vjtyy&p<6Vj8yyYp@6VV6y=ct@hVT6J>ct9bVT>yQZ>KkP%QH
N6+YXS jtyJP?54GuSu/hlQki=<Hj8yJi&5H&qe>&Ih?!uRZcJnF\Y/u?uaSaH8D#y&WcC:ZMe8my@aSX?8IL$h
D+6dWF /Q/wa^eF8n@y&EYB:pwh8/kq:MDBhqFL&IGD:cKY5AMH&$W6cRi?TaQ8Pl&:1CZ6\Jh4$N&ka^i%yB*+
tk8VCX Gk&/t*V5wyc$A/@RwL6F^!=1TV9\:Sy$6?uaST%yB:=dk?=PHd8wJi!:\ZbST>y*4>ik8$jHLtyJ??+j
&tj?Ja Nin8$:GLY6J8i/WG*aM/hqFL&t%9%cB:YMe8cku:d4Bh%JL&*SM$/B:Z5b>c\4+ddD?%lH$*&H+KhE@y
w!jLNT &E<6ah<N6y>c\4+ddD?%yH**Fk&/q?HuTI%^@BWh8!nR9cynF\Y/9?4aSaH8d#y&WcB:Vee8cpq:<Tac
N<a!FC hG@w&EW6aXeP6w6c$1=e4$H*nw=h%JL&+m$$/N:X5a6c$q/<qRdhi#y&WW9cm:jSwQ6A^!+KhQ>ED*IN
JBjp<k PWY:<p\N8w>$:KKY6C9Q$1D:SMe8cpt:ey5G*Yh5F%**TpnV*luT6HiGNP&hIW%:b$nV*luT6HiGNP&h
Sp5dDK IW%:b$nV*luT6HiGNP&hIW%:b!nj*8u>HLu&Vt?/ZH8uN%&89hPdL6ji/W&Zc?@$y58%h*4V=hw:9iq!
LP8E8b :b*ihLu&Vt?/ZH8uN%&89hPdL6ji/W&Zc?@$y58%h*4V=hw:9iq!:b*ihLu&Vt>=#4X*i9QL6ZicIT</
CA%XA^ LV6tTNPPGhK$a+a$:bklVV6tTNPPGhK$a+dp^:^YBhp^R@LDZYhy6N<<HV5t^8#w&DFD$6:=1AdhmVy&
H^\Z5p #JC$h#/6RdhT^++bp9dPb#ZwV6G^a+cp9jN=Dd4VhP!aIYu9jFGDV58PGhK$a+a$:bklVV6tTNPPGhK$
lQK/8m a+a$:bklVV6tTNkVk?&aIYFQDLbnlwR>$c\J$4ND$y=+6Rc@1*Z5tCFyV@\@Ddy4hi!aIYqQQF1D:uwh
!8AB$J P&bI&lN9$1C:WeiPGbL&^M5%/G:Y5YPGyF@yNSy$6?4aMWQTu4lCk?=&HV6tTQ1X*1=Bh/iPHVMp:a=*
uhK$tP c>Dhw&QHDEq:+4WchH@Y5YPGyN*^jk&/?*Z5tCFyh:^Sk?=lHV6tTQ1L*1XB>/mPHVMp:I:Bh5!R5D5G
V%=J=a &#FD$y=+5\dhp#4&!bC$P>/tRjiMnu$!JP!J\jbJwH6P^#+bpu/q6&nRwV%^8Md+@Fe+#NPk?^5e>6ik
+PlpwS i$*H*ltT>5RNNini$LF*l1R>ebRG*X5/>5/R>FQhSIQ8HS%:b$ncHVjXwH6Z^>+bp9dE#VZw*6i^h+cp
YZE%5! QZFLDdy@/6k:R>Ki8LWG*We/>5/R6Ch81$GHh5IhNPRW@W>dNPk?%:F*A6$ZP9bPwQ8Zn4$V/L:W5Zh!
^jYYDu YWeLb:Vu$5hLu@?YPGi$=+KF5^%1Fj//iVGF9&:ib:>8*u1aQeGEYw<?PCjdaY8tD4Mhdw1:ZP646pQZ
@P=<il uQ^De4LS><WQ*GFP@1BY+P>4>K:T=*NDq9K^lPL#$A%Tcie$M94d6lu?Qnh4hK#S5Wd*4Yq$W\c55DY/
AX4GHh KeNi!>Hwy9SdlS4hJ8H%YKNd$*E=><M:?cN$letYhCn>wCYmDh$>JcVM#jqe$I4Td?p:?F!R#Nldpn!I
TRBeLd #MQjbj4lm8A*/Z^V%I4R<idh6baX@QJ>Tnnu?dqDe+i&y/dkBRKZNS4m989p/9Bjj<4?9@8+jhcImWd&
Ri+^?/ j@$9EyT!Sm*!W9c&5jm!ueHd^q#/Ymt^=/@:BdiN^*jQZ<Td^u&:4A<4F4hQTk$*bDCnTdQnBwaM#69R
SI9W># pEGEt\N5bMnAR\\/\$A:DKQCkE4<$CQc^#FwDRQeN1b4jM?RkYe:G#K\dFi=YlLBjBlkmaaLNFBk<CEc
:\5ub+ R#C+EM%I&\LWGDL+E\Q\MLm#W5:D^w=m/niEARR@BX6L>4X11aKLRL!RC/^y1YcSZ/hZ9d\/qW*meGZN
PGHjcd WZ9h9y%qP4<A=DtEcIYPl#XD^<PcwiNl#hD^5GdwiFmPLl6y$PFI6/EGuXdwiFk#hD!5GVwi%k\hD&8G
hJ>DCa nwe%R<jDt1Hnae*R<dBt/HlaM*R<4Bp/H6aMHR>4lw/HNWQH\=1l+&HN$QG\b8l+YDN$QK\bPl:YDB$Q
XKEC*Z c+cPl#XD^<PcwiNl#hD^5GdwiFk#hD!5GVwi%k\hD&8Gnwe%R<jDt1Hnae*R<dBt/HlaM*R<4Bp/H6bM
QCdy>M kSuYVIEb%p!BGhbMkSuYVIEb%p!BGhbMkSuYVIEb%p!BGhbMkSuYDB$Qc+cPl#XD^<PcwiNl#hB^1L*I
L8q*pk $AkhB:1jGl1l+&Ebm9+jDV16FJll#STaabpC5%>R/FXaM*R<4Bp/H6aMHR>4lw/HNWQH\=1l+&HN$QG\
:&^/RK b8l+YDN$QK\bPl:YDB$Qc+cPl#XD^<M!hH!kl4#ewSNmHycl+:h4$PH/<A+NPp^bideGHacP@%cDDpQH
DCMKBb 4>Yk\>D^/#ZwMHV<jk$/VG*=S\$/VFq=w\ahlw=j1WGHwiN*chBl!5ydNiki%\p^D<8WqWM$/J+$NFJq
uK%@$i ltZw?M$chE@4lKKHban=dSy$GDy?wkdh<#1l/GH^TcLkWQT\@CVSLSy$GDw?V/Q@9tbwlJmHbin+Bl4Z
DaCC:F jWMu^D\5R<e*$1B:T!jEQC^D^#jYwH6HJ<R<LEQHS&9R9c5Val/YKT94Nini%\p^D<9R<T$$/Q/yE&Ii
F8VRLH q1HnY&uRjcRVal/YwiQdcNB>wlNmHyal=tM$=BSD#F5%/LSC#MPcIibl#SD#MIia4?Q:Q^^C#1X9q=^w
TLcCG/ yn/=teIl=F^<b&99M%cb45A:$%!M%6uNVaPd8#L^XFe<W>?$NNuSuTyYH&tP!#>4mC?Ne+9&\XJJ+W+#
uaaku% Lu+6P?mEb9^/Rp/+$+\LQ^aB:GldZ%@DuVkA&m=>QkAcM%G9S1VkZ>5%^qhKmk?C^6t<Ru4jVWB9N>R^
^@Pti< iY#1<?4qcmkV5t8P<dMZSqQ^>9G6VdQ4b<ZV*V&yYH^<5te?C$yjp\e4S^+caWZi%BZ4dw?uJ5jFkSit
4DpTwD jW5iRqIiwHRp=1jHJ\@yGN<bna*9!TR/EypE&!u/tn!Ee<aHdy1?Lk<XPGP\HLA<pD!aHNQKyc<Zmtu6
dMRQN* w=6aB5i$eyGFp*b<C/XZJP$Iq?FXY1:^\t81kQkYXp1+5FJCmVd/bLbpXp1+!LKt&TjXd*T%CbF/k&pu
\S@wdW 5mpp51pmeLMa$$!+ybQA+HEMDMikd\#w#1dH\M%uVI&BcVG!/VA\*RWGT&MkhM!Rke:%lk^R^1WFy5#B
X>y\AI >BpamI^B^kecMwkaA$M^ETpGC8Q8K1c>tGnIAFVeFy\MMA%k1mE*1DG\E6McaPAydt:DP6/aBZA\\B\A
=KmWpG #Pu*I\DMiI6Bp#<BcAYaaelkT\\euY*I6B\ahI!yNnCwGAPGMSka$*lkiw*<qB&:GVIa>@8GDLdFu4pu
bN=4P\ \BSDB6Z8BjADkB<cMwl%j+ADAH=5!E%:hAlwB$BHAN#5^$EN6@eVAI5AFkN$AHRChAF$A&Ct*EMBeQ:H
S\!Iw& ZLiwS&F8&CWAtGkj^YBbMiI$RM4E?Xc?yMl!nIMP=ibRDV1WLc<Aj8h%<eSwDV1W#<$%/FB?#@TkY?Gk
S6kb/A R^ujY+Mj>wPZNim\4:!mRaj>KVC\h+D5e^>y<B9pp>lkniq\ZEFntBihQdBp/aKtLcbn86=N==\QK&tP
/*9JVN 4KC=$HDMnju#a4qK*:+?8=X^ITu<X6I\4&ql^#M8Lw5yhn#n+mIQ:HnGlS*Q8HnJA#8ieYHHM!=i<tD!
uCXemt h%IMi*GZ*$beTm8>=V5y6TX8+kb<J+W@t9W69<Qen&dyj!mtWnMyh1Xt<8hK#iVQqb4Ju!9#p?YGQjuq
VdGVF& J5G6DHuScTZB4bV:kYeGJaY6qQ8Zb&u\\**YF+PTKFZKQejA=KKXe6@^cA%?8Dj=qAah:q<?w$GHi=#Q
I<@SGJ c6DlQ8n#GuT+X@1CBl*&8^M%/HDQhcWGHi:L:1bBl*8*S&4R+j:8Bly$8Ae<TwMP>>tQ$1DDiZ>LDdwn
BMVa:= DL<p=a48TMM9YdmmP<4\T^c8/I+&@JJmK#weLdjXwMP?6$KD:qlDI?p$$B&H@XtD:unDL^t<wn9B<E9K
qceJc> 48lPNDTTdFjKyM/:cNBl\wBhNik\1jNJGuTa%HteBl$thV=ik\/VPp@RwMPp#9@YwMPp#5hy$J$Nl:$$
4$#H6+ /M/B\^+chPjCaYeN89Qk5L5GHTcwiEKDDyM@6\RqCRT/C?HR&w9yhJ>Zm++Lq:XiLKN1SuiZj?wl5:W%
&+eiqm W4IuPC\iDM#J+b8%edBeebSYDkcatE^&qINQ+<#VFkjS6e+N@6B>a$e/ZR+?$^iqDtpAKPY=/5T%GmiZ
=*!I9W w*%t#b:XYA+?+49^<^j/$p&KhuS$h*jXV+6*JL%wBJ?Fte/PE66H<Fup@#b$*yjkE>B*b5YZB>+Vy15y
%dC:>= XZ/\B^/RTE+yl^!&h<h/!9HiW?qW4B^<5DVEMN%Qce<q?C^QJE66H^qH5@8+jd!G8%G>dcS4dY&bFEVZ
KBRXmB pylj*>!b:E=q/n$@ShwccbqTFn=qG1FtVywi*HMme\Q9y%iPhLHAu6\+6uHMtH1jD<hKQtQGqIhQ4E#*
4pWR4N p!\Zu&Sb?MTZJp6>>*JtK8%>&VNVMyBQJJ1PSV6<Hp#!mcdL\!i&5JVuY8Hk+!iJ?u!TQcW<%+w!#6!C
eK!:y> V#yiemlbd=6^$\5:=kjSSb1tBI/4/W^QYjmItS5c1bVumlm=EdC8yc1*#h!>eta1R<>bt=K1W\I@QLC8
mbhX$S /*Ti1VmK%Pt<?c#Q1$=hZe\u+WqS8qkku%mb:mhbLn:J59Bb&:1a^@$W4+6=Q%l^8qkRH$%h#INN$dya
F&V$F5 IB>hZe!hWjq%5RAhINI+Mh*yV#P9eYdkiIk$W\JG^HXey@MW^CJ%P6<WWGZS/cVFbuJ*#GQ1HqCEuZi!
4+%\9j *@$Waij%=cM#\\XJjNqu8LX4X@X6u?@A48y=Q^PMw8!195?q$=N%*u5S>6DJRj%L$^:1!&h8wt8Zui8Z
K8X495 n69hT*eiXJRPBa#KwpMF<wtX/Z/T=iKVLA8j>ulJP$lF/%Ai>%NZ4M:m\chwuTYIV!4\9aNA?+@Rpp@e
EX9^wE h#bAJ9E$VaQG6#5HCn+hmjtcc#kjCRI?*jMZ?jGbPZ>SMB@?kJJ:GWAiIRNcw:Fy<TlG>Zu$5$LQpiI@
4Y/*9Y jLGtiZ=!ZENN>XtPLJ$=kL!\lR5&qKJq%6<L8*^^*Q#lGd9$?R@Q<JnpZuyjI58!>j<1#cmBK5&wkT4N
^8yS4l 1IE1#cmBK5&wkT4N1IE1tVt5SaNPK:1kTnP/wEw#81BKSli<FPR6YTY#tkXGF%VJ#GbHc@DDKIRVNPm$
JcJS11 wlC1NKMR1nTnEKw$w^C1NKMR1nTnEKw$w^C1NKMR1nTnEKw$w^C1NKMR1nTnEKw$w^C1NKMR1nTnEKw$
hwP/p& w^C1NKMR1nTnEKw$w^C1NKMR1nTnEKw$w^C1NKMR1nTnEKw$w^C1NKMR1nTnEKw$w^C1NKMR1nTnEKw$
<>GH:G w^C1NKMRkG/XwSGFAHSuGSySCFW!1tFuDV1Mc6lhk\/nGy:RwMPwlpA9@??RV9e=6Pm+eCq!KcTqF%h4
!d#qI! /5ZXtuy^6cbiZJ&9F*9#!>YL#bAZubc?Y!&#?/+K$ui4bTdi5#V++YbIaDS66hTLA@ZhcyuN>&kNjy$/
-AN@e! 000ca7adb95001202b3 Page 367 of binaries1.zip
/$WWkM it!%%I8j$cD4%6Fn1/Xi@L\G*cE/it!%%I6Q%KBL/?m^%XI9*p&D4phHn/&Yi9EGGuTH/im^%XI9Qp1D
@HYiRc dytPHq56>iJ6NPkP%>Fn1/Xi9IMG*bE/it!%%I8*%cA:YpiQ4bb/<dEchMjw/LHXWm@iYwQ8PB$>6q41
StaXGV ^Whw$J&kw<hYT:%+X\&/p*V$&G1yF+@VwD6bS+?6qu4^BA&/W*Z$&G1yF^?uRZiGnl+LhGj1/LHXWm@i
S^NV9# YaQ8LB$>6q41^W>w$J&nw$>YT#%^ukah/1j:j\h$85?lSeiFT^?^lc@=ZkhuH8cTJ$!eibmLm#^\=tE8
$EY$HR uHtam=e<ePblLy^=tI8ZQJn5Y<YqhZb#$?Dt4p\<%SZQ%De6VZb$y+4>^uB#ZQ=bR*^yuF8$D=dK5j%:
Tu4/Ey yni*GVQu4<1PM1Gbm#/Yw<&i$\^n@LVR#IM8Di%+Vh8tu$QX^8b$w/c%ceaetJHt6$XV/Iq<+8!&YX9A
6WR*@E ::MnpY:$mL>lX1IhI:j9mea#KFYQ\@q/PL+$yTPK>P?$6a4I:p@SPS1P@%5CK^:DNQ6QVuWu+e1dl^$i
B+:ApJ &8GE?G:bRRJjJHa>j!XP4BDjK@%K*QQ&?K$+5:@AG+^6/\%#Z+H9kN@:NFeTQR/e%^A?*VB1@pTZ\P?S
d%pEcn 56?!Zj1<**K9>M<N9F/=9<SYASePPS1mTmNuA^e8/*GJVI%Ep$tM\+E?$Be@ca>YmYRmHtPLFBj@k4MH
A?\@6V :^/9M=<GpS<HQ6?WH^N&1pF9ZNNce:FlHLIy9<\?Y!/\C8ZmVbTL%c59ia1dy<?YC$PFe9HYNXPHDq?>
jl^yD5 ?teldy+?Y!+KF<4F&!AZI\^n#\HeQH&&hFa+qWIyF+hjuS#<i<PI#idt/dQq$M4C<iKh1*?*e49X1>@a
KbNIkj uJ8u#=bWXcFe@B*p+98Gpcnq=8t#JX%hKBj9kq^MZ4*/>N&+ijy5!jR4qI6@kF#MY4*/e#bG>h%mDmnW
DenI$\ P>?:?nhud:>/>bj@=idy5!W!1FA8*pi=kGFpFnhQu!%66RX!aXdI<iK4Ch\<jdd<1K=RLm4qiDGZY/i9
uVVYII Fuah5$8jh^%nGiDCbS*68ub+STZ*a!/&WHDl\mYwDDhN%wC+<MnJlR8QuF^+=PVClWhPLq!KKy#cw<<Z
Q\DaXw V8*ByiTTVi$S&idn4GIbm8\a!Wu6EhuK\NRi>in654/t>8D^%G?qaYiW/lee1lyWuKG5<%cWju<=Ac18
YKk\%L tT4MFYX8pm1yWycmV^=$WDwVFj?pM6@Jc\*PFyKj&\P:TDVw!>Se<G89$!j8N^Gl6nYiTZWjFp<6Vw5Q
C5Phy@ h8@haA\AGDVnb5Qa=9/^DWa%a686tHHknJ+b?^pG%nlyuKYId%yHIy:jTT:1t>aFjN!i1dVYK81d%l:Q
Ha@DH? yd=yHekuEp*Hwl$?DTV=SNQq+cQ=nY$QNm8MI4?^Heku&XQKe>q<AyVMYjHq98hJ=bl/dJ&6ep\>Jbtn
u+/<K> ep\>8l=Xnp*t4<e1B^*yw<&:n>6ujG6nI:!B4umH5%J<>4!?5d5#tikA>h=^b8t+*cG?QV+%*yXjVctZ
dQy=+^ <t4^W<:^YMbbVXY\jMmpRPwhb^y:$yu8#9y>+55P/$/%==!cGI9F$&t+%e#CuQyJQatPhlhYAG+*m6YV
DAptNS E&u<dudu@L^u\*PFD+G%Lk<lyh?6miTb8hFWX/J4Ri:nVYtFk:MGB#QZJyJ>\w$>uZLnn\t\ZJ+b1:&i
$yJ9>e &bE#K/<&$nTqwM4qSmPNE>PhlSIE@hH%:4E9\ey^hn!V!d@:KWBd*^yNJ9NPmH^G4uI1#*kK1##6L4H1
eEtkl& ZMHV1%PF#!9QiR1\QP$6^jK<l!nLp^:!LE?/C:W/=@GYFaHH\:4LPD&Nq/A:V:6II=*PF*qb:TH*%L!i
t&c^BI \y>#*9Pc:6%AujN6JhePwW:q>kyH9hi#8QeQihKnp<mV*n%Fuuj6LuC=\y/Cqi/hBM?+>I>5hY+:bG9#
+u/WkA HlY4*V5Eu9HwC*nK4S6k9X5Q\HwZ+e>Y8:*S:LuCl*CShuG44wK8#8VLt#mVI>=a+!dbwwuelhy^!w&@
cS9P8i m!lu1:&i8XCA5:WP&dY4ZG:WSYK^*p%a5h=DV9GWq+l/nPn&GW>l>S#Se<+XQL*umG/j<^Sk*^HhQ8<l
DeTXHY !6+n8u*TZcn>S@ReAw?Hhbh^9^E>::TLNL1N/Hc%l>#:n8n==#&9/h+N@Ej$HAKQXm45Fb+n89PeY@@\
uKXLn@ H6H6p>+>^ZXEJ=EW6T&JhMca&NFSIIqaq!N>YJF@Ic#Lba+%PZKJFW=b#Q:Pchq5JdXt>ti&yeV>=e1Y
qiP1uu 14Lj4cmTMwSw</#/teqMwnP^uMmFIM*5!TS:M81*<^Kma4>Yke9E4/%^iF=/I%mdL&/P8y#deIyX>ujB
w6ABHC A#9EJ@5VSedGHZiYI^ya+cWF=#^$@uKAun&@Gy:a8Y\4iQB<@eDnGw:iYuAl^:te1>F+:ZXJHP4h4tbQ
u<=^*? l:pZ519XNaVc+5Qi?+q!^=?CC:p?pb1B*C==TKK4Qb:!YbHtE8RQ@dquZdy<LpHBFJq:Pu@8!D&dN*pW
jF=ANn u5\jF\5y%MBaiM+^A8a%T5EE+udiPb4uudiupN#/@Biei#d9Dd8e>L^ll\Dpu6CRAJi=!=ZA?*H#b1@C
JIkMI? p@/9KZj?Kn^HE=nLCc@t!J@Ce5@tD%w=b#*%ISe1*/:lPTY/WQq*Eue6!+ZE4:6+c%\ibB=9^FZ:et6B
TX66=@ @!:pyat=Edq*J9el$+ZE4%8=1*biJC+hVHie>XRV9cpCt5Y9$*p4nl=p9m@d1\?/1yL8FN/>$X&6XCRi
#b5tPT c?^eA8?P/LGA!!Z\/Z=8/@Ze5=/h#t96Zpnl%9w8/@m<S9HyaP=4?4##L6*KVhHJQi9bth^MA!=u<:8R
:=khA^ y&KWT?LdeV^MDHpEZ6*F!>^RTPH%tq#:l+5Bw8CpS/>\M$dpuNYaw#^Z:m+pRj$neI:!6AT+pQl%F=$=
=!</Sk !5M&+EHk%j4Be=TQ6eCN!L$#Be%SZ51>F+Z@+*l%MK$=!5?W+W$X$C^?uW=un9I\eZkR8QZBkDuK$?nl
CY:@XX RyLVJYH^Y=>D=tc+!KQIN&QpuZa^c8SSFJk+<5:uG##!V8ibQ%#P=65GZEmWyeDqyMNYpN</BYaVX\Ku
q#GEqQ >TKj\Dcy=J*IN:Dpue+#6:mh>d=6l!pt:+!4aTcQ^5XM+$:l<>l=Jl!Z5\E9Lhi<+*KTnD%8b##dJh<R
CatRR* qHjc4c9+hSLQ:8HZMd!:lGhu<PwG9l*AR@T>lN=H*H$E*WZEQaZdT/\>BhyNqQ&F&E><@RVZT&S>lhXD
d9S5Pc VN$E%E5$QaY!WB#Xy+R<#F?P5@uKp?PWm>LpPF8kLDuP=T6JnqN=!qHitj^=M8?$tl@#VnltQ8iVF!k@
aDib@% BTih5:9#yK*5PC4#qS#H1V#qJ9?M??$=qBqH4c5T+#n9w4\Wu9X+4D^qJi?MV?QuKmh=J$ky!c>%jib<
>>Q9&6 JeS^!q8EQSeD?TVi\8!=DMku<SF4>\XA@uqQAjhY@h%w*F4dXip9cCajwjhT>\5wZMVjZhHQQ?@bEh^X
#VXKA5 jNj#?X*CS:uQJ@L6HJ=1jRGJX#j^X8nhcL^jwY89ehZnZW=:>B>*K=Q/yJ^Q@*G#L#qPijecX<8T+=^H
+*p?bE Z*G^KiYh<YniRt6T*wuCquP*I^YehBGHZA8Tw>KnD:nan9LQ8N>iwhB:tw\e=:%F*eNa=D#4K8Bib1K<
RFGAew $//NZ!nSL6cl*DN8e8^tF<4:K1K@HQ9PA*:twH\TH:H&uRi<4EB8y:$d&tei<DL?FDTVn>AH#AM8Ny@<
YIXY\@ M>=>\G<i<DV%8J:Q:^LB<+CjleiD^P@^Qd6J+D#kahX^P%9Rc@#tAW>nV9==6?Wy$Zm6WLPu*Scy&ZMi
dTq\*P />V5chiqc9cp&&w%i<=q\iw<=dcpey:QZXW=#?R6w8\teF&<=y:NZ@nbb*PY5Nqc6%X5>y#LRnduqMhN
NT<C\/ =m%u5>YiK>w5keimN8?$%?P=LG&hy@^iSiEC%*uG5edN1Zb@iLiXd9ce#&JZ6FqL6G6BV*SB*PZe=P=a
wNZlZq wQ:y@8iK\J&HQbP:@Hu&uPhj?q<>l<DJ\*cq59<wY=N*JShZC8h%Cp@:@d*H#Z4RiHJ!ddDC$*=@H*ku
!5IXVt um&Z:=uq@HPjh9B9kcBu>*^1u?j%j>JA/el#\<W1y?66>4jDPT:Q^VbjBA9>i9My<q^:*W=:#+l=X*h=
K95m/p p+W*+EKWh\<iFL:dLi:6+B=b=Vny@9TF<XX=J*#GJL@L?dY+S+TM&%u*$e#9XZ8@be<Z:Q%8*S5%>:#u
hE\e8V G!%5&5J#@mNb\KWDJM1ntV$IQEjCALH&qYk@ajcSa*FZC?Kyi1uX=h6*&!K8bn4p%:R$Fkhqy:54:Y&J
5uG/pK <PXPc!#*T/nY<4pPQy4*JaSl\wX:6pH<GRe>kFwp8q@C=\F\lM%uLF!:dW:bMhn6FuMq&?WG<^^VudhZ
Gt<Zwy &C5C4?DbDt:?jb:Z<u?h8eL1i/&Cq%ww/IFZ$Hkp>:j4MWP+ZhDu@dm?tcB*E9R&9N?D%l9\cZ9ZXk>1
k+9k$q :/CY>t:n+Ndq\wYL!19TV*!T5DcM9$#DHM?6\ntZbM+qpdl!QJcP^Q#$?PTCbK^><jnPcG^<5te?!$uj
Nm4\@n pkjMQiW1D!kLmc=aS$>:uGYmV<qDhb+<HNI^Q6dh&huh^ZLRJ?YlZ/E<+GVBdhSH=cG@qIjbC/PyiD8L
bNE#Sm Rb?Zl$wcH>I5EC\QeBkw=TE!NSL4TMT:Mm&J?d!!/MQ!MEnKR@j<ST\CjX+i\4ni6EAiyK@K:J=p5n8X
wXq&6m GS@B>K?SntkZwJH/TCwip>6h:jZV+6H&iC4Nw4N?!5MESH*qkh81n<tD=TIQ&XFkVqeC<?^GP*le/DQ!
4Zn?:m EQKSB&/w9meQaSh=+Ad18@JRIiTBt+VqReyDJZ?Yn\5Z4bL>qCX:nHD^HqHba+RLi+^\<bIH>lnl\l+n
?Ilq4b ZL#pkV%G8LDHCBe9iYCQET:5MeLFXS:aa+TLW^+t5MeIF+M>S4l+!kN:nHBln^E8Z9LAHmNeen%GLKPt
%Q&8&C S1bRp:tT*M1kmbFIm#H=!<jNbW5@N1^L^lqD?4jdb+hejd#uqba6&%Eeh::6$aQlPDGb:CkHu<cPhNyw
QRX!^T mHXE$&qQQ1%#/@G=DNB?Pk4=ZQG8yGteZI::tVX:XtM=?LR%#Y64tL@R<PM#Kh4S$h*hla?X>Hw8\Yhl
L%+9QL y4QD!B^wlC?jl*YlT:i>ECAC/C*l?mG9wAnA:+PN+X8@F1+jiY=wejyh?L%C@D==Y5dt5\ldeYqJ:T#+
hPqD<J yI^E$8h>#aw9N+Rk?9A=wDqTd#R5>?Yne#@6*dGie4!9XDwXK\ejLFKenbKiT@CB=nFKdJ</1VE+$5nt
auAlXP qa*pmQDXkiWbEW4u$>4cM5tA4lQ#+hPTtF@j*Ip/ED/b^+kRcbqTFn=mbCu>8YbPtq+jhD?6pdtB>!NH
9$Ni5L 1NL9J#6C^ew^R5WM@?icY!?#D66Q=eXu#BmnLH^m^ym!<EtYm$?!LM<XZ?4LJ?m>1^uFTCbL8J?/LJ?p
eH^tT1 EX5+bw\jH<4H4Bm=Qqe!tndK\mi&5JS&Z8HkA=JaPy?WEW*:QBjPqNpP:@9i$@EFyd=*MXMmw*LMqGZk
#L5#/L p%:aMh@AF?@VQyGtKaHnaV4VW^a?a5cFSm1quTN1^uXpC@iaeV<5$+#:+X1ieiHJ!nLni9PSM?/H=hHq
@:I14H T?j#ue!Wh88WPFMG<6GeKRQ=JM9FJ%tY=%4dM/ZH@SR@W!yGye&WRZ\$b$1Q=!y/yk#mw#FVVp#4#JV?
phDiD@ jPTHF\^jQ9Mcb<I+q9Lqk#SV<pa!%:WyCtJbb6#T?SR=+*1P#$ZP8J=<!ndn#p%$:dJ#9TNNiF+bTCN9
!uI4J9 a4/P^APj5w!<kZ\$S>=AQ5q!<WtY=dq$S$\QQuZFnqAijIwiwaL+RCeMGMFFqu5DGQqd#?K?I#k!mciy
-AG#T! 000966fe992001202b3 Page 368 of binaries1.zip
F\IT/X <^njd5<SjDwT<\$>ne%8Ihj:/b/@!P?=b5=jFMluSuhZ*N@k*hwcTbX1Nb<AEGRwN\aLLd*Eat9ybiDV
5EEKF: PQP$^WF$Ya8kZ^EY>#L\td+whWkDRCuQXbjX>59RQpLdL\Pj4Ld9X>!$@j!mLQiq6a?!*Jj&9pnL<m&w
L<<l@F bRWXadp9WZ/\B^/RTE+yl^\KLc5M:%%wYYZk+>kBKPt=:B&AE65ucAQAGNZdSnyln\kwdyd:kmhHi$R=
cE4+Pu ?JSylBI:AEET::IDWNBLi?NIF\95!RWYW*e?wK8XlW?5VQiVLBijbFu+wF&n^EJcipuQ=dB4BQEy5N!:
q4$6DM *k@cNe4CJ:c\qPjKY#YWkW?!y=VuYqHGth9iTTm^>LabX>k%Aw4dDpB?EZcNM9C^X&eqqIk>e+6QwdwV
YEF%pm XjY&td6Z#p^q/Dq4W%J%T6AY$#19$#t5^TZyhN=<%8hXy/+8=6p/SiymkZ^mbd1jbLu+JM9Cb&*4al:*
ciY$cQ W:\8=9%k^iqmRZ\$hVEQNpZ4awF<hHW^h$dq%<WChAC=X?Xd^F/XEW\#JYBEZMh%Pp>BLFKu<?u^bhLy
<m^tD: yMWGQ&V6QuWQKMLPP>u9jw1\<@4!$bulkmT?:DQe&4Y4?4dQh&BZ>d!jCWbShqZj=>Ly!V499Rl:/PTk
p%q$mw @1XyD@ZqE:SbdA\1Twh!:B1YyEMF<wtX/Z/T=iKVLA8j>ulJP$lF/%Ai>%NZ4M:m\chwuTYIV!4\9e6h
L\X4Za =/D&\X%u\:hZFP\/j%6#wPCD8<=/c#kjCcJhb=@m686eWE#P659FMFkK8HDSK6te!#^!e8GSp\8Z+phP
C6R*dD \/mbNZNtt@Np:hSbe:Ic5qpb/ilbpPkChKMy#T%N<AetHT$/HpDHp?n+Z#18yPN1Py=M^%QwiCwhV/Qn
Hh=ZVt /ZT5yYMhHc?t+&A/D1HnWDwPw&MLHtEFXWZHcnwPwYN@wy6H9\e+H6P1npR#5aZ^FC=Qcwl\E#4?l+/n
Jh+JAl /jk@Pt=K^*w/dpdHLim+JS&*w8QYnk8GR=Ey8DW&p5=6S<j6/dkDHS9wPBPQ@R#nZQ4>K@y>Ql*Qw@4y
*4e?99 hL!Knn9S?ZQw>!=$*JZ1#/dj8>M^R5eXhD!Gn99T5a$cd/DnYT4/S/bG/tXPYwQcHWn*wPMFhQ\qHdPZ
teR@yp @AY^GpVHYnwPh4C8:1?!pSu1Lq?k+@X$9IGPN>Q^Fn4iV<jd/ZkjHX?p+\h$jI?Pu>H^RV4iTMid/QkP
E!/NbN HV?p+@6$jI8Pd>Q^MVyiT<j4/HkdHS?k+<h$@J!PV>Q^E#1?T<hu/jkQP9/hn9jR<Y+/QpuHV?q+K:*q
C<lAF9 bjV:L*kMK:w:/QkIHb<u?lQy>?N$@ImPL>H^Vn4iT<i:/QkRHb?l+^PPX%ubD%dV1Yk1IW\AG>ChmD8%
/SpHBB DPPjiA!yP@?c#q>B=/?k<%jT?Y9w>&hEq*%#*^D>l*V?Xcy@uiyjJ915SJ^B9<?k*=Qp$VVw>=9WIleT
CK*d^< *h@w?J4n!cy1b9jMV/c/F<XnGZ\&m\R=P+A%+*EADb\D/Q\k\\nSMa#HY9yhT:@l:!9wYDt8EVyaW%i5
^!i$C9 8#&itl\Zl!qL4PN?5wXD:+FuM$I+5GCH^PdGG#P!*!PBRR&6?kbtmMY5wNDd!N\$GGAI\FCAaVk#AI#A
6X?My> kRqjE5CGPQIDnALaGGAVkNEAt\KkyZk#kM$B<F=\L^5H6T$B6kLaG8DHbIDhBkA>XR+H&Bdki\DdwdEh
?an&E& N\pA>kXwAtkGtAa\B<%BbE!inpbikIpA5\HRb4MjAF1aj\KA61D>AR+CtIHtFwB=bPdBtR$6aN5D:ICt
tilwIC GwC^APn^9^QA#kC:AP\K5B5PMRDjB<DwmV$AMLuSukB:AW\%MAP*aj\A+IeAi/QyC+*hAD<CPBAADjp+
?*R^lb C1K#DNwW$e<JdZpJALRS+c+Kdl4knl4P16$AcMM<FI*hAClAPNVlQ6kTkMMAqkI5A%li=C#@ZeqFnN4A
yp?^#K KS?N>Q/*eMnHkTRn$$p?5uI^piRmRnI%nh1?nh::*mRu?=J<#CIbt$M!>CN/D@NIQqyJL8cTdM\t&T8H
Kl=VnT ZE\lthnLISe6JI<HpQ\jSDLdG&Sm*dPLXk9JFdI<Ib9^uDZ+Q4@R#@&mEu$SwdXyh9&5iL1:J^YLe?L#
Tujmj! 9mkQXw+<FCyPuLi$d<qD!Q$LPn&bSEemA&5SFwi?JR>l@wIPF<=k!<XDHp!^*8Dm9k:nL>6!<X&H<bh6
c@<=b% YS/eZ!4pL>8!QHl>!bT@dN8H=cGc9&#LyjBL/L\8b*ukL>6!KbAH@4I6F@/!LShZiiA9&*J^!5ME@4I6
1>LC9e F+P@dM9FW^:+!:be?M8&ZL#pkj$C8PS?&XbXPZ*15S:>/4>6u@y5VEG>+i>Vu+&*<QP4S:>=y%>>N6am
ww=ui/ /%iQ@9V\!Dt^F8lZ4^N4<Y*:%d9FY*\dQ9YH5@V:YF>+N+<L:?b^<bIH*5*n\46=ZL#pRi*t#YutuV!Y
QG?<De l\G<8<8Fh*i=8MpD:?=!ee4DBN:h=YL\:m+ZV*uk*X$89L9L^W5iiHiZT<:8dn@=5>1!M$1d8cSdTcTj
=XNm&E *LHhSNGF9il\X*i$B6&G<NQ!wD9GRae:yH64<MMh*B=Fb:p?i#?=c:9K<:1KDuh:#>Lkl#8^L*t&u/LD
>CA5S? HiXZQJ>D$iGP:hEc@HBZ>\RNP6#=jW1DDuiHu>Gk\^*pb#ZweJj=iR$/*Iq?RaMPh/6Q%KDDHi&XGuT+
$kEEX+ /:&dBl*8nB?yRai:=^6w$PEP?!kN8mQkeJRG*bF\&FKD:mk+dKNBh#Re66ikY\GHHVVw5E@>RIQ8YDl5
K$=?kJ 1$F*HB^YcNChAIhnNilP^H/9RZeTHLdYwF5Jl#EchCjD+RkN8qQk5I5G*cq\&FYD:nR+uKSBh#we^tuR
nh1w6E uRGH+#Zw#wVDBA&/XZD+6\dhYZA+VwQ8dDn5yWF*Dl#&$KA:F\+:c>ChB+jhNinPl<MVGuRZ\KFb$aY<
uL$V14 /C/ER/5G*WX\tKhB>%M+:Q<h$Pp?l^ahF!:FqEHT$@EC!@%LK!5ehKnIyVVwKu#$b?h%K**$b!ehiq%8
c+/tWV 4pGH*wSui6A=:/@GS<>&<pMQ#=e%/Ad//L6P8pE/i9ak/W*/pRc@Py>%^S4V+dA5>8k</P\B^:V*<ymP
Y?/1V! /hbb8qw=@q$aNK:X!9E94WGuNj:Xcw=@6b4nZ/$e@%aFnZ?%t8Nj4id+X/5=@6X1nu?%t8Nj4ic+Xm\h
1D^Lu9 n*>M%=jw/8S+hXHR8Fau^/8MBq&X#9lZJ<i%$Sy$@ZZG9#w=ZkYPj*X!9Nydk><kujG9Vw=Z4&nR%itM
XHQT1@ j*W!m8knDZ=DhMc%a8q+@GP/QpZHqlM8ZHVKeJQ:!uhSR6\EPaM%KE:>b<!eMdG%1cFyZyM:+RV<J$#@
^mHIlN $HGP8e45b^*PLi9b58E!#IcYET:nLbZ9Zb5?h^^Wiq?:tF49p?Y:6<5*9/GC5X&V$1e@+?c!TeyK/?#t
^cXAPH Jt:d9q$YbnLJ<YQHLww8mVcpi:wca6&ha=Py:9ciYCa>hqH:+4E:Ni\$64$:ql+dVTdG4weN\D&CC@eI
%b?u@5 :lFe8Ei\qWFQ9?V&KNDM!:RT=?@MeZGSMQ:PHJh<iVD5VGQ<uVtYB/>MlJ!b5k@LR#@PVMtq<L8puJtT
Wqj\KN =aE#W*IypAj?#l\Z#pVI^XWiPBMlF/e<VPBMlF\M#pVI^XMiPBMlF<=E!MXLHnkVIbje:<^bSp*N>PmT
yH<a5< cH%Lwt6^QPZ/B+MtSmI6^8R9H#iZLj*a5C+bb\#y*&/jHZL%<b=ZY4b5S*He?dbHD+dn^GT!w^^<Gn9T
&W?1B= ccMl%lFNy#*=6M/6^?e!RQ9yKPS#^d8TyuF!Pi=u%8^bniZk$>a$4/%l@pLDn<?pcEhHh*eZQqdT/:pE
q6deyu u+Yb#k:nD/PN<PYai>EIZZ9kQACM?:$qZD@pFSRB?F%9nQ\mGc+jiY:w1N@@Du=QEL>ZZJm^?cAZp4G$
:\>SFH yHaYjFJGI8u#9tdFq^6CEH*+HNAe1Vecq99!$dtj>8=aV#uiX!1hmyYDD^ay#pbJ#!Z+RQMaJdbQuhRa
XM+q&Q hl?*n<i\5JEeEd+/5D\nR8q<Yq6dJluRhYI?jFwT<?8dP%EH\mj#GBEmLXQK\piMLKW@%<^J$?8D:1e%
5SI<KH Mnj\j8RIXj4>bEiwYDqG1Jnl@%^#/^9HNw+bw=:Km<?aMWbb?MTMMYZlp!\Zu&Sbum8?%JhQ$H6ZM+1S
n$&Sq^ VJb\Q*XbQppn6uDMGD<?pYk/F8%\MHJ>4tR$dbTFV&^lKi&<\5EHJLF$Qmpnt9b=Ly\y5^*i>:&u+\6K
YEykC& ji>mypSG=bky!<Au9dBn9wE9*1h>Ip%VA5jDhKcuLH#EnA8NXEw:S>TMG+p$B5!+H=by^9%\Le?+<GSq
GQlT4h tZG>?ekb><Q!/QKq<@qPbp1:hW1eKRQ=cM/WkZ!T=iKVLM6#4i&b$8N?my<yFcQTb5wkQyw#yeh#FV%V
Aa9J6b B9HStCpuyuXtTu<?eB9A^9DqM/>^Jw^nKX<?TDMqd!S#Zb8mIJbq^m&hV=E#48j+ZPTM/<tudDQ8*EVZ
LMpMHc Ln9ZL^&*8<iMP=BG*5S<HapHQtWbiRQ=cI/<kZ!T=iKVLM6#/a/aHu#1ml&lQQkWQWIF<aFPGDCCk^!C
Ec8Pwh ^kGM@K%ueh<SHJuE$>S=nG?*=\k?Hau=ly:Gb4iR/@%$#%@p>%\#=!<K=DPn8!98d@B8da&pT4YcV\AI
QLuDNa MyRdk+YYZtK^6jR!<Gteih4mIL15ShC9CI6:GjlMZ=R/yAGkqPi1!&4:bYkjwi&ZkW>Y&@e4d6y?jqGY
H*PX/w ?>LcS%u8T*6jyGZ=F6T!kw1\*JewQ>kDD$kpy=SDDwYYXad*L4T5M9B^:ACW>F#&DpCJ:SP$AYCM/t$n
\KG58& udBHBBR*!**Bp/M>wl^<!nSCmS&AIIq*&REw/KY>ecTLBjdpAw8yP^@R%e4CJ%ct?$tYm$?!LH#R4qFm
CMZ6:9 IT&>yPh!&DYC?BSa:q*9B?$cbiEVY%nKe?Y6G54AJ>qV!uP6KPQMdi<pqFl/&+\4:BwB^Y$HIL<I8$ab
qZjeVP ?Nm45^JK^J/=Y?PyBS/Lw14iNuQ*!ytyDD%udW11Vkucaq4uhV1H6dkpue/d#@1</6VX^V^dy$lhLJBQ
#Zm=RB 4E#*p!\Zu&Sb?K^6Ze#njw4Z^d\j4DlhLImQym:t\cbwZT!Rn/+8=5/w@LyakA+k>/y<m>m4MwJyykTM
@DRb1< mP8+V8eymEZ1hD+>9p\/udVaVP/PiW#hA+1\<$:&8=<m:L!?jHSt8CCJL@5M6*d614:6<^*aXV*9b+JS
MPYFkb qF*X>:q$i4LPi!@CHnw=1H>y&pN>?RS6Fl8Dm6KlHL8GJiqRkZ^mbd1jbLu+JM9Cy#%i$k=T$V1W^@*W
N$G=QF Fc8#iQAyYteJ+yMKjP>!%#twjZDZ&jD6FRY:#6@YHCn++K/#*l4PS+Jw%>tu8P$/5&T^bK$%!T4+1kh@
dtGI/m :K4$e6BB/W#WX=1?>YJ!J8e<tid&!G&QC9k*=Pn69iPdW/yW<*91/\Y@WDG+8T5VV*ZFM@XNT=Mh*cq+
MB!<kA pj=%#ZH=b\*^yZF8$V=aK5j&:=ui*GbE@lt^y<dIF%jJaY4Qcaa^jqww<6:BwS&9cc8HYtNne:yS$>w$
I*@9k9 a\/MX9Qdwmuen#=^h685LiD*&bFIN&y9N<^K6PQ?%V*SiAcq/uE+n>cSq/b$SJH?udbY5d@%cVIq%w@@
ta6wRX \@^Iltu&u=#1luYy8ZuawY8HE?Ld*AeJjJE^Ek/@IqX+FQ#:qdnu:VF4u>qj+A*G69YG8c@Ah#B&k*>Z
mJeXQ= En&M#?a%lE<*nJw@bSXlk:@>\mY9<LhjYAb<NeJmq+KkEJwkJ?cPAD8l%:^Sqi5q+8*P#wZL?qpmW!Ph
qtJL8X <c/iTKS^eu^?#+K?%\Ceb=lLhn$99*>XF<=?*+bdye>4Hj#>K!:=<tD\>/?+GQ#>K!/i<5Dj9?LC*:@m
-A>e9> 000c7f6365c001202b3 Page 369 of binaries1.zip
T9Ll4% +mWQ@Q$4L9!>I!=i<5DjR?QmqIhc@9+XF@:?FSeQiiD9Z*Hl:%>^<bIH@9+XF@:?FSe9iclW9qA?8i/+
BSu:<S eFtQT&S1JJyMwn8Wd*K1>ZqAMMeuE@FauJZEQq*aF+1L6/:A9qBe&BiKm=e<5C<WF@cF+8IqD?\L^aX>
k=\Te< wdl+!RQ:RuFlZ!k8Z9LA9qBe&BiKm=e<5C<WF@cF+8IqD?\L^aX>wdl+!WMqJ^ut\pY4DKiEnTd*GT+G
GC=m&> y&ju\1Y+pbQHB!=e8LBt^aXHVm=e!nX!q8?LMZdS?twX=&*QHdTC9/1Vu>qhqAH!#<?**PjBa^^$iIXD
Nk!e^a Nin\#Y!m/MK8N#NAC5JwDV1MpNqek/+KDq6w$GHe#bpihC5ehQ*k5LeGQ@\i^<5chDX\iEYDD9+*#qJ$
pTELSW qlehjm@pI\%?k?C$yW8H9Xy+kHnR&VJu&y+mVMh$/#KhSdMJCu!FIeeS:C$+:9RuGlt4J@5\>5?BbS!?
?4m^^6 8?B1G*8i=TlBLm:#QWeJe5tZB<PP?8AwRbaH4/k\nlL5\@JR#XGCZA1n!nqKpPYBw\T=FMkDS\q!+TlB
j*enZe Lq:!\FGCZDlKpI8ZQHCWIBiPE8VmJR<eJemFw\T=iMqDJe5HF%@=5I!I<EbnD&=n&DcNM!e*dXP@#iTJ
nC>8=L dSQlEGq8dN8tL#YABWKASj^wuh*e^H&qd=iFtW^!@Nm^m/JLwk*yu1/GYHju&GT18:$uqptQZhT?iP^P
TcDlA? DV8Ndi?PyehGp+t^/&EDlM5\KqyG8I\DN@hSL6^Hihdm\n%m*bt%i6<hej^VVuN<T%^=dPdCa#N4K%!+
#At4?J S*CQ+MI>Rp@VLXhPkLJ!Cmm8<jFa51pPYPZPXa=:*/IwY#mpqp9S\5Ml6X#!=eHkD&>!MjnDt%\<=aE@
8LlG%Z 9MtFQ:#J^W5iPKTYC+jWe9GTB\/y=eIl6X^e=YECl>S!MVmpqw8uQHBILSeP1iZmJR<eM5tqIKTYC<@Q
u65!56 ZHl?=5L#M=hiNn@*\1Dh6imG8V+@QTiy+JKX14=?l5Mt8PTWQl<&5ZbHGm=e8KnCu+Lt\mMuF!+<euLl
%6=WRE pbMLF^+=8c#hpbQqkI64<W%yWC8VW%^w8R<uK^^$8DiS%1DDL/F9w8nCZ6hFh=LSGuTahGF#DV4<!9wY
i6w+cn GuV+bjbXHuVP=<A968?6\R?@/9/!Bl%??j$XDdyBeDlL$XqihQC@<bEG9#w+diuT&X?>N@**\Y!/wHGJ
1d!%aV /bm8h>NlB<M^EAWi^/+1Ywnk?NTjcGVmF#ptaH<jYMd^GZuX%&d:IE@nZLn\EwlL<W5kLq!+/I?eZQ4M
FyS%lm \Mkyb4m+!APutPHmptItMnW!y=uVmdA<DPCWR%\+=SAZD*ukqENePPWRF!>=+JSDZDmqASe9iiCWBq\+
kGX*jM yREZL*tw=F$>Lq!$C96DeMpjS4q\+eInJ^eiPdq\+bGVC+?eZLn\!MtqF=Za+pS:JNY>cP:5TKQ\\nNp
yWQJH9 :Jyl>J<VcY=Iy8KHJJd/ndtt&H9Q1YdB+5J!\GZ>K:+yDiypGP>FRcpK/tTId$cDDpPCA%Mc%Mp\+hEc
VD6L>Q hBlY9LpGHaadd/FBl!HJkTpN/tTw<h+c@DAF\e5chBm%@IwGHj\juNIAmAadGmpNkG/IVp1DLB&uNGC/
K&YJRG QpdZK%Ic%GZ:wGXW#in8m95@XG64JFZ1bTeAVI<8mhc*JLwY^#*aDb+amdTWi1YDATatp^*q+NM+<:VF
k9mnZY RZT6e?9^\Z^yGn9T/ZL\td+whWkDRCuQXTi8%Vm=HP$#c@c5^uL\cY8c%>a\j/E9*cSwS$h*h%j>6HlH
Y@uY@I $w6G<Fta/i\w5Z$Eu$Z?d$QujRp?AZ%uXu^=+D$h$B!yL%X?5AeipElPKaee6ujHi54^*qQyXK\ejLA$
lnnq5K ^D1mj4%M=:pEu?YJbKu6I:$th^?*n>h\N/1*nZT64T&Vk8lcE9Q4t#9SESRj#iQJI!%V!5KuVCQW#EuV
GBPZNA k*6PbG:k@jVKpT+Y&JMd^#cPGiQ>XFp?a<cWl$?5VQiVLBijbFu+^JetT***eta1:Z*bM%M!pE<ptw=F
dCE8\% P*\iVQKJy59DJ:c\qPhc+iDnJ+u/jJI>yV#ZmnLP*IJQP4/kXQuydVN8itHH@CC/TNPW\HE%uipyC^<^
H\LMqc e$MnqjJeEZ9tdw&uFuk5m1y/&<#hK&itM9Te6TtyPpXKSmVT8L:1hQBwbhHy9Qt5#/6PZX*M5*YK%MWC
:uT9FK ?eVKhD@Je9FJqwZQ&6dFQP/uiF*M?<GK$<YC?Gn1al=5m6dFA9uw/tL8nM19m\ZwAJHGmiqPj=y=nVMD
F+AaW& ^$PptSI\I1:nPy&uIBcy$@u$?DLyhNJmM:p:=nF%D!nC#n9b:*/K5QQ/<6Gb+aIp98\#*N1%1@1&#*hk
e!TnpY X@Y<u\qGWZbX*?jT/ep/::$Ii?npwQ/qcR@%=VM*$dZL#9XL^?*8yV5QKp1HApbq$cEC?eVKhD@Je9FJ
:=ewYB qwXQi:!pHcTmhTmQ?/p4Xtj^+FP$#lLEJ^Z+*pGk@Whw!Tj8P^5kp*mcypHn&=$DBb?P^H#NNb!QBAGj
aD:#1h :9tL@QnMuL<wtA>@KbyLV8u#Z+ytZ%A8ZHTKC6Dk\wXLMV&G?\\ZHnt=eCq8=DTMDcHd:CJ<6\%#X?Gn
GMZ&=V dbm:Cj>6\>^hB9mb*^e?*aa=n5IE>^B?*bk*V@:ip?n*E9:hl9pD+h>6tD<W@8CG8VehJ^D>SDyPF*Ej
=NHd4u l4pQZYeTHS9yjmaVZSQ^u$L*N=Z8b^4SN*QQ@=dqlD*1jjt\S:%@?:BHQZ9Wq@Li&cP?6+^$:FHQH9Yq
Jjlm>6 <&GQi9?b1dV*^S:%:FHjY&be>1n9LVM*i>TZL1p/lV*1T?dDH9Z5WX<1H@cwb+@/puT^AB&AQiy%hVH&
=Z1Ki& 1C<w:FH9Zhmnun*1&cP?SD:5WX<PuaW>/wQYeN??S#*9:HQlwqPWV\?Z5liLt!B@aJclV6\RZLl\YbhG
GF9RDb Lt+CLq!KWCp=\IaLn=^e8BR:eqyGVW%RQMMk+SA!?e9H#YXLQ#c5T<abR@1*&&iHZH&<b*he6t^Heh#=
#l\6pl 6peQN5klyA^<^QcW*Bj\=JN%d<d>wEI?X:\4cSwuq?N?^DbZGjlp6:u<?Ll6e?W@q>4t!l^wlC?jl*Yl
kDG:HP T:i>EAB61LiE/+i<kq@MkN<HG<P*jm%eQ@Le$PL$8@B:ljl><4TM#Wh5e!$61b%yt!8S>Hqj8B$pBNGH
Ghm6a9 n>nt\u&eE6?:&LA8\@5T&%^q+IPF64qKim:BB:i=Tt!j8mC@@+*pmQDXkiWbEW4uI%#EwP9EjQm+8i5Z
AbYVVK nAnwIqaPQtJpKj&=lN6@\Q&+8j*u*+<ewW1@u?\IFT9HCBW#@J@L^W*cue?aMWbb?MTMMYZlp!\Zu&Sb
VVH=PG uk6h#Wy+:&yGMbLJE8:H+Y1G?=6?jA4e&q&jC%*N!5Iu64CWhq=l=G#dq5+ubWVVQ5?FM&Y&\@8?h*VZ
4HL6Bu L@G>m=pTGbXnym\DH?HclT@iy**e*P##&$i+hyYBn=l^eX8:lPiK1BuZ&!5:P?N?YKab><P%QPQc#uEq
y\E6@^ #4nijPTM?&F=hQuT?Z\uM/ZDBdGptVKRn?bMGekuYT+?!dI<%>1iKV*8y@mbWnE1dcaM+1M=W*w<X>E#
Cdd+=& bSAjnbq!aqyuy9VuR<:W9u!EM*XD!yiQt#P%/>wWBdE5M&:yjI1eeV*H=!JuZE<?bb6^k*\=B>LIt=m9
Gc:W1# I@EPB:GTS6=AQywnd!CjbLu+JM9!ZLwnykij8tJHKA<?Sa>RRZ!kE\cM+NIFE^n=Y<@m9mP+t\9t6>X#
%h!&ml BB>$\hVV&P\Ye4$jhMH$iT+*F<^<Qy#+^=5QJ@:^d^>P@MPJj$y=:=#+y:iMhJ#+l^Q@qM/HE@@+#$!q
MJF+<8 9T>P@MPJj*4LnM8Jj*4L#M&Jj$1ZXJ*CmZ>K=5PJj#n^V/q<PQEQJ@+yTSeL$AE+<a?8L5cJj\wKJ@:^
\@NQTp Ly#+l^Q@ePKjE9q\+y>!/C!e?ChwDdeYQ1ZLpXQ4e?VW@q%&=NVVA%<AYGW+I/iiHumyMjK+XTJ!/8j#
\#AjCe 9wLjh+ujQ*1BI/e$*lhHVuHpqN@I\yFV9mMCS$=^=BSHVuHpFEhPeiRWS$/Xa/dp!CtPuPLIKa/eMnl!
!8u^T= KuDG=ekyny\1jaVm!CtPuFKFI/e+etyh&?EQ*q@p!CuQ></SW:%qyPQIKa/eKy$QS$:=#$!q9T?PuPLI
K!wXN1 1h+!+*LpXG?b8Vq!1uSJ%TpePXW!H+/e+5myW9q\=BSHVyYpm\ZwAB\=yc8LeiSWRiHIKi@CpXMePeYS
bqWdmZ W!Z!+emye8k5HDpX6IbdG=FVXd##:M&Hh=:ZRS5A:#!ZR$Q!yiGhb>==Lw8Xpuii%+c%p*iiT?QDP<?<
DKAP\6 <%!T6bN*uuuu?h8c8Zuu8ZSJ%Tt<<%\!H>===y*uW9u\#nQ9QJipm\ZwAL##4K8L<e=#RiGhb?@CP<?<
A\LW8N <<\:#!Z!+b*ue8k59QMe6IdnuJ&8jDluy&:P#n?M6uN&Zu9kQAD5:Cyu=:WH%l5n9$mKuJ%H@j=*<H8C
!5AYEd ?L*mR5:b1jG?PGeu=?#$G%p+b/j9mMA=P#quJ?j5=J!huLPVe*b!#5=!#JTe5=N#huLPV5:bcZDP#5Ab
t^Qyb: q*N&e5:P$pew#6uJPV6X+ekyny^c%*d+k@eZPZLK<:%#=FS9Gip+ewwny$4u\=FV@nNVci?LI/e+e11*
j5w!q+ #LkePhXdbt/PuCyhWuWKS$/X#Ieny#l!1qR?HDuFpXMq/YIBPkBHV8u1al\=XXA+e51:ePRWS$=^=FTJ
lQl?Tj jDl!1l\/C$hPBc*lPGjuh:^&==*uhhAG\D9Q=hCRjGq+==q*u56myiTh=:Xl:iTh=>L+<M+#:#!ZbP*p
u$mX4i uYjiij/&bt:iiT=hWuWK:#!Z#Ih*uuuu8XR?9QQMP<<q/YIBPkD9QP91a4##ZFB+=>t:<M+#:####uPJ
*X&@1? jHnu8S\/C?<<B/*lPGiuK^@P&ctd5*Q@Ln6u=>MDZ\BabVl#hn+><FJn=HG4SM:Pu<@:Cu:jJZ:@/AZP
5MayG8 &cu^9nluJ?j5>B6bPGiu:+nAPV5=b!ju:PTeub!#p*N&e5:Pe5!WuLPVe*b!#p:P&Yq\#5:AGbh#huLP
iV>+Ta #6JHKM:b!Vp:XiHIKa/eY6h&?IQ*F#q!!9P>e?SWd^uyPHKKI/hK=<PSW@+#W&u9m!PuPHK16<!+HDuX
bqbiQ9 Y&b8ny\1ZXJ%CphPqe!HI/e+e1yWQl\=^bFVJiqmAVwAS$:y/tIePXXRPHLK8*DpFEhPeiSWmZ\+e1we
:\\EBY Pk6HVkY6+Vl!!yWQS$=^=BSHVuHpFEhP!Z9t!CtPuQLl\=FVHDuFpXMePeYSW>1/QEhPqYYt=Mkyny#m
%\VMI+ !CtPuDI+ewwny@!6XS\==Y<>+<kyny\1uk>HV9t*D$hPeiSWKi?hI/h/!$nHpXMePXW/H+/e<y?bTu6j
%GLV#J HDuFpXP>bedq!KuiMuN#=FVyp1yVPHK1bD+ePeYSW/Z!+ekyny\1TSeL$AE+epyZF?QI1aLCpXQilTPu
H+&@D= PHKKI/hK=MPSW?ZRYVl!KtkN^=FV4u\+ewwny#l!mmPuPHJK*nNHVuHpqA<jny#m!CtPuPLIKa/e$6dq
M><\KR PZK1LDMqS$=^=BSHVuHpqMGSW^\==Y?6+5kyj?5bS$=^=FV^jDl!!4>>PHKKI/hKii<ePhXdSn1PuPLI
#6W1ct 1hL=ePTW@<^W&99m!CtPuPw6M!=HV9YYtb5ny$1ZXJ*CpXMq<?HIKa/eKyWQS$=^=FSJ8qmAD5CSW:1/
6GblA# GEhPFSTPuQI8HDuFpXMePXWmH+/eKwjP\yFVRY8+6SA=hjykHD5:$=t<$YDmV\^n\^XRu#jbdL&^aXSn
^@NC9X jXh89aq4*G&lQyFd@>kLl4EB<R?>1?yZ@lepn@k:/#ica^kX^N>bZ:WBup!twM?a^>!DF/V4al65L85Q
-A1PD! 0004419825c001202b3 Page 370 of binaries1.zip
nuDmyu H+BQSQYuwYmLi8PD#\EQWj$q<M@bp4/qCjA\NeR6<M>$Tj@q#\C9pQZX8FaiJ8p*ilQ\Tqpj^4?:6DPV
F5Dt5D :qD*k6mY<LjDQ8:MJHQ4nRNilb>9hYa/8uQ44cX+u$Cj!K&9&FA>:+*+9J5RjaQ>9Mc4E\EjVjWL:ie%
yuL%5$ j@$$+J9K?qDajq:ne@V6w=t&alj:ie&b^\K?tc!9dFLQi^b1+J6VP<^#QK?quuiQ$^*Q1?1NI$He#Zjy
K=4>1j iS*%%p4H<#44L%ZQt@+M<D*w@5>Z:@i*NaCQy@4Z%QM&ZA*+u9SeS/4ujiwP\Qim=@1Xi4<jHAQ+D+nQ
jpDF+a w?y=i:ANjpn9>>jaX9T<IjY<M+=$QK?1N^++*QF?HjYln^*Q//k*6:Yj%@kc4cq#/D=4%jN8lu?#H@G=
!alR\w Teu#!#N^&KJ?5dPT=>MQ\CWQ%j>b9h<nukS<j&4uN96=nj@kQHaAQi?jHe<dX4h=&p&P=%Z%^pMHPh/9
Wd#MyQ w#:<q8N=Xd&%D@T9WZ6%bldp>ji*aZ!\68>MylM=>cHYV?Bh*lXyTePR@QJA1DtW=HCRGtee>Pan?\Kj
R5H4KX DiC//b^?FJy>6cNi!X6w#pPPi9XiRmh5+1kQ=\?Z%A+XL9Zy*Q4K@S*6/ckQ@>9SQm=<SH5/?T^V@iIH
>W>CI< ?Le$VnjAPBdiWhdjekW8>&V>Hu?C9^pk/*jDhc&e$5#QwE%GL=j%da>DDc%=1:?Cp%Y!j6/YWLGE496Q
nVL&5^ ?GeDYd@9*\A@nPy*ku@/!@4ZhkB<KjHBGYcR4J>&QiDLTKYEQtlY!9y^iE%Tt@86^4+y/*i+C9DDbZ*@
FAe5/& QSYjMTndS<n/Vb<FQm@J?88\:^>J>*MP4l^q@S>^jn/K?DVDQ#9L?m>tAZ/$4Q<FZLemI889Qw9WDb#9
tYDuBC <H&F1d>kG^<n/&8^Z<!Z>X@mI8NaY1#m9a&V>VkMG<jShjE=B54/nceDVl=y@Xi1eicQXaCjRQi@y&4Q
mhpiGT ZX<C@EVT!4cGj@+5/\>EGVyJ%t@\Y&kHim?h&Ia4bj*REjDQ:&V>EB^LV1d4wt\$!Q4N5h%PpjW:\:lu
APqpcK Wd9%@^I1VyZ%\*GQ:GCT&$4X9@:?tGHWdED!4?1N@uDQ=5ap@<:/T^^!:1kjiCA?F<t=w*=AyT*u%pq+
JLMk?J D=jIeiP^\VmX!j8<A/@>M$u@l+iWuH?K@iZue6m4jN$\hl59?j\R=>BjTQ49Q&nL8XYL@j%T88+mY</6
1uGT^m Q:aCjlt%@*919V!E:@1ZXQ?=Lb@Y*nDtGL?T>Z9ja58=Xajn%c>q@YBL!ju4PL@<H>Z@WQFblnL:G%w*
y?Ia1S utVL8ZWe!6y9mZ=@Jiij+j#+P/yjaM8=6VuK!P>q@j@N6PZe/9<RNlnNC^Y&uF6n5a>jL88HDLLq*DwY
pqhlp1 hDQnC8J@pT*u%m?\:@/S/y>We9:^P+D@mjkpdVt*X6$P?JXWj:#hu6al\\C@T6aQP>iYe?9C@\B?6c^j
+dI<Ve i4p6=>d9<Y?9pjYdZcup@L<+^q^L@B?#=h\ckt%?ubTjR@=q!:p%C*Yq/!Z>=p</=L^K#XMdlB^!481N
pjW@b! =QaPPZjW%@#LIiiP?1GwX#^Ie8/wH@/Ap9Nhei%!k:#8S+&&uF8N8CT:WhLj5wtT<%hRq:qJ#qPDGt$=
RLGw%A N#@B>*8#yQ@Ja&w<j?<=bEDZjX*J?h:I+%b16#QWi/pjCjl6XQ?Np5<n*kD<h4KY@p4J?RZVwPIPYV@!
\4:4Qy ATZu6?E<hTi%\^&K#!1<u:6pjj#*T5:Q@lA1:1d:@N1Ye/5c?<5>NP=XKnqQ+:4=Zqq@%@iWuA@dBtYJ
u>\4NA =H!kG5@@njpC:yQ%Y?!p^9Ndb\B?9/#j<E+%u4?B>R@I?lEX6y^di?E>Qpn%R=Te#<j^=CG/@*t1Qbjk
19>BL4 tQ1\4D@\GTZuQ<H:iWVYL#^c!ZpHnw&Q!94EBdceY:P\HS/n/$=Yeu:6dwA@Vy4DuW4Ph<b=:Rqb9>5h
<bn8RG Dn&pY5u=F1Mee1:1nS5nDnq*%A@a*CHun9wSn#up*FE@/EAq==jm8@mLqN6DNqF!9k4u&Cjq@BL4XHL?
^naCTQ Ie/#V$q%@w5KNb:@HPiyy!Z@R/iy<Z\J!ID^DF%*1bL#@XDjiJd1X/u*WwFn!HNW@%Pqd#\LdYI<L?5#
JI!V=p 9%S!jm41Em@R8DHZquP4Ah9pSiL#P!ZuHdltiWuYH:iyp9PdeI^@th46jCZul?Ia>w15*@WFJij:wj!<
kVj&nF K85@8FnJ?VLW$@=K+@AeJie9+n#!N%p@:kp%uq?Mi6y4yB@8yMd#&cBnG/>V@@&Fp9NV5P?@Rj*mT!Zu
u\=>$W @dH?Vd4@4XX:@l4d<C%b9&l9JieNPAc@Li9jG/V$q9?kZ9TP4P@=uS4Q9@+^+H<uP<BwJii*wce</j1j
ul+n9B 9K@p@A1eL@+l/^je/yD#jp1j@?W*DnqZ>idKa^%!*5<l=<e/=N^Sj^D!j=Vp*FE@I1Z$<&i^Q:+u4@9M
LV+\Q* CWy9?SB%%QjqheMZ&*J8#WKb@EDTj*cCp9MLeJ#@y?S@#N=K#njEi@mR496dJihLWDj+mPy*XH4LN*m9
TbQH5m H%Q>uWw?V$C>/BNbj?IWJieS%H<?yjF&uJL#chl*Q!M=8WL^miBc@HNbj>GST5=N%IG@IQydqJ^Q\#:/
>K%cAD L^1H#%F!H5h&?%K&V&Kbp9MW/6Sj$dkcW*L?Ch:d%#T?SbTeH+=!?G?T<:Rc#%>CHi$dp15cydh<n94D
EpECTF j?l?:qN!9l&8Nj>L:Zccp9NneP:/u/\@@Eaq=<$+%1&Y>Ti%KDq@!FJL$a9u19H<4ucwy^NLnqB!nuPk
A$V&V? TY9Wu@%V!ju=$ChMY1Q8l8%>TYe/*%/$?!yH9eP8<9*6HjWP?<Q<J^#%nuX8dLGn*1Gj6%e=/l*/#II*
Pl>pBi HjYP<Z@^VEi>w:@5%6@8L^XVaK\&beSRiG@XZ!41u$DDp1\@<AT:9+S@CYPGKi$@qbh$&9&qwkN6EYV@
\@dilD PZ1l*X@CF=+PPNq@J6^q>=iKEMmcTjcjpijb::hmFPlhJ6q@N4@Lq9PK=VCGtZ9L?lN&6Q6L?A9RN<\J
y1bR/h 54::Cd8@lM?D9mWZlZCQj:Z=lF@<H6qJWS=Y&@&qaqQRYW!!a&@?M:8@XM!cC9Zp1#N^W:8@lH@%E/l9
jpJTAA p9XjZt:*q+y1YP8d6AMtZ1u5L^WY4FQM1dT*Ne98L?H@wK++niVlQL8@lF?FNnCdch#:1h%j\t@BPGNP
>@LiD@ y@4j&9&qatEd%JNH+B+J%b+HA/%J9qk488*?E4=5H\^up9XZQY9*q+yND$MDt/!@?y>&j\ujkG84tTSZ
RSCV5G Id8@XM!BNb>Jb9X4#4Q:T@kX/M9t96T@&t^=C@<L&*tYdJ:&5&^=C:<DjhPeLiu@<+$6d^XH\Vly6pp>
ZZXM!5 =M=HqL^%k+=kp4*8?8h5ic6wS%5K&i5P@+W6d?GVaP\*!X/*+DnXQmdKIhu4quRyPdpLbN+pi>%>!&^=
Am8DmL 1>kS?y%J>41XeTX9n+Hia9/I466Q!i%eGJjMH<6^6j>9dZpLZ\w!b9/E=yhhqL^%\Z^6Hmn44:6M!h8>
E@9NV6 &J+HTV+duK4p4ihp1KCN#5yjKHudG>8HNyi9i%4J&*>l4Y*T*5eN4>4!XnH!LFRAbj&^$&^=1?kHc!PV
41dI&% w8qYZ1dp:Wja=8Ra88B$%b:X8KckQdZ:n:dq4TK?AhSL*%<#XGZLY@kyYIPce5@LHHCMp4iuRnkSTV+*
Zq4%&K hhn!F9=bmQad+DD\i$4iuwM?cyLu\wSQ%Ql&LM1&*D<JZ*Knp4h4eh!V*m*tbXiy<i%l/NPt*FiyjQK*
L>LjXH 64!Fd+R=*P!Y@N@jY5qdG?l8J8%FHn=T!h6#wP8bbC@h@B#XQ98BdJypQ>#mM!WuB<Fab=L><LM9qd\6
T$1PPK ^iiqLdHD^>4!XuEEQK6J>5PJNWy8:+X%8pu&\<@@1<c*MPm*J6pQD%>5!%6+Jc+q!Z=+$*NK*1:E<Xdc
=DKiQ$ D<*$Q4c<ld@A?!H:ajlj64!Fj\ZQdyL><LHJ64^XHAB4ayQ5l#j>XMudq6m9!Z=+?GF1jQ5G=qcV:Ieu
SPamB9 YE4inwE%5pu&\<PXHTQ<J=B=p?!H@*yi!h6+ZNNJ?/Fb8=8T6^N\VTH6l&bh1!%9FXHwI?b^%L>?yMc*
+n*m:N I&ANcp4:wVt/W<ud&:D8MMq?8MYLcu#:FPe:cV<M9>Bj#cj:k6=qT98l%jm1G6?tw?%P&k<4y>&5^4jq
Z?9Nk5 YE@&\=84%Z^/\ScAp@%\\RX1Qw&CLJqpQ>#<>$4iD9<H:eQl8L&VpyN9eF\/ZV:Z+IjWjQwp99e#cF#h
@DZyF8 VeudcBmn#DPJ#>=Kdy8kVe^Xp5>tKVY?*RX/5upY*iiXT6+iAu*JQF9YH*G!LY<X&?N+ha=5u=N8X8Qd
n8yh1: phkj#/X>ycFK*n:HNnqQZuiIYtiFZ\GbNM?Z>WQXP16m\tCw8ID5TE4@DL<I8yN=IhX9aM6d?A!$jX%E
qeiaZ9 <@X%1n*H\X4J@Kup9$YLp4e=?L\Z!@18l>S<YqhD?=$+jL!8=K$KbMcWhqT#jytT6*/\hnGqHhXMu1#p
SS9KLc :XJe\$w:19qaA4eucD$%RPq%^?J<8ILYW/w?jMpFnuYbk*/R$=:k4Ehd/@c$#qL%bum^p9NQJ6w/1Que
nH8m=6 Mjl/=j$9&MdYRe%nj1*G%h>m*^\qZ?NBE?^>pAw^^Y+5/a?+S+&4E$/^hXb#<CRq=#@C6Xh@8y<V%Dl\
Y5<P9$ CeykDhEjwPV<8RQ6b#CQhMn=e:nYH$n$C=Yed+%#*!C1@:YT<@t+S1!X>We>wiV<$X*JjRQ9=$\q=*hm
4kp^iy &==G?>F1H/SmMd+d/ui@G/@G%jNR>^qM>4wlT5=9\VY/:I@tm6<4Pd<a/&S@NJhi4QVG*?MaNwV8@^wq
=IblMK =@@FNl^K@XV6y%jW+Sy@GNHj1iT<EZpQq@WuZcZ$^q@n<+/R>Thj18V<BLS9nJV%y>!p=Q^5uAM*IHtw
QYGt/W WZIiRh9dl4L?n/jaeq=^ANw$N1J=@HWlu?qMMqiiu*@QIe?DqJ*lV$Mh@WLXt$<qHQ%C%S8D@?1Rj$j>
GHwI!q pM5e<8@k5>p<yXjW+Bm@BdpDjKQp@\i+#6%T$6<*WI*#T*CN?*$=#t?*6=L@HdGN=j4LQQXkJj@NcG9b
X=aAWb m8VueCZ@h&Ddd$*%D4%mHK:F6!F=iF4J:dMw#>9K?ne?WjL@M1:X9pj9bR<q@+imLZa:55>pFJ<S1L6J
&:WMR$ n!L##T?XZ6GGi#nd$#:%A1ZHL5BuyZulT1XZXN!H8wceF/\>F/6^@mc$/?=A/@$JTw<hmdaHPX?ad#?y
Pj89p# =Q>N9Qh#cN>=R#ZPQ+>#SRQhV%4y5S$+lw?q?lX1uQ<TddM:W9&=1n*:wa%=J%u@#m=1uF?B>D9L?^><
Z^%%T> 8JL@<*FN6k9Sj/up9^4Z549T@6$9qQ^*wk%uN<quYEnJ@<?\#=Ku$JEVHQK9=LBmk>5h<q?4=Q>cy@#Z
qAB98/ P8V@H\:=4*ZI@+eP?ZjWd=B^!L?n@k?@WQL@A^^n=Z4e9Kyc!j?wFuIElj4dqm4=@!H&C:t?1##!M!Z@
AuI?%c !@G>6JHej1Lp@!G$@hQ/@j1jPi\G?I=w@Z/+\&:\J8K$j4@?imY*EX#V!QY:8i\4yXeu$JiH%8<j:KDp
AW%S?1 @\q<Lq1@*#le#TMja=?R/*j#u8PX@P?Ijb*Y:#h8wiV@BLRFT4*FE9wJ!j>4PHbJ9eW/iwwc@:>Ea\G6
6QWYKd >$j<Tw*@Z?Pcn@Tb?58XZ9$ZZQ8VQ9NAw=L@$*HNJ?$D%6A>qQ#@B6e$bB>+:A>1@E@mQEn&kb?>1hw#
IJp\JW mVIk:RQt<9<y?X?A>mlyH:BG%C4=:$EbqjaB<@B:qQ^jH4Hh:5!/L=V<@\4dYNwH4At*K9t9SS9=LJK*
SBMB+e t^*!4?T\a9>XD9t9W@J@p%Q?Xd*=6HQ<4*QI@@<e<8?w*&%Ll@\:/yhe1iV@TF\:!9X?cN==T9/j^HFi
-AL1!I 000ea6375fb001202b3 Page 371 of binaries1.zip
!i\SBd 49jDi!^V<6?Ea:beQ%ceeda6@?G95e*p?6GcZ1Qp@&&eE<k?eQ%lT9=j\uGT:ANLHqL9/%*5e\eS@bqK
D^Z8i> @n</*ZcE6p/+Zeu@dJ\VyH*AVJ&u=Q@u1L9NJ@%=5iLVmQPS6A?E^+^T<4<u4nZJQuDLaCZ@L?NeeCH^
YMZcF5 j%LJ@#K$q$1>Pn#&inZ?V<a^p8\JG?&4^9?Zed#>Keu#ZCZ@N?EiNiud/bCT@$9SS+D5D^?ewiS@Y=!Q
+iFQTL !Q+\hJtT@$N\nCj:\=b:P@RjHJip@eE/<X+q@&@luw!$Q+VmFW4?d<i%?GL!5^1m=Q>E%Hp:cJ=hw8V@
Yq!@*Y S?mDIP$Q+h8jX@L@LN4u!c@#?95h<8?R\^8^4Vctiwij$ycwL?>N>q/HQu@EZa=/l==#^GyH9YPeZ*tH
+*@a$K w>:Sn+dm&qd/9\*bE*RpW?=4t<NkjA+NpjX%9+EK8c<h896/SZ<Q&n@q9udw\deXjRP8k?T?h8niYpX@
EZTEAh Ia^hy6#ZDn*!ycKQww+p>:XDD=!q/H?K/$1=4^&?<$%F9\uwccde%\:h>=Gm4:pAB*Jb@$R@SZ<W&mjq
PPY$F\ 9udw1XGK@p?\6nLq9ub+6\yF@*P$T<l>:hDVa&#/\Z<Dje!W?>4li$>T>Bqed<y>:jD&Z!n?KdT#!Z*6
uXe65K <Q$ZKj1Lai%w!u*6<MNQKQy>eI>a:t6ZlFay?l@mPqH8c+edKlV>JQ^d8c<hjuR*SV<H>$Hp9ub+*El%
FhI<KP @*@BQT?=4^%?a11mH\=/w!u*6eQuPi=uFhwB=Q=!?Ku>dj4B4/HhTi+9l=?dyPn**^kXE*IZ9WZ^9^H*
HY+$># Z=+tP<u?!k@#R:T4Q$Q%n>q?tNcP5H+^=j=!/Q:X6l?t%R@6&<@SQ8Ci6l?t%aw!@D#%>#4F@#*$VcL>
AdyEL< =hRh!1@%JSmV#BhJ#>>F?Zu?b!!PkbLQ5=<w@nQS=md*q<*jj1#+@\*6MLT@@PZF/9+Z\^l5!9%qc>ID
q<Rlc% m9>NMLiaj/ZuQX#^Z+D6Tj9L!=>Z@D>+C?yyj*u=%?4?@+//86^jNphi1h4u<qY+ICC:\dPKQ?:>t4T@
p<=E=n @Nntm9@>l/J9Li%Z:1:+j+Y&WLt@dG:!58Kj^4:@D1&LN*Y$D>4>cH@=k+VN*/4B9YucZ#=llGwj>J$#
+Vbp>$ =j/!?ieDXj9<D&nM><l85En^9^dq<H*!\?tu?Q<PhCV#A/wjw@k9l:YtTj8<Q>qV<j<ChWZc=%%&4?I@
\d@=H^ DN/hTj8<!\e1@68l9a:&iiej49n9kuJP?:#L^/4&TaF8cZ=K<>4Nm9@Q$h:%Gc$*FZ@#Bi#L6M?:@G:F
*BQ5^S @%^5N:uQc+*eS9FjD916?T?1h@A@B??V>utjluc%11Wj<mTRjXQ8<+b8B#$1JPd4w%j@A>e+6M@:YLZ!
E@J9T% q*+H=qNV:9NcS!^XjMdl9wue=\$jh=dm<#+?:*@I9nw^!\j1ah+$=V/9%jG\+9M&:uQJjX/4//p5H*kZ
G:NpGe 5Aa*X=P>ak6%Q+?$&F88ab!95*^?AjPkJjhw\!5jWZ!8An*Y5tnh>*QFJ\Jnn!Z*cC6G@D4L=?nXZ<C#
?SQ<D@ Y*KQ6tL9I^Yj4XNRL?jkC85q^YeS!J+q>&/6lKZ8=&HeW=b&M?8D\a4QW!PRl8Ru19k<B8@Kpuc\WPPS
GhP1L/ m5?YMC=b$k+YcnyB6jMuMDbabAj:*YnF==d*WMiR%$&FFb@ja4&$k%tbAiy?uwE=*TJh+dE:FJ<XMQbc
QEh%&c WqeIVd6S<ZpC&%#1C1Hyh!w???F#Dcd^<DdFb$AhLw^p8<*/miL#=F#5ELJ?^cPK#@Hu+EKb=46Jm5<X
:aFQ6p ^$C>6FNX:HiHiq<j:+WLFFq@*Q<Wu$M?^k=BjH/5?Q^^Q*R<qP%\&A@X@XS9Bdm$W%uLymk?V<BacG%E
@ep:<k #@Ye+uMT6I%Fh5=d#qJ<YqAGyJ&#+4cLFJ@j\h4V&wV$wpeWu%W\bq1ncS&Bi9G\#tlHZl#RkLPFQ$^W
a9MF^i I$jG@\NRT\MEFAACAAkAyXX6JaS1B$Gc8\eAALRLADAAAABndGqqduS#L*BueC>6aYM9cY=#hGF5dC>p
PV/&Cy d&N#L$q8hHJ9IHS9IEN!iZB$d!=mcY:5@ZheW$pZQ+/HAAFCRk%IW$NwIaTRCkEBR+6$R1>mA1H*yqmZ
FWSbKl *pGcmIkc1uRSEBFS/TJNRES5LF%ESG^a%@&B1@65aV@8<*\?j@#??Py4J9jP9i<:b</ePTVuuH5G\G<W
@EA64i GB+cBA<Qk88FHk\PD\L<q@>w?qT+uw/XBh6@tukdh&>?NAV6u&\I:yL/B&B$>FWFAEB8A/?M\?Cle4N#
F8tCkm 6?>A\Vk+Fl:p=k9X%ISDXY\PBu9AXYkML+?NE^wn%CM\HI=V&:nDc8Qe!mM5KCLW*TMMnmN?c>ILCk#j
4l$@dk 8GinljC>JVRwYDewE8+MJ^Hlcnk+mcT&<cEP*\8Hct9DwS/B#M*P<H@5XH@nb6^Z8I1Dw^M<MMLjj\PM
yqMaip ??*k##nCn*BE56yYPPKQeASX<qa+$k>^Y>Py?pieZ1kHI>\uKFCjEi+BS?y4+NVX!VkeDw6VJiKIBMWN
*+1N$G SweGMTQeQWLlTBiCt8yGWZQBa4E/t=Z:blY/YRX6Xt/dFYP#C6?5+J8X@tdq5%tF@Z:BBj1%\j@*!8Q*
py#q#w =*#FEDa4#GcF*c^\9%@\@L&4@>#5A4Z@9a9A#a4=?$$H9uc:MRRdu*D@neH=dIw&^m$w!E@^&:mDNpbF
p\9S!h DYWEiJk^@DbGTMKRMHlVHI/^eh$5mLpFT%V^YMW@5qL6S%Q\u?4Qe$D?Z+H1@\F?Y^APFt/?H8:leBZ4
HtkB&p CLj\4!%GAb64SMX<a&CdJ#m+m4$QM>\d4p1E1^l/?Hl=l<Q^iLmK4p>+GM$nXC<wIDkweHM^pd<8G9?k
C4Xm^G WP6kl45HHIj>nTbVn$C9d&m1n*@+B1NWVJ*5>V*ek=ki<E*T\5I*tBpABWj^5GlpYXEwX=\8k>dCXN*P
XNdwqR u/V9bpp86XQiqpb%6&!b*/?%M>PRccW8t&itpG95aZYF&d^ZJh@W$%1>>BARC6+a+4hHjS95X\w&D=\*
lIkn%4 KDMKbHyEinDlK9wi?**eQc#&/ML^JBIeS@=6ei@>HaV::%tE@</mDbu@uWe+QHGn&!&+>Cet+j@EJCIB
8HSl?G 1@bDNkEAeACAG<RBnI=c?\8dDDwA?YIeMF+R8$::YyT?4QBj&DVlCkQH^<^E>Zt4R9lwipZV:/N$EaK>
GbEpRT Qnc6H1yu6ku^/He!!C\4pAm+J/y@G88$jS8wb++6ZZ9I1<uJk$$ue:leZkJKtcMu/RiTyVIT\\HVT!/<
+EjIAT P\A*t$+%d+Mth46=CLVu&^\Nkl&j/Rd!eP@k*!d\:FL:T+EW15#^AA$6?bNml4IQd?t*bI4qe\Dbp$5K
^uI@mX wAANe+Xe5J!!/PtnN=IH\G/HD>K1<ZB?ZRNGm:?1eq&1<WK$I#M/bYZ@ac9JTNNL*bX=A=dbdICY9XL5
Ey?%#M 1iMC$$$*&6<jeRP^R>8/*eHYqA/&\QGcD^TwlC5iWl$=TEmHWKlIFVyhk*6ZeJy5F<LheQB!8y:DTHq/
9XqwwE DDKe^YYCbli<*C/A9y^iEn#%C^>+cbbHQ!5Fj+yQ4&BKk/?pWaA:@nl>Xc\#FBKZl?l1j*Z=8N+p4D\B
h1tnt6 >cBFyBKZY>4I##+:yZ&</&PB6Ja9h@BWj^m9YAFjN*CKptqKmSKI:=>&EnEMT=NQT?iR\y+HhZCVYX^M
kWDaM< &b:hqW!p1b:AM&#k>k4yWRFJtqAPSD?^9RP&I5mpc>S^8RqDj5p1DW=CCK/$SBwKTTihW6>qVJ8kbP5Z
lWGVI^ nP!I6/CHGlaZ!RW+:=bPT8P<q9Q\ATm?8$m1QVZZ6^CR&IX6H$&Al:b8E?I8k8$C/jYNp+SKK^/aCM&*
E!@S/m B$yt#c/%<SPCk?6FlSENIlV=$qG$&ZH*I\n&yQp\Z<++u@\ye?GTy/1Z+:yjcp>\$LMwNBnCP?FLBb8*
bdGCRM lClMN=ZHS1/9Sh+!4pi&cT!d9dZXcyC:EwbLmT$HmPj&1NMTE8RMYj!^I^>dyiMkIttJJ@S+:P#WPkF^
&Bh4T* <lhma@L5+8ySW&ab>GG:lCR&AXCd%R8GC^J5mjDeBa:G>69*MiydHbTmykP:wk#TXEymiuKF<4mq8aQj
#C&91a XlhjpeK+yVtlHH>iKIK>B?V1j4SWLGtjMKF#*QeFFCMAEH$8SP9::b^8#\EGwl*an<:Zybec?C1p9iHu
AqBM>k kY=uPE6!&<hpJWGAD\#ZDM/8/XQ5JmFCL4QS+9m//PJuMPk&jXYAdL4:S%e+kLEZW<hihu?dhHHbdLpV
eBquXS Sab?dl@9+>C#$G%q4lu:R4k#1RLSkVE^=FSeJqIP=VFQlYe6Q*W^1Fu+EQ%#*KXRYXXl8G<4Z%R/*t*:
JQIyGR !jeM9@S^u1lkYXF?Pl1c!K^IE<*AJpnp8LH$?e?N^jAP6:=G8EqXJ8y+y8pItC5X^:<ZDRawP\C/^e:Q
dLZPGQ J:QB:eLB5!wW/jiX!dTX6Ql&i/&wq%VSEBw8aheij8!SbP%8db4BA/A<pL5!Laud8J*5/M<bcSwX%k!k
Cp$:n< tkCk4QF<RAl?MP1SBELuVYWT5b^:N95\b#F<NBtu$e=iqI*R\YGmt+A+GSTDG*D6JT?Z4HiQXCTKISib
!$mQhu JTl/$5*IX%/IY/j:qSNmd5bFFADqaW9t+ItdQMhtycpm$uFALCp=KK$*e*h!DF=+^!phdpd>GQk<6$**
>GA5RA yKK+94bih^#\Ski^SBu8VaieAFPBtkkppCa9RTGKFbBQH89G/>%c!nYbF$mPwTINwkZpecXmA\ZMQ5Q1
:M1EZE :uZlGLARu<Y\k!LCB6Ey4kNDudHJW8jpT5YC?Nle%GJmy9nn$>CIhyG=1HcKABRiYSl9/tuBku^Jtc+V
kCj?Dc Euk#9Y9cVFP+Za%Lq!uJ$=9GE?@R15h$<a\cIT9FDMwS*T1<SNe<CS*T9KBPjHm8\H:wE5NMHwi6AwjB
R1$Bkb 68tKRe@ENN9HMGKRD^*:64E=:CnF6lMX5cN!<Eq81E!JmKpqLCHiXAe&HaPpVJPqK\y!wB11?p654!A=
H#!dAH p=YJI%X/88R!T<=IlWJAp*N9mcTmt\Aj&\laL+y&p5=8w!p^c6XuESWS*YNK:\wXi%PRJAYDy=\Tb4QE
MAjK9: kKJ15VM+qp1MA:BIJ+k@8m?QuRGHAhAb8LF&>i^/CPdJ$k+P?i$?WD>8hA1hHauRVE1M\4T#Gad/SHN#
l&<W9L 5RuJ\1LkbHa*Glj\ydXlbia==VpB9<\bWeGKq#y5=#?QyehM1Vk=muH#ppG:^^AwaX#RKZ%qW6!>ju*k
*FZ#j< 6AwQ/$1L15A15p:HlM$YZyp<+/4ZKeLNF6N^8\V9J8HSu6CkQ!q+N+4MuS\Fp<SQC*QYn$EV9F&4>Y8I
DIFe!W $CK5AN5PeR+/JTA^+lC:L6EPB\BR#6GSJl^SP?#d\\QhEJ+GiyGQqbeN$?I:Y>n>4qpy>=k!&CmFcPYZ
@?6etP EEHhQw9pVkTHLlKVAHm/G#b#EeN&YqN/&8C+atKNp>:>IL+\hC1HWqtGIc9uyu5puH8$YW@Q5ESA=pkK
!qXDDI D@5=p:1ZywJ/WbiVHV*%&yFtYqEH*dLeQEEZYNZ55yM8:wh%VZ5!V+6Ji@QM^FkyhTG:iVmGh5BHDyDT
?Yiw?# KA</atEuPbpQ:NpG\8Wh*:9t9a#ib*nhqV%@Pk$W+4jBW#8Jk9cW8GDXC\qbF4$Gy9mEdARE?/d1an\4
#1bL=n ?B4LFNiq*aRw1IcLBlnL9<4cB8Jja9$<qp?8y^>DWKCa1Ha%P6>VwyRuBTy5B4dH/mV#iAt+mVH&u&&u
lj/J%u K?HkqnIu5DRFupl1Cl$4Km!Eli1N^&=LZ$qbb1qHkL$HWY=9!8LkEiEypZV98e^p>5u4?*A?ZpB*LRn+
/t&%Xh Wc8>Dy8=wDXeGGl%M61tE/9I5qwR\R$+eKK^ZEhpkuN$EmSNI1NPM%5Mhin&1YuI<#jy8X*S:#SRy4RB
-A?FS@ 000bda5e35b001202b3 Page 372 of binaries1.zip
9PacBk =VtP+B!Ai*VW:G/*W1c4A/=RQctCw9B8STb*hAmnPtwC=k#iL5wkSuI<>pI\>qlE6b@NNa=M+bS45>LZ
u%w@>$ qSYRM=V1Z%C/eAI*dM$&w<Mqq<>VFml1aHN^Jd%\9GC%aRyZM+MFiISV<#M?<mVI8tBbS?w+Z#hw<Ea&
ihyGB# !?8mETIn>Y#b$mdd=c:4C84ItPmE%!m/5eL!Z1bajeSK&eZuS<kjQjw5P9S/q6^b6Ru46ZjZ?1T/=dAS
KDPRCu iY5YnE5Y@P<>NP*#%$\l9iKm9C?T64?:HtWYS#6BcRjpR!ca\mh9JY\@LTdMP=N4yl8q#Kel6jJ8h^*&
c*AY<H Xn=FqnPa9!N9SVF1DKw:JhHSiY!t6P^&utLAek:dk@8/5pB+G<>\1:KTT\/QKcK>J1nhTd^+dN5KT*lt
6ktl5p HKGn4%V$1B!BbhNyi$y@^>c=A>AlJSRXR+#8X%:DIFlWw/FbW@b/kYekaab@ny5VNG4Y@ta+>wWWm8+y
jtMMpd BjB>+tdFE:&D8$JWLk4PGX!M4jj<M854wpC81<X^^8T^!\PA!@M?Wh\JkLbHRM#&F>&qHhwALqQyiH?A
LN655A @<e?I%Q8GSi&yEnF+LyQRC\H+=ET/^^Hb/EIY?cHD8?BGDGiGAwT9pP^*XB<1eF:BmI^m8TQAt^D\HpA
SbYq>j S!VkWtZ6%&5RPQ/kBlp&:pRKYXVA:hPeAHS?BWW@IpHupGQShXkcaBtaTNEIdHD@^=u?:hLne8&?uID5
>=K>w& HRAyHbcVaGaNmkESe9PHb1+1SR9<Pn9IEV%:lbE8DJVma4q1Sb$GlpkBhELFGETAPVeCkPTWdwNN<*FL
Hq>Ena I:YmJCdhMI$aMWWKJSyHGiDBmEQTyN9#J?aiuJ5H<LQ=Z!pYA/HjYND4PBAakD=atJGtTAi*\nYp>iZ=
+$pyF! c6PE/i<lMR+eeu%K:R%8WXXA%nG=/GB945!Ddp^I@BhRKBHLPtSR*CJi*+d8YEBMh$9y!aQtjLpbXtR&
d^6K#Y ?Y%FiRn>FyZpJEVSMSTn:TwC@*l?He^?dN5#EEhH>w+AtnRh\kF5=TtdIEdL<>>c+h?DSeADm<C:SSAI
5y1m8V IEM&B#KyGFWePX*\c:i<lE\:Hd:?CpF4mHuQ:nPyC=@IukEKLKIEM*akyTXFhK%E9hj+5ju!WcWqA?84
$MEiLG :KbRwVEW*X!I\mbXBQ?XLkc:8KwM!P\8LliLZpJRdwmNAcTuFbZl=1TaR5HP%9!TKCl@m1c$nZV=hc$p
AFHZV< LLHwYF1PLq<^kmhcctc&dS/^a=bm#kMehP&Mqytjl:IF%pTbTmJ5N4+tFkGeJPu?8w^A+iE<<SkZRd1h
w=wFPb WlH>KhAGGG$1#Dm$C:=D1cbAG!=$pm%jiqC%FW+YjMtB:4Dhqew6@lVmDa\S=jMYu9aW:dbD6?9:TqMw
%B#&5d dNMu&bcqu!T>S$S^=<CXAdiEXP1pjK>L5%yE8mc=LQbL/mSL#+=Tb1NAwGe/d8W:my*M/QZ84&m/!9DT
wuF9?e npQ<RCji1NCn:SqR?lHSPBu>KHE&tSpDkJqPMS#WH5@6FmM!P1$5m@ci$d/58+NZ6yY*QR&AGXetG4JH
8wtt/^ HhT^ER8jd1&<tcXXQFchVIiN5/Sb@yLShC=yHi$*pMnyHaG5QPYb9FSYBp^inE9uPac>kX1iIRd6V&Hu
EhY*>p \ua%t5lMch55w8nhQKGi$9SDkn\jJW#dqVuT/G^Ce>%:>w!MEIeB!nN6p4yILla<t16ZlKClPF>FB\!8
ndJdJ& h5*D8Ly@pWi!!T^uM8wmhX$B$?C4MY&CL=b&!jcuYlDheq#awl@yS$<#S@eK#CKBFFa4ZI!*uW=pL6Qb
4VH8:n 54jQ5/qdk@YnaYKDalAKkZJiCI^^W+p/b?R&tCqdJ!E#K+RMb$6P!i1peVT!SBmAHhPG<kAIIDi\h*yH
JqZEM@ SWqVh8iWeMicPTW8yIN?pFpKXXqBMRy*\69Q&WkJTi?I/he8Sa!IJGPE^=QW?n/a&Eywt!aM^%$RG8&Z
Y#:B4# u1cK%\i#S+pC*Ecp$5R+yl?yham?nlIHSp^*S8EFL8+Zp#dq+Wd5P9GKD+utwt69E&:A/R!lyP%A%1I+
5#MmyI 5#j5$XLhBlKmM$hKm/ep&L^*Au=%A+49p*dSaat^?TayVk9965C!T1mkhl8&1QA??WDA>Nl&kau/1EFJ
&m@k^H /YYS?q+MQaaZ4yw$ViabwCn&G=b&%JelSunVdDluJV%u*aVwA66ak^*Sh8L\SWuyQMkJj!DhH^yX\<tW
^d9^^c lM$<+mC/!9hu$NpA*ZQ%*KL!:N%Se1yV$1\%KiqbIe9>=>8#iSt!al*VP*lZ8htp5b+T9P&yjAFjmn4L
T&:P#R lhi%Ei*FY9Vck&18kBuZdhGHJES4/IA*jAj1JcLZ^Pk6MIwWVK&hP+wS$ItGak^S>N!Q\JPcADJaaH6I
d=<Y#* LE!RkyiKYwbF^\E:kB$^=hCmBknMG!ehCp5ATN/i$w&K=NJ^KWRYHb#FA/PPka8/JcVNh%wmJV4/^jNA
Tn/Ae^ ml*!F<#MJIF+EdqayWn^PDwM%k5A*5Wmy6%EPlVn:LehE/Nn&+*AT:=Sdp!\nmLlSFDeAhihukAJkACC
6kAV9Q ye>GQ*h\M6J#BmayD^C@++ip&IFkn$\n*XQe@IEy=TlG^tmMp+l$/YQqZ=Li8RKnW?l5:GnXX5Eu>p:p
\jBFXY nuR*PQV&yDB>YJyXlKXjSHjKyiT9aV6PE9u4SHY6AH=9iIHt1T**D<:\1/Xk:$V^ehBViuTniP<1bLbM
5GeqqY ABtV$>lM!bw$dnb>k9+=!=dZPZQkHh81PN49!qD+AJuN:NEH9F>ab>8jFdREK$@VTDqSulTuajY>/hG\
Dqhl&Q D<XV+uAl\QS>+iJ+lR9m8iJy<lTpP*BKdGaR!JCY:hR:&LL6JFp<de<^$cJ8Dl5+i%VwktNqN9%^>m&/
P9wDIF YDTVC//^8&m9=F&i@A?Vel*!am#9n:i\&!lkZukli%Gb!5Ed&jV&uS=V=#98bDHkp9ThNl@iJW%@ASWB
hEN$l$ RI^aG/AwNPu\tXbbHGB6&+!&5Lk#/!Qy#CGFplI\HL/X=Rd@L!\*/u?%*Q#Bk94hwEIk1Q@RukLSF$AK
&j?Mu% >k%DPRXTkY\Hye+DCaZhHFdhCA+jAX%RmR:kpb9/Nn+1Vce$&EqXkw?DT\aNH?It>=RY5<YN/CBQWPhK
muHFJ6 ^Lu:/KwCapQ%$RhqH\ISpnPea8QB@8ym9Ap!Q9C?9TnSNKwiLkLwmMp*4V=^MR*5S/1%S\wZXW#/a=y9
u6ZFFu L^G^64AHiAE4u@$CNlpV^GwIq+B$@1NAnNkiqM#lumM\i\HJI6GDVSKC^\Tw!%*1aqHicyuRIBF^$#wu
DHQlIP <Mta!yMQ#u48$i1EBM<hAq#tdd#k<%aYWTcRSwlPAlhpbW+eXm%+Gjpl8n^q^tbtL#:HyS:qc+Q4=HYL
wB=%XK +Yt^Wlbu^HQplI#MB:*IMADyXca6?d#lQd4*BXjTp1IaYI6#4ElJZpAJqSq/KmXGykuG:b=#Zb!LnjKK
Q=#Gke #He<hb\RL=*/tqNLn*8c!IqqT5F8HF?DIT/#4Lc$^Q*JTE$LDZK*>kmHP<NXNk*?KnaipiHjdGy/*#/N
ZTJbk4 N8&YK6Tk\HD+=t^TCZAe/i6$d<:e:\c=#W8dB54jJPG4IR/H?<>6ByHli/#DN<&\t#j85edBec4@8jwH
n^bB+Y K>#tbd*N!>>Mqu4Y^P?Y8e%d@&A@^bH?:qL+TmZ$Q<dB#XdeS5N9%5EN$newCh\RP=>AL#miwE4/=p*R
jdYi&j baS=jIY1GH4+:@eI>*Fu@Lp4%d>*>b<SdjTuA@hp?Ih6Hq4Rjn<$6NqeJ=/MCQ@\Q#>NdY6jTNnGtapQ
D$LPaV M?^*G#L?N^+Rj@5k@hbI?w%9=N<ceh<<InnCd<$+$t@6WD#^6=ua?=Y>Eb5PF8^@uC$E6Y?PqD?T>RhL
eIG*XN >8@4XMhc#<mIVQ1&X4<9bZX%@J@Y4jVGQ<YNawtVq1G=1C9btJu+TW5n>lnL&Lu9e5LT:iZ5ycZ>A8YX
A6Vk\B uC**ibQhdhDiGFYePpGi=C696$9H%eeFCmdww\\nMPw8K1bcES=Bq8RAp15dPWkYw/NuTNV#Jj94:yGu
>/YS*\ lQ1GlXHqdLR6h8%SSP!tw4!SRabPFlaiqBAeVlpKy1IhDRNw4lSnhZMXB%85uSwCaic5H$^C$Q%*!?y9
=the%C XJ1t>ED=jW^9P$5jNW<=FXe%V@pIp1Y*uSYc6qH6a$DBj8d/5u/BKE?/cmDKT+acS4bZq9/9Kmn+9<j<
CI\niR j+@+@^:^@:?QPKc>%S<S>Z?9K#a$%S>%ldGGPSblFI/mt%k1lT8c8GHq@IqPBq+YBAeX9KP*mVXJS6F\
4FG59M h+TCtVZKbBh!k\J$aLAL\SHqa:XdZbFPM4GXkaKhGK1?Yw=:KPE?6tTEnl@F%6XAXpqYea??q1/^5//?
8lkZ8M !l+dSW5V1#%BwcH+wMARS=Nky?DhTHQE^yI*eN<ddl4mDkY:cD6SFG%C4FWeh8$JMA/Yqk+N%bV*eQRm
VcXjd6 aD%C>8#!e5JwY@9/$?#pR?*eh#5FWi^enjeFKimGPcEwb48$Xat?G?yGKe!a/GXt=1GB5dPXNmF/ld98
cZ+1XV 6R%CK44alEVI/91+M:ElG9bt\WkqGWYMt=8h9@KiEEhq6J:JZn$@Z^@9WGq6VTmamdJ^NN^u/Ww&$jZd
a:WQZV S@cR5hIQJ/yw?PkwPHm/:A5MaPwcakKWkp&6QQR$yb*&IplpY/eI*RkF=WBbE*<nLZKwMST<V=5RLB>I
%4^14R JaX+$Q$%NW#*BG6bPL4Il94a8#l:/!kGPiPS1mb1Hp!tuGtaKRJq8B8ybacuKCkmFTticEXnZ=ITFG^n
LBbV!K l\tn$FDK68FIM!QnEAeV55p8lV$$PR<hlI&88/<qY5<*EPZ81tyqwY/Ep@QY^hu6qubA?F5#@NX&Y&5b
Ed1Kh/ wlTkaK!^RcC?dJm5Qyck1//IqmY1P!n9IlJ<hyMe%K!$bhTp\<LX9iX5hBl+h/Kip1chu11C9%ERt8Fn
m<T=!H =:AH=iT6cAEF&>4k6IQeQAN*:jPpYAiwi>9J&yChZe*6ce=/e8FYBJ^MiITjn#jSCEpu+9GK?%CcHldw
h1$HQe IIwbp$HX%1PS\y*hwGB#V^P$l/16GhFd%pa>WJbPC@J!<ei1G8%!C\<lphC&Yw:BQpF+K#&XaH$#8uZ+
m1C4q< Lk6QX+$kic1S!X=@S+1Gyk$cC4b\>\kQ<ZeJb8+NRVna?i:YpqP^%NpXaa*SWCHT6HFwnYBLIp4d&Y89
SmQm%a I#JRl<cRWVZZImu18tw:+<^Cmd6ycAMwGBN15>5AHe#\&a%R*?9uy?Ri+tG$5bReMFy:A:G8cnlhF#JJ
5YH:>8 Yl?nK&?5wSh8GY+1d:DLjde>#nZE%TSAuwS&>IcCFhCKep1G#u5&9pcy/jyVXM^WcFwpVc@\9Vk9wkKV
Rh9Ajc :Gi&%=BMhQdWw^KN9j\a=um11dIcV5WZw:uZ*\EqE^S1B\Yd?iDDeadByuIMQVP49Zy+SS9nePw8^%BX
\$@Hth VRPCuNJ8B&M:1mp#LA!%^%ZJTEZDiG<\&kjnHpE^D6G^Nqa*$=ZHReE/Ab+Ic^%4Gc1uHl+ZTudV^@ql
D!eJFT DN\6eX/1\iHTXywKt44Kl\+h&qI@+LH@R:nH6/<\j\n*IJB?HP/lw49STmB?@:L#^?kQ*F>h<>??WQ*H
/kVEWP N/?144/Xc^/Q@#FThe5IED#l^$nm%pnmn=H+4bGpH!JJbMKYTNWjIku1yC&Scn>Ga4j8p@^DJQ+jPKV?
l$:RY% R!SPji6+H8!QpYydI*<5R#nCqnJE?LEM@XNpCPFQRtV$>VjS6<kZZeY9Q=mw*!Z?V:A@TbANuQA>YI4&
!&aw>G 9i8N%dbBl#wYVqcDp#cEHLi^SDcZpB&e?C*&R5Z<><M@Qyu$>=@#JCKb>MQj<\IyWTP$6nSXAak?y^=S
9cWy6N IBRnBiXk=</Q&Tta16e4I\&a>Ch6k!RIFBe%<<B!8jtwphLe>jB6Yj*BJi1DFAP$WW<ZY>TW1H8McA<H
-A#8w: 000b8f589e5001202b3 Page 373 of binaries1.zip
nPd^LA #uCiFkSL*RPMnb=jMBJL/\FqGa:V9IndFYYpK@ywLuWRQ@iRKJcd8qTK@&^$XQP\8yShd/=dBI#tWb8m
mHZ#bP bFPpM%XpXR1lh1aedT*%8&KjSL11PH\*>8a?^Y%h&/9cjLBVV\>EB^#iHkQnXZJ*8mn:&Fp5BZ@^I8Z1
!#JyFn Hn95/dRVF!@qXh4Xi8NqyK>Dan\JEtcu$wj=%X*9Q>ujyJHA#^/4P1=$E=yePyBX>1!^XWiHa>L@kW&K
$ku1ZZ VaH4%AZHX&Be#%kS!l^?&hB@#5FSKEJG!tIJEZNmN8&tYt44mnyjl!H#\8+P9i^1$t**S=!I6PZ>+1Cp
NmJHBX #IyQ8n!V>Dl\CkBYBAb15MbV&K#%u>i:NYSLaFcR:1KE=abKWd\9\Z\B!&nI:4k$SGh59%SVV^Qu^Ib!
FwpEQ1 w#k6YqX@$Z8GhSN6:*icj1/WmtVB/9&X?m?lc#ZTcpFt^t8X/1l=D\!uaA6#+aJ9=5lX<p!JFcwK*NSY
Q/=?k+ PTV5?\KjEGBa4pHAE45jJ$T*blA\Jp1mq%HDTi=/pId^NdGc&4$RdMeF9=>=RG!5+M?h4&#W?jYF>jW9
iiEYp= e\yhR+=WB&6bE:EZtd$Z?GJb4*wX*elVc5*lS^&G:*b^Y+5Tq>NE:Ed8Y9YjH<TKRJ$tXyaaL9iC<dZ+
m^=n:% hqX4HyG^ECba6ChQkFuYWPSd=q%19DhiqM><q?Q?iCJ&?BIJXi4/%lVe<FLQMWhp#u%T>PlHGASnJ9%V
R/wAZW 1/y*y#1PLhZ1ec*:WaHlT/pX#4H*%^5?BWLjT\wMJ@ntdD8eER!5WW5:eKtLeeHl:9ydwlWS@l/pplu/
I!?H$Y $RddH=tlh?GlYim>5bKVDNjZ%mA<=<1b6M+l@>b*:t1MYplQVe6y4tyW+Qc+!?nYR/X6IJSL@@E4?eWb
=+IHac N?L=$mFpSYJ4Eca1:dqH<#Y#:SDmpE=JTJQbY:$M!cw:^j&KVd==q&&d#ew6t6TW#V?S&l&8NT<wDhbC
6Y6k@% !%B/XVt:@CctXtE%NR8R95pHI4AZ#TuP\QHZJZ5Mdn%6P>9F69@A/X%ZG*@^HL%Z?Z/**MXt!TNn>^i6
VLVpI@ >FdF8QB8eSyN4\d*5KFLNCyH?/ADc66M4ieh4u&+h^%eaYeV$dZC!i=c@HDjS*#bM$:J=Z6QX?5iDLnY
=^^*9M %J\G*i$yHG6diua&dm^Q*P<X@ZkY?XyV%PqlZCmXl?$VMLd>SYa^PmBX?Wt?WJ+WLQZ&$XTYyI^?XQhI
ML6VDH !VNqA?X*MH4@b\uGI<Xun=/XetP@\Hqmn*GL8E5F?!>u5^*#4ki$/ik?/lwDu6Jb$liZJ1KP8yIJB+*L
pqK#wj !pSt#%w>PHk!8dK5wuC8FC#NFlaqj%H66HjXb#NG6NKk&dY<&db>1YGBIDuHdVwAZ<h>M!\@D@F\hn*R
\QZNy= a6yVE<IT@GKHdQRPRdydYDCbYGe#+cnuYIn%a#Xkheh6a>&dR\YV:/6FFu>!V<+pBt#QM/^wZ>A^Mpp9
lKB>mN M>eB*u&VKTtBDlJA\lTw<=uGlDnPMuEW8%WcVPc$Mmu:IIq1%WL9Cw:IkShd>Re:9T+bM:A&HZ^jLlwp
p+M=Ac JD=t+qXJqJBR<DTMny6RyD>1RIV#$Si4KIbJ6Ed&=Ca\Y\WbbH%ILTc=e/YDlRXXmI5m\4k$Wp*u#<Tj
uQqBDq aMmN4b\!u*?lTB<Ft+e9pP*aanW=Y&*q+>FSKhpH<M4HwqSac?=D%8Gc+B1NSNKKI/Pw6<Rnn$@mFEi1
CFhNcl I8yC^p^KXmWJ=V%pcJIaXSb&Y6<IIPdw/@l$CqI>9ek*JLtZb6G$!FJI!dd!N6w*I%AXE=W1M8lI=a%@
*iabed 8peM&\I&K*qZAlLXwIAtc\WId=%Vl=/a1E6BWp:51<k1$+V=RP!>d:FR<SKZ6Bj=lW@+8cY5NYXbbu<A
dGC*/a #&SH=PiP55Eq&PmYq%SQZBLbWWE@4&^tNE/=ZaM9mGT=yP#N+^Te9Z:ZGZS9^5kK%PmwJ!<?XbRKJ=^J
><$F+% KF&D?V=^Mei4ud?d$FuQ<=MwYm:K@%q$$&DynyjqKT!d^Q%ya4Pqa9&/dD<q$cw=hdQ9DX\<WT6TW+jw
tYVyaZ yhI:6TkP\1<A#k1L%e+QA4NY1W$m>MKd@1iX&!^4&YAiy@VNJNBZBpkew!*C#uZGCXeCqtAe6$D=MD!9
%M8LuV IYHbDtd<5ZklDZBqAFDJab6mG:9>BTj+5d61>@X4GcG?IANJD5w!6t$Cb+l!MIF5K@*=ML9@%IWtbiWC
RRT*^Y *4J\6NqK!:*tl\bqAyB:nIQRJ>TTVIwVSPAP8eZjMcV=TPn??::wwJ4+9k9B<\ZS$XahkbSlqWPmL$=i
4QHbWV /<Qq4h5Zl\/u14\=iE6%e8ZSY4Bqqc%ubYy?S=!61GFKVwnF^Tmyk4#tjD@kGDbnJ&DB^9HajIR@I/Yy
%lVLi6 BCenuwk=iNanY+Lj1&J&1IN1HW*Ey?Zb:<!!eW1\YY==:4FttRX=PK%m!cy#d9%wQc?Vl8yHm!@X9HF9
u=JyJS CnmK9%AW=8Z^^jZb/4FnmuFn8ciFQLaDhh#mXTlwPWn6!&ecB\W^HN=Cybeu>=8NmSy=Z49=?VWn+/y5
=+@a#5 SPH+R$VcL&^/SwbRHDS*RAtk^4:&5Miq\551u:Y*WP8ulT51J*lcP6mnk1Pj#8kSih=@&lpHjRl/EjBm
<H&A*> eZlqQibLVP4QEaGQ:%>DeN^5>Jb\A%YQmWi16wD+X!=l66h<W58d4$hJ*Qe<&6m+L=FnF8h+9!I^w48E
tptTVZ P8yCLReG*69YuSXMht%>DN>^=YR\up&td<>#%^+Q%GI#\9%lHj+Rq4J$LR*W+XB&/Du!*iZp8buA?Z=y
e9=\%I 9jD+!@5PFWRtQy<InenwcV4M&?!QWc+1uITYbY?nDee:*LSV9HYQ6L&JehA?^/Z\8K1wP56D>M/F*d%Q
*Xt4EK 5EJCWca\NaFZNu&HnQYKw9k!Jh?$hNW:ScynI/QjwL%>iFIT=V8QV&m1m1lM&l**/^1R9ILb^@j4ED%M
?uN^#R SXKB6TB&Wt:\#GW%8WPaK?Ip<R8!#\MKnX%8HV!+mGk:QGpRZEK@:Qt5Cuy5#RnM?K#Sj/H$ZZ>+q4FT
V84$BP p?>nbMD>G6YAwaj9l==\&B=c=ATjPX^&IQCc&?iiVw?$l4n:aeI@1:#bXbudpHBL$!jKj&Jk<tT%j!!L
Gtll9c ^1M:@wa@/h:NL?lTX8:A^\EjbGMT=1QKyIj9IJp!!c<+md\F!Hq^^PGF6+LHntV/1t99imnZnq$Jp?PK
C:V5WJ ?yTd:#nb^$5Gi1H#+/DAB>hG/Mlu/%n/W9iL95^u\djmy<jqKXnjZIiiFIN+kbFTF4L>Ek?m>Jj?pYGq
dMnp/I Ztm>$%5j</e1HV!iVpw>\FAB=lWX8pFe^a&$V1^9@kN=Kt1p\6i<L/Y9F>Qh:8+SW%p&\#&d@=ph9K\A
$VAlH1 h%/48Sb@tHQA@$^NW!kZ$Vd+w+y?L+1!iJ@9YCXjVIFJkutmREYXNmha%/BpnMK**>dD@/JJNkqJ<a<1
MF>/tL &QeT:%IGMZ9ta5c=?GdP?&y!*#%PeE8<&E@Qj?KtWlM:<$wZl^*LbM?==:6PV!tYjau*$l:Le1%IZ\+$
Ii+X4R kKAB9tn1QAp^BhJ>>LS+bA>%*mD&p#n#=nb8h5HP?hBub!?D=m55:w1p>ytddBPhj!E5h@*Re4mYJh/W
=bp1Gm *cyMGZIjjc\QiSL&=GPk<piM<aTJq?^#p=dc8MBd/SyeTnWqXqJFMn^\9l&&ul<du48T8Cj9tZQjKy6$
64w%Nu jt=<V!<HM9Vk8y+QQLD:WAIThV9l%8*R1!9hd</n:wHuA?MCZdI=?qjq*\9y!cV9:/ZJimVIP\\VXY4i
FTYPlK :?hJp#Y:j5>KM*?\JnAt<@mRwm!uE<4I&KFu=K!y/bXuLCe#kXA4i*dPI^D@p$1ltd<EI8PXVhENDQ=k
&bw%N8 11\HhdiHRCKj>?N/VW!9cX85k+jF5EL>hhVNS<@pP^W>SB@IV\aMy1J%:/JnHZkElMcWCyYDK\/Cq9j%
RdZ+iQ 9K?k4*nM8!kL9MPZFYDl6Np?adl!%YLuhW:?>8+uE*\=aE=ABBjh%hDcqSV%R6Zh^aFkB%E1DiqjL+>y
eNYRjy +^\aec!lpAl8T9%%u+XEcb%Jwbay?%aWMS/uXc^nc6$hZmN1JRSLVSGqcNMWbaC9MVAQQX@MCRkFQV6m
W:H&$c ?FJYn^4bR1<IiT/QXpyCZ$ka>p\!TIkYeYP>q:H/JYu!DacQBH?tLYNqHPYy%pYN:lj>lT@Wk16am^%!
n:4!m+ L*n/\HpbPY:j\F#+A+G$hmZ8Zd16mq:e%^Jhk^dZH!m+Fn>jmpK$$H44!Z6ejSY$VS1Zw>8ZIat8pTDX
b=BRpX b:4qEeZ#cYXyH>tdb>G/AcD/pCdj@X=<MWu\aPGQ?\H?6+u:!T?Lj$Gu/B5FcdJkT^#Ek+4qTHP*GSQR
:5j&KL XJLw:J:yiZac5phk9EJm*4Ci4<I8cqn&jy$8LwQ/$&Kh55u?\#XjI1uNeZ5<A?YP^A\6K45*uWWM+F=E
k&CcE@ S9Fb+VL5#c8DD?#^M9EG#hYYtm=QLymAJuwK<DJy9&a=#S@Z4W5JZRppKw%@NnNaQbypapXMIBE@H$uR
pmbHC: S4?%mZ%6?GD<MVHYhGcwHXKBjemiHb>SGkY<yF\^pS\5+Ila1b!n*AqTR9i+aM9Nu@XP:wt#i>^iQnL+
IM6Aqj SDVdeNa&DS9!?XyeHjJ8A!eZh:>F<R5B@=iKDt>Hn@&Ejj?T!bFndEn$Dq/h<%d1/m&MttJYPnD>yn@4
J@$8/W ncq\FX=kQZEy%+H\hdKA%=#h/a+y4le8GL>:MXJ86S\ZF:iCnLQ&Vyu##9BC^PQY=ZSKMpA?&c5n?SQV
\iAI4# 1!:YTpDS*eDTB8kLdc8kHTwuQneQy1S#*Ecc^aR<h@Kwt%ElCN%nw8leN1%Y+=@=wZ59$P$!P%@GAp/i
hTG:wI %@dqeTkJAda5ZQHEhFL+>>Eu\5eun4%^!&nMBX$Y:E95SqcZ&WFZ&*!Ttqd6\F1aBa?/iZXE*4PiPJRN
nul@MM **Bk&:yNlc/<:/uiaD*BhaYMBKPGi@I%6^V!S1IGV!mb>N*KV4lHtS@l=K+^jSP*VY\kFQWiphjSNYbc
J6iP/D y4Y>PT\I1lm<llm$py$IQTmN&&=$l!M\G+wem:^uB9Du!*QyM=B/D4T@^^MYp<iVNp?CQ$VaT+#dl*MC
JRM:w8 /yVe$md98jBbyRbuJ?\F?KGEHAdw#\?Wm1Cw<+wBSqbWRwlM<&*Wy>AZZpJ!?5u:ki=Y5!i6pnZqytpn
Y*#dZ8 \>m\Hek:6LbMwQMFP54?N1EZ>FMmbJ@cW<K6R@ZI@RbCH!8PP%1^:\iN+!\cR&jh$u<!PHP5!STW^Y/!
juXBIX yIiQFK6*!+NT>$YHiB<NCw9S5#$t+?:XYPK?APX+K<&%j6l@bAqn8+:qP&eqJ84^:5Gh^TY:A!N<4+?S
YJBq+# bAV8I?KaVMcSYtMQpnSE$WJPVIpH$hb5SHF5<dY@iA8jh#S?qV<GWb4P%X6^+IRt?XVKJJjK<t*EyFK<
I^j$hE nV^VMEhwIj*aI6FPj5#F5EnFn1N=WVmF/1yGL9<TWBKjGZFw>WaKbda6!MT#J9S/kwDHR11F\?wX\49n
mCtjpe ?e@n1I/^q$iQ1ZXijn&5EIh8<X!D>J:ASE4WW!<nlw1lM5D4:LptAT/tw+N>e^SChpc1w=yW6!L*uZjH
jMTnl! k<y>jFQCe+FK@5Fn!5?nW96Ac:ZJB$qiyT+c+yycMtH=Kq*:tSPVMe>#Zm!1Y#wui$bq\>!C*4^X<wjZ
=9%1?< W$ck6*n#b#>Rq4p6^E+YmFiXaLZ!c>uqB@ci!JXcjF/5?Da/GBEQp:N*jH5HeSB$:6Vc!t$umP4!98=G
M+?Pj! l8=^X6RV!P85HaFDei+P#!%ecdt4F%lhB$eQ:X8*V1>LQYde+Z4LMT&nwXcI?#qH9E9Gcej<B=Ti5/5P
8QiCmd e*!mbld44yTQ81<tC+/^F5:^jd+heh>V>YIA>du*iy4K&IM=:=NWQ&/w\1=e/kl$*PG#&5yHa4A6+E+q
-A6P?D 000074d309f001202b3 Page 374 of binaries1.zip
@j$6=G e<D&iauB$y4qqWMS$+@CK1@=#Xa<Q^<a1jA^SCaZ%jtLh6eJZbZlG$t#AVe@WZX:I?Xi/N+LXG&@d>nW
QNWePM YtRYc>S9c5knSpIu:d5yb&n8qkmV%AXy1<XceT5aTVt<CwD61@/+jNKbM%qk&89DadjKW&+LtnaePKHR
Z^k*#9 KcNLcdS^I#tDZ*<CJ&bDwj\P6&ImZ>DSkZb=^9SI$/!ibK<1AEpi8t$FH8aktVq^PGQ!<XG^GjQMwAPn
C*5K#> A<YHDtZT$t1=>q!i^BGY9ant?>LCu<c8q^H1/@e61:=M5G>iTHNy/ANFtn6u9@$y$==4@Gt&a@m?$$XZ
QqTbI\ Y*dREmEiy@k=nE+GWRPCT6+%^*>=9kiQiVm>N=I4R@LbhY6XdN4?m5NVphaqTbM:L!8FeH//JPZ&XwZ!
T@9nRI 5Ju%>KwWq=WW=1L#1RJ56SJ=+Ew:nb9/6FZ!jeDh<X$B9EeGSJ4wqp%6@Fq:FM#!qbJAkB9GmTwPX%Y5
\4SB=I X9u!t@6cu4heRKPM&nIGSBMn\V>hj8@^JQtIWZE!<%heGd5HJ#i!QhpiHHw6=q$%iNCj/+8:@EJQQV\X
T5^+eB $aa<4kLp?yDVh5M<!j:$pRilQJNyV?LMu8!Y:^@TTuty%!Yn4?=>XClkIGbB9PGZ+ppZ#B5ndK#C:1Pe
JcCAcD k=:e^DjaZYFKi8%PpG6CDVL56>@LDMdWD9dQ=4=/e18\AyXKeA%?l@G:Q?wJeLlJ<6$45bydch^JqW%N
$!Y48* nQN>G/ZjHm+*+LdZ&CVw8pwmZ%e9^YuyApV^R/NlWqK*e8PcadJNa<LNn!4eEN8?phAqP<ZDR81iXMa<
+6nL:I t+*BRJRIYw&>45j5pQJ6AX6*8<G!hm=EcbZQLJh\ClPalkEEG$NWPWWyh/@^@SRL<w/Zj?4yeWQ$jaGk
p4atbq \pV5PmmIiE*^TRGF^6$H8E#yl%\/aGQmjTZk^bBA:jGk/$Siy+yHLCVqjF#AMtPQ6SnVwi!T>q:#$&LY
<+G\JA PhDaQXPBBiu9#p&ww@!X<>9et8L$kb%*HFXqHb>$jqL%G?Me*JE%!idE$?e6eDBIb5b6TYa/nuV@Qldc
44D=VK %@eb$edNEWX<^T>!JW^$V1t?!?Ftel/</=X5nGTn&+HG/>^GMWl\%Cw<m5bJ5RJHneNnINI:BlWew#t8
QNtY*% Q:!j@Tn=!NGS>*GYLe</i@i%Q!#CjC+5*@a$6i&a^=Q4hDu?p:Tn%^Ka<B/pNGLd!4\4=$$&AALqyj%A
\l$\BY 4@Q/!T>QXw9B<F?J$nHeu5%alP9Ht:j>tlD^TKSth>BdAKRANV#?^P&>t/Ba@d=\j!EZ6bN?aq#<E:?5
I?FL=F >yhJjmDt@w1=GjY5e*#aVM=:<y&C++iW#?P%\j/yibGw@qASy%ubi%tHPc+q?wMmbE@6Q9:=Fd:i=c#P
M1%Wcw hA1eDyPtnHEAyWDVLq\IM1Qhu:MVRJKE/LP#Bjj=eG/DekHb5*Iq\AS>cwqkjw5dZkBCqRpJd9jlmNZq
qeR\Bc AE+T<h5Fp9Z*!CT%Q%DFTjK!cEdeI!:1?Wa#>i@VVEZa6uDCEFS@GPu#=<kiXVnlN/?MCyWMJ=C@HiK\
ZP\wCK eIL/9+#p?cQNYP&@D5>S*cVGJ#R5ZM?dER4j9GDK?Hc!GYWG@i*N95*+GAKB<LZkTXk+u1\GX<YTNky=
NZFRi$ k^T%DeK^eFWeDw=Z^&&$da\J>>8>t^+dEudVEL:=H@4>aK9@iLYN<Y?/tVb8*!^pIlc866GG*?nmi>hR
euCuSl Aqu>/@M*cjlP!?d=h>CQC9R4<h>A*\8STIT4EhY?>4a=CDY5?5a^<i5^mcRKX%Mq\MpE@EcHcl5WdQT1
FA:^N5 lqj>iqGh1Ly^aRNA*u\R<dhQXVKelN@k#AaHNl?w6tu!**#hhyMXt\Y/YZ*q#Tcj9u%8$4b=@JXPE8E4
<TA//m Tb5>ENZWj&9jIINE^u@qL^SQIH=6&D\lp\qjL=CIt!S5$K8K@iw?I8KJeMItthmN//1pDVI*MB6C5+tD
##GAi5 j8@6n^V<b^K?<?w4%h>QNt@D+Vcw&l#dBlM&B1>P@6Qe@SH/jWljH:EJXh<a^%iTNwBp9Ny9p4DJmD>*
udBHkn ?Xj<X&aV%Z=u#Y?Ed4b<uRjm6!dC=1&@n&tn+Mt@T\nlD=^XI@&uRL@P?8aEdXHWN/>6TMHtFQ!^dE4A
MD!qVt >\Lh4DdF=L5E@LX5WpatEQ:&<K?C5CE6$K?V?k?C1pamj^YCVRH+a>qeiN<LhLQcuQn9A9DZ<yYNyN?E
jRMA!> +I@q6#ded^V5@YF<Hw*l#\n*CR^T6kwKaAS?$%:/HtH8wV:Bt!?Bd+D\j*hjpj>4XWV?4%ZS>@J>juDj
mN>V8p q>dZ8j1QkQ<Q1wmI^j>HFY%wue&b^PQX@1PK9m:S9/km9Q4@T%Y$RjCt>mB@G>DtbG$id=bNQjlXGZ:Z
LJiXMl YX>Z&9i4t\%jJY<D@bW%1t1@T>>@y+8?/1B988l4?$cZZ/ZuG+Plj?V&Jy8?E@4:m6qw&*\A+T?D?E*S
AjeC1A jhhF8G@4GIj>k!:/ZS>81a8\*/n:!wY9b@>iGcu@64aI*/d%9%SGSAL=Z!8nVT+ReZ>TSpR!?d>VSq@y
#Xk*Ap @u$1@/mNN8n@Z1DjB@NQ=j?wnVd=?H&K6>SGc4>^:K@6j%!D$P>@y:=Q<%@L:>4wL<Q+*9djcmQhIH@t
P9Mbk/ q54w:&G&BQZ@Ylq>nh#>q*HL*$n=a%KT@!WY=*5a<Z>med:FE@<+F8hd@MBjM1Q<La/C?NhwCDZeqlEa
R9y>Ht SQ\QpcydS*$RCV>Gdl%yRmV?EEpmdN$u/ahIAt:LiBGm/k?SPMKYEVXE6S<m@!uTlQmu9+!$:<B@nlQ=
Q%JCHb Hucma4=XBAyS@i>^IpTm184@Sb^IZBwwbmaN:1<ttb1k^&%Ji<mSa1#QJcMyEPek\N8*RLa5ZIRn<8TA
a44S?V V?EV9<YJhJmG$+!K$\\+Sk&d*Ekqa\ce^5lytpH=*cVe$e^lqu%=lkGHBHKRb1ZwCFJ%m@A<d!aJ=pXp
Q1<^Wn Q/Yh+BBN+?!!VPyn\pZV#5hKq^yY/LNGqm+Lt^HhnXXVtG=yAVY$eH^KwL#^>DkVYY@hA^LPGyDFn1d+
=G89BF >!=nnm\yn8@\dw&PIAcTLny9@HCni5/G:*4cA*1hXhhCpHB+ij@%YbQ5MLZ<>+:P8EVdp#?D%X8ppCY^
%iMAEk PYM?dh8Qi4^V1Z>89/9%M=\%t4E<j:uk!^QbReYyEC$:tZM$tmc!Y6l%5tZX5AY&t+*mL<addbI^San&
6iM%nc 4ZpGMy6nuqh@aj&ew<&MM6X*NcX^e9:ce8nkaL%$RT%*b%DP<LkBiLqG:Sy@/@LXcMQm\m!RhQ?S49PM
HTa&$K KQ1NqM*IEtwYqubHLhb\8Qh16J:DiSI1nKcKG%&npXW:KM6%cC5/:cum$QVIM?QdJn8t11N#n4*ZGk!j
mAT8hw dP>n/FMiD\jH6JSBCd4WC51#KN1u?P1$:AHmIK<!VC$VPEeEKi89VyqE?$Y1WkuBND\W<^A>^*qS5@Wn
A?MP&A j8nIQcwY*pbThcR@6@!Gwnt+5F1@ej/Yy9/q&N8pi$yy:lwy@8FcbF4PpZ8PIJ#@Hb\%&4&=4ta+=#Wb
HK$9&: iqhtnum^q9LaSqe/P=&J/nK<n:a$EinSIiBc8XGeX8C#=!/1ZD*IN*VmXa5p+WYLb=pqKp::4aH@*te/
Tp6lJZ Hbm?t+J*$VLb9>4PXB<WWJjlE%n=8cc+j:!#!PAY/j:1CuLK&Q>T/?%h\<J9dw&#yYd*6jE4=d>48@%Y
KG:eJC mSpQ4d$4XR?BJZRY?i8HunW<EJeB+\:>BQ!C5t6MJPPXF!#%1&8uT!66aaY9#Y=HNnE\X^1hjWWVVp:T
BdHlZ6 tpih48hPQ\m%/cFl$/hnLhAQqp@wQeCc56bd:%9jq4PXnKIJX$jHFBp/&!*=cN9$&=+XZ$ZqyatndYwX
QQ9QAc Mit^=8e+Zn#mYK1\FVtc4t&yZua/*cJb\DJ5yPc<Wyu85>i:&/=w4q<$\MkMQ%Z^ldqeBTkPmJTqc$ph
TFE8nt !!Kq!#SKXi>Xc1C%k*D#S<<?H9&eX8Tc$jhkyTh/n=Qa:qPJ?>D+i+nYMyiQaWRab+=j%WiG5$V1c:Y=
Aj:D:6 N8@%&c98tR9+46MF//$14&5e<$<@+R9$CWI!Y+J89*/>Z:HnVd=Rc@96%>^&XWp6q>kj5K#<66q/q^$5
MCncuY qGuaL9VB#nYqVj#W&qTSSQIV4R5H%W6pt#@MkE$W!!lQ^epPauwFPAQchjAbXa#a#Klh%IwdJHe&>:JP
1m/yJ< qy&4tjLHdZ6!kTjhhL\Xah%NbZ/<%6Y#nMBjl5@Lj//C?$=bJN&%p:NF=MaPM5\CH#@K<\A8/^u/^Hy<
/?NVJh *HHhR=q*46YB^CiI!%>c/byE:YW1Q@etNy$AC>jalVP!dNB&hT<iYQhE91Vj98VSE9EayWlmK:P9ZVT8
X4RciE 8bNmA$W>J5mQ=e=clJW+KJa>:H6Kc=HBXVltuVB9EcyXqMZqPbWbc!9uqq/:+$+pyE$lw+yjndB%/TKN
Cn^P+6 ?&W9M5i&m@TSn@5>tm?u+mZH1^MQW!Pc&6eqdIV!CdR:eWNq+:T#MGq1+iLL&MKDb<TueNEHiS@%mjT6
AA$+di uBXIM$l:?9/BJD*ac/DAE411KTZKyQR/+a4=k81Qh!uPF>:yl8N/hCyEjG=I<?I9KSy&T+u\9NcH#n>%
*!1>YL 9bYuZTYB&#Yp@@JWSdiplVY:%y*^A<dC1:=Y+htu$?ia@6c%i&>>PG$&kP6J:y6%P%pc^?hy&c?Y/N<!
P*dm/= *y5*JNJ&Ykh6YHZ/:qtw?<PXcu+j&bMC!?N5%aWHE9QJIG6Hc>>cNGwAkV8uWZZB:tyA/eW#EkV>qtkI
98\@Q: 6/w/KTJti?ikj@YDGJQFa@YY8mtli51Yc8Wpa=Sd#d*Bq<cw^Q^*?Vh^YluGD4F+Nu@+ccpk^?%?8B=F
HRl<$L ww$p9%/PE$#SNJ:N%6:bNj?TCcGyLQZikNlKS!dJBTpQa&ecPQ?</%bF/1YmW**DutaW#+8akq1JXNRJ
Ee=im? F=@wc5>V%$BPlh9>:^^&:T$K9BG&ipN=8\X1ZEw!V<qpy@QwYJDNpJbL&Knn/y$q\9qiC=DCnnAqw/W$
@6bt8B ?Hmn@RD+VK*YmytlKbtL6#Fk^hdGM&@1?n=icaXWGjmS>dd=^!cC$XXuWmDq%PYjiW>HCS6//K4XXb+6
tGb4qR Pim5uNy86cS%b@lbZP81HBWEGC/6ma$5EPbYnHN+m5yV*G?h>lFbiGu?p:$#n=dp+%!1t9q8Bj#5tjGD
EiHpqn Bmnww:6up<XaBjHKJ=Ztj=uQ$bdAP*Z%CjR@L5/pmjjQ=EIub/d6u&1jJVDKd+du1Ey$$Twlu&yB<V*G
BQM1\C a?VDS8#t%M9Cd$V9^k\KD$c+Ky=Z$JR9$bc\i?de/9lwwj?$J^la8Z#!XSB%ZmpaC6Y99uVq8C4KQ+cX
=llG*& ?@Lenj*N@S=/h*C+bE&bT:I9Lb8E*w/a:hS>Jlj@IEKVn?/aX*hFVut:i@dL+#88BXqEJ<ZpbF@yd^+5
V#T$F4 B5#?jJuaYALJw6t%uuG<VbIIV89p$c^uR=>kn:meh9ZXR!J=9mEdEX1Mi*yb\Z9yFLJ*1lp*&dD/#pQ/
1tmami #Ii&qJl>LyN4JQFVp=X5%\@RQkHFnXal?&QLL:uhK!%jNX9$<J8c5$Y?tX>V@Cq@qdAaY@jtwp@i&>/Y
:SR>iQ H1&b%*\K+*5>4HRL!668nk:n^44Fci!H?Hnp8!RWJ1HdZ#I!:<Velp6c=1jE#lbc5QHW^FwPbXiiI?Z&
:y1tWl Q81+w?>yVQMKYXBEI<a?V:$/1@pp?<6>d#5@&ySn6ELWHX<6$E?Y!$b$^YH?\$/yHhi^4&Im!yMR#wjP
nMNQW8 HKwbN49pWLc4lE9Z18A>Wc9bZFl?4Mn4:kY%S!$^BXcBwa:%wqJ#=TaCIlQN9y4ZZ6deQ4P8YDWR*%bt
B$+uPa XV6eju6YAZnq/5Qa>yd6HNPbQj56W:S/:HY!L%h$#w9%XJ6w<N</^H*5cT\!?Gn!PGHjE?Dy^&c*i%bt
-A4w5j 0009f9ce9f9001202b3 Page 375 of binaries1.zip
eLWmp# 66e?Pb8=/^mlEtPQFDjVaBZmKuwu*?Gh$wJGGy6hV*8FNuq1chtqy5V6/:*<Y1u6?4WBWj1A8J1F$bCh
6W!S># <8\5D*?CEmTJE/4QCSXAW>L!kSWa#H\uMAZ>ZApR>$khuu*CL=R\#jL%:^$FFtLkNTc5dP=MJAua9C9&
bELWm+ IH6utu<tCl*5$A#RH%X+Cdm%wlcVcS\jk^^^8!BD+>:DDk4tB<*tPmnVW@Rkl>^%8Ga#TeAK6W!PZAEd
PKpkkI FBSQtK%+YJ>6HuPVQi+i4&+8Pqdd@*kEV@F<=HP?a4wqt>elDLd6/M*DEA>QhH5iD:ahVVP@8!eDBc^H
!:Zca& Ai4HYK\ldA91STKZ#EF&mBed8^hRj\pD#?bl5bCbD*nkKh\J%^$SN*n$S5GqL\E$c<lI8jJc4iD6CEF/
KNL1lY n4CA9*L^LQeLX?Y%\t!*m>^%W<1?PY^86i!h5&Dh?mDKehGaanX$KcekVS>8!X>q/B6+a^8qSlHaDR:J
89J&S# E4lyycdLAu6*LkEZ6yulY*X4qGpJ+EBVSh%<%AkTXJIni6QWRa+py4<&!l<Bki1JB^<J5n\Ja:eW>=QH
uyVVad wIB%6BHp/AmcS6c6%eZ4#kGTlyEJd?H5NP/R\?DmY9GR8>6/Ae1#/V!#QTJ%Vm*JGad/!V\<hpE$#b!S
A6@V5B EdXWBjACEb*RIen^Elnqn/bW!6CD$bSa?EAyJ!AL>QILkYZJkd+y&>tNeb8VeV5leTF/y@<qiiyNeMWP
eZQt&I :uwHqICF=JkQZ:pS4>=B!VX95>AncE5h+d/hMnI=EnKY5lbSQCQL5kLDJk$HBVpiNSk>+lEKS8FP!&hj
\Y$ALA qB/cjm>WLVn$SFa9B^p#lKTeXd:wWnFKV$qI*GdJ9K:ZMq>eCk/=4p+A*M\1pa5yp\=iButYme:qTPyJ
#^/i4E 1iM=MeYQ&jqF^GQt6nhmhji5KX4B\8@Iekw5:^Q1SLYZ:WVp*SITqAh^a6ikPER6cW+ZQcajbJqEiMY>
jGkAVD 56nPlSle%d?*k<1JECdjAbalE+^&CB+kNRl^+tuKh/lET$8XAPay@GipdpZP!Fq%4KIEVSVjjp:KIpIE
%Kb9<6 tM5#t^tp?\Ajek\dM!VX6X55$=1DeDdIIFdR^IKV&85k*!Mlp?&j8da$Wp%GXi?tqQK+:+JTPdZZjBTa
1n@y<E C@A8BT&bdGZhPWwI+B$NS\Lt+<j$$VaCt1NB+tlHmtA?Nk5XRWTmb<jwqDP:*HI^aVZu\Vt:AwXXacd1
4DMtAI in\<Yb?X=*kAMtj+Bj5KLCHatFw&=tN\:Bt&$e<BZaWp\TStXAwcHI!TjaV8VD4cXKiPQZKWqcLE<blp
\Ek1iB %1lN:DIM9A@WS&HkVk?^In9Hi>l^dCc^I/MeKQSIE+caVwKhW<9/SXHQ$9#NA&d8kttVt91d11M*H?:!
uKk>>S j&j&:Kny&GuV+HJRb^F@\<CiE$KKI4#tqEDq&DQ+wKe$awhGy/G$eCMd4#!chp/i?SLJjqAV&>4$iw#\
=S!d1* Wpw6\$\KF!Vk/&h8$#$$WwWTMj>JYB8dW:\!\9HP<ka*@b^66lVcjEHmtaYWTctmdS=Kbkm8h^Cn?+FW
i?@FIA ik?Rjjdw1%wJTkQQY!>$Rmj/dSMuwBm96%8mMiFLR4tm4b?#!CPV<q5!\&ukICE8a9nKpKAN<Cw%@IBD
Cbpn?n CED:$pYJ6Zik+ZScYGbP=!uH&R9<u6*k*G8:Z!WVkn@Jqw#+iy8RKq=wEa16:iD1h$\JJd6N*HN&%F#m
@VSKDd :V#lXuLRR$>pB!bhF<nmXnXEBmQ^>FMi:JR$8Ni&>EWqYLm%hV\d1B\%LlA>jpw&:D$GG/a=uimiG>^k
IiHa4C J\QKZ1@EY8\Y#S^4eIqiD^IMXNybZicy8IIMuT?1*/pd@A6p=JI@P#5$cRe1?\W\btlDFNMIqwFCh#H%
Nm$bNQ b=>Ny?:$=YZWi+lb?pHcW&Xph4PD8<TQS?^$D\qeJ+LeLaPBmWI<n*$dPR*jmZQGDPt!\\dHnnIX4EG9
\6M5>N 9=!=<&CAE1>\h?tC<8D4VF5N$99iE*6MTKXw8&*$pc+>?+?Ghj:mG46dJpBu9!4JI?LKj6E#R4IQ%KI8
dR1WIF iIptAt*#e<chI@j45I9mS>q#wL!lJFFBZ:X5:tBPYeIECqDyBan*8ShQ$X%WT^yHCa#8*8b4VVun1*wT
MWJ6yA FGhFiHjHMPRN?a*I9lMGQCJ!T5\F>&%6uIkm1/:h85AceFNh\Pl/TFaMtZbiCqH&W\nWdk^pMBEB6b=R
u*TE5j Mt%X4l>\J=PMM/>49EqV6H%I6B&qhhcKCCEM&p?d>Ihl:y:aE<tl@DbT!/aR=iCIp5tJAcSGbhh/SZ4w
<bh5!@ N$49PYGGMEp+GLEu?KTkYiBR\JmP@<T>AFX&a*y5&Lbk%hpy>MS4C?NZASPNaY4&:4aItqZLiSW!C=Ei
p6/Sl< Ln1J9phX6FhMuW+Mu?^IRh^Hbq:NPCtiPq*aAGD+tCtq4t?npC<ja^@KcI@N8AemNI?:E?+^TbSQ6qRi
@*5w^5 TnY9*t=8?^t?DBS!9ZGQZc*ttkhu*nY#ER6I@eGAYE6PG=V4uDa*@BVG$RSE&&uFLkLe?JYQw^:=AM/t
9HwXdB =?VijC!?=me\ilDR*FL&MwduyB!9$HZCdIecqLV*W1nt&JX\6T?=k6KAF:<CZ1u1lGl/buLKl:kk:bl?
aW&$8A YB8%:ABF9SbF1\Wm=ZSi@eP<q#5LXi@umY=VE%\?6*n##FkT/Q/JpJh^y%muhqSHuEd$FL#bl:<InY4\
8cw#/X PY/6@e/\:ybddqdjbCb!hRl589@yEikDYh*m*FBDbwAM?m^cNGkIcH5418wb$#+=cn@pkXbF$@&Fpije
41D:ue 4AuMnE$R>a6K+Y!c:qyR+K>^^P8w\Pwk?H8t&/+L+Qe!Z<c1k!4<RK<96y5hV^5Meu1lLG>C:%>:ahYn
mntC+G yK$hj/SJ\j!&+j1/=<4/iXPIStnG#RhZqab:RQ:J9@tYuS:J8VuZ5mlRPEY/QXktS5AKwSyZDA8i>8S5
6uSM^Q D=VtpL5A6IMWe$8#aF8t?TBl@%hu<Z@qFTd>L*tkTcT@GmNJ^Q<1D#Vyd#bE$4@N$p5m@P>R+ldY5B?c
%6mBBZ \1K&tl#T@&F!@6Ky/9@AaDZ%9#Janj\94L$/kaFB+b5?5G@bJNS?j\9#1!Fa:VeJWFQd\l=M?y9N<q6i
N4L@Lw m#@ab6Y&#yXN@mH!H?!pJQWj>$ui$nc4m9$^pwnhEwu:IbKpl6<Tmj<lp1m?NbL\a!TB8CYT?GMpdt5p
@HX!bP /ahIAuF4yP1Qpjm6pV?YIj\@ePnHMwSZ*Zw?j!^D@/RP%LD@P@VHW1TG*jI>ZVZ<@+#<5^S=lIZDXe!I
?ceDkP GHWMHp9EEnF/*5GGHk\tBwi^<jdA/DLCjN#DMEGitN<&G@AKbRS:H@^hAZ%XFH>$eJu/BQy>%WD8t&wM
n81Suu 6/E+N4*1lI&C*=nX4\wpKJT=wTYh9#qT@$IdeR9cTB8$EZFpNj\Gda#kDSYL5jb\n\n%CV?IwZw\\mNC
4!nVqB QeI\nEAt^m:CQ>AnqPHt+?<V:9M%/e/@JBIH^?MJG&K5B5eVTQ?CTNI@95Y4<@$6*t<1<p?\Q!6\8B4y
N1nm^G >:h+Tcy@>5=59k>P&mBLXb*\#V&D^*%Q:KNm@q*^@8ulcu@&>@#%mdnN5J%N>?:9Dy@9FG+<D+hX@@5D
6L+5p< !X5p?mLn<D@P>MZb^an1w&BnW^Q$LNu?p@K4HCekQ8\GXHTVFmMtIhmn?%wCXRYkmi\Pay%aw1RS9ZP$
Zq!dlt wyeLm8?GnL:peMQ^JjE^T<T\*ZVmNpm9%e8pEay!h6wCq&Ij/wAkTy>#uqH+ltJVuh:VqbY$!P>%$SHh
V=5by* lY9y9+p5+1%+GXQWLM*hy5iaL9LuytPq:AhDkJP5GEZSDE:RCtZaBTp:^%tC6l^bTP1SHM^Qa:GY*ael
t9:QVB QX^/=tGE:J8ReM@Qkb1JTYJLDi?#hJ:wI5qk1yNtaK4nXeLViEqN!<T\uB+J%Wiy*1\XSe\JH66mp5R%
qiVS^Z ilKp<6:bpclR<na?4A!nF8=QdN$dVbQ8G^6cich:6NtZ<>XuuPS$jW^MQG$Rq6BB/aRqT86SSC@yKdGi
KGchNp cmV4LqYZFuW%N*cm\6bPI=MN/Zq!F5c4nWZ<%c8=+DR^YPiqtXVa@aV$Cm8^T&b>kZe9/%VRyn8kPiF*
PAYM@$ !S&tupTD=<J=+qk&QiQ!iQdV>QYtWHa*tA=N4$i&=@t5/G%X\ea9bb#<u?TLPcGjt+bNlY#1=t+IlyiJ
*V6h9A Z5!PuN1qa=q@j%6Qk+&kQCYMGRMn?Bj\5lHB#u6pipwP!+tw8W6%\/BN5qAC6TQ<yHl!RJ##HpKa/W4D
C#*:SN TEQNk%HKe%mJCM:KJ9JJZ*deWY%C#96uRDWB=@K*qW<d<1TKaqlJX?5586+K^\PQY8:k^DW6m9WP!i/V
qY88yP NL9wD%8c<KH:^11wbpMS<1de9qIJHeG?pu1*G?bL:5%RK8VnEc^^Xl8&RBAe^=cdHCRuP8pbudkN@FpM
IHIIDq Qc4$V4%D5JBLB/KHjmI?*PjAaMNqRn:Gn>jw5*Mc9>EEc^Cme>ub+t5FXmeh<qjGu#PCQ6qMeNd#iw4n
Sl5yVV P9V&eSm$#PtV*RX6PMb/@jMei9aKjW/*9WN&XV:Z//+bDbkVN/SlZHX!>\FuyP6EFT<&^P4I1wdE&<a@
4GbH\S Xe5FI6\%ty=mb&*h$yEinBy@Sj<4Zh5A%BqVb!Mu:ln9K:8M\\Zm$biG>4>>=Q9<F#1*DQ*BJEXh9*>T
BWQ=ld :hBKK4Ihe<T4n^\R=/u=$t#!MdI9*Td1X8@I>m\WQuVB>QG4\9IIt:q5YijTRct!+:a?=5jabeJj1SE8
N$Np>F N$Ta1V=P*#/%Y?Z!$Tq:dQDKddEuwYN1=J9y/8MB6@\#>jc4:4>nWTLq/5n9$9QPjj@P?FhuB9uEFuSM
>Wb%NY aMTYn\dMJHC$>V8#J66DQnKi6VVul5?9<<n*J\@PB/KVpa$=>CDBQ1S=WGc*nByji*15LmH1eZ!d14?Q
5Z/u&Y $/^K&IlbjP8hjnC:5IijTk&59h$ydi\XG%FAl\N:iip=6@Qbu=:#JBbW&PZ6dFM$1e$DXuWyAM+N*JZ&
iLJK\c @n\MF^kd6!\WNjC6p#uNdmBkp:8d\dCWm$uWnnGhIZEKKm/Z95cpDV/MaLQweSYcZWyPW#L%mD=B\DcG
^Fd/Kn Bk/l8Kt>Z*l&:Rh=b@AK1=pyH&R*VIq&8y1MT$CT8K\^H$W54#Lka$J:=MSTJ^>^HejLnY$@u<64/i8/
9>yC5y m%wlB<#SF*NSd$yQCKWCw?JTy^TVLKmK&8WAS%FGW!dF4I^tIl5Xwqjwj&J%ZXTmpw5@!apNet5IiNw:
tD>@9Z Le@=aM4l1MEiEH!=jd6W6#GE<dPc9qk6=HRpKF=>L>W&<<Kka1LS56TwNpE@=+^iMH/=dFn&6j@>45Q4
i9p8GN mu+C+nIE#@SMK:cVHmi5TmQQBy+=I8j%P5PGR4yIGSLYMG!<Fu>:&@mC>X5wc<<ZtH:*Pw9P@GnpmWyB
yGa@E* 5phRQRFa>#5j=K98KFERVid:p!1B6<M=A4NPm#HCmt!%C&Sp=n5heEbNn<@jTXW+jjmmce:u=%c9>cY/
P:!WKp HP9qjPJ?:WWIVN&>im^\aKY>lRD86BWiwm%YcyiRb?<Q/dKh<u\?EY9w<5#BbTT8*>hKywL:6dW8\RNT
<Ma@5c Q*Ny^Gj*a:T8=>$V<c!D!@t8+tj1IqyGdjI$=yePK+FPHPK?&89kY>XNDw@+mNC\9?ba@Nmd/SNTN:^j
w?Jw+\ ^?VPG?=hN9K*:&F>WB+9$+?d=>$6L^nQhyt^ww!an/D!\mFDqw*X8Q6&k>!Z:B@MV>mFbLXVjh4B\MH\
E++myG SEktDFSc6h$>wLnmAlTaIH:5u1?TpZZht%Fh!j%Yp\a:4@ln>B=e:RAK?q>8AqY6IP/u=VMJ+nk4V8!R
u=k$RK attQAC!H4:FbNn?%tt*T:H/dyY8**D4uWZbYBARNKP8+j/^4dA==IqnSRbb<:cjV5CSmlclc++j6^#BZ
-Au6qE 000aa069d0b001202b3 Page 376 of binaries1.zip
%$*#Lq Z/RF>e@tQ5!RHH9y+bi5kXcIFE8Q>Yaa9uA6M*4#$F+paNWPy1+w^uwS\S4uSq<W4LX>jRDy<w^bq%b#
#T+QmQ e:dHJ4*Ba!ZEJBltp<8d9kK59ZcKnL$KCF%+?an4YH?&eqhQ!wIJGt5E95=P16SN9%lkW^e>kq*\hR&e
c8YIJ9 AdM=LL:k%Tq+tyN*=F=L+tPZ*qV/I<W=#?M&>\&9MJ&ERmHnBle4#?5?Wjc%BkV6B@^5ctee%bC#Q:uD
i1k!NT ^!QPIlhTQi6WYSw>5qB<Z5<WL%ywyD=Y&u#WVL8nXVpPih9GV>nYCGj$^M\I@uQ^+<M=T5>uTYqw%hPu
BPkcTW bQa>RYD<Q%yK6FI@?h<%DLyj&&Z6k^L\jhCuS4$Jm4SK\Ip%TX#VL=C+dyZ:/PKwH*<16j/8WVY#JLd$
$KdN1t /m:4:dL&Q4/5!<WPqK8hQ=8I/ljjJSZZjVLK1Z4DC#5\miTB:pcjWneYi<YbN*P!E@*aql&c/@4R*C^>
wq^6Tj V@DJ*Xm4BqYn*ySyL%q@@yemF5w>Wm>F%4<eZX^M8CL@>GP*w*6B=ICA!db+Dn&AF^^Cye$tQPV#DF/T
Tn^diL HIa1#/bBHX:X^N=l&!PRi%u?wGl@<JKXGMH$<M5lSb<wTCcGPtMmEjPYYleh%ySK:dkhELKHDE%@\#W%
tN/TYX jt:*8y>d6M%6a^?4&My8i?Hd$w>&=%$yHWJj54W?WZ*EZ8wBQy<*R$1IK<aWE1JS@JtZKbjkeYn<QFtN
%RjN&I a!Y6K<wne#u%+Q+#kwIHW8yj=?ykHZ^Ww*LPHu1aKcZ=Mhn!P88#NIN^6//uQEhRwd9$6ZtS6h@6MP@c
$l$IbF Z+!#d$niQtSIN:W1>qpQnc>FaYq<^j$u*#:NTNa>M8J>jW/cyiL*NMkR&wyD!LT<4pQLEKi4*pwatt68
?l6MH% p$Qj#J9P/E^?by1<cte1B@@+jDuub5yF$/PA88ZbAdGj1^+$Kww8JQSc#$X?1awy9FD%1&@4M:T?pu8N
Rb9bCY #1\&F9HKRK<N/Rcy/iVIed88ye5Bn/?RSwm1GJijN5pAL>Y>WKBWLQF#?W$ZCKl#XeF^qH+IE8knEJXe
%k4X*I ei\WbSt1/FTN:FbmTmuN\@iYWucN%P6P8?klJtYL8jjSG9RNDw&W4KepBQA\%:PaVw?PJ^R6G=+jVw8L
PbKTWA P\hNCS>=GtedeKknah^+wDpIqXcBjt?\LDGKYXZ#Tqki\8ei:?G:KQd\8SBj88pbZ\yjmG\kcAil/9wq
8G&PQX BYP%AN?M$phqkNZThKHDWd:+K8>t^aJjAa8qKhn5!td@BPN85#GX%hDh:ySqjREK@BX=Id8y>B*5J84G
aQ5Ehw uM?&9ly?qcn#e>=HDFM8M@*=\V9FB5Z8DBL>+a><eeiMX5$hd^t/QhM&^8STL4T<PW<M$dPBbk%T=^NA
*yc8>I /j9EtXXS1LXQhhuNVF=J*=nWm<QHA=cPe#e\R!auR>c8BDDhZ:n$Jl:1QD:>18SXXVeLiuQ+EkiR4##<
PJ#QLH YnI#LAZ8pc==dAYI$@M@IiN>%6K6XRmXG\eEe%S^Q=PW:d/Pw$#:aX=q<Vkn<D9bbaHtZdBb*8A4@FIi
<cARlk :CK!HE:8<?*X1/CP8E#I#YLV=Km?m114Rwh5i8Wl6<+TeY%b+EWu@=E#M9IWW#lFHk\bYm49Ql5Y#^HG
*PG!CZ nnWSEtwyXY%bBENibTR??=k%6GSR*pB6u#n5uZL#Xmc^<w5Su#tw&>Q*Yh<y\WQ:\dJGZFe\q6^N@LRV
R?Qh=1 qlp6iyWe\dWe>a&e\Dui#nSy9XHPlaMkja1$4yl&<Te8IdFb6!JSC**ypDahpHp1=6DawHa1:miT5SWn
k:SPta PN?hXqn>6H>E#k5ei\E<L<e4N<Mdl<hu659hIh4F9Icpyp6unq^VKPn!RXYWBu9&8H/&ALDPp=8Yn8^Z
$ihT$k K1a5ubRwBX@6btY=b^i6!BGujT8P>&h*%=6Z9>?hXC$HCyCnPyK\Z*K4m!GNdaTBjtPiWpP/j>>Vbl>:
+/!J&h Tubaw+CZ$HX5$lW>V$1qAmZlGIZ%b1C/S$N+?PV#m9P!J>B#+F\qRc+iD9Nd&tRF?T^QDq^PZVmH9:Ym
EW@=kQ >uDYVu*>YyKuj8aTuBF8cK6ukL8V1VS!T:Y#>VRCjDwI/RB!>hPQcm**jp9FW?q8LI5wl9e+!NeT!qi:
NM+$pN #b88^YN1Ri<TcSTm4Cd6My:jE!Vp48>9RBBRnjX@!%QBjBNIVq5%KMtk&YRahH8iYQSQN@#<TnldlYtD
kwMKJT h9MD?dS&Z<BpLn*b+Z:YmN*+SIyNdmC/6V4IXGH%5MI6YtJ?jQqQ*AQA&EYccTA/yA/b5ydY4d@/Tqi5
cj@A5C C9VJMGlBPk6nEnX9Ya?^wE>Nb:CY=*S#Fljak>=d$4B#C:a+Z#jni6Tej/SHZADM5*e/<+Np&wPjZ>8S
#Mj%V& #KWP^LWZHM<?i<9\@A8N&i/+QqLCmnuHJ$\cNhVGTIlYq@MW68D8qMHG@9cejhSV\J5InnZ@$*!iRTTc
N/k@IQ @eWk\&V@qc/$kyTGNT1ME%TwF9At6/u+iERuBX$+nBa#mYwcSp<>Y#p:JNm#\#@Kd$>y>p8!S/!BdBiM
AutjYa ?=Wy!F*@bID<<Vy*TQl:Vd+MiQF6t5#19qwI*>N:kyiP5YR$hI\:TEp/hwpWk\bVw:e*bc8%H&TMmwI@
A^ECt5 ie4b?M?D!tYPGi\H@d!kaYEp+A=!!^p/Fq$XK*@J\KLbT6+n\GdhIXkyA=I$Y=e+GMK8iWDlGM8:hcZS
cb/5<d baF4j+:iw\hn>jHGP*Z&NP&H9H@QX?Cnl#u1%SCjpTYV>/aJW5e!BLJW1FA851<6!p^l^aA%Gic6j@C<
B56eeB Q4XQ>>n$HadZGw5%h1TmIZ@=FjTiTGmE45?i$w@ecX/Yd8+u\R#*AQVecqW6=KReuaa==EibN*#!/MJ<
WPmSe1 In>4<e\dHj9qS4jAqJ?NJ8*+Z\R*H>Dt/HBlB4nIHNlDTXGCd&%nX%Q@L&*59/hc@6P:Yj@nC%up@!WP
pknR+Q GQe6mjMj>&DEaj>qJQB*k<FjN5#:t#GL@LhRaQ!Ybn5!@whIHH=Lw#Gb<EPpKuq4JQHH!K%VAbJJQ$b8
yMItGK uhCQ4QynJHb4yNwQpTT%Le%>bQKQpdm6PcV?R!SSjW8pP9dH!K$N%iw@q1F@MFT4@%mGCNk6uRD1Q=al
$kA6$D @NbB+iw@qmHe%4Pm@tMb\yG&qAV%H<9RQ&^?11:&Q!N@LEME\ya4Y%*>j$Zm5D<YI4\caY5w:q>ATX6D
m9*#RV j!^GiBJ^c!nlj+j?YJD?!aYA\@+LhaV>B^d@YJaI/tydR*<5VQ@kceFl!j>m9bG*l9:=D?%*+N@N*G1p
eSj%uI :&b86j?a8Rq@j+MRl<N8aietpkn@X#6ceMqpBZe#+bJ<wJmb>qpPwqlcV%hIjbT#54w+A?T6$$8TPt:I
l+hVd< ^T+h*E?D=^1Zbe@E%i*G^aq$k=aMaQ:a+&peMM9MeS%RHB?!SN\@#q%JpyJRau\C=p&8Hw!&yqlTBZSS
@DAKwk 8y##nHSnDy6t/FeV?Qtj48%VGY%bPcb*TCK6d9GBh?5=!<4d9uindGF$4HkTPIG5+$?n=ceaqAm&5AaX
=R$+q/ ^XMkmFPG4J9Fa&BI<iadE6!IS#w$\?&8jPBP<?Bauq>AHSmyQb/m%S/h<>VB^!@W4n:@Wlc>9Pa?X!CT
\/6Gja TE44j*6=JD4RkiE>>MTAK$Bk\MyuQV&l!%KHT=<Mp&#T\$X%$&S9/Hk#Q@QF=1#CwHM!D#:#%S:lGM<+
NwKaw< H5j^Gd4G?@=Z96nD/%@mkbL$<jaP9#ZNc:YG$:AEHe4TL=i\+%cEDwc?:teIVqMiBlYW<Z$adXK\QHYB
ncX1lq 8&GpkiYu%=RJ11TF>8^c<h9^DG<lBu5X*^@qQWTI56cW$VPVw4#9pjF:!EEN!HpkeV$#^$pNM9dMtX$:
$dLGSA %5>8>Hyt&1Q^G=aQ#?c%Gw+bKjWq#iyHJ!^@DJWE?hmAimw9CCMHqLK:^qGp/MHkTRQq$!d5PG9mn4FL
1W#tGW nFLt@V5#qChtYmEWB5E/\AWEk?bw/i>15lZwEkKy4C&8J&VG$V/cFGZ/n#ZNFF1VdIQ8PHNThKy@&cah
I*#5$% Y&F6alA5ekkGLVqK@6WtV@k#Np*HXHFj9PmJTqeTIp^@:K/k<!>P%9X*Q16DR=T5QwFIAw91/e?Qc4#j
eFWkeq y$!#68SLQ=N84W*mwH&tINe5QWE/PTbMA*8=A%1c!lKH4qh%5yJ/d:T5NN#Yu&u!5NWSba1HpP=Vu8+>
A4^+=d *$F^icA/jPRu:e8l%6WIPW\J1FBtymb9G@1NP?wtTmmtY6E+JibFXqi6?!<??&mD6F>NHdEDAqY%b99F
EDYt%R dpDQ&LM#d*8&\/A!pq=ytLA=anQNB9l4!$m8cw#p1BG^aK$94d^k%5y1lIb!pP+!CdDQQ&1phq&qP/DZ
uHm5MZ caSm>hEN1q\/i1N4i>Z%GRES\X9E<PcY#FeYbb&nQb1QqhY4V?5b=FDIiYa*8+Wn$QnR6<QPZLN64*??
B%qe@c h$QN&e\$ZGy/AZjknKib!JA&X<B$jC*T+j*<TNnn&dESZyNF86uPc1F*#TJHQpJ*mLVteAIQdN5ZLt*k
5FF$T9 $@hTK9%bGnncV5j\t1dI!/Q:V5J:&$WcqFBXF+h#=1\T#/a5PQpY5KEBD/wpb4^<qe@RGmI$Ly9\<yNT
G##STA /&EFN8chJ+Ri86W!dNBqS*+/hXwMbemD!yt98*u8!1tj=CQS^jNYC^NCm1R%!<pticj:E:\htA6^h@Yc
WLRCJp 8C?IE:tVGPQ1:dLYA1=/VuV@M=:u=nWlFm\Gbik5SMtn:=LSc@ppJWZduuEBu=FDV>^Ri#WWb+>WDYt$
d%1:j9 &&GY%Y9i>NbK:kL5HmS?qPHa5RJ%1#/kMINVnik<K9G\$>:QMahn\mGiCbEk?6deQVejQ8S\c^?P5yB^
<F%eKh eV*Da?AN+WDN1XeN*5$X&e@p?a4P9Lw/VSM5Ln\j$b5&^1yIKB\!quZ14\&8:ct/hi=\K/Vw^GR5aR$c
?jRaay QXy5%h=SHbPe*<9Zee\\S%>kb&eKu=FQ5p#W+A6P9Zcde+QVjQQ\n#GbFSI=4&Jymq><a+F9SuS!H=+?
5%#ACm H**K*GeEYF=/^?6PW+db1Xui<np1y=BG&HDi9M%yFwEa>/dJ4IyN<?e4P*NNl>nR<l\NhGeBM$A^W/J4
QkejX4 #iN?5ia=iiDSEiH6iq/@5AYFScNQjZm8e%!ES>6MKNeC^VG+lH=@Lt!y\<^K%$m^qy>qI*V+56EE1?MW
AwKTwR t4N>+mh4Z:5VVtdC?nZ=TCZ:1\InISil8KIe%b#bBIteP65k?GTXukta&RqE%wp%AeiwWJ$Ph+LXRWQ&
i9cE># A$C9tCPC^PwPYQG&u$VFcpXn\ZX5XMWeeQL!NbYSm$1/H=hP8QWePI1W86>&cd41ERX9/*jZ<%#<&4%#
j>+p<c #*A@LhcQJ+l^XNSWe>5GtjqJ$HIe:G\$18+Y:hC>R4!yhEc\kVL5#&+dYXEYe:wlP5<beT@V%8%mna%S
8>1%RT qWDH=j$?:wWiydLTH<?!!5W5^5dNk/>WZIqu!L4hHacw%qhX6hSXHK>ZByZVaWd6hIjXjHB4\>FpS*nX
P9*\YN +LklE8^b@*Fj@I5A<a9:A?ah#=kl96#&Yh=#PT/+8<t6eM\EbSuW/*DPEX:l9\J\l:JhmbLI:BY#VW6n
FKe9RN mAI$EkHV#XuP@6^DX?CFQQe6^//WB6/^1cX^uFLL>V8161!V6cN5QCtHMGAAHl^Fe/y:*6E/&=S!K6<+
Fi&Xdt qiyuG@d\El/#!ykER$WE#>9\ipt*u:>&+6Zk>qDVZ8=K@=1W8/+&A\I?E\@!dJ/q?*:JV6wnX%TFnZ%5
MT!MYQ 1Nkw?p9i@b1&b/G?KPnV%N%Plj&X6cy:?#68K?9d:V%SG56ZHQh?LQ:\?%QuT6b#XwGYwLnFa@!i?=^b
1kAE+l w!aTd>GuT^/i*6%S15bqc:nAu:y!RIhFZDBY1#1%1=4!DDi<E@LKL?J%#@FAIk!pGG/Sp%!jmyRmLjh>
-Aq54I 00002c871b4001202b3 Page 377 of binaries1.zip
CS$DiB 44?pZ8@46ayCw?>ph=t*nB?t96m%#jB18tt6=!=@tI@9?H^ldK$h5m^J@Sjq$N8BK/ElX/$C4S?GZ:D4
eFDIlq 5W<ci@<#aRnyFP9bhNZT+W4AdH98!4Y44?+eeypAVlc88EZ!Gq>@hQ/A\N5hnI#8G:/nq@dY@?!*d:e\
9mRBuj b/CJekBnS/nZkqR\988TkcJ4\4XBq=c:dmLZp8+:KZcQqcN&XZReil^TN8>C=XR<JZ141eBw16<Jwm4%
Xy/I%H b5*%E>8VR88#6S>PN::4ieT9bZH5cSue^EQa#1u*9G/El@+%V=F>>Tyb5^VIBa\j?FY$ii4SN5LLl$ZC
%JdSi! ?++w:e%ZwE&qH\@6#qy5>P&Re?ucwZD$/Im8=+JB+wQHHKDXWc6^V@le&V$mS>^I^w9/:eiQ/ZGHQieN
54@kch \%tY@LL\WydZXyAWmnMwG4T$TGtLG5&SCEhGN\&<8%uH+$Pi644XiM#T\NF$E8uMn6JY@HL#q%*T1K8a
n^^HMZ ?hPT!Md$1I?Pu@NVV+lcNDYjk%>=^K!MQbd?/jl%>Q^QX@&kmPbt9PGawphK+!lQccy/*:$nXHjEq%@h
?kVC$n Qn&4c9n$^wd9SZ%K:NJHd@\%icpS8jhj$tyIVQn:+/E=V>b<?XX6Ac6DJ5c9k$^jt?dyhF?*Lk9i*cj>
chS@/a P8QS1qHK*WA$w>VKwiJ5=NPCtJ1qbj%ZPS^HbBcDFiRnbbblMtu%BhZE*pGyaMZq<@IQDEHVQa8Lb>Ka
bB>&$% YBdFniK4WQK^ek/nBYJbba\SA#G:d@b4^:+=YELh#d%@&9jSnQ8n*d#9IGnn:mh^Z>C9W5+uiM1&6lkW
^TmVA\ ML5NDe:HPSp5tm=ZGABw*E>#!*y1u6DG\*q<w=pTD@b$P6=$aR:=L+>$&8FkX*ymRM@#dk@yM4wZy$Bt
C6MJT= knhddTk>\tbW<@Q^9JlD!e@P<LZV:1@X/=eNS?Q$IbYm5bp:NQ8a98!88/Hh>?qPl?GQdLL\9*Ja%V@F
:\#T5P ^6Q>=Z\iJbn5BKQS1#IQlTk$Q8:LjEqC@n$b18^4P8d=>qp/I8qQlPh5>m9Z1T4GYPQPSq$WtF^cWWWG
hhCLhk 9%^4XnXJMq%A9%1Fe6!<j4Z>u4BblucIc1R!*dE8u:nwB8tc&iEXAbj^&P=S%e4@tX?yD?%NJhb&Q+N:
tlFB4t c/eh1\j$:?%jn<!ea5+=HR8JpS5I#EpNA@L9J>!8&SeM@KSu<?q+pqM9>!YXySPqE/T5<tGX8MX?XZ5j
//j<a$ Dw<EE@EL9\Dk<&tRmdeJdlBqmZS?aJIB@6jBS=TX<Z&t4TMi4jtD$^ae&yFijAPq89jS9:DF&a#^yBnI
/DY+h: 6R>Ty6:X4h5aBDeK>d*n\j:e#=ytH%@MmK!J6>N@!uF!n8pZ?$G!lL=@*kR>6Q1aL*T8bGuyCYZ>A9ji
E+Z\hd +V$CA=$#1>ppPG8/lQqGIYyPD5P<FY!4hA&jI=Ci\X\!6%uC5InDpZqYC*Iw#V^*N%eLkSP*tBBY=:*5
E%Z+S% #!eDWmCqD!KFuTa#tteDY#Xnl&VhZTK!BcLS8pWWT#FiZ:uP!I5N84X$*:yd?4\JCFBXXb*ML@\^?4c?
aL>h5E XayLtm/G5yV&+EwFYXt#?Vy=8#w=i>GG$wNSwT@B5/th?9eJ%=@&&ey$Gy:FyVHbl^85YcmT%ct1KkQ5
D#HF9? l&*a#\1ndDJe<SI>@hYwDtlYGicF$JW^Hlt5&=/+I?&tV8wIa$$d4DK:wdyeGkj9lIyiW5eA*PhyH^k\
kBKItD wq9m^c%Z^B&n#FN56q8^QchLp#iKFku5+?KkEXp6uLk<a8MEF<DyXGYc\<CedyPL5Zi>dM^!detnT4i?
D%DpPJ uMc%amwLQN?/Gp8%MTuPy5ycDR&/tW:diy!TtJi*Dd<it!#@5/tNBl1pFp/9qE%W>+M*WEaJHqXY6>uI
IapXwZ niced>:^5%=aLH4/V#?C!APiCu#W8b$b^i#8wRcbqT:J=p:LnTcAPwhZBDQ55hEGMJ8!?eMG>Z=WYAFi
a%XMGL Bkd1q/NGYXLHk#ZjHLB=e+SCCVIEtll/:DJpiSnPQ6Z69G@=^6&wH?B+b#YaptK1:$*uSN5S:^pSV>1:
:GV!d* jWuk+kDDkPqlZ/\G%lNY>*@81hwNmFIXmm^8H?aDK@L&>Ju%%F?ZCbWGd4u*HR:*@>kC8*G<8hEh@4<*
CVGLuq ^?J\?Q<?ERV?l+pkdH\CQMK?b<j=W*iE@<Z<?@9:@9<^@@/?4eRQ#d@jjpn@=ee=:t>GnP?d&Q*RnI9D
%ZXkF: pZ/M@RjnMR/u?tQ5bmVhqqm%j+H>B%MSn9\95F5d<ZA+>Z?B*Z4@ES\i?!?\Y?je\Q%>/=!@a$q1Y>66
:TTZ^i @4==#lba+n@RVQkZYN#Y<+9@F*JF@Ij=^j<L8TIT6y+n@L?RK+L1Q+#*Z<kXu9\Q&H<lX@>wDeV@C<Hc
AFE=nL VPY%FbcA@d@A+9+95Qk@Y@Y?I@<Qb4*jR%a*:Z4E9<jD+kmE4VKYEQH@L?^//cpJ:Ic\VE?MbHweeLS:
j/XbEY 9$$w9lM!EmNwJcAmA=q&A=aP\6T&<XFq5kChKZAY4TIY%>Ijm=K/6aBFFDWLWt8++TQS*y*/&GISTHDM
lkAP5i d:GyB1BuqEE/HmaWEDN/wtIy6MpyjhHEaJ\Ykj8bGlNdXQ:y$JYHhX^/S=8upNIQRPShQcY$k^%kQtBY
dNJi$5 l6DD&N+uy8>D1HdnnKHH!6T$unFDMt^:@aMm1qm4nb\8h!QhS8mAM/ili!hd@dR*SwyQ6pRm6<JbJV@t
G?Q:hi @E&^<dDEu9PR$lkia5pb%@KJX4pR66a/nKV#$68b#IqLZJ^<Tq*m>nD*1Ykw>WS$<En\T*qDTuGBYuK:
C5NF+d Y\p1?XX&$VXj*XnR:q8:$tc=\ABjeXSKQi!CF9LV?@X4L*cNZ$SHW%m\BJ%a+&FREcYjaCBI/&!9HR&&
iw*#A! iukbdlX<Rkh=J%NCy&JiZm#l^hW/mbI5W*^%S^&\VW\:idcZE%$<#X!9=TNw>CWwS$&yNnJc9<D18yDY
bZAZV# PH#hHRa&u6&h*JEtdRLTMBD$b/mwCLVVXP86adMh6Sq$&uXMhE%#p/tqJl<MZL*pJ#y<*A<#VGlpDppb
&Ja?&l Sj86TtE1S!wR?n4b6pLG$j1%cLuw$^1NX/$jDePI/KZqaYWVPqP<eaDq=YIu4W>96hHSu:*XLG$a\PCW
j<S>SQ Qp$uD6*%u@QkbBetV$J#TNE+m^#aEML&4m*D&GD@Ltiqi<ByT=>++IpPP/!d:$lHc4Sy+CNyIM8t#tkt
K&+S*u >qe4++aYQ*VC1Qjb/+Ntbqj<uNN1R<l%YVbQ>/4Y=NyeTXAY&a:n<*5iQDHmMA#ZaIl&<d9jj8d$$H$p
!8C6Xb PnNINPM?4<q^8@jyJBFeT<!m8LchAX9PTKTehIc>GKuyi1Kk><@:ukkGIweZ8qk9my*jJ<Bk$APFaaj%
jF!5D9 VVnKlMdjjZV+Fd<N=Phit/i>$*%\<p!/!:W4^cQ8V>uK6#YM?dH<P?aippaV:IXL4?It&cl$mieQQ>@b
WM6yl? $#614bVT5%@?y5nISj<QdkGcwn<Q1K>VuF$k/+%NHTN=M6C$9bBH6twYA*+a@IJ$#dYB^bqLIYp9X9m<
G@XRP* i89hpRP6uLpSB\jYZkc?H?JnS<>yljm@&JQn<H\:h84G6h^wM+WVHKwZT6:N?b%PiHqC1tQwaRSy&PLT
8b15cp P^ZQ5Q6:#eJip<6LhBk9k1\jjmd+eZSeI8nJ*Z6=!w#yJPkVdY11qZE^nFk5Fj8V@aWQ:SRS%+?Y*9/i
hQZ!V# Xh!nBjQhF!b&LWXDD81wmNda<:eRD?uZtqZi1:1*:bZndkwLeX:Pyj!W>EHX!yb:&Bct4=$t&c!w:PHP
/^GLc5 QeT>cVQBWK^yC!Ha8%A/M>BD+dqdbZuCwpqHjY\YGIF*h&ud/caMXi/FC$:VJGCl1k:e#h9JVV$mhyuK
QHPR+/ MjKlPHV+?#4YkJyH!uXWR95K5@nRVW@AaA8ZR@u/hPWDl/W#R#FSGe\$1dlhS5uu8^eSZuVy+DSB%=$N
W!^*JI Z8i+GSIF58dHlK<F$!jPnumpL/P^dT*i6bNI^SC1+ZCBMH*JXKISA?J$W\&t9dBB6XCFLwX4\q^&RLKC
qm/pPK ISm##^y^i#H<jphDZ$a*:a=$SQB?PGIb1DX@yZId&&PNC*pWFmHtZ6=n?P9dqD:+YiH=%qk9>W/b/ZH^
ntHkaJ YJ6n&XP6&:ZwX\TpkK&GGi:PNpXGAWQ=djYV+d>+%Su$D6+*9H4@YSy&NFJNe&EyI\c9YXn^kihEdq!t
+@8#Pq EIJ/l6=:RLa+MmHqF6Zw#uTXHL=jTM=NFeM=8%N>&kidVuVdbhB^ZILDuZew>m^w5Bli#iN>5c5t/L^e
cW*VCH @TRZqV+JT$Fq?\Xnd+m&i+11y^6k&C#FNPL1V$1MRH4FuYJP8bdpchLQI+5?KXdeelTMSXZqiP\%KL$q
kFMyS: epL+X/?Iw&ddAAMtMuiNHG!Fwu8YY&/q^@Q6pbM\p++KQb#:<d*TPmIHGNW:<:A1qZ=4<H4#HBiu#1ue
nndA?E E?a?ka:p/*u?KTk8&4EpiPl?C<PGHekujGqba>yR6m9KPc<:?HcWcl<?*&B^yuGyIY:y1T+MjJP#:A&M
WbilSV W+@<kF&Ku6nS8pM#dJhm9%5j+TL!i6ZhMlN*8lhWDcRp686!!PL<eND++9\Wd::acwVHCX=1uISEmT/:
wyhMW> 5*mlDjXP#nIt$@ID8&F#!/y5<qJw^WhVJYJ/ei#BN=WuZ=$H$W6SwPJA\dR#d^E>uCi!m>QhtC?:D89\
wj<j@I =atQ9QK</=MY#ZcP::E<&E<?&JPw<qS**MFFR84XXa^eA%66+/=pl^K>pPT^D/NK6CD#Y*ycp*8j1b#R
y=d:ba e6@:%Nhti9Su%::^^+=YKDBdpTi8^NjZ&jhyQy!%DVp:Ly1Y*XLp&#Jy4H+cJ6QL#C=1XjjwJcd1F8IV
Nc1h!C /#%XqV%9ie/uHV>!j#e8j>8=9Wc/Xi$V&/TN^5@&BM^+%4=%9h1F?6Zm&YQZ9Hi&PC!y=juFaPZ!8&a?
%kTPq& T8pT>hBwQT=ppa9Ra<WR//QuHD&NSD5/Xi54$\?N4pi4mdIG<JAn/ew&9Vj8qi>ahY^#lhk!J^Hl#6KQ
bJT=M* lu5:iQdC^Cjw%iE>uGWt+G8kn?=%CJGk?!?q/WcAb=i<DTI>dWKaBNmn%\?/#?cKpt=iyLIL8*k<Ldmk
E9S8yB jHPwlR!>A&61NQdn%=&imZ!RPlS@^*atpTi@?<DAJ/8tl6Q1b\F#M<@muW/X<$pjINbJqlS=X+QhRRe4
S/X^b\ 1%^ht1hjya8wuXF\LApVGqNK85Z8Qd^\>/P?kSYyN@nA!Y:@#%mD6y$^dXd*Y:hhZ&/@:bQa?ld5\m/C
VQwPp% 1aAeKt#IGY8!*//m@%DcIB=!>h^<#!p=D@Lq:1PRWLaLi5cH$SLVNiK^6eym^WEW1St4+\ud?mtHubF6
4piy\e umn4:dje?yVNJ#915QRZ!<5FZM4Q#MIKdp/uSyt1BtLX@A+db1^q9bTqVGu9j%i4Nj@^$<W4/P84luj+
9bmPbV 4:/5B!<$G%thE?&/plG?j/XX\4EAqGITyX?\+=^Y%\94qqH45?jYY449>E1+EFKl\bKb/9Z>=WMhMVjn
?TtqHP /@!HE+QT4\Cb*P?H1w@STNjijJFRH4nPk<M</ZWJjh#4ICV9VXLh8?PS\K/t8Qy6GuN9iSVK+%iF=&TK
NQ*P#D cVuP4=QQeD8X@:#4MJZWPR:mukVyL*MC@A$RSwA/F!R:l:JJYtJ@Z8%N5a1FDAlq1py*&4h<^eBa>H+Z
Xm/bAN S\LT>$I>&RYEN*+tFd4kib^t@FBB#LMmbcC*GAQKBHqHe+\k!k*#4>D&AQ$NPLyRy5aN#Hmk\S/uu:lh
KX+YCG wQPQmk#c>\<:LIEc9yRbH%@\ZK5wn5c+yw/Wi*tA9c4dlm1BFuyAXi:Bjt/?tj=DKbZ5+F8wSMN&A+Ni
A56B9S C/1a*juQ$Z*$w:QVFtu>C<Xjlmwm^&m#>1nQSP\?Zp</mM8\48Il^^\D:Bq5EGCZDYq&<Z?EmSj>5pAM
-AQ>^i 000d5322cef001202b3 Page 378 of binaries1.zip
SN*TuP THy@&*A>*#C:>WJw/NPwGi#!eQeDy@Q$t!p:HtNtS^F4E*&AMPMqbKC=*bM\phY%1=C#?&Zw6R4hIZFn
pYB?@$ V%h#SJ+%DeZmud1hSe=n6e:HNjFYBA=na@#KPT8+jdJe5VJ&/Wqydw1i6a6m5=+4mdl>an*ZcZyY/X=A
W568$A $@:!W%^:SWGtlLyCi?=D*q*pPZb<WJ@@C/Zt/=bYT?m$WcXt?=eLkkJXk:hR6=EJ=<?:JRpKRAY?HIQ:
?LVT*h Dm=pbC!>1kQ+E%eKap\9T\@<LMl>SSCuB&tRlqI@q/i$9*%=KIqq*mbE>I*=/J>W=VNHZ%:ipYPw@$^*
!H8&=4 TXd9<#:@qBY?dtt?9yXBma+X^J//!iiDTWcJViCW9Lw8DwMTGd+TCaQ#8uX>a%c/hEaY$:jWmeEFh<C>
XXTy+u &cMmna!J\u5^Z*Z4n*I%HTl4iS*4aqCd+K=HZ:e<KdT/yt#<^RPH=/FdSSy*y@T$jGLYtXLK^/CS6hQh
mn65nV F>IqEt?Q$$w$94#t?NY::hiK6q>jA#u=5<qDly!AaF9h^\RE&dJ4F>5eq$4Xq+w=B4B>!4jtC^IE>L+\
GKtZZw ZV<k<Pw=@<:B=45nFD&P:54A=+JewIB5aP?eXD>Q8R>u$9:P##FBNZi/bJY6@R6GRVT1qY!\8Y4tZyRl
!t:INe <=$i/QXcn^VlyQ1aR$%jn!kXN6?aF<m%HmwE6DKe&6jFw&dM#K9wjBt<Tp\R+FLw64JPc5lT$dyVj?1J
LdFJ#/ /yGeh9iW+VW>dqY/F:j8k^V4AdYdW&9l+46VnWS$d+CBA:Ca?>#bVnMX%&R8:BGKwwGu5*pIACMAnTj+
Ycy?*k T:cHdFIZF^#!F8LqnR5%Zp^<5>VZhq6BM#nYV<:9i8AaLHZpRdqN<QHyP#K9IMQuMehj*pWM>R%X=Bpa
H$!A5a SkntYIlMV$KSZ*1=ME?HYp:l6k9mAp%Nd^1<FFLJLP^CGi8jh#lji/kI@MY#91qPH4EtF?n\ZB>$B%B4
HqHZ^e $Y$bb9lRn=P+y5J8EKkKDjhFLZIKYR56F@d$q$ePqSnA?K^CXjPI?MbWN55:D<cM9%^Ibki<qRQ&B#=<
PXtL!4 5@=E41ZK*E5Z>@+e4=l?CdDKHYXRkt&k*8P1^u!8CmTBJ1:wVqe4Zh5Spq*F>C!j:1$!4mF+HPjB4ESX
@S^DTD =b+9HZ#ZSV<FeuQT::aL\B89:V>qEP*\>M9>iX9Hd9>VNc9&NuVdT@:qB1!mpKZWZwJS:#&ZPH9:?B#K
dkiGCd yZDwm$!VP$qBq#4jGRSu%S&AQFN#mA5\DeL8M^QYC1::PF1S%V:98SkcW<dl$Z6TE?$wiKEiY&jLPd1E
bk*Ik9 TRn%Zp!Kpl%VBWXD!q1/1hIMk^B*n#kT\5lGFM^RGbZZD=NQ^n>LJ1@!9Ptej1HR&:4!K8/=/dFu56HI
BeWDbS =?P9DYq&#+/e1kA%$q>IeNmb&u\PAbTdD4*mP:>NeDtFu+CMb=4j<*BXbZb@8B9PFHLCeF!S<SK#!LCt
\DneK^ SC%jTSK+Ju4X#@KtY=pBWI??H@>EZN?$hu4=>Z\Qn:Ih=$Z>5Djc/ZtbK1K9wwEj6tN5Z1ehimYuL!eI
>AeFaX WdA:5w@ad%N^l^9E+!<pX1ak1t^Vd9ZKK<T4>XYP/^i4@c?XljZdq!G*1IS!MT?t<*a>$F:n@CI8*hw:
PWd<MH kj+e=uW*SVEen@%4b<6jbIp!@TI<#VS/\MwY%#m/IA:VE&YD$$@G*tq+mT8qPNnD1Fq1wRchp%dekki^
*pQ+B: Fw#RAp+\#h15=Rnw*kG/Je:>AbciDR=cX:cYNcnia^4Ah%lJA5SJNGAHhVB6qFn??AM9Ai*?PRbTB4Th
Ndh^SW ?@A4BiDnJq*1tpuwk4/MN8T\mmhyi:?X/W*Q9MR*#5hFj?JEHHRR>XX>>HT=qFCi?Zl&etJTk=NHattC
N!Z#y# T5k:IXhdCGuBtwbpNIFFGWMF@h5?B86l\?QiMJ=4y4@pK=mjDhC>c&4=D4%A9Xk/ccHw#FZB#kP%&y@q
aChCBq hSB1=bdXdEHL5SI:jnn!k4$SeAWq=P&J5$WHFkYui=jJ41iW?qn:a9j<6F8MEi<Rylk\+CT@EG>Yt+kq
^<MG^$ SyZJu8I&mDjJbjkY&9PW$jeZlk/e6:i!W4uQt*Ge>#n#:jG!EMjpPJw/%Cd#:CmS&dn&YN>6HC#/\6mt
cZtcPL amC<Jw^aj>6KmBQkqtBG^R>SH!Y$Kh9p:MGdcPB8Kmdmn$<@ynZA6Kw/G+N@SSk#Re8%@AcJ/TQN!/w>
l^p+n5 IJ1pAI<e>atFhM%qYG/HZLl@/F4uE/JXS9$wj\tD@@u6bLnI96uPm^jP56#yL+C@uCFj%An^6dcBpWa>
?pWe=< DY5KuVQLE&@Ppt6959e?Q?89&^kpitZ&whVE$98lu^utE4d%L8EkHtDNucI!^9ETL1#+e/GdM*JZPq>Z
XXT=K> DRDhCb#*Q=C:&*BI4nMcZCynS8jY*HpN&<Lck/9p5<4iKkqK:QY@KAFh#kkw$QZq>nqEGIakZl/#pS?F
/ePb8+ *!wadB+Pd^:$nwD*XWF9ey&1Yh?qb!@*juHhCQ#B6@!>#APM?C+B&q&L$S#y6ihXeB>EF^4c$*8+4KT/
iikmD> 4>4m\h&e?mww?4X5mBB$\pFNL*LL1Gueu@e%@u>n6CjCeh<&F@@9nQaE$u>96Cj?V:up9/d@^t<WI8u*
&FjY^C ZQJjh%4aVJV>q%#!^K<Jm*?aT@/QYe!@==LjVKj>=>VbY&^4<Z?hT@=4+t/m&6?!\Q??4eXG?*hKwL>u
4N<N@D !N?+wQ/HbPSj><Q+qmd<i/L8:>6cjL%9<?E@!mV@hTMD%e$W/Y1@b=H@a/d%#YMw@q8Pej!*unh:?==#
4:8CiY jBQ<i:d#:>6ljM8K@n5Qjp<#@%@8cwH>uw4?6#Q<Q&>4<chu@I:>VyT119wjW<u@hiL@L@i%?D:pH?=4
D49RX# <b$9Y^X%I8:*lP>@*6jmL*ue@!pZ9h1*ldBq?@hM<q>udHQK6!m1BQJZMjln:949+9C>@C+K*$Zkd\@=
=R/i5j 6qQC*:LMj^iF#i1@!CS9FM:\>*HjMye<eR9#>j?T:RhH@F8/H^!S@G?hi5T6$9ukCH>*bBD?qmJH@S@5
BySN@i ?8S@kj&HEG/C?4@A+4b&*BC^Q<d?p/Q1:@u5@++qp4h&49$>w@$YYP#YD6C@=:V@P=d\D\/n9&i%*\JL
YB*&bn *N1J?ji<>u@H@1P#/i?y:j<d<F>Tqu!H@y?<Q6<n8FZM+Zkm/i@Ll4lF%yINVaD>@/K=@=6w:9iH9dwE
+NPZep j+@tVl#J@wY#KGhNk<?mlccYh6^9ViQTG1?XBlS4\\@ajb!%yHancIpt*R\%Ba9iaB>+MJ:Bb5mE<S%@
C?:Iem cA*Su>PW+:@BDnEB*GDZ%*@RQG&%&H1=8lQhl?u:bHnl9HT>:*#Dm4QE#hdBuF=P#cI\4GTn/VV5>8:u
VwWbH= hB<ayB/qCaQYE#!9^\5a8<KkMlC4PqWLZ^wMamaR\D=kZVyM8lVhS%N9Vt@<G6J6KKFy8BuT@WwGIq/T
:489+J Ce6h1&p+XQ1tDeFcniMEVnP4N6PKQEpk!kEj^*i\@MXHe9PVit>W@IK<dY$SHEQta&icCceVJJ<TXIy1
yQ6/e% XEhNRq<9cYaItuL8Iq+My5Me#K\h^nIE/<QZ8*SnHjqJ^$8^wp$ZVT>DXJYQ*9CKF/q*G4<hudwp/uTe
=jbd5Y FcN1eP66q1e#Ri<hDCyI9I^6mul:J?J^e=ndL<SL$&H:\A\Vp+Ctpn1SR*9N\4\ACeInmeH$qu!*LDMB
8/cblj pPyu:kQMpN$*1=teX8N9VWm&DbXLZ9dGh?NXJe#X<!$FQYaw<eKk@X$m\nQnn+@e8#cp=JZXL/=qbmQZ
!TT1IR @$pphmHC+!:1t8:yjc4:qCYNj>uNnydSM1qqQ6u9qpZPHViQQuH!!A$B$DEa?F*hnhBtpdWBRTKn?+&\
Iw*MVw Kq8ZTX^VeL:Xb#:GR:4pDcD=#ud6W+?8K/kKcy&9*e$YT+h^FyWJu\*njtW\DG1i*66%A%nC8LS&wPt6
45/C6P N6H:b%86=8%l>4WGX%j9iD\MjS\ySTKpY8F:H6:iX:hd!@#JeWjCTmmK$!ud&Z+kZh<e>:P!*=8JV8Z6
/\VLAp J+8%$%$8l\Za9yu>DJ$:<nLqTBdy/GXR$Qq1pW9SqBiV6@iiFqGj8A6=!19XKNj8e@4yi=&cD+!mEX1!
*n6K%k *dNq!6KXJJa%4DH:EVeu%EQqe5L+5b&uV\YkQ9CZNc%%&^5m\\Pd^qyK4@8MRESem/+q/y:I&#:phNP>
?:W$ZD :\!5>i/S?J?j9n@m$#S&:ib/9wVGMVaL:K5hdy@j:L#+J1D>494Fp4WhAwNe?$jXD?qW?Lchl8M6qcb@
CyaHVD KdB9=Pd*pZd6Vj8w$i+lFq9mCA1R\BcHi@a?LGW/nyVip=bZEJ<yjkmmLAkup89!bp%6VWK?CG1Y>Np@
KwT<GK eI1nKB1iR%I1B5BIM1nT$qk^L/=Gy?CM>hJTK$1G/A^?4\=/md*S6%+/!E<#JKW1*:@W9CQG#muEbIX^
lt49#@ <HywXjNJYcSC:\uHcl6E?S$@RhQSM=pIn:#Eu<eR4mamCeD+&Z1#8CmZXH*NBtTe!#nHPWS*llH%mwp5
HG/Z+6 #=L1CS=ZE?Fy1<L:qi/im^$HEG=uH<6wDBAZ:L!F=<*>?!54hST#Gt<d/k5:#4@VH=ciQV6@Yb865yLj
+@jVbF w6Lnhk4*PdqJJGi1R>X=5l9W#qpHXQWl#NSlPK<nbCZ6nXPCyq*tDb%kktHQ?>Ge8+jGHZ%?IclRFM:L
k@bZIm n!YQjClLG=$kc>pHd$je5mXb:QWaXB@96Cm^Q^I>ynRI1BF#iQZFd1qIFHGw?LRQ&!9:9yDu\Kk!i>mD
RG!Ktm R$=DQptppTj/k45TKQBSLZLyY!9^5alRpaldVZDc\9FmiG&&b^GCZRnT+T69ajBWViG</aSp%Z1cTK%/
lKQNb: pcTwSW=B4@/dD/yNTettP5q&l>lG:q?@+@LY>&KN9ZCDSuNbwi<?#4QtcPZZCGL#%M+^6Eq\e?SXLp6$
5\=t@y l=q+lM4m$S%*lK+y+^yL<>+CH4/&<#ZVPt6AXA*45V41@ED8eyN<?5?QHt/Q5C:pe@V6F1jT9jPiP@5+
*S$yc% 4^*%/NSAQM*Sayqh>uTZH&eu%%k6th$^9uVPJDJ/:8QQ^HZH^YGV8<Hy6Q*/BueHnhi:\YKl:M%CSqn=
E#EatD 54eeE$Z9Y%?I6LE?*a%::HdNHKL%c5yahwX^l:<DYVR=ijhC<9bAiXKLS&!de*DD%DXkk>1Z^b?Q5PpL
lZMtwF VcH6J>QWE!T:$p<9H!K8KQM*q?Xh#H+EP<b:T>8q>>XbX9@%c!bBWHt9P#?JMQJ>e#LXQA^>kuIKqW$a
TE6ymi 4a#=b=M#Wlt!J16DYn84W5YaP*!kkqNy<8\MI#djR\tXS+>MPWJ!bjWW=d4ZbwYeGLLM5</F4AqVw#Ih
QmZ*K: lc^ZydqYYdaphHMi@:mc15>V+PKI%iNw<$Ny<mj+>9BpFp:IYTiKL*4=VHBeKC?h&ENkbFjIbnk5juE5
wKIAp@ >?<NnVW=<5JM/HyM?&PQiQTalNpl$8WH%%Gu^SPk&bMGdi$Vq\6p*>\Ry98a:dj\tKJ:Znl?!e?WXjba
iPpGa6 &RT&w6^SWnZBIX1>PLhh4CC5C*ut<>S#&8tejByjbR<kN5\1WYVhqbNQI8ipVSp!PWDbb>$*GQWaA=c!
M@p<?K jM>RW4+yWdDa:XhVW4e?D&NH:@nJjeb4d4:1b@SX@6#Gc!tPB!LHElV/p+?ZN1N*yW*eH%?@P+VCLlm%
#DYBNR +%<N\5@GHlFHXb\=JtF6u$cCQNMbPhHX66iA@eNqnh%tMd995AcG5hS#KT*G64PGP>JuSW:mJ:\Tm=*9
>W>a&1 ?<Ri&6cK*QHy<j#q*CCa4j*pwhj1LE9K^niV+@iG*#@^M=Q<&jkXu!Pm/IG5=hE%maFW4ae<Q=@yVXJ^
%V*R8W 4ue%XD%W$/aRGZLn!K&>N+9586@NY9<e%<::Y84h\Mp+k4Q*!*5:yq$GL=1G*ltBuP/bDK\hFy>%/dB\
-AB\SM 0002382ae08001202b3 Page 379 of binaries1.zip
RJN?T/ *u*=#e@ipn5B1u=H8NWPt%&P\&DYA^Q9QMDpj<4Z64?T:=FVW&JaF5L+!i#m@iyA%<>^pkV*X$<9F5kj
ndLXZi :XQAm:u/DF14%@TG9&%\Q%5awj*4+8K=95L*RwVpy99Ap8$%QS#ZwTyJ+WG8lQcKZ/wqQte+qR>YHAMl
$1ZdQP <91cwXmaC&55E6pW+%&Z#X\=%Q*Ij1l?/cd=$J=HcYl6ueG%>4T?NA#6&4QHHF^96BLnawcj5>WkW\*!
cRqJ5q 1IGlnCii:ZET14IV&8tbV?9*P*1%Z%*e^SF4umHkjay>#SSL1c=b%%4#lw=\J^p:bTtD5qK9n<\cnm1m
p&JARq :JVF4H*\%pM:Jtyqe>&e^m:RC>$%8j88/:Z*^/y<JyaNp81Z4^6QpLD:V@RM9*#/PWS@GN4ut<!cD?lN
T/=CF# b=jLA\jYqR>+Q%GTGykjd8dM1/8et8!m5yctm5/@tp1CRqiRJC#/nCZwA+R:a>1dyD!%P%XEPLZm1hFu
C%1kJ5 HwH%nNJX^tLuI#MtM=/1$GN5tS=cGP>&d!CqDi\@/d:$?GpWXCZKDK8:L&qaP\6N11@ck=yRwj51aGBq
S9dJk^ V$$dibD*$w$6DJEjE1&KPSd=upq=?@l:wXntXitCtKdGSK6T!@cA/mQ&\&9/1<9&N/Z<19iVW5m@#n8a
Q/V^#S $=>L%dlWw!aiCd=@Pd>+L4CqWZah?1VP^A>waVcXuuDwqWZiPIj8S<+cN*ty>9V*Y9&Z&iJMy+M%bmHt
Ce/LmD DJ!NF*P+n4uwFPT/En^b6#niMh9mXTujMW8hb>G8Cda>XbJcaD=c1HPNZ9Zk=t6>MnL9^6%YkGuVdi<@
BD/TMB t6n>KM6q$TNNP#9:8QpKZ?k=liFY/E4K=jq4mLl%CK5LnYMT!%:=C\$?Ge:wATMi+eZty&qB<b<W*Pe6
K4CjK1 4G#e+Q$@abN84*adY:nhm<4@4Q!?!mVqNqS#/NtWTXD#q^i#ZREQ&V&n&bWR\?dp>iQNjZYi/$p5J:D@
>EIGYL ?9ESM@/NiV@$K:M94dNy?Qdu8%Fn:%R!QlPeTdWukV%t8DX4ZEBBiq#j+IZe1cBA/B%u+FCT>9ubc>#V
@4H><H RdFQ!X%4HC??YGTCb\W=lkmWCQTnD>cKw91V:+?uqN<^@n#CMaT68N#>B6!qu^+*@P9F9iR\ZXP9=X>j
l1q??q H<Tt^:le<JGRw&B8Ncp^w?DMPE5bMAj*lJ!898X5Ia1nAFX/%llPL<L5^HD8%>c:J!4@/JDumD5XuF+/
m#A/*n jX#j@FLXLjXdhh!*G5dpIB//bjy!AydYu$6<4Zc%X&l!IqB/!FHBbt8B>6H/9y^+Qek6QcnkIe*P%Z9y
KLS6u! uijpj5LWXPl+SDqtN/ZJ94uaq/9FC6TjL8T:tH?Gc$:$\tPFpP81NktPTikT:<WMD5Cn/qSb@DKjCX$:
NwMa/q ci1u?Bd#8MXIyCTZ?=y?mdQ^t\GPE9h6K%<t5pKS6aEiqk$4kV5kltnLKN455/4D%Xdt>L^HQi$YqG/:
Mj%q<V +SbmGMw$/1%&R4dTIkwbW8e4&EBwL?jncLQ9q6t^J</k>:u%E!^+%Lj>lJVn4Ym#8Di%B1wlCt/eICG6
eESShb @ntST>!e+GYHcd4L+8e1@%ikyQWLeic*qe9%==:dGK:q\&pyZG>$!n65I?^M9XKmWSMY6wd*K^*P8T@^
C4EPtM qa=D1wFyT:NtWj%cmY>XRn@j1P66NI8E%pm=tu1dB^tT>PHh1^QQB\&9^D%^HH#Vlp?IHVl!FJPyM/B4
aqB#Kh 58SpF6jbhB6:yTdq>Y$LX%t?1=a8l5@Mi:4NK<bqt:1%J<%dX+ddZD#!wyPQc!QhCVjn4quwYGZYnSmJ
^m%XV< nyTMFQL<@>m:>4Ac5:c9cE6&B?\eRm>9JF8!u:Yia<p\yNE=KTbuRmWmemluKm1NITQGIXEmpmmuGywt
6h&LB9 +%B$Lp*lNW4qjB+$9D*6l*jMZ5>a##6@jN@%Zh>j?:1/uu9*&@h#@>c/%:%?/%=>S@bTFC*$*iK#1Lnh
JD%pi/ $EELk@Xhj4djX/1:?hVcWZXD%49FQ##ntL?4>>wZaN?NP6&/L+\cbZe!W>c#>^LZn!9ea?4$^L@#V5P?
TkDPJ1 ^W@#RW:aiShj6$GHu$?tAndpLje%:nZFc:6n@F#ZwXGD&??kc6QPj=i/4YHiW>ukRE@j$@H%qM>%9$DV
>\LCaW $Q*/j9wZ@BSQln^bKNN9A5b$:9QGtREPL9I8e%*qZ1YdA@jjHVVA96@?/c*9Nm=b%*H@p&DZtV5T!<kb
CNZ&1/ c\eQ8dcw<8:dulHce&LQZC%Id?k#^NW^Z&u5==F9EHY*QLnQSKNwA=$M><ZtDdaHYm<J?mwk*Tu\46Z<
iS\*BI $y$F!u8LI!#uWe5Y4JwdhQ@bZPX9FBW!wDb=^LQwaINV\dMc9u^PEw+lnk&Q/?+dLyZX!X%Cq%9+Z^y$
nwFGeh h/LqeZNXRy^Ft+d+I4bN6W/4&\cHG\Kui&>#cw!d6!15<!Z+:QKpLjt#F:@6=uBYh@@J6tqBbNLnEZFt
Xp?Laj K>QCj>!t9?alN:9ISu9J<DCn+Y$Nn^1ELXk#eHh+9hi\+R%#NmdMn&:K46%t%KGZMu&dSj8whw@hS$Z9
kS$*D> JJQnZbbRK!@iunT$e61T@m6hy<+eQ4n&J@&AKY=%ZljHV*<!+HH>9hEZZRj8wM^iEDEb$Z+:w!$jL^6*
P<F1SC I5eIZLquFLQPVHW%9MD%=XCaq4/p#hn#6^hh/LE*\+L=y^F/B+Lp@9j5RFD@VS5Z<J@/*wiTH@kkl<X4
B8LCCd <W&\c4AE!\mj/q>CeIV\CaXQ+VqPiI=VQ\hWRmMbwILCH!nlp^E?lRiFnnNAWQeC\bQk\<<ClQAkEB+E
?Th/+P \wNAiBAIZ\mE=/D\*IiDC$D\P^BiDBBiCmCFB$u+TS@#D!WpRNKw$miqYR1pMG>8JDRd$&9cm9RpJ#R:
Q!lWYj $!N5Se+GWCTG4ek=Cw4C5FZScF9/<:aWl#=ZwNp!HtHLwB6ucDcNS>lT/JK4b66+lC&J>yXt+*mELaE8
V=uy%F 8hIaeWX!/QhLa<RX!cJnp5cIK^Lh<wmkMiKKyNBqeSwn4pkw+m8M8CIJEX>l^BYyE9EXSq^BX5SZGHEF
Bq8<>C GdT9GI!++48yI&$^+k1KnB5MSq^BkQaXk^FZEN*YmtA\+ky\I4:CmC8^Nn<MSq\BT5SZGHHFV#XIY+!+
IcEtcb ApDEX^l^BWVPjdEaeeZQ<ElduHtRRj8K^ak4jtBC&tLEqin8Ep9?HYNK<^wCi&DFeC4Id^*n*T9AeT%>
$^c!N* q!mC9/Kh@9!%AkTLEbM$mb=@@>Rj:n?IIb@H+TPttu</n=nmGB#ELE/&kb=>@>Sh:k?IIbVma/y=8G%B
#FRF6i #Kw\EHMaQKBF#mH?1VjhH^FVpu#euPC%IKayHMRAJ:NCS\WH^SCD=1SLA8LtlLwFMeulIMckH9?&pIky
LaTMR5 WeRMpIK+iR*SklkCHMR+&T8N#pA=Wid^ElRJmFWC<\ke=uE+iT?Jbl/Hal:bnJnnh>9^EbP<c1pbMTue
k\#ML\ W9KZmIEKJ&NGb^lASaknJ1Wky6ZnMhtehtAk^tEi?w+hwIImmFtYqVJYpM*njR9m=nWMBtKeLB&>CkM1
Xq8eDn CwtaXWGYwKRklmw%alLkIMdJ:^tS1GBEEBPAqnKD<A%FY^ADGke^m:MTa6CIPSHE4Kw=j<JHDDtBiRVG
1c9ET6 uAeIDPcS/HW8IAk^H#hQIXIR5&4tRR/HiRVPKliktWhA5VktJeW^yNZM+#M?DMR+#EP*u\YEGQMA!$tb
!/Sw?b RTCqbl/peblHaDCQj%6I^I#aiM\&j/$E^FDNQEnmMI@AYbM#cPaSa5#nYE4KDAIJNjMk^GEi\FuN$<kX
FWqk<Z G\Bm#FQ^$/EE^MIcBBI+#AM+hRD$GkRAWibSpu\MYDZ#AIjDQEDmXC:R#ANm#GMyYw1QAcNtHtB^tAh\
ud@k9+ tEik=#\kM8e%L^/dl*pJmCp%<\CN\#!AW:XA6\IHkBNHLCp1wJy=9Dd><+klB9MAY5aLwAn#tkh=SyKQ
IRQ+%: kby=API\D&I\D>DwPR>CeeSRCtKX\D\Cl*pRy*bHwdNNTIpnqyK:<R9/F5R1HPbBuKwjipeHREaWMT5q
LL6<Tu 4?BLun^m95mEkSmHiYkbQIAm#G5ikAlJQ1dW#PPL$=>HVPI\D>&QHJDm#PPpMI>Z+4ekyuCaS?LWKFp$
B>!Ge6 <$lS=qFR!8nGN=61RR\bHMRpVqWXQih>K9l*?&n=F=iQjt!\%CK:%:#bFH^/DkD^ub4Zn*/W:#h@J+Re
<Q&4lt +n5bVTq@M^&w@:?A%IT?VtT!:wq*>A!%idt@6=q:T4u8158:qn:TdY8&i6/9&4SJ5T#ZMdHTYL9HS58d
MBw:GX l4H>jy$bQ*qRcXbuI#eq4dZKVSZYP>tN$F<:kDW=Z?DVBk+L<JmW4NN/TdY%QP%WZcQ%^Vj!4PS9Pwc9
9Bd#JG :SW=%LiHde1b<ab:Ld^jGIQ%18Te%W+Y<VX>a4w9:J:l=8dV@bndKy<i=\9:4MknP:L8Pn1H#Bb%$Tpw
XlhjNM %dF\/LnJZit\N@cAyWQ^ua\BX+14D%4qB#Wh5<k9piha=u9+yC1TC+$iGFnjGy%=QnZ!nEMQt*8DZ^:w
n<*Pb8 u/L+$mTmjWhQSja>c/Pt?GGd=uRdGY&SYmPd/:m\:5enc#*%m*JP8bGnX^iA5JLeI%bF?l6LmlZ!/P!i
Xq:YZ% ytX8mtmV<$=X9nhGidd!/Xd14P^5wtNW9WQBWtc&H1hjiK+11AlY^F*&KI=P1luZcZCS@=Z!9PNWjtdy
:Q8We: <eD^L&6#4YVELZj8#QFDHe#ny<d=hhQ>=9G*@yV#d:NhDZ=N*P1WTh6?Q/Z+?jP+48uHckc84Cmd8K=5
u*+Qte *Mu5*=&t$lPH>#&tFV?#!Q6Xb#ndi%6ut^md!9I9=6#yItPIk*5#4qqdNaaE4Bu5@@89JtHcqKj4yNJu
A#6:BX /^Z/taq&P*@&ZNF@/#VLTj%/!!yTA?Md8L4qY8XW*6mEi9utnhE/>P:lt?>+*^kF:+V<jnd%#m@!Lq54
KQt&jW C\aY4??9GNB/EZh$y5>:1u:<ak@*AtM8!6>L6u4*&jJFCXi1V:ZPK4I9T+w4e\q%j6Wu9LKVTheM4>md
*44+IR S\QGt8dpB!!:eiZ1ktGL8$jMec6ZKHXeu:h/NGPCp<=Fn:K!yj5CcieXmpWtc:ywiTwb@S<CFdpLX9/&
hH*yTD <ML15W4uY?Mhuy+%6Mq@QtSqa5N#t!@5ZSeiV^/jidFd$Qm+!P*j/@Z*hL+=RiFyt#%Lc@Lw5hi<mq>E
aXB=+$ LK/b:#Y#>@Jn&>/8Na@w8CK>61L%%SCXkSba9Fh4!9BJhL5PJ/#6Z4=$!cq!6Xl1%/qaQ5Fh4=>=*1kS
C^QdPc S9@WnXL+!h*Z>Z?*y>!*^8Q&H98bG<^M+Z!>59QM$I698uTuS5mhT/$e?9ZY5p/d/:8%pJ59t/hw$&hi
kp+5*J Ype\hF/SSZHe*Wp=eXyd^5#ZXjVYChV44J%1GX=8Mblhphy4/4twi=&X!61Cnp+i8bGSnaN&y9uLN+j+
mQ1pMy Pl@<FmSX*nqyq8By5X/9S=@piXWqcTNhhbddtw==<&Yu%:c!TN&%uYSXnyG9H\=TYtauq@&nZdTF*hiG
9h1>NC 6hjQd66$iYQ/lTXJG%=tWC@LJw<@+cF*9jWZ98FN^a:LQA6w6:T:+jh9BnnFQ4C<bN>G@1IZ&VyP%cHR
eDjaH= mbZ4Dd8<?=6W=ShubySj1bm@eNuR9cNTMk&T?n1<YX^kHHa&ZL6\pqPGS@HGH\:SQZK@Lw/h+h=*mtQ\
E=WIlm mNVau&:46G11:F#b/u1@*N%:aPMK%@I<aP:l99%k/WqmYu/%ihTCtc8hjS#GyVh=h8?!hiTG*$?Q!nw\
=mqT6X aeKEYCiZCJeb66aY?Rh*FS/5&ypiud^:Zi=11^Y6<4&>h6T*56n81>5N=HY5%qy:c<j5@EhpauVQ&8AP
I+RebS Y&@XVGuLVR6IZ9h$j>Ch@IMPF5Y%&\@6h?^>ZYpYeG:+tij:Tu&wa%#>!/L<h*FGi65!j9wb?G%^V$y9
-AXGHj 000a857def7001202b3 Page 380 of binaries1.zip
DIQy?X hYqNw@#X>>HFe:@=:5mq9BE9K9e>Y/teFyM^cpq/Z<j5DR>Nw$5QeXdqXK>Dk+1$ZB^T8ymPa:!lTj4w
JhGBJ! i\Mh@Z#iP9T*QuFPNe5=YbtX18n:8IJ?MH*AqWmQtJGq+>JP>?l@<IbHTjCbC/<CD6$Q84m5Ln?VC5?a
kV!RD@ Pb91j@mp*yYT>y^Vn6&iVb%5H<X%h!nR>6+&%HZ*FyMD4bah5R5N&#l!$=DR%F5ybjw8iyiTK&cMt&aE
=8>%6Z V@5jh5pcEy4B#Z=/Ij8q:EqX4M:T@T>GHT#M414+^Tk*5YFqp5Gcj%%:W^TpqWkj!jllHVNk><d9lm>b
qp1%&A NHYD#=D6Vk<K6HNVW55d?^<cNN6!\6+En<$^J>wdn%D8iL>d64+&=iTA?bb=P$LmnB9//j=4%kT9hy5M
GB4WS5 >m:%VF4X5?l5l8+L9?+yIehh@Y8me9&uV4Y1P:dcctDP+cZ&Zd<?ND%IK+M?Hj*nZYidlH&y*:99h4IK
+JFDG! uYE=c&89Id:=4:SZEK@i^e/#ebi>>m?/%bDWRXqm6%?@e=J*&Pk6dqSKcQ8Ht!dV??#udW++F4l4c5?G
!S6Znu qX5ZWLEF*w:$%%tBRXy=<WjKw&RX=u/8l6QQJMi</#XyjewI$*aJ=#16iG<VYu/89FQp=SC91hPh?&<>
d<84Rm H9Y5Lc55LF\$&TYw+h&%dtc&bNb4^cCpXdpQS:&8#Qa?XDZ5pG>1ZeDS:K/#8uqPK#<>*N9J?T^^9@da
km6TjS >8$qLwZ:>I^V9%8^?6:D?Q8LA+PDP=:Q!6peW=u6ehDWQTa>=F1*&e9NnmVb?qb@yXh4QTh$%<IuabqJ
RLA/W5 n+^9?q9hBF<u?J/M8*Y$/5u!utj6cqIi^8^Mn=%&a1P!iFqWaPdeN1XLqI&y*X59$N=AQllj9Z>!$AE>
hN>^+# t\tYcib*dl=4e9b^>@De+@QYMNDSa:96mal#T@6>qb/%Nh@DXKbHXMlKRq+98n8>1hPa9bH&XVE^<jc9
#idTu< 5!d8P*+n/qGwbe^$L8TZnq=NV%a?d%jt%Ym\+jw!/:#Db6e#F/^5%dB<RNLD#96KJ%Y$4V+%?Q&Spb:Z
@e6%T= q$cMaGLiQHwqM*>>$<tl9C<>PGnI1+9Lj1m/yR\><F945/Y@&R?5DAqL1M>MiDm#%Qb^/c#V99%mc@@^
WTe9&J /46jhn*4?n4t?$5*+/n1Hi>&Vc@bpQF6niHaBWh9ZbYNidm$&m*=:eGd%8qV:>p\pbNhLSNhq:?@u*%$
^:PEY? ^=$d<=Qjyt!4Z>cudHVGZjh\<>ZG$YP9Qu/#4::TNTqk<a&t6>/8&a84A$8iZ4WJ6m\$H=?WpJ&WWFij
Li>!!E ePBCn>@dZZ+mn*9n&Hk:aI&HQQ!TQNLmt>9QB9dYQm^@G%H*9y?VdpK/%yiwb58AbQ>:%TVdC:J@::w:
BA#*8= <KqwE%MwCWtN??+k1bImqAT5?9AyaAXbwmCeBIJ\EknCTTAIJ+EkuATCeBJ\H*TPkuITC5yJKAkuwTCe
8XS<uE lIJ\Ek4CTTkIJ?GH61lR<CaWjmeWlJNREE=CRVkJBiEpFITVWBBP/pNBPRpF=TRWlJMRMy<IJD<p=u>c
$+*H1\ RqAcT#\kuD#@dLNtwCt1%LRXcSINNEYXt4amnb/By1kTaT6TQNaWXTJ5Se1+t1JKlC%c@Aa$SbWIY$LE
!lV+m# X\!G4ek!ZFNW1YqL5ikm5KcwEtGLdnANcI!+w6A*1AEcI/+w>K%mkMcIK$wputtM8KLRwqqAa<TX&Ha6
SjHHm> nSFZJCQmK+!+ImpSZ&HEqhltIw$SX@\tLNIYI/:+:XCWLaMSX&JdZR^GZQFdlEldnLnmN?8R6ll^JdaS
i\Fh15 \&DEFd?BldVFmC6ImQkKI/:E6kpanLkC4Im9MPKKH$!S6ll^BWT&n%mM8BLVGAKY?D9G+H?m:MlC$c$e
PG8!?K Y5y@yTu%j/XyuG$GFmPcGSW/tqqKFDEnbaPQJ6ZdDDTF5<*A+5#dLJyD4Nk&R*Q&I/WEVkQ%NkMNeVd+
8REt/q YBau\$E#F!upyHk^kLTNEWwR6jD!!<<n=nC+S/NF&AAy=G^B#AIwTT\4mA!^BHAeV9a1ItyBCnqdEFPW
:SLmBP JFppLakMGS!?e#l=4+mwBTupXQ8aqTIS+TYuc4E5kaMak*tW!AwBKiRWEHPT^LKC9JjE&iDneHJ6pZWJ
Tk<JEE J<w<Ty4wt^Dp9RBD*k6XPFp/inWEXYnt5T1XmydEQJZAQALmIMdJ:>H>5cAKmmHtL/mYIDIWlQWpn4Ai
?1\6!A 1pmeFRtHSp!JIya$k=CC5J:9hwcBGIh=cFELXDGmmKEp5c\k4Ch^lQXRldMcRh>?DXYeGGIwcV\tBYE>
hMTmtl mTP5l\RG<$S/$$FChM/nPWu!ZpFaV$Ie=lEa#CQSwlbIRHHEW5bnWlDYp#nCipnk4MuS9RMlIV4uMbKP
C\AIm+ A9B>@qwR1*CaS?C5=6GmFpmI#upMIYW<lw!ciSBH%AIJHPclST&R+MRST^QLMwJaFwh=AIh=KnV#kCn#
<IXepu GGpTcqLNQEnlMA@k%B:RwlaISJuHTB1Q?j1#Ym!L\#!AW:XAm%wkEGeiqPSnqby=EPA\D&A\n*>dTMVm
HiitMG #INT+yljG4RkX8E\D:A+qTE$<+A+<$lKpqmYEeT!PM!DPLW:kGaiFGeiKYWG+a9LLakbHPbBHPcln\%B
VdM/hT KM+<TWeMiZYXYm!L\#^I+6Vi$M^DCnqyK+:Z%W8T>^KeIJdF<nFPySF>aA<mlb!MFaG9Wii#W9=eyqy+
5CnpB# T8Qk^cqRm9D8W^tu&$jL9?mV?%Gp^+94cM*dEiEjSbwj^ZX$5?9@d@VJhe8MXHZ%nG#yp#6GFYtZ+V=5
Pq=l@^ jiYMIutE&iyl=$dA4u4!1t>@TI6IPHQQ#1dVwuQVFldy&<pt%y?eatHhI/>9<X/qph&yNjGd4LN/GK@d
ASjjpH ?T>by#j/c!c\MjpD9c/EZa!GnbN/h?*?+F*m@b!4b4@8MF+*hM\F:eMut=ItX^We*#9$eYtE%6q%9eIG
^F^?4E %L9hDl>&!qjS44jDey%VSuG%dTIGqw^S!Nei:m8QuujaqM\w4P:YqnPKNc$k=\?j&#ZuebbmeNm@8j9Q
?X4?hT 5Kc&j8$du8plJJBAkNAVc1kGCB$^wZhCFSA^wRqId&JhTTARyDjFH11A1KCI1Kmlw!ICItIQVXFSEXG^
H%qXM@ 4ui6jc%4:**66hb#ih@:iJ<Qn%>RQM+=^=\=M<eea@#H?cNp#WkP/P\&SSi?F94I&^8k#T\\8Q/ab=bC
ki5$mV *&ehl1@CLe4Y>$CQKSBb6c6Heu6cLPVl/E$K<9Dld\DMyLhdR@=<8d=RumiFnZ9ca<C@I/dQ51?W#VYJ
eLi$t# <XYE+dwm=aeyqa\F:V6STEZ+?/Zd/F9$n99m6>@Q<?kDjlGMqp:TX\eFh^J65+^jV+cnn:?M54Q9=F%H
B$G/nZ Q:HJ8=4BAV$jEnb5uJLB&C1Np!wZy*QjdD4W&HDn!@FR&%q%lSEDcWWd#h8J!tb+y!Jq1\XN19@!DKbw
Z:<iW% &5i!N$K\TL*R94BHI@h/TMhJZd8G\8@c=<VjnHyWuh<cNHY?K5B91m4n^e/:F/+<*:EqCQc4*#&Ra+aH
e@bBw9 DDR\tKQ=!eTE&h=#/JeMtqy>kK*9?!!GWc<@#eiWkR&#N66Weh1T+tPTFlF@RX%Vdm5L&@4K6V?6ZnY?
E&pn!a yY**t/8*1=W@H*<1>\T!c+8XC1h8/+!ZiQbepH@yi<M#d6NH4mZiuC<%EXQ#?HyNN%Z\!hm4>i4S^<9m
Bt8IT$ mjIcRh>lbm/it&Zk6$ydMhWJa%&d$KK9GddnJ?t$GnEEQ9yi\4J<$HuJ?TNpl6ta*&*CZY@1=Y&1jh?&
DD=*Y! K/+*>a#a%SWb&P1tiK9w>eq4I>nlpwGptbkalh8tt!L8MdEH6p^uX4ubVI8?Xcj^466S1:>i9/:S>Q%G
Z5^E%= c89yp6^tdKl<i<kC?@8%C@EDYS:udP/WQeD$9$jtWq*i!ulV8Z$aiIhZFPK<>HQZ$6WZ1?<ue+?ZSNR?
q5+iXy j:D??=jFDeh+>d>acKci:4G@HC5m/+IdhRei?t+L96%<+PwE+&qyd/d9temYykM1GP!IuL%?qIZJAZK%
8b*CcN >E%N?qKKnYW8hXVy$H49F?%TX+N5%&cphLJ9tJ4St#TPTZ@>p8iJ?*/N9$j!4y?dD*EWeHCBi+N1&iEw
NE?5Gt !@#V=&!+$1B&6MhX&cdK>iBm<D$8Xlhl?=/dy>Kut?6^K@y5X9qu+qqhi=*Q#ucj%AG<^qdGT!*CkL@5
iHb:up Y5XI=4+q*958F=6ue@FK8a5%i/<=j95?d>jBy>Y1Whl^d%HqYWbC+h%Yj\liXeqQi*BR>6D\cW#y:tAu
P?Vnb< ZPEM?h+a!6>>F5++cHQ^:HYCNFnQK:h>WD9HlInh9dH1#jwm%&dcmHLp8m4Y1Qi=?kChG!$:$Q5<blAY
V4ASa< e<bc1D#VC65NED?ih4B$C\^$19kYhKWI%Z4HXH9eY>9=YjIlneZTe<&dDq%ZyEV8lyV4miZLbS%BcjV:
emGak4 :58j$F8j:=Be6$VqJB1cipAmqQ^NqKMwaBt:=*j$=hFGNT%chGh1K9yJyHZMP%D6eQW8dJD?Y#Qm@Te$
SG>h/y j:CWKnRGBuymi&ml=jlBhFcD#$i/eid/DR>*J=VESG@SGp\?!m4W<DbJlduw>Ikj9H<&+p^8\$S#*AF%
b?8iJC BeqC^kM#uSmRS$$l&=P@Pu+4GpccN&X6TVW5A@N&&hTGXkcdQKt$jit9jD<h=hDB1mcdV:&wZpLDV1B1
1M%JNt niYl<&WhY$w/dlk=Sh+*^\cpiidiinN^!a@Ykyb&Pj<t+e1?wk&pT#5K@Y@p=Y$#InS@Ne&?P&nYZFep
nk#QbC 9@laJZBCZ+EG5DVWRn?W*^#5FK/>hyh99>T\hQYke%\5wHQ8tVpC%VL+wmX:cXWtb!#Dc8#LX@mpqPRS
e\YR8y tVHL\^d$qL4#*tbtbj$>L\%aHMicB9?Rw+<mGC<4It*1Al5heT<&dk8!8<RZZhI+<EJVY955!PQ/>%jC
VGaA+p y9=p#ImSGdNn!n>DY1Z&?&#^bMn:dCZ^cIwDKuH\:G\#EH%eh1:mw8u+wRCbI<e\WR/qFAkEZPB^Rn81
l&/mR= ydSnd*6Iy@l8\1VV^tj?bRLj<V&9A5/b>KCkL6yZ1@FXG=8:1FQP&\m%Mjb1%<ak8IB+8q9N995b4uh@
aumbbP #F//=y!T<QLG@Y$GLS=deAt<V=$iQytcW#i/:hy$Kkbun%6y1@Et$H=\Tw+b9P119N>F@c&N>j&nRjA5
kE>h$4 5j84/#/Z6lk8XP%ePju^y8X&l<YyWm/>/m$da!*jhli+>^:9GZ>>I8D^IZEQ:K$4=:AQCKJlRN+WW8&:
%dukRk V%dMPQjJeI^MVnHYK&>R>#^B9:H=yP!#?h=ZQ\SF$R=u#<6JKT\u%5dMjS$IMb/K6iq6c^?NNBp6Q&4<
MNaRpe bXhY\1&!uI6t&i54q+>F9FF8Kd^K*>d%+/Q8dPnYM?<#+/@IFJnuG9yaCKiF?q66yw5QlbG5Kl@P#/LA
hG*PA4 SVwXu#K5H1/8+ZR<8N&BEEpZ+nC8hhDuA6Z@EYVH^4QyVp6=D!<:LE*l4yS:c6%Cb%l8PlT%I<MEKdH#
kPMktc @yL^K@JA@548!a%p$$*Hk1QIM98/HnWWcYic%queW=1VV>uWhFCq%&DQ?/9uG>%iE^u+J+MdPP@!Fi?:
KJlDlL u$Id*BcjTu=?XF%V?p#ECc*t>w<4D#C@a84^b5YV%&P/?+LH$5PKF?QKQ+GLm\e=Bh*W:SPc5ahZ8nN4
bm+*q6 +!PSY/Ztn^l9Y+iIN4hbuu+mkWmyKh\Vanp!ecZAE6A*RCWE9A=cNiRNjm%Sbq==@Mk*CN&>k*9p+iYT
mV+@<N <NR#yq/WyV&Q#MFm4\i*D=#RP@Q?R*dY16jM&>SQVt!=t:6Yd$!^h/NXi%h9=#?YNajP9R=?LBt*\N&u
1Fy#I% *ZJKKmM6Q4jA4?mM<6X4=C@YaK:$1=yZ=:iiw#h6tN4VF:Q$N94G16YG<Y@4n%@h>jpa<k\L%Fdp&=NE
-AtdNT 00082295704001202b3 Page 381 of binaries1.zip
bRD++! :V=n/M%j51nL!d%=w>6y*yRjDn8b8mBJjXVueMR#hQtM+QPb1Y>NqN^=+b#l5#iin!dEAqj#Cc9DE5@$
/&RTqG Ck8>Vu6VA48itT$W:tiJD+B9BT$9J84QG@8>Vj?SSF9DQLt^9Aj16eRYD#tFVu:S@Cb?/e94A54hhbMS
F=RuA/ uwqL\?9l8VcVhepIk/qQ!^#I:jYIjdR%J^!!Nhw\86c%X6<a9GRdjZyC:TyC?>AGmILSM/F8a@?IkLpi
S$M?>1 I+EWVVeMym>ESqaqQuB9@VdInKPekt<Pd+w9p5l5YQ+B&+\dm6!dwlTaRt\SE=hKWeeXL:bIFKjGnW/$
dw&M>4 w:RNQ*1k$?$R?LVa+hQc6NN%RbI+W&pnW!uikm^PWeyu1>S+lG^b=JaVmc&*4$9Qq%8B@#1K$iSj>@:<
py::<4 9%%WcQK9t+D?11nR^J#/=/yCe?M@XSYcG@&jXBYctJu>c<uhH/@4JtaYj%F/b@JuVMk@Y9/9C:X@QXV:
AK!S#5 <//lQ&9@J5@R=M?apL<+:><MEj>MCjpL:h<M+cut@%=4?neV!FTLu>CcGQ?%%9Iu6H?h6YZ!=@LIQ&9@
L$=kX! J4QP=M@qpZ@YGy9@nhd+J:S@ZVJpa9wV9nL?/<XyE>Pj<NZjXdKatJ4?d<R@+T^nm:?=a9Q@ljbuuEZ=
R!kRy> G/*q@:*Y:Gie>hiFdCbtQ?E5/q<ZYJta@aT#1H@nLLPjehdjjA9Nj5Jb=u<#qYbt?4@Rt9%ym8nj&iMu
MblHDH b+=?/\b?n$I^@6pwFBP#@$FJ?te4@t8:=8>V%9?!ZjM@6%Q?^?!Q^b>uj@/%D9M9n9tjM$1W@#!t&Z>6
\P>1u+ AcZ?M@H*Z+:=*&#>^:$I<k/Q?@&!@?6t8Cd<*1Q?\W>$VVAl@wPR?B<JQP6ewtK*^1RVLa!I/?^m$>Ma
aSyYkR Wcu&TRuJTat@>:$Y@>HD^miq?mY#I1J?/&Q@&P*/^>TXpeu9*K=@N*eFEGpAYkID=dDb!ST$4CR+#*/Y
yu!!BX puXERR>h$E>/%@RwG1he+lKS5qbb4KlXCRLcZS&+t#TLd</Yp/eJEpkwq<MW^qmwaJEncu=8?LMS!tLR
yRZ?/c ^hYknl5GDuWPyQNYDaEKiBTQ?!F8IjQKq4ck?EB4JNNaARMu%YCup:Wn8$IlNcI%:6#&:4B65#l5eTac
aL\<ma Lkc6bXpIjHXqC6aFZib*lK+nSBl9*JtkH&+5Z\T9a\+@PiA#FlYV9llhdquHKWcw%$\9:%!9ZJI*D!wh
k=:qW\ >4KFal$QGcAnQJEp:HCP4=GTyu1=^/eQtAZdTHqEPRZwhTZ9B#>t\&hTYhRn$Itd=:+>^SkV9MuT8V\\
CjALI5 e<::!1jQ81GZ>yTt?kCF5FtY1$8nDJ6>GH?>lR&khXG%dYjANK+\S@<Tp!u:55B8P4GmkBZWbXk\%p%w
QLn:5V F=<D\Fm$PubR8nCddAm^H%5Dm?%nm$d$HY?$JbwWwaEJKC?<6l6bbAj5=#1%EcjMALXyjdMeL9AICjlE
Y#AK*k FlAA?/#p:188^GILI164%qICCHytlcqbi&p6MTeeRb9eL4nBke<N4!1XlJQ^6yJ%:=>qF$S<LZ*t?VI4
R!ZDhj pTdb^meaF4tG%G/A#mMy<#h%4AeuTl&WLt*Ae5t!K1YC=El::D^h!lGZF9?^Gm:mW=*APVGLMIpI86IK
u@JY!P d4bhyWKDSyt?Xy!V<!MdQFPt:tI?iiS^^DTjw?E1aDG:*cRELH$%Z9>FmpilYnBX%*>T*N$@S?P?lXh=
ZDJDhD Hh*G8^LFVMT+9X=DNRA\yA9thlVI\ce!S/<BYhKk+/GPmWm^<BNXp#V<bhSt@AQKG!Ic1XWNKYHm=#Y=
K=?cwA cLE!8*Fy=?pyL^8kdA/G6lAQ?AIH=!@pS>H<Z:>RRR41!GNLhZd6Z8w!>VwG>nJ#HQ@kZPcLYG:qRuP<
+h@TEt ta!c9EhRQ8qXw&WqL<m=tEkV4tRZAJbTul9FKE&GXqFhFmW=5J:W>ZL?dKdYkXmJ+JLt*qw8WDlVc&ci
B5lYd# y*p^!?%=a4W5%cQlBhpc4mGLC1qR\?%Y!K@^5dY%am&td/tY+<KS?%%C+JlmDSiJk/*AhT/LEE$5DV<=
\GKM59 bmSLLFi*nDGVDC>%\w<>QkqaX9jXlNynuT\T9jJh!E!LAmeHR\D<bX#KIh6Z6$qZhyp9m!nd^pc4+RZc
VAMyee S*IQPP+wq!#wd/hQ5wZ*?ecFGnNp$u/6kE<Q:W!E86AKwH$@5nI*9FG5\qHaAjBn@At6MR::<Q^kkHKP
m\Kp+R A8mdt+AX6Llb+YL/T:dweYwA6&$#:t*<=eKbMIPB+TmEIGWFAu\#GYTQK>l4GIp6b**DW*anYHm6ImNA
X!Wc@% lWbP^m<\FNu$JnZ:HSn+#LhRt*ay?Jn8E!K6#akACkIQunT\aiNBmGWJ$?!8i+4k=JAm^1SeN9<TAlTR
D5ll%J ljZbJ?p+4R<q/S5+nVNB&hV+wy1a?FQVqa?RYZAb5wM:J8&5Qd9/kYJE559?FSYk^/KF4H%I^$CEXpbD
hJ9&Y^ %<t@hMnt9&Mceyeja!Glt!A+d#u8<kDW1BCCbi/H?C$DkQ%PT:+w$d^*Nc%I\H/HjSij*95qAbdNXm*G
6?!D&9 1wGeLJ!plbRW$N1TAj#l=wlV*j5+SkMcNPbpYW/yL1!6%eKb<LCmGJ<K4?p&HADp+FL/HA##!\ATY!KZ
bKRubP MyLMwXDMGpyD$EPVdWkHNW8j5^CcAC<LSMkCaPJJBPmL86N+p*t6KT\uH\<k%H=AwM81:Hu<%8I+FVGS
bM%y=m WTCT8PyD:$HuPNa4/ZEj!RMkFZYB?p&^CK9Kjqb^KE^eA5T>BiI91!kJ:99B=#KR<LLdEH=MkI#n%VJb
+tu9F$ CwBl<Nt/Ed56&D+YADRIJ^<lTM#tuDc#N!wZ1%EkmSP9&Dt+>C8d5l%+L%cDBuX^IE%GZLFkYeK^>DJl
iDn?Fd D8$AaW%bR>+@YEhDS!AXNmq8$*DC#DDAhV/6Ck#?/%1tk*&?!Ni/\5XDidcNMJYKIk>^dZj$GCB#nN?I
!b=PS5 k+S\kLbdyuBt%pAAapLBRiIwWB<#kj$CGGl1!$=^aWJQmiNtCK!1<Wu6EYClqnY<\>>*YB4Lj/@LYw58
bZYk=4 wZ%e:<VjKy>h8W$CwPw5H5!C$Eh&54FRet^CG%@wk1q8Jp8PX8>YjIGNS^HjYN5SGdI><>aeXl\c$Ra8
N6mQw^ u5>bD\njB8uDPGIS?FCJ8lpXJAEKeuFRNuFAm>8:eML:$SB^LEHlPRtMJFK&iby11wP8!yadMQK=QYMk
CDWw8w aE\kL^JnqTSZ!\$XuBRLB&J8XBYd&485hRhCDXDad%clb^%Iw6P\Eu?S\nNZFVqYIS^iNp#Qa#n5:%KJ
#RNHa% hm/NTS?/5W>TVYCHaW>SRWF>m1^8a\:>ue*!P$tF&VbI+c/?+qh/@SD#!Gb8V=RW1u1!PlyIqnFcpuAW
tc8SXP VKQb8*eYpJaNRWlbCN#lDN9+1m/E6mKW9:I\DW1JP4HtZXIX&e^t9yTC=/aQ5!qyXR\A\q5^BDc&=lb?
MMa!lT ^VIlqlm$aQjt@CE*ueHql?lcB/JEYShk6<dGRS#Ra1SeE@CVhN&?Edi<\yqkI9GyQ9DI5B1$eRMd?WH1
hMQNS6 MLpF6JJy8?<?Bl^?MnE$ZEF>AQwD9Y1#>W%!9Aq<?JCEcEdt/KpdcMkZPXTN\YSl/RP%>Eb4N1e@9*TG
Z66*/a =R=GtmQAd!%=pEb^RjJqcbwTq5e+uZlhRJC%X\L^&9y$ZAubMw@AYT6luqc!hAb18j9Fk4alXbmw4M=M
PN<:W+ jmEtCuVML9&M&<Ewk>FcyRcEBSA\iZN?&wq5GyBJ!GcuFaHPcwPAD9tbI$y=4FEAEd=KaM?n$P%uh*Ca
WbSH?w ChLhl<?t?tTt<TpdJcLB?d/5kL*Xc#m=ZCAcK*!J>HTKQekEbE%LP%TF@E6KR^/p+$CV<d1kELkwGb!H
JP!+@y K>cECQ9lcq4p+%k%G<VV1Qe?I/Hp?yq^w6d/CQ9/aDFRaZ49qP4d9B^VDA$N#^c8a8bm/MmiiK6?Y4#C
P?ZGq6 CcWmHk&9t=pH16Eh@X=Bt9:tZAPZJ84LqiQCtFC>@d?>*<A?jFB##q$dcp*Tn@@ihkQmM@ckym:HHMQY
1GEBZF kLLZZ1t!qX#AdZAwAG!cX&qcRdaHaV9*#B+>mij5W\iWZMhk&@ALSAALASJ:mXn/+F9>JuNSE:4Hn6<#
JaXLi? pVjnED6RL^>61AC<\aukkNBRZFm6BPyFEC5Xc14SM>Nk#tupnB1ehFymAR\YEVAn+F@%ATh8I>VktMye
eh*jd? I&I?=A94C^bw\lE6FG1YyaE*!BpHJWAw!*JA>dVAi#1q&XNKuEp>RVKG>GDN+Bn\t4KPXG=HCtYLmBK5
@>\>>^ C5S5K!Km<ZJ6I$AQ8q$uC+ub%$*nY:EiAWA9YFm5&DQ5\44ctc$q#!TAT?M:Md%/dAB8D!BtG>GwMH$/
F8W/u! @nXVXqK6WX!+>KkjyinPFKh@6GKB&VNEFjcK=M\cktTMuntGwe%n/EIwLR#GHD*NteLRHeAk9J:\G+mV
6$&eSI B&>H<WjR?WthR/^=8jq$bVW%SRAABQwTyNN\wV/ByTdQKXbqN+J:CLK$bWXYB!D1Fp?!Ie+5knmP+wWm
WuVuN^ 5eV6AHe@PK4Ym4XGbDdlBRy^5#c+=#EWWDSX+KcTtJY+JEIL>qGANRq>4KYnq4mRwFT&5:X+PWyk\SAR
hYLAtI 5Hb\5iblDbwSlpcRBBMl6FikjHKRpCamh8A+*!lAcaIcFMcclINiK9SM1>bRyWlVBcA+CDEiJcB%>\$1
mmJQ5w CAt\qB$pWyM8E$C>ZRGQVwE+Q=yA5\mRk$LNJiVMT^m#Y=c?Z/GHbqBd4$@9BnFLqA4/=VDq^p!NlZ%E
kl&nat ZP<JdjwnjiA>YEmRRI*CciqGdQn=yW\X6S@\W#hwuGWR?\NJX&y:d:epNENYBJbu?S4mjwDa?4yMC1/h
FbQ81p Mqy#X=4bkb$:RVp%Kq5nSAC4Enw^5NI^R%E<1Ebh8^&qpEeq$yLjd\PpatTj8j1nb@b6bkd%*N/u#mSm
Pl!pul VP^NJh!?*Ipt$&d6%6WTtXM!JZ#%uu$%I6<$P=SWbNiZYdQk&&bkpAeFbQM$i#<D6A\/:Yw8+Scj>Btw
jIjDDZ A%SkmRA8R4$tlAKcXRQRWm8Y=9ET6$b9kCYilZkQEFP6mC\9chE:c/>luB%/?Z$HdB5d^HFZYqcIEP!Z
#XaQn= 94M/*!Ftt*%D5X+N!XZD%JRZ#^^n*N=lTcyTDXhB*$pY!!GC&QZ#/QXYRlq41qVSYa<w\SIF/Ci!Skuq
=>Kb1Z Xmm@EVYRuF$1<1$4RZ#46@j$+i65A1LQ=pdhwIy\Ea#*P1bh1M5cq/5S*tbbbLP=GPJN9aJ?:y!YqIMc
9By*Cp tN5wThJZC8>XdpD91G&WwcPMtMk%N/G$RhmFqpJaLlQFpSYuh$wS1&X4&tRBKlT$Z=hJqCqj1/GY/\qW
?4E=qd KCA4ZYaSh4aZECPCPNP/#BF+tkJAXD9=u4mDNc4NqFX55qCy!h=AHSN=mRCk*i?qEB<BRDqS#tkJCFEY
+M%?<X VY*1BHXH=%hDkG:jinYFZmXJi6BwXCqmALPSm=K1&YF9l<c>^MH9?IM+H@#XJPJb?^XuwGnTyQnMGy:W
j%^^&Z yW^M^e%<WiVEKLA/+cREJ#BWnppa<9<l\ySH%TlRRGlTV$=Q4\MC>%I/uDn6h$>bnIB=%T<pE5Z1AIt<
V8DHA8 F695RVHtt1TjI:dtBSp+JThaJWAAjPydCcKLhFXaJ$4YeCbh^ujTnpmEAEmAYT&t!>aVNH&DNM1WARmR
#dZMV+ 9q\hAeI?ABh8>GHX%#L6yNlBBByZkVTLE!&nTjXwDl:CDqMX6CkK*1B4PnG$cNmJFqINE&M$FDwnhah:
P1pkbX $ba+4=9^SL>T%<==ECAtTmW$?BKD\jybDeS1knyI/9pSPSwB@XET*yNM:KGVmLcb:Au^ThRlbyAE!Ci<
kmTLw% STnG6QMjDEI*MYXELkn&F#tS9!&hGBp4C^muK<upB*X8kjh<aRq*EkRAWPw9S+K1$DW\\pyyhw5W?wam
-ATjEI 0000ea2b750001202b3 Page 382 of binaries1.zip
t*//LA eSRRlptSV1PJ!YnSN@mMuAMNALNE&I@%TGLV4?\pbhcb#ZhFGwqY<uWkT!ck:QM&dJWRDGV:NlZCDchk
y1HKq: Yq%9I\dBVAZ\@mj*Sh*4i?FRc4EMBJA4#Hc^$=BqduMShT@ILBN:9HJlcDkutTD1nPPm+e8>h5RRE5hZ
StNFVi I8&#JXeFk6>8DyKT^5tCTW$TyC=^$R*^GR5e!%hTqCw8tpP>Y8*V8ERTScL\^WW%B<LAcyCpa/CCT$Sc
DQ=t56 F^^!TNFFVbZtey9X=RZcjYln%i+DL=EtHVnTVk4wpYhNyGyNHFkE^+qcm8<5\ti!MFqtSVZ<=/te?DKW
WTFmj= PI$IWkjRcw&@*S#5nA1PiBI*8/LMnkFn6Ica4ehujnB/KyEkLVGlAAX<JND1XWBBE5!h19T>TNaNBSAj
5PVmYl JXBV>Qn6aZ=Yq$qD5^Dm5!JIkE5NcZ/bKc5KW5GCpHm>dqV6JSIwHik=1%yVnCc%1uBWWI5T<8\B:?X8
LSSVjS QbHGFqa!RH!nJI4hXu6J/Zp<6peNKX4CAFbmdD5hH\11>HtA/Ac$lWRRkyXB\<15a=miG:J?XwbAD5n<
!%ZL&m :FBCL%FwVqm*WqR#lKHyllY*aYtQ+D&nd<=N1\qHMKSZBc<GptSZmC^cWl&A:HD+REQJ$w>Cma&T#AeI
A&l!NP \VMaWM+a$Ci!cpH5Qwi$R&u6P=Y!/?WYE8Y<KETtFwRY4<!=K5de+nE#BSEN!:H&T\JHWP#ZwHC+wnBL
pSa\<L C9@4=uX4$9cNkc\5<F%jT<HSQRNwXhwqJeHBAI6Ih/L^SIYD^LMnTEktlDk6&*NYlkSXjHh6V#lWFelE
>iCZJW Z$T%qySjy6:Pd#R%ylERcky\+R>yVw5m<&Cl&m1M9ak>PCDN%FlHG&ZeIi8#E*GmYWZYM<kNFSD#I=RI
BCVi\\ BnllTE!dES5qL!YNaBQkRnB+SppYyAaFMZE:Y<SuCNK5q$wm&%LYG#tYqDSyTSEpyYK8we6WW&XeYMeb
kMBRpm i%S#%wyymNyH$bjT6TNPTM@5ShADPta<aLVFk<>WwK!QiNF5W$+eAC1JQ\tSEMlmcGBAWA*$#C5d*awM
*S/k8! 9!1y1RIZweA$Kw#NSLM8N4$W!wqVhhtaA\dHlKdj+ynkTtcVw5ka8FkMCN8i1nWyA$%IEk$B#CwS\SI>
b5S=@> P$/ibFH5qnFScMmeLNCV4q4#NFKaJWEVKwY$/e5c/5&<IBHjPVu4kpX9IJ\+XeE$u4=jtjNGkhPt#PyT
/NEP%H JBa45kByXl!MyRcj!RR9JPy!!GIZ/cW$MMa=ESB1ye#EqwM9y>T4!hiwa8VmIICGIy$wY#M1!<4!E8HF
%kuFAC D^y$&R$/kT?J:+y9=clJAAVw=&JhAR5CYPHyuRD:6*hMR&pYRZ!tC#LnyDB9KHjl64iwa*M6waFkyl^:
&9Q*+6 VKZZp68L\4GDJH55\LjJa8^1SaG?NQ8SQKec/qKLw=WmX/Wp#GQyqbF&^Ci9JXdFRZFwh!\$%<&GmbZ4
R9n&?R q%WZhld:T!pAyTCYGZ!tF5L1kwKP!je+TNFuXY8TWV*:=RE%!IEaNcKSA>&P$GQ8MNP:@!kY*kiwPnGS
6!:m%: M@EK^Cq#hkmnJ<?BJS6KHAcS\9A%d=VNM\?^$mYA8&a$NWY1N%k\wc\GqRR6IWu:eW\6kN+pT*ek@Qdb
&:I?HI ET9^hAAmeIDTa<SyqjKeJhtcYSp\XJK?K4>tJ8ijVbbckI@FahkEyV+<iMaaC<^CkA/ANc^CF/m!S/Ek
Idje19 t6kMSaIaImG$XTBNTRR?W1CF!aMXbG4ANbd:?Yw4RKaHBSnHk45BASjGK8m$8\VnTMFw/>%/?*cDC1WC
BHek%D D?u&!IR89$VRACpRXM/8EZZ!LF!WbEb5ptN1mLHP1yB1qit%6ZaKMLcN$w4Wkh/4mn5tHAYAiG$*#BEV
KXutkV ^%&GApRMB!ZBIb9dDTT\bXGcY^e9^c!=+MY=TK^wBCWa^ZCPKRHh!5S\%c=/YcE^XlRPtVtmI81WB$aX
mntncc mSb\<SkWS!SN@VXiVS>%8YpW8$$wpQ$BJGPJ<Sl/F+anlcEb1@R$Kl&Mi*Y?E<^l!5>eSRt!W&cl1wLF
pHI6ca CW<>V#VumABRS1qiV$><!\GkEa$TS*N%BItaEK!+CQ>5>8B8?RuFLq+J>hj4SDtmuR6e$kak$T4a*%SI
1W?%A+ WCl^YFd+Va^Jp?mSEQQ4BWnGtK+4ewJ&y=upctcYam<K/CqG>DukXk48YZEBMAACcKJTClwqDyW%XamQ
dj#Fjw IqGT+Dp>e4Vl5$HV^G!becQyFa&PpJLlY<+P!#uAFl5pul+8#WuNR&GP$cTRn\\L^PkpuAu#pDP>St&V
bdqqQA n\W&&6G?dDnmYTy6EyDPKl4X!4^$%PLS4k%lBRCA&mGhD+nHM?6*HuS#!K$^iSm9tTb:We9k*Dn4>MIP
M^Hl=Q Rk@VXT6T5!M=ed^G6&Da!CPq5\4+&PIL:M#kZMW/5>qBT*VK5eQ\?S%bV>#Z5SGcH+PXm<h&<tCqWWDD
JJwGh5 lYJB8=4J#iRBjdSqBTMTFDj:Gd1BhVhRL<NScXR5bapI!8:QqNRFLE56V5*nbeHCa=YKuynV5ZcAak$d
W1K@Xu >Ju\BEIGFMQP?QaDt<5XL88K/dMt5*@$dT5=T/89/&Y9whucTLC8PHNMVSd?>yE1$w/!+=uYKT\1N&pD
<!R+K= w>I5?&m4=WWJkBRp&%jdj:L#i$pQlat^A\q*a@1J+8m?9McD%^C=5?I@BAjXCXAJLA$W:\Z$Cu6nJBi\
GP<69i aX5XiIIt9?!wb4!NdC$V4dejt\XEq1jMYlpAQpkkIp@n8ltcc+VW:/9CqcpRnpFeCBwEJ\$N<PF%$%VX
aWmWj% uLq9F1@cbu!pAFqGN#CEGERc!j8$qTdTK%P@&JmjEmLXGQZW8?bij5%mq%TPq?^^Yn9S8F!1j8e8a#?+
VLJ8#6 !>Bamp!b<**JqS9Z%a@A^SAVXR<L4$T*HR$Qj<IhLCPQKdEVBd<GBHhMn<JKAWK+*5E<abn5wX:PwA%a
I+bq*D 8&hKq\$wQ6:eye+a*B$<8d^!%d>1J>!NM8@+^LG5uc\RVmI^C&WEkwN^91eKbMB>FZ**4\Pd@Yee+JS6
wFq/=h mtLdt@w5#1=u?d?\^^DuA!VPY!<8l^y=?te/bZM%k#GWCQ:cj9TeJREIwM#:&$EDSc^jEeT=h$=mbS!^
MR1$A@ h$nCZGXWSPBe#I$k5jSDVqaI?pY:dcZRwJENC&%5AIIVhZHF$I%PdjEHW?><hM:Nn4\cQl?5aThQiV>y
u!hJGB ES$>wETMpYST^JA+#a?l&cI!eyaQL?cHVW*X\6ZQ=@6auJX%E?HL#A6A5G>XL$/NLS9u*#&qB8ChpCRH
wF@4!e eqVQNZ=/p@^Ih%=u\AM8^N:B#h5CTT#M+pGIYKXY6e@*\wtHDBJlyhG=?$5P15<w#ZENW8LmK5K#JnZq
bia1nn l?m#P\>wDL@b5i?tjL#W6hu^^cpQS^bCpV#^ahtmeLBl9DJSMB$1J6>u4EWC1qZm8+@VuPqny^\yLp#*
>K>$&q m*eM^>@wV1\NR!I>kqVu5^cemiJmw+tkWywY*Y=/X4bp6aVQj4TB9q5%B=8L5#NKydkQ!?#\=uQ!ISIT
\8l>\* R<$\CIRQ#&E@ph5eQCp@G$T*5*DRjN1#R#Kd868GLkXnB%X1ChumPeqaDS=:Dc@8kC^<^#eA@hclStVS
dtGmuu bhk@LCDJLH%Y1Mw?>Wnba&MqT5p4yp=h6kS:?S$!d?J%VFkM8kQ&CED5*5CjqWL$+G&W5N?/>@q5k?<n
R&V4\$ +EGe?*tZJ/SASW&AQJB5e/:$mZc&=c?T9VaQXh6kEMq#XbKR^SSIu6ViP=@BaN4$bk=ESP=h!qY9Dci:
?kXhMV W>*AwZcTYN/\yWTdaR/Mda<NZ%M1k1ya$PI:DpKDqE6T%CaG5&bBNGERJnuRLLhLyKSG<?Mu1%p+I&5l
jH$Td* bTJbJMnLQEi$Zhal%mB@:KK<*VRI+KlF*1aR%8FKQ$kQX!4#$n/CPJV#5F+?1dlTBWy9ZR&e1Xe6PKDq
\etBm! *M8$\VdXPAMAE64HZ%JTI:wk&bMYR*wtAQGShC:p^*45iI><jHCGlInRQi\m#hMk!+I+/Tw=a?6A5=S+
@tQmkW iM$NBCJt8wIGGLQHCiim1yB=4%?HaCp4EnhLL>5Ta:#*+V==$Kcy#XJniBCN=Fb=J$EXAQdtq$KXB+S5
kbVlFi SYB?M!dbFtw@DLMbE8yLtK#RJ5clCuW9>y$YQHZW4kw8yT8IRhWqpENmMHqRbCCEnyjV!ALKbIG?ZMy^
\FF*Qq u+&MiqC+mAAC\k#B$+C!Ze>ZWA<YClEYKuAu4a9HycVl%iX+tkhDw8e$ZRnep/1:ZmCB^YkNY=RauhqS
d^Xm5Y JTap1NPR:5w%Pi1eqK5!iS4jqLI:VNE#uib&YS?WkcAR$L6YM!F!De&><bSZX4*k+Pq<%puJZI5mDGNa
>EP*Y+ TYG!P&IK=#+C\P5ZyjVG#IdqS^AIAIK\8+HC>qJ^RC@P#w=*<EK!CuTACNuA<uiHXERcRui@8+ciNqau
6%adKF J84\&!IkhRFG^HeV&uV!QdHb*C?=&M?=:5P8LFl#Xpt!thRki^REVJ5WEjWBSJMWRm$@1RSZVSpwZXLq
&5>Mn9 IlNkhBYVH6BZThI!VZX%W\Jj%=4V&yTTQbc=%/tLwJwh/wLBXq=#Zl^A#<=9km$*4uhE:lV9=b5@Ic1D
X9aLJi ZanuyC<eYk&jAZ#+6JDntneCeSRpnI/$I>dy+&eZEqWl$%P?4B^95VXhP4$LlwjpkMZcP$&EkD?ayR@C
nBd=H\ eGLkWI5WNKk!LL<Yle/:@%E/KMJJ45#lYY<aB\Mw/tEbSCZ\<mhm#TdHX$b8%ykKNF+A/JcMZ:YFV#>W
JMN@\F 1YpXR+HYTBB!H/y9ekM9\DCFV#5y>9^duK$WCyS46/Y:X?5EVASR+Y55IL8W5C<qDwAQ*+QN&imBL5&y
B/Ve?d I\t11qPLNX8:nXXM*kilubT&!lK6TEQM9eTPe<EHT4$RV+m*$c#GJ1l\lAm\/=A#\=9#TSd/mJmQ5uXM
/!=SVw T*G/MbXt5RC&e@GR*CbBB\Tc9@CcEpC/9@aLtV9VcB+!e5Th?=A8=mB%EiL?Cq\ei8\eBuLk!Q/cT*1R
+n8hiX YaM+i<bYGQPHpVj:BjqtaZ:B!b$ACN8?aec\1\c!ad<dRSNWJuKG5cqA:*RBVuV&wX5/$jl%=\EwSN>t
PYV*lZ i$&^$8BJZVkJdRkid=nd9d%pSaY&+&4!TB+mZFQP^aGAbCB69w+nFIZL>n6WZii!QD1pc6&dt!$<KIN4
JN!J:G ZXk8AGTZ1bnBt9!Wc?e^tJS$iRlTD<^%kcnnFyF&DXKAitTklEtp8ZC/cjY*#:^9hq+l#E=JMXjJ8aa$
yt\YKK IebDu1DQWnTAZ?6QNRlcbeQ6$<5y1/yBCTV:tEE8l\JY+GTSyCClmX\eE5ulb?htTWHbZ>F?t+5FwD!*
HuhXPB M:JyPZu*J*KC9\KALLkJuE9:^t5n=Fyp=ZcJ\\u!QL5tEBMGQykBK^i4D+w1GQcYR%=mn$ZaCQN#5CVI
%tWR@V BAXJWPVGSJh\*l*>9Ip:LJ86D<P96EKSwRDSHL!GlqnabCQ*=yV8Jy:$bBM&5MtKF+le6kKiQY&Wa<t#
46=>?& CGuwwT4q6uX#=lySFLB8<pYI+lj^bEW8*^Si&wapPGjHtNaHeR?9=B#DE<Hn>#na8a/8IAC:AeK*=w$q
/T<aJh \kpTiY%A:yku#%1b8?#Qc/LB&#lewRy<y5Ccpd&8Kj\C@jwqkqu=NIbNmeli$\KIDnt#uRlSRt/yA^9y
4DWkYY q<jRkydckT$&IWVmIGR&4+6FnuEw19X6I*VuGtE+Zb81Lw?Wbwu^kl!lTAuJcTRR/*bRR@twC+KLDm6b
/>DK^X <#*aFa1uJPW\RMbM^#KpLpmwu59GkykR<LJTA#GdM^bhy@jbCaVMW:DR:AKkqL/<dCnTIy\ZyFiS@D%9
D1+*?\ eTP*S>/?1+>LD4G<?TFj@l/uCiAkKb^?J\+@EyK<F\yp<bDS+Daq*4A@TKkQ#*JAAFp=a^u5/8VDBABl
-AwBVW 000bdcafc37001202b3 Page 383 of binaries1.zip
LQPwjh XCq=:l1YLX==PJ&hDAi=IDqh+yA8G^B@G=#9AE<&+YF>+NMl8WRYb>kcRGwBIkQ+6E6PXnBkktMnZTGC
VKYVmH IjBEYANbZ*^aDn96kmNJbien\YQ8*CdEtTawX&%V/cM+bN598YQI*BW%MRKP#e#C=p?^!Xk&iVN9Pk=K
p>*uXi A>nVwX!L9cB?@=#l$L#FuTZVP4!%4\n@VmYZZiLDchm=VaWYWe:#8!FIX>58ICiIth9nNG^SkMCT6GJ:
A!WIMe BwZFdQbGNqMPAM!lwlSi4V=AWISQ^\B4i6pMFKILp5Pic8Nk5=8Ipt9y^je*<>AHn%S45Jt&RKpTKMaL
^b84K5 %JbIE?$A6&ZpCX&+!QSeaTl9R4G9meMdl6eT#wQFj=GI+ZCu8*MY&$GAqj!=R*#mun!lk\YF\^%VkZ^:
kY*NBB %>ecB!Xu<Qpah$Ebh@k^6apLuYdqD89p5qN!^nV#Tu*kjCCZpA/5^ZC/:Hp8YV^lE1TLm?BHRMn*\cH9
QudC?$ cEadCY#JktH*+mdH:FmypV8d8WILEJ8CVidpC1NMPyR8K#y^Sb::<LuIbTeRER/cBpBbhEicD+KG#F+L
Wima*H wncJ=SI$1*hdPI^^EVHM59pjb=1WEB=i?:A&96c9AIDFdnNBEDeDPQnBaaDd<kVLNnm:R\\?Bni8Qk@D
G*1+a+ tB<pkk8G%h!HEeiFu4<=E<IGeddh=nC%ew>e^=a>#eN/DGG#8aIEB4p+4*eH^Q%iZy5+bHpVJEmCdcHN
t@JY#& d6QpChQB#ETwlTPe4Rl45wSblCPRm5Bl#eE5!*d?iaTu%hBBBCi4?!bhDG1=mjQIXHLcC:!&Dw4>#lbS
A!qjmB kZbu^YXa#tIGhL#Kq%nM&TZLDu<mcD:AF4&ELG9!yDhn&iw<yydG=+MF5:C?eT@i4RV+!AepBRJ8e5/=
9HET18 \\i/*<Ku<*tqkana/D^p%GZ>D@XMYc*jLBGVu=6qiX#I+yN>IE\JBJADy:uD:uJ>GJ#>FF6\<piNtK$d
DEDweH a#&#L$wBRa+\RTK*#T?HqwqwM9:N+X^pQFRpBljE\Zw%k=T55mqWhp$GGC%VhFbMXwNTWPyS#M\I5qT+
^u>Dem bNRKY<N!1+<YLL1%wH<FRF\a&WpXmd&QLP*8KwB^+FV*#TB&Eqewp^9E!lZFP=dK5RF^8MkGH9RhTa^u
qceH%T M^P1GbG\<mGlqdi/:p^B&RlZ!MW!h+P/pLtLn5C*AinNucAaNem\Ad56yj*qAX+YawKR:m%VGESWbDhh
kNa5?b >EF!&eR5$6wtJBuKR$LPbuF+ZeHV6/dKBNIZtG9>C?D5$kIkKB%KT+iPIcF5>h\%WQdN:u6X1pkCCIHX
C*AXlA &ii#^i^DnW\!Wu^E&J^FXP*D<RtcPX&/aEa&8CuL>NRWZ%AAHk/SGe5GD=B8BVt$Ek9kc&LAtHl&qk&p
q^*&&a c?>Gjk!Z1bSHm&G#>?bM4&P9idIBB\l!5+:Jbq/yP=^XuDNSZZdL*Vyb\QP<^pb8kI@ybw>b\:NmAdJt
ZVE651 LnE?n?AAF&$Gn@pRF\$+VJue%jbTjlCZ<Bd&&FcVDEAJF/Eeyd#:W8\k!&#CHlDF8tScn=$5q4*<Qail
6\NVR@ Ea:!=hF?kV1ta595@d9YQ&=L>$>u@nbm=m*Z5C&hAq=kewuhA!pG9FyXd45ad#kTR9/ik>Zk%yV^^4#B
LBFu*J JHByqm:+\*9JN5PCWnS:PC+9TB!C#M^i*=WnMtaL>uKC^/BnNw?ZkTpnJJ5AA^&<ah#!lW<M>tLYkP=i
pTjp6L a\Py9*YjPeBiTN5&NlpDLcZD5H6#l=*ba$qDt4iRlQW=BEFPkNJ^=WLu+RKFNT:W=TI5T^XCVM#i6Vh@
wVLRFE $RhenZ#AB1CCnYGE8i^*!iM8HQbS!8VqP@j%5leK*@Ew:98\<ZP89kJePDDYZhuE#ia@P6::1YQNnu81
Yem:t& %b+9qXi+nw%j=XhuwJT*=dm%lm!nkVX4CNPFM$#pBAG<5pL#%:MpBkBdW$eSNJ<yQAZ+GX55K@hlw=B6
j\dihK %L\cHE^I+AVFIEwh6dQE?IXMMNa5u^AK6!XZ^lAYm@MQE#QldXFVL:A=ZSB8w#/M4b?uyX>BRB@!9\Sp
L^NND* j\Ka%Lq$:w6&JDlbkEJ8>V<tKGW:epRF5QB*p6Qw>Sb>:CB+L5WCL9mi\@dlZL#AStd\h4eELDytj:SE
EFjTD8 J=6cLwJ#55Tlt#dHpy!lZc4:CP5mWk#!SdL\>cj!pcuTS=+@Rt=>JMGJClRmCjb=HG<Zk&hB\uVE<GQV
u$&e+D /FkCG<#JcB:I&u*!6LBK*8ji4XP%qALwmtDMK?1B+Bt<%LiKMSA>%T<89%LX9^XJhN*eSkXehtXdJABE
EwHDSy CSBu\cDNQ/>Jh&46I^i&%Q9bl&%R8nF8tM&MAF&i+d8EQ*9C+T&H!ecEP8N8wb!/@dEFRMKSE4b#VuFE
!tSP>R Ch<LyHc/etH>c!eljC&X^>SduF<uT%\uKd?bp&/X?GGl&M\mbD15wJV=6qHE4*bD9A6+@Yaw1S1\!wID
#ql8Fq jq?R^In56qVajeK#MdEe5kTNDeCRK84Qj5lp:R\Y&+X5a>4#k^Se>MEY5Y<TBH!mQam?hcQ9W#@iXdei
DbK>+G ?:#>@PTZD/E8+hqnlF^!I1##MCJGR\ud<DL#MH\S^uXBbdQqwAV*dAAK5#AF6?t!j89*m!pq$?tR/1R+
DHMiTY 8kRwG1=CZG>9AaiqPLG4qRB?MJ!RuJ8%LieA8bRhC!E$YG#SL<*!$S:yh1+teyYRJhQ?l:d4b+?iSVFe
m5<n#T Rq^e?hdKiWRpmG?Ti#?RE#uVRCanq5>dB%/mN<Zj\bce/dwItib\&HTwICTdu=t>qklMk<BNH%QIHF/%
>Fq6ZY mm>Y<NwenZVB9M\@DKcq\X#wpPJHTPW8Q6tn1TRwmeuN@k:tM4wLBB!&1nGW5SP^%SeAa9MIKFkdMqhk
cTXFHY \kuTiZBMCC4XRDE$m+?D\qaee&pBpMTi:bS5Z1$eu^kEy5WppV?^l?Smp5@dXF<EcB!E!DV96&jyGl$/
cL/j%= 4Aiihk#/iFM<YRe^NyRqZ=kV66WRY=L:m#!!a=!NDAJnNiGLTuABK/@WJmhWy+G5!F=Y9lJWuCe?H:Ca
=A&y6a wL+#BAn8R%\kqtbJk+=dap5B+==bcM+><jK*5GGq$+5/9PGhdLbTaJat$LaNLlVQLW*IdS:GIeX!GXHm
%yTw*D kSe@q\K=yT1\tEAPbV6ZbA@R68XMY:C:P$FJ#w!&qG%\ji:AN5jFqM<8Bamk:N!^PQCVD/>mJeBN!4uA
a9PkZk pLiZC=JCREnA?a9clhb6*8GiGX+>WIa6pXKVE^n:!TJ>eGIHn\uN9d>cRLS<<=abR?C!?iq1YkyZV=Pl
8WJAPm dG8IlSMWc+<kywKEi>qAVFGMDe\GudE\qW8pqna%ADc/E:iHJC!IujImMM$6J<ac!n>/:%AFpp^ijd1>
uNQHkC lA?kcG<hF:$Klm$4ju&YNL$DaEdiEC4JbPt!%&jt<8y@i#6/AL?b+LR8P#k/#*Qpp?W6cFa1lJ8DGQPZ
*LKFZQ bMc^p&=8q$!4IpBmIwqAt#5TMIcm9ZPE/Jq#YS%hMcmHpm\&kAV&AaBSWH?IMSJ8/i:#Gb4VwXA+WL5T
@IP=!m NFu4VTB\Sctje=AKJ/EkaY1ZkDq+>+mVhu9\N%>Die*lykt6thE\e8Z%GP4$MD#RG&:R6KJFjML#QR*k
=41JW: lk@DekjCT/aq\e%e5+9dPneqVM%eFJb?cJ<iD@\/MA<8me688KMESd6\Za94::W/pXkbk$Eqd5HeL@WE
R6+eYR t@WRpJIZEcX8Y&@WKdZ<%KT8GS1mWTnSIK1PFNjL^/@$8idLG86ulwad/XE$+%inAudN*##iDu9yJ\I^
bq\!TD #@ijVS%Z6<#QDTA*yc445WNKnlbG/ne@h68>G4RTjhLWA9?8w8hXXbdQ/#hSp#%GLqp&65N%RRVJb+a1
>C$:?5 :H&%Z!@F$nS&=bXak<Qk\=VwwA:9*6wQJ%>j:t#u^:Jq$!?%RIuHNic/CDyZ%ecQaQZmSIccX@XRN^L!
X\*W%& tntFe?anNEAlN*i*d66S#RyH?ZamRI9nD/K^B\1N*48IXS1F>C5%8?:+luaXH+edTit9hi#ELhp$h4Ml
#TXHBk \>MSL5%<Wb!a65&qVkA/tiy\RX#itNwIIt6VV+PT&VcY8VW5R#&&Vw1YQ9I#WcNS9ZWC^F$ww?4=CMjQ
h=C!R8 S5Hi:?!@:#W8cI1W/IZ&V@Ik*\&:D/SLCSPQ8?d:GLKlRaa&B/M*K?q^we&ZbuF*Q6lhAICLZZL4*lMI
aMS$$% :*FX\&Jt6?:E*Qb1YDn9n$bAdmq9*QieINy6tiiCMXYHVb^JQPckEP/NyL#WScPHkw&*1M:14B1X*%%d
KHp\nS 5$ZpSX$!F*y>k=@R4kEhmbHY:51^L>S\Xh916qE6=/5XY$wt5h=iJ:!/@PbXjPG?E+K\#Q^iEI1/?j1i
?SlPku YZ#^Y4LEd=&/k*qPHYB$SGL@P8wk6T#aK?aEh/8VWtpbi!W<SX\?aHuj9lQ$XIuKKJL8Sy:G&VCX+1*a
ik*P*D pmMF6QIWW:^EStH:kXckV8WM1T6bT\aMnHGKtdEmJwy8/c@/i6D%EYF/mdqjh/Q%%iXPPLAi$X1t*1Mk
a>hTDE qL9d?$BY<VplS:4pM5W*C>M\+/Kc$LMY6?iIJN?$?^\SPB&D*<1^ie<Z8=I1K:h#<E8:m1MJaGbE=K@I
miyJk^ FaXZXXwY5kkQAqh518N<>4eHjVi$/8*1mESA#L:Jn:1!J:dcEQNLniZK5:Kpe8pHlTqeuHKl?e*6I?4L
=:a\9K >9eh*!+@>R/mRQKn^yDy:YePlRhG^&YlR%FS9>4BRa&kJ&+Kd&N>=Z#+5PtV>N%nT4?NCSKNB^iuaVYV
y%&ptP Xu!/k!X5PG#Z&@*RGt!mXa+LHdC*9LkjIB1MABwReuIlt:E5qd*6Jw#W+XYT+uZK9cZTMn9HW>u8EALR
&lp#KD \iN8E5^5#nJ6^1cq^Xk+NcAuVLKj!Qht\BYSbit*6tnAPNlcCQ*AIF8w1:W^D6yibJHnQuTby5dG4$e\
GT<JH1 #6LanF+R^E=dKK&\#S6NKMCFtVl&uXPiuTVDb?JQAc!#mRDdmcL&AMw&I1\:EwSYAXM6+h5:$>V!m<Sy
+y<wBI !CaCP@GCPMH6F\$lFdM/1b=N4AKFb?HFKYTX84JdluXbI=dNWjy5RCtJq&Q9bA^H>ndH\?j\8@KZCcwR
wltE9X hy%!jqnkhhwF@YeSP+CStY5=WZ9hB!H%i8!&eAkFD\E6ZpNDXujw88yGPNj8LYqAkkyIE:Lb\8bDpYl1
SE1b%N WcCWDL!6ETGkd5tlC/AKqh<*CZK6uc9ZGGT$@&=@ZCZAay4p<C<euWhc<u9b\BA^Y+JbH<DH6dR@@/C5
!6RPN? wS+y/^l:t%=*j>P?DlWPnyaIS>CPWwm4TVm&&Z4iNt<=>wne?I*%Z4%n^LnGR5!qC>Wd?Nlt85kqBEIQ
5AeVZ1 A686HhbZ#<yRt8q>Y1#lI&+9$?9^wKN!eP%ZLZDYL%KLN^n>\%Zw<QSN<k6\1WEdyqnTyel1wRV<=iMM
Y+8N&> V:Xl4R4ktc$Lh5Sm=y8qyGl\ZX=Qu*=E4Pb?+E1A6u!lHB++Q&H5JRNJYaj@:d&pSEnA5/eBBR+N#?X$
Q6A6dG Kju+5JTIVMWYI#:I5i\l!iY$I5aqnb:R$FH@>qkqnmYL=SQERV*V#lIMkm=ZAIlFhAYCjd:wk=5t>du5
Ty+SFW jFnNlG^9@RYetml=yG#CmKcj$jq8=6DDdcq?RqH#MZD4JtS6E%bI$bi$%%Db=<M+JT#!$di*RLJ><jL5
bWP4qN jhL/mN/Nc8%<l:haAMjFl&HcI@%#?Gq\#neVH9Gbbu<S/de^\AT9@k5Aa549t4$8k&ckXS!FadL$4MHK
b%P!SK nR!=%6ec*ZI:*#%i?%AkBP=KeNE^IDZ!iq1RLty8Yk+!ukk%%MGDTY668iG/RH*9TdPiLAuRSdlYu5N?
9e4YKI /$m&nRDNep*JKBh&nXYlmPW/&VbRAIKGw$S6Pn%pG*^EJAVWG+mM&:$iAK>ZwhXiqiYN+VCLySky<K6a
-A\*Km 000b76d1bfa001202b3 Page 384 of binaries1.zip
hJ$BAG j!Zq$eq9E&EVZXc<LBpJaha9KHd4QZ=Z&>FMYmedMJa9#Yyn5>uJ^ahdbZPDaLhuand#&:nI8F8bh\hL
LP@Mw& kbncinP/T:J!nRcP1!ja=M9I^^9*h@Ldb6X8qML*MRpJ5Gb+pCN1qKFP^KJA?Y&ti??cMV*QTJKCCNtq
9kHSkK !>k/a?tVAn5:IT+JQ1j$Fyh5tyKPjHJcLnTJ=%E1%dit>AB&>dw!:ae!^MWXZI9pD=Xc%m?TA!B5kkXQ
1dCKub 5F?ttZFJemFGeTd?M8&F1>bk1P@!8=SMm4*wB1RQ:VkkRB6NqHqd5S*$IetujS\qM5F#+^XAImZqZauy
CQADIy Bjt$hZPWd/1P#B>!wt61A+I&qiB/K+CN^=VY>D1<:%whEV1eeww5JaMe4/w<&l<M:yEy:4!\PRpWlMw6
pl:5Sl C#h$&H$LAETPCt?8QLnnW1N1q:WSE@p1MCh4FR:@8485>LSCH*PFynSZMJGaWG%=LYh=?ub*GS%QhKS%
T+Q%&a 9dTbP@Li!uG?Y=Y@ek^W\RbNp9LI\:NZuZ6&qDk+?4&q48:XBNbW6Bh*d#n\\XbT/<6Xk+W>&@i@@*H!
8^QHZ= #5/uTe?Tu=:@>PVebPb6*9IQ:aG%y/4#8\=9i/P1Ljka>u^!n\L8>j1u9C>dN6::<559T#@8VZ><88Hb
6qme>J 6=6D:/>8tj#<c<Z!n/Tdu*:bML8miqu8S<uR>tHpZ?*n@e?\>W%E#D4Z^Mmw4KlI+n1H1M#amCljb#9m
l+6$^# :$REE@M@+G?d@$6t>PhEGlMn!@>@+6//SpI65=WK&!FWYw+@Z*!+n?DAdF+Q\!C\P/QINKyTwYNjEGX/
FSnaV^ 1:/<i\:MQ6+Pc6qpF\<=LJP4HHc1?nZM9y9GMMJZaZ#ABwAM+V>\d!PXEjBcDK#Q1LI:uIwXn/!#hHm=
$V8&bQ \@a!I#eebWyMMmjeJ&EL4#kNt!kYN1+WLHa^1ZWd/eGZww:kDVlwPQ=5R^N?E^:41Da8FD!?LH?VB#&/
D>R<@: %lF%^W4y\1+:P!1&D?GXQZc@1^a5^n=@d>GNK\q/Ky#BjwyRPcPZSdd=AEPAZG/iE4:<>H%\:*Dh4T8W
yJRqje 4^aQ:#mjKJR*K6n%5p8<XqAycI4V:c#Zhi&64t%eyKR1\Zy/>!9CY:H^p*wJ9qA8eiRBQ6h$&D:8k1F+
?6bmP4 PXHiCBMblKZY>PHR>w#b4nNc4%DZqJ*%%EPu1V*qGPuPGXwVFZ$/K$+SByaiJMAkTF<FGKS/\1k+%d@/
aTm%E@ Lc?t+JKJK*&aRT1&H^bbtchlu=kWi>@<kli&YiB4NNE6^QJB^t+Y1l*EV&^iN\QEKeF9Kjy&tJdyiSD$
*BpuBm !>YV>dybVR\1#Jl=a%cIYc!$KmwlJPK6<Y89>L6/YkZ9*CeK&Hn$ia%1T9ea6GbnAMhD<QS/lcM:GZN&
u!yBCT #:dkC/tSb\uZIP5*cd4JVF/I>E$@SeQj?cAtS:a6y6c+*?@V1?!:RZ%h^?TBIm6jVqTiP/dkXy^?Yhij
a*EH>j bH?p%9!&W4@$qVMbGdFZb8IQJ6!wW8:bNVpXj#D#y5t?eeMcn^5EZTR@P!Z5b8iXBF&itbdPuwA1wW?E
:D^H?j #X*Q*Ci<$c\wI%SG/EYT:$cD8DtVhieG*^VY<c/RL&YKdtdRyAR*4MNQu#1@:$dJcnDbQDmmbet>+:6S
h6<5hj aqTRq1NY8B!9yDDmA!Qp=jSWcbTY^Pe>^:%9Ee/V=?BJk\+9?Ripj#Zc88N%eQHqT>kIX>iHG5&uH^=I
/WT$9> 1IyiKBj$QlWJGW$!cqKRKKjPY<J>C+<Mh@>/puKl<NKu4YK&/&Sl<qaBI+??qe8F94?5<P5Bm#8Mq??8
X#/4TG :#>><&4cy>6G+?5u*A5X%$@5D<L:uZ%%/Z8<F&!DnqYh#Q11&Z9h#cXhn:KPjit/wy4t9$n9i&R=9>JI
c#FQ1j ZM\Mcu9!?5:*@b&j6q$^@D#?*uN^/6&Na$ul:!=ep*B8!=VjXKIqZw/Nju/=:9le9i/Mk*Bca6jlLE?N
Xm#/cY XiYKS><jZ@:ktN<D\THk^bm!Cy?S4miZ$n/?WZpQ56yKiZh5\YIW??CN=bJ4Ij$<dY>=SARy@6Tiw!/?
tt$ZSV =XZkCXhtVhQy/KcB5CQKehj#+/=&JT:iF?iREQLE$>#PQq<!*W@M/IlC48EPyhpG9:i<Au4FbYDt:QEM
6GK%?Y h=5=&+yBqBwc+^YneaN+%6d*Xum@E&\6Y\bm/FbyiXK#KTiu>P#1nPi?hX!Y#LPnnME>6?&&dl6m94uT
YT!+aL BV:bq$:ML@R\Qp1>XF@5Y:=lhPuhWj?^ZaeeGNa9u<C%NX:I8%q6><=@acM>?WP<EptFQ\8>M!RhbIj*
nVYZyk MYRqc8ClNN@1a/Cy#PG&N>jVt^cLY*#lDLBlA&*\/YnNt!#9VPDaZGXkRM5btHdAESqH@\#Q4*YH&4L\
8^ELTW l??jZXAKh?Yhw?8*Xn!wk8!+=i4N@6kkJ1bbYVij@y!Wh8FFa@htSV6G9M?I!5BIlWd1W5LE\mMB=FK@
h6b/cW @MVwAb&wEVw#\tK/9QjaTX8!kiaamw^/uHAnp?^FhlC=+jI1aY1pKuYWSFCwm=p8ZP!e=58:qb?uZd^e
N:ANKD N/l<c95CwtWhiZ/%FB4=Ty:6a>cAkpp:=KH4^F$VMe>%bJ!5HI+YhDe%SSuq$5HuwjPy^*e59Zlw^J\@
%PTCF^ ji!%%Zd@FTQZL\JQV9M9^XYBq8//=YXl>l>hduK#?lbMMPVq>NPuw^M8DqG1qa?IcqabL@NMF48%n?c+
b&u=*y ud8/Y=XctdV%jbek$#ny&Bh%4/CY<K^JFFtHHZhlkyh9qYauE@!JJJ*h^a1lni+KC6E/JMX=t1!%#Gp!
q>B1Yy J9V14NhyGZMLkdMuSpq1c^nhF?N>8l4#w+WRZ*jML95V<hXFZ^k=6:MWV><5eqK&c$qMuPYiY^CtNd@&
F8^$55 dwL><Qjh&i^YbK1@9!S/ue:cn+FNlX\4WQ*dP^5QublDH#5^Yeku1CY:uXpjcIS:9eP:wF*>jt1+^?B4
mjMb?1 %%D:!^=F1?8%6M@Ak:Zn=mn5^J/SW/=?#a9Npd#:4mbqb*SG#NGXydHJ8Q#/R?GX91@:WQ!Qd!+eb4>W
!F5$XY 4F+cmbC#^ZqH+FGG@wSk#6F/Iy4DT^W@!&9<cPj\@nG11d8+LY9bDD=T=j^K^>::R8G+XKM#i%9C^9%X
pK#RPd $j6e*RaZD@K&tGj\#tn6&?Y>IPbK:b</@!R:m4*RpHKeFc&<^i<p4FH?<bc:SY>q$BbJb@iViu^&j&ji
jqBai% l^?R<ZA@Xl/41cMhYb?hYl>A8q9eF^pejYk=J9QP^Q&^Fa@!+WGnB5J6TtX5:L=Y<QEJMecCKYL/dyXu
cB698+ @?aDW%+&S%Vqb51?Yd=LqetqDT<%9m>&@*#1kQ:=i^m6^C:4tw8LF\hEnWdn+85jDG*VlIWHeB#<QSk6
k&k&h+ =FNDy%@LRID4Bc+9FF>H9#wX*Z<Hp!5Xj/D<e1jht\VQlG1L\c\Dt!IK@cA>8#68=X%i9T8YVLG=h^nL
Q/WRpc hCMij5Nd?*=LS$ebNXH8<SD?IVdyER/iAdpR9^9t8?LitiIuJ>i9p\tiM6>Sh@V!jX?9\DlY!PY<S!Zt
4S5SZN lZkQZa6uu/<nR<I*$G+bIdT<6684G1i?jRa$G^d@&44n++6N*$>%8^K9jQn<jAGhMJScjZXCu%8YhHmw
plYXSu Ijy$^QSJtX8b8*8G*\X%ySL$\&e1#&!pQDj8uFc/<P4we/nm?*jd@c5MD!DCF#*94w\&**&ahh?p*Thm
ImZ!DE =/&AuWe>\q^DS5Z:>4@jF&auiEKN8:G^cQ9R#m64Pmb*>MIQdT^P8ub\iBDmb@4<=C@Y#S%=I:=&%W/+
cC6CIJ H+&PS:H>l>VEeTi*y1?C=LhTe=4pH>5a^Du:/EL\q:WbV5pjd&le1Vd\1haJMq@F1F>9D>B$^qieCAPN
#^ZBb* 8y?=!I58>%aK@YT8*aHTTj$%DG>?#8cV11:Sq/$LW899LWD^*wG\M/*\Y:/WYV!<JG6NW*b@+6Jc<Xwa
^5HTRR bNF%u>KQ4h$I>bdQ9jWyjV6V+kan9A!uelyLNa>aLi!&jpP%%5FPQW6t<B%<^/^5S&VV+ceLiDQRE6>C
AX8e1P q<pm6j*WBnCq66:JNdR+W5Wl=5%M$:=X+HR%6Db5$R/n#^C?/m!u$N!d>V%nhcMGNE/iAY<R:Q&CP9K^
\k5m+K &eFdQcm!nq!=ADbS8\a+YQqAR6dFBX+wZ9LkJ=j1GHw/C68ilcbH%weLSb=9@X9ARRlmwt8<5Pq6B*j4
*Ep5Si &9ulT&GDk:?e/Q/q5cNP5m84%C*8nj/8ZtTcH4CwZu5Cy!1qjTkpy?MByQCilF*nXwieA9mnh!=Y+&1#
Dt&hBB 4+whm!ed6:dM*WSIL$t<dAljPPG$9bRqm>5wi:*FDVbyacSSB\9*i/G%jn\4R^l#BJ$ydHnV?\b+9t&4
D\9=aR =D8\J5d@k68D^CScAM#Y=4yGiL*kLHHS%49+lNk^N<lK<I&Q=?PpyYIE%a/&B:hy%DWe1S*MXuI&HwNC
6@htFi qF1$cuKcqhwu>nwHHtt8dY>iE:kNH4mJq^lZiFhkLcH>I/&w?&m:R>IEwWIHhYKd#bSdb1ABlyV#+P^b
$k^!Ka >MbtRZ8BYd89:\E>b#XB!I5d&+tn5%=iBHN^HRum5:1JVhKSq&wSjI%!:Bt6T+hR?*i@HjV48!VPbwVk
lhNeVc Z5a<i$\i>!GLM+NQPP$!bw9y#bCA^dwJ?NtYqZBtF$^:&5MZiNVCPD9S%Q9CREjKQ<\NyHc>ND*t!=pJ
b:6/w9 mMFI<bAnj@G5j6*%%M$P*#^<F59DA\?6aNhV68yNDBFjDlm<ENTNZ^e9j8c#Fj6t<GPWJ$4kXAZXFG+T
<MQ86l p:$@Z$H\16*CC+w?m&?5t#+/ehBpaVah49<4G&>ac%6+Juqhen1^n%A$&&GKG6NmJlQ65WbC9A+\i/%8
Y@SG*V 8LPF4%P^E>cHM^QRLPaM>R^XwMCkKT%MnQnAtMuH#BJS/5Sj/@GnqAG$nyN:*#yE8Liq&&u:@6Z>SBdI
ncKai> ah@&:J*j^L&?9+#yi:bdWy^Q&kbH^=wwJTRb*:mKQ4ie*VLlY1C&+>*hDieC6=m<8VZeV+wQ6i5n5\\C
yGB\56 V?$4jqP@d*yBYDciL/j?uVcw6hGl9$Kne!B!j1DP&<=6u>Cd6kuZYLIpy^C:#lR%cQ*cTL!C?hhkSJN@
/P5Dtb BV:>badSQ#IR:Q@+/j4*tWbt^D>kjQ<>$?m*9%PJSu@R?9+n+PmjIR8@!*>QXQlHEMQQyB@>>$CF*@@d
y<5^MK *5@$Q+MX@te/$4@T1Q+4HTu66*?=^$ct@Wi$^V>!m@=ITVI%@\hc$Q\QFLkq=S?@N/L<$Zwn+#?InEbW
DqQPTN m*?PB9?nWSt@=#*<Dm4\nI1Mbj$nRPu*a@#PlVG*NQ/jASu@C49/!/d>M>@C^Q\jX$@>w!%Wp#>?t9:^
ZHDFX$ ?#@TuKl@pB^N@\A!t9:BW<Ta@uGk@&1wEiY@B$Tb@DpZ+:@#6Q=#KE9*5*h%6VD>a#n:#?G8=Y<Z>>?H
NmX1&\ 61ty^pqycScB:4+J4q9ZPY&LnVHZVXELCk6L<R8kduWP$*NJM!ZbSbDIhp:i%1Vj@8l4iIh/&/##w+i6
J\aB4# &:\?iDMDk$yJV@K%*ebau?4l=c/XSNhL<*Kk?^y+bYkt&Z9/tej=/J69nLZc+EyJ%I$PT*Shd?ISd/m=
eJ6@cu TWM#IhLPm^Sn4Y89nWG=tPuy8Y6/yKcqGJkddVa^$W4NCDH\DdD\%Nmtq?BmbKXt5m*XiwPdkd&^Q5%*
:M*WbK ZRan$CtSFYJw+Bq4SE+^V#WlBYFR?5t5PDP4cN&E$AB/8FbMQMZePhFdQ>=:t/uj?qA:>aT6mZb1!d+i
Ic<&$W +idt:m^L/kaG!!9C\I4m=BClVj@6X1p:b9^&mIANdpu4*dWwcSyWe:$\QbKyC<*SXF6dQTk/hQM&$:SR
6&/hY\ X1l61Ca>aAMykEt^>KVbcBlVuDSb!dRw1pimp/p?C+Qc1t/X=B+Z#@C#%6bjy=$Ry8G5=tu6uG\jcycm
-A=LHZ 00096dfd9ce001202b3 Page 385 of binaries1.zip
t1P:DK q4S8m<iG%C$dkq\yb9+y*payqHA%Z\&Z*?/u\/a\:\md1QSwQY5MTn5<^Vte6DGJbStTH8ie+Pmmu?/^
/<L6#^ #mmCp8116!Em*ZCdnWFKlE6aBNQFK<nFV!>IT<&GF5CK5ZJVM>EpdXa#hchmWLFJ=5/Bt=LM1GT%AH$6
u/4Wp? 8ycdnb+8m<GIM9JVW$<I6YQalKR!$nR6Ey$eHRI<>C&VN^9T$8&M\@!664C&dk:YTjVAwKK*1MWal4DM
WSb&AT M1mYMZEGWXHPYq6MRuV6jS%CcVR#F@iaeD5dB:e+Y*M>t+CEJHXd<<%d/IuP\Rd8=nEyyq9>jcN@8^ii
c4eFRN ^nV6#Sdd*CuSyI^aTpbMK5uYqBZ4u&Dy5#ElJMNp<&b4L$P11=?utX*CFyKVVwcD$ac$iN5aM:@p\EB%
B5nwp8 Z@9RbA#KtPpa9eppQbX8u&Dk4b%5=B^F>w:VT9KM>9TM6QJuPAcE?Ll:pbM<\\Jy*1GBDPa/<6a$d/<$
&5NAyc a$iTT=16l1*bik^1k\WyNh#RP#+^Rpe4SM*cImlC%!1ewlu9E^Gyc&mt=cD9HeFpJEZFY:pFbun4?9td
MX^AlS cdmq$Q*<dB#NVTQCZjXaESmWj/Blt1pH\*$L$&EhcZMGM*/DitKAu%NGe4C8Zy1^l!ubSb6qHPHwF5=!
ipVjwA mw@!mua*%Al!6/RFM!$N1I:iL4c?G#CwLSaGG^P$NHVCVRJN4hTy#udBY=IyQmtBY!J%A\#>\%Km:F$m
abXi!D N&6Vud\n\mMC*c\<NtuadNEQb?m1J/X8>FwZdQPd\WN>/Wu?Wh4^pe+da^$CR@*<LXndkmQTdh*JVKw/
lhp&R& tW^b::9ia%9!Nl<j8%kuA^$uDYi99db@&Z?a@h?E$FH@+Mj?6^A/K5Z+J$Lwj5?d?&ia#@><19+=Hi8Q
uW%Q$: l?i@Sd!c@BuH>&j6*!BiVj/M+@8#>t<R4!b@^9H>ljb9M5#?VPQ:5>d$:<=4@BNc<:@St9!E>t>AQ*<G
EPL=Z1 +@%b?*eAG\9Vu>Cc@+*Y:N>4@\+6ajEV9nL?8@9<E:+!@49:@BP?M91d<%4?lK@?N1LP<miM>V6I<m?%
/eX4A8 Q&G59?Fctqn?lLGMLQ:/T&n=M<a!?=5&@+T^@wdYcGL=E<d/ueD+q%4#@+ZY+u@^Gj*MA?89+?&wqJ<\
=Dkcpu q1tJ&X>4nj=Hly8=&d?nA9^uF6#9GY:Gj</Fw@=*V6w@Z$yNKd<>b9+@SAZA>MQ5qamhbF$FtNy+>VAn
\M:^R! c4\\6/?ML8=Eqh?H%q:9<wkSc@TciyBD9?bLNwpb*P=Dq*SY\T6%japaQlGiQBNdjGl>i@j6<jtXn/E#
MHS%%k >D:H?tew>\a:j&JBCw^P#Mm!$BP#:EX44!yC8%KW1$NPHSA9I$S@PIP$B%<><:IT*uMC8bbcw/@@pADV
<GqnEL Q@tXjBM&$n5&c6Jnb#Pb!&KH+=EGlGR<blS9k^e#IwjIP$VWXe4&S&RNV@bHNA%J\CCCP\4t:j:Yp5XF
^bS>Mk ::hLh9ZE?T+Nk8\Q!%!eec?jMVN+:@F1IEXyC/:RMKeFn=HaN4nCeV<We9pWj>aSuCNNmiHp99!T1kl9
hk?Flw EpXJ$5iGV!>b#^S8WB:8aVQMLN/@>=FyJhGG=AdK@W1$lt>%bC8=qc@H/d9VC?Lj=4LP!&lS:+mmFYCa
>c*ZVd mh*V^bWDy9Se@%9&T8m$8Z#/^Ll/miVk8$$J@kG?M4+mW>$>>pFth=5mH$1e6wmd9*6uha?uY=Y:y*^H
Na*Z/$ /X49=P&?llM!6*5m?qe&%BViM!cB!4PWethcRyySZHXFTePqSj#65Sq*9p&^:QpFV+iP8&h\a&n@!keY
J@=d8G &i/^///hW#V4lDh9!4&%Ye=Q>&c8YL#S>5=*Ml6qGuC*nBkdbYCPIh=q!1!Iwd9A+CT#5DYw/6!/d+ZH
NhAiiF #4Te9=N^59D^w>6Fd>AH>#me6imndb4$Z<XL$n*y!w8Y4!Kme$?hQ<GIyV5KY94t5H=/4tNjjW:E>ND8
i@Dn#c :jDi9q@\P4nteLnq1*T#5@mkW?ESEpHGXeXtSbeVw6Sj!FN/Z:S$uicc9!Tq?T4+?iwqCQ\X>t!<KqL<
/iSDqk /DFnui+JptuhFjBhdqImMZjSb?1w6I!q$pbenj*4^1?Sh*i+NMq5n56NRBiyJ!@NDXJDj:$@?cdS5PXX
KICbtW ^i8wVh/QC$/wt%EX+^eC9>@JWL?$W#WmnCedE<95iuNcmMhedjI=1dq&1tw^bKhpZnjMbJYuQ8D/wiS>
N%CjuR y?ZE!R$ld:V9:Iu*?@Yt=*VK:hPQht$y@Db@jWZkKBww5#:SP*V$*NL&F$9t?ujmP\@ij:n>i5^D85PQ
VCZ<p6 Z@H^Wlaqy88FJ!a\V$$/LR!dy$lR*R6Hh?E^y%=4K$w:nN&!V/N8W=HXP^<cY*b^n^pDtKk4jcL+ANTa
8LHuHQ QnmIqJ=*TmjXinpd9J9qXlWZ*P6X&mNw<KSti>^tjBp#LR8?ZQQ?>Da%uc*Y:Sd*%S9ta&5KN!e\ZqIH
$9nbb@ <e/!SVcS?YYD&qi1M?TWIjt8N&LjZbn#?D#uu&nt\&yYKI&LD^iQl/%n!LbtZ6&tlNjI1N?Vj*A=D^lZ
V5$6iY YN*8ZVl>dh=XP=8=a$he&c5Y4eQ\m9jD^dwQNC+9AMi4\cwdHR/i6::DX+SEDJc&%q@5=Rq*89w?kR>>
9t4ipu #:$$cZl4>PFI&HZ=ENQX+khSjyBN?Vu1qEk\PN?@V@8>DNK8cp^=tEbPynNMDi=i:St&e+L*6=/TmR#p
9KGN11 MeWP5\dD<K=??%LL4Xc6a6Kj>Jp9qb%a54J/ul9t/R>5EmNa\Bh1E:$hH?Vc/>%*Ji*d9c+ld4kKH+=&
dLSuGF ha$:?6:@qN\qF>M<W$>q/LEn#^eN@BGdQhZiB#$9n&*$%419&XLbql?^P>jQQ*TycpDGNjC<SS/#5Y#A
Gh1:5? !ZD<ycd#EjeEm99Ec!6Jh#EEMHKNlI*\d/tNySQbCmi\wa$i\WXGm@n4K6euwpd<hW^tQHea?Dt:i:=*
XG5AC> *ip$wNn@<XJcwFZXL$=64:#*dbGZYAp:qQw^:Xd/=CF>1@&i@Z96V&k5!tB*+uThjHi/8ydK!YFNWAW*
d5\yt^ =BS!<&\XJuQh^c@QZeqI$bEB6t?p*bWeta5@WXZY/bVc1?NdEj@%kHRe&#65#$dy?I\F>*5l!@:n$5?Z
XZD+@t Md4$?8$9G=^N^<cKZ>?wnSeK4Q94idEllHmu:RSqq<l9Sc<j&l>*6Z#Ajdn*?&9w>c:K1ZtnE*%yRd%:
j*8Ih1 JYac>l/KAXd9d4K*m8M?hVKnQE6/PhDSY6>5@B+9EX#=*8:$yX&tZ<NiH#4!LcZq+4p#&18j+qhelC@j
NE^A\H #TyX:E=w1kSbp14YHt1@+8HWw:!9/<?!Qp:Za4nhqwScl=de>dkRFe*6#+cRn:<<TW$J*&5qYcB/hhjw
EnZdVK &?#!P>\YtGHpnY$dXBRP<h/>SHid>niiduE6KQbW:^9tXY=>+?/c@$Ztm8C8@A8*hl?<8Fd+<?m*&aaW
j5\#YL B$/Hee?uD!Bqn#5b<iPt6=t*dKZ&4blY=@w6Ith9u%mP9IRyuNIjm&@M9yXmYuVj\VB1S<1bltP>#ew>
qC8:4M SnuP$T?9i9yheG$=cRZbRyWPT$=J>N9kpu:*<NjMG<Jd5yQM5Sd1&i<*CySiDQWhESSQ=Td:%+=I9/#8
uacN^h mdH$%P^jdk4Nu:>F1B!GuR4FJ%Ch6y*#!*S/>htjHDKNLkw@#=6K8h#@TGW5Pwjq=<IVZB\iuHqu@THB
jG>Ztt \G6KcYN//wH*l?!@ZmRi*YZ:+FHkG>/#IXqF^W9:Zk<#VnY4@VAj86i=WFEu5c5b8&Gn<:YG$6TphT?8
>S**iB u1n\?Ln^p*S!@Q9WJIeNt>dNikX><iM:K!Hh>@%A>Jkil+%>JGPjYl&Km$?%y&db^65yqS*Kpw9&q6$1
8L/y!N XlRRB%Mm6:RA^SZ6JTkt=Z!JyTly#/Y/A6QwD:h>Vkiwj5uVY@A6I&a1P?w<hQ5P:!^YV^HGuqG@*&1K
5uXmp+ ae^jTu!/aa9QjhPRh#4d$:n<n\@qu+4%PM1E9L>^ih$P6<&JuCP&H&c5qy#jKS<:qNyRMqcBeLB4PC4i
*:9ElS Np?P68#aj!585Z^?cLC^cEZh4YJ=Ie1l8MF9bdQb1SeQ$#=%^u#hQ*Tw@E5V:wa5GuWi$=MbnM/#ET1h
E?>!9y NhQ==FwR!Y+aP8j?1@P^\89dFi>WYY1d**1tQ:RwP1q1DLuahEdWMYZ/Sh!$aK9n@chmpq99q^GQ9L@<
MFuye$ =q&>#dy%G8*#*8>KEK4H9G<6XnT&jpBE*$bP*Du>\KZ^$X*%R/d<$4#l1!hcjqDHFHnQiq&Gp#<=FLKI
\PX5^Y 1cb&a<LdZX>e9E^eq>cGQ@auNG%6Cd\Fe\9l6+R=FpjMP<$n^^:\V5AYK+Q1?E?^$TeMedBVhu8$%CI<
jZGyVj =$*%X9PhTuMhA15m<CEPS$##cAYcVjdQuq^mQ5M5J*jyyRc=#DwpM=NGST:C%QPW%yqwh6C#Swj=5Q^/
Hap<q> J\qhi>V!FYn@StThj+M/Qt8P5R\>5kV^!E#wi5DDZ6Bc8?HyEaXi#Ypp448?JAEDa95##RbYili<jy!w
eZMCF9 HqyGQ+LRdpEe689>PNFwai=IqYmZ:X$/*cBJ#hpGN!^AGZBjc4ib5a1P=R^M9*ACV9YFH$jc8S1yBDh<
!Yk8^^ C>N<F6a!G=^h:I1^&/*4>6F:>HQht<N&$P?FlIN\cGhDZKBG=4B#84hPaMhJ$eHu/V>P:ZdNh?q4d/&+
DWalp< FY%thF^S!Lm%nH#!R4d4XTSGK\Qj?w6C>GT&=4/!?q?X+6@5b%Da*E?Rata$Gmj#a9GBl4FVXHmCb5ni
BFyTYJ $>BH?RJV#e!4Y%@BIp9REWE*l6MjC=?pn+WqEJ?4P!5J>Qc@8#Hdq+%*udeXJXitG#^/QES=K!tS>ea5
CyeI:t 6/F+I>1V?G:1pj$8+1*S?Mnm?NQZNThw/Tt/XGHyeK9?VV*n$9d/9ch@dM^^ttMPJk+=:SA\EG@Vd/e\
K^Dl%X +bAj^$cQ8h\w6Z<i9WQ:$6/pRhQ<=PRECHnCBX/8c?$<G9#5W5nLAnGDjZD:n48Np>%%ydX88>%>dHhH
hKKwR$ YZH16mupZV16:uHVPH=ZA=b^hn:R+X5eM@=Gh4A?YcPAih@wSNi9cQ%:1MeG6D94!1l?u99k!@!^>%1:
:b!BXw HPH:NJHj\q6?G+Pa9WnGGD<JhNWI#$qc=&X4<hb6q?AXST!\+XV#P8!wRNP1h&km/Hu>*n\h$#+@a?F>
/6qw+/ M@8PQZwQFjRdVI&iuSm<Jtc<HQI?JH!8#PyP+m*!Ga5$J+^?/<Sk/jaEA+9*?ZlQjT8+4*c9XZJ?Q6HF
/8TVp/ /$8PmV4^Yc^$>SNel&9SN6pqS?JR/wtI5KV?\%m@1$$nLIM#+dh\TA?+pY%5u81dKN9?>XDZMkTn$=@!
TiWtYB GN*8APj@&CQeCu5H:l6n:NT\!MNdDJS1QKn$e9Q*6<SPyFIID*JY:JiPWRhdQ&p+YSk\1JMYD%5iT<Tj
G$ShE% EHQeI@H5nV>tejip!^6<EVdTW91NuCPqSGt%!n:Q$@+M=d:4p@86Z:+P^l$VHw5#n4qWKctY6^Sn/DHH
icNLwm K=/d5I*VPYL@SpjNe?TS\Mj46Q@%5=Ny6?Im+KPPk%QJtPHa9KdW%/8QX^?bu/bacy^VVtXeu\8@1jhb
&qJ8+K %@tX=%pjnc*Puw%L:8+HjWcX9T6q<%1bDpq>!q8hGBJdIBQk^Vqd6KpC&6A5Vq9l^pl+AtX6G1h$\4+#
ha6tQ4 Q4K/R#*?S@64j/$u@SBGZt9Z\Lc+EEV=^ea9l!Sw<X4q%y:QTRQey@n$#F8j9djm+:Rh>y/ZYy9IlWHj
X5%Fw* 8J1cGLca!DbPJYn6ud$4LL%:bE@1tD?^#<i+NRITL#cWdu+u:p6mFcNTnmdnWFF@^P!G5V?p^kK*lFtG
q6WjuD j#L^*%:<tLqX:T4cWa$S#iDu9ITtQpYMdK%9uIqk?DFeyVQ6EqiDZP>YY8!Zenbbe?+ING>5Vi9eFNEZ
-A@j+! 0007781e946001202b3 Page 386 of binaries1.zip
%cIEtI FW&h!8?E8qCSbl:H#y8F^IllT!ij*IL5@8YNY&tjS>Ab#T%N*nm^MkV!hD%^?N^NdkSi+ES<+PdWJ5A5
^R>MFw L?n=Gdah?8G^i@ewuTWly%JZtqS?4CQ*LRGlE#<T58&<N<LMFBmJIJ>MNd@yF%e&!n5qWWZ84iSJ<h=S
!FqbR+ hh8/89idS\TCEpaQyR=D$\JFy$b>jVVX^bG4%!Q!p*p!5Vu4mdupBF$N%*Qj4qXJl#T$P^e%NR1aDwp!
9GbY?a ipLGm+Z6GjZQC8K4h!V*nm+h*4Dm>uFSuDp$&APJqJn<F6+e89eEQt:kM#J=69:=Qi*A4J$jBqE*C8e!
+\jGY+ FPc&Pt</hX$d^pnZ8lSHGe&VBi:E#Ha$jM@cmC$e=E4E&=Pi*h6=>*FcieeL*&@YJ5t>H!G$!S?/y$lt
XTJQ8h KT?D698w*GuhWZ@e\K@X$5GJZ#@4Z4HXTK4j#$?HjcKD*?G?>$dp*9iK?8Z9QhN$p+dc#j$tQ$A/>p^M
q$+<@u t:&uZd6nd*VuF?/BF>qyaXe4S1^y:>*QbDc@PN$!/*JT6@WpFE5S$HS4LX1lL*N8DP1**LCLG%5qM5TA
/LwWnu y#4weDV:TbFik!V!&BuIJc8+NjVLd>b^K^<Dwihy<>5YTuVHm\?<p4DVp@L5!k4RW&4X8YTuS?ab/u/X
?9\!j: *C/ny9<?*P%4a<^cSj\X9WEj9VPP:6\l5&u4aa4&pGm:?/6TFLnnR8kq/DF@aG!Z^iCu>m<cF559kIRT
Cn+!m% i%6a<Shlm6iu/nmYw$H=m<WZ9qINpP=9>8jKa$>4e$h4h4nc91p5NBn6dVi*LpHP!$9+<:jAw/m%L18@
KMqEmi 1Dhttb?n9Yp>@lc>pbeQZSwLdKAqqX>%M!p=8F%mYmKDNDY%S&aG/T<dSVFYd<WTA+Kiyb/L9WHC9c54
CMGIl! %VaPc=>Vn8T^Z5iW^lW?Ke%/nE!>EF96E+nh$Vt%e&J\a@*lw#/8X1@buaZ9yG<e5E#Whe&ZV<#N#uAb
+W6=9u QDZ!:8n#Yub!>bc?G91!ML^bQ8YEnj%TX@ed*>5KBuXq^P5Z>#:9GD>8SV+Pw&%d^Kai#N?+jcdCNi/Y
TAA1#Z i5T/:Qlh@BdMiH@tHWHjCSyC9!$#P#G:em&WWT&+TDQIj1Qui:@<4i&cSCWtC9:8J4T=BZ%k>11j^6^?
nqG?Hh e/5Zjp:lR:Q4Cyw\H>yKV>:!%t+^$/yN9Gi@@eCkJbuw&%@LDnj*<jW=ya%Q\N%4nc#\%:/h?Y\m#nnq
Cc>p?I qKu$ytVl9ZJGINnhb?QydiinH:EZE>c>dJB1#uZ+w6=EM\pi5khaS\dJp\T>89mES5*X+6E5Swqt#NA8
X1bCqW ydJ:8CYlKjT:qM@XQZQiS>EHG@14n8bh14^nucMRySMTdRGMnFJ!h*$^6%ucHYPpaN%8VQ*mjy\@%%q*
n^5a/u @8Kl\B*n>!:65/uiqb@FC:jR?tKlhd/?>YZV\@bGmFiqD:t$L/LnEGNlHLZY?p5uj<wjX8Dm/Zu^c%Qn
tDCL#t Kj9c9EhFl>Nn4N!/W?+a#X8/F59!C6>b<^PWw^\qh4*8>H=h@@AY*9w:iwwtwZm:LlWncIlT4H?&JQ?4
RHJnJ! lPY^wje+Xei&ySPZL%pjq>P/ZCMl+dZdi/CqcFhEEBQ@1\Xt9Gq4*iXT@wL&bZ^@n=+W@IZ@c#FchFuX
+Zq%TI =FQ6$$?#Y*h?Yh6&Xub*LnjI@h*t^t!j5$=#984i/cJ?t*P:Pw6VT/Sn61e##1+uIWmunHG?>45e?J@d
h1RpAb G*ciQ?tyuCGh/&*1kci$9Kq$$Ncl*YBIPJ51FP*8iqTHMFYq??%#?hdtL56^m4EZq?j9PLl#q*^MabVy
\wNS*M lFuqD&jyCVJ\<k4%LZ#>lwV4$a@XNpKhD6=9>h5?pd\ni&P<%bN5#?49>BnuD@TQ+MdHVw+j=49/8R?*
4qk9\L *yw\p:^uunbX%&YXEjk%I?V>IGpD$n<=lty&=&#AK<i5@V4GXwFJDiqXJtiDppAQ8/\m^L<Le#+#B=4F
j\9eP? 9Kc5h^+5#4=#5q:Weytin$#dF9$q#XEiiYq1>*LZRJ=dXqST8a@Zh#CYye=/\1C*/4^PHKC?hQmG@BV%
KP1cTe PNF<M%t#hQ#=>jNu$*bhWKh?C4ZYW</wda:&6bu>c%DVQ%cd@m>BVV>b%QC#%Kb@LPV@u!?atj!J&pR%
iGR+L? ?V?mNqGN#j?F&9VQ/hV@PWu:y<u\j=ai@N8XMC4F:N>4@&aFnpw^@@hcM+8@Pc@FV&nN#Q>cc@u96d?9
u+ce9$ EQ!X%wn!E%w#p:@YG9&Eq9w*Y8N@4#Z?8@Pc@IVY^Pm96hTj$B4>njbujGZ=N>1j<NZ9tJ1@%Q/E4+^M
G^S%%i @$d:E::/8%Y$*&qb@%d<?=LIZ&tNKj<L:W<a!<!e?6jcu#CYtTuq4:W@aT!V9%:1yByVj?dLaQuZY6Q@
^FNJL@ ^jYc@T?$=u<BZQy@@yl?D4n$?!K=1TYX?H94#H+G%j&QJ@q@Y%n:b!9?H^dY@lPI>Q9Ct8tjm<Cw^9<Z
tA+X?: eCV1Z<GSnM^@=>d@BS:y9^j#WW*?B^*J#NTe?6N$yG!lpBLpwccI#8pu9mNVDSWq?AP#yW&VmVCXRwe=
ZTmKH! u@6K68:!iePc9n9\neE!B+a$J&L4c^Pp1&=Fue61jddD?QnR<#8ZNH1*$p9Ht*G^h*WLcEe<In:wi8nt
RNCA@# idZ/c=>*8^J*K4VN=<WH1+ThQFdDhj%Ph<>>=?Ld:<b@9F\%FdC=c>Pdi\ZuW#@@eu=VewBmI@l^>NYb
B9Nj*a =Gt4J:LnPaQllt6jy:!XD@Bu*%nGF#*ZQHSDqLdD:WiEe>:68BVLw%wuLW?M>qDqDYV#QI8tu*:e?j4$
8^epb% ucTGS$@QZ?4P:T91tu6:@9D*b*Z=uR9LKcH4:@u^Sy+9Y>w<KWp/q@cC#1bSmHk$Ak1t$>1mVQwPQ@:$
kqL@n& eZQm<amVH%>>Zdtti8&X:SiRIFpFCTcYc1HAknbDNIRwwGK!&c?Y9%!:qdd&:jL6JSP$FZbpHew?BY1X
85JiuS DSG8$dA=hIKLXE/QqRIiStV:!@TijLna$Qi8Q*HNPiuS#q>:W!c#Xe^E!$G!ZHy!GAG8*^Ryu%6&ek98
Y:jRQF wyh?$^8*mhdVu+hVXm<V*V!Z&k&8*LK\W5n6/WyY!1M@pFJB%LkE1WI=c&^mJ&$^S>:BGN@:*Nq+bMnA
+nY^P? &p@D$w/SBQ&1=9*tqc+$Q=!wy5c@!dSS#\i:XG4i1X!5%5wjdn6G>pu>wEm*bh#F+H^pQCF?@8hkEiK/
%VDcHn ZD=jB^Xim%diX#Pe:=pj*ubcFVp4%NY@\^*4=PZcmT+HD$=<n+$NMdW8C:k>qZMm<G:kk5S6<h+%IcZR
JMJWJF lVJwnK+#6WD!b9tniSkI5J>c=Fp/SYWHVk:+Q@!$EP^\h@#:mY&M#k?@@4JJX#l6X6T*E\&Hb9P5LIyy
An+%hM K$#LAt+R*$y>4tuJYqRb$P/$^S<PM+!$hHJ*bp=:dT4Z/dNaSycRtXbkBH=^hj$k*&LN61l9?hjhAl1V
QH?=h% dCB^$iNt&bSCXNRJ=w:NQl6FZdDLJ:e$qi4V5GR/qH/uBwqTISGDpX1q>WaT&ake8lVy\j+u:hp9D<y8
i^I\%8 cZ##bi@:yyi!y^8&NWGcWa=&ht\p^p>RI=5H1dep1GHBwlmu=@$yAHV?/*=ehhK8n%>9JX:e8GHQ16WY
SYLK+e /#FmbFamVPDApjdKu?eD<plk:a$4V1Nc*/b\5ad5X6+j1ht%i8T&??\dY%9Q?ji&D9ZHyiaX+MwXWGC@
j/!4$i BV!TSyaVe^kP<WVP*+h:TR8e?MTKjqjNub?Dw=<j&QQ6?X#**q**Zq%N@=HSeS\%K%\pPkTFR&1c%LJb
:MC=%4 6tS\hR&iS8Z\mY5T\pW@tF4l8y\^DRt/ji$9/\!ih$>d@BC>j=PYNIG:F8Q&R=!+H5?6JP^ncWH6!!<B
myNmDy \E==LCN4HEp+IRMmm$GMjP?!4I>qJ?hQZJ%1jFiDh6=Sk15Anj6LDRTqwdl6kZtpWHXiqmBZAEm^b!Z$
/#DNBI aWVddEQR%*:!nbh1t>#++?ZERd/%6BwSEN@YyMp45>J*LD$H5AA#^QA*XZA!R=c?&Sb4SMET9^+9TkG4
B>Iu$I >XjjX+@IeT6/%%VG9>B/\u<^Z:JZ%k9JTJVhuPW8!\cppTuSB5#IqCKDH$+P?i41C?tXXT8hASYAqXy>
AV489B @<WDd8ut+DE:k=^1u9V\JXe:5inHhhbj!u!6Rq\6k+*X6\%Ley>59lXkaRkd=wLaT=9Fth6$G>Q1!k!Q
dDR=bl Ph+TI?tjeLmh:hntppjTN5$B11ScpkP!i#I^QI1hHBeLGlW4561K@*E\VTZnq9!R@HMDtBy:!d=kdK??
=%^%WN I@?1HMujCBBc4ePLZMX:Hp<lTZ6lVVaJNacHImipQ:8<eBk=M6H@Fk%CuRAli#LaRID&QymqVkC1wSIi
6:1PiC QtaF\4=+dYHdl=S^Vd=K!&Ge1^@!4S^#e/W*Z$GiMLXNG&%yCkJNP@l^it!SVnQ?5VJ?#S$@!1hR*pEu
jBJICE :cSB8lt?cMwJ*>9uI%48*nntL4cNwhe^\?^bXt#8+RNk@5By?LNLG@MQd*l%NLc%!p=\bC#V1FLWB+D+
Pb%C$% EhQW>iG6uq=6=@eQVmqTm\d6ntCFAAn8@*n469ZH#\ec66#dJPuhiu$GlE4iYEwnVmR+iy!V9XS%d=hq
HApYle YL^n>+uA##qAkIZBMJEQ1V4$PPS!SNwdta%h?#9:N6&Bw9^FQVAtNBC%/&Bw\8P:ZSp9u#:+\4PCBMGk
SbGn5a B%w?lq%?BE4m9du!cjDn$$%Qh::qjd!&ejVn$=6VyE1SPbaG>e*Si:5*/auaXZd=4<\npu8VdZFZ1k$@
cE9L/9 <LWkcciLD4ejAHQaIX6M&?Gp@1ATKZeBG/Adck+EubENN/4k9a/!:6:w65I/=!dZ&%au$jXYJiLSuyIX
j++Vd/ PH$+YFI6awb<\wpB\6X&Se&D&Cd\tF#y&dh1C/Gu1qcRq<Sw#\td$X6#V#e5GLJ&d#X=qJBS^D:uX&eD
!MD<C! eHh=$NtLt!Z4CA==NXT=9l@l*XFaQGKy/?=:&%&hlPnq=:WHD=1a5XkRi%M&NqNdkYkN!Zb\^=AcVaHI
cVTR4c WLAC+hdYS#?tW9ajGd8EWQBI\B$a::44X$jnFnEHAZnZV4H\S@F8=XCI@b*IeWhJ:/nHa4ttV5JJG5S9
XHC$my !cSZajJqnbRciuPi$M:Mutah!^^JmQP$Qu:?a<?k8VjnhVm5QZPF4lmZ:MBhymw+pC$qi9RVXRCwhHdY
eNBl?8 wWhcptGLtP$Z6q>>qL<4i@j?Md?<QkA9!Y1Xc\Z>eyyQ>kiSF4YkdRZhw&ajJlXjKd^>tN&&@htc9y14
WwZ=I5 F&a5ZR9C4wA!p:Yci:4yaMFD?Rqt$n8whj@lE\1#S:bEBB<#GduXSlCLaB8JmaKKEEmjCJK?K+RIq4Td
W^GHFi 9Cn>/KL8i<VMHe9V%^/tZD9<#4eZuW6w\#P:e!A?4bwDcpj\>jwyPn%CdTF=@W8E6C*:?:uJ#Kt\N+1T
bYyt/J Li?h5BAERW=B&M@hX&al%qh?BPtkV\Znt8V:?b5WnmwiqN=:=N9qLdJni+c&jN1m>ZWRMwYpj:kQca<u
^DjGDu Dimhpd=KTRY>8$Hqqpay>ajhV9J59>KhqLt!<jnl/C*pt+pWh!ZS6Vk&cE^npKK4/N#B#S6H/jWFFeH6
6F+QYn QFQje&9tb4VQ6Y\TH::^%8C%VJC%tG/!K6\u*BZK%!L&:hdjJZX$qYR?<iHK#bh94!W<84j<wylN$M#@
VBk=*Y :j$u:MCwwYw6j8?V%q?>y%dPQQt%#\uBt9VncCtJ@P@P>kP$FTXTMpIM>hE8/Fj?LcBpHWT!dR+L@&+Z
CDEEaE 1Pm!mAQFEeI%+QSnlJwyKDQIW^kIIwytBQ8qt9QB*A#\<GN+!c<IT9LptNY*Qw%:MC5MT\5!T^SuieKB
h+WtZa @YIeN\CR4TV8q^KcIG=@@QBGG<E\kh\<6N@:>JiIXMpGK*HmT<piM#ZAT!p&XW/WCchQa+nqTn$=Wy!h
-A6Bbc 000c6f878df001202b3 Page 387 of binaries1.zip
@:&$YS iJC6c=8bP#d?IPMXlNH%Qb<puk\P1CGG8b/Ya*/V=Gw<awW?Vm/@!M#FMq*A:LNmNT=w+qZq6nQk61bu
1H69#Y FPC<+RqEHEJ!*MKc/cX\uaIVMRqCL#ZcM#B6WPp=E\C<yJajwLTGAaAlP^RqtdlF&9C+8Ln\T>u861J4
Qp&V<% mHa#pkAc:kHG5ChqmW@akl!yGb1!eEpe?PlZp\$Qu=bB@mLuhXm8lEVRY$jA%y<dy+84h?N%DKXFeEm<
cjKDX5 :RH/mG^!1SSaCmSkT*Ean>59Tw^*j#Ec\l5&TJceIyT&G6Pa?TI#=Si6at^jGKDlJ*Al$nLqYCI^at5q
tMInQ\ /aTpRbdp/KPQ8AK=h>bTd^?NG**SaJd&M&wBkPlZk\Xwi#HNllYAqw4S!88!n>?NuhWuRP46PhQqMPt?
+#\Rn+ GQ^K&AEY64St#E?kB6ZJqCDbwQQpJN?6*uquTp#h1kRhdt/@1R%DR&iWD6ZE1@nEAWCnGK$L>mIX$&PB
G%NdJ# B%a/Xw!pyY4p#mbyy&+\TLZ:?P\bDESFAJZmyCNkhw#<$kmS=wXmb!E+#*BCR#!^EIdI$:Y#q*lqwH9K
%L&GT! Ybh*WZhmq\aEDlZ%+$=&G4kMGbdHG4SjM*nZb&l<ktn51P*u4L%PYi9MX&Pu%lFyS&PyHhV*<1y*%18d
d%\\5+ $FW4jM#<ZHX8>it8#Jn/:pGqyYuh&Y/eyt=tWtcYqtVyF&d$Z8u!?&#X><&Yb=@>pA=>@Z/D6h<=>ay6
tWbhA+ TtM\5+w<<@EiK:$$QiqV%8@H*qVwGj4h6a1IRdFHAb1NyQAL*P?h45tR&b%&!:==PKunh>IE!^lB4=Tu
@aZWDn 4dh8P:tBCeD!KYlAA$#4Ep>>dQH?8JK@9m$6WCYjIqbyk$!Z&iCu4$GD!5TtT@k:4y?WZ=?<YmSkmeE5
dRPGQk bAZYDqT>>ZRhJ>AL9jeb/>@:Yb*:ppn$A8hVJEj9PqZa1\5!pc:GF>Q>1B$t%yPBdi\MVbGp<?wP<&!t
Yn<ZtR 9K8hWpp\jNZbjVZAA%W9QYABVyb*th#8SkVESQ8lhD<*@IBN^Ze9XHKD5Q4p/1aNqT9Eu9%k?l:4!8j$
AS9P@5 >Dq9X^JM/1/uhJGdKQeP>aZ4=BuL6J*umb%q$ue<@h8hJ#<=X8FM#$NeP^beQ<A<VB%>:l4+T9MacV&?
Cy\Baq =**<A1!h#49djXAQwJ+K?AD!q%uQ1N4p<pE%WMddQ&QD^w^6RVKKG#@EBtYpBN:hHJA&E=lS=Z\?aPQh
PZXS69 p1AAi@?1\:+jnwhW%RRGtASuZAm?i*CVcZC\VEdR?SNBXTj>:^4=Jc@d:H<qXPdm=6J*t&RYR8<?*uV*
%Y6XX# e5nhc&EbhcFXTb5Cbw\?nIh<iLEq+Q6G/y*RD#5&t&F<VD<Ht::cI9PYcj1itct#JSMZbKaat4p8cEye
%L6iyb typyL4!mKG5bcqyQt9F#>lmQ!Lkb*k6XPZ5*:LaGmw&ZBmYK8%ykTBb\=4lVbmB%j?lpy#>y^qcq=+#J
P>HADu KSn4A^HB:JSuQ5M%ETCCWZHtBVt#IAB$TcEH9Qpn<^p6W%=EA&6cwZ8ETm^@/bw*anZFGNthbmI4bW+e
:k8@Z= \jhZq9&T#M\wq6pFw?Zb:ijETwhBBLLau5Z=6uIwcSInIC5JRtVweVmic!RZ4TKpwEShanQ=wQ%GW1I^
EaI^DS GVFDhM>99X#lmNBKl6TGF1VJtWppm1^W&KXKkqZ^tW$^W&1tQe51!GmEeBW?5!JL!pG^4a&&9wEIMnGe
&NI$Fh 4ZcFFtpCAAPcCwdb1QT5!98uR*9e^EnLelqQTALmkGlNe8aNy8eTktkljt<Qm\$ktF+TNVWTXW5A#YmH
JeFkPP +&C#HR*BhkGDuCPeXySL?SIC6ISRR=XF\NAWh&5=a+l5BE$l9cd^FSeKETkySB6nkXBJPkNG?/II!5HP
G4J^cn !LHB1ZCTk!wdK$M*D1MH=61:RY4a1aZ>+n$Qmk9B!5A#R\GAJTaDW++lLB9\<$aW<c1KcD?PGIwAKatJ
<YL\>w W8W+LcD6@B!ZiRZkI\T$JE+:K<bbti16lJQT5/LuMb^pQ<GtuhqbINd:kkALh%EPKq\jVpPK#eRZ%?nK
NIWbu9 #eSBmKY1Ak6E1@+/n1\Ey%8y^#KjA!kJwNw/4$%1V/Mna\DTdlp:KilM8q#QMKdtPRqtkRZPK5>wKjVa
Sa+DD# Kw4$yYt@qw6?1ID&\Yb5eV%L+t\H1VEttD+FwbG4&X+!tp@WlA^bb1%ChbQ##C9$kI$1eMTMdTMH&4A6
I=dW48 kI9K=aNAiBI^Em8cX/I6m^?Am4EAKiGEFQ&T>A\FA4yRAj\A?kp!M#+Xwn8XnqN\wSd1a^mPPc*LnBRZ
yDYjB+ VEJK?9q$*#u?T^ZbMBTR1>wDWR\jq1Mu>$=j6cJ%q6akaR+*EP\YFM6YEyk>e%H^IJ5KBm$4A?5P:cDk
&8cAP^ PQM+IF+GbCFB%M\@QTIQPkI^1FeD1cp$w+mCjtYmld^DB+E8lA9*1k4QS$EiW+k6KNJP8S+clGWFE&4!
Xj9Qki ZE@cka/weG4BIq8IMF^imAeAK\^uA1W%NT+<klVXNT<9Bwk+<4@h1=19WdPycGc=$mtVINJPFL%WVnA5
/ASRK% RhEmC:*k^DEIb$&CnqaFLeu&QCZ4dLeDehGCiBCAl^Q:wdSJE45dKc!FN/\AJFm#%dHZ#ndRIc\a<*BV
/6+9lS q^TEk=ihme?aRTpN/18D?D@84#mRXPS98+tB:t@q15ByuSlRC=:$A%pVJ5%i\p!!VnMhJHwGWcIaShwk
j<bFJH pwV!:SyEE8NRyQ%EGlV:=ZnXF#6N$RW5ZX>5?:M#SC<5ua&kh?BJFbiadXlTNW4AqSB$=wGlBGawmE*A
eh/#XQ d<4F$KDm\9G8uehX*AtTuL$XRK8!tlTcBbbqa\#W&Lkca:!5FBp+8wP8n*=wTQ*1Imb$W/V>ewqXnlD=
VC4p!e ZSJ^eVY\KCAXkcqH5F=mN8ZKEL*EL^*6a5dh5*hAqE1IMSNlcuA+/c4a/lQwnLpLI%!lqkKy/eh9Mk6k
X*H44$ 6yVQ/INynHYmTImRK#<Dq6!NSe^$KLCLi5=B%imNp8AeFPh+F#MhI9AAQS^D/TZ4uiu$E:B5b9jC/aZI
9LPkT@ tyj!dM5St%:y*Ranwd*\?nXuwwJmM$WJcCGKwDmP5S?:Gk9CB<@c1haaZJZ8ly\p?nXh&XpLB\qCqakA
itTM#S my$^I4TRQ?R/V4NI#R+:FYXJ?lkCSq$q5d*pHycL$dPIwti@tn=IbEJl%!tkeAJAl$Ju!EStJIl>CW:j
X6#iTy mcV8M\BB\i9JAG$u<65Im4mIY1@WdH>YWa^TD+a4p@bnSZ8lIkKcXR$ZIJXJl\AY&=m+kkZ&nD@1c@/8
dD<Q+? JM>5nqywE%>XRe=K\KtX+y^=SdyApSPIwS!Ah6&NAMXWwJ=RtFaaAK=T++Y+=/HV$!FPEpky:*tw*KaA
ejPeke !P?DJE5Ijl5^&udM?I1SBL1k!DPCEeT5lNKbkWp6:HNHK/CYkAHba6nLCQwlFcKl5pBKnq%+%ktLEAuL
EKW?hS qK/JdGH*tKN98iHm%=@=5W*%SFKTM>&ktW=q\V#A&R*qQEKX*DAtWlSwa1LN=$h/Dqd%9LSqm=&kh/4S
^YKi%^ %qTEtm&#cF!NEI6%Ie=+wWHPdmBbBWe4@PN8pnALIqDA$6QS9#%CmC+T6CBq+1j:QX$I8*RITi@In+l^
\6?L?l ac$5M!/CY!\E>tNd9RBkWFX4Tw>?PpQ$#deY4u4Fik+mT=A9q/$q1NR$kpknKuR9TibiKChV5ieH:u8$
HS8*1j CZAcR6@i@iQ\&&?><nNtKHMtmScIW8#C9/BA4&ty$qh^uAhRVniI?XFB=AamIkwGpNKe!<<&dHqw$=hk
IcaWpG 9\#mQK5AWp#CwYl/wM1:iVX&&pG/HXHWL*d%KqNpJd<dnM5*+RpAQK6Fp4NVEVSB+JRDRk6F8we5e#eA
ntl1YW ImBbIlW\aG%J*k#DLwJ^akDAeyany=J\?R/#MCq?em&Gb$inCEEMNZjNtlwt=KKE8R1QyPE/Z1t=@$D=
AnBqhh +A#8j9%Wp5pl6\b%1ZRTSp&#/EpdP:aMC<$/5*?4ThN%NV*qWbJ>&/1Bt6QSZlA9W5uJAN@8yIc!:D41
e%j<GA P$t8SPVkJyCBF&wILMQ>P=bYIG:!R95d>YPb@y5BTBN8<\@5%k*K5>PQMniw^Lueiq:c&ywMZKq^PX#B
yH=n#k BB5pZ15h4aEET*enFQ%%nheKP<>D#=GQPaiHu/Sh6JQ9Batd4<%Q=8*S&HLLeZGikkSWu>SyTS&S<pua
CBMtB: 66ZbD>lC89</b5FwAb$96bq*=M/H4954h8=kP==k6HHZ4ZiX6\ca^yaPuSmdnmcZaXi%A?*A+p5nN6RK
8QLuM1 K%Ea@m+w9ZJ4TtY<Vh>B\MtceW:FW@D&5<VYYuZGCq?cKZ@IlL4kb9ETKW!PlBjbY*R:5ZPbyiwq#I68
#K>Ewj 61aD&Gywc$!9aZ9@&\4>I#Y<ZYc:&K=6$FCwuVmFB+4DJtBICQcnhT=uhdMpDnn=5<pHF:8K\ju=PGMD
mkwc>1 Ntk+KCmZVdDbk1wl=cnm=wP>AIRkHL9PP!u:YR=!NmlaqhHEZ4!lQtnuaNbaV>qG1wF@ecDZ$H%ij41!
S8b%Y4 ewheqNN9Ye*u>DSbRJweVt4^qLZ*NRLRib#bHqRDWy>eVE8bl+mBj:NDIX69JBE>NN6DbA!Z%y4W&D5Y
P=mVlX bnR=/VM&!\5aXkb=LQKmB^!S4^KCl/>J?eB+IyhjqB9ILjjpNEBuXQZ%=B&>\uTt9R^MEu*n$YLS<jup
wl#uEp Jwh#9nqn#y=tS$@pd6:ZDpdlakD=^6mk$B\iGTwlV+NCQET<GSR5/F:<^#h5AQipdIMR!QJjN\p&W/&*
&NjNZu L@aHWNG!Jn8mh4VBjFwnb*qdc6VyZiu=RyikRFV$^T@R+=#qL=H<<J+&eGYDbXCTRwuSKk:a4&YVj=qV
B??u%8 nG*QqZTbeGwWmIpAJFk?K/\5q:A*GN\VLQLA#&Y^Xc6!mZnX9HQ8LkB?#9X<=lK!%D%\T?Y?PLJJPNPN
:yXwb4 ^%c9Q48SbyA!ei9AMGPc54X:m^4Q9pPu!/:i4m%mIQ4YZtVCQ8jm4udp9C\K\Llmd$HapIMQD>XwHuLR
QAp%Tt %F&pVeXHH@qP#iFV!S<yG9c=NICRZS$yIW6jSyElQ+n#WA\<Ny$MEed+CN&kqLtI=TuKVy=e%wiXMwXh
bcK8A@ SmLyR\J!wbRen+^Wq<<qnCAEqT1RN181#T+AnuQ@*u:VS++k9VH&C>ySdwWb^i&k55TM\Y$FpY&$5BpF
\WjB>! 1ktC6Dub&aX<!SXjRC4%TIj8I^DqXBKF?/Dy1c>l?Y4kGGma=QPhh6BkP+qIneATSPFLRaWbXFSq^\Zu
1P%t%% WG/9QXThIc^uC\SA!RlWi%%qC=Jn<aXX1mRqwRGIN>4aPKwL>?Tp:!!p&Gw+adiC&Mj$8:qTb5IJH1ji
PHPXEB m>k*HiLy8K1mJXk!=kmkL*QqD$9Zp$Hm4G6m!5Fm/KTtjDH:XKt?=A#?e99aP1KlV8%uKjny+L9>\9$a
/1/JK# 9p8%ZM4!Ptm6k+1L!/RaV6dV&X=M1t!bI>9QV#b@n$R*%J<nkdQ&DC^G*uh^$dJhDB*p5R?==QKX9h?D
M8HP>< ulVnlw^L&!TK9bZXmp#MJK<**bT/?jw8CtKt=MJA!@cyPh9NhwqF6@ukX6w$8e$t/#hS%!ti8!IPnyIC
w<?%NQ CA#*9R:EnIaD5mmw^!tTG8PZt#19ba8It\@%DP8Z1:qTG<eAeF*LHqK$9q*\#XA!TX<LeK&#n%1:qY5w
Bw\j?4 w?y>\>B4!Pe\Bn1=nX</ZV4++4B<Q>tIX+P#iu+SYXmWLHeMhF\%jBIt%56RKT:hLet^\AD?daBa#Wd6
yRZK6X +dIRytBJTa1I6uN?dI8EmcXn&d8*?n/&4iq9eYtj/X?G<tV=A\!%ku#?E6mGS\Lb8e1Tb1Xe5aNT^n<1
^9%MK$ eP%hYk+N89wb^X%hRKcp<?IKXBNJ$TCCRWMSymhmmV\$CCD4$bjS/Z95WiQVLn!n9XaeBpm!b%dZtj&4
-AA9eQ 0005651f807001202b3 Page 388 of binaries1.zip
ZbbQ>m FITy#tb!%YEY*=Xtq<GFFA5:S\6DljNBjGmc^Hb//WEN?qIPlMn##1qSp?4l=^TXb694W6MSEjRIGBcy
6F%jLb pa<>u&KGiqZKISmhQNqt#RcC?+m=FtJa9?/A?mK8n:=lQD%e9mK/C:SeH*$D/+pEYY#Pyil4H&#!8ZcD
aPRT\5 t5MY:DiP@&!DP!$$=/k=by>pHALAYaaF>Ei1eJE1BIJGwEy6^WGWh@I%cN?Tu18wtmbAK48d>pnN!NN4
pKujpl <di?li?tLV#n#VtwylIDNiKL6tie1VAF*Lk&MN\Z%Yd59dcW=aMqQeb/Ia?&6NMAheh*5eX$tSiu5W1P
5qZbBa ?c\hi+c4h&Tth\D&8:+^5yiD$Z*hiwnMPHj$\&/T?lFcRF/^N\S9DM@la:qMMG4RyWcF8IaA*8&#PT++
Kpkutw J^pl^HNLM<$Aa151HhmD\pL^+NwA<S1!/TNmMXqpEp&AwX4BKZjFACbNLuXi5\A5beIwh4115c\<*?J9
uq/VAX iVB6juk%qAyJ#16/#B:4c5STje:&&wyl:=>:*?y/6Kkc:*kEi^wwMZ9h6l<K:>1^Y:?yC8biGu&hH1w!
HVu<Bq M@k>1PPHdmbV1iHLCJDLMRM:I&HktiGwjS\mKB5bJ<<GaG^kXG\BL\Y*=/BiM&yNXcSlCGePCWBh:ccS
jF?d#K ZSZw*P!eh8qAmMXu+=%#McYqkTdca*hqHA4R&DcGJu#&i8SZGA%G$/C55a1AbILK6mEtCF46Lt=I!=HE
lELCXj icu&VN<Ekl=T&IA@>y\SDuNwQwjZ>mm/y/5LCla!M61b1F!LC%A%9EQP8K+yJ?5Zkq$>HHu#G!WVALn5
SdH#mQ DcEXQTT=RYKQGG5Nqy8!Y<6wG1ImYC1Ty/5luIJRGG+HFe4eQwKpLWl>&KS@hL#DJh8FC>kLh1MTJRIR
1u9Z%* w\p+En/T#d1llLDRq&ZY?X*9uu^J?:BL4SqIXP%=pm>EZqL8:hlY5n#Q@FKG^A89Sil9+$jSqy$4SKZ8
A&w!AE $Dc!uX?%HIEY/pVeQP$JtS/>MdDQyp^X&#H:<a<Vy<hKiICTat@%W#Em*\T>hCS/1F\BW66pnyb+b5eS
ZT8^=l HT/a?bF>nAHIBLQL5\q^<C=hTE%Ah9WG*tI+q/$Mau6D?Z6kIl=5&dYq#hVM=R&HYRbHklD@Q@d?P/1y
GjMCcA :Y@:S6hKJ+RRRwDRp>BCD#$kJcFGc8kBESPcmIk$ESW%uXBEWESE%ARRAXFB$a%%l!ymA&!w/A/Iml*4
9#+quH S4jq>S:Qe<++=*=?>:q@:@PiM<:=+@!hea$%M?e%==4j>S*n?uT5SS#h5I8EkB*Ne=?&FK6K!ljknWN@
<N!>^< :TJTj>6K?6BI4JV\F/*KGYcIJV@l6QaA%/k<jddBKX^N#4Zy\ZVmTtYMQAVJTFV1X/=/:>8^R+T#qHkl
n\RnEK VNqtHbRGEj1Z=ej*c6NaCVFG\m?lQ%^h5bRm=Q:!/=BA9TcJm%Gh8CR?kBCmRAkhAYSnBSP=AH&%mJMH
J*XpHb MD!SC%qC1lqC/Xe8C+j9<=K^HeSWu/+iKu=/1?*ZS:AFX<LELe!$Gy^tCF9Wp!=F\Sa*RH/@N4IXpIqp
!u^GEP Mhjkk8HhI^*S#y\K/%I:mcF@?cIJ6DSGkkwTjpmGyuMBqApw\\w:DQu@VC619T>!k4y/R1EVFlKqTLBA
IqpJpj EnA<SYNB4dk8Had+EQj**pJA8?IE^AL@W&>5/1qhE>hHY4d6/<CKXD/TVd5kHA5aX\>w<V@IIJGya5F>
My&NMu HLtYMGBw\q@MBci*Rnp\eIpHq^hDqN5q9@<SaAhjeIbPb$lbQkI/XdDk=DmBqjcE&=!5cdSik4AATNEF
R8@?km pdq/>hA!6DbTdW!dn<5WV/<X%XKphAeI&:J<Plpl?uX+TX6:5Rp\+5lpeMh<1%4GppCX!Re&k1SWAYiq
k+TCVb EIWAP%bLmV/TBb1A1\@YFplkGeb<N:?9Xbe@PB:l&\t=^4aXS/GNGPSTFn!dK1AYT%B=+Jm%kK9PpJEF
HjnMhI /1>q?>@I?F!#jSEmqYHueG:u%=6n^Fmu5WVnADQyRtDI:iE8!FE+q\FnkRIPnL>RCy@&EFA>SA9tIMqD
\m4G\H !9hC1kmRF:jhqiMCe#SqKh9:^TpdwwYAPInwV?ZVhVF!4JS&Ze^c/anVB^dh+N\Nwy=RRTqEN*TXBBWD
XM%@9q *^$4dJ**KpWKPbb6R\KRqcu&hdiW++kkPWYwwGKWJ*SJ9:#YDnFS\te+I@PVR^pApq>\Fh\JwSP4P%^E
/u=NSm 5j6qb+QKTc*RJama:mIF6AWhZmCLX:/kI\ZCpVR#JIpNZW1AKH&qm\Sl/Wbu9yP\b/5:q?V#>TFtP9$w
VGVZ%D jSDCN!*QN?P9mYCNqeDbp\ebpWKPFqL<4L4nQy&LShA6!8pASMq4NQCEV:n$$@h4hDkCHE>y>pd:jLcM
81DIG@ =aR5DVuVGamj%1nAc<yaAWL1PG#6q\ye1GDiVT!LEMk*R*9$/yIi%!\^aLECGe94h*%?hBEya^n^PVd\
\9dVdY YuMk:klj6Rwp4^I6bAK$jBHH4J^pA/icinM!h?FIwpZV5@$EVH@RnSb>XM</YIjl=RpE&EmXenjCAT@p
MM1XSV kwqk!XGCwpKJ5XJ&ltDME$=$Blim!%Y?\KK?DnjeXq+bDtBB&#5umACW<w655E&E$?k++ClW:8h@LPID
utuQcq PlKAD1p!t>^NAtIy5tpVa?*#TMCiZ6y$y$eCM9DRYnQVCY@SApjT!IQ?QkV!m@Ahban1W^CF9dlMA<w\
TGtTVi =8NA!cIBS5=#@BAdpLIN$lEA1cWAZ<u:588km@1uYABkeQEcpAhqLeNj5+RAy1AbV5yjJ=&GuiSn\YqR
c>q^<w +A!TuB#knEK6d@1S8Q$Tk/k1%CwaSEhR8\uPapGW1=AVHPH?^>C^#j\ZXwQn=XB=GPLyT9Nh1j/!eMhF
pa=p>k n%*VRcPdj<EAPGwcAX>yk&IlRiZ1!eyj!Ii?KBaBGuMWMY%yNAHAyp*BCSc$hy&R#?Du/+J!wlC%Wuw4
&V&AA: GdtkL1DqR8R<1Y4h4k+inEyw?idVNRdVwkbKq6JlDF=9/XZA?XhAhIR\u\m@V5VKZe1Z:IHBcM\^eTZP
>n1\9! G4D^hLl/SMdjBEqiD/eQTZEiAn/^ZIb\&E$VehdAD1?5?<C8/CeqFbARC*SMa%yAI&tT4d&4c$qAn+RF
5<nq+& 6cwdu:C5Zi9+<i%?y?Xuyk6q$$dqi&yq$%ck<dEVm+HmpXF^6ae^j+ZEa5=tab&am^X^M!R9&=GLXwmP
KaHi&G jEF6AyC>V6KaBJ8ACGVGyq!^wNaBa8Mwm5&%Z6ye46Ie*6XZ#:p8ui4nE$P$cZYIBVQLcukFqR9\%%w/
&+&!FS KdH@8I8wI8ibRyt<6L\^*uuZKkHHF4:nwhcuK#K&#R4MKV\A/#TpH1SuCFC<5G@L\^K$bR\/b64!M9*1
PLHE&8 1u@!jLMdITTEJP@*dhmwEjma5N?hL+NXN^wLdlpkWR^EKXdMbTKZjIS$e+TKJluLA%Y=eH1LkIchWi&Z
u@><bH !B%ITej>l$6M/K81y^ul8Jh\*Kj1/ZAJ/!AEKDF8*AuTQYH#q&hi=eGAhPuu1bXW8%6Fl^Zbt=DEuI9<
WBk9LC *9?wRP8ewqSXVqZR?K>QBA^Z/aP6!QCET^%PI6b%RVEPM%S/c5%8FMMAw6RG&P5RHV5Eb5b:c/luyqeJ
S?LVJ! YC5#F1lCwy?dQEemZ!iRGbT#+GK6Be!m>8>6KbS/C^i5dJXmpGaB@:BD/G6y98ptQ:&4Eyejtd%jWL9F
mnB^Ie ZiXZ\VaYL@tImJy1K6N!%L&Wn?6Em$!BKEhWGum4nXw9e^AB8i+h$eHZFF$uEZ@Y9^:kjm*QmZL$DNlb
+=Zk$R qC&cuc4EthiQbX9t@AKHL@MBS#m6GP\*LW@?w+&jEy1XPpC1k\FdCGaGTGL+9ebt+PWQKDEXIBHKc&Q+
1bj+w# nLZCDt9y@BNEQ!!=S\\:^&6eNBA>1XQ46$1k%>th5+iHGb&bNqBn=?!Tt\/w81Sni/8Qa%>\\594@+#1
tyC!eB 1CmZPaDFh<<Th+n#dij:i+CXc+$iE&h4biIJm@$B?!\Ba\nd+\VhTFmKLMeP9LaejP$?JAH^qdne^nHj
W+NA*B J@*J@a$AApeD?!qRBpdG%lcW&8d/DkqK>qVm:ISuc:y/%CEeQCijAHIkEEayqG5MELeLF+tkhS?CmwhN
NVFbuJ d+JN\ERhiKmGC5W8FSZ?R/C=GVhc=d/hj=5\TGbh@%N%X$V</V=N4YAuCtpI?JnynRY^wBV/?6Z1hbA@
yl!%EM JX>p5q$K/VN?KG9Z^iXZ+XSWM*puS9?DTQiQ^&\bjMECXm5/jjWqmkGH+S^pm<:Td^@QSm+8$lR=9jaC
WEDA?W 4&NCnn$<?@b=8bG+McW<hi#$*>BFyc9$wDFqcb8IFk5A&4DTa4+1GCRFqC>5ZeZ!qJ4Zm$k5kTyLQJED
G^$mtF 5HlmKi5+l\+&9ctt=!^iN1*A1ZjSaGit5%>PA\m&4wDwAKiYQYXaRj+k8W<#kQa@p%m>=jpYy*Q/Rbwh
41<QqG dJ1I/EmDelL+q&Amin/EiV^!+i:^8?hp5lXCZ1DFpmNp\b/9YmcaMEYWdwJQyAtdLmD=t+=nV^:>&*wN
Z+lD%6 b%9>>b5kj1//a#*Ab#!pm1EJI<Z8E$Cnhe6Tn4nYWlNuC6BeSKW&IyK%hN1V#%wFbAeIGKTXP4Zm5kG%
hLHR/y cR##P+tQNC$?99nG9=!%iF%EK+VTd+J!R#HLWcLmXdBbm++411e6RDblq58D>wRBm!C$ER6P8kwYRNTE
I<i#1D nyT$Yq41B1FbT^jXySMialKMpp>C@tL>!V\Pdj?lJk>?%&:<ntwlitiPZNkPpiuDPJ6Fdh<lhGek*^Ym
HTWD%u #IQ#W+@\ibJFn==<H8DqI%n\!<k:?TW1E#PN%T#XhK8%KN?&4$KqI!G6FnP9k4YdT<>M\Fn1qKW\+i?4
?da?XX BcBJ!e<G&AmS+WCujVKK1/QklQ$84eVVjuD4hCVL?QMj8<>M<&^wtR9VpjC^qi5uhpI=c@m!aptulRMu
Q+e$ZI ?=9#L*l@pw>\4*VSTeDjL5FlEQ&cjLwyAJSKeN9=%HWkK\Ew^eP!@eVeBV:ZSjCLp%94+hV$y4J@@C<5
y%1D:d 4#y:8=AVmYQ=<h?*mPY<epaCH+YHV:6Jjq>Cc6Mp%AV?p8c#F%ZAq>$a$1y1:y9TE/%BZZd!<X@:q\:C
cX96Q? WauTmdWXMRHj41+VN!b4jh9Sl>K6blmLbhwk^$a/%!kuPRHeCLleH#16CYMdI*W<ABRI=5P5TwP@PW=Z
6c6Q6V /m:X!Dqw9Sp4LwBp5DPy?%y@9RV:$YL$YknXw4:DTX^KAH@+CapeYLcDcIpmJK/CMuTl@p*<SiN4DHGi
?yV=R* 4BRFB5PlR1d8:+58SAiNPBlR8!RP66ATBEbp>LGGIjimV$B9#m=?VRMVL8%e>/^#R!AX>H</IX6^IB=Z
q!C$+X Pc\ViHd+&abqB/PY>*cY&XYHH6AX%HcEW!P@iBEbedZ9p:jEh5WNl<HcIp>4b?\c>P>=tV66dXaZJQI*
5aNA!A qJ!^NJJH#TtZ>iM<*hVHn\d$j%*BApmQ+95X+NH+RS=?5PwyQG6d</XMyWHa:j+m@%ZaFn8H4Q\56B@=
&G@SBS a@L>5ab<EFQNl/p:!Y5l@465deL:N>L&S5>m&+Ml=5Za%:#MPh?Zj<m^GPwP6qy<edDP<V9tYwHtGeF:
Q:nl>4 B!NQ9y?#&+B&p^$q*!BHePYtb6<jd\<=MtX#\GLNJ^^\+Nm!<ME9%mG&#DX>t*^?SQ%#R?&WtbN9Tu@E
Z:S*pG lG?#AXnSq*cIAbaG<RhIhqBnbaEJCCJah>iXW?S<AQXp#F9dWWIQkFbT*8<Fkma*jVtkP@AE9^j&jL\+
uH5X#L $iuq<t9JcG:!W1Di?$$t/FPM!dJK6Q*ph+5KahH4JjiK@BcIlyVL\t1%*@?=na!+d\FX#L%8q?^^\X9P
XqjuD1 GRc\G4b/ZC6NCD4<%KBtK*IW@Lq6u>YL>yIcQlkey9Z/i$NFl/d+L?4PNSMX#kwiyjVd1CK:S9*eA16=
-A1w<p 000bdcc7e09001202b3 Page 389 of binaries1.zip
AIGelh +>:854c&*h&pSyVy4RAkDRhJK5*WY!%I$#eW<np^DXd#<!8Nl#4Ftwmw4VkA*ed/G%4iF%1ZFn*G5V6k
L8KVua MqYb/uGEq%5CcGZ5i?q+cZlccZc85*Vd+G:TRFeFZda96BqXppa\q1^tNd8JL8h@<V8pBLF+nCnylwE$
m%Z8LC \/uJR\GN^5QDk:tbHlLi5iWYFBhPA&&TLQN&\\SPw!H%Le#T>TI?GMqC4b/wnCt*W96KRwV58?q9G?l>
i>#QT> PQ%EjZJl+9RV4lu4Qy<na&14#>K&\D+>*R#E9qS5Y$jklJ=lXA<tah^M&ljQbYQqm^%ekQG/VS<P#Mwe
%:iM^n !eHS&ZEK<+yt1QJb&wyA#q&uT\i$@@au&DhcQ<:+l$^lFG=:5uH=F/$Pq$*?ZV59p&ZHW4L*nF9W<RF&
WkARQ> kmS>PtbdR>4ZM^q:BBMtuu8HpnC?&Dc%W4>te<E8VZYIEPh$+Lq+tL191QTb<M9KR>qymLtpdpB$?My^
k+M^8d @EF+4961TZp?Pqa5>6!%WbeEEL\cGK!:nmA9KcRdRCabQ!Cq$Y>G@nN&44Bw?nq?5^a<q%YJl#/d1/X1
&Z?5Q6 nN:=R:=RLB6nXY&:>@+?8F!b1*%hXY\5M#9=GX#a4$eCRQSED&GE?M5R15#VBA6nku5T6=8nwn99*1$Z
Bmte/1 dQJCHXMCYGHyw\T1Lb:bE&ntV:AVW&9Z9<49qIHh81V#D>Sl1pAA#HajZd!pC>RCEPa*9<BT18uklKNk
+K\md$ +AJGMJ$PMJ49H&B:?RDhdtm#\/>\<kTDJ1a48<$:D/b5MBHR++\BEpSVaiIuqLYcK44lCQtCpZVSC^NX
++dXEF Kmp95B!9uQDbmd9A&N%t5u<kQM%K$G?@X*uDjIkw^tTT\6Xq4Tnh>I>YbH=^TD+\PjhCi:uC*6l\X8\a
9KMGVG $PmmDlpL1KpqPQ5*A5nbnlD=?&\KklkCeG9dcymnnj^<=*ZS*@ePVBZ/QiT@YLN8$qn$HpjhiV>WY*=S
hJI^Nq Zu9/ZBTw@EYQNJJXV?X:6cA+eFLK86+iZWNI/!NEADjNPDb*A\NXcVBi/+6j@KyHiVG5Nc@CCZ5m>iHe
jtKHVy an%SG+qQ$uiW5c6RYcSyCeN:BqdKNdETP6a^BVTCK5iKie^bMG5VN*^c&^L5ypthK9eJ5?5q:<aP\Ada
Z1>GaX P59#dbE^^SZ1@9q/ID&aaQdJXX&X1wEw6XGH5pMBy?Q&AI%1PJShC9ImcbL5cVRjb%>jS+SF5$@Jh=?5
<+lmaN ^QW?DL4H5DZK?BSCZC^^E#FRG&BWPQcd>*jYCwEXp\ZlK<<H^paWW^mpb8yETd*NXV?AXB?6<Y!1N=D&
kR:SSS h\4X!EBGEcwhQYuVRnJ1Sn!:/L1<%Bk&8aTwj5>^%KdCeIlNBSK6LJL<\WZW<EKYBe*LQdSn*FFWV/&!
wL>Hn= VjGZAAhYj?=h?yQYD/uQh>d@yJRlC@QX?X\EAm^P%l!IlEl1L=kC>AlNwNp68GP>X59LDZ@1Rh^*VG#T
9?aCLD ea:5V9JQ<c/a&LRTt66btY/mJXIca=\!6nD@GZEh=HAJ\LCp1uYDP$4T4ea4KE=Wq8kQ$h>46bdmNREn
1/n\Pl Y\kSlAq:*J^HZ>PGFw@StWatFVy+u+\Z\/a\qiZyq:y:AMDaRAHLk#u=t$Ec4?5CF^!p?V*PciAqkGju
bk%DEd N\tlcGVePT!bc&9SLtjuBtGpN8uDdelwe:YH$\Cc#>J<dG&DH<DFqn%n:P*b\k<a/cS4p=6Vkh=/hHD@
1i:q/I BSQ=MF\wY1&dwcnR#yHQm8/ZQZn@*qE:<AY85dd4#bY*kP<AIXdI@8K9JL*VL+:Pp+F*HT4Kt8pq4nJZ
G8D#F< d+B!8WPIw8S8&@u?IABy6MM!+$wl6YY+kdGhiuJa^4tmM+@+yDCDb\9+SwpS<Zp4m!:<lZNVlV1LbVpt
Tw4^m< pDE4Q1uaP+D^\*Twu!T5SaPZF#5S@4BRJKNp9akaRi^jKBjFli>aN>mMJ&e*n**aSS&6Y+ajtC=B#h=%
miubDR @eSD/RpHI&y:j*1@NtT$#cp\C^51e/ZTFXBSHF%dwNTjdM@>c^N4YMl6BJ6yShjd#L^&#WwnA?GJ8Yu=
XASC$u ZZD48>BkYyui#a%+AjDueBD1Cd/bTF1DYpwR!%Z6ZAAl:h$FM4p5Rp?@u=CN5R/aH6SqFwNXTkVAZJta
k=QN>G N:lkWjMEeFHtp5CCyP<X\Vu+wdBH=14T4HL:WE%pl=1=X#cS:<Ru@y**BRAY/eIQcAQlpc\*X&p4=mA%
A=^ASM Mi5bwZl=hdAG?%XJXE?qBuNhH=@$^IuP:NQ^EE6RD9I9WqKEFYK*X@^8QH1$%1Xp\/E<i%P$eQXke=IF
t5Gm!M i?MeDdBqEw$hM/licq#FeGB1w5Z5<=H#=H:Ke8XtAZVJHM!Q5aiP:$hD+@R^q#BZ?@q%YmTjB=DW/9$D
JiLuk: >QKu\eAE9KLG8JJ?#MSM8W%#6yA<uA&w4#@$^>i/eK59!t6/&<9uCLZ8palCX&8TQKK/9:XBp?>EHA\i
e/%:Bb \TpKNicnJB<wKX16\u/%6%>cN+8m#N*=pb1MRR1*Bq8F?QW!pt4*&A4e=1Tm+\hL%EutJn\YZB=*pk9A
Z:jDpm b=ik+*iNGMh@&FD^668?aiNM@R5%ARDBKNQK>@?BYWA\&uRlb$Dq>B8XF:ntbbY1$w1<dT$wF6H!Y9nJ
>TjE#a Plw>*ywj+bbCVZK8G5@!^AVYF=\#dptB!1qGpbVbh\5YT8?9V<RaT1Gc+!$MLEhdpG1d@j&n=S5RYBwn
!mAS8e h%8w1FbAN+yla5kRuyqLBbnX5P8jAKAbwX1LyytV8VD6@GRc/G6F9k5AJdClM4*X^#V!TEmi8cEb\K&k
*ALJw+ Iut4Wj+pJKRRFXS>SjP:lTya8:abKknCWH<CDGh%\W6>d9n%+J<eJe=AtIKWu#S^ewGaZ<i$An4HIXdk
\dt\I9 FR$&#y*51hdTy^E%RM#Q$^@MZ#@$Yq%P>*w*1D?dA>DppEX:Lj6#AEk^1DP!bYda?Phnu$/B<k6a@4Al
G&@iP+ 5%$TLh:I*AbLL#dyyAK=Zt#FVN^e9m=pF#lRnJ1h\cu\Jq1NF4Qht6EycL5Rwu<KWh/kVn1JX>anXG$E
t!5qtR kbHc:BtCw9/89^DyWG%E<p?5$$HMQ$dZ\ua4XGQKIk%GBqRbCS*aDJQjNqd?jCjCR^YZhX4PTCadjk%\
CLD5Fp MEADDFhQJd81R>QkaLQi^BPdICNp#mynmKW8ybmaSmCR*1K+9uwDQjwPnP@+8D^qJF=P<tDp4DN@nCDX
M<JBE> jKGkwSX&?lR<HDRlAHl>Xc$P/Tii^Ma:u6iq/MJ=RmTcSG1:ayS*DT&G&TkADZKi88w^We*!VW8K!eRj
I1$<&9 qDZd!N\T:eI=E1@LSFk<VwIw8cMIBq?Q&aSWnkJpnCH@J=y:yy=LN*L<6w%$R*MkjA9n\%16I:wp96:5
F^wS?X TjV8T9lc=Zj!*T/K41qA*dDIue\X8RI6SPbdK<b6MqPKp6@XaHC$XDl%?e9Z$a$AKS^#?iS&9LtFKp&@
R9I=/n :n8WQ#?tdNBN\/Q=q+^tN&9Jd^NtM%=#E@DP>YVG8VmuFKnkF9y>uMXAw<cR1^4Q#pVAAJXEn+Ea^N#j
AT<bkZ Zyw+Z@69:aCy4+$qIQmyS@+PGaBw<CAabmSA!mKwHy5AcWVFL4&d&G#TlF4BB*1PHl*jdp$P^!8DRyV?
EeNuTP iMYCDukTBL<bp<KSEn\wDHauE:SmpSdMX^cZMd*!LC8t*ZBP1ycCp9MJPCBIXm9\<wmSSyPmja/6<^Ja
a<DFHJ YnF8LceRmQm4Vqp1QYWD4l+F4j9d@^$dkwe!?TwwittQMuAtS6>q6^i/$$8Z+Y@FjL6*wA6+8%q9AGYk
B49iP# a1pQqAHY!b>+VTcAL8=XKJLWAHqT:FFjlCab1b8l%Eq#mIFQ^5:n/p1Du>WH%RpKI$HD$^A5GKG$Iw@8
Ku?c>E K9/RN+BT!!N/MGwWWJZ/=A$iBca&6^EjZ^a5>>JRAAVZ%\bThdbRmJCVteJChhI/ZhBZ6&?D6%CI=GG4
Hht\Dh V6!%a6mRGd1tA%pGAyp/\NWqwdY+$PDwMWh?KSIBwVNG+14Ldu\mcyAJ5N$H4eq>8J/6KbFckL$JlT8&
!YIDlP +1+Pt<mDe%@nn9dVw:peQlG<u199ZGMX=yp$*E=k+nY^CST4XepLdRlFc>#uM?1pd^4DyyG8^S#?5#ZA
XCZGu5 YPNeaawKAQqebHRSNnyPu><Ad<N1/Q^5BCQlh</akS<$N*DJnE5/CbdZi/:\B5$5IS8Z/c^B1Ll19MWN
R\$wFw b>w5XFEB\Zlh^me4du*Nq>>L>pCN&b5J$QZ==*N*Zih^9RBitpuSuI8VX6bJteYNGB/=ap%L5jHd@ju^
/I:tmD m=ckk>4y>t@An6Ti*9X\I<^5Pd1lYZ@AXb*4lV?b8jaKFV^hF!1pGNcpYDH<9=apYKmTaR^j^8^Bp:+H
qbpTKb :5\>DmSQ9M+?*padc>ITlM#h\6R$TPTIAbk8n&lKS48R>yq8lBy\Z#qk=Rd!bC9?EMbJnAajR=+9Gn6?
FCB>Ec ZBPJk+M#JmZNcn\dQYZncR@@n/RE@dh!HjpDK+FGRb$#khGpXj+B6jn>w!&^T9:Q/4S<NWHt^nRl\GAV
>Aqjc& 8KGGnL9\Sq&+aLM^5D5h%/\9m><$kRPAJV*!DYQ?@8&#hwkQ:5DN=/W%YP6EXkSR6X==:XbJ4m<SnRcu
j+Lbn< +KT@BJI$I*:!54p@cIq/PaP%ALNQ?=*^C8=/=!ZEt/8j@5!?BKYWc6Ftm$t\%@\QPHKAqHjetJi1iFJM
EZt+*/ YtBAFc?ILSS>8!W4^4m<?1W/d$/HQ/m6YJe=%&:Ck%RNWqAih#aNyaH!#cnbQl*FRZ$8G+/=9&:+MX#Z
h%>Qhw K\LR#wAW/:BP@qKF+\ZbeGa+pZ:ZT5EmBlSZEbPaPHMe5%>L1<8F@E:acGPl#MAVc<k1#BhlmhEjyXCF
iaX\H^ kTGVcCTk/>@:cTWI:*pu@^QjytPlH9+E$NnI654<EeIMl9Qn%:eWcyBeVWuB&kM$A^=#u#IduQ&yG$!k
kpl&@6 AMdmJMh6Ja>T$qLXB+&k@LYlcid1kLtXANmGiRBXFP8VpW/D?i4McpNF1mGb=4&yGWp!$XPmt8cjquQt
b/lhTK w$qi?5!jY9EEG&=dctpJS:Y5Qu%kd%ae$K?$Iq$#hw/D!y<bD#kYWjINtN9$kBMH8XZ:BykHb<6*bYAH
L54MSB w&Va*?ea6@S+&luWykelNNJXWk%8\Q\L@!S<wB5m##b6Cw$VMR\$k@dH1&<4Db/D1p/S=SlXy/KFyQH5
nME>a= tbZk!\XwGYa&&Wk%6+bul\XIY1C4*4t!h4BD^@qlaXPXD1NWu*6dk>6n!t>BpX=1djKV:b6Aht<1Hc:Z
W&#ua* #G8*+m%tp>mG#E9+\=EaaE+HTDZpHS?<#@1V8<W<///E+cY*Pp8QZG&q\K<IckRa6+&B%>YMNtQiGWQB
Z&kK=6 E/@XYRe>j?#j8KqnamT*w$YL%$lTjM&jK<ERV+cTEuVp<S6Awa+Kk?Ih:X8hhYcV@Yu>uw<4!k8Q*!A#
J<d=VV aBwRqPat8lX*B6leC!iQ#ekd<ayFW&dSH\?*qVB&:u=LMVuByaCd%aZ6WAeMmtS/RjH:wL!EuM::c+n^
@4#VVL aEZ+4\jqG/6j\wHmk@#iM=RTp#AdQYcqmuSTd*cme?*TXi=P&ea@???jPt*Nl/u$Vk@$!wYdamG/WAWY
a^^/*1 y*#DXPRb#i:8hR1tS%/NJHqB:*4yi>6aec$c*q8mTeEawEtH!XWu9P/HXll8aq:/du1y/!RwCCT8G:iT
?c8\tk Z!%kb?k!d/8Vb9SAnWJ6*F?Db#V$Vq^8*6m@%^@&hhTG8/8HY\yXWdZI#n1AuWcc6e<%^:Fib%Dl%kL<
jKJQYj 4p##%dnjaT$E6MDElH>Tl?ptJLW5RE^R5=4N4lMW<Fd=5neBBqwt+!il<8XRT4HPSyZGDcN@qD@^nD\n
9eENu/ ^6NLAF&dP+^wc>DAJX%=wpV&PuXj%Pn:hu&k%>L$K\pHLPwwG\!ajDJy&AS<1/pMNmH^Kh#dYu&8BwKk
-A>d*E 00021ebca09001202b3 Page 390 of binaries1.zip
X9T8:Q 1k5+C1ka!Mhy<XK6kP<cCqe<+I%uZE9qbSuPQncbJY4\:>j/t&I%D!D9GpD=6$9ehm*u%wBqXbhVnMjQ
jhCiPu QSjZnYEC$>T+Vab!nL1mAc+<!XiFR8S=<IHBTIalaTYE1l4YaFRn<^MwaNCDb:Y/c>#/X$dM:1?cQZMB
5#HFWL BabdAia/+E<%yh\I1EiyTlAKB#WtC\Sc1Cw9>bMycFwb\Ak%+F?A!nhVkA?VI<NjXWdA=mQ/kk^niSq5
dnAqPp 6AeyIGCW:dwMpl1DbFnZBl*FRRZ!ZYYXG9\c@WyhVWGHH9ht=:GV!CC$S8IDdJ:G^EHn&<&db\Fja$Zy
Am<>?6 L#LFaACQEem$=h?Ntcj6=BBEVLjGelM!G8GtDEW:PeB=etP!Ye4\FDK%F8&:1Pp/i?nmbE*bETQBh&Q=
XM<XD1 hthXl\:Q#qB=X+idb:!i#+i?JtTmQ\KS*\*J6$AKXC:WaE^nYJe5=S>kLTRD9lH1i>Gq*X:aYd\^#<5I
w<*@4P dEhNj\hAtL/k<<%eK8\PAq%Sl8E%+9=yIEZ8P$A>nmBq96\chin^?jEpB>n5GF/b1/N5k^IdR$pbB5mX
R4Z@Z\ &hq>j/Y1/qTSBPc6tpEa/k%YjbMTSjLCuu:*dd9m9YH<1?<qAJPkPVB5IlD1pwNJAI1AlaEADjWGiI*X
$q=SCl kGK:R9kw&tdaXViHuSdEKXpp^JYRpHdK<>yGtQCKaqiFN>$pLI\kYDkd=&1RLk#I%Jdl84&5YISIcct?
idJKlI LAE<EQE$&mdCJNcqQjT=/:p>ZpimAdY:5FMj+WSlb<$#>9lYG<R!ENCRK44eEhSK#q5>hHjV$:l>M!@$
%tA9yi N8iQ&aRbNt5?DdQkhGA8*JG9\WGC*KNbc11A+X!HX:J#ARhSRKN=?y/4n\?D6:L<Z^\ei9:l%qa*n>n8
bP#B%a 1eeYdpLPGlQ1\E8*d&yP:I9ud4$<w/M^?uNp+PF:it\B@WJD=ndSlypc9&CE6/@@=\5H&:wnn/**!8nL
IiPXRe e#>^G9/l?Q5q&h=D><P?1N$NEl%J9%Q\@5jdS+hP:H^+/R$j$Cy$c>K<>c%biVN=B=!b#^*qMt9Fbt4?
$YSXP> ?Y&&/9/L\!+cAjp1CFGGi^&kFXlkH1d6H<DV$^:JH@>ZKKd@paH\*&BwZX%e@lPG>u@EAQ%uDK&#l>9@
nP8Php P!LRh%SJwT^CdbcD+R+^bHK+JK:RiSA#IhTK\VtcaXSypLb4BA<>dLBbHVBaTbK#P$SP@iMmG/M4V&pW
=Q1nVt ^St6+G+WcWKRQSlIM+4C=A8u=WL4B4VGZWGnMw%1@tCpqc!WL^V&4a^+Fla$\h:k>Fj\^9TIL=<L##!<
cbibHn Ij$u5=<h$IjJ*%m%@DtMTpeHJ/:N$6Vj:#I4$R@4LHeyP6jpjM?y>qw8qdkkVh9%k4$HSdp8aC>@qK6D
lI6=Mi *wqCDAup@ju$ZjPH<a4eT&uwR$dy$Ve$5e*P8%DtM&hZd6/j@H#QMPJqj*<8dihh?BD=YA+YdbRwhV=P
9yqpJA 9L\Za4DDJ!AMM=klSq8*FnendJ\:DqudGNT$Mt*MQluCB=y<b#9Anw\8G&ZMla<ZdY#9j9qn@PQEq<w1
+ink6F I8FpyakSe$aC6jp&K+Fw8^LlWE!CkRVcGG6E/$&HGwYENVWTuP4p%!:>YX&YNZpq6!@@&wmw%e%I+\&G
TSXq>X e\ES*bc4j?X>HPi1?:H#JV%H!bYDKu>iX/VS+I6==?N6paQDJ=e#5+5wGpN>KdyTy<F:B6l18/YdGpPw
XHWj#T ?*1uZ&P?Yny*X#qbS%YXhW$FH%6tVuCLcM*hL:5Tl>%BH&nV4a&nE9Q?<XI$Sb+LRF<M\dXFa5K<%Mml
+undWN L<<mw8l5ybS<RZdGulu?hytnW</>biQ5@tktku^+i!du@VH5YiuSa=6Y^XTj*py%8Qd6<eSDZh5Iuek9
?F=8RV E&^hS$X*H&G$*q9hcB1V>5\k<i:FN5Kn9+9Z/NHY#k>FJuW?&F^qwXC8h:aTtw$V:Y<%S^qX><WQ=RV>
L8qaWk pW:Z9ViRM:qKk^iY/u!NME%wn4$!X#b*n#^a*Iy8nHQnDNi=!m/kSRqkhP!dl*eXF<>t4hVmuV=w+utc
/EH4*@ X@uajYR&8C/w8p@Tt=W$ZS8>I^$MZ4b#*pX*8eD1ZnQFENFq@9XA8bQqh5:lbQ^X9eT4K^&e41y95Y>%
GbcyNP ATP&M9:T#j@4D>4GwGj*i18&jc$e+#^h@PPNICDlT?I%?@&q1duEX:\$\^:&yiT1$yEXTi?H&@+aTYlh
5a!Jb/ bVca%F^::4&*miy/Zw491@Q9H>:J%#@&SBN=#ch18>P1An8Ni5?<6X6e#w?Z4DA#eQu+iZFAMlYRctP9
?5IJ%I NS\jhuQh8nKK5=N!KPPj8N9DN9BaiXZb88+1n:@5Z^<?wQ4<?5u>J\Z@QQlGVB\<hNdkPP69^\@Bmwnt
ATAihY tXZ*m*\A8RPpuQ=Fd<8VHEZEL\anJmN!&YLTFdn/piLeXZ8GQ1X%LZu:/H%dJXw:BFe@8>wu<bQlqFib
QI/Tuj pDy>>yBd!T96wc6\6ShZ/S=9Z<j@I=T!:1?&h#%ba<y5*XydejQ5HhY4FT%iVqE/\*$>GY6ZFW&XVbTh
$RlG*S P&#^E*II1w/Ac=*&#6\K%^tna6<<e&VwtXV6Zh6R5Pc#d6@y^$aE4$8y\Si8?meY/A+\$udpqjabjI1:
K??wjq jQXFAB\$RElnq5+QYhju%cd<MjV<p>bh8!Jy@4k4hZRl?Zyb*14e=HCuw6TQcihk1#H:EpuyM@/+5>S6
AY/t<m %ejEI!$d>Q!h4:t1#^y=Pn>di$W5eGkjYidt6ulkaQjn&Pw>A5Zl%C$*4L>#u^w*HGHekl9d&WY?uLZ4
GRV\1i :yp&lHa^6$iYZS<:9NY%?5t*k9Ej99yuP#=RtpI1Q<#WuItBVc8Pb6u8AQ6c$5ddhGMXpi@mi\c@WL<L
Ld=QAl 5q&TJmb>9V8*?Ky9Fn4G\LqZy#u:FAa9ZNc<hThKY^dX$/K&YPaQVHTP>ct@R8d%ETbQYNRVF%wamq4&
X48!/? H?PIRIGF/\l%6PeJqNJ1t:RFe:B#!y<?NZHkH4nh&bd*5u&It@J+VSHm=SL=lMZtu9kQt:e:DJVS$iX^
LW#9\! ilhBy+H/$!iTcdYH%yd8dZj/MFL<4WC\L#Bej4iQEDmB\6ZbY*ih*15a%m%@TphHIq5P>C^KmRHWIk^=
\KApap #CH\1:AwSVBN+&p\DV=GtVc*XVTG:+k<QeIw$NE*PwZ?HKj%+WEa5<Q>8CTn%jDqF\/^INQ8^Z5DY*=P
V8@ZFS nXdBByH<>PwwpYYQjXZwH#w4%^#@Y@hFqtk^SM6#*ht4Y!!juyeXCib$I#kB/!%c^ap&waTn>huEBYk^
qd5ZC: y&G!<tkSJc$ljY!:\=&9p>1eA\>FRdTeyQPHa!pb%>$Tm?$uS$VJY\%Je9j>L<kGTM>%lpaQ!6^td@R/
/ub>RL LC:ML#46LdnC964Rj!L<b6@:I@B/y<i/L*Q!@lF*Qw6?=n%*:S#*\K<RdP/=+ZbHAm*X1nB5q5HLAdbR
=4jj?q ELwZK>NC++8wJbTjqJ&YIcA1HlRT\L%@$NkG?1<Nycth^>5&?BEtk%:q9R**lP5qY9DYZ1/jiY4y#D9>
:S&DL9 SuY$6cFn#VH:^Za>8w=?niq4CMhtFR$b>4!\/4kSuHD&*TYDV^Qk^W/+y9@dXc:b<6$ZH6k+G1SPnbRb
4%jCTa 4uHc4>#%!5/1dL%$S&pBy=@!qG6nKA^@eC9q^QXXuyZHQA@/VPW%I6#y@Y+6^ZteN6uLm4QLF:MiDn65
yn+XSb y$=M6Fpd^leLT4D%MTubGSWdX4Vu*ca%jdAcju8?8<S:6KH*==!Zi%XD$QKKlX8?hk8Za#y?SD$AYy:y
@6B?<$ E>+XjjH^8$h>cV9TXIm^KQ8!9djukqj=5^ZZSI>&NQnt:#84=KY4j<&X!!&q6YPGj\!e8N8i/^w^y5bV
:cc^#B %D@IbLRk\t/9JFXnC+w1Z6@4lF*nQl+B$!+E&I$+j%ZL@N:AXe16k*\l!cJq&<JHL#p%%h+cLqubZBAJ
b&Z:qS 8@:ZB+?<HR=#&jKu1!m69W$Jlk%ZJ5i6Q$#hGdy%9yGc?ijc&#?*n6pFa#NYNJ+5*\6b<dS*P9L>n5hP
<8b5*c jj98SjBPuD*!>GkAFL$Dc4dN:YKq5%<nyET>NHVucZTPXDp%@/!dePtK>Y1#:J9*Y8LuC=:P48J\Dt%=
P5L+p@ Hhwqii6/dSKaPHkQjiqBpuZ!<QhBDjeN5yejJSQtM9:V<=?$*^9=+e?>9dP49%j$jBT:4bT/Yj@:Z?Kp
<mC>S9 9K$VkjQqL6i$SF<1j^W?Z^9JTZ6N9d@ehPyF<mFjb?8T/*?HV9yNd?pI9$GM<Y#QtR6*jY?$<<dW&^jF
K5VLp1 nTecQt>dc=!*#*QEaj?:$MQuN@:#DHZ9cXu^%DYV6q1n=b5?la>Y9V&u@J1@PDu#<Qm>%jRdaS>KJidL
@GCeKH wi:Z4w$X4/d*&^b?SZ9hJm*epKS$RmeRp5B>ZaY?8b>1yR9Z48XXI9Gm#1=jXReV^%mm#B8PJ?#KMS%Q
<bMyht lSM9ph%yS$K*Y>&RR4=54>+NXGh9F5ET^$cV&N+dka#FnwPIdGK:pm$IdX\Fiaqt%>@M<%>Wb9>bKb/\
5&DQ9c YBTG*/ZqIh+HpF4WkeK4ML+tyyH!?LD+:ji\?5T4&&ne%<K=X:DZ^iIJVjSmMl!c=Vk!MVCZMGlbikVB
6B*Q^P Z>K+@iJa<8<ZYw:<Gtc5jtQFI1KnIce6:w!t>*ZHk@e6hI6y\e8=\&6PuC9E!ww5Hb=*u>i?:Q9</Qnt
blMI58 E$:a\eYa=@tHDtQVu#W*P!m*Yp!=9c$j1D!EC^>EnDV#Y%&VdnlZA9&Cy<?TJy$^V>A@P1mIlcWZ\!Xj
n!bTTM bjd\q&d+ekdG!aYR??^pVyd%lC*p&R*:CahHnQc&!enJdHqQu9>hi$biDiLR5iN8#+*8Rq$@S@haFQV=
e@dNLn :SRaHy8KFN=\HM=WY^*/lQK+dHX&:i4KZZAHNTV>R&91Y$c&t/yBVb^k4&yTG$=\+S:ewFVw!hqw1=V=
Cu#H48 ntuB#q&daY@S4c+P<8:q*PQyT4a/cp!hP1ai@S\m/nYW>bp6uFP<Tw/?uJ?LJMY<ja*lV!Xmae8^!m+1
?La?u@ KZ<u=j6^%<<PcWueGXXtbAen8VZcY$qhcKM<hq@Z?Ccw&C&*tq*a>w4B^4\n8i#e#M5?iJPFe%5k&C@T
%$lcB# E/?RR9C+4W>#Y4D#Bc1Gi$Cn&yEqNiWlM?yKM?H*?TM9S/4@N1<+c9:<5\Zq8WXl9MX\pmX$qYqGNm1A
>6q@MB 4Mt&Nyu+d955LdKt1VLWT5i&DyZ8RRLa!KMJH&=G$kwjPMk*B:Qm+ibm&lyWMH?#<^NT+w*d::I=/$/Y
>=GN^# VEd+6>$a/=\1hMp*B\MK!hA&n!ehbp?:jIiuQTq6u8KVAbtBjpwCYlZuuYbuqad&tWjdDk=iG1VdyQh=
cYcK$> B6y4btH>KZ:LIGWMpw=u$TBh!jRY9jN?*&hu@6Wu\>\dk9MP8PJL\T*LW6LN4@wJ@Z#VB9$C*pCWZA9G
LnaGw^ cADyQ^m*eR!b^n\aRME#8NYMw*aiV$N6dX%ZR=@SB\eS/VWY5Ae&dR58b1u><#unW*E^tl^N4J&Q/FNm
B\JQpT d1bF&LMN\Q!>+6!!wR@B>TpZSl=n:GK&W:9?IAk4u$!dM>d:>T#qhq6YZ&bj6LC4:I:y9H4lRPbt<%nZ
CwDk$@ %eMLS<96N8Vi%1VKJ8Dd868DQEtEj=*+/9L@dc#6j?V*@i>ndh*@:+q+@#p?%5Zq@#KeNVe:9>nHL&bF
u1G*:T ctTmc\#DMbMZ:yLytM6cEYB4FtYZH^ccFJ:kFJPj+lwe8#+%*>Ju%iy%>C^*L%5!Y\N6bWj>9Z+=Re=M
F=GHpN >@kw%#C@wn\:TnDQ$TE?^D@Fk<u$mLH#h9D$n&Y9VKK8n!>MTLeK#iW!uLL>!QG4a1\6PbRNGtlL>wbq
Ii#=m: bnHtQQyKuuMG!#HZ&apb>^@+%jlpum5q^C?d+=Ib!<u%bu4p8ea#dhKaii8V$w8bqHWb@wYlBYHt1<kc
-Ay4nu 00099163aad001202b3 Page 391 of binaries1.zip
n&L11= /PYebN:K%AJ8X6A!<*Yebj<BMcW5L:bL+Kc=BV4VC*!6eybqYhndSpXVm&*D%<T8Ta9KZpbhWiBJ6uM6
BpkGWt hpy*5HDRRAjb<b\mM/k4*B*?k<?=#DY=!DLBLDy1nVZbP<mFb4:YtSKi9V#A$tb%pqhw+e4mEA<KNhiX
hy&m>/ VM&#!X1Xp<=c+i19kccG8Zw+^^ZEPuAy<ZaSWXbW!wdj$<hd8*c%V/:h/4!<mQY^b8:Faj+ML/bj/6ww
6Kj8:t J6pyKn$6LbutTA/pWV\&&Mh4wNQCR1*<LB%!+>it^tcT:he/F&ht8b4d=KbaMQQNKLdiCSqShy/F#9cS
n8:b!# Metl>4\%CeuyPhEYZta&htEl>m:?u4diGtm8Y:Aq&<HTl8Y$hp&&Y>J!H?hAB*M41wW6PZFNmGN!$J4e
Yd/CW6 6HYiLm8KAmJmW9LMw%I*FAT6Y^QAa<S#M<Iyu18C<#VRZ8aJ=w=liWu8@nt=wWZtHm9<GdcbX4tbQ9pY
tBy$%V um6Y&Mh+F1=KMT>e9h1Y:LSm4bt=#\cc9?9cNdqYcS8<IpNZ59NnNNDP%nH8dJiX1SGS95p?K!!Ck\IV
VliXbm #iL#eu%ZyYjG?Dk:b5it^!hGFPS+8VmbFY>\#!>mYc=b:&K%!6W*Nn$<aw%LBFWDudKCF=@k#CIHS\bt
:kJQEI iWa#q=QZ?NFYBCWZM@+D@L1C:54lMY&aej+&dpW45u!V:P&DcXp4<ul&5V+5&>BEb*cY4\a/!mil\D&:
GF41MA pP#6bL$!iqqSm4i*tZi!VWB$M55<jG&&R&^RpL$*N>FnVe!KBE=WSpmS=@JXhJimKHbRhJ/XhX^ay6j9
a!imn@ FeuK<:L%euRPY&aX:bBq8!1Y+&T^$mjiM>iN=eZq@kj\N5dQl$wJYWEJJuM=nt5<M>\+!<n$8KmC#FC1
GV&TH! NYPFn\a/LNaq#NpuKTKT/?8Z=t*nGiEjElIW5nKc=5>iS6*Abc<N>KP#8ZaeY8dckCL@6h!5RubMC5$6
aB?ZKm uB&iXLmT+tL%&=*BSTqS1^\nHGNe%>D>w1KhW/%<5u::$u!XG#p+b&XE5Q>96:y=tc&ILX+Y\+1ny/#K
tJuhW: ?yh\%9<Bm@+@u#Z6=9c@bE&:8j/:eNd@GTd/u!JKZj:ZqFaZ%*<Qp841+9=9cN*@hS18m<i@wcZ>/*lu
^5$B$S F@y@4*Yn@^hc#*>D?/<l1c/86Q>i/@yjJPt/P9**Yyj@k8*w/9^9cQ?LiGhZq@>i/@^j^Ft:89:*Ymi*
/*HCR9 @&K8@k%j@beS#c:@l4H?k@D=L:Wi@<=p@i8<e6h@\%nPL9?F>6<\q9N@EhH5S99jj/:d9&E5b?h@QXh8
c=5?Aw @+c^*D#@6TuhZQ=V64HLj=>6:Q#@AA%%h@>j5+*hZQ<FNQR@\8Z@@>DR@+>CR^qyBt:pSm=SAqEQNwJD
J<Qc<F m!TcEpl+8K+$t4V\FN=Li8#<&&R9uaaWnAZZ$YP9E#WDwc%qn+c^6PV/<$+!>4PSt6KaF@TI14JdZ8<#
?@D<kP qlMDSiwKY#k$wPu>BZuM5+dn4>LwhR\F:IaBmZj8W4N$wI88H:BabHDNdFFJ8Fq=:Hc6/+/ynp!QpMlq
CkN\:+ cc+c>qNhD/P8X?e@ZQai!6a>M:T&=tHM8l:P:e=Q%HVe5ni^pdiq9dA#D#XE/nXE>!hFS<#P8I/^9iHp
P8tj^V $?wePGEtKdJKWJ8lj+jHcChI!S%5!tqu/8EA#ye\BtH/#586Mak>^6d+Y+IkW*Pyp@p?1?T*B*\J$e!n
Qp+8ip /?Jbu#QHH!au\KeI/Epm&>#NnX66<:k8p&N:&y/YRll81QjW6T5y1:u4eR9T6Nj&Nd9\KFyw@ydwiP8Y
N=<HEh L&&HICJ/l<e^+>^q6^6eN1#\8L5RHdd!mX*=m5A:y!$QJde/8ATu*#*DY#G@^!KJtLI8KCuimSt+Sll$
pWlXa? @&nRZnj!+cNGK><@!X&Id@IJPhD@RcMCn#uh6yPceYi1c*1uJ+j6hY9Q/bH8LF/\!<1Z>>$wh>*R^!Mj
hjtHiy uN:9jV:=@D1L9K+:i:c8/<#<^tc:QV:Z9Lj6V6PGK\jkipZy&&jb\yTDNkc^HlZ?8A/i?1qV$&!4q\4G
H\16I? MPGP/LV5X5m?/!hPBt4e>Xml/jXFQZFKX:V?Rpw9MubEXh>\&n\E#^l*H6&S5eq58M/6&8YJn<R#QeME
DWb5Mc N#TaYPIluH/?W@%Rkhh^Pj9XQ>k:p#uuH@W%Hkw$Np:/iMQ6#*QEM\?MK?>486htH9&:<5TKh!W%M\6u
5DJjJa >G:=\!%:cM%66h@*cV>iP:by$m6+6HmtIwa%@?qTL=KYPV/:9/m>dNLdpq/WcJmK1L^9Rn:#JShpdNS+
=Bb?w4 dm*9D>=<&eD\G^$D%4VA8FF%=NGMAjF6/ml@#!#?VQpmMB?kE@yt%9tE%ikw?e\y&V4DZREXia<&>nbG
%:<C5i /DRe#ZAVZH9^B?pyd1nNb#86BZ9apqGq:9WkhK&?VuN=?K<uiM9q1Dhy>8!@nF4T>R9JdB&etJ1q6qb*
?H=$iD Bj9Se@MN+RX*ZWMDEW9Vl>qb9j8idM1+58:4ka?e4\Nu8!XlZ9=$D*?nGeG<*?E:kP=I=ZJ\*#b@=&cn
$%KdwZ $Q4dRmdptc*1PpITcBJdKaR:l=#$$!?KS>TPlYFPNB8$BLNqWLT6LGSqj*lJT5Z?469Lep=tM1kVFXDD
nMdTWZ 6CdF6QN%iF:@4E**@9A:<Vcn>:BG4w@Z:L\B6a>6Pwy@tAY*nZ>!4y%Vilmjl4yTi:$>ndWjX:p&w9QC
TG\CZ@ VqF<cFS5>^qih8A+5\KK8GG:qHGWb?:FVd:GtT<NaVe5m&/uqehuFHA19ZRyKCd=iq?^iQIS6k5=9H8T
GJP^iG WmuB:8mP*u&cYKN&8LIe:*DT+tiX#kj4yF*YV?^$CK8akVQy>Z8GikJ!<&P8jT^ah/WAW4u6^A:c<w/%
u!WFm5 qm*H9>ZMEFXFZtlini6RiwnyB@PKY$%i6?>5!$&dtn?Ct?1@Wcwjy@FmjGjB==5^XwJac<>H/jYhPbPH
8=XPiL aYjq&w9L%5b=PRnL@w4bQByn&WS#ddwb*Z&cEB1t=Z<Y@$#/%F1*pD?9&GNy=5n8>K^qHmA*$#9pe?R#
A^NppF Zq<&d*&AI$TBZSy>E!89t*/FuhNI5>^ceHAEIdE<XlQ9b9E=Kebk=GMMZu<5R<>/SjScuaId+?aq\Te*
KnlPT< uNyhY@q\h*9*Z96Ea@t6+klcZ4>GX=pqwab%T$c*takwb&c<:e&Cd%&9NZaLRih<8&8?8J:Rcb&K*lA!
KN^IZN FYVumdqktBS+<L4Pw?khKL=:W>XK=+SM=?T?b$FD?htQ%u<>?YhX4j6kdLyidybqT$X$VC#lWLBPV*y8
:=T<65 ^W14KS*/tnyF!4LTk=j^p6M:CtcA/H#*>$e@5a\T5C+X^EN/ZX=jltjt>Ne/NL?>jk?>#m:&@LuSjW4q
BbLb^A u8N9u*tZ5@+?/h>$8Q4>C8Qt1!jP%y!jte=8eF<4\D=ckiBii@9+$yyALe?Y/TQV9j95w&L4%1XbX>!X
IQVNmc Rd5SCX:aKF8>t#6Q:V?@ad#$wW@#\wLw/M!S:K9?<^bJ%FkM94B/+Pyjt$&p@9XyIS4\iH6P:^am=e:q
G##%tH 4qQ^W<@?TI=p<i=&day?pdC4\uapZPP%@JDlYtnk1^1Vch\W8V\:ajinP?811S8CE:^tMNi41KHSF+i:
i1X<F! meQa9c>T<la*uiHaZDuSlC4c5Rp>M:l:Fh+85!:9Nb=M4:wj?q1XLlpQJcdi%h6KPu/+mL4XuYWXW1l4
$/cLMI 5ZIk:$H#1+Dk*l%NWbN4ZP<!:>eb%WED#nhd8T:a9Z!5Ed^/%cpRy^G4Z!Ph>>8nI=C4d/8d>*4M%/+/
5E*:kC \Y^T=qRYWy+tYmpX&@\##dy*qZ*awY/A@*D+u:/<d<dD*^X:^^5NB&%Ck8LYEqXQVPkV649Q4J%=%%%R
I#dl?Q 4tpyW498^9?%::bNceFA\Je4:di5Ftt<>S*m>?e>??c>cC8GNjT:*%+q8m?9/N^5?QlNT9A?>uM>jbiY
m@m$mm kK4uiw*8#w94n=:kdNAat<ZdcCj8uQJ=jBt4?^4!<<8/:$nSY?t?9%yaadZNYkN9j?:I5$=?ej=X:<N6
Hm9$dp *I5^ydYQT9jjEN@>8@qNKlI?e:G!c>6G$hX9G%dNLc&<Ynq^<<=LmJay<SC<BdS/$wK>w:dZ41Ka66E1
aeJ#yL c4@9jt%4qEYIlwjiQ%HKCZPlSybm6<Y9m?8&1:&A*!L$@q^dYn+6\YF4T<aDn<C\4?M1l>KP**BPDYC@
5!k\Kk 9Q\#GF+6^5AYk9P<5q4Gc=4cchnLm@nby!Hkbhlq?=hZc91Z:Y^&dkqGY6pWb6ne*uuD?i*nQ<%<WViB
Mn!bVT &w4cPFFc%LZ?LQpMy1wZwXt+A5/SpuKVn?=K96H>$T#9LYQ19Q4+++yL4tN6n+/ip:cG9>jE=Xa/BLdt
ES4\Ad $>?<lHi&jLXAJHj*Iw:8XX95SKG!#&P@8S@taH8!+\@DEG?Nd8*I/\@hFjM$8FNh?W>A:h?%e^i#Q^&m
awt*Y9 t9PPR?FY4tqhyQEJKd*m\ZK8c9*q9C%H^>anM/=Ib?k9qW4WSH#FVk*L+EZLdR?Rq@J:<cXb8/4M###Q
YR=GqY C6%pRc?R:uK@nM1!t4+duN\$&BXaq?!18pw+Am6k%TMP*<=1L:8<EL=ca1GZ!eE\^9P8!tLC8>>$$H/b
b4XTub P@@KN%?QmFc@6l@TA<i8V+S$!JP:6t&Dh^$NG9*5*@?aSyqhk:c6Vh5C6:T6pdXq!@ae^a94b8n&5P+c
+PTV9J ZI*/q@GhNY!SjQ*VjYBq?<G/tVW:Mm18clp<Kb8>@DM?QHIpuQA$1JnV@8%Z4ZQu+ZPeEd964?84JA+=
<Zq95w N#cC+XMnX$t5y/mXpQ:>GAHb&Z?b%e@TlXWtV#t^Ba&u:TPLJ8W#pt*8R!uJ4&^&RNQR$J4pn9GR!bq1
T/j<#C qnC>+<K>y&QVBh+DFd1Qa@It%=W%9V*yj4*p95N?t?6*NiRQn68+HkNGMVcdH?M4%GKe@!1j&#I?eh^i
#%:Z&! l1mM1YT^H+\*Xwjc6WJ#Y/N?+CNGJ@Mi8L\8hJ>c1he?***>de%XimX<l/%Gl<iJ8MSu%/tFJ>>HdIGM
ZX#CPJ =XdHjNk>qny>w:=yKQi?p\@N%p%:9tu+biMR4BcdG*158/i4+MHlHNi8liBAK@@YmJ4YYE4%B+u^YB9m
4tQ>1Z <4pL>w?4R@e=I?n<4w^Vld56%:?HX#iMbG!AhAiRh6tcHpa@#*Xq>%:FRPNe^%JG4+$nCtHLeY<QW+&G
$bSmPY ujW>ShpQP=+V<8&%Y>P>:h>YXEhV84*hlGu4ERJ:<*y^XM4&?c#W<HmVem^>>/j6W&?VbGqBHXqiLSmq
EnyFmG bT+m+=VBm^9!Y\*D^WBw@6lu:pP:<Q*p+RnHp#dDc:?Q+WG9mQcE5S%1%j6>e+XZ&KTb@J!DV?1C88Q8
QSd$=m bG$Q:M%\5u>p$j9IAH*A1/nRp?C/A*=$YcHNequ+<+A$%JVIwtLE9w&FpmGT&8w=Ba+l%^/+5Ry96jWy
R>!L<B m>:=b:LeqW%%&u8l8^6HA48iV*//e8V%t+wQ*:CQeGJuNHi<%NXlhc<MDqSE=n#IDbq9^i@mT11V%naW
=#T$RA SKi^a>Lt5@L#u6WP&l*XeuI9mHdQt>VR4wLqXGCpdc!*I>58TtnVW9Stb:m=^Q6Dd!^SY$Q4XXi^t=XY
p8S+=u 8R=lRec9jB&4qZak1$P5@KmX6Vc?J#jkSAT&jn4e<hKb&#M:u*6+S6&qL=?JqZSJ4jAipc#Lkd^qR*q9
TI:TEe l*Qy5TPJdj6DQ/HQXC\^TATEM5XPqYi9ZuIc/lTJ>J=BVbT$54\/dmDCYE$V5&F+?:m*G>Hm=PT?G/*I
Z5++N* &9Xy@mEBq^C=qRPh*lijh9>w!@GKLeu8tHmej=a4!?9Y?eeLu*I6PL#$lTu*Qj98\y=Xu^@QBkyQFl?9
tSK+@n w9Y884cTh%KXq*@WiMP#u1/<9+b5W*TG:dEA:!$eH9mlBR+59dY<N*WMK<tIi?1>Mc4CNcK!=EQ\e8#a
-ARDTP 0000180a1f9001202b3 Page 392 of binaries1.zip
e<M@m* tR4YV+6#Ei+Hjid<W1F9ZcC/V1$ti@&:>wy5>p+&F!pXcFp+luHja4RlV4KP5!l44JY/DuN*Qhti1JHu
bb&BpE hd8l/wY%l>*wn#9<u&4j#Jd@nLCBdWPnaHCE+@I%Pe@NFcIHmq9%/B4QnFk#l+m::d9Xuhj%Xc>%D>R&
*N^t!> cNn6bI?i/eZ@QFIE%<S#Z5CQFqdP>i\c6#u&mkun4hyXbL$8>iF8T>uqKYuDy@4%A?8Q=9Hpli#%4!>>
/+ntPV KR\\W/R8LlTu%/ddmNCj8nbZn1Y5M<%h9LJbT*jC!T?lJ!*=!eYN%y>ZhH=H/q\86ZJb=qIQ4&cZ6HS%
PjytPh I!t8+4<$l6!!n4=?e$MX+En>9NM1+&nQ&?mTDRF%V6&?n?+E8wbwd#6l6=8>eDF#ZF!:!^MuZISqX>EP
E/$a^B u5h6LX/pVV:NZTZtHL/MZ*wT@nq&BT4muT=:i^SW:L:p@dZSN@Q>JtV??mSGhLk=J?Z6l:iq>QlV6<>?
T@*LpA MW>RVt95^F%e9#ZP#TPk:<EJpT?CuwYpb!Gi!nnK6hKe+=GSW$u99*MdtTl/*MQVy\Vtwa5/n?*wnL<%
^M%a6y w=Icth5YK!1jim@8#FtKP1*G!ipj!ptYm%j9Bn+F+bh^$B^P%w<cD%Snh>ajj?@Euc:5iXG6<ZE:p5lY
GjuN=T ::/RqTV66=Awd?%<baSwVSi@/5pkiG6cbJ1Qhk#CZ5R/qY&=GZh?LJj?1n=TFBGK/>L\>Q>cN#</<tqk
\L^SA> LCL:!NPNV=<qLL>^b<\wbnynyYyt:enw&=F%/Mc:K@4K^YiE&!W9T&@YtAh@mN#qlPZj!n%V?mZ8=ayJ
5P/t*Z /5lac9KLi/6HnupH=Th#/kj8q:=ByX$P#P:?Py=b%a1QYJe6PZttXB4=6:SwA6mPPnh*tLXB@*ZJ!M<+
IJ@R6H Sn@eue8a9!XQcua5cZ?I%myRD!</Gw/h\\W\a6D<P?8HJ?V89@ID%QPq%k4#N&8Q8Ft&?qE%<ncI\6?P
Rlb/PM ujC::4XGYMc=*Luj/qubk9:l=TR^ZLp6R^K?5M=<tPWFqi&/=?h&q4:%eN#Bb&w/Rdphu!AQHZMc9&D@
8M/FWw CipSu>tY8A+X@cD5S^*6!@Gt^^cc$5*q1&:l^=9185a8I>#*dh^\kb*t^b8Dy=##Dyl:?>bmRq#=/ejj
CAS@QS F!mD!%Pl9+:X^4ileq=Kh/?#uQP5TZDnZ<5+u4q%\!#58j$&*jY+w94^B&uHi9GiS<d!:lSuVKc9DC4n
uWa^b8 N@A+nuMY=?=#t9+1qVS8&PPe:1C#4k@*a&N@?Nye<@S=<#>GPE%L+1CnXee8G:jXa>cn=>cZX/^B58:c
#BIG>A h#+add4^jqZ4pa/SIy@p+ycc\B&G>MT%*!SFL%uQAuj6AILTPbn!uV4I=\h%9@VyNpjtRW?E^Z^LqHpt
8+n&Tq \N\ZHn@81n64q:5eu*t<K6emj4dW<L1u?ceVZta6c#=jTC#%%u#GQK?QT#nt!ZkiFS^8Tc$@k$T6\aA4
X\<Y1! >1j/H%*ib&mR?HuC=ap\<eQBA<B<eJXJZPb&eklMWk:#QL!64I4!#@KJpL*y@yQSVqedA+GV!#>:nGKt
u4ae%T :9=h=S<<q9k6dGV6@SL9qSeL@wkV:^uSPZ#bcQMS^6QLt@?<QGa+%C#mNyjdZFad<R:!n/5?1VbSthK@
qmwt^/ \!^wNGw/EMHItn>m>u4XZ8&VVR@#H8m@H$%b!h&:=&J/>Na69MF&w4Al>@6utW9Wue\9=yeD=EiQCnt8
X:ih\R N$$IP>RcSmLqie69LbR?+YCu\9QPJPuW6c:d6B!Sean:P6&*@bYl9DBlPKmY?nVJ@jt6:Ih:S5/=**>X
^!Tel5 /%1/+w?Vn5iNkpTdh>ZhNIG%j=YeN@1lp*jaeZKtKLh+8HL!cc*uGZi9FSnMB6dp4B*%kjt6I:^HeRe@
!i8A5p %uE/aiN*bwuI\iZRym&b@>C$Qn=el4=%VCe#cDSduZVX<9*tc^411*QiIZ@yFS:5Dct@YJW!?VJ<&h=n
Wen5R+ 1%D5t#+Va=EHb8SZ@*w>$dXAVDI&k/^<$BP=$Vk:b<*dmZVdqP6bk:e8jn&/XXX<$jF\b8>D$un^NX*y
VD^8$n 1=Ta/&Q4Y6jB#G=Rl8/TYl@t?CQ5Nk!cD@I6#F/8Vh5eIc!%#>H%D*m\DXJ%J6Ah$cy?dF8iM!tQ?8VV
i@!pVc >&Teqc@\$E?b%cCMPnlqtYaZ<eDqSa5*1hy\+ZHhT>G6y!Xuu+=Wt1jhMQ?bVh&&:1XJwd&aalNk@Z!R
kFGpnl bY@T+^Sk>lJT6jD#!HMG+TEp@kX@#aJ@$I9=cj?D:>>5P=1@:jp4@>cZ1#Bp5$q=wJp<&itF5M^^VR:#
!/le:A u!BQ#k:WRW!Ce5?Py<>mJS^W^\Eke%<ZjG!6MnjluuFq%u!?YXJdaJ6HcDF&i*S5:KZ$#AKLc@9GQwii
ue@mbu e&#M?6VSabFScycE*6QttbSmNeSSt:TtT14lj=bnDFwFp5#HuPZu^t4QBB*+i@iS=9AN@lc=1J/*H+qE
<kHe<e \a*lu4CG?M<>A*:nk5^e%uk6/5>&PLA#pS@Nb8p*9t1RdJ?GR\A:RqX\kFPQjA>W9%1C$GINb%M>GKMB
NukZMI $e!:TK*!RDmT!qc!N%XmS6ME%bl$yNE+/WqyYTDQn1A85blTWA*R^Cyy1%dHNad>kY11TA6pX*ncX/yu
Tm&N4a iDLt&WHYI&V^J1KK9cb?iYRB5!*\BdVdkFKZd4>bHq?QCaL%!?Z>#teV8cLTCm>VVDqd@pX4Zhyy@%*:
5Rj#>$ =\4Y#4T^e$<PnLu*Z<mI*6bdtVc/6Nm*tuRME@#XpCCq88@ch*KTiYG9PjXp$nGI1E#P#yIE8MjbZQQ#
k%!ae\ T1<QwJuyP=lwXkw%8P<F8aHQX\5%dBA@P5bjW^>le9VLdknq?aK@m4:>/D%wud8VSajWVJ#SQQw/@NYk
yLut+T <QZh>b/WQXa$*L>1#Lt=@j<PpNdN@Z?4TilB?%?clP/i@&/V<H>?qj@Q*@4@%=/Kt@8@&TS$w@@*Y6j@
8BkVTH wl@n=9ujc%$<@#WG$y*&*&8hQj:%e>&h@u96j>t<euj?N\d6?1<dRi+8@^i$49?G>4<ABL8:@S6cy*@h
eFwNj@ SHJ*@$?NwQ?y@H@XCQ1@kT*@w^FE@^iRT*iQ@@PRT:h@Ddq$?#ekq?:$@&jIJj$@RL9@F!CZk\\G9e*G
%kVap9 Wdj<<n\:@*@CIEq!D5$AY/N5h=I%%=m=NEi$>*!>J6&1j#C!ya@/GdF>tV\t4ilBQHcuVu8MVh!Lm@kM
#lnYuq ACtGpEtNdB6hhTuWnS+j*BtnkSkTVC!YMelc1GFlNK&bdZ%pe5$jZT8V%/^YJ1&@8@byALK<NjZq*<$4
X1:&dj E@Y*D<=ueeLZ:dcXZ1/WyEX#?%Ie>cwSb8VGmdYCK$4yWIF!96BLn@>?eYC/qkmHbCCFVk9tbZ+nGe=j
ad<#:a 1bc^p59NBYinj/di*ChVjhm5u^jm$Z4#\k+bDK<:ulPkLWR%M>RI%THtEDXKadSha+RX8Q!dnCGVS=5W
D:DJTN wIPeFZHhL:&89nwA>6++b&KCVC5>@5$e=&wMMljVi%EZcy8BF/jR&YI:hi8FQ981/61DBQYY^W51EmNj
FLXPAH meKa+jB\wjyR4XP%!A+\\TlbN>YX6iJNcDiulaP8Gtd58?+c4jtQEXmw:QmLpJ:h&1dn6hiPw5eL/@q#
qI%^Ed S\J1u<%$%w$6#MyEHc>@6XFK*:1Db5wQV*aGQH\PAJTiJj&hJ&?jIF*Nm&*!\<\6@GVk#LXkQ4kMM61<
5QW<tG Wp!nYae=D@<D*I\=dd5<=Qd=<wm4FX<lAhjSZNhAhE<!NZDuC&Enwa:SmjP!NE@Th+*pk\al\N8QhSlc
NS^h!W #A/uMG>ln!1ph9%XB^MpVED^\LL6@q+==j4WP9Xt6@GSNj:nBiatP<iyyYDq@Q=uFSlBe&+FV6!cminK
#64kLa /HkRlq>k^aVn5<</c&kH*1hH:l:?<V%RHkR$cN%d598/?8dX^hTAiueZe>8hl*ENL5EeH:j5yPqL&16Y
%A\M*y /Na+mc$P/:PPEFwGWNw%c^VlMBXKEJW$h/&CHTiW^GCJNi9pH&J%MuuJmbDYWp6aNaPZ/w^6w<C<yYqa
&YuABH nb*V^DiYS&EY@L#:DYb59M?>^C!*6aqNi%!PQCp=t6W5GKuNXXRGDGRqc\qjb85J#GPM@HRQu+Ilti5a
NbeWw# Khy:KDaad>$F:tAK+jCX+6k1iX%JRkZJy!NB5MX!wCbH6&X58Y=/Fhb14%A?i**6Q:=D%=+6$*Xd?=u\
CXtXZS $nq%^+6P89:i\+9+Xi$CXYP<aqnP18RL?ti+SE5<lpLpded!BJaW^AyISqNctulaD6kILN$/4IX4VXie
bp+G+> uDW/%&VdPD9WSNqnyki@X?dn+dSajH^u$yLbKHNZ$\=>a1uB:VFc1eZ?Znk+SEZYSVhkB1e:%enhAw\!
*@%ac! C#>MK!HNem!q6\wBBI/kqVGMqGlutE1<mnaM%1LX@+m:d:y@#mc6PjHmB\RMaCp&$M:?:d=/@5XjdXdq
p!8?B? WV&KTyC:B$yXR=1V9FBb*^mC5SWYAaT5cmXkKiVe\C9NjdYe>8Jp8A+E6@NpPYlu1bn^qNdP6E4!?=E*
ap=jMy eFYckkp>/ESLQFCKZnQ^@tyA+pN><5uVY^e:FNYLDptRumcphdXAA&^yBIBl=LCSNSyHe8X**F4Q=MRJ
4AaNTQ &MN8RIW&DMLJcct%NN=Q9RT!Ykm>L$JH\%Rp&B^4F4P+/KTp*$XI&LcXnh8N#VBqNd%#!!=*jBCynh$#
Skk&14 %QmEp*AltyAiGH\8^W1n45@pZmeED<$>Kw9t4&KMGelW5lm$yNlj&P?KltG\1C@n?6L=<*8u9uC%FZEi
WWTdm! RSY%8tcq//5YdR^GJ%edDAu%^$58P/Tjiu?kGF&!C:eAaa1JckHmBPuAIJ*QZwpZZnQSAmd\Fn\WXN/\
Cu$!*< @Yl9P**M!F\HXkbK\VGDetwpm=!TY**@DnQ#/:\NbTdRCPJq!YCWAit=mhk$lA&\Bwy?\uYJt5+@5&c4
m5^a&n e<euSN5^TmEmKB>Da6d:qnMn:Wd=D\uy#ZAllRkmA>jdQGqL>HtGSjABL:n=9GqaQ1Al4d>HJ4*P+jjW
W&b=+% iI\5eLY6ad:Xl<<#LJ:CPwPMnPGMV@u6%yA$PiC1IWTam\Q^i:X1BLh9Ha%=4hERCkhelD!9EL:1l5c5
iYmVnE uaYau<JpEE>5FJjG<85&T+P#WjwCGw?Qa^mk^q+T#auLaL%*@buA//&bu&^lBRy8%+dGp?%^j6nJGZ@\
YM4CKq =DI*TL=Q4hNniQVy*ai8B+@H16*u96l^^Y4AP$@D1ywJ:%uWEMAClRTqnyVL+A&VIB1p$GMA/4$i6Dpd
9KcMe< ly8lCJWuCECiil%:*CQZ^^<aDA!K?NkFnNn&u>XN>dp>=KAVk8wq6cT\bC+RjYa>q<TWF6#P6dY^k%<>
LVjFpy @+j\*YQKLqw=:pPyEtc:$<kIPp#@iCtDVwA#cQ/m^bh1*Eb*GZ?ZN:Snn>pV8/VlRyktuLkC\SRkNHEH
a98N5/ MuwP:B@yb:hL=PE+NmhVu^Ei&Ew^H+c1XyH=M>tT9e8#8wK6#>>jVb?:pQLdq=$k+D=TT/4$HqF=Yh*l
wXCian Y$BFqnwCj8WYWk?<:aPD8jT\t1Xe=eBZeQYG4?8R!h=PP^pHYP?\KXe*bT9l^aZPttPjDbl5T/pYT#$R
+W8kpt JTA<5W6BD?l6Bcqj#8>h:@HeL8tAlh9+9R\nQ&R9lS=E*Y5<X:aKkd66*Z6@M=b5Hwn>:KW=qI@YtC&h
K:#$EC Bb#IP<hbXVl!jmDRY?yT*qPCW8ccclaeJLw>&#lNqI>Bcy>BA8K/Mc&\QHXTk\/pQSDdpm?BD6T+FScq
nd\Ayc *nBEcp<?iqJ!S9emuTELWl<aJTBbT@#8Mm&RVHFnpHG\kQpTI@iV://PadXF$@GCZwcV/BJqN9tjVjpZ
AaHlF: F<KXT4Ty@#M6iQ+&#eX<AB#<5Dj@4XuFcW&ZG\?1Nu*KM\Bka$YI6Lc6j:VWw@&J@Wp>V<yjS1/:JbMN
-AB9SP 00030aec01e001202b3 Page 393 of binaries1.zip
^GPnwF GpECe>Yj*e$VbJ<ct9t4>V*&$QC=h!69uB>&HZHK%kk/k+XT=EW:qW5&K68Qd%Ne&yy:n85N5Y6$A&nL
5=R19* bLkQqPHcM\mkqwM/Yn:6bmy/e?DQ6p$HH+RQb:@TdT%Yp<=P?IW5IMG$6tJN=kbBth/l6>8&A4KiG^yk
!pWNAK w=WGu:RiXCc+&9/X?8!A!+uZjy+QL#miyJJbFLSm5=FpwR8%b:@h%^NPu?NXCdBIqP*19!SVQ*<XjE%h
+L/#wC Q@>>?>AdQ>N:y%c6iLI6hjj4Z^/9*=4KBSKiGHibbElwaZQLC>n4V/S>9/u/ejYTHueCK:mBI:MVh6b?
Z&BYd/ uIA6%l4>YCVh+M<b#aamGPjW\Sp55^kl#%FZJSQ=Z/Dnh%@6uQ4SR>t1tCN!B$$XTtBkDK4$%mCn+aK=
RpKdV# n!h/\ZhZ+A::+i1%WGabe1AW^9?tPYwW&Y+E<L#R/%11Hb<mNi@tpw=4!ch$8YYt*JR+CkdGGAMuDJE$
ty=C<c C&T?<ua?+kC@EkX&+!y@A6^WFI>AAN5NtV&GaD?E:PDLVWc^I=BS6=j!/8&WB:XIGV4<%<eAAPDyE5lV
Xn5>cI tq\=Ri=>k1eL\j&Jyu%FVqyncN>PC6kR=5IRA\JqVPpwKCDJD5Pu/VDh6Wm:RLISZ?GBD@qL:d&X=nAE
#EG$IE !=#R+bYR=JZa&S1E\EmD/+=S#wCpLLkTRP$+1@u8ldcY9Y=6=M@eTF*Ta@$$GJGJXiQn>Spa>WWAAL*X
ja5h%: GLXD!8NR?b?cBj5MeKlRy4QY:C:^GA&uwwLpCa5=GMCu1@N?n@W+l4^ih@&AduV>V/hDcHWAPpBdMb86
^#@P&M Fm\#8wbG1^kt!u+%<6lBEkAHMmnQ@!VlZYt#cby<nl@JBM%6XPQ^abuX/Np+I#u&8lI\F6#&e+acP%ab
J1aBPq +#bbF1K1iTd1FmTpEk>l96RBdhBpthb5j\9#yXBXanl:E6MDNj1\*44N\bVp\AV#%QCdpal98kQVGq\5
Rn@1<R tqSCa5\dkl:Y:/>nc1*\H/=nYC@^mkq6J6bW+Qy:d+L<Hk!=FpH1M=^6=6bleh^F$<M*:Z1&YNcPM9pq
nt@1kA CH+eAC\*BN5%B=\%GY\nZn>GYhmwBNAMnpd:P48/hFLBD^66yI5aa\\$/A9!ICDDpQjqNuA<Amk%=Rbm
Pw9dGj j!<@<>1%Y*DLY*:8V>6k#FJRXayS$NRawiy!4Ac##HRAb5^4IyC/$TShI+*%6F&V4m=FL4&&Z1GAETXP
%e*:l# VbAQ=d:XQDwDAAGc@nBh\d#cAPSTEhMDu&==8A%N8wbqLBpBw\AnJ\aA+JbGGNJnp%twjjRB4+?BGhw?
Hd<tN* QphC>dphFuEEpNTl^mYwki$e=WX\>^GjZi=P1t+DJk/nt5iT1p%J$9Z!mb\=GB1j^ND/^il#6L:X^XAi
$*+?i! S=A9Mw5#<KRijhJLmIMw!BWi%Ih!Wt&D6MVBBuCGA<tG46XG=Hyh8SFCQ1>@+maydmQn61*t^Lmetaa@
6SBMqK QIY=*ahSupELK8FMAMpa<!:MDN%%p&HYRmBwB<jy1uQqtA?pAhhwu?L4pWZF*\qH<j\HMKZKqM9R+j%l
>D?@Pt ??q1FPFtTEALY8t6I:eteLQWtMPcRCSIatF+b+\H^udw1Ej8Wa8<hT!w@nCDXGnC\P6!ARVy5u:lLY$*
K4AbAh X&8?mba<B<bwI!t!RVIjBRB/*C61jcWdm8MV?%1DiCmR@AC6<wu:yIm>uXBG%wYu^YpAMPD&Ijd/peVQ
#:<Pjb Y=MkCLm!Rd&k=A?hujFP?>tZH/nN^wBYyV1jY**8iMVH9W9i$E%m8EIWFG&tn@ii\@HcudHQcFA8j69#
T@F+KX $%G8p!68>cdw9A9m=pJ+FC%8eHj<1^XuEKiAibB<E1&/ld6D#>uRtjd=ad1:PqiX$?G8:*?u1$aXB=I#
dm/8ZC %Gb>w>^eXt=+p/H4^IW6/Ty%8K1Xy8=?pcj9^Hc<BTiDEeym+waj*ITphQiXmhq5EuePNpA^IepR:wqb
VAaw/D h@/MV=eD\XI+I*ZV*hnX8wcbb$/qp:/ByEakai?c$:jYjIqn<FGtDL\iM#%lEIQp^5GQHM=\@!N:\@5e
AhG8tZ uS4\#HLmq$aAVEPC#bBbDlyk=y:S!&@dBwlVCEwAGITlXeXa49u>&c>J:5<L#+n!lCS>Fd/%wWGQS#Th
JYTpd9 HVZl@V+ERqdj:T*<&/+HkIEMQEEFtQABRJGQG!l<4d1t@MMyL#F/a$q#w8KHnZIG\d^6!q@WwF*wuj$#
^+c+&A j<@pT6qd^G&<65JLm@@J>EM+TjuCyWT!\j$!%@*%h<XdpNSnIG?G<mbAW5J9^&nw@JN&:>SGYVb/>lcV
mn9FAn n<Z#8>RaHTa6CE%FDY:p!h4ES=9&up:t=1MXpWc#cRlTNWm!9EYmAcw5$C=5/>/m:iMAeqaFWh#Aenu/
cn6DTj 5+$kPS@J4$V**b*Si:m^D=uacL$qa$tD8TtjG/\#8\8ptl5W/^V5nSLj4XC:T5MPWE*Y#PFXCcc1BlQ=
HtGctA eR%8k!E\cHy9R:u81$&^/ypCNq+=e%bXDBM$kVcXimRKX4pl4Z/L8D??uEJDC4:ly86lQL@KYRaATApC
N$&*?5 d**8Vj@GjaX:j?ZG6&81<Fy<e#nJtTk+1GijB\M!DAZ68M@\1mY4ctk*jAG9#/>EKF>1A=^Tba\J5<aA
kjdPMh 4H!%TZ6*KdVt=wRiI^\6IG1pLXIaJWl4nu*@?t4/@n*y*RbQ!nTWPYau8iD$9dwpu/!#TYaME+$#JKJ&
J#me%> m&X^:=::SjuDdTnFMEm8$RYeLWtqGP/WMVGYV*!%N@Iepq6n\bRlD%jnFjttnN&4B<S\jw*G9h*CyGXN
Q4Xb:+ R#l>AlFiun@Ec+ewR@Y+qVlqA$mPdhyW6YuVq/9pBR6GJEE=TPKibnI@wbp:=Py?B@TQNk:daAl<NbJ:
JL\Vut Wui&S$8eQl?lIemBK4/aeK?h&G^+cN?h64^hYuN^?wC*FmpFB1bBtYeXJD!Mb/MnwPIWDQnG*9Kp#&*m
!W=\*P QI&$PQ%bE?<$6IG1^/NVbcVMkCt16YjD+j1*FHh?hd+J%8LTIX!YaX$QTE+^WVZBY?KM8RkD%RY+QAh?
9mEPkL >clE9?CIYD>ElXjnjmM1cYn8GKDpcDA+Fp\9>Ah4uC1ym*PwyuV9Z6/>CGEeW9HTI9GG$=4Pa@1ididt
\F\unc KGYpkTC+5qnZXPF4pekFTM=\ST%Yed4&c&iQ\ea84b@E/JBk^tM<4<Rm9Au^LF>4Nq@HX4h/SeDiuAcm
nA4XwY /#$tD+jlGSK+wZmF=kblHCI:5!@=X6@ie^<H<AaDSlD8A%QFXH:\AwKZa4km14@wX@d=pLbADKL*CbNZ
W+Nj>5 u#X6b/nA\RdnnPX$E?/GQ9%@R4i5P=>jmPTdIG:qwqWVY9J5EP\^WGdw#<yS!e\nK*ciF&<#uqWmBN@k
pFMV69 An1RWI&eVWCS9DY:ZH4Q:^ne@=iT?**b\>$u9n5PQq\:>M@D4tZGF&ia^%KYD:5LB5@>CPZ>$j^QZeXM
HV8d&@ bLwk%\m4qubYc/R5cCT^XBN<N&LpMY4P^=L\$L5uFM$d^4+9&?C>/jIM::Lht:GWm6GH?yiNa1>+d:^<
%=CSbX IiLKVNmah@ualjZDbci9NK/@Wub1@MKb1DLF%bpn%+!8Z$9bec%=XYQ#8HQ#4jEXy=Xqu6i?@dylyHdV
HFR8+J i<b==qZY>^*nM*W*++:edQ=^w/^yk#E$6@uyDS@p^E#SyJHk=pYd&JYGY\:wZj+?NJq!?cw^?iwQhK/Q
NGduGl m@n:8/GbZ>jLhq:lyTG8@Ht4?iG6IRIM\P9b@FZ/I$K=M948!1BBqh?=V\SR$@G8eeY66GLeihVlqY/V
L+mDcX Q?^9ZR#wdawIbn/@j#H>@6\TS9E\tHpi<YQ9qE@5:i?hNpAFm$A\ThK<@/l#88Yk+cjMuEju:%&$iHD^
+^VtG& Fw&l\YS$:q:y?JjQSI#Cbi>kuMcM@8Tnm@eP^E<$:>Ie!LBkju9ke$i%6b8?86Emt1hcPj9\^+abq#\+
JRt+d8 kFe98D4:\cZHwl%PDkTyP&+<h4^?$HD8nC?T%!ujynbn\4abRKluq<<@>46p@Qq^<p@Ce=?uQ/N8b>GS
>ICF4? B>bhV?W6tQmePYn@:Q9:=:/^1w6QZq!1Wn$?NQ%w*/S9#h:WHa?*HZ%^5HQ&<iqZn+?>?lu@<4Z>!^S@
c8na=M JDhad@cQh8WF\5n=F!bdZ$RE/<6>NlJH*y1MudJ\%&RIad=@QAJK5H!=#5MmJ6NII&=?JGLP%&*D!@VX
?kcY+^ T6W$kV5S8YuFc!$1RytMAwlGQD/c=/C68wBSN1QAR8*6l1?kauZtPbBHM@y8>VbyCtBEL@PQ\=PV<j#Z
cB#t?# MP=J/K\9Ai#RtYjjKM#FMINK=dLL&+&<!CbcVF%V*ppnWkKB:Bdmi^%k59Xu#\e#eRnGFGHAB5Pn//tI
XCD/49 89LbE>6cLEq>Gu^uQaWT\^!Fk@AE9?kl%ZH6P/MY#H1mMq=N*tdC9R8$AICA\cjScRAWLlwk=+@q&8nl
XVM#Z\ SK:qKA1RqI!IdK6eqPX8NnY6aC1e4X&qJpYiT9:cDX^1Xm/6Ak6#tbmP<c=VQ5>@\jZM1>Rq@>XB>&:k
ttQKNT \A+8u*Mhw*?@SwDhHnA@PV8##uTqaE@uT^?9=V/%#G5=e@X1+6Fe@F<Bq6???y5G%TlL9H\1CaqYNRjH
@L#I^D V?bjCjb8X%/b@@4=5Y<WXK%44RWy/+$=AL$F!/**je<>QE/cNi5nPA@=/p=iFnuZAcIIcinpVM%/SILi
TBu$eh &c9KnE%^RbGRqS8YNyt6@AeJY6ZpNB&PWH*a$4nTMW%Y@iE>pqu^jLdkM!I/=d#M\cWk4>&TJZadKZ%D
L?@n^: 16\cn>:+EQ&#EJPiY#Bk/*4mDNEt>=VH@4<?%A:Ib*5/k8TD@eW8DTekHYGGTp?VWIMub?p?MPdT\Vb\
ScAT#l TQcJIbG9cXlZldn!wLPC!!L1!c@lS%jwBAVe1LPTc:X*/V8FLhc1#jFj@&%uh#9@tmJV$FYBpjQqTjT=
I#%+?y yBaQ+d#%B$%WS1ha\^t%&Pc<$/w#M1^Y89VF\VTcl6e&HJpK$VqlQkuSacHw+k\>@$&?c>BZ?+<n1=:T
^YJGc: YAHTpPnBRQ1e9MFCjN5Na%G=5/WhZi<QjNLbK<Mh%>5VAMEBjF=@*<aDV#:NLDp9PHqb$J@t9::u6/Bq
nBYGV> d4InKnQ8t4Y\:5!!cnqAILjP%Tw*%pKhcMpHGRHELuc^n%bRNI<&p$AaXqFZpHk1^pwQKlXFnBXP%X?\
!9X4=u +w=>^Vj%ewD\k&ti>VA\K<m*6+Gm1mC^cPy@AWJEQ>i&MtN\M%m*8qP?9k4TGilih%6HLX%<P$IZ64@q
MBWVk: ^bhkRXaKRJAMnJu5lFJ?iGu%JP/C$ZhSFQYtwMXDuLS!SJd18?9=@Wa:$@di#maVBn*DDZhaZ=bTI+l&
VKqbnB HwCbM^<D/ZG1Ik^!VthbbG$<@Hp$mWt$iZI\<MEqWHQkWcB#e$A#n*&p<Y5?VCkbcEuLJRGqEMRAi<Fj
9G^dht j\nq5MH$1/LDY#i>a=C65=45ENy\b=M!ZSG\/BeyC>i^dVii*@?#ny?bQlmVHMLFawB&+6pkVAn*iAWG
4#hatI EctWQjt&M*Kc+EKclnd6NX+alJK%mqHGR\j+CY?jb9h#RYE?b$Nn&/#qKV=5pdDeGnabH!u>Zi9leF:e
jcR4Pk Qw$EFQG+id@KIdwn=NImWL\j9G?=Wu$X4W<9:T?@/&&dH$qdtLC*ul4b<wHy6PR>T9aMRhiPjkDBC@4d
C&C4!T :IuKN=K?e%$pw\e!c:hMmayC1J=?FwK\d*@S@I6S\/K18R+>GdFZe//iWm99>yRW^P8<!SWlcRWRiXm:
8b11nF P%AB=>jcnJI*?#pMyJnJStkE?hHuTMy4y\F8u+teCBBYG\Z=DF=/>YCVYGQ\+8H?P%=jY?V95Pdd4LyI
MKi?MH Jt=a889tNtJRDS?9P#1^Ah*cy+b\whnBYd%TtNbPGbpTn/#:5YZ^dAiG%+ahunC4@ADdKFFa/NaC9/8E
-A^Q5n 000f9612433001202b3 Page 394 of binaries1.zip
icX1L& <M:1?6huEc\lt1y@?^+uulpL=/C8>iL9!*9thbT#q/H#SA1p66lpy>NJw4?hD\yI@bH/wl\qDD\B=:Eh
iQ*ie! &kmJTA91hebkl^/K%45LPwG5/wuSG=S>IRdWduFWe><T^A+#&wY&yW@$tjmQpe9XaLdT%l4I\RKEJ4p9
k@nC+J EL6\ek!cHa1j4>aW<t+c^R%Ewy></qLD4dT>T9V&H5S5qEb@<d%e?SFI@+=\P46ib*BmB?Kp#qR6%!68
CV4RPX PQCy&lMk%t#!mS/jhbn$BQC#9*<1lEX<SqjqmqDSiYRw/!yB=EyZX:E<EdknB+bbL4Lbp6udV?EF<up6
tTGSJ^ lGh^+nWuBMcCdT?EwnBm*GY>RdbG6Xcl9VV:EAT+H#jTA/knFw+$^V%1S?H!q/tGQT#AK$=:uI+HCnyR
DZaZAq BIc5:y\<*BhFV!R\:#d8c>wGkNjV%>qPIAG!5*=Il*Z&dmwJmn6yI?n+W%h%iqNFL+Y&bnkS1du<CQ5p
8uX:Hq DEYp1dHE1C\Wp1$dVXK#HedE1H*#=Fn%wu*+PHeh=5@6AjR&LJVwnFIeS#Bq?RT#%##wbt?GkQy!e&#p
tSTAaD =b4*eWjkVA&Al#P/!I/BD4AwhWHlG*G<L1<RV4&?apaV!9hZD?ky$X89G+u4PiibiZG\WyANJ1hhApau
L=5Iyy L/5yYDIEDYeK8%KHcm&GmV59MRaZbcF*t*6l:&GpeD+M$&y=%&d^p?hA@&55MP<JAni\+9/X&1J8AM8w
@hCG4J ZmbtJ$IH=:hSQn?nDW+4?k6lK$Np<\!X1&54F@BBjY8QCmtI%Vq>Y$j#c6mcb&P>/141L&wjP9Anp%Bm
$bcb9W &1hqP@p6!/C!KMVI:ZP:i$1%l!el&bW!W\H6q$:PZY9n&c%RGN5j>Sh6D\^R&c9%wF#G=e59MAQJRqIi
E8Vkmw VnK>#G%EydeVq/86JI=+KDF1AtKFw6n/:PXl<W1:Zi$INCNRQ/Dte>Q:=LnL@mhI#Gwdu@:W?eC^HYYK
mepA6N dCKMChEXw>A&QLaZnu\JLYIN/MuLZCY<Rm^DtWwWLRLI@A?cpLF:BCE56q+qhBW@p>:ZQG:IaICHw#%N
IebySG mLNbYcJ@QpFCuTB15\pB5h18&5Nnt&/jpN9XLI*FnjCkdpj/qqj!IR+DtCXhT1=SJY:WiGSSa!yn!Riw
YQmy>X ?@9p^5XpyPPTAGJjm\&cPEIjCT>^y@l1Rt9*I+YNHFE?#EdW5%y*KTNLICwdC<d?tllw?cJQ+lewt<%e
qpq%cK AXay@iND1@HGRyI!I!uG*w5=pDCGw%#w$y#!ektlMakp5S?G9aAJ@QI*5I8lh=mLAPcZSi8t6>dt<n>t
AImGQj Rpk8N8pM5Swy$/eenMWME@PN*hLHJlik/6?ISWu=j:mkmL6SX=Y&kNPe9cT$GNE/H!bSVjpP!J=y1:ky
\HY@K$ +6u:j6j=i^Fy=b&9K<c^V$@VnT11N<X?\P5M!K:CGhPq56=yuJl/WG@&YkpM9KT9#D/$J:%5t*1DN*PI
9ymSb? wac/h<l^JBLcEy1>p9@^RmlRX@nTeXP5N5\I1?F=MqD\/%Rqu@B%V#REkKQM>hNktuDeRbNNGW$==B/9
QqMA%I b&wRt=aCFlaiHkL>kCQp*:+PRPM/JXMap%GC\i9Syak!/d+dqa%dTE>\^tL!Il4G!yL&8=d*4PJQ8Ikc
F\*8JD k^BEHJJYJ84QqQa::8WiR9RHYp$^@&!=@N8lpF4j+$S>6B#SYw5V>b9Ai+KR$*la#pM^cR8M/FI?9R^a
>il\Hw >BYn&BI&<en>KSVPC!cnZ6!%RlBnScELAZ*#TupSRdqT*GN89VAttDbH!#QNqD4C5Dpb#jSktqCc=HV+
Wi5XYV \@9#%y8p55SLe=@/@CEIwFQEERK$j@:$4\Xa=ywLG8XHq*^/@^bSnR:*S=cnPkXNt&ZEnRDK1b\WZn+h
b!W&t/ KPL:I$9Jp5XayFJZ5GpQRN/EwHtaNK6*WBq:VktPE<9eGDBS@mpbm!JkEMSLG@nKEqlnqJBwBE/WABNE
G*>h@h <B6tD!y5#:BJt#w?wHEZhQGJ8KIc^W4l5\mtyaa/%E:^KX5bMS*Yb+N!T4XYd1qWyHT%/8:p1\p!cM%4
FVVG^9 \44q/8lGX^qy#S@n*tLm@DITkDkjchi&+8Au4EX@%t/m%^+Y8d!^BJc>my>jK4R#MtaeknS/DDi96TEJ
mZM$Hi ID&l9T!T:9K?C1w>nIRV&e15Bl@LeFEmZPSIm/%pKm^p:NjF$m/pnTjAhcJ4tRlR*<APEVB6R+:>bE/*
qLQJ!e >n<uLB@+C4Dkmym#qjq1w9C%Bq#jQVJR!P$5y\6ka^u!<H\?1/TDDTB!m!kbXRhwypMule4FL8GWjTm:
<XVuiI HcqK99!cN1wE\F5n+me#weTke&WPBu\9iP&KC<u1Ylj1%ZDLc8kpGetK*=MXS9#t*m>AqNwEj+6E<Y$l
iA8=*/ &y*T4$:TqP\nyW5Aw?!1F<Y^j^neqGcBAtD:9%9%SFH#8&Y+$PXGDqjbT=Dhdl/L1aQ=MPu<:nP1G!AZ
KHtt1= G?=FkW<t68\uqC6l/CcVCQ$PCC+E@41m=eLXc&MmkR4Du*+!CwllnScCK^&I\HMwtl*auApA^q&9CQ8w
>puF6Y MIHZ>mQ=AEDE+Y8bICMIIFpD=8pA5F&c5h<k@R</%=nA%4dpPk4TaJKq#6$hAqFZatl+4#EjGd4&QmLb
PRwZ>d m<@!n&44qPFeBY%Hl>S&<\E\em%B=KpN$lnZK@/YMLTB*Ie?dV69!t&FMtik6lQ4caJm8ILN\\i<V/Dq
5SliBa &$*/E/TjukKAZ>T=bknS9dIS8?QFBQSVNLS&Pb!#XcDMS6JZChkMCC$N&ykm/uiXwAVqC&=SYyGCwZe!
5%$J^H ctSqw+WiN=KT9AXG:=V<H69H+$Q%M+hK/eN6/5nT>MyGtJpGak?8CLER/j^yQ&MMAPNwEqYulLB:c9cY
@1y\cY 5BSh9qLNKN6*MNq11pAK5QJlXD6Ijytphkp5+@&yA\EADcBd:6plwqJtScJ85FFLXt5quVaBPRdq?R^R
XZedS< 8\wPdJLRKXKmJ>m9A%?p\#waeG=/lNKu@I&=eMI+lk5A&b&T\tDllM6?NwmRhW4#BiW>Kd%99M::RN9R
8yEn5S 6kB%E:4S@=4YJmknDL4HdRlqd/<TBKjV/I#P<8b!a+cHWMQHuKnnqGaqj5wkeJ\$?X5$=i+/aSV+b\Lp
F?hu<$ k5AF<K65>Nd8MSd^/eCTQ&\^Deqmk\\R#Gek^<kIImDmd$e\5mVVc/XWc^Bu4WhelSl?D+:F&i#ZFdE/
jeS4y* lhpC+XI/S8Xe4q#Qj*%EZLWGACCAq>dW#C<D91**=8:/BeSyl9/pla5GH<qu$^NP$YAc\bC6VceAM%kQ
ApwdcD VEV+G9ZmHZ^4$9&V6ujH9$D*TTHVaVAGGudTT!k*L&iER^1*TlamS4dpJlVY!tn1@Lb*!^pX\AdHqu/I
4aF/AL BNjb^ne5L<&Wb1j\cbtT/TSBj=caG19I%wQ$R!AZ1nB$X%l?+JYV8Vw!KLwSj#>:iVp>5aISjq#&yH#J
QYyCVj EFRb\6mJ@K$%@iqL%dLT1Y?#eQ$kcAwHTm!DS#?@pj^a&L<P/md9Dj6k$t>*uY/Q@L*mSIGAqXuiR^dY
K+tbw9 +wB4BX%!64V/XJmQ?<WiCBL*SNAaC@cZCpwNwXR><aRPdQbB8ewWYyw6bK5J=PGInm^NPV!AGCHpeyj9
yi1d<& LwaGDyW:MWT=d=GNP8IFAC1nC*85BkE^j\#e$dlepE%Bq6yC1IK#6T/QHuXYB>ueXu?P^IXe!l+RYueS
\IGP4X PN4qPLW/G4y<KYF=B*K9We>htWm+&<Y4MSLi$TuIqmBR!\XelykhGYD5AG%MjuV@a$1?kE>$Di=lQt^E
ZEKYW< #?TdRGCBmA+ZiL\Zlc:Hb&>J*1F&dIG5&ddn58ecaMJSTw$SWPG8ZJlWl1nnBEP+wZ?XC9nti*yD#jql
5Pu!MS H+ZZJqE+W+E!TqD1JDT$ldGJ\5WI@qIw9^?Ep\ySNC?JiD>wQP!WZXB=+C1CE:kLyh9I6SDL>AZ:JJy!
K%YEQh T&S6MySQ\+*pt!!cHt!\Km>4+LMT>yVtCGu^$9M9Jk:9A+Bajq!Fw@@5JEuEL>+QCL4kkEDAnae9/RJ<
\@wLBa k=9tyQL?+E^\>BttF<u=lym=y1Q>w##j+iaE:F!6Eim&K=$1KK?tmatFD&L?8hSlA8<u@Eu!qT!6lkIa
/?GSmM IqAIbD5mXZyI:u4BMcWEXdcZGCcylX\=Hc!%tIh8#AAA%@L56SYiX&4w88CaudkSJ$AFC>md^c^X@PpA
p&!MhQ pT4H4n>d\mha8GXwK9Za6h#KA^R?9ELC>m%9nKm%:nttEkyW66DF=XBeWC!MytKJX9T6lW^a<%plkj$4
<My5j* ?AAV&H^mb?tknB+lpXFEm^GmV:HTPQTJ5G@k<LlQn>jPqyG$:nJJV+yRNR4T65IFiY4$TD:@=:qTY$H*
aj@b&a Y6k@eiEw#4%GF<qCFl\XY#=GE9ZuTFAMEEkyy/<XbK?Te6l<an^$DGudkTtj&D4cR<=M>kTjmJ5:+1Hb
\Bl&*a HyLtC+*ZKH/EqpPd9EEqHbK@AYBum:uLFCiJTNh5FJ*RHJ^YZ8wA5AI!cGNTuK&A9XXEy\6\ETDPGB!L
X6t8Q5 LY<pRG5#L!=+TpadV\HdYV&al<I%5Di4Ei1jRtXbawDE#$iIF:RR@CIEh^8T5%WIWMCqJDAw<$@=<86E
ujb>&n Y#145<5p!%^qK==&AVwK%1F&T+p&TIdYcK%AbQeikwIJ5+&FjZtRV%wkY^MCNQ%iJ9H9P$\?49Jcqj1a
mbkWy8 RMC^GV&XYhX9t+CC>ZMAVc:GP@pJRee*/PBbaV?t9GP>eCG9@Qjh<i^dKePmZN>hSw8nPuDKT>qC6w*#
<86mn? GAmui:4ZCmZVqQJFCD@dGn1^EbG>WW#FTu>QG6EF9lk4bY&$m:59YK>9QS4Q%<?hHhPEeM*^QjcAMqI+
!9eLZ> bkmdRMKYiMnGYKlIR>wj#e>&EdFe?Q^XAp/KeApKKVktpThhyj5?$tKDbReG!$nl^BYIJbQ!CZi+\SNb
XLE@&N NtYHTk?!kD@8TbIc?TDw>HPq^8Jnn<TGwZJetPTD4t\lmH@qZkZ%I#CBQMVC\^h=5Qn%My\SdKQ%Xb<G
##BGA: a/w6k6$=D\kS=*tX*:@W$LP!?kG\qIFe$Ba1X@w8TY=au^T=bIy9EMK<#\5YBSBTDJ!^YaJKk?FmaETE
qk4DiT cLwEKEYKYAkleVQMWl?GmpiTeEEF9\BmD8#\w$9um$Nm*%JPTkh?%<+p5uAMBhBmkQWqCE=/Ea56dp\S
*V1mS? L:pPe!IEjB1!\=cQ8\ijRCeed:?dinX1$WlVumTjMI:Pj%KiW!Gn+!D<u<LTDSKY$/jh8!EjAjtQVBek
TmjwGt VX#5Wq%4%ceE+LJXAlIVpS*Jy*Kq&*pTGdhT1\VTa@uw/F8alt>9hwqbB%w/ZTRq&WFZdbKqTY9wSeT9
j=n$IM edMpAM\u\jQXZ@L9jiF$muC4FQE//^kd^WS9CP?wwMj98bI1#TcA5tWRkCRp+wVd9wF<ZMnTF!uJHYd!
bPX*pm yEY?iSD\Y>MdCi<9APk%kt\9aI\PZ!BJ:YeSyFZCJX9?BEh+:4$/#ldkiHc+1y>+jY*p:%X%Mn>EuSV^
@>Mkq$ +h!mEm4^<SX*FL/8LT>8@IbE5ceZ/Dh^KEHVFSFnqSmqB=JeBH^Q&AKmjI\8=lmIP=#yM1!\NAnTeBFb
bZZmP< XCbt=?TpE#=F%+Nn?kl=H1RS$ay1q%/^ANuZBKyWecpcnBan8wEQ*B\I:ZAHJ>>6wZal464hK6$wk%/C
Wl>@^* R?%%=jpd6?na6RKAES?EZqCSmVcw%9=5AKyjE>\1l!Wu9WGIq&i$e^aYL%5&MM*FwDMK/QDt5/y/J+BN
pd#m?i ?n58Q:tqR5u6SGJtyk!@FdLXL%1+=9aVmS$EDIy>1h\%LcVQ5+Gk*5>1n\>4<P/<iH4LKCQte<QDqc>8
?YMm<D B@kcDAMG1<\Gdbcp#c614&XJy$GChZ#dA&#Q+wWWYk&mwnK58N/QejD!l>+JNb*blD^y+Z5qmy/b1H@Y
-AT><h 00015611bf3001202b3 Page 395 of binaries1.zip
YMK8W+ bc=8^YWdJ@eV9LPLWM4%TJaG&*ue6Ten4V4d44nn/=$n=tMD:?6G>ZVD#81&H6^>@Yh!&!:$8aWLLId!
^c$4/L lQIFwLhu+%aYlHFjtA4nnI@$:>K#CHp@bcP*QjNDY>AcPVC$^!=yq:ZXYP:YJnD:Sq1%FZji%tlI\Aa$
V!KYdS 4>!TH$InZ**bYBY5VX$+Bb68PGyw@e*ZBK?^#!/+6b%^DV!TjeYkWDIJed:9*ZLj^NQ<?uk+AdV=y?!6
84BR68 m>wmGw/thh8X6ky/mmmpcGZ&iuSEtb9JPWbF#18&\Y5Jd<?*9P#YlpZle8#QyDZSEcK5NXMMdhSCm5?q
=KBK5/ >VaH<$VydjYmZWKFN&B!=Q+Meki\>CG<p*4Ll4B#$N1kmR?Y=pDMBGQ%SYj>J\*iuL\8q56SPj&>SDQl
B@>6b> W5iHJyR1#1VT@\/m8nbeucejCe@HSI=j+Y%G/>X>*&y6J8#J>l^WZCtypdD5K>Kt:@yW^\nML:4aJ&J4
ib&&AM k>H+L$G!!N$Due:kmwSHb@MiDt&lj\1\?HDNAS^Vlc+F#RSV5c$:w^Z4X:TKXWiNk6YRPc5T!HILhI>5
*?yVnc W=^MWdEa8/8e=y+ND^q:4cpML8&4AhK=B:bPC<d<AiVGB5?cl%uJ^#Nm^/=E$QXa5#W4KqZbG<QM#LjS
bwIaEZ %#*8K5*i849^6G!ndHcj*54XE=Y?RWciq@L6>aJP?hwmVuZuE!6Y9>t@?mX4:bphqdPKJhFq=Kaq6adp
@5Tjwh u\M>4%iaZNK&GRuh/\?APRj#D#+%Q%k65yw\*/y8%wGw4ynu+9Ni:$jy:P5cXVq=HXDXlm@u\@dqknZ?
a^h9SH ::@\%GeFbZ+w=ywtY<N=E6jF+QpXe*>Nqanl&t^DtdF4DZL+hji#585+an+:P^jt#q%yJN&D%I@eYk6h
8XQ$5C PT!6WDZ<DMpQ#Y>\MN/%wteZZ:p<<hBL/qnyiBZDGEG9CQ1+b<RhbQ%nERLV:>E@Gue=c\h/j6#bYuh?
9ppuF# ^kRkC6jR>=JW:*b?:^#$t?m5uP$?I6N46!>j8AVuh6SALu?GDM8W4DW+K/D8EkClZqYuqGbXM8LICM=d
ZQ6tlF RQkcWR+aIeCiSJ^wjuMN5+pp#ppCKPEl>Jkb%PPPDEH?nNcqYknypcBb@Xqe9JAhdnd<@1bb>dnl\Yk:
5bQ@pk KP#nC9NYl9:P^i+Jk<awHYlduJdVJiIw/p?*J>ZlSw49a+PqbtWlZCyR6^e4Y!J4M@4LaPBt:=H?T*l8
W6X&yZ aC<A=MHB1m?p>ZQtJ>li9^mwCb8BK!<pmpCLpPXGGNCb<Ye6\YnpuA+EbPj8:1u&WPI$+EP9ZcwFB5/Z
NJhb\n y:EwIW6Q8M9bW9KNGDJdnDBmn\P<94w5u9*BQ!h!+il<GaV=t4:H&hpWtl?PBPM$6Acp=yt>y*Tb+G*<
yIbYP> bDKE&jH:jcKKLV?5C^ZZQWRwbu\kY6/awNJw\mB%R>Z:/dnASju9qWJBN4Y5aI:6e=qN?SFemI**>@Rm
F!:jQE DH/*X%N&a\XLuplBCkNSJ#iX<m@lY8$kt4\q=<6KV@Ve@Dc68tVdJ?<l6h18S*j<@W%#>H$C<Xmk:e:<
l=*B8K icQHKAD%TdBQ\Dc#mJw?aEC&w@MBtBwA&GAbKAn%lVlEPdqEqlP6^E?I\RPMQHy9VjI6!DYQ1IAjSIq*
SCaKLy luYP6GYW=p65uS/9YX\hX>t#mLq%dVh\YSEX#QXVH&knc@JCDRDkI/CaMcy/n#IcZ61nS=:PHJ+AmMmB
IuAe<A bRC=Hu%^1FLn&yJ:>nECt%>L6YMAj1apaB8/%=<m#V?QuC9dA6X!XRNwQASyeeMPeM^<Iy6pAZQh4JH=
qDJ@\4 PiRXCdi>q*Tpy1RF1XRJMe@mQBMC56TE>I&>4+kBRG*%EaG1X=8S+aMt\uTE@XX1V?dVAEc%8WV?l:+A
RNDREl 5%P6=+^uE^Zd=aE/wlGGmStiPG:>lHbRQ>1eHnB^AV*<!Zmu:aV85HIm8=WP+^ec8DCIb+u?Kj:aul5A
A:WW*I KH6qNEe6\m=KKeNn!+C/<K9\jDw56>S#CJblK\=yKpmiD5kuXi>R>hCMSD$K@VR^APM^5FLmJuYXbPc\
@N9%ty +nFi@QEcci+CHFDM%u/\DB1:d^TwW%D<DYTHit5E=5P%1Dt!dJnGQuY#y*Y#t1u$D*A5eYMVdVDAj/un
c^SYCn em66C+c=&SuKe6THNGiK6Bd$!5hT6RY9uec%mk4Hy1Mk!y/^CncC/u^ZMuGLh1V<e95h5?XStu<QX<9p
#uK=6P :X1CK*:G*J5Bt1DhV*>=1S=>/e^^l8YYEbTnP5Qd1X#?IyIB^GmL9<X4VTAIqa&nlBD1Q1**cd6m#Fc$
MqHTqa K<*^Y1edDbA!^&k$B@euRc=#JqwDQck&Auq9=@\btk#i@NR4lA*Hn9k*A8p#y=!LGSwnPEiW?Zh@$GjQ
lJPAh? GRD<qFZpDZpGQnbV59DwYXb1bd?q%bD5El\kbkwFEAR\>kwP:Xp4#R@5aT1=tDd=\i4c4k#taKiLae>X
R::@na l=cD!GIPaQ!t<endw6Rw^yk4@IH*V5l:qjj>d<hVFZ%qj/:5CkMEpeh*H6/L8=%ASyd1R\&H&XYLHQQ^
<ciAm& ^jBIcTBb?<ZHE=HKA/aMe>wd95qn%lnWD@TPL5<Z1<FSu9wRI^1jh6\>RNPF^D%cdjcnL*a+*#$Y15Gi
CuY^Kw Q>!pZ>+VuGciG%=ny/in>jc66#^8*V9n?YY#QY@ARdp4SLAAIp8#VTH#GlI>kuekmcVn@>4&jebtNHJ!
^pIw5I =E:qT848K?&^w>k1bFu&piw*yN?:@IRyWdpVy6L4Lq:q+M/nY5YGiwXB#!uP=qcHm:lK?\HqAe#eDHh*
PHdN%% *RhCwGyij/l&1+!h@kC/YAe46<*mA%hq:/$mZn!yQ\Vu=1w4q@b4AN^+SP$%S!FEE\+T6cyt^=!SQVik
bBAMbJ G9PJNcuZGIL4>aqte1\%!XybC+m+$JBe8?8yXmyuR&CddpYeGbiq#*Di:L@6*iB^NS=HB&R9y5Et=Tp\
!IRB5N *l^1aA/%uI%t8k:N?!NXcP$Z8*+ZiuD?B:J<AmVLuep9Z>a+jDJL@bVYnNQR6Yp=4lXBR9LNEc1^nTTI
?kylRM JwqKGG%*N%jlTYYt5L^@lFmn\YaW^EBV@kEB5nSJF$\G95AXWu%FGa:@AV6\/Rmjy5*\JyKQc#QD+e1*
CGZ&6@ cmwIi4bQM:&?/ZkZKkT#q8eN+iI%45TBKyWt5%AjMECT8@VIDu4p:!c<dVnp=tLB6B:VC<j9$\FL<I^e
B+6=\F 59!G#5$9yMDWZ@N!<HY#6jJ^Bm@dY>+TT/Kl8TtdKc+w^dDJSHM5#eF/FwMnHReEG/CK^:1Rb1D6bB4V
T^aJ1i HPB@%!dQ1bMlhw#8**9CqQVhRQ=YZdtk4@RtK*JB$lT>4j1VX1kbi#NISt#t5jNy+mp\*AnIE/a=/@GZ
!V6?J: uq5Gj^p<cKBWYZR$t!6R%kMtAJmLW#C\@Cu<LGCpalDqcRn!DV*FDLH*>$@PcNW^yEM\AGTwT!^V=k#k
y#whc: yIu?b*bc%w$RLk\AC\u<clQ8V&M?A\y?^#Li+lX$CHBNuj^+?RidaDBenahQW+baad*MqLuG9#jImDhl
\imc:E *58>wM>MYY1pkJq!qY+1qyH#epnLFn%tG*REwW6?bjd$W^kjD:d/a9u#GC+jm9iGD@nCMdy/m4kwQtDM
p>cb?I dhenI#VAM4K<^ICbt6%^&emm&XZ4CmKRm%a=8K?Qy\!MI5pjBBADlMLI=PRQ6dunPtRy$9peb*dGY9t:
/l$aXZ !pwn<J+bC%kEXdAYF+dy+98S6*H5>^JHd^N+F:KqBRTlAeA6ZmQ1kTJ4jXS=MH+Lh6cZ!HSG1lBj?BQc
m9d^?j <8QP#=^#!DDR/1\y<#H$9a?S9#8TG&t6ck+G9t5M1>/q8ePb@YkXQ$dbynG\*Ft4$EbJJjDM#iS1tmeR
T:5E5k PyStAl?CAC6BSS^BpA*n>&EGWJwMA!mn&ulkB5>I%y/hWl>AaStZwPA/tGWHVyql4?^Vj@eDGh8KqDj+
wXAP<I #HP%u+\:SAb4KbLXb4QDTC?Jtn?jD1mMy%kwSd\y4a9EFXw4#eu!:YaF?iluH#D!FN$uXyTBdYwM1VPy
ydPkGn D/GbVXc+BN%PJ4$1<NIiN^9R$%cP@mVHPc6!Ei8AmwFmtNXSbN1&6ydtkZRdbPZ6TJAcCqcde9&uY5aM
\MeJup RqhR<eiw@JTnce:\h\l5*bRyyWPhWR\VTIt<TLmmASVRmaLn/1SCFHNSm<8+dN/t\*>5L@eF*#@:ZN\I
KYhd/A pMi6b#M<Yt&kpRjh8bSLJHhV:n?/e\ccDG9H&8bkSkQGyy4e858DWGP5K4NYbt>i^/upytn^dQEM6Iu!
<akqbW BqJqw1i1Ju?\I/n\&MEb>W<=\>4bl@\SkYuNh@dWR<&IANML#@BGkE*/A#ME$lhhjniP1!I!XM/99$Qd
9yGqVL :JaBjt18b/^?u#G9q<#I$&@N56DXw&cMGEP!LmwmDc*TM*=jAFHmhiV1qJGNQ6%KQe1lTFW%DLVB<1ZR
*LFjRq AXhRNae/dd=DcADu%^::Q<n:$/kt$9=9>K*KVElCCCEECFAJ<^#tMImXMIW=nCICXylBRESRyNY8lBpS
bFP$G* RXF^:ARRWXFSWZH5BBFS$RbHSF5Dw8KMM>1&jd#QPZ896j@Q@V@Q9b>>>y6#*8ZN4>bXhe%4bZ&?GAIq
pR>T^/ ?**#=uF!?&:n\ES4SjuD!m8a1ZIm5l&98eEceAW*4k6WMZDHw:nKDLb?t1NTaLR=t/9EpSRpW\nCIb@^
n=8A?E WL!l$5qWi5lE>SEujcYLm9h!X:PX@niAP1&C<=dHYG/V%wt5Wkll&d:#I&6G<jC^u&PAD#XTRBJD86bW
^Q:455 >RbWu#hhF>WEFF*E?JkAc%I^BCynZ@4nM@4!uS+DFdkAV%6XlBc$Gm<4weHJ?J8*#PGQ&F1YPheHe!\P
>CPTZ: \XTRyE<V*Kh/m*%YVi%pw%n4y:h>iK+pXT9#<Xb^/eS4e*myjCe4p\eij?1k14BG?\kS/ibRIPPt/V?V
Vd/6DF AP%tIlEhhV!&HbJGA\t=ANnAX5AGVpjyKEAE@HhPM5<k^hy\MV6>I>c??\c\Rq9c/AYpb5y>DKSq4lid
848Kb+ YC<jkF^#e$SDA\X+bS%u!yR^KTKy6+PhVu4eKuc$j\ZTm/%8yQNVI#9YG4d9%li6%aNQM<AdNCELd@*N
9IS!S4 iHI:AJntw=u$V?N?Il>>k+tpC?h6%Y5!95S!FYRRtp:TBJeL+tLZLc8eX8mDy/PALS^i8a:GPIdu!qR8
e#&l8J <Tmci+5i$lcIIWY/:d6+AB^uVI/d15YGWu?KkpBC/pDN*:#?YC*G^+Yk*TX#lKXc6qD=EH6>!9n\h!\+
i>GG6y VypWMGZjtY<G>YLY4?DC%C*jSGw5yw$qaDVbZp1wEjq4!#!J/>MJp?dqCdbXQN>I/nSB9y9&FY9Z:p1E
+^^1Vw Gi!MLcaHM#at%Zq<KLK>=YMPE%n6QX4CbFAt^+Imk<kTkNLD8tkjnFmbGYVWwaj\w\hYmZCG<6*=AEDV
qtm6Le 8P51X1+4G:hYB8w?Lnc:$ti6Ct4e:/@9+JK$!48ab<TRDT+&Q&LHu9NXHPJ<ilBk/MqX8B6kjA\%iiu*
uA+Q>b 86#^jAyFSZ5^bK6c96MA\<m>bTu91%&a//EJ66Ye6Wb*p!d:YckE??V/GtD?CpYcPTTt>n6Zaj#Jp@aF
+HT^VG tCSn?Y<%T9hu$I1>*8@K\F85>Q6bV+P^umYmnlI>=cC6=5+ctpt%!JYBYkFhJ+mYF#5CuPkI\%CY1I@e
@I6Z=W MFCQ5#SL<Hhle&+WF9@RED:Z6ayqLm6eMyYM+jZkFp+>B19pwmS>$cd>tE:<VMYVdZ*tl%>qlFSyKR@5
m*:\\D MlVkDJeF1i@6WnE!Si:Y$kIK<y&tQ?uD1!Ai@tmyGD&Zdht89>&E%&P&d6bEW$DtXq\4&6RmE8mmhu4h
FY*/qn 8=b5N?I14Z*pI&R$Rp6+XHj!9h=RlduTy+luyC$$n#I&Ej*5q@LlauZpWamBi#!9Sby?T6G8D!PGTGlp
-A4c*Q 000f1b8c0bd001202b3 Page 396 of binaries1.zip
W&dVB4 FW!EGKd!SS$?Le5SRF9+nT^d9n%pqQR!nc9$I&V?*n*qw?l46yV^:XT98MwXG9WNyp\M9ppCwFZYu@&J
pL//iu 54N*y8:QC@A*=Z?H%L/?9N%aVAXPPp^Tp$#X4^nTCmLCAahVA8B!a&:1ute:i8>9VZN6#pdc>CEj&w9%
Ab5XcV yqJd@ST\L>&I6H+cu>=nkqt4yeFycW\bW5DA\lR9G>hYTW!=QpV84IG1Ll\Yk>\/!@c5@a>SAM+GbXyD
Pp&Sqc <B8tKykNt%=+\6i=@e1e1/JY>Pe<*Zy1IM!p96^Y6Y<Hq/W96cEBXS#%5IHcW%hl5u^SnduWkkGFPR+c
RE!mIq =Rp&XMpiBYN/CJkK&8Su=5?nm@J9T/YXAhKbhj&G\e>GHl>NiqKySkH!=IKD%p$aNM^5%c6u\8tY5&>n
MK1pBK T>=R!5YMh#h5%dC=MN=E>awMhhG=@t#p?*yyIy%!A$DQp6R:>VL/&RDndHW*$jH\!Y%YALD:>$WYY5JP
V5qYDB E+BuImXRnmWT<Q4B$nP&1TR>cL/4?mGK&W&J@5:mnqNBC:L1+KcFhRDIALu5hHW<MRMl6nW>*<Y\W&ii
%T>@la j@?G%HclL=FBu=8FNH<J:kicR?h%Z>N@lh9$mIeAIEWdYhc#EnHZ:Ncij1EnQ>RCaEk\la$Et/kwGECM
Vya594 =^=!/6^NbN#SmT@*XSViQw!#*LdR?W\FX%F/Q#8dwi:DT$ZakBQuH@@eF&!>VWkA+I4>^996=@*eM&/a
8PjWi% $\QwJlp>=6%9Z%N\5EJ9+*udJ::VkVB=Mq>L88+Bl1cZXkIAR\^V!c@eWcL\D8=>/DMjFAAP>q*++wdy
F#D61w ah\j$pWchSWIS?%QkD\Ny5@VZJ:?&hbKnVeQ<Di@nVHCtN1Xc$+Ap+h$<$?RC@BQTtVm$Y+LSa&S/QCB
^<Q*h4 Na>*V:1cKAc@mJJ6Mc9Bd%8YlBjdQ6u&9N&XAQKwT#>4C:*iKRA>=Nqc+phh>ceX=@@i!Vw4WuRe=?*c
V5lMj& YVGPAS@1ZQmq#JBJqI%mtk6&6&u6tni5A%$GRn=1Tje&RRAk:j%+@5Wc::69Md1Jwl:C$9uQFbk$XC=R
>yXJjn a9/!5i$M?I^l%Nmy4Nd<bkiAbFQ>De<$jRTF!aPK^H!lK&&T?#EH^@%6*1&*^>>leHRp#PFK>P+=tASH
Y:ebc@ jyWuE/GEa6P^@9VXPlAd$pImcF4+T9mK#MK\MeIMCFD^=%4D#QWckyR9=DjQi=5$5V1YQhYKyS!*9@ka
y*h$<4 IQYpL&ABt>i@lS\1<nl\C*Eb!6k9uQhd>LNLeA4uC:*%T9j:<b$JK:=qn%49NR\<8mtl$Twe#l+l/?A6
da?>@+ h<*e&J+RqSw&H<yudeP?y>XFnGh6<c*1B=LE%w=Bi+=j*%4TtdVQ\i1ZF&i1bb&SL/aeN&=N4G>@/\/k
+Pc#<T WdTLR^w*^8D#94e6Ciq9*%qe&d>p#\b4N4&$98q4I/BD&uje4iYELtJA9%a+#LG+Id&W1j85/e!mm/Q*
\j!?Y^ \1ca+mQwRT@**%=Y*95:#HHV8@ij\9X6*GW*<*:LHQdiWY?*l:pyaI5^d8hb<\$4dVLW:#mK6&e8RY@+
+Z+CN> lL@@QpD1QMW9=%>=*9@1WPMXC%&m$%@!JqJGPk%Hq9nS:BuCjhjZdK8ThnFPSw:&i?+\:*m#enN5ut!L
u$JSyb jiicc*6k#+=D@\D+?lhL%we$6<4J<1RIeW$J$FbPCXVXcC^5NQ:k:\Yq>Q:L9Ri8@PmS@uYP6i8b>HVq
Mh+@G: ^mFt=>c/Gy8uNCNdH6H$$u5kP>CWeGT=HnH/Rjd41N^!%!kGtlTJkbDGDm6#eDZ:lu4R<N8lN6eTB@8N
<t\1>G ki@&I^#ik^YYG>*k:BBVdQHV1KB&<\aMKYRX^4lY=>V9</DB?lhVSLu8jmhMN>V1%hTF*KDRu4^1@E5>
*6Yudm QBpQSu@w@Q+lnLG=45+JLlMuED+!<kQqX&d?tW?D*mXqRXZ%b^h8j449KepI:$K$:^ka>Vj%JZW?CS!H
wwCETy AbFpY?&y*uJhWMA!bPPS/=V^BdHY<K:HM&wL+eDAcS#l:5L$8G&Xc/J\t!@BdMk5E^T^Y4>a6KSiN^Cb
unL8$L tqRu#DYp8q>cNFnbM88hHp&BSITmT9R=M@#BAqQZyk%i<&SqX?>+?9+Yq8@6/qi9Ae#Yt%e&=^:cwhR?
&Sb$Aa cpwMYunWW5adH@iyVQh$&Z=?p4WK>&ln:mH\Xj1=9>J:kuyVq&<5<Z/w*:9Z9I<wW*=C:I^Ek1/5y9kH
qBk9@K pYuCA\>Lmdm<jjyJpGd*/ZZXF1TBlTB*&>qE$+w:J:djqhYwD:?<R@9n?9n:*K56Hb$S9ENX/=SYK+*n
WBQj8t S1Pe68GmHbh6=n^h8Y9^D1?mw?SJnKinZ8Z*K=Z$5VAH!5/uiCTEKq6a5?*qL*?hh@$\ZE+KZjiG=LWJ
n!S5PV i4dhIZW>X>FNNlcSZy%%uT?/Nd>m=/*j4u&Jc%SE6Cnt?u#%HY\EP>6lKDt9H6umY1$=#*#dlhWHMR/L
Dy9\M: %:*NijZ^B#\DBXW%P^G=$pt/^MbM*LaAH<B*AXwtmIVmEyNbW#$>nd@?d/mjZn1F*#6Fl>Wj9IuwLV/1
yKp&Eq %AmG=pc6lyw*uPHqQ44$+XXhp=#k8&Z6G/H+a6ci$pB5mRZ&W6I?:jR?/P!WD$$:eH+hedWBjHI?N6%Q
Y:>Y+X *FnXThVG$LaFiDQ\*NFqXiyiR^uebaY8q?%b&b+uH>&?FkCMnXyZiBGVudW5Z>pCw\KL+Lb4kb&quHZT
6**S%l >PGLplNtX%88RyMa>8*9c^yd6ym*dluS9+R\wa=A:$4hCZ&mACBQ^hP1qL&<1wqP<+F8T8$$t%:=ZmHR
D/C:%F LbQI>#cMYu!@5Gc5Jq1ZZ?ey6wukTA$DKG*^lE4^La\5QliQFB\Vc>bwVVp$ESZ8M%QV\6!u4cqcu9Z5
%^<BWm itRIlPLVePthB1y8EkYw1<A5!\T4&kAA/hb\?ICPi9>jbQZ1Jl*J4$Lb5M@PR!u4/?lyG/eeZnn$BtiE
bYY/u< +S8yA$u^P6k%qkDe4$?Aa6uydHEqh#+bJWXVTkStG^XyXKEaIAjec5K@5%kH1nKWZY$X6a<QM*KQuimP
/CN1+k a:RdRKe^AjS1M\wpAFwwXwHhna\LEkc^lSY1ItGC1wy%#$wC&Ra?Cia!qGwujGG=KP?L>4MZ>Tnhqjl\
:iVS6K t+/86E>QNyq4YcMJhy!G\V1i\Pw1lDXVK#AA9h\$4Nqyy:I^MtHWu+Rj*hH6YpKM1NkRdFc?RJ8u6dP/
?j?Tly ?DQnI9DTWFmZ5??GE+kN6M\:RQ&Bk^BASdIqm5bNmZ8hIJq&B^Yn+QV9#j?4+QL>:yYpiwJp9yWK&Lp/
=RM!W* w<%DJ8\!+ec5J^&me?y=e#y1%aDF%KA:AQ&Y4LVqc5N@+q6WmJZ//59?Ij=<\n5Hd:k6u<wW4^6RZX4V
5>#ly6 IMH8mi&6@#tS5Yw%SNnu1F?4?C%^hM?F>m?Mn4V^>bZm<66pib@uB5l+eWS@6I=RX61C^J+cZ8eNTNFF
Z6KG*D GH1JGH9bt1B1NP:5@dZ$DZZy$T?5p!&TJj++@mHVy6ESAB4#9:appNe#dXIJNQAd/uXMIa%k+!@*1tmC
Fqj86: ?T!FSam&EJi^dYRNTdE/<lG!11BuKFa&N>>aVV@Ec>E<aL^>:X%hWdp6k/TDR!whWe?4/=i::^^b6hP9
WQ^Qnw CtXkRPVML9mD+Nkw\L8a5J#:=e8<:jRC\aDaGGh+qSC@PuQ^5lP4d=dGSadPH9Ib1t5&ii+WyZ4668*n
I6Xl&R &4&*X/Vw/*CVub?9&dLy!*%Z@TXLMd%NY$i&jauKH:?E\!XBh>6?STIK%?\>+epa:+R^&IPFB#&Dh>*i
M\iwEE +bd&P8LV<iPJE*j@Yy/%=N#T*lZ#R8:=L5l?@Xj1!bPip^P@4H>R8Q:m/SQZu@%bj4Q<diT#M%=Y5*?i
hG+HjS 8j4L&+PQ#l#bjiQScnJ@/jy@#y%<5@ZjJ+J=C9/DhGW9q@?c48#y@Y@Tqj@qYj*@T:y!?@?9yT9*M*hc
#&a#=< Tu#eH^Pcp+Z8pQVM1^e%*hQHKHaj+pYH><daDjiH^iy=8k<:L9FWHa=a=?q=%QGZ1L6N^%:MM/4tNm+L
=YiNd$ mZ/FLAybQ>cd#KuGI8P*#%DLd*mJJ\8YGZn*XZ6^d4nNDjcFaDPe+\uSGh+lN/:qQ##96G!Q=G=nI%/Q
&yRT1n hjn+eS6tWMKuhhaH1d@a5G5tA<kut>TSHbF^Y?dqLcKY#eXISJNB+b!Fu>eblw\^>Bbu4Gj>&ec/YLq@
N\#D@b %Am99!a!c4$D>Sb#$auC<\ci/@6ily@L=+l=jwjV/?eF9uVjt*8\:Qd96k<d9$94cyc5V4ud>Gw$J!ww
56ajT! PmQNc=y:aLG^L/8^#NH=\C?8u+P*dl1@h966?1PF<:c5$>=bdZB:^tN1m=Y$@5cZDw\l+Y/Z^Cmh5w=w
#qN^NI RBCiZhdw?M%@p=XH*&PH#&ud!yea$dcNL?tcZ5D5Puq5e5>#l@!QAWi&bDp<dV:>VL4D:%4/6:KZ^\/@
jABQew *?Hyp@9&N4j:+Lj&&:dVBZh8uZHiH4Sb?iJ?&4!D8V/jXe!lHjwh64+GZTBjmXHE9/<Bc\#$HNy@MVh!
\@G!FY LF!VqZ9L/G\u?#k*jHF!MBc>eydk%Xp=iN6?W@Ly^*&uH?tZG*ET\t>8E#&Cc::5#bu+@K:mli4LWe8@
$Q1Bk@ H=cpihRdlcS&8I#<p1bV\F!\?/y&%@HZ=GeHtp!j:FtCb^$?!@?&\94l/SpD^bX8D8Md9L>djSdKVq$e
y^%%cA @8MZuXL&qk<Ph?NiB9#1:KD5CaE^8@R/=?H4=?**CJ8qdI^I66?Vc>hN/Glp=/Y<$ViR%@14N4GD+e=Z
yWEI/d 8*9hi16C#atX+ybdGLV^/+nh%8Cc/tBD^w5I:ie^u6y1%IBjqC1T6Vm?HL=:PGi\y*ZVl:1I#^b6H1i:
$$c=eC ibK55y/QX=#w::MZyAnSdQ:hLj%P&:lKj=8LI\daaQ>w65nI@5&8ihXB!WeyDV5Vt^^GPwJ&L*1WbBPn
MwAqPk p^XyKPkeM/:+%BmLX=1n%*nI85Y48<:F:1wpele>:%qc<Pe*<icQh\$i@^NK8kGK5*nu>DH8NJ$u+j/n
Z\l:4A 5hPh$kI*i5\XA!<<L=/!Qd44*DReIEmb96ZtjDR@iN@htbjV+#dq9S/JEjYblk8<!&np!?EHDRuu4Hbe
9p:yPC Y9*WXj8T&/61>amQ>Bk4?@i<:9%56>yXX6=#\:NZDAMGY11h^^/NqAZ?dY:<^tdy9F>=#=Ni*H??a&&e
tX^/WK dj#&$+V%tV+SY?$HXtE1Sj<wiiedm\M@Sn?:59QluM%9@J4EaWK$W#jq=K>^:WGTGpY#\ei@6!q*8ud4
:&5C\+ eidC8:M/qdi@Elci$w4D<i$6tF?WFn#1y9wRe56$B@@KhyQlRCe<X?JlHZ6$q%4lTen4/4w%EFm6iW\N
HdqVbl 5k9i&e5eQE58FlCCAnhjZ$E%lY/6ql=y?8ZAljHWAQjnwjXc5=KpT=k<Tlcli@KbaGZdN\1VplG>EZ@D
?G>1E\ WM?*:da<6t#nl59:@9K%cZ!$@hDDwZ86i%$tnPEF*Z%?I<#e+%JKjX!Wd1K@*cjk9EZ4j85#ey1*JT96
>I\1/y YaW+>^b9SdDQ#Fi4^?IY9jjHjA^CVHjb4cw>WP=JcBN*6%:PZYSu?LeDPb:&hNG%$&E4NJh!?@hMat4^
&BNI*? quiidb*>p^=bpPJ?59Di*k>Py$d8D*Vy<Ycmuq\#8=D%iW>JZ4l66j>m+htnm>Y*j:HZj:>84Q%9bi@^
iYnnbY &Y&>C%ep^P/p*4=*wPbJ!iZjnQcqHAnNQ@nL9VL>#8%>\aXL+=pZCWZC?Nw8=8tdYY6<N*@MI4Cm!D$j
jn5Ml@ ?=L9^jd8PbLDm9nF/6^a!SuuQdLZGTt%1<eG:C=e9Q:Awcjck=i@pC?NDDi9b?&:X?nhYYld88@!!jK^
<d!Y6Y I1jXS^e=dG5p>i#wRlcHFdNPXu?%6I\dWd\+?NC<:9y95X$?1%$@p=?hZZ%Ei&*1>u%bnnqJnlRZET<&
-ATtS/ 0002c96c528001202b3 Page 397 of binaries1.zip
dFFknB wiywXRL9bie1JbyZ6GZQbkl=R/*Ek<XMZu@TulHV%5K4hm<nKn%d:4yuES1Y=dX=Ch+i9Qtl!9IKjcIi
F=d>e+ >@X1<kcZQKpS<uX%Z<d:jXuc\YV*L*<aS1q5^m=&PdDuYX!q5A5y9q/S<1*QD&@iX$tPd4dh<59#4w<9
$k^6I& I&Mt1#!QuKE95d@\WZ#<%c9<!^>VY&+bnFt8*6A:eKZ:YXpY9pjE#I^>iP^hjw9nZ<kH?j1V*YbP^$JJ
NH+&Wc n!5u6q+?9@mP>!V6D=ttl4Qi@9mF4XhHdi>jMNh1/dVITRGalbYy\>1J#BDRbe5:p:?q&$N5uLXDNm>d
<$q&^h e:$@aiPXS/Wum9aSn</8L$?b?GPh*B!8b!#iHu!$iW&iZZZHnkT^iHn%1ikTy^nn91BLa/F:j!tmLqP%
Ji\WSX HHwT5wLu<Ly1a%c4btqc1Fd8hu*9mWp:y!/DV8<9VpZWuIiuM^=56ml1E=/^m9l%iR$X4k^eXib^=hdS
XJPHm^ ZjeH6!IQ*#I%!&imj#8Yhn:nwMGiFRiSnw+QD*&!4@y5iH>\YK$P?a/$Qk8=bnj@bNClV^W4hq:%?LFt
YtM6$4 X&4$w5iLL@&TFl=+bX:1p#9%LL9w4J&uu#a+Yl4+:B#/a?V$5*1R>HSl=e&&L=#=!ctjWuijHI:n=l=d
+k+5#+ !E$<?<TP+1t5CD+a6mTCHj/m\9nhqZ>TV6>1&KtVTndw5upc6!Ek@^C:e*Qb4e\*%nMWbCA6tuj5YZF?
/^<&9J l*5l6aTQ9A1/Nun:I8>P5N&^%:q8&bK=jX6Pbk*RAl!&X:w8L?c=VSe4RnpyFkXL>5+EmWZ^lKH6Epd\
/a:ZJn adLdKC6uV/+aia/QdH#h&FA<I%1ulY\4<E84*u>nNBwV8uP4=W#CLQ<ZQ8*b?pbSEJVYdDi/=K^+XyE!
SbqPGW *db#@\T!:<a@le#c15>*1?68pER*tu&Y&=4iNaiQYJR<GG4cQIK8u8E6K%^EZB@%b<lqT6CN9Mm$V$Pn
\l@Nh! !<IyXa/>=@lFG=+XD/:*/\#/9y=?mVa/\Sh>*NSb<&d9H>Tu*?yt<!6tE#Cn6*Y9nW^5IPjF?B\chLk&
Wt\*@F R*k\E6F@Ti^j!H/%IZ>hbtuTKC>e8?aZj89TQWiV5?*PB?*C#=1R*pc>Q1RtKb+d9HZ@9Qew4VuDRD6=
A#4R@P V&c6Nn&HiJtL*=9h<jL5<5cNj&wiMbyLcdQLnC+RFkjMA%4RN%PQME>H@4RpQ=yh#G#J4=D\Zq%a#LIw
k?*dlN jwM4#u$?iH?&+cFh6Zciu#V@:CtZbM4Ld&+FQ1eQFPehEmXqucXidG1#m%yuQ@*$/TF1XeE/B<<%a@V6
ICYJ*: R=@Vu9R?^SXVT/CZF>?ey++V4yBmZ\/iyc%PNHe/e&RkKY6nMn^?/HLKI@FE$BNBS6hM/5dT+$e>QYd\
K+N#5T BpiL?!k8XnjwpmcGY@4e^%j8Ri@G4%qWPay+y#hayd%>kiV@1d%@T&XWj/%CMjKK6k$9GC#wVb5BHb=&
TJyIW^ wWHDiIi=C\=46>eqWC&cj<5LdHQI@dkuq#ALXXuGtD:tZZb\cNGM@>:?pQJ?cJ&4$\*mI+PDSYuQH%Sy
?XPhm* mh&!nQ=<Pi1YhS*h&>Q&9J8Kh@?/d$91?+uZ61dJQVh6G#X@^It&:?6ipYhm8eu%KZ:G*Zu6Ibjpa@6M
JDQln> 4#@=95P=1T>u&9%!\\wZ#jHLY$1i^Ld6LZ:@^+pVF>!*nR4N%!Hd>lejK^laQNL?wam&+mXCPaBRRqd\
<pPc1q +^4dc9@\6q?C!a4h8?HB?6B#Pt=1@KY#!p&D+nml+MMq6#!qX$Qa4=*J#y9!V\EI+X$!JcV<*FXca5*I
wV1<i\ PS5<=6JASjjP+KwEytm8+tW*VVFCWX$b1HZ!Z&Luq4Mq^b^<Qn5Hj>F$+jQQ==eLA?C%u?EaB&l\:?5@
G6\SZ# ?ZlVjQj=wGhF%E8>!8BQZ1KdAc@YYX5@DQ%k=&ldGhBcuty%JZdkyhk>IJS\dZ=uwAMVR?8Wj?/i/Gwj
#9ulLX uRw8iKD%w54T+T@FlcC>%%G5j6lL8=*S6Nk*tG&/>=!9?!iG@mPWQ/V<MhP9aH4^HK##/*#!t*C+KjQK
SNCFpk F:+B4W+NE@pBh@!\Q<CAVnDklEYq9L8MbD+q<4nRX@N+nwCJy&T/+nWd1S$VJQRlnMNb#YVCA?ZYA\JB
eL<^FS %i*+/S5&GR&C^%WEVJSF=p^A+K6=H*?#u@:5QtPZFqneeNHdTH\dJD=!&LjqX#GuLGM1Jt1IqmBj8*e&
w<BI$\ ET*JiS+9j@*b^9u>\ZcBSeM^:aHjKRVnBbI69XZNh+K:/m+*=Yqta>EqAjDR?kl<JDpmTQGEjj!G=Qdh
Z\%yDi lZH5G&WQ&n9@T5X%!l?QY\VMPXk<*MZ4*5A:dj?&T1waZnS&pad%>CndLLn&y!i66?iJEpqIPZD$uQ+?
kWYw9c 1%:NJi#t$6PFnk5:DFP/ucNW@$*86Bj@@?de/Z<VNj*#*84y>d<eNi*%9:8$@^YG>uL=9^\%ub1&NFAa
K%&$yG uFaMb:uqy!#K!LEJul?a@K?k*IWbZC=Z:G9yut?b/n<@jb=h@LKEp5AmP:/hSaKAJ<!np8e9Z^L9:=\q
QJw+KS nLW#L<\yC4GIV4Ew5:e!l!%naZ/+=%IdY*PuJYqP!hd8Fk=SHuBCip=JuFWWuJFd\9YQ!q51!I&tpuQn
h&4DJ1 FutFS&YHP!^&V!+ymPCY&Ran$R=L+hJq@qdSiXqijudt+y@Qub>5F:neM#5%$u>lyq&Cp&6e1TA8#N58
NZQ:mW JM!KTub!F/jqb#n/L\\wDI+9FT+Y8JXcy9p5K@LLmHT!hT#^uS<c:awEm?%<LC*F99<K\R+LhA:%hWj!
PIkmL8 @ZlJPd\R/#A18TnahdqjuL6=8wih?hJqI99qweE&F9pYaY:tu1Xl1a/^C^JFAXcYaYZ?F9:&dpubm:%#
NjC/*Y q!=JCWu=X^B%keAhTamqpye6#BE6tTeKT+uNqIdpmqKSw8Skn!T9&DIQduBTVHn!a9GmLP8CnDna^:55
RamHi1 #&b=kH$I9I^9+dapcu/GbYB894$%qT#NT%!aG8u1L@Td6<nj*><y81Aw%!+=I%l5:^<Td^h4IjZt=kpC
:iuqX@ 5pWLlX=Le^eF&AWK@Y!#paJETaJDlt5RN!#\=&lQR:kFGWp=m:miQ9dt!XLZ#Cm*k1S<KS!ZXDA9M!%S
k5&E4* /BKaGSBVdB/VN5<!Y9T#b=NeeyLCm!%#Sc/^C^*6+u!w=Im!$HuS@w6ewuN!F4ybmT#<Iu^hjB$m?EW<
<6bV%e :!#dyEL:+wnaaN8!wEByqH%mwZqGW4cXd$l^$PIm/eJpZ4/:d:a:qb\/d&FKikw5ZB1#!Mw:q^eaqn<@
G4pa8Q j+F4bKmDm%9w+4VwnQTM+CAH^D+uPhnLLVKuNG&S1$N^VuD\+wlR1*R@bIFuHJZMh?cYT1\>ZK$KjdJ6
/W+<j# 8CqL$@KYiFnu?1SL=!iFP66/?BYFqBWE8*8=ieXtL@GPZbSw/blYJp*^@>plX6aLM=dQm/iTJWG=kYW?
u6c&kb #8+^k4CEMwq#nyiE^\<9Y8kSG=@wtLBA:JijuSccqI\IjeITq+dd=q5+B\TJHewTImM#5y#FbXK9u?Mm
he5MnY KX\R:t<VtFutbB9mq4DW$e9FPm@MJ##a#TZG!#9cIYHikq^?YImNm*PCc&V/9\K&dc!!p8i:&1iH?Jd/
?k<pB: b5^Q<KiTHd!L*CL5A1%!qp45ZEy#*ES?Sc+JT!NCm6%TW@$mR?i=&*m=PTPyMRq^\dFLLTN=HtESQp6e
k*^?!M *K#CQBb+=<ha=kmybGh8nQjmEG8BXTnmEX41GPQn:8Gc=J#uE^98qY/SdP6t9WAR+PwWH8YbEG<4VE?a
Su>&Lm 6?T@mb4&e9%jW8RFZ9?DIm@\@E<XieG@nb4&?l>^<@>u+@+Qm4#k*\QqZ8:@Ri*Q^jdj%u4<B:X8@#+8
CEwVBZ &59#j%:4<h@EJ*6=@e>4Zh*@9X:9Jjmj%@/*A4&Z>*@!5j=>4K?A@^@Wi9*:Sk6e@wPQ>h>EIA6e@=NP
wRnZtP ?t>1@&5W<j?:<9?VRQ?@^R<:S$EijJj@WcAZ8Q?jF?k>@:%A:@$jCQRCn@?nRP@l=mZ+#\S/Ek/LASFJ
19Q++I E5ehT/pbtPIL1wL6cjWDW?@EI\^j+@yk/d89Fk*lim&Z><VY?!WLVVhj*NQ:jQYhHE=LbJhL@aQaMwjh
CHY5Vm \%q/Z%8@taXkRVZRLHFkW+uatW<?dVCQwXX6l\CP5ieY>!aXJELXVhh!?yILE<>pujl#cZ>K$RLjQWMe
X:y#bm jY*<BVw$uP9JwhXYVwGp8tCCdn&8Hj\ZV1?Q\/i4kL+Wb%KEniGy$whXAJ5THCB+5<SZiDQcdXQE=/=q
qNt98C B*=dp49>wQ?F?Z$QC51M=/&>5?:E*eI9KcTDpq\Qa?4L^:LltSX?yl61L:^VAuISl#/ME>t!t<RaWM64
P>T&#p Wh9*%uBnQc*P>8KQ>Gkd=yL#$Z9999:!ji&9m<<WCBJ6!iu6PD5=BCTTGmkhNVJ<i??l&REhW1@D!TcG
qK9dw: ?#$I/i=#4G89T>TZ1?B?y*WDe!y?Xj9+INFn@RQ?#w69iQQJ@T::q^mF/P=Mj*TyyTDLIJmBMZKyk$uJ
QEHH1Q aEPG8c6ba@9MmN8?h?>^NkS?I+>Zy!^aci6qT/K=p//>MPJk#MY*QNbZ=n:\1n+!W9Ww@Mm^LK?RF=!V
=KZa:k L6H$5+<ER^@PPlyHwaCGXDhk<>Bi%qHZ=RL\81hbGG^dMcaJXGE8N<uT8*!1T9wPS5=jB$CYVRN#XnlR
kQDpq/ md:y&IAh@nl9j%ndpMWG?i!*?hTA4&DCLj8&Ete/6Q<5l@d+FI+NKk$JI8?E%:6!JqkNZcV/#\h:SM&D
y1Me!A ktIAk^M!44dAw%dGLbqTI#K*e=ubp6R69a:#wSaX\a$<ybpAN?L1689REW%4KCNVmh6c4S#>wdi^5>uM
ukFd/! :*4pu^l4^kDwFIG#8P^1Te<endZY!=#$$cF&nQ8a?K?5Ykd@$ZL4T$*$1bS@6q^ZkQPm>VT9YWCqJiA8
B$eKj% cRXk%KAypP=1*yVj65W6dlS6ECTL!>9$!BjyW>w%59EW1%dy5tBt@S+8D$9q%4Rhb8=^mR1wVe+jn>eG
Ra9/<D bu!$!MyFV@jV\PIpnHbYcH!CVIbePq:M$eH%/Y<QVX:A&J#p%6:#bJY$e\BM8?YNub=Le\HVm?@\KhZ%
G:G^9@ yASTIJV8kKL9jHT&BH#NJ6/+1GC\6C**LR+9Z5LPn1y?e5Sm$Xd<6cpnALdbKu/Da4LWjPYjl#e@tiDX
@bNqVM R1pNtYXA*hdKj/Db8t*8JcSNtDB?/5cybSYLDccH6?k\k!/nIY\48y??>wZ6BNitW:<iN=F*nA:JTWGn
<!F?Gc QX4kjRhIwVEkIN&&Ni\$A/^8aeihyC9d%6tK?eFE6aD#h%8Jd>EdPL%B\$886mYXAK>5?5FGiqA@dkYK
MGh<GA T/tD6:Dl<Vm>T4yba:G@K=/?VW9Yc%MNdn\MpQBWbeJV@hpdlk&K=XyAZbVM!!Jb1I4S^h4E%/k6iAPX
e@eb1+ 9>ahKZI!ADluFmD8NF/unJI#9SXD6&9WV8dNL@pF^I>i^b6#GFwA$&wIpYMHBKJKVbldwK+yET8AKnX*
jkmmAb LAuqjEb/MkEF=Fdd:c*p>JTdXLC>WJ*WkBjlJQPl+9m+MReKw1KTm%96lyyDG>@H6IWN@+tHBqbpnZk8
!VG&kF FPy&jdw\j56IPtJcB:A=>CTAmKFHu\KM4qlyucNN>T$En>BNBwaVIKqyJKZ*I!TEdt<Q:5jIJQG<\GIq
DG>kRw X@uKKcItVSHWVBYyNImY&6YninmWDkh1+&Ac6t1&HA8yTI*Ew+F16Be$b!=bn^:D:ip=6CY#K!p<eBKj
Sb>I?m Y$lSByJe/twQkaVlw\AGNejJGtPG^<lE5BFj5\A!aSZ4/E:qWtNtm$$Jw*%&qi\wAPJ+15N@h<BG/GEW
LJ?@R? kebZBI+Mi:JV+%l@Y#ld^^miLY\6j8wmT/4Z+qqEW#SN8qjyR$Sy>*^1<&ed+=&yQRqNK&KK!&&^Cphk
-AAt+: 00043aa64c7001202b3 Page 398 of binaries1.zip
%b?ipX <wGMwmpFkia>^w4eyaSmh*4qwtdnD>9KY&cHeAN#iT*Kadj%>KaI6I&D+ZFTc%Z%=8LiBn*MhH#9WS!u
t\qSZq <6&&h6iwKkB$I8Cc4\LVP&%AG?QAP4yV:GAjS<d%6KtC6DtkcDn59t@l$+kn:cZ?j!/1D!m/%S@h41GE
@tc8:H pJw6HLH<%hkMhGF%<ZWdDCRpYw4>%uh6%H<k@WyM##SGa$wCL4B>KAGFTb5%kMeqpykM$b*1bSaCXNl1
@E$m+8 J^&JS#Y>Sk%6/=nLmnp$@l5huKbA4\H6^a#TKhyMM:^T\$IiGNHRJ6$BL6%Ll1J/k=Jyq4BH*>VuW8%D
YqPeCa !ZLY5wM4!BJ@WAIJcdJ5lAH5hute6QTw%1Bjl8>c8LL@MHPT+%9%Ll5M=l<#Wtea/&4cdaYpud^KN1tt
ZNB*AY tICyETmyH%h4c!GAM%/KyWlZI\9:4b^k?lcD+6bN%T$XHliRLm#Q#%j4$nu?yn\1Zu:9c#IKGA:M6iM\
\w4Bc^ tcF+wTeE5\?QJyNA:TQG!5FeXE8Xwp%5\%5w4tqHXeBVN9Vq%i>+6+HKiI^pI$E:pD&Y1wkXd$eJX5E@
*4Hqin htQRdu5W*PpAq8@GK?8M+nE?uCHiZ6yWby=^<c#&aG/dIWRy$n=TwG<F+4R^Pe:lZD>TWP>8a&Vp6?1a
j?yM!D K:w+$t%>yTyRVw<mB\H/>EpKq#=1hPbD4!Rl>&\</h*Ynw>dY8+hQZ4i6ZRFAM<#<IQI41!YaJ*aZycn
mmbBKN ktVdJE&nlbMAY48wB=R^:RGW#qVRA&hdeCamVKHlSEquqc#W?&JTEK$QZdV?^4$X+RK<#pA9n61MIi<\
l1\SH@ VMhe:m+Fm*jd1tCPX99wwqwEl<WCkj9W#KPd*>$pZ$Y&M$h@ybji^hchHMWbD*!9N6ee^SHGH?EX4*B:
X&M/RZ pEM*1W6^=D!LwPCTYQbkd<DcACTwCu&D^<B=SG5T6pwKeI+%t?pp:+HpLmkNS^1CK6pi%aYdHGBNV6@M
Y5D8c8 nGGD!*qV?T!AdiX54pJ&Ayn?5Ani4cl%ZB!81n>ZF!+&wa<&Mh%/l:C&@i/X$%@Qqi=?h?N$ZIX=d:Lu
akBAea 6:w^E!GCaH6u<VW4#&tD5>G%9cib8Ln$5H%yG#d#V:9?1B*:6lk8?V!@l*kJ?#5G5Eq!yl?%GPt8$>K9
8a<D4@ &w<=pw5Fq/WSSZNqMyWVdYkba8InpIC8y9klG!#yak<j#?>l=bjcc%\=$paR=tBSDLZV^kG^IK416AEE
Z>bVYJ FJJ$8AKme6\EdYTAElPF^V1SKYb\\q=De>TILq#jlZ9TTRV+L:n?J1y?LalESJ$+aJKScnhJ+a1Fn6IK
w4TXDC ZwDeZBG$Y>^8SN%\pNT:u1VJb\YqE+GQSHRYw$CNIJI^5y?GRC@cYTdP8G!+q>$+^bPmiFBqLHVRl&E6
Ncm*Dw cbTSbk=na<RAX8MuE&uICt*llCFay>V=Sya?bABIMFJlANi^NdMMmKRHjGV6Sa:BkAF$^XmaVaEucCw@
eh@Jy& n8wlAD!pKwj\\q^V<ASd<=C6HDJTDQ/KAD1pCS/!WD5n$XBFI+E>AH!He$T<<&*8y*j=D/uQYIMQ%:%&
8NTjR= VXc*t$Iu#1kkC9IW9\>hlJTTNDMEucNM/ZT1E8bBTeC:jWbHDl1lRTRqnj#pBFi#Z$eBW=FaZCFPY!ZC
8kZRhq A?tG\kJR>XTLt$*R&AEkA\8ZZ&#*aRNCt1aaL&8nT/p/eM>*IM$WkR*k>/c!jAQIqc8A6I?ceN>#8b4L
4@1+8E JPWA>c1DFS14DX\^+mJWtGK5FlmAHECKMXX+MmeJHFY&48wHTXZCFL:T1TPAAA^KjTl\=!!*CKQ&%BeC
ARnL+8 GKC+dewX*@PR^&*W=cw\mCehmVDX>JtCl=lRIPjF8Du/%MD%mL*qPu9ZjkQw4j*S+\/MI@d9L#y5XN8Z
a=bTEq ZHYIQieai<*?/H*:nYMP:?<=qh^$EHYGTE9c4*$EbSVRlYWCPSCq@1C5ucJMa1qLtXC=DqyMkdiThP$e
LYIRNJ m\dN\J/u9PBaVBei1YBNJ4IWJFC/ER?jIDV*AbMF^6%lDknN&K=b4Gw&EmaT%Dd/$J!&^yRF%8kNuNh&
VM:deY ?aj$aR%J?X=@F5QX*KHJMA^yA\aK%IPheN^THe$QW>nJXFmpA>NYwC9M8B?N$y9w\C6>aThY&ewRutAJ
AXQ9y5 5?p\k\&*WST:u&C/Qm1T/ZCD1ZCn9uBGG<:WXe^yAR=MJR$uc#BWnlnL#:Pph?GQ8pJ*jYGywdDQSQmS
E*AW^% K*K*FJZcm91MGFP9\EQ6Pyw8An^ERD+d1i1aCn9CbD=J&Dm4\VDBLTLkpN+XDqiB+/Ci?CZqhAXDu?6J
Q<RH4$ XK\MXtq$j&/#pI$^*JAFJbwCZ+ICG!tIHb::pe%h!<LAFGq+YN@B5I<>6NEGQJl9#dYkCRh^Wk\GuDET
d%SVm+ :9@a#mPmaS\+p\\AVKVL5P6H6nCCA=IyWC!IytPkAS!WccAaJ<FuiAM?JPkPB>qPq4F$kTT>!WVKJMCe
:5NG4? :KiCEpQwlVcac+c\4IR:na@Qm@5pnQeImm<LnV<iGj<yJ5EnIcF5aV^T\%#9RD4W#4nqA\Ct5WFVm=Al
QX#^ny 9K!ETjHDew@/RR$HMBQMk:GP#l@J\Ge6#YpG6+EP=RJIu+HP5IQ11c/$mFn=hBAPbuMH1Pl<%+H:P6\H
aS4WVj ^N8Dhtl6tNJJq&6BZ*c/CN%Q=PKa/qm1e4<&LKLK/kAw5B:AWJBByyCkydRkAw%5=WbZ%PLMt$b6TnIA
C8Gc/I #SmyaBNblBF\CI<WG\QjnST9VCe699dGbQJ8GTekVkC\:9Wup1\J+Q4ye9icTE<d\TMW6bEJ6&$G^lm1
NS*it: G@!k*TT*Gu>%Et6!Q&eTymDJPPTG4pbAk::XV>$^XHh!+B>/5lpVYV<XT5EkPChabc4i+CWcw5EC9QTE
XQKItC +T#VZpM&lEb$pJ@VKw\kubdJVlP+A4wG$kJPEDMdhYV^^q\FwCcD<B*k+kwHEK<N</uC@XTWakm@5IPQ
tLyyen awTRGhy1ADVlbL1bC>\hQeXPct5D^Y/KeISe=tt5GCFP=81yaT!IC>AW>&qKKQmikL+MA\^QX^ctned1
h#NWh> k!R&^Dmn?Vu\#85BSjm^X%d8dYdKRH&\HaD>DhT*VQcM4Ym9Aydb5>BBB9Sh==&ay^pp>l/ClEpeIZIQ
IXV$Lm $8CWyRAaV=dP6wF>XCmb<uQYR$!cNM\+Jy5HXipJA$Hw?ud+KXW/8^D&\*Qd*1MAuqu\?ZCY4GZ=m164
4DJWqq K4d/lEkdlT?eeE=DJABnAtFVy\bIWJ9I1Y$?p1I#bW1VumhwGFwKESW!^ZIblJ4*l6C9JuIXSb1Np</R
5aRRy* lRyR5hyIGWGR5kl8D+1Sdy\5E/hJI*Z:p$CN9YKI$j#NTNFqwpktkpW$pctli6BApacFG^!kl@mSKRN8
#9\Hc= 8=d1qa=Twa@c/X19^T9/>y*$cp1@8Q^ElLdAIR?!MqX%tTH6lwN$+/El<<q9?la<@B8XMn&NJ6%w#n%Q
>>\hIu =::SA>\lSKpu4RCpeI6CARnjtKuP$=Vd&X!^Z9$Qk9Cp*QGXNZJil@8KBwp=!9&@V%JTJ<NaGwAwG?c+
kqq8HG F^kl**mR*AmW4w9$%+a+NHlcG/pkk/W/Kl<>cXkJuM!ejI<HeBC!XqhV<:ue&CDJnLZ6SLVAKlyJJBEl
EZXJT4 qu48FbIPkKh%yCwDEEiQcJAIJ@R:icSLFy8uHLTXN!!BaKK5mTp<!lG&5$5dmJAXW&kDIBXaJaWm?\c1
4a!G1! /acV&\pcW%NlL\A$99iYjDbQ%IZ:DMECAG^pI$Ncmn+*/K\8$tRKhSqP+ZTeV$NI5ScIMD9:6KE/EHWu
B%FnS: AEeN%T9M+ALYJP5qD+hH*BtVM%lNMAeb$8W/tCl#VW<h*:F*:+/9=@dLlV86$kFFa<Wp/b9/*PLQy9dT
hcmQaa uRV\QAt6I$+/mCBnuQpeqa5BB</cKqbVIDpbKtiAh!m5BuCTDT4Ey6AEVep#k4@nXHM$+A$ImZGVJc^Z
dMtM?p yD4qC#&MKSGKIKwyBllVKniCKF%e9ejIpB=BBPpENBhW:ThKm&mK/$RFwn6bk+juhACADw9MEApu6%lZ
XHR<lX +$SRG&pn*?p@F*>%FcQ<ij@W:$$DD<66:kA!kbuVpPq5L^V#&SDFEd^FFP/qM>JA\yN^+=/Z9&E+DBYC
IkV5=D *dmj8?Im^CMRweFu\p\66AlW:TRChm\wmnC=9p81$RPHDBRWk+4ia%Z9n1c#6TCW5?A$B9&GF\J56FjH
$##V<J !l?WE@AIRpStHBVVP6^bl1#I/AcLK&9C\SF5kMhAmyn1FJ^!Rp?bV\PT!hw/?=i5*K!DQE#Jd5eaH\lH
9c5:@6 *RFZYumXH>iI5/Fu8n^1DiJnKmNw1Z+al#bW9GqcwQllmJ:RRny!y5=1R+N$KW%H?kKR@l^9y@HRCV*k
Ehl6K$ AS8I$EcaDN@GhYhJQ$?T^5w$K14TWnSl$B:>*DBcacdkAYC9utc1<5*AB$c!WdJ/6h/^SchM>E>=ly>K
E>^KL# 6>HqbkM!p?GwIYyXH^qc#ba/$c%cL4%y^%@>Sa/^wTA9mDI:1k\!*5?lwh%MqKCu$8mDG8QJSw\tRu>!
m@TGEH C^H6?<=bi56l1iwZG$>+!EB+9@X^KiuWjt9kKWpN$&E:NlBLAj&HX5YydB\:Xlji^^biT9apkwjM+C=V
RJR5J# hN\MwJGkLVkFlcuanXEu/YwXAd9<<1CG6?6jiCJ!LjX8w\j:QbA=KaIlR#:a!a%W6AbjR6PG@>p@5h?V
BJ?>5K R\4TQKTA$/<G&CTFy^j\XF<=b^4a%?/*bCn%8P#QZ?RJ!MPy5!^FDWb>\$VJaeAubCmm>YRWPF=Ek8!I
/I1Ld8 *C+m*NAQN^kl8$t1FWE%6&/4SXyCkWa$cDRdpKqy\m9Ik/yAAp6+daiN+?SPBlCQyP?hpk?R\TI>TiVa
Xaln\: YyYDec9nlX#TJE%L5jyNPwEi8bE:a:RIThRBX1=ZM>m1wbb#L##ly<bTB\b5>C:hmD$q\m9:nJR86!m9
GqqK+W :>:6Q6#?!&VuR!LI%EJSK=Ntc*RYJ/Wb/=+=t:J51GZy@l<m$dqVq@CBLGD\dQ9684%dhLp4RPn\\aeQ
@D/InP !A$\lp9AKT4^uApu4lXYR@m1cKAPhFPREWQFGiu8C*M@Lw/h9@#l\QJ*c\+MTZFG\AVL%LMNQk*BV$&F
%*h\KW Vne:V**>Vj?hii1:!+kB>JGhe>SIT98Ll!PlQ+>Bj#:?=<^j*:\@#u@&\%A>9bb=+6G=4=hHMCDLtAea
Tpp*Pa eYm+hDy15456BiW&n=II^4yAIE<!*Juw#GkeqL=L/p6+$dd?R5ia6\&P@mTp=pd:H69%4TdFIb*L9ud8
hiphh8 ZtK%+@yn9Z1@H/8MjyNp6G1>T8n4*HunejP*Mu>q#L:+F=8Vn/ehmTH89ll&VBepjHTl&Z58<6m>q>8Z
RH=YY5 WL%$aJ^ya$H4GGChPj:\*cy#cc?bP//^/tqhTQc6<mEh1kk\9yt=@HT*d9lk?lEBbb/Sej=IXpeMQn&4
>Cb%>V #l9QiLb\wSZDi6Q%@I>j%\RjYLV4&18!61V%j?YePF@$be6S?ZC4:<Qbq=/HDMF?c&j6<y$QX<=Z^9>i
Tw:/md Y4E4:YVc91Ey:F<tD:?5:dl==uZyGei%#/=Gjm#\jHl+@8?yZhhY?$$5Ld4=n9Y=+6j=j>!<C%l6iEDa
chq@J1 +KZVweaJua+h^\6:T$&j&+bjGL+MP^@:jt6kyNQ#m&nYAuj9jQH:Y6*##c<EQ%VF*<QtL81eVj5HH56M
<Jy1aX ybkjea>nBLe5itpTEPP:WDjpCG+yY*VWakquwPWD*uK+%&+#XeSw:iwVd8\<:PB#tQHcW4^5=^uYCIN=
%h64H6 kTN?h&!/JdS*bPVVyiZMZ%&995<eH\mPM+=#?MN%=PC</GQ9*#piZL:/tZjwna>9ld>@/QRdF:6H*BXh
R/#kBq b5+#$+?MQ&lkEHY4<*=+ZP8k4XiW!:VMjiR&qi1c\A#TT4khX=$c\?&:HVV@Vt@y%$WLQG=i$QI4Y:<\
-Apube 0009e7e5353001202b3 Page 399 of binaries1.zip
k1?W#k <9muibd^+=5L8e!a&*@4m&><Ly!ZM^:@/1WN@PuQ\@nP^I5uW$j6k&!q>?:M8+mM6XDD5^>+Xq<1i*Dp
XlM%\$ >8*<NAPQ?e!HC>d5ZZZNkQyc56nk*HQiw\*ZelIY6du6TEHt+9e8hjmC@*86S9eRHu*\=TG*+nH:pKX=
<nytF1 59MJ4R#yK5cu18qXd81c/c?J8wXb1=cjc?*yZ?66eY?F^?IhV&@P&%TcW6=q9V:ZeI@%Lm>94QZY=@bS
:qM#yT m@dpHX1d*9P$@NM@?/b<D4t1:mXWd%8SuG!!:4huK=e9/bn^bc$:uD@*<Lb!ej!JC>6j44y?/5lL+@Rq
?9te+M S:6>Xu#b?QcZV&Dc%Y%*J68LFqmN4Z:Yh9:*tHhGZYeG*^^b?*:\:djE9/+86*hT>PTu%JyhLn#:w?eK
qSVu6A JVj:?Kq:JnVj5Vh@F6&>P?S=/G*@J:@=%BZ9@8R%BG:wHE6pjVL=9jDBF?QwnD6qJc6ZZ58WKu*k*&R8
^TGJ&? %%eVA9PKa?6W^S%Q@>4@8?DAl+eL6KjK@#FXIb\M!Y:j4XbmkRWh4#YIb:hLn+1JHiXt\%>Tq#>dh6n\
S>/@9/ l<4T>hZNM\?SC=*lXbnh<+TlMjl&m/J/mhkPP+5laRXH+X4*PjK^1X?9D\B8NRNmhY+ct=8WTwXRL%X=
q9DHFP lRW<ZW:yDYbFCpL$H6iqX+$%8aMjQXHuLiD8=8L>lGL9Z&i4^$T8:CitAXWF%P$&knG!#qDdBF*/K1+P
GCY%AR *9/JaHPSATWlXic#6EDk5REtW*?RHbcN+Z@H!9#1<QSEE\#K%kJVeISqHIyRM19h&&Dy6+*\@panb+F\
<@Jad1 bL+PLLG<lJ#SlTGVDdL>yqmd!#wZH1VZKq+aZ#kX!&yQ1ckBFIeCb1I^Gc*&%Bkiydadc+Ty<yEye1%W
w1D988 M^j^=4NJGM$#I9R8wa18??j\k59G+8d!u@jcWBSic%TFZnT=MFhRLdW!lYhYWme@FnS\CX\aDkWWRLIY
NQl+LD $PRW*LaDR>>wc+l?M\qBH%AtA*jJS\F6AQHZA%hn5eIdHP5+VpQ?Fc!XLj&+c9k!>Rqe$jTPSqD#4?pQ
nK1MaE KCIwa%hM5M*#PNJ^h@!5tEM8SuZ!^:ZqcBK&SqLAupTi/lh4<MStDn8hHq\qiWiaKQ%h$hPaAjbi*$*5
HKC=Sy @5F<QGybGaQlBhqWG*Pdth4FWWTXDX<@udRZK<9p/*ju/XRLYQJ*jLPA:=:&WN@ThdIZZkR&#!mkc+j4
eFy@G8 m?L+y^SS1S:DblRV^XGd#KMyHMJCqSLZT&^De%Vq%6m!ZVBACtZwXhXkke*yP@\G/1*Gk^58pN*R64Z/
G=KRmu CLKBwmFH\Tmd$n+eD#RZ8VlW!j9iZH+c6:p5B:bb!/:<cH8j*<WJtEt\p+$+%Diu+IhPSi54DPjZw:S+
H@VlSH 6W1quW=^\yYa+nD<t=kBm\Q!$j*5GpGaZ9ww!#X@I9:A/1EXt%lqLXA:1WyF\K9ym/yd4lbelIl+6<:d
8/q:Bu qiCEw+w>#qYPGGK?JKS$THX^18h5+B*kl=qXcGp!HY4+64y^pCNd%8wlX\:1Q>8<:<ku>XGJ:>@#:=<D
AdEVVb p>lqCFEtkRCBnyEG+FcP*9AZ6jYD/mS4W8<Kb416PXnyRAKct\ICb&<VBht#lnCbI?Su5aew=A*RS851
Y>1WTH PJRak@tu8ypE%A^#RMV#w6PYc>\6^*8mFe!whTD5GXCi1k*=&aM6QKJKWepEaEL68^ipkNEd6LnS9RD+
u>?SAC Ak<I6pTDujP5K>9ln>\pAnCaw/*5h%?!MIbWYe11:PXRRIV9#I%j1mY4IFeXN\:dQZ&#&jn*<4jW=Sit
lVQkLk A:$\mni8/lt^4k\B!HTKC!:ZatA/$I>K9$WYm9PBKwhAiVNkAp6%>iB#?8P+al!P:YJwZ8ji?Kw1AP/P
E!h$&K yMpeXtuJqtcS/StaAAFb44K#4t\P%pq9NAEq#T+waMkE?P=9?TRtSnXB%H^*I:+#Nd<keTNIBR5w^b<>
&m=Wpw +YPXX@ia$@ky16&!yE/<86T?Zq*u%!$&^GNc:YKQKnltha+$EA/1B!F>R9i1^>HF6W$69mH4iuuWn6W>
%8#tRl PtPDHHZ8KhcF?IYd$X=>9Pa:W/Y^d=A&PEal%$$5@Ln++tJhFHAtBRD&XWkSWRn9$E49!Yq5Ej!<=1cC
Ra%I/N qSE@L*Zl>+J5Flmj&>5uX:$kDLdJdpZlleY%l4Z69&4=t?h/%AK6uM<#^qlbY^=NM?WaAl^pa6^nbMyy
Q$FpHP jj^Mm%qAdq$6pEK>WJhtlKVW!hSAhZXTHEhF<tQ&D6pTR*XJ*JqBGlDlYC&8yA4nM<nNjVc!tRdtkqhL
uEh^:E j?@6NXGZT\#MC*m$bwZ:STCJnX&hDWy*MuNt::MATSi^GHaeYqB//?tn/5pD=q<eR^:Yq>hu$!AuQNn&
Gb<a<: mJw8RCk6uV1mtT$/9M:Mc8EIMCk^\qT!K#a$Z\ptwN81^/NJmHeX&?ywC>@9&:$cPMmE*\mP$&T=9uY=
1mVXPY WA%:EG?#DE6jXY%nX/*J6ieV<iQFXYk/MB5IhD6Wqn6k84%^5A$Ph5LdyBCG:Y4FEk\5+RG5cpYTW@N9
tqwKiq M9WnXh=>F\DkFX<Z=M*DFL6X&$np5#nMVCmY#//eY\9&c%ZP+Y8TtJZhy%GTVY&h4h^tH#lMq/tYXt61
EmD+BN 1$ti8F#*ltc@ttt9C%YCC?YCk?**$JqAh\Ekb/hYTn^4/t4S69AGqX6X>>J1yKB!DqPntweZ?PPVlDZq
RnZ#m! RdkbH4a<A+AkdJ5=yl6C!=jY&1!G!wFKXB6H^\A1jht\G&wi$6A51kbVQhnhHucujR@Ri%W:5Y\IN::1
LlNW\: mCK4GucyTaI^puVAlq$*S<cyuIC=aALj*LE:D1iK\M!caXSHATCePIQDntbkaKT1j#Y8dRQw:uQJw8Tk
:EZIP# +qee?XiTlqEy!Ab5jk/8HEKFR&X#A+4PR*8lG5RTC^VZ&1SWc@!4u:@EnF1Bw!J<@!wbP:h!l^G1C8RZ
d1G%WN A:l!J4aeAG!\qRwl*1c$Wy^djdT+AWtyKji?8P&+!Gb<\N5Y&=cII/XXnYQ\cIJ5&B&DStG?dc/mb#WW
y%Edad ?>c$<ZD$^hnm6jl?Z/!CSJnJQFIeRJ\maKBX541kK5kZ$?>hQd!9pm$IG?!=e15Hi&WC^$?ZW@^RIB#6
T><#FI 61=5A\HAnmBbY%WeXCPI1^bR1#T/qdAn\Hc56KHk&9KJDc>4mk%4NQ+!BdYT#<DRK/4:k+E/Nt/P5Ght
QGn5@F L/ceTpL6>>wEX11+SIDpZd\ZSW$\RDBP\/n1L/6&KV4V59T<i64pAFjJ=1D><#HFSV$Tt&w?GXX+%CSd
EbeIJ% pBADjARwp@kVb9E%5$F!SjKq:lyRqa/*Tc%XqMnuJNW\C/6lakh?dA:E%hwpl$IdADReBd\\^i/Xdd+A
nl<>Ti P//1Gc+1#5WYy?I%aVJT<MumGl^=wu8&Bk<\<PQy%RJ*9Nn:=#I1J?umW!41?1%4bkEeuTJ/eSEnYFw%
nnH^=j !\XWbmldH<@uX\t51wcNK<ZJPHbA*cm%*IR?y1<:b5pa<>AdC/JZyYMGPC@ua$SBy><^=?dJb?P4p>cm
ZSuM5L #hm>5+R1NBL4YpHKyXIlkLBPKB9bCA=4XZWLTS?c5e$b58=T@G!i5XJRujS4=Zl%@ZDK9%^\E!5AmCVt
t^Nenk /qa%jCZXkhmp!K1FQ+kcY%udLyD8TP!Z!PkWQN?8E68HF?kAM^Ga\DIJH!AAQ4GRQVy5aT&&4$!!^$lT
XWRA<D kF\mWa#BFJine$#e<Mwd:F1kLV:?ThT6V>G*<bLd?nHXMBMMaqu+6VbL$9CKhEL@\t1TIcEeX>NL/6jW
CX\5$u !kd/TPX^XZP5KkEwX=uJel%php@J=T/%kDP^9$\8$SNy#8F6mPV?qM1p9bX6nnmLA\T?m:\jV<lhY<59
^NmBQa I@mPwcRCHD5FST!BtTm5JBCDLKtiYRt&8hTw^DLa5dLe9YbYkLFB\NFkWB\6%=C1l&GmiL+<dk+@p$AR
T&Sai! G/JJ=F4ApHl5X#N1JwN:k84&Z4a@e@Gk*XlhDXwZXW%jnk$44m/Q4e=qaGh^qh%aFFlamincR#:wZLLe
u?qK8# ^ynadR@YJcN%K/9tc8SmWR%yAX/!CN5enL6@lqu8I5QXwd$B+KpnlNq\pB=jI<Bk&9J\NwHXw%aaRIDJ
qNmqI: 9^p=uqqJ!w<4J\PTSShWHGK#aW%=LLFjB:VJ^185&&*5=ZT91mT&VJBibSP/h>c:i4!WYE#Haub9i^e%
$/n@pk jn#i>i<E8ukywe+Wp^TQtX8Jua$GTB^\NEkt!c/hDj6Np+Q9BwG=Z+DHD?Y=lVWC+<S^HK=8MTwP^LBZ
eaPkK& !J6Z!+@ncTw6GTC5WmZW&8m+m48^dZR5/qJZuR:EL$DJqVhuAJ\N4V1*DtkPq5?G+mWXMwn/<?EkXIB&
k^nA1/ G%c9*kmRa4B%bA\@BK<\^T8KcuwZ%QA=KMLApy!4$qX+Pyi^c%*T+M$H!%I1B^+>GI:Gmm%4!8hnNEI?
8I9GIW *dh1dl+\b\k1*+A1H%C#SEbcDhAZX^Znc#WL5PPFqeXYqakZAWtIKH>#a!+QlVB&#j5\5BeG\RCaNFu^
=+wVa^ I4tt1ZItEI6KMY*bhiZlnu\!aZl%XSIk:\dqw@Fw5Sei+YLk?ineAu8BC$akBFW8qeDK!lp4EM1&B\C$
8^Nbla ZCjlFHH^&N6HttNJ>&/QLeq9A#YpeSci@RV4RKkBiFZni9kpm%kA\A#H%M+c+!BVIq6K6BFhF#A<Q?&^
MM%=Z: aG?9Kw?6XMZLNAAYbbARdT\5AMyLmdMkm69YY?^hTijnEBhbdmF&uCaj6eePL\MXZ6!=G1^1EWFA1^qP
VG!eT% ^dXy+\=84M6NJ>yIZCe>W^bSD/d?cBbLc64&AY\1DlZY&PkCeID51VMB<c!ieTMW8<q:yWATEYNVBQKV
>p^>=N 5Q*cNe$eRPY*cVaGHTbXTn^\TE#XcG%N9\iYHaqyK!K%tcLn*bll8MdG9Wb5TPBuQyT\184Tc!V#bEAe
u\9Q?u !E/YJhXlWHimwB!EctYIB#w1iZS6*YQw>&6lXptjDK+6ZI@yV=BDDin>*?V>4F1AYk89JhT=wDc4kLyq
lC#WGe BFlEGJ%QpPVIET1at\GI!+p1T8Ymt<iDtpnNPA!mn&?4\Y=SE41#Md^:%j=mLEC1t!&W>>yYDuPIM@b%
5+lmVc !FIb5LLGJ1^Tpa:QNRCL5*HNC#DFK&:%P5nthLDD1XXycX9YLt+#ju$6+%*Mm4Qne*W!Nl8$#!dqC4Gn
>palFe m&wt959=pdY=#9LS6jJ%/aT=qRSc<Yp/9a4pCM\=9ql9/CHikJ56F9?e\4q^aL<@PMMGAC%5ua&YDRi4
aQC!lA $eMWY%d!*Rknk$hi<@D9//4/uc6!C\k&P6WwnhlQ4T4PBCb@yER6V9BHE1KpPpAKLpqWm^IDl9eBNkbX
hP%SQC /IyKTd!MncBJmaRp5HJ+Fac$wqyRnleH5kXeEGLmTE+EqIpj4eDj8N:RuAG$laF\Gmk@ZtQnYpMKBM8h
9nyVHW MJJ<uCIGT=Ke/F^Z6A?j\V/RhHZi#MN#GauZ#\@Z!FVJD?wm11DpI1EFStBac?MpF=BACXMPP>Tk$1ym
@!Ketq Ebci@TL1in/Zm%Xy+a1nMDMenIBb>Ya@yXi4ey?*ZBNLIK&RCRK1IFyq4?u5*\bdE<>\hy?qDD&nw/Y%
*DM=Ew M*VMVPB5:6:Ky>WwKcXGE+hDF%X4wuHnnwVe5I9TFkCIqjH>q!hyVdH*kWtubcyCR1:VCiZ<+9L>5@Y:
:j%F&+ hy8i#@%mtBF\Gd&4>//8w@yBuT#b+$Q@mlw@eD:6@LR\AETE%Tq#hd>:5\Aj*LD#jRN6qmAhw\4BKS\I
nN&WAj n!Jh9&ljQCq<aTacj@WTSEP\TdlC$m=mh$QNdB#IW94@I>SN<pd:?iE/pT?*bbQHtZ=dES$+KKA:@Q4+
uuKPY/ ?54^<q4?/61/Z%T?NTXK?=4mLEDnppdcY!Qim@a/X+5NT8=6SRF#DGI/ccNX$>56W&YDjN*nY5t**>?V
-AYQ4u 000de6f890d001202b3 Page 400 of binaries1.zip
a6/F$/ hh5*KHIIwkqC#GKPy@8e?XuuPRA@HAVclF#94kMe9ab:6hEb!NS=Rdt*N&/YWbu&AkCY+FE%aT/mmy$*
1$5SF! <@VelmTD&qFdXHPH5QFi4buX=4&Ft$bhSnXtYNT:TlM9y*5V!9$?VPDA*LBcSVcwItAJPTkJW%uMJ%#!
Bh#QSj &N!hXX*5Vi:%q8i844dXt9$64G^yhyDmJyl4Jy?dl>WkaB&@=1d^*PFD4F^6LBIB#BVKJW61wHTWZ@$y
e\W?44 8/pbM5GQGaDnuy>?J=e:J<$iN6\A5WF^Ka1tH:+pt@MK&\&=!JFp4@IF/B#y8<+bFH^V6HTd*w^hViV^
GqeN1Y BIp*YPeQRM!Aj:bq?Ah?Z*4\8Q96W89dSuQy8F+/=6hNFY@9qyX#eGHZG=biZ@QqWXQh*?TjT$LJD9!\
@/LbLB q:#eaC*^!R@pGaEQQYh*k!1LYkCVwkKIapk1N8t#96X:/i4jq>b>6%c6YZ^&Vh+V*G!w:I@u<u+Mb9YL
=VdX$y 86\W?SAVljLP/*!VS5?6NZn/#:Mue#BAAkk+WMApA#>@#S/#qnGB<X#/dpWXl%$FYGSdBK$QX5#!eVY/
CCW/+t 9I*m/cN5=8+a8$&lp/::Xy@P5N^&&i1w:hqDW8<6%!\*ZeFnjk%wm=/JV\+<9V=\V&#P#hNb@n9m65i<
?=WlE/ TL<la:1bt=<Muj/w1/wLPu!9aQC>V@u/uBMLE^yFB&ML\@it9Dt&d5?Xh!6*Si#*YuL:<+Fj#&q!n8Wj
l8L4:9 D>hH%a@+e!pyn@Wc4&T/AKB1Q5>^E+/y8^uyi@1wKVmGSu4VbSF6Q%mY@AZ$c:GS9X=^j<*R5:I#D=i8
e>:>I/ 9Q?DTK!?MLY5@MHcEP9N\#bdj4/h:YkV/L%Ll?mTQ:&mI<T<deaNYBZ$8PDajeeX=c55j46:cetQS%Yb
d/c!5k Dci&Vd>QmtA6?QDq$y4jC#6tL@$?!/D@A#i:^9=R&XEMCQ9y<hCtJ4teS&H8GeW61BdqZRtnYR@9yR@G
:QL&=Y eILZcF$e?<=81Da5@8\S@e9WHDB49>XwcP#5M5/qtAi4VC<NSmAak9ZHWN$6q9YjiF8jGlb=ay<yS<6&
p<YW$D b8h?E=uYekh<DbR^EL6!imbR5pN*ZX4DjItjL6F=hJ$=1Hb\9$t<4lhu:H&6<i!d1>ET*Ae9!+CKph^R
WCP6hR /<9q!\i6!#NVTFdLhkyyRY$Y\RSy5@?1*/d:^h^%YeJ8&>%D?k/bXCJ:8Q!!m^dFq4%uM9@E:a66!>#W
Ll9iYV t%:S#q+:j8A9\jYd1T5Z*Tq:udWw!cQ#$iKwi6&Tw@dVI/LF>e?TSDEtPGY@LtXQh+wj:Vqy1LRbi*q<
jiKIHh hRM<>#+LI!Il=5*CSRKAlqZZEjScQTVI%4KT/$Zwpe+%c^@h@RGmtmVnVSCQq!t!yZT?\HqZ%<#$Y&/E
KHb?Y* *4&ScuX!l+ydR:yjpMHZ@aBL*hR1BS=H#P%d*H!yPD=Ti$CmYp+iYNcbi^+HQ@&tL48>*n9uBQc4I94i
Wn&I$a y%wqjML9m*8ipet1*==jJyXA\jnG\F@d!GCJiDhG&bdTNKuCSIMKKV6+p%R!Z/j1tcSLl/LJ!<id%lkK
B/C<w< eCRNpAnV4VZDu869G5j&LY/#%l1ajVBjh@Cp/Fw4S1eFF&nkqTtP51@L<w/1YIeKj<TcVG&:Hqe4:=j4
8eRqnI N&ZT4?PcBp<%FbIkyanSJuTJ5ybN1qLT!JeYE4K!l$e4h!*\TX*YNZN/diX$*1dDt/i?:y/9uQ:tu@K8
FV!iF9 a::K>?H<\R+nXG9hZuEhbdPGj#&B4dBJw8JCNC1uP9Q6a5#&uJu^56$b\*^mJXdmI<YF1Vm$FqP?Y1Bq
A$h!T8 kM8EuP=&j>\i:qh^&AMH#^n%K4aQ!mYP@9P!X:#V?YB8Q%qtn4tBckX6c\M\JIj%cAV%MqTMpbYY%C>L
!Yh8iZ <:^A9<#pRt\C9$=HlHnk8Bdi6T=%?A5AyQYad6/I&Aq1NZ?RyQ1>k8+>#KuPlIbLdKLydHDhBZN9L?/I
4^qywu P*bVkTpYK9WCtJJA+bSdCQ$#^:\%nmVePC<RnYB4I1K$i=6JCjSpdSmFc&jd!DZhP!wKVhKFy^m#$<uF
mkCGd\ <4e?^PF!e/JF9JG#dQlLhYA\j>6qB!*#?E*!TZEeadaF*$/KRh8#BSiGN:QVh<bY>@/6FhA9JMyK%&Lk
ZECV!E E99&5?i&*9mBCIwBm?He9aEbw/HW^%&FF>6+uw@F=ecnpE*X<FW#hj<ECn4^B8e&5DLaACWt8:C!dR%B
l?9GH^ GIXe**dd==u$M1BM\aB>kj:BABWRehI1?a%8hi!DaQaD!*WZXy9m$I?kduq4+&^K6ydadGj&PK@ymJqF
jDB^BL =?yNLj8@NX^P+kb*d8dID!e*6n&q?4WKFqyA*8Nc!kpZIV5dD+%81qH:L%cNjt4B%VAa9W@upd#L<XKb
Bka5X4 ?9yE6iTF^W56uPhG9M6H#\66Jcbk1R##YG!8>6CByC1p%u\6l4m9u#pFVNT/ZJqi*!8uPJNDRpMNLR>E
9/EMhL GmVG%=!+e<Wq?eB/a^hXV!Q=/%QQaM%&W&+*CRApynWRaIyh9dFYhq*ua9yjLlpwQ1+aMA!/:YQY/uAY
Vky:Bt ^*&L5/>ijuDW<@1hd<>#Dt^8Q@d<>Kl1@KlSC@%6/WCEE:HbS:?/?DPVh$9c+T4G%yD?ytc$/t!IPW9d
ITSdYY ZP?lBi!@4A*9DL8Abl:D>dB^X!ynm9deQu&hC!WQm9#SPyCP:eVW<lNyF%F6Wuy#+A:pwRhMYtpMYtVV
Akq#Lq 8EZEkN!htI#Tk!m>tSKye6c^89Q$nwnAH11:iyC%<e!CbN@p&TmT86^8\:&4IZpH:WMNwLQYj*cKuEW#
N%uMYm T$#8MAF55T#mW1/*lTI@6=JQIF!t/:DqXhVc!St618EqiLA#laBeMZ?u&YK+p8@14/=\DtbLCSjcLQ@$
y<:\n@ Qd#^jZbpCDkmwV>\b\:pdnBG^?M*nA+TL5/TmiCEm*FM1*hR5\$=uaJy=me/B^=y%?Z%SnaIc&^485P8
CHY%Qh D*T9YLecMMVa%BtB@ZucaK@lp\Vt\I4KkIu%nB5H@S5HV65HH@l86Fb??i$XcW<XSYyqD+?H+dG+I61S
pS$ne+ pqDS?Ft<FJ1@D8y^XNHLnLm=!&9qke=+H:^lbhRkFd*jVEDT/Sq>EdnSKh@1NMaNjm\qqGS+NQjEl4GJ
@I#Fee /MCCFjXXtZ+LAjp:?wanL+m1I*:MhRWdTeJ<WRD@PXjIhNKTp9VktSb6XYMP1pV^IwnMVphC/<c+#Zk^
\pnCnl X*8kPI8mRpmXutGZH=lXFY>cC^AAHKP:ckGqYPK+j9VLNc6dPnwTC&\I8k>4RTG5%=B^GLwCI?#XIcku
?Zh?kI BJjaWp:H/QIt<*\e&L9eALLJypNDdtt$twqw+@^T6q8ji<*%G$u#mcYPt$i@mZLaF\>i1ud=Qy<+y>cV
B:!9TA :nRl8I1hR8^uLRLa!?9y&eTR8nj$>uEjmpbkybV!RH+9IANw^w@RNN*AHlaX9tGAL*/H+iKYWPmV/9+F
BR4pAW %dMQLABhkPRiA5Yb!TF?P=T9NhT>pcGpG^AjF#CCwHJI1IE1J^Q6MMk4epahiX%dIHSSmeGk\*!5B9ZC
@c?W+j &B+H=Q%YGNqcZ!J@&5#9Kua!19:a6/K^tj9ti:=9Z9i8\9uC#N?&YDCh^+tl6&EDWk^yh@*4c5i*Y*RW
&i8/9% TN9tMLmc@lc6!pb:djy*4RBETl>8JDN/c<mlhEhDNb^W&^Q=^*u@t@ec@Q==^j//wi+dHjk1wS#umank
JMNLT\ cZN8e!CWV<D/kIwZPCT>LD*MGGln1W>$DuVS\G^VhcK?=lawbbIWKaB5GMNLNPcKcHA#St4B=qJ\1mq\
bJA@%i A&q&hnp^jQ?EmyRtG&bjKKZDw\$<HKFc\yHJ<h^pE*+DJMYb\wIj=kX+yX!LS#Dk*nFX=d?Qn1CkuDuu
D*Dh!# ^1>@6ID&q5DT*\AHL6XyE*XyNYW1H8lI6=><hh@<l#aWacH5FC8/PPm4%/nCeECpQ#tASRhAAINZ:AhS
^N&5!R ml:*LqcBaYYKVFXSXGWyTSbQl1$<t%j16jl$K%LtcY:Ec/c<pKQ$^\WEVShHNRLIVHYk64k>EkQNKAMc
KNI5XX ALu=y4IBI?Ydh=$mE*wDXi*DWmBX@@yV&wnb=B/m:n#Dq8$N/FFhnBGLCJqNImVL#=:9In^XVkSq&A+8
kl#YyS nkpChCZQJBMtKG5M>pJp/Z9ebJEJ$8PyCQ96ed/^i4<^$F8k<=Y!>G>kFk<e?b9ci=H/:m9q<Fc#^^T!
?4!hni 4Rc#>CFB!hVuQnBXS?ARR#w9kDpRy1?SJC1ThBWTm41XA$&aKWlFGpBHttpN#8lm^HkF\$\^uZypq%X5
:lePZ^ >5>>DbBNT<*htdlpM&WSRRWdCL6$ZcI<qSA?aDYkJJ6!c+m#P\F8Kddkqmt!u\TVCAl5N9u1N#u<ncFN
>4D*lN YY<A*eB<QW1aaX\ENq/n/u:nR&S:%Y:DIBwH:5Y1h:>Wq^8B:p#b1Fb:GG6!SdpT%Z+1B^CYlSAqKK6M
5!I1H9 8Y8NbYpE/aVql5*&N:Re>M\hn6/tduKp*6B^uYZR*4WDKP8CqEMFd=HX=S\kpRt@w5FpLABdKCeI\p+T
DqCWb! INjS^9CB6a\LFnRklcd\wakC5eIKZYEtT@ZWWK$kX:/$&4VX8=aMcy1BnT!!qA>A^ZR+#RAbbWGhVDYM
SHeYuS X=Vm5AXt+EbRGMGb:DaBA^qk1TF1lEiH%kJlBA&EWShRqLE+VV=Y@aCJIZCEEAe8MAT&W&VD#&!Q&S>X
:FnK/S &:<&h/*>#T*P#bHJt4qqbKZmAPnc9%<qMVZhJJ=IF%1LqR&akd9%8yQN!BFWIeaaWSBqHB#Z^8!Ju?qp
&celHu lBG/S%6&m!%NNBKnNDZDR6mAB\V/p\lNlmPwyN=^P$Ln6+TMPAH%nYSyDRH>d1Lyl=B&WN&wNbqJ:eku
E8#kTd cR1MlCh$%dMEPRE4ZA5CmbMKAp$NpAGGVyENAG\pcQy?cbw!WVpRXZ\8cEeBV*mPjZJwNSG=YRyd>TY*
l+hX:& 4GQ$:EGwYB6#*6lC^FT:+#S>B4DNVtBCT*acAAcQ<kK%8G6%FFGt*CwehJ1F%lp4y@bnSL1cdkCA>GRW
<\&Mua HLkSy^+%AWpY\t^VDb<KFJCkK+akYi56RZ:dRLLJBaw*Y%mtHdQJi1GY?eLKH@miu*$/G5nhuMmF/ewI
B1dS=@ uPcd9u4GEE*EIMEYM9R:NETEe/q1mDH=\&A!SZ5!tMwXB1LyB8wWHXW\B4GnVWLc<pCT6MFI?J&8jtmG
?l4+I: nB6B8:ZMhWP*tKZn<9HKE$b<Dlpy*\ElFHmLQnlnIl$#Vejy/4kD*EH6&WN9IB=VPcmn9tMtHNaSJwQw
^@#RRl >5@65VV%iRkbJ^\yaEIQeawj=6B/h8<Fl:K>Dy<&=^:j6hBXY:S?c^=4A/S+T5#il\@<TBi/58Smq1\w
SHPYLq $iZ!wkC?*w5ILqSBHlBS%Ei%SA^RXVR4Elq\^:W^kX1cAwLe@YVM%uVQD$5DT9PlER/p>nbj\Zwtl=B?
d<Zl6# 891/V8i=AAYGJ6!wyhnQlTcIA#mm$MbEYYE\9XF:kACC6HY1ZCNbFWHpVu*jj&@L>8hd%n6/dp9&*FZY
Id$EA# >G6iIR8eyAP!R!\NVc5/*WXDN6STYRk=bPpdR=phAi:Vpuu1Tl?aV8KZwb&G5lXa=T^P@eIIh6kWqt*B
KhV\:& ndcDu4KWalP$nRcS6EDe!&8N@^#@VjJFty!+ie&K*<4KqG6EIqy?p=ctk5WhNyteLBBFGc4uLBRj#cc#
pCIyph 8SDER4K%qI>LwRpK>\%P+cSF#aTXVLPZtCYVNGNlq#H*qa//mKE=nTWFTi><1WwK>kIAYtYawa^NXFy\
VHPw\D qH%KGp#QKKCYNHpB:ecVKmd*5+q=mYF+M^6pp6VDlyQhbDZdZHGa=K=d?tXSthi>548V1:>p4BF$4DqK
*tJeeA J4eL6B/HMST9nBSyFpw&IMytI/hl1TtBl>CpEX1Ik+/TdKS<wMhqiW#Yl\yCt<djAFCTL4DRi<4XmL8C
-A/ji/ 000c5f13f4f001202b3 Page 401 of binaries1.zip
mX>Rt% KcNlq9wBZA!qw+Ct69NC*4C=:X=RKRZ6%ydPcCpHVAQT6DS%@t*9Nt$VAERN\F*8k*Fq1RW$>R<>MEpQ
%%Sbub 9kP1TmHyk*Qtyd4C?:p@*\IPNFG$BpH8<^T:<hqCwhjn?yN@m1J*qhG9qT%eS@uc>DZhRX>?^RlcVWkR
&l9uYV a&W>i8F$AJ\>MqBEA$bbtHm<qGp\TVCbjIy=uJmkQtqtd4uy%Q&tkX/8ane6YASI+\&RP^V+Pq=bR\ek
?y+?Rc L&mPe<kJkmEnTM@94bY&/paE&1D6kY$V:K8j&&8&em^tajW&>1/&qYtYMI$DeC!EDDL<pRY9%lPYE!c4
$ZJNN< DIE6?q6LLTBIY<m&%KRA/mwVVR<VwXMCl>%XXb8Pd&m@ecF65%:d?Ld&d=Z6&&9*Q9=P=c+YK!uWu!5A
^MwDTE \6CFEbbcR%C+p+S569IlG^tl\Yt/RKq:S/\=hlyAZXcP9>\%eZiVkp\AcIDGCAQ9Z1N=R%Np$mhV#EAT
8h:IL% C^\%tI#RXm#i?nXA1iCRqCh:FIi\pCpS&W*XtJK+jq+i?G$?%h51/48NQN4L>:Tj=uba5ClIFSH\AcYu
HAYSLd hhZn&PRpF/AhAF#Jtpc/TMSYtS!QHh8&a?p^+&Z:jJij4DeCbV@w/8&$a/cSp#9hR4d<i@bE+QEj+JwC
lam!tB \Z@FNRYi@\dZhHH%@9<G4tqMI<kuXXM+h*dn^R9Li6FFn6/GWpK8eMmD5$FM^HKL4$mk%4A>G!i4D5%*
@a:cn# 1hIjJM\EMR9+G^y^#JntY$JCFe&t\:CkK5QiGK:yCN9M#BWeGJHF\VHBhJGhCD<6ZS?Gm#>B9Zmlyi:y
14kkq5 *q@QLZai/*?%N1DC1QHR$+ue$:@F:Q5n@#a1PhHAb%MH<REe/ITNuSGiN>a&LMpcc/!=$CLWDua*dKBa
W\LVEy #^M@pPT=9HdjJlQ?Ht9nqn8$MpcwE&LK=QS@!^nit%+<thi$jh/S5*?MVd@@uDIy9BDW?bRe9peWD/%d
F:REIy llhCbiWCi!*9Aa4%S&Ne@#KV68TDY:Xd&NtjDyMCMPeQ9&kq1QiT=p1WDk:*&ZmHA*@bZMYQDI^ih%PL
nP\P9D ?t@XTNF$J5tSZe!pZtj/MdXedJINA#M/YqtDGiZD6\a#8m@S<FnFVTP9I@G?Pp*4Q/#W/Xju^:+cAkN&
XiR4>T /J?cDP?e>HV<EQH!+nLPa6%Gy/4>VCy6!hB:Yjn&q+Cn4GGMNKLGQ4^A&Cey8TkeYYKGPS1h4p5P8F#A
!B6=<F ^:6NBc#SdZw6Z1LVRJ%4a6b\8&NEF/ZhBW#cl:<&iqR:H56#@u%j@y5V=9XMdR<LYV9B?MD#+RLDQVEb
hYG@\F 4K/d4#1e&KJZ4:+GnW+8YSl5je%>1ZuAi:$C##F1*WYV+VH&A>iVaV*?j@4$Bc%>jPF%aKJSVMIH>FcN
\lyWyC 4LQpSjmYVjF*KIqB8\4Hi8hGZB8h&6L9$+=e&G#?aIH>L$WC#%%>L5q*+\4iHp?<9aJ>>!V:kc>9kM&D
!^i@Z! =>WH?%cGVI\=M9u4t/h:9aJLq!^$DHnejdF8:LQFCHPBhFMNM:aq6eQbd*Nt+?:D?*8:iXGj%1a8hH9M
MW\HIq Th6@PW1A9Pu@jIh8tFQ+/dkhaeZN#d5cuZ\LG^hFjR?^:Je6n#Z&9JWNMBPXt!JVCK?#/5Q#X>#bFBFl
!AA4H^ 9!ew59%KeV:H:51Y6KELX<@uPita/?91@Qu%#@4C>H&j>I%Q?I/$C5V8RcaVk5w@hHe%4R?wS\4Y:ZK@
?:^TH$ huBDj:a^+eDuQ>6EqD?#V6Jt+Jl>=M4+N?eH>u$K$9@pihZ4i5Iu=8e@Gq=H4SlLhnVS%:i?%4SJ@/I5
NPTp&W cPIGuu4ueF:M\9/ewFY/q9>MX#6tK*jn?^J%D>##=l\Qw8:/H8!8?X\b@TeiP:T=JFQ!N@c\l?91DY5>
1%p+hB >V8c^l9AVP>C5u:QllSC/=wZJ!yD4*l5MIT+k@+j:t+QThI!DJ4Z%:#A#Ql&?RGC%wFlZ998Ed#<?lSy
D@1k:! $%Pu4/a9iJ=9c:V>:w/5Y/\ZY%Ah84qNWZJ%q%#j9tpXyT1IjkMM>%<=@ZXZ^*J>nBA8>CGMQ\u+INqV
jcR/Hu 8h&ZaJ>u/*5eN*qBG=i45::Z$T$De/QBLZXbLHT\5tDh^lI#m5%t<%4?jecY5d+eZe9A\E9qHX98C>d4
a%61RE +yhm*R4b%&?8IRVjc?n69w<d@e5!M@nmwN9\Y>yCuLS!V>Z45<#+E6:amdXZI$N1^4iZSAbpp6F>@XlC
qlQhhL hp%AlHb>VltZE+L:NDt+cGZN^VLHLq=B:EJ@QCNK1I/46/NhHpVW8%MINbTn+b^/<VWn+&Pd8#+bj9!%
dwkNbE 6iiXY@5u^w1ymiT<:ptVHT#S^DStkuLk:$LmAy^SqtyXjyn:jh!>4a+:$?YLd:J!dBV9J<*@?6*#^1Fe
V+H?W! a?TiR$dE4>6:w!JDB:pWbj5^1a/L6e&uFW8w#A?^ZR<ih<>PjW#VjbDGL:>=Qm?a\&+Iqnb\Q+81>^Ij
6FMH+N /&MZbZ%/h:Kt6N+t?VKlyqi#QdP1jY9ipeAn:+RlV^y9QTwnCYdYL=&9y/khd$n!tut#+?KZ+ei@Pj!c
b9ZpnW <@FkmYNC:^Lh5*>58<d4:6/H&@je^Ciy6&#8h4JleNN4LjiZ=+JEZdGa#99FNWWnW>%X/i$<TwC9m%H4
YKm9MM $PXk+!iL!85$:iI^I&Zc<@mi$C5&d*hYT9LTHM4!q8:1QE8jiS!%4I5Y5%HpYJuBiX!^IVY$lJ!$n$Jt
$cEF:c N*bRQNQJC$>@@64iX4yq\&jBiLC&cM4?qPi%i*69TmSqE?iP4F9ZNZ1\T>JtH@GQG@HHCWhLW?QKkN<>
Q1Wd:w bKh?QVL/aLQ=jX@9?Nt^@8X>Stq8d>#9&n/VnQ6Re<KC>+#=B?:J?eMlde>&*$m4uKG9mm?/F^ymCN9T
qplN%? ZY&B9L&GCS/!a1a@*GkWpDWp*=Q+Ke*m%E4D:<Xu6pdSKqh6LLF$jB^#elGY$Mldpj5bq>Itit>i<Wm&
TQe8Sq l:ElQG\?AdE@ln/8MjCP?*#eu8q1<8hAR*$<?@G>T?kT>5GwDcXKe:ji@n8!nXEZLJVNqyb4T/qTq*dh
JdEtp^ @Zcdu6*Ky&aya#=t:9@#&K:T>V<pi@Vtt^*j9^Y<WSLn&$K8C+#L&FK=P&J%?iS:D>6MA#B$1ti&h:eb
nDpJK\ L?#q>B8u^KZVa\jKi9@ci9?E*GdN\+lQ@+S84jFa?eG!cu9by1d:JnpSpd88/DiuhNVy:hl$<DKq%1QF
FKJuTP &M4w\+Gm>*?=J94uG@:=i=^6e^ZD/>6a?F>L?+NE/Lc98W>8Xj8G%$^??J&T?Vu%+\8bn?+?6X/B>yIX
<cdlcD ^pjj%>%*hN^R65LW#!NS961V&HVT+H8k<lj9n*a%+5IX4tG@?&lGZ!*14cZYLdt@I:HG:dn#\l58huc$
Z+&h>M $/!nD>+X6$ah><$#>P15MVPp8mh*FL#B>^FY1t\c#GXLHlZKh+yjh&Xi>DA\@Z4i*\!*NT^1S+4Qih?M
ct*kS& >PIX6?Kw*=pQmTHFiX9il>RhNK>!TZ:peMwc=@H$w&>T/j!B8SPLjKKNDHdej4F6h?6F4=HZK^=tJm/%
lilCKS PBppL:uc?5ww/&LMdwhHlQ\VJdu@tMSZ6Qc18mb&w5@aStQuZ1b$HEL+8iZFp%*qBR&bu!5nTy*c#Z?*
H46LiG q+^cQC8cc+>u@@Hb?8nRkaN4tME?E?KXT#?hYXJ%T^+:8G9DMcM5#D9jpYXDI\$em\5L4@*mEPVud^/>
i^@5Sa ItuN^F=yh&DJDdPhippF%*?Lhj%$<NTFy>knDF<e@t^S6WXytY8Q<8mX*a^#j&$y=DW6YZAw:iGbi>8M
aWEGn1 /ta8D=/p+HeTdb:hX5TuhXdWQ:#+^^yi=Xb%\D?$1?bdq&$djdJ8><&l\PVw\4^H*J5=\P8C6K=q$q>+
Ju?6#> EZXdPDiJH9hd<^j<&jVLiW*$$@!YaL?e@Pt@b9yQlpPiX!Y:LQ^*yu@#XP$YSJ#ajyu=^GL**!@Vpn1D
tm<6dj N^^8C4Fi/>#y@$>GdPiGC9tGqFD6%WW9=\N9jNdqYaPH#^:d9!I\n>^L%1!Q!Q^CLQC<*uem6DGZiH:D
4RGYdb t*L%T<GaHZQt>Zdq$pP%d+@lhjy#!J?Z6m6CdMPIXt8Ai6iiq@KEX^@hun#<nt65C#+p#VlDCcdk4Z5Y
?mPTn: Nb+i69JjCBZJi9I#kkZK^6!a@V&WjaQn<D+<jt=yqKBN=!TN=p$JQW^V9Mj*Zyq=#ukm66umjGJ^RNVT
dMFlc/ 9c:!*k*c#?kN*h<:Cw$&b!R%B$e6w5@Z&aP4nP\V#<!?nVS1njFZ:Y>eq>Wb<KbDY?9:y=#Mwt^wc9<:
8jk<j& 9LbmXYGJ=R8&N@HR?:#i9\QTX^JLk9J:>%8Qi&MX^/?JQImK#uXRVJnDeE/QPQl:p$6NV4eQwYBnS?*R
S#JkT/ $tjD>XGQKGMX4?y&=4>d&#PwmlC>84HZJ:VK#tHc1ece9?qJNtpM$@u+WM!#tw^Z4WGb4IDw:N?lw5DM
^%lWjB :*inVRq\TW+YYj#$/JKMjI<YY5dVkq&9T?ech6:K#I%=\u6eW>RM^j+=Ml&B9e/:eAj1tPDZP6qktjG<
nA*>E/ KE6ilTN8QhR8h8SqY^%ebIYSYF8MYeuHLEZJK+>MEVDJqE#Vj\tL:epp>CEZ<+B4Ql1*J%Dp&kqqA*\F
iatcI* ZKLJh<:WpK6MSd^P%$y@H$yZ=<9kYaj!nKj$Ee%5n1bwqqKlK5FT>qQNu^Ei%^44V/5&IKu&w8<LKnuY
cVVi:j /h@9BC<B4MynZyL*w6QLnp=+RCW^tkWYtY<5TqnYA!u&M!p%PDiu?1w6Ac$ud\!HRFiYKwwHt6188XG<
5YQ8a& 468EHVyG8&ul&l=eYQeK^#lStD:$<LH@#b8T#k@^E*Fl>=<**cbZYNmhF%S9emwS:cHpZmXE=QD^#uT8
lAbB?/ ?@LFXlpeAqDmCBTIFCW&lbp4HD@Tu91l*X&L$iLLi:h==Vy+Di<M/!*#GByPZZ:Ab!4FPbc=wjBN+hA#
QjMZ^9 Q?\G!9VG^jI=*!:*EP$AuVyD6&PHBYTTQDIinA$DSbl@i*Q^?4<bdQ#=&^%!ejQ+:@SGV?n@lWD>4?tN
?eqDRR k9@hhQ19i1NA<H>Xd+!hq^PTFy\yVX%w5%T!nBj9t^YcaY$%j%FcXGIM:PMumaa6LMLeFkZaBYXumNMn
b+G*SD *jJnT>#tFci+B@6T!Vtq1b/m=LSFIdGb\Sb\adcqe+S>h4^NtTThd%t\yID9+SPXFBTY+VJQFJce+TaT
npNw!5 bIj#5!M6I4%m5@QD=%qd&$XT!cJCZk\5LAyJm9eLe5um8>nFFtW/=<cqb<LLuMN<@Z^E9pFLwkI6:bcX
QSy\h^ L4Y*!QF%TSVti/R/F*qHC4QN=/h\p^hR!R5#T9&>iN/ypwW&SdH#<p5TM%KqSeEi9p6!+:t^<WubKYtF
Y8c*BV 5SbTb=5at!Y<$LSEYPKibX$aHdSpejC!<G\+dpEPqb#t5!#Tc9F!5VSS/y4l8Tl91X8t1$>iVm1ZH^dm
%=16ec IuSLZi^4GdRpu5@LTpQe+cW&ZKG6qVk\!#ZA%Tp!PL<kLDtQT9b\uqecpb=h=Me6#QRNmZSe^M>aGL5w
G<ZZqH jqFbiJ!:R&JAGB^b/l4EFR5hm&\hq!eJjFN!:e!Zq1SJklJVQiNL*LM#@!WY<51p!WHb>wJ\%+Yywb+J
R%*VKX $i=?9k=SZ9#I+9ne$tZ?%4p&6qcLBbt=@1F8+Zq^ihKe?ET:^IYPpb:L4R4F!*$pXLI\#u#S$wACh*9H
?pPddA Bc+^Ta5<p4!K*AXJD1E&C@KCdQ!CHNKhuA5TA*\qj5kCL$qaRtG8FXha64kA<RlQTF#mY8L4SCZH?>nc
^9HlDF C@/FQhyHiNn+8wYXqLppCd*m*WN<uD$eLPiHluyHPmVMY&kbp?cd/lapnI>\llPR4CDjpPLF%9:C4Hpq
^jIH=y XLLaIu1SnbiZPNKlIDly$j#$<DCd+llS@wJq:mHC<AD:JC6#:$ZYmXpTN$h9L/uAQhp:$Z<SQ#:N$>@F
-AY$@Q 000d7f79699001202b3 Page 402 of binaries1.zip
tGQCD? MpRc=T4tW5tJH8+L*T!VwpJCE!Xy:lcY8aEq$jMhZh^hFwwqV9NVFtY:Lq^WJIK#Ew4!e=KYBwRY</Ie
^9lGpX m<*Nw<K6q1c+J!>j/pIq&@9/S>ypBjmYLuWwqm/I6:h\qaVpLQRJnjE1<9MSF:9PY=J6N*??5+jI9hA:
X@cW@Z M>4cITEu&T=Ap8Ee/St=8CncIePDTw=$lY*NW*u8!Y+JTW:i:ld8Zk:&H55ZY:nG?e!*<E8BSbc\aEtM
:c<q1I X?=CjwmH6+hj4mkcpSVqJC!Ie!lNYl!Z=G^NJX5:PGTJR6%njndP5#RMeayip8%yIbGKq6kqb+lT<kV?
BBRDNF QIqFAV>?1cXLXL1XT$l1DtInK4WP<:j\6+Y6uJd\51up/JIR@&TuJZ+PYaHPwtmyiaJQ#D^dpZZEM8/C
jqbG&/ QLE>h@qT\j^@CccYEW5K*Q^+mbHBKj>id^S+@/@wnS=<6@?1N*4\Zj>D9jF@+@D?C:Lu@V@CkAL9@\4$
%QTjC8 ij>:ChHd=Z>i?!?S:>@Y89+H6i:@HnQ$h98j%:1=i@@:Y9j@wNd%*&8X*l:@<%yZ4@?t#b:@=?FB4*<L
Wm%?Iu D@I>@\N+$N94@\kQ@9#i@Q<MH1SSebW1FV<ykthM1S1E*6t+P^uV/m=PNZjjK5KdNka?n4uH<R<*4B&&
GL%n=S nF*F:F1wL\NRBLa^C8B9Dh$dY#<h6eB*!^@y^:/?eqwj$ltdF*</!*NZhHh<jwLQu5TDC*wTq$DF5AXV
lPe^+I t+AX1tdSRA5>56D?Z@DkjaFT%N%19GhknZPV^PtY:?Dc9:^PLZ/#<m#%^ahq9$e6w/QhTTRDCmFA&K5y
<p5nwC NVZX1eQ^8P#tMC8>S@#^uTpHmLYuZ:kuJ=8eTa%p+qVJj*jhLV#=IB+R6WkP:ZSk4c8iuERHM>&M6L*<
Q<cY5Z #te=c*Yitbp%IjF*L5q41<FYT5>4u&8+>epnVjDn6+9Qup?e?jaH$R<RcNNCAw:A&k\nW=*A**QS8dWR
#u5ctt mWj*N!XP5X%u##t:*Zw8nHT:m^PPynN+JMYEpVq?RNA5\&QEVia%A@GtZ$VPtSE#k?>+wXyBhi6GLC8u
t%#Sjb pP%54aF!6k&b%>^qS&:9ddK98>/G5/^6X^%%^L?LZ<RW/Sy4/=*cL#ml6R+Fpy^1BkSu5h$c\XcH81t=
DehW5C %SV6&i<\TZ/$<ddH6TdEu$<^y\>bXcbDEqhKB=@lXteP*@DRjy^<c\?%pn:l=S%Z!P\JnTplkQk/VbVY
6A=F%S 8wMp\K5JM%hknJGYiWZY=84%9L+=ih\n>tayM@c>pJ>Qe&\!d*//ESZt#9nIL^^%6B\:t9ZL+569TY@<
Am!<#= hM^HQ@94hM#?\NF^Ynll*cbJppktX*WGcNEGeLRtbjqbI9%VX54uB:HL4^IQK1X$$6Y/JB8#C=ySILAq
INjwq? #8P%Y*nGNwNjHnZ@:iuWWqZI/1HCNtpl8yN6=e!N&H8<WG$l8<?t%1L6jSnn+G:m?9&bMIjT4SJEYG+e
p&A8Gb pDub/?GG9\9%A8<J\9WWMZ/aVb4u5GVMpu:h+@G&F%*9>=$GMM!$h5EKii6!B@>aZV*<Z&//I6Qj%lIG
1lZ+!\ DMQM%=%/*\Y*ZlAE^t*Gm*pJ88nX%S*/$qWTR#%XZyKIiM9$?CpWWmhH&kIA5pD@mT^h8F/8t=qW?cVN
*?%ZN1 k4&q866WYNMkENm>YhT%8lKjdq5AAML?E#Jt+tkWq9ZEy6SHT>HjKY=R9a5TdeT4T%L%eCj&*99e?uB4
bA!$GH ?D\DE=M$i1b/la?5R*@/C^=y<Wp#/LTb6uTjh+9:LMuA#+JMDuyQwMlWZ*tL6^BA8a\/DchJ>b?C/db%
<?$DXm /9+4W5ZF!$6^D$bVF#!+YILcGVhNNBeEa+JP%iEC?C!!wy^IpbT+XNhhppteCLB!QYck&>tRhuqCGD@!
ED^9=# 8up85CSIaNE\/#/1t8Edt65ic=$F#EY#PkcK8nV$ZcK8+n+Y$Pl&wLyd#NR&le\Pjuc4ApeIEq>uwWkp
?tZHiJ 8MIhCM#>I/j=+t+Wh*:9^hp!I&^kHn^?WH>1pG!WIZHH$@8INh%*hB<Lq6TQFX68D5^dH%bwh!ml9Dhl
il4G^u :14SwEC9d6plI#^b8dcVwq<>66&i<E8S:8RD<8<+>pj#=YhepJ=$e8<JE%uqMkD5KhAG&6qN=TpMJbBT
C$aDQA LcLkSLi1%:>=Gnk@/LJ6Hj%Cuy4nESVV=BI<wt$EwXK1FKi6%nRVlLM8/+WkK^6HaR?W//^Z45En1lBM
4lPeW? !ET<^d%wdl%:L#H\AXpL>mePnSNdA96?V55Km^*nD:BSW+EHuq@=8LlqWlhqF5uWjACD*HdlF4mhPnbK
Y8keL? \/4t$R/q!KwF#&^8L*puQC^\XE/QpBTTY*wB:KYWbYhJF/Akb4S:l:!+$ScQQJJqAMWp9yNAPHPMLB6&
%CwAuX %qLWiBFGYYBAA\Hd@MI8hTedK:68^V!CkA&=^5dK\PJcI9>Zey5?ETqNZAh@hP//:iEwd!Qkty5b&L46
:LkLlE ?Ew@T&b/yuQReBabca&Sq:RCPQRpW=l4^pSY8$kQlpWi<ZcnHPuA!IA:JLnN4I+:=A$kV#nAwP9/bVC%
V4NPdm TyJQ\LdqNT$VtIAq^!\:FMm/bSKh+Q/?Dkt@FPWZ*>RMGP>mWuYdFPi@A*SQ@a:G^dl1$aHKemehaYCc
%IyNmW ZFny4Y8^b:6i&\5!>+:uEPp$PNZIAMBEd^Lp#\:I>V1F=4wF$<?T+SED^?=tb>G+E!iV#c6/8e=69iQS
k^RTBP a@WP=l+Y@4+&lVSR!i<EwBQtGEEJAWqbY6qm=!5TM?8tHelNtu+mIdjN+QFblCJNa\dNLYSQ\9E+^XPV
56+d:H 16=<HYYKhaMt#i=8H=8=8iI+E+u!\=i*$J+IANI!q4E/1cMGu\umyMZ&cP=GEuDn/&V5h4hcmGkk#&YR
jhDa!/ ^yIAwRDTF:qH!m:^AJl84!8X/NajId8CjNCWC=B4>ljHXKEtF!<jnN6*=BIYK=+S<u1KeeA+B>bpauq%
VdDk\% 69Y>Su+%mLeiXAZZ>\/aALpj!JmSBK+\*!X\&MX\IItHYeb\9DC?&^VELY#59:G@1*DHKqYtF?HhCj8l
#l&hh5 :ubL+LW:YdEYH$C!PLIA1c!bZiE\JD:MEE/VEyP?bI@wLnhSVS6SpRuQAYAqP/4Alc\8b+nLA\*AGSaK
!R6dku uPARpWVK%M\!Lc/y/SM/1M9NmJ#bjHHF<VAh*adYiTw%RKcLV%PX\^BPEk5GAbPt1J<nEd%lGH\9n\hp
mQui@c F6bK/FbBM:bE8MAb#><>D$RXIlWumKn+LyC^Z\YTm>aY9KH/lQi%Y@DchQFn?Sb+\VQK%h\1wp55YV*8
LnjciB eSipRJVbCa/\La*RRjkNFEaaXEEqV%J/ZIqS1Xi4bm^$lL&iYu!SD4E:?WceH>DP1?Je5Eptb@RKW6j5
YJudDa DmjA1*GV5+:XTJn%wCcjJe%Npm6JtCDk95HneV5h/WanQDKpa^G9J$MH#Rdy4Rd+8Tn6XP?CZNdaAyt?
c4R5Zk G?qFeu6a$uIR:YXm^pch<KwJm4T*?yCmHA\B#Iq\n^##T\NiqHRM?@l5lZb#MkCQFlwEQHB4PH$YH!n=
\Ta9$K #YRT#5E5*F^6NL1i\J:44B+NNyTnGpI:H/y8#9+LIAX4y:e/!a<\6aFtRBjGpZ@PV+/5:k>RFm>aB<96
Wh4i^+ ecy$k4TPXlh><NNFehyjm\5CGySXND^Ra1j?9mDh6a&Iqq5SFQ%Fnat#m/yWPmb1XL>1hykj1K4GCQpX
*d=F<h 6e*91dIZbPENa*A%E@WElQ9bG4p6HIZXQMWwQ5hAJ\\l>wYCLt<WiFQqV!C^RT&!BZBYh+CAt^WdT^<!
a6anVw =R\5^NAG&*VXR#nlDKn/cI^5JIEmW&EVFjIl1SpalG?AQKBD6$lk4Db1a\b8NBXYMHZatyeu4GXGLGEu
Z*CQ%9 B:ZmCiZc*C%+dkQ&!t1/?4*Jp^L5bC+DVhJCGuF1&1<dKkBk\8Bqk^+!y/*!^KB%GCtLCLa!P\l5YVIP
#td+&< K4k%^VTqq&nX>@tAw!cQV*QSLR\unR%+!ERbn%Z*/AFNNPWlEBd4ciRt5kpKQIkD>86dVX$mJ=*5IB9u
eQ:??V <aqkQ!TDTWKJecVpYhNnqkkFu4cTJ6Np5w?jMK&ANM1Y!#bDJN:1GpPRb<VF5bSyy5KQFGmakadSbZMa
/JQ!*< qipQqbmm&Y+mlA!m$:Wtl+%pyt^lk*b/w\u\k1be!Hq*Zd@qypuMZbMnh$%m:y91QnIbG#N%8a/bMYXQ
<8YTm4 6qP+kVc1A4Jcamddn+ZKPeluAnSBRSXWLw/EaLAwnk*qc!9/6aB?wta6HW*Syh$\AAyIm4WE&RPchA4Z
6h=8Iq *1tLHkIhp8%eeDL+8=q8PXjcw^$<VXI4HNEVJPR>a#KKwGB!Jl@wk#9%bFE@h!kViSQ4dSwFGTc1&i#J
+=tWY: K!Dcb<DqGT9CKtEMZpakTMQIME=dR\hqda^SJ&@Wnt$^ayLLNk*mYaAY&kMMPw#\y9kGGkaANJyBQ6Bd
n%&dV? 5ct/ka:i81&&5+Ip6MpmAqm8K#69NWDCC56e*T^hq>8/HuN$@iDmK6#IJnHb+DB8kGCkZWGR=YIXNIIT
H^H+hM AbRFB1AAlJHnt4NEhTJB$$^T^kP1LjylCk^RT6RI4wwI^MqVDkNykLDMdE1HC*#^Z4:N?>kYqyl6JM#X
TYd=Fe T4e\kKiM%Q=4WAC989FGG/FP5nC1d*1!YH*Rk1yl/$MFiqA8lJlbauC/mnepXb$yRDASCp!SklLq@1&V
+1>&N9 VcdTKph89mq<ZR>M1kXPmF*Th=T!Xp$HE>Zm8JJ^GeKpe*hmwt\kyQ%8P+$B:4SBt$$$XYa!b=eBAwF4
5ERM%V R^QYpYR@>^eeGEAtR8p5aanY>ThpQaY&6n?pZtF1G/5DG?t4T:Wu*=kmtd4C+iMcAXFnlWh=VLRtqwjV
4yI&i8 l*/ARnbDHZdEt5@TVP6YEwA^N1@X15&tl\Z6uEJbPGY96wwACWWttyS:QIy&Jk$AXt6JZ&lND9m4Iw#l
FjY!/M hlbR+\5<^eF9<Iw&uXEJlL!aR\ATGt<kljYAEa1K$!tuMNZFywyia<$wuq6ukJ+\W9$yID=X&IFc4\Xe
8kpTYJ ^DNAW!YVhtJpw%lqLpi+paYe:8<y%u<*dKMB!N^YP!ljZ?NZu>=pkAy5kYEDWc5?>!FlcEbZPW&@Q56F
!Ilh?d I4SW:e#$S1#R*%SKN8APa=E?N9<HCVtLPX!PWV!$$TVSP%a*K<X+hSlYmGN8VPcyH6IR146RaASt&<IW
Z+CDnJ :BaR<eRn*H%a=VIDXEKEm4HRw+DJYV\<w1h=\aRIVHC:QnkPekp/wKibkpSVnuMW5$\+mcEkG<DqSMDD
1%Ib*D WTM\WJAJES66XAAJd6iFMB\E9cVjdc1a\DTe^<J%lpBHuP\K@9*%!C\uVKA@hbnFGTBkEFeDNb?1h6XT
C!bF4T :!TnD*nwR#NbBF@/K^=nw>>$l\hGkSjIYpCH<ImSNS1q&$Hn!J4%D^d#\HlREca#YW#t86LRSJLcTF9#
n5S&E= EV<k\1PhVDYNQppuci=/KT^YHb9TE$=^yMpM/S\LJ884<#GkE>Mnk8ic^qERjDHeR1BjH/J5AlTG+IAP
DqJ>Fa h$yL6lP4<nNWwRdIh#cWtCG<aCc4\Tm1APA<AWEymkeWVddiAk/pbyl\8>JkI=KKSwKu5aTnVPSq9Q!:
ec:=W= 99CFmdSSn$5\8bw>FyN>^uKWNHk64+=yBF5BkKi8!wp4jeBEXlnCH$HSSlQ%5iV$uYSlw1*Rl!l9y5Cj
/XpW6+ daZ8&yR8jjT<Ie!\BS>\\CT/w5>WGEaTP9!1QEEA&/l1&\WqJ\\pQ:kwVX9NIMupFNplLhWQE\%JB<1t
>CY4jT !>\^$q!M^wGnKYFQV6tDGnc+KLm>XX8NAMA$PYP%wWcp1$/t1IP^pC6i5aYEnFNAe/jaE!4+81i$mkQ6
%@ID8@ BQbjAaS<4Z1kYJtRCtHwMwK&EDWA<p&Rl\d1:#ww4KMw\M8iGE\%MyFBHBeFliM+6dAy5TpT\Ytj&CL:
-AdNqq 00096d3b5ea001202b3 Page 403 of binaries1.zip
*KAa=N q=4:kKL<4KiyA+D>:MRT+1TFLhjhWNc1T<DbVmLG/c&tZPt9e^ldKIWW$WXTPiq4Tyn66\BlEkZcd5dN
E\!i*! NXBq/!6ThBS!HWSqCG*ETY>SbW^6bLYyKl?ANGLIDlA?IM4YkyM+diY+HuBiZ$nBcH4NaDJbNa!BP%q\
BpCKi4 pV$+4B8^%pd6wNZiVJte%kZ9Y!yYG\PuhSA=Fp$&XkPphya&ppqE=R!E\=Kt/WAa#GFZk6DKAEXAST6>
$9phj? EkW%tZ4ednPW!NjMGcmL&b?c1JwC:PS*LSXEh1^=9?ZMl5=d1@WHDYhabm1AKbTVbSbctuSR&pSY%iC@
EXYS=@ VECcGy\Ram8?k<yD^wlHXMmEQ1cI1h^w#kd+mmc6P:htu9!en/XW+Aw<8RYwJ\PV5&V8LaycaaDe$XJ&
F/\yLp $/y8aIW9>FS5C4eQD#^p!BIJ5m%ZlZR4qR$Y:VPdhNJDK4SX!d4eAi!pAJV?$H$8Nk>65+HPc4W#6cZj
md!dcF Ki*JVMVHSCbtRPXtcwKS>ATpc1MBtJdJHk:/*WAbjSRGAA&FI<WaVmabqidnyi=W8A<QP*FW=$FqA%Yc
c*!+XT DewGVbZ^LI&ewdpPCm?*8Be$j:pkHN#CSjDLICPb>G!Q5w/GuADkCId1Yyp$q>!?$Snaa+<$$DZDNEWX
DThB%y GS\&Wld4Ca$!lCXMVK5YwQ&4ltML+ik1^\&KJLwKN8XmB1TJ8lkeW*aLB*Nwtm/C6IKFqtKW?Rb1B+Pj
:*p!^\ S^VFSu*ERkiy$IhQGA1#RjWua@Bk6k1kTY$a\1MG!8$plbEZ=A+1X8CSJI^!uAYX&k4FBpI^A$Zb$IAl
b/hy== /1+6d>dX@4q5Q4!6*EmG&>q!PqM%\PKtWRIh8EkWdjLIRWW/YYNpAuj1VR+c!E/\ES!4+WDHqya%kehY
y6%Z?m D#NbIE+HwX>Tke%kL\BMGW*bkJM:AaBkiHY9Q&SBp@H$J#?dIFe+$6$M+JWi#I6Dm8qCtG1Etp!8JR8V
:HX>A^ hKTiBQAPS*&@?@TZiE$hA@/G$$!\J>MN$<qWtSFVTVCB@uTdFBG+GDw$VF*ibKK!w+FZ/A1?NkySlIqE
T1/Gql hcCB<k+StDFR5Bn\p=QC:c@YGAY?d&MkdD*%D:%%CKV5y/9Hk9e<yRl#KZIcAF<>*E+B^m*I\DlJp&R5
$H:4<% jYEpFS5y&BSN1V8WlAHT#YTRFmk*+*b4KhtZ*XQ\Vk>*#p\?qP!5AAP%B@*b*adZbY?MwX6E?BXJ<<BE
LWkiWh R/M=p!BNJl$byIKbhB=NB@/\F@1=%@VyRahMyTM/y8+/wBNHIVIHCD1!FRTyBSq?RWbGhKC>a%6>H@K?
!%/6ey p^WnAJA6E%hkwZS@XbR^PIi4dCXMDqGp4@Tq*\!R>\cKMc=R4t<:l\i*kDJWG+lqdu!+*TZ!!h=&IK*Z
WQ+ME* Y8mky/H4KkP9CkM^j\HRXVFZ/aPBFTbKB#dM%qH@9T4LCci+w1?JBaF+R+$4TXuBEeJ+IJGtGKYl1*F/
*qlwAI ^^>8@j*lL!6ZL%14F#nC1tQVD6eB1mp>DjL@aP@Q\=L1**b^iDEnkwKm+lk++w\#tlw++w^nyGdkmLPb
#Rm=66 tbZXAkF^H4I!5<Ky#Ca#K!54HCw#K#W#//=8NC8d4c#d^996ib/>>@5?#@:8@j&?i:?@@>/D+@AA%#wZ
4Y#uXX F?6#jXmjhb=e=&ZA:NFX!AEB#b#CJ$Jm5I^iCLm5S/E16/myC\C>^GyqTDEWnAEW&=YA56Mk!S#TnJhX
AWAn&E wtZ6JCaDM@BN+&?ZNqC/Ak#GKaRpSRiJ8:pbYwpG*bGYCh4!e8$YW&ZIHCB@4m!LkMulJF+YEYKl#&*Z
#P!5w8 BYLlmuwewKQmQRZu:hnZwRtj*RIaTEtX+J9Ecp$IG:?ZDIF<XN<<S@ACnuN&H$R!?ulSN/KSkdA>\ta&
j$PNeJ JBI1cDXmG!>A19!i%5$5dYhT/qn#>Y5em\EZhJZpY8FK@j=9TJwe\MMjue*Wd/$^DPl>BEA*%n>9:=d^
BwC=Wl 1L#<Xi8CnGbF<<9e\>INdEk/X%Y>hXkn@cL4p^?d?9j#q5^9JJ!V4V/?ajQQ5\?!##$/WZn^PQS>DqwV
E?%>tj ^G*iCke<?jB*/G:1YqQDPQ%h$+ybb9JG1nXet9@wWW^u^1w!eX$uSIiLIPZ6$V*#I1TwL?=M+XZCQPhi
a<LcyL 6E5Md?:+tjk1j<w:KI>/h4y$S>8hHNMQ:DidjR/yIl!b^*cHtB5iiQQ=KYN%*qVl=$8Zu=?<<9Dhep=5
GbQ?Tq RRC&iu/QFL\16lIhPq%h49a/<RHi^kQuJ@eH^56h+TYhuq\>XQkTAjPe94m1jD:j#Sqi56iSmiCQY&\l
9b#cey y48:1Hl*#lSSlaL\@k!9c#+GNYLJ1W/KCuh<FBC&t6PDKu#q>y1/*k<i8yEaVH5*PI16a:n*P8iA1yLC
qAhwhq *eQW8G$#h?PiFnhHy:4Pq\d=YyIm6RLVI$w1/Xh+c^dZmekWi\@JIVptRLiDdW^R=ab*t>$+*j9iQjSq
>Q@X1i *@MqnS9F9?L4kKM^dqXHG#M+NTmPmH>k6lZMLt>6tqdjd:mkmCPbKttEpBkjb?#LKq/Y1=wP8m/=uLn>
C4W8ZI NtdSjYQT<CJ<nn8iZj6t?aquPh!:h^@BBN*nZt8EF!WaGGiAlM4p^WFL8NB%5Xnp^?c8%=V6^eTA6!Lq
wY!aB9 H/Pn5!@L>GGm@8qTPXBbKIGm5!BPDwDntZ&q*i<A=bTZu6pEd$m=4%yc&Zd:S/w&mN#X8:cnPD#LR/4C
^qii5* R:QeiCQyC$^C4EdT^+R%?CTqQHTh?ZunqBP<W#>Ykn=5NS/p6AnNk^\ccV:VtMy:%LR4eVHbBwDL%e+1
$?=wP+ QijtM$k9Nt?u/l$?T&nuZan+pQQHS6AawaMad><8RuI$WV*jWkch%b:Ke5/LWiHZENXmmCmMhE*\Ed<L
WY*?JQ p1y>ZNFW8QN<:#Kh4+\*BJ:*4Z&>yp5G?H\6MqD%wn<QXnebX&jP^5c6PY@>MJh!QihmniYwcR56Y%yh
:BEZP< 64tXwm$knPYGQZeF4DBDL<i41$$!*DBm!AQ1qn*6m>?Wh<wEM^pwlh%8b>*uH#/cNS@!w95hHPL*M%GH
!wL&Cj ^k*5D\4jjHwXKwj+GFWdWcKA1tTFnw+^yc?%X6ju\^b@yc9nH>PcEI^#4*==!kBDLY:+t%cnVX8eAT*1
n1^NL= LBM\qLwBA:TbFR$wkhL<Q9EkS<?9#qdVc6/%lB$IG<:dwZjpl+wYnZZ+XwALwAmP1=J>JF&X@w&HhS\W
Sylhaa ApJ:Q@yS!!H+hl58kIGQ9%XnYAWJ$%ckbn<<!XFJNhm=CLhkeN?5diij8W\ZASA8FKD$c>XR*AwV5%dH
!u5Rch X@86GCd%QAeAM*X9NK8<NijQFmDGmbqq<j8iip@m/+IKqXCZajy=9PHEB6NBP/tWd&B*ji<KkJEMR*?+
tYaEDG dT6h8K>P:nVHnRemE\WWbKIIJ=^R\$\&R@RGc/6^5q@A5QTuV6tQdc1L:/Ey>uyEHn*WJNENN<R$\n>h
Su<6P= Wl%hE&ah\e?D!8t&T8&DjkPME#5E^m/ti:Q6W8$wpydN$k4HZ/d^*aAcw?F<VX1\*dXqQwLe+HRi5DCR
X\BVF/ e:AGJ5QlPKB&NSl%V/<F94X1>6ZF%PK+/k?nt#ZHLX!mJ#d5tuD$E>b>6H=SWBBZN!%kp>:FZtj\$N:B
pQhid6 +R%A5QtajI9Te+l+QJa/$Hp54@VV&JtKXEQCkPGPFR:8Ac#EcaMdSW5Gu/I+%ce+in=5HbYp+J\!=lN:
*Aw#*A WL=PTRAQ4q?$n^b\j?Ew!!leC$6V*9m*:1BNbZmZ6XaZL^NY55CG=k9WqcWcG6CmaP@A=1Phq+Anb/#/
e$ZKL* qFwTnRjpAILZRL+GZNQwiqy+>NQqqhEQ=?a:6X$R1BbyPjEZYpuj!KmqIRpe6>i<T4wMtS6HXGpF&#Yl
D4qMTk NXi$D8hm$:5<@lVwAEQLYEEEZRPq/I?LNJkkLFdc?!++GVEipi5W>Xlj^h1k/iwHc5q!NVlwkbG^nMyw
hn=liC QW4bXcj:%JwBFdA@CJGMX=8hkw8@/5XdRVKXl5AtLS1HAPX$d9Ri==VKt+^>!&^^qE1Lw#SjNRbkm#Rb
TnjNnW aXdVJGt9Eat!ZbNj6elQNPCLw*DF<81KS6uuaTwj9iHC+j9KL:a8tm#T#WWAancjK8nDwbhTL!4K#RTb
:Lp#wK 8^I8J@PXV8Hdk/+9/lKj8t@H!k@wItK9G<WA%ckHaACER>b1m:hTwS\nMC<pwCH$c8Zcn#8RyHb%R/9\
F9Gmpc 8P<qjBAw^bQna!8A1ZSI*nbh&ZjDb@a?9?Swj:XY4P?#+QNRCN$*$ZBlV?qhKEHPc6NIEt&w/Y:GDm:M
4e$hBT I+j#IEy%GRFCY1#TdLBtuYLMdIZCRkZpi1q!SXaTi9ZI*5Ip=CLZ%dk#GAKP^9KQt?@1QdSuP<?mY1Vq
#F84Jb 1TEmF\G:&ACP^%cF5H@wJMHQTTj&=l+GAa^*>9t1<Fh^A44!m4ulwDLcnCe<#*&\TQ9tdIl+dXtjPkD?
pDIktu kCk^Q/9Ti6jLm^KY*\VZCA>ZD#!MLp%<>eNTDKA*uX\nVcwAmuSkLIwcnEyZpt9ikSXb*QQJ$1!keQEw
YMW8NL iVpBbNeK&F=c1w$h8p^GJ8GWn/5Qy$SjJq8BHtlBLk&aplIj4/%uBP6/w@Y>lk9$Rid!C5Gj1yM>j>Zt
b\NLpI P:1HDB!@m9T=FI=ejK+/wNnbCXHEJ?Z6:!wHYC8G+tQK9:FZChAZ>I!+EjCYS^A=EG?R/KmPJeDyX&Xn
idj<:$ iIn:Ft#QI:k@5A=u6G!FW8R:Rj^t18qJmewj>I^ScL1cpLT&dKJbR#!m1hL1E!m8=c4CB#:c!DCBd@Xd
yqB:Eh by!jw&dCt\=989%*>=hHH^?TqYtwmAShB1Cq1S1!wXJt++=c#NGjNV+u@yARMwViTGDPBK4Ri1Ew&y@/
!8WTH* FAWTGAA%4w$<MiCl*cTL#51w&p44\ibWNM*GjHB^A^w/8iN6/FD9?!JhJQpNEl!Q5Qd4:qPV@@ldSTE%
e>T&a+ <t:MALn6!NJFQ&%S&6D!SW@Z6\jLq9>Yam^G&\+YXj@<Vn*94QLGB/?&&K+/*Nmn*y/qWWw4y9tV55+6
!yuJVT XwqpBEBlBP%PRm11T9w5JiM+BF5QVq5F4W$GcCSJ=<<1RB<YGATm@iEL//BjLRG<y\n<ib=eK?K8K?u$
wD#n+1 l8XyA?Y*qWkRBN+HJnYH$YQkNP>>^iw>4+Pa<!5PMV%JW5i!wkAltC6A8&4LABnQ8c^9m<PMDMZhXq1W
NY1*GP m=JS+FS:8&:hW5Y1<t=aKd+X/KRk/X:CS1lpbLPEKwM5dwjppW:#ncH<DekH&bbHB<</RIYNCC9FC4DQ
<6RaTL ETBNh6i1m:56EPMEbBELL5MNZVl@^jI9&8tqX6*QdeeCuT@?BV/+Dci5Em>CwDSu+dliKb$kAVPABSeR
PXl<j$ u\y44EaA!pCun+TnByjmWZ%J<L:6AJ58GqeHc9qCdp#JMkQFVlc\nEw+FyLP1k/FyqCamc^NRw#wR4?c
?<PH?X DELRMME9BN+iV9KE6&ewWRGkW$jC!C^hMC5B*PAMVd?8JPdT^86=?$C=LtV#1yL8M\JGBI\NSSX6Fw*8
5R>=V@ X?QIaGnV5n/DE9adAeMQ!dGDQ?KKkK#T9tTR=AGBhC9%1bh!6DBA4KVY5XTlAYMuwt1DqJK*ZCG!TA#>
Ln#4t6 Hl$KhKJG8SEC/!cYLpDAwce+NlHB%m1b&T/ckXj&?k&jHnk:HGDbeQBK=Jjlw>&RVn6#iyNPuma\\yZp
<a/541 tXX\XYH+jRL$h8&uP:Z+/kI?=Z#6QqEiB%K$D$JjIbFlMABVJNZSw1tZp1BKZF*wW1>Qeh5i\AC?/Ewp
NW$\+> ZbAW9ct+aXeC=CMyG?C5ePQNEkkhB=eyI^a5T9nll*@5hHi@/FPSGRn*G&8@MH\SK^$9RCyRCPpPiq/6
q6:k%: 1H56i5Ec94kcaBGEt^j4yCHm^lD$8A:1@DTA#9RDcWL$StSnAuyG6:S9JZye9RVNEcDn!4lGaqwN&Kpb
-AmnJn 0006ac14678001202b3 Page 404 of binaries1.zip
#Gu&%+ Y9Dm6tnlh5QL&?&9dt?yEW8lkt>@k8N9qEkAyFMN\pcJ&D\S%\a!k%Z4ZAH>+&ey\\dY1?JRc\P\AwZT
Ddwb9k VIEq$Z@>!86bQ\iBjYK<4bD8n?\#FLh$qPCDDhu:\QT:a4=uKa%W\4d6!M5TM=wE4EeTV8d9BEayXAXp
LMtb1H QuLqhcY?cNB4E:\wTd!kJ?d1Ak1/ajhFGFA\$cE#eWb*+14i^D*>me:euh<K#bcNT@9\p9S4nT^%CTj!
CB94CH kl%JnHeCG%hCPV11m:wu%:hDPEaCX1JabwCkuB68dk9?I!NR@jLaXh4ajwhXbPD/ictI6E4ALwLp%RF>
B#yGN< YikFQw#%X^Ykl<T9p6D+yXSXJD?:6BFSCpIF4BVkERp&9kbK1=Lp^aCAMW#BNWG9RZTGYQZXkDT%1j<Q
ip/m%G +<GyBXbbERQb^=M1AlFwI&RjhESiJ<dHY#Q1IEe4!!\9IiVKR9p/pARZS9&6=Q=4t1kPA81tdKNTcW\J
J@VJ:w QW*Wb^4B/WNT+>ke>hIbbe$bVimCN+^4:5GBmqci*BYJd<$LAi+t\Dy#Rc/BRP+9Il8Jpq5njq!WLAbi
!jWH>% :#\9KFIYMJSBqwN\9FYHHRL>>ApAVCBehXm*<R#dYE!Nu6qam8RWmiZ^pKLCWn+dKZMwJTXAF1buVDc:
u=M%X? P*\$54wbcNEFh1?FP>Y5Yq5dccRMm=&:KhXF!B%ShLW#iBuRYiR!jqDE+w6c$\V$LY8YQ$BAJ%lSjCp*
k8CPZR GFGdBF6Emhe&Vt!$DdAcc/RGRwdCqS8%T$qiydWp5DML64kYGlRi\JLBmwylc^EXaFHyRm^CERwdTWPS
cjDNY> :PJpliDdm*@IC=HSq\VL1TYA4uk!?$ddy@/X@L8/TlnIjcS<1#nVFKtAATQlRP89G=>y\j&*AVV&BNWH
5!NNW6 QuEd\RqGAatTS^9S+?FkQAp>VpjTDM6IkTlmLuwBl?T1I8X+$WJB/am#1Kj/5TLCN@=9bCebqD5I%=>D
:XT@!6 pkJRiBJK/mME%!JMymC$/QcmG4HV!>4FMMqCGGynaphJuS4ZS%lpJkL%IPQbIlySQA/F=c&CLRTKRGdA
H*uMZ@ &*h1GTb:RAl%XmyiXEdKEKXK/+WpM/EJRwLi*Ja*JcBV1HtLMFqk/WI\WywqAAQZQu5C6dkhj/d?bKMH
=c&i:6 5y8DHEFLPMy\GRKCD+JLm/BTE\HJR=pV+6e*QSX+5pT&HYu5H?q^</=G@iyGZpqi:KEmI#kuC^JKII$#
X9dNFp 9cwe+$*1%ml@KkQWld=QIHIQCH+HTGaLyQqwlhyi5A=K*:F&8RbCJ!BthkAelGScThGwEnZ&W>nJFhAL
%SMnL6 ^SQ?k9HZpD+nAV8kBCkT<18BVlXaWi*9K<:Pdl@^%Nh%6VW^=HwI%^icy^w64^c#hSHS\iXwJ<H+:/XN
8q6ZjL I6lhCGZ:hcS/%TwAJMuGepIKKqAk%S?%K%ne@/eTY4%$Ie&cZHmNH!SyVBbjhpl!uI*B5@b#AVmdBP*&
Ri?LKA KP*$SnYtC&X4T\Fq$hXw>A\YqNeCmKJ/@l4^p#C%u??X/AB<kRd9VAT=hyImj@l!cAqjF$:jmP^em#4L
R:%8AR l@N6wa$8TK+neNd^EB$CR?5@PjXX4<kI81\L%SGDkG9y?Mb#+@6E4A&q^%>XPX5@Y>ku+1MBhpFyZ$By
YQ$FXW 4VbTd9SRWquGZjGk@^c9y^81kMLL8\nTalmJD=6bI%=\BbhNaNRhMIdBKBi+RZ/L$D=PicNNt%qd\m&C
m8<Dp% Sk@HHnB!6^/1unGBL<cJPRaq>AIw#WSAyTBG\pTh\YA*Z6S\XuNbX!##F9ILM=A%l59YpCJL=IJTaJIe
uJc#?I ^>cEHYlYq6bLTNFRTn=eHmRGXbF=&mXpW*H6DwF$DjlIBRAay^aAEG<MhL5nyTT\TF@9iZ!KQEIaW#\I
u9w:Pt cJ1SpY6t11A#bFS6IlJemYyMkHDT+EWbyZTD1^!@^IX1AR>uDMAEuWbCIL=E5SGqIADLta*:/M?:c?dy
$6kDY: hWmTJ<CIlVFYCWi5wFKW&\Jc\uBGwuiWcKAEdA?WjFNaLW^EZa*1D6XRN\L\ECAQAuR1Je45TlhR5HE*
6J^kJm BM6ZVC8AMIkIpwtaHCjy>yJR?SCy=u9pGKR>\^u9WwIPk:EeT\NYCj5mRi1PW9b1mH!NAMmF5E*Eua=I
%NP68N aEMJVXhA5^ZINN>pQ+F$?&d>H5yqY*n\$F&dt4P%tlBRZc#WZFGpBZA6BI$daTRHn$WPADBl<p$m19=l
d\ybqN /ki6>uI^LSAk$cBkEdVI9lT6JibR^M5P$Mc$Wu!/CqIu$e>w/Ld8HtGSlKT/c\cAFitA6eqR&ZaBHw:5
nBVal9 %J+k?RpZEFD?Xm\4ADpiBKY6l6ZKWGlt@tFL#CJGQJ+G^@EQ>JpkF1MRuV!a\1=$B%C1+EPLwBBTluAS
KE<a<! Amy+k8WRG=IK%MQma?i?h/<9AVM?DTRZ+cLy!<%*pe6R$eJKFYCjSPe&MK+C?VMaT4jhK:PB$4tknCj+
1%<WLb $*L&BJdGYAhn8AM@wq5A1GRlF4=wL8lERS4JTJAt=lNEC^dRwc:%m>/IQA11qmtm1wAKbatCCAQn+XV<
S4Wh/6 :\tG+F6AF?%EVb@m>h\*me@pD:iBhGWpM^yB*mcaL=ZWK$8+TWI\EJDV^iMMMS<QZ#+n+MVG1&eZ#J\V
:AdSw$ pQb<+EW99b+F$SwTt*AwuTL+hW$aeINMX>?uCNu9In4p*Rdym^Ad:#dGpl!Dj+Kh/uDRTnJISZa/a>B$
cpDPAQ &DkePw/G!duCbYmy#Ce!S45MMIL!W+D>JmDh6&RlF?RpC@qiMDBc6GAAt\tT!I#i#6StL>TYFK$ERDdK
lwuihE A!1XApIFHpZCq/C*REFMTXEBSB+M:>!Mc6\lIpX1V+ckb>Dk=S5tNBX!WYGhNBwE6cDL^bB^qYS!Dd\:
wtEQ>u Q!9QX8S%d1\8Y:lkJ?^dZWLe$anZ8PB<<9Qd#YiL/QBcApk4L5*VEDKcWHqP1Ea?VPwHL1Ip%DR+*W8D
=nbJun 9+JaBMBb&TIFeq5ujbDDE+^:@y=emBqVTHCL+54Ey4*uke+Xp4^A5L6IRqcV5P*k$6ZRbT11Y\6YT^Qe
aYApMI ?FHB5SdMFI+ZJRI!tk>ZB8PmN&%^BYR?eJbQTcPbqW+ZnF!IqKNL8k&q$EaXCACT4!$:p1C*a/6c^yjB
W%jD$X cTZ%e6@EmcJl@Du6c9?pmc>\mc>G$I4:bQYn?8=XRNtM9*Pu+MtL6hWIR<=I%Jk1%HJw1PX<$VG9<PdX
D5%#!h bay9LiMA$B=6:!d&/>D#:l$K@?BFEu/PSnAR<ub&SybD$<+K@+qBN/8R&nEj$mM<?&hb%FQl^qNF%i6$
@SY!NB #WNDuP86wHERydupFt=YV6jqu84%9kyG#e:SFMb+W&1THiKY%?t>n*=qi8?:Qhndi$9QLQLR=K6Qdw<L
F#$eaw 4+hCIK:Ve4m8jtIq$QN\MaXWPdpKe*!1cS#+Gyy5A5kG\m$:Eq>=hRmdFmEjXL5i9Dt9@^P%Ki*y4Yn9
NiDVNQ BPac&9IH#Wlqu9Qbhe+&mX$kB9HqNKMM*\R:4B6q8Kj4p@N:h/9^HE4Q5d&GTaJRIN/apD1A#h/hA4GK
lJuK6w \4XJe?/SD5X4IS16niRVnF91N&C>BQeADX?eKFK4F:y+ACMWKFY9F!pkFpEP\G\C9Nw456aEL\jkpdCP
jicFj4 mcY%MNpMpE!RL=4iJ1Y$aN:=Ec#m6IQG4bJ5bHeeWnF:Y<91>GX!\t+t<TR/k/1S*CuMFJAhHm:Yya#D
><PhAJ YhARGnJ!?C/&h$!bP??q69@=alaAT!EdctuK=aXK?@FGQ4E?6DYQLpbP@YT!:%=h#>DWqLl?1TyNG:ew
$qD8hS F/dP%t1$=kR<\yX=#hI&C1@VMTly/<NGnjLT^y/<Ym1b=qDyy?Gd?8CPQR&t%mw4XuiC4IuS5tcNdN>Y
j9JGn+ ClIp6446hh8>DlmJ+>d59ewy#pikG#tJbaX=WPQISH4unq&#mdFVSp?j9S6X8c8l#L#bcIQ?!b$wXH5V
b^M%u4 >Db1nenJB=%1yPuu!m@SM4*4/L4Zi/iNiqWmp=wM<<@46>aS4b<yRA&lF%L&wL4^t^FQq*@bX:Tt#/5&
ZTTWD$ 9VA%95N8nNGbtZMnR?\htI9IWCLQqdkPSuH%ThdjjdwYwub%^1jn6PEMLWWhZy5e&mAlAabcnM=/J/e=
bV/i$n %4KI#@G5k:imBdFJ%jX@MMmN?!/@W$qwZ1E$&M/h?PcM=p%PcS=MGS$W+yIyEYwNDDtjw*TX><wW$y+*
$?Fq\1 :*PCpV=MWW?b<IwT\t<WFYw@@iCtC+ju9^+1HQub51dMh:aYAt$b:%<J?wdDKW55PiBVI8/V?w9n!/%+
&ZJ6\t +mG<ZkBWHt:w4c:XbP1&S#Q9:KXIuy!$>i+SA4tRT!=:*Nwjh$n@4>#G:ZZjj6Eqyh>:B^bbahlbS\@5
CHkMc: ayibuF6Bq56$RS+i^&KapRSL&?BAJh>4GaQ$mw18GmB:Ttm9IcA$^\1qaK/+/d@D4%X6:*RDW$T?RiRC
K9a9Lq JqlbIEcZhbuaNZIjbYjkmYchWR95@TD8*p/F>%&FRiW9<L^k%:6n^1LWk6?JD:XA%K<BkGkuu/eM5tRD
pZWt9Q SQupyQ4X#kGqJpj#59i*9l4K+K1DRAmYek^Ru9&w5^9aaJ+1W18JIYLpjFD:cTi?BGnZSIIj@NjZ&@5q
EERki\ 4#cWBkXC&/dCc5F/F*m*cZJm8=cLk/Mipn$REpDPFLdMQcyj9KnCAPmXQY48*k6KP<M4J+ZVWMLXpV?l
k/\/wV *GZ6m4!H1t&EjRVDcFD<iju6e?P4neQB9NL\<q^$u+tiMSen:IaDA5=?bWwVd&^#d#TtG+JVFBtAltlX
Jjw$Z9 +XK@Eyq4&JlIW&cAw/nZ!$II&<b8WAyDe=M4lRNdqAHbmYbt9=tEuHm/yQi$&6B^K%G6MeyARMS>pkKC
1KbG?S mPbLX/MC6p@5h8m?XwKlnuXZEZN<Dy&Ci@y$+B*WZd>DFTK5IN8k41DR5j9CY1QAd1mY+S5Iin\aPhBb
yHE^Wk l8ACLwJ!K/cjZkCSiT#q!N%AbTm/V664Hk1P8:6Am94\m?MqMHtCCuJ<FZ!P6Eb=+yQq!#IqYCnpamul
>HqdFh CREAlwAZjdlTwAAH=#Syi^&LRy@KeZ4NeEcjH5!i$aWjH8amwFPP\NmeQhKZG/c<=DZ\AA?%F+NM*RG+
T=n4bY y$1*H<!9mLbCJ6hAE@kcQ8SAN\WeC!F$B<GKlJ4Qmm4B9Hd5C:\j1YRtD:8?&kQw$\ZIncuA?LDBXZ+a
qqcTb1 qIt#1Ch9+/I:wTV:McMT<kK%qJ8Ab!kCpYR?YeIiXya9SGK+>yyVp@8RR!w*E9bN5cA#YVlCehqM1=W!
m=TNl9 FDmk&ZH6<\\q&DF:@D4KEG%#1^bAMl8*1Zu#qW5HLFd/!m@@@u\a6C\:X:1R1#/Z8BHAb!lBc4>1p1$M
k:5Qwb aN*6>uK/wTyd$cp$RXht*W1:AB6PA@N1Xc=^ByRkXBhl5d$9qF<R!h9eG+H/$/?#*/VhXa$&9!W%FhF*
%TGiRC RDP>W$$$6KRqL11HEW1NYKPn9*SqG5mp?EIb+>+Pd<y?FJPL1Pm8R\5Yp>ZqDZ+qy\#e%?Z+Aw!^BElD
lPy\C+ 4>yXe4LYW/pbe9dL6D4WSKhN#:Em>pt1kN=^ASt<+jc*ph*kDMcH:PQ//PcuR$5#db1C=1PXlKqRNFqd
VhVVA& HZR$juteQk64*KjjKuXX6pedia%e^=DiCLEVD\pTjKPcDK>eBd=Vk!*jJpCwkuw<wCZu&?+yH>PZWA++
mKBm+$ Zq>&^/Z<+j%H!##FdkdRH:FaRLCQ5RdS!<^ER#6Y=buc#q??l:R*GCi*a*RHbV8kAMeNpPXyZmMu1bT>
qb59!/ &JT4@?!m?Xa5XLBIKYGi$JSHBiC>6j*&nyidDm/jJIEAEZ61^BW1=i6T#lZ6FilR+VQ:WX+#&1IQ#<tD
c5l5W4 *LXKZ/jGqdqZ^:+ihuwPh9&1ZN<P\b%Zknq>9ql^cqa>JLkW=tLqnV#$*nW@ajFqQ*J9!8YYq5$1:*N+
-AIT#& 0002850d16d001202b3 Page 405 of binaries1.zip
#p<>1i M%8F6eZYJRBbw@dK+ju>>/i?=Tj1QI%TX?4?wuth<kIA>q>1a5M%EM5:>Yduw+S%I#kG@c^P&$KG1M>*
cJGVWd 6!M*TNX:uIRbh<e\FujCuk?:dVlwM9?n>yQ!9HE$j:HcE<a/m$k$lkqBn8=%ll>T&BCwKtBdC+wAGNRX
4DqkEn Q@q+>b8j5q91+DIEp/ie:NF&VkuC\CnJ*&p#<MhXlw6%RSye:!4=H6CY9E+TGE8X#Bmw!Tw#Edj!jPX+
i+#mt= pmaZd!Y5nTheqj&N>t+uJ\:c/+Q9*@:<<<yj&IQGhq:tSIIuQ:1K+iaGyW9\nARNBqqd>lA@kEj#<NCc
9k&k#E ckDkcmS4EyP<HweiY/#G9KEb981&PeS<1Miel5NZRkQ6aC46dcJ+tQ!lEmRiAiEV!PQ/Xbw4AVk$WW$b
kt>j5I FKt&YJ#uAkm8wc+Mk&T\5IQ>cIFW=$Y*dnZZWj=P6!XBh$APpe$dDA^nFR<J=A9ay@9l<Q+@KNWRCL^%
aLuPa: 8Qd<Y+P@KjpAJBkJ:t=6WXqM\yKHH1wbGh8*cQ=X5%Wq!NmXp9Xk<Ztlwl56iAXqFPkwI4RG8FlblD4p
bm$4ll GwR<y$LiAy6NXtM5+?S?8kBDl+\>L&6Zu<&AJ!@CFa%EBq?QVCLJ%M:Je@B!HSJpGV1kkt9=yc<\eJ?L
ncHq4c %T46m*!4kmPnXPbMEcnlC=Aek%\DR@A5jEBNk:EhAe:hcXuWQbtQ>hFE*4JZXLhyL@45PhYtW&Z/y8+p
wTkYLq QM@mJt&XduIWXJAAMC%I9AJ6Lk5q<MIPlP1&hBHJM/mYCC!*CeGNwR$RNTuX/6:PCG/9AStNAd5$b4u1
p=1NYQ FA=bjla=MIJSQFw^$KM@i+Ek8$!T@ad4RLqwDPM5ZQc^HS/KbjkF\tIRJ$BDmIG8QA1AENG#6dAYK^YB
k?^HTw XF8Y11LAEtZdaX\?ADFRNTRVbW:K*hc/LD@F?qM/?YLhu8&K$P9R>dJXVB%ABkCCKAVnmc1An/CekHH6
+^F^J5 $YA\qCjEk4%\\K%*XpSTuDkKJWJd?JCBbGWRILSa1XGGMjJ?BNhGmb!lJu8qAm!lGXH1<4HDm55R+CNG
n^N/+a Ea\IWeLMZ+BK/=*MTw&>DQS+Nec*=ET=XB>kI+e@KkCA\P&q#GyP=H%\XQh&>GwHIKbR&Sh>Sn%m+Aq^
ZXyQ@u +PFX1CuALAdpIJ4lSyCJhJkHy4$5>PX18yEJlJbFDbtZAjeA\B#Sl+^nY^4XbVq\BR*j<kbBu6S1&cIc
Fl*#WG WAp\XbC*DDDMc6WTQ4upBG=YDhGm1eVFIkY%D%?#qabMpaMuH66Z/ER?$?tyj%XjYbqj+uu:ythQebC5
R<kmu/ F<X4\59n%YaL*eqWtA\pCin/IB+*MApu5\!a&PN%QV=kDJ/^nCR#6Ah5mPSkLew*VRkbQ$5%EIS1Mh>w
@PYk86 Q1?kpm&IXRa4tNXRBcCmKMR#GqY+<^1Wa%AtFR</w\w5aJS!i>B\ach@AHFukJeyRn+KJViy#idha*!E
eFYBBt kSqw4mF!>l&JuAGn1KDBXJJ5FHq%$pkPIAXRuDSBX*AC1h!5NFCEAt%IktHqq=YYd\&IpHcTwmlB%p<W
eb$\p> cP4LG%T+c#CDFnDidj8nP*WmQ/?/?>&#9w!1Xlh?lpKh:%PYS&nKFM/<eVkZ+Y1ISaJ1RNIJ5n\W4:Bc
iJkI68 IZ9y%Z=bH!A:WKT15:Fa\D?\yX=>IEFLde6I#kHqw#I%8i\eM!dd@G1W1F>V<en?mAj$nHd+y:?w$Z5n
b?6N4L :M:H$4^ZuTGykY+AwAeBetD!RwCCX44lTS=R$?R8/!k849ctwR6mHEB:%\GJd58Wiw68jKA6%aG$AETe
BZA>M$ a+/mj>?H#lbDA/J<=i*Rc??1q@d\NNX=Ztk>:qleC%&h^%GVAZAi<MC!CVW4\lI?GpGPwia5CC*Z>Jt9
auMQ8c mq=DEjZ5BAZbILMA?=wNIeeViELpy\SDtd$BM<K?JXAjV%q#ykY/<$Z5lk??8$#T#pwju&p&B^$l5=/w
DykQPa pwhRenK!BWDdaImy&<Qd@IBWyINACme9*V=n6tdApW5y%5@<y1&?DFeE+^Z^!9J+DP<mdq/JX@kmy&G*
S+6ua1 NlCqJ:kTN?m&thKqNBCi1ID1u=#TB?T1k8B:AhXElmH/$%u:Fm86%>>Y8EB6GHVh>paDkd*1\J$NA1RY
h$#AJt #NIt=uZBcu>HIBVGZMRKjSDAAmCa\TtkG6^SkkJPAu5$C$a8WZTIA#w@p1nI<HjuGQPGaC^mhw5/taFp
LC?j\P Z6MFA>X8yKJT:waZXpYePdLt4+=XL5j=G#8&FI1NpqIJ4W@\LjFIlX#4=E9ab^qK9q6=Npcnh?peA$$B
k4nElW XFbA/yZJR8L#9?%c!T8VQA4&jN<^4cpCJMMAKK:F>CB?H6GY4$q=AtjcIGZV85\6WMYeB6iaAGRB\^44
?iT#KP 4$GSR&Yi#mX<4ZMmq=NdPRFdh6hSm<L=jWGi<:E+ul=E94#u>*piPZG@SSQF@aXRhGEl8/E!b/VeEMG%
Hy=hp< mB*\W=a:1k^pK@?q<+M4kaF9I4Zc^H58qt><8=X$SQSqRNIZF#:D+AHBFA*6mpR5nniqK98MNFSDHQbl
p=ECqq *\6W=nwmRWu/b#n\MtC>!><%yE<%AhWE<k^RYGmBZ:?i*qFBZ%%:61b!@ZE^=%JEa<nY^8QqJ//Ye*Ed
K=mNjN Q^eiM9!Hyk?8L9@e45/J=9lj:iye/j?<*9d@@ii@F6!/@k8F9k=P@\n4SKQ>K$ZCD9<a?=?Kw6u@A+t#
Nwd@m& njl>HFec&i:*Hp:&>tSuF/h@L</P?d*Lj/@4D9&>ljaj#@@VMi*@kY?jp<9@V*#:1mwpMBc^N6XG6$wE
@twR<Z uSk8nM1*H<TPC\pSiF5n4CIS&n=GhNFT<VP1A\dL!VJ&b+qh*&mJlh/Nb#VDq4ME9&Nw<4mAQ?lD$\9D
K!#\*n =kqubEL#*Sne6KBSupk%jum%nTKZLiV*4k%=H8R:#6=w>/jjy1TRL=@##@=^Y@I>ya@6*a9N&%RS<AJP
kR$jeW yYQ<Xtit1t49e=kXc\ehKZZaeKHJ@4=h:XkYqdRktc6@!h/FN4\qaAe<#6Kk%KCSR\JbZ^/>j4=D4TZ4
hNj=Bj emLtwF=T?G%XqYd:i4V^w@N46?!LjdF4GQt14!?LXnPNGKIe#%DB/K&Y&J<kZh<D%cu!<A:CDmcLMPb6
yS+kC> Be%IC@9Pk?aYP6X6VA8nJX*ERJQudCipM:uLRl:S@?tTliZ$q*Pnu<c@qFiRmD*qJa!I5&Ka^dhbMXVh
MDql?q paTAaYN$^LDGTD*c1TTauu>RW!QS4p+&h9qKbZH1^I&5*4!^1!X6Vu1+6%lPQ#K<QW9:^wew#p*u+**E
@\uhFF blP&t?NVbG$5$=HM8@ntqcS#@nVY+qPWX^&TetG+B\EqS=CPj<l@bZeV?+hXnRMp<JWd4cY!<:#VKhp:
SZ5l>= q@EY^9%Xy@PX8&>%6@D##>DC&>69ZYXK$#Y:R:d\jBG\$$/Mi!WNBhyPT*m&XkBB*6pd>hp/VI5XHjEk
$/4wZW my%%#*ZXne<y8uw^N*eB6&MEnD:6&Ib^@1%8=*dy4ZDLw#FjuN=<Z&h$IyjPywc>L1wtZ69nI^1wQ9&D
jHy+Dp :#w>jTbk%hTZ?A*GDkZ66dymne>qy5EPudHj9YdHYId8S@Pn%i=W*wbaYT?>Wa/=paV#V@X>9e$&:iwM
Rj&wl? +4KPk9V+:HqJ=RE9ay#qX6K=i=P*\568EPQ@B8?<$Riu=<>#@mmL!$%8%J^/1pIqJlel$14V9jj4Sqa6
#JY<&S kYp%c%$Q%HYJ/:$VXp+hM#m+t:M?TuV8<V%c?Ma#=>!?/W^5iZj<mQXjXc9$a*TmckhPbdhqmVCCGB$T
Z=d#!= 6XEWT4S6:F?4R/P:<@8#lpbt#Y%+^*%/uV=Eb&4NZHRkQb@CdX6dMt+b6<+ecZuCGp^=jhJZy$wRCyqY
qII\T* jMXHSw4ddGQpd<a/D6!M?qH</$Lq$ShGmS?a*51kmq=9*GP:6V@DhXT^FT/VNti8Kh6J^!$KD!ktd>+/
SPwepW !>9/I$Dh1yWYeZ>8w5*4@lP/&?9wE^pXZE*JteHu8mhc@X$t^dAL*%SYb:ytQX8/hWKSnJ9/Q4lD5M8L
me/&#X @6T\>j:h:^9>6I<*ZlZFQ&#>qB6Rb8@SW^^i$YmVawPRWNwZl@+pW%iu+JyyG=^9V*qd5\T>hqahm=*a
L+%&/& i1jCXDZh9W6=n*R\>Hny&yhuF:lLD!:56Ce@Y*jlGXN=H%TLu:Hji@eZ<EdV>*Ccd:>#%=hn?4446+c>
IQmGeD jak%Z$:YuY%*#4y/R1@unJP!9lG>18ML/i4#hTya*aNq^/DPVk5=w$>je^HHZ4ubV8jWQipu<^C+^WE8
KEI%#% X/H?S+pKbM4PdS4+ME>+E#X:#Q:+a4b/iN5=i^5d*a6D6QpXQ1EdWm<h$X4>a<HAMZRZ9uj/hB4>+>/H
YmBbBb 6B#^FB&=Y9n\=6$GBAHZMGJ1<!1^&Cy/+5!>t/=&Fw>iH/MFR@:\*F^q4yi?#W?Te8QKnaP$@ZHV8X##
?R?1Hn !>**>I&D#G9DLHQaS!T$u^w?^@cQ&pN<P@Cp6aLnMi1nyA+S9?Z=I>Xa=ihdnmAD4Hmn$@#8i%QcHcH>
mia@#a Kchtwy+QD\l9GKR&AnVjlhu\eXc?d9n/p!&SKtbInhRnR^$Wjlw9dGItVmY<F%Z&+6S<TAabR?XTN*a@
AYmcXk 1>D<T?&M<aP/5pPZcKG8N+%&nm%\%=?K:QT69DjF*C6WyllGZe$=ESh^J<E1RijI6<Icm+=XTMtqt5HQ
R@JCGZ uJFH@iybW#>N4V6WWq@Xn:ewlie+GjM9h#4y^i*KmdD8?uk8M$9m\H8\nd+cQK4X/<aKGZP=>@FZ@>EG
F*TliB kpQpnbH:S:Cn&Mey*I$chqEFQ5Y9I5Z%H/8&>XLuJl:?eLI=Qt4k&wZNjFtyZ1/1qEFDmiTp!elVkbMN
5ed*MV edJuYctBi<<^#=\5hh/9tu*9bA6t@+Za1L#9WS6m$ni8dhBbQI1:*^=/F4#*9Ni+/>/c?QZTChi&M@8/
$+VkRL YqM:=qe*%HN:!jP/PhDdeaVN?>6yR<ZN^41=Xh@<ahACSaXXe&NR5Y/d%@LqCI!$RJL>PKAw$^%&6Dae
GwJ19% $9F#:^p!V5ieH@q5d8nK^p>cHNiVn1<^*K8I6X9mu@Z8jL<$<6BqH=ER+Vl+%1NX?:ySFt$mI?=#%dc4
1XWK6V <K#D?&D94=:W#neckyX!QR\PeS?e9@$M#H\W<Mq&ij%VuktPLu9/kDG<iNA6/6/ic5mKnDTmVpu!T/Zc
P>#MYi PYZ9F*$uDI*mIwS4N98&QNQ*KHLdY@W6!>I+d<=$/wu@RF$+qSy@kFLjE:/#9!cEDy\&@AJ$#Ll%HmC>
uleN^m />ab&:KXeG&X^&=eVNLHX/?Db#cteS@*M$!HC!uVEjp/Tb1Jt1Gud\+iuMRyleCm<9=8YE+j>L$T&ab#
8B<Tac FP>D/6w:+i@iQ<K>PWbK&<SS>L/Jki1pj%6@K4da+W4Qu<j!n>Vhd\T@SD#89jE=>jcD#B\>iaeuF^J+
!S&p+K eCwXy?8^%Z*%!K@KAXQ5*VpJ\E&?ML?N?LhDeKa@k=pJbAWPki*ZAyPV#SBddGyEc**=XR:XVl!XWidL
Sd%Jj< Lcw%M?iL48L%>dk@G/@?$cc^h6?*1*b=M:w$$@6qn<L1&$JDDZJhXBWQA^@Flmc5+/D5uG/yIHbZb*#a
i5Mu5h jJHK%h9C/RHb@C*EG>ic+EVjJ/Y$<$pZdQyLT&%!nNTL4J89dGn5<6yZjZlwm6cdyW>t?IbJ4X#*6h?\
Zty\eu @uLcnHR<8%X66<W&X8:+MK@\p#*LwqqjH1ycFS:Dmu$q9Dh$iTKWEHe#P#Xp%XH&:B<VGW9YG<M8YN!8
YtS5il 5</iejSHE>>w6!GX6%=?ii$/><KSnSuuB9ahYk4mZPlLtE1PZdGLa@X$5G9VhBj&Cij%y5<i@MGucuQu
KFuK:m 51M?S89jJK=9aA/WVG>5QH?tWPZH@t9a&WP^jc=KJR%X1yQe:>&>JnPd^p#9a$hnD\1Jukjdk!*w&Nqt
-A@u6B 00039bfa7ba001202b3 Page 406 of binaries1.zip
WH#qW? ?:$?Qdi8/BXM465dFQDH&M6Eb449&1S9mRn<lm^SPAL<JSIYaX8u#Eljc^c?Ze9:G<^@<1J>ian&h!=^
MFDQY@ IHk?ne9iauIRWqQk:SXnQnR?BC$T6X/\jL>FVK:h<X^+4!5FTHN@wjw<PnR^%V6$NEm&uGVwn?Im?V>G
!dSJR+ MN9nRmlAmPV4ncZJb>Wn\FJb64HVej9qN4!@My@Q8Lal+$h9/TyE6&VNhhQJ1&/Sm=&DN%qQMj&kGQu#
Rh8#H4 N4YLJ5t%6u1JIGBHC6caT9&1pReZDYNV86dXXmFN%?DG+=jT91Jy^E:yPXZcBRT?@89m:1DcJ^&bp*YG
HADm*Q MZYyG9D$5iLp=X^46p4bIllaTM6q6!#&:L@^++BFAil#%ta$K1<6aj6RN^h/?>yC/#ZYVHhG6KaS@eVL
huQm>W X!$*/4?ZJ^?$#pLA=lD6Mhb9DQcu/E\hauicab5t*Dw?FFTYt&l&#u<X<+<NJclRe\=>KI@8T6#+>wyt
*%#Mt= ?9MA=d%c<QcV:it/h<+89Cb**A1XKb=IM>>eCSm=W8F=JI^?SMFjktFc!j#Iy@a=66J:E^>*pnP?lyZ9
NpMeeR QFtlETLRcI5h^ib9+G<98:F:>dQtZ:n<cGu9PcYQ<WPJeX+9X!A+>>b@mbnE:B#=<T1=>uH+5WejwS8i
T&MWRG &>\N>?8ii&Kh</6D?BbV:*W*8Mm/!!a8\n*%%tMD4<6myGE>PQNR1Ze/\G*:>WAcX@n^jh??G:*Yai??
*=TyJq YtXF#9j@+8ddHDPI4Ju?&Yq\:lmI\/M5dX@>RD$tVS::aH@Ny9QCtljPM*+1j+P=iqckwFyH=VCJdZ?I
:RNWj8 ^l$iNP<>GhR/6cllp$q$ilH:bjLJm*L$8hQRD:a@cCtP^wt@e5TN69Zdd@WIn@mPdAmd@*uH<Xhi$:bJ
MRE44n ?P=/qP1h=nYLGWtqS5y*=1YyD^!=<$:4Nb!M/A=*u8G1w?I:C+db?YJbc4up91Qb<udwRk$N/c@/GB>p
pIPDy: eeX5d1H%6WNKtJ5/\*FDhhud@9nVw4M56SiE!uK@+Wj9hCIbYe9Qy!WddnyZ$:a>e*9HiIGyV*!lGtZ6
yXVhYy eBWXQB>=Mpn*qKJ#MhB/6PFiey+m6&@!X5\NpXVK#V8H#%^S8\8Xbp6RH?:wQ5KwQiIK$@F4\>6$Q*Bm
myWEI# eXV!*F\M4e\TMS=#Zp=!S1lSPj%y9jHeT+KC8:%N8GyISwG%R:#QGyeILa&XjRhZ?TSG4SLTVeleE<a%
WBiC/d d*KCE9qlGEPKt\eaZnp*Yi:Bd::hTb/JMBwL5S4#kuYQ9XY=XjFh4SVbhE#&e@CJ+L4juyh1^wEtlLut
ciQKG= MDL*4<=AK>t%dTb1?WiPycYE1kSG1MLd6!#E$/<9pyQiGJhjX+8/*BBcca98hHAeQR9tPd%ZDS*PX?EP
%6PIFG jytQ*#LuVy>El4EDSS9SXl$LjXQ#\6G$<JP9AyAuI\d:^/p1=ER*u6iSpE>HRm$D\pQL<&:5W=Eu>?+e
lRZjCF *qMPX+tcX:uttJa&9%N<id99ZH9WYHP/S9VS<=Eh5yRSe%iyy8BMTE^XnQq^t>YjGd&:jCI$Anl%mq9n
/iN%IT 9tF6V%h5*B@=:NmJ:IT#Zk9H/4HdVSSNX%@c*>6FiDyh6\6N9cWN1i&p?1M=/nheD^h<9Xy@>cqcdanF
Y:njE5 BdPhHG>@!G+I#QcC\!+4m?BS<1:*c8Rn<L4uE/W81P1m^BN%TjJJP!L$kqpe+by1+p5hu/naI?!M8/</
cjEtRM 5a:#i#5p&N:QBpV*j?!<?B@taj>QPm@?A:NFF@J@GF@>u=p689+QH/9@a4d+H%#B@=Zb+t4V@Q!A%QVX
Ad#a1W LnuPbuTuDh!pXWq&cS864F^#@Dc\jTN=dt+Yd4Et@?b@8M1J+89CYYWTES8*&n+<%kGHYSjJaVn#uD^V
<P64Q? HHIV%1iE4!@I>A##6jRNTp?u?:LZbAZF5VI#&KuWtHX$l\&eTA<@j!ejK%/k5/P^XWmW4S*Z*^1HwVuc
W6jlI> t8WEP%H>M?MT&J:^tW/i6qG=*mESFJb^!Qw\84>>dNB/V:PM\I!55EAnd4D91tVu9A%?%p:8/hHJnNna
aFS#*5 iCeeJyWS!ZFP#*Xbp=lkuPkSE&?eu=b5adTStS9uq&HNC<:M!\\IVR%N6<y#h$5$D#eLmKG:e&MeGR:5
PXRi\P WChtNt9DTl+Pp^kWbPYWtYIb\Wn^h1hpJNJM@dQTQC#DDMP5eqiFBSSR#hdS$?pBZD546?lIq+m$yB\G
R?I5wX Jhp=IC\yMYuq9@5d+nDi/=KVVj:NVuGX6a6>!uwQ?51IyDSDj#QdqIS%j5EJMRF4nD!NQT*mA6%C\%%D
E9GS^R %mZd?EY=4iQGi<a=^CTE^*ndBiE\D1dyYdctNlp?QwE<e#?8H=ijdlIh/dZi&VE!J!<$4TAlQmc!aGWG
#CqdjF J&bDlwX*8Fe&Q>R4M<p&PNWpq?b8:tWY/wnD?KT/b9u=^>8FG:1GMK$<:Lt?%p:Y&Rt&TWdbcduGnuFG
nVpelL &aEelqM+c\&LdS*mt^T^nltb\N:kpt\SdY8bdS*C?#&w*K^\b!>?VISXZC:XKC=tJV9NMhujnG/!p8Ht
84WKAR #9V%hHhM6X^ndbqu=laaH?&!%tyqIDYAp4a!$bJnbSPV=G=yF+4DMNdVnC^DR4m^=qb4ZaJZ5m*5N4L>
PSHAIC 9dlSAVqe&>n$hdqt*ubey&Dj^DR&*#\pcu$pLVHY\miBt8\hutjpdY<VqI:D4QI\wc@&59Z^N@Fm4#TN
d+=S/? w:n:S1$$Ma/nMPl5<&C:EH89CQMpHt$Dd*ZI^p\*Z=dq^nZ8\XFM9=XJ1/JVZi$&yynnMQFP#yTNl1:^
>W&ipd teG<>EkQb??+6QS%eYb^>qdPdqS?4GFWbKky^#dhhiNK1#BYATh6I!Ze#D@EJVI1^ny/Ne8X6!+il:F^
JL>9u$ bMXHGIjFGc/peJn=hKyQena#KGjN?uWS:k=l&hE=Gep=^w+4p>mlwcte#Bl&kyN@MN6@k#NqR/168!ZF
Mlmk9i QnIel\u\eHDnYqE#R+$<%8bp8bualYc9NR&JyiSql9wa8y5EF=l=&aaEbnyG$\&>kmPMp^$655KNN!d@
^6wpMQ t^Yn/iy$l8@9%LJtG!h5yHIhLV\CPLG4au$Leu*Na**VEyN6M6*NKVal9kG&=t8D%uGhw$MCKcdJ#DDj
na1CeP j&m&/ES#?n<!Y:T*@=@MF8*6@qY#^j@G+9%Zd6D=9@KK@^He9&C&/ES#?Si\NL6@nKZ@e/!V\@@mjX*@
/N5>ad PhdSpjaQ5Zc$j\F4=@1Q5Zd@HP6k>+@=Y#9:j+/%h*V=^%mHj+:>Z=HPVucP@$LR@>kS$<uP/X<aJL9@
YetTHE Bhd=Z#uSn9<a?!<pqwML@S>n/j<ZYNj@e/\>:V?V:Q<h?d<l&j?:@?t@p?\P#9<#!Y=9>#?V:L?#$P:@
S>?$GZ *^#u@>utPI^EQThKI=eplm4:/TFkG<T1atl\5KapuL#\DHGK@MVi!a:<!t/wldHkiP*+t>Y1Q4C&+5jD
\l&V+w K4Valw6&W9d#1>XFET@yISZFh>$?JAiRjE1WY!\SMP?tD@&!mPi:V:^PyNe^Y8C*hem<C=idJRNhhG*9
##=<6$ ^R$/a/5Y=eR:=Y?DGSNIZN@MqK@kPQVq!F5u+P:bq4aLE=IB^m5:S%+u&>pFF*nk4jl+eknnYl$*&#?w
BPkban wGKZtu<h<Pdy&TFq9&t*HF?$NuIy::=ZlNHNk1=Jy+%8d+b*:e@plyh65!EPc*#t9q$N<Wu*S%RF#@@^
@PL/An kHC*%\abe/6&=n:98FH$!N5#?!J9bB>uECiGkwTcp@jZYpiJCeM%4P4n&&^>X8<?ZWi=ikb^nZlQ<:me
G*</P1 >Cltq<4d<G\j?cGP$i>E9c=BYSq&/1#^bqP^^61+%Z?GPIunZL=p:a%qG>H9XuF/K&Q8PhZ4%44k>yJ!
kmijwS T<:D@Fd=#>#9nQQHSq&h9<h&8pR^KT*e!ZFM8WX:H=NCH+pW#p^I$MSaS$8P@dyqFd8GBFnB$j4a1iAL
MlmpPI ^HGu@dnt1Iey5\%4+uAyJRkhnc1>dJiThLHAT^c>W1K<6HTu$mn%ADE>*&Pu&dC&Qt#6thDZ&*Bm*D&n
\pRH5F G:FXb:ePVGe85F<@hnhA+dHuPWu?BVcieeq?p#8ey<b69t9+l^M4m@:AujC<8e1yBB9Ct1LWy9u:/?68
#QNNtE djuT+\Gq1=!yQuQp4&*^HNLppKmW6hlT\?^b/atQu=KEeI<pl/>%5S#=*qCVPd9/XqZ86eJ+@R@ZQ4%h
C1j!FV 8Y5&/L$l+bJh%+pj6?<W6uc>Xh8eHQ+5t6FB+:hXl*eX+lH?F5@+WwLDbbbb<D$nw^dImpWHb?we\pY>
E\V!$A ikS#6D*kdjQ#RT$nTMQ/Aij^CNlby+<b8pGZucRj@4:RF<#jM%LkLQy/i+n>GiBapjmH#JM8Qp&C:X#@
n\N?qk RMKiPhX=%VCDQE!k=/yknqD>h1q6MelKM>TpKy=$aI:i#<?#<&NK/b%#QR<CZ*w/?mJ9*\8y=CI:BX6&
NG>Iby SZcw#GciKitt/?mtIZD^/pW:$E^MCj#n*>l96!Lj+$+=hPlyQ%=@NKuHd46RVL&wcWZKQlbhjpVe>D:J
VGd^A$ /%%p:c&ME@:\8hW$1wyNy>8SZT>Rhaq:XG&#n^y1hL%j:ja!HEX&:G$I@MM:!T:n=M9<t>4F6*i%HMLh
\D*Ap% hA+:$1q=id1?L5E**<@?W:w6ajSPi1j<umG1K:6l#iZcpHhi&1XjJAut\+W=YSQtGw5Qy648S:HPV^u9
XZIi=h PZa?@8Zb#ei*P:wjwV=+8FPG6XuTcjZiy*Z+&Inn*Z^4QTLV:bHcdGZZt6FkYpbYYqdqqw1AIA565i+?
iI>ne1 dNlY%X9?wd6jKTdmt4AuQ9<=1Zqh@aEiH?6ai*emk+cJ14md%=BHnEk^Zw\11HN&?Fy^^8WP?4B85hhH
5SWQ4C T9h6IKKn^NLIBFiqTTZy!Vm/B9T*+itM1RP!NdE9hl?*Nub:hZ#%H%nipiQXuWdZJq5!6?cc*cuX*B>=
d?9IZ+ SKMP>1ppVZ@eiw4y^6>G*:@L5@i/1>WZtPWj8akAVR1uKHYt?SpTj8cKEG^W*Q8<98=%qQ&6We!nnQLH
AH^#de #4dSBYQ1pWD:^c1a>b?LnyX@Rp%!<5JX>m?+u8%a9h5?4p*69LHFC+yQbP9%<H5BPZd!$eYpnuM:uW>6
!Ad+cn dE1YbFy>ZJPnklFbLkXuiZ95n&ZX$6eiiZj%uZJNY%e/Q9/VIQ*FBn&eR@9MVINd8nBk+FTY++E>$$dJ
9&FVP! \j$Tl+*&8Yjhdy?<L/jJ:81@m*YGWCe5b>alh\ieHDq5YDie&Sye%S9VDC>LVjLiw#Hl=uY/>\4&X8qP
Fd@&bN #FnZu$>#JR?H9FM&IePDZ9dq/^?j9DBYdanc%jSHdN*by8hN9PdA^MZd9llul++HAXnN!i/X&dn4wi&*
M/kR%h w%!&n+>/>Z/a9P@yt&+c$*S=$$n6Ty&KF5%W<?mI!j$J#e?k#N&Q>mI#PE:*4=I!XVJa8&5ZmjBq&Pbu
5!%*u: ^@RCk/c*!9hXdGWGHG9M/%*bbJq^^iJAhkB/u@h??d5V4\=II1=>l^uK?i$dDD*ZaNceLIq?$tMd8u9j
@!XBq# A$FFc+lDHmFnY9yF&beQd?1wdwy\D*9Rj>8Htp11C4=1dwC+F%&?YLL#/wt5lG&G:qNbEd#laeKcW!E*
K>Yhpc T@aqPF@y!<&dhtm4QjHTa?PA8juJT+?5ek5%:9YbYVweN/jK9C@M^MX?Zj6H>Q*eYF:9@ZMI4!\e19dL
@/qW*y Gn99C?hue#+qZhq>/CE&c^*1YhRP>6&q!c&/6utuT<Xu/mYZu*RdbWHB:Z<Sqj@eddahq&%WQ*mt9iTK
V@^H5F \@=jq%c4yNPiy6&M/Yq%HK$^DeC6LQLj958?P/&!:MQbPHt9Zin=J*MQTb5QQ?1jwlY&>8m>XW9:pMuQ
Pd$e>= >V<Xhe+9^#q:WBb?VJ$$:jnc4%V6LV$ynKtJL4yqe@ZNleBm:ZnC&XecE\tT#MjFd>Lb+Bi9nlVWN:Y*
-Ap1ET 0005280f869001202b3 Page 407 of binaries1.zip
%^%YZn tMp%%wHH$#QM%>/4K9\n?9Y/a<<4#&lH*X:5*B5W5nKlZmZ>V4l!8XBHQ9d$%4um\?e98q/X!j/CMQ#9
eII&Sq e698hFG9Vj%w49#p&t=@@>W$9$6<?Fdb<6&nJ#:QPV@TZ*S<i<4&Jqd:cQ:%>wAXDW>m*+$?>c<dRV=M
W@?XN= %qZj>am$<e8:*RHPc>nnJ>9mXpj/Zc5J>A:PPZ^=*Aiu+hXtNVp/1:u:+<$H%*<<e@\\%XX@^1%yhdDj
IMp>4E jMiqHuHEu$u\XmZGhGn@*5#Ru/tFVWeVw5IWP&EN*/<%:*1@HGMhH%M/^c=bdH1ciD9V</ujwhR:e#?W
WS@%pt =5*G$d*h%Gi&Z&dGNZiTe$/t=e@eKIEu<*Pl#\8TAi5!=QRd?L5l#=#AYNq<jah555P!i&Q=kqMFeXy$
HPAPJC HbtID^G&J@w6*#i&>@HljH>%ITA%ut%iP@q&L!cp>W\!C/Q1p<YR6h/?l?u8Te%J#npK?mmDZitFdQJH
@V$ZNL FaR>ZX^eM*Rib#Ww:u/?iL$wM6TRZp8j9Nt*F&Gah9LX/Ye=j%ND5BXNb<BQYQDX%:j<6M\F*86*:+=c
=a6+!j LFc>PuPmj=tt/QaQuMc<?\M8!<lm8IwpZ<9/l5%1<%<<uA*5ey=RYc\SHnN#*m%!>kF/bmbCI<InuPY#
ZYj#ne tpH\w$dJj&Y@Rypa*n4/B\E1m=VmQ=eG9<c/@^FGP*D:&>>D%TlM@9KLEN!hhJ&5=RA46>tJ#4<RMc/I
NQ%Au9 +98HMDiPj9#Y%jl4juiGj*LtPM&ua1:*DjLYnhw!/6@A>bEAlPkB=t#KYPe#DGtLWeVNSSI*c:TydBNM
nJc=!L \Zi1d9ymKW^P5aa9d4@d%Sh\@BD:GPl5>*E1QRFuGV\=FF#@@m:W%^l*=/9^Xb5#Kd6j*!u8V/=&19Z#
^nliT/ X<PQ&YN*K9$JQ>L=E#F/w#84y:^^/9k=wFT$49#nDD8R>ZJl<#9wn/HEFG+P^/k/annGTdLD<Hm>D@#5
ACuM4t &a:FA$Ebt:wn@H&ZR<&=6:K*@+%>6D4@q4q1j884!dDu>NZZ!i9W^qRmyQ/9uX?Qq\jVEt&GuK$4D*lb
Jecby$ HjCa<:RC5&4dNP*cDBl6^l=C@QVeNlVASqhM^S+Ky4?T=Jp+95aaBB:Z^N44qN<cDRm*#%t5SA@jwBp/
dN>K4a G6e&&M=Ql:R@MZ1Zk=VFI=N%@q8dHtFucKR=B55FLY+LFG\eC%4\b5EQaXZ6j/Ke/6jPw6E6ymSklynQ
h6WT8Y :9>RLMw:X9=c=Vn4d:eZQ>%>=$Zwy11J995X5TZHj6^G?$Z6:I5hY\nMTZSdCQFwP@8Cm5^c!I8:WX+W
mY6&n! ii\/m@1etqjP4&W=R9%bN85:%c4Wi/KVwy\h%j^K6:u=*XdlD6c\EB:1#^nTu8YS4mnnALeK*Ew:e4CN
%Nq4Ib V?$JXy%F5a4K=K9^w9*yZ/d#j>mIbwJdCe/D:9d+^l&>%G/VKke#S=Z/Bdcq\P8NT8I#I<<SCn1w8JBk
FmX#jD IH@K>6pb:ue/lpEt&kc>IdN*Z%HC%M:dj?1\6l@8\=pG:$pKdqRP:V5$uADeMjF#DTF5D9TV^J&WjLD<
ReQ&mL =XStM=ccE&M&bCRbi>VV!dq^1NDQAthP*Q?lJ!9wtb1ll@N#NNtu?9Il<4ept!*1%Gn:%tL%*1L5$V/#
%iYWl8 epF:+T$1#91NP*k$NH#mytpF\qZeGaCPG4PIhW8Lm^TuQu?cuNAiQ#:c?+F/Q6L*KRi>^k!ijF/YPnV/
<EwJ+V @Ht6$YwNeKIpJId<SGAC^b*&=YkEwRH&a$c!KI58Q6QGkb*aH*au5k1b6NHbFcMWal:c%@Y<PhT48YSX
Aw85RD NL@b%WpRa?wj5*E#cYPEj@TutPjRmR&P@R8Ha/qL^%/X^6:Pe4\u5N:%h@!<:ESKjMqG!i%M#qNjw*XP
NFcN#* BjqPw?HQF8VQ#FXEhS#ph15F>>eXCEMS/*Zc\\CN\jd=8ymT=D:$IbYN<nYakemh9pqPHRpFZh6jn5^9
TmuL5M MNh/X@91?6#4tK#\Yy:jiC*EK<w!\5B&cW8iymVlMA<ta9qe=\Z+Qk&a*=nyd^A?HJL8iMJ/y:4c:yck
Mwt?Qw aW?n%^cdR1CLh=aYd&+Sq11t$%L<AcJ^K64B?a/>p+*NS$tH6XiH6<lbj66Qw>4==TcQ/c9ymXHtmu^4
TF8#/8 +wZR^iTi5%TjY6ttwiAwe=a4:PTGyA+H$V:qINmG*R<uTqZejF>>*kTQaqW*LLb98pFF%8MMD$q\H&/8
%MmCnY ?<8?:/bTY99X>Jk*<aa5V/?jEaY*@I>?W44?DZh6dSaRc&y<>19a!@q1yHtcPCyd%!Nt!Mu=GpXhLbTe
\C:pX> b*Hj<N6PctQ16:@KPuEIi@/L9E@J%X@McZ>Zpaa1VLPH@+c<YLQFQ$48eA+T<\e<u<nyPR:F$58LEK4Q
WjCucm i5LH4WHX@QDl>G**?b9uGhn^MQL1GV5jSqQY6a%l!=Ic=+dcXy@VVNL>lawWX@NVR#DJw5qVQXu4<cKc
TnM?5& D9@84CQJ>kMVe8V:!<>4X&*><ukH45$1+6m6tZTdc<:*4&$jtpTiQZcGhV&L<:a%PVE+*@4XVF8AcnIH
:=%+aV ?bbZ18SRGqmS?1:@<Yi6Rm&e5E@T=?V*pM:9MGde#l6:GuKyk6RG=9CES6ZL1ajLVJaiXGV5&+ZM!H>R
ED<CWI 8TEIcnl+@&qYQC/!T9G5dJlS@@JISeape8bHeV%+^X:pdj$p@Nd^!JV6t:ynmt?NQiudLqhN6/pKnk$%
=DQQJC qNcQjnl?1@dNa<6VVQQJ^+/aV\&lilFDX#^tnmL!G+j1d?*c6VD#AD%&Ql?dj</IiySc$ZV/+=JL#=8I
V+86\i !ad/<p<:=iG&l$n9DG>:jSu*nBSGiteL&uIh/K9A5PW?IG6y!Zln%JQi=eB%ES+G!48hcn$E:LAhm*=^
T=!W@D y^nHV9&>+ulMRMDhdiPMNIV%C1MiJ>Hb!j#:&nNHD#y&H1:56VP?8F*%\8G5K<aP@mDd:/8Pi4K>ZTl<
?uF^@h F?lZ<QQGP9nthm?CtjnL8PXP1yJYbl#+#ppd%TF6<EF&&jbhL*=#N%6W?#wyT?ZnB#:j@ECHhuu+WP48
5Wy\N1 $unHjVqPjR@9</YqD4\a!R<kZ?Rd1=JGQFAbbA=uqXTMJuT+9<tp=@HX1!PP:ND1mn&XlVLK#9@4^Scu
eB$iT# lNPbX\=L>S5!86:@=Z?<1j^iRW9&le5:#d8LXt@&NdLLDt#<wid?!?WA=?V1LZ=4&+cmmdtXkdhDJW9q
/kC+Ak Qwi*VPY8*pPinDE8+bwwhiLHtn==Pl@bWdcX>1DSIB<=%9K^QdX?Q51ZVm@:e$6ek9P#C\jnZM+eH/&=
>cYuQm q6#!<8/PZHmA498J*X:%d&teNc?YJ/c<LkV*ZPkiRS<@tu4%<IZ64pdCkcd+cDQ8iI1lt!c#j94lyQdN
ntL6@: a>qYW5ZLC#4^Kq6dcp+@p?$d1u/LY=PWliW?tcnGD%?I:*A&iQ>>G9i=e9<jD&>^m8n:=99jn\&*e>59
e41X/W @Jq=69T!ih51N@XLY&L!$pQDy/wFF!>hepu5*Qy6u5mi99qJ+9?>V8!qPH8CH9C+4qJ#nH:\mp>t?b6H
$>DLQ5 MWWFVi?kHcibP=Zi%#:$PmW5ilh&6GpyBkEePl\1nR#1\^+&8Fl8tJEbe:@Z/w<$^#iIyS>ZqXh&>!=u
m8bjSc LiTZ*Y@?tLb1yZ&cBdR%m<:JTVkej@GG?+G8W1h5$V:#5:d16/hd\4?#?X$LJ$/ePR:iGm<//!jbZ%^^
RkYHK@ w%d/EGTn^<X*C5Kce65m#qYh%\Y<!cN9Aw=+Y:#*uc:Ghqu4%mC/p=8eT58n#:\9D?kMLD/*!ue??9D#
y6B4>% DFnW*chqlI\:1b<i8dYHSI6>9tTZF:^nH/55/F&IejVQZ$ek=TYZVp+b$ShtI8J8VW<4Ll*8/I!LL>iM
J&de1/ PA!!dN45%1XEyu/9>9/^=daF+YJJ:aQSP=ji9L<MQ:DShF&w^=ZGW5eDXy$X%Y4^QhX:5X:a?6wI?j6E
1cp4*F ^*$N1APZ4CMj9%c>hymV<T#?e<d#1%9W:qp66/TpFZhE/lkS6?#@NqT9@Yl#^p/Zt+?G#5+e/Z\y+$:D
T8Fmkm &QT!5GRpl4:@#GQYyehNG=+/iS:SiJK:Z>*@n<\iE>yZ%Q=X@q*STwX6Pq:8e@l@&JV:Q\TD@:*A?u@d
&nMVB? !8=@K/D?J#LV+j>I<*Cp@W?cl+Q49/B=MHN!eu@9@H8V\*<e%it@Sj$@BJH@^4n?X^:*j?dL:S*?SWHE
eAec@D *8tja^*w>9<a/@\9aJ*?5cll:@I9aB*?F%n/Q<jc&@>nn6@i>b>n@=jClAQ6Z#qb@%mJedD:9<Dc@\6a
85RdlQ 8*<<\A+P@<4J?5iKq<N@V1!WDRZ@NP#@Np9?QbX@9@wjVdtC$*M!@*&YJBZ<i!GAI>ub!bu<d#1S5#Q>
chya^Q Q^I<N#<=Jj@*S61@Q@=4KE:@D+Zm/py&h9#>BWF*?9iI@wXIuQ?LctL9<E>Xp@>in9B91wuVQ!lNeHD=
Vwe#bk @:/9Gj$j>VY#@@%h?E@:tnp=$Q>VZ#N:G8%jEGn?n@1c:dq8Myui*y16986Y!8tma<>#qYX5jyTdmia@
IJ=Fc@ :t9G9/5$>TXy^etS#H5QGn:iyHjjPX^aaTL<I%Eei*S*bwHj5:V#D>>5ClJQj%:j1$nhNLI4E%e/uLmi
LV8$\8 $=@1*A1FkQLc+MKaQb9H8Nb@dj*<:8@>@j!p4#jj:a=8u\y\KLL5^T1jHM<1iHmpD+%F\cFMSnjZWW@%
X+#hH/ ^m5u6*/DHYu:btiht*NCV8<cuq=!di/@jbPNS+5ELVRP&$JVYiK&N4/>\X+HJ!+SnC<YM!kE>LA\uKb=
=&+RR= >>dH>M>:k<>>/RHk5+!IL&D8Ek:YTYHHcCJpjjFcEwk$YX5m/M\/nFR5=?tXMtiKPpHBR9EK1i1epF\/
J^et@@ l=eaw48>9@&+WKXiQdmKWE@CTkjy6ebqZy^G$:KB^kN/cJ9VZ?:+1iw/94kl^bPyWAaNLmtu$N4N!!8Z
/>n&MP 8!\^e@Iic/ZBGd/Ne89mFeMdcJIuDi4k:WY4bJK9Wc@X8&iVSt=Y49W+AyYN&FeP$ejXRTl/W18phZHK
+VLptV 1cKXb8ebkipD>KFD!eG68Bdb+/BPB9pJZaXM/>TX6udP8=c&!X=S1wj/Y664aCQ#l>C\ebdH*ac1nY8Q
dGJjLa iptZQT5@n+LWt1FqFqKp<c#lbm$euhMB6PMqY6Sl$4Au@BZh*k9jTn4lVb$hWM$/$t1PN$e+^=+^9tCj
!bL8MW QjQCLbM</X=uX$a$^VCKG%::ud:%S>H=ie/*D+:y&pk@%cC>P9/EV!PVLDZDpeYQ5tFu=JR19M#+?dyV
F>M*l? ?&e*QR:QI\hWb^SFBK1%u@Zi%RujdBNMdT&#l*a!kFE*wjaS^^CyBS@\K^6W@Gkyke?/6aI6jWXl&Nq^
m#$D4n dFkDA5kZCwjYiP?&PFh<h\iZ>PQhjw\S<PP8MRJQNTq6i9&y8m?!6#K<yI#kHIF:bl/<F#=ki1&d?QVN
qenhti +bP!yGT=11H*4HMN/M8MmNbIP5XBqJHbLI^Gi=*^cw$F/uMhVh&E^#Yb&%CRp=qNW*9PYCqtp:ad?a!#
%Lq9Fc %t#WV@q4ku8yKeyAa%?klc+wTVd19n8>np@b*Sq85Fy#yBHbw#uHh%GVibZqSet<$MXBi$\tClMk4Z5N
nGV&ja VCDmX#+R4aGDHu>+9u@TjSNt!IC*wX$Z\k=$kyV6<b^%<jHPnWVFP$%=$RC<BN$mb9P%!>HYyBR$GRpG
$RHSp8 &5GK?IaDQq1X:Et&8NbaXR\RkSb&8G>uCEpPV^I!?5N><MVWtwXP6:TMm@6%Y%!N!N=:\Fb:^p\nwwSK
NB:*DT 1/9ddS#edPh*/>VTbcGBA?\qRd8ND5Alu98X<^lIad>A8pk!ShNHIL\5K@l#b\BGN6GiLWk>tImER$e$
Wwm+=/ RtCMNEtJG^aiYIME+k*4J%1J\tQiG>:&99Rc$uGW:QXVHR\&SVL4mRIqZ&&k%9@/5\ID*#X5JARd%\Ay
-Ap#u/ 00058427943001202b3 Page 408 of binaries1.zip
8+BhHq %K?nVYp4c6ZRpI*wAja>$lBHDeYKaePpnmm+FS+6>+^G?lVXZZZV5tN^Z/=%Q&MIwT49Ei^&G1SdK\pd
:%K^Nk 5kl%cCXAhCFMbVKX\K@<9ZRW4qMR5XZIRIbpSM\YwY$lmT1t98!H&4QH$6%4!bcADKMl?PKAy#GeYtWA
pu9!Me SlkXiXQ+!M44/ZlY*V9Dt=9*EXS<jyC>5:!$BM*&wpYJ/1!uA$Rk^cIb6<YS%LpJu>ePI+&QTB?cDQa!
$ta#c% YuWaC+>$Y/k85B/TQyKH^CdPq%ayE9/WA*>1\lm/X/FaCFS88eWI#L8V1Ehi>&bLt?y?$=5P^C<ayVb!
mDuCdh X*<LCGR+aaA6Gmij6&t#k+&=!?MRSqbMKcSBS<nF1ZyL!WS<QQ!BkKGYJD%cRl8\kHK%1ZKmBc:P&R^l
n@anEW =\&$hGyHS?!%/WSwHS^tlA6aRkmV9&:hdQ6KR#bWcXD?6NDlZe8WJhK9lBGuB\LRKknS%b?11!in4<Y!
<=j!de *:lIq^q15:$q=W^#jNDiujn4M:8W*VkMET$ieqYK^hI!ZAYeF#w%^6ZKiYd4>Zj6phq>8WLm=8MXbAkc
KG$FDB \q%Jn1kE49ZhwpIBJZFeW\WI#Gw@dY&9lGVk9Ql%GEcuiKa<km&pGTh*k\WX5tpnBy1@c/Nn9LIlCCDG
NKwa?e HRt?YL^K!$4#WSJV1!Z&jeNSCPPa^p=DmE?CiPA!$=n#YQtL9AJk=>u/lMQkm8!=YjM>*LZG6+!=!aE1
b?pbbm jh$MATMPtlkeK%/$Z@LL8^p!EYYDNH<I\Gy>qJ</F5IHk1EI&t*T^JSI#QmhM!Twjy5:inei+\JM4?4b
d@I?nS a+tiTHWX&j<pIYc6akLa4X1TVph+T$M1V8cKk*DjEW*:pyD8t<J1:8$/V&>5W9tk5G#pA\Bn>qp6h^I8
:4MF#y &Wk#dB6t*aqAakH86J15?4mApY4?<lRKD^yb\>a@NEJ!>6wISEYTH&h&j*1?61DIeWmXQPYP%H%Q>Ic:
?IQq:q ajMcNL*\ibAJ#:?:G8KP15@eknA:+^SCVTTe@Tp4lSRM%J1KS\E<RZcMWwPZc^ZcMYEW<\^8*ckJT6ct
SyZ>84 dl:emmBkuTYZ=teRb1kZ^<Q*TQHcYB+YJ:n*C\DI6ZmH%%F##iHa$<BKnTFPPt#m5yq@pc1iMG@L#J!j
=%<kZZ eptup1awL$yZ@55FJ?X1?HSCWZcPdp#1F?&T+EnyKT8cCH%D6T&<Ki#^>*Chh/@ZJn&!EVI!uFhV9DGG
LdS:hl ^eZKw$jGKn5SP5Jn8Ni%W1^a=RF%aC\CqB&QSHQe6A!9@uWqjFD4R9RY&FB#Ku#>\=ZiyFP/L:XplbHj
yE#Md6 pJDqHRRl&%9RMkwdGG@SdwQHqKj4QtkwF%5\?qiXMD?TAWwA$FK<8Tdl>BQXH%:mH=h9Fk$?k9nmp@Wy
nw!dFy ZD9Wa1*G>jGD+?ij:5qX%Z%^?8F:\P5aSekW/yAwTKBFyK>MYTR##%W5/X/=G9dZ9VtQ/?hyet+RlL!d
*TA+Bt KF/e^DNaTpnIFu5l!%Q9$y?QTej@&PPkP9:e+I::V>6Xd=Qtj\E!iSC/L5yB5NCpA?+I9uu\%I5hHni@
a4i#\V QTqhiuZTNX>PNqnBZX1Dc?qBi+T>@jNBCbn#59quL9@u?$hZ\/ci&#bbpnG\&R#eRD%JWL8Cq+PCYKFc
^I/KS/ >HD9YwCZ1d>HlMl+y<eVpSkQhb<hlMH\Z>@4A#T$GalB<byXb?tc^%TMGSmTdQqd%c>9m@B9q1bI^TKJ
mA+>MX J%YhVTYBa/yeR!J\DD9AIwLaL&FL*@L&wbAieGE:\A\%+C/S88d@BKJ\5#H/ew/KQGcFWFM4VBZnT$bD
GRC@bn hNCCXG*iKB!bV=YSNbm6L^dHV4+@lZ#@AGZay<J4S:T+B\^eW&Pa14W5/nM1NhLylRCAlV@K49&AIBn<
Qmc915 @S#ApJ>wRSylR@EwHwQEmFXn+LXc<4Wl*b:!LR>X9&IIStyYaeVF9cyi9!<9\ew!^nXAd!h9VI?dR?c1
NPAH*D IAW5h!aSZb86WWellS5HtFXDS^/X6SC^Mp&++IAKbE/XF\yuNMLBQq=LN@FDlhLmJ\T6IBu@ctCkV=M:
\I!h:6 CJCSMEajHFSwH%+AbQH1k5quINTAEhk?MdmcAWal?RTFw^KZyTSdkC=$W+FFJdAQQkkubq<$tP8A*#tm
hiRd6B pbc1C?FkRFBZJRM1YE/VAbwDn94!Y4%V?d<Z6NAYJ@mHe^wVF#YMwP4MXBmR5/JFYZ5kGD?IBZmh18Si
Lcu\j$ @K\dtZFM^@<q1b+C1IXl:EuW&WbNMqRq9AqCZwSSutlT6lAkLQZ\WaA5NJD%wH4KX#QyeAADCPS\$A@F
ikY+A& RGIyjC&8n\ywkbt>l1q+1M++lM<@S?q?V<Xa/wKA9m\KL/iSbB^w!%1I:A8SWY+kP$cWV&1RW^ETM&y+
QZu*aL 6M*HeFKmkRF#C+w:wniLXijF/\><SQIiGqA!NCG%Maq\=MBDNCNc+>Rqyd8G**yC1Qal1kBZYXcpK686
1q:yT% !i#Yljnaq^aA\Beaq$QElVthNun!<aQV$EeX+C^cdtNAmXEFDXY<5P9J<#4pWAL*G4GqD&h:!?p$n&T=
SJqJNP %!bSbGBT4eM6\M+iWqGEAn&nF<lRjeah/Kjl5QXhcN=&4KCIJJ6=%dLTRA:XF?BXkCjbDm>5Kn@RV*=b
dTP%%G ^#ZiCdLWKIyGZ1AG&AnlhWEWYD*86@Gi1L@9Z1E@bbMcTD6BCadS1$SP%cd+pStaFe^\:>NqNue4M^5\
5ZN>4B XA1j&P96>=K8!h&!ku5A9=RcAZSBtWj>mTT%qlHC\A!e@hJ@1hGe\qdQNpRKnmpNNEAk1ZCBnc/<Z+6=
MkJ@SK #=#aFMcdl\u$6CpjIRBHdjaatmhEWJw$BjWI+tX^#&99uSTu^FEwIb@MKNCSc/JjE+u4h*4um*&u*ny=
1e+h9+ 5>ERlVL*8R/qCV<:51<kmZ*c^P=Pd1lFE$S^CC/AA?V?+$=Y1=pJTkJDXVJWW@al<tX//EbW/KpIDRbL
%j@=FD tS\K&:pyI4KP@qtJMA4ZBFn/bAA9TI<=jTt/4w!y?n&maeFG*4uWkwY%HPE+GdEn%*G<yaCeSRAB&K+h
k+J@w$ MR6@eZbiyP=mW^qCTMW<AuIt:qpBR5FCkpI6kY@<pG%$hN8c#^IA$k+ZFKFdQ1?bW8jeY=*kLhWe5ECC
WpBK4G SZlkJWenQe+@!@ZMI!yDDlh<A+ndiMq@eVZlTAwp$c8Pem<:NyyKBFuctWQ4wm8eHZu4W8b$B$nIGw:Y
lyn^j! dq!5&w1p*RGeL!Epb*iWHFC?&$eBcRlK?b+#/ZG:eAu<T8T>TTm\NtW*945R*D&PT>J$X>5abBMM\yuV
5G>QNa 1kwd$w%%TVBNJJtqI+eTuhhpiqWp^jnG>WVl!T\%LpCE=CAWX91WEneGRPAiV@5TqL^Bjy/yBlhkAE$=
RIu$uk BTTnFAiIAu>++j85cXHu&X=%pKZK>NRXHMb*GFABt8:8aV6GuH:MbT%\p5S<lPFiY!E9JAS>TNK<\j*C
NLp1>V R\:p/yM6mGCMG5mCnw\lIbXKpMe=$!t=SQiDaKeTtcZd51VBVea#a9VjNAKA8&bQce1$!:y:Z^Pe$:!u
dHb*Z+ NLHkAWA^y!jn+:n^AKSZ/Rmh>Nj/hijcjF?Me?S?SF/qG8HH^pRpDBnKu>/#ibN/?qqNnMAWBYFeaH^V
C#h:Rh a:CP#^cm8XR%*5*<y*m59AFP?Rb4YTL>95y+\ZWlI&lGw*dltaK@>tah\tnMV1<+qI1jNaA\mDm!pASi
CTM?GN %tD/>i</q@hF?QewwA*G%yDjEiSVeLAASp4hCdb5=/\S^?#X$#SPuhc4yhT1MYI$VQuEkT$GMp@C%B=R
@S#l<e &IRB&!FkMEBPJMpP\EFHkLKEqBtnPucY*S6Vab^X=y&M1qRV<@!<q?WYCyXR=mPA:AphiIVqSRDpGWCl
IMj+eY y=GlZZB9N8Y9@e+Wb:lkVGNAStHaSRCiPEY1&p#pJlhCcXwYk1JA<@KXDWeJ5*&EFnjh5uYqnS5*L&>d
R$ElRt K*hZp:EkekWX+wZqFT5DZ\BKCI9LB&ctLYSwGJiqyZm=c4AeD@t4ypF%=@S8NKX?y?AR6lY=<RbhCi#T
%\$:AV b<yX!j$+lh:EnQZ&wy@Fmh<AtZ+ywFM=+K:L8IdkSw\#4VRb\$<*C=1@/w5*M#i*18b!YS1C$NPJeM&B
le%M#e :ew*/AV!yIa5k!T+ykNIJ<K!>>P*:6>V+E^=6TS4J\J!M8<tW\BmHDX*Cp=9h#PQPDPtZ$dHt/lyk<Q/
qw/W$/ AmG$=eqT!*PGqmqARbh<VVXZeHaKanSy\^S8lNdA%p^bqydkPaL45+Jd1V86%dTbW8!FSTni/MlXI^&>
d?Mk%! CIJ8/Pau:N@ZqNqEjeF&4T!V%k8IuW<>WdMK:Xphp1AcAndw6!RnM?jk+DEe=VpEMpkeKF*uJ1n:i6<9
$1cj9K ^qkDPL9Wt+MFAaQjH+HZ14ZpyXL/55P\CT99&%tRw#Wd8lNWwVI\it=dc!+wHb<MlttZ?qCPpabj?pA\
c?yw\5 !AaTlphYHe5>@QDQncSj:1A6C?!D6ZV9dNIEIFnW:C8<+G4ZlTQH#>>LZet*F>D$\FwaV$@98A>b%wWD
#\D@^K GQw66RajH>hh#P&c@6nDdhW9a?$E#$IPuiV@unW6e@1PZpyH/$=>##!@&V5^KD%4K&Cl\PB=Z%St8*EY
+$GSm% nRA9tBS?h!&b1M@>TKJjmj9PQH8@SZb8/MyK!5Z:VeS=N\\+GQ%%+4!#Su<^aaAYhG4GVqc5i*:%y4Q^
l@n>!u !qj&ZS^$^\%8Quwqi9%k9P9kn=YD#j1>c+:S?8S/kkeD*pTMwGPHc>4q:#<H=y\^5?8FQ*!H+tw@kJ++
QI%Q#w :y@ydwiHeK54>XK8\6T9p@<emdEdec?pQT44eF<:?ImyY%#T6P@<5D9j4:@5i9P?+n$cba@1dlmi9qEe
$8/^a= N>CeicY@tS#jh9nH\dQF//@Hu^1LQ#wc#:9?/E/9?=?*XD%G@+we/#<<CQ%bXZ#^=8DJMhL>t!9@G4K>
8S8DE@ hZ94l@FHqnjn:%<9@nT^Z&NW8CbjRWa?66KR:=!Wb>*@CXlAeJMDttypy<u^9<5iK\$X8&8CjVn8>NIq
+LV/pb D9:m1n9^V+hiYbE<PG4PF?@6bq/dX4@?PG*w5YCja+:5p91h+1qY8d&!a+:!:thn?!p#D/&VkGe/9TV$
i?kSpj Y6i:4VJaR<=J?5DWn>^JP?MX9@@J?*4:ee6$#SIMEDQBQYEit>QZdw8dH5c$FP<W4D*=5>8C\n\lWB>#
^JTLiM *jFaj#9b:/McJji&*9YJdeyKM8WE&aY@QjdQi5Ii/he<?88lp8:1S$?M=tyItw1#&9%@@QqV5H&QDcH\
mAW6da >J?GuRD5>a*t^+yH4&<jYQQ5q=*my<q#\*9#V:Kj@%4@\8Pu#NN:d8*Vb=jK\<lCKITtDuR>/%b?<RV!
dEX5?P ^K5ij@Q+C/<t?M<k+A&wN&81!>ZWun%kAF=RW?9j\iD>miaEWPdWRQ1+?>e=k^ShLk$@ICM/dIE4m5J@
j#Pu!$ Z9cVS!l#njZ%L>%99aCtFG4J:98Rh/9N615Acnni\:pNc>=!M>StmZ<i8G<*!<I#@hRE5c4eBMP@niT!
CGS9My Rbnkw>1FBVVZRpZP$bDnpdIMLKRm\wDlCpbABV>ImmqNwGDSh8Ky+T8k=T<4e:1PnPCA*c+=IME^c#<:
l^Aa^y ^=EEa!S!MWS\kuS5*RL$w:u5^4CmuMBI%Xba+Ge%*lnlAecpByD*EGFIWMkMGuKWiIMGCw1bAmSTS4Tb
Cy#AD* wpWnK\SDR</Vpewp?m$T^LkjVa=B6\L<YJhSM5uSkKAp>yyNL<pdb^td/pZKPF^+?WQLZaaj@1&9GYwq
jE@@@> Za=iMlIeKLS%CK^L^%:G\ttqj:#eK!JDZAEkLjLBw&iTE@8JQ4n4D6Ep>ZZK1LF4P8BMqGN6Y8TNyijH
YESCVF AHYJL$X6!%JQeMd8tM?^a<@5X%bE9>c<<dQun5iBXjlVyDI5=\jppbtJd^#EN@6!9I%VZB/mj?Qt$J&G
-A/ycK 00041a5894b001202b3 Page 409 of binaries1.zip
Ji+/*Q ca%WTclJV:QZtVwPqwc66iHE<hGVpk^4X5Xmm>PBd\h=:B6@FL#*YJYFd:XPT>/k/lF*6D4tY:@8lyI@
>nkqKX F#e>N%^cRB@JE<cPLXu<VL$QP#>Mihd>TQuwpIB%bCi*WdauBnySId1n5mYe=HL5\\hZ#WKbmaBCnuyq
d>eeCT M9M%V<6RN!JQDdi4qiLM$jj#WiFWG!8bdpKWA48LdIb=F=LLclKLenXHGDSmnZ!lcN<\GT&pN>*5bmEJ
MS5X8X Zlm9@N4&H#/NRB5GR^Z!9lHSBm<tat$19PNDm=TTGd<<6Lt8*&H!=+ya8@LuL@H4qGwYJQCty&68#\CG
WXHclH $utcVAGWb?tWLAwIKEc4wa&8@ak\ZNhMP#Ta\y9awu=N9ejh+nTw%BlKaiAb!Zk@RC%6iJ:H!bap#?1q
B*5i5D p8\Dc5$Pi6<\ZqPTPtN1jiK/+DttEXBV\!Lt4QyyNeDCB16LS*p!BAS^JCJ6=$*:E%k+aFi8wtKpjTGR
QV@Eda WPi^a%*bwRj%Ec1CdmBtd@wI&XqHMNwJ1FNGXtdk5/6P#JpNi&^jV*mnQ4+jI\@Z!1L6HkHIVj+etSbC
ZZ/=\1 8LZ*IPKy1+:Q*wE%m=mK*ak9c4nEES&:!kGyMFGaFEVTl:WNFul4PM9eLGl9!$+=mMDG?AQ:nEALc$N!
ytkAJ5 iP665/HNdbtQ#mFth+KwD+EiBPdL!XpA^yyS&YeTQteHpi*:96%unt8^?cB*84%FlZyEAdR/ynGmGY#Z
yp!#bP <<nAuHQLJ$Q1ZQi6iY+?*1pHJ=<@*K&cyuDVRunJR8?JIC*hXMt%n5+MHEBIQ#i:dHA+>=uTT!=q?HtK
\#jPG8 :N\?%Ih9Hww*=p9YmP>D9CPXFh&TFdqB>Teeh+5Dqn*iIQj?\qj#kAT$NemQdT=B1L#KRM/bV=R?qQ\!
Xj1al5 Q18P?GbwVVMjtZhd\cEDRRT$6J=>iFBy/>Z+l*h^V>?VIcn4Xd#upjMF:a5FK=4:J//^CWue4GA\<Q^6
/plwCK K<uL<ZK6HDtiI94e$ibYw&Zuit@qMKM8#^H:9ZNqt9:QuBY+:XR8aHB5WR&ql9GC$jipCbJD%Pd\Gu+#
+>:Cim KV8GC%ab=6&DB+B8cJ+CKlRji8&>WtWHd^t!E/n&<WteJ<9:XtyG+Ap?RqNqWCT1uNmLpEuDC%Nt>QFk
+RMb*E /$QpAB1RJRMqlH:e#n+EQMt1BI=jlTaX8YYw>MIMV+NLAa5HjibaZTJ&1@Y8PqiATaTWCVy%PJW^?Tuh
XK@DFL pQIB1bNSRY+%aVkDX@Jp!TCK4+yJ9wkt6+aJcHi$b<e*kL^PbY?PJ>apQq@p5p/@Pip/WNJ?EhF*P<AZ
XKqKNw ANS=SA5+IeipqN/y\Xl:TH6/pi/:9FiXMB466=mFp\<eydW?Xwe!8cGC<Wuy%Zlw?XK\P!LAA\d=5c#:
Ecb>GY JZm?#ii/44R=YZ%m*MBu=DF5CP&8DJt#pa!5RpbeV9LQY<VLF\Ae>Eu$cHeu*PkqGjB89AmZp=uZ8AjX
&!PkmZ 9it?Kuc@:JF=F$mJn^mMKK/JkQ^4S?:5>\9nQ>\RRTVJMP>QLc:/!wlFpSyq$5lphqAJ!Q^JumXcDZiy
*X@w\F iVH4#XSFilc1hY=$ER8Ft=P9^RHJF6=F<GnnS^Ckh6l\AijCt&59RCpK@iXW6KFS8&+6q/8HaGwB5CYy
X=MEQ@ qD*9BeH@%ZdppT6<<w&i&wlES>HwZeq>wqFK@+YELd6I8BH:4/GXhh<hcI+E<$@:&HeBADy$#L=RhaIi
:RMhI? a\uni/uP61=EnN9DnJw*%IRZtZVwdVwFAN6R+c5aTS5#aWi15@e>Z*K8w#9Y#!>y\=l>Ct#mKy$R&aF!
iQ9m\l P*QL&+4wqXaNCtEi6^i!M5cR<tM@aCep?!><M&ny*TB6\Zyey%>WQ:9F+lJR1AVe1#*$ht4V>itiWLH!
QER=MC N4nk:cEcX=&5>K<E%jaq&:J#XWcH4NJV@jwA?6MM%I%^1NLVZmQX^YTWd>>KRMAt49a*e^bm&&m!MW*P
+>JyV= >:yR!MBSwK*IXVDlSjTl$ZEAMYEQ:$IMuNYpyMndWC/:9B1=CEWwC>+DRMI&=d^J!DqV\h$NY+85>1=B
W/Wi+$ #q14X>*6CSW5VG9+>TjXES4DT91MeZJHbQtEunG!$j%1n*^ISGBD\IZ>J=nhHw<BQ9py<MNAX1^X<tEF
MN4Sj= j!@%CeI@&dCT<</XcbS$=b!y#/QJjFi$XD&DAc!RBFVHIIY4eN\6D!4?8Fn&cI$:AM/5\nH6<en9?wcW
l#1c8P +RNXe%@mIT8jXD#n:lB@5KeQkHe*M@By%^:=N<dIKn^FJAnGQPIS#G$KSi:jeX*GX=dTiHBF+uN<dY5c
j6M*ME aP^FXmTHqR4+u6ejl%B+kJjE*Vjj>with6iQ^F4R$JnlaWiB51SXdQjhyWZ*>SM4\&+uJkLi*B=VAB88
jAtSdk 9GWDKF>ay+KamekTEuHZ?%aAlmBbTkNSQy^&I1VbAeF:=Z8hHD5=yhAknA5SLKpciT/\4Y+S<GSJE!nR
j!4nAm #@dScy/tCJph:?pXI<S4&aCWBSk\*n1XCmVY<PX8ZWYiM=JbaH1hilAt:E?9qWewIcy?@Gq#Vk%ElhGj
V>a$L< =t&&GZnqL!L\*#*pi^Bu&*&X=abKa8CuPpP/RWDaDih>#eJB58mje4JYhD<8T^=/1Z=b4RC#>*8EM/Zl
?h@ZbV Iy4A5BTPE*y>=k8WkP$AZHK>Wh!69+HuFA$l^?6i:VYWjEAnjd8n<WuEFSZph>wT<q%h\iJG&QmVqhiZ
H?KAVk Z^F9JI/1%#:T+t6F:iIhJD?mAha&IGlGVq/jtGcKqyb=YeLEmut#ujPj?HCp@dE\+iAdqHJ6EZ!AbKG1
pAqMn\ &G==Fa^bMhCaAQ<kSCF9JSm$P1/8cIqieG?5kyipnY%p!ykC>@Dnme*thjn:u%u$F?1#m<#!D%=ICYMj
G?VTwJ :tpuH#5Lt@hd*Eym>1eB/:>wn/SeJY*=MwL#8Rn*@1yi<6IYJ6PBh>hAGm<mP%$kiS+N!\eR?E\S?AW?
WZ\piH +mYY:SF6DV\++/@eucR&5pKMHlhL%!LGw$Vh?YJyQ1nkk*&SJVQKk8YXE6tG$m*uyF\8>GJnJ^4tPCKY
uwh:64 cD6T<^IF6Z6A1STWmSDq&84hYAl:l\AjL1FqR=VF$n/6w=\MqLtZkG^i\lIlFGEA%XeW6!^GM\CyF$Ic
kycYe^ LiJw\?VP1FwLPEu>!wIENyMl!Y^pD9/FypFLh>LE$q?mi1T#ZFhElwKK>NJFhXRSy:RVl!nKS54>^ZlZ
<+W\bd AePmlXSSI5?EPQ\$q/>cPawGLVYW8**ShQ$TDtbkS1LjTBH!>cR5IwSnL$cZmIXwyTK1bHAihtEG1kmX
id+qaC $tEALSk%\+PVN\lqdARRJqm&lM9DRD%#JeD+#Q#K*VKa6%Se&mk>LT6BPu^ZR8hKyV4R#yKTtRVC9%E?
%tBZm6 Kcm<NDmjLcISIa\\CKMcHAw:le?5/M=G@*/J%+a%S5QHdaZW$JJcNMVNR1p9GeEN<n:hYLK!h:D%q?l:
Rqj&MV uwC5A%5<C1FqmeFNa9ct$8JCALVa4*^Mti54uNp&QLqQeJN<A#<kGnFZ:k+5aS^Fhc4BI=&F%EABFX&!
bGB4J9 9uc*%BaJ4C#:QXlpM%KeY>q+8P*CGl5\5&\bKly*ETkKWQZbkjbJRqcEZ%$GcVBCcb\kqZLL8?HtJe=q
JkE@Hp !/4KF#+y#i\RBjXXkFnp!EyEuyED/\CMC\MAdZ&n?$wn8WeGZiD<C\I!B5a+K+S<<DD8Wbd!JR<FkVi4
H\djEW $DT$9RNN^DbDT*G>w:nK8TtbNE:W8iKG&*WCFC%YPkDlYau\J4+4K$VhGLG&#dqPRMBIA^k:=Q\TKBB#
eeklNE q6/IPQ*GptN=iV/H#m&B58\Dd&:!!^PBbCYy%KP5M15Mi^yCyy^nqMBbqpyFlyJGG!E==4ACAGl&kkYI
J1I4Dn WEwB:N8BH>lkd4SJa>:6*!M4^a\qy<Q&cS+<@dI6n*?mlPYS<d=5lC*y*B:Y+/4jP/!CV1!nF/wAWLEq
iCyqEX $:A:YEI&St%8l^hS+XVPL6KTlG6I@D1n6EAY^Z?HA%bT/W14ycH!+X@ADI1NmZaM>N>hllcRX=ayDPD:
Xmp\II XpKpF<hI?!WK$p%8T?pMBRbwAECe$ukY9JEXRRcRI@G$teGT+P?\TZZp<KYI%9eqSRYmu^wh:GCqEXKa
X5?Wa* X#Mm$/HG:d&8*BZP>Sn:Bw1Dnp=&uwP^dE8KRkq$kkyASHc95kXTT\H:FjkDkH\D&KkJJh9BFDC+ulAA
DK8%Dc WbAQ9hd5k\nqanGdhX81:6D@C!WQ8G&b&#>#DF#?Xew+AC^Hu?:hK!Cd>1BnV88hWB4bVJVq*NT*pbAD
?DPy^? *I1kEAWF>T$JJF+PiutlyM<ELX$n6X!=l=+I54iP^DWKAIZ9^YLB6^tE<beTFkc/#dEVW/uW=%?T=:bu
R+>Y>l ^kAp*IM9PN&RmwSAKtI=T5wkwWa!WecDJXSGCS?DwC4D^up5YmMW8<WBdZjc*jw&YpP\Q%nTHmlqP%V$
^$pub1 FwFwh1t$EaakTPqEXGMNRPcIq$Pk$ySyNFbMTm:6&\NRXW4q^15:^RL*pYQ49=h&Bp1qYZi!ewF6TihG
d:T!:^ jM9GmRQ!YMtS:bQ:Xu4\W?AiGcTmDQ6d/l==^Kt/dTXHkmYhPDDP5X!8JREK\bEDA4Ry>P:b@XSPKX+H
Impn*Y pjEi?!HT5S6@dqENL9y=S?EFnbw4?c^=kwTTTqunM$\S=waR!NWcX$Qt:WhK$Z6w61Y$#L6/CSCRIYFH
?ELRq! >5<ApBEu8JM/FKQ!\H^cVJKK&k/8GYkRKHTR?@e+wGFK9Tn995Vwd$n1R8dAyc6H=LBk:bWRyRP:$R\I
Hn%QFc +K%Bk5Fqc$MZQPHeDhT>65lFC5y%GdR?+hm6HyBujhSTAnm/lhZ:TC>FIC!k+t+cikFcM4Nb&JlS6/!G
+d5SXt LE+A$MGqa%PhI%VEetV>mL<ISAlb?tcKE5mI<VT4Bl#+GWAQkuXL^WIDR?5:BJBc!51Q:=qH@qVi\>Cd
*%wnlC HM>Abt!EGI/BkK=kK@dP#DuWw6Y/://S=IPMCZY\WWjML%S$F+4=t6BGDHVGG8TaAAqRAKCYL8mkV4$w
&I*V&# :>5luM&%w\?C8l+VuCT$NNTGG%#K>pKCBwlV=/MnpkA\WL#6d$u4l&l&Gq4/?<$6pNLw%491WHVEd5AG
ASh%S$ 6dm%qBTKyCenY$QKF9nAnPjD#aepI%dC^qYRbVelQRZMk+tqXNlbXDk6iIKDFuLXaCeMEdIelGIdKM$T
<\A^FQ QHcP=B?ELSRu14qEp9dD6=QCPjt%W5JiNKip#^+C8pm?jl+uu$ZX5py@YkQP1=KY>$NlDLR$:iKNa:<n
wpF1qb Kcp6kPYyCT>:ChHdIDIQY>q?!Emc$PPWMne5an!IRe<MP5YZwI%RmyCTEcJNmuyVI%Teb=mI6=%+i$%A
J!Ahi8 LkcB!NLG6Ve\qnAecT%DK8yeX+J*RLA&kN#<H4TnpK\D*/Wu+5MBtkFplmVa$Q5RIE=\IuWZ*H<uKyKe
Wwb%p= mJDSEM+b<=$HSPNiR!ewHl\Sc&6^Y^+LLe*@9hwT%H1LFb!Ty@qKSYRJP@!^&9^Am@$JWCyI?Wd9T^jJ
%AtkNZ TEleuqAcImRyJ+\DIup&GBi@RkwAT*4\<G&wpR1AGm:5bmA=/RLRj&jjY1nc6RF=SklcAq8RClcBWm4K
FmHJXu Cc!R*FkupqyBF%cn=MYIQE$w!^T&=kCeEa=tiAM#LQG>LbJFqyeTAX4%SD>:n\Xk@SwARNJ1AYP%lPEF
RT6NKZ j$p9A/D1uTIE\!@?YDwm\K%5AjKKtkFj6lGRue#B6aIbNy#NKepa8y6nY%F4J4=YicTQ#!*cn\ljh?1E
aQ>*B< AhmuXIqi8<?9YWBttwN>IN=iTM4jQY1VTn5LH%5yFJW>AAE+H$D$/WKZ1Tj\M<LnR!AXItdp\qT8qF1q
Rcpj>w B*p>:?cwAZpAnK?GAl#&*V%FwG?4aimKTL+A8@C?wqtMN^e?jcFMX=YWD+@S@kS@bmDNHaVpc%c5&@Bq
-AQ!d@ 0006de09010001202b3 Page 410 of binaries1.zip
8F#D@1 n=Ittp=iPGy=FV\PA\BdaY>6V@kcw8uR9Y&N^+4!G$dYT1@hucCLAB$!&PhyWARXA6mT^5$\ScRauj?A
/biuQZ 4VW@<QQQph!ZuF4\%L14?I1TS85\K4C#E!1cWaQb:AKBJGV*Y4=MJP4YGbhYkP1=46I\RcecI8hT!$\P
<W:ndS cyGKZDV!+&=H#iTn^uttuj8R4EL9Q9\/16m8KSbAG\D$dMCHI?YR@>mZ<1yILAA*kmpjV!<46e!I+XjS
ZX1KBL /MX$<h5qKWP*6jD5Hibq/E\atp+Yh\jHhANRGi%&N:?ERShB@^CM4BiD*8D+D5AhKJ&^R9Yuc>KQCiFQ
tQB1=6 dF@>aw#VXWckApWa4GEZRHKE<hER>ka^*ShBk+ub/TYKXCRn9=TdA&ehkDT/j>C\jZBy=N>?m>KmQtj/
Qeik!D RDSmE5R=BqB^WNKcZw6S=DkGt1m6PdJXRGcXpLR1F\*!%M+<Z9VV:%=STueX++MlCpiWRqXeyFjcCTBE
:4EEQW Dmm&A$KcBkj+aG$$BJ$GY*lVTqKVbPqy4y\GkG!y%E8=!EmJ5mAbYCh^*+ZFp/A5FeR6>hImBQV&dRMG
bCQ?k4 XNVwaeijKcY4\V8>J%uNa6?%S?SB<D/%qTAAp!aK\DklLRkw&wn1$+a>KSPCLwL*<akbD#$<D6FJFQ&R
Zu\1m% \hBt6qp4u=EPmM<!JVJ<KeB/#uXFpdiYeJ$SSXym1TX<HIWeeaY^CqHn6tC6F+#QkkNGTMatAT*Y@BWA
M#cZP+ eQHncN>u%cEkAPqwqJc&h/ZT!KYN*njaQGV*l1#8Q\FFH4C<R<lJT:XWL?!Yky!$YQcBP=+W#V@Yk<Bc
Rh>R*% PChW4IkY$tLBbV$Jjm&5CIDS!IncEECSK1/AdAWlpLpJaAR^h%Zn^D1BM%5N<id*:MbYZqlE:q**Vnw4
yK*?l9 bymkX8@G!QYEZCWByAlY=CSy:!qcqw1y5VhJWQD#*<J86>I&L+qmk+DNA<ehpCVDjudcJ4+/lL=X54\D
1R8W8Q WlRG+MqR%c5kaIkMyeDTWFLc=5L*H1TmDTK8pSTAq&<L\ebt#ht@ajVp:jMHtDRq+mb$R?RATEW//RKN
cybj4I wai+d$S8W^t5>pqKd*/$=T=qWj*ZwnGIFYAncPjMCdwm9WNkaF%^898qdeHQ/5:%D!aw?SJVGDGmA^&S
9%Cn=m KyetEEM5?JQ*nqjK^<=>tp1?+NM56!YdA?XtdhjS:=5/l6&iuAWDBiiLGpdqAc:1nkW+K86yY?N1%e/d
h#uV11 w+:9Ve%>mB5D:Pkdnj!!V^T4#S:Sltm@mkncTYIXX/E\M9ZH$n!>YM?:D:eiP+cN&B:jXj1YD69wkL%S
n4V<PF PGpNq!=EBAPcDPD4+yc@5qyL@i$W/y58Ap9j64Fl?Litmu6Ia+N#TeehZy/pBX:S+#<udm/+A#ee4bkE
5Q?iJV wn$<L9awLV#+>Hk!n$qJ@ZqB:L&>T:Pq=VcAMtIA1uCIHLA+^:y:ZYu\TPN#$*$$m&B*h%5<ACWhu1lh
q9Zm=% yW+:P1^Ja=hek%dC%PYQ1$A&Wh<ZA5G\AiBq5RbaB#5$S9QTj5kEEY&ij%1IVy$NKmhDHFaMjwRhWRd>
pmln=^ PTa1^5>cK/6k1PLi8l8Mq/P5k#h:GVP*GE1Z$@bW\/@hpZ!KniF*?$h\hJ6^l5=EbL65?&:k$P^b5+=p
Cq&/$% 8<1bK*i?GnJ?*/S%Sa&b$&8SQZjdF/nNR:hMaYnHwWT!RZt+$awP:8\8%#diVG>cTbe45pA/Tm5!&6Z:
#cAlip dR%q%Z^uLCQA8u6Pl?mEwK&8kJ<^XcqaWACha#aLdtEC$#eZE&%pXJ*+&<yqucwQi\hmBwlK9G@FEZQA
F8+a9T Ci&G?wX!$t:V9GFnaKn^+c:K1MljHWwD6X*/c<^yiny&Md%VP/CyYd&4hKh@wc5RYMLb*TnDAZ+%S9^X
eE/kRG i$6Hcc*I+Cl%yyX?y&#6^8IDySQ9*wXc%B4waEmbmeF6T+&JcHi9%wDtF&8idN=j&hLmc?E%+ZQwea&a
jpT<*P /**kShIHn>d$Y?PQP6CyJhjWBdSQBhADl8S/6J6eZqm<*+lh9KH1>9uP^FXX>:TKP=+6H\lKn#6RMKbZ
@S64Qq a^#ip18/%<B5^jtZXyE:9$=E1k>>5&pthj84Z+9V?4!9$EIAcXq*/X^c*hu$86Chl<lNCm9L?4hD+Wy&
Rp*DR\ PZ5uJkPBLRdVm/NeySP4C^/:h4yY$bweZXYu>56WtumWwWcdhuq#t4HHky6!p?qi=9P9V*c$LDRkBl5!
aCKcL: p%/G&#CMp5NnMHZyc@yZ\+X=LGZBpB9hWhuM4PPFKK=Ak1#b<<$48?H!FjEnI?<dF*aT&9JCJN^kKm!h
\5m\%R Ak!IAPGiQ/AKZ15=w*eZAFm>GJtB/5!mR:4qWDSW@lpwYe\X%EeSlnIuIZeGZqZY@Y15Yt/Hq/VME8Vp
KD?9/A LlD>umC=B=Zp#+l^M>SNbeM4^RMLw1c6J>!Vq%/K<lRjHuDG^ATQe/w?:FZ?TliRR\w1>J\XXek/lAYY
Eu^TMY <&D+n\ZDI$dqlPaP=KtH5Q9LKeZHZ^pa%A1S8Ju>?6CN6&F%ly:!BSpSZGPDHBlX9uciw9^<kiNZSw!R
F18yaC cE@D!edBB8RD?pIGk*46DSdkWn%EIF1QS@qnZ@ikmZFen9dV:yW>Qi&Cc$HHyNjd6aRkYSXY&+<$:C<A
%1K^H5 <K*+Ww\i:Ea\*8yLnCjE$E%/PQ/^el/AA@EXi1$eq\5A5EJ!LG5#\T%m?EN%PWDdA\DwAA#RRI1d!hdq
@DCCu* @kCA<AdDpkY1C=jwic6^HD1RmR+tL%F1yIyhEAbMF>c\A!*:RkZ//Qwqn^+DqEt1uL+cEcDHKb$%WGdc
pK&L&G WXS9u@C=R:%6FN1IkCic>/Ml>Wy?R*%I^R<WqNbuh=Z44YyE*L/j%tyGuj\KVbTH:iN=c5KQl1\E$BAA
JQ\*IA +maYWq$Ie#JH=GK?Y<tMunb9j4XR+G+8C4>HHDB6*9jy<pd$nE6ERQw<1@ccu=\MA!mHCARbHPuNm5au
l<D&p$ 6u9lQ9\k?:Ai/Z56pK61je^a+&bKZANN6e&uR5KYe/kK&ScApPl/9X9LCH!pBLND?wquh1nJ</yS5$a<
i$Y\:X R>ALcm=K4RH/nAcywB=9YRMk!I\Ym8A/TV@<Tq1i&AQnF#SkDi/X5>jMlMDRCy?5FMGyJ#k^iwAIeIH!
m8kpkQ Y4$AAR9T=4!?8MVd\E>PC4aS<Wua&lM&bS^k^WD\JuC>5V85<e8YYZnia:kEPjD%4B1n#1G5dwy/nX1t
ewXmHC KTn?9XcHwkT%lm5GPVC5ZdD8EK5Md>T<ZijDGc#6VCbtJC?KeL1R/QY>h*CAR^F%l^yi=@=N<u=ESNGT
D&bYcP T$8KH1=+/4kD?EB&>tWX/?Z\jWCIJ:bL?\JciP9B/cPwLRJ!4T>EbIcltB4/>+V6y+#ymIHRHCHcTeNI
T+1F1^ jG?jDFT#i=1nbLNH&cFqVApwI5Htl4$^VLRTTL<AkH*/MMwQbTENlYmdI8QWG/kqDIV!y#=!/eA*kqhu
ybl@+l MtSRL\%u><P8YhhXk/#&+qqEkwuQ=ttN9tFABFq$p!CDNkHwdewq:^!R=BHT+VA5Z!c^8*/$X+Xec:@V
#:BH%N n8a/ZQRR/h*51R!l1ak+A=16@TFak5TCRj&8KimGGyGK/QAuc%B4TFWmNp=%6QckMk?dBSDRBD@Thq^4
<YEC+8 J+HEVFA8JR*wqcCnqV=$8$9AKZZ<t%&I*:Qq?iX!8LC@VXB*qm+a9=IBJwiw&n%cPcLa4bqW:EY+98Nm
%ekq*a GWlMWj:lBtW/?=W88GmXLH9CF8ieIZ$ZEL#t>eJcA:QI9cEt9QbW%V!wZ8qIMTDDd!u6PiTEPF5&\W#Q
dn!!yd 4dVV&?mH@1ZQ?#$ukGJ6=1!P:kBZZ:VhHYCMaCeaNF#$#m#hAVL^QATiDX$@T4<&elWQLqI4J=1Bc*>=
\d&<6t l*mLj<uaQ:11G@GdNk1nEdW5ZVtRnRS<XMZea>lTBaCDNt?RqJjw1ZS*$uLJBnYCSRJ<p*n^!a4lI5EJ
69kbM> uXH&h%?k$/pCMDc>!p4EiDGm>Lpan>K?>n\=kIb*@#&*#W^5MCH#R*ZP@IVuGTMQLj^iWmW/A55%:aeY
LBQV6d *Q%>89B/5^jXadNwGK<c!&=MFci\NwER=596cdecSHKdhmDJSVDm4#\$@Bwt5%D@TAMAlX/$+XCBK@VP
hnh>?d LeLAR$j+BNV<CVN!^b!QVnc^G5IR&8WCn?>DD&p1DSVqw!pSyLD/FdML^HtMQ6\Ce?K&h<%DNINFpAPc
+#98V= eu5k8>a6&!1Zy?uCTFCuaDWFXy4HhVBpE4HtwVE=wZG?!+ZSljF1!IRN4lA51M>&dSEt4JkH>RFu\pKZ
%EyG8A C/<XWy4#98SdPTDSaa=8F@1I=Z&nbm1wptNwenqLMca=?$/Z8a!k^K9\?tED$\\GwDde<!^dJ&<^qJ<8
ulp!wT NaZRYbB=4XtckS!4>hILAIV/4EE*44&Y+lupcTGCiRB*JJ=FqipMLBJana!YL>wK%lY@<1DK*Vk\CyAd
&p^R!< 4tpb$b96kek4MZKyL9MXwE4Yi#e<c8kM6F^?IP!A6Nna!EJlCnnALhJZhK1C:kCqGec+nBiM+AWTA@KY
qJeRcZ dRCAlZVARVj58@=IjJRylKR?YK%HDpc&IbC6WTTBw?d^bTQGIIS=P\4=eB&qkjl&D:4X1&#k8MbkDMDM
a:Gk+S R5^iSpF8I=mJTwwDYLpRT^GSiD4AdCmp^S%Nn6L&GnNmh8NDG!#<PmYG4qllAnE^Sq*8y\$c44Am\Yid
%9WlVP NPVX^\&h>btX/AEhI+Gy4k#8dPc#c4cB=BiNZ+@SE%HSABVF>XRFFuY+\clbmSb#FDMk%Ge&a%1!TC$@
EdmpJ5 NMq#kF^?m%K?l%tMu/idGA*n^*wGB!dlwGtAAk&AwWl!F&akB!YLl%MGaj<9<9+#11t9:@iFX*wICRRI
in\a/j EEKAlN+JECD$JQRii5iEJq$ESP\4wTMmICI1ckKIkA$SFSW%wa8IwInaA/Jm^+:K*@@n6je?b+>>Z>e>
mRYGey :89b==^^^umi9Fl954/4nQtde<$=Z*\?VIde@KyT:nj!jJcYbE!Nh^ZLJ?GL*!5#G*M<q#DqMj6lBRBZ
F#*/dV SS?+CB%5S%A9!eN?$+9dXeV%YM4QA$\A#m!=QdW>8%^KEJWAaKll&XKJ%L8Xu/WquhIW9TbL5XmRLk<?
4?HJmH WiEZ\ET%e9Nj%AG$K9?*K4<EC?pAKFQILwah1%8ihcBk?hFGFN/XZ&@p98\k/acAR!SiKk!TA^F*\!6G
hD$e@A cmlXeG+Y8y=t^:11APanaKM/dC/Wi<Z$5/I8j$YY/+MXA%4<bnXSApKENlF?W/A<RWB1qbpSYq^*PTaG
EL+GHJ P<>GMHN^S1bP#EeRdA<\61VDFKD$/9<T>5L=WmXAAGMJFCXl/ySphW1YAtXFT?^QbCp1T!jPAuNwmD8J
8mtm6k :\Re4>WBH?B+lZ9b:4ZQV<Cq?91R4Zykm/ba?LWX45\Pk@EZpBKBDw<G=ShF%b*Rp=:HT/ewHGX%Zy/i
JQRbRE >AqAtbCbX$RJheqeyJbEETP8XyiRWKIIkq<NwPkJWK=iBpEmZ>FBKFCZL5p>&?+T@F8HheuIu/nD@/aw
<W5VXL ZIZ\BVB8tn:EY+>HkIwLChNPtlJG!MID4iFQM1JVpeQd:ia*BRK&?n^@Mw<EbWWwMRNX8c9!pCupQAe4
uTQ1Jk cedw=hyT=TC/9acGd>!i>/Z\*u<Eb&HTRFZKbmI4Ge<jWbet\IRFeICnLuWZ+RNl+nVaZlia/Mu*$AN:
IjjLnF yVVXAc:epLE<&IaCCK:#ZCiQdlKp>tJ4AaqT<95PHCDpcwmbA:#$THh:LN<jkADK#P%aTc$/AMw^d\Qq
LHM&B^ VECw4ZdMXIp1L!NBE=IQK<^VIL\ly9C?SceF%9MnliL>6QkEIQ&Ey=T=#y>iA\L!$n!+i=?D<AXJ+tcY
diN/5I *?#Nk/P+8eb%t*WqCZ4Thn9tIyudwRHJ<qpEwW4LDptLj/MZTN\&lVcGZ*E:R9t<:56c<up59FEZJ6VE
-A>aH+ 0007139d2f2001202b3 Page 411 of binaries1.zip
VDIy=k mNJ<*WaMaCeAdkIM&i<kH5B^4:6JX\qGyu6jJdRPeKGDI#CymmK9eA$q\wp%SRRESJ$^KNAnZ&mR@8IB
eEnluH GhBpC<QXE>uXE=9Z/XeyQBP4#DjByY!w#!MA1FbtD1t=bTqV\u:jTX4ViwbCQcFHM$d!&KTnu#VP4SDa
/X^Q/% PikTjWC$YhZ&mH\L6<?6AEPhiq/aBlPN/WtX%/R@LiC&+CAebTyN<:!8AuMC=mq\al$kVXZam9PWnnF%
*+LYkR \D9=\*@i=aui<*I!NAI6RlKwcT4TqR*eE+l#DZyejZSqtD^?K$?W1k?l/DHlY=pPmJSQmt!GHDXMjdmS
IRNwYZ L9S>nKC=mk$%I5eVb&eX^Z%/**w^hLwP$!XXjB6ByYuNe=Tql+uWRA!pGcCP\FplK1#^E%KQiPEC+Ykj
KCYcaq Tit=9+A8#?bCend4kM5RMV%d$1aZuKd?yWTHPTtdiTAk8WRY?KED6hYMhGC&6<BBFS*KwJeAnlijRAFR
Phbtt1 PIYBl>VmSC&KEEYCJE^FCCZQ4<y=RHZARnS9^y#XkRn<=5RWDJ#6YN8u5%EKwNa!MhS?KNAQq/JXSCSq
8Q#<*Z X1IG$^#QD>PpVGDj>C>kBA:m6=wnt?WS44aSl$pLZBYhE/yMd^pAjmM^kTV8p^N6J^b*A*??jiLqD%\R
Py%tZP HjWl1*FMe=/wIF/5?hMmnLc%*B?BkQhP=t$XQyaEaGHk!l*yb6S<kyKpSFQ+SB:TkyWWAaCtGtRBA!SA
H&L?Vd yae@W!BSR5%$yuNB^5Yc9FtchkK?yhtBY!F@B%^D^X6NQXHuh1nl^RDpAi4&nB%9Wp$/^tl6S@FX/$j!
4N:A\@ eP\%ydiakPT>K4>AlXZqJ5uAWyQSwq:M^C^G@Ph#LCRBeI6uR!lRlX!&BF8<4eQMhm&LXLQdDqD!NKYL
XBcRJi Y9NpKQWut5wGJE+wEXPFa8*E4FcVDeGBlW1YIEDNI!+?P*#t6>wAN=pLXV1D$SViXkdF!6LXd:%RHd=R
iCLSJT Waw^cKEVAJXL#!5$I+jMnl=T=\u$$SR$<E&i6+1T$qX#*JYbdCK9SIFFR9&yQhb:JABFW=Q^u&Q+WN8#
mEVBLK RVY/</nYlnF%Abi+EKdEiLwY>l9jF\lRHMlMnG1mLW^<<FnJnD^RGQ9=jyJ6t1Jp9lq1lSHSNaWMyZq@
q!e:R^ BS&$At5GBeuA<B&\qNdKkRiA5F&nPAe@S1eEM=9akaw#*uC?hk?9EEwXK5<4I4mdpRAc!j!t\H&AANBa
T<@p%N S&%#+SlEh$V?\Wi6d>%/Q^h$8AIpK^eyhTGew?u^C>wbmRA%Fd&m1ReP?C8e^!b!%RX$LVFhmd8KB?i$
i9^uHZ 1maSaw\BA1:Mwq=i1YFB&+Bd%leF>pE6Cbw#ecR$eka#VRd$P<tHKnE:n:VRwc!%RcppHET%%C&LLQw#
SZiX!A auj4e%9!thy+mTpMwqqGia66/WBS5!/*FkLM?&eV@iEDZJp&www$D!e6$ICpASGH/5=66iQN!H4WPl/$
T<tR+h mGpeW=1eki@N5PN!5TAk^=6hD@tEHG\uRal!t#4q>&>qC/85y/1kLh\<waDIlh>Z:qCH6P:T@VNIZ4B&
?nbh\= e*q=dM&?bR/5lbjZ&k*\H!EZqmFe1TKE4mLq\1!lAIYG+Xwy!:TymQ9\1plj:md%ECjdl%JXdB956M&N
#h=I1S nZA:=ulqawi!qcjDAkP&c1ZLt6MH#8pA>+@y>yhSc&X*Q6ChZ*i6Ha&D?KQZVk&\:LyEkJd&c^#qh+^w
>1EAPe RGQ#@T8t84A@#@dDCu:k&iYBMQXjNB$?ZZ*jnA:LTlMaM>:XiqeIXd>9VWt$qiMJAPaBqSY!wjVcZjXc
Z>yXij XhaF*?ujGEidY?#FeWECtX&DEbYXWSt1$PiGy4y&ZC9=?=h$?WEnVG@b%lEn<bS<e$uiw^Bb*54ce+/V
hc61&E k!e$AG?wMAMyc5NI6+/KAa#pue#kC&YLyD>4J4ZH*=#%9^y8t#t5uaDPqRPARCWlSXHm45WjcC/d^XuP
^1ly!D !+MeSTE=b=MI/:#pCFk?=QY6A&Jk$m^wIYehlc=%@dcI8lWYD*9!y&N88pT?ppJJKqDkJ58?>heTc8R/
$uB#F$ Ba<hRy%9j/G\ZhFBDJhd#>cqnBp^j+45*iXBh<n9c<>LnKE5+6tFw:P@6@1CwJaPZQH>JRDTVyL+K5+*
AXNww\ KnE*yk>&Ei!kKEwc\wZ/QKu>?FTXX6+nQiqBGT/k^j8mBY4D?Bq+kPjt\6:AD<VcZu5mLED#K5^6p^be
X@!jkQ b8!+FCT#Di+&ywV8JXXiiLqw1kWu&uG*K+C<L*BnJcQ\yJlHS8/Vh1\XVYwQh4/M!N*T!p4@@DTTS^FA
9+QVh+ ld/&>*N&5C\*dm!CmWk!mR%1tJ>Ibw!YPA9GhFAB5qRpYmWiFantJYPi/wNnJbyMR!Nt51dpy\*56!\E
k+q<Yk Vt+L%PMK+X51=*nBQ^dc5NAGDT/WA8DSZ@49w!?8iTj!Fteb<6&pVB5Ai^NjwVqWC4#N5TjHNmViXmQW
1GQ646 tALtmND/QV>NwZ@4!pESiHn%dbMKADW8Nc*jyB*nqZVT<!kW4LTyNIJd#nmZhAX%HIC&Nn&Tec=H54K/
wh5Q$% >CBu4QtAKaD<KuelSiTq$dA#?LA+HPec4w81N<&Ch<<Bhq889Ql!*qQ^SIQH$hiDY\h+y#$?lZhY&G\B
6MSK>c >^ci&E8b9b=?IE6Q%hJNytl!+9QZ%cXBYEyQbj%F9jlT=FyNyMpDhhk8>BQ&&qP9B6TD@DYC%lbEdh9:
Yb:#qB TKPikYemj@1aya:I:kL:\6tp>^/Ic&hW4&4mY$Ru::@6=J*!pZ1<uh?!<STG:y*#yD!t561W%d@#?%SY
cE$My^ =etAn6:\<p9G9XC?ywn!<*b4Y^RKam!Y@B+?uJIGh?4JdcuXX?J%R%ZLTqbX=ZYF1*K@?9&dLPSdpEc4
bIS1C* WZ6q<EXFlQdM#S54LJ&khEEZ!>mJ+nFnuAq9:#8^#5L\nA6JLyl^P*SQJ^+n#@\AQY?B#14dR^K#Kh=S
H5K6Bp X=<qFk=b/CTYY94u/+:+1ju9b*!=HAn>An*aGt%nNbFCiPnIaAJXhwiSVD*M4ZuKAb\/i!:I=wwedLIj
@BJHRu 4hQ<$59Rc/dnuE^L1=5HHaC+tJS?aa6htL%dl==iCd9mP+AE=4\*N/iC\QayDP9\%kQJ+??>pd%D!=eQ
qL$9Kc m8$NW&*qPaDT:49aMR>whXNK*J#%Fi>8FBmM\e>%KT%?XXbyG=jdu!5</ZbB?daan!\@P??qdLD*wG&p
j/>?hH G:wyWH*ha?=%hHIuiP9?^9ntY/Y&E!Mt56Z:n&:y5?WFuk<XAltII+&Gic@ZSPI?haMq%Gb>IliT55tM
bKZZ%h #S6$AN&C9&:qRe=EGKl\4X5G\dP+u$F:J@aVqbM*IywGV=e9i/jG/6l4>y55n1*?8wbmuL@Pb$/ePk\m
1>8=CR w1Qm^\*uP=TNL+X+yeG+^MZ<\$XI&#cFB!jkAPKn$8a6hZnln?/&apab:MJS:#Yp:QV=:mRT&<nF+e&N
BLn+M! aGJ\Vi:C!VMN1b5MNh@uyd6@iN6Y1u6Pd9#dWkWk:CB68jK!1NPCNuC1XQTcW8TH!XL=uRbAajIlFDt&
S!I<y< ?H8?Ih<4IDS\utWWcQL\PmYFhJhQnQ>Y6QQF=C=%p<$$NmneFLImm>+=W&$1jmSn%!/pQ9@Ti:G@aPjR
C^ub%? th^AlaMLM\+HVk#:&yQ%P*y&tD?tee?/i=&194+u?ySiCRCXQ$!4$Pp#=tk8a<Q>:pMBN>c6P5q::JVR
45mW>5 VS&>FWA\<=#hKJ8STY*/!DM/TP=W4Hyk9>AkW6iD#%!4!!Xk?hNw\?G^HCJawaQk4SnEXXN%Ke*4^LpP
&>aT#h NFaLRTu*JqC<ZkluF>XwDJ/R&SXqk@SqSDyL4=IWYVRbRJ1B+kK^!I@LV^=KZ^tAVP:8Q\N%?W<Iquy#
@!jKaZ 8AFT1Dkq>HMhK/JWVy9TJGu%MG=DEc8CVyIICX4q@SuwV:=SVENS$hE5YY4\$N8h/HD55#R:lM&CDbPn
DTtb>G lEuKmpQey&GHt!aWy+y1!y>NjNMeuNl?/?/9jl$HJG#\mI4IBmQDeZt:e\!KaBGXT<CLelLK4C\@#SVZ
+bqw+B dcIQZeLJRbaTL^dZ61RwHK4TZqt*V$lBi^DjpI/QyX#nCF#FZF%$WwY<Xch@A6V\k?E8btlJmdF4m9%l
m<hZ*N lYiQetTujXiWK\Jq6Xiy@yScMp1etyd&hkwMh4iBNSpm^y*p1u\Kpp81d+ZM\#hlqp<=a=nX5t=N#4KR
M%9Iq> %/:\6CN4Pt666X+%Lpj@SW&hcaRe\CNa:JW\:G6GZttd5bEBGwDy9A*j?XFdBmJeS49N1XR\#TtwK^4?
<uE1KY @JW$W?R/H>t?NNKApSNCAT5@WPTFYjlmWnH@$=c@%BmFyBB&#uVaFAN&db/k>5:%HdaRJ6K@qd/S!tpp
mKyD*y ynCa/6I$4mjk4eiPE1QuubSp#\Si:NJPXNci61nnayR^HT#b=\&M!$PG=n:EaAI#@dGA%YYP+n:A6Y\u
Z8?e<% K=\Zwun\wN:Glk1+AuaZlGF9!I?^wVKd#T4^AK1+in$NTJN^4$WySTB9HWm^V/@wZy9MtaLK/q>TaY/m
A&MRt> 8M>D=pB<pja6+IlT=Yy/QR&P>cBeNaLM=FTjKVP@hWXEu%/69ea6lqRBE#%Ij\^KV&^YRlu%=cjBWZm6
@Lb<L= hiMIpYii$adA5$p:ZnY*:bYHW/J8M%\H^ujkZqMk/Kqlp:KPWZu6nL@w6N#AtZP?a9q+&^4?SAl#R<>k
=b^>YV VjQGBp6Vp>AXW*$9wWcydJ<ManqF^ZAE>5R6RDuL*kpRLt<mYL4whQl?lp@/E!5w=*F\aV&?ea95$%=*
$FbSct uPn4\Hn6qGHqj4V/W4&!tnpF1PDc&Iw=lXkBnJ#</^9J/tRdAGbpCJk#!5$QC&ARIju5u\<9<!MiDdmu
N=5bXV +*lESe?4K6imt$?YL#&EqZaj$=l$iN<An8dD9QXlmdRNFdpuDblLq5K&uFi<LY\d&hVMtVwucNX!Y@LI
qktSnn eW>wPk$wXeklD1Vy+Rd/He<y=MlX#H?:1jw&LTNTF!eM>qaLh4kNYTaqD/kD/MTb<uJ1AYGpKEY??IPB
$iw8M1 k9lnyu^bj*<QwRY%cBY\9ARkF^nu+JaaS*l*N%\kSRPeRp8\KSwLqpq\4BA+FF%EEn!CFCiQ^y1TEqEW
+l$S?J ELLt>a*!9pA>5bM8M/P?qqA?>qKbPtMt\ANE6#q%^haK^:K/1j&\JkMAZM^AmwPwT1yRcSJua+WX1&^b
&bnJ<K Fh$&S?k8ZqY%k^t1NjSQZc:kkVEqFd=a@6c6WNaeka&&^$J!%\D#W+jbQ=QqIZB$QDW>Zwua?j\wP4de
I*^Cyw qL=%C9>T5YW%FLeMA5!qYLl\#p?Peq+SjyiCRNStyA1lEEm9CJ?C6SB5*S/Q<Euh<B\dXuq\j:hVKE?P
%8?Nki qX\Eb$G!BB*^yEH@\Gy^4$4=qLtjYFY4:p\I!d9mE<CER\ZREnwW%cH^:Q16\BABmnYGH>>8lum>cXHZ
XNi/*^ /$%a4+l5JyBpaALhTBwDVp4a>WRV##R%JX$u\%$CB9tB$GteCehGVZe+Ce^ZbSitLdekY%B8a6n+%m?D
t5FJm: kI6eFEJ+A6=KRXb!j5yFR8hkJ&=/\ID%Q>qHq%WGVF&hm?VK^QR!WATb\kyYCMhkWJ4/jpd5@4:RA>ZL
qaLh\P YKllN+m*k^K*RSt?bR#u+>R+RaXG^b\^phLNB&LWPQIZ=*9wK#YRPZw*M\6iSD=$Kb1SnPlLk>a*6TE:
am/SW$ j#L#T/9F*YYG*5Zh$alqM/SqReMTBCKYK+tmNaTEc@Rb<9$^Ly<qFXJZTJEtyGIF+4$P+bNy@&qDCR%i
B6KHYH \1WCRy!dVE4bM1i!AXFT=H?%d\WJLy$R^5nWGuc=Y#IVW=ld%Xq>d\W!PXCPjutVSTe6eJ?@wpGWQe#d
eVAehK ?BkqA$:5B5RFilWAwJk5PiH1@1B6#:ldFXP^bNZ@tqZ\#n=ZcC$C=P4B9Tt1YD#C*Sp$XBWAZ48:ZVX&
-A+8hX 000202094dc001202b3 Page 412 of binaries1.zip
//p!?4 =5HE/&RBKDMEW5ekwKIWAi:&*ZXHD*S>AZ@bZ#u?$DM4GWFWSBa=w>#5K*XV<ZkKbCm?a6PSpjYpa6<L
ES85#Z XW^*t*\815kAT5!HY9jYauQ1GADM&\p!Q#ccXnhM8X^eK\89#SN@$YJYB*m>*iL?F4Rn8$mYKcY%G&E:
Z+$&+k nV^MA:&?wL&^=aS8yVL9e*CntCF+GYR1wunJn?FW#h!/i:T6EQ+qa?VLHl>:W5ta?uZ*S9\K&wHSBy%L
e@Jk9G :I@CYyR$HmRI9ApXa^q:4m<&N=WeGmQXZj@m+nNV+i6+$Ni>bihM=W=PJu#%!Hlw&Vm&!?i6!P%S=*kD
eytb$& $\jdNi:jMd+1G8<@Kip6<%NaJ$DH:iV+q5Th>DM>NS=**Lj6+I*tT*+uLy5bA1mye:AwF<@?!!NjV9w8
WdhKC? mt@w%944qE\R8u$ult/RD$MA+=I^a\kp?El*@6Ey:?KbmB6bA?P/J>#nn6=auR4AVu8tPcPEc#9H&L6y
b8W\cd l?Fuj6lqGh\pN$/RJ@&V#@w@inDlNPlhMPSZe6wQ#MHYtu9XdiWD?6ncdVidL@nQQAy$j?m*hjLtw=e*
/ddBHS d*\PLHpRYQB/uLEh&&T@9%5VBX^HKcqM>m=P^H&eYJ$Le9wT=NQF>@*Gy@BElydX6dt/<K<?V9eD?l<H
:q=Wuk :yGddQ5$<jd*4WZBiIh&#%\d:Hw1LKNEMKjKkV?@NjT1W@ju%C+bVqMFe8p/pqEHa$bkc^qVS?W=j?GD
bwn*Y1 MRaqe>il?i=XK!^5dW1\5+J%*K>dlBiVac8VKenyW6L$Z6V%bSN5LRqLHCkFQ6qwIIMQwaIiw+P#hWQ<
VJGL$5 W$6d9SSw=XNV%:HQ>Y#$XKiHhaKQckijM:%>FuJdk#^GXP<E#!G=q$8\W8$V\\HQdWL>@\/8@lT/\Yd!
KS=RkJ m6*$Fj9dn^%8@&WYPuRWBq=HnZWLjt:CMJMC*6uiPe1+6jLq>mGQ5Jl=KHkh%wtAX1Snc#GP\=:t!5b*
48$+NH 4yneNnP@hVj\>4B#&N&ked^nhSMSBBJ:e#j+:VL*?56y=6HF5C9S+j6N\IqbQmXNkPZJe8DVKVFWuQ?M
\eGEe: M!QM#DFC&T%Cn#N4p#lewaK6#TqP8>/hHSG8HBtiXV=:NHM&QHuYI!1mF*q*Y@A>SMcEN/!Dw%6h8?bI
y\$a#p Cn9p/+cb4:ccKY98:hwpI!Z8Bi*8Hdkhke8J^K*n+LcQ&&SF@LXnHN+JSS5w4il:QT?<m!mhid=^JtB4
!!/=e* %K/65n/aeq\q>im&!PV8i<yb>^/9u:&dM+jd+S<X8thF>4=GdiV#8mlE\>^j8/Qi:a4cXld%tD>:1QE?
>\*RlS @!&kuX*hyG?!6#F/G#</Z8D#%<+Hbt58eK?ZHtwq:/&?X*A4B6ERW*4p@1=nD>y?R#bHat9na*AHH##9
ZPwX&y nCF@nwp@E>IElNLPAW&el^4ua8QQqHb4<Jtc!C>*a*tpB>u::?<6n#q=LPdw/bl#^&LjZZu+X<i>$p6^
uVVhEt bwNSi!@H*4\cy!F?iKW=d5Q\k$MnD&?K+$wqeZ69^G$aj^S?+!Hm>Q%#6?c!c*!jD#+&8^N?cPm^^8Sn
Yp^ZI$ ^LY+8!N^N<jn6$*Gd=mIQ#V*?PVh?KP*+4MjQu=<ji:=#eeV&!9R@\41cj%@EB6nKVkLu=#pqKKWbI1F
\9@c=1 i$yliqJKmBidatXnR:Gl@\?%WQ#@nNu@5$#I&6LG>9<PthC8uYW\d$J614u/4lLw>FBlYJ:XAHbKwBCC
/EZ=cM 6>DBTlPldSMEP%W=V=$/aKCKI8S$FF9&nSedp/<@y&tL#m6+upBVy9lyA?+$elA&X#AuFBk%auC#@Cb^
yjVDM/ w1H8k?FY1qm+qNedH@DC#&PK5<H!1ijGyIB9Z@QPQ=\5?=ZT^*H4^ib8*Pu#Et:I\HlGb1dK1^&$um>X
S+qApY <?556</@hMD1utZ6SJalecqe8@+Xb!>c?!cj+@M+T=t/G+$e=A9:elu%m$eXSXqZE#FH!EuBp@J!#Xd%
VEcjQk cN%HF?M*H+^=8ZeI?d19L+8&i^a^TD&bIaelS=bbuTKP:wPThnt:?YEHpp5\S1$F#Wln1++nS5cptqcY
Bn/idC 5e+ZhaVpkM6<B/Rn8e6aHNL@?a1^!i!*C?Pjy:=X:TRTi11KtTHuT&HGQ?hLwWy$IkKGnTCX\yyC!dR#
^KbtkJ TVC!q>?BJwJquZDm/4Z14cuV%:N/e!iGm%66!Ll*&Kl?bHBdq64%n&FSN&^Q>lGc>VkP>GjI&lkYueK:
h=5j*S @Qb%YejmYc#^=#D&/hcQ^tMED<86MYNqd#1Git$?h5hCS$%*I8uhhMecA1+ZunE&Wy#:YBWl/t?/&MN!
=tecH^ p@Z6wh=IeC!q#+ShQQhqlTPi8T8deDY$aVtWlH*tj>T68<AGd<6ScC5P*KZn5KnGEZpup1#*D9#8>eIK
dQ<nTn E!<N#&=V9HmCeEmibEG+c&q/hpPKZZww+i+Gpm?4/tq81dKk:PdhEG#QyX$/*DtHi&<%%kW?6D&upQjw
+8KCB* nahNFQ84:#%c?+JN#cFnb$>k9%MlB>?Tpd=XNedw*abewu8h%dkPVXThP*ZHN4::/6M?CpFqj6JY?^Du
#BN%MM R$!=atL*dje8>=9FB\lX^SG!X5e1Q@Y$&6$/G<>a&FV6@8NE/F!<45%CRQZNW>=jFd?bV&<aByFlW$>%
C+B>lZ ^kK&u#lubj8Gj1Gu$e$5*%4b^L+4/d^u!^R6LH:ZlT!1?&+b:$b4L??Bn^&9#u<\&XbiH5&d!BidFd^u
D1%9k! jk6%P?lK^q%ciV4WZjmw@QT>^19H!JpL$ySdH!J#$!Su/XP9Ce5#yDeJWX@*^ZyiJp#hT%4VP#6=wjRA
F?&*me N@nl5t%CRPNTlu/5dLq>tTt^:Kh@pP8y@wBc!^9aJ=M*#=1ejK?iP@h&@bb!Y\?jY%?jQKRV\4=6j9y1
W&YaMA :JC#\q4pZ=TRT#>h$S^H4NZiT6jy^+%HZt#e<cSSNJ/iG#YCP/Xqdc8lEHw!XNa=\Lqh@CdE5R#*aen&
BR<t8T Ymm>K<I1LMPAG4/@%ZbZ*bC/&Y9eILM:m*8*PGHd<wbqqMHW%>maHeleEhNI?AEtbNWX:^diPuFlNl6*
5X#A6P Bw$BP*e1&nXEB#k\C6+KCac$tB=aa4XF=^ABia=Yk+5N&&kpp&!S>^T/bwn1<WaTi*mWpy\auBX5ZGlX
d\G>eq HJddPVt\^&Zh^NlA!\5eyc+81?=8pAuupil\:?b1p#aJI<XdJB%C%RbLy1@hj4GZw4anQY5@qHbi5c\!
jqZSwd N61RMmM>+@:/<PFa<m=AcD%$Nmb6h5:i9H%IySYMTYA^dcNB$h@:*JCEb<<$QK5<GqSD4YIj*hDekW5q
1?H*BS /S4EueV&Z+4Yd+!?8D?4h/=/6KE5\jYGVW=<m8Yi16h/i!!jXYQH1hEH^R8=m4AP4:p<9KQM>H:1pE4=
lPJq1D ZJKBi$C1nkC5Jdw%@/p+\5%LG\>eE:+8y#WAI$Hj&DX6R5?%>ZE%bQi:d1F?a\GL&!yEeD%H6hYQcS@$
N/8kdQ PhwqnV<mZ#idLd*/hSX<wcG\j5P?W8!qkZ$@jHBdywy9nS9+/<bnF/puwnwYFP*&9hhwDZtanhhLb55I
PFHTCW i#6LZWKW$SeGWR914>/e!K<>aV8#Q?NyVEFYtIp&!9^%:e449d=dZ8TaZj#$bFj:#tC#6<CwY=tQlTk?
ZyppI\ cG9K^*V*C&9<Z\X+:h@dV6HZ4q/?9<pydZn4wiB:!=p*a8mYXiTd?/4C6W^nR^JK9^CN85Dbk%&jn//@
^hGXkK d>?ubH9Q>F%Y#KScu8VV%H##=?np885j#d\munRMDCNP1c$bP/1BMc*?1*JMct6&qu^q+wG^b?QQ8k8e
SC$1iL &=wuuRa6S!\:a&T*Q*d#GFyuc/q9kj/L<I=w&GT^IRn=+1K8?hGcEIYQdnFi*$nb%#Q1%<MS:ua%I/H*
qk98Q$ %+ai^=LE>*W5XFn:dX+qD1PT+#IjQl>E&FI>VQh$>&B@FhT>VnjT<XbMjZVtKCe:R$m\L<NXQ>dh6PL5
L+K:c> KwXP>hB&u1LqXJpj6^9:@SHNm!CeT&JX#I*/j!/&#5/TtP88$hZbGb#Zl!Z+jyilVw6=@1yuwME1t\h>
ZV#/pc 9$mhee4QnnZTj^C5h^W&HZ4cPKM6q^eQFy*HcE>QHL/uL<:Bb9?XFL&#R@^JD<PD4*SGl^RE6*&&Ml91
8HYTdX GtSW6GjPn^@KG$?@jeBP5?9BTu=d^WJM5X6C>PJYW4*b>5l>phimJZ/yXSuuAt?XHK6e*HVc?#N9l9pb
1uRncp %jVqatq?>P?jc*ibE?MQyp$bWTVZ*L6nH\G<DbHyF+>>6Yuh$IdJD4mcj4:<uj1dX*E*V@j8QdK&+8Qb
R>u<=h Yq4*STh/&dQA#IWE9W8NdiwQ4l!w6>$V$8i:cTM5JttV8c>DS5RRITK1R:TdX*!&WCQ>uNq\?5utP?d=
<m/R*@ YHXy&b5$uiH:8Pt%dyp?8!:Ce6j&Zpw$<&D+utt&aaL1b*lZm8*Qu\:ae&uj*t+h=6nq*d5Pl&dmL:\@
qu+J<e >+!\#n9uaj9XL&&FAX9P?@C/JSWD4#Qp>:M<b^+yPHj4qEGWaj!m$QNtP<c6IT*j*6jYQL?4$^wak+GN
+!qS@Y ILBHQ\=C:^dh&^t4hT=#d$VZ44hnd1jD4DXTRXlji+?hm8$L@56<$?IZYMk/$>FD/bVP#w#6wT>Cc+ka
tQMI9h ^:ja+9LbI?E&b></uKCueVQ8WJi?Y\cpqk!Qp=!ZN&*<nb4j9:yHeXLnAHBHWj4!Y?PNe!pNQ!6:a?Bq
bh\a5d j#Y/QS>Nq!u!WXXc?#BM!Te*$m4@4I&kPXZ:W>G/G#?*dRH*dk&NQ*#Ry>Mc>c=q#H4LjbppueCW@1&y
pqYVd! !6IXJeVR:N*qCGdG^!>H5uTD5ubihHKjDNDbP*AB$LB9!Me/:I6Nj+%<5&HH<\$H@F:e<*5Hy!aeZL%&
X\%WL+ >QTd5S5/?d?P>i:@@le*udS>>&^8b=u*Y1DA/%Ewe>Eml@8*eCV#\/QGZaI>$Bi/dm9QQSNNY1+?>#?M
ALPnu9 kYqHA#YZ<R^9N?TyIhB1TYZe?*&pd8&Hb+aYk^Gl4aGdwG@QyAetI=dyAXPi6at9&/e?%@!NMq8NVDG5
h9=e:j 8=Z+5*IZ^Kmn%p9q/pqcNl+<a6n8lea<pQE</R9NNEdP=Nb:5=<mh?@AcL>6\!N6qk8j*mwJ!ik#1!de
:b6MDC t\y<Bj*bQ&\9J^PE>VLDqM4DV@+P+eRkh::N><Xj1jw>h\M/1i6?*?j%?YN^DiCn?<hWdF=q?NW5BE<E
wATJVF Lp%/Q9F/L<YN>Rec>8H8K=/eRuckG%MheeP>uK1<V$aJi+@*T8Zkq?T:iwN6Q!&%B/>uQKw5mmyJ\&W8
VpJ&WA QjPSS\cTewi!tkJyjl#65SP#XETFwe=WkKt$P>W<6iSdu6tqaM5Kt?Y5N4&K*PGbYi\^$tI5i9I^<eTM
Q549S$ @$mRttt*I/+1biIC9m^%591\LMky#X!Ml4uJ*NViMDX:R9B#K#\4y>SlJ/$Jt/aacYB+:$#*=?Y$8lPj
1XF++1 9mVF@QZ^W<=R^Al*eh$8!5=nRF+TQG6ZSMd8u$%/a:iZeXyI<S&>E+/IMh!::b:hMMAKiNthuC8@?N9#
1#X^Zd /8>hlVtu*=jXJ<!iiX*aqmhZ%4kX/EQR6P&$<R=8&=8jqSktV>q46>pZ#=pM@uTmlDpq@neF@TLGuV$R
L+>A>B 1E6=iL9JPZEk6Hmu5e=9mD5WE4LLSN9DJMWhed9jpi*E8G+X>YuSXW^\e468B5W:Juw#6H9au$aw1Sbt
uCYRHj ZCa!1hci?#@6>KcWC6\m^CySpbtK4S@a&wLSDCmhMIRJZNuN!MEi++/1n?#^HwN=#iY6B>Jw?i^bVte#
WEcWbW S:@4qiH:cL&Jqyj!/CV&n%I^F<m>Ba#LI>+nwT&iP@>CuPq4<8#L<cJ:VJ4TJ8Q!#ybCLi6%Bq!lmh=V
ICdVkl E***hY>**/u=LHmTYZdVTT:n\N46t/D8+5<ay%5q^uZNTR4!N9pdhXQc?GN&VnjtWqwZhpPSP8Yil6WL
-AK/qq 000508950aa001202b3 Page 413 of binaries1.zip
:iT\%@ qikCu>4dVaGEGwQZ5eue\9\MdHhC@pJL61X8\dPE>8MJVcESlRV61wp!@=CK@$RFV/j>Q/!C@&h#\j@1
:P&lVS lYhRdK#6@4i><H@8<*?A\Q?n>+B8?Z>XDB?Sq:W?K5PV5%+:KtyNZkR9^G<NLTE\*C+pNV*L%D+:tc:9
QGDk$K c?1ZcB!V^E!\%5?MVuY#V>V#!@G$Yi?D\$Tt5:qidK?$YGMD4\Bd8wWqd:&ye!1D69+jL9iRdP>%@yG?
1ZTNR1 /VaBul!iuwhujLSSwu8KP>9APbuuHSIey=8d:aVD?Fy!9W&yj*=ME/1hXWC+Zy^%TEaYJ#\<qStcaJGc
8#TdCh /YXlb<&&N*d&MPZyiTct/*p/yntc4VNeE^4luBMau^1+FwilS1b:JFl^@aJ<$4R6#T&T9Hq4k6i5M\l^
nlFJby +AY6M!@IVtaHGAeqeSP<uYu4dF%!+?miMi5L$yLT#hI#ZQ^h<:QhGDlM4y/LWXm+Q#QW^VLJZNjbQCk4
PTpc@A Jee5&NQaT#<qPnXSN!k&QN/A<ii?*4yB<Vb=n4d=%44b*qp8tXaFc@QZGiyHl8A\ETbS*1HG41:t#pb5
68Tp9B A=cywWEtLWnQQ/@A!NKL=&Hma&#k#*F^VZVS!VHtPWR=<hlWB/<EE^?cR/1^utqAtFNTFA/Vtb=ty=QD
N#Pi!C C#YJNX>4c^mdbPaeRI<M!E9Qe/Lq=VubPKY^w4&b&nE&GRGy^yEP9qG<jL$$6/SE8u>AtFGmu/?l<#?W
?pc+YI :BaSd5+?mVqBwXFbVlE85VdcpRqtte#IGI?%TZ=5i1bdpI8XiYy!pLeL^<$wQmT6IMQIk5ilYYl9CAk6
imZXLN eKJ!ebkw!\$iQP%enwN#4EEWM=Vq1S@m+&t$\e%a&*=NKNZSNDe<#<RyI6qGJ#9HKnR8QTDLJ655!Nk\
4Y>#m& !!>cn^EYdJKjmeM+i8X/BKVqWh&D$wPT%6lGJ^W\+%IM5nIKWpJVYS:8Fy/tywbe8:Xl94GS&89V%#EK
<dC=eP dBLYJ&quBSpGW8$N*bP#EuAa?:VpLCeduy=Dnw?#dbBPkBXV&<*jl?/Sq/yu+iEW#M=N$e+!>ii8wcXp
9NAnnM 81Y=P86:8j9uWuP++VpbKbEMiqV&u?w$mjL%mKQ4tkcG?BRae@&CDi#e%:NChd#CwqJn+qI<ZcJ#dRL>
JZTqJX >Neq&>t^5up$V1K*m!e*Lh$ln5t$>9V#6NDL\YGTQZXh%@ubJZtH&^4T:c#mC\KMiD1&BT+&&wct:8^p
LBaV*u +*B#y$k4VmR>IIGhYPAVFePq&XB>LdI#@S#!$5*y*9F@Z5R6dWP!5*&EZb/@q\FD*!DeL6>6k/YhM&hD
>l\+dG WnJ6*S4VeJcLYcCih+RNM=!d<k?99YWER#@TqchuGbma+yEWqy&K\/\%#*S#Mple:^MeT6&\ketIM*Jn
?eYRk: M#ID+6t&D1db4q:ij:yMqB@DQ<4j^5l\Vam?LT@1Z+9l/Xd@Y=IWt*<Y\>9<&&J+t*<yl1j@5?1Cd9X9
I=WAJH iqDw>H<n?=<wN8k&@*ZY!8yjT>dy69>G>n<S$6Q@N/\S>9@TGtF9>&>aI?n@1#ZC$5:Y*9:@T&5EHk/D
\4H1GI 8meGM>wm#FT4QbPC?^aLudX19bND:HWdA\\c9JnhVep>5cl>p1QLF>6t5?&cA<VmZQh9Y&YPeFkEDPFd
Pk8^9i yRh<imt5C&i%\/M%#LDk>T=&y%6u?C8dA<>nLu8jnH^XcJ^hhtX6Y$VY:EGQtyPbF+JbVKdym*ed?@*u
XnHG\% 8!8!#L>BaNDu?%d%9mXlB1RjL1\/!cy9HW=PJc/&/@P1d@mjbXVd46M+QJd<ST$8acNjjVHM@EBF^B/>
G4tJ/J VZPB8a+c:ji!L##K&Sl:=eZ*dhip8S5*H#?NiZjk#6LyQw*WHZ85:1Z<?HG>eQjJ>lhLt#RPjk</>Glm
tuT6I& +?Z+\H&S\>Q9Q9Znu^npV!>?Yh%\+jjcji<?nY:=>jiP<q8Vd@y9^eG@88=?8Q#^Gk$8C/j5uqFDPZc4
44FplR l>!X=FadL#EtAFZ5aP%db@plBc!HRq>tt^i5y:4%DaGiY$Ja<9n\F95*P:lBT>Z%@bAFYY#=KBM?Y8H+
!lpw5% EDM1Q&F%j/nij/@i>j15R@J>>X8&/j1GuDlyepN^\6=\KDm=aL@H?q/1>8mW:lW6!bu16Va*4dC*4Q%D
idVReW \^:T@jMd!ku?6Y<:#aL&9Q*L>WdIwy9hmF\5\81YW5Md8$C49>Rh@B6$$>&DQ=je>:=hWI>\uAkdNq<?
n+QFkn 8kju<9uP%DcYL\CppXECwL4T\?Ne1W?$<>&nc#^De+<1WY=^HpQ$AKBYH\MXhy9L\wA^P1+ajLhn:RMF
AqayMY bRR?NQRAL#n5:1H%YcNu8E:!JSA$YkHPw@k1\TWMD1GE^apMjhAd>!41+ec>\Vpl>\c\KkA@P#QBde@n
@e8V9% Xt!yyIkLSXJ4W$uS%:5hTGYT1/nKlX*L8XCWydMJi+d8@K\wcSMYuEZ\ykw%WcJq*S<wKbFjG%bRtl*@
&9+peK yHA&e<hNaq>?e<L*Z5u8=PC4c\QQWJaEXDmdYKHNQ<t6%wS6K9$1HJn:uZ*+!j+4/=1j1T$?qT6LhDH8
nkF6&G V^6k%q?G6ZAc>XGC6J%qy!qFNFnyR<%*q<?4#hw$QdW^DSYJ^e9NBmZcaM8XapF6ESTVKD!?DTPtuL:&
JW$n=h =NLptiP9H*#49BF#<b:NXR66<hq?8=cy<%mWAP\#F\^<!pCYJi=R5cmG@MwmAe@R\:e*Hu16i5Z9VP&I
:n>ai& FddX=9LN#=y8BDQ5AuGK@p&<%K+pbI6udM1L8XQ\+n8GD/C+B/wtm^@&%j\%8Tut<ahd&?LG5ZbXC>%T
ctKVlk /^1h^wPb&?+jM^?YT/R5Qb6K&+CG#BFkKumN\THAT=LtXN!h5ZLk#5<hbkwjL*=4@^F&k:Y6%5h*Z?$D
FHbD!h VSD6K5>4yyYLp:Zeqqu!Ww@Sk:WPKmYADIVX#>^VC=EN<SdkE@E1jGBCE&=al8dmdhH4<hwB$myAaIc<
DFy#TB 9NV<?DC$&JNNW<b#8*ZaFVZc#Cm9T5Bdq<pJW&V:?$KkTBl:KREFDaQLeEj$^GNNRB*Y9/RiIi6NQKDE
w<JD?> 9Xl*:i\+lRXwc!jtKqR1\GFDhXCW6E>QS6kM$?t=n^HSA!8jt@>+118/J!D<m&VM$8DyECu#>Ht=QdWQ
pMSGnm =RH<pe1&KiQmaEAHatmIuBeHXh:YqweT*ZD%d&*lhm48E4TRRNEN^6C$AYbFt^#IKK*mLP6=$I:=kIB4
RVw/I/ Fek&hlQLAhAPNStK4==k:nltkBaBLC6tI>LeeNM8lS=IYwNkD1+ElpZclZ\CkGY<HG58emep$XSReXcF
H/\/Td QYYCpYSA*bdQR>:QAdK=D%B8?IPEkcdaaI!i?&Dd1I<InIM411mWi89l&I9^5tj<naAXJXpJ>@LqSBX<
+eSW%t Mh4tWP@N!tHqnp%\mBK5!wEnK*dHDKD*h4DDHQ%@quPKCcIGNMN5=&\lAF68l+A#Qu!<A=8bdma4ZnVh
TQKF%h !h6/^*%KXjZV=wC4Xj8mn=98*!P9!YH%GaIQtd8%&jkD5Nw?mJ9*DmSjGk#WLyq=Rm:CSdZecWee:!&n
GRL/PZ CLu4pD=5tc+W4$bHjcc>4^AVcj^qFyHZ=w/e^6QeK$+wmiGJGKqckBq:1u%5/$4^km=%nPm4I1lk!*/$
qV#5TL MtM&YT9ACA/\FZNqh6QIGXY=!5yk1J/HZmbdXJC\p+%Wh8N+!4Hj?kC<DPKRacp!&I>Ampw5B\&Q+$RN
T&5IdK TMnW%jp*i8NJhV?@>GH&^uB:=E:in4eHqyi%:u4H\Ab1a19aeB!:i\\a^MMj<aw\\*n=Li%$$!8*Fc*a
1Y#NJP *I!?J9>R!Jn!F5LTZlqBGB?mpAFAtp#^Rq%Q?H!DI4SdA8ZBhT8qEdCaNIlcEm%%*QhY#PtC=yH9w?T8
&m9/8e &Jh\JWMISPkWE5XywBX*F^BcDG$XFJyb\HIZ<5L4E*5m5>W1w5KJ:N+kNMYiZutXJF<W5mAVE:YHCXnJ
G69<dC k$^B!S54Jd:aB5yK$?LQTkMl6det9^%#MdkSWR+CN#8?cqbmQ&u4I*&RBPF<yHE6&ZJR&AaZw6Qk<^lT
T#Ft6d McecQlDqZD6F$C#RFM&\k<n:?W/RajbhJQmY>&#M?Pu/>$iQ:S6W>^E%R8D6y/^alYp<bnNp4KK85mW1
mCh?Qe 6AT9d#=TMR$Z?*8YMp?aihb&pYD+yPyeF@y%5d4M^V%YFYwS>WPWJnuQJZee$@uIS9a&pqB^ZB99SLGX
@YJd!B #tyVaqC%FALAqKIX&G@yjM58QW?GYGckI\S<%Z6AMuZ9+V/5K@BZ<maRyMth1JA4ab&y5hu&S4D^V9Z5
*!EyX6 18Ywp8ed/jjiq<Y:?pmi%^YIR%lwCShDad@W&TNh<q8?4PDX6?t%1y9X*/#eGHVd?W9Q9q@>!t4iiHK#
V^>+>X /dca@y$m#d45$@pWq%w*tlPbY+C^Q%i8XPllAEw@&i+T%!Fmn@ZwuZK9GD#jM1QhqF&ueHHhJiylXb&N
KSHuVp =#aGG^6j9QqGtX9Ce<9F/AyS8VSypXhF%@V6Ld5%ZwX5*L&?u*@:?>wAJ@:9kiW#ZSkt^WuBC\*D9V@L
RTl&?* K?p+?jAX#Z#Z^#TAYTTXw$:bRJb@^=e%Neqi&jhAL&h!u<i/cNW6ADdk^AdEkPHM=?@KP+yPc?LB+:8X
FkpC44 hEy+8@l1y+KIHcT*9$d!=M1iW*d9?uuXYjlq5naFZIJ?u1?lq9&6tM<cP$Y/8nYk58Z:TWy6C\Ci*R1b
kn:NAj D$SBV5uSyG$8j\ZYLP:8?dn8>!<P<8e6!k5PNpSIiT&ZlYGmqWRq4jNC6Fn:d<NcY#GJ#CS<q5d+WZ4J
FkbHn1 ZF6#cc/?mA/XbH*4=9l<!PF\F>@jbBNaTAD$y9B>ad^c6HBEYh1#l=tM\Mh%TBtm*hY@wEk=HlMt4mZ#
5!!\^X &%HWSkSaLeejX@AuA^B*idD4:%9#RP%bCA*#1@a!8qd8p>5*kPIk8:5MLm+:>4cE!CjITMd^95pYAHCL
NXeht1 t/yPlZ>?+?pH*Ed^hVGTBlt^GCH>CbGP\$WdwFKwC6WCaWu$1a%\y#nI!=eS^DpA!KEIF&EmSendd^R\
acWTGe V9qaNaZbw<l4S%P4dwmh!GL>N%TBtp/%>&APqEyVuVeF1DGpDw+CC/4Ge#w1lyLjjXA+W?K?Z9Me*$cS
>:X8Q^ =$>knWDj9eaIj<6CCVCJIaEJpKn6eEpDnpXRAK6X1PPKppT$GIym>d/lFu%j#NYAuCVl?#Twh#YK*&9\
4<YLZC kD*4FLD!F#Tu4taE9\+:jRYA9RWw>a4B6RlytabASRN<1<m!lXBebIAP%Zp<VLmkIpyRwXaRYBkpL$NB
=:<X<S =I*IDATaNQTyLEZ@d*bmSaD@APJL6^Z:w5BXREVjC@a4<kP^#Id>$mc5>LYclAPIP\k%F+q=JZaj1/aA
VJ4PI+ AMt*R:%DEmSaDh/jTXIkkbt1^1yXbR4IXLR15+9EycBN#/PpVq$L!j*mC$a5a?^%T>$FdbRIaiy^Ce9e
Jw+Cwl Kkik=aBXbY/XKw5Ap#bn8W<WAF6qu1$c*$wNiICVkmV?XdI+Ydd&6FbAEnyjA:*?nbZPYc*8Zthy%^MF
%enH?k jRYSA^aAIICDHA6Ra@=GW!lR^Wil<!$Qe:JiwpdN&Nw+@mZbRZ?MeAEHiTDHc+BV8A4ADJtK%\BPRKma
&ui\&n j4=AndhX6d6RV/k4!$?EM+>yb1@X!9t$NHXB>5=yLSpd1/t?NXCM:HR6RYIM=I#a#S8T%$jM<&J!<C<t
pH5/8I :#^&@n#9a9$EAnXYEwXAF9JpScqKwphJFKk<PKapZycX\GFmQhWBFX!:44/+m$kb\@E>%h>KDA5MdV>X
Z$iYpt 8RpBYZpVSb/^I9ZJZ/Qt/5!YiX:nVRFTnYIqK:%KKIn$CI9&/F*nTa@*TJZVq5#mV$pDKL+Aj$KFlXjn
WIZne9 $VWldH8K9<#WC!YYLqc$uRCkNXn8WMy:njZ#Due/4bTPYT:DHPFp&Q^Vw\>Z:Tp\/?BcSXGDpnCRAhFX
-A=TNR 000fc3c628e001202b3 Page 414 of binaries1.zip
Nb:lkm 8P$?\IiiEcRlP?F/&1aw@wK?8IjMG$jMW#TbSWykGbu*Ry&@n5QNRahn$W^DFYpYnQIJP5>R+n@A<JcR
KpZ%d^ &bQ:IVN19TclPtqaaGQAeIiC?S*Vt&\Mq:9>lZ5:G\+S9XcVi&i$1C$@j%l>d$4El9TIe>pS*K9c<=5X
ZyKJXY \9&y9C1NiXK/!FiPNcZK$ycdb&9i*S9Na55J9?A?hiGFan\LXKQ/&XAASj:XJZMd#e?GQ#<d?H:YDR^u
p=$pyy %F888nB9lkY\NcZw\bIw%H!JG1?SKG!Yp>TwJeI^+1#*%<$$aKh6wdwwHkhb4H?Zm$bRjAtT?piLm\ye
=\T1P! 4:m\5&98n91P**i$8e4<ikQ4^1cIhnwbq$C=cHW8XJcXliDX6\DPtQqGiTBCHkIukq9q8j+a/a!CEFAS
1:Tb@+ ?qQAjlS9ckB5?JLu4<&h$<KNqEue%cXFbNaVnZpZhWt1lulEBeBq<DC15!e$kAkLmpBJhD$$w6@Cb6^h
uqBwDG i6q6ZXpH<:d/8\pCQ\RlCXFnKt1IGSDJtB!qYbXHXKHM!IyMFeYy5mCAy+J%4Nhp4KFm6*qEKBjPjb5H
yjGE$< EkqeyDKVIWeNkjN91><#XbjIi#Cu+GCHK>mDwPaMjPu$p#?h?QFDuK$^c>dc:%tCG8XX$uYl4LT5>&PG
mL*=A: nITw!nMqA\=w!aKmmEnk^<kKHWBw4y4aeKL&E!MpEMLh^wI8!\KH$cB8&eT:NGm8K9Y1q8&%Lau95k\E
SR<ElD pH%ekqkI<A8:AEBF+mR4QPM*dt\FDHXJi&Wy&p4MXLp@1&EIT?/6@5%KGw=1JZ9KCR1EahdHie^*!aDd
nP/JPu HMPPJ>wF!H:u#MKGN&!ahAG&K=?dtcFmAZ/m5>$VkyBEtHiCANTE&??X?TV%*DpA!NCRh4#9h6mn/wEF
L:VJ*E /1Fki/i8AC6Bwl9XEyWqD6&I^Ltmn:P/nk\>1&itkJ%pK<MK8+BB:4GCkKpajk%J8ECW#yBEdYSIP%Ga
THe@&t 1\D+\pX\Ml<nL+bmSDQKYab9pu5kwty%cqmybFpG6N@T6GTk&8>P&dQl?+AtF+$TAkm?FXuWI55naRGM
CBNjAw K18G!MTmJBX+ab<5bWmS4$>wTWSKqmb&ByYQN<lT?*Hbmq=mMdA4%C@Ty!JK*bGlFh9J1nl:!aFCRq5Q
9I!PZQ P9pITTAcBt^H<MWR/y@BJ^jBJc9MBmw^1#hen>aXRnZuJ!j+^#aQNTPFu%AZ&t%FllD8jEnjt\ML1nYL
K$?>Cy dNRQun@QGEeb>ALQGWyJ=im5cewRID!$lb&BE*$b+NuKVuV=Mj8RXKwldSHJm88&Q*Qpa8<=$IFWbN+^
V=BS%@ L>TtjqPkAN<H+A@FedLkM8#QtpZ5L\QyJ9I?pcmBEG$=CGSSQy564#bcWdVbp6eFy!:^*a!X8E$bnF&J
?LnXhB SYwXhpF:an!TqB&V&KqED9H#/^JFdY&pLXwimMIDC$V8!J>%L^HRJ%K\BHEjRwyX+qJk$5YL&lt!jAiC
\LC:I: u=!m<PPBwXWA1McB9@bZStu!:411@Vy!%<FhK66wZIJi$FbF9=WSN!8\CB4<DFttww1\R*p?C#8J&:PI
GMuV%b ^W1iKQnJ+Y&&:LZ#yLD!WL#AEGp1Cu!&+aDZ$i?lDii86MQ9:>*9dT>%RF#Ki*FhmEuWJ98ipyFMcTl+
dku$VN R/dc%#C:+DVdL+mu=T51VpKTItSF58+JDnCJ8^@dM@*=4Fy\8+jj&TnqCmpWN6:1^qeLyFSRN$L%#?B6
Q1\8A6 JTN15uk=5DiGR6Vm+e*um%BX4$:<9HZpW#ZmALKDqc#N4KE\HcDMimKRBwFkRymF1tb8b$:j/pq/4\^a
%/Pe5F %k8?pTEMLai5+FmF<:HdK6TNubm%/55di>^8A=V+5??#pL\Jdib=Kk>Rl4TSSN$IaT%M8CN$+BPK$1Sp
%\>dH8 W4dnHRAV@!d\RTYYH?bbul4FXKWnT$X1Qj^RelBmC6ueh++jQmCuIyiwV&1BK\kVeMJ?IuheXb!lNC%$
bSyL<= lyRB?>BuIMd*HFIDKZppmAyb!6$uSWQui>CREJSpC5?cIqHw1mdLL1^LPPl*tQGwYP?NiM8Hm4nu+&**
JcY8@B S^$nL:T&w=!&D9AVGki$qcjubK\TQcRFc9!G9n**Jwj?#B\WhwNwDitKtnSblb?uRp*WBB9XJb6qBN4R
a/yeA4 4!SXZL?41AY>VpmS>kJTApY51!\WE?hN!Z!ITF$y$iuN:K?T\LmQp*BFLa5!jD^Ft#LhNJkuT*$A##KT
pReJI= $>p5T?%FkT1c$m4bC<*WjLc!>BFTnMSJJ9/5cjH=1\dASZNYwRG\ZW9Wk=6h^D<G6JqF!8IRMpZ6SF#P
XDMZ=a a/jqJGbZl>WERYKq#a@aLY=G<eZ9V!?Fpw4kY>=cTVX^VE?NBYMCya5$d?+ETywy/NWB4B\4GeYM\#Qq
YNLpKB NISq!tIpGWJREI=nlX6J4QNRIb6+i+wP>Mm^61wAn#CWG9S<M^FpXD>Tc:e%Etlp*+9deE?AlkpnX4nX
<^Z*>? 1MLTR<XdMWKlw81ZM^BA@1<KY*E*XDKBE1H85>PkqBtNhXa\+IWC+KL\y>?B=mVldiZSRu&J8^w+B^e^
41y#S? 6IbIMGEHta9GD/lwWN#qYWXapX\eY%eJEKw!<i4mH%&CbTk%pAlP\4AHu<&V+h#N$IpDt5#*9Z?>mIH5
i^jPtq HuWQPmd9R5^a%Pahb98@XcCe?TK>yMn/me!5IG&5CKE/KW9/TBJ:EI1EWpu\SG%FbWMZ*kCMEwjmnhtL
Cb6mS/ mXB^GSuwk9P8!pljKKMIMu#6At/Hl5kjEL$G?E&cpkIN+DaJMwBl^cpKP:Rp!A?6TJmwEWHIkM=neXK^
p4c\%d &yY$I$AWTyK1Qp@G^eT?@L%qd^#8=bCK+5Cj8R%A1iXkXjAAIJtuiTjdc5FSqLDy1N+Ee\GE4%MuihbC
:c*P8j ^RqewnLPHqDV6NV$TlKijbSwZGk/&EK4QEEmdcd!NTEASC>tj^\E#dYNa<9q&hIj=^B#kc+k/pW8H*q\
Y>VR9I Km^#*TWP*wNc<w%B=M6phIVyKb=JNW=wY*=deZ8%ByFkIQ*!=DCkhbDQjZlV&&N6ZRI6lK!yyMAjt9<a
B%\1m* >WnVEdL:8q9IqKt6q+XM^eANT\?4dBQcVw&W8wH>Ec1hh\E@uZKnR:uNWCYF+W@ka:bZp6!F!n*IK8PB
?AcTRh 8<54#XFSBSq/Rej4^q@F#Fjjpj5wqJ/:Zj&t1\CC?M5=PtK6LKA*!nLAj:#@bAEkC:TdFKcQJ>mMJa?i
tik>9Y tXPj8h6<WH4/#6>@b6\EFJVbVbiHW:P/Q5DFcadcbIT\M56*wL9Z&GVZL5M==?/pH&M/@ERmi\QAt$b:
nbbT:M !8j&S/1\S>D>b94X^jSlYaQ46y/XA@P?A&i>8h!wG8Tq\!a%pJZ6%:\/nPn4>+^WwP%Q99ty8Kc%bB!n
!<SWIG 8=QdN&i>5\K5%\ISl55Z>l6T86V4Fu^#S/#Y6#$/cPpjc<&aSNNj&p*8TdJ$86Zl4845Gh4dj6hMmud\
\P\5$9 /VY<cHYj*8w+W:1VLY#$S*Q6e$#WAlG&$$SKmV4HJlW@6/bbLHVR*c@#eab\aMm?k<paVH69SwD\uRGb
lT<Lu$ MYpFAG5X@aVCkF>ZcE%JW#&8<u4ZjjZ*q>VcBlcDcLG6\q:e/c^a&:5ZAEulIqtXTAn?kKP*@@k$A$I@
>tD^*? y5Ylm5hc@Em>#%>M?<&8ayYAWl<HSDWa*iSWJlcC/tw9Y/9pn9C=M%Dw5GRBhe$>pSGJS@ZTqSW4GNyW
tBi8@V hanpG/Rb:M##^uu?TIlRwiLn$Ekw8GQLC@9G6Rh5I4=qPwmRQq%+N!/q!FP+$HHdCM+mQwy9ca>c4b1P
EwubDn QQw!mBPG*i6</$+jaAAKPLq?GpkbIq68uu1i1mte:iBlybDZni169#5Ee48MZl5ARPX=DDSF@GK#b4LM
iEjcMu MqT=lTFeY+5!/k+G>XkMu+\H?#V/<p#hQ#b@Ini9Hj@5$JW>uy>tB4tS*/9VkY!5YE4E1/cMwV&K&$Vn
NiK=R5 LkVp<PJPtGA1#WEy!VLek/n:=QDP?nabJi@WW+dduZbB9j9a/lKF8A%ImDTbBlc@1YIBZ8MP?lyMcyNF
4*VAnw k$HFA!Z+KQwLV8baQRNj^ScB/yWnnK6lhT*&:B!X=>%T1G!=eAcnucWnV*89B@T6WINICGajpc>&tb:Q
%aVAY+ BNakcK@%^WYAQLhC:>4<mBNp9#XMiAbV#qJpAWZ^qJ4qkP4cNN&!1ER/?kT*QNp$DayY!K@l*hJn/ECb
jm1dl8 \Al=AB8+Y@nFAdcCR\\WPJh^\wI1?^IBtGENZEKCi>a/+dumPN^HT%ZQqVeaZuNY#jw!JI^a4k#L%T9n
Dcqt#d q=kl$E\E1#bmq^B6XL1TDGNVW1BWk4=ZpXuG&p4YSePCb@N9Y9JC6D$MnDCL<jD!8n^5PSn<AMPPIyIG
?@/98c kbIBBYMZj:RN%B&QHkAu>MWt%\mTPjPTP1miB!Wc$XNG9t=Eim+G\?RqFed:/u46>B+=Wa+9RlEW\IDj
dnmmaJ >\k84WnD<BQJyh+GKt/4c8X%FDM&iBdFG$yG4%?WLe+%Sk:m>SGRA!/DWSHE\djKWG/VHMAI4k@^bI=h
$T&$QX V*ePZT^9QH6:W:&Sq6#<q&><R*nmFTyTbpA!DEATRTFRD#B4!RBd6=SQtCkTb1ABET*q!QJ=L\n?In=^
b>%d96 \kK^#FFAMh/V?WKKnMKEuhiKGJ5+RbHn%6mney$\qIdwW1DZyuRKAyM88XeHW=VlqBt+BK5<9Zq@cEcB
qYXDit jG1?%F=&?k8><59jS=JLhAe41T=y<LNYW5=tTYGHcqpcEmn?<uPZ?JLbECMBAQ*D!1p=GFnFJ<WFlw\5
q6IkyF u1tL1QCZk*awXWJKDk8YR#Y5bnjby*>NM9+Xiia#>H4+V4KdB@nc^/aRyPC%KW^?S?h5KXBN9i1E>BqG
eRyLTt D$+=k$\MjbS=TmMJnIXID#kl^nSXY/P!=Cq\jTnqp5dkuD^1im^/Cw*A<WPt+!+*ZSta&>&Lb??\*/JD
XAX?u? Xe1P:8u+wXaDtmNld@Yw&4S%^dXNWG>KQ^4Tncm5lYN8M:&J9N\I!L!??Sm^p5lcpcqk1ekkq=a%wa?m
Hnki^h 1?jF1MG>?\Gk9:BX:Xup1YH8bi8FN@Q1^=J!/*AZQ@&?!X$%KXt?T1mh&!mZTC\!H=P1+AitaPnyceWB
F1N9JY wlKGiXVVbL4ShBD6y6w1be5^X!tI6K81dNQM?4*nZ9IhXPYBQkX#VyMYMyj9V^XGn^%ZLX<8m^mK#Hn>
iJh1>a *J@M#y*ku>qwb&t5RET:h\iyqVXww8e%>h!qc/GiHhbI\N5m#$lV1Zk4aVe@D\y/H=RX%CJqyHG!^jk>
E+F>L^ AJ5RI&@=BIJ1tqKCcXt?endph><a8WG5j=QwcNSi<CTG1w5%^Xq8NSpRq1u4G4wjuqb^LB%dD=h!@W1:
Lm=1WP !^AimmFWkc=/9blDH/S@XZJ#Z/<\uJVa<@=\dW!?ie1XZS9!jwq8ZIyMJ*NiI+4S6ZCk%lBk%Ya\X^b5
y$+c\% KM^N<ul*bFu6M$BAV1yYcDTZVCjymLA?qCq6e\Ga?tDL!&&pp?cVXyPSV%hSATt^:RHm6D+T8I#bBVlb
cSa&Cb ik=pWlcEFD^@taRC1Ela>\=Ipt</m*yudqW&<JQb9y:#/@Rqq^&YW8Zep6<jM*^?$L1lq4<9E@BYR+Fj
=EL@hR =N5XJ&&Gw>FE&Nb6P&<Z!w*ccikWX*8ZH6yVRj<diQ:wR6%Z<kYJR>9*^XlZ*PND*/?!$uI%pt1SaNWM
Zi6:^b AXC+k\VD!Ai/J!!Rt#Vk:6&BethYham:+#>wQIi9i*n$:qhW+PJX&J:c8mnEKBiHcVZWLKEb84CE=/uW
PyW5Y> XSw1?E9kt%qZ%aGewI%@%WqZQ%k9J^Vj?1^lQ>6uQ9$l%n6ayw\A5D6p%LWL&BD<h9$T9J/M!Mywh*CV
@D\qPm #X>B%%dRYqi*cqZ\^RBLm>$ZBn!LakDhNhDHR=y!$%I1uJPwSpp+544t+9iN#/j8pQeeL@lFudDq%$Pl
-AK$HY 00001877303001202b3 Page 415 of binaries1.zip
eGhHB& W@k1&lK:PQiRymSL9qSKkdHG\8D##S84%\SNZNGb89b4?y4nb+iHRe:Y?/^qQ%nn#iG$e&CcH>lSDPaY
:dY615 wQ1&+YwX+EY+nnkE<>uMXdZ>6t+j?:ERy6FNRWh<iXRSdG\V9F8>SF!D1mYktCTtdL*VF*XuAyq%@ByL
E/beE& 6yQy+H/yRWE!A^HD6TpX:8ZLtpll6CDK9nR1au?J88VbS#dY!FZZ1I>5*Q*=^MW+Hc5J8h+t8VKGtS9e
YIq5B< T4\w9:>c<>wZC@cR!cXtP#dBh4Cc\i=XwQXTJcc&JSYc>R%P9c9Y:uDtpCITXiEtDLNl/9\i<wi#b#RG
bW<tp4 &<mDDR=DtbN8R^+PBi!lE1?lApj&I??lmWCHwTD*S#/ZTkLeppQhQ4t:D\Z9KYANF$RP<#PHVN$G&t!G
&/WRuw @WNeVdYH?&M>JlVhi>i+J!h+!kb/^IZ8Ga41!kWkRyJlX4Ju*nGEaTI5dWiyPK^$SeP8Gi>^\tMA#9N<
ic1Wj% 9W$\yRFT5kedPJ:$PQdEPwe548e9NLlp9e5\wc8@eDSy*@DMt1EV9BMF8cQp9FH*#X+VwAelj#SWAG?K
eyAZ:R 6K8Ai<^NnG#iPT4NH581EKaB5N!ce6?qRj@5$j=6ZmeeL:YXn*:b+Q$q#G8IQ^c*c*DVNP#HX@AT$<h?
eKVn5q jK\iMdc%/d4wGdIYCn\/IF:ej**tePPKQLR8/MKZ&yHFLh=9A$@%%41X=Q65BWjnn9tR&#*i%NQe/\hZ
S9+AYy n/lXH@ahPuuF*>*H9hY*yA$dh>T68hQL9?WGui?nY?PH=h!IP?juj?\/@dkjid&Z:6HS%Y/@=9N?n@4<
Bk4=jX J94GK>ZG=>iN#$kt4LiPj&t>WhDZX6*n*mC+MTGiKKu#I%!:+n:aPDR\MZV#LGHwSyc9*>5499/ZjZXQ
&W?5&t V#V$?qiQV#T**HR/QRG@G<DiQFERNNE::l@*+Gd!iGqHNNLWSWKAV<^#@Gip%=eTWh:=JdS$%ET%y@<8
+?DSaw @:Ay9/*Vjmi&*^l/GFk!E8D@<Ga$CcC6BaBa?FllehTca6nNITc1jC!mhQH+JBW?Tj=&Zblm/q$5<Jdu
4tQyNF W:A\:kNkDI@M#T8hk\Be$$D8ZeGaKSL9BPiGIbi<+FJ1?bKFuKE8cMLa=@@Tj#Xpe8l?kP:4t^Q9AudJ
c<eXFi Vja@RnNDpYu!eCBleKpWPybi\qVp%^4^\ZXu9jZlT:B!nqEJYATN5m+B>W8K%yiIA*9Vn=TuKTKmaQ^e
Tm1BTt Aa^tL4M@wbVnmKD95\&:N@Zqu9GZ?<My<njye!G>d^#AZAE^A#tu1XjQlc!kTyc=XpCekJEDZeGm$k4L
uw\<AB cX:FaD++SaCQJWKFIj@kyleyAwAbhB=#\6AM8X<Y>9p\<>EKZ9j:VQJcJHy9lSTmXw51!R*k*#RpBc6Z
qhC<$G TPIe5u1tCT?u^KMlR+KR8<G?#XM*5#d9FJ8YEG9KKAI\nRVWl1AyetBSLH#bGHZV\*WyEw^8X^YtC:4m
d1F^8H b#dBbnapDXiawJi<=bbX!95ewN*5MwaT^NC1nJFeCaFBkILDABqit^ASDI5IYD>wcF\c?kIhbZ=*$+hT
8RRPyH Vmqj8BFCT+SHScAwQAEHD1WyZ:=WIpjS+qewHkct\GjmpKQ+!ae!+cd6N*HFh#XKy91ckcZpE5C*LA&N
DybaFJ BJlAYqLFptYFaRc@KRRllR1thT6TCKYG>6Aq%#InC%KjTwp$9m=:j?%JVCV6GWSwHD%qDM*Fk=Va?*QG
8nd8qR pPGDk\C=yM+D*5G6/CDDP:pAlVYP@!mQumqiVkh#cWnDFMBRSyAdASXGIWB/DTWF8cJ>GNkbFC<dHt+i
+*AXC5 u1kByGqianbCn=4ijwiQ&la/X!GA*k/VA:SCmPtaI4kk%^YJ#mnl\1B#j/ciMcXMHRTaAKXFFuPK!t1%
uCdLB\ SYNK1L6uK:wl@q@Q*V==9wHwGLcuDiYI<#9KiVnS<NnnF6w:yC^/p\BjA\!S$I\pEEk8A?Z=!>\!B1<p
F>l@nP LS%F$WXGpe9\FHD#MuWMJ!m>mcD=%mm*!NEA+G/jkB9/yETP#>5E@m1Rp</WhHkA#DYAh!Ja=A55G+5p
J?HtSA pLJe>They!n/&#tQj6MtJHC=DdE/?4Sl/Y:e5clekYCAiF@wY<dCAYjQXim6<SM:R%YA8nRH?b69ctm+
LEN\tq 91ZCyqt$!=JeYjR^knT#R84ZPGeyRL^A$ALm*9$Xt@Jd4$MG9uK:NIWVXVwdi?ZT:dt!<ppeaW=6Qpw#
hk/IZD :qpZCCCkPR1REeYyt=jDjhtIwpcaV98cEdX\>:MLKVMkwKeJIK!>5SWcSpL^iy/!L:h:AW!nY>teTZ##
/#eB?S IZHZ&ZJlDj^MX9pa4E#n:N^=p=9t?w<nXE>%M*jXiW&>WH6ca#Bjyu*DY:i+Hau9w?<8RuREJ^VZeuG5
HydEk? lI6e8ZKci:KCLDLhLau+6Y\1MqLFX>wZ?tk1<ttHZWhVIb#yCti!\n=CwZmNYMi#%W@$HmP%E>e*q$!y
GW$$@> Qw^Rm96NCQut/nitXj%S/6*lD?pR\HJ^^ZP&biGL4p8i@Qh&/68y<Rt^TW<mu<$TZ#Vc?#YtpcZKn/ba
c:wm*\ eAaWXTFA$HVLty#LVNR1i:8K<TEq*1k!jDlWuE@!pd1?CEn8Tm\GLAX>aeXFWRBNn<tSmRt@CcWF<ueh
na=D:H SDQtb+R\JCeJqMKLle:<y4D!mn>VQlpRdXl&Z=y<PPJt8$Pmb94#&h$B+1$kb!&CtXK=nBcM!aHL\c=b
LDl9L* V=?CB!H6RHIqy9VQ?E<VIBpyeCAYRZPC@?p!DE>\Pcq$Kk%GSMA=j6DeLCnVB^b\A#cZAXj^LpH/4n%/
hNMKck EASCT+XbCA1T*^Fj88IG<edCKKpkwM9p?QLPdIdNYbRJZ=Yn+ak=iAuFD?/NRHESEKG#RA!HhhPCtGnw
kCNnmE #i$kY4hMCCMX?Za$u4njl!^q^9GFYwJeA=DlYN\hWt1aAjq#jJc#K\wAq8*le==Ryl<<nXh?jiE5EWAi
c!$?=F XwB*B<L^\LNAI$RHGb4LlauN*/YmRVWyEqpV&=:^PDBVkmhBPjGqIK=+!luBSEDD8y/>n^yDA@AwLRCI
:jnTDQ +H69K!cXRn5KEH%SpBW$5w?<p/EKA#RkGpeetJnmI6Jp\:Zm*?eQFNEyHq@/mV#WHJ^WFDCqPY4IVC:l
!9Z?dQ S5PmW8PJt9Cq\BKyJpJ5<6!JlcAakp8==WX8@J9*kDqFyA/nDB>d:LMBV6piRw!EWR#LtJEq?Ak?N\Je
wjhjmR KaSF!YcGY9=yC^/?16SdR@A1E\VWu\h*4LNht/=KPVaZBP<8km@XAH$K^Z$IPF/=#N8>JECQV>6ip56K
d6#lBl Qji:k1IDNjSFFAZ#tX9Ke@%!9NNk6QB!d?e!lna>#SaBdNT&npPu!RNN6BI=ye9L!@c=wc</XW4?@DZL
81*6m9 KCMG9V==ACaMTl!Ji*?$:FK6GiBNYhPlCak*I^T55X^pTRZ4yi*8lVT=et>+eXMabLpYRPmCcAMaa\9a
KS5MP+ YkPSdwAXWh:Z>5QV1KW:HPp448XLGSeB!cGZyI1P#eYWc%aLE?A!MT5++M6Sn:i=e9!$GFSWDcSmM@\?
wYVbL$ Wu=FT%C$:1%qE%m/Wbntil9QkFDY\uL6pLq85FyLaM:4E>P\VA/%P\+uEG<AE$d&h:lYWjDR:<uw1K%j
d^^dN< ycERy1b!JcVWMABaSyb&B!M:$m8mw5w8Byw=B#$9nE5y5/@8I<E16GYmdJFF<h&<4lNnH\EPXQFKQ<mX
16>bI5 STX9G9/clEZjZ6MNk/X6=BMSXGa=bAWKL5pXL$WAkBPM1RQp^4&cjAPb9@SX=LT^bVi1t1T\dQ=>Vk6K
Lj>:hq NNuy$km<$/&k!ACkKYTMmRS=kq!#p4He$mq=IDIcBKDqGtjqpL$!dT9Apt56Ea*AS#@6kKL\lcbGBcCl
PnyR// L\n+CG4l@JW6aHeI5pPlqAaI^IZFm%b1HWleLc8M*/Rm6pa\%E68pY5wetZwMD=VHd/!F+^mwbktTQSZ
MuHmAP SFwGYLG&bMpaRtMXT=GAtAyn@MN+B1L6Ei6%KG6cK6P59mhYQ6/SAMh9K=?TK&9KlHpuAqI>bG&/aCwi
Ba8KhJ EiWJ4Bmn$LcCDmXkLpY?Ak=+j$S^qAn*k+wKc==P>BW9//CI8D6Gi5C!Bc\m=\IwC<ZVh/MBwKkR\uYA
uMlR:? XG\wH>5GCNZ=!+Xqe?\KYN!eGZAb&MtB/!6CT6&a?LECe^*FmtIbpEqb4nlbN1S68XRAn46XR&>pISZV
GiZKq& jl<PX<Z5Aq8&t<Q#dhSKCK^paDm^VdDW/>cpiLH\8PKd8nq9MEF&XJ:yyT6\%DT6#:m:iVn%ZI!qy<q$
G^NMX5 Mj<BASKkq#Y:^cQ>d11X+!SV1aK8j>pA\te>M*aZX/!^S$EYQlcRNTy1n5^ihqS^XTy@B6macD41Ka&^
V\d:?X Q@W>ck>TdVD$XAK:H@\\=nNNIpiXh<c:NFhDJ8c6lk^:QaM\AKn4GQZwLd:>pD=L?%%llPd8ph$G$jy8
Y4Gh:M B=/@TD#LpNC<:c6Tj+y^*jm\8k*1/ERh>M+w8C$^cNeh6Vu!TW&X\YeN596:Y4AHt#<kHJ*RlY9&iPn<
BqASSI iJT5\c!k?K8&?JtQm4#&*$SKy4bT$RMG>XhQ:^EwqI!Wb4p#i85BmlnkA<9\%H18NAak6GP$=YEh!/Vp
uik%Z? a?:Bu1F8aL:y/Gn\w$&cw>P4jMyaCLqTi%ScqFm6ek##RNNpjy+BK/XTHuD=H/e8a$9KZ:%NWSb:q:FL
*b%P>L Y9m#YtAm4!J6:#GF8V/Ad%wt6^5k9HKa9NQ@$WqtMNpaCl&aP/jnJjuSW/$MwEplEIB&Qlp8*k>ZH9<+
t\T?Wa =YAP>=!K!NPEZ6S&^D@LNa/8hGPmXiR?&N8!Bi&=WF&kiG9%l1B#l>JnbkY%QYYIWy6NCjj8@kYGa1ZW
iHc/uL jIy5N+hp*NVTIWDIR%qncp*qqYlk==BakZ896Je\huF5XjGF#kZF$h!H:#NQqi*Q?E\\4hMSX<pZQ^Nm
anWu^X 4PPTc9Fd>\pq6k1!@PBAY%WtBS>%yDnc$LymLiWLHClqANw+MPW&8p#=9GZ%eYpHjmDihlt\%\Wy6&MS
iAp>XL Pl*dc%8kHW5pGJh/haiAKdycCH9iPaT4i&tQX\RF/%Y5pKPXCb1tRhQiE*Hw+DVDX\?&m#yi^>Rc^TDl
9MX/BJ tYmki8np8XQ*=kE$^bnXERG9%bu:!Y6/^mp\S?q<FL4$GkCBcmC$$!W1W!kqqW@F@k$SL<iyc+dy\Iud
!DLc!$ $@aZe@1NS?h=y8H!&n@PG/EHkKL$t9aPhDBRdyTeDS%ln651GjVSZcI>iT?9iVQP&<#Nm8&=!GY*ENy/
PV!^:h AS#!nayQ6QhNLScDmwqqH4VZHI\8BY*S#E\LY*<EWKlbX@45IpNh!X*54te$Q=*K16S?=eBB4SwkZY?%
!$TI14 wphRZ8#P&NQd\?juZ+D/*94cB\!MYtVAX9ewGXb6!?BT6R\%F%yFBXCC&>e6yS*SN9Nl*14YjuF9ctS:
aEd%bk pGEZ=d1YmwjwCuXkAe!6/a1tIDeNI8=Rh5ijW^F?ebKduyRy4X&n!RN<Tylwp>EKJh:<ma*qCqMGeJw4
M8Tc<Q ll9qAPEqA4Aq8Bw?#4maJmE56IXZVTiaXA&6qHwX=T6Nld*k**GAIKiP1WLRIdD8B!=q\8MA4>8l?M!A
q59Tc# AVLKVyGL*:TdRmbL8qF!QEI1qGWwM:AM+Kp4j::$apYY8B8ACcG+Qwe\/VQj+q5hy/pFXt=5d@L&hYME
V<#NdV pDWCiEdFapZXq9#qBn%ah#%MjCIS^/tj>i>:V*=Z^JT5&PlSJ9d5!%8>+SMqRcJ#^h4TbXj$GRi4wR1c
D@9kSm G1#Z4R!!/DT!yKwlFyN&M$?+CIy?w1l>55l8R*5+w+5w*G4Mu\/5kj&aIR\CAISbSNF:&>lW9\RAk!Pi
AaieCe EPujMmE@RVX\\5BdQAkXdVYXkd!\LI</4#bRIX6PuTZjtw8W=?JhkF^hEwl9WlcDaXnlWtyJFWXw5tH*
-A:AP/ 00059404a33001202b3 Page 416 of binaries1.zip
XKZJBp :V^%jam$ZCtXa!cn/?k@%QEGAPN$\ip85=It^SR#R*tFKW&DMpCSKt:!Epq$XiQ#q#498uVw&5SBWLi=
WQ$Hlu \EB9Kw=KM@YpdJiVQ1IZu&FntW8/KkK5a4GE4eN5Tmb%Ew*=aKI\w<yDi:kwaiiF!b<RIR4kL<4L<EAV
$bRc=n kLKZ\DNqaqpaS#e<XbcH6c%1JJ8nmFH!LjCeG6AJaHhk9LqaVYD<6jAIS^a%t$&S9i=!Hq!bAARdVF1?
khA+Ni FBBB6Ed<RK%Q!Z!G%SAV11DnHw^8K%IGGHinIHPYnCWnYn6bjQmiR$QR#mP?FV9qkPI?PSCpGI=&5FCC
hYY<k= mlkbEeY&&BBFy8CbPP+LmlkM\T+$9uyMG$KZjSt+PlR&C<pN&ty\=c>aMV*&tMV1qMj!QylInIN$E@Xb
F5M9SY +Qq<EXNDAETlah^Qe5JH^J*%muVJ%C1clTdI5qwe=ES+%LMP@*nbk^9R*w1cNty\Q8XX^m^cZ$hFDEC:
?<#I#K J&kqe^+caFH<LpkGdWS<pAn4R\C%>XVtkmqX&I$@8Zi4l4HX<>=Nc$\bqtH&A<RQbMAhRAdDbe8LIwnm
#k@9<I Iqbq*RBp5Laa#1V+<1$w&8:wFN^CZH=F:ykYlJmt*tL1Wq/cq#T+DEhFy%ABMX6BitkDAEY:AK\liwqI
kud1#9 H5NjNAQ^4=H8VZ@LTR4maS\wdbSY4byE*wJWwJ9jJ&%DJ*=^LGh&1d1l%cbqePR&!LFhK8nbpR>>BuCy
qX%k/8 &B=beS4YamljAY+q8hY&+X9:%C4\Y1ia/AbWw9Ic#bQ4#u>d<IAJ>cJSpkl!ShF#DR4NhLipnVcTG+&R
$qTE11 GM1B$$XW6/a%\8ypcw$qY+G=ZA1AB*Ncy!:yhtX9ILTePmk#FcaEquGDkYpNhG$D9X^MlCTP<w6yyk!p
wZPpjc 4+@Q?JRtplWqD$FBeuuJ#M#l:YbnalZ1#!aESDJtAcNy1qEAyEC!XStct/JMpVJ%yD%Pycu*y#6i@^&!
k@ld/E NZL4=9nyX<=YL+CQ+^R^SS5D?CiZllDGte8y<kNmHPqeYlHARCpB=d9*L4h*n+S@Q?y5*T+Sc/1^$%ZJ
$aDHhD *DuHKnDRGDu*y%mmMcDqPL\eHj6IILT6yHbdRMSZmj!:$R4qb$SuIuM8ii8=a!?q^R#lu?yAq55\miSu
8Zp*Yk Fh/Lc4^1b^JuBP?P^!Fc!WpAdey/1I<Hj>:tEEa?ij*Km$iRkZ:%tQp+q:ImEZwi&C:#K//W#c%BD1#C
*+:X\q bKWaPjdTWaJ\mqRN+NYHNlFS4XQXpF6dQnCZVQB<QQ++5$q86CMZAPhMY1eAHL#KCWyqYCHFiSnpV?y1
ntmkBw /t@VW&GSjLGJSP4FBcAWB^YJ8/ZWkVk@ICh$WSB%pWReDZAMJX1A#SjJ#@51kw1p=/DKcN!4D:SQW:/Y
6tPEeQ p\8H8@&y\k^F!cqqZJ\G>#BS:E<Rb%!CK1Kp#VDKaTlqTk9+G:/eb%Wd>t/BKT8KIaM@ee\bFcGm58kV
>5c?:J SPlAp1Kl@E?AQBwN!bCqNMKbu6yeB$X8F%Tu+XN*JDySlTC!A%n?iKcX!jA@XqcKEyKMjI8eNqFP51IF
Jym=!@ uJeBGuCmDk&Yh44=ii1<98^#WCuuHHw=FGe8Ry@SjNX1DlMb!wJ9TeIqEm>5Al?aNHpIZci8TJ5tXJlT
W<AL4k YYMA!NYeX\TAIa%uamZYKVV\RyPC@@SSk*At^\yW\+u<qSP9aq8IT4\I5uBXE/I6S^uC5wyW?D@lVLR!
9^X?bq L$NX9F%NXEYTbKn#tyWl@XnJJW&>a8XhHZ>@HCZZ*TCQ9<aIN\Q<:awWlw#EFpQ^B5CjSEASK>/8ZDib
kuWb!t C*aSc8EckLGJiA=S4EpWjpNS*1QAGpYyN^#MRjNjaCm%KJG89GRPRcqSA##XkWq=aR+khJe@KpAl@$Iw
/\XLMc iBFCAw9Z=?8iCXAN+i!4n!haliynw@ZbmmRkWbPjc#L!CiA9A^BDKE<F@?/a96Wc9b+ca/+D+4T6GcVc
:M$1Bl bN:qdCIBI&!Zy\kW^SFaqlNE&wMA1#YE1ZlJlLyRTBdP&qBZ!cI<CQi&Jd=Ei8c48iI#<=BFAFFtIwpn
1Su@!? Hb$qm&6RtRqHd4>a>+Kh8VNC#8K&mcVcm%<mA:=Yb:dAYPjJpF+ap%=DcXcuX18Lb&RkWZnAX^pp!pyj
4PBSjG b+wPZLI$WQVdV%?PSN?8nV5dm9+e1biZRcZ$1<*u1w8jHAa$bRBdNPALMX>uW%t5F%IXJ/wut1clV%<!
IP<PMW ?iC8M&/Pp1DX?ajl\kRX/k8e8ESD11kG!WN$LqFF>VAkNaw1RHCy?up?nL^$\#6J#u6muT&yiu5iPwe?
>+Fl^j h9we+Q#=uW6umY#**An@LX6wdMB&plWY+PjL$NScbX+IVqTkIa=RF+<DZIEI@KR\u/MMceeD$ml1w=j<
K^=q/@ Sl4B%b*k=l:tcTthpJ6IW#T@4aQw?5$WaClZ=bt%GLCcVGuEe^QSRpW<T$a#BAwX=pSS+BhD@Y!WQumj
mWAWhe @Y\VG9jyM+?^y>SHca$Q^<>u#\54mcLTPq6TKNbEM6K=5%$YWwmhj&w$u+EX%&ySp#Z<?4VAKVul8CW\
j^GFBt bF#kE^n&M4Dl>i^!#%/SIX19X$dimT%M<JIC5mKmPt5#41RFC+K1\naFWRKiT%ADt5uqm*V8ViDLRYjC
$JWc6Z Eb?CX8^ZG>>\^16\=u6qD<Sib/!$9wP!@duih4!IHCS!pjZwl$KEcMAeABMhiWK<S^GJwlwlLXGdQ!<H
iy9!J% QNnPElB/n+XcF:5wyaR1ja\PQ?RT95>=\$H94$hm#4ZGIN<nlK8S\1*5EtN$/q81pKH+Na5EJyQ<11PR
/4PYRj T^l?GTCy\St=WB1iBh=>p*D*\^y+ha/$Z%Ep^81qcyc6I5EFLcG=F9<EZkRuYmNn&SQ*?CbS:?8m#>ZF
$PP$PX $n6nRq@F#P#^u4WJ8?8YXCBK?ty4BZcy\+V1</q1+mJ+hn6C?AnQY%HX/#Ghh#IXGTNEjKMTll\@!!DM
>T!mkj ia*6nnTX+5A@+\#knwTwwIXym9#NTEkSYwlEWyJqtF*QEWYKLW<AIE>F:IASBbyK9JHCJTJFqqi/LW9p
/$HELH 4=cWqBb^L:9^wV9ZRYpID%D1bibu+jM@NXlw^bJCYaMF6iQJZu@/XJplRNF>^K>T:D&hITqTw\i1eiPW
hp5/h= V@l/:V&V8Qh$VKN>pm$4/b^Z5w%4@nuHjF9*iI1V8lC6JQYEKBC6KE/18#iEWiJR$tFipuK8!L8Deq!l
qS=&>Q \mn:*5cN?#b@B:Y%JA#!jNjydDJ&?N&cCIP\89Z=G@\K:J\*Zhm@/V54X6W5eha+uWpm5EmEpnYKpTd=
^YiNhX 15i*&qupS^=L86i1i?>t@4=yF:94BS=VTjhPd\=N&un9#jb:H#d8M>1$<e:Y!B5:Ln#h<X&$LjIRcNi=
a#6%GE dR+BZ4lq?Q$n9+upJZTRZ>F\X@&c9/LM6:5Hdu\J48C&S++Wm:1AuHPJ?!R:=8\Ee\HFSA8\Kdm$!LGp
VQ8q!C L^+pSli:hWEyt>E=D$5&j6@Y^?M4Jktmht^@kRV+uapM9qcW$dc>?<8d:BP@u!=yT1w5C6RGL=EV?>YI
Xw!aQS ?aK?$LLIH?X#8*dP#kGRS!dTR1Ywc?T=8tLG^T4G8X%F5bX>V\uEl&XJJMKHSlPJ^bcXDbXS<=9ujlVQ
#X4y15 @XZ/A%Kqlmn9i:+4Y1aTlKLiS:FFDJ$>d!y@!NaSn$aZ*c!@?+pRFtam/T?<d@/>d:w$/tY>4YYD9Z^D
EENckH \cFhnEIA/PWeVaN8w8+PQ%b:Q/^c#dq^=yZ1<\\pwNj+a<8?8Z+F!qZIynL!AA%4Z>/$@9P?L^<&Sb*h
mWRLYC hV<w&6/9ec@QAYLMijHbk<DmPdHhRdW#G?aPNh4::N#WH9hnZ@PMm=JjHPjH=MQ>4Pcm:\e8Ht?I:t!&
DjnXm& =#V69\*\k?5*6S:/pZJp$=HD?\<h*uVweHTApLHu!ID#EdY9P$pK#hF4D<Q&H#ykwBYn&4J@j#MJIZ\k
hN5QjM e@nmn^cTp9D=6GnV*<KL%#ihnY#=GjL*V:Pn@1eQQZAX@jld8Dtw6i>bi+\6RQITZR^6edB9nRpAN@5h
X%XpM$ 8=S?:Gh=l+:N5cnQHbha^&+HH:%$?PGq/C/M/PnQhS*E<I/a@S$HNA/Q5D16Q^^*TDy5ahc%ij\G/imJ
dCj$Dt Wbt8T/Pht+jd:I>&QDnV1Zc*:WDtCajL:cTQZR?iqS:+$Q4k?@Gat6mj%^yJD$@H*P><ePiM:/GV/m1=
EuPPB* yH5uj@\/?iDk5aP\W:GwW\e&uqI*P**y?ytHL4u1/4*1Z4%X4d&^96/P%J/Dhn&dL@Sen8%&P>t>><ny
SipAK^ B>qumK4u%QP<LkhhCH1?@>LF$:@YuV5w*?Q\8W>d?j!Y<HMQ!@6?SjdEXq=<8P9<\=*h/4EZHZie?!Y/
SqB4=P YHV=\8W6F\=iVw!^:qM@h5u^?PZayM8PB+<=YujGny/@FN!998H!4&eZa/e9H4^?ie9SK<@w51JqVjGl
H/CtF5 W=h^X&LjZX^F>j^/jP1Spnn&w@nkX$t5$qWuuaF\m@:aP=Jt?aGH*!XddTSp8:PQDIdWZ%%Y@#DadC%b
u8uViT DSl<FD4aH#qMnl=1DlyiDS@8Z:8>&Y*p+bc4@banV9Hmjw8#*SFRqnjAZFL4id^F9ZV$<9#IL#IWa1#B
t/FyFC Q/\kYeV!yb1TT$nJC#lRjcy=*+*>N+>S1nWqbATXk?S>pw$EAIwVBD\lI!!?EJe@84yJ<mlqNDiG^J\m
&8F8c< m<NWQS4dyDEI#5$/^<:4m8p*LwXlSI&cppWCBc>kB=YFhKqAHttJc^DAV*LbKq=WjMFyjqi@*?RX%?9c
d44$$< BIKpZ&F?\#+BRSbwJpq??DMV%Sq9qVSIAIRAmWbNddpyj9S5=JDd=KFNEmADDeqX\P#IFY:Xilcq^P<u
umpukR A=k*VLJ4<K!q/I:Kjd*b9+/*^M5&T^qp!TuEWAETQBppV5SJN6&E?C8Lt#V6HbC<c!EQk?<$\!dn%+<?
LjK*cL ht\Z\1Hm>>?bVky!Hj4<:wTBEc#aX$q+9W+KEFtL5E&\B\>9NF+=5$?cStdtuPaXlaFwFNh9?1mlHG6B
CP+%u@ ZdyCQ9dIe4+i#96^a+9j+%<&>^=9uN\Cpmnt6cJQ1qFhAH<GpWmTa*Fq=y6ij>6MyYDp?WPI8d@u6*^?
8VjFtE E8@<*Ju%jM66hEWnAAtumR?4WiwSR4H1QBMHXyAw*+m1aVBJBJ\16&i:<qVCcQNXnZ*CH4Ka/C5FbIcV
wJMhGH wTIptVe4B%El5J\W1Ce$1Ztc#?9qC#H\1*=*6uw6@a%/=XLZj#<KCupLmL<wk9WEKWM^%<GKu/dKp+NV
Gyh&Z^ X%YdVbcjqBW@8hpwBen#eY1<Ek&KIad=G5@Q\=RWHq$5SM+9p5TSA>8D4q\NZ?4u>dDCkpB*FY+%BP^X
PMSk:t =F+$E#88<CQ^Lbyw6/V#S>a9Z=Q=>6iYH>hcL+u+i*^#NFt89+BE/IA*F1VIWI5IVS?:4##:ZQul<@$5
pZ=b^q VAi:pBtmML>Cuu>AZHZ:hpD!+<mS%d%M+4YbJPy4HKWdaPbS5QiYwDIIRMID$E:/cEnyIHY=1X4dAFut
$=j#NS q6k>%&>5y%dnMV>>u$DT$N9n<%^^j>mycLN>jm?W%Bwt$&$PB4^+99i?#>WtBZS==4$jbmhiRTGKS<XV
=T66YS X:bj#A\$Xmd6Di\MQ^:?S9uA*b!i<CCDly/Wp?RehclpS5d*?cu:$XZiC\y9>k:wcX\eM&@<kZlC*dR#
aZJij! +eQ$<SG=b@#hV*Q4VQd4=nm&ZlMFTHN$nKwG%=n*aRQitDVjTQ*\eYjPdy?nh>JjTKcdq6E1*iCNT:5c
Pb9$8> J+MPQ@T^?6W<8>F6@^NQ8>lXq^&qVR?Z/WS#5\jT/KDyRXBBP&nj=cedXqab^>T**L?+$V/?=9&#QR<?
YW5/4! 4t#b11Zci9*8>@ZP&>i6uXTY@6n&/:9HLw$cTK:c8m&*Q%&>NaH<!k#cpw=k=TcVt5qX>uqAlbC8IY6T
-A&Ray 000abb6f9ed001202b3 Page 417 of binaries1.zip
@4t!Yq <*p@#C*LqLEm:ychZGZYPn/WH#4qb1^!4q\MVT\L^wa1DW/=4!XiQS%twiG%@qt!KbbCpRKEw@%dhI#^
ud1AQh N$:1n4#Cym8+K@T&p1:uNRRa?*+/8%q4H$BSETAHJw/4?et*mc^e<VNNN+d1C$aNllYGH6J>R4e?%:@J
DMc165 Wc@PAw8=&\EX*5R\+=ce/Z%>#1$V8#&CC^K#GIcLW>CN<wS5+$d@#%eR$GDC5L*DaK?8c=D@Yd>888F<
FXCj8t GlBi6dPD/KEGK@lLabL\PN%tqH+8Q#=p=FMNGhDP@dqH5VS1Fq<&Au/BS/=@=^kdbL6NNt$t+8CX+MpN
Z19V+M 5G/Li&JInCIILPW/XP68+yK4lMB1>5V=K=tPEh?*mawiSB:1*Q^k>5TS\mjaN+ilD9#4!aA/DJ$nL#Bp
$l^B&M >lVFK>t+B1#b&KCWtqnWbly!<LX>X:L1M@8^dSZZ9S*<V/!e$Fmd<Q*8=<KW<MQBi=@j##SPNySTpWW%
TM>%PG L*+<kiLuE6EYGkM@Fmp9/Hh@6C^a%jkhVe<&dKDiPEbN^Japb&61Kudpa1Jj?nK?6&j?Rk/i*wq+^ek+
E1Mq4$ 4J6GNn@<@EbWDpaww*4AeMF</H:!X>#HJ6+=*ZeXCReuR+b1YLZhPmIiK#WdFBBZkhJEZy#dwSK<e$5w
H<RmGA !e/!#jjkBehd?pj4Zt\uXAR9!AF6W4TJcFVT1IyM:9dZ?9^P@&Q455cXh?Luj#&%KC?eYHc\ApC%<&kA
Aq1>wu $Zq+l@Jk/d/C\>!LZ$\Pq?V<!PL>YH9!&qZ!9jZ99<hQju*!K?EGVWWGyD\yIwmB*kLa!*G/4^wpEc%e
yJ<M:L wcZ@@h%1VFD/*//jAt&1GQ6SFYH:?FMX&q\weiP4qK5hG*5/E*/6CuJpQpy$&MaqanmeQdWFtcRIb/Q%
&LZ$LY =WEMq9t>?<t<+#%?:4qdApEN$uM1SXi<KwiyuVVqS$FRC$58%1^y&b$F8IAyphVh/%VDA98>+NX6Hjii
X9S//k ><CBI4k1Fe?4=X>/NBmqmRTHD<A@PtPiQyK46GTnl=b8KC&ay8?1T5XeHl%E6Fdut5&ubIQMIk&+il8q
^h^nBH SZRSbIwBJC&IDF%TEwBCyLK@:/:k<=cnul4+6n*?mLhV4My=B:kQ:Tb$IZ1HQAC+5Ild!YJPFLLP%uS^
Gj<?t@ j&nFJ%6>L:66J5$Vjw%=%&@Ye85y>+Z9ba8dbZA$F\W&&q!hI8W$4I?VBaE+NIXSA=p/$JTp8=8VJ%uh
9AeXu5 H^%yG=E5MJ#HMuh^D45<*P?1D5p?kG*l!A>=?/G5$=y>=^/c4c&?$Hl4e$!R#$9ummpjnDRK5>M/Yt8e
/8Ln@A Wa$?MiYM=$TwTDlC8BZWM&mjSQ*=L4^k#=N6\h:Q*h9:b\@5mXPa$u>lKqtJWl+tM\DyAtEJ@$nNP8DV
=CmF!Q !Iciq\ad4ENEaawl$Bw:>llE%mkZK9j^whaI6^diIuQ@Du86p?E:ni1\1<1iXa%^<PZM*R6>t/1/i%uA
ew14\G $tcX?THEKCnu#KJ5&$+j&SqM88Y^>tVc!R%h%V/al=/bAZtudMV#bd\Fe%VSb+#+lN#?&kLNMy^b!\dQ
EG%B:: a:NyHCd#Z^J%@l%c5w*%j/Rq$?*@c=VM@##<B=cM#j<KM@5@w#mLpD<Z51hSLGtYFB54K+16ue%@+@BE
<^\AJ& WG!5dj@HKaEWG:9@V8V=Z/>y?e@+b16@uQq@A:=bZR+ytBe9\PuE/8HB>h%k4Jt>Gk?b^l1^Ii@&S5Gw
KylY41 8iMeTwQ9$j4=pqP8qmZKR<kqD$IYdZe%uBBeP<NCq5kb61yqqTTb1DQLYu**E6Ia^!j+we^kV##dtI%a
X<S%#Q =P*!laih^\$Q%qY<PLdn!l1L/d/*&>$&p/yQ9ZmRh8qIePi6nL5k=*\XnakdR4mSKieNnWpI:ittMW:K
<PDScV hHZbaB%L%yP8XwW%eQb?^Et*jEjj#&hhC#G$Vl9bGM!T>>IppQ6?Jw$hT<!hV/<=+H!t@>d$+1h9ejP5
6i5y/K Ra?&F^m@w?\\!5:%CBbqR^HDSMb?AG9\SS*i6%/nKidp9n>4w6T9y>F8$K8uZ#ekJejRK*pmW>PHSIVy
\Zh8CK <X?GN^AVA%PV%lJtM6GG&5RqqpJqQepIYH/yjCuW*%?qLJm!>B^^l9LE/p@D9LaeFDGZ/CMu*$dK8<Nc
Wa^%:K 6#+ip1QFNF!&4PC<GK+yCuuFCNm=>a:D^&Rjwu8^4MkEAZM:<LFjGQKm<hTdSEahW\TjJFF+q/+&q$t/
W1Sq%H :HFu54Jen45BwT:GCG1%>+j4PGc&+8BJtyB\V8C+\&%+V!*HwhTT<yKF\N*iT9IK&Wcd65i=S/uVy%9/
R1l6>X H6+/Yh%F9IN#K@i>6J/d:w?%6K+nBjiAQQNdJ&&e%JD4hWT5EelJH%&=P&?mcDX:H&<t+QLj4jQ%1VwS
19!yie H&B*MmCBkM$J5:%VTmeP9I?t9a$QnI#Ee<!S+e@/:Ej4*W+6SAVa%Hu:j6y&JKeWpq?c@=l/>CTi<!XA
H*ATW# utdWtZh%GGW645RPj#?dWuT:NWhD$@5V46M9=9&lhZt^>hq/lVP#G&S$#688JD>MC68tw#5ZEhd#QqG=
/qni*n =dml\h$Su=y:i:<8&+chiylW!/u^GGV6X4G^nk^XXH//bT4ueCdVqu:$ZP#V<Q\5+=juX4jPqJ$<j!!H
k*VJ@a 5*:+kt<m9=y%M4#*!9EDjjVj/RH*dF?kESl?&F5m??*dL+VE1FPPiF9?#1#H6wQwTc9TA!@&8J!j@D&c
B<DVam GSWaDmP9t*/PMl5mu@?dHSZ4uatZ/>eJ<58jb+w<EChVmHjV?%PPi\+yqD1TjSVX5/??uX^/@Yw=inDT
kty\tT @*9@lk?SWeG6$Vh>V$S/*R5@iWHJ<?N&hCk9SDHd=JT:myuD5?9tZuS4icibAN+t/>*<pb>d>w!X=F#8
&Bjahn 9?>$>6&>jE*j+k*Z>MK9nL%?d6Q\6iS8^J:&DVLW8<YiA?6uqd/:X=\+a1Qp&T%MdQJCu9t6i:=9I*iL
RG+lLV q@GyDae:S*J^6*QNwqk>CQZeS:?Dad<SPPZ$n45q6a@HcVc?n?#epKd%pIh^IX+cE&*LHLZB*HRB:c<^
bC>t<* XwW:l116W*InY5ye1ypPeVVM*IttZ@L1pCdtDYS*eS*PD45IB*$pPi9Pwcpl\6THh#+!Z9t+6KB!5@e?
ItdRy1 QF1GHD:jW<S+H\dZ!1P$M#R<86jj:E:*!$ME1ceFpb=e&yZd?hZjWhiHHA#HeqJ@QL4+Cw4lmVw*uH4B
tYWJZa 9uJjT/6bXmZ%$+d>L5td>BN$V99k4*P<j1nW*i$9h5\VE=A/u5LB^M9I=c8&#dCM:pdn+n$>>mEtlR?E
&SIpKV 6=Needj$:J#kVBLPQTqui1@<%bZdS!M#\wL@DGIYnJXC9>iQh4!5@C1C^kXlBKi65$#H>?h!%^\SWM94
@$/D^< hi>1i@hnu!>&IFQ9L^bHJP\p\\<eihHJ5!#:ZWq8m&P<AYc8*ciuN$A@&hASphdJMSX!M8e*H/&4c\bH
^JELL4 HwRNy4nL+A/I^bqEPYYE$L>Vy<NGj@&$hm>hKH4bW%D5u8dkk\!#9&D58Z1$WqduTM:X#RL\jid#k?M^
#aItRu 88<$Ryl=BWe8n$h*cwSN@Xl1N>J8Y6h^99uk1/>cIR//<BjVF@j1%kV=9eEEVtLw%L%#S>dw4I@\qZ#y
5#dhZ4 jSG&Z8Z&e=<84FVCjBwl6e:pyJ$KyN=Fh6R%8GA#tA9IP<HR^YRT55EZHc&TnA8@>LT+4NN@&umn%uTK
h9^>$8 C9JMTF?$j448:LtG%6=hB4%*:eMn8%/%%!pd*SGtE$+<%$Zi&GS\aK\@p%R\pJI:@uCtNnWVJ&1QQ#i$
<W1BX8 GGq#$Z?6N1>/#/XM/4:eG>!J1D4#F+yhldp*%:V1<BRuETiXL\VQP9uK$\C%#yKXu%Tj#6VV%@FI<Y&%
C$nimF RZjDyN:Pc:b:4LX8J6Ye111lQu=i8I=+6Ii@y/!nGJc$VXuuc/u@>VBwcV1Dh^++Ynd!=tt9:+Q\?CZd
1E*XW< ?S+Lat9Ye$m%VGXk/iHn=#P*6=hPd>5VkFG4uLi=&/Kd8GhBP>^*t%:G41?&F:V>R><Yhe+Mq:TERVTe
@M&IjP \:&\ujNh>B9KK1FD1*uylK6XnL@\>4+Zc+Nuw+@dXi^^##yXdV#pL/K@KA=D^>#M91&djiwL:Xtjq>P>
E@SXF9 P@utKZeBqjGdLnLSMThDD^TXyI:@$P#16#h?T&=lJmFbYd:I=XRAXy^IYE4R#N5hVN=DW9e9eHKhMV/@
jHX/XD +&ZB!YLyyKlC&XN1eBjXEqB#8PJ4jX/:$$>JMNjeXttkMQDb*$=59i<T@iEu!bi*8e<@jPJqwch+dX6M
\jw#&u u8HD^!eIjVNQ9%\\6!%R<hl6k4^:$91<Y>n&M8RBNZL^*5RR?@c%?$c#H@nwdD%^<?nG6buE?qYZ\q$n
^l%VMF V*6Q9*n8j@t=ZaDcCh#aHYhX>:u>*1^\^E\#Z=uTib4VcZ?ai9@Z\hSNYYii1MT?@/4Sp9/nik@i$:<5
STG\kN /:\mLdZb::9ek5!V<^i/u&kRu+W</HwMC5w=ww9IeI9<8<WSbWwPD!<iPM\+w+iM%E*jhX5*Z9dwKSJ*
THpGij X5*6q5<cJ@B#ZhI5K!m>JACyY*hBEPn4<!y6ZQk\Z1W?NeCd>WWQ@l^>=?4aRajdYjF/T:Z:c=uE1TIL
aP*DXh GY49NVn#CX6&9a!#&69LiY!/n%KmRpA!VpIMATNq6LXaE<4w@Y:ty?*Vn<llq>X/wuM/uh=@H#dJN?tN
tINWhm P%Z\eD<bSZp+6P>9qi8*48Zbpp&HN>p@XK6a@imA&/^qG=w$4J\>+D6!>6nSH#eYXmM4+QmJWj$dPeFF
Qu1\j1 c<?QZQW6Km6@Z>:tY:#?415bTj^c9juaZQly#i\ZhQ>H%#e4w@Vp8uK:e/N?\tiRMk8bF?=4pyi5!>cR
1+ZC=a cHP69y#G+qM4jm@GVuPcY<QaS<$NBSE@#VZh>H6*DqbM66d5MamlF\jK+#H?&qiN*1qD&IY5hR9#I%@t
+ieFe! ^i?yAAjBDeGAM%VMyK:^Skk#:^CNZV$Re>n+!RdDm644kC%#KWT?/LL<qM:Ah!R:F@u?HcT#+:QMA4cp
VnL9m/ /I8BZNDJ?y5LI:<5tGFD@1t6uQH*/Pc8Ci:4P<lE+VyhK:uqA#Ey=>iL5*#G9mX@aL1ZXp%:%QKGC=Gq
>X1jY* JhEuCc@q<yA6D8Dkd?@qL:tetpP:&<%juX4cZjILtj!4YQAqc&Seh8WwLG1VcZ*YecVDm^i9lRRK=X@N
WQaEuj nY&5@q?G:6yV@n6*<Z<V8t9=j*IW@!N$%<d/@!y$N>\kp85YGbqNyXJ%9JM>6T%aHL5WQ&c$teq/1&n9
Nh\5KX IIia+GDh#DX4C^Lm+>hH?/$NY?jt!GK8M#SmiiM\/:YnuL%#6GPmk=$N>L*>VZN=^4d/=1#<<H<\itM5
m?TPZ8 p!^5db&TW>$<%1\#eM9Im$kKVq%9/?Np:imX/$dX!X/d/adD/EVTjjJh<:NbYV+F^wG8RTaBBR#tiy1&
%4\#H! 1bYH64Y8QZN>mp?Kt=M&NXYQy88V/baT\DKlYwW+GbmcyQGaCS:8QnlMn1hNuuqG5H:Mi68I6Z+lmZ/?
p#6:Lh St9V%>HnW>$MLeQn1W+i%lGYym:8tcGJiW:^D1tGXN5p:@nIDT/&>A\#8m8H^<Bl+uV#nE*CcSH/qtES
#6/y^H =kXB8e!p/KBEuRA9quc+1Z+tZbjt\+/M#$8k&$VblVJhuZXhhi^V6WQmw=MKYLR<S$iGQk:nq=ZtEj$Q
!upm=n @K^Ndl!hGdI8J<+nNmtbqtiW:b$ZGd@Y^I61GSt\IeNWL$A9KCdD^C1JV9Q%58KEF9^=nm^HB@h\HMcG
E@F<:F /p=n^5Wtd<nk4Kj:PFL#GXHekHT41AJQ+*T:PG9>>P#WWGhj:?\$u*AGLTGCGdmPbSebtL*GQDt<IDE%
1:MIi+ ^#:$H/Bb\*SQn!B8+F1#pHAH!=DaCBQLNXG/RTG<>IkaL%/kFhW+*uSNDn*Amtt+Jt^>WI/:uW&&PT>W
-A*Z$j 0008402657d001202b3 Page 418 of binaries1.zip
BJMdt> Y&ehI#9bNh<jl+u\M+59mLJIh/SGbBp!@R\VhdQZ&Pdti&d+WNQ#R4k=nQX=tiqy68:^BZ:yimH&?W:t
dZEA/C itq5!*XiBp=Wm+!$$Nk@LcJ6H=jP$A%KMwuJ!E6MTnQL$jZ#ehFqYhqH4:eLmpqJ+NLb/^LYyX4E^*Je
iwl!V: w*$hAm*!9Juc\Sdy96\%wS^nK/wjD5P#mk6ay?8iEdw?MNZQ#MM4\VmH\R/M<&Z?A+^LDZQkbYY9>Wp$
dYuaeP 6DSmG\T/iP6!EqnB:t6=eY8%9jV$VjKD*HX^tJmCjE:8Q\DQWRpPij+Jchq?YhyB*m+l5YtPS4Fl4Q!W
%d$c^# @GB@G$N9u!!cnVMuK6*CIp@H65A@L6p+PMdZ*VQbMR&HCe@JTQWLTp4M!8c5NjeyMLP#NA!M%:dK$Qa\
kIWIT? M4A\<Pj+S>tbB?XpMymP:Kl%6k+t&p=PSpuc:9TI$FCQkIBpB@e@hYGZ/JF4G4yG#?IjaN\%kZ:cKVqG
l*yhDQ JmGYKdEJkSFP>kG8MiGt>8c^dn=SMY9mDa*e$p#ha*ZhA8^CWnM!9hlS/T++nKG*y=<>t=/baWt#$LZV
8D%RJD h$\%a/%%b99GehMb4md&=ttBVGQ4?HnHCFyKX1/VT=SDNP6jR*h6/Q<XhNjG#91jwd6&@\#h6j8*wd6&
cWCQ^k @^K/c@QQ<F5d?u<E=#Ia@*4V\jdj!N4c@i85*Z?h6dH:%>BhG<b@ucZd@!hb?*<nc@89ReG&6Q</c@*u
KH6*=I B9<!c@q9bGu@!Z&6@885FiM@!X4@G>u@:H*y@$dY?q@DnY*@nd1!59^Q59>GZj&uP&G&@$bl&X4@/+K&
PeE&=R @VeK!+=G?>jbj/P\dGlY@#J4>^>*:&#w@?Z8*j>kcQ?**V8G=V@9*6u>m>$:G^4h@9<@=G61cYZ@Q!hj
aNCKQC 8%#ajb^cNTBq<:wC!RP9F1%P6RWPDQWkwNyV=FK5<SQ4dqGt:tY5VuLC9iwpE?<BK%QmVbhd#+kDDl=*
WF6=ZM 9wAQdK@*Xi>qL6&yJ4HTEdd<5k>u8>Vc*4VSn6<=k*H@Mdti\VE+tj?Z>t#b=:ERaquh&A8HW89l6hTc
M^&ESG N^:=#yFY>W?X9j&&YMje&!MiIy#1Jj^Fm8K:RT?Y:i&+F*9!++cM8?hPEEhN#h=&J/WkdI/4cnn#*TJh
D*y1th H>eNW\6Kabu$C&QW&8!aB^jG$mVnpht%8#%Q*H=nFI9XPEmi@bm>NB=y>^t%lj*t4!%qqmF81LYu#nXq
PTmCMK ZilthD!N/p+/DCNn:dZj5TJXN^lbG6:=QC5cE8mME=EaZV<H8d8ZWb+Sb=?@apYe/a/SuM#in9@t&iTY
WGCIKF MGLPP=Ft>a1ShHCuhibI:G:8%<5llHNjN9@16D:RH*c9?kL5K/quu+6GX1SqRZ4Zk&ZV@a$>h<jtn$Ze
&pN:TE QhW%hay*41w*@bjt\hMIhbiu&<^Q!MX&&Q#KiHw!^&pn1tPp8BR:>yV5SVtZBYH&1SW$/=>5S/k<YZA1
SjSMNe jcmP%B*hlwJKql=+JySk?GG98k45*/=i/D=*&pm:+MHJh?uDq$:6/+q!@q6y/u*I&pQSba$c4=+@&Hj$
yYXDJB e+?*I&cPkH%!DGXh6LNyZh#a>*X/K6YZ>PQF:/&cPE=Yyp@NZ6//M=w=bjNPj8GSl4jSlyT9JPji6F8l
hm%thM 9!Ve+:!aA@uh5^Bt+4ayw<#DI>wLtn9j<JG+t@&LBV<kTSek*k1BS4YE>>GZZwaj*d9F6iZV*^CttWjG
tHE=L$ @cy>B6i^@Q4ZbV!S1l$*=8P6b44bjK&Xwd:^#n&a^qD+S#lBciwallcYPyai*nqTiQ!k\ptPuL&VYi@!
pK+McT %ck8&$#n^&8IluF^V/u:je9TRVWXew%!bXYRb#bV:DFVhVA@y91E$MHl*1jDG5YF=u+qp^:6!K>N86\p
!a:uCZ !:RdBlW#C+?&=ul@FMYNcL<X^\8Vhwyd<KNj<6RHM<\>hnE9nKywKDI=bpcYVu8QJJ9LSS?*Y$5:MYG@
>!S&XD +uI9yy?:bcSdWw+m9H^\QMP#yqNqk5Lyn5:C4N6JtV%*d&#lCIGGNdq@51*T?Q8D#1*i9w5PN\ymWuAb
t4Ep&J hBtn?%p1*%%%u&>1*9@C$&1pbQp$>8Fn*6n$@CW:Q*P@%#@ZhW88Pk+t4FE@P**R<%^eQ&*<eeIEDpHZ
AqGm!# **S4%Q>Nm46lXYujZw?<<WMHi&!nVlLj&6k5ni<njW?=iVFqZ$w@^yBwW=ei5kXYPK1lFt=WlHpe%*P$
#^4T4D i9C\5ndu?P*/u5*4jhZX%mW%XF?+Qdet1Eu6aPTd#n#L>AeuFTpdW<IP=?48Iec?bJ$/FQV@ai?@w=4/
6cHl1N &*XjPAqJcAp%RKmG*mH$D1GF*u6Q/L&DNDZ$nuRBWWQ9TBeRqh+:CImINBERFSEX5d*Qi6jc?>%u4h?#
c<mNel u>@bb?^*uDHP?a8SpjHlP!j##njM/=4*jctCX*TMu?%pLP1tJD>C>@ACHCL+HRHQd%whSGk=QceZZX/W
+9iKAa $>eP@Y!#wyc>DDih4@cSatn5%FnlmPTbwHnR$HADRkXmK?$4Bd$MV/\ll^R9RaST$8&M$#@bC%cmeMd%
Y%M*%J :eG=Qy/Rjn&&+<VGBWn>nm!$SGmI<YW<jk#?4X?:@=MDW5C4/XNQp*&4=\GL9QN5=JaM</4u\RqV4CB=
EEY\bk S$*?!j%:muTQDBcq&%LIqk1Gq#W?K$/a>nLib*Fcyyd>qYp\<@RmQn8ipQ#$XMcH:qiRKKSbH*94#1L4
Fwy#t\ \EPC>=MYpVbbc*J1@ttVdp1K65$&M#>em#*<?6Ih@SR*+hIK=R!Q+ujMQeSaiM!R*#iYhY9BEunB<E=e
k?9alh M/&#cKL?9a@cJ&H\kjYW\=MDQ$a8/jhCq>DeX&:Ajtu^ApjGdeyhHZ4#u4AY4jXZ=KSy%+DiHpnm+E!Y
Lycd4# ^K*tmIR\iSlnW\uQA>e%eyt9+#h\+<@^G#^H$JL9cl=M5Q8B<It^=Md+yeNYF?GpDlHb=Bd%!c%ZQ1WQ
p1b/tK 1cAMZa!Q#^:EQ?Yjdw%uM/1i!*VKNE&%J%F*Lk^tdu!mMN5n^n!$S9aPq8$QAZw!HVXN^/&MS$Zh1V$j
A*^<>q 1+He5Ql<#jh=%@wwbQFBt%KF$*H:\YMtN9iQlPkkV^*Mmi\9wE#/R/inwTTH>>FTSe&#&DIh1=+j!==u
DDWX&= >n8V%/9:b^PlGZt:iTHN*>??bZD1Rhu*Zb?qQiEtnDI::Yq$jYMNJm%MdGL5&e1yjYd^$6R@S++E&/:I
9ldL1! bNl&hE$@nG@eX@mPCcu6L$liJyNNqqj</iIJG$uK@XejSFm+M<j6Gh%aI1$L\p&qi%>E$b+/QF^TE^Q6
%mTlB5 i^4&6VCd:9:MEw?YFc&EB:yt6d9JmVQ@:yQlMZktTbkK>4/p\6*wqyeQSN\@ye/?LQMqX%F*^NLNXDqD
E6CM=$ S?9\d8>4Ka:F:p:G=G^?aj\%wXN?%<%G!w\Ncp&VA*\qH9&VuM$t<jNA$JPcjh#GZQYHY\*ZB$/!cy:+
/heZl+ cLF&Y#>Y<<P&mEc?W@&+?tNc!L8N<@L>P^Z6/E!Qw!54HtH4E/?mj9tAS>NhV@/Il+XTLbGibhDSh<R$
*PkN1/ Wyb!1bZP#^j>^6$DeYZbmAEj<demq&K/N:&W^1&MjtY$NGQ%96b1P:deC5qYPjKkCp/^yE?:e##%ZS&/
QaFCu5 5%1pje*iIa?LV#h=S\lcI>K1I1F1cZ9AYllXI@Ipy9X!?$eYi1G5=k<=w+B$A>Z9tDji!6qVkY8te!pq
nH+wL1 lAWh\?+G94&ye#jl*+>+QTXtlZC6i*@TRDLy5>d:59ekt$Ny1qLBnE?cLL5JK<DB^jEbyG64!k9lkcHp
J9aw9W 4MhNYWQyk@%HbDamnPFnk/=6^tQCi+MHk^%9d@JkRupF:V%>eMPc$!wy+ii<>\?Mj91ubc%w15dWacd&
TXwXbk NZcllqKtJjBDE9Ip!/pDJ\Cy/Z%K1AHA5?86Gdujka5PXIq$L%Z$WlR>&ybwj\T8DRDZ*p?WD5cahw#n
?IT4^4 Puu&a6wISeI1bP=HFQ8KL+bQ8w%$hZTwHGnB$n/u5lI$Ln!+8\d*\&=HmR<itdT18468iDeMn9KNm#X$
ZeCII$ >Y6#^cZ#4TanC=6&EX\uLi@EL8wNFVT\<l>u4>=>KE+E9Z5wH?^^iaMut4G%Njnh/1?Q>@qHMySwunEK
\%i/w* 8uP@$@Bi?P49+Z6@$FPTy?6W*:R\^*CSe916wiZ/P@jwIBHu9HySk?dInIEbCn<\/PylM?G!=5leqCe8
nR8SWV Pc5&lEd*:SSd!4b%<!+y=dKK?<dQY9ima>hKD>58hKXVDWj%wWDQy!=eSq\j!weK+y8+L<H8du%#4DGu
QyXh@J %6+nPdVFM/Q=JG:+bJA1:Y^?AqVnl5Z:=9y:*t@mh1b!W?*XN?GB>>4ZYnaudP?<%RwuiP8B9WWPK*Yk
Y4Na%^ ty\p&L1^S6%QZB+%4bEbeY:Vul/N<%Wy/\LbYL$Wwcn>6pinPb?Gu%E94DbN4MEcAd=iliGVmJ\c*=*V
4#6\5! BLKcRG!PHmRq^:q^IH+5>MbEJYF=1%R$cnp=NETuLWG\e8?\qcylEFy>H!b+eHiiK*^m#Zd+yE<pIal@
:^SCMk Y8b+J$b#\>^4M8!E=wHZ%+@uHPHVXE$4RD1>Imlh?LeM!Y1hhiFn?akXD4*<65y$d<hFL6FD^wBK&YdJ
T8%^$! VFk\:Bc+p:W?B*?mVhj+SAnTcDaP1^+:8n&ea6&^8EwaluqCTYEm?Hc5@MpnH1GdXCGtjki@1\!&TAZE
K:aBYG Rd!dWihclp6e$XA4IV4:GPQ^LC!XjV9cbIYwt\/FWt^/NDWZ\=J5lABQ#PqJTN<I?L5/FJ^Ha5t?J1dX
6jXB8X J/ZbFDk\l8Sde<58DkbtuqZ4yt6Imy$diI4+Nj+B/cSVGimccEKy6c>ypcdFH@tVR9WjL#dmcwFclY^9
LbDVK# NA<qhM>!My5jh6lylA9=ZLkk^D=Vm4w/$^lw#J&bmV&WCkC+$/Juli6jJ4XlC$Q4+WD/qFQ+t!m^yymZ
1nhVQ* QL?JND6LhInH1:4/Y6/Pw#=WE<G6QD6i%ClnR8*J4JnwlbAMbA\lL1&>L@>Ra\Zl%T\1IDRX6t9eWt+i
pPW#<m cN*Hk>QBM8kYjyM#VGR&M>e?I@M?1B?6@q$PC>MH8J5ADp\1V/:Q>4<t91H%P\*@eG=9Mj$!&Q^%=WHt
#S9q1K ^S5bj6BTX:N%8Ppq/J%RF6leJ&&h>yHFkj<TNCj$#eXy6?EaCdNyda/*BI?&JiMQumN*$iLH1<//u>>b
d*8=#= #!SqcV@ZK6lY!e/KQ%:<pKFn=**NHIcVKV\QYP*C4@cSIJ=y?K:lLn#QjFwe\lXZG:8m8#tc5dbwZ@Ni
Y+BNZ& lL^8$%*!=IT8FA9NqD9plaN^dZM/?!yKJBAuT\YheRF5Q6K/?=%nCnL+k5tI%\u:idn/wwBH9<Ie\k?1
cV*HP! h8EycEE6CIp6K#@EPmmde/5X4PKVN^9j1m6=R?SHp^\8IJ=RJ5NM>BhlPYw@=V@ka@=WbD$p^h8kFP1*
+LWWP4 ?Xn:/:ba?Vl=MI/\AuA@H#6DL4!juH%HhPHi><=e<KGhV#Z+@T#WhE15it^XbBy<QyC%HB6k*&^e?>Jj
i:uMyZ %5YkA+=&H9PXl=+k@GeGZ5*/VnW6?Jk>>tu#kWbY9wWyQyh>nQjq<He@E#qqJ&*@Si$/De61R:6@>=8N
8Md+QY YSNaCwT6mVQi@>NbE##P/y9p@\HNBPRu8Ekh#VFYF/bN5M!plwn!\iYeMAXup&9%eMLJZJPuCRZ$A^y4
:qHF86 ktdElb%XJil\<V&E/I<B%*%F*Z$5=9k/my#HA\^wAwPHKE<*aRQ*5yu<SW#:u#8ZF5Z=H6yF$%puGV6c
1S9aNC ?S?iw?8qVHZjcXpVc*/?t>ImXq@IjHyn!A*BtpnmH8cibPyDZW<eQN^hV>aNtPdLY\RJdX9SXE!C+Z%^
lA!4V! d9dbAeG@Qk+^XKMWl>P8J5$#F4mw%k$C\@p=Dpc@L?\BDYSkT%t6b4uuaqVKB!iDlPWJytTMYTG&8QBq
-AdYbW 000da061c8b001202b3 Page 419 of binaries1.zip
5Mj6>\ TMeV<9Iwe4:J&yN9yHu5u$:C*<8pHJTMtT/^HKJ:Q5aRA#?#<ceX$i@\$l@^t%$Nm=???Tw!ZNBM>jtF
&R6*al kJl$J8<d>^Tl8k+F>+NR9G?KM!?6/4LlVjMm4jyh^D/+\61&weQY\+!^?bJeADJwtbW946<wZY6%w^d<
1n=A\R M1QBC?9ccYLnNj#MG?LpdZdNM<w46Qt=D+>L5J^m5!qVeG65?J$j+ceL9ujKHm?KZbJ%F/GbA4J$RP/=
jRhl69 5=q@\tdZy1$Z6dZ4=:m+NRulTZc5%ML!^Xc=XqPu$M4#6tmBBRPLYGkX\ZQFT=@ZeG?\8DSDZP^ep1qA
tiJmy9 :HlIyZLnB5Wa*WJt%J1*YHcu<lI9\w<1E@NG1CTyK!PwuK=Tk5S===\qHGQt@/q<k^T*:NM%b1S*Z=5&
u^&EJ^ #W*McS>/j#u$JnWlX?QFLeb=?QhHwlP#8P=w+>Xc!ZiJJyq/NKW46nbGBZ=qt=>+e!KX?$ZLq#YljVJ<
5kC=pl LwwK@E5Lbm^wR4&Y/nIL%EMlE*$4$@Xb+8kSjD#dY9VKuChEI8Fp6M8C$A\4S?Im\h=pbWu^kh:+*ky6
iD4Xp^ @9Ll#?BSH@&I&qNKkupT%1M&^m>9CX<H&94byFqYcS8A8>?8:Zy4*>:uyNGc8Cu%q59t9iupw/9tP?4l
tkEq^H p/PQyT!h5yJ$YD==C4a/G#NyVlhFS#NVM<a&t\^&wi169&&Z6V#u+kt&!iaFpK$Zih\$AY\*!TI?%*uY
HT=FlK W?*qBAma5P4&n@y?QN:9T6TM4:ZQM5tV6dl^X+t9MEe8X%<iPpcYqdah?N%>$k:jPp=tj%4<\MG5M#di
%!dacb ElcZcc/5C#n8ab/k*D8>VjpCJ*!Y8=D&J9hn:hKjMy6%P\tNbVMBjN?89F*@6:^SMT@1>FH^ePbb:!8p
H=d@hD 8Kb+^e:LewPSCyum9wJDtWQwp&^CS<HAaH*mkKL?Qk=*J*yL<5%dqp*Lynk!at!&$cPYEMnk5/:A96KN
@/8Y*+ jJnw$^<@Bn8>^c1MX<9JK*/KbVy<\^Z=C\Vii@CJ>?pdbyynb6&CQFKeYj9i+dqZ*R&K@hCkq@iyjTyV
/4k!We :ycdSJmTha>h+CJj:qdc1/=eHM1\!ilVcT1Hb\u+$W@J+u#<jJ=8IjAD=EPhH!5n!huHYi\w81^DN:4K
t^*/Ca hQna\qk&kjKp8RtNL>PmReNVT\bNyTMD5#e*HWc>uw$6XjmuJW/8yD>^9LMkdFBLin/SJQc?Tu8pYR\h
bY1:MH iDW*y@6i!4:#&L8@b*\4IG8$8H/R@G!!%FpW5?HI\A?>Q8d:WL%HbDb8=hqDMe5HN8X#WWSd*PVRQdiC
+#HHhd R%ck@>M=!nAPB@tuqLGme=Bmp^?FS+D&i=1k6Rpj8dIJ5QiIuYX&G#X?uZtX/%QCyH=/Aw&G=y4LyS^%
X!GJmT ?Q\9uuMhp*:li**IlQVHyTk9quC4\hHC8$L\=^@hF*S@p^u!:M?V<p!>\8FLZKj:FMD>$:?6Ze8ptP<E
WL$pp? ::<wuWMZpaS!k9+!+XV8Z=86@%jN%j?yj@y@pCPq@64^CQ9HK\Mj>:D@RT?X?a?<RSu=j%>IF9*94&Wq
*PMFq^ @?Pu>L>Lu:K!@@G?\4@Lu*Lwj*ht+ZKTe9@N/lDZDI4+^>u>+^V?l#lD1d>RT@@ZDBq=1j>m!MlL@q%D
QtQl<u =n>W&@?5Bj>Z+X^P?t?tIM4J@t6YS9/9DRw=8Z@NT5n@E@%c@9><p8E@L5q@SBqK@8N5@u8Wwd#$*+k!
L<ql=q qFQ+Q$Rb!58mbj>Gp1GyQA<nuDSJA&@c/!:LVy*&Q$p!%Qe\:*Q9eSI9MjT$WQn@Jlpci%u$HZ!>wWa$
Za^6X^ >dbW=GZM%1p&>:H5>=C>b%J9/Y8qYGQha6N5:YjXB\CDTWA&I6d!<kkaKSmpDmDcT5LkyCVDRJyeR\EG
@\jeVc Tn6^!#ceI=wbDl&JZ#!LW!ilI6NI+EVt/9QSb$C+Kt\b9>&y#ISW1keQ&JEkaVnMWNRpqwIpc##Z4H+n
bGSS+D 1GVDFLyQtD!IkLAu+#THn6Ke+WuW1Rj\&+!S/y^R:Yy=RSkNc#\6&K*ZDPG89l@yPWmH#4yhuJAQhm?l
c5k+<d FeAcJCYTJ!%j>*5q\Xp\I48lkKp$n\iQi5nVt6wLbR#*6wtpaCc:SJ?e/h8LpZC>G$\phcYDmqN?AADR
:ii*S5 +PBbGXn/tcX!ER\XY=Ka=pa#Hk>ISAuEy?^&TWytDR:PT<QSQ@$L\N!a%TR+VuenHq/B*I!QV\#G<tZ9
#ZQanj E\CmR:RD=ZtWdttln%An8XntLLeTZWY1i6RyItj9:E^=/4PRqkw+ebNKFXb%FMNGQZJFk\G:\?cW1wcI
*m8Ilu qX!wQVScLh8<pkyKmtiGKJ8SLTLXM%dy\FV^aC+pP*tXIKZYCqp9piM^GThMpta*upc4YRB=4k%B9YCp
MqJNcN #R&QpLKyPBCIXWWq8e9Ty5IWISwntwK564bpceHC^Py\cWq1IDNH@QQkXX:eJypQmw=PkJNHL&<wYpDt
<TGiij Nu$HYH?Ey/***F=PmA/cyNXQbpk9\C#NWiDNLC<T#+telNNL1<#hICayTQBt1P?$GlQhCGhmSCKbmC^q
8II$mm BW*M%>h*hyXF+k<8d<EKIiScWJL+*#TJtY=p>Pb:ekLqm5=nTH9t\kR:jZBcM94HdiKa9K/qZy>wJZeT
8%qy6# Q6&eP*6E\lKW5n>pDTDjDbFP9K*PVH*QeTR+!=1lB8lwqJRencM6SkF?T+C%<&V6m8PHXQpTPhq9%h6#
M?AFbZ 99BqK+T$AcAkt1ZAiM1mAXtaX1^Hkk^DaBqWSJP*TJ@1:P+mXm=wZeDYEaa=Aa5!<c=hASB:ApiebBlC
:P:bjT KGQ?9k64/B*<L$XSyu9ZLPN#K=C=ADI*Ha9uZ#S!4=\JRECHT?R>G%j8d%^V6:c@aCGdFpnXc?unBdW$
L<d9M: #AjS#5+dNCX+$q!%GIhQkbLR*#yiy&<^dXmH&NhRIwwc!n@#&d$Cu?GGGMT+jQXTD<q^y?S/i=!jCJqE
m4X\?m T415@HBJ5DWnALwBPLyD%\1a%GAcZbi/486%DSByK:+RndX6mV&#\tXX=JNk!jwVM<GMJGnHc=4!#A!k
^ac#uX PjblGVSj@GALe\IKC%51=$%l8W1i&4EnmViukEc=5eButTDipbYAj@\9nWu#kRE1BeE$#m\l:MyR>BbF
K8V>4@ pm$AnMymFVeNacD9XYVc!VIl4/mHJ>p15VVuw#q*t!XT+9nBlC^tEyR8XFM?pcIK/bihhI*XYABGG5>G
S!y<QT q/JynIdT%IM+ein5*E?e8a9pME%X!ebnkA%!b^PBe=iE6\6BZp!BkjHkRM1Kjm:Cclka9<MLQ>dpuS/E
^pqiNd MduFeTVI8>M=>5HI*AlmqIYPbMM$8<WR>^D+GS$#GDq1WG&LTnn:^?JHqmWi65H^b%n=pc=dKIJ$KDuN
LEZP@k #pGcN+TN1C61&Fh4mitXBhKpAYEJaJyB=CdNnm=jW\mGMlY>DMZZPNEEl:NymL\XRwYVW=1%aiI^d/p1
VJYhG# /^q/:mD&E5qpcIC6N*Mq&yC*^$CC\!mI1DqaMlq#FIV=me6Ch+Ak+Mak>X!y:IbBDEFAnF*c8++KZcIP
jTCBqm A6S415ib=qTAkSD$JJlESJGk#kXJBMTA8RVEPh8^dKS&VYT+PFWLnbIj>RykPHe:LD$9WuI!&AG$G?=j
YnR!*m WZ4!EaD<^\*X#TbEdn:Wp^aC1PyJKR6B$$JwnBE4Ql8py9L<IN5QFWMymitLYNJ*HkEC?>Y$Khi%%PMB
lTDXh/ %c!:Z=\JlGGKeby>KkKPLCe?++uy+piYPwDLBJ4VNWQZHMHIb1:uCpGt&9JSelcuJm%K$!TV5aJYikH\
qbqVTD *S$*nE!>IHeELAZDwTAcRpKGC=ilwm!ZB?\aA:lSuQW:GGX4ZY+RE><8Ayk4XhMe#1E=u=Gu+C/\J6@\
Qim@<e 8Aa%R/&HT5H1JmHTJ>MIbpViBqNt%pjNNRA#^:%+tm?WqSnBJNb<!at&S!\a+!KRBIc@/e%QARIm>4a>
hVbGcE &%:<=Sp#X^a>qeT+E4npmQVSE*lmSthT=w+qBPYd84hyDhQ?5nWGaZMH+A8bT=/KBYtCVhN?ethN@?Mc
J9&Jaa ^^@FpiQ=$GNRumJ<8S^weVC=A&kHVESbpFRa1?yMk5mAc#b9&J:e?R#F#>4hq9S$uC9>nQYb5*5w/:u%
GQn/K! /8:uqJB=8*tjJHTCQKD6tK*!IwKmkw$Ta^6NA^T=ARXE*!N9?<hHwpR6jalGhYkT!RAmKN9D\5q&I6N+
yTC4e1 MYlSku19BPpPKStG/:Ry?Cbb\6qLm4%C65RhW^u6\Wd!tNpApESadVwcB6$4><=Y#\EPyZt6%49DdkMY
p*PbM* $aCwT^yR6VeXC1RJ\FYAjRwe/RDlhJkNGhl\ItWF5a^@yCTJ*C%KE!Lm4pE+/KaK>@LN!#NWtLC6wyB8
^X9cE< 6mRn&p8AmPb*iG#=PIq84HI?NMDEk^k+<hCuP5&FdPVCIAQ%4t?!HkIu<@e>w?MlIdZ?4KqB+Acd9hRt
ILhb^E S=i@jAk<k^HIFEl$W$DD!6/bb&pTJI9HkEGa^y9qKKBtZA15$6A8:ZPkjlIZK<tQ>9GEwXQ^yPB<=q%H
mi5VEk celbJjWRZ*GIJkM9ApDB>%J*tc*pb*/TSH:KcBk9pNCtpRLAWYm$$RMBtaEX8ZReyMq*cF\u9Rluq=^k
6t8B6G qDc%/Pw6BABJ1+=pbmuH=BFWSKTQa>yImF9l/eHuFFy6Va?8Tq^VeIeTI=Qm6Ipa*hN#BAB#1ccY>JQ*
%@@tuY p4byq^!J%9TBG&c%%ZN4:k!#<pp+EHIHcPIuj$JhN$J5<:t+#iX@j\EQYw9pVn!h5m*S%HlE+DqVXMAi
\Vw5nm <TGjhNEt:/C=^p\=$P+Bk>Q6!mcauSG\&>*ZhI5>Tw8L!+bE6BpRV/jWZMqKDT\lTcA%q+<uHiECtqAt
W$F+qb d6n#w*1weFl&cDEjT4+Iw\9R8k<G&I<Ta1CwPF1W&PhlZSa6YTAunB@9DMdS%d1/Y+>Kpw*iy/1cI+u9
qh><JF kZDiyKK?+EblaD!!Lu9l%H:YEPF<IMGdAt>LpiQQMYSLa>!Lm1eA:VE/kmYl+HIARWB*X+k/KJhu1QuJ
Y*\ymm #lpdKJKCmKWWL$QlqCWImG8:wb>+mmpHd%JZ#L:hR=D!e*G1T&1mhNt$Ayu^BDA8=tPq<?61cR=Vc%=P
89kCQW tP98ETetTyM#B$lwnPECA+qampE!BGePAEBBaVCN\u>kGN+CEMMj=8cD9Tt\k!uMS<hWGw=t:nIWZPGt
qE4h/c BC^n\^ab*y<!QlA^VEdTPE&QT/EHXm1n5AkmkBR#T49DR%ylD>p=bQ&k!$TMI?jpbCRtpi=$$CcRpRW6
QF:SSb kuGM&N%LMG+ctiBKaeIH^n?n&nNq<umH^G5l6cTSt6aw*%+kwI*<+#S\#DaRn$Nk/1pAw^TDH<D+DAkl
NmZZa8 BcSPS1YiBADT\PLuPiJdGAKq:h^Xth==u:t/Muup5FXGM1KlEMK=/<+wk4kF^mTX#!i\+heaK+^SSCIa
Nqjb*w l\:E>!B&q?u^GC4P69iEW^4VTuI<BlCjB5cNQ6EkI^PcLS?qI$q9Jk$8+>XK$ES^<:8/:?E9!Re41RHE
GG<We/ bkDkGlF:QRHMReCTE=DZKByS8TIRHIADu$AL#ASk>kDA5$%<MBWB!V!Ibh9BeGAt!i9DAeB#VW+dXqAQ
?nKB*: Gh/Dw8tIV^Ky!V9An?GlBI:CcC<DeYTMQ9K6KAAFAW6B%pWXZ^^WR$GC&WVmFbp+$#lCSABAR^kuqIw@
Pd1iRA XZnZp=^#E$G+tbAAdThkPdVWBAiu?DVIKNTucXE=VD8&ACJ^eZjcB!hYNaJq+P!mZt^FDb*VRl!BBFj6
tAt?#X *Wq?kmq5MAYBwYQpQEBT:=EjZGPJ#/EB&nQ5YwP=wHV8$ySAcYdCB^KAF1ZkF5iPHwIAaMbkPV1i5kM1
&k?lVQ PadJYA+pFeEITHw#+PR:XV!Wb9h?SK5R\!AXACDL=pwG1KlFpDP4DDM!J#1mmIyALcq4ZFEp<V6MtEjk
-A#P%J 000eca259aa001202b3 Page 420 of binaries1.zip
9WkeIV cpuT*S?CICkdMaice=+MZ<K^B&ZeDTanilwRj*>VD&e*5!VDPdMPk/uW!%tHBMkJ+?T<dQ1DPw\<mCBW
6d@RE= ALe4#IiISj=d8l&Bk<iZ9y1HnLkaSLTFXTRBmC?=h<ISY18w*X:KlC&1mpMTAwApTjwkIWwHFRlAqhB#
8qI$5+ ZnGw\<XA$4R<ptXchNRu$^D!dZLkQEuCFm9plHywpu+upFE1k&=RFRDMkSyEARDL+NB?RMW&eCmFBWeH
WK@LhJ ^HYB%P?nMM:5<e8MukQ58^%RhYj/JGtAc^\#RJ@YnIX*WI+pq$Jq^#/V5APwMQ>BnIpF&DLWH+HXqaEE
dT^Xw^ Qy$hAXImC<&Pn5E\tIGABdtC&jD!%D6ICM=AiGicjJCCEqnN\4pNBpdw+wp$R%GcKC5BpC<Ae<WijJPZ
D6*5dL L\yBqccEPttwaGVG*e<h51jDh+B#9=F#%4MR&1l*F1RH&&CE6WDmKR4*n+&FJ^DZ6lP9D<a+Wyk55qie
DNqjwX pqaMRuF$%Hk6E6SNclRFDa<p%X+C>iBNiNeGh&$W=c1$p41YJmhEeFCXKe?TAmNNk8tB<BaC+$Zwh8*y
dh+X+M D@VBPGW%uVaWbl95ZW8:<=RC8MmPp+RMA8%*e<l&DwH^a8A\Am&SlwV#J:&:JQN\AnC?Hqc^!wiNRpbR
uqt#T? KXql!HiR+N%FdAPYhRhLk5HRn*\FEAYaJ$@yM1%yG:X>l<GdGH>/+lW6#yeY&A#G=\jmWA!A4CmQRXDF
P5eY:K MB&tHkHI+hCTJBqPP9uc^Tj:&G?@A%nSwRKWBGFpIeVCdy^pRn\SVLlp*8$AcEqTpJ?\+^QAwdWA&wE#
6#/cD5 qCGFPwkT\IZE?e9ke1pBQQht$6l*>$pICGwQC6n6*^<H?&EX>G=:W1HXCG4WImV?eQ<j9\EqS+hca/1I
ttV$uT k^IWcaH@&HY*/C4<!hY#4uFBAjk+h1KaAkHD5uQKM1RXmpG!4M<CAQp5uG%mRBdmn8FXD@bpeB6Y5i@w
9lZ$Q9 1tQF/eCkSRepnmkBhcpK#5q&8cMV^Cl&5JSIHq+mBeQPVXmkQ!itB$1Ik8Q1p1K\AN^ZMqw?#6W6/PKp
t?t4mD !8=QclyqQ4eL68EeaH\4hCn$i?5+^=A=DYCV8YKLw/L&iEh*CmMJSE%VA!wltDb&AlXNjDqV@DRhCkPw
tEFX#n dkm+p/W=mCRh/1T\hRjnRkW=mdDhS$BMD!ulALqnQTA1uq$6C/8w9c*icNj?Y*QIpIQIG:Zu4Kb?Jalb
Fb@Bha BXZaW^C:yt!*dCy&aBnHpjlR<l%j\E+l&^AYV1q1@YFae*iWAbAp5?i1b4I1mEFT#*lDBy<8@?N$PMeb
j:SNSP PYXyWJ+MBCneDMtJRXJXWND86mKHNyAXF>khKAT#L%hyWbBR^wRVARM9lwmY+CF9=JA!DClAac8+6*5u
kbt^mP ac?DntCJmLDt:TMIAXjBlEQ&%5c+RTl5l%<PbK8tbT#E?h:!dRehmk5tpLK*A+IT:6&QQ1T\?e&b8Tlu
1@KRcW LMI%?J5W<I^Gk+IiI+KID:>G8CRRFwEaj!kt61KjBc!PRSLu/jAE%y*^#=#Ic\4T1L!B6i>j8ab!1Rp*
m!&aMW PZlwAMV!c?1!NQnE*FKKEM\pB>CZmdPMXd&Tk+mqm/=?SWVTe1dRDjGASFl411ZBBC$pebRbbS%GTIIN
ea+VT& DkMBqi?JHue&XVq*EpnAp5$6amTeCTCeIdSCqt\ZBRQp$lD@WA=DtREJS:8Y=IRnJQFHw*$6=&A=\?+l
S?IlFc 5L>bE+?B+Liw++Py%Je@X$wCCTS*4@c+Wh/MAD4t*TM+Q1>PmaKHEIS!8NaSK>n^YLVnl$Tupp^u4ELu
Syklhm a=ZPH?yhT6yh5Zyhn+&/jyl%K%q%^>y%Q*d1@wH9WjLwmjZyiS#R<!QppXLEw>nwS+>9QQwS*/8W*B8d
@^H$eT *95+8@hHZy>TWX>5ch@ni*$@K91XcuyRGDdWPdSmqu&I=J=DB1q/Fw9uMlC#=?i&%IjB$DcYkVGN:N\q
%X&RZu HIPV=A=JAJV<AHHqXwW>!=$eKA/4?jmtCwaGS8VmeIXi\>B!L&/k+9Qp\:WjubhV+RcbmX4WuAIRelmw
>@!bBq :+M8y+:DT&>tjA4qVBVVhBpau\Cq8GSL&w4+ejPmZR!F<Ydeabi4?A4GtdWQ&#Lncnt&yH5^GC4>5pSZ
TP*<:y JN9k*eG>LNbFS%l<Qk^YCa!uaX>$BPQL%HjpcaCNEJRRqDlPu\A^\kFwMZQnCjyAa1%q^aWhcw?GMA<E
w$FaMd RTq^c*R:ei^DY=SE<bulBADSq1V99pD<1P98IlLayR#aaW:Pl^HLewn8wIR6!ulFb5AFheZDiR%%u$I&
QKB\H< 5QyZ+InSEkwAAYdR6Me#8<9C+58ECSR5R&S$8KjR\ZtYEnL?L?EMLS9A?J?5KAR>ukN8I\IAuDB#ikIJ
t1wiIq =>VA/y?XXAiDBI=BMcyZccDhW!1&D/a+P/wh&&yCD4*Qdb1ceN1h!Ti:Ce!:hI^DM/bE1e#lXtC<QIke
$wj>:e lRBII+tVw*5y\Qlq<P+Je9iRhSB:LSFLC:nJZy:ECj^J*4ZG6NNBE*XBlq8tX4?pB?IkGQ?4SBbK>S^5
XV&<mX &!X\mA^EYITyt=ICG%/BGAEXjBC@S8VkJG#=BBnj^aJLIl*/Ya1Q?+&K%RW%R*eQe9AhEKA@lZw8P*Ft
FHEDXE ?@CRchiXhl#F4&:dE&@QnNKmPwClDQR=&mabW4\B\Et!uh>k\AASBcBZH\i=ddKy$\B&c+e1MK!+LXLP
#hRuyY MnIm+#XkIRW^GDI+#c\+S/68!?bnTaGclcK+H8*EeNm%eqy85S\iRp6whDMdWSY#yL8!VQe6lRlIBlFd
bEA$lC D8A?mACkA!!!DPZAh9ZbWWkP%FRc5j*?uy@+wC5JpiIcb^I+MS!PwaHkAqq%WmkI@w^PEep$n1\aAJSw
Dl!tEp 4W<kid?#X+TblGAmpWP*MuJ/Ab%\uRRwGJnG+LqM8eQBEF<5PakEA*9yeRmIA\<uyl1I+d8DTm*>/e4K
SQ/P+* 8Wb*n+%*B$MSQ!MICGetVJKkm8R4KckZjFqRb/\+y5H8Q\nPNVDlQl$kClk94R+5AYP?5lLP\H5ACE=Y
phAEd= Q^X+jG\ymiAFWK8*/>yilbGDZTW/?%lmwRD89I&LPIAtE<q?^T1tF$6?1=K1k?#EY<nI!cCcZEyRZ^pY
aXpqR6 qZJIAPLSm<!TFZNlt#IeiZw%APn8^mZlFRPP4+\9Hmt\AduDX\TTjWF#\i&t:X4X+!T&=FMNhFGubT/T
DNqqX$ <ELXZ<PBGp4C@eB6VkdE:<?jV8je%&qaM:T<meDtByk6GjD$AA%&y^wbGH^#IL+\\54TIu46B9nB@ymG
9>:#H+ #*pPTy*DkZ>qVR:jZmaIHa!HBe4*$^a#%eVV=tI:PM#mH*ymAARQnFl^kQaLcw?qd5dZa8&5*wA4TRW\
dWyy*J NDJeXkmlJpA#qEWDRAw4e<Bc*aM@l:T4Mh84%:hut*lD?b%IhC?SmmYJC9abkI>yTMe5VZ%FKPBllmw1
AJ/F89 EiThi/#SbQcXGXJF\+lt&*>ST=6HBFV#y6W?SwPTAL8Sc9Sn^@I!h$u$bWHF/pl*wRLV45n1elI!dCAB
B#%R>L lJ9uJQCS>RJahyt@GmEGw<EW1YT:!:DKm1MkCpL6mbA!NiGAw\cRTNPjp%PX=$:LXeGJm^PeQCLR5R+#
9bRDch W\DkKMK\jc=Z:ppwW>wPm*MBJ#M9l&tn^AhJ<94/chZyC9QkHADjLy%E>lkty5MCNiWIbhQ:yG6QZhu:
ECYkbL TNP!@una8tqy5RS<G\@wwC?QJ%+Je$@R4kIw*bFaYBd?p8&aLZucQCl*LqjYXG%CGWPdYwe:!PaiFCV?
XuFcw^ +?aj>>M1QqFQu+%54F+jpF!DAjnBDDnqLJ\EnkND59a^=8=Ml@XRABtQn::4Cme#S1yEc+mMD\wt\LpK
a5:Vnd Qy+q&BaCbu=F/BDR:4ACPAwwlN\Bm6CtaaA@HREk\%w:bqe8IRTk8mV8BYI+?X!Q5AJcNaKP/6$WTHIn
>ERi6@ &\\%BCE>#iI=paWABM?\w$#KPADAq8Rtd<<<6^GkD!wi6LZ&TX>Nm+9m1pLN<:JWLRtAyMmB^4VqP\B:
m^u#hy &95R?+Y/aTIM+/NI6yQCB19VZbawPn4#N\iRqp#4IIDM*peM//\5cutnq%mB?+1llV#$qa6dVGY#k$jc
!C$ZQe \X1DLHewNC8FeLpJidulbMiAHc5ph/\5M#mq%cYuH+PjJ?>q&lDLwhh6\It^FZEyPyjy!JEB!L%<=juB
*T8i<$ H1aATD#95%5d@cmnaa+>:?NJjFH#mc1\!TA8u\H5>nkHRDI+%Xch/Sy@SR&9!jZQ8Jjt85lIYjF:&d+e
qKl+FP @&LnD$9CGViLi>ehTlw5iGIS^W$Ib!D9+lCGI4tSALAC?iL5R%KDJS$e&wwNwEW%WqDPuZBGt>:Y\#8<
CZ>%P% Aa8uPBBJRJiyyi%aW+:Jk%KVF+ERkki:<VCMpbBBhyiYnSJ9TJFIhnPSXH+InE8VwX$E\SM+@bAuI4TJ
@*>8S9 u^cy:\*=WGnA4tWNj6ZSRA1V+kCp6GbZBwpEGHk\+Il&eJ5bHAMD+dK+\dTIY9Yna*L<p\9NVqecnVSt
1j/Pyy /9nBZDIMXl1EeiekJAYMLj+YICuSbhp@AFDl!6\APCFRhdBm$qpqwG1*uaLAe=NmeHpDA=lp16wJqn!V
Z\8YMQ y$+n<wLhcG:DPKuMwYjMFF\DwhS=a:V/ynMkE9jkjKAIE\HH^FW^eAh565bnF\Yp*BY=DS8e=Fdjacdj
m8w@<G Y/T=4W=pXe?%A/6Qt=R5HbKN?:X^aC=pTABa!kpc8/#KaNy5%G?!=@XV4GkWFMy=Z\iLweu1#B49Kwy/
QQN5>R SqL!mkuHhm&nuWiF>P\y*V@8tpH1Z%WKtVua*iB>>I8lHBC>baclPCG/*h@Z%AGLaL\*6%tHwnVJpSHb
&q/e!6 !KukA%yyclQFY$!wu$mT^Tjw!b%wB1A!Z:wm&F/:nS8<9*GH9B$D$MB^J\<h*Ced^CJAG/>bBkG+GXMA
:\h>FK RJNdE\BA^CZl=<\MVCeb>&mEkVR$SbwwP1?bw+^+Rn+JiNEDWS$XT<nQMMEIiNK*HhYp+h\yy+J41c6+
i!aaYW ABA$XmwiPR6%BjmR9:$JJ+t/byPI=J$^yXBh?eRBBmY=Jk>1Ic\BALnGIDP<MM<8\=VNC8YPV<:q+C+p
4/hu<c =JBYDEhT:!##kd$h&NT%6ABD@h\AkI#MX^Hchn#Z:X*&Xqp!cR91ZDdyiFRG4S6bRCdkA^tG6yhC@W5&
F&t8lu :iI!&iq*cRBS!<&Y1%CXSQPAi@>pkpBSD#AILi%D<=mSDXtCMPu5=IMm9MpaY^%k4!RVCaaeRp9WWZh@
w&wGJ& &k??pM=E=61BFlWBIFNaV6+VT=L/jXmiM4BpGEM#5eFNS\T$b/Gye64TP+AJ9cyViLC1cSRe1P:VDpd:
DbA$V/ X%CkY<GEXTG!9DZp&PB8M1?Ai454lw#$$l$$CNABwRF\E8>:#QHBJypTp/DZycy\pmEKACBK%K!ZG+uD
8pCXt/ 5GZR*EJ1t6cV4Ze!FT!CAKt/DdD+\qD:?N>AAyq<NS+Y1M9qJDF!N!5jI*?6RQp\ZJ$+S1e=T=KA$XZP
4@A!*B H:+F%PS6B\^!&?tnMc^Cu&=ACG@!>iW%YLRIWHJVLHB!^&w/Ka+?=>Mm&eSNCAB+Cu6EBIl&%/hCE^*^
nKd/mc k4utPtAAn=1mhDeXJ+=5IwRXi6qdBWdLe\?:1aD^cjPEuYGR%+hyYa^IB#Y\lDFFN*IF>J\$E:YWSHaG
+ptDtE yi/i#ElE6yyN&L1TJB*Ipy!N$R&@5PbHkaNIqt1yRIHjAeCj<pt$8d#18h\e>n8kHGAcAm^jk*AnM$6R
e^bRyF u8mqMAYyDn<$TEFdp89kVlE+\?8E?ASbVe\SpuP9h*lI4ta5%+m</8F6X6yeYl$pyRRB4AGl4SapiL6e
:KJc/h P+nVV4:EtBGRTH&m?:ZWyEcHmi%ijtK\PKXbyCRR+E5hu/5M*JPZ!RF!ZEN6pGaQa5SIWJXNXdlaaIey
-AA\Iw 0002e864af7001202b3 Page 421 of binaries1.zip
@pE=/m CEVaJe*>ia6Ya=KyMFXJEFBNG$@%t%Pn:TQq@9D!5@BAbXKCC\P^%@!hcSuFYQA&+=Cnb@!4X#5\d!n:
/EwI/p n1pC%C^Wb&LDk\#CA<wiHKRDLp+!DwP%ie%PE1dS^$B6S?4PHZ>Y51M+:EGWD5\5u^F4K\BWPAXpTVhK
cyLuRZ n$S>FXy*e1MhHFiGtDdRXkd%S8>L\4SK#IFX*nFyd&?Tc1PqKcl@$5b@KwiQTdBC+*hmp4&6:RTw6#TG
D&9Y?u LXI@kXVFkEnh:D^6IBLMGX^FCuAnyEtVyNu%/AJAIe*NblEJq<wRkF1K1Z>B5D+WSapY5AKm&QI8w/Bw
YNZ^iE m%SW\EQYu^T/NFApuKV1C^Byi#hZEDkJI$^GZTQRJ65cK\tIb<w#pydeTE/LI5AR6B6l1eG$6Sc:RBaV
9P1?t9 PAHE*9awMhcC\lRK65%IM4%NRtCCpn>N&nCy55$BC%Cu=EKl6uEpAwXySPXlXDWBJ$BGBKheewA*aEt=
$:I%kM eWt/%?PSnkRpI^BHtSwMI?mTpcbFku@K*DGZTALe:mkH@PMQT*4iB!XS!eR+5djJ*9:?Pu8SkyV<HAm\
ljJ\Mw l84TMSF#RH1d<bj$=ZGc=EeekMec@>mhKFHk^Pq4BJ^#h*%G!cpqk+B5QDKI:JIQiN^EaR5F=jKpwBZX
aqankl Z6!ApnE*+P+VeJGFk:R>tQ9^AH8/?uAAkX=#&I\tTnRXYD+&iJ^$lE@FwetJm1qESK4j@QnqS8wSdhJS
Zt?Iq4 >EPCWdK@SZ1\cQ!PCumDt+*YpGBKVc1ZSaqTlP=>Bjam?pyCJp^B1Yhl>LwblBIXHe8IVEQ^!d!N=DQG
J*+8il ?GBa\1S6Iw+DYC?jh8tSpB6CPwpF:YmRBPNHqKKBTPG$HZjk=<b+yDJ\A$5QkJK&RbwHP\DVK^u!WIA*
u%y%1t V@Kq!tS%^4T$J8BIKlNFB>B%VWT:^=9m+ttakWiTW+ZFmMq<5l%Rpn>4JwwY%C9$n/MF6aW4qGRRJlpu
8GclWc 5/yt*H5IkJny$h:yRWpTnAubyV>JPj>MdtFTp+JB?LQJil:R/yNbqH@TpVE:AR4SXb>SLwdPQnAEV<+C
G:ikJ$ QJI*jCECInP4V^I88Wq64VYR5!p:EeuNZueYceH&9LPF1*P/:mTE$QmwG\u%aWABl9lBV!AbBlJqBTck
$<#^VZ \XLj54!l!d1aFFQVqCmJ%G1epiZB9PtF\eYd?jC*<$qH<+ZH<>Wu<%*9=phQ=%jj#^><tL@+8AA?Y$B<
MXBaP8 Y8A=Z=D?9KB%5YD=beH>/$L+6+Yp!+ZC:\9XX\6hQ^bGj!/5@qw+?L%\<YeSAqlpAC:!klbqTBc%\a6Y
9!wSVk pEWQ/GIE/YI!GZETcqyD5Xl>cNwNY*^P8jmKc4EFb9wF9kTlYi!tZiKqZqKBt<pkqy#w#AKa#I\a#LLy
qqXyw5 q8/^tNXuL#&lMn$mEQ:!&TYF9#FEVX:/Q\>Sp$j@//ha@tu41L#Ej&4DqQ9Zdbl!@:<&VFu$Z:Sl!p9?
L+6n>a %#bMCRpJGcu@h+4c@?+yc5#@@=!mJ5?5iSdGT6&+PIla!HnQc48pRH8RK\8S%DVnG$$5&bbh*M*%$p4t
%EMd5D VDSGyA^ylTlCTPw6lL9\VWEcQYJqN*m:Pb6%X<&4^mnYFBE6bn\4#&t<EZJ/Z#\qIKLhLl1/u!Dknij:
n8PAb/ *Vb/T+lj5i\!uDXiLt9FSq:$CmT^ha^&^1<ccBR@wF+#h$9+Qhc*lliJ/?qEREV=q!&>A\R5R%t6/PCQ
a=^wNy 6NX+4C^AbZiEV$*DqNMK?5NWyQaVC=H>Xilylb+51:h/<E>T68n%nPdP%H><&h8!4I\Rb8J:X1$F$#S:
SqG+ZA uCn%ZIi!MJJ:SR^^?&9SXu1MI9KP?wn8SQV4HAlVt9%LtEIEJEZi:n/iKF*G\G/mG=AnmK$Ba6d&%+**
u@5q1w !%=CmpS=JKl/!8JiinG@$%1VkYjlG45&j*nklR99uj:d:LRQTLXL!F*84qWXahHqKnmqCSdJ&:!tGKnN
qWNn>H \44t=9!ih/&mSYku8X?#8#$qIp^uaGFh?db?Np84&B1%JG8ipZ$i/tP>:L+uF/95$1n:i!<HI^cYbahF
PP%=^m ?:WIe?NjC>J#XZtn!?$V+1:t4bcP:?HKH5ydF4G@<91nYM8c64?4nB4+>LEZ&Kq4Xit?EpySj?btQnX%
#E9k#6 R<w^yAL#kpQ9piy/#@6*Z>?M/GXdiT&qKNAH?H!G/@y9jLNTTY4j&E!&>w<9+aJiDGe9F<Z#jhGw%IpL
8N6DL& wh%ZDlc/q!uB1^yRK6VyRSu@W#$mF&dGR!9>kXeQMpLI*ccw5Sm9$BP1#n*N#t\^%%HZE<BYXye9YXtm
E>JbJI beVKI\e:C&eyCiK4CMmwdPw%BI>uwFuqCG>cT*a?u*u>$yiiA%T!ueSh1ad*aV&FKe%LCe%/b^KGYH4*
LJRubN ?n5GX/Ha$1miP?:Ve&/$^kdyGp@AlaY48SHcAXjTwLSR8Dq=yiW:ulZBGp?&Qbcm6Eu@>aG>?hqhT8uR
DHwBGy !d!/Bp9Da49XSQ8WM4py1FCD!$\VyHHieQVM?=YHAF+ud<!<:iK?9>MFXW:6X^Zqw64t@T6%b=$d#%nT
b!NtFk Gq>P@kmq1n*YbNj5CKl&%NYnYGWiaRn6Jma^8H>tb1nw\4BY^iSH6Gk#5nRR1/8&H6m@K#<yD*M>LqVw
wkjkhS mT$Ikjj^Se=:^4&\PF6DtjAEu#l^QuYj>nD8<lDcMRNuR6>FBn*%=HI^GukP#XHk:11/VZ>+<e$&P*l@
\nnp>4 RPH4FRQ#WBIq5>tT+B8MRLp&SM\RAVyR4DGm9K1p5Qw<1*6hjK<@KqQZZc=*E8NHWnd4IJWR^9/w9+N:
*ZZTNa bkyL$^J51Q$%!BGjaW8bRNJj<QRidbE5KSWR\+J:#RZZ%:XLY%wZk^DDm%*jqLRJZSQe&WT/yKFqmpL$
#:D9&* t$eTAyymCyKFeP\6/=eFL?kt/9#uVywEL?88CV&5u+=iqC&tc%=h6qQKwFX9>X$iGct=&Ybm!4d\?aal
RThuG: :HF\dWnImc\XN@&4^Gp@jt>y?iBZZpcQ8?G!FbhQnyClRkbJ*ahq916a5TZSlKqkC5aFmXlM>j%Slt#^
5+t&\b nJYZ$\yW1=TyJTqqctYDY^hqK^tJ:+9iKV?/j*=Q/84tN=c/S^Q=8/>mZ$eGdpdc5#aiMRh5YV/WwSe#
cDq$En !Md!Jp=X##W*eI$K6YS6@14qu=+4Qe6/t$jmJ9mP%pTwCbF@#+@=RWY:b5QS:&w/VISBqCAn!>RZy^%I
:Gc8FH 9%+W$HCHq=hpK%R*QQAQFX8X:e1!Knl!&wc$ptplVeJcNMkc8X<JYN8#@H^99QMVI>?SctGFSXnq:u*j
GdZbIC jGT5>G5^n6DB<W15^Y&%hStp>AVE$IN*RVnjI4+l1Qn:ji$QiXQHN%\!L+5jwVwKV*qc+ldJ6qN?tqbq
aBl#WA b!R<EVdhcKkjA=1h5?eKq&IVbSW4LP<l<Pwd1&a/GyF4MaeJHWDQImeT?lebqSdVkI%H#aet&Sqe6q<q
Pp8>*R <4T$^jQl=1nqqCu:8=C<1ucYV1jNpmNY4<WRX9JcYA!nnn6a*h\^+:P%9%*>Za<K1w9I$MTV@FqP<+yd
kPXeDH *kbb=1*S:adjH/p:%+a<5HDe*PbP?=AHEa59qA%qnXE#<VLe+=>MyF%/dGQmi+M!&wh48hFTuiV\DiJ^
Q/?#V4 dMni5p:8AyZKl=h*W\y+N5&wK#+ISq!>nyZd+lR4GZn#5mA%@4GQ#FM/Jb+RKW=+w54u#Q5cPkQ%BAHh
W^X1:R X!NhquN$&@V#cl\mA!?=&8@k:uI?EZ!H@QV!bZFkuj^GE8^BqYMlqaWP#S9Pdu/T@LImiJ*GtPAda9P<
@NmhW$ #?V4^$@+u*8Q5@yI=1VX?:NaFTp#<G+4tZY?V@yeJLywn@nSc$6c?@q#V%%J6:98pZlD@a==Za+MtW*8
k\4YB1 4?h#H>JjLK&4FN^:q9@%Wi#MD$pLCN8tZhkdIQV?:i6WN:RF4^NNm&I5H:=@a8NcEbBLT!LMw9YK8Q?b
Jw/91? ZQR%^%=I>>Z*Z<JT&y4\H8:?H$Z>>j1&9&>V>enPE=/#+6aQ9:=8KCSLJeT<Wd%ATN</J1h?<cyl%@wP
>A1DNW !hc1$@uSB<%8+QGi!G66c!iqG/@!j:9Wj^PYhZ:YhQ%L!hMZJbPj>P@F5L@^Z\tN5iu?dQ>!K^VPMBLd
<jNu?c Z@<i?t/p@@VL*mN@b<SWw&%@p&tjTYT\YQtj&&eGhXB4ZMLal<Djd@hii1uKXlq?jX9>Bi5GwI+M>>FT
q=nm^D kF=>Hdp=W#$5=u1CAY$<JZyCma=RX>Nb9/?#>V*Qy8:jILFX@Jm^4=q9Sk!XHuVFmq:FX9tVCZ^N$I!V
Xt%#4t HR?ZuhkuFWC&pynZ9*YHt8c8+R/chbmk&mJiDZEH?@NeI&8w1p%eRqTIBkE//C@8#pw?dKqh/clhcYtu
$Ap*uD 5e#u/56JM\jlpbZT+wbnuPC=A=DF\TTRyRRK^$5eX>>^Jpi>BPQT+H5$w5N$K8A%I\tY&E4LWBVGPNiW
nGVa!E S=QS?aBLMqGejC/*n95i%HhAaiKyycinlbc!pqB^RCA*BG$69qQ@VKM/WDQ<EJ^nMb8t\?>8#aMh1cGc
?Hp<+R Ium@#@Q$%Pu%MR8Nh9jZ+ZI>GB&BRMtpiFb=*TRDJZAd+@8R+<9eE$5**^+6L##!a:X%ZyiTd9*BZ9uG
Jl:p@i *4Tp=k51ENb!iJ^*&QKY/!&G\&$y:B5KKwCq+V+Vd6bW:?^8a=!Pcc5l8pPDlI6:8Ftkwa!QbNQ5:Cq9
::n!iQ t#F@\n^Km<Q5+AZu&TRK5<EJ+SAb^IS!>cl*TAINj/1?E?c8QyAaNkVVcalt@aK=GZAV@Zu<lLuMycF:
k^#PNi F\Ji*BBIEVihH<^%MbV4IqR!tkeVBKHqCbY<\T6y\>iS#dp+!yN9\iX1!=PQF=BW=/9EC8e4R5>S^l$c
GmVwj% C<QS\9p>\thlA1G&M1=/ZB*?@NZ9lLR@<=?9CT>deb59Ci\b<ueWmTYC8M>qijKj\Ji%IpDj^BP/^bh>
C:X%PE $F\Ka589BWLn1e/FiDVb?M?j\e!XJEF>I56H@ApGpyWK@Dl%4qA*Kk5FhBlTSI1Wt^nKE#AlFkaT/BmF
lj?%4a 8nNSc#LI=K6Ruh?T=dKVw4eZYDGn:9TTyy5TL#Du:?RXT=mVQb9kp&LtPX8TyVEV/dVnVbHkBSE$#%?k
K9JtJP #+#FNWJFEy/JtV<XCW6ZdJ5RLmntNdkW!S&Zw4<nbVEtZ^AB@n^4XLC+5hK8DL1l$npqT@BVqYyW@h!u
+hKN<d y9HWCDRyd9EEVYPqN4#IT#emh!:D>Lqi6WBFiMiHh%mXq?TnVDk9e/ER45BD=aRSZSt9tWm9lPCZ6lSX
Pc\EN+ YjHS@N\n*1tu#YXFK1%lHQydNJ!XE!HE9*I5heEm9E<ukAlSp*^1>yqdb?TD5AY#45Wd<qFl?R/6lSX&
N8PyGT *TSleYpj9ew9<HSn%S&<pKTMHmKPP@GN:6t+!B=BQ8!ldK/J4PY+WGEyd?EWqkRQRV#V5d\4bWpZKl&t
&t&:R& K*Zd$P&nkwYQutYMLIJe*>#PbFXad@pNq:8K:PwZTTqpdBYdALtJ<dt$nGW1j@khqRM=wiRmCPmBEwSN
F<=tap 6caI=5Xk%4qly$p4G@yW\u#FuEFd/KJY8w6E%hLAM9^A8q5jYtRmpcc8LMVIZ>lyw@EFV5Fw>MWMM/\C
dA^>>/ T+lZDFQle4YRQtE!qQdWZQ+Gp*154/WCC#ZRCHP!:ZaYw9pI+>K^?iIdmFDZCDdX:pSK$Wh4SLSdnTwL
@Y+c?F Ye&K$G>L$a^A/MMeI^:BbF+KBN>VpHwn!1App*6Q+WKIB@$S/@1CjQmi16a4<+5*=MQQ/K^C8BDX&6*G
!liLkc A1Spck!ZyA!J/4JTpq@ByHR**BkF*TJ%ZF&#=dRe*M@:bFiwZbe@8hF%Ym&?%%@PRQjI<lh%RM@YnaJ*
LwS&A: STMDQCNhQC@?8H*%<h^L6YFM^qtuc@RE+TR%TXi9?Z!q>jy!!66V=GdNEj5<#\MS:*Z^&W>Y*Xi&V<S/
-AZ5M* 00098583458001202b3 Page 422 of binaries1.zip
y>@6^< #Q9M#L6d\biImK*M>Ayu<w+e<Z:?ZbR^p@&4WP!cundhuaD1jd5%8EpT^$&4hdEid/h\I<F#dy\N4aHM
H<BuIH F+>%b4uu:=\611lI9^p^:D6@I\*ywk?^FlL<<p#DNh1p8Ey/FTK>WlFW&elh8BXm^a^@a&Tt#/Sp%T9W
bKtXak I%aSb1X*J<CTjpnFG1JRqK>i>D%TyqQ68tCEDcHmiuIpZbAjW!#&?uXdnRY8d#hX9<:FSD:V>?R%b\^Z
#?+8mL j$Rc5Vlwb:wR\?VE?\Xw&FMX5e+ih*AehV%Id@*q>Y>*DTP?ljb5Rl?>6yX<TeZ$*QnSq/l\ReQ\*i5&
HPQllF u!\SC<b!iSwZBRdD6&K@t8lbLX&@9Cc$AcT&dnhdVw:ynp=peML#G8q5CEa!PCVSYHmYWNycYTZK4eT5
KEhHc% B4uKK>$1WFI%LE*1eWp<5$t=e>M+4Eu@WWR+uX61GL8HnbG1Sa9yN%H8k4+$PYcdqcDw/\clFulH&SjB
^I^!KY ?jytF?&*Iu>qMCyEjSQq6?CR@KatKCYM*WlTQS6eGNdSZd8G%knLSwwGXm4whPRJMZ#*K&uKL84D!#1p
mBLwVp umiuMyHmP:=LD/9pXFwc$i@!I6<=u6?KY4hAM>dAC/q^Z%M=%?9<I&?blA1JFF8+!\>^><u\ZV@X:lHp
896#1J :qyIY*5y>8/!6H5lBlCmjj:h:QqHZ%TIaIimh5@*9I%H@A^TcuKp:ldc%m?CC9jpiTTXW1Jw1WDj6WlT
awTWI8 A?R@q!KJaq%l\eFl?yKKLbbKPA8*HL8K/?6Yh!Y@*+%1J><wLi9hn/#=yymp\6q>TT4uW>c=:/FJ>w?C
6DVdn+ n?=^J8Z?!Q9>4Vn#t4H4Em+!SLdw8anhL%<EuMmqSw\iS8e8QZlBT1SQyMPFbVG5$HE=+G%j**#?WJuH
TiQl%K Ie?mVhY<Z46*^S:>S/=wKh*<tRH*J:4Rn*uh@c4u*hYhFX\^PpV#n^1TMnZIY:=tw4Kqn^+Rk?=@9<6n
/qJwm1 hbj+Nj1Bqc@:!Eq5y+\>@:5c*6eq*Cp<:m<c99h^&*yX>5BnJi$cQ@E*TVQZ&>e$>V/$5Xl=$QPHYJd5
l6&#AF %9>aw$mCP%8#@uqy11cqRLiQqeK+WM>D5:cFB+?eRmK9yQ8@$eZ<MDDZ6yBnj+n5c*9Ep&1?aqcyR:Ra
j?HSwq c8&Ct+$8<k<4lFu^8!#^1:?+4Xhbdd%baXlGbYjV<QCHhtiwS?#1w<+jiy1IHleq8Z8Ye%!5ek@DZ6Ny
1>b%c% 5/9V6$Q5%jSi8BqEpND=*M%D#Pu&@ZlW<Kj4bZc9jW$t?h%iph*i\5TT&GTJeHPB^:h6%q=ANHV1bNn6
waahpH \qt>&9uN:*SC4BRGwmu%e1&TAl9R1^d85T<:4F!5a+S%pM?=\6YiQq/S8FNu1CWu@?N:m6K+<FYA%dj5
@m!VT\ muCFmk+?CTp6ChPJ@GZ6\i<@W1:9K*$Lw*Q6<:Q@w:ybN!K4QlRLp4C#WZD>$6FZ$TeyE/uMu:#!PuR9
4RI*>D %LlaTatJ68bK^=4iB:jqLj^DMbTHum:mTYP*T*$ZV4##X>>tB9jin%8jjZ#&TM598aZQ/*n*jlnKRQk:
!plw+6 6ci9e\w=#M@cb$<#y+mCjlkZMKP4N<T:S/a:6I9D/5WH!PM:bCVy>MYdyGdDM%C8BqTPE\@K**h<&YwM
+w=tjH Z/#>Re>d@k9PD8^pY=t9X/?ub!/L8ytEILiZe8XZAZb&&N%j4yl@^YC5MjYaZYKB*t+qTuSqIIBHSZ&Y
nJ^$+G Pa:uCXMB&*6B1alXtt@#Q@*X>/cK:%Fc9jLTa9eV8BFw^E=j?W5Z!9bwncF9>aqN#y**c:>+F%:B%?Nt
^!ipDd =u?<Wd%l>PBiSQX%>upd#1BKM?/EH?!Zdd#$n/eG^qdi9y91@:^q#nw%$LB8hZ8YWun#M%DhTZPGmYuN
M=%AS8 cYLt:p&kdXBJ\w?TeE>iNnHnp1tNu!1XV^4cE5\\=VeCdn#Q&mb@=DR&*%lSeENQ<&=IDXQu#wZ/uwL/
bBX#l$ T\:B*V/=:j8ei/>T6e6y=X+>H^%RP6mG:JbLqHhTFj=R$!:WYVp+46Jwt1tp%Vwd%I^S&L%TP@#=+NYZ
8wDn+= /&>9^8?MHk@enN&L?#+RFd$d^@4+/+*ZDNej5KaPeNRe^%aNXy1>R!^WQPW*aL&6/Z#9=Q:at?l/:?>@
\%j!IX 6p6uiy%u*q&y<mJD>pJdP8Q5hl!p@Y/89JY=*9aq=MF9@m\H&5:iIQkDplPXZ%W&/6d*nm*K=l/#@>mK
TN=Lbn idD*=jddTQnD:YVdQH+*Kb96i@P@d:\/5Yc1$akiBp&%&69WT=McMiILl/h+!wR#a?\&YVl*uhR&pAbj
qGll>8 d?/@?nKX#@D<Pd6M%a15L5i96#JQXA>Wh8@X4V!+9dL=b*uni$Q*&J4X<=DN18@=M9eKH%m#$59T5X5=
LGq6W/ i*%9j%%e?eXap4@<8+Zb/&hZj*R+Z$aQ>HQLyh?>L9X/\$=9wcD>lb&kpiPEwaLKece*KRkk#WTFHRcY
>!iJRE LAcR5MK$wIQiAuQWTDK8EKt<?^!T#FTREjXSyB<dc%bF!5dpbKBa>mR9h=Tn4LFCpT/$e4j<KS5FM&!e
Th+XSu >kYa^+8uSI8d&?hwV%YK#el:&X=k$lFhueQJdViG<IG!aXJpwle*K!!ay%Nwytc^Ec\=!?=e^?!KEewQ
5lHL5i aCe49wkDD^!VdZP^4!lHuYHH+u5TmdS^1@m:BkiD#hJjE?&JV48jJ>>Ehn5?NPHVyC*!HbeeiuHi^j1K
SmQQam J<D6nmM$=8W4#!D<$uEITaDYld@$M:hYe*qyETinaa@k!:LX6cBtyFjaSR9XR4VK/>AwFZlA1qunR:!d
&h9t/j nVh/*GPK^5%dFmtd<Y*6DQP>\!A!cE%/I$bAcWBkyPaBM=^Q$==?<mi9@5#ZHCGnDZi&G5Fi#K>c>eV\
>wkk8> mmF!@WhRcMPJ<k@J%uheI<wmdttq1mbK1Gq?W\MZm8Hhpen:ctm*T!c%^Sp&%9yQLKh4&NdQJ>@G+n55
?hHMyd cAYEqF18Qeu=1eKeky<t#pLXG*&jD@k*F?<M+l9BX@Y?=8=*NJyaS<6uA1ZL+$tyEmubBeY4jp>Qhnnt
CiuPu^ nI*FD:5Z#h+&6BQT/+mL&Y$SQKqPFDLLWqM#Dj#=?+ku*TBA5<JW*4Y\4>ZSnc/FG1V%C$6dYA$^Q$P+
M9jdP5 kMb<YReQWG&?XYV<Mn^t@NytbVJ1DhJ$#d%tiueX>PWmHAY6Y!IY\\!%Q:+ZluMK#WTA&wK+#BB&NAk:
D8b<6e V/plkQhA<9S:am**%$w@*mu^X:WnK6u8=Vpd:>Hi:>V<\qSbWBj5^Qbu//D^qt$1te%+#MyJa6T4:Il*
ImJ96= ^kIC>DjmuM=Z=Y:^GTPG9>ud?MyZ/$pu99b=>akSlK#6Dja8HQ4p&q@@W9i<<w6pXE9B:cw$QtHJXTN8
#P!4eu >1#NhW<FT=t5<@YMY89VLtS#CI$QyjVqFV%G%W::&>&1F@Nm=%/QSP8Ii\y:FVY1h5@VJ1AIy!/Y=1m9
FihqeA JP1&=$<imEKbcpiVVm!wbuhP!A%WGANK\4??%FM1i6F9cRwcV#lmnhP@L<E/y6p:6ktm&*1?P?$*NIE+
1hhPHL wCq:8>9e?=Dd?:C^!ta^I<?pk8G/*M!:*An#4M@F9?PZu9<<dJw/HLlq=QabQTGu?>J^=l6JK4uSG/I4
@BElld 9b4?/QXM@+:^1nktdXX^i1pu1#dK4>#1dY>M^#V=59FebX@hQZq=I?1ye?dcm6>kpQmQaB9le:9P:i6*
tNiEh? H51uXD#W+BAI/H1ZlRWMRNePQ%$P@1qem\*/RudZW&PXnL+*q9yu6R#yl=<bI\cBdZC*K6INM=hMW#V%
PG6h*I >%@QTB%@GM$aiAZNW*cSTRHttk^WVT:4Xc!#Dl@+BHl+VdaQ$$uC>j^81B1Sp#*CCqqTD=Pt=6aenFk9
k^IpLQ n^q18mS@a8TW?bbJa:T1!Y<WWhi/dAF^VReqjnJ>?mV^=#!VV%yKHyc:%dP?$m!B$9:&e=L^!K68S$Mq
:QJ\CZ :FJ%#8QLKnd4^mQ4>ucj<di/^utJXE/t1AFyyG%@^W@HGEyF5LK%D1N/Pq88qmi&Pbynmk8eu6?lXcqn
hVYVWc T<qFDL@Juc>RhTj6I4Aw/+/+u!G!W68F!d/S&9mDM58+VJ$I*Y!mBHtp5pR$>DGq+JDH+84mnP&M5CjL
n<QIH> WWuH6A84ZTLDVCp+%S^YT?N8QD\b:c$*Y=>RZY>hRVtXy8/V61T&V>NXkBAp8F@MI8w$cVkHX8MdB*cM
@6^/yP *R@:4J19CS4XcJWXtadM^j/?b^H\jQbF8!yFhZ8T^WWN9e$up4i#:apLA&>N9K+BEWB>IV49R9aEGH^b
YyhZTc k@cGXQKdYui1K&@/Vc8LqILFBEuhPSZ&1w@b++neIAG*a\F>SM5N%XZ4GwF*h?^MAQ5ppw=X>$AQ/yQ+
$:XalF 5yWwFNhi#XR$hAKj/=Hk#ZD1Kl/iuLTp1Btb!bqM/+5%lTd:\VBjRVDt5$dE&uXlY+THXn%DLZ!ha9!4
JCCHAZ eIS$1=l16%H@^yaB&&HX:FS9ERXeu?tqjRp$IRMFSZn/Njqy4mp1T+*18hc^iwT?<e&cYQuw4t<G/kmR
i=*+XL cYSR8Jl+<cqNMP#Zjj9wZ#Kq!WYXpW=*T9!\:k%8/P=C5ih<NK+#?m9hZXM5pdIGu1QLy%5>l!\BJyTS
cJGGJV KZYCe/Rm<EGP48*<<1\dtw<wH4j#QbRS/>@9?&^?LP=?Vab54\6*J89L4$?YW1#eXy$FCbZ/:4@D&E#y
FVLdcK BJ=PKZu*qyhZmdV@9NFc@QEQRmuF@5&P6X>P!bYQtRhT<btiXubhuwHA?Ahe%jW5CTB^A:&YN>\#Z?!j
RH!uh% Fk1t8eaL8Al:5:E*/4>a8>jRa@pI5jeNYcu?SG45kKJLlSCW>WuTLI1+:iu/YXNKV\9uXNL!XqY^:dZ?
anQwta qqlN6+@d\jq4ZapRn9G8Pl=*uZ8=waEK$?Bnh4VlA&\HR@4wAk6+q$eCX>?WNja=+k>:<*:<Dpj+*KQV
+pbkww kW&abcBkZ%@aR#G=whQ9tb<99m$k91uRMhVb6t<q&w1E55:/L>*G4^1XZNqQ#c\4bc>pKRuB/E%e?6wS
aGlG1P h##L/mW!d4dQCqJ61&a@:/DTiq48l9Dj#4d5iGS#Mn=FH%G/pP$D*NnyZVe1LkeHYMYw+d?=bdnN&>\!
!\GQce nhTV>=K1PmnYDF8&I^8>iN$VuDJ>udqmhnKc8X9Tq%VR9Pb\NEE!9/V1!j^CX#?>dD#\+L9T>y!tTAY>
G\1/$l w@/*q6FZ@R^Eh/iqy%HM/Xd9?6cChc+>5#@<mnumnyFWcZa$je#@$1VuS:5VaZ?hS#:F8#BdtiFu6cZi
V:^iWP K%#Tc@Se+6y4G@mh1A/4MQjpc=*eL<n6n:S#FYP9t4=9V4^6XTubk#VNG+\>Mb$JFL&ICiQ+@Fc%K8Xa
iL:&B\ $Vhj4$i5n15hYZV*p+ZY$hpDRIFub4ueIp+n=PXaMe*+1D4hJ@GNWPD$p/=/bwdFT64THT&?+cQYny&/
=j<k1^ +q>4qSqNV^b>N89jkSCC>pc1>$HE/cPSMwt/BMhFMeZG<nh?*1pcPm@i1=TX^6&&ZX%=LDl%LWiI<:8N
Fd^Bdk =SjW\tnXt&dP6kh*P+\t#@teqG*!t4W:l^6dSQh4:l6\utm&=+NVZ:*YQ$ehQDj/pZMay18DE&+C4@WZ
$YdjS9 aiG6^!*e?c<>GNb>%dQDDT@Fj&iYjZT+nCB@L%RV%ZyP9/Ay<ud*IG*:Iyy>9K!KyX@51WKh@cGWy/Hp
:BpAFT 5:Kl4EdVDTWH!=Iy!WL!h$Ztk9\W6p1bP*ib:iRV^\dVMaN*J\hhA\bD/E1t?DA4tpW5kyk4kNLn%+X+
mZF?^l 5CmalIW<cEnD?!q=GeQ8K&Wa$$M<XEAyw:ALTeN!9!?J1XmcqR@9^AIwVXh@Np\9V/+l\<D/q9mVJ:@y
tFTn@l <VAi&CkpN=DFiZ8=5pjQ8GK1lq!VX5MiQ9\8ThtiLj65+MpAW+ekqE:+jHlXipS1S&Q=YNN<S<NSRVQ/
-Alu!l 000de1e130b001202b3 Page 423 of binaries1.zip
\=X<%& p?1YJQWTX/iq$EkI%<mwKPjb:j\\X\&:t:pN!h!X&<R?jqcqy=ZSF1\5>+bm#uK=$6SnAw9Alq1$tq4>
5h:=RV F<yZ@MY=9^=5yEntRRXnYnXuDiSC\:WXtLR6ZlSZt&n:t4TeYm9NeuLK*/9+QIj5PB@d#^1bAla*cw@P
M\8*4^ tnA&Ba*+QqBkchC5V/dBjimZbtyj51APFXcj>S*Qw6bK$5L/>YA4!5t=V\eQPA9mRpaQ&HJLkYXlb^14
$FjJt1 LPqelGFc$%!<Zy&/qWa/qQu^i?*CKF=HPlZ8%*u$:WlyTDpmypYEJ5<!Jw9?J@pyI#D^t$+b1Q?W?euh
9p6l=n %:hZPq4/5mb6q*V>p:FJ6/X@JwwaJtmV9C>+IbcNeH:<:tiSBPBlFtRRTcM$iQJ5FM#Q/1Q:8FM9h8<J
A!SdXe =&^Y8wu$FytI>=tC%E?><4KYEAN>\MI$kpFjpL/:\T<Hjablh1IEq>E1^#=>\jXR+I^ilPVc>=Qd\QPm
bPjwXC =V5IpmqFl=&G<A//K9YuY#%y\8Mc5e5GtN5#qk*6y!%5Q:cqSd1^I#9*:aJ8A^iiDE*4Xea<!hjyaNGb
1/8c8p +F:6&JykC%6HkWjL1^:Hn%Id6151b>\9mJ9T&hMy&^y>wLSc&X#HhqD!hIQ6tj8T1MZpuP9wE>BE&4VL
\M696E VNu1BPAi:*eKw=BinyH8Yd%S8aEhFbH8>KYTP@p/+$%qDSe9yquddwej%C58ym6h#y6ZWa/p$!L&888#
S=c8F1 qYb*by1m$dAZ\%YSC/^Idmu^ibFY:w59A5wm6WQl&KR98jGNilX%a%tZ#Xu4%HSap<*X!ub?%hP*CH%Y
YkY>1F @YbtGT=KW+X*>dyFC>^1V>qiDE<PDQ$mq=V+p#Y/!DJGahkC=*>C5SDLLcZ<jmkQLbqYPq9+ZItM6VB4
QtA@%& d8TpiMq@ZYy=6dmIt8%F6yHYVFQdwMG?e?M9DnM>4jmbl<ydEySnuHYu\+@*Skc%ibZpy^<t#a&TnSm*
KFbtD9 5V%l&Xa8d=HM8:*eIq1tLVJnH5+TILVe8/j5@*Jyib8QdcC1<k&VE<h!hApnuG8=VNZ\=R5K&K:b<a8Y
nNikT* plZWL%+5iq5qd9ViJ$cV\k/&k+K5CM&bi<JaP1M$ya9qQFqLJ#*DRu%aTH8bFdQatJHBeM#Ab\@!kiSq
PcS11G pi6Y#PXGwi9p@dN#^+MwXQN5pVc>^1Iq=\R%6=EJYGRknnlj<5=\<1QqLp@=G&eqbIwX#$?l>:yGl56/
*Q6#+J :aR%^^jnJSN<TeNY^<4/StC%KAmj85qT&@ncK%<N$@I:&kd1lc>6ENtYQ:py&EMKbY^#NqLZQdVEFVS5
:ywM++ QMI:I$J$j6qcD:/1pcF/D91/6qST/MHLjm?IGRKdNXe64y+#D*:IYD&iZ@$&W#6%4mm6&!l=<d&PjIP9
<GVAD+ SHm*$X\P#LEFA&R844EYJut#uylP+>ltiC?KKWK6GE!\adn#QLqpQn4!:5GA8Va>#/6!&<ddc%@K>JeH
H$\!pD ZyV=VLZeS+4\=eJ8&6+NH>/#NSENpA8u9?51#JpuMjHLi:NQeZ*!mI9YYiiu!P%C>aqq86IdD!he/ha?
HtT8u5 bh49Wt=?!tR1cF^@E1XhmuEw4HqbyXHW>h4BEe$M:4XiiV9lDuGa#c%85ZMWLJ4R@Q/!?61E6mGu>&Vc
KpL/l4 myiN\%8m$>Tp5Ihn&m@K9A<91$iN#\@ZqwknA89&:Wn/l89Y&it96DTe4GKeiPeX+Dh%caGNZAKeuFA=
pWk9ME R\@dW8KYPh5n*mniEKa:e\?=*5?W\V^aRDpM!4I5aI8m>>9PDEjPSyud!l1$!Y?=C5&GJD&*+@Kj@B^<
<bKS/I ^T1/mQDTnnbbtD9Pq#t9wp#MhjyKK@1tIYyk5mnmXdPMT$9u=BBWTu:Z?q^5PPD*6w#/CA!#@XP+%!QE
G&&IKE bS6WNp:!in@F=VhIXiX!?@%9n1Ij8uGC+l:=V9/5kmY>uL^!cT@j+GylR&&HN46=w#!4G!DGZd5$%8i:
Ga@bEa iHV&49d$SNJGh@%*HV5wZVYdw@eDGw$AQJkh9>?\c/SCjpC?nwndM$DjLyB*DVl&yBLkVh:bw8LlVXb%
4DuZ/P 1CIuj^Ql/lCZj4CLP#AT4Ta+&G+\Q^q$WJi*%@4PQ/!@d@uhDa9E:c6SZh%%bjpmNm>dB\wweEdWp<5:
qSZm%i nDZ\S^G:y+!bjBVXAycajA4kkiAZwc?yB5JjlH%??kX1F@bXhY^&M?<>thVddc5m9m*PWZl/ej%^NY<M
VcKKBZ w?9J=NlHJqSSbpYqS^l#b9Z6hVyNTp@Nq/1P=DYic%>6Mn*6dHancHb/1y@u<58RcHyc+NEdLW<!XB#F
nJ//Vw QRaT$=@5HdJ8%4$^jZG$BQ>Nbtj5K\%=\>Pa&eq?YR1CQFHS&dld#YJimiin5cW4$*<T$Sd%FD@ZqqG&
9BbF^8 >II4e/kAbSP9q?Md9:=*TcHj5jtyS#n&!h:#?=9&S:kuRd#j6&twp9NNp$y+5nE*jQBe>k%VQQE#w899
@#T$n* ^/$LAd\Y?jTFMjCqX?WRtl1Lm#W/&yIAjbH9<:hDj>YZPXG>%^aw*cb/#/Aew%GZj8Q=d/JS%HTH>Z%+
D6<c&l H1M\dYPtqcERZ^H*64kX:WZy>?AXt8uuR=G%i8mGWPTh1%MF*XM/+:c8y<$YC6G9GK\capT=&8:PKRV4
VEMBZu :jLW:dF^!K>Jk^m%!+\<R<t#q1=y1:T5iP<\@?1SMZ=T/qEK1?<ybT!m>TCSEH/:yY$+ap!#tha9L$%Q
MSipuj %TH&AP4n4*@&89Atbi$C%+jJ>?TqLItH&b=#LIj#q9cNLMuBYR%qey<G<k*6TnnZ*u:SjnHn>pShNKA>
jEc<Qn pk1<qcam$nPj\SZn^DcjqTY&j@j+BV=d?/A6TaNe%Ku9RW?&aJ@bLN%RM>#Qu$/5cbZtASqYGcuKZuLa
FRD*5d @%G\=/MKN<*T5!:jQ!%*wS>nqSn66L5CL=D8AVKHGW^tnb&1AVCBL>$1=cWhH$y&m$6?jm^=\^b5ECQ>
YCkyyN =d=FtJqVcdX$?pWX^Yt*1yPFqHENem?R1@I>h$iZ**A8!YKZV%P=mLhWEJqTw5Wu>a=J8=!RtBijk8nL
A$Wd\A QARp@#A$?Z#4uL::IwPS\!qh/QJ#!EpHJ!89=^Ja*IJim=w*!Myqhhnj?\@@KE6H1HNXH\PLyDE98>B4
u?N*%Q 51@X:ahI!VhMuW\TbPijGpn8lmtjwn>dua<<u11Vd*6Q?Bn<c\mcHi@>nW#$akM?wYB??X4?hhnPK<hR
nEI**> @65Im*k@yuDt>LF4t8S^yjH?Flh5jq8H+!b>6EB@Y&6nC^jiq+XdF5j<ilj94C@IFlatGV^@jTq&Jd9R
\uP$Ii MiJ:btt>4w@N1A99e!8W5@lmGJb#M9XFtC4<6iQ6hci5c%wTD:T*k4@p*>aN9?Q!?RPK@KXeSIDeX%pW
$$H%B! 6h*DL=De4?Y8j4j6$?y<\q@dl9Pl+FL5Z&?4S@/Kakc:S6R??@I5dI6cejQ?&$i@y8TM5p8bV>LY:TuX
?+j9+Y kl&:%#$b6c/@j^Z<jHCCQ>+/pQhT+F:YjT1$TZJRVZ?WRbHPIV8DX>T8miJ?$cQQF++FH&mGD:+4VDGF
6jVXpZ b:5:LyYFB#^!9Sdq!knVwR<@Y4n6QBwhhe4\1uM+::4H%9QZDFLZZaL8Pc&<&tb<@@%HG\9JZjLZSCjY
dB?t@+ &9RZ!e/j&4@X%h4^$EdJ@HGtQd?WCZNG#JG@?ut%EBLqWuwqW*e>Z=Bl@#y?d9j!i94XubbL6jK<+H5Q
h&:ypM j@*y?NQ4968EJN::PLa\n85#5>4?eYQ?Y=/S+<EDX&j&d:PbuAGQtdlj^La4F49b9<J@j4Z/\MFqKubW
a6yI\@ Hl@^T9p?+5G6tTh*Jw9\upGp+/Q<X66jGiJY:$ZXjQ8^y?kc^<ZEKZDX^9n=6iiNY:kubCpTD@IcZ:>$
<5c@:% SYX:j\!<WSeWLj1EY9*F4>jqh1im9<T*jnNtS5l=p6XuwHi!HCt?pK$GSpGXd5+!&ii@KW16nAbcWD8d
IlaHnQ @%k6C9jR^<QH4l5>t9nM/NkeR<=hh*uCZ*Vka%Q*cYKN<qI4\\9HSkaa^jlDE%IT%Th:A&XyaCueIeHn
k@Hpbp :CRJyeR&kWHCkXhC%kR/d*ASI<WGT^+BJyF=wtpwZW$4C4%uGHIt^ycbpV8iawuVKX!:dZ5PT8tG6du+
m/l&^l *L%wlRJ>ZnQt4F+jA\ZDIVPebW\SF*Q&PD*=^dtYcKYld%jMe#E>yj8VJ*SL&ab85M:uP>Xe%a#1ZMWG
/uamRF +1ETV!kiY:Dyc$E$@Sq@tLKpCi>L*F8Yy^DNkHqc=Na/KmDa+X\qWeT=B+\=p8N5Z\tBAuKH4c/J\hZ>
JyZ8*Y q4#18w>!LV$l4Du4&mPqca5iF49VVj5^Ye@!5I?64&<BTeu<MG#/%Y6K+yL6iYuBWc+jSQ5##S86Hpe#
WwEX:W 9!H#EYjL:q>Ci8T@n9me@WTF>w=^w5tu4b6W!^?&^N<hab=%WD&8:E5ic6wccWhbplZL=TaaI!W1miMJ
lbl1*k !TT&$<4JZMVXq*JpbH@%nLK<%Q@tML8@!K@:^=9@Qt:9j#HAV9K@V<@:#^Mc=cZ@q\Q5\8S6SQ!CuIMh
>8Gb\6 <S:PQmy<kWKiPK%Rc:!ln4PBdbA89&8Inl6utIK+AX?In1HL9/ZhiRaJ<A9/&/6kNC^p4W!pk8EWcH%5
+?uPQW 8LCa1dcPtE!ak+iYt1&S5ICdLqdLRpdbG!QD1a!XhBI!MJQZ<QW*6awIhySWq*N!DZEWC4E#=MMcTT4b
!Y1dtN GMIyiH!<=EZ@LjAMJ/Hnw85qy&nkI1@nLK^u1m%mn=eZhQHq=\*l54YS$8N$X@EX+*Zk+VZVCQAKplR$
R1hPRe hhdu$Ry#DIhVBImcCGmyPwk=/@H1&hmd!p9dK>mweh1HiRjKcM9ljiT%nVt=#ZYpuDR%<PF/jyLlZ9:?
J@ic>X Zn#/ZyIS^qat=lm$uk?eR6eB+/ep4T5ma@69kYjPPBphW^MqE&YewwGFDKe4h$CRu/NjSIlepKtRSLkC
8BSk/R n+tdaZCkp/e19#8YS<$Iw/np\\?uWDB\NiEX>:dAl\9b8?H6^jVD8FZNijB!PC#P\$BSRE6M^5@JVmCA
uATibl Y>mYF/<lcMC9I<Fy+/M6\tWq1mMtn4cZh+bVmFmy&Qq:Y=94&QpbBy11Y%qkLZXN*HBmAuLlIpEKjn:i
W^LE>= $4=TG51BpqaiKt4t<u=GLuyBtwdetuk?M^FXd6q\A$<+lWGk9a85ubGeq:8YPFcEt>hd^$:F^pyBTM%C
PD!+h? SXeadi^ybKQmIcW4n>h&M=N!<AtT>#D!FuE\5:FWhMFnLdk+ba#lFI4i9nkHS+\Gu/1F4X?+tKp?N5LR
mq+8cD YpcSS<@H\mPAG/81cmZm/enqw&B5\BPw1C!lIK?6+lRawKJ8ITD8:/<ty^wEy<CbButK1Rj1Pa6d/kq!
IlwA4K T9Mclwbd11pI+EQ\>wJ!1w+PuuI/m8KKBydB*F#&iJFk9J?8I$?Inchy1IC!ldNmmFIauEJAWE6cR%eD
$?$XRZ d&eu1e&y^/MY=8<t4GkmJmQ=d$F8+8JGMmKi4mLinn1Gj5G?Vk4i*4ciN9:cjBHY@1I/aZb8+ad1eAwH
J9cJdw @kB6E>ukMG$djl%nq&DyWFeVb^6JM%5^jlFSaW6DCV<=&SBXjt>bWZPdRHN6c\$SLk$@F$W8LW>FW*<n
5=:<LY N:\ADp:lLtRqytPQq*aP\uIKY8kdtl4cKSuIiY9/8:y#aY&>\y$hiAX\<t1lJmyG*qJ8:8lkL*&4eB&5
$><@aD p&Rw9:!Zmy><BJ#CJWnALNRZI&pq=m9nJKHwatHl4!D9KGtwLe\ycaq^pbj$W:PT$9RTpqWW=qc%FjeW
&yKjmZ DFdmN%iT+BQ#%JI\MuIN5aSV1G5w?eyalqmI1$9#TQL4iCwLwt*$\kZD\n#+@jV=:Qn>ZHV%R>R6jDX>
*lyJ/\ iI\<HGTC%hB@HYAuL@P@Mm>XF9%j=1ZKw9@89NV@%q:^u=5&@89M$@?aG@89A?#p=j+G?$<C:PVq@#W4
-A1Tp6 00062d08ed2001202b3 Page 424 of binaries1.zip
9hF=C> w@DZ5%dqFj+G?$?C%SVR@=1Xq944hSWp@ka4<W>a!Z@NT9&VIDpF1Z@NTp4>hYCjk9VjaQ>JeJ/C#L>t
e$iWip @&p*pMLjKT#b9^/I1!D*h!:\Z^iqk9#@Bjb9FJc$#F<G&Mtm@$blTeu>E@a@h$:>B@p@/=#/d/F%@>a=
AuNP^i JjqjP/j?jYQ+#\F&E9L@#\t\e@%@RIChmi8@Bhl%?VM?^YM&yB<YDHwn+N^X%5#RwXujy!$Y:<qaP\6G
LLp8Y1 bAhM>y5Vqce6KAK=iW$Xyjil8jd1^mn<+>PVFB@Fa=nR^aZG\=X&pTP8uNqMF!bI?@AuVhN\wh<>PmIb
\*VW\\ 4?&6b^FSV#9>C61G=n?/!c/pYKLjPeM5ZwL/W44R/#kIA8tD5qtd+^6#cA@9RMCdyZ<Qh+bT9tC#F1+@
e$m@9E pdZN6Gy*YH^uXGWQXZ>MKmly#uZFM5Ep<wuD+jVND/ZYKkiKNXEnm4eB&+>tuFetTDTbqWZ*I:4b+Nh@
YHIwk< P9D%bHhdKK9+58q!KXepDCtM:tJ/EYm=w?qy:k$b=HD*9t^ImWQu\J?dbpYX&&IRmS6\:5hMb\=a!h68
Y<%=:* L8=VCqY!p8Q4:D6>KdQd+qn+mIBV:1\y4=KSZFBdINJFZ:/lWFPQQ6HGw:QNHLqW<FJ/L15RNyRH%B8V
lt&/dh 9M<@Ji@Q@FlIh4%\>wZ4>QCCuLqimhVXQni*>uZFe+S+Bwicymk?K%nmNh*ii+c\XTWZRj!:G@uM4e%#
XwWm&D >@yc>luj5nnVL!DZN\QHFj4cRmJCdu$?Za>BLG:/KeR656+Qi@FhcuKCNj^$LdFN8Q!CK%?qn$iM:iC:
X+q<\: L8=iIKY+l@*?B@<9tahXwh!*41Rnm?1m8\L>I1C>ba94L*d>j\>EQH6cPGhZtiYTdjSHkPn@+LZ/Zc1h
yIIpBG /9=t>?AYiP^QCQ!G4\C8&S:li6%$/9%AcST$^?Ch%$*^Jd6uB?E@b:QAeYM6LIwy996M#c^/WHl!&jJ1
#AB%5Q Q9*XqBEY@$e6@?jq$9C!>6GT*:QD4!WJSKER5n^/Sp6H9/*n8%V#/Ku14p#+m!cR!ThXEibHy4A:dJS^
V=:+*! PjpkhWV^W/dnap#Vh^dNHXiH9iZHa9WunM%c*nkdbFCG\B6B/h\SnyG1d4R9DCuk*e8&j/wRcjS<Y:pa
iPw@CG @hBiZ$nZXJB*HK6/aXbhuJp6W%*/:Y5:@e>a?KedIe*F^>R55e6/6@P%Jw?&F=laF5R/!DZH4ESAqRcC
/m/PXF LtKC>#u=XE9#*WHcukQT%eE?eBn5KZc?TJDq:ZR5diYSR:/Sb4@X@h=Du+h\5u+ea$?B4CX+Tm4kypPl
N51uhq /&G=itXLRF4//FMcW+bZQNSS8X64T6<=D1!&HqLtEVbK$KhHbmPL?SSwlid9#wd<bSp18Rt^$+$\l=He
$#/@tR MP%=YlYF<J#e$y?N?Yc6<h4jPE=tt1PmkllXP/<ZW6Ay?$YijqJY>M1=&KpZmDS4iY%t?XtX56BQY9l4
?NEpqL Wh>1<MkhJ@EdH=RXW5=iG9tMFJS?!Cl:dPGmXW\@%@DSDE:Zijy%?%&A/JKEwnCVhQF^q:SD1@6/\tl8
\ANZCS Fdi=hMdbqbiwjGl:#XqaB1H!ZyW8P:w/QT@Kl!J*#E*Td^WyI+/yja#pq4M*=?pw<5L:KW@&8bIWlh&P
Iy&P^h AA$yS>FT$hcHF*X\*Jd/KlayMBj6&dVd9E!\kL1NS8A9QA$jTeubmy!m59FQ^$^/B\8HNN4n$9whbwwh
:!/+>S jNY%YcMCh*udN:$ynGI!a4@c:&!?uT+6qCL&pW9/&?1W+bbX?F\iAhCy&CR1lJSX1N:PWN*cWWXmhjHn
t>KAK1 Yt$#y#D=dNH&>kyjw\@m=muiHLmkkuue$/*H*+\D&imjyQ@piW^yiF<e$6Fm<pbKaJJJ$M#S/TdtaH%c
bkE!nH T94BB@y4$HB%9i$XS9ikq9G&=qY=ed/nHHGn?TiSZ*t6mK=N49+w$+WKy&yiyHeR*Ft5NiYCtjY8<Kh>
IFXupW =VDhQkih#hE=e?ZS9lqn\wF9<ehQbR5?tdRwW5^\u?Q!LDS1Q4N5Sh@VQEbJL<hdd4@c>:*lK$@<t>Wb
+GnVn& N:updCQj4Pk9R:6XlLP6%!iYXPb=\id48k>u/XJ$VF?M8/TRM4JdG$?d6>L6DjitqVy?!D!Mblw1hH/\
l>Jw<b hm?&<L%$j!1YTb6PIRIj$4J%:Q1Y$tbRZlhPKXmYGY4Q>i1$*WQG8by@G%:L&FMX&Qm:@nqnu9T>8d!4
VFkS\9 n4EJFcFbS1NpGdJq?1$4uBMnT%SP#hNR8cqbm*VtCj/CqphY+@cIE&p9:eQAHi*kq!=L#dG6wS!#%uym
ZyAiVW D#&#5q6:>VeW/cuDY4n6l:?K5Al+::E8D$5@!9:WV6<Sw=*8=/%l%NDDD*wqDtLX1IT$j=$q#=lI%F<y
AWH?#P wiVu&EpGit*6@VEhi&C^d%jmd1V@/aC8%cdE\Y15=B9hY5*!JTnHND?#%HP>lc=S:kQMJP%MnIi\YCRj
6RiFiZ $F6B>9MDyETblduLMqa1bIN+&\BnEG#9EEMnD*&V@F+!wCe/JtpAd86TZ$W/IZlaCHw9<bq!MFEnF1Xy
IYXk$Y BT$%$4CL^dT8Ye4J%D!:jy&j=!j>?^6KnN&Zamk@>4MB4il<jlm99L:j<@TYAZquLMi$$b8Hi$ud1t:n
5XZ>Wd y4QP#\w=I!y@BnYcYhnn*6VhP@/+ju$m<YLmMHtX<NX8JnwqF&=\!?<&^<K#YBQ<:6KCZ!=:#?GqjWNR
lqk*pc uii&!ACR>/QmWH?%h<#n:uulhW1ZJLjNDI*=&*FPml>=&Dy?dh?/lhmWAn6h9*j%\<lZ=eN+AWR^X+Dm
SmJl*G >yZS#b9BV6Heb/&Bmw8ZL!edZE@I*6D5CQwPt/^BAMV:jlj=k@bhJ^:A/eF<Vj9ZPkJL+@bNC*^j!FqY
X?KbLH A!?4*?FiB<6jpG8+9P6CB#Y@Ewdy=yLlF%RH>I:1dqhB=yV#/m@/bqh@m*B$Q@#>#BP5BI95>@uhH$#Y
K11k\Z V8Q:e@4!!d9/:H4p:Y!w!Xukl&CKH:!@yj^+IWIb4*%#j5<6685^Xnb\6H1F?wlw9V4K+cVPFh=L8#e+
FQAV/X LS1Ee1mmtA=ThV$m>u8Cc*M*#By4T&kCW+M@hP+E4pAQM#&>Hcq\bmpS\HqyA?$wq>!d*V/PJ^:%u&n&
M8+bYF dm%?$BWyNE8X*DGDcn@5Et5e5INEPXMa$WN?P!%?SGBXZ/Rb84#jY^h*%ha#Q@ukiWul1h&&y9$tn#d*
=/8:FK E+Pwd+\kAhc8mJ5lBe&lSAT*aN1lSJ=e5TyWh1B8tFGnQ!wL$*1Vc>BZj4dHa1KbqLdDmKRLT661idCq
T$REd! ZC&9:1/1M5hl#GX=d#AqZ>5V=wtIVnmRPTHwwW=ljK%VP4Qm!VC<X/ZJ&ZSRnRSL%W%LWAh*aywqL=d:
%6anbJ 4S*L91MXScM\4*YVV^V=^<$*EFmYQpnGjZcMhQFy!$bP@e>lhH@^:c@>m#\mePite<P<l/AuW@c=iXh=
AlTN\C VWhnqC*eJ#ijmcn##hkV!J4dnh:!C4\q#Z#/i9J**\#DNe14t=P#6+WJ8V8HCRpyak<QT/lQ5tc8e>NR
a!\8!L AuKk/VB:peaKiHM1tXb^M:V%I</MqMi*HdLc*:k1*9l$YJnR51nqtI$4wll?Mut$whY^$tHc6@D%N=p@
<cq>$W yel&T?mP/QqSV&=^eRbC4KP*H:hQI*BRNM@u/L&a/*ji4mj@E&*aN%1>a#LRN:iXYeBKL8+khuL+C4+8
LA@?6< #ihdtGa9pbet@Cq4HLYn4SXM#bNRQbPYh>katSQwVAuRA:*t=cX!>MnCJmQC6cGm?<nCw:l%KJiitI^C
&kH*ik !1Ebabib4+ltSpJ&I4@Sw$E^ydk>!E+y^jNGIy11y4LjM@I/H\ACicnkD>dX<5acWSHu+4=BYM\Ki4&<
6&ZBbM n4+J%/q%h6SACh1X/:J<quE\X#l1c>>RKJq4%XwIV?XSd$1GE6X>?mXNP8X#:9LdQd?/u:D^eLTwX1DZ
A@&+R? nIa?a?KuT9iAN4Y<4ICEcVIBNyeXB@Yyuq9nbhDl:hE=\@5ndTXy8niNL8\VZcncZeMI:#SSG@BpcJKq
MWWY=E Xq<uJt/XYYW$h/?%*IW/Zq>cKEHZmTJDVKi\5nVW@<c1$FNJ::j66j=iAE/!RiWJMyS^quGGidQP%k&N
S4R^EC ^h#BA?t*Gc5iGic6=CnQTjtH\XqW!FQc6ZGWI:qP>T%\LV1+dI#1ICeIJ91S/<8dWX:l?m@uIDFZ\6ld
YCw9u\ cPP+jt#P$!aN:B*CIqZdP&cNbjn1bN/dXTly5cP*4&&ZL8#N+Z%QkVhbSTain/$c#E*+9JNcnLPJY*Ay
9mybDp LnHZdc1c6nq#^dmcDY84E4*CKEheBeDpD=DunFVp+H/E4\u6DYQh\c:uPGh8$Lu45p9GX^$G//I9WVWI
:W/a:c B88ESX8b*6VWTihCSPdlanV9m1C@u%V6NSiAKbXMu6MyBDNeQ!:bmQcXw/&=:WmcH>@Gdy*mnW&W*QQT
#4HYyS S@i\:W?4<AXp+d>M/VTXJjIp8FcB#XLEhGD>^#Y5:paQFCE<kiGuDbcVnq=5@hIuh$+uDHqVLnSq<I&&
FkaK4B =^FQI<kQ<J<\d:uYEeu%mckhKtm>PKtBy:8j#=y?!qed>&LH\je*ZbJl&ny%tJHFP+tkY4l>CiT:&9P4
?XHLdj Gtphq=/uV?h1F?qHuGTa\WWH$=H%j@bN@Ku5^Pj6?<h</CBZ9$utIjSpJ15i6pec/Mlq+/M%&>XT+CJQ
6VZ=*w WkNlZ^9y%m%DW=A!5W:VdaJPNRPaMJ/K\<PkyAJ^<+=i&adb*w+Q*Vc?<S?bbabjbFidcF%1H\VHlTZk
niRHFB 9*TGFc?ccH$#95PHY^j!k/4=biGM$#LmCJ?h8Lb9J6W:%DMi!Q^\eHN\k95Y9XNV1ZiT>/SX@S\+MdEW
mBEdcy jMj@%kj?c$$CywBZ5VK#yY<8eG5$Lp\4eX>8P9i\S@QFXH?R+X9E+R9881Vp9<%c9$uY>m!q*V5k!?WS
F\bD/m 4*@S$:DGI#*EeNGFu+YSkE8#aRbVShC*Xyi%*8?GE*yHwaqI\DFqAy#@1PPd5$>N+&Y%R%J!M?^S#wPM
8m?*+b wmRS1yVW=<w6XNLH1nWtdaqn9/5p?P##AVhwmm#MGJSSY+VJGkj#D=:JKa<Bu=&1ZaJkcPNQnt4!LuGJ
eL^Dta +1/pyTp=h8uTw1t<J?Q9YnJIC<BnjDp>bNDn1J<6441Y4Nat18F!91PJMtdc>YJ%:4p4nIEiKiHXV9Rd
$&*Ft5 Y&I#cl:Ip\a9+@CTbbtP6mk*jTqhh@65\i^5X:GHP/:Wl+:SbHq#aD%!RaeQkN:u=@m#l68MLRwG=XKu
Q#N6&C P^%><yqW:$YF=1PP8^!=\eQED&F>HQ&Jey/<5j@a+J41Y:STteP<W5^!:<8<hZicP4^hHXImem9?8>Y6
NG&JPA /l?Bpa#bFmW6KTRCd/:5*k%HX9?=T+H<VM$6DT&>$&R+q\l&<hKLRASHX@<P+/<N%d=!KX*E9im^:QIw
F4b9NR FL1@^TQt>4ZiVbCqK?F%GVXGl?^GW6?1d1wm&t@jJH<kh5W4KtE>Pt^+hETY>N&XGcFP:HPbYi/:kLRl
t$B6e5 X<^M=V:c>>QNWhLVG8I:=:F9mRYVPVPG&?nD85@VLqZGi%=dZnE5/#P@E4Q/?^6MqFMmjdw@l6y>VDbW
YZjtqD %^Wi%@n&Z5$wB6ajY^uMpX%9ZD&9Wp8ecjnkGR%%6YM5GcnmKuQ9pMLN?4tZ+5waQS:P*JacWGLkCZ\4
bNd5*= K?$BHZHD%ncCF!N%/>ckt<QYL!uXLWXS^!J8YLBL5NidG%H!uwt*T/<:bwjKp<y?W1c:mt86Ljyteq*P
9TdhDV J^LCn/h<phc1E9wNq>n>\#>IyX*u>&QKF$HbAu@i#ASPLIHZ9uy5&Q==\!ijaX9+\!d5JemWR1#pDqYD
a6Nm$i A>j#Rl$GI=Q&KFGVblhW<9tSYcjSF?&5PS=^$nMhue4mD*H?mc*9Z8d8V4:PP8cb<bP$9j*R@pR1mpI&
-A/%\j 0000de082e8001202b3 Page 425 of binaries1.zip
iHH^+4 hPG*bNtYiE/#ZhX5t$=H++iB+C@c/8BnhaQCt>Kw9Eq@YPF6#+:=p9Q9X5#m84b$d/Z8Yq9!/<<:H$@!
c@\nXB ^I9+t8\5lLR1iqbd/Z%$qV=9K@^J&mMVV/&kiFnw$VTyajLnuS/V/$HZpC:VbD&bXk4mWY9%/Pd^+n&6
GGp1/P w#>Kq=LkpHGMGjT665GAa49QQa*tn=$K/4yFB#I:L#RGRt/Lih/bJNF/XG9u>Y9+\nZy4D+N@GX\q4ym
YwT:Wb ?ad6yJZYYK<u<h%WXAu?W>#^8Mywq*m%>=^Y&NCMAk!*tuCVVh<<YnH=m=h68G5><<iI488hHmV1!/D!
W^9RQ% q!<5YdiE^<m#V5Yn9T!@?d!JpBHu$R=*k18d!b^%QHSe#:%SXQJ?mYD:^Se@9LEZ%e%!TjSd/i+\#T6c
X<IWA^ QtmD9tJTw\/W<tqN>hlSTjiMMkeM9lJi%cqd85ik4=@R/8R6Nuqqk>tPND:j!IdcPDquQCS>\M/*<mV6
Q9im5h S\VZ^a^R\Yn\*Xe/<bKLL=+p#I$NZueKmiK:jQT!?W/bc<T*pIFmuqEcT+uKW&>6&A<H@R49Wi$5RN@d
cCV&q4 VJ\h%^@R^wD*TyQZ/<*GL\Dta8$5!e+*+YK@Nwd!PLZi5l5KMa+I//LhWKLm=%@8HY:#9/wtpSP=pNm%
?Ctij> ?Qn/@FVMd$Vn&HE4+WjbB$HKed?YS:J&V>Y*c@n!y5yNi6@d9@@8NpD?81j9ahJ^kJLu+R@qqPw@@m@j
@pJk#u $#AbBMT!M%/*Qj\luZlZ=qGWQGHhM?&FVaiRdPuuV*9SH@/wWk*P1C4ReMT664SI8Gb:K+m^&e1SlKNR
kp\/p% j?F+@L6%<Z?QML%@D<V:Q???TQ=Z>$Z!d:59pu@q95mm@+9C@6@T?9=H>$Zl4$Xn&d@B!9+VX8=95BJ!
h4^\bb j<*K@&9&*^V<9&RX@kd:V>cXRQ>4XqyT=1>bmd@Bw9<JK@t9Ycq@61:W9&aq@#1NWFbC?t?\e9?E@S6%
bQBkn+ JTu#V>m@WXj@#QZ=6=4=q:Ae?1>hEIt@WXm!p4J@#j/N\yL?c^6VX9L9FJdWZ/<4?b?et@>G@p?et@<?
>VbV6! =?:juB5y/j@1*En?lZMnLaH?j$ji@Y<iiceS6=1CJ:km!ETS\Rn+QEIbRT+laM?5=XbX!Dn1FnY=P8yY
dj^1^y Q$EFITG85Mm%Y!yS=&S@9p:hP?S4jnwP%L#L$Lh4WL$4K@4b<N%aCJ5LdbbaWmMCV8W*jl=9WQaPIB1j
ADeLZn =y5Q>d9kqnKm$cVIlZdKi$E#etQK/#HNBS6JG4uu9&BA\<5MSB?<!q<S^tukL&Ec*&a1c=4>lP!q/jLP
Q?^Gwj Cq%V9Fb>+?IFn/wCXXhVujm#B6<QQh#yCAwcK<=KKG9V<cR@<?^8wR1yaLiD\E!KVASkIXP!\FY^Y=nM
NcQB!* XEp/QIL88hpF6^H:=J!$q=T5eau:SneD#*C@%ZNFY1qW#q:j+paNa411=G=Cm$5!maQyuTqnFaFQ!pWm
8Q$=@^ p=t<%%pkwX6uTeJTW9:9RRnIuFE4kqJMKhbX4#DemS<K^DId>1SjlMWa$nQ$#:YpI$Nb/8V&Ycq6N8lX
ZTjCWH =YZwqJNaHuhE5Mp/!LW<5uBL$+lmtd@PLZj#qhS9w\RblWFV9tVP1qn*KYCY&9Y/VcpIHR@cJ:F/59M\
*u>mN5 NjciyaH56C#y^ICH#wywP&KQYGA&y>tG/\*?dT44P6Nn1uJ4qn$F:PKHW^ceV%YkbhmNAN*unXhN8qMj
%<Hh^Y Ti<h+BQ@SN4B8?pa8^M>KlK#!tN6n@6aeEGhn^%HDKYhL5Khu&8iQ&hjQQ1c+^Bq#8KeK\b%!puWeh4E
eCZ99^ uL>TRIwh4qHEG:EyZ<\>:Va<Z+*cWD/>5e&#Qq1cp4eqQdjeqK4pBE%Mt#VGjI#Y81in+!b69+>h$?4N
=Sd+Am <tLaW!&c+I$XqX*6*Q6q$^JAEY>D@$BV5Vl4%XZmb8HaWAc*QYC55j4RD4A=uiR>qD#Llb+?%&@!CH^j
u8G1bW #!1\4>XS4KHnp=RC+Gb14T$VdwAc?!MESqZ#y#+j?<C*bAi4nF<6Chjb6mt$5i1CjIaMcCPyy1JWc:t?
=nWVT/ Lp6ip%6<>aj#&:!XtY?Tqqje$*8hmJ@/VdS?6P4>kn^bA!@9$md!nW*ebS^C9Fc!\DZ=TDB=?5dwtTXa
6Fj4y1 8Xe@IYy8/\\%KEtM@qI5YiG+4><aK%u4=NiGpKT*M/AKPdkTk^:q&CEj@$wTyn&1j$Hue/B5un^biM^Y
V4R>PN P<@M!GME\^edkBJ>tEFT$ln?*u!lA/+t1=n&HI4b?$%SJ$pMT??>&4@HX^bq?PQ>LALj1\yy%AiBWP>t
LnYGBI yBeq14ZqeS?4L@RlNPwXey/=dK^VDWG+m6$uKZqm>yL&4uPH$LLIIRykb%!yGTQi5Glu1#J4KPF5q&Fw
t^RKL$ JP9QE8^>RQaX>dPyA9nL+\/a&R%6a&?SXF1&=>L9?$QE!Y1bK?>iKZutZa+I^1Z6dpm/kVt9ik9FFubt
^CpH=l S/I#%HW\$6m5PXiqGELZT:aX%\<bVhn4D*<8aeJ!$q/dZ:5nnENZY65b81V*%DSbEd8/e$?1>=IThM#w
CeqLBd RMY&&+&K8d14R*4#I=b?4KEdiM5RQW&idIYM^t5F@BGe4P/Y9uWI5EFKVhy1apaFM88VDHc5n>$?yncj
qItB9l \c=PJ46adh?Ib1+6\5I::tQLhZE#\beTlkm4Y=^:>w>J?mw>nL6@qSZpWZy:!NTdmK\JFGidF*YK%J&J
hDeC>A <uMyMVQpeK&E#NnjpiuJ5jIXMk#99Hmnhbp1R^jYcu=du/<e1iLL#pwc^yADN%ue@JB=*HPh&F%5Y?Yc
lN>IAI 5*t91^4h@+aNaAGw9qjkp<4y!nLXBX6>Z>?K*qb9KP/&#P=8$cWWP=JSjBy<I1VVV!VK%p?!?\tWWLSq
nJKVQE jI4wQN5P>4X46m&T:JlNenGcX:4tjT=+IeGA@6F/+#R/A@&TJXZdn1?V>lqWaGMWcq6aJ9QH1V6*VeI/
MY1pT6 P%VaZTGXRu=Vkmuj^Z^wc*Cup48*P5\%Y=c1Y&n#jA>l*hJtLY<tiwjK8i#DX8bJ#qCSA9e>/E?&5@N<
=*FGkF *i>WNYyjZkPM<EM6G:RPE9T%w!EyY4JTA!?6t^c:!@e9d1+^KI9NeN1YS+?cj<BVH=dW&A\>6ba@HPi#
pBRL%N QFSZ!FeNHDJ#WiL<\uuLl&8mqQLJ\^E=<:!#em51#uWXBbH+&:V&da5GA996VL!$u@*Fqk=juh/qicXQ
VVK5Ip ETM\##^hnG:?wkl5Jq<wQYFXjE<Cq1GKkbZlZ1c<pc88bMHMS?R$HYq&qyR!P^cu*HB*1>j$&tE>dPm^
*F4cVD !*^X\<X&Q/@6Sc?#n@XM6pY^FINH15!jXQTSL:\:q*><<$D/jXNMEKT6+t/C?!dlEBqE>?uYy?^TBl:4
V$n9TF bH8@NJjF4Mihb\plFe#6bAJdnW9XhuZh$6BRpehWk#=HwRkQ9%Tt$M9&tk?k&:%!<y+?ib:/amqlC5&9
BG#y\B M4mtEy=Z&JVeCE!Vd$>V:4JP9iVX1du/Xe1pwPWAdM?BAk//Ry+9::*+JRC6:ilYu*TIjc8\GVXRI1h\
!MAj68 YDChw%WTFiFAP4?1YmZGV:@d&wT!mTmu+IK+*6CZq%QhcFBlN\&M?na&tLDn1e@G/TJliP8G<A\%XmF\
kc>lK^ >kYLVdG%/HTP8TQR@$9e:P:AQdZI9Y5yK?KA?kH/tHMw/Mum44/>bk#:1$GFe86KQnePwWj!@W>++@!j
=aeiiN 6RapiN:B+bNi=9HLuC&HD>*QqVB5P!/d/F^AQt9Za*4*eMSZB&DW&Y*BL\jRy\1$9n+Ti>H</hb4T/td
k5GZP1 L@\9ZLhypctGuXp6j5i>HD8Ci=R996*#h%VK!h4&lFMVPy+MjJ+Hdn\5bNtNLZ9*Qbj$eWZ8Pq*bkL:*
PjKbhP NI/NFXH9/>WnuQ/d\FNbblD%y/1HeQ6481c4QT++E!4Tdp4VB>I1tQSj^yyD*:Kb?+uJ9\<Q>6d!Z8Vy
@lV+PY @ZlSK11:nN$TV!$&uAYCTTXIIH!!E@NncMVHNw=FW@CW1XDKLQklSNY5YR>$qA\=?R:M+TjS*6Mh#@I%
yR?i!$ 6VSD?&y4=yFQ/yEu^bQPtC9R/JAc#Y4:KWAdJKEuj<CWmB!?&&DwXpJdF\EGjyq6@mtdMJ6/l9M=9?h=
nAMbwy +V$:*>#RD^M#jFD9YqGdu/bZtMYZlb%$4Pe:4D?:?1JZtc#dETGEjjDYtJnSq6F\*m4RtNtE<\$\>W6Z
@Ddt5= QZ!IeSlb=p+iXY?N$/mT*HAQXeA8j?aJHhin/uQQQ&/*k6XWa^jcBkZ#L?jF$F#E\9tV:?&tNRD9Z4*C
95$u^e 1?NeK5<T1L9>D@:mY9nVW4Du4+RL/PViB*:al>8G8KCBMW?PCdC:qqqbD!!E<WQHb#:dubVi1>#kn14i
jcB:cD u<Ka6Ct&maC!>qbuYjEQ<qu8L@PaIR8BZ@P!PXw&+*GdW#9BB*1=$\dqR\&=5CA8P:M=nwCwBZH:DNwB
=uI?MY 9jG5ajieu=MqnRduC*+5MTtm%Hw@YAPj5hc%R$NG&GFaQcn6hmb$%mQ1C@Vt>idk>FSHLY>V/ad/DwQb
JDByZp =NH1F#X5Cj<+@w++9jqBGVB&w!NRRVKb:cBei6T=$TVeVN!HYY!Kyyp8Dj=hkCT@RMDTL4p=qWI%<X&8
K%R*m! S#I/KNP?>a\h+5uqb/K59*!@aNqS4ZwCAh:+W:$1j9:BmNhYHaW^+uy1:McaM*wtWu&l+Z*=8q1TIluV
6^V^^$ q=GXAjCYTdQQ*#j%TLY@dFi?QNc%$nM8dDA*i6j&Re@SiMy%R@!p8QWbBTlTTiD?1$#XF$ul!aPuMuVl
u?4%>a W:Xeb/IcMD>X?KheldH1=uTYdt1/k1Z:Y<K8>#<mM@bhQ@t6:iStNQnKWLyiiW@$yH@+@Tmk>iNu!!16
8+=i>9 dInFQXnVlmIyt\W5/6cy<d=lIdEN<@F6<L!+kJJu?Sqc/H\l<LQ9TVSlSPtedI\uC#wTwG!^M@b8:&pI
8q>Q91 \Tu#k&a!NjN6+tku!u5&XW*M@9jlaV1jTK6k:T?J*#Lt^DjEdjn^+kR+R<6hR@hVp8^kdn*l6YLVqhu$
:p<\B\ #WNDnkt/yC>JPW%uL:tN4nNL:4L==Q4XJukWYk//FdCQ%RpIXn<WwXjQC=!AX%FNqK4:c>$n4=Yd=XGa
!Aqt%@ m>D&#aRji#yqIJJ#9qMh#%A*$u*MR>>6P#tqWjdN@jt\^qPJPJ*tnm$n9$4$Xp+=ZNW:C4!VN6kCd$5e
pkX!Xu &^pP1L=dZ*KkY^989p@QL^>R:$kF@WluPi/DtIc%ZhY>@YMct8FM<<QkPc1W@L\$X:hytjFn!mBXVY&?
^K<G!a qayT9dwB=A?jqmTXi:ZbMqR#tc%hMt+L++&jRdS*BEj/SZXt!5kj!R+86\9K^A*^/!D>9+ti>\t&9BVN
k<wubP Zk$:pI<#BFItG6chXG8FLpBuVGRKElY+dklP8L/b!jeaDaWjPVme=?4S**G$KyLVJ15bc*D<<qCEV%m*
N/n8Ft !FS#wS#u=5W%yR\@6@!^>Id=XM@F$qZY$Dy6u^/<1BFYSLk8uRGBRF$LH:maHW^q<lGCGF\MP%%u+=LA
*V9R8< Jb*yL!ZZlD4<dZRRlGG@64#QLA$yw94R:^4nq#NT$T//56K46:kn/Z=y>5kKTKGt*4mF%/nZG^mLRp9B
k<QLHa B5:N$%:9+/nJe\&MKCqVp*pCbN<HeJPe*Y#\=Hqi6@iwBbV&1eGdh!ibIT5ZF/mFT#q1%Lll/6+?^15j
$\l@4j jqY1GS^LPIFu!+u=+La@^hk5qDw9te+WE8DN&dmey#>tQVnQcWakbY>CZkW9h<pX**L*hj+/<hQSB1CA
h\9/!L WEHPelSCam=+FkI@Fqe8td+Se$^@w#Ww+%lK&5tBmQAh+&R!\@B+iQJ@WDTyie=Alpy=&#MDJtcMh#^5
DiFm6J hp^:S%!WSDbuMDb4%uEWDd<=V>MV&p5>lLu!<iZXLi=FN4/cahibN\q?6>kJ1uBLVA5/>FC1atiyhQ!k
-AF<D\ 000d8618664001202b3 Page 426 of binaries1.zip
l%dY@j R<$1hw8BNPMh9D+Cm!VY%h+4BmqR>Xi+&h*R=wD#E<*u@GX48TJ:uybb&5ctbm!@=S9q#1WYT:1i+^pu
DE+6>I 6/Mpqy5W@Fn%>NIuV!CtYV6W4K6lWlj44@wMcyi+\byIcu4eHV::+b4e6<wI\EdKmCGy\h:&eHVauXti
V#V/EG dA5G5pkwMc*9>IMPL5T$19BQB+JHH>T*+/@*IWZLK?bQM\eyMyP=9qE&RW99VZeKYEnpRM#qpaj#9q4K
#yB!TT kZb/q@G!ZQm>qFw1\?WB!Xhk5/Ga!+Yw!LJYk^T:AyaIuiy=&%4iDhjZ<q/y*bc+1EA6kV&#\aiy6kp*
1euwtI IekeCYCGeLukwX&/1Gd1X?NuWjj:hu\!5P:Ki#S@4d%K@6>Ii=Z<Z>NiyiV@m@d/H<j%N:VZ@^Bb@4N$
Ybq1Zq <%<%M5u@IneyTQ!%:CQ:N%m=j<LK@Y6Y=y?6K@<*YJq@\m4<Djc9u=1ZqWL@j>n::/mt%9bhFA/ElFAT
9*B+A^ im<t>F/TED1EHu49LjVi1+wci1@TRcW*AipkK6JBBKTDCEwZAbGmmQ&5>>j&*8?:%qtP9d<>9n*PPaP@
6G@kS> A4ut<#B#*VN#Z6hh@l+4mjq#YR<q?jja9>RVWenj&QSjLa#/i?^jcbEw>D@yi5m@%@YR@=&8l$H?1//H
YehHjF ?8<I>^@M@<@mNHHVMPjRj@9N9^Y/\eWNuQ#?:aYpJF#e$55%%BPPqJGCm?Qe9D\<R?FIYiR@8P$XGtLp
\JSekI F1\Y+Bea+Q?Q!JGB@@eXc^nW9$jkj^8dkj^n9*?uIRLkYAAqDEweM:BJZejP^\BLHIJuC=RmEcTyR<:b
4Q=W+! lZa/5k!yYyZBkn!c85#b+/+uu6>nnIZV>dnd/6F#nyl<Hjj&l=MV>tAmRD@BTIL#8p#lHF@IlD/!RL4P
/NiSL\ #K6V/Abu9ZtnlX94%:Y96$#9Y?G^BJ\RPRZa1yGl?EjdR:u:4@\6lh+LhRb&&4>h6kp:iM<Pnm*9@#a%
IT1cZJ h?4#%DGkkP*GB!4@B!+Bq>@8/nJRRnSWETJmNk>Ty*hCLZ$^<91*=*e@!X:m>aBp=KBRPd%Qd%YT=k/p
AJGwpN dbyi6%6&VjkhE8F:<ElYcE^Z^Q4$?b&?%!jTq^tMqq1V1=?+XLI&Rmp=AauD%A+QCtLj968/^9/#RK9#
TZ86ek *h:Z*T%1=mSNupM@8e5Zd<R9j&BlR%@Z=MXNX@NJ!mWMACAmuApDKGATBHl/WmyKQpV%Wawa/^5u$A1K
FD5R/1 >tXuAk=E5VMDV*JSMLXVX*Hw$G!WQePwbJXbK%kmqJ$FHDVn^VacFBjNPt/I&mV8p=Dj=hZPuk^qHXQB
YtNNKB TTIteqD4RMY#^:hFu8V5FIl46/YNCE:MHdYmuwiwb$5N6h&jFeYWh+\IJJ!HbtIt&:+9K8mjw?iX8<1H
j=1=e+ *>KNwCcLJI#y%t!=eGk@F1*y/cRRqZnEVAV8^d\dp=/lGepZ?jqRKbBKawwWXH%?pjKd\d^^H5J$Xkh@
8uE1h% Zah$<acq&yJpy=Qb+5J8pIPR!k<\HCLX1iK\HPaZb49IcJb1Hn6A9<ieyM1SLtN/MYL8<nJ<>?=m9DM<
SC:n=W XSI!$H:1cN$%lRw#L*C:=YE<ebuBw/iKa+y<KS$&:@jKR1QI:6Y?SC:FBJjh4TnHC#A\:E&l&+<AJ+mM
&HED@C Ab<Pq#emc4QdH^Z^^k4MjdMlJ4TC@>XDMFP/$^iMe1J4&*/=RI159*GST?H/=>#hIpYawJb1Kjeh>!<%
<QS$4: 5YW8T*$lie?*15J5>t%Eb&6hYEa>Ky^$:hlI!Z9#jbw<4&q&%^#$wy@TkBDWVe*i#Q1d4V=jc=b4u*H%
>5AZ=P 6JKTl#RQhB@I><t*HLPNYInEBTh%mH/\:yyQ<m9?RDjWnaZ$mE$:u##6D4n?tcd9:QFWF!ANCBtWyHS1
4W4j=A \SADa8HQR<:bMX<iu>&^FM*n4yTaSpMXLE$:\1=dT1&FjXXtYn9:+j:pXcV>4?9%q%EiN%/hQHpd5jiX
<Si?a< I?DP<6YjBbW:q^!JSajZ:+=qhu%:@YDwIP489cuD!#hM<&e@PN?MuZ>:/4n=?Wij?Q1Zt$?YZ%:?@QZl
\lLMM< /Nid?jNdXGeABYdmu*k$&ZWnSqB@JBu\ZlXX6KEaYAYHAG!p5eST?@%TmbRuic*PH6PTRNY@k4%E$HQG
m@tS5y BXdRDukcuCLMJPM@CNG1>nlS9y+Wm=5==qBd<cE5*%FPyL4JN5^5DT&9$p1m@514L4%I+W!9thTKFB^l
WKlc$B 41h%d6SQMZaYW!65a6yc5E!hnY5AWT<aX:\MliLJ$eP+S&!XdQdRcD^t8F&JLdw\IM%+WEu>M56\mGAD
!kNS5e p@#iDKDPba<6^cem^cVH6nba%e1WKPiw5<H+A+:e^&pbTKpjA%W<SIM!6CwiEQuE&BlYayw/KGJHLyyF
eY\<HD /w44pYD!METS6PY!pkl?uc1YSD\iqS5KLL\J1PK#\k1W5@CyTFJ6l6LY#RLkdpHZAX\RS9bNMIJEyLS\
/\>Zmj #5V1aVRqaqmXDdLFe\+yt>CaQEpqXWZ1V:>MJid&6KVtppw6mGbuJQ/!S::F4qZXCtepTj5Ra>!qhaYI
R\!+F/ uajR8C>P4MjFin=DVqKlC$AwMCYTW/n\Hc&Jq$X!A$+WWwj4<k$G/ZWV*GAp/9%F+i*?<uyFHVP^E1!R
@jeek^ GC>!WBCGad/qqK+MaRjb8Mbjn#:JDHWw#!$4=b<4ymiKeV*nP<WKtF@CIQTc=dkGS?\LjAYJc4wd8Ryj
:CKtRZ =+lADj$lJtCc6hY<Np^hTbXTj<4elp#%$MME8YM5qpYJYC8>Y&q8WeA?c<ReE/?Q=iI^c&5%I&LCEVE+
uh=L=^ Ebj1Cpu1<lbJpV46GGuGw\XHuJe<?%$6&n?lYiIDcR5?Hde94=LwaYXIGM:e#BJuuc^YJWlJ!?K6E4Kh
ep**Mt 1c4D1l/ahXut\IqF16TpGJ%ud$hnnjFbQaGMFR&J%1^jAn#HAdVP9yVN5#KR?Hb?^1&6WyH>QVG@^a!/
9Y>w!4 hq>:apS+:=Cu!>&c:$\Ww\*m/nLX*ZpP/&6dqPL^q^Hekw&AYCjCFBlTST#eD$lD!Ij=*unSq?Y4V/+>
b4P+I8 Zp1<M5SAPeMRH=*$c1T5p@GTd&/hhI<$RWC#<q&@Iwq:n&TCjAA^N%#P=JG?VY9WHVC&/!F9Gbiwy1+h
/huQTh p?wNWAN%PDLGnd^Zi9X4G+CaN%:C$lJ9lY&@IAmPYp$cEtc8SD>jhyZa$*CLkc5q8Y?kXG+uAJwpE>M&
V:P5+B MXhPM/\iB/Bya!Z9BhNJiNGXI+awuKn$YZCVhD=9RJNSCy91pT%QypW<KY#^<&wT+XcNG=wyVyZ*AtA*
yDd64D DjFHZyViMd$A!D\=>Mmd%PjmHlbmAwtS/>lScD5q!M!DtB?Gp9WQ<6m8BLI&9d\hk<YAV#kqZq!GTbGZ
Qh1?tE i$Na1TPw=P\j^Y//L5X61LP?wuQ\6q8+Y:y^B=48mRJIQ4lCk4YbPidByjTZc1E#N98ee#qAw^n^iM?M
1/d#CS VEKpYLS:MTlPbtZl=RQ*P%q6CP::dG#eZB*^eNaXaKAyqE$b9XFbnIuh:&dBF!%Hu&!RJ6nXbFd/YkDK
u1%ne> 8P*!eY6W#tYm$Z1hN1L!tuVAWE=A65HlWKReI=ij/5M5GH9CTZD8%EhkQNcbQ<B<c+h%@!pS>jjatC!i
i!8G?y 5M$1P@ntVY1ZnXRY6Tn/DKKwW\JpYae+kQNaJNpqdpNZbZAD<&mtPDacY=\b+&qX61GB65AS5\5eXH*!
**B<SE M!VDYt&Sen8p!5?pRDZ>4tTYSd4HGw%icnH:$GK4QM/dKb=wC<CiGi6yyyHHmkAk@SnDeWDC%@NZ*dXZ
\JjBw> $8V&@AD5%/8/I5A:T4G#Z#ImH9>RJqt?/dN+GYD:V9b6?Tqu=hDZKWVWn+K8#$1QZu&/lh<puP!5eY=F
uPjN1% yESQeIE#c!:/VupIkbT$mSJJ:CHMKFC@tG!mkteJFp<PC@JuBhDQJ5iW1yM=<VGG@84:wuJlZ*!1c?J/
MeIFaH 556TuKXEiY>EBJBE&SqDmXWFEDMlNC?^dS!Wei<@/JERBKwG!aGd#VeAG$>X\YSEZd%EFip^aKKB8DkA
+aFnej ew!Ln%uR@!LAVBH4YiDMB$+&8auR#FRF5#p^>kLcuk?CAcQPTam:Gq^<HInTn+dP1AEPEkI^eECpNuGL
?&R^AX iA\C^*I^?HutE+*VpP6SDwRCE+%TN/pQ!5I=6G>?N6T^&NTBA5KBkCWYCjKIjkNYaD@=RMjWpRI4ZJWD
ccEu=E 9<Rp$b\+aMVpC+dlbi=plX:E>RQkPyTdh<5pdk=:jPWk4EER4G\8+>PpnRD+QM#yG95$PA$kRX%i^%H8
!5qcp\ P$&X?&t4C+BaAycq$FKtpESja!Zwp\1?yn>RAt:WMiJyjeT\SC41^NGik\FFFN\*/VjZKAnEIH\GEeKh
EkJE@b ?PAn$dAJNN1DPYA%BI6qme/A\ePJblPIJFnVAJNM@ZMABBG#p#6%aC8y5\E^ak/w+k+yD+jl!bkIH&Ql
9lXPX# MDKmTH4AZby?J6b?!mc+J%q&I%Q$C=btlbTBeTcuNpnbS?DAQhab@PeVXhq!NCC:pb=wupHFuW$\Kaaw
^iyAC4 GcHm#4H=uHY$LdP5t!t:lG*YdMb#pEY!tNEJVp9V&G+Ckt%F\F8d8GpmPcp+a&lieSN=eBwuE4YJ<6H/
dR4+It eTjXkHKWGQGb4BPHnEEhjHQG@MGY9DWI*nNV%nuQEMRwyP$&T%9kXiNjZLS+Xyy&KmA6?aCK+Gup\!RJ
E?qlJd pncECDL@YnRu4P$ik$=hG1JIIL8JJEiZlLmMbGNSPNwhtITE$k:^pc?FIJ?LdNA!CX\ZDc=uHhATPkMn
nH!?Mp =*dFw6uE#5=by*uFe/d+k<^P/ywpVM^bb$IEcF6p&?qECi8TPZ/5I<ibdTZmW?9I6yh5l&!m==SCj@A+
Y<9?#u lD!Y>kwcbhaEj+tJhwi%81al?TYCueNw^D=ZkNB6+jSEtiC^Ncb&Xpn=qnLpK@N6V?INkS><kiS6K:Ct
ucT4/9 VKt&DcH?N=nw8:C*n:lCXNpA@huqnFAVKBjShbL>S4K=JElbN81<W<p=H:1ST#IZVq$?id&en>QEnWEF
Ri:cpT T?M>tXt?S?QE^4%^ABQ%VENa$8Yapc9M\%HYKNX\88k=1nMq<8m/#5R%M1I>nnMVM5JH>tSY^w%jmuQ$
CmAk<e dAmbGQ\$pew:ZlW:mGGuc1kuF&CTdGCK?:#6i9pwaMCNX@V5N5GKp%cJen?jiIATdGIPc6QZ4llpIFLn
ADm9>\ Qli+ZpdME9&PF&X\t\BWy1WjkEST>njR$=wD#:8Xa91aeyRi<c<!##aC$uFDA*R5=Zdu?%Ep>CQMVq9j
!9uIwc #Tc@aCqa!lZJBVDAYXNty:cXbD^k\+&q@I<d9lJ88yh/HRJCKyp5=S*=eGZlwARPeRNTJ%PYepAe9y&L
pb4X:< tq@mLIcjANR=Nej\#+B9e#GGMm/W!^4lD+=\S&#B>QV$&tc*McnbMGb<QZRj#VVd!NI!GFd&lZY!MT:w
iI=wDn Qu6t\k@DJN:R><^lnQtwetd99w?j%JmhJqLwllth4y6%qA4l5%pHLF==wttCJY&Q\+GdZ1\DC1iijAiT
#SMQGM byCYXE9#I:+Na8JFWkcXcL8^dmy5QVeA981nB*Qc=S5w@kpJBTBcSYankj4SDy@kZGZEHIBDNEJpMdGI
b6G+Xy NcidD+BkI$NDQ#=A\^EwAV9A^k9B#Y&>*M@YY/4A@llG9C8DTl8XIT6b@:KyXlW^kpK@DE+*pMFT^9yA
e+&5m/ EMMS9eA?wENE6Aji&KMnaItY4JK^B4R=EqCXNLy?NF%@6Ve1=4M#H*8$Jk^tMQVHe$+@I^WluJ&Aw>@k
%cWByt w4>a!maANV$=mj86&Dj&TDdtkE54>B9#@lcQGLPkdp8<dy%*A48BkT>RJln?kE<DRSEkP&tG\AK1+Ak/
&Ga!RT #i+4Re9Wu/RS\e9IL^G!\RXTIW\1Ie55qlF5\bdCwh&p\hLYIb>Nk#<dl$1:lBa+lZYdl$RElFw/l4SK
-AjTRy 000039bd1aa001202b3 Page 427 of binaries1.zip
mH6tJL lujdl%9/ST!HlEhen:khH^GlFhq>P@J#hMSu4<mqJ=ES5hiamK+!NX*644//uHj6<:&4EbYSqkQZCk!9
nw+LhF SV\8LG6ELLjjpB/K1mCBPVuSjP/<Y9Dwi8w%?w%kBqH^G=anwe8Z<kBmVpC!JheciY=5bMFPiQ<pY#:b
!nX6aq hcwpqw*YcPe%$Np/adp9E5=Hu^ehW#hHkbDZeRtEIt!?SkVheDFnn*=I#6XD9^FIuq=$4cGS%ItHp/+P
N!!@/% kWXT!+BmC8*p5AdWmD$bkCh>j>#Eycam9NB8CMiMPL#Xp!CN=a$ha8$nY4@ySR>B*MS9F\LK$=M6R?WA
%:E<j/ eI:6Xh4?Y<+!/PVwNi1NBG&mY5:Lky5^*+uV^1XFLCn9m$c=!bAAltq$m<ZLJlqdQNInthGdPy#LM#!d
h$tl#% cFJCHk%#EJ9VMc8dHu@@*BW!84CILYtE$SWcAG1kqQ4kMFGklp1qRMN%49mWKDY!T4FMkV4LVB5^Tb&*
m/YbFH tcQiTK?TWFR%Va5Q5i=i\XLFqPGJ1hBy&EWD&EyAd8^419RVT!JQ84EFt58KjH\yYWwLGK6uDAkuX6uP
JN\RT^ Z%tS?GM=^D8n\ck48n@#EW8$ZZdE$i:*mXcHl/iBSGR&q><^@bPeYN6C:nbmSAFQ+t\y^l=:$ALBh&c+
IKiG!Y +FmmE^Mj45wSjyL:+ZW*GypwV\nYJ@qZ^?<VwbpwNJF\QhDSucma4$C+i?N\H$p=bEiP6bKXe@5kZB<L
WqhbWp A\FTNTP1!AhIGI5cSXWtTXqXT4W>:lpwkb>:tk/5RJkZe=!SPRQCSmB1i6tGG#c1hd&cd%Y&kNZ$>HkQ
66!:&Y &GwWN?Caan=e6&#mHY6/Vayp#ZRwLRBnAShkJHybTX#B$Y>GE$?=8=Fhe*Y56FtJlnCTZWWM&HTup>9N
dMPaKE *!LlmMaVZ=+yS1<\P:%5K9bytk/FPeGG*HLJB++KI<!A@b\5%QRYt%%$Z:@iqM9+?DWuBWBMh@Va8l>J
#%&=$H jWIYF?QQwRICn%BTEmE@Z^edqi5y*BRG<t:RPyE=QG^G\EuI\@YMBubw=M*9&&T*JGh&8#eA+EKeHdK=
IE&!NN FYl@qTWQFSiFS/D:%\u^VmGqtp6RSG/=>ARW#95IuEW=wN@i&>=$Z+i/@*GP/!4SkHY6#E<EabKqdM^F
A/HbGI @a\B<KmXdcnFS+h^w^jtj5JGqPm/*AZjZKJP=*SZacc/#q*Kh1Ph4cL/D&wBSALIKEq#*##hApMBNS^k
EdbNBY JC6la8C/ST?dVWI@J!*+P#F<+5w%5!cXChl%ipD%CuF9Wjin+W<E?d41LlmAeLjpJ&Y$FTQ<m8QwMCqb
m&RVe= ?!nd$TiCKlt@A=FVw4*XKAAlynLRd1nSB?#*BjYd5SGi5q+@4LJnnN>+Y4t:RNd@YG5#\F?9A+1\Wlq+
G&^@+a K51uR:aV!4u<+4u<#cF!>KDG\q:bQu5=j4RlnwTwn$Rqndq$*GbnS1Zj9jjS9Yq^K^LCMDMk%nMlC\dw
R8Rc5: beic9H8@^++ZiEH1AIA:Z/EYujqP*%GtS:4bD+I:>d5#\kAVY91:1bwY^HuCR/X$ucXhTRMX%GL>L?Mq
yV&Sd4 cQwFGK5+T4:aGbay*qLauQ>kSWMaBMuu?&BlFIRdI*i5G&MYl?yql\+nAZ>E$Mj>1=IMGRZX1@1/:RJb
dTtYWh AJF*L:>YD4CeL%**NkSM\9ABW&?VTJ%K&Vi?JFuHCZM<#8eaeP8jBG>Teuy+/=Y#W&#wQqXXAt\\5t>+
Gi<SGy pt@8@h#TAeBZKKKuYiE\:n<mwy!VjyPhPwTA^RN>9aR+<V$pbS#>d=%i9=XcVaDVDGmTAXC^ZH><M!RB
SF>BhJ +Sd$G^I$P+$pSM\\QBiMmHTCGE\hakFFVP9CZ#NP^=F5*lu4J/d*5TK>/81p\p/P$IRCAtc+HakAZRwA
PS+/q9 C=dZjDE@>cL8uNu&$#NlG!u:J!t8NTCe48VBmVqY+^VjeqAD5BSe9E*E$M^KX6IwVnn?T>pYDK4IDl\I
+WuZPD >aVQRWJ^kD>8Dmp8cAawEj*?:B/yl&>4h<F/HKQVC9jA9ABhetWSSTKPMqWT<yj=CIi:AAD>&8BHw6WG
<lCM98 1u6aiL?l9mwJ?CVPm8l6Dle=e$pGuCBSMRmtlW8iKV4udTm^P:*t*B^n%LI&e^q@9GZEMmWGHNDIhatm
a&+PLA M:WAAN:EEFNTi<hAESw=*DyW>!IBABk%K!N9NDkheEuXcGiN%e%\a1uawqt9ABMnI6bH>WnK+R\Id%1c
<Np1tM %=qPABAZRDCcC\5AWDLTpMWPPqH*8DJ!kD#WAcBAP!WaPq^FQappVbMFunCkN^1Lb8F/BBuc1G\XeP%L
iI9L<j %S15#9IWWJ?yBbA6c*/lb^l*nBBZeT?1c46FH\j&MHIy$qRuMm*dhY:ddQPV1y4#palb*TISSJkIt>we
=q+?Nw JW\TAVw&eNkjR5?CH14aCAeCPLlTk#X=KdG6/q?<P%:m!&4qi*1GVbj/+XXBlbNZeDHA^S/%:NI$H1kw
lj<S5I >qwTCjjhaQGapj+MY#IRZhtAc68ETIR4S\!>c/L4FWS>l*@bkA#%5HbI=WqX8NHkl9j!%1pa$:mySqi9
FWNtGJ TmKB:c=%mRGSXu5K:$&*i%lTFMNKm6u88REk1G4h9#&lkuqHVa:qG\6bERiyB<PNC5Qa$8iyZF?+IGpD
5wS#m/ Mld4=Z^JCWB/9?&CQ?::4TGBVIHZT$mGSF>/e9btDTXC%euK8eR+8L=tAPIPJMhSh=\dDTE>iInFAX*t
IKY@ak =yJuFh!I&nWYDyqq!@>A+QL5+ptLTRAP4u\N!<KV5dDFjjm8tkViWiFVEAXAqIKc%NXYNY4QT6Xn<9Be
Mi&XJp Bl@8*&bLwa1t+$FID\HIbLTcNKQ5EPXaM9<IWAIBy/>aWj<CZVcC#WISNGT95N*%^E6IK<jKn6KP:11J
iCe<=6 wKQB$W5K>F8V@l<R<A/:5B#*yIh5<TG&^TkGE6S*4GKquKwTSX^lA^6ln&LXX<@w5SKAQVaY@KH^QD%h
dPka:Z ^kBq\m1eI6ZDDwuQDtKMB=:&NNku=NK51:+!jumNWuPHqbq&IhF1Pun$9GGCet%\e=%6VED:ikl$IZXX
I<NC5E &N^:*>>h5TIJbt!EqYNkZNLMIFi\ZBL>qGB=wSGhbP$yAL9RGJK68CD9QGCqX8!E@%LlPp*SFF+d4L@H
TpYJ66 X8GJw\p^M9S>FP//?GkXX^:QcS8mLBQM44E>b4$8Q#Ll4S*#yKh?Th*Jt8N&p6QZ<D9J59%GTJGWXji:
cwl>1< me=F+WJCh!CB^DI85$>IKI\imw&F8PE$4V5$9<R<C*@@5Mc9XQQLEtPe^!QGETw8XnHd1yuPu=XC#kL+
=yhl^B TbH5lEAXS^IRe#NDb1\#XeLY6d$d#ajjaQc64ubCMK*nB@+LMi>Ll%cuSc1:%eQ&/k\CHuI+9SEC+PZZ
=WZ9e\ RZ%q4*/P8u9bmbWhbDm@qH4\%t?G&JuCBVeyt#?SBMN/Pn>/5kyk:^6=kHn<?pDN/Aq5XL8kal#%4F#S
lYuWZB ahR%GjCMbcH^uyKCP8MApXHRFEVkcZ/T<<5XNQBHYZZwykWSYnwMwFyHHDGiBAKhJq&=$91bi1nWDHKC
q$tt6A NL+LnEX\4W9VEJW8JpQkVMM<%DVTDd6Dkc@A$j&+kna+&XCIGA8mVDa?/C%\DjZGTMY*lGl#NKbARpTF
Xc%NZe lFu4u9Qq6#E4Eb4lFX1=LZJYJwtKt@$!hI?hKRB5%NQtK6cn%LM6L^J^$qB+JG+Ep&@hj>pL\:N4kYNn
11nD#n NEEu#AnmW4<iV\qXwLw4jJBTNn8cW*MeP\$?5Z5IaBKVHR@5\:5!$$waNdAq9TTqQ^%+RaAE%4KZk+qe
@YdNSl bcTd<WlXLc/MG<?L56tT>qSJuQe!l?q6H\lMYD1*91iJp&EqJtdqbDtBeRFIKIi<TAAcC!IARBM#LdWw
hXDWtH eDA6NFChZn1unb\$>5kQke$^A6B\CX1^<^1y>HwCADM*CJBmt$&aLwH$Ee@R%y=S*Aw\Lwd>wjHnikC\
E&u#=u ybFSbi>lPStGby+TRCI%JREA5Fn=dRq%eS&yAp9%AKL$\VW^MDL*6ZGTE>?alF^&VTKS8/y#=Ml5/pa\
@46\Iq EItmy6:9I\dwpGu5H/6N#/Cp^wnXAb&CHPpy1eQ%Pt$EAM^8pGkCnNi=A5Eh&<%eJCiSe?KGYjiaDI\+
41<E!t WqiTAHBm/W^Zbqa>1#wA&=^aJwAp=G=\AMZmJkYcGPq\BSClPC:Rb?iK4/H=k\X*G:lIkNVGKbJGK8Y6
<VLwj4 FJSDYZhkKq!I866QEaN*t5pp/LYBpX&I=ukXA!=K\bH*hnZ>V4hBJ^6ZRC^ZEIlAS8=ATmmSqTW%eiB#
$L+AHu mN9pJdcjq=1SQmEn8mX>NQJeD6k#5tlE<mL=hJHVT!cPYPi^*CmqC9%ylT8BlqT1Q:AmkkhNC#wFM+*R
5E+PQC >^VS?:bnY^pF14S%AJKh%&A6WHMXt&W9apydE8pJhWD@yMHdE$$whS6eRPR&!<CuLMtNu<VeBHhRiF%I
cTRwqt >PHihSZ<I*:#9eMe!TVEk@%DDpA8XRK?pei6DMC?uh%B&h<Yy4/^ZhiIA*R\pHANCN\Ap1mDwMpP1LHA
*bM!e: aTa9e6hG/n:MIP5DpVITnukZ8G8mRtRL?ATahAGY@jD^qbC18m>+X%\$$iybRVw?D4IJEH9yiW/^RWIF
kPuFA> %KaG1ABk8j64?Hm/:/#1N/pCB?^pZQeWpFk4W8kGm\G%MSj=+m9PdAA:w9a/6R%ywdCyd/T9FqF+$^?Q
K1Rw/d LBTiL%5XXNkumJ8W^umaNeYY:ECJki+p^C5W/qtVVIP9uCp*4IIBkXm\6lRGwaqF\STM:ZXp*#GiRML&
BVPXV& p&&mmGR<ARMYiuH^IFM58b=mJa<B#HSXLyDNW4mMuVc?<CbtAL=6knD:Z9@iM@$6HpCV&JdYk/eHw:n\
Q@T+%I @Dadu4TBZKIqq>IcI6iM/LBKDPjQ*6N4jjECGc94>#@jwMCV!Nd^14cPB:+%E8plkYEN/5u:mVn>t%Rp
/6+B#8 et<Bwq%JqC@Hu<S$jwnHGbFDkZ^1FL9cV$J%ALu:QWLSyiMM?FQ1=STI/?1:wyF?RIC@$Hl@&y/mJ\EA
Au%\R# h/^d5:?nMqMw&HW&yb@ppHJVFitK<\4acFFTjQlSR#yu#qe%F#%+$uAFy:4pMhBD/lX1j!imFeL84QEp
FFdi$E haadSl>8<5n#WVtADeik+9JRmt&eAl^ITebG>4*GFT:<IIlQ@KFihBtP1KRB8:bMeSY1i^^+pebM%kJJ
KXyZt! +1FI/&Apqehhh%+*eK5ARN=Iq6eB\G@Nal>Jb^RXqbXR*:J4/*<dTt4RRBP+n\B1hCZewp&>@$*j=#6b
Xn>XmI mEMun8%b?/Xdj$8+&a?<PtBCA$iEwwtBCa&mea?@:68#dP>=$>i9XMW?:Kn%6&iT9eaJ9QIA<1*iuhqV
^&bPc1 HhYXadKe@ebKtA1\:n<<#/qjch$MZZn1YC9<=kuV><HH:\ejTHIEbkEmPmiSAdnQWkDdIy>j>ZW^FbJQ
NYb1B1 :1N8\%mMu<wI>TZFKlX%TJ$jAwDDV/<jy#:/hciZ8:quATS@4uV>I\HA1l\b>6S#9VeP?nRP1H!:w5&w
5iZL\N i5DaSHq?1h<#4J&awy@8diaPMaEEYBT54X\P\D1^JYIya#eeFTJnic<SmeNJAVaXA=F^RqjuC#>TktV6
?AC&hA u%w^a9eHkh1XV^XwmB@V%6XXQ9p8SE>N^Q*6C%AhZ4QDuLu>R>Z/HkMQY:wKhtAtdGDuCkQ*a#XZWFEk
P=E9:a pA?kL\CJqaeIhWWi^J?%=mMi*<FjyD@Eb@6<TmDdTp%>wWB>RbBEA/Nw:?M1e^SRNCHlTRI<!nu:en%^
IGhmDh m5P5V%ym?>Npmi8$i:=TDLXtplTKkXy5mThI/\e?EtNFEpMC5YY:k<^lmaYJADMDAkW*q^\<TRKnpdwC
A=lE<w MaP1Q>\CAKmGH:dtq>>Q51QXAJJA4MRHlBQJbY!X5#Rl5jM1SpLJJdeb$uV#8MpJEBR1C9^I*pmn<GJW
-AwF?G 0008463fcdf001202b3 Page 428 of binaries1.zip
nmDaSe wCRlKXG/mC%Ydl#WP/+lu<aT?DqJVRmCSeqTeD>qXwN*SBPIQIe>yYt#ANKqt9HCSwBRTakA6XTc@+lE
lV@VYI NwE5WkMkXA:*aCqq$InDaB:LS=jFE4&1\uw16:DLFWkA1ZRQ::W>w?tlVR1pWn>Kk4G?#>^<C^ERJtay
WVW$:4 J/S?!QSWHw>pi=TYBQmPG=L\TD9SX/D+qL@nl&6BDRliIaq1WEqbqIKwKbH+XPL<M4e@^*:ZkPKwHp/C
445WL< u%pbKA^#kAi%CeD8VE<i<uEW5ew*JatLb^ADHawl1G=Gw5*Z8Enc/58+cHnw\?e%me^tyIEluh<>IRI!
DK%lqa 1P8jc1uD^R<@>iPcE6qdFin$CN<CNB>ikqkhRDKk=*awWm!c!E1k!6MnRc?InSp$pVaEAPmV/9uHFaaC
aB%VQN bG\VKGqnR:c+K\1#i*\FLtPB1u^1Zt#*JcmIYY8tN6+C@4mnIG8N*#iP=9yP*QMpX5Jb^Jk6Ii=GC=+c
R6n#NQ j6YNAGHXKuyIWmkT5?LIA9BI^IYYbAWul4a^S?dpQj/t@&&ANQB1LN/iiD!IeAumiVXAXLXPAKAjbLuG
#IeYdH 4\nEYYu*PtYCY6SAJ:ape$<A<qjaN/VS:?IJECWYhj@+q19^J+^kCBFwBT66jR<emb8PwcmXdW%aCTiJ
bmmuk$ %BRZmCG$KBjYiTRpCRP*Qk9Xp$RLwI5<naq:ILGDVPX\qSeCadGBE>FquqVP6?mMADFVnJJ\LJn!AW8k
nSu48: Ppppl9lTmdnFqJDEWbIqVqCLI<MLk\N6CWaRR61BLP+mDmX\u+RtYyBR\w\Yww/L&#AVLW%KYNW9aicS
5Y<Xpq catN:nGnhSEqeV%WJDmT+w\BLiIJkTaEhBFNaDkJB/IKl#K=&pGehHW$ekHWwnSDbp*CjE><5Bp\D5Lb
d1#llS eCj$V^D?8EpTHIR^5\$<!?TSANE<XJZMhWwk=/t68?l5/amX=G48eTcTjW/kX8Q4mRQIpAChu5T\B+tq
pLYj6S ?QQWcTiY=CT*kIkj6YX/Bw<TRdK@PhQ$lI/YbTjm1atVR$BHQ/ZdYTE+W6Anu/aVCuLQSFALqdJEeC\&
:DT=h> C+1%nd9?W@SEE!CDwX@^TBK!:m9mT#8^%@?&9Ll^8QT5k+Vqjj/8F95GEGDp#Q^SV6$1L9+ptL&uNDZG
16J:kT uuHPN:4mWj1G/EQucT8Jk:kpWAFKIH&D4cCe:jb+B%CC4iIhG!G+t\DkTNc?S+I/VeKK>F4j\\+@B8JE
b@1#LY Xw\W!FFL$jnd5SKWY1ZP=DpQ>NjVM4\!Tu#ByFcyTjJ4dM\KRp>WByQmCB<DYWLhIWt!DdI1\Q&/>A*A
S9<Vl> Hat\=^94lHMH?qdBl6pR8bc6iNp51k*6SN+1p>*pBi@%YKjK&B>BPn8VBi@8kclNP@6S!Xd%=q+tMT5k
NiXMFi =91&CSwIt+Iq<&qdp9#wW:85X:^X?V&i/tXJmtSMK5HyEJG:i9SH5uW@kV@Wm6m8MPDiAlSHTi&j4GJn
c4nP*Q Na&$&\B^5WY6KdEMuRP6JK+%RJpDADSQLW6cR!>6HdjZ8!Cj/deMIHH1Z*>yLSM*:/SmkM%meXIS9@+e
b:i>wW wl4BJM<8N4TVcPY\9kFkTQyJw6+NWtR8+NknWNa+YFPPdq#WF4?DJIDWi%AbpNE*1FC5MWTtl8KXEWCH
%8$+wd B&Wd@#JiyXZK!eWa?BGyLhuZ@^P$*pj^?E*tF9X6Nu/1*jWpK+dCTaCDJ:CE:SWNICn@mR+jF4nPWww9
kC595e m%Z9$B&lQ<!c&4dHZ!VAa\EW^eP?Q?&LR^=#BJEBV#J>Jb@*^*X=lqZ69\ZJ?YcyTC+pCVWp4ZiQC\%Q
NWSMRh @T4GW>H$cQhH6meY5h$=pCPRCG>h6ZdaCMj*lHYXVqIuG&@$Gw!qbn&%F*Z$nBQ59+nblHK$549M^Jpq
:t=*#h wbbd1ppSKy^VR>K&j1pylhuBJ1@>Qme/GNEATGmi4NiwJdke\TATwn8WP:bJt*jnYI5mH!X\uZA<Lubp
n9Z@95 B5m/9etti^@6jM8^JXa&PV$nWI8iVm/uEDme@AL/Mme:PPc%Q@lJbQ98T=NlVkkA#NQ*dMKq#:JZ>GYT
#Li85P FcSu/y#pn4*##pKmk=54QMEakN1V!JKhyG8%AwD/DEj^^VJEK5TZ6*6\Q:IDkb1SKTDF1>qlNh9SiDY!
qe/VR? Biwp+<!N+Mpup\TAtT6=&5Rwh8NtbHIbqd4wEtmFlPnq*bpY%DN6FbJCb#Z:$:nRG8KGhbkXkBD<AB#D
*kcYRn $<\5P@t!!tM@CTl^6ZnuNmZ%R*V>E\KtFGIW4JdpdPCLn?uIVLS!h=^4pT@6jJeQITLb&4&11uhlS?Z*
kjX4<$ hde8Ij1qiP!qP?CQ8?NA&YkBeeK+GeCIFmSnZ?LyGp&m=Qu^>V1#$I4AFkGCWedE5qMDa6biLC6EW##y
M/9mV9 aIAL4iAH9WmE\HwFTVk6<*1&tJThLhjZjX>c+#V?8A:dGn%ch5K%^h=lHm!VJk*c=HHuV!AkZtaQ^QTa
IbB\h8 WhdFJPK9Dk8k+nA?*C%BL!KJRG!PyZBAhI>!TXaED&:NG6EX:V+8&!Mhl^YIp*CtbtbLTMJqu/*HYRZH
4Li^GV C@lN%wpjd+Ret=eD4DTBt8>M5TCApRE@Rb>W<=S+BWeIDQwRn&mwA^V?Edp!wRt+$AVueTkkbHhQdLKu
SK*S?/ KYd<Rm?lk/dHuunF%pkKVYVd\L:BXt9ktE^NS^m!wcj&6a^MBQRH++&EE6b%&PFceaAI+lZQh8wqkyHY
F^nqu9 <lj?+*HKIAHlD+uM%n$>mZ\%?RBI&nYTb@Vh:EwyT@8d$jbRIAFE6EILlWCmEZ$>kAlX4Fa\>$$m^Tl&
tp5ZQc Ad4=Rwb$Cqt=&SBmXVX?bkQT+J6MEmVG#T%bZ/:5t!+HA+RZjWtX8t4!:dh<u51e<<8?^YmiF<kq+hH5
<8nSte L+PCVh#n#@kb+KGNw=Tujh4d^6Tec\tcXQLu*ZKlARwi$!+j<%QqSl=ud8C*byJIWte!h^jW*6%9FbYB
?Y=4nL aIXbQl8G<t8=Nw99jVd@bGu^<h/XkZeFknPdlBT^wZZ8&#hJC5>G1RpGLJ>/Ak8$LynMQ6%M8JDc?+SN
M:l<A? eP:@/dujZ6FlPZ:LNQpT&LL*mEJ8lE9b<+LKPdVYM9!D<+WYL8\Qj8F@Y4apqe!HS$D!AcuTc$GWnht*
qm?%mD Il#>\^K9ZTnd?V/N?wlQjFMwXKlNPVF>@!I4*+LyK9X#b!yQpe@*eBi@En=*^*??p8mTcGAW>KDKyTDW
TktISG P9HV!eWcd8>NIT4YMCu<e?Lu5S8ZHntS+@jPAhy^5\D5h#*9K+bbq!mqkX9tK*FAR%8=k8\I$y\L\/R9
*&YTLA YpXZL?M+Pq>Sk#\#jcY?$IcXaLH!&JlwK!I&q6VV=iT4d?>j@S^$>e4%DLkBK6LnTKKSRBd+Syp6<pwy
mR*nbJ TIRD6MwFpbF^m1$:jNQ?Sdu=GqQV%R?=F<^^%+NcTR*pT55wYbYykn:nIQ6a+p8S?E=HIwB6:LaEABIW
=DGV@y l<YT!pn*RB!nP888Q*n<qdV*i5HW%%:ZkEyaKE#1jtePl*L6>j+p:dwtk%<Q9@?cDu?#jP*FqQMqBw\Z
S6hTlY TIDVXkFImZ5<1%jmACeC^/N9j<^+kAQFi:y9ZL9!/Q8Lc#eTh/>*N>:AAR^?9E1G9HCK&Q6S<P::==e@
mVVW\$ I=b@pZ/+?id>#R@H%>/e@JLim@y\@w9y:Bj@^T*Dh:h8jd1S?jtY+>idmc8*^t:j/9:/m\CAAIlB^ID?
B!D#w5 nSteAw!CLE+NEdmQJ:=Cqn^R$i1b=5DApnSetZ%bFT:FtcY!E/^NtT<yqQ+e$WwYN/4QXcC:F&K6pBEm
&*4Vu# qc8@b@L\i%e5=y/^=+KkQq<i6uyP+KPPt&c%Wc&=>@#1Dihct@9V?&E/8#FQ>J8ulC@aPN^u*h85t9L4
lyw6dW F@8/jW46Gn:4@Kl=G>V:JpDcB:V%/61nN?Kjn#mJl&IcN!XpjA&+&XLGuM>aFQIClE5tQEI\hn<i1cXN
!J1hlS idS<ne1wqG!a&#@:88+i/%L^<l*G=5:wk=CY>jijdZ?<Bh+a&A1<jKZ@kV6?a86e=y6@lFd=@QL=%!hm
^ZMQGN V$&89n\P@:b$<$Q5W:@*pa>jG%JXnkX?i9&n^@Gt<ud?q:hTd?!q?b<juH>VjlD!<^I4uk9?mu*R:9*^
XW:C+a /a5hF6DADApdSPYEuy6eNbBHtFL%BI&C1RY1jRKyG4PL$1wbw^Zy%YG&u/tiT4y1$I+cK*nRn:dcqnCP
@5n5A5 GEiFMI>tj@iDc<HcV::%u?+pe+@QHCWe+X4$:qFQTMdXep/$/SX&q@%yTRD1Q^QadiFReY%@X:jIQ:=S
VTTSMl ^NZh\4%e*E!$XPFIKTp+=n?!@cH&@\$t@c?6CbA!E5n@%#TX49l@ZqQy&@XGN1SIFRMTQ6bBPqiJb9X@
mkAuSh d!wNN&GLy^R8ul$bTQKpy\#P&YM%*C4dpS5#QbiX1NqCtkM4DTT<WN\bZGC&98tGIpnCjJRWTq&R:1*5
KQAKDe <HthKjELKaYjlRajkikSdW4YD=aQNuEl:A6H8?CBqk/#tCML<$t#b^1N>Ci!!?&Z1=M9kG:t#m5jGRnV
EXC#&Q mnq+Y?YM#5+k:%YXTnCtKaj4p9pFVXmJS@!etkQQ\6H1#wZWYe+dy?Z<G:eCRE\At^e/V11ZnG8hjue$
FG>!\J RAXtQn!c?XMB/18M:T&>E^d*BZ%6nSejZq?!4QL^d\u1JGYFl5t>CRHSAZ*9X\h$mLEQ^*BQMIQJFuVq
EpF:\* wFLjX?llp&tutSdd?QqdCTwhQ!XFcad6FX6ElYb6b!qVyT8jbFib5*wVQj+=!4$TJt@*^+Q&dB*+IaqD
kRDaLP J$m!p1Y=*cZHyHh9/8bm<\9Y4#QLdRY<KR?QWFQXJT%!l+=*HiWhnqt<B>R#GMewBn@XB51jGIiPG\??
C*\HR6 WIpH86&^Z%!LaMnyPE6@^SYW1+6b*JecdXj^pbN*9KF$dZjVb9WH=8/1/+bSHaQdJ$+Qp+#C^h9Ln4VK
^<c%>G nN*QKY=<QDIE*wI69XaT>aqjq6p%%dD@$me1BP&NT?^?5W$l\6#$QdbqPipqjhKE$/ZuKY<c^kHp5XMw
1S\uE& Cq:?@DuT9V9nC%<!R8w4%\F::HX9%iPmlMedi>@95T=wRiw:bNAJ\?9Em#:pw18Q\l$w!dpjmhTwuIma
CX?mQt ic/dE!VF/6<>+kt:V$a*EG&5Eu>XFSP/n/B#>Tud6H$w+<#l=CpRHR>nXn:u5y$Wmp#pc!#QQ%qmWb6+
W4qeJ\ KnpR>%mkJ5NwhuBdM^9pw#L#uQ#&%^myR%pFhc\jhWt^u4G8/=KeP+JbVilZHG=DWmQ5:qkct:=lpKKi
ByeZ=a eKXDT9w%Me%5/uLmlDeMFh/*pw@cWG1XZE%dbaE\t14^&KTXb:jyGap$Rl@p%KGd!>kyLh=H&#+PDS\4
utS=n/ V\:&TqAj/It$=LcdcBF#/$PKcFk6&?t/SPEG\1WY$l^XGn*!kypbu:X#m>ke^yJTLHVeQ@Hn*%Y9eG*d
l:w!$\ bNh^d*b$+B+nFdZjubT>!pZ^QAKMAuSQRKL5ymJhdy8KN8hjW1jSLjS/m4I/^mR8&Y*SG&1BEewQQlJT
9@nSR1 >:!!#j*8En$P>G%c!nu*C9G?@4#D4yKn9TjHM+pbGIc#69#&EXX@Mn:NWPY?%65htnn<TCu8XNn$G?N6
X41Vn^ &NRatyV<nSh*W?WwdjTE/%Z5P:XdYd84@MYjd4w9/$MESmc#4\\PM4AE5=4l58pa#X?TP4cYpFN+eljM
wCpd?5 GJ55QwbINZKwVI!SnFSSC@wuI&#:?c4i96&K<!C@a%9hLXT@^<NlF@wMj!e?XV>H>bc4WDpV/?i?hMEu
CEZ#DC nn+%WCdq5Ma5+TaQ1$^Sb#D6$yIN$W$^Zh4?>5K4iEeNj%k+KGtPhT9hX:aEitGlJqjeMZR@=Mb>KV?S
lGF96e 8ijk??d9amp>Z\/c1wFaDwQTc9Y1Qw$RZ#Z!hL/h<?G+5W=8\qFd8#S9\Z!FYa1&^WM+IpZkmRQ+4hEy
-AaGHn 00017de16b0001202b3 Page 429 of binaries1.zip
Q/da*i +:^HE?:wcjjL:8DmBXQ*<T%bqbp=6uVKDa9hW$=y1:Nb<#BAWewB4CBb5&>%l<NBE%d/!A\Tud!yJK8h
dj=Z9R &@mta!+Memtq=FF+qGe/pWl6e$Z^YZ<&pE8bh%C%N5WuZ1p&=yV@yJikabGLZ8$$iLnAGn<plBA$mkt5
R*Zi@L @DCSdVLmyqM9NX/D8$TV<lKJ%G?%Gch@#HYu6cpwAHKqM$XKi=pTy1bq=%Xa=$u9l<TaQi>*9*it^JpR
>XB<e^ hnjTEplKR*H6cb+S:Ky+$R8=P9wu#/BLVyI9naXj8D&XA9i=/T\?FTNT?=a<*=YJedZaVJPMyTmWaZu=
#?JSTM iedu:YbAi\mY*1P>JZX!ZiBP#1DR5/SwnH6\9cm5D9MMi:bp:ZQ:i>hwd=p9nYZZVG/F=&nGG+&nMy$Z
m:Fm%k uG*JRJHQE?yiiwS=bw^*hBbjXm%D4&?Bc!mFbC<n^P<Q%ww%1VB4JCp&hJcc+d+1$Y>jWAE?+h#e^&iZ
&tB!yp iK5H*%E6%H9upLw&#E^%$XR9Lb:e<Dm+p>95ZDMcu%*y6eb61nep6GE=Y&tqMVEYdB!<8EmwIQHy^6=>
/d\Z6F k=ZTw6=V<L$KX?ZJw^!+@LTEiuKuC?MV/H>ydhEdj!k/@+a/V\SE+BpjeJl@uuk#kVSS%?iqI+Z1YAFN
Di+pPQ DG!w6//B:R&N@>TXqKBQTc^Z/Zi8Mw*k%*i!h8$i4lS>n$*XHhYc5FqKNu<<J#S/@eq$+JF+LtV&c8lN
&+jyPC 8cudR>kb\&LqA49aF9#:8cu9&m&M*^4Z>DLFB/<Tj#%R*/j?S8PNW*nVFISl#=yj>N<V8ZK%P$Nup?L?
nk:#J: 6=5FmZe?ty^1QV?e/dN:wQy&/5=t4!Q8ZYyX:#:iK=Cm?Wt$u#t:y??*b@ulD:d4Zt1E*BQha+lk**6<
?6Qy<% L&8W5*L+Ca>%:y$X81QnX16*BYWiZ/uSu^#CPQVEBn/<i5*<<RZXwitK%:6$ayi*#EMD?:wQ^=Ju4j5q
Y9#*La B9F+6p>Bh/qbC1Y@y/6^lN\mu?NDW+L8WthZRn?\5@Iu*8SkHt^?u6L=Xy!@=6=4y5?EV6^Wace#LwE4
9\iB=m &wQbNbY4W$@kb:\uLQHtL@=dkHlQ\l/qp?c+XSc>>ZGMSwKCy?DB$IiQ=8uF1/Bk9P9Q$M#i!t4Q9Qyn
ZpQbwc &\TeiA4%Jqjjy89?=jHY5hnFV5cSj*NyE1#5/Hml^/A^MMZlWt*FEBd5R>+w=8aQ:S>@Z<&K4Rnu4#F!
DIdK#4 hDtTG$h&E@jX^i%HNjD5DKqK9dP=6XetBDeCC%/L$w5DAdLm$48TW+\Mn!tkGkBK5XnK4R<W8+EH/b4T
#u=JJ\ \FA=6b9>\I=9%V!!ZFY!Mj81FW4K@jVpG&aK#mL<#8TK&*5!qbqWY+>JiiXImQhqc8J+ZYkFJGG!Y%Fa
>tT8l1 PANXNyjM+KD64DD6KdI@^yIlTJwGPK!R4atk5RB9XclXyIFX+$CDPJNbZXwZH8:a5+F?LKW4E4TSA/*6
RcEwmq J\EpRZiIYLbwyjX5VPJ=/emCFh*+\QlA\cHL$eG?&tNt!4J>T4mNwj1J1M@CYtLPua4LJ+jNqQmJG+BA
E%DdSZ 1a$iEBC>:@PAW<$Bkw?lIJlTCeZh*JX\p^V!FLybJ^I1P5Hbw$*w4N6bdB\P$@l?!w&JT%5^$9Au\G=T
Zlw<kl Jw%*mP=9pJh1/XD#uIaGJykI>994Q@e*TN4S!PG=ARw5B\anmIu@>Jbd=9<Q+?+p+bnjL6Q>p*F*1Q?1
dPbBJ? I9#uPq/W:P?Q8=PS?Jh^h&HB\SKc<uawBWFq=SA@FZ<h<%BByA%T$#D$H=QeeE1&GG@9AG=:4mBDpRBq
W*AWGa PVWp$6HXT^*Bk%XF?@mcR5tDR4%\etllRW%?I!hihRN%h\XHBTie8wPiS/mD9c\:4*CR5/cKpb8pup?k
$=G9#A n^RP!/*8GKTIeMQ/ikn=w5*>*W!qwiS<i8L/tpFeXqcTL1=mk6+/\uk>WSpnRS$VBAJl4MKuJcL9dCZ8
yM:DS# JY8L^G5cmMqywdGtZIFGMy=IRVPp1=1n1!59qN\HGiwtkqDRM4YRFnH&6=GYX4XCa<#%hSD<An/iH8KT
6hYaQ^ iCWWm5?HY%XSpX6cTVlES+4Z%MwZ4YDm/B6pLcuq+PEQJXhY=DERqheP$VB\R41k9cZ>biR>>Qn6^Q^W
SbWe4+ yM*RRlJ8AZ!PJkmWW=m89:XWpIPFIq=Ek%6CRRRdJMGN5@CXEDCDp99n?a#hBjt5FDZedaQ5BeWFXZuq
+:HlH5 HYXR\aICiLT/p4C*t=tntaXapB89yKEDSnRkSE%jpb<QF!auL8jmG1#9/^9/B%u=jh&WA?*ESaY^Nnkh
5$GyC8 <Z@MT#M%C#LFPX8c&B9y@YP1u=8&Ip4dY>SD%6XK&5Vh&%VbC5j6IKYyHTS1/&BkkaTTa?SEDX#$?b&M
tV+I&W k4&NShTp:LppFJZEXHW6nB!CZQHCR54KH8+Thq\Y9IL&8uk@C!q=hX6uW\E4jq9?Q$/\F4?MJ#?W*AB6
Pp5<mq ++DB?!y#P^lyYP5L?Y9\8jmdK8JElD$6>AT$JANM5IcGL5:PaVI?SpkSR!X:lJtCBw4HX^dJbc9pJ?tl
5<V\4/ dAAq>*NX%dWZXBZTqqDu=@hT\ewytH4liE#+bi^6iH*EJWZpLBEPen+PcGHV$BCpn+E/6:KKQ$=NDti9
Pt+HM$ !K$l^B$RJA+q=@ZWWQFR>hDmMSA^X:RTqpHd1d9yG9L/iGyd&VmGm86L&al:<En:8QQ+CBuLtep=<T9n
N:$<\A $Zn9WH$9qD:TMWAAk+iTi&n\1qpcP!n!ac*e:SS>#RZe=M^hSBZ%SGV%XWYpXI%%MLJKQE4CGG8ZRCpn
<F:m^j 6KKFl/T6tyC/4d1Pu:?B1:&bp#tW*EdD\#ZAT$db*B!qwTyld<4F:Y9J1+<\+NL\qQEJ5LN%q?HSpVMI
NQn<M? $DeYFbQ&%VQT5@VtN6E$pXW$<\>B@&PGw\!WuMjRqqiSC!Pn^S8IhWP=&nllNHuN4ZkqJP%+k4*$4ZEG
tXmt<A SlI/aXIc14+T$qyl^1wBn9LPc5=cZQ<a?Ym5kSMXWaiTc@wwaj:km+t>L6wtXF%j*NjIV95j+\$SWqa!
lMTbTC p84!wmdT+6i8Zj9VEZea6MV@XKE@B9$9lj+a%P<Y?9>H%jW@%ZKn@:WA@h<&>#8F@tnpd&D@w6Ajnjy:
Hy?*Rn :F<X?1QS9+H><=F9GLVW*&QSj:W8=ni\pu?Bqj=:LP19%yZ=Di^juYjb*<D??Wk@nJVE*&PSMu@ipFd1
SLt\K? N*mF^Q\F>nh+lWV?iaNY1h@k%X?M>MNI@Rc9JGZ?A95d9JLE@AZ&N*n%q$$kyH/DYEly>J>nj+NaTMp@
y5MtLm d\IlJj5:\j@uVYW^9$E5Thp@Z^j#G<TT@I6SklnpQ#Y8?A@p@%*nm9>5R98Q^lW!M9@c8AKD?yPG6Q@w
=#+FF6 J@L@NcV>*>1RX5*5j&hD&tTh#<T1KBRJ6iKSlDedcQ+/+&n4mVDQBaK/wy!m9e^WTdmV!MhZWkyS=9&/
55F/8d ^\BE@ww<F:en%/*j@6?c#%JkiKL@5@u5A=XTXmGXp=T1CiSt8mKq+T#RlFuh=bEtG*yVu$wXN#BpJh&D
me?mZ9 qAlt%lI#?WwQK>j%ZejBbIJjThE4/DAQujda11X9i=1/>NLLDQGDkCYiLBlM?8BC1+wGtb&Pj6L?l\TX
^FII@! ?F9<GA\FQc8YhFZQ>l6/<t@PPA8@b#jGq>?H<VlI@Pl$&WCw8#N&y19L$WM#FphZ+9ND4MNiMy1jP&GG
=J#An@ aEI:5ElImB&q#HX4qkT$a6H6MXGGi45XC^=#T&Nt6qy8#MW4@aVlnmy+kjCSWjB><ll8%pu#<$QqP*6Z
bKca?l d*j#9QX8k4$dQ:*&$BYVw>VAPuQ/Tt<h4QLI8qW>X*S6i&ldA>m&%lcY#N9\5PLG%jGbH$j6&%<#Z4P/
=m=wW+ lEJlcL#E=e9Eqi?M%C\#Y^9G64nF@yp%ti>5Jqqh*@kGw5a@J$AbVtDVZLP9blpFGM>a*%DMPliAPSe^
nDeSV9 *P&bhqAFe><qmtlh:=XZZ>jM:nt6>T%Qh:JT%#F+PeZ?5pJ6G#w/T#E1QtXI?Jl@I<d@!ZH#\6TtS8j+
^b*cIB LC%Kd%j>itSAFJR:LNbZ*yH@!e5DQ@iYickMlj/d#16H!qPYDL8\M9Pl<+CcakBH4mdF*e%GM6Ed1^nX
wXl:iC n4hR!R14FJXnbK!*Z*c9%QZ*9uIJa#ZjM&c<\uY^1\?TTJdT&=/B:t?/<*!$?G\^J!t9ppQecqbIDqjX
@e4G*\ M>1Q*%cIk<hdi=X+>bi#QYAIdkbt#$hC*n?81$^++i!4aSYh\C6:d8b%>>8?4j9\acttG$Z!&cXSXnaj
:N?HE= %*\iVdty4X%k+aJ\wwP#A+Y6qy@duHyp$q4&e&+MQ*yL5kAdblJ<1jF?*Zp5Qmhy1DA$@RGa/Tt8c>ZE
=IA/bQ ^eXYe4M:%pYj9yBL!@b>*k<&yy6R@R=:QKDcYW6Y+hNe8dq/WNyLdeLTb^4j/Cm?ilFP:uFXVnpY6+#b
q>P&D\ Lw:ChK/hkZt4:Hi<81C#E=y4mXtHh#b\bcb5h:i*M+piT*ecijd^DKetI!hMBT4>yC*cLqN!JuTKQhlD
iw$VAL epke@ii5Q#@@e4jQ8XDWbV:M/+:AhD@9K\:%pAS=\$Cna/8QN@uHLFRik!Iy>h6D\aG6k8KEX:I1/lWF
8m5mBp p<S8%ZZN$=aDA+q%:6eWR?*SK>ipRKlnHaM96%FM\^BQDY&GeyQy?FYVXuJA>i^\<pK?^*ZZyGimyWa9
t@LQ:F Q!pQ=KtEG@DC8FB>&V5&d#CwL<5XR>ii=HFLZu9@tPW=W:q&=iC1y*c!wYC\CFV:*R&lEi&1^#pj1IhK
V!/6!d >V!INw<F\1*YuG:RbJ>Bj!XaQJN/A=FWD<P8QK\Pd1YhS>tiI6+6%!lLL/%i\R8pq#$QHcVJdT$^Jeqm
j:+^y! !$>=ytj8w/?GJ68RJiX%hw+i%##pmAVKjY%#k/KdDhILTHZC=Q^I6n&NuyA*u6qp*/jRRwW:\&tZC**#
bEyDLi T/>jV%nbX%Z#a*t#ctJnbQ=DQFpbaBKTH/Y@Yyh+QVjat9W!@hCeH*E!FLKhQ14FX:G>99#cT<#H1^=t
14Y:+k @&Ph:44c#GdZI?u1ptI9l>8e:P$aW9?*8I6*Am#QZ@t%Kb%JJH\JMy@c6SjJi#Q<hYE1c:jqTcn@qcKa
$jhhHH H\H4?mt&ZnaP4cb?dP@wZC!PQ4:mMk<TW8pRGa4Mw4eah@lGhl$T+kGmTnD*uRcKlw+!1VEZ<\bq?Hm6
5*/<\% W>b<HTKqXJVddhwQMeuLhHbZ#q!Tk5q<5uhGVlcP&<^h$R4MhybckZ&Gy1V*Su=nhH$<<bt4PDZw:CQ!
qjelV4 @yA=ZETK6ZZ8Ljp\&!$6A+$4TiQQ=9Wi6q5\QlFIyH$yaVIaced*=JGZh!<CpbZV6eT#=C98<KlyV+5u
LJYX%$ X>nT*YwS^n4lunTwmNJ\W/A*R&8^d*CVBwQMCicR!c+y6#w:^B#::S&6&kG5%8QXyEWXnAL:Mma9R$=9
4%@%>^ l%jV=tjPhcC4yYV1WeyPh4N>VLLttDZZ>=5DF#V6<@L!Z5$S&QJy<mP4$haQZiaun<#MlV*#h/65l^Zt
?Ztj5K 8Dkn:!:EK5*JjKDJZ5mEum?4nJ$aMT!6##$JWnJ5w*9+XQ\HX#b666*\F@C?n%=tli%yt&!!hLKBuHG?
TqcR!P dq@>QmtdpW4iejQlqtYyN6MXSq=meMJ1=VJwQM%VSPTPtc1FHqq6FMMah\<44b*c&^L8#*9Z:4E6=Sn5
8qb%>N b=Yd@#A!MZ96E/!Q+Hmw?cQM?^u*idNMMN<HPVtPK>n=h%?+6l%i=?iNd=pi>=hHKFP?KY$aqn1i=ck!
+Fk^Jb bLLZ8?b5eZ@%SDaA?1R*\&c^:b&qd#dE6@1I4id5q*XIe:wFat%B5wi&AmN@Qa=P%?y>+mb6*wlR/<n$
F>V>iW iBth<MdT4aV1ZwVq<Vb1K?&4wQZ!Xi6GHjjEV*Pcu/cupl=>XDa/t!j%5jN/\=4QaQcn9hTT$8Py=<Vn
-A5&#! 000175cf3f9001202b3 Page 430 of binaries1.zip
qckk5X c#4qCPWLS+*N!MTIyhXL*hj?+*!1In1VL=:Qcyw>n/Y+Rd&6j$M?>a9cnQq>J%@u>qI6#l8hN6VlZ%:$
kpW:AQ ^W^<ZBJ%Q@^C1#1qeZPZy=E^5Dd#<kej@PZ8%p<j!8><T9dejRGkPSm8MF@<w4C8PFFw&EINq*5C>5><
AJ@Gta DIK1!%I=+@$mWZ^!8It99+C=ZY=%J=u1uk*D*\J/9\\nP\KYuyCilA6!99Tl^p$19Z5*&9JM/JtkkZ&c
epJD^@ yk>=&y$n\5mJ#IYwj@C:ZD9K^\<?uKq6>P^A<Wha:^aae:^P#LEH=X%*lb?Dw!DAEtZN9pnT<aYc\aVI
Ga+^yA *SHC=HQQa\@TGn>jb!qR$qKbN\cihY$u#yITmV=I5G65A%HITMYGYyL+Vum$NFS&Dedd9Kb&414LT4t9
l4XB=i G1A>T?6*uBLEW\F4i:<hNRnMK5!kZYlyiPtcWXL*Yp+>Lp$5ZJc5Ih@AjaaMW8RZ#Wm1Y6Kei^h$IW6i
n6BN>T y@PMmS=&>:WSBF!qiinmi1>@9%!dbG@!anPD:>4^ERn\WZ5e>=MjG#j4TJN/:SPNi6JIu!QF*5Dl+NQp
tASNwL nB6^Ty999Ei$5BH^=HQCYT/6pKIlui!al5><kZ&6w:LC#W::Jy&+qQuWnKW!V$8!cZW*%w+5j=CAuy@8
SGR&WV HM#j#BJ!PcT8VKHFHJJ<k$9aLB6JD&&k%^Gl#9D=S6>K*Z9au&^Aky=>SCS<$Z9e:C>Cj!8\yp+5ppl9
An##qS H*Y5i?Xbm49*eWTMe=>pX$4RW^4!a4u:MYEQj9d+#DZR5t?LAEteG*:iu*#n^duFF*VFkLXaC/98$de:
l:kF+d WiFD<SHDC+t/9?L6HDWu9Kc^i&I6CdENP8/@*>YZjEW+i*W<tiXKeKt>CDqM*+eCj+@Zq+/4eTp?tEqW
et\D1D n@\!dT>^qw*NBK&Y@wI=P=4qIG1ntu1RnE8/8ZqS4Ce4R/jlLEet%6M1^&FH<n/>X6X^QYiXwF#ll/4C
VCYHau YYt$RJ6$R>ST/tRbhPGn6!NwYMkm8+Qe9TWLSQJLABJ&^we#pFl\?$wy4Iul*Snl/:F%K@QSumJQyjVN
qbC%:A JJe9P/DWFC1ID/IEWXHm#&XH4%tT/Bm>M?EF%&TyhRT<=%eA\+Lw=1Gum^LkCPuWmaQcumHVc>Q/=L^V
4K:FJR 5DTWL+w$Q!uaAX!qReq95y6EV6Da8HYptiW<iEddKKY8BB%:V<Vj/\*l<n6=IP6VR?lkjyVp&w6jm/@$
5kFd5c 9:wddLX9VQ=mV/m1iFSA/Sh@+!GwMVbJAi%m4ha!VGmbGM8&iyn+*Z<BGY+WiyNQ+P1eC=<*RcmDFCE!
$DT=C: ypcYRPkk@Nn*Rbn^uiHAlBp6D51#l:pmn6:N<i>9TNB41PWM/twEcRcCa@t<YGQ8R<!\\j6aYjBcZIj@
GXuQcX eGmIV6t5Sl&L\WKSkc?#j\=Intw+@8PKLD&=H@wS<mPdQ4*NLhy=JnNGtY*jPLhkV>YueCHGhji$>Tat
ARQ%RB tlHuX/c1L$/=TyI=beSY@XFmwbJ!^81Fe8%C>?yPaCFK:<?SB:C:tC\n$KKI/d\uV@9Zd:MhFEnXDYVl
V&%Rmw Lb:\l&QWJaicu>KeQh!=!4S/^%Q#F+Lbej4P#Tp+>:A/?a:9$>B?#IPd:tHhtl9u%nPZn9EZhy&F8qpb
HEnV9X iTd?WiJC4@cWyGLXMj^#jWi9H?>pWqa/R>We4EueP\Z<ndmhuj^p\jE#nmkQWG4wKdWnt=F4qCTq?<jZ
Y/S6:& t::PT=W:GtCaS?k9QqBG4WHGGHXkYAQ6=#EhDZhTKHaCBnl$$c!J>DN\tduIAS&@t55b$aY/ETbm*bJI
!*ZwY5 DSil8>?wJbLhG1$8Sp=kqAuD9tp8w/?9cdB@=Z899uVHDYM^HQmPW&MZGtTm96&eclbLhZFZK4@dtR18
hnF@au :84BBu*DbqKXtuH*VXJhphj*w&PVKaMh>&*u?6bE!LM*=yJJlTpIYk*P%>PD:^11nWeC%&w8eYK9W:KS
&GYtT* 6hIkYtPVB&V*GV+bTPY=:*#!*5^#RR5qTGX4P>#YCZ*&mFau5l4y4Kh/hMI>^/8?yC>6lw%dJTF8+E<#
QR9:Lt MjC<cXA^adDDl#!IbeMYZyQmw1#ShB5l>>n8CZA4ac?BYR6>Lb=>b<M:Qn>L9c!jWiQ@@j\?u/p/q/qR
!\#+A4 4^tRIy^Cn:>KRYY\&NVNGuM\4ec6m8tIm8G?CaXQP$DGN%&TjHa$wjHE/1F*R%%#EkcnS5GBD9*i9#RD
!b%8be ba$yl>&K6M%Zd9BTcQBn?6+11d991+hA>Ml:9k:NNRLe4X\RVpuSywuFVm=*wRuDSn9?Jd6<Z\5cEeSt
&:tGhd GPL9Z#Ijap:\FpJKGtG9$#ZI6aSI#GlE6q4kSR^j$>GL$cTTLIeDwV/jTN!:59D?&%4awLe*iYbG:Eb?
=IhQ$= ^JB+wy<V/>Le#ZK^Pqj96/#AkhYbVKq6a?MW98$kQ?$tZjAwLce\!u8Z&yuMZB@qGVci=>^#+:Cm6nyV
k$FVyD NNh+l9JlwDCakL&>SYL!MPP\4mhBpcQuM+=11Z:8wbjQi$E>C5RymV%\!JbmuW5DB8*b=1c/PA6+uukt
j4<LeZ >8VF89=ymLABbj%Iw@*Kb^=Npe<nd&p#L:JHA#5ZWmZtA=S*pDjGjR#yywe>HGZN^1*y4<ebHm%pnSqp
mimJIL HWpSat/j<QCQBDp5#Bh>ZLli$*5##Wk>mcJRaDmn+<A@=R\>d1+\yeYbh&LJpqk+6kEXAN%KnR8qD!%Y
QeayIX >%HHkWw<^N+NY^c::+PQ=kFZ4^1a<&4$cKkZQw\K$FI8jCbNeR9iCNd\KLPc6nPcj!+>?4:ChM9^18wV
>&F6Ab ><meTt8=p?<N%^SCVI<\w=?%VjhY+\J>cl9nh=TwWQFYuyLk6/jbnd%!/a>dKR%4QGTq5>@Y9B*EnGNG
KDc@TP G=P&/ipZ*Lt4=H\hF#J&WJXK:jX!#%+*/iC$+=Rhqmm18/:TbNI*Ew+S>JqadB%W:i9q54FJ6cdymy%=
k!I+y= #/RFQEHH<Gb!bXu><u546XwSy95^k=4eK=kcuw<P^y$JpRQJ#LFPFP\&P%8p^GQKP9cY?e!uNu$k8cHG
TCqbP> AMD=/yVJ%*uMN4y:w:mq9ty+@!AnJJHC+^y/XLn=R?aDKbGV>&9V+\u:P4hRn<lTG@wFN+JFYYG#M4K6
hl<\*+ dCk5iR!+4LR1eqY/*/i4?w\W+L8@EhkkTKZG:etnj1@HXR5itY@MXmw9u64tjKdc@1Z6@Aed68EY1c^t
4\k1?I XcAJPEJFVh?*^@kB<VXT98ihq1MYbD<ndLtI%Kd@\lnFwQ@QcW?Mpj1jem%pJj:F6bCS@X*Z+n<p6*<Y
9\<K?& <9=XMeXI@a64<ih1K$d/N:B@MVwMI@Md&L<aHacS@R$5/5?^$lK@kbZ<C/#p*&Q@cmThNQI*5DJ@:n^I
H#iVKS w*+Dm@q#q$ac@S6a>J?:F6JT9+H>1@Q<G:!T?19#@B8<R1Q@+9@>DX/l$H<8cp9@B1>Rpu>?4tS?k%hI
c>Np*Y /V@j5<^9<Pw9ZR5b=P>5?5>hC=ujIBd!n\Z?FQ5d^EJK@dq4IjMd^ML<Sd66th<kFq41L@a5@d?Aqjpu
nuLhIj ^?M@pQ>*n5h@68eYN+BLT$n>1?MlI@5unweET8d@NZu8Y@>Q!*Q9wT@qNbJDd+P#dFVReKhHS\eJhV96
pQRK$\ qELub1wQcw&F^8uJ$%!MYcHq8ny@QCqmq=uEuHw<y:pH%M$in5WGe@WqNF$ub8\Lly61Nl9mndu4jL=y
6?>JI+ eBlZ/58#W&//CcyPtQtc5^yD4\5\J=#/Cawc=Vkj1wQN#H#5$uQZR9VdR<:i5bw*4n9!tVI$8hmc$FVH
Nc+KI1 hL@ed8j&EIZi1HYck$d>$B\@LQSTZX%5>GYe1eVQ>apFqe$LtqK8uHFk$n5PHqabDM<JRY/9>LAwyw::
eYyY!M 5JM@u:4%B@*5D!ZJw<%@EMA>DI^<D*wWKc!ZKlZ%R>c=ZT\hSk9ESPn6hZiG46e@a<8+/>k1a*^4R>Ah
Vd@ThH *PNeGhcpb^Ty1S*9inJutj9G&9plDbme=%MBij+W?tGm!QyL?#dlymEdEKYwSHi#tX<p8>R&Ba%N?8ja
!XM+\9 Xm&p!Dw%e*Nntb91HnVqDV#BtLA$Qu6h:nA#pZL>BeY4pw!RunE&BpbbYGP1a+>^eJ=VZV!V&:Zqk+GM
?p9$<9 qm/L?:*jXB@+8EkQ#6P*#jciqylVtB5LZ:hkuk&Zaly<&*#maeMd$PLLpyD$+@I5kTn8uE/pQD&aTX\w
K+/AiT !Wl\YV1iLeNTd:iZHudSh*@d&pTD/WqCI&hA\%WYEWiNtc>G=*PKycMVuTAF?<yh<>icI#wHZa!dF>cj
k!E:jJ d+&m4R>H4>WKPDYA>BSYlRdj#<^!kRY!Z!M9+K:&5&Fc8k@%C%G1$a=elSKiQe5>Y>?bw*W/ZVaYH>X*
>9IiK5 iLK6dVdb9ul=HjZ&<tl/E1C8Nhp1eiEedeJchcP=nB::ti?^iX6u#MRTyewm@GG$V11w8:a?e%ZNT<Tk
GKKXaM tEXV*XKBc+96&k:R!n6TV4&Y6b4mcu^CN8XA\$LlG$1uAQF$+<E/w#GGem=u+dKHB:E8lWh*!5*eYyyi
mm:i\R aT$id%d$1md%h\^WXJPuy4H+iLVelZG8GQ\1ymiKEQ>JuL6%F9Tc&i%G$H8dm14AB$RXMqamt=/Mu^1Z
Y:=C>> $qJ=NA+b>P?dD//b8%bdy$kNhu$^=^uAZnYeYKKP>hL:a8\6=l95%%QW8eq49DwnD>qWT<^j6YG+@$H$
j%1AVa dGyQCduM?<4$TKKbW+V4=h&#9Mb=+=SFjQHJ^CP8&@%b@k>Z^BQMjt$ZPVwG$uPLu4%i#htc$TLcjM96
\BtNnQ lm\#G#RWyjXT=$+eIGXpX+jX*L&BHp@B#%HpFPytYE%9@XLk+@tSL+lkF=cGX>YXCbme/pmM$&hXW4K?
T:AX<$ FY5w?q\bM?&?8%pmWiQdQ@dqM%ElWZdi:D5%a\EMPTi^14GV&?u5wuyQDjGY=aHd+hSP%pN/PqK^B%=/
$&*dcH AnacPQ=e!:Dt+W>Qm&luPXc9R+V4ule!qwX+SdetWn%ij4LcQ#bRcY?JiDkGhGMT8eiPEG!b:AS4N6F=
c#PS!m u*Ndw<keLV5=c!9td>#I\nNYy5^KIj1>KA@8>l4H$#//9!+dBc?+1<JZIE!4Ekb%illR%F%5N>B^*Z^8
8T!t&& <=Pkt1QFbI@ZA/EV%9:liQ^>p!^pGK@Hp*^GXYcjHpJkb\Ey8tyqc#dY=EM\qa=AMwnSceYwu1PFybdW
P$Lq^+ iEBNYw5w*16RQyblah\JX8CAKAaJPDRHlY8aSF8djA^h&bQd/5qT*bELa:1/aJ<DVqtctP^S>ZqAP&!^
=kE&$Z uCj!yqMbdMJqFVZ*!jH?RnD:<YM1#bT:iAjh&&y5h+=AjE<!H&pXlR%XCHq$:YuI*+?$X8Y+A/Ld%C5P
wT^K>* /&l@HVja?cB51mDtkMNV4??yldbM:Sl#&=C?/*DR=w/FD@X%WWY:#w5t&=c\c$%/eRXiip/cJ6X^Qebd
TS?RJ: k=Zlw&aN=9FJ8j5aw*IT8c&<k1VYpBhSVt>bBa^8C?+:ihVy*8eTKHq#5>FEZBS*CG$=p8itY+9R8e*q
tbFlT4 N=#/>iYe1@wVFJ>*6\#j=+YK%BKVkbC/qk%&wBDtceQp%GTXV*XM=<JkRBh=R%h?p>p?!1m#u@G=h1Y%
9C*RAR t5DX8iKkM/HpEVIh>J/uSAMSME1JuDmtSHTV$<+uN>=*i/6L4H^E9@mLLbA4Y/JinM8EyThlu=dtAbKB
Q+VDeX <KL+bNZh&/dptecT$EJi4XPVbKt@5MVAWYTN#<Y:5KCX=9PHwBDkSZDJ6SD\t!Pj%Lc8DCJ6tNpW/#eq
c=?y^= n^!XE8h<Y&*J+JjRpIVX1K^bN8%tB4=QLDGnXl%V5w>TA:1QB^65Bl5RkeHJ@N4?lPRQJNnZNCSmB%K\
F%&>%j DIcP1phbY?!/DcF$^1&J&CE\*%8?*lN^baSIG4TGh?SJDeZXteV1WK?d^WpFDyLF**cc\mdmIV<$Y<+y
-AMabj 0008e1eec6a001202b3 Page 431 of binaries1.zip
tT@S*w 6aJF9/a?>tEKc:R&!J1E@5A>F6h=uqE+$K^JuBB/XdPaAhHNP#S%bLEGeyywdS4$GZ>&y#eQjPmuN#i^
EciD<D $pk$LQjK8*k4aG+W#ISlb*\MhtuVL$BFbm%9?cS%TK66?&/<>m&/Sk8Vp$w?T#jDSNSWQpWM99uI\y!>
\pH6L= *T&@^&qkc9\CL1$RaHEttbJk66=V@9\/^W/%qe\ue5!LVpM#@Fqm@/STyy!1uT#4?uNNRuQD4@caA%1>
\%DI4E =FlI^k%Y$=\Ei>?G8*Gkm*nDtP<:84j<\i:Xy+@>qVZV1RN<>6>?%Lwd6X=6#Ta!$8yu!4@1@YED%FTt
a+uL!4 ?mH4:wQ^Z\j$MG%M8ccTb&&84+h/:T=!t#!8jY@JXN&LtJ<?tTTS1KH$y\h:lF/c/AunCcpJW9!%!hd*
8ReVX? u%wCQ#P@&&eil$waGXY=b5cu6MTJwh^4pwn*W5Y@I?Mbd*66/XGXVw>d<GytmNTKBCSNqIpPc%EwlRue
P%Bj=+ jT1RlJ!k@>d9L+FQ!eN%BAtQ^9kCZElNWyQqtpb8RWS*py1bKEuqAkNLKFNw\d9bFCeVD$>IEu^jt+:8
a=mW6j iXAdtI:Y=EB=^MyGn!TmQHCn6qD5#4T9ViBMR1KB\wqhRyIjNJB/\F@9e#dedu9Qwt#$8^5Fbi4Nb:l<
XFFtbl *F:bib&un6/BwT?ZVSwS?iD4KQI=LZ+#mTB:1P/^F6qJ:<\<4S8ueT*J?\^Ayp8LlA9!4Sk#!ynEM1Mj
PBa/dZ 8p5epJ*TM+aNd5$Nd1pq1*NnPntJETEpT4cq#8!uW!BNNSS<?Cd:KZn\ACM!eC:$iJel*69>6CL%%EGd
#A^m>D Cmq/&mil&Y?jFJyuYP!WqTc<j&Dwpbbb4$cupYYThJZDL@RGLcS%4/Ey=hna4ZF>&DNw9P!hAHY888iN
J$<aai >=B!9T%n4kXntw5PWmDC?&jhCL#GM?u8CPN\Jwqm#G9$Y+hp5kKEd%8FN<Fwtw4HJNC!+k%<8Il*\:?5
*#hi@J L4<j%CjlA?pTRAkmyjn9:>ptJjPP\tIAK>B$B#%%CHa\pu>$S6?pX+baTdVMY+BHnD<P1ia!w?K1yDmc
hu=cI@ +Cm+bIl@\NTk/t5$Pea4$P91IFcJ%NYl^RE&wEDe*N/$F8Dteh\+9@M%9i$pjXXbTVhQ@T$q5b^S5dl>
i@cMwB n<E&k:jB>@u5!B4XQ@M9uhZpY8<QwkJEC4JYFPMD:Wq#LPPn#MlLLeW%wd\LH=>nSV?pqIk<*n<16N:F
R@inh1 niICJ+ZNM5p9t6<Sj<l&9p4qPuYj&4k^>IFdtyL+^tNI+MeApij*Q>/5e8VX&HF8X=Vd!@&TQ8l1tnR?
e*MKQ5 %tC=h\$dN/e*jZnqddBREnu/kF=#DHdnZatWG4PFyq=eP=Ym1pEAX+ZAi!?W1Q?>ZR4MLwiM8MPDDe>b
tRI+aJ 9hCAAJuc@VmwcJJWLu#EBQQn@5hutiHmLV6JLYF1<a\Q+LPa^JbNR>eSHn5#pTLb&4&P&9^4/SPjWT%9
F5%ERV SE^e6mZSjLqnGuwc=+=Tb1^N@98b5Yq?#1G*MlS&cFi#@j!DpWKm&XbmqhV4>IXj1%E/kicp1X<jBTP6
H^B8ZI JlRMD/S$p<=PNP8F>w^FS!+!jCIF?86kY>T@<HXRXZ@ItLEpdR?Q&1WIitGHP=cMY?L8uF#iBIQ+%1tT
N!t++L !KXb64ZCSyyiY^eCtLIQCFV5PP5&$HTdD6@j8?BJVWNNt\#wj9jVai+%q>Q&%$uK55IbQLqCtY+KSQ1W
>=!81m :eH<h&I*h6/XGVPCJujFi6<HhaCdLu*>8=:&9*/98&:l@DY==tKjM9^I@$T1n4/AI88I^*M*99CbN1qI
hh#yKb +C/FtF#DAuF<:lhRcmd::Q:wmByn/#&hITu?@XlYlyuaIFt:qwZX5:TpjhiW1cWm@::XtSKc4H8$HRHM
FDlP:Y M&Ae@wQqy=jWP!GMFM:!JF+5G$Qthbp5y>i&E4++Thc!<XNLBAY@$j#mLLZXD^JdK#QbYBI:#nkmtKJF
!+GZBN !kdS*D1yYu\^+E&mW?jH:/I!>8GqwEDVIeE4aVRGIR5C6AphcMAPX@@T%8ZVtmc/*A+@C4Fkd#ZTW%6&
+\:=h% \cQWb6>j@cPDa8uGDA!TZDeX*a8ZF4t!VS+bb8PNA$X<p/w$S5Y!wQV+EZumI?Tteb++hKb:u^A!I5q9
M*wibq *45^Mu\8RkuDhhTNpAe^VQ/1SqcLdeL#S!YM!9GRa95+knb%qKpkTX#>8eGwJY/^%hCeu<#<Pw9?A9:=
4MiMlE A?5l!M=mV+A=+hGu\AY?n^yl\WtR*5eTtIhpJ:NVtEBDcq>@%$!?<kCaP^1@?8n&a^^PLwb1hLh/&KnV
p:kt?X a8=\W/t1:4*t*X1GBAu*uEatbC:i/C*Fn<lVa<n>MDK/%@$pjqVTVH\mSDDC4yNAS5wTQ?Y&q4NEVe4m
9M&VVM /jX8yRVCWSc=MdiIpEVaTb1p\Ii<WM&Yb\+BG&pM/+:bQZjnl>HhZ+6dIdl5LKZEI#aVD/5PNj95\5VY
Z$@e%\ h51ChZ4Jh4QYL8lPJwPI*Fj%m#I@iLF\ncmj*Q6*/1jyQ/D\CR9u%^KTGT5<5d!kV@G<j9CDj9Q1mQkJ
yw^?w% a4H/Z:4X1wEQ?PPVk^JnKi#h+K@>a8QG#^S#Q5J/Cm8D1V^Z+ua%<=L&<1Zi1%GdIDX$ud5muZ6MWIu1
HTdABh 6pc?4^9y^+uW@1y&S%dm@^!JYqd!j$cmqycR@tiJYqwC<^5T6a1@j<Ajd:d>+?*@jqSymj<cy@h9?9X@
!Y@91P Cmn@JM9I@19<JT9=t@1%LP495XLIQ=i\bNG@kbZ+e!%aX8495im@!K!Y^j\>FwZ?m*Yq@^/L@I6Ea%tb
!K@Nu4 *<BK@eY/5u?QqbV=W%*%H+Q#@ld:X>1w6IVp@\4+N=kq>ihK<4>#?L>l*WJC+iL/TDFbMSSGWqJcVNLV
1l*?Ma #eqX#MVN>+<+hBZ:+^Lk/8Z9<X>S>t?l<Mi4@^4Yy?jq:@N9Wid!n+8B=B<jliRj/@:np=KWR9=:kARE
N>#Kmb 8:wF@@FHmZ@:?ijhwQ>pN%J@:Aa6KTPNFFQ#hAwMhR5YM*X#CR9&C4$1y8utFBwY:Bam=8V9KtaS=899
kaNc4y F8#p:PZ4Fi4%S+V@=m/ScEp+WpIGnySB\=FImh@byhR@Cc!!pu<45Q=uG9p@BFap/q<E%u?@>Q!V\QyH
@%BbBL SE9<j!uq@*6V!4G8:FKIRn^#QDGFJn5IGBJQFW?5y<e+=IVh*\Y%\q<nyTVlB=JD4aH#4N&6hw4W5QV#
GDp?6l CG1bj$5yS/mXMM4?6=V!dB+uY54@Q1Ze=qFV$yaGeS!hlGh$\5HZaDb\*aad%eCp4<nWQ:LJBTD9&c\E
#k/%#G yBCXiuJnwtZP4/SwJa#YlXwBR>nluLtG>>Pl69Y/wKcPVt1$!9%&:1:RJ:V*VKj9IF>*IlyX%IhyyBVb
Xwh86T edQAQP/H#Vj$Nb?b$QuKnbLZ?S/Q\6RnHDMGhLMpFla$kIbR@+*u9J%t=#jWly6\91!Y/ChZ#bc*jVK%
5@q&FK yDdXk:nut*yMHWhC/!ca%MwJSmLDaS1Gj5<Q9P$i6KyMNAyBd4i+TA*S#jjT#!?YYHPMV$tqMD?HFd18
P?HVVP LDm%8:l*yt5wilyIw:I%\dpZw6+Jp1DSJW&Gd<XLek^m!1\c$di6Eichi61*8#8+@S\T8pM>tihuZ&P&
6htmWc +^q>m\!NeqC?1$/Z<@wMd#dX/^QuF/K5XZR#FF8%P5%GbI9MYZXnGb%NnE\L>8bW:$i+wc69!tbe%>ZI
?iC>+@ i5d\5:X#u+HbjetHjpTd!bQ6l5YyRlK&n5H^?iP#F^p8wtPPw<!Nyc<5DyXm6wjV%aae%:Qh#CNYZ6+a
PDdl\W 18m$GCH#>YIK=*deZA==/t%&4dJ5*k#h9D14M*@8N6h^$Y*Md#>Hi+QYLWPL\TZwVu8Ja\b:Ym6hJPPG
Bt:MVp <i#5nRD^1/HYR@i5q$>jYV9HQ^w#ZV6m?FHm?QK#nQHpMk*DATnRW%%RjpQpB?cX6*$iC>@?cyNL8!=W
MqFB4i j&*L/NBHjtQKMiEmbZ$A/!6#6L@RtVWe>AbSL\64C8RcYZ9k+CN1?V/1YTniDcmjww5:9q#yBdl*$bJH
@VB45/ w&iCmS5>L8e#=KqqnqZJyBP@h#1?EkH48?Y#T$%tF+TK!AC1cTYTDH1KlSYmJWV:8Ac@We?lSdZVm/wG
Z&>X6< %i$BG/th86/TCiw4>$t!8e^\y:!bcymQ9w/Q*5y5:L\m8S$Q9YL:ZlXm^u#q<>bT8tSFSK%ZSSQlJT!@
J?iDIS S!B/w\9=5QbuiH=Sni&5^wq<F?&mbcAZhE1B4Zt9!kjwNBFep@=R*nQ$WV+BHi8ijuh\N<a9@+\Ht111
wW>q9j M#=n#LX^FJ9X<B&y@eWiq51n:CXe^TyKPJ8pb*$mI5GH=#KcyuDn$a<$CV!1$Gd$Lkl6miHy5^\A:RV#
ma<y4m #PtAMwkp6LnFZ6AN55n1tG8XWP?@tyK5m&!^nnAIT#6m\ptwy!N<&h=X!yX5K6*T=4nHS1<Z#BwyIbYI
p\>FAN *5J/<mR^j6!SV$X9CetM$VC#G&D+RTYQl1/nynbC6MnNbEZmT45aaqd8$NS#A*N^DP8h*GYyQXii:1:=
hGuNnd =PlhXkbdHR6w:=Hdw>iW1<8S%HEadbckZ$K/y@JZBAj:C%XZjQaEZ8qi/9pAJRLkE:!$HNJLih:EFA+:
YDcamu H@5ihH=nu^\R#jkpl^Jiwj+?9dbkNE=a=\py<$6uaIkb<^hdYuGV+u6X:L4A$1Jmta1\XiC<iqw$*t>V
Vpuc=k AFh#edMk+*D9/^ktWDnb<ZyRVyuJ>Z*db>BCjTnHQB^DV:t*QRF@&BK:9\V4H5CG*/\u\9aB#d!K/jVN
+5Sq%a $/bam>&y%?mhEKu#m?NL6^qw*/!S*@LB*mulmjLL44b55$lZY?\<6!\+B\V8VbB&+@w1!w#Hje6uM>h9
E*kSa& D>EXlLk%Ni<c&l?PL=W5QwWhl%Z4%VT55eVHJ1S%W1N$6%/cH\n+mi=&aZdVTdi86yhQ&jMnTXV+q+d$
E&<!5c :6dLlWkj9wwyn>?\5&!SiEFuHiaZC9H\$T+#9QlFX>#HZLa<&Xjm+*>:XiewR+!&^d4\tL:G1c=aW9K=
hYb%$\ +D9<w:J4>#*I<>%bBY5M<@8DmkeY9Sd6uM55?6$wlWHW&Ea>ek5#JuNp:m8^LI@5tlwq8!pP5?bD^wN:
La$!>& KBPLq^#cP@*G8ub#K$dkEcY1QMDCLLH<</RY6nqRYlhDcX@CB%+Zd5HC5QPSPl<I+aNt%@DCY*@FTZ=!
5/81Ih eXTY<dW*4+PV*XhB#4$y<eiFQyVqiX>t$pq/%E^/6TuQJAaEFQ#8dk>clH!J$di<aDEQ%b@&91I5LtNZ
I\&Ct% *%q^lypJu4=9H+dj?K4bW\9G>Zp!wA?hS#HVdkqekN9NSL$<e^RWLu:&eV=MHBE4@QB*VhnBq1Yt*iBm
PeCG!* >ta8niJl>I:Qk?6CA*N&nI<9En1ZA/i@H9D8d#m/m!BQq/daAZN5>L1l&b>&E?Vd5!Zh^TbJ!d@#u4Da
$d+!\p XYX4>tTm6#1Ky\Jl$LTe>MlXH>TP#wu8Ztdc:IEqi8Snq&8WNni?uNY%1Mn=>dm4YbTt81!c!!V6VpHl
aQlLJJ &9VZpm?yX<KabW^NWZe5=9ZK$=E&qy5Xy1jtw5mN#5d5w/E$9dw#d*TZ1Qn5tk!yth/D5&@tqq@pSaiT
8<?#pt :l=GSFX/l=SwcM>4X%wGik?pQn5q9t8*IqyDphyMaA8u@GAV=wJj#L^66q&>Tw/pV#QKj!Yk9ubL*P!u
E1lE9w >8ni9YeJ<Ph*Ze\#^PJZyq:T#5SbPZ8y<BKBeqS9MqBjNSCC$D@nHF6#t&n?RSa=</a%A#Su$$EGXhDt
@+wemX 8F:Ed*Adw1q*M#V>t86M<Y%uj?/N8hudC?<PtNywpCWj>BBb>dji#B*p!9Pchwy<KyY/di+6HG@:5Q6k
nlhIDd J*%8\6nY\*n/*9NTS&Sc!LW^+=9jdu^qwMQ?TCZ>LHS9+:$i\i+b8!Y$@/e/F81%6ZC5u4$:q!ZcK@jk
-AKL^l 0004ecb3edc001202b3 Page 432 of binaries1.zip
qI^aWA ??L#DbQ*Fy%DFkH^hjIH>Ca64P6HDa8%N1d>G&jdHWa#eLQ*#mQ/J!Zn?^uQc<m>Vda!Rp9E$P%:h*N%
ZBK6+& w<C%J&4QmnH9VY:Gy+$qe=4=5Z616pqB:8aq#P\u?pIF+&cTC\8d5@Ji:G#wh4!qSy?SHyL1eJMt6^ZY
8\6^HJ 8$cL5Sj4+IR14cwlyVqA@^:N&=D$qAPNKBjNn?D1tc*pqP@%ewiCjY?1*hN1%MPH+:cVe4QhlhTjb!Z\
dtHFqL B@j9t8#:A4/:Yk%/=yw>$%GQ^#5*uCX/?&eqNN#M?y1+L$<>!iY$:#8hME6ZFc/idyI#%S5$&w<bKZab
khCAw+ KY6<*%eBD4TqMRnAipyq1=BS<q%9yVWFKSmNu6JXq@u!H*V:m#^J>dh6mWF9l=4PtPpS:#pi\kQ%Q/4i
9e9nY= L<:aTNBS$:5PB65aQ@al8eeR$+CS\F8yNd6NV=+T*IAHAJ5l=\5*QtMl5QcRFTaVjiqK4DnSX1iG8Z>!
qKW5L& pZE1yqEbk=+q>l$eSY?ejNkaww:6nhaTy6&t^SnLlhYiiEu1XhCatMVhw#MSCjdYmiB4m#M?N8K&k4ZG
XSkNw* wjhD\bY?qMayGQHyD:NSNm:YmQ/N\Rh59CeTISQNilM^D!eiZVqIPjTyphb1P!&dQ6\\wpkKB&>utA:F
CRMCtG 1FPtI5CKCK<4mPcjMNk+bX5SS>9hPa>k?@=yTwtXR9j\VK</P\@%M#><%Inil5a6iLBPeb14Vh9GWh94
L@@uR\ w^4G=t$#E\teX%6c:DB8b?+IjdIC>4%:C=udIQJ%\W<lCTS\aJJJeuIw^t8mI%kwc@TS9&G+%<Ml^G9W
FMM+^^ kFa>^P5h5?Bwkan*5/yTeD*GE6\CQ5/w*J?\BP\=neyJ%:REG#JSJHARd/5:9b8ZeueY19PW$nWRclYw
:kK&#4 *P&QiHhP9G56$^+%eD8Yw!*D/V%^>$+%=6^kyV$4kdkl6:%ZjV+ycu<h^qiERcY%iIc@I4tD%4IIl^$N
!:aFak 8qYabJ+ElJmAAFbcId&\&=?p+ltjPEhql5#Ll^SL*d/Jd6bRC1Zm8Q$>&4SZC4wu%AdF1LYnA8:&B4Md
9pS<&u ^dy\RWyw*Wtq6DH4W*bB<=!DS^Vmy#HXI:6CpKX+myY\WFZ^^1NpE!1?eZ6?<8IaM:9p6%HTKX5aE+\=
/<Zyb* Idk@t>QP#TG<@#p9L:N$Nw?D?6/5yJVY^#ld\IcXcCwDLa6&S$%\EQ+G=AAE!N148:91wa>D4T/+4bYE
n&1=%B mtCVn8?M!*qM95WKPyKSi*G<<C@ka%iQ:W5an\yGH!VTHGku@nIAa!&*t:*86@$\jYTW@DM@D&JXe>8I
GXeZB% MG+Wu*Hc<yKni6n+SMt6>m6tRqynmn4JjhMpX1>HZ&A>&#uVq\:=n8Rd@j/Vh@Jt8*Z%iA<Wic=c<$1X
Wd#+9y X6KREFbH8%RPtG^1V4+Y9<:Ki/RSJ#SPG=eSp9Yt@VqCBP+F<LWMmXjCWai=N%eGyXWiNtIwZmnZG69S
ttNYQW @S^ITyWK/$*Rm?Tjq#k*4186uBM?LG#4#H@nRcuG6>yJEihXE>Ybje=cS5<j8<NV<dM8w?NN&>q#Vc/%
LTD%^< ?c&wVnXlPnnPXJliMQkMj*CWe#bu$uHcST6j>q\wHHqLdPcwlVYhnqX#9\lw*8Z6+45cp9@&j1/AcwjR
N$&/Eb eN4>?E<PRc&wKyV?HD/a&:peYbW:?q/tYqH^ME&64i4i&YYlc^Y?GkGpy@M+6eG:=SGD?J4&<:5$tmV*
#:Zi1> hZ#hSE#C4*14*Xbq:E*4^L!KB@KBkGT?>*\aFLRuqcSM1m$T\$*Cp#*=?j\bl%$aq<%hm+T\P^:lNd=n
6N%<Z= QE/VMwjeT1Z89$#:**k^nu/8KadFp:FI99Zlp#JnYLkuI856Q9$a$\N#d%FQB5jid#9i8?LZ*l1WaB$R
^WnW%l \V:k^1>\<y\W5mdL8B5C9Bc^?FlGWNw69MS:NGy*WhFZW^bFwlIiAdpZE1PhdY<?F$Ln$m%*<WcTQyw^
/@N<1q nAb^i!9/uhtHm^F>I$9YHTXHu%4>?XlaXcGen1c#MN=1I6l%YJ=^JN$%wTbW8@HiL4kC/FtVJ^H>!YB^
?M!wy# 8%ThIW&X&B:QpIjQAaI??4DWeBuVMuy%5d9S!&wn>dpKwd+j=dXuR=lyPT6w@IMqNjtuD^qJ=D4i5hDV
@?6dEC YMbp*>aSb>Pb9eZ>/a?9D&t1@V!tBNqa6@9Wd>HNP1#^p@E<&\<bL+&=L:Z$C4W%QM9+=?R>\>FF==FF
G\ypBc *FE*uK9hji/=D$q\:^@LGm:/%b/=p*%9<54hFlNab8!t$*@p6?E@q4DyStEZ+l:Z@DH+@cta+L6tnGA<
jq8m6L lt>D%>^kycbt6qH9i/MihPYJ>y\%pAT:/8inELtQ&cXLGdM!?dALwaNDu^F=FVceptL^q*YhK&Qt>ZW&
i9Q%WG @qX&5V=pdkbRYhnkXc:ttijy@Vu%j8#GH=e>\CREJn%%Jt=jjpGJmNWIjkTY<ajjHNak=HdwF=?k@GHK
XY8BW& mJT8n!Tt#:dDhF:ljEl=89pV+9dR!/bFLt*hu/?=Ay*LSNL>a#8/QL!:9<S/BT$H6X>??J!TX8BX*M$a
1$ealG uBua4H%RGWH::nQ4S6JK!lijp9\Qh\+k/4T>aPQV/<EJd>1Ju?5XZKj5hKd6n^T#t#AFQG<uu\?&#E?1
Y%LF8= B9m^n\uduRHLJtqXbY6^Sit<wwbEI4Bu#B%%=<\eant=*=6TVX*MWYS%=:VV/KQ\$=Wj=Vc$IKlcbTcd
dXNHy> c/CpwhcWm%9^M@n=4hcc<?!Ln?JaWiB4:mNCSm!nbCZuy$^u%RB<4&FnyG8/J*/6/#lAJDF$q#C^DBGc
aPVk6t l4?<%%y%cj:>C\uZF^D5C^cd/G^GKC/=>cJK5j:y>ShNp4YY1ZEbVjjqcu^il\QL\5lP4QmqY:l#wH8M
*Ykj=a HV5bd5ta@J^:8QVuD@cpmn<EX*qqY?Be4XJZ:nGeb^:/8&Mt:/undVVDLR@<tD45:tq@%Y1:8#Z1>KBB
h#X=$$ 6MN>YKcEMq:\p>FSNb%/Y>TEX1eQW<:ZH*i+5!m>V45cqH^$=Wy4XI1ywpF^!ut^Tw>m::CX9T48bwb?
MF?9/Z %yV8lL&6&dnBlL?#i#<==mi<eqZejEH<8anBKPid5pVyA/?M1?MX%Fp#A1YYG//ZJF^CckI<#pc=F1S\
Nw%h8T S9<*4iKpIIBMjuJ^P<!?9&P41AFc>54Zpuy^#mtwkKW@@G*TVIJcV%MGT=m9nwKJh:XZ&b9\KHL:!XX%
*1@?CE hq%qEQFXb5MCY=4md1L<&TA@mq#luR%TSqhH&qmCpe&dq9F5WT%njjae:Y\/dh@N/V\knQ@G5XZC^6#?
9Z!#!h JJ@t!NAEi>u&YnSS4YK+%bXua5XR*6V5&!9blHQcDR<Int<4c?*ktb$Y@Wh:986VGZikiW@G*^Y?c6>p
eipyBC t9yFZ6<eH<pJJW8bA*NcH4&i!k!i&4wSahW54>$PGh&Zbiww/i+ylZ#wnNm^$&**<TnSQ#Tic\AGt+jm
8c5knS ynyITd9L*IR:9cF$AlE*q<@<&RJ>H8*uXtZI?jdLpnFXi858\Xde8tX1*u&<B*l:X:&%mFeB>p$&9&WF
*ptq+j DN+^nlh8=i+i81Pd@<VkmbDu??SQT&y8D!ca5*/Et8SQaATXMEKc$B>E1+<!p/>?S>a@hckl&RJ9c<?A
5ZXDyI ^+/iVD?WY$81<lHITeXFEenjPk4^cXc%/CTHMLyw?#:^+&=>yRN86/Y\G*WJQ^e>Vi+CmP!I>:QhjXPY
V8b:LR >k%WP<:d/nF$nW<AeTPlJKkkcQ6lKLR/?\/h^hH#%D6!D&lL8i<JehpWyG:Lh^i:eZk9Ji@B!GK/tl!F
=m$yG^ RmApNpbn@eIq:!LGE!NENYjHVV#HjyY!Z<q*j/TSHq<mp+d:<9:c/+wYHib9<VD:%#iCH\:HL\$@XLwm
/:YMPQ \Pk#Xqn^y5Xu+\9kt\D*a$MbbE!p5HHI$!<@M<=/\YqPalunM>heKZ5=#=CDGB8H4lNqw>juV$qtpLHH
1>^WdZ @l<5u<ncnQ@aD9wclE\KhH49A&B+k9>/#YaaS</Kw?\j1l^b8kV?SZZD9@58@?9YpR\eJjQ@R^hJYpLt
Pw8d$! j<yFRtL?^WXCT9%tweN@C5HTTQTjGEdTE9>mS9#:J9@H*PM@N!MpJj+iK@uulyG$yPS94Q5ZJwkp<ni\
DS$Q9/ TMp@^/L?Hm5qnjq#LQw*5FJTj+/X?k*5u:eipydE@D$Ynj+L4QVja%FI/V@H!9\>>m@>Ipub@\W\<nia
N9<V<a >R?H=E?^p9<L&N>lq8Tj5\PJ?l<Nt@>E@yhlk@pn%1V?mNB@GK*@d6n<X^d<9^p&/H<%dJDw9#utj=qA
YbyiAk E9>%#Q<$j9=^#Q>wI@p@HqQ1V:L5@>G=/t>NINCRE&EeK^Gdt1BtVQVj*KAcTY1YcYhmRYeEM#1JC^k>
5M&b@> *8PQwaatA1&aB!ZRdN4+\htiTV9bYQc$XmAcG&iYSDE?^K!P4%eERWty4:pJaNH5cSyDXlI4HmI58uEk
@5:NS= NX>XE6p/XX>kCWMCl$NV+Z8R&tP5EbI?D&yMLAykaH/5=4SSQyu4A8=LVRB1S\=:\ltjcRauL=#hCC?u
^\CQSa HKd*^4:&q&^VSdB+y&i=T:Qw:\KLP8/t&+Qe/@MDndyIJJlNJ9LLnH&NXPlV6aln\*e<^PlyI!yt<+@&
H?c#Eu k>iPy@d$Z>AdlWtic#4Hq6iYVG^?GFXW8@tNwLcYhm$1jcd5jI/iHeR6X9P6h9&C=i6YJ6@S$MGY@^Vu
ba1n9C Vjl#^8+?y*EV5bRap=n!8wdX4Hy?e8iWplcmjn6&RceYd%c+L%jZAl#HSVtF\Lqa^YF<kneielHhlm%1
YquyPV 1ACJ&TXPPmVa%HT&Hye$Cu$QaShJh:EdRFHw\F?SA>Wc&iPBL5X5<5+#e=n$TkEV64=a#!HB:k!>6m%B
N!/WRZ Fi#4#ZK@qVL8FGy&CtA%bRW<b=R/%J/5bVQJ9%=<E?DNDy/mM?mRMtanaWacC*9Vp<i1FdQGA*F9%SIG
n1GPhJ %Cy?GG&1N#QQWk*h9Hm\1X:FPQ5A:5buQKCdi@IpjS>@Eh<^&V\<!^*G8AZ8<Gq<Q$tQ*cijF?jbFdip
kp\F^9 emueM68?H<^1Jmcq:YA8:yK%@nR/K<B$MSm::nl@AS>it/Y@R:&@mQbeRm&dXD:TY#F<j6XdM<>#!6ic
tESY+8 aW1hH9wA!8a=V+YjP*/JZFjteen95XY*C<Aj&9buwW!GlXS8T!TR^@D+F^mJX948J+m?imcp<Q:XwnM5
V!\hD% M*d:1qLi$JGM$RV*FP<1qV*%=q!$Sn%FQJ%IQXLPyG#Ie5VM<*l6IpNVYH$b68/@yXl??/YkXX=n65<5
9Fc=c& w#hb+ZMYWWQ4S<HtVpIWl4bhl?bmh:d99Wd9w8qZm5+nYq::Hi9uG^PFV5WK/HD#k:kQdM%VSy/jRTpc
!QXdF/ eD\ZC>W6Z&unH^k@?q:y4IJ>pGhMn#c:wPLTHZ#@N5k5c<j$p@\G1&JiL=MRbd8I8V4pk$%=Hd=FH91\
Yn&ljS :6^8W%4@h6wip$FD^XM?6bB6m!iht=p$mHnm9VTYqG$Nj5&MuH\>ihP4jkw5K=ud*WG#*cLKnw+R&^Z=
bhd>A$ *lY#&@e%>Nej9QENm<5?Z51pmNDaiaM%RuX*=m%@kHJj!SS>8%%t6jh!RPP:W$cp+FXT>CAcaDMG=:d%
=HjFT% \bcZA5&!PDIyZF\u9=l&9H%B@AwmcX^d>$5pRcTbRc=dLtA>Z<T%b!bci#=!aw6wMN!kAj?STIa\8b/k
EhI*8y %YdPCu!NV!+F$jQM4RPMWELahc95PN^RwX\MCQ1RZt$8whTbmFkDP#tb%=N%amPBF8Ph=qj:dPPnWwS!
KZClnB ElEVqnkj#5yqG:Ti%1MuYZ#NdJPVE#LY&mEwAAphqHH!$:un&Pc=6elqG!BKTn*AXRpd\5Wwa$DbKt\i
V5&ne8 QM9t1pKyWJbT&51=4@iEqW&j\YYj=Pi$L61?>u/S*e&89lhwTDd9Gc\nBSRWG1$cLmG<!IGIZ^+FIXV6
-A\F48 000c7c7ab82001202b3 Page 433 of binaries1.zip
=qTtJp d9Mht#S8h@p#/L=#FDc/@X\&SJlXMqA??Iqw$ci5&pZ&Z4h$Vn&hq+Y@=my&\Ttq5y%n+?H&JIY\EL8V
5?/yit 1Z\Xwb*Y:\uJX+MHcqTDiDaE#e+8VPQ#8QuLd^e=pE+d*ip599QtdEniT*8lJe^E6bIuKSA<pQRaiFJy
J>=ZAn a9#KIdyHYtyenm$#^<:BA<%Y4eQ=kH/KlnAVbq6jeDDPXLpBV6V*N>n6XFw/K9DXudZ8??SNjtWNbW^l
$W?b*n ZN@\CXt=tVNeP>bY*kH!$4TiFDj>GB$68I8hYVS?1E&$KTLa!Yd5>a^Ct^IeWZ@iVd:w&tpb8yStQG4T
YR+l6b CL8n$jCeMiJ?h&+P+lYauNCAa8Pu*cPKEuRk5>j518//Nq%5wp*:pXWEi:e&PbbjRijp*SP<?*JbiqT>
RC\LaK MVtl#W*cIw?TR:+yE6Mw&NhM4>y8@GCXjyBNQh@cD\h8RB!4n1dp$TNd4HIT\8+&hK8d=#ZHtdQP4pDi
8Lyeln 1>QL>XqTP$Ra!B8EWA/=&FnE+Qy6Db4<TtPI#KeTa<qa:BeHl!uLB?!NyFi?Vp$>%MqLmd=LHiK+RZ^=
DP?lYW :eGItiC4619X:&KD5NW<At=:M\8idnGMI5n/DcjIQNXkuWS4IcFQdAbYnR!?1amD%!/%\i!Lt:yCGI6N
Yl+kp& wZI6FVZ=RmGhC/h\mbDAXGW4ZYF1qae:+*k\Caky^*cmSwM9RK=a&!Atj=DhMeKL/JFdq4&R!W^k?McW
*BTuu% l%^pQc?Sdd*1^wIubmCRZ8^nXS=6//G$>=T#nyRBE=HP&RN?9<BGnb:44+#u:c<cjF=LH5^DpSjYLY5J
DC!$Ib >XX&F?Ye8FlyI!KjHN*>!Z+wFF%R%Nd@?JnbbX</T9jJP&=KtYba$h8w%I\FK/aF@@MuNHZY4$%18Y5a
e%Ht1# tF^+b!e@K@MtN<tcK<^d^wpeiDW8X#yiQ:CKZyP>A4bwjbG9&b#R5S\LCMlytYIuLA/8NP=?8h4?<ph$
Fi+^8* J8c#nu61<==*W1iP%D9P5dd?VNmN*DHj:\adP<5mN+ZNI*kpy/9buPlX*WD6<n/LIydNPW>8!bSIctL>
#n64i% &up>X?99!nhhjY?u4&jV>ZKFWMd+S5hN9t5$a#*5:5+HcKc9#1Qhi%w^64/jV/Y9:GR:9C1WE:NiCw8R
*^k!hi l4uhuu=HuR^S<SX^K@eG&ktae:5NNNVcCjGkEyI6GkNl$?5hN>#1mwiu81Y\%9iXKu%yte!ZqNHQX4T9
Ihu88H meWu/?PuQ%jR*^NeBK/\!d:GtMy>Wk<^Q*pwG&CJ6?6n@KSkPMEkw#yM#wM^cVn45:T45a4Yhnlj#cw$
w6q1Wu p#cyT?X$/N<\Z5uuBt+*e5W=*FV@aPYTDD9K>:belPY^u\&jqA1\ejdj4^DXwt5N+CNCH5cRE>?=hm1=
he\Ml* c5+4SmlkSG^ai6*1TqTYqm=Z#:HTbcu@Au^Wb*D:qZ*cc&ISniXc<wpeHTYLHZ\p&bcpet4diTP*Kmm!
5l5AKW ^jK/h+>Yu9Wh=d\G<?lHq+%F\q99iH$D*8cF5K9NiHTYVZ@KY?#>RH!lh59yeRquFYXnH=*At<tcl8yW
Bu:5n\ GG$tWZYC+P#e!KY&wJQ:%JPaYQ#EcMDF8pjN!N9GF:#+A\*+W=:<&CMVZiDP1V=l>+T?/Nkpj<i5e6Jk
/N9nea nNJ5JK+=Wa?u:bDenNhpYCS$liKmSTV\$bHNp^1CuS:Qp+!D8iQX9lqd+9VkIb<Fk6lhZYDlh#HN=nGC
RZ4hta $Wmdqh?$w+T/MYCa5t^CD%K*Iu:RR$E\=!$51BcdJ+MQcTAVD9yA9NT\!t8%LwMHD?A@*GDckDQK5pFL
M4h^jF k#$Lel=FN+N/cuJL:#b*pMXWT<&%ZhXY6=My/miRZiVVB*D#+$DC4mR=d#dXCHX$4aDXKep*$TX6cMMI
TIyHX% beJb\:Bm%kj1h<k5ahe<K6>i9a!IC1Q5P8dFpa*yD>1$\P?VH!+IyC8u&c#ZZ*n1^6b$%kFk/ZwV<S@*
LaD^dJ KH>P1P$d??G?\X\ZEn<T$qht*RL9mhE?j/>FeVLGWJ*p66$F%hWlCM4piX55Tta#J1?<tY&Se&8iA%ie
dlA$/a pV&?wGBm%W\JcyuRh8qtF#l/Wj9awtd8nQytaqyG6t:nMp$<ENmXZ?c1VX4Mp?V\SACTwN@+iDnLN4d$
KIFHWA HqR>9=wGL6S:P@u4\@1$wuhKXqVWt&SD=Mt9H&qL#JWFT?NLychhZ&5T\b9W&\+bdiPV:yG>I9ea4+&6
nu\/n? iTP5ty/yD&?D/$H>8NyChhKp4y\JM\Gn:E\e69Vw#bG&<LaWT>Y9IMDT15ky%$!IAJut+#ab!?*\T5Gq
piW6Ai 8Y#5WyD/#9$EEM*Fyb<5>Y!wp6d+\t!jjNIHINX*SeQAcCPh6R@BPu8!I1pwtJ>Sjy8mtAA#Jd<m*@%=
1@6\bL Vn$W<HCALXuXZtSidHcihYmjp4@jbH9<F+SIqL4*LCnu9nD6FQ!NcFCh!hFihM+!p!qE=+S\Ak%WNNl+
Pn9Rp\ @/CEwjL%:Zb#EXP4M&CqYMQHKI1j*$bHV$cR5ACFYw4JGc@J8CGJdlFyj4Yn^#QZY9GD5Qjj\CADi^>B
SyZ@!& &ZjmWq:\YRN+n1p6d*1MW$ma>Ih:$m?EBtnX&A^6YwM=yN$?a9lTmdWSeKGN\\@CtG1Dd%Tq:<6iX*C@
TA!lIn EcZNEBd1C8$*i5>HQ#J@<L/BnHQKHVM6$iy:aHb?$&?CjH6IXeJX+MNPNL$H:bFG?J%1Z>u:PWPtA6E$
G<kB\9 MZI+a?R^mCH+4A1$me/E%$QdwB>JVJH^DNy*NFIbJ%$jl%BGT%B?anLEJZn#IphHhXLcQPjXZ^k6T+kc
NH@S8W LPlpK&d:81Sjc<9NE\qXPDMSM^YAj^a=upI#<dcWZk6%DtuT^?=Sdw?QjylkpKLBucWKC4W9a5TbGMRy
I#mtG8 bEAt+EMQbTP\e?M=61FmbPGRwl:B/Lwnn^<>>j#+99&Lwpp4Zh!PXa/tR1&$pA8?l6cYGWL>&uB6?Hk8
+Xq@X5 %mVuC$VJCtTwqJq^JyGJ?NAJw@*=<aP>k9AWyHLMuG:DiJHLLa&#<+WqTc+G>\kdb<P8<ILaMyV4!hEH
E55Bn\ VE&<q94nKeuuGmn+p@e<4YyhLjF5FDRL4WGlHnV6pupq%p*M5E?ND$T%%XJ/a&8GyM+%u*^<1FW=cHb$
<cF5w> CD$:h8>$jYHCbpHTm9T>YLnNw66cImV%TLJipS&YCMlNAJHZjWb8/M+Q/?SFe6GwGl/\GkX&@P#RWe!w
RuYt@m 1$?J!SHDH/4h4S@1ku4:*<@u%Bbc15$5K$+aIS?l*5#6GDTakJY6PPTnc\\&ZRB4dS?QtqJMwEt5^5$=
@unl5y ?Ti##BQEh&EM^Bjl>%Q<wWK/QNZ4BuW<&4B$n:*m^1XIZRFlh:NuV8bS9A5TpjV*JJ94Z9Pa:S1q#aCC
+aX$lB uGq9Y%>ERd4GYBtJKWN#F#5*4E:DEFnQCRknyYVw^MJ?pYmCL5MLTeCa%SRLM\&VcIiH?m+&YANq>&HS
WcNHQq IVB6T8RDe?ZZ4iC*nmG!wtY4$E@y+w^WGqIDIXL4kW%W/J&j<FteHBKnp&L&!!*Y4ZP81W1kSlejI@bA
nPTl\R cS@j6pX8Jpu8Pn%SP%R#X^cwp#@V^yn:!4$t%>jbYN<<dQ!IAD#=YS>KtXE8\/eY?6pyVN9jheKt**9m
64d8V? 6VciL*/%mT?tZ$A4:ME:i?*u%#/uDDDh<nll8d:ej9*h^e<H$@ZiKPQ8Ea!q>#BIN%#d>J4Zb\nR>:$W
qlKESa MkeWF4cLiS\kVQmei$eHY/lVEG&=MMZp*m>KYhXJFQ%8a5!K4>F+=H4@!=k=WwZK^6Gb8pW9!end9VQ>
K<*E9\ e&Q?9jE+:9Clq%i:<?559#a\Zd8lZkjl4bZXi8=jpBlY>5h>?1<I<Se!*T8*SWFZ4jn5P8TmCnWhLX?F
hlBMBZ pXa4XQN#HSR+Che5Bb%<h!QqCp=^cTQ*=d:D=T?^=6dNFd18Q%JMTy/MMM$ywK*pFbRwnGe#hS5&HjVl
S*KZ\M #$tR!+Hut!D+*wX?w1&wb*+yPFjPSXwh6$T+B>k%Dt5KEDSEyK@tIpH/M$8!Xhp*&^VYA%h#4NbMVL#\
iPCIVe Rt&=b#hnn1VbtE+ykuNL#*y:8*FB<GjSXu/J*WE*h#@eKq541Lt:M:XpLMDcj@YtNu\PG8=Fci:IZZmQ
mbiZNw wCFlWiS/<yF+$DI4l!SND<Rt4E%eXuHA>ih/LlL#j$\ykDST?u>K^EZJ@I8Im=L?ZSH*Q+Tej=ce@qYk
:WKA$A R$4@5>TFSQ/=ZCZ:>>m@Et>SEu?Q@a51A&tW=N>nyj=C?EWl@^/Lq9/LhXF@n$Z>ieebcSV/::FI=F@5
/C^A?4 Yi495Z?yk/I\@/V@IcZ@Lku<9*VEj?l@cPq@%j@?dJ1pqM\jlQ6@WlI+!d<ukR9<I\p<c<jIC?M=1lcW
h4WXWF XhdbMM?1\W&n$t&GZp*SHI\XY#MKuu&ZZ5N^&4Ni!dIAA9?W/d:hJED#$aXnAG6mL$SdVtKdJERG9D<\
PI5\tJ aKW>Vajm#%*lHWw/Gq#$:dFLGqIGdhFE>:$=eE^n*%Jm4>Pq\I\T/R4>uEAPlEl$wNJPnHa/DZR>+S%P
ZCJCM= @Wb:k!4auL$Ew=d>DXBL!&8pqFHLkiRkA49@Ey%NL<GMmT%:9cNJlE%+q?D*ZamiTlK*Rh>bYbuNQ84u
+T?5R= ?aJ&#BlmJDF&/ttE%twi/kCJij%dH*C/n>T/InQP@>aHuLW!P6iJ1LW%ykpe4ji6eX//cYXuqu9P:8b/
bL\$NQ l6?nIM:tb16DTLhL%j=Tq:ci&M9PTq5#%5H=DThqpERH>y+BhD+Eyi&pF/I/J11La$%wp9hkj!EK>%!V
9aQi$A R1P*/HHu:&Wb#I@b+?=Jy^9=Lm*/K^^I9#ny6NZ1$Ih:\GiC:iJNyStt1Ppy@WGTYmC/J$:GD\M*9NpY
LZ&9V< #NDukwL%\Z$nyCm4bHRCXhZKm+#K\PN*4&B\t*pb?4!Zi85jFc<kDJwPHPnX$*p=tiTel5J=$1bM:uN1
NjJl!& lnV?uAMdV&*d9IpI$eNA5+?bX&Ym$>YwhT@ny6Kp>McNMM+1Gp8M&?W?YpddWyCS9AWLlp9/dmB8uZ94
m%4LhR \w%4j8Y<dp=SSma&jP>BJ<\\a/dX6Pd@a8?9w>yc&*>>qAIJqkS*cCu8BIlBKcXAeAqPeR*8YpydLMHh
L>Y#NS ySS*h!l6Ki:8BWy^L\Xc/88<:@:K&ihhc?&%#9/i*>=nuL*@anBG4yFu#n#JVP=4*9hueXqcYI^=q\cT
l^PJu< !aiDQZHLA&wayy99IQ4R%ba6A%j48C\\WiZ^N*yK>^9!BjwS>+X:j@45VPA4K+cT+u!i>G8Jqwt/*E=>
S==mG! dH5Mi!J<JPZ&tSG@G/@uyA$WKhPcHRq5eKDRd!jRGX>BkTt:ZWW5L6PRLDkuZHYKX6PcctGeTICL8c9I
Whp*#H a:>%A<i*189lVk#iWt^e!y%J5ca4ZuAp<5%S==LQEQL/NHIm<4SdYPlA&5W$%4y^ZN\X@INHi?IViMM!
:SeDBM #bT>@$:Y>c6LL&dy5%H1h4Qe*D8IQb<#%C1p1<j6W>9n=!tXyuhcEi4YST#alke*lSRMJ$=YK5=H#&kQ
l>9kqW 4FF:y#S<T$ZqE**#>8RSM/#6Dd>t=1JAlRQQIw$C&!DEuN41$\8hZFl*Iw44CGnQD4@@bQq<INcbdASh
+9?mH/ Sjjp@Nd^K%P1b<@pT=M?Lm*d+/E9h@tYyY9%H&WDG&<<dnDRTNA=LwXlV?@q#IY<9SWG8K@lPQFcW4bS
!y!:lj J!jS1Q+tmaCn1HbTE^%tVB1Sk*dj$D91^yBYTT9nc%ybPKXeCCa?hVt<cnS+FG\:cV/B9*ShVt8TN/aR
IIb$Xc Mcw8mjPh/QeRQuBe!XYy/VQ5uW=WJ%$jDm>#+/l<acpBX^1JyDqeYW$FSyJC1#:JGBmA$l>aV!4tT8q@
^<FWXh %<&#q6n%qmnajuTDweA@/?^4Q:h^eQjE<SVELX*99kL&Gy#Vck4^a19k1YC!8JACN!5898FlJCp=nu=K
-A\*E^ 00071b88367001202b3 Page 434 of binaries1.zip
CGl/eq m5c<mQB?QmH^WIq*uc*y?phDyuMdpt\*jIyA=&/wuD@M*b?Pt<lJnNN8XF:M?+H$yZ9^bk*@<%pIpHCl
MH+%ed WYKT5!I/XeTBXdXCP*:bI@bDb%9dq*+5I\!LFC=ad<JeMJYc\M$uP=XL=qLKnGhXdY9TpHBk<G9%\^d\
>XXu*c t+Z<uPYNb@I<5mVpjuSNm$hjd!kIA84kRc?p9JtydeEYw\&H+ipNMXT6D*KdhA4EDIeM%+clLqM<KhPC
yL>mm> w5MQCD?By/^4kWhVD+=8BD6ydyX!=W!&b5>iXN*a=i$LMDh?&?Na<:+5ib^F\&Fyd6jCh/IcPFV$qn!=
PA$Nae =L:mq\pAi9Au^=!Jt*B/L=GiQ+9hn&a*jjIK%6u9Y1XkYZn4C44mY<%1cXh8Ln!@HXHYS!wwyK@#PeYu
H=:R\V TVy9buFA6\1j<^cj$d8R*htPhC#KpB\5t%wFQ*%/#jARN5AwHi<TK#>ctn%p/>t:9#1Yd4Y?mH:^lwc&
Y%lwmE >p$N^W!k=I9uNPTXL&JG<T6e%hD&/GP$yQ<V/:I8A&VtcIdBpiddcdnE\dQ6SJQpq!dE&ZN<<=INQPV5
B+ZLYX =mNa*#I8LVb+DRPiG*CV%TDR^#QGtuLL96p!4dqRaayu#8R!1yIGeBnjeFG=%E/?\H\^:!Nw:eSJ=mPl
^$k/&M tX$G8l%@RpTSSY=QV6%>eldB:*1Z+*$a&<NnAiqyIa81BVZFl$I1G+QpG9b9\pCqtIPbcaMIN#CD5ncI
qNR!/q bWRmbt6C9:HTNiGunwJ@W^8LXK$#lbZ$j9ZwN9P#V^+WHY6TWIj:i^*<ZwH9E!KJ:H%*bS<HN6@GNAAm
j*wW4C mmidPuD<8%cX<W\6*m#Lq9T%V<XQNeP4iN&eM!<jPN?FNY/^bIC/!5ydB?<Wtq%cA+Qt%QBtLW:NCVtt
&=$HT4 9muYHKXn+yaqXKY%^QQccy?ZJB?jG#F&GR#eDX11+*!iX5@d*AF5V1wVe14StMlyjm^nwAqXiq$n8%u*
%1$kw6 4C@McH&HE9dW?9V#*jd/F&S6AW>>WD^kJ<%qX#CmMiF$?VhMwjpdMC9?S^mP#ktMet@@/NS6p14S>ja+
*X/w:\ $DdYCkFWG59P^V9&DE6>4Kw$a#4Mn*D&K$N9p/nKtSh&RLRi#Bat8GdHT>d8G#%tjn%lPtqwG^EnK8&j
!TbjNA 8/<=?$%eNk1+yS$8QinPRGqwA:uNkD%=+4u$*D^kHL4iKbPId4^K6X^d/je=<^JK8%yiiEqS8@HM>MX/
d?nb$V lb/Di^b#nt*85Ibl!<LL**L1B@kMtI/PD+PLWuhPC^\&kTp1qP!4jhe#Sq6&SKGm\e^EV5eIm*=T<?Z*
&W$CT< n/j+HECbA>cnpChLQZ+jHlWF&q>c*HTw?KKZL+m*WJbN+C#9@FS9@1:/p<m:!i@hLTidInhM<J?We@J*
tX&J66 *Q6C:Ne*F>l\/I\=9el&bB+n>:9aqX*&RC#wNaS!Q#y=t=hb^D*tKCA5FTjH9\h=u8Qu#=Wt<K^l@+YB
Zw:?yC cLyl45yXQuiIQl?H=<l5V5T4htW1l\J*ue&#*\/#pPRl\B*lZ$BC?eEwVFRYG6nmH/btKqyJYNu!XbWD
!p#R/^ S@#q6&uCV@F6>qVT^cWe5AH5!e/*u$u!9#pw?a&ZE^A=bu6!Ql%J\p#DEBF!%$NB!1j/tL1kLJKN^p&M
?E\M5L Xhq*WmDwG86$+&#R86:Cc4@G5D\@INGN:F#?lGTKAqNT9NhMNHWJK1N=EJ$JXCb6QWJVJItt:<yDp94l
SQ\FKD BZ8DJVJcmRFk>^@Pumet>StFDpe+5k^9==b<dS+TRNEu#:m?D&HbNT&IGIJHpBaR^>+9V*pI^lKW6KH!
H@My%h aZ1q>/#u$G!?nPPVE5bQ?!/h4ji1^@q1^epB6#?KR89FEjFHIpe$&VR5*Hmy&MaTMw>4^IDHK9\d4Z^h
lVCLja XqYXk4BX\WmC6jY6ZkBB^Z\FHn\ytpAT+$WtC/\Q$#5J%wu^9A14Ky#^lA*Z=JKeXFebZ6aTy<@W#WLe
emC:R8 4eX!Z8\HY5a+pM*a$nWtMwXk4Cl?Nj@nmu$C%PS?>ZEVR%/M%iiN!9iRNwWT/#m$SIh5RM+H1E9qW:j!
l8KY&= uZSyuB1<E?%N&dqMCnCIDB=jJNtkk:j<WI<n9PAMFTuAeTGe8TQ5K6L>GKjJXRY?4bBl\G5MmVaEamhj
8XREE> DMhb%^hp<D6nTlY+B1EnpSHy=^uQW6Ii>JqaN61WT/nl8a6KamXMV+mdb&>\KGLK?RJD8G\e4K/Yy\#%
RT84e/ T^WIin\Ak%a\6R%EJISEkNi<KwSd:jP=+ulw#*q$alF16/H#+^8C@VVhl4^!ukV:eH9CcVq@I8>!*kJ>
TeDuF/ uqtjcdwTZ18a*t<?^W=mjNSm*1NaEpeT+cbQ*u9F!lakQbb!?XdS^mwiHF1eT6@Fl:kejW8wXB=W5Ktm
!tu&c< #TS=PCFY!yCL6dKp6RD^nZ?LnIteHZ=PuPGaa8Glb+WM/X%Y>Fdik*+Vw?SYCljZk\V$C*?#NTHdC*8V
P/Zbb5 Mn@W6I!Mpy%QNBLZ6X4R:pwc=HZ\juYS?l4l%DTtN#*WQI@DWTLS51aE:&GX8\TkS>J:F9Bm*jSGcTZK
BIwKw5 ?b=#+:!BXyL6y>TiA1mijhL\DB*qS&B8VmYBVGB$yn#tI?YpYeKMC&>=GGcW:8HtD5Sdj>CLJXcLA#M1
lZ5t$C C+\^!aPYFFPLKGH+Vct!yD!N$:%!$YLe+h:C4=NiwnHDZYHBykRu&jM^?J4SqdnJqX=b>@CR&4MbJ6Eh
^YqYNE VM<p8GjYwSSSQ58mQ:&qDPT+BHa4yHIHXH1k\^$hTB9kmn*QV#5YFVHQiVH>l\W/#q9che^m^+JNcb99
m5bS:> SIaZhdJ$Q8cD?TT+J+Y^a$@P$YCYD:ucR$MTTln4KeM1hT*\jKiGucl?Kim>t^<b8h18!DP=HZaWH/*/
&*C?6Z ITtYY&c\WhNAYVbpjt*:CP5DePMaDDiIJNZ\wqWB<K//mdM1GpwSti!S!GS5$\SYHY9P9GGHDIu6<tmt
#GmPd@ d8yh@uA^mIcZ!8Rj?VBHCQjPH\$6?H4:Bd?t>#MI#:%4t^h$EDT>4cHpl@FyLVZwq!I$MNejMqqM=$<a
iPYY19 VCiuNVW4T=i4#ZiQ*dN4qRII:/%y@tlWZ>ia:e**B:$wt/<=LYtji4JDZSW:5GeJ#Pwp#q?*Y1:=?Et\
nM\V*e %+\9ZIK:<XjJQliHZLq\!t?e\$iZ^j/p19\@l^/dVY\CGM^WmL&LQ#dkRq^lQdaPBBk8@/ecSBpB6FTj
5uPKaJ %LMk=XL&6ktDXmbVSByh8B$@Ln8Wwu?/6>d##%Wu#6=\Lp&RyuG=Y$Si!@lVll\jn<GBkaSm*V=K?&DD
5=LdX& QqQH8c#uWR9p*HK/nhhCkD/:?npPNaLuQd9Wu4=&WPly&R5R:8M6\T=VpLBYDhSba>MptXE9>T/A/4**
/:9e4? wQ:DM%NB<VTVGC=cyVIZ$K!!4t!8d#1BF/WKhDmR=/i4\KkKdaw%4qHyI:NnA/yBnXSQEGa=!?BF$G8P
F!5!5Q daWEWFYZ^d&bbkjGQ8idLpCT$<8Xt*MwpTj!\H$njJmknaSE:lp+aTM>66+DFn$ScLXm^M@!IF%:=%iN
ZpG/8+ =Il#DYZS1yjC%5/IEP*4Wdk1k#/!S1X<FN!?m/=J<INH<>X/?<GW>Qtp8Lk$IlJtu6w*<*NFIB88wbpL
*cy56S uJM:q?*jR6Y<IaH5RTpcBV6QhN5*1>EWbq^/qtQTyb4nRD6@T@w#Q=+%?j+e*hk^MK/mjQ4b9cGk6S=H
mItd9D HW@wy8Py$>Anc>4jnK1e5WTl=t+T>TLecNyZAbY:Dn!Mlwuu9kN!1!j9ea*6Gn#kKCLDJGQH4/yu64dq
eEp9E6 acPG=V!jPMdWu!#c^>cT6*<^#D\J5lYwTXn+SNl#GX91c\PR@==+98LC#pG9<mSNlGV/AZEn#aISWG@d
qF!uaS MjqCI6eZ<%8DA5*EP!W!%C8SGq:JMZ?KMTTiE4$hEHHN+1^TD+48eHEN&h@E=n+puI%tbE9JTI6\ZhSZ
kYl@$T TqKhW@bB5weF%\S\>pGLqjS=AEtVpBqGu\>dL5wT\JEG1#&Kl:QEwBakM6WiDpSFWXmKSe+a:VW@AS#D
TkhXPB mq*L?V^le:jk#jZbl#%a&ny4/DY<ZI1E%nJHLP$a:><X<j/bbCKM%4@WNV$u=Ak$u5uSnNH?JBAZ*j\5
6*SC6n i#h9^iT!Tm!:aC#:pn^CDGA++T*j4&M=6HN@6t5:*D?M:6T$wk5@wHlJ**YhmL>WCTlPS\E9A@$LS9Hc
QQqDNi j5WXPRpq4$u+XSTuaBAYKDKKh@Yd^k>kJd%c%p=Yd@%W!6WWn<*W8Z@c^ljH=*pP\=hpPT>ZZZJh!/^#
Hm#G>p WJetk5bn/!YGNLwLW5ajPGQ=p$L+HMw/9yKljuLw<&R>yKZ&6jiC*iG#d*AAkFZX/AycW#!a/atl</8#
\W*6BF >ludGRWEl<w#DCaDSLYNN?R^n5ZI?%c#9y?<L\dmc$C?/jXTnKCC\#T4ncQmAK/XWqZdb<STWqSIQ#>V
1FC!M@ /8d9%EBFXe6S*j6n*&$yw&WyLHV6nyqkW?/w9nnHnnj#4Y*1B!+BFDbXM=/j+XGphNc^pe>nKa^eA&&4
<#TVQt 9*j5*ZRT?YAXuR&5i6u8b6Mw5u<*81ttXNAT&%58=CH!LdlPXNaCT\Bd>4Vn<mRVVbNjlFYP#5ucHaHy
l+J+Ed \b:HPVdyem56aA+Ncpw?h4Q?d*u^qA=P/?pQXbLt<n<=@Tmke9J&cy199RqnjEY/ZcP*@?QlNTddq&tk
PMjn<V 4DZnnlR=!bRjqSPN$jKHICKKNJ?W?aw$SkQ!1<hKD$mLGW+D=jaXGqbh=A::JhQ>$*\Gt!RX&a\w4=@S
p&l>$l jqJ*@5BHE&eGcV5:6mPwQEu*D6iwALj%&\d=19cA19QNC<aNHh>YSE\<nK@EKmcW<P8YINK1G<$458Kh
LpciR: Ql5dNl\e145?wk4PHJ4l:@#1+8T8*hc64=Fj9=a/ln+pG#l&<VbR*:5#59aLe&&nMiGV6!ehX6%HL1\@
1jHi?J 5Ja1&QH6a+EHl>!pdX!@H@i95qL%P*C=bwSme<cZPN?mW8&ce6:e?N=kSNl*!YFD$nn/S#8JIV^uICF9
mkl5%T JGXN#aB8cM<t#GAS6c$S@9E&PR<F?+?Q$beM#*q8LS9d&AIeTCT5IZhD1\a$:=qZBh=yZ!lQ#@yK5!m*
mL1<5J tdjIED1EYlL%YBu=cy*+/hEZbV5kykh^LYTwtdl>L!N!>FGD6uIpD@ZnE:V?a*qq$^DpHZZchHp%NK&W
LA/CHI ekN9Pc$MCG%K61t5u?yTMWkXXIPqJPZPcPeLXad=WQ5!9#P>V@&R9hdee!wbBQt&RQ!LL/*#X9MX<#cd
A9Z&^n XjCueM<N5u5<plEy^G%^n<\wLT9K4KP%w#i>1uy%=9dKIFjCCY%Y+:dJBwaJpDqW4QJ%qZSk\<>GV&Z#
Z\#clI 6qcXt8*M9aTBY^E:@11%Wi$tyZ1ACpBH#ddPPPBX!H8hMH&Pyi:hi#!5#kmVKD?b<9*!S#EdA$bQW8R*
^Pj:?R y^!MC\I/TnZE#4eC>X=h=be!Fp4G4wFmJuie9Y+:utyFki1Q\&JW/GITBL6n9/F&d+J?+#Se+8wwQZ1j
e@ElqH y<eL@hJS%9mAR4Q>dhXYXiBDWYV:I?MPZ4XZd8wPL@^6RtbB*@Njju1pKFV%*nV^W4PiHRH8&J!=9M1h
R&qnT/ Lbb>d?FuXZL$#XcD4EhQJ@>\cJIH\@Q=ESYDi/NK6iqytyD:T$iuF+NY:TK@Qy$&KNSqDCPa6twZFTJj
SG?TJY dcp#j4HL4>qVW\#*lHATCDDE+iZDc$kh?cE>pb#lTTYi@NJ!iKmiMKpdJIwe+up:cXHCCctMu=:6D4Rq
=Le4%q y+6Vcl\8wb5YaCLu%nq$!8iny&Qh*aytk/kLM9Vb?Wl!qHVy<^DhS><*kF1JM1pVA^VawY*<CLXBH:Yh
edqpYP Lkhcbutdn>qjll$A5KYV#>q4w+>966?$>=HcVRDV^jX6BwTHqEtKQ>Qt>bcc6\CK%&YN\:5NuF?#b<eY
-AlJ/# 000f27e919d001202b3 Page 435 of binaries1.zip
^>A\B6 lYhF!%L^T=4l6<KbT8#>\@869:ETFI*!M!nZWk9VtimaD^qy<D&&+>:#dh*?@JCWcXK9NQ6IT/JDK/Fd
Lc:I%m lPueq$&G8P8:JK=uMCZ9X>c:+jiK4bt&/Y!&#QQ9PJL!Nu#jWbdMH4ceG!lcRbpZuDi4y4V8td@%dm:L
hw8S!l *dTbLHwj\^Lh1TJWl1>@:!\^!tFh^ZIdICyDuqk56pbA^!8RNa5R9=HpHqE8E5E\JaabZ58ZG=*ZjRa/
+NA#XJ LkK!>6u/IBlKK+K+mKZJ=lZn:$XJ!pd%XM=CGA4FjlCtF%aeAhq+9Rpnm4mV%KD#c5uh91$<V4:?8X#m
4eL64* ScaMHQWe4tq^B%jXNQ#N<y>nJC6MnM@RCl1>#%Yh=k\@Xad^X=S^eQ!Shjwd+jH@E&H^j%5$TW4>qYlC
l&i/H4 \1G@F$$\1h?JJln1:+1tj#eG@?IlaL<ZQ9@l$j=TF9$?CQ4*:J>J16<HRj?iSWn<<d*e9\?C@n$4?eiS
R46+1Z C5njB$H@uyXA@eu#\9?c@XQl<@5p/D>a6NTjuC#p9<kmTct@qEZ@eaQ+Q&WS@Qel6Mn@QmH/Q&YSPB#/
FKm#Rk j<lI>kM<=@?mpi!eKq59#qlCYQB1SVWAwcp:5$W9QX!C//wQMSYNwi4<BY*\ddq@jD\YFtBE\F#P*=aG
cm#@+/ %ZM6JHDmQ9^M6S<4:JdmlPW*PwH*8<$GAaX=?FjDd^T%>uCEh#mZ?p?4*RF<bQ1RiNTdEwap>Rwt>?@T
S<#8DS lXWwbyGSHhGcmwtL:ublebblPuSmFkcKE\p<p/19=Q+kW*6j^aaFS:G%^$Im*KPu&Q!??/AdB^I?/Yq6
k8FjQ8 mRi\#qk4jqYwQTE%cb<CB$e^/*A^#h#HyIPJ:8QAFN^$!lS=+*R/lZIu4^dySn?1%j4bp4e5nLN4G$JC
@G8u&J 9d@DAITQH<tD@GJN>S9Wc&Zc+#?tC!ITY8k!6jF$4d\VWD@MwT4<W>W8+b^t5Y6%1WiLIN9LwwKwm>w*
RE%Jin ZRNT5@w<n^lBC:M4>?dVb5<tJQ$ub4Rqda6lT=8LS%b9#GyGn:$Yd1B4Jyc8XK+thMS:n^Z8by^?X=JI
KmlZN* GGCZXV:?Cak$QK@%:61GQZ+k9e1+AGDWnX9Q8<RS$W5tAykuHBEHhG<du\GEcn>Q&k5Zp^R+?TE<M1hd
65KA&A cI+a6N9C>ylu8J=FMq4iXqKc^H\bFG\hHbc4wLeIDjPVWt#SL?Vttm8a\?q>/TPe4cZViMC1<*dhednb
YN^Y%5 %uQEe4dD<Al&qmec^@LQK!dDnIly\>KH1%ydDy6PAnhGD>ccyM<?iYXBLbmMaXNG9Wi%iT^98>$HbGhp
Il9>^* >JB/m@1J6*S<4PZPltjiiPm5+F1+tL5TtunIy6AVh<j8T#:?iW<=wL4*&Nd\H>>my#^#&^Xii85NP9my
ViecP\ jdhaLZKuECJpGn=Gw?W\:?^FqD*An!mWA:@yehW6@+n9&Bqu#dmuZ5KWp$=R@!at\dK<5WtCMhlP@hG%
BVTAcc bBIh*b%\p@=*99RaClRL=+=u8+:6QEDI:%MZ1TS^m5IHF@9DcltFlk/>w\RSb&9*q%\t:bwWy&4p/>wb
556WLK =/MY6>IpdRdS:unnmJ@*Fa#lMSKkJ6%X:P*9ikEACAE#Qt=Wy?4kKY<C1XDGLPF#CTcl$=e$DQ4ul>tZ
H5aLX= A:G+lRYbbau48iIM+Eu$?=eP\A$dFwSy*T4+V1bF8/*/+KNG8/Xl?t/ViDKjBHh\X@$KZY!^%AuWY$4?
\De9Em #8^ZpmIZXY?*4<\Xl&BY@TlZP\yjGH=#54Hw1=KwZhRJ#?:PT\nFwjAkGTP#R\ZVA$G$>ptWNJ4Y?Chw
i1yyVL ^mQG&c1#*AaQ8X@$GQ&Gl1my%aSe*#5q$Sw*Hk+#w&i15Nh1yEMJ?nGb4FYGyR:9i5kVeecY%dnnTc\%
lRhVQH TcCnq9VBcpCNEtuNZi@!G*JKPRRF6@t=kDVG+RcS#itc51*5mIYTM#5!AVTVNFW?\<ttPY@Dt/#&+Sh$
ltnP$= Z+@=ZRaiDuJakY+y&5etnqKGlY#6bI^lhYaINdke^RGe8i#bT6b/*XiFXAZd1Knp>h>ER#d#td**hcA1
iF1Ny9 El%j4muMYS5e/1wi9wdjLM+tkGNy#:ni=KV1HIb@N/STVRp*ICM8w9pye6WpYNq55SXdhWjp14TkFbZE
#bwIV^ :5J%y@TeYZ8Pl%L4ibwD%Qiu$/n16epNlR!je!$G>Jji*Lji%?/m4e%e1^kVQ5Zk8CQ8%u/Vtt8F&4kE
caw$hM 5XQq8@!$6&jYPGPTi$jc8chNJ:J>8N%GdXm?uLTePnq:pBW^1M^?5/$X>NP=yP91QlA<CjiiFJ<pZ<MQ
YEa4yJ ^wF+a+yN//QqNW*>MVP?EhyHDZCG!QN4uYYW#l5D&VBeZJF<:8MZA=@CS$1=X>lM\9L*Z5wmnSy\lmjL
FEippJ iu5q5QI^$F9?V^!N/I\yESXVQhDc:RLqmWn$>CmdWD#YpN:k5PKk/eS8kn5RKAmcM/:1jNMdHZjPT&8R
?ZG!V8 e<#Fbb%V=J:&yy>9/#XwQp!Nmi^LiM^4A#4A+^LQRPlt1T&l^>Yh=/P>J^p@1EQV8?y^XNn^duJK&WNl
d?PwuT GiYaQS?J+Hm>l4=YZMeDNp9jjcy1LKZ9?di/4YJL45LHMA^X1X^^WN\K6XwICDFbKt<TcQuS?uHXA@hH
eDy=Kb ^ShHH>/qt@W5E5!SpL&V?5CtLpyRt59qjE&/6W5$k9y\8=S<JZ8<DXcLwc:iF^VCYY%E%jFQ*YtXXm?=
heiZip 1D1Pa*!Q4Ln#8bd?:McR8$pTqG#\F<M+W%%hYtFDPl:d>/SSV^X\kPGi6yw9w#L6PnRjcw@+lSA!$B4i
\\>Td+ YuKhCH=dEDT51/V=@tTQ@k=aI5T9?w&HncpHpPG5Qj?eZuF>\KJ#@PceW+4X$1kppK/9XC/L\iV#9XbT
u1LH%< 4Q=AZh8^:=lw@DNS$P^/NB4<!mt+b5&l:8YDu9G8?tZ$C@&8#ue/Xe/&uV6kCh?VnV8Y@wybN5<@Z@yX
1P^BG/ TXecbR&4>n\E9LmdmYR@PRuZ!B8<+#n6*>dXFnuKjDW#>Kk+&4Za<6GZ\jASX\F**Mki1FGVN4*B1c5<
$Q^SaR uG@+&m#k$PiFS8?4:L4dVXGmd&M^4<^XnJdmPWGuM?:XRTeJedEITT>5S6Ht888d$Q4Hkjh@m*!Aj5n!
bMnPwI PMq\9i#S=@*4naj648=/^W*G4CM4a$a+TGE?^Z*%cu1mPlGDXwc*FewK/:V!EZ=NTbL#anji=c#FwSik
>4wamQ T#u5ji<&k==ZH=!yhXS!PP*JBJnjdK\c%=w=!6RtccVDTjZH%BNhn9WMQyTERWGQ!&?kK?%t=J65BhZD
F+SN+^ Pj#6^kqtQDj=JMD%X*S%#GPQ=6npCn^@T6Y&:l>4h>QLlFcGn!pSCuBJ5/hADS%/X+:Si9iib%*\^j&e
&ItQum uL!qVSyVp!B+Lj?K/>C8#>HVe6eG4<D=pknw&IPhQeu\6eJKPym5m%C%ih:$6y@&:Q<t54u<1ymLpDT+
TQH+!4 c/4uD1Y\1XaywTe5kpSmL=I8C<NIMM^K^Ci@mtMH14KNHYnNAKpEeMJFQAp%6y!mDVShV6Nqulc/A=Aw
#1eG@6 S$XAKh9LdVMARWZaTFT?5?9c=4L*cA:5mApe&Z>q<?%yZAcaj>cH^EJp@!u\!D>E9Y:E@69t%mn5!QA=
STH8Hm >tCbEphc9Ty!LpS!TKWc^#@mYWp/#AJ5tH>/$NT%K\6%$LjWYKEGYI!Vy\M4P1qKb$n+wy=MB!w=e5/R
+T*YQl *KI1Z8+T\\E^F$Y8ETPa1Eu=DdIQEYIWh$mh#k4P:\EXw=I>:TFKP\Yd5%B^@w1QNL4Ra?IC^\Ght$Yu
Eepb*j TpK^XBdV=NZK?p@WlPFSF@dCCQ<c>!&!t^?e/A^^V+q+eySeKXk?qnu!KeFI85!Pj1mKmLwPcdJB%aAu
W?jayl JW+A&VNFdGIDw6^4*8Mkt*tE^4%e&J8Wbapa8>Gal^XkM$:?hY!#nAubbhjJRM>e?P>pXdn$6%t=Lpcn
ybPBHh jGhP696hZSyj5+nRbC1XQN&#ERiRJ9PyBPIi5M6@JFCV9eb9%RAIw5G!e#Pw?APVWC1/1=J9ykYLdd6Y
>qQ!$T qMLupX1<I^+@D6ZT^8P/buFYt?VAmct>RhA>:mkkcDd8i!V9X?euNXFJaSy4QiV=Z&cq1<iXakl/\a=F
qY$&nH V:Vm<l$q^p@T9k8YiR4/q%S9@BRBalLLbueKSyPnGk+G=<<GH=X/pDYF*$B*hTpHub:54JjdBXVD\LPV
Injjd@ l/VuE$t?MbFWd\i/Hpd^?8@t1Xb#h/9Lb&@69jRCQ8tQAw/Z8Jh1Ne%WyiA+E<dkEyRy5&MQaBRY*uwW
IJA^mW <DFaT+qhi+XEb:>uVPL$1Mw=tQVZJ!Hb:p9ykGcE:%n\1\t$tJ15q1Dma$i49Vpq>PBnPJXGpV&d@wuF
EMYXyA &N==WE^ShK#5mJJ9hhWpSwj1Lp=PNS\lq5I^6nplZE>kcy@W=8V:XV:uc=!@mciT*m+S<c=h4e&THMS*
cPhPj% V:V&#kE5yeRB%pl?C4Dpnk1iTEb!$M/:KmjwDKZ!yc=#We5tuP<bKnHLPjL81?@yZPm@X4WD%aR=ujJT
Bm?>EX Ck?Zk/uFT+tjJqjq%y?ZuXWh8kJ+yu4LZIWHc*cTCEcny1+FwlCD85NXwm\9Xh4=V?l1R\bEZAPhZiuC
VDE4LL >A$um@EN<VRnX4&l*whCckGmZMBeYp%qYNN#SdQuyhMF^K=?WSIXlB5LmV=T%ijCFWtnWRBTa9iyZd5/
>Yy@6C 4%%PWB+<ijQy$bWpRi@EMHe$*eYZ^6/N+/+i@jjEBc+y94tCcS?WSS%BQWeNNB%#>q$9>\lj/a@S$lPG
d>L=1A >ptM%ImcTQRJ:yZ#8ikdpnN1V4D%/<hNV:$YmmYa>iQmnlZlWdWy$cLyW<eiCJTE%wXNWe&d%tG4RGBb
IL?%=! \SBj8m?:#1R1IXlMPEiB%WcSkwLCibR>%hXQmp^n%+S*Qd4Q@P^Fy#I<ABF/<NkH&BHCkYtqly\:6I5>
$$Ltai %dK1%HSF!q5ml#9&@FSZkQ!9uAlk1^#<<F8BjdMe@c#q+eq^&j#^$V&CGDVXS$5c%!Nk$V8ccV5Vy^BD
Byct58 %XA1Ky6!L>ad!d5&Y^9QhiyI>bhXGyVCpnX6G4Gh9yZEHD4CTTw?5\hNH+PmF/WND5y6G1=B?%y1FE*J
iZdhP& 1a6QQ*5^jLCD86!qP*>tM!MhwLG4eCBAY81iqi#9Q1JJ8bmBt?HCy8KIR?b+aAjBy%wknmtX=Iy/kdBy
m!n6$i kV$h#mui$?ew$B^=STY@%hmD!ji*?k9GKbSGuZL%!@V$L%=kT1K?\Apjd%51Gj/G$W*Y1eiZ6ITwWc#&
RVwtaw m?jXyJn#peXka4?FK*y+Hn1Q^&R%u/!nV%6J@LL$D1GlWZuXyKD?eCtnSi:4NqcmN8J5et^&M6Te91$k
T=m<u4 j85b6KSd6TX:HJK@$KRuSC!!F?^KqqhIInHyq=Vyuuak!IE%TLQeX#wR&HV/jKXM?KMKh5Qe?WV=5:ja
c4jHQ= Rk\5l5<eE4d/EYpBXRqQS9wb^NNZ*%Plit>mL&Hq><HT=qjBkqX5/@eA#=BEI*iE\HI/YDFhQ8<81VSj
yGyjKX nHRn/dCYXXmc?#XXNZ<d:j$dM>NGTWu9XTVDCcdBR*dkTD9RAdG&hkVc$/T@*B+?>llbTm6bZhJ>D4Zt
uXKE%T i?HKa\>%/P%YXW6k5ma8c\$:lKMe:L:=1N<i@tH<AjcwY5YtanPN^L>pZBFTdyh9WJZ18/h&1G<?mk#6
BwuLQn *+i41$WQ1T8q1LZQTZhj@BdLJB:^8XTSjBWZhR=ilkbX\l:1!aFT6uTk=bK\NjiPHN@l4#G$qDE/#&K!
n<5@LF Tamb%l=Ktm^X1!Z%LAh$ZE#:@I!cm:b\Vp5=K:&XhSL+^R$qwDcyJ!MbYDNh\SSR@9VJq<hK:5=c!\wS
<u4/+m kYykTZyT@&\e^:LHeaFB\i\IJmeW<in&uE=t69#D9iNMQj8Eb6J\IeGZBJ=9q%QWGHLDB9Z*l4@+1=i$
-At^Xp 0006e56e3be001202b3 Page 436 of binaries1.zip
G*SR^D XH#y*m%:wcNm%Z\uu8<SVq$>Re>^=A8$yV1+M\N9^Y*wj9yIIqBTDHb5q@EWcKnWLWHG&GBQ>Ntt6yGh
EQ8?!Y Y86McaLmZmt:@ZtMZaG4@:t><<pSeD?VQpMIcClA&ydKiNRj>LE#WQmi\&ee+?a/BcLV1eH\jIDTwd#V
td=#4+ h8\yN98*+Ck?ILGd*YK4yHnE&$tII9p>buLF#^A?hm1J!NT!GD^%mj\lY:ZA:d&5^I+/l/CIH>TCH%I\
:%4S#M !4MCFa%Nn!IyKqKpd4e$X9LGpeDVbj8W&ZXG$4m&HHuXhQwM*d5<SYeY1qcHmNC$NRhq:!JjlDK%<AR!
Q4XFNt *I9aD6%TuB?^w?C/B\K&dSGjB8+hm=jLp\nQQTiCF>nuGZ#MKZat44K*kLmnaG/?>1Rc<KnQ^\uu&Re6
#&?paM 8&hBEulZ>^Lu:X1>Y%WJ#!KXamJLDP/wN#SQZqJ!yGyXbDYeQGCXP^>>#QPQu<aNpM<P?LjCe:hW<^=B
F@Au9P TAEE#Vje9FMNS?1eJe!QyF^H:EAcMY1MEq<T6%ZEBqMA9<F5kR=#*\+DyKjWXKJB*$&E>$AGnF*/XaPp
t8?Lkp V5LCp:P?NWN?=D*cW\l/\RJHd/&DmDAqlC4!N?$Z#iyimDi#:!\dQ=SL9BHW+E\q@/H#>5KNajR%m6Nh
I>yFGF +q5me*e1Z^pG=eh?iS</jQ/!GEpPIP*t$\nwnE:Aj?Z5@=dmEJtc%k+qk%^YPjS&SpIPJb/cIXaiJmY\
6?TR&A *XjAPeDN#PQ$=Cmy#bEp*P$4N<PqqGMJS9CB#m<b95C4FtFtn%L*jRSyy&A44#9>d&1=\Lw@TLeLLeRI
YS>jZ% VjWNtTM>::qJJciSAFA8/6^bniPh>+ic#eQb#LwiVHdL4YjR#CZ=GEl&j!n/aww@yW/IeNY4lQp4y!TR
ltlMY: up=qCmR=dqamadb5&m>I*$iTuBbMNRYJ+Zwl*XwP^Q=/$8%4+ZRTZM?1R&MEPIEZ/\t5/PEDTTut%RSt
KqHnlt u<Fqu+Rj<&4MuGS*Cba/VlpFaB*XAIY5?6p9Z\AE%XMQhhXwSj1#EtNJ9&b\aTLb#GjdwlM/:!Nq:1TS
qdbXKG jqW!8=hQbuZC9dem<1^JM&WhLSM^54^8CmCM\i+5l+1<hZ%Z&9WPWkViNdN?G*L$LTSub5j5n5^:N?q+
hyIlJt #h@M&q\CeVhcc9PP\PNRK#N!>>ANbb8X8/ed+JVD*6NN$=9:yh<K+@Q&e+Z*/:Ay:Bhcy\5:4AH?Mq^l
G#SZ^d aP%lm5awS?%BZatpH^Q5R?IVplT$MqIVc%e#6CL#1uD8TJVB5/i91$=b\l6&jpnNhCa8/WRlPcu?8NIP
cjZaHR p@4jYttHR@?+$9:Q?i:1Vua?@%$hFku@6#u5TMT@@@**wi6I1Z>dBE4<*?/@S$u<&?NS5H@@@><jD$d>
9Q:\N^ i*PI?Z?4$Q9>++D?5i4@4PlLI9>kdn6e@H>KBCB?q+?MlQ@hjPV@1Ad@T+$b@98CQQ^9=p5k+bJ@#eL@
XF!%i5 bDALHQdZ:J<X<?H\9&d@6CAQS@!NA@/V&AM+<t?\CNkj5@?T4@wj=Q?wtQ<j*S:@LPcn+H?\nj+kZ@Wj
D%5j>8 J^#?j#5@@u@i?eGM%>SLYTWXajKpp&4I\uB*F1cJT1N88Iwm+?L%ScZnQJM\$klNdtWRHq^\kP!pn5Le
y<ekae :4LPjWwBIB4ZS\FEHA>&qHYKVTV:b>aW/WAT^Gb$aP4Ll6Md@#:9Z@EuMe$enPp@=@$#>dm/RBQjFPnJ
*Xe>>Q CkJ8%^R5IN&PXXncWlV!hwh8!=*<++Q<\JcmH<aGjR6wJk1e\b@*qhP**1>qkZhT>V5yDmt<JKCD?Mc#
h>=dl9 c8yAZ/AXS^K!4FY$4q!m::VV?LHAyn/B9nAN/y$ch8HA/mw5TDylbhu+%Kc1XVSMp&XVy*nCZJ<Huui^
GL\+Gj aQ^i$$AQ\GBY:IkI%:!nn!QmQqX//?<c1RF:4/tFNQ%<emmq+qj!%j&B*?^n*c:p+:1V!9@YHCLaWMGy
PQWWk4 1V1?P6Xt$C>hQk9T*%ie4H*l^KHT5pAu$T>adWw%jX9Dh*+J\1N>?:&^mNaiRAT/N+MRicdNB>Vn$Ip&
b8CF4\ PM9%TpKp*#VX&#FYh*J4DR\e+:L?515qkb8Q%?LGRX>S/9Y&D6:tpj</5eQeVuFC\AB@+G1Wy8QGc<=t
RYESQi $WW@Fm:668EWMKRqW^bBH1w@Z!Hyi4K8P\PZWYjZwhP#>*t4h#1EZYE6>Zw>yKDlFKBR?FJL85Wuch%+
T8iJu4 ipqh^:i@/&4ZwK1&y*?t*jhqD5K:$+Qhh=:b^hR*jqGE9thwkwjXj4%6/t:LK4M=5+PS!Qpe*RymaP!X
updchN =:QjAIq6@qP*+*A6:w*%?qeL4LuI^?8q8Fc@8$14l6>dQ\m/9Rn/Gawnwl1X/K#c&S&E^d5p4Qi*>n*T
&!YeJe Y=wwj%6+AT+aub>yiSHAwZ@ci9S>*n5cN9GD6SbBj+QPiS8JnedZ&D4Tb1hwtNimD%?Z54p9tLJmTM$E
q1R=M< KnGnMWaXjyl1?<M*<FPCyPI=$IipheJI@ey%J#PhRp</X1kPMb%1S*nqKZpjXNh*VVjQJ#bh/XYHYT66
N@5bAn p=Xl!W8yu8X$1mI:ZlA$ZkZSRHiNETS*y\^hCR5bu<t\pR+/>dMPC+q\nm@\$/98#FXpdGw*Hc$HD:e?
u%M>+9 HP#I&L!b=^Ew!4#X\>A!a&HFV^=ccE*p8@PB=RT6<\Hk&$Gj\YKpZ1XVVTan?mtZei=F9%q!@K9cu6p*
5Lc1Fk E*ecaS<Qbh6djyV6FLdwp#N6mSpGq1RLG<aC#bk+Buee?1R#hTy@JMLuHA56hd&Rkn#j?T<VZ4B*mKmI
BmBH1# P9pRSp/D<wSF+CI=HQ#MmhS:uHeiXA6+NVNKu::nq*1pqMM>/pjnwyu<IwL$!L8:FhkI!X*Peh@nE!%X
Ae>d^i kNQyIS!>CBcLeVS==ZtHJwX9a9mJVI/!c*wLXFG4Yq8cCEcj!GTq=C*?WpN*j41qa6=K9jKmd!+G*Zmh
tS8mD% pXH9!p1:6$WnYdKJwZTF@tW9cXQi\%6GGkj&YVZ%tp?$<J6<C5$cPJQLacS:cXN^m?m^y4NYVt4iZPhl
%LCa=m YN%Ed#Z5VbQbM+RaFR>bM:^tSa4XVw!D9LJMm*^WZwt<Yw<6InZK+Wcy^8IqpVQL6tC41MXmu:cYR:MI
MBpEB: %8>B\BLmBYbh@%%tjcHFRp\J?Y*V6&=ySTb*9:1*clF?RqeJYuAX>JFqWN?PT4J+JM?$GHu<wBqJ#<F1
Mtd*mq %JFXPq1>?unM:cC*RNihTYatXD^pScW1E:p#=l88B1><m<wtA8?&11IN5@yS>^#LjQYN%T/mJCT^8Lhn
myS^p* Q$$TJK^YF%kyVtiVME9pFKc56:$=tm?#J:Be>ed$XGtT^mWH$w5Y$yViN*Eb/Wj=W^Y6&9/mJc6IBu8K
b\l<Qy TI4RAG6H?=j%\5\5^kZQQAcTZ&QZ%6DZDViF>kk:N+5JmW!FT&$pC+EXFy>ZR%^<m8!WcymM/SSYAJa*
NBZcF@ JPh1@L:?$nncnb#yyu:K+I4CKAtC>hJ:w=ciW$yG1WjMu^/:B:RS!BN=QZE*BPZNK=P6CVX/L:lP^CT\
*VGP4\ W*Rc!!h=mJRlA>1ym$9im:pDjw^B%Y:9PPcR*=lNXnc+wYD#VdCmkh!*lhH6eJ%yBN6Wm1nk*R%/p!9%
Y&8>\9 SAF1@aI1l%1d>mHP\d4j&5k/q\kthm?Za1:DiDF5S<D^hW$\S>B\Bc!yh>Jy>&GHlhJM*\KnS*wcSiHM
u%\ZeX iQjlhkc5Gdd/+lq%$Tq49AJQ9u66a5@$a1T?>H8FKL?p5la+HuPJM<\h$Sq5uR/*\\Wn&KN<Sy@ht%SR
8^>R$S 6ud+Nbdq<b6Lab!F?&&V$<W^BcuePBq*BL?>Qd:J8D/1Zw%KNa8uyYpi?6MQ=Pm8Xyl&+/cR4!nVqy1*
Eyi4IG 4>AE\?LTZG9dtE\?iZLMY#\h?@GN^@m>*qj>#jRiYacjpP/bpi1jd9XbT=@%=Kq%ayJMuJKLyB<VVCnN
<Q^PQ1 uGp+li$BkAeL6ZqM\\9CT9mN=8^cV:w$N+lV4/:E%!Ej=^$%l4w8mNtyI4*BcE4je%tHb:h9D+1/9T/1
?bK@j& P<9\ey!RBj+tn?WZ$VLkaPEVML^T5LpADy:BHX$!Cc:k>mhGSj+m^H/NVl$Q$!<=Zh@9:HmmFDKXe?H5
q9A>?\ JJq*YRLh/JZXGEBe\/?!L^ia^mkaGpdeR%lF?KA>BSM*@Z**q+MEZ!k@MJ:#d9ZbM!y*NYF$1ZdYBG?D
BQJ+15 WWEIV&Rwu/L9*l8*+pdVq^?RhP^^q%jXmHk/yuJSG?*+4um!a%$N&l$@j++&qW=tYpZ#$1j8Qt%QQ6A4
NZM1Hm MQXqiw?dQ$HwT6\<X=R=njZKI?k?J&L?4ISuDweQhe>A*6<#l!\?\4&iqD4nAyy^tKu$DDwK1%J!h?%Y
9yHql= kITCin:WICNCbwhdM94b$t%Nm6RHaXG\e5W#&BDm8d%@NwC8qS^NGHKWY*ukH8:yY?DeVwF>LwlC^4pn
j^?9LY QY/8Ddqukd+w1%y<tpn:Yy%XTNb!Z85IAc\?=ZNZyYSA8Iyi<%R>X\^!4KkSXFC=L^><ZEbR!tHX&M<&
T&TTXT h6Rt:W=qtiADXMq1cnCdHw/d:A5/HPp%IJ=ehPdhWw?IGMQhICp#R6NXW5cMi+S$aIc#!^ZIT#GlnmbV
M=%1hu w#58/li91uudJ4%lTWi8SE+R:b+Cb@KmBMT?Cl=T+$DyCeMQSG^yu+TNa=iGVdyQ/dbHtyV:QH9CJTq4
!+YEcq y1kwA<kGQw8X@mT*Fj%TH?^8t=BbniuE1&SYT<BLaSeEG%+^=1TnF?J<9WFi@tZVESbYP&k^DtRD%Kdj
1>G@Eu mPEp\ap@\5I4\c4E>?AD>+NG=#K4A&RB>lEIV8mS5^8iARqHM/1a&BR+ukH&qAj#JwZdS8Vi5XZZwTl9
ANH6AD *!S^hi*bWAX+*RJwwTJ<Xcl?bFdaIMq:epnHqbNDn9p/GmQwyJP^pl?uE^5qS9ptk^\RTC^1$TuwImG9
e?CYDb TcVGi*QRn1!awj<PbWm9KyEGmJe<m&jNDDwh5lN&NQYT<<SGKNI:5<umpJ@+WFDFXuuVSY#+#G5&In4I
^Ic1&M HujM9=QqkKju5tjpF=QZ&NQp:u9K!JMQG%un5peyEtF*1X&EJIw/*J<JD6ZND:a5jY#tLYN+t<TtJLLZ
nkyHJX ?QHHy#=H:a<=RXc:DGZu!Ey/ApyF%bR4NJaeTb$6ACw!\V1I+ib%%H1A+j+%h495w5iE$!B68:n1WpEX
!Y^FF= AI6ZFIt+#uIa:lnK>%dT#Xi9ci\YpYMqtdYEdk=m:/QEASFDj>k:@JG4<?jDPiMtq#MXkb%PIPyc>^%=
!a8aI8 E??L*cP\5aa9ACFK$tTEF#+5>9FNF??\eii\GhKlk/\ZWjmqa:tYk=:V=4wk^#l66W><+k#XaN+j/KP^
eRw1*Q Ak#ytPX6n&+uKtHa&ABX>hY4<eGlYHt6uS$!9L:=&ZKH?9=hu>XP8XGa:wblK4/Jq/ZMc6M841wc#dAT
cmHbKe \d*!MhkFt6BV:AmS@PaX?^tCqS8c:apHa&H>$yuqWG9FpKw#dZu^1qj+btkm%9#atmZ1%dMI?hW?I\RW
A4HiV^ #KenkaYyK5yluH8eKBV<RYyJC#/cHD\*Kdu5qZjn1ddySV\+aI1mVXeYb5WcZ$9yZEql>q\c5?GlKNG8
DN5e$: ^pQwjH?G6:Q:icJ^ja&ZGmYAV?Yk<5M#91HJc#BcT/All!Itq?NI6Z>Zi$y+@@BeYWNI4TRRQD>Q&wPV
6AX6wa Bb4AytVAakR8hX@MB\^jX:q@eDM?l^QHJc@GpK+Ri\^l+Qj9/eTTEbee1&EpN>jPh/CA1pu#@q<QId<1
qT6L#u Gy*jiwihYc$hd&IAJd1:XQ*+BV>h8QEy><uu58/9i?y/n4bccW5GMZj%@IRiJM<16=K4pWq*yBQ?Imtq
dqE^bQ 5HLZk/ecJA6wK4uP#@y/p:L\#ihb8Q?I&6aA$^5HcValY!B#^G\?Q1y*QI6$Rje6JVZiaFtR>9^cH<Mi
-AJhY< 0003da6b4ef001202b3 Page 437 of binaries1.zip
Le<@qB NPd6<*m^AqC&5eJ&qN!=Ak<y*A\XJeK=puHYDPT^8/#myc#*W9\+FI&5tkl/E%NeHS^NM=k8>:Y$a8RY
!&wR<A 4y\NK#<n@iXS*pKEM<Q!K4V5CD*Cj6G9upt/PC>4^Y\Hwk\Wq8%:<*$%9XAD+D6C+D=^LGjV5KFm5Tap
aQ<<aD R:Ewawi5\dGG\EyLd+Y$Kl6W@Zttd6QG@1cyy&H81P9R!NGC+m/SdTBwYkCIm:mkC6Q!e?<y%TJ*ND:H
^k6$qN JBNHybB\?bQJHa%PtD$#FNS#w?h*#wcE?:8C=HVKLlCbuGcX=?$njP:Pkk@QVd$p5H/dS!A%Rq!JHp4R
FiYQZ= 5QEawu&ck8Bad9nkPeT^uJC!^DHpdGl4<4ZAje$y!PPw:66lEHm8Q$4RbH<*ySKhVil:Y<dRtmYYMlBZ
C?*6dc =#hYw4mVE8?Y4*WXW*bIweSaTAckAQkdwZ&uw?N#5lQ&KpuD#B8c6A/GB?p6+P&a?85IudET/<^%I#H@
!5P*!C a:hhqKPnkVjK9Jt#P^ITjDuAP!t1$^@nIqc9tLFZHZBXL#+iH$mAXnEKHeDpSTwEmL4CMAtX48T\+j6$
pLGqhL /KQeeK\YYlVYM+qyGZ>1L@T\tE:?$CnmwEDna=p?48$>yVJ&RR*ieDAb<P$^@*BQih@V$:dQ&\ak5bhl
AX<?&l el&S&!wA11#%/V!?5AKneCRDca6t:M$p8<QHZI/p6a:GjP:JJGGi@F$JH9#CZHJ9T+MDFZ>>dHbPWhHm
LN!h=J G&BS!Ky:5@VRbRCEtEn^hFKQ+*LZW9%l4a^J698GRbQb!&H\WbG^P6S^DWqpHJFS8+WSK6?8!R>JQ$P!
&PYy*Q T/juh=j$q5uNl:jmalR>iidmBYkC:d%V9>TyW8Xa!n?mZ!/!+9BAPc\cHWG<eJ:k^nh&yY6&6AX<E+@8
wtIEYl qa<?$iBFhkKN@N$:ASFA&+C:MehbcMd:8!D\Yc=+Z!bd!a+VhWeu/Y8n$j4I!S#>!tT8qh5meHtuT5yM
*$&A1Z +@SEP!TV+l*NemnRT^VY4<B>ETd@6euXQecmiRAk!bmlplm=+9m$M=8l/q48Et@tbndyZM+TM61uk4$M
yI>wjQ dQECICLwHSAqn:X*X?*F/k=KYTc+#?BXk@HJ<jB^4X\8SSNJb%A6jbDhVt?^mZ#%N\mSdqn<4/N9wweZ
EDqF+! 9y=ZV<\kJ@wh\eE66\n:jcXH?R$>Lp4CE>yZIc4+M1SXti:y%!Cc^VNdP/M#u9K^GTHF\C>ZiKQA?T\i
@L^wb+ F5WYmPn^#TP8SE9\QaYnd?5=M&y^b$lHnkjXa1w6hnwLIH%<tbcK@=Nl8W<tpjj%G\\w@S!$Z#DM*C*#
NWSndN *X\!?XC@B$Gp46^*/K99Pay^h%QbEZZ8\jcp?ZCYJ>q*y8A1JnQLpl/mPWPQ9yDdCXWVu#$mm&jJiiPp
tT4#hE yk9*\bPtB84ak%VIHpS\?<6V6MC4Z4dF4Fykj*EdPW+y>8kWyA5h4/PZSdIBw+hLahH<FEpX#q8th6dc
DYyYRW GjLjE:ai5BqQk+!?b%Zp?5JF<:4\y$u1$tK+&=$lM^#cF^ld#!<jyCAqt>cqIQRhZ^l/L<Eu?>YmEcSl
Ll\RL/ l$Sp1DMTAu<^\IW+qCi!P%\D4kS+\m9ZX5btM869B@LXcRlc/@X+?WPdYed=>C>8Ypq5*Z@Lp#lW%yNh
Hn!L=n A4pp+ZNV%IZck&b\EBW4idRE?BIDaCAWLLP^cB^%uZ5k4y@R%G8LZ>PD<5TwhL6Iw4HKYDyWKp&RP^A4
\E?PM/ /RLq9b<C:A/bCWiWqV**@9d%l<6N<EtwnK=hp5naV64cuFJ*IE1*8?\q<%S%uNcYw8P\\n%^QWKIn>TI
8&L$pq X1>>1R8T@M8M!RT4yQi*IEZ\=lC$i^y=1Xq1/&EV*:Fd<Z&Aj&pA4aaN:yQKZpVcS5IW5AcK^y&$SM?F
^lSS%H HKa!Z8QZQ5^KJbI1PMbilyMQ:pp4bp!JuaTA/BGmEY>^W^RaBpBJDwRhG:b85/B?DVwbn<tTt$!K/Bh#
4En!D* R!Y>JCKXH^?dplP?GN\ZHi*#HBe8#XwS<hZL?J=/*u:Z:N6&AImeAudZ<?q/?BJ^yG<19y+wESt\W#iR
KG:JXN FlZkY%cX6?S49j/^Au^*4=:<%B>+IFlPuu/hWmGuw&Ae&BC8XVj/pjLl=KX&Wp^j^=>M^$hA@:hY&^H@
+N?VE4 e?X5%P?#qFGI9%9PS9%SZDIT<j6!N8L9q4MSpu@N\yF@QFphAj5dLQTQB\wl+H@N\tB@QMkIkjl4XqL1
Ij\lm/ n?idI=B@k$Z?ejpikjy4XpL1V%my9<H?!RS:JQT9&V<6@TQF@<cJl9=^$\NT+4@AT9+Z&L?^5TSlj@\C
l/%McB I?H@BSd^Z&CSj&h#@LFmRcL?C?#j&Xl@uQ?NSEH@C?#j&FeTmD<?X!mJ@\I4?X>k@<c?pwD@5eyC@W8T
*$d>8X >Z?R@!PXBj@9p1!q@mAaAjXHThcT@*np@!F>KY$<5+YCXPle\wLW4tXBlb9@#F8+::uy^VPm^mP@E6^Q
=yHpkh L+5cLM/D$KQ58cqWP*Y:QmFcJ+Ym\A6iu59Y6&ww<Awt<&^$1H1R9hu6SEFmPE8RWkb#^CkXj%u<1ChV
JdEkej ^YlSeEtF5*R<MZ<$X>RHqB1BM:NkVANh9e!WjM!u8@FHZjYq<pYDAPGm5PYqiCKX=WF<1F\LLL:/&JKy
#w/ktn #m%\qG/ky5CtjVA$%RLcTBG$\\#</MLEkQit?e/Jw=dMwmM>mdYpSeR*$PZ^aCSkY@kp*j8mHNa9nw/A
>/u6Ky Fb6&:Z^JVW*F!G4?CylpwcJ:J://Yy/lJ%R^WSJH%M\qJTE??w&qXu%a=?bAe=a6R=%/^TE#8nq5F6y$
Ynj$9k 8\MnNZ5DLeDT1H=kNVNuHT@eW?jq8HS@Y1@$lk!/tP%cP$F>c/?5PjdbQXXaT/*LLZR^n/ZBnP>LTcWy
%!XyZ< @W@?4PkcjqN%+:RB%*HMdZT/Pm>IEtqp9Mk^Q6#ku/Z#RG#ikFpB=JN#MJGRqwS>M=9Yiw6qwD*+1=p^
#&ZEqF 6a8IaNYl/VE=mblXBchMcInXM$X%D5!hJS%>I^pTJL8BXP9qJ=EwtM9SZW&SG<MaeSE/n1MYhJ8@tI@+
MFWP!j 4K^aI1=XR<AFJ%R^h$?d45WkX4Vacm+B$MLL*/$#Hw9w4j%TynmBG+@!ZI4JkYJkbqQGGC=TibWPb8j5
<Mcly! V#lV*ZEeKh?wi5R9Q8NXhR9P=X+:L>+ap:cP#mH@mPj58m8T>@N6d:nDd&=hQ^HV*Da6Pb9a!q$mcIEj
c>ECL? :=+D!EMNCbu+5+SX/EAjb#eGkWJ%5lMJDL:SkVmb8k!/wi5pF?*l$<BNqG<d+%*Y8Y9m+&HZu%4YdZHX
/tu>e$ A&G6k/:^5lLZ>P?WHZ*#PHVw>?=4K1?dYMB9cM?^ja/XlkbyuE>MWnedHu@Ny=ZWd8nI$q8ehquC*ea@
:9Qm@d QHq?6PD%!aee$&E4NjYw+\=u?=^4qq:jS^S=JZXNa^q5q&t8PeDhV/E^uTAq$?5^MM/JR/deuFCN>dp&
Riw&BV aMGHTAFwhV<t+wH!mG#uR51aBa8EIeRjLE@<kXk9k5yY!^uRa*nT?GCe*jl&?t><uE8E%4FVh:F8Jhq<
N6A@AB 59$dHRmw/&&b8<N!y>u#^PbH%J1hIb9MXw<?&GJK4<L6ldH1\jw1S#T54:JERHTed=>CBCnTQ=Q?hpNP
DSAP*L $!QPIP9X=!hJd=yb!PIKZ9N@F5*naQXRRuj#%BTdtPS?keHjC!RMDmmT*=/Y^MTHP8CV#tj#CuMV1LZk
hFNuj1 haCp@a*6HGDF!5eK8PHbA^>=DQaqd8l<>6JI\VBTNc$biCm<j#NZ*TbFC/uPF:F&T@%%XMyN?Em^JZ6?
ECaMB4 Td:T^@l\kL@\IMhw1=**Bm&ZRFIlG%&u*5E5SE*AXyBdQ6^Y/d:DCPQ1ZP=*?4BE55JYu$YZQl@9J&yi
BAQpyA %iM6?RQW$Z/bW>!hYhB%KQiQh#p$<VcND^&hbu+Ae&uVC%TIM<4::F\!uW$ibnEKD*QD1CT>c8tXD$<=
q5PwG8 NIPQ:MuJdRlKbH6mKSKEC?Q6mYAt:AZ4yGIFI@HRqp5%+:jtP81aGSI%c+%>tCZ+R:LYqDH*Kam/up#E
#aQyaL 8BP^jNIkWFn^8JWRWe>FAuq8:SBXhWa/d<SHtIutRj>nmT!HB@qP:@*Nhd*cyHB?6BaV5laa6C/V6KeN
I>Y^V= #*j?dF:M/:8iDqC>9m9nTceyqwiWbtqe1QC$Lm+D8MwCmKXJFj/pbildwnq@WCAthEJ=b4ddNQQKEZ#5
NX4Cw% HqT*<@=P9LP@V%*THT+jC\9c>!+&B#PKZRD!DT6hEh9EIC$6HIpCcFbJCd&+$1n@ldYQLLnB*jjN!\BL
Vw\aj/ #@lHeqB@*ZqF^<ei^6@9l4nV*=?SlH%e$Z#qG#4JINXZ4**5FTbclw$4/un5Hde:GdduyI%uXkP:Q85$
\CDwpW abmuE%V94nK?+tkNKYC+=?M5j&9e*p4uYdn/!leYe@1SjB<qD%GK6#jC^>Ci8$!hKX^%tWdj9!tKF^W&
nFH!NW QpK=cAaGXFeb*?qbD8+8?lwd14*!tT8Icbwb\k>%9q58\C5YJ#ATdu9m9GDYdidA+1jeQj*+:b1!%VMP
FcB=k/ hT&Vcpp8/c%*CVS58eQpNFMd#M8Pyw+i&mPZ6:LSR=VJyi>H5y:V:/K5EuPne%+L8>!?9\iNNXcm6XT8
e^Cuwh KK#j8^FTMGJnNRmRbWcV&1hP:IkPQtdw>TN?DwdZNi>=!Aq<@%dyw@c<XR5TqGuT/SJP/6PFhBdMd1QP
lRFtX! yE+XutFG1\5wSkh@Rw8KjH4LcjdCN5kHBWN*8Ww6#B+^uVu!#*RXDP^GKSjhWA&jNlE#q&WR4$+ZMT%m
$h11RR <bAXi8VS8Emj\c$<hlj%R>E1@YcbcKjTY+ZNh>TRVn@IX+PhG4bIi8<u:wM^%JY6Kk?<4!%&$Y$$XFMt
T6HX#N B1ANR?Mu8ju5Kl\/+4FcP$QjQX?HbSuq6M5QPC$H5#J<Ep?!+1twPlT<lV^*@9kPc:Fe&#Ji6!%dmJ^*
h6&EqE SZj^1L84^=Xt:Y^95&p1dH<Td<tm9qYm?RJYHl>lR6jMn$un&YHEmSSQq&q:KFH/l@NJa>ht4J!e<hS9
dw64<! +K<dDM^X=jGRTb*$#65J5FGwt:k&C*HtQjXH#Zp8InE:@S<yT1S>H5TPDQ4XVM*GkXYj$PypA<?!#96W
5QTV?I kl/Cpy?@@LWP!ZZ&!B=iu?K1G!#614e/bqj/JY/#\Y:l4y*A#Fca1b<Z1^8jw64?XemKXZVZ9>LiEjmK
>>$%hE kiFHk$Q5G4t68y6M>1@T%*Fnn=X?*NL:L1te<j&E4hW5>H/Fi5Vk!=b=:RjuI=WKql>S/>1Z5j9p?a@6
JcRBi^ 6CXjbqw>mim\@tI1^^<#c/P=EC?wk9y$@RtR:?95iDq5Kd<@dHhA$?VH$EZ>Sd1q5hmHj&LDw%N/S?dT
T4kM8d G6Tqt!YqFu6\@t5j?/n@RP>DR!a=?ZjH^i>>FpGHVjtqyBX&#mK1=#cJJ:@Xnu1VaR8HbqYnFpHumAl!
DV<i4W +iimF1>*SCj69$\PMjTSVwMBCNF!dE%+ZTl8iHQ5TII@Be?Z5$K$?N#=a9^+$^8wWZZ?JGX5$cP5m=Jn
bua5kE M/FQ=wpDl:IcaZm+Xmp?A!\ETW@K$6L8Hw&iI?6bIZZk/BYJI:eHcZ8GmiFI6c*eJ?Lmt5?qwXnQB\KE
SFmuR% $Vk\PYV/FjelJNE*XC6j1bwG\EM1BwRq+ISlwqa/HlYm?>Kl8Dd+S=c%M8M\H1$9%AV^mT1T&tu/SWip
mABe#1 Km1dFb:T=:Qc?//&cD6dybAWbipu!W4LDS^8\=^KY/6+\k%JWj?D@Xtky^M>eNY9D\mDJwYJTEC<DMGd
5Haq91 G+NJkWAeGWQEXjiWh:1Al9M\NDV^t/VXP*19aF61**WBt\?Kn%tJ!BlGA?kF9VESNtEeG$*J$AliWa6#
QcCM5? ne9l<Y>JbmHV\B#=?YecNKtWb?pjQlAqMSMu8::B%wJGCZHH1DkB<6\SV:EEybBB#**:ehZ+XaSATp=5
-AkS>M 000cf288883001202b3 Page 438 of binaries1.zip
5PIkGQ CucpKB=:ELVy4uja/^+6cD#I9%:kmHF*X>$<9q**<XcBTXKyq1nV^T<1h&$K4Rm1NQFK=&jKuBGpm><B
FjnD1e *E/n=FB^CQAnLRPycQQJ1*d6a>ymYZ@1JacJd=mR1weW?m@GWpJG%MqV!4Vq#uw^G4%lih!&eh>IGL\1
V5^GTl y5pyJT/G/S^Fj?RpkV+M/Ybm\@\H=VGiIFC=LwRpKudE/ljZw6:8SkHjCp?6*A1QM=4C#C<!=RkVB1Hb
ymnW#c Fii@R:LbG\++$iQdCtn/nbVtl$?^4wR+j>ReQS*jZXG!X%HK554:RS%15@BD\!B^%<E=cb9ce:&#tL!W
=XC*tm A%9Rnndw\LKy9$i:dM@dP:/!?!jBLHn\N!/u6!#Jd4eKb8M>j8YQSAS1p>HlJDpc:TThD>/Zqn\uM:SX
YBDiM? L9Gb&eIhjpR+%V%QuIc4RX\G%DDJ*>#^@QGikwE/X&@I>L@c%bH&p@LbBHH&>k1J!TG*bPF>S!k:RbpI
4eSl\< mj8K1L6FHW*dJ6<TmVN+^8>SIuA:^TJWQ*T*Da$=X19^X^HiXSuR8l%uM^l%%V=6$$PCcZCDtqy@+#*C
eH+R%^ aK=\9Q1<tZ1ywwdQL?:\iW*CKp9PJtS>TauE/CW9VLY9Zkw!DPwb>/?JT%Y:MuSQ<munSh8=jl?RV6wt
S@kyXS @!W/dlSq>SF5Ibc5$Vwj4$4Hy4&%SNK*?H+?#=nG^1*e6ZbIWYS#EXRSDwq6XmP^J15d$ZSI!d^T$cIi
X6>::E Ib6QM/^#$Ymb$jB$n?#*uWpwJLMHq6iy$%RIccFNlke&>wZYbbQZSGan>6^E<^ZkNMe%%>Ebwp*=AG1W
I#mJ4= #%m<*kl1<Snn/VClawZS@/SAH#%yT?&eLh#Ipt/+X9p=C\aX1&i>!:jnHFYX+^i56L<+qBnpZt#!9Xm&
m^Gciy dj4JtQj<Y:h=S/w=IS+B\%LTA?1p>!4L#tt=PlSGi1/l9HdJSlkQa@Z9XMeTXtNB*Z$!K/$Y!\8d+X:a
Ty%a^h GS*ZqwW8ZI&n44m4dl^&+hVJp1J4ES!%PCAK+4cF&kXL?qq%?htXVFly8>tX<Y/be^F:8uYbuHw98SEQ
#X:HDJ $DBKVdySqqYIq64qiTT<nF1iPqbcm6%=X!weyAh1ISt#TuchGmBIVdBYJy&&$?N>IXA^P\jBDF=l>KXF
>A+G9B nmHAQwRDRISm6?l::#FW+X1V%$^:Y%9T&$#L=plbC/IX&c<6JKY8NiICFK#JWFFT5HR!5DPM!MMpTwTu
@yTV!i SiBK=WW?6&S!IZLVI$mlI!TdFRi$DWEc*%y:=y#LI%%%DW>CwyLKl8ElPl/<d#%m4mL:<dwDQeB\JKH<
HW<FiI V<<DG>K1W6ctn58K+Y?/\%dDRjZW@@mMVRFJ5ymNX4WP/X4w9PDpk5XKwy/*lXSbnRKcu+^J\u+nVwNj
+RaRDC KJdc4+l^VQyJ5n!SFH%M5?^<1c@Zd*1uMm\Xh<>*kA!tu@RP8AJMH^MVWLP=^D#$8XqB44>Z4lEDpLGX
PnXnQT G\nTw*m$TDW^BGe6%+*Vii6#Yk/I8/d&Eq+8k#N4/CeicFMlV&cEK>pWQb+Pe@1wdD%S+cI:/q<im+kw
%@FR5= E&Pu#5<R$4?ch4Zhn\*h?hX<MZ<>1+1kFtAYF\44QRGJ^%XjJmX?+hY>q9/c<14*$9@!R\ZyeL6yR$ZC
ABQ1Nh eNqDFeGZ#98$LYJQWc=^JNbQS<9tl/CDm&YLH?@wq4u\llN@d=T&*V?y5mWQX4GNIhG*%RwSY$:d1A5#
4iB+wR :CA<W\:\M$:KSyXJM5Xy1TVqDV:DP#/QS/p?Yjb?*y4WZIB=RGQEY6Aj:u6q&L6lt=LKc:#L!\9VQ#>*
iV!W4R VydHI#jX^9p6Za>^Y/>>?Y/JpcTBJAXd=$SBqVjHp<nht@P/Mnw%Ji@G#XGKh+y?YJG$*HpP6:*Fyqdm
NyCK1Z 5*kJn#mEE1e>HnIVLWkl^R>4I=FP6P1ytc>F>Mk$D<JFHVajcu$!K^lNXR=V@XAD6bElIcZdba^HSD!Q
!uSnG? =aZDqKijCJw>twE<DXCe/BNRd:?RXFGkCWeA&mGaVB1d#^i>Y:<YK+!N+CG!D\wTN$$Vwc+DDQqP?y86
Iy*Z*T R@uAn=+A+HkGF$YTj=l?MhIHVDWah<8aiaticekMD=Ma$mmdhqZba?6ubNDiQJljqE5/nml!eE6h\FKE
ZI&tSy aI/ab\E56:!5PkCwy9tYkikIF=b5tl:GuSJ1Yt$@6weNbHS$5?6<t8F\hn1q&5jXDY/q!GJyR68w!@LB
^1ewVu i^1L9h1:Qeu/q#A@#8=n5@yl:utKX*X^JccBjiy+yAV$tVQl8=I?Dt*iRlICuhJcm@pJd8QX<48ab&1h
D&?cCG mk+tL%&9D4^#EnXu=<4*:?t!XGN!VnHJ+CeTk>>!b6l$WAdblt=hc$y6Ieb<8wa1&Ii6/QATDcn*qD^Z
!E%wyA *eenR#<XkY!n&eipnkc$dAqEJAp4H&u*u>b!916>iP@lHTF:H&1ey>dZD4M?!ahQIt<S!peKX9JRPPAl
QyenJN BeNckTm*TFVpbIjlkG^8FKj\N6KD<@lPZZMu&Y6hcHITnVMi&kS6mZK4m4E8P+:&SbNNu*cVdB^:juZ+
G?+<BE HqH=cESF\WKNh%Y%F:@L&6mSbQu5JM+8Km/h6<HQhFt@<q5W686RPk\9DtBRjFkd4j&/>G=l1^VmK#QT
LlRlGd >CEik6Zu<KF1^+a\ld\bi=kZaSTVe+C:MPG*q>XQ/?y&4NRkuky!TI/4!K^&jN!HF5u??tERjdh?$M>*
<w@T!+ hk?QG1YWG#$AAl@!BwXJDmTXAS:6B<VLBAMAdWWP8iAw&&Heet#*@iHqq:Y6*Wq%KZ1dE@Eew/AK9?GC
ntV%$N %MHkX=lcNZ^qbCN6+J:K#J8VbL5HIYYSMZyu@S<#iWW?$J#Q&EH6H6$lQjZH<N*@\CN41CDqpATPl8%X
DL=m!X BQj6Q=$ljV^Vq#</=nZDMRtiuQ@w\YY$<:n#MPH5LQkDWQG*hbD\mI\ad9pl=CB9W6T>1mhqkM\4XdKT
wiqiGu JPtnGI*h$Kt*kWnb!eYia=ASF^C!yGQQRL!\#V\PdkCRMRYdhCY%CYh:a%6Fum<nQNnX??!Pt<C:XKJh
8yT>aZ Gk?XiyK8qLSDDm*y%&5LhB<ct1?pVdG$Z1<i9\9l9db!w/$RWBpit:EpMbP$d=8+t/@j*6l<1lPSjn=4
h\*R#F H&D#?J8&@Ei1E+VX/1^wy+uIbqqpS$Pw+YRE!L<1duqVPc*8:eyk&YVL!$^4\T8nFyX?9:V\tFX6C^ZM
C*wq/5 mTepZuV<Iea!qmu*tGH8<?:8TeH\+C>#N!AYB\HB4dPIVF^kK5K:+X9Pl6HQwwdAp:1^hlHk1au&8+&m
uBmjeG DlLu+!@Lk!n=hAM1BN5Xu:ecyAFnuJwmI!Vt=S:1mb$TaADh9SN4k\8d@ZN<EW>+un&$Ne/%L^LiFVq<
Y1NV#% aKPu4AX/GYN<S@Ya%lqp<WyL>bdC^u5h^j\u5q%#lM5SmM#6Wkq4Yy8NTknc*$h=EF!DyuQin+H@qPTt
KDQn<: &G%ccNIdI@!\yBpe>EYT*P#pWhl9pP?Jjm#YKcm5*!^Wjkc/STqF>w^CTA<6D\PL/Qt1Zq8w8LDIjAjc
k5CjZw nH^P8klK9IeF4b/AYk+@Wh$c&MSE668V<FaEW+a<iKi5Xjp/L6c<a6Vt#e:ZH+w:byTtmtGLu68ij&IH
Y6aWP9 Wen@4ZaRlj1j5wNT9<@Iq94dGhqTj=mNnj1>IED>Q4Q=n!&hFQT9&V>4YJET@&9&V/&XqMVjYLVpH%j=
=45:IV yTV@^1ISj&^VyQ+%1lmF?551Q?4@HZ?MElj@jbXj/k?mmlHmp4D@&:D!@$DDT9#@&waX%=q@SyXE#RLn
tMTba@ q$<P<iD6ECb<+:E?1:ICLG!*#R$t*>X?&$XnC/nywn54eGG4V\elm9kkM^n1iwq5dhV+!A?+*aFlkG8w
iamqL% aP=M^1Q$KF6<^lSukd/jwK!VhZhqyHHme&+KACK/Z@>5IjFmET6W@KtpN*h86#:dQEEm*Vc@*D9ji&ZT
EDR!t+ ihekH5/n8\!G:VFMl=MPPCLn8*&lCZ+1P6:LI5hP>kP?aE*16aZ$!de65?\mYkc#dGXqycQj/hm1ik8m
#mutR= +eB@Sy4EdY8&R<%EPK9wRFhXh?XM+%*Xb9X<&YW&T1@<9H#lHcpt&=Q6Ik>8T#<Eec<cGd%C4eiHc%uR
8aBkj+ YRi?NakeDu^tFDq^Zc*QJQ@S$b:hap=GnA<b8CkR9h9!\pFt6=ajk%Bi>q5<*F5?&JKPq#cau:NdbVYB
IHND/Y V\Y/BFVNmJSlbjSc6qZLnikLVNd5GN$F=*a\k^:TG<9QlAy*M!XDKjaiH8k$YXylK8k%XTey>VCbLZ+N
!K?u?X ?LS#G:4J\4T\NSK&Hk^DuGat=>8=6:#IY*y9@BTpl^l&?Fetm=:LCP1L#/EXL6I8E?a<L5FKK*6LN$iW
!J^+ku ECtI?9dY+1\^$:q%8tNh/@kQ8L66#?B>:H/M8Zq$j1dB^/6/n%@Z<*nG9*CEVu/dTJSb1>E*88y<9MF^
K*<D^> @IJjtVFMdP*y>Ew:pi^PpidI9Jqk@#4T%u@=juW\DH5!\>1!MeN8kpT+9*T@HYD*id&aV*@MT%58+1k5
=Z6?=y @ReFywwK^bKBtDVn=nYJbX6n=bGyuiiGcqZNJQeaw4Vni#<@wFIWF>ALIGj%HqLGXDEmT#8e+w>qyMn+
HLn%Pk 1>1Jjd$t*nIKXynH>9DHMGhIQDTK%G^Fp+I1$:*9I@Cq@c>>BP*jlCAq5Z/I5JDBi9%LA^5uKceYQSM9
!w@acC &qFth\wAP5h^=$LHWhLdPXSJ#MAR6DXLw!&?<m+HLjQ8ViMLeP*QuYd@E?%+X>>IX&tquDcYq4/WQn&*
6ZQeD! $S9<VXZQ6ZLTW6/MtNaE6DV84BEa8+Fqm6KbQFa4JJHiV9=DQtXPCe:4tcect:XK9M8c#mK8bCj4+^X^
wAA9C< >TYh6RdPNK\XK\<F\H$miq/j\iPhW4C=cnaV^\!Jnu:!5ND\4@H+J=!Ibh>u#:e$u4%j8JMdMucdXtaq
dbjeBn e1!F1hA@kKB<4emKB5cW1<LK^PXhttP%Paj^:P%>1@@cGVm?AhT@R^A8dK\m\W6bbS\Tc&#n\!Q^JHTY
uWbn8> ^Nj*\J:MNHw^1HHHn=V6#4%C/wje+lEZ%QRX@KS%QZV*jZ&9HebyCkwK!h?aQKLbHHX+YN9cWP\aK99&
&*1E@Z G!JLuDQ?^hhSiT4XLC9JP9Z!B^#8>CcMtqh+%6RGDDMjhaiy1&#L8J\y%^9XnwVW=eQe1BIZyw8lPIjd
Hw/nQ> Y+Xyjy4aeHSyi4\&EIq*u8+W4&8yiC/8PPt^qeL+uGCGZdQEV+BbQk:Z?6G@ZjG#P\<N8p#=Byd%tM\$
XqaTSy y4KqTiLJ%IQtQDiB1kmF1ym=9PWK=?1BMLiy>QdCIPeImLqP#aebRTZuytp8E$kn^p5FHwJbC<*=yAi?
*+GI8V pK8?p4\^6?/JTBqu+<8Si<hKm6AdN&Piae%mP/8?NE&YFXZ>JBNq>t\q6SckY<6>LBDc^be8#qK+wS!L
Ru8I!S Fk$6!<Z<<4K+I@Y+$Bki^=5CEB#=Tm6EL\F!a@mwG8D&CF8>Z/dJRG1Bbad1yAm??C#>Yj4RE8j?:Ei4
b6wke& EjX*LX6SI%ENN=AAPI>%&TKJ:nM5GeZeu191tyBAhKc<RMqthh:4hek!qT>FTbY44PnP$!kd^@?RQlJN
1VVkyD lV8B$cb@%yE#d?GlQCk5K9FeN<#>+h1>$45q=V%y#6uhu>DMdV%/A$j#ptGX%j6^uHeL##YJeLcQ%+RB
8bI%WB ?JC#MJI:=/*Qw/SSy5aBt<QyN%XdAldkDTbX4nL*6<ph+Diq4*IYy/@B8lFpjBy$kAGc9bc!RyYVKc&y
*?HNcl pbTadJ+nN=En#%+?$Pdi:Sa*!liG?Cn*94jX?Npc8GT8ay/*#uw*>pc=NV=y9jdM%=6EMKnHKbaa6<kY
#!>d8S dX5#paW@J9miP>/5NL9m%Q:M65$M=+C%j8HN&9#IaF>cZFL4:n%a?l444mMMN6p!h>8Rq?=IBc:$IQ1!
-A9eYn 0003960429c001202b3 Page 439 of binaries1.zip
q^X%$T BiPa:<hT<:TkhMQV:mK^1mlV/#L\PY\u5W<+kMRaR$>XE*@l%MwTWW=1<c!!K%dqJKjC$ht:eMLE+5W#
V8kpLP 8t!AaNXA:pI/ecC/R9Paq&h=1t:@%%a!+>6#BRP<yT?%VF/GItZLuDYGZVZ#+B5AuS8wL/q8dK6lKlJK
%JWLe/ N9RYlW8bbAd\\lGy%CP8=iT%lkt!AV%@+9m*EBp>5=@h/?ZdGu=Fn9#TtM%yubaLm1S/K$nYZB8L/E+S
95CVi$ e6FASdC9dVneb:Y45#aJQ/iVduBZ/<:EHWhH!>V8Z?%EZcQ:H+Fb<=>J*4+qilwSmc&4X*ZjAq8KPWK?
k<ZWh1 #A&1w1Zi@/T$%$l=P1*!tqGhdaPFd#Cd:uM=%W>jN?Q+j%#d#L1W$>#wqJ6w6?5$m$$F^MunqHXJkQ&<
RGBV54 /&GL#>:*ju1q*a>Ct$?WL*jY96RYXH#@%eWHG1FX&b@PySJY?CdZ/qF@lT&6LDuij**RHiu8DTCII1&K
4m\6DQ $iE?wknBSCmmZM8<8<e&Tmt?&A+yXXnN&1np%:me#ZNyqAQ*CehbSumjcA9/&^JD%=J+E@k#XCeIZ&LQ
J/@a=q qRZ!H@iEkjFeRDVREewbJTK5%>MBkAKN?BZBTdBCQnZ54pSuu=%Yk=udNHh$nJKnq4@nhIS6A?1S^mDM
R<qNE@ NXBeFXFmt@C4>B6j$Ve45e@^^E#X8BP>Q5Y*YwIhnpq&w^qI8/V?C8MD:cKTR?e?kp*HP8K^$lnE68j<
Tk\9G4 IB+Q!k5yY\ET&TF6E:TFCHmA@Hw>t:HaM^$RK$V<ywj!54=Rt>d=Gcd8I1c/P/RK%6nIjWDNpHL?VZQd
I*DG:E E\:hKj@H:&whqP$aA8qcBG^p\tD%4TN@Ke66tyQw/neT!*N9!t?tYGwu^a%d@DbK1qWKHdQXtC!d6*b#
RYCba% Vl<wmdRQy?E9icP/a^HnP/amWYGXyC?Rw*?aD?\#ki>J=?Q##a@$C$8+>Rb<=@w@K<8qcY@&Q1lw<R:Z
MNd8eB IE8!1\AwpyWPt\%MS\Pu6TP!LHTc>HwcEC/jAIB=AMG<n>i!\e:^4Sk<mM88CT&j&cjmwRE/e49F4JS$
Q@:&hJ tCV9XFaG=6X\WMLG!Lp&&#w1FLnClpTNCH#a9b&NCK!!Gu@AitJYKdL&D\^QW=Ti:wl^D>1+q@t@XTqC
iXutFb uGeyqdLyiT6l5YtlXF*+p5%IZq$%W9hDB#A@qd9:Zy19yqpW>$X/Ke85p5^X!A1Qm?\/>C6B9Aw=qXdn
ku+6DE 9n$*EjTbI98NpBT<i5+ZewIINeXJp485*KLT+!E9K#>DACH!i=wEm5jR=K+&FjK%qB>I+A^bnK^d=VW9
B*<#:n 5Y@=!Jhi94da+TwpkC4\?F6=$yPm/HNk6YAQ%be*FW#+\YultDZ4XLZa:cA9\HiW@MR=>yA+>T?\@1V<
lCBay@ Pa+weplPmYn5#Jq?:V8t\@GPm@Q+P6A&6?>:RYXmAJJ+E\89$$LElE\=m1+Sj*+LZNWnTZBY=>Yd1%HY
iC6XQT c!V8T:/Dp>>L=y$ZdpMCk1ym+q=T4HyHm>dF^LNKwJbT!$DCSjLHpM@Wh&?ZqtYM9tHDXE&P^p8:S^Qm
8a8RpD kwR99=QNE@Fe5ZpeiCj6NV&9!Jd9GT\B^^Pt!cRi$<A<!+ByS6^yDKyecG=AA6j?XVFY4b\n46li=qIZ
\d$9G5 hC:Gjm8^G^BT+8Q4j?!#4CI$CmDIQ:aVXRdmaV$t^dciF!*Wcmq\#yb+XYYE5q^G5jjttb!^9*^XTELQ
bWW8@X $TEtB^VYY/qm=891whXn5*PyZqTNEP*SkYVETy+ea%*V>n8Xl!?K9jLN=t5J=q?!%uhZ%L*TKS$%uG@D
q#\<@W kEyPlRZ#6N!N4/:lCa8X>wqK&+d><F6c<<McyY>FS!ta=R=kc9$KNc9q6G98q*%w@EtEPB=AEHHEw<p?
!aSFG$ qm*qpM#^eaTX!#@5CM\YM^kmQumM>1LT%EE:@YRL6$iyWPmQSCZ&j$=ypEeVPVBEBEaL#!mh!+N/n6IY
%6+#+: =Cb4LYDDDdH&=cbECRbWCk<<lX5y&VLthW$eh^^QuJnVJ%ZD>W\wG5%FwYc6mq<n&Ab>p>C?yPcD\:CS
yN\+5< <<bT19V>6TAI=^IQud#1a^Q=d%jEEaP+\VFS@5iVTX8&GiqqN@hQLY^ep+yElcQ^N@Y$Yw#=h:T=R/+u
YWZn$h DahQYpcWiLiwG4\b8PhJE>+%&GZVw*4Q^aWphEukNSbuNy%%n46%Dub#kREbTtn@YKhTS?!MlHP@wXI/
JtNXLu Ymtt$\we?IRB?CMBFMhQ6^TX<bHekHR@/pTpAhT#<aTEi<##N&%iJ6%Yy1G!p>:L<=MB<8VNjbjhmMCl
X>VmSe +SDBDNPaE+V>wPqSIQ+nG\S1b=nAHWl5bBaq:S8*JBC*65%INVVhww^qikT>^kIk?#6Hn^C4D$hySRey
<<h*Rp tLZZ*iGPV4wlwFVDL@GmVqmqhaLbYqLFSbHX=aTMqj:QP%TRMk\NN=i&IJ=nCZny^=j#h5##e8#k#cB*
<=ZDMq n6Enai@WAN%e<yEa>!a>49S541c&V&XuGS+$C:Zb@4\PjM+JSpSSiw/qSLX?ju5uD5y*ycynb9y6Zanb
lK@:GL jAWDXeEXd8Wqby?@kDj:H>e*&%!#?+Kn4q$hZ^?!ZTRQq^Q=:=V+:8^eG9iHt^lIb+^SiQYM?VS^b<F4
BF\nmT =WpYhebaAkR9A+$BX5w:p/YDmpIiTH6WACM*TG/$cIVi8?$Dhj>QYJd+9X4C^$Q>1Cl/jdY&?^M@Z9HL
5wk*n$ uu/<K#>p>+n<waj6I$id^\>+j?#9?E/&Zu#AmXQ*l+VP<%EdPG+P!+hE\Z!Xw4\#kc1B?cePHQXHkXue
c/WXYZ juhSmmZuXkj#>LGDjDFbm&WCqTb\M4:$/8C6^^bJ>kqS*K1BMSW:98FeARpRiWTMX?JAtZ!:ynTZLJmG
%S5bbD <NHkXc44t%Rti*^mT+mpT4TQ$uK/YiE%1YyWDE:qylG@kST6dGPQi^*?blEyma?ieJpiI$yK%bCy&!D%
yBMl\9 95+8TcnT=IktpTK61M>SFYkq4KmS\ElKnC&AT=H!+C9qCX>aIV4^!myyKm1KQBRET%+1mFXWS/ti/ZNX
j\B=JJ cY?ZGBHX/CRQ^W=j>M<ah*+hSGb*8$<9PIq:ukmeAAwYRW*p&u^9aBMYtR?*RAYtAd5h&uBVtqq4B1i9
Sj9AEh *kJ5i!hDNPK&aHE^cmRe1pyBPap5>8LHynS#pXLpm^8pS:uPJJ=aVk@qmt#4P>#!HA4WW@B9?Dl?wDNW
N&\5eY KJRdSGu4a*CByQ/BmH^#9#4\%MBAk56WS5ItaLe<=W6SB@cDKdqmM8JtRJ1?L5GaEe/Hw>lp*9/8IbcZ
pd=#W< 4HHj5HFML?L+\WnXdH?t8eGddGJj5RIQK\+4TNAVAEHhtGybyai1h=?HtiV*B*AQK@lZ1THYKFi:iiSu
iWuBla VMm:cGc!tIHiF<VHebH:Epy<Xl@c$#/RYT5iAc8<kXPM&hTddm&1n#@nEnYhZjii8LJ!WKy+pE6yP\w\
TkSlAC Nky!t&%HJyJyAIu<nVDGd@DBnTW1!nn1hu=AYH!IS?C<!pNmt$hM1LnR^y!h#B&^bK&=^1@c5Y+?WIWA
l9eXW* NVHSdT165Attn8HyiPYd&WQ<<IKVQKWWN:1WdLKm/Fl&\RHTNnGinynBLIA/1@Tw@w8>>D&tZM%Y5*bd
KiN/Vq A$1b=KuA&6WL/#tt=PnG!qZ*JDQkRj>FGqyA9yLu6WC+L/>lXy>y>:TIedRM^IZ*ebwWXctua<6>+bG8
wWQwIH q$cdyV:j+C??LCi!!$!Ze?HC#6cAKEdNJ<P4>k$Aq\EF\JF!!wCcRl*Mw>^N!BiY5aj/&j:Xl?hSYaM?
W&PmRk :D^ucT*45H/FkpLWdC*j\S%PjpCqN&RKnL^4NQT/Bq1ZJj$5ApySTPXaAYAlV@IbbbRWCbBW+:%DVPRq
$cy%$G c85pA^jlaZ9$?MNk>=kiJpqlmn\^^T6N6WK>lT%V@Al#QZ<j8iKYHaZ/LqWR+ibm19kGeN+F@B4:RCaA
mpLF?q bL?9!G\pFph8n!6=whGkZ++Zm6t$4XV<tK%5^c=+ahQTieqT=pni^9p%@ak!P^D4AnL!XKPte&^hG8:&
Ca!64^ iIp1E#ml9P8^GN*4q9leK8u/SiY+=PFG+b#qWw/YVm4#:jCHEumB&NtM>qbTbT$%j!HQ%%j*m&LjL1wj
E\meX? LuRGjS?PCX@ulDSLba>cNZ!RCZqkqP%/dQ1A\j?qX?b1ZnGJVBq#B8Zh<qTc4=qTT1DGH<wt^?!4:6db
=5BQel y15SdMGR\beXMTyW$6n?++J#4SAD$>tZl&JSn1XwWke4l:hq$nnX#$FpJ+jc\dbX:B6uhiFab6T\&%+&
@nVP9J iammwN:pDRXH>H=Qc5A8/e+F#H1pP#QRRaJ>L+#niHH#PC5/8l%/FD6!#dT$b^ZQeZ>&Slk=IELVNT<=
y\6beF dLEd8t*@aMlNBEbpp:c8tNYp#I&%DiADQ#!*eh>ej+V\FFe<i4i\E1S$ATtahHC=^Z1q?!yNjZhHH?6d
h:<?S? bA!XG+*^S>L&n5bL#56ISCn%*ZG?pPTDaN*<Ejqj\B^ZYdXQ$yX+M:C*iG$%t*GiQnXM8V\V\ywt:1Z*
VKQe*j >ZZT8TT@aZa=RiYj>d!8*Ej$6cnZ*n\cpayd\AKMdj$GM\cDni@=5V^RWXacn6Wqj!YK>>Sb8u$a%4/a
@&>4Gk +kB*W<IK9Qq&#jw$Km6!NQmC=NwKW%CL+Z94ea$?hjdA1+bMqimqn8c:@G4MyjlPjEPiAMwIAuJb*<AM
@LQSRR kkEMA$DcklI:PB$:mBeX$w>^wa8#Bi1w4GG</YKXFP:*FJ\=^eh#a1Pbll&a$pH&?BYtea^uak^+Z#JQ
^HXKtQ upe!k\pu+YMZb\Pq8&t@LVXAmuFDDJWAD>c&u4KZDaPTP+qSjYI586Zm$5RZ!N8^jYmJQlu*Xt=YJe+?
MjwVWZ @kH<A?u/6&nGB?te/bSS5:9dD+Dp*B/NYyCY1LVjTG=&Y8/F^dTp&GLn%QGTeWtn?/:M1yQJKlF=R!\J
\@E6%Y =IDij<:qJ^epL<V\e>?pycCnet^jahwQF8<j*6K>:ec6a:+\Y9LJCjBKNV$!N6D:Qp/\n=5bXM=LG=wb
dw5^<l J<GptMDtjn?n8Whmh%Bc=X*XuQt^/5G#WReqa<*M&e+<ylT#:bJnmna/WNYhwnn!I*unSLE#b@@#i++y
iGIZhT dJpNNm!IM=qS#AZ1>99apAHyWDq9XpDm1mi$e=#49BX%yC5#LTn!dabc&nGNla:@WDy41a%DD+8:HS:l
<hW??N m$<w#9$t4lL*^atP=&PTKSW1XP/aZ6yJ8JkcNEdd5T6/K1HCAu\n@=Vq=ejmtB/a%ualbW?NCe5hHpiZ
b4$d>4 :=^*SHhTNy4jN%NKKpy$VXD#nBBj9i^Jdwb6cp%eFeVl^F@$5yTGh!GPmlS1w4=!\qltQ<8ySH#k+dqe
aD!:wH ZW/StQC^YpHE#\5km1KceWy%19$!t*KW4k6!&qh==yKn9u*pTh\GIcPw^6ue:>bKu&lima948dA?1NHZ
Zj6I<n iCcljhnKJF$$d$iR^W*@Nkt=Aw?>##9jX8G+KX66kG?J+=<N&=k4XCnIM9El:tjC*^<&Ed@Z%D1nNHlp
aR8Lq8 \:$+%K48HI1@pi4FkTM5Hp?NF=k&TRLHyek^qQlRSTYZlkqc^JG:Cn=*dll9pb>eppKInyuin=GVZ9$c
uL9u># mCpCNDMaJ?5FF1j1eD/w/j?P9>@%RW4ma$IaC#hV#4YF>EM6a/VCeQ>I&tc4HB%uVJV8H=w5KeV@XyMq
8DQyJ: lj!jMXpweeq@NXpweat@cdL?R/Q<1=#=jb8MFQJ9>4qJTj$%?!h>dmkw>G?\<D>l^j?clj&^RWNBJj/c
n!qYM5 qbV/p?iX@B95H+?yR$Flj<*?TY+MCk4@G/#+u/\b<hj5u^qDFBV=N\=aHQHH:N@bYCnWH:N@b&Q>CT9?
PYX4GB N#aY:I<6=:?>Sj=:W!tF@E6V?S<>TQ<$qSKI*=uKj*8D@t5@pkRK<Z>MVp:S@>@u=DB^8>CM<Kuhh?Hl
-A6X^N 000783168e3001202b3 Page 440 of binaries1.zip
eNIDL& E!556ynDX@@IwkPyK=wl\MLp?=IAInNQl1um+d%Z?PcDk?HcdVuh>nmlMTtF1iIPZVaeuhq*>5HLCVuJ
FXkR!+ iZZ>T$##@ZBqAS#h/J#1=Ci%4/^RZ%JVS4nZ#@6<#V+%H/!$:<9X6Pm*&F9ikX<Fu<FG1HeNYEX4e&ab
waTbnj hV>=Y16I?5h5nCy@<q^=INycVKK@SwuTWSj%<yQ+mmN16YbVG?$!@C=jPLa1TJww9Ftp/JNL#41kGVnB
?p%yT? DV@85YXWclC^XS%qa5IMAwX1wqnN*t8c+^jt!Vep/4Q<QHAL/Z:8m\Qn\1hlK1HQ^8#M4VZX+&iy@Y@V
Su!4&c :SuE4Gm?VQh#:Iy4^JI^&F8nd!p5LKR&lnq?Eqy^14BYWnBTy9h:w+Kn8#yX&+iuppR=6ABE/S!N</%/
FeEcZJ h5LNHBnhtFZ$\mCM&CKJ>#4?mR*HC$>Wk^D@DNC^uM4dybqcIF!/5@mF&!6MnKw89uE&KHDn=T#Fa<K8
Q?p%^p yeL<%?1GNa#M>\&!8ImG:I%>JMPkL#diGYn>mQ5tCnSQPGPB&8dip+%:w&ZSuuA%?mQL#>48E685h=J$
j8wVNP +9L>F84NuFVL=e=^*6FitiPcyjGdn*jBqpQ?:JuQl!=Md@qpH9:<\Jw+/QJp\eu#=Q!D<pcB+Y>QkYTL
HR9CRn SL$8>^QI%A*tSc^i5MjWRZutaVu?uwWL6n4Kd6BZ+TTKNjTyiLHK\pdlWwaV9RM@Z\4WSEY#^enWVB:Z
S#iJye SQdl1+kC%nTJe#GI%c659FZ@dbbqWXeWy&VD:JtlQp1:46TRl<DElQbASWI\nBIl6>!ui<M^VK&DMWK8
W8?*yI uCbWWS8PY!Vm&\$A/B%FaAbdqm4K4IwLZInDPI4we4/RWP16mTHmQ*%FEWPNSw8+lR6B#eYPScW*=QTX
!Mh:dH PR4je>q5$D^aXmS6$GlYuu>m8lkn4aRFCZK%*4?lQ?&1a:>+K&!SDG!IReiw$tNE4=&6+%bdDKaJd=dw
45+/c/ YhVq5EZH^i&&Mp4pCp+<K5WNqBGkTpZ*==wKpuyYNmR#>Ph&ceZVB:1HtXBHmh59VBNFcy@^?b?BH\V=
HkkMJH w><WWcSpqHK@WWVF/Y^K+\h+j%ntiYlS4p1l4p=JHpTp8J+hc9dCC?\$q6*^T1&!+\F=lh61GJ^Zpa<<
IyuPWd K5bp=iw<EW?&ypm1T4y$w!:hSTI<8<YiH8R/wc6QjqPw\4@\htm8WVWDaGy+mIVj!hu^QEGBQ/TphH^N
Y+SB>m X=?Y:Z%FXm\VZ=>8+Pd<Wwq!9B4#Lm#DqZ8+Rapj8=TKnw^:XmXAVpT/TZ#uCZYVb>t=#c6>we/MpS9D
nJJ/Tm SRe\e+&m^<4AX\@DqWly^&jXI>!wucR!ZQj=FPbEt&++1iLie!^FDJX4^j?1>AE/LXiLQ^@j>TST9YXi
=CJALN L4=eNhekXS!SNy?^dYMX<>tSD!hH9Wkk1c9N^wJ$dn5G9iYVD!qA4Qnh>Gh:yAwVqy:m!*#tiQP8TMuu
#Lb/P! ML=^?>8Ml1M%<L$HpTSIHI4L&$MaAt4Ce+!8*4R6kNViNBXh>iDJ=bK!<*PP!QkYdnHZHJS/#hGde=W$
=9=XTd hpQ6ejaFS\6W^e516RSnVLB/4P=ZD1C&d>dtidZFiL:JJ9y!X5>heEKRZN8d<%FCcTbRKKQq?&Q%mDAJ
E9&dnE !aY<&5m6WCy^Gd+FtY$mmTlDV!9Wt@/RI?4LC>Y^IkcbCmhA+h!cEY$RjV58T%^eueVZFQBEG!R>#Jh!
DTWZT@ ^E\*Rb6cJjetm<X>lMuJR%I+ihP<8tu:@dKHT5L$DQ+LdIR8L^E<9H*L!nM8w$HZDBWhuGCQ9M1GN6aC
!teFJB Bq?Ad$i<!w*=VyBZiF</$!A1bZeMY<>@inPdIhZaZS*6&8J?A*8kEp@ZJRyld5VWdB*NQSAJBdaA?AZ5
acdF>b W\PJ\8%B\m1heIauFRwDlK+5+Ed^c?<9D9PBab?N=DI/Jy:qX9BL4B#tl5W#VY1TI>#GcbXuDZ\<Ly5j
d8:NVc hnmdF*ClTI?8H1$DNZwhD6VHLDV5P##l>/YK?5@KLDRLhF\NME\h?Pe8^XldLDd@99yhqVqt@%11c/#<
j#5V%+ 6tXnHXt+H!?+d=SX4MVZX$GFZtZT6iw4pW6%dZt>+kTiSiqXnWHVP^MptWiZJ>Pce%%d#A6uSljSae*A
I58na! P%FBm#pjQyp$#d5%d4acQhbZdmk>Kt1TDh1\h+9yd<j?%IkjDpX^Cw\!dem/lhK@%#uyjk\/IjP\S!?a
upjln@ T!lF%?w%Qe:*dY9*$PQ5NMGk+6dKJkZIHQRtdwu8mh:#E1mLT4:^/1qaqZZiQHQ!dG+HR49mY?=H:*%1
:NB&/J /C&$$q6pba+5dKAwQEC=ywI=8&F@6SYyhhK!5uMJeXnPCYdWaZ@tXAZWAu<:q/njLbF11<Yl<tm9lR5u
Y+AM=D =y1LjlStne*qPub?Zw=N9y$lKPH%=8ZtR>H6BBtQ9MpdM?@<w/hi&E\?uFhTjDQ5aDMV?<w#cMN\J15<
qkbteK *i485^D@\IZLd!&u=y@/Bmdpmqh4Y6i\FiHjm@K4SBd&*^k?5$#!4QjIDmy%PqyMN+i@l/5Ql?\Q/::W
tikQS4 HEjF6>X$ndLBlX=NkNHh?/n4=!>m$i/ZZL4HRJY%k4SGQ?6Bj^LM/FI6+VyqmJqc$ITt?$JM*I?lcd5^
%<EH?E t*DX4W+FV9MJtZT5mw*&d#h+IXmCa$IZPMH^yQ$A\kEMta8u<ZNn<QQp@hXAZC/aIIcl\jHYjFK/?FEQ
=Tc?>u &qE?!I9aK?c%1TlLK4VjVAGVS%X?#4iuIw$cIqFKA>a+G=I@PWF9^qSJS%ZJqhkmuu*RGucme/!IEa8y
td*lQd mc9<p4%6aSmP1BVSBAE5>pqqR!61L8K5a5lh$^&N$+i?W=C>BYFlcTW=McYD8kj?EpeEEY1#<FNP4TF@
CipFd6 TSeQ+Ek@EDSA\t5%QTA@##EKRkeB?<%kAuS?Tmu#>Y9tbSW#yjiyB!<JQWduV&aZ8B1BA8tES^e&tkR@
w&D/BI lh@VV9Pnl$XLc&?Y8S=yVh9a^T6JW5+SY9XP86&k^%9qi^CLky:M8kWd<6AVEI\B*NVtihQim6!$WWKq
M<iGP= NVw8+5jQn@KAH+aq$X&T/mlJ\WdYAiPyjY\cu^TDAuE<=>F!@:hBMXu6YydQp*ZQpwE6&^cZ^N<\QHLD
^XGWKH y/S*mBABQHJiyX*KA#FPT6BkkJywSb9&ID6H<6b/jjDh=GZZpTR@<b%EpB:4ahKL*ZpLbXZK=FEZ:k5@
eN=#ZN $kJ9Lw5quWpZLqq4CW!Y\kyqZSIpDlRjFmh1w*k94Ne!H6>9FhetM6nJJ^&IY*$+wqRPVuKIq^IRJYIb
bDEbdn pbhWVIRe<:6Qu:&%bRd!<\@\8kp/Gacq%LPJdK\Piy>?MJMe@dbT&\cTcAER#E91jDPppM$@:nE<N&5B
uMhm:w 5$DhjL@wLtJtm%1Iuce$N<Jtl\RyCPj\Lh@A4^4AQRZ&1*G/8R!iN!P5Nu+AV4V/F9u6Q%5Y$P&EYC%H
N4nFYS p8=TLZBMJml4bk1G:SpMjmDB1*#aS8\XA^5n#FS*T:V1LSH!G@6a$mRCp#BX5%^5DClp?DTe#q:6MXl?
mdD?=a S:R!+Ac6XycY=>$anl^$l4itL6DPh%8JXHuWSI^Y*\%uGLl465DLn91\bSZ!mcBb4WGeQ%j5ka#4Xpib
QtiF?D !4HpDYqkuY8@th*YWdm&F5luCl+q1LW6\m4@t5>yhEl+QnR&chdX>^ZHbt=bq!?\dt:u:BYMhM4D<&Z%
GkRc!X cqeLijjquH!mqk&iFMdFY+C&5$:$jhHMhDhX\!1ewIH$^q&a$4V<BnqBBkWcS5bSWFKj<L4tTR@lF*&K
pZJQn* deJhmKyLwyVC<8i^JG5>C!Xu*1e/#hRWj6R?5y?W1Mpt!TAjd$NPd^AA$:+PiZ<4\@6=aRN5hcM<&FWG
>iDj&p i*<D?11KEE@55>XE!uya>Vy:<>$XCkcXth/PP%Y#5:MLq/RHqDmZ*/\ZIdCn5PW61ijh!46LIemZC18e
Sb>cCH %ND!jtKmJCDN>iWVYWRZpipN!MW*9w!kD%9YR$yHPPAu#VknHEjwQq8+L6CQP>FA?:umdk\pZVy59?Jn
a<kj4e \R:+R<^%RS@H9L:iJ<JH&kG/k#8%eMt:PwNiR#XBk!*tW+<adN+y^e4XlmPMKXll\H^\1&9D=B4E#>nG
:u#H!! b9GJlL5q4dlPpu8@$&eVLkTp\Se5uLEWVm^yj=jNGWiC/Z<iESWYI<Ly\EctBw11GATQCGwZbIM^PbBm
QpWwCY 4ZDmapLadQLtMnnpIttMG$DbIi4QCN1qCdQb!B<5icay+XkJ5q:+FRE\K#qep#majJwlYF!thWkRpim$
&4L?JV d<NSB^D/wk?Py#km#5i!Ji1Rtq9NXu4$6uM1Xy+wWcm6KAtT6pkIw!iYIVmb5JDi!&JV&YM!cK\/j^Yn
i>PK#R YI6K#Bq=6ekuWh=+jtGe?c/68I8T\i^4kcb\R#XQeDt&=dBekGdJ/i!YahnSip^hM?u\X5ad!Ptwk\KJ
a&n4Ni 8A>Da\IVkQKLZeaHjw/VkQuZ>L\?HtX9lEVCXSjD%Kjw*ty*&dnIZuA@kV4CR5NNDGJ@DiL:Z/IlSwjL
*P4h=% bE+4YHFQR%//E^ILj^H@Ln/5hwtYcD6G6MZJJtdbaI\V9yY*VulWZZTW1J@q44RYEaBFZ@64p=VN:cbJ
FtH#Im dkPXT4=J<9#nC&lYMIt#H$?Zjdp#iN<H^AYDaq6WGE%bq9y%D?<+DQ=$JN:p8la5<iB$6GeI9W\LWmK%
\ymM#m P&8>1^q/%*:P^EHP&Ml^aQwbeyDhHB@XRw/\\9p?+L@yYL4S@#Ht\dCGT5Q*Y=9PZ>YL69X$>K@t$ACL
JqXmwy nk=TM$M&%dAN$G/S=N#TW*CBZ/B&mBQY=+9e<$ybE$!N%qplECZ@4Lc@LNB:yyycnuBhe8!SB6B:XTLX
%b!8W= jjeYTWc^*5eD>P^q8H@Nimdhb*wR:&ceZJE@Z=E\5Idq#XbC4#A9mqBYyjlpLGK?#*c/4*m=:^LSD:@y
+hQ:WW GSIimy$R&TtahZnt6qM\b<84\t6qiD!1D?t+/4P<B#49R8%mCHcNyWmDK8SkqjqVH*+#^X8Jy\diIV^K
ip9=dD 4$5CXjTMnBjGKn#S+G\cLipi*dwVb?X5TV\4YHwm^C*dd4!lPAyAlJPabANF<FuHhPulBc/Tn8%B%WX\
cn/M!> j<:h5JPD%B:VHc!D/5WlaEW/ej6&\yi>p&&IAP4Rup?S@$R<jqkpYXCZ5i^EhQNR:>\LEyXTE!kBt/*u
T^kFQI *QuR?%%=elVePZ\SXZmQyAJe=<K8=TQN+ZHuFHdCSe&8i!94:M9KyJWb<?Xh9aKD5I>SREdYC91k<TeB
m&FlAP E/8HFWw#uY%B>n^BX=@%GT654Hdhqawcejh>pHLQ&^9%L1S!iTlVQn$P&laypbwI%It#Hu6NVGyX4%*>
q9B%G\ pQk!1H/qKJd1EFD$AcSjat<5$1ZW4ED!/IP5yF8<eR1NuXDCa+nFHSyJ*RjnA&IF&8&lqYJYq&D*mKDc
a%I9Yq c1Q=?QJDNeJSEH!Bqi=1pViA^bQ<S@&1u^hC?dI#4%H*J$b?GuyHW/wbLK&H+R*FyBa&AHY+w>N5NNZS
6MJVyI =aWY/NL:5R#c5B>/XKk&/XuM%@eb^eaHbT46+%<J/HcVTe>6$D5?De#%LX$i8pX1^QbSFAHiBSi9PI:9
^dR5Cp H??mn*>e4D=YuP!wNyWQj+G%wRP4%EiL/G9wntXhk&:RQQA&VE#:BluWBwS%K%=I?pyJ1E@R4eR6:>>9
d9BR!G 8%^kSGE/YS9d<dch/PAIZe&pDmi9t1h$T^i9lF:N=bw194YI>*@!JLuV8=T8nMT@QQFJSI/BeR1pwGj>
i+diL= KhBJwST&cL?bW?dWJV@d8V8q@en*yNTJQ#Q<Fc&RnlDALJu&<ekwibwy1ANqRKhy*yK\j=mVj<Z%NAI4
iD@9@X cjMSn>!M:LASm!&:t*pEhc4\:4Aj!HQDtaA!EFL6T@6=J<jl^DHV8PiRQbcPF<FkEX+@58hwM/PlduQF
-Aa%iI 0008c34c177001202b3 Page 441 of binaries1.zip
j/19$l *aWEhNBdtbn=Ce+MZ6E9KYyuQPd+9eLBkd6tkA<T8=>/=/TmVEL#Vl@IZP/n@uFbCBTABe@D5D%%%euT
W\R!:D e&?ubMwGj1!k$N9*:LI=pF@9VH=p8e\\V<%y:D/?t/4+AYM8=jI/:IP\&IBpa/Wb4IFCS8@4NI+9EiJX
GIdjQd q>5*a:YdJ=$tE9aPRX9Mjw/S4BhyPSBwSZJ4MjLuXTt>mQn\<wkJK64#\N\bRBXX/<adjnjIRPC=c4Ch
ueYqAB 1%M%&eQqdGYIBe@?/&G4QTYBWkw=<$5cyaHWt!y/RcX!eFjjk9Ym?aH8:yMwM@\I*dlH#9RV5%q4F/:q
a9Q5d1 RR?!*LVb1/Gp!K:!MSW1cPZYuL%eJK8YCZ1&+tiCicu^?hcwGQ8t#cD!mu*JeTRIW5b/!$HPuNnl#1=i
4tYP+i Q*9ul6Q1m?n$>?#B8w^+9&B5?nL&+p//L+>uL4jS8/VHqV8S/<<t*ypQV?6e4#=B<6I&G/%Q9L+c&h6k
l*npyq i%/l8jPV:#c*@Z6bn/&aZ@8>5?lek^1edbQ$h=cdBZb+j6GTaPC8uJ8P*YScbd&K+8KLt&j<A!H:Fa8B
P9!/J< q@ZmLnj8HGZH*>IEI?5icd$968ne8\jk6dK^1HIt8*MTTW?uKjhJ:8Lu#R<+9LZY4kKlq$bhhTP^j:yc
B:K6<m EP$m@#a%Lp%*LY++IpA#/baDXtE:wh%ZRd=cj6HLW6V/inwm^*jjnQ8Gk9ej>\n>t/Q+*&bY@m%n=@>:
&&El1T 5!KB?y%bpWD?ZdQ!:&Zjj!$t@/=1@^<BRH>yXqDmmL>t+TmyQ&cSj+NF@AtL?t5Y>mitRX#14>p@NR$T
caGmZ& $L>^51DRQ&dF@<+B\@/aqjkdLF#mn%uJ9<FC@?S=aZ@NI9@5iPH@liQ>@@Ti@$u?D\#Hj@bj@hN\\H:j
KcQZtp m@X9d=S@NS\\?Q@6^jy@wlh4+u>^L=bN^u<LD$K+TTw!FE@e\c=B*Ly>N<X%4ZVZWIe1PnT+\lebd&Gl
ME^Pp< yYCb16yNQRXpC=!$1m$e1pjSyqYAtb@VQFbluuGnJ$atFKy4cmHy5y^ZRjw9&dYub\Fk1ucm+Emq&h8K
AX@cbE 896wd%IZbX%NA$M/*iu8L/6K<cXW#+$qmW?qkVjR#Jb^jk1bVnl/IW$V+^6!^k6AZVwu^Tt@eZWHW+MF
Bt+Z?X GYb>?qNY1eq&<:i&p@Q#F/6k>^hN@*$9Fw4mDqLK6?YADhbHpeMWTV*hb>yPXNBHN@+ijhE%M:GtILpK
%#<*+% +^dh\L5X:GwMKdVykBDih<4anD=?qtI^ka9ELWk!&&?6A+n/qNcHjWy/h:i@nwet1mBmk>aVJ6mjy8>q
k5!6q6 VJnLVGaBTnucYe^LqbDWn4b&L5!&Kp#!Z#dT<:GGWZ8M$6a99FA<F*lVw!$tS#%&TFbJq9nJ<pp/%Gn:
!1bapV Xh:8*9^dB*dFyl\1RaAi^n4<jy>C6D!P^jZRe6%F=5i5eZAdlXE:BCl%C^aN&Xt<<M6%TG1>*^J^8M1q
>Bc+K/ :ybk:tcq\?*/*q%w&clq#y+hQK85V9FJ!6bE=kC%PR*:e6hX8<w@u6WLy/^R4ce+&$l=#//h\hmFa5q*
:59BA? Kba9\Hj/?NVyq$jpSn965=W:!mbF%hPjk6hB&/$69B!:%@H6hIS=6kqmI!%V4R4?#A1C1WBkqmR4D<lb
hZ&1=h Q$VASCl+qkYD1ha55EiLSWu*&F8<Zn>m6ABt?&W8SLuP6XD1uD?lqh84B&m85V/Juq+qThyMi4i/ndS?
DwpQK+ h511tPMa9!acLKT+^djM<V/H=m=e/\pZu84Ic?L6N^jS/J1iaw%1@Y<JPwW=:Mk9pnS9t^=d:?WITdZ+
hcc&q& Mlj&ehu8e&?I?=/6Qj>^\=4K:*u8+QL!SI<Y\m&$a\DA%tJC>mIKiMGFN=b=Ph%Ny*H1V>>CN?qmhWZ1
W6J#LW :@Vip:WqyMYtYQeyu&dNG%:ncic??pmlWM9B4Je$PXWTChZ^p9WS9#!IBLZEctYXS8tnKT&*9S=a>c#n
$WIH%C HYQedubNSy%**bQlwli=>WItTYLQ5Jhlb<G$&NAVM<NiYjFC*GlYQ$HJnPtYCtpcY*abiF1k86#+#EAV
#FEB*P 1t16XLQG9i*jbBe/q!<\9XmbJdw=9%YQ>BcR!M&M<nTic\$8c:&Y\pY$GP6yk&N4YEd\d&Z#%8#TL@GQ
19HVn8 \lci!l@IhG1X5#9ml%TeF?PM5d\X4LXWF^%#FZ==t^PYp%Y1eu6B<YC^abb?Fpj*Qn>?9#N9hdZPZTtH
\aaJET HL@<?ik?>Pi6>8*aiLpKkTdtNwnDnECbtR?QJY/kF^VQkp<iA<**BLZjEy^y^p^%4nZbed5SlhlZYSYk
\c9/C^ DJbq\jG^M1mnZ^W%%=>j#p8?4^pqZYF6yX1cc$WBBH>GL&TV4wI:Y?y%h+&jTYG$++8@biDQ85W4Mmut
nwH:$c T>w>Q$QZPkh6Vh=J>?IS:1%L*&b5\&6R8yTPm&%D9<#GKn?J^NGqEEu<CK$6y4=ZSphFbB154T4lXItX
IG8e>q ?euM%T6Qya4SVJilI&b19LMk1i5Ph%6@6Z!$y:Q\NPV>8BTiEZhndna<we4iej$!pG&Y9b=$^G!mNEWF
ZD4Aq# t!Sl\iGE*!A!McbICw&%nGIcbjb@4bjp:ctu*p6cpYyT^M\T=&d$MF<1G*tZ64FMqVFMSYWj=lw9iiGn
ZQuu#4 yjFeSDE\PTPB6Dc=p?i>uTnnDju:tAFQJ5LyAV#>WdTml!1QKJ&we8mk/PCNcXHCZBy!\caV5<9Fk%bq
n&:1#C @$GVV+^h9KW9?NB4K^Q8>+H+he5/bHumPui^4YD/N@%MhtTh@YwS^WbBX<\N<aKj+GKq%5RMJt%$@F$t
jSmJbR u%n$?dCAVHp6m!@T8q=CJG>Ac9@kkdJW*TH6jw@9^E1@#+F@l\+>+k45YqNY>#qMtPeI##lTWqL@WZ1!
Nq1@%B de*ycCP/kG=>Iq*jL?u?M+JCcjQN@Rl@*L:QW<!W?M+8jX@c&lc/@LKGleZNiT%Z%1LTeYAaG4K/tLN6
@BSIT^ FBX>?!AH4dS5@FW&+69pSGY@:&J^=&Q=$:+:pm?j?b8wQ*tSVK<k\!M>hyCmd9>I9HqFPRYm8XGluh9Y
c%\QF= J6t9eL?t&NyF+&+*k8/m^V6=npV5y6c>mbL*@4H4k*FJ1?=*q><XqK%c%N@I8@*+%*#LHicc%N<e?K*P
e&!Tj5 tHSV9wjRC@=t%5LGVp>L5*+^++m>yD6iiu\9wwN6S&TlMeDjZtq*5?BPhjyBh^wMLZ>5LP&#E</+CKJj
QbMF?6 nZGCNPu@KBBi9?Ych=tp*N4hIatanIFHB?*/mnacHw4nuEtiuG#nb4/&w+:YJn<K::%<?MlM!JSGtydE
>WQ%qK V#Xq?%H$ny=:GehaFqPtKZN+$PGwmh6^c1$tH9qCXZX&DN:<R\m%Gmi!WiE$8j%G\SPnLbJ@n<9I\bWa
dQ5<p6 dTK$:@L%6JKjqWXchSS8X@EC6HBZl4F&A!nuN&IM/q4nhlSWiLNN*#ehRM=iMmM/<@WFMQYY:tP>NaVy
XPH=G/ @+8>9+=1c&*:6YGKBE6\KFDcW6\JMcTW+kSQeHeJ:q1k8L5ZK?:8%ydm:qbKKeZhwbVch#?&9:&ji/%*
Dpp48V 4jF<?@*&GH99\S<lpCQ#tnQZVPa+n@!8$>8p#>C@LP%X*md6I9SFjRej%9Lwdub9LJ*JW:Mc!b?K<dRX
mA+5IK 9qZyCp>X8:L6&9\?^CGGlXHDt1wdn>94!4mWh5GN!ni:*4?hV6C%i:Y5S:F+:5hac/ATC%6qQ+MSi$QG
+*KnLQ HZY?jJS<LMCK=VcSSLXpd+^jI:%P=:jJ%y:!RdZ6T&\WJGKkYt>TMq5FKTFL>B%J=CT?lb#MX\u%\C/^
EBSN!4 SVH4&au4lVtKFc%dhjajABq*@H85+CW<1CGm#+tRt#K#=mnS@S1tqJFF\?J\QXabjA5Y!iQ+!=4p:<h:
l+QWC% Ph6WWw:X9j*u^P\EtlQX*ZJC<BK>uyJqQ#KKXdd+V5q&\#:u?yym8<GiFXVtctSmQhpTu9X>9CL\PC/D
\wFBAe V=#Y\mnHLI=Kii!YEl=\\hdhch*=Fp59S\Y*Qlw4k5mL\BbLlt%$acmF+5lMySJqBq+&=#Y\1dEtu$wH
ad\5:+ uIPVMEaqQJn!&L8q@cPqdRW9ba/RLj6^baPyBwdC&GqDC\jKpjiWyWb!<1Y/M>#*m=^BEXj<CTR&BMq=
G&diNV =FyYDVK$BH:=PQHj!R!&B5q^B\mC\jH&$khc?^l%<WEki/*ThkCchPX/KlNhFCqIlmWyp:Z9euZCi9>l
M\u/XH ICyu8\<ancni>ZYW\Z9M:^e/GZCCSN?#hDZH6hnk*=w9HBdpV#%Stj>BpQ/:n5$</ib/Gk>4YmpA1RR1
e<N:Qp tRZcD1Pt?9XLL@aGK=iGWh6<ibbJ@X!%Q!TGX\%D6:SHki^>T8ba>uI!F\a<ECTnA/GMu/=$eP6p*j$B
ta/I$K Qc:1@KX/KEj^D@a?V+$1mF*CTuy\JRdH\nCK<h!%inX<*k:Zja^VpXMGKJ*<tkNTdXQuQJ#ec:9l#*&5
@?N/Hm pGI#4VJ:wnbdHu1J\#QR^1u/pWM8Nm:MebZCL$c6lu9&DJDIX+#9mPVkEY^e?W1GNI!M6CMW>>@FI?ED
V&&dB: RiSlXYF?l!:>WB^a>qcP>tbkyXSyI^?8Qw6ccLn#VX$5tt&QNeu8\hqJ*RHR*u/9p%Xc<$nWhRjtm+Ml
/1uBIY cRym6DLTZk?>QcW\NheDBe:P5Vw:%Eln%MJFLF<KqV\V&lYdmlG<Z!iG/FQcaDNJI:m6J@jhWLh%5?AD
q=$Kp* nRhZEbd:MHtBIyZPdSttyFVe^uw\11l/4Bpc:9!5mPbI^ptjCLa>t!c!WpKGpPjEnWn6:bQjKl6cBCw/
F9BJ:k @ZGQdJHDaZBGJXkZj:5?/h6hyXYD<=?R^tiM*Abdp5Y\WC1iLXwVl*CSSJNL9uanRlH%p<qJTkF?@I**
RAd%>c KR=!$^?\\k$S<#!>a\V11eqF<qZ!8FwccnqwAXk>%q1YG:bGueHIjLCt6L5/5==W&X5auwGInLjIkNkc
8WCH19 n=1kTR&TZacVJ%hJw$AyqA@RtMbwawLaScGkFp6e$S+p$a/Zh&5<j84daEiLm=hZb5anXqB*??^k5i\6
R#GKQJ hW1AEClyI/Z5S5%mGA?4%C5\$bw+K$p!d#je/NWtB5Vil^6GKVpB<AH#:Wjwhe66/KDb!1d6B<5M%j85
Faya&H ldk8C5=j\Ii%QE5CCQHb#CQ!=iSY=$!CRaGVJdk*aSb/K$luSPB$*VbII$Lub^tuL4MK<JkY9aD\KAuw
lVTHub PH!E<ck5lYE*eX^>YQDiL8cGk+&!#=Jjy6\6d4<kB8\aiukt!PRIlb@bA9yI##j&i=IQy6*%yHYc4K/e
Z$8Lhc Y@DSAM4HccJtm^RG^>K1un^NYDcpdCjYTw?+m9R?lnH5#?w+iqLaklh6?S+XZa$PEGkdD+BMD8?yd*qa
TSc<1a KQtG8SLIcYH\1CXhE@d=h4V/6IVluF%!nGd=8M!WnGlX/?j+%i9qTb:NC8cW/cqVbc5#qb!/M%^CiPCq
B1W6n@ />wb!l!*EGZ%5%PKl6AmZ4PFGc=F#w6<?b@/%%akpPVCATQ\kPPFT9JZG1EbB^+j\E=?nW=tD?dH$Seu
b?#Y<J EIG8l!KhNqbBYJFlKhR?^M8I:!6b@*5=^lN%KGS!/pBQSqEZN\nNLtaPnLKSn1&ZL$?T96N556@pGhj?
=b&^YG ?yRZ*Q^lSGP&bp4bBG%a=GWXXtT>MYnWa9BlTX#:JF9IZQ/Jq4CPG6GHDDQDtAJCkk^N?I8H&qdhAEj6
LC1nP+ DGu$lIutkJQZwMjndVF+Y>$>mEbACZbTllRyM5TZPVQ8?4+4Bp?PneE/kX/RwN=@H!JaHkt!mdVP\QMP
L+Xn@C 6+w9tdSBQtMMWSbl&SPpLDZk8Rpm%Vc*QZ1FaK\:!*9F%/1?/?uICcm9*up%AuDn8FnQL:Qi@lnCb%5c
nDH:k* Xyk\\Sy5I#dIRS1\J%4q4dFj?#aML<Y*/y/E+>DL%Ehd:5^!aKc+$=8n$E!T5Lpu=<hepBb8/E:bN69q
-Aa!BI 00080a2d9be001202b3 Page 442 of binaries1.zip
h88pA> Cc4J+^cSeAP/&LQj%alXCEDMCkcVL*bDJZZ^b9WGNDVDDLTFR4Z=*8PP<<S8G\Ke#uT6:j8TwhHitN?$
p&k++Y R@iTFu#G4hCFIEaKJ>d6/4891=CKh5CXK!ynXuncCdjl1e/&mkEJD=I%4%e1!Z%RPKqj?>ti%iYi\4hI
l\clda L5MlSPnkI+?RZGlL/B^cG$9tC:Rm@!TWZ%F6#aD5tN+YK$lS^W5i@A%n=u9Gt?:<\hBJC8Ent+dLKP\V
S&l>#* dmRVaC4*QP/DtK+4pjuPZquV#^VWeq!w*pm=<k8jYu6Xl5\ip&4l=&p?SepYZykpMqN!l4!Fu5IpH:9a
1p^XhN \dJnLFn@i1L8B%5ytdVWdd:>+d\bN>#<%ep/9%ud!IYi%aWJdX5i^9ppDpj:qW#T:u!1=wpXR1IIjD6L
kVdqeJ \*!Rwj*iZe4mVtHWwEhyJ&kmaGEBDGKeK9V/$W$VGYn*!uEpI/RC?6ItH*lL$NGmE4u*LL\><i*Cty!Y
K<pFuh L$44yda*Wn6VKY<QAt!*1Ap<AMwH4!Rhlcyd9!VZJ8BR5%h%Q1w?N9StmKteuRq%#:T^jYp!tpFM>NJP
5:6edE Mm6VNHbbT%P9+KtHZRkGuE:iq&k8Bm#%R<quXCJ@lA\d&JVkAn8#Gm+kNTKDei6/GXlnhjN>PndQ/Qdi
R1tb&c yTb:qH@E:Yj*ntp*KlJ^#:XYTq$Y<juIp6luJZWAmdTyFCRy4wqTmmqPDInw*<qjD#Z*VlGJKhY4C<p1
@SmZ8@ SG!/NE\Il/<\/AlQ8I+?#69QuHX=/MB^?CB@#w=^qqVlu5QIpXV:R&eR6hjYwi$i4VQt>aMGD+4<V?Rn
Ad?%H$ 6+/L6&=J&5!I:5pDw$/bi$XDq9dpljQym>$t1/Cu:S:%BE$khlhq*p=jHC?8i&Yd!8Y5A9:%89:::&wZ
/PaK9h ciQdVwMXTXCnat/:8P4qCa>aDkP=J:5^&m*i&yZIEu5&Sn$Emd&LKw$tKqba>FYuc*\*%Vi4t6=5eWeP
q!FWNL \#=eEc>q%*wNEy5alK69R&XF:YYye=4e%%aGq*=lM$j&b\*jFdFP>M5M%Cq>F*wl#%6ZNBN6PuI&u%M$
%=y=B: 8Bn:pSYeG^STC:h^QTcQ99eWX+DYNtC1i:k5SGWt>TZJn&GXl8n^Va&Jy+!iIm4^DR?LK8@bKd#M:bt#
qB4<%& G??jn#QQuhE4&D?t=<FM6SLZ/=b\8#CY&4+Wd:>ZVMSX:LG%ZQTe9V#TRp6PwY%eV5b#i5B>DbN1uukk
niHpyT /@l+Zk644ccLGN&kPXECXN$yP%5!KdIlDG>SXN6Saj6Bwy^mw1PK%ue^k<GX=eSE%ImX%i/e<*iMyQtI
iNaw@M QF<55n=@eLjGQ8Sq4Q\Gl8y5nPpe$NBbFkb$eN^Q*QKY/ile4$9jGGF\H^e8GCqjHdAXHBT4lb+apYBk
C=IQZS !j!9%NdM%=*t?yQ%e!jum!%ZM$LL>8PW1tG%!<Z4^bA>Hq/TtRc=!lMEn4:4yhuZ5Y1bj58%TDF<Pq=Q
=:1tqa >1@y8P+EKY<M6:/4:!wIkmAAK#tNw<dpmCYm@V#DN?1jiEup>*Y?wQ*TNSmEQ*GPK4!C&:&m?#1d1yuY
\Cmc=y NJTmN+^!a%a&LFemFFQ/cK&H!JQ^:qTii556Wb:I*1i@j@HD<*8?/9Vy*ucVBMh#44Z&CDI?iX?^4EeN
5wa%Pd <M54&KmYIFd5:ECKH49m!@HKJ4h5iNM&%heC$DkG@1k/K%wM<Ey%IkI\w*!SFa%iLEeL/*tJ8jXyjPKY
%WaJyK E@tJGH\Yej!chAIjw!/:9iAy$1i5nJM91Yq\W@>%++*%p+hy*a8MlG@q61TWXjH4X#!PBl84miTj1Y<>
X!==5y K%&h8hTqMW?uMHMpY?XNVBtlBn19PR&CI*QVQwSpkD\lh4LQq&CBc^N>6*S^!*mWu\:II^^9bWW4qAbA
a:l&&$ !nlXb81jp!FEkmX1PqI8N:n<B>bjd=I9hALZXym>9t4HlLKGdk^AAE^aHNBwPi\R=&I#MBY6TuBT+nDK
Z6WI^q k!yGF1!i!pSpKS\V^nyd\EFQ^JVGAmd:I^MDEjyjctIk\9<qE\Q:=+\L:G>uZGB@qHESk9/#ZIAI@$$V
puX!lb A^Z+c^d?^#&XlKCR9<FC@wTF@nWL?:Q6\9/clj=J%kRK@&5YA95VF9HZ4MCjYC8w+F?#j&1QwEJ@+$D@
BSiVi^ meYBC9@ZYSn+@\j&Q&XN@wQ<j#I^@=E9?SeV<^>>eQ/H=+V<ai<dkj>n5mad@>6uVh1iNhAQW^EFIe*t
@hD=GV G*pauD9C:c46:58B9HetbQw!i/h:C1S9Ft84Ntb:G!Xp!GnSE51+I9\F^RdkkhR+Nm1B%MJ#GB=XCEAE
lu4daA SNpp?Ql=#K%cb:\:AX48Yi^!Q%Z+F!t6^iE9!y\1>i/8l:1RwJS/KyJFb4kC!4%EGcW>y1qBldLLlcPA
RLLDc# +>S8qBGR/P@5@E%\^chk#/1G??w$#>SwbtEGh%TEVT$eVA1t+4a4mH<LuI^9MIpYBM5&1Jnb*>C9^Eb@
aPBB>! 6l$KE8>:Cn<t&k%XNa%Yw!KI=hcXN:qXbqa!DPyDNE$FTi6M!>Qcun9YX/>JlC<IHDKH+5XG8wVCdtXX
EK^nWA I@mjTPF+t5ZIp56^iLy8FZ!/#+nPuK*K\^*HKQ=$yBuwM=q:QZpeEPY+Lb#YFVF#J?S&*>dFVc8kbTPh
$/FCB? mw4I=$T?&J#tX$@uHFZ<i^n+li%ejD%m:@Bl!/dK\j5qu=J#:8kkLb^HJpqeZ\#$FG5DP5PYmD=:6*\6
^lP5Pc JZ?^5m\Lw@%!H/:jFb+yKVwBN8*SE\C*uwkj1h/*hI6wcXiyKBt$i+q=Q=CF^/1wRh!*/*I>Jt&wMjZl
AdYe?m qG6St$uF\Wa%#nieIj!VPDy4\/?L&jFT8\WcTuIw?*d+=qP+n/jFi?Y86bb&<Z/S/&5H^=EjYlGP<F9!
pP&eWE QpEt?H8=uh1pX>tt?#1lR8uaRMJbX=eSiW<P:Gt:5d+S\/l:h<W!6a8M\ZZc5nt64*yFj?djYkj#=#yt
^&t=B/ 8c8%c%SI\c^pDN/ELLhJTyuwF*T+QcaBt#N?X\ewiqR$$&4EL+#^R&*FY$VdnZSDLCS6:I5uIqCVuVN*
c!RThj u+^aJ&KF?/N4nRqLA1w!/dM8Fp8aVHQM4N+CiRuE+w\a&C^Gnyd/!=hHay6^:/Fw<bkA8DwtcE6dJ?Aw
Ii$VbA *Tdj4@6t9tEJ+w6hlZeqD@&+NEE%ZeQB*=qm8%/4SZ+#cNDS8%paw\e+5Hwm\KldbcqhnblZV/5kM&!K
5y#%=4 btHY?>RwjHMb%kI>ib61QZZ/+SZLYWq1V^/EdHZacu=IFhS/SGCXjjA?D\&uS:JC5Eq^YleueZX?w5ww
@Vj@P? tqMi1%lQ&Cth?JZ4K=<&=w?Fuyq%%^EnA*hZn@hn+>E#k8u+>Ly1pl&<DumVZbc8qV4T=@^:DVX<%J&@
QNV>1D KKe6aijT:<1FMcbtX^Fil#y6$=H>L+AcbRH#Ey@LKuaKp%c^HS5%/ec9n4qwI#uBN8RKCEAKL^8lW^Fp
&VYMiQ IwE:M#bARq#YcWetA@$68wK&8mG^MTD48cZ4YT^DwN!J##1L8IQ<:l8mklqZ1ci?Ra1M>N@mHVtB%BhS
mDZ1=I n!TpMd1Vp8#h?EaJP:RC&lYTNZTl81#/qZ%inVPGujk@ljKwTIydmNywhWJ\%4wn%C$d411!Ju@G?iYd
Ecq!b9 6u!\WcQa%W?9C1wK1&GE+Bk4HXJEG!\EN<>Aq*?uGuABS=mAH!kq<?tb?CL:++d1\=yMF@jV1#*F=K1T
I=<F*8 d\966<Q\:4ta+*ChHW:JmB4GH\#TnT^yM6iDK@eTG>@S5^PF=HVIDH<#:d+P++n^:RJaki^HR=N:/aY#
T1^KP* 6bIdtwy>5kJKa8aMKIW=m1>>iK*W:e\W*$^qqy:wj:b+1F5X@&t/=dPua=Du1+c#6#Wjwa@Vt$MBJBNK
+P/Mja /h?4yGeYjlb+!pTZ#*:uy96y49N%a&=Mmd:qIjYXcS9uu5T6RWM?L8k>WYhjE/jWC&j>Ih/$6e<>L<J#
jMjwGm ?mmynSj*\+9CA4c+hahMF><wKB\ituLAJ>Tmb:@IMl8NTuS&XLhTVK*Sb%ZM6W!pXDMNTRJVpuJ:BX>+
^QhT<S tS=Z/QN#WEy1BIW65KhCEY>wQ#4$k@aKM9SCT^:QEYndRYmi\5jNR!acT8%D&!J\9SAlaM6ceB&Aq!G!
w%KZjj #a:D54G!nHpy?F8MdaWnX\abqY=L6HFTSeqLGm//aRSLEY9%a+@c*!1!ZDjH^tadJL/^$>MyCy$c^SMc
hwi6qG CaRQIpVFcw%9LX*6lWVKSb^nX+e=VipcYnqVDeEcHJd8Mp6t8PGLI+@6TD++Wc1Lci1%cN\L<9a=?e&b
%KGT@M k4lAJFjME4=6WLqlKFQGPRmqJ$@uFcdyR%eS8DcMaDPcic9t*l5EYJJXu!c/9B&=N<?<9uR94!p^K+GL
GyHYLH ZkLn@yY/j!*lK^nbKl!pXSHLmq+J@pTm%T>mX&c5^K#^QmL6!>y!CTZZ?%yHaMH&nKH5W9=^6Nk&/#I+
TaAX?i jHplQ*PBWL<$\ljZw8ZN:Jh?^T&*AkGLadtyL?L\aX%@/6VXTC<Bq&YKtGA+weXDKW16dcI6?EY#Xc*u
bBH?8S AliEN<5FH!C?SNqWENDheNit8&i!KSETN8Nl!BL?+?5%WWeEuW9eS=uajk=9PNlF<y+qhhL!m5%!:Zyd
wnHnSZ 5\AW@*XKk>QJVI#nGF@j86>LHh6=:y4k?K/Qwy=y*pd!h$Y<k<le\I/Y^Jiup61BD@y!*9NXJkmJE5Ri
4JZCGp G:tBm5PYeMIy5T6\myau18ITcl:>hKl?p/IY9Sc9/BFj?1!c#tdBAdum#qZ^ITydT*im:451SdEqu4Rc
JSlGN& +l$9@ZXRyL4py+=D5Y?Hi\^^ND=&IWjQ%K9+l+tihaRRGPF<RF$nhdhubcdm>hlwB?%S5nJIKE<<CR4d
K$t\HD Pq4&$^BJaGX=d4H$dQ^pwSM8qFR&aCm/b5JhqS><$Ai+qK$%+G9j6l\j*Y:5^@Y5hmDHHSa%BjVIJw1V
911FQ+ kHA98Qe$kljBJyMuNw+%I&++jB6?t$cH^bttn4Q><j*>MnTABB4>EnY\5#W8&<qB8bC6Tk8AXP#\tCAd
P$^qI+ XRwKZI:uK5/N4q+hN/5:NG84#w1JaqAkC\GX1+#JXM6M&$@6mQI4uJYQ=/jY4\$G4<*EaFY^>51MEY\i
I8pqHn KNRFjkH$>E+:1^Yjubp=yRQ4b$nbA$e1neAYB+b^d:&BkRcedBA8BY&:upEY1^^PBWPMJtFXBlZB8Bc^
$V1@bM E#bZciAi^Y!wtXH=jC!HdJV5w=4?!NG\Z9m?kVdnATnJ%/aeE1NKY:P8=#baHaYYuttA#bbA@M^&Sp<p
!<M&eY 9YhT4XEK5mQXeh8ikG$PML>Xw1Zu\ZRAFNN4GmLI$DAjM6XeS#ANQ#DT#<?WE+mNSV:H5tTKCVF1Q8*9
F8e=?P buZNH:YN6b/%KHh=TPSdn8/^nq:h*PPa^S/nPjB%dFlV\F1NEy<NX!PTP#S<%DQ*5BHPmD=ucwm9a&Q#
t1L5cb dmnW=LhntwlN4\qRIQ@IkNS/\/aRWWh^pD<h!>MDGGYtB\inbM1a$V<jda9<yLnQnA+PJRnZmke:w\MG
W!#d@1 w%CFHGLSYQd/?jqBMW^EwJ%K!Z<N1WTitiA#PKteiP+6MKGLYGSw=K59!tw5NK6\i=KTa$/^$!@<PT<Y
\D*hSm KMLbYeh/HM?4/\lpRV^?/eq\ytRu!n*&S?ejYemT=</&upW^lP!:l9iEEEMy+9bmAXbp^GD^YF+L#k1q
#ZDX5X cw^aDCiB6Z^@4IAu^5JKbmLj6q=lXMwa!*YPl1LVPDneiJhGlbj#uw\BZ%&tQ!8V:4/Yb6pbt4@XkJ%F
a$HTC! %=L4D8&ue+VTb$u6p%#:ip+!mliQN4GH&yN<:%uVDFF+tdV&a*BSn4K\q?u+ceJYyFYcpJ8jK?uhn>NJ
kKJYt* LjG>Z&BV\W&^PuM&4XAPW>b+!AAFmcPIN&X*1\uKqjVG&?tGq&iiL:<hn=$^enwHn%LIH&56p%@FBG&q
-ALyQ$ 000c832fb5b001202b3 Page 443 of binaries1.zip
\i1a#B k9uMF#pccuISJ&eEeFuW9*#&AC@/bYN$*CW\dk+4/RIjIwZLi<u>\Dwedj<&$VYZ!%WjQF#\iL<h/mnF
8aw^Hy N5eD4+>=MQ/ww6^KK?a>Q+SZZmbZt56PqnC&hM>9W\1Qd:a$%F*B</CL^PYVRlk*E^cKRINC5mdcMI##
=qlB61 5SRmJqwI4#w%$cwH#cJN%XCe&4#JAHPl1^euldR1ZHS!>p&4T@4\KI>kF?<RFS@JnHMW1=GX!M!cppn*
=$Nm6> %SH^D^/wXj=Ee&CbXw6F%e#@pkJwHYahJ41wD+mVZCQ#b<+GQdk!PBYjV:E5Ky4ItTF+BljXG\nXTRP!
tYbP$^ =b/wY#*WCQ!M*uW&LGPeQbQ>JGP8a>$/X*wEKublL55WPAXcka6JNP%9I^u1#^GPM$ew#DcmcAq^nW?n
4>+eLB QA=m@MSlwSYFqANZ?5bh=Tyi?b=#<!8XeQ!&MHCT5R$NZnDMu=LC4EXTu+MZq6WFTK+Ecn&9\l/+S%:P
Ii#W*L ^?4N=IieXnhij&di^H6CZ5VHTcB*Ke<=1<:cdBXd@ltBjC=*lET%LMtWFd45Vl8q<q%#%RQB>CRJ@5K1
TSVkQc VeK8l5@N::QYa?uBGLX=e%Kd/1F8=Yq%?qaluMKqqVb!^NRVbmH1AV@:lP=mC&^5?pS&A>&XNBL=I:Pd
ibC19k *+kNmQ%84d+e&LbKV:HnJJTYLSBXQQCM:#H59d44jcYXXQnnMp^a^lLLjq>^1q6Lhe<j^thmY&@NI/>?
ZX!>KB FY=cH$hu/i=neR1%>dY4V<XuPulXKX59l&%=WR!&$8NXF4PYujTNJldF/C1T@VcV#aH9nIbm4=qJ4m&X
WqZ<ad &pN6R@Nm6%=+!V<AmFlnZP+haRP9S##8C:6Gmq6w=1i$BQ8hD@4dQ#J\=VIdw#LHaG!$9e%Lh?abZYMB
Ldt18y m@1\AXt9cKjTLFMcCWKAFBJR=E1iBl?5^/iK6wZhYk&T4iB:R>YIPL!Y$NZ*uMQy9Ib=awj&BVltAKya
C:V/>8 NYbFjwKNthd?>?%$/W6F5!^tIQ\Ae!YJAE8HB@h6C?#+QdT:VLWuQP?H?N#TS6FTa$D#=t&6u9$uWcX$
JXq=>d &5yYXu%GlD#Vccuj5VZ:1:B!C6SI&1RDiDebdRa#tJG!d%pX$I=XdG1\<1tFS<N45jt#eiI#^tX8l5Qw
mGGyI? mBS!&ey#FuW/P6:u+NMwYQM:KRhkkSc&dL<ll:ibV1N*FCE#t>1mjZmlHIFGdCP5/%cC1auS^98XE1Yc
TdJcX= Z:tDZKmLW:YS!?mwQhqZahn$GP6kHywd:k^ZJ!aEY:5*N6XQLIj=uWyb6/<K8iAq:GI/lRtAFRcG>XjV
kBWGJw aXnA$9=1Hw1*#e@JlpW#uLkM>yYFBk46mF1%Gd?RpVt?4h/$KthN$#4qwDw&h6@#+&b!P#mqPneFB1<1
KCZ64p n6d#:Iq>A5JDp6TYFc%c!/SN<WM@%q8<FZ!nSknR88!jq!pV59ph$yHb1Z*%$6uq8e!wHLDh6GQ+Nlu\
FDjFIq qQD!jt6yD>$HHdlHF9t#WCD=@cFyK$=R44YCulLmFKD?i5FhNTw9E+INbR5&BVX:jHm6Zi<CqCQHNu8d
w%t1%* APKwq$JW:F<X4p>mwm=Kl<V+PtHF18hp68dFTnelB\k9AEiJlaWc=%YJ4Y9a5Ek$lZaiY<N4T+:!kZ5y
1HD\#X @C%q8t\bTR*PHS8\um@pX1qqZMmRBV:+Q#/pB5tA?%eS%DtS&=ZFiC!FN\cFmw!1tl%AZ^aV*enbGJZ*
n>KNGH @QS4lD<hRYneDlZAJ5CQh<ZeGqD/ndYYw$D4c6GA#htYVh6:mqSA<HW6bLGe:TtX*ChQ&WK:?%i<kn*=
1DA&8G !/CcnF>y+!X=KbT<XRik/T#>NlcN?y+DL$$hhBYyE$Chu\IRL?9=qSb+!@I5/>J=58EBYbNVM<Sqmdkm
?>MabV >BWE\jE5e6mwQd/PaLSeHAP@=I:F\M$Qde5cd5*u=m*cT$EL<!G*H+!HQ#>5%=LC%pdlVSu\M4W4n/5$
\Je@Wt i*mVc=J^?>dhbeq<<Fb@MbSc!Tbj^@n?FSqc<WX1HM%a\%MKP9Y$Mu5pMHkMcF<tdq8inJNZZWXcBNHR
NuHR<1 FHn*+8P:F=@#mwP>H*AWRB@y4W?RDD5HT<jkNCTipP8ThABh/eS&p>8NQh+cj/#Q:VLnciYJVQW8cym\
QC?Whi eGt$YCRV9itSHXb4adH8wJhn8WH%#JV?BD*w/M?$yGDu9BE^/ww<Qj@KiWQE9$mT=tjc/nVVhtGkP!\Z
y&@T#j cZpIZ9ckP!>^ut<8K@ajyNRjYB/8I>qqyZLZ@bnk48<TQdJR%d<DP\l\Bcm4u!BX*hi!I8MG5WID!E\5
$8kh!d V@FXVuEtt\myp/TZmM==4eJB*K1QK<@A#YhbWXuYKtIy@NWHNRWQyHCWm/QL$$?iJj@nR%qIVRAXTl*n
EmnqYV QA15KKEA#YccEp!uMH/anBkFNG/l8jHw<Cmu@cZL%B5N:QhtmWMEyZiAZw#B&CduPGTnNAuK5*E8B:=<
Ad\ViW /CF?K/+/^@jNMp8L8aS&?C?W1=k:*Z>#d!d$t:$FHI<V$buQp^@Bln8pQVp@cHVdWhM*jQ*GPuR*h>ye
>dT1Y$ 6ZG\k9hTN1Hq5j+9M/@8/AV+Y>*MddIa@@l89dqtPe\Qd$iL+P#ubAb?QY\HDh9CRL/!Di+?ZM5114uH
Q*JkbF 4K5t9VYE#&R=pMF4@MEHXm%h@ZnjBS<$>beKeFI==+mQqM4%lKlyFLwXql9M/*u!Y8l:\5QJRBSTbncX
!=^upB MuMM5a5eIhej&bC>eVJiT5N>yq@uIM5=C8VZhqL/u/5in:nZBaeYJQX#GbuL^L9le$G?1bI@@4JV1SXD
=%ceWX XqaiCh^a<1%DYHV*HYVHIF\JVhwuuPenSl4inQ9iyYickS>+GETm=u+W^I!?mKWw@uk:16HId%GeH+1E
bB+aVy t!Pjn#*Kp$@SQWB6I=:GDQ</1Z8kj!4QqGPRtVZ\#6Se<JHXS41SRR49++uIR?!+CZdLkuuQNc@1l%@!
5Re#id l=c>5Z*&Khp8$EwDT#ZuB4KV<@YHi*^6KHtZFBZP9t@EN^BLt5@:amt!B6Fany:QI@$/e>y9LRwRBJp/
>8$Z^b ::?J*J&XTldeATL*/@J6X?$*Quic@%twBjc@N6RC?/?FYlDkj%IyePG@1%L?9d:<u/9Y@/\HaH<*%AJD
n^JThN @A$Y<5h1ATd+%?!jLSeGE@y4>5>CLVDl9&clku?<9*D\*&D@8EtREF#k4>p@Y!+MD9pd:J>6F@4Z:J>1
NYhG*< GDn5d:^Ij^JMkj?NmRYH@ZEkB9+*JlbW/E@a9#G^BAV@iLp\8NB@Wnm\9\:V\Q/:MI$k?J<XDq#+D^RP
NR\:%a ZFDw@+by@8iHcTJA@@<N$>mB:!V?JW\DW&c$ua6*RJp<CMQyKlPXDdIXyTIy5qCaBWB#%J<LP8L!4bXe
/ZQ\ba tIhR6#w+$NJ^Nd5l^<Mw1*<56m4uV=FM8y6:TVTw=?S<m1>=+C\Ae<6elp$j1i9B=>GHGkN+XCL6c#B*
IYTtbG yDyyy@8tFSX\\W:XhADeFWuVQQ6R$AlhaK:SPV5B@1TGcl1@&b/F+cnN!tu%:+yMZeb^$/6iL9S<G9dm
W:%&/Y %lS8V=@IwRM+aEK$q=R@&jKyBcXaQ%Sy#M4K+D=C8XaSBVQV$:E&&auBl=@WTEY&Jq*>jAlV1D:daJ>?
+bXpXM k!<1hL9R@q4F9ETueqcNTNiI1/aw?@t\D!9DRp6Nw><Kp5=Sl:+%H68Q%61lYBG54@5#9uKbLl%CQ*ZQ
QRSPdA 8aI^*AGSIa4Rp+G?X5wmRAphWPc1XR:yqh5SH>Lt8R99QCui4hm^E>X?#NYWE>iC81hTWk=9*>TlIypq
E5&$a= GnE!h/6HS#1CB=uFuPb!45NXjQ\TIp<MXPR/yh9J1Q+%Y+PANut+GZ>M>%jXl\Y>DSKd88FG$5N/YhQu
ut9X^L uD1LNTDG1TWlTy?PQ<8KLAR=GP4AFX:m/&%MGAX=6nRhXH:/DAt#5#l#$FdtAMGYMqb%N=Yji<$5bVly
Xa&Vwa lNZ$T^X1Fdm#Cuh?+9X?P/LHPLMW>9B^NZ&d9<jn6%Pj$5QY&^=FwP!M::Yn=A!PEmQAIdu$$i/eQ*@A
MNX/Rk ^Gjy1LIRS1j*yHq^J^$wb??D8IY>&HhITwKm>F+R@qRJDlP4$cD#S!VAj:?n>6&u^Jd^QKppLq4Yi&lM
bLq$N& K/SKe1!JHiF:8nA9+8*<J8d?EudVQZF:hjqjNG<6jyA<4n4#=H:+<@&tDcFSw=ectahCD/$5CT%Pt%a>
9cmX^1 F?BhMVmbwSqj9J!n1&NPnNcw1Xw?$y&8LMIY&C9j/V#!^bwhG6m1j8AY^4G9WXT5%1y<?E#E+h=KmJTn
iN*!wL a^?byYHyK\>i<XE/%B+CZ9=68G9u+GCmeA^i>qCWT#cVmK#!99:B$aeuQmVq^6B$L6ppQMyNYK@BZI:E
lWtwVW !Q8Vb>y8BI5WicDykq?T&\@8F@!RD++X!PhGSq=q+W#H&nq5!elENlS\V\SRc51H8Dpj=ET@qPaSIH1\
%lZhHZ jddHh9nVuY#6WR<WCW4VG%R#YenH%<l^NXQae?J/ykannD^a\S*^4qQ?Ll$=Bp>nPhNQmebtqdh/4*lI
kApI8$ aK4mT=m>ybdHukYS+\6LplkE8/<*miLhI:TbBbe^9bie#V&?b%pnW*8tu8unRWH&Me9TjiNiXLMjIJ%q
#cJh\< ?lYi$8K<19QIuh>M!+an=*tbpY88W<y8y!QH^dR1@4*TdyyAGyXZ:iXWJ<L199hX+5KiIc=5ap1I^I9w
YY*j+u eKjh>4?+<SjJ=uF$#dk*&?b$H#!+q#N8B/XaE=RW1p$$BV91&6%:4q+WcJPc+?yWd+8tVWSLwN:EaNaL
XRKPmG 1dK5dh@FF!$d^Z+^X&<?P#YlGkQaVF4L:$b@8l@XJhZ!lJBu+dh8^h!qmte\5eal9uH8i</W9j*#^Z*S
AiFH&& C9yajZPcV#+lImPGW6J9Dcl@#NI9%dkpja4WYX^FAMbWe6c#P5%ejei!we+>J6\bhY!Gp1</:^KyyjI%
JZi@Lw w>duQ=a<jSLZih?MR8?b6LwLbY1lCPH\?VcPqM8LmdE9aaQH>DDeR@YpuM&1CpA/h1y:PYZ9RPi>d5H=
L%\5R6 n\Z?PVt9Z!Yy+>jMl?>QhLRLbd!Hh9#AhVKe>*WRem*+YJ#aDuyjGB1l6CJH*@!=pnnP<McQ11\@5aXc
P@Cjic +j:kqP#hk:dw=R>b*6&EcuDGFHCj*RG%9F$AmCFEn*di:ENZJeWEQPPFqi6wiEq=Z6\de^9S^eaEH@H%
Gw/:+6 PYcqy^SWPTb/^Nbe86YVZj86=8XYNeThXbAH8*ShA>hLMG9L?PT4B*#C6DHWc649Hb6J*A#ei%b&T?Vh
SSVRR6 W=JK^*a&kn1ZuQJCGuuNF<J%%8m5XIuCjpHhqedTmMhDGqPA!SE1IAtm#^RTm8L=H4M!G8#9m\?=nmjZ
kM+A&H Y>Z&yZNq+Y<$Ry%HG%hckK$H1!e8cjJ9=Tyu<6c!6y1!KY$%%?eW>dD4TDWKa/5>A!PM<wdpHJpci%a4
T9iVF: y*EadXLAtS?HSlE=bq&ZI^yPhpe%1#cH5b>TY9jN^6kIXDH^XY/c=@l!:6+L1H/GJN$&iq%yqQ9ec#LR
:QtHnj ?##bK4>l6=4i&ITJqRqDEqc=i&F9nRk8n4W5CRh+q>lBDFG5@I4YyEb<4QK4ChE/lqX+*8Hut%cj=heP
\@aDp: :<ZMX\!qey^:Dm9/NmP\4RXNZ<*d#XG:VJSB5!unb<c68q&jZP&m\tem&ju!c+1WN!ZEi>/Bh=>u\5iP
DeK5Q^ c%>y@yn\+I4Sa+uwX&!S1Tn!wm\kF4e=<:l=\H9#!/9=!au!+1:p4%8uJ$klnjjy##@hG4%&RM@beS&T
:+uN&\ KdtyN=m>FF!&CVHcp&X?R>WF9cw:8ZMC&a^?\%WEuD<EQ+k<mce<d:@I<EF!jAa&+E!>E:wn&M<aRThw
!Dqpt! aE<KY5XkT@:tc9ncGCi*6Q1lVP#ym4hSZYF/#T!udNDpQF:#peHKp^XLJ=kQP&#@J&Kp5?1*mdBDj<8Q
-AXSDi 0001a5200fc001202b3 Page 444 of binaries1.zip
IG*j?L &h%5Sb5J*neSnj+pP>$BZIPK6wKp#9+J<%9^Kl8p1?E+K4<V8t?*i:=^G^tMP</T\l1hqwjZWX%XpF>X
j\JY1u 49c5n9Z<Y&%IF?\T6wy?6h*KA#>e>$Cu?n1X=i>Ta5t5yT$D>H=&bkk:kywyk$E<uqn8LMNE=*P46$8+
#8qX1m b<$H&MA/MZh?!G*CYk%@bD/y::i1LI9/+M<k5MuR^qhHQ+NR&dC>QS%TKl@=QZ%FKNEwniTt9ayCAXFN
\eu^1a >Rp+D4>5k\S4FMnZ@u8/%@AAY<e=<S9i6PTPEY\!<eWA@TWYc4+/<%l/CWCI/1!LF5R/mLJTB=TJS>q9
wIdTjE JXe8?!CdR%k4N#n/\\/=cmPTF$Qh<+:w>hpH#%tFjQJu*Y*cKP9I!6pmZ!9B$6BmWum&4@e$Rktpn!yp
d>Mt1T \^y+Bwy:4\G$BT/T88i&L+ee*VHS?L#LHm\*kmd#m*9hB1FlXK1?lmM@ck@:qTW:!KYh#/X<K/*MN4qR
>a%tDB 9jKIIp5SRbJWPbZE%C&8Jqa%*YwLbKqj*THE5MT?611L%4wcMP#=nZ\napn<Vh%cE/5bIQV54j$yRbEX
4+>y&5 Iq1D9e?V^P=PDn&+*j@LQIcAjbd#EacHl<YJRKBZ#6JbJ5Fdy=lQd9V\Ia?i!*cQuFIJHll+hTFpmQPT
nKQB5t Xa&dFRjViJSil<6A+1w^hE#XJ6=Lpw##1A^4e6Ri!Y#Dqw#DGMPlhiTN6m!Fq>:%N$yKR+m!h!Xa%TR^
lpA$um 6yWhSZwJLL?p!q8aXFXAJY!1/$QMiFAY^y$TbK!M1#A95@/Dm?JK#A8tSp&YaXPeMilDq%AAL9@De+bN
kuNpca QEc%Sm5hp&&&KSZ9J6#bJkbhedXAXY?D5A/<\uKqBm4#bDK*HhyKT1ES<X:u1DQBI1%T4pa9Ru641$A:
S#+S@T HBi81lDa>BB<XP&IWuIJIA%up*a$h*c^ydLN6?w41^*cQ#Dnj\B*5+RZB^ekN!#MJAiK*j86kd/ZKiDD
+l9/c@ H=m1aPSeu9Xa<F8uu*B:L8hh65FL:chV6A*>Pii!dpC46\&DK5Z1:1p:@dWE95:BR@A\i/+/Hk>ZZG9y
C8K5?9 +t/P?i+WlEGI$qEhpV5l<l4::9iIKE\=McVQSZ!MuM+itKhPhXed<Day*M<1/Mt8+QN/S4YDQeeDAcua
Rtc$5: HZ#?6YHyw>Y#d#LYK/?H%^GP9pQIQMq>Lk\X\@e1TEqDym?4qGSE9btVAkb\N$++CMDhBVE4JXc=ATJ6
<aiIj^ ke#1M9LQKEtup/n+XKiQEP#mPk%VWJLFWX\G4eALhTqq5pFAikmEybacd*JqqD&E9w+cMEZ:km!IkXAy
5JZ!#y deyd5FpubLnXQy:LQATVbt&lmuYNWM6VpidHeuL@hyy/S^y+m:#cJ/KTLD+nccH@qyk1b\e=JcXp&a@?
uWLhHd 849#i4w>e#RZNTYMu5@@Syd5ZWpqu:@?:b\ATbtt:yVEkVF1kLS\P8Wadl61%jb<&$4<mt+8PCE#8X45
:SJ#Rq V8%^t>WECel?w/nnqIEI^^l459bpRcVA=PeejXGRGCnu4DMiqy+:Hpt+T4LuBVe*RE/:yZM%qkFiwSVt
S&5Bhc &DNNua<petFSTc@Ea+59Tu<9#e>BQi8Wq1iN#!DI/1J*Qa/+?QqR$emBXFWk81hq=qk$FcN/SKJmh\aI
i>b%yW <T\?cPEqd^HuYDaq885lTi&aSi:\PA?#cQXRq#Ah<W!iRn+%Y\\Ednt/FbkpNXuiKFYMS%nmHn=k:bE<
&X!Kic Q8j9h^?kpH=j=j$?XttR6dPHJuLabC$<:iw4SdH&8ELjpa=PI/%i84S?\$i\udEq%6/kZLL%aGAQVa%N
hV4FjI =BYJ?:l+weECwaQP*khhbnGCYjwCS%8HRRhPM#NJ=Ym@lCRD%\S>/ldPYa%Xn>A4kIjJtQ5<9\@H4A&a
HZlGAi ?yW#6^FJPnimVE9Rw*YJiuF1P=#pRlNM98LMI4yE%iAi6m>WyEVmmV*aTmdn!maj15:myi@G5etW!1hN
KXDc:p ki%A$cZnTGI!!mK^>N#Xm<F<==AVRjTNi5c#w6cw=ia6bP8ZW^K4=t*Y%R>6m9b9qQi<M%JJ6tIQ6*+c
LeQ?yt K81wKA4#+:t\liqC=DjTXL&>t+LL8Xw+b4^V9$=^ZHCSyPX=YCW:PIkl\V<!>1Yhnlyi*Gi:Y6@YlGPc
uF8VAQ BEEe8>#mSBen\^?XwMA^bmZ9/m*Wac6@1PS4C1V8$a?V=Qq1Vttp!nq6!/nM+EWkm!YGT&nLQNi?qcR<
R9=?FL M5b5!Wibbm&D/KyMkIy\!%9ww6nDJabdZ9^4c%yEwb<V+=+XNDWK1#h^i^plb!1F^\caLCP^KwmW\bLt
J?FYke Jw5Hh@cZ&$SLmiP^:InI$Q8#:m611@5M=Ebm^L?Ym8le=VkMpEJp>1beSWFuY\qjBRL/HC&b>i^mk!AY
+KHw:5 tZBt=WVX#lTF+E+y@eSaZwda&h!V>QZ?u#y6AbAcQeA=hTAHq^T+HF+^/A#*Fb+YnRIN1ea&cnmjVZwc
*BFN/5 Hbchy#I4y^SqyEnbyXcGH=d5^m!Jw4h*+CZnkE&qXHF:PXYZ+G$@j^$EdQ\uHChH$EI@1cVmabHu1Lk%
hqw\X/ 8M+6:yX:CZ=c!18M4IVPkGnlqInmnqj$eB>jd^aQpECEph!<aHM*qGyFanDmAj<@Luc9uKiDKDR<n<mT
y/h*FV 9*/V\:mjCCcE4>VGu4TaEk>jk#l=Z^?pa\m=D5Ej6V^Ce+?1CGhj&<t$Ii6F4<nZ//uX#nc1<4BRyMVG
n51A@4 G6hkZj8ulMpmp4iupDy?A9C9c&%q=pHG4^1DaViL<%9@E8qdmF@MpBQNmB@9pK8:9!q>Yj#4VcWWKie#
6LyyFF <q*HNSp:CtJ+h1SiiPSYEPhT&Na9u%*^pDDli*G#ad9iPqPD*wwK\$M:B=b^XPiSQT#QmJL=$HjAAXd/
4tdIGt LA^Mk##MuLCt81E8R*=Z51^S^=qY$PSD44K!X!%qiN@#t48=m6GM%Ct%$I1i4C9Ti:9=1Ke$tS<mcFk:
PRPPR5 9Ty>!kj5ewbC%?TCaT5XEGTmL*%#%qB?AFH&++<<Q$S/Z9u&i$jQB?DL866MNThmRmQ%RC5=:$k/E:mm
QqjSiP Gw9%+**Q5t1d*i95*:E?jumpyP$dDn851tl>Tp=thL\AVn=L*m#V?yR%:8GS@V#C=#Zmq?EXE:D?5<dy
6Am%9< c+GlnjN#Rl$+dCbiuIS5uBV!CNBWyEi9%@=kHi/BI%Q!wAA<tZZH&Ad8SJhEu:mayQK@nwch8+W>!J>/
ReXLYX S<k+Xp\Ti<eVy*/cyAG:t::=whd^ueAmKNjB+Qmn8H5#X&%qICn8%=yKEm%9/QbMPEL9t/Du\b4D/Cip
5=>Qb: c>WFL4wLi@EPYNu^^GFCM*^5^AKZkSmBKdM>6K+!yaLG?C8/9/:EDK9N9h$VlXhNP^d#9jGCy*IhcDGD
9AV^t* l>Mh9>e8>:Eb+>pbC*\alN9WJ1SHIa@hEhc1I!wbE/FT\WjLZk^=<kbuLjQP?p*FIaF84*RAIb<Imb&m
1MkkHl d:C@5&aIXjRnXSc!*wm&cTwcuXK91?%uV<4+>H=nLKTPG+=e@lL^#B=^1DYp@XLl\D\G=lmj^tt=+^mt
<Qpbqh W#QILl8&#^Vam^lcSn/$pni$SP&<B/a&/?/aFS$eQ6u=6GCw9@V^&Piu?5L=5BXJqCiNPWic:b5PC9&&
l4n^PY =b&j9tp8W9FYSwK+TdE@XeHHtXbIwXbR8Gqc>lLt6\hLdF@HwlI=hj48G%4L<hhaJ+NcCK*6$Cm<*Yh!
^6W8#: +y15=hc4>dptY%aRJn$LMS@bTM*EYwAZtMTi=F6%LjLb>\p:A$6i&ZQFM&&mBp=d4!!w/G6@#P6HDMF4
<wal9L V?CKe?8P:*ul:9DYklTu>I$TpRN?/y%8*B@J/I>Xe@m^L#?&L=@Lt4XTEM*/!bTFmEZE+4+T/Z*Xbhp@
H<DI^M >D!mm=<cSB49S:w56N5m:K^jMh5aPFhDZ%?jFh*<9T55G/#:@bq>SXWh8b??iaL%Yyu4%HBaDe/nNhh+
!i^/1^ @RnQ@1%pKl=$!idSmuB&h8!L4J6MHBZ%e#*h9i+kw!+cFiKkyA=H#TKiC!qL#\mu=AVPJY=njw4YB/ek
MthL#@ S?QHa8J?q/SlKeT^B#C%^ph1GiZ!Y1\%/mI894T/Z:68cJ1$FZwMTLVhddTF6iPh8ZW\GS?YZ#<*wTlX
WCQ@\6 G+\#H8jR!QqkqBHDcFDA#cQ$nmj1mi6*51:T:*!4Su5b&m4?jKR5:RctBX99h?9>4pbEI=k>E>kCCWK@
SJG%%+ @nlyQCnyd8#?6Y?SHqVq@/Pl>yCu$hJpuKRR!@=jtla>pTdRE*lAkkjaBJLRPkVF!lcG<Ck=I1kidJmV
t##^=Q T&RBILSAQH\JbL<XB$^?a=cPNu?JMn*G4P^Xpm5SJD/c^EYku%/ak?4llp8S8^GGR^k6k#%!yjGJIZTw
Z?PTX/ iQ4Xdj+CV6^D/&c8<5E/:tARt+8iAa5DAEy9j%c^hcJp!EWSqF?aZ*pA9w<eNMM8mD@RD?<dKE1TXymB
8j+<qb ^lGHCZLue$S4hQcI@=F>RwD@q>wulMB@!V+JR9:JQkpK@F*:>P?q<j>WeEj<5>qACQ^N?+TA@k$Y?5eY
SEXuGL CAH:c^aP@bQ6\9?clj&JnWEk@y1F@6taBj?c@dMkD$Lw4>p@6WAI+d<#/D<P^RmC@=NSRRn<yXH=n!DM
^F8:?R 9^kXIiF@Nm1CAu>kXIV@eZn?D\uFSDD>:>?AlaiaaymKeD#Tqp1i%MKZ1qFC9Lhby1>\?pFVWB\ByDHB
it4ykV R8%6PGZ@N$tT\#*dyYpJB%L/whkBQCp<HK:dn9H*+ye51JB1c$uXT!ub+TcZH4&&5NSWk#Hw9P>9>VCe
LNyh!R ZAAX/J:T1b4Ywb@PWq%!w!M#AHLXm1h<#<$R!4GSH*p^TVk9J^#Z^*HWnA<:lG58#@dE<dJHZiVRF$%@
^>JpiX K4FXRZR4WAGQ8I$hmlc9HB#ZFDY5^SjuJtbWEwA^ACH%><yuXINHeXehM>ZA8+Yl!#j155PyD6Ej8aPT
>uK+8# e^kAl!Cn/*Iul!Wk>$$#5uG&4jK5M:=q\Ylm6quny:!JubT^Pq/De*?#!1dJdM@kQGbJG*+d/CT:RiXy
MCEZEy 4F@46I=YZXCVPWVYN4L=Dlw%*iw:HqA=SyZX%W&nwNbyl5cT6p14jye:Hnn+8YFN:ReIWNa96au/S5MV
@BpiRj Kpj1H:eVl%yHZyL<TS:tKQ&PjkNB^++YN!&Zc^#n:1ceSQTw=ah$R><+b4EcJ++ZiL%eiNytjX+<SVTM
hVnPl/ !c=Qbd#wXI6+A%5t4>$cu5=:4Dpjkh%4CLyXY!CjM%C=b/n:aA%MSbB&&6ZQ#PG1Z%^Wy8MQDh1GjMIe
anDc=E @I=THT+Qn^mpBMJIm1kn^4+<KtF>88i9>@qkZ=Quq549Lp#KcEMDC?&4&RW<wR*l5ERGjknkHG!PTZ*9
&4n>>? bJJ\:%DA9ZcjcMPJK#cHmyM1?Y6PwL6&!Vlh/!YVwW+\u8wkE^t:XiwLY9$GCLhHZ!1<M!H>WM>eIbyT
/:aQER EM9M$LB^^Gk!#KEE9:bNy<InjD1%w=jNLHh>qT8!9GP<K%Jyb:YcI&K>+LFpyIZX@A>?@81HJSp5h/b/
ptynEe B5y<k/nY%tY4WXMSL#SuL/\X<y$pj<a?k9^N45SNblt=8YIC>!JuBLLHLqMQE+qiFl#\uKA#G^6C^JwC
#X1&<8 KSy#jP<XGqp+K<lLmCi@y4K#$F#jLkbdyiy@/BiEXjt9<!+HFEpS8IFejSnaQV9jki^j+:P>=SBMpYA9
FjG4d^ QP@Zj9JtYeE/b#=n>qZ1wW>i&:Wd6+T+kdu+!EV1$8B1dHTw6hWdG8GS&Gp1kdy@ZL?8hG>1k!bipGVM
HIw6tq XA^^eJ4#F4tqbH$Jh*6tuW8MZNY\4!^%WBni8<5FD1iYLIMuw%##NR>i=Td#e1hcmaXJnDHy&TjBPmPt
Gq/k:j DZWnae/!MuX$^aE^^NW9MKYEnn%E+NtWDn6WiNnVnm!Ydj%Lbj%KLSd5NJJqHj4I\9lu$<ZSp4Hnu=lW
-AY9MX 00056499c52001202b3 Page 445 of binaries1.zip
#Wj:?E l^jX+RRmh>R?hek\TK4wm6GeEu$y&L:V<W&aleFnyLT5\:jypiKAe@YNV>1X?Y<H/FY5LHF&FN!jZTQY
K&mu%A $X!jK6LhHhQDeRBKPiNAN\WTpGSdCN?Hl$CVhQlA/&^H:NKc%IcQdjh<eMadTwQeTKi+6L1J$MA&+49P
Nhk=HR lCkB*aZF&Vu!Ycm*G>%pEYS?*c+t$*:W=TPP=kQL>ah/hke5D<VLGL:ye+6lCH+Y\G>m?!TWZiFHNcMV
K+?8+u by@bW4yTG<dHce5<V>+pYEcAb\8D!TKj/C8\pyCR*tN8*^aAWDH#tjImSNJ9u6^:W4KkRHJE@/\+9$+N
Zn8W8M X\=h/hk:$ndn1bEeS$KcS5MlSXVA??yd>bj$$\?b:uSTwP8A%E=/bm6*PteKbLq1<ZV@&Mc&58<9hF8B
Ttn<hl !mh=c6%kj/lcJi?D<pVd*GXtHd/C9u6Q#TQ\qKKei5MlLdWnZDpjqFXe?P\H^L1J>FhT<?&=JB5K&!<T
#+LLRT nu\81>8w4^X*Nt+9SPXKc8A9XJDCpW\jZnwThH:kbP&e@5lh>jJ$Z=9hy@/Zw1JRlZjyqy4#ZHK%99BI
w6:lDe VZNuSqkZybq4Ze46Qp84HYbLa!\ZNGEdccZWZ*pB<cyu4?<eidEW%@m#@#%tSYKu&CXGP$AM4?=RDIF:
QJKkI> T8yKHkd%uwP*aNtj1t?$cNA>jYK=C4C/YHSLFMwL*HuDuh*$*tt&KeCmIh?^CNbc!Y9=%qKkiuleVc9B
BKXjwX H^B<L!6Z&a+@^dKX48L%@VqB?@jbS&1/hSwS&uSNVadJ+:=^cQQ$#CRZ>e9bKpjljh!%LyQCd=+JEW\A
9mZR\J LeLP5S%bJ+YK%IdF\det=nY8qbV!Z\S#:!*N%+be&8!*^Qw<i1&+49/NdHy!H%FC*ZV4WHWiVk8@jPNt
iiht=Q q>lDtu5=eib16Zi=:?u$NL!Dc9wtheQuGTq<=W$PQ&nMq^*/a95MaG5^8=^u<=TYJG:pDa4Ik@JmheA9
++pc?i aZwZadKl>LwCMcT1yuG4Q<+XB&PhpGRS6*E&i%148WQC@%\&dy/4ydTuV1dcYn4c=C/9WQYN=hlN##A>
mM+>tR ?yQ4P%4!%E#\l/XNh<Ft!@$hSLhGXi+9ZB@m<BDpbRNL8hG8lb4i9e+>>@ld/w>N@FGyK:/9LbI<jHq*
lWEBS* \1IS>:FTBQC84A?RuY?ZTF=RMZhwHmA8tKYaaq+=$qee>$W<DD=pm*&kh<ajyYSw@Jk\6$pqt/BD&@ma
/JnmBl >PCn\<$iBiBm=B5$@9mE<m6c>1hCc@enn#%I1i%lL$ZV5TTHFy?K+n5uV64AbVin?4uI<4uTlQlTKht$
@Zq@=T tJ:h<iQwtkj\$4XW^1*Pm1nP+YPV?etVD\Q$Q<cZiYZNAEV%tpjP/HDHn+1J8=cIjSD*QXcCdLP%?WHG
dFEN&a 6VnJ$HYVLq6H@#&qSc\L&GE5P4y>w&I4P/=^QJF^64aMl&%$&5SE9!#>WHwc9wjXpW@XeV^b5:%YF+Pc
AQYa5b I#+CnaZdHa6?:WNW>tiFm>8C:i5XTP6jYVM&!LVl5ZbcD*aiX<T&dl?XK@KS=E?GYAVWDS!wMt<$K:K<
S<&/P= 4C&@bEXAuXR$\QE8a>:68^#6JIP8//5HF6Hw?5X!RuQTGLFG54XtlV&:R&yTa8@GLa5>5%ZA/cAq>qt+
qe9yty hSny\N8eRR1?51MRaPTTnRuMZE\u^mkFj#:e\utmWtuPq5iuuldhH^B@XK+cn\8Q51EwZ>W9HVa=mkT/
!P5>i$ 1QV8\HnZ\/k\5bi>S/4<YhywI!iYW\CZ1\@HPMC?hqQS>enEc9h5W9@eQndmMjY=d%d^/Z%G%NXJdZnm
@dFcwc yJiJXXR$N9Le+eGRhFKmu$WDp/chP^:Y^ph<K6hDd<@?LB6\:$6F*Z8qyXt<Y5bau+k6uN&bXdwecMK\
$Yele= l8*YX!M*naCVZ^lS9>1Q&abQN^wymI^6J$FnjMHD=+Sp6%%&!Tqu/jc5ZT^+BCC<H:*5nLbS&Q6D9GV%
=&R>1w \!>=wymIJy9G:M>eXt9mJki&%+lA<hWPi4Q%Tq9nawQHG6*^8*nl>SW<AVFER5Q&QWY5d+hP5\bbjS/n
*6SkL6 CuBWG%XnGV+tnFa:iQ=p5d1a$V8apKC8$iiPVa\Chi6D$FkZw*N>dHun<dPNS&&%9@teC/Mt\?ZPN?^D
M>t?1R qt5uCI^XWWa+eE+Yb%Wb4cikFIEbN5BamIBXJSSh!VeD%5>j$!:Ti%pe*YaP5^jZlX1ekbpd:yW=CYDb
IP?tnE wqIIJPQCAdWRM:AY@=\!hE:Q!5piXTRMh*M8PiPHpquCiB#B=n#Q\u@CLbY1%MGZq=:/FkG*5RS#/Eq6
\:4eiR KF6&E+MtY+=MC8uVFE8l5t\BKL*^?qccY/L?*EPlm?TqGph+%TNpR#d$jCZw\w@:qEdF!jed>+$>$+Gd
&u*AId p$=XYYBldjpCwPV=VnaMyT6Ra/F66Sh*MykM9SduVu\%kJCbKkWFLq/1p\5w66>^#G=ETwNIk#jBP8Dc
Bm\wh/ cSBB9M\\VhSF#:jiBjbww1Si/ieSK8hM$5EY8:Tewc9IJWkVZ&RSwC^/PIP>N%GGYDkM=W8RW^qBKVH9
b:1YYX Y^yP\qh9>8M18a4yq=\:Lwhhj?qXaP!\%X9dj4+mI4+1K\Cw8KJ&MEI&MHWw5H%?eP&<%HT<^+wkRGcT
Xm6?nT bq/>Qn$8y@TpBZiHq9eajDEpYcE\Jy#cCS!5L*V1#N?SbE?%==$:Mh#dcHV9hPJ4#^!bEJE!BuBDNDX=
^CpecI ?AcjABwMbEc4n&&^uRF1/hcDynC!@WqQkRRSw#1XhDdQAKY:L>5Q6bkSYW&^/LDPmKdpG/IlPPlHw@5X
tMd5wm QCHQa>IVDYcFYYi4lZJ6VI9EVIn9Y4mw8!AlKX#HH4pc4J*EkcmVNJWP*P>cRJTt58jLFn%6?JD/JkT?
YT=>jh *w+H>8:aGAWhXJiu5Y5C?tSWKQ\F&Eu:^F!5Z*H9wawZd1*P!:T1<cqd^F16e6I\Mu4u\?kcACCMkBkK
uPL\*Y X5Z*hAn5M>:8jt>=<J&LYd%B1ML#mWY=&nEPdtP=NGldYV1pZ4<qE8dJ\l<H^Ytqm5YDcpjM/Mh:tqG?
#t9j>4 M>WKi6/T1:+yGcybah*Cb%V@:ip%XHj*P@t$*TNaV+@mTZZS55#RS?ba14nS^NlFHqiIkRKA+Xh6M*^>
=R/N?y Qh@^KwyD=<N\8*y$NTDN6%8L#KaMT<:bW1y%%EdX+B5R&SM+&8e&uXp/JZHw@A$wHTdkau6nZ%ku5wEu
Nm%J#Y ju5p=HQ$/E&T#t9+X*d?!HeqY8<Pkc4n8D$KC?#FP%8ITYQNBl/Iw4MTm$@FQC1t:9=$Hl+R<8$?V&?<
&NdP6G p?mSyM9m4@K6AL+Tykm6Vw$F#=/II%n4VVckt+S+HqY%+5/1N6nG#M=G1#<maqPXPXtilT:%\8GlePqh
wdFk$< W9i5@iW8DAE!^9H?>NnjJl?LiaTkN6P!Wn*J\KVm\55XLX5FKTc>MFNGtjAFbJPy?w*5K*l9XWRlmet8
>jlS%G =X/F?9YeZ%PXMWL5!DNZh/Fb/!bK6%pp?:B!%=9cmIiRRd/+J=M/$BJQy?&ZGYXq<MDLIC%9>W6?C*B=
Ej^l!N GK&<&<&#IQHh$LVBjK<QFERQ#jC@B&\Kt5R4jT6/duCiVh*\k5Je$K#+^MhTk\V6EH/8VTejLLPa%dAu
RwQJ$d VM@NFlq8Gb&pHq%<X5lt?yA:MbE<5e#cQlH*N=6W@R8$eVT=jDR/lRcyhttPF:j\YkRyqNjiPukdE5:>
/Z:da5 ^ZHGILlBXH@PP54b?/^R?8!c+aeCA!Gab+AwGD$W\5Y:uBI:q/D/TZG?lQNa\=dAHRTl#:Pp+:YEdM5*
WP#eKG #$<w@c\:?!%DtZw$k6Wj>RTWPt1>h+YJ=4*+hYSXyIj=LJ^K\\5=!L5Rh*Xty++tm^%hHc:SeI^VtlGP
bWmmY? B$E&p@m:Lakwp!yy^X\&njy\e=nlALtAuDt8d+ASKPe:QcV:p1iGB9F/GPA!inI9DH+XSyq8Q%iT!P+n
am=dM& 1MBIE1c8FI&hP$Tky9mT*wX6CNjju5QCH9qCewZa88NWA\eZ8uB1BIABjD:u1j9GTV&u5h/&$u&4Q^SA
j#4M&j atpY:8ALCP?nVMhn<@ph&/mNp:<G=VL&V&P!yHWL6LC\FT1Sc9penMDS>L\9l^H&Bw!y**kQHRj#deLF
tphWm4 ^<QwTDnPh1^=jZP6$%pDbN\CjX@aCM&iJ8TFSDiELw<y/jwbFb/Y6S5G#!kW6m!bLE^?ut\N9YI$TlF&
Hq$ZF\ 8/ZC+BwCW!D&+hNwLqYd9iVeCWci#m<XS+Caw^G4pjqnd^V!?8ScRN=ktdyPy19Mt>yW!<ecJR%Qd*ub
DyI=%< !kIbqnF4=Vh@?yDud5weZSbY\kL%>VJa!c^c%Lta?&%FyGy^!+#^ahZ*1Kw6ajtt5qTnkI<6w@cPi5m1
9:\^5+ bXi5yPwSPNTXL5hqLIK5<p14=PBkP5%8$e\j9W6T>wVp1LE1j>d6:Fc!?5\JZ:TbuMnLEj4IGk4qStNF
\XlYej jGYW@nWe9b<q^*nDIR!KKk?\i$B9q$B8#el4*d%C=9=B:41DyaBpcLeVPF8bIGbuJ=eQ/VY1AaTKJ%eP
qA#Vdt w:1?eWA6qYb^^XYIC+Pnqe4^wPyS&MKEun>^@YyX4pCd=F+>D1D+1\R:^ElELX@n8+G9ATMpX/qQj#8Z
HMhEej Z/!IQt8<@PKdIXwj/?neu%p^\SA@!lS@SX:C6HeACyD%eNL<pR@NYm+QhjEpcF$@QbAH1>dpbA@:jlyS
BThbty PkIeDacR/^*DA8^kDCR=#yQn5ZLuGmPlF@%:G@Jk>c+BQF5D^CD?R!><4VaCh#6N@uK&FdDnjbXF4Viu
+XtMdR =hM@XF&:::+kc6Eea*cN+t5t%p4S%m/CWw#ma$=iiLbjKRJj=N\etA^d$9ePEttiS9pJ=5+wajhp6J+m
^njt<R dmiH^=!%ZYaFethnl<96bh?tqQdEZNwyjyQF4yPXb##H?%B1kmK5K!MTDdkE9Y%&?m*w^C$K9bbltnei
T=A=bT G:DBi@ea6V!cY@B^=Q\FZ/W&Fjh#>W5b/\F9$apyKu%kwQ$%nFnl1Ca=%JCF14*!KQEGj!KDp5T@:kty
n/ZW$8 ?NS!%AQ$1>yp5:j8i^\RK5tql$>^tmH?:GWKjlVtY4minSLi6d+ejl9jNBG?@t1TXh6LI\9bk*Val:h^
EK*=p1 *:w>?R#WA=/yQFLKq:9iutbCq=u5a+SKE&tWKRyG<F9>PTk&LIuK6$QnJ=>^cXB<&5%Nyblb4WDe*8qq
hh\+BR 6=b\aI>%8VdQ>$\8Eq%6W@5/?V\nnBNZ4S>J$j8KW?^%:$hiFNyKd5h&?Dl>NQiHBth46F=K5FwT:1@?
Wey@4T u\<?8qJPLl\M*uKa<dQ9a\pnijqw>G9W5^^wQ>cLiDq=\m9X%IYnF?#q$48^4#^LQllllZ=5Y@hq@8BW
+K8Z%I hnB1jTX5%i>:yKH?\*Zu+Yw/niSd<+>YuK8@eNd5A+aNh*5%Z@ATTH9=&^nH#q<yF!!LZ$y1\HnN^c<P
+!YH5\ AnyhpMBcB$uX$y9+N&=5DTMJYhjGu9\M+NXjXCwYF&AM::Vb*khBI6@jn=?@/+49TL888ty%hpE!jjl5
SReeC? 9<@&i&Ve$j4uu5Z69qpW+pI>nFI!akiEneXJE#9aG\Ip5ABVQTnARbjuj!ck/@&CE/uBwAh=AMLDb?al
5JPe&p MBPpitBK\SF4^iciMClHhqqRKpGWLG8l%pGR4<<auLMlGTIhcA+Iqa^Z9+ebyAaYVT8h/\E9WB!m\$\i
yFw@\L >%KL%TY!pcZtuGTNmpS\IyM!ZX!^Gy*a8GJ$JLLR?:<#KpAAM@wic5mDh:+KZB:LNeESuL8P89VQhPbA
X=uk+a cJqbIVHD/HVc>^du%XGbc6D<L=9%Rjt:lMlIC%lD4qD?F+9bn#5+6K?Yi>&yaw8T&^hNq5Kw=Nbdu1G/
Xpbkb1 qJt+6F!lh/K1hyy#emKCJJu=?:u$ekm\i9wy1HQN?WbYmM4Nw@dA<8qDj>!ah$/#&4K9H5+d!V8hjH8/
-AJF%h 0006403037b001202b3 Page 446 of binaries1.zip
yd$PSk QCNXGR:k/e%c+AG=!tA%kbnhP@lmG5@\?CWCVSn+n\mw*5hPj4iQbFVaaMq9HBX=qMq8P!y>!YtjayFT
N&%!#D LL@l&F>=#CPWnWemmRwnhQkaDtuqGF%4E/8#hV\6Q?whL?5@^ilq>T6$QlIA<5PE%k6hw6pjA^V>T1MG
X\LQHD cwJLq&DPb/ly8V*WJV>JI%h6jn^Pij>IjkMHttwmTH\SpkDl\j*hmnS:XD4PScaZ4*w$!lI^Rep\V@Y?
Fq6Bc/ 19Kp8<+$$I$a4B!K8C:jJ#8/EiR#H&=y=CN?AYbGdnDSNuKy\cIcpnRF^IyXFakkaWXlJmu=NR61Z\b+
WQwqBw NV&Hm@a$e8kdPdM%IE%INbQYjGS&p6\>Ta:!#u#GQ>JckyD@!X44H:@DGAYk<Q?C+^KE@yeeq:DAQ#p8
HIRFyM ajDjeF\Tnw=P@*m\Q1PR$L@6lyDRj+6d@b5A?*iV<b@>!D?LKEHw*^Skk9C@\j/JVBJE@DZ:b#&FBAZ@
KL%P@k Bm9\J&MY?t5Y>tj:K@\*YMRj4/AuBQ=4Fm4$J/#A*&Blj*!5lCB@k@&V1JwR>K>bmQCj5H>nZpH?bLXB
#6FmwW wd<^4\V?dL6@a%:>1YkW?l<uq1Yd?%<8\Qj9b@c@uu:@8Kj8aid?4*>R5uG$?>e#&@^jukPGkDDC+Il@
#&a1J4 ubW\lNC@ubSP4lcY49@+J@ljj@:#WIV?Z^1K5DAnDAbnlEKl@#1m9#ET+j>pWAYlj&qR@!PH^1@!n\j<
>Wn%H! RaMuajAjGFRBKQn@b6L?y&jTG8E1mlnGb6Mi%E/9lHn!Vnm1jt<h4:=?DRJH%S<I>D+S*@5AT/IC$!JC
CE8I4y <6i&bP?Jl??HP@#kwmIXRK=V6SRXJVEMPtCtKIdRBCn\$DpGBbP4:Y9G+:P^QYqqn1K<IqQptVb:WLW@
FdTqEC dE>jFJS1i1?l8k<PCFK/LZ9a1w#=SIXZEGt:lnmG9SDyeM#GmHSRIC*Kyy11ME@DiGFCmRQ1X?=#JEY=
wT=>h> D=?\Ru9$u@dHMVw\nDT%H\nAHHw?$ACW:je1t@9$!^SXLqj<u<dBWyD$e\8Jbm8C#i%wyYtZ5TlYLaZ1
bd\qC5 W?QKG5\E1uuV+!W^HDdu8eEhJIM%C:l!+JyBJPYCYFcaqVpbF6+*KV6N%?k4W&mS+^WbVJ:LDMuBiS$M
X9?*A6 /FX8Fy\iKmnaG6R%TI^Ye^EpP5<K1uMj1nKm4$*RIm1L#c+IA%+E*hP&Jun:y&G6=Vu#niZanIh^/R:+
w/=jW: 5RmZmRbF8C8dw8^Hu&ejJFAlSpcm!@AT+le##9YZL%VQ<RC$iHRyeq46wFmlXiAZe\*/*5YdDB&4y4jR
XZKAJ= F>6#a&+mc<$i4A1dCB1T^hcXH4VK#uFyVL4SnRH@E&NGXDu%E#KqKRV$Yt9AaH*B&aZl\I6*wKHVATc?
8pL@5< 6h1bjl/FwLME#Ppej<dQ%%iw4W5h$GJ:*#@TLpnK5pkm=dp#&!nYj^?8dILmcXH?hG\n*jT&h*dp^d!d
?1<:9I 6QAKQm@^EIQYd#wQ8GLmuJ9jc4dS=w$#G1XT*?cp@9WnhSu@GhY<&+/\K<dG&ebBpQqyZ%BN=abDq><5
$jX$?j Lj@HjQTK$RqPSelK?=nuQ!:XI8bZ>ZWb#atB:XbBCm@91RVY$b6\/P^M#>hwH!#*BZ<SJEn5jN8D1w=d
qV44A% 1SRpTYyNa$aGS%*atZBR+?Hk:H&Ln=wVKj%p&<pKKMu=@m8MaH?dkR\%4Pp5/DuhWbP%aG?u>c4hu46/
VYhL:8 J49X>tieVcGYE:XZq4lXh//CQ@Npk!*>$uTL5lTV::Ely8wthu:CZp8Z:*w98$q/t1=kDq=RRmW=4Yj#
B\X#$B mk!lX:>IZh@uSYJ1nm<4EQZwkbjtR=!GPd*K:TGSFM#pSI/RQD+&WX&n4:H&n\iR@iYJX@MjeYcPRG4T
61\$A6 *&TdeZ\hQ@qpt8@W4LJ48L/Z/QSFPE1IQ:GeB<%%Xka%GwtW1V5:$#a$1yW>am*&abqNKSeW9Bit#:<:
%ILPLu tenT$Bq&&LPj$mFI9$yWp&y#uc?k&eFF1!enTQDnW%ud!S86y!P\Ib&=l<^IDB6uX:4!lZ^&qI/6S8YR
:95b/< Zt&!RZbk59%E<aiAuW^\J?A4R>J+M^LTc=WL>eJ=:Nidi6n1t?9YKQtampEY6?WTZ!w!R4u!iaJJmY*V
wbnyWa ^8T*:cS&yI4CE&4hKqEt>Yyu&W@E+5Q=>lM>dtt!5\cW8$eyH*Vj/NX=81lFmRCDe6\RMcaMe<\bQM#j
l#GnR% FjYc#%N^+JY=%BeMbZ\cmBtYe^qqVcEm1tWS>E1Gyp%5kDP%?IAcuj&H=H9NRL=8inZ*k%?#&F+p:uj8
t&HpMN D<Lm\:LW9#lTeetK&h#tQXHK$:ccDB#/aFbWN5$S&nQ=pCh\:eHKH1^IHt8XN$T9XwMB$SDF=/Ehk\jb
AnH<KD eitZi#IcKH:ybLcCF%>i4te4*JjBt+Zu%cTmE6NK=%qX#R18$*ltG&HHCJ!?VG4RQHppEKWVVh5TXcRb
F5tSkn Q#5/im4$1d<qj$Rq>JY#1STL!&6@\QwHuhaHelLN=MCGeGl\JKjENCeji=npAF$HXZD$Xy#Ei#E>>Zqt
d8jS!6 ?n/j%14td!5/m%w8QL4F$S=Q^D4ai55+m99<*T*D!5u/bJhL:\WTMaA@At:6q*nWK^c\6mMW@J&be?>i
lHZq9# EH?mK:8t!C>9h!K==yT1nw/KeKdciZQ6!AbiEG@mdMZX8E:Lu!Z!b:HDM=SJSN^<<CHK6SD=%V$XV@1J
%AaG/6 Fuh/M@4G>bV%bpkt@:D5!nDMNhimp?t:@ESlc>+Bc4HP=lR$IYV6V9Ghn?W:a=!GJE%SnSX4I@euQ65R
Qld8ey =Si6SkbhRqe&q#!TTSS6jEQI>e/kjpAm=JjB!PyNm9tlewIIDc?X\cVDk=cEmI/LW=Z:1pmIFt?GD4ZI
IXPlbF pQ5lCa+bT!*!H%eRFM$6lWA8La/$jNGw6IDmRZTMSE%RL<dmZKH/NX\hL$RtMm4IVX$^#Qc5Wjj+icbd
4Pb/Ge u1wDBRHN/I>Vm*6X+4Eh1p>*6ATVthpc\%cEb><y+!PWDSeZBEk^MBA=JYm\N8!:yVIMEKw+5/P^&PdQ
*cH#Tl tRE=<Fe$<&RJHH@H/HC%N4Wj^pESt6eGI%CQD41D!IY%9@LA>!*&SkciVL>YM&T@N*Ew4mPkhMndXILn
H5pdea jhKB+j$TLT4CF>FHaD+L^1N4H$^*jFl5NP5/bwNi+S59ddFFHN^SW>Kpl+ZWt?cC:6Gw@lAnQhG>WBl$
a/TuTT +KGRkkWq:?MwMSD/51pybjEVATDJ9C?*VMKMiX4TbD%LVTCBDlTMV8bS1S6mXSY/D6\4VWl\=a^B9KCC
a5bJLC 1ic:w@Kc6J\JjEYZ+1VWTNuHiw!jwYY!uTjI@SnQY/^EB?1&=qRmLdq$pK8wEKjpy:WyJWw9=<ijM?9l
9iZPqb k&hPJ:Va<RyE?K#ACnD84IhR$G9m/FT/$BD4i?&qM#LImha8a\*WBjdQJLG*i+^H:D4P6ji@$dBn<Yym
TKPmYD &VREeJye9%b=wYSu%QCGeSP#$*a:$KV:&IFWepERc&=L\wP#>XuXubdVh+n@4P<w9mlK:@^>VwSpWKDk
:KqJ$# DX8\p!8J=>&&ktDkKAuA>5T!$FDF&&TRFq:D%MYSK8nR5:lNFtW4kkm^MK\BhBG1hVpVway=MH5>qiBH
%naqL> i4J?L\aH%a>D+i^QejC585R9@JGDiP#6eCqMcA<tlmjyHkAFCQEMWAdwK!KB>S=+T6<A^$JShw^!!HS#
HFwucH 6t!AW4^1Iy<q$e*R>t$T/eql\k*JaYKS*XHpGE6!VPJwu*M>D$tnVa+$pCJmJHu+IF>deYQJMhLTY9#>
9u4&C> QmeIJ:&yIpeqX1QC?WmHP:nSV44F16P<I9&TGYt$JZbWpcPtMJ$e6Z#Z#/FYS=GJmT*ut\NPEbRTyAQ=
<^>V\k id#JMP>*u\DCJw@\tT=&6Equ/Aip9Cm5yD9&i?!qT4Ca1?ih#yV6a@%JLLEH&Xwq@ZyIXpeA*4+5J$bk
!K>t/p #%SpiF?^1=/=XypmayTXTe$1#*!:WIhV$t=u$hJ!jt:kBBm1ItJQwT$:1VY15*6iZMjJwS**niD<4e4P
an6Ta> yK$#V#c#5=FXMdyu&uJ>%u4R#M1qZBYhiG!dD=9yN^XjZmZm9$>idSAmR^MmqwnZT6J\V5Zcm5cn<tBS
y5+<@* RnF?iNmuEtEbjpRB6n!QNB<aieCSKejY?u/:%ZLdY>%ShkV4pu\QP=V4ck95<%A8B8j$N#Nk@6PGH+K6
T>%CEI $&yt*Y\9Xa:hmEZ&IcW5Na85WWp=6l:Btu6nDC$E#qA/k#%Ij6>1Qy^$9aB6C+BLP#\b9PVCEXT5$<wK
SemP1= iZHSe^1TC:SpCJ%Y$kpQhCeKqmqyqPG1F^:FVl%T9Bjl/wSZ1Ywd8#\A<K??1qcd>PAKh^5WE\VSFBI#
Pmq#lp <4DHn$J8%ad!yiJWTF\HdjDh?Clb>E1<5@AV>XkNeYh@VC8J&59/8R>AK6!aIZ&qGH\b@p5+:$AN%Lt$
WhbV^8 t#n4DWtuCYy4&wZC4F>Y#9um1Cy&lHD$b:CjZkQVc*dZ<<P:tmE%neuST<mb&R^6M?dkYCAXqTB8jyt1
h9#X?: =Tb$SJ^EMuuXL5DYTuJP\m:=!4yV4<1k:DJWpwWuVXW$4Y#^MkFZ&Hu!1Kp!b$i45YdQGMpHbXIp&u9K
TH&1?Y Ze^AFC%iXMHn4:Tt8S9>aTK?EY@QM1\K&$yDL?p6ImVlpZW?R8WnIa=c$Vb5X/+A!/SQI9Y^bKIZZ5T5
RRS?iC yj5#GXTa#EmwVwTTYk1Jn159I6pp&%1h5:4^=yIXVFkkP$TECJ!H!^TdFJ<A4%mb:c+8LG:X6:MChpk8
>#X5ZW #\5%FZ^J?XeBWqcZV89B$=ZD1kc%Kc=J=#TuuKGNhiTC#wtb+46Chc8AQaPt&l>S:1*6mu^yNtG18KHN
AmBTPJ 9IC$/GHJ8VcXp6kiAb1$GBF<ndi561/@NdB@#R<tPh%\d*Hl+*kTJGKm=AJ%PGHtLCe\BVcXjFhBQA&#
/VTudT 1Gy<hu5b\AQ%IS*6Q4XBkL5#4^/\^RlXd^ZcatEb*klLE$GaK$*J*YZ\V5n!q&5yjYC!VyccCTIBERT%
QZT9%@ TKnL5RH\u?y1?wCn*yJk4RPdXSCPH64S$!bDVCumA%wJeK$lF&*ep**AC9jYID=&>T&+Sw%DbLmaIZed
1iTu$B Xu4wPeh#5a!<6RI1TCQ*lEl+6iNmw&#%AB=m!<1yEciqqY1?kk+L^m%*tE*u8IpK9en$qY%*EQ\:K=?y
$4bpmF RYuP<tF>Zun/?:*$$cT<=iQ&NbyuJ8YD+<4$W\NJJpl6R<Yiai1Ql1eH*T%dBW+*:GqeGG1\9ZV$i<:E
T\ckwG Q6ZTwLyZA46*iyW4:?16qk<BVnEiLPuSmEy@qiaH@Q9XquK5hNLDQbYh:+keAcXIX@G6d*8Qdi#Ji6qL
u%1Xpm j$!q>\IJ9qe#>FbGPXLqDbcejGe>5VNBY@YZTnA/wc9/JTRuJYItbcqGwj96iIVhI4nMiFGiFVJKi:Lc
R>?MKS V>$Z>S&@1DdX8CW\C?@HV<<mG/%6RD#ml95edRy\6&$+141B41qCFY8nhCRuLcYKPPyM&A/H@MlGA9VF
pQ9H4# R:&>k=5Fk$h&Zwq48@SM>ZI>/HKIC4I&:TB>XRG<XV*q6l+hZ4K/m<nLb$<BE%<C<SlP?*L$K9YWKQeC
lVbC\l p6I+p5MH!9*5TtkdwC!DiK$Y/M4N$ke8t==dmF+uZB=TZI\94ELB6X#j?h1GB=Kemih*GijZW+8$5%S8
%>ud<Z /+Ipd@m:AKX1#>=yj\mpKklpbZBT&XYhb=I8ic*PLl+?!Wt=%AY:WQcANNdc*Kjyj?ly!aWma16S8a&!
>Hw$t+ mHqcYCuba*GG!!QT#=Qh::4FcK$\+J=jH85WX1>Nq9PmBW>:BNGnu1?6a^M6uX:p@wBXy+FTJ>NZPn$>
bAwZ/9 NcBT^W!XjNuG?1bN?nReuj!nQph4kL=T*tK5QReQ!\^^ViTBW1SCMGl/b<TG+Z/X$cReTYPp%j6T@6S*
-AE5=m 0002b4a367d001202b3 Page 447 of binaries1.zip
X*&#tT m&HVG#kb5SVc6uHC4G$GQA*y%=lTbyGy6NZ*iSmA6hYt55qWI*LZE1KR1Stp??\y?!>lPu/FFB%>=@/W
F\<>JW ^6@AhwGZ4^lb+%#p6tFTk*=1\KIpJb:M&w*Ia//lG<<RZTD$Qk$iXny/<Q\SXN?p<NbFS#^&KN@Yy#BT
SwaIS: 6:!%i9KP+mbW?5\c=Pq4:mja4BhyEjwVJ!iQT+LH8>QjS9\V8/9tR4F*&YtGe1nQIc9J1+C$!R*?InPa
<1My4/ 4bYeXYeL9Fjd5m!!>Q/4p9cMkRBjEn<jX4A<QZYBqH&t<K%JIRKQ<n/#b++\Lj:V@a<CB>h=$1eBjVa8
&la=Kh Z^u%*Z=%\:<wcXMwuu/XAQCC4XBG?^1#ttdL&!EKaSKW+!ct#ahRG1l?VA1W4Q84M<c@\mSSu5YWTJD9
QDk!Fw G&Qw91Y6ABpTu\FbG:8Gl^XWFXTG<:LMccnKEYdZZFF^?#k1aSBJaC@aGcB!VQPt^>4h:k4i?cK$CAQ$
b5C?Pc ZV/Q*\Y\$i6<?&ZcicEh1XwuWlb*a5q!Qb1aaq@4&9yddkJ/dCSXL:t<FZ%5E?9K4A@d6GpEj4MjGL*A
!eCV>w TbLm?$luwRp:$n5q&aG>$1:m:d*#TLJB!cVWT/6D5q?H1d=IJCZ>EPG4?hk/!:llQFbp+ESENmk!*wjY
!VKaHy N#Lbulu@RcJy^dRhS</tB>EL9iy?aNaC?&L4&R8D@M@K*+p$1BhbbVN=#H=dq+9?NphdeKRd8dTk11=y
VC#q@i ^??Yn*=XIh<8Hh?Z!q>huIV:KH>=i!$=\^5R4diNHcpSI?NVPL&AX=:&=1QiiC51L9$^+dYZ^iq/Tw>l
P5ad1d 6#t<yC=CKiGt9TL$YFGS\wpq8bwy\$R>B@Z4ud#ubW^mQhVZFR@K%Q:ci*JqF<$RG1E1w1$ch<Yw9nAt
Mmw!N! %H^&yMB4EZM%T=miquK1/CVW4+kn>PL#WI/mN?PRK5u/bVR^VW!8?MlntT6BGR&W9y/+cWPuYp6p$inZ
<me8/+ #pC>BC5:KXV8PD+XwDqPu9^%Xtq/NSWVeF+KCheM<%8Z!@u$bDDhj/h%yH6Pwd^Cd/!/?QlbQm95+%D?
4\P#u? K4+ZEpjcLNcLu=#L*mM!!l?A/5TSH=B^b?kkHIRptE#JWBuQa\:paB8n#%RV/</VCB<FE=uM#YdB!+tV
iDT4&> KVIYh>yM<K!P55p\DGe@YnSjuL4DDDHV+h$9bakY&bj$&XeFR?I6eu*nc>=Wcjn1VRTZ91E%tYBcj9N/
4Pdapw 8j?<$SK@j:VVWKe#SKk8h1BpSjl8RGXE4Id6bWVM$%JkWPJtQ4NucI?DS1BcVu>Sk=Q^K?aIaI/1KuRH
?n!@:1 XPSd+d#nw8l=<8m?eP1WH/GXF#h?8h\V\XMcpH^PW^ZcnnB5aP!=F*R^/K#9tVL?RA$?d<4t<H/a&Q18
ZK=q!$ X%kqMYj^5X9#WZ5mX>Qd64hI!+Cu\Fe*bRS/DpZ6j:Kmu4DA@>JMp#Dp4*!QMBn&V:=HGQ^Q#atE\Z?*
SDmGQV PhF@qFd@W<FY?J@L>5KR9:p1unD54%u+u&S<lPF@#eL?yFtQMPK9YimjqQ!FBj?clj!JTlIY?t9&V*YB
PZ>Bel 5QDj&iE@ZJ%PGA#?G#9<^!9M@h9L@6>Z=IWlj%tS@+<e$:>W=Q>>B9?Q#@qHnZ+EaQ?HbJ4wMiH@?&ic
\T@^C% &1VSVKQn+X?pZWV1!MyS\uEZnKam5e#bVA\DjiX1DDXKMRkS1ETXdDP1YjT4dP%eP?w6AF18<#becZpF
JJX5eC *KSaCcRcCyImwl$a$&ilAkyaw1k$b>!$aZ^XZdC&/jeae#tW1mWZ%YV#AF^m58kFy$1>QjB1WK/y^FSN
MKmBGE b4/F#ql6ISK6Y$*ejGpAkY>#mKmNdi^eRYQ<Ek5G^wEyV*Yw@K=ENM/h^/q1Y*89dYd/bJD9b<j/1/6K
/Xk!<6 uJ1=GN+W=pjYKu<J*YmE$l#<G1+*y&T?L^PnTNV<Cj&VDN:I:ihmmJ:R5ZaCt:ydhWaut/D><byq?V1u
=4@+y! $T$Qbju59LeNFu#mQ6QNjQCuVA?:u?9BZNjS:C?uRd%kT%Z9e=Z$DBuWijncY1LqVXd6TwBD\yJ:h?aW
G=jiI/ y8NHnP>tkY^L^JJTVma6H8&&S+LylKGC5QY+6MF$4YpN\>NBD<nFyB&h?jL:ubSFZYt:X!i@#eP@Y*%T
MVw\6L P$i<HXQ?9I+1y^a6CKh1MA$lP?\N4*:$Vi%McW*5@ZAWP/5dL=YM/=GXB?9D8WZc1wbY?bQ?I9?S5V&d
ZR9?:> ?%cy51?u\+AkSSa$/Ct?dun5w?Rdq#:?X@WaHETaTyNH*99c?Fal&</+kPS#6a%LGa4*5Xe4P*SNb1Eq
/iZCJ+ dX?4Z4?5$>dm%@hWd</:uLjJFn#bw%Ew>wnDEuwGH*&45ZHpYt5+Z6WtFKW%p?WRVbiJud:<^Vm4:GYw
!9%X@y V*:6Rl^8pPS4QW\uCGESChLA4wYPqp@V5ll<9teZ4Yp4$C4E9t#>yLLajZl<w1Gj1A9pp^=^Yu:E45YT
Z8:+b= m*=jy/9ekKIX+mn?cQ+aZyQ<PQ\&4?F>$Rki&^9S%pG?C1uGanR=dQJyiVEwh6pJ!9cYwuj\S?Y+8Z*e
\i1KEq ?Q/*56u9SM^eI4^EI8^XT+EPwAcCwEmVJPdlS:yT^J8!i=N<ZNKPGDZe/IBEF\c/q9+ZFQi!\Qb:yh&/
A%p4$e D\p#mmVAqW?WyJwRB1unqnGn<5ZyX#1FhNA$nwH^yIil*i>#l5H5!Ll\QM@i6+XSGQlFRVDL:q4X4I?W
P+\=&J 4Y*TV:dRA^Nq:1?c5#/G>Ni8A@RKpilEF@XYXwa%Iu1QdC8H>$<lh?bFSIFbE1YKA@8DY&uV\kGni^N9
B!5IIh *Bk8S^/AFCkN1AR+#Ky^FPqCE5JNid*tkSL>>5=Xqkqbb&hhX8NQFG\#BXEj5q+9<Y#FH#c+bJc:F*&8
&awJwF \5mMEyGkGk<ieDTdF5N$cSVb5H%HH?CbZJALIV*H4!he1@Wtq%646dSPtaYhNQB8SjAX\k&q/P<$:eKj
T+KDCh yq?u4qL&*n1N:4j!C#t8b6qPw:q188p@ILwqJAw$G9Mu=u*>CqIqW9Y+Y+#Kh=S?^HuLF=&bahW&mSWq
1&#qCZ XaVwLlRaq?u5Zibi&yMe/NX4MZ%Y!&Eb4+ndcq9<WL=MjY%dFN:!uib/F*6%AAdAw#CTIPm6ZJEQpaqc
A6e<$# =K?tq8jcyecDDLj#eW+:Ftjp+CVX%ZJMj^iQM:%%d4bbaeLldK+k4kb:H:l&$>Ft%8^nq\B*1EZTP!Ch
NDtJCD ^=?/jBKN%k*TuMiX@V:!qZ>yqZi&S8:^nqh#dE89j1iWjCD%#e?nylXcHFBFdJckia+5GIEZ$1HVL46t
\<*IEa juLA49%w/+4NWXytBtQN&?^y=EqSXFS9JiX@FFX5y\DcH8bD<&*6qpVLkyeXKwecj#*AMY6!1eWt8S><
>ndlu9 <FA*n4ZwTp<^^P:>M&1\NYliJp6m=F6W?bi/t6$GcWl//8lGP8X44WtN/tG>8FT@GR#N?6LKk5ky8KF8
:cZj#D AH\VR@?m5VANN1*^RTYK&Wdd*AJdP>Htnac/TY<yqdM6c8GdVjePm>&C?%Q$B=GqBiVVeJaFSq@mBnuW
&LepJQ tX+?@:liL=$yk@y!=E8GqF/IaQEDnd*?1mhQFiHXan5NV>tA<=L5jHZh::8!*PKML!@Rk&w!=i5dy%AD
99d&&u J/lF#*9qM4uCFl19&bnu6Nb$/*c/&b5iC\*P&GpM^tBYYNCmi&PEpKJPWhyn+JNb:q/CFKl=6W:d!Z+/
5+b*M: X*5ZGc#DR:c<W:wZqKS^?Gn$bZ&FhYXd<^tmT&lW%tdh@l6jGFX&=@Khu1A5W4b9kYa1Q8uuJ>lqPBEP
$+F$?D Pt9Je5Hq98E:11A<BdpDpehK6CHEcXdj<i/6FJSyeZ%:8JE=yB5Y1Ck%jV1!DVWXwk9HT&j<*hBR1HP%
1ehHLD C\!PCT6BN#*kd>@XD$F?TJYRXRE+4WZ8Hp:V8!IM^d#i==84C\1/LyD**>6qj$C^A=14*6?LbpTw>F8@
uiMXSK bN#5W$l=iB?QIQJXnCdNREam4QjFpAGXw4*N:1Bkit%e5kiRASmPHVXn:=ITqK:V++wHXL9BX!wbd?8=
L+?e&+ LY:LXJiI@jkL4w**yj@yaeCQS@V^5L9+1Pw?jIXPB4Wa48\ByeZ4@4&5@D*Hn$Zl+uP:WyNQZ%\?TPuK
lE<m?Y 5@@w4q?^VSIh>eZ11@TBq1:yJPHPXQu6cNpqXd:Ay:mGG/unVndC<#jQ69hcJ698G<hinn=h:?ANiWZL
*Ite1> l:<c%C%+69\beCF<^Fe%<j%yVdFlyebVj+<uTISDZe9Zid9Wl/P1A%eb?F#Hu$%dJ?q<@ER*!y$@<y6E
>VP=CP HPe=KltqD@*\R11$eLktl?D!%Y%BE8/8mA<?PJL=Ec6<JAl%mQWElB=Id=MS:LwipYF6HQX<4lX!HaPM
wp1b*\ l>ME+&G4Bi:WBc/wnj+1G!N:T*#:qDVLi>jI\n1/hp>Th/BcV/c!T1:bPc#XhJ85PPIi9y!Y\ik6miJD
cQjq>! klIn*&Q/&BIGt%NjR=qd\@ypI/JtI/6lj*NSppSH+#J@HH^G\@LRei!%hL:dhLMeF9Q+LVbcut$nc<XD
K*X*Q\ IJ+^\Cw/4C1<pnD4djtSyy*9C\=e?!GnmQYVcmJQ5GI<@*S:T9?XNZEMSRuL^ntVX6XiSAPF&tkDtTXb
cC*ibJ =aVY#@\%8Rp&$EEJ<K^dQj4K5ISHN=^?a:TF56dkb:$VDS1N:=\QS9PXK\=DSk&$FW^MEw?C5W/R:N:P
MWR:I^ >Vh1me%k!%DD/B@%DSTcenqLyddXXTPpmkFYa+q%kV8XmnR6\&8cQQYXm1\EiQ$1qh<wHImy<9YKdhh!
/@:k1k GFEElhMH9LuWDb8EJ/k1=/+HA5YLpT?J#HFXTt>X$R#6E^lqQIaKh8@9mTbjmNY$b*Tcw=6%#6XiBb:\
5ZT@aX P6XKe>q:e&>%:9:!XBCt^:W/1^wG#a4LYWZcqjTu5VtuVC@i<jIWS/@Gd^4^:NTD^9ZM^<TmIVy/&=uw
KS1jF? @5mj!BmcuZCNejGDk%+@&%D?yPWmJ?umZZ8HTKANS^w=/:!t!WEdRR+wLwMq5qnJMVLV%hh8qtjk>FGN
1IWhDR AAYI@SpL4k6#Gc\yq1ShDhZCQS$?tMHQCqAb/>jbwd4BG%Rb5LI4!=8%n5YE=ueKtQT=6udGB:^ZRjEX
VLi@&J S*:lqaV9%4=6wqDy>!!ca%LJH!jq:5?Mu=R54a$LY+EJnHeQaYZ%\h+1L4?1Yt8FtpKPP8G%<@qX#YZ:
l/kVX& t>CwTjn/P4A+TanaE%nqm<cZDW%lFZT>MmlTm<FRueaPJ6a%t5dq6R+*J:p&QZa+YS6YmB>cSD9NcpcC
F@TM^B Q$b?\4H?<RHMID8n+DiSF?XRH%1yma%b4c4VCt$c+!SnY+&\9#\?^Xa?Y\P:BnkeiR%!qFQt^!d%mW>V
?1hBKy Mk#PaTE*yqRSc?8u^NL^baRDw1/dImk6:w*i=al4yn/nRYX@$cRV@6%B+*A#qaahaT!WJV5!b?jHJ?8D
!CeSQI hy=/eQWZESI?jD^!dyhA9&qjNS5%8$DZ$cNjbj9niT!P:%l9=e#FkaXLV$yH:cJE=CuFWZb=/4\BywMh
WiA&BT dPlj<6dt!C8%9XSTPI+S1iwK5NGwkC$a!Hkkp^14p1@Zb>Pc=+JJ5uV9EGn&/@@SH%:CTduI8<QKJ?>i
DZMC=9 P1uui+waW>EDDabcX/#5BC</JLiyA4?mc#ej+il%uJS:>6m4XFeZ!>@%VXccM$</XQKR<uTR+NcS!N68
Eb!+qm EV4jp^b*R?u^=JhdJq#blu5:+Gu^!Sw+Hc5m6%$=a%uRlP<j#F?pqZQbai&18Cd4HJ*bpY9a5%Zc+DBn
a$54Z/ A^lkP=%!DyK1twuibZm1/+Q&%#/EyR:/#jh%Nh%I%d%nQTylH9ZV=q#!KauYM/<EI@DJQIdjEwd#llwa
K$SRe6 cJaQZVeu4#6S:$lw!#LNDuK>5kLLPqwE+DQVwnbPS<%yh!nPbGud1H>D\yQZy&ILXVM+I9\J/<TKw\@5
-AIZJN 000e6b64257001202b3 Page 448 of binaries1.zip
unlK&b <tjMY<FF+dZQW69pYSp81e/tMdQ&hY\9mV6q4bm$VB^$E9K8mF9:?4&MLX+w^n=nSb/ce:WGlAd+lmqp
unipL? t\P?Iy:1Du/\SQmCFu$Q/pSpyHD+yFlKB%S?HZ+pnSb>!R45R4#>bde!jbaPqSK$4!mZ+Z8Ch#JhK$PY
W<AuFS lt@&p5W=RTNiE%pakq6B*eRWT/WCbI<DYkR+JB%y*l!X:d&pR:=$L9qkZH+m$=MNWRkQq#iI*#wkDpSL
\\/%8N F/8w6FG/y4ARB/yL6!:RZH\#cb%!JS!N6S/!*6%!CGi^\hyXS1tL&NyJW@aW+CA1LuDwS@$JYTZE6+%m
qnjpbD hn+wa@>p5B#^tmEtJE+EZZtYc\i^Z9&1+&ZebEZt!kWSaG$=TpXSJPFYJ>dDdCew$cN+>=P5D=WMLGuW
R=>ySM \l*XFBt!VhCQQQFqny=Sl/eGq@kHcD>pta?9:6u&DVj%t8WKBh6+Zwu\#qWGp*/Sp@Ni*beR=a8WLD=a
juuqTP 1Y!5eM6j&S6i&b/ZtS5K^9wMbRbA5Ge@HNiGJ:\NKV=<S4BThHwlM*$YNTIFHBWL&S*@NZ\b^u8qHwMZ
SujSi? eG5uER<Qa^^/&qA9Yah=jVppPcR6!MGGca%+nQt8p8tD^V8dK6CuKa<Z^D^h8tD4XF=5EKKmT4%m5D9N
dQNEl! V#k@Pidmbq%j6PMPeMp***<N$Xp@u1GR5$?NPKqTBl:H&@D6ijim>*e$dZ+1Cqy$<%WPeFNKdBK4!WcD
$uk=4a 9YiLp5@1h?=$k#<uNIH#&+iubLRVPlkNT4<wcc:IKmKSpe8k$e/ZR4>IPkD=AKmPAmH!luFeEeJVme19
9t6ybZ Tn@i:^!JL*$QeuwCeC<mYe5pb6Mid!=eaPyQtE>11XdAtm%eaG5$j+k/nL#MZM:bPuAa?/!^HdtuCiNX
*VjSd4 aAIi<Gdw^lb@<B!mi=&y1nIhVVTt5nc+L%p+:lt^//yTZJIuI\V%5XWk?b^^1:XhApKq<?IN@yJJ6\4A
N^6KlT $&n$wQn1/Z5^hM%t*mBM/t!#:wnG8m!IMPbJELuVDCqwEkW:9u8F8d%5#ct$9p\h<4QkEm#5j$YLQi8P
pY:dNB d/dy1YK*QYaV9Addmu=lD9D>i8Cwc9XG1N@j8hG?K5#a\1Ea:=Hqw5p*EY5Saa5M!J=yC1I4ypb++4*C
*y<qQB 6q>#w<ZHFK<19FiRhGjV^lyw%d11wuML<ZEA=tT8:H6i/!<4&S>%\!iXViFV15?FSD1lJH#94djChpcN
uQF^^G NjPtVL=W!*Pl=#DA5nhKI4?G^d<+S:hpA\$4+!yhKH=nL6qS8PuLLD5jT+!cPe5n:u:\:@#n:e89m*/G
lymS!a %upujbEn5eWKD!6Z?m\w5mW5QEc<N6+ReEH^%yZwJ:=*NbuhR%ee4\FiQ@TMZ&YL>>K$BkTudaJW&98k
%hPqV^ A\?:aZ=HA^XEndKFDc#wVmiD96M/#:4+uht1LXZ4Vn8m8N::Q$&8cKMnLn=VG?I$E+k<@c:P=>q6YCbl
%l#e4I hbFT8#:cP=Em&Hu/6na$YmD%y=6i&cZ88*+X5QWcZ=t4:YB*hCZ^P=GN:mcHh*QBd/^Cc9%+MN6F&mjl
JAhhhG JCX/lqZF>W>=DMM@CIR/<P$MRD=K>eT\jV/<FFCKhKSyL^&+bly4qeNp?4tZYC!5kP5?kQ6%?G4jibYh
?Lq&dJ Kn#at@ulZCa9NjR^u5@m1G8SaNaTcCac:DT%@NJD/aWMtY#=IK@q9S!GhyZXN+S%CC6S#!Bk\D8KkjGX
u/h*5y cThtBGETbbQ<P@+/YCBdy#\y^&Rj^CQteAVT?:bb5KIt4MYqy\G6y!1?p:?@FXJ+>T4Wp>pX8&B*\65=
L1#<q/ yJ@e%9ANNiQW^>a4EkMu%8u6eVMy^ZuqWT*=!Zc8mZabjPPN<JtByZcBDG?%191e>CyFEKGW4F%I@M<B
lGccCl RI#T@dLDH8$bC>XQ<Me84mldPj1+Zt8&GMPMKQF4\w1>J\M9^C:X#c5:i*V*h!Ib^*1Jy$<btLMJmnTJ
ZSYN>d K/?Xu:=u*@nmy$5ubcVPwBmQMyGQ@M$jG9S8:uF@D18k:$BVnGi*#yX^*Fy\%e#cn>npy>El1<!PTne?
hhEkcp F<QFma#AN!jhl6?CCN&pnpn+E>J=D#wh!clqNd1W4FLYjK@MNh+wyWwX$Iek4<pP!>dtu4%HH9FGuiPW
HnEq6< ZT=/Ek<cy*/9H@Ly8=waKTu<hN/%p:=THKQYEB<ccKjpR9Yq8jbYpItM<a@!Gj>Y:Q=jX1L@6@4:H=Vw
u+ni/n *j=^V>HG\8&@K<IKk@>68<IC@:alaim@%itFaj>?C@@*^!H?@Xd\*&4:\5L@Z8MZAIQ@9@pLKTiQj?#S
L\wK5e Q+d>*%\A>D??SQ$@nA@?Z%IIApL@yBAEBQ?8R9n*R@YjK<#@XI:@n\Q!*!tEQ!:qC+MF@\cL?BNY/K>b
ViI9\& 8KDkH:QCj<*C@nmNIm\A@t5Y?5jL5RpLCQ\%C@tVa!WA?S55?E>a/F?#j/a8lAXkj\$Lk9>aQ\nA@<ck
+9epH% BSB@#CL?S*Z^H?V@k:4+d\GCj%EZ$H>8eQN9p@&jG6^A+Q<*VQA@QW^AD%D?j/jB#eFhVXCpdVLA:k4E
wl%Q// 1=l\TJRIcF!&9piW!JSV@q\yyVhWkm6a@%>mBWu$4F@EV#:&jXF$ERXINLp\\9yT##:Fl*AMQYtPwWY#
tpqNNH C:wRa#:\FakjkYh+WZdEeiaeF<J#1QaJKV\?cpp1/caJDqw<cm^>Zn^!bb*=&ibuimLN:nFY1+KN&X9y
^!tc/! 6ahtRpuQJjDCJ\BQP6@tlL@QccYVBhNut#ZGhy=MV6dk5Y4J^l^y#aVZdKu4wKM8qS<dRAj/DPVRSFZQ
RW\mZ9 X!uu!4TpCnKh=D+/CKpV^!?59yI%+D%E$56J/ckHDp&\b4MJjZ&nX4u&XT4D?%P!=ti=XqiL+MYFJbKu
LaJJka 5ak+/qP@>1B$ai>%?T8QkIX4p>F%LXyquIeGZkS>j4FF5PBQT!Bt#H#9Hi/LpLB:H4DFKN=yhK/Jk!P4
:i<#^B B^=6XbC^iIZ4&\F<49y!JwF/jWF:/Gc+/WPbk4ndD!*Njha96y<$KajIcX\/!i>48qc8AD9MSNeM*&jd
/<&#Nj WC$eq*T>cF$qEhAi$j<MYD&dTQHThwnQSc8F*dPE4bJCB$=Eaq:BtGm?VKj%C8AJi>C>GQbW>Bp^jF@q
KwG=Rl ^iIw!GFH=?AcwytB?A4<16*Tdem!?PZGp**c>qpKSmlMhFX#TI5*n&m?#TjS\jqc<M&>D=5Thm=:iCCX
6VH\dR em+<qFjt=q*ea?b?i*>n<tH>u/k^ncPJ=T@buc:*:ZbMqE5MLZy@5luR=e\?biW9j>9?%R:LkEQAmaTZ
m^mjD> yC9M!A/$8i1j5EPA4<Q&/**ujb>wkX>mT>Z8/&P^RcwY1=#L+mN4#PQAM*keL>:de=!1h+KJbmBaWbd&
eeAwe= w>l:+i^K8RZlpT/Q=yteTPTLuu*6DWKl\GJS$%PlFth4T&+9VGTQSEW#Gm9TZq^w<*6!h1l4qGnmSAjW
Db&mTQ S*+cYM/#p*LnqJ*E1lXA*E!lLn?b<##Vke/=$C4deZKX=41G+H/unYMP$K\y<H<kuhldeFFu^%k\m:$\
T&6\H5 S>5uT8N=?ApJy$yl%mc\B@FlDhA9K?Zy!Q5duVhCBywCZ^68lhuaDTmILnePb4Ca^>RhLZbaGyGAQub=
Q5hDL< !Eby!ViXPp=R!h4q>:!VH54!iQSAFM+ZJq9kMilIqT1qGb8&\y/8B1J/WBKw?F+$uDQhmXGl&uEWwNuP
6TVK4F 1STcb9HqBeji=l6K^!1eRE86>:%P+d4&I*FkT<&yESu?Va5*G>km&V8q?M$IjH/#JmW:K94:9QM1mV1N
@:6PBI qwpP4@#=jWmJ!?\Q@b6FF!j8#/9G>j>P6Ey&XT#hl:JJ9NF!$iX<tE^&T:>9aLeuVMbCmcpF\W#%#+@Y
ayJPF> ^khPbnLy8mTdGDh:EI>8cI/1E6tPi%k$kn6Z<%%J4K:w^6RhHVi\k\RJmkea/qeT/S+m1pdXu5:jmiuw
k$Eb+a =L\w$C^+LAu?4ELdaF*D6$@T8TPka*65wVaa8+1w>Lc6pkKE86?E+!A\TbZBhTueh$Z>IyXEVNZ^6d8<
:Y\@^1 KP%9aSSE%RQ&bM*$@G=1@e!yPIn?d/9W89&JX9$lKA:D=A@V1GVcnnjNw/&nK>pYIP$TXVRlTTJD5>@A
5M>y11 LL^CG$>n5X@QaEGbmcka+FA4HTJkqim5pblk=A$qdC>p?5TX8jQFhXLYwk&W^i=SFhck8qi>FqhpY=lm
ALLBN+ SFG&/j*I81ME+&YpCQ9aJy6Sij?%8&Me?4DV5a<T\lMFeb4F/Du\@YT&GD^YCWh>RbbQ*P<^:bqS&bT*
AbwQH> &T6lmp6SCeblQjbjcKFDS^>aeF8@eSqN4tM98c+^tBP4KXjHLc#9@nTQZSpj4MQyKQTWAFdJq>?R*hlN
<F9t&S lTcyd+QTjFtJ/+=><>K+Y*I&lPSl*/&nSjc4^ES1C?iAyh4#8t6aFdlYE#Fj&mPqijKyywiD<HCe!n#X
!TySjD +>u:GlXX*t565D*j\iGQ5@EPjQ=N$in+yP84h5#JYI*F46WBq+\/+6p5E@l#dk&iRe:kdN&A:SeuY1CY
tbS!5E +eK\CD$HaCZ#WTDCX?Z8!*cj81u6@hwYkiRC=!%u4pMIwP4Vy%u1u/WQG?N!F#4d#W$\nm8KL\4pe\5P
Z=m^46 l/Rh:ALhDN4HLB4T%TMtu:R9iE^1X4J?jYK:<1d>1uhZ:5C1Xj8S1*PE$k4LkiQ?^\&K4K4XGcl%dILy
lK=+Jl R1A:Y^dYY*HW4m=$J?^+nYc&\+%&A!h#Aln?iGu$K=jXt/%Q#RI@u*8tQiBZWZ9%MXtR*%9u&pD^nYi:
!B^nY^ ?\PZ5pm/5w/S5P<NlRCDGEIyQlK9y**?Wt?Ikm6TB/5yhPa\H/X1T1X#Y6=HTHjAH*T+L@kc%*hlC6@p
<:T@^X 9VtmpnIVmYN%m!8?4Hty=Lk<9MNb&jB$KXXmEVS4\bq&R8#=Du4w$yt:@$18qwe%V9CGa8bAlu<m4dBd
\cNSaj W9FVLw#/y=4Qc/mX%wQZ@L=ZDHhKS8WmyhJ6#ayn+@&KVcdJ$IK+5>&QH^5FdYi8Qb#%dDIPh?H8ETQI
aMT4PG +W=/HKTn/Vh5R%epk?MF%/=?cc8RBCuujVQ<#Pn^+kijSkn=PZ/*^A$&R\E&@6\dJ\lA/c9m>4A^<=@e
ReK<VN jZE@cBHk/@*N8+neqEe:d!8K*iq?PFZ6LtDtjy^!*dl$<<ecMYh?/C=<%=Xk+YYjndc*JLK69$+lMTVY
IhF<qh 8uLeISIFlb=mDk$+kBbHhkSqCqjTbc8@DyKN1tbn6ytPw@6B&^D4@6A/<a>a9KJ!eu6%4D>&K@qP+%Ck
Ku1t^& p=XGB::/?MG<++AYlZ^a#!BMH95N&=F?Z&Vn=uM5ktyRQWQ%+AwmpiB$+MiQ@eRnA69!?Gw<4E4nuy#Q
5>E85< !5H\@H4E\il:ptJ#9ltAk=?kTYpDnt%>jGYka*^cj*R6/i!^I5FiddkZeA1j?TXScA/Ke##BwdTtDLeY
e5p@&/ lJDeJcwa96Fpb%1%AnTNVSCRpIpe6$b8X$Qqa*jnM:?N6mLMqiSLI$uCuK6b8!$=E?Wt>yA5:6bqGt1T
wCtS/V P8aA?$K5uebm>>W?ydp?nBW=KcZeBV=ucZt>5?iy@T?\^ulad@mG>Dh=Yl6FH?\Bnnl<S+NhnyyntPeb
4pjDK/ Bd^pEDa5qD!KXWlEaD<nkptTNybZM/:p5Kk:TqI/eA*^NiCW#CDWWtPJqbMn5lkcw+:Q@Clh@nG5&p+S
eRE\Hb 5an9LPmMca9jMyXXaS<F9mK&%V?jhRq^Hy#cIGbu9S?h4qpn/qZmjDIcm>qML!@T$+1VjqZB<$/??eMY
nhwA&R Z$%JB!QZB1\@WB6ywBc8XVi#k8IWSdkeuF186:E?wC$F#Ad&X5Z&JCcD#$w*JKY@5:LhCCX<I=RupyPS
=4aWe$ AFDRSE\B=WJ<6YZ^:<9a6lAj^JX<ipVB6eTB#+Tu#?1KMqjA@TS9wHwBqHGbFuaq\>VjK5T15Rjub^Nu
-AFdW! 000ce3f353e001202b3 Page 449 of binaries1.zip
FJGRIk T9SE*dhy+ZLK%+#ydL/a+JDGcCbZQbtI:ka&4q^Eb@QX5e*5ey#4GSaHb>t:c#a<^J+6+=V#NBD+=iFM
tWE\Wi E:MXdXReBt:<#eZ%l6<KdB%Z1\:^5=l!aAQM<VhPi5/c=Xn1yLJ?iWVB!thNWyle^Y1qT<t5@TlC!#bY
GJ&e4G #jbIq*8:5X=NLCK5%^4qH8lc^>=aH:VyVGRSLLZ?GZcTH*=ct:GJea?wibmemE>lDTWk<HXnpyjyk=MD
hNBWhq nZe9ShS6\DMd?AAHL86%\Hpal>1qCQj\KMX*T6e\jq^ZPeiwb=DRq+#Pc=GP6^dcAqEB=mQNRDD:e!lD
cFHE1< 8<C^mC54JI/R6CJeIkdlE\?RV/YSdyCN=ND^BM$GPt^<1R$IncX/AXkZnQWPH+\eP1?PpNMVNMpuBEin
k%b^PK m<!qB1q8Sn\>D<RAKXji+R1=jB\PSW11DtLj\qNjSF^<61=jl$EJ+@1Vb/RIYLkl<6klR^Ep\*K!n4LG
qTZ>qp C1?+8a^Jl=QQFR66pJ&nmyLjh?+EVdLkc9J+wN198H1@tPPD^1#8uM\mbpylka/cwYw6IeE8dA!*W51Q
k^W*AT ba\1ynKWl\LjVD%RPn=^G^/<4E5YCnPydjaLHMF!\qCpXuTi=\>dcc#=%+y!qSuF%ItElPmBCDyB4K5%
<Ml?$L YDQKVnI!+>PC:4<X^Kpb+p$b?l>!1m&^R?Y^R4^aui:hb#Wu&n%?lNZ*n@hD6pb*=LYD5FV/ZJtn%PYb
@eB8=t >W^!Fduk5<kCCFb9yS5==$LAh<!teM1aRGPCWCSA:jIX:%!daM^d&J!L>y!uDjyMVnp+1%SJM\XR\?#C
/Gud5J lE/k=8GV$\^n$Ck6bZV<8QpeEP/yYT/E#*FTGa:S^8Nm+@ASlD1bHEh918wmiqAkbX:tMa$j5158pSe4
9dC8eI ==$%ED@:EC5D^186X11c^u6tMm#+LH^I11&*tlqKqn?p\V^IL6hC!t*cB1PGJD>ZY\:p4L5kcZ:ACFX%
HP85%\ ^dC5^*iVEThV$kEVAK*^w9Rlm@9e=NdC\4Et4F!Yq$Sm$u=&:^$H&Wwq@^in=K%1qik/qSiQAatJ$XSP
yMIl%1 #59CtHY%&kMQ=+N+JZ:/8a>Epi9i1PeWKXeJq1Q/E*dQJ68:pl/1qpWSBb:iA<YA8Ct$cBTbI19*t8aV
Wubjde HK&yK=@cE*@T\#6JH=H?Vh=:k/pBHwuXcj:!WmV+!cQK+FtctZbqVHITa!@4+d/?iNmEFca#TT+!EyXE
!^$<?p *TBdXV>bZWJ9PbQn!QQ4epk6nYB$4G1$9$&ut:X@ImQCa/yX*S:nPeYVt&#w!>Q4$K4TPY:%B6n>^9:G
&j%6wD bMC:S$du/*B%ZpX#?&\#/&\:#^d6RA>K5ybH^F#Jt*6q<pVh!>\b1Kbm9NR#Z/V@Emkia@@w^u//G@hm
Bm:^uC EEJS$Ja/\qVbHT%c4B$\NqLDquGuQuEG&C\%+BJ6*bP&HJpHc65L*5h5l%:Ea>quAk8CBi9jbhSP&VKe
J/n/\d FTqqH?n:<&naAjW!*c6ZRdZuFX!ynK+l?&wF$9dD?&wndPQJWbQ=?dPZHLW@6Ql/N#G#yG?6XHEDlLI%
E+\QXJ 4Q^T?PpVCDZSlKS8nLMlKVtH:By\<kRdey:96@Xl\=%1+5=8Nyn9y$a^*8&PQcbK:F&^y@by@M=^54<n
#cb#W8 MIQJ?dQyNt^jdXQ%!DJlCYtt6T&c%ByRe1\tm=\G?F/K9LDa!HNHYYySc=AGm:iuLt#YlX$JIBpJtL#F
N8#EQ? edJmB!XdiL=t*W!hcnY%X4ey<lMmb*L8PRC8V$ehV/4LncZW=KaJnYlMe1aQhRdkKQ9nqZbA85mI5^uc
A<<><% %DwXPQY?Xt1!<FXt@w1E?uDb&8+q%:F/Qte6<m\@h+=XhHZ!<E/MT&N%i!Z811$NJM\a%w<mcGH@@:D*
=n1utA %%F6:9&?Np1BBA9BkpNLeThAE1R6yWl\CP+WDi=cCyRm\X&L6Lm:R+HmWN!6RCu8^R9W*tih>c=%%umi
6j8l!B Ph<=*#*PQu8Q9ji@aX#nh*QubyBeu/@$V%8Y!kGWulq<^J<q<lZ9XSdZl+nQwl1%%+:aW#m9VMCc/ReY
8ea:Le 4pd8ahwWJ9*wiwRK5TeLb4e1WwEID&lZTp&k5iT!deaP&eNL*1t5?5q>8c8c+P/WG8JWuB1l<c9NkncW
/MYXCh i+HPdteEj:ie\LFbEt!@AY?1D8c:Zk4n*G*/qMj>u5\k>kAeSZB/S4aNF^G>66Lj9K@&p#:?k/kAwiXZ
pG/?9$ $klhVW$=S+E+AZX?jVWLZS1CkFR1P@XG:M?e\I8YGTXiRH1E^yXA%#k*P:^l^DhWD:T?cMW:ub\?t&uR
*#d#Jj q*!VpcV#6KKp:hK/mXl$+/K/IXjN+%dktT1jG+y>Lc4\Kd:aFRYd1dMcdE!kKK1pVjVEJEBEp+cQZX?=
@Ca+Dq A4ka4!>II^DLQS%5*WSASMZb&>n:5puHNidCX$/@WMJh#BjA%c#RMQ4TFVY9+m:V+McYa^HK!dYqA?KR
nkYQwI D*+j?#:tTdRu/J8/LCX#K>6:j?:mMljb\YbAY+JhqC?iS5LL6q$!e<^SW<LLb4bT=?c#TH$Y%%dD<&<G
T9Rc85 w1\#LT+Y6pb8qyba#tVyc5$544SV!1ppu8*%LVXG>=4d\VdPH:ZVQX<4#BkKQ>Si@/TV>MJwZX&N19qB
KS9PXM #l!#T9I9m6!8uGP?tjVjR%>:$^iHcaiKLX\#I4Cq61=#e:dM>nc:/48bpwm$#?Q/b+ni4cBF*DWjJbb4
/l9bj9 V\@EJ/=t^FdDLcYj1k$bdDG&Dc<6&hk@6nF?w=VAE=X1d+6yA>RSmJL=#6c!S+N$Flw?PITp>HNuSM1y
IhVHIG n:#$BwHX>#e\%?b=/RIq/iHYcVE9>bk&w8a!9uX&DG#qZChqYctPRGln$%KtGe=ic4>>L&TV\>XW5j5>
&4WnpG >J6BPm@KdypLe=mq@$nH\t+c$cV?bJ+GWely$i54hSC4HhkCAHpYKc+?:>Ch=>KB#iMZYyutJHnE5&i%
ENB\Eh &VHFW8eP?6=cNH*BCH\^p8Pc8@b?eV/n/ZKBbQcj/*lXWmR1Q#Y*pJw>^*SCFKnlq9ZLW!j6RXD=wDFK
e?yTRC 6mN:<ep:+dk!w<eGW4Kp!LmQhwX%Z*iE/y4Jb:l\YKMWK6jS9:u%!:^?P9d#ERaPXM?Wub#+j5c!PTSY
kKuV89 ^%Z5p\*>Yh#@<$6d!?GML$i9h+c/^AF\8PFa8uZ?N+iM^:Fm+1JHu6mkV8&Y%Q9I1$%Xh:e$4F<@d:iP
keP*PS M@b%**1Fj!6u9eLi6G&EkD+%pD+d\6/p9Y\w#eZu&knp&l>:IcIkX!$%mQw5S\&/=nGN=MA#QFpdbW9k
4Nj/IQ duQ%wcu1YkiZ6weq=/R5$9$GQL/Shu$k9:#GDpu&#h4c!Y?&G+j%X5DdAF>:uc$ZA#@H>G!!?HTw\e$:
&L@qM> d\@HH>d#9kd<m59dn=+&we!NHN51%cu>DV>ja/m+TF#?i4&VtIdD^TTqhw6hJ6G:ZynPhtKXJGWpRX^R
%H:NN^ uHtW5!#1&>1yZZKT&lpPja#+XSju#ZbqhTLi#+*@P+dP>%HlJX@b#QeAV4\q+u*Pyw/H6+\iQ!?Fd^?4
\kFl@T 5X@Pn^Z$/FGw!e=:Fkn\m1?acnk8BX8K+P9<\16:D#D%Q<SC9DP5Da/9hk88KH#$I+#n6P&TtQuj^4Fl
t&#\%c 5IML<C*l6JGkuwV+IbV#c:A5H1jp4A9u+::RY8tTNu+ElBIkKC*D#GRqIkWMyyq%i+JQL$8eq^DhepkN
5F&ET% ahny%aPbWD?PnYSDKmT*kRZjKc!:+5kZ&D:KWh6Zy=FeeiKESmwXT1FkEFq89V<PnRSF@+iGSwJm@$&l
?kbycq nQC@:KwSE@/:8&4?\*L@p#5Z?6iRR9Cj=\ElwH@at!EtJQnZLF#$V%ml9<H?<TkuMTHl9&blj#!/Tp\I
e59Qnl >njaQ<pblPB@#R1L@eu9m@kd4NAjB$qCIu@NC5H?lBZ>c@bQA^$l5d>^5@=^\l?^\9?$I?e@!Q?uWPa@
T<$pS1 ipn?LbTB@WEwI@\HP*JkIqC^@&*/Te#@%?<uiXJLN\TBCp81M<A*+@jGbEe=Di<DeKCcdACK1*9mtH8T
nFdybt 9W@iW:VhjRVkbN*K1jFI&pHA*aylmnD:QVPbcT&H?N#yI!5KyG!9NHQ*BPVwYEH6!=mAnLwGe:jpyL$@
%$t@bi MX6?6>V6W<!ZMeKlY1%$w/E\uyJTFVl5SpTuymGaC/dP+uQTCu#am$i^KQZ+uWQnb94ub/nkuBNwNWYD
HNnnw$ />M\K51<:p4Q9S%^EP?pE$R&/i+#qRbq1Q!+i1Q&T?>ylC\@jEbL^YBEedlN=:6Wa/IQ<?PGP$<^tacD
XIdYY^ R<@G!:FAmJdDJ?#yTm4I6/j%Z4HQ4QuW5$P/J5+/+Gb!*8*jZ6hhWww<lhjucCaCYlH/upN%n=nHlq+Z
@X\5wZ GCe6=CQFyJdN/6btGnjLy1lBYw&u5B&!u?V\@YPnX#GwjHhyi6Q!hH5tVc*&CKYFp*+K*#&iZ?qnY\>q
@b>^@6 :G/uDP*FpqG6tF6jDK#n%p@wP/uN\pH!!hQmGbHP6+&#h^JEtNhTPh1SBjcR*TK?G$wG18t#!#EnRP&p
#8^l:+ yytY/<H*tbPwey!$P6l:\4GF!^ZZS:c<&\<ZQ?Pk??n%yC6@Gn558cDtKw?5Hyd#i*eW$W+jQ^Hap<>F
4>hiNq %5<i?u=X1:E*$ld\uL/=9n%*Zd/?c+n?lVW6w9hh++B*P>98N#9j#*j#dWP^D@^M=>VhbeiQbXKdwV6J
F:hiJR /hd?>%w9YbwYDjVdKkS!y5^EbCL6F/L!Nd/5$ycpXY^t4661<tG%6REa5q@:WRkV&?:SmDSFBX5aiS+T
#$K+D? uI4Lyb:ujD<SXm8+cJ/@?YwaL1!H<n<T<DGbZ^QqDPR\:i=Bb?QPW*V+p:4TQ>9VJ@5T6acJ!*u<kYL^
%\:X@^ ^$4>6h$p+%l8WGiY?pM4KChqT9EXPcP$=VQ?<66R8JjBCanMX$m\I!qn41\w\hXi@%T=LeQDcJY/*h:?
EaiKwZ uApmtZe*aWTBnPp9LSKB\#yG8W?F#m$dEi+%<@jhqiJe8iVThCHD*bH<+GyX!cwGa$ymP@:+mhYGJ@X+
&&9ihp XM4p@JmT%q18Xl4/@KSZMbFq##J/kV$5=T6ttMWR!WBIPPSG^H*WMy$NDp%m5SG!XJqTGb#Z?KmQLcQH
&wG@Y! i>9Ak4FFRM^:FhmJu@F9QlID4c#acELctLh^*<%^#!m:4Hc^SnV!5Tu69*P@Gc6PCXuS5Mh*Ic45jN!L
CnwAS= 1F*y\bZ5P**HpJie6qhHKI44S^j5IiTqYLw6Le<Hj49SpnutMMPdc\TyjlGiq:<H!:\E95\PS6!Zj4u+
$>d1!F XQZlCjCK>Zd>VdCDeyD&Q#=QMlD%?G9!k<Slp4cC5>MmJE\@qyZ:c5kT=!BKaYRCCeM6IE%c^9#A8ZD&
VtmkIW DCpM?b%V>GWJBHiV=Z+J+TPQI1V$S&<!9qp@EZYt88dmPiABD&+:RQCZRke&ytN>!!H6:JKG:61bNjYn
@1!9#N e=X1DDXZtn:uq%JyQc$N>Xu6^XJLLM:IYM4Wekw<*yE?l/T+N$yDI@j*nma=Hi:6hQJ@>CubjJHAXb<a
?:pBW8 PHJbhKciCemBRYQid&6a:btKcH^SXB@i4:dc!q!Qn6c/ui<:8NCc<TW8BcnRIDd%Kd5>nRZkD*CRD8np
QAM9@< >u8/qcSF4D9p!i1QHe\I:#EI8QQtWIawP?9PyddjwI&L4>V$QACwWyih8XRKGV8%!qd8ne?9eG4j/hn^
l+@#AS Z/1YLIXWel*B9^uLQYGnPc+pDPI9q/WY^5ELJWE#A1ltn@kbFFm$y68DqFa/nWXHm/ek6k*cW&dDQA4p
/Pjw\& *dZX>VH#E:I*!#WXmp4IeYmVFPFQK?iZH4W#ReWCL/%q8G8S@JcSc4YQT6LT8/*\Xi=/VZ\A\KY5AlVS
#n$nXe :NkMJZ1?/w5:$JNkdtB/:S11:>iRnpjK5&^HZJ>j<bK/MWApeQeq:=1uq9Q199lNSiG^<wq8^R5t#mHY
-AHj+y 0005cf412b9001202b3 Page 450 of binaries1.zip
ImS4GI tDIMAaDdcITZX??XeQ%?Q#jN&A#Kt16BW&i15q!8hN=4BKiJe*496*LJ5cly@Z/tl1wFu!BAIc*&jYnq
cQX9XI t@$*@PRu/NVKd:FFH<!^I$8^<4FjqYCImFj:jcubJ+X/G94uyK$MNXc6L6=\@u4V6<llY9Niy>*\ahBS
hR*>nb M&pBlQ#d#Bqhctt@Vaj!@aQX18n=k=mbS94=P=PZ&h<HH?F>kD<Y?j!>/y/?J\Wi+:c&+wYaTC4lpkd@
mw>BiZ CSX@I:>Q9Vj4idyWla@h<#mX#K:aHT:u#aStH1$n!jiM%?iiX*MuXE%jZy*VjT9YjdE<HHyT?S1=tKpp
JA:m8W ?PH6wFS^=wGZ*<\puVtwcDuKj&X?i&!BC#elZ!9RKty\1<Z/P?KmhXy+IIPLHZE5MmLP6//6$@VI4b$T
4%jG&* +JM<F6&8!%AMDcjXDntS:e+T5YL@HYRaT>Tct8CbLnLGt4e<A!!ei/b&tTD&PYupdQ6*Q:YlhST>wY*h
6GyBi& hWLH995VWTKV?9a%t%GkL1=y4%yM=9c+=eZwN48+6ALjZ4bMIh9X!+Sc#+>C<jN8Ful$h^E&\jlnmy?X
WyI$KF M:>5T?P%M9cQjlPT4cpu<DLXuAp=aSNhdDj/A6Xc?%dtSHlut4?<X6c<*:^<%m=ThjFFTjhb9m1kGcKS
?aM&JK t/dcESPWHFnJdM\a?yJTq^64VV+RLY^/<1MCY:cjXb$hH<c=cInQ8lS^j\:*q$$@*Yjbwl<CFYdPi/dA
W\NE+I /IF^:lneuWc8^GRF>1Rw>6JiDYKi<<MwF*<P%eLD4DM=t=l+p>%!E?8k6dNCn&w8mL@>iA:WIaWA?>D1
>Bq:%Z SB>6ul\SGe@jn^h?e1/AjB%BRKDA*VLC/c#5p?1Tq^TYGImT/VqBC?#6ja/SFB4Bn\t4BaVd4B>t?bkj
*#RH&Y kBSwm9iA5cN&biPe6@5Fh\K@wLK1y1m%eiWmac6yaZSFVC\\EHp/P!LyaFZVjaIq9I8CX#4yq4q%dBi>
T@R?q^ &<+:tuBTD#pZQtXRJMNYb#&I6?@:\G$=/M1bBdl^?jkA6P%4\l1dTmJHmhEbK?GkRy=SwdHWBMXNm\cK
RNKk=M BF4J<d&ywh\qP\EBi+9&dKGRI?DaHm:<eBeCl8S?VS?S!uwCVF:EZY84#5MjNW<l/iI95JR1p5!wN8q!
c9NhRb mj?JjhtP9qS*MPpF45FQV^!qVjCn%n=EE#FEt/46\:!QJQ1XP9uYC*1IF%?MYNHd*+DXD&c&i>:#*HSk
QbcIiQ HE#qYjPawqPa9Vn!TB>lw^RWCnm:T5!nuTyGQSV&j%**l:KCkkBabWJ5#KB1!B=jQd*>8W>IZlbiV9Wp
aF=#Th 5?/+pE$w@\l8Xb+Gi%=iD\>dHT6PCe8^Gy*h1I4F/BNC?TiS!t<PWPbHH1Qt$*Lk?<apS=<DHW!&B=AY
+cGkZ* RLBX#X6P8!hSVJpHlLel>S^qVWw>hiX>:SY+H#p^BaBiI/pBBl:8Yd+imV68QSiAXneW!<@$NA84B/ua
t^B8J* %VMbQ!%QPF:/8N8G%^dyD<&Z^=!FSPSL<P%MCBEi\cd98q\ji&/5GcuSlbTW\Mw%N9h\:i^?khlNl<eP
:EHtp1 VA4Jaj\TWGiwY&&*5ANEa*&VHq*l=+VHACDGXp:&q?^=Hu6jkD?^Bmt^+FBu6nt@eI=wm#<aSQ%Tu&wH
L&8!?& CZJ@1AE%=YHky<AG>n+k+ETLh\=dQX^hMN/JjcB#=@Rqq8qdK&+F+SF1%dhTJaylLqi$:DMT+V14#k^l
<W@%m* Dyj<6Y+kX?nT^@9CyyF:kWh!iDic9e@FD?^RFLQL#uw#WwhR\Y/wi#WXlJK>X=?pRKPBQj\DGZNMWyF>
BVy?jH ITNPWCi9RF/M5\Tkc8AhchhMdNX=4JAPljJ#6!1W+nimKwhn@L6&4PHneZYCbCP4+wEk??tnuZ&5tejP
P!^FYG B$bHJ=<FN>p*8Z!F\WyIC&qFc/!^<MeSLtVe8^%RwB/aZM86q^C6WmnZwM<DDIYY@tnHtlZI??ZN^y<\
c6D8pp P1H\WWH?!CGDa4p!RcaJ#:Jtbk&w5E1?t!+:%Q:PA<#H@kTXk6W4IKV4TweHClqMaIaVkA$eaemQG>YC
/cb6NB u>R95BW+K*aIcd+p&6!Mt@H54@?1Mu&@I\PV=lIDp<P&/:4\6aYP*/9*Kqh?>iqwXIR=/L%#AGeMNpQL
Mw4GYD #I6VWC9SZ9!iInwq9H\HpB!+68:qd/!4B&^HTD&MwT!R6^J#pl\#AC#qheybBP&eC%DYne9=Cb6PP46S
$k?\1* *Ch/\Vmk>^L:IJdXYmH$yiGY#uQYkM%6pie^=/BEF*WPVAwbFp#D\&!$mhWmhyFRJ?H4C#K6TF5&jkKP
uq6hDM M**Q4Acie#HkmALSC^=bHS?&ibQLw:%=eX<PukhW#J?VA@pAJ=tl=AKAE^<h@8hn@Cdd\m4kAN5+hW9$
uSJ/:u 6AbIL/!Jn>dNEd%j6WP1dwu\e&JY5ABpLP8aH4N>6dGM=N666pa&Y<?:iZma!B%N:qDqA^DQ/aVV#Xp*
yP^/Xd YaKGZ#w?yEH:yP/bP+Zu!%%P*4k@\t?ejGFN@%!y#yp>TTEM!$XG\*dLTn9a=NA1lQi48@YBNYF<yG9P
L@anbF p1tNnmLkS*ySPbl!k5d4m\c=I/<*nd@pC4l^=ahK?+*<C?FhZ9Vyn&a=yGPeKHS$$kaRK1dKjn9>YNY$
%SaZdu b$J1#b8V#b5Fh&ZIwa5>BNP9DS8=BAQPZT#?<WGMckjw%A&ZRlFciQFPY%:Qu!aBQd@=NaDy5mLGV/Q1
mL%Fbh i5I<CVnu?\kI*@QM@myuhX+wWd*A#lGbn?4=mS>/#<eK5::R%GCQ::8q^%@?+VF:A/naC^uSBY%P$<tZ
cD>bhH ymSYN\^=ahm9>W$VX%m4$aiqByc*kE%<y$9DHLK8LkIhptQ>GqV/MYme@H&\wt\MljHBV%?XHE6Ci>8e
qKHJjm @hh%Nd%&iZw&aSJVGG>4l4hw!leZ6uJPPV1%tQeZLXtE:mG#w4%!DcXV>$KAy19YiBF%\NjZqiF>4wc^
AW>El? 9Hi\IB948<H=b&E:ck1Z5en?WGm!+c9bKLq9$+hC/5l^j&V1d@b#FGlwHYplYZ%yLT@HJ%j$nW!Ydw>t
MPH*5L W5<b5^X=BG1PM/t4Xn+!%W/iM%R%WyiuVLBmRk$km4hQDm&N:TK>RE5E*Di@a=I@i<\R^bu@kwqC8KM>
l6kWKZ RE^>^h\Y>I6wH$@^bjpF/S$JcCXM&C=NjlPB4D/\JeNaZyE=yFKN%L>h=D?\aK4:pFnJRCd#a^>eYwnu
uWa^J8 !hH/EH9>8+jwNRm@y$LbEmBp4HKwI*mVeE/*!j9<nSWL%I%Gk%j5+ckYei5+cwb<ZQMyE&&L4&aaChtS
:A#?SJ Ch>wuVJW>/VHK/FL$HZ!nYZXRu&G8Z+a*YGFe=?*ciAZj?55QW&Bq?WGaPw>u^juM%KjZ&^Hc44KuGD9
6$pddq YDY%@hch6%8wT!Flc6RXNMYnke$PN+TceZCaCJ9GS@NPy+JdDCu49JA@Dk*MAXl95/k##WWtb?X5uMw%
iGwd5F D1^Eem8tFTAHS*i^*eGCjq6jT?@Ep%Pjk$ZRdY<miX6MNkXb<5mc5^ZNL$/h%wFPa!4wny^h*:P8dq*q
NRTH$\ j4H/dKZd:JmD1EF1%lHyh$T>DC\\RYZTD^X1\W9bcQeP?liFD?^u:=J/5$ZZVi:&Gc\t5wKFy61Y%!4B
1VamWB c&%ZFai*D/1TA8d8uC5eiHN&?6e@%Vq?J4E\XDmyiC??X$9*uV=\K%jcwG>>>*:Fe/G#e?lL\^y\bJj/
8tqe$a G4\146H<M?ZM\Z6<*M?<l*XuA^>Cd+t@M*\59/$ZT?V:YyQ\/HpPR4yl/uy=XK&%mnLj>Rk1Y5tNJ?HY
ECc!E$ =/LynSWl8i4akkAZ9RQ\9/Pi??KJL=tE^=!N>HWJI#aq8Pq9*HBIE:J$\:MCEBq?A\G\mnG&Q!TkybL$
yc*+YT $$PAEG8qHN&mQM@JTFjy=+/GB/meJei9#=^$KV@59XYp^9M$XVhnk9^yb+L\@#!dI@/>%iD@9ZGG@c6^
wVG1w! l9%6+\#:R?M5@K<GX9l9LweRE+d@NR9@p:J+aeSj5:A@ukapJm#!%/#\u%&#/F?#RwJ@e1:aZ:N@ct>l
L9tDqW @&^klj>!^9=@q5L@j\#59&+y@@e*@%@L+kZ@V%u<j+i!?Jn@QtZ^B8<4\#hpj8KT#<BwMAh*d9VApuW4
QKh?M9 tm+Hi?nh5^^NCSabab#WyedKi9p+YchMk!pk5inPHQBii<+eMFj!aK1bw1+FAqJlJERR5*nEV\81dCJZ
c?QM*4 +?/yADlEHA?iM@ce&Xk^cw+64pJ/Lp<6!*1h$6&jEcj\y1@Qp9aVKGtieSy$N5XRKEkNJHYh#KqSJwXV
8F/Rw5 Ne#<>JwjuF5%tiuZwJiu$WJwVV!Vh??#6b&WlnQ1L>&VZJ\h9<Jj6VZWAkA5Sw@:&/ptt^+y##aq@a!e
aNaQ*< $$/4N>TZd8C:WqK$?<>y?$pcLYQ%>i=y*4W1Nn64p?w1QNIN9WtYB&y\1$#%Riu*M5uV5^B^&1aE*8%I
+/L&a5 AE=D5ES@iau/$:u$V!+:E=C5CcJw5Wi&1cK*:L#LMu^>jnSNmaDcVFXQ6D?:TW^jRwG1L&9R5t%\pS\n
Wt8q?K ec:u/Z^EbccNTK^ZKmHEXy<@W?yalN%KY+%YG*eH+V4b1w$^FQ4PPN%1&q8!VLN?CYptQ5EGEL:Ytm$^
d>%?RS m*ibe6^Kybiul#i@>ILNLME>FYNEGu*uSB!X9<hlp1qFK6!/=VTY%GyXANJ4%BV?>eAG$yqq4@qt?<eH
!%MNan 1T6Qpm@E:D%6aDGDV+#k*qHYta*Q&4?9:>/V$VTiXAZkQ9++*?h8w>ai+kuG9NZ&q4l<l9S5QhJAYcBC
Nk4QXh la@4J<+hJ#lw@iGuq18L6&t8?=1/RE9ZqWeS4qc*mDjjYPiIp=d>:am6laZSadN6!1I:^&QBPn/P5$6h
Ap8eNQ FqGPp^<YST6nF1%BNVyEYZ8TlA>bPeYhKK@j>&5TcWa$IEdheM66/QFuYcp%!8XZK>MXa>>tClGnX!W\
M18c/5 :BLEMV%HH6Yq:/w6=ZC%^Cw^Ati^RNRww!:LN\iZJ\%+?E>^b?9<w$qQIjA>:I%$F^Z4cnBLTXLSP^%^
WcbYKw eW#6c!9y^XdI&JGL*hil8a4$X4^itATAqGFbD8JNca^hGu*94Xk:hJnYQLNN4Tnml>CPjFpEmN9^1NY+
h1u4<Q @pLnDuLnEkcMy&%BdZmMLZw/j:%Y!%?MIM=e/uMQW*ttaCZ9Pj+SQ%CiE5CPS>ede$B6\:+8tAZR=Wu1
tnJdEI pbR?enRX<4kdI@+$w?dMy@VR=SQW%G$deM<Fky&pVD>@XmV99GdZc+Y</FcpB5?aY\9PiFXu=L5kp1w<
MdcP5= t99VR>Ln#VIP!h=N/Lk+$nSwmFE\#a?Y41!n:enjZAKBc4RHnpYQF+pCm=!^A@W/YZq:R^X@YShRiNH9
Z5lw+& 4qk@^GehJX<p#Jy=Z^dG6bNe91qe@Dw!XHXmbWbn>/h+N5/ReypRbZtplXw!><>aPcd=4Bqqt6WLGaY8
<Q^16\ eie<&1FjymHN8ucWa<G?tMRDPK>G%c*RE?/pB%!J#WYEEDEXN5IwM%/mKHd&HGt:&M4i^DG:CQF*#eWS
/AlM4= FQ8KnMA>+/eF&lGKKW56+FnF+t\aj=aid154Ye=IMD=?4@KNC+m#MFbGNAt@IJqei>bS9h&GBY@dke6\
1Rl@H@ !kp\8&/ZK@*+RjByEY%t?AiYZAjH\tS@Kat>%5j5Q+#A6jNn#^SjwuWI1e*JLeWH=ZQmVV&Ip6YBu!Td
:pJAST #D??ySjuncSdW<Ay/nDjR6jK!p<#=jtl$/YnXFIqIRC=a@%=#eP!k%mH6eI?PuQ/5!K5%YetKh>\hipT
h%ySHW hA/WP/5cdSl%Qqc/Ee^4\dXC*5a<#4K!\#+T<JSwL=8iLa:6Y&681a86AT$buJ#dqq>bG&6lW^Puk=M=
ZQYmET wnbjQWi\/4E*#4TZBZ!\YY/9IcVW=&FjAS8peujnJ/?wi*1Bmbhn9ES^TNiYw+lekmSh94pGWe?Di/\&
-A1aF= 0008516ef1d001202b3 Page 451 of binaries1.zip
@XKVZl dAwPHb8AP14H^Se=ZTh>W=^5Y5Sp$<Q1F\9e<1J4leZ5=8YT$<%XNLB&h<%4wLM>waB6Z@Q!?Rh+L1uR
Bpq%lM ME95@68q8uT%1&\e8^>4p+jJ*5u#9jVDcGKDnabW#hYQ?aZ$@t5<D$h9$$VG5t\eV*5?n#Vbj6^/Ibt4
YViequ \ek<#KH^9M9C>:!a?cHd@yRlHPty?qW^Xa^:km>yt#Bjc+>4%HbhuM?/J+piMblm?<YZd8XeLd=FFiE%
nXRD/X 6VGb\Xlw/uupSjA^k/ZkhjE5#<\eAS+$$^<%6H5RcuF=wp@jaZuPdjZ+Fcp&I?jLuDp!hEPq<@1uTjb9
>1dAMb =e6BISu5a>HhnJ>ic6F49XjRMF/eyZ$l9BP\1DhR*!+eb<iI*aZ\j9a^M=!pmJZ9nGMY?*DI\?PcKnpH
j?HMhQ yjCR<XtBS?%aq\9MTQh%?hWQt%66:6a!w4mCecQ#i:W>V1XCLCj*\$d=m$Xj$DM?$F$*PF#FJW\GcC$d
Tm4R^V cYMS+n!uLtT+\KXuW?u4FT5X5XZ5h%q/1XDN+ymS194pa%SNPS$RH=&qHi8eK9cEnX*QIkdA!Lj*hm/=
AFdGT* #G9:=@ICK%%\X$y&$C#^YaYK:QE<lMNIw::u?%p@$yH8paWZRDhZTYVk>q&%>JLA1%#Md/VdLq&w9YPJ
P/I<jV GJ:Zt=W:uHiYacR4Rq5VS=a#i+n5<::VEXwB9ThdaKhdjNH:h!F9Y?6j%nTQJj<m6=eGWR+hFt/MIp$T
pG@BkH t*YHHWtIcR8wC1<VCM@pKV+aCLaEPl=8<etQ6Q=cFLP<$4p4A:w<S@*WS5itFh@59bSk!:a#<VHh5uVP
AWml6h ?iEA8!tKjXtNAFy+mcIqpm96Pni>ptIpXu8hjy<!4+j!Hl=4FRTh6Ih/IFnmSW^*MlR/p&K<m5CE5ECu
/+N$:W Gqt@Z+:^HnnK?yWddkBRcpk!*MJFX^K>9Z$1c:WIuBkTG@LwXR*15cEGEQ4B?5R=4G>kWY//Nni\+Z$A
wmMjC& u#e\$lwZpN14I9G/SmK/%EW^1wWnKEeKB#FMKA<pCZ4YXR\e>FM49c:lbjaJ^T&!$ReDKmL\dt/6m8LC
Ak?MyV X*#K@ERIl&YLWDyYym?KFw8L#<$4XPQpTm=JJI1IHt@Y&IqN!4mEJSCEaERAj1FdS9Ce/NE#yqA!1aay
&?1n&* jC?WFmwujK8YAk\NRASG18M:+qpZXLHE:*C@yIB8FbI+Xe5CmF*y\Ap/akZ<:udV9*D9bCyTVe%>Q$+P
#eXP*p t/Gt#V/&9K4XkE&bKLnMT*>5!k9FHi#4mtA#em8?A\tMPweN:hq6+aGlcMp%tRmd!1>P!QC??Zk&HPl>
RQ6qX> YheBy=DVFL5ma?j#T:JbDNqAqm95ySWEiDD$m$tV%L1wejklec@9+e/GZPL>ATauYD@hLY@Am4qjdqpB
&G=WLl V<L$!>J>:AT9?bCn$ETt4tP6&n!Jkq&Nq=NP+!+b1lyGmMqh+GCRKm8@b/@1K<FlN$6X\>%adR%Ryt&d
WD\RE8 =qFICq9uK?6<65F9dMZVyYPReDa#n1nE>\C9YDphH\=EidGiNHp&>=a*i!$>h>nc!&nF!@me\eG9JEl=
dJK=*# WJm1pi4R6\HIZL:Q^AEKXRmYp^!jSb@A:Z\JRKRa8^+n%mQaMH54<h9K\JI>S&SQ<Y\&5hB84#YS8h>K
eNGKw5 BYjmIKE1=*4Qy4hAnnY$1A#Y:=F+HN*Mj6*m:EtwXHG^*tMIqc\tAcM$:1R+ItNHY^u+EtFhEbR:yhSn
5<u*S? @kV=!nFP=@8<uHuuG5?WGQtnjFw+6l!*nVdq1a!Q5pL:kbyqcCAwTKSRL#y<KI=n%66tKDG$t\>9kYD9
P#$4ye /LX:Q^^hEnHbQ4n%ZhCq@ktZDRLneY6D%a$MCJb:e<>XM64Yy4PE8hXlHFPPNAB!H>5cyJS6CWTAR<MM
:QZYBq bt^c%FG4EH!DcAw=e6c8N8KT&DE6+WP9IC//EA:JM<*JJuK@$a@m$Z\?mClipTkj4$l^#V%:KiSpT5:I
T9*RJe p&R#5b4L=yq5tW5m5TkX1H5&WyD:6YqQQV+Lu<yD<cS6ta5ZDBZ64Wpqpjat<^=k*W$ZPV#jIBn@GHFA
/pPi&p w#^#8H55p5tbQ!GjL4^FDmCBL><K*XiAP8Bc!b6Ijd%BNT^1dwNj1h#q:CBDR@lZQZ!15j%!=JW#CYpK
B*GNhW CJp/n@FpPSBbtIcM8G%eGWq=Z6^<bLE/!muCI9^$S#TwbpX?dFYD8#&@%!/uj&>tm%?VI^KqNV69F=A#
hN<K+# i=iX@%4b1yR@MDylT+q=jEtYZ+cNQEJFMRB@hkp/#PutHuT*>altG^<&&+DG\?!we5DN!$R<VwyQ?k=6
ey\bbu T8SWbewdM%DYjTLk>1!=4MMV1J5XEb&RmB:pKK>^ny:FtcTlcZ>Q/@hyn4+5:le$:96<IhdcnDtQ+aL%
kd!HZX emFdW$SwB=XM6Mn?IBjid$1bwQE4Rc$D@L^?+*8iptm4!WFklwl:AS/kXwjd#CI?w$8dHFFcW>HItR6A
>Y*LqA n:19bJZBMlTPWmd4e8ay4KnA%6nK*>E?IJ8\B@^h<^E%Hc^a&pWKAntY<q^&PX=QTe6iMZ4K>%$J\8#*
^pIVP< 4dn%BQJh%dni8w\$$!IJQ?=TjhqmyL^KF@ie%#$JqYWLtmR5EppmF<G1iq6q#h?AqQaK*%jkuTG$<a:/
ph&laA Ael*NhnDcIX#n%>6iZjbBaS5Be\<FDtJH$wnQLki>$i!w5KdVbBMN!ZJp&/u/6I&IP$CaGYJaiNcaTnA
aFb?AZ <eA$p:iDcN@n&=d=MT/DdS#8h/@p$MT?%PPVYVc>/+TnnIVVWcHb>K9:md6*1^:*9G4=jIDmX<1pXuFC
85X%@Y tik#4hlVLY?$w<LiL:^I1c</#qP</RPcd5D:W6LiK4IAqbB6FhWT8$al1e5G1VMJ8?T9j1cjGKPyP86t
RIJd+P kVG*>ECZ@nVqY96?@5Cl95BXJ=e/4&C9LSqwZ^R?L%5*kiT=MWESGtVcyuJn^NVZF^&8i#HiY:Zi%ID1
ZTqY/q h4m9E%8uw*VW!mhI*5LbX>9q$#BFal4t:*K14qLm^Gaq!KIm/BIehCD1w/8w8dZJk8%9we\WL8^w+CCK
NWeQ^K e1Wb9:Ky*YJ<#MZkEeFid&9=%puy$XD*1<WAaPtpY1tn4A4=d?X&pQBq!D/T8^Vma!MS!VEcMAcKVMDc
u?h%<4 1pLX::XKNNAyyPReiY*E/?K1Xeui=:F=dW@A*JCiMFL8j6GBHDJEy8h<n!YP169$PN<yPPVeqLQkH!\1
&qy>4h ZQ<CH+YX>ij<FFZYGXMhe!I59tAA<e/PV>y6N\BH?HW&*MulBV^phWhBJbCy/Qd\C#=^18Hj8*6ijLkB
nMJ/+9 c4@GPDKt8RNm4PbDXQPt:PlC>+jRWE/NJI@1C^>Ep6@mpY4l?kY5qX>uhwCDY>ZChXPWcS&MK^Y^#T%Q
LKZeyW K/@\wlG\e:jJutE*i8pm8KH4!8%eZPT=B<j5u1AKMc1TQZInl+K5h%JFqmaSd+p9p=5t&QMcuEdPK:c*
L*JAdR n6?t?Pp4@6AwdK?Sa\*Vt%d\Jj*8>Q!6ANPH9n5FcmYlHn>@Pmb\hGZA!TlT<K*\&aANm\HI>R=%lqq&
ZtJwtF C4#DeVKya#ijTL59^JJ6%j=ldIVFEyNNt<k^!Zi@#iW:Rd^cDj:J<9$Zwc<i^GL5jN$b\5I@p:Vj:6$t
5b$cbe VkQKeeJ@qZ<k1G&H&+=/8\pW8hn>FBJlhm/+tVy\1GQ@iTlcGhF%m/8Lyja!RVqjy$#NbNA1n4?XTARl
&$L5KZ +8:6IIpmhH!:+L=8tTaLJQbSc?H\+Ge*>C+My&i6wi5$jQTR^KHVMZdSMqat944KY8F88dHGeDq\*$CJ
@Xne=k *FDReLuedd#GY$=mJ::Bqu9>5mwqe##MTAT=#hah\!/@X/!X1tW?u8=p6%VXVnT$bBtdX&MVnJJenJtM
QEcC\y C*G\<L/99:AdI9Z>QaB*d?B/4T>=pT$4V9>FY=e/Jc5AZd+K*XtV>nT9#<6&a^\>lhD&5Ky:aT^i!V5K
LNaaeC :<i^HN/Z&Nb@NCK&5SHi1=paip&BuS45SjCaAFl??Q=V5yjMGePlu>Gn8$<%GZwE9KHuaN@\q&*ClkWL
6cIe?^ KNe*hedA+^iYy\cn4MR!Qq=k=:L?a4*6IqTS<i5hK\=!4>H#Eb+/I&55>>D1YAMHA4IG1tw<=qeF+ly%
KwCFBk ed\51paYj5SCJWcH^NIpE&R=p#=CNm>\pn$jP:LdE*NAF%>cDjmIlR:l1*P@KZ4yeP=9lW6\/qA/wDD<
kSpZHj a#VHL%FdPmX/?i54HP:c^q@6/hi&6SbG*>LKJ\PLJ=tL\B?WTJ%dckSRFaT9&HbRIS=9TT@Vd/+DkJc!
%BInyd JV@eLL!1aqc<l\t:!4JGAL&Vp*:%4nc!M$#1cBjQDtp$RYJZ=dqaZ&T%dGIGKqm8pK4wbVijLh=Md$Au
SIe/Ti FIJ&t<P9CCp?dn1Vm!wKy#Na8A<9NkMMb$?GM?yEDV^d%C6Gt4*YVhb&\un4*ahd+R=ykLWiy!huPjX9
<p1mGp P\jTQGQuY6M^46LYK\*eh6SZb?6GciWZuK1qK=B:jiQ^n%jDCbT=id1KFLF##Nd*&8+da*d#MFjDPk^:
&+SaG< Wl58q\B\aJ<=+yYXk\c^G&N8bMMbG+lBD%iNL>*dJb?NMyqEc*Vj^*cSIN+\>6Tj4yAimnV<yRMHMMqK
5D%C6T S/!CH9jCWnw1\1n8!@^WJk85W5li*jLDeX*4%a*6Yk$Mi?cT#88ui!<ekQF@+@^bIyTI\&!J=uZ\pd$M
eew#K@ Dqwcd?IVu\*i6/<kuk=RXE>c1F\lt<H=9lpD>eC$HecTlPb$G>t=4b9>%Wq6/*5*5mRQRBWyYIPPm\TH
8bdTVt 9Q/K#4ni6D4ynj9Kiu=4yX5:^!q>DtB!RKVKy*=?!6m%CYuK/EVHPaE^9G$Bi=<EuB@y9<mJm+Rym%#y
6N\mc8 4>$W/YY>$6SIqGu#46uwQJ1?/+NLHFYyQ9:?ei458b4%T>8#=?=uu5qcd9Hcjl$ZP?I*PV5!Se!14wt/
NcX<GG 41tte*hjy9ePDdt>a8W6M*ue\ctw\uc%kw$8XWSeWKMl9QbHFJ5?8L4b$M\bu?d/i$m=Ly+HblJWEkSp
CpbQn& ^8KE@b6V^C@+6!*qAPcy<A$AL8S?hM%W@KR>YXBtZ1>bV5+AF$%$Q^/uVb<q=?M5ePLDqy#Q^Gq96md*
dpyCyG FWLYdTADym:/?A&Y<PkSyNAF:\>#Ral198DRcJ?lAPcbHaZ\WI9G9/<m=>J+j??Q$k1a$Q@Rpunaj%6A
Mk=>1C Aj?Z%hbmePnjDmn?cH8%GP^jA\4a*\$waQC@\j:^tkR^GPK9Yjmj#P&Bmj\%K\#:p*NF@=4><=Dlu^d=
Ti<6Mh @kj/@^R!\Q=L!AD@k=AB@piLjGGC@@85Den:Z::Mt\bI!I15A&B#ctKH+6R#N$jZMcHda1NpNCADl*8&
XNR1G6 nKyuL5QR@6e6/5lRa1NZ%KB#cbMBIE@bVT8t9GV*WdWYKWwaJSV+XTaWl*B^c5JM^1X%<1m4y\5n/LLA
jAXlL1 MMemP1I&jM@<nlcQh!5HlpyS$hZwiB*$c\\A?Tt5m=y!mZk?Z6?S#DW=>yJIVt$YIG8Pck\^/k16:+i&
L#At5b Dh4:uluMLdCiYey>pdF*%%LcPnP8#1%MWhJ!#Hj+#:WBEiLQk\NHQQ6:mbWeAVDQ<WalBLHj9B=<<*qa
V=nBAR KNZ1k@DN\+^$mF+cZ:C&k9DwTjjeTb?S1QFD&S6B%b8jnA#//mqLMaB:u8jhu&lXeK!*RZV#C#Qiy4$a
W/=aqk APVVa68!A<P^Y@<!We%CdP9&tc1?9uT6HDC*^pDRaq:&E1J#md1I/wltXQP!LL9@KF+u\W9yRa*Q%R9L
+baAyj Sc&Pb&?iV:iWWD+8>?kR/&6!<p#1D:?Y8wdj=n>ZAJ1XHZYM@/nyGhFnZ4ic?GyY#C5&!iiw$VmaaViX
lS:qiW XK@m5@*T+/ZF:e#+aWAYZa%upS1#bp8^Jm9jqWRL^E$HI&5/!DC=$*P&am<!:LdG\/W$@$6Te$S6>EGW
-A8:?E 00011826f0f001202b3 Page 452 of binaries1.zip
jl@uWT k9J<GP>n=??^>QNL*u!Mcyi>^iqnE#wBB9VRkPwP?XNPPd!ieS:IjmXA@BDYqtL9cSt64T9TNN+*#ZK1
m^kjEw Z^aSK5u?iM4IB<F*?L1%bFN1NbYVD%%^Fk4WhVLYu>t$+tt%iwb<QLZPuYe>:NIhKuPC@lR%d!Tb\\!H
F9NYYT L</>#k8YJ/Y%kk&+qJt^+1DK8Wui>L<DtRn#c$@tMXh*nibtnnBbSQ4#QLZG^^CRQ*/q!qcBRa$!1q5\
W^a#CZ 8\*Xt1b4B%M5YVkAC#8akqJkuT1?:jIHNLMD&^y:Kq#&@GZ!>LVNp=%#D#Q$%RmT1ly:+5bi9BG&G*8W
w*X?JS eiWWD\4ulAp^$A8&A4DG8Ii<$P1H6C%DK%6HSD1EIXS=Y#@/1QA>4Ki$RiS%Yd+R5eitb/dN#K#!?td8
TYRB>F dp:5nk!eG/il=pw5$QIWK*EK+ELeJChW?J/!AI6Rj4=6apCp1=^!!?Kt85imAcHay>V#<je+DQPb>nC^
!u@LbY T6lyd@SMBt1Ep^<:@Jl@>M5S@<^nCE+?DN*6J\Ck&Hb:$/kG^Yu^6l+QaFLqimuGwXRG1H>tJK+@G%XC
Ey\4*$ t&tEiWG4nNXC1Q+tMyiH*Jc:\CnH!k^yXF!SY/PQ#9\<E5=djYdFBYBcY+nm=LTci<K9hVMDTj/wAXL=
hGDSkW Il=9TK1Z?hmEuP%Zli%4Wtp>M%*b1%dBIT=^wnh:d=DI?&WS6IL$$m<F=<VM/?c*^wl<QNNN??Y+kBnn
CTBdX9 b\+eWNu=B#*l8KQK>RIX^&MZwwC*#caGE?FRqFA%QHq?S6dMIE1<mj1n*5@6*I5w1=RM8Zye$=:&tK4l
4qq+d1 PqP8SwcIljhMch8hHQMDi:X:Tk+=4\Wj%VL6MV=Vwm&N\1WyD+ebQ$9I1CSdyC&QppH*&DeCmQXwK!DH
+yc!/Z ?9ip%%WwXbIuZ#R/Hm?*CI$Z$1YL:e8BLp1k*4#NK+H=hw^tAiDR%h<6&D9%S*%QmI?Meye<K<1p+<%M
qjJmnL SlY@<JauPBp4L6ceGhW6pW>d4>SZN?VpLmpRKA@91S@^jR8B+L+jy!4nXHmuS$:b/QbFwtA18G+e?\ZK
61T6DC bhjn6jSd>^5paIJ:aN#y/DJV#a*I5L^YhN+n:^G%YD!RiuK96<Y=*wQ4anILSn\!+t/e:ubX#<5HwdR5
ud#&8T #LI4?eA<59PLI4t=#L/8BR<wqpB8!K+*Ymm9T*h8dH<j4u<DZ#F59MW*X?kX9yeTWkw$1LC@>!w89LY8
\m*I4a ?k&\*H:dy##<M:\M\V=1&qdqMMLh&le+QBmhi?R&aQXdGik#\dZ9QH:R^N^*8@WBlk>*Y^4V6eE:\K/R
mBl/Xt e1:XKu&n>mN9m@yEV=9Cu5l$$a&Rn/$49!9*C&QW+&awIB86N!w+/e9>n9cit?8mP#P%yqT4Q41%m!Jm
9DI?Q< l:QwtiBdX1>GwyRSMju<&QN:WS?w#^\YMn5mN&A+GXwQ4I$Wa6?qciM66ADlB\!iCG*pW^$kei=^bXB?
1!?w9C hJNeLT<%G^:Mya<>*lj\CMAtQAjK4>HIMl\$$&yb&H#^4ZNL&A:kZ$qb=nhGQ?w6PAqSTn?5kid^E^il
w+?8cF SVHjWPnX^FmQG4NBmX61P%EGtp&k9\#&A6?RHcJtp%n$k\ln$FD!1htGEa<ndcjZu4=9j>wQ8BWh=NTK
>klTW# aX4C!<@Z*<X/9#&K$&MwW5!\WVd*k?Gc?S6A^/WH^ZMca:XHTjL91!y^VF4Ju#:a#a1#L:<@bjZkw9Yk
ty@G+Q 1Cq8/1NQ4Zwb@\=wT5+6NJV<jWM*j:84XiYi>jn1=m:^ye/HjGFES:LA<!/\w%?cTjaIdX4IH6Ah$\6@
jkhhY8 18S!L*45wEhwuXD!\&Yj:w#pYu>d+X94K+6&D?eEX5ba9=&ZN:C#k/lFq6DH6+^T@L$/k/Eq6p>PeH!e
Dem6ZE V$#Hu:=<:6FA#LQRY/W1K9a1=4EYI!L>!h8ZuVyi6!DDLiLPt/ulD?4!lT@=W>ZYc@b:Np\LXd:4^SwK
H8RBBR j*<WTK94cYd56#1^&#PJ*6JD41@@5t?jJ>qDjb^65jR/&S+&n=khRm:!Fi<Jn%\9YT6QMyqtXK#j!eT4
6iYt#n >^J?n&p1Il#Y1*tEXVSbG5cC^YaEay494tENHSjE\lm$8Gmyt>>eFk:#=<&:nRXIXdh<q+Z8KGF5$M=+
bHR^^/ hlAkqPSi*tpBP*aBB9?uQZq1*>=mlSa\b4GNIEm>9$b&$6T61$!d!KS:q/EdNRCXStTZHBQbD8Sbyi4^
SVEG^< w9$*%6I+KuG6FuMP*%:!CwK^%It&F*6JT<CS@LEnh!c!Pm5P:FbF!N4TwmilDJ*EpN\^>LJV%/6?$%en
YX@S*= 9#IW&un:%aq!WLlVCNVRiP#HVAJu%A^uHe8^KG/kyY:@Y%W5W@NKhl<5N@+eicC4Hu?6pYM\\%DWL/Pm
$KW9K^ iIEeW*8TAu>mq^:%RDii=NK+TC8&eA#KL^EyKd!^XqV?YMn?ipHG=wPqm$%jpb+WJ915aIl%e5PP!tJ@
YaP%>c 9CSuq!dcR%@?:Xk5/YeHHB1&cH*JhVAiud=e84:5WAciI6@b?j8yqpcpSue?R:ecMj$iH9X\>FGMAKSu
AD/>&E =TyG%CN5CC\6AV@&+D9%9a%IV66>?$=cCIY%66e4\lIcQYt:yp&W8pXK85RY%Ala8>9pZGR?AQP\5W&h
<ZbbQ/ j5M&nS&Wm86@\%!L#?@eyF>l?d$WJ8^5G4HZ%=5Qnb$ai8Q5VEC8/H4W=q4M?!KM%!n&K=+5!y?Am#FK
b<w?9j w!+^il?J!I?JZyPSXCXb@1kTpKFtB#W>$n+MuBS1?C:nl>=p*yHV$CjMEQ1cJa!&jcmT^w*HiXQCLp8+
9iG!h* y\c<%6?=Zp*eYn=4?c+l=B<$8Vl<KFme!le:A^&qT<ei6%T@XInm+K<LpC?P+Si1^Sp8GZc^$h$PK14u
m&n^T# +tiSFV1w=T9m6FTBCJ*H\?5GweQ6\8kKjbTyH8p*PCj<wTwP1QT8i$jt?1AtMpH^T4:8K1jH9+kPY5$d
j+?IDE P>D8E/JZQ#c9J<i4F$uLCjnCZieJIhd:Syn#K*V?F!aL/B1>dZtm^?&4L@ND9Y6WkikCHwkm/GY&\S:u
/F\4Te 4<d\pcDlmXY*EF##WIcm\lM?h%S>Z^1PyMELIyp+>thQTtMF/8*khWh<8%*jyaWSP%6!#n<qMX4qRKy9
TamT6e kBiQI?Sjp6PL+/=@lBa6H1%w\!A^WY$Y+%&=EaEkLdeIN9PJE9\k$HXRlbdDZwB@bdBECBy1>/P1j%K:
4#<#G^ a8JlTA/wIX=:\B^WWbd6Q9=hqw4a<1/<LNKY??FVqKu4/KcCVjVGQ++n&Fa<aZDYRp?HjccKct55$nDj
yEn48l Dtym%/Vej$%=pp5l!/meL$I^l*&ZW\R8Ml<4jD8id/\Y6AdEu*YeSJlDtNTAJ&4dcS#J^a!RDeQLLw\X
hia+VK 6=cYuRFlPWuXGb^:Yc>IVJJ>K!\WCaJqQMjWI!&aQNtaSqmkbmw+&I4ZipYQaX5B@QWu#tj!LqyG4M+G
n8mQY! &yh/jN84V>tCTFlWy/$MwHZS&5Yw=XnA+%PZHA\Gmn+bXT%dAB6qPLW<l!bJYt6Awc9$laIcGyV/!6m9
du98=w FZ$N6h<@lAjVD:GQdkh4CVR?p?*XH@VuPM<%\Xy^GPVVe&/abBpQu&6H#j4y\YjjD&wR#@*\tW8%cCLR
tEk#*$ d*yk4mRtY$#IHb$mkh=X8AcmC=Z8da4ed%Dnltl<:leX6uW*1+t$^J<#cB\WEZl4FB4<FJBGN@?QQ:kS
dyHuj+ hEt$uuC*+l^1mKL?mWQQq8dtR+=XY+nk5!R6m$6hP4#aZ1+Xac>C/>RCY</<laqC<bu&>bJnWna#Ihpq
PG5m?# />S?c>teNSW+JjGBVwVjwPALnt$GhM^p9YAFH+i$dWTkE^jVikS5nj!pJ\wZPe+?J$?8L>pHL8cT/HiB
q*qmD5 Jh/DPa+<cM1K*=DZ#%pZ/teIqnF!QKBXpA&tJ/hcE8cW8!TeW!&<@+*ad8R%w@#5SEKG6km\k/\BNaVF
V%RhIE ^$d6tcc*J9#P+ulQNjdH^epa\%lRLA6eWV=b$D+%9ayBY^y+ajM&k^l:Qh4wT>jAu9YiGkt?wFN$YZta
\>#8Lq L*p1!y4lba^Mll4m?C6$RbY>^ape4D4:SiClIdB#mj<8hu#Rc&HqdFSe@mVLc=@/QktmX<uiq=@<nXZ!
<DSQ*d %&p*?BEMkXmSdnB%=WwFD8%EKHK@ESX+#VXn4#B6VpbVbqE#tYQ4QNy9EGlu4y9++XkTdA6^&A>w48Ae
HNE!Q1 qdwX$ScTTyh<\/E+15EcIjp=!NKwEW@m&>ZJqk@*1J/RAjA&>FB4dJ5>$MJkTuL8lbBl5HMSmkaNH^eP
64T/T8 Sjd$epneBD4<ap9Y&X\KXjuPuHe\X%/unPcK?Nd5GnG>AL\Nn/8yZ$\W%nQ>$Xj%E%9tch^!\Waul>4K
hk+cYN c^+6%<FAac8h?J*^+9yi@Y$j%$pY!V1IABEnJ+=1+p^TjFMq1*8Ny%81uq&pl1R#?>Y\bt\uMj>8A6ti
pHNe%4 +a//5h$BWm%jmmh<A@CeSnuE^8%hK6jDXK^F@X:ETGm\/FtHywwpMaJRCEwDZ=>IXN##=:yKBn%L8Z14
>!uSTy pL=1bPqKEIp$6XNYjcP#BB>MT&XN/n4R1qLWpq^/M%!5eHAA^V<mFt5mj8MH\A1qAeS\A:PD*wkdCjGY
C^F=?a qGI<i4FH5BcJ**\V*E6&dj&RW:W4*<1uQGDkeE5jKGcYMyTw$NwW8JTRBIB?5*Vak!MW5SeiAFaM>Z?u
!Fe@q? l%=a>S1+hhW@dTQC:5uMPm4&<HyCKGAAVtm/PcmJbnFMqnEY+YS:/i:$XlQuKa8?L>e?l^C5R?%Zd@&H
p?&JJi >I<DPWim@aj5<?yM+J*W>#XZlDH^+CQ$jpVB*pnbem&p:$mMCG664lnh+=#Xb8@^ywdZ4dK8bR\J%ZA1
/ceT^P y*CQImyBK/9yqXV\SKJenqJiIlnkXpG\@eI5Hc<:qXhQ?9YS$=R%P9RM4bL1u&mGublAVtYimbCF5?!R
l4PBmh k*%5%ZwN:d:<&9h%PTm<LY6WwhlDwcPM1HCQn=mTiI8T<!@P*4l*l8a6+pl>jMw/Ie:A\I>RiL4Rh#9d
ZudNlB ^VtBd<QYF%1mMjyNbbaJ!!a#8pG8@PVHBn>c9DQ>LAlITMeeMy4c9<y5CKm<RGR4^HKij^W$EpuY+T<t
d\I*id LPRWE8YY9<GK@XcViPJ%G89w$>^aJB9yS*/NeedjB\9qTl%<ZTV#id@&NaHK8/4y6jPQ>e!j@4+wGP^*
K+d:1y G>hXt%XKY*Qd4qN/Ga9m@pKuC*X*M141uiS!1B%/w@FJq4XS+ktFyEkYQIGV$>jG?*8ZCVn<ijpH*$hh
8y1&>J ^:y>PwjCA#8Y8:/P>\*d91:a9PZZ?8V+#S5Kl9>RwHKFI^cm$ad+Glh8GSw&^4E@E1I\6%aDmViWNwDI
#qH*BM w=c#cm+dIC*YS<p!:>AH!e9WM4+RlR^aIuq8qu+5H*KMH4=tpnPVj?VBl#SR!JuKqnyMQ4mkjVGkTJ8T
TDC8TH q$FpVW<p^4SwP:IC%T+Wa=yK6bYh*LuN:cCY9HXWe6SPiyM!%y4Y4wcZqe$Z9^9D9LKj$$HSt9ilPm$$
Q#yXm> wc#HmwR91$:H>kt>8chi@6Ya?c^T1ld+>SNkI6PKD%+R$9qHB9K4WGK=tY=&nbWB8C/ltJ@LIDuKGDh5
MKb4X8 HnQ%ZEjWwuZq9F&=1p^5ailGn>Y1dwqhdn6a+J51MPW/<WuMy>dDRjJF:a=m5?\ucdC*9w5QbK<TR:HG
mZ#WI& K=WLRE&/m6It:eEdQt>/celT\:RXnIJCNdqpcSTwCkepNVS!T4h%FS5%Z/i*ceuGq&uFhqF19N<tA:jF
/&?tL# +EEjCP=5\e*DEF8=ZISKKy\lEi^d\:RY=AuS>d!T=eAuQGVdPu5FYmbEZynj/yBeKpk+u@>*AlLD4ye@
EaH&^= i?c$L5nu%cq:P>>p6B<41!>6<D$P@#K?iMyQ+hh#hCyA?p=%^:8#==*J+A4+e+eA?X^c\=FmFBqXq>Gk
-AhB=D 000d8517526001202b3 Page 453 of binaries1.zip
JIaPTM wNYNbFun+IEC:*4t?>:*Q&D>WWhntI&$<A91I9/Q9?^d1D/9*n$lMeDuJP<TET4P%$#G^jkRL#ad!mM@
d?X\L! huDSpi>e:!AZ5a$#HFabtT&SD&X<umb<pQjyb#B^5G?WJyJ+$\i%/:N^@XHTRQpwe8SCN5etTjPcnD4E
QQj!H\ 6RM:W\5Wb%@@QPamR<H5FhjdDw+q&ie+<=ReYbcdD&VCX?Q\H4GY%S&@*q\K+6aNFW&R@#nhS=MbbtXS
h&*Se# +ZNeW=Kehu9e*wWm&DX\G\Y=d\iQtpL\<:C$kEE=j>m1AQ<j88j+*^ej@L?Z@+l@qj?I9!*@+Z<w@?H@
Gp<D5X Pq5GL9R*=V<e>njaQ=H@eQlj5@A@YSaAS@\%C@8VDkP+!F?#j!4@+cJ@+/L@bD+M@J?DA:nRZ\eH@&Zj
A%t@me 5Ink9\aHmD<KDkSF@5@R@9<i*Rqn@@@8Vln:6?+Ey6:K4k5/RG/WnalIJbQNDQkp$&5KpbSZS6j9qGpD
!$SEcM I&b^tb>DBYjVT5udK8e?up!+pKiH#iK?8R?i8jD=%DDFS/AIkB\h4MdAQA/Y6SJ+=Gpd^quV\AWQJR>E
m?NTMB RP1E4Y1lDT\S^qPPdH=L#SaWG6Q\?tG@Gc%kD$*^!XkeFTXEw8hDchlF\VEIeVcu:hkQG@HZRM^dXB&X
S!8tqa @8i$jJXu\j8I?w5^%NJpjduBFJB!$=5Ww$Tpy5%h8Yw=w<4ZV+EEpCpLGAP@uc1Vj=GtpJMmV1:ZDYkl
G/AYy< :TSlW/deKA?I@6aAleY&MDh5N#p/*Z86DdQ\Bm?c^SBRahVuHwW9Qc9<Hle#=+WVmp/QQ+X5CLq:J=pV
KBq>X! T/laA/ChK4uQe#$u8Q?6\/BK&PFwBWJatit!p><6PR4BPD4aLIM%/MwNAcLTSjM6<XhEP4d*yDWP=Cw#
Rkm$Y% dckR^+6JBQD<>DXEe$95c8cS!pm&&wawp!$nmt\tjAW<n:L8S^t>bX@c#S#16Tm4:L94l@&\&b9TW@t5
pw>L>k J9pby&1#\:ZSm=u1+CGT4%SKL%y#Xpa+>RhEutE4YE1Bw5Jn*bQe/YL+uQk*G/QuPYa*XhEGYi?#=u9^
DR*@qh XGK<Jjd%\/9*uZN9ZPjYJPBL#>/:<AQ%S/\H6I>HBRw6cYIc=uh>pl^KF?Ph@GJT=BC//&4J=8KB#6uu
9mCm1I &SSFumwcb6:K^y*FSTAZw>8C=^YwGe^8+5A/+aT8k^hl^5Ib>9#Iklt*A%YG/TL6=$?*5ANb@\>ZZ6**
9yNC%5 T6>n?LKQAw8dZ1M$VP%L^Pbcbu^D^=IRCnK*Q%tyneak#G^A@nPmMNHEe%1:Fieak@5yLQJBEiePJtSa
#^Ek84 w>Vdi=nJlCJh^Vy/keql^<#%j*!q^/K4kF%?ne*+1Sw>8516ma:N#%kM4QDbEpn=T1Hk8/K>b*#KX&?=
w=&Hm$ EWQ*Tp4i/KHpyhhuXn>iPeWySwAawi8Z&RRA\XYuKCBpP!e!LK:PmyW?YMbyVIuMRuJ^lSZ\uhh!lnm<
EqL%+8 1+m+bKmeM=k*^%Qw+c6G#?q5lZ%@+/uwpYyP#MKml^AJNQ8\1THY4wk*JLTcZB&IiaMkLwk^j%lE><TK
%Q/cl= *#bZbp$>/yKD49A:S>HmM:5S@Bue+KLYXQKjl5hV6^qiwZ\e\5:Y=hi8RkQDS+p9Z\c#*ka$/Cn@S6?q
968$&I IhXM!IZT1t=yiHthFQbYaDi!CDP8>^p^!dBimnkT5^>n$SM9&JZC#VlnehPhBSIX/J6@:b8P?IH1mGe:
p#14*p ThX=hDcX$yJ=/ZK>iB%yym\BlGYwwjVq+p>?L$6+I\!Gq4R%>iuuVeeI<?dEC=G$y=!B/?NTGJ&DV%S>
Z>uMSA QcBGX=JMGQ<l$Z=:p8CWqJa9KQRV<&l^QAMh9SiLeiGdFwih/hcY=jSeY&tD/Plq/#iuP@HeED?HYwYZ
JGbmpq yi^D5Y?XNYQ:L?idG/K\8pjFHjbuGXVDE&P#u5$$%P$LF^V/jX$+mPJ98HLM<lyBQ?5JAhpptHNhiDH5
n168^^ bymK*NN\/w@96iG1>#Vudq$#pLX+euT\KD?\5eZ\Zk+!BuWZcXLwtZ*WSMlQhBJDcnQDIu9Zu^Z=LL@&
nT?*:\ m4SE>yGS$*i6%>4Eptwn8?at&#Gbmi#pkueT6>pKDS?P@BCC/T#TYlA^1/l>J?V?R1Cq=4%5ElNQ6Vii
b4&//T YP#%?$ZD95/=L*@S8VC9Jq84!mD$=Pp=dq9C:IKJipVeah5RVk#Wu*E5Z@pZ>Sad<QBT6IDT<VYPTn:/
eLqP>N KIPB9w%$NRQ$?RMXH$JnKIwqd@k#QQGkJa?iP#+&+=$B??lmj$wnXW#lF%SKNG<BbTKlqyM?IPZ5KV>d
LV8j*k $%9F:R<kRhd=54*mb$LdDTPkHZhbabiK!P&qEjc4cNuWecjX:w<K4$jF*4P#KP9C%B5%D*pHRi?D/hi5
tiLLK9 Waq9M8pXB?Qm!+hHIh5yVd8ey=@KdyYBnd@L6/pL:E^aHR*EjtVY#Mc4$%N>hIij=P\<%TNiXH$L#EVX
u^jW!$ $L+Kl14TB?Lu44TN59cq@\DAe+9C//k1dP56m\H$qAcjj:nb+XmIJ4u++>5XjpN>meEZ8beFp+4a$XaS
QWbZ8\ Dqa#WCSYY%?>%=%C:W>#PS>tFBlbRVjVhcVIitJhGX!>&SwXqa8h8PGnhc@A*N/?LhXI99mhJY=T<e:+
u9:tSA E:HWKRQKI+M=VP#Xc9<FnWt>Falj$YD\$$aed*/DlqGHtcml\!yjG4+%b&#854hNVY14lJnbB?>kJHPw
YJMY%# XyJ%ImQl%^4ec$L5hl4m4$KGk*jl>4:Su%4XBayd+M$LtV<DbL*uEuBk@I58%mJhWJ/$@4p=IX*d#Djl
a>$S8& uDRcDR!R&cn:Sbm#ICmnBdNhew8N=PkKI&5cp?G&tw/Ge\!8Ql?$$D4!TL:wDT^#@<u5h\dZP4Tbp?#*
KQGD>! 4T\@=8h%uYb#+6:B*<iJ!mYKY1^Y:^>d%4hp<TNKpe&&dyPyl\DSMuYV&*9HSbS1/aLjPtdG1ib=hhw@
Ibj\yS QCNmtX<aEZMyjY?lh#^SW%TCESt+8#&#TpIX!^MZBF56Dei1c:1>C*^Kq^qlmBN5y1unlA$GLChGMY<5
bBIp4+ Q*8XjN+>i5+B?SZXH5Vmena\5KIakQnaALe=*a&tCR=dF5EZBShq1HNK*MZqmFS/lVPjFIb%6Y+hJG=/
CQmh!a JjiWIWI6Pj4^HZb=#+P><4HHu*MbijNldb*1FLGu96y=nEB8iWej?JPmh9iTuR4dI\jSwEpHpekYEhNS
piRGZ# ?RuaJ=TNRuC5%D+cZ8Bu/?KuwIIL!Hhb*hRBpDB$S/*>CDdRmiRkHNB44Dl!\5CPBlp!bW:/V&DHAK@5
LB%tAG R6a%XZ+mk8m\Eek#X1wQTH\=&SLDaikt6%@S+dTcZIpCj=ECY&!VqSHR6pi&FmIGQNW?mlb*tA+wVDcX
J#bb>i be:1Ryiw5^GyM!Ww=/kY!e6^MBJBpcY!:+kEGb+ZbFq!j!Fuq>wjaG+:1Hul%E<XbZNRK%PGPc*GmSe^
\LbaT> HVAq#aapGLnKGJ\Gy#4E>5DmTmphtGQL4!&bitqRyuJI*pDRil#iA%!48%#<FBK4y>ld=l9l+WhlMKt6
K#9@Q# ?CdV6e&Qpa%X5/>PFLhRbwA14Y$M*WGWu/dVaq^SmNQIp\e<RlNdRiaeCuSac^*E=u5!GP6D$^%XwibN
w5NQKD b!aq/GdC=dG4yPHI*H*$i64&*i:+dQDB?+hEua+nJj5Xi1Iluk@Py8QWV*iu1dd==WC!DH615T@XEp?C
qeFW/G JKLZT=ctSFMXVq1LtDZ4jH5+WB4<pl6jh\DXL1w=dmQEMmlJ$+BN=NY8NJj<n+bRH*NP*P^ShpM*H$9y
K#uJS# bIRmZXcCA1?<ZyM48ZH=6Vp*cXYy#A1unJ@<8hMl91EcLXhp^n:ZKqe@/<@ibEJ%?dhE/Fut8/A#4>D#
IcK88X I#udAbHycEXCJ\$pqV/PDXBwB+?DDum?K$#t#X=#bP@tXlkdu%9+?NTqb*b:nCTm!:jj9PNM%BT1?M%q
a8XLkF aA8:uF%wG/cKt+i<<?DkLSIES5V?pqQ&NdT&%P*ckYt1q5S>bMFDcT6kmS/1MIjJMYP8u>iM?&pY:Y/W
neZ+1W >R=Kmqu@Mlh8$#^#5GS:J&mQFp*\5Pcbq=Me\><K&mL<JGc4kTyGISQ/8Ip8RTEZuD#cQP^Zk1#b8MI*
jKEW/6 DT:S/iSFcRyM5=I#uEkb+Bu*n6%Kj>&m4qKtJAZ>W?GcDmh?lREYuy$Fam8By?G8XLc!$mYy\Ptd&XN^
p!p%^b /*^ddC8JnY*dy<G9?VXJtIZtuZDpaXNX1XnV58\5\8H6Z#dGu<Z8IKFC#<d=AGX?+:latSmnaNI\kk4?
&IcbLQ CD!$QHCjnMqqjlwMq@WtAI+ycbEA!nMECn!Jl&+XqVqAm9QbA<^jeaP5%@e8#>NljjGq^hB*?T<XTy5X
1lH<hK ThNW6%68B>eC?C+pIB5Ak8Z8iBQH/Wjp<aM\SZ>Cc@pt$!JRnhjRX=m8C\cMkYuI<Km1Gm5C*6E+4d\B
ITcMS* LL/^Q+@iMj@8GP?QNd/\X@iVt>tc:TRkQ@b=/jD*aup=!YuLWqph=!N#qCVRC9<XKjN#aE+k%9R4EH:Z
B<y/#\ EG?Rp>Th%h&HI!G6AcuiKtJ>KZ<AS=ZF:8p4MGH\PFCh%>Ij:>S!!Q\XIeS!wp=D:XBQYd+H::6&NC*&
^lkDwY PE$lb>A@@4>=:+:QBT=:KcGdBmD9ekbc>4K/&QDFwpCIVRPmRJTZjaM*B$#ENNuL6KiSL=cn%!C^mq<$
Fd\Bp> FJ?+Sqp?b!6Tl9<:V=8c6IH=!LB<4%iV6IEL9m?@SaqE*1L!lm<4!^/*:J1K=qQ=Zqpy>J4++IQuwjkp
\a^KiB e4EA4E5+H!VH+6tVMkNHey49<RiK</aT/$b58E\C%$:S5RejJF5AjG9AAw?N5Rp8nM\GHN@H6PlV/QY&
69$MB> !!F6MAPH?W<6liRVFd>#dRA#AdqI1c?ibwN#bEG/EnmJ5/B:M6HRd6^duaK:CqY#Qy@E=jL>XNbY<V#Z
PiKMCq Nj=/RuZnwMBL/>RIQ#wM<Q%JLQpi1ETE^PHMY\wAwH=?*uBB<4m@=P4b$XF?hjS4@q^%NRXuEDP\#\PM
taZ\VD Ni^w@hZq4NjE#RuJt@F5k4Q%6DN^Z1a6&CtK&A!kt:=u%!KuG/tkX1nwMCWlE#uCGl?nIQPmH^>FGC<q
e+%aTh !?ViGP^:XAt!*=WX1jd%#yyV%ZCtEnG4yCVn8H%&nF@1<k#k5A?pRp#\ce\hNZ\>XZAwdZda1@8M^+wK
Sb$Jwi uJYj15kpN$jF&Qyc!EyW?649KC>#%tMF?\+*j4LQX<+8^F>$dMwEPi!w@uKwVFTpkZ=*:nNLndh6ETE5
kFhJQ# Gu=F1F^mi>%DXwW?:kpqVBJkMYm\T5%Z8m=RNDM8MZ>X\:1PD9^hIt<=q?N:C81X^!=^4na5TGBA6pV9
\*$t%: ppjyF4^I/#G$nyT%Ti^HDuF+yVwuVH5SVu4TDB\=XSDZwXFSRZm\BRS8#K9m??Qamw&aybkCQhjmAESw
%jljQu J^/Lc#!@ywnQ6G=+<bN9H\#=ZPa$bq$h:yc>\H=\e8e*iE\c/X$/KcdVq%I:*=:9*Pl@t%ctNpBEXej=
LEnc1\ LDiN:DkDy^YW=n8+&S&QSaHut9#@iBF=FkYJ6F>jB?j51?Ny=KPqkp<u@bK:HZ\CmHhmQ&t>k$P>4h$t
lkaqTe CGNF+Dp&4/N\Ebe/ebW@bNmpk#uRDlmY>Npj94MeGdinbhSPKVJIK/aS?*\dF&>Nm6cEdLcWdP\:Hk*$
:>!DG# <^yJaL+61tkp5J@@$5XwlFXJw84Ijt@4^p4At=6*+/9BbdX+Jm%ebIL#Y\S=8ucBhpVIqTBDSIQSBVYS
<wJ4$E c/>Q8yyM+6aYGH!hlLnd%M#Qe4a#JBC/mwMYdR\+HZ\8$Et8wLSyKR5X#?B$Q:SYJRB9wki&F$9Tl99N
&F65qW ZH1KtkN8\i\jbF\5th=8BcIIGmFJA<hEq9^!aH8Kj1>nyZT4PFlnIWQ*KKK^9LQ8SLW^9!JG<nPdyXhn
-AYGtu 000bfd89be1001202b3 Page 454 of binaries1.zip
Fu5X*6 E+e>?kIZhAMT:%PQ45*BDL<@Hjea+p1cy$BSlRE$FPN1j?8e!l#L?DY=pVcHyNWItaybh+eLGTQD%D!L
8*F*#m SHj=LCTc\*Jq=a$+>YT&Q=CLBkXckZZW5k\>y$Z\Zb1%IeTbi9Q\8TJWmHbVt>SliHE@VC5C4bdKKyja
kKjl8^ yG*q5+dBijpwYwPDW!9W$/pj/QR>Gi:&utw5NdB=yw*Fm86VjqNSWCc8S>/utLjH@AGQC64ypt@DtdjP
A1Rpb$ euV*d6TR*/QIlnIk!+$Dh$*&VLL&Sb8Yl^/GB!<?5qWjL9bqYwFWt/N44%QBqa1V8e^Sa<mi%84*QG#E
CNZwqN YpE1>:k1=CwNKd8hK4#JW:$VtjbW@bpE6*bC8w#GXYkiHhci/h*E?y9&=?kIcTX?8kadC8$y4ne!+Aj#
mYCA1W ??!H*\%4Qha\9Jb*TCPl1w5?YH<ZLI<IXacXqenLAu4J1k%<GH4PjllT#ZZm5Vc>WVi8bcVC=diS$9?k
/CF+<K J^>li:y^+BTj+mIG\Ehu=uT+%aBe&>MduBNp?Fj*&M1K:$5L+S5CaiW%&wq?:#^/E=RF\#/$+P4WS+4l
F\Z6:k Zc/1i^nc6jy5buNZCeTyXu%+MipnwQ%CqZVnVEQ/^+ebX$q+9blJ5KA%i?jd5WPbVH=*//i6Yw#eA\Ve
YucE%Z R8P=Bd5R#JCq/p?y4pZDM!#qd<KenHdP&yZ6ZjQEM^S%F\@D\V<YNZaYK\b4l9C#b^1KQ>u!?@5*nSBI
J>:ycR I4Mqm$L<NZaF!STp=NE?dl<E4%#uHiQtPe@+k5$ENY@\Ll9pXLbqD91Zqhw?Yn^hItuI==w^ISRcbJeI
u&XT@V md5dW1d1/&Nh=FwB$Ml<m9\Wmnh=h^TSlZe\EK=nR%D#Dwn?5Ch9wahbH%aM%dLymnVynti?a=k&8DG\
i:h#q5 *wQ?VLhL9e4/Yj$4RjTqd1jkb\WQ5/9q*:n<^C@8EKKB:ea*jy$tqww>*%8edWHAaH^hDIt9M#?l=Tj?
YhYuQK bwEj8$4>Y?HtIaqD*aGVtF=9+iCYl>naj/VSEaL@<$#<Rj!*PjZ@&CH<Z=!/mNDjhi4@6=V>J>YL?Fiu
XaM8PD n9m:Vl$B?^55+w@u^CQkj<*C@?^e^N>kBj?EFjq4Fkd@a^?QEQ$d:J?hK@dZ4JDIH:Mm$L>t@#RHEBH<
@<#18e J=iQ?G8ZD@<9Lq@5D%!?mNAj8H^llPD@Np$AG@@4#*yuPcMdklC?qniuC<YSKaKA!49M/TimD8RlwIj!
q4puSe yqQn5:k84bMYBbeMW^R@5d8uuQy<G%A+SEVaqe1RW&E=GA8Pk1D:FbdayBdY*lnjyV?B6HC!%V%hEE9D
:Feuci Mj&pp5<BbILItKpVWL6%1\pk1:!uMuq%^R:SI:E<$?/yH@&t&Gpt8VFW+:q!C8%Q*w+jN?A#NJSWADE?
F1$AyD R/K8GD>c/DZ$y=qDH#4GQWJh<yFR@j6I>>!SbY:<PP/XdFX%VuZ%1wyC4BH?mqGn@uwX*G>QajplX</1
>V<9B9 I@+d%/nN>M<wwFdk*1QXZnCZ=Pw>YSG&Kui+?hnG=SQ8u\D5elb1Qy@?WP$1>?&MyqD5>D*wMtl^YC^$
SBCt\t LN@Su>?YwqdAqIdWNM?$uLPF>puW!K&+/qI\m##c%YY$b=J5?dMYpKj1Sc#XM^ZXVp!D^A6IKL#QwY%?
Yc:1D9 NQXVZS&9%qFddNQPCpR&*emcGq^8?L\PRNpa%D^S*&C5yRnlVi1Bc8ES1R9BSBiiwe/qu:8@B#F81u4w
YEZnRW &qlRk*H+h!Xe>b+?T4d>I1e=Da^?RE5*E^!GEQ4&J5%mwVbVlY\\qKFw/hP?^95nPtB*Xwhyl^*n:<Bi
/ew5^Q A5lJ4cwDcP1VDw:NJ\d++iAHu@:bV*lTNc:t8&\w9kC*5b<R8e+S:@jqa6I@u\MTVcM@*hemLBqn*yEu
%nD4!= $9t$k=ajHR96R1*Qe58/p#!$ah:lS@j/98e9CqZqKDIw!*u9/K#GTTiSjGV/lTWy1I^WVK4=#ml#K6j@
u^a8J8 /Au4I>*&*QWL*!B8dBwcWVH5#!<<\T+hXi?bDKITit:9QWNS\6q#Iwl+H85yG!@n!DLb#uS=ktS#1aG>
IQtQc? lQcMmjF8a&WWVa6hb<y$M1LP4:eiBS%A!BP:wYcT@NnyLaS$Tu#<8bRtwuNFBlVhQlyE+jSe\Eu4#D%P
\mIW<& w!MJtV4=QlMV<Vt$a=Ap%@Rcdc?mVAT=N5PVC</+&ehS&65FI8Iiy*ScBn+9JPei!<1aY%yyScV\p+6\
?^yA4k */SR$CZlSwI@l4!lw4Ih<>MIJ1Pmbdpm6XYT$iZDL=V6SGpaQ:N\$TBqXPAw96u@qIjRwDBRH$K9&@hc
6d*G#Q n8uHMw!V:T&?bChIRBN15+<T^NF#\E!M>nhe1TQmmjRlB%b1pLGBR1bED8EYDj^nYiXGp?\XqlN+V1:4
9yCTa\ E!^%1uYb%T!dJYwcY6<c1=@AhLWk\:/FP5MwI8$Z:Q/T*ADS5qEcd@>IluV5FKbye<%bZ^L=qPVNKRKF
^inbWC #WYX4$+JeK</yZ8=tc4XhA!q$kDTHJ+#$!<h6%PIG8QuS%#<p/GK\WIHFAYBt4^j&=9VQ4L?i8jY</4Y
y/ZS+n KYl$6@M:Wb%wAGXIe^XHRT/**bnAeK:$B+^+^WQDLd%K5q?>umdjLdlZwb/6H:9#wd?mS<j#+Q6cnGFJ
Gty<*5 bB!\jtA>M+HPEL8>+XX5TStR:jG*9M8F#jqmwi$V1PtEJD6h6:A>QEMqal$>qiDyHdQe#<ZNl%?TRkme
t%FXac yiTpcy\S*w1lXTT5eyi>w*+KPX4YEe=\NZTbyK?WDtq:tQX+nM1kkDQI^$l!>iW+$@l&emmlN?ILM?>N
FRwEL5 FM<<WbS??d#q8CcC#mu/X<:BXa818HlZZHald<pZ!Tedu#XbPJ&J!=\m!#LBu/qmj4^+PGa<ChjL$eJ>
RL<F>D <alA*Xh1>Q:!X@4?BCTlS>um!P9:mpFR6FZhi5/8ljpa9<?=+:h1Eh%\LdQkKAjYma&WwLhMP@ih>W!:
!hNa%< c$EY$mhAR59?/>BNebwXT9HJiNHZYd$:\mG5VW>iFDAdaSXIk8+FMcjb<ajkBZ$*P&9j=V5Q<Mm*QKZ=
$L:\t* W5::nt%CeCihR$Maah:KWbiQymCVhYiZi\F<G+Iu*&pThek4Z$5p\8>u5n#m#!$EM:Hk$nG?6\P:4$H:
Ek!>ae m?X?j/HEQhq=8i*=eQP4jl:ckQ5#hPKKcC4EY&FZ6*h*AQN>FdXw5q<qe=FB*/jP8\N1k:dWldnielKW
mtQneh wNhniN<yn#%t+jSpuF4KhD@R&BAR&Z18JYw>w*L9CX@L!ZqPcwiB=6T#=!w6Njw?eDikHQHm68Sw>1MA
k%YFC= iMd?C:N/jiN9Ny:ki:&Y^RPVu::blm:hjDGcEmhNlAAH^m8#9S$YS<@TQ=&CC18Fl=J@t9bmqn?4%>&*
^kySXb Ep&VK%%>tPdkM/bl^KN+D^qyA&qKP:P#56+9bZ/cnMq?W6GR6Z<K6=j6#B*4\P#a9Z*ky4be%a#>PaL+
DYt8jS 9uJ$ij?1i&hk5/9=yq+Lq=\y*Xa4+<P1F/ImPFicZP!jAqLD@d=mcR?uS6ewBahEbc#n<RJi%?tp6Yb6
y>jL&9 Mt\$tn#Qjb%=@IS\Dn5mEnV/VX&i<iGw@1T^<nHP*QQ=PEPqkq*p#pcK+LmG8%HE469w!1\t%:Lp!K/N
Cq5RXZ SdHui5hw9uZhb<V=/:D:iTK!nMF^HEW+XwR?C&VXL:=TV8#BDBJ4Z<TMt!/I^8lLN:@%XnL$JZkd9ZJ!
N@pJju qZVm#/w+5e*d1Y4h#QIb<+:M+Tw5><JqaX@MeuJ4h#1V:>qdq#PHe6Zdq<AQE/@9Z?IG$#:9hy:SEwYY
^WQEQ% aS>?j\hMBY8@yBcP8F4>dJlV??M4?#i4GuiRTXu=ujp?/jTkSK!eDXh5GjFJ!KCDDQ?RZd5DVd>1+B:i
l:lA&H /Ay/dV$/+JnV#YdeBi#C&*$Wwq@b>+6NAtp9qFJh6&8Ftm@#+w:\ApiIj!lqWyM/+HQEC6?F#4q+\FlM
t>u<Ni Ku5PZk@mn6u\68DG8=L/VY<cnNbEqwG$RwIPVLl<DjJ=+Te5&P^$\1y4\!mQL@cB9cS=Ppi<M+Ce%^cI
lbw8!J ZEt$Gu/VpQ$u@HYW?<:SI^#Etm^8^=GYjG#Bj6+B&kKllVe9G>YnPdVwwHLHcjXDYBwaY&b1/%BSQ&^n
IXD%\K Y?bpB#bR+bay5RCGRc@69^:yRc<hLSlAPcPk4tE6?%F+nCYu++yW91J5$MEX<meqGhT^aq$F:/cF8Kb>
LS6Y!h !uVKci%EPaIa%RnBm?#8D\wu$%Lwq+yq\%La\E^^wP<t<qCd14p&nbRJqkPpYnqX9uw1MCByK>$&^58l
%ltTGu Ba?VtLbc$1T&BFunp!1IeuVp=ZQ$mJCK>k&><#$<jd:9FeJ^F*a!Y\P<4AqL4Fd<wY5@HVAXZnd^R+<L
Gw^CX^ 5ZR!Z#G!YAM$WCMmF#kbFqdQiTY=B4a4y^CCBISDludQ$#u8D9MNA6pqZG^$A9ewtPQJ*?AA\j&\G5:l
=4!*P5 T5KQYKADiE&Y5>J\aLlLiJ$R8n1!jY?+t8NTIN:wye^GGn1pi!je=8kBtYZ%jY+H&/@+9DtJLub?RQpV
4V&&55 8V=P#d\4EICAEM?!jBMlFHFi5WtwkV@L6<e<wKIu9A$G%*YR!NpAi$%1K!eV5R:WB1u/pV/!p/>JZVXR
&nknDu 45pc8AW?jY@qhlh+!e9//?@l+ehR5NGe<!!DlLyAVQ%<$/\JwVSNCp#^\TLEXm\C46mnkqmPyjhZKBm$
9DVFHb ZhijP\Q8S$y<+JdyX45D8Rm\VJl1K#>nqX5QSHWK!=\GdlpNPjWki#/VVA<edX6/!iaSu>^<naaeX$B/
aG=QIM FBt=!:B:k>a@k1Y/Ni&/%ic#?jl\16cmw%?J+npe^N:mB1$NViItY\dInpaHMS<?Idu8Q%u?ZX<AZ\<^
8QjBmG Hm<bVK4t#F8>*:hV*t5mGQa4c:11GlV8JG9&AH<+4GaNKtMpe+F9Lln6j$KQy+!XNcSVmS>^n:n&aTt9
LhQwYQ 5P9QB$1+wXFM=9LwLT:SX+1V:68myiW$PpV$D@qMR*JR4+iaN865hkZwc1a8k/jq^LhDJdjBekQN#ELm
iyb?Wc %bJ:wc+@1lJb$+w@eBS@l/9VjD<^YmAb/FY:c\pq8Fimj8<w?mDeM5VhH:q*^F@@XZ^*:cy$VAL@J%GN
5wpIPE lPyw46kk<IiLya9:Np/55&DT:JHt4ey\##L9&+G1wF&uDGjJ=TMHEWYm*@JDp6H%<*9kp1H^t/l6$Z=A
LN:Z=G kdM!JYh!&Tb&=?pAKGwa<da<<EJSSIA*tL4<PTWLR&QZ6E=@dFR9Q/1M>GdpFbQ6WY=e!D8qQMNGujRm
eHKuS$ 4i9K\I=!y\8q?a9R=VITYI?5KH+j?pjm\KTk#$p%ldbcVm5J4aHqFBEHh$h%\I$n4GD@!1Ak%%BAkE>y
#:JT!b tVlK>b%c^w%H+GK6\@i=^!QA$98Ziu#Jc*4Iu6#%EcKlwQWVd9lBB%Wlq86\9^4RtXpda<Dh+!+H#K%e
9@S%#8 l&>:C/@QRV^BVlCII4/hE^5&/1nnZq<8$jSB#mCN5=BhnLYBt>B>DT+E/l4E6$5DKyL9Q&IF=8MJ8u<m
c/=TD1 *nZ*=GPc^R5/*6GuyGKKCbP:6&8mJ89/hKyqkaVNkCkaC@BG<8Vkpwyl^dN6lnL&8?SKitHi6\qiE4nZ
YEB&yA TZp</G9AleIKMcZ<PMGaEe@mDNcKjlpyMRuehMSHBi#L:&1Qw#Dc6H=wNDCF$=jVGA1&nM\=k=D*ChC>
P#q9MD W<9S1PR>t>M&HnuIp9HLt5m=WQIdP4adQ1ydICb$w8k#+GQ%\lnN4Y>>E#Ah=TMh%^wa6id%Gd$F1EDu
XRFjBE ?1^l8>H?R+kE*yWJQ5:>kpVbPZKpa!XFXKL8Xu1j4cuQj9Va1L>>^c4ZtCq\%FE=i6GKpFR@^&t9XF+l
9>DV8k jP&h@Ec8c:K\i+H5DDW^m^kbi!$QhhEL*h^HI4H?Zhck1/&GTFqh4u/nn*$Z&t/Ne^>NbcXtpMb8C:l1
-AM$^Z 000b42a03f9001202b3 Page 455 of binaries1.zip
*<kXWJ A4AWC=Q*<Qk5BdnA\qjD8R&4886JLae#apd=k85L!jppykq$ISQ9Fpa@^>FQyT*LMw=nt<SPC=b=1a*H
4XBP9n NcaLBe8ZT1qP9kl%RX%+VXqkwe1yVt%+q9GF5wanu:m4\qVh#>iaF<e5A%\tTaNbRFC4\NXIKk#&b#6F
bw\4eS Kph:4&Q61VAPBwF?d8CWThbGTFb#9A6%LNmubJ$%@Raujw9VunkaXV1yFPP\I<H9ykDhnI4lh1l&>^tG
B:^Dka Yt$?^1AkaLXK=yd4MITyF^1l:AS?hdNZKeCu:LMwMMj*VHEbP9JLcFj?<TX*@:e&NdJp&a@=6tw>9Du>
IS*<PC =9$ld9P5dnGKn+nQ<EIjMmpQjN^Xa<?^Bcau*kICNbBwE?ec1?y#STymWaR<<S9q*K@9^hlj+EZ9W*Il
:SiTue +h6!cEybIV9aLeHm:6Xh$mG:B1KT4aK:beAKdj+=4AC/#a\W@WwRV8^CeDMSmYj4qn+Sm<QFZqW\EVwW
Fe\d?5 hjA=Y+WM665=$+CZM1Z+9HCb*!hBun<<c^Mw6#mYR$9P9$#5G<5hFIMV@yF$LL+*q%4^>?%&ZJln*MBI
PpPDHI QG>ZSmqFIl>*4qYXAq8>#!:A8+%CKZIXQIWb6@/TXJDZ&YcKy^#P6%+W%:yQaSWC5ppmT>lwEADcCV<H
\F>DjH +8=cp%KT#Cn::BM#llmuun+YSy>@T98CF/aH1yGZy&A58=BTT%IE%ZPXLcJp6p:^L<BAK!bR%?iM<a@E
8u=q6y mZ&SNeh<NNcpZSbp^EK:5:N!i#l5ekaajH^+Ey!kLXp6@tbw&&YS@HIiP%Na1CZLQq&AKpWLi<S?<dwD
hSAl!Z WJapAK5R:LNTGw/d<B1kWY$ynbRume?*@<K^HjS<NDBQ\A&QDR9hV^MH$m+/l5c^V<M*H+al:6/yahwE
P/qb:< e8&mSTlJFA!$8KE&G@%d:@\Gc1Lj?^6>ZA&IJNad\+He=b#Q#>R9*G6REZT?P^lLA:aRSR<4nIa>R6$&
$1k5Eh ntF>>hS&6NY5QXRm%^KKWI$85A8bhkq9W>WjIZpa=wm$T\+wB&q:ZYDXIy:E5eh\S8Et!@TWZat14H5%
?*GI5R EFBCKVZ/?X>i^yi^QC$&IGJV9C#N&SiZ9jeWY84i*+%jR<bSl$JFH4>@we$!KFW1lJ6MV!6kuTCyJa*<
Tw=YwZ N6=LWqM:jFXeWDXepqeYGj6:EAWi9tIy!?#pV8tX^bYh8qLRI1%hiVnkhPJK>JybCQ4K!KH/KHBB+:NI
\yNwL? IY&IQiPHPYGeEeknAFNA*cP?e&bB%*?\W<\\Gtep\6:hJ#CK5c<hW14wl@C&+PSP+n+wqDI\6!+w:>A$
#ld9Gt mjkKNn?j:TZlweS%MdS/H$A\P4Qju86Qb:X8C/u\YQFeX$<*:@YKlB?^%ubXijtVw4Ilia//$?F*IcH9
VWR9HR bw5mRtAuNwT>AbD=wb?Q?q8PkpTJtMiGhH*9HnEcjD\wL:Z<pSm%y!e6Niaw<!RGK@eFj/#>/+1wRL^6
BR@Z*S ZA*!<1e#bmbn5dI4Id8kEC%l8>?NIqXh!#NHbDnk<1eiK^QnLi$NiMwh1*J991VGL^4^96%ntQ%+aae1
B9Nune %uN^\R>SJlLn*\<==lQ:iSq:JHu<bQSHFkM!=dS!Ihwl:*4B1RVpNG$L\IZ@4J=Mk$5Cmc%L^5#GquPq
wh9YAB J%8ldm?Q!Sd<=M#ahPTWDqB6&EBGSG%@@++KV+mQG%KQ1*H9\<I9:$E1eu:Njq4$<*/H^ZtnkyNTmcT%
pH>pKC q$\Hc<F4aXFun$e%Hyw^di?*%Q9\PH^nI#ET?I^!#H&B%\uii@#%9yTZl4e#qhM!6huStyuKL<JqR4#>
$N!NH% /tjQ:k^GMnIDlJ<u5$Z6hH=Rn<=h5YL6M4S6VA==*V\86@m&C:aXccn?PVy\E8AykPuWQ:lZ#+Hdj*LV
H:Y@uY 1<KW/%^lWCM6=4#QdDV!@AGn!C<!<=?yh#J&Na/=\HN#Q$j1e?YhP^PK*P&8iRM&Va/FV^XLb1>MV@L=
C!ESNT *FuZ=k>pZ1kCQ=R?ySB=G6q/>TVFKWnQAFmIyaj*Jbb8GtaCnbB&?=MWRpV+j&k^9\n59!q+EQ9Z+EH5
dA9p?c d\eQau<aQIn<c\AkA99u<ED$n?9VSSB@k$Z<5eRZEjpd4NCjmHnS9&dlau<eiImI@R*&V<+Xlj+%C^Q=
TBX:tK +?qDwwJ@k+Z@CT9$N%nwu%!#<F?#\1J@\5L?Bk9@+@55?niiK!GSQ&H@^uQ%y$GL/N>+5GCIQ>=iLC4/
PTwYIA h>+p&B?#j?QBEwFC@=AX?^5QFpL+V>l@DybEaH<bLQ%Ha+mA/n>?CwZ@c:Ip>kjJp4CatPn@/SL=@*tZ
HYlApP TH&n1yINW+NbF&1u==qp+k+GXdP*D1myYSPCw&wPBH5iT8+6\SIkWByEeM:cF9KiJGaj+@mDG$ImKL<P
Q=i?Z+ ce#QV&AaeLTbIB>W^$hBB<>5WDC=16+GAL>>?WEVpEiGtDiElAXEX@l5lQJideZL!+?QPYZIT:kudTAV
6/pL6& pd*qST9E\i/?XPWJM!:RcM%MXaS5dIG&bDMP=<:li+GpWy=<BSa+Dp5EPbC?jH@IkdaRhWlX>EFVtRnA
&#u%>N Dj4$TCRWi>&TF8mWdpaMe%\euRQt61hC=qYW#^ntl!86H4Kh9:TYcqVAX&i91q#jEl6\::eWEW%F1S9N
MBLETk Q=SSN^u\VHLWZp\^&61X%dd*Yj4Ihcw8*jC/\F%!ELy8c@^yDHKtQj+qJiVSwFiF^:LPS*q%e8M4QqZ/
ZbBVy? SlWd1?il>^1%IEDKaJhQ5Njq1p8N#YP8DGb:F/u:T$/!Q?dYE4W*XpTJm=+!jHwwiYkC>@H$YX&C!%4F
yS#FjZ al\hn<TI9al5LVGma!Q/wwpyaw<=!w?YtRW4i4/1%&>tE^ANZjTjLt*yECu96jAB5TGATpbLwbn=dM6%
6a%Hi\ dhiVdLM&%>mG6iiSXa\aE=Z%HdGq8mH%Iw^+nA+Xi4F1DNPWj1mTJVQG5Q@W<YEXk>lCTt41:EtV9^tJ
c=>m*X \\tLh<aEciMGQY\qtZ<Pu8qN$THC^?I>=4:JQ$*j$B$:DDH%eX4wQ&D\PF%BGDujG&9IPk4N?9L#uZVJ
ahen@b q&b/y^Z*d>=$c:6h1BJKt$dR!pSLT81?n=+kyR%E?<b^!iSt4XmYkulBE9ZINQ%:kFn$?$Fb:dZJdT:>
b8=kYW ye>5kA6L?L9C+J<Ia6&Wnb<WNnRSEb&?VLuDAm\&>cdCQam+CJAIA4^JdJ<tNYLeVL?#j4YY<SpS&LKj
XZhe*F &cm5qm!q!Y@b<D/%y<CYXF%C?Jq/Hni!npnQR<C5&\lT=iqYlcM+J11&V+?h!lDP8CpKL=<c+X6jyH?k
tZ>dlb 4k*4JtPqu:=dwn#+JF*8GaXk$Tu4adINJ*b$bk=nip8dSK4Aj<+c4KqMpZ6^Cl5?m\Itw@9nN<Fl1pQ9
D@&S:C YPKL=nSd*$iNb9Bq?C#ct>jASG#W*byF#$M*X*SEZFqyc>a#hqp$^KXGXB=Z:Yph$yWVAI4i6D>PX>Wh
JTk$bQ SaubPEK!&p>S#=<NT+wADpn4#**RCq!bwWXGNNV:KuTMF/LAk+@p9Nwb5e<*ZaE:Z>#w/*&%hbL\XJFN
*KKn?? VJLNXTiV>iaCSXQT#b\XbV5X#>NHBZqH6!%dcWemjT>eHiC>H5+QNl?1PhkI$1W&+#GWqh6FeB=!lQRL
1%tS#G cbGcmbXc#kBbV<bX<nlSmwD1GkZPyym/IL?a/LY!?qmu#=6F+1bj\8nbQZSbEtd\PQX9YiJ:^dMQ&>PQ
ny1X9I Ty*bKMqjK*np&GkMc=A9KhP9DbiItK%A<^jweuhpVnpGnqkHPDj&8lXcSA<QiLlC4:j5CFjjpDLSK<5E
hXyKCZ >5ae%IF5l&aaeCD>Jt!!ek@HM%Wp>=#%I^wnlAn8Q/Jb?^kjBjabcIB&Tqy?i?Pl>cy&Vu>Wupm>:JAc
/$jF9* pcLPP48jwGZpFqVEl1q+E5ImR$^?>\KT9h$?5<<XLP@$pqj<wRLHK^V4<tw$<K%I^6I*#uK8kqeX?w:%
!>Y^\Y d^dRFpi@$%\%$IJSW9aPWS=+QLXSwpD=GN:GFG<ZJH@*J%m1:8N%QQ!6V$@5Si#$i84<w5@KMEMFwdFM
4VXk$N ktaj4&upbN#6Kk9M*Ey&bHZ#DSnN5WSdW>FQq#?!*F@uHVCe81j$/eLAJ5ZI9j+!Iiw=wQQe\i+hp4T!
PSHH5n RA*#c+P+I:tIcY!IP>V9c%1+5D5Zh1E!VqHmHqpS8mknt<wFSWu@JPLN1L+d^T+JJ6dAVce&w1eY\i65
++DMIA peyYWjpd4=<Jjd*Wie<l@5hT<>$HPyianN:F11u=TMJ1&@/FGKlW4#m4Y@t+wwJXVA$h5mE\%pTwC=dP
Q^1H/w @h9Wi=hPqeXS:pwKNk=+H*DjLCW%ZPlZX>l%C/*5jdlmlYC4:FYa?1kC<KA!6q<pSnn6+LcKmk\pNDyb
Pd8<A# w?<4d%Y!VYwnp\BLi+V*Dn%XXF4<^dBdhqaNu8&+nWRSy/^=G?+%Nu:EYk6u#p##Ab<?by%GNW<&?S9b
t41YKE AdRuP/VY*BHm/ZV>6lp6?Q$+YR^JjY&/QYZ/Ac>D+#:W4w$8GWaXnit*%LhTY/:b<1ZS&JZL^E/:$C%^
D?H+>$ P5&919cG1T:1c+u8ID#e4dDthPpieVXV?VnW%bJ>ab:V4h*M$lq*+X:nYRJ@I9T*WSl<aI8HYtyQ:XtL
K^Y=NA 6edik/NY4cTXdJ$PikJP$Cw6a!6#:$<ILa8D9htcAXNtk\?MG\mpPijaN/J%W=dZnm?heJnQ$6H9\CeK
dcZ&6q #Ep1u/HNn@Lj8CB=YJ&=#+BqXS?ZH^u<d9A%4b8?L*b5&H:CdcnhFm$&+BD44V:GZE:<YCt!PL9?9hiK
iQVBy= +/e^yj!b?:y8T$KiPuRP1^e&8>M#N:d6hdm4icQEe?JR#@mj>MacHtZG$e6/\IIpANiu\5<p?/GeYDMh
\nypui \VBeT6KH1qy5KVCtaQ:&FHI\9n*4KtdNL94Lb!4#i9MIjm&?$YAm=^&q>*Z49/YGy9ZHSB!Lmh^%:e6X
4jRP&+ 5&qjBiVAMRa1?EE\%1@eeAW8AEQBdPpDaKnY&*#en+1pI4Fc6Aq+c61AEnK1^Hw//j%HdFGWEWLe^t9$
tqKY%@ qu4KZ?T>@iL%$tMCqp5wa^5G+pb9XX96FS:i$+q6%HuY$TVdu^*&T4XmKXqn54wT?Fp??Y/\*V9GHN!@
C9wSBW <V6\::9>:B:J\E?%<i?uhDN18je?qm&S*L#pa=@FE=<m*JHnWS!I:pwPYj=REHBb!aSm5RtRE=KZ:ZQd
>!eRa8 NEAZSw4pi$X&&Wu%:$*nT8dqw:9:?\a&9YK=jBBwjiABk\=B=/?RRN>I>JeS<8daEcAp1qkbXF^MX&Nl
RlNb6> WE!eVF!Vk*TJ:N6mq81LA*KNk/QFkYG&iA/iwAtN9qDV!uC:G8+tAMimn\$nTJEySYW=ed>kCZY1K5M4
m&PyQ+ Tm4%ASu:4G9hE8y^Idiqb8$FG?VZRh1XEWCG6kKQ!@*kuJGI<MSIK=>K8c1IEbPPM6^aqe:G<wJktXTZ
V%**DD Rp8=!9G&<m+#cZhI:YQHw#4=aVlpe4ndT6Wd8E%JbyLQI$9&6T*#!M:56J51Q>a/kTw8:I#1LH\j!!Ei
NJKh8D j%1jubG!Fn5%J8Sbj:yhci5>C/?Vk1KR+=ik5RCljeWQPjG9TNe5Ba++l5A!?JFGyTWYMyEIDC&n1eNA
9%wuM/ yE!P&8:>a1tw$GpAm*Jc&YNbC&8\Xa9wyk1w$BI$JtHKbmq*DFKRVeLD=Mt^6=e1m?BZ\/a1VC11h!tL
w1W$a8 /PB%VAy&LltB/#DFMnquKZtkDJ/Ckic/E^D66lC8!TC9q^^%</!uW!4QC+Cj46<Z>YDZL*kHD/@C5p>&
W6%p#X wJ9>q%1?F*nRD1&SACymGHGV@:k>!B$6KWMa/FnS*p>/jl4Z+MZWa$ZiNeld6$>1N<$%\TZdGa6MnqaP
6Ci:$l L!qmpN>WdmlyeVt9<MijVm6m1LDpBd9FD@K>dTM9/K/w$MNL=Dp:!a9W5PGTbVB@Tj8XYT5+Xy6ku48/
-Aq=Xl 000430bc149001202b3 Page 456 of binaries1.zip
1ZGC*\ ^$T?ld85Td=\9tcm19V4Vw15=S64pMmPuT:!9wqK\eh#C8GB#tK<NdpLWjMNj%nbP\EKJ<MLi@1?PWGW
:6ji5Y HjeRKlYZJ6WT$1dJL4#^kmQal4B!EuYKh*<*bJ*:NjNpw8EJ5\W?CjEBBq=+a<%L>Zc5W9#4uqyy**QN
PCl@SG Nl*dRK?CCBKC/^cLNB\5F>nMDEt9@iPbGnpXym!<NhGEZ?a#ub+pqe\FFuk#q=pWDib%IT*@Nn&6ybL$
S%CR=y q\X=WhdFD!PZtpnkNpED!SPN^K\L9$i>nKLChJ5ZVEl5miSlZ@%le>:E^/>1Hp5JCFqn:BphXiZ1JGb^
kte$^K !B$mH#8i/<5yX%#YEAmw4$?h#9F6S#*Eb?l#/jNAMqkWX=Th4bS5Z$bZFVLXVJey^l8yhG4d@pD5!F\K
E*k<M= tNT\>#m#^wpR=5yFXqYAe^\%bpXIuB+TZVBEPH\wZPt&V?Ei6LNkQb@KG=k/F=eq*at$+bVdnqSF<k=5
R&u%lj S</Th\Qmj=YWd@n8$9\IKuMaQa4DbSdBPyG9?TYVhI&+LAMWiYn6MwpRWh^#=**8ej=GKAc$F%VKnTpl
jKQ+XL JDSC&alRk8wuR%AY%l1Th4*YVS#nQylcEnW%ZjHVEYY4:=1Kp?bVYLZS9R#^e1TS:D1PDw/u+YKtY&t%
8%Vbk$ djp!9L$RwYmNRe:I6+hEp8BLYIdcnSQZX>\GMSWeX&P=/Mt^l%IN@Cb5X$>mc@!*+@PSC^J>1GpCZmA8
??Y%!Y *%QTZEBaBFn#QA16Lc%\tie\>^k==PG=CACK%$XY\k8T*^IyA*C=/PynC$j8mP9wXhnQm+uHETEBPp4p
eqeYWD W&#jLXNeWN4jH%tH%?ASQZKFkcQ4Eq%M:ZkDPIa+$IetBkkNBSiRFEKhGM?86H?EiVK?:F4%5:wTIL4X
cYt<yn &wEZ:QYeGE%*=/GuXmAnZ<V\m\KJCH%8EYKt9!&9jbniE9lbauJaBG9DNPtI?NyBH8B6$y5i4VN9YAhK
m=@dJ$ 9B=:JmemTj4yYjGT^B\ENnjHb6WH>q!JS4q#%^lKV=9aWFCL19iE&lkId&mLBcL\bd!/8VnE9%EVk81h
=@&=1W ZKb5QP6k$eSmw=@hW!8$TdMNFDyLm5P6T6+GC9CIu?aRN?FtHW5ccb=JVH@WT8p\d%mRR?BZ8e!B&BwA
KeW=1? uJEd9PLV%EVE%!!8dM:Tu68EYF/tQK&K<#N5F/<Fa^<Z8ntVc4lyBR/cPiYVShjKD#BH!%jw=R\/qVq#
ne@#1I >#&qeV5cLpKX:dk/F\eKT46!SV%HqS5N5jQwDQyNFWcPVAh=<PY?m8X=RD$b1+F9Q4kXZ9ZGQ*LtqZS1
w:*tX? mY$y#!LMS^tEEl/IYP@SbVLNQLBuw5ELJ6<uEVu69pyX>NkW9S+TZ9@<qKyW@FAJh*m>K*/>AM/yS/La
hM!wQn %m!q\M:wlcZ8YQnh<b4ay!buRenpWhCj4F<XE@/jy^ld:L@JmRyCwTL@LEZ@<S4md%4S@>Rj@&^X@qXj
NRhFXi mj&4F9%nZTiG?B55+p>apd@B@5q<FDHS9&d@dR@yH:Jmj+PF@mH:n%5I@Y6aYBV?J:DkZ<NC5D?Dlj+c
W\1MLH @nNV?A>c?K@yQ%F&@+Blj?PPCR9>CR#@J&pu>6jTV8!@Tn9Bj=$J@*<@>j>eD!:$n*9$9$p>iBn#@\L%
QHIn$Z +K8aKmk/n?hlhB&Dpm%PTS!t8/J8RYy+w@&TP+FXGhJXj6NQyhR6Ph%Xbbb^AA>>YKLPAKmQ$yt9!5@S
L#GuP% aAnFAh%BpLYdk1K!W*$@^Il=>C!waWJ%Vm^5KHHaJnDi+BtK!i#>$RHGdem!tTP?4T=jbEdQNF9Guut$
&Y6ShK 5<VD5qmtEmI=&\D<IlMjB@Q5SV\TR8AjNMn&t1=K\k>:qW^Ceemuu5w/<J/Q/!W#<D!6JQa=Hc4Kq><b
WV:t<D 19iAS:lQ<C=PC\6WY#*k%Dh#MLaH%J<8QcyS<Xt\AiCMLe:Zi/AMbR^$ejTjwtdBSHbIyZI%?lWEH+:y
#jFk^p P6HG4un56jK^1HC/C\wGiBmIw6cqlbc/YZwL++=N%RFKujt?>j&WBP1t#I=6Sd%%Ypd<j!9NW=w5#FSB
%AZ&c\ 1$9tb6WY#^>LiHEjhPqc1BLLEAhdAiuk%#PG^8b/qbm^RT?\6+uywa=T@ME#&aTw/t89i\$LTXYPeb?<
1$+XKI %^ciaY+S+^AVwuSdGhMJC:!I/t84e96Rm1Ld&kqm^=?$Z%RCQyR8?Knk9Ym<ea#wZ4p?iii^!nA?BAFE
eFGuut :huLcNStp\*a?>cL1h!V!6E/4%^?9D1+iW>NVH5ltnG%diWY+jyEX:e^SP#kaaG^p4ADY5XTq=iHFRJ!
MaX=PR :Z*??8/b%G%b#K<eFL@%\:S</yjKDQdWTBPPnnMB$h>N$Mu^@1/F<YlGILFT1W?AG5GJ/KbEETl1^4b/
HQuj\? 5V85PLXX<*W\c9SN<1PkcKPQbI6cjA@ZeMl:K6W=Pc*5@XqbLu?$V9QE1He*IEwK<>DS>M9\L\jaLKGp
X<EZqW +KnDL+SH&wpeik/ja5#D+ZcmE^ZF^tVJd46Rb*/KwKVH/FVCGCNCykEcPP@E4QTi6WBk<=5W$4yb6*qX
6Ebi!= 41tcan#SL$uujm>hjw\<cVd+<m/EH$BY^ydP?8Pdqum@k^%Nh$ui<timMltkcw?\CLd<$GkWi>^wB4<M
D=\LNe :mcb<j6u$5Tk1&SE:DT1?*u\!R>BIGw++X+h9:ETIQkyDk8%NJhQnIQNNThGjCmcJ%iXCQC&Haq/1!>w
KX>W#n nb#Tq!*B@5\#p5<P&&+ZL^aq+DZqpal=tQK5TBejuVBV1pAt8!A#cX/D#l^V:$=%TG%/SWh^^@9!<F+w
mnjc@y a*kGpXXiXKdk//E8Bd*D?ZJSaLTRt&J^6NW1n%%Y+8*hw#BQQHYKD*+%TK>TL^!!#*Z<LqWG\Z%I!R+X
1+^*:m 8\AaN=Cn95RhyBYCkV4atucW=nXQ>ZTDuLj>=VQAd=ZyVkQbdbw^q*:EuMj5BaG=y#K*AaZ=bh&B5y$m
S1\6wi &eEtFpR9pl?STkYn/w&qdGdDA!:uB6MMyF1wCGYA%RF^&MFT?cZ>1IDw&+!k^IPe:njBaI?&+niZQ+^T
qQeeX* tWZjnb<wB&Pbjp&yicHupBGPAEyqYYq:8INV%VX5uX=T+c5+H6GcFk?tkE%p&eEqJ</#mJW4a#i=kyEu
yuAwMH :LR%\@R<Y>6eNbTmm@KBed6#\QylPDWikeblwb8L=Xl+9@wdP?JWa4hcdWIjLX^nuytKHD*&dGyq:i66
KD*muu W%#*N/tCn+D4E\DL=N?XBhG%QKab*YueM6ZX1*j9IR=L8tPKyu!Qt/5HTZ?1t!QeE#R$W+6qWSdD9Z#j
+*H?18 Rl@M*BFIhdeGQ/hTPF=:Ric=@+R9J%p1Y<=1=%*%b6!L?X?#Sl^M>=Z/R8A^Le%Va1PjYEEX\It:K?1:
<C/^+= pBhj9%Qb=Sbc<kuN?Beul16FApI=>nCHhNm/4RwX6!8LWtnua!aAD#BFP=<#Kqp>+Dt^6nn#Rbh%YXKG
PnVPwN K9Z?C\G6R%RtnVQ+FmDZ#tB8iEmdWZFT#JBt8Blk!56K*NI>WBK+4*qA>mNP68PHFe>ZA>hMKt8wR4#$
:&EVmG +q&5\$>N&/kSh6GpT=8Dq&iF4c<k<hE/<wuZ@L!=W>jqJeB9Z\+BG5qpF/d4/Km*K5RJd<:aPIh@K>?V
?$HAHA XIwVGL9N<AnwZaEdJ&MAG<m!K!@aL*$ZyQXD+a$4GL59R6ni\PFy5nHj5<4RS4Y9CuLq8m<<uN/D9S@!
@GhKE* =MmA%AnPVbRWZQKQC44W\jeiQA&>B?PiGedEG#A??XkGKyy#wAl?1X:BqMMbly4PVbalAh!nEPZm?lRl
c8Wk#q +4XuSHDuZSIak>TbP%RF@YJ@H?ST:CZ%VnR!QNbF4K4$P1ZtmX%NYRN#ZaWH\CYELj6+QyLu8V+ma8EN
V#K#IK <*TZTt@Fk<!h!YST/F1Z/djQ/Sa?h*hAcm5kmDELX!nmS8SRpalSQi@MQ=u5hd8KAuP4uu8AY#$n?1%J
a4%=5R u8m<+1+mXKRu<5+idkVjWbXttKl<%Y>1En6N*IpaGnN:S=c*Y?q$ituD$bhDli>\VLptu6F4<5YR^C+4
LQ>BYc =uH*\q$5bc?ejb9iG:MJh:$Cc!au8:V4^hV?ZaqTcRh+SYaLl>P&L9$wIZLPpZCEt*Qw?/#aYwJa1Fj1
mBwyTS =?XXcph4wa>!B4jDee9YcRIRD?FXb%SiCj#In@*hlH!b5yp?%PqT\kQC@=VZ*qcJW6c@e9=cjLu\P>Rn
!JTYI# 4LBni$%bH8&>$c<4<PYa6yE9&IYZ<>ZW>y:VkWuik\i\%i/J\$:9taWj$^EFL6$D\#J:/N@?HCqqV=:/
81FLwS 6aH#/F=iC>6?ii1tS@YL8?8PlXPiyCG4kq$aM@B4\BZ4c+>8/QRkm<u$^kEBu=e9/\>pDc+1<dT/ja>l
w#%#Fl ^b$*>/IM+WwTPqplDtLb6hXu*YS1d?1EA:R8a#B$CwFPILKBN/45RKkDpn?!DeX^W>C%=qdyeZ/1q^^$
=$eyd! h>nuwMePt!=\Gi=bQAZ8VYD&Ci^<\6k6?hE1PDZ%?Dn</jlMKAG*>kwGMi\n/:K+i\+=R96l?H*G?ClR
DhJTH1 a&FVTI*BIJwVPVIJB$I!h8qRZPMP69+EepcjbSIHRi541QNm^X<8#P8ik1AwTe5nyeVKcL&n@5YhiFk9
S+AXRE W6qZIE66tAwa6%+?IKFt/+6$^XL9Jc#q1aP!H4kKRkMTXCDa<*1<nFlu*Gyu=pWJ@J<F=PPDDy\5N>:K
#?AN=@ WeFGXK*:nQ#54!n=9yFahTLq@T\JJ%G%@H=pQ9Z4Dy=EhbblRT=VRR$nNltCGZ^dy?G!%JTKTpR:=XVH
8EE8tL DP1AC8N?L#:u/Q=aX6=KR4?J65Da59MRVn*FcEhX&K1Ku44k4\CHu6>kYKATGL+D+!<iMA<*ie@>!\G6
@Y?eeY w$l&l:RRiilpAHd^t6wNZD%kiCX#Kn8tRw&@ZlVn5F%<6:1=GL5Je$G8dTul*dena/%nu=eNbSw*KD8y
KYPSKc Tw5V8L?q#:nS!Sp8!X8+cB:jp&Z#BHkwFRRIyy=ID^PMjA%qBJNYQTIl4JQhR%1aYJVLuQdMu@e=bb@q
K?i6u! e8+yKyT4N5kyqk::Ap8?<>Ti<yi:9K?aqw%:A8/FytlW\Qj/%LtmV+6Bql@Fpa+tmuk%EY=HAQK%Zw$9
jjN#ER ZP^T!H*JV8RH#5I8!\H^t==lQ&eHBYG1M?VAcJHj+ZTjiTFh#VpTVQmcaVk9EJN*lWME&:1kI&e>$ECC
BVwFVB 8k:M<p*$$bQ=4C=BwS91yF\Wpj!PmS/wyEDDJCN=Mt%Y5nA&kRINyq/lcbpuCWK1PByCjDP<?<N?:LCe
Rm\wj1 QleVqLkFaLd$w#/Lb6&8XVCu#W/a$E>?=B9PuSLL4kX!pDc=Cqc\heA\d&Kb6KIJ@1?JWHdQtj^:Rnt4
$Wu1AH p>mq!pQkmR#ZHe+:+VQKmd#j@iG@&DD%Wb*GjK9*!u^HWSCpBS/qYqb/+5b4&#WlX@:XmS5>8b4Tj1wt
QdQ8mS nLLR4QnQmqqkcTlPPBXIwK\:@k6Z\R<n6%l\VLmNQQRJZkFHBFSHI>B:a<MwqBVW%T6/IST#>$Se&CT/
Pu@JwT jqmjY=aw5b4mDA9F=II?j$M%G=>AY8X14$J:!eFA1KIRe\EyJ^Gm5FEZuu5m#T5:t!ZBLnGRXJJ%8My=
+DYZDw IcX&8Y!bZPDac=Junpp:HBGBa%Y6P?pJk?Z54#kQJ6WyeVp%Rb>BM&wNH#RGPIM?e61W<l@F6Ie\DVpw
Wiu>\T XD+b+ZcM4BGw=kSP^:CFamjQNtVXu48Wmb?hwb+p4wynIIW8B@I%Xi1>&NHu5eSMR!kCHG$<YhJR:A=$
+e\=GM l%anyy$!9Pw$>/G<Y^&q\SmKSQi4Sp/jq^p?9pt?Ci#C?JHekWA\wu4hkY@jR:=ISa9>HT8qwkDyAZ>S
R\:G<= !h#YJ9Wpkk??uuQ8X#pd1hQ%BX1RkPL>wy/EpS86XZN\+>9QMNuj!wAu8qbZTt8GZ\uuC8L?XpnFhqIp
-A@H/$ 00090b52062001202b3 Page 457 of binaries1.zip
^pkJTB EGMhE+d>FD>@b=DVT^96Aqwj+eWnkN58?$Dn+ijVub4YV?e=kAREm8:mX@!jH%&&y%q=GmqR<tGACp&i
NZwyn> Fn8k5bS4ZnLP4MnAnNV:cX*8lq6ihaP%nFG4\K+D+:nHe*ql#QuMtehZ+HJDEwYdqJANE?JZiNjhay6V
=C5QVG >@:^yR&SFdw*L!RpE\GCI@dt:XJ:/bp@P<R=?MR@MpuT<$qlF4b*6R66!YaZWR1uy4F1T:a@<atI#^!8
*4&aYR FI@m#hLbJYH@9>n://m+%nbjF+aAlXWX:mRl8E5bE5NhCuh*h\pllCCF8\aI\X$K%^De*TFACP+PIaSp
A!ZnBB jc6:9>&uV:<4y#N/:V*&N<:b@<&MeM&cXN$#8i6/j9N?qA$CX\ub>6>bmjJS^lwZT=kD8HlC9kl\Nn=Y
&Li?RT Y%S1$Qlnyw+*i>STjSa==u8bYKVI?5ZS!jmyXcW&EdEW:^P#YwjT8Yh&mHu?<&ECRKTd&\q!&$XdWMW:
iH&ER4 lS6aC%DbD>:eT+m@KKDSRJ@HtFy=8mJuBu*NFi9tTEhq@@C:i9C?tnEdQKI*k%VlNM5it4AhGStP!FIB
hW+LE8 LlnJb:*dd!udJ$+?e51PCDDA5NLbwS<lJC+lTB5y>Bnudm1$K@N9bD%nwlLe>!wV:RN6^RZa*:w5aITF
@u1$Nk yP1umXEM!wcWXuHW%V^N8W:^wa+YZ=*cMMJ4MlRhtd+@9+TJqN\<HptnCuA51Mj9t4LG:9nIhZp!<WJn
mh:&KA AC55ChG%%XFd1GMHYiNl*FLDVl8iGH&laKiNJSMt^EY^tYnG8tR!FVP$diI=eWFWulMXiIBWT+hnAeA*
pmkyI: H!K$H\APu<\K9YI6+p?PZDh!mAt8:plhtBY?mSqXyamnAau\LmpZ>QHcZuu\nqweiX61jDKHEqyiQ$Zk
1K*K$1 \XR8?yWd&BIGT#QWid?:*d4ijE=$@!V5#1k11I9c^ci$Xe\ii9T!\hNT>M9nBnE#p&EXh%t#YpKdBl/B
D9<h51 4:W5CVHV$\M1&:nTXQp==mkVBKV/laT%Jmm?MMhKZh=^>uwCEkS5yNRtRMSXEE^BJPR/*Hm#b*dbyG#Q
AL5#Wk EX5MZd8<alq>cYh9%!b1=Hh1*D1V&Qi6\@#tDVVhcpDun5\<=*KY+Y\p4wJTYJuFWm>hVHbIZF=4b\ZK
\L$H5X dQ9D#I4Y6l+eY@*Wd6@bCuq+SPD@+mmL^!^w5mj?YN8D&t*C\tY1tjd4VleR+wny%YSZ6MP<5^*w/LMd
=L<uF> 8L@h@^Nba!$pb:Th+QB8R@Dl8aN9j*M?!KVeDXjNPn!uCTlu>e4jaeFmpu/p9>PC^^nIQYp=+KdD/:Bq
@Y$A5^ Qa>JDVm@Ve+q=ek=\aCj:YXFE:\pF5#k9Ke%al@E$B*CRq&!Z&PwukYIY5*:y5!SIF6c@yIF:&i&qh?A
aBuHK= @H&JBhu1@u=@^$i+n8+=b>\!yXutBS<BlN!nRyCTT><ED@<kniCk!lFL/$aA%jyn9K^YATiyNA\XLuWk
LpEpp! Dtp=5M$NV>:q@IBG5Dl@<Lqc5Z6DkV5hMdD^yaG1kLLn5QmKeApa1%1PCZc4!6&KAEuK99LLHm+pTY\/
1:JEI^ i^?ay$@4t1<j?//=S11Fu%e9aLlJ@p$D$!KwwIRmyW4T=XukhqnCJ?qtF>qkX6y*ZLR?mVXYZ:tBnjeV
8&J%Rl JM>XFy$5w>\hDy/LIH4Vw^dkTWihhH<+Kj8i+cPNIKeZJ>P&ZnAL8b85YXaL4X##E:t8yDcX5WPLn6KA
\$=%*R +HBCC/j*$C^AA@qF/lN#m/?>:9P1MkbHh:BmJT=:II>n:+a<*cXnVJa%j%THDV=dp%69?5=H+HJtK*bi
M:VB#? SD&/NK9R?#8^pBLk8M%Iu/YeSA!NDm^IHA8H9w/Sl/LLK/eISuRW*@4Vb\@8%\$MbL!Ptl/T>:ZtP5<6
<?1Q&8 ^?nI@lV<p4&EaSewbDy/tQ=m9!^RZmtwXlJiP#Ri/VZKtXbwVyMl5CH=/e8n@B?%qE86\u9h^H=bwXiq
Xdh%S! ?H=9J@>k94TbDKM1\6&S$de#Y%<%wm*iQuwl%=Mi8*nt!iDpT1w<>NRRe%4uyW&w\X=YpiwJWp=^+weV
QqW1XY GJYqMZpy:?VXZyBRWD1SSbTeWXh*S>P^k@1Ma^lTPIA@S$E<w*Cl+PkL8qZBP9#DPM&*4duKJF#*=hWj
&=LDS: K/tN!R#DI6PnTRVA1uXyHCyl\PJ::&FlZdLA:JqQE%49YQR6Y!q/#J$#n!=QlN\YpBd:\Dq<9$N/m#t=
&Hcd*6 bG<65$KA\B\p^>Lh^49:!^&BW?1+yjb<8t+Jdc@&!?\l+H!$Z91CN9m>D\Y$RMBkju6QbMI4mcW5VZ>X
SN5Sy* @wF1<1cXXI<!9$W?#:Pa8#:*nSRLAyNl8hSRp^ScHD^9w4hQ/1a!XTGLq1AV$<HG%eaGMHq1a%dn@8bB
CtqqT= !twy<FPX6Y/PdY%F:ea9A6j@$QV@&^LZj:/?$H>9iREm<M@LC^D?*%=iEQm4Eiy@Z5$@?jb@ZPF9LDD<
4&t1wP iXL?*/ES9/IFjwPGC\4?kwd<Bk%D@GKyRAD/G#V$X:yjAQa:>F?Qj9tVl9<G@i9XAkHE::#ykwlj$IK@
44e8<> >bHBjpEL@Rd>!/WKkj<$S@:j&j?H=ad@K^j<4?5NWMlj4DhA@tKYQE\RL9l@W5L@<&jJw$D@c&dJ:>>Y
TJ$L8K 9At#T\DaZ+J+FGIQCPIANR9YtAS^nJuF#^WV8+LFPAQ%AY<Wd!wwG<*n>med#hPGlB9PJ41&G%&=bG6D
!9E^h+ :8ZjjP+L>$HCEcdBciSV!CQmThWbl@P>ELI4VI=&Pd9nB1b\5p6mnjIJ5@?SIS+&VVLHLKq@#D/MI54j
4<Mnql HR@n*:ZdcuAnK=!LBl*hJ$aykFky//bwu%I5iPp4pZh6/G9RVYpXBFA8Zm#wLaPT+AuLICcZ\#*W>WwY
YW$%h/ \8C4W6S5I=lJq4bjA/hyduB$JY4qp+VT=nRw!MJ9Ty<!=Q*48mMFPeaFmKdY11w*5eM!mKVk@W9h<@5u
5BB:jG \T8uAc4pu/JZ/K\dJn/ep+Pdb6?@G6ST5QY1P<1/:@Fy6Qi\hFM4<k%T>N?H%k8Wh@$\DMF1LX\!t&kV
pGw&&K y&/I4yYqF9V!+FQp1<8k5LF#hMy9&ScWHT@ZdbTcYnVphc1BYmu6q<Y&iKVAhWW\FV*&=J#1t?n4/?dw
mlW:/V E&W1NFpK6!mqT^\d#RPG%pRT4GA4S<VhH8S!hJ>5Z\1cn\5EmS<h5XSNmZqnL/619bRcMCR@HtWZeaV=
an/:!c LaQy4m9tnA*<8=6e<<Dp9jBGEjXQi$j=%*QV^$QEuDn1Ic:C6dYX#/WQ9L/?DlH@T8^<H/me+iwhTnIL
\iPhEb Mq/at6iaR5R:<A*6$!i@DhNQ@1Qm9yP98Rch>ne5&^eAaYmS<W>lTVju%ZWSE?iC*Th5Q&5\e#@KDZ4K
pXw4nQ FW%4dK*=5M8Nl!9TYtZXjB:i5Hj\tBdX$85$Tj<IXppn=*YZhj4e>VCAIeiiy>9tS9M:FtjyV!J8FMHZ
l8KZD< #?d4F1B&WuE1uh59RV#GKwjpnFw?=:TeiqBu&Dl1?mXY?EYytqkIM\L9QiBN:yuR\XNZ/8Ree1M*n=\I
h#mmGi B4bcN=RwJku9bLpCFn8aNEDIXupehDlDCbQFTZj8CeDGd^JT^^!!iP>MF1RF@:k6H4QB4B%b&QA+4:nB
Ed8Sja Z6>5D:S#D$IQC!Y*5B*YHm=W!An4CytQj+bIpE4:ILV$HVQyydAL\#Vd>1Enujy1>DqEQX<w=l#JTcDy
!AI8FQ !wPLK*94^J#*Tyd9G%yKM=^8>m:uVd#nWYDT5@6VpA#lmYy<dw:kuP*ce6j1*bXRt=Q:tQEXKw+B\mGD
:>qn8A ZeC*VVDuCp/Zbw=GcQV*ZPV?HX5?8ie>P8HccHYVyhG9:N%/ZSDEh6$/%+ZcVZ/dlG*jm5e:/!tQyGR\
!GmBI5 InHhbWS+!6=w^D1L>Ae44%jn<\RwD!C!RFTS\=uWetQMZQ=8pni8c:p#9\Jl%ij#LEnShe>6DNa=Y%VC
6w+LaD @NN^qN@WNjcNcH5^yDiDM^VY&bXX$WT?9nQBDte*w8H</11AKZ>5AWmDw#Vpd/*nNiGquFRmk?elP$ym
9VdnA8 BR/$&itqXjBHImII#h^5Rh^=BcX%yXLCpYZ%$yFE<FP&XQdiHMtB99\<lVePyCCKVAq6%TR!4%K%h\<S
lyi4V* ?CIn>6!QI>lIduSh81nu/ndXAuItwj>InT8Be59T%c!:tLkh+$i9/hDLVZqwJ:jCTw=bPt<C#wm6/PPT
%<hjQa 1L=9iH&n=F=Yc#M4ZdPJHMl8$5RS^GIXVu=uClthKcHhD4@Y\y!PBKcWN5?MApAV96m:EH4$Icdm:XwZ
VZ+#9w *>N/6/mw8W!C+94q?#N/&&5RjTabXZLQSljy4JZ:*qHnYq?i<qZk=?yA*KaaC*Vq+qjpA>M6ab<!T+IL
*hyVbi S&h+BkMe>6^dAiVVSMJMmnSBuB!tl*dNHBTNVNp9/8RIt?9=mtnCZD%^%YT@ie#S9heFCiVt1Z<tqk>E
kbqB+= Jk1$FZNFiAnY5/^knc+1C*8?81<JiKnR#T9m\5*n5X=1RI?Fb#c5<JGq?Aq*^Gpluh!LI8bMKYa:B>It
d=4X=S t&9cR44HlZqJ$Gkyt5XK$R$=>#M6:!Giu8ZS^5BnKqbTd^&=EQ+dm=5k\ucp58VM%EaeAbTTFJmNu1ZX
6&!Wp1 ^>meJ+bYFa/YNR5?/e:^I!4tlXm%K\ai1P=c8#%K&tmJckqPT9E54!V=44:juq?!wTAa6d4VKyn>1S91
=*CG:? Q>YkLMjipG!TGKqSj?Sc$cuDH#4cZAh$KdlTJqQe$k#GCM6\jbSZTA+ehaAIQ\/@:qE*jjV8^n\w4ELS
Y+Ym:W npQ%\@8/=/9>yJ@wk%#d#aB:@my^=IcGS@mXj5^kjhiX*q%bh>jHT/F<5<4QF?S\t$L!Eh6jCHc?ad15
AMFKpA uV1Gj51e//E?D/=@mB%+l85tSqu\W5CNbk5Td5JW8JlyPRXEj#4*jn=\I1kG4B9$+^q54Z8K>iL+8MTR
\Lh+\u pijmWGlKDdIHNtnH:pNR^^VSw!eTnNp/#S%S$WiPKl?5JC$N^n5KiQ&*a/%JM%cPMD+u^#4K!:pmjk\n
MC8cBW $JmclX4Q@XCZd/VVDGA%BuT1C>jX>%6i>54HM?E?/dt9ji&$yGJN&Ek:N\6Q@tEKRB&HenDE4EbWFun9
y%LIt9 pGSw/DS$p#?y\Yq?/6E\P6FDJ#?bZ$?cwGE5>@!#TtQM>5b$!bJJVPG%Z$Ie4XdGpq\S>Aj&%&4Q:+Ey
LG5Vhh nwhjA#<i*Ba6*d:d+>l:JXXVNd!8^m##YGSi!PcVW1>hj>?aC&Hm=A8*XkR8*m=Dey+qJ??HwjepX@IX
PD=haV H=Du:ty&wZe?IbSiNy5BIbS*@R+il\%5R*=EPLt>*De@LiuhYP<pTnStn8^Gbcde?Ed9YdQ?JPb&5*dw
Z=bw8* :%dEb%DVQmkFlP!4Pq!:F9D4enGPu\R5IGELM1kklT#uQ1?PE&4I?nF/A9CS6ccp$5kwPK%Z:qy:<^wy
K\u/Kw Z%lnj%#JuAdGJc<i*y<I<pXE6CNm+<4qj/1YbkE:D9BhWp4#QY^qikqS>Mhl1+d<A/eK6wS:c=FXycjT
XG>cF$ 6eAiEWBQLHciV!FI1=S@FJ?N&bB@#baHL+ub!$@iyScaT4\bh!h15mNJD!#!&!#MYtGl9idGREVKh^\w
:ZmQah 5\XtS#IlPk6e6BYAG\WJqTFbW8W\m$JTKap\Q/p+ZaW%QbdM:KDAH&ZymB$Gk*/%>wl<K+BPY&mj:ytQ
uVS@yX @T=KubWY%L5KPQ1bBekc*LyQKcB5yWlkEu9Jti@l*?$FR8qTVSD+Y\>b1ac%EG:RkwMNXdn>dWR?T8PJ
TBna@h FJ//XwutY#X=VJ4X>jq%TkiS:TTJKWw9PT&a:uVNqNWF<lLu1bS&&4MK>@yLFW&FqK#1B:nA?m:>yE?d
pLTSj? V$RhTMpQ%PlqqI$p#j*AXlw&4H1uiBC\Dc6:Z8HGbla+jA1HKI+9u?>lwa&IjT#DwJ<\kb6u$dI\+eS5
-A&4Cl 000841bb657001202b3 Page 458 of binaries1.zip
d/tTBC nZThM!<PAV6A+lZVqu?M$yME^<?QAq#i&?Vck^YaN=Val=dY\uA=:QtZGjdaIa@b<QJZeetaV>d%>+LX
tYhV+\ %LRjH1&RSG&uFqC/SHVnBWS>/!i&#B<TnKP?hF+Dk%KtdXb:1&/M4J>NlDI/8IlGd#G@=FEL*mu6Hcuy
dd$<li ptHm:@cbPKDQq4w9aDqXYy*mYkF&+<@la&@=SBDLH^F>u^*mbQXp95nGnHBbQ+T=8Y9kd5eJiM4:uaX?
t=LCFI kcQlVCatFi9bYBG6<@nRkqKK=:p8u&ZK<ml%q@RQaDVyNi9%?!$m@5I:+Ny?5:5&L<a\bJREVuVu=Wb?
yHb1j< qS@$mE%6kw*?n>LZjCP*?5:u$#m4Wi1MQ<1YM$#Y9Idci1iYbPRHQQyb*cAP<4t:tlIIumA6kXFJB9H<
QhT/P8 ?mBPdWIC5cGB*W%^C!pGP<huJkpayy5&%VmWSl%Y5/\?9JbT#@P@QN<!an5p6RFTl<QAL\bG#LDQ\daR
eA9&?w &jEZIJaANYXkV9ua^i=1acn@P=k?6aJ$IaDh6DR+ynKbWE/PA@k#W5QkP*58PQK=LKF+WV>4e4CYL%+N
!HYN/c inPyPDLAH=<k+4V&AY:N+Na*Ya\8Fd8JYEqipY+qSuM^/TKNKQIi\W&%iLb6iN&1m%%:tC5N8TR>TPAN
@#n:kG l8$FRb?P6<$!<mDkqbYJKSdTFL!R*dip/qIDKPiVphyB&nuXtX^R^eh>6Q4ClBIpQMkZ=ACdhi5%amp*
@D#Rl@ &JlVpc#4^Che%nQwX&iwe/nCcm#yB!I?qFX1#\VBC%W$1*&AWhh^X#bC5V*l$uHb&#V<6hE!6wVm64hJ
ee9W*8 c=j^TmLmc=e%mlpKJjKHjbVmi^BRCXSPkW@KXqAJNqa^L5bFKB%ddc8AA++P>Rhh/qVm$5ukp<kN1CK^
:i<iLm dQXC<=5PNFbGWpC:XWcE9QaW=epRa+F\FiZKbH%<=jmL6E8a$Xw?m$4Sq?j<*k@Fu>qmDFLk4I@HLQ#A
?QFZyV LRT^HW=Nc#Jeuh6jm>dJVFq1q8<4Mye#b1u!tIDI4/Tt>\Nua@TDQeXKSMiDSW\K$acK+a?G\@p*6LT*
X!MZ?k ^1pdNG%\MLFayj6ImuX\y%1!udT*L\XJQ6qJPLPRM!N5kDAWSy$Xe:VMqE/inLCC##VSd9TGLaau&pAh
GPGC9q dMmp%8<AQHN*%b^ED1TkBX$?$ph8cTB4qkZRybwkiyclSm6CT9iS=yTSltS%$&Gd>qtL4Y8>JQ=\PmuK
9FbVWc PWqNq+EV>bFl!pcR1%hC?yZ8+:$%!+RqYEjeHIWa5cVlI+bqe=Jl5#Mj1?yAiDXEQl+lJn+tFm?c1pL@
=X%CkC w1NGhmJiTT5lR=4/i!u+a<1p?nDn:wGEncwyL#H:dR1>?QamW=DNnYMJDuq8eZGb4+y@6ZVc8ZNdqFYc
SWmW+c LBtZ%Q\dX=TlEt8uNI41BbFYW9t#IAhtwC&j1k\6T6V?eRTq9WN/VkATj/:9G8<ni==$+n^cd*JQpy91
hL4G?i IjC?bIFQ$6w&&HMJcA8X\$>@$<8maDtNHVy6Kuh9R+iKLFL#Vc<4TZ?tS=+6V1tjc<1>@aLN:t&E+ZEb
CW:\\6 cTHRWEkuqFXj@K8G!R:<BT655YD:p=^KKF8ZN:bHe@<8DHDGTIB4Pu#l#^L9m9QPA59Fj5NY5MkjwjSh
9lC1/d 4GNeNe>XlD9!pTT9$Jb@w$QMPLSN$CK86!!tu/LT#@amPt*$miAGI14WcPTqE+9>t@kV$dkZ*uuQ9T>c
EhQAJ/ +5c8@IJT@dSnbSu59nimayX+yAwFZ$H59E?m@d!Q=ZT/D4e6E+X=9$ZN9G*R5QjRGE?h$8/VZB5Z/y*<
b>5pAk yMT!@Ru\YX/%et4*>uCpyduD!y@Gd9ZEut/H:tZJek*uh#@6/1i5d*%b&HT+6NAh&!4Ph6&TAeW^:A$S
&19\i! yncJ9WVpXEwP?kt&l=?K%+ThRIwqc<:aHmI>9BiT9Hn!iY@uc>::cN9LKYDk:*lKT$dc5Yb?K<%RWu?N
W/C8wG e!w8Q+QaT<ni$Q6TNyTA>>PF@jG:6KIIwXwmLN?a!A/y?Nk5R1>qXwEeI4?n1V@89%n*%Dli5l#YmN^!
#/nIj^ @mym^w*Lkn:KtH6H+HajJKMGB>Hm5k^a!4S18YBlFqD1/>qWKqlyYpQ<jdXecqVCyN/:hp\%H8K%RT#$
ILiCqw QM&yWMwB%qXci4+5Ch*SEe5Yi=6?$41a<btcQm=N4u4c&$+AuGqXXkb:Xl%HNVF/4t:#\VYRwLuuWL+<
+T$&9T $mPX=6/TI/X4<=M8edM8ZhG9n1&l1cF?$1I!TQ*ReHE#X&^:b?jZ8w!S=NWyuJHw9JSd=\&d9ce%u#Dn
eIbVF\ 4^?TALdmT1bp5$@iEnt>SBC:NqM>$u@t?Q%?RP*wT>H?%Bh<NY>heaV>BGpC9qa=kh?G!R4tk:*6Ebi!
6SMYj* T>aK+6#/$8hNNXjjtc=&A1XqtDG/<k5hqaw#*c\EtCq?9n/+#=j:9ilpYd?d+6$&8EbDiTVPmA>>@GN&
Ea>IKR 1bG<Yn^5WKut!hFE8a88qj=GTuXC/ctGKThP6y4tTCnp\W@EcSbFmW+<TXlI5^%<Jam:+VZ::Meb9^w=
5qnRP: ^<4m^Dn6V66F+LJkV@KAe4a?<?$u5/V9%w%Dc=^X*>1$:kH5=NB$d6@yjEc?ShL%Bnl?R=4Ml/itLq#$
pT$JSN Cq*TjE\+yXEG694yR86K95T@+G6mIQ>XPQ+j/9j@Q>L^j%:Mj#t4ZIAjC9<LkR&F@dQAlpJ@Y&D@\@#>
tCj6X* b/eI?R8SC@uumiY@$MAR&P@Rk4?m+d>D<@>CA$MR9$HD+L>/deHjwKGRZ:&&$G@R9%dREPHj\H?ykcH<
/cNCtP j+5Y?K&QVPkZNPR@K&kI=L>Y$ALC@$FB\@u@RpFDwZ?lwIZ?4PZ@d$Vih%H@4+m<=?>4WL+b=qeQmEX%
kLK1Yq Fn6RKTJ4t11ia4d$%PDeT#68C<HCW+8Fp1T9RyWh/An1i8QaXiuq5hJ9cj<qy#=cE>P%?ykH>JL\PS>t
u*dT5Y +KHItF1\VnQ1#RAT$W?Y9TRaw%lZulE&?D<t4DjECIZ>!+V%WlPDieYJuwdQTmTd</TDudL&:JQ%?>5$
lGE1L^ $?w??pyAGAZ@B#/mNGVZ6BKiHuXqR?AMiX&%Jh\SB&VkQ%1XtP<!P9pt?4X4CQtHWRtwS6\cyCw!5+ee
iW:+S^ PH99qlb6b1M&@&j@EY/Me<>9nTMp<nBT1M>nGm1y:PGm4mVhWQtk!<!db=!t@9DHM1RtSZVQc@EtjbN/
^T=jMY wmFS4&XS%b%:jw6:#XLPpPTTuS\wywC4m9mQI>XZTCRn8TlH6d>GE\yd11i9<kL$I8EyTAj1dSFqlY5b
j!DYy@ F&Xj9VPCEF1p16nVN/KGa9Z4yJQmMW%b#^Z=9bVL+qACZ18H@Pd66WqPD1PETQQ9*K:m1*#tFMI4GTGL
NJSFSW *ah=pljQR&A<yD@X9S5/SiF%:H&Cjj1AH^+%\1GM=EVW5Nki>#5//V1yV=?EGmjQ*PaGeWAkcS!CN%wl
c/T!?G LjQ&:N9D/9yM8I$Xb:&9cih@E15GL4=<<GqW&YQ?@k6ak*1%<YiNtc<m@J\Q6W>AG&tju@CWd\paS@\A
4DBa:C :+=i&:@cWJIn>Q6<+66b<J1lS5CdkEdhmAG=Ed<SJ#&<FX+jl@^1NPZ?Kua4qYb6?*LWNkn@pER5ZSQ*
i>%FN# *lylH\:?l$?6KeG?>*jbXXEjGqLlDZSJYApihy4QwS4bEhPLC==dddNJpAMCnW>=wZmHLTkjF^w/pYqe
?F\8Qh AuJPG1y<C!*jId&\btqJ^y>/FDePIcCK&b:N#SZhuGnhL&la>R$YTG#aV<<bXCVKRlC6!&RPaTQ^=Ta>
/wT/*G @V\THlTNi@@m5W#lteLiduTbcnAQuNqEK#*EJ:/Gn@KGIa+5\!9cnXQk++$4cSS6kEZI:BMYQJ*<II?A
9Wi$>p /EiF>#Pp*a:9V^BI+4RRF*9/&/=iJ1lL1*=HY+<5Gm$V^yiu$dbSHDe1Sk/tjJuTqElVww&9TR?8LnkR
e1X%X# <MF>cL!ipByQm=Y/EM8pT?5LaZWRT8q>#V@DqRdwA+5?:%q9mXyKlW@ku%D%P:&lWC5T6KmHJHt>\S&+
&/FC<Q bXKKl#>@Y59//R5#N:LW+F4cSY&EJ8E\BDtq\8LtWlL?=btmQTp^8i%1SXE!MZn#Wi&>8GLcmC<L:A\#
K^EZqi c/pR!hiEICIqnE/+K8pRSbD<+/lIaZtX*uC?XHId1C%DT@p$w9FNVwbc6TSCZXcR*kyLqdjM>!%/Ic8R
b4J$Xw &hVZ/FBABFenLM*+^nN$NH6E4anTjlG8YKR1updVYG=eem:=ZG%6V6Q6b/=a&aS!$8%dN4X6+$>?k1wM
D&W*C& I/Q#XD>n%CP>?VySbW!lV1wyd\@aHZ=p=\SKDn+mlL@lKy<wW1C%t8!FI>*\S4X>$JuJ6=KA$l<h8Y@J
HR+NAl MPJ9E^^RdTQy!L=6696y\hI&nW5FD<uXM!8$4#ptiJ94<m6<=+*p:+c%GwyW%:9C:cCI^8b8tNWSV$i<
kI/=/: :I<Bhc*5tdVHX&X#YkQDG+JPm1B8$QHwD&:KyjiXw==GjinSpq:$q6+Q\i^<SmIh5?Z^Ji=S!/6X/iIL
#Xm\Ki kJXiQmTM#a!St^4Ve@uqqhV<WucRyPH>V=EI9d%Jq@T4NyBCGV!D/@kdB$QZJ%&yap8m/A#1\59=FhJ8
MBa8C@ PB!#9Fm:*GX>nA#?%XKP8yjqSVXbMqV&AMSGbVXQqd#qGWFH4IhlHY^I8<?#@Yy8yNbaPQ@HWd+qccIm
G#C##B kD=H\am4>5L8\Z^I?wGCcX4MKY8>!JLBJ^c*\Nkw%=hqF+SJ@Qp*dkRKZQ%%G/^9k*9X^MIkH=dSCdcw
kwSiuL S+>JIiNMuwBDhK+5jQjwRbZj5eq=yKuS%w#IN8itlaK@&?BaP/F%%Kj$XFVp!>*tltG&D:u8I9NqXJZI
#DBu+j ^#WqjlJyqtbn+wY!IaY:nCSX?5uuidV$h*YhNRNk#E/uy@Z?Z>Y\*nTTdupbI&VCC<awjRJY^+S&ubK&
nZX@q> $D!i^aQYen^8*>B$bGaeQ^pG?XXJ#Q4GMnMMtSt*X96%^Cw?AWPWKN9KmA91L%AX=>?GB!bA&^R?5\L5
?*%M4F 6CQq*p$NhiQSQBcDKTH\BNJ&ijRSCaKZk8D/mE\YB:Qm=cL$WE=uuydNWXIcNR9B#wmy5@*^@RZhu^KB
8y<WIC T:Z8*bFE8NJG!y<5DTke4F+bF\WiWGX@16\wA+8JA6bZdwbeN=$paI<X5wA6tEFY4e>DF:>ctY\Xt9n\
@FyHw? q9!wc#tdMu!Xp9Dp^hC1W!RNHbh%WA$1Q4E<uaIBbbXYQMuS\WHeenk4b8V1M*1hR6#!/cN:8y5\1+nH
%jT^jp 48%Xi^Dp1c==!@hK84j<k86e!lp>yRj*Yn*uuq^&!kD<n%ai/H*XcRhbj+5=GqBe<D^=Wp<u>FE<X/#c
q\TCd1 GjT1j$L>&:$YDaBMLP>M?#i16JhQXlK8#4\H6A<VF:tjum1>?RmW9\MP9^NB<DdBY>!TYZwycZu>qL&j
LNATRL anp@BKJqSn86*knj6F%dp!j@aW1TpK<R@PMMTFIFjl>=ccu^+/dqH1@PmHGu5ZCh%W&89\^qIt#uC6l*
XbaF6G aGh%BP5ID15MRRD=<Ybm!AEaJwPS/>G+p4*Hm6GnDKuaB5%4Vtati1:AGhiS4BpXG%:u65>Fwu5FBP9B
HY984i B8=EMdhEl$R<>Be5t?*dt$ntdh:56YFHSG!qtn!&!#4:#jZYch<I8$5=\/VK=Sm^G&S$bJw+HNCna?5w
\@NY6q Q5uD:%FpM/4\Fa<lY%+1W&:V*=c9^bZ:dy&*L?l+yJ%l&b@9kbGEMW+5+#Zu<6Qw8:PI+/+^aQLYN5lp
j>&XL% /ymNwN^qI41Aj+tqS+hl?Y^e=MSpTnYKqhemuT@1?HWXk%y?^H64amL?<#Q?*hQe$^LpbuCSlW8&R+hh
lB!DcB qlu+E/nHpp^!X<cTwAnL!Kn!?84i1p1Xa1Q$WKqFD5W+<QWY=\1c@AcAC8dN&k$Di$wQyC4w:h4:<y\+
-A\6q* 0007a1cb7fd001202b3 Page 459 of binaries1.zip
ZtllY? AaKM>t#ip@TV:+BjWaNSGe4!pdn:htM&/1:F:ZJA%=%V4$nqk>l=8nG$C+6@#AHDRa!!J=9$4ppZPNS5
4ma+RY m%k<pH$tP?!i*ca4Sw<jS*WVe5!pwc#FTGb#%*X>l^C=X+\&Q?*:$D8TXBZ^p!@Pqhu@t%%WS\n&6\*5
\55teu aSD^Pb:hV&qSbTT&!qlQ+kEGS@hES=eQP4j6caS+P*8E#FpL9EmK5F59PV@me>?yMlQBW=TP$4c!y>64
tkNBie N1hLtYQ8Zba?hY:KARe4jpiS9MBDF>=AQ$nKR4dD?&+>hXtaR$^kK/iS@X:DmpCT=XSy8:!Sc@hC$1GX
cYN68J L6D1YwZAH6LNNhd\GCh8IAmkRnVL/VbTc#8\6l**B8IV4ic&H4VAd/LLn\#peS6d1A^mG*uNAit\m#bT
FV=&%J ql9D/@h=J:@LXPn:dp1DYhI@tGHd*=baVuLjc#PBw?8JtMI>/#I<d?hk:aBShlYVtRk\t=p9a@jeBtNa
M?A$kw #nTCb%SbKjI/X81u@#a/4I>?mVXZSn+KtN*qWmwd!dwih?<AJ>SG4!hMPZVk=Vcp*<KQ&ZF8:h=6Y1Kw
h#?FeH MyP!iAEljJ6XQ=S@#TcJ!dIThRRFK$GWa=%myjZ<wR8Pl?C&Zb*pW&yZHk#ikmd>jl6Vy^B\+eu#mtGm
\YE/ZB 4qAM&W^#&jjCbLLYmT:Y>6nYW&4iql1DiSD64ZS@LQFpp!/b1Vl@>qI:@k<<Sje/Yjk:mDj>!$jPmRuc
jY1JDk 6#Fm66N>YB=AdalZiE#k=S++ld\??$%G@Y&h=:Mk65wXJmML1*RhT@>Yt/F/pui$hT>q>nqj=I+yB>>t
Wt66FE 5y#\H5%Kl<=%FJ*ICK!h+\!bTi/Cp<IX6uAiYdy>CZu^RMAjQLpPh6&kCj/PI>DnC8a9eK44H!6+WJ%j
C>J8^K H&j!GM6Ib@4eK?pcB&Q&+Zcqp&5wNWt\p&8jX*#Dq::hY^pTuAC4nKlcY6a$!&ElX%^Nl6Bb1t$qhT9m
M59ndd u/Lh%Jhq!ACp5T#YA+c?Zi68Pq+HcNIC?ySiKcBT>VnmYtEd6Hd!%JG^CuDyaR=StR$L&MWIVnIyH4>R
BPKl*> 9:i6P/cqF^1nZt:p%yeimb9GdtHA#:>HKn8qW5/1Mpc5pemb\<nNFJ!piRH#6q%9b%lVK=V95^%WJ&QN
m!=mB1 IdQDqKkWM9MWXNeJl4hE5YhbEyNYD%#\cBam5><Ke*M\A@y<A6#kc@q@PHC/pTeWp?bkeA=ad5EIK4>!
nLiMkh cjFQ158K=\@kaq&IJ&1KH/^kFw5VB1mc=6<STAXb+BARB1lJ8#m<*%\Q:hAd#S/cD>Mc/@unH9ajBFIu
jJCbVE yB8+?Ce&*@m\>b#pc<K?+aKKyTa1?Y$m\ekuFn^^Spnt&J/j4<pikdH+ki^?W<nHywe%J*#hyq6DB<:J
4Zu^V5 &CAe<Mk&5KC9X5BLKcDdJm+i6*w@T6Ib9&B*p<>VADE%h@LSNtX:pppCl!Yb>:wNCl!IBEp+iiM+&ZK^
>GHI@D 5dib1Sndqau&Atw&pX\+mniXZ+q9N5@5&M5iuNw:^ZXma\\:+kRt#i*@Mj?k/IB**9$#T?nwa$Eth&>F
Man:m$ N\w*ulqIP$8*%KWiXAK\HkL:cM%l#$IRRF/kTP+yaZEkEb1LuQ9/pujKEnj4PmVZ#K%YT4D+>Z!BnQId
k8IyGY 1e*hY9H>F/BIZG8\*$E+/#SDLL/u9!b4LA=1t>*wHDebJ>^iTR1\*jBRi1hh*?qc9<P1kYBPb&:\NiiF
cnjCKI M$KjJZ>BX=XW#nX54#k#em\h94h*Z*DVmGZPuu@>NAnNY^CqHER\y<n?Q4deKp:Vj+5\lLPl*h5VL*R6
dDa5=? I9IniH+>llS:WyaMR1!Cl&$\F6w1yTRePC#1*^9e=FKujhwEGLeMbhDLEE4m5jVj@cy*ItAW:hXqRj$<
Dy:ljS *MQaDShwkaD/tG<H<:cF5ub5dwu#1?&**T^9T%H@uF#1>/G\hXLTGBl?$VehK4*5=AqTtal!Q9QjQWcD
D$ySKt mk^8KhkQ+n?Klh>il&E>9Hy?j?mM/l\aKmPnim+6j/+AVWDt1\RG<*V$&P>*5AL4yK?i8NQ/^TnaWR4%
W\beLy qi9e8XymnDD*D@CwS&:Hpb>?=C5\/:<iIFGdXyS9qLFyLNjHAN1##T*FF+Bjh9T>^pF>n:*<I$@HeIV>
\6p?lW 8*A<Q/k&leaK!GqR*&^NL?#ZWZn$hk8i+YBwW1SXhc&B>6LS=yS9=?ycKEA$e*%pI<^k^^J<$i8Q#@dR
MKY>^/ Zan!d5k18NHHZ9CdE=dipEJE+:a$#:j>q8#N%4hj<iJ&M\aMDM&j/@de:SJX%w#YGN4uK=jckR=5XA4=
>tJ<D! ZyZFIu*TGq5IytXE!8^jKNnWelFNtSJcQ#p\h#>*>i=Gq*X<LmDWe46lWT1YaCnewaq/EAMaypFXK?M?
NlVP1Y LCZi$nlY+#qd<AX$QwA@i^>$\W?iwdY&^#ab!ZAq&l/<y*=eVeh\yPGJE?ey=$A!Tp%TiVeT?uCH%Vq$
TInB8& C/u=@It#YnRc8E/KTW%+*YR&upLmD:4h8E?B>el5cBPZSQY\X&&*XlSa1D#=9ZJyWNtVSbXl4*IY8%ac
njCPjZ +lep/C:!ZVN&<uYc<pLNSJiN^yIPa\w+$@W+D$tl1:1ZEuXV%=!?Hh+mIW^uYCuMWjbut%F<G4ZDuS&!
hQtLtJ >cS5#FQGaIj8cZ&@btLbIqWC:YC>!aJ4S*?>jjJ+qFV@%GpD8J<kTW**dibk8?9tLZV8la:#D#WHDK<E
SPMJbW Q1Vn4Bp^Jq=/\B?>/!Y!qtan&L#nQV?9nAt@N4\w^HdAKP#W#9!au*%V@lKDtDVFDaL5PY6Y>1u*<Q88
PSGkGM ?LK&>qI1NhS!JMNt:wj:*QbEmwmlX=Sc</Pi@qqlJMH&X*%eK9Hpk#V>EZ*QFtCSwKt*mXY<:Di9%KBi
IP*aeW R8*+18EiJEeK&bTyXmNPd?AMj*\jh#5Pya*<9VFp\cW/*5>ZYk$#DG6qy<<tBb%GDh:ay4^%ul&dchAH
E*&\Qm =m<T5bJSCmAh?Few?<PK$dNEI!PZ#p\pSE!n&ieZk$/1/:Pp9XuqpwbD#H9wak9<%u^MmX@G51G\@#>!
e#NXi! *FD+Z#68>#@@yGB4+j+jyiPjQ+*+^\Ee?w<DBQ\jB$IC@*ak@I<D+Z@<qRDpH+=eRAD?D%=A/N>H\QBJ
#DY^&e PH9?1$u@9/\/>N>&?@!@Z!um9&un+bB@69F\kh?&<j?RwQ?pX@@CT9@n:jtNPDqW/HjwZ<ZJweK@ReN@
FKZWVM >hw\@6?lwd@\/VCB*/F@NdeGB9pNGmd$K^4/G#RW<19jG@a:NQ?9cQl9$BD+4>+%^G@R9%/FkQ%P5j%!
+\&lN< HRH&P<WGF@nF+B#a:^RdFQcL%+d#@?hXCCnm9%/F?Lj5?:?8RmD?KkkQF@m4IL!\<Q<J\9>QD<L*@C<e
:GtlFC q@&wXJctckJY!@P^uFPWhqk5E=6VNMI6?\hElaAE8^T#FVH&S9G:?CV1dG&HWwYJ8t8t:p&iwuBWH9ZB
Lh+\n+ E<GnSEWStRwG8&tkl1VwZFRiZ6?p9E1CZt6F&L4pD&#!C^k%c9@YnR:kNtFJLY4uKDwE&S8lE\plL1Cj
HZZ*\I qnpdqy!Y1S&=ZpSlT111!bp1Baq!w6E:DIkpHtKSJpytuZ$yLR8jYi=HWw#Li6Dlq@SVw=uup:CIq&/W
Y54$+Q +$\kYl1A6+JcT\nX1!Cc=p:S+%tBS/Ldkk%#DEQdPD#Rq&/wlnL!4acLkT>8ZCpjZ6u4PjcGi86R^ZB=
:Tjwi* jlIElRp%PBaRBc+L#N=>cpl!DGje/FRtYFQu=#Tw1ladK8jEm:Lu@/nqeLM&5<KVhL:S/Eb16EwE!uVQ
yP>yd: $ZT$GXt5?/J+pTYaA4?eqY:M<=bDkbbjt!#^>L$mdNT1SEF/wlqM9wl+Ej1Y:99iV<%yTm$ik!!cSuFV
#P9ku\ &WZ*P9VKCLC5RZcXFwa4q:?mQtddIeDDtuXLcKRRtCV4CI%VhpKG6lHJ$@e@GM5<l>abnI*MHR8Mlwa:
qL:K?> C5t\juJ4AH5Z&Vd=l!w?ble6y4D1nDkSkY:pTSG1/68>I9L?S8d6K+lXH4P!@Cc=X4ajEYT%MuBZ#n%V
@TIRc\ %\*KZit9YND%p*/&uCJ<p&PnVl@#AIScmZ+JKky5Pt%MIZ>=/jZ$bqCI@I*H=>ehZhSb*cyI%u4^y$YF
qqQ<k: /QlQw+1DQHhCcD8uV!?ckFZaV=?!$m=>#q5#^cl*88>6h?>hc:PX$=una/!A$mZ:bETEqDPCYlt68u@1
yLJIn: u@@6TXej6:!cHu5IWj%RSyAnASb?VTnlB@y8jy55Ch>EyBKCu6:6CRG6*w5\&Y%GH1&tPE4<Hy5#^c&e
8&tW>D Dm6:mbeK5Ml/?!y5K:TGCGY+QPkS&Ya18XpR&ypA=$pILJIwnjbRWnZem!*X#&Et#%VZ5RR9^/a8I5?&
NG!4Wj TY&<*kh^@www=qGb*4+\waT=::AyAa/a<lG8wIS$y$VktAIQRwK&pQ81W=:T$B+J=hDch:BWbIGl/tb!
5Tp:mu 4ADGFpn4MEnQSm54\SSJ&c#d5FSkI#Yi\\#>i^!MBnP^BwIQLHeDQp4XD#Qpenm&GQ@<AeYXe8GIt99V
I4*?YD ydCBN#+KJT<SElPt58yPP1M9^yp!LA=kI^C%IPbA8\^#j>$cqH5V&mT5WI$?FJhW<ZERy&XuwJ5%6\:q
?=pbHW l<RmwhX!R5HC6/JaMLiYNS>&eF<y5/y&45hw=/kS=yS?E%Ql:P/Z8m\knXt#8lJ%\Z%?p+w9KeqM5wH=
ij1W#K L#K5ct!y^YH$JNTEiDwCRuMlk+jA>ESbAGyhRXdHYYbLWpLEHw=81u6MaA&TNPu:+m6:1*iS^8&T\QP5
SicPM: yF=w=aFaZZ@=Ec1CZj+hNVKmZdDYC=bZ4EyFdpammFucEm1T4H+@^Q$NCibFaMV6VN+ANFqSR:Dae\m6
PNV:HN SK+Th?p+4BW1l=9\DtGFe@X&86:M1qm9P>M1?qmD@DZjFKh\ttKqLZPjS8LCwTK<PEi$8Lc\m<1CDlHb
#Me&Fj N6e9mI1PIYVWVptj#&PP6Xt8m*i>dl@IpA%^GG&JFC!uuNVH<%%kA+*nAN*w&Z*$Pm%eaEtWH+mj?C#F
mc/L!= PGZm+hSKmcK%jkk+Q#WGnN>uaE1ZhPLbVDTMwunb?6neK\qdyS4T^XdHbK6cXCM1TMkd&J1kL#=/<N^t
^X5^:J tIC5S6<5h8PcBAj$:eqckFQM/ccmjy4hjTa!y>9:RWA+8m?bGTC/:<1ywI9L<5yM15K<+AFFn&!J=/Rh
QiWPJE uLl$@TSi6bG1RwdFm&V$m$eump<6Z<9lyA?bE%q6kwLj%KM:Q\+hQtR\%>6\P&C1$Kp*6J%=\lbQG@HC
i@?TcH y4HCdt*YNp#=WSM+pd1G9mpyJLWXX^L5ccjeAP^$tcLQ+/Cea/hItwcM!eRu1?NLQ<:eN*MV69ZAdLC8
W/:^qP 6YhGZl8cEK?um>$/1BCEKBVJCuE1eY9GuCQbJ*%PbL<$\R&acF4j/iaJqdQ:6JKMGe=!G8N@1dBQebu#
%FjG*E H9?1N<mM#bNh8D<*6XDL#%nB9+ZkXhZLkMK5>GijytJ\nPqNCP^@WP8A8YcdFepNHdN<KXJL%?V6e?St
P9b@%6 !ZbJydlu9LIZuBpp/tCW4B5yWQkWRcG^I4dZT^Ceu8\l!tSDy&c*YnWkHT15FbS=jR\M&lyXP8/C!RGu
YSnJlt AB1TILXC#6S&jEmF=RCNDpQlYPcEG@qpyi:kw\M=B\/a68wI^ZZ#M4QVtmiGni5y4YQ!@y4XDKwl5q6@
?uIn>N ^!lk%>bi^ylTDI&mwRhy+bpBe=LBuJHAFe6GaZ%Fp&W?#&Ju4ehbbwNdF+m^V1?>y!lbeG@@$IP/ne^R
c\!6T< umYmA/l\Kq6Q?VAjY+P:/9VkH$MWPVYC%9eDJ^8=1MuFTkT>XPW>:yR/qTkDELhWtCKDZb6==&G^kyHc
ilp6A% \wcaIuNjJZ1G=hBXT4RZyi6lP&<HZR%6XLj9W4dPDGm^JXDBYXwSp1wQhJaE!X^w:l/%ZS<JYq\km9ai
-AuQGL 000f3d7ba70001202b3 Page 460 of binaries1.zip
iTXTja wNq9KD<<H&CHVc&*CX$Pb=cmNX+iN*GGI1J1mAdVmeeiMSWFYb$Mm&#u*@jFCl4T81HNi/hA6tCB>yLT
HYPLMS E8itnAT#dSHhuGA8?Nl&ZhmT8+L4HA>&Qc*XkGY*td^^HwW>Q&Q/=E^/ZQ9^eI4ADu^V45S+S=H5H*DR
p&ZNDS eaN#Y*%4\pS&kmAu\JmDn*K&/\/ic!@n%&IML?#e:/XALi+H\VGWnqE6A+1FjXFtNj^Cln^%m^YB:<FJ
GwWjG% n6HKm+jy5?P!iwFtZpA#Y%^8wIQHaqVNtKQiHNynKcyq%\!lW>HRP?D&ccKnejBR1:\Au<jjC%nVL@wb
KRid!! bMZk!bM%QkIubC*?I/R+Z*+t>hCnH$ARipR>mK*SLTp:PpRC!Ki9Cc9b&lSmIdL:Yp$Pq\wDA>aL<L6&
&%9XD6 !\:XKw*5eZ!MklS>yWhe!\KBHTMk*qC5CIPpRySEpJ/4VbaiT@4=PLylWByaEIemaSD9Tb>uRTGmuh#5
^P^je+ /hQDV&6&&CnLC=P5te5FAtZmlhC>4Q$he<D5e<e#m@Na6TSHb/!+wT\\:cp>IdGLSie+BuS61X51^SG%
*iA>15 L&eS<<iPTZ\@6$N^@yD1WJ6Dq^Ew!&LC@/LpMJ!+E=<u4dw$WM*i4TE+uGk$HZtRH#\SqmelQS:p$5MN
hAM&>R K/9$LS<8\Xd$/Fc/%?W!AK@EM$H:#bI\\Ib9!^KA1HQc>>m*\?c&IEe<SIXH\qq:WcA/QdhFA:jXh$DT
BMQWc? q*BY$@\IiAG+AQi\&bae:DwEL:5N^<pX:^8KL%FEYT%+l8K\T:/lXpqKajL66Iq/!b:yKuZc/badbK=q
w#S<B! =NdK^aB5HElbC?c8aRpMW>SD<qmA\#=^K6m<Ctc<1dB<cHt1Stl$aSqwT&lmSBwl=^bL#E/QJm19^ZWE
#8Xwn< PCtKletCmh!C4Ml@1IDNl8YSpDpDi/NVFb646+Vi5!cVw6J!A4$lJ1<?J\<XQt$c1T\%P<mqnIaKu$?#
@RmJV/ +>AQInleB65<?B^e!\<tM>1QnAlT<ZMkZPG>CLmPDeZpI>aJ@@N>mEAp/4\?5aaTBWHZHN1I>KSh<SL6
P+p&&p @LVCj6dI@\!QTWJCFNkWmL>Nh:RTpjCbP\XKh+FK#==!Nm#ECRH5NKybpmLny$d/PV>^MHh\/$XQDcn\
jj\#9a +4$I^*#eH%^miXuDyBebmS%SPA\iQlJ%j\b\%wtLVkkB$In6bwF&T$EZ^%EFkYE>=@FSw^IM^=HD9INR
:IIuNW aDABEHyIDHBiVbtij&Tjpn@AWMJNH5T!*+qla=GE%<cYpMK=9IN#Cm>&/C?uHLdFM<mQ1w=pj/*t=$<P
!%HKTe <E!eya5mjDyIJFGGZTd4!eM=lNd\G*HTem+=+<D&R56?WaAB+t!\a^WASub%E49wWA:TawuZ>Hp8K&Sk
W\@KBT 1#HqHPhXiNY/aCk?BnlBVtD&Cb1KMYLI8VeIW+Di1B:4/jlhce#?SZpW\tct9QK>16*RHpE4Dn<E8cHu
\+DKu4 B5k&hNljm?Z$=BA@IKbVH#QcA*!pDDZq+Fh&Je9*yPC$eS=!1h1*$HS\L?LCA+A:PAhWtF<1Z/16TFa!
yy!EcV nm/9au@Rhh^q&yBZ#B>Va1JZMl6T!miGdFC\TyRdaRYWBRi@XtQ>EPRXyyG>ZQ8epTpePn5Zun#YY:dA
Hla9Pw NuW/$DEGL1G9qmyNAR*V&^9y&8dtVN!Yq=S^wjVYp^PiPQF4kBEcIWy/GE/cWnyKPAcdRV$=>=:qYF$D
t8euSi BlQPN%%em9ZY$GVe&?9=qteQ=d4WYFjMK$MSi$qCqM@k#kRPZQRt&R9:ldq86wMWPF<5KabAAXMhR:!t
cdL%*P ZB=V!muL5pI+wIEp<*JapA=5djtQIa^MqnlBApV?GMHi=kWFKq&HhS<StwGSb&9X:Z6<LYKLaY<b6iC+
IHT/bG /&Lm:H4jT@/Dil!cleVCjjI=wpF<M%bpk:<PV</TTC%EJhtw8=DN11iXn@5cYu\>NPVE#PN!aTwTYu=G
4V#Zky lbE9/uaX=9Kmhta$aN1cc<<F=^k&#!/IuY/TjYBJWGW>l5LFZVB^J!kaVZm68JAbe#nQeS4DiiKXn@^T
8LJl?L cilwt^VjX%NREe9B+G+jMaTRnALN$:kWQlGmMuZD:+1^PnVJ4lF^n<p:W*HCn=A^n*YYE>JC4Y+u<1a\
te+VAI y:PNX%6^>$L\D^6GFtC11^MHhw=XLMKSkXq!Ni>/1<W+#Hcm6P4*11nP1AQt^*4&&%iHb:/W^Ln%kk%\
JWkF6F +k#t5Y61NVHk=w=:WSdc/$9a*J$EeTEETdCylA<aR=+HqFG&Jk6jASt1a1@&KwHc:hiN58mTkdnW=5i5
56pNNF uqb!b1mB$5lIG$HeWWqYV4SG6LSF\69LdhBqk:BNKhnn%HLIcabL6Mn<8hVFtl$u<t1:P\lR+Cmq<KR:
$iT1?R XhtDV#TmLp&1Sq4t!iCMM/kS<CY*YSFFG=p$K$c?Y/dS%4FRk::pRKa<mIF8lVGquC<ej&5p4:C1nE#:
t+=K*j /GKdG:*Rpq<dcFw!G+<VKWGm=h=LGbq<<&Y+A/&^Lc9SFF:*TIwLhtJqebL*dA:9P%@ncTl=i>VYpYV9
lVQBXy JR4S4G!QI!?1GpV?Mc^PMK#aS!<l#aCk:5%Mm9Q?wuqB?*jdyHec#uFcn<YbZKN:m*n5&tK&D4MS1#Id
Fn6dEF ZyXNDq$?LwlNHpth@I<c#B<$Cm8u4mQD91Rj+NqejyAjJp#%WQ5?KMm1w+YR&e#<Fnac^n&B9=dP^9M1
!LWu@\ PMWY5CAZLy:AyM>Aalt<h@TY#RVI>$PP\!WFPiSwy?VA*b+^m^eZ?8/>dbJD*EH8wQXLVpN:^PM59P#p
&DFEm? pk\H1++LEeHk\S4Q$E6EyB<A&\&j1pVJtm%Z<T$y6u8BjQ85:Ltd4/m5+nL$&=%cC:cDtuD&uqKR9cuq
8#AHE/ $jHNnR!uuYF?k@ND!9GT<E!DdS#@<N$MnuES%Y4iQLqe&?y<Y4p*6&ZFDqm</CEdJe#!>P4kFk!*$He1
Dw4L<G e=5G>RE6BHRFJK>JJwdL>>D>VeJ=i&d9NX\+G=pue59eBui!d%?^ZQP\mp/AENWI!kqamTZMXhaL\$mj
B!Gn+L nqqGhXWHpc%V@n$ND#b*@X\uJjkLy==LZ:/c*jVdp\TlpPL+L5W*qJ@1Y6YhGu*Ym1lEdHD\mN<GN:^!
+*pBZA DE/5SIR&9hTDC=DXIa/c6A!=LhE/eMY5q+<ed:+%HF!GuSn!FyVW:y+Dc8b86WRRA@w9W%8k8@iCeHe5
y<wI*= :KmhluhDAGlBRE1C#KwDQ9A%:y^6WW&HwIc??k6yRJKQ$PcHqJ<c/SF@^D+SbKZ%L=AX:$8SDS<AdGQ@
\6N+i9 *I9\nHh6&*<k\=dD>6muIbp*<Hn8uW#kc@^kZQ^Et<$IuTj5c#$a5#LL^i^$L5:X:RVK!dl$wKKIF\D8
l>:b^m %#4t4PwNHwp6wh<k>jJmTZF$wwQkmD1EueJ*I+Q\BF&$qByDn@W+m=B<biEQk*K&iL9M5RnNb*&ebZI#
QNL6V/ qeZGGV+J9+:M\!H@i/i<\KH@VT?Q?I8WQPL*W@KI9$:J\@@C<9=n6iI@y8S@+Yul<N?lj&Y*+anjwPG@
=jP@8< M5^\\h?kwjBjDItBC@$P@e54F@+NG9I4L+@k@\*/%*adIjAdPE#+F*+c<W<=h#n$9#dM@^b6@%jDLCn$
Q6ccLB F+ab<Xe=h\SE?Q<#PZi#@^jp*HHa<Q>HEJ$!V1H+Z+LwPcXCND!Dt:#q^cQuda&T1w^D#GnFlX*!mk*J
aZ%T!D $$=$VySBM%Pu/F\u9*u?=TAP&cGBeFXPHtAEhWR:!XR4Xw\W\PE1%/H5!JF$wcq%QW<ul%/mS&p14l:L
RXyI*h n/14>%JJ+XBwptt4h!w^69PcqqHwkP1?I+SnkwCYBLWWcFXyZk>Qc&WAwVy&+#^=6MqEj*Lt*SnQBpmH
4Bp&kT ZN*b$qlQL<GRtH@5^P#u\NS\d#m>GpKm?yqY1thT@TTy=G9btMPy%V/inYRch^uTt54p>wqm6?8IRKcl
!Z^lS$ S1a#&wFYFdEBXRc$S6%*1:F4yaIu8w$i@iG%1l//!uZJbRD?1mRJ:aeXN^<!t%EihXjK5wSGLEqw:/Gy
ci9EJ# NwDRmnCXRducww45&?naXBk5^nE<J1n!lY^WZyyBP/4Bdq^=#>Hwyb1^:55h9WY8q%kX/@H%Gi>+Y%=X
Fw1umR SNt+>uZH/dcMI5t6/RKQGl?VG4GwlGB%Vaa4*^CVe?Lw/JkHK!9WH>Lc$PCy9y$p@/p*<Lu5wL1@S9k^
y%H1Z1 9MD>ej:y@I/&A6^19I=>n^=?!?NQjyt+wG4uBP$YhEVtXWDqqPm\@Wh4L*/Y!H:Tj*tQe8B4@qE@JAuh
\RCFn< %jGXKX6Zik4Y!@TJ6&t+?nQ!mTHH\5VnD18YtFhT>4S1Zp@y?5/@%wa1LK^icZX8?p&#VacRqB8i<YXT
*DnSm9 +XW1Hh#4/X+qdFaHVqbCeecK!G9uhFX$Py6^YY5jRkd=:b9FP!kZMVM/EMb&:&wl>:b4VVcM6bC/qnWT
Q?AFF> pnMJb1QKET/n?cJ&BWHy%@^&+T8$c<nVKi+H*u#BA=ZV9Bh#<1J<qd$GJTbN\GkHmiB1E498EEc/pS^@
uFn@a\ X8J489^iNAGn<IK$VdNNh#G99YqJFW1^:jyJeeM&?jym8D!tDYZI1W%W:1peL#^HLK^a:@N$mAS&iQjH
D/5?!* T@uJFZi$:lCP&%Mbq%yn>!8@!8V=/u:?dBQ%Bi<a>Bl*p5FqV6tJ*=kShX8@ZqPujMl45E=LC$X=npWi
DtFRK4 FF+=l8#X#tBll6dyS#:XKdie1dXMRtun#Jcph\MwCMW=9NR58pT&jAtWjQ>\4jqmYn/6jL!y*l!QCup@
4Dt1F: <DYY=d$=EwFcCH:i>QQ?nHCGu#\GQd68%\JttJCbP1j/\GLy&X95+qeR%j6BQ1QaP?d4L%nhqGpw\V&5
>tk9eR 6J8lJh8tDZ9VI68bMXtpMWVNlVcGqy<M*E=AXLLYl#id6F=l\C8teW%8Pku<FQWc5!DqdGT:+ZAe9*9W
=%eyV& \Jl8lRkHuD&X+N+L>8cG=P%#=&i8N#ZF%kbje!+T>R=Ra5&FAWhyCj5<y=a=9NcWJ68=X/yqujbXWwV1
/4e@pV 5/Z^Y9L9pJyyV5$c6iw8W6VNCY!XK6Rc4=WnAFTK!b#%yWIebk4^Py^cdj64!Y#&qiK8Cqc6TEcDbMP4
^6!JBt L4\F\dTQtmEt/DhS@BXVu!ltup1nFVk^*yhkI1i:%m&PEM&QI%KYb#w>$jk4R?Z!ehYHcwj8R=8>tyGM
YQnYLn A!R8ZuYi:i$T&kE^q8:mQNj9HCGeVl$#Z\:aHSn4Qp/Fhih>N%eLF:9j4FqJa$V:#y#:T9<68WFDClPN
C9j&j4 >KZDVdqtRwYhS/hPGb^T1WD+?ZFWp+%:k8e1E$G?c8p:MFWTPV\*8QtkT@D>pE=>H%i9LaYiuJy1kY+>
1XTkhe V4\ue<ZQwK$Q:*n$X^5IK*/wD#M&tnR>MVqNcH4H1R<!>AwNaJQ<\+eFPDPCapM=%j6&SJ%StZ!9D/bq
9XC$%H ?inm89>PCQYAjqhBJ^9lY9hSyyjQqaE>DX@ejWy9l<5&n!GW$>G8hZE=uS+:Ta+KPMc>PM:E@?TQ?HBm
L1VV#T 6F:NRa#FZZE1DV<>%%*HjPcM5QIBRpLBq:?%MLF!tJ?Na@\d>p%YdZPQ!hbn1#%kHy%=cp=+uwDcN&4/
+<hb@# =L=kuY4<d$NZ/bb=\+RA195>/%iH5<c\9a:tb+!$!@jmFZ!nyuYiVLRinCjpqXS=>Vq66^dSWDn=Zd1q
&w?!R= hZTXDNZ4Z=ZyN!5JQNFnD*lJI?VTdp@>bP$Kw/e\b?GD%Gn5Ppm@>HJ+6p$5XVLI5KB+Du+YV/yPaI+V
#kaTI% dGHq<YEBI=6NN+$k*4nX9%SPk6np^5ZjlKPKn%d/cSGBV\qY\:P1eXLhCm<6+Al6nZGK4=RJF/%JwahG
<>:Y8X mZ^CL?C$*@D6jWRX+uJ!kcBC8$LDeINZZ#<%@!^k4G<?@pyX/yk>n8Bi<\9$t?uIyRwy%yqG89y$1!+N
-A^:5H 00078b06353001202b3 Page 461 of binaries1.zip
ZVZV/V bd=i:m&=1kPcF/L#B6TP<aF1V/VWZN$qQn#eE&uGTeG<8F@pp<CA&NGKPKN?<JV\9l?9/1P>J^/dPdqm
*=yDVZ DR>\G85Niqne:wA6R8\9u5!nMtT6JmQWk^bq!kYnBaIeQ=1*q\4m5FMLihG$!V9&jY^5AG%SpKRaH+nq
XZk$I9 C#4EPT&86JZ84XRXd@1Q&/&M1WNj/YHqHt#+J\R+?ZdMVpnJBL*$qjV4t@!DZycYR5\XVqK8:kwp4eu$
cita=W ydi$tVLp/Eu^eK!@56D\?uTB%icJ6e4A?acQV1Ge69LG@I=m@b8dymk1VcmkkT</lCZnT?wJRXcKe*1H
4@JGE$ w*PnIpJ:+/hKy^Y+wBR?!GBlci%:?@1h%dj^*6NFKlPyibu8K<u5!!%$XWYc!puQKSwn1/AeB>^$wn^#
SiI8@6 !6quElq5e8K^Y81%b<<4Nic\e?!&FtNRc1he#YXnF#P!KF9=^X=bl\By:ESb%Kjl9Zhn%t5nZc1%E@P5
<n5<IG YyphXMCAA?wBBBtqkiecCp^&Tm>%Aqd4n5PY!tA@lqt:Cj^%?pMBNu+GHh6AZpw6eJmqmb$cL&Y>/L4#
Y=HGen %ymbqCtlk$XGn!kA\\S\hB#AaGWt/*IJcEjm6j>RYV?!FARTj<B$t598Nq11TDq!S8phupjnmBlNdPw/
Ei+pde :Y=8%$Fh9NS/56^+N<HTXnan%/%>:WdIdVQp&wuVEP>A41?D&lnk?Bn=ndn9A=lZNH\DXt@@pPnpK=G!
ZFWR<A GG:$PFnXSJ9\\X#b$nHYa@J1<aB+pZj+meRCl8Vt!9bu4GDXi%NENpZ5*$DE*C@CYcHYD81F$6&wa9N1
T%:#R: NStk:?b^+A<:DL*NY^RPLhST&W\%>&Z5NX>JlM5?<+<w9QtDYkwY5Q?tNY&Q9\ZB5=j>w9uM?^$8Xy1Y
TFmPeA *Q4bqtR+N1C6RKl<\8eNRYyHnjlijnQXR4%iHyylApARRl6I@llQu<HplMRJ1aLD>IDF4w8%PGyedZYC
$ik>NT i@$e4^W\>ZtZXe>^BEq\m4a:\wuLwXk@\PZTYHN^&+*WmGT\kCy!wy&MYZ4LYIFJ9tZKEZa6aMjZqMTm
d=<9*\ XR#>RAYuX?DM$DHY1K$@AIV</uFyB9aWHG^DcPK55kp6LS\LLWJ\A+pZ9Dn4bNhBZ&tZ8$19qnRTT/*D
Lh*cEe $E/Q6&c1ZwKDM^Kji<8tPqJNb!RA5PjQA:D\uAl<*&PI\!KH%&9VLi4pS*ynZ*H?PWJi$?^8tLjutiXy
KJ\ptQ Nc<?IFw<6HDB&F&&lnnhK8Rnd*DKAcqG^HpuFL8\6<AtM#b1$<:En?A#aB8Ll9&TP@9pwdSJqnyyEm=6
q5K5um FcTAS+H?bhBVl8J<LYISZtj&u\VMcu$it>!cmHmMm9NwLHRB%4DSik^9bP%>9py6RPq19ZRp#C+Em>Sw
<?Pi%M =<AX!#$lBE5H/lA1lLc!\lW!Rn8A%ZRcwR>1$dFAh@?!MX/Qw/?QCeu4>>Qe?^41yaJ+aNR/E@H*>8l+
WMAtX5 c#:\Hn!V:89bect##>:n:ujtIVMYI:8M^EB/dZ5?q6$VBAQ1hmtE+uE\%Bb=%Kd1+n+KK=M<llq5uQ95
9Biuu> KtlVpI9WDa8pZX\up&:RqRuCLkL%*aY&CdG\BPldCl5IA>V=8QBFD\6@AL@CLEjbmDN6LE*Yw\b+n5M1
RN+Th^ l*KF\y^Aq?CK6W*RednMRiqe%*/hAP\h=K+BjjtTLIMA%bI9@yp@D@B%ly@jE&P*X8$h=NIiHTt1#llc
EFLJ!\ PFY9d9Rc/th/dwNPi1>+@K\+KkCZliublT8W<$Tp8E1qN^^=:4h^?b:h59QySSV9DM^dJcb!tmERSQ1W
P6VdBF #GWZhCYm!m8AXK\6CNAi=^>XekY\jwIlnZtRLnyDk8w#Q9ZuE%W&1HdT5P\Rale+=&1&!XjWA^A^J8V!
m:^Xjy IY&SMTa^:dF#CaaKpWSacZ?F\&ujLwmlS<4SLw1I+Gj5CqkY6qdaj1hT/I!hDwwFiJ=m/Bep*STRA6iY
8JZJMi d#8t@pkiAa$LG\@5Ry&bLWlt#89HZI<QA$>KN$/iG+=Ky8@lE</J9D*mX!pi&Ejim\bkmwaCFTc+I:DQ
MAqSV* \L**aQ!HB#m:?q#$I+PlX8EAjT=lmhN#HM/8Q9tB/+$ddqdTKYqcX+dmbBW^maPSy&EQ*li+udC$iS+Y
RK^jAL R96FJlqqd$P*&<dPY&SE&nu1yyX#$emcH:%1etGp!*PbY1+XhkZX5Ktt%6+CWKGidP\EHt4bXt95LGBe
WpmLwL E:F9PDeF+PuA\ZDVCuB%&dDTlw4w=u56di8%<KKP=</@t!Vk=h:!4EY/I^<$5RKdRpG&8KRRIpl!jTy>
jwDl>p >In!1hYPdCh@:myi9!E6c#C@6<$tmX>XDe=>GaaQKw9*bh=/F8*LWHp:F4QKP^da!#?RG$VluhEYhC!y
kd+PdK =Buy^d!/4%D+!65*m!WDew4>n5twLH=#+AVjc&9YS:HGb>h64NH#ye^IcbCSldtS9iKRj$G>>?/w4$5G
t?pYd! e/H9/6c8:EXtmeBHVFZ$Banj?HnywI/QmS6QZ?9Vk?1l>TJu$5t=qPLHAXMM:+aY6NKw*!hRY1VlBp=q
CF:G#j mC#eK?w#MeibyeY@4<QtVG+=HHA&I#Mqu8kn@KB@H\4%jFBqJd?JJ>4q\>aQFy1aW:n^#<\NE:4*#Gln
j/hBDT Vll:=pp?VM^C=Gu@Vjqptm6DBBGYCkYGQ8i\X@T<m#QITA=ZTJiXBWYE&9Xy>k!^MlQXT&+c$qpdmtAi
dMhmD@ $Xt:$GFaWk*FXtD$a569Eky8b$1:5e+jDF8#aee!EP<DeDE9e%$%^c=q!<8X!t&kw/<?aXDluXRFDl<q
TMBA@@ HGY9tJk5GuWMtmBAFuMpJu^ZkTE<^pE+&CbP^RK8<IKSSbbtE/E=uAL8Q$BRR:CaMZMY9#tD>BCuZ&Wh
=5kW$* Z@^tM&1dmP<+Au+PDJk&mCu%PyGGd!muTdt%N#^VShCaiPqkIweA&P8t^\@h4a!J6&/Nbpc&qHyi&Ymy
HKQ8YQ X@=etwVbhNN+hRQhCwRC6pme^R>I<kVnB#wVCF9>!:AB$/R^q4I!a&%QWT!baaMRn^PuyHCucyE:Du&S
W#XjYu 5\Zb=lPS6!<bGFR=<k*kL%cIh4aZw^9i$HSFNBe>:%yRt\#%Gb!pnW=d+%cdK>Dn+RVSa#6E>R14Chi<
>ZjLGW dyR%ZS5D=5+hLG=b<N^Iyc:&>GudF<ThMB5AP+dt#:Rk6@+yF5+qZAVcT6BI\4W=p!Hn6C=9wVc%nl+b
FGaXY\ 8%8*uWCynnu#CbMjKW9&qwhb\\hqaiAw9F\=Le%eRMQ*^qm^I@>X&8I/XQdciXDyauRp/l&&=L9et*Y#
<nm\tA ?JLZYkc8VJC>j5pnp&&9@kDL^+<auhGGBC^bFDMGnWp!S*G%?dhR^@NyYWmY5q>/9p9iF1&bBE@&h@bN
6JYWXD pED%ahJdly&GEHD#$Haw!5SM6FtK9VeG>KC&9NDk<yp&L&uW=D:+ydPN*MM5&bBte$bWk!W4Att<Z/\B
/DVY** Jhcy@uqN1kA<Pmu1miM6e6DNH4hhttheX@Ne&:hni^dIiCD@1TmW!WXR@K>n+Ana@%=9m+D@N:&6EQ<@
6laK4V i%6B+h@&69?Rdj?p<j:Cuj+nZQ+d*lal?B9$L^QSCKHjwZ?X^paI@\aN?%W1YbD@h?ljPYNBkh?kwdBj
D%dZqI iF6B!G@RpF>6I!wI@S%c+Bi?YlD&G@T9udEk@HjK=XiJcEHE*/J@y>lk9$yEC\4>b%?NkQ@Z9l4^H^QS
=nMlnQ Rwm@<NYC\u<%q$Wa<u<T$j@VE>HX@&5T$dd@N46dkj5j5:6y<>+ptYJYX@@4RQD9=T$l+Dm>JbFSB16q
S+YVec 1eTA:W@>9CJ1Y\NKDLd$QRujjelSZ$T*F$ZiTMbRN!Si81%PCnDJ$9aJ9MPl::>WCPlFkuc6=1I<CF:S
8mu\yw >>eFyT!GaBY4VW9mZ@KIV@I!8akIJSGdpIPQ!Q?RFkRy$c/P#TliGM:M$Cp9NyK6CFyPw6j5X1b#yIKZ
n9yc81 liKPWwZuQbI$GRB%V$tj\L^BmjSSuayTLuI<*a=m1kL9tQAcayn#C\8G9yQVq*bql<NR@PcQETEpwycM
Zj1d$% PAIDu^:PpRJIRqTnF:bZ/&d1QwcdCt^a$+?:nkVQVl\VG?^>jmQ/npHdNhPhtK>PGWVjFL$5SG$kFQ%S
BF4#A1 8ANVt8c?!Ve<=GP+^yMV\la9cdp$W<TBb4wiVcK%8#u5#q%dW+KXk*u+!HFcCK#GR?c>Xi@kKmXLCdW8
^Bw5hI $p>!L*\*1Zj61V%+!=6Sa$FmNB:aFKPwYhcV&pVPmcM8c*K4FQY#a&Wli5X6Y5ZtTn>F>au!+GNbuk^>
E>#@:b JbPnwpeTBihGYiS1k%hiV/aNZA=$WF==$m6N^PnydGZQ5mDu5#pGm>IRLH*NHp?jcVpp?Qkh/cT&w+#n
PG4DCG MkkPq==iZHm5J&DR68EFY>LZ>q@T:HSM*/69m^8MH=9H1/%iXZK8%hXP%Y#MY6C1%R\I\XKZpa^ye?ac
pL=/8X ewJ>jEK>@DREiLaW/P/&a*AaF+4SRZYABh%@bbk^:WZh:S641!\5#SS*&YiIlpwMam#VMt@un$=:CBJd
bTZ+5: E8K!e?c?t@KF!:*X4C5/dS*61lRj^w<X>:FabHB+yMZ<Vaw#&a6?+a+ytL>V/6/A%knbYaWHK<5+BIe:
FKjB+@ =H*CF>Vi<RQ8SFimGAQBWFi<qWwbphmXVTJL9GL?Hw45iEcFSLbl$/m?qP?a?6@jRAwN1Qtb/T@JM61<
c@pEY@ ?La$8hJ$Dmtu?wXhn9Jyyd\m\P++eIXi<qAYd8Bwj1B\cRqV=>jqJhZDFD@\m5l>wbAH5^GWRbNZBR$*
4caLCy %^jG\Y>Xnp%L*5G:H>E^^#8yeFT#\d5jywl#&%kL?QI$chk?DByN4qpM:N!BSGSjqMnbydY*:tqFGD?Y
8EeX$L eK$?ZbIj6Q8D8eZFk&FIkFb1HWYhFBm@QYuGdl:\PX5ES$#qhLRnL=ZYNK?hE=$m$P$##V\=\laN$Z1S
/uR#tV DqkntT:DNaCe*REw<leVd%>c<45=XGpNNZ+bdA&*c8BpC!y5Y@akjVZ+E@hikF+8HTtqte5?^ahGcae9
?Bw&BR N^+c$yQi/e%/IZu8*utqQdT$N8mw&YW>^KHt@T+j/y\%Z@F*JEMmRuLLmW1jitRmSRlpA=6?#8PZ\AIY
BP8FH* W?>D9d+lY>/+nntXA@1pQ$i?>Z^YWQ&VXNVKPA=8mW9^n9jltmnI@5%V=5FeV?1LT+6ajD\^F6HY5dXm
SQ<1L\ ?lnGL+c5/b*Di?V9+84jmF>#tQKT?#dbtji/:^&n5T*K4ca/tcG!NL^^5A=Vi^<wIL6=J1*?>E%WV81:
ikGL!Z GHJ!dK*nR!4R@i!#VHLi=EkIjY&t!VXLXKn5CLWPyNXddw!ZPhZJmXq<Ii6/P^Q1M#jPHytFSJY!M4N+
wnbF+T XYZ6p+lQmKNWRn+T<TR*k&Nl6HRBu^*VSMIL%\w#&$66dK5Ia+AiQ:tqAX@^dN+&l!S=CIjCc*I6T48D
T%m51a aS4ppyb4!+dq&QL8Bh$AGpnucQiEG?@l*PhV%iDmbabTJ/$H\wETnp#!i%%PNi>/b5pwm8*Fncw^Qp%b
H%5JSA clM^MnPuH=1hm6NL!Xw$c%1XP?aKHV4S:Z*4ny4IC1VRJEQ^?:X&p<iT!u#Ni%a^ekew%q*4GyVBk#kI
8X/%4F X%N8aM@A/Pte6+A=e4#SXlR+dp#*S$iw:Jct5MXEh!%=8Qh+V=Vcmm?hipWFd\bE4NMjJ&l%Cw\t&Rl8
4*BVCH EWDq?Vpci::Yal6tN8Ti4ju&cd@DY@j:pTERk#YbS6LYpQ@qNd@AM/&/jn:qjBP4C16ZCQj+BJnFhl*I
jC+Cb9 68F6=cJ$98bptTFYdihw?ey?kcc\&FC4+ZWQ?TKAQniIRKchntI\hb+<ntT8hy+<&1Xw$<!nW&JN+TCa
iLy4#q <@pVE8=MV$XeQ8Zqa=+5i/</yV\ZI8*DA8&!Ydj\=jqZ\hBw*/y/e!F6i$5KkY8VCFdH:k#A6Zadp^e/
-A8lkV 000587b2e31001202b3 Page 462 of binaries1.zip
wpi!!N 5<ubY:y9?Vky65TP?$l5nHjuTcQ5X*yjp4ZnXA?A:#NCdeIeu/4FnKbnh4y+eW19nquDtiD*@eRj8dSh
N>cRhh 9/Tnl9JLXkwQ$//kMnK=ybY4\N!YnHd#M^<eH5MY+bJQV!nVuS!?S4h@>#J6upmStZ/\4=+kpbw<:nEZ
/*:khn Xuqd&61\&FX^XuS?#NuhPXQwl*DHYKc=I4D\Xj\b=%t8Q/lpa:PNPRMheY4Ycl&HHBStJH$N6/eV?T1w
#*y<nN c<mn&dSVGwhYiCh$&%R//!@ki:?Q/H\5dVIn^E#HR4Q6:FH%hwZkY$@Rkmiw5&L@PnX+E9we=j+ka<CH
^&X!P^ 4tTt=Y9A#nN\><#*$HHXKe1!5&:A9aATkc#*BV1j8XbdYinY**9y1SX?6l<$D#nMWGwRjG%4PiD6LbEl
ATMC/m //VN$aHAVZ@:#PPVicI:b$CPid=6MZ:=\ej+1cJXLej:\NqbJ@eZlqKpE4GI&@KwyN+unw/4KmeMu#qL
>I/CJ# a!$XAXYbk9njMHjtBDGYZhE+tGQ!qucmh$+>*qXNCJY&I&ije&ijX%WnG^lVP>E%+m^hBNbY&:lL4+iI
Jt+<BJ ^W<bdj4yT=B1pyX/*pZ/GD6b9k\Ld9J/HMiX!LH4m+J!D\cHm@+bN>F%eL/PNh4*FKt^%e><FnAqFI:i
Y6DdcV QyqAlQEihQ8?STiN+q*kh48J>+NQN@pIiJNiKdNjF<&bE6F*!kKL\?jiMNP*D@tDNm&ctFK!8AaEeRmm
WTV8#w &F$cItDSuCIj8ey*a=1K#plqdJ!J?l$A\#YSiXc\+WQR&ucS\uXZbH9d&LHEdl?R&/q9X#pih&K/iG1/
XINKdt bD$T^JDDi#!E\@6BmSm$::GPQ/hp8&\!jqpR5KVb4cnjG?AMiNd9cKeu+@QHwa<Num/%Xa6?:&w\TVIt
J&N6e5 #5IMk+&u%Q4HkpX1/&!W%iak5^9+DDW4iakI&Ab6PGmR5CLmjRT*%BAlbhS=Kcw:MLpIWi&JXtC$yJ^N
XCMR@j eR$J1njWJZ9EB&nJkYQQYT=b!Vk5ZYE*\de@W^E$\LR@Xte^Wni$#$q\#Fq/HtNBulHDdBKAAw8id@WE
^MAF?\ N<9+AqtCQS\b*M9aa:BL!<%k6bIN6ju6mlBt\Dq:yWt^cDCRW$GhC9IM85t8^=4Tbhuu!%LGWQCBa5PX
Lb\<=B J1yPRJFVj:BBqYZ1lePd?^\Ynm\&:mPM4/R1G^W&bZHl>:hZJ>*8JVl\!yK$1bbwtE<&/EcC>>nVJZyh
F*C6C% icRJ98:8^$8JGpu*:E%>+ZRdEuc>XXX6=yyc/#!@wK9ytGPK/>*NV^==!hQ9!qC<&tt#YYXmTmX:uDm+
5E5GL? ChmlhmjR&dWh!4dkV%\9ljWHqqw&BFt+yZW+mR>mLG:#y^FtK64M9AV$!XZmRkC/9N^jECk1CG+6dcI6
jkLJj8 #D+K5PW%ISiYDA+ZJK1kAIWLY$Ft8J<LJ+cCKw#l+=JydF+yb$</?K+RmYd8+Ym\SL1R8lTEdE#@#AWK
ZK^HNn R4:4L!=VPm>qYAA^nPqEq\4&IBe65YG>d8In>>\V#=F!=IYn/ETH\y6^I^DbcbcwnRF4l%Zq4iAE4RH$
TK^Sp1 &l/WXdKjceD*Yt^9<#A<FE8?CNhJXLQ+XIhhT>hT6mXIeW$DS/!*Y*J9E>C6/F@KC#6i>dct:k>XkHGE
Y1S9j> iR*b>hebHctEk:9=tR=$:p=8+yEE!p+cCB8Eel<Fq1&Xk/&MuFZHh?\9tE#KJVN%&ud=jHZt8HFAuVnt
mVlJ!R 4$iWt1IVqmF#Cj$%B4!*mbaciNIR9\%FnR/V$\k^dQCiZLjKM:VRNd:RV?eQCn6mm6%85S+*5Z%Z<qj*
XHLTKb Z6TTi6iV1PK#L48\ZwM1=+<?aPCdJdD>pF9VW&XT!#>TkJLBVGL:+bGbh:l4RCeeL4dWy\:=BqBQkV*8
MQ&yY6 YD^a\w/BnK81hKm:>EXW=@+Z\epX/T6:Vjh$*%+NNDFIb@iy/PAHPK+**QInQC?iuF^<$1/\l1^KJ?Lh
Lle<FX p?lwSGkGanyNK5LE!\%QM6<N\A@EbSeHuAJ^maE*FwYeEuJMbWNR!=<#*XB&JnG^Ry$TF6*ui$wG*B=i
ZdV<t< mZyiHW+!DPM!qZ5caEJk@k>X1Lhp>wy+@u8VYAWDFk$nnTKbQTyR=V6#DTjZpuNk^:RaP6u<t6MP??jJ
TAem?H PG&LqW8$b1ny<MTaB=<Jd$84%S4IJZen#!pAN1Mb=P5<i&m5$Y55nct^<j^?#a%?9$tacmG1bm$%?A<Y
1eMh8p dMbRSKFJ\VNE\8ADAhSAqcK?RJ8n\J=A>&6/%%NE&WB!uVjEVnVe5jNiLQJ>#=1!uIk!9mD6JjudEtq+
8X%Kp/ >W?XpP!Zq8<bcnINyJdM%bj1Zd&mHFdNJhjci!^!w4D\\*Rj#GF*58pRlnwByBcJiT8#:j^:a<&m&bZ#
JqJ<S* FM@BRcEpA^LPq1Tjm6cGD1<<w^1c8ZjF?j&:HBD>qS+HAX&DFyFT&H<IPj4t^LQtypaFM@TVSdJka8jJ
l4NT=@ FtH#Di5A%@cB4Dw=9YJ1SVbdwpPZbT\$<wZ1RRG1bY@pm>aRTEyqHDeb@8bZ$EV?NVXBnDWpH:h:jm^?
VJ&C+Y /1BA>lyMcSDV4DT*4>%JhA*P^8mAS!9$NeK>ej/qbWy<LQP$#GPnpDPnDRl#R>LMQLXaS?GAl%MY^\d6
\?umLm ?G%*BjYwR\QwK*NP<AXMIL$@aH6MZnK9XCR5XhSjR4:QSqJKXwX<=AZJ@u9QGZL*C6=l?$QWwaAmV?hn
ckl/Gb *IpR46\J\9^8umiY:I4>aTQnRydBlJe6ZLiLQCR&^X>5%q@c56!=!EiJhR!CR8nhqPW\K>@!hh8cX9K:
hjl\\w Y%J@6W5G<Y5eR?@&Zj1/VkM$a$^P/!c?>^65#hAwl15+%Vu5HtiZYy\itJe=a=ZGt>9C&j+k*c:&X9cj
PWI&R9 =\AiP<p>t!$ELbJtJLSKqn>$n6Qa^uLW\NItB<eaRyhm/8?RdKnFyDiKN4T/5*Ye%R9>KB%+91>/:KM*
NDL6Nm I^l&9Q#cky5\BZM@K/GYeA6HGqG4d?amnH+G\5\4eRR1G&1=/w@EcGm>VHLeR=*qKY*8!JGCFnG4hitB
!<HL@1 aSKy^&MLP4y9hijCm@*nLd9V^q1JpdyQAyCSp<Y96/%TYEeE4i>cljX>=bb%?*&?>>J1h89:*6C>maW#
yq%15S >%MESKS+N$=cSZ>>R<Q@Qu5NtD&pBR@%5\uY64=LpYGCI<DAJhGXDc?C*D+*b$ERaI9We5/jeKL:lGFZ
lSa:#H &c>:J#5#qE=itLhp@nNQ/41%>y:ZLYM?5dJ:m*Q8+C5@Rm?4c&#9XK45aH1:/Atu6V+hGe6kVpuXlPI@
DwaX+k jN8Ri*YI\&LbawW!JdiRNGdSZAP&\B^nwi+k!nRe<4$E^!%1T^:&9q$DkRwc*n&!q5#LThRH@KV=EXlG
EB5m<W pK&A&pi??KY9y\L*1%F/DjMM?YI8Mc:WPBTR6!9WFpIJqIjchlk6MTF&6/E8b@NX#4TIa5m19wCACpPi
a69!G5 8!LAi6eJy&%N<46MXKtSX=T^WL6^Gt>Mi4HJY?dbtH\N$qPdhHAKy=TcHuCTlXiG1X!GKd>pH\8^FHDY
HS&F@P a8LI@Q4X=9b51G6#c:yk<:4c1eP8q4W5%Xc8cHh8m$B^>yBBaunC4bhk\Im/wt!HjJHehqKWFF%P<E6@
bRVBeE 9enekm&Dc/6nkY=i1t<qJiT1XjF9Be$5M6CchX&**yTA1#9XY!1BQN@GND6\JJ*EaZw4m*WtGYwW%/qS
jpeTt! u&AJ^/>6TF1=&\6<l\m9$>9A9k9VV<qA:TL9uHE55V?F>jjci?KlkAGPbnKdmyPAb/:Tl^uaEj*FC/Z5
Gqe&J^ &uy!yAQaAjBmNZndM>BcX:lXhD@\TbTBmt/c9ic<m::HMiI4Sw*Ldk\:mjHki9BN$4m1jy*<I=KE%wSb
b@Xn&K 6:B+y9/VH/yew%:yYZuFdb/1iNECSnK5AW9c*lFYjX*DX9Pn>$5PVPS5%%FHdPlw:pb8m&qYkT^&u?u!
PYutlu ae?&8X@H4aZ+@@h1i!GB@//&F@yudT<p?N9c@l@P<V@dVKG@WMn@GAZ#G>yiCQw:NP\Z<q5I>l9$L:Y>
SI5pLY EQ\*/F<LcCHEj>c+RkL@6ed>6/V^9&ye+d<cdCEp?M<cF!L\b#Z<j!S&*MA!qeNJLJX^L#8^baFV+kE^
>dK*SJ KBSL#GZNqYXRupX<$c?H+yqRZ%+ttELIpyqa4qt6=RySQ<aXByy%hXp\jXlPmJLRt/EuF/wCYlw<m8ZE
y:VnD4 l6Q/T1jRBA<S5^hGD:qRF\@q?8WZ&+qEa:PHM+YhCMqn&NF\S1DJ1=/Mm$heQa*id/p1EM@6\?HPDX!a
MwNAT? n<cTZilD9SG6k$YZHSlVX#4/DJH*qtidNjc>TVVm4!d$*cRBuNqVW/LeTL<#lyBA$<n^DmPN!SDScQJM
:Ve<PD FmRE6w/KW^QnbVB6*h<HFK>bNLLF%hVpCbciL%>LKnC8pjidmw=$A4=I<N#DAb1ajA#lKtM@CH$p86%X
iTP5Ih w:lSJayVFajp4%Wj&CWj9=S+K5?n5G9@JFy^qpBpA5c@y/De1ZmlJu*p5>&Pm4e=HqY=8JB8W:!a&bMj
<IeI=q m/Lhp1#nT4PtnGKmWHw&R%nB&n!dI*wpk1^ZpK+D%Ni@wl!:GQm5y:LlKN9PA\9CNXWSMCTnt^>qX?8e
*L<QS# <nBpi^:FDdKD%\k+cq9In5!Y$EC>FjXk!qGjCKW44k^K!\1e!>uy^?+^d*pdyk1y89J:*^&++JC$JW!G
N&BMSI JF8!9MTl&1L6ZJ!m6l16FWC4#hipSN@E16=+KWlw^n6<%btt\Htq1W/nL/m4$@VKnX\@Xq<RyXJtyCNm
mD1*$F YB<p:G9bIQ:bCha+q@FRD&=Ibe*@!EE@/^PtqJ#upyKDj9uAElRl9NMWRtHm5KSj>ZJyl6yYQMdlVk@S
JK!Jp4 h$NN#wtn\tBC#b+aJW9P@!mtwj*\wmC1Du:?^FyE1y#:@CqQYtWkdYZDDmmqK>*khdRX1b@#<>P&^+L*
Z4^ayn ii+Tlck4K\^itaC^A5>G#=d5ece&!1M#Zu^\@<E&=:X$FW1^6G#=Q5C5jDb9?M#NL*b%d4:<QhLne1=5
GHwHFA A+#F=#14Sm4>mubRFV*W4yKcaWTF<*k11nqj*@hFCCd!=$@$1RJ:\pC6G>$ZCc9P/N^a>V@:JN5:ahy/
mbyTt> $n/FNEGX@dcbJ!!$J%G6D=T4uuS?uM&6un^@wX*KT5A&F\mcm>TXncZ9:DAH&HbG$tpQZk=*%4J?%T^u
Rt>+eC X?GZt*qLJb5\:Aj^&dwF6*=N!FMjaXSVqE5Zd:\5X&<8%8NQy^S9+kEQ&a9!+G>VQ>=m8E*n&Gh*aQtI
$EDPw\ he@nl\Fnn8^lNT*::yD>ak$Q1LPk9HmuJej\>1h!QD!F58=u&/IFH4^ME6cJpmakmhnGKcYa^=I\R4?^
jFb+<m t#RIGLl/G^yq^E\cEq*aLqT@^#16\i+Amtpi1=R\J6YK!w/J%h!8/Xlpi$jI:S*@R@d=F5SkXjhXe6?:
>Y=b>8 SPbLV?CGZ+#eijuwWElKq1Y+lC=EZDZ%KtaaT>ay*k&lKm%a8y1^cikjFqYVn+Yhw!d!\k611VmR^!Tw
Q#JRn? :\IZWFXt#Y1!5^<&wM1MnG65FZT!WQC^BBPd8dKXNN*ZwIc:un!mK/:j#4L?4mTXp\pydXInaJ1<Mc9D
bw$QpP PY#Tal#eJZ5G*!&jd%q#FHunAMZlpubC&kbEbiS/yJEX8w!JRI/%IpT5QeKqcTiRNA6uFel1k/Y+<N\:
5kWm@N hSh?\Fc+MNM<4XX8k1#KSe&4jNqIJ5dkM*p%#PMpwj85cwaa4wV!ttLlL>Z&V6qjEV/!?ikhV/1RB*qN
%5jiEj qnScc#=ucL^@Z84GjeE<#Yk!FVFR$bjhPDNLWDq>>>BwH^HD&A#+&ytiCuWSaFTiTTZceG>Bnn?>/:dK
YHVM4+ WM?Z4K\cluW#LmCHPJqNye94dibTX8nLjpRqu/TWXL@N@w^5bu!tehabK1$%RNdNI=W#/XFBtdCnHjV\
-A?BF# 000ae689f17001202b3 Page 463 of binaries1.zip
!>ucRi BeiY&NR8>cbB$DN*#=841kd@jBK:ac*/G6iB?T^R<i$LIlD:!AwFJNik&Xq=P:tbT5N5S>HmKN+T5qK1
4@6!#V h8D%^TIcnDTlySc8<CKjqY@SXnZN<#mjnKJ&d:PV&%thVewqlc#4AG^:b\4<55^M*>htF+muSmy@nq<y
>Yl9&t =/+eFKG>b1:VM1m$=SVBw6KiyH^w81Nb>SGQDd<+e:ye#nPBSL?4=?ejan%L8bmD4XSY/KqCIiHey9w5
cN&SAA Vp1%EhwQ^I+/^jV1WQH*YAV=&6=dMib9&j5bp6G1#SRTuA46:^hj?T8Z/\b5dn&aTbiRNCJK\TcHn?Kh
1GIBA% G+1FCFW@A>!bbGtXDX4MKA+EwXB$u=^e>Z&$ljZkE^d1JJp1l*5yP*imudt4#QW<Q*n:MC/wl@%8yHXN
5NR659 ddm9CGm%>KLh6@I:%u95C@c^&kBqWup!<w1?e&HYW!AjRc/bX@R$*<eB?=TTnI8W!*N1PebZnKhy@A6j
^YF/cB LZpBKi!##mpS9h1$/YTnYt1TLY$F<uch<dGJZQJ%^I+9I$jum>q9Pt5cQmn!Q51ALD!Z?unIZH65TP^W
C8t%N+ +X1AWQ!i1T<ZYNp\GeP#k=?&@\B11:yLK@AB<NH>kHFb=!\4bJActKHbM?MtuAR45PkX4CX*XG+&DpS^
N9q1@J /NQLS\KF?<:tIqJtK??Fn+1$S8ScElwwjta6W\=Khw9a>y*lqhEtaAM8T46MM$C8XP&C*NTVJMK:ApZt
CqRcw: ^u=G&Y=WGdAFK&ZkV=9t4Z?i$I+$t8b%$p4X?aV9<kPPKd$YVE#<%?&8$Q@thqj+9>u8C9@F$+ZC9@>$
K%mN*5 wjBjQ%$w@BhynZ<MQQ!hyqFa+P@l@@Twt=D\j>%#@q6c+F>/VkGI\F@$uMJ@>cndu&j/Q<tB@@tdmw@?
9tMGI$ 4>lWZHthPCDkL?>j+d?SM969*:VC@<%wtRDpu&>cAel9*:V@X6^@H9#m:9&L&I@\j\:8CQ^1<1Y\+G@R
WunLBw 9=#+KT#$P#V$X:V\:>CR9<=cCjD#@!%c+DjwZ&Z4BQklj+8G@k:>m=*DBQllj+8G@\aN??YXI@+Y@V8%
uew1ZH B99qqR9>Ljy*ck*&m!jJ@<V@F9$:6RbFRH>BR@+Y@V8%BlZ+FR*:Y@V9%ByEEQ+LG9G*/N?yNek94%#w
MKVAmp d>G@W&8@dIkEIQ^@D^j+#@&W<H?Ka9:LQ+4\Q@?9?SiD?Y@>qDDpQ@bVj?H\BCCR@?1<@>/u@ZpJ@#n9
!D+!/V 9:ht@*yiPQT9#95ZjSwW?8ju?q<&cnnhykEDw9^BpTkJXe#@1&M4FCCtGVP:^&H&mBwY^wn%b1DJCjE9
/My/ll \p&H8w5jSmhu$nXb*IeLk9RAJ<?\#RVAaYCLQG4?HlMaFdBQ:T^5RyRuIYwLq&PA$=8EW@LQdm##WqTn
*uGn$k LQyj8#Em/&yh:t/By1F?>l#C+4QAuIbHiG$Tyt5=Dukt@QVcI/:*@5WjW5dkAA=F^\#atVh\<4lXJ:dC
kP5P>1 i8qG$1K!5@jN^+C>8BLK:6CEj1CH%b*Vp>A\/6&ct*m^HjF@<ah/V=\mhX8li!F$V%SD*SN:cSGLA5t!
KQeISV TQkZWP?@?MM//V#6elLMbJGLFYK\#L$9jhkP<H\RKqWB#ap6VK9:+R>1qc=S$ZbnqBByIbC<K&#DbFW+
GH%==< ^qRlRlk^qqiP\?XA5F8Yu>QhX69F/YJYtCQ9aphjMY!@$F1?K*H/ETDYml*GQ^bRDBjbp*\R??FS1Xb6
&W!yqM SCDneVNAAH4dlaNFKERHp<n#wBN!QdYkD\E8/DMC$j^I!lCIJAGNZIK:/GCV1d\J8X^=tSC6wF84%#BK
F^$nZt /bND4mAwPQ!S@B9S%dXSMmd9l+BclaRF8BK:8emI&uI$M?mN+nY=$CPHme<DRWqZInFBW6m$PFkPH^uB
aVn>Ju hj?T&uR:VBkD%H&k:G%^KliViKVATWQdh*A:i9@nF>GIBVZ!<u/b$Sp!emFkHmELJ$#yZka9<qGV1pu6
V#4m9e !Ic*ti!w8qZIbJVpY#NkZ5l>SumCwSm4cAQcENuyaq>ZNnEbbVYadbw^X>W*:8G1?ZGEC:\EA?<mBRb#
T&:QjC MnV9KX!GdMn1qeJFchVP!jt+Q*yY9Bd6XHZ<TM*ktpAh4EtqbyCpGeZ6N@lBI>JnX1/B<5?YjnRGyFSn
PnP#Cc Y&EZEwIFi&&ywF:=YBG!5KD/%FnS@pYTXVIPeA*GR>#6W/?h4Y=1DE!#bYlW4!k>d6BNMSJ89KnkaqbM
la/B&c B:@QD<G$bH5\IjVWbk+8$i:Yb/EMJ9*K5XiVRn@#Xj/Pt18y\9:hDHuV\qbQZY85=PAwF?5piPtBFWK8
qVG:uB AV*iNbCkWTL4CnRIcRE><b8AuVWMWVGcuW8I>5y@mT1#F/&X1wZy9*#/kcw14u9e6YLF/JMGm54mljhc
B9Flkb ?ewQF8$nZ8RW/DD=hYThBnm/5F1C==W5mQi=P&9Jm>uZn^^&yiV14&+T\5qt!>6^Yce&w5:MNmX+ctMX
q8Sme\ Ly9t^YAT*GT1awE\k/4TH%4$YVP6qyMcqcpPL<$F9Wd&K!uPQYFF=GQeWKGP#+>=uRu8Htjk<PcqpM+1
mn=\Rn X+a\C/tqXM!RaX6PYQ:BMkA^y!VHDPyVC8!Am/LjhiaGV+V^N%$ddEX?c&PNi6MyQm%p*p*\SpAF4!C>
L8W=@8 kFtDhQN?aP\S6=AH\cY?\yX9$X:E<$KnSawDVWSl^!Sh/5AR#e5Im=FZBZXiXlXpFtRKl>@8\Tt&^$#4
Q6yjCL hF^WdYaB#Jt^TaF9aX#+F^<c5Xe^!!V6CaSdyK&KMJMk1c/!!V>KAK*$JmPGMNZt>aw8BkyM>S8G$RH?
H/m/yF WPR8*W!C5E^l9AIjHB8hM@LP96T\De6K!J^?Mp^H^hcW#nLaTR*QMqIB96$:G@\=/!XE*!FbIWSakG*6
a@%F*> ZE^F*8llPe6?IiqhtaKmC^TkHycma6ByERtlwh6LIGB!m*6q\!9:GLD?M#Me@d4WqXHm/%MT&q^qpBN<
GLK8Lm pK:8$t!G/+XkiE=jlnA5Q$yh#/QjqQD=QipZyMKGb1Bt#\<wd159wl^Gp/>p?buQuSIpQtkqlPVJeyL*
:b$9+V 5&lptVnd>My9Vw99ikI6>5WM5\KR*?aVR=J4lK@dL^48SeDpycPdD\W\nmMwq:lEhpXiW*XaARj=?RFd
qVDBkW ut:MPGM>1w\m4<X\6N>PFH+VE#ZAIeBuy9bCY5$E9XG5PlJL/^db*mcRldw?&m8%Q8=J=AFw#91!%#KQ
>^kh!> e+%P!*4#?J6\wY*i&jtm58#EH9KcW%1NPS1wueqCeD4WFRlYiQ&=\qCI$qE%pq+:@Eup\L&pMQK8uB!+
b+dGPk HQXKKMdchdy1tHIqn9E\/$9Iw+^:ekV:<EXy*9LPh&a%<cAK?t:!?!c:upu<S&!m>ica&&KYCnGe:&6T
AkLqcy PpYW#YSDJ1dMSh$y<BnPTwtIZ9WZc8^*QF^ZKamX:*>8#/CRu*E4ML#NWY!jdm$BHJi*Kyq1:%hS$TaE
#j8b>h iWct=FWt*B1Ei>wbdu8\%FwcVd+SSdaq!@bw1wi\wLpaZMwnYmYa++1tTXQND5Q:%/=\dMS5a#RwEw=:
%>p!PZ Y5@W+4h?RP\M8+1$V6Mw*P^\1JT@CE>:=YW#R:$Hmhe!t4n>ZAmW5&apX&n4@b^Gd:9Se+??<4iatn@M
8K%S8T t!ujPTDtZDmI4nne6N1#1mmTE1&cT9i!&GjhZ\>d5i6WNFM16iQl<A8Te!iXXN\?SKBtaTN&1<V&h4a%
9AV11^ jQqd=NNm#bBT@*DBP?b=>ewAm:YecqP@!u\//GF4$6BJK?*M^lR#CNqZWqA!M^&eNR9TujR*F*dp:wkc
a:=jhm #AReC=RdIudQ98Tm/1&k6Pc?*?B#R=J/4mTFT$l%1deeES=<FGMLeJ5LTwi&@NMXZ18/eEhb*h\=DueN
c/\CBJ ZEMwd5cVFh@yX\<AbIG8/yPqDlGG\^JMLjGkWV>ntq+^&1J:lE/PFDKXZ^TYFNL#&diKqX@&GV^Lb!np
@4mJL9 5%9Bt#qQ@W^qwL=mj#FbDX>e^9QJ\Z1SGmAQ:=T+qI@ub>TSK/j+LH=@KMYXyn/mL\w&!SIT6:MTab4^
%5uL+I <<*w@1^>b=69X44VjyBtmhBdiYM=54enJmp+pVPdVJuXH#QeMcb%/EeC=BM=Q/YFA:jeWppt8C:Z*P<$
^%%6DT +=ak5w*$uZ%N&VbF!a5CKLpeGVMywhY/^hRbpZh5H1nh*jPR44BdV8dN59chM1T#yhIQ#uI&9#VhJDXl
!lWQBP l<nwQ84&1p>aIt:uXF#y:A8Ft>N<\FeHpX@u*CZjWu+4ipH*?4qISHNpAVdjHauY=%4N#8:u?G:<a6E$
uBHYM= EBWN8*Th!!lDSlE!#ajM<\\jFmqtunNdD?wp8t#iSmbd+qRM9*nyeY#6@Zc>Mtn$T6FPd*4h\:N=baJj
K++F\4 <RqkleR5eDY&<QI4<hXV9nTAj&bPW$nwQ89LP9iTw6uF>:4NB6&XZSC1BeyGM!jdZLTZ6hR5b@=Ah#y$
?8/=qb qK%>@eb5Ra$=@T1@5Cy+:cCQZ>DcRVd+EwaEB+*4#S&%AXB&6+QbM/H<mTlJ\Z%b>ZDSHMW1VCplRb9>
dLTC+L k=Gb^G!n>dWh#AK<^CI@/&+Q9^Bi6V^!^bm&JR:G=%!u#$M9pWXhCQClRNG#SNHN?8%:#pN*+*tb=#JL
4?YS/H u$M/448w#\@&9amEDIeDYwC*mcLucaXY+QAGW^Y:RTIZ^@XMJ/qd8AwKEPuWtV$HtlmdmNKwHC!je8KZ
iXaA$I n:P!/qn&^8P5p*8CBQAB<uPDLjcdwq/A\+<\w*!@n>ZM5E41t8GFSV1=1SmDNunqbhyB8IqE+bhHEWP6
X>*\dW +#CG$lu*a5cckGWacBy4:=/P!hRB9=:NJNK+%\6\Tu\<JJ:JAwTJulMGD\EW4LEG&8QpNW+q=>dZyw=h
+XVFdp cMlq\+\u:a##JEEVcS?P9lPAMhwXu&k1ZCK\!G85JK6a@QGb^L>LkHWWq*@K4e:mBy#K*>Xa:abWmu^!
>i/lYu 6Apa9#+c5uGTQ$i#QRkIu6B&Bubb>DXFd<wTeqcJLu5+#!FRh\1Da&1FQ%F!6E/^Fy?XJRjPmki=H9!B
ny=Y/: L4YIVNiS4#9wDa:dq6/\=w:5&D+b%4GRVMa/Y4P5+X?XdV5bN>G!P%ac?KqMbDRpimk:aZi&?\e#p!V@
1pyK*\ qn@RKtAwkn?HA=aK8GiQX>Q1>Ip^*+jAbI?=CymG>+XhlVlYBwYDbdTC9c\tp\+1hAQH*Fq8X*Ei+kuI
SR:Jib &MDq5&VQ$ZueKAE=4$>4!F18aA8iR*M5DWJmbq#PHHaPAc/BDu9Ae&==uTZy%eE<AtB91Z5I61Ad8bGM
G@kw@8 8Q6iu$X=AJRpPEy8#GjMbHGcM9IwMC@@>V&P<Ri:ae4w<?mhit\qV&#:cElITm#H>y^CRN>tGLBdASdm
:a8SKA $V56DHMKd8BC?6R1++DGLNV6<qV<Mq%eN98&KJ#ekDGFV4F^YWNc:CF<NEjZ=@EFBCwRL&Kj6R1Nj8b+
\ecDK1 8kuTK&Jt@1NPa4cpCh=MC>YFZNWNnqm*NtcjDqqbp?Bq+GuEt*F=E>8SuK%!dZPNLAadHRuGJlBD5PWh
BeJ5Y+ YHTp!=KQjAcwh9+RTQCTXqGp@PCE6t@#lT4t9aFYIiKdXC\NPjFp$Yp%e!#P&Ll:kS$Pw$HBuR=tL!yQ
DW#9>> Ht=\&qwI\i!N+DJnBu#L8LkCpqni4KiX&<CY5NAM*FG=J#DEnc$TC&4dTHp:WZS*Tt%Y84\EeCa5:pm:
T4!eKH FKJ*dIQRG+?FM9FJ<l$KP5bJPKiDk4G*<YkF=Fd#1@X=eeuXB+Tl#pMkZl5Zy!CT*8N6RIikS>&*mdW?
WXZ@jY n8qHXc6KjP6!a&q!VM>/XiLePq#b6+n+Zh\GI&dWh@#kpk9!cD8X4i*lY84E<p8q!e8Spj$jp\?Gb1WH
4tb$HB +L!wcEhmDKeQEVy+8VYaj@&\:9<Rp*>@GWTIAT4$Q*Q:y9?^6hJ@^:VC+j>5Y8G\*#c6@@l/?p>j1Q>b
-AwqZ5 00089801cf5001202b3 Page 464 of binaries1.zip
^/tanE SQ#d:p@@ab<cCPRZZ<eFj+MYkAn>kld/DSwl@A9^BBH?P#TW@*hw&K>wkd>FR*/Dlk9?RnSCwZ?Ll9$P
L8RNcM @e54l@<6?uh1DjdLV$#\d>G@W&8\Z&\GJRAX@n5$:Hh1DTd\C>pHE@ld>P@WGqV\F\5JMPnjwu?u%1C@
:Y>j#* 9HL+*/J@y>akmF@Sku?L@y%ck@^1<Rat@Hhw?P@Wt5C9FnHkAu?L@y%c?:Zd@d?QJWd?l&$I@^@Y!9>h
F:BFYt =@/4k^Z/K:j:H?eL@:8DFaLD@%?!YK=Jte*ATj$Fy%1MZ6&VuA+H4m4&WSyPVn>tSTI:a5I8dH&FG!@u
=A8E%1 WT\jVPLEWM\M45LFMYWVEk9?GYTTCtc1JhT5?iLGBQ\/H!aN?Q//^BQ6Huc#HYI/ak:=EH*HwJ>C4ReX
hKN4cW 4lcheiGknK49JlHDZSMmy&6@KCDGhuu#ET9QnQInq5@ADWCqa%?kE#MNKRLmq!V++&NRumLq^$C/6cRG
#L!+pR wmdp$nN?q:ZJ#yNq?ttAtPk+9kTcAeuj++KBlCGmc%%\iP*F@@Wb?5EH1DB15@mmRR!:D&Le?4VFLFW/
pMkD^H =GN+nBuThCH*ZNSteEah%Kk:K*!c!KEuHaEC<w/!/y#kSKDIFD!BYlWAeM/j8pGJwbEeDXH1F=DSS=Fu
jP46Ld CNRd$hPqlu&:j>8tK$F@ckT1=qeG/nq!iMDjljZ!b&uwI>G5<X/?G:MbaFZIQX+eGLNVe$H%Eue<c6!6
ulc$Zw RyK9#yB&1KkE^HCN#$Q6KDwpZ*/pWnT#c&!MlB<imIbXWN9M+JquF5Fky?//ym48bcyaa*XHqdSnw&EY
DEu&QH hJ*hDKQG<DNSb$+EDKTk4A?Q?t!6Zm%1:#a@e<kpMna?Y$@^DCVX/+cDXiF*C>NiW@XG%S$XKK>Nq?*b
N^Nq^k e1K>cJTnWlee@h5ZNM4j\!qBHV>uNjn%>XRXi=&G8bJZtLq^P58p:\CaT9jwP\qbhwCt:p@tleYlutN*
TFAY^i NnAk#XN+E6/i&qBcHyLTGw4ijh!%h*pjXlihdZa4/Xd+F945WeMHH1RPut48!HTKP!+P&8GREZ4$Ky%!
%lWYJ1 KDBqnq#lm<JbE+^PhKeeVmeqSh:48$yA@qu^B=d65!CJ==HYE$<ekkuicKVRMJ&:C#F?XDncec%4m:/i
KB>hAD 9/k:%LyBXSWiCb%?eZ\eZH@FLY#4tT^JVF5QM4EY@ZlSS!V!LJAeRc=dFcjc/5BZiE:#<RGqC6W^XFB*
<1Zqm: e5j&at<Mi4udN?&bNm\#>XIIX*WYZqWItwe>?@q!<c/%X%%R+WttC=PMa6hm+l^FkpEYaGZyiKnVlS?A
ZDi8yH <&*$wRdCu>:5DhGnPkSKA*5%R\VwTaAN@$AlQ++%NPW9n>=L/WGb9=>WW\%F##$ph81bSq1CMaMZCujq
IJI5ja b<eD9RI*9+tmGQa#l$11^DqWXVqtd9&^&K%FuYmyenZ8^yXij8R5=mDqaVRtJdHXlBN4i8QG/SN<Yd1Q
:D98\j m/>cLBJMH$VtS1ZeYR>K9=T&@&L*Sy#:ZYFZuD1yaR5PmmHH@TNn@8Dkj4&q9LBWCbqR!Pm>u>dw6?S=
5Fi&qn FQj8T^A:kQnqYRID=tlW:*t1dQ5@aJlRJZ%V\\EddFb1^q4Z:bSETXSeKiBcII=XAtiWJpdwe6<?tM95
dnIC*u aFjk#iEWFI4JWM5uXSwVSljIGa&b1/YE>&1KD8DKqlkuJ19&!><L>WApQ?J<q\Jw=/*CG^n<p8Ti#uF<
5X4b!p H:Cn*DV1/<+$MPdanbLB%!tQCh^dpk&TQQ\&wYA4Bc%W!A:^D>h>p8=%aeYG&1V&b/VXTICklMe5Dtpq
&9H6Ln *Hb\CuNFGSQN@FtdDZ!Jeq$b+/aq%JeH*adY1Nt&Dc!^cM1Nm^qwPGaqY>R*lJ?F^$%IIGm@LEQJHS^M
WA=q5G M:8*T?Zb!4I$1t^hGdd4\nIqd*\HpuGF6tRa=pMk9mR^NEH\l8MmEGPKa9K*n?4F>>:*MPDm/N#MFnnp
Qec5C6 bVQ:B+^p5hJm:Kt?m<m%XVmeWek#J6Ea9A$!yhH/cGt5HZuHqBjXeC@H/uli>%6BW5jkR9bM<h:El4F:
8cR9qp 5ZCR$F8lnZ$^W^#<8D5=at81?Y1$ke#W!KKEQH%KC!d$/F&9CNpit<NYZw:MaItiTDSdYuK?$kA>haM\
bG1ieZ b!l^TAE+Sbh5CY*%Lknplm!KieKi@qGG+j=DW=h4Jym$Z?cPYdd!iN?Z9DTSF>t*%YZPl@*Qh:?/EYtc
HW9Pkn QS6=F/bBP+:WK:qEeCBlwWW#li\6GRZu8:i<N=Pap^#Q/qD6IbKi%=N^m=jBFb\Yluy:u1Md*%yhInBW
cER*B: F::n<!YcK@hF>ARtHW:8EK\ZWP&yMt\HWT$P*nTEL$#V*9F@&R$5!HiQweiTVqccIYA!+C5lb/hSE6?Z
Iptq8* GQHkC*ShL##h^p#1:l*+TIb/+6hLd>BSi/Z&8Ca!^yeL@^BMA4!Xi15a!tSa@+4HB>4>JDTbl!ZWctCe
yEPaw9 WCZ+eIPwb>bw6&%TimF4X1#<m=KTB6$GtZqMHnF:*#Ehu/LP6u@SJt!E=+%4Me$:*k6iD%8=pu/qSGNt
wMIPD8 /#dqJpDW4T&Im8#TuqC/EY!yZZPmp&Q/H1Y619qSpWVLchdkhc49l\iSZT@=/LK1m=@&<&tR?L/>P9y\
>9KA:t %Xe1%t5acN<HLKjm*BYlWk*Q+!q<VkZq1udp1euLKa1J6&1$+i?!mRe:VVqemEJdS6J#^%=<cm/^j%m@
4L9jDV uhFRdDqKT!b!lI%LZ9PJEQnh/CX<EPHQ/5:YZ6*P*lw%Yy$#Tma&n$?*8ZA?bD?bCY!EQN^>G5uNt@Xl
NEwIhF b8pQniiq4cXPQ!8dXaV8bQP8qP=LkD5RCV?W915kZYmJ=4\458bFDnTQS^=6<GNVK+/K?yH9Y@SnFp4J
NBR%%9 Yh^GYIRJn1uHCqq=CEyXWF84t!^G1ab:Qy:qb<?FYw+d5$hFYNE^jSc&kW%1YE5@c95i*>pT=XqZVMiY
/Z=n=1 dVFe#PR%YKh?*?plwGuiQ$:^S%Rwq684#+/VV^8ww%/^q1k+$Jn:T!55nCpBYYB$dVRX$5wFqkXpci?8
96ITu1 SJc5bnh&*$hc4?BW!1j1&RuQpeY@?1S&u/D<^:jwV?8*6aD=wS:mcHI*q\p=ZDGNQX=9CMq#9Fkild/?
QJCw?< dKXa*5+H?YWPZHHdL>ya*\Bi!$?Tq%#p$=jPW!VkuYn8jNu<kZ&TeQGle9DwYTbE\PHX?cNBlM4EibYC
ktSZdp u?R*Vqp\aP\X695u1u&q>*KijI&C8n>K%Y$PZ>ehuyBuXC:<IMy%KB8RLD=EHwMHn&%p&RtCK%L1dQq:
:F6^R^ AMw8#Gb\nIuAdi!5MXSmN^Jy5@AiF=li=GXTuPuTeZAQT^\W#cCi:TDSaiP%1danF!nF$SPCLZSbYny#
dayc!p E6aci56&yBjAb@A$%mTRcB<HhA:HGT5?<XD58ZRhD=+@>d*y$\EeJL*D9eWlN54QXkW\IS$4*aybA?FA
k<TIS! jaBhaFeE6YSA**Z*=kG?!d+5Ld!\$pA=:lW?hRyDQ>AP:#qBqPEA\<1cVTw#M6@^Cu<InJBRc?TMeT?+
Wi9!JL q:E6R?^<1=^uFFn8G\lC4KHJn%$C<@LV!/W@atMl$aAEFi8FwVL=Y1:NKY8jG4\pV$/*hGAjPH#CYwG<
9XuBMS B1P9%8Lb6\k<JeCE8kJDmytj<uDjK5+a\EKh*Pyuiwpb&GwCXIdSFZeZme4%JhGTCGYinpA<BV5<nep/
Te$\MB *qTLm9ZKWHd=NK#uCYI6Q6pYG&!9G/I@Ht9b*dSKQ&N&PE+J:SWhCWYYANi@!/*8TCDn=clQbbMK<Q9&
+WY/Vj :XmNXR@\\ae=&&MHa@=^4un/bc\Pp:^8<VWB#Q5dD5h?@X*K+G9P9F%=yaqZSjR?He6iK8CQc5kp<+lT
a$d^t\ 8?*LA*TuppaXCcKbuRDQFbZIiw1DkRLYWI5DWLjFB4bYd9LSb8YXwR@^8pde1A?!#:$tem6HA#cIwy+e
bLF@=i &=IX!+w4/Iq%dQ46LD#n+%YS=T*iVRLEH*GVuLw!G+Bqp$!C#ayQ!LQ^ZKcKuPCA<>eaTIKaSV/iERKT
i=w*W* Nc<iDLGP+>R+id8CLe4#9tTmamYPJ<X:wj\:VuF&MYC%:dykk+<qkXKDHlheWn^pyBMlt&&d@EnPjCX?
AL?qHh $1dmK#JL/YcbB9hK6P+$h!HWyLj<:tMp$BidH1=8$6?DC$\$/h=RkE?L^mkKiY$YD&&%khWDi51SE%Ew
SAyZNH hVK4dkWL5b+BiST\VwFkh@A=LDGEAn%!iu#&aMj@t^%M#kK%EBH%&X#%kh1I&L/VN+iIG^c!R8G<i@K+
BI\^Ql $aL8GVaC!YWD^+tBac!8uF*dE#%m%MAdmd1SQ:C<Z*Wuca+$/TqYnGJ:AQm#uttiFuP1F<kn4B<<m@Nw
Z=>JHn GiQA4hLGA>I?W$mTpBS15<VmG::WLuptn#w99qVqCyLi^b+Bp%HQnh?b=?$T+CSJRdI:^w!Cym!1YJ\=
:t4P*+ B:Bu6=n^<//d^<iW%nd6c6*qXY=#bX*EPywG!B=<^XPWK9Z:I&H%4D?cj!y1EZIukZWt%a9?YC/dML1c
kbpilD uI$p&Hapu<uTpNn%*6EBHb%uecAek^HKa^/=elQ\6S%8m^Ii>NTj*i/\JplluHqMp*!a4bM+Z^6&tLq6
C6XqID k@$Nc^H:56$/YinpqPCY/QKCVVcSnB^G%QQHl9mqm\RGZDV*=Aa$?%#mtI%VtjNKTX5!qI@PppZcP98P
hELalB qd%PQtb%+:!nRpHY:wR#YaB%XDR^:%T?H!k9@aJ>Diqah^\+i4NauQ$JYK<V5Aa5V5c8KI%tjm/D6#*P
5>G&qa 4HXDKB?Y9VdNW/^R$Rc@Y4d8MXQq?VpN#XcPB*<:TkADq$#6GC8+l^cKaeeCWDmLE#S<IukNTXD+Tp<%
NS5A5$ $AS+F*=+*X+@<KulZ4MZ\G9DCN?TP\H@WDe$h$y#ZcL<NMdn?9Nw1h=&E=ClJ^LihL1uWXP+LkY*bTYw
W@uN+y qyT=ic&8KZqpJy<k?T#lmyQ*@<jiZ$hF+Vd1*nkTR<*RIKWm*R^VlILpWAMMR*h*y/mwhA+lJTAm*X$m
!W9kJ% I6LhDRwm*hImw4=:Q&e@b?>uQ:J@jI@9P8i<9*Q?G%l<tH8^4uGYH!/8&%!^5uANt+*SwbPM1=j$6!Pw
LaN\w& N*q#K5b1R&E:eDlZPYP4Yl\F@<A%6w*j5^aq$Qlm<+6>=X5Hw84$We+BH!uBZM#H$LE*HWZ+wEWTu<^l
k+pLS= DpBdHdGD!&8caYc%pT!#ejSuIKQGBkpl*cmqdXh6QC8&P*SHlM:klLM!at8FBR&\uRDwWnNZT<&Mq/yb
55?y=6 FbKS6jYnJ8>F1ENRJ#eQ8^:D=4+p9ce6wGbq5hHMliMYe>:*d=Ncdh1N5&ZNyBuQ%>eNE9QJpXI6Rm=Z
5<pyak ihq^w!Y=^1X=JPG:qq+>StqHhSamYM@C^WC4QWjKGKQ>B8AE41y&G@#\tQC/n!VYqR=QMcVRj<B5uXDY
CBZ:=> /#d8:^*:Q>/><@?8a@?LY9$jL@L=C%yh>DeFb6G4F=lFj>6dF9:N#WD@:alZE8P@8Suwu?qLyj^9dkd/
a>Am9C b@yTMj/dt+H?Cm%<Fjw!Ra!A@BEN9RIN9@Vp5D?m+XilL%uYFQ:Np8yjwc?TNSn<EqtJEQ$n?mybk%%&
:iX!?n elH\H>FZ!S4$5yPLRQ/I9p4YwJe5!A1L\Q/I9p4YIJeqXRV^S@SX5kc=:BelI1J@SF<qc=DLjmEkC9+n
^DLpSY ?myb8%^6m@:ui9Hj+j>Tdj@*Y>HW@8Y6R9k*j\atLQ1:i4GwtQD@KhMDac#@p&+<a:Fn!551&YDt9qbw
\SSZ/> Xe#dktp/i5jLN*Z/8t@j4JJjlRZNFl&k\p+nHGBu\STCq/:X&KZlmRB*PVQ^#>W9a6\1Y#dG5a#T>9ml
maj!$T AcGCjJYjAeY+t$DiR*/bb\Di9&$Z$AjZApwjunMleSjSk$lk+Fy4bXcm&ZlP1>RwLhTTn@8W<LbeQX%@
-Ad*Db 000785dd969001202b3 Page 465 of binaries1.zip
!c<wWG FY1TD5JZk956BM@R:wP!5PhW%495#Al1Ip<@J^wkFGZ&S4YWD%A*YEb1IpkAa*/a#wEl>XpKdT%$P&$i
DAFDpI cjCWG*YdKE\mmY@5E%e>$P64XZZCtnWB+4jyZ%iCG#RM8@DTHZck:XD</cqTbnhGA4\cW9a!DW*ATLtH
CY>Fh4 I=mtm%K%TLFVJ*Bq1pyDP<!FAK<hSk?NT4F4nd1tP5MX1ePCdndp<>$dFDl>tYWkXJpki1w/XVh<E%&u
:Sld*\ TyGlZWXlq1$nDF=5Mknm*8u=>F4?TYNM9cm4ujyyECq<eNh9%d<@J*5$\WSZDbSpKGLY?T@Q=tnT$nq6
a*<WV@ VZDjSljeB:WbyMe\qNe%49%LBt:MuS1ucee\#mi>t/qd&+tinVRA%tYK&nBA98GGZLQBdh%8+DMS4>GI
n4@:k& 9l6ME1Db>=yjFF8qTCD\?EB\?/k5j*1ec4j!XKY1a/l^%yDAXZ#@c=P&PFbDi=db=66<D\&wTdHdaQ>P
aaJ9it YVF>@>8Fmhdwp6%HAY991D/%A1S4SLy&/I=MSGd+d:E#>4?LTcCF:\^5K:nN*el5+5tTM1:4dwQ=b*CN
n!1SpS im6yTyT<GGB+C>Q=SPYC/Ru91dR\ct+h$LeLY!VAG=lN4NEJNy#wd&+!c6&a<6?BDJ6C#q>@%SW%@HRY
m/aPik CRhyc:@\t+k\VFE^5J>ME6^HF>^p#iT!Pw//Y/etNTFial:>dpkK6&?Lqm<TVhd1@Z\ja&^M?6Xw>$D$
6PRBV@ 84ZLjA1J8/i!&YCXS?n81L84dt\cubmm&64AB%:n/In:dAV=ib>=Y+*D<?qdq:ctB@*8liFp9T?&btqw
Zhj5a5 VZ*B9*YZG#h^m\yFGcTQtlRLWmR1R*%WF5Ly>duiSSEcaWkT1K/p!\4^P6GbHZV^4^NQqVP^yTqB\uj9
<T%i6y V6jk#*&dwjw8*:hH@6c:L&ePmuLG*E+KDML6JyW>5<5:mZ&6IMb5QBAhHq1Z&*P&jk&INhhhe*dQt#p#
/B4#RC Ha%Qk1!Y?an5&#uPT+uwXTcPX@i5DNHk&P54Lcp%IiiP^>nhLDacDVqGQy4TH6Hd!XYJl:SaR/iBWY=W
b$c=RD wn%=a@59VTpjJ^KX$iZyyeKZW:%lt>+KN<JedGdd9Am8XeJCiXwYw$y>+G6/5ZSj\^lGL$kj<LAj*Y*V
P6V$*d $W#mJ+@GmwZ#5h&pSEYPpEnq@5V%L&^SiYlBbN/ETE%8td8y^YpcVRJ>Z#n^!>K?NacGqdYNc1F*:TAL
ce^dl+ CXIcVEG+aWH/bWkcAhEedW?S/#KJAwj=Tj%4H#>8QNT&!\yG6EV5W!cS>kVWuBIt4m=$$Nwd<&%^B9H:
lE+S\d =MlaihQD8:B6kSNtA&^5u<*+A$dX1pjX:jwDa#:*qShBn1lJLWa$Pnic!@9AL#VmS=/^LDGQhJEaPG1d
w&\>tE 18!/qBJ!Dd&>DX\Vn94b?N//5K1%i1T+Q<NXLTuLiGDP$:M8jRn?@InSLJyFVptjG5CAQ+NH:A6\8c$M
ltiEc6 $<i<%Ck&>uY$Gp#F@/BEcW\KmJIJK$65:BnX/k$=AqZT/<XEFwq*S:Xp:8BPLG^cL*4Z/EC8q*n:G>!a
LVE@y$ F#Pt>bdm?kw^&wdaJlPe!9jbZkjTEFRa9*/CEa^1cy%kIZq?WE8QQAiPeAD:9WXMG4uQXVp6p?kd++4F
*$Qwbh 8MBPt*86D1bpii+KiZM9uP@p1XdN$w9^tLKP8=A>B/W*ZWiQ*<LPC:ih?KkBN8<!8lu4^tB1CFQjaG^&
F!Wql% $:hRp<G5I>Yy59EZ=pa>jhBQpD+t#y$NmEmM!lLlLktn?IkdJ5Cyi$cbpS&XSPLL1SEa+jPN=kqq@LmB
T/H\hw #Cy6J1Y5t!$I<y^6#Wl<#BPacQ#M@Dyh45MLjc%m%MHm+CK@\a>eHSXw!8t4!5$k/RTaWAcIYL\wdPeV
9\FyJD Fk6P@dc$Gn!F#dCcjcF:eC*uPd1+abd/i4#H+RNE4p/c&\QZjJdbh@bBAByln5j!:8e9K&&bmMwVhTIT
kKV/+= p8^p&\%1YR6FBD+DHu%mPC#M$Ea>1L&&Ra6p%Q$R+&>%<5Va?I%:IB>RjJmeaG@I?wBnkL?5jYPyMn96
$>QA+W n6&6Fi4tSFy1Fc!Y%R1*%&#Dk:kmuA$GB$S#EjXY*km6l6%>t86Gb4PuWQt\6+b<i84?Ha%F!JNHJe!M
R?m!nS ^6GEQ9XBIp4Fd#W>6RMKZVcb$qX=uNK\1#Z<h/>VN:V=&RkQ\8<lDY:w9@#\thVcDqDbZ#kXXF1KPtl$
=MjeTw @u4c65FaEhk=J=^<P8y$Hey4F9YBwKA=SI\i<6NPlbRt6RcCyZ8R5*ETkX8k=+5i>d?9Z<%anV6PKCah
cMapG/ ?Ca8J61$:Gdm>PbPncDd?+Jc\S/t%W@+k1ZZcEQyL+4:Z^5?+*qhj:TQZqayZ4DTqG6b:!=+\@SKeP*G
%ey@$8 n%i8c+GV4Jd1^6HJW1Jj=X:4TqpQKG@hNX<h:SB>nV<M8y%bWXjW?9\Pjw$caa@:EYa6mD#iwQCNiFZ>
QJP95J <<+HehdA9Iy&uPLe<MpR\E5wX>$dlT/:V&K8XRmu&nBENMi?kjh$<iNqX@ZH>$S1j#*+wtCb9PhD$Td<
wn&*A$ VC$L:9@e8Nn^+FYR6*AudatBi5B#M?SZyN*k4mhkG!!@cE5<Ki*yIQqSVp:JdyE+:+qcbw@PX9&CWGES
C#15FE N:&Ye*Ak1G&hHZqAJBkj8LCt#1\kMIDtpnPPR>lLLX4qlb=a#?uHtm&F#PI4+INh4d+K?V!!hWET!ln+
MZ>qCk L+cH:?t5ES%VtQV&4PVFG5Y+/bpJ<j<c*I?PjRIkKbV4=@!&tlpidLdHBmAw1HSY8d9h&XG&Lkk6V*+m
a@IeJq 5:apM%cYmTbZF\QmWSn5WXZdpeDeWtL5>1w+++APnRAZXA:9YqZ*QtAbeG:leq:t@=*++5F\Dc=e<jj%
E<i6jM CThk9tyl9njHVLa5QZ^^DqVW8JmDD*WueX@eWKCI\PZN4uWNqB9I*?/tkKqtBHWa>aj6he6@FP!#IMVj
nS$R+$ muTXk@nd>TlGc9V4&QP&XGnICaSmTlT*nmJQ@XjFC@jy8Wa8A4:<w6ARh:G4XM*n4mkQNTaYIeahTBN<
\a^dwc 8P#T9MtVQd>HwahcCly>/PX!CnXL1aq8EC\#iTjWaWDaKFmXHKtW\?#\nl:@9PFk!cSL5JSnb%<NaPk!
H$\1R= =w=8DBP5*=TQCXqN#PBFFId5tFwHk^bZjyW5=a^Ejm@pneGn<$IqSqD?aPu*CdcbMI=K4I4DBBhS&eXD
E\jZuw ZEJ:@MwX&aM6RnhCcEJ\5Dby%q5YD\u1+aht<tGMS\SPuqIj&DcB+jl#YCw^#k&Z$CwZ$&Z/4>u>DBaL
9%R!yY tHm%>B+ZMpYH$L&>bCKHVnbCu9DpPa!LAyX@CNw*hZXGH:$mH:\tb^jNX4w@9ka$5tkSJH*G=+EPQenl
L!ih=% :XHl\>jdm&@b>Lmd&y6=G9!YD^QN!*&Hy*PaQ%@4c#:#LCi:ShDht5A#6S!eXNVT4y\=8WKp:#:nnFAN
@/j@GA BTn!E>9NYW8mKQ8H+YWNl&bnwC??C^1lC$WZ*KME^J#4*NX:be9$Dl9mTPWK!q+&<PELEw<a>amB=:ca
TX#*b/ dnth$B1q&?HmwQJhD1IpPBIZTiY^=8!!Ek:bWNk9=S^BQ196Je/I6%N<dAQah>c^L61I=AwPAJ<X1beH
ZEM&lP DIb?h<d8j&ptJn*pZ#GL#K8?cL>=H=8+LHi5#8tHCepE44yTC:y>L!nMHDYG1F1bpi1q=SB#WCLh=H?1
61hbb: kl9$qJVXCp88=#5I8!NBm:QZ$F@lqe#jlYNbNc%^<&Pc^nI>Nd&eqRdiBm=A>!98w9Q+c@JQ8X*bRE:T
E+w:\i !/LG<VTjdR^J%KyXRt=#PlI%8iplqRdInlJLBTNlNjXjIHIlh54#TCDR8YE&FCSPA+!&N8DQZPew<H$e
>GE<@I :^6W/AwFQbXIECQj\up%mq<d8pbpN1acJMKNXDQppXI*/!PuywdHq6HujEDRWDS*wHw/Fn1XcAb&tAh*
%lCTbC 6pA^*N:dS/JS!i<*JR*!$=K#j+K\^#$DZc/LLy&K<WP\9haBaPNt8P4A<eDPed9V^5C\cPJPmhaZ?8ha
#<Y1QX !je<ck*ln/tydu/pIR6<qwBT8>kH*VX#SBn+d*!b1DSI!JV*i6k:4M%eaXPBB*8>BmN#ThK*ZVF:q8dE
VlqVV$ in:1$lhXNSCZ8dBq/>6FQRqX?mw^ZQ5y6mE\eWYFbRbakkHL@%K9@ZZNG<<+mTk\^8iZDepYkN5NkVMp
M!P%>> LBPKLE%VTY+a65qZW>JC+Ay6!Klq6pWTE<X9q&IA#X=:tHFdViJqPEbX#F#w8jCGTcQL#:ja>JD6^MWD
DGWtWS h45Xq=w>X^SlQ69Ga8=RqnpdLyK+L+Lqw%&HPRtK=Inhw$!^:+udnG*l1wpDT%<9++8!WaBee#b:X+\P
Hb+&ST >1ZVJ?HXcmVhjZ8icj6uT>nBFTW+LmA:ELDC#u&AQ:#GwSp%>DcbEYDda^&5a/#<uX/>qH*S\=8%*dSp
^SHGcQ W>mjqy+\qMS@p6^:km<5p/CDuWXV\um*/@5&tchHX%\y&4$#VE1L%e!@:cZ@lwI*nya&kdNYP*/=?DPI
#8cF4+ CIF>pV:6i!6bW$!a%XiySZ6%q1R^Cj6NJwDD5XPq9I>/S#ub%P8NHW6&5+dw#LlNy#9W*&Y9Q&#%5EQt
lCYGEu /?PNF1d^/yYTV:uql?kHi*##QN@8G#mmcc/XK=IZwpjTFIkK=HFLLZ^4^^e54\$8GQbcC^QCH4D:6@8>
j^c#%W H8ZeTAJ1Dh:yELn4I9?AT5eVk##1mdyDQabh>4lMj+9?d%w^F@$j4JlDlKH@=MIl\yC489C@K+y@pl?@
d+\^BP MW/mX!=1m+4<ET%/FSy<tjWS?^Q/N<6D@$#DL#PM9^pi?m5$=C4$babSDQyHNP\K>KXFdVH+H>FZ!h1q
b^jNyD SY$^pV?m4=I%GQk!Y8\QcAn+Kqt:4KkNAR9@EZ&X4EElq>HRQ/K9pnZIJaXqCBn?S@SX5kc=bLMFAld=
ha9W*C I@w1YaNA+JjRau>CC%<qc=i/eIn\j=:\?D9<Z:y\$j>R<+d<&@9qj@1?pN?+eAV5@>c<4%##q4?LEYB\
>5NqE: DGWNJG>!+^b=>FMtWH%><Z6MhLnB>?lq6kWG!iZCd4^Re/pNYM5?&<YQtGm\\a>\%+iaGeqYYd5#/b\k
y666yF BeJ:cEeWA\HiZVa!KZPyh5y:u/XG=lCDLVS9!pkdb&La%hq>GXuMI=G9&K<Xu?ALP>tbHheAS&mGmN^1
M9lmVA cMcm#SW>cEB5jA+jGwth9KLa#T5htHu:+kybla8LJW>/Q$6qnwaGXGwIeI$+Yy^%+4%AMwRi616ND$9H
<QyL4u 6%NJRue&GKW4?l:#^eV/jRiGTmiYn@KY?h%YH9IMwSdXTHSD<\!BHnNJT#ydQNbR>\I@p/ld!qGd$B/P
uN/A?H Y8QG$CTwcE&h5Gn\nwGhBSu4q4pNyyB5WGVe<AS&XXtQPq%hWn:<lFl/>tnZq^E>MZ/AX*ekRYmJLQ=9
BmX!\& #jI!/KAR@5\RGl46iX@6e?&1^9\Epe6$!QQeFSn5!#5Ww$dTSdqal/cY5SweG4#/TE@k4kai^&h=dQHR
QBZcb+ %N%X/wZQWl<iI*X*IZRqAXJjwnSF\b$kPL&Neph:^NHcHd%h8e%pM4*FV^4LI59LkH:%bwZu%8=IhdeA
c8Tb:i tW^6DkBb$lTN>APC=@#9n8Ltpe*ZTqeEbWj1e5Zjje:XN:d/:ImiceFicD^dwh+=mbPuttK4J5Bh%MSd
8H%n+B yPTebhBL*C5Sp!HQtCwiMqk$4HD&Tb+Z5/Cli+ie\<VZ*bP$=CK:eEmPG+QKdl/9Dm^>B&8$A1TdNJw?
Zk%IBj PQ8B58*tbH:pdbdlC:VWcu/lFt+QiLEHPcuj!=q4@9FmV^Salk$JZyJ+@FwMKEAnLhuGyB+dAY8N?uIN
iFS@dX IJV!ARR@kc+Z8\ck9m@jt/Blpulw>M5#y8Q/$etTJ1+mbwIwVtI%1P*uW*XB8<a:9NiXQI*TdTpDH?8F
-AF=MG 0002c0396cd001202b3 Page 466 of binaries1.zip
88?Q&+ B4R%R!Z>Q5m8P1K$b^qH$KT*uqW<@CJ?4el5lqHYk%eTb^:##l@NkHi:!yCq48=&IjDE#I@TQ6^i<kYF
LTKM%N nh<HL=Ap+RC5V1d+FhwIN&kpp9\>G=wy1JRc\HNTYeB6Eed5S!FJIHHPmQQ^^&lNpY1bQa&aF9w>9cQ4
ml9Y5A E@TICL>NS>tH6&:l/m^jm/aFcMqdBFZ5byq9RGb/1Ep5id6d89EkV^y9#aAF9%#R+IN#H=8+!WVd?+l\
91G9PH +6%kn44\qTA4q?SZpQF4nemS6Jbm^B*y8Gqp?j1J\pjlP@R6/ZGG:eyXAlZKhE*B%F85<P&DPA/9Y5eS
Re>%%S !kQ+46q\p$LnK\81=EhhwecqTN=JXdqWLFqIBj+Ibn1RBi/m\SMy>4Zu<aKV:IPNwt^cVmq%qc%%XiK/
>TuilK Qb+EW==Z$w<jHGdTEFJkAnZw4X$QNmQ8enahbKbAAJV^P9W/4E<5\D#\^Z4<am%JW@Z$$uVM6?BtjV&L
P+NNW4 6H$d5ywq&twC>Dhd6pWCun+db4%H#NR9\LLt!iy*dj&ZyAN%+\>BF^tYI/A^?=$+ScQyB1:RRhN+D&Ld
D^!q8+ 4S8MaaqJC*bRQ+@wjla*X:I<l\>bE!aY8BHa?WYtl^mBYYp8q6#ENG48^<>M!LYT=hW#h/XDl\h+YL#R
PX*TlR ld^A@>R5<A?JSLlmeV!Z+\t8?&&DJmii@48!KAHK49\IJ5\bTR#XDRnXpt>K!W:p$&e:y@kmSbIPllR=
p&m^LG 6t5$LF@nM$wcpCyhb9Z59Giy1I+Q#:#!EQY9^V6M*4aDc:!j1D\MEe$eK=BLbK!y>CwAJh8=9i!dQ/\B
5@4lQX TIM+=mMhB\bQ?Yib//@JetuXTN!:8@a#M!QwdVJua&kcpVHuT\ln+8Hi#J&Cju:yw5J$GmW^kH&9T@:S
X%8uSR eQ1%=Lj*Ik?5!iHJqbSD::569mDG@DGq$X4j/@^D>&*F!V!?45Cc:>e=VA^MGutci?wu^#*MYeRA5&bE
\CM5ch GmiXk>wjjRaWtXS4l9WE!ib+=IaM>d/WjeD58LZ!RyV^d41l1C*h:c>?jLjLd6&l6#N4h+FVC<<Scyp=
u/b\hT ZHM$hluJ&5n</LG+<R+Q8n$IpkX5=G+@jJ:baI+*u>JK\uwkiZ@>ZXYincTDRM%6pPmy4bYt#D1+*1S6
9tbCcc :@HJM9en@@#G%Si16@MW8k$qLeb\bBY#j*S?@@:EtF*H<tV$*X^n+cTi1HCKGPIll<@ml<R81lSuA=Nd
*QkI/n wmNQXH%6QV\/yY6I@HQdXXpI4men<K$<H@JNdn&nHGE!&XF<CJaQiSlPLh!k8S=n<?%X8V:8VbaV:BEH
*MlGlT CRkwKuW^!*#H&y$kyXL>K@X!LSP8dc%I:?EQtcyC@i1SFVdiSuH1P=44D8dn:b*&blLctyJLy?YGe%q9
bV&%y4 *8e/b?XS!u@XuC8jdFh5?uVD&Tu4G!MwLYld^ckaBKIR5m6aSjjRHy>d:n?HYjCVXw:ShbJFHhI+%t@$
9$DeAM ?X4pIZl9^#b#W9tyen8Q+k!#m>w8pAnWj599EcaBZGV9^ut&Ki>/WFWVEAX=jS+bQ*9+d1H^l@ZJuR8q
#K&/\e cMH&&#q:N#Yw5EC8Xd=TbBMV*qD=y\E8W$Yni$QW<LS%@hyV&<K1V8hnc\Pi$^t^!d\<yqQQEE>ykG*N
<\JM1e j8DKBNQL9WjeRa>dy$<j=Z=<YcP$e@wbkPm158<%y^h1*1bc?JDlad:<Tt8R@yNSkaY!AdR=:dwTkIh>
S*lE<M cuG&@P/GIE%!\9Qk54LSCpKj:/Gm6l!P1V%uiC4=wV5&ZqP/&=NNmjS?t<5tJ*#NJb%H<5mNq>eqN\yH
n5m?\$ *P9:HL@hM%w$Ca5<nLZIN=wDPm=kJ:=Fl9hj#*:6Vd+%YF9b>:TAb4Hi^Yw/nLVEajlh*qIJ1:bKZ$CL
lA#?#H =l=jd&!!dtA5$j#chYHp?cMCV&PFS=d9MdFcPSp1na&n@6Y1/*$p@lu=#9n*5Il16jRJ=jM6#nmP@GSu
^9!bl4 q<n:h5FVFu/F\LQW#E^mK<mD9laNM#T?4W<<m=N/Ec8F$E4Vu9&%1JtampN:<4QatIiFk9:9&ZtB/$Y+
h!T\el >l%IkI^y#NN4Ap@mly!9DjMcdb^>h5YZDy6R/*HKpDM/6dXSF<TZhp5@?lJZ8<JEEq+6!W=$^yt!=Pn#
QSEYtp qW&9ucL$%BEV$\Z:%1/qlt@$NbRJV\kqQS#?iXnbeYR6wA?YNJIIb%qaXth6ebyaF\n*n5:+FFaiH8b#
$R89#Y TJReWdctAn4#++R<bF9d#WGHq\M&:TAqPGl@kZMRj@XnlhBQ\wKy+Tq?WY:H8SlRV+^WB^NNyEFjbQAd
ipBlCK T4I=R14=WYyct+$AeyLR5tLV&H\qij!b#I?\Fy8\HR>AMDypAJ5tJ=iGdEmZ/5G5NeGj!eB#NBlX:Dw:
d\t*Pc V5jh1Nd5QlHE8K\Nl1/:Ye*HPYn+L&#K&kZ9yPl^qY<YH#FVlEPG?i*6tXF1kw:6h9:?G>>/q@k*hIqH
Pu5W&9 #8ZpX6R&9YT6VpBjMqa1*=HK/TE5Jd>ZiJT%?eqD&G/9GLPEmljpI8^Le<%YGE>ZtED6Km#h6&>WI?TJ
eQYGcm PN$mWydJnYR6=SbLmR=nm&Q>F**::&cY>##wD:+a+mNnYW^wcW8QudnAZ@8^ty8C5mjq9y989*ml5y>C
=yMRNp lj%SHSibI!q=tQ\pBPEPVJNeuAKY^>>*\@!MQQ#bh#+S4e45nFE6YFwp*HB*jJJGFm:h$p>I:BPcc>e$
?lNDCY Ru6VIQCb$HHH/E=B^<4D@iPwhh=MjwQCcPZ/aMdhMy8\9WT!HI5CTpmEk=8e*X6lKPh5q^RemPq&hF8y
?bIi9: $Pq$daj8>wX6Pk4#tXPXDk!MK#+J&5NE/R19mIF#$JEEHaQ<!M<WYIqRNjWCTFjJ+cqb&:i+PQh1XbLB
BbRbN# ^uJMk$P=enLu%4haG?ZChM?YBdL%NwCHX4j/T/B%9RGGtmtKncq@ZKl/qGBHBeA&K%AmV$e5!!Dp+etP
$%InbT qyQD/Zh?JIRP*N\Qw%Cn59iMYRlcW6:*HitNpi8Alhl*1CA^4w6&eDJXe4PN%YDShQZK+^X$XZT=hFRh
d1=M=L HiC:yI9pEkipL:@+$\+YVk+:Du^MXhtS!F/icFECYe&VBj1piDFS8$mi4mQq9P:RehqyPc#KhWwwnHeK
AYc@dk cjbMRAe1NmtbQTeFwuIJeCLjk!WnI8^Y^&eb*e*Iwy+wH&h$K1>LW!>?a@55P::XB9+qwpd&T*byJnQj
5!b1#V QWGC5X5=4J1QMYlNdi*tIky?E!VNVM=%L+Ji+6tiyJpVQGeNEPHV#a%8WHFLW*Vmn\4$*&X<6Bqnu&n$
9y>6YY ^4@L6WmVha@?FX?/e5h=ck!*85d^l#W+?YnpKuntRcHdWd!WyK8LimHM8^*=$J5jHh8&4jFL8iP:hn:X
yV+?6G 415!@Kn\FBY1<?YP=I4VIectI&lwHVQXThD\PE/bkKd+TX^//KDZE?R:ySWlJlXZ$lYhX!5!5!5*:!p6
J>tlGw ?HHhnMPVimA4FTTjCh1$=LKWNwlwi#kKX:cSNaBZ1lhh$!1FSXmcPHHKiLKmJMQ9E4ejT:yJ\6e@Dle^
8bjFJc \:>Wi9A1Sty5QB&j119NpLZekqHGEFCweZW%PaHVQVp!H:j9pblqcQbM!ytlTdc+NQm!e:^H6dmTB$I^
F<c5LQ \AIdPAF&%!4@Lbq!ntK$4SR/R%5LEXI>Lae98aw4/YV*mB$wc:d\je4ijQ$aG94hQF^LKF6jY/yhP9me
J+ML/m 1Qi?qh#H4&DJyiCqu=iYwmH@PE4/9:IWDjuHlhQjmtAIVQk*I9l9m\Z@TRSD^c+5k9@6=Q@$Q@>@%m*@
ItC:TC :alZWdtR*$!t@lXc=C4$JYwQ<y9J%L>Cm%&F91S/CQuNa8yjwaY9RMM9W*5R!B@S$K9Rq!p8CP!Q/K6p
M!!k$5 :dI^b\kE<Wj$XdIG8$^yRpV@mL=K%1CZXPklWQAj$XjJG9R!lR&F@BF>qc^BLn$=:I@w1&RNe8uJEZ>E
#C*Hye Z!X4q<9aj=#FRj<:@F@J&Q@iSj/dnEZAjmNn@?Nk#u?Z5YL@<pd^j$R^tep8>Q@n^iTK\5C@FbQbYAe4
4p\T5h T^:l5XeGQX\FK%C<Sjb$kR\4/Ru\mDdEkbA#P^1Re+:Vm@Bi4eD=l1^KB&cJauAl/>$T#\><e1N6/@eI
@HwmFi kEVYCKA\TqhBNcmEhZwM^i#YGwPhYIPECD\<i>QYK6XB$$ZcijN>CF@lJq4RQG$L1p%yywpR8yc:%lJT
HJE!NE ?^%@LAT&K4/nt5P<4Vjp6VNL>=d/yVbC/%4c\l&Bc+WccQn^nAdNFN>nGkaN:GD%IBI9bi%Pna=^Bw&Y
@+kRDD 1/YI=mC$>tGP@LBBtP^I*Jne6+:16q%6kb%Km>iXXX+#hb*PII6l4i*CZeEl!<j<#F%<G@c1BNAMm6d=
Wbmbph 4PJQTldCcQVIwnu!N4JG=^V1ZFE^yAEFLd5\Jen4VYln>jpu!\Jd/tyt/qS<m>in%1j1:PZL9mLN@a&j
^e\t:S cje@I=lPQGDlmnk&ql#?+4B&BHAbJJSb9L>V*VPI=TM$eM!T6<?Ib8M&aHhKd5I\IQHM=5Bq:m5HEk/F
d8cu$y >XXT*Pe@L5SB6M+XWhBHTQ6ITE4t861Ga?GmPFbDnd66KYq%Zq#4:l$SPGD$Lc#%eJcJ>b$^XNT\Q$T$
:XMa^T +LdajpulZFQINa99ni+Q<a*yDRKmT!Fq*t:>MZWZ*h=8A459DGkIihThMRLLyhdc/<t9k<bh$YM/*&W?
XL=MDW D^:I9GPmT*8#tNRewnSX$tG8l/VbW>F#Tc/e/dJ1$HXuSkE#LSw4c&^bIn@!ClKRDe:Z55%k<bR<:yD1
56HaIi 8&aBJk^8e48AlC=c*\Mp<IaePS>HPWHk%/6ni&eq?CLan?D^PywJS@=8m8HFHD=hWc>+MkMh=D5kaZ+9
=km>Y^ NEyw*Cwj*&&nip^<Y#tAK&1qQE?lw@VYB@=R5l9Z4?9CTwLmB&^/b6QpZ5M$#Sm!I>W&a8X/+6MT91Zd
:DpdkB tYZnhE+&Y$S66piYJnGY+>6%S6WceyK>QHk6*&W&IAM&#5%:?u!Ki+HWa6X8w%uw8ma*MN&!KIJkTmL6
C@/k^J K$5XG<<LCFbilZZbyC$y$eyB*j:l8?ut=teM6#SI#\GX/?Lb1h6dRjJby/uWkLTAN/=QR6:q9KhDa!ph
dydib\ ?Q#nKebj/!F85mt>iF:$$y:Q!1mA\/Qi19lRS8Y=IncX@/dc^lpdZFEPN/&J\\*p^ARjK&#YwL48J$$y
GZ8bmK tCyG5/*9F&NhW$SdZ5eQ^H+al<ahNK9/BlAu$m!Gn&G4i\m8E>kEqkeT%>d#Ytum$ldD+Z5$$@%%tRd4
i6&Qww tF^>L#KDY1qFBqpiZ^SP*W5pt$tW/tNtkYMVdA4:LJR:uTGdR8K\P%hd>8M86>6t6V*dnFVG&wB$<K=:
45F#L: lZw8W5>&pX6F<$acb&?t&b1=c=J!1>X:9LQ/hq>dIKTa8EGHi&e>X>J%*PG&KG9jCtXR!Q$hjWeq*YTD
4pbtud 1Tw@m<SpZ6aEE&55R\n<JG8e8/=MeBbVWp4qWNZCi!BN8=pil#*pkn:CTb@/ZPcBqIht%^yktW6iAm5y
4YhVc\ VuY$HM=u6p9L#jIeeje:a6dTnl>FLh^8JyauLeYVRBcY*8&9Nh9=bFTK%c\#1NRPZ*6tXKkcuweAQEnj
jl&uM^ !qd=WTujnFNPXD&?^VaML#cDld:?:F:MHG+%YKa@emeE5LHCRE#llBC^GuZRp:DKnAkp+GW>>&8Xpt@c
CV!R*@ hpIAW5MIiQt+H>%G$$1TBDkAA\XLT!Pn/iFF6Hl<GqwSA?\>b$JGtdD4n!iDt<6IP\Q=<u=F%TdS#91t
M4=eEy +k=$@pmbpn:T&ZlHy<$/XdX9d4MEWAuj%uncQ1tt?kubp4W4M$NAnR55=*D&hZ9^$l#kdA%X<ZkD=AlF
LAPt// KSaPj5!>TZJhT5BkmE=\TJ9JZV4N1HK$#qmQwDW<<hkw5N\uBtYWkMhGMJqT4NiaL^/*Jb89%8Q8p%au
-AEh/K 0004533af63001202b3 Page 467 of binaries1.zip
l+ew8M Zwjkc9wRRyFGG<@#YdVNVqMX+CTIG?1IV5KV$Iq+IdX\QSqd@XHXwBW&!QCPyBQFNI+pZ%1w*jEd#NDQ
SCY5Vk iwTIiCT^4eINeq\meTISid+?4#jLX&Pd=WdVY?$8aj:>1WS>4L16N9A5@cE%pmE%j\G4X>!@86EZMcn^
4H?Z%m ZD9d5D%D#iy=cLaq^=#ye*@8Aa+QuHc4V$l\T/RhiF=I$N@F>/EMNCl#8e<ppDehK?5C/ZcQwpw>Zle\
GZIu&8 B5t<yP<%MGRT8c/SVDd8/14Yi!\HyCw4>KB=uJ#j<ltbCtT+Z>hyWA^4%W^I?>S##J9cd4X?b<il&e=Q
K>#Nl> Z4lKjt:PX>cn9ulTu9+Pt=PYTbjjSNqZJ>5V^Y@EIY<A:%=dJc5M%P&hy@p&w1qEPkY*6/d1H4G&e&h9
c1G68A 6cY\p/m=#nBCc&AHZ^<XQXZB%p+<55WW!CWNjN%1yRh9tak\!XyE*\18%mh:MM9<^5CFRW@AJZ?E>KqW
?8?YWR SK\luqT*ZS6d/Z#H\N:y?%Q6l*eib!w$HV*hy/XmYCARh4t:CDqAjaB#%8kMCVnR1P:iE*WY=!RK8CN^
AuEk=@ 6:Lkaad^N@mdw*8ePPE@BQ\&^6JMC\ZM$t&iM$u+QIy>*Q6BeVGdq$$^mXDmPu^yc#V1%>!aIeX%YSPc
qM@y/W JipKwHi1XyuihC\n$A^5dw^hnjY*y1989p@5NhmTc=:@b9=pk1KPG6>:/kjw5R&WEWdnMGlM49pyAb>A
4Lt8ml LCyQ@&VnE&Z?cE*KXH<wBwpH!eC:1#pWL4N6maNMC\8PH%^$aC6waqE/dP:8IPcd&Qa9jItD@dF4hl5*
%mpcn# Hh:m\B*H8y:6Xek^y$5I%FD4?6b:5+<QH&w&TkCcJal^CmB6dNyamA^TY+5EkLuPkB$VI=EAWH@pZw>L
Q!E9YI kH\baZlKXy+RMi9EtTIRRG\RGWV@mMXAJ6PJSh%y16n9juiHG#c<dSNT/Dl!5pu$6dV<l/YJLmi45FM%
>J<1H8 $G!lmmi!8#BZ#euya1hc?\6NBbJjZ/C+dZjyw=RGMNke&Ep@4d!F\94dBm:M&?dd<1%h!QRNaG5#\>#m
Sp!K?u T$d$dM%JF^jIWPup<wF8t=GYPRlR>1t<RtVq+Fb*Z=#1RQWkG98e&IEu?tHM$5/TjNP<8%^tEGDY*b6Y
n:6>b+ dVGD+\:qW5Pu:V&=j8+^J$d@hkAb/+nFM@/KImI!?YdXEGSK98>5&Bc+%!w=D<jQQW:R>5J\PWa?k8^y
4IDl\j /NItGd%b6^i<Bj%l$R/?GG@He^QRahdL?wN^I>G&lCyk6ICyb\8\NXc9<b*A1SVR5Z+L9!8c\CJ18DqX
kaHN+: 8C@c>tJjltI@<D&?w\aAh=w^jG^JPE%wQ^%EaFd8qk+CQ\NRIb<L9TY*Rb@FtSQ!hSq$19W1Fn>\?W//
#Cw6=S :hS9Ei4j9p^RlJYIbI&1qqw5Y+FV+6d+c\BdZP=HPSk8Pqk?m%jJS\dcBAH\NitXyK<=BM/Ct&Ge*PaE
DqT+J8 VYRl@N?1QdVIk4*e=*=<aR%&6m1\d!\wcAF5hpHa%+bq69lZ/hTe#19mPqt&/aEdN9JIuq6Y5+KlKPBK
9cpRIY %!tZMhZIYLWTan#m:8FTM+h!pGDHRJZkPHXe$\t+?EibRauR5wC#*ci&=1<ikpKFb:C6jp+?T9bRA+8w
&n+Qw% >G@hW56nYBDp+p5@ntAJFTBmCeJ6aYZ&eYPwZGm9yY*SLudhDlV%YCS+!PQICWVKk@hqtqM#hFe#?:^u
^e>?H4 yuJw:w5kTkB@uXXJDAbqESmGtA/dSLk9CYaY+K+1Pm%LdlMwR1*=N=VV@jIjN8ZP1KnHpLni#F<:H/Kc
Tap%6= iwHhKPlRLAS*jI=/GP4ywibTlkn8&89Hw!dR&+=<nwhc?ItYCeGccRmd8K$K*/E+jD1!w^j6&>5NK>yJ
Mh<dhF u\F:Li#+>w=1!wXlDFFnQa1$BQ/j/IVjA*ie88Tu!J\@?1/phc%4*TE$/8j8?^!5M&?:+<#Tbi^pVVG!
><5u1* *#V5iBjpBKDmq^8#MPk%\=Vw1Ql@jNLmkkEakD&M+uQZqXhj\$QwXBNMktDXqhS+a6!FRwVj&Db>+L99
nNR4Jl ^TtZ@KW?Ql+P4dFYNI/Z?eLyEbYZ!tXh8EyN==<=buhecVH&BG1hI1NM#D6M+1etw$YmN4#&AIiejnW?
$?epYF iLWIV1mGmHd&<c!V%kRkX>j5TZkZLQw\<C$?u1=H6PH^T^4N5aVmqqWDiX*qBmh*G#keFy*#6H8nhRD<
pQd9c1 1WTR4IRIcYYAF8DJe4uHW9aBJ8R4LFkXYXbB&4$RDdeKCAuX%D^NK%$w+Ec>mBXR>9k5Fd@K9R/mCJ+X
b<%?\K +maR5y9tbj<MJpy$TRC+VVAR&^+Ik=PFKL!XBd:jFbD=G1%?ZcHW4?%ML&^@t*nS98+V6Cl@<ykQSkia
&8N@n$ G18C=hHB>*69pykcB+qI!M:pitB#pN#R+$:8qkW!n=/a/nTLktR%11dyRkc4KTP\^!F<H&L^dMp&M<8+
9JakpC QPNHy$Xn5YVewmPdw59*MJS*iKMc^YeSP\J:VENW9GnDYM6n?K=%44Yb=m%n\w/HCuaBZD8AhlMXtRWT
B4JG%k V?:<?FEn%%Yn5a<VNMYtLbERjJ%nyTkldlimZA#AE%hiLV%$GjJ$/5It?S8H%bV\NuD:!<#>et*HYFey
M4H!$c hcByT?lV8VEw=$NlS^*XIAH>+JdHuiYkmuuw?QqQ4V\yucXZNTkpVa?A%Bkb!>aVHBe%4&*m^DN59Abc
\#YJB/ WXm<q^&5utT/N=Ny8&<\l4VTik5dAtdi%@GwHVGmtWVDQ9AtLpdX4qlNdBL:%NeKjHQMP?T9HRVR9CaP
d@Lk8T ?eDTt<VBRXh<<w*66TM*N>VHA&WH!YK9F1<T*4DG*ZbZJEZ9y$VZejl<QWALDmZHykhAZLuC?XYV/JQ5
tNC@&V wGTAF@wlmw8JT>GeCcaa!e/Kn1<5=lAX6GGIj$RPelN*IdCLG:dl54NS:IM$cD9KFNSIn?Mt=BT<CSH<
&>k$Y4 GM%8eZBy6Su!n=P%@>6Wt!H@PId::$dd<%<?W4G*<9!Q@8Nj9l4!d\<Rw9@&+N>8hSKG@6651DAWJ9b9
Q@Cu%l D$V?@yt@*@\pDQ9:N+L>&<tN@&dE9j>YwQ=*l\+X?e*NV=B@HN:>C?+hkjlu>+/AZ>t>@=8P?e?m=#hL
j*VLHG 9u@@<X#Bu9>t!ji9$QC4$JjMQEB?5?V:X&mSK>CZ4YXDj4Qp?%hw5c9Rq>TwId>b<9$46QAX/M61%JDj
yVlW9M LQu?Fjw1Yd85Sk&B\@/I9p4YLq9Ll5ASj$SjJY5R$e6?c1J@SF<qc@@/4<B9ceSX59c949u*>FY!B4up
1m&%db #!RkCMkj$XjJ&8Z??^>Zj>D@D9?Z@999@iP@?Y?^*&^PR@:nH6C@?&>S+j>dS4:!=9TM%j@$#Yq/Cj=&
n!>Mp5 GAE$pB<^RaT>\LC*p48lBRt81bn!EAwAt&mAqYaG>M%BPWlG?T\5J<$AG&1k8C@8I@MWRNX*a\4b>?>L
C#VCJW $*ytd*6*qu@k!$QSBp\DeS<&^KRDct&S<5eJl%B5:WkDVZ*b&<#pd461JBMk1/%MT1n&Bpqj!JnF^Wpj
$WVPQP Jc?y!6nE>lKnc6#haaRMLMn!>pCehaRCy6YKk4G%@eW>uGcc!4ajtJE:WqP!FL5Sn9BVI4VEQW<P9?L*
C+**c! %FCyehXY1R?k8kMtE@FbcnaLl9jZuJhJ^%wh%YmMBl<jiEPQ4D@TpNX&VHyl!:DuB\Pd8\aD&q<pLJb/
&L#FFe l/&>!enynM>kpnRlqiZ*lD=1$wdWkL!K^!kc#&tAW<d<\4L8c1VR=tT9ahE=MhA6^aFVJ^H\Yt8eM!E\
MqF44l Xc6h4HW&jhVda6?LB^pmkA#K/9jaGcdyA1<qKYF>X+Syqw@4$mi5N1E1ljX+uC@wCkdXu6Dw/?pX$1KH
%1ZtMn p8!GRELjFi<RmKqb$Kml=#&GN=l?JJ/F%kA6:TYykhI$<=:*CA&nJ#\pZu6emJiISu>aGXdW%Z4N>*/i
k&cVhC EkYkH&Q&6i?!1lm5ApiuQ?up5*&bWhGk:$t1S%@HNK:lHny81&Lwedb5PnJaG@K!j@\E/Q1t>@Ecu<Hc
FV+?+? DS^NFdKkh*hcn>FPtDtnw=5pF%L&^&$m>jAXdhBkRmjL4@a+4KnE+=Gu1>Sjb++W9k/%!ueFw4@9PP*Y
S<elT/ HhT*&H*Y>iY=S^T6I6ZSeaE/J*6p$=4buJi@T*HH\!Y!XVdwj4+6HlMB:NwkHMct#KT%9RK#!^WLZE@*
iVKw9$ wl^NEam</PcNL@XD8WG=6mk=WkwqTZB=MRDFZJ:t>9*uLFky@bEW+Se$l:P#PQhSDq+M6a4SFPRV51dQ
<@WMEC SKidmSkDKjpyAM:j46@Ky>NKeRnRHnq=!^&HyypSK+V:D!:p\<k?GM<qlLl?E&/cwnPcbIhwnW^1W!Ca
PNl\AY M%PCS5P&#Sn\9Ph5S#ckj856E+V+klQy4M<pw/LbA9&LR!iCBc$wce+C\+&YGJn5+li#t9tSXG<bTPI<
NepGtD ?FN?<BA\j$69M>ea:RP4/J&N6bP$*><YWISMaB1yTXj=:b?>aA#BPuBT&^Lpb@N\i4@F#a9c^t:?qP%1
+8:bp1 EAZTy48RpcYjC&\c9J!P+uw5ZW1V*>J*W:</PYV$kp&Y8lA*K:5\4uLy5i1!AQtLJmtawn66Nb=im1:?
*qD*:Y Ya!h/KlwtC$%@a1Bbm&4E<@5Jw66w&^emF/SdI@weTGRRH@+^ub*L:1jcRhQNVabL#C5&F+&^$STMe@$
luhcaD X6ni?TCBmLwZ:B6W1%6%k/jmuy1JYPab/ZYceGlBh$heWT4nWN#!4*5W1te5K\#WI\\%$EPJHe:Z%/lp
$Pt*S< H**Lt<nQ:uk#4&VYq&$iYT&u5V!m5EHKc>@D1uB9eY\\dktwy=Xu4GIy?blBXAS?4e44FqJJe*/iV>b4
@?teAL X9mNFjN$dM+#d>CdDl:AaiC%*Cb*+14pEy@DaP&Q=yYp@Pj/p@!Mny6bS4anN#Iu?h?<tym!qV8dkBK+
8PSCk* >LaYHh8a>ddX95Z5e?bFqY^89T@!lS%nRNj!SYkViquRTWaZ4yI>IVVXp@!6yp99ViP6mi+w6:9d9uSR
^Jtdj\ +FJnGC$/X+qaqk%#cD1tt5NNLMe&G@YI#4!AKRkE1Z:K@lw99jD\#mQccJdwcaH?n#QZ*X/y6KG<ViIS
+FEF1t *L#:yb8HGJ1ym1!?kjP>CaL<M=MSYGMa4\dy4kyuqujHGcjD1^L&yB=E%?&?#yBFQ8PWTG9nX$wqR4!Q
<5cawB a4Y=*^Nt/<#b=*?$N#>=w>e#<+TSImI*=pRXciA%Ab!9k*wCi$dVV5*/Fk#SjTVYC^C/8TCI^YaV><JB
Re?&n\ 5j:Bk/!/nVCSewV5jlThyyY:dJY>q=u9Y>LSFtRPRR%M$jDu5d1Y!:MIS/1Cl!wJE<*G&a/FW>y#GShq
nq5J*h V/JSCq$+?l!5i$Z<KlmKTIqdAwLn%EG*?/5@JnIc5bHFQYIiXWTa<JnNSeI?@Cm$!eHeppWFydyIq!X<
RPLy1@ m&nhpqtI#i/T=*?J!F\n1**SF*PQ4Nk!c#QJbHdQCHWHX=JFT<L1thL=!&GBD:i\*WClNX86d@qQdNLD
R$mdRE E\SSLpVV4WuBFKpb:IDQ\:Wie1Qj4l6D16qll9yJ?Xd6h!lJFh#4ulBWhW6DE5!<W=8wuGb<C9h%J#mB
j^tENj in:qJdX6A=S1*!Pbmcj&<Xd&ZkYeGdq4uRbJGZc5hiX?&5&?Q%uL9JcJ&!\d<D\pm*w@e4t<<eZd1hj6
%i%*N@ *=*!$u%FJAMAt4X5yn\kknk*P8X?RXJ4q>dtWL*wVaeq$RYuQIk?@DPe:nb>a@ik4/&$X*/1\TQl<LLE
JWTd#K %\qba9m*yAyy1j4ImFH4qdnBqp/1PC+j91$>MnH8q9!CEle<8<byS$XBkk8&B\YM/abIVSS?jj=$+eZL
SV1SZp TDRD9R1QuQwYa?S8j^:<mhcIm/ji:tw4D*hbR8/a9c>e#bm@ab9ltJN$^wM$WaDYa:#:ijjJ&B\j/jby
-A%Xmm 000c1a901f2001202b3 Page 468 of binaries1.zip
4!XV/Q Zu\y48bSi!/TXFp4Wc+WTV8W@?mV4k%=m\%b%l6QS<WEP&m8$1uA&=jIeq>%X^<<Xb95<N/Jk&$>CdYV
j\IlHA Rt#^K@XbF$&1qbJj9Yw@^#YyYt5V/4E+4\^E#1\BSLAX=w+!=YW<Kw#RDype8waZdRAIVtYjku<b8phW
clM8qB uXA<ACjGHqHRyXG\@kyB\:qX49p9>QLj^?eBy?iw+\cyaekZZ1Q^yd@5Y:Y41Ry%*TiN!XpFSHi*yH%^
$IVD%C CHRASHbJ=i>I6yP9BG+Z\kyJ!MJ9EA5P\dp=J&K6?uJWmK!?Emuap*RLX8:+\Q1CjiKi?QQL!PYaVC4F
#=mL6\ pDpBJ$BGiS8F5W4=*!MuHlI+kHdXpph/dEPD=eGXnmR1^CE?1uEDI@59<AYwuQAMVkkue1%MKXAIqI&B
6I=q^R N#9nEHnLc1YPRtwqeF&\:aDSchtpmJD%YZEbmZJ%Y^t&yIiLl6iq5D^!jGlS=+B%tGLSRm/XpG*Gnqj^
m$6*E+ 4VLn\@=cwL$4ZX=>iSlLDeBZ#*?8j5nGZ!t^PnSa>bq+l\c#JI9L%?JKFX+K!+P$b=Xc<l&CEb5894^h
%&j6&D e*^8=%#u>kwwT:pJ%hCt*1lce@SCpCX@m?!MFD1Q1pijtt8WSBFhS9CeuL#&$Wkulh8PCwwK\>ulZ>t5
<N@!&N m8akmZ6BGwh*4a8A*EYV8I1TiKYdqy&=$XdRXeyt^pHbp5Pq5FT=JJ4#>clSpKWw&iIuq9D+a8Z8/*k$
e9$QXB I\MP#q%#kjbBJCl/#H+5NVeyphZAEG>V@9b:wkQ<c8ISnVn&y+:%J>9%HZ*KAYMkB1IMD$G1F%Rp?S5*
D/FGwu TNjW&paZI@aQ&\uC>Whed=VGNMn6!*QhLiCyjN=QylhBH/WGVyNFJ:uAkNXh>Zbh<b!wbct&=!:$Tjb?
QPJwHT D/#c1puyY#a*H1IGPFmMPAl%lLd8RwMdIwn#QSbuRC^V&Z$Vm4k@8TJc:tR4K4La>iE1+yQ/K8Gm:4Jj
5CGhQC /ETKp*$lk<e!5&pmFI+MhIMTqYyp8G1RJEGh@CSLJhDdEE%8=BE@4!caEAyV/CFn6*kD\@GE!TZi6da4
TZda5^ >hRSlS4\b$yDPu9BT!QTLI/IlPemSB<jbJ9AeDyMCLK@5C#w+$pBHhyJMn?/588ai#/FEXmKcldA<#aW
:8kppn k+Q8WNjBEqKW6q?LHT*\c9LH!^SJ4t4jk#464:<R&%$ccE6Q^^$b*yKeb=9^XDhRB<pqYCjL4TDQB?<?
TVtB*M Wawy6N\A<kKY8i!/=hwci\DNESBWX+<#XXPb@JMZ5W$jD#:1qBK#!epa=T\?LlYmWp&D:/>%n\+<4S!?
%>i9tN GhdJ9!F<C&I&^LLK=^DERDlJ$5?umHGt4@WaetJT<4nPD4cLyTT>VjGhtE!V&PPte@uyRBH?S&ZEwM4E
:9j4/k 9nX\iuCmiy*>5be:Zul#CNLqy&8KFj:Ei$?TR$&cjZ?#/J!bb!GyPJC+?\P<BDlLbCX8cehkTYEHL\WB
%c/RJK eqJ^PCucq189*%9\SKNLnp8QN=h=8h5STM#aEBcJ5nW=\ZGwZR9T4yNk1mk6nAG+e5Z=+5@W>>Z1Y9PD
e!u+i< cHW1<DG?*Vmk<dp!^bFy%&ah^Tebkn8wjN!T:i!WTZAmXa!p@J#ybk?Yn^+d%6nH+tDc=ZH!VIE&WwXK
w<QXt$ h9>q^Eh9YbM%6XEc/#FD@B8w#c&QQIejw<a?DlNy+M$Rha&w$K!SpEatBl?Gj/FandEKqLY+4<\wqD64
H<9XVQ &mW6S+KPh^NV5&Wh/ctX\WP6\/PS1ND>wJY\^e!I\VSnh94TnR*upR8ap<H>E4Lku5X6w4Ya81tTu5Ml
1$mc6R B:9aQGu%mdEFT%ciSR<Jdj^$PEq=$EdCy5\&5bIJDQLamWbue<lEZTc*lN%*6Wk:!FR@qC^L96&ldpb?
Bl4yD< hY%FQutwm\kwK%e>YjnAe6<!^CMlcB?waKWcM&Q9jSG^EStq65k9YJ$Se*=*!qeY>^E$#^c6>huWdM^4
n1>>HA *<4c9pSAZR$WJG?4DEZV*L=SbcXVBpkh!RWhlPbB/k84cEyJP5upGDEWY+ZFeRch@GTHNw?%@PV*R^QC
11:dY\ >W1tyT1/=4yP*=Gkl*qiK%BWb8:%1dBA?\I>HHq1VbAuMi6ihljCC=Q1KDt\9pF+pib1kQ+yL$dEY4+5
J<9uHu p/8DbGK>/kF/X:DpC+/kwJ9m4aee+eZLG\V4hw/<y<IwZqZ@HZX<*Deq%T*FtPCTIB:K:ee^h!?t6QtT
NNKNTZ ?c8m4Ay6@GCJ*&>aDpmRA*X!%/?VeyIy8ZKM%TaV?6Xw%EwZ6uYF9\w\R!<C?XX+uJqa9>GL4Nup&:#y
Tqaw$B Tc?%\uHR1MF^&L^%\q1pJ@>$aD&EqNPyi1GNR=6+5mkItblGKnYJ5+FI<jlmiYt=?^?Zi9>j>?L\j^Y+
1=89:E I9<na9\jS+D@t&:?&!qARy4iFq=@?@ljQ!9<4>dC*Nu/9#*d9#!Dm/Y4qd&LLR5E?6<q5+!=y@Zj&H?X
1JBHhc *S:&%l:@?dqE@\jX66k@d&%D^K/<6j%*$@JQD8e*/89jlQ<X=QS9Nwn@Cm%<Fjw!YjtdDiK@RpP9Rq<t
5<c<qG K*?#Rj^ZcQkXcDnmMl4^S:VIXilLV!:/S@SX5kc::PTm+D?m4=K%T?Y$KPTQ/K6p:hKFEFHaH>FZ!h1q
wR:%YQ C!GmmD?m4=K%!^c4IcKmj$SjJY8ZF5QF\H>EZ!X4q&6%5j?<h@%*?L@W/u>9p9?4XweKm@%G1+9>b8<c
Auu6LC BlaV@V?tXt:^@@G>c=pDdy41<G*^WBymy*BZi6IAPc*Y<B*LNS1!WW$VTMn6j8RkkBS#VkQKW6=GAJ#w
=8PJh% Q+yDdlh9C/kPpIyI1*w/YVIw^GPNVkyh:Ryb:%dS8@L^q^1eM<EQN^^wXAPeEZi:C9jSkkRC@%=J4:*+
mWt$C1 &@K%Awbm4DtdJI1=uEcBNMZq>XC%1ympYJdWCE*hkcNJ5/DuQlw14&Hq$TiSPB<?QZQM8<aICJCXhbuX
A\#8k5 qGX>nT*yDK/4P!w%F5Y?qlY#GWK<!@QXDEA6M>d6kEI<nWlqVi=WbJWl&418i/ict#&u$R%iQN*aAuhC
l>y<$e ec\nPnY>KVZdqa\6pRXJyZLF8m4em*%TYdIpnaMImuaLVc@6!6bwe#YDj1qTitNNlcy#u+!TiJXB*V\H
HaSa@K N!iG6:DH4LHV\4B?Yp*L>G>!*bN1Q1>5J>*eVk9u+E/9MWqL=$^DAnGeNIAA8</E?d$8@q4Nd+pd6c4V
qDMl:a Y9MIad*TV>+4+=Zwq6qT?p/cC5Q/d!I&jCt&Wu6MjX5Dbch*#S6h96k\$%Scbw#WhaFI%4P&y#/auAJc
8H*\=c HYHVP#6SyldP$pnL%E:ySDM/Y^whEj*q&1nS<6t+h%6$ZhT1hjTkb$+/+\jde8ajJ&el1>Mt\41MQX<j
Qm6j+S i+9a/hXAQ5WL96a!ui?m!$/lIZHCLu<Gi/KMG1NlP?aVTqqTJa<EbNX:^iSdpc/F66yG^nwdyBqQJ8hL
49u>d/ DC&e9eIaekA$<%S6@I8>wmGEtXR1t&Xc>lHt?D+d/TyGXIGd:?dy6aQNDAKRGk/>B4Shp5yy!t@>YP4c
XSZ/u? *%F6jdwY+WyYhQI&TBbl4nQ4A:eiFbGy6PlZyYc@u=jJCEceAbi8FTIFHw9R*S<majHmX^&S95=JwQ!V
%FdW#I Md:Ewi#cdJ6PjR<q=N&DKH1cHMCIuhcHGAK!<MEGkm*DV%APD/K<h5bnl*:h5Shpye>E/$Q%TG=@FIka
56=FRp hmEWtCq$XCt$AN+ikL^NQDV6**RqI$+X8X9ybLMaWEFWIWyDIN>Fkk6=DnbZi16Ma@RCG^RKhd8w9EMp
NEcCRR $=XwYi8wGQGlLd/9ljXl>=P5jHw&at@/Ah/9CdEDCL+y=TyK\/$IS#k>G:jFX$+DQm%PM4M!uqeePRbm
5!+J\n V%#Nt<1:5V?amkZB#mPNVTEm\kqSHXB1Q+SKS>P/#h*$J$l=Cjn^pyqG$NF>9tj?!X<LHj6dwAJjB5Z4
8/c^I% eAyJZqa*YAt5$p5WnZXw4bJyS4%=\DePiHW6ckNdMnDhc\p\bW9a#</4D5YN9A&NK9q1Td/TRd%??t9a
G4XERp <cihM&$5l&JLib8M1LNb4>Q%EV9H1YBkQMGkGAKPd$69tQmKa%XMQpSdSdHt\l>pdbA$/VJ6TTG1&kWB
HKmSGI $uXHat@RcBNRLVJ\duRajy+di1:?yCcH+apHuh?ZWL9GtFSckF%R4tn1S8*PQdqZCKNbX/\/^=bE+%y1
DhQ5k> j*!&c<l=W*IuktuB&I$51a^ib^466t/pLpSL$m\\tYL5tH48/p+=Q=4/ZB*EX&WJnw=Skh&ViRd^9pQ6
#eTR=J i+ym1*!6pXVw&G$?pJy#?E:HCABjw#p%uGb@=%!1W4@t$X#Ru%\%V@BYiuXYStDC*bYZq?w6H@8kRN5P
6@Fmde jhu^STbb6E6?h&=D6KQu/>/8\TBH>@88A65ENAHnu@D%dF^Wh$*4N=wb^$&B\>d*C==*4e^?V:WSDME%
6n5aLR 1YWMqn?PEHlt5ca/8VHCdZjZy6>w&IK5:46B5h+\n4cR\$SuFp!tTFXhY4#6Gk6uT@YCFc?ubnG5JYh8
j545#5 SeGJ>1PF:q+l#RL/pNRih+iM6M:KFM4t=:B:alIXel?ANtll$GaQ8><Iaj^G>#/HLXT\SIbBeMQ5!Bu?
:k^C@d 5MkuLSbXa^w*QVb9L8aS9*4!RI+:<I+qScSkC:*c6NuljBYu!:wekCVqENypWuH#!jS%*EjMESj^RQ*u
AhHS1h E96jMqS1*:hKm:AqY&t>6qdcEhkMiYi9qQGC$</#eZX!EJYAn/WcV%ChWyh!\F?J*HG/NYFD4bLhNl%E
inKIYI k^X&4M:VaQ$kETaE!TERdLYb+RcJ\qkH9YI\<&<Mqhn$RL@mZjtu4=PIeI:Y9y!1V56k1M#nXu&T?qdS
S#*4Ru mN:JM!w5ECJXVB<1$EJmNTJeJ<Kj^c4?WX:WlA>^X89&m:?!+inF=1ujJ=%d61=h4=TZl4du!!#9$J:?
9\Jt5W !*9JXG=8!FJjM></yAA&t8:=NBJmu^n6\u5p:+ybGTm1RyL/&1hTc<bYZy?YwIN6PA9XN151FYB89uu&
JJGHnq ?H1ASbmJ#4F$/Yh=Q=<*6R6t*>tk@iE%diX>*@Z=p+15jbFPVR:!n#lpFS?/<@w591q4QPG/k$4nhIKy
Xi^qqd T%RdnMh$TMT\N1ycIp/j1?T9/JplbP6d$X<ibt?uEX=:Hj?JI>6lqLn#SLT6wWA>eWb9DVl@ucjTeia%
1>^Fc4 6+B1!>wp?4FHV1HSVa?5IadSZN%R6?LBpM&&SSH9598QDwIMmF4VFGd9dhAhBDb?kA/qhm^XuY#9%#^=
t?JVQq 1@ikRltdEM%4i/iA\cW9L+Ie\ipQ%*96h1#/:4b=WMIw*?d#ni\/5%jBBLhpFNJi%>59Id<KlE!y+:%a
<TBe5Y JyQ6JqS+M/dZ8hV@VYe#EYCV&PHqnH>!:>WTHPDCQjB4^a&*\=8\/?ZcYbGbAZ5p1455iJ+pw+PMn5X%
:^XZ$# :y8>HV<@T?p1w5wNGCk@Adci<P=eC%SIBkCHZm/8XERK+jenhZ9L44Hy1jcV&iiJQ:L%KAkhk@c!ClcD
/1S64T Qjk\\#I#Mb*bqZt%n/\LA?XV<hkI<WlCQ<Wlcp6@lwTy4bCm%wPHAaItdu%h8ZFF^JFyR@bt\ZH5jK8e
BmEMBk dYSTWDiLVMJB9JE?D#+%VR4J4hDtX#*&?JZmi%9X1bXnB8GlIXHKVhb?/b^hFZE#qY+^tH&>Nyj/QSY1
9TJV&+ B#q/:aYX<!myDwZ#ntK:+LdtBbqFwuBYAqBqSYH/Y=DwwYwbkh^Zm5%PpNVHqD=Bh&/*E1e1tn&#tDAn
QQ8k/E \Tw\&B%69DXRy#=LP8Dp:<SCXAkq&pcW+Y5lTR>wPTttekiJe!w%:j!K!G*5AmjiX>uJ1<^AbScAIW4Z
\cF5Rc a1P8:Y^%hTnl=nhDdV4WPQ8<TlQHyhBN?E9!jA$nmtaC/!S*eBiRFZ1#adX/IAP>5MaSp8NnY/DA\aI4
-AaG5\ 000b44d863f001202b3 Page 469 of binaries1.zip
:Ze?hu GQppe<TwLD8ie8*FMpqPAc\kBMHY+uaePund^jatKAXaiQ?&+E8tWnRA/MbjSGNK5KZG=cHjMTBa&yiN
4l$ZJj yCKuQH8=Pu?:SM/IQ>R$^NeEThYLnX#BeXBnGiTMX*Ni>XMhCM\6Du^wueQTGh##dJnLXl#5\GK+Kk4E
4Z=D/8 &GWQ#B&YMqy?Ae8%!%lX?MnHPpDBjti<jpk<qpiPLP%l@CPpG<jXncw^nT$e8SWqXM6P6jI^mw>&>d:I
?G@B9! +mMn=W/w*9K9!9QbN<X$w><PIPR><R$$mk9XH\5JLyC=Bt6VM8iN*J#j\Et&cTRYSy!44Z#\6%MhqSR5
ITFZPb LQ!!LKkZ9NeiWylVcVH<#J&$^JC6EJ*qZQuIFt#aMqdFFXp:hCwEIBRl6#D$FBXhc/whe4*J+mT\mAW6
j\T$uQ 4wSTdeAQ148+c<@&d%>HwTWhKnG4njL<&WKnkceCpyk6\P9i1bK6m:i1LP&<kyQnnePP>\pJ55j\B!aQ
m@h:q/ C8/\+Yh5KaK&4jTIdPKLh:=$Nk+Z+c!P:aCX6!c/y<\I9eYRqt^84A8Rcq$upEB@+1A1#pVqA!GX4pKy
#NtGXN 6X&XjPl1I?#I!!QGR*QM+aR/<VZHY>t\l?4WTnVX$&L1T4IiZd1^=8!XH>>P5J?SK!9keS/H+J@8?9jp
N^a6Z> eG<M8nqcIB$L#c1?tID=J8XCqiDItT>lwtcWIEwHMNn?TR%NiV@98jY+=H%4lCwaJ*WFA*Z^Y!kIpe<*
qGuNEi YWE9/w=G1\CMAM5ARb/+X=ElT48tKD\^^ayWjM*!G1t8Mm>8Ajb9k6FuXhcqm$FI/^bH8w$MRW^\\cBP
S<jF/\ QH?NW9pWEu^HTYd>Ll\BVc\$A#64%pyFCH!De:=n*5MWSZ=VqZLW+9IYQQ1FmjDGVDLSeKykAGP9alql
<eiNnT *8+AIZZNC9w*u5kH6bHJYK$nmQiNQDuact%=kRnG%RPP9/RAPu6kM?e=>PN8<VMk6uK4+D=ly%\1daNi
@9>\>@ \VPbtJ@*8e>X8RiNeZ>8dcqCPHMkNw@Eqc&?cd^n&!%NL?Q6malbXjTySZ*W4H%EmDNtRDk!CHFRVen<
1iJd!J 4JqdHPdW85jmiNKT=n?$1ZZ<kI!Wq6%wbyJw5nd:pYK<yn6T9?=J/le*#=y=1&jnmDW!b^<64B!@6@\h
4RQnMX k+Np+/%VM+T!i?&:i?GiBnHL8q:LkCGp+$F?FdZB=pcV=bh$Zd8:JiX#8eSFnCEhAwm$uk/hWQ6lPwJ$
cnS6P6 IP5$B1Gq6#Y\Ry4@yn6n6@chN6\F*Sti:6M+At*PYTc+BeIH%ni$ViXY5buiLtkG:TuYI5uX&4bm+8Nu
?m\W8l k&TYC6KC/9jR:dJ/&i@%N64e?YS6lu1ipPY44w<cciH1n9t/VL:#1BT@?=X>na91eiT&kT&XYw&/WWLq
<C4tJI A!S85>qaDQiAAW8Q?Vw%Ha:V/pq&w\lad:NJh$K!H&h4QRV^58T/F<:WF$6?RnbVE?A>TNItFW4Nb+R:
:Y:^Qd !?+&ehub16Sa+<HWN1hPR<l*#dImFJ!:cZ#Z$tIZTamAPw6Y%CAFM$6:cnI?W#A/JDN?#y=HmN\$6Fy1
$MltLQ 8w:HRJCN^9C:nVmNW8*%nd>>tuAlPN+IbFpJ5&kb+iPVI81w%eL=T4&8!#u%/6uyjcth!bE588%Qt6/b
S#9N@N &GlXVW8E@cANtSbPljJdaZImh\eE/Gn+Z5YEn^aVY&Xdq6tAjQcYRhmHRK8Q4t9#ahGuWE?5Kd>wlh^H
T%\Qhd &F+9T&>KQHE\/m^SAGPGQI$IL:eA%<6j$<5Z5H+dYd#$JLN9nt#8tRLB9aaa==MeW%$M%1w66YQcHAp?
cRCCN9 uIl?cKZKA8EtI+m^d9D#inbnatXtmnVD:A8PED@%G1hjq%5^e+wW5EaAX=XM<C:68I9B@4ebclGD@+<b
bRFdE^ hTlE?J?MPlRC91yS@:6p?Th><^6uJudX#Y*Id%cW@\w6ilZ/Mtj&t^Zq1>QR*/\w@+c?^JFCj:Pm@Fhw
m*jRjt !BXw?CWVFNDj4Cn@FSy&Bj1!8nj$N!9Kj+Y?T6bkq>VewYCSQ/K9pnZwyTeZ?^Nc?Cyb8&^1BTw5@Ej$
NXkV@8 XdIG8jVp$D?m4=K%!=\+XBn?S@SX5udbHbBRabE@w1?T6W8NP9RjN/VR@\:@q$bh:D?5bpNlmH<&/6D@
*$CA/8 8C:%:#hImpD@d%H>/pX%8@>qSZXFDNN:<Ai$PDDunmW9mC**d>QbQ9>lPq9JQQILX$$R1hbw*ZIy^ZR>
+Q:#Zj :+wy1K?mk?E/5FLKumat%6?iIWTwZa?8PbF91TcERq#m?plYk1q<1HTqB+$MdGbh?l:=BKpC%*DLB*J=
YNEKQF pB<=Wl/&kab16\9wFIi&TnZRADZ\Xkt$NH!*^EE$Kmy*y!1n/TjIXbq9/CN1<L1SZCXdbjCtkh1FW!Vj
M1tS\b lwdWcPJH\DRe@Fd^X*9m>/WJ$kAWBbM<ZM?YWG*C18lcHS&em?RiyjG\8nVX8++J\?MtyeeA4@p*1I/9
lm&nai P\aMkPP:?D@G94b4cndD=uhq#GZ#lGq16e*R%@Y4tn\&!^K6?1HF\%HMDAYuPX$ujiRdYaAR*Jh9qF1j
cZw:n# %ddHw:A?/Qi4\:KVw8yin@b=bh&<aCM&4qnM>Rl^l<e^BQC!/:K^dQ!EBwci!<eV/phih<kR#&l9CD1W
&P^F4S <Z*t9jeq/a!8L<=K#K^b\Lhj5#%F%G:CSCm^iEL1DFHQPQW&td4BhXh6Y5$b4te^+am/aAcQbMYMG4S>
KMJYpt 6=HJ#?9:V5M<=&uJi^%\LTd$qG\ji&KGMLI/1T>%F&TR$*lS!#mlnKFH5>aeL#\DE8BC:%XbMW!+5Ttk
jG#qp1 8qS84+@LGGYkFu!C^4!1QYjaI>*pMC\lS\%wnwk*?dqMPuX9:@E1/>+6\dw#9N$RA**!Wqut%Rt:N#LZ
GDA6\n uB8WA5*wZ$ymiB6CXp4RJd#PG/p>I1IeN9P<IXitRRQMDZR!#t/5SbTk#uqp6y58An8u!tV$>*W1Cenj
XaVK+N XNLRZ5PwtMj1y\SQ/ABV&8c5mIIuwDC1MK*iQHVtKHXtm!$ktpuLWCYj?n15+#B%i=T*+@Dt>jZ<BFbQ
aGSAKV Pji?G%JyJ&cJa/X5BJ#9QGp%VZKTmq8nqCXp\@AQ5$dilpAQNJT+hG9DyFQQkFXinJ%&a&&6SaWcn1%>
FVZ=#K 4$I*/lNJqtWhZCRd8ybCJ=yCbAV6ZdL#<F6i=d\$EQRjEGeVuXH%8?>KemPTEYj4TVI9W>#ibl@D$j/:
:?dnK? >LE/W:t#/VCe9lZyc4KkRVHX*6B8Y6c=S<KK!aCi?pp<R/i1=\1nHn^%N9*Z=F/c1iPmaX4MDB?c\l*#
A8F%BP t&&KFdiFJk66kpi!PIL\eu<^FP&dnWRT*/=#cNIT1$yei&LCA@eC$baC8WdEqIyPPENt&>4$B5?tSL@N
hi!+ae qhm&<aD/W=Z/wT5PiAddnyYI?*%=DYYt&BWyF@*5HpZIh6:=X&M9jcYSd*$=dER8wN6hIpPShGY&%V!b
ZAe*F6 LbP1lZWIy4k:ZT>mw5ji%+h9M%E>THjj^Im<mj>m:BH54blHP#clGM#h+HyQNVKIl:l&nW:L%/e4</=w
\#iY$B nV/bZqcluE*t1MaI^wHZ@p#dM>yNWJ+eQj4wlmVc\btXiy>=klTu<N1el$:w18k\61%+W:6Kp@aqc11Y
dFtHF1 H^1^&pPIJ=ihNQp\HHLAN$Ek4DA^V\\uVbt+1=*iM$=QanWMV*\H$DPiy>\\&PueRi=uNE:eYZMuQBh=
Kl>Em< w+eV?8tS5#!9RBZm9qHThc15?4CSWcZ4P:Y=yjMeNaHnyX:mDunmWhqWEX&!PPl1M?e?/e@=iaI%t+lw
MHNJYm KXeE4I>tZP/F/K*nu?lTalWPR?!mAj>tFJua\>IZjc8C&T9GyEZLenc?4k^*lmK\hI9netFtL&:ekePh
e^!:wN /$T&BybiuNkBXjNmJqhp<4ei6n@T&CIQ>Q?C=yP*#HJ?R%jupQ!aX=DJLD?=91RG$^X>w>?1V*+1qNE:
iW$&W9 m85Eu+A&iGV$+cmMa^i#S9iwYV$uiZmd4/c!#4hlI/IM/*Z<q/>BHIyqHWWGEWDc6MlBKE@LjM!WabVK
p8JM*P @bS#R<Z*CaI=:W$n/$KYin%l#w@Cab4<I&Kct!qcFtTbD<A\RKJFP\l=ZTQ?qekhJL*neFWFeR@L8Rt%
6E!Zpj !duTCZ1IS&iQe<:yEY+HFL$+VSQwd/dA!6jVjP4CejhWy>?bhKLYZ9:V<GKJVIBnqD$=@T1Xbt?J^9kn
Pn*MY^ 44^4dIGLN4/+YW5GHW@eJP%>#4WphYG&w#&L>m1CW>AW$KT^\ajJ>NB4:4cwMWYGII#tW=*cV*dS6$Xa
RS@udE p%&nZZ\?Ai&!NI&/>q@c$$aBH>$E+u/w6y5Ejuldw5i$CFKd!Ze^l^N8pVpp$bMkql/mYaaYAF4$\MVb
8Nh?W9 jDmX!/8N&q&Q^WZ:ib5/bEEHG=t9q4:P>Fl@5F&MN^p^8!JHIkW:nyT&twd6XMm&aY:J8\yGD8hSSW?B
=8a9Fj qhJeP%p4+1Y!mEdbbQK/ABqG>Idh&T6X!ld&Y+wX*GJH+m=BYh^DH81JqL/*TN/<<lVW$$\cE%/QieWI
I:PyiM 5WY5>TkIjVBKVcn<JLXtLE?&w5V=W@Ba+?ESLhZ^SuHW@Zd:^HjmykwQZ6\<k1SKylP<biT?^n9i+bnc
+L:?yK pmu1PdMW>V&*G:%:G!d\Hql@+Yn@bVAZWy/t5#JByVY5Gutu!<<lmVYD:kCVR*@Htiqy?R$S6Nm>#phm
6>&@^j @aKD\5ik4Lw:tK@5&+u*1ENQd5<dc@hq^uptPXdjNF=i!P%?Jt?WbwyWRHB+Qj8wT\5L4VH:j1KVJP#G
khApa: W@DyeijDw>H/YP645mX4#&@FnZ9^kkX!EuFJZ:*k:/thVB*H@pm!u<pI5Y<l65b>%Y+S^p<Z8k<wX\NZ
uXayq# YW5&q>>6Zp<b#=&a+M=5IRADkk8^^C+E?D9!QD6TQD*/\VLt9V%aJSCi*S\BCCQy9*nBRd>88j>!M#p&
=cFXE@ V9pw\mP6iC5K5ILiXH=iYHup<QEk\kMlhDNtH@cX@iLe91hM!8aEV>Kqd=Qkm\DlJ8wkJGY*i?<DwTIZ
>i\Smt V!6l6y>!YN8\=dtiP9e><n%^\9kX<6MH\?e%?:Y<wG$eMFX\JjQ!$m\8=%Ne?<a>yIWtn56ZhRekV%yM
1?lQ5d BCRh1^\Y\i^TFPyj#Q&J8#K%TEimc&K#G%CCDn$6<mkQQRL5^V@V8LuJw<Mji=*RRSJG6JaiJ>qqjT/u
V#9QBE ?IYYa!Da*iR:#=TJB8eCl<QSb8X8Z91V$5n+WKQ+@eRW\FleBTytQ<ZE%RE::EnL$p>I^Lm*cwNchZ5b
DYS5V$ b*Zk55qakhnP6N5la1L+I9X$&#iK@ByS!PEFC6HHp$bYqKlL!G1$?+tydCWElWQY4uiQyFFc@TtP=adt
$wT^?8 N8<+iP!B+&FNtYR6eiMQkEW\^<$5c$SYNa$:Pn+Z#\#$BZtQ5FEu&!JhR>pVb<e\yEuq!\FbV\I=iGHC
X5:jKM JuJ+/<t4ISAdRiAFQwX!@pnbZ8uu:PJ9EE5Pc&/$M9dNAPN5Z9BZD5T^*S58K8WMWuwNKlMuY^#V*CKC
L\e#kk EtL8QK<P/^5*q9\M8\&ABZ!<aR:8+c9WTt+XaEkl$e<aShZ4Mb@aZT$p@L6^enaRwS%!dlDRmp/BRKm/
$Lq?Zm ZX<W?W9KIBQ%DVQyQ1ySX&iBb/jjKERJPM=tw1ai!SY?pCN=GX1QIYC@AKI%Dw<EZdHT+#SuRL*HXbK!
W=wT$5 5aui/AjMja&qZ&k\PddE1+mmQIi&*dk$VWWN<pFTy&8<EG!:P+X4XV5?Rc&MRN>QnM9<8F*1X9Q#HY=J
mSt$?% Ih!yw&D6XZ^=!A5Puk8bbR$TaXYiEmy#n61PVKi/#RlCBaN5T^NEbB*9/t6GeQ1w+/&:yLiA/:G*qkjJ
6EE6p4 KYaiAy:<&4*F5k<IAHI/=uEYF^%?^4iBJ&BBa$9yd68+XLl&FN#8?@#Gny\\%<D85mbuVl/?W6RLFVhH
-AkWnu 00032477b72001202b3 Page 470 of binaries1.zip
j?A=Ql ?#W!@#$nnZyuhT1NXaVYh6>d8a$P%cYMXX%?NcKAVmk?<dw5+AbPQt9&+4wM<m*4YAn8Ec=Q#$SV4VHT
@KjIi& h9&/QRiy<BM+B&+ikYTG4ba=V^GQFDyLGPWMiWWaQ*clPKLtNE\l^!nQ94MkeF&^!M%jQpVBK\#KdZ=:
MjV58l qX\/?HSLGXa!>wBEe/TGKK=Ge=bF!YKCTJ8MM\JH\WAZ+%XI5ZbQ$TXp\$LVPpmKD/wGI!d*6ASW%Z+9
atCVj$ a41lqA9WtJQWIL%JeFN/kC=k$!?8mlnQ4J>B\b6td=ilX!bJtEwV4BlRmZKXJ<9mL1#mIKeX$u5*DwR9
t1hSY& *1i%><YCuRc?CDHBqX*/Z!9$Q:$?RYLk+IwciHKQ/49ted1H56a^8#L<BC6h9IAytbR>EMX+LC5A/ACl
c##tJF @F?*H5HWa?DHe:>ku$Bi1/CiX/TJi<1>?eG=M5wS+wjpV+D5P9++H^n1t5alW8>J^hDdMAuceIpRJRQ<
8/IF4n 8?9L?$mlY#lXDW&bZVauJw>/*qKy&D&L:JDGebHu1H:J$TtEaMb\LI6P$dSd*BenX*#WXc?ylS=MwB4R
h&LDF< EdjMLR!AtFQKCXl%S556@&LPG+ai&N95/JMC5X/!R\<Vh!SCQ5JZ5e:d/bl<Ptj1B=nNC^M84!J<<Lhq
4%/eFJ 1TSdw5Aml!!ydkjTmciuqhJ4bD^dptGe4+*H5aaenna&L!p=8J^K:DS>Su!mm@*41=<8t?4DtFn^yVIK
w/+^wQ Q?up*c!1u+yhh=Imc=EHb@9aKbLyLA^$Ita:ZCwJm<mD^DSHG/K%:>HBEVEHVe>/CqP4=y#WVq>/K%El
PBbBWu 9LdpHSpS9DB!jXw\:LnZD!n@qFAEYWjeh%?bT<D5M>F?<REFAptBi6:qWdG:>lTFA:J?A!5?#B:JNV$K
WCRJ*k qXdkqY+biWY+pN/j>8cWqJMuqnh!*+q&btnMAmRTe+@@Qql+@tH?B$1Km##KI$:PN6ikW>qTV<Ma^qi>
\i>i>\ ==%Kc$WPhPW/ClJ+q=ZHwj?+^j!@WnlDIj?D/!SRtPk@C&ia!JYF<:<=mQ>5N*/#FQ**lbd@*<wa?y8q
@$y>9P /L>C\/>CZ/dTj4MW@XhwpT9Rq?&LRH?#FQ%ZcLG4$Jiy$><5Sj<XY9kK>KZK?DhL$Z?F9p4YL65ZkWJl
p\M5t& j$SjJY8ZqdClWMRj$XjJGlS^GT*/S@SX5ubbCS5KA@<SjbY5RWR8w!F@SF<qc=BLV\::I@w1Yd6ePQ@n
jZwBSm :BL/*?H@Tnn@>>d&*+R#+neXd8l@HGV/>&YWj*qJ@=>T+e:?@*KFt<?9P5Iy*IMGYCJqS\N*cj9EGM4*
ykW#LB CMwZHcT+IR:F#I!>Ah\8SI>$S#Skp^RFQpR!AdLc=*JIA6u/ZuQI@P8kiFZdGyPK$+BbE!DBp@+%%1QH
9<bYdk bnDG9cT!Fh81jEILe>\?w^F/=w68/:$66T8k=c:%G6%F!@+cARNTE<4LS*WI6tq4YE#Vn4ZtTKly<4$\
<n!K4a wpEQ6bnVV@b4cdZYCu5T$p^WD+dRk>\^u@m:1HdTcIBcE=W$ZhT!M#Spy=*9/RW<5dCp=yEGn>QltnP#
#pTw:C q&kN<F^Q*ZIbG1FKYaee4%8&#tWAHC8QVHhVP>?=dmT5mYmd$VpQw/@tu>F4D1%8tKjL/helDA#Bp\j^
=^Q5tE Vb\+m+4wN*DEQquPphK$ZDR9m**&IW48I&#kncYIaPk*p^6$q1CH?+%#1w@\XD@%G<iCwR<t^S54/a=H
IIchlK 9WpC6H+lPtybh=>dN6DdNMb<1=h>XbW5pht/cF+n+6BT@>&pH+KcMbyDnCj/b*CNiu&=?/:p^RDDY^E5
kSwXp@ 4CL$9K?Q$@TcXIRnj@>8DLhRlTlcpIBbbk8G@ic^uY!E^d/&6:pa!t6WKIabuSViD:+k+C9?<Xt/6Mta
dMl1aN ZG6&^6DWZp9&y4=y=>Rhdwc!$+u/tyDcFLS\Jh?4i&+YGdyyDKLtCm^$@W+=yuV:\JZ&VN@1ti+ay+Ew
qwqiTN kCCBBQ818C6S@XeJq5j!C^ui:lSt&TcNp=FM@Rj>yQRtQ:dBpSyB>wL=%y>\p=8@kl:?iLm^8qI@ahCC
Ww:l$N wkcJqWWH$:YLG5$t$AAEyJyVK^ibcS=+R&KhahK9Z\G$lIMCTyld!tkeHCh18RM:T/ij>+CnKj9$dc\@
KAYl16 a>wt/98jc?adq?ih\i?dSAR>TQXb#M6m!Li=Re9/Zt>4X=quyb/y@%pb%G&&9:SPHJkcnQI>EB*m>=R<
eLVt:e McVSeB/?!!m^15E\yZtDLCAWLm?QmS!*GAA4FR5y^KH#VZD4VA+CLKT5*TKZYkM^WS8NwcL?<%Kc&uK6
n!cJpq ITdFy$>mkQVPK8DY1LSPY@yW#:wa!t<X%@X&&c:J@qB^>MHyaquB^4S\J^Ta$!8FL>QN6IqwkTicmta?
Ibd\b% ME/W9wmPeDGpb!A1!+HaI:q:m?G&kE^tCD>b6H96*W+u\@dGZnLuB\t<&9hJk9!CWEmpRYwBwwBPiX/\
1cY5II SH1%<Q=l\+hAW:KwNHhp?>$d#+WVAem/55/%MeM&qZ59%6#hl=M$yKdBZm/PSdeT1l@1Wmt68RcZFuCF
Ik<6W1 #T\?w:1ihq8aQ<@6+B1Y&RFw>^qC#@PJc1!y/=FYKB+d9mHQK+mptyjwK\%G@w\q@tEq1L^FpL%9Y^K:
q<Em@G 69\EXdL\^C^VT61QP<RNA+Wd9pqLRXbSLAQD@NRG>paSFW?L*mnBK6jwXWq$HTiq!?u&&#GJVyaYVl/m
=yLZbd KVt5Xd\k=?mIN^bB!mGmY+5<1mN%jNP$EMj6mIB\9119+9uqCy?K4B>\6>yB^e^?ttkLBp:1@iDFa>N@
e$Znm1 Vt8V:GaFBZ\:d1Z:FyT#YMiZE^L#dyK!RPeWMhLQLV+cJa?X%\l8DcYqN&!%<>TKal+yD/NKXnqGTER$
maN%LP Mpp$D6tWn6QdEJRub8hhF$JXk/GebA?i>/bFqA9aYB>V:jI@Rk#5#R>Wn=mLCPkdtI%6wy48M\/WKq>u
KTjZPl =*d\h6XTPlXbhFwp!Vqk%>!#C^+d9u*#>w#!uwbS<CS:<pSSYuyb:Wk^i+*b9Qli=dkEqh=#^1n+^9NT
\<&Gh@ @@\1#w==LY55/K$/?1*?Bq9IVIwV<C^Xb@C8GK<yl#AZiZbakiQGI\8tL#tEbXJ9mWq<iAJ@buJXVwjA
^NQmC* ^w^q@CwBp>K\cXSMhc\FYCm$*1NTFqGY$Lq5ZmhR6e4<yKA>K%Wm=J$lZuAF\>:6NEDu8<j1d>PP?aa5
cRtX>K pdiDGXd&4SNc:hNpBmbP\SjHc:M?JkwM%!K6B*H4X%<tQ!R%qXA:H#NZN@iGmbB#C:#%B/p<uw1uJGpd
@N\PG# j::!R@npyhtPpDKc=mNFYRw*edt<!L&yD!Vc15*\#&p*WcyGA:h>8h>6uJ+%Q>hZLZ^=?y:^+e?mHWGd
iMe+Hc kRBQGVIWneyHaKiJI#XTZ?\y@>^S5QAR>jmS@JKM>jEHh$>uaN$NI$FS*h5tk15cR&LY5y+*VW/W^@^e
kh>#IC p$M%ah8X6&^tC*lyt6@:w?8M#l+RFIipEIK//e9=?mQhI@PpW&=Y9&\RePJ>45e^TWqA^@ptEY=!4/lq
1a$dy> G<VG>DP+!n5WSwS/RhXWA%A!NTk:mYHYPZZ&ma^Kj6@M<8JnyGGApTZl=q9m+Ni#V/j=!W#*9@N+\=pE
VWP1PC I^^8C1+KLQiIjWJ<QAi?#p/hj>?1jt%h!D:*bthM$ckQ%4@+?R8Am<DR5+E5m<hW6:y+iMa5/h//VI!F
h%=/n! T>b@q:jL8NQ#kp=ANAeGHHiD6KSSc/@IN@8AFb+mGZl*jYQe$+Q+w8Cqu:k&JaR@4@:CBt=>8uP&a@uP
F?+<ya QR??%*u4SncpQTS<Z=RkK:!6JSq5PP1\AY^TFkLe=H?STkZSMuKNCuY=F=+^#lqkX9?J&%5*c4=><E!y
hDBF#8 TRSkGN!q5@/c+J4!#KF4=DHXy+t#!N#yay@GcLN+5MX*T:WG%u=*l*YA\IQ<Ky&#/8HM:5w*H%:98ERV
+u%QPk E+$&Yj$+NaV?$D$jm\GGSWC1q*=1ly!uq!wGX!TjCt$5:hNZS?mRk<pM6$K@!yu6KX8=:Dk$P:lpl@=$
Yu91!S +#9?+5T@Z+A>XMel\LHd6=de#&W@I1j1m!abhGyYeiW*&EehSlMDKw$B9B<FLSaA\YM14yLNwJ*y\j$C
qc=N&e e8Y&W4<VIb&VC5VlQ9&*Cn6=X/jJWJuhL#:d4u/k+aB4/k&Qa58Zq5=?XQKiX/aD9/S>Y!pH18h?X&HZ
9qt/Cu W1^i&y<u@hIENi8:IBK<WLaan\pk=6nwd6t!D$Fck</dmMBkh*!6CI\:J\+BAQ?Nck:bIQJ#SclqCR@I
\Dt9Nb dy#1Gb%<D&>6+ASItNEWyRkK6dMjydEMR6k41qNXaTJd$ENXh+eP:k/#GKl&91W4*INGqSewbe5Zy\AL
#ZcQPH je8Db\V#bK4^=@FAn@Dea9H/9?Dn>iPnH8MHmRAY$aBKLeFK9RlZ=tVTmTNX\QN>4$QBZ+RE>=nBRaT^
SaC#6H CIFqt/QBVcJateewq?Pwa#quKdply/qq<G4=#i>hI=@=nPDBFdjId1/Y#=Ryqp?+:=MS+cmRI5hmYl+=
uW/<IN C=4d%p<LPkYDGi>H&&m&A!c6/u&W9lIR<c>1kAjD:^C9JT5Ibn?Iy>5cyI84/CY9YmiYW!YP%j5ec\wE
i!FF#+ TJA+Py!4i@^$>XX^i$%c5W+<pq&l/6WqFa&HQGJ\*Qpm9IaTmQTymQ?1cQc<8AY4Fn:IKi=JXap5Gnwt
k1hAKt &?kcEXiQ6#ni<Z6!aKDc5nZb6kDW<LeVCuS!L6\qZ!dh5Blua!&JI!CL#9#YBXbilTSD9q/L@RpwK^!J
CekSc* u%GlPMAhHAZ+>:uakXYe+<&S^wLYmc46MtpFmd%nJ8G^!lCq:NeK>L1P9wbDyjI8+TE^+$Ie+YH@<l=R
$A>:aA ICJ\8KWX8FD55RG%ceAKSXQcwXV+KWy&n6ey^ZBD5HwJmp&YM:6Wp49Kl\>W%Ca<@WcKk=HLMualh@ZY
j!9H@* &4=:&qN&$<5L?#^B@=RdR9S&$h:iNAmmBEwEAS4pa$AeEA94ILHCF?I>uKBS&PVRe>:<P^SIP&6wiBB$
TiG#4m S565!K/K>SF!qae1ec>1cWanQZZqPd=VKNk=RW\kbb5nb9dwFCyZQthQaquKBI#=L5M/EX!a4PheG4WX
i?eMc< ihK?ylJ*8u+p\dNW&N$T8w9iCep^Men:RiV<kKnWpeH=lJmQw46LFGKdapF5wX<5A?wEPtjPkILj5m*&
X4GFck GMmb/jHlNHG^YtmEC>Z1K9d!6?PbQLT+IC4VTSkTD@RKuak4%BYYY:Y6FXkeXWa#1ialA!wyQlLTk&BD
$kc\Ht WS!8NHIjWTS/pVccdI6ySNk9$FJ9uw$aS^V1kX#=yM&en=d8DVhB#R=#qIN@XC?&mTAn1k8nD8N>G6/V
@F+CSM I5<:atYtu=eNXt!MBV#J5P6wLTTJC&WJnpk$XGLE?4e=4eep$dwqh*dESqDEDFmkh!=$u^pqEhh@J4GI
GX8hJ? S>dG=IMQ:EM$\TVB&4LcIG%+JP+nd&c>^enu*F>\uBRnNN@AmV1TFKhmi6bcqemkQV6p:5>+IP%+$aHb
:@@CZ5 bYHEpAG=TZ:+Fl/tkN4RD6#mZS\WdKVckWut#wT6$dVLm#h1/kp@w*k%ahAGM#HS&HJW^8*lWM/\Ca*l
N%Y&\J NC8nEwFHt>qT\Rlw/=%LpI$^bM/=4SJF%Nb+4H4HZu/H:R4D@b!\\Hnue<GcV\cc\:ciDZy49l$&e%wH
%9aCE5 +5:=:p4Y5ZRd6$XR1?wn*IGwh/m6$mBEC8#WF<^l1J!+ql+>16d>Yy&\R$DSIqBPb%iu@mjhK<hVV%S=
D1ecWR <y59%@W4h8=^me9*XV:6<Ftj8w$?bW<V>JE9Pn&M6kw<1FWhM9m+q#mQB%nBp*tbN?>GSS@Xq@kRbQE#
MpThth SPY&Yd5:#qay^X:h/dJnRe1KVbiiXw%hYC1ajX=myawqJ6P>ZeR6=tQkpMEWcNl#:NN%m:+N^>iik^+%
-AlRXy 0006df5e27e001202b3 Page 471 of binaries1.zip
Vw#Z:Y nk/l*uH#w@64tP8ip=bcBDt*ly#KC@F8EY%!wNTt1QAu:qPKH!At9@w/:>W9QteFVm6=4Zw5jnG?dt6\
Qmq6LP *J9>kE@cNRJ1%tFPk/Ry$wT6Sb>nkuTbZ5@ml5n>Py%D4#GynlDy%R<Ay5jlIRJRnEEtb:^APNX>$k\+
B?TFPF /AM4ZY&S:k>1S!pFw4NHNY<kZBtdRGSe<K\RaXRR*DRwA5<+$pKEqaKF=di8?l?Zn@?Z88y@uFH?C/=c
4cRbZ8 =DjqcJG4q/MS9!%HR*?#!@#*EjE4&Pdj:DL@FSy!Fjw!&@!dZic@R5P8RF>1t*?#!@^ZcMSX/M65<&>&
Guwu8D tj<KLZwFGwc+^ML>byj=L>CI1&RNKucJdWbeJY6R$e8i?!ybk<I8i&:wH>FZ!S4$pp%wKAL?S@SX5kc=
Shm*uh >PRmj$SjJY8ZP%9Ej!+J@^*?L=*6**9Bj*P&9%8#lw4<6mRMF@&@JiG4q+Th@1iZlA5XljSwlwm#:WIA
SWbj&> j!94Rk<L$$bDw@pptWMw:t!I%?+Cc/:ZHKlaM9EWiVS*E9JYF4I18c1AB=W?!>ZVqRVI>aJBeeEKWmC\
+!PiX! %hp=QCDBqAn$=e^mkmBL^WTaAI1uS>ij<?IiIdAm?C*iwD?/pFdJaYZ9qEmXltT+PSHGDK@=*FV/n#QZ
TQyn&& yStAkLRjapQ%#Q6DRFpR:HpI#dayZnN<y+u?QjtbFbN$t!JtkmmRZ$T\iVJPH^>R/bbE&qi458qwiE$1
!Y=Lny HI#NeWJMa?54dT+M1G/<WCLA1^N=ZLhLc?%FkPjjd<hdTj1bN@wc1wSwT5ikiD1u6S%=VyBDh=61knj^
XTNG!j LKPmJuGnL/R%$JMLtlSm4ha/TqB?V9Bb=TB!GS\qJT=>Le>cYcYMYy1$heVMWq?HQLJ6a8p#$tp/Xt5Q
q4wwL! P/GJ$yKpthKNM!^8bnA$yNyCM^*plhBAT8S5B@%$A>/::aZqRa>NtMAP$:R>$?<%ARFW#YIVQ=#4aD9W
M1Qd$l +Kt1h\4mnjyTG5wEbemZ9CQn8$Jk56w^mejN6=5c^#$5abV>#4H=:4%L!qQQikeT8==J!wM6D#wZG$\P
X*u>t: i1Q9!1Jl$WF1:lMPjtZZaj%V&JJZ#5>In==+y@5bjHPQ?%k<<=:B1+T?4?qCe@ti/6QwSZKE1jt8@P*:
A$%4W> 8B5K1LbbTX*94hK#16c$y^dZ%CXXE4TPBp:HmQjqMD!SdnK!jC4ZuFw!l4QuQIw&RaElVcP^:TiT*LuC
<=H*tA kJ#FFEaQb8pI:*Vlma<>%BEyX1=9E1mtkV@SHSV!MZDl4B1$j&5&n+#AKtH%wq9Kdh^an?kj%?44L9J9
Q+kAeu yJY:K%aK<5uLGE&&L?pm^a+wSME>CaWmV#nh@jJ$$mNq\jckkS5@GI>bHc/dF=IwydQh#5h&EqPIGnuK
jkG9u6 #::%KKEBtV>&+ucl9cQ4<kTQ>FZEkGJH/enHbW*NJ9LddTL%:imR1bJ#PGWiYMB!w=C&c6q!5+$hItWG
!PBLpZ bDu5>6wMIMwdGYJKjD5c5Hp&E$T>Tj%l4D?R!86e%98E\>Iw\!NeZJ^qHibu9GWt=eRlkj><:duPpej>
1#AD$4 \T4Bdm>EWJCb6>SYu=cAFTd!R%<F5HBK4pGM8a=Xn^8WZ<Z:16AcVwu=yXuY=6\pc5$RIS9tZJVFG+dR
LQV:85 K=n6>*F$%K5cR5aBp=:X!kdWIkcu*P@i9QQ!keDKlLyQdRwiE!lWW*<&c*Gy%QBn<a6Tbdi<B>*TIH:c
:y*!+Z %PJ+BV^Y!e>BnbRcTmF1Yi*!!Ft9M%Se4!w<X#SkPL+G88u>SZaji/cY5/9wVtqK6iSd\XP!A?tqdeij
n@E6FQ Q4VHDSKVulCVDJ+Vn#TINNQEAKj!>J?SnbJ?ShZhlKeF>>mDwuq5^8\qB#ye8lMi*R=TtqLM/A6<Sj85
<%uM=t KubD9!9ddbde=F!WcBTRMm:8yq$CbClRj>jY!?Y!M8N\:PKy6A4Lph6@YhQpP!#<ebkW9\a9*D9EK?<y
XDW#Yi H%i=:ejeThNuKa^=YwJ46w4eyS9miKP9%$naGLR^a</PiHKNhB^u*I>/>!j\qBBAWB#*c@I#Gy:4%I#n
9uR?J^ 1^u*w@Wq*?GQ86=McM$V:IW1uT@45WyaQt6y6d#baebMV?&pw\djFn66u4!^t&a*n45Q$L+I\^MI5>/l
y>QHGl W*9nKhtYdIq9y@9G^mVVynRImy>5Nqpw96n96:LEJIq%?1G%=tpY:T9REK5jQb@WXYnnuy\\L8?ZuZ#^
Sc9#cR *uuwPp!#cB^5R&q4hEjRbEMm6QH%ebKM^!<T&#tl?q/Tu:H=VA%:91M#J?XJ$lE=$m$4bblb1lm%F<9q
9YFw85 w:VHAtFVQb6#19HTMF+w&*enC+B$8QjH>>N9duq4>n*QIB\hWKV=SlVNIpBG!nP6IG6TT4ZV@%VJ&%5%
&tLeSk aeq^MIaNYNL=wN8GiaH?ShpRVjq?6udSK#e<@Hi1N=S9Ia*$YY+jcIA+Qk#yGt995Q4B9*p*GZGpB1&w
j9CkX\ nn^:4uk5X\BKpG+n\/^q\6jp#68>NJWdaqYF=pJ/Yhw>mZm?TSA/9I&X%mA^m<*KFm&Z\&A6?^M<mZW$
uk!\Mh YVdKF\XJ98j^K!d4KTnhpm$$d?+N!B/%j1Edn1T$Kyc$C/Zy<dinw^5/$1jJI9kb^D%dK9$lqa^:knHT
5cQ!Hq 48<Z&a9k5h&LA<eAtWwamVh9>YyiI!#6+1N@%mBK@yiP16@+jQlL\d9\:JdXFFm\nu*95NhdpqXhPkhj
+YY==R tWl#@mV9BNd1Bai1^=$^Tt>91JXyeE8<aH$=#%6%KNJD5ya1ciD+#FVnjm<\5XPXI9%^RB>Qd?Q1V/EL
lI>haZ nD%Z>T?!:TQ#4DtSP8q5deuSRkkt@Am=abAYPCbaJhu>$hmS>\FJ*AVDX9eQIW64bSQj:t5&A\S?:CjH
i><LhB Ch%nnEEE%pa<*q+C1YSy$/qM\TYdP!VTVF#!T<ZQqSilAEV8tHYt5+E$mtelc\V!1e:\$TD@qE6C6F4i
1$tH\! JIm#9kbl:QbC=C=&u$Ve=KuM1dm4Hni**hekjXm%%\Wj*pHNnaYyE$>dctqq@HeTth!E>!XJN=6KkZhJ
\$wmp+ H6S5=G&%m+kGHKqbS$j#1nR=@GyI6mRcJYeWB*<Z9uPDthieVwJ*L5/SR*K*G*XL%p1ncjpW=6u\KPyL
ERCy9h 5e%:hPkc%#VTcZ&n6J@1Q5/Ih@BW64Z!Dy8wuC8LX=iVT6:F9BC*hQ:IZ1mH68WGJ6aFqdqkP=!>wkKP
?l5qKn &N=VJS=^65+<^LEL5&FN:&@Jmy=CFiNQ1LM84DB4DHd5=J*1wCT:5A&FTl$hHVJ9debYX&=eK<E9+@tC
4>d%<& *+&#HDRkkVeS4\a?5kI@FNI=YBtRJe??S@\Md%uQ6kASk$?l@<ZKkJ^t5#?>nFB6%w4SI*VKAy*4nu<i
HK5kPe !LhjtduA!Y@tZhuVL&9mlA!9B*?W*y?wHttW#^Mn5#hS4>CS:kBID!Wn$V5ICkWRlbPu*T@kK4Nu8!w^
=VKR:F eacc<5XC*F&ye1TH<=u9H98L\a/Hk5p=dp6#BSMdXdhAyZ6pNp:THVw\kl5E9j8&yQnKybIQHinj6jt=
y:!%%9 Y8HSh9=EKcaQdT*11Fu+AZQZm8*<6q#CK&KJLYe/&e<M?XyC&hAdhpNQ5SkQ8!YR\Mj/+JEeb\CKwFaH
c:YIGQ 8iY%B/pTj8lX%P\dG:+hid^8pjtNVhSV*e8:%&c8?@C?jVt<5DKQ:GPTe4W<T$>YYNt6:nDTWZ+JCmAB
P6AiP8 MC%liLEBZ>T<c8AZRV/MbRG+iQkF?KVeQj=L=D/:9>YhRhGK/EcnaPaLt<V1@MTj:p*unkb:myt%Rme+
Ph9^Zd jACTEy6RSTpW1a&pjIN*FQaZ=8HFckGu#TGKHLnI=Yam8>@\LFR@m6=d$RbReB?H+P!<5?jB:p*N*w:Z
FQ?CPI /\+@Qb#$a&4HlTK*<=HR&Php<Sp%5maZ9h#j9=#kwNI>RW@in^/\htQjlNu>Y8ee?dK$XEJVF/>XbYuI
C:6ATm E9j#B!V*+jdP#>myu!%aj@u!Yw^QQTw#:!Di:%p!S=5YX&eIi>Zc?mA*1JNXV>dMPklNSqK88ibWFAPB
G8Bku: X!?Ec5yC!w@::CJ=WcX&>6q!qke5%1j*mF\yYG\B@QmP5W&bu1GyiC5jm@F@XcAMKEQniNSi5?uBTTjb
pcAP&D 4h=^h=dDn:^p!*NE<4:DudjTHilZld\!Eqw!XwwhBn9FmZn8864i&Q5BHY^\c&pD85By9$D8?/@Vd/*p
wJ%aJV A+QZSqMi<<ew8V^$c<tAS^iiEy!mCZ=?IFqFYD/RAyde%F!u=uyAdXYc*YLn/EZ&Cau:A4Z*1Z&j^EbQ
6ZG/=S Mpn:H8X:MSa$5c8TZAtnkZ!Vi8c?>^DPL@h<XiykD*hL8tMIX=iHbDD!kbMD4GRajwmSHd%**VGG1*%n
YS4/L@ IYIF+>lCy4u@nPR>j>YTY4tpPp8+y<$5y\MmcW@R9yPFtLSQp4wRFBXiFG^pHCj+ntd\Bw&11AQM\DM+
44A?:# AHTEWtEE>Mm>Q4c=S<kIB@uK6u\EdtRANw$XHi@lwk\<wKGJ?K&W:N?FE6MmFa:NMb!cXj^B@8dWiDQ?
DYLpd< m8c5A@1AWI9ZmZ4wZTwa!XAGjm8FP^C#Nm&ljt/1RRWLR1tWuH:m*?c1#A*RiAmQP!KJ!*hW/JXjcWS!
@jGXB? HJPy/<AZh$Led!IXYVYFht#^G!iyk*kht^%&&c:Zab6nQ&LH!Fq#lRp</B:9XPF5#\*uk+^&Gc9KKM\m
CKtdS+ VKGJD\Fttae%weD?u<NSw9BF:H9WN\\ByhEcJT&*qGbWk&#ymtp!Taatc:%XC&ppj*&j<d*&RZaTb!nW
B&Eqte Ja&dJptyNGHSRIb+!^bTl%!qBk<h5S%#IEbZ%Ma*QK$\MQq^Sj5:hET9%BZC1PCX>?SbVLFL%ndA/dyK
\CFJJH GV+auDyPN$^BD&XuAQa$yF*+SPl!mC?cc#Z\1RnjGY*pNiW&T&%&1nu^QuF9bG>GHc6/9V:NqT:cIVS8
%Sl6nE &*Qy:KSQ9VM=apD!H8ulEiqytF6/NP1c$b4^HbYt6/n#qnInA<:AwS1L@uZp&=M$W?%Nh@^?=%*iZ^+b
B!CP>P ZQ$dNRyQYRjJ:&l9cw*885T#**jul+b5!V4kDCejpG?eHRERbmE#TdHCb9tMERN$?lWDM@&649*DFIm6
@\euNT cZX\bEn&Qb!PB^&N^Jq6IFWiF#M$5aw\6^Y#m6MMYYcucem^9M5w9ZiZXh6i9FVdQjpDQnb^::FRTj>T
8/H#Qn XR=SKThV$8B9l6^dM9\th8$d*TJ>lQ^iBIC\i$GZ6wJF@9hyBa9<n:cCj#Q5DL*/5DQ$><QP$N<MHQ@>
4CqjIN q5a48NLjDB#@FSy?Fjw!b@mdkiP@Rw6ekd:Wqj=t+Qm9$GJZwT?=dSH/t+Hn9$ILZ+G?%JZ?b8D+4>BZ
M1B?6y !S45$yQD4pSjpnZS1&RNi8uJEZ>EZ!X4q:yTWhE@w1?T6Z?>$jG*6Bn+n?m4bP%!$@yQA<h@l@>L$+4+
RbCRpJ D?%atLD\d$#4:\cP@?X%<Z@P\QHT@#<MHEh5/%pNa4MWQYkI1nRBh:1y985K%QF6cDADuJm6B1NB@:=Q
paKBI% ZPuALFEM@6e^a$a9Zu/Qy1ut$AQ@RX1X=SK=86B454mNMhkwBK!#<HCmPVRkX%?FkMbknXHqwG%hLkT9
XVq\y8 WyNic?^<9:G!=AWl<:@&dwWFcC6uBTiPn/%XMXW%!J+8IP?CCA#PbGw&48E+M%$y:GuTBQBaGytiLF$N
#:FytK MbFInEchk4%yuYC^\Ml6E@n&$l1V=8S<iS*\%P1#&H>4pLw/@bIKJiEky6dY<QmpCZbHtT5aVN/+&/S$
aZeX<M Y/yQ%D^^9>@$+:d^<@8XXcH<NQ1*p&cGAFCW5hCH^F*J6SqjF&mMWG&Md9SmkJ!tQlI+!Bd?8XYXqY:X
djlJAy $yHNXTBq5a>PKC6JJZN^NQ1VLcA&Pkh*<KFck8Aa*+y9MEtANy=BZ#@*B<G/=jSQ/pAB5m\Z\MDe&deR
-A8NGj 00073df0745001202b3 Page 472 of binaries1.zip
4bm?pq PmllDiaP9wY+ZdS%8@b8Dc*IhieDuTYcPchJ%wH>&<:h:\S<AN5CqR>@ZcQj<VV=uD:9>b/TF8yX@uQ/
:!?C\9 $LHF?4t4dP/\^JkSladw8GFTnn4wju=Xtc#!tY6=CP+mt4N/TiY&WFTAw9G$Rl95d?ZdI+q@K>>?51V<
TYSciI yMXj&dN@l*W$&9%5n:$=6MR*8Kh5&jjV%NbQ+P+T/<Lh5=^9w*S9uw/$F&kE%=WWyneNiyXWNT%1@Vw%
/L@>tJ itakCqB5Ve*whLKmjMkQK1h+H=nE@SGdNcQ!GVWwiQ@t%1K>6?hRAP&dVQSGj!pSE6Vd<TcFyaD19AEJ
@Tw%kK iK^P*<t/4jImN#nGdEm/HjD#8iNDF%X>5TcciLZiLR&VDTQtmn!ew%/tY1JRa<EW1Jw>=mCHDQ6NH=wA
T?Hmnp aEwtulFC!l9!ekNJeFt56cR/ZuiMVWSnQmViIYnmFXut9GEyt?4X:%+u$a/\w1QE18\LZBCmN&@RMiaI
lW4\P1 jEbN=mn?wkW=K98XYbY#5m6ipHLLC+T<<*>#tt$>+itHZ1^ui1j\nXZ&kajTtwTcIp$#w+==lY=pR#*Q
e1aqbq +qnMLS=S9\Q<M/H\!P?5h&NMl=YeGa?Z/qu:XRqAbi?LKAd/Q#:T5ph*K8dwc=uyPcXG<*>PK1W&TS$i
KH9?\q =:GR:mK<j1w#^Ktq=dT#1X4qk?/<J95?YamE=c=Y9Z6eAB>Q:?bJ$%KnapapJ\uB!*cG!m#&$cB/Za/y
<14#<E y+GVTy\jWQ&A*5iMRjJPN^dij6dquitVtA*h9%=%G9/M+RphA+5?NnI/W1mQP%RQy!\wK?Ty5$SAewmE
5cdq$^ MtyCRKnp^l:H6%><6@Yn<5I4EZitA@kLHDj9D4ME>D8IWZHMeRIl+W^<wle^tqF56q^X:^ISW1XM:iy&
XdDLV8 XB+q4%N$*t=b1hpClPQ/y>S1KdWl%lR$?V4&V*/cLC$+1H/tT#6u?YWy%$bC8/6G6:@IIM8VmE$ReJpe
c:%E\6 y@>tN+npmq>=J9uNq%:LI@GJ$<y$t!dSAlca4Bw!/+IHJRe^!alA%T%Wbhy&@?X%1WFAJpA+/nF8@!LS
5yTK=4 #twEb%mV66cH=lka=KPlXjLmkZXmcbRQqbl$j<5&h%J%4e/+p4K5*FK8X8?LTlWcCdyR^S\B#=5QY?1E
$Qaewp c5>HCR4EM!5+*^tJ&nFJq#XTEXBHck8iFLcyQ8RS&E^uc8&9@nR4y^ecpPiPtB\%F<Ieit&:MXXYa81M
h\JC+* 5m4iaX?cGSAG5QHK%8aPTZmDb!jJNZ=IZ%Nu#Gy?ucSy+1TR5WW<l>cS+J\5mdQLN+NJ$<ZKCl5a9@Ra
J*BM:n iMYiL9:K!iCmmJe^:@qeYu5ReAQT=$5*/DCWAy!pKiNjXS#mmZw+i@=cHmXPqQ^SZ>Ft+wX1@:9+ww*Q
4iQ!=^ #/>4:AkYC^d4/8Nhu?!\:8uV1S+wbAXy%\/bn<5K/dF?kt9$*Rt4=+^ij9:K<lteZXQ9SN?AhS%ZI^Gl
ta4^CI /YB9Xjql^Y^1mT<kFX>5qJmjcjiDI*^^N#6F^FB$:W&k=wnF@P\NPy9F#kVu8bjJjAIK>tX=:+yHMqRI
EWlGNK Fbe&d8*w^<?XL@J9qjHj*1N+QQHRlJDh*XwDW?>5:!jTE<qMA95bF<qyAKG:EI^%/:9junC/Mm!Tw5%9
G9^F%< 99GKq=/dD@W//XtTD>SRiJ!R?$E>hVqn%\eQw=6/lDH>k6KBqRdZmlni+QTZEN%LWn59cmA$IM&lk1:j
8>%?p! RM<tlG@8M5=AyYdy^SahS8iEZY8+$wiMm\5whSl&8llNI^chNHETdm4Nl+!ByLZ9#m$@=%<m4E+?!BB@
I1AHnp ujAWcE+k\uMn&I#^6euay@KpYB/twI^ia$bV5Y>jZTB>#Ce\*4:4Ph16&>a18>XDX9&QJYAFZ?5+ub//
wVLyCV j:<nQK*mnG>*F#nS&keAjGX#$qwSmJ15:%Gh^/?4q&tb>LHPqH&5!&&iI>ik5l<:iw1u4\%Fk\J!Id+b
cIV%FQ YC5Wa<wlRXHuRX?Q+YI$<j:ZwMnZRcVCKS$4>q5%*G5DZ<SwBuRl$Q^ZR+N%VX8e6\yn/*mN>E>\ke#P
@*&J6% NnEVNE=^G9e?#Taim6+R14#JD6^WcP+!b4%>@GcZLVK*KbaPSLh1*%HR@Pay1K>44@1nByi:?pi4d*y%
TJ6cVn b/J^!wWZ#6nu4YP>8e9&LKyYN6JN$LC$^>m9CX5TBVQMMG6Al^L#D>Kd+HaV&A:G5>>lbN5qY^bk\N?Z
*!Th#B d&MX$%@h8JabZ#Iu*?u%FPRHJY4\\GIGYF#Anu*tBWmhd4iEIBMh%m&k&T1i&V1iZhe&\hRdnkFZ1@j+
l5**dA iACTAdI#m#Gp9C%PmA!E&!BRpCTc1B<95!8BZaiVBL#JS*McNPLnIIt^q6SE?4WC@Bc=WCyKStB?mni!
qSWmeA w9C8PiG+DqDQTC6F#!\B<l5HVI*4NCdIlJkNh1J\PllTYq1!ICDZYJ4HB%R6X\5LVa/8Q&XX8+Nna#4a
<1L@XR y8KpHK>End>eCh@CN<@M>B^YM<@VC8C\5?>HB1$*CB#RS?:QE/=q11Cb!G%KmC9Tp9e#qS\pmjQ5QLyt
mnpR?G =Ht1j?/AF>n*VktuNnY$eZCdN*5SkmHPPAQAy>dyB$64nVmaCZ5X?p4YWDcc:=*yqkjBMLPF?AI!kq\#
ZLqjEI aEnD4%\L*XCtc\NNYlRywd^XVIDVN%Y^iF%$\1Be**+Z!<Y=A+:Il\hyTHLiVKGHCXK=*%8\jY\5XSVy
!Re8kc \=Ybw4!TT8!CKNajLC%&Bb*IwBBYAhi*#Q$4GJc66m1?&^9bq5X#!DIYYLR%AijFn$Jp!#bSZS=h9y#k
yha@p1 \A1@?hl6hmRGmeh9W/&aD<ne^&@iX\%5eGSWnJVe!#WdRejwhFMJ!&MuTT9>XRV%1$Q44EWFC\6%i6JT
:@IqGS M>iemyZBTt1l<ep:<p+\Hn%415nqHMAP=T=QHquHB5:1i5Q+YLHP\LFCYZBXBeu#<MLniLDhKm5MkuT9
??leK4 &5CPGim^Ai+9/<G*TE1L&PZhtdP+F!&5SbG+R\/Ei$<L8a9nXw\6FpkJu=Vty^EKLupXWtHH:n=XX:<^
AjTTWG $M6e%T\94\<DMJP=@jRX^9Y6e96RpN\lSNSSib8y!\W+:8SX@WTD1HGebG>/J>5<1uw:%=4h!ylcZX#L
BN5jk4 ^lPYc<^Jd6AXGd\RjQGS=^cP6V4*TLK4*FDF\E#J\RC!J4*jnp1QG@pM8PkKuqkij&JmT%bGiF:Mb1B!
j4a!jZ %LNEqcpb+qSkTa1V8<\LZEkj^\15>4XYyRehHby*aI#B+lY<hn4>bN?iiSX8l@5E1eG*5%P6ad44@JEq
t8Z6cc jd4!DTqTa/D?:#J=Jq5&M+d<?Ij!5KLRtLja*KaJ*1INC+9>8WjlE!qcuDd!NdI:n!XS#NaEjjL>cbwK
Z8J5Q8 hE5:XAR$V$w4C><j8&\e#uQJ#F<jtuNTehLlA&!y*1KPN1w>j9mpK1*TLm$@A8bl=:bEDIe:X#<Gm5A*
&uw$yu X:4&W9l&>:@8B?6bt+GK$Hu!V9Eq??5nkVw+M#5anBD=Ah&Z++ZTZ%\JyVJ:jjBX=pipkDRcZ@t8R@$K
6%y^m& uWV=:@^pLJWiej4?H5hBCKl\IAEaw1qXcDC\qC9IdtW%#*j+uC?P%b9ZJt?NZ15/te#/8p#eYl\@nZZX
?GDtG= K\\BlBAmyaj9\P*>BP4^ZLPHTeSTV&BqaW+>AWQqbqKN?&&\daRA8EQ+VcZ:q9I8HCPpNS4YAC8TB+FR
NBM$an bDEVi?MIMy8XKE:Wq&C>By!&/clVn=N*#CH*&Ank!m6DD<IhMe8I*j+:QF$4wQI<qW$<4awB@5!FQa<u
mND+#e heDHhLS9NR68GZpQG$NFWI/eNh+V84$>RFnZyDM%EjTqm8Bi6DI%!ntc&6uCk+P8bM*F1=eTZ#DC8tSk
c>nPq\ 1<Ry?NVGXWWEVEmjT^B<Wi*SniJRZHG^:YIpA?S*6&&LdLGZ=qP1XFXQ!L5+E&X1YbpNTjZ=1+N:HiyR
8FR1w4 mR$cFk5NP=XDpRQYDn&C^Y%q*Vh6iAJL*JkeWhp1^aW&jRMX\uH9+hY8?EPY8\FK?c>JqH#J4KP=WeqP
u!hYd@ :Rkd^*IhbN6V?RI*AV4NL9F*m9k1G#kCP&$h!=IB?bqQ$YKp8yB/XbAp*MB6B/P/:RJIPwimA*Y$bd%$
M>=NC* <e*#S$%G&^!IKjyW!qeL^#%d$GV@D*69AXdX%4WNI:HyB1XWyJ9hkal$^/aSpP=8C^ZydlASpi/TEk9y
\&e5yb :lISpY+SER9n@PCS<##uPY!?=i9:j@H@**Y8e=*q&i6ic#nYtHQMie<^::tE9ZLB!dC@=?ww^RC9J5tC
+Q+VTi Xcd@^mNGZZWwQHNl/lZ&GRuCKR=^6Kl!wBYtl:6Y>j>NIh@hc@n8#B*^Z/FV@/819uAI:B>$Kl\CBW1u
TF>F4E :nML@?A5DmCKAP9!\k=R>j$XNBwAGwHERWwiwPwLHA$@RNWZhwA?LRIHG9JdcCkA>J=9D$dDjk5NB+KG
R!ckYF +dIe<X6wILEG^Yp=/4jRRGINm6N!#P?kIWBmDTi6CQ?:4C@&Z?BDceX@X*tF\\=RiaZ@8?D99&lFJQ#@
PI/jy: FuACLiCWDhRTbuaM=9Cuj8#Gl:4!Zhyja&u/T*SW1PGZ1DuPKYcJ8aJ&ktB#!YX+\!du%&@SWYDDd/G8
Sd+<qn q:ZGJSyq:D=JbRewEJ@FP1w!E^GIe%JJtp5&$=/hpS!aRQa&MD\wJZ<+H5&q\ZYSlh$<ZQ+8%=Gm>+RR
ad:H8u J+iMqVNt&tk?=KqELLV1Ve4!e>pdKb:WpnP^Vu*XnbEp@jYd5Gqt^FcAAwQ$pRn5chW+4!IGKVjbB:D8
dI@S&q &YqNIVKKVT9YIH!@8y>FtIw@m#AL!j!=EyuK%pj8HD9dw/N=LJ1T+V/Jmy9lk&NTM/4*!WE^LZA&LKYb
i>NnA\ +iiuMCE1Jm^BkKXt%NdnkcES4W>Vk^KWlN9<ePiLWdyBNL$th+LIX#>LNc69atGWt#RY4N&Y6%@ySFaa
m<*!am G+4XC4J4ClnACR5bmE1Q+!Gd5!pqB\d8Xid1=^i9qmy&TkZiWwEqihX?4ZpHj/IV&Z<FC+?/!XH$dDL?
FMLtdS ?^E^Gc$9Fq>mIAHu/VkdbTiGtnZqwC!//KNMH:9jBjZG\<G%MCcXV*ccN$Cnm1$B/m9d>Z!WNIFTF!YP
V%Q$<H =LBc/L/XQA>C+I<kRHMZ4E%FX*SQuA<LauF/i9$5kW<IT!b?l5+H$5*SI++Te+y><KlSV$ppbi#Z:=@d
+e\<wT GQDYWt*54$nDZ?n/55CNE$FtI$/>%%cLBw/Km%Jb#dmTT%LN1BqSIq:HWDER^a4hnbT\qEY+N<\<$uVY
!FiZqL Tqqeb*CiehS56&AV?n+m=RZTBWYt/CPaZW9X=p4YuA1MtWDp&:i9XS9L\n?QD6m>i^yei4EFGquh+R!1
#?V<Zi meS1wuY@E=/T9FB%E\T=ZKeubX@%>RM*RZCy=LVaF#a>^D8n4qL6l>*9GdYNS5>R=Ea/uaY>E/&NKA9c
dbBBuK qMwKMLVF4u&*#i<S1&>6i$6=1eRSn:>WNPuDqSQ?#!=*PlhAcw&VJ5kSwQDQ$W@cLmhQbDlS4Be!CF9n
^bPh+D 5Yk>a9bwd^kSch=+chAhF^VtlAVFn1$qKTy=#NB\*NY:QH<T*<kk$ww@jj5?hhm&yC\wk+PnLy#eRl\1
XMQc$R WPnEE!nyTJ6FTH/n!IR*FT?&yD>4^WY!hSM5n%$h6DCSw/^yk4TjJnRm5ZKKXtLIeLPdc@ca<qiQ1^HW
J^Aiyj u5w+yjTPEyKBp8QqYV>QYlBA+5J+F:qXqHTb!*Nb<6uDt!X&ZEcKSD^Q\MWp!@MY\#XumA89Ia=hY?TK
Xt4Xwj <MbT8i5F?#BRJu:mN&@Ip%N+*<a<?nlXbhNe<t!CEpME/=k8:@\ItN$liicSk&d<4iX<dy<<M?ZY/GIm
e>>j!! >:IY=JaqIV?Yp81wRPKZw?!$EtwSy&bQIt*l8yNF^ua5&QKd*9#a/mwJc8EhV8=5AhK6R9I\Sic:GXnG
-AhT<a 000c6e84863001202b3 Page 473 of binaries1.zip
PK*a+% S8Wi+<WMCQ:#&iyGP=$Mpen?y\\KS#KXQ6/%&np6ey@y+/%Lh<$nnwmK+:&E^D^KhuBnb$DjTp*SiDkt
yP9CIT +cyL\EKt8tS!l%q*#j%=R:8DLV%W&6nB?^*Y$/:I$JEVH9Ky9q?9LDP8Vq/B^/^YG<cY4Z^9E>LRe:e<
R9i$Hc ^EtHn8ASq9@Vq!A<p+e*JNXCFNw1Ak$hnEjpXDX%#!ke&!t^D85%yBDqi>ce@ibe:E8!eL#M^yQMi5hQ
M<u8H: PDXd\K$yk^qhytLN*&qI=8wEeWhuHNZWSbBtwwSBq^%Hl=M1jEBK>A8P=4$CdnyP1*i$Sqmand=iICJ:
#PXk9N VyW*dG1Ztyy%5$^yY1qGJ*uJY6HE&4iXIGpny?mlC+\8EX!:ndiR$1YV:GT6qXt>B5e/><y&YVFuSWT8
C#@5jk S%%&q5yjmM\1MQAV48qR6kN@CS!BP+k<!JJ^YNGbpH<8hIjwmE#+c%4B/eYtG:e?l1n:dHD+4ZmW*!y@
EhKj\j Ytb^96%c?%LTFh@4H?$914@\y>^kZm@y:SBukbepWV?b9GwZlW\NXC<1HC&WP!wm\L!6iY*AlWVGi#cM
=&pV#u V*HZ+<$$%=\jD^ALmRZe%l%XD$&@lBu%/ubNb1uKGQ1DA*QX+W$!yEYut%*/uj\Z:Jq*cjb%DDD+@Wkd
*&tDI9 ^HMX+mXmjj!#imYim?jWjcA5t&=&w/wZW8l$?t6Z*6kJ+?5<e4lFJ:=\R@%id?m6#PS$FpJ%*+G9hBRq
T>DTIi JM\hAkk88m*:i6CqRd=nZPEen=X8l@p!tXqD:9BACy=kij=IFhNY5*mi*L&XiJydRT#SiLLch!W5tmZm
$5R^K: keB:ZRZ=n8tXpbEkI+E\ee&p&98QQPeChi1\yBjQYh*cb1Xj/8C:h$u#D>tducuHkuZc*8T/P/H8FFaV
#RQ@RG VCPY4Tq#GdDjNi4eqFj5w!Wj?V^^jy6TB*Lnd$ynwHn9ZT5=!DZt+QXM*8lD?uNqP1K^KEjD><@%:pi<
VNKN:W <Gacwc$+6nwl^Z#it>5=LIbTl8lX:mA:Z!!De9#kVc%n?HX8\ccC9XiI>J&^pLq9*X1wn$juCDMXNw*<
SNE5\J XS\GQC6aX:M+\k&L6eLiLY=$ytiMpcZ$y?L#9kl/l>!8:iq@591pGlEKG<XnGW:X1ZY:J<q4+9@h%heQ
\d*eh/ 9ynE/HDl>mDnbd<H%GTy<X9/tY:?&@h49^P:L<wJMA58YnhY$qpF#*jjCuy>TVu+<\YV%i:V@t\T4:Wa
j!NRRy ?yA?KRd9+qY</8p@uZ56QpNwaQqN?E:\Iut&4:TR9=w!cXYVd+DqCJ8qkK*P9jVXET=DJ/4mKyFHZpH6
cA1V6c JactIS*P6BLC8yjLtR8CXhAM5qNNbIKNBiiWZF@GXYDyPbwF?kwR>:91e8qe+je5V$Y=bbp6lu%?9^uu
$F%qR@ #5>9=46!4je1GVHQ$/Z^b!IM@TWRqcLe^Xp14=6c+>1ju#//tuHb/:mIVIQ!>=yJ!jem$ZaGFqV^X#JY
J!:a%Q Z!<c8/=:BjI?DLRVC?#X5!VEinTd9A66GiYDdwKMyY!c6lcy49JVhh5&=Eu:yky<CNSR4%jEBtRM+kjd
l*h:b> YVyISFK116kIYVtEd$hLYPNN@8ERP!J1QNjCL4GaBJKSqbn8J8F8P!6TQbl4*FEWRd\pQ5Y@KEiMX4ED
##D^%h 8<dGXpR+TBCm8<INJY^YEcS%AnqaM4Nyw=^:yH&!9uMdSl&TRj\Y15/5bG6c>$HSukTLFAN*!Dc*jF6$
R?CTS6 @kkRKbbQhX<&p<4HpHNKQ8yY>^SXj5E=nTWL>RkVRc\LppE+#wI?iHcQ1h9y1R!5D:@qm\ySnCIqwKiY
VZS1pt hP!a#LZ=#6Y8\lC\teCFH4lu+E^/pt=^>nw^XMI8YML8IYJ86dG=#&jc#GSF?YPDnaN6V\CXjK$jNmKj
^*P=dj LF?!#R5TnkS=p*L:PC9=l!l@pHcXHJQJKLR5PKKeN5%l@E!=RGRDQhjbJFWcR1=bwVFue5@KpI^+Zm1@
dDDlti T!:Qt>KY?:lel!YZ*Z%y+&uuwYj=dq4b+&h#Hl1c#V5NQD=HilFJ!Hk1#Mta>5M>6W<LiJGqpQ1^6/*5
4RZ@\h XPNFt>@4R1ATT*TBm+S^uW=\GSNuFS$j9lt/QBwjmIMJTD+wn1JBW<THZ!lGp+n1HytqqwW=lJHS@wRV
+yWFK6 :i:RYpSqiylZW=DB>n!6%Spci/:WFTh:bdGAj6qqAajJndGFb9SG*t^!AZR1n$w1TPeS??Tn\eq*=V!d
Hqe6HK aI?AC1$A>1$5M/9^9w5CPW>B6qKCm$5E#TdBm=4e59X9k?H9SW?w6Fc&DILq1NHtClGEYD5Xn+E4/%:Y
Bj<^4X HY=SLhlb4E?ml9Em1VKFT$/>C>6q>bSHEXqZTn#l^jCKa1aPq\:QnFeuLLH4X9P/\5yTaWiRKy6aMy/:
?L^:W? ?XN18Xy4XXwQBZlAwc>F!:J<B$9e4haZK&R%=w<nJb8bRd/n%6ym<t>EAk!c*d+tBw!up4^p<ZNI/*c/
jGCb>$ SJ^+hY9qyP%hCKHR!t6RZ%^hIiV^YP9SI61&Iwim8hnL^a1EMyc!&5+d$6S$1=G4^tb9^XVqS\8GQK^q
n6H9kC l!Y:K6yCyS1/JZM#bn*A\9EImYmpq4Q<tbnN9yD1K9qpL%ATSwW\*bcqN^><KWJX44$L#mCSy!CGmACQ
lkWSut ^!bj5T:!yYhI:yu*WWl#!W?SW%DqymlGtHWbS5=G>%IppAtMPt>NDu=@TTh&luV1VFmF:5cujIXyt&!V
A6eWqC Tht=M$W&SQSVa>HCdLDqI5%Yh4Z4b>WbTRIZubjnKeK^SESDZXGQ%XW?VVBM1$MLm8K:/9umW>5nZ^Bm
EVAKd+ yKP?w^IYT/6luF%XZLR5D:^pH/<ZGae#!:cBZScMH=MabEa#DicnQ+hAVYl8$aR$#HJc/K^wCISFZ?=4
1lANy+ ?NDLinbH*CtB\#>!Si86WQ1mnwV%8Qd$hp&iSHS%&t6%Wudy84tGylZFNWV:\:c?FH%6m+De=\wF/\?=
/YWXuq lN/>K&klqF/8PTZYVYK%YD<iwXm#pk6dmcJct#eYPmMRwT6VtbN88dnc4E!bI>5:WLDt/S6Q@uCE#MYV
1<\%%R qm$kb%4ji*YJ:/Xl=!%c^Eh/@t9SLjXLH@CZyj6NJdFN>?ILGGeuBP!\JDpB>11Zlp*/I6+ki*#Y9F\8
l<MXGn >X$\1dy%YtkXRT>B=hb5TSIPWti!&8B=9!FMHLM#%^h+KhJjhXTNlJm4tZjiQmRcmTCbdZAmGt=TXu:J
M+=C$T Ny?1ldh^m1GBmL&AW9MSN6ijM<NFL&H%p8iGq95kXa&!yi!$c=TadW:>K4Ea^d&hMR>SdLYwJyX^GV%G
Ku<Apw J5Hh55W5^99^m6@/&nc::&kWl9?%kELBTqLde/XQM*4a1/VjnMja1BJC$LWT<KVy@Cwq<&i<S4JNAe%#
=l@/W+ VCM1I1QFH9tQaP>8\Pq6ZS%y>de\#t@Pc%1PW:A9IkN4:SWNaS6MeZI8!Z#R1=!K1<h5dE1uP$Gj%A1W
d>K%#4 p&W&9ta4t=YRqRRYplHMT6%*<KVm1D?YRP=6XZA@!$#99AC98LLTwEmGZZJSS%!SuT#Ne6jNLB%hK^j>
eElPpD <^hcnq<pWP=PkJwK5Se4^YjLtJ/b\%ZGCj@:1Vn@&=CR<L?j6@MLJCV5u$19eBlkyhh>H8IjDMe@ccW@
m6DH%? VRSCI<IQPMDuX>AwIGk+LnV/6>AaAGkEnmw>PBV<Y&kIADRe^!=!PBV/Y&kaEDTPKn*+Ae1?9+IGEt8+
CA=X^B cn4lWPS9waHEGk^HFT+em9+6NJBak?G!HAd?LVTRYIQm5l\G@T$$pFnDhVkaHAd@LVTRYMNN@ML?W&%%
lHWC\h H*\a<j6ZCipQ+liBPwD+lcH?*!N?@$?wJ\*l?D?<ulS^n+?lMy!kGM=CSMCk^S^!TwcMKVlVB9@BW!uJ
!nAp6H MYm4m1@QC==b1C::jSe?J=aRcwhIAbIaketa<Am&5piWS%TdpY4pX#VI!:i&hblWhZ^:GiXyXe?LIJ!h
P>QY!\ #MDSk>wt+B/9RG*<IN4YW\w/mbLYy+jejR&RydS?$/lTL:SY+%nJ@CAV=S#$C#^TMMEIYqH>eFRGqtk%
uS1K5: *qkN<VJ:4N6M56\4QCj\?aR!^HM5<$uX9Cw+&1uK%EAaEdDIwBa=<WbDC?LXDR6Y&S#4KL891Kpc:FkM
ijF/>d a/&wI8j:AP8Y4aMbtmi^R<iqK1ei1/E1i1CXN#i%k<5n$4ki!bW%1:DM/cthpu:?VP=c:%T*+S154DdA
>tXaS? %B%GpQ9q1JuitRwm5l5/Z=qAY=ZhmMwBajbn!ISAZ$=F$6t4Kw?Ht!eiQG/<ZiW1w$SZKCYWFh<jG^1u
NQwHp# W<hXKZ!^mKE5K@WL#%/6J#>F66&WtN16%Clu/buiS^K4EJa\!bcJPw8H*d45K>Knkwu^VVD>K=!KCpee
6m%@e< mY?/QjBjWnVRd6A5cjW<4w\pinm:Y4N+1iR45?*yXyBAt%T/E1Q1@W>&ni51&<?leKhlW@WyiHmI$qVN
b\M#hJ +!aSInGK!&u1q/HCy?&q<P?Mdu#JpYX!&eqXMZi#WA#9/QdQ$ipNHj*Gnla>%5@&dMLF^j#JpL9*1cM%
+R%$%y &>Wm9i8DYG!>:mt%W?16a?Z#DHKIiR?$aR>DHXNmh\XynKbmNyHakyR!&E$yeCC*^i4#ThL!1?S5#@!d
hNy+WY hlRdbaaNYp5*n\ca6LAMypD>Y8/u/JkVQC6?:N>dq*VZbub!?P$:Y<qM$&Q=p/5S^b9!yNHEInZM%HS4
N!4FD@ b1J4y?!jYyt%cym:!m9em?QEc$6PTV\diGyR6Xci:Jd^pRBD=c?NIjDu>Mp=M8ERb1dYhw9KDEW?+$kR
j*eyR/ n/!i4HGZSc/FjWyDY/n/q=T=+uQ<mY&aMciMTjy<4>d^$<Fdt>uH$4kmC:PEn%d4$^$yhI%4w^K>%jV1
X@BjN9 qLGhl+q:p$nuPT1nX%uGwcVy!9Iy:+=GDu1jK!lqP:aRZ5mXbl%%:=c\!EKMIGecN5a5T/kiypBDMJJp
/>FyY^ ?J1$H+W%W:>Dc?*PH\R4<<VjMKXDeA+t&%iDlFKp+?Jk=pRq1j:VnEd$S&GiTFK%*Pke>p8*DjJ1HWRK
NV:LMl i>1bHk1uPu!G<^^4lne@q4aWMl=P@j!M@@#n?cnF?w55t+dq\^Vhw8<ti+PDcB!d9TqW6TW\?M>ja\JW
>\816L 6&A8HlaK&:K*V1YbEQHW!#!FD6#T68dKJFMLkBG^j&Z@jBZWMcZA@PAW8tewT$/iE6Jq!G=qdQlWJhkt
jCZkiN mWC&d1Ju^=nC@Iqt/$k6GR5BVGF?QV&yJZ=I8%PR9*P1yId5LEXVjGMB>SNp$hcP69WD%?TCEtT\RDiJ
H/D#qC RL^HWiBP<YnL6kb4Vye=4PmWmG^V!cA&ui?RaYAh^?wu>XbTtL\#T=:?J:Q#RcGkSPPn:X*/y8t?>645
bMa/n6 ++*QmdXtu6Z^*^6pBGiNhF5/W?bZCK\tuk5>pYJYQX5FPZ/9<L=94duHbDuFqJZ+EphHAju=DA<S?:=W
+qDjlu RdMp>&I?8/cRy^GyD+/h/e*mIjMYEnBp*pn1FRWqXy>V!q5I<Pk%+Z:TW5:RLK\%9ZjmtiHDbSGn?Sj=
E=^Vkn 954YqbMK+&@WLK^D1=FBB9/N:m<nH5V$9F#MMq9Du/G:d%Km&>lpdZmVQawS:CC&1MQ6nVGwClYPPIE?
/m&/^9 *<=+:mmePD+&ty9#Jy%XV:nL=eX/S#Ai>u%C>#$*i+jQ^\MjlAq%qq?nV1iY#&8@dM<tk$n=*BnMJ@uN
I/W8#y WwVAyh4j15lRldZZ$VhW1qia^VD%P@@LVI8BBS?6Y>iV#eS1&>Wmi+5Z:11j8#Hi*yt%ISniL1lVhk+T
T>?TTn L9$Y\*hVe/9EXw6&NGCib5qJ9iq&Zy*jB?dH:=I+cM!:Qy>HbV?Q$N?!D@J$HGCR9B!n6NZwjT&tVh/\
^8c^1: <^KL45=q16y5dAY4ICW#Y<T>^8S?phF?RhWZ1?I:X>XKCd8?en*JwBD%qlp>G1R#uK%aNt1jX@$^WZ>V
-AWuMY 0009c0c4bb3001202b3 Page 474 of binaries1.zip
j4@</n IIBMmwJb#&Q18Z>eWFnMWHJbtw4biq\AqPRBlPWCcB1&ehJ$5a:BcXLmnjAnta5IZdHS<I$S5lXVw@LV
\G#F># Dn#/hMWB<c&%QeH*PibA8SXqSty!>$V+Rwkb#d!PuT>wPMN<Au>/t@A!WmmR^Y%cW?4n66Ve/bZ#A9j@
C</=8: MQlEEJ&dGj$yp>DCaeLL\jlYeaA=FYP>d5TC46Mh$<$1!BFt\kE*/&uYqDN+qQeummHGV/?$?E\M*L:/
1qb?>E \EZ96hT>*1dybtc\Z#I:K*ijJ?9p!XNlnNuZ5tykuZuhMWTWwR>4LlH*D\dP/A::!CG/lHXR/k$ZJRZN
M^N$/4 ^jX8&TKSlCXH1MN9kq&4ZpkM1V:Tqmnw#MqBh5bAV%>I+?itDii<Wj+tn>yL@@m#<!i+#&qePW::apR6
m%RThl :?MLPyE!\!DZpT=YSm^KJc#<SGG59SSjP?Z4%RKY94Dic=8W#buG=ieG&IjQYm>MPBE>qTR\W5FEtF!y
6Z!qqh M^ttlFkTd+1<mE/>Lu$KhQ8&dIH?+GD6nQQ&\<enn:eCBuWVB=w6F6iquE/ZqB\N95ZR*jY6#L/u8qQE
AumZqH l^/=yubF@$#RcMpLT+dHBh6p#kaKAtQYZB/1qk!&YSNEXB!1QHY1@G!jFX1i6X?#C%<5/wjcP>SiLK>*
14Rewi /j5AKp&4L<%!L!i^$1Cwy1b:acj<w1@pdR>!$6KWpLL9R4p\@88JeXhpMK@$yi/81qB@XY:=!qa>%i:b
AHVWiT YLM&XWi&WAY</aJAd%p#15%adADl=&^DXh:qCCY1<lA#6Rk1W\KpjyFX5/SXPKjp=iXkHd<Z=GE8C>%M
/D5Z9: Qqkt@jt8$kE@d$KD?amCbAWu%VKYZJLAIJjawQKH\SVJmyGyJ6bP1kXF19\=Q5*ItZ^%%XK<Z8YYPCZ&
ZbyynJ *6bIFXp#+=ct$m/L1uZwnl1&8eT1?l/+XKDDB&<JQ*DY4uS<w/l!a#FNIHl=mp9i\Wy%ZYTmbByLlle?
Tn+ZlB S>lEt6jt+VJdJ46eql>BLJRe:NATVi:pp/PXJMQ^cepq$Jy>TE$ei\<1Y6HP5FA$9D6+Y&w4Z>yJCLY4
\98jw? :l<\/>+iy1*wI8+IpNXVWeY1E4PN8mhL9/+8ei<^:y>/XBDe&#<m%!HtM!iptqFuI6^Vw&nkR8+%Sb#<
qDN&Z@ uKhw5Y^T#m#nY\i$bM:p^RAFWctIGl/YWpX&ne48h5Q!ANZ*FqLRhI6h$8#W8j#H5XDJAZ<6T#I4c!k&
81c&%k #ttWY>bm%Z<%\eM\4R&1E9cPW^Y66NVXN48nKyla+M^Z1RJ%q$N1NhnTpyDIc^aJ^>NpF%ki:Y?lCmd:
QeFC<X uDXqVRZ/RDGiXekX1uTKa=HJh=%ywJ5>n&MS%H1YCk@L&R\Ht:pSbdSa4*ElSITTm8:\!W581\qT^dR>
jXBWLm u8:/XN\yw4B<V/*PYw+np=jy$/1lPeiWZB:wyjAJLw$twa^WS/GS&j^PS9pR^8AaypGVauiLqTn&T\&=
@@!Qe@ ^=6BHwF%yP6cd:GPVBXR9p&^M:SJbGba^<X4wi1n1C&<&jZL<DhjF@1ktmRM/T9K*+SJnF@9ZPZhTFeS
\^E*ub m^Ke>euGD@GMHN/cmq49E:F*Y^N58c:EEPk1H=4%C5#hJqy+E1MNp89M$Kw1YH^*=$^HuBm%ER9HGlQy
qh6jb! E:l/Ak%MS*C&1VPn:JM6&*Z6NNEI5@dN9nnZpT#!F6%aQJEMC^6Pm>\MM^9wJ4lA#KJ:Yt>lwMy=udL#
1clc$H FCVTL=1\TRKP:BCpmij##%eFS^L1%ZP<k159MFcyEcm>qPSTIHb*$cRGWc/p!4<GY:jcM:tKZQT/\E\t
^T*X16 MYYq&4u?PKThyn?ESM+4Py1tQn$I464#8HMlZ!BH4/jhYc#I$FD=e8=ReK#VE65cV:RM1J?HuKkMYmlW
T+eG#C L&i&HiHl$1i\MiDqnN<dwCAe?wdYYqCk+Ry5?1&c&NX5pDQiHEZZtNjK8H\^qj:5qH/4an1Y<ySIEw%$
jA#ek% F+u>An%+1HCJeNt1d19$PqQ$EyaSyiC9kLIaM8ha9c^RawYkPE*y!mKcK:kRt=\Nipn#cYR64=M/@IKA
q\:^5G +S*:TVpH6tGm:&QiFMLVqYq>p:1&QpRWk*4FRuLi!X1M/eRW+DnJNTPPce1GuuV=w?eajdN1iD^1PwS%
VB6>T6 XSY19kh6Z\^YVTXV1I^V1\*nL+lW>BeywyIQtV^umaTG!Rd!C!T8CA&98GMIKyLwIpFJ%<E!Ey5&Fkph
!w@J&X VXRhj9GX@nQCaptqQQK>yHIhj5ue#<^dDEJWA*%IXmF/HAw!lLCt#W+6qtC#jD*:9N9bFeIdVanyKJQ%
BB9jTT >jaTP=WMR@pCCePnwKb!b@y%Dt#qdQP&pWC^*VZiW*KSq^6Hld4X^XPD*8M=En8EVL=9bZeM:GwpCVey
K6@6J1 eR5Iqu%LD<=8!<ETy%GbLThX1^59#bAV<VN5jRe:GbG+V#/PaJiuH>GmckLdX5wj9SlBFK5#=CT%9PDA
Wib8wG N/%/H=@wGLEt\ZMu\WAX#R?/ZbQV8h?qY^=YPZ5Ie=Pyep94%u/n+HX&J44k6b+kTB4qHKlK!WN*>h$p
ACn:li NcPd>@wD+hj4%R!Kihm=5!LjQJe/4ElWV5Q19PmK9RuGI$HTW^?b>jwR\8&TXhM&%+d9aEI5Rn\ul#%u
4cqK>n T=LNHHSAq>wuhQ#i?FyV6Icu1#yabM&B>Q8$:In:#AQN+F^/L+tW+DIi8Ilj&Q<&T1q\&H>SKSYP\Q!V
/^@EaJ /$YkAZP>Q/tH@!R%Dnm*B\+D1uWKQ?Deuq>BR+GkedE=B=#d<!6wPAA$Alh4ieC=Qd?CSkJA+&S4+cnj
pJY$?m R1PBwCE+&D5+=ujRCCC^6uj&%<FwILGG/+RyPAJI4EHS8N+N?!$$pFmD+9^:I*+LDTVYeHPij=jq^j+L
TJI:D\ jCnuCj5*6XI+?kC%W9m@C@d?/+Ty*Yd%j+6hkc1XVy4>V%e4bSJbH&DwI=Q&Si/R*XD$bAm/^/FNCLyS
wHwLhy kSWl\p>RHcGKa&<tkZ65m>R@BV5hy=R+qcFJE1!%dWqFTjFqGhyI5?\yGmSe:LLMjY>CKC/+5eC6YEA/
$$p@ti I+\:YKD1GY@4yl#hTLXuImeXbZukAt%*L\NGR8JW6Sbt?JVpK5NVAlw6%l1aLAccQ/y:nuna@jV*wnF/
&?Mu1k A5Mhhi1GbktXWVtHMcut&AiTLalAJtdEb1klW*$TwW%@K=L4G#FS@ILb?ATq5Dc$=6$bdiQi&4VnnC&\
9S/!N& yGy\yGiQDEP\tl&YFc9=MNe?9@k%6$JqyqhK#JDVk8!#@qm*bVGNYFZD4:4$WidCjjD9%Mecd#mdB<>T
Fpu*YY n&PQtawEi9WIJ>?lqSQwn&Bn#6@&b8>SG9LLy&#54*cYFuP$Ct/*J9>?*1<#MhqmyJ@9uawd+y&IAAQF
deK1Cd /LWaEa*b&L\951IbabVh9YdYB5cJJdM:Nt:iNbF>8pb9e>Th9nM\%L#P$tb+Wbj\=a#cR*B:LESK<wK4
?#wT:S 5bw9/K:G/%D:C$VRD:inN8<=cqcjy^/L<lGwwBC=1//d5*BJ=^J=?#YIXP<j*JYj?DTbZt!?&ISHnZha
$wBb8e GpkLZ%e1l^QaeJwR$ZZQ56VMJ68:u>hZ>l&=eQ/NIRQXT:Ctql/nZCHh^$iS1<@1i*&yQ6Wu*?Sn5QG=
4RC#?n dh4nR*u%6Q*:1QB1lp6h%^>?*jE5^9JI$d?R?K49/4qGmCBkj#=QhPIQ@ZhQ*?S>/G*A/lAy*ENpJZ<*
^T6Xi% \K=<$wqt/5@@hDVC>MY585Q/CId\+V5YYAKw<FI8*G!kpK^wRaL$t!bHAVt?pjIy&ayL6YeV8Y+hdaLh
JN\4pl YL=SYpw9ee%EeQ4mW1Qw!d\EC4M4K+n%G!@!6+68JuTVTPG>^Ikjnj!k@RYJhRMh1ec9//E&M>hS/tS<
$aWBbB ZKX/qTD?6pjiHehT8NdH#ueq5JZP=\G!dEZDu#\%\l8*c?1$:BnHaacqatn<IPN4qQRV#9\WDJCWIVIC
iXN:6* I/>w8/5wSh&G1/^iX^^9%I8$EeljydT+c>@LTC\nG=&4uSA6%b@D<5SkLI?hEN?LYGqRaN4RkhJMPJ4Q
L@hMPP &ct=Ad5nXipS5b^:Q5D1D&JN%bQZky@phZ%+jHjA+5m%YA>D+a6!R8ut8m1N8dq1ZI94$=Pu8h<hX=Y*
T5J+?T b$1#5bwKWL4$nZ6Bn%\:%mtF6JiymMticMukkw^Dp*51p/8RMhq>myW6uXd69waaXRP65JhD&h\=hy\!
/n&a>< wV4=k>@9K9ZqtL8@%cP4K%M4+Ik+uwKM6$M\u1=S@L=aSPXJ@jA+/:H=h*iVGNI/ZJkEhM$XJ:bt1DS!
@kHB&% YQMWiE^bLP+uC\dLIDye=5hWXiSPDX+mkD>SGA$mqWk/amR5bunHNkhqZ@XiEe:=ZJMDu@I5/e51@=8k
ZN8elK X>aQ:8a/1wpKjdyPM#tE5iY>hcek/clK&IKL=&5<b4B<<Ek9e#qJ&%WDRl%pC6cBZ*?Il4<meb=y>N!Y
jj8m4? VPpmDX@?ay*yc*MJ+eWu>*IF8ltcHj*I%<5jVC^iQ9IEH=c$W<p#9LtcAR8n=w9CC+=>JZ1??\Vq6kTX
SWF=cJ YJAL5>==i=I8^uk?u$6G//9jaSS+*ZIZ=NRZ84*%%Rwum4*pX/R!C!I&w9J*S%:<<+dX!a!ZY#8JX&SH
>>%+XS H^9Bm<X*FG?/XPW<98A>=LKwYQ9>*LMup/Dk!K@eTacqe\!DWWMee9AX<XuG\K!+b*tKL?WjZHP?pqwX
SDXA:k <d:jGKN9q#jQVdF==<nVGlVbI9q&WQ55B/QPh#1dp8iWMI5VM+WZ+Da>4&<uqBE*4$PR<h9T9nGDb&e^
ZD!5E5 N%EuBC48p9akLS<aP=\Tak<LDwV*yJt>mbLyT1=Y\5BHulNt?FId%YkJt8M%Ze9PjWXE*!WFay1+P*C/
=+@WZY Y!NpmC&Xw9%MLQ<t+pkD6D:YJmCAAR:1RQM54I?m%GRwXZ44tIVdq<M>bnI$EHLw@J$L1dDt^&/MISAd
!QJ4KC QS1:KtYu*6CVAmjC%/@k1?lL<H@qCD\1lTiwFZ^ENjXXbiy5N@tVFnPFdlImtMFYL\*5=wjX1iM!F#9Z
!+h1MW LpiN1lEL<65iM>G<Em$u1kE9Nln$JWnFH/hCMn$kb*6tKMB@:6n1YtdHC@MQIFKZ:q8GycXB%kPZJ^JV
MuGl$^ Cc\ui#PVp&6>>DJ:VteF#p@A!FwdbS>PV+>h8$#?Lp8X=L\wc6P^jJ=H*%%WZX48*X6y:e<:cj*L#+Lb
4qAbhW 8=!5PGqX^ldRT!R8#DLI4#IbjWV<nl9yA>FH*EYp=#h6Fb1HWpXXM>1IqFYHpZNhyZ%KHYQ&lpeEYhl+
kH%=Hi Y\jP9GCJIwnPbH9FP\C%JNdZGtN9+1<bcCPDdLM+$BWNu/Zqeb!:wJPc=/ykeJ:+1I4V?inQy5yL!wdE
WQX1qX Kp=yh^hFLmW@b@Gi<jYMt/eMq:?u486\=t$kF=ZF^R=NA=FPWn&cX4KFmN^5#jVc>?I<#YFZ#hH6K+5P
T^jZ*? XqC!Fe15tH59WhnJNlWy@8h#&qZLSbT?#6%&y<+G:>mEFEy6S=$+@unKuqS1&c4Zk*Dnt:^i%NuVPh@Q
mAC%8T EBhtD4<a>V+%Cm+p1TphEeN5N4iMbt6QTQtmdAIK8n9Vh4w:bB<KqjB^CZ:eLq+<F!1FV*M@S!JGHcEw
6qIV^h i4Z4&#jX#P4Yy^#hj*#lmTDL6*pMtVK#&jL/1n&C@Kk=NudbYuZS86RHSLqXNw>Wq!?VCctM>a8ZK8P=
%mQMCe RmBl!D+lc&5^8@lyYD=TQVJi^mdiZ*JI6%p!e:u6c69YWGliw/N+a=8jWyTlFEZ!JT8tZEe6u&Y6@QaQ
tAXA*i \Z+8ey#jmNyT1JR5Lqqn$:n4$%bZa@Qy:PZMTTK$\8V!JCI<S5l>Ty%hS4JAnSET9PWZI#m*HY%yHC&Z
uA<u>6 $:Ebmt+=9IFqZD!?b1VjRVRGZyIbyK+un%SpnPX=mXypKAy:cSH/i<uKV%P4WF51G:T\Scm/&Ged!?TM
-AyuqP 0003e9fddf6001202b3 Page 475 of binaries1.zip
?1@TWQ W:/PhlC8VmCTjc9kI6W?upWlXp?TFt8qhdEeyBGLNHVeSlD=1nTpK4e6\1t!>HQ^Xh4V/pHXLZt1JZ^+
u%u#ME h@AXRVKQy&JLmVS<t9ACe+PeJKL%>Km&d5l@n=HEZk%Qe&!b%<=B1/<<HImYqiZ/4pw4ZYp#XFKeMp8w
T<dLt^ LpEeZ^=!WR?9q=RI4@piYR9^58G>Wqdd$GA8nncIF$XlSRJl*jTGFpWbEd%FWcF:Sd/IM!X&!</FbL$\
i:5Wlt p1Ih/$&q1DHhl^SXjlAd?wXm+#b=dXc8n:1Tt%VL5nbq!RL:G46/l=\Y^aYR=B%ZQ\T^M>NdYb$A:HWb
p+?m!^ dFI:TW1Q\JV5b9BTmS!ZBaIm:!Nu:>G%cCu1=b&G65>h/E511hZq9w%e+AC@?eLwYTHZFDlSVlXqAt<S
?nFH#X >6ac?+KA@aukq4iL$Km*Z1=LGkR^%eH?1y?IQ@IN%YX5iYSyZQ9eI*bNwhIaDFdZGpN556^8$PAqjXlE
\JPN?4 #4YyYStp%bGhj@t5=ybT>nlFj4*G>QTAqapFJ%cce=Nc>59^+I^Bikc%ZDNKy+q8NjaLAXlLaR1+qhaG
nVjy8e d$<*tWWY=C69j$djJy<qkhZF>Zy@EntT9EREQeWC5W8pjST+n@Be41DwP#!6EHCWI6551AyNE=tX<$:R
lX&AF> QqbtpFCYV<BhbP8lty@8IAHjBq&?<9e4G&L1*PyWwG1yN8kNnT*=N^@GilZLqGjIwnbGHW1$@QLKY%aq
@kT<^$ <5i4*P&JaQ&W&E16\Mannnq8<!eGIQnnFAJ#8W$1uCcW<^81jpPWPe91p8?l>:bA?IbiKw4ZQTY>qj&S
:PK!tZ n8u/hIH1&e5P\X6Zw*i&l=dXa!IqSJ$KIY>I*:\uE=d>w@9GWam6lHZB5%#q%\V!:X1y/1JCpR=YJR4S
CY:NiZ FH\DEFl\14854BM$SJ:qW@B^t8C:6NNapJtXC6</lVJX+hwMM/n1hG+=8q5%^F4n?B4Zl+ZI+CGTN++8
<dtNc% 5tGKK5MbeRuVulGB69Mb&8$ZI$LwKIRi\F#t6Zy##51<Xb*G!5mmySepikNB!hdNat%Da@cDKmJ*!EAK
wkKip# +nwG%l!/<Km6b<+GZmypLpHy^SZlQi/ZmF4?kAa9d*k&!tq<%6#5</IlB+6IZ\1NhahbCSRb/SbF1\VP
1HCIJN p+i9kt#E1cnaH!=:$>Qm&?9c&N9VuY>+y>jp/^yP#b\>Z&^uTJZSA6jw8t=QTXQea<#ihYjPSJXmjhQP
Z+T/V! :p1u?p^InAE6^eP%kXkh4Ku&uF1yV%%dCI$TTZ^8T!V=%mMNy<m%wcke>Tj#?Aql%SJ!X@VY/1Lq$\\G
kAc@Kc pIq>bMHLY+?L^J?&4Sl$L/4#PeYG<p*JKDbpVFAYX<c6kF:RjS>c+D@jdCLuVFLAbc^6h<&XF=\YX&*B
Gqy:cS hj#$wl!bh65j4#Z\6B\!cD?emS@dXP/m!mGtKc@@HnRjQZChMbD6Gy>QLKW>tc+c%ZKy%Q5J4THbi<Fy
\+VM*$ CaJJI5WjKFjCJbT:Z5m!Zc\yNR<JVF\u>KCa?4lPcF<c@8\>HYXihW&llk^@FW&Eqm8E^nZ=kYu=Swl:
Mi*%P: 16*wmwthT*B!%#eCNVZuNdLNWe6tDQGeTTZZtLQ6=T5lt/=dAleK?&GmJ?%+6la5X?^+KlNZbe+YE84d
CQej%a 9HNZdudMn@JAkm=eWM#yC!LJH#:S6%*bj>i8/A@*<6pejeYLNj=qle*e>>CB>C?<\w^V#ebVR!:wTNN5
5Dc^c= FEjaLQB>=e+nF6/=WiD#WIE\$TYAZ9c4C!GT$=F49eT9tM@5uu:FyXaHdj8LL5EeX\e?TT*PmqbT*bQ@
XdbJe# D4>bjNuKJFVZkaman5\5u\=1VhT!eCSdpw#I^edi$cQq?hZ:hh%Jlye8>CDA*/=R5diXXdwE/w8?G+JF
!bbaF5 yV!i$*4b9tYpXy%e^qPY8:1N5A9^>B<u>>A:cu^EBtj%:N?Q!jujy*4&:\j\HMmw\6GIA^lX>D<XWiFw
C$8W>4 \I1w?<VGj%ItB=#w</iJkDnSA$:$?SW$DAkcF!h/\Ip?9+JGAEGDecGSANAIuH>9FBA$Dm%Z?AEu?9\K
e1cN/? GkMADehXD+pC@^acTK#BehW:w/C@lRaTc#n4Z%H\*$IDmVWaV58S9+WGEt5\ZHGPR9<YGpm5RbE+%l*R
E1hj?A +N>CA+p%*E\!?n@XYQjBl#LJ?\Y#i$\!Au\Rp+\?TI$X5h85@9>SQd5e@H>$>c!kd%tPXMTEkJCbXlh@
AEQ@K% cWSBX*$dkXqQNheNTTPYaQMMdFPbE/9$k&B!dW/E!q1cYV&Ca9!bTBCB$EEX6T<=XGnldk?Ci/>AYeyu
uyQSI! XM$kSMK?YnF1:64IlnL#DA<GDY@^y/wIX&6%Mbk1$!Cn<N6tqIFPhc5N$>m>+u81&qFZ>TYC+E*#H?Rn
kE#J&@ lTWHS6dPZ:LRyt<id^\@JYjIQE!R/*P@L#QY1dFCkM*k5dE?6/=FG@#^PaM?Vc?Si8XSTmqd+heWq@lc
Mut=%a ?\%DBAe4SwwF8\WFwe<1E%5VG/MHhhZB$euLNk@:*aSDu+%YT&yC&mm?nuThbyRADXbyl$/lin^haQE%
Y/8jXB hS%9aq@iM/=uLy&LZVyjhjE$SD*wmKi>=J>Cy<<<i&ZQFN@8lSjhZJehc/pe\QKHqw!M<JGSL%8nI&:I
D%FYw% /111JER?6c$R*F^>DFKhat6eFYuR%Blt&btCnB&=w+/B*Alj4Zt6y\68tNwe$95mQhQ:YRFE^5&b:*Dj
jG&QpD VXPy\4JnA9y<PMy6Hi!4tlA4K1W/$n1Tp5CMwQTj%4:VZ6lKuME^kk!><e1a:6K%4nkt%:!T/n86q5H9
betkkK ^a$1F>>/B#I<4!LTMIW=u%/!8NAwy=Sc!mmle4E*/Y#!5\?nX^DawChnyV:B=@6EPwaJ41FbT:@#^5%F
RnYqVG Yya5D4+wa>hWq^6yedeWVt#=!H4JyFnBH9V%Xh95M/qR:TP>*<:A$P>PhK$lIt9R&V\:tni:d:k=j1bN
PC<4Ti Qpb%V6MBdC+/Dd*Zbtb:^AG5=%^hH&C6Vte<=GHEX<kpNe^l$&*MJVh\k\tYM=Etji1ti8/V\CITu+uu
eXw:Ra Le!\I$u&BL41VEpP%1TuTDj^@XLJ!Xe?E^$S+&q?d^a^GGauV^:aYAkjaTMR\w1+K*I?H5A!Mtd\Pam&
84Tl9l MMmBhlmQcB4LTnapTZtiMNZFFJ>:$>nhZANtC&C6qR@c9q?MythKjy5LFb/CuY$G$c8G%<Vb6ZcYh1Sc
9+uZkY p%?KFZETWRyl:?m:9Z1Y%&1:nC5=PE9yuDy&K%Pid@HY<hRALj8FP?R6!&M?>N4umIR:<@&Vu:AapZw:
@$kXy% &hlZmeq6Vl>:Wc:bDnw6Z=P?E&e+L:^eK<TedM!pJ*=TJdV8@m$45!lN@\4S^pSpH8F5!6mqTHtmYXR:
Q^YTtG E>@M?W!diM>#/Mi&pnay5D91RqBju95?cecS=!L6C?AqQpLS9A+<<dTXh4\$+<eJFIYy?1RaiSp&F!c@
e4TC#$ 5GiC6jR4tEct/HZPmJT8^J=8MZSe\iNLK%G/#<5#!nnTuJZT<*/+T+/e9>?iN<qNnbbS?R\5puWX/8#5
1jw<C8 ZedZmD#Fj%8WdlPc4VjByM>=yTCi&bZ#Wtm*Twte?65ecPNDA=9E6*GI%/M^HEY/#Kp:Htue::Yb\:Q^
PbiciA E^5edudV8wwZ>M!9PhVyK#9kHaNlCF=<KjX*cYE/nZ=N%Z9^Iq\XiW>p6IKM99uyJhG*CMI1D4N%1i!a
#1BISV 8G<9d>Z+=y4/18ut6?EJ$:NcpW8XZ$bmXHuind?uCM?@15:jii5B^XL/8EiN?i4+5>FYhHwDDNb@jqKy
%YkLFH ^ZlV$@8wKtpS@5&J>h!VtHI1N$!/Atq!A!*aW&YhNqt1qmL<J4/XRi^Xbq=t!Z=88pA:ujYpiG</dS=h
a$=@+# Nq/6y8S5n1?SBX!Q4mkkNlDit5a4D6i>m5k$E%dW4nAaKR685MRIBymW4CjYbcmRZaYCV6^nT>S$yLVj
8W1HcL tpk1JdMX:m^=?=EaTm^!t/Ny=1bIqFaKiP^8ywDDXd$4%N^jpym/T@R>IhGtA!D*IH$PB>&1$e+A9eiq
hquTDI 6!@F1TP$!dQ%4\i:#=MlX1IdyJkVBM&!>NL=b?YaMK&ikqdDGS&NTueCGI%jeH&=ch?JNhE@Pt/ekKS<
HR@F=5 b>Xd&NPb&u\dYh>b^Hw<$P#eHHN=h$SHa^=cww*yNn5wdDBNcMHXmF=*\9ca?nqdkcYWN>>MLiLp+/bI
Akk:Ru 18VZ8a=tn@XiLF+DY#qM?GlVT>\d5&&HcQyeWD>&b5M@9IDTIh=HLmZEeK*F9QBp#tRhj=Hp#eqbI*w>
lnpuZw V@AA<4lDwGXlit8hYpu%@TqjWQ>K#b1*M:Q4udTKwbGkE<t<qdAWVqPShLT&+&yp4^H@nmwF:Y%uAZPN
FSH5LG S?<q^$&1&m&VGKe*=BIhZ<!J?>PjitahYHDD59REYd\b</l6bYyE*ItLq\TW%JyYq!=\%PujZFm9FBT6
J1i&\R \AyD9D^C<QqW1Xa@ea5L:wVSE^N%85&R<IYW\/VphH$yXT:c8FTX<d*p1:=4MZ64\q9pcJN8Q<Y/*5h+
hu191= 5ihie55/bJSW?jykjmbw%DHQ5i8m9l<!6XP$ViM<%J9$P66LbjZ><\nKV5Y+QYB<KZ8qab*^dj=ndu4R
ldk1JK D1<y$$!yTNidR8HbX&VH$6QV5Auy?FPu<8P@#p^$EV9BV&kIIPiKZ<!HS&ib=hFSnF$u11F=unhM@JBq
5thD!c 9nK*QP<eW5*MWbXJWaFe+k6L18$p?$$Q\Y?D?ZcpD8GPt:c?W4uP?n*Tpj\*8jL1tEiXw:ZZI>^QSp>>
:td4J+ #F+$\&IdP?BDVLi#KkJ%HR1KIPhW\!#VL%LD%!#AY=<FLpH+ciNK=b859*c9VcF9XEi!taWYH*HMJmt5
Pl5>qV !JV!JuQQtG8dlBPSi1qJSydHdBGBmlD#hX*q$h*+ZT+NbuK6+*uTm^HpNp?:%^%de&a!5Nc&$c$pip?:
:VF5/5 CuSIQMd5c+W*qat=lT+9hI!YW>RRTX=XC^WXYM/R:?wlMBCi5*pn$$iW$RLPL$EEn8lb18B9yI!JjqWu
!bj!N? Q$Qe%TeMVyRVnLRSn9S$dIGEI@MLb#Mh9+b\naBm?tB8/HI4+?E!pTKHiB%?pE/8iuHu6dJC5Dy*YWqy
<mwA=1 Zpt\m@D$/pjmcL&8^HDBFGFu4VPBb8CKQ55K=Ne+9G<<^uIe1\*TNA<:y^wDXeE=b1?XX8Z+nPlph+Sh
^@ZXKl /68KFp*Ii@Iel:#^GF=w5CjJ^*+tJ$5HK*<l5SG&YIX#ImtDHydtPPlRaFhyDXS:E#?ypupL8QG>+hH6
hh!H@Y uLZWwKyb/lQJ$cb8HY9TNA:ZRJ/JcannMj#P9:pi*9BewEEpn\=S>9A8Yc*S\Nk*ElIH^XwH&Xpuh1jB
8CGq5I kQHupX^WV9ZQ8b&pqt<\E$pWYD<=V69I<nb?hh%G8p8FdZZ>NM$acBqWGliQ6u%K\WjN*t4LFQn$mQ45
G6<NZZ q5ZpB@?8Yj+IA5qq11WYtQTWlw8mE5VumHTP6DSlI%iY&<JS1qpcY*a6M4?S6@FuKhmN8j#5MHGKL*wa
\M5acR #yA9V1wIJShkL+VRNYqI*5!bBShi#HZuKRn8I/L#mY>N6!n5K%yeFeuDuKC:DLMye6d\j$Kq\pB>RqNV
<lFn$C hXK\e5YTDPa!wp&kQlXuwdP$MSqa@:SNRLZ6uFDSn55CL&QP1ndhk5n5TEiyZty5lqdkdBAb*y!T$NNP
<qw4Ry eC:hi>GR!#FLjnjp$5M*#J#wYWZdul&%tI41I/\R6bn8YPLRGAKyS=8IdEVF8LZdP%#55DLlb/9tbdAw
helX8: q#qF1Rm&hSMyPuy8@ntBbJ6LGIp<**b#BW<k1WNMq+:?5Elk%twRlc!IRp++XGe?lmY^QN!8WGhL!!Yh
QywLPa %P!1DTij@VIS*kmFpCBujQWu>+8N%LH=Lc4q/muLJabEBHQEeYVqhCQuKe#WeuXt\Y$tAqM^<8Lld&9d
-AN>99 000b7c05b90001202b3 Page 476 of binaries1.zip
1lS%bl uj&LC9A8^K+n=1S>iSm5KPVP#A/W8*PEC#cbeBqiC^<n!q?k1jlp+D>XnP&=+y<T:mmTdKaqpqHuqGE6
E^dHAR =Z\YJqR!ZXXM&=cYwCBKF!R6n#ehCWI@I%9*YHNq>dI1e#%1Y*YZAjw\mTiGy@M<4/k\9>$h*w%!Q1+/
ahB>1I b\%=tFLkhu95i@L9N>hP$5y@p^QSpjW<k!^piJwww8XFwy=6<uEyNyj5p+h6J%:j=ut<Ke>ECewq/ZuQ
/cjt=S b5:6kCNii8pC5XwBwDDZKuImKy8*BhpW+qS$YW%PENmmpIdXMnY:aaiIu=^t!hQR!%Yp+N6F+:&TlkY&
W*P<Z? I1*aeGNNhqn\c!$l&Za=GDZj#w/VelQ^$a/eYc1TNI$!q%/6+#AQX</PhX*8nPdqN8PqFckP9!Sa1&/=
wWT+/b <w*CmC1*uCRu/Vul^HhN/\dYVVy4Ly99uM?^#\/Q^mld%@66tPp98pKCYqJnu85+aYHY$<Gc%Y<e/kJL
Y9HdNi #pN!k\&Z=p$mNMq!9/j#ull!?8B8KX&<\E<6W9dIMj$=*&Zn6RjC9Yla6LlPlhQuyk*4pJFaB%M#p9DB
Vd<!!k ^bHcPbBN$?d1c>A:L=@LpWMm4YYD$Xjb<5=b#nGy<?lVp8Cy>XibWS+*y$?%DeBbF+4?*%PXFI:GwW41
c^i*#Y 8j5uFZ54#*?jjP@i@ihVhmjImJ<ZMPnQC\Vp=\WT@jMC>TjyCWGljnKhEA#/#>?kEBS+u>EWqZH%*mNP
?6i%X9 \j<mWYH:kL>dm9!9pc<I<D@JX\RaMQt/#\Z<k&W+kJ#=/S+A>PpBS?Z<ClwDAI*AXbl=\FE=9+KGAEHn
jjcR@4 K5#ERH<LDRPA*m8bQSkN@!$$AkAclp9=>RC%*X>BA+p%uA1wGQS9waHEGkS>MBwBB9<YGpm5+TRCEiB@
/9&!E\ EIFw=Q?aCEV@t*+1Aw4=b$?EAB>ABMJleM#@LTpFZqJ1>V?>yLSAWhTAwa@M@Iw<c^C?Zj^ka=NhBKFw
Lt&E6N ytRhA&!tA56jNTQb%h<KN4NmC!Iw%nncClN*!596?5LAX6TWEed>SKkb\h6XMhtKWk8\PpZdt?Bt!FSD
BcNmw^ GXuINBkqcDlT6iuX>/qpt@IaBHHD#w/BWylleY>Li9JunZ/#eHHat+#q5h+E6MWPbjN6?c@T<AlXy1eE
FMB\B& d96T4Ha@yXnVRVhT9=*STQd>*1ihGi8!I?6<^aK=wV!\BT*>n6HbSLXS^bTkH1uGh:QqQ9hy+4Nd/%RD
%>9RLa FMKS\R#u1bQPiyuM<d%Y:8qqKHRLI9D4>u$y\!DJDB4=FA1NK9q&qtVRI@5>SM/4&hVwjAy:L*V$I@5d
wH!AGc !91dbh\iI\=JS>QL1*w?hAW%B6u1DBCRd*<%y/jJ?cR>i*9>W?GMbClDDeN4+<GcD\ZPTNY\>>*\=tH9
T8KubL 5%hWDZI=>aQX4l%qqiPEc#yLHTpXy4PbpYW?=lD:Th8%/an1<<w=6JX&>6qV/8/W4hBp+l!bt8M1*IP*
!Rl?Q5 ek6Spy!!k^+>GpNumJ?B9Wb#l1++aX4qVpiN<FT>>m$@N/\VYj8yEhWmQma%$Zy&mPmIF\&LekLZeZ:Q
8L=>qk 6Gcy*91$%1Mnu15q&yh/6MXda:4TZNbcQ#+#9D4eiFSTM!daNYMKa!HYa>w^D1u@I\X$^N?IF=d/dkay
BGA\Ae /ZyV?dt<%<P4A5yDI/\Cpq8=y!G/M$:QQ\ah5cJlW4+dPR:*dW^i9B>F\1<>e+i<ulDbMp**GpHFVA^l
KhQdLw QB1RM9hhLYcF8SC%@NW5q5>C^F*8yD!GeEDcpilI&Qi5&DZmailuh>hLu%GnkaYM5HHwG*j5!R>Mn#T!
ctH1LW dm1Ha=RpQ=D=$8YI!bR@wE#hdMXnJLG@^8ei>LDqeew^!>MluZF!1b9?*%KQqIe48qPiyF??<8!^kZq\
Z?I8bX 9RALZ8!*@kJlQ:\&n6\F9$ieNDD68FyYH8+6bXwlCde8aa?:NC/D=<RF9BVF8E<>IAtc9C&QYA$@>5SV
hZ$W?4 1Get\>Y5N\heP#IiNQLF&mW+nCa%8C@\SbYN19Cbw:YjbRl%86t$q$W$&&8bP4E9&4S=u!MJF#hVF5L%
ypnHND bjt^RmeJ5K5*\uXAGR%5D^?Il!TI<V8L6lH!6KeW5HyqCaa?FkQyP4*KnI^^W*#<VcK6/d9%%uE6Rh&H
HtM>L= 8jJwl&PEM!b6YSRET1Jw@b%996#S+k$X&nVuDctWN:kyM?kqT4DMGdiLp:J#u?pWDHaPC+eLY=dEq@m1
9hwc5< 85F+%/VYBWL6GBa1^!R!JReLQ*6>u4$!d%>$>h^J!ddd1i:*4k??j+99h$jJDM6u=YZ94=Yn^VJX=GX6
jt@\wH @@KtkJ545wtT#a9jlLX+^!McH>wCI:y*KtYXVjK=^WWa^iQ6E:q=&!@^:!d*9aSBtZ6y8Ppmp1tXFLZc
/Kl!y1 e=+!PPJJ<+hhL/miE#K9nLNh<iLV@J^Qj84F^?LyY9cMF9S^P#L?W9eFAjCD9Lyb!l6E>G&NG5>#^8jt
NhhQ#A cdN%L=QhQec?uhHKWqL<uH/MuBuPYetKIP$/Xyt#*8%\&??&W:VAcKCYM/W5:SXS+cYuq+h!dK4@kNei
N/:ijA &hJjp:@qqLl?Z@H<H@!jaw^GDDDc!=E:/uXZ*PJZK$9A@59qCWMSk$b!$kIj&pZRW6a^YiER:iSuQGQT
%1QDte *>e>H9tN%d:&>>68ZBYQ68H&eC/R+/i!jZn<5ZpjlEDlPy@8lJ8EdlD>E@yqX6jK6@iKZ!JWmCVtE*j+
\W=u># EDVnLE@JR/9M&VJ>G@y<IVb+VC8c&<lwh>1umj&wt?yWF?$\BL$liPpPhib8wYic^iZHNkhX+6%:*+/w
N/%<Q? Gd8<PXqejLXQe%CMaHPVWuDG9uGabVJk9w\J@/&9M&a&1$1TLb%th//lyASjQC8!GGVSVm*!NT5+n%ZN
8NI4m@ P5F+YI1K^hKW<pa/y9im!b#ydeZ*ih$R#5&B$>ypPk/MjRy8P!D@p*IDARZmwytCDEVa44VKMHj^e!#T
IeRjkY +e^YEZK46AYpZ6ji=u/Y9$YhST5Wc/>ZwT$H*=#kH?c9uW8NWl?%b4YXWK4kVlYdtl$5#XY9pW>9=umn
>qlh$Z &:>>/yJ=b:dWG66Z<<pTVe?hiy+lm$=Pd\WSd:=X%m:YHPE#YpQ*i%bp=J*G6T*$%eKe4\VJm6QGP4!/
4cbHi# IjkeQ$8ew:VR$NdWPiVT^M9^mQF9Vh4pEWd5*?46n6*Pu@yK#F+a?D\@TqaB/e4%dEQ8dGF@Qp%9:EXW
IRhi$I ZddyhY&d=dP5p&PCK4Jl>kcZ4@Zpu^@8%94ASnZXEZtKaeQ/iaJPZHp91i4ImFND/Aldb8mKqn1tQckp
IeMBkX 5SeNy#+tZQmlZ\u!SAD^cR$1#ua&lm&chWD6heWbQ4cXq!mmHK1MWe%l=dq*=Gt>/N5uZ#Fb&BLed8y/
D1P6=w @1T=$>l&1NBm<4Jna@NY5<1a=RTd/l5EYu*nh4#Swl*X:WcNX?NlL>qMjbdqu&al/h?P9\C:Y**1ujFJ
1<aTje QnKML4h^I$WYb=%&=b=w+1Y\!!S&<NJcVY#<FPGadPu@+y4n:XKK?SNJ#SWXD4jb9b?Yw5$nZ\RaQulB
V&&dFS SqYV&6nc<plRSj4t4jMTlWI?DN4mGp&&6SJBwtiu4RWwJdZ6dKj=e*&NM<T*b?Q@CET>IYSn8kw4uJBm
pwVF=9 Q1=V%c96hah/TEj^$cn1?@5Phhw=bqt\\pC6+XaPMyeQCX%aB!ipXQ<H6*/tpY#be^*+YkKStYV^tZKS
F6y5F/ k:MqAt1%Nl4wM%H%u!%*QNt^p\HalbcCq/SmIY<p+PWhZ@5NP4KKbPXD9/y9jM/aK8<WTjA9i94GLI=\
yB?Rd$ P5X/:Cqy6E4PbDu*8D/Zq49M5piHbIPV\%PRZ=eXt/R%lySA/&9MdVJb=jq\u^wccAy@:ekK*w!V$=^V
#XqL!Q aDQZ?IjiWay\QVt!eZ%P4IqVlld*HCpZT?qcZYP+p:Q!bMnK%?DNTZk?\&blbAq@+15TiVp8iWu&1c=B
K?@a<* 5q^Lk#8p$t$FNFwmj11cZQCMSh$*>ZH4=kTSNy$lXBhLRqimG>4#A>@^H6*5Y?^^Yd?wKh>XIdqBWhu4
?FQDAT El+!*:JBMVqQFc51&ddGW*Ky:*GZ^mm?^5SEKh6*aa+5Ab:9:bXF#iPS=bYywn5CPRZDHS%#<^!h6n%u
nWS>6q P6*$iC:it=?aY:+ay8al9/d/LFyhjNHCS8p?m?**pIdJ/GX=5&CTjCL\BJl4In^qa4dpljAX?4D:DBSP
ZwT&C: 5y!dbI94ptW#J%4jMLbViVS9\44$n%Ha!A8q=*AX5uea\yyuJ+Rcn\uXT!k%&Qh6XhIJ?ET&6R?/8MaF
Z<<<:k Zm!e$H:heVjp/G8u<a%R*+9=EWhX5$<X^dB61JGZZn5V%WNMEq4J<@qE&#\S=aC1EnlN<&KmdR>wWCmS
iS&KV! b#tJaDN$RammbFyX^iDP\lq?Q&\?yXqmt+CeLM6bWy%WW6Y#yBK=jub!HD5QNEGPBCb%eZXWBBanXlS8
H@?#4l c!&I%c<Z<9Y89$Whh>$<E&kSdYhI!h5p^He=!FbQLcJET?Gw$$1iyy#EnX/5H>/pFbiYQ$i%q*45?YC$
IP4mJl 8>pR^jTp%y1$HeYJ=LZRywKh/N:EXBi^X%wkkdLp=E&GZD?Z:K+btLclZKH@YbkcPV>LQ+@XFai!dTiK
&W6N?F pWAIG:?1VHAyMq8^&=:Ecu*cdp:^nXCc8+*1a!j%t5+<!m$Jh:Pq$!Y5tAA#jbm&GC>WLRc:$+ChdHq$
KC*#u9 t8\eJHdY\Zu/qi^GS^/^iQH/ndc&=lb$APGnM$V<aB/4jmiLT>AS&CLwS88JpVhMnnSy=nE?IaLuVnE\
SJdDZi C/=6/a8Mc*6$eqbKnJnq9CR5mMk1R8CLk@#5%nycmb5NZmi\PRpjITVFZ8hSncG?HA4uCwJdyedAF$l4
64Nckj $^bHc9tdH5@**Bk\8S*Bb5y8!^QWRXEhYSMkKd*tk1CLBQZ*9e4>hCP@QyY<dtYwX:HaK+Q*FKhZqHJa
jH#>l8 1&KM<bwM*iNC4Fym#65A&dM$d6E/L!H=5y=?ZW:#+$?1A=>WD=#XwakuK:9Sj!Ib&yAaQPRQ1S98RtCH
c8>BnJ Bn4K/h#t=Fnd@FRXWYRiPZK&X:VwKlLbq@Xj$<t@Q916q?W:YZwYdi^RaY%+JGkED$5cp5BTpQEqTBVK
eyB$G$ lhVp/uw?n^ibPAmXHX>Y*QtW%!TH5JLq#Z6GTM9cjk\C&S#E<k\taahw\Nb9S/=A^LBEY#6<XQi<ZYbY
>nRh6A G?wCVLVwJW\Y*4GGSwj$P^Z4%5j\=6R1!cqYZVePN#m9CBG^aqFLY1dTddqu\>hKLP*dPtyCb4bM&$^6
W$ED1* 9>nD??/<\#*WQF>4mN=b^k>PTIb:NyHKj8%5Sh+u?>VQEPYeCTay4h:&FVY:B5$YdjM:T%nY=PSmJb1X
GihDMS IZJGhNnljMJEwGRiXed$Hi:uNpR9XLtHLP*\KHLZ6V@IQkW%uPjHi&\>J\<YL^>6YPuejB$!w:B!p5DG
E*abCm peVJd1R<=/L%ibLPuG6Yml/!Yy?XDX?>y9kET*!pRE$YE$tBjEIYe<<S@6+WjJ&w\ypNHQwyen+t<4+>
DF&eMM <kFSY$69dQSImT?CWP?J#@aHt%G5b=RX*Xu%ITK8BAbHIybi\RjWul5BPmS4&W1a>WjYReQ<^i$TMkaJ
Fi+T#\ WI<*Kq5nC&jQFH<q\p69!i$1F&!L#*q%8lD:hYZC1<TSK^J>9um:XbXBK$DJl\K@BSdaV>B#=lkLqlTD
&Wt9Ju jZ&VYt?^PKRJ>H:B+$PKaRiLSiTey/#+tM/whHKqDL&ERBuX>RcdS<YlPaQ4IMh4^WEt@5V^w!*mF9HF
\19ZZh SnXyhu%IbH#k6a!/89!E+\8hq\4\=b+N=iuZ8Npbiw#a!HYAL?pRl6^9QM@>^TFm<dcXGSZDppy*95II
6<lnZZ 1IG$Kd1aXiW>q%adSad%+qM1<VTGb&i1J!cn#%^c8/1G!nVXmXJdYjW9*NRtEnLl@^bR$jF^lAJED<LT
-AdNK6 000a71d8476001202b3 Page 477 of binaries1.zip
!P5hMK e@M48Xl\9wY&kmnd?B15tC>%F>!4mhY@TGMi?D#5VZR5mTHq5LIjnX5#$YplGeZwN*/X\$ejWH:&+6!K
y>BmPZ P@1SYHAneJk5bFE5ibWk!GCTIpE?68JnJB<B%49!NhWwIWZw/$:yDiL\JKwKd<<l:R%#@ut6!?Cn^nL/
$LaWBT QP1=S^ddTpQCS%:VjHMQ#@VP?//b?Q%?\uGjEtXCG8@5n&iY+4Xju/H&Ql@Cu=e#D@yAq+=+N!%AcBTl
hc>dPW qBje&YM*iDH5aw/:HbqLSa%qLQTK$u$JPtL?k8&u*LP8Ly!$b8@\Ebpu5aLM#FHM$hyTQDeWI\9cNtLa
1=!AXK \J%!!kcPeW=!/@KLt4J8Y$byd*j:T/F%9Fj16Z%!:iHypMi1=?CLtL/Lbi6Ld68tC1jq4hD46G=WVn%9
%tY9au Qp?<Y44A//JCHt\C<!8^m?Q^J!1K\Y8PI#iPaY:PFCqQY<J&^Kp*^W5*\StQKRwmL@XpB+:LcF>dGLc@
^hTRD< $@cJe1MK>JD?44e<m6Qu+JP/EGD+@!=cCRk\+4>IL5Mk@!TZaYDA=QJQj8pj#NW@/eJ>!9%@VA<nDnk\
RE%pB/ /XjRcCBwHDY1mAMPVQwF>AEHJ9$VnWDlRpN?C\$Fk5bS1+tA\H+LDRiA^1X5m#lASjqZ$EBmDabnPRAB
MpESmE Rj$YGpm5\iC+$JnjRWPB^BwMnMN4WMl9waHEGlVZF+MCmVWwHEieR+HEGlTHwm<Cm9k6NJBak?B1wXDW
FXGZ/E d/GB^B48^aT@!!ln@\W?dDHl4$LmH+5JeQRBm\u@L4D<%&IC=L>Hu?L@mKymm@>QcQJc=8m\XD5NI@hE
^/WPbL iN&a8\MehqlCV5ukQ\XuS6clKTpG:BlWn+SQQXaI1+6MWlS?Ee+K!t!i!Cd#=?!tLjDQcleMwt%cbC%h
JqZPe% y+lupIME5VY&qjw/jADSYuuASM9aLNq1#JNP\:R<+ijXI!8Hd+5MPRtbNbT=htASRdCWd1*k$cG^b$Qc
HidISj 6@qQE^F$#Pkn*miJM=WX^%1^km$jeh#9E::a>XnLp@AhJdh46Rndp&ylcyS!6<BG4*a&&XmMQILRDFZP
Hq$HIZ CMamI/HDFR^1Ji@VtK5<#\<^XF^+kaRRRRIdHkR:qu=qWEhb6hXAlXlq<Q681JnWI!JKZ&1a4GhaZ?tl
e1WG:8 9NkE/SNMdhReL1uq%%Y@!D*FMH^Quib?%d5:WwH!FN&tDK$Z4:+LNdLI$JXyThSS$#j4CeYK!/t?NQ+k
X5KlM= QEjV%XV#\X65wM!iS@CaBh&C9aWSBc6Ra@WdT<!^9wn=wcP1:%LYGHZMZSLKKJ4L4G&49IuiHG%n&8aY
LAM*JD w$ILjG>1:T/a$RFdmyV$IiKCeqqNti+#M%uX?m+^QBhQ4Kt&b<nuhpb&!Ai=D<IN8=B>NYhtMAcQHNFQ
tT8$Jj =eycV@5d*L:/HG8RSNkbQy8!cT>CpeDK!Cb@^NN?wQ%HEjTk%^?TV+y9>#A@RnEkBHkNEW#<+Yp$Sd*C
W4LR%l M$/%hT19iM=8PWL</ll<Li/iE^5TGqwXt+L?EZPmaNB#LHMTnmwL:TcjEC4*Qm&aNdDR#H>LVTkJ^hE$
JAE>V: qt1Al9JubL/y$ic+TTH\pi1GG<NV4?&:J<!QZqwq8jG$ypHn=BaHmC1JuuCPI?&Xt#DaP8%BkCZTqCuD
%?#4yi Yq6EnwtFadF<9PmPJZHF\=Jkkii*E8^8CPy1CH!/RTmXnZRl1Z=&j:+8M6qKTp%iV4*&HdKYHZbP*j\=
DGPcR8 I@Q5\KJ8t4Gn4Vtt$Ii>hZy4<44K%i>b%wL$cqhmDGJC::iGWDDLCMqk&VMn?iF8RbPYHKIFE5JFhb8Q
i9k6pM B:W<hXY^am*EJBNH!cI<4ehWKn>XGwi#8t9:bV:l:mm+1X6pHNHd/1lac%lPu*ddQFmiSHtbd#whLK\G
edH=+X dtq<dPM@<Gyu*p<!k+Pb&bCm?%J?lPB#VHhCSjjIGkyS$GVS4Y*T>y!e=9!NQyKKJJcHM\>6:Z8c#yX%
V@/\1B X9c@*LI*6+Gw>^Gk<@ZD@\CdS>6\hM=GY4@4?CtNi!u>lmB@F#:hGV6h9QNk9tA\+u=iMpqE%tN4<I&l
e?CZHy +BVJ1cwEYTM=<#^4:ya=aTtHytm8YS1NpY?Ty#kCk:nC#dG^!<&tXTVt&BMi&V=+N@WV1NNnuuR!K*M!
V8#mRm JY+QklYdLni$$=tq\iJ6k!uAXV5RVj/be99\J@t6nK^1*c%/@8Dut8W?W?jQiWCwI4>jH6%/ndTm9i&?
ccBN4l cSGta#D:Zi@h%!D!!CSX<C8X=Zk#%$1SY^*B4NwEmTF=dq%Xhh^#J/*PBWB<iLV\+:h6+1e>hLZFH?q@
1Ftq<T G6Qt5k>RK?#yicD<#4^+4q\qcTW*PdD8Tj#<b+Y1%^KQX:Hdh1\nAwpq&&hT/SkcL/Wmbw\bAlJM#5*L
M&:FhH mnn!PL?9j#b#6Q8hc#y%5p9K/W8e>I+N?SE8hhJ&1*@$Y!\IhdeS\IaJnYc<RFXW#8&C!SmQb*YPAaqS
QGH/!Q b@1d4y=hQ9Y/DJ\i\K&<Jm$hd=/yJX8qYQ$Aa6@:XWZ>6eKJD9Q4>Hl\$#LTF##^t+6t\*k1pWZa&nac
h^AqID ^!cXBYGdY8EiQ$%aqFikKNNqmncWSHmej%<e4aZXdMkqFuiPnEcX/acbidieVVatTQR/m4@C^8^6*G%I
*Di/*J qQ@>$liq^1<?kY5:W8ChMBQ:=!@e#Bcj<mL1lQJ%QhdXek6LyLnF/KRDIVupS:AL\djyNc^K\#49cJc%
W%TN8+ 4%ltG!C$!?myRE5wXa5!N:umKn=41+j&KuJW%h*VTFBcye$wH#^Pc%YSa<+$9YjeBR:>YmchE\b?Zt<a
b1$^$e 8SkXpHZ@^JMS>*iiZW<iLRtWb/eEiMRG9XjED*qa1uwSG/Y*!M#<GG4wHX>VFTp:8FR>^M^/YiTcEH8j
PB#hcH >teb&I%:=bp&V\&QGX&pVFCFI#/TpiL:cdlc$\$RWb4D%%=4FN!8R/t:$KwJ5DKRYWPC=XtJLNR/byeZ
h@mnCZ !Ya!$haYn9\ZpL1b+/FXeiPnNmi%J4eE:@lqc\RwnV!pNZP&%V*96?l#Hcu#W8?iN^/!/5M6QqP/=D5>
J9Rl^w bk@4leTjEGTVi^Rm&:JJB<4M+JeG#EQ<PP:\bS@V5!$Xi/S&C#V+=Ib<6h!Xkj64CWcM#Vplik+#ka/Q
y6YD%d 6^=HVAkk*6<!XDqtpDjK<Q=X!Z&RLctI$Thm&FKCk*5q&bYMJc@uXGtZC8y+Vn:KDlEX#L$Y!GFY$pD8
4^4wh% i@PBVYdX#W?mle?Tb$RiLmmFmM!VejJ/NV!\ICqk%*T4$p/D:9k?ke!8DhKca1>1XPu+jCRnP#*4YYh\
Zj$<6I EVQ%SNMladk:b?#ly\Hi9QjPPaKQhIR^6?!=Xw?Jy:$TtJB=H##N@DK1P!FyJtt1T?ZKDE6AJ$ua/jMb
55FV$T #TKc@uYIN<#X94:uk%IDw?/6hYE=TVwJ6EF^jYTQ*F<HGqG@C<:$:C&FnRe6jLkYZ&E+16<?i=XtYKX<
y@5!kD AFRaYuQ#HNEDi@I+6dQQuEhKK+w6VV:LLm9a^n+5YQ=pWS<WdSd>^t*aPumDq#BbpWtNG/68=$N5%Vi=
1yJI8e ZIX9N%c5/Pi+q1^qHSuctym+<AFi+Bi45S+$9=\AQ8FhnE:GKk>dy:&Re>NZMm6cwapECT!<CSWIy*N\
Pi*?pD 4mnHZ#ZelFcYVIeVIPWLJuRyS5/>QyEZLC:ccp>ERIla#NES/lnScJEVwSLtYZ>B6DyDm1?/WtbEp&Ym
8d^pVN \kNcNNpJ+HC^4Ml41@5ny6=:Ri^GeQ^E!apc+cpW1nFbM=hHCk<u1ElGI\ii<<9CuMhZ\>tJmF6yT:hi
&9AMSw #A@bL/&4<XT$<PyyLuEMSwu>RbQl/C^LVW#T96yK45ttPn>EI5M!+9^RNHhu&Z@bhN:+D:8SWPiYy?+&
R&uYHE Ip%tKaNeJ1/Tq$SqL^XQb@DtdBi9c6IT*5?cCk/6JLHwp<eLj8?HJdIpXBMMF%+t?aI@*9?cbhJiMm1@
8+E5<K \dP:wGPAttqYI5ZPLw1ul<K1\VVRayaV6Nk1%tFX%>iG%<>6imIcH&b#<h4kyG84tNB!JaZXYLZVhATS
a5#E^^ A9EA*TQJ+I@<%V$6G@$1QT:VhtD*HGw8B+5I4KMqmLJ+#MlB<WtHdM&$JQ?RkKcA*yqaB1ET56bCiSQP
XQ695G cM6wLuZbShmC4J4qi^+FphJK8&TuaYIqJ1wAGQjT@I=DTYTAwSwjhN:@$:pFk$wmMT44Yj&C/JGYHl>=
5N/wtw >C4$<t%?14l+N?&eb\I^qTM6XqGBqwKqa=XWD*Xpb^Fb4+V5J!wJVE^c=jnhS*tlA>=d1#BNJb:Y&!KT
?YqJ$G YPi+6tmHBca=@^T#J11m#Si=FjM6P6wb&!a=L$/+N!WTtH!Z?&:!VtnW^paQSGEdNERX&\*Lp^etGZIt
Q&Ech^ NAVdC=J+<qnRC8tIL4<kJXSJpJRLpA:JJ$IWuQmnppG+h%/&d!CjTG^VaF#PJhYmHJ$Yp^EZ*w5Y5Tul
m8iyjL X4+eeEKWq&PL%+DCJT>VZqiAj@W&n<Fh<8hM@F<@:W+G1LFDYW>JCFY9*J6$m?WumwnYh8wbnJLl4DCk
ZXctP8 wy@5n4uKyc!?ZcSVFqFh5Tl+ZN:PlaE\lJ=N!%+TVpBEwNSX5PkGn9npVSa5F=dV\6=YDKZR/8+yej!W
wRMeu! 6Xcj*m%hHb^mwwI5WXE<d:@EJuBjM1>Hl^=W:%kYyNtZ!V+MKta>Kdl6aLG1PwKP//t5W9%kB4qYE!y>
&&M/\Y SEPJKeJTjMY@$=1J#C<qT6ECpT6Yq@PAXan6YSn%maKStGb\qA!VTG=Ftk&NGn\441EJPlC8RWQPqpBY
+X!:tl G%GbaycuZ1$uZLb?dp=i4TnDWWbQ*WQm451E^4*k\EV4I@k9=ZNWF@pe86iuTa1+Suhni$Rk6yLne$aQ
T***Ru XW!tBnWBTXFFc+6DqjcJ5DIYe<I/ELh$RyL$LJeblYT#WPXW*n6dHVX6@uaV\=n9Pq\Q%K&=lRW=Yn5!
%TW&Q9 lKj#KN@:/C$S/8ba!\6FZ&:1Xq%p5=eSTmy+T4IYQyGSS?chWle1=5k^6dMtD\$eFmyb*Jk:K<LuID!4
khiDqS *6yk>uVp1cG\HFZ8c&nMP:Lm9lE:Xt$SiB@%t@P8I&Eq1ni!!b:NeX\d8EthT?Y9Wk$YQHE?5Qh+T<<%
wVyY=Z F=yt=:c&I1edJcB#Rn+PJd+\T&mEpD#MI*tV15jZl<5:4+yMTDw!PME!WhAmn<pj96p56Pwh8ZEl5eYM
\AMwwC 8u16M:quP@!T>teqQmYtI9#LA>?FB?QqY5^XF#dIZH^%XMIHR$qA=J\TYcMTM8DESjEmIki\&T$HGd&*
+@c^d@ uD\hXTV%MX4%</1bNp9pFqQP1^?5ByF4=XQBPYbnitM4BEi%=P$wE:@ZiBMw9khlLZ8C:QB4E/mtuKc9
#&^QV= 6w1S98pmImRD#Sq:J$BkpcGjC#8%Xw=JRijw*CKh/T>AhYWRMPPmSR5\Xtmb>^#M#1&C+4#Z?qq^=BZZ
i4\QYt LD&88R1RB>a8Dn@F9e4^4WjdY:6Spu8YtleyQ%+&JY8ZbV\cX\y9Dp6E#M>y?^uyX$1=P1l=D*>QRZbw
<J+LE^ ^q!TJ5%Z?SA=DYqRC^$^6YTWncay11&QI%e$CXtk6?GZW=LnKJbN6tY@uYNGbha5<N:WPAN4qu!e#yGb
h?G4#q $++yD%ZydZ5hFy#ka9uJM4A8XhIJwuL1Gtt9E!M=iHlEM&ulpnW4JSG4mi=W/I1t$b1M/eiJX>aLSy%Q
<61pc\ &chunG%t>SZhaD+Z^HZm9AjDc*Wy:I4wYRXp6%dSL@DG\@FZW*KM\h=5N#$@a4W:L:8GZc+$!Ca%dBZk
4/\h*+ W9Qk?EPIZ&W%VQbntHDLCG!:#wNITyiI^<Ju/AWDpYeRV+i*VW9E=#BN5n<ElYWZqYSSbbW4BS99&b!J
y^uXcQ Z=/n:ZwQ%hP5aHbw#R5J:pQ\&\&YWMc$Ipe/>WK5GpL%biQ+dj1=K<Py$uRZE8M>:ky\>YpZ9Meu!!S\
-ACR<8 000207eb08e001202b3 Page 478 of binaries1.zip
:tZA%j :w*=hF!F@*E5w@1wDh<=JiX:qc?IR^k<#+pc^L1F8F>DehDkIPD@jn#V@%IC@8>uQj$CAa<A@=PAl&MA
Si#n>9 E@A@Pbu@bH5PPD^19>RhAIX?\PFS9+JGAEHnwyJl!N>Cw\CkeXLwMQS9wVFA$LmYDk/Rq@+XNARAGw:4
BniL*G m^$kL@$4cCC^B5elqwCA\*<LDTVY>w=yQBmN@C$$pFnDVen?ZX<c?!@\waV5jpH*D$IYmVmApQ%*=iq>
<&MLd# RlcKRmL@d*W*<Py88@@b%h$>yeGpntNEMQ<eWGI4b\tTCWGRll!mm9yQDiDR6tCK^?q>mJlRq/<WQX@i
kM?pJ8 p6Tj!lFnDTJ\w1pII1CjbmWmEJ!SwA^Rw#ncu%A!Q\J9nFk=Em^X4R$m!w#<4Fkj<$&ARZPEm?NbbKL^
&^wL<k J=R&\!k=Ick<X@=4+=FHymJDttq@/NanuG#Jt\P<XWic*d#6hyA*84FHNX=jHEKyXQeeN+%<HjpJ@4^m
4m&mSq IeK!i@Bl4ty?<Ywy+p!A#lqBw54iAL1^1mbjB1tEli6Y5uDPe/jG1KNIwEV9=+<4k##uLJn4p::SE&4w
S:^b#G y:&Z+y/SHB4WRP8GWE<u9yDa$Y^MPw88X@P%9IB>c&j^XWY*hQ94FHWT1e/5d5p*%j/WTXQB1Xy&dW5m
%dt&K9 blE=#%i*XFaeGy9q4w&*hWkYMK4h<Q?GGmnj?iKqQ1Q/&YakK88MNNFah?b^GLp%DK4cXVZdD4L@%4BZ
Nj4MQ8 Hk:9kYu=aRZI@IMMupZepLi61Z1VKFbGSFe4MjK<QAE4REqj!@mk>uRLhYDRw@TZV&1mFMmqXVL:&GPI
+w6&<l <Ki%m^Z\+e$qQW+?D=?8P%Y?1i=nnDC>9mWnXPMSSBAwMuJYi$q9SF1$qamlY1Q%/F%bGY1!pZPqcZ<R
V81kGl ?>\9ZyCk?l^CaB<p&k4yhENXc+%b>FKkyM%9wR#:Y:>>XSt:YH<h>JYKkN4T!?P<+hXPDhd&96P\h<>M
Guwu8a %</iDII?G?nQwe=+:DQHeC?!!jGI\y*K*PCBK@VlSZK8p?N<Ne5d\:BLK1:Pycp/NI+nd<QeHCB#WkX$
#Gmc8L h\p+Q<CD:&quYV<uTBntBpYRpVhcTe@HlY>VKSw#5&!8y=@CF@IuuwpWHjZ#NY%m%bB9a^ZwRN+qaD5h
TnQ%>< NDB/NGF?P#6&h6+n=N5TYQbEP6PS*QDI$S++Mq^lR1a+uLhlBB4pqK+tT+y+W<lb%wJ5b=<h84L5Bm</
FYQGl1 !9DwuC?FdTT@84k%TchWc1A=/EEwd?KuJpac@kA16qb\^p9<^qmWSKVb9WdbV\<wbWQly*JX?dYZYWdD
Z#qnha m%*6@BY4c9wyPb$e>Km*SJG!E\q*PJYpTHINV$61yTe:^n8wQa<Q$Gj*QYpyKHMn1iYJ96=<d4iw1!ey
e<u&/P :epH^+WGhb=k\?ZcBbw*Yb4=LlGXFbuJL#nMcGRh<>Dkm5MQL91D6uQaWat!u<jDYINicMNLPLGw\YiE
@>DCJG Wbw@G*6Dpn<n?MPp/w+9YeEyA@=6n1K:kc4ZBheH<*P1H$j8WME%*nwujj^?j=w&YWJ:9I>RY=bCVVwa
9n/LTS =J=5XBbY>F+u:NNbFd/^B@^m=+=Iap&e81^9jjI9%SlcW/t<q+ZM!B8=hTSdp1hL</V5X#8&1lRSF/hX
4%QkB@ %4aHy<QtBi&&djDVC!*cnn#p6?LjMqiC#hA5S:#T<K5BuY1@ctBql9DRPiL>5G:/K1QT618m#<uVFW:#
uC^Lku 5ceLbS!ITL4ji^4VVCcadm/wywdHy&5QCFNIBbeYl&\Z5<Z:I>/pIPwuhMKZM$Y!8m@nXi9F/Dd:8eE%
wNHwAE wF\\9KbTFpe/e+GL4P##XHaEkl@$MyMHt^bI&AmEIy$EdyAZ!QFS15q?p/E=>/SMwhmBW!^J19&=@JPY
<8V?qZ 9PJW4!t#EqpG<TVwXVc!RIw!^nPuK?#T+=nL:>e?y^48iK4Athy9tZuQ6HIyG/%@Yqtj1qNQ6?QXCVZC
@qmZV9 eh&dnda\G8!5kZJaVjl$$X&FGb?WXY*%6^Q1==q%V#T4eGw*DBtBS:=&G/^^Smymaw6YRI=9LI?u4X#6
A/#HKL 1RqQHX6!NEtuDH\$K96CN<bML/<Dk<:QyVjS9E^D8dV1lTpeYdIN6/814GM/#lQHViQX%EnBjipSTiVP
?I%cVT ndS1j:elwY^Y**e8HQ!%K84!59T#N>qV:D8Xb>cFcw=tenIcTlZptuApC=I5Lu5dF8VAdWdElnW!L6<8
>Et<=m dLP!aiRIh$84/:JDQ8Bwp\+*C=4%h!ck$>S>lMh:&!cb8AJb:>A5>abwWLqQKbmF8MD9@KVEMEW:!nwR
:!RJn9 P=i\HXY>E/Z+&K/1YCjVX1aTIYM1w<m/QXXX\VK$HCI8H:YpdPHuYeZi>/Fl@J/u#SPtD4d=B$?yGEED
d@&SA+ 88C6myJu6+lyHq=8V+uQuh8=E*+iJJJ#LJMeLE?YFE6?\!PeYjypQq?kIBqFYQA>e=iPB#eHQFK8GV*T
&!Mn4t i6!Ch4K\FA^CaajFL6qipFK*w+4Spuq=@LRZ#c#liXjbw9#iFha5t^%@lVt@e?C&pe4I^WIyXu4%l*jD
4J$t8n :+Qm%IdctRXVLS!qJNW988k?AKhbq!T$%n9RKH+cZXn?IQYk\Lu:Vb1@*?8AEbdmK6GhQu6/^59+H5H>
M5j!Q! Bi:#c%=u&1XpM!:Z<J+acZy?n?*d:THY<G*RMa>9y>\LH4dhiE?kcQd^4pQkNjKl+X5:&$<!BVa8w9T!
/@Cj1/ #1Ki<DF$4=nhWi8WWZ>J*T8#WJPcyQFpcdG41$VIP$aWZ@1B6VuNjK84TK@8y!u/ll%Vm&#TmnIjdJ8V
9:V1D% Y&a8RyYiBT!Q!L8h/u?Y+iwbB#FVWy&?$Ij<ZpQudSec8L/>Z\!8aRlMZm8p=e<b!&8?aJKZdn>bjNNp
6588*b :I!8\%t@w6hCWXVyR>J9ViN##qk5/\%Vu4$4Gji!nPM1>qt1Q8VLAG&9%hN+kVL*Q$+?etP@@</mynkT
6C!jHJ N4Y#TEbq6jylXY*DwtQMXZq/%5@KR&Q>hbGh:Id=EbJWWLC/HFth4B9VDLhbDnGQXEPhSaQXIk*d&j\=
#pPG8n Aq8@ST1<>/WVBdEpXFHZHF+@d1WMh%\#jE/a:JVl$6FyRVc*jt*PlNTcCpG/JWNtqpFII8FZF1hw4G=q
cq=EVk !GtGhX9E\<biF5p&MR/99DK4G6VYlI*%$\!ZqqkK*Ba?5Y%9dNE>RFLp<W1$#EEX:NJ1>/FCYa6djT&1
biy9&X 44$*eJ%$eq5%?A!=^Bt@/WeSHVYdSd1<t%jqSbKh$G:1Q1bLZlTm:LESdSb=!X*<+Rt<E=?Z@iSE^y=G
hPqh4S qwE5N>$Yq4*6999Q9/i*hwwVXL+S#YeTS&K>\1I>KI:q4d6kp$\PEmNhDTXVn:@QC^:5E8t\^DC$eNIV
wEY$j$ pe#GYXT4dF!P!QlIuulq4b1c55l=?h4N^a<$iN&$4RaD<uSJ%CdVk^cQ*TW%bE8$NyZLPwyM+wK>m/jK
5\#w\5 bSV9d/1de%Mk*tdISQ9e#A>>!Lt>waKj4Fq\Ab6+*Wp^KS6NwcRIc6pt<Y9ceN?\np&Z!uqQKpnP5EBY
QcC@$F G=H%!IXPc5AE6!wu+8?H19\9bR9?jpLLL:AFTNR@&RIpEnBd<HQC<J>VpRPPjNujD@@9SXA+=y+HHQq!
C&iAb& AB1F^wGGA$Dn=BwPPQLqX>BIIGlee&+E/4jRcABwuF\DA9M:cCRaCBwZ^*KAdP89wIHEGl^Z$S5T>q6w
IW5PdQ ILGGi<d?h>%Y:L@Al<:a>/8tj5#aWbADb8#@48n/%+\hmwd<@/cEK89@iGHG4NAj\w!CpeYTV9enXT!Z
8YwyRJ nkyVh&Blwyphhk^pN%SVB$8Q%Dp<LcYi6^RX!e/&?/etw=DCu=1M8cipQ&PmIAWY4ZK16#tiSeFInBDS
/TRuhn XTQG>:5#uSd4Se^VQQy$QIQ$^IbGtlbb?m\hPVH*+5=nM+Malbaa!5!#WRbRBFi*ptltFdGGt4QSQW#+
eSE&We WXWNS8EQWi^M8wtQP<@%YXbwDbYjpl!HQ@M?j%J<GLG/\%4lPcIHX:p*u**5nAQ4C%qNnVRXadtAl<<a
1pZNWc 8?@=9!Z9Y:5+/FXS1RK^Ku*j$>iI&L=!#\pG<X6qGQWpY&PaWSW/:\RY6kRlKwXP+DPec:\NP6&ZKW@6
6&uqa\ S+TtS%n1R9^Yd5:*MJlH1%$/<$Vn=dpZSE/W:?T$uyX>Vq9SdhNN1GmekSqdZ#wmucH4G@^^wk5!8<tH
:915mq Sc:X6tE\:jSy&<#ced1Q6GyKjb5>%RanH#+eydaJ:WY5JV!9ky*#$p&jQTJQn!uVG@4EXQcaCZ9c*Xl5
I1!mC\ 4TKIkK1Nkj#GVYGYS^SVmnHCS6??hG:+KNA\\MWZ^>@%SE=Fn4&=Lj>Nd\1&YF^<R!9*YKqHYwY6&1dY
ml>nK6 S:Gnm#%Silm=t8uPmNEH=Edien%*lHYDJw99uYt@6?PVZl!9$m6>=5?K1lb+uJKZ<!jBn:=#y*Si+E>4
XX9kQQ MmJt/!*/=W^a+a%#WhhYYeDZE>idVAhV%b$4tG@hu*>$VD6NXSmdLTw4R1Z@MM#Z?5EpIT1</NquX@8m
<kTKX^ tStBPbJuKlih!j%!X*qH9t8R9y9APnDeKDhk%&CQ=\AJ9lSK^nbNSSA<pZQ<&l5m?=Cm?/JHTLT5GQnt
VIbHKa 55@^HWEF9M:Ma&C#CjMJAblDbu9y>l5/FpYwEVtcTcCK+GmeqR!X?bMdycHlD\$iiP5Nay^+A5$5n:da
Ee^bP< i=c=N/h8Q<K#<MTiB$<@DKCHS=KM\!>m6>5pt@T8b9nTtuIX9n81m+%pjy61SHEuuWh/!4:ZAY#Fe<pI
Tc4LJ8 LDuB?tKI#6!yk$W\+BniDWqL!m*hu4N6J$^!ySJQp&eGmKTRenFHSFlZq9bD9QWibR+=\nbw/46+&Fb:
C^5m^> *hPTT^1LEBb%wVe6/<mY1?j!CXLdl5Q#lWPYGe=!T^TNd*tew<d4LeLcWPw%d=&JAdM^%+l:HJEWCT#+
uNKRaP ^MqFk9&kR#@JdT*G&FHA+*<Z#Eh?SJ\jQ:cAJSQ&LAm&iJV9wwXmiA=CQ*QGwm6=yC/45pYud@6l%ajH
bjZ8&^ #FIPD/+NmqFyXp\#1:VARmQat44JpIcDj1hFM^wcC:cCI#pNF<>*qRb$l$wd56:\%A*ZEtSm$YpycQR$
8:#Eti W1*MLqqpXB?dNDSm!D5TRqbRd8lR9D5D>qK$a*8TGhmjSReNE\nTicQy:p*SX>wkmCtyLb4\XuMK4qQX
hQawF* &TC*IH!d:uyPptPX/cQ6*LSAw9l>?pJY!j#+^*j\Fq!Q/j8Mp4d\ZmEnin$\$W#aL%PZ%&*?lMC:kt/*
bKb9/$ SbR%%L#mGX15VJdBW5#pc5yte+^HLMQLdPTN^RtuN$$e@i&/*B1!!bG%=:11>FV1Z^X^nphTCI^:p6c@
SnMp@a 8q?wa5kl/ZK?b@CYZ9!w8%:8RI1?hhMDXqN=aj>Gc@w?WEh+\/e+P1/K:d#y=J*Id<IX6mFW&<>C<k^9
KKD$T% Y5l+k&45Ghwhq9NwL:9J&hW\HZ$a/nmqXb*tXYneYTV\#QAdw$:8W\KB=uGn=bFaq/w:i9KjI:njYL!R
CQYMKD J:<$dMRT=l&^aAkX<c+*5mRdww?c8%W&^H!WqT1c6jjahaiTu1I9qTtGY\*8wp$SRk!Lm<?:m1&FENe%
@EBJSL 9S=?T#iEky*15*k\pG9Dy\KM?5==c<E1YqSy9bM$9=ZZpn?Rt!a5dAh=<Mlpt@L^y9Zh*S!pS?6=t5lp
Z:n!ED ZImMX&VA%N\VV!aDp/J5=w\ElJp+A#%DMuKhRE^SYeWQ^6Yey9nFt+%mS^&kaTSh/Fc:N+kdlRGZJd9q
5BA*SH :a>V$nTVPA>QX++@bwy6jN%DGF+\4HFLVZ4D8DdZ\cWde@V<TebnilnQ8D8MdY66#/y>biAC@chcn&H8
IH\:Xd XW&cWYaGXiW>PbuG6qk!kL4a&HL/QjW=*+Wi<HJnCHmJ4cdIipVhkFq==Nq^S?pJ4&JLlhjuH<lDWutw
-AVdJ^ 000d77bd4a6001202b3 Page 479 of binaries1.zip
B#pTlh Ly?>6EJb!Ja6$pnEcu<54/Ly*ZDKliF%>/@cTM/t+?wJI+>ChlPSjNP:c/pPltjA%V#tY4e/!:QC*==S
dPjCKj At6ZSE=>Pe>#FdHp5QHpQ8jVCB*9udi/MY$Qw6%i\d:GDNByTBZId1iQ1V<>b+V*<SXqwJLI6BB6#?iV
8hTM^P pe@9XbL8BNE/jNh<I&Y/XK&<YFbVRTQ6jqX+S9*NM5LjeiSiAQ#DM&LnCJ@y+6#/S^@XG5ZQQ*1Yy%NV
kEMG?6 @jF!jw?P&W8Z@E8Qi1+&k4y98l!:J8meEGdp$?*Z@ck!j86WXWi\h^yq>*XZjRlwT@Hm?dPb!X/t6#>1
dtl#PN dL$ib1J6ik$#Mk^j#!bMdW=EDV%1RLW>5Ju*&Y/F&hlY&*>ciC*MCZ&Qq@?wZc:=6ZPah/l:B@L6qDMV
k$5DP& Rh1YR@B<IA*NkbP=9?9a@!?h#Q%hFQ<ZJuMw&D<ue!kw+Mue#:HpQ$cyB$\Njt1cASupHmC#@$6\!H?P
n%=el1 pbHw@@EaiZ<lc&?MnEIiyFu$:\4<j+tZ:<+G@8?mF5BFLhpKLYFt^&APj?4Hdu!wK>?q@VYYy4>ES+Wc
:N<THQ jwtc+=^mqyk4cCeINyhelnh5eu:>Fl$FN9\Y/uybc%!mWed8p%S&kAL^Yc!nKnMSkVkuqcT=bDQ6&SuJ
dKPBB^ kRqpd\QD!%MpJAe&$4<jjQB4njT@*B#@jq+C<PcI?qjV?/5=wqARAM%S!5ZF%i8H$mD!b?WGBLp9J+lE
!:q8!j \Qa9EQ5Z1Q&L@b8S?#en>=WGpen>8=H:h!Q*:$d6Q^G%@^N1@!j$@wQRj#$I9j<k>Q:h/Q&:Mj6*a@cj
8:&JPR mNt@GdN@M?bua+Tk\D@9S9*WH6!>RP^jwQa9jn+cBht@GdJ@<<<Q8@5k!Q:hpQ&:wj6*R@j9l8+@G4y@
X6I4ty M*V@=9$h1:6Z?#jB>t?C:h<E**<mjQ?J<Q&d+j5*\@@/1?%@LNV?^$L6j!#W@5hC:Z<5%Q:HR8%@I6R?
t$\j*m KjhZ%:#jli*GD@nAQ91AW#u&=Td@dTeaFAhqh5CyHQ>E:**tk>EwIGkanl%\B=#KeRB/6*5@GI$Bkkdn
hpQcm* 5Q!AW#u?mWbk+DnRECBwNA:cCk$Fkpdm?GJwGBA$49&TcDkRNB!H#>FAak%uaSEcTK#6:eE>GA$p%lA+
iLp1:9 #uBBwIHE&y+e/MFwILG&h#:PkYkMpFnDJdcJ\ACJNVkMl?WaILEGB?NCA+p%GB1Z=WBmDadC>Y+k5RdD
CB@W$+ FieaILEG\^ZuGCC^l89Wi\RGTK#BILniDTVYeEtWI5FAak&Kl8NAA+p%KBKDA\$p%1AIJA+$pFmD+qkK
5<wP6^ RIKB^BwWm89hRGINC5H%dmC^B5HkiniRYIPked$dTK#6D9l\wIHEGkTB+>$RILGGlIN^wCGA5n<CB^yI
PuenTw 4P%biDAcWA:F+Hw*wB!Kl8JAA<1lTB#6G\Iwl!J\9S6RDwZlinecWQdH>Y+MwQ!Nw&?BA51lPMb4TCmk
EW!DX? HI4C>Y=APSTPC\$DqL>^YR+p%8BRHC$WmkCW@hE+$IB!KA+>E!RWWA=F+Zw*wB!K^QX8DKD5n?QhMCC^
cjkqCS BwQliDeMAmn:+*w*pFnDhXIlEkawl/J^9S6RDpZlinikHI4A>Y+pwP!Qw$iGAap%KI+^MlIGJNckaF^w
B<Ewd^ RDpW^^kbCReTc^Aea&RpHEm5+TSapZDw:<FlkQI@n4EHHQ=dcMS9wbG@lWd>Fl4>Y?m@S=8%y^i:1BJe
y<ic$! BCKClpKl8<%@u/Z<\TQ8@pud&<L4^@>R6Zh^@EFTYu4>PD5A#L+*t+j6n6u*bn5@/CbZD!64n>$j\V@?
4^&#LC ?e<*I\CN>uD\VMm@X/u>6B8^b#eaDEbCkhwN*S&y:@H*Q?#iueWA5S9aTBGH9@?nIP%9hpMSkP*ic@>:
qehNdd &=N?&L$:A\JmN:BSJw/^&u<W5@*h:6$kAt\*uH%9c?RQ8*jdP^C:Aa%RWVnGP@>SCQhj6S8/P/dbW%V:
\l:Ap6 aVeMDMl8RKNdJI:SLRKD\&+WBwPCkRHd9b9@><T$j6kNAhR8paCaVF^nHiRl:SK/P@kEGmi:#>ud%QjD
pBLC\w dnCkPEECapFlPQIt<6B&CRF5N\dM9ue/>J:hi?\jEL9l9#MLRl:cLqHA&?Y89d8#?l>&:>wQ^G:p:<!@
ETPTG+ pKn@H46*Y^q<6$@>aVeTAel8aM\6n9+dmVNjklF:/&/A+^8?P$hD@Yp*HAQEdlTkGT58ZkeFcMcK\NGL
d?>GF: w1C@lV/pdWE\\Q8E*V=^d*d+\&hkRN<cBYm&C<Q^4XHAb45+Il#RTll8NA4u8A\C*nWM1M>&^!E\?J>^
%l\uQ# BpMAm#NAM&WM4nk:4H*Akjin8>G?N!Q?aVee$LeG6AIHR?H+%8lD<laEDVnjR1C:9wd<>DeWpL<B4h:B
DnpC!Q pDn<nV/5dcGBn>?Si&QkQ<iVMAmk<TTkqV?euAkceXmjAD^PwBB&/G/i@YH*:4>A:AdER8Hm#>A+&!Wa
\q1PwI naIAn=QhGIGm@9R*FA*M*?nj+aHRtMQ/E#n\ejC89=F@?l8KA8S9RK8Xi:F*wN&a\?b=cPD#yh$8E@1#
WiWDT* H+RC/\eB4ZSCec#\InG\\?\GHmi:@SWWk9uV:6%=E^C:AdF88PahtMQc=Y+IAt/Z+N%a?dQ@lpIA>h<a
ptycIR aI\hn9py=6B<mj\Xj$QRQ@$NB8b9RG\jDJi@MaiMk<G@\L<k>p1Mj6m>^\*<n?%GAX9b^cE&nRJDD5u#
%PXh:+ MPB<\G/P@DG8&:MdBRFpN/B&Cadm5Q9R5Tn\h4udVmD\u@=GAQM*HBC9m<9jl:bL+Q:i>jGi#*@aDRjt
aHy!99 d$C4$Tle@5chL/F:p>yjmY@IV*>Dkjpd$Ew&Ayi@MajbDVlP>p+8*c6E&D9DAAtwH$RBZAW@iB!Lkl\&
XG@/\a npWC:khl8:j8eaF:h8>XpAC^G^A9CwQk5B8G8@@i$:+Cc9j8G@hKi&F:QCP\jlDR/n58QleFRS^mN\K+
%%cVR4 9*i#*=:hQ@\N$G:pd>tNP%?C$eDu=QA>jlEP@>N8RD\$C6m1Q++%SSVppH!=N?EC/8@hMjein@9DdnmR
4hF&YY eT\KWMWALl+cBaWe65+C9D>B:hu<$>>RRQ+GXG&A\LGPmwLmdJi:+%nk@wd9j4i>A/6@&A$B=t>kqcY+
hhWuRd @I$+#P=j/E?k:HD$u@:i+\TB&A&IF+Zm<9el:SIDS@!T*Tnwu*aDY6hCAc1RRPARuENBMaj$J!nAiZ/Q
+*I^>d w+In@5\:eCTk9APw8kKBa:WhBeM>nwZ6Wc/@$C:l<J@?SkD!N/DKDDmPhZ+WwMwMPK=YDck!A#j/5J!H
66yWN= A6/&pL9#ejTjPR?GAbV#AFX%\HHW$cJk1MQG@mnk*^4&5^@iG&eA/55AXaVAIVn/M6mlc\/@$JhBh65Z
Sk+XVI <p?:pWDYiFCA1pq\XZ8n+Ii$4d&6K4@RJ<DkQ@&NAPS9RIWwMB^X!!k+:y!H@kZPCdc*#k*h+>>*@\5D
B>emnu =8@j1ZBH\R?hI\KQ:>*u:Nu>\><A:Wd?q6$+e^+E9djkBulM6^5upJ>^AkWYJ+A+XRT8PDpp=&EkMPD6
+a6JV6 E5$P^j#$N^mR9\HX#5B\XE1nELndJS4=C@*k44?l/D@>DeWA<nik&lpaFIi@EdDD?pHke/*h8RWW?ci@
L5kXBJ wTlk@kdWLmG+@H%a8$RB>9hiZT$W<hQjTGD?B5TyauD=?^BPhY>R?R9>N^V&$>>\aQ+G^Ktmeju:pDpm
STVAqj BAJ<#4KdL@?5?>t%G\1pqkMF1HaGmtQ@A\wJPc\@Ai:9*bEqBQQu8AwKcJ$eBcl&BwynuS!FBFRqnGPq
@NE<=D G\Yw@kW*GuHa9By+46:n@iF@jt5IE6m*B4bLB>i*Qt!iB\F8>/:NENmj*^wCB@c6AjGmKF#j?l>HNj:E
=<44l! @1Yl5Fiw9!i%5LeE61?l<NhYhjX@:V9??*Q@Z6%!$HQ@$tcAR9cj?=ee\>=#MYnERe?FHKDN5LiD<9@n
CtKk6L ?tY6R=pCL9JMk$WJ1!%iXwm5mGBLnC<dA+TXQDlA5*a&WwhDh%=#K#iTka<%1yXdSwe>AptpH>^M<9&b
$y\W16 1?E4K5:+PL^^N<R^u@q58*qjR\VVn1M&ne/PI\p#Jh?&c+?@Ib8RCJ@hhp:adMq/\ct5$HJm5Lau1CB<
YTwj8+ uKE5S=tqJXCE\K$DGpN%8?lX#14&l^56+E4yGQFMj@Y+w6nV%S6u#V&jp1I*QKNQN=PjLumY1=aKQ$bM
$u&AuI QXRb4emQn&EAbVd=9bM4i1#AIq%ttXab!bpNd/WRI6tVQVQRF1EwbehmkwR6nheLqkY9Huq/K8%wPpdp
!m!R>B <lq1yc+i41Q%wtC4LA*KphwmhaG6!WqMMTiaIdmZFe=ESHB^GVy+SAcjYVP?l1tyWkY4FWNETddEFWSA
QA%H?K w6XaLS\q*c5TKdS=9>S4ipqRhdnwAmq*b14muD1X%p6?GVK4Fdl/:@bd$PtapS&Y?&Hceiil&DyGAiZG
S^e$F5 BKTaCu^mVXTpm68CmL?Qk$km&QPdJ?tAqJ?44XA&K^?#TtV%bt@%BkH/RbW*ncMcWichN=wcS#1\TPFn
<Luw4S :%@1//yN6pN4clJHA6Gu+pPM#%*k!4aqPqJkd%w5AH<VQLNmNPeY9E%$T%4b!&GiGiR$9um/8wh8Fca!
YPDc5Y I\h8uGdwQTZ:\pD6^4u:jYVmG=NiDJ4TD>+ER*nH#:*QnhF+VlXAN4uD$aYcZ:QDu6a?>9C6QT^!jE%6
uK/9^c <GdN>@y?e<tJ?mAG@:Y1Mm?Z&6/cT$NXRViW:F\>ihZQEIR6y^Sabw<LLL=?dH<LJEeIImec/KE<w4al
yZkheV *uQDYX8^AuFiR>uJMeW=TbmikFNJ&?qE@j*K^Dq!&c/lee$LIHW?LETW8cc+&:%&cuGVw#>eAa@9W*TR
^1B:G< mX*tVd#59ypaL=aLN+qe<><K<PSiGwRH8FbB+YdV$K$#<4T\D=9^/t^eu6i9%tQG!+PPL%$eDZ4#XX!+
MDbR=! >i*u^<aqS\jQlNynI=6l=CIiyW<*CqI<Q9G=GN?9IN^<JKZ!WhY9=iHVY14ZCTy%S^RIYi6B:Gua4EeY
>Ia1I$ piht/4MiELFZdhn*N#Dh#W<@Q#L^uZKtwJhFV:&A#dFN5?#1iQpTl>GI@$hdWR?TVA/h1YVLBw8MJ1yG
GTZb:I *lYTNHFtEEYeDMJ@jIXq=+*bR1<<Q?Fd@QRZbQ/!cT\E%p=9nCbbZDQGPCTCadVSbK$G:c%YBNbJwGQ<
pRNNa9 =yjY*9dI$Xk<ce/PMlYX:el6Y1AI!Cc/NlM6^u?P5DP4?:SL4GcVLDHN\C5lC9*=/jGE!56!eRK8TC%4
>6iQ#C Vqa#TcWVatyT^M+bnQM&4uFFVCSc1y!eR^e%+ntp?ddc%LMCJ!@VYaD$5JhcSG!QM1Zkj+RE=Rw#X#>i
K$FW9< VFS66bGZ8<:mmYTlJ:96GT9=ZI4H>?W#<ikL/=yZqV5Fa8KPTEu*>1q#iEm+Wp6m#IhYNdMJH49RbnNA
TK5<ZA 1VQTqFhE<HP#bBTJX#*^mdd%p:jZI%hii4T\B$jHjutJct>l4TSyyDHI=k56b$nELpV*Q&NVFwlMQFZi
bYYXRn =9ViIuW48$&h$N?94n1h:1I6$jd4qM$l?>EK9lmNKWEBm:eI=lpTQ94M6@LM:MEWTjRGP88#?S*nqZc>
@lkB*q SP=idQZq$*qYyuW/eZC?4\!MEVLnmSc?iS8bnE&QT:MjK%/KE&+N48lcw+aSB=b$uMGMDi9M4NSjYZu>
#p=BSn iPStS:uWujQT6pRwVnKSwjFI=a6Emci/cmR5%\JHyiW\b<1/:mFj9DcP:GW9M?keiVB&S4FCMJqH/D&*
+B8e1! t8uD6bmnQGt*h$18&+^i\K!LQiEh<NSh?>\VKXKd&#R^6S4SQGG1&yqCIINpWTYd$ZqjKtlWMYRy@II*
%*GpmT Iniq>?\F?ch*qF#hT:Kat#ui8pWKJPt+TA!lbC#IC!kLm^W6\5/l<AP:!cc99k&<n/=Gt6lVBGmJJF$Z
-A5/uP 000c7b966be001202b3 Page 480 of binaries1.zip
#HccY6 !J1!:!=?X*4lSAF@ph6Lc4tw&/LR8&tdNqVC>yLmC=A<?jFZ?8Hj:y^H*yA#<C4=N5:9cpQViWGdWjhp
dNWYj4 ?a%MI$e9X8EQb!?QDkt+&>!SdV&&\SRl@bH!Ju+!Z%iQIaPc*a*ZZZY^AaMcAm*MDSubBNQ^@t88ckyS
4le<\E w<>d^tEucLM8<mXh?E:K5K^!4PS1WWjT+n6^8cCp4BY^YpRML^QDk^N*uF$>%G?IkC1GPpiW$<@!8=%t
iQwHu# yqhSlKSaWcKYG?<#ZdKIi15EY1IZtn16j=NQLXH/M4u$8dTdNy5SESV8K\HtMkSSlRS^$Zt!9dY?BaG^
LV5DK& dPNqFjGuYL8NCw^=LK@lNT=BhY1CPhem6YAKG5<+=GRMRdEDDbtalieZ/:$j<VjYPu^\GKW5ZnRtH6PR
D5b98i H^T>=Nhn\>cy:Vyq?jDFk8GpR=lyMBZ^$S4/1@hA:w<1FKMN9&niRImE*uSu>ZlB<q\iahJY>aLV#cq&
t+Aj<N 8EyK$8c!!mV$bpjb&qmyw<4E&B*Y@J5ZK+@HD/L8hLw=NGhZ?D/bW5t*Z:?y\+d5?#ld*mjB%!KYy^55
itdC1= QpDImS*awKXJS%^GE?h!*R=pWGdn+lyThtZGn%>qqmHQjaTqyGKtb/^:j+VnEqG\kyWI>6Z:dZqJq#he
+1!I>^ W=Sl+Sj9lAc4H8qe#=l?@<^I#/QwhtVDHK\SV*P=<TK%qqy:j>QYY?N%Fa+iq!>H&Mm?iw\PW/$mY<e#
t*$Ie^ Q?mAhEbGSjniWb++h5+:itC=i+96D*54c<wPyNVY\>F4%*hPKY#Sj?dY1JCp>GJiIcaL9%EmpQlK%jDy
:?^Gjt ZYl@N<>59MLZq4y*Z8RuS6PCH\udC^PLWTT=W=BW%unwQ!!!X%*CG1p^l=iCQanDd:%@e@Jbcc%j@<:>
SpkwwV YTLw\!iD!eH!69YFIS8nZPyeLd&I=t1S4IJ/n:BZ:R8Pd*ZbC?>a/qE?Dbl!#4Mw9IcjS@u$n4#A5=y^
Rc$@!= qInm\AM18wpledS5+p4&>P6%4Y^4ClLH=YDu:%T9di4^^mu>DHL>y<ntSCnBJ!kF^IXjm<?4KQPDRZ@a
d<yZ19 BX/mmCRGT*#w>d4bu4/D9*mDJMiE6>wpTQ*V:LmyLb5uD+Ybna/8w6M!/LK<9Nn<I6?#5wFum^nCTJay
::Np\b <9HAjk@Vh8X&>8tu$qPRICnFb14P:BB<aaPT\p=:+c8y@!1qZ%?Ka\tS+BwbtVYBK>Yn=6qPT9u<Q8#/
aXeL=D /:GLFYQmQT&h/l^X$Vb=#S#8t?p=NDuZNk8y*WyWA6T9#ipTB#Pl%HwJcj^ZcIJD8^aFBFwJN:KwI5XE
nd/l<1 eteZ%>jDuYI%<<#Ymeiq?5Ljl98>XBmKI9A11InBC:9eyCBFLj8YPtJdM@c:/YcLyq>jj$i%6M^ANw&j
AtEl:w c$WRFZjR5d!dlF%ZGX6=NAQ+HkYy\um^5GYGHVpt*dZW$kX/T6wL^CXE6HE*1QAa+5PK$8i+$yVk5uEh
\TeL6X h*5NJPSepQ*wM@!VKH=%ydahpnCD>E/#4e=6^c\JVu<h6ic&quKD^+8BH+pwSEN$hBR&DQ%*REFMYt=b
%nMtDu &na>P$EMj6#5Ku/LXK+q\db=\p:!n?u\Lmp*ndwqau8te9%Z!jCmwb\kMq1cI>L1HdVZ+6thcmyNGXXG
L*@H1p Aq&t*THGXP4Lt1H4lla:Y18VIy4\X<5ZYDqwbEZj<*BjBlWdwuqn@i@y%e4LQ&qFj85Qn9bZ9GWN%e*N
#:NAhn 5%pRe/Ln=XMRM8S>e$!JIdY@:1%Vhd^/9KZHM/dYY?\Sb>nd^c<H%\1@!cqj6QkWQ9cF19FaTVN4GCj6
<kiPlp aPB4/hNkb=$u<e6CGcEp8\G*$hDXiR<ey@^&*t?LI*LLwYFb/c8IQ@cPSVF+j5C%k8M16V^jy=%i#@YV
iFI6!8 XbL<=in*>^RdBqZjbhX^LV?Y4J!Q&<kTDRF4E*<!=GMydbaR!Xwk#=Z*mlq!k8:pXAZ1LH%T/Z4G6#Yp
WFw>8b F*8XbCmq^nJZiCGRP?<+!jDSXyF=dEPw%?86/&w&SBt^&ub8ul99!Se+uBckymF9PGQSL9=?WhyC/qy*
<KJPS% V95@PM8=FiYTN4l/FbKlKVL$kIbPX+4uETlp+:PNpBehu\%$C^\6aEMjZGyQW69*nYQIpD99BL6&JSH=
I1RK&P 8dQhA=\Xmq@emAZCK$jnT+RF%+WZ^B5&lFV\h@!!hpCdF+SC4iW>I+hnT@#aq/QdX\6LSt=EZ1Dp+?I8
ARVjYe 8*ZY?YInk!y*hPAq<H1JVbbXXVeww\>eLC@M@Yp^c%G6AX8p>y&m$N>bBJ^VGKK\%bedSNhG8HuL^YG^
Xb1Bm% 4PHS+8a#<PV6BE1GyZC5t48AW+w<eZ1@*BnM\WF+88&c4iHT/<TH5>@NBKVjXBwh1^KW6ZTy1iG:Pi^n
<enDEG y%QPuq51GPyFaiPRIkP*JXbkqn9FYWVA5^^9ZE%l\qQ68dGmtel:qJ6dW*yKX?ecWi:ZQl&9N!RdeG<9
K#@^WD l>X#bCP^d\d1XCy5Fhj1QH4l*q*mI4um\dyb#^EZmC$Yq:bZX%^6R6bVPl^>@&n&S&j*a!u%JS6CC=iY
LZW%n^ H!V\#HTINFH/SK<<aiP+!taqt^dZj>J!Hp$!>KSK@p/l54#ThBKIH$1/uFRwjGI?+mVui%Qb!=GByEkw
%<FdkG wZV?$TYK%XLZ9uD4N?#6T6RhYnC1mtGwIb4h4T#^DlQ<p#*ZDc9lyy5XFFWNESRE5ny!WPjEPAKihkcK
<u$A<h cQE^ndM=EtK#PM:%R@%>K<S@Yh#^9!wll@4:bk4kEuIa>D@q?VFw=C>J!KHlj>/@i+Hc9@myJwdi%!qD
c:H<R9 :?8Wwjjq!hD:<tVwjTuF*c9>*@dX!NCwjV\K5Z?^j<??lB^/Z$IP@biEHHyjRk/>L!GH*yiRR?>L!KH*
&\qd*+ JiVR?^J!tH&>PA^+@$Ea<F?@wja9jn+I5!<al>pZnMNA>t@i%+9DRQ>/$L+<HAd/%&@:D+L6Q\m&@/B>
ZHuiF? tVnM9p\eB4+9Iajbq+jD:M9Dajb>nNu*MRd^%$@:?H%ua=B@QRm=j@i?Kl^t*@&ajjhn>6&Q&Xj\\?^@
Cdb4\I B<#Q::D:wQ$Qkhu@EJmjH?I9hdq>E8a@ccMDN8Kkj4:yZ/RVC5etN>RBG*H?meaqTae/aCQPQ>FIZCV+
JWQDl# AbJ$B/B^dL6CHdCb=kA$Dnph%AGThAikehHJB&!IPRAN^aYGAEGDeXl?\KcYj/ISPKR?WAhI$l&AS8JC
NH4Mj> A+p%ZB6aWYkk5acA+Zw*pFlDRHC>G$m5+bKpR/GB^BwelR5NJNb\qwSkkMRcLpp/FAbI4PGTyENlkMRc
hI>cQt 4yM!WSkk5ac#^AEDJNbk8I1/MWBmDac4yBADJNb\dS^DaaDEGk^Z8T+GTK#BeBYjawDEGm=SGnRaTK#l
9jc?1k E1XBk+HEGlTH>CIcDCVY>nbIHa\GEt8+SGuRaCC^lp8WBk$GEt6RCK=*A+p%ZJI&cDCRYMP%>RENBySD
?Zc?A? eT!$weGAemmP=T+$BFAP^hHG$BBAPSTP/>%Aak&JI^PlIVBA&S@HF+QAAYX@HNECAbSDMXAecEA=FIWn
KF8Xeu YmCAemkTnkPNByV>ecE^kLL@\W9bcCkaWQdHET%RRDpW^!kZDRYWR%G+LAiWR*H=HAwHqQ%^wSGA5n<8
4S@ZhV !=GA5n<8u\QKwdl/JmmkHIyD$A+NBbSDeb^NnwaBmVWaApj9AIMAGn9kcKE\ILGG1\kMDaMBGuuk<DpM
\9kGS\ WA:FIj/BlkHKwYle:\cWR=G+*k$p%uCXF1FlcEBnB%#9BlJ4WCmPVARHNF:DWV!HlkPJNRkPcXW$HAyw
w!ji&d =IEnE<GB^BwEl:R1Gk+p%mAIZP<GEt5+6jVR@%GS?#?99kkNQ*VHJ*Bql>*Pb$?>c&<ckAT$E\RNB^Lp
%\1C&u KF!D%EP4iaH99NqV$pD?WGdd6S9Rnnk$A6AkE>j\GHGw+ld\Hj8:nZ>Qdi?H*ZA\IL5BDXB^:A^GI\:b
@=T1$6 <RqH@5KPblV:uwL!D:8l\Q\NcHCL\PX9BKBlPa+wR!B@C*%aST+EiI#8itD9QIk>u?&hZAHEb+AtaSBe
HnG&$P *@wRNd5>F9AZ%Bu&C4%@&A%wB\5cCYlRniQ+aDRTAtk1k8N9naV?Fl4&Y&n+d/ESl%VcA>?=5>eZI9bY
LuC4NJ 89c?F/AhGYkpwMpjnl$bcJ!1en@mDHD:kP=PRjh&i@/\G\\5#wBNHHHF&TE14H5m/:@RQ8DwQ@$NB:Rn
F<Jk>C A+$C%D=\DebSl/tA@II1KGbjjSAGWH$RnRLW6uBWncNSkCc58IcFkBc#eKMQ*cWF@SYqMVkW9J8*WV>&
<Z:i/Z +RQ^GjJ*y8twR*hQ@wKTB?cH*V??NWC:$d>q>&G:RhC@NK/Dk@<en<IlkMcnkBdk+LmtdGnIaawamF>S
JD$MC% !Q^VNSEGWDWSDYn^Dyh1Ily>/C+6#K<wT5NRj@y:d/ebEL5B6W5wLu<n@u5W8*bH^Z9uCQ!\G\ZM*:>F
Kj9p%4 R1EQcbjkZ<l=WPkQ\thQ>B5GcHebG6CCI/:#HNDw\^TP+VDkC5iwH*d@<De\8\E6X8K$?%BFP8D?*59X
mdnu\< MNmjPR<GcFeeG6BCJ\#H4nn$+ay$<F@1V/B:8/S&@\5DFN@AFpq^$TmHK6L>\y^ud>e?>Gi:BGk*<4j5
h:w>#y BpRP\*F>LjS9wVG@keaAYtDFnV=MkR1+a5!iKl#$==kR&C=hDKDFYSmPMTEGjFnikkM@WRC^c!@5#:u%
H1R&<L *t=hIHdDj+NY^wAQt/9>At?%c@PQHLBuN\\P!P:jIdR^+EN&@cPR9#CilQ*ayj9Ddmk\j/N@k$4HkA>X
camwNm +\Din?:t4d%l<\?:\aD<DYk^GliJn+EeMy+E@+J!?i/6ENTj@waAW4nHAF4Il8Iaq&Ekl!qR\Z=BpSV/
^!ml!^ a\\Q&h5hnRLtd$D6Ew#L*+i%T\V5q?IE?YieALWd?X6&w@=dh5@9KWL8#jX?&I&EALIdDYmyB+dDd5^9
wdy@IF 5Q<aRI998NGR*$JDj\6>mFwNA9mJMuAwtu*9:KpjTyWIRN<L$MI>EkeQkwEiymIFB@?K+8QitZk@:Aa$
d9&58p 45MAY9SH+lnZaR=ScIQ<\kpRi\yMmJ?1L$lAHCMGWMEAEkjHmDqEwY*Z*:?kDA4?eSdqu<1kkQwnGLBC
dl!j<5 bB#>Ei\\nlEJ@SYXud$%k#<XNkHqLWCFCpkeyRaaGP\\Ll4<T$1XCMTjhmNSkP\G^Q%n$Dn5Q1Sh\u>B
y!M/+C !Y>QQjbuj+IA%y<AKyDaP/@<aL6S@#%&w%A@qDX@&A%I@RwD1LkCkWQ>CkPw8GL94K\D$aCKK*CnD&yd
^Kpjh% $B<^CwMmjpHhE<\P@/p5B\i$LwiBA?Q9ejn5EIW&FA#+KXN:CuC@y61IkRQn@lE+:D=WCR1+p6>8*\L@
eCi$Dq GcN\aDEKB<R^+wySPAyRiV?8KEQ@Fl4#P&kE?LjRpMPW/Z+l%!N?KEZ?1ZRJKM+A%XdAeb^tnWEepu9&
h15tje ByKAXcqS8:bnjmyhA84DAhXY\HHWCYARmMQ<nj!XuQq4myEaRHWb8BRnMRnWj+9h<L&Vk/B@nqFkkGy\
8ptK#M MAlkScR+^mmIR:tMZ+kVPD5W<#NPIIDmBAtMa<VSLk<:bSCCAy/*h99S9hN*@qR\BNTQA14ykPGw*<Ee
tpXM:1 i54kL/ly:#dl9hPDj6kN/QRkDKB/EBmP$#+\!EQ#%m?w*MN?uNn<y@ImwQkGXA<C\*HcB\b=/Jw%<H!:
JY4TlM P$/C@qT=l!KA?S5R^+nG=i@DVy<A#5HAh9MZ>Gh@AkZYu\C1B+Hm1B9CwA=4q<D4YQcWpKE@Xi/lkG4/
4uLe/M MID1RcA+c9w\1EP=@%</NYM94H:aDRHtd$AeI^!Z9^GH=Zuw4?V=H!eK:%Z=An1>GRPwqtT9T#9a:9<i
^:*y+@ nlEPRj:kGZ@aDWnqHkPwqkTKa?Mm=4BcEmn\jAuj9SZ!5#?BAP6QANYTRHB5i5TkD/*VkkHuCQj1neA@
-AbR$+ 000f09427fd001202b3 Page 481 of binaries1.zip
lA:YRN 1<EBnc5A%bJAeG^K^l^&8mEW?N4YZ8$E=Gh@AkHYu/CBFi@n<njmQ>R5>:E@%T\l@%K#@Fpmw9h9\ymm
wn/F?p /u5SmQ1utmZt*!6F@qK#*B6L@ViwYdJTkj^uGtaJ+W!S4e*8FZ=G\llte=ChXB8CLWcStPCWY^iYQXE=
tSJiZj N*+t5P\5JJC^BdR5^?AEnwppbNCMHbECBXL^bVM:BXwK5pwGb!5uMhmlm*68cE61!6NIC$kV#b6HKSQ1
Tjj*?i %FK&N5iFL8bjj&I1Pqm*jp*tMp6p&iKE*eP:twZ>D1N?&Ny\MJPKenBc!kt4lCKV!+cEbuSam=Py=E44
!t%RV+ 5Ei+E$t^i%>EC=Jmtml+6%pJ/>!Qy^mY*mTSB*&=Z8li+Su/cVHIuIaS+qe5e4SWnnq!phY+w5:<Rl>?
5$y54i EIF:R$/B\\Qc+C8uY%F^%aHK\bb^GWQjhVmpV#?IpHeXa!ASyuFnkA8#%9e*bCcC^Km\NFlWbBRDA\NX
yT=N!Y Nl5Ze^BB^nCyyKW9GZQDZMdWwC\qZ@Ak>!qbq1MNqn$mDFSHFK$yYtJdFJknN?h%mTpkwWcpWdTiitM*
I6/&BJ XFINH=YG#5y?:NTwZP$8QXLlEC*aF=HZHW#?:m5S4FtI4D/Iy5KCSeGVTjPa\p!ktSnS1Wlm!8DNK:K5
RjN^\j pqHcBl>F?9$aYB+%hkWZ@n@EZZhWW$u:ym<k9TkCKpLw^iVtymt5wa1BRKkCIwKEFmACqpZZklBREXCK
t&tlGl mt%FyItACAHF6c\WX*wXFXESERGXwnRS>A6K>y#9!PYM/*h?9@@tJP>#b<:MM#Q9#H*j=/+XC:^>6NcL
V/jqq* 9EZlb1Ny#pSS+1T:+y@4@h&85A@eGJ!?pVC<=dJX$HD@EwP4ER/4^WwWcKS!&:#qYJ5Y%b4HSdE!:De*
=JGLF/ +A1D5$&Z1LKG1$d>k=aIBbnp4&<inR<$^6keKY<W#lj4qDQhJlBYIMn9Z?H<<JA8+#l1bhIM&du6kjB\
9/PKeZ NG>c<KdtHZ8XtJ1Ba+eWL:cyq\?%uuC^5&?IT8$QnHE+XCuZwEcu6ZTk1&nuBjuN:MR<m*MN=hblb1LE
V^^y4$ :q=IcX6h6cVPB/ItLT5&RlPmXyJd+YWyLEGS5cc!km6dH1XeaSy6VpXdK1GH>Hq#RnejNInK8Hh%$FVh
wFRTWk mCay#4QtFS@iYe%!MC+y/heHi</ewjD!BFylG1d#QZT5M/:1i%VAL%c*iDYw!NXF/TqlJcR*Tjy:!8d%
#dBKe$ +>ZHnK=8d^jQt%T<5aS@dGQuLnJ>/XQ=jVeGnZc1/%w>q6!$86Y^GEhdim?EZS%dQ=J56eIS//h>HiPR
JdtnVH I6V$<ppXt&X:at#1W/9p$>C\NY+iG%G1%e/By<adDM?jbVVbY!aHdt?IHMm>wYE#I1LweZ1<6IN%/9X9
*PJ*qT ZnHdWnF/HtZyDl58j+t&D/u/TE#a%*&b?CA=AhNej#QQB&j1EBVeanMDn&*?$@/<1@GPn!cj!y5VZ9iq
8qLc%G uA#hVLi1undK8F:8+1L%?<C=EX\I:TM6VZ89tNEmDB&1wH*wF?T=/yk6y%1!yGIuqicEW!%phEyVMM\R
%wd5@6 4$th:5@>>ae*@/J!@>mhubVQ64JZDae&YiTEVak9Mlq!1V9YcFTX\*b\aFA9XcJL&h*SB^mlZ6VVKA%b
Bm=t!J e%pFYSu9SJLw11#B85i<KH8ib$4RMecZJZch1<nhtKR?kb9PlkT5XaicGw+e5GGKj$8iND:LVQZw\$m9
qy@ti\ w\Hu<GYq*ahTDVWVB5/8%uH5X6w!9e4YLQT&qMcMiKhI6&=C6iHNi@=%F*+9Y>Xw^8au?&/6%t$QN#i?
uQNcpd aPl<e/V8W+%QbeB4uGbc@dNEeknDmF+<Q9!mVT+9>AXKhcXGuVS6WYceEP$Q@q&/+teFC6jwyn58n6/M
CaE**5 5%#/AhN!a6P6DbE9py5@yXwqTl9EbP5u8Zpu5jawWl@9Q6/V:PH8aKqwEd*:N=H8ZlhMtTi@9L/!>a%u
4>B%Qb +d*l8F^ckPy^C6%J=JV+qTdc<uT*mTV6X!=Jy689>Rq<wBZdLK9>YQ:qihFRkqmm*k1@=a4$!GSY*=S5
@V$cpA Iew*y9uVRG^<W&:=#4+uVaG?E4pZ%y>&Zn*6/%1!wde91X+WLq8bMb+1=H#lSHkWV:4mB!EJ$8>CKdLW
9!=j/R 6JbM=wX#%#TqY1p9T&T*wqRTw*ma4*T\Gl5$V!R$CC1=ByJYbJB4?Ja/*!E@mVaKm1kuyqZHSd*<hN=d
BBAwW1 qL4cZEBVLdFndXBN8w@6+6FC*41<yA<Y<i%X<l8#:/I&N1lVdF<9=c$R8WAPue:N69^e$jVEh=%&T>6F
NJa5=B 565yjnHZpJC#yI+u#8hwCq+TB^/W=Fw6yitFLub/i$^8BTqu1HHQw^A@R!q?4I^hyqP1We%mCd9HDb5:
SaC%#4 #pRS^6JjY#>?>uhdeIy:4EttneIi%$dW6I5PM?/+cM:?i5P>#Ic>6Yy5VXM/qL\*I4Q^?WG#e$HBeqeH
jQ+QV% e/H%9&*TaG1Sd8dm&m1I>:9#^6:hT9n%nuGkWIuCGtYY%n1ih4ReJSPupHF<YR4q>/N&94j8/<dM@NH=
:lP68a !Q@m+>HliAI%dJPV@I/cbIj#qVtX*c@&a%?NGi>ZWEqbZ?$d=CM>qQ\?\Z%^>E&Q?AjNkS4p*KXaS4M4
*$y/H4 &i1EVZN9SqqVeyG@m4H=Zy&iJXQQG$dLRq@p!&nKW+:RZtRYXqeTYp+49=cN%VZb>WDE1ah&?6LL1HVL
EdK$by /eI1?9+#mSc:#E:<ci\kcHJbV*&Z+<4+\K^#CnH!8ytc!Y8Fdce6d8qYmE6+%Z<wb/GLE/8&^ClEjG^Q
LtAayK DTp#Q4Fwj?8IJd<*#nGnZ1CS9h+9K*w1kHbE#Eu@<dZY:ikw^959#FL^4YwY#^V6qJ:?Jjp*>b#+G4?/
!J5ZD\ <iNB>/J^d8TkW/1SdS%/c=q<EY<:GT*d^S<e<GjC9p1qVX1q>tiMB#QWSb4a8=5l/SY=GkNu>C$GP$L?
+ucS1S =F%n9?dZpy*C%499#&kZdZDN//=1j%l/\QiG8Iu$XK+F&nY\<dX^i8Hk=XW?^np9DPTNAyq?WMGVyECK
&lid$S ^e$ty@C$@A6R+IBERpNNE/#8XN!u8@<8ipS6*@ZD8\bGu%cIZVGJWG#J!a9=c@@H<+ViNy&Q6LcZb5V^
VK?XE+ W>iXq$k&i\a$R<1F==?1NI@%<X*<8Pj8R=YLiQ?>8<:CyM#5a%t/R#y*?MIF>qCN!=Vj!+&iZ^L\ymn<
*Y+4NZ &IlKRZYZ*uQ4:6*:a/<\L/1Y#ZVlM>/4lG8>QQBy<hYL^h=!djaP4&VC:E?iZHjeJ/w1QnQL+$>J<n5b
$?>T!P p%@/55b>*=\<QMP@:@/G%&P?6%#Y&YciHu:mwln&9L?EN&bV^d:&*:&6^m<:ccc9/\1*Ln^ZytSA9*p<
+T5bD8 mc4tSHEqu?>S#6aNK+X>iAu/:CGH/6Dclp<GH:d&4n9\N99t*a#cDp6<5E:j*YDuS=+qa^&>#<SF&c\8
F/A6>l 6$^%9B9QjZb9ZYc>pGdnY?Mcb9djuRjMqD8%dMT*18+#%XK4EKW#a?@!!+%*l!eI5$d<*K!E^dBXie?D
u>4mbq Sqt>1w+/unaw$Y9/+/Z4?dIPWRR%DM^maP?ny/HwjWK%:XQ1wyeM:P<^WnFNpRYMAT8J>mVl%Ma*M1/>
DDM#:I 1q:^L$S=Hwt#YB%^um4Wk9eDk?X^w>pYEI81EI!m5WN&d@S$4>RK?mAXM>+W?>qkk*m\Y/k=/>cqi&9j
hEBdB* NhnE/#m1QBLZI:+JMt#%:^yt6F&T/mwchBVMtP\Y:apj/P6P?CPmZ&YLD!Y!b9EA1</6t:bFqF%\cQwP
i6N*i+ 1&&k&jBL6wb^TA8^pPX?eEJC=$VJeN@d%$5p?j?/LewtM*5:Bc&D:?iam<@IT:q*$8>HZ$H6+N6>6>t=
IA/m*u M4NS94w<*9?JRDC#ul@>&j8#iC:dZGe4d::1q&mN#J:iwNkyRT&dS4Q:ud=%auEGDYcdFh<h=Z9L+4W\
cH$^1m $eTIQil%Yl1uWCVm8mnLepe#k!&\X9uh$C@^\qhSjaWBHatJ>4\tFu<qJk$Z$P\5ZJK#QKw%R*^Xy&eC
<H=kJm \6:$uK=bF\Ny8>j$i+w$%8!KC^ER!qaVwcC5$5+MWS\5i>i?N*N>I!WSMdnNdLtEVWebuYhTY<c^/%qp
m5:By5 #phb*!bVZYt?h=eZSY6LDP&?%Tj^jBY4M@:S!@\SMTc9$n$WPYE1l<@b@6Ipll#tpBAdh*C=Ye>j*wIt
Pl<HW? S?::G+@pSX4JcFc?%D8tyM^p>\q:%9D6/dp/uuHJW/KT5L#m85Gq1jQDKiYWaXm9n=y@Vc!L>wZqG?^9
8:PV6a I=dYJZHb=yFXYJj$d6PLb1!S\@#<nFWtj@!mud?wWblY1*j\WF5kqn^mq%=R%@LP</\wuYb>PFuK$qM#
:+Pe=X 14jI^91$LW/X4%@XSt^u9/q1:St$DHSTmQ&ybZXNhl\6:RLK>+<^&=d%adT!I5ibIqjlK8dE1$pLSuly
dtlTaT M8SwT9Gm!9PpXc#JHFyYG&u44i^u:6</$m?N6X=4+tmqiuAFnXIQdhdPV>?8>#cVd1i<dS\8u41CCXZ5
>cE?FT 5=YC?9cF6F69&dk</DCec&mZ=*K1CyW4bdqj>n&&$q8pS/M6nLFh=btEw>SKtaTJaMNe8!q5ddh=#F9:
l\$@i9 $P$&miE6h95iN/>V5QqFwjnB!lVqE+JV\!MJP:c>VeXwaP5d#NY6lF/4K\*5jNdVJmFd1#T\tP#bhili
I<JVlZ ZZCkb#Mn*DFJl6BNe&>S>MG?MIE?c&XMd$%&pyTDBHuTlIjXTQt+Sh86m>?Qlua%hZydciTL!NHy#SEM
9ADNmZ %u6GWN5:WXR@Z+9MlqGF>/&hL?^PT6Qm%AeqliY/!$&uQP=J&KmVVZti/Q9YWYPXG!%ylbu&4FeFNnEC
#=^mBH d6FbF4YV6?6bdlF>ZnSS<iKtN<tHdN8WCD4+pKVyF^hZPS>ZuTl+KPt9Jl*ja\!#ZZ8jCqtNCw1uqB#:
Wkc4V! @Kk1:jK/8:SLyYtPP&uyDY<nmbyNd$^cub%HD%Jycp/%L8qwj#mNdYE>@jIBFIbtiwtwWM&9CAq$QG8a
cFZkWC l1L&SY!@9dGl&tQaZEd1SD*cqpw?/V+\KkI@^dNG%W&tQPS8q#XWi>uj$bbR*=nZ84G4!>PSiDSc$<Pm
/NiiRL h#J/EIi=aZF<AJ??#m6A*:ub^W+?4F>%#ScDVVJcl>*qQNP%en6HZeSRXjcX1Kc$I*^1JpH*+!Xn<EHS
%h<nV: q@^$WKcL%68t$caQyebtChIDw+*<H<ZqHjEJHGPaH>^+dMVi?@PpkL$y9h@**9LNS<bn$a6:*+jBcVYT
/jY/^d 8C$XqbN=@VNYk$5a:ZJCR#555T=a8Sc^:Z^8?aQQt$RquD?SGX:p+5@\k$!4ppC:Xbptm#KFJ?R*FMSP
1TWLtD jFCiyBScT<dBVkTMWNhiRR&!4&4I%4hmZiYtj5%8PFd&1K^HK#>>a1qd/&?@18tmiWJ8aaWtT9WynhHi
ycAn\= SjVJh&i*+Z1C5l1y:$ncily>:JdNJ<pHCCuS$nHt56e6KIW9Wimn1PX8*lV9Sa8hWPm>GjZ/juehny8J
PXH9Xq 5@HM>4RaA\9N668aXW^W\Pm9D=t=#6enQ1mKYRm/:!Ajp>IN>uFaSlpNy1Mj@w*9pyWM1k^:NHGB#%Kj
D@#?8C RphSceW:9BpHt@*e4418uKBuZ>6wQSE!$jXt*:*8wEA^Qidn@RuawMKQQCtuD%MWtGwtNpuFpbL&<hi%
Y?<tip jCS8d?L*YMuHN=>?KPt@$#Z?#@XDTj?h6AG5H\yl@9uY^n@/wSDt/!$*5H+wlQ:/X6N?6wDqFuDeAwFd
:FRZYm IM$X<N!@<N!@8E&A$HN!qb\C>$EE4lGBm!h!daleG!L*mX\6%Nq9*e:>SPJcp:nYJK+%ce+GM!ed!mqk
<JY4b< 8aY=uy4>!D#*J/+%lt8N+X4QDTTE\ZCNMX^nCMN>EMT%l4nYENec+qyn8a@Gew&^ZB556+<\MQe@tQ5k
-AmP4! 0006288c3a3001202b3 Page 482 of binaries1.zip
uEGuwQ tG5Ee^?E+#/IP\+a:nlk8GK6ZG*Qj//p9495?9+F@ViYkYl:p8bJ^9pincV6TbyHPjB:NJK&J&tilJy=
*ZA4?\ $EmB>@MwB</D^mP%HAbB+^Bi<M?nHDkQGmp<aJ:EquuRCIw5yHpTY:=H+$kI4%4tTY!bB+$WNEwC+Sy8
X@dk^E @6BNCI$G+Sy8jpWYDl1Ec#k5W6$kZMPlphAkZINJTC$H+SyMRKwdlG5\H1q8EK:BMFLhIF^D$AdnwEG+
I!CAWh l1AN^pGDeA%GI>TNAiEcknaaB\*CNi#<1wWeNAnZEJSBPYkR4tFlyLyB8IckK<yBk*ANm$bCk*B6NtBm
&+%We^ jnRI%/D=Z%X^$CBek?b@aeSBk*ANRSpWRpMkZJ9>G6:<cBC8RWm#BALlGwR$T!AR4tGITHYDeA&DNE5k
1+Ma:c *L@*HVlw@L@*HVlwAyD9kNS!IyD9kFR*CNj\YATta6H@*9QkwIH<NR\CW:FAi!kJkT%aLJDukVDiYBC8
I#w/\4 +RkIja+F+SwPSpKDeA$HIdAFC?T9abD1B6yDTWl5AhyD<RlwGIS4MA=lSaa^RJ+HGkEN\nWamie\pL?G
%D9SVG ^HMacA<qIjlMMNAim8Rn\!Be\!L=!DABcQhH1l8Ec\nKwB\$$B/K6J:nkQbRA5LckkQlGyJc+>!>!Q>D
<bD+VE uM9eSR^mbNAQ1EJk=6RcIVC%Sp:NICSH!H1e8#j/H/m%eJcid&1NEJlcI/ht5I$jkiK+lhSc<D?pMnC4
Zp1#:I E9m%*TCSYJ!ckb\GA6L$IQ&Q%HFIK4PCbq@dDRH^BA@peCAhb9BADkjTASIQ@SRc?%Nw?KjRC$TG#k4*
Z6Z1bW AK94aFS\?G<<t%WLBBp9wQtBS6m$F+4al5A#X&a#=ZF#<^wHN1@^aBhVCK:K9BHde=q$5<9!D/^H8Lq=
?W&6QX nRPd%\TkT!&pa?6CEh5RiPR#=t6W@%^@k?$<BCBuH8uAnB!^DcFuBV/AXTE\Z:MM9:adA>djRAeBGKt@
T+tDY4 kR+CGASZuwD@KVS!lm#$I+wWHI:Pbp9P>6t5cmNIu@*WIaK\WJaTVQkl=WH+&%nDPKC^JkIhRIkIa:&A
FSd*1C kl?cBD/*b6X6aGm89:FA@W&Ej8daSX\wi^D:A&5\dna+?X8:RSRPIDRS@ypnG*FB^bWjWB:@q1$=&&/k
TX^wKy dE%P#jmjPT\81PD*A::X4KIeD986*ZkeWL8JQ*QRJC:kE&J@wL>u=!TY>K*hIEwB5!5<TL8JCIhWEuI&
!QJAi5 BJd\A+1kuPh<W=TD\BVqPDXDQ*M$J!&\=^F@RIGXmQ&1k9c%*SBaj<M@e!qA\m&$DlLAFT1JuPQ:ZH@@
Vdt+\I l:w#D+i!dj>+61uGWpqSXCNpEDQ*:MRp5tRha!TXH65Mp:WbY4R<NJcK<CBCm\!KRa6=6D^T&XK!lFV$
D+A4WT >Nw1wa!6i98y>&jR?5#MeZ6%HL@n>=jDH>je*@8<#t5:#@Q?ZEl\>5dNJl\BK6GJBwVMS1ATueJd/@?m
jR6tlS e!J!pknG6^pKDGWTBTBuE\kBpKKIEnQ^Wj\$%R$Fn8w&<YSRmRklRZFAIQ*91&:\c@ZEjyX@GetpdmRi
&AMGFh qG+M1PRNRal84AnhiM^MdkRAy6e<ANTcB+BK:KKE4HpAW6R=D##Bk:<ZBZBV@k*k\jp*1EThpHEJIEXT
i^BN:\ c\p#8dWCRE@=N+AF=h?kE5yC44KbLpaTT5EGbpJ@tw##Vb\d\eZ=AFDJcGF^QkBAm@1CG\&iCIGi%D%J
^pkhHG &\KyG#M4*TIy:?C@KMbQ*Ta#SYZDkhI>t@kpII4?l<LMkHmCu:^NbqI*By^@k+6QC9Q9Z:Niw6Gw!h6p
=N+ujE JuYDmtMAwJL9Rt/Vtc::t#&%CwPiGI@I1T>#ecDmGACw^D*j>\V4@nY*>@DJ:qkCjywtB&yew5DFSaY5
#w#j1B <!Kyk#Pk>@EyahMEDm\BuJ?AK:wV55/nSNLN\P9Y=<h#y?q>iFD4QLlmA/TRhX+WhSA#E*IIF5aHMW#S
Ch8^4: =EC6</AKFjkkQwG/$eA9wcXQ$99+SH$?/SHM@YpwAF!Sk=BmQRCN@mY$hD=lBn6>:^6a*blb/RaXF<WK
*QJp?j /!*e4F1LIu1CJ*?nJ@dRGMI$<SAJkLIb1J!DpMI6AC$!J#eDClIBl5FN4S$aWDpiAFSlBqbI$SeA4nBD
aR%$:@ tKiAK<\R&q4E85XQKwAtA8Et/TQwmV$bu=\L^tckay6aIih1WiVAti^9J91b4*8!4$H1^5%KN%/W9Yi\
ub4w1? D=/\M*Kc%AmAY4hAFbNklJT^AllS=#!AMJN#B@<YtCtCH1l+AKlCFI!\jaLw&!DB:<9+5Z95NNEND&w8
*m18>L \+Icq$L!9kAYQa8Cb\BWLau\%1KI6@w#PB6naGlk81>S+QwcZLGX5L+Yeh5hHwYema@PmIKHApDXpkml
jn!Q%Z +KEA4D/wIt<lukK1HpS+c&BY4XG#cw&iXY9M4F4@KwIjhyJGNpZCA#WQ+<AX=R5=Q@^aD$L/%uccyIRW
!&S$Kn SFLT@@wBI=?p>AY>>PQ9EkTRqLAVw@d@H$tya5MD\TRq&WwyW^XaCX\>I@d\H#+Q9PCwM%IcVii$F=yh
RiyQ5d P=!baFC15pR=:8=:mjtjIHj$d5SEFW5:Ziqp1Mt<T#$!mXSmZ1\ATuqMZbZGA9%TN?*c*?>VI=@GtDMN
yTPXVm +dDZe<Xb8^NwTKXiw/!H1RY>nDGw:Mj%=\9/AG=+Ap%BntWnQub<MPQ=l#nY@tejyMTXLbMnF>#iPlcQ
9LQyJn qIERyHRJ9i?Nk=l&/N5<#nC!I4/ZlDFFbE51T+tXY1u</i?dpFLW:$H+\$BMe9h!m*5XM59b^$c8XSjL
&W<4bW PV/RRk@b8Bq\\#NJACd<Akpum=VwQS<y5iX?p@pmH/1T*C:P>pFE4+:j<5k:J@%ZI:w!n$Ra&l>i4^Ey
X:EGD* h5SH+SmLuLG!XK8LY$=a:PPlZDTTwX$dBiYtNMR!Qt\#&6mRZdnkQkq6>TH&n1ZHl/y#y%FNpEHQEZq5
qcEYwd $4ydYNZ=!qHl&w:JCcec^E:8I6w*t=d^H6Z@4auLWRlS1I*CMNi6pX4a+#aP&eAcNdAimlCn*R/*QT%l
!bY!N% E4@VWGFneuE4MlKyaupnWuEPqh^M?YV4H^e$:8w6^=4ZV5YK&cdK6a&P#9Zj!MS<@k6*+awVEC*u=Pqi
?R9@jq GyIVy&B\w8w#D>h!ByJ\*itD6?qD:PuapdnhXXZ&Lw<:HPJh>:^^nH+WSub!4mh5HKn4DCqSphL#=cTW
HwdC:L cPm$u*ZK5XE+@C^CjuZbe<DQh&W9cw9MR+%Y6S5LFcA8/c>W$L8cN5HYDZ$?hC41ZPqVNYlej%piK6p4
JN>RM$ *KL!V6*>eT:y#KP==MAn:ZN1+6*/4#e^8BiY*1epF+#:P?4bTYtt$ZSn$eGWQmXE8>t#5&bBGjcdIAnZ
E9/CVn yk@qn\*u\5qMDjYQ%awT9S<iZGq9%S<?dTmlFX\c4jiJGMny\yd9H>CW&Z*PRp4b&bc6bX@1jn?c%ew5
Z><cK# <%n?e9@KE$iBP^iCPM/hBe>TY8%G:qdVF1\d5ky&@u6AaZ%!d1hTIQTmm:&SJ@#?b?&LY?wpKG\*S*L6
$%EPMe ?A4uHMVYpc6hDu96a=8dtjhIMtdn%##KbC&H>?!!AnVYMwp&&^Ph4RwLT\8h%u^$m^tA>P9VEE=4/H@L
Eq1cb! X^&A$uXk:K:<Fh*9WbG>D>JyY^NZjc!S1*Y9Sd\KjRyV:ad\49ji^M5Z6B9Kdc\cC<&lGb\@4n@89&pD
TNjEDi PW1^=/A585Q^uk5Vbud:W=K%FcSB14QmjWF6<=&IMK5*S/18KyGi^</Q1bYHeZubCk%YB/t!<DPLP&m@
@#=p@\ ui&1nNJ/$YP^^5hXTi\B#td5hG:c9N?P*>GHSFN8um+yj*mMbcqh1LZq$1Zeq5NwTwI69iDQ*TWYh>m8
wX<Db/ \N$:clZ:+PW::6hAjeRZRcID<5=tRR+m@HZE1*9y=jKLnStNCl1TpJRM^:FIkLdpn$aj&bMa*>?dek^b
VP6eJT <P4K^ihC:S%XVY/HWeYV5tI>jXXdC%:Bp%p1C<u$VZhbZ6q9bHXKV4thY%yp5V5@h:W9H4Yp:&:i!VP=
i\>Q@D B\l&S!@F1*\IqV*D%mMNb#jeCCPH61chh+t#a&Wcd+X8e?S8w^><ypZNn9alL>9tE@R@1m%8!w>ZRLjZ
BA/@%> =ejyL?%iy<4X^nYItcch@E*^mcP>B94Fm/acHI%6<#nN+9b\ydbMY$yGltP>8=?cJQH/c=PWRJ9\^VCN
^iqNLn 94bW<caV>dLquK/!C!t//=KQb/K$NJ$MG5Zjp@*#kk8Tl9>K#1RHREu911LtWBi:wbC=P\$jeHpi>HPh
>XlaG? CH9DQ656n+!&&LSue5#?Xu%eZ$dKp9PC?#VZS<JVu>#eSE+1$*<594q&XXhILp#LpLX#8NLS<!QM<ZQa
B4I>jE =j^=d>NYh%@&>W>E\WqyjaZ5@Li4d/6u&CZq>DqaBht8%em8Lp+eh59Vmm69jZZRMIpSXI^?8yY#h*!a
=ItdC+ <*C@&+tQy:hS^8kX/Y%E%ek&G\XMi&PG&6GFX6&wSHPQ<H8d4+e<nYRbi*5*=:^CZDTS1Pk9wGYa9GHZ
K>imn$ PC%Tp*l=I/XQHDMTFW5?lneq?c9tZRyV!Nqy4bPe6c!$EB=u//pc\u//5k#mDK*Pb?K$Ik@9&YR<qtNt
u1/YYh qdd>5NS9qw9qhb%hn#XcB%M+hyY1%*?LkH8<L/iSXPT9ddMicF%&<#%S:L#Nj65ulYPbm@bXhYu>=bZC
<aZCeP jGFqY^?+LuZXZIXYhIldX9Sq>S5S\\Z>Ntc^C66/5qXPRMqt&k+&1:LFm%Q/i8SIpiTZ*B!h+>wT=a=!
5#uuKR X=88PG%GPK$4y4>T=cV+\q\1w!$KZy!%VCTi:HSj@<ikC#6qe?JVtl5qTb:PWd6uEI<JktuuHL!EY^8n
/ymPGe ?L\m:yy%&uYcXPI!$yY?R>A$yc*Dm@\wPwwP!/WZIe^PF4NCG@h@iLm#i:QXXYZ&6i*l6=biV=1j?qkn
nL:9aY kt&6*<4ctH%N/YNQ8?JS9?j4^8JGl4w%/##ZdK@&mL&m:tWZw>ByPByP^?5<4uS^DT$11N5W:#ITqS?I
a*Rw#W itYyuuN/ViBX=KFm8>I*GjHbK1bnyE+u1t#S&<6:nt\+Wcw:K6PYFTy?LDZmaiHXCyQpacV%!>NNbRh9
^Lh@Iw t/^?hyjmIqb5W?MhhY?9*w66bW?HIK:=Hp8LnT:eSlMJ$eqnRi/8NSW8tc?$<^Ldu@jaF#+d4eqMb8E8
/huDSp E+&W^5yIkjLNCI6Ylh!>q*V$Q4>?B1DHd:E#ja<Va#u/*K$9&=mH15y^jWqYuhq+G/*P5=ad6QES1TqG
YGKT%# i>8>>R?>Vwe+Zd^Y@4BW>!LB<JN5/ApT/dpmLEmtKIYNN#9%j9NFm/H\1M%&??GDLnbNN:W4NqneGP4+
I>ZFe^ !%l*qLT/#$NK1h6DMZd@@8%w+96Zch6!H=8i4@:Qw\X:d4Wa\R><Tt*@>/ik1lT=\?HuV!HjPJ5MPMt@
>K&*&y pD8^C4JKkS8:+4!t&Kdm6KbQD=y4X!y:+>X9KcYtn*T:uwjGWZ&##mC#M#c:G4uLh$yTMFD%Y&%F?IdB
=!n9yl HVX#G4P81B>8ZDeRP5m/wGFdwC==BCm*Tibpitkw^Z56y>EJmJje#hWRZeuuqyiYN?&p:M$:TdF#W@iE
w+V%5! 185>iXtb+MC^5//5dK8Fp1qFC<\5h%#pcyn5Zwj+GA9^uDQj^lBiE9h/>hC<ycH>9HicKEy8S*wHTha?
nA=XNA IGJN!&/>w8!/FGN6lbB<JTduYENM*I8FnEc*uSA=N+$C+uM%=L5FT=u\FBP9t6wASYq#58d^PaPZk5Np
p^5phw G=&SK\FPa%qpGEh9Ndin*InhiyAXNhR>*EP%e1$4pm4Tw%RM:N>J:Gdd4S?TZ6S+=T&9BNj%L9*?Dmu^
awYLE* A!@FCcMi^CAi/hGCFBeyDXq1TcGMpqS8m<#GT<E=JdJ!9c$N^uS:/F\pbDR9djFF$4=hAd!*P#*lbY</
-ALtuu 0007f929de3001202b3 Page 483 of binaries1.zip
yPuk/8 &61lC68>C1ImY+@tL#>p#!*6i!X>+h%&u4utbdcCR<T8wAe8Et?Npe*T59tH1?e9nQ4RPSi&@plYCCK5
e6m<Wp A#G1Hlaw^up5=/89tDDR$1Q*$9J6P8jNQE>k*1X/a\$4bw\tNGIiI<KNbYc^JC=li@VKe/VEw?w4P/l\
815Q6m M4KFuJ<\\mPKpcSZ<Hwch@Y/D#4PjdXIGe46M1*u5EiY#4?>@+%HRW!=tddB/b$6iejcbS@/L/>1YE+!
q#CEEk 8X:FuHPbwW$?IDu9da^upa@/5<:etLq59<VeM!p%u<T#5u%Nc5K/mKGYJhRE\@=<6*kQWlLE#$K9%L6/
E?5Qbd 4:hy:m/Ymw<c!6Bj*Y?VPW4<Aw1SplcY*$\LWN6p&N\Vb6S#DC:?d:HEJLpBE?:AXm?HG%6n6:y!aER%
e$K\pA m&ZhKl#=aH9J8<9#EnS=pXLA8M8e98A<&tYY<ie+ydD/XewcT8jb>VJ?QN819uQ!e&wHTq%%qtaQmK9Z
yb\:DS \G*<Yp\a+ma:W/ZuujtI*9=iw6hl<ScVcDkq4<*a:Xy/B%XNup6Rj@+J&4@TjJpt/\?hq=!%YqC>8mWI
F$jcdq e9*NSu>h81y8HWJQuRh6i4%&EdK=eY%TM%enm%VV9WT5#q=e^$:8dqtE^mu48W?I5KbCthH?PB:X=pA$
==%1/A e/Y:q!TN\b1VIAW*nXI4j5LIPw+a/WyLQPYM!4Swd6H1mwW41Bl\XheQqlXHKT9tTADF<Q#B^NCChP/I
A^Xn%A #Wdb9w<QTm=ZDa@bJSn6w19y>N#ERPmn$l56:&6+@LuASqiG6a>I^SSa1MIeu8!Jn%eCk9$ZyIj+yF@w
kL9jG: WS1JNKTe>#uE+9*HAT@>%k&RY/Fhc@XI:q@EmDNZa$68>SyT&EQLE6!8i8#\<41<Q51edGP@@1FinIhJ
kP?MVm EaXSjLlBy&/SRR$9wipiuQ^AI>PdNQ\IMh!YTP/\:?FBS&wNm88jJdKNuKVlbk5R#S%@Y:qnIlQp?tFY
*5e4/Y =8<PFn\#yl1<jyGj/tX\\c!qjhn9T9Pc$XlA$hjI+8n:nVFiBIh*WhJ&en$d@a%:AynE#4wRJRwSQZ1G
6!S&G# iHVyS@6DP:Se4BwC?wP=9+e=YB<bd^#8T\mb8=b&$MnjVM#D#MFYG/Y%yqtTJ?&$Pwp^cKT?d%9h*R%n
F8ubp! PF+\&Z>Ja:B9qdq^&*%LR*I$!8ylDK/F>u1JuNS<Q&81FXS!DZE6:%@i*ZdX=J4S*>W8==wjGeiJL+VB
l$^T^P BIB=y9p&@&hkuwqnK9K@A@Pkeel@kHuRYH$RaJ+y159$<jnuk#j?H+GTcatk9tkD@quhQ:Qt/B?Q@X<d
Z:X+Rq m\Awj&MtV^#:<VkBl@+jT@ey>GA@Kk!?IRC&KTCaEikX+lqMD\!ABRjCVBu:kwID9Su8RV::6KcnJh6k
/*%wSZ kIn<^ye8R1F^8C<c?B/DA9BaRWK\AwTRGFTc8!j%&\P^8H>Wt&BFQZHmB*dDy6@!t\I$HnZ>9#th\b!W
t=m#Bd >KYBnj9p@+S9DlR!<a8/&J@X+kTwhjaJlDF>ApQ<9GAV+<kLF8^Db<K<R?liwq:k?*D:%^j+c1K9J5ML
IVSypl MlqikAnL\D*<@kylW5E>u=?8EjH<L\d<8R5Jk9RRBPk^D&VA@AMbXBk>kBdI<HjuP>R*PRTpmPwlEZL\
Y^*tek Q<uSF!SHZ+AeM6X9a8cb/mB/kQh*4k!kSSB*SEkl@Cnqm?j<IPZHn!ctyXDeQTd?BNJkZ!cy:<SkpYD<
B+LG/4 @J>m>H@!/&uk%#i@S9@w%?mjlRLCS!F56!mBPIF?@HWejdEPTyB%WAIic84nH5RQPkJ/MIwQFYdm#1S:
4h1?J1 Mmi6>h%MNNF4wnSlWYlSt1cN>6XGZ#RKCw:??AHIV^ySinCTD>$Q6yZ8:$?h<QGAANnE4Et!tJmp>d@y
cklQK& R$$n^4/*GTl>At$tcN+GSJn1t\+$B9ZjVKLjJ5$yP/G?kN/?PS9&B&hDIVE@Pl8A?9pqBM*=bkGijNu<
9?d:QC hee>\A9tSj*!4/k*\GI\km!J?cquBc&ABMFV8Z5\dGL&>Q#Pk9>L*jZETuKehhqkFKKaGIqEAk8yI!N^
4YYmlL aJ>u814/H$J!*u4j&w5V??FhP<SPJQ4N>J6y6th/646u%!>epMDIAl?D+MkjSWJCquLIIeewTMAJ\aF4
mu6tZW nqEPHEDmkARH984y/i:/?njX:iZEajZ&jY?t/qhjjjY4:/814?wXG+D?NVaA\LE4Gc&Hk@Ec5QEctmwe
EiViSm cBBNAjhy/6/8DP\>/IE@PKkEheeaQ$TMH+aub1BquynKe=:p^eNZdDCpHebSk&kmDBHVE/5?ynLIePL5
IDQ\B> lC=Wa/Fn$<?kG=q8I8=PSHP#G!QZ*w$Stl>inbM!L4=B+/l$Zp%*//T\IbeB=JKIIZYB?mJE?t<pN\+^
EHJKQV GZudG%&WHw1L9pcV:ZBeK1pGl@h<G/yGu^GcM!M$K%#84:J$+V\peCi/hABB&1ul&KXeWYkTmPRJe>hW
SHMZ84 4\&<N+Y4RD!XdWYCAXEImMI>%1<@nC!*t%u1q/^?=K^HmLn9yK8$I55w$>W&49bF$pQnNbNF@*mMtIKG
bytJ8k MZkW<JHGHQj&>?Pe\=En6u<>L6jP>Z=dS#6>%EJP$mHYWYDS$TIy19R/ZbA9&1@Qi#w?m6m$EmG8nlBZ
hcG9ah 9^6u/VK6d84^ZSZ:581lCd&uR^M\Q&HAnlH#E%!:W^yBiq<um+jp\V8Qt!dakC5QAa>CBlVRpJknc4+w
ceCM:X K*Li$*K6AVC%?SMuqdd&w>wml5bFcBBXQ>AAKMlcJqqy\/E#yWh^uNCC5DlJ5dPL!*K*L8I!/W*^98>b
H/qcP& $mE6>5P:STJA<5TeXi/!6K1M$M/QB85WcwIlh+b:BKIREEVFD=LFip8nP!Q*6ayVw%5GaER$CR#WA8Jl
B?yj$9 eTIa/VAE<@CyqqGaQ!&Ed+=5MVjbYLmiPdIX^+>>:^9uu9Pp!K6pDHd@:yEYhliaHQ56RKyD>K#DJ#&Z
FR6upt q#ip8/wkV!QPXutSX86N4\5D*^&e+dQmPHcl/VaKX*H%lW^>LF4*iS5Ryb>j=j81d5W!4tJ!&na:twyL
:Lcl8d HW<X>Jh$&=>^kwc5S%ZKPV%CKw%P\1qI5RZNMjtGC6>eJWYyX/mYVq\/bRQ8wiG?DIFJ=Ey&\I+/b8Vl
In:t6i Inb#=%ckG$KpX=tZ/T4yM*9wD6^d^P^DVI#bZeV54u6/MY?u^<Kmeuc6>%5/%\Zy5ww*8/R\!C+WpiZ&
V+Xby\ =6Mk*VpDKSBIaa9*6M$>VJIh#an^+1FikHm!Vlj4A%/1>#BX>&cIeQm<9XBV5LwMK?JGX$=RcJE?%l5S
N*j:?= uWcZcduI<yK<%\=tNJ@pCA%lRlYm?iJ&<pV4l#SYd8PH>J<$/%Z9SwN4M!dSDS8#4wjkwBup*Z&&Va4+
ZyA>:\ K1YyNP*VSSTwcbykWAbM=:KJR4CJk1!S+jSlmE@eqt>T#TThC%L:54&i6eFZcP:6y1&n=6AE+kd&?BTM
q/$XI! #Tmcyn/Z1+>QHCHCk!cDN@QK?c%>Tw1+p&TJZ9m?t&bGn\+k>ZN4LJC+ecEJ\WWV\45y8c9EF41ZHlV=
#/cMYR :<bdb=$ZbS?WP=?HV/ew^9+C5d>A:H?=9mq4l/%MF96CS$SZSSI9%u%R$u</WI#?BcJ@AS*:lE!IKw?4
u%d<Zt mkm%6GL^*CuhJlnLC$SSA1/<HClVB##^Kp/*lPM1Z?%Ly$yy96VGd5eu%SShCed5AnG:RM^?<eG8yt*6
hM:JI! :G:&YbYipbWX=MtXXdI^wHuDN>+u1a=FA\JFA\JGA$X<jc%>!Y&epbWbaAa^pn@JywSpaBC*C<V6>b:A
y=dcy\ JCS1Yw>BNTC&jw*t%VI8?69H^\hqQtWkM9D\BTJwkRn/*ucbjNDjM\I#&lREk>BHtL/:>AJnS6M9iJ9w
JSd1QV wP>8SRc*&N1&H*WlBWjGqq8pjdqFCMVcB\4Tj454:CCld!IaMW6E#HJ?58LTZmeeM+I6dAnG\^L^5ER<
#=nRtH HP<yLNlYi4qPS!y8cEYnRueCG1\B^L!*:dX=!taW^:b#@ZPHVEytJNK/nmwp+8C4LCi@j%H9XbTP>P#A
8BWpiZ $YyWc:%tbalXZ:YZQw<t1EW!V9em4lc&yiu^@Vm?wmEl==+VIXnl>q<>/TtD4dhIH!uHu:S*=LknCALj
TL%/Zb l8CwMEc<ElG9DKAP:n>\=AkG*=&CkZuDEuuDE6H41:hjHaWk%SRIuHPS>!5Sn?1Fj$i+hk^8PAWDG>IK
qpXWQI Ea1CG+96=wNt5*Mm6:#&iMh5hD=JNa^qFYJb=b=RVZy>a=:KGeIRkVeBltKP4pK<w8DBp:8*^+^E>N=t
LWWhyF 5pBk91^C91^CQL4ki^6nZTNk#DaA^NlPIhhN1XPA!9&GS1khl#6JMe^=Xel=XalIF\&X&X$R9ZA@ARWn
69F>\S X+ZIXjtuWVT#*b1CIh%ZI#dnlyNW\@lXIZ=X\YqR%$t!9NK4d&N\kpp/aqT4ENY1<CTeTu@N6dPh/$%T
XBI<+e DGNelSlZRedNpukTEP^iD+A\&9WR:Z1Rh4N$6/M8Y1#VuTNH9Gk=bTbWnG5>^LWi=Ny<5>Q4RajNT+im
Ne41S& tTwub4Xne1jw^&QE/!Hm>RVENHK<BH4?W@VpMTd&EBN:<ISjpV>J58!Y<:W$!>J+R</>Fa<ZVJpnQi=&
A5MG!/ ImL&IBH*w@e^H9T<KZ/E^>naR&#5icjAHE:k>HjKStGyTVym>P\li9b<P/!d5VH9mWp1a1#5IXd&kyNa
YEcXNP 5u^%M/wXGMMPpDBC>lAli?FJJIjq5DE5Ky#matE6IA1?M^LBlqNCNYaQ@Am@<M$#h!J\:chQla>It8?b
%%:d@I &yHDFVKQ5dKQYNq*V%Yid16pXj9na?5Me&96nh=<^5e?+tMj<ZF*<ub5FMqRVWHCYNlHLP\nF4=#eb@C
tq^XSM %%8n5X5\TTGMjH%E9n+m*&XcH^CLm=9nm9#aqCt>TaylDP\nB9d^pd94/#R=i=&t1E%M*YSjebF1pu:a
an9@Bt RQMS<jw?%M@\eN6w4C5tcakS5I?w^\<5tLyDmYQD1u@@8AWSI&IjEdEjYw+AQpm!bLjP6#jPXXyZc+>y
D<nnN> wpq/aq/!n:^pQ+J/K9TGiPMP&8%IlJM$^B#qADuKAiSk5AiQaQmVXMLaPEB5HCA&9uQ@jG^ECdmG!THk
MWR$Gb qmQK9SmJc/i5cjLyy$%RPp/WAX91DRJ44y5IECWu<iPpZBc=ntlGHXEZ4t:!jJIAEVHMV:#IX9Et#5b/
$q6Ei& ^+XLtt&%^>=l:I8!E\ZMV8^mFHPCDAdHY9BG<RAJh*ER<<LM\+66864En9K6KH\a<\>RMK=F1aeCyl+t
NWYak+ k%P^nqB&SDD&H!CCiwDJl9dc=H#C?PFt&cbn6iPH:ci%9=@aKwF=mNipw/VaFiplPhtPG?=Qw^SMASMN
/tS+dZ Z:iY:pG4GGmF5ZuIp4<E!#RWwdIj@aTbl89?RZ!mDV6\/F!^nEPB58eE#Dk$K4@qLJN!WcTH+T*6A<8V
=k$\I# pR%Jw$KYb!lRu1GAiad4NCuma4G8D/mAKV1aiI=8kImdPtJktGt+94p1$1XnByWnTyyQWlJWCtLji>dc
Y^C%&9 XDnF14t^SH!5l?!eYlmNYDXm=*6*L5+yh6FLdNLPl\1/NC^4WKAePAE#AhQNLp5Zci9Z&Z5I:<mG:MAH
8aXAyy T*+VIiRl^M+uIq5ASLlVkDBuN$VPLp\NVJ9LDiyh/lEw<$p/RV1ATZ%9YG9DEh4Acyp>SN#Dm^kZS<#D
ceLD+! C#lT^MX%nq%:\LIj%NtdINDAm@lAR/\MM@+$DAwI1mK>&4Qq+GHqPE1KGMhEnIlS4y?A8Z+c#C=PC<i%
ISTji& n&MhHp:A\ikZyjwJtP1ueimnyiZaTPw@:tRB\q^kqM<taM/jBqKt*$1wdn5PPWpl#AGPpPMHM@ki>nN@
j=q15b KEC%k^GVqMJHGYJhtPSZu!b*^c%Sye\uKRW1AjH4X=<mB8He\kc1uQPDRm^=V</qQZ1E!Z8diH8Yd5?1
-Aa9Q: 000e96244b0001202b3 Page 484 of binaries1.zip
GR:66M hZK&TbhLE4WLc9bA!wjVP55ap!mFVeJE9p%e4NJ6=%YNBFB?aK9>1MKIwZESG6iCJ45bmb4EPI^YCT$M
m?!1?L kYAk!nZ#Z<deeN>%y/B^GS1J$EmIyw4Q?nQ&TE#ylZIKH1kN^LX9&t6DX*kMS^W*WDbn!:uHSqXkQcMy
4LtRYX aiLjt$tqp>Ch<:LMF/tbYk^nBHVRhe/8Ty4:TFGIk:j=>1^Ih96qCw=JIk@hY9&^u#\GJ$B\EA8@ij@e
nNpmBY *GWHENCG\SAC%AAm+E6:dXNMbcD@>pS<c!1MkMZe95<qaXyiq!:DNnGRN\+:myp$T4TVMNFPX$%&84T:
ZD\!/C pXFk1@TwLEc%KLNP\5\/I:EW%a?8^S4W#=LtJM4+pnByn1jwCn9JTuTpcRmHpT#Km=M\L?:!njj8Zbwu
$wkEJ= hwG@Ep:yE%e\EA1BRE!:!&IhI9KVPkBIMEpdpkH^EBB<:X#/PF:ePBjdhd^hJE9u1*G1H^kbedWucaeN
\$j5Wt d^iSC$^&M*IX^?IQNWqBnF6Sty8EcY/:Nlqw^MF%y<D\Ga\R\WB<8<P*\a^y^$XZ=R^lBR^YlGBFhql6
PZBV/X E1Cn:AQeSaeklyka/cL<Nku#&@1y\+b/:A>+Y1AkheA564i66jqTVbpXieQbQVC!#e+/#w1?NT!SMMjN
1Ilb+n #FC*\$cH+TSLZ=MwjW*C>LYt/nIl64qPTYI5PaPZ^FCcjqh@w#cY5!bS5ycEPY8FiW?m<#lN:ZnktB4k
NMj=KY abTM$6apVF54pnJh:9YFG91MnDGa$LN&p=VDQT%E^VCV:Y&?M\\k1Eu/kP&Hh:4bc*Q>CaPIY/jpWRnQ
qnuiX5 abPBQT6d\mT&?+9%NptV+yb#8/CI#h\eB8>jSdC#GQ5KTDiIje6pWTVXJKbVwdSXjXRd+^/W8TXl:6wB
cQl8Y* !6q\jyJ&YH++BSd#jXE/t+VydKhVuNE4hqNWJJpjnLK+JE^8/>@?ai+kAT\\EBqk+XcPPBmt4?p#R1bL
!$:YjT k%/bt$@B\HlZI6/FYY*6@R?P5l8JSC6lR!CMeCWmHJm#Xk+9pS\d!SI6n\$lMhyFTY$TJ4YX?/8!T16/
Qw^?5e G<BbkK\&>FDeJC$^S^lq6Wta%hbiFQTyB:p8d\I!1B#E8k@56du#KSMEI%*F9T#J%l+W<:JCnlRSNLka
^?#HuC A#%@F1Gia$q9EmY>Tbn$X4XZeyZ:*T+9Ku96cCP&1@*aP+!CWc/dlLq8qZt#k?QbS=cA4MQl5J\*mZLi
:kNVcL JM^=1$:jWDAEw/<duACG$VDKjyM\??%Bpi/!=E\j?kYd=qQnqREiS5pw?W*C=Li1j$tJ+<*6eWEkywBl
=?*W<I 6I\!+CVMkD95W<nADkI8SR^AMCJGCZATJ5DXICk+PLp1d*>X*AIJ/kES:#5nAeAW88Np+4HVH%I^j%lF
CjGecy %t6<Je!Ew$<&/lInIS%K+yTKe#J!lGHmY**@!d$:I+FDaK9#&C%wSRdt8L%4h=/CaEK*<Bb:dA6Tim/:
D$EcMP c5N?1d&EGZC>%Nyda?Py@=S#y!YY/TbSyy8EtY/Q>SXI>lyS@q>Za/Myq6etWX/dlHq6n<$d95!$N95d
A=:deM ^Sa+WAGIW4>th%cCKhH5RQ*eYjHauy4u&$e9#HF:pq#yc>uA>4D>XiKiqlnNwpR&CSQbu8VF^q+lZGV\
&1p1p/ &Q+XT8mVMF96QZ66<!u:X<QS!m@GCc*HbTZMZ86&Tt+hdneX>lWkAVeZWecc:Gi56e@iB6H@\%h9@?Z:
u!*>nS @+bj9Z*nN@<wQM<8:\Yj9jl4>/P@?MjpN#::^uh8Q*D?=NF#=<:?k@DZjnd/+ih?>V>j@Pu9Q@4qQ*@9
q\uBL9 p#@:VQ*a:cQ9ql@>%+<@nF@+k99:j@9!F#?=?MYQj@#mN:::@jnJQ#*:+Sj?<6:q9?1Zeb@<ej=T?yp@
D4>QmS @h\@9HV?uj@=t#6@?KV<+5e@1m/h:=*@+QKj9:j>:%ii@buLF*+TjjqLZ@/SWJi9Z@:/^:8Q/8h\Z*4t
qGE#JF ?Z>*Xn@%e*@\i^ij@>=j9Znu&^??<D99Q@Q=?Ze9\?i?>G**=*@+H:?\qH@*/C8@NQ@:b:JjWSij9Q@i
5:+dPW e>=Qdn?LZ11Tbm:jy*8y/ttjy=I5l/>?u84%PL88<1%?w84+*@wQdp@\b4#S/TZJhd#QhBl!6$ki:bQ6
PwAP4@ +5d^>R9q=>5XtV!=R5@Q:8@!/8:^PQV5dSw\T+=BDDHwX6=yVm@ulT/^ZPkBEJA:VeM8*4&iyK6%=jkW
6%K/Te a6YD1Q:4tV/kVGC!iFWT5#Vc8u%+Ki6M9%q>yp@u8uQlPqH#q49?SN$cGtNbZKZd@P#6ZGimQV?:X>EE
hVp/&L 8#m$Sdj1QwW<:#1lL9i*t@1XH@HY!E@SG8Gd4culh/$J86aI9*/ul:YIy15#jXDQuXMAERq%1pY*<&^=
uV48$% 5pG8EQ$YBb#NYCLl@/q@/njJD!&KB1$J=whQ8HP!=<kNV:Zt$A#YuuyqF*bS!GhJqwhaN?lmT@Twh\pI
P&q/Hq dZy>uSDh/uja>Q6k5!8cF8knm:nRJ4#MKh/6t/Q@t?uFQ&h&4j>q>K?IG$6j::i48Nl95um9Z%:@Tyuy
P8ekGd 5@t#4Qt=Tdj:$yuqK^yMD=%b9d<&i/?y+q8Hu?SM#%:i=6W!8Zciy@E>i:VQ1/SM/@bG9nNdFjFn9Vkh
Rwe5Tl E9=>pV88uQe@hKX9EmXaPbXPEPw@LK<cebJq/W=u+M?Y<Y1qJ+uDV@wANVW6F99Nhbb<+M^&TXG6<*&y
YP!#TX L:5pBVeRX@5$1!9Jpt9T^F5Znp9D@XDHRXV@6/m:wK&/@p8HyQu4Fe%!SHW#/1BcN<ut<LNKM=1^blVb
5+PXuJ L=NNZJCc!pQ6#*jXN$ZpyAccBYhjZ/cJ*tjSC:GK&4E9my1X>Nmuj5\jJ684tP^X9^R@c#<:Y?T:t&NJ
%aVl1K ^jI/&in:WJL/lyFbq1@$tk9%R>ed5!JbySRRFauY!TbiHC\nYSWJAh=q?:Ly*?yJZ8:%WlENpqt%yn>*
XAICLK 9<cLQVH$dLMuPMSK5%1?%JbXq#6dJM5$!&KC6P%>m@B6+uK^#&1A=DZwQ#@c/@6B>DmpZ>dE$W%qnb!$
w@cXbQ RiN\hu/\q>q=W@N=9=9QD>1tph!y=j^kq8eZ#8#XF5%FW<yFW<yF9=TL>55$Py5Q*t5?iK@@\Z6hLSjp
/ZIGYc 4e#idD4:4ibLd^&?>Q#54j/**ny?196&jXHtL45laVP$*ttKiPha^D9>I6:y994%B6mDhX=wp//>M#JL
#5l6a8 ?qQeqBEj!+n:beRNnLk4K#/wK6a<$cw1cWyJn1Wp@XKT:66y<<G$RbV&Q=j&hJywZY&d/9QtY*u#4d#@
<iyRJN 4j#+wc/Ybjw+4d5+d#T%d\4aN\Z5?\Z58!@iNH?9Dw1//RB>p%P4ERRe*PN/pt6jKXV5%tVp#:by$P<V
%+y*pR :^$C\tNK*#h:u#K<:L88$?+FC1h>X%J:TY$i%%*qhCHXZc>?M4Q=lYah6#&GhnjR>HFedZ9NjVpkq>+X
AK&nAL DyhReW#mPayJjMj4T@\=lTCKmST=d/+lepZp6C9Vnal?F?^VKuCEaKLREbKJIpewW$TSy@Ca!HWE1=He
jTRqIC m#a&Pw1W$&+tHpYi$&:pHWY?$?/uNTL!<yRJR4<HwX\tWw/yh%>jqN18Nd+tZk/m8TSH1E$S4pZCJ:61
*+Q!p/ p>PPw5ly5<McpZ=l6D&?hJS=JQMMYVAZVl8LN!L/Yl9&HWRSXikdFWn6w4Y*XS^FpiP:ywlk?JKJlPMd
hE%4!\ \KR?nBX/VBR/di=TI/L1\wCJyBQ^V*qP^D=FR!RMtanGWMSE\wutVCTh!GYm\Iq+YbEV5dJC:ZW#phK?
*<^#@Q K=QXH1Aym&19uep<jWp#p^ERLk1hmGtYkEYtb9XSe>j%tW^dT<BpktRlp^E+N&I!cyk\G/cQFd4KlKJ*
ZV&/YJ ^$I8Il6m/Mn=<^p+GlM?\$anPDRd4*%**$T4=pS8\tY!5I+CVFqEM4M+9ZQ5C5XpyCZlMSt%XQlMSqwT
qaPl?= AbPSqmTZWdhKlyq/^yWSp%E:%J#J1B&K6a%/^qY5dhR#dpe1<tZ>C1udZtqFA4%d%h$DXk5<y:8ET\8W
yNRlkT n4>:AqIEceKVlpS@SlpTZbFuTKkh:d4iRSLXN<4%JMK6V>j%JdJ&iQ5TK6tjG^I>nSpImchhZ@RqW1<N
p*j$k6 GJly\uX>A:QWJS8abXB:%H&JL6uA4HVJBtc6Mh@AVBNl>\V$RWIqB\btt4*e\MBMYueDA#Ny9jM5DlJh
?/aEc^ 5wHbC=#8DiCDSJh5aQb%!RbtZ=h5aCbNhP?dHmSWetlkyqc/waGb&mR<W!IhaXyLwE*McAYlE/c%EBbl
ea@bn& Yp9wP5K$qqA/\4TYWJh56ILtDGFcC#G@MK$q$l/Bkbt+XbnYRn\1VG8JhMpG=ml!lGE6?qC6MK^F?\LC
LkGMnI 5Ba>:\9DY9S4IMK\Fu&dmDC5Sd?4Ik^4$a?wCMNc/1F5YI8?<%Ma%1JjQBCG6imMP&Fam::BZlnYw1?4
E?Je>> :?=TiE$S%+Rl>a@5i4/YSeT*ct=?L1Iy8>5N1YYS*p!W*TSh!@V4/LJ#IB8bhL1DDEebicjK@K:&SqYu
!a+VLC m$aYpE\b5wn5568TctSp#/1#GQX!PJ@4X$TXpwbM>/*Zd%56<?wNKEMt!hWLQEPtmFi<jn8$nC#HW?du
Pc<tjC QMLl?aLJ1F=jMlu=ed:1!%^6bdL#tG1bQ5Tw*Q<6:i6/JL8NLQh=kQ+Q?VLA?GFL@A!TC<PAS^4QcFi!
T5pMBk 6bdt!@a<XHhZY#X8hRuXJXucZ:>^I19!J8QEAw6h\XQVhT4#Hkb9MIIMBwQJahw98VyM*%98D6PbiudQ
lXNlKT $#c*9QQYmhu8Jq9GFqt4?@MRA&^=p!$9>X<6=&6M8:Sb&dpN$#=wc@68RcuCa/QyGeQ<9G*9R>Y&YnG+
tJQHjR c&\P#L**#$$h*/%ql&t@6J%*1S/$69XBSh#%&B6>^uSE6:X@Du*Z1nkMdSpP$:dW4R<161D:@m+4!t#$
:VLM58 5n?9a^FS64/9wnyc=!c94nZEE6Y8Mj&ja99#5Qc4e?8ZquVe>:$QG6=SL#5GP>@*>>5/^pLb=G$+NhuL
X?8IHA J1<PIbXD68@&qeT!h/<\\dT!#4=nPw:1hJ?VbeZ\44Ft+*h4!$m1Q&%6#^5wI6B**hX9D:6dd5QWS4c$
h9I^B\ QY>&6Z&>!+/l4@4GMWZd$9i&#AGd5+?FPZR8&HidM:Hi::5NY^nnjY#QY^Nnc%YHVd61/eB$X1dnShb%
n#q6NV t>Wm18:%/dFm&i+:y4!d4kF4qtY!acwH$6#uMK$j:uu1e&Z+#?qTa44unYSS?S*VBiptL#BhpY:nEyk8
P4JcD^ P4b*49MI:iPi>4cwP%N5/\M%B/4Q5u%*aSdTN%85M\#a:J*Z?q:G@4tqiqW*&ZR&5PDj4uq%H1>n4Y?/
p4anqn y1@N?np:VN8!>R5\BB41n1H@Wuia>q<Tl&qjiX:%5:L%FVB>d=8@BKd!dnaM&LJ#!l8t<p6&dWbWI45&
YjqZKW 1@&T#S<B$@bqJ+jcB!piE<YedK1n$q^dLILl&1J>J<&%Sh?6NNeY%TqynqjjyVVQm:Hk?qS%Vh4iy%*u
\EhT6# F6KV\@S=QV65&Eu$HhN?:u8d8<w19VqMbi9haew4+4B8l?=*VHuF6XqqEFpP$:aMJ+jKJeQJwZLJeHKw
6k$LF& ZDKeHB%BA!hHl!%^euVapq$PnQ98Qne^B5e8&>S&%LHLN6YjNDhthGJ5qYt85cXn5Dy>YV1@148?&BW*
9l68&b hdN%^i4P6:$6hqT^:iNeF&G\j<Nl5H@Vahw9c?jAtJTcHIa^+#<*:SKlDT9Ah6+BZ*H$e>h=>5DN#?Q+
BT9NQe :luV<VaPD5MpqhM+=t9QtCmYh$#j&Wn88#1tS>/?8#D&S<+P\?iK\<byHLdpGX8K>S*V5V?!PK\yNnc5
/Yc!kI J<X1e6lWdG>L%?iQYl\t68P<a>1?&l!t#&9?8>4t=4/4inC/?=!86$d*u%Qb88NRjSum9/66F9>hddQ+
-AqBCm 000d75f6440001202b3 Page 485 of binaries1.zip
>%d/qC :&1dbi<@nN<l+nDqFhh@Hd#VaiBhDqQi/VHqZc:9>Xp#8jdy5&b!:WQ<&L%#?NVy*nq</9V9ZG*:#H8d
>6/K!d ad>Y/R/4mwuDt8X8:Fk@LjjPad>Y>e>DiNk@d!4tu:eWe?%VZ:8c+%C@8yy:u94X%h##%Q+6y$Pm+&%%
A:Ic>H @#^6e*h6%9G&88jRNw6@u4db/bZw8%%P4:AH5y^iaV/+uF=lQ4meZtE?8J^i\T?5+VqWn8E=XI:l9/66
CY/kmB u49?aT/@buca6tWYl&qdbuYa6tW&l&qdbuia6tX=VQ6$:Y&G:X64PE#d51dD6C%4Pc!j$*J&$HJ%uHTI
<BFbwJ AKjp9::PiVAdmDl\epb/1IFT$QWP+5QJtitBEHE145<KtqV<J>EpN^4lqSS$ZaTReuLnEda:y?yB6NPN
HZ8QuJ Kql9Bb*5Fd6C#etPKHS1V9cK^n9LQlChV5/$n+4G8@E:ELXP#aty^Dt=pRt911D@JCS!a*M$NL+:&SHw
j%&au1 V6*J*6D+:tSHAD!Jj!dc/Rdw/GmuG/ED5jHplmleYp:D>YhHP+j4PwVN$*Bh%>FPQ@\RVp>?@CF?u6\A
i@=FeT uHCYij?k49bQ$#u>mRtIG%kVE^A*5Kac^JtK\?CkHIeP<PuG*+Vn8S=??wGpluSYn#ZF!w=lh@S/5tEa
\6\^&4 =GkPW+=4^&Pa69uc<Smtn4d=#/pe#Z%PniG<hmmGcb9dhJm&yT&HcX6/eln&qb&</qBth@K1<=nmMY&L
H1p+Mk 8D/Ak^jZB?w<ynnb%HqMedLljamVVR*8HQ==&4:lu/h>NjduaT>=n8E\de8aD6P?G56l&ycbHKb6thql
V%Fj%^ &ybbHKb6tZ8@=I\N>8a\:d@bHcd>6@^*6e*Lj%j:d@u9cy8Z/\PhYM*q?pAZQT8=#!EJN9uQad9j>bXc
FpVdI8 @JXeZ/uBZ>u%qd1HqX%jXTS!84/1TAN\*/&a@P*j^RdBe8<N&?4LnSpW!Xu8uTQk9Wy^YLEW&S*VCWQb
+%K8cB ?^/dA/P=#%t8Rh+@cD9X/XmK!\*<QjIN<6Zt^Bt%ZIK4:apZFL9BS$D!BdWu8PhmLb89ky\91ABhH5WP
9BqJC6 <8GauqHdSV+<$\61P>LNw&nD+i?iWjnk1<&aF^Tjdb:N>5idq:nbE#^d5!h+miHki9M>md*iZ4*E<FG>
Fb\Vcd ?b:EDt?9ZtK^jZ4jp$mn:6ZLJtlb>dJb8pD%5k*:4JhNVWY?&u^+RdH4Z*#LpJ>$6Vu\k8LNF>?!bW>\
YbCBl> 9aMLhZI9%cQw5=I<CwtL/*ZL<il=ilST=PXS>EMYn/Ij5yP6FWmSt$j^l4KV4btibT?d/Xu&5nX:4yeN
SHi#<a $/m4LbXuFLPn1&D%C+4iTX+&$/npbSQ$V9K!1j9LdjputEaq*:KB*JQqu#CRG:S<!/BSX=55#?m$J@mY
Mt%cWJ 1X9JX=5YL/k>\jj/55@/*qu&Yhj4EDc*/YSDl?i4:bAZFM?h\/N+:uT!hd#=N9^#5S=w$#<ZM@14+N+#
A:LF<i m8q*G@/=#V:4?k^S$*!%NjCCkt%Wn$KK$V\KKd!%l$uQdjk?k>Xw+tY#N#?<dAP/I%/&ATuE!\bd$5VL
m!iXhu N8$JZnb:<>:nIJKat*nbVB?<^?pLd<l:MpFtY@Q?AyFHSX*L5F?l1H?CbY=%%#LBm4Z%=FH:4G5ba4C=
^id5G: 6iqSQKE6n?IJ*n6J5!eMn$IK:=&\R/Cwq/*de:%5a5@%5mEj1Hu9lCl?d6:4mitD>!%mq5D:F4E^Z@$V
b%Xpau J6m1d>tCFMZ*#wLE%dWM=Rn$5<Pn/N<!Qa1Yii<$LNjSi#&LmVV9uabq+*t9N?A9t9hPFylw*86b9KF=
ymn*MC :&T^lic>ukWCt9hP6yS9*88Nby@%5yp6<X:QF5VN?^d5n8dtjR6m9dq=*+LIdt:i6\##DMu*ntqJ<m$#
LiX=tM LWt?h!b/J@qiN@9k9SP!RBS%9a+qe/:iP!Em4KmVdeI#XP?hJnIl1@h/CAHp/u$LF6:/&iSS!\8qJ!!k
Hm>@Ht 9tYai%+qP:!k!CKh9tZh$P4SChV%?5VM<T4J+\W%68JS6M#:6#u5CX/&ab@%55HcX?@j5H#M%j5*BEX!
WSA=\D >j=6\6yZ:>@t58h/&iD>1@em!>/<>$=aT8d19RkYmdq/:+R>9X!>F%ubQ86clmXd4u+>lEXd46+:Lc^R
TZmF8t 1q<QLXmC/6hD&B9I%c?HEQZQ%c?HEPQQ%j5*SQS#>j=6hYQ#5tH?WL%@Y/a:*4<lPy?4>&@L6MS:pVYk
6ZmXQP b>+:aitd1@em!*VHi!eeM5@X4=&Ycau*Vk84n84ZVwmG=?4YV9w@5Lt%p@+QY8LYVldw#6Z=N%6d=?4<
maNPZ$ t/L&lP^R$^Lu*!\\uc9#d#tblZH?VXE<\jp*STF^<dLBZ>VmbeQ<wSa9t?qP<dKb:lR9G&aXNj5uICyd
8m8Q&H 5&<bblW%?!ia*et?bbl:%8^:^#R1?=dl5G*N9uiGQeH*Pk=P%?S:^/^S<4%8iyc<dFnh%8SqM#%LZndM
jM!IT\ T&4!5tFGYy%@!>q5qQN9Pb6*e9+6I*mZ1@N9&VL*m@N9GRG*ZJ^@!\m9=iL<t=$h!<Z=6&^b?tZ/J!Dm
9Gty8P Wyb9GVT%VQ?Ecp@\LaNPF8jjM4LSeyt?be&i+H5HPqtej<5+FydL>L$DVT*V>#4<blqiN5^*!9T!Cb+\
!8m\5V 9G^mV@C!abXWlyeNEbe!9G#\t&X+&cb>%55GuT#D!:c5bX+&4IiKiNtY5VubpLtim@NPGSuQ8Vm9y!nc
%@H?+K +L^VL1b>+y>4=&Yeh%IWjic<Zm/tje+:KR4buNjL^dVQiThFIb9#i11?>kR9G?^p/X+&iNQT9G#Xu86q
1Jc8h6 M=%5ZndM#$4#55HHq8bqk=$5#e8GYX6yZnc^W$6iNqnQ+u$Y55N#<V+Lc1Pwj/:yyQhb^ZVT?!\MK86P
*\1nS5 l>1=K>>u5H*F?!\:wXc<#:K#b<Z:4Hw?#?Xp1*b/!@85cu4tjSdem1JP6ty/=6bp8b1i8VYb8e^e*J4M
t=m6YK uK/y/+/c:jNi#/LNJZ9b#Qb=4+eJpA$Pl?IJ*thbZLq+u%XNh:#Q1tc=9M@CJDeZ::M\VdcB9/Nt#:#Q
<6NAbw 15Pi/*6>YB6<:$^:k8>%SH&!>%pYX<:ib&E^ycmZdhpVuG\YRe+8atnLS#PLDq$uM/E:Cu8YZTVTet+X
i!*KJ: VS:F\Y5ZmdTq9Bu5HaW*#h/dYkR=i/?HAE4P*y9m@EDP*tjllEQP*tel6JP#>%pYde:ib!EWqdQ*YRlt
X6Y+<a =i^>qpYd5@hbPMtS5@hbCMuq:H$Ykuw=i=>q$id5jSbCmDq:u+W\b5:mbWNMIa8ZDja5m=eN5<E5Znda
cm1DBm 5!^iN6M?<dLb8Y99N!$Gud*j:HaT%@6NbA:t:Q%tN=*$HkjdBnq:V>bN?:#H5Zl%>y/5t@b=n+PNHb6M
%/bChT :Tn5Yjai^&Ld&Z5!m&*u=mX8>wV1WYQ#5mE:JDe9t?tbZ/qbdD6ZL=6yu@h/&JnM8Z4b^J:kbaQ6!>/d
Jp*GTP Y5R:i/?H&*y6a86R!Pc>Znj6<>:Wa69bi#%pG8d59cuF64Q*LS*4&P^>m=n6<:=F:M!*>!$+A=C#Z%El
:P$#5S +#>u9%K#PHn&K!w^ujR4NaGQ#h+:TdE&JI?mh:^*5nl+>q=Q#My=:!St=d#ZE:N!*n8JYVu9>bAZu:Q*
e5Pn*Z VwLXRjbiD?i4dBG*w&J68JINCWKYSuZ6uC^4!Hc\/#Y+4F=A9y:YALSKD&Z:?nwj%P<i^B8:uqED6P!:
F%XQS+ 6V<VFWB!Y95upjXl8jdQ+LnBDAZa+V4PGDapD<h^^8!k>>w\&\I?uNEb\?d45T\:a>n&uD59Jw:>YP1h
KK!q@y MY!cHk5>aPhN+tQ=iMcMR*dMPMcPGejeMiQa=Dl9I/?$a?BaiejA5e1PkYQXHRQH&8Ww^4HLWa^nq<P&
BTmn5I u6e8S#GPZR=Liqm:HDDqpua=5C!T6M6l^?dVLwehuE?:HHb$Q8%!&PH=6M6l^?jVLwehwE?:HM$+hntc
wXe69C ei^!\EqeuTp!DMQy/p#SGRNH*8ZAaL+/W*VG4LnALpe*nq$PMa=hDnGPZR/+Fet:HGIe8^^mJR^&PVCh
QmJ<iY pdLLkYCyqF$PLNmp:HLA:Wnb=eA$@PweqGGalF?hk#yn$IP!!+Fy?hZbn#MGPew8B<d?%XpT\=aXa>nq
tAe?Pa \IcM%F$P8DTy8^^\cFJ*Pbb^dHIkH$E^&VHIWeiPRa+/h\^>XhiPwc@cJweqB+!^e&D5n>$tIl5pn>$t
T::Q@t &yS5:DdSJtSn6+uIb5qn6+uIlqG5:Bk+hy8I9B9F&w/lGMS8E*8%elC:HBnua:iJ!B4Ka:iJN1$d8$&$
tYkp$: Th*adcIqMa#hJy49G:6N6Kuj&G$mnw\y656l^VF&t&lV\dHdSGTHKddLaRW^hy6wp<C^&$Sp6?Y=&$SL
@696NV lJm:Vi#uWlt:HFa5a:iJ*eyq:Dc^a$#Q*TdmkmdFhnp\j8h8E?FtFh9qtQc<ZR:+/dudSLlF^Za=MMPa
\4iN?: 8$&$KinedcIqX<#hJ61phP+&EY+5#>$t\tZq8h6E8Ke<h=6wW>T=&$T+wn^*t&mV%4udSE9htL6N6MTN
y@Ht4a 8h6E8BQFNnq5Cn6*t&kV&LudSJl@^ecPGee8S#cPZR/M/dudSJn%QHidcKpme:iJMNh=:ndSppjtdlN6
PAGX%l !n^*t\mVt?h8E&$TQZidCFP1&C=HNa=hD9n#8h6EHJhXdJeDa*?&ZR/M@hq&PVD&b>9q\Nlj8>*ApXjF
XP1JpC >8eliL>&8&FV>4ZdDb8\4>%8&HS>:ZdDEq#Ydnh5A4>&8+En/uu6hkNHa$9c:RcP\bc$&\$eiT%y6^5+
!14n%c HqdTdniRK1QaL5e\nq&PaS!:HCmpp*c:khIdm8%!wJlP&8$GnuPX6N5NHN$1cdedPKbX$t+*eCT4yN%8
9a&&qE IDYuyN%8+KmXa45e!#l&PXB8J?%&A<i1FN9pRE1Qat9H\L9dDS!4Ktt*G#lCXhJ8N=D&W>J8N*DM6KVh
XSYbtp d8BIcWt:*eB^1bJ&8+GVWTZ6hkMqHBVd=TmRa:edPAFX$t+*pD/p&C=HAeh8N*CwTdFhnk1P*Y+ktWm^
M>hGhZ ZR:>XdFhnw4*5h5NyB!X6N5NuDI1cdedTEI1cdedPDqW$t+*eEcwyN%8IFYyyN%8IFGyyN%8+C^R8V4!
<=P@19 hMdRX&&Zw/P9&m=HN>=hnw=**ua=BH*X4?YA^iudnBByC&Ne6&*cDQG/bjCVc=6DLdNIX$?&ddLnZQ4u
>KTbRQ =TcnNmNPwX<myM>kLSb?/B=F&QNmHC:w5nNVlNySKIjY<:c$R&&qjFHA#/8mDSGeI%d>kyZVEi6?\TB=
#4/Ry? eymenqn:C\a9$HaMZuR=D5!Mq?P\EiI+dIR+Dl5ln5NGmPPw$C#HwaPwbMhSWejWeYCEbMiBEbIhB$bI
@JSWd% hl!1+MiP$k5ty&NH/kXVn8I+MEKK+<AIKa+DI/R/Dw!R/nk/11</D9Ya^+:mC/ae%ZGw^!#NeeBnN5eB
ndqtq\ n>peB##t>Jl!iF&D^@T/Bw@yhR$i$?8cL5CK%#Wh5<Z4G4!n%#WWWjK/y8&wZ6i$HhZ4t4cniq*VhqT9
GWwWVe c!mk=uXN&%Gh4pHu1>M%/H^%8kch4$:ZwQQX/Sy$9nyhk<=Zy&9R?iy$DVyjuc=B=/9VNil<hdwGuc>P
pTi&eE %/D#%ipchQ:I&Q1<tZYctPwh8Y?G+p!h68ZI!n9Rhc1Z1iaFSWGyR$jPcMEbpTM4:+Km4bj>t\QNy!Qd
BQnGZc :$BXBuF5Nmi5!:Y5+5DypX6+RZWNX\>NQcMhb+cPHNaL11:%!Ek?WFR4FpJSIt$R&p=HL91B>6PSm*/k
aZ=pMF eny!*A>$uI+e>\Nhy?N<^AZXd^@uI\=Wybn$BF**H/hTDlRFpjkJenyP<l#wPB$uiR+Wbd=IalTC!5TG
%%b4qb Eq/%EFyP^@tyF^VL$F/hFAQn/Dk*>I^PuEe?<5BjWQnZI?Q:BWX+9w8VatLt*MXJMc$pm?^TwJCYuGRY
-AJG+q 00044fe0d3e001202b3 Page 486 of binaries1.zip
Mb<1<H R5hJbmX$uYR&l/I$!HHP/a!1=WC^HQiGmmZwH9u\B+1Cj<YlXpyTCM$w%qkJXZ&RS1k?X*#LeM4!!L+@
*YVnCj WDph8j+H19ydh6$yhkb?yPLSwi>+$YeHCuINR98y8^FdLGt^?#/#LH%^Yq*5DI=p@%!e%=E<ChX*uPt=
Hc@nuD Pp?XR5@X>!6Pj+8h1JL8u+DwwQSBKKw<?#akRmmTCNZ&Pw6adDNab9hwB!1ERqPyDi4qt>N1FFiCyi&E
+D5WF/ RqPF$H11@4&hjaDZ1GLY!L?lk4h#lLe@:?chF9y*HN4*nMLKniE@m/ndEj\/$H1c@ATeRT@<lH+/RtA9
iTqb## KFdM/?m#C%yP/=lB9cCal^<4<\8M1jm^PD>k4Dm1d#KYujqaeq%k:Qwp!RTD<qn+QMMw1*YER\&%ikcw
Gl@1pt ZdAILcenVHXB%d9MT!dkkiyui!hW?:MLwW6SckN/YZ\d5N5?F/Qn6FImhJ%Y>m*Dn9@K9tYaPR>1Gic/
VD6GBV a*@@l8LEN*>&ukbJki!lMcyH6e?P^i!BRq?ybh1V^?dIkhdV5V%!wQ%$dJAe1Ew^1M>\du%Tu/p?HN5p
K@ucj% B/yTVPwHqBtdJJ6c6YP#=EBXm5XQWCpYQ$G%JJEW1QPRTAyWi5liC5#bn+D$kYKM?@+6N44cJHmiXteW
A^V6Xm Fal<I+1Xc$tXaK9iR<&\pm&bHt%FY/49?tJqY^ySY8EYWw6!L6*m>RLuHI+\!AZ61K^\ijJRFEpG&Mk:
J:l1@/ %w59KLaRD=%@RdHBh*VhC+w69tQY?w^m5?MwuulB5X*bQb66YHdQbq8Y*dQby1W+Nl^J5$RSl+JNtpjB
@4i?1q J8JS1%p@QYy%/#$dNn8PkwwZFG#D5&HD+!mYiEHBNn\d$p1Pk1\9cLFK?b+Nt^^Z<<kZFG#V5%tq@?ub
YCZe\A 4N4@<t^Y<Z>=N8S$H?XiL!n$aZp&bPAi=SJjWN9eVJ:N6niVb:MN#8VbdI5#iVdd=E!iDcQwKGF+ReGY
R:b*NR QS8Cn$jJ\k8KVh95&bAJN:Ju5$*R+6t\:ZHqVX=R5BZQl8#MWV\d5nPQaw<9KLLtnyKIF^S5%dMliHtW
d#TXPa P:!kCK=Y#+be8qE>G#bGn$KTF>S8XQB55B4D&^JWme#D&^LLBS*iqqk8/QC&BEWH<9C&BGWL<9C&BIWQ
T1Ra\1 <9C&^QJGl:eqqne/9C*y5B4D&=IP1#G<LdH1B<QdE55^Hh/YhN5mdaSmI>FLdJWTyyeaT?$<9eTaV8jy
M^cPLF Ji/&MWwT&>awTY!dw!R^W1AtTa\p1EpTX\6ei#apRp%9QXEC^e4APlS5*uymGbVuIDbI:K%u6!%Wd#$S
e?9GSQ qMuVY$?EZ@L$%6N1R$^9QT%@hu44cSWny4iiCCZp/c$uRmy=i86y8ddVY$<5^jJe^IbA94iiCJ+w/6q5
49RA^n c>Xd#\+L5:#%6EwW!%6Q!<6h*uycZ8:!%6Q1W!^9QdHnw1luk>%bthm\ciP6J*Ie<@LY$!yeLG<>4eLF
>nDqdX <6aVtaq=ii8JQEThluw&yFa6d#&^TM#LY$@LGF:iiq4G<QLY$&ypLG<>pjNuq#a+FM@%%6M!lyi*u5ni
eQw?%A W>T^IZ<9L&>LpK&u1Gi#LTS9T/#&^9K&BGGQ9L\65b#n=Y$Je8WW>Y!\Je9dE8VB=iX6mXZ9YN/YIAmk
uYZ!Qa T\LQBq8!9C%B@y1muk&&bHqdayW?q4eq1E1iq:eq1EGiq:eq1Dmiq:eq1MqjE9W9d6FL%L@hNpS>G*B^
kqMA8A Z1L?6W%Y/q>5LCZ1Z\Ed>c>69%L@C6mwj\X5%L<C&cl@eahSw9:FQWcJ?lh*GTZ1Z>^uqKl@5dGW1H?u
94A\W: dTh/6tuQ>Y!+#Tl=Y+$/KCX=Y+*/6\lbilSTiF8N&4aqiX8N1Y@J*qcndt*J*qcnbp4J*qcnVt*J*qcn
aY:9qJ Kt*J*qbnpq8!6>Ya=Jd5dVZKdJd5dVY14yV5dVY1#ycemY%le>c#+i/n:G$%c5!Y:G$%m5!Y:G$%/4cW
p%F4BJ :G$%m5iY:G$%14tW:G$%y4+qi%5>dIQb&?ylY<#iX1Qcc<uiX1P!c<uiXmQwX4K*%bn/q8^6>dCLPd&6
SV?SXm S5*Yp4&6Su*Yp4&6Su*^p4$6RVHYp4$6\TT*bG>LMMp6&h5TdI?X:G$Jy4+qi%8C1Y<=VuS>kY&dq*>d
:CFuBG %ctZZ:Tyq*nTF?$$L4qdZ!Bwe6pt@AL=>Sh#<\Xi@<ZMjFq8%p*XYhC/?i4^:6$@*h&?6Z@e94p:ZW/:
bZPdL/ uV<pPY9:95Wuju@*@9dy:8*Nw@/C!*cQw#=jN9$w*HC>?e*>u*>+9Q9t@8u>*jP@d@4N%@jjjc?@9:*@
$twcap <@*V:j8dn@h@@uD:yH@/iPwZ=dNuIHNuQZ@Qd1#>?+i*Q:<<J?idj@n\=9Hu:*HB><*6l:e*u>&>@Hw/
$j1%uP 1w5<Q/mqh9Qy6>?ddQutt&@9d9:?>8Q>t+<*D?>8Q5Y*eH99>>@?jD411Nk*1<=hemSG8ju$+ePQh^>A
iwdQlc y$LeZby!PmwjjhuSEcXI9RF^8jtul:@iQD*ejQ@+<HV*=8ut?^>i9:>@e@PZ8=<@*4^:jQn8=8u&P%\5
%lIk9Y 4d%==DYiH>LWWD+@BI*@/l?@89u+<*jj*V$>/kN8*@@=+jH?/h99Qy:G<eL\9XJ$VtVj1#hj@@Z&?=6*
udVkN5 >?@9XPnHt^@9H=>?$Ib@h@jh\?QQKB1>6SyZ$1tI*>=?@*V*iQQ%*b5jqED:@8:<y1!@@?YH>^@8Ht>j
5<JPK\ *:?@j:4Z6*e5!d<eN@Qt\>%j*>>@?M9N4^HEG6Fj@l=BtS#>=XQ<yWh@?R!L=l4>=S?\CA#@<l55#eKu
H4hDdJ @TPYWYEL@kq@Cb@&PSbD+X@?P=aTwcV@A*>b$X??\BR>@M8ZtE/Hdj56y4:lh*::\*i1Q&@599XR+N>l
&\#LV! Hl5&<T9<JZ#w@#!XFHjT:@GZ5C8?^m\pdMHZQ*@*?8G>6VD<=nj\<YEL@^qiJH#t9<Dml!*<X%nupPjj
pbh>yk <JhR*u?H=R&j>kj<=iXyZ/pJPl&qmjSZ:Mtq+%jeMDiQZ=GZ$I>j??pw<ci@+11p1\?Q$%F?Wu@FD9<X
D1npIS :#4%!*D>T1*d1di4Z*H#ul!@+4K4w%Za%F>HM*C6T4:/eD<hJ%:$X%#Te@XZdF6i@ZYinkmn@wydS++&
&!Wn$J 1!pj>TDTy++4<T88<dn/Fh56^/N$GuEe\6BjWV4<cAa8/e&H9BZF9Mj^K&yuH*&q+?RIqH^%$%AF?ulW
hQnmj: \^ZLX*<6y*ZX#\**ZX#>6b&Paci@>6P^JNSjeXuE$a!G?^WPmjTD/=wZt^GZ&iqZN:aLpa@?5P&HK&4d
VuGG/C h&nH>:66Rl/QQ%iQQ%VSC5jQ1?hl1?SKN:8hm#%p5SQH@cw>hkd@iANY5!Mj*^i4u*FIc*Wb4pcGXjP+
*KPb=9 iwNmhbRPic#P%yW/mFW\8@w:cnShj><1@%*^Y$*F+@6Y!@NKW/&Y+%Z:EW9y/iy*1<B:<CG1$65ln%WW
HF9cwB q1M@ec#q!EQS*?%K?19uIY=&Ja?q5@jn:%lVHbWD941=Q^%e>@iuY1=?8#>hNiV?^>QXc:u@CcedL4@?
8R:lJ8 iLy1$w@*y&Nqk%@9V@qK\l@^+H#X^J>Pq<JA9@4X/hZhl:eQ4@@#Xcu&TQ##q:@W#**#<@h*y$<?9hYJ
Z%*B?^ &5Pj<d*dQ/8uQ+4a@i/HJ:YMCyYnYN$**&JPcNCLIJ@hjZ\!+KXB9@9?:5P9*>l</a?ue:><<t@@@wjV
KeN*Q/ l^@i9:@/<S@QqF<?9NXt@QQH8\9j*tkdcbhGj**/=B<j9upA:@:$@+1%qN%TkTj9V%CN?V<?+Zuh<Q\M
n\!F** 8!IyjEdb8k:V^hQjjZQ:Y9@j\:8V#lijhL:+<Si9Q9u%/bpRZjHd8=?ipEb:iZiQh#>CY!/9/9bS9*dX
IapKh^ \XieQ?p$@SWTY9YF9E1Z@*AXtw/Ph/@?=kYBndi@jLlkh8dja>l<hblX?*Ga%i#!GK!j\&\Z#GEniJ+h
+w*%Nt T>8^<#$pHq9$8Y=H8^%tS#q*VC^6*&GY#i5\8+4XaXb>%YF&jH#Hl8*l:6keLN8$I$<iY@R?JpwcPt#b
1JKEQI <SiQCdX9&VZ\Hy9E5R4*!:I/c\+L*8?!c1\iG<^lPaeit@\<wZiJTl?hMM6I*VG^T8$:NwV$GThZC&GL
*?EXIK Pecm>+EVpMR:M:$QuCapPYcl>+FViM^STTh^K5*#qtK^+B&4Nl6*tQq^l%qt8<jwubhcB#?9pT$yhudV
:^jnCy a>KaX\KPRZyX:Qyi\wK&wMAwajVPXhyGHM*PuumM?<?8Gmh5MIhqhZ65Mc@X=Zca#i+hb6hQP5!PV*w5
LhWcYH pNim=n9YA>&aNwHh5YZ#TIjb*M>n\6?%nH1QVZ=iI^$9!:KkQhcbR%n@:Bw/n+*KHHde&&E#/AQd8jPa
c!LRyZ iI/c:Bmi^&amLJN8KLcEMK9==#A:MiG^pRq4qZpd/WbN9ZFd4GTF^<mG%VRK6>tP/V9Mn5e/dQF*t>Yh
%TJly+ h%ljnFq&m5Mt&SjpM\Ra?R1WYAm\!Xltnq=TkAWeNiCwAWeLPH4A$RMPCVkp+Bk$*4DnG&DC&GIhq$Vn
6A%SQ: A:i4F<KEu6jP^<\hb48TP*a?p81^!Xl8nJWWaAFHDVl1\NECD46*^GNpE%8^4L\hp$Fn9+u6ei@a5I4Q
p^C+uL Hq8M6e/auSV^&GBMAk+JPEdAMRPPGZC5kGM^^$#MMZMPMPcayRba\FEDnlb\6ICnB^\>+JCAa\ReI?Ca
BVFipb AeeMPBb#&LZ8lDHH!nZAtGPXkMQmPB/n?XBdLZliD==ukZ/Hne4aJF@S%1J=W$?J=wVhd54#YKF=8&LC
/N*M?= YKX%T4eLnV!G?mwip<KaZZQ5MC9B+4BX8M&LdH5@X*B#tEY&HXbID*yt?>I##$@:?W+wl\uFD^SdnFu=
ant^e9 Fw<N^uni*5>H&S*Gc!9%QIY^TuEGZTEt^8^?Lw>N^kd=bMYE5Vt+#a6mGd&!4i8Xdb%PI&k5KLaac#\Y
nCX9:I K1@F8!XjiW\/a+QHRtZj*i9m5hBTaw#nEayN^m1QlXcF5ebnwjZGtQBacEm5<Fk\B69p5V<1#RX$i5Z>
Dm@mj/ QCc6ZjyaPeAwn1SV5^ykm:HMHLQpAA5+c5BSA++YeQTAw\eeEuBI\DECnlq\#IBnBS!LPXbmnyX#kDHH
uj</iR KnZAAw+ceLTAw\WeQiDwAaeEHIE?4$H4WH$cQW?C&LDa4dpi5<wYD8Q%1mRLk#85XecR$85^!a^bS4:H
#I\Kp/ JtP<bqiM=9^!9lHbadp^Xtn6Iqbe*YPNattTPbal=*KKHl8M<hyA#9utDq5W<=B#tS!HbXy@TCtb5W4^
AyHw*u A<WYa=%mBSK5i/RI4cPpnMdaFG:#wqm8%ES4YKp=MYdXS#\&GYNdJ=X6uXlNP+>JbY#\YKlYj5=lm<hC
pbK?b> ZdT9IXchl4DBYPG^$Gyn4QFacL$\Jn\Yk9mL6Mu>*Cd*e?P+tR!l?b?M\i>nLJyV!$\q\Cbn8VFYWwAF
#FMb=n HDZk1AFHC#l/\NEDDkp+knE#B<&9bM+WaMLaKkFGe^ybHB?ZqXPAMejm8di5EuDWkKP^9K8#nm?l5aYq
^:#55J 9i?@YSQbMP%tYl@y<y^<H5yHbMItQ&>Mj6=M6I=TdDGYP&MqB>lk4AaeNiBwAWeQPH4AIRGHBB\n+JkB
RN8jjI B<@ZbnBjt<F<dRd#6SuM%&a\Z=9BjG$G<:Wb#NhtMF?d\Z^64p:#A@$a&WTwPGE>$Z^N5eFa4kG&GC8h
Nh\8a* 5Sy\%ICnBS\6+PkBl\ReEuCMkGMEHFFj4SJk=GiYyMbaVkHGHMJ#B5WCnly\NJbZ8q?9+waF4%jABu%P
@KTp4+ ly>n+l+S**?+ITZS<!dF\nM1$RcaMEc^eGCV5Sb\>ICnB^\TeEnAMRIP<uuAlDH!ieAtai##eQNNCnDt
SQFmAN aJ?HG*b<uA5*dhH:Sbp6^t4u::dkiY$\%t8ALebwH\L*tiWAG+#NGtCL5iZu!4l>&e>QeY&Qn+HmquG@
-AqS+c 000a8225e92001202b3 Page 487 of binaries1.zip
PE<H/5 uqGM+lc+W=*iY%9N#<%\wW%nVFKACYPnBFnAMWqQG?<hA/P^wC9EEtCVMb4#b?uD^?GA?ZX6D8b/1DZk
WNcNHH =@KwCEB/1nN?$n@FBtP5j!P^@w%EMWdFS5A^mGQ&TVw=P+>#^WnZ%KM$^uIKMNJu:V:TwbWwJ1$tk8aq
aVyLlj PLu4%?!K%S^kk:FYA&\^%kMPCVkp+Bl?4kh5MVa:a!5H&CC5yByk#FEwS$tjXtuM/I\@MTcp8>1TGtCL
\pM1ib MhyVWw#&qIA^^/SaC:DFYP/MqS^kk:HGddF4h#\tjw?k+BD?aM#uBbX!Q4jwMIwFAjL#NS\8<8@ZDl\^
EGSeNu S98lyXVcD\ZthRkyYb$^<q9A@D51nZWZ/Xh?H$e^my<YZWX=Y/Ia=dAAt+SJcw#qFGDCYCpBFuDWkKMF
juK#\G HC*k/AFHD#mpWj@JTAEtnLH?+SCd:@9PMW6MpRbn%a>y^ekjKWd?CNlmnQ^Sph#<8lGa6^8KhV?tFcP>
b^j@1E nnLKyL+jNZqjykPj<w\Ww^^D^YwN5MXa/+#%HGABl\ReEuCMkGMGHBRVXG\%\uyKATcM=SJk#KE9&L?n
MlFIc$ mS%d\mnQ4cCkcYhMGF5q\CblPVZGekw\=5mqBFnAWRPPFuC$kIQ6\e^5D&ct@HdFSkw\aY#/@S+hHauj
6*K\4J l&S?H%JbD1p5l:RTaN^Z$4t9SAIPCVkG>=WM:m8b*Fi!!K?8Yeu?Kib#ITw8R?/Epj%DC1ujL%NM@Q8w
tl>#t\ 5E+BNlpnPT1TlAPMPYw1AeaeNVNHLTuAAw+ceNTAw\WeQiDwAah+QRW&GcNa9YIW6\AtnC*tcCuV?=*D
Zat8F& #^$4k4tM$b=TVT6%^tn?B&\\Xt1ABS\%+GkBS\5+i5DSA\+JPEdAMRKPGZDMkGQ=6WG%c=wbG+#S&Tyk
e<=?*W m:ETeNTAk?L<FjebL<KpMVd>ilDaaI#!V/5FLn#YW&e5=\Bnnq=1kAWeqKPyGMZqkR*G^M<QKpw4M<j$
!Swe9# ebXc#ui5P/#/jccKLjZM&GTM#5AwSuqp\IT^GZDMkGM^^@pKJ+<^^:tKnMh<:y6myVFGiX4AlDHKqXTM
q6>NE# =8l1^KiQ!TlG=%N1Gi\@!tD@wi+6Bbk\^9=D5aCnBS\>+Plp&<8k6aa8b4yjm!5&cE!na8\kdKWAI%=e
AGpQ:p I^6kp:HMHHcVBtHCGN9:8mluA8XqTX@1w9MG8A*Z4\PACYP$DkA&GcQ#nTlWt\JMGKQ>jSR1>Y6V*L:K
@#M6Sa #?9V4/PALebYJ$^wj^DaaC#ZAGMPKRFHDVk1>=>RjlN8l$$B^8>I&Ba4FuCMkGMGHDQkYAHHaw/StGQp
:$caL1 FGDMMRy#nP4n/LnJqPadPl8u>>E4^WYBLeawZ<CPFW*GBtPW*+qTwGV9?/K#$wnkMc@PpVyl!?iK+&lR
Y4R<DZ D4DBYK+B6lk4AWeNPG4ARZF$aI5^m1QnJ5+eaIP^Rjwm\4bJl\LbYBHKKeJNna$^!mpCJw^SVlE\<tWm
ElGqLA 6L?Kt^>VkAqnFAMF^l\nMejIyG91pu$PB54VWd<MZYyW^tm8ktHJYE+BJw!XEtABS\$+G6tDaiYuQWdu
E$!?1d %IFN^wS<LdatmFhjB@Zyw6^G^S4*</I<dtCDMay6Ak5+S5A^A++beFCPA#C!uSNy#IVqHGCD5WL9jQbF
l6HZ+i 6kS:lwW\uq9w:KW^XqPACYP6BFnA$RMPwjpGaqYMWc$NSBqw4GIbV^lY<wVq#lnqM\AdnFH<HqnA$RKP
\wLBqF HuD$kEMCDkp+S5A^A+=Je:*XPAcAMlmbMD1*W>imZC9FPN/Ei&$ca<LaLAE&GX5?y>it&RHtjW1#6A:G
*:KMNd JtN$h1/q*u#?8GLm>@$Ww*&@quleAl8ETcwB6lnLudGTA!#k1AFH>jPIlwS1^mnZFMim9a%w8hC<ZVFc
KMPL41 t?KiWK<HPFqXAt\!S4uhmyG8AR5+b5A^A\:YNjZ/j9+CVBnLnjykWL+<:4+enFGNCtCDMh4dB4aac=&^
DeabH1 HuB$H+QH@b1pc\WH^kt4yQiwBeLj:aM^&9MH6lkdRX5wJ1naIy%EWDwVSuPGlqeylI$eaIP^YRN5MWdu
M#C6pt uX9NhN=b5b!w#hyXJJ8\deIpjVI&GS8NMayjASQGX5C^tGMp=llWc\ma>&?6FbcnFhcDXtd\Zay:6%dJ
$8nS$+ =\EdnNH<FBl#%BJ\%ICnBl\6+GkBS\<+^P?hNH8blI$caI5^&uhSnPc^4W*c^<Hy%e+a:ce$%C6knQbV
GL9^a$ kA*GcD<FYMAl*Fi<#\TM^t>R4\DaI9&dm*^Fd%R*SVHc?%TM+5ZA/J*n4G<unQKMkA*twHw!DhMZ=1B>
l#p54< #6b:w9GtGNtZ*8p5utK$ltmIq^VCcJ:hMQWS\tmjBNlpn6/aR&k8wJk\B?YjYuk!E$d=ha4^9E:P6:96
KMeB46 YGi@4>Mt5kiI1#BG<Z8pMyE>FYF@Lpm8JW#IHmm&tIQY9\l*F8ckQD^W?/J=p\\/S\?M=6tI1&VGcH#I
!E:\W/ KH:@TI$G#+6HwbmHaw*twkQF^\mne:&KChp4^en8nnI1e>C=\Ic<KycD+pMI$bLh%bWG/h<ap*RI^^Gy
DTu@?R LbN><yl$V6QK+yC<5=APKdcak<+pKWc^AtCVPTm9SVElHS1Vc58ldA@y$JmW#/Z8mPIHmm*!FdNSjR6a
t$tICi YH=iw>^j^ZlM#%cVMEa?YX$b4W$uBkllhKbc5eZ6E/1qy&+\$dymD8::Pcn?qYKV?&4Rj4^mhE+PtZR$
ZEtb8y S%iMPYct6S4KKSCHL8taw&dtwDQ>m4ZKHBSdX+^1?CqG?$LA8J@ucM\^YR<t#:N^#yA=KCit+b\leT#K
>$$*@1 b&nBPWQF&HiD6nIt@L\Y<LJQSmqY\m4XK%CM#6\1S4X5eZ!GdPLmPnGKhXyjL5:6S6bIb+=StGNM=1D#
Ewc%4q Fa4S*na\5qi+ZmR#Sn+Q5VumcHVtF6lkn61aw!ZtwJ^K^TnZFNlpD5wNWI#6%YynMAjQ9SXd#LHIS1!i
$Y6d$^ !E?nQAllm&&&cmR@V^Y\MWa&B/HITSnQ\^Rd#MH#MMWYe@A<DLFT=8B=YBA4:ZaGuVF9e#4T\^Jnj9#m
>ciReZ /FhuDnwdBG\\B?*Hh/6e^yk\B=&@:EGN:w:6Y8ck?DnK19qaT#h9/#E?:>^SLI#c*Cu@C6mpNui1d>FS
ll#RnN VCw^NymnX?dwm#qwZ%I^P6<NdDLHbB*1m*YwL>alTc^DpqmHJLMPTYEhp5I/^PiaFY85R>Jal@n5CDDY
+@9Gj1 ISHYIb/HhSV9<D1WE?ZZKTb?D$$^16pF#N6mqMn#6lma6<WhKjuE1@>X^kb^bKw@CY\^B?WbKhaKe%Di
hKpVVl P54/NicR^B^W!$I^PlMHdDEHubu1PhP<GNkpnpJ::^*ZluVG!EbpJBRTStjtWZcR>A4ZwSjCbDBGheYB
qG>u** DYwLu:j98E\:M!ap:/D>MtCVPEby#EFu!IEN=tmXPcniytJW5\Fb8V!&lp#twL*nn64=#DGFPck8i\@1
#BWZ!5 /iQWVmiPtjthe\$DqH\p@/Hik>=9+j1P9jB=CMYw#lk\H<NVdHdtyjW95EEeqi4/KWa=cMBa651?WdHJ
jlCA:% HP\dWdPjPhk*q51?Eie=taN>I&+@aR:&ncY!d$TbMibk*%kc?<dCe@=iPKck5+lK@4LM^6?hXN5L&KK&
uRqK$j VM4:Wt!Y\6lp*6YIa%E>D&CDPFc8ldFFHI9Pu/MMcYaP!9u5RZ*?n94<#NF=HC*lecS#hPaaQI:Y=HG$
e+$MSV Jw?nSdGSZnq9GBnb==yw*$YXut4wIqYTPS4Xd%iMcqpwS9q/\MnuIVGZiYW^B?Y4aAcetaN>GddGmKP#
XYQt$t L/5>/K9P91^&>tXIcYMP>tW+L5+e:M6\B#^#5C<L/6<Dt<#B9k#%:!hnbP91wn$kqLiq<hE+J/an>*\R
:Ab98+ Xtt?%9k?B<Xwu^Qaak/11h&S:MIehC?AaqTLYnE/?\yMtGMX=qmp8:ltlVl$A6$bI>%FAk^^bM4hB$d4
@&Kqi% qJad&bjYK:?nV4p#mkuL!#XZkLG<jdK<uM5EnPYX^QJKbutFeqe:/kb$^mb#WE^RMawJAl9MRVFBK/@M
X!/TP< HBRV:Nl<ak/KCTyG=$$::pd\:/ku1m?ALXej\?6alBZG!Ch*JFaSX5qG>F#JJ@hM>Y&BLickQHQF1C+5
/La4qt 5MpehIhH^\TcPTluY#HKPRFGQ4pZH18>WG$CFTJ^?/S\H\nq=C9YcJ&5GQujLuVjmYJCe*uFJuQRPX#F
lpRu<a btIP1pP9&K4M5en8>pH:Y+yS4BRa&X$%JYS*?/A#:5CEPXyln4caw@P:HJKbk&wR+$a>$mFBXTjCiC/9
>9Wq%8 uwh5nuAhj*l85ntKpe&SRut$\Bb#%M+ehG<c5Mpe6HiuGP&dAlQtwH%VaI5=bteP11MEnG^aWQ6aMa+%
%dBLd= !<mh5W1^EStN=S&h=S&h=S*C<k=liehkijt?GGA5:/A#4Sm?NA@DpSZmtJu<ktIW/=NbPuNRDl1\\S^5
>5NJ4W \^Sd#ME&DHX@taN6GP4?V5IwX^KtlP#LKJRH4^nHTuXGR#=9XF/HwtbNIw#Zwa1S#^8X%/GDc&ECt<#B
Z>6nTB />BSiS$/8GaDVGhlDq/Hn544$MF%8+HSjG%W1p@hB>j8\FWR*JdJMX4paFVGFuN\nHbMn6E1^41^PEc4
RtLijP 5%m!:aQ4ZmyY!Qew6ymnh8dk&N^anj6$>ewehN+FtDAH%Y&$/#Yaa#dtwNyW\Mkj\R^%^mk?NBQqY&BZ
Vk&e/y KDHG9phu\LTjMl99!W$h?wW^u%jXJ>h&AMb6=uyL8P1D=5?+@wM+P5?jhTYWtIQu#:Q#@Ft^^S\<j==e
>!?#mZ k^lZpbA9R+pWc58pGm/KWe%9aLV@NyG5+dFFh&pAw@tXDqZcj%MG<6PKCZQRtSC:AwW=G89L/1\91:P?
=aG9Vp LKwD4lmQLY$!&Se%ESRHZq\ZRnHKJ\SG6lNZpQt&LFR?Iw^!IQ9m&n9AcE/#?B=baDTuYa**K%cnP=8A
1CpTZq $b^tNcyDwBnqCkEV=1D:y+F^Z#Y1DctabPckP>h\JW%qD14S*XHQuDpw>^Ia#YpRRmcPVteckJF9ZNnb
u/ZI^I aG\^B>YPWc^q=8B=$?1>MRjXBRMt#MH^wSZEl%aRH%yBjGkF<cEX^IhYEB>cRZ^wBjGlFeTHXlAjYpF<
Ayj5/G cAZ^wSZEl%aRH%yBjGkF<cEX^IiYWM=a^@aCe!\i=!Q^PB?<j:SG=uE?Cw@#WZmen<4njDRi=/Q^PB?h
N4km:I ^@uwQM/=uk!$lej=GD#P^?S^#uhcKEa=a/m/##w$E?9R#K^D5:AP#eI/NC94EN>#wXnuMV$:n?p=8P@u
QdYERb +L/jM=Bn5S!1c5VB=@IXK/^D/tcIk<<Ew/\Gn?uF/$dF&Mc8\Pi6\Pe6m6YL:ZeRS4p8a4i&E$d^F:Hd
58h!LQ iStd#EF#aN\\LM^BNlbaIMeM=Fk5S$+5B>?h1XllPVLXkFCM/t$1StMc&GRP1wWPdDAH%YG^5muEWcli
#4Q?Ve EI+RNiIwXBNBMd4@TBLZ<WJyq5ReFB<C6ymD>m?BDickGlDIpBQm1Ju%1ldY1%yb4&yn9cw$q^KWmGIP
+$mJYI 816Y4BIGadR?B#cJw%G6EtBCHI%<N<4hNPJwXCNW5X/bk<:PTiK#e&KuQRmnQFBBTtyqdBJHL&p\J5VS
SPlpAu K+@#*ume><:n9A8Q<#=+uQjJ+^\#ew>J+uGP+pCEbha4Kc^ZWqt9yLFiTYP>EtG>EtG>p5q/JbQ%Tld4
S*>h>^ %Wm5X!P#Zw*Ci1ZDk#lGa:$cujX1CP9XGK^Za:BineX/NSd4%W!5X#P#Z5*Ci5X*emuYYK>tb:&c\uw%
Qu&Bk* B?9XHK^Ze:JiaZH95bXa4%bt9iK:9=F^#H&/KH>DDTLq6At88SDC1Had16j=&BI\H%5Thc8Nu6jwDk>k
1CGG/I k#kc:W5CY<^Bb&q^6YhtDnyL1^mh&%GM#6IC+*=yqHeIdDEH=S&mNH%tD5w:^HYp@I+/=S$CE?LkuH^k
-AB+FZ 00075e20283001202b3 Page 488 of binaries1.zip
N/Bi$u p#pw:^Ab/yp=KP<RqXp1e%DiwYKWh/ka=S$Ct<^Bi=YKWh+lMCEP#5pH6wmDe@IXw=^<aIM=KChjMe4J
euWPBq B!dMRVu=\Cb#WE+?11%u=lmDPYn9Ti!CIeIYn@PSiJ!Q^PPe/:k1Xumen<LnjFRi=/Q!PB?N^@uwQM=%
$Ti+e* *e$e\8N<DB:u9H?8&PS^4868=qk<#tjmeV+Vn@Pbib#Q\8N<Fl:ujPiydi<Q\tlQYDGi<?hJPa8C<5ZM
F<>GhJ 5Ty#<J\jF!yq^tnPu^jQ?jP1NBjIm?j<mm*t+Dt@awM=B58^SmAH^W>S5bZtNCZSuSGK$j%$m6GiHDCT
&9MInL w!T/T\naaA/K%!qG<V4FKF+HdDLHT5^B6a4XTmbcE=hM8d1KWe^IMawbKWd*wKLcX&aP16GNNJVEHLM\
cVlVd6 B<YMeJMp4apXw:q!KXTjRVGKGaqhmpRa^a\R*SZtENc4Mqm9!tT>KlR#R6yNba:Fe6VEe6VMe6VCe6VK
+R>:u* e6VGeqTPGbW1LEjqtFGyHDQTq9D+1B\#\upD+tkeM!1Nct&kWkuN?R8jHXcMa$cFc@8nwt^tDw+bIiYJ
\JNi\J PYak^&I=itI=pQBIYGE=WJma5Mb!ICPVMMylAdcak*KKkFH51\nq9APn&FeS!8NYnQK+Fc5<QuSJ^^!N
$HqqbL ^+h$Hl<mQD=p<QkR>l>FA9<^A9<^A9<^M58lT?#MGM5S4P%^MSS#<N1?DGE=k4Y>#yRDPZl64!cM^*t\
#%Ga\Y 6m?#<DkQ%9cF>^\W+:X>+V$H*NdG++Q*HKV\HZ%TiM>B!pw<QunQASmQD>=#AMdnk@eekQH++D$HyC#!
!TwGiW ?FmB@%n5Q&1\=+C!Qb$\*uQAyWPLMN=#1MGik:ww<5pw5m?EWT$+ReH%!SnN=iGmCtE><@Qw9kVF1Pc!
cY^*n5 amM^^^DtwF1h\Cb#$Q$c1FSMc*c+XiLRcZFnnNd5Fhca5F1aw$:tcI$=P4<n/eIeXNhi4Hk=acM#B>ZH
%J^VBl BDcak?/^p/191DBGc@c1!&=lnNd5Pu*y#FE#e>VBHFV@H6lmD41:RVEy#CGVPcmY9GJ$6k4aaA/1<RcM
kcFCKZ %8^%$y%Dm6E=aYC$bqi6wnX:uZS*A#Bln5dnjDai=:Q#PJ@C+*\Kn@M=iJ#Q!iN<Vl:uKEDEGI@#qZme
N?EblV 4<#nuP@>Ww#!:<YKd^QY!KhWJN+RSutdmqF8tTAM#B!L%qa6WW+HMJ146ER=Ham8pY@EqVuMRVphkyA$
d#wQd% e@VCHHTH1tInpGMGep!YI>Q>G5Bw#wXTc<TS1h/ta4W\B=&VW+#PB\AV=1D#1+y^LKklRERa^+JcwZ4@
&^@L>9 muE51QEhXa4StSyBIYdtwF\/RYqT=1C:ykXqw=mD<4MXY/^ZcwcIk??qWK!\ZuG>L<X+@:hX*9>6qjh@
Aj+Zcq pZdIHL#@&!49@:dK?:?6<j/9a1^Znjh@WeCaPB49@?45kQYKc&W4^98@ni?9SaXR%19G?:?6<@=9/=u%
na1@Ci 1tjYK#+ZDa#%1njY1>=b4*Bcl4DBi6Wu/%Xj4FiT&F=Jbu5q9EdEeZdmpMd&TumNmHPp#MF4SJ\nbR:i
P>$5*V @&&eE\mM>Y4\GqFHDP9XKC#HKC#H1C!HVyGaw$@tpMae9Q>4lWMJ+@%j%J$tn5u:9:m&tVlt+jE^K+?Q
cJ$9Y< &Zl<#M:na\1Qn!p<Q6R6MMeM=An<S:CZ$IK>BJ*B<j5I>lJc5JiAww4?e!mm+V@ZK<iYP6>yC+^$Euh*
Epl:n/ FeJ+L>1KIlDG<e=iii/IIkdWqpb=t+wXYyQ$^4F%HIb9lQHe6ni18ciPl*QXeQCaQ>jI#&kQ$B\hl+Ky
:kn1A1 :#9Xi%X5eX5pe><L#\p:bn1EhX19&kFM\uk96jPhhhIH=%Ek#b#/aDVYTV:@1^nX5SEeYCMhG4!H&!jX
niTWi= LqiM+&a+1EV6C>bCjjJiER/!$Hh%!p>>5PkiT5GlC*yH1:Qi4?B>eI$b*NBCMRyJhCbPpHnIYBN?H5iY
<SkeQ4 pPDE&CId1?/Z=BC8aTBI9KG&bN:nR\LCIw#Pq\p&dIt*$QqR\aaba#\@^eaGj+:1jA1C$9!=!i$4uD<y
t>Hjc\ qi4%KWdu1BSnQ+$kHuFW*88%+ANlm*!FL8AwqwFFCjXL1<#S/K!YaJLEGMeKyHFeV#4u1\mj1SE+C&w#
JEk*R< %$nB>aP5p*#QMp=/pK<RbNMS^uqG/H#?HPhAAmR=kntleG$H@Sn:Hy%m<9ka9N?DM@QW=5H=tDLGbI^#
QKBt@q 6&S!umZP4yP<\V\M^&Iap?B#QD?RPZp54MV9a\ZnuP9?+mwDtyjw%L5\^95G8A4H6\WlXTGM=!w+*5Ma
Ey+X!T %hqY4NQcT6YAjA?8t9d!+5yaiq:PNQaS*tYMe*yHb98H%F4ttC^9=nMe8p#lQqBd#BnQZ*B*A*?P:tuA
Q=Nb^< NSI5d?G<Ph!:Ti&4QLbG4h\HqheRPkRdj+:*<kij=<RN\?S4B>eBq<HuL%E8k?dAPL:F&JnM!&65ZB6P
TSVyNN jhDy@nLFc9Bh14GQMl&$Jl:B96DwuPM\lQjjaMIaC>1CFV>lXI>Y5WF#:/FLQ>K4aJ>p1PIV^&Cdk&$I
^H?XM% iye1HL&nRjWi#D!V9DP\PbQ8a<aJ^eIa%VmHN&LbJ8<6w4aDj*i^@m*iI^%B#9bAWZ#CP8*6/JTj=5Cw
V&J?QC uiB=J>?unyMFuV@H?!R#Wc%&XGYmijHp?uCC1!4we+Z1ARD#iwXwn8hR4Ht@mqPj#&MlZ&GdD*%/9L%@
Ge&Nab j@j+/yi@jQZJ%@j@/?/p5:u//yQQQ:^:PCuF/jiuX=@<@8HlTZEMej9><<@??M9dP>\cQPj6dWu6>h8m
+Aq$dR W=6*/%%:<#1@8*8d*4*:%T>q9u$n/@c%#85SAM&9!*lV^>*hiD6\HPd8X@@^/qi@i9Z^/jd^/cjH8*i9
$#eGG\ +Dn1iQY*j@5Q9@9NK%A@9Q=Qdbd!jjy+h@6$@@Dl5>8u8>Qjjjdj%E8kS^M!*X4>^c6Q9uy<iQ9Dt:9H
#bLkiK $>@>1R:S@^6@W9F?nS>9<PMSQ^:\+#X?*PLHE*/e<PM#@LnHn+?ZQ@#yqRH9L#@8L5?^:%V<8MGQlB@=
lw/CT/ <wh*F/4n\*>/>c<Zmk@+<jd!wd<c4a4\#j*Vi^Z8@5QV+<QN/+iH9@#mYi+Hqiw*n:jj*Z%=?^iX5N@$
CEBNDK t@JF#4j/>!<j*kbhw1:&F>1#y%h*H>/mC$9BiD=/<=uy<\>9:*:Tl*^&>@Hy>MhV6tmH96=Q@8*j@*D/
Mj&y6P <MQ:>!ie*dB@@Ih?//9d^:5QykW9Y9HX+>&QJ%R6j9:>$+ej>AQy6HGjQ*/<Tj9M$H@>=9=SihXh6ii9
TL6AJu j*GL*<>6@j*&ENPPhM1uX/c%1YC#V1j\P9X+>?y9=PWQc6C*VD6:FtIjL*?q9ZJ>%E9MN?NS/jKj^<1L
+A>V1H n>?\Gu!8%8C:p:EiaM>^tl*4ATaBNkI5+knpcIEeLRha$L+Y!Q5eM>1^RI+Y!NECPXwkS\9p/IEeQbCn
^=65iT B*L$RI+i!NEDPZwkS\@pGEFdc5AlkS\TjFeCPTTRR!KPRA+J=JBADkuil\V9a\S!nPB=Qjy8IMeI=BmB
/TIV&Q HCPRa$ReRj@NmCPRh\d9a$dQC?TaRX6t$Fe#pGMG@ViD>1*we$Fj4WCPFem^AnqY$Fe4+tA=Z84E:J<L
!Ea*A% ?tC6+L5y\HKAqRAL?tZN+HM>\AI=T6TYFtCBHDu+dk:p!IEe8Rba\J5DPZIkS^+BF9SLD8Rw$j5N9q5C
QShw+$ PWwkS\upKIEeke>:mTQ6YNTYRI:Au>ecQC@\$#Z\?#Y\:dXGekV>%!JhC?RN@HpN@HpN@HpN@HpN@HpN
<mIdM@ @HpN@Hq6Wb<GjS@+<>wn*pDi\J@Z\J@Z\CjZaH=RA*>ii>T?1#/\Yi$^/>^!K@>j%qM&p#+9j@/9X%hL
Wtp$W! /86?t%:Qh/t@q6h9*:=?e>h:8!%9c**#ynScZTHl4n?949:L@?>@@^6RT\ECFAMWAAIACAD#XG$qln\M
%5@&j+ RQ+8AAAAX\IALAAAAAAAAAAAAAAAyIEAAAAAa&^ybY=$e!>pcZN4L&%la!>\et>1bYN$e!>DcZBwbZJR
5X<qFh et>nLuB!cm=mcY=RT\ECFAMWAAIACAD#XG$qR1*P:/5eAACALkEALRAAAAAAAAAAAAAAyIFIL\AAa&^y
@#Fhdj bY=$e!>pcZN4L&%la!>\et>1bYN$e!>HbZN$aY^$WHJ9a!=\etw8atq8WE5BAlRDFAACAAkA>FS6JeW#
biG@DH Ri5/#AAAADpHAC\AAAAAAAAAAAAAAKTBQp\AAGN5cYX8hHM9bGq#c!>6aYM9eHJ9ctXnhHM9WEhRbGq#
^^:&>Q c$F\eC=\etw8atq8WE5BAlRDFAACAAkA>FS6JZJ6C1>yH\AAkD\BAC$AAAAAAAAAAAAAAKTB\lkBAGN5
^>4Yy9 cYX8hHM9bGq#c!>6aYM9eHJ9ctXnhHM9WEhRbGq#c$STXqI8eHJ1LtJydqBLARIWA^RAAkAIAQSWdTXW
V#uFM4 aKcD=l\AAAA8ARA6AAAAAAAAAAAAAACpkZa+ARBndGqqduS#L&Sye&59dYFnL*B!d&yqa*S#L%BlhGNw
EZ<j4p bZNRet>nLuB!cm=mcY=RT\ECFAMWAAIACAD%XG$q*EWM*qbBBAAA/ReAK\AAAAAAAAAAAAAAyIGuXREA
NT!4X^ a&^ybY=$e!>pcZN4L&%la!>!bZN9hZJnbZM9WEhRSGq#c!=\eG>mLtJydqBLARIWA^RAAkAIAQXWdTZ@
yuY41^ SVD49laAAIBHAAA4AAAAAAAAAAAAAACpkWcZBRBndGqqduS#L&Sye&59dYFnL*Jqe&>%etNqe!>RS%BE
JK/dyt cZN4LuJ#etM8atq8WE5BAlRDFAACAAkA>XS6Jbd<wCl4CRAAkB\AADAAAAAAAAAAAAAAAKTBVc+FAGN5
u!YQVk cYX8hHM9bGq#c!>6aYM9etX#d*X!a&X#L%BHWESye&6EbYJ%b!=\eG>mLtJydqBLARIWA^RAAkAIAQbW
PhyG>+ dTWVuq5FZ\WAAAALAAA^AAAAAAAAAAAAAACpkRc+BRBndGqqduS#L&Sye&59dYFnL*N9hZJnbT>NiWN%
Eb:e!N e*S9dWNTW*SleuS%eC=McYI8atq8WE5BAlRDFAACAAkAYXX6JiF4ndC@EkAAkDWAADIAAAAAAAAAAAAA
1P+%&K AKTB6L$FAGN5cYX8hHM9eGh\L&%la!>RS%BFhYS9etFRdHXuTY+9WEhRWG^%b&q8LuJ#etM8atq8WE5B
VJZRY6 AlRDFAACAAkAY%X6JaZPXkX9D\AAkDIAAEIAAAAAAAAAAAAAAKTB\>AFAGN5cYX8hHM9eGh\L&%la!>R
!E+$L= S%BFhYS9etFRdHXuTY+9SZXpd*JlRXBJW*X\eG>!hC>qdZNpetq&bT=!e*JnLtJydqBLARIWA^RAAkAI
!D!TF$ AGJXdTWKV/6mqE<AAAB:A\A^AAAAAAAAAAAAAACpkbLkBRBndGqqduS#L*BueC>6aYM9WEhRSZXpd*Jl
:<XLQW WG^%b$q8L%BHWHB5hYhydm=\etw8atq8WE5BAlRDFAACAAkAaqX6JW>9<H?\HkAAkE+BADWAAAAAAAAA
d!G/Y4 AAAAAKTBhVAGAGN5cYX8hHM9eGh\L&%la!>RS%BFhYS9etFRdHXuTY+9WEhReG^%b&q8W*S%am=\etw8
%^?D+d atq8WE5BAlRDFAACAAkAb%X6JXbDX*itW\AAANpDACpAAAAAAAAAAAAAAKTBiE<GAGN5cYX8hHM9eGh\
SY=q&b L&%la!>RS%BlbG%ydm>RS%BlbG%ydm=\etw8atq8WE5BAlRDFAACAAkAb%X6JbL@keADNAEAALEBADRA
m=t6QV AAAAAAAAAAAAAKTBbcMGAGN5cYX8hHM9eGh\L&%la!>RS%BlbG%ydm>!bZN9hZJnbZM9WEhRaYS6cY+8
hicbP? eHB9am=mcY=RT\ECFAMWAAIACABuXY$qZhVQi5EaAAAARAAANAAAAAAAAAAAAAAAyIG/%\eAa&^ybY=$
-Ah=Yj 0012a154dd9001202b3 Page 489 of binaries1.zip
hRFi=l e!>\b*A9dYFnL%BHWGFpdYq8L*Jqe&>%etNqe!>RS%BlbG%ydm=!e*JnLtJydqBLARIWA^RAAkAIAGqX
*++4H* dTZpCC8+?q\AAABBA\A^AAAAAAAAAAAAAACpke*\B\BndGqqduS#L*BueC>6aYM9WEhRa&^ybY=$VGqm
il18E< L%BHWGN5cYX8hE^yam=\etw8atq8WE5BAlRDFAACAAkAc%X6JZjH&/w9jRMAAPREADkAAAAAAAAAAAAA
deXHbm AKTBFp+IAGN5cYX8hHM9eGh\L&%la!>RS%BndGqqduSMcYI9e&>%etNqL%BHWFN\dGF#cEJVLuJ#etM8
bQiAY< atq8WE5BAlRDFAACAAkAc%X6JhV<bN?RKRAAAFIAAD$AAAAAAAAAAAAAAKTBt<5LAGN5cYX8hHM9eGh\
bSMFZC L&%la!>RS%BndGqqduSMcYI9e&>%etNqL%BHWFN\dGF#cEN!bYSyhHM8euN!a!=mcY=RT\ECFAMWAAIA
hVE>>@ CAB5XY$q5Y4!k\S=A\AA=ARAPkAAAAAAAAAAAAAAyIGG>R5Aa&^ybY=$e!>\b*A9dYFnL%BHWGN5cYX8
I4HT#8 hE^yam>#d*X!a&W9WEhRW*B5aZNwSuJqbT=!e*JnLtJydqBLARIWA^RAAkAIAG^XdTWH+5wyNGwDAIDd
%VK?1b BAA+AAAAAAAAAAAAAACpkiJ8D\BndGqqduS#L*BueC>6aYM9WEhRa&^ybY=$VGqmL*N9hZJnbT>RS%BV
lkmI^n eG^le&lRWC=!e*JnLtJydqBLARIWA^RAAkAIAG^XdTZLTpVNW^kAAABZAAA=AAAAAAAAAAAAAACpkY#b
CVCB$c EkBndGqqduS#L*BueC>6aYM9WEhRa&^ybY=$VGqmL*N9hZJnbT>RS%BndGqqduSMcYI8eHB9am=mcY=R
Am>6dK T\ECFAMWAAIACAB6XY$qTN\4I$eNAkAAmARAPRAAAAAAAAAAAAAAyIEY<lIAa&^ybY=$e!>\b*A9dYFn
WFMik^ L%BHWGN5cYX8hE^yam>#d*X!a&W9WEhRa&^ybY=$VGqmLuJ#etM8atq8WE5BAlRDFAACAAkAeFX6Jd/l
!8Abc= C<\JARAAAAIAADkAAAAAAAAAARAAAKTB6Q<WAGN5cYX8hHM9eGh\L&%la!>RS%Bnd&=$bZl$dYX8hT>n
cNKaa9 d&SqL%BHWENNWG^%b&q8LuJ#etM8atq8WE5BAlRDFAACAAkAeXX6JjI!EIX+K\AAkLABADkAAAAAAAAA
<Xw\I@ AAAAAKTBE\EXAGN5cYX8hHM9eGh\L&%la!>RS%Bnd&=$bZl$dYX8hT>RS%Bnd&=$bZl$dYX8hXBRR!=\
5FMIIc etw8atq8WE5BAlRDFAACAAkAhFX6JVG5qm6ZC\AAAE+AADkAAAAAAAAAAAAAAKTB+T\XAGN5cYX8hHM9
=4t+@B eGh\L&%la!>RS%BqdYFydGX!L%Jqe&>%etNqe!>RS%BqdYFydGX!LuB\d&I8atq8WE5BAlRDFAACAAkA
jZp<18 hFX6JX<9Cai*D\AAkCkAADkAAAAAAAAAAAAAAKTBnnkXAGN5cYX8hHM9eGh\L&%la!>RS%BqdYFydGX!
H:XKtB L%Jqe&>%etNqe!>RS%BqdYFydGX!LuJ#etM8atq8WE5BAlRDFAACAAkAhXX6JV%XHD&uX\AAADADAC$A
AGLlw1 AAAAAAAAAAAAAKTBt$kXAGN5cYX8hHM9eGh\L&%la!>RS%BqdYFydGX!L%BHWGX6aYq5bZI8eHJ1LtJy
yEikV! dqBLARIWA^RAAkAIAHhXdTWT#h^T:wRAAIDLBAAuAAAAAAAAAAAAAACpka&kFRBndGqqduS#L*BueC>6
A!%L$% aYM9WEhRc&X=e!>RS%B4bZq#LuB!cm=mcY=RT\ECFAMWAAIACAB=XY$q:Q>WuQJFAAAA:AAALAAAAAAA
4Y#p9C AAABAAAAyIHAJSaAa&^ybY=$e!>\b*A9dYFnL%BHWG6qiZM9e*JnL%BHWE6qiZM8eHB9am=mcY=RT\EC
bmLb=n FAMWAAIACAB/XY$qi?8H+%W5ARCARkIALAAAAAAAAAAAAAAAyIH<c^aAa&^ybY=$e!>\b*A9dYFnL%BH
eBN+6+ WG6qiZM9e*JnL%BHWE6qiZM8euN!a!=mcY=RT\ECFAMWAAIACAB<XY$qZ1FFM@AwAACAl\EAPAAAAAAA
n!VM@> AAAAAAAAyIGdtBeAa&^ybY=$e!>\b*A9dYFnL%BHWG%qduW9WEhRdYX8hTBNSXNRL%BHWG%qduXNSXNR
P^9\AK LuB!cm=mcY=RT\ECFAMWAAIACACCXY$q=jhLJZaCAACABRAAM\AAAAAAAAAAAAAAyIHl\SeAa&^ybY=$
hq>NtV e!>\b*A9dYFnL%BHWG%qduW9WtX#d*X!a&X#L$NRS%B6bY=%LuB\d&I8atq8WE5BAlRDFAACAAkAk%X6
R=Ak=> Jh5X^8LND\AAADRAADMAAAAAAAAAAAAAAKTB1MRZAGN5cYX8hHM9eGh\L&%la!>RS%B6bY=%L%Jqe&>%
jnJ8&P etNqe!>DWEhRdYX8hT=!e*JnLtJydqBLARIWA^RAAkAIAINXdTW5!/GnYyRAAAB^B\AuAAAAAAAAAAAA
JB:$4R AACpkedWF\BndGqqduS#L*BueC>6aYM9WEhRdYX8hT>RS%B6bY=%LuB!cm=mcY=RT\ECFAMWAAIACACq
:e5N\S XY$qlGwHRb1:B\AA6A5AMAAAAAAAAAAAAAAAyIFqcSkAa&^ybY=$e!>\b*A9dYFnL&q8e*SldG\9bG>n
Klld8< e!>JduS!d!B$d!BDeuq\hG<8atq8WE5FBkAAAAApACRAlA$AAE$qIAAAAH--

-A5@d9 000b29b06fc001202b4 Page 1 of binaries2.zip
T=!E@G WE5DBBRAAkAIAIbXdTYN>Qd1CYWAAACNA\AyAAAAa&^ybY=$e!>\b*A9dYFnL%BHWHS9d&^#L%BHWHS9
nqBh4i d&^#LuB!cm=mcY:6jRiAHLZ%6&d*i4H9D8MPHGA\aDDXaE##?a1^<htH#<ctt9Zi&q:::udb8\PdcknF
eh!RPi hJ98lCT$JH!B$EKHlJdCu\AlqJCREEJCimCENCCF:@&pN#QcM4M/hnE&N+KjyhG<$&1pJ?qJV*wTNS$#
8Vk#k% P@wVmi/?!euWTnF+%>:ipYyiNK9Xe1QCq=\P:<=un:uqu8bjje@nD<<??<p#lInTV?NQlLB&EiG?b$Y+
#ZwZLD @?>CnFyHej?&Rt/m#at8&KJIKlXQyBw:WwtX5Ym@GFK8SInT!PSV+$pSPB>*#K!P^6qNS#WJ!+A+dEqa
R?\IBl Lt$w4eky*kwKjyMWjIuS*@t:EHWnXWZ=GE8B/n$^+NjQVPiYKj>lj/G%*1wMucbS%Z:MHAV<N=V=L/n>
jjbQVJ wQeyS8>V<:F!pDaRYlQ&HPL<batn4P?EbwZHCyKSF%$k4Jatm9$1+Y8EY\u@n*AV+T8E4^N8I>^P8JH?
c:8TMp iBV=6=A@t9^9pF>B1CRR8%nXFHeHkcSi<R>I#aT:CHeV:mF<p*A9+V:C#aVjE@=Aj#iG@D<T@pVaRLmC
%W=yTP eCZlK5KqlQYE1\uZEK+qZEJ@M+L<!<ujt9#4!Cii5WwJbaS!m66IiI@\N<LuCX<kZE@+I8FLlC<VdmBe
D6:Jt: SumL<B9/8=Hp@=d\P<ILlB<SZmT<SHmY<EQC!+SZCD<t@ID?yyH<=<uju9^Z!c<n%BMcCF6S*E<I@!N<
l:iaH1 SQky+VZC#\k@J:^P?AZlDeJ#*FdRW?=AIKc%\5#!GHTHEaaV$C^S#9R:ku=H$P<IKu<^nuAT%*CKRGWl
WdWet* 1C\E<wC!Rnul?%B@1D81N+F!S%tN=aacW4MZ&j=&Ii^K&I$\mdA#aTJlh<IilMtEuRkHEQwI+\qw+JS*
Mqi8J/ 5TMB4Y\9\6/EjRn:E9anVCBMIcC<>mh5R>mY5B$BbhqCcCY$EYaTbtDCSDmeMI5\t\B?:TSMJS^CPJS\
#ia=^E BGEP=uCE8aS=lA:8YI+pHEcaV#mRMI%\EPFk\wtECGEyIWw+kdCE$EYIEbaSnmepCAPEBaTVCWiny!a5
tlmI6^ J/\k^Atae/+maBb+HKGHeC!lq:CReBSlEYE^AhNKtnPKM\quEXaV$NY6^ZTTeA:lFKwY%M&y=KN?Q$e?
b$5l?G ?PF>\kiED?pb9HE8+X*CZ\uuEe+uZEDA#QNC\pYEm\q4CL<p9Eq@l@4/FiHZlEeIn^K?Sjk&+RHC\+VH
qZkWC6 CI<VumDeV*?D8u1IjNVZp?TDJ@>N?A@l9@RM@u!K<E@C9\njIZ!ZkGu#>\qQE@/Q<A#lReKjCY@V*/H8
l4>j!F *!H<ljAyCReY<c^F9DL&TMZK>N^#@<@8@%uQ@iV%@I#DNND8SR$qyAbhWWwwI=RVKkmHEA+qHEcaVtkm
d\Q5W# NBNcCFlWcCQMJB^PtEXaVDmceA#lYMJ^lPMJJ^BPJERJZaSqlPYEFaR+aSYlt>BLTBBPI1RIjaRB\5tE
$H6Gcq %aR%lFMJy^FPJ=^BPJN\FtE6+Y#CPaV#Ci5IF^I8Iq^M8IS\KiE!\8YE>aRNlK5I6^H8JN^F8J6\D?Fi
cy5y>W \u&El\mQEy+nQE@+IiEF\w8Eq\p@J:^B?BZld+T@E@+BAabA=YyBtCF^$cK!6cl5LTyZ1=I\pnCcMIa\
TAd/+V nnCi5A%lY<J&lJ$IP^MtEual:E4audAHaVJld<I?lQ$JB^APJqB>YXSjF6YZSjXqWZ%bM\lWZ^dXq$X%
%Mk/Xy bXFhYXSZ%t#CHEI:aT:qtjIp1knXlByCLYEaaVmlnqBQcCB5SSlB&JyA*!BGEikd^FkCjaik:^D$HaK?
%BdX8\ R#RT6mj5S=lCPNBTjSZG1\iXJGZNDRq4CuZWaWIJwa^RV1kkXBKcCDMI#aRYRm6lJ8F\\m#CdMISlDtE
CL?J6S h5J^lPMJJ^CYEE+pSAlLCX&E=aRXlDllJYEXwb9RR$kRpwRWwa<\RDmbeAylDiFW\8tEM\luE5+muEQ+
*hbcyR HPFe\utE<\pZENaSLmFeS4me5J/\kZAF+W4CXaT4CheR4mX<pZA*+V:C@aRHCA<THma<RumM<CVlSeJL
5m?dwM lJeJ4^BiJj!W<CdlLeL9CP<VQmB<TGXL=YqSiXyWumS<pq^D1CdWEwaS^lG&IY^LcCS5V>mB5CNlAtE*
Gba<yB \mVC:wR>CJMJi^Q&Ii^L&J>\APEk\5EE1m?L/58m?4Kw9m!1L/8NRHXtWZ%bXF<Y%bhF>YXSjeu/u$jw
6bQ4a\ IB^Jicd<Ce1j1CFRHkZqWR\u%BH1CR&E4RknCF5VSlJGEWaV^lLwi<S+Au&VwG<T&^Hwt\S>p=lKtEa+
6M//D@ JKVGYMlMD+YpwGAhcV?HyhBkhhy<Y1LtIDRGY!VnYVS?nB*Dji4Nau:mqF$Q11$<w:c!64J!##$dt:yw
t6k1tZ #LSwuLSwnLRTLA@RGGZ6y5p/k5h<i@#jq5j%Dp%8IDuEw4bm:iHKeNcBT1/V<6$:LF?Y5N\\p&YGI#Wb
AaLqB* m&SEc+PTBT!TRT&TRT&TRc&4qX^kZeN!Ew*jF5tp%8iWnG\hwtSTKc6iy8ST!MlT%q&9bFwLj$>!ldY#
FNDLk> J6<?#DI8yY<h#QL6I$4G6bay8Sdn4S#Z*&P==A6cZ*AE!:N&ue^VW^*4jEl^b$Hm#Q/*%BJFtCB8<c:M
y8Z:?W pyNtC</hy4L<dTFe451a*>V\DH8p4YI+QBdym1Ykcak6m/@YJat$>NVc1?*Wi:j+\?4J55Jl:i@6LLl=
yD&D@# ijqq@q>Y5=VNQSeEmGK<:>y:&Qj9!&nt+Qj?m%1dQ*I#!M@%Yy<#^!A@tBh8=Q#QMe1@/wjkX!kX$II:
BY\6n! MwqKk\aX8E^ZTaKD*X95Q@YIn=NEeut!9ctna\/+i@E9C<@TaiTel?#qNZ5JVuXh$+8%AFnbHp56n#ZP
@:dB/h G?n@?LtYyaAP5cSq#5#F$XZ^LtlPF*X&NJQw^P9LqyQ@nAZI\BZtqm#y/+?pQqWq6WZn5d$?X6l*jJwj
1M\Ppp W^H\Wp=H+&i?46L6Cm95k1RP1lmhan:P$#yNJYiHDQ@TY\k9e$VBhGt^uIZThJq#uF$$LdGqA<6#Cb/D
ZqumHh q#uVt%EPthQmDyZE+QbIhF=uI>XL+=^+:/yaK8DZ\A$q>#GF6<?T^6CcNm&^hPY$kBiGPB><$4J<5Rba
uV:I4j /G+69*WH/\cFMY@!&8RNHl<e/HG&jD%P&!dX%@mJjXtV$w^F^=Dw$GT9Ii%GVG!i%>I/5ZFmT>PCJ9I/
ZR+VMl bnW9tDmpJpZBTn$9w>Xye$M=B@4a!&kXt&kb4cLa!&nB86buhq*L&9LZ6d\G66#4GWZXwRZdIRc%HiKy
T=5M<k #<cYmE&+:TGhl\i%4wcHR+NFZ?>F*/*5u1Cnw:q^F#t$::4bLjwGeynG*%=:FRa*ebjFYXJmV?Khnn=p
8p>+Tk >?uBLCmaBY&1NTihl?&hdlaNM@5J*6kSyie+>%mTIc<uj/Wika%n1!CJqQKI<HtK/NayZpn:yE4/KP4/
yT@^/L I5pphZ\FjyT\%t/cPa&%65lX?%uR/Qw5>ul$i^u!SD1B:QG5+BBZhk/Ce%8YcLdiD8$jql*Gwk8EiQ=I
qw<K%* Kp9FJ#Z6pck>t%4lQiStMJ8XQbBd&nDM4+KCF*6d4+hT+RP$kk@Ya#/4/#Gj8MBlbe?D*A&p^i6tk*d:
E$Pqw# eY$XyHh@aqJw/>Cd+VP%^y@i+5hwj:KjM/FSy^H6dmK1%jFytuB\4XAd#iG?Kh\NanlyY5qluI#qeS!u
nJmFAD Y?$VEjLWHI?q%qV*e!&emlnGab^AHM=luBK5+#B&Vhh#GKj>GnmM$/=deSkuJ$b\?L>CuTDFy?JE+pkP
MWSP+H +*VuKA:n%PbwDl@Q=aI\Vp8P=VBPSw#nME+X5+a&lFPC&*AaJ^K*bipKbdphl^8FP8tBME=LdM>luMVe
ayD!:% kePuCuZ/FGGeqJnAab^8*IuDPHt:M+j^ZV!hKpG?iCh+CW/P<EyECW=6:5blLFJP+nBPd8#Pab^\*wQD
TDm1J\ PDW<teM+8eHN5BV%8SiH<j6:e^kuY@jlME/h:59lM=mjEMaJ=mpe^5uJ@VtMW<kHeBkuL1j!im#1=$AP
GDYF>E I\*i8XGG$/5HeSmulR@tME/8HMLl4\5%B$L+B$KhuEZ+#<JSbyTD%=w+nP?i\YGe9PWJVVutQ!$e^kuW
aMhY/L Xk:nqHpdl*EchCcH\Y?H1#BYd?XyH+SS6:M=nN@l#VkX^*AdR@kWwW:?Iw\h@uM=nJQt<#n<9FAullDG
yE^Qbn TTB8^=Ywq@peBm>$ell=YeBlcJ\YelnVwKM+DB=d^GG$*<We^kuZw#tMW:dHeBku\a>X+T1$miM+nQw<
Y4Ra9D u5QI%\peS96h\tGe/n&S\#l=FiE\&8>TD4@MjR*C?Ma8Fc=GP+y^GG%4GajBI/^N1$bb58^and?Le^mu
Y?5!W: phtcXnXPJK*mMC\ChHMaJ*%:PI^V:d$e^pukBI9>/GQ+hG<N&k&jX1<B4@Gi\l1WbS?Heh1cl<EcuJac
^B+b&a +QD>Ry*ASln>=Cpejq8wW>VwC6Gu48E\99hWDp@q@lhl<MLyHEabuMFl?%R&\9ni5#n<DcFPb!PMW<=u
e^dcLZ e^n>!Vpel6YD#/u\MQVX=*Iajh6=HEcbu<>l<PaFHEab4?M\j9NCD8NE&pWeS68=tMM+1Z$Jl&GS+FIP
Dbu4p@ @$GwW&kIj!nWcVRMA^kV%uMa@ikGD1Mj8wLDcNNZelk<jlYH\V6Ze^n%eA&H%@EalnDc\uWelnYJnS^?
RVTdlZ RK&H!QB#c4FElq>ZK!p!nNN6Z%SldMcRJ\pSSn@#bR/nDG@kMQ4ZG#tM@8ptD1QN*e^l<Nw6HEd=jaZD
K8@9H? wQ$1l*G/:t5eBm@h!tGM8j?Q\=nMj%&F/#EG*5bl=PF&D1MQ?\cH$Rj\CcF/<Q/hHEc>*eXl=Q%8DtN5
&XS/Km 8wjDQ&I=AGGMk@h!GKj>:%QlBw#l>*Ma@hWDHEc@@mCH$baj+nD/nIe=nHd&CIjBy+>!GHZ?LR/nDL:N
R5X8Kc acV>GIh^k9>^D5PK^SMeS46:p5P\VQCWCt?Fj9W:HMaa@q$Pa#^pR*ydaZ#+QwjS:#:NajS=@<hlqPE#
ay@Vw5 HEd:?\GH\d@Qell%?^!HWVdQe@kbq1WR@4t:DLeX<9\nDpMGiJFZY>FH9eSl!Be9e^l6=BWPI<<@=nD/
>?uVS/ 1%e=nD:+J^^GH@bVD1Mh9<bl6ItjeSk<<uMPw?^j=#C??^eeSly9eBk<!R6>I&B%+W$X*lw!&1<+DDuq
cBJ5F! %^^G8*mL\^m:j5Nl>QG@=VD/!>>^GQ*R:#tMN9$HD6@FMmnC1Le@eSnj<YePR<==Y+XHR8b>l<QI&%<+
%RL=YV DLu5ZR=D^9p4l#F89<hl>MN@+#D//d>#GH*aQ#mMh9qQDwQZ@5Xl%MQ:HEaiQ%BldPCCyR\blu#/d\/n
lb6/FY 4Q:DaelH@?W\=I9@eSn%?^GHX:pm@/m#*HZLWXewc!$!jBNddWH+dtYXSwcjWNbybQkqq8MS@nXd1$H+
j54*^> :<1cD6^w61wn\+*K8w+M:<>YhlB8b&5kCC>uT!AIu<YYPSDi!Fa=EL=NYciS+eiWqSwb@yG!XmQDd:LX
JNPW=5 GwVja!5:EPZL&NIP\tQbWk:C8:BFIITd&CwR\5i!XS?EE&#FBPHL&JIJ\4i!FSKEH&Z4Ikn@nC&MIQ\Z
a9SK5w u8ek@F?&6wQy^Em&8IQ\d5ymnk^QXba<A9eJ8=jW?I//RX&l:qCZ1BQWpZWB/$BIQ4Cw@:M8Wu$5%CnY
CeKPSw K1W>5ckj5k:k>95?#&E@WG*dAy>Vu&9SjMtmia>Fa+a%YjZb+Dj\w4T!NF#^E*kN@C@dSmjL&<?^nH!5
5yGdE! Gk?5e>SaaF6t5yd!9Q$wNX?&TD/#cI!&L8E=M!\=Zc4tthc^QK@=B<@h*&R4VTSnYmT*Y:CMhSQQR?8=
-A/<9? 000706d6a0c001202b4 Page 2 of binaries2.zip
$CM!Da Z&#k@5/&\QS4:65!LVGNWjNnc+D:!l%=*nyP#a?65*u884NcK:BT<wT@uN@JPj$L19?*L8N=GK\kZM:#
Yu8?*1 kC=q%ecCJTG$V*y9$ZhaJ:H5bX5+Y1:GjC5m$1\b+aT*hcJ\4S4BW5N<1MiF59nR!@J>ptWlT6hc4iR^
S$Fq>W K<1!#D%K94hw*LScYd+u8h/mPcB%KM6B>P$Y!XAY!jZY+W1&5&c^uH?Kp856tm6bZW186&a4tX=cRKB^
\8kYtY Ami=LcTJQuG8p886iT#VQ<b!+\Kid$Eq6=Dq1T<L%\LVA$185yI5F>*M<6Rh\4ZKSGPlSiqa^DQYIybb
ecB=Fp :%V!9$ZjbT%Y<4>ek#qZbF6n?wb\LVKSnG6S?X6H5?^%G<9&JG6c^@C/SA9LwdbFLLdKJj5+&#JZlZC5
8@&ZPc eqpViP$B:YWu+Xnk58kd4dNE8mY8Kd!PMIjZASc!#HWI#/WQ=du#**tPi##LBH>pXTB+aB?i==/w^kTM
&KRSim F>IC&nDX=<9^IK#GKYpl4yI*P+jT4dZJei<uc8!Wa/b6Ka*pEi5$q9??^:Lj>%uG@C4Lq:i!HQk$!=m\
<hlTAn VLYe=dWuiC&AiM1CpubZq4>?#HLdL%kGi$QcdBdY:pwPp$Q:%*lh+CAqA%lW%lcF4XN=da=paY5m!+l9
<uyiWE K=uBA6>S?XyuCNe1%u=19e*/Ey</IJ/#mG<5YQqAH+y?<n1YT#=Wi8QAI5wkLKJ<Cnyjc\ylK8FA\mGE
b<Jb*p R\uNlBbCK/GNMJN\PGEY+Rlat!C$E?aT=lE/&ILGLV\*@cw:F!*AqX4B4luXRIMhFkYhIN+WG&@$*YPt
k\*G*m @E$Du9$%HmT/%R^Y\W#j=L5G\##T/i<H6$t8qK$MP1t:^+R\WEJG%9auWeRB>8/n*Q8V>An@@WqIK/!$
@+qq6b L!YEMpI=waJRTckK1^ZqGpI6aSllPKGPWE>wIG^FGEHatnCTMIw\tnCYMI+\u4ANaX9ChwV6CV5R1FMX
1F*b14 %KtKk\kHE/lnFW&EGRV1aAX%5II/YEGh1/DPXXDuKtaV1IMX%MEK/tDFeaVnCTeRqlBPJERIT\qhlPYE
XP@4qu FRR1M:GT5I4RViklJAlJRw4RS^kkuE\+ldCGeC4lhMIblDP^?ah\L8E<\9tEC\n4CBeTLmJeSqlQ&EC+
5^^pZc kuAq+T4C%aS4CNeT4k54p$S*Ei+n*E>+kQAk+YHCI+VHCE<SZmT<SHmb<A4lXeJQCY<T*mL<n9A?+RQC
iF=&8M l%TQXGeY%bqFhYbSuXqWb^dXtWZ%bXF>YXRHFyY@%Wmk<4h&JE\k:EVatdA:aR@CbMKilL$I?^L&K?ak
unTGyL TJkQE*IqNPtn=lwmlGE5uFBGKChWECwJXaS1Rk&lqnCMMJ^RS/kuNBC&Iw\kdF&mX1NGEeaR^lLGEeaV
@uNn6B 6mF5T&kpdE@an#CFeABlKtEc+SDCwaVDCNMJVaStRk8lqhBGtEp+uDCL5Jl\NPEa\4GE+\nHE$+kuEmI
etaW4! E4wI!\nLCT5IeeI1Rnilq=AkuESIEjwIA+TVCc5Jc\muEp+nuE++k*At+T#CY5LblHMI=^QYET+pZET+
4Vi\Y^ tHAJ+XLCbaVLCi5JG\ljJ>^B8JN\F?F8\neJ>=aw5%1QEu=AiJd\HPF=\k8EF\t9EX+u@JL\X<J:lL>S
@tZ9TG HXL>YXS@XktB/6CmP4TwDm&1Q+91#/L/5Kk?LKwQm?4Cw41\1C/5:RlWH>dPlItEZRm:Euan:EGaVNmV
?y*?bA 5A>lZ\LXqWX%bXE>YXSQF6YVSjXpWV%bM\lWX^dXp$Z%bFEhYXSH%t#CEVAXStlZbk4q=QBGXmLeZG!B
Hc>HEi dNaehFi4&yVj#j/b:F@Gjw@!4h*b*+Q>Tu/jaD@J@qZ5y>n9a@>1@49D&h?Q+\ja9*Lt@IWh>9lTPTi?
RcCJ/= NBXJ^YMaTM9=L@buj!@?m/u5H<n?\XwKFdZa6/?uW5XWB:F@KH\$c$:%AH/i!e>q@G#u6=&j>?Hu1h19
S$Ii@= qhe1E!Rb9&b^cXmeS+9#n8&+@N!tu5XV@D!V*^@B#*9#<@+>ZW5Y>uaqQlNu5kwVN4JhlbN1+NLLPVm5
#6#$FQ \C++5l$eFiJJSd=NnQ4ptmi?tKM>9puucDp/Qc6EKl*<Du=kPLNuYwPeYHHCu:h$p/F14@@:>#V@c5bH
6tRmEp H>$<KYCjIi8?EM4tm\?IL=w@?tn>=KB+l1!Ll4Q+\nyR<eWjb\VFM&Vh>TZbjDFX<eZ*!+QmGdL8lXJh
!:$VSF DFZn!M6*H@QqH*@$$i?1k8Ibwk=eMH:?9HpL>Mk!daEqXN&WVHdHw=H?iAIdP+d#Ip+%?:Z5%@Dm#CH<
A:6+$Q ZMj?Zi^9^j:Y:I>pj^V:w>pj!@++>5h4icp8:a@$4eImn:$EX5@?@i\Qa@<S>8*entD@ajad&H>MT:&1
8&h\yE 4HNFJBZDdyI\9?cXK/8Du?@V!K*K?dG?^EA111?WmSL&!>m*+!9aj+D>B>t9%FK5D!iZabwR$8Ic\n$S
ZS$/1a :Jpb\@Vd5Q<W=<^iM=9Qjmi@*=d>:hm*9&kH>4hu?4u<@CL:L:H@M9895Q<1$^@B##>q@$*&*?L*<@n=
MEu5h8 h@\<l**?jt8Y>t%dqWWVQV&T1?#59e@?B?^@1JGZXHWpVwtqP4wn9blDl4XZw/1ITYPSXKR*GuN=%N1V
S5\4B5 @eu5e&Fani!*5e?Fa9F!y6ZK@w:5V&D@WQb*au>uLR8n/=9cG&j%JL6nQdHij48%qDIq6^K4tj$Y>8&e
DAYPwc %tpynY*w:P@KV5ym$t$$$uEq#apW96n?\mqedp*5u<#?DQd=>\Z@94mPjj=m\i\piPqX#GJ@N1jQ4X#a
8:G&Z@ dMDXK<=u9=*>$=ui:mW&5u<1?&9aQ+:>Di!9b@<c>5>k@\4&%:F@QQ5u5H<S?/i\j!H:T>k@pj$I?$9b
!E<Fy! :&L@A9cZe::*=ih4&V?Z@jQaZ/FX\9nKlj*^:um@Yu/&?:Y#PCX:<V9P@51&aQE@%?K@*XEe8WpY@?j\
lcZZ\q <:^<m@?9?#9imaa8/A&%$$8G*?dhZkn@R?&$p*&E+B%*54>\6*cM*wF*hCI<pZiqIu\A:==C8IX*hmK<
P9dCEe RP%MqiGq9QMV+RV95lY<+=6QDw&?YP&+qiH4iie6\q>V8%6q?J8<!^ZlJ*tZ1?Ch+H^!cQSQiBey\4>T
lQJNti 8:6p?C?<I\#l@/lhaZBnK6V8MBpiw*cJ!jAE*m&G<P/<a\#l1YwHuA!*<k++lI>T8?Jp8F96nyQl6YwH
Y9WSDc u\^9=BP5kuiS<<tlMjiwZZa!@IVccTjDQ*V5?\dY:AM*^B$+@?MaWj$M#aMCc@cBM%Fq\<:p*Hq#t>yd
%?yQbl J:e8d5%NM%$65Rl@a^^=j$8@@echdP4#<a/&Pa$$hkq6b8TKR<&J:pT11V8Y/y<XVjV&VW:%ycKmiXEp
lMNlmd %S99ZT:nJ!iVmcWa@FyV1WTKKilZi!L^dnWbh1JpSlT></VihVR&SbGb^5:?FCZ5S55PSj+P^<%wZhA$
=q:aEB tdLRpww5Z^Bd*h@cFi?jHE$mIyGeH+9G+mjHWnLC?Ru>wdp:uq!cmKT/FpV/X1Y>ca6*^:Im&!Q^*pZ^
8Hw&n4 *1:EKYuSYZTItBQ9/<?K:Ekqq1hmjZ$6<Wl*auu/c<y>hpIWtiMH6Tm1^IH8jpy<cZhMn*BJ/I>W\dj&
cajJ^$ SqN4p9$6Miu^K=ti>=8PXG^bLBYnTVAXuBPL&ap1!JqN8V?y5%<>H^:y:i1&c!Ai:S>I1X#cj#Wnw6+h
cNiTGB FW9%WaW*S=Kwh^tX^qWWRV#XQJD1A%NF<hAT/%9Xu$n!k@\%j6Qci*I<BjcMcw!w\mjV>JjD1PE?VulY
>5:Ij* d*<5%S94X&@ca#&J%BwXul5:lYutD9VEW9Ew@#X>AJXJZ+\jn^!IS%h%yTKu1EiuccqHt+*q\+JWJMtF
Vt*NQ6 8bB#mpt=LHYu#VY*6XMVyaau\Nu\bScZScI^QNDjp4j@%FYWaQ<KCm4/^q*&m?<=6Y9Z!cBy:=#V&D!b
>l>VV< Z:SFW9S8mj/8jbF/N*?k6#@iE=Q^<=c8nEZ:P\iwWcd/?ajTVTlHX$!cJNK&icM4tbqKDCRd>^QNK!K>
lnFB6c !&PHE?8nAH5V@VFXW$VGyTnDHbH?/A1u<GWWq+yiB9V:<yZKJu=WQ9KH=>=1uy$>:M9QVlP^ZHSeWBR#
N^Q:k+ td@a@lu=lw6Hi&%dpp%QXpdIclHV>F/YI4D!R8YJ!aBw:%mpQ</IhHeu1KM:QNbNbdGw5ZuQ=ptVGqZ9
Y=&Nhl jK4wcG*VmjX$HVP&$*Lb66X?XH/yudDMbEh#W%?QYN\<4/%NJ>J?DI@V$4/W$qdC*B#XM/PtbQDpYGe$
Al?$%u qintNn/uKbYK4HFD5+luI<RLK1c@Q^JhaZhWe&cpEyG8cKT9u@>Wi$a9*lcQhZjJF%1uMKe=$hNDZR4@
amn\*1 CV$qI?+QNCh/?!p9M6\T/a>R5+6Fi6Rn6cKt*m/MC5/#*h9PTj?=tW*NK&LSXW5V1?*Hum/MhnMG?95=
i#\<hd F$=e=$C<Q/d@:M!t#MSA%l=jHi@Xu8YjbV/uJ>PSTA+p:ZA1*lNJ4bul=KlnwG>FYuaY^Q8:a>19yCLL
9wYtA8 P1kmn+14*t8PQSnJRK!Zm/<n$16!$WEhY/KLJAD%/&p%&6ujyihMK%QX1<pkDV?!C:Aj8tP!?n8ybmLL
*YE=SP a&=5i/I*MVPY/Iu%y>bw5VSk^V6n*hV%eE*KcCj*htClbMHq@KML1R=QwZBuj$RXyl*lnE/b*i6C1neI
wa4RX= MQMnQWu%VJ*PC84TuhW&GZ6EdA&NDj*wV@CwSwQ&=VJuC&p<!Hk@Q^dyyj4l4NQnem4nqB4ZFm=w^SD8
bk%V$B 6ytFeylQSiL><w@S16&JEq4cHE$Yp^>@=EB5kE6Rp&@taFFBBk/QW^NLSXi5eWRAbm1NRiT\%^L9T<y?
Y<GL4< X^X^i/I4%1*/i%XY1!uV$j/&XKKu1bZG%1mMSY=mc6VpE1B8Ih1%mkTutN*61e\uq!ju^CK4iGRnE8iN
ndQ>1B *eZ#c@y6X#mbe^RJqk/@eNNMJN8/I<5#?CPNdibT=8XjLEnF%DhVN?$twWpcXBlKNuBdn>/j#G#m?IX6
HAZdm4 *Rp1>N:qnqlBd%GMVmNyn@WP5Lkm\&+ypm!RJCFF@9bC>Y*MPwt8TLentqAE6c^a4BhN$@*4qunKbZ^5
ZBk%I! C+:y*cZN8>TtE/eep%B=\etnGDXCBHl\=WJjPE89p?!/e85t+\@+$du=JPNQM?LqZ#q^GbKGLtk+1ibI
HDk64d MCP66PFNJc!QRT1t1d6d6MXVjj&NudHqKB5^Vi$AuCduN9PTXLwp59cy5qG@ypXA=86M^1LyV<TkmFnY
Z8nC+= na/PGyq/eQ=MBSi5Tec$XGdNT$@n1AW#=1ma#DjWkdwSYp?DKH4uJIaJXaJceF@@\FK<d86MLqqGnNYL
>GRq*p ?a%VEJG?98TKXKR9bujyECM#K%&9XKh+6dDVay8/i8JPkbGWRMuVIKAEFieJCSE6m?lK%NL#NGNkGe$S
8y6/Be :NGWaqYC>nTQ@+:um8+WJyp>9&4G>CNlS&hPANKi$%Nncb#i&5WCu8!eNY@lapi\c+dM*+ujqi%L4e%p
iITB5+ MXl/6GVL#JlelF#ajX1*=#^!mP8kV&6pXK1W<>X4dJclVn*Y&66qQ%L&hZbb%p%@&DSqenh>nQ&kYn@H
aYZy>t +E9haNw4I1d&tj/Wk+CtCXpScYTVp/tX<B8qSNk/a?FMIe5l^$<1KhJ>/eTnq&mcp9HZ&X@DhPpW<mX%
Gu&Gm/ A9#ZCQWti9hRV<+j:ben<j%!JL=jPpZcT@y+#J1!W<ySK9wjbJNK14TQ=m>L!!6uKQ8u>dTd*jb9T\Ia
wXWGdc ZXNa=ZDEH5^u=i1MCtP5A9<5yBup@98=\\eJNVcnThtN8!Vm9*mpq*4Cp:uhephq#&D^^=mJ$^T9l@6L
eGqRVQ 1wXEXE<JYiEbLuwe!VSPi$u94dKmM&K!&=9VwcG#Z=D56?j8QN^R?&I9%>@qm56w!ltQ/b%1?lMZl4Ni
-ATFDa 000680c210a001202b4 Page 3 of binaries2.zip
Tj^E/8 IIW@L9tFc4EmVRdSb!tPZNHW#nG#qFSKEXL+X@KdF8pI@Y+ebN>+FIKlHijPZ4Ta#DqI^k?1Te5CPjLJ
b@V6Py S%tLM@RppELYZ?ZIy45iSKKTFytX>=qN8jKPy?\jX!KXGun5YHhca5jI::cq9M^*/6GbWYk=h\R>jbcV
cZ:d$* 5V\%J&QC=YdhEe#6ZG9!4V%T=qwtp/8i?8#Q1S/McV1@&JMWh%a#e%EmbW?Ni:yt^E/PhY6=!*l&h:GA
%@tmtm Z!H988?%?qEC5<5n>q#DtZw6cEW\jVID?e&Y=>Ld8BPh$h/e?B^S&T$>tmE5>4G\1Ie#Z8q!1l*HC^jw
:dChi4 B:tPuhYK>l!5%R\Swa*p>M=pJBydFD<%p84Ttt>unJeeMFnd4G#H&WuwWw/VqLQi+La*6!Xu^8k6E5qq
GhbcLT Wcm8=/lE>$AQbVIyJ<YIuBH9b%dlMunGqV1i!hbK1\m%^WJG#KW=lqDhi!QNhE>JyL4/SFMW+lWJlQ$4
BHZdC@ ?5TCTGy=DAJ+Q?bLjRITdGN:JJtWV#MG+6%hnZI&&TjWlD&YcqS@w<a!t9VMnQY1iY?<n\c$YA>N<qJC
kEemtT !^YC5N>AE!PlX1/\%BMHqZypYdBQ<PJk&+KPS9Tw*YLY@Mb=NL@4mb>K^QNny:y@ma?$j%!KL@1Qc!YA
NMNVRd aEh4t@I=E&4SnH>CqijeYD<X#m1ZH>$IuRZhYJhX$?IeWbD!5+4FW/b#$<=IXQ*qM&qQ&i<q+&T9D!A&
p^5RaH c\Ih8KG&S^i8S6Mb\qcedXN?B?HcqIe>KH9*Q&^=&VdqD^P8VZu5>dX6!pQld>8Wl%$%i!e+hk9bN1Y8
M$6KK& Fi:>LDkCd=9Rl#&$ajd8e8HaqJe&6NmtyLRh!naqyS$@&/a<<tZdqG<W4p%==Jq6T5J?t&%VH9d$dJ9!
edjIR> 5HXu&=TZ8+:ay1TFw@q5W>KC:VT&KYpld&^V$wJ>XLayceH8H68WDPE:&KbpCQdWGnpMi&h5W#I$V#k&
LyKJdl =WQaJe\&JcXPq&*Kl:D:mt*Kl%B8dFM?BF9BjPw%BN6XdFM?BQ6pdFM?>Iy\dM1HaL8XV@&FaC?Rde1H
^i8PbV aD?Mde1HWah<Am!M<tPd<tHppY*Kl@Gide1Hae?Lde1HaViPde1HaiPNde1H8+SnW#/MDZX5W#/MuYy5
>:QJ\Q W#/MHYN5W#/MuXX5W#+Mt*/<j!IMt%%5W#+M&&^5W#+M?:y5W#+MP&N5W:/pZDk&=W8&E+=N?SJ<B>8W
Xdu>dN L$Gi?YSVCY#Q5RtuE6n:ay9!JiANX51ZaNeh&=R9Ab?\VjpTtHSkt@Iq1A8&KX<Ci*J5W:+E>6Dayu\J
Hd5bT1 :M1!VjqT6AP&KX?KMtid<1Wwe:ayZ+w!=!&Kyek:&=R9^h?^VjqT&HJut@KqMiHaqC>F@6ttjCq&BLJN
WDEb/P ?XL56GPd<1Za&ea&=W9BX&^V9lR&ChttjCu+u&*Kq<KPMh8WL+XhZ:ayZ+49ay9!5Pbn&$$4R^>\IwjS
j$d>Ky l6mtjBq+p&*Kq+EZ&Kb<Gd/Sde1Zwb#ayu\b$tPd<tX^+hmWL$N:ab9!bhmJ!Ddq!:C4n&*Kq<FGJN8W
EMW$SQ L+P6S4ayZ\d:uY^V9k\&?6mtjBu/GdayZ\ddwV^GqwP9&Kb<Pi1Lh@cXw::aXFR=&kijTm+H::BN?jIq
$e/b#w \4EyZ+/$&cb<PZb\5wY5e8!GbJ9!=il@&Kb<PhwC:@Wwl%%C*lqcD48A9DNW*t*AP$QLWSi<M:Re6wX=
e>\bwk b&kF?I%*lqckZ?ThwSZwd*lucAZ!##6DK>B8iGhwBjmZh+bYkI>+b&kF/w%*lqc5Ea=N?Ry<C?<M4eC*
Q?\QZC <M:RC6nu+=&lFiA4*lqcAd8L9DP$AuZBP$M4aQiRh+bY\H+!:\!6^LnBP$M4$Zj!#6BK>Et<M:RT?iih
VcnK+4 wbXwK:\#6DImHJ9!qckL*lp1:%*kucGX?H*iGX1J6HqucCZcC?<M4aSJF>+bYkpdw:\#6BL>AP<M4WTj
NCCcCd jAPH$X?^VjqK&Ehpt@KX5QuKN8Y4MH/!Vjt1MeK^KX?F@yl6!qil*&K#MXXww&^V9ky6lY*KX+EH&cb<
Qu/ule Fi1RdeyZwT#byu\Xjy>6!qjB^mndqK?CHW!&KX<Fi?N5W:+KQMa&=c6kH=F6!qhDytCd<6Wa6>ttjDZ!
R&XmpQ ##dq1#HP5E*=c9V4dFP?Gu$1&=T9Sy@HN8Y4WWh5W:+cdbS6!qijKS!d<6ZkHdayZ+*!by9!%jl86mqj
\4HAiC njRi=#C?m&*KX<NtP>8W4+ahWLayZ\&dqY^V9kdj^Vdqc!C@5E*=G5kFdFP?B8M6&=T9Rh@FN8X4$P?!
64dcDN Vjpc>B>5W:+Gdby6!6ek@&^V9ka<^Vdqc%AQdFP?=uHluQC9Rd:ayu\N?tG&KX<DY/b5W:+G6pjbyu\N
BWKFj\ &lHdqK@B?Mk&=Y9?I^!d<4Zwu>ttjC*/b:ayZ\8bkt*K%&J5b=9!6iA>6mqjm@GKde4Zww>ut@K%/I@b
@DN^u? yu\6?wSjeln6ut*K%/I>5W*=Y9At&=T9BX?\VjqcjB@dqK@Fi:ayZ\5d^t^V99dj\4EyQ\#>G>8WH\ab
t5L!Xi nY*KD<Na\#dql$HYaJ9!\>Cu5W*=aSmL&Kd<MNRZ&=Rjln/BdewQR%@CN8YHwR&^Vjql+Ei&KV<Mhek&
1LAlm/ =iW>GY^Vjln!!Vdql/QM&cd<eMmDdFN??L:C5Tp@HLID&=Rjn9GYdewQ^#nGN8ZqQSq5W*++?u8&KV<e
n?>9k& @TndqMihGddIQ@#445Yl+a?+N8YHQ?*cqB@?tt6Vj9l9ZJ9!\@@l&yTHFV:dyu#hTNitjN%E%/b<*TG8
#q%TIM Vjt/X6itjF&uc%P?dwX4W^=*chk&=i9Y8ndq/#c+N8Z4duX6!6h>$:WyZ@hh%/a<:6m\de4Z9i:cqK>:
SC?WP* ^:WyZ%@1&yT94*N6!6j9+N1W4=@1&yT9:*S6!6hHZb9!>Y6et@L%=:5&=i59hY*K%*@i6TtQP#q5t@L%
5:GCFy **S6!6e@=61W4*?SdT\n@BddYEd+Zdbnm@C@&T+\ypCq!1/\DG@F>weS*w:6?TI<ShpYq8EbdIMa+iQb
Z!Nu** hm@CQY#@HPFVqV%$Gh/kdKVL<M*Kb4wMQ<!&tSF?X6ppq8E*qD%mGj+6#<ERjp@bZFhH>hk8P<Jd5%%&
HQIMB& lCi\@YCEy!4d\nLey8\m!@A<668L<Aq5B^nlqY#4G?EBbV>el5>S>5qq?Ayqw%!Gd%c&!tZ+RYY#ZIcj
pG&>lb XZdEbjmZdE<e+jiWQZE+YJ&$YQ+jMaL6mTP<I>5WS*kK&^BHiDddEWh+Ce>FEYb:+nK<n8&KI*\>&^bH
<wY%pc ?B/&>a*\$<yi8k!@y8!p!@D9&Fa/\9>W>5Ql6m=nP?RIn%R&^YX+b:a6n9D?dFMe+Xc&Fa:\A4aSnuCM
YSn9/\ :hMnjLK!p!:Dq@JeG8GdqL%qGd=H&X&Y+cja9n9C#:Q>h+VjbQ9+R6*6adH<9@XHdINh1L5>LJd@S$=p
SQ\:LI ?<\IV&Z:&$Lh:YG^@D@!BN8cDwXQ6m&WW9lC&+aPlY?^#ihR?GG?9\:l:!q:&DL<C69FS9kQdK<h+R@b
1>e8>l 4n&YD&y=:RDlHbX6hlq8WudmbdmVdi+n9E#buyjle=Y>jBt?l8*bI*!459e9\@i^HZCEu\qPlu$GVwcJ
=^B<QG MY?1i^^p?B&?#$Ew1/HY#eHT=Cbd@\#^iteJ4&?Y<ZytBc>j&nd\dS9%\+S#Z+hej&\R:y$dHuh6&Hh4
Sy6qHH !Ltqh6?FZIja!G5R&@CcwY%Q9$8+h&Xe\G8FP\n*9k::nw/J\4tu\dtnki>u5P>t5P>q!Hpj\\G<=uak
yllm+! 4:Eh^G61l@Ac&yY<jnch%<6t<Qyam*D9mbnJ/!W^Z9?!:\p+k6i*&up>c^/9Z^*J/%Yh9D/%pNinF9H/
?1G9Lu $>G<=6LD/$:H<n4V<d!86IVZpTK<dlVq8Z&T%&ST\4u*R//=ZC:T:9cR/!1u<q4Ccd!Ga6@Dh=b\:><+
5a!u:l l>hC>L5%%ku*Vw&LSj1>A^6+HiI1Zq?+q6eN95D4BF@phaE9m$@aDP!u^N<dM*m:t:?@S?Q9S8d^GQQ&
XEaRPF Cm:VV+8@D?Q/!5jjl#NQLm5Tj^@D@Ny4!N>h#FP=?Q6p=8XM@n/NiZI\@H&BD*>jL6!:M/=t@4+8B*>9
nANAbD ElhaI!mmNaJa&<L8nw:>P&b&HGGhN?=^&Yc5::+44Gh@<SG=5?m@\#/cGbM:D&b$J:ckMX=9I/h\i<l5
qW#V&Z I/e#Z\?tnc##cTQ48a*a+<B%SV#d/Y*\%dE&wG%mCF#klyD:&Lj9jHbtNIG%keAy/X/bmA>N^^#AelbR
e?/ySX A#iEF#5k!$p^I^V\R<AQDn?aZItY?<1P#ZYFRX>h&I=ZF>b>mm5M$*p&pG?Fabc&!qCMFabn6XYGaIZl
yNPKHV 5:NKuLqC9D*#?RYjIw>jcdmKb1<WF&5X#X+yDqcJ6%!Z$:d<*Ve*WL$64RnG/mH4A69!kR9G=YBeHq4n
JG8BCA epp8Xk>eai:V9B*V1Wd1w&4VVRyp8e*mQ9He5Xq*lH@eu>LM1E!dHVp=+l/\%X+5m9jPd>dP:Y19Xp@h
ZSD\RR *#*Dt^F9H>@NmM:%C&#bJ8hQ<D9ulLH?4qNchi!MLI5%\5lN?6?y*:GQQ889Mw>V/?@Tnqd4L>IPW859
DGaLIp >EQWtjHyb=w#Z8awIQ&khX1P$\>hb:@KYV!8yWc*XQSD%^u^uyuXD&NuSM8D&bq^8Yw++<C&<!L>TLn&
t4uQX: I9Na8@+8@al:y9uL*J#59QXkb?h>Ly=Pi=qSFGu9QH@Xm%WhA1<&pEtRXhM8RY/Ph>=:5d%DpJQ*ude=
Puht:6 G+D#Nqe4TH8bp:9TKL#KNXineD<1h<9IiP>hcBq6^C*MHA$q:cZ@>?SwMtu9>HcV@5L4R*P&IPh6#tdp
@d>h:p 9QX1T\/BV+Pm*@XyWHn4%/D\*4NB&T>#FbV>#9NZjh8LSyC:/pHk&!SqCn+NC8>>G^RI9B5W*uw*KL#%
y?mZdV dFD&T&<G6Ct<!6Y#RetQ<tqR:u99W5*XwGSlinWw?/Z@>*k%KQ6hXwN!Zuk!pGiD\q99BwY*9k$KBLpd
GQnkNw qGhd<tqGZm*Iw@F+6S8@J8QZY9\cmp<d<Y5ium*D5%F+6Rjjy8DSC4\ckA@9?:B>Dw:*aubjQ9hk<X#e
4jcpj1 :eZaun#6!e=?uJ!DmdttbT#5P1cJbGq&j9RZcm6ei+^?^t9\!9t*#q99BJDHuH?LF#u?#Lccue&b#y6$
iQ/9Pw 9uTm5$4JibNSSp=<Pl<:$YqeuBcdbj:IjcWbRuInNXNI>qhqeG@GC=h**SjM8W=Eitp/$Z=qtYZG!au%
I@FRN^ ?KIM$$=8yG*pTa9J?5b$Buim$>k:q/!dJh:tEw8!JcE58VhV%M$y*YaI6Jp!dA/^Naip1ktuYY$ph:QI
teaGlw FF6#T1wb\1p8n&cKwFqTb=ck/hnK#qZi8X1WG=&n:HP&KDe?5^=!6Kn$&C^4bqp6Kn%T??:eLT4#lX=Z
:/Zc$? /T*Knem5N<<Y=d:L1EP9FyZ?K88L6F4N$cLTa6N1PFiL!ntcb+*m8WcV:FEpc+#QHN6#n8pba*utGJ=n
YdD#V? :M+^bt6nhhdI+VXmbQb9PZ8&nD=N:<$!?:G5Hm!>yJ8/8:NKGuFyJa&I#JJGZHyJI!c6yBGlq:V>uQa%
VKCCt# hmS@nj%wj+HMZ*yJ8%FPTe5wXhIIyyW$I4JLG4F/Th9QYZuVT6y?SEp:aT&jcTYNmC##k+4XM\X9=$Yc
C+CHjH &J$Yt#X?/TJ*npYt#HYqnKYp#NWn6^qty=Mnd?t^YV%B&uRk^$Rne+KSMdHIuFC+a*HthCL#Vhyaqpth
CHDVK* c$qL/=Y!1V*T#nt^!VYleZIub&D#B91VA@&b5hpjKcPQcljP%M*>\/\@eakq>&ZpTa6Lc!eb6aEw9Vd5
cA@L:n b+*uM*qN@81eTP@!ken!tB9DGe%cELWnYlLSHA!ZqXmPR58I#b&Iuu^GeV4Jy<hu@EW&dSaXTmPh!wul
-A$w8w 000e9e4e1ee001202b4 Page 4 of binaries2.zip
\PXE$C 4D4QtZ?T<jZVeylGuibcMdWdcP91cE#iX6GZNYDt51*KAw&inNat5^J#m!M#MY&?+TTY*9upTm^ZM8pJ
e?l8Dc =Q=VqFHtu<4^^jqVt\&#@nS\Y=a4F<4CeHA#d8CG1MMhNpN<@%b\BmX\ey>i1d1>/YM::FFSi&c56a9Z
4G@%b% Fy/q6J$\&Yi\lY6H1Yk8&QQ%Yh*#laweQ*@i9AX/hJqt*!FW4h?<LMS\6mFS#Z+6?#X5G?IRj1=n@!:&
YPhH>* 6&J@c@bH5n?K@hH5n&X@HQ9n6d^Wq@bH?qbl?&Wq9/%u@*:&l:H@CQ6&dpi\@#D:Di\@y1XiXcd8IMc8
%Dd&H9 ZZ:NlnP5Du/?V!P*K6*L1S%DHcKE@VL&:jkK>l>k@$H&K:WW/<QJbSl&R%yeR:kukn&whnF6\@=VuLPb
N@=AaH @L\6?>8^d*@BD8^9#@S#?jqF>q>m@&Z&Z&H@Xca@ky>@!9/d:L@F:?j^<?@+&Val\6>4#hK?bc8!cKKu
ibN:L$ S*KSud**&j?A@R<%<yI1:Z=9?lQ6%ck1><+aq!i6Qhtj#D+Zl6ZIjl9:ZCkYY$?^Y6ujpj$J:B@K@p:5
$<dTCI :/^qaZS>W#98w8&P+aw@8*YWMmY*C18b@Sd&:b#YcTtNdin5:<yP!tLTdVVTeTZNmST?&Q:CKX^8Vi!j
J*p=@c #Q+M>9u*Bj??8I=>@tJl5\>dilG#&J@N/ZP4FnadeQYK<>q9b@>$y4h:la*5u<4?G9cQa*<D??9b9+d>
*JiJDT M>m@k9%%:B@Q@ku5Z<V?Ki^j!Q+T>p>pQ<L?W9c:&L?A@iYe:**=?X4&#&Z@QQbZcJW\96K=<p/+@hlb
y5dF&/ uJJ6c!jP@p4&X:Hj#j/b:F@Gjk@@@i:5:<G?*hMq&E?!j^Z:1ddA%qB?Y$NHtNwc$pdBWPmQ:&/ty#$C
4kd/6w Y&bD&=dbWDnSFJ!tH>1u/aeCn\e&X\Pd1=9p%F+\d\utLeG<ySn#F8a<1&!V#F9c%LNc:9Gd6#^c%ek@
5GJW%b Nn%$!!K^dFq<hYh@cqb9X&!%>hD>$>Hnl:>DiB%YqSchCI8y1=w/t&jN\9/w#wGRbc<HYntZieQ!Vk@4
PFJI1t GAM/&K>japC*B?=dMKCdnL5aDPn&^D$NBuS:+R+Hq!/5$=X1hQ9mHkiD>QdDHR<GhBlj8\#weM@FCye8
B1y#<F 6@G45L!Z^I4LR/@+t@V9PF8n\^$CTa@9%Z@*RN\babA@*JjVb$B*KP/ZMKB4^4$TBuT+:&GGAS*8TXlw
bcC6\F RIi:Y6aa$M*E@SaGhJB#4nPkt+W:Mk#wn5D>Pkb$$C8huw?Pd#+NmeCq8^DJu^d@N<VhmIuN<%ycJ#bP
Qwq%<> dGqc$ESi^/#tBSPHWkGWFIEHR6Rpm&Q:^=L@w<XY8K$:ZSFdi16Dmt/>$wAPI%!%AS%t9VWGhJkb%^4R
Z?$1^\ wj<bbpCHGjb\l!=pihGlnP5M/DBV4#ik\&!?\aAPM@/6DPm\KnDCkA+4B%5d$GF%acRBHXakSluRabXm
q&@T=Y 6AEhXnLGGNBl6YP5AS%YSMab$GHXbL\BHXbY6nGk\<4Lhkb$YJ%yNKDDC5:&BuSa=huBwR6:$tG%b$eD
FahMIV P1\IVVCk\&^kb\M/4CJNNKDDC6E$l/+$Vaw5$ikk=S:pRciul>Yq\\#wy5pbVZ+/4E:FQKRk9W9FC6a!
@H*RMi A#15eC$*wMM1&AwDP1!W^R*w5JK&!wAP1&*hBuSapi5^wMP1Zc<BHXd&Ekb$pIcVBuSaGV#JkA/4kG5N
meI#P: /LBTiLaBHXaS##Gk\$4n=\#w5By=4kEhXm#QM/DD18d=BuSa>X^uRIeX$a5N/LDKjIpBHXcmL#Pk\&4%
QPQCV9 =Rb$YAXjd$CHqjINBuSaTd@TkA+4:Xeb$GFq<^wDP1^TZ&6Al%ZynRb$YLu?wkEhFyY?bECH%i<dDPm\
EYNbX* Pu/nAS%Y#&<&wMMK?!$GhFmF@+wBHXdy9&yAl=Z<&\#w5Ny@8\EhNALjMKCD%8APA#ywF8+$wMPK#q$G
qjl$Bm hNBR*G%AB<*FjRb$$G+<aEAHDemDBuVRpn^pRAhN!5MGhNC&QGJAB+*Mw\b$$Ny<!+APG1S9G>BBw@Ta
\8@FWi AS$$Sa<d$EGV>I#Hcy=Pl=9K*#JI:$:!@t^Ah^h=d^9R*W*iP%:#QI*8H9L?apB*L*u9G9#8jiV>%aD8
w45t#i IjL?dpCHt>L@cWD*HLTiBuT+dj*4BuR@lAdXkP+FcFpN/HA#@Y+GhC>DW&^A>*Nwnk*w*wBY&aD8X>A+
YA8:&@ G>Dl%9wuDil\w@&6BuT+:j/J@HS+aS%5RBjCDh<GhLmS?%ADP6!$i=kBHW^RV#ik\\*dVRb$8KG+&aC8
u/kh%u E4iQG>DlN8<nDilG+&b\A#4et4#AkG+edlE*wB8QG<aN/LdB:iMGhN9mbuID88%<6Gp/*W+?&nThdtej
ypt4*E dbyPN>FHt/dV:iKnVhQyh9ZSy8q$8@6w$*T/QZ!$cVwhh4J$GhD6ccJN5=SY5L9W+4>J@+/%G6*i8H*h
hLFa=! +H9*<hGt/ZV:?&nVhLwDjLSyP6*BQ6w$ui+RH&&cVuiwn#bNy#9MS=8t$$**$cdyhFk98e/AdwcQNp&u
Jt\PSy c@HSy8q$4V:cNJ$PY5HQG@AB%pF&MWkQ/!BVDPlt+%b*A#ywBY<$!F<:due*TG<8du+*wINY>W!D*\*w
td4LGE NkFh+AI*SB#$m%XT8#t<BF1/+Q#&pHhyh$4K8&jX?e/AL+a&Q\n5kyD<RK+:94S9YuJb>#S%NDZknTHJ
cR9\\S D&Zb@NAVmRdMMFV=wV!DH=auw%&4JE5pB=aGdDHp?KEmJ#<E9DBW?cFT<WNm/e1AARJ?\C=V%V@$BSPM
k/tBcY kB<EhlNLj8ma&SH6n5h/??jEk=FmTD4tl>we@BBID$P*j^ktR5RQ!8J:=$A!tWn%V*PNZRX5McV+adw<
>&ASbA RRB?mQYu\AT4?lw:?!P>ZbFWF^<cZlP\^JDml*CP@8H\YKR4q81d64A*jnL=pi=GP!aw85</Q=V+<ENR
X#E$DM WEPQH$y#<ENRREPZH<1IH/14%c$j*9eX%Ew4%C*@i6=c5@yhEdy?1tmw/uLiN6^>48e94Xt#q@V*ijVb
w/y<e+ E<tHSiBmyNQe*heuJpi:I*%>u8t$L&4Eh\pc:d1#$:u>>+1t8cWa?bujPd?=GPp5cF&<aQLTFeI9uStS
N*Ah:J :8=EwlijqjV/LyuPTu#>/wLKS/cVE9GpV#uQn=$1JAQ=yHQM4I=GMjqW**SM<6PXmA+Ww=^VjcqwMhKB
uDn#n+ W&\wC9w8tR+Xn!m\jPyW#?=>@eka%bLjQ/E+Ldu\hN4d=<\R^QJSu*SwKkN4aVSY+e5<YuLHuLcmyCN:
1+C:Yn lMK@c>/M&a*=<6Qi5Tl9jqVQWul?:J+qYw!iJT4<9&6Sw:4C#9p14*RtVSJFTTe1JlWquYT^$ppY=d6m
6%yV%+ 1**V!Xj9VnyJEX$^cbJjj9k8NVhDPjPVnQTJw1RVZXFI?c#X$mEPKn!hqIn$?Z\ZSnm:wj4YX%>5icH%
qnwR!e JWe+JFTMEc+I/jT6/F+1WQE?=hQS&yc*H?94H!lKPuKpyEI1yJ\:*JFT8\A#\+*qpjKhIw&W:&#mpbK?
SGJ\d+ 4CknyZe/c1S<y#m!e?HyjCwnuFM/Ba=\ihM^HPH!yyM5Xn4Jwu^Z5Wc+FTKbLCA@haMiKh&ECl5y</Xn
9!&hWu PFJ/jNikS<y</SmMqE%>JmPqj#415tHlt<:m=uuWn/X<$\FNY$bQquNPCWa5!wldiD1DHHE>??hBn4mi
bAcYk6 /SS6^F$W:>%*u$d6?6*MXTd8iiNLVVmi$mqK#=5*HePiN&</!YKqp!#Kh=u&tB:y%A&&l@JIb>A>XL=$
SW$A9N 1BHt/eHqHhGCE9Jj>a4=>8BIJNdHnWh<5m%Hy6MhZ!4MJDculHLtJ:F$yh>*#X8/Mt</<w=d*\Zt>9cP
<4dQt? kt??ua:c!4PeJWc4?^ELe+/WZwS$yJTi^?Xcl<y$Wpw9Sn1R$w9\ZZI>K+@L6b/X/cT$Z+V<&NK?u<5q
9J9GHH :Ye/HuQ<9!9HPpL8hCbNKp+/$TLqJ%t5hJJFTRjTjwGP^//C9m66:Cwkua!^1@B$<9TbpK/N!kj4WAW/
pt\?a@ KSWZwb%K1dkI/WmyPI@L6Z/W/cSWZIS$uLG>ANjlnHD65hS!n!G%jHMd+VdLH4\ILYhVe11J!:hA8eZL
JIJRhQ Q6ycR$G!n*e/SbJ>6tmb^dN$Bmt#=E$uY1V<JI8XV4Iw/Y^1teWnQ+PYYV#TGdVMpm?hw5p5iebK6TLw
RuSekX /?TKwMlQ$=cu=>nCbS>Qnl/p:PQVMwwn??SdEBS%k?4y6JYlku1/9PqEm=TjbLHTTSaquSYFqdPtR<tZ
<!XTA^ D85?9DQp/FCKpw=ln?tS#KB:#L#yJAeK?T=>yVNQPt1qM%@Qt+4=quP8qe=Q1ph\Xn4NJD<jn8cXVl?Z
W5!GYa c/W#$?ZdGC6GdG+!iQP<T%dquXu\VpI@J*jaFmGh&T6V!!aVC9t885?/LL?m9/i:\QJ^h@\YXq<!ub=q
4S@<iL lSbS$YSD8ZP+CH^+VD#bXw^$NnjbWQb$ckh!Rh<q$%pbTSXcQy^P\Z\w$<GP/ALVab1YSNTnH/<bSI@b
day?// +njCDcLH>E*HyIjK%*K&<B:K6*\?lb:FM#@VB>i#?H/ZTa>kW8?D/BFc<pq5lm*RQ=%$C=5%kaZN\AWY
\=euKY NkPZm^>EVw8KkaZNIe\Q=aGF#eDq6ckaYNke19^RGXnaDJ#GD%YBle*AbX6WDC^5B9#\$Weq#ukSYNke
eyM5=I /m/\5Bt+HPNFaGE#eIGF#eB=<WMw5LAbPEPL1$FBDV%?KAp5dAa8\?J1aGE#5LDyq$=kahM#Hdk6!5Lt
IE?Ln1 &MDCbtBlM:C\GXna#MlQaGE#5LCbM=*Q1wXNtW=9wn>YkB^6bKq#ZGCyM:DWGXn1DC^%=l+yA$8hkcZP
B\BIlt \FLuy#J!B^a@A+8jljh$keZQ\PKu/\KLu+HFV$<ZYQ\MLH:til>a@M#9Aw8jkeZQ*PpEFn<L=%RVF%n<
t>EyEt LDmh\PJuaQG#$HRCm=?B^e<6T@aJLH+Y%6MFFn<@Xn1B^e@A+tilQaK#$tpt?RWYQ:QTCT^?dwG!jGD^
V!QkXu $>MFFn@>$=E>ZYD^M^>NaQF#T?1lAw8jBhV:IH1EV<Qmb&%k<VN\keZQ\PZmB+EVpwHF#+AjlJ<F&MDm
dQ/W@L =^Dtl@LA+tjk<q1ADZll1QJDbYD^M*AcQ%RHFn<Dq&$BN4D+PhShaQE#eDu/l<Dmb?ACm=?B<?KHeGD^
a^p^mn M*B=LD\G6V>$?cE$5QkbPI$j!pT=bhq^H>e6YhLZH=H@?G:B@PSeTIm18jQtN4Y*Vt=h*J1dbn4?KiF@
CayM?d &F>w4de1R/hyXGEl#wKeuiNjFBJN^9aWR8+YEFF/nk9%JE99i9JZ/lFjIH?XH9F=<45ynd%KLXZ1L/VX
MHwZFT TpmWB+jZ9hMJD1<Hl>eLV!e+9P/dVuB+*d><k5Q4\iH%V&!EC\/9F</yJm++9F=\P5Hl>iD\i1HyBIjZ
M9QXLn k<Q4Y=d5<>p=9D+5PL!?CR?9h<YYdhKiL8<l?M*5$Hq\YD\+LJ/XVuBajA8WuaQD+y+8PC#8u+:5/aLD
L$DaJK +9qwk5QmY%IQFS\YL/DiB>EndL4D+wHLhtZ&>kF*G+EdG1dCT8Nh6dBn%8SpK4a59ny*Wld@C*Y+Qq@h
j^QBbc dBIJpZl9<Z>D*I&a&D!9yZXm+<TYykXN=HZMcq+\eTkXREpSiCAp\1K1KLt^kl\b=cl+&+ZKDZSJkR9e
BnB1Fb b>mB<%6mT\iYD>WCCA:$B5+YFAMZ8IALAle+E:i%XhT&EyIIDaLc%#WZb:pkdh1B<\X!NwEVBGX1AmEZ
%#bq>q qT4^C\L&IGADAPi?5Xwl^HClXl#4CR&E4VD4S6ESSlJGEWaV^lDGE5aS^lP\Xw4DCXAdappaK=:dELaq
/it4pN NBJ\5^+$I=Dc6mh5S:mA5ANlS<IE\p/EuRta$i>C&JY\G\EK*>$Ji^AtE*AmAnj\:W*al:A9aV@CFAKW
-A$MK& 0003b856160001202b4 Page 5 of binaries2.zip
aRZ#mA pReReJ9lkRRITReSDmaeRnmWeBnlTy=!NSFt!MIZApw!#M/\JDtVeDmlq+DhuLMI5\uaRk1qbV6lLtGi
l@*55w WN4ZI\u#Cb&EBaTFlKMIm\mLCWeVnmEpCNn/em#lPML^lBMIT+SckeRKL%T+YBT<twAq^JMItPblWSJc
PWd@iT bClSLmieVDmFAQ=aR<D/=uwCJw!uE<+kuEp+T!nN>>tEe\mjI?B&\@MI=^QYET+pZET+tHAJ+XLCbaRN
\mc?b@ lC5IX^G8IX^L8I/\WenVJVl!kuMw+w8EL^G?VLmBeCQlJ5LNlF5IZ!F<qjC%Rl9hpF48KcXtHLa&=?Yj
%EN+^V +m%6lD/q$mkywllY9NK\@EiT+XAhNENSEi9LyZ1Ek1b>$VF1Z$k+WCME44%#Xt9>4N:?YKw*%6@a8n4b
94QFI8 uWkNh9F\Xp#>&iVa/qlRwpQRqi%bNVB:%kL^*@Z9&6%W!Z<*h1n8/mCTq/ahZ9Lj!$VJn$+/jHhIL8P6
G>F4?F &cK/9ZZ8R81#qm/IyCD>uh?=aQ/P>H^FS$eCp5:><?NhpKminMVpyi4Q$*6InK?%hWhA@>5F:ZKd&H8R
#y^8p@ leu@H&^KpI^e%bJK$G>aP=Swi91T8JSpq<n\Tmt6*m^j4JYT/95!#:9D5w$q^$B456mqWXlH!9AipCC6
$e9mB* hW^Q@dS%D+hJ<18?k*>mRhbkFSLX%jq&8>ZK#Y+6@*4iK8D&c\mIe4NdEhKSY!/W4699huC=TRS:HLLV
%Bw*=> Wdhj!<%qSemQ*LySlHV54S6?/iVc8yH#%uP==YJ%RiZDY!:mTb>!^6aE!WA?/ek6F>lVWGB>!W%aSTlu
P/YJld 8iYmCPuA<bcLk4=LywM6F\YYV%&?e?ynXW6?@+Vm6PVC$=FH6anqw#:y=Dyiu6YTeXT4GPuIH1H\:=LH
+9$5I9 %QQpJ>e^>e#<1J/q<Q#aQW8$GD%LXQl@X+=n^4uVtVSJFCYh1JlWqHTT^WwuYbV9\yG9A84hTYiFTCaL
eSF8P& !I>&G!BPMQmq\:jh8Ruq@C:eBqmWhKI4Cmuu6TL6aEdl/cSEyM@u8#BT&k*i6>=^dL:AiyenJSI1^plb
K9^mM: lHVp$VFW9E@==D48uqp?<8laEhKSI!+P4lV\ZS*8mP8>w&WMn:n9FGuEjYeVn:nP+d5CS%#9hNTI?$=^
tY@5yE bQDC$@qWSp46mGNBI&ZihA^H!4#yJI8XV4Iw*%Y5phJ+lHM#XNkIq!<h\^HPw*\GQeLqT<hklG91M^ul
XjK!B& @NQlR>c?/elD%yNV98upPtThe$+JBm4KTFq+PwMeKV*:%WGPqJ:yFG&p#HjK8yb:#QlTE+:Znt+Y%GQt
9*8J^V Vei\^<!dV4Ja/TTL<q&te\KQhPwG&$N=yDQwHmyjP6RI<@Vk/uA$JiT@/lZ#:eF#Ha:?yF1PVAiHw<$p
c*MCB1 LciEe8aHl/N>9m9Z+inMhDan5+9nA4PLkhqFL^iaZR#ML8b/4/%u=W5uc^$1b*+k:Seque*MDGR!PXDI
WpV6GF h&t#Bq<ZtJQ$h+E=!W$^ekjtJA9uXBPZ>\nk8MCebGBPM8@aFbmVLC!h#e/eyKp5=9%lk=QF<1Y#tbt*
CP?Z?b NJdFemhWjFp5n\\RtMp$qeW?P&a!/\I#tb9RVGdS#F8c>4#iGSye#=59ue*M*Kb^#=5:IdjuDe^&j8yt
MA/C/L P?5D5=&B&e/C=!mdt>uP#eVe=uRStN5M#F6/etFk*nI\d%qA9R?mBY+/<=bX$ndB<BLaIwByI^G+wi!$
C=A#^P 8$Lb%FZumpk1%lZ\^hDtB\EdJyIj!NF<1Y>cequ*6Gmmy!jSG@DGpPTH5t^?/IqEA&aa19^Ru5EQ!=QS
JGm$Ck 4qYTJbIDT\P&GHL<WJGVH\JiGK4<WBtaVk&e^k<%*D@$BSPMkB<EdCBKj8ma&SH6n5h/??jEk=FmTD4\
$dn6q# R\qYy4L=IbAilt:@ME!EmB@W=59PkTV$1NM/E1jEWl*hph:?kC&GFD>MF>L\L9FD4D<FJqnX%>nbH?u6
\C#mWw m1T/G1tuTEXTc\KYGFL<EM4SQ^\im*VFWu*VF9dGade8$6%w^\SF>%uul:AQQ\RFNjV+wTRHQ\RFNHV=
HQC/V+ wVT+\mX\DqMELuCB!?j5K%!CunN\Re<b8MAN98eM&qLkAqiM6lT+kA@!>cpBy\R8GF5DF:mkV\%e$KeG
=E*<in LuCdZ=<1d+1&#mK5JiCt+JHpu!Q9n^dY=>RNw6c=<9=wab&uL5C##yhuN+X%AX>e9W:iMT&5C@u=I1c@
HZ%4\H YN+*Lc^L=F*V\4yWZZ^1Zed?=W!@u9$NuQ+X@Q6Ze9^XuN:XuJ>4?Qi9%T:p&>R*Z&jiik&LVj4N%#Di
EtIwG= CJ8dPG/NY/>^?#X8Yl:5#hi+8dqa6%>QF?w&=*!*Z?QYc>^aDX5Y^dn>G4hi+>R\d6ZPh@5%:G4ny8qe
hYDQta 6%@dN%@nbt4>>t9:=t9e:y*4>89Mt/>^A:q>?*Zt#hi+aS8*ciMGdN^?nh8+ej9%y*d#ha:Sd*P@+Z*h
VCinQJ ^?D#6WZp</9E=u@L?#ZC?=d*>TL*Li<dSP=d*4%8iL>AiN@\jnt*w!5%H4>8M?L#\H*mR4T#H$WW!c=D
@H**RR eEN=+Ad6kl9KA%i\w^FI*qBiQjNE8*<44b:*8H=DiYu%>L9pDiZQm<@8DiZDiMap@/%c&DF4MnIZZ?&*
da5d8t ptLJE\*=ZEpS%q%Cc6=ZyPGLWDX**6!t>6dJ4a6de>NNF!\t+^@&F%444e4RciunX8CCpV^\ldtY6npL
TWTT@u Cl:JC@9#\G*yd1?>>kIjBSM$Gyc6aL>J+AIZ8C%Nhk^eIE$HLyCtA^hI$+E$HdnABT=\kVRh>PYBC%#k
N#jkV! k4+<eEFjH4nABT:w!#<:JSK5ekh8eC=a=R=e\T=a=R/p/eAFLuBd48^aZb*9C9yciRN>!:?i6>c5jqiE
^+KbAb 4y<1G11/uLeNh=@4&T&8YdPZ>Qh=>NpVBh>AZ+S$=Q*P/tJh#*V5G/q^wZJ&P4j@Z6E$6^RnQ@Ki/CKp
9*AK*$ a><V:bhP4u8mM:@L9h>=hWHq\@e:^=M?=a^:pCWD?cRn:*jGRdeC/$9i5F/Eeyd*P^elHVm?*:tk:=Ly
4RNp&8 +B^kkiXVy&!h:#@%CI@tQFc%=QhQKE=LLn!h>9a=M\T^jNRuuVu^ya&#itC>HX@t$bI:=4RXJS*bI^V?
K&WQM& ZjNt#G:Mq=@&npX=</N/q5L#a@e5$YL$LFHl@%&LGy9*dJ+$!j$14*RtVSJFTTe1JlWquYT^$ppY=d6m
1ReuBl 1**V!Xj9Vnw4SDJbRH:1:HTTI4ym$mT@hDwmjhFI6=bR#8>KS9yEWhKJ4mmpuNh1/SAuFy=PTpV/jL+L
mj5^FC I/Zh+H*49T?&9NB/q!MqEm4GTFtEhQyYhC<X1Hmj<8qwde9dH@d%D^RqHVumWmEXW5+h:wnd$hGeb<S>
W5:X!^ y$kn:n8diMTqL!9KmP8hnly^*!tPDF=+Py@KTPtWVwEnbh=$DEjK9Pppm=XP5mnjXc!S$umEe#NW&AmZ
%&&FTp L^*DEe/njAa>\8XL^&CEc?w#GiH<$/F5WDLCN=*F#jPw@$u=ykPc6w\iKPieEk^WqJG!<HRGPXJ/>18D
lYq8lw HCp>$!uYTCuV/W*$F&ItSI/+m?K>??:V8H41@l+ndm**9QGqJm&H$mqK#=5*HePiN&</!YKqp!#Kh=uP
9*neqT LV#T1S65V?iS#1B:8u#yWGQPM^IRH=LERRu=4=:FjEeCJBL4+$awNpEL:I+9FYaTt%NCPjPVYL4T::9t
*HJ<S= LX&bN=&=mX:@#5B1d?<wYKW<HdYXb%qMnJNTiwHPphKLpI/W$9P+ZP6btW=K/eXIB%J/Ed=L4w9qeduY
jwLwV/ ^VKhqQcLpB>d&9h#8cV>VMhnn9>*=XlH!J*PyEuFTThcyQ\pm=XP5mnyRNw9$QHaXhB*ci6m?hLJY5@K
@y%E=G tS@MGw1TVuSFIh?XMbaYIb*pRCHjye$?jB%tH$d%n9Y%Ay&eNSTl@=G#lmKpI&eN?cVuHP6mtW:PGw1R
Ih+qDY nmP#FCn61=G:Qbbc:mE1qG>8I@htPVIXwiX5Tp+%ejpYZ4h+tW=dm!qIy9NPy$k!*Sa6m*tY#mBq5d#y
eQV:Q^ SI8Wu&T^$ppYJb%NLa6==Gj\5yn*l\%PF58Zn1E5=yHMwGY^9Pta!tK=E!1?LJbHBqA4\d=P4kTL@DS6
B<PajW iZ4ELX!t<&VERey$Qm&?PDJh9kXeWViwHq^d!T8wB<?dV4SI?WpYK=%pWhJbWXk=D::u>e:R+H4ijPpa
yWD#K? >4\i!R!/=<&dntuQt#5l6?jN!+h1bVyj#+8XcS?Zc&Z/p?wSbDyatVcVcH$+tqitjX!8qiqMq&>D6Knj
F^PaY< *PaY#jM8YbX*^5R:TQ&e*FqhlHSt4$\6t$\w=L91Q86#qBZ>Qh$Fqw?:$:8\?m1YVCh*iljIQ>PSVn#b
K%I:S\ Xk\?*N^pP6qD1S*nBZ&ZVMj5=lmVMt^JSD*/8=yB>C!?h>RMwtj^VeipJijn%C&<Jj8Y#/jRpn*#M<mY
m<d?Hp :Q6hJm*RyN+H$RJd<pp&^dm:KcS8qK5IPZiCyF*XabZi/6DlScWBHY/q1#ck\<%%NRb$5BbRc$CHG@CG
D&+6W: GhDluyZlDq*I<1LDVZy%BuT+dc@ikA:*\DRa$PHY91$M/HC#*\kDPnV94R*weEQkTAM/*CI+!wAPN\&P
LN*N#H N1DDdaSnDPl\a?FaA#4ecnnPkA=*<a\*wMQ6mN5a$PH&^P$M/HD9V/MBHY=l*N/AD4e!:8DRlV*yeHQn
kHKKGh nkb$8Mq^kkEhdu*e&aAPN$JPNKDDV1byDq%yYKe4%inp:a<ihHy/8Bq!8kGh9D*TkA/*T5de@mZ>P:V?
9$^j6% FF1YbRb$pCPYG>BlB4LCkA=ZIeWN/HAL=mwDP6!W&Y%Al%5$i\#weNNt4\EhhLwJA#4MkJMGhLnX<!RD
E%tB#T P6#e8hcAD4h:ut%Al^6A##Gk\>%ku#Pkk@l\4kEhSLn#DPm\*uG?AS%&%/$#wMP8lw5N/CD$ZtJAl>6u
\ZDBjL L#Yk\*4LbRb$tEhedpAHWZ1>AS*$Al5M/HA::JWGhJDq4nKkk*S>nREhJM^4Dik\R>%wRIidcd>wRIjd
y*kN+X c:>pRIjddY<\wINRjcMBHY:H9htADnjw*tJAl%6&9&JAl=6+9&yAl=6/d#Pk\&&?6^9Racj4N\#weC9\
yjVM=k HRb$8Du+VkM/*C=<q\Eh:m&<&+AP6^Qjb$CH&+5jMKDDDeeQG6Dl68YHDPl\?@LDBuT+XjpSA#4e9Q!w
@^S$m5 AS%85@/YAS%8ej/&AS%8uu:MkA+*Rn>8RIedwy>^/eJihHiV>=bBi9iS>&eD899Ji>8A:kH!*9GcD&y$
lAFZbQ D=L*F\P/l<q:%?B*H!H94\b$n=H*h\P/J<u:y\Hhm?T%G6C>SN:ZDiliJ1@NkP+X<tac$L%K*t+GhD<q
QI<4\y d=IB*b9p:Y%A>^b=?^uR@a/<A\#weGj4p\b$H=B*1\Hhl?R>pb@PK1QHk\*w!8u^EAP/Cuw<%IC8pl+Q
Q#JjaZ M/C4w5jyBuVX>NlpRFhLn<$GhMQw5eYAn8dh%yEGhDTj6nwN/Gk?dT$\wG8p^/MM/Gk?dT$!wKQ=6LZa
w85K<Q kG=Hin#ckG+CQS=nRLedQT+^wJ6En!ec$P%Pn^ED8n*wecpB*YS/nPajn/!>/hFkjt:6R+<G<*N4Z!l/
eqBPnA DPn&w$h6Hl@!YI?%ePj#1qKL@!d>P<:Y/Qau8wVB>^=An\d#Z?5ki8\#wD8aH95N/J4wedWB*R^/uGFA
AteQ4h %$!QC\*wYuDY!+C8qS=QNcCD@8A/A:1b>HmcAh$5iy^kRDidHp<*wD8CH4>k\AhaL>uFID&5q$\^wJ6L
DCW%ai n>ed$M&n^^5M<6hBn#ebyHepQich=\W8eIELuP*Clu4P5KGiM&!w=\\d/nuDlu4P5KGiM=!y=:R5L:y$
P+Sn:n Qce*Zd1i$=58Ze@yVbi8=@TtT>h#i6Pq/#t>/hL%uN=$/ZyPd:y$Qce*Zd1i$=58Ze@yVbi8=@TtT>h#
-AcabV 000443179dc001202b4 Page 6 of binaries2.zip
DJ<?&W i6Pq/#t>/hL%uN=$/ZyPd:y$Qce*Zd1i$=58Ze@yVbi8=@TtT>h#i6Pq/#t>/hL%uFb8QTjFHml$QceX
V5mXPw >p1Q=Ha^%+CP=HbNH?yNB*%wl\GhpV+$dKkQDS91R<PG?6C\wV+$dKkQDS91R<PG?6C\wV+$dKkQDS91
4GqJ/e R<PG?6C\wV+$dKkQDS91R<PG?6C\wV+$dKkQDS91R<PG?6C\wV+$dKkQDS91R<PG?6C\wV+$dKkQDS91
lAwKIq R<PG?6C\wV+$dKkQDS91R<PG?6C\wV+$dKkQDS91R<PG?6C\wV+$dKkQDS91R<PG?6C\$q@ibpAH@iZ6
Y\W<I1 BuVRZ*:DkA:/!#5M/KC@9NPA:pJlwA<q8w8EkV+$4QTe>^uRRZ@=kAEh>JeQG6BBj@tRAS*$q\<d$EF@
#R^\E* ?akBHjTZn^4RRZ@=LRM//C?@dWB*uVDRl^LhStGkD!Y/8+TBunN51PeMG?w=\+b/#4ClunN51PeMG?w=
1b&AFE \+b/V1J:TlnwPePGi5/\wb+#dKnuDB91PePGi5/\wb+#dKnuDB91PePGi5/\wb+#dKnuDB91PeNKL*t\
WGD*4^ AX&qmb+#4QTTl^4RXb9wPat8^pVQGXd/!!aD88Etip/m1#QSe+cX@9JIA:46VQTeacY@ZGBA6+PJunP5
CdiaNt >JKLDPkttPk=mY+uE#$u$i%5w8eMK:*pEkP/QW#$uGGqq+\a$P%yw8ep84%<>J!qG6&?Ju4P5NJLG5!:
D>n6tN wbjM4?eMK:%pZn%uYPpq+>B#!4@^$HQT8/qEq<!uQ!K/A$*$uES*mItip?kPNhF#lyXie4WBZa8JunP5
c%S%&9 >JILDincVQTeacYZQNYAD85d%^uR#VLSe+cXZuKCAh$eE#%uYPwq4a$GjDBZGPk=\%I9tX@QGXb/!i5N
>5/I\+ /KCZ@JJB@8cd/DtJ4nQRe\a8eIEdnC6SN%S:/Vq%PuSRqRb$pCt1DimkD/$^wIM?6NcAD94RaRb$$Ih/
NADAi4 /Vq%P8lD/\#wwA?6N/CDQ4VBkA:/$K$M/KAQHYFAB**w%kb$$IiPNKCDQuTWAS*$wcMN/KAQHYNAB**w
iI^>I1 YAM//EQHGhBBH#4ikA:/$G$M/MaId#&uVkh>cKMBHjTl&^9RRS?/k\Eh>KE:G6BBH#4BkI:tib=/Vy$P
/8*lI? ?6CJBuR$4@DWe=bwAe\49QTe?l@RjMFVL/uVRd</*aAP=$nuG6DlHGuM+H8lN%%tRHia<Nb#/uVVldii
NXNb^= W/iDHnb8RAj>/mwDP8lZ8\*wwF@6McDD@5qiA#4waSMGhJmuJA*wwIe>!aB85jDYe?y$S\69QchPh+#\
/R%uES %uQ1hMeKd#&uVke>:LpGhNDDuthAB#*5?Rb$J\y9QchPB?5TF^9RRY>/mREh4DbhbpAH@i4qBuVR4/+*
VK\::8 wIN?haMBHjTtX^4RRY>/qRFh4@DYZ?y$$J6ic$B*p9DYZ?y$$J6?$aAPi6M9GhBBd*1DAS*$ynec$K$Y
QlWXQu *9yLuR=/$%5M/KA*@awB*YuCY*?y$$G@iy5BHjT46^9RRd@/DRM//Fj9MKBdK:#%q#wh%648M1DD?hY:
GJ^!N4 Dimkl:*QkA:/%ReM/KBjjhCAD94Xl\#wLldi?p8hD8hTH#Gk8%S+/!>%P8l%9&XAl@P4*#ckk@:*MRM/
4A=dN4 /H<jN/D:89DYZ?y$h\l9@cXPh/j\%q@1hNCd9tM\#<M=$4<a$H%ViP59hdy:ldj?W1iD*9V9BuTQCt@>
D$$Hit yW:*A?G69>VyeC@k%\*wulQi?p8h:uul4d@W/X+R*9yLuR=/&EpGhK<Jd@&qV9i/<Nbj/uT@FN:/T=*8
JwCMZt 4<Jdj/uV9Ti<>be/*h?E6@=Tw+QC\%N@1hPFjjTZPq&Jn@=Ty!9%$X@1hGW??p8h46^Hj/uVXj4wL*Y/
nB$Whq Kl@>yW+*!ph@1hPN<hFj/uSnjjTZP6%+H@&qV4iNn@=Ty>9YS*?y$&*uw:@W/Sy>>Je/*e+??p8hd1KQ
=/eSYN @qKu&<XHj/uV:i1n9>Vyh9QSZ?y$i@nwL*Y/!V:/T=%8V?G69>Vy>nLSZ=cwe/R4wd?Wj=Q?HY5%Py\n
Tdy+JP :VH+*u%>>Je/*RE??p8hd11Q@qKuP<SHj/uVHi1n9>VyD9QSZ?y$$**$q#yhp+@?W1jDQ9Q4DPmcjjTZ
Kdy*uP Pq&4n@=Ty&9#$X@1hIjV/?5M?AD4F45ayIj>+%MM/I:\$X@1hNDDj6Ekj?$??p8hd1/Q@qKuk*:/DIQj
mtKKcK Dik&AX*kA9jy8y<@ClXIV%>@llZl%6>D>WZ^GccP1^/GmyLmi>Qnl&Mj/!+WH$?QZ*i\t*:+>&:<LRhD
jHZplb %cVT%?MZ@B+1T=Y?Hq<P8Y&9bC1&VJR@9Wk+i#I15K>pkwy@+pcl>LGI^#yck+4jF&5c*AA45L@>ClX@
$hHXT# ^Y88d1RTi14bK9=RpmH59X&XPM?!9+1QaI&5nPP^::qY^Y?N6bX!n4?F5lbT<i5^h/@ke951@VNC^h?H
4nF!T: 8W&qml?Ne#B4i@4:8wY?#<Vcl5c=<a@*>CjV+<Z\Z>Eu>9j$h!jT+^8Pwu@1mD/iHq?/9X68@<NiuY%W
#n=>CN jNtSd4u6mDu66l\@+Jddu*A&cD8P9<A66+P\l6?w+q8c*ZK:Bn4X:Vu?W4eeZ5Yi%S&a4:DiMqZFD?\C
*/qRZD uS4Hj><6#*Ew!\pe@:Jddm<>SPGh8N#i$<4NFS4D&*bS8j&i!$$VJl8Y$iN1Lne6j5R96HLV+pM*88Z&
=yV6d: MK:EPJB@+Eh88d&NNc6yHQ<Q6>\G\D<H<WlR:yddGPmmD8d+nY/=:a9jQaVnj?&Y#!M*CcZukw46cdh<
ZRGKP= I6<TT1?F?Fjee6/IPyt8+y6ihe96lTiE$q8SG+N%^Wa8N*hRCl<$S!5*ddA/<j?$e6QmS:!nqb5YL?e9
!VheqY ZG:L5Zc\pM6#5X68&*?Q\ph^@Pq88d&E5q&p+k?h:bddW>BBLid+u:9qNkN:1+>Y<aj6:LdVu!H8GE:@
jBAW8/ M4jeStD6/%mtQ<+66?6R^5h^ib:kq68yQ^SK#+N!8$e4N*e^LL^+Q/&hcw6p$Tc6uY4^I@/uqb5Y*$96
Lh8^Qu w?4$u9:qGj*ltBeyuh%:pu*^>QnXZ/I8b*4HuL=?Wd+@&6SJKu:4aY+@4NM@SH\Z?mZ>dq>/@@Aw#eND
LPp&B* d*G<^9@Qu1uFc@Z:\/XcPq4?S&I>iK\56/wc:A&+XLHD6CT/EBqj?VJ5LX/t/Hikhq%Yw?K*\=4j=a4?
QAP6EW cKLjd/tKj^#>^uyPH@%18a49^Xm#ReYQ8k&hkay@DQ*\FS!Q<\%XK9:F6+W/S+N+>HZDXD=Hwp??T5YQ
HD&9C@ l%&4MpX@IQb!ZM*$Q$PdXjGuk@i8+j=uqJNPbSJ6/qwX9\%>w@Ycmq<LQ4!P/hF9<ji8k8=%I>NnZ+d/
XJeI*8 *11^PL9&icdj&?HD!m6*y@AZPL:X?c/1<h?q<QW1jn9\/ZeW@aNjEeyiIFkY@V?Z#<uk@!?y?P*Su>&1
lw^GZQ +9?HQ9nLHI@#D=NX@FW+E*mDm6?h=u5l#9?BTQ>G45jld4*Za!@FVcwiL**S4jhjat*\bpX@>p%89e@H
<9Xd@Z *yXdFQ*6SL@ji!4?Hw!=Z%H$p?i/>h:>S?mK?Hh*hi9>%?D=4*H=#HQ4@eD9+B8b95t64:@lLM*@W@F:
5<c=dL LuV4@SZwi4:P>QQei9<D^1LdPQ=mN=&ueQd#hlY@%:F89j<I+<W*tH/nY?<*w5*ewiJ*?cXd:%Yk9=Qy
KbcD/# 9?LY?>h?LNS/QiIje4>4H+\lh/9+jcc+>Z+P?5l:XQ#?I>%/j\6uRd/y+k?a:Nb:B@1*i%Z<4nQeiu<E
H=qi@L jH/jmn@\eLjiH<Gae#@VJ=%/4:\I9QcA15e*9?QY?$Hk:ReX@bN%d4*jDn=@THZQl%B:tnJN^j<Ra@4D
b6+Tk* uM<jP@Xi%RD?j+T@>\P**9@$pXB/AJTQ%6/@l#HuY!y?**1*9u/CQ8QdK9:kZb%/4\1l@V:G>N8=>Z:t
\VT8Z$ d6DqeQ!^dny@kh#!BI?#j*L19YyZ>GFQMu*e4jht<P^VK9/kBW/>X<=CtZ%H^W>>ZY99/Li@!@F@hd>4
aaMa+8 Ge4!i!4?pD*hi4<Q@i**Xj!K%>%/Q\H>@NM1jptZY?>:R9:<Q$:@*&/>j\t<<a!Kn@@D4jhV\G5@$KX/
m6tVKj H8>KM&eVQC=w<d6iyI&dYu#Lu6w+tCMhPY=1<aj<#iG*51NSq5?1?Kiy#!qS<pbbE@dTQKjm**@W+djT
#LLn%V *+AZuqj<F1J&9e%Nm4=mD\^wm4:de9m6>Djk6Sha*1l%?K&5F&Q5n:ki:*j1yjRN<NmLVL?V\!hqI!Dn
P5WIQF 9KVm@@i$\&>qi$FYibuqnbVDd&XHap:\C1i#4=9PRikuj/#mQ*4i+djTC!E#954y*PH\Y%p#bQtj1Qnt
bI*Fq1 :#4<XuaT^6/j5q^Z+@Bd&TJ<%&8e#5Q8h:&HMi=u16\pu!y?K=PLT#>Z<h9>%iG*5kuk1hi=Bm5ejm8d
9\B!DF nuL+Bj>8w<N9yS>m#HqDydP>!&?qL&G9!T?=@$HdH$@!VDKhH!:A>?+k/T6G+X6@\?qnnqPu=Lhi6LZj
kNE>il 19RuYK+<tWD@<D6P=\XHu1#aC&&Zbcb%a=*$!=hlnQwDj>hhV9wX8&L9\l<=@T9h>N<AZ@%J^X94ZHu%
ESqTmC IjR>j&d=cw/d@yuac@e&^@i/?a>BquqHydQVVt:/<mKn9*D<A&:/L&K8<T/Z=<:PQCJ$G@1^9*H<Ca+<
\H8GXm HQw6=N/@e@\1q*=4>BZ@+QmdZjyu5Ljmu^^@q$9@G8a5@?L+*:9$=/P@jb@ql#Ku@Va$wW>a4ilVL#nn
e>5hub SeNKnF%4XQ#Pq6N?G#bkd/P/:Cj$i=4@VnqH^Y>E**ccT9?+e=*&Y@>d6IuV?Zedujbd@!F++A!Pu?4\
6YKIIn ij&j$L:PXQFVZuHcZeMQ\E6u1jnnL*dcd<Mi#:5/l^M&PP&*@u*aD8G#XFN?:cb#D@nlHBZ@$>ie>66\
6$LhS6 Aun1e$#@X/j>Nn!PQ8NeV9<=y@*Y9\8?QW?X\>=9PPZjEMI+?%eX9<<wy@\d65he@n%P@:>Pi&>aAH+?
/pLLFD u<iFQb%!cDkZe9+FKu:=@#u69YEniH8hG6@H4Hjci<Ml5GF$wcL@&d%Pi&>+CH*DSV\iZi1$>+bu1P:p
?#py$I jlBKa8!6Vu69PBI!:!Yeu\PhhqH@H<mmd*I/n#n6w8EB4DH<T1W#@q/uZVV$RA:=6cJ@+ucuZhS@lH:t
EF4%w> LXW?W<GH?<n+$a*+%k<+u9ml6EQGn=wKQ9tR=ZQWj+tKQ\N%>Y>Fj??6VnwVQpS>@ajnZ*QT&iqk^Q?Z
+k?d<1 =bMZuHS&tk:=:Z?K@8HhuHwMS%DGH:FehKFVn?ES$=\yY&n@u#9qE*wI8qcL+@@uqE>+#6ZCX1TFDlnt
jN>Ntt qE@wY>CSlnu?B1h<R9?F#q9N=WKQuEllNS<9@ijZlNS#I@:SqQP>bV5?L1SiY<dj+u^9tdY%pHy5^D>B
G>Nu/6 @W4J\!4?tcmR=+\S@:$:uQVLyyIMcKq%5ND*H*jVQ=^+F9y4Gj?it@+WjG?%mu>8ly9?DhSQ+y\\+u@$
aTDB8^ H#j>nbmL%c4+q+c=>L6Si+eha<T@?4SL*\%d1<NX@E>ie?t*JupD=+ES@@yXd9u<q5bG1%:F@?K4d9/@
PN:/\q m:qpA<j@^Mq@/a>w#Li&W9F9:iKtQ+jt%NaIHm@R*$h/?nLZ<R=/Yw9Z=8pu46Dm6Zq/#^Nc9D6QD&$k
RMj5/A Qk^X!N?%/1m9Ry$l@p4Kb%nqZ@!ViMMc!Z#!S/jjFu@GYh%SK9:cKnihTiCb$Ty?a+PVn4Wai#QG1Qn4
<%ANG/ Y>^$d91#pQ5EEL>:4b6PP<t&5B8N?Mqd8@t=@N>C:liR:j1jdnwu+8#4N4^eh+?VnukGhcVYM$M*Q?!t
SDDe@e e^*Jdybc#\^>>e>8P6?ALqm6b+c?X8dtb\H/P4YiGjy@\>#9&kF:J6S/b8n&/Y+/c&l<6*dp?GPpjB9y
-ARuup 000d2a06551001202b4 Page 7 of binaries2.zip
w*!:HP Vq<@D>&PPiP>QbH5t&D@Q%BLA\RWAAIACACJXY$qauClFcAtAAAAkkAAMRAAAGN5cYX8hHM9eGh\L&%l
%6yX44 a!>RS%B$d&>5e!>#d*X!a&W9WEhRhG>9dHM8eHB9am=mcY:5ZH8RHMX=:>udp$:m:qaHMtAiapIMBp+/
S\n9XX QW=BM5dtyNMhBmHyaIXpZCul&h&=8:H&bycb&V8h1SVCMRu\S\1u@Ej?TnqJ^WpySLH#D%WYKY%IWndq
<XHhM& Faj6T54qTEkX=<EnHPM1:1F:Vd/9y*8tb*bth$?Fk8P+X*N:Qd@84:>Zj@%%Z\QyGHy\!DcMw6XVKlp=
@LCCY! 58ymYtd?\NH?HXLp@dQhy&@>W6h***+4uhD^&YhZJ9EdP>yLlFn\6G<>je&:a#j%G\Z%1GKcttHKD?$d
P8B5B5 pLj**C5@Zmww6py8:nh$!#dLih5\D/6nJZuL>6:6&:d*:6/>/%:X%K&W#^AlLyVcebE6#tINtCcyN%+:
nWFMH+ 9iE*Z>%+hE@&<IC<V^$#=L9/B\@I\+y>h$*dj!iu8#d<6C64q+iHH:LqkSMqST?w=1pa8wTpVue>hZ%t
B&&/La !JlR#c^1n19tq1GljunjFcih/E81*l9IP9Gh//==WNZXeRX?Z$NdTK!SSD<%nhyIC#t=>5&&ujD:lwDP
iuLN^a BXwT*t$mh=ENWqH/V?nL!4w>PcN5!?A+&>dVF9iR6HSE?p9KJ>X+Y%t*Nd8wF5kJdJEm<h\jMHRqd<D9
/>FH9# =$t1aJTKl+>18yH:TkHi*DKl/aZM6$l1$#DWjpAKLm9aNciPYK#hF^R4d^KT?SQy&%KQSI9apu%#*hTY
Xc<kA+ nQhp@qTk8Zjj+SM&9yQ?WL4Xw\q9Y#mNiLim!wNuG!FjJ$VXC^b:i5KK>ZtLW@aPInEiQnXi56YP@u&t
e^Hp!M WZyM#c5c8A8<HT!ayZFNuTD:+WNH/au9ya\eXp@aA\WN=CAwnk*XB4$iW/%!$daPK:tmCt?liunWXuLl
KyBp4S Z6!IMh:XAJLmwW:Tpn8$Z</BN?Z/VdYJIh\X+65+kP/BV!6++YZ\e8cFG+?wync5=SXdM*TbmWhG$TQ9
:\R^c< IChFk$kdM:=Q$&D+Ppiye=Q^%E&pud>1++*IZWBKi5:Z+&&w^:d?IT%9q/pp?F5JH1bC\eW&t/yX#P#h
H&ci#y iqRii1n@MQIGka+KLR$N5VC<ASYAMP9Vk*&/ht:Jcja1it*FZ6h89@iK88%a:Ym!y69ndhAWA%#BM/Qj
:T=CEY YIduw&+ZQ<u<CZW>Sm?mT^byDhATi5B/pl4c1=m=jpXH*bJ4+Pe%4AGc8wQ/ylekKGZ$H+djDM<*cSSq
AjGMqe H4T\tMc=qu=eL^npT<DnFu#j$q?&!Sel?QedyWpCwd=%TLFkDV5C9@WZXeWpi+GQ4FyW<:c<y%kpi*nQ
q/t@Ru V&bHnRp=%u$Jd>M=bK4D11u1ihZ1/ipll#*6hLJRcl$j+6N:yFAeidwEnw61/!N>$RCJPlB<<@PYjeL8
B&n@W6 X$1&hAn5!<Qti9dEln<JVLEY8\CunM48Wp+^WeNTtuTG1HRuWCtRISJa@9Pq5nXK4dPHdPV>yS9l^%%B
jiyFc+ @=duRq!AnG8kS%+6mu=Bk$>T$Fk@wPjN4Dcm\*h&u+y4CYp:1yXWiAcF^S5b@<dcN\PV4%^MD&yF6R*:
lnQ8la V=d5%<pAYBWJ9W/!+DZ56Z!u:L%:A6+liZm*qhy%<uY!n=8!FRipIYeD@maQt1w1b$6K*u9JG9WZDW5q
>mA=h4 S+GjS<5R%^<Nqy&w%&NMQZnCyuahM5j=Cm#>6iedS\i#S$Zj8AF>+>>1jePuEjnG@hR1B?qcR1%Cu#\<
%5KE#+ /:lXD8JKE:FKGq>KNbbqNGmpZ!@T1GhbStYZybcKFD6NYnkuhJc:ma9$T+F:>XEtWDtmIJ$mE#C@^1NM
u<iZaY 6PFL#TlduM=nGPM^AJIV^QHh9JW>TdpCE:4q*bc*Y>=yic@qQSEWZQeitu\>LQ$kCF<dajWSHESGl#G>
5j%1GV Se%L5!AV#IGFRcM@>e^>IJJXkSiuPnAW@Di=QZW>iRT@I%uX@blpQLLZPIG+XJM=%be1Gp4!?>XJTI8C
HAB?<E ILAGu5@WCTY@8^bpQK=PemwQ=*M=P?hS&Scm$lbDBjZKJA1Z@RHF?#GSK5AeJd9JkE>^L=94$m4qR#1m
$RySCY jEnn6?4K^/JDTD/Q!4aRqZTCjG@H!ahE$ZhCMpL$Ceu+Xd+bcX4G#%Ibpe/1bE^n*A5J/JFwV5B*+kSE
RZJ<Lw mnWCD8lb<tXB\L>qXF8cFuCAGVELc@W1BP\Ml@mILbFae/K?q&DLdI&w5H/Iwp4Ze514FBZymKK&NlR%
S%Xjtb 9HKFSQYINTj18$#WEIC$c$TF1Cc/4eVh6uYXdw6$X8i&GE>DAuwptlQ\@VldI5XcARhDdm6^6%*V6ICD
!>?#WW KCDFjq5RMNXI\E\p\\nLP6m<*$:HGSP#J4:*FhiTLK\qhJ&=<4WpYAX8JDe&ZGt>XWB89AyaGHhqI95W
:Sm#Rq :?Tn4=I#yCN!Xn>?!<*Fd\8Dy5nhIPMk6W48pE/#*L$V^%%e<LW\#wueDVMPYqc68&#V*L&ZwL8ciGql
y>bHL/ cBK=?#*GRZ1X*CGhb4q:N+/:8BBuaX\S8j54^pH4K4qDP5%!>*+eh*H^!eJIIHL*R<dBt19I*ZRCh+QC
WIm89! cX1\1X8jjEm$Q8t\cTN=Xw\:/RP1Z9c&ycuTEcPw\9/e=>E69X:&QA/cECMbHjSi58BH51>FIlq8WVjZ
l<\5lX uk5KtutAS&=yM?qwd5<Apj9F61PK1Y9/!G<\Mm<!MlKR8TqE=1a/bF:IHl=X=ZGnYB=V=S@j5j$ue6+w
6Kl!LZ F\8!d6l!VyZL?ylS%t&%AJY<W4bWYdPllY+4tt:Jl1:KlmtQGTb<q%ShHwa65NWni^^JP\ZB>wR+84<i
GVRbw^ S<6$NdLwh5dRbe/A^/Mq=^WhPb5AN!%5qpiNCZXeNiYTaXqc4nkyk$hat1&NA/j/5GGPieeqtm:dw/!V
H:BDZ? 4Jm1a5qn!mVT!T9=WSS9pnbAAYS4$4LXMXuSC$\bPJ!y&VbItFQ!^&ZdwI&b%lSdX8TmakMZ6nct>8Ai
WBjZ6h DP\m/I/#4qt!1icN5VH\Yuk>nLyVVtln=VFkP%?GITb:tDXjbdyLki+?HhLhe@X$>>^D\%\X/tb=$mnL
wZV$a# %mkXIa?uBdJTLH1GKll=+Em*LTwqNS91&w:+AwL\Vwj8G5wN<I>^:@+VPXi&dRMNWVRtWB@k#/DnCTy=
\nJyGa n#A^W*+cR1Sd4>wW?6!XVcE%A/bytH\CnR5VKK#!V>bV?RQ<@FhY>V\%8Ip?y551EyeuS6GqQMXE>Z8j
tFZ46p jMePRXuTnXhNRZ%Zy1B%k=18YVA@8I:$^CBVX$i:MMkMl/b%%NXGaW4taPFle#SjXBXhhKSP$nJpGmP+
#\LC%w kpBal4mejwb4c?nIS/!6u\uc?uVV&u4l#++GXk+L1*BSYjCCiGFA\=Jy=FZL&m\ZXJmWBi#LNGNyZ+YP
T1um\q \+KYN5iRFXE&XiZ<KE^$ZhdLa#pITECC8X+JqAc^taZtXpHCuTEJh>cV<A$<db4RII4wKlkJ=n%RyZIb
h$5PhF a/Ymc16$dVCNIk+M$eiWD!l=VdeNc#S^IkRm>en:IAbTFCIq^qIc\d#^9QWI@^mF\%wVty$j^h<MIGZK
+?4N#^ T1qWbEjnFm=JJhZE+M>RY:GPY*\N\Ak?a5JELjBa?$Vm=CnXW<d6@WFR#N1KGWSFHk>jD^%?k@iCX*d/
n8AyC: j4pLuqeT>#^+?M&QTD>HV!e^h:w@PQ\t9\QQ:@8H>wlGVmhdKXjBCTqIcWFcA$^$lJn+m*yTE9F5!#1w
%+Zuuq nJH6R9jYB6%jZH8EY9p?MXBdR?bIDbXZ/kb1VEwL>+Xa\iR5T8V:hXpbwqQk9yBSMJSEnjL>8pal$hW6
CFuX5u hji9W<NXywbpYpl9XyEc9kLlSD/WqRhP&F+KhheZB4Qhh@5J%qnbm9AYmnym1Pu@iBIm/S?8t4M<jtZP
5AkSB^ 55tdwjmuXZWEW%BaRqTRdXkBJjCFZ$wLL9T6=lj?e*9$G5KlbT%a@L*^i8VDGQ\b!HL$knKtnADY$jGE
A6c1q^ pNFTakIqYBJG=Z&chX\i%E#\k#%cAX%R$d%FwICI1baW#bVL6qdEbF8P!$8C+YG%b5=Pp=Kc9Fd/y/6t
JwLTDw #P!XGjMYbp#aEqt+:+p#bh8XtjJHNBw\85!G$ipw&lVW1K5V8Q1PK6=E\n$T&IZVKPQhKA6Tb:4:<8?h
B@NEC: lS\kcwGPnu/MMHqdQ1ncE+b=ZN=nYWbiR<y$Q!X8?p^%SDFyXkWMqPtFMb!b@pkNLk9eVm<LjEM/Fb^T
KcFYnG h4DAK8<y11cN%=*TZ&E8pD$!>BG:\H>hYSd/uTFIuTG$Yh=FAkmApCk^hZ4yqEWVJ%Twu#WG/cKZJ+bc
pS$!eQ 5tVKt!$$wk8NIN@ERBw$<^JX&w^8c6ZmbDS%ySthd%Qtql&C8L8cV$u@=RmL@ea\:5@bAkV=6a&9RmHj
nwhBIA b%>kBWPDm4+1bPtiBJmlk$ykWcQ5&5y^WWybXWC61IeiYRlKPcYIj=cY<jIR#Z>yuw!P!Vj+ZynCAYmC
dnd#<E m:mZTZ9&aC#\%HSj!Tnq<C\K>wadR>etZ8XKRbVjweR*$p8E<K#L$^LQ9XSRMD*V&mSpAZ9k?YhPm=%+
%5NA8> BRwGn$#6*p%T5mVtZlVdEdpN<4P/6$FC8bi$JjFp!K=u/%uejyVS<$bXbX\D^#JXT%XMiwJn1@qSZZ81
/4pQZ# 4HyLiEt^dd\BCu54C<?1C&B\NW<9$BTlI=4EkEmE=#w+wTE+KQT$TaG&6ycuNI!Tne*qMdYkKV*!ARPm
PiZG5w F\^9Y4/=<eSIb$9Q>m&>dGJ<ql>LdicuVnRIFWeMGG%$#KJi18qq/qAcu9N:E=b=TLtE:*je!@h5Rb^K
Bm&pQI *iqFt<emj<P@:utT8m%H%Wq9SpwjTy9nd$bi>+I$K>$T*I#ph$94*+^pcAd/9!niC<BLkjlP?k@yJ9>t
Sl/yyw yMTZ^@yu\<Ib<!M=!J:&:dX%wyD4/M$LdQLN!K%NX6lNQbq<dR*>I$TB9ij*WSuNk$n#CNLeIhDM^hMp
aELb#u Q5&&I$ySK+AX^PQpkP4DTQWkW9&&S=Zj+K#QcS4&VTy65PLhX\wwW6t#TQH9PEWwj>/e:Ccn&XJ:X?Sc
bVtCQA ppcNwkcRZ#wCpj/AZjtBbW!<<uQ#F>Fbc1@<EQJ$B#!hk5%*iXQ*/a\$kH<bbDa@&Pk/GBF9DEH*Dj+>
C9jkBA Lwuh$huQ8&iQ%&=q$@Rqw*Ejw>El$yAiFttAP*\>TmN%cD?Qay@S<naE#ci:Ru@W8IHh<!Nl<StFjl1m
Nqylq$ ^E6L1JtRGEMSFy1+nyb1@ty>J1Jb=>\FS+T4:9JF5Z+S@#Xjy$b*lJ9R:hX1NYmR1WD%*AiB9$?@i+4Y
cw*tn: HWld+PQnD1&T&*!<<*\DjQy<HE:V5I5?jb<@l6MQ5wj+y9iupAcl>Vn<@Kd*K@Z\/jPW!!Tej&n>RqA8
m/iWFC C9QjVRl*nW5KVS5mpQG%:pV1W=F/8^P8p/pIZuXChV?R5/86uk^?uXT4W/E/IXMP%nM8@Vk8YbwK+bu1
KTq/P1 c+=aZ/4i:4D&Dw\FDJ\SeWe/h#HEd>i%Hu&HY6iS84aK+!M5<w9\B$Eh+YYB@?Y@:>y/u9GQh#PZ#:&&
1DtwSS ZGF%VPtZL=\>V@^/^=8Lb=e44N:^Ju#e=Twlk9#6XSK1i@1+FKqQZ+4Wy!@X%HE85WLdm#=#!j<LCb8H
lTKy5S VtnY6%<Rb!tw*\%N?&WH@#Xj#=B\uhVWM^FQhknP#KDNEk4#q8ML5VJ>/tXcn?K5H8A\B=N^j%TG++BL
h@4pp8 ?GPbVnXch/aC@tm>udHX+Zn%/6V==R14b%#m!$H^c1Y>PqYbQl?$>/#L&#8k?cu*K<mq%^:5Q^YmH&+Q
$1mEC9 Dp/tYCSA9FJ64$\^yWVcW>/w>TQ@=aedmkQ@6>aCN:IYXB%H^Ji1Y*ph<cu1c%6^LiC+W@*lYRGjI4iA
-A=B&w 0009bb0db53001202b4 Page 8 of binaries2.zip
lqmhp! nV8yhSCupaDnGKW\WDnBHKGB\wuEEc^*\q4A+\nHM?i>PEL^<>nmS%59m9mFj*X+HXnw9HnGJTEePw6%
46Fu#b LFh4Lak#htTC6p?F5yRM1dw5J4HXAG*qhEE=/:ZHpC6%uiu186ulhaC@I*Zh@DhCjRP9a*@cuiQSP6Kn
PFqADq >i@=>Mk9PM#1tVNu#u#QCi4a+C\J%d?dWJ?tMS+aQM6t#l5P^eQ%DK>::cGBX<e%$^X\B=*ZCjw:d%Vj
iZNehF \D4DM?$j+Ki&@w5GPKi@XKqYQAbbHacdyk\!jqcty#%DPYjDp#jnJ9tA:$RPn<He<!Q%JTheh/am>Zal
EuPZ$/ GFE<uW+@INB#?94/D\pVCiChAw=\j>Cj\n8DP5Da*c>@CKu/V5i9b^lMLkuhEZ9V^@hVET6B+Lpk%wqu
+KhiKT 81APm*JeuZ!M>bXwjVycu$/5+=Ik6u<L%>NX4kY@hCWVCZ:wR+LTjCeI8%nEA+NqCPFDLJtFBVV6h/e4
LS6?Sk /qRjIRJe@SBlN%l\1Z@V/i:qaICjZeJq&QGbhclSej&8XyqNIN%bPuj8ZAZ>6CNa*&tQmwe:yL&Cdqly
TFCMhb =@Zu&\N<lhN9d/j+!mW8aeZDjcNV<t@=>e+Xd$Y>^C:GjhTq\hLpp4tFlaZEB8:eHHSQd8BT^L%ciIQX
j!1be9 FX@PRytdt:<e%<ChuREM$QuLm!/J46hRqlcZqyiZBd^Sj!KJJcc@6LVRHiBZ$u<ywID>=&qJ/H<=KHG+
E+p8qk FNXjFPiq%!XlHJq\F?aV<ad>RRbBpNZ*y=%>A198u+SL9jHF4jG*TQujm1ZyYCb19D+/VeL+VKT+<&=>
<Z\y$Z uIkN+uC^RR\?M#5dNInBR%LW+uPBB<jmM#mJ=84k6I*4BnmMJn#+d<bh8>c6$>>h&>u=CVeSh&juPn<S
L=G!5n +I\&?\H%FDBaKCV%h%MpQeeqnNEQ\Pq48pL<e/ZX\DZ>Pb!Ae*k^H8h\k9:h*naQn8l@kiE49Y&>dRnQ
XC\cw@ SHAwH6:di\#lPB#?8eiP8SRP+>mbQyAi\hA#WV#pG6#?nj^n1SG?6NRI^^aNee>hc+yQQ/p5Cbjpj+WY
^Wuy*d ej/j=C:WD/IN<Q>Z1WDAqlTdC9m8Q8@GykLeSVG\^/WCAS+$EJhKH/iB9VaXAJ!GynCQ+j:h*h%i+Hb4
A>*#EA W\F^C5*F>&jBt</4tqVAw<?GeJQ=4$8j4R6#dt$1RPq:I?C/W4Mal?uHiJ5aA6!/#y#k#:@iC%#NAEDu
1ek>QI RJ$AkKqCekD\WwZECe^TlcRA\FPFlQ=?1lC@F\l!khm>kJA1^P+FlE\mJqePJS1%i+FwtlL6#XKFyL$A
hkwB\V +L*486#i=Q/aKmV9BYm1WCjZb=HwX&w9$P!54w9Q#A9Jic$MEAPlAVN/mlW*k4Q>bYwhK<hepV:QdBE?
QTeh@k hm#T\Mi>*5iI>@YCG+?9T>ZkdQ^k>Gn@SnnuL\+Y<KCBAI5+AS?p=aYRjwTI+$c%E+M@8Wy<eVHI*bH/
^#BRkP p/qn+iHu=$MN/8HaII!H/NMGIb!8\dnT^@iHqhBLT?dh&QFl>EWe**jBeH?E@cebQEJ@%j%4?J?jS\Ft
hkl^EJ SA%GeFwEFdpS@T^mEYiWG>F9:R/??SmTJ4?$B\K^&bCjN<IcC1Y#+CaeCCAIeD\?+<MJ@SH5bHA6H5C^
N:ZRp\ 8N9yqWLCl6%njT&H!WwIJ&/+N!FLIp=tjJ!4<DISahc@EFl^Z5RJ#/1DDdtQi%Z+CmiYHEeEj$RV$&:C
+GtXdd 8@KTtLl/BJL^tad>Pb1Me\c96H>D?p*nT*XR+WAkwaG@+c@ZQ+wn$B$=EQBLN*:tZ*:==bZRkWCc@Ly<
$1%X<V DKXB6meE8CTaB:l/eD\iDuC%P/B\kPNliycXcICL\LQSABiFk>=8DB#k5NN^c?FbQ<Dlhm#&MEXRLG&A
l5JEe1 PRd5d&bu8&jb@=TZ#=E=GkXh&NVSD<STHqSbYjD:A\9mXGL>jS#lYS@q5I?Vu@?e^QiuS*ypJnJQk@+\
qXmTRu mh%IjP$P>a?JIk8Z+WQLak!?/C+K?%IKm=i$d<MSVlL!bIYRy?B=qH&:q/DbBum&8i/4ybQ\jXJ/6jSH
BJ/jyS :Q8Q/jjnybQRDnyZVw/VQ9w>\4+uV*4jlQThPuY1ApNZ+q$d^*@kyDetj==l+:5PQ9lu*D4QJcVh#BMi
G?dBwK X!LQAQp?emM<G?G=Fy+8iDce:CP*Xj4IiulIH#!ZHy\w96SHyLa?pu4?\cj@ed/Q4N5G:d<<8QIycQM@
tR^cTF :X%>eF#XhV>99!$6Z6qaSwp6>GLAFll5Wd5VtSy&bRqnDeJ&LMqAR&S66G6:Rbb&X4KF\eM?+>SkRl^K
^wAM/n J\M#JWVVn<#W8PCTtW/C&@FLTN6MamP*ThNMZeJPtuRw\YR#^Gl64h:4:>^:*?:d6c%aBGd!S*ju:9$?
jAa5AH >:^##:*:*4**@W+u*J@Fa6yTM?dym1*#NJn6*&tJ6b@Jti6*GF!j/jVDwS+>Btj%>9a?uAZj*H:YL5AX
Y!m*Z! +T\+t=$Bb:we!6q=8ILL=XY/iaW8y?yb!uE+J@YkAP<BIw>F=D$M@:D$Gd=RaJa&RYF$D%!k!b+<ZAi@
bHFGJ= nn=>?G4q&/aiMMb9i6q+y1qwQEpN^pE#>EIS@5&=pPGnln@@ew9\nVCFZ9!u*98MmF%AuI+eSR<ZTdYQ
D+V*%: kFi%::%W?%GLZSN+4*b&&SZlCqjpm4J6&j/5^5JcnIWM^5KuMAa?k:H\NWQ:^/W9cy+8R?6=*1D#LRd$
\VD\#u \6l#QjT?E&PlHYNkI<bCEZ=/FtMlc%cPl>JaKKy4hZ@e%*:F+/F/LQAumJb>b6V$6eS$Z>/w<:YFG*#j
^EaGqk CaX>/&mB:%WK?#L\9$*N9ym^&Yj&>96m88p#q<S<5TXt$F\ZC@W9MY6!<&NB5<b5cJpj$$NL#P5*#I>%
kIbm<t jZi?&hG%SQqId/k^>ibA4DH6RV&6^A8*H$V:\Z\&F<#d?iC*:WL\hd5w*Q9Keb1JQBNq8G#Jbe%ILk4Z
%:AAQ6 lHDEdMw*thFCFK:J#BdbSbZQ/SG+IMy+Zi%4FMXa%CpMX\M*B!=p\jj1NNi9p/<Y<aW/%c*RTX?5$$$Q
pPIh1$ w#8Q/SSD*:VqhI1mCGMP?ZSh?P^C1MI9CaSE*GQW/TGKedkF$\&@1^#FlMPuXhbT#ap<6^?FWpa^F$R^
Gld81l F<BbeLdLYewX+RySP=8QYua8Py*NSa9\e=6!$Z<:pX6LEjC$KWe??BTF!!4jCYiFLwpuP\*Pm*A>H&VS
FaAPRb buqVE$ThWANSZVM8:#/Yl>jiu@byqA6y*Ych^&@1u1Ai<<!6M@!FpBGmpKE*N&CCdVDIcHm/nSad??uc
%V+Xu# ^%u^QjjcNMi&b6>?BBNIE%!$\Njq^SkIak^EwPPaH<!wtn@6<^kj?YnBHt<1VKH5B<dZCthybjG$65$!
Cn&H8> /SZ<dYh6Ai#Ld:F\j#^G&!Gi@ed:+@8Q9YVaB$NQkH<nlC+mqj>a^cN$\jtK@Fk&F&8JNejYdn\at*Q*
\QlL=n X&LLN&/NHh*\R6>9Q99hYCAY#F4bZDcjLYTLCNumc!E59=\m?IB&=kL>kZ:Jl:G@?NJB?@HRN$KQl%+N
Mq<nLn HTla=M1@BB>CqP=4PaB4tV^&!Dl*eQpVY+&n^9QwejPT%<J#TyHqJjJBw&:j#a@jiP56%>*wdV:e9K?%
J6d\#P y&Q%W#*Q4n:a$:Y/qh>ESj=cc+%>8:*Gd4Xc>:Z8R*TjBdh94e\9!iPP&F&^L:bh5&=F^?KPB#yYi*<i
eZh$ym <%GAkl=HHm=ynBX*FL8LdWY!NN94>A6@:1B&P1D=QVYNQhe*hK\?<DMnMB+$k9F>yj\5&X!u1SmFlKi5
b^P$dy @GPaWP\+#@dGySa&cw+eEei4c9I%\4jjW@hK+XP@+wTZ*+N@Y9qu?am=VJeuLPiiq8i:=@/$hM/djZY8
mVnw46 &/+/DM$<SFSTSN*MS6R^?wnmKWJ&Qu@14d!Il+5VEeJpGDt=Wy:SQZYC<!QWKQKu6bWwj=1t#/DiXY?i
NpCjLj u4Iu+J>?$/aJhWS?R4$@MQFiyQ#GkHH=1+<wj&a=<B&*VBj9Z8B!V8dFhh6lT<wl:MTu^jt*p!hFKbe\
Ccqkn@ K99m!BGHt*Hln>iM#<#DlC*:wnkl?+LQm/M9IB@8C=bQZ5tH?&L/nP!LKd6mqe6\9>pkV6aY?h$ALW>F
ytQGNq mQi+>ldmEi&ahwLn<?a%95JHbu@h?B4uW?VIK:mdk:?wmh>B\b%&E?ZD:?a=uu<D%<>^<\$Sn=#<qeku
=jyuV\ $jG#$kjS#=GVJ$>E=QFk>lH>Aj8IHpi?mJL$ditjtGDpihR8/aF1n6>AwZAa?5DpZQw\$:P4%A^RXWiW
uu@LR1 V=DmkSRQEJ/M=mjk=@tW8iAlL&1jkn/L5+4=@Fy?MicWqVj=1PMyC/KISEw9n%:8a?Hnmp:#^=ZAaXje
Ba?ySw 5nDw<TqNb4#bhZ:Key+dy+6VSSt@IQb\!9GmTCmZq*5<q91I8C!!14RuX4^R4Im:>+Y%1u*k*:46w:pL
P$mQ/t XT*H&qZuji##qe8N=iXV5SjN^/D5m8ZPTdWSiW:6lh5j<BGqeu*Q=QtEZh/M>%D6?ZJ>i^W=G+Hm6I:F
$uJPM% 8&5!Lk:jYIlNP9F#F!=aqqw!5/u!#I^:M%5<:FcjYhE?XJ?VXSZ@ZjSAuWPwKI?E5l:\WRVdyReRGC/t
8#Cw^a +4#A^jqqQbAHGew4*lhy^E^nkiXRLbhyh%!/*$WG@Q@9Gk85N//^IQTtQBcp*yVGk6Idy:!nN<=aEH4n
\T\Adu Gk6YZ?XRKQi=h6t#Q?W>EF95NIy6^nt&nHNW/?9##GFSm*#dM/eQ?Z&&p!<&%Xahe8Ke5E48\cthDQ9R
HH^#H? Idpqb#9dSH%#uIWjtTDm>np1VEtKKq/aPmeyPuG=E%T1:&!h!Z#Z%5*HNB?+D?iINd4TiPhVB:!1y8I1
mb\=c= /5V6<y/DPD<+X!:\KiW8:#pwjt\bFiN>p6i&=FuDTd9E:#t1YpK9YnKjJGe?WIhDLy+QQwInKw+M!58m
&QVmG* WkaXWTh88@hhRMaqA%/khGVk4Fi/bPBYWq=^=C*b$m4nBa:@SK+N1lW>?>\HbTH\C1FT:nL:94@:&KCC
!Z1*\B :9=\WEGZ6B!l<DpYZBaieEcIwDj9bYm58ESSVVH$BtMCCukjAadCKIG:S^%aDAG=Mdw#Q11Q^W9wjKJ1
6m?#Z> jGB$6$Dy!CS*KVR^TYBuQJQRE=uWu8RKjhMiBdl/5<S5Gp#GE!MCpqAjnGh&kI4AABPaN5Pn!cHSqCBb
?T#/VL ^weX:R<t6#P<$M:WWIJb!MTHE5P:>QRkJFJ8X4cwbPP>4G^/b=LN!h+SBkGB$JiN!K6$RMtTedaQya?^
c^:!HP :BlSS$yNabCNDA@8Eb!A>ZR<M!1Sq*C=cjVXaHJZCZ^6X*^w4/wVB#ZGFBpXPKTJWneMP^LnD1qGVGVl
jb4V8S D$MD+kIPSWHkM1=JCe4twcHl5eFpaph!^XXKFC$8WdSZmPJQb^LFiTtEEt!ZEAQD*+\IQLcLeT:LucDk
^J^KFt nBLDKM9AWA:en>RaKXjS4/tlkeHhE95JJB$JCQpI:W5^IFkt!ZaD>?yRnp!KM^\+yMHW/Cn4wRAKnt<Z
D<BdDq $L=Ib6kG:wDp\/pSITayd<pVa=WlFc*6nIQS+eHESS4twQy<%a*HX\Fk?F<#nhn6JcSbBa5qIIQe8E15
DGZjl\ Rt!GTP@GTGEGwTkRnSk9nFIp<QET1SEBw%qSpJGNGI&$E8X5Q8<%Qq1uaEDtCeAL<t+qn^5<yQcdCF*K
^$LJ4i Z6Ct8*WBVXti1wS=uLdNui*cn?pZ5#WpW@6c:Vh49%X:9Qb+ta4Y+cde4mnQ%1^A8DG<GN@GeKPdenZj
?A$HBc Y=BPCX48WNeajiY%K/C?LL\W*&Zlbi=MF@!NwN+yih>YIbXjZIFW*1%>y@cZ?H%*S*ypJ<5e<>ACF?<*
t:ZHm= DMVVw\Nh1RF/tycYDE!WLE%K/q>TlY@q\1LEili<$=T:eBmpMIeK$K4d/FqX<bbTSbh>Da&jY:%P^hBY
-A^\Fd 000cc3febcc001202b4 Page 9 of binaries2.zip
LiC%^> Cj!GT9^Q8LY>bQFG5Ln%#m*h>AeW%lSan&DS/&LSJVGBACP8>VcZNdA9\!%^Kwle6:k1EYDcyeGu8#cn
>WQXVl S<5W41&k\LqXFG4H^5bYyHipX?C9#IGnmWwDXypp4ZFlhQ&pkyR$bXlBKwm$SGy$^AWGW&u:%FP@INh/
HJbC?: GEtL@V?n8V$Qn&awVI@eM:A4RS=6+V%*d8\q4*ddQi9c61Dtk&MDw=?ukLdu*5/NHjC@9!YX/KKI=%yl
eNemIC Hm@m?Yq:#@&d!i6>MVW\8JwC*njk6%LA6/T#jiN%<QipBpda@#=<=Q89la><j/bmaYG@5IXZ4&=W&L>J
Z98T:L lA<RJEjmLW#/Al*D:>5m@Ch5Q59#6!J<WF8E<QhE?Au6XwV@Y+Tj%H4R#^KA:$9cCMJ!!@hb:Z<kyH+S
@9*=E4 Q8TBPP8FISN/!wQ$i6p#l6cJ*#9FR9Jyc5Z9w^\P4cb9aV:>kpyjl>?@WiqhTQ>:XShZ=yW/8>?D&:9/
TGPB!X l>TC$m4<Q1n1dwWu#H=lqtPAyKjEM5w+K/Rt?L@/TSGi=QCnci*4wL?B\>ip6RJc9IQDm?:#+Wd9l6&K
4SwQX5 #p=+L$w/GJQ1bic4u>TkI6:%5q*6m\l@XhEE9@+HJE$QSqVNIpWV8uHDIeZuENI*Kj1Q!L%ARj>=NViD
Ehp$RI Q4&PP<t:FM%@B5$>m8bT<LqFlH@p8X&upEDWctn%hP6Wj$CEZ@D/hX4E?Em+AjT<4FNNy\ku9K6RS9#b
nZ8w>^ j?J:*1$/Nd#B+W@i:M$m@CMSj5d:Fb&cnw4\d*!*/uVh%^Z@j$&Wjq4^n:/w8X@^@Fh<q/X+@qiwYKP<
Q8K&Iq Lt$e=j>C<j>nw5BG^V@/K9Tk+u?@Vk@>l?L@Pb%8iEZ^9^n<*/n+j%&uV$\y@q<F@<<y@9<hjL/1?LjA
<D5B8u @*>K@u$LhQ4WY+4@H9B@XQH@D=Du=>T+RL/uXw&L5\m*1ZGBhn^nT6@Rnqe59*uj>9$RW/bALjD?4?<M
J9p$ZI $e4*SjkhZ\=#5NAq:!>>GEP4BJ@ih*%+JQ6D<T@kQi8dJtwX<9G?=@hkMk^Kt9:=iKcwqVV>u<VjeWVT
linNtX >DeShX\6cj4^H:VlGpuV9=1wc=Gp/X>L6LqJ$RV9Qheyty<l8t?bwwu?8Z?=w6qH>Me4Fe*6SJ>hyYlm
dKKLR: @D:\cWWVa@F#j/Swwu@:ww4tM$Vd&lXN/Pi&J^SN/Q8&H!mc$I*?mKKJQ8u9XnV^j>9@uKIJYjcjWVRu
?>PW$1 mPJNmmd/Q@/Zmmb81D/@VNH<PeI9Kb1@Jlya1Ylm:A><R>HE8EqI@6<P+F+ueX#TDC#EQ:d58*eCpNu&
6Vl=/T %!ZNAPT$+%<p#WAL$W:J@>pA=1LWlKRb8B*V!R?FDujL&?4%8G5N6cZVMmDNpil4FnkBjS*jQLau&bTA
upI>VN :^:e*5+S6&y5ueRXak8nIqVLSjD+lmiZMd?\Y!6@L$=*y>T!SiDjEk=Jm<#/tuJnX&%Jywe#VwG1YIX>
llhHQa +p1:\=Z&lPiymH/L*4%:%/=+bt?>K\Z*w:nIVpn1tuJ1P#<6DPp>dEh/yAdCW*KwK$t6iTR#5Cq#a!XQ
hJ1P6! abt>=6/h1hGp1=ydFCWd9XJKEWb1#!SHS9RPQDIP:=l6jJ/:ThGZC/8MdKHhS@ApP:9p?84pVpdc9/m\
P88IYc 6B@:WhBaWJ*eMV!W9GVmXe4\kY^pjpXMCKBY\SK#=C@BGli@VQKT/8SiCi&6d%nj4c<Z8MdNM^Sb454k
uub#&G RVG>>/K4F?a@Fqiu6k9MbFu9>/*=nep^ZeqT*W%jRbGF!q/jjuh!4*nkp<>?H$t!a:6T&HeM1nJlqdlT
&EhGit JPI&t1&5CXN/%idt@4@/l/:?5b^*@V>RT\MEFAACAAkAmXX6Ja\BKFy4IREAAM<BADEAAABndGqqduS#
:+\RFY L*BueC>6aYM9WEhRhG>9dHM9e&>%etNqL%BHWHS9d&^#LuJ#etM8atq8*Q$FiBXJ%#aKh&?*iAJJ5ED\
dnticS +A/D8<RD\RtB8D6^h!T+E\IpEIEpPMHhBkadbJmBtaEbZPN::?:15/y/J+Tb=*t@:#9Z8j:@PkeI/T*h
weiQ>= Zji>Xm&yZqXF/VqPea\IDk+I:^MYH4cW?n@?+?#mQGFmeKR*@j*d>E?8?&h%!V9p6Q@Ij#p^JaX=V:+J
$uQn9/ @/:*y?l4@TqK$mYEGpMXb+Yw+Q@ep1ElXF@K@mSqP#YIY%Ke$QGcZKRe$u>A9@/D?5!ebPjwG^+^edLi
j?eSH? iQ5Jp<LD*eN>k+QC\!eI1QHV:MiNkV@@4eGHlnqb/J1wN#/Ii#e1uq4EXW@9R!t>Hijt>S&=%MM#c5#I
jl<E+k L%aqBd%ue@hLhq5FejeLi8D@8<LuIdQHWGHWGB4?\uikZa>CBH&y9m14Gjc4?*Rk*?*b6\?e6&e^JXkA
WX^D?N u:<1nymdy@68>^C8L%WT*>*NT8XNCWdn8$E::Cti8^Y$nC1k^+5EDnQIc^W%qiyFG&d*eR^i=lutGPAi
!PSCNM FGE%Khw>MCVA$<w^LNk:#D%R#!ZCQT#CM<^1ZElIkP>T>\kkAe:Wy*!wXPw&@ac/NZFmQ\Y<E/&:^^Vc
En$$qq myyQL&m?l+KcRa&kF&VQ69MMDA/L5jIN6@L&nIn\DjK&<wwMCPln=Snk/S:8cSWBu$WEY:pHBHlG?dyH
QAcI85 \B5?uqalaeFLAn\D4bdEYC$NCA:HJ+WHB*yciRR9nR#$DIwI:&Q%N>^DP5:S$bdu9y>PBmKK+5kj1pq6
iC?DII BL4j\1b9/D/He>\>w!KC*WNC+MP*=Bm8D<j9<HEIj@\iH+hG?pdA<Re+b@9T+DBQcBPRId&uP\/H+@9p
Ik^Cb? PCnCE++jpPM\#\A+@lpji*kGBMQ^R*Ie:BpN^+@\eYn\En<+jw!QkS\QPH=C9lQ8G\9H9=D*I#^>+jky
BiDhLi Qk+Mn5LZ@^Wjl:8V+>@IMZ@8M&njLaJnCY/95m4RN*#yEp>9PF>=El<9DR/JkiNV=Dkpekpeu!dHpSFY
?iyj?8 eH\GH*5El\N8=Xq<:PqB4uPPHAh=+PQ#?Nk*$D5Mnm?R+@BI+EJ=ES<HS9pCF<yL?DnEQS^@@#I?^1lB
*@/Vud /#1R+/k\@Q=XjB\SESaI^>j\eYRR@w:!Pn+PD%mK9*MD6KleJ$cS94MumAG8bPWC$9C$tipbFlkP!8Ii
T&DS14 aiWb=RqK=Q=NWc*CjaInA#!5\mNDRwLlh5C$B?lD5!HSB?WP<uAQ$%&4$+Vk\EA+K+Je$m5+#Cw\PD!m
n=y55B =RZDJ\R:i=I4!MSa+J+GE@D@X8=BXmBC#/WSVbwRBKyNWepW9G6qmnYb@#ke1#k=pVIEnbTA<ECuKjkX
*HHDbM nH@GlIh+L9Z%<9WM6%4t+\tulXqBI+KCI/!Y?4kHieQdPpBLQK&\*QEBNNP#1ZMWWALjIM4j!#jAQeA*
Hy<L4X 9DP?L^^:Y9pG\jX<q@4k8?Q#4L/%CNww>*CQeLeCXjQ5+8\bESpYSD:G4@GJT&Im+L:BZ6>n^JwJ!8@h
ZKaKc$ wjt4<I%9X&$?pTIM>G4^!VIjVFn#LdE>kFaBwDB!d$<Q9yNCN:Ce+lqB4pt?nMZS*AT11cj$lD@tM=8@
G<el4+ E^ae&BIdj@h8@@u8@@HGwpB*j$>nP@nQ!6$1!HPbqTiaH#A$VV$bZ/?#A*?6JtGFpddlt:R+Ac:F/<B1
%kA6j/ 8KkRQ9AQZlwRESQm&Sb@eYtAi*l+E&Zju!X\n/B<k<J>+CjABu<eEK^Vb9iId%KEV#*DiHb$y+Ieq@qG
aLB$lc ?BB5?Ae#R#:*DjKN<HWQ?Mbmm=NA?kdpLDC$IZBB$L!RMI<I\Bw<1PY=Wi+Bpb:l#Yh@?*aVlt@ZE<FH
FnB8+e RY$h+D>inZRpiikp$D&<S=PFdhqH^nl</^@+Au&5JwC\q&AykCbH+N6kVR/*c1pF*!VRB*wVJR+J<\&K
ZhdJ%i cPiI@@?j:l*!n*8QdZF9ewu@$=9#lkq*LDQT8$C#Qeqb8p=QNhqy@1/<Xl1&8C9?nF^F$LL@h99j/d?A
ZEG#uP KSq$Jy#!CwkI\jw%6Qp5@KyJQp$P<#>jC16GMmYEXy8/RM8dMV+MJ^>SVd:q9%k%a6TIkeJYnSbEBFNN
H4!MET G1nZyPBEk*DHX4a\y$9l8NY+wP>Mhkkjh^A&qm+DPwT?RS:SRi/Bu6D>QDEPm5c9JQCbS@A!Cu>HN5=1
ZF+P/C N9?KWptYBIMLCchCqkS=lH1ESZVBLTD98aN#AM$Gp?<N:DVyMu<bR$yP#LI:lB5?T\PYLIF+6iQEaM@\
5>Lp5F F6?^<8GFT:+Iq+!GAFAT+S5B4cJC+Qj@hA:=t6WT>#A+S\!jiEcH?HyEa\61VlmKDF!Cnd%Zm%PBT=qZ
?j6Gmi RLA:DyWw**C9AH#>X9?<Q9pGnpVFkeEi:kEl<D@?u8t$::=FQ5QjpwMkjYM^!yC\<Fn<VjQ99>u<Pj/&
L6#FbY LDa+PBC@kQ9HB8J96@:?&$&ja!d\MYamNyJ<$?#j*@V$GGNImdD\1BD+*#emP1I%@kyQ#ujkDTpy^BC?
NA$kV^ 8J*\t!D*@i=/8p>JK$QA?bG+FL^<8NQEpAk4<QhAb+CuF*nP+PA\D><kh=$Z$*GL@<mcPkYFD^Vn4Ca&
kSS%y% 9caE*:jT+q?6dD/XpkG*^MlR9n48B$=%D@??$!*^BG9a>D%\i$FL?Z+HZmCC>MKtXILGWRAqFMb+l5M@
$4<cY= K$MZ4D%NwWMR6F5RFE\FBX6btW\MJuFBiI59CN*D@iGjXh6^<B??jCV+mPbAR6jj1hb&PIkLkFnjM#k!
P=a*PM *KwyAk49NT9eE\J!HERFSikCK9e\#/CH^Gc+B<XaBbQ4lPNImeLSGh>mTSkP8!IGPyNjLi\n*BA*kwSR
58Jdy9 $P*k1kE^81kF9wtVKcwyDt^yX\!@ue=j8WXmySj5+SEP6@C\kmk$jNlMeJLi81b?C+!k6TSHCG?K:WmL
dP>\Kt i%p6mY\CSDuAbWkWS$9C\ck5nYnnRu:>S/>BNWYm@+Q%+/?Cjj&*Q>Kbp?dM=GNNcan*yMq<A9J@J#>=
JW1Qm6 SCuIP%t$qNyG#^cJ5Heq:@nAP@H\nkRe%qLQkP?TZ^FF9@HpFb&1y<#yBdwQ4PCeRZCPiBJ8QZ@ZpjCi
WkIC\Y I:\uuikb:l<SHMK@&+:Tw*bTZ*ZuTiCXSjP4?dTEYpDQPT?kqPV%QpktV%G^In%RI/5JAd+lT+KBi@+/
qqS<+y JXRGXWZXmjXhjKDuRwdH8%PMVDwBuJG:h#D%j@iQT9hdDH@^H&W#n:4M9@tQw5Y^+L<eK@:L5j!@jF@+
w<Iu8E :SCW#<e>ZQ\<?V^=cR:yeTW>RYD<4R*C6:1Dp:44@j>ium1R==j@VZpPBHui?A@!9Qu@8M\W@@?T&Z?S
4!kYlL $=8tHl#mQhGF@#=@aX4ZIa@wL4/Za1mV6G$LAYdBP>9kuj<tRC>!&I%/V\&quZRjnIF#ZPCeqkKeD?<F
YKPbR9 \*9jC*ApWHiYi1W:4\8<G6d<KydTWuG$ZdMAeb86cIh51TMpSTESI\L?Z!w/!djDCRHC=\*JLWTZVK&n
qBnQ1C J>H9Y+n8ui=kw9S<l*=nbEtmJBEukL<wBj/Pa<a^HS569pmlm<LuZ<a$JnFJDIic@8JZa^w:pM<yKj#q
@#^1I\ 4\Qje/6%?C94aqy1mmA6Ni8m\%>86W*j?>?@n5YZnw&+Bdkq<C%wFY:hGFtHj9>u%#H9b!WLcS5>ppqE
?<1HMe <B&EtMVwpTF64YVt@!jZMeWPmMJey5BQK9!p<T1Qk*bi694WcGw!6ajiL^5$c^ab+t5i>JMNd9GPB<ZT
JEG$8T 6dIl8uet@!?GAd5$DRcDh!jnPBCC^ISHiAbcLi1H</5ACNVC?lnAGa9?F%ec@i<48X9b8T?FBC++*MiK
ZR1u4/ yLZ8XpPG>S9\:eI+8%n1GS+iVJK&5:w:LKPuW59y>P@8+ENub?hDkBEPIRZp#d1IBah@#deFe&?F+*k<
#D#\^* FwXnptY?+NpkTLMKDwJI^<N#cXlMTAV=BM:&>a4yw/iuG?6eGl\W+c+LN<nqIZ:%^I$pL!BTdSG&Bu<d
-AT?lE 000d7006ce8001202b4 Page 10 of binaries2.zip
kJi@%y Z5AR+CNhY#AC9@?HPnRN/mD/X@j<49Q>j@^8@bK+aiQcyn1IHGSVX1j>pjLH?T?9l#Y&yjR=Lwpdk:6R
66<RMX a>IZD9>6=JnG$XRHPGj^yaF<nKac&N?wk=FSB?4TRKP9SpbjDFRD^?CZBqVNRHlJGcn8DP\Qb*^S*cwb
m@R#tK !MD9Y:h?H#kTI5Bd6=@XDD^Qei#9*C%+k?QAPX<c!EeRK9\N/4^NY?8&ZI5@FH=DCZ<+yZL\+MHkn8CN
eYNlbJ KT%i\nitYE?Gq$4!p5J9VeHj+F@C/=+>8euYa=6j\88i?B8eVhQHQZ8/etP6y@C9Pj#T%bYD&>1R%^!<
4?VX6$ +DkdG@/NymCX6IN<w@qQ$^9Shy=BpT/?*8Am8^um+$qBT<Qk&Ik@h9GFa&N<QNHVFTKedmd+&AFPkGNV
=+^5F> ek\u\LGb:6kFnq8Sa#kBnq9n+>t?Ijlee@L?PD!Y*\$@lPqu\BtP5$y%Ep&ZVVSM6Wwbi#:=NhWIH^l\
Jtn9+Z Hd:J>R@8QJjMpji^ZJ6ne\MnZ1+kXCJZA@/qAjZ%1$/8?CYY/%h+TiTKFRQLFahbYK+<l%@?1b9u?jhd
R*Gkn% !BXiCwW6=j4Qq^VH9&\l%^a9idt&jEupPqn*5qt88yjj=Ew%9idqTu%:@i*Fj@##689d48VkC^XNGRp+
F$YIMa FeWliDXX>>Q$Cj/#m//tYk$dQ<*8&@6V\uJCjC1Y?EH@XDS@h!8?eewjLe:qi&:VNR$yK+nHbQ>1T6N>
=Ph=e+ <P?^6J^d^LqyF!M*blG*EC%k=/N=:F\$l=*N8cJb:E#PlZHtuFlH=MDbM*c5LYQH&TMH^yF%cuS8eGFt
RH6tHG Tu&<9d$<QV&Y$p5>YE@Km@YtjJA9=$j=w\A8EAWJkpNCWCkXl5KyCBVJSXHLWDRXk&K=PBSQJ!TmJC+b
n$iW?* ydCyKIXLbyP+SC/BmWh^tqktymGc8/B*@8#bM/hQu#q:>6!FC^e9Dd><=i1%/#h8*4^%/@chP@j8*Z@\
KbaIh* </NHV=:<<9VZb<>?@@*QF!@@?99X/#h9*:*@<QHV=!>j1&61/^wc%G1NqtESMtY$GuXnR$NhdY%N>he9
*k=hwP Z#=@?9V^+\j$uu8H*1I*/LZ/FW%V@=EI=Mw%E<E+ewRI^yaqSGmBmAdu4!=T\5FTD$<EHCB9:4>\\EX\
HJLKSb Pk+++IACDkRJmWACBTR\lAVWVII/XwNJPK9HM*AiM\AEDQpZA+?@MjDm4:>i9j1ikj1GSl$DS1^Y1%a*
JewBC8 NNVZARM<BiknSTlkkRIYKKAc&YaCtQueQGa8N+eBViBtMWAA/+#?yRtakDwkRInS6%RAD5BVAJ+Lyy4B
CJLR4D w$lB%DKhAtD\ZALX4AF5CpW$ABH\ndFja4nVip&T9*#q!4Z4%:tdA*:E8P>m*A>=*L<>i@::H!>+$d>>
M@V&@E ?@:>^+?j9u!y41:Fwt<C*k1L@u9kYQaE8jc6FyC#d/l1dnEH!NFCDyBn$jQI$ZimS#4SI+Keej4dtjNA
Qca>jC uy\Z=e$StR9<@Q<H9ij?Bb6LlSm=ljJ4+>t+%:EGb</iP\?wL?u$@Wj8X4?jAQY>B\<iawX@?9T*d\19
8CtMiI E@hHLG/AZj>N+$&I9B5^:CdeYPLeB@a>i9j%LjiPi95N<V>q#TNGPtXuCGI%IH:qnQGmFtm@Cbu:4&lb
\&ZIJk $HCYCJuVCXpV#<T>B!6k\CP>e8Z1ha#$%t&C>B@!@ZjZ@mbkLRMCbwtE9$Hq5Z=mAi!u>?kD>bF/@:<C
b\NPJ\ my1B5k/NnuXPnHPhE?ew<QV/Q\VLjThcDJlJRkC+Ij=LuD1i8<BhWncJ>hd6u?:$@b@BkqlBt*ZhYChZ
6:HP#b 9Tc$QF^W#Z%FZ:nQCJRcjiI?k@9<uaWi@J@BIy%W6ZbcY!$B?>TS6%me4>D*j+tSc^awCLIFSm%kbBLi
F<HAkQ ^nMJKNHk+1YYCP@i/@MjESLF=j54NqT<QAqEFmqBhb5k%1Fc1waFpP?@eF@lh\%XT@*J/Y#$N+C+w!Im
Z^w&Vl VT*y1BwA1LFn:dWP:^\%Dw\>IucJ<1Q>hD&WDt=G!DddJScp!BKn*ITRT?NTGWCwV6Ip%mbwEl8VDJPJ
>e<8Ty PTJYtP?YjS=kiKSjQt<&\&CPtmV+HV+CWAw!JAlSA%hQ%VG%CNRY%VC%ZB%Zn^wk8Q1qTX&@PTE5RT$B
1Qi$Gk mAlAnc*cVt%j:hBw*&Au6QZ&AZ#N/F4/uP<F!BIq=iGlXCwNyYyV&PT@p=lpVaylcuM@%LpZ:lH*yCj^
8cLkNS L!%XE\\6/alEN:F!6wDG5TKMVaQWXCQV\NdZ%:H%&kc8Ecp=DhLTDE9>LFm++D9qSM*K1ZWWPe*$ZbdG
b>^P9B yI8Tw:!e:hT&9>uX&>J&AE$I!luA@W5:t&VZBE/WEBM?94NYL6L9Nm$!EaH<WGyD!6jp?yTGXC:FwIXc
w/XPEy E1*5nNY!lh^$QW<HD\#N^&iJ+%YMWt\&bjqj>T\D<CmG%TLNB+DDcAYAYIMELMNRJ:q@^A\M/KPY8E#c
NVC*5h Ldw/uR/dW&Ndc@jX66=PdP@4/@hQTdG/45aSMC\jIe&#4ydVjd%akKFJ4WtyVqYuwGR8!iB/e\n\kASB
H1ceSG Hd:4ZFn:hCl+>c5aW/$W#LuPNmLEXnPIdRAaHIP$IBE%*hlAHj<tnba6S+/$h?1uhEG1n>$4&^w:^y=^
%Y*yE$ EDq?d!VaFn4&4iXeQD%X:=Pe%y8AW6/q%wN?canXN@mPi?k!*NM&*%SLy%8p%\D:u*PMQ!tFJ1qa1:+k
V/jYX: $C!GkRc#wFb5A%$QbkFM\Ru&8+b4hR$ZPL1uNcSVGZZyhP1m9?$$$QBGS<=J%#8wIK/FCnY%uhY%ub/q
HbWAL* imiuXR5?yGml$:P/kMR\>y?lS^9iC*@je4:y8\*jKYun!m>cX1NXe>Be*Mh^i%E%Bdbc<QuVS?wEy%PY
Qn%PuW d!*ZRM8y8Ib$LwQK4EtuE=\c:B45NR+N+Ha%#u\\!RWJk+m?<C%uY:Ten4N<JchdS*?AN4QkZ%EeE+6m
9@\R%X 8GkDubF1DlW6t6yN%L%q\@8<W6Lh*>a*c1DBZB$LDYbJk?Y/kPu>i\mY1c8C?jPAe::qTNh!5hQe>QTM
q1la$B DA$$ZyCbqhEI=LQyhKbV4WM6NF@6#EK8kLYG%iq:!@a#9Q9$iTGuZB5T6Rq1cL5Y&5=Ew&Z\icRB4#F<
+M6q=@ <IQ%uH6tSqTGb@+dkl5%Tp4%XWpXM*Wc5Km5#nN!8nlZ>8:6&#h9Z4>/>Vj/m*yJZiG?R<ECCyFjB1BR
MVu\wn /$DWyA5!e>^1HdWR+4M8/yqwFplKy@pe\eC&\IBm/NmJj<myL9WR^Gtk?X4TjCaT9lJ8$KR=BAFwnkJd
H/@+lq HJ*8wFe!AkE\yFaVBLS1E1yGZ^uTiFaZyKP*>J9Z/JZi**@>>jLqm^h@@9H::<?jQcM8W<$\&FpckME+
mVl&RG $*/k?TmD#kRIww#MuGXVGch/b\ak5LNaX?%5dk/u/:=WM\!G\NCCKKn^#?Y$$4eSIGkIBC%AaMLlc/Fe
\NSt=: CHhQ4\WP/L6tQA+ClMmCIEu<ZTqRGh%tIADnt</>wcD6FGEi9VDRNj/*Z*>>?9TZJ$<iW%e^Bm$SlZwt
n#%XSK ++KeBd/bAILL+DK=nNy$eWbtXt/WHRMkGkEEe6ZMb8hw=>L#hMJkY/BAkIKc<J8eq5*RSLQLEIkANdej
K&C%*Q BdNBZKBBT&GA*Z\tdWIB:RN=mAtMqPhKVpW4<*D48Sc6y@@<A@%8&4L=n^+>@QuBk@9*:qFZYaKDBS!N
%N#hYD M:W8k9pb$HwiSX&/FFBp=/\M:<\LRn$d#hHMSjP$<*pRXCkYB4R$Rl8JAAaEJE8j!wY!DqEkAk\BARRW
KF>P^n \lEIdADu#@pb?9JAHneBiT+mTNALmpBlZ*G91dQQqc!KXw#mY/@+<\>MQtp?it4&ZjQ9*4u#$?%d6*/<
*c^tqE TX%DkANIBy&1l\=PARwG#BLK\PbJuythp:N<:T#ZYh?nYIAYwpWe\eLy5CDA\pc^!!nFW:qAIY19BVp\
YYtWE9 LWAkAAHywk@4dcAD$w^EVJARKP^jHEmF$5NA^H1TwhB?>M#/N<#?j&:@#S9Z4%?:e8Z!JiwGB$DWAITb
6&Hu/& XViVT1yLb$EaKA6?\EA^GdLMuN#eFZudl$^nhVk$BIh&EZLnFqNBmGABNASLI&Cl#H/Se\yc&B+SGE!#
AptT8^ LFkCA=InV?RldeKCu6K@@wciWe@S:\IA\::kZnJ@Wb$@kYdXKLW1yb=wSDME>MDmG\ai\qYM+hKFC?jQ
tcPB!$ wdQWQYw8C%AaX!*wF8%Q8kjKFIFKbYilVG^\8R\XGPE5kLS<>dcn:ce!#ZLBiDTR+ZKLSEHB9AWGVNy\
N8n4hT N1Ilpl4:BBAJXQS+$MNASkiGItBaV^a!ZJGZ6:j9R@SI&AITB=C+Q:k@6RCJm985bFT%<MQyhVTpp@/D
Zb?neP MK=mIBe^p4Nu$Su84BAT9\9WZR!yeddY6YEYN=PiDjaK>^X=Xub8Vub&XtaGpbE<P*j=muW:>t@8QINy
HCHHBq B5PQ%PAktR6GBA+dyk:Zknttk^XQ=HKFWmWZ#QH*>&8YC\?F<>d#kinLQ!A\KCkaC\p>kXn:1inZ*$Du
iIpYLE BM?iQ&h?b@>k@/Rj1n+4Ncw/WDlLQZ$DQeG?:@WKR\EpLCBSamR+YehJD*YDuXM@8>FXQW5aD5*HIqLm
@6?wP> V4<<N!eHA!J+5uKY4>!\<$DyAJ995jCDL4\>R+CuGp\BNiC^ZAbkqAKlL$V+LZAaaS\BBEhwcFl+iGSp
1qn\uq FHyE/jB\9*K@We@ab?l=+?@W@M@KSqW>RDEGKAameR6y<BBM9pHA+V<jyXG*&Dp%5&6h1hpI4Bj8>*1b
>*RJE: wFw4<qaCtG\A^+CQWeI:K>juH>mZ&<?JIPFcINFCaEaF5!AhNqRdXl6Pld!ZW+1QekuGw^D$SASJB!@9
M+TJEF d^JyR4I5Pma&Nm+?ARREmLljYEBE@ab?1*6GQjt5dCBwqIBGZ!Y$J#4FuttLS$*+\TJ?tJCkIGpMtBd1
cjlm?< DnQu>Y^^SBdY1wb$k\!\ae6Z4h&+Lt>qdk/<y$uZ\&>lQh6ZMMHiw<W+GCISJ4lNX^/MP4R/nB4$Ra+W
aP&KSA u?V>MBTqTL#I$>MdaAAKkBEekqFEjEPStJTWuJKcqwdS5IBG?=S/Y9P4\F&q1wa?R?qyAR>T>eLT$ShL
kHQ=1Z K5?&HQ?=*kTE^EApmH8CLTV%TD9u#Y\8S=ThCal\#KIQi4X/*bcCdS9Y454N^bAMCcRN8\:8*=W>hNKm
l8eS^= SR8d^@XRe?JFBVNk+h/FjkAdRCtS+w8<F&BTKYXCe\AV^IPJAJFEA=m+?QktLPtbYK>#e>En:4H&Cj5L
=$L?lp >dVlKj#@BAEtBHbAwK?u^:dAySV%clwZcMwCeFD/pDj=9#aH$>S9/nqjbnN#^A8ZL+eik#K$AM$a*Q?K
:k++kn %S8&:5:j6G:Xe5AGaS1d45L?FCSY6ujH>4Gh@y*DMM=e5BbmuPyR?N@#I\mMA+BjRRiS546CKSVwqI%H
^Wcw$B BqJKVkFp/jm1&YBCX/^eqbi*ik*:CD%8jNL\BD&tH%%p\e1^kI:Vy%1k$>jVF\t?k/X#!d@ypy8t#QI6
i<RCna >iPdPe^eWjTKFhtbLEkN>BCp6t4D65*4X1*IdhLD#K#q1#eX=Y>eE>lnE98QAR+<k5PA!c5N$RcnIM4t
451=l/ 9b^XjAdbeWyPaT$XDG1TEtD=J1RXK%hmKG9Z4X?@AY%WQ%I@=l=4H1GH*M?WA^aa1$J/DFk:yP18y/?9
MwCal& B/b#@4%91a+8$?GHYjtBnjejQpBRjRQN4b6VQXieniGA1NVETGTD1Nc9BVHqjMPV8*LDu8*R%^aMcByR
GbYXVK =:HWPc1D/+Md\i>Rl8>BRB@qZSSKyWIlF+5Vmb+ScSAE1=wSdN!+cVQcI6m/dS6/YQiIiwkiwy?bB$L\
%\F8iY PSaIwtiY>CkM^w1AWWuqbNT$=TDGK%*PABE1Q&b&/5%ehy=p@w1XQJLGhH%<+>#qaP*AeGhqNMq1^d46
-A9\P1 000a0c77261001202b4 Page 11 of binaries2.zip
qu/?\I Y>c6ZnNyyPM5*hA\B1F^WAjXBLERCd\F:jwky^YkcG*qItF5bta&NH@=Ttl?m>b9&dIXdbN5*:Enj?jP
WRYIc4 ky1j8Rj5A?+?85jhSZewQa!lAjRM1T#$wBPyXGLSLh%+:%@N>LQReQTb@RIyVnX%>QNe:V^t95S4^a1X
eEH>!t PXppTyQ^5ib!QnSw=B8@e8&&#Y9#Xm\iQM&FnPdnlt95%WEccLwGanHK?aGeWZTXm+YVqtPNYdPtSaP*
yXctCQ dh6PGq^R5G9Z:6%:Ck94H1D:%D&?%h^QRuCRP^lw8waaAFcQW?qJScHNI*%aab1cnIj^&F41iN%e#V#%
$\e<t8 jG/BLBRcuy86e=k!aHp=%y&Mi8nmYYCq6&>b9&4=&kGnpFM>cdHGVl&pJT*G$TM%?ti=X5HJY\9M@>Fi
EnadqM ZZQSdlE$6&k9&peZq:AQ&Q5M6Jt/k?+wj41N*V4&/=GM/k5EbH#VpWw5:NLEM6jebH=+nt8kLt1l+a*#
&@wjyH YalFbLE4X/^ckb6it!:Q!M%\u?iSt<Y*QDN*%b46Y>c8#E$d%qd61IX&%>myA>Yp%R\EJdS*4*h!Twap
^N%5Wq u/ALI:t=WQHQllPced8F^TWqycmM*u>Ae\@hbi@RQ>&td1Nd<8dk!kp*u%N^Wp4&BTAkaF?tFBqCW9@y
jZ>GQL 5$=Lt64QN1BGVp*>yJ:ZRBC\m&TywJ=aeRCDIK=>K&RtcDWX8@e$FueD5E<d\V4qbM%^h\RaYwCl5iWC
5mK=hI 6REIwCACljYt9c\?!Ctyq1dGjCF\PAt*#jRjRQd6c<cB!1pKXAu1e=i=I\A^wF9Wn?mt+q9RP^RLk=LD
!96%FR Bj%+l\I=nEVYBIWqWJkG4yFXI\&6%XB@wHu%BI>&Eiet#\BE1+lG%cjV91c5tel!6885BAmS$*Ca4J?b
n!1u9? 9Z#q&6Y+d!<hQ>QBkdG96c8^%iLR6^pSn8Ry<+>!T5LRImXaIw89aGbbiT8JcNW@IbYX<anaTuFFiju?
^@kj+h 5qIYikS%t:$q\lK/\X%Z/qBhlGDFSk8^Q!YD1=1AVi1CP#wF%qekE#@B$JBPTq\nw?a$Mu+k9K/&l91#
5LWh9L RaeQ8cHFhQyK6E1$Ak86Ib%PMtdN1Nd5VNwq6SGmMn*\qt9AAGju#B:6cG>jb@jSqk6kRi&wF6k+D<FT
*5P>#m D<DH$BJJBnb%l6Xk8^m=wXma8?e@INP9KD>RXqyT9G>9WiEiInH8S?+tB?Dwc%i=K$wh84NuV=@8mTNu
B64&k+ 8Ba6Wj!G:Xc4PklABXLSHa!NI6la\Gck%iAHe@Zpmi!un^@iW??$#SAbCCWX1T9A/pPABmGPPy*PHM1a
cBpmp4 CTdQhEHP%AIMW\qCZA&jb8i/Vbmm6u66m+WH&YS#\K<p#&R>9T$kH%AAPmG$KAleTh:1CB/49pRW%\!#
PAaW#h 9B^RtqXk<YGWlZ6&:!ww!N?^HX5IhFQY4Jy/85mbQJk>b$P\m8DK^%:?BV:?JMa1qItQNMM$%Vcl@QIb
EB9pS@ RL=:?@4X**?>yBw+\Mw&a$YLqIp4X/%b9YwqDkQAd>LbudFRpVQu^Dp&+6\PK?$c5JNb8RPHVEX&L&^=
K@Lk/D eXLNA8YYKn$<eVn6%$tHYMDTW5t19DX4%/@j!EPYC+VLhYlSbi6ttSK$P*j5&L=6/=dNt#cmt?De4<8c
^?I=?L 6XcQF!^=EH*^$mk%lD:p&kw\:unw4W/yXwplD4:STAd/Lj<N?c?@<JDX5&i@Wq1e\&qI&RHull>X!WP^
^MYjuB h%!JpiF\V^A:&STb$b&h6I=Wk4wJiB+Pn*L/nb:?8!$iMIBM!J5CEZMilqnEBDTE1?M\:lw=LSP^6K##
>yBCaR PuAGaFI6ckl!Vmnak$H*+pH9&%hW8H6*\e=<H9QGni9Z4%8#b9W*C<Su1@##h^KRR@kc$cl1XNIKCW5L
eMn:5V S4\uHw*1ZA<8n%N&Fw4i1nXaw*ueu#:1JQ*m#>>@j@dd4$?jQHu$/Gi18muq+/F#C^V#q?JIe#q+QB=>
Bd5<@c W1k^M1M/c^%yl^k%u#>C@IAha5DA/e>6t*Td<#BwCS#C>MYjAdeWeHjh8GuLF9Am*V:JB$8E15yKubAB
!neiW8 L=E^L?INBG:i1yW4q8i&RE#$Y8<dawnZm^6XDYCKYXw$Ek>9w!@WD^l#X/XMbITLKuk^<%J??iKQ*=<@
l6PZhP ?@ZyL^n6k@9*:6:=mXJ@n^lBwC/DtGkFTjIbCPRFTVFYkLpLetRhBCEb/SwRPa:/5Ebp?I!d?N\YER%9
K8KI1I ^Shb6ARNAZ!WEkMZIF4YA*#unl$:C<bm+CILLGT5&LkZd>8GMc>j9=bAllR&F\<\bH/HGpD4N/G?Vl/C
iAhqEH GckBPc&Ac>NnALj\c*Y%Y\PwiqiqZN!^Fq86D?@j98GFnFE@ij#w+aMHGQV6Y#?Cc/aa>B%$hn+%D<$X
iNPquu bPVpwl\8t<:KbDJR8mA=1k8k:<+/IH9KS=QBbcwkARG9t\6^y@jkwTB#I8>YLcEH+dRMb=m^lp*wl&Dw
Z?E:qA 8*d9tWQE*yMk*$tWY!h5HnmRD8a$QT$%JWYu+5$c46<CP1Td=5*wBT=j\P$Kct4VG5G/aeGQkt:hJP>u
6DW%JK 9&F^/+Dnwc94%$GjLq&m^aJFd6?l=\A>N$iSqJYXDSAlF+epCBMRNk$/jDeH%y/#E*nkN:qMLp8bubP#
ZDhat: alXE5NqP@ecDClADS*t$+nuA+\X<ckweRQbtAVSISbkG#EFl+h/qRINIPK5FBd#5X@Cm=^qIVpyMmQ?P
TccIRp A/BAH:LWt#h^Mpe1dL4^NEkRLZT14kd@VNi6XWPE*qWyEec<$XGkp@*>i*j8<KIuDBDNw8WW5jBM5@bn
8RQZ6= E6B5WVApSypMGa5EEqJCqpLkNeViu4EVLRBtMlB\\GW4e4D6A=69N^4*j1BAmG%<K^>jZ$^BeGkwHttA
tA&K=1 4A<u5CunMR9RWyudd1Bk*:/T=E@!dmJlFLF\YAtcGaAdyAED!WqJmjH^edG^MYjQw6QeYSpbCeIQ8I*^
&!FtY: p%Ke#=IunL<EKJW1JaP6u%!GcCwQ%a44/85dV11$!u1kRm#c*$IViBy+SdnMl\XA<KtV6B\6Sm*/Ap8I
MH^liF $HPh6TknI^M!qE^iJYVyGTulpcbtbpM%hkJ:5BG<NtDQDSFQ44jLM%5yei!kCK%$lpDZG?JI/y8YHwCJ
/\D!>* kIdKQIy\IFNcXwKhAA6l/eBtZiB:k$+X9lESHd$511ZN^^%Cu#^69W<i>EQRhqm6yIAKVkE/5cG84l+%
MbmM#? CB64XT1GWCGV/6Vlb:=D<N4\nacVJ/6PHD>PW+LFd9@wGAmQMe%CM^u<:IaB+!BJDR%8BVSw:aT&hn\Q
LQGE\Z ZLaemMDliEmj!eBDW&>wlZWl4KW8yKdl+b<tH4\l#Cp4P%Bi>quiTT1W@wMBZlYkL&AGMAEw$nCCh@cZ
ChWiHe tww=j6Iu!9ARqPHyd<>?@?QFb?kXepR4N8MCkEc%8p:HkF!w?A=?5^bkK*91=EqAj?#w$TP$kQw9?DpZ
49A%T4 qEGqc<EKaAwCEq1dta%Ch1!6\C+:t\WPWLaeD<?AV@RcNlw+cHIH4akc/A\CWRPT\/@EHEBDbVGqPQCy
@^e/Zb 1D#\YV=EIyL4P5N@WaHI!In\<LD9@eGhi@4aIlAhiA/S:X>@A\h!JSnIk\$p<BE$1FT55p:XXTbT<9$A
Y1/M5Y G<Rd%/>>p#<RWMWVeQnRIX4GLWILKeIAP=ic\<+Y8M+CBmkIewYy$Cj\IC6?imVLVF<TCn!MlN!L#5qt
N?P\/q 5@RBGBtp\nVM/D<AcQDVGaVYPm*AjREQwYATeNC4@$XPT/TIF5XkFmD:\n!IlXd@/kkJ@&RlLJT*CW$t
^8XyXZ +j+Dk+h+VKYJlXh9#L+1BTwbpE^XI4XIw>X1/qpXyc^XhSYL?n!+h?@j@iA:Hk=YAlQ@$ASP^\QuJA4J
YG\d*% JPQNJBkCw=p?#<Hew5ha6T*K=4IM5kpLK=c9lE/SP&:TIGBC=^<nYpjmIhn+?PdiRHla5&:WF:qWI1aq
Zd?anw :dI^D+L!A/ZAlFA=TceNth><A^BBiGktI9RK:^%$y9HlI\P?P^AiZ4>>>*=^uhJaBebTJbZADT/4NSAW
*Sy#b% N6bZj\atXN:j>IF+B^JWu!L&wJtITq4@9@HAPWwYbiL5kD#FWwAD#W=%/#6+$9mJcq58%#kH+%8^G4S/
&1kDAA Bibm8i$EdCD+ICq!Yi9w&FnTK:=na9&G+C>!5eT+><T^G%Gq1KK<4LSaLWeKnd!DiS@jFt4^#V\$/RWK
bH5/Mu y<JR1EF#9SDjM*+^+w$DVwbILWi=E6\u1>JZTp*kJw?ADVXEnF?AD+5?Y*X1ec*bYj=VL#AjRpS/B<?G
h$1!Q> iJc#p?>MRkj4KHT?e8hP+$@5Hj4YjDTFHke<KK:i9Z9uLltF9e@eE>/ytnL>N%5y:!Tna<*nhBTpJ<X=
ci!RWh NqP\ehQ/*Pwh>QbScLJm%GaTL$P+9Pu4n4abp:w6d%KJ6JS@>A$WTVYS$BR!<SR<@W*=/+Pdi$uHiI9V
Q8VbkG BQ4%<ywhZD+%G6@kF/&/5d+YMwRhZ@P:bW*1*1RT@@aSLWmk1uHbBTbBPh6%95i!!FH^ZTaG#wFWGNIp
l5Duut &8tQ4^\%B^kaQX%6T:*:!kt8V=pC5J95kHqCWpKE#@RlqqKBTJ4YBH4#q5*u+d#^$KkSybYR>=aW:!%<
mjCZ8I ?yX4i&C!Xe5kKip:!jPw8VA8%EBuC<Ay@u#yRMLeZwaKwXn?pGDG>TTj*q>w89^ZhWMhl9#^&Xi8I%!i
mYbVmI BEt<Z&ky>!dM/JCAaKb$SqF9>JmKYd55m/eP:=L5:PTph1T8\JYhMPByABncLNk$biyHY&4IX%9yMy*y
&HH>/< M$>P/T6WTlT$WmRWnCAy<MdNiHl6Jb\:F4i1tGCG9Am8bl++&cJb$4\9IKCu^KBwtpjNll8FliJi#+eB
uPt**# htJ>1V+6$^iLBQN^Ew\?muDS&P1t1*>1\FKG^PntX/=d$GSLuc4#a5bhH#AH<JkJcCJy/nMmmDqZ=YLn
uG\m1p Mwea>>pL&l8tPnXCN4kHLn\XVcFGN>yTN\C^%=SbkLk:II:SlV%eYm5QYmtYmeWTtydybL^%&@ahTZD1
h&b?X/ SN!tJ5C:#*:q8Mq68#hJthh6HuEuIteMtbT8NMF>?q5SdTBSTCWTtaBYa4mCV=>^M4m&/iJNiN@h^Bi*
uI9^VF GHT:1Y>@A*^/IJa!Pp+hR$hFBDL%lTN\8Xu!tVbL+pbE6X>qd>LwmB!w!G1P$4A<*yQXuJChP5Zyp!$>
M>e=>J a>FZY!/iQB=IT#PHwFEkkZmGqw6w<Ra5+C$+B<^QkJQ4YYlWE?Bhl/8=Ny1^p<e&=V</IYQM$cNA6%E$
#hH*jw 6+!LakG$\e<QhYZY9#<Z!lRmlblYmYpy:5e+??Y?W96%X@?lCjHd!>Xei<&+!R9=>KeJM^+%PZNmIXb6
+/ZREi HnX:qD6C1XthXVie*&jnKNj&YS=>?n8=n8yq+Rn=L#&49wcnQkQ8H\D*Z5D>c5ypF<A>*Bpp#cQP!LRA
RP9T>J q!+YKIRTYmaSCPQ!Rpe4<cn^#wJXH?H59/ByR=y\F?!4=m#8VJ/+yAX\Z6kJ<c/V+qA5B>B%qXcQt1ya
69e*Nn @*\lFi1JyHL\/WLS^V<1F^8lL!LIjl<%Z:+J?P9#\P9h!SQZ/bC*jNCj=u9/%Cq$WqB%+kS:uD6GHcY1
c1PaQG PRKhuYuwp6A6$c:98LDR\cF#X9a%M:PB%N@i/R?+@N?AjRSk#/9tBPitVQywT#9MBPk<<K^5L4j%C4qA
nL9HIX JlcKbDKlXC\Z$QSaQM1<c?6=PQp?6G$wn^!!*+QXuGLn=JHJyJwkM^&qCVF&qCSNVBk:GZR>nkZ$&tmD
kMWEw/ J*#%JH:EwkCVIXTJ=ZKSZKwT$9TT4=D=$1<9\LWj\LYHXZ@>#Ki?9\C6t!cQQMjZcu\*b4R++A^:tn4F
wMPYAi upSX/ASX!!M&hZF&V8:m9hmw&$KuZGi:IcGtb1$hIPYqL5PqH?p\J+G<q$?bMKQYql4J&NIik\E+@\\5
-AQA=l 00066d3865c001202b4 Page 12 of binaries2.zip
Z6%H=b N>eC9LyeIJHRAwqaLlGD:Guy#wKC*d9*=MEXVtLkGDjP?9PL1#uqk5pDMunkGaBeqJw!E$MZh88VpMDE
/cYaaS e*GcYINt$H?@WkyqMqwlqEtXEwqIS6MKQBSN%//FK=@C5HuWd%:>@dmcM%<\iiDXY/S#/*AuE?AnJ4Fu
YEMCi1 8VQMcjaWhSIpDbkyF>dbMK8j<<IB=9*n%%p:G1+*Nt5FtGt:wlyPDD=1/kB4RB$Mpq+!9q?NLVWARCe=
iJd9bt AGkIWdL^W#?LXZq4=AK^SEkLbZKBmFdR6JBQ<GN4PIN>p!hQ:GtyG:*M*=Fj#itNGmLN!hZB^4myut!K
u>IR=< INuTBCYlSDbBG&@RQHZm#X8qWCIV/hFCyR4I%KNyEWu91h!tK%6>$aH?/*+%J^<>SEaiF>&<kc+daN^n
AV?^B6 5eA9ht5H$M?ne+%u1XyEy5q\Vwcbn9d#S:i##X4ci%m9?Qbtb8PSQYhHSRQwW%Q/?J1$A>B#c#ll@a^?
9q:m*j @Y66cijlAD6qG5DG#\wlK5un%4SiJ\e#LlKA1AXCAblePypMc!!D^1$d&$qFt#iQ&Y/8+T\?&wncRV/R
$QKMBu \+?1AQJRa?nw1TttayVCJnetGbAHu@!#PKXWIlWdCeSK1XApWMCXL>VW%qdZFeCX%+@6yE>dj&wc#H6e
4$u1Wd \/p?&wl:Nqj!wP8Cc!X6$BZ8M6%Bkm/lm\$ZcIXkyk6B*eb^ecdhnQq>&#68Hh#i!tlPh#P#\bN:t=u%
F41kl< Zdl4b:=tB=YQhwkn^w*^N\d+M95hP*jtk<n!6V8EY+b%HA\$?A+CG6I<kabe@9HnYw6%/:*qayFaKBA4
Ty*BL^ lLTAFpNnF/!cJ1BhM&6GGHRTkh$*L!Tnt9p:6t?5GTEjIBL<5AL#pIP!1T!WKSncPkPqC>PMyRq5Yu&1
nSKKdJ \debWu6A$cWmE+FEV\RZq5KFe^<ECPtpK/NG%a$$:m\Y!?qP#WP+9+\ePcy?yHTkTDAdX#Z^D/8WN/+:
PMn\5S h:^?:h4X1=c!M?w4/DJ:lbbVlAupcB!T%Yi8V%jL<Yp#SqkNGD%5<A?y^5lM%Nw8N=8WuqHRLQHTjpPD
pqtTta nV5$&w46M9pmLmbDtJuicnlw^%VYqw/!at\Fcc5tX66Kt^+jG&#aPB4dAAE6ppNWI^AlITXnch1kyEb8
YTl*T1 IBWCH^&^+aP?5GQdqt1=lBc/RYc$HPZT&bF565DANI9NFBuLJ&btcnM$tRcpKAE@t@*wnk&AWAyKAiGM
<dJM9X WI^EqJKqlYcR#6ayDeEH!Pt?RAd8Cm>jQFemXd*TlBc6IpXiQ>&?Ya+jw4b1j@Mt8mG\%QP18W:hwEWe
dd>>y6 1XW\V561Q!P\T>9?1ZPu>tuX8<l954&TNSMCaqI\IA:w*n9I8EPD4TAX6\qBnmhMMb\\GdLeaXPS4eAl
#NKTLc *kBITM1hACR$Qa<&&dlJBVaBbCcAQkJ/wbCI^A^Nq=4W!k&qAmDBcw>PJ:b6M/1SC&qS:C1$pq5lYP/T
%tk$pu mHKFcVI/B<k\q!5c5qEPq!6?w*8pLnbWCmR!wWwkXE4FIq1wL=NIKJaYNLRFFw\XR1Ge:kQ&kKnEm#>d
4wBCXB K?FhI%y<BBi:ASF^y*?/jj8Tktb8Cc^X?8!Qndi+&:TEk&nXPD&8@WD9Ln&Gb9uMttDcQYLQ+qH6kAQd
nNK@u* SF\Ewp&ZJEh$:l^5dNXkT<YBYNKFTY%6bkABk/alY/F#5kuwknA8!<cy^qcKK\n\<&%8m:FeJlBKBAKl
nAZ\L< HDhXIAWPBKAIKVcEA+GW:w4%kH?m$/FGdp\LM9Q!X8ESaGHG!lW4ptS$C46e&EE8nELLtSZMT6E1/BVp
CJqP>P kdha1SAIbWIq5CAHd!PW/$6FDC$+QR14kq\kpNND5TdkJ#w9@4CyXRwX6QAKimAGG8+I4/K:\qMK?n^:
/*GjhF S>lLKc^p:1C:#D*1Q1%1hDV^Tw@8N&cytjQ$VH<:D>P?d45Vua!Al5ESYBW$/bKppLa>jI%:N>mKw#Q+
T>Yaqj Rt!BS<h?Gq9B4L/EmY#L$eBEaKbuj&Cm/Vt@!haFe6BQCR$>Xk1@lBKqVALK+D5DE\HE$NN=ZeDK$LWY
X8Sjb6 EAppc>c5Zw*!=NPEYWBJwq\R^K+TnyNLY&9#$Gy&nYA6Z/9Ajbc5XCyEalt6qImBClp6p8w4yEDFykDR
HwY+KP j$=lAPVV@4\?+I45IdXK5XTwiQV\Ijyb?MBjiA$>EJ=W$u9a?$I*yc\V<+D:tZ9IQ1Ii$$ykI#q>^Mkq
<FY^VI I*yQZ=4q:8by$Zu8=mCuN1!b8Q&mdFLQJWu!/hkuA4MlCMNQ5RZVPp$EKy\Ga!4eM\h*bY%F<#QV^pPw
CdPIt< IN&+mT<eWG\#pR8FwAkmmS^J^BAwKKT+a\^JBT/AG5^FRSMZ\&4qRlHhdl%cm>aI^MIe6Ec+WC:5#//S
aJy6?& BpH\E:B&*VytQdYB*al$JVKTNtAcbGB$^FIqpwtBcD$=EC&\P\XpGCupA6ADQ=+M*D8eRDHEAy5u/DF/
DSAujb JJCId1JH\t!qcB4:TLSd1SVuM$?wZ>muAwlA/NacS#MH>@TMnqayp^jPVe8&G:!+V%?*6An*#ykPP@!I
^Y1n*V G?lI<Pl5E&I<APn\^@TI$>LVl\/iw4WX&48$HkiW8KZQNYF5SStbu1+#/t!qVaWWyu=!WFtbCLIYMJlT
:FhI:< wWAml+kbP54R<nw=cAyYpNt:MCqwl&D:NqAckWnRV:6itCitw>F/I$?=tMJGb+NKLyG9B=+*w!*eX4TN
uZY$Ey 4\8SAlclRCtS11RKyRTdbJpT?mXaV96Gqc1By$XPJ?lwATZ^4%X!R5GWy$@bZ+V*yZRq?pY$Vmtqu4BQ
6QFhQH SabKth+9jGG6ENiM$Y%a!AhMp>N>l#mPN#G!#I*?ahk<Y#?Z&CndQ5BMD>5MHVQ?Q%n:h=\K#Hnn$pbl
\d?PKw b9iJW+GZ^c=tR=G6!CW#*Sm/nYlbS5/5lZY&*Fb8t^CZbamN=XKlYISwyRL<lpR5Fe6p&IIIJqWc%<8q
%jCFq1 MwqRIP&^cSe1wDE%>HaZaEakY1Dh1Fw1yliD^tZIbZRE5CG%pe9F\+F46IQLF?N1D::mSG1yBN4FNK$T
8#<66# 1MCH!!CRWTnER8Bt1hce=$a5pQ@\!%5!JRPVE\$1I^SuQYN?E//S$m9SM:%LTmXh@Q#=::?QX1wp#8mF
@$^X6q 4HtcAY*GPVIP4RLTX@R\Nna%M^8YHnl6*5^=mXEbAhQGtTA#!TDdXB\IchJFCeHPZS*4dAWLMV8C4MqV
iPSHH! NGBE*M&/ADqPGY5:6tJ6^VM#5yIVl>ddTpuyVj=PY$=PCSlcla&4SC!S!eC$mICdkE4LinpuW+1N5@d5
6b*M5t ^8WBP#E=XGm6uBcdcLaI^$uwAYm4cS:wuBlZT&ZL=VKbB%<\lR4yw4$+i?T1lYFKJd/<CF5XmW!yWIIj
tIiA?W A&K&cn5DMb^CKY%#<j%dIEa*YYXQ4bKYYGy?6*KV$hQ??PQQP$w>kiVF!=h@ZeGF6K6dVPGl#dRP\qpb
H5Ct5Y taMaM@$&/bpPR?LnqntFb:w:L+dwR#LiNmKd%PRJwu&t%>kK=tBG/P!Jcq9l5uSnT&R465@MGtWG/mJP
iunm\C !<#\T^#jaM96EPMKu8X!Yk+6Fypb!5XC/Q%mGYRk?Cu+twNn/8Xm1T^\V?Ei6J5CjiF&e9qWAtmLbM5&
y?DiwD :jdY*iY$IZC/GY\KHa9Lbk#qwF*bi>E?GX>+<RWuYML:$JEat4JTtTtqI1XCIXFA=+VISuSHP%iqcqRK
XpdSGP =Iwh/L&au<KDZuF@W$iBFNu9#A98yhW\Jh$KFPM*yWyEH<SVN%wyqZLqJh%e+b4cP4wHu9R1e5nI\LXA
EbX?<t ^mPeMuQ/npqh66IwQu8+:%JnM:NYcq5$Y?m/&G*&X%8BK/Eqc=4cXyTW4Y<&ESRqMZ84YY9YX8KTtdHZ
Gyen^F h6Y+Sq6AYTDe6XM8y<Al/Ij9pIM^qW5XNFkbmRVSb5KDqcRT1C\Z<ynA\JC>SaYFi+AldlhVRGjINRyG
Lj\HI& LqmVu<@CbWVtew4PSd9N&5pX6LTwcP??hZK=WmVQdc4TaK1Fu=SKGa=\ZuQaI!pXKp1lFPMHeeam51=B
N^hX9# jY*6=a5ZLt@jZpBYNcDi<bNY8Fj$iTZTa%YMWuD@::?%4/\/Kmu/G1lLD=Wi4eBQ<*>YK9ZF1m6NW+\%
<aH9$X hF9KAht*he#ICDI$M?5\\e+8QY6^4\lQ6*aYYepnR?aAYS%?5WXPuE5n$JLY&1\u1I%Qhw/=YW@kJ!kn
9?%AiS :eTC$d*W6qK5>N8k*=lT6MB1^d=me<lnyFK\6*KbTCyG6KwVJ8kAMFScWqKM>ku&FlYlRt/Qhni:T%Mk
yn?\V1 kYB*Sh/8Ze^8dw>=G?BuQNACny/tJ?NcuSq!8Wwm5te48R18uINMXjpY>IYmlZ%9%#ha1%R!kWItyeG$
l*PMBJ RW!AcNN?G6*p<Kby<N?t@#i?Eh%@<PDGHia6>+=:*/a#$PQ&<hPuXJYKyn*\=Fb@yhJRKk:YcLXI\/qy
P5^*qu FdKZ#M:M<nFwN+K%M=/duVt+?!kVE:PJGT=>a:Amnj*SXn<pa+Kb&ZSdY<j5*Pttbn?\66KpnLS45n&h
<6nQye y&n6$G=S4pI8ybZtwjm=bBdwDRV^6Hk\>l&kPPIXlBXWJ5K$AC@eZ1=IY/kF%hH5$Sb!SjB/u@=a/E^W
!e?w+F aYqbAi=XhB!1XFc$pe9%KGZ:kkQ:+YT8S1@&J#&XnPyWXF@j$HBFyXKKlCKKyt&Xa1ECQ\/<StbZp@un
NMNQ&D ay+VQF8?<V%/B#<RB4d:>Qu#A1Yay6:X%Q/qWwEb4\DqWHhSKw$wjb8@pby4yBywIYe9D5*Itny\t6bP
1=X^Ml tJ/=!JI%p$?KT^<*PYT$1Xt4t:bm4/^+QdN?!FaT5#!*4=ubbGRL&yWyPt>S=6&h5iQ&mMiBNXm!uh6H
=!1ayD FcMTASkZqnaW4BpEuWpK\GTXPnKwWqVCFVQ:$N/9SYk95+?Dd*PqNtYL5WdM4cmwHCDHGjJP?H1SAwmA
u&$Y8= mM$i/N8*4:bt5SI5=K9/i4cBNqPTRkq#+h%yTyFEIREFcb=GV=aN+PjSj!b%1wlWG4c41e%SKmk/Ej4G
lh#+ND bCCSyq>1%PwQKqAKkd+5DE@jytu<IN@VRY$unM6MA>indD@hMZ*=mQGPpQyPAk=tbYLw!Fd1uL61G1nI
k<:8NH hGSu=JmipdN=eQCF$S&e:i&6FjK^t^ClRFncVR=YV>Y?iJheIaLEq/c*X/B!GyQAqVIq1Qn4QqVMAHl+
E8Dl@T 9b</kM4%KndI<SlabYWFGCFRJdNC/FK:XHK=RmlSTab5L!\eyKhe>B#XM\&CIWwFT^9bjHtqXPHBBby?
=Lkk4H ^lQAV$=FZ^8BkMa9/C6dVhYkYlQ<kB?5\n&\#VT6%Yn?WKqASR$@Nna&9DXRK5E>G5whZ>jY$y%yh+eG
Y841#+ P?Pk#N\PbtbYwQ1B/X+&@4M:t@X/b/5*#ZZYk1Y?@pHBRV+im&b<6IWM4<nA4B&!E<c8!P8I#KnS!E:Q
5V<MmD ITWne%8c:jY#jnb>@ZiB&lhVJS#AFNnK=anY::199H!cZCKWR8b4Y\tMCEDQtVJW1m$^K>/>KVM>I*9=
qjFTuu !qY=GbpdTpyL!@cZHTBFm+&XuF!lwPp&<PZ?eq#Iay\ITqFkBPVISZy/EtGdHS@4WL&&RSmpXNEedV4$
#N5AD< 5%461=TD*^jRAj\KBQX%dC&1$XTdju*#/6p9n^<?i9nk*6$Hj*!6Ad>TT!d4+\i@4FcmAW6K$h&RYnBF
!jNImV yYJyk!w+>*%4yXJQKVGCFLw:*d@iV8!jpY%qd5Qc!l#T5@6$t6nb6NNZY@MbhubPC>*hyk@9%:9j+GHD
IPc56l S\\d$K64#?E@nJ&IyqHVc&$q!budB$PIA+#q4E#9B+#b5Qd!mI#$6N5dZWw*=CNhj=CW&aM1!Ki^=e1>
b69aIe YChEA4wZ1AXd#l%A?>t!hmZFycX:h&&JZnln>QCl\+aQG>K@b:j?#y:LW6h6&:&@kkFn!ybLD=nL5dV>
-AWuNt 000776c955b001202b4 Page 13 of binaries2.zip
9XPnY# RBhXpFmBSbwC4u**WCRZ/<9B<!lR9cbB*AkSDK%H?TC%u8annwHBRI#Bqc15d8=\8/>j115@99:>XBp+
Sn?mC@ 6N*dN&=e8!wua$Zb8d8@9Hn>wSdwanY5Y6JS1RhK8BW%CI%WTu\9Z#C=NW+IAm!XSB>e%MlGP@G5^I#p
IDH4#< d5P%66Lw>GZG*a#NP6jat5&\hbn4=#*VbeHe1WN:ht4Z9w&qiY6Va&VItW4dhB$+e6KWcVPR4ebPj*=t
T?9@G> ^u+VM#Q\a5:Le$KGInQcakJ!WLnGy1jt*>$e6:Y+tAZmyGWd&<qql5EH&HJbSZi\KhCjBtLu\yTnA>*L
$d&cXR <w9K<qhHlTiuSL4d>t69aYbmctTw4%IbtJqdDZL!Zd=%d>pBdKcAatGTHFeDTFj8&\5Bn^RR/c8TILha
&jcceK $Sp$Vp<lW\B*$5bj8m8X4R9WYG*p\=RKjLiyYk$&1h1G#9W%:#=W@@Z$?1X4N/?ePX/?h*N8Yty!Wq^M
u=B:Ll dF^ejMcGR%h???6#dTPnSw&mlmyRPLnbud1/F!1XA41?u9EFMGMQB+HPGcpWiuS@nb%+TYJGlk<Pih*V
+=!kea 5*8A/k!y6nYbqbnpG^Vm8ZnSuPpn84e*d&X1atTI>QXWiuwGltc6&%kQGnh6?w^GP!/DLykEaiMpi*8Q
tY!K<1 4M\R^w^8N^E=T8bHy5iHb%*G^NFqIiJPe9uk%RiaepXFMDFEk1CDB=qKFuVJiG@?q1RWmK^Vp&N<HZ1d
JmIRyn G$K\1yZ41@TNVN6aDZTJYdqnZ%py5i\m$FeMRLJm>&=QII/lqc$V6t*ht6JZLyQK>LRNp5a>jbXK&=<R
/Y?tln 5CdV=EQ+VNQC:WlLcdS164F4\:8Z9>&+i9QcyT8ZL=\?Z4FudYyeVM!!bXFS$hF^CeqbiV8Q*Zu&6kdw
Ce:teG FhjZAVu+V9h4c#c4qHK+W?eL+Q/8V%E1=EyD8k>nJ*EK!ekIe:dV&EwhM#LutJnbVAPNt^YSqLpmJV+&
=>n$P* #G@JQQ6S9V1&5YlFYGQ$YAPJcah?+/hNu//%E>59#pm:awDMbPMhHD\#M$PtR4!yMP<?#5HSbZ:kM6<T
/:>j1$ XCw5e#KRm&Tnhl\A$8RX8!ENA9pZX#IHG!8Nh/#L#eNFd%qyTdHB5\i&NhcDRBHJENCnMtnX*T=8?jw>
>QSdS/ cJ<Wa1ZCEImBYF1c6DN@MVAtatm=jGDw?9W4w!hdG:BA&DIVyZLPT$dNAYF9\AdS6NhuaE9V+??uN&@n
R$llF* pj9Lq!/iQ*&<5tl>Yl^?wI@uiJF!maT5hTZ*u4*<XF?Q/4lc$V:\hSTw&ju14&5l4BdDnjReD:*@<Mi=
RY^ZSb wMGthFjYV4B$\V\Y&JIAY<8M4GhW&>4Eb&*K#>?Tq=ERFim%cPd+@y*dYWL*NDVA$*H$DPCZT1HWN&:V
qp8AAE i>nW1dbci%FTb6bSR?B5wKQnw5#M4H\D4Sqqm=\=F>qM5PbqAYqbbXRbP1A6q?RDXL4QAZYq=1Dy#5$4
RjXpI8 %t@e8uHh/yY=tTu^+R8Gh#DSW:DAFy+FkcSKtWLj4NMW>?S%BVk%Ei&!JIRJudb6DWh!T1GlDhL!TAER
iX:XBQ 4q:ceibTR/MG!JK<AJD$8Qy14e*4*/:i?ituY#i9Z:6!/eK=$!eP:6&RHleNVIXHAF5S?F>WjE#$:6M@
nPC+wB @@pJi%BShYiq!kB8pjnq<!GpyQR$wGd</BC6%&Cu6SXQG=KXGh*81/%%XNdY+pPXSX6Zb!XFl@y=#J5?
+n#cw@ 6H6:!>btlCIXwWmqRHKyW5@R9P>EY%9GRV\Vpqq@mC:p4Ye+PmbuyqX%B<&ml4A#8XukB@i#aL5p8@5B
jHE8c# Qh*L1!6dFic9&dT#aPiPLYB*RbpTI>*HhkJ&ECT9>XI>8d=yi>8\FX6*+4GkXWAG4l1Y4hm+5VXRBGti
nlJSbR ^Jc9?&Ac/>YTN=PBpBGNpGbwSby*j@=+B>$%BqJ8ZL6!pbC!d%NGLHCmDtjCnCJn+yJLj@#n*XeeVj$C
5bw1mN ERLEMnLX4^<@hkIq\6Z*<T>IPVVh85EP5kZH<R6Yb4qN@t4dIYhn!ct#^\@5*yTZubwRFi1@^Ht$VRi\
e:/AYD 6EbEbXS/TJ>YphbL=TyV1$GVb#m\nmL*#K\WT<dMwJih5$>t?wahQR#M#D4NeuXF5>p!Flnl!mY:jlA4
BbNAMd =Dd=Z!9Mm#h9*qP<6&l*@6bN/%i9!E=QY8a%yc5JlEqIyyb1JRa!QZMd^:C<dh8*dh91A&t:qycN!F46
WmkC@5 bk!SA5RNpk+b?Bq=E69awKbj#^JJXM4SL:>1#F<>9HQ@\Z%e:@9n#i8kJYhQuVlW9Dp#JlKFt+YS!c!+
Na=IRy bCkpJDR<cqqC%5Fdj$BeKj1<Y/qT\QWZ@9J&m/XTyRh8RnIRq+n@<wR&ddDnkJlFp?I!Eq!?&4aJ!>q@
Xt^ANQ =6LFW=X:<#i8!p=Lmq5Y=n6*jP<P4aEbQcTT\>taIIl=Gbpa>L*dKH9GWiTdudWM?yBll^>t#w%J*ba&
=^h1By 9a%!>8\=e?dPSYWM<CLbM%\pp:jQ?%y8YdC#AL#Z@yK>i*b8*:^l#e1enPRaQ@8iy8D/G/T5lBInmaFW
4in:t% aYA?hHH&=5&dNt/eCR1twR$6=8h+>bBn!$Zlmym+YNVa1Bc?h^a4BM1i6:/1LX@@?iDB##?V?niitjNu
a!YWaZ V%WhL6tcFSQBl1FRFMcFemE19t\#JtuVtiijQ1GQ\uS\a*D%Hl6j:B8Q\!ccItYE>?p&DZaTi/?ItI\R
i>?iP5 y^ydbNe?a&Z^%b8ZVl$5L6m?IT<uI#WyQn4EdZKjD1&MDdG/IKWEjBq+G#pLlpAmW^mbD=qtl=#E#9:b
5jqZpY YiH6%YdTedQuLk1I#h/I=uL#1QtaF6u?A/X>bDLXlB*%=hwDdZc6*ZLk+MHKA/Z:Ck6&dNt\blZatNkk
6J=d=k q#=t\A\4SSIp=TRM5KM9Xbla8WVu4X?*hw$DpNNI/:ttJASP/hZXKDatiqqpBAK4I1/dwFAa8qF@jqF*
JEd\Ti i*H@J##b@&iitl9Z4kI%y/5Pq&:Lnw5I+:WF>Ca$BPqY1NGQnE5?<8C9>?@j9W%W1iRCNc&*?8t>15my
b^Fd1& I!%Ihj%6&4ninuPk:D@dYVq5LD=&=edFp+jK>8S9*dltbY=Yity<lMiMAS%dae8mB<RkqSBwAX/$W4HT
e$+?PM EQ!TE*IS8&XqbjT%%J4Sa?c\RAk:u%8AdR1*Z%m<6:kEG=jG@X^b&>JD?V9LDl$?XFqi8k</$4bN/@KY
u58h:e b/ZGl<\i$F1QtF$%WMJI>GW1$^<Y=PCT9ADwTAIN4ihI!8mAnZBAF5R&c6Zmtm@X6Yy%DRR>Xk%9:6>=
Nm\Z?Q AKR<@LtyJ%*F>lbI&b+dH\Zu+KWYyKEl\eG+$JeNMRkNn%m&?@V#9<C\HqSBGkJ*!NFNN8C4nmutlb&%
=tP1ah jh:Bc#i9uV6?1L^pV@/&Lb5&4F&bub+a=i5$%B1/n/EBKAnRIhBymSdc4hhynP*MtdNt#W*PYnt8L&Mt
SyZ4SX GD&QpME6SI9WbS<k*dC1KKp+iQnI+WMH!<8K>?:bqd>q@i1XPYu^ajPHY8w4=DIbZKhY#MG%DH4Qm5a&
ple?HB NN+C5nK\1Zw#hQCDk\IC@H!@N6a&wwaP4*>??JAk=+$I?J14q!?iQ\QRh!^QmIwA=KAF\X!IMDkwKBmF
ukETkJ WMF5pEF\YMV1R#j^NI6:*XW1EblX9dRt+KT+mBc?6P8=ILu$/w&Ly++iLD>RW4l4b*:?6w%4qtet^RVN
4+B6Wb G>ZX\6RIi^leyInu&4IkPp/mFa6pB6dnb4G#Dia5TeqbHhDX&NT$>@\FC^a8bBh^d6^mhXqhGRM=1Kl5
1\<YjQ b@G^a?mwJhCAP$nSuy*klTH=Tw^$G>uPRMhCnbkVCcYGQiikFC=Jp4CpqX\8AWP1%/PJAS>9L$?Q4+&w
^u8yG> 5d:B88:=w%?iQPaZ<8CJkJ/B#iuJI&W:X!bGlaMJ%RSVRhykLwkPDECBBpHl8WiikMF<@Km+M^:9kT6Q
@!q/== ?/:RtKd@585%N:4k:KZVS!w1DqcYq?*DySE:61^jqRQ?eMqEt*cpW#T#\AePEnZRaNlq<t#eEcRipYpd
@>y<J& M*!H>5WE+BJ?hct&6AGTeG/jhiutjehPHD6/FQ+hQqRBF4T\AC#w/8YbKhGip/!NqSC+TlqJ6SmJLKSG
!9iEWH 9SjG<S*A4c?iRm+Shhjlb#$+#/<NDR&w9q9hw<i+cF4H\d&tnuD=+4tVS@aZ=CXFlaiFRA<IcRRcWCAX
^nFqPh \QldBEZtu9n=ATt8LZI$Xmqqw1t/CpJ$SuD&*AXc>4hhh<jk:WhQH15wK/5+yJQYdtnw8qW=/jH?hkM/
V\W^d5 twM1+I/kWmLmZ#EFnbmC46N$1m>&>@ALC!j\&WZWRuYJywR6%8^Di!X=Jei4Vl\@!l+#Q*1a>Ai\Cb9Z
%AK!Qj 4aR4B>n%MFWykAEpwcXAcd*ISG4Wb$FWbHl+cGl\WKDu@Btny9Q\PT@Pt@L=&5A%cP4bP6F6#AL#mH9a
Ycn9G* utiB%+TL=$+hP:ALTInAHTkaNCmIAS:aAN4jD@tc?jpHltej?cty*1!1KDewF=Mk^e8H+9J6&8CNHdK*
lG?Rej u4@1\PHK5yKT@bXk&59*+#KlQaTM:JSRq$GaC*$>S5qB!C&E6p5c^BKbaR<:ZRhkt8i^eQNbwIA4XkMJ
R9?j#^ 1Ik6qCRYH5WFZ5#^h5iPayKLC*j6AQ8:Im5=hGb9:DHkalL+$ak%Ip:Im9TqSu*uA\$B@4/?iQqe=MG9
c?$J1L G<59WhkIVFD%&n1tXuLlb/#mn%ukw^Zl+!/9FYAmnyj9!p8MDAh#1AA&AwQANkaH?mM@!yj%+Z#%@RLC
@j\yjj X^:S%hWTlXASLy1K?YtV#*cN>9KBZt8LT<DG:/>AB>6Z+l!&DD8<:b9Z45laNueI?FPhepAHcTaFHK4B
upW@!% ANhFdm$a\T9j1jh^lA?tEEG+LXmaWabPCKyPX1EV*HG#a$ePXl\wI=hi9#w*LYy8Z#QwIXyRNw%aK>IK
T\/<\9 PbFMannM#hjd?*5&!JJ6XKC/ZqNH%cy4Wa&\+54DZ=kuA8ku/GFu+PR?Z%y?:jLF5%WX8@ITIpJDiA$J
q&N6h8 DA\IDA\KC5A#R4*%9d!>jjA5kdANy*EyInynlPh*jK61^\ZMhN5G8^y:#pHib$dA!q&:>?\61$CH&l&5
bcYV/q 4Kmw^Qcn8GnZ>w%=PRqLSqp*</LRRCwH4EApwBHLkJk?m^a*V?9kq&?p=?^nkSa6$ML8=uclk5/?\c9L
cBNm\* nl$@ZuZ1FNcc+<iPHmE>e<@Pdb9Y45!Ke^65Dm4DkEpYmEWmF9nSAD>mmeGAJS+61JHkBSEBIk1mknX%
/J^$Rb ndXeLX9DXk9Quj4^Aj6EmBeX\t4D@Y\NDEHQAFN!@tVq:6YJlKARu1CARK!Ejn:iDF!$ua>jaNmG5:1J
j!LQP< L!&JITYk6CXu>>Xi+>Bq/QA=EZud<ueZq^</e8V\\e4KR&AED\PCwwJ6/%it?W*1dk:$IKYA$IPuJGIn
WH8qV# wBY4IBDVM^t^AK>D5pBHD1:>%BSTi#nkB8%mC+^^VXC<i>L&A$iPHn>^/nSRhII>dp\8D?bqK$S:TS+@
jw<Wy9 6NZD@Ikpa8AHRb@TCCZAn>J$nMe@1SEDWkmu/wEd1qyV#Z&X*K?<i8jS+<jME+/aGRQmd<D9Z4q\/8Ci
:Epk9M NWtSPNckk4YB+1BAj#DT4FeuV>AhL^@@\NDwQYjBtQ!DFqI!TX9Z&>e:eI=h:d9bLW%a8&XHaXuq+cQH
\JYm*q nl\/iPnwmc11+$eQXbRY:h!!Jm6$ik>#I#$X1<R#!WWKPVGS&Pc!a4pEAt$VW=NP$?a&eeP9*M46aZbV
d55mwR 8#lkB#>cR#8+:add6nmH4Tt1PHVp/ItVy+Cqp?\Ja:lJJdmlZh5*4X&S/ni89S+PXLFd=@ZHRCJZ/lq$
h&<l*4 ejL!dTdu8$YKc=pcNXq#V91^/P#N?\CMja!i\M<ne#/PB#6</jTl\4XJwEApFk5KbIMpkhmViZp^aMjd
-AyQV^ 000e0ccfb9c001202b4 Page 14 of binaries2.zip
%>LkS4 i@5FlaXHbB!?#K?E$4R+bhPC^dRq51>#cHSW6S<@N!S4#cahSj54D^>ln=wi1<KVIE+eP%^i9H9:?6^I
c+uX8d S=6YBmy5l#p=WkmAI+$Eai%SGX8$d&jSiynn*P@Zb>:FFFA:BcA=:A=1P:8N&w1&GNn=y&$9Lc<<hPSa
BK?RtD %eqVeHu&yFHXmcQaWSj8*Ly?XWd\FC5>$5i$aqcpF81J^FKqwbtbmhuIlj/B@%yAqa+Ce6m9/A9<@e^>
Jw\#=? p8$=ej$PYc?MBWXmH*MQ>jFpy>5@Z4><=6CiNapSIY!\JwkLFELZ<pKinEeHL:?kmJma/QBhF&:@e^%u
&:d#\? 51+Kdh*wWPQayh5Rb?@E*L\NP@aiPHnw$PFnJ$/iQuQ8@Lp#y/1PHm\6*LFlie#5j1*%MVZk1^Xm8e:$
=nZpeb 5GJ>mh!kXd8PuV1%d>N&!5\=#c9:IBiS<$:CDLehdiPAGbQNt!CQY:\wju%l/j:!k+hBQ$?iStjRcTMm
mpB14& k54>YIQYbIZdYYN?KInw6bkj5XSq%M4Cw4Xb&=p?\h<6uWtYqkX!NEAN?5S?XFSXZ4yF%q^/?Ak>=y=\
yYkDZp aK/NH8Pw=6/hY#i8uD&<J!<?QCRaRSRnD<Jc=A?lpKjG\<4VL!R1NmpqKT:<=I<6%y*=<$ZVmm*$AM:l
^tbXZ@ 5!Qu%G%K4^qLw6J!Xt*aYZ!k59Lk+iPu#%&+iQHTSempVl\?AKu!!5VFR>8ADkFNTCEmNGuESlK=wYZH
#S/e*& #q$/Y%6d6i6nQ*8&1&:qYc&#$GuHh1I=:Jc&lJ<NG>c9Z=jyG4a!9/mp:ACw/ZHwcGAb&dPGb$/jQH/+
M>HSPq w1R\j@Qc:Cnu49w!JBGAi<e<ehDQPKGBTC#ZN&qqdtF8&hy!pEham*X1<XKhZK#&C\6Mwa@eS?+D>%:&
5XJa*M 9PV5DdK&E*wwA59$=Au:m?tVZ$k<DApSWHcPy!^IG!kDJ\<iDWJHQCG+p/i*Z?m!8MTW%LVp8A&*t^cA
RGeDbC jhF!JXX/bI$netKeVj6MYSmcpJ1%c9P8+9$H!m5Qu#l#<eyXhMZkEkTaS!8Kh&%ht?E:ywPSHk8>D1<t
NQR\S? %G!eIJ8STbZGdVy%/hc%C:Lt&6PVZd/6EI6XTkCWwa*WB4ViE4LkNZq=1^cEbG<9KN^ZWkdJ$6HnwGBu
i%8@6Y #%>A=:q#ythPHn8$j&@BquW=$c+>DGWT5aSRl$TetBFJlCIJhEJ#%pJ5dtHbaY:aQ%iX^R1tJcT%^wWA
nP!Yqu 4@?8QH*>J$IhTcPA8%@RW@aZ:wuX++eQ:6+GbV8!J!<BtMPBAF/ZK+RuD+heZy%<A<PY^TZktYFy1TtZ
R*=j5d j99u!4q+Lke>X8QIPtthPSh8yw*>MBij/MVW:DXdh?<4Kh%jicV1*KX4N*Dy>?WLb$+eL6>Z5Hq=/GS4
%=c^F8 a#&eWT4A@!t\=VKS!9ZN&ud1$4Xd6//kib*c>*S$Ih^yHCF4B>/+Dh^/d6%\QB%VN#M>bZHC&8$:h\N@
N=\n^b 8IMiP%F%?m\+=I6puu4XpZKR%j4e&Dt>nQ=Bu\#/1It=bS6LT&Rl64VwMDRR>A&9ca*Iw5>WI4<eJ/tl
:=wNjw iQ*KpyVeQD=+YVh^miiR4MZ%K*4KAau/n*/?h@9t%ZNHCktHEHF#IYa<kZnVB!>99?D\/LmE^PTWXJSt
nDiXK5 6KLw!ZjL>?IJ+*SNLV&iAkabb\R/\<*1=Vy\+5LktITW*HZdhlWY:T86QH4!@PZ4Q$KRD@HJBWC*9*D4
Z/1AK/ !wlyuRtJTCHBmbqMC8ajTeBAG%q$5Ebhqh&/h?6mdh&=a/eS#5Cn&lFQuPjYm:H84e+d#K>wwJ9a56A@
INWYFV e<QYbm/QHD6^/8!FT*!q@9qV^!yL>&#j5J^R!RCNnTK^YKI\MLNAdip&q1!F!LJ6%&qE>hl+SBdNN5B4
GcCp81 +L:>X4H$y\1u+e<Pu4^K=u?li=*8E^dJGyc@pkW1u#^?iQ@P4Y9un?=iGSiGA%Q\DTJk$h6V/>ZF^#<p
MEESCM EqPaTKcpyYi8P$cYSMj5jiZZ%5cLc>NnYB%@!BZN:nY49>%m5JVA+bahP*eXFyej4ny*?j16u&:j^MZI
iPBR4H F<?e1Cncp8$@4wMBH8llFEJMIA6S8%Ttb>dP8k9dXREEkm=&:tLhA!<t=5DcM*beuukXH4HJHb!V@Y$t
$iL:!y cMKe1PZ4N&*bD4iB#k#8FF#%iekleJwNPu>wj>H&hbqBM#44R/1L^A$mJcmkei5&dh8%c>8&DTc\VaeB
>aqluI pV^=&mR&&RAVS<4k@mT<@ew>=b:$jZDk\qZh&tq*!bJ\@FL^9=H%XZ>=<8nB*X9Z#qb5!X\YAn$a:B<K
Tci6!p :lAIj6ZD\>QL!>5*KDR!P4b=md&M#BWF4:H1mZu!<PNbXp&QA+M%m*MF4#kH#dY\Gi:kESm/LDqu#adN
!9Q+CY &*d5&4j@ECd\^>8*j$R*nY=eQui<hHNGwG*QX94<\ADCFEwAu\ImNEPLVym>L1k4%$&ITWSh1PHIkdG9
1@Pj5i 6?N!^YV?YAcZb1YdVR%J9=N:@M1%/#b8&b=j5AeWju@F+iMu#%/<k1/b+QENWQmCXat?M*1*%qhmVYhB
VCAPeJ CWXmtd/bBh8Yc!hwm>XRcNt&!^REBKJpVa4BT>*K9&T+?MtnS*MjQul\h??J!#k1^TV?hFi*Lek9bEqL
K?CLB% \8Hnu*?/e1y<i$=eBMVCaZkwCd!I4=euWPn6+^ee5T!cy=C5j=iStd*&PF:X9eY#da1lJ%GkjblAhm/c
jSytKp %**?9IGnubj+BpWqb/>e5*:V6wKm5wMu#q!/iwM$+jcQq$<W=kVMG69HGuXWYLX4dRVhYWHWWC=SGLj6
<u\CPP $6PtS@i81I5TG<W8uV8Dei^uZ&iu6bW&VVWh!bNHup8FLjBQ!q&%i8&G#X6B*@eWFi<@iQVEtR5RmX@D
><VB8S k&WuD&^J<ZAe*ch4=!=hPui$MFJI\BbmV!!SKA#NRBhSY/SnWtSyNVRJ>FCh\1S!#@V+:5tQ6>!:a+NZ
/6pPaL LKk<\!@6D%Vi?8u8*j5@<^Q?<jKE9\HnQ@>+6tL*ynZLe%C&InM=Pw#*^yC^m4%<A/A4w^mnYDIVL^Y9
%4u/EZ pJmS6ZJjR/N8=Z9EeC^C>Cl8NtwibPWYDy4XjdVhQHjjmMVMuBY4%&*PL!\>iP#W?W6Z4@@+$:%:h&?h
c1XS6h *l4lQH4amFEVy65:&E$b%dhnK*&FDFVSEqRS<>m4X<@8Pkc:<4?:#GD5ct&q9QdFSw?Jnwy5GuZ^ek%J
#jpu5+ #eybpdeY89R&dDyK!pEb#%&+hBq*/A8H<u^6S\\dNhHYbjde8T/VB*e&W$wk@^R1SiD?Y:iBQ6&tVX5Y
?QEdh$ 1LT$aM$FdZwGcFQ1Wk%ABS<?cBy:@jHtnddZ4%$?8^?pe^tQNIBTpnWSH?k&kGB@/@n4\!8Hm*b5*%&K
5NjGpj M/TnB@h6!apQD@KHENDD\<5*KC\1PkdFm8Qmp%K\Y$Hy\w#5#d<nLWiY4Rj/RQ6+/6lF$>$YDP+#hQ!M
i!WK@/ tY/BMTuyYe6Zd>\PTitSE^ANZ4u=$:$H>/<Z?p$eN6y?TSDY<GWSkY=&\/^NRD@EEyticX94:nc>5B/C
h?V:tR X?+MXyH4\uYq8+&y6pX&Wq:^\5P/lILj+\e4q#4QC$qK#elb5Y4%8w*AZ@/89YYXS+/jPuQ8\tX$SZF/
ppFck\ m@9wIiNhA&ITW%C1LDuc#*X$X^PbCAuq&CTcE=PI&qC<KtL?LL4N15F:b>#n:ml9*@w&iN9#\9t1+1Qu
Y\$C=! \N8DYK=lbd\FZW1umd>kSZ^!dj@&@PLnX?+<RA>Nj*=\?>Ll@J!aaF<95Ii+L<jEkMMZ^YP@VLa@TBhp
F9jhAh d4#SkFmYbinSHFBHXtq&a^bQhuMhQKD@pB<tPm#$n+^L!X1=jl9BhPLWtR9Zj9#y:w?H+/iM59iJ!%&:
l$NI@u ee8Y#S9ZLp>h=8*R*%\ykX#D9L%%q&+>i9d5Aa+EYhPh5V*5IkRq:M9a%6yJ\+m?Bjl#9y\*Z4hqnKjd
Q$1Yta R5@R8IVp>K#eFZq4%t*a6DX@>#=I@!DDPRP^#btm$QGnZEI#Nt\9&LY4aMjY>T6V\?aP5bCLSBIIyX6d
ZhdCb8 6pF68VceybV*LJaYCQm#G5Pp%1awY$\jl?l<>Nq#^$AB#y+nw#8/nVy?9H*u*u&!d5Y99#:?<hD&kmQZ
Akl&$5 H#/HuAJ:w6?j@u#6$PdpaJ#ll$bF<%8eGPQqM%JTmW>P!<k:lkl:DX1/H^+IbMqcLnMY&k<e$1jQkKFn
Y&%&Cd b<^&>+6I#F1>iYhlMab$<8!qc>jP:E/aPZ%S%QK68+9\QK&hBRYR&edMH&1yWl4lJKS46?+>ipAe$>t/
J^FT+B W!j4#t^Zebh8*d6$6j%mJ>WNDaNS+RhH^@55YayNhG^Cel4$*qX4%t*e8uQQ94L!k+iPRPJ<cFPa@R!Q
HDDc?B ^A%:!54L!$4&:aHd=c>Q>^4hSwEVYuML/LQkmm%y*HXqdT#MY=8dY@bi>mXFSIcK6YhFbIYLpXi8un%^
RMiR/q @9TyW%WuTey=@8Iq9QRV#^\E%ujQq?<1QuQ9?h>9*4%:??dN1>i9@*:=@MHbkyRk@/D\bVnE=CDEFGLV
BE+:H8 ^$K*Fcbu:@#McP5$>BC&^dyQQ!!e*B%R>8k#iPTEGdQek?K!%t$4ANI1DwFQQH>5>aKJM*#V%8:eX%yY
aJ<&@+ 5m8@aGhS&aGTk4WJm+c&ke+KQXT9Y*j5iwG!n6Bn8/J8wl/>i6pAb$BWm+G^mZ:?kjNuikaEl$FumE>P
9W5lP8 #ekGp:eSFG=9eYqb?cGnbht8a?%Cqt@hB\^Y:N&%b*jJ\ePX?:dq?I/!%Dh1dYFy1cQMELT6jaj&dZuP
nW1Gw/ iumqyDRpM!uMYRY@JknSLPt6u++iPZ*m?DF$^P4w5iMu14A>AP1k%?I??>PJdS9&ZZ:<=&6IKh/>S1<M
8F\/$j *?Djj#/?pJ<eESWVC\ccJ$=E\lh\T5Be=1aHZ>VAY@MRIy4:\@R&Ft*ch?#e5??kESQ5=@qEb/:bDHBK
$wd!wZ !\<j1#1?#Y*AD^/bG@ML>?+6Lm51LC/4PH#$eQti>WpLB%6%lB/J8ynyuIPP6&:hi@d1Q&n\^C>&6ChR
F^+G#& J9D^>b*RNCkWFPR>#u:BEt>@VB=wZDy+yR&dIj/DCL15bQZ5j1Q>ICW8*X>&wKJpZ%uFpcyVJ+?Y:5n%
dq%/lT H6/tqaWcPNN9$:b>B!84hydt4X8d6?p=8!abySn<e#TSi!C=XI1Z81lAB:n!%lWH<TkNIi:1>b8*dy@N
Q^FtZI Z:Hn@C<9Z/P**D9SG:!IBQyw<PHNm<hu6!dF^PEb/uF^<T!EqIIpdPKp@G4Et//4G^5l$8NcnC!/hDI#
E/%N8c c&*S%51/Y/?BI!i:LI%IYd=8T@/iElB<WjVwj4MT%t#d91Pk5P#kRdB/XTi4nl?yKN1WMK69^<=k%wCy
Skjn#J 4q*\aEEuRq8Z46%6?k\cQtTE&4:SD9tKCGHNG\q%C^+>c4KD/<IqZ4/BIiHL+wC+XY9Yd+V\5tDZ^5Dl
deutPp A?cud!+wkFm>El$#45L>/?!yw@6*bm@5c&pB/tdJ6nG&6LC\dN88R/jP%8*daQI5P$>nplw^jW%d%6#V
JXFRj9 #eSZ@QL$etpyZ6F6d^E1HFT$D+jtB\<jPZ:!#QtLq<?Z46=\@Pe@!WK>:#>?iQ@^<!i<F>cHN!<jHq8h
#<Qp+t &JI?MataW<qiXSu4##INVKNYVYuwmj^KE$k*Lj?HKV%MDa%N#Xyd64Q1&t9k1Pu#jcNTe6hCEq^c56K^
KMa6Nd >+T\Xb8&d>6ShPDR+dLCWt!SVy++YqGaF#VP8mQ$$e+mVKM%&$uREejKpt+>ik<a$1euIbH5yWGS9VV\
BcHj!S RN5QEi/ni@ehPtcK@e!=dp6BBTNmp4C@YLX&\/cNCXN:Va*d8KNk^<:TR%Yunl$<CuuIyR9uVl*d9&Zb
+MFGWS qI:tF1!qGi/%FlckkB&:hP@Y5c$FpGnih4A&TR8>X4iH!LjlTP=*&hu!RuA&?h8*5q856t:du4?4EDyR
-ANh6* 000a073eb17001202b4 Page 15 of binaries2.zip
F1d$#d BhB+1tLD!yLd9?PbJt@ij*n@><8@**>mQ*j/>PH6H#<YbeVHJ<TS=cIVE?CH=^BC%yTW>BWH6A&I4NyJ
nRKtR> cipJHFFBjm*1ESP/+:ZZDa&M#X1*cY@he>Ba8*uiaap=/:aYdI<b&Z>lhu:S94%ql!wKX1W5nF???>my
a>i=BC $/hPHCudtnK4b@6PdBhS%^/>iuSGudmPXCi&5\R$5Xjjd6ac9P$VZ5!@=V=QI^aM5&4Z1V5^5I/8<^h:
EiaMcN BaVlATKkeYYP:?CBHt8K!5yKK$/e1Nm>PZ:6nkw\<<Dlwh*LF@W!N<eW689R#6IC@8@ayWi*V5V!6Y:X
#Pu*dc p!GdR^p<?MetZ51@@n=V6uZD?uX4X/@C$!6ZGbHIeu6BaetBk\j*4N^$=qjw\/*jjZn:?/M:b*=/>PLn
l+Gk6/ =!?jQ*><@>jnE&5T+lNR9FqCetyKImcSSM!E^NV$jAbIbQuhwmcm=yY9pZP*\hcG?GE6J6LE#L!h6e*A
P4XE1: $hNtLRtK!XmX5YnktLCN^Zkw<NCc!a^A#::k!MuVy++jLM4#G6LimwXM\/bj4!:Rp#6chi!E4LuP+m:h
6uS%jq i%l*6GMld^QcRqcE\8tI!KaNC49HPQSyDdhw$/G#Vj>la!dd#b!@^CeA?uX5aqKER?@^MjtX^+=ZuV=X
yn*DHh /M<M:lSWjlbaQH9m\JcRH>1&^6&=dj6PHZC@Bl164c*A=/LYA4P8+alpHwcyV:@d49H%G@udh$eL<uK!
?4%!+* 59ACBX\/q&GEq>AG<:F=^?/mQS6ZF6%/?b:>KHn#8JLN$%>%+5@*RCQ$=>?9=cjEwkSyaqJcbuymjAKd
9T\bDp TCX4eX>PYj<G/baiJS68$YPcq$N*Enq&d/P9bBZ6eiGRkbGyih8P*j1NtPR+%!N\!cnihkp:Dl\=ZuX<
miAj55 8:qYaCX!*Xq=/9VJw@5*S$/^:wA6aih8N6$:E\/B^E:Y1LPpc#j444d&>4mam\:ZnRd#a$:h+5b*Neac
jAAQTY d&Jt$dbn%%+DSw!d/8m/aLGHn*@A@ME&#8qFS$?hPZ>?@^VNaQ*I@XWZL=+@jZlZp4%%c*MLbGuR6n&w
WL@?\j wcXqY*DA:TDeA\KF4dy:AZ<cCC<MYm:mnaj1^B<@H>mauwRT1RR&*yLp5cuyiK*8%i5*4<9PP@V#1\?j
pFpInT Qu%?@?5YJ5>m%a4Vj:#HY$C?j*q9j!bp9jD%%LRW4I?JhBLIS=!/=qF#$5a^Ay!$DiCc6%+V6VXSKem\
15H^M% M1:eMkDDcNG?c><lI<hQG>8>:+L$ZbZHVy:cu/\Y/J5FdVq?/8V^A>8Tb@c\k9naY6ab:CDR%1pVa$*M
R*juh# ayhi$*FS+Qid5*XNGN4PRIXLeWE<YAY689V5Q*VWlKt&Dw:n8@bh51L+PFn=+=9Xk@ZGb8+>j@HCtTN:
i@jaFu eld$cG*PYynlwV>R8:a+TMcH&I*$ZIlHDZAmaJncknI!^CT146t:MkF9E5W5M+tPdXw$LTM:N#6%@bqj
P>jh#1 Zu>Eu?t@j>Lp/c*K8@d<A?d5:<jHqpMnKTAL^ZPJw1Vp=BS\WTlbtLd?JuBGEe+wqpER\JD>*QC<K+G^
==A/pa 9pJNByZNAbiStcXX=&+>?>l$G8KV5^8!*hNdBVT6Fim4b1$/iQLp<jKhtZN/RaTM\F*Ruc*b#1K8ECh*
uHIBb1 aV5L8*V6P%%n%&k4mI:S5eX9u!41$%1FF%#uqP$Id+cEN&8+S:?iHaaE4Tp>eidCyeI8N9&$k\%GlP+<
eQFN>B eiHC&cN:X!&&MVi*5NBcGtHKTKAHnlk+5?m%mCeMyS1t@HP4P%F>\//eYBSFSYwn8ElL5BcpMB8QI1h9
\QHJMW 8@#dG@n1%%5iWSq+jnG*TuH<!V6\98>jQV&bl^K+iL$EeB:^85G1FL!@aLI+jiNN6ad91F4E5ZV@yk*?
4@KZhB YD8luqI8%<m\5ptX?pctaJndw+/!EaE4C\<hP*q<JWMlYp<k/lhbWqX%@PCiuDt>P1N8ZFi1G>QXAMK>
HT?@#$ 4n%6i64$kBTnT>h?$%ukDhq^bH>Dmw^qk6BT8y516Hn6hKWN/LKS5RqET?cY\<QZq%Yh8ZB/9W\t%Y@j
muj+wu %/dZ+MG#ek>B!HK<bI&dDZSLBkI>%EdX4wNXB&ANPLQ5+<d1KGNVDL:dGdBSDS%JuJ<XDit$Nw\KSYG>
JnhV8n \mPm<M+aMdH^mip:4#*HuL$?*41XTZiZ=Ima9PY:j*\NuH%+@i8y%iBl<Z/VCM5+MSu<LJ5G>m%#$$$h
IG$=p\ ZTKYadScikRmlGu6pK*RkBV!WFK6nJPdKyS/ByA>6t$QB88H\JXFl+=XHe%XW#%waW@j\lQAYYH8uH/>
iD?ubG ?@j4$^9!mJ+&9Z6%:>Kqt$*jAWMG>i*b4X8QAdbAt6cPI#5teppRdpIpAR*waWyKbSyBya&WKu$D:NjN
GSP^G$ S$S5&F>%?9!y6WltIyXJ^ZKL*k+yqiiA6hI%m&^AeB&+>q\:E>C#h1B8Xy*AGuRC<64%Y/^nVy8mT9:c
@6HEh< 6J?mYk$1RVFTF8*PmwtMCNPE6k+JDR5Ln+mIA8dm+lM#hq=@lyq:hST%NnN6dYdRbqL$>w59Q&HQ<P9J
9SwZ:8 NjmSBy9MybmAdhNb\&#\L?qbY&>m+9CPleClSp$Qw\l#Gq8JudET#%cFi\J%Jk1X94E=D1W/h^5d8KIR
qcW@EK M:eYWbTAwe#yh4H:V%Rh1>!hQi?HeXMunS$%jMnA@wPGDP!Nimkl8Q6l^JB?9Y^5B5#R&Ddc<X8FWmpw
^FSMFu Sb51VPq61tVqYlpLC6$KSAQY$/VNTNC&E/jQuh=twDRaJwTd6?/aikVVXyK*1HeuZR^P&EJY?6bh89j5
uZEy6F &h*c1wNXj#iI?nFyKFtX>Q$PqE1Y&behE+q4:WJD&SBBKH+C%!wTX:auJYeXZH9&Gul:i:Ful==d=Kcw
NW++8j hVi#RiX@A&@9Z#?6Y4>m%cwX8Vukm:N#e#LV!iaeK%i5!M*P!6q!m$ETwt@<*yd$aH+QXWFdjXA+Ym4V
+#K\Qu TDtbGYmeWT9Lhl%Bm/aELT<<iQVEmcJIIT8kcES%udVyaFZX5aN:$tiQt?&%bJ/4@iVS\+eQG>!96+$N
VmiW/4 <Db$!KD?wIn>bmDkndZu6^>qW=pWajL\%5Add\kGKQE5DiNY:eiE4eY<uV?$^t:RyFHD8*e\qp@heRKI
l%^RpC P%G/at:9d4%:k\^/h8@Yw&eQCMKXZd4%:Ntni^j4nqd>F&QY<Lc$HFtuEVMtI68Set4^\h#wmQA\NqTM
HWnZN% T&lCwdMPDMeKF=?Wt4Pd=?*V1/h*X=$y*BdpP1D6+l@j+e#m>iPnG>b9&:b%<<d%c>i5Zd6/Jb6LLYhY
Ki\\P* !wDHVdeR!=KNJnp%%<k%WQYkeIR&%q:w$NNa$e!elX!lMnT#dNiyb@?Bp*&!>%RiQXFX8eKCykWCJP#Y
5nA=G! M/u$GLmG\*9mHKaFJChEljw5eJk+b5Vk@u%:>?wN8i#AAj*/>4ZyM\MVB^+HMtp1lh>5YDmy4W4iANT^
mDLewK mq++=nE^d#jeN/@p&Pq#F$:8tN1#>@B^W/hNY:4=!Ft\d!jLW8%:>^$CX\PVkHwb&uV9%1%46^+&QjFA
i\NuJI nZYHjp5a$Db6EyhIa>LpVZ8+NnSI/?6P4wkPB#$DjeN:$W*A!^LH^CYqbihjiQ4/A^nEh$>*leb6Ld><
j/Ji%N ?e16=??A^w<jZ6&9&LSn:>=CjyHtLb9Y+?XIX?Zq4eyd6ZJ=>yb:DJ:hknWNNRn4/?y1/hFI6&W9=!n+
Y*p$S& \X#JTwW!1R#ZiMlcajJcYdd9%LXu4&F#p4j9l!D8YFHTXBbM*bKEkpMukL6DP\Ih*FLZ4F/itSC!%HZG
8DYI$& ?B<GD?#Z6>@AIWMGDS\\wH?QHnP\VQC%EhtLt!J:?kyuYi9J/<Ei5I4^SQGMVL8:b8+=jQL5ldQ:M%$W
&hCI:I KwQY:TNZqqYhQZ@8VFXl!LlBw<cQGjZD<KGDB^Knc6P#X?<??HiQ4l*:BKRAi@^t!B#Ta%45<F6d!>WI
ClhbyE L8hF+/y\B9n4EBacFwFhSH^m!y4DQ@@%HnLaD:>YJ4V9dDQYbh?NF^@SJ?8QH%=eK!+w4c\+WIy*JNlV
LYy>=F pL>6<!dIShc6Zd6t>iyX8h9?$P4II*8F$nZX>A<5aW@nKJneZ5YCyYGqTNbi4kT%c>9B11N%#+tlc+wP
kL%tQ9 H181P4J9VVJPVXd91V!P1nwiL<>dQChlT@/P4S6YyEV/LZKbNudEpIGDlk+jBnkHDi#SBS\4yw=^=AAl
TC&SlV T8J+nQEm6?:/e6A>Sm=RKJY5c1Ti^bmwLj5ljn6@1u^#hpaY>I<T@P45/TQ4F@+\#6b8?ySJE<cNHwu=
t#9R\q A^$eABeH9i:h$:w9>n^\XR:mY!Gi:+*\SCa<c^XX!:=?8d+tPl!5HSMm=/8heFE>Y6aKDF:c4l6@9IXi
XE6<L1 ?@u><&6H!k?WH:*?@D*:1ejH6:?e*FN/>Dm8!m9H%j?F8*d8cFwmi6*c9F&NVXMjWc&I#I!qB?Ih\B5e
b/=hi* PTiBjThCHkN/N$18%DhynZQ8hl*/#W9D!ePJE<eP:ej#?55Qu/k/Cc<Kw%$<%yYW:N8:c<81nISI@<W8
Td:h^D W<iMGD=!=A<nl1LB6E%ZBylVP@J/wapZihka<J^^CpdbS&Fw+:cm/Mmy5?jPu/5/h8V\pcQHVpJQQZj&
%E<9V: XGu<nNH&44NtPn9c#=k/ieK+McNHnlmPSpmHD\PF:t<#uKeL4*QG<SyA/ZbjyV=dj9=$jW%MPC+qJaX\
E=/S6Q \V4PImKnw6A!9hnXJ==A\wAHVV/?j+@iDeL^H*:^%+>q8!AnPqX%HBh&XbRXa:Zdtd?hLC/?aiPBJtWt
nTC9$< e+u^nil8uEPnw>bJ/L#AYwu=\wb8JHSXE%QVXlB:hlkh6K:+$NFnRBSiE@uEmcyVJ?Hm?=e9tyqejQlR
468IV8 bYZbu1*4X8Yt^jnN5=5\h6#aMcNHwKFej<1iAecRE/>qiKhZRWk9@Y1\eR#iP$qyMY:b>w11$&jQwjN>
ETKnI4 #=$l=Z#RQW<jY4%\9MMm6@u#=5/d+?4mcGe:a@4WTSQGV^k@jm^\N&LaNL\aI4@dLSjLNjPF6!DqQuIj
9A/<G& JZjY^+J9CNEE$!GlVJmI:AtGqwtVh%::+^*$TP%u/lML*:Z??PdS<h&qJ<?hP*9tFPd1ePYB56JmZHce
ih6!&+ 9\P+&4L#VE6^CQFpjL1dFtnTPk5Yh%bweE&YhKIMV*nD&YM4W=QPnkud>^</k18lVy<<iaw5FHy5@^yj
4L51@A q+ChXci11p+eK5Z%@S6YJAW6hJk&ihLE<YN?GDF<!GkH5tM>=<\qcPPyiG$emlZG>eQPtyX1mIIl=ZCF
Whe=bj ZljZ#MLDtK$LpIPi9$nKy$<j&8k**e+4&HjJa4jFdw9t#*GhNY8tm=P>4i$MIG*!?LHn=8taatLycl%J
S/Ih#w 8LyC@8H><>&+Kneaq/wDVj1/4hMmI#IQ*H*=u8#RVu*S\6i:jH##>G#SutMZL8tY^1\/j8SkbeX?QK1*
E@<1u$ B\>L:Tm/V1duK=1ZLHn@u4cmkKk/b$E*jbtYEIXpa^RphnjTX^4b#E:NL!uHD%YAF1^K^+/Z4\6hHL4q
eXZ^w6 =KYL=</jPX=SWqSW8G9L!wTABT:RdTbNGD6/iL>yjIpLG<@GeZGN5aKSbkyMEjcbQdE?!cTGjh&Y:/$<
Jeqn\I i9LMPYk1H45<e@4$+e%le?cFJChG?H6:im=h5ukl5$A%d#ct!huJj91E5h=c/H4cYC=GFA&J+!j&I@4A
+RNJpI 9Ej9^ae#w/Djcel&y&#aDELQ51m\kLAXl^@<>a/Wnu#?^Qi*n&>@9X^YiPnC%c8ZeR$#mPZp<cNHmD4l
ZY@Vi8 jS%&:<#j@RDdJy#Nj!LLZ6D9*6K6KKjQ#wLl=ww9WlPbAt>ql?9RnZ4QTXm:5/#m$DF$*QVa$ePHK+4#
wHW#*/ An%T>q*+<ic%1%e8uD^<AJWbF8@cpLZMh>F5b@6yW!cPG>dVmRXt%M/WC^9H^6dHCy!6XX>p8QB8lB!Z
-A^M\y 000df7136c9001202b4 Page 16 of binaries2.zip
4qNRe9 *ln*Z=!^hh@Bw%Xu?MZ61++iYB?<$C>6#i4M?HBe+iG%%N%>!bKqT>#hFm=eMG@P:Ju&E<hGIl$9dDRC
cRY*VW lhG<b>?lh/L#1=bl?!$IDkyC\dm+4lXE?8Fl\j:iQ8G4D6@>@hZdh^<\^p@wa?h*j#??WF=!>PL%G>iA
IlHh<d GFBcZB=+@QnS\>mYq=Zk/Sl:Z1E9>Gjh65h+LSD1Dc*@!Xp\ySP\\5l?pEwpa4HW8PeM*@SN?j51n^\=
/#XPDy i4mm4GlD+pLHmNId>?:l8TTZVl<:XHu\+Q/mdc6Tw9!Z#y@yaD6q:MD8>5BIw#N!WRMj\pY>>PSjIDnk
=Vbupb bLSEnES!mZEj=>AX?WWHn1GVFqXHD=b6VZYd5Vl4^++N!>Qmw$KD@HHJkceZ<6H#Ay%^Z:Skn8Q+TiF^
jXXY5n lA=6NLYMie?<$:=Fd@Y9dwwJD?X6M/=XaQEY4GGGweH?QuC?V<VK5m8Q@@n4#Z9&k<G:6*<@??q+aiGS
ZmiyES !#h@9Hu>&qX$8SWlBF8II@kJ\+HTjZ6*:u9%1RWbRq!FRp5?PR5ZhXZJQyIc^>aT8YGHIT:?CT8*FP#i
dHc!?N W:B=XaKH$*T*Dij959hF>&=hPXiFny5eP%m!e?Q!qPlk#\W#HciPHh^9tkN\\dy\M\pdmaPNFJ>p*cWT
WV!q!& pWkwFIqqSy%GLknQYF?\6:lpd@//XG?uCR:St*dmC9K$?MmRRH@p!@pbBATCw9n=iC%hQHjt6Pu?!@n%
bjd\D& TNE!Kk1>1\W1yC?LWmI^FTmaC/KC%TEhkkQ>9QE8KF=?pSudnq!>@?5jL@@//<Z#J:jQqBjpq=?:nt/&
ZWaKDI c%y#F%6>:FGPauiF=@mXQ**Z6DwM&W8c@959Y5E/c%\cuRYDY5p@p#q6R!XTtX^y$tuR6LqL@RKD@D\Y
NWY@qa PN8/l1+>jQZY*j5QH#:+/h4=M/jQuD==bH@lnk$4$?NDQSc+&E$e@MMMS\*b=b8K%eSwa:T^ktu6qX>p
$^4+Rw R1qELGKFI$T+>46X%?GPm@%C\5KD9Ba+Vy+&Q&LX%1%+$tF&TuSaeAC@AYlaYElRaICQ%?L=5&dMCXwY
>R1F&G G$Qw\AM8Z>?!d$WuXm\LC&GDWbAt8G>RwB?8GqkKK8EjHBcd5&*@mdPZ4q!?iPy\eeHP9bYuL?G>c@mh
jEe5e+ PQC##uQwnPFy+454!@iZFq*+:T*b#=\R\Y@6VB9Z8cmhBSM:K4>KEbu:KBSLyBD4>FMc6+Za85?kpbQ5
tawCK5 =\Sq:#y<@84Nu^+<iun@>nZ\GSjPu#qYWd^u^<dX&jHB:9NtV8\:%aElP+c4CSQCBV*%=NW!kXR5bpZD
wZ*#m9 lTKJXK/R!%Wt:d9$/N&*@<Blw!jQ>p>e5Z:nBl^/=cdFSaTRZVhD\/Q\9KjkAN?qm%!tiwa8++qkI^9i
!h=QSu cN>!d:q*iqe*^WcE<uMhkuBbFC+4<@XGZn&kq*n:BWLuCa6J!%t=i6*GLX5*dT+wP*dt\8ZLtJTtXck9
yZ><+b upju>MB/uDlGJ9Z68jQuG@SY^T<:yh6tuLdAuAnu&lnKcpA>PLFRIqeyEJAmpM4Ak@dYM?p/dtFw!wcm
S^AkDE R!jQZ:u=$@&jedpYyDqZLy$:WXt&d$@?%4YbpV=85<d%6uX!I96*W:QWMW!MJqaaQcKXwycWMI8k\$mR
ZJ4Cu! &B\$D%hBkj=B6tHTebn6k8Cp:FY4%/=BiVIIlPImeb!GIk!mwyhFltQ:/LZIccyj?DJE1NFEM1<bIAi>
/pwJwM W:*@5#k6Mw!9Wk>ERYdBkRF+yw&Zn=?9F/:qD\+PDA!G@NakMtuX%wKm<tP+LlBcjR*hcHQ>K6Ea9Kw4
=%b6J> 8B#RGF!>9@jS!>hA#Lhh\Lp@/a:%Lk*Pkl@cKP4\lFD^TKt?1cEC=&V\D?PR!W$H#I*K*4C4=GDX8T5@
%AWLk1 @5SQ?L^&@ed%K?i4D8+HW\&?PNdj\@YH+ZcP4E5D*tE?twqla^ynla/h>iTMnJ?S^auq&KSIeWE8ia8S
Ie5?Xk >ybIDV1Nu8WSFy?KF#:B&^bpJMhGSWDc8R!Q4yG1u=BA*+Z&L9:l$aRh9Ie+>ay=naAl/l*%nu*j@8#1
?u%#jV /HA<E+T9n<WiC&6PREmRu/<@1BVtDXh^BCi8&%%cejl+%iq#F!>h9HV=K44i/lwtmh</mT^YD>/u?MVn
b=S$eJ F?\4:l5@j@^Ph&l$1ZMYPuZYp#YAuhYKSXJ>M!MFK^MBSZka9dim>dAqCe5*FBSZXq&+hk9Qj<RKi89H
6e\B@$ G&B#D=Z9*%?/N#<9MeB6cu>di&eZwImb^Wc#MS^R^MYJjAcapMtdiGaT>pCeEG/kWMlpbNwA$GR8pi1*
VB5<\J H&w**!e5NmWnP!e:M#WyIV+tCmI!da\K4*EiGi1*hNa$#+AIumE&RlD?/lZ:tu8D%+PmIGBSjQl+d%h!
n#NMmW BK+DCtRDBKTiZ\apBacGAGpwlAuTB+bCpnd5kiDm/QFVb<?#F<TZ4q#D98mKKV<b<R!b*RC?>NcVq&SB
QF$P#S N+:\R@&Bj1i6%C:%#5lJMKC%wyHMS8k6Xim45P:kH!Yi&c%wNhR>aju/uTYHVq/+i9*/qa9uL%#:<jbQ
$5l@RY 6/=jPuQ<MD1w4Cnh6V4B!&Gknb$nEKThSdqmLcJm%LF5uCl?ckeXWEVlMT1iIp+pqaB/+6APpSpRb5yY
E*YJW9 9ea=8@qF^CZlS=u^WiGkSNE^/nlqdA!Ebq:#yp@#Cw^kwZ5l9QD@K\V$5EAQi5>>RB@%Q=%aCeFLMFEk
IJBDyT eQCMl^IdH:IqV^k8<?eCi@M1XIKLtc6\FV*a#I6ZTC@VLbPPKVy^iH@l9n8@68TH@b%/VujTRC>nuWTP
YjMkAI $:5apKBZDVaIAEAEL?5uX?G/TWY4\a6mX&#iZZc+/m^@6dPZd>/?jjQ1?XQk@I+iQdS@#:1aicN6y6w:
5c:%!H N\JB!JZDBMX1TGY$cPqAW\Z$NTH&*A#RI\Bj^iL1damCLWC^JHIn/&E#=uwGSedky?iSRd/pcyhJRIpK
/CRVWc $Kbq\a5hJ:9:ltL:\$c\RBAHBKFtktTjQu?=6VMJLDWKEkd+iutkyZLm\H$D\SYm5Qda*AeF?Q9:BTY5
+dlwV$ KTk?WHuw!HHME1T==!+CRZm^bj%LJDE=e?ya?d=hN*:?w+pmDmmmu#?nP#PEI>bSMMSCkYh6NImHTapP
SD>cKy !dE=XSka1pDklKW6i$w4+RbXiN4H8W6Zd>!+ilF:AHnnTHuScy<y@VyChDhVR$mCnldLAEuciFGCZYie
Ei#F9b PlF@4lGKSGJ\a4nEHW@EImVJ>N9%u?T!CDwGGPcRAK<qT*%Cq5XDEy/EpyXJCZGS*1:VJkRFS$cykTWt
AR!1#u ZQn1>Y9RIw1R^PF>>D/nL=&?X1&PBq&CH8ZnCbH#Wk?QJW8>@ILDeDCMK<1AJ?SuFy!\Pu<94pa?i9\p
S4>TGT *yIReq\\*5\XI*+L!4MuITE5?P$b^EW9YS%J*HQ1Gh&GlWAHel%HQQRwR+RtAVl+ne^TKqMbGcpkiY+%
&=lCLc cEF$#wd<\yL>=SWHeT*ZijamjiEei%wBMe?^!4%y<$b$t>+A@LC8LC/6J?!kBKujCA5qGH:waa\R8#QR
A$Lt\6 WFbB!&X1WFm=VM@Cb6RM%+XLQJBZG+<qdw5YLjENm?YjA1YtJCjGl:nbV@IGj+?=$aaLZ4<l?5Qy1Btl
SN!@Sb 1\i@9!e6A1JwH+l/qlJ!quy+B^B!MDhp41Pjj*D<18&FJRe1TL=</lS:Ywk4*6FXI>*!>GhPHNldeQjF
/a9Q:\ T@D8ViRkVE+:nyCDb!YIS:hVkpRdIAB1qQcXG=n\#A!eG=c/e9*Y@N%F^RePaW6*:8!yW/iBjPnRb$<h
d6XD1m P:R4^Hbkq=t#Gti1eb%/DBNLEZL\<^6y$l\dA^pJBTpSkn+tqPClT:pANAh!YIqTy6i1!/C^$^^hb5&i
R*:kJQ !<=4QZ?B&%L@!Hm?8AIam9N^uV+yLDK1MbIB*eG>C!8PlG\!<9pLnR8?bVY%6Se&^waG?mI9!wNh!upw
u*1M8h QL%>A+NCmick\D:ap@u:Bei6&Ly:H/tZ\iXcJ$<CkuMZLq?>hqY*L<jy\/YF8=?@?A9y/GF+*dGtIA#C
Dmm+tt >CAH5d%Ld#P=lBXVIpc5q8C=<=&pTtM#R&!J#Qw=?<Yp=c:i5LXkL&dy#JqVJ++hP*H/:Hq$RZ:t=QHD
<^&kua />*H>:b*1RiTPFeKwpMK5t/6:mGZPHF5G:taGCF>/GPkt1RQ+>uDtKY8eJj&NwN?GD6^!k\HJ=ib4uQu
9>P+LY L*L*CwyPTE=NT<e<Sdk:V9aJn&1I%IIhE8LJGPm>VEjTq/>+uWT8XqyZ@:p!M>VQG*uTT=i\T<WRQWQp
AGA?>P nWK65a9VVRn%C+4N*d^4d?q?ZJ8F/>w\VYjQZRR>MmB/hQFp^d=h>@:EMTL#AkFNYt!1#VR/mql:+dTi
/#<>@B SqKiwnyJZ=t?tSq?M1e\:Y&:JC\la@tc#RZ:!k<hQZHm?JHDwKt+CBVC/JMuD/W/>^5\$:q8b8M5!Ay%
lQjk@e ^DBJp8RqR$*^E1^CXmRWT&WRjqJpYmta/Qc+uqh8aG:h5>@k+cMuVINAahce?a8YiQtH^TTqytikhFtm
i<d5pL 9?8WtYESWXH%pbwITVm@Ym4/KCG$XBNcbPRb$8*<GD@pJaD8lbaKQL#>WXB*CMTDhbPJA+Ab*<Ca:I$:
hEFSmq m+w^NZk+pp\Lk\/A1iG8TCF5QFK&??k#BQ1DmWGkQ:RJQ>%H>%B*jEeXu5<mR8J/mcXWahVcDC<eIVj6
PXCS&I QYN^TH#/muXdh+F/XqSYwkwDMtHqHA/^Vy$5DB#T+SMPj/BVWjG5nlk8tW5S#?>6kCjCCyGIFwM^w@ky
i6!c=A yWBNN:EIq#1dhil1$&@\mLGVy6p/#y\#*&&y6%>\bEJKipbGbu4WwlpV\!Lb1B1\QNnmTL@N*1GAFtZV
?HYW&L w:YL/!N>eMhCT+$<9j&D!KAyD1<D!XVTAFM@*+BqYi6*:NqZ84?<<8Blull$XukinA>:XZLq$8tDld6?
llWL>5 %\I6tle5$EKd5MRWa%*S&ku/teqb9GCEYCKScptZ/mJVtX1a/SF1?61=l!bt4h1\4RD9cXmM!V>$>Bkb
KBYCHj D$TuJAh#HK$hZF#i#?TLh#p!*RSV\/RIyuYRA>M+H<iSM%:lAWq/+Rkh?lalS/Wnb<!EKhMhZPa5eMh8
4^A<W< PTItMT$nM#QS%*FCTGNWhTV*ukJ%pi9WBR^N?^bQHE@qliIbbiDT9j%%+?<lKIkBWu4+?\bGb/:d9u69
a:B8k^ ThpB4C=+yQe$WbeL+NuB+q!wK5*@:iZL9@@Y@MY?dH^B6$cpcILXQe$YhDcTceYelCKe>IHE$cC%lTul
S!Rq$G ^K!j@SLkbPY/VX6*=QQqtSY+u9:wpTQH1p+j&?dSh:LY=hNMnySJmHCbC%CC!DNFehm\XqK5L\L\Wm^E
Xl#Mj< WhkVImtHud6Wm5ThkBZVD6%/EXct#uCeNh@NE<e1EXG^!itb1cG#J@6GcydXR:l5$D#ZT@i+u&5\dZ+P
AZnN&n ?:w!I<nH!^M!C6>AFKwM+#$+5VB5RBh@Q/Bt:dbhi+9JLNRniJak/Wt+>9n!%c8Z#^$89Q8TieZ?ZR@W
:Q!L?& $Ece4ywE&Y95YF9lSG5D5C/IMNMQL//kNDI*N>by!\!*\NlWZQT:AW>h\uY!l++iQX^bj1D!&QE>weQG
kkV?IP #9#5wytJ?EKIbqZlW4p$qZ6jE+tI%^c=Vq6cEGMG6#FyV+kbP&t/\<!=m=d+?EMYGT/Lmp>JZia&%SN!
#!*EjN >M@LDKQ?\W1D4QuyNEKK^*8TA4*^4w$BIW!+NX+NJSCQjiCPBAF$aHVGt1&:mplJ=/EnjEW^Pw9P!aGX
/X@nDX K=hPqh:?G?L9tqic9&pl%W\Jju+9HN>JH<mkyG15+Hwt4e$k=yNLbTc>J5*&DI6LV5>c9t4NBq\FDauK
**c#/% +WMXbTZAjEHW/P+%#4W8ZB^9WFmmImmXTpPyBuN:G$y\wMjuIqK\6$k1qyGXLJDaTkKt1***QkPGnB\@
-Aei5M 000cf2753a7001202b4 Page 17 of binaries2.zip
q*d\el %h=q#pJ*V:@A+JC\MEkia5IYV*hb>n1c?/nZ5lTpwdHymVPDFP#N@ISAH^>jmF>RlIJjF\j#EMAGY9n:
GLEh>W ?kSEyc@iZFDEV#4nceCSBuNPe9:C/RNH*$DwYQit<VZX!DZdELY6!G=5S\MbR#m\pTwM#F1b/PN%YGRt
QVKI+m Qea/L9KQmEqI!e#NY:>%b!G&5BZ:<SdRP>iEn8*%6#NDJplTPq*kCiBTJK+&SqI^YCT\1R!&TyC*<9A:
N4Lpqd EQk>\PPMtVnh$bZa%AC!AYha5M?<!ZPmZ<WaNC<@#aNZm>W/<B^4!q#julnmH$B&:I#Aw#\+B&eD&pLu
FFXSYV <QQ&>w>M!>8$e<<?*t#kyTL\HQa#:Fu86PlE^dq*:%?@w&1wF5mSuYTWqaEeGwipGpp9LQ=YyDhI=Tdh
uF*YiR S<&a+^EeGb8auyMHWWulQq\/9Lhwd>HYXQeSQ#k=%V4ZPLH^*#wCD==NEe*5cc1RcalPIXpZDB^:Y5kt
#%>iP< nN4*HDB$=LnJM=\IeD^YAIL*e*Pc+Q%Z4ME@WDiLuGMqnFb:PV<>C1@@JeVtACiHdEBuHimIqJWd68@G
q+b1py 4qWue\Icw96V^\+jiQDyR<NHTp$%c*!nLY5uGt%6ykI@y=Z$BHG*5tnhlLudmKp#q\SGAGaemi*eZdm*
9Q/G:> cM@8*aYFt&NtDbmlhu49mAlkKwuXReaFPE!KbQck>ylFSEc/+EiK=J%qiPWYAq^y*MFtEIRaW&&hZPe6
X8jk%i YkLlbWBkeLD9*Gunwn:GNeRdpC:@DdmG$\waZQ:AX>8Idyc8ma>AaTmWDkd*IISwNAAFY9qm=MqpQm!S
FqTRKL h!Z@RBBH%1hQHN^j<q4#1j=#*Si165u/Nhw!h1IJjV5apWY48pP4LNyk$\ihZY:cjeRWq!XBWZHJGe6Z
X%iX+Z 4>?MN$LDY&Qq4\8jP8mNw<cB>+%WEwJ?#p8cVhYtmD\u>VCX+SteHA/ypAI9u>m?GZP9\V?AH<Cl\\K*
Rh1dQD JVlc>QicQhH&W*\DGA#8m>=*\kdM>LeCI/Z//et6!XHlbNW9FIkZL8ICP8G^Jn<ju+CIyJ\%Y<Cna+Hn
cHmqct yT#+eQ^W%eGm\\%j//4bGt$6%ekRb<mnq5&aMLT#5aI54NRN\yw&de&NXZmC5MK5=$kRiQA!ZHGBb<m5
JMmc/t *:B^<:b6/>N<^w#/:FBnL:PLJ^+\1Sp+Z*AqT\^$HtCJ6:TD+EMC@CtW@Qkhpqn\$IeA>CuV:J^t#X&+
<waBIn iKtZ6?eC^:FiVEJh+6epk??%ZKQqtp4+KQkq4*%?bXe&46\KAe^BZRQJGB9ET@/?9kESmht4N?j9KhLJ
4*S6=b ?\lEMqZ+/h??8:Y%VB%V4&:kG1p*DPuhG45GY/&hbMcaQycktVm\/\JBRN8&=pdN!Ke+8@tHS<eqytbp
LXdYq@ =aCNZ:>lZW/w\@Bc?@jNqY9jWLPytlSJw66+c!M=\T!T+ZEkXwa*nbc&pmtN&6pMHnF/*ER?GHJ#Z:#A
S!V4hH chKpL$u1=IcWj\LtSc$B\B\AX6R>PLa?PVwC#:ZZBFul1jd?9u/BEWubiS6*:C:cX%^GEt1eVB!6LKt5
bHMDe1 4&>k+CI5&Ad1FT>n6X$h!Fk<jYCuXu1kj%&kMib6&4R&\w5QRiLRjhm+GdPZBwSFS5eu+Tp>1%bpSC+c
+!%Rj< =@#i45c&JW\6\EREyuLbnD/YKq*ZSW1SA95^BKdMXGHay8jAaTQHVykMKGjQt?j1NH*<Mp*!q=T/XFp#
yl9=&F TL!qM/uC\*&aS+t$W5*ue@t=<SEldBBHH5mkpDaab%BpEwTu&@EMk6K!A^AAp%Z!>4@SAEK%qwW4NCL1
YYn?56 NY?9G?&1dR%uVB#a9b$SPCi=uwtFydtyAXKcA$4nnu&Gn4Yh/?EjHB+hu=!Ypb+R9GDKDK*hB>6/Ip^E
Ct+T&< VBambhAwVR58!mR^!Q/H4tAF\V#L<aJEQEyPbmJZGql&H\A\Rbn&n5=PM!cNZ>Ca<nt%IWYeVFAmuA9!
y+\%w# P#h#Py^1^LKGVQ*LC^XdM1Mn<d1XIYTCkWX\kJ>@WGSm=54%JAa9Kh$Qtq8?9:VmL6I!eGIhRpRN<B4=
Z$n\Dy %B<+%&H5G$Ck$ltVS\@9b&%llk^pblcY4jC<jkYTt?ldhP+%iIK#t*hAcFSMZE!I>:^yp/y6c?\$8ARJ
wdL<%4 nBR@*XthwmWqu!ay!:#tVS9W#h\RPFKyqGS+qJEc!SRGF6$HDAhJVy1CH@^QtqtVYyjCJDeteX?EZ*X:
iHIu#= 6aMp/Wa%S?a^e\\Hp6Bu9n!@j:b+$@LE/Im\5JARN4S%E#=I9\wKm*CKWXbTYud+Xn*kRk!nlbQXuG=^
MB=ubc c//YipXBQ5eAStm^4iH$KiPH>89i5W$dC\6#HHWyYLt^!1SN=#+n:Sa5>jV%>%w<*&HcDN9Qhqy:nWPD
XHyM4Y I?>58WSNEy6en!h>yikq^kT=#lnX5&M:M\M>yX#ZHR%peu*#dkPGnlk%i8TwMSNtLKlJ$Ta*JLGJLC+D
eci+9F c54SWK&ILNM8IEZ4TMNwEaQaumDI^1>@*VyZ8Z*6mySw5EPR4kZ=a=AJGdq46tCZ8Li\1QVk8Z5cBG/b
lNcVSQ $?Aqyb5Y:<cL\ZP+lPWJ=>RIPDZ&u?$MdKiM?&H\kQ+>P4Y#MNaHSWN!jcXl1@dhB$?$e*B\tYW*eXKn
Tuqy8q uhyi/%Du!Dk^#nl#^&ZmnWuc=J1WVwqS@k6edKiN/NGlnSH8#%K<eIWW<HZ6$/@@5DFnJ#kGwlRNwGMA
TV&pn? uV1inWP^bK>N/m9il^DXeuXWQW5t%!BNw:bV\+eZ>&>eQFP?LT<uGeCFBkWGlT=L!qm?h88PHd8KD^!5
<Je?pn 891:B8VFAB:WnIj>I9mMu\Qn>WPwi\\k$#mwRaJ6dchMuDSl%JBB@d8%NVM%MhSV1R^NLc*:nln:\:BS
6Y#<Gi p>Wk5%1A%PDM8PABCTA@5V/yEdyk8<VI+JCA^VMhbk!*6t#h!5SAZ$>Q*:l%^:=Dlw&a/BJWB%kakpWh
k516ER m&958cd>Wkpp4ld?%uH%iMbRk:1DSq**@8>ZL^@j8uK?jEN8Vtb!WtJTY8:1nV5lu#=<>8ajVAMC!VCA
n/emV1 lQ$PCh:Ekn#Sj9&K85a=M$:%nt1HV@ceubu6>GuVy$$c*L6uN?5P:h1&/&Dhw@?IehQWkEXL5DVPyMn\
M$4G*@ N\JEVCI&<X!mYX^$hG^M5PP+$eMH>?@V1%ij@pNGV=@4#!SyAWtnDwptGm&nw<kPYSVbJRFcXMQYA5@%
QdkpSm nR*cS9PG84y1QPV$>:Y1++h^tqF!+PCJ5%j9@wtk@WnZjq\\</*>k8auc+KZL%=RtT\A1ZG5hjl1Z?Q\
y6?TQ& XhhiNS::ePXm&Vk8Zl9QJGkTj$9TJGwVGqw$C#@C+ZN%*Dc<CSFXnX8uAdj/5X=dy+H:M<**b@@D@jGV
?Rhy:^ K@yQ@GDt?VM1Zi85hj4m?Mdlp/QG1h/bBe=acIN/Nk86cI#ZRB^Ru%Td1EtwJ&%ka:VSLN?GCCceH@#u
$+tKtP 6+um9twluHqX!>dkJemaj>!hi$PSHY&+9:mZ*A5P4!u!?@Qu@NINV*?lX1mlFV<=11EFtAY?BZkNAV\!
Cql&+p #<ZXR^#&NdE?wT/iIY*RND@5k#bA5IpjR%BpZ#i<mSj/k4+&XNjWNFT#$A:$H>9SkkYD=ta<+bjuyNa&
j^m^XN Pt8eHpN4/4=4nYa8t1iJyiJRZE*<8+V1iP%*diEm6PFeGBPKR4lk\h6*bM!jd^H%Yj8F?j1qY96XR@di
ILb4:> \K%l@%64#F1&lq<%Fc@eRK%yeG=$?6P^pdTJq=FG%!d6jHW5E@eR&6QaRph+dylRD64DBApD*:=>^=It
TQGY/+ wW@we@&Z^1@%Z%lT$aYkMhR:6wYCaBGJ@@\Dm\k>E=EXZ6AVA*:XV6\a9CHm:X9W6u4uBpk#/mG:?uiV
jhnq>6 $AJ8wVyYG@edNK8lYY$aZdNaRlNDWmQ8LWXc^tC!Q4GjQ$C:YFJylpqm@/W/!tdXIi$!@Yi:<Bci%/t>
Ge1>TS >bD!%V9YP6X<%#m64uFwId6IHc8Ji^G9Ahc?%!m8tVZTQH@PV?lL&EQRS8wV?1V=*QlFC&*WE8/+@</h
^5GkBp %Y@jBNt!mYR*ZdK6LLY9*9q*cKNYy&e6&<k6%C:m*KnF8J&9wJ$N#i%p@p5:YX?lD/kibqMLLYW@jj*M
j:F&>X jNIAp\!S<Qj1%89QqpV?w=G/4XB%Y>>i9HCBP6Dk@GiLltyu5>BR4pXDteY+e&nn*9!41T!SPBiCk6pY
CJh@Tj VcX<YG?P6FXD&q4d*Nd98<bA9JRP9^+MYb@pY%8@F*q#W*GqIZY5Eb4LK!am#Y*mFc<N\bDtIuh1Cda9
qI#kwV 4K:J/D<$tj88!b\Q<8c<PE?5Cqye=>ne/H?1ATba>Ci9BV&@Nd1JZ*/4&S56N6HY:R=QuhR/@$Hc*WR#
:TH$T? $6H<4h&eP:MERa?umFa$p5:F6=5nY9HQhmNwN?6NpiZWPKIcLFmq/laK*ES*W<5HNhH>d:cdG1+n?@\=
@&h11H ZBjI:&yQZWDP>iDV/uX&5+q*Bulu9t8@hku<kI@:Y&i#@q9:WZQ:Mi<5Zm=mKRYhpMXX8F@19#A6DAX/
?ThdE4 K@>Y%INi>Q5ZBJ::Ju%yyy+kAPbQMMiya>RF6hM:uS9TkADRh\C+FkBah<HmPAmX@mI8majA/XVuG\TK
8wD8Jt mIDTcV6FIKCq*BKPYGH%q^1hDY=!V#><k+DZn>JB?A+B%uliB9\&=EVj5RkAAMLdn%>CVm@Bq#iAL?el
Hu*<ai MQ?C\AIE#SLp#m=YR=!lTjmmm!<aHRn8Z!AE@u:NepAEBLMEl*y1<G!NbFuEqq/Y%J5NcpLSRk:Nt9R>
FA\%aI mGayXJ%kARS:qL4+HEKmSkIBNWQk@kEBT$G:tIFW/mMJV#REApeK!L=BwJyXmjwPA4eW1!H/\u=64G+k
qJmRhm 1+Km=wANX\?K*9A:E@byZ514GeQQLSeDcq/RY\eBm+E=Tl&l49+GIdWcMGn@A\c&GRN!%!#t*LTRLu&F
^&PTpP MA6HwFwhD1+FDkEp1XkWVX&CcwED#IE:6%ld*XCnIeFZW?nbXA\/1Hp66&@4cnWDIibIJ\9hEnM6ecAn
c=*+d= %F*P<S%JD>VP1BpLS:C\^Qw*aYEIF8SGLhItept%TY1I1DYAl@pHHpwuF@RQ8XA6<LCL1b41&kbIBlmT
IwX<\i ypEayWM$yPZmhN<pR^aKi>mM=&dLlhKli@CcljF\l/pu4MMZ?$ceynyyhJk+Il@&P@pkuZ!$kAp6Wmh>
YL:/*j IytdlyVEe!$RIbAR$tpc%a!wTWIe/T#A#tKBY%$hA\pE%eDWI=Lw<CuwTL/&?@*:h#ywLbiQc:F?%#?A
pZd8t$ /iV$DSh*mQ1X5c?#c+AM6hESEY#jFwXntljpalhS#jLC&KA@RRbdq%\QiVhK$P4\5Vy<qE=mYAQS9@B^
e1&A$k LTRGLDZWN1JGLWup?Q*Y<Q!H+d4K@t?Cc+EPm$&*\D9juX1C$\tNA*D5Ii4*N*bci<nWTT$@9%kky%88
Y#E1PC :S5$Zt#jwFEL%Tq%KhypNaDD5!R+HVnB51lteKmFPyLX%npj4kW&LD9PnX9E1Y5$qF4V!DY\kI?CSI5C
EIb%9j 8#GmcdNF9He+*kuu:=e9iZm@@WbYNu@+5Gt6?^@JRy1ZTbpV1Xytn*FHGRAuPHL+MHPI$nB&Gq6pX&*L
5h6:NF &4GRpmP\kbD98mAACtplSF#eZHai9:\X6+mF$JB^S+8%$DIK&<TFiGWE@FRDJhhCNw5u#nB^pE^CZ5/C
&!NN6c JDu\VS!ENSTJ9jpF>lHaE5wZ?XDi!I5mcLpqDNkT=MaBa4SI\?ClIW=LcYmNtmHAKTLa$j!eBF/\@HJJ
G<RKY8 bIQwQ@<E?@Id>qkEh@Mm@\T+V1\+YGBBy5^l?6BlhIk:!MEQFhFkK*L%uNt6=@Qi%Z*1i*@8$>mZ/!Q6
#!WF@% *Zt/4@iC?jQSRmFiWX8h!1YK54N<?@h@M?n>\IaBDj*X@c4:muy*u8Huk^bTd6yFDWm5idLNh8Jpd9LZ
-ARIP* 0000bde5b04001202b4 Page 18 of binaries2.zip
>S@p^5 TdWV%SQW+>q^#Fn6GM%w#TltyQwH?jAlj654!\?WX%R!B/uScq8BuW?*ubVC\uQ?:LqpJ+kF/lSBcp/j
6=&L<+ ubVK\t9B*Hu\%1JFC%qY\>BQSnNWITZ68Hb9WjF?9G5yNWSnS#56*EdJy5%^hy$#d<H<BbwWKy$K&$cJ
/XCyMA y<>^eb$LDci$Gk&%G@=S55Xd6?<8^w@q1L+cP<y6C!YhbG<H=<&j4$tm\9BLB#8Z&ZBHVTP%Y$*6w1V#
B?CAW/ X1\nqW:WB/$>Fc!qBLSyG&VJYmB#44ZR*MLeHLXm#FlVbMIae$bTR#I<a&CADGpDjXaQ1SmqGD<j^V9u
Lw4*S/ ICp4aeYMmJaKGWw!h<J$^%q#=ttV/FWWA%e%c+9c5Jd<w4RYiC$K6yZYDJt!Jy\^baRMPEPypdG^pbGl
ZY6<i/ kREDF?d\44+KySK9Qe#IYF!qI5NZuVhl86Q58R8$>hRVcK1$R&jKY6$JhYR:WS$%Xw$h6P$y5qAlumVP
H9Vq>H 6FY*+T\=C>cT5ckDMLT?AC/\LGuFq6$qB?m=nCM>9\>D>i?&:M!QbL5RQN@l^NGnFaX:>?+4*48uIH@H
6F&h$e 6m&dN&%a6&b%*54qPXpb1Sp4N?aZ4MyJRH+&RTGlbAqZV#\6bhGC?b=8e&dQeuF&e4CdMY$1uu++b6TI
RPeiSK +WMHD^w+jYbuqyIaV^<:%YHYHCbBpDtaRyT:wE@mlX5*!Iba=+t/Hm+yLh&@9=V54eHQa>&+Ht/<cupP
<AR4#\ q5:iDc5#\$QDw/Kn<e+N\j^m+S+ikV:8m>$YLyk*h:d4VGeuS*9d/XMtVS\@d5^wq:qh!E*HVZN!uci6
jB4^X& wTc#qMnM/?C#9!Rp+u9?DQ$1iQ4LI?bPP:#t@+$d%*CIhJpWS$J4#q*?<h/Dt>e9Hn@CH6a@hLCmw9#A
+8BICn Ad!>dHF^^RFW$1y+:>/mR4J6<<:<dX5*d>1+aj*/dYq>+ac6ItN!N8$yySe!nqRRmH#+pijw^\Wp@41I
R&X\ya R=i#SZHytb9&XX&>jlq/Kb+BiQVI+aMX?@ij9Q@p?9=%<R6e:ejd#9PLV5uqCW>QVWtM&*J8bVC@^\Pi
PRtVVX ydDE*h%n/bIqC?c/8nnd8+d*aCt^+>A^W^%uMjGCZI4mKFjB?K4j?XlDb\dQq/Vt454jj?dG#Y9<bI=V
YISEc8 iLiN\=WH##=<i9QA8kT*Pe=VubiEy?T5&aCZ+Ft^QDe:M#Z@+6yI5uSlTDAy=QJqA&SiT^e9YnBuec\N
AWEhcL 8iqa$EQtC@WRZ4VKi@H?<YMB8FD$<&!<qeLhi>iPu4u!+Jju+GX=\9q\/NHnQ:=<iu^<i&bwREBI&w/n
^!X^$Y q/>e9ab#BE#<?VP*Hl+9J486:6%dmAp8K15+XuZwABC@4@LwELmQ4$>M:6am8kQnSM&Fq?a:G4eIyHY!
!SE?#% 6qKSZ46?W:^#!</ePZtC#M!wKC<4PjQ\!wy^?kINbT\$:V>6TYRKcHBKWtJCdFTSQXWn$bPdhl%tN*iP
ZXdP8S 5+Q6%DuiIpTJS@RhNt/GC^M4<MNEm1*&NG+X!4S!Lh^A4G<%!D=+dRXEd1RI?<nlR^ZqF==e^VjRWmc$
X$h>LT 1QXkJ@?E:FW4e4I#M>JVEp961Wdw59yTSc5iw&eSiVp9CSVCVZ:wN&!C:W#tI:WJEC^/!P$W!t5XdiVt
$+piin R?cqX>^<>P#=d<Sjp:n^#$@*Xw@u4!@yMn?u<6^=MP:u<IQ5p@eBkX^Q9>N+4#Z:K+8LCuej*CCAm$?d
yBY5<i ==i\imj%J?NM>Yey+hV:>Y5@W5d/A>&ZH#:J/>1BppNQL5%T%qD/6PtIleGJ1WBIZE#pu9GjKLuIa5Ie
ZDakTi b>8yp=J5+FJ6dAcMuP#I^AmGaVKE#k<d%5GqDId=4n%?qqikk?ZHj6Xh16Xa:&WbPSl=eu\^8XVd/W5Y
D&V6B* 8Dw:b9amq^w+ewwV<==!SJSE98Wh6=Ym9kCw6l:q%=?A@!dB%+PuZ&?=K8Bmk1=B=cjPEJmuV6/dCBeV
Cu!Y4p >$t1LCue9j6MH:ma6dNdYNaY/ny!+b!y9wkT!d!iX1>=V?t*5p<wQ*:+EIb+<qtC@mhK&Y1TS^TIP&bb
bP>lN+ ?K:^H!my5Ji4<:S^Ydb\pjdh?\\hd<hEC\bSqJlTBQ%Y5^c8aP/cejnW<YPA:MDb*<pX#G&DEnGw^Lm>
i4R>aT =A4>Fm>\tdFKh+XlE?!bN>Sp\GSi@lF6wcmQqL:Nqp5Qj?Z^@QEyCX?mi<cJW&jJ6L+:E?ETa5jTp6$:
GICThI L>6nJLc#jbQYWWibtXR@k8PZL/9jWW1D1cpHRaH*q%/+M@W>ySD%u^<cH:M5MuVu?HiW8KPL*hkMjQ<P
JRqCQ= *ZwNGnPDmSIM=lE<@dwG#nX$!npK8qqbj9p8Qqe<^DMtLVpyMcaIu>6=\i\bK=4PHY9L@pY@uAmN6##\
Ha@BEq paZGj/CWdjM8Q<c^%IP@j5Nu!>\11pm?iGemuD%!:>:<T/Vb$%!Y^8SS?/DblH/QS=@!*qJ!+=u4DkH%
muLH1m b?+Pi$QJ85$Lma+KD<+j>=aT>ZcbpDaDM>c%=<BS$=qIHieBV#/9l6NMF&+=Bu^j8I>Q/?WSDXR9&+NQ
/6JYhA G:DRQlij%kFPG#$h@Tq+<Tjj&9j5bwy/V<t6h>?E5QdBm?j+#BuqJ*DI<>NEPHQYkaKLh4mlW^$ZS//k
hTNjW9 <lqZ91FLH*=e>acT&kTXXJRhjDD%FTZ6=^aiGSc$Hh>PPGF1&uVT!l:>S$=n\kWDTT9>H*@Kk*Q/SS$+
ia@K<C ZHH$IV=u5E<eYJDh?B#SDJhePEeJVS\\c61#b<?jQ=5AVdVa@=/BJ4/nyLNQQZn$<!?9<GpLn=!wPu:5
<+enQ< >kR+Vb^S4G8j@eK\=hRtbna9@!W@9+j&TXVPc!6K:pj?Ddw!!n$mNHDd&DiW5PPM>GujYli1c=*jw+@R
TX%e1G Pwu?@>Ziu+BHWY\N\HDNJJPNlLCDwBISFBLbX*El4IK!p$+ICW5kAbIA\T^pBtS/RApBEZABDW+AM\NC
6maNy@ J\1I/*WJL6eXE/+cXLJ/:@Y1iCGDJJppM>*>uZP1b#IBZN:*id@9ij:u?Yity:1&e?1ePuZ1XHXXheJ#
!YmLbq y%?1wB^V$^<^=S#GHQ%nH*?R5\@KJq@RjW>FK::wilcLF6D#<Pju9/p*Ry:A#cjjjQ&%L!hDu98PjekL
cIt9G5 Nme^e!h:$4&RClc+:K6ju9mJGWa>I4*%h8h@5+B8C#I#$k5RTiCpQClYAC>Yl4^iK>j1d*:FDPMji@uh
VX@ATN h#BD:<Wde:MPWwcHuynlKhYD:9N5ElbK?1WXC9WLM/S@?HZhJ=$k\?\TWLFu5Wkli#>Gpd*>AiDXV9cN
66F<Rk P=+Zcet=u^=*M9?AjlQH>Y^m@lG4n=!L@+&yjp+YHNB:#Q#WnDYy#$/ABB$/*#\\4IuyS?:k:I6E>1*V
K$+%wG m4u11%>&Rb1kP!cN:\XAdu>a?6wDJPT&/ITHe:MjLw!GBB%:*lcJRMd9SYL:*wqq@$4=Y9eXL@*QLj5b
L:KuJH c&H?QYaIM&+BPJQi?P4ZlK6k<AWbtqtI*^%C@w8uZ*@6%e<uA/lBp!cND\hRGX@MdGQ$XbakL?J$Jbd>
iIPh>m 8NQJDF%Z9@8tjV!p:^b@@L*PnT^A%*X5\11at>$5XN>q!P^XtXu4%/c9&keWG8/aMthbit<u$\>/jLyG
Z@6VF9 IuB&nZ+Epbn!D?TVwijD::>#:F/A%&Q=mVMI#/@*lBX4+^Ciwhja?QWdN^q#5nKiS*mD=<cuQ6\H+A%=
==G89h in4ym1kS>#<pq?9KJmK^^*>1JtINw>@?X?*u$\FmyQVhq=$Aa8eH^eMH5&<HmD&uYa/>>jbd4:@//ttp
GLCKMt &dD/JitXR:eB^IXqG6GL5*a^6#6BI@u59*e+RcnY99@?l@9>tyqj&J^Z#a*5J4@Bc^@du4h4i^Sn\j&u
k9YlIH Lu<+B>?@5Cb6=VNa!5lb<^:KmAiaEa>NS\GpPptX$#nb\euq@\G!A*4qjQVSJ\WIM##?LaRbPHdD+:6*
98XFYD Q@QEZa^%9G68?5dN>B4Y#HWHEPd\lRtCMSFkD6k%\$Q=VPX#@SijE?uHjt4il/RHnH1#48/uX@$B/m%F
uwedD= Q#\GWCQ!*@9:S^>@?jbaFn^$#cHZ$D=+DV4dX#/dBFBZqd^wi*<>RJ*^tWd>p8^hVHE9=6R9?8Kj?Wl>
^6QI9H &499uHp#BGAGSy>/1Iu%>464\^NQQd6u%%M:bn!+c6PnY<XHNly#5>JZJ#>>Q\AhPGQY%I&dAGmQVXVy
JpSLbJ XEu8%S4%K<1Iw#$##=V?@Y<IM@ml%^Bt\Dn#$\YF?=+8&D$ub9%niDDSFw8+CWTyAMpjGlM*h?5nALQ*
BN:QFJ XmJ@+F$nw&e1H?5@?Vmc!Q?Q<^qP@85%%j@<A5H&PHBlJwC>?au*@9:bq=>?W9/Y<jt*8KZ:*4699@dK
t/DG9B K=<m@TuH:Ie@k8Lw:?NKd<deJhqQ5Bd*Ep:@\5@16pP1dt5@?9Tub=*M#*D91@&dYPiiKd6&q==<jEj?
C9<C5A nl*dwJlkyCmdDP5ZLqu^JJI@cF/C<hPFADM<T&9YWFQ8qS4=TYiSyabiPb?e@RXBBp=:E$D&n5l+/ypQ
nRT%tq Z6t:?+uh8^@jlddKw%8&YHKVX1>=FpEPT$!&uEYR*S+l/khBF#ud@REn&q@<5ipbL9X9@j5u=ZtA&i9A
l#nVhn ?h5B=8w*Q@4+\th99QH/Y??m&juK1bMuV=\+j9VqW$V/1yM9u:t+CGBPPEPpQ#S@&adh:Bj*MnaeTa@>
YHPNV# yDaQ!@uwtXi*hRiaAXNQlD6Bl+>>NL@k<iAAZGLWEtkIGB1*jM>>pG:$*kPF1@\BY5e519MBk:ClJ?8H
e@C?>= E>HLQ9<B?hlu^\i9EdDk8c<k5KDJP@eeimIwwBY*j>L4Gj*HJKZ9R+4H:#6+mPB%j\Vkhdk%e5nwmZN^
wF9pwk F</:E=Dtw@>8=DTQ@N5*H?=ApLjdQk5DpH$Q9Q@BQ/^BRR$lAeGBc$?e@JlI@jC>p/6Beiwj?kCq9Q?5
hRm5:5 tBYty>lbuPQk^Ay@4>+GMQTlHR!N#C<w<Yk\=Ayj5QP^b$WH<?<*N?tJ?:D&P+d=N#J>y<\HFBaIFA/:
5e\!t/ h<dKqW1KS8PTV=FlHlllK+<lnP=Lu6^X8AXkDF1W>5#>dVB8&9kAKwcwwYMt#!6X*6N^1w:<1?FyyM4Q
#E:cjj Q!\Wka^>:Y?BAGVG!a@PuH5ckKTWED%?kiGljkBpTTtcIQ*u^KX5jydbNbpNmQtw/4GjtF?*nRWG!H9#
yJBEBL <l&Q:lP9MIP8>?^q8?/DQp9jK^86\q9:D^^/#@S$Je$9qR9t+p>16pG?Y^/%a4:?c@d86G:BjLjHy#/F
P6>Z+c ?j^8j&Rc%8^hR<hPZTB@1Q6AK@LXy:F*>E9<?ASWq&HJ/^>1bT$?<jhJpC%+$:6W!9u^1!*Qk%&Y!E5=
>&G/w: @<MLn@:M@HWnu68L&i=e8Z*LM&bE%&@ipy**R4+P@dKtAwJdd4>#/Qly/=WM9*ZWLRaujq#%GGV$9?@k
uhGMtc $=l^cMd8@AMY#BmX8PyJ#Bk?dBM9=:C:y\u!y#18IP#@@P$yNC*<i##%D<pQ>j+dH=TYaWHZq4#<$WVI
BLa5dB N*dj*>Ap/S?VpQ:aRXcmhRAB<>:@dm9kC$?&:\/AdEPTH^YjjAV^>b&ZtH<QGE!/HyEbW*lJl>\>LWjJ
D^I+wY >59mJX*$WTYT&GQ6<ce\=?l%P@MK1CaGJ1V58Sh!/98N#WWcd^$<jQ\D5X<1b*XjpC/*@ZCFq*ZP/>?e
$CS@/: \K\yd===4?\y!K4QKu:yR#V8AuPii=NKK!^it@eCP/FbHkF#T5>d\FV^t@#$waJR:H<VH^H*WuF9n+uQ
J$&Yy# \?KGD^1$Bwwdhp8@P\cQt:y^w<qpJJM*PQ/D::hC%1DbBjbC#Dyw=cN=#%KXDFt!+kp5d<<^a:KuwpW=
C>ujB/ bMR>$?P?\5iBbGMW%X%=Ew%iR?VB#</hkXbwiPD$8?>?mRWPEI6L1MA^##*>Plb+RN#TnB%H&B6!uG+l
-A6mj8 0004eb1b7eb001202b4 Page 19 of binaries2.zip
*PDtD@ qZn&8>>a\PI#nM<9LCn5C*qDb1*b@ERY=QYLZLl\&*k\:5Q8GDIkHR^E\!*>Bk\iP%pSXVMjYAR6jQ@d
d59PE/ LbA=iP1iw5P&CMneRel=:JpNpNp\Pmqy%#&R8h9I<eP#yqCyS>+:I=:Yh&Cyi:%R/*kTB^aBpe>?jQd5
*Fpqbm =\Mkh=eDd:::^SPR8>MV^eZ9V@\XLJ5b?@e@?SwXQD+y<@Fn:K^t4\jMjPh4<XeY&G*8L86#?\@j*<TC
>P>mpA :$4M*G1eQH4W\9qN\McSm&IjG\>DK9>8A+hE*y+/GXq?&+C:^p=/:LFHH>$/lwwji?d<q9?!IF*9?Khj
BtM+nw PGk>Gk%Al1*e8GQ#A?Q9Vq\AREIu4Fm/<^+AEunL1QFnltWTGWNH*jjkIuwPQyuI1Kuj!>lqFlV!+NFQ
=T<NlN #u:??Xi#AM1CX>@/+Nn1=e5*JkCWP=?D$Xw$RPth@P#?y@c?ln*IkEZL5*iZ/Q!$aXLAR*@:l>uJhBAR
DH&kD$ yAcHhI&e6@pApQZM\VWAVDh!!d1Nn?*?&#?ATEQ+qEW^Y<e*RXK>4P9kH^nYe<Dk\bED?/*YCI\cQYuu
Q>a^Gt nl*=&#tB\u9jYBC5Q?:uD\$J:VW<j68lwwQYA@aMBD^8hi:YZj9PjD$BAQia5&L^DnA1te/q:&AI/Sw^
YaHFec @P/:^+\c8l:49i?\WjjQVFD?1j?lDq6c4<QXq@iku6V=Bd6DR<N99thX+ahju9*<5$?@!Wi\!%@>&=uQ
H^YXJJ #9**Q^MB:INHm+?jAVPbGX^BHeL:VX1>?<C?y=:e?!w^IVE=b?<JZTe*H/wdb4^b96uJ8wXP*:@@/Tij
R#Y\6> *Luy5ceQHu4?8j*:uu4/&V=NLFAZ<YB!+ch:I=6akQ:Y8R9uY?=8bq%%QReN\jh4DI\eMuVIZbGD:wla
bYe&:K PRp=EhE@c9VEQZ6&:>+%qnm^+J&9kMHhP5%:@9uuu6&@h?9nBVd:+aQY==<45BL5&?i6Kj45TaV6N&lS
L9k+^c WtI?eKLL4cQ9Hn6t%MlSa<dji<?+McNHDF+*GRXk&Pn:b!/ty<VEnEQXq+kb*RbdeV/6>J&*@w:QX9G^
Q::8Va =PejSTD5?*cYjQ:h@pEAP@kSTVyYC8#w59DJJ*a>@9nPZW<>@@!#?Fd9*ciJI+6Vey</yjN*#?NmMj*%
%X+yT1 L<Ht/lc?5PRqQLHyTNFlK$=>Q9Zpu8eZNaACC?*hYRjYhjCwPGG8?Y+5<6n::lp*h9TwEeCMRRQ9:H>4
Fi^huP <pVPnelS$e<kuuHEnjq@P+ie:44<%C599%R5TT@m8=86B==:h6<Lm^F8YB?C&*Fm$6JFiemKP!bQu$b#
*FaSSM y@iPH#h/%MllWY5twX\MH#Nl>tL=X>$91Eb:Hc!<6J5+MiIE9qH>t/?@Qqh&>w59/PXqZ&W&RBjY@dbP
>b#jDS DT^kZKF$@MZ*\K4554#waKHX?u\BmDwW:1t>GliY4DI>e=4>=y:L=YLcc%>5hLL8HaXn&kFjiIaeM8GJ
R@6X<y *j5H\BlX**h&:Q#bt=H?t$iNH#ht%InlR\hH$ZGK6!!QS4$XeZ9p1Au!j4>uPQu#*mwD6ud959RqQNeQ
YShiVE D<LT1H@/tieSwF>p@LLFC^>DkQ&nedd/jny8eNVI+WMn$!h!\1NuL=E9/j/4Ej+4Eh=>iLG&Q8DLL#\V
L:!?X\ ^=>?QBkkh6=!:QmLS>@Ftq?G$<I+L:#9GV^FeM<Vy+ntyc5*:u<hh!J\t1i??nuR*CN5\hGnYD!ec>?@
!uJw5Z :?pu>?^?a8e#tj:@aaFhJ5dF#J9%!Dl5A*%GeKKlAiA:6@4%ThKwHnS!kqLk@>!#h^Qbe>>Eci4SbZE^
Q/1@K+ umyuJ/4^niZQQL**\AcE&Z6Y$yKE8EiS:699u#\^G5lGhw+eMY#IwDV5G98PGBM>b&t>equ*Z=4bK4#\
/PnSi= /^NIiI@lEn%u+w?^mi/@j%m&H&EtHJWA&d6a&$5LNeKjyyiw:h=%Cp*XAe6TN#**Bw^=NM1u9QKb!eq/
\iNP?H l5%HeV@pjemAM<@du%tl?=pFhd\HV?Td8ZE5$6=:GJ+DPSTQj<V*uEV$Zp1$>?$*cPV>!9Q?B\1I>5Db
q+Z6SR 4=?FEXHQLwpkipD/wWQ+?IKiI8#b@j^KlN4>kcXLEljFdlpHJi%**/SwQGJ!HJ$^PZV\uc8y%piMuVlu
\BDS4n taLLanu%*@>C%QeeL6FDN1y$YqZ&$Wej9q>tRcl#ZwCGi>V?D1i@kD<QiByQn>!#?@GVTQ<hTYtdD:!q
*X&kIR C%Vt1BwHJy*<&Plp9eLt&t^cMdHtRX@5!N?&:iqq@lhbeQl+IYdi*Np#nMTDt+dkMb8Dw!KBBdj*8?*Y
/$DRmI uw5uaK5HHw!+9^Ac&AHPk%uWnuy%ZuV5GL+5S19>y=@c8&jQ45eQ4QAD8D&uLq&T5GllnAY=eN5>$jjj
e?qKd1 C+I@lyk\JG4ATnVq?w+eP*F8$lW<?+8+aQ*?q%*IlX:Dn8GLw:WXGhwnp@jjL>95>!5L$T<+jB^Q$LT@
I^ZpaD na^akqyM+\P?n9D^E<TI=Y9M#:?6C*QQaWPRDhEuQ64kbDiF#u:lBa?eQ4u*CV\tN??^4X6*4::yE88k
L1mjLS :#&SGDH#kR%npBP>:mJbwLb@Y$Vjt*5pcJ\aPPI?+GYlqZQm\XhS^t:1FP>yZZm/InHmmeh*:Nm*BpH:
!*#S/i >=6J9Imhd^+Lba/+t\RCqRAiPn4w>tVPnHEV=!*@VdtmMiQAh#<VM&+CbulZc8Ed^HA*?@8qb:=++qaA
l89tne *Z&qZeLuSDdd*&BM$tW^Hm1/n^RkH5//c?hL^I+Xc$V48:yi\A:1C!aYj\n5/BM/<>Al1$eB:6c+aSE*
DJlh:I =#<&6aPDlaaQtRX/ae:5tR>P!!GP>I#!KpNk!C%>8m*F@9FY=Mm>l%EDnCjhMQQpy!B#jV4F&i%idjkM
/EM@Q9 MGR*Qt4Ki&#Q#ke/ZGFl8t=*L%!&JDF?aY#M*M*Iqd:n:9hwStB:=MDd$NA!SI\eN&uie8W*@SWHD4N8
G#/Zyl 5qd<>Dl!ye?\F*%X+$j<!R/MKV>:K!EM\IhM&X8M&kIjwL%FuDukWbN:h?MLF*ieSFQ\#8T%qwPq8pk&
T1@4j^ Y=:D:pLi#C4<INQJdk%?<PBBVX>+C9:wF6G<!jVI>6^J9jSNLN!@!%$#+8JRata>NGN1%tnpWQiwaS:F
V9\Tw+ CR!/8Xj*4iMBTi>d?\$ejw>!&Q>RIihRdNHHPaAnLMcG=*EYckKJiHdt=&*dcuq$#!NVd$IeAd*GLFmY
5w!ND^ lKIVJ!!a5*EMh59n:6WWKZJy$IB??ZinpkI&#X<l@/c:AmP$kQCD=j@bkX!/hekS:\w=%KMjcp^/=?*T
h*BCn$ #%/M:/6*5p//HqP*HT?S6GiNL:\Jw?M8mRj&i^V4dn^Nipey+4knbh&Yk&h$1>Vb!l\&W&dJ>=qi&bie
uJXw@a pyK<auuT51WJD/&*wn&ENa$6K&<d!JL=pW$dnS8!niKtXZQ88cNZcFB\TJhdBp?c6*ClRE>\H=\^de1m
H=Ade1 PRN9A*G/FX<B$A@q/$=<:WDE4Vj*/huykcJRIGj\4deB@%=RD95hZI*QmJIud*t>aNX1jPqW<wwXm?eb
JRS^wl Z/CVP4FZI?V+SQQS4X9E#a>a6t>hG*QjuViFBZjw&LQ@tJpJ!=PYJmdE^\p^C?dPZmEMwhe#Dinj::dB
TQ=SRY hAa\>u5w+Q%9uY<H^Pww9:5u#$>G4t/ZteH$+aW*#Ba@m!mcqe**Gl>>+$8?>QhndipiujmI##HiK9*w
pHpES5 #Yi#Fw!K/Ncy=+D:+nhbZ*1=GDRYN6KmF\+Zd%&/SFueM#EBc6Z<HGk8jAuwHu!X=a/<F@<YDI!i9DJn
^CLuH@ /?E#8tSm>G1b4ikb?>nL?MReV+J:1hl?GIpq&&&*^tp<ptYVKZhDhtbtntqV>94p^dG+G&=J\5K+tAZ#
LCd6cF Rce>NPPBcXPtV=$aQiFi$n\n1Iuh&b<a*d999HjnbSa\Ejk<+q:m<:QI=^W*LZ9<qXI/Wk^ST$iK?JGw
qM4Kl> #=Gbma#P=+\&Q:J^+?c6Y^<^4q&=dQH!qc6ZJ@QH=R6nlRZ#=5=hMG@Y#Aiu+^Q#cGnmhN:6MLT$::\4
dl+4&C <j&F\Nmbw<bQYbCCdQ+CjFE9j9#>n@>iVM681184#4j%ly+VV$1%b*b99jt*>#:/<K%ZT%+<i9\XPti#
/p<JJl ?Qk^EtS:WhEL^+=V/:i><MLlA*SM5IjQi$4?ChT1K@*YQ%d$pY+beqt*LEJtTd&tb9?><66999+Kde*Q
+C*D&/ Q@$a%\^+HtKjR5/nR4EVD%A#QEPhCBe&C@LAlI5GcP++hhZK=BXJ!^auw6KQYWA4BlJjPAZEBkaQ^::$
Aul/qQ Q8L!pV6^mWL9ta><XwXY:qi$dP1#V#VE:?A=h@m??yhLm5uW5L%\CH6k44H*$lq1iS:e?Q+@jIdPZ*id
GXW@JG DC%!!iKESZF^R51SX\B6RHD$1QHVlJW!KNLLR&ZtQ*ndG@?/jAi6+/L^^:?$=V:XXY$4XHFq=Dt$Sq^u
:nJ$qQ 8*:^Gi>=NQ*^Dl=n1:!l96dn%hPuV=$/&db!Ahn@e9pHmLLD!yYb&+>?\tyS8iyty:tb9/:48PkJ<9*1
QW6YD% je1>!n*!iQq8N5+>Xl&nnHcQamQhI=Vl!nBq1D4EQXm=T+tTI>XB<pDqV8WPbaDTZ:%hQ*S$1J5FVLpX
kPdH?n VjD:TJ$YQ5$Apc::iBB5kK9eJ><4*/MAZBZk!tQW$jIwbcR!Rl/8DuMQXaawk&Wj8QIh?tEEeicI$jhP
eL8l=% n$>F*6TjeiQ$&NVy4khcy:tt6p=^V&/h%DySnt/h+L1@>d/Yi>**8Md:*S$>L5VN%CV@Xht:T4=kh:9u
VQk9Pt /Ge9iKmAlWji$ji&AaQHVMDi<KDXmw8CBw<hPZdC#MR%8DyRZ*>^A/$E8n6ySj1tjc>?#Tc+IG95qPhb
Xw1V6: y#5HAq&Dlw&jhImMm+LuYN##4HQW8BGn:=p!j@uDhG=5@c@@YpN4n<a5Z:+1e>5Lb!4bLD\B*Z@P4LpJ
p?lZn# HR/^Du+VB9TN/Hju+DH*V#&wFQyB=:=Q9>eaiwmF?n$\h5Vw8!jPZJTYe\WMLpQ>yb<8QB?PK/BCAlIB
e86+tm Y5dtb$=??TQLXPjIe+Pl#=<&d>caY:1H@chndjl@P9aM/*LVHYPGSpVeh98hh+&/b>IDPNKC*uFj+JN=
EFN?yW ap4$dd*CY#1hCk@9&LX*=IV:S+\ce*j$k*HJD&>$P$I8Z@4=l*?<?hnekZ&/1h&48#X%@d=d^%:>:w=Q
bAt$>Q Zy/e8u:#utMjXq*Y?djPDb5#/<Gy>+<hhli>G@S&X*@*APeh:n9qkXikyq^*P8?RB:n/Z<W*$k\cDQmu
i&\841 #TB#HA!65Kei*=KhEn>u?8SwGFtBYKu*1PNX1H=%LB5nn>cQGkuX4\=uIFd/IaNJ4F49Wka4R%^DqYH!
5thDuu <NaS/pl=XM9w5DFn^+&@j@JDee9Zdhn5eCn%WQCL@/p<??aL8<%b@t6YR&6Yq16JjB$hj#Yk8wnFK\6X
*X!*Sd i8Ma9t%Huc@m$e$LXF4ICPEL%ZmX%9hB?mZ1WuYbp1R8X%i\bIZip1m5:yCY98=l+/NQHT5>@*Pn4qeL
B99VR4 <H*Yk>Pm^?Q:FbVI%mnZZc:B4mH!WBeWFK/l4mG8\c%*8cLW!NbB!pBqWPjI1CHD^>\#eh1Ml+AZNB\c
Sbu+$! <e!ijDF4>YJlDm/Ptnb6/6RyW!bQtnS^anT$n@8BRjjie<@+<ZjjQY:eYDDFS+<C>w!RkRQ!cHYMQFai
dVNde: J><NnjIi=X:=Q9j>!wV\/ItVy#&I4%4K&TVY$\c?wQ@?<1@9Q*@#/Q+h1!\de@GWM>!u!W?DYIQHXcYq
j*h\jl ypLHnK?DVIc?iVuwwYXLq!=dqpTHw/ZkC=BZ4W=NVePZ$iEBaQ\5<<!54G\<X*qDd1+S*:P!/SH#%8%:
V4n6KS C%>?9?LjX%y$9b%#A&jQuD:=@u9GnYtBk44G6twFdaHYnq1phb\L6En4cHXWK&kShYTu$YQyjJ!HHu48
-ASael 00003bc7347001202b4 Page 20 of binaries2.zip
$HC^H! &Yj*+!l^?NNQ:5w#=/^NYbaaH+iHa$P*PH<i>E&#b<?clahp#=k^HSmG:JwM:EJt!SNa6D^StcSPq1ew
E<TVG\ W=Xy/kQ8/jIM>1D:IWbLPpQu#J5j8&nb/9WdNyt*ZHbjC9:94:@<>MN*b><>aa>=jl>ce:6\YtaH9b+/
kj4u:5 n/aK<TZLwuu#bn!X#&R!$5tZ8WaV9enI<$LwS^>:dF6iZu:?nl$:H*><%^NQ:N/>b?@iJ=>//8tuqZ*1
/VQ8eD 5?y#HR15l+/iiQ9#:@@neLy%h:uuK9M/AmXkVE*HJYpVw!hCtX&V*XQW1T+w5#!>iaa<ZZ*ANW&bKp>^
JM5PMR VXauKcVNXNBtwjhQtDly/uSk$$^kp9KM:8puB+Q>6HPdbYN&Suy11ubKENWlL6lMYBRj9#A8Nlcal>*/
8Y:Y@6 uNt#=JuKLAd>y#^Zl$iq14T&qYq44%tCp8li#Jdk5=uRyPTXci8!nI?aLX58ZXL?1@+chQHuu@=h<%*=
\PhLdI J??6i9$W>ZC+H85I>6*Ra^<?iJB*hRZQiwb*V?=><5tuuu=t*:=uu*&8+MCB=/&FB\<ij8GFIy9hj8Vw
R?8M?L m!<iQ%=eZQLT!!?jPHu1%C8uZ**%6hj\jQ1**uu*#Chju9@lq>?cYtZhGAdee5$QYEAMt/p<yM^$#%Ju
:KFYu6 6$L=5jHKC=RaGS1#t^1#nMhQ#JbuKVQXl?RHFiBm!\QKNQ<HykQD=JtB#=CB9GhQ%>*+8yX6Y#cD@bXD
<AwdmM DRKck:L&Nn^/m%/L!5%n+F>CRu^<ZN#CljH^m^aqJCVT8q>qKTP>\Faw!VLwBj=&T!YNyT64*G9Xhd*Z
V?S6DE b&dqGDjTG<K<m/=@@QeQNh>ZqK@/+lNe+w@HLt4:Lh=<A>hi9jLKTi!QT$wp=PuSw<iPHbiRNThP+nd@
$+M$q$ X+p9@Hm$W9=m$I<@?iT##::++t^bYVq@/YDF?jQjjqhX>?>jLne+Y>&Kdl!8$FbA!iutL=Cyu6*cat$%
jBki&% *4&wPWFiyGy9Z*S:&iii1<=^#%bu8aF>$GAiWti15>TbkZ!W@5T8u6A!!H1$+H8jQY@P^niT4FjZhebF
:n<STK mMm>=PVq^L!qT=XqLEplN1ui>/c1^Cb<J/NKS&+4tY1Yp5%!qA%1dl?nmh==mAeYdt*da@BDZW%X=Zi4
lqhIq% KnVD=8^b#@mS>t&Xq9LhR@la@VRhq5a=XX4/@95j+AFau*lideub%Q:>k9@<>+<@@9VV#:>e@QZ!qc8N
luV<t% #c$8YRGJ$:cM/GIFF@RK:wXK9L\Iik>wGiwT>%K+wDhSE>#ARVj$JuK5wuHRQW?b/\aBlAa&p+V\CZYZ
6k&:6P *?M:h?/+m>RJKlNS*M^jPt:e5CGH#m#J+G5wRRGuyGDDVX18cB&P4&Dy%?Ky:Y\>u68P:&HpHQP<$w$>
Fdn^Qu km@t\*P*\u**tXSXXZ/@/n8?l@Wj%#MQu<Zn&*k%!jIIXu6?ci#!9I@^*#@?=/ijj9uq+u@=C<88NnR&
:E/9PE Ndi$86!Kwl9C6/be8&FL\R%d8MXBi>P5t<TP9:JTZiCi4<^#$\9e<C\!i45><my!G?4iLX6R>V:C?bYd
:*hZ/W k:L&MB&T/>NRp#XY6RpZ9m>Xu:G?*T54&>=?^\@qWWVXk8<p:jTw##a9*MQ!:Tym%%ec8&kR<<pu&q\F
DpT8e@ 6hu4iEW9H#@*%XekY>>??@**F>4^/8ijL%:pL*i:e8Z1Xj/!5qa/w$5Z!c:bwci$:a\pjmtJekKE^/5L
/t=KT? *jTGTq>?KdQh1Mu#@IqS/ya:LB=YdVSm5&#Q1>SXjN!hVG<\q1>lq8wnX:@HLHtL@>bH6?J8!lCjVauJ
S^/^mI *l%^&l:RV***kL:##u99aT9$eAyjMq:8K%d+n6Vc&4y@c1#!9kiQnpjS*qDtemG9:qB95DQZlh8&mE<i
QwP!1l 8dw^u>\#hjkGYn&\cIDGI=PHTXpQ<*P^9F^KYiEXKXZnp1#yK%ZnE58Y6Zh+Z5<qhY9uS:emk*\*>K:\
/<%Gi? dD9&#81$:Vuq$9V?l#hp$9u9QL1K9<tV8HV^Ym+%$=qjm5JpZV<qV9b8AFiw>jFhPA1%QpZnEt>>!nXe
QjY!nF <y?FM1R<\ncyG!QcPJVyaSF9hTlJKE4!hV!T6YdZJpu1NV!TSW%LRh9&*X%@VmqjeR%@&wVwZc<W@j*n
?:4$qR V$p=iVn$NZX/^CGWI&^!>LJVbNGqG:AIJIuBGJC^XXY41ll?HM#IP89XWKa1+J88Zb+a@L!k?+*%GDhy
&CB&j8 ^1!&<Ae!h/^jjYJ=G6P^EG@c=!#Gh9qaP*lBpDcI?Z=t9utb+aRNW?uDhQl@>m#Vw%6R\Q#RZdtT?cM:
8&XIIh emR#WC4GAnAX*AYmC?tD$IZ$\ilC?lB$IZ$Hk5baKEKD>GHwRplHhCF>PL1R9lP/pL+#aYY5C&KF>F*S
ukqJPZ ljVh$IYa:8lC?l:wR91iXD4GitHyIQ%N/EL/*8lC?n:wRw1d$aZ$6^AXnN&1E5&5L:1RQkJhTH<d8yC?
MJi8Ij H:1R<ucmq4H?TC*eD$AZ$6?BL1T@E%%IQ^BhTD?I8MJaJHIF:1LP$wjhlj?RjnC/pH+I8yB?KMW!Nk^n
IKqMd9 Ij%\hCFpBL1RjmT/pH+W8yB?NEFldA^CkjSn$aZ$+>CFtL9SljVn$aZ$>^A&^8=FdJD?QuRl@j*wR9wJ
Z\K4Zp /EKKcHRl@WR1FYPV5FTRjnK/eE%BF>JQSSjTV$MZWn=AyRj=\6JD?luwR6mD/EL/l>CF>DQSljT#mE4G
48eC8: bmPXeDeHZWk@F%%IQ\>hTD<jZWm@kLnBYA^!A>IL/EJIdAF>YB#?R@1F/EL/iAyqdBGGR9wEhCF>I4wR
Mqdwu1 5^lhTL<EZWm@qHI#6k^#R@wphCH>euRl@Ry$IWW!8yA?ldAAC^ALyF?FL1SjnT=e1ilC?nS$IYW/qac^
i*+\R! NXkcTL<YZWm@Dq&I!$AZ$1>HF>I@VKXtLBNLDZhb/EL/dHRljR//pH+D8yA?q/ln#InWRZwV8lC!EX%I
*mQCCI 9\qhTQ<I8yB?M*GBMVN!AhKL/EJ/C:wR5&WqjhlY@Ij$n=KQ5ejRB?t*wR9y<>CF>N9SlSV=/EL/HbTL
bM68!= 5b&aC>I@nm/p*+W8yH<CZdl&w\5y>^B$^9amhEn@JL1R@mq$Ij*V/EKcb>CF>Q8wFI#6^%LA*dQwR94u
G4Hh6* SqJLaXS:pQ+A8yD?iTw6a%a5LcR9SBhCD1IL/R?lC?pQw\9yZ!C1GC6C1mC>DX%Id$eZaw/kC?tQwk9y
mZG9A? Z!V1GV8G%EQ/+?lCikqhTF?ML1RwGWpj>lL>M@a!@pQ/E?lC?yQwR9yV/EL/X>CF/#Tqb8^X41Hbc?lC
TyKi@w ?6jSljS9wA9y*$RZ$4=FWBu:G$KF8:jSljV9wA9y*$WZ$4?HL1R9Ji!MuWH5pQ=>hCHpA*Rl@ajwR91Q
:YM<>P $IZ$j/hTM9a^qlLTj+I8yQ<WZan=DF%I@#t/pQ+LwkcRIDYR@p6$IZ$b8yC?HF%IeR=hTQ<Qwy1^4=Bw
Y/4WDw TQ<%8yD?G*RljRY/pQ+<8yD!&<8ZmV@jXXiV?@*dd=N:RbLI4e#QJ:e1N=jecpEk6&dKFHJ4?@Wn6/=#
*wnku% b*J@aI\k@lPTI5S@MWaR@<$aRj!SMaL+H<aI+p?MEeTjGTPI9#BGEC<!SlB@ScAA<d?E9JyhRlekW1pB
MlT1mF an&/ANGBLpC<km=A@A%hkHkXZaDakC=AdL^MH>bWVS@tjJ5?4FtmD&9Jy\>4#cWQe\u$ai+y>GF!Q@w\
#>RGX6 yVN>tPynC*l5BuJnZGApXa5#dcLbblcL<L@RZGR1M9/FL/T!tc$m8CLetI1<ILJCSA6><c>bZGEVSjy=
BTTyP1 9ynDKq4NlbDQKFyNbm9pN5P>:jeSARbIC$YDhGbnG%IVqBj@$=tqTR!\e$^8phqc^Vm#!Y\TdTaSCmYc
wHk@@A CRCYF:AX@l=NNpJtNq5BA/aEDDb\nandm<4&5CwGEZtI4kq\KiLmRlGLV>TJSYcCBHtMTJabcd$PqSZL
Hqk*?< AX<nJBcLC5&R^wTqA@!I&IMR@&*GdINwReJc^WAQJ^ZSH!yNBC5*%mwCJ4ERmLTb#EWe4LZ>X$QIc^dA
Q@51:Y I*%G+APp%G1emwL=dFR\TJjYDKR%me6NNtC%TASm@TJ>TBEWVPVRjdB^LF:!pIhIn<&INY\%68Em9Ecd
BcjuwA ^wV%ViIcH^E^\:$bTBI=^\pV!k4Shw&RcNVb9CXA6L\tRVc%PnXT1bDXS1\LTKYKAScPWcaKZAqmAkmB
j+Kp1m &TBbNtI<%IZbb5WKLMJe!Lh&LQY+Nw/EtMFdnlt1&+SXd1cKyVmK5J4ZP\GhLK+G^Gb?AV=pAdaIE4yC
=Fa4&! pn+5a%E:%yy9JEH$Fa%YqGmpGkWNW*KtIJRej&wTCqF=y<%DJqJ1S9pSNhRA!I!W&1C^dE>84d\*Q<@W
&BJnpi D58%ydCcmWJC\w9LR/*wZi5mjIMK9bXKdDZb5DyJX%B:l?IC?9!11511y5y^&<X&nDX:mPCEYDtJkMFw
Vd:^jG dR5%I<Z4FGI1k+b@1^G4nek!AVpmKTdkI:b?RJuZWlpI!PBdYiY8HL*hq/J&KEqKTFKAHG@4Jc%qZ1un
GRny9: @JVFCKyEIk<da^E&SBJSpnLkycY%pqW=Kphc&lnyI:jEK*+l\pLTe/RVWew#ZPL6lcT@1L1\SSD:^CKi
Ad^5FA \p^!a/^TK9&RHKA59=JI1=I4S?TLN!RL%Te1C&^Pbt!VZ9EYnY6WWW@6+Xc#TKKJ6TXTP<AYCLhYRt6#
Pk8A6E A5Lp1nS*yc+1&R*$!bZDLEZiSpB6t!6#*l1KWA%m8<hcAIYM=da>jAhIJbCGDC\EDCK^D#PnkpGEX6KI
MdEE5a F4t!A%KZnH@\e!G^XTCjR@NSpumFGKtGSFI6&L$ARwCNtqMpSRPTII44XK1!Y\pXy5LCkQSldjHiBVtd
==j4j8 B\kAF?D^V?bCwqcyRKP:enCpN^MYphlm=hWC&RAN<AWwM+yEqA*l4%HE&!AehRp%PVPTmkyc6HGMYA$Y
Wb\>PG 4i/Rm\yeL4mc/d=*qS*wKEL>B>SRH\d1AcZBbFdEIDQlMGN6/TE!GTT!Sd#JVAmNKQ8aH9WZ>ep&pTM\
y&cAqM eE/&XQyZJePhklZw14!=/lWpT?MZekXAI\AT:Ga^RNQMT^W^EH5+:A^p<Yan$ppmV#$4!SRZ9&S5#ZyA
=q=eE5 yFTGeC@YZbye&dW/Z<V1S9nIL/KmTjSDBM&maPDKZ^F:tcuiTGFk^+a%!1&LXlI*q6?kMc!=Mnm6M9&$
jTnMbZ Y<Tm<G:j#/Q8GpYelF9pF9$SAkV%BGAwCmD=&E*dAK^X6JBRMYCKL4qKA=55X^4TL>SKHI/Lk*VSdRC*
%BbZCN dC\RaXuml&4NJjbA/1uY#hlZW6%me*EVE=^W^WB>IDEh?KEREacW6A9y6ZaZqVTRG$8mShb/iQmqlCBX
nykMc$ JyJWKEkZMktR+VdmQMnjh1W!XG5Z^PV<qp1YyyC$wm\Fy/YuZ:l\8qc#mGVSu%C+SAP9$XbSb^KZeK+D
1MEwau <:1bmR^EkhXk+9W4I%<WwKRTKGHJeIF4TL8RZHucyZA:TC8+H#i>Rk8l#CbWH1m<%9RFH:RVqE!1iDQ=
Qd\I<L 1Fc^MyAGZyX8jkGn>GtX!XnJ5mbERetXREh/VR$ap@/c<SNAPETVIlwIu/matC&i^!IylYkM&WT6tZD*
68C\>T W1X@TmW\9aE\BcWuj*<l9jL$K%CZXHSb:IYAC4q$R9FNyGDBTnEc$+P^&CK&jEAPJFLNEGTVY*RSCaGw
+cI9CT yFA^KyXK8mE=QS%1HYNcK>X$>eLA6QTcY6/!5MCFcJpmATbTBNB/nIXGp>WE#kaDX:?K&J*ZkW*VpqS4
i8NeJ# lTJ\LCmN!%Kq^nqhG1AM4p#VbAGdCEnbZYuyF=LVK/61m=FbH5TADQAWtW#YRpSykn<4lBmZ85Skt+bQ
A:a=?B NF$XXbIqj\CaVFlcK9Wyqiu8!tCQKp+GEXQT%ewBi$+DJjBDY^=1&ak<A+AtkF6wli:eSAmY1>kRdXlq
-AF^CH 000e20cbddb001202b4 Page 21 of binaries2.zip
kpaZdW Zh5NB&!e5GdiCK8k/9&ApPRtp8GIqLS$wK9tNKwaKDYY*Gk5yEIDN9ky^pD\+L$^ZpeKpRTEtc/IBp5q
+B\&Ew 5AqWZJBZDX*qC4eXtFPbuy=TYdtuy6lEnDhlPVY\Jm1$!c1^^tSh^SXBpFbYSPDSM>9hHl&8w8=P+/1Y
#*CjeK Gk&GR#*w$pGw?!5!eAQlatHSJX^GbJCSPGY$:nh!$\IycCTEeLi>^h5XIYD@6Mw>%Z5WLe#ViBT54QR:
S5>\8F kY<%mlGLDEW*ejlGEm4ptVZVttueD<k!X*H#JhmncqAL?!eDu/Gk@qT*etWamZPhw6RyhZc$KZlEK=CV
ABWIX8 IqeG:cqGnkNe^hwLab5IXTdR5N>IyFn*b%wVWi@Wp:/^mMkbcBB1qR+FXLhHpi5CFSDIbJIp$86ySEhq
<>=k\^ j=Awau!lXcNm9=HD#WRc+CaVMGdw5Ku:$AC/\PbS#9pAKaWdJ\Ep4%YK8!+AlehYTi4M$$m\\9yZ%^V!
Xk6RMp mwD!I\aQ\9%RBECFq>YWkp^4\E:F\95B+HccX6Qa!uXK4X#Z*aaXc^S=E!HE<A<MC$t84K+BVaJAFYM9
VSq*Wd ncBME4\5SI$!ZYm!Lt/lmtikWIP=ckZT<tXTnAGcEAP?$$kN%c#%C5Yyy@8b>tP=AV:u%dP<!kq5wRa?
^imKnm Sijy$@S&*wq^5>t9Nc$!ybYVWXWn%*W1$cRt9=Idqet<<91j4mqELkGTVKPHMXaVIiAZjqNeYqjnS6et
SuPS*e Y1Cu5XpWK1e8Dawj\P&=K4p81IR*5eJpny&qKKBRqGwRXK6y9\pqRGPMB6=1$yCaqpQ^:c&<S:aSMWCc
TRN>AE #kd/BcTJ\CpkdK^Y1R8TnX\<6#8ye*FXDkAm5Y/ynSh1#X<DVH<mjXjyEK/@%5E^T\8H4!<Wp%8+>i8Q
tqNp5D :EEW^XbiWw8dim:W!kQVWL&WcD\!?yah9%wjmh>piqcFK5WC#VLMS6&\mcJM8=&pCNY1$J1/P6Y6WYLS
?<&EKb XCY!hEB%4W8nwl$P#G<#ch?N6mXBwnb4AjKLXkdbaEAi>k/6X+qjad9*%NZX&1*WqDM*Z1peCA1$B8TY
>>NlVG A>ak&>1KdnQb/Y8#4EJJcpGNBV%mMQb\PFw^R:Wd5LK^&yE^TyXTF&dupt<%W8<CyKSBC\ueW<&^KIY>
nnttPL PZD/%$wQ1KDpkCn6X5@5pw%*y/JYHnT#WWC+QkV8NAQVqLwP>9$t49t+Dp%4l8=A1iG!1yl/&>11G@EA
%Wj:PC ywMY<TB<:bdXKqtW*dA8iG<N%nh^G444b1yn4Q<>kCYITEK>%+K&WnJZbHj51cuSYMb4k8P^ABc+Q!nc
!cdkat +Ba>KY:^Jw\#<bwZmZYFI5$+GR6Swlw4hd5SVTFyDdne1HleXQ>*%CkqG5QE\pK1GT\@5A/kA^$d:aAC
dWQ5D* d6NAG=6p5CwRSTF!!&VYSN>1*P:!5M%h&RZZFMmFXqIn?+%RS=YpuX5AXZY^Jq6WM+WY^E9a+M=PGG$H
aT$S^m Lda%MQd^GQyp:jClQ$*uWHM*XcX^Bwd6pW9e?WkY>Bit@T&X\/BVBtWEX:yeale>hEHhEP5RC*K6WQ5C
Kjbp58 !4Y1iE8lKGwYIR!^5H\YM1i+@nAyI=1d&Rm=&i$PJRcmbl\^wlqCA8Ajj5*KmD9e?b\\wM4ETWNpJmLS
iY6D:H a8Nj8<Y?PEIp>yE^Ja16&%?y4K*bI!JI*56cuXia:A+yAWTkH+Gw^m95#tc*DCCyWhmwd6AWPpn<R1tG
lnN1hS L+khwFwc\RWA^*DFy!>Wy>it%=^YXlV!Hl^yGZGF1i=Rq>96yTRK+C>&%ZA^+\$VRcEpF*6alknkc/HT
G$/pBJ &:kBd1t:WF$F^pS6ZbZS$>%cnat<>KnnVaDA=ES<A@KyG1AT6Kam+y%MFFBdkT@eJ@at@9NtW48u/nSI
FKPh9h XHXhNbtDlaySZ&neiIY=*eHe!II9B:/h?M=d5b%jwu%:t$\XW8tVd8QF^y=A4D/hZqNhY:tu>4Sw5ljZ
kat4Qc ee9N%HmX5Wdm@dQIHMAk@MaGS4uhqpKdX4WY#lG+:N5Bp$$VZmy@$t$+NCGV9BDuXYyP%%RBDVYX6ZX%
>+pHy< ^h#enAIMWamBc*5It\MaS4nhGu#T/l1QLMXddBaV6uJEaeM1V4wN/lZdALKp5udQun1q841!89y$XX&h
/hBE^\ WplY=+m4VPh$!i=k+D:Z/mdA5NlhRpMT8QnIyJmA=pQDB&PS%Ba!1XBe*lQE9<lEM?QG!6MA88=$bcXT
kkDq<* DaPTP6ZwV#WMNI^R*B%K5A5EVmGjAEX?!YqQA<ClY/GylClJ1:dbWJlRdqGBYY\4XFQjIyQGALB1>y!8
=lpa%4 4cuee@y$LjKyEKBqF4bebiEn*HJXuW^tLqF^qR%1LDp6c=1YW&M=nW4QXFXnw6Gm*eRFC#4*&:RiE#Jd
ZHYZCW wAi1Qq%duc:W%6bXA\=:+SH+M%%ND5?91REYEkJm%t@JA&6k8MQJ+Fm&!<k!Y*K%6<@T1mmyD#bcpW#!
!d9V^R :bYu>?!yXYw1Ae@yt6Puc!4qPy%m9XwbDuRlFekqw9i*!wF%y!&FYtZaEXXXLYG44HS=lIBZpTtyD:bb
VkI\Y9 K/pl1IPc1q1wm?wc1JH$1ywch=*PtN\AGGy41>RT#WIDLIml^w+RAW\^FdY!nmCuXb:&%I@Y%6j&wV^w
&@FWA1 9B4BDnt>S#q>G5aHNZY%Xiq:EENljt6qD<$PXW:91bP69PZBL=@QNA&1Wt1=QXJwPw*@atWhaet9XC^6
^AEKK< @V&/tZ%IV/AG6%SYuRdYX>jkcKV8>J/$!t1=Vq>4Z?HY4BY%Nt^Q*SE9Web<dcyL4w!1\tc4tX4Fy&%+
#S:qQB X%qHuN^i8WjY1p::=6/5njZRXnl>Gt1nbk?lBHHaW\$G6?/eThFMIWDSCTBZ%SX#b1JMdKhI:Y>RVc&M
J+ZIKb wkLWXJP5Y!yQW*htATQH:pFJayh>5&epCHG%wA4&XFhYXm8A9:1!ck@kDZId1&m<DZ%a=!15\#1:Sm*A
!Z*NcA cPZ#luTh96Nq+yb4hb&NpFc4cPiATP#bw%W:6/@Td?b>5SYnqD%k:!qk:Nj5AiSXXXD&P9>mNGKcK:6X
$&mMaX :V=h8/ipWKMVCyyZmjM#k=RcP+ht1RcPYp%mFZHYCJXbYd*hk\^^bHe\<qHHFyBMAK$@DZXVdRCC\GaB
A8A<dI 4>&KA@E1G9!4XiHX5pqV&pmjhcNePaJ5N?SAVVYbdhdC:Z91T6AFmHXpnGK5*Rh4hkkuECJPA<+\GWwF
ZMHkNy iK6114BPkd:C#P%aWem*H9uAcI9ZQKjclGFXQ5c/wTwL6VF:jtYhkp!AKkVDFZmBXuhqIRqNJ9cSYWF<
L+lG8X GA\+*HWh:YDPuAc&kmFc1i\BuIHA:p\4nQ6pp&LyuEt#InAmI$1BK5%5:a$VLwXG4aa4K:tm!/>M4%NM
G*cGln mnZeXFX=wTc>EQLS&NGci#NyL1#GP4CpnNdpKlm#:>tn%EI^1/4BpC9bn<PwVKQSdb*Bb\SI^^k=yb=^
H%/F*m 8%YVHM=ByLY8GIJdpeQF?$&bX4n:944tCA%c+Y91bCV8RpP*E\lIiDwI!8AG+eZC^BWT8aZ:4XqGW&al
6Xp@!< tMdR!!MnpYSm1XbXupJ\NqyhqTCNcLSDnaH8Se5DSG1cipHtk$!45bQX/MJtbLX1SmQ!6lccNKnwG1ZP
:!^KN\ kBcicd>muAm5Bt&%*#P\S&+d$jVn\:FMKIkJl*=W4p^5juX%S!Dlh1m*86yCHN51qeHjK^j&HKH<^uAw
P>8b\t !HdIT&N4a*+X1P+X$LNB<lykhJ%yQ=WQuGiNcJBb?emTENK<ES?L+ClNt&TkeVqTi6yDM6Bim^m5IAVy
<aC:w6 y/8?4*XDyV^<l+XQ*i^HR4Ab%hYBYdDjBZ!811/6LccyF9k1^nDADbWNW4wjLbWt$&*Y@V:w?DeV^Cwh
W>htXn yAX!4EChW?h9A!:BeCa\9dLtki@*KHLtCBy+Y^EM<1NYKTaPaG5Cm^&Sp\SC9SLmRm!catJ&y?VupP\&
la>LpJ yjAtpP4M@b1RIm!RaKATbGW@VmyANSWnMT+a6E&44L/RjmF:XCcuEVkI^INWWYGldhbBS?#Gwel?4TJy
WCj5a! 1mHVSNPMm5%\@HLbTejJFpj*i5B5R6HmnDYTXF=R/llalCyPN<CAWDtI4ITKVJ?YZyYi$^Mk:RiGY&Dk
1Gc6ud 5d%Ra^SIk1LW*YdZT5<ukwDYGBMN#MCP5NpBb*&^:GCubEeQ1d:?bBpaLMbu8bn6S=qIB&\BlXaEX8Y8
R/adTw /!AjSNZlRn*%jYapqe/%B*CccKaMVYCW>>ymFAlE1<$NbbypIeRptE\Y5CD6^!YqZ8e+lYlhD4Y?E>LL
@SMZ>^ !T&pWp?D=q=:$ImmZAX>e4BTdIe1NG*Q4$wjmJXkMhEA%eyu#$\+X%YCAb=cwydVKuVC&YKp58!!XH?1
4jQS+j *8EwhlQGV9ZFp1*R$%=BJZ<QDR>cDPn?!9VY8kCSXIe%=R+Pn?RhK<6aYAIFPtjWeH9E$NRmlJ1EFpC%
PM>hN* WRVT/p>ihdAK^SFc:/mZdCdi4=yw&4pPJ%=BKL:H!cknbnA+SXQtuX4hEKNAIwChqY/nh:yLt%cLERS=
>j<wd: 8F6RVd&BiJ6Np4/SHI=V?QN<K^\X5mNM56t$?R/ebuHZBaH&A/FIV+jtEjAK6:QZDPIpeiktF>n5!d^X
@#=$Qt i!RPt:<kPIe:uY/pDd+mXl#ITk9R=uaaAJpD<ZYRdH^eRp?F/n14Mw\:XqSB?/6XcXknb6%t=NMJ1Bne
wA$*VR XXYXY$mjbuyJBlqSlICt+bGCM&cPLN^mE5RY\GiVnu>VV\RmL9+QZ+Z#6p#mQX\4W6qTF&cHIYB4juIc
>YPn@I H$Inkj5%Vi^L1lcK:R:+PZ\+E8kWkpAwLVcyVKy*P&+GnElb8!?$S#QcnCJaSch4ZZX/Cb@uBbn+%MQD
#^*<D6 h*GtbX&Q1#CV6PS5=@Ct1Kka=^^AP5e6BAPFktm#A#eX^+BVlM?HR8$L/weG#clEcpBiAmWVu!B\mY5n
wA=kt< 4b=c<lJF!LVRVKA6c4nkhMa+uZNclF6NLhn5nyjXu?TpZWPkW6Eb\!Rcl\L*p9pEHT6^$6V6&klQBYbl
A:HL6Y <?aZN^X+D!^EKe:A&WIWwBPe#WIRXLyhp8wh^a1n5:eCK#nmCwhe$SZ?kVmcHdJb6qit\%Cw&E&+*PKc
*mh/S9 &*u9$pccl:QpN\t#l<>&^kBCASkKCPi$C4$TNw4HETG&l+wKH*tSK=nDXSGAyBHnXI6li!8jb9ZD^T^L
&EBHbt d6u9tT8un6TpYSEtdTm5PEQu^DluE^?he\Su1^AA9LVbWXLC&*P^\6FWwbe5619$>NhPV<hY15c:6BtH
P!X?q@ VE$aNcWDIZakSbn6SLCIIAb4!!X$dlFEC:R#IwBc>TtqRk@*X@Fj<u%?&KJN*+4Ld$i\#*K\J19ST\d<
jZJ^H% k#aR=5\BVJG6Vu@AkVRa5H:KRQa/cyLGc/dC$XClPuTTN5F6+E>8?GKj=Vi*6Tc8yVp&NLL5JyMmBM>B
9nEmKM D5XE^e!Jpb%?$JTBq8CNN8qpMRtA+qA4DF#KHSX?>eAuq:aAScbuHVBMZuYuN4h9<6lTlSwGK%RjNB#P
l4m84% yTnuHBpyIR^BLcIFKHEkAwWn1HD<X6EBWW4ib^!IJMlGD=1LSQQcEb:uTMa&JQTR!R/WCHMAp>MbCZW!
BdGX@Z dM/\&bFS#tHPtPGkBWNMwCGIqqPALJDLhaYnEcT48B/?pm^&+SkJET+S\ktFNcHitS5VQZ44T1PQR1Qh
:?ZwnY Bu$V+BJm=nlB#9^tS#tHK$+Y1Vl%MW=b<BM*TyLmCMdcPcYS%Sjpwd:+bHG>\</ZVblyMRa6e/DFCG9>
^l=?+e pBnFGEXQ!PlluIuG$6C>twR5yA!qiVa\MTw1M6LynB4tnHILZXyEi%q^i?ZVWBFi:CmYHFK>hE1mJXhY
+kw$NX SR!%+nwStmi^ta9Y>KQyq$I?Xe<j@$EudTXpSBw$WhpbP5!JtIbHPqFB8EH/1Kp1\DniWB51dmP/HBL<
-AmGa> 0004f06c45a001202b4 Page 22 of binaries2.zip
atQky! R%QFlRbtY6mFV#B^Ha#bc541w>FC&I\$HMe%JHdpI5lj>#pchXGS>AYe\/IEy!J$ET%&V$>bwTtI=w4d
RI>Y:R V%WWI!jlAk44JY$NA1:#M^8LC9q!9ZYhVh:^Be+6+?wH^cVcFFPIRIICRlkVJV5:SA$HhpaBW$FabKED
J/uq*m !KSZD!tkkbw1dm>&uAR^AXdYu\KiqpqF6P^MyPX86CDLcDW@*AQGj&k5$J!9XeRj6EG:KJ6$SPJ5Elik
kl&Tbt C\pElpaBZ+eQX+R\m%Sj:NXGDtiFH\1KW6\ZCTTEy!RJ8IqLlHASw=WYuAFZ%/ktjP/Qm\4+EkT!C8%k
JBc?D8 >mJGq^AABCIu*XFlmBCwE+REm!TBak@RGNyWeajnqAT<4PjMhJDIHAj^+?5a4X:!Mu4nAk^CS:Q&J9+k
%m\Y8B &+aYt1qb$KFT:<k4D@<AqeYmTK^ipaJAPLH8Kl!6FRNQFb<1SuEBdkJ=J\HuTWBwLPIe6Z1IM%yV\@nn
eC+&+@ i^M><MAHu*+&8<*tS6JcBhZyN<#yHKbEBWbC:RtCtChLBy#86iey$P=cRBQiCTmKRTaqcAmAT5I1qCRd
iC6Q/^ Z:#u5%T5KIQSk%TSL<4yAMd5Rh6Gpc\t6^CPuSVIQuVIVW&SVRLRyIyl&lI%5K1At\=*ShRyS@EyCYl#
qlplh# THkBE=E!/YV>TS5u#Hj6b1w1MyMVH?NlN&BZdEGFaM%c5CG$Ct=u:/lIRDbe#JMAmTDE\FiImSGwW\bM
1CAQ4w kIn1ClASchnt\DkG$w!$FNJDGj=9+I<IR\kV%&/KLeSimI>H\Nw%6dmF#p+\NEAwRcMMl^1VAKWTe^@$
i\8B:W tnE^lN5patN\EDKpCiwPPAqXhlKIqQCt!MwZSHIC<V@V+Fplk\?VXL61C+SBk<%?WMSFK+C$m%MA!\*F
:RMC5a $TJbSMR#&/uEnBhmbkNiAWmXyFPPp<BJwA<+K1HMkG\Cm^&ukHJw:6RPjJcqb41$yZ\*eVLL!n:=>BNw
G/W56@ CZd:Rd9Fat1JdSccPdFRa+kSCeRPTZGPAa$KTEWJlSLWCSB=ClmKtyN:kX:RwV=E<u4M=86M?d4QELV5
ZS*FEZ yPPjTud:y&::qEJAKR1IFE^WkZCciD$/b$jGSM/GutqaJJVABDHa\pG^pLR/6CJRKSTyE>e!u8ZykDTL
VEHCS= %&mwnW^ZK@XVp46M@/u>W=hh5G!$6CT$CIBYTCR/wRKlj=w>DBSQ=P^I/n6mkFJ5=6A$WKMl>yMaACFA
&QjYl& =1tVpyZ$nA?q&jRI9T5?ucNq/LV1Y:yeBuyRLtNAdujA8:Eq5TXScQbkuSM#dLaCw^%XpCNHD8NaARFZ
6%w^!: wpmuSDYL1w&pmc?w>XpEC+S&66ITTX\mdpbXBDcm8#=RKyjK!<4Ln5l&%hIb/E%M#CPeRGZWdMH8Ll6H
&15/ej u1bl5+uTi8\uABMyPHD48a/D5tm1\PidiSNje$m4k&&+M4nRnPaJjM6qS*BbMZ#LyTN&8>8mT5F&SBMJ
CqpXh6 PKZY54FkDBJ:\jwDNCiyt=hRZmXiwSkAQcT6Qb%tc&=ZNDb\!TM8BSbJM$qq55P@HQ4ae5ZS5:\i/AWF
Geq\QR LhulY+!E#l+YPh5y!GZ*qJeBH$!CM#J!GImYVTJ?P4DqeIWHXZ8T>^?T#d6TYY5^c:wY&YlqLm=m=S5E
:#MRhi 4GZ%#R+GjRNi89J/h*Ew>1#RVe/PGmcWq:iWndHEAIqS\FkLaJGwWcLARy$YI?=/FGTHJHwZKmMtAJ#S
j8qt!M #Y\pylyy\Vd1KHMb#XyWNDq$eFQjCbYtKED#n=\nNDSedLmmqK6qa?!tGGk6VqSCJ#WYEt5h%C^BY1Y!
c&DtQW W!e%+1l>+JL:IuNPX>>X=D!&4B+G8^YPep<9m+Pdi6R4AARFBuuceNZXMP/*ekq=!pY&GL6<%PTwBRky
Xmc*Mb *KJ!pmTd:<J+SJ:X%dhmmRhFbTiBuTA:il4=h18k<Z=>@etVSC+TF!MwX%tb$6D^cpQD8SakNlIW4%$/
\1Y8T9 &Ty%lF+j<b>E=EC@LHWTjXcqa?YbM:6i5%1>!EmWBqh+S<F8S*>R&k=Tt\Lw&emwGNMubb@k!Sdu4:yA
>5@yN@ dCFIELbJ:n!&!!$bVmJT/LS:R8?F&5DYj9&@5Yl>n&9Y^\N*n$6p\964I@!BlB%6F>Awielh$Hi#BeBa
=jmQ9F X9dqq=@aa8cAdS+=P$c$K*q58V9QBYcCLLGVd1pLTLk9ndk5QL&4>hw>K/K6#P$a/#F&!/E&pdH%9DKl
e!PTD: KV1JJ6jX1?jQqX6A<WbT>b4!<yau\hih%!l%S=cmW9jk\pX<XuN/d:MZmdcp&&mV&p%h+QTJi8w8uNw+
ZwKh*% Kap^9DqC>>\m6EB9HSp=J^JGWYCQ=CW5V$B$ih9!<u/VPyibTbj!uT1$nD5h/$:$dyYBaFA>py8+YA/G
^&6Pw> J%k\mBcGC/CpwcXb5CWCIVl8^u+!WwkE6pLn!M6VEkKZJ!RC\4^6T6=X1SMBJ4II9quM/Mw*X8D/cq4*
P+!=hm nZ8SJNp#D+SW6VkGFD5AWV$TBSwdaAQdRF^tI$*WGlKVE5etnFWTPmRqJmTKiWCnJPY%Ty&Qi#dFmEX<
Cp/&H^ T+nXPJCRI%tkZuA:Ck^%REnK9jMIJJ=wlHJ>$%8!p*DP^1Ed>yBRkaR$#=Ikn?&cPDcS/AMKcWtC*TLb
hce9*c Fct#DShH$uamRkA*wGwKebeQ4cjHLWqt<JiXKd^FeGwdHRc\STYLTauyDe&Np#tM4ADSappa/\Rm+Teu
MmRNcq *IbpY9I5^/FZ5?jb5e*VqknCBqlRdc9t@tn9$\+Qp+%H&E/&t+P1+FN::BTPw1e=5CJncFaCtkDRCjcq
:B=mBj cEpAR&H5<LFn^+%NGAjjBMRMldFb\J\H^a@WGe%<TG1tHWI=EWT=ndaEAPEk1!c#VZI+&qw?DHQyF61H
nNWPnN 1/I:V6pkayRjND$ElJ<wD+>C6Au+JdRJcC9c\A+E6Dam%5T*L6EkhX%*RA4nDeByI4dV6mnRF+=PHpK>
!<nZI! $%QNFj+kVBbSFpLRlw%yEWWyL:F%?CBATQmkVlMTE>FRJCwqde?bnjaTWe6aQ^DZj?Q!jqwVZwk:Ee!m
eF+lQ8 4h/4^m8$!deKGDWb$LkA5RDnY5G>VuuIcQh\*hnl!qn@eelcJiFYSEqY6\np&dl\FyqwA^a&9^Zh#S/!
:1Ht9C cLPjCVyIwB=GFB%<c6S^qe>XPPydJVZQ#=KI6ZeupRSatlPElITYBCVLJpG>$B+%&wbCt#&Mc*4kmuNe
jV49j! hA=%l>9$pCm\+nkTD^6^c5LA1%LGCSEyD$T#8Zu5<BH8+eFabjB#nlZplJ6nAS86eyNww\p6BQj?Mt>D
DjY=Eq CuHHXBFEYG*e#DDd!nS1!1tm>NAT?VTX=:@4TXCYWD5JVpA=jB#JyqMi&\<wdE=wSpFB<bF5Nk$nTku8
H&LtHP %wH@nB+&94*ESpaNelNNKtTmH?J5kNE:Dkb=b<^yQZW1d#pkT^k^%wMNKt$A*nWnX=GqRCP\E@iiID6F
=:1yDl :?bLeZ%Q&nRHuPVdlKDm5FGa:aDR\AYqCbRyk!b+M*lPea\uh?WqAebE=#nAPHaE%B6kbHBFPIG?5e%A
Gc:C#C INCH5#^tM/<9*EGER>KmhdhccXMCEek*FAL=WAI?CaN#jcwn1y\tK@m+6?LW1X*R>!SCE^9dQHdeeJKW
*n/=9Y EeVVBL^VEt/KSjLA4m+ml9LhLu^9!5P>cCMW:kIFc\$dQi>DnMhB4iq\WP%*ycLmmqKl\<=iyey$X+\@
/@jpQw tdh4PhVkPK=QkL=^ZGaT^k=QeCa+kce+m&kt1eRJG!Nj?+<<Zh8HXB9%6KamWkDaEYNDpBAj8>ICtD1C
w?:ySV <Gm%B:>hiey!NcE:pVlPc\pJ\%GbRy$CjVRiwV%B6C<CX>&d?a1=>J9INlVS*1aNS!m99P<HA1?AFmpu
yNq?tm pjSDNE4FQchP:6wFHi9!SP!FmDBEN\=1EjAN=+VbJT9jD!icmTmWVhRltd*N&1=F5<uKy<F\:V=&pyKp
?*eiZB MhKNnJRhwd!H+1*^qLJ4VB=$=wqJ>!iNY#=&?hn:E\k4KY%u\9BE1n!TTXRub61hR:5?^I\?%Amwm?CV
1n41CS adk4p<dJwK=^!nc54W<<SbRcHEAn>P4LS!DK?^L8%>Rqe6W=Fm6Q6CA/9n?Z>yjS!qQeNFGWeVP*6E%F
:Dwd>i HnZcb8RA\mb5+NA%BQGtB!*SZcGi/4$4d>h1IBD+il<kHMhFFYRXXI\!6k>WZlq6D8W:@pCBpICChJlN
R+LmS^ 8c1=D?&tdDQ:dh:bFZ5bmCID&b#Lt:yGb5Wydawj/X!?Gt5#AbqLVCZGJkBdwY%aJKQNSnYIY+L+BBV6
/ZV8$: J^PLMt<^F%1^?6AGKC4$*V5Jb4Ap6XV+waySHCGcp5GyZ/ndp$<w8$duLie+E$CKElJ=u#5C^VXSBJ&G
:T+BNI Y\T^KtqKpjb5<c*KD@jq&=Py>uk9=VNm^e/*FhwF&Q1k5n9SVDN@MwRC8*!d56\9CSA1CaP\I4ENJpBN
^bYD6R kqqq\</Bn+>w1#nj++*mJGd&=Ra&%>9Z:ZAGqP+KF+11#&MVGi4#d8A4eJcLdCJTtAmXCXlSF%kp&mh1
HX?CwT NQPbb^^qe@PF8kunIPwt#Nw?>G8?mLQi&@HK!F^1JF^\i+Em*\YT8\$\p@%LtQG4JQRq%6I?V16uA//N
I1KnqT N6Pn6kQM^69=VPPN><RD\$H:iI^\6TLE+Yp\y+Dmi+DJJ#qtC&1>BKIb9<$JmBe*LS1JanQjyM%Ndy8S
dFZE%5 P1y?NFX6%61Mh//F@?Pj4R#/pm=6FkBkLc:\<Fwu:XL!SmK9E^ISNiIG4AtYQKpRi*jEc>Q\Eu#e*++p
qNF@H$ G+&1>Va#u&P=hu8*J<l&HK^$Q#+V4eLR+BV%%Qen^$G55JQPY&:BqwQX#JFd<pCQAlh^Mk/XHDRTpVRe
WG?e*# DWyyTL=lANXA8?MH4J=@Vd^5N1tMC:MCKykibQE:\A9$dq5PuE:p4Mc@dVSTlJaB/lVdlqtnk5>I$wnH
L$1PXG tH5uH+Q+mybbt+V%#Iwa5b1LEbZmtIaVkF:XiHI:Kw5<pC#+e8WQXT6yi+4=VAQ<QJ9B9hScm#cMw!eS
y@A8tG jMP8q%!6EZpGq%d5WCYHX!*T%$Q^TXjiMM6!MVEQS!FmutR&cn8^6h4CH/eZS?CcinhF<qtZhq9c#Z\m
lb+Yma Bp4DJR!6F1AaLGkD#p4kiCm/@BSJ>5qV$IiDTCh8!\QEiSaad8HY?mL9Lt1N+mL9RF!dB!ucMAw%y6q:
6kEE&= YIHa65t<!KwSnD\D%Qnk6bk@y#<q$%PhW@WuaZA5=\$D\e1#dM8DSw8hX46>?Eb6@*5:i5*bMPw4K8Ku
GAuh^b XLTVb/VZ:FEkXFLFFw+Q:HEY5G%qkB+wd5pd9C$QN/#ThE/:a\?Ie>4BDVdWG:Tl*lRy+l+u5+dJ^Aj9
PBbQPD G4<=t:D\Xk&6:4lNpcaRanJekG+J!M&V6pudn66\hww*BKM9<$!cDWSnA1RWu/PbVWPIFm6cSl4cI8%W
MAm:\# BD\1kLPdC#b!!AdaP^/HXwXV!#k:I6YjXKTS^>H1M%J!5u&KdJ:nLGmuN#j*C9qlITJ8PMi%#4p$mPe$
Ct&bn> t>4WF1c^&61VnI>!AD5C^5w8w?>^/jl^t<nFu5>>+AEaKMWpPGn<FSyy:EKHJ8Ba#$duubl!4d!LR9&l
?M1*lT Hj6lFLWcMuJ#k$^KjBJZlNCN&ypJ*kp1EqTETINHtuwle^16JKlJNPt6bF\a?Rb\tl<%meb5PmQCVNPX
u?a1d! tIjGNb/N<:^li&hTeJY#mF4Z11qZbCMhVGKp<X$SpautnNHEEbw$51m1cT8+!e\**yy!pSNWGYSaia=K
I#@+!\ IiJ=y&H#CAwhI&IqbW@>iBFb#WYpjpW?tMc!<q*@Gn=?FICX:GE#:98&$Zb&CMuN\D:K4J&\RKZFpVjH
V\=W?6 W5lS6#X\iyyMn!P=?BWSp$nQm*#tl*d?w+%Nhn$?N<R^DI=6cHMGCAS@&J/hC1MRj1CL%8BFc!E?teNA
-AQ\:A 000c1c10bdf001202b4 Page 23 of binaries2.zip
>:%EW? M$w+FajWthe\IbGk*y#tJZDYCYeNCJ8&ph9EN+^4?+wJ1>qFm^X$NuHDeu+IlEl&CS%mIhIeEquLJ1y#
/A/bh< %LLW&w8$CYW/ceFE!a6w>wY*teI&uEmZpi>Vy=*MRdVlCB>l88qJ!y4:cL^QB:XA%jAtlcINMKlG1Y$X
NQMTeu itkp?qHPmZ:AwJk:&JC>I6JccFdEVnkQa/Ih#6y/A4/LE5uMYwGhQ^ZcTkhS$FEhIy*qRywDV\W!c<Nb
j:T8RD +l^mJEPj1yCV!PhGSH/ICy&JRGnM6HVB^9H^bS@+?C%4MZIDm<#Hh%a!C1lT6RaBNBJ1NAmwj#d#cS&e
#alX?9 MTC:mik4+miu$JE:iGQpi:N6e69=A!&mkV@VVJqQJk:bYXRnJnM@B+ew=/hnwE*CJ*lymAL6kVeGM/=R
JKaWPq wAjN=QJDQ^A*:SI89Ck!*L/P#^jZ#?VcCk<6ww^+y:X8w*bMBn?MCIZIVIN%K#<1k:j#In1Ak!aTAA>R
m!q?=H WEndKh&i+\Kea1n*YCh$%<%A19lBN!l\Xy1>wdPb#NR#&LRVkECRVHVYpEupKlKSGuEbBp+%FZ1\<W4T
Mj+Li+ DwQkPC&6iDKCljBq^BlyklwuGnuuRBm%uwF/RT9N48Jw#MnH<Tm4Nn4y^5TuiVZ!/DACGndl^pjA&p^e
lB>9Sh DLQ\!VjEB9>bM:Dt#d!HM%JDRu*Dn&#m9LVS!W&<HSVT<T\m4%tcI/FcM>N=II4wn#jAT^%m=Q8lAYXH
19#uK? Z+dCd$M5!B#&QNkBmDSy!<WSi%ZQAXqIJ?Hk^%pX$XRuCbPwDZ<SN><=KY1:/^X1eHy/C6*JY+PeYw8a
=GAGjm N6%Mdb+/b6/Lt+%GdeEDhYW$>DMcpcee4$pdRjAVap#<mBZ+e%H4%6p5d4F4P&uSEPdM$uw>uBdH>wXa
HSYCew SR1nd5QEDWI/a+wREJEp>nkZyJ$mbKSnC9CEB=ju:Ac5\b/Yc\mn4<$m4w58wkeL@GEdhawt#>M\5?hp
kM&hKF HC=L@BRdPq&Mh$#</B6nK?:/NWH#^n%R&uI9IBLSlu8REm:+4y>Dy1CJp<wNNbLVIl1<FtqhqYa$aPhQ
qplhmD k%*5p1k4yqNe5L5w%LRb6D%E%yMV=pMdj4hb^P^ySX/#p=6au1PSVN/SK+*Qnhk>GQppJPthRyFQqGnu
nEda<F YiAPWe@=IEBbu*dT!d>&D=*b<#^QGw8$ebLu>Cj9KMLEpSim8c4Sc^K%CZTe^DB=D4aw%Pl5EY?^+Cdw
wN??8d hlVc&?+6C$MJI!jSbFFKtL5F46aTX8\C%%pT:C+==!+ykX?^ZBJcDDjF*FhTw4l%JY=*CV6*6cTVZCLL
IMtA$j ^enJQI56D%H$D#F1k^G#/X!X!l1?WQWNcwPml5kYP>BLnP+SyJu:SbduXj>m!C\yFmb&C>RiKF5K%EC*
ed+MKM ZeLuBbb=AYTCtp&6KqNeelhFqlZ/cw/m!I%K5N\kZ%Z+X?qI@?Sy\J@T\JTLDT+%\PLK5%9!^LkAd68Y
Im@@>/ !Gy\R:GF%la=I%8hLPcmwDP%6A4BJ8DSSlHu9:FaL4kW8pL6F9#TW*QJLp6/8$YY%RCqYJIkPN%ARtmT
!<YV:6 Xd<GcW/nHNXBY:RW/a\TalWljI/&pGq&qNM=&!uMWRRq$n@KGh8!SZH=&T&m1XWI+581lTlB69mlmL4R
n*RHlL EWY*BSNAmR%dmw8qQQ5/A#d1Iw85?yeLLFbXGk^1k\1@%waktb:1SVquK<+P6IDWKWR&SdY+*XAd5uwV
pL:Tc5 qNbC/=BckMIYp?CC&tqwAAm18!FMWiYTalAWt^%aBhAN:8Jmq&S=$ICu*JtKkdT<Jlb:Ti%<6hkm^ERN
4J!9GV e<bE$RLM!CnZFVYMSKFFSBITBQhqNdn8jDERabeEYXGb4BV4JM5WA#$WKXFW@\bLJG9=Xi%+*6/C!!6u
@PAd8G C$+lK4Lq+tY%k&\ZeeG*cDEJ:9?1kSiL:h5AmF6SXXp6%4tp?\^phWCA@%XLa&Q5ShXj6k8+:5a9y1uJ
tYmt&? jXENLwcCtBJMFkE<B6qmpRTZqq8!*G&ktdkT!l*b&QKLGu#Xkk8nlcmwpy@XIMl4MTWC/q?A8/JpAnRG
<m=*n^ 8dkEGD@cRD$C=qVEy5dau>ZAanEGm?*/D>/cwMmW4W/!a*EXYX<58Waa!M+y>yD<5^4RaMHFM/*@XkMA
:XZ%lA Gbd!b>Y9^JLkSndJ^e\?ZEYFdEMCFW6VbP^Q11HaND#T1WCPek9^=ThXV!\^!L>B$jItpm4XcGI6VuBq
jN#e6N 6%6yA5/IAla9?PwXCY5HpDqXQ?W*8cSS%SidkC$/8WRBuQQIF8IRtmIBk8G<GPuE%Q:uLZPeTmMW?#jJ
D#8%>^ auHJdnWW:*CFQAkuynAWw*1SuRCSX=MjqtpBWTG/PiGN5bBPF1MmI&P^ABbuT/Q1h%W!6TlCF%PJ1y+H
A?8nnM \h5wI5!N9JCGatl4ym$AXMbme5:MeZ8ydIR!By#jmA6#G=1^$eY+tpDdTB6^^VRJiR5IIp1BB^+$$+SY
*b4ZDR kQed4^!%tPZN>eC#E<$/YXRmGSd\16$yN/uh!pXwT\CwSak%6dRpt5TYFp8LdNFyXF9ETC#kihFdhjQ=
eZC9F/ PnXi^mnPS%PW5$XBtBaBuIC4Ww5k6Cn8luCq+Y1DY6h\FXyk5a$+/X<5CM%dkI:jVMSI1Jt<<Xwbpap6
nS^1MC VT148+wat=6W\&<YcG\YB!ySm\AX!m+&1Q4!BBKLeq#jA^KL!<==cibE6wDWqFQPaqFIEFwkb:qhJGF!
wFp/nw ID+8CybSdRknRX!B6WI5=CqHjaF=Vqp5JlVb<=KFWF%BXGMNhHIAb&bWE?c:AwwIeaG<<qLcwJRRZm/J
@TScR8 Lw>G5I<*<NNGCb<#Ey1n:1yhEhlF+F!JKLaR^nLECA*4m1TlBP45q9G!TejF!\+F9RkbJXqkIIcGB1^?
MJ4&SG !^Y+AWFIKLtw56<WmhJCW!/H$p+$$MmFTm6BNj&1/1=a*AJ#N!E#wTXD&dcAQBt8TubA@X>X%%A8T#yE
pa9ek: #lR1N!lFQCPBN&8A$AnhCc4kBkWp8XXk4a&kT4B>kHy\a%*bSd6RW1@14@=Y:yd$bekCKw#hQ5YAK<:N
^DIjSc ^HK:p?V\16$qMFMVWAQ645S8EcJc5H/lw>TJJW/XZYtR@M8pam<#JN6EA&&1JKYaN:8yqhw6hDP@CY\L
I!GEQI CA^$qR*RZCR5lS5d1tS9qQ#KJC>Q:QdJBn15^qMMC#a9C/k*ae=XKAiwH1kF:IaAjdpC9b>ph$tGMpp1
yX<*L4 <!uFbAMh5ECqpDky=!%Rt<=G\R?p^@KnGqk8kTGRb>IK$T\FqPH1IK$eEGKjc1CVq:kE^mAqj8hBRVhm
F\LIYG >\#%c@qJ%j$GnQCV:AuEmlayGPijeBLKW=J!8&$1qeV1%1lyybJeER\tZFbnAcX@BR$T/NBNAMRQ?uB:
1hWVq6 1^SaZIdLFm$cV!VJN6>Ac@Y=uPCGCiC1DVmmdi<T5K5D5ySLcwiGakq:8&*&QI5dYiTTPqClJAC1pahT
@CWTCh c=>nwL&yZPDucAYDtkbFGA!>b\88<t^^%c8l9+HwYi#RFihSGXt=StlbYdFGKICVdHG1Fhj+e$KFKA61
=kw\/j MZ8D$JE/iXB@LYBRYF!k9<MdECIaXh8RdItah$1Y\1CI=XkFpqSjL=V\eydbdi6=Pi&!!wwXwWP4yhY!
j:*BeC Bd>dJLFb/AqklRST4!*\l$8dSe8Y+lI\6&/>il+dJ!LK5/Mbl>mKReLki/4<T4FdC8YXJVuKwQ:BPDTW
4Q*%lS IGN5KWmI%aRYFNT*kB8I\HmbE!M+G+S81M$Byanp6GAZmCNB&eK%4X&^lNn+Ck^eXPMm+Y!XR5y\Il4?
\>pb#J :JE8YXYL@dBG$\Q+CZFk88qq!cSEhtmKnG!KdML@ypkqTn<Hh=ME+AJtAVeL/J\^X+XP6H6ByM+E&#SP
YV>FaX mIS8>N4VRKBmCRTc\jS!A11Am>TkdDMDcNhFwepFY1QJHR+t6N6h#L>kXBjLdtC6t$Hk%SIt8$9$EH?%
iXWltS ^HC8=F!JZPKY&SYqBHK/qGK>bLjhH5m*L=8PjAttZA6eQ+NYA4QN1RcYqGPX&Y*hk1#ciZFHuqeBLtT$
DE\<$+ &ZwlX/%+eInJW1kG8+wy5e%Y>HAaQ@8KNy:d*dJViRn6=j?4u/!EN!lkWCI?dNe&t@EiQSSFMjwDTy6N
np/iKh 5RhIKBjF=hB^q9?4GI&Gp64mkHJQwB+p^q$eAPc&#TaY*S8Kt5ZKN=maIHiHI@dmI<XH!8E1@k#/4jLQ
/<p8%5 wIala%N^y*JcW%tPyn1klXH!jNZaki@^l^?MtJ46@tVH8?^lS?#&a95Smd:FS*+y9wZ!FwPZW9l</hhp
4m&*=1 X&^?aqGSWil5LiVHW8AZB%>&&&>AEp@t6uhDWiV4!4ANcQeNhmdJeDu6HY^&:T9b:K$&k$l#F16Xa^i?
wKa>PM =cPI#lZTnnN1^kZ**9Gn&^Iwp4VqwiSnA<8#=au&dZRYYcN+i>6yd6h@cSCJT$8HtGk9pEkW$LFJ@DA6
Wm5N?h Y/E&pG^@6KDFlVMjNyh+N#@!&i+d:#*Sn<<I&dRV4uFyAu?ARRM?</1iXmNPa%wSE$%EtQmYQ=M5G9mt
SlNCn9 DBhNB9DbFa8ZbNF&lTaLBuAeBN$pitaccD#H#?Zt?#\!Ip^+&Jb&ND4bJaX6b%J/Vneud8HFV^?@?%1Y
p^nkEq $iMJYtLFH^9R\uGe^Tp!i=eG<HtQqE=G*DBD5*DcDlM/Wlbu+p\$Y$8HpuGekVn8^><qmDVnRdRD6IXX
^J#5:: NQNa!Ch\Ph?$J=6<Q8Dl*wBDa^!h$eSQ>iJuN9E%@Hn?tihMPmiF*PNLFZ<IaiNQE9n^^j\eib\#6hJ#
emX#1< =Hb4uFiG+>Gc*8$!wnd*^tj/?D!aQ^Hn=Mj6Ad+S>PTB@>HKHM<CF4/+ATe:jR>8JqHEp@Y:96Q%uj@#
B6&\:> >@6E@MH:jjTRX6@?@V+@^MC@Z>9:jRdSl?q*$Rhndu#?9@/H*@$FN#K@aCHYewWFNVGtp+W4LAS8>wEh
i5e<^l 5@A*F8JpLBkMQe6XF8bpj6$FIS=5ydqZYbCVkRpbi=YFN#NDMASVlKWB@jwB\n=F<I5ZlLupb?A#^GPc
Q6?4R\ &AaY&5^W!Ambw^6bcA8kdBH$5eLeS6c=lRWalH%C4JCC:<tLcYThIH1ALASAmCCp4KMALAMWV6&uE?Ic
AYC*=4 YWeI&AiRY\Xh!ypt%kXAWNy>AEK@Z%nY^MJdkZ!\t?QhpGS>E?9c!9^$A1GIy:<aC6QywQ^B5jGIQn+q
5e#=V# 5atFRd:kb5E9XwClBi5CQwMm1JDDH@AX^BFk9RGy%8&QhRup>#PpCQ8RuDmLp*YELAPcIZuKQmHc!WLS
*AG9F9 &!Vw++W#VpRaQGC@EB54^MWnNR\TII48dpG9SkP:%H&MJ$Q/DZE!/++#NJm5Y!94&H$j$Lm$mltA%ull
$uT+@w GR<eAJCEyY+IBBIEV&:k@L:FDT\+BbBwaRbb<F9ckPVwW\RNwtEjWBZ*DaPc*Cj5m@atDF:c#Kl&QRpy
MJAF5@ kRAAAZWKpkuFDk1G?H%^#W\HjIckV1$pTQ=^*#Fh9C\Rj@W/bFWkyAHi:^iIw$F+L&A1KN^m#tThk6Z6
FP!?t4 kGV:Fb+#DKRDwEP1FCAM/mK<ldtF\LpIcX<<?H9IWMMKW+6C?l*dN=jyn^XJpe<$5W+K6I<e1Ntd>4wa
?LP#BD 5#i^t%TW4#kLA>*AhN*uR8k#tNZF?pCMu:A$ttL<:kAaEB+Dq<=F8j!Ed/N>em*p8TDGZ!hWjHDT#j^/
JmX:u\ <D!4+Ry^5h/RS@i6pNQMInDQZnjV/ij!KETqm^MEN$WX#KWw8LMEcHEXFhW<:knG/Tk8&JP9I8eSm69u
pQ^?uI nV6neLFdXNa#YKmRqcF=KRZ:lZPM^aNVB+YMl6ldIYj\6^YLBjZ9$Cl#IBd1IY+bEBh65Lky&qBS5bqH
\e#&d9 L>cm#:AIAB*6S6kBl6!eyZG!J#i$^&k&VHetPJyuHlAuLBb1j%GEnw5BKI4SGZaTw8hThMj8*\yLBjWj
-AKdY9 000d0afaec4001202b4 Page 24 of binaries2.zip
NG4yK5 EJ=VS=wAe1<Qu16dTNG>>qWIFaI+D+S1MWdH^$Q>4A>i4+9l8aYqFYDn@kA%9Vmc=:dwnd4%8qk*/?9H
FwJqk@ >HE1ND@^B&kbMRyFB#J>68+SJqlp%niI/bdK\G4^A+ljy4APQRRll8t!hW8aEC&#Y#5\k@mhECjputG5
e%wN*1 u<\/kGIBwZyE9=l%l^48EeT/=+CPEWVRW\G/Jjw+!+D>EB#I+ydyFm8L^RaY1F@K+8wMm/MXCA=iCPA8
/$WVF6 CD#a55?lE^bmeC\$cuFm#mNZYZDeti=8Bk&J5b5DRRn*NRRL#T/tT8!\G!LQDSA6*aXC^911#ADIDLuu
Y>4^>u bLkbWFARi$!G=6b5YF\H:R^jh5aMlwY58\\$1Dmh5Fyl\h*h8nk*&:eQ5ke\jT#!AtQbeXpIm#&MbRBi
p8GtCT uRtPyjkBWE>^hTDyIbJ$%C&E4ka>WX1*V=R6A^m:^eCkeDyBb9+:Jiu+Q4eRhJkb+4+#^DYiWXkjGh8A
acDHw@ \9!DyElJekqB1=p8V6WLKwC:GeSSD@pMIjqc^qkLE>S#?=ci+=Hh5R$ep!ZR@>@KR8A!65>b9XX\KEm!
cbSP=Z Vle45&+lP@5BWyTXd\XlES8\XG+P&c8\u1DYR\aiR/mRL\=/K>%m6huNi4Y\LkPLhl:DLDtRcdEAMG8@
M4*$t$ e:PdYqtAQu@uRAAGa>b9F$MeXE<ebPpJYn1pZ>FPSYJHbEGJ<$hi^XCP4kPQ=Sj%m=V&^YF/kAh<kK4y
NltQ=w AVpkGHIEH?EF1^aP6:AiLlcpq*b8HRnER1u<F*<4XQ#e\u1/YPiRwwlnP!Q:TWikSABt<iKFQD#ktNS9
V?MF/R aJEE+ZFC*PLFFSY^Lc!Zm*ZyZbSjXLR#Z#wTy%ElYFw^Iml6b:?B@cBES$D8K:/Nk=aCEVi=td>ipw:6
E4G&k% XQI:TMel^&Ily%wRqpEYN?8wP%dWL:>jQ&puIFp5=IJ+#KW5ZWPpuV9:=SeFTeilTZ\4=AKtlc&5J+li
kA*k6k kHRMMkWXTeARqwQ>Q8WIl\48N#A@j?BPRFKSE:ha\Y+de+V*qw1pwu:>6pyHFk6^eVpX56DKi4mbIkZp
A88RZj :+V!SpJDbDqwNdm\VC^NpWIA\XaJhMQm8B\*SRAe9\PAYepQmD^!+KkkXECGbSAPE1bQp/Ykwu+:+/HG
#HMp$b lX\i*l&X4m\y?dyIkMj&6ZyTl\WZADip!H=HyH!kAeLu<uChhECTmud8QHBMAlwkjCGF/+NVnm6T+DFy
l4wYw< phS9b+VE\*9JaAZ6**<AIw/uFRESP@i=QBEhk?NZ4p!DwkAPEAVjCEFa8SL1W\Ib/Nj9CEVEWARLXwTR
dq:Em? ?AQTpcJ?^&PLjCPk$\*b6#J6@:Gh?%L!<+>DSC\u#iATAmGyIKV%\>BFQ1HHh5VG44+?:cAKLc%9cQ:n
!kTl!< c5:CwpE<>CabLSTw$eBF^+=@1%+IAY$A>kjA:wQp^kujk6KP*St!V:mRj:!kAG!KjdFc?X$Rec^IKDme
A6QWmA j*^q4LBjmI?qVElab=DQ&Q!6S<=L@a+eTF$J65E#FPejDI&tRlHCyIGT6LZj$iNH\jLb6=AZI%mIe\6l
YXX<m> ^@J*=leNLJAKyQmWqIYWT^eMe6WyB?tP/Bi$E&15+Mn??Pe+SL%AaliYlyIdCXYRh8DAT1&&wQeH8hM6
^4\Ace P1#p!=L@<cMyBc5JFRmJEAThSm^IcPS^YjI:L1&eT#Flitl$PWJP4kD!5QPAY>K9LNnLJSR64nlRT+5W
+uT=1P TbjY#!*yWmGmN#TujWIFNBhwLNDIJTqTphTnKHak:Ib>$Ll#16$CcNthtPM\XIPd&/6^m:EAm%wqZRGE
&%QL>J Rq91PADkRCC1A=SXYhIh6%B/\+DF$P1BTB%wA$t*E6J*e!M9lh\+1K*FRq14^A1wiZWABpQy5eHHH\Da
8DC6\# S#tEDuyIC/yBAH&CmYN+a9$?cPRC1aeCF/Dd&<1/8Bka4:qCL4VAqbATXAcwyhABECJA8/!IBVGHpl*q
:P56Dl +YDF=/LiAYWXj?A+qdkX6b=@<GI15Q>maV?tb$hJ8+ZylY1pBNm%M9WAN6FuTEpc>MBDAYn^m%%=FNwZ
AN+i^% &>9C8wNX>m!AWHQ<e+YCkkMABDR1Y8aDRF8CwS=@kQBS!k:B1LDmEG=KAiR@&p!Gw6+qRGcBMP%6b6%c
kh\eEb YMenkAn%hu#B$RQT<iltHA:+DRKhA<PFqcB5yQ%PDEIJ<a@LFYJVqiQ5PTj4DCPYI\L$TIcW@T5QFFkw
4eu4G1 BCW>pGAhTE68\lChH5$QCD1Ri8R\tJjNLES@HDRc5Aj+%wnnI%$I>H4/k9&H\hjEA1qZmlWpGQTACaHh
y%FLRw Y4\EI/TRB8ajYZBAknHXH+#L@519A^w>9<JaCe!hWJZyA&Z=X=X>B:aMnFhLj%F%C6m5\VCK@Eqq^<Ac
:D9&d* <YN?1k#5@Zb^T/=85>!1?9$MjX^*A\6Wq@ediFWKPm+hLTnaH!>ikD+=uIZLRju=Fmtjdi$*$CKq8KYR
9pqWm@ w/kGn^=1Ba9mNn<&6GtwwkduLILtXHTu1nbCVb^R%EB=WeGJytNk1Qm^9k%DbhY@<XlSWam5?m&TyEP!
tPHW*q G6C+eqWVALkbwy8H8qY@6IH=pMyQlqm*cpl>EjQ&kelYnG#hPXB$1@w$mn8@1lHmit5b>W4SC!=Xj%:1
p<SD1X C%GNL#bJQA1#/iYhkSDXSLtWhM^%p^@4&V#Wyi1PuZDl9C4G!IT4F&YCtNYHMCaN@9%ZNRI$5BABpcyY
P+E$%w mK1cX8wC@NIl<CpaDjq8C<F<14wcAu>Y%M/NS>SGCXP5lC5hm+MyEMB!8PbDmk8TtCahiFbX+!GFF$aD
1A@dGp ^Q/<S%X@WbBPcCIhEMaJTNGWBmuCPbb@\9WQXbXSCaWilSSyjTGFknD/<lSyyc4/K%TD=IV!Z5AWItKB
^!!Yan epREIP%aR/y@81w&TdIcil+T%EKCqCcNyW*AAp?5:wKZCZ$$:umn#lQu1QSalh<MSY?^N^>FI9E*c*Xl
4Vi1Ab pI>4ph>nbKM*J$Y&:pCcQDp4mPSdWHBP8NWPcee^MlbKGa8^5WS8Z<w1a<XLml1Rhk!mL/JeXcS+mY$A
aw6=PA :q&EdkGm#8>R%FC5ES\Y4$Jmd?8AyRci:\R#yqSSP$E1PSX=9nIq*q9^4RmmCLw!+ETanADmaYSMld<%
Kn+@*$ pQW>D\A8S1LER*Rn%kiwCwEIy>^a+\BiKwdw<\W<h#\uQSCyk>4yJ$5RGW>=X<aLSHyEEM>:Ec8bAXWh
D=K*yH =XVM9XLa6+?w9#WAeEQ8lY/J9RnS=+<TdhB*W<u:BwKFm@tL*FKZyWlZATGHIVVSD6tHNptyS>NeWyjn
>Pq4CD eZL5kbW4>!FnWwRZMj56kT!<TRIdNdJXCnk14W\6TC%RWkJm+@8&R8ciIT^RZ1aQalE5KL>BCn^\@Jna
Q4^J5Y A4p/?+HC1dk5BEHHEKj?B%J&By*V4QyX%+ymk?wZj\^jGW$c!X?YNM>R<DT6QE#nHX%IuJ^41M*N*i#M
P=qaMT qc9Dcne:/XiSKwF/AmX*WXIQ?EpSnAYB\w9<YXJaCN^5@RY/DdyXk*:Nb/ADA@+DTiRdKE1e9\94G6dX
>pMSmd M!QYYjeHW*R?M*VQ5W:ZV/b=J>Y8@P+9$MX$jYE$EPStiy%VdGHBaP$G1yXuY8t8>/X/B:<V*=ZhhKi1
dHQeVl 89h1YqpIYD&/DX@W16D9\Wk1<A%%deabF:>ZN/8%hj!?+*88/p69<98i*%bjX6#<jwK=94V?M4>j/qJe
P&kJ6^ =4@^?<*jd11Q1+i?Hum$RT:NhY&CpV>/*1+@ZXy:ku9$1mk4LudG#eIWF1lVc&4Lcl?y$*!#uG6#/&5>
WTdmIQ Q1ZY1dVYL?M?9*yZcYZGc\:N>:4TXQ?8/9G>ud6JXX9Zc#/%>N$*Zl9d4Qqpq%NYbe%uPHG=>N8M&wZe
%*W=Vl F\A/:QFGy%FLYjuGi\GK?l**BY/TFd?*%*1kXGia@YyhYy^BhT1/T?>/+6=X#Z:mBe&u@#bH$VYJC#%q
kQ6uTM 1Z%HX%44mZN8XuTXL1*W8wS9*>EyNTe>uBAXZc$*:yI4WZhy9<iuH5K/P<t=&hn1%pt!k#^19d?mK!&9
69SSZb +#H9NXZyuDqc55h/4&E9^AD*P81bAac@NHpSRh+J/H$EL5nZKaD%cIdB?F$K$>e^ueI/R69HkG!In+d+
pK*1St WImQl8R/jPP9Z5GA99X%$T\G^8<Y#AAR?ydYMbaIEM/\4bRmHFPWRIw##I<C?nkllb5CH8W\%H>F^j:M
B#y1JM Km=dhD#kq64TW9WSywyu&BcFhR=uE=^11Ry$q%wtQkw6FENW>cZ**P#6Y59ELV^p/KdTR:<&5+^jIe$b
JEc+tu C6qW4*+4NnQZb59::@PR#Wyy>d995M&%:Q**/!lEXi5QNVW#WYW@uPElyT?XjutmntYp5:w/B+dwXKi/
9?Welt S:Y\hEZ*R>&dEPL9=+cTRGYa*dw/^!PMhjRQ8PK5B?9a9<+^B4^?+X9MKqmm8yN9V4C\ML?dhZJyK@N9
biRV&> hwjZkc<85PW!?8+Qi^M%YeAQdwWFDRK?8yeGPLEE+Z:AHd>9:a!>M?H>Yk!=N?Bu^k/a%VQM*Le8B$Q1
+nN^bj A88a@mHu8<q5cZn#4SATcAp@\!KQ19Y6dP^&NbB%XqqaH:C%+liZ9l5>+RMwQ+bAaj<^%ZqJ6jT>I9KR
1d@e68 e$\jqmP16a+P:6I#CDpR19bI=!bZ@ZiBcnmF*Awt!@TZE&ypPXB>Q^15NNclu&&GYC?cYV*\DQ*>i^W9
NB9=Yu WW@WY/DG!L>%$uFZ4c9$#ATI:/T\WQ%Nh?$dC9XS=\eBaVIk&S8n%y59GYFRC>V:^@cMHAyX*MC>*ZZS
p1*W!j n#e=/>W*8Zjkk%%mq6dLNR4*>wma9t>Vci/t!#ILX=n@*PMQd46QWZXP1BGM@6!jyT#>>6%*bawPqw=H
@!mt#W l4#ZC9J#BpSLbTG/mEthZ5pA\/XTC@BLGL+68I>aK14L6BVVy<>>w9+Ny/9/MA@RH>H4J@XXXHXVHR<\
V*Ld6b ^B#9%E&y4d/p48eB@5Kk:9N#uWyy4aMHlA9B4INb4d&$+V56^j#Dl/P&NkKN#V!kn%%/:KXNjZQ1ua>w
=uL$k+ KWbI@i:c<YJy/>6cq4EHZ8n@i9<ne1*!Z^:RJYZtp>Pj/q+9LuX4MJ=:M9L1>IhEq?5>HuD4j>K?j1:@
:4wKH# ^QS/Ye5!&mZNj:y:q<&dT6@lAZ$*FphNu&+w9Z!=TR5+$jBF#H9u^11dFA&689H%4dXBqdtqyV#kQtiy
j+Nb/T 56j=$XJXd8ABE/4qtk>4yITqd>S1Ye!K1:6/?FC4c8aB>>TjMG>^@u&^Y9t/XnBF9jCbY4iph4PGbaL1
nHke1* NQhd?6YL/Y1GSp8^Yn?qMYlSdjy=HnBW#uHhh9@jN$l!1=bCXYV:a:1SJ<b1HL9jYXw:<JX99u8+<tYN
waNwcQ /?@X%H@E>Cqjn6FK&qN%Pw5iuQ@M+QMc?diWK9LQETEXC>IV6T^NqY@<PuY1MHNjmSaA^6q4@WbHuq1W
hi#d+5 #RMCL>i1:wLBZRVlGT%AdF#4uQZc$>%n*>VEAj1PWnZt4t?i@EaVKbj/61J<9YBR:EI6RH^DWiNmI9aj
Q+AE5! H/aF9F%d8qSh<QJZ?#WaPqX&8q#T9Bu##tpyNpPn4J==XJn6Ee6cyXySn<TuyWAAT4bai:u?SMY54kPm
/$8ph> 8Z<VqL#%%cL+&DQeQ>Tb?:4!c<GSBX4D8M?q11XXXRYDiDPcWQyc=iX%S^=<tZ5:!14+>m?LyKQeG%ld
Pd+6@I C/w^Jiab#c8+L1tnF<X?!4%?*%+!9%EnTi8=X!iKV9qZwe6l#c8Yq6c?@pyF6E^NjY!>Yq@=$mAeMpJj
\GDeVl %Ehh%!lX:PahW:nVyX+c$eA>HSdZ11@@b!H*/BS=ecQy5J6%eDNDSt*>/<>DB+TYli/k1q#+4+8F8Ju@
$K%%eJ uY?I<nF?1<9>6Z/bm\Y=tH/$@Fw4*Slm#:Z?phH$X*+\tA%9W9Ykj8F8A6!Bck=k4EFXYTA/85M5LECu
-AAEEN 00083a99984001202b4 Page 25 of binaries2.zip
IbjAJY A4Qi1G=Xhb?C99VDQ9KaZh@@5Yhim1%FDi4u/Bh&?LHyd#?X5/CwiJWD6jXQ19y69/hXiciw!ktZ6SDH
=GZJX8 >HBXF1Acm?5\=EM\y@8B:\leqR&55<EQ$5nhFF#$y8y@^SBMw#\Jw=IGTPP1AD5+<G8Ij^yC#pQIL\$a
B/iQ/K <ktEQAAc<1wIj^e^=C1E9AlyYnDZFW<cGE5HZMIRlYQj4yc4LuYj&C1&@MBL?AtEjNV<yTm4ckPG@E8%
S/l+XP kiT@<utK/J4k?m?GjK5?De!a&n%TXWVZd^^P8ZyIuRD?XqX8SX\@KYyILZTyK8LC<9n>C<cJyeyT%R%$
/e!%WB 8cnM*!11wXcBeRiY?VeMkVRlE^R\A!DZ4/%ctyBDmkduG>a=GM1n8p6X$FRI=!Jml@Fy/!H%bdWJ8h1K
6%jQhe Ib@AaCXDqhSYCHt:lXMlTTjWZ%TZ1Dc=#uI?9^>#CLklm/*Fqd<lu*>X9>HhCTE8WSa*Eih@W4?1AX+H
Fk^<A! @C11FanLEQm%?8DEBPKlLCa$<VTuC96D!Fi1<!ZZL+n4c@Yn=R<B=qK^%dtWiPlWL$c6LqYXaqAm4qdP
A:ZAmQ 5iQ#Ip?wnaIw@%1MXQnJ4^?biZ/Gi8qmdY54ehZ9*#QtF\?WH8>>/LZTE>>?k#\EqSi!Y%4>ijJ$@>R=
E$i*X* F%kHyyNXX6?m/9:NRltDAc@LCRJ/RSQd@6BM&aSGXje1Yutk>MA\h1u/q5Qa+i5ia+dwjj/h?n?XQ&qc
%^EmuQ DIdwF#XhjG@?>$i@tBXqLanGpPAb*ie@Gn>k\dD=@=+<K=yMmTDL\GNB?SE:<$PPHj/h$RwMm>k\dRVp
njy9K^ #%k%jblPC@E5Q9A5K@DZql&ATeXY5/*5uP/@RYPuVBtG\/Xu6NRQ/CJakm:SZ#@uIjKH5IjaiF%m@w1a
&TQAeX %cqbES6TM4NTM>bFbK!MtQ9A*Ik^R+bFbKa<uJPctbIXpbRh5TaqKT5:a8L/>TqJtWu4X1SE#Eycq:R1
KF:cc/ JVNm?JBlR$aMmamam!qTIE@181#5yDX4I4JZy$Spbc#M#p*KVBp!lDCG\Ze\G*^aV*S5CJ1<Pmq#SWdT
Vi9NQD G9c@@IS/?iQjnl9<E?B#H>R8yn@#C\Im5#M!%tTFLWncpBI^LZXNT5VE4QElp=QYXYSHCP8TM<D5Dta>
i5SnTp i%L$%HW4Mp*45%PT9Rt:WjmC%FZ4jAJ=+mpy%!aPwuC+<S?!j6X/@!Fb1c9<l!Sq4RnW+QwnuFDNM^R>
I&4#M& kS1Rnyw:NDaqM*Yq!V<8hZ%K\IKWNTp45t>c5DwnN+LCW%epbYQh#W@J!qtVuZZV>NVpqB9GBE>ip:y?
ApMAe+ iWbTbuKZ%hub/<eQHb1dt+6qG4Ima&*k=M!W=NV5LQ<b/%bt?M>PMYd:V<qaq?K@ID6nQYPByc#QI#FR
iDZG9E y<qi<4IlTRTI#y1pVJTE:NXJ/!JGnukwItqhe5TKyHZ4M4InqpQ/%K#%c=JMpD=%ZWSTSG+1<Db*TFla
B4KSm4 ZEdPt8RIW$bP^J4W>BRTF\K+ItN>KkLQwCB9kTh$$9mV8t=X^FeDlu@>YSk!!894%Sa>6F%Ed+&FGMG=
ba1LdD /I$KBZb/QWM$CW=bq$*EyET5V<4KY4</E\NZb9CkqXmntH#<?L?TuAkC>4inbQ!R9=!XMI*+K<t#TCc$
Lnt\F5 Tlujc<c/FStbtSDmp*bI^IDla:AG5#V&?ICBYp#%bBumce9btccIyFXJ1i8<^K:JAHqK$by&V8aKnTHi
RA9DAe RkDkyP!eVF<?*Z6h/Y?A*kMkQeWWpRXm9R+Eb$%G:9lS%&XipdF8A@lAyyQYRDC9YiB\G:D^*@pIC5D%
LD/\QK wMMmbaH+bc@P!MpG>dXmW81/JKARMlQ%&Tu4pwF@YJR58G*LAyK+LtQhaMk^b$FEVldw!TESaYHI!E^1
SZq6?> Xd:ARi>yap?WJ1%NmWnKw98M#NSX1XlwTkwKM^+pH&nFSkDJ5=B4kCp#JS5aj1MeaYH#J/=ENukI\nTy
>JC8eZ &Tq45?/KABXLLatk+E%8$4y5BLe?JZN6$nyk&ByVSA1^&lh!%kTBk$^y+>n@BhTp//CmT9m@LQip>1^A
nZna%a Tj5jRW9NunD%8pL?d/DM?$NT@#eRS$@<u#GFYDql&Q<kF=b1\6ewj/8^Z%1^PkMEu8RYpt8W+C%A!RT>
S*Kl<q 5yJIRyBITC=Zti$EFI5\MG8RJ6T?4TBy?SwTc/*VwG^64WdLB+p#iT/Vy$\*qQ@jJVEb?+4W4Ap#NZZB
8Fbj9m qTGEAYGwW$DTWyEK$%*aTYZ#9Kqb1#F9W4K*4$H66kdVb$Ll^yjH?Py:%BHR9cX+DaG5%Wtcul5T5eB:
TE+jln u?ZdyLM#Mut9%=aL6M9cmB#RZ<ClqBVRN$Mm!QwmQG6#5wlytTtD&*JA&cAVSpY&F5BF4M>b9mb%BSGF
<CY4Qw ad:1EP9Zt\*%HQT&Q6wj:J:X$NQ#YZZ@tKpLa#1nwVjX8D+nE*M<BCDZ4=w/4R8F6nN+&QyXC/cFa:mQ
98!E14 \dN?%bRFQVB5C1m5Fc5lhIFH@TPGWTPQD:@::uES5%P!e#M!$<H/!eyapR1>B%RG>E=DImbCjWMN4<:P
#Mq4Ft RwqI!h\A#ACdK=CF*e^NF+A+aDnJCP4wATQRDB$\<yb4I:N<a*6P#pBFDnC^SqAI5/nE?kHDP$H/kWB6
yR%JKC cmauhlAF#E@bpJG8BZVGkCtyYTm$QpttJK$FT=eHhQiaF6lVIjmXGVu4pt?@aYnERMkSMYNK^H%R%EFl
+$N/:! p=KT&#4I5AY?@ZXZnma:CiWnHilba^4E9Ld?u*\$8>@4??e@@@tnN$V><eEH\j@V#%1A?mB:EBQ<^Q*1
THbJSZ Q#G/LRFt9wH@^^>@%9\@@pniu#R@W*@/<WejL%N@@8pu<Hu>WB:!1d>Z*n@=@EWi6MLH%^eX=Y#&l4R&
Z%AnD8 N#bmRK\Y$N4IjQ&6WSmN@ybY:5iQ5<*9=F/99>uyJK@tl\D<iL&5Nba?LT*iA4T&\Kh>CZ%>j@c^ZB<W
4?m>L* 4n4Ice+@lDe6b@MLDwH4D5*jAY:+4p@#h^R+YHl?96e6RLeA9PC!qwICT8>^\%5KDnq<+Q/qMwSXu!Pu
SB#lH! /8!ZiFQF#y/6B9eeh<QPlIJ:nwYhQZ8h?!Zt4AI9y8eDY\SZ4RHp#9YjcQ\L6QSiN8^p9:uSd!=jPQ*N
uQ^??i Bed^n6GP9uYB*9IFY94YVZBMeInN@I9*Q9EER&@yFB%^tM%q^/LuBl&dN#j!eQi=IaeN:K@B$Q>Ql1l1
myW!:S i+cGl%dZ?94h=Y1%d\Lbkd?@:A>Z&:etB$Q86mX\R^&e4ZGwuw>!YTwB9?PciEeu^4?i?I=XQPB*+!>Z
A\yhTp *VBiy5wE?F1AXn=9jCewaX<5bmh&//X!kNGZ9h*H+SMj*4u#BRiQ4:4%$luY/W4qCicd9!@!p?I9X%Ey
NC@8q^ pb$?<b*I*?dq<hX6u%4t&cPl184@TBj=j9Rc/>5AlH94^HGN9@\cj/mn9b?XZ^N@%6HP#%F+@cGeB1<j
n=Qpe$ 14!<ub?^ekj/\%Z/PqTR5ud^+Ye@eQn/*Yj:PdV$ICyakLh>+^&/L&9dqdh#F\+j=Rw1T>h=1A>?nQa6
//Z9$J L$dZ6@p^Y9ay9@^?=/FXY9t^&e6jjmCj$j!wF8V1$m4t>aihe=ZKb#S@&Du+19Jb^u#wD#*L&9p=Q?18
VHw=!P <X?88<b@8i+/Q+1&>1H$9nJVy?pBd+DD\$u6w:d#j*qYc:S8XZYV*<&%kA41kQ6=w$X%+Cd@YWwk!>Y!
lu<n^& nH+NBZm+9?d!=Zd?L/6SnjA!wy>4Ac+P*F+@d/+!?m?lu#hu>J?ycS>@/b4+t1y4<y>6H*<hjQJ#hhCG
pwGX!/ n=i9!w8Q8VH?4BhjG:<+Ql=QTe:/^y@>A@?q5&jL1nS<+D>Ve@b5&H<Su$L?T=jPq6XWIV:qM94l@p9I
Ae^4&I A9mW!=jd\TP@n?LA>L+!wGk#5@?9jQ=EM/uMCSdE:!bRuW:I@95JXIyS@>?K@^QqmwFN<AEn18XGChTt
&\DBk@ ^mb8a4Y+%Qc/tu@eL4e5!=:+Q<9QhNh<45&9e:hG6a9@H?h*6+PA?epp@L*<LY&jG<Z4&9H9B9GaSK@Z
SY:J1w B*PV*BPQlXBdt:Xw*bIq\W6W>n9=%YD+nN#SLl=y<BKmBw>e51M>@P9L!K:BV^A<uBnyGSHePQ>jn>iN
S@MY>k 9QFH9W:a49t\@+<?@ne5^HWmj&$dcS@jiM%HdXd@PJ:=J4lS9G?CG<R*NnY%JdlBjD514w>*c8L:i@GN
DHBt#< &IKej^BQcXT%LS/\?X#+c%RDA>W@!K<Gh8#aZj*hiLZJ&dF:Y:\GY@5D9^+KtJ#<i@qXQjN*imm<AZ<k
phY4hQ &4>D=*dq>#D688n4<u8mj!jiE?&/ed\u?uj+4++M+6HZ<L>Xm%hGBw$M\8nGc?Ll\?NHnq!C$ViKl=?/
@>RcmP bIqK$i*nMVNh$DWC/5b4+>8Jl1j?@$\?*H<Y:*d@YV!t?NN+L1:Zjd#\j?@nd6MBj/+Et6y>uE%N%!mB
!*6jF/ yuc+Y=1ec49?WY$mtL:^WT*6Jqc+XiAd:=9Ac^Y$^YMjy94$/6mpY%F\6Qn&TwBmjPNdZQn=@jl&T5KH
1cV6hi Lh=+e6Z44aId^j9&!m$<94uJ%iKN>?&X6jkt%8L/w@!8qn@Pn>F@qL>h?Y/R@>4!i/&CG<Z:YkW*wM?Z
w4%qJd j!*P/?uD?9Zp>@DZq:+d!be9jd:=?ch>?c/V*/d4+&@al64FE$Z6uZd^SFF:y<Y4BCCiKG496HkdKR1e
Jy\cKW m@QG^&u^N9LjK=<u@l4/9dZ^F=YA:%\qL6:$:<Sa<KiMlR^58@yC&kk>:wTAjHpYeC%5R6=#tu8R*Am>
EZ&b49 BhJbtL/VbaQ@h^dt*<8!T4@i\uS%FyMq&5LaGdmmJWp/A#DP*NktRj!BPPJ1b1#nPP*1^jFQWQDCEe\j
QV:l$\ ZG+eeeLX4F%+Z+j+44&8uc<XacAc#Z4B%R&8LuB%l18VJb4%QSQNR8Bm$ZDXQbC:bt<$$\XFM**?A=5?
*qEEt< cw=t\eMk@dJyTu>IM\P8y/PnhZiemhdQnJ/p:*Xt<kjDwmhZ%y&b651C?SHPM4l\Bbp=GujGC+JSlDIm
^6ldi4 jqHFhey88BT+XL\5eJ*^8TCh/wC4&ih!cPFu@8JXy?XV6A99/=AHE\B@BJ5JX\kdcyuBSy<J5k!6t^+>
p#H\Mm 4m/<dtDhA*Zn/qmE/ImP5AT^CM9Np!J1^8uAjRneAHCn\YZpTt@1I<TGmSGS^#yESLByEbGTBX#G4!*/
$h^*&: mInwLeQ/@j*^i&>:NGAClPF%:\TkA@FQAQwuAQ*k^<5C%^t+/n!Z!P9#V!@SJ<<NL5Cq88FT6R99Hhw<
=#*&IN /:*M#FbC5*uWe9Z\%bPQY6T<@69:Y*ybk1B+#Cjiy!ZB6^t@jK=Y4I5iFn$\?6:bihHBD?&LnywhG%$!
jWED\6 *d1pIiGn/IDwRFES/$Tew*ZDuWyjBi:=F$MWD+^HBy49Zit9?t@yhuZWF9@md81wcQ<y#<^/9S$M6?4#
>Q1=\c dRjDemQLQWTTcMwt^BFC4uybI!H$!*wMiQp!8Pe$>^LPnjB\Qq9W<S^#>GZk%4A46e!l#S9!iWwHc#iu
@==FMT yM&@l&6B+XyuGc=NB+h4bRyu15Q^bc&D@KH8<uDtWB*lb+iT*@FqKecH5%5wZ6aNljVutF\J?eK1#:uW
C?A8jJ euDQXc85ZJ5ZK>jt9<w9l:jNiLYXRb9mA9@bKmkD<MJhBYWIeZ@84118JX=Wucpqt18?4CeiXJ&6>dwW
^9$uME D9E$G\V^+X>YX&M+\WZ*VBX<c?9C9:^Wjct/*1eMj@R<TIGQ:%R=ju\C<N:H4!l8F?d\V8hk@>!CS$61
@INHem !cE@=@=YGw?&?h$W$Jcin%eX:WN?T1LTCF*#8&qM*Z+<V=LpP:=X@>Le6M+*$VZnT@Yc<aytRdd=iSd\
k/%B^E $$kIl*F<p1HNJMa^F<bVCllE+SC4Ld@i&bK5i9LnTKSDT%6?hTVna^:\6@KS^BINH\$iFQA=QZ+aLCmK
-A^yWk 000930fb9d0001202b4 Page 26 of binaries2.zip
Gapn65 Nkd\5e@J=9i%^/H:bhh%6#jmkei5>9AAc\QNHI$HZB:R#:QA9bQ<*EV%!APaQa#<Y9&TtcT&!RPb6Vj\
c8SE<E ?/Vu?dYQJ:@Z9NDT6=qVZn<Dc+XjKnhHZJCe4l9!+H<#@?#^c@QQdZ=6@6u4=@QQZ4?GRuX:=thy@nte
F$bZ4# >hZ<jQ:bwi8MbY8dj*/:<\8hP@h6<=?<yjn66$8><<EP%8iFK%je*9ukK=$91PZqdjQB+bWu&5<Hi@G*
TaBjIW u@@>C@=4=ye><<<i@@<9##@@9#@89C/?@dn#B9H6^y*Z^:ejh%+j**:e&Vdt9hG+W<Yb$Qd^98NPXc<L
K4u:t8 Dk:&GZliP?:TL%pTHL\ntD:1DiQ%\TN*LKGQiwN^J<:EL6pS4PL*B8M!qe?$k6=#1neeq/p+$@1H+:L4
@hnWLe /Q@Dehj@Rj#%+:L&<hiMP/?L@@?QP@?@HZj/nnem&A#eBG/JaNPnI%l+*Vn&RN$WGC>5d+/PiMYjSd#w
$b*CL= ulT^>bk8a99el!LY5ICIeT^cG%PkC&MKNlG8@>9^l9m@G%9<n<adjK!\@6:y@65@55e<EdQw5jZhw9@A
NhEQ:\ #ljh%+$X&6t*Xc4tww&6wl>5bb*:LN1*n5=>kVy\4%#w*Bj5X$ju$6yc6F59RJYlm?uQeH8Y:N91*:F9
RqGCeP 1&>k*@/yZhPpNTPQdihSc^:dV1?yMc+CXc@/+*cJ1ke:hAjyP4JLIHu\EuWpjD%&CGk4XFbi8<T4Nyqt
VqWT^A y:R%a>Xu+8y*:S4uNZbN!=@aNY!K6p^SN&Q!:N5bL59bCw#JA+NuP@Nnn%Gub&Ddy<&jPw%mLhjE=pQw
l>mH6: Dq#Gk<5YKWXkMi5qVF\ZpbKbtbEbpdFmSW+t4kLMZa*LLqQZyYcuJ1%J*ilb%+1LG6ipL5>M!nTNy<Yj
tnmXie R<LCQN6FjDa&=GTqJA<=%lbB/#+^Vq5q4!*dZJ/S9Sy*%Yn4&#P>!<WB/8VXGdlE>c8=tTp4W#JV%1%I
QMQ!+P !j45/+mXtSq4KjuW=NV5mLWy/*L+w8Le%P\X1#&LXcjSc6Q%Ti6T%tBRXp4&hSl+RXI#%8Hc*Dh?9/BJ
SZaIlD /$#ck6J%6Pa*InqqbXLPtt\Q5CG@8/^*jWwt4YlFCEp4EFZdCu8ECCRK&nJqRE<+p6c9Z?QbqcI69/X\
\YSuh1 dd*^hdk@@?N!6%5Q?#<69ti6M>VTB6wb+m&<D>m@SwN9PZ/QqC@?lJVM%A%+@:?nBbiYImGiqhbiTu!k
nj$J9I @pXTjM9^i:RW@D+6umcWqL\YtqbYhtbTNyS4jb8Ip*Dilc$Q^Dp%!:QQLFudBuLhbnVCk&&R4?=ipdE8
*dEkQP G+TNq?5/SEP/J%*d#5hHDBk?DFh#b+C<eqLdC4$eAc=h9!aFF?M8V%tSBM$c$k<b%u:=h:5Mde859SqG
&aj>&! DBu<B^u+ItVj%Hj@RY49D18lG#^4uZ%!W5FYiDaV@YuBl9PC@W/Gc\5&uBj5h%L@WeGGD+tKch9C>Yhq
t:SEwt Gunn6NeZb>TNE@=^Ti:*b9K1$9>JVh:#q:NjZ/<Q@PY<j%#Lk#\N6F&iNWp=/&my9R?^R!hG=Ka5n%mi
m>>SIC tbGdqbL==?unj1<j>NubwY*M\Ia#JELd:MVZ&8itcP91Qa%tDT4N>hAVVt@dWkXe#cANXJ+hDSp4X?I?
am8Kk4 mI#MbN#GqaFhJ?FbpLIC>*LEy1aAZGmi&DcHpBYp?*R+$*$!uLGAAj4\4^=LYA?>?M&GMc#Z^Ju#a/CQ
VY\#pA @*#KnJmbLEkZ5CBt@8*MZ=hJ6wKj:8ZWFY9GkX5D:mnty??a8mILdAn>@iCPA#eQ*FHkquH4\c@HqJpQ
6PGkml LGRBjp8TX&R9b*1@X/dMuQMA8PiVWyK#tb>jc^LRCPQ5!NRXc&>uP9<^+I+Dh#c+w<BhPXta9+D=?b8V
K$m^4< kBJI>@LeGbNn\Q?*JIVH@C?ty/=LB4iJ&#RG@cVbW&cC&=GhBcPc5jt$P*WWt^LB8w&t?>E5B8+jwQ5^
VZC>e1 dCue^>Q>YLanR4iL:=Y%?I#k#/w1\Etty#/@+H%aKh*@nQjli?n?I6=*u56^+Z&*hI/L:q@n8QC?i$?P
&jp<#+ C?=%8<\E@%Q&dIV8md$eJu5B:6?p?%@b!^G/*Z@u<NubCN&#h@E!5B<mhKXdKi>YQAu>yb@w@nG<j@qZ
X+LA&8 86?P>!j1/V+Q:>>b&yd?le1&>Eh1&>Ij@%hd?neV&6I@Z>/Y99D469TH9t%L@*weVa9jVPtJ6/G*$Q*n
kqVhML dZBPZt&De&y5G=^Vt>4k9L8mDe=#a>9kFN#VB8j$R&%\Zy*VB8i%BY%\*w61k*NkRl8eA^?&\VqX&kdu
^15%>i qeq6eF:=^Ke<L@4IR=$*uIZqiNP#MI5ZD89M/e4H?&/ShL<D+bVti8TH5a+FH9ql4NM5n@\\%mZII#?M
LWJ@Ka hj@iI#?M>ZnAI#>\@=yHjyn8mS=6eNm9djDDH9iS!Wq6el8i%Tc*uj8$yiq!Z68B$BZWRq?/*<L/\V*u
W9yK+# =%a&GP==*V*KwH*$E4YYeT>ni8Jul#eSd<@d/j+69P@q<kq@8!*<y1h>\8N<\wi&<duLd:\MiN>%9Li?
cbZ9&P YFe8<+@T@ih6/d6%+i$Fciph=/XL=:jFT:58QeqL8$/<VY99t=l8%#kQuAnh@u!N4uibdu?DF:/8qM4Y
>LG<V@ bYbGd5T5qLWbwH@npnJ^P%LH?S:DcpEPcP?R!dmBnG+:#p4NYlG^IB8GFhDJb\XPZdh1VY4Y/9DbKbna
mp:8b? qIX:45aPMacRj<!+aTPGlW=K!W/K$LbQhaVPmaaqW*H#YXda:A!jp\Hc?+K>TEI%uGk?buYeAmP8nFXi
#RD+tY :=#ehhABbKd\ZeZh?Hd%mBk!d4W$aXPy$>J<j*%=*9<DWE5DBBRAAkAIAI6XdTYm&\S=XREAAIADAAA!
YD4l/R AAAAa&^ybY=$e!>\b*A9dYFnL%NwaZJqbC>DW&lletXpWHJ9b*Jqe*NCaZI8euN!a!=mcY=nEHeP#pk5
8YAF\Z Tp$JKMyQL$w6LubKLNI4Km=KbmATBAWHPd9pq/a#wwp#uX>*>t9WB1j4E*BwdG#MZAimRS1bawA$EDMW
Tk=ePi G!IW5DA\qGY6P@6nPXhIju=PeGySYYySEbi=kcYBtX/I1&?AGSNRpbPuu/M>ECC$aa1kkk%&S!wlLB:L
dp6KZF eAYZ%KVThH*j^GV@aAXDQXN$^e\MDF#=/\JPj?WMLM%M#p:NW#DDGSJA6h^d%:c:@^Z\V/p5Lp/6BB1i
KwXMRD t\<$%SBVLhDVVQQZhlmDR5Dk@@>@DQWM>k*!B@kj5H>k@5H+l\Ew<B<uAPyJkLHj9Z9*=k\RuAM!RQRb
+M#N*/ CkYR:DmAd8<jCNCCk$EtkBqP1GtL8a:ymMIGIE8GIa1BKVM=%\VIqkLTFpBcDWk4A&pn@kXk*+QpGKD5
yuFlRH GSA&I9wp*FQ#Ww5TT#L#$4%VK$M!Ww6!<*NVT%KLGEkFAFBLA\RWAAIACACLXY$q/#QHaQ\AAAAAAkAA
FABbFZ KAAAAGN5cYX8hHM9eGh\L&%la!>VcGF!bYR9WEhRWHJqbuM8euN!a!=mcY=n+A%\D\kwTp$4%m51Lpyt
1%y$ab IBpEBRe=8?TZynPmmVQG4Nh+8YAn\&$4HBwdG:<?A!5EaT$kAeJG#P?AyA\DA@NHIB*C\MCmD/SVkDVI
%EynW8 cVpMDN^tlmatq8b/Ic/?Aa/ijmG8jw=?#1=qtitJJjqFt5ZPVA^Puu/P>pCA!<GdLAKNaE=paQ#@@@<@
jbJ#u> tCPAtI&BCTn!F<lmAYIDBmEk!R4EGXDNdFA&TJah!8cAalCdB+k=wY\BIPcC5pYAtB9KqwC1!+D+qEGN
G&G=8t kapQGApF\ElILW4NT$+6FkF!E%N!M@MWAlCC/CHF6NHpkWWj&A!kj+JDkySB>qup@Q?9REL$ARBRT\ME
Vk*bV^ FAACAAkAm%X6JYJ<GXeAARAAkAIAACwAAABndGqqduS#L*BueC>6aYM9W&lletXpL%BHWFbqeuNyd&+8
=AjWT^ euN!a!=mcY=n+A>\D\lLLT4P#M@VK!w8TtakEaD$BAY:8nCmmVQP&MD*K*lV^wGZPDR&N5/cAXaI\qFA
Z>nMV: AwV6GBk*/?K#D6&=1eZF^auy1YB&TWy1ASPTk@+DAcaJIGjBuLkKTb\#YJWBbD6HWGymmwJ91mJPN*C\
w4Z5:X kFZ1E\+eVl?ITkHu$8KT@F\F^:#M*MRTwN8SFSt!MVWAA+HXVM>A#$kFVC15NLT$6FD\T!$y#!@KXuA5
CPMl/% L5=Q#p\5TT*YWjDMT>aDcqJE%mRCDBRFq>Vm:JL<AwZk%PVTw5!TT9TRbh*WaTIbAYVJAEPbwR\alpAF
cC*qMB ZA!M@@<4AAXbN:X#MDCB&cbANk<DuRAAWE5DBBRAAkAIAI^XdTX&+*Q94\EAAIADAAA&AAAAa&^ybY=$
^lEl^R e!>\b*A9dYFnL%NwaZJqbC>VcYh8aZS%etXVhGF$hZNNbZN#aYhqLuJ#etM8atq8nXLNTmNBEG/#\wIc
^j<&Lh <LV5+k1F1&mCSyKMa4!5Gu@\wITMmJhh/Nm%p#cV:1G:E#e*QjwGH9RXFJ@Hk\eQQwK\LLw>tkptw:kN
GLE?+% %XXh*@h%F%%FSq#8CYwcCq%nuh=C4ctHGcZXQ9tQXZdL^XZb<Qy/<wtd!@L%#NZJV*^DiH^<@#j$wVB^
a#mK#n b4$%W4TYI8/Hq<SQR&+kyR@4$te+tM6qC*Q=#M:cXpuJA>\*GwZBVDWIyE4yawK5dG+9j:j44aK9jm!^
M1RBS% hwq*n:jQ$hG4#PF\T\%puRZHKe#u5*tuL!y+?8K<@!G$q@\uhPu>L+98uZP!Bc5/Jet>hDwNya$ThJwB
pQi:he #>%alAthDMERRNX>bPES1ItT8/n+L>/X@6kRNTEQ^bmRByy6HKc$qZQlRR%dWPhc&#nX:$uJS5N6GmwN
Z*4HcL <+SX1RalwWq>#4lyVebSKj\YBFRbV9$Pd!#Pc>jSwZ#8yuAN?D9kC6tZGMC+ylWjYX!m5Cq4!Mdn#%HS
#Xuwe& iVFR$144+@F:ch$PPkM8RM5/\mF6JT8Wka=/$D8dmV<PYh&&$XiTI<VhKZ?#<eDCLCERhdc*j?@P\n>R
1kA9^q T\MEFAACAAkAnXX6JhSAmn>5AkAAAAWAAEaAAABndGqqduS#L*BueC>6aYM9W&lletXpL$NRS%BFdtN9
<=JmQG bGX!SGXnd&SqeuM9R%BHWEX8a&>pbZJEbYN9bGX!LuJ#etM8atq8ubVBc^NBFMaut&1mEL\wylLIFGp9
9@+8q# Tl1mwEkl^Kb1D>1R%ELcc49buTSdN#6^b4j6Zl4THk4m&b9w$b5>iBR5Qjp9iQBpD^/nX5klJL/h#Y/\
$KSRH% 6hA/\#C@jjP?>:=hMpGZJ*Q*e%PGRqZC5pS5Cecbkp++<wZ<bJbcqeCl?BB:9@Jb&4pZ4^+ndDaj@HB&
aD/=B5 S^n<nyAEC:$R$5Bd4\l/k5:%/bQa#>>K*d!ST5^PQe!qJHm?P@$wp+a^1H5$<9jaPjQ!6$6uu:1Xj*uh
?V>ZRi AyyQZ*\H6p?9jQ4y=%*\ceYud#=>>h%@<LYD$#e8ZIRkGm@Ctwi%AG6S^LPl*Zk!HY+MNab/E5^8E&ct
1?C+wG p?tM6IhdwX&E+L!Xdne/nW/9/$*uKh&Pm*MWk8uYkd!qk=u>:d&6#cc$6dt>N:P@hPDqud#PeG8p:Vl\
u85P14 uEAY8HLeyeQ^=Pu1SJM+ZI?6V*R&8yDV:Za&%mj1MS!Pu1dPGJImW+^ShkiQ<plpqF@K1DZN\DqG!l\d
JN@&/G %MSqclp1@MI&WjB=pXyayTJ5E^NZ=XYCbeQGhc8pc\y?St!PRY^Vm&GXqGXLN=$k$+^KAtNH9cdy86CZ
&>yh!J RFuTCVayJwdC:L1JKeP4lGqqG>eI=*KF<AR>4mMuCmQt@*bWmh?Sc^Xn$P@%6IGXK1We>G=SSlT64lHD
p\SicE =NihkP8AE=$wJqE^y#ZmtuA/$L/S\ih\jiS$IuNQJi\LmXtXVXF#ViNX^=bY1%Nt\95A@/9R+Z5i#Kwj
-ADAat 000a80af7fb001202b4 Page 27 of binaries2.zip
>@/D?D 4<$B^iDPT:JmMiA4p+@#BSSEa+Zb@FWR#I$Zi#*9*9a=Kuli<LLkBeH9BC<Kdup=GAX8i%4k$6F@k#>R
Qe?69+ T\MEFAACAAkApFX6JX%4J#+*ARAAkAIAAFIAAABndGqqduS#L*BueC>6aYM9W&lletXpL$NTbZN$d*Jq
hcAa+Z WG>!hEN9dG>!e$F$hGFncG%qduR9R%Jqe*S9etXRd*J$R&>5d*J#RZS$LuB\d&I8atq8lXG>V5M\EHcR
dy8*kw ImEtq6Kq1n^&!qB+kSIWCSHWKERk^9^eY$N1S@bS/NmBl&FAjReikPhl1AVuWESy1Y445</j:9N>h&b6
i*\HJI Q\cDTpPpNQ11XNy+uneGmX=X1a#6Y64w@QLG:#y49LPaL>yh\5pY+Y#&@FEuY4#TahGj<qk>!ILHpCNQ
AY<!/5 qC4=ic/pPRyEYWLB?#95+6/KwW>ct*Y64S?La==MK#B<wMwCNBhW1utFY5klD+XBHu##%pJnqdi1tt$t
HFJTMG <ESZuR4<<$ynqSeI+=y%\!mX+IdZAl:*R%>J%GVnlVp18!5wPy=WCK*NDu8IcV/!VXJTHQt>FQMS8/DN
pu$:hl YAbD5=S*lMVJ+XIhEGy%*cpVSe8@6PQ?L@<$#i?*=aM5DMFd@!#*:j&5M/Cw^YmpjuIdWZ#Ab4@D*6WM
bS$=dw ?\JRT\MEFAACAAkAqXX6JY*1%q>IM\AAAF5CADeAAABndGqqduS#L*BueC>6aYM9W&lletXpL$%FW!BT
Ca\LB/ bZN9hZJnbT>NSXNTbZN9hZJnbT=\etw8atq8:F$JhF#Xid=9btS=6HkB5\SIiMGAF?V^knhpmNFtLKNq
w&eV5# pGTLRwI>Gn%La<?YtViYbWJmTAKEEPwTCIGRpEBKIMTlRNmZAFqwT$9dhDtWe#lNV>wEt9RpJ#%N/YqV
yRW1K= >@@8?>?d?=cSbM6kRHQl>@#9:9i?@!:@<u/J8h$h@Z%GMXe1JI%a94BLHGdw:w+Z&ka:P:S!XPk!HV<Q
cJFq8n @8KZuR?XL9unCkY9944\5lDJZC=ND&El6MWm%KcLWQ6tIW=+qiLi%ELqT66!\<bkwqBI=Ry/9JDdbTSN
l#wYR6 McQCLE$ePtR@HD1pIRD>pPbM$8&*C:H^EQ/nKE%Ec&tmN8Y!E$%WSC\Yhh1Lwj*P4!ikJk6pM!G<1\YQ
LbP\nw m#yP418NJ=K:E!NGyRd1PV%YHM<EyVj&n^hNI>PYVlTLSnFk&K&q:HDctGltZmV+1SD#Z^JmkjZ<5?P$
=D6I^H b*i*ypdYdP<aMLLdEwXWR6VTCHnP=P^5Ch?ybTI@RaE=L+q\^/>Ak=?TM?#:X^PQC?&w9Wt4yyA#l^P>
dQQDjC Ha*D5Z#@Ry^D5JbkHeF/k9MI#md+MMEJBB>EQ\kYE!\lYE4RSLCT+HTCp\qYE#RVdCA+p?B<dwBtZhVk
XWtZ!G SSP5IFmDF\LCIDmZAF9JBRT%wDcCn^A$EM\qtE>\IqNqqCAtS&S%ilHBMwKVlEWYC\tPJ@kA\TpE!\p8
F$yRIC JGklPI*kXIKNBQNA6ASuEe\tPINkFeF^^&#qc&J#?EH^b8RPlXb4NHEWKjI>9Cu!JGnPKyC@Dj^+jN8t
t&wCX$ :4Z4L%=Gb%\<ZnB&y9dGSwMYw&6JcPXFb=FYPVMm=Xbaic?w%KZ!L84imTbw46L4@*hqXM%<GPwhi<%C
+j&lTu wmnWyLbT$e^q>I8N<dFeahmh%yJMG5YmHp?aw?/E%qI1QS^WG!E/V8GLnK\99n%X^Q/hGWwdBX>mX!1:
:t/9:A P!DcQ5XhQX:ih5+=%Ewtu@LYbCZSFTCd!w=+^mq^X>TY^J=EaA9^SDGbTAe*\YtBdeVndaGnS*#F$TM^
F/e/\: aQTInuh5<5eF>Vji%qLM$H9KGtqZRy?^L*kWA+uCmGH1@aby?pc^mZL4*aq<*p/l/m8SpbMWREbPtyiM
EJ!+EA uAR9GVpJHnJ!^Z5u$yXauplZ6DJy=S::!MmVyL:meyJDS8Xb<XPLN!&\Kk?%8PI4D6JNLc=wylb*ZMDA
RRGLjH 9hVmJHmy^WpIwBau#W$6uhtW&h!hGEpq:X+1MdT=J8*1ZhFYH&XWc!E*X4VVP+bVbw=^iWiSYGij*y5*
/LD<K: W=uWQn8jc!E4Ndeq<41<NJcH=Wu%h^K^41wGW>t?Np<Fi>i9hX/hE/HYlYhZLb/qI?P<c$bG8lcLNTZ1
Y!>qjL KyE^/9J\Iq\p+<T1uXJZk6WB>^JR+l!C6iI5w4eG+1F&NhJhT1X9J<LjT+YmuYiRe9uBNa<1<ewaF>ZK
en8Z9M GC?=Y9Vnw6M6SD//#hHT&G^T<<XL59QF8pnRq?wmS%>1ShKeICjQ#\R=KnduIX>j8p4KkatX&qbJ*Jjw
HY&SIp IZhj8yj$jSqe!<CZ/qwT9qS%iRRt8wk\MEiqRc6L!D<w>*K1pP+5Eu?/6e#<p?qbeyW!XK=bZa1BmSQQ
YD6HPN mLJEA>P\ZIMVK6KH8w^>1c+q:W9%Lt@@tuW6hb5WbY^Z1tmKquVcS+CIe>EeI4\6Ie=hPYJe^IkIqj:5
T1/q1Z b>eE&=E<y@cnQX8!j&=cKpe=L%qGYSRD%LWqIWL8R4$qM%<!!<>1E#JmY:jE8^QJ*u/>&/D^<p6B4Jj\
eFu6kw qDlZN%V!5y>>A%cI!H+E*Vm+$nMZhTDC9<i4w!6H$Gn+KQePJ*mV=k1CE/t!kA*ZY:F/F*K>A#XBde\Z
&D\4eb H*SH5#8k^kY&:h#c9Y&:8b^!&?=+1\pud8ItbIt8SHcpBFtiN/W>q/\<FLYWK$W6XZ/QVuauT5$Z@L1e
8?N^<V MwHJcutH?J$mhw\*q?j\SJS/Z64QCqt4y/I/R=/c%CT%St><AGQwceGbVZ<LVyKuBXh<ADNScR#6^qBy
bytd>T bMRw/Nc?/GacB?IBFIPcP9atDTLMZLaa5GIC1m^#Ft1X45:=1ySp+1*L89a=qVn*eq>yH<F+c@KjME/6
8dn!q5 khemZ\8kDG?q<nB^/4Fy^%i$G14lTMM+\V/CK\p?RXAm&E6\FeEuIa5pkPD@?\SnBM<VRLkQdh#XBNeR
cKG/b= jJ4kZwLQEH!Y+F1C/\m8J@ke\R$Eu!i+piALBH5I9pX\H<ELBQeVjJ6F:4aI9>bYE4H+QMymi$k*H&F^
6ZbCA< @jik1!D+K5EhLG:@C5HZCP=p<Z+n1\Ht5pl?Qw9kn?j^L&DX\\ME*!F+qPAk\ZhbqH?cwyc\Sj/u5#4l
l=&lWA \/!TiI#XFI<V*EJ\F<G6BF<m8I*k/\SjblZARqbduMY1n$YK88MpXuqAVjIk\b<RQEH\EMHDmy1lFZyM
TKRH45 XtG5aHXDP$EH\TbYe##JcyNLYP*\FK6B9pF\E/6S@yDkdwID4C/^XVQLYAWC%ebFBJ5JPkt&EF^M$AX%
cwF<j! LWEQ1%>/CiKKT8hySWYVIBkmTBIME&\u&EEAVh^PklGCK\miIiknKBD$E#^LMEB\D<EjEY\q8Jukt\Sj
n4Eq$H JNlGMEl\KRFE<TpC/J^*E&BHlJI\T=An?BlBu8DnBH>AeBuBe\TZE*!WwHnMXq>WlP1X\@BI1tnQqWd/
mZ+XT8 ?99cnqcZ$I@\t^KhJ:b1B:Sw/M1*iSdt1Q1N81*^#qli/qktWu8!<pV#/1>CEpJVd49Xw5h\4:Z>!Ph#
4<EX56 =i/DNYLX5$dS\RmyMk54dcw/I95KMqWh$hEeiXtyyM!ENS%!F=X=XGL4V1T!wm5%XEkWWwbL9l>L=wY<
QPJ+Ze =<jT1TH%c1Zm!IRLp?mZF=5mT8nq/qKWFE8K@6HeGHJ%JuNbi9VilaVpqe@Y?<&CpekI/\JEVKQMmBcK
?RK#5@ w+tCMb\^MqT+C=pS8hZJJ*9c*/Z*qdLE&KDGYM91GQXC^4dF\DM9Zy*c9u=+CSLRQ>G5VkJF/J&bjK=k
:9CBFb /8lPh*^RjY^NyNP=ZFdjdKTyuWHh+1>q^pGh&X\<EjMymFNXm#c4$>bM@#4Dqk\^Dd^RlN^kJGNpVhGe
S<Zy?q mPYI?iw*?^N:nLbTkjLck\$eTJj%Zy\Zad$D&uZhDVZuT$P8+hwS=b+l\q*ImT6H8S<pB/kIJ*y!YiLc
:C*tq9 9NITXXLmqbK+JTR8/an*D1^KTu^TE1WVLl&PS&<VyQIV!4Xj=a6hekT9hMM4&Zn9lWn\yqIN$\ud6^jN
dP$WGQ SPGaGyJyw6a/l:Vyn8NaDwb8@=Qhl#bTcIuH/R/1:deA>?JLu*@:b^k6q+&N=pIa^Pbt5X&Jknj:bb%^
&n9Xeb 9Z9\5nm@ueq9JIh*e%F9JBQhVn!ZA5W$SQQ<Nmly<$Z=#uC15t55bR=NMAe^m@ELtYMV#A*Mbu!APVjB
tklP8j N&*dXG$Ze&8Cd?WNnP>unp*\4h??H>*FHJ^kduEi+\>^Z\X#DLb^%a<XD8@9tM6D?Djt>nD5CHPS\Pe#
5p&JdB >\Xeb/+P?HLt?wCj#>\j<E/iF?CD#CWC9=!=SiC:tG5EQ5beI@B4tZ5EjkN#peB6DlH+Ze\yAu?EPWdk
C%aVtV j<GeI@BZtaME@p@MTRL@b?awkj?cPW9:%T=qjD=#teDQbP+X?FuM@RFj^%\k<HdtBwF9bc=VG8k!q\q<
#AR4YD F*Pc\Mia&\S?HhMK<F8b$\S?N*Pe\B>t#lQ+e<^JA9<4=mmB9<beJjCjM*eJ@D@LSwDlCHP@\P8bR\b?
ZEeFK! AuQJ\M>kikY?uDq1+B9=>q<N:%TaZb&CTu^i%FK\>JcP<B^&VppeDbH&4w58Vi=PDiN?QNkjd@PhEm=V
^DjHt! \uy=JLn6CdZ!EeZ&ltGPC%Q5+kq/endqYD#yaeb%MwS\?MAK&Y<ZCYa&bB&WeepKc>Wd:IJFdd*6Ha9$
4kd:#d Si$6A!*$E?>5G%k$\^cMtNZZ&#9k8p6i%LjX9pGGc&$lBYZe%NuXAREK@+d\G?HuCD?DEQp=16SV$?mY
<C#q^= X=SLlbXe5/JqPWa=S$VJEYq$C$8+Nc*et%u<Y<i@<4d$a5Laa+LmN%BaSmENY\XS6iJ&*&\4l%u&NGq8
SY*+SI @6hXMpm+btXE6y1RLaaLlX*JpZ>\<mHlLChjYA9t6/t&iTADKW#bdetYaw?/G:*R+hpn#1>jKK5=S8Hq
QKZiy! /:+Y^CR+uAB/GA=dTFliRnZ:Eq9lwLbKl4BAkDhZ!Y&t*%HEIRwZYySeyae1Qhn$wIq\hV=e&**pKJ#P
V@IMTC Id@whlyhw4Pu41i*y/Y:I>b^cWh\9mtiQSZdaiYtw&w+k9C&KDjjpPk:yh!5QD<iJm\$^j6FcK4*m\dG
6M:h#: G?mT5hqIDB8FwqenYdGQ:t@LLBKA^A#uj^VZ$akqdapR%PCcmm94?$IE:ib:cVBlVX/@1+1V6!G<K^Ru
4RkJhu S/1EX&@WEHI9mqn4yF=h+\^XYhiWiDcNb!wS&=jKX!huwkD>$ycYdT&A8h&GYemNGaZhSS%1KTFcD\4S
$bWRMm eqC:>c@#&wFQ*4IEM8@VR49ETcQDcekpZ8\j/F6I^<k4*S$>Y=&=n+n>%>$uGndBL5#=VH$8hANQaWYI
!Mtd!W ?n?D98S+J\XTiLqYSEMQHCDaYla^n:BRk=X!L1#yV4BVn6Qyu!E4bRZcPhFJ8WcIW*>u6SM$yw^bVH6*
>qQ5u< *Sk5CPMbM?>QiR8WqDHVPY?KXGQMwVIyd$wE5:VA/5EBcCyPhqKky#nF/9W/ZB<?+NSGt$hwuyYTl8*n
4^qmdC KW+bZHltYdXh?#@C$ShSCt#ZV4bT:wENuMN+S&C^XtjXhlXc@/CVk6%wnqZtd6kWj5lJkV:y^%cbZhD%
?AGyuh uP:5QdDVY&?XiRyn$=$WYG4!?%u\1uB$WEK5yH1%%/!WdV<RnpcK!l\w%@aj9^YPjwyT@yV?cdSTd9<d
CV6P#5 +Ym4KPZ9uSq6/IPX/FqP!y9qpT/A@idbh5w19LpjYmqdwj6!JJuuQpN>P>FK!ePG%BE44@=JtWb@@^9B
VL:T5D P1@qhcW6uRNm^=Q#dAIQ:*kld:*$Db8FcN+e*9GaHq/:aQkM#PFy&lbSL>hDTA#B?IVm4yZ4JCS8n5h#
1AmldR 5GJ<4C<%*GWJ+p^aML=C/bnX%#cqE<n@<+F8cKdFd&XjlQm@QZVywnPm44&RR<6uSJRLYCRqhb*dJd=L
-A%N99 0003987d544001202b4 Page 28 of binaries2.zip
phdi+Y /l@9pRu:Jc&<Jj9eBGeht6TdcnG^YBjcJSJjBn&chn*uB>j%MPNd/AV/LnhlCWT^qqe!W:cKV!K@nb8q
Wh<+w# %%*Lc&Ih/*dZ<@N=uL?b>dpdYGh:Qq?ML8Djn*D?nj#d\5h4K:h#wj!6CyT1wTyR1wcyCyViK*bBXcYp
8pIRql E&c<WuJ!dhVSER8Gy?AAdK1l1pm$JbeNLyQucW58\%Vh6L4W&WNZ&j*91PT!Xy5&KY!EjGjn5VWw>iqa
+e$?u\ *=$H^?Eaj$+lu^c&XuK>I!b&9$%HuB!&1t8aRn:yat<!<ZSXWQy&lHiFwLTmWSbM59!dSiZ*Z6G**cSW
ia*:eA D?uNm1w\6iIMXc?j%i9u8@X!iXluZQlh/CJaMhmT:t!P*GD4MFT#*5<$nqlhye:5pS9581#I/Ciq9c#X
AWa=eL liW*G?^T6qd+9^C5lt1aRYGcXm@9@RB=Qn+m4yLC#A=XZj/W\yS$?ji?NW?:?ddXT/EZuF!ZL/DL:$:p
Z^ZENC hYkkW:t5um%qlw#C$8YN$iJw4tBG4bCuK>QAiN:aIJ?YL^&tt$VYKP1IV&XH>J&=RmblwqR/q^%SC9Yu
E^?Yal >ntF$pb&^B#Xe#9%jG19phcHE&aCSVdS$*DRtKkD1Z$^9YAWe?pTQFuym@Q=%BKuDLi#y<<w!naENWLn
!c@4&5 MIPL8McDDkRPTQdMyJVAI8y\F8yDKdPwy:JYIY@?bCdjqm6q#ZJ&iC#Pba*5^IWCt5kdlZJl:!TuE%tn
G&JtyS hh#pKcBC8b$:m+cyt#p>c?\%hbpBlhwGEpPdE:m/e5pMScTh6yK=hK/kb+kW/GZ1=tlKVkcSl4jBDE&*
wW$^pC WhlnDN5qpZ>u!T\XDL%WNGJ/>>d?Ad&%R%>BJc@c$InJyPuXm&clqDV%8K!Wj=4$ySaTN\8E<+QX!\&N
nIcBCb niWm<aTyZ?tqTXN>k>TM$FtZQ@TA:kknll:b:>LqD>&*A44<ljmG<@&1!:hF5uC8I9abS:LZbPD%Sj=#
pwT:NN yJIw$!nIj#KydMI<@D/+QpTJKB8Y:i=LhRF&:CR>XVctGtb+pN/hbuKw5nHXaIuMK9=FL=jcI$wWM=Fw
ltF/Rj 4Y+T$b51=#6XqQX</$VbHW6ePVXVw8!P=YySh5j!NXF&^@Kwew4?yTm:a*qDPP=awC8$4hc%E+ZnnpY/
FiCeFX Q&F*LN4FbhGnl85S8&QS+CDWN4CE$$%&^!Lhq4AS5jcTeM!Gyc5TNlVYeC%m$?CR@Vi+kN6@d\5+HFC!
+a>=^R IY+I%#a&9R*BPTpd&+b8E+==dRlPM>tkNkVDXDclDj&4eI^tR@<4HDQbMQ4Cq$4yDwSNaeN\h5uG4&E+
+lJu$C pGS#%#Aey4KBc^lG\t#TGn+wHCQY<J<L^&\%4LlnCeNXCd6nmYBi&S%LBPXaLS&BSynh5WVkVwdh5WVk
E$e>:K tJZh5WVkWwZh5WV\46phT\V8eNkhT\S8XNkhT\V>aZe5EdnDaZe5ESl\5#8YCN+F8&PyPXE+:ql1$Bh&
5Q=@eQ ^%IDc\b&^%ID6#i<MhdkI5#8YGwkl&b*LDX\@548YGyk=M98YGy\9YZNh<$QliPPyRa1bHdHW9ML+dln
aF!+GS 1jt>5B!ik5R^d?&M+**!^&8#MNbNnPQ*I5dlXHR#+/DdV5dl:HaL+*BKi#Hn8Lb*MR+c:td<iYE=QAWP
ac:G$S I?hi^u@Gc^I+*8<qjH*E&8ynHDVI=l?%c+S6qm61$Tc#:LXa!>5a^@5hbB#9>FLG@%baDp!B@$=anp!^
QYW#F$ 9QG?Ltee:@tnnKPQH&MeJ9JZMH/n#cwRD44h\jnL\uLaCl\G&pP<4YFjTVIPYl=tHP?BGaAw!8%pHH9S
kJVHBe CPN\PM8MW9SJ*4PA\=$Q@=HRKM#nh@MYmdZPL1*4RF?5!1uD*DDQWkin@l#nGA8Lq?4kSQnnnGQ6<+&>
\Z@CqF DtNllW<>>pK?%hSn@!k^n4Y%l*HR=lnniG?5Y/uHYMebS>=>nMN<uNW:>ZBA@AuG$b?4GIeD*p<!nu*+
&$Rib5 W+#@XAm&/^H%9?S>HDn&1G559AH:<cebB!%>luH5Jb>qHH&?quH$?V4G<S/8b^^n?l#ntLedGEijQ<<+
LunEZ$ HDQj!DkeGu?Bee#uVa#@w:CeB\PHT/$DnQ?Z5N^&+hnAYZE#+>nd95k+cPaY^6G*Y^uHHH!JednC8w%^
<^yDm^ $Q?ZGj?S5B\?A<i/8+N^#NXZLH\P>9M:GRi6jyZ^VZ\8Aki>*<W+*6ZZGWj:*&Aei>VhnQ@IaijFHND6
RR=nHG N^u@d&E=\5b^CF1/q*H5th>mHH9dja#n9h#QPNdV6^pHuV:APN:=h^lH*\<!nuPeSRF#+Rd5Red@SXmP
:+?:L6 wwHnS9KRle@D?jp\+/D6S^nHQH!Q<TG?H\AHnV@GPPd+eecS@kVn&B?ibQ^Z\uI1nTMjh=cuGehh+BuG
/RiWH1 ed+>!#n&88ea^#:^jebBc<<#n9j\A8Ma/+9X1?e:LK\QYd/j1l>qXIQNnDkjbaAitqX@#qZ1tKu$IC\#
%GQdjA Ew*@GqB@KR?@%%X/tMH:k%d>iMAYAl&Xn\eK^RK#ZKJ&5=EhLqT!<JyCkDQ><J6T=SJ@l#+i<Jpjc5Vq
cn%Pp! V*5k:@GRt1bAjdyY+NNS&#t9<jA?XblXTeKyjqkAAYSIjtA\t/uX?ZMEXiPSwDAqk=GDn@%G8@t&?PEa
?955G4 nDTNuh5$64yydE*V&N1t5ZXNa?89cq^wtXDwQb$>HaP>ji&hQX&ELS=d&VT&!y?@ci!<JZyW9$C@5uKG
6!>:Zt ey$DHV&?KwQG%DT&e5WTjiJcpei8YikhZS*dAm19XJBk=cV>6nM1@S@5/N4YeXm6EK!cep9IVK*S4yuc
!e\X6i !V@/<1Z/>8%69V*6uRPh9V$6Zh$6dZ&>@h8*/$8ZN\4/Z:#??85&cF6jahu\bV8$K&:KL%@c1Ejl\4R=
J9X9p+ G6Z/Z++Za/PNPpY%=dJtIyW6NphdE<XWW1h4ZTy4=w1n$ybHt5$Wa#LuN58e1Dp/aCSH5:q$dtT<PYwb
<DhY+J X894at5wB\W&^G/Pd5&taDYSTP8hYhy/hmdwQNSZ^XdGXuP#?jFCctVWdI:i4/<<d@*1bT9QP&?6QnT8
\=@#9G 6?V#cWQ?*a$TqY8m+5taXZhLP1*LMpWaA$q:Fc6u4cYS+pacX?hPjX!W&GAp?jRPt<DD!S<<:#IaTV/S
5ZdXam q\anpD1<Z\%Gbn8d6jVYXiZy1!GAy#hy9hLCN+d=&+k1me^AiwlWijy1<QL$pl:Kh#HcKdLDmeI\8!+j
N?a5DI 4%LHnKKHEN$uAn:Wuiq59aAXVkk8Hmd/e^%>@S*6mqBu!tH/5!9FQ&@Id+P4Z\k:aeb@IY#bqNZ^:?!H
biPS4D TyhA4@%4Q&qZ\+\Q6hcjqYB@$JW>pW>tAVquEk9I8bQ<6cA/c46mi5R/tPbN=5wpaqqY#y>CQ1!M+<w8
H!clDR V!4t\+\eZ<pn6=JQ?kN&<pZCqjJBdLykC9qk#dt\$nmWieE1Q@Q@&:5Y<Cm4M*%t\pYTTa^!Tc15HY<X
CnIQi= ne+EqXcy$EAMF=hACpYRipp!BBPabH+#TWSYdST%$1&KKAW9qcm$>aJY5GC%clGwY4T:%4yd%:Zw>6q8
a!tBJ6 cS@ZbhWY8!Lb<=%#=y^@J9>qluMTE9Kh=#FP99!<e<:=9<6:L6<=dum&=&AZcEVlyd*wG*w\k+BeDjSt
8^:QH= EQkeQwjQ+ZPH/#uM=eI!!I9Q/ctDaSwDe:t\aC#AM8lL&kadckaaC:AM!yJH!NG\9Wk5i$iY%9YIBdDV
KliEBM 1u4Bwy1W*9V/%h^+h/LNVAuBqRw5S$\J1q5XKR8hN:MK8&S\q<c&Nt6mNL1W^1BI54$qEp5$S/*Y^PL&
$CE$Eq YF5!8uV^58n+!Qnw+pR5Gc&#t1JHJlNDLeCCYwAFT%bq6KAQ8a>h<NcERX?Ae^:DWnFcG64CXe86iKI%
HpeXCy %@uQtR*<u$Wcqnhkn\:CMp#p%6R>6V$X9QQ1uk&u=hdWQjEG8%kXVme=WuN4eC/w4\pmny?^+QnbZ5#e
^yl%Ep <nQEwJEGCetjQYj&qP11TNXCF\P6+FWu*yjp+N\AFy\d\IKq>?eGpM5mq<YCZQd\tkXGim#I>:Bk!a*9
FetNLi <d^C?CW9a&dk>M*6Z:?^8*9Z>hlbk:aMC@dWm#PwZ6^GTPWZ5H5GdVp1n>mPeiS/eSdXm@YE=Jhl>\#c
h>%:!: WnnEu8G9>GJnh@j@%tL*DNwTHt4u=q\9#6!e8Kt?8@59c:F:BtuBiT\5cYZR#&PyElL?MqShF=9SWLi+
P\tXIw wVWbcZS<58ieS?=#?EWmaad>#J>jM#MCt&ZeDk/Vb:#kjA5YLFtX$RG$qaE%tp*eXNjh9dIe8\hH5#*%
Ad1P+L +4&6&D$+t5ZSLBaXSWl1HVyakZekamEb>!WEWS>RH&#u+\<ubHcmyaHkcXJaBttbEw<QhwiAMREL\j6Q
KCNN/= iSqBi/I8ptnZ8PqTdmWuke/FujyXAn#=m?Q>y+FP\:$\^Ip&aNE489ijGuH&iI#CwC>+nAIY:bI/StHF
hY:<Nm p>K%=K*aXy6&nMKK^+9bFcWHCS/npA%jeE+>T:84Pw?9pKiF+?GBkG/Ib1HyeMauDE584N!jn64yy1CC
nIMnC\ XGEZd8>>MtEny4qh1+:*8Mp!/P>^//jb9phAuhCuI6XH1w@FFNZHE>N/&<eHdD9$<BTMjq$CKhd4\><l
=?41K5 1>XGe99jmXibNW#nbkGmtnpp>i&la4<4mI=nP4Sn^<HA@9ZqJQne4YS$?!u!4&QGZ8lcwj*4Ljaq%4J+
w8N!:/ Lj*@FM8Kt<Cy4y+%qWRYJ&IiPLPc/5M#t/%Ec%6a*m1neK/a\iJy#c^ySuAYXF=wwq%#yq+W>16Qhe$C
GG\QtM *@4MuVi*$pS>9qG%<B8S?paTT!dj=#m9n%I+CjCmbGyhQJ=I6ISuNMR6mdQu/nDD8cY4m/S\a5T:ZR9C
b4DYE4 qhHK54K\:R/k#Hb^uLI!akRuS51M+FmteC\n:cL<ntm<h+uVTC^Lw#:FKS!L^B4L!4^\c81T5d1+Dem^
XeJ@^X ZXbhplnBmVZ1>HPuDah1wn=PK/qLi4S4d5MKpnJ+#@iidLmTiNkyAAEBAWQ6ccidtJ%T#>NPRIE$@Wb4
?55tZ5 5nXtAmjbGK<u<PI>?1itcy19Q$!&6S9BkRL8Yei?kN/JmF6VW?pheZjidmdm/8QpGHFy!+^EZHeeFuH%
G\iW6@ &<WnyV:PaatW5ue$I/W9VycS$ljHMwXnGYqZZ$hKq@4pHmpXpF/p>MQJMqK/6C9uTPtHa!^Tppa9P/ZX
T\4PMA tJJ5Jm*PpbLd/eLKPhTQ6Z4YB=/bq8HJM85#\CP81*@PMiK/+lmL8A8cY5+=P:#<9C?:SN^C+Ztd/4QS
/c\t9/ iIyn^QQ/+tVyiZ%^LFM+qyF&bi5^ZZCKe@XRLnk=i!k@HG1EQl/e/mFqHBVI5*>cG#\>PIA$JIZ^pN/%
Z?!/VL HIaVd/wu&VE&&WPP>WuWL@X1%=#/yd++BY\R+=HhWMT+</MuQ^Da$?E?GuJ18Y$$JLt#Ab#KiDJJInGa
lS>VqX ?HZFwbwB:TJiMah^ZkQ%ab#ZAE/K<*4lbM%=G>8c+&S*BeMyHW<c8@hZBHdS*$9&:mMnP^dCe\hl+4L+
pTWW?1 LeAyJYVeL9y*K:B&=>uB%e@5p#l\$kjy$Pyu\VYcLI@*BX#DjVVNeYA?u$SYiPJpW^@GER!<L<aSDPA\
nlHNJ9 T&d1VLVc^ZBw>^DN@lqSZith:ZS5=c#=</k#dFm!c#j*QTWH:yb@Lh*\mY9L1ac^d/IcXtEjBZ9kPM+Z
Xy<jXI T=^HRttnaE$eQq<em!e>eDLum/GZMuEE>@HG!bnQe5ilphRID8W?SuDmTe@/XIdbtq!+M6F5NeYbE6q^
>6?n!4 P8$e!pl>KIe!kWQXtYnw5<KlHEEDy%l^88RTE@Y^n+Kh?!h6u6i%j?!naC$e!nE%*yen^>VBcW5T*Z=t
Paay9? YcKiK+uX%VZc8cQkMj*IGntG:*ZWK=K6GeCyuQQhbd::eESW<m1M>SuA8Yly/=II@W?uZeWy>tmkj^l:
-AuIP+ 00045e86b19001202b4 Page 29 of binaries2.zip
>+m#*c NICVaw>i^ap>bldFH9Z/S:FH9jeq&KNuAjdwX^l:%NRj5MBFVha$E*4IYKmB><=a1AEeG\9Xcyhpwb4>
LRDV/e +:iJkl#j*#\ha:M?^atF>tk=5FpVPIa<FGQFjl495I8ml=Z&S$<Z<:ZpH19P#nlqbYb\awd1a=uC5a#k
\C:#ju \N1RblG5YK6h64WlQ=\i8^<e/\P5&AlP4FGuZSt5&ACP%c:V4p/DpX98^6A5@T*m54Wlu?K$m!K#5LWl
wm%lSI A#l!lq8n%MnI#ddcPn<$9L>F:u+btR^aVq>1cndFd=9PkPh$6lX*LW:unuMpn#1#=YK89bMnF@QFmSt1
A5d$<4 n&WK^#KC$>he#KW?8ZM^>+dq^5Z<eLLpam+\PZM^Z=^58bk#pHp8=5MB?H+j#<L&?^D@b/d=iMRB#8qe
km1K+X FVFHV8hl<aa+Hb?^8VASe\uhwS#tiT@$1p<P<:!iPNqEPD?NN^:l?ubi%dN@D5P<1t6>KplP</1i:e4G
Fy=u5F p4N=:#uMl%:wb%>b#wh/+9l68CNFPZEw&<+4LR:qm^M#XB@LFI=qBGh^k>aKW5+e!1W?^dq!FlieuDtL
TcAqZK H$/4:*9uP@j<?kh&:lFQ1?m^e/?*amDDkb%:&a*lQDSI:N##KE+:>*wWqY91q@tCI?wBN/KPJbQq8i$C
:$Nc^H =J+6I@MFS>R+w5aShi?NlB8>:NR=<!ZhVuEpQLBG\qti:nB\I!:8T^lIpS9*Jinl+L/EkdW9\iS?Ak<:
wMi^yS hV:hIYYu66MhBt:EHVD:CZ^#VR9/=<^ZQ=8^PyJumN+<T%n!=^ZWV8<J\P?n6=dV#\<:=uc?iXa6KW/8
aRu*L^ D1+c@:ayVTZ>eIdIN=N4yM#pmw>auewXyQ%#Y?Bq?n9pCpJ8+C8u@l=!BRN4yt*p@?!Mi?uj6<Q9\V8G
eRHHB# m$!8!lptip>tlHuWy!jH6NZu>p@VM<I$eiRJal++QVqtV=!5QFRq6^^jnReQ=XYjH4HW4V+^WtaEJ=:$
F8lKtV c%htSymnS+CMMCQ%wS:VBI/yPZ=N#%KeJejMGwhulHu%V\a*hPpjulFtAMeuM9uaSWbpP8V*LuHcp6y?
JK>J1: LJi5i15<6?^l^WLqLIEBHF6YjZq8&eQyw%iXXc>ZH=XX4+in58w6@XE=Y:@QPqKYbpbKmeQY:!&6j4bq
8tZj\d %bjuqqYjntQL16i1n<11%*6jK16iD+h^KL=?4>W8l5P#/4X\MEjWHRh#SL*:B*NEMWi$Q<\\&Z!1X48p
cDd%yy V>Z5H<\S^dYaQ9B$8BcDc#G+F8PAk#tm8Kb#cG5/tCN1JDJln8nA+*TaI>wZZA^*6P4l+I=Y#BHX+tI?
n<*nB< HAB#SLQqakNtb/^9lqwlb1n%+Z+j#C##>qCaYicKk>uiS4k1bu5:qk1C&h/?PJndiRTQlGQJbG%Pi%H8
FAcNIi KiqmT4G?8A6H\nkT^yF\u+^kG:*5%DG*M<NPeRTL8b*>K8LmjwKBFLq^Q+EiD8+uGM!=udW==ZbKP^*d
AN=C5< hRSEZM#6:PW=a<#6:LM=Yw<Mw==#6Kq<m@yb1R\nE=yK?8Ee4iue#u4Bc&$>&K>!P>Wd%e96XDl/8b$K
=5yGNM y*@phtdY=%B#P#N^Duh8b&b>DnY*M\MHe#5#enI#?8iRe#5#eR=*dmi9n<Vy8>#P&P59Wqbbt%MPt+&F
$##Ftk !qpCA#m&*M:cuHLaMpc9dHS9wD=5XG+AS?b&i8BpQT4QP4iVSe4T#Ekyehl1ZaqYQ>6!P&6#!8*M\LHq
D4b&R? ht4Xl+&GDL\9Nlw!kMM+FF?6$&wZ\?G=uXw+tN9ynwP=uh:>k:thtN9bH&cadD=X1%*Ty&4&D?b&+qyM
n9uTEK H*k/ZI9B6Slem*HA\h^PZNM=6DWh#P$$Eyp\6*QkeV4M:i\LLwa:Y9X\eEe4=ub1eVEjDwC=uhq!Me#6
6\Mk@q %QQktN6=TDma&+t=ubnd1eXXMdjV5XRR#P*MI4h#PK+a8?Qkm9EAHL9nm4EJj?n=DK+a++1^phqFZDH8
6EQJyh m%qKZDHY\<EXa%\^%y1q^BXnZDH84emNK<d/tyyN\SXndS^eMeaXa%$eZDHGFYM6L8dDAZDFPF58NtBY
?\6AQ4 nHGh!WmE\*Wt^%JBeJ*JD<h*#$aS:6uw\#$dyp+e\L$jQl+K>*/++kRDJACF>?m<tXWE!/A8nY%6%5Sw
!p\*<K FNlBJNuiEwpqt1NYc&J^i/\6GX&/iFq$jGS<qFyCMqyuNWYQ\A:IR^%IqRB/CC#wIhBDwIjAkl+CQRS/
>:i*Zb CC#wIhBDwIjAkl/mh$8RpQ#be&bQ1c/KXC%$MaeK?DFE@BD@u^>aHSkS@Ih$JJ<!lB8lbu&HGHRIjhu/
/i1E@e wjRL<\KDw#eCB61G=RkJ8qm\aQEyw\WyDZnaEqwVF9TyYLCkV<YCQlWLF9TyYNCua5GCQlWL?qR5YLBp
n@>MDn +%PDJFV5h*VVeT#Lj<iPk+H>/<9=VY*6y<m@nlu4t8FPu&jbP$F4Yd!YmC^@A#n!Lq5QHKeVq^VPFi^P
dcGh@A ZZtZ4T+PbQpdcJi<E>eD^?upy5#/5F^KA@XJ=XLGp5u*e:4lee@Xaab#T%eZIjK$AP>&Pb^$p>p8tiqt
#letYG BChG!w#kYKb\LCQ6k6MCNN/:^Gppq1XSu+\:ed%\iy^M=Nk8jmi8Ab^aw$+@h=K$#D6>uFbTq@SwF?T?
ShZVbH yk#i<:*DmW5ihkyAQY+5qZc/mhpy!<+HBhL$G!!u%\AP!</HF?@SQ$+uJYZ&D<9PN+ADlYWtc4RLMlPL
\i8B*w @R:YESF*=?%tI1+?Vw+SX==9wBq^*ZFa^NX9F+?W?nmHJXLcVyHRmyT?PFqGTq<e!^TPbcShjS$yZi1V
mlCQT\ i/SWRH1S$k<u!$ny$1/eI/Wjn4FITS1>:FTel>QmHCt=udL#eCK6u9X^Pk<u5#+DQPK/?8eeI/+4n4GI
F<aqB\ /*eeS?wGqcd/dDViq8P9=Zq>edL$9L++qmpe!$m:59YaLnnF8ZwwF=!eQbRjDnXCH\@PV>GkRJ:>A/hw
hehu?> iPA+ucLSY=dDePAWni\at?\l^@4AKSwi:ZI/STMVy<D9TwWm^y$jQjtB\J+P>>GRW<66w!HJuR*k5BP!
AGa9EW ?NFE4nmyE>c>ak:n9Ad1\#m9Ab\W=@ZC!b4#5yP&hqe\uNL^yLF:j$XkF@&>bP<?M4JnIV^*ELILm6<C
8lnDwP uFJC^8&mj:eCc*iiHX#>#D/J\$:c/6D1b<E%tm!Q>\Xe\*$$#ZHaTX6\qJVti&ee\eD:al#BAA/#bH:T
jLYbAa qqc:GA/e6KZbQ!P1K#&9YCHHX5/cQ+@AEXC:huQjW*Lkd9uZ$k&j8Lcecln:J1ylFjbS5AiP+*!^^Hpp
**#M?t qDaK%5Vl<<Y^iNIDJ*P?GHwyE$h\H&?enQp5h^\cTa*kWP=nBCii>K^QbdkThDqetYm&t8JMmi\+uZaP
mnhn!4 bcR?qEPb\IEV#VV$YiFRn1CBW/\+ZZKJmj4aS<HP@bM&#?9cQ@bS5BaP=bkc:<8Sa?4k6CYJdn@n@Xj8
cP/S+V PHn@qZj@+Q%ZiQ?X#u9H?/@/m/jD?/@\@m6>HL#@!n5!/d$99Q<K::@1L^EZ::@1L=Ed::@T%>S5C6=@
5e+8kl ya&D>%@l@Xi/PHn@Fh=@yeZFjDkA*u?XLSjD?/>/FL#@!4*k@Xh+@^Zij/YJk@hjtiA5iQ?X*^m8>??@
bi*m:5 I5MuEDKKNCjdM4^B!\=C<n8yQCQaHE?j#\N=T:w<CA=+HJW*ye6QQA$Pa8Z+iZ8X@QS#1F#k&?X=D^ET
qpZ=k1 EQl&?jAV/a>SXm8%thD$W+uMu\%?l@++n554EpTih#9lWwyj#8RFY^aRiiL+WNwVkiH<?YMiITS%V8&\
D8lQm= TjSHKZ@?Bjakq\hwjWk?q:<Q$YYa?F/\qTI89@6m1CCZu:CX@y6lHQ@wc/ukKIE@u@/+kM9Qjaq?HmHp
<4::X: h$1e$InZ+L8+@FVcd+F*PQ+Da/mkkM8u@JJY4aa@Q?W*\J1+@I5@w#@P+@JT\CkW?B9kM<j=D\lKSiL=
JQXQIL n&X@F4\#uu+?Yn!@Tda*hME9lH8k=VVw:%%eQup6@Z\Mq=@%NK$u::jR6D8w+Fn^QQ#dS#n?L/H?I:p<
I#lJKk DQ$W+e@QjlQ1\PZSjdSQR%^?#lNWMJ4LH^lL/!Vp=aA@luj@mHeJtSnu?Qe>VmWqA1eD!EB#Y#JP$uK5
L=&NcK #\Yd1&q85#Lp$bjlHVY*^SMbeum?tD:jqC+jiyL16>ZRD/Ym*:ayQj\K/P$Z8H#/E%IQR@Gd+Sp8Q@8A
1EG8=Q %MPCY#+D\^I+d!k>jBnm\%kl*/9i!*Z\uZ<u=B<yQZ^wHTkkq*>%nhLDycjDC^j>j+*W\+LuwC&CiVH%
n%KktR FZw+/t$\ZC/jZC9%MHV^Vmw+TiB5qjyY<DHW+YTBW/V$:b=j$<>mS*H+9=Z>#q$JCm:<R$C%c>V*/ie9
S^86!m ejtpt=T?#Z<cFE4\9A%K*!^+%?P+@P>@y@V6e>lSe#1Zn*6J/h6E?H!G<LI*K*$dB?>cSK^94yL/XuDk
$&9nT% Emw+p:8B$GNK*#/:HlSjQH?cVh>5b&%j5MPtd#b=hK>N*&#!E+?&/b6NH6\IQwy@:&9ki!JCD4:4Iq:@
&8EXy= =5$ALPV\L5:k<8PkH<1FZ\W>E8&N@Il?Hm@p$H>CQ!>=B^SV!BhK@IKd>>DQ=+n?@E#lZA#9/q\84%84
8wl<M= @FLbbiCA8j!TZ<9/l=a?T#?LTHVJ9!n=mhQy=/<I?d@SH>@l<9PukI+J?\Z@jbK\I*k9=+5+AwydLQT\
VJRal& t*/i!PY#RYjYeQq/<JFjFVldXL5&@#P<KQEi&=X?VwS*M$t<4*?Thq*\Q5Tc!X^?#XT1J^Z<?SLR:c?J
KaB/c4 1F8q+58e&<ZABL:*XGZZQ+T+QWZW9$Vyj<H*aCAw9uiT55h^ED5E#+G=:bShZ\1/I8b!J^&4:Q4B=?lu
KEmqpJ eW^/6EdlnAehETPpic6WjFpH:bw8:G8mmmMY%F%pCy\:Thu%=/BnM+Z<I8WQZ\W>8WnID/m+?hq>aKBe
PD:?&# @9Y=!1+L:\hD=QL=H!m:Q9M&wHhmuDXG&uXwL6S>6yC@1P^/>GQR<aLNDbF&ZdB98cJhnVZK4k<?DBZl
5Hd!mB hn&h+y@@Lyj@dR$AC@=#w<&8ddiX#IP+6%#a6W&?E9w<JP#cJy>\y5&8djKA#i:tAc?eJ?R&8*9^L1C\
9YwV&= AtiW6L8C@\J:u!??>&Xyh\Xh+Q<9FnlQK98cC^^tkbB9WjKyEKMYC9p&cZeFL@$WDFH$<\jK:lcB:%\p
IY&$qF @N5YbZh**RAGJP!*YNyh1AS<&1XmnB>V:jydF@%<tjBZHWy@HkV>8X#wR$#F$%Pl4/@k<qZ$jS$q@M#w
mLp+n? *Y1k@c$dXV#hCJ^HVG:M*!V6LlVeSV<L:n%ltNLQVhBuk66Qt1*5bRuElMXmXLJK&q*BC^BL^eLpwmeW
ek>Bqc 4&5A+mnGhJNuKJ\P5Bi^>u#DHT1iukB6EtP8SZ>Thlik*IaIHn*qGYq*wa4j$5?C<<?@V9t4MHA@MZM&
:AkNVA Ic#c>S:5QlZ<jepjqN&hB#Fc#K:i8WVb*R!IC+LZ4:qi&h%I<I$J<Z+jpubZ$AW?V+!F:@1T5486aL6Z
^:6a5% ejuGea1@nRa>+iPMRPhHN49:FKa4?jQ4IP=*C48#*TG^uu+iXm45#mcjBP@@FGF*NuuF6Vc:5<ujwH+y
=Ct!<a @>4t6m5#^l%4ch\Lu6q5Jb9T=iPBy%G9t&!n@jMlFaklaumCG8@au+>8+@HhT1d#^lP@cJQd+99yy*G@
HZJ/\n \iR&@*DqV?mQ?+ZeX9@JwK9=>H86hDp9wu?GP5mV/jIJEQjCwy>6<ww:dQ*tkMQ/&Tb98XVF^+@BX+m=
haANGd >D>QW:#*WSmLhHD=l^%KH:+M5ib14k@Q$Vl:\kw8*\J>8=\@@+t!/>DJaM9ZCL?*V6u%e6BbMS**#T6X
Sii9HX QC&<l*+Y6*?58%#b+%#\:hh!?X?WZaiP@!MXZMjqi?=Y<dRda9Z%Ami8eKdC8@+Yq@@Xb6hHF+yyDPmj
-A?B8S 000d300143d001202b4 Page 30 of binaries2.zip
Ic99cQ D5YZ4kLjeIQAB==@NyeQBh8@pe5@dXI<ckH\<JZCD@^C?i$+nI%8+9LQkXQX<*w?@&Q/?Ya8j!?w@Mq%
BX:>1d +K69+jKD^!6@Mkw+!diFjJ#!J=*R>:eKQZ^W>YeX!FcJ=!?R@1VknZ5lhuA=WLCWQ#pBa5k@<9jL^puC
J##tc> u^\Ha<H9C9q&FeejBL=$t=B@1Qn=!eDqdle<HN:LGKH@Nn%<JTV:5*ApeLa:lD*PW9*&b?C81<Z#p&Y@
k5T^8K lb/HiHeuq#>&4uw9:\LHZ!N\Lye+lSWk8$5<9$VmFI+GQST:@<j>n*#9lj9ltdXe9t&j^C?!IAb?n<8j
lNWqWJ PWt?><JQ\bi9E*bcLL?*/Cwa=/:u<8hd=jeYdac/*TQ<$tZ!i+5mwG9*m9w$1?@hCb#^Q6G8XwW@>m*\
Xc=6@Y PYJ&/VZX4wPkl>@u<9Qyi\9\8D@th+D#AJe@Teeyiee!ieqI$JpNwy=91ij@:*M1/PL!F@=VQn@t&#?k
wnpuL: kkjFi?qT#??GMeFDZQ:1W?4=4<Ha+YHS@/?1=#?CMhhGL9@*=cw?p+BV@+D4#>:6<9tTMeANj<nqj*yD
&L*nhj QZ<?&QmQ8L^kt?R@kSjAZl+S<4eq@!H:aW#<1JD9qj!H@BE+/tNe@5H9Jj<J4IT^??Qm9Y^R?QhDH&\T
Rt+91< ::FJ+kjCECPi+QKJ>$9<\EnkD$?K<Z=E+yMD<F$@F8PkP^Z?d&HP=!u^*5>T?Q<K64!b!:j@XiHHRb?*
JmI?t* eQqL6/4/D\h8@#TZd/d>E#!K!jM9Bn@=E!=@t4a>n?6djnua=qbS#?W!Zw^+G5bp&\V?t\yuJjVBM%!?
b>b6\B <^&FW@E/Fj^W<M@%Emh@Fe!^Qe9q4?%RPM9A6#*H=d@c4ZC1\Rj<VQCwNcw?9+E?ib:LH*>d+c\CjZ6B
%I@tMp ?NYJEtjE/^A4ZlR+8^VPH&C5@ZNPd+je1uAcaT=pP=eQY/*1E\Yj<=Ka%>1l&nZ%Fjy=l<B@u@GE8unG
&$ldC? jP^$+QB*N>jy:%ZKyj\@WE5DBBRAAkAIAJbXdTYaA*@8cRIAAAAEAAA=AAAAa&^ybY=$e!>\b*A9dYFn
&awZ@^ L%NwaZJqbC>VcG>*TY=yhEqnd&+9W&l9h$q8cZSJa&>8LuJ#etM8atq84XJjTFN^GD**:4b&L=ItWXGB
Rm*W%Z 9*VWGtN*Dw&M\h\5&BdeK%9ykpDBanQMP>TSD\41c>tj^*yJi6pqZ*!K<CG$B/EicpTED#=EWQkk4Kei
+bpc<4 JLJ#y%E5DIJ?+>5=*#u*?@dh*#:5#?T6t<ul\dHpkDWeHBphGeA@HcemuVq@V14SZS*#Z>+puhmqeHw/
PE%AZQ jh>By%DiJDIRBbSbwl6IpN+l>RBhyHhJXiDQeiYcIZad/Pj=NbK4w>4=Aip^wAD\%bYH#AR\BGk>yF+k
HPQSQy V>yLitJ:pDVyTiACRe6t?B$A/1uj&t:KN1PEA%S8E=X1@X@iChLZjw&yhjZc$T^kdEI^mtdq?>qaBS8^
5KcBVA hd\Yu8Zb+FVCpy:c\\Yb/64eQYb^^k6nEVN%%q=k9h8<+W9y?JS4VqkwQMEqp@=T9BVXyjil!B:M9\\%
/*eSbc Pa+>&Z?E1NkY@ih$!?#^taytV%+^W:4$K1e=D6ZHYXMeYy+%K>JK<JFSDPqRS8w@=5QE6:GbVm*YeD\p
dAc1Ck GWXh<%4\SM?wAYN^c&%lZA%iNHQ8%t@\1AG1j1w4XH%W>\pLhaZXel=K/=L14&dN=ZE%5JCH&&ywu?DF
m+%E5P !QVHXZ@dXL@YVkh!&#QXZ^Dq/=DdP?EtT^MXd=>SbL%T<LGd#G/B%4L1*=tml*q\=:hV=L/5/e^yX4a?
hR<\Vm ZDd%TLLLcIu1CNqNw5?dEFy8TKVtVwp$d*6KV/A^P5G@:TD9=HC<yEi+DeI8JZ46MhHLJ?T8CyVtXieV
j+WM+L Z8W#nR\QR?k/VpeneMXL>wci481%u8S+bkZCtd=&<%&D+Ze6<iw8l4j*\hp\b!i/h#c*:9jh^@<=Q\BR
Nu1hAK T\MEFAACAAkA1FX6JY=nKik6^\<AAGkcAC<AAABndGqqduS#L*BueC>6aYM9cY=#hGF5dC>pd&N#L%BH
9bqA\4 WCA&LnAkVYF8hYF5LtJyd8#>h%RW&@I?DlPHnPT5Inp#$#$SEIieaekIBuLPReYAbCWyYeSEBpEpI!wm
Cd\t4M ICA=k/mIkCRSEDHuF*R<>+V^R>@Dh>*%??QXNaGi48/8*dYj*46&QXXp#AR6kmBcDm=waPehbPhJ>6@?
?t*HM@ I/l4C11ytBmS@&eVu+9J^piq#<q9qd:*DH<nGBdtPpBGJ4w8L+8RA=lEy=@%DVHSI\Vlkn:&:p^KTwJM
&L+nKF <tdB9p/C<kR:F/j%Q\l&@p:ikaII:QwiJ86@t#kF?AV=P#kFCCJR^E%1Q6/B/@85d$H?&8L9+/91e$VR
QVE$QM SlCFFMRkBFEw:QwHVuC@IJP!5mCVp:jn^5tAQ=>WjZ%u^A>^ic8>%wLiRb/ikmkR>@QLZ?ZA#iTRTDRy
/1w%eE PiSte8D/bbKRR&$1B+Kp=NCd!mFIuk?#tS!AI/pjhqP=>X6BRk:*b#p%j!i:RDejd*Y:RChBCZWFBA/H
Ec<kmY SY#<\!BBECY=dlD?Qw=BDp:?klL:RA^/@aZbB+jDXVdiHDdi@DjijDdi:Dji:DdiAnjiBDji%Dji*Ddi
pYDjm4 A9:+aS@Vn\&ij:\=@ZGeH#Lk^y9e^l6<+\*^^\@Pj=#1Q#99a:L<+^ViG&?Pj?^$?MhyJap/?1^4wPq9
MykNF/ =?XpaPi^4k%KDpXAP1@@cPDn?E@hWTkAqQ^#t!Hkt#Z&j>:?&6wI^L?Y*L#DwEkcB8JQQada8/&M:N&h
>hqM\& HAIF=W&D:AN@dNH^&8n\<wd4LdL^B!Awd?utGPm/*1qBRZq6J#eZ%*WWAJD4b%b%C\\kPQt4?Zn=?ul9
mFwpat kANYeB$DQH*<VZ*6HNcF%b$P8Vp+cjudBR9K/#6=8/\jBETlEaL!tt/iki6NLc?8b1d8=PDn/CT+ebEB
pkSN&e ki8*\+8J@99a>^W!byZ%K*ame\#h\K49n<uW!GllG@@Y*&pbcYqwGbuycYuytXtatJmbtFlaGhjjtSqb
B5JGL< 6:G^e:C#diQl+iQn+SEYElITF9@n*@hGMkbc58Npb<uJlem?6=AN4l?alu#n*!>IyKKtyICSp>HR$6E#
j#T%1= 5JBSpFNTWqBS\Gkw%><wA5kyKFty!Kl*5TFWnGH5hpJ?aS^AWnaNb+Y1eJQJ\BVIbd<1+l@?TqRNcb1e
H%TwL1 W?pR$I^TF$@J4WJ#t#pG*l8eylYLwKQu+a%M%hDM1:aaMyjkY*9&8tX+=w%VWFScjp*4!P^d=$QS/RY%
+hBKV@ dcN#:#Bcqm/HV=$49HH@\j^:4LcX/=HVGWX%:YMLH!S^Pu9hktQPZ:*b<jD=S!pFZY9*w:Gb^de/H!%?
%C1>CK ?9/EnI1M:95nM6wNqjcRJe@%ZEB:Q1^!?h:@</9Ic=4MN!hqNW8L&9W4Ki^9uQbQCu&yG$y#W=nl!<%n
iM4@%w <$c:D<keqe5I9CMcku9Lj!Zt9HSqc:jWtp?K/h6i<cF$/ja*C!6ei<>HttCLNJ!X*L18Fkdwj^@+#%pG
W4S<EJ j*^XQ#+:j<^H69Y6*kEM*:YI>:=94bwY%wbYD*!\tduTXc4Zjc9?/NQMK!N%he4F%q%nVQj$:=BS=np<
AdAkBe Z?%>ZQ#$<eIl9h#u$TtD!djiEnVu:ucjbI\^G/%=iu@Q>!Hmmc#w=@ePLCZI!!>uCjdHPKtnlP=Y*/5>
mWId+% ?Z*a?M94Yi!u^TTEYJmDbYLKp4AFN5n6MPedXa?kqCHFCBtkSZ6*+*uC>MhK#9tDT9i#4\/?8YX$VY<%
4=yE=S qGdZN4twW+j*XN+>YdhHLJlQY&!H:Y6Sq?Fb=Y8?Zc?Pil=?K%K&h<@$H8XLVN8u@WR<nahH>l+TuA1N
n&S$nN i%MZLLV#?TJD%<:QH\+:jmiVdnt<HFYN!5e<%@<?<8N!PX<e5B5<jyj5mtth%W*LwhQHVZd9TaLN#\<J
jph8YP /e*%waQVawN6>LuTI=M?cd+?WY?&M@18uJYe9JA:Z\J@>>HqJ!<\Nl/H*8TWSYHK?tH/kTe:nYRjN58X
PL$5ZI ih4YlQ4$#4?9=D6Ly$P==@9wFR&@&S=GunhMen5J#GKL&5N<#KqpqEc*!b/+u*6@>&t*:48EEM/hT^aS
j>e18< FI:dim<HK\Se&1d!>X8y=J5u@RF9+4^c<b>Nnl&/H!#ju164h?*F!ih<>Zj=Tm/45n%PPjkw<j*8&++9
/uV:mc $JI?T8qD>@%a<=LKujdIKI*al$?5*diJ&nN\jc>a+NJ&diihlmi@Q>nRtjdLp&6>Yc:e%ye1yj6&e5V9
i>XS#N iRnVyG5@</dWLWqiMqn^VX@l*BXR%&j?NwYX:auldR>hqk+6*IEFMi$^9Q#P9Kd1dNcCBKjbpZiWIq/j
JXnAd# =L6wPemDm$%1FKuKul1N?8<=WVVlDu!/aeL%#a^j/n6bMdll&d*B<@JK?qXZ=IKh1^cBK:y:y#@EIl+Q
jFu@wV ^X+/&QK64!@:dQL^8B&SJThC1H84MKd9I9jh6XP!i8>#i<JLmj*^uu\@j5%uIVIT4u=KD!5N&C:eqhCt
QciA&p @XD1PHNFljPL\Q^Q/<cXZVui+%HTQGE/+IB=u*KLdked@T=NypdYh&j9*dXL?W+t/u4$%EIySn5Nj#Pc
&q6Laa W/h#yanG^KnYwIdl5^jF?QPn?=t/6n$hD^L<V6b#5EVwYt6GFb6Xb9JlphtNHnPQju*!p6#L/*%yZ+4+
FW^4/k dG=c6i:8*8<^pH9/ZiH!Hy@:&+=jtCp=KI8ZE*?tjFWm4&w\t@!FkQu!>LF=!+H1htTJ\:ZFXA8K<ndN
KSipQ% /V9wd\/Qh**#?9V$9HRAa>9kJ<w?w#ThQM<>V1e$LSet*#cjqQ+a/nH1j@VX%+QGXRHWZ&?5chh\:y#J
MASXyT >Dy%5>Le>jLbqJZ>Qd56SL!tP!Qi89#wdBejhH@#8Q8k4C@%T/HFaVHF&#ZIMe@FlIhc!=mRmdY#pl<X
Z^Ep8& :uiqL!btZTGpp1M/h4KK9#N6C4mKP>9=Th5<i>n:%EHKy\9YZ#?!PL9a4?mBdH6n^qPiTk549L>e9b*C
NYh/p> %APbEHBE+hHn$KY<N<\/>HiqHn#i<**aXQe%<qPTSa4G*byaZh>M1\eJ&@\yA\w@C!B8Dn4wZDGymFW<
CInh?h ajA5y*jk:IV<I#1^y4w44A*c>YiElp6*Yw*8R58:6?m+TF/%$H!&cPt6:dc/*KBwM!w/+m$qXV8\#BH$
euRI&* uT^cib:?>aZHSy@A%>b#w$L1%1q1I*n$@EJM<KGXW!iQQ?hbGMkQT1Di*&/?R&RJ5L9YXt:qhw5N6iN\
Wm@aT/ A9<MLhXZtaed*d4*^MiI8YMbV=SKe$b1?H8qFeWj1aepqT1A:%eQZ6:^WdE#@h9iwSH6dWZ/=Le8QC$4
VIi+%w 8D6#QZCd%EPGWt*h/c8i8+&<>*N@tnV\@:DIq#waahZ@!i?I*+H9bEd:=J4*aN#ZZEMP*BpYSF+!E+Gq
SRde<P =dc4Ty?5KQWZ@?k&t*Hk\Sin1@Jql@%Z9PIn#4H\Jel>J/96b9=P>tAhAbKui1Ma4e?X=I<HPkI&h\PD
q8Ji+C X6?l^8*$+$T&mVCbP+tKHA#c9Y$Red+1ZiV8\T>Q=ttLH@64wd/VuZme/u%*q5@F6EM<LdB@EH$%aLYJ
S9ySEk VQt<h%Vwp:6n<hTHT&RuduJ?Hqbl4Enh*8Lc?G%*\Hwju\1=Wc!Y<>#TP1?=^D51:cm@\&4PX^q<P@h5
9caiZ@ :Xt=:KCk8c?Gqj5MlE69&6$R&%PjiLJFM*A<=iQ?4>9*tJ*Zcn6N8$e$ICqie*F^wuNC:@bNL9+nb6ZJ
1m^W^n !w*ppb?Y+=W>%q4/H&KVjIV&iwp5MND4dQea#CNMHlS<e4VlRHT#?b5!=Pk^9dy6n#R%pWZ9Vc?5h@?b
$\ck@n \5=D5uRZ#P8?np6EGX>\Q*Q6/T:>M^P>en:mhea1M9GVyqX5t48md4$4k$ZqnT<G>J<&ji@&bY%uFQ6#
-A?lY: 00021b5840a001202b4 Page 31 of binaries2.zip
e+J<pd l$Tn#l=kP9n6NuDC:E+Z$ln^NchuWj<:&c4b#yCk=b*c/$iq#a&u%TwXD%*h<eFnd45FV#cj*CYNcETd
A!5EcD <+ELIa*jeL^>/^A^n@u!<M/lCQ$BP>T^1@4Ze:@Ecpa<h>q#!QBNk4K56H:%WA/H#bESbeh6y:?K\/c?
iul:Ab p/YLt:\@/yHJ$B=d?KtS>hMbVbV$a!?lCa>TVSW1>N8*i#?#%pkPb!:4#/aaZj9t+u:F5udYbjc#bRum
!h1Jyk P%pM^nu^VEVP6+adPTyPic:Q5%R9iny<!Qcyjm=?YQ!8%Bi4mL$&DH*ZI!qt=A5G4&aH\4K64:ki5T\+
h%IDB/ ?Z*\+5MuC?ZG<=ZJi&tY1pQ#R@byKy1?y8:N=cqX6#qtQMm^RwP@:#MTlhQ9LN=:ty=cS!!W@PKydwY$
/BPBhM B*QdMt#:A\@=DKR9Y&TimlF&1dP4:WV4jmeVYFc&YC9%5m&9P1nbQKAie9YqaRPu\@DW6<J4n=:ZQ5&y
>YYTlM 61cu1P!>e%bN:eubM^yXG/k!D:\?:9#5>e/8XeYh?q1Waa>!k1*/n:*mHRy\TJ4A:BWY*c<6hc>IYGnm
94uip% !F44@MY*iu4ujWLKHCM9*DdnwL::NPuM^ejb5$P%P==@PuH=uN9&lElX@mNSuN!9SN/L*:\uLT*=ewZ4
PY/AqB $SQ*=iF*qDi^J/?lL?YNMRqNIC@QNpk/&hKbuQRa8#!^@4\eVy=4/^DT+NiVypwkh#ppTAcdTR=I?*ml
ZVhTE< ^*LC=?aP/:W<H>Hdtj9&^baXpd@/tqG9<?LV9LLb&y$4/VJeE+I:Fk?I4V&:Zd/p^PqS*u6?:qnHNh9c
M:pY?d mmwlHqG%d5H54K^uB?+J<c:4PyI<9@6L+?t^F=j*9/b>lJZnwu91hY1Z$N6*<=iwYDR$J>>$>X#kCKj#
LqwZ^p h6aYQPCQ!!q/%dH94M?5B#tnYayyHcj#N?5#h^jQVPDap4ZTH8&%8u&#BDGiHLDS$hF*=lL+8<4Qw?n8
JKL4qG F&86LD9p46<J$cZhQVC<%ei1%$IEV5N#5>@&G:lP:4kVZ@1hnF+=8Q@L:hpLVLA^1?iE>GSX^p4Y#4%Y
Blta!R l?**pKF=Fac1cV*:*jti!SnL9cBVVHte6wjR9H#ap1?tGSCu6cN&wLq/hVFpTc4u\y/Nnu<\I>A%/K9R
p>?FKe 9H:G1:ec>mpjHW$:?F@!j:dhI?q889@=W?P:yn5KC=K<k6tDmyiT6*EGnR5pPuiy8@EIWZT*^ibiFSi6
p5XQKW ZZ*<<eD>F+eFha1/JRZM?a>6<&FQ<4l\@94e5dlV<5KbXRLT\$F:mpSNB8jYhM*6c$@j*LN$qtNu!Mu9
:Bc&<K @hRmP#P@8ak^ec8h+P6iiuBaSD4SRKyWhM<W^=jXB^yjWtI::a1Cp%eWH\<GK?:9*K*\adYE?#8ba$n<
XWqPG/ Sc*C+EP6=6+?<X?w8jnNe@w>!ZbL^q=B&P#hFchb1T%>w%T<bj:L%%:&@Rj&H?lajKI:iMNd!&=6P&#Z
<Y#w:^ ?tl#9ZhQmb<@*qj+$dq>@MuqkD5cNeXZ#tn89KwXpPRn<9#V81pd#Y?*WQM<y&58t?4HJ4=D$9lLpcVl
+k9iKL 9IKab>4#hLm4^TuL+XPjXDnCKZZDn=y?!j*kiPndy^Pc5>i>tjdYtm?XQNTEhhQB5lK%XMH9k/uu=*e:
kbC^IR Bd^&mCEP1d<Que#<<6ll>ymlmauHR=XQNWYKX>c8NGq1H4</5&#c\*&9b+iL%p$*%*i%F*WEn8cdBS4N
#pMa6Z Hm^WGN?^j<VSYM>HE*FDplbQM?l*5D?>@#9buX8Z/6YD4F=Id<5!=d^^yi6YaBjT@qmHchBMeeYD6qQH
+D=MF4 !a5ZW^b9KFjjbjTwN4dI%u1:i=Zb<?FGb@p%9l>=yQZB<w9?$\Lq@E<tPXj!*A\DQ?ACuy/NWlb+@9:k
Y!WIde >KPhlyjQ?ST9=m8cZNtl6jKhVQ9BX<ZS5m@:?:/lG&>YPY<a$il@n9cRmZ=>Xp1e<@&cu@:JM@N4^wmC
MjqlEH w@<#ahT*6mR^aR^qXGiSaG*9bcJtmcMkD^awyAA96qCb6Am/I:pbaiHphT*:eL#+61TK<u=jRS!9He^X
RcRm\= ya$FpZRc^4/L4FbQQK:N\Y?kP$VXAh%M1=/B4:<8tD!kR$Gi&Bt4K5HTRlp4!XnIKMS4&JdCt*4GH*:b
6+bL!$ nmybME#Qyh4c!?K&W?$Vu:y>*ycK?cQLl?5Q?Fniuu**>YTn4c?Xplk*$/pYi#?4itjM>4Q6n9=:qRw5
X#QC$C be>%P@9/l58!eBnHcR14pliNiewN6pi4Q5i&PILeVQq5YYdquHLW?tm?X@H$LmDZm%y?!h=+V^\QR:Tm
SMpdk? FDXH5qhmE6N1At#mkCD!6Pm##I9P9yk^buEH9&8jZYl#L&V#j<#na\Fti/5nDK^/XbH<jb1XP@R9>D//
BtEy=b hjda>EAB:d%$FynhcY>8&HKmM*?V4<i*^:T1PdHCMFei9BT/KcW#WT#tw6J4bTbFVd=ek%m$qITk/hn=
8:ItM1 P\PBcMRh*:GXTAa:jJb\LDqbN$i$TmMBe$cFLBMid/h6LSBFVubbMpywwWlWM>9Dq8<W?WXAmncypTB%
NutD/\ ^pFmSp+!P>GEL#ydXWV+VKXbBnI?RmbZM9?=+llQ*m9yte>K8?+=ei%&:hKW$k\qYM>Ep+i4TtqPt9qL
ubJ?4b W?@1n5LBhtWReM\P&1c/:R:?TRcDVaGlHGIBF+8wce9LPWJDTXuRZ*^$BH<jB%PuREEdRjpNQ/t<thPS
e*h9Mh RKKDR*ZDNTK9/iMhKLlldJ1kIAL>\+t!aXl@iEW&j6y\kj^\uBB@$#kT1GWc8PEb&9lX!^RlmMD<<i8j
LN4BnS uT*wj@yTj=!Q/V??qw&6mQWNQ=$6/^i^jun9hj6&<*aSSGHScKIdXhW8\PtH1L!&p?ely$A*B:8@uk4#
Ya6p/* #%Q>=#LZ#/em/G#uGdD^%an\^%h65\$ZndNhpGjkZ+?GJi$EDqn@T<@NMiAQj^MC>?MD?jM9%M<QNQE*
N54aBT %M>GAhA@t\:EAD>*^9#e#wRmT8@@+VkP&uA6\@@nbpalmd9>?dy\@<I=DYL?:y\G$b5:y?XX%:iC1F<Z
YlBbHS ?Ghj>V@>jdm@Ph@RPJLickC^1TRGDyCWBDa@J\bPWlLeZBJFYlK=8TSIYlK%1iT/cbPWSG<1Cj=GE4Py
wMaDTl JIBDpyVEdm/=dw8pJHGdT+Ip4^de*IaAPMtXBHB#G$LkTNwR8LpNIZ/#!4K=Dj*PWR*?^al$jkCttX8k
#BF9TP y=PklI4pD#DX@NZL@mL&F\5!E\S@LTeSjy%/9ai9Z\h8HdVZdRc%*n@RYPTQjt8^dq9IZ!lkKQn4/=<Q
HdnH:w n9:uGAMNZ?@/t\+!1Q+!!ClA5QD&&qNI&4Qk?PNPCh8S6hmn8bpeI5l>&>$w8bqwKCmV$qteI=p$lSGB
kZYll$ Iaw:E>6uKwNFm9i8Q>*J%bJc$u$Ep&llEc^=:pHK/X%VXEJ=kke$?i/4W?8!#P#DZ5c*eL/kC4RF8BqF
HwDJ/R u6uXeDkDySj5&FRmi&5hIlt<I%l:QF@T!5dT&mihHmd+eMSy1pcE#blkPRR1lQ%WCtpSHL!9ymM$YY\q
EHnDT= FGkbImRVI>nFPBk%FFV\M@=\41iwI?/CwbhmiPc:e=IKRq>G69P91a=uq/EFBYhdceD#>jedP>jm5Rc\
ct?d%j JWjedB\XXbKS:bQLHAG68Zd+&*SnR@a*:8^&PipRDhllell4Y%!!S1cun%</</cdw:#9<@YF*Cd<&Ln!
/*%#FJ WnW>@M#bhkLRIB8u#AL*qGaim1L$aF6nbywp\G<9h>N&a:\Y=q:Ll/uy!<YGt:D\Stj:Pk8k8qmKlPR<
nG$h9d 6G%=4:@1ZL\YG@iBw@G$5P$aC:&?MNiucKP/Z1SKch^dWR$X@d*e=C1ih4!ceT@5p<8T1j^p4wiFj=KT
lppEJ^ b?MlTGK<+kS^%e6Ln*k1tRXkmkkb=F!:1p^En@S%P$1P/u!hjV+:aY^Wk*hpJhc?NFJVlJ+bS>mHtuHl
twAm1W nQRI$w#ZWnY\19wq4ITEJnLQn9y!QIEHHy@d@btcQLYW1^@J%<5u<kdLCh^QWZ$NhK?^W+^RZ:>u#pBh
!S:4@l %YZhey8<>d#bHjaEwR/AWt><XCW:nl6hu*ncmi:S<NA^#\4QF=!:%j\IJS:q>\\/cJ/k*+lJQq^L1NqY
^1>lP8 Hw>c>u1Cwq=lMV6<?^6Zic</e1\?@buRPBClh:qh+bC5Kb=eNe6<J:^m1d$/?5*^aRuFdA&^XlMeE=\Z
&XL@QP =BlmTqSpVL6:SCuSa\?5lnHkM!j65!MVH*KuNI%T1=iRKqJGFSb:w!dQS/\PM<eHc1R=Ek+FZXdKnD+#
W6njtN >iTc<E5qDYHc?+Y1D9VYHI8*?h6:%AttL:F8aZyBqZdB^\=:X<mE+lYe8n@e!%u^:dK<\&!I&uNDR?*a
&VP6:E 6$:$+?8yCymQ^/L8SnGn9YhM#6la58QGw$iPK#<4?F!L1Y/ypbw?#ZE*qRdpbKt#HB8#=TGM5lBEEuyQ
BEcwSS :B6*4+6Zj\>!9ab#*?NlYPu\+$wdu#*ah%e!II1H9&Mi!LWhi8L5djcw<@CAKc\XbFSumImY!XPaQ5ky
k1ACbD :N9=/W8N:Tj4V/XLu<eHSAp5>Lhwna?c:cIy+nkelt?9T:^XdmNtm%SPmd:Ecn^>ZGI@^TqV\<NZqCnh
p:45Tk YATSDiiTm&$191BmiEPqCmhehm4B1PW=*5K4JD/yah*CX$NaXaMI*$hVQy<5d+yFPMQdW8&ClGPw6YqM
%4w&<a G=\+%lbAtP9ayRmbC*&+D&=TRei#*knyD=ka\\iw6%Y%cDj%*4PQ8c:DWWlqTmcp?CZTV<PJh=VQiaTT
FV^h=N Ptd?mZGG\?YwLL@*eR!N*YwjWy95B:pa!<p>L=&chlRih\5:bWjbVutXnDLTLKEAEN9qtpjQGEB6dZSp
b+FJjl TXCplM=lTVB!j8S!1/1XN*>\S6^>Y!#M6PYRTQhFyRR@uHa\q<>VyB#II6DZmSa4=Z\WLp6hJCDliJ>b
Yp+tYG JYJ:$NZW$&y6!5XyQADC4pPmP#iuJX+qduh:W^hQHhqWRp6!CpPt?$:V<5emN+6\BShd!*HdeiV+\+j%
=^RPw: 1+ic=%lmM:CAW5y%dS^BljL<4c##HV*FDiln!9T&Ew!tVyR<me:lF5HVtX&/e9IhE#*u94#BL?pK!Riu
lXa#9$ AQPijYudY94/&D8WC!ybaX+Nl$<yeASVyp=ptdGF:Fqp4PM/QtSdNlIn>h41G/68tT6LY1I$*eL<ySb:
!ukwiV M^D6wZl9n#J4Jt?Y!=$nlt?YuGk#1@TaM*kKcE\5lumQbSVL*PpYh&VmcGG\Yc\R1=wqMD*h:Z168H^5
4XheBE %KZhyIR8%aqBwjKY5AVV\h&B!w8h6R<e#c$+ZTXk5TInX+=?aYc?E%Zc8!8:5PZ1Qp+<5pI>5&=M/L!V
NVG4S9 CkZN/YE&VHtKJW<PZ6bRj<$DSukq5a$8WmuhqeMw?5Bn^w@ymuSVMVAdK+jMI95dVL^p%pPGL9e+4>Xc
C>F^=q =F<PJ$9*bt+c9X^1uwkW:!$<H^PDKR^SM++?Y5T$wFmPiNZP?=A5h4aFdcDq&$tqh=VXJQ8LT:bj@5AD
#X*=GI Dt=!deqk4SmFS!ZyDnIjAyut*FMQ8kR/!L*yW^$>SFXZEm$Ab>T*^+iLq:WWhL*MbZC=\anaSdj58=I*
*YYq<K lTpdZyJ/LeE^wHcctSaPVKZtHF@6b5beE&kukC?F4a5HadZt1Xc$ZE\DV&LLSy$TP>1juLl8\Z8dXiF?
JmeXl! 1YBQIKP!VPC=1Lld5?#Ma5I:6GN#V9C8*kh<ApYSdXqTjMiWi8:^#WXIbTh%V^:/qm5\yQ#!m+K#%AY<
!lG$^k Rc$XACL:=tdtjE\4wuj*QP\Kn:>qZ@tXQCjkX8n55bCuqcMu/KI96k5PHd&S<tw+$Q!e:IZ?/JMM^>:d
Id=El& uj@I!K4@*6%PMlq<k?@4t:&j*Ze%6hj/yG=+A6#?Di@=G6:P%PL+=:VpdwtZ=cLXZt\*LYJT8a&@YVR:
-AJCZ* 000f67cfa4c001202b4 Page 32 of binaries2.zip
wXH\N\ j*TjjhXW$eW?ytaZ&eQJk/*Vy!VJH%I68=Y?41n4&@dak6wk+hwlFD*t61JPjhd=$u8Cewwi!1>Fe>6b
&u>Ci> nb/hj9DSuFP^pGXmb<ZRMV+RM%*u\QP/K/tGJdCX>@Y*5AMH#l9C*99l8R:\/$+eiFy+C8Pd\yZZ9S<h
>\+j<+ 4KLw+BF5/!F\4D986NGSlyKDF?8<:$:eu:dw8:V6%qn/Fedn:pj<:?lW$&yM!\i4cN/:+eS:SVI8LYtI
Xd=9Jc mijitQ%MTHP<ywqYq!6b@@6H%Ejwd1p$IeWqHcw>FMSWFZt9X45nBM+@N*/phVh4WpBEnpIy/W/&dtcE
/y<u:h 1BRH:jM89Xw<P%Q@J:Q1F!jp>\c>MYB#TKBkMnq@6CYDLD1^m9W=k*VF+h\F=!jQDmX>yaC*C/wI*k=%
d>ya1G Vqy4ak$MKS*AmynG*Il\uSpJ:66?6Mqp&@bnba61&YN$eZd9Qk&+Sl>6n9D@jL\!Y\y&^j/:*Im?>+yb
@yW61a :/BtMY@ENS4kXMnay&jatkmqB@:%&%$:Iw68JnlK6bijt>@>9G5q+VQL*8>TBVWHR&wWJB#jj?5>:9Q<
S$QR56 /e48Ihd*eW@ENF8K4q1eY@T@Jn%QRVd?@tYkpPBk:Yp8P#^?t*\I<@ZLMjqn!h8$=&W!V\qNhKw#&4Y*
AQ$Ph: uSB@=N>Cj$I?Gq<aGS>JH!KXYW^6VluljJit@cT4qjp&j*Q6iyA?5E*a1t@GqI1kn#4NMcJly1dXap:L
!=Ftq* uHm@QZ#%kJtGtXtlb/lEFtMmhy?wTFbwXyh#=iew+KyD8@Q>NK4J#Kiu*l$=R^ZwpHlMeC!1hFFbN@K!
L<wh/w %le156V>+wMK:yTWw5qlVF#HElPXu/@C::eh!dX!>GG4IS9Wdq\L%I56JkkcW#PYSQFbmn5!F>XHLq!&
Aype5l LeQ1PE@1Cp8ABjTySe\Iq$cRWmd*BaWbdc>TqPbHn/NWnGj<K%S>&4N8u?d/DJ6A$bJ#FGW^F4&#%uK>
tTw*&w phX>:J+EhXc%H#/Fdn:it^XASDLd!dP$#q+@Y5SqL&6+QAphq1R?tY@T!#K6&6YN<BlYlPE#B=SClTZ\
+!89Wn ^8qA$k/%YcZYTZ\TR6<ehyMN6uA%Z5bc\9%NK=?^Bw6qwTN8Z5D*6EBD\aEmitXQ1tIW9i8BGVW&&1#c
6*$i5H 1H/at@Ni@F!A5!8t+w56=jhhXPaMawMillL9K&Y<aG<F9X:5!nQDTYRLu\1tj&a5\yVlJpXDw/d5I>Z6
&W@A+Y SFNhL5\!ZDC%5<e>qk$bTd&CqQtE6Hj$yqCkEdaAR9%lG5qA?EeJMpekHK5nG?=NL=XYKT4muK:ia*&B
CqLZy* bZYjk<KB8e@pe>I:cA+EJVEG#h8dWD<ke@CnyR&Nh=WD:lhd5JV8ZG+#%<wcKc><TJuV&h:&tdKhTdA*
aPSD5S Y16Z1S&ITL\yt?CIMBaLF$<$%%G?%K>6\hJKF5MaSqMFy#KnV*+DqJ<TKD<i:/85DF<Ii&H!QIYnL:?W
eY>Ynm Sw1?cL+!9BYp>XW?Tm9!?t!LGj\tbYLch4a?Kpet!6YZGQdhe9RYikccYWQHI%a>R@!wyjNb>NicHTVn
p9RP%Z P*&Q?tlQaA1ud+4VW5E$G+wy#B#c\?=^MdMiyHyhHi=5!pwaj9XK9W*?Yll:ke1<JE&S:8+IiJn?wnjq
PCY>:h IXZdSHPCK<L#%wE=Fj4X9DD&F$y+kpj<khA=W+F:>5h!5=m$%SRpW6%LH8=&1l#IH&RtC+#JP4DwcIJb
tkmJRh yHkhkXAd!HHX%%IbiwAZIeCHtp*9HRZXn1tyqVi\GJ1@G8?Ilye+lekKQcTIqQ4Y=++wtMS/wBWbQpR!
cY&!Vq <THX6IZa#5D!W!TFVXAhpVYMdQ+^&qX#>Z:/dFY94*YRVVBuVh+dXHcW65y^qEqbEuPWpkIaKb^n*G?y
=:m<=P t&6VV#c>5ubneI/=J1N4uPNHX5mq8XLhu6p!a<daFX$Vq!4pCS@!yK$JZY!/h94ke#66aZ!n&E6h<M\n
ZyT9Ll >e+M>eFPMBQuLlheVF5WM*k=>9IB!kHVIDWVcWJ?F4+\!^tIEkQjt9tS4iRZu>N*^?h1y%=^n?CIXnPL
BQMN8+ BT*X!1>T9VD6^Qa5Eq/6&Gi%WF1/DblJVl@QM#Z6NDh%n#iZi8SPFyu@>tJm%PWel\yV&+pChZM4h^8d
&AWG+\ SEJhnZ5Y=hE4LhnqF*9MWEyWVI\INi:>5MSZRdNYEijw?:w96nE\TYXen6%>pD=*??9p6?\bl@DZHbGP
QHlReh Gld5B%>H+y@F1uZ\aY1=yyFLaPX:Ya*B6huBa@eEZ&5M1dNQ+e$wqi+Q*^B5NtNRA8iP1Q1hXF1JdZG\
6P*tEG *IXp&$QL<pt6LX=4jD<c5V6XSRQin4$*q?\$mDj</n#ej=Q>IXjFcJbk=\9aqFQ?JDl@=J9ul<n!RXV5
HX\kiu MhG8juZV/!+$uB4cqIwii@V!L%PSFT1lXb#jmp5*i&a+Bkche64nWH/HypMwA8=IyiHh4c\&?l^#:^6Y
Jp&W*C 8ElhZCF^/XQuk5Cq=H%FLN1w/I6Pp8XDIwtb\w!+BP5:&m?E&w=E6ah/yS4:J4dBDP9<d&CEHQLW&9a4
+pL8w6 k%F?p5Y&JYjWLjhKC/<eQkNm=@ZQ&i6dTqX1GVNwV4>kyh/%^=Z&SwZLu6ZA+?u++/qa=Xiy+i:d<c@8
6BK8%n </jC@C5!qcXVYQQMBSAZ&LV^6nh85pZp55e?Qed1P$#Ly=AWd8nceqCD5D9=Mj9:QMW=?yVVmYG8=D!H
%68V@A t?8T+96jejW5u>W@jQN+EVp=6VG=5R@wb&J6SS9t5i>lptuI8hH<LuVc+c98atyl?c6Pd%1<l>1QJ#pH
#KA+VE =qMXF^KCNA=ytcahduS?1#=<cp^G*a\T*/@mJlFu<Q+Pp^chy%cV\TH@mCKY!aWPF@VS5+h88&jI?L8<
TJGD/% RBT\i?L^A@=TcGFJqYEK^je6h8CnWaMd#lYP4/lt*Y5VJ?4!<688<DpeBi=JulLPSb1S?b/?4H!ILR/M
qwQGSL m8b1ejZIhSEYWQd4WSRh\tj$uZ!l1WTtw5:VwdKk+lI\+1b&LhtCLnLuletD+#4qEq=J?Kyu*>=HeQuq
9<lKJ5 emt+FtDetbX1bSWI:SnuyZ^%%V$nca!NM$!=D=Mn/VRa>1S/^/4w9&XM$<@C&YdttcumlBpd&<Jc%Jq8
ku!p+b +8N%Kb\n#hP9N1=>QFIHW%M=9R>kZZwPY<pE?%G<tR?w8FC88=\L?k>GL#F@hP<y:>B#cHR?u*M48PG8
YAL8+P 5KYDDM&=b>&DWZuwGhN#<:!b5EVqic45aDa4L5bHWaI+dBKqJdWLPH9YpWiB4M6J*h#6ZDj+^9C4eJPT
aWwBc5 AwQDpd6KTLGFYk*uRPw#&Abh>PHV5Kt5I+h#>>L5Qp<bq=:kGWkhy:+un=hTCh6A^hQDba&QG:*8ZHYQ
FFMTKm *KIXL#lhBN+<i>Ru@^N\5Bdn!nlydT*8et6*4pQHccB8Zn*R54Jb9%@C8w$tLZZyK$*nbS@/d&hD96Q1
A>b:&F jnbd66SM@k4nJB5>dc8SGk4n?L16@<5!P8/B?\iCt=6<Rwa9*/jE^F!im#=D>8>Vq>:jq#K:hj&>4<C*
>%Idc= wqb=TpH<M*lNq<D5La!$^8A:u@I?kt!bI&M<&jk*!?=qB@VZInEkei#?<\pXw<+VG6>L+#>iu8YZ+V=8
pPw5jm tCnlHAFH*G?=/$*tl&>8an!1SQ8$/n=hBhi?!K9<54L?1t9:5B/1!nME:@5*1MSWZRPnKF:M+I:8Q%FI
JJa5>1 X<5e&=^4YiD#=IacIYb?Jqn94XqZ<19=R$Wm%FjYDB@wWclEewC#YwieXW?1NTn!*<^\cD^<ASq&:FE#
+nNIBt +YlC%P/1?$w8KX>R@KQ^ckMN4bQKd:BHdlPC*ul&hNcdWD&1cEp@MNbtK%%\<N=<<\m&>I9EA/y#>*l>
>q*89E :tq#AHT4T1icAMRXuclK<BZblCc5I5I9AGSmjIp>&+Jwluj/CSn69Z@5Q8PAe#qh\1nH65JApD+hTG&=
^&Jj?% Y4De@u#^ZSHb5%Pe>?4h\=I6*jCn\d:heYNBb^pd9YpK&!VT*P=#hluGH41wtd=aeE=%/LBW^iGPeAjX
&+JXw? BYTmyQi>>81%=j$&WRi1%DNHMMt8PSeTe!/<Kd<a>QJktp>!DV+ZSim:?6#cZeQy<R&H1@%=L%&#$BTa
&y?Jab +P8b=!MLu\>aT\=ai>uaTm:p$HPlPJ**$#*N/GS5Lca:d@=1MEL%4p:@!B%JW>9HjjVmKi:tA!WE^mDn
ESWD*l C&ebD4\>bhbT9b?!u>u<?RPbA++wn\dP^LEql$kcR*&q^$pYV&Wp$!nPtS!kqQDmb>hucXh\cqM^8B>I
*+Vcec Icb&P$^P&M4&>S+dZe4H4i9DnEPLE6wQ>YdLtN4WVQdhQq6b5@%N!Q:F+SX<+8V#<Wl\\6E5!&GZ*$15
hW^cY! e\SnmPkHQ</!5Fm/^!E5nJm>RySujWIJ%ZMHu>D!iA9DdbB*uY@wMnW\BhLlDJ#KFT:hGFhVtZ\k5TLM
k5mB&S =dnIFXu+k1qThuJCb+yd:/19pH:SabM9D+=RDSh!TAcuiJ<9uQH%ucFmiq#StZGq/?JmVAd!GiJeJ&&t
iqEapE q&G\V4t@djS==e1R?+$>L>Z:Kb5NHSkHD$YntQheFd&5jDMnyLZdYylk&EQy*=ABKM?MeV><99V=bemL
ERml5M ycEV!\eWeyYLXNiMGF9+k4YCAy%FV5/%Za%Kh9:P8G$u?=L=w4M!$9@EmitG>/?iZ%tnHHkq\V^%@?li
9F4n*9 ZVLqSa/DPt>eBdnp/miN/*ea:I6nLP>4Qb=&jLmj1X>t<a1*>6Iu^m5?>?=/G#**qdl/XEcX?1P1BWd!
@y5J:R pMl5R*GY9&ZP:KQYkMh$5a>8Z:\qhp#6\pNQ/SqR+H18eHIMK!:FTi6<lE^tJ8#h*KRlbZ8kbkuZDZWq
+PNQZ% 1WAathiNLG<cMp>aDytEHD&%<K/MLFi+kIwY!!:6WH>5XH^&#5BFjY<J*9lI&BBhumpVlq+9Z=YA=IC#
hC$//m MGkKVTWPwkYqYEYy/+dlBB\@p#1XR%K1CelHL<Gc519iSDd/kn1Xk4/#ClPPwCpW5X&5&DN^RJ1T>ZS#
IFZyjK CYX+$^RC/?c@A<ejL$:^&I\LAQlQM:d^Np*4mKX!Wy8Elhdb\9u%#:\&XnGpS*H5n/cI<P5*RjDd6*CV
+F#GmQ c&B6iE9X9B@5$nCM68NTec<ip$NG&J\&lPYTF\&Y\^Q/i*kbE*P>W4B84bVFl9wHa#kain<K?HD6=b%?
><N*CE $E1^LKawHFj$P9l65G%PIpIkq8uGic!E$<tdu9u?D+?*8aR$1lbwKmEKNAFii5dHP>w$tjFJeZ/Yhl=m
JZXt&: me4i99c6C8%hqSG*4$w*eJ@8!4A@#>mB6%:N::J!Z569!9Bk*C&y>?k8QAbQ+KRY!lyPXdp/I!mq11P>
yN:%C4 n\?Y*ZtE1&!J%q8kRCj9RPMyXnJP9uIYEZX15Tc!RX\p=WYYFedTKu/!np46^jbKl\!V69lepVNjK$^8
AXklwq K:ZnyIRXm49eXc&!G:JnASchKZ^@ZwYc6DS%1^A!kE8n/dR4N\%=8b6AY%Pp**b%wh\u&&LnJVnCaCyF
CS#u?P Z8\cbGbtLEd!BG>iYb*>%Ky1\^\Bc5%?XcJC&pMt@GC$BHct5/4nR=<I84Pw<$1Zb*Z#+&K:FLH9CDYl
Rbw%NY =I@^SY?t?$4I<cQlSj/*>ja1Q:jjbyE4?<n1a:H*:e45l:uT%#wiFm$j:Z6Ih<SabGSN%Y<jEJVDEKVj
mY:/Dn HZ6KTnVi/+JVFKX&B?:^6y#p=Wi!#iWh9dVAVaX&^lT!B<%$>95!lFNjn#aNA^IE1WbZShbklR!JYCqS
*wJ6u? YqwTm<Ikb6NF+d<8B1ME\b<LB@KcGEGR8N1lmSNE\9@:bYAR?%<9A/M&L5dNQ!BR#hZPZ*BnXXVjn9kH
>uwcMS kN4+<WhA@5a/:AdllNRLRMH@8k&:@niC?B5YI+mGw@>+Mj*=n@@&6ZEmJkCDFRR*FqDl<B<9:Hw:ahc*
-AD9eJ 000c30969f5001202b4 Page 33 of binaries2.zip
*9EtG^ AZD5u/+A>+jA4!9e?H6nj/bjk9@Zc$Qkq>C9F^KJFMRkMaJMG&hDI^CCGDl8@e#IH><*PBAaNCmIBaH%
X>VFq* M&J?uBWDwH@<lpPm%:i9:+@hPBB!@RAdZ>BaRSTAY6<B@HH=GAARSG#RThBw#B?9ncN5uQ4Z=<cqdZ#@
4Jj\n# 1RMK@HFNG/hAauA@j6m+DBRYEAS\CEEASQ:+i?M:Fk9?&I=Cdq#C?6%HwhiQlEMJIkGpILl^ujD%HhCw
EEWF5H >i6eF$Kkj^/IiLa@Z<G9ltH/<YZ>8u?%&I>4@@ZH^6+I^Q1%dYkI418P\&H@EQ*QIVd8&y<P<W9DH+jc
NqeFny PAS8Zc5jF:l?BC!A?e>hRYQ?e+T@*:w@6>QG:j4SLMV6j>/G*LCFH^5*h9=D%jWZkQ&QTSP*d^\Ak@4Q
1WZ=hD /+e64J@<l!*<@aZd?HHhNnb8#J>jQ?*mQ/<N&&H/bSl@j&%eGSaE@*H\H/aBS@=^k$mcM\cF@ZGJG&d^
8Lc>Ct =>hGd@##c<MetH:b^h>jQ^wT>hM$@9#/8i&u!i@jNIcEaPhyF?nt:TN4+8Nq=$$EQuYuAAh@N><NNlRK
?*6&Fp m\L@8Y!K?/>lDLNqGN95>j<i^yB\+D<\6k=bG@edADB@uQFH:@+dnG&\<Q+j\6m/NY$k#<cbj<Ha^ue5
i:t8G& EWR*Z4@k:pi*@QZn^kctH@c=5S/?aiAdS!Lc/H?Ha#@\m+lnQ*=aQ?eQG@9Sbal6V@!?$W1@49QHJj#+
\##Cpw aZ*n^kHA9!u^E!TJb$MREaD+?See?>ZDTiMauHmNG/j=<ei@ADLe#@+I@44J@\dIpCD&9\C!nX8CSQ\F
nB$Vb1 !JBa:H<HbD?8@+<d@GepI=4G4>iGVp!@VPQ94@<V!akH@D&TaZ/&*N?*@:%#d6^uyq<*@??9Q=D5d&4<
LQIkbH &9bjIyt1n/enTTBD@kQIpQD@G5l\$MQ!mFj!=@Q>G$w%C9:*1DWpDtLWGnHp=Y?M=*>E@!AS$GLQpPCt
GcBW+t ptk5cWup=yJ\FEqJ%KcTTBVJYCWpiqNJpHSMFlK#1iV9wy!Rj^ulE*+JEtPW+MRaJhTjayS?^V#JG/:j
>DIZ*P 9u>cKI=ElNJGI&<YweRTG>yQ1I>H5VC1W/5lYj#qBJmwKGp#\ui!5nBG=!J<^^$F?bqPWW^hQF:pFc+l
AkLI1m 1p1bhJqYXacYi5d@wpS9AA84Hq8Td/M>PmynQwI<M8MqqY\5FXYVhw8*lMmRyt1+F>KB\BGuKa^RMeuE
6*##M1 edC/Xc?JP61n<8p%%XSWDqSmPXnecy8VhGeR6i\q!E?4da%:Pe:ySlcJ8uy5=^&KyBlIjiPKFXB6V$Wp
m4$pTZ >pbE<Sly1tZ5F?DWEiQ#Mk@\Q8%p1WD9tBMl&$%\bPH5S6tyhI:+Qtc<#w>I&Qjp/5lq6^9pl&lw1IRc
cR/BTk t>VP<<\yw@taYkhi6TE><N*Qb1P6SJCeFKjWlW#1/4Z65V^^6@jVCZ#nq1B&hp$T!1jqpQ&wGu6?WV5W
Zc1RlR j$hcn>Kc1=SJ6:4p#JS8I?bc=&*QWqkVjySFV6??Dui%9J/QR!WST$A$1iAHH$cXSDJP%MS&DnBKi?n^
tB?t\G %NIJB?LL5eYDa!\1<FBnNk\4+++4>>$>lVDT$qcE+hd!FmWY>eY/@wJ&lM^byw:E<e5qnS=+9GVy/k\c
L&cbQR qJb&VL!8BXAhihRChP<Zyti1=tcKD>Q6X&llSBcKhyijHpR#lbFNeY4ASRc&/=P:Q+SyXH\SRq<dHIy9
c:@uX= Xu:P+!^RhM%t5B:YZX:W$jA!$VbL?X48\nh1NqNDD8aTwA+l$?YpQ/^?Ft55SF%C^YScdbJtZ<iW9H^M
CjpTN@ Et8!*:@PIw+MZ!PdN4=H1JSTRNH$nGpeV@qiC=p>=NeY#j^=nW\Yuw8QFy5*ZI9&eK4R$l+%Y!#yLS18
Tw<kYj d$PtjFq&L=GtD8e6=h48enTKW1qI5iuhnIaQ!9TPWeDV\:S+>EQ#?k4N&l5ncRi9e^+hEmcW6D=%yiI!
=&DJZn Q!6<\KKZhiipuaeqVDw>BSQZ9!bXF6@&VpQ9uGNJ/K6V%F!MBBcGMNXMHt4!!8+/GB<QRa+c=V:abEKd
&>j@TR W<$6&SV1*TESYKytYJkhIjV%KqPIt>WCbdhX!hm4I<c1#dKXX=ld1?&4C#8LB&@/&p%=V/XJLe?$tlMW
$B?^c> w<i8i>FdjFebXhQ8STa<JnM?5MA9l:<#\kEdeX1i\k?$il=dMPb4y:Z8\e#:!:*u&MjDRXMZPIXj=YlG
?HI:^P KN\e99F=V1HKqZ&iB4m?Ze>8kJ4V%wb&a6GTM%n!t#kZ<wu:Te/u15I8Jm^MF!%>PcnDhKj8!$aa<E/9
l@5!mb eZ/JS:/*WM+Iy\<#SX^:+XM%/\*iY1=>$u/LdDd$G/N#tLWGbd+@#\JZ<?Y45e>&PlZ6nc!1ci6InQ9t
VHbl95 FJw66<ebQepAq8y88!MSIV=LpeWmRe?R6KQTheiDC%XJlq*Xlci$ml%a+uqQiyHHN!e&q=JjcQSJ9Hn%
Z@N@WR Nqak+pt\5#hn^<G:ddw*XXV!D<Z#Ch\$#^8u#PpL*hXn%w!MNZ&e/?lMIE??N&>SQZni$wXAjdtJK@!L
*F^jGm Cl:8^u1ESj&I%Nn?FPAAj8BW$%ARy#YXdmV%d4=!CbDT6uwuW:thXwNY>*H4D4EV/t@iw?+y$%Pc:I@J
BDdD8t #>==nqK>Z/D4mLy&PN8Nnl&*B#\?PH6%WuiI5n!pDInRaWy1XZS\jVMS<imWh1^^Q5@^F$u5EW!>nm^/
a>tntM Rn*mi@QmDLbJ:i1mp=iNHYd\>aa^%q%F$w1cyl%y1qnFWh1GP$%bl^n\huT:?en5aBk=88LWqG?yI#6^
:6Ph?I 4E6cR6MwQHSy+QL^E?SGceXZ%JbCSITZE%<nd5ktD1ca^I1yAc%M$jMXLFbl>hGcCFqhDw#!4k4jA^w=
V5h\:p WZYX\:$8u^^TtBKXcy89d#iWj1a5beXNtikh>Ck9XL#HwKTQI4akVXD6w4jtVl4RyDHm?LGnHXt<cwR<
%kTTlC D:$wRI/86du5unXn@+Ayhh@yb/G=!Yyu*HdC55cZpt^hhYk@QkS&6c?R=hajah+:LbSHYE6M>Nhm5BK<
S!<+TH /qLAe@q>4@FPQZPJu5D9%#WZVbPXPM+Ry8npNCin*N\%%Am5/nm<w?uWQye+KXmhBl=9yn6kGp&4nwn1
KS+jRK hGe5Ge!@5yC5hDi<nLj\c=kPt&huRe%?hw88ZejPYP!wyk=kETV+^/a4bQb>+HSK*q$wt&bmjwj&qGjT
TBB*KB +\b648uB?\!\P+?nWpPiN:WdjdlB5$\X9!>BL1iE5I>JySEqbLC:cFADG&JP>jJE$HY%#ME4uKN88huh
m9FQ*# dtdyXFcNa<Q#lQcC:Zpi41dDDnVWw51kkLl1WpTtyZSa%IGKpp<JI\+*G*\INY1tL9^L+:^+c8YZq9\6
GNk5Xk @QeTQhCJ#9YekjDdESp?/9TVD@mS4SG?6/!qBN6cni4S=58&kDlnP/d\k/=4^mDn@4:J1*i5QTlY9VJq
?J+n/c NZK?HtmFhb5k>+hRX!L8HHI/Nym=Wq<\ImV$$PQM+>&kd5u6HbQDZ$QZ>6:ej$=?^>T5Zq1l&XIi94EZ
DCBAi* FdV:9Ltk4>d59kGPN@m&CKpRSq^NthwpQwQdj:8ZyQF=RWilqEq>Z56cT9L4N#:LQN>d/44N*LM:Hyal
Gnw=%1 qQ!e1Yqi9EVtAeZDBZ5*Fli>cMLW^XZiYkh4C?cu^=!n*:!L$A1?E&C$u#q=S<QSVkYNkZP\lhDelp4G
ejwH^S S+$ealc9@h?!#XHLwhCb!$=GjBTB=\1b@D^:9M?<uZF!ihFAqhPhwFuFh4qW%9cKFQyYEwQ1>8V!1KnF
^\*58n $M:pZa?h=RpjQeZ>L=@Z#V\68jDqc4dC1?CL+VJi*t1a6Q999kl*\yymJP8EPYbtYVWqH%=p!Xh:KQBC
#4Eq>a kpL&/T5ZtF:khMYq8XX6^Q^S5Wkdlk>:KF^p8D4TT$=S%6%/JNN1IF/YuuB**\&cKmY%E*6Zh4Mc1CYc
hal=a= T!meKNFi+\*Y&#/DD+>>jX&BqqLGWmP:EXmB8i#DiLHKiDS5Z#:>4VB%=JEHL96/F9NJ*WEXW@*dK!$F
:KV85P +XN*Lp*LTLqJ5?tEF=\Y<Si^GC@Fb?<aN1qDWi%%aYZJndGMb:@4ydPC8eq^jiy^tPycq8>ILTiK@lcD
<C*NTc jXMB6a/b<L6J4*L&8%M5atuSX#m=*Nqb>uT*q*GYiyWQeH6GX\*KG+W5lQdH?tq?VSA59TL:MDuGXn8B
eD@/CL uD%6n+lJlFG^yPtX!pQ>k=/WSteqD$w*F=c@YQ+cEd=&STyHp1q16L9B+WZ!#n$B&!t/\!@jiyD=WTK6
=Mktc+ J##&pQn<&LK$E/L5Nm!RbndF6%B+<c^^VVaZb5V/hSc!CGD5G<:*&lht&>#jt8/k9&C6Q@tY/uT+ltQp
cF@hc\ Cu!@aA6#Zt1aLI?iB56\1Y5YZb/6!:h<S&*y$EqtJ4QiBK6H&^Rc9b#IC>GTihX!1qiwE!T?LC5NM<&N
hW\qmK MCX?MyDyP*P6%Kk!4/*/5ty!WmH!9A@BV$emRGh^8pk%SehY##W/\!5nucdAV$55iAGNmD#/weDE6nVX
e+:wS5 @/4%qjpCI<hQ\chRnQw$>B%ZtTSP$dX>PC=?bJBm$6j*6LiI6ZhmH?$yp&N8?/y:n:<VN@F*?$/9+dmw
>T:P?n $^DF$5eeD@N6>hj8RKcYEX:&GY!:i5n*%KRD+X8eSQXNu?K#deZh%/9Ft%pTt=PjJ<n%ul*6:ZEeuJ98
u<&^6G Y^H5Qh9:PVjTYc\:Lu<e=6yCLb8u&VjncZCik6qM4i<bXZ9$N%tPm*%L?\i5ilPq=u4MKTZwbcm@:P94
8b1/l# %e!Qy%8INle1iJB$kX\56Xj?Np<nu4+kkVy?+Z5ml?bp\ii5=8>JF!lY9KmV#kw5Z\^+&j?5^WhAVyC^
X#\#&4 I4NZy9u5c8lnq%E#c8&RPNwGYk=4Ndad:S#qda/%>HQSZXJ1HtemyNWJ4lNu6L69Tu&J#MLHSP<TYlmX
B6y/AH YlLW#nMRjtE1MyB+^+MmMyu=?e8<$MlGPXwd$VYtZhK^N*SlHY&PiDc8MQ#ChV&l/@EmKbETy%&L:ppL
i=Ly@E m*bS%PuS:CwSmyBtYT:lWq5<Jht=eDb1MJ=lPGH6a4u$MeuB\P^?ldPJS@N$GDmpdVkTn4bS6h#Qt8l\
:1ECwR Q&De%6*c/TaT?qVMlXyi@:4pWtZLm9&#TSQ#:qJ=@Y1%$EeP%#JD^a<\AnPh5IWJtT!X?WyW+%8+=@HC
H<aP^$ lMFn#@anHM<WVle\t?:iZnt8%?&<E5>5ij1W<JKnwiN^jhH$BqQ$ZuA*cPnbIB8!JmN&PEYy4HJ84y9m
KwR>Ww jy5C<=DJnc=9#?!u5NJH8>u/BPEl!t1=6Qw=YmcMBSKZDi#:<h6\nA^C%$&aJK=hXM%j4a1WP+N98<H/
FC6NAW 1BLICw%nZwt#E&%@wWl:Y1<>:/W&e#S\+DthSi!eBZQekc!%uL&Sb&KBA*WW1dHJPBp*hnbZD5PePw5F
iQ:1CT TqXcbhFp<%*XI5\tNkw9$DjwQ$8X>QwN:VQ5568qP#ESmKht:cC5tn+LC#%VbBJt?pGGVc/5pppX4!I/
8/mNAb 4LA9ed5\!=\8\#H&1/PLe=W9yH1:W@KPmu=+h#a!8m@\Le#M4\!?p9<yy8myDuZ#puV@1&&HW4\jac@D
5uWGWF e#W9:ybT!1QGcPi?TdR@@6p??WZ#R*=ckRnp?Ftlimud^E1lFqi!9QnR//yFV+&Eyw^Ekw#CJ=@a*>LP
TTaPGb Kcmk/Ke6+6Mw^FEInd&==5NQXW&j8lkcGp6FWj#c6IYc4D\6mEW1>wpG\#qVCSN^HW5VmpLDTYPDNQ4w
yQSe?\ <p4J6?aE1nC#<G^#VuyEt5qdm5:^$Ek+nXS#54u=A6KjI5PXLDqj5=6YMQJ\cIcMbw<&S:M:jec6+hlE
\\M&m@ NWpF%a!Z/qK!+W>acaw%J<NjNA>ai5b4n%#eQ/Kkmp4eQ*JSc4WTbj>JEl@9#%w8F?hlem4abDKnkp4a
-A9EFd 0005ad642eb001202b4 Page 34 of binaries2.zip
n=jN#P XNn!aQn6jY@d>IyAt\J1G%6nC>W4h14Q$J!6lJ\!Y!/15LNj95DT>6h+X^YBB=#%yh/?5EMbXkwtWyEq
WX9w$V &S@mhiAm6=8$&lWp9Y<+>NQ$Ci8iP1ZZijTB+=J9=?TnQ5n&Qm1nGDATNhyj$PE!awEcPTVjuC1VJ?\<
jpI#/n TenZSGtIXp4X&Ky=QVCi@TA*F@wty%FKcI1j&lEQP?!cSmah*mwi*S*lKP^yc?#SQEuj8hMn%Nl%85p#
VyH+PB =/cdwYhN1I5HLi@8uEq/D!5lm^n*&te:Pl?ynV/*tG=!CT>$T^?t<>:q>Ca!:@Xq$G^aV1SPk?4tHm=q
4w?4l9 Yp>NGawb5#h#MtkbDWdQb:CikN4a@a*S&AKLK??Xycdj8FJ$Zth@:Mc6=n@ZeblV*i^6bIV:yGSpRlBb
aW5mWR uNGw=B//:+j54\S^B?b4nNPhP!DNqYR1>jII^ePnb##y*5!ywuYhLW?nMXiPuI8^w*m#@+HcEW56%<Q*
>XYZqu dS*#4it^y6VIY*PXq#y:>?mc:lki6^F/w+w/VHmyi=$5JiS%=VR6u^!6+dB6LB*tp?SdKR9LcN&$S#Ke
=!tw8J Cp6b&Sc1bed16$Q6$$K=<D1&!ZVqqdc1GdJpKYH9ykhP<S$PVVtJ94BnVM%Mt?/pjdauSTQ6M:jRQJ?>
@BjAPa nyTHk^nRl?JPwi>+TH9awBPq^ELy/qnT:F9*8Z&Vd4+TacX@M@4Cmb1CQLu!#<K9Pb^$I118$*P?*@ji
<Hy5tY !ddAXi+Di4uGWiyI!+8^MLanttE%&:%e:#meh1i48?QI@Hm@e%naaTXhukFCu9Bi:Wa/%Q8VPXPYLhbH
>!pNW> <?Ny^</wa6?H6>=LPM%>lm6hHh5ymR?Q\CyLjtlN61>ZSb&JJ!8^pXmn^au:W$y1J>VB=t4N#l&ZjGN/
&^>cQN wHp1:hCDABEl&l6/!yab5q#KhCN#F5dqVwhnnq4\tW%iTy>8StPMn\pcG^b$BHP48*Kuh*LHBQHcHe?=
?<u+FY t>C<%pqValJ<Sqbh&P1G8ucL=ApM#RudT?h!G8pcdckjbF><cZ\8<F9BaiPLXt:y#p+bFC*cnbjPe^lh
>RZ*YF dDS&PQ6ebub*mIYLklZ:iSpaHXd!w95*TZ^&1nwt/!b6RR9thKl^hA#P5DdR9\+S<*=@6MX$\H*yZG/N
NLWm:w W+I1+a/aCI9^%@mWCP=9>n^tX#/e9FJNSeYD!ldE$#cGX*BuVp/YbGN%<8muCmT@=:Z5LqA\VWtqn8bJ
ND^*JQ uu5ku^auSE?YZZB4S&P\hui\jq=utHQ?^#PBc<8*VIP^T#I+kaA$5YtiXTqiAepn*>I@JCSc158Gupbn
yFXpC> t\>u*yIKFne/j%&Yd^^Pw?w==uy15ICc#*TZja65=qBm?M&RGTH/<1^>1Kh=4t9=XlyJjQhK6diZ*=J!
<?y^%$ 5&yNyiFQQpbb>8HqnphQ@GiE4+YuW9G#J4REXcTB&Whcc^TK>!D\%/bSC9lE8ip4Z1Q#cD+*\<DuaWWV
GGT^tY i8FZuG#LDK>=6>kQ:KX+/Hk5!K=+pl=jXdB\!yZ461uaIVw%N+ELX&=!TenE9L>>Ie&<b65q@GY/b8=#
P#d4\u qR9cn<5%?G95n6&55+Sy*G=C<=<+!86**Q=/4qTeNdLNnByH!>GuZXj8eSP9TW%8pddHakSnMdKu9nC+
y*EaE& +HVVqX/9k$FW%J#u4MabLG:TununiDn$11E+9<YwnYec\k!FCeh<dX!$%JB+clH#*i!?FH%c4##KK/>G
IhI4KZ #WLmVlPuX=6Y5KZ#%Ct1lH9Bp99jQ4E/c=^Tp>LPZYL!jMSc8mR&AyYq1*@L9CJk8wB?9wTdiZXtNNd#
6NY>FD *Q%ppb4L$\NidWnc?kdy<1#q&\py*KG!Aw<p<bi/XY@S9/4wMq8V+h:PplWSIHVF@#*Z=H6e%<XTRt%:
\NHXpn y<CZ^w5%8+6iE</h4:/^5:h/>YXP41H1TF?bbI>RwWC<D+PI<PHt1b/9a1+<jDICH!V^Wd*Y\@8j1M1l
WiiwTa #kZjMh:=VNJbX^>ntu@8TKb6>h4%>&&!EYVj#lp?9HT+RTHSau>Auu%beQw%1TZQ>meuQice?pYhDkW9
Dq$?bk bP!PPIBSh8WPqW/*wD$8wQ%Ajql%YDw$^#c4=QL$#T5!YT*&p/4%V<bqcBPij*@<Nqy:i$?WY<TV9SGQ
mRh%Zi ?h#GekJM//6ye+19e=?+eNZu$V8<=Nhn5c^KmX@#:jKyJ*F\Aw?4$!HE^Q:*^cHu#>X?ilV$4K$qdC#4
:iquVk !8mDLDuPb\GKR#d^DFq6wdVIPhu65:$*G/R9hyknZ?>!?^bZkH1/QYI9Shqn:H=d^:D=A&I!@DFQh>nM
9tXhLP Yn\a51mWQQF1iwithAQV\k9Y$aYuu65uHm*GPVQ1?N8jTBP::V$c+*=A\Edl?\%HJjyn?cML19R&Mlye
<9Zbj9 a&GZ?\>jj8y\#t&9w+*:n9*i*NT8B!a:?cKu8Wde$9&qh?le\lhELym8NN><Te9:Wt*@!>AC9cn^K><F
d*A9uF %Jw@G+6kZCuK9A:!iuH6m6S%eW69itl\j4qY!Z?u/P!A<I4B?bW#JT<\\4L?I!</tGpQyNqjIB@d@tLm
@FekM5 kP!<n5@MAd8^lp8LI6qQh>mNwi=G:Q++PXE/yZm$p$694t4SIDJ1Du*l*iTqy#8a^8=ii1b5<B+YG8?q
k$B14^ ijnKnc#q<^MHn&8Q8e%<GE>+a%y&+P9d$$>u4M=>&tdepWpi&$H*Ln!q>bIMhR+bkyiiNwhe8>%XRn^Y
Ipp*DE I=i%QT8jpThBk<WXu=X5GM$adS>PS+@bLyJCJ/w>%pLaG<PWW*=EQ<McTFYhDci+cmlKGb=G^*1#Q>!Q
L+PuaW Kc!Ht5y%ZNqk8*VdqAnQ8Kwwl%C5E\XFJLCZNdy%q?>aMF8=lFVmnFB+X8kX/=lYq=RF\jB+&XnVApT+
qFw4M^ W&1J?%Xc?4T^\Fy=T/:+Np:cE=>&YMVa/cAbBZLwJiZT/QD>^kV#hB/GcBdy1dM!5n*#Y6#*G1^1JTVV
%1=DW6 *IXm//5P$pe#LdJLI+Gh?K9*uFm*%$w=WI4EcqHECdc^*?dyFKiW!Ky5Fy#XSbkY=^%C%ei8j1n&!8N#
K/T<hn wE9\F$!TXM><wJj6GZXdh#k\ZVL#mi#^5Y#D&>YXl&+uLidTb?^c#LA@W<kwueXVX$al>/*iXi@hdBT=
Y*>QcL @%X1!VDXw#WNb?9\mjm#$nZp6:eB$p#WDBSY$u6!L11^C^q$4iXE!Z$Y/RT/:!F:<jGjXRi!i$DC+/n4
KF+*QV M9B$uL=WKi@8GN5C!V4Z+\1SHW&1K>EXad1J^cI^y4D$i6upd*ZSpmWY^cI5ER^CipY*Gl>J>y@PnDGw
BDHBJ@ pmAIN:y1F>JhN^!@#1G+K@:MJ!ZhHAtbTHdF4:T6uqdGXBn\NaPm6y#$CG&&^/j15AdE^V5a*Nut=te=
t=jRQ\ !YpWn:5JZ:/NTKZcF+%*tl%LWItmtHT!qy#PbP!w9HadwEb/Ll&mS8yQP9Qeu#R%?Vwc^!dCaWkZ8&N$
8LhabS X&ZtA1>wiFd!JF:QX<Xh>QTk\u*+/cLayae/wW:Ti1eVCE<i1qBhheL/V!9jEHGVRnjuG*VLNPRR#Gy4
Wii$yI !uwqT1m#JY#Ga*blyZd:b^$iHwp+&HPL:ZKBVDl#$c+/W!4iZT<LkDYShpP!YDuc^*ESM#^tMwJVX@W@
@w6wlp S5XpeJw5T<AV@QkibFQ\eiQI!=$dcJQ8KRmMedHa<4ut=Bw=bK5t!<Rm&nqbHlq8E%1a:m%TyL?w/i$9
Ql:ZT= KQTm%54?ph^:>jAyC:qPN8G5=<Z^c$JahGtWRW@Bk*QSly@cH?9G8le>\u459/ViISjh\CLD5qba6S1n
4yDQmp 8c#<mmCVW8R&j4*CCn%/^%+<%/C&%h8ZQnLZctpjt&TjKIXC@/lu\y$ujJa1$ah+=4Q4dQpZFLc:=TL6
*l+C?+ W9V!&!qCyk^!Fk/GFB$y$lY&N%9LbD=#@ZTPRht1weTq&ypdL=PmQy*PPTc6knI\>9c1i=p!:*h/=h1n
ykLlnV jVH?*Xq:X86Mt1<?XmyK>Y^j+i/#q*n8ekKjJdNVPIFMXVyYLL?tLNHp?6Z$GA+l<ij9I$<6QhmbTt:u
ES68bX m:!Yh?:cuKEi%qL:!aH##hmZh5K/d6EF5EJB/?eMu&MXb%9Tqj^*1BPKD^!N4GBpndL/$HqX=FVy/6W>
>J=V6e /y>W?t+F?EYK$qWTw6kM\ZimXPMeEenaL&bFp46p4cdVpGja$tK8wj5j:iBi<+&$m*VaNb6Elq:wX\$Q
8G&5PQ hJK18BlXuuYSjc1LbW@QP!G$5=C1:q/B5/\V&%5Y<Aqy#^yklA\i^dj^:1w!qQ6WtL=!TZS?&K6Ce*SJ
l@CcNn >6qFK!ENi<4yE$u^$%HcWu8#Zq\/5ic8L<#?YQ^!bI=\T#li=eE4tS&9=WZQ:PBQC9d?\HA<Z+SBY#!n
S\P&:Q wBAt<4E%FZ:IBHXVQ$w++GX!u4tL\F=h*bl4Riq4uQ84$S%C&hJNdwZ>#a&D^4kh^/aJJY9PuIM\Ywy&
C^$$kh w/A<a:1TFBqY%i^$RWETEZEw?L?NmQ89a6>R@&d6E@&Q6W<W%LXQFKtMHcl@4H&mIK=>w5BNJZ?*JwlC
9^DFZ^ @u9S9/c\?TZ+e#pSm!GS<8BQCR<RJEJ*WH>NSQM#@<JG&uFuH*>BA#5HRTNV!jX4hAwI*CTV<B@JYdDw
!INTLh Z%qXDDhMBjZQZC$wDIq#tke+?i<DAHmAwFcRt/QV:$?KSIQ@%$pJ@p/HBFHw9%#CQ^M>wLApL5HC!V@A
>TtVbA #eh:I?Q/:$<Q@mtb!t>Q@>eY\BLV&@#qApm5+!I*ZeRqqhWI@Z>%%:@qG9>*Gh#S@$nlnpJB/HR1*6+?
ppG!Xn kS5SZLmji?N?6k48b+hF\It=kPAk<SNF@MRRQ+u:IaktnmDtYWIRW<wnmLCCIKd>RADEA\LE@RDmjkD^
$d?J$& dmAA+w+keWiR8CN^^S%BVAiEIAd%Iwl4>Rkp5h5kpMRhmjtHEMT+C\T^F@=Ctq@>DEGMMQudVjkH=KD@
M!4j+8 dtMIkGVKh#T+1TRcT#L$Aa*eZJJ$kle$cuNJkCSAw6GdT<JJlq8kMb6KwuAp$\8l5b6Lapmt?pHnNyep
t4?4k1 ujkjA>>eEpt!lVCI#TWSJINkMJ9dEJJ$wmuM=ncE^JJML+Vb*IcRcJLJpDCd&^ATSdLwAGb#G>wIPCaq
S>RIyM 8dpNIiGp:?jtNkTTV1PE&h!GRA#ywk!d&^CIJtu^&M%6CETTdCH5=naEp5al:Pa&BCJI6lB&e^9/ZhtK
j9enI> #Y$I\JJ8we%6CECVd1HNdRlApt/l#Y$IAElcQHb#G\JIB<dlN4elBPtuA&=#G$JkTGICD5K#DEWTE*Cd
B\Dt+! &>D9^5A+=L<Z@a5X1j!awbm8V%J<#H#Y^hZZ9+F!PB\ck>1wR@FnHC#u/?n<M^9b#?HTn$HNu<NB>h&<
Nqpt>w QZ/Mq^\&Bq$+*M>ai<SGTC@1=+nA^>>^jWluI\n@<j>9F\VlIWt/Vk$P5:p1CDkekWYk@:$81QX86/EL
n:PIFL CwiGwA5Y\qCBbHjB+cD1k6&CL88Q?B?/aPGd/:J?65&XIa%^Q\i&ELRB%*H$*&8#Q5d<wR$cCWWdAMKI
XpN>HF muSXGDkIVS9p?uD<*&8#Q9V?we$/uELRbuMARJF?F9!ebEC^NBC?BY&Au\mAAkEw&t\PATnT#/ijW!Ww
>T8qNu qwbGdpEdPBEDEGkw&pAakbN?b9/e<Q&j&mDZ6WFk$Pk6*B9pBuNnZS5pD51>RWAa&\Mk/RJPCCncACAG
nyuP?P 9kWWRK=QJu>w5@=+l1ANBBRkQdbAIEBI&5BB%Fd8#RcVdWPd>TEDBG$k#EhI#^ISCBRpT@9l8Qu*&1^D
^5^mCu !A>6pAkw&pCa/YB?a&pamN4k69D$SCKRQ:WBWFC$\WKa<YFIc:MyC1A&LA&Jlt@liRNmj#=9pHAw>\da
Y6^c86 HAYRIPt^AICAyk&IRt%BG<#Q=\&IlaJyAAVjAaL$<\aAwYkDayG+La\=N=4ml#bwKM<dAAql6p:/iRPk
-AmTEm 000c7910d00001202b4 Page 35 of binaries2.zip
F%&1?m wGtD&yKqkV>HuS9ACEGd#XEA^Q:G$nAR6Xu9aQ>iG?Du1BMEwa\/ARmiFDVyWTiAk/kN5BXLk@>Eka$K
l<9uL5 t=64A$L\$bBPq++AIcEAmMLk69D$*Mkd<EMdPBRWACF+j$DTKACC$DB6A$Z?9Vcau!kAaKGkAAkBBWmZ
eK%Jpn WWYAKInckF5ay\Gwu!kAaKCkAAkBBWk9TmJAmCmA^t#q*mB@wkCAkwICIASjGQa*FWplw5DGE8&@%\d+
ZbhKcH mRIACAWFpJ8nAEC/*AICCZE5kMS8SS9EV^RAACkwkN\eBVb8Mpq6NpWB>Ia&GMSYuneI:M>SJ\IH/h=A
@Nmp9# <C+DPNLcwCByk>!TyTHRQ?iiCA\PmnaR@NaIBGq6MJC$YS>Cd?HymWD>uH5m$FDtu5nNWRD^G\<WEkhJ
nFNpLA G>TQG5V@Yl9\=>^#w?$&%\aF\hiPIY%yKARWdhcBHLPFGeHGqPYHNmCW?R$KklejVZ48?hewGMI9\V@w
b*S^*# :ikNeF&ju1B^+K<THKk@^cQ<M\MD+1@BMj<<+wb:>WiEC+AkH9GQ5Jd%R\K@AwV?epnWQ&M6RACL&L!1
NX9t+5 B@W>P:JtinqiJp$l!1TLjQT:8Kkw%uCGZC/+$:V=y+>M?55J$ML8IdJCZhFu+!NbmkVkZh6A6cpA4CPY
NW&VWh A<jQEF%b6F4uJ54H/Fn^/mLL4D!%9n&%>yH/iJBF6VM%8/+8RCyCydktGN=dDE<<w^tRZaw9<nw%cq6q
1S*JnW w%%ub<9C!in:!yQYFqG%jY1&R5X5VyI4wSXt4N*mL+Gn%/IIu?#cH5wVH<Z>K4GdICl<!b>Z&JCd!:Fu
69m!WD eyX!X&P*4aVmSm+>e&R<4tneVW%T65SXWPCM%GB&?dC4HP>#PZTwGc$@e5#9Jp8IenN@+G*h/@5bkl19
N55q=m H1W?TJ@BmI5$RZQ\JERdp>j*lDdS$l=l*F5@Hkl<j9uyn18$5EjEmj8IX@E5un!aFZ4h16Imwe4IZZwP
*pFik4 5a8*>C:E%6%ttM#mKF@T64+ZZ+c%=+8myG%dA:&\?%mwt:Rhl%1T>LXaY\a+#Lqd5>W68X51FPX=&@#m
CRP>FM @Zk$B<a6ih1T>IMEY=PYakT%t1lPmXS8?$BRA56!hy\>^XV<RE1ptK*+Y:=he*FKX1LInl4e19XL<1c8
VcjT+d !yi$<ud+SE^=?iSKP#Bw\5dBjPcDMXb%1h/AthE*:>$KNYZkM!Wn\>jd<FHqV%mGkPpA&u6><qV#tyXD
*yIaa5 WRI6biV+B!yWFQVj:k$HCu#Gq!?>eGP8bJq=4R%Q>eTbhJl=dPe%:J?J&/?iBHjnj#B\J&Cj$V8Sq#6H
414Rw8 kybV?B/5eb/%i<nqhh=&:/GwW96H/Q^<&+en5^XPNwj&*>#jbmCAXTKw/iiM:yyKQ5=d!?EPT%bRFZy$
Sc=!B\ P:wpjkm68A5j*dQu&wXhB@6pPJG4VBYkPp@%t>uM8%MbB@mcH!\d<B<eMcPpH!4QTHC@b=q$DijpiFnM
jkR*l% \MQSwpDQ@uE6/w:LLE+$!tj8jQVinHt8Bm@F8d$4Syp#8Icw!!+jJ!^#uN>FDb^?atD?pGdC/LN@*eTD
wR?l<c F#hCS/XanQHV\t4$1+RtD?:+F$ii:D&hEKb9jB4=kdIS8#6Me!1$L@:Ah9Zh59^McV:u9iP!uk5\/%%!
ktwtpq ?kI:&:VAG?S*$jY+^lYjX^i=ZP/9ZWS@99kK4dY6/^HV>yQ=%b<<<+6ktM!IawPeZtaP$IchNhbw/Hb9
=+pDY^ p$QhHI\D!WQdYncT$hB%i8nD8+=c+QWq^WhSqM=%R!9btt\h\b^FVujtH^tB1Z:%X^lcA@dhLi%<FhJ:
jR*t8B w9ua=VLS8<h&:wF#nb\kM/+M6D=T^GqRuh+VH4WDBhc6jGMpFF$AY+LLbN>jM/%@tZaEkVV<PC&DYZ$!
W+4kZp 1Yn6tSBXee%Kky=T5h=l<Wt*M5^\bq@A++mZ5e#N+6%#V>WiSDL:e/y1Zj55<Np=lPHcy+dYmj4>$mam
*DjQNT 8+!L##Zt4RpK>#Bq%<^IPFP+dk>wQ!\i!1L&496\S4^&?NWJl1b$mwNQ*9ADlLT%t:V:BucKCJ<\nu4V
a!lYX$ jQwtV!:+NHIk?K%taSj>W@:LP15h>ujbF$>$GZ@cE<uCS*qKN/cj6$XRt!emMbu49KpJp$E&W^pQX/@>
pa&X$j +<k#!4DkB+YD8cK5WlJW=KLqGTJ4BeNCteCAaBPeWmcZeWaV/HjYw1AT5&6YhKht1??1YHYNT=cy$=cW
k4RqnQ =SPJPbTW:Nl+48mlpLld+Bp&6$KaYD\HyeZFE!bNH#BWaVIS/nh&pqjelYXN\h5q<<:4ZjYY$5t:\bL&
V6%TIm +TDF#WT+CbL*9K6RTZ^aHKJARWbmEn>GcAw>5G&tQ=^5eM#Fw$L66MG:HZV&yjuue&Qm>&1lW4FSajH$
#Q5/c1 q+6<i^6c5Feah=MbquD\G?X8E%QB\<&9j8KSpW#TKGKd#Ye?qFac%cPV6m^4>calHi#e4#9\Fqu\=6H=
G5XyL6 wbln?tpnCwZXc%qDm$dGp8dc/nY<uGbT5j:p/q$YytmZ>EV<5M+8E@j<l$^q^hiCl6^Cww%=XuZ9ebW*
Mhk?^I S%cab8Nbhk8h%LZ=QJXREjcm4d&HX:y1+u4mWcC=<?MBP<XHCc>CYFyHE\=ep*G6+KLQL:/b*1LTcp/8
qTD<LQ X<euV%@GdJqdhDCdmwYG?<kL?\6<S=k!%t=*<ySN1B%G!RJ:qW/>%YGMTT/4cL5:hw!T*tQG>#yc/9Hn
N?8uFd &<j+T>@i18Q1jYJ1j6Klb*hTwCN9WRT5eB8:1!C6MZ/wZ4M>q&@\*yG#W#M/:N!WSqk\#Al%P^\&*yny
!L$54W =BnB%FbNCBBY%T<XReh?t*=k+<Z:VLT=#Dj#1>YF%*a!Vm&S=@mKcn%Tl=+%ib#F*=TVy/A?*56H9ahY
eLNW8M TC*Fnh*!*FL<d4dhN?%8mnHcXEbTpZZ1/$p>a4$ue?W!YY&5d5pDchZMeCN5BjQXhw:n&*9+w&t#6*h%
qYGd8* H+MZ1LhpkN6*PGwpuSZ>yqpk@tbwY86l&H/BAXqVDXudbq4LPB:\RwaGI9$tK@be^>DBdN*ZVehG>n!b
ZIPySB he=H=jXuK#/#MhLkd@nA@Buu+ed*?1JDd$*u:jpd6*%<9kde:d?la56Qj5Kh:&=L9KdVLe!<qZjNaw>q
CVE1iT hjN=>:GqJ<i5k*!W88a/H:D!w^c48SwFKyY??4^<E6*:+Jt1=mXVH/VtpbHk\jFJ&FiB/u&hqbyj=hu+
q=*9C& !y?9lD9DiKQ>^Y+%*qW>u6RCa%LdRT@Xe5ld@1G9k8bTXZ9p<DKN^YjdL5qQ84^1Hd!M5p$*?4mV5><F
F:LSG? F#LcSTy+y<HGMMlcJW:b5/cHqGJecn<+Hb6yF$ya9u6%=V%l<Z&IV!6@w=Ve&$pqwVSjPacGl\hy49P@
pGBqHP n*pqS>jCSRPdM8hIywnZTjFMQ#8tie@lZLhDT<dmpTjZZ=XH5FQDnA#HLD?:W^MMMcjM*MISEu/M$Tbu
DN\S<! 8@Vbhk1nbP+N>5abjN1>i?H&6Flkc=nwLT*P=!n8@Kd4q=wW9IWYh@QH9$&uHFW+cb1@Q!+uTP:&\<@W
tAARN= mKXLH9tH#yR>@8\mAD!TQ:6Z?n!#h/BmTZAEI+8*L4&$ed1HDA9HlNn1=#hyT%cX!Nd//MFLK&>Fmupa
BjZ5+u LBi&:<>/i@%w:c&?uwM>Zn:X!6Y9H*HdDP+QiLKjS@bB/NPDi^QC68t6JQWwT!w?Z=clSh+:QPRy\cKp
:eEITk %#hne*/!@p##C6w%*YqC<?K65@XwtV*uX4e@e\8W=1JR&Wq4i$G+=\+BnZM@m=kHZ%:wT=edD/H@ct^?
hAuX@j 5BB&TLh#4>hJm?wwl*ji6*W6!k?\/$8iwkP/9qAMNhLtCnbwFd&Sq^wyc*@D8Qd=Bi^NZQn4^Xjp<u*p
>KSG^X QuIXCd/ijcM*QiRE9hi1XD>e$^9<=6=4Xicb:8NLLSh+cN8lY1%Xn:d!/pSNiy4XIJjMX:QP%Ye9i<8H
i>P>F> n:<5MH^bHLK1j&LiIu^PGddA$e@CSN9Z$4j5REFkdn^4CD8#VCtp?ZdtEd&QkFWb:QA#\=P$a6+T%&Km
t/$GdN X$:VLmBZ@eFC#$e$S$=81+6tYKn#QW9u!@i/%P!Ld?IdZ:E9=iib!%<#5$nb\:MG:m?+*#@!1XZy#Pt4
JERZ\K DP*II+qYH:R?jEkMCa*4a>L!Qp1kwYBbHh&t\i!d^6RHM1<?a?@j<cZ:=Va@wKKW\:QnEmXD=5&Xh:I#
%S8&LR #YMqF!<85p*4&F88iCIuS<hy!*5YFkuShRRH1kX/p^ntjZc&BMb:C4cIKF:l^quHV+c5+bjW^Gq>a%ia
HTM+Tp G%ca5=c9*?V*8@aCWdq+ywj@VKtA*@WX8j5CmF9LA>%LFdW9@AcZEYM9@J+IuLuD*#6KZW!^ptVTSFHi
hSM&#J yG1&^@PcqEn>Lm1!4lla5^8nm91\VI9AScEJKZYlk+$tcnF<T4Sb<PjC9AWK1mXnZ=*jQcX#y<61QmJ1
unqd8I A5?un&*NbJTI6=^5F>d5*pb&u#41yKkJIdTIk&uRua45uJADdF\<:*/pAh?%bD@@cB$SD\u>pA/DBXk8
1XpJWn e$e:B+&$TKj/>e#\uM^Bm6qtKyGaY<W6:e&>H:wN9\wJykiV4XYjD9iYHk/N8?YNEJq+KjFF%wp=aT>:
tD!NbF iid\/8Vc+A8=^Lj5c/?bB#>hSSncA>p5%C6n*y<8Gn6?L/AW<Sy@JAHElDbV5jy9E<TQS%q><lbBmGcC
m4CAet Hw=QDT@QLT>MyclPZ^h+^ukPcTmSu/KCAyYtX+By$GK/=#5!PZV1>S+W8?NWkB91hVB1!AkVaI/8MpBX
B+W8Xm cc%DMn4kBQaMDda1Ceiill+K!V?n<NZBMM@a:G*j=D&lM/G#FpdmBcHZSSE>$/F>6/^KW^G&#e!&<$1V
69%HXl BI>:VcC/A4PV@X:SYPcEp6%pC%c&c$aJ/cB&B9Q!8JiwkBjwu#**B1qtcCiSuG:GkZA=yMR?b@q/$tFb
%WtQW< h%>XN5/Mj14KD%q%VI*hRi$NBt8tmA5\^XWF+bDc#$#>FN!ehnw5#8nYneZiFSIM@:CRF%4BHNVjAL\<
Mtm/ij B^RiiSWF5+W:WDGBa5:hc\m8E\8$X4dJ6KH+MFEDKyGZMwZHk:\$/@NnV:b#ibl$V8ST>By4pHQea$?>
R1MYjF V%d=Xt/XVw/hnJyNCdtwEGkdK^uKRbL1kjl4?D<E45ejyZD@deynBA4#L+LRAVV\>!B$+I?bIcRkhARP
!5K>>R Tc^LT\#mJwcnI+n^/AA^Hl$k^1MD^Hl$kBmQDlDn$bpAapA/RI^HB+n^/ABSZ+Aan\+R+>EBan\/RI^H
pVT=G? b\KIAipAMS+hIMcnA<S+hIAan\+R+>EBan\/<C6*HEAMTAiI<ikAMS+hIMcnA<S+hIA+MRcIe&:kF!@l
4PKqiY X/D/4>u!*!j%@!^:TyV<E!8GhNA*AwZdZQa*+i$INH^#&R%HApqbBASbDPpq=*>G=JPRSbN&6j$#Jy?E
dG/F%m LJJ$WMW@w@JJ!Q:GajuQ8H\T5wnj6BX/e%pW:nh6laEkm@%NY$G\1+&p%mSqIhkXCpt/4VAR:AwFpt+4
>hj8nZ DAT:RmFI6^WGkq&l+KVdCkQB4yBa$t&FkYBZTQS9&k1CZTFS9&p4CHcFBH:VXlD5Cwpk9dCCkYBZIPpK
9wb=\d #\kMBL5CMcV^Ck9B4pA$cb#ER4A4pHVpL\IL\c=A$9Y*EXkIhkZCTdeXFwJhdcRyJ!pL\c+ADPt?kIXk
PSiVyX X^9QPJK!EP\KIE%>RtAl&BZ\t@A@LAT:&llcpJLFRdA4BI=$Y?Ek&NXGJ!eyC<G8EKS#/!J\EP#1h%H=
/!=9Hu mL>G>Q>@ap$El+K+lAdj\pI/G9X#$Ytn8ATET+LRDVB\$6$iB&%FEIQEdYENDa*<&eJwFJT%b^!E*4XB
^=p\h! a!cyD1RqRSCJ\t%l8SaN@F^<SwMRRl+BPJVBK=4pk\TAR%5V^MLS8K*\Wu/8Q1MBPBS%wI!JWRByhWBw
-A*$M1 00015edfa3f001202b4 Page 36 of binaries2.zip
$JN5WB /1CA4aTq+*+8Q&<W%+CkDyTlN8up*\AeElRk+VlkC?mE\1CJ:BRMFHZRWGaPeNL1aCC1A?K&R4d=CRWw
=RTbdk DABFHTlRRHyRA5B^$I\NDY!FdaQ<CRY@Kk@<*?wkwM\*5KTlAAESClBdii/kAC!SwIKDwk/WcR!GNBRk
:E44Je wEEBEw:aC6<G<SMKN9AEknwRwPDQmT*?Ik66XLAPGX5lD8CIWADHRqEH!tRiTSwKEJCkAIHiCI:=>?yk
Qkw<TJ mV\IHAKKPqB<BKRy*\ACIlRA!K&wk!aTIVBRwACAAkYpiikAAA$K$Cn5X6SBE9qRcCmnAkACFCBJp?MB
q@QLQ? AITwDt=LyB5mIRwJRqEHm1PENGMjAKBBAR1*qjlHJILImAKkRAEA^j>CPw$A5Dq>AQPn:&C&Rw#<WT41
e/>NFC B?$G$6&BAAXIEEXcHS\phhbuqF9lhtCIdAk5qPePCIjm+TLyERA&J^Bkj6D9WGn5Xwk*SDwEG51wAIRC
AwdYRh BcTht<DtDIINhWD+^kLG9%eHTiSDRJtNAmAEKABJ?%8B#TpEQ?+Pip5B1mBAyEYBWJ+:IB1Kc^JHYl%I
nn#?^B WACk$F5BclBP=EWBWEaFIBRQL&t9NADmIN+haC6l>#kmFECcnTKlPI=B$qC\Pa5AK+jDaVbK\j%:dhBw
1FBtER I9pG!1AACeWhVVyZA4A=m+CwDYI4=J8jA>CNNYRI&pB^eyNiVAA&b^F5cIQGdwZ!@cNM:Ia&TCliKTRW
cPmHM@ %#uy=R%ke^dBlndaLa*ZN5d:Q<p*pC\NmpMi@S6L\&&8#j1IAIhDdiES88E&?/EPAkwMwCDAAEB/DRlA
+:e+RY RaIB:IcHiR95G!IuAkjFJ+WCwK!$pB=>wmDCAHa4ZCIM$j<QlTWNwKDAAGtcNIBCRVK%>ap^hm9$G!I%
Z<>JN: CkyNGpClwT\ypeaBFCReRG@WN>$C@abInWJCGZ6CCXBBpPbJA=ACXEkHA\B@T:Z=l?R@!Tpa%B@pFPRj
p9K\Au =BRRnj5HPRZ+e?DKH+qA%&ett=NV%FppYN6:tclb+mnIk\WKKeCLLXRtLaL?PG=G#Yd!<uFjPRFtKp1X
8#CEV# $>*:MAq69byYKyp5jyH+BCHccu8WkACVCJ8pTCbBpK5#Q#TuL9RJLR>D4kM=6aknK4!yTT$&eNJBQCFB
/?5>\/ M:XVi%BDP4&bHl:Pc5ImL<^5c$?SX<iB+YdYNH8e*#\nGNjtJB\Z&8?Q4PX*+!nJX<kTnFCq4p+K9Wht
\4DLNe lym8mKBqJd!pqa&qn&dX4ubEdyBK>1$eJ\lmut5JScAQ+\X*#RehVV1h>cTaa#81PWH\1XihkpC4/GC&
XSanjn FI6GFWXYi4&&%G8M\KDtGN&!4e4PSm6!m^i!F?QBt5h&*B/ZjFXt/k%!He/@4/LWdy/Y51w+lJFPwn/B
tK+@kJ 1Q6TJ\$wkpZ>BGS%h4t:ADXF/Ft!&y^R@GlXW#ulEa\eQ<MCbq?Wa1E4b^VyleGL:t>DVl@u+cD*=w>>
R5NmVl Kc6jQB+9Ll>9&\ndqVN=wdH>k:?A5H$8FVWm:LS::S=/B=q8ck1iGa/&$yu#>FXluyqQaF:Z/Pl4X%q/
5M^yLY i=6atm<@nTyZ$&GJw1#Q+K%i+YlZ/EykQE@H=H@<E4AN#1CCW9PqhiSFV8p*eFPSB*:l1*:DeSjjNT^K
?CZwue 4lLF5i<:jmA%cy5cIXYDX<9a#IBj^/R/u<HAqPPJ9CGlPtG*u9Hd:Wdt\!QW?<*NSlLELRjiPwqdDC=L
q6=YM* +*q:XX4MutuVW%#ul:E?GlQTwhl*u:/*TlA9iad>CAGNV@+e?NS/qehW^6yp@J=!y?u+b:QStnVFjj6T
<yZJWS i?^5SwP&Q@F@et:*+<Bl!/lb\>F#=55tE<m9V@XHH>#=i6RMCcMMPen>FSM^uKdB8b?ce/bh+MHL!L^<
lh\Vhm tJ9wYSF/6u&bn%R6i6I=%Q%VXKS$S^?jqDYwHu/Swuww>cHQ5=+V9Nn8BDE:=?c1%5c?8VE^j9PutP9p
EAqN8W AZa<&>@tV^*X*J:4#wP?qGNuuja=i/FP:6VXF\wVbiHV=Hp#9QbblCJPHR4BwT5&8NIc?ZlV#+jpNpCD
G:9c/l Jb*N+DL9bYj$6*p/4!d1ZHJuZ<%u=NbJ&!>h/N$:jKFBnZHXLi6=bm*%NjicR:!qAWyQBnyjnN@FbRe<
yNBCDR 8KI!PAX?8+i#QCMcipp?lp9i*1w=Q$qRPV5!8l*8tVQ&4R1?qL<6\Xep*>8HZF?Ebb85jn/X\WW!p\iQ
CaQ/:n +PuPQK5V=wXp#iWmWeqPKtTn\P\!Ckp@M^lu<JIR+XLH\ckaL@4?!FwkYwFyS@@5@DF!4S^/6ph5J?YX
+Ay#Bn l1I=pS@GRwNNXZw8<huPdI?R+4dW9KP!^^#@idKim&B$Rq8qHZ%#59JtTGpM@c%lm@L>F*nq9B>PZLMM
$*V?w= TcawH5A$JbFhtMF:H$CWwPe?!q/a#@nP6PcJ/bDXdeB!8B8<81FL?KmJh+%*M%XuCBhLw&?mFYZ48ecL
8KKQdT <k&cdc1:Xb$cKl9uG+8+XhS!qeC^L+E%BG#Nd:9*#NM^\c<ZyeuVJTB<K\F6QCm9%j+iyyLy/1p=W1E\
c9W4@C #jL\!jP$I&SbpnDCw\5Hy&tb?!4ki<awMk<An5q#V:bXpC%<:>nLlyLZ:6NI+*ud4</w88d*Adm/+<cp
Mi^Z^5 ??Hn<*RhFKH#Ek>F#88T>\Q*6GpLWlCZnbKN9?\8Ckp>EQHy1QNqaS!LjX%YTX^<6!PHKy:AbCN=td1^
6GcA@5 u#i>$LqCl$NtV&PYTMNHK=/uPS:HVD=?/>BPE!$Ai+/bbDQw%!C4daY@i<Nb*?@?GQmBbd#u$yARy9Pl
N?AFGa l#R=%StD:Glh\%TM>BBLALNhqM?i@m:\HAj9*9+RyN!S*dBhHINuPGJ*1?Th%:11tl?J!E\&+MBwCT=L
8#CAX6 ^mN4GDQy4nFhpNTQpuH*+$&Mndq*V?yw/h69y\Tj+!hF#tY<uuQc4VP95nQqeWmqMY5@h#56bX+hFR9Q
Z=i\+& cITa!XjZkHjIN&%uBw9hhJ@#BiiuN1TMYujw9#B*!/1?hePWjqqdiu>AGYjunRhH>%lL!44pB6W&nPp?
9DLmYm F=T5pwK>h8R%8Ht4QKNX/hD<\8jdk%ea=9uE>puYedY#B/m\^Z?L5VmCjIV59=H#<FbwI8NI*c!$MyMN
iI6ZNm YDY$NHJZ9aF94<!V4K86plJ/??l=V>^KV@VVXH1lFLq#MdP8I&hp#&P4qNKq6:1cw>a&lWJM$@FClQh8
N>tYTF 8p>cqajn*#/Jj?D>cpJm<6wa$1:?*PZZJnd>PaKqL?+<1Q*\XE&*Rh:kdbqq>NiJ#$*H5//GbBbS1%4h
PeBCkM bKT+=nq?wa9bF*HDN&SRJCbJS%C+eaVYP!!b5$a#ZQ?C1Zi&^LZkK&S6a?FyhM19lB@4%AY6mpytjKSN
!6L?Z6 hD==JIND><MN>8L/+6m&NGWeZ:*:ZH^B@uu/yNaMDDYd5:bPhb?RqeCFSAhN*W:#C?I=S%Fy*yiN8\mH
W@lJM9 Sb\8qwW$uhH5\QpI#?1>a^\Y6t@6@E\=qB@hyq>!A@BiF41!V^#d#IlWNc&kM91+%/Sa+E$^K4waRd6N
=C+8?H ^y8e#VmnW@8bla%1?qjG$yyIFtQKaQYmjC4GY^JeV$/@%ZyLJXl8*6a+&1P&*&Mm9=59?h/DSTi:=<#Z
hynTQm I9l8t%uST1QE1nkc%+SyttjPa8hqZNLtQ9GCQKe+h#WQZqyh=dm*\JmLEFB=YP9Le?H=y<n545p+EH&>
W:461T 5CZhJjGc>5CnR^SZ5*y1D>*yl%p/?Sc&T*M>Y\y/<u=F/TZ&TZ$8:NZERNi^q/Y9:#/Lh=/w?B:m5#B$
HcaMyw 6+:^!EVT=+lXbl4iGS/JB+VLZ4aqk59mDDjAZZ9jF!Bqc>Zk\ejc>b\ctRw6hua$=E^F:?LQwKp^tFF<
lS%tjD mLmIYAQ>Q*y*Hn\N1>nnMP=HpZGKh84461mZb@md*iVXu>:?H9$tJK*y1PQB=$?+R+KaL\#u8llN:kP9
tp%h85 tX#j/XLRXAQntI?db^S\Nna\6Tpjjuyl8c1:/J1?>jnhNKPRl%%?G#dp%G4@Lc\\8I>?+aqLeXDD8bFu
lJ\H!t ::Yjl9CZBI$6V^*uVul^/Xl:+BZ^BmXL1qiZ?TPP9PTiPV=9@G4*CiRlFkKnnX!>N61&i&19$yYE$tID
H5>Xe! *w@L^lb9#4$T/FC%!1a!G1Hd5%kYItVK&in/+Q6!tN4H+CP&n=a@%Z?@QNB<#?Sh8GTbc:9jSc1?k/wW
i!XX%L MK^\IiJd#jDSMnQ*w%MjJWa4<==t*u:lbX4mmZqX>9&M=//D^tF#\c??m!5q>D#tE^HiwjW5D=/%V*I/
TMc$p6 J/4IR49MTpeCF6&TwWK*cpQXy5LWEPeGW/GtWuP/VC%6ne^4nHd5^d8tQk#ZDe&4NKA:j11D:*Q@D4!d
DWeR5^ PNYK@ukm8mc4#h6^kKJ$iJ?nXPFTbhJTe\nbIFQMScqw4kc1i6YT6Rc1L@t4<ed>TZVF#qa^bbV6?qbW
iSMD<K #y11iM%IV*p<HtbQWM=!%C1uWldP%Jbb$CGL%SMS<XPZi4\c+uMK=mld+N$@QNM?1E=hb:QktmB&*Qwc
!eaFu* *1B<5j4/1M$5$8<iQtut+#da^ItT//6mtS:#!8:mTI>V\H+ZDVc^/mBaGy8^nJ5+QDC/pB$t8CTl/*tN
@W*aHw 4YL^WJR*pyyq$Jw\hw5\aWma4qwbh!I5/9t8GG1u14C<C@d>bB!>=4&1\iLnVakJQ@?Kt?655qM?n<6>
@ZIHZa ityY=!6WLI=$m:yiBa=8J*lK5uR1YNL!P4c%Fl!jYicn#8jV11%>hbBXe:G8k5^c<@n>Sp?>k15e4IKB
Qm8cnY 4j\e<dCi/*JN^ee+E%>\4w/n!!i6nWh6w1$T^LV+K#lySbE&mCI1X6@W^JN<TXi+@J:!SXmjcl6*>D9k
l5hW$P QiD5*cdFuF?%jWGe@V:cw\LyN1@y?tw^TN!IA:HWIK!!p%uMm6Y\!WPaW#&Sj6KW#@GSX=995Rwj*5m:
Zj+c=k QM?nncM1V$wMeihZ8?VNiF%4<::QjLVq<Zd9wP%Fk!i/9J$$^^:=c<jS9lWDnMZa>4PbtI4/><kpahmB
i6p&MX EXFnVWMV><T=@n*CayZZhwk6l!\#n:pacy?:@+A!5lHb&J564DAVdZaD@ym!:aC1S5+>:jj!wed!>!Y!
biEZk? YyDw^ua1P6jHXN1MC/uIIeHwTA^Ah$AuL^jWmn:taZLY\WVN6n%FSBTWXw/juEZhW*X&$MjwjFEQjRyY
J&d:yG mX$C>jGt6nX1qtkcwWchuGB*%dnqKVn%Lq!AaaSRLVY>4+RkaetVtd4RXunk*cF4M:*>9XdAGnXbnHDp
QT*VbR 4KB$GJeJHdPj=:Kj9*:TaWCmER<LWK4MFRd:?Gh=h/<JIhjanAd1n^YaT?9hTm>WE&t:#X/lHMnBKnK9
dA5=>X KF5=IJ65I?5u4k1My^j:/y>hmZ!=y6V*dnhilXEIL5yCAdhQq!!ul/>&Hwc#/bChI1?+R$GyTEG\wTHD
mXEl\K L<Hl^\Z^>Fu#LASht@dn>P^pKw:T&4T%nQjeaA9jNPB85K=<!yJp&tF:9IMYhVt/C@RquLw+6lw!JN6B
<jHHW8 +Z!TuuCJ6n!FL4CXVl?+9b1ku=leV+FW4Tw\Tm\Y/1>mwLLZ#QMY64<5$8LB1DcyNG\CyDTA!EBD5!QB
!NQ4Lb CF4nTE+1pi&:&y6EEQ8X+/5EuShtZuE!X%St%ek4Sdb:DeJ5bm9Hl+bX1/pM@T</M^:*>&<PNGM?GMkk
h1dNqC cmdP66c1Wm&y<6btl$e9ppPi+>w&SZHHulem$T!jJaKa4Z5KRl%dDDXR^uBhi4LH^t%juGy+h:EGGe@b
T5*e^^ tcaMtHlh5ucpNqukF9B4+wE9?k9/4=ke6Am!FE&#p/ui6S<a6ij$6=e*qjPRcJdbWjt/td+$5e+uyGGt
FiF6>@ EiXWZ#YTnM<m1Hlk6KtE$iKjdny@11*=iFCZ@tdq<cwKkS59>F5L:!1%HVn&jLX1XDC4SJYRLuY8@adh
-AFd>W 00065366797001202b4 Page 37 of binaries2.zip
%@bd<W @Zm>F<aHC$/ce#\+iByw=N44=QHS1YVbYjwPQeNdb:%Qh%uTuE>*N=wYHF9$&/q#X#GGZZEtQmtIl9>6
a!?8ki FL>=1kHu?d$h!RtwuGD@</ct:CcwMtd#16&6?VbSQHma4cQ#E\H&JZ<1Cl1W8aZ=R@QSEbEBlQt:J&Kw
n&QXmm y/+Tln%hR4&wMEJ/iqb6yk1K^?bXEXP!nqZE<iCBGqPSYWHG?/b=4KaLF/^>*!1L<!9HY*4YJEdui1kp
R%diyM QjeKeqQ^p\\+>G!@?dmlQ8N$&yGqtyCL6wW&c?YQ8h+LYN#$B>K6VV85d*B:INKa%!h:XW9iI%w5HX:?
HmSG64 c:FG^mtT\GqCEmjI:Y5hVVl@V5\\1i%<w$<Ai51m<9/?AYu#e/l>N*BPNd/Y%#6e9WEjhN4lwGTXwHR1
KMn4@J 6mN>^XGH$yLeHa#e<&b%Hh5h#bMP=@PGJF@$<!EQSDIhR\&euI5KcL6:>Q*6WNchwi>XnubXI^t+>KM:
YmN*Gj ZM%Q?DAhe?%iJk<M@LS1j^NIuJ%y6bYyXDq$5ZM+//kcjwBTi@nMEM%L@=B6h$:wjC5/a1LcYX/m$@<5
eea^!q 1#td$bG^YI:bQj1Etp4W1:HRYJdLJpYlpitwq:XZJ8ia9HBGQ9&nejSj8^VD&5\NBVq\FC\pmXjAZ#pu
%jI@Zp @\9mFjBZ1kyE+lYIRj!hiAXm+Q<N<RwpE16AI4EKJBK4RCK^CmRT1$Am4\wp<1yAI1<KJK4DBBKJXTCS
E9>ub% YAWTmXWkpXkFEuqXIJFZBSJ=XTCSX<WEEwqXIJFaBSKJXTCSYAWTiXWkpXeFEuqXIJFZ^RRTmXWkpXkF
#8Y\h= EwqXINEQBBKLEaFEcl1IJ8/HJqK@RGKhtF<E4F<iwd@:tj:ljATIS>1WSAZ<p^n$V>ujpLiAj^KD@mtL
kRSA?M @p%+^#?JRTSpTRiiA@<pByGRJS%+D9!VGESCFpucu@hQalAJYhKEFiCj^CAT51V#M\H@JAd>W^cFI>%Y
ADG/j9 @!RGpbAquZ5I\EC\K^V/N&$F\c=R!N?$FRT:RwG@cT5Ih9YdKmpABwJh@cbPCwCBaFi@1bRCaCHa%Y>1
F*DXRQ yRBaCHd%t&wyABcCZj$8akaL\c/RCNJ6laXkX^5^Q!SqIhkXmQqNY$G\1>@WVRG\EP#1N=XVAC\E8@yN
5<:?>? :SRAC<G8j4hcnwNkX:?yu\LkINnXd!1wADkIh9YdGmwADwJh@ccKCwCDaFeA?J8&ktBZG<G#JGWl&BWA
KFp#$< @$%dRdA4BQa*dRZB4lC@+bDkINkXknSlA+SD5K9jpdjA#ep48I&%Y&A4YbVS^MXPTERyEA:BZH>DqAI*
njG^h& =/:<$GcD$9*96TE8h1Kl=IRG+SA/AS4:t^8L&q!dnhV\eM^YcF<ApapDJTp$CIe!^mThFS4euL4!R^$M
Y&b4FW dm9b%DiK$9&5*+PBwk/pwi69dA$HSb*%Ei=Y\l+&K8Z>=EqBCH5AEXBG^KV#RwMIBBS%WAn5q6VBEJp+
Yiu+q% WQJCk\kA!mAhT%whENLh\YG*p8b/a<d<5+\QDww/WKCAhGbwEIGCy5/Y\mA*Cl*?=EqBkRIEqGpB/hVR
nP4QXm IAIcFCDl/K&wA^CbPFBTR+MILJTbGYpwRPCk1dP8#%b+WpSTHyTaY^CAAAWw$5tlRRATFK\D+FckAIpn
S?el!/ RkEeClRAWPdeIGpwAKBBAYKny5u@k<yEWEaFAJTyQGp*D\mkIQahDQ^@XJwIBKBAAiq15TAAERyRY<uh
eJ@dAd @b@cSFCkAIDpiCANBRC$WREAIMD@F<YJwI\KRCn?DNJ%hWERAjH8dIWe<X>XJ\JBKG+T$5X?RSCEN1IG
<ySjtl 6<LQ*cla<$MhBBRwAKF+Z$lZIAbB1FCA*R1^CQ5VCnb!<EBRB\IWIAHTWABCkkIA8XH?=N?4R&SHdHmq
&5Q+TA IKkDBRyIJ#aCN/i8IPD45%Heq94Pj!wWRRF1JARw?A%QC6!e84K8DkIPS!KS@/5cSTATkPJC^JDYB+T1
=%:VwW D?y@XcWISEIAA=C$?^neuL:!T^<$<Q?mVlEpi+Qm+kX@a&<acQ1kNkwC@t<1FaFIKK=n$t=&EItDyA<C
XLML@u l>^KFed@1qaSmIKCB/Sh@!AKKl/5*/D@F>YKwI\NWFBe*cS#uIEw1HmA&w1::d?1X\TmwLnRTihhA%FR
GVQWQl <RC%qZy@@%ZFIlAF^VXQPleemIKGB\n+q14@d1RP?/EQHM4\AIYF55SBGk>RPIn*B:&X+e=Gm5TjLDAw
b^=*AD iICG5pSFPteimIcGB+n%G+VaTlWtpFmFCe4+AA$FD$nu<RQSWQEAnh#K@WH?^IPN#H\R>IETYpI/6!CI
9<^LtM lwwH/K*pKh9I#@iVCkaFD/CE4Q\t*!GIlwwH1K$+RnaGF#@$AcCMD/CE\9\tB!Q+%%Aa\l?T@\e>:a>/
A$Pd6w TjKGQ&d\j/iukZ<PpjpQQR*AdbYi%6/+D!6AC+6k#cn#+SjRhHASqlH5wh*F8a6mDh+LE=VTc%L#<=%^
WRmel4 FPRlWLF*9Du6\5Qjh^<\9mQu/^XJeFiqSR4c:PBlyAEn6199*<6u!L\cQybXLMpX4^pipbHuKRE<k1pq
^*kR\Y 1ZRPBMw^qqpM8HcPCkw@ktHWTn5Z*AC:/>^T&HdCwS9$VNl4=\PLhCNbujFFIlQF>HGhpbS&>RW1R5p/
Vw6^<K 8j+*ZcWC@/DL=Rw\Cc@^dkjR51P1>NPWRWe^J6!M$iXYYAt@HXeTVqF8J+T/I&iaSICPRMFeiE?Q6K>p
PcbDn> 6%DMu15jb>SW!5V8DX=twpG#=iM=h##4^!uhKpSjL+8tK!?/Htd$1jJKdB\QS&X5ZKI9B?M8@S$Iy5RA
Z?!CHN dyyIB4\#D#ZqpY+YYk@%Hbnti:+LhYZbGRRM6a#9Rt%q>#*5G\tX&NVHKL9mI?MNb!54!Eym1$QYXQSp
k%#q:G XQtmKFZ:d#VL<BC\Pud1ll\hZiW&nLDBuAX8*VA<uwW8q>G1SyYSlRB&^6tI<dRG1Li#$NuyJ\JuJXI#
6u+Ij+ d&teITP$>E^jwGcYA*\ZFJlA9khII^Y!dCt%8G4QP5b:5kL*Gc9lBES<WcwGM^X=IMC4q9yY\*Cw\9Pl
iY?e:p mXukG^9CCKecFh@%5Qy89mlE4M#bc%Kb<QE58=\nn/N:t+<KCQ5W=&SL!H\J+Y8Z9*XZTCaMu>tpE/cQ
#dRRy\ +:I8u&ZlcZ1>L$uyea1mEM5&lNBEe!u</NLhlIB<bEN$*L///1Ep#/VkcE^JK5hBnyp/uk=PPZL=k=X9
<e9Ybq q$PMQ1Dil\?>d&AQ5<X<E=c!Q%#Aiey?#J5%j9KD5&m+@ZpaLt41\+yi5kQ&&/=E&!A=4jmD&AbM^t#\
dw$KpM hjNw^+elLmie8h?yZZD=&Gce/aI4<Mq/#n5!^%5cqI1#6tkpPHLDa4H+/1mt!84E&HCl?9K>^a$P4my&
:dRa^: /9\mPu1/C<CATc=Aa?58Dc:1mkiim!#MT=qDcI%pNjac6cyEktJ4HZwphKFtD@9=k=!:9>%>>hFF5MuQ
Vk?/D: i1h$l9@HK>8Sc*8=:4j=Z+K>H\n+\C&PYeMh%t6>65>HeTnw/&Gd@ueuhuwM96*hl^5J&H%8:=Pk:W>Q
?EP!SE yML<NS!4w>l/e/<8Fp?W<:8hFd9nIw&Ywh6b+t8Ri*NPl9:Bm61F!k?<Gqd>>%VP&A\8IKl*%SpH\9d+
i<6j/u L6!W+^u>@1Em\LaHXj1ib9\:Y<1m4@#N:%^6XDcVmpJ!b$cy1#L+PkY69+i^/KT4AC5LYeh+\mXNGFmL
RBh69j yCt!YucFJabRNb9Q\/#GJTJZp?qXZiYYXVKqLHR1>1Ja4L*Dt9Lh=+$Z&ADjN+>b:c%*ejcjCt*tN&bN
neml:S 6yP&F$Y+b6V&*/NlFA!:#b*<yqp:tTD:w4V^i8yqS:Mpj+P#*d^mdY?/#Vy=jXiT4kCnb@uQK?=PTP4J
*4FG/: $wKqCi\hD$^aMqSEcpd*CZeHua&*&KMq:mQI<%4:DP5:hc$ah1Eb@56JYVWFFNEZ/ep:c+AbIRG%\58n
uE4=lA W=<Q\tkGZq^:%:=ZXWHmwNid%94RGS=CTc%*a=mETQlTdJJ\cHy?p#S*Zq:^6MiXBNub@5::K@6bldS>
=?:jcd E%4q/#H\=>6jXB>l96S^&<Z1=RVH\!Qk*m+D89wqeeydF%J&Q:==I\I*X%J!IY5KyKSD^5e!>B$FwmwL
KN$?9+ =^a?n:M9?dL%:8</em5qj>^P98mY4YdkR@kCIP%484&^P=hu/py5>1EW?$De<%#5?QDVVP?&tJ/HZXwT
#DZ4jE JjWZZl<+c*##uycLKEht1u?<\9P^NjL+q%J>mBInmiMQuNm/<X+ly8E^T@QVA:/Mjyiaadc9nTYMjYIb
ptCu=Q P!W#pmj&8W9alhA1Y%Z^6F?hu$yTqY+YlYN9<wZhpuJ>NXGy9bh!^$^1wG8qRc:&XcHFEme@y:TGmqHu
X=4Ic8 1F$q?\QKDCk1H$lTH*l^t#?=1wLbqD6>SQKcWm4H%CJuWiSDXd1aE*%Q9neFYu%PWX8lanZ58u8Pl8h<
WWZwqM !81Jyl+hAc%H=$$h6cuLdyp4Y&!VP>l$!I>lydSB@d*dWqKRuC+bLpq\IWbt&NV&Si&yW?uIXAc>Fb$K
P9q\?T =C$deWdtk+HTpd/*61qP&6BuH&iPT9SjjuJak%FFjepk6QP<wLZ4/?!b%^Yuihb$Cdd?%+Kh/F5:C+5@
4pPm>h B!+<H9#M&EbHe?4CWnblWM1aScaBn9QjL&6i1$G>R/:\6H^+X>NStBXu/HkEZcmK?mi==NaV$aq6$hq+
i5pM4W n+d&:LCu#!WyulS@dyZS5PS?:N!GMMY%!iS!T1Z9n*<XLi>\bMTmVMu9#K6S=ZdSLm/ym/eZK4/y&tc<
<Tcuu> F:=6Pu9Ey^!59*F=i<&FESaYcwW:\??86Dt4tW\:cei<j*YiS6E&a6qpY#E#>de=jBhutVCZ1h:KnB\:
IN\W=Q 9e*<+JV1Nia<8:e+tY+YnEHc/F*L<>65yaQe?n@JXX6&Lk6ZS$kPKCm1*9@KKwI$^bX:YHFR/uWi>NSa
5E^MLd <EDL!%DC!Mb<Vp9ASbI@**!VYdQ!:HZq4ib6ak85%$wHHjjVK6YPiBm&qV%iPTh>>ep+mqjcXQVd6VcX
a4eN!A nJH1>mnjqa6GebaHQVCWNCt>>YN9\!8p>4p*nRl9D:1hIPj%6TeP\#W>j5$waPdPaQN:5epuulE:9N??
JD&nD# 9HHD?iPVd4qZ8?/umjW%tJ<1$#Zi:cd?#pSCkncSFljNQja=Q?bW=inq:9!b%m!9P=pt6XhP?eY@5=up
&S?YGW 9GS#!MMB\@tEL/umVNRN*iZ>!nchK<@pduMjP/jCeCMw?BS!69=8^t6t9$QBN%AS?!cat:!D?wQu>##j
Cnbi\+ #*>?k1Fq#WjCnFyQZRl&RNkqXZR<6N/my%X>kWGBRy9bq!G&$dLZ:tBRd$%Yd9q?t#D9nG&851uKk=EZ
5YKA<N /qkbXE:C<dP^4=Y@$6=<4^G=ub:nnh:6y%>EB%iXh:AGZ1EP89*hKL1i+5laq9?DHbtcPybTy>dpEGRK
WhWAJj E*j*%X+iPA^#@MAThTj:8ey:>AX:Hm?^ed96<p&9G=L/n^<EZnW<#Z=m6LN4>*#W?\t\=h*P1JZk96P9
bKd/tH J9mj1FGb#=VJy*WPQ#XbQH1+<eCRE>&8GktXGS&c=Kw4D&CG=m&Z9Fy4FS^pq:>JqJZH:pD9dqe@:KjF
P+m#+p hjj?y*N5q5+159n5du*>lKMHClaRQY$V4S?iMm$<abwmc%YjIAlMqHNNMM&V5$maE+RtqpjIq>?M\?ZJ
<CECQj X5Wyq&hclWcjZ56!q<54FG9i8&^Cn?>p:8/qJl96XlM!wGYJ>TK:KTXTX9St$IPTyqTw6BR?GD5<&MNL
4!cnIH p^k!iJX^wJTP%niF6wPZLwcm9#@XVZauni=*Yt%dYVhALYa<845w=cZe=imYLw$#u+W//Z$?ub8j1Z:b
bVYXcd d9P!i$+&Xi%5\:/F=G<Fn6<M@GX>B<jE%+\L%bnpX?<6>I<6$e89TyPXK=KZQtbb=bqAeFQ$I%nl$yRG
-A*N!Y 0005b2398c9001202b4 Page 38 of binaries2.zip
V/tRMl :>qpZ%K^:tSqqcWepGSNEtXu\dA^Hta\PFQiJ#GyZ$c>:jyyiHhl@#hG\SqGu*$&Bc4:1HdCI85bY:9q
?IHX1\ 46?GLh/nl=@8:<?u:T@qIeVR?%+i<E8kK+?kGannYd&atJl+:XZPECKC:%ZG>eT4jG+:?dYZp9QZ/1N#
KqAGYB NF5VBS&>pbwb:9dJY4u^i!uj+YLWXYm8n\lGi<qn>$pultlRnJ%^nZdewSiF>eybkI6kn$YPGWYcMRuP
*G$:6Z MdpPt<E+#PM>^@P@*M@jI<RtpeEt>HlR4G$RIbRwK>Th5G6\6%C=Wt5P5n#L%y&b#NLJZ<LE!nI@SNnY
BHStn= Gad*FBc$6ew:IbCj8ui%*VQ481y/ew#5RTbNy%$G6eaiu6:WP?mbCkACJa#yDM&K@W9u:ST5GA=nVk+E
9NMdT% mt\XbF%Xa/&<LY*TSGG5TLq&R^4PLk9HTd*c#kHebX@4I8?5K^C#9>VtIK48SDZZTe>pwYGTeV5=*qqG
e5:FiK *Vu^I^MR@aCT@k9Lh=cE&qp!:^!VW8upKZdkQ69cM\CwpK$eASH<HP\atXjmRJKwDImSZZ5IDwnLib&X
*Akqjn c:9e/cZG8c*IGklStS8<Y%y48*^w^R@tuQ^BN@t4bBZFeTAuBqRnN*tIVIqn1^JF4uWl&bNR:Dmb=D5k
IQ*8%t 8+wC8\HPD/jkLCZjcC!ZYDi&@P$!M>X\XA/>q=?E:>IZb?dHwm&*Tu%%6He#mZLKF<^m&c:AudCjm&wD
/=Z$4# Ep:64uwZ/B@NhJ%\d8mTkpp4MyAJYZWX>@wCWFWqP<!6Amc*VV>RdDSG^ekM4VdeAS*EB<Q&qC@9wSV=
!F$l?b V5*!6Xnk<8ynmbVJMQcnI<ujIwamyGC8>Q%#%GRQ%\iNVPXDpt6<@kEc&DimM5QdbVuEFWBbShM$:iGh
?hP9:L K1aJml\^CpQte1XuL5W^B%jbVpb*$9w8\?>SjY5$kZuYn<ctaW@u/^W+:W+e>E*a1^^\R4tKZHt=>tHm
wNulYq #P%W:>8yRinb!bhtERy9$uVi<APB8*T1Q&6Zj\VN/ZVBBtjpXa:X^6jMDNSCqXQW8V88a%>jq*m>W9&M
KJ@?L+ 8c=Pj?HbNq6t#<Y*Jaa*?&^ZVk>*9A^>Z=a+Z=bkLl@=$Wj\9e<^C$/LldjP:#t6*y*NjDjma&:8@@/6
a/nD$/ nbYet:q*THKptcj9diNWuB/4%bT$ECD?pm8cl18%FXbe4Bby!K!hWX6hH*@XSnH8VHicelHC?ad1/D5/
1#wnt^ M%tumXq+Nt>@GL@^=VLYdN/KG@5Lh9K!=l@wL#*IYu4A8HJ\VqwA%4awX?Bbd6Wn?W%qe5ttp!N8\QhF
/4=n5N eeR?#*ah$?<&I\N+Z#1iwPi<mHM<uN<b8BV*6#@tH*uNc#:9tQdbahTe9=deCc*lXQ#SXn@QZV:Qk>Be
1<F&S< Eh=q8=BC@a/d/%1H*ZNdP=q*68l\&/DKc5=c>ii8JRda+$HDR&u6*VEH16M9=uDRPd$#eFk6QIC+/uBI
/a%DS/ #^F?%yuquAj/6lQ>qGKP>mjRXwXJ6&LAb8<L5YhpB&/H=1t&WqA#tI*yGVK*nd%qu8tV&\YuqYhS4@<i
k>8pFJ 9RK*KLN<GYPbh6CTM<n<\T+4da#j&:$YD@k6H$lcqcX?pPj$M:j@WHM1wNi@H6a&%G>kY>+&\ty6:jlY
eG?eRJ 5<4@P@9\q:I*Z%=kJGc5NW^TEeMHbnktuXNuHp$@NT#cdVl*85c>qXCqcQRtVQ56yR/KTaGDIVn%jQA\
@CqjVc 4@RI1&LyYZu15<bZF?/pCVc\Y56Mj%KLq+m=+TkZ^XJQ$>*RmG?T>A&j:c?uYyM:NSjZ4i*VDZjRuBhL
y/EHnj MFQVimL@NpG!Y$YKa9C?&1:Rwq9%HC>CMiMQcXmQDPy&/F6$MEc*h1i*n<tGH$EJ!YT&YWq%!F!I!AAn
=NYMcL ^mVDq/\:Fl*CiE^5A?+hC#4HcBIebMlGZ:dKXQXbm+6Q=d$D$\QuPiDWTW6@d$99&yh9NSAMtn4pwVMh
DRWyh/ tnim6MAbYhcVCnjThB=emR$AFacFecqJ5pi8^4HjWK*RHZ5yy1tG*EXBRaK8B9/X:jK@wK8Bj!ZJRKT4
NA:ypA IVHw9>QXpBnWj$NZR^JycWn+#/MnEZDmJ$D<SBI@$eSQ+u+AeV?AYKpMCSB*BIk:A5RhRiKPIQGAIHE@
GEqClh pLkjTFRLTY\&JJK+I=K+I=K+I=J+RBS^Q^S^9%<yl=Aw+w+w+w=Eb\?TYE\NmTaiEE*eD$*e:^jBD+pB
6m@^\R @pJZ??Wl?y9j/b?WJJAw8GuhL9CjqCRT51VyH?A@KWppbEuZ:RL@TWpmIW8/dlj+V$wTCXuThd9Aj%KT
K#@Cjp TMkmj6NY8M%qj%P*C@\uJatELPt/ZiA@KWppbEuZ:RL@TWpmIW8/dliIlYBZ9/udBYIl&NX9/ucBYAl&
Cp4G/T >b8/ZTAYkq*>yt+ZmIXkX:?y&\XmIhkXE9td6wJkX$nTXBpRB<G8RNIWP^AH\c=A$lR:EAjB4u+Z6+GD
>HmnbA aFed\TwpbTHaFWk/Q#&Ik&BZIPqp<CAPkq$ByKt=IA/CZRGa*>^jCHaFpKdakVkIhkYRy6kl+SD5CmBN
b&c*ei 5WQCIhkXRJyml+SD5C5EcawhEk:B4lCpKZbIPAT:R1B@$%aR:A1B@E%dRdC4*%G@pQD@:!&kIj>K!Qu>
Iwpd<4 NYFRY!Pp@SiX8=B\CB*lN+R$=F<bPj>u$ALtj%T/C+tA$MF?W:wL?XhK#9<SqIXDw@=H6d8RCCkDYNK<
N9>IWi T!RCCZFSHLPXcqj@XjE8JALK\Jk$F^V=X%LP@&X9TQn@1HwZEkFq\E&/ileTkaX/j=DI@%H=LmRCB&WC
#AACXA RSwQADlWjdbTC?K@16?FBKDkAiu/ZWkAkK4QXww@@qeF9JAAqIpH/RJiTAA!HtB\@/MKZpkA!wTGhAW9
9!iWH^ JICG1k<Y>V<1+aWEIPDBd$y+IRHIiID:Z>Z\RkJRJ9cpc*klRel+kEQ>n+y+IWEwDkQTp!RpCBpQeJn@
l**Wy! WSW9JAkFD$lQ*JAkbD#A+j=Hbd!RIAR<?E$bL!RIFR?&XPZm9/4nlRTlPE=IV*CS+Pb+kJDDIVBda1%9
DdmdMd VNF?E41k\DWI^S>Dt5PBSG+PB<DQWqHAXnk&SK:1ll6te*&REPAA?S5+RAKR>Ft@Q<k6Wd1IDDWwMeFI
qMe6Pk JAR+RJIt1!KSTKn/dGZ/A^Lb1mAW6mwTCeW9Sb16mpTmIi8#FRalpc//+bYDwA<EPAA^9:G*#iEAqMP8
idLj>= V$@SY/tDB!hT%KCpGEEmeXDeqTSh4EkWHKw/Y&GpaItMFB\Wc$NB<j1TVkcHSAHR%EHDeX5lhBEJKXAK
9+CB9i ^TBSWJ#JyQQVIXFImP1A!K*\8al<FDRWa$PlwQmbj&N5cIn1dMX#ABDy1kCW=EqIFBVZN?pqBmRKC%Yh
G^/CEV 4dCjmG^XAAydFatC+qEu9i1BSEPEkm&XnAKIbFWA$pAHDeXS@=8BDlw1FGC*WycI!FWFwCSQR1IlRAFA
FyMlHC t18KSEPEA5^Y9NaIIqWXAaY1mpSDkRLTXFWpGmIWaLdC9EWRtcwIDJSSASwKFJBt1mLSEKEAm>^KST<m
w<=lWt WSWBJZpTEw&D56lEGkw\EKEA5^XpR^B=1kkwQFWpBkIWIEn#XJEamFCA&WyXhkTSywwAwM^IwaVEIEnV
aqNWpI XJF@Dapl@CH=j>C+@1k5Jt?+jyHwj>C+pH<PqjpQni6HnyL@j=Y^4Xabm=LhS$iJ#E=$:1iuWKJ+FE6P
+SDESN ch$Hc%J#=cGtVMV*S95&+5Wc+TXauu8WA1yDMc6HCJJ%*6L%NWCJQ@^mA?ICGW@$+m%9jqnSQ$8NcVmE
bicPPD tyInp\TN&ct#+%RwJJh6Vb=8A++nKNTa/1uA18^:ll^hR1G#+6X5<jDSG$PBIKilKae$8/=yTySW#iy+
8clkLJ JdhSW=E^uuyIk+1FWNuD1wb<R<&4bjTGmWbn\M^kt#dB4FXec#D%D1@lRHWcT6Z$VR&@!dC=Ae:WnNNL
P5w+>F !&\pLWF*5Jw<9y:DanDSn/884>&SG^cYPTJ%XTW!yJa&&SGjFeW1eFeVQiZb@RR#Gpnn1q>dZ?ZcQTSC
8H<inX ^cJTieTbk==T=Ay>kl^HHty$m8#cI>Xe&^eBWbTid\<%:84b4V5cYG18QZJ+Yj:pEC1c&9Vy<B^qmF*G
p5#b4R D5=RE%R/Q&H1k=#wmcH86^+&D?CNARh&eZ/N5C8i18d1jCm@TlCe<PY<!tAn:FX/4w8D+/4$*y1/l=w8
Hb&=>N 9m&*Jcpw9Ta=Dl^KPZqP:>AI6Ve%%^6yZ=WP&a+A9KYB#!FZF14<:AuL@GY!ct/#*YVSKtp$ERM<w8J^
uGcB4V W#!HhwXQHYq:HP9%?eDAZkj#Ny#N5^ZSw%LWJ4bSHpa54R?X*R!?JSRmQ*yKm>8<b<:*u<m5iZDwBcH6
&H:n>6 bp:*w!@=Feky&Inq<kXDcaNy^V9GR<Mbq@aQVD+JelkL9H*Q+M^Lp@VQ*N1^MD$HEhWCp?:V8c$?#XGW
%yVR%1 GqWilw?<1nJjYT\@>#ZkF6k86VSiWNL9\T>RSiauMHHu&AJuZ6?6N^j8&6Y6uDm=%@LE\bMQQ>n6$Zy?
DtadBd $@lau!?9^XR$@1YF5Bk51tiKB=S\GNS=C$TXj#8jGL&YDPJ$T&ZFm$VcGRk1BhbmyV+TAaGuD8lWap=#
BJ#bqA DF&WAF\yB@JR#nu$?RYZZZbbER!a#4?+mZYt=$d!+H$#PPVcLZJ*W4Gma?t8N*Hh*hdpm6uu*jKkKCM#
Y#buCN W<mnPybSTD#VSj>4^n:#PIPBPwYMW9ceuEK\p?:@^>=jS<YSdt*nMNcNhtMN\bIknY5:EEIch&meaMHh
&%QWqb JTGEJLm:lSCT+P+PIRu8:lAn8AiL&#ibM#Nu=pDPeJ:#4ij>9Y8>j>RCm4:1*uZ*4481>6:Z6a&aGn++
b8ZF9< 9D1<BXPNML?\tN\*LbWwYjCTEQKBIapkq^*yZ&jPmTVIjKAnd5k/=J=Q<yXwIbuc%n%/IqlGPbVnPVXG
<>KA\S TSjB&EjFbGX+YeNNqp4JnkQ+8y$q\kFG#/cw\M:aHGlZVT&Yy?$RALXKA9LiFiwNkV1yH1au1@NM>hWB
IWC?pT BGkG^XD88=L=VTd5PyB1%dde!b/8Hl:PA>5k+EhyhAw=B^%%Ht=V$ytQ5RR%1jQ<Ht&pY<HHS/n<&4YM
i5T/+V JBhQ6aku*%RPjSMwD&V=:TaJem!lBmZuCHIXX^MGA@cWuAybR#p*EN1IYI\kb/ERX@/K/XKc*y5IjLFq
W<86A^ GNjE%8HXmuLlT!Gtu%?WqN!cDQuWNc@/+u+Ki?=8jS\@=1n5%cLYk?G>jC#D/$81k>i^YkAEN*hlaIA5
AZQ<FX /wckyyjttj=W1+nM/^X51JwIl&GYRD1dTHk\$5h$PECb\V%FL#@Qt&Fka@G6nI$QR*8D#bjC4b*Tw=ky
??VGF5 LZ%N=XiQHTJ%<t=yHiYy+4wR449A&\##?AStJwRIpZ:LWKyXquG9=GAiZXR/PeZHIL=EMA<\PDBbnu$<
NS=%bR 8XJbjy&S?dLnthePWWqJynqF!RV9!?C/hcAHW*\*FP^$BC91ct#tl9qXHJpAXh4V@e@tXjShH%+5cpC*
K<%eqM L^wN*LdjBVZKVG@PGNWnZF*pcy9yl%eN?i<#qN?jc:yG9@W$td/eT96:j9t*Y@Dp1C94EJBT!bka\4eq
*JpaAI Xc@TTW9Hkn1QP$G/iHNGl8L^\/#N:I!=4l$umlXiZHGBWD!61lib$y$!&$i<e^%DSBBG@C5V/56*tPeL
eCjqZt !$#<PHZjK9M/8?T<#Y@5<u&6BHu$YY>l:Q6I&k8<8:JA+Ju5J*iNy5#^I?w1y>u:DY4ZLJQt<19=+BjV
nyQS8< Hbq1bNIQ1$KV=>NXG4!FXwaiuVp*Q@!5L4t<Z45JR:Bl4SLtiAkaGbmLE#A^H9J!44eccL4D<#TnI9%k
Y!&c$T &H*\ZT*D*jjjFqnl<pyu<4kA6qt\1mF!wM*W5Jp5#C@bt6/$#l%NEC%AI9#%a*HyW@#L>aqHjPW$VnHy
-A:hK9 00026d750eb001202b4 Page 39 of binaries2.zip
hWGGG! VYPdwq$qnm/hu$KF>L/11jD4<p%?THpGc*+V?abi&Ii/K$Ykqm<nuidwKWymyq?X1Y\#@jLnGTm$Fy&Y
&cwW:S Y%j*/Zw9&bicm<JX1j&Jcwaayh4:@LiPH85amV6AP%5WC9u#5/i<:D>MD:Zu8G6yhTY>*P<?WC1n!CAb
t6*$$u Eb*nI64daHWWwyJl>SeL^ZYQZi9%\Ea9mBQHa^qYZV/mN<uW!1:HNmXVYaP%Lk9$mdeMm!1X9DdLCb$Y
c*/5CY Y:LL>86yqy>JYKuX:SZ$$4BqjJSw=GKW$5Sb6YI<9P*^PYTw4Ei$N1NH@mD&=9BHDQ9K<+J5#!M^S4Id
%QebMp *+eLi9I!D6B/9S<\mLWu6!HX/iTS%#Y:ehVRHq>TC:ZDiPQ4hDuqwl/8Raw?SQkASdd%R^w*@L1:?S>V
*XN><C !<XB#^p*Yp!W$4H*q8\cQ><uB%S@SZLSm46tNn*S/LXpaha=8<VGccp<I>^X*#Tc:bj:b8?J$SAlFHdl
tHbh!i li9h??heS>tbDmkCuqRlZyn%9LTnc+u4T@K@W<k/b/bywWMd9+m!#mup<SV?nJN?%<>=?G+#9dGD^EZW
\h><HN >L1kR5j%@SXZP:X#d>h<EP4WYW=yFE<FKj$EZh<Rbq=DQpS\M=6lZSI/&V=N!%Hhmt>ucMQVpE5H18eL
aXyG4< ?=ERNQLi9c*^Yjq<cdkbD9\tu%&?6Y<=Y4Xh8WJcAE1IJ>Hy^GytJ$VkA4VMF+L/d\aN<kcqZ%Je4!ne
C=pa/G 4yVXR%a<TTDFl9EckHmB^ubCIXbe1jcGw:#yKLN=bGH1Za*JNL69!JZWWj9+?A%SPi+1Iq:X6tnj8$WG
XK9B*D YlwHkELkHE:4i+hNMI+wL5k9ZSkKDPdLAAJ%I449F@ZZmVVZlZ!=6#FFHnFHQqy>Z/TBanmIjK@!*8ka
EC8&FI KL+HyCF$G%16%$eFhQP+HVM:4hLj4Y1uYN/CaM%>%hyjI!5CH1QALQMF:ytREmy@WyL5!S8WL1hSHTW!
4h4RwG 6wBTDAQDw?I@&^qI=:na:?!?G=tXjjQ!G/@!6^n$WHS^w?4ppMD5wED6MLZb5P4<RILnGaHTS?:Y>GPG
1cwGwd Vi1BA%9N\+=QwJX:D:cN<*8BL$t@nhniIMLL#%KlWS*+NlbLM6@qWlmpV5L@uepMb&6XDiKPu^5iuRhG
^1NmV^ 6%pcw&#Hu&?4QuhTLHNaiB=tNXGt%ct=QyY\t<8*LWP%>$I>YTJ:jTNupwlIHNm89tpXLPJTKnJeY=Fy
/wFbLj 6lX<q#pP@G/VbV8+e*8ec+jDdKhWTE/SNd=ptX!bJZ:WJk^uM!wEXXy!lPdwLed&8&6A*l!ajen4qhM+
KaEaIa #%Wa#^eui8m&^lGHnZ^#md9/P9ed^aM*19y+Nt>=*?D9ueYQb!PRSkNq5nqa#STlaaRe!!MChknlk#el
\T+iJY %YM4DKT5Wun!8iN!%iMli&ye&S*C$I=NhBtwhYJ<wbN/<:ucW/G\=%HWL=?ZKb^NjHQYTWcw^%KEy@Q1
9$YMR# m89=ZBm9k5<IWKhAq1?W#!>W&d>R49iJ6W6:/:#nGqZRp5Mw1cqtYH^TeYYJM6mI@<CZ4NWGN8w1kJ85
j$8qiQ @u/ibuYK%8#=BPubtm8wGteSn!&SMtMbCwN<XWMDptiM1yb5uaGXkBk1L4*M+T>awZX:%uZjKEPyVwal
DV>B8R $mC^RSIMc@9CplbtZHpdWeuyCE/qiwDy!9:KCW$d8Z5lQ$KeWQu%MHJ?MDDbwi?5wt^>=KC9w+Z>+d6w
FB@AQ@ ^X9*c::XIR/MDn@Xcu?W*PnC<q?YW14AiqFmp>=KRjDYpT^%p?i^G^u/kMC*K4$?\5cX\ucba#\>yepa
m1dq5b +iH4cm+\!mRcDYic9M%=#5w1HSXw:8D8u9GmNKh5&ce\GJNtLI?V5M<Vy$ku%nXcG:M1VYup\nSF=pG9
JG=tSZ +A*JKwPljY?/MW5G##Lq/IZBjh@$@Tkb6@imCYt\:CpmMnJ:IX1^yb9mMHq%4mB&%*1\C!>A5*I=bQCV
GjWE^h wyh1<CLaM>69pq!nqn%Mi%</BaChFL\$ST!FI6cabJPt\>ipI<Tq5GqMMW6:u>iewyN?C>K1+>X/T@cw
X\ykt4 1%6=cAdt<KFqQ$NJbbIWGEat5NuEbX1e^<p<QtlQ6Pm#Va\I$tD8l:THLLFwniNW#^WJ58n6n/yAZ\N&
IW@DIw q^%H<4<5cBNHTCD^=y<84!DZ$kPZl\T4X>BJ%#B<&MtWPtFd1&8$6&V\HGWm*58Mj6WyZBQV^d$d#Za1
a^QD:k TXIIHpTJ!CM:k86etRySh:nK=bVM?18R9w9qZMyB1mB4V4qP4tT4GyQ<IVp\!=PS/?d?Wpyi/Wubiu=h
/\kX*J WHB4i\*kRX$XF\D9%49?d8Vkt4LtNRdahiYBGK6yZj4JiypRB@/y*t=I?+k!IiNdDX&8Q6*pIZtmGn%R
#1MbD6 wYumtQpE=4KLpt&*t!<^QIFDTt@KZ$9*X18VwIE%\KB/$G:WbmKlN4+Hi=&/Fche:EY?y^+6nqnQMjL+
aVH8LH MuG\L@m&em4M*hk1N+d:PmPZe9/SbLj*tC^SG6uPZtL6i^d?BLP6^JwqKXQ6ij6*TB5m9qibYEwM!RLS
*q#5yN aP<P/:9BPG1$CDmK\$JQ5pyQ?lY!lu+4+5!?8%Z>biWbKiZ>AM>/I&8a9bhPuXhCJB@^h%JyLMjwS?NB
1>+6Ra S<4DbBLbFX*=RePBk+L8MIP!D*y4/Y%h49bq6Za>tYNA=E#%Y!G?FdTk\bT&1*DCC%>cY?EcS>V?m8H:
aB^+GX PmQiNp!tyuQ@wR&W*n<5FIBZtwYh9X/ZLThZym>L:JkLuBY?/4qNdMX1l/T%h6beMywAPM$$PJ@=:J6\
$SqX+< /D8B:<hA/88?e/N+!nuQBVkScPX$^TXq^KaKu\k9#C%SPTW+w!4bSD/pQFD\p>@$BR?wdPZd4@!D1cZS
C%$Y9i <hXIQit/lTbS9b+Q<nmFXtS4l<j$jWXuqkQhF>=X654ZNMI%d%wqX>E*^qm=Z@G?I%G9j!XRcjhu#eYR
*uV^*k j!Y*@G?\6bB@=eTep1&F?tQjH&\6%P@h9p:J%lL:S/e6yNl9qCc^*!lNa4>St5V?MRJKSPT*u@DjjmJ@
599R\w ?@qd5AV%G>$L>S9hC@Wd*R5FR@/FA9X:hPXja#dH!8V@MTPuwEAln>N/V5CiVIFCH1j%uIA>tRKFQE:4
h!X%iK PRF:MkWKib#Ye\L&bAwW<nm6=\V5!SRw=HFc#*H5V!lR!PP$ulP\wn?bK@Ry5Pmj#BZtFNmj=G>FV?FZ
>Q<qw% KQlQ=8wWjwZ<CbXB:BS?>XNckBn5@*Q^YLHVlwnS5Q<6WwDaKT/Du=EC^E/dLj19c8n@I$/A&Ct84y>^
p&lLdn A5SPt!*/d&kp@^pqRA^#twZ%=JI@MhHVuw:a@^anRP\$>=mVGREwphNtm$VS@$8EAJVIcY=hJ^MCWCKu
Bc^8#F Y\ykQ*S\@*j+ACmS$>\SV?aDwESP8^TIIj?Z/AAwphM5BTjVAXAmy%\KSEZk@$65AJVIci:jJ:MBWCKu
VDZ#^W VS#@N&u>@+kMkBI=^XL\E#IACudKyWAWJ9K@^AXA\W/^FQ!EC+A/BSeN?WNjH@HjqMV<iP:<S?u<cd+h
Sa/!!: &CtYky?$TpYhkw1GEpKn@5h%<#CE!K>cE9<wuD@NTkA:#TQ*V%cC9^LSeH<k@$$c@A<F$^>y<N>%PQ=!
Yh/cAw VM#^NDlMXAV%j:YcKX6q?:S>%#uAQ^Lch\p!p*\L?aV=1EClB*iJIyY+a9yZMw9G81pJpPH5a?HV\Y:I
?6SMdD 8F+44>:bBq$T@uDR%QwLSYM+W=9bRqcu:!$$C+W*AZ:lSDR!jwB#NDC/A+E5c!$RmaS?K%lJAAFddqBK
:$8h6V ?!BbbyXV<HS8SGGZDl\!tl@:th$nm%!HjC9l@XBaFcDCW>lEnI>6l:VqWM$BaY=&&F1k8V<PE>&GF%w4
d9Hpka qiQHk\FHSZ=mDCF$$&IEEGdQ><MHD!R4m?$/ZAJCh=MetIFFml+5HK:yQ+SCN!5bkMYLLR\TPPq?HlGy
DedPP= eF^:&SI6ANl8H8+AkbP4ItElI1NaXHSPL%be#mQ=*JM!T!e5BE#85TCtplYNwlNepmmHTG?yipAAk=A8
XnDuER 8kE9m5iT8GRARFaMwk8t\5EuQ!wPiQq4K&qN*1TXWb?$Jyh4Q*IYk&pq*^hYu9S/i%b>E9pXycqDJ!mw
QR5iIS 11i4b1R:/l%!*uD!Lewiy*$X+K%ukHy^+@IW@WXum>uW5$4YluRjDBuLQEch?114tedQ\Kw?8dE4iW\t
@F:!5B j!yXaeX^!!yPGpJCD^iYXM1&ia!A%SCu5c9qKE6cd>pBuCdyYMMk/pcX%^d6>Tpb%J!RK8a4:c$!S?j\
4NEdpc &kyhuIuS+6ELRjtq1?ym$bMG*ZLayTM%6kSLk&tqPP9pB=4^K>=wqdmXI!GFJB9SZbQpXed8t+qDAXlL
hBcj1> qR/y<uAI<F&uSia#<:4CjYQKp1@RXk^wkCmEwDauXE8q?nP9eySbj\RFVG5CYMZ9/!+tNGA5X^NC1H8n
@F<qj9 i5T:ei^my<16FpbqtRe>p1GI4\qZL1N8t6n59S&ldZhQH1E&6yk?e/d6IGWN%G6JF=NnNY><<+/6B^y%
m>Eu&@ i&!9=V*uwQ=>VnZ:?c4h=GCkqJ6hVnCV!$QZ+9/PLu^?5H^=hcTVGi=CycdXnJI/PpQV/LXS<CQ=tAS+
?L1W+! dL&IVlq6R/m:jA6D9&:nDwZIB>eGZnZtpJZ66yhq*/nW^m:R%\:e64PG*Dk*ZT@^XZ94>S&LI:Sw%bXQ
$jHK+1 #j=<VitZylB+p%+p6@8#py/PL:@NlFD=^!5V6jcCCF=RpAY<PRCtl4$djiZQa#ec#NJ<BN\&8Y6pu&eZ
RWK+\G H!KjuVCj$<K@kjLpJBlQ96jpT5p&JJ/*%^+<iiMYlZQI+#\P%6!kdB9qwZXIc1*1qZk*!#A?%61kP%!d
=*DkTV ^p6=:84tNuJ%#9SunjI>ht@^N#W\M:I9bZyW*i&SY>Nka9@m=DEYKT:\ZyhyWw\JTHW*@!^ZBwkKKZ!y
Q84&<L !=t\*I4?CZpm#<&TP6EK@>Y#?Hnt+IBSpXCSchqwmJ=t%>lk+J^w4yFPy4iH8$Y@uDh9m6hDW:JQ8Q+/
N!\RR< BB@$YXa1GbP8WJ+69>XS>S&61+d>e<+<iZ/Qp184LXT8K+npTV^Kw^ZTX%FK+LMSGL!#<mKLaXcXDq@4
Y\aa+A hTk9YL4PQ>Qp#5GG+Db%AEF\1/GKwS*RuVE$P&@!Rby$k<>K&WYl*HMF1wHZWy!WAmw45Tq*6F&qc1b<
Kn<ytA <n>?KE/DjkVk%*8MZmY>PD48IljHCS!>l9h\nlB64jw%6j11#>DhIVbdmmp5+116k6$Rb+:Z@d8mBytn
iIm6Yc p=5#&qW:DIKFZ<uQhtn^I%#8!<lZWl9PJewwhVdW:%uKYdB=KM6%C$=cMV&kZh1SKk6q=b*yn&RZN\IW
EXN+JR t9MY%H>lCeD#DLNLLcL9@AS/cY\T9TWN/@:$jD%:!LG5dplQutV@4AuIJ<d>ycniy!&YEw9J>M^?!R5G
I/:j!q Z*bii<$dY\NhMw9$Q4^T9t?8WlimZ5>\b%+m\i/\5YEE#bJ#yj%?=lFjFAP4T&mSYyG6Z9tW=meX^TL4
pnw=Pu e%dwbtInbmPu8b*/*K9n$=4h%%^+yy4!/HeZDD@jhDWEmenw>IEMqB$I<66ZTV#>/?cbR8?6*:!Z+mX%
*:1N@H ?+X6pTTDe^/kL99Xe?al>:I/cJ%ii:Jy5hwN=^Z?S1j^q/d>S6j6hd91G+cBX+#mFF%\QE*?&Y8CTen4
TRZyuW pXR\Z9uStQ6BmnHn6F1Tc/JjwbbjA8Ky4WqiX*qq?/?!hFA5KG55QMu8Sli^PqjZMiRV54jwA@aqYLw!
GC4!p\ B<+5h5uEtD$S/nawuqq!<w+YLPjyb9lP#<DBnDJEnhnHhnJC/dM9T/98!qGep#$#m4M1q6DyVu9Q8qR9
J69CAy FR6Vq?%q&GK&@6KW=9ET&!%&l*uX##aN985$mQP1ZjbApdyeV&MnInwl*w#/K<j/j!QinQw4lj1$<Ya+
-AQTE6 000aa815898001202b4 Page 40 of binaries2.zip
*V6!l\ <qm<Ga++Sd#=%<k9HH=C=Bh%9E*mQ&\:VcRMhb\+@b?A+Z>>RQwh?t<ipQ/wDj#^kIR<+RHy#<#u*^?R
+bm#Vu j4T\?u>qk9>ltYCjaA$:YXhWhcJA9SqPAqqE:5AD+PZBedVGm&CuR:LC4TAwRbEXkqDuC?KMwTDS>GFp
EM*!eB B\PYP>KFPZKymajpyI954<V!@=YL:K?<<bM8MlV!lK5MmVy&qTGS@$qYB+YE@VZy<y84wyCIE!@Ba<H=
nhRu$6 j%n?%\VK!T@w^/up^:G\p#ZGWMi:QJ+\41na!Xm^W&BQyu!nn4hnQI=Fuc#*k#yP#V/PSj:phjq+*<RV
pyZ=t& 5Cj#PFHHKhRuuP@JjWhR^^5eH5j?hJW<#uZ?V<Cu<C!MCPypLPc@\J:C5*+\aE:Em9*Q5WmS@\L:h%pj
Il&4jw NcTRtBACAePIC5uatd9>en5SWuL^<uC%<4c$h:EX?lGQ5HH%EMJbi*m/8yk:CiE<:K?cY%:@5cd>V/IX
*^Pd%n Q=VWj4B\j#DYpcjyuahC@85NFa://\$X@aQT<M8m>TPV?>5N>jew\/<*XMV^G?yj8eIuHQPQt@S9Vbu%
aw*:th @uqn@uFMnNkJ^$TieJMYESH=?:5$wMMe4=%MmBEp#$/apMFE^pbQSHAkyp=9K^bPplj85?Al^EIC:IBq
wQ+5SH ?68l+/KD1RybSAawEVK9QWY6SCFmehFtRRtbnb=EVBSYXj5bXC9CAFWLkKJQT#TCT4w@Pc9qp!+\TFeB
cqVYp! uyW=LIqJWRh$+D@GFn1HVdQYGQnWE+p\kGWBMtj#8$WTW<B:B:<GPEbDmGGK5#n4Xww\>1BWRuynSm8*
j^TDnV \LH+WS\4^\JR6Kcet>+idq9=IcF8AijV8SLDu4mBT%HnMC:YKT$4B>Y^^QKN5=Wi&eDn=*auByLJI+mZ
pSdpX$ Py#4><Nj4upD4mlDQNERuDqpejB/&dpGW:ICpANGZMjQudQ8it:LYHm#N#5D!M!QGe5*BX!=Yd/up4iH
/uG8*+ +$EIpFl<4+9^5HyZAc4PIdyw*p>$tC5XNd<kGcZ!pF^a<aaRJDJI/>^dKW%CNGQIAPHCS?Bw!SHD^Vj4
9I=cZA pAaBy<nX^<%5Muy6I8G1/H=+l:<Ye@N4FaH8WB#DP1VXHP@qbllF+!EWc?pZD$GWGnHSX+@4SPBHH\RH
pwLG%< DwDG5ddMCCq@*EYAENEVCDnlpRBtpC&/8^iPWKFwX^JWIWcGq4H+\@yL4Td\l!c5HyLCq#JjatITbRSR
4ZbyA\ A=MCeYiJcCjVIMw+q91BuuGmC5!+=^d%yW4c5#J\EY%!ApaA#R+%y#4m4Q^Au:q1PyZTNpWQ4+IP/BLw
KM@V6* $aChXVC@m!hBMMKX1yBhcM\/iX*\hiARp*CP5<<A&DKQ4*?KqtG?XcG<Nk?ltITMR%Akam+4DZBRiD4B
h?e\Tn KER&4wZkV@Gd6SAkwj9F>wqE&cHqjG5&e46Y\p^%V4tjhaGI>TFiiGINC9@bY?Pk<KHw!ZVpIkXPW?RX
e/:J@S JilDHuhY1\NnW!@1np$w1a+Jk^AaXAkBVNXie!H^CX/SEwE:?hH*RwbRMSc9a+aW%:Rbu9i6tiPNnm5K
@bS1V9 WP%p\=kANEP1Vp:?&!IIlHR@L9Emhc\n\:itHACl&b^^1Bci%MNimuWn!h/*E$Jwi#cbBqa6m6\ACR%M
\YNAjX B<FH^c!BL58>in&T%e8:^lbFNy:BCZyElQpQGKd8^DS*@@J/+/$Ki5<QyDK=IC#SRRR8DYAi>HK=N1SX
E%=heB 6jwY?RJj6S8t<PZF=NlL^SGXRRDVX>e^V=uwAV/dF>bEnKw9k6<PGZ$#$#\9M8pEWFWV1KNedZ+?Ra4\
*%Q?YN !QHBml&<NZ6=+h*hS:w\H:kMcMk<BXM#>Nb+6q9pSea4#kZVQSHIL!@uR*IFWtpeWHmMnydjVR&%=$YX
V4*Epw L!hjJ6b+qJ9Auwd^E/VjwNh#PA5NyeMR*j$+lLV=$k&e+mRI!1:^HG1/iDb+<t1dk?WFi:yLDHB+qt/p
c=!5lV p^>Pcn+ZSXbB8?XlZ4Tn#D5=#bIm^1lZ@GJA5li/T?MRAHbd=L+R9^149XXqqGC8\&mu6Z8=KMGA<lMi
Mw4TLu 9N6+5D%RWdWZkN?hPq4@!5kpQMHtDL?QV@wL>%ReY!kQP8W5!K^bZNN>BXVYSeiCL\5J4cdl+A>8!ViX
$AQma8 mp1kb4#TCaV:V&YI*FLY@Nk=a:y:laW5mi?nXNeW^b*::QbKyVA>/Tb!FmNbMb*NIcEGc\#yKA6L!1c=
knle:: Tt?EN=TV*TDc>la<8!/*de+jbcQ\<V=jB%PT#AXntHpnM6@j$GI%mhFmKCEK8L^P<hBT%TN81PI^d@X5
6/kNjk m6XeCk!p!=HbT$L@Te&l/QpRZ%@uyQb&HXCnyXXD\Z@ItPWS!RSKm9<1*>y\=#cM>&&>T1Qb&tS@cia1
kiX4Gp +<M$??w$dSH:B@a:WRRh%T@Y&Z$iVE\bmwuk9I*8*4qkn\+Ed8Ii18FH*Al%nl66Em1ljuRGbq/JdND*
4jlGhn Q*hq8>NjAQIwk!:VbEu5t$Xb:XkcjaN1WepMB?@GFnyWQG&^KWLXu1>M!^P=ida6RGTw6+IBVT8kK@Cq
%=VF%+ cHT?9Eb*V!w/G\aMYit/+:E<<N\CectNH1ZLbDid>l^paSP#B?SmNT<X=hEmN+j!i^%N4FjuAWD1Gp?I
km$yGt nlmCiK^XldKPLu1X#:+a<4?u<YSwHGhwZmbkGDYNq4&dR<>wDT1+VqaJA&d&Z^&p>jctl&:tJ8uF<+nd
\yG9\j kMqR4ECnRQMh\YdXCIL^9Mu1DpEjZ48FL1/=KYwLXj6ApDiAZDRp5ZYBN1a\=LW%RtS%NT9hBqGEFJMw
YMWeBn PHk*q?XbF=j!p9Hcb8PLi?PQZYIey%bjeBh%9t:Yw9i:Y*l$eMY!+Eqt\M4FV<wN=&PJQJ%$*S+dFJ6Z
u6%ncY =4&>bq@*:pKh<RePyTk5Z\*XZi@uZ%=AA>R&ai<ImEiQK4!Q4l9IPa<PW4!nZ@t59G>NMMqDhJ8X#hX@
lVkbA\ YQ=CCi4&Ye5nn*n@RJaTpjY#!>XQ6emiHD=K5@FjyLtb89>FZKYk?!^pQmBJ%hy$:CCPkXaqPacLcIA^
>uG5X6 *m46<HJkY<JZCWc*b\q=jDZ^pT9=V?85ihnlIWqwbXLbFnY\5=/wSyt/8Y&+HaMXq$yQ41SFGhMd#aGR
9HY=aE c!$V:>w9IIl5dd!DGk=M8HKQ11$G$jpc%:VG$t:EKYT#lJiKQbudqBE8*KH*hH%ZNY=+b=XSVac?X8?Y
eWWnRT 14HdkD8?HQcYd?^TGHuXHiSTu1tll/#BQYZG!?XXYCA?X\kyh>Y=:6K^%ABY5dX:^X#upk66Ec!m1$bc
ElPVaP t5W%aY\^ckPFMYEW>LeAEF?a^Rap!=Mq$9phtdtTVSjIw>tJA>/+Ldeh9*t=NmXAXc?5d@9d5<^=W:*4
1G@KRD $?WeSd=9J5:=/d9^/TpTqyBC@V&/^qMyYpkF8%BQSyZaZpGy$#!ay/iVdu<8j/Rciak@5J9VJP:Y!iYw
&AXLt/ QDNIHZ=@>yYBba<Xw%N&>e^\@=nHBH&?q56/@buL?HQEXW/%cw*\Iji<5++Yu*hC?4it&>dtVV6HINn4
=TRmE* aQ1w:CjQb/$@KXlY/$XXI&RVJqIZhHJjGK=5QtLbDk1bW@9p5iKX?%qt@tK%B4&au:%Y>/4a?#6*uhmj
P#KSEJ =NQTh?\P6a1AZQ&+4H*<b!$LKX/G1ML$ZyluP!ZKj&Y1YFWT&dt:ZJL#Tj4J%9!qeS4%X6nLii4Q/a:w
6/C@!/ 5=+L/9/DtDBhL9@F?#e@uD<##an51hh!<AJtdDaK\QjAaJC*EPAic/1IVi*Iup+R##y!^M?lSKaMBw@#
*e9p>L 4MRYDZ#qQmnNYtY!LjdHVV6t=<e>B=GS*CSJ!?$uIeLdjLBEqi?Qjic!G<P=^!>hL8nGR$R=jDH:F4Th
bae^j4 SnbZ^%w85\ILASC!AnPhbIIq8Bc^F\ttbTtH?cZ>FdMNSbYmY?VNLwZcEBF4&e4%95>4lhq$\45jiHK&
pdX1E8 &m^@I5%9%IuhShppF+!wDwjFk5n\:C6bjWA6?h$bJeW$M*dLWdKjnFdHTLppucMiPPRINA@/8Eq:edhD
M5>X5m PFXc*Abc=T^!9?SiJmd<R6Hcj=5wHlEq?Z#9*T9uS9lY1Y4*A&<dy%DCM%TqcyR=aM>!yLLbGnYAKN^T
FA>Idt V/qEbIP5kcdaITV!ycAF@TZ&aEC*P4Ch^F1n<=B5:^AuK=\bG4h4YM*b1NCqTqFlMMb1MR%\?YmYcDMm
EbHt:* eW??lpyajdiLCqF^Vwtcww!5W:eIG<NBkaX?bw^ZlA5*$GbQRamWIP+1aBG5DJHht$=^A^p9kcBdSGTL
N9:dYM %5X4#B4C\QcZ*Aq/AP14t5TdCj&q4a:9^umM6V9\hNRH4>pm\Y96SPVn66FP#5TFaR141VqEZ6kP%yL%
F6P=*u J>Vdc9^yZn$91DVTdZ1MXY&DZhbt4/9t*\nDlXT#X9VZB?^><%T>Y8*&:d4t=@Pe>8eE<N45uu\QG?<R
lIb+RZ 5MYuEhKtpJ\V8Wqd?hJh*pBaWISHe>+^#k64@@KCT*tq&jP5@cM<4q58$WT?G*:=ZZBX5<$X>$RR%&RC
q8B8FA 5Nne/m$9?CtD&jPCEbe<D1bElVF1/F6?4ia:d9TV&PeWi?hmwlitmX5%KL:q\iejlj!!+Nt\LjFD5E=5
5wP$le :14YRjjywAbjmS^IYJ<V+TWJYDJXpTp/4khTPP@b<Tt1e9MEeApKB%<ZpV:DZVWG+/Kpm/4YnX*Y<pm5
QA=t$l q#Pl5S?9<%<A+S&W>Z\l!W:Dq#/yHRQ14+w>@%p5CMZ/Y+PBQ+YFlPX@XNQ>%qjkQ+5S@XWA/B>9b4?P
\4Tb%c ?/eZ5^>:aV@ib<!h4j<^%m?&&Z6+i9*!H8n^C^\p4G4?&^<@%EyA\94&Xq=&Q!JBCAVmQ>:kQ<Tyjupd
phVqj8 ?u$D@jtQ@*V:IVMC?uHWQ?@<wRYG?YYW9+\5?1MtC@$4+Fe4j9pJ@/ECiFwLjkZ<59$+!P@dn@$aJIaX
W4RqC5 lQu^l9nL9KHStF>H@9H:n/1GH@9@dMtQ@@@aL@dLP?KQ@d>@F9V4L:@><<iPZ@@=C@nZD@++?C@@?:H>
bVY8\D iyBjS9:>=\<Lj9#?1*LXD+YLH/LQ9?+WFj9LVQ@+@ej&+*Q\*$d?MhmQ9*?hk^@kH/BjN<R@mt>?Qd>j
dd*TQN S9@>ID<?@K<Y@D+9wF>@?hPIMJE@#h/QV@>nB\4>&^>\$V?\@##Gd%d?/?V@C9*nGL?d?KPQ:S>j!!?V
KR++%1 e/I#@Nn?QFM@91@jQ@Q:ij!?:+i5PinZuV<?@B9k>+u+*ZQ?&Q>neqD@*H/j4F?h+X<*MiR@uPNZJ@uV
pNYeMW >1<Z^+?9BjT:b@#4>5P!E@j@h8Dj9/J@PMP@dGmE/K@P<eh*@N9&?=V@&WFA9*9G5aPI@Pa^Q?dp#>8j
Jakhqb J99H!mdua8q1bi>m!+wTSj?i$yA&>:V?hiWS^yp:tZ9b8:kKKutbP>qd@4aT!qy:Yu4a8*t=i9!CR1FP
nWVK%T mK9<lMQk?e6jK9bYQ>cn*=JK9+i>SZ>nC<BEjw9V\BAm@\kC\XC@6Z&Bmj/YqwHDj8MikPD@/Md^!!:$
hj=&bn d/%dVH+Nqu9@!F4><JDjw?6\$SNDT1J@c?d9WTaW<l>nw$V@eS#$d>clj$8EwXH@YNVS9=tQF98HQbnj
?Yi5nN <$TaE\#<e@Rje+J=a9?nyIEw:FnTRFVp6Kt=*<#@q*ki/uk$E@t9&dWj%<=J$e#nKtZH5V<WVp:E\9<i
kkM#!8 m@=J\iB^PdEV5CeLl/BR!FNkEV@Bw9+im@yJjB/FQkWY>lM5=8?^!J?NK@4*&B<NYW:Emy$Ci:KpK\y>
Rn*ja9 C4?C@/TaGu$K9@1lBZam>lS?BV?=V\5KjR1@kwu>=H^Q+Xe@/Y8BRy@C4&A@!TmkV?FZQ*w4uInF@Bja
1wSD&E $@kX/mjui^1@PquTDIW=lX@>SBpSlaH>F>lV?NXQW&Ta$!^a/JPhEuMc^$Ke:B\a%GqP?PRFGuMK^@1J
-A5djb 0004821dc2d001202b4 Page 41 of binaries2.zip
1A#+qw bmMKk#uNIu8!e&BP+XnIp+XJWZ>qCiL?RQ/:cw@ju^/E%Z?=<+5e9%Z@tV*+S!LyB#@9@>y!D:N8R9#:
6XleaG qV$@1n^w1lS4LVAR^lAPtFT\Fw!JnPK/eYNtQ/>RCmp8WDCNn1l8WW4@d8N1E8dBNBH%^<j?hC:Xe:&#
$GwXb> 5*V%%Fidbwlawn4u$YJJFMAQ+@pphQ*=VmG%Cj/hn4FhbtSlj9/b?!tM$RBkS8HMVAwnCQk!P#Vy8eKH
/Ih5lk G$?cZN&C$G<SWk:%ENB&mdTabB5Y!%ZVbtj#u5Ie:<GZEIJ:8CqSFi*IBmA9dR1+1YSeqCt*4hI6y4tW
+NmpQV KVW@yN<*P@mC8b5bw*m$D^%DqiP>:wMImpJ*A5S4:C+XPIbnmmBWBNhDWN$Yn<PA+^&^a\Bl*Qy*?BBJ
w^=BY: BmS$CFpMWT!6td#\8BJKSX>DcIBq:YuD4w4F:LBW9?@4wGluiC#D5$bi=?#nEC>C>iXdSmh9w^MnL%8@
TyFKE+ hG5*iMEcIn@YEZtA4^wiKq=h9d+14yT+Qn?P:ImZ89k$<ZCK/EIdhwjweXJupeSILP%VWQapIXtL*tB#
TNGtpn le!FLDhdmQl\B%YSAu/kLJ@<yJitMy\>h+BLQl:*ClG1?cG*9\b$RYDRMPH#q\<llEFKLyLWH%+=6w&4
@8#j&@ \dTGXbe::CbVa=/M#qM5D\<VEjy$n15$*BADnqH/hZHZJmyK8S8b!:%lBhVHnA/ciK58M!JwH5$F^M#!
8NnDRm I&/by+c9cL\8:eduX^S>dPK:EF&dTC>J5:QGb!Y/JSc>wp$WqLDKpN9GDtKa1l$QyypQEndHHIX+DM=n
*!L98P y<i9$EYXb@K>n4hkidTaGh+FlE&^:<yT9?CD1KX+9TLa9B\E$*85ZcqhQTKFF^cnVitN1i9n8CZqNEZS
G#VcCt YiZtjHD9wudN8\EMRBIEKp?5:jD9cFphhhN<NDCZy5Y!*>A>Xj*GtcRS\u@DTJyFbZFB1\W1ep*KDil+
Eh^X$* 9\AhVM61hH:@ukLjlGLR4i6>:>LhC8qkt9jctB?q\8h5LH%b:ucCkt^nl%Z9TV^N%*!NHV/T$p1ce1!=
4D#\:> I#>A=Ka6?!L@^ucN/Fu:jl6tS9=y!awFiXP/lJe>yq#BnH%m*@luDJ6T/Vd6d=<l/XAne#J#:B#tJq!\
:/MRQJ bdk*dPbeFH1*b@8DZ4kAEV:$mDHWnpJL$SI\pqLIQy$@heYw#cGEp=FGQ@T/6IPH59QnBMHkB<%W/#!k
=5*jyc mA&Pm$j=S9nK1/HqVVyq8YDdEc%e*b+Qp\W#X/jBAqCa&W9c8n$d5FTNI!LMn+P#==%<nIl%KKqa>dq<
?Rl&5C dMP>na!L5b1IJlpFipLLS8R?JFnY5@!#*8WXM9PR/Cdb!DtnV&T8?cHI+nZ/i/wHC>a^wD9%:^#^Aw1m
QFI@eP ATAek>kCVm@SKead9QFT@5nn#YC+dyDNbcE5G&Lk&AiyIQhKAH$\$wl1MRnHPj1G*>JP9m&LS+lQENJ>
BkbuX> yGiieGNd*kF:WLwc!mnDjNEnip!w!18bwaQm=pZqGP?<1e+XBtpV:a46AaT>wmFhS1FiMhWKhRlJiRIX
w>DR!^ EynZh1Y\?+FHVJL^ueS%^p8$@cMb6HVP6p$#\4JWe+dGDLi*Am4VIi<T6ie$FKt5>hIbCiLG?h<C8C^8
Gn&Ycm b^cVk?I%$^XYjWbDy*69yEX=QQDeHl&DBtBV/Cm#lG<FmMZnZ1@FeIhMTw#%?G9b!iSSk4c6P!@kyFV$
bYt$l6 6Wk#8b9Wih@NTc>tbit+GL@H:c$yBIFEXTH>/a!>tA6&C#^p1#iF$1??=cVp9?kP$hVX6Wy?\eNM=A/J
tnCVAN Db5e^iY#=Jtc4@PI/^b&&1+hTCpt9aCGM5$wF4/AK/LTp+S4d=%V@R\EbaZ/=cd*&\+8Vh\iYK&>%CD!
9+qwtF &y=V4y\$5EI+@cMXS>P8dSFKGFPe9:Z?eSi5?dbDqCqHb:GD!@hhi9@e$Y*>p5Py<HA#kQ^caNYmXyJE
qX45j> eXuy*WpRSZd%qmGe/K%\#STVcq%FRnh:J%Ibu##Spp1SL=5I5Y4KYB/6:#FW?9amTbB>%1I/SaQt*yS*
:6bTYT c=y1%=#%??\%VkY1ER*9q^eQ#/%t#u/pT#td4$$KFTWt4:/:5$Q11qCqbtm6=QY\uBlA=eI<hTEFJaXu
@E$#=d depn9jwmj58j68!=4$Ldy?1>\=C!DQuEE94uDHuucXYn=JXI?NwiEp=?N=cq9Lw8d6Fl!ERmRQnNGtLn
u>*6nN IB^M/GBi/PEj9hQWPuQW#pRW&*PwVFmbKZYYWn4>NwQEiGXL/I/H<+^q%NW%S9>Fc?N<maA>E&m6a*^J
k!8VR1 %SA1aZCJdatEyZFD?!WSw^@>KwTY<PA5:CL=YD4@$R9Yq:GGTZEdt4wSA6j8j^IX@yBh$=HTRZhHn6db
PVdQ=l TYimKDiCI%=k\E/j>%c?QMHtLFmpWC&WwNY/qYHK+Z95cyn!++?yGSTVB<dk^9eK:\lLLq9H?RP9ypQZ
#?Y!u! \APqAit*I9C%q#<b?kchK<6EhX5ZhRe=5qh/kZeT#\hP9JC$MTbwiCTI+YbBFV5j:M:yC<8wq>HpFHli
KYYuAm Kb*!8bAkpLuIK/hbMyWGt<F1tuGQL%4W\XeD!Tq6$SDnb1>Q#Y8=BbG#k#Mpw*eNtR/V?Mu9HZEAjKlp
t+i\Vk Q@bYp5p<=a&=ARmML&SKTZAW:S+!Wy9!AE*NMW56>NE@+A#<:C+WNlaqjlQ^#q!!IwmwYy@49jDu&$^Z
&?V%X4 CSdI#Ki@9VyWVK1pw=/kipRlK6eY>941tjY9w1MllQ9*XbPE\YjS&&X?HYR%k9t9^k^9N^Rq#RtmNl5n
ECSEtk T+yCYWnhcHdiAjCnMm@eG!F9GnF?15hdjZl9=mY?$t=wuA><piEby!pbTmI@=9^eM%GRDaPLpbIZYlcc
pKWq>8 <bGVa^ZatdF^XqFtEN4K5^w#jWdpS6>X=$X%1\FD%LZ*n+j>lB!jtKVp#A*$iL4yui6IBwXDZAuyjR@I
*QMyDK Bn/\j##$TtV/ZHm>:+N/myk18<$hQJ8h4$GL4+X9*=BWERn>!6*DuYw/t4Yb8aEJCSXTwE4QjJ$cNIT4
Y@&Nkk 9*:+TH!5e&e5/T*G\ayNbyQ#jnayVaXPCd1liDA9E6^I+qKN6%yXhnT&Nb=n6q#Dq?*mim/uZ?L>wEWl
LKJK+9 &YSI@#Z<VZTZ&Z^%&diGawu5XelCpQlC%*1F<!eKjk9RFyQ!#6=SyEh$%K&>Aah>E8WIV1dk\nVHD9dw
D:ZLtW :VT5\nt%9E/q%p%\uE5Wbiw\MXly$A$b:tWtqL5FpAe6DMa8h\<Tm88TFdhFq5>adq:5HT>ndRi:p6tY
^i<eb$ RhQ#>LaI%Y&X%elceh@ZMn\mCi+/5pddpCl5XbHnAt8JlT:K1%:5dddtC1DEVTMK/%>8:XFkB!n=CqXG
Bhj5yh $/4J<atZyMGXhnFhpeG8>Mw!Ip*W/I6Emajphu:DB9JthlIcp5Tp*e<Z5eCPRl@@^98bDyJXPCYPQY/P
>eQCyy >VD&VCt=Vt=85#BYY*\Ln=p^N+WXGB$w+W\@XSm4$!#w1mWMq>u4paELJMc#chKAB&Y/AYW!9?aM$C$?
+HPWy# yNj$yM<qbkGC#qm$*Ha9a5C#b>DWbEl\b>k9awS1MIc$/q1yb&qiQ$6>/<d?/5X>VT41dKY^DH+Fp8Rw
>d:ci% y?A1uc<:nM!6Dky>FkDky\Y%Mp4:LJLej8S!wm:ly&1<lSk?4m^8uphEA^^cQL:=eATJ&SXTCujCVTS4
^Q9$ZH <hnwQGKNy=L\Pblp8n+SjKH!11PXqZ#mGZwcqw9!:Sj:Bb+/NqhdXbCF8jW6dMh#<%m5<eTXPVnd<q!^
BnYWSk X8GVdVEcFS@4>%8R#RC4:bPGwc@l=V4d6CKYuyMY6H1y>ReZVj5In5QlnG!hmhK&b@H=Yq=&dqi8Wjuc
*V&t8C H%p94AGYZ=B$wJXc=@6Yy^ZYlSup@ZYhZRyB&%uFS$y<H@E</jQpA@AuAMJp@qj+MAVP$+XWLA@!E^<T
A9!?#V 6>FWP5E5Jt>8iI%S?RBwX4**l%$4FP%5+Fj!+D4hyBlTpuSLyNqkypyFC6/ES^d<Ewb%<?FKT#XS\yq<
Xul+iR l*aBjA=?4uS4ZKEK1^ZABPTA6LNY*PW8yHlDFpwwjVGTAdF<!%kq6yCICiF@ECYnYKlWkN=Dl9Lw8BHq
hEEFwC W%TW1lRBQ$+WXn8wW9B@wmkmFJh*qEm/&8Fbtl^aLwt%EcGekmTwZ59ydPDw>QEjB$%R%RJN4<5nKZaA
W&u^wT El/DVYSbIQ5:At:??cEMD=XyHnqm4\9XRY%Eqam4pdFQ4lH6Nl$?TPmt16Y^cCw$q!<iX<&Wpkq%qBqM
%GM:Qw dqkaD:Z1D=hNEw!FJP@Ke/#Rm?upRtYEPDaG#m^@A+KNHTpl>/P<HLh\S+qQa4n/Kj!^Nh5B1t@I%bTL
D+NSN4 FVuj9baJ9!j:BWy>C!4HTbjR8Ky6AGehE?%lTmheABD*l4JipYnX^P%Yk6<!6CXBh5cap8\GG@bp6a<i
NQkKtM LE5@9=T<#hH8j?l8IIq<=^n9lm<DBbHbIHeqq+Ya:9Zy<caaLPcKa^VYlam<^L5+mh&NQWPm9SRW9bbE
^YDFY4 9Z1$:Q9W6AtwqjNeDTdL>h5^#Bywk/XTPG8p>mcZduYPkW!aRjItMhG?B8upaWj@b5iCW5eY5!!@\HD+
=@nC?D $:=h1!k5CWCK^K1batEl!iyYZ1X/iy%AjbDl!c*dWcK\@:@uCu@\&8H@k%!lKQ\@#^Wm@ndc4&Q9dP$y
&kLi+^ 1PZ1dP:!L<Ml@miScQV9ajy@S1LSI4BVS1J@j<*?q=j*+:I%9$jp@^^NQnu/hq!&=nn&b%H5+:I%^:E@
YR\hMY pTXCHbi6PRGL?kqY>BVau%VXH=i6Pa=Fuh!hGZXe68aELQ\uYNnja*@TSAy%9B9%ChmjSA!Q/<CekQ%J
yE>$wm =E:5FH:%5&mn&Cu<Cw:=CjaWj9ZVmKHacS#4=FdHKLFVPBd1J/F*5hM+%5pZIj19Gmm+Q=D@L91G?cet
W%K8eI P@w*FdG@HlN&kma:<qeBw9?L!inlC&a<E5bqNpu1@H\tjDSbSJjn?Wk^^aHbB%q+5//<<a1=mZdQ!\*J
y+89dV :4PaW*EwBkw!^Nk4ECy?CXXRnau!Hk%5>H>lGnMb$5FYTk<t/@F+L*QY#N<B8RKC\98<YHNElwj+*ZkH
?l!^yD &TM8FZ%eqwpR!uWTjRAmS6QpaiuPLa?K?e$ZTFa?nI^el%SH+m6c>bT*lV5$Ww\m#wqEt!9cMFR=hTAB
RBeuIL ZAHFLki%my@cm*JA<$Dt=yliJ/aeK5L6wpJB5pwG4qG!5nMqF6p>?CHpA&t%^PBGHH5I9<F<t?AT&T+E
D^5*8A ^GEt^REw!X!wFV!+ER\BBct!%@bYm/=DR6tT+#GXYu59PH8Z*LS/19m*#qFlB\!&&+Dd^9tQmMt6PwTH
*<Y^>? D^pcIaJWS9^pWqqP>FR1H85+yBDPeLE6BJ<w6/F<RHXJSBC?%!ZbH^Xh\DcelViBEK+$j1W$9GV%Tpqh
<iRXD9 ^jibDBFl<Web:TXSLI<I9@I$D^Fl!&8wTwB5k@Lw+WXtL1Ep=DTpjTnNtAuaq6=iY$DA*qLcZWqVZ6Gt
Kc+qR6 R6Qd1Pmwi1=@tMNMY*S5M6!TVJZCVlNbJwZhIuqS>?pq9Ww!M^SCMcP/=TphkNjjP$6IEZa%>k^pEj+!
4!8:Ql $bu=8kG@V*>EyawS8VCMLi1<5laFlJeD1L@#J9D=Ndhl?8j+5wMNWRF1<aQ=Fwn8DG/enpRYn%m!:Fnu
c56Wi* INPV>$Y:<ubjt<dTu#ACN%j!Gi!1/8wF^yPm!PmHphGQ$S#/Zcnm/FLXLbXNjFqY%ETd<wd?YN*$w=L?
=iC6mh i%Tc@C@IbbheBkbmpmlISmh/:<8KjAyy/ZVu\$Dp^LdiyF>19qmTBeT9&YA8#Z+EpDPRAm#WLVHCZ%^S
TCN1Kj yq6iTu4SARdXDuQ$4/CmY%cwBWK!Hkw$:EVjPt?wECDuJuwqRIE@584>DcKi$b4mD\%>jm8#V:huL6D*
-AwEV! 000660341a6001202b4 Page 42 of binaries2.zip
+S+kM: HH==/D#+4LH/hb>KY8KK5K=uPYQ@k1QB\H\\welA/WC$V^iJL^6&bt#&Xlt#dAnh%H#n:Pj$\NwtJ^ap
Ad#j9Y u/HG+<1ad1^8PRZ=?L\ClY=RNhZ1\\EDY=X\VS^j=/ATlcE:iMH@\lu/:ID+:BL>1D19Jn5&aIAH$MFF
Rd#FmC qL:ARKB!*Ne>lHP!>tK?hLDBN4PkQWNhtKI/!Xuc:1B<TDM9#ZeC%5Qm$MHkS#IM/m#ne+M*4a@/ulme
t@H6PL &$!!W4&1ER#l%?EJMQYIDa?9Y?uMHb?+y!MmHVAcAYS+$Q#MI!bM5I=My9e!ldcqJ=q@pZ*buW@jb:eJ
ulcQ:P BLLGbHuMZyy4q=JhH*54LC@:nGdk!EVRDe$DjRjQ#NY^C!=ylBRatL%lmZeNPKCZ8WQ#mwPqM!IT#lp4
*?Jc>> XpP$tXdTKqWXIN=QKqTS>Lp+TeqhYG!=eVM9Pp9RJeKIIF!GlRBBDZMTI&YVHb?iI=Q*%uy<&JY!&=kb
JicwG$ *HT*9GtkZ?\cHT%SlQ&PHu9cATedF:N>II%w9bw>#=6eCZh4j#/^Sy9w:=GhX>%n#Zp4m1kMZ*V$AMn8
Qa*T?A L%$m^l:M+N\!i4t+C5+ah1kEQa<iN9WdN86u8KLNieQJDpI\+*5\umcwZ>\$YQu?Nyc&$Ma<nm/tLh#A
KBmkVT EJj:#ReJN!ek8*TyEQw=P#yqBYl+mRTu<^+AFt*tCS\*u!N@tKiViQMmwGWtT1daM>c>j?#/bMmc+!h?
@:t>/8 um=HD5YnSEJQJ<FNVSq8LC=u9e5p5a+6lQ<6Sj+Dkp:qCF:>9NYHBGccN>Mm+jWnetaXDw5YB5yq\mLy
HtW>BZ H8Y/L?!emuik8Zt:nB&1Z@!L%Fu$W%:wF<Ajq6I>iaRT*#I4*p<S48+*XMIcGt/X!V9Wm&L$6cq6/Pdq
AHM%pI C%B*laH*FP<!/Gbbi$8L/:JcnD8W!MknBm@ewSNQ6&FFiPQ$1wcI#1Ah9q4iKC65d%ua<MVJ55Me9PPt
ejHb@? STQ9BN&kW&?R149D/YepqiAcLDm+#%b9Ady<X>8tK!RD<==GR$*y4Y$Q#!1TeYF$y$QBHnHIDeT6#/X\
JeiRZL tDlw*C&t*\6ptdyyXGwiP<SN%REKn@eCT\Z*q^yMBBuZB6R:%V%CEAn/Gn%D%P><iJ9Wc9Ph&mlad5D<
aKDyJq <:N+M>D=q5M$aVESE\k+^*4\*lYKMKd8\*MN=lqKEbW!==b!i<j\ba#4D?T^@M6#NEEbFRYn$l4!wTXJ
tX6H\y N5GN1d5G6e%FSFYLPnY+TZ9S%Iu#Rl/R%:nE5+1bVewX9LLu/yye#%1@bibdD9jw?@nw4E#!NG*mMpD\
Y9&Pi< @Viu%Jd=n>u=N\D+kA59!dHMK*=Nh=W@</&9#dCWqi=LlJPiiXXZ9$P#atTT$8Snl>yIjBtp1^T8/Z=G
P6ppMC #VBHi^/w#mZKAM>+aLlLJSye!DlF/Ful5&c!+4I/GQ<!Y?cGEnWHKm*:+<PT#hi8LZnF5i^+8t/=&#I<
dY1W^= q1DZhc8QM=<#umhwJYI&XS4h/:NJFuFlF*WcPSeajMhwI^h/LjQ>R=u6:&$QBI%<CjF/H<9I8i#y9Qy5
:i//Yp I>q*XN1D5t^L+WPy%IZe5GD%i^kXij6&Cb>\G?cD!<LSZW+k=+Si^&ZuqynyR@Mn&ZAaDSRbey:Y1Riw
G:HZN& 5&<kau#+?Q5#*@LakGKJ!<t:&1YR4SDhA%Aje%c9XWmuIe/I#5Ge?5kLd=C^tbA!!*+tV#8#RAH&yGRk
Zk>=T@ Qa8X^%4hlJCEqVVmSc^P*4WyGSL9!c&EG#tbNkE+R%LB4+RX$:K<SXI!&V:pL=*TQnA%ec^atu?NMjMm
1K<5N= GmJ6MEi8*1AAEHLknQ81yG+D=K>>lL1RueuWASq+Jn+6cd>Bhmcy9leju!Q^!EBKI>*/mVDqyVI@WQmb
\t>$G? ^N8TK81CkhLnCc%1MY!e5!F!Nm4pK/@Xu<iB5#18S+\ybN$Y@6w=9IeDV>kY*&+hbKR^e>#GJ#!!#F#=
E#IQaL @BqX6eF$+e8DY@9mIclk181Z@5P5G$K<5@l5dhZE$N86#EE*=*S5a#@N\>ci$=5TtcntD!lKiuAK/aRK
H:H@>p ^c<N*<u9\LPc*8cNDdLX/ai!bC#P?t@Zn=dZS?K>HAGRbFAWE=G&9mCB^!?5k#cc*\nTtG/@VAdVb@V%
DCE$LV EXJWD^NHy&^@KXAV/M6eIX4@X84pnd@6WXP/ZdSIXT!e>q*lG*CN*5m5&$GY@p=al4Le+p&m%kC?^NG8
$*BM!* +Cp:uVSqQ@ZKDIQ%ZMW?XY>iZGEjnXc$!:PR*Z5PS+tPTGuHb1tX1!y&/h=e</>GP>Zd9**kLd!VY*=Q
/k/#Q\ hli5K1K@:Wyi=Je^+qPcG%mkKmKa@S$kL/%DH1!bZ!=wk:i:<wdGb6!^QLdKiq/H8QRtRSE6XYYmB55l
caeLa$ +E8cuH1EJw^&eHi6eqCKK9l?DJ^@5Za%5NJh8b\C&%>Fje=nuWpwp58pYDLQ+tXY%c%eeL%RJDJCu8Fl
6T1T/K V*K@p<C8ucqjdy1*k1Stc:>HQ6b5qWdIH$8B*T#1D:jKb@Dchn?V@jIKN@^1RdXnN+NXAb>u>A\iIhE&
Z^<kDQ tcy=!JiHpX4a#nMM!/qE^JIQ^9a<eyp5l$V5*4l$6W<Y4*!4!X#I69dHqjdH5GJNwtJnwINTb8ySmhAC
wIdu*= :A\Hu$mkc9$5phC6pLVLI>YjTp&jCLi5c4RYc/S@4%BX5FQ8^5N6BEj1:N/KDPYL^E9%YI/G4XC%6/>Q
c#yDRB 4wn9nH!V<kmF&YYT&Qb4SiC!A=ek?a*h!#StC?%?/&ViY8Z1Qhye44lqX\PbRCVHp9yH?VnP^Z+!1*I6
T8ipHy $Kk*6qPHIn:dNj\\Y@tC%9A:^T%BnRhj<=m??PP?hJ#:T5L/XTH/c<kpD?WC^uI&jqGJ9t^YpF&LI@9L
qt?M9D b+:C#/:N<+t$ku#qC$15BaMcRKWYIeZMQqXInc$#Q18Nee\a$lNZV?FKSJdEyB\dRc8ak&jNH=pEwGk8
4!aMmB \KEXI:&icd6ELT@*8RbGE1X%::M^XQNTqlJmiDqyR@1R@S1R@QK&unF<kWJ>5^ZSjWMX&tL%5uwl>hqI
ewYZ?m DaJlSHpBhkPXmZPl#eN$EVkWDWq5jNJ*6!RJ?waqZXWENyen>DESQYDEuJnRX:V>AFGNK&F%u8VEiEBS
41W8l% DH9<wLj&+l8:=PC+\4WId1wXpI^5T#Dj<p&:FP+%LjXCP\N84WZX^VEhd1S&B@>EJnnE\$G:C:%CLqyn
GKim6h eM%Y=E4NuFV*GTSy8C/I:5LELCW%$aB!*EXEm#qZjycZlnn!lyT%y4!P5!#SX\Zc^=L:N161cHi\M=h/
A^Edhp 8^dMH>69XTDpD:b6%W$R&m#*%%>QF\4lihWqD5ddyFCQW\&hdKEJ4pS&d8c*d%DANZPA^K^PM^E*&bMp
j=9!uV +l%/XA8dtBhik6cGjaBDc4&Ni\8cHBdn!TI6CV!J/SEP!58dtkD^N<wmFp1D&?Z%Z6#C&q/1jc+WyZcR
MuPye! N^/WZKD<ibmnTti5a/KRAVpQLn@jhGG$1584PV^Zt9Ph96qBKb%QKdTFatZwAlBTmnhKmj\5V9clAN6d
9>ee\Q G$Xpt6Bm86>cF?%8NIw6W=E=w!#8!Sq#WWY<aE#Hp%PmNui*FG@meuF<uhX8ZieBEVpLnuNHat4eRAYk
k&kIe* R4J=P</BH*FpbLadX&TXVtK<E$EDK1pi=YEZKl!iZ5DFc:=Lu1l*EDl@Q6#1/nR*=pnIq<RmdBVu$/59
AcNJeh SbJm$c<ic1h9V5<iZmp9ucnI%%EEZZuIKj%FMm=Xdm>cd1u*ka8dR6\mkPa?@!HYY%Mi4IpiylcnL5!V
JwymHQ XamB8E*&iQ1C1lVwpyMnRd%dR5Mh%QIbuiRZTWQ5FehhTG#$4%bJwe89Rmekthn*!4Eh6Dwlw=A9Zbyp
<BT?:% >B8$BbcW>Rin4Rab\<@%ZTi>NYFWM8jA?%jEe<>epJ%^Gd^DT@?ly9<SFjeaqd<*Qh4le6=D?N1&IXie
=%D4hI ut8cjNE1Gh%!FY?mm8!dK?<m8%jGXZ4TBh?d%9VSK$@+q?ptc4^N>ymC\/&/!@Vc%K%FqI64NR5XR#GG
+HTkJi 8h8y/aDymp=/Bc!h+4:F95\qkWAaQQVwTQaK\ntH#eQcme>D1Je58Vi+A/<:hCHlZN$cW?>+P6Et5bi:
::IhN\ 4=Dmj6Rw5jAXRSy#aj<p>\ukX$YL4%GFL6a!A1%84By%uk&XSyB/BV\#RSRJ$JIw8+BGWJeE&PwepGL^
DicNWi Hibph@YYpi6*:X*jP\JDLH5MBtda+TqtRN:8c&i?qH&<Aj6iFceSkk%\M6$?adSZj^uJWIlI8nY#cw>R
Se>Q&I !pc>yaDLEJXD*1kn8w?t9>R@w=kiN*w8!mDaap<=biEXpHZXNH#l&=dD^%Tmk$T4GmXD^d%QWm/^n%^<
ee8C#> %bDF*mLVRyGLQ8N<MQq!KViwD95YKQe^GSG>mqiM9MYukPDaD=!jKd4\<9IHQ!njQDeBjSD?P4=G\<1#
C/PLpw n5nu$!E^8?p:T4Lm?FFLB5*/b%1ZPYKl&>9hhFyhW%S!u^PT*KV>X^I?RmNX#E#p5EJ*$bXiq?KQ<G$8
W<^<uR e\j8&*5SXAI4ZL&8?TeTFbhunqd1#c6bT!bd$RPl5eTet\DGNHN%D*Qh&kTG=b1T5+b&\VYNL>Z$QTy%
/4#CND m$FVApIy4TC!!Twbi5&:CSedHP>Y4=CYQL=C>PcKQL*/CnYq4V@wn4M*6NHJ/w$^&TRM?4\PPtARw5*j
eVB\\H BW1@Q1F@^qwBhTQYj<K\ceK\41Y!H1>?&yh@&/^+6<M!dh+nk6L<eAY9\Ft#6@DP!1j*ahFD$D8S<=Ii
hETkGh wwWG16/l\MjEK/BkRemk@GJ/Ja\\ikJQaMw!qYX<*6yKIZ:A1ZneVTNtq$WZh+jA*nNpJjmPRGSNtYBw
>q<&9Z 99TaWt6QIhhG+QyY>p5!Z:+HtNw+1pTFM%VV$y6*K#tKi/5Xl/EFQB/ShI**mKBS8W6q!q:k>Tm<!:B:
HcQmpc <FXu^ZNTX&*\bWSQn1in@/wj?*?Ti+MY?b<F8Q<yijSHkQ5QGaP@DZD@W\@@L=aeC$V?Zt4?=$A#@PVa
/FIkCe G8wWYA#mbC#/FFka=tR5=8?^Q>FqS+8I@n*&S+9PE:Fmj+>FuK!WnacJuAJ:5k+>?4lT/kuap$6m$VD+
V%9K<Z *&N@F9BFH>e$@W@A@>IN<*jw9+t<@qH4?CQ!mn4PwED@XbbW^>:L!b1XB?hldYN8ce*:m+ZYuq=@K>j!
$$Xb8V ^^Wtm9=hq@TZI%#>wjn<l*#Hn:WAk@p>h@R4+?$Zd@\>k@YD<@c4:Mj9F?MQikZ/Z!^Fu&Cyw85%Xm>Z
t:iW?a X56j4q=#T!>YhY89c/+in1^Tuy/8q9c@LB8ij#1H++THQ$uK@*+P@=mRQ$#?y$&@t+#=1<pmj#Eb?T<t
#@al*< a$+\Yedd$<9X&h1D%hQc+/4>Z&d=*%aL@>NC>F<5@F*e:T<Dm=+\5I/%yb&L9cY=E/8u6=8d1+jZ9^5b
^FP*P: >ce$&9GSj@%/@#pZ9^pmhwIlameae9tZ%bjX^64c!5Le$yHX*yQ%t4YV=T>V<mh:@t$Y=Kj&mQ:%1#6i
#<ji5@ =w9?1$Vhd@ae>^yYL\>#i^h:F>6@b>Kjp!5@NitEPjt4$6%9Ntlb@#ID#4><^N1KXe9c@EiK%@QjDa:<
iiQ<jL E&ut8P@?Nnn/lMHlJ&ScaHDp@/6#QuYh<!V8cu>$KEhA1w4TL5iZt%&Wnbuawei1w+bqIaR*?EbnNhd@
/CNi/Y XPj<FjDQPtel=R%\yuq#?d*R68KFnBd%/5T<wm!QB+Xb+Fund8AdQDyGtA6@L\DP49l<yJane+CwI\5:
QeWk\8 *^<GRpm!lBB!<DFj6CSbH?pHZSD+V1HqS</1+pCCR@Yba>jI/<!$S6>$&FXnY<WW&#&yP8$XdcKBT4VF
bk>etc 8TKq$4t:F<b1G45FE=/^C\GX@iKbJLMllSC\VKE&6Na<cZKmH^?9RQG^nI#py=:6GnHqm$=jJTH>XGyR
-APe6N 000262ee5b4001202b4 Page 43 of binaries2.zip
9HEntG CCD8k>ZwcEC<Di8pFQc%qy=8=y#B+\mBFB/qN1epZTR:T+I<ACX/MQJaN!NVHLS$MeFCb@6R#BwAta!!
c19*I@ 4B+m<daIFZ+dPjw$88cF>pWb9\Lh%l\YpJji&>FXi1P+6?atJ1W4>=$G45uT$D?iGlD#4EXPZiR\1NB>
RyGB?k bacw?lLF#cF*1A$9jy*y^FlJWY9MECd$wbAhyyH5#ALWLPp?cB?*A9FwDkG!iCmeJTKyTN\RE%\4I+XT
:CmDGI ^u%y84e?#KL=^Z\RKZd&eFGyKLMqQuM*B&bYbS6$q>*Epe$GVqmImlM:c#h&jn!:eeLwmSdP+m$qG=+1
b&k#i/ yC>NXtBATZ\\1%#XED4IwWb8<V!8YT4napH*+c1eFAD@Gh<kEaGm%1D#%S*IkGT&6/X#TA84PZ:w^#$e
+JyI6T \*:EmADV\aWpAYbik&^AqKSB@%!5?Kh:lV%9t6PuEuwC5EWB9G?Mi:w9hYm+*tq:yLdL1M\$5EX+nebV
=wlC<H ?u6Ik&#NLTY69YFp#PRd^*YK%$RF#=ZuLJX+HC%XFEb1Tn?@MQww5CC%<9kqNP1%!y5a@4jcAT1VXFej
DqQPA4 11El+B%8$kh?Rt>dD6SIuG:lbjFY9@@\tay/>#y==ql8!n6:tj+cqXG/%?p!t+\L%>MRI=>IETKne$d^
BT5ywt PkA%dE!Ik5HDkZ8XeLaZ*8ZI%4EpKmGD$4pP1Dd!bh^BV!nIC5K#P6:\16ZeZPZLTNuKcA&>AJpKL*Vm
Lk6&NM dkl:k@tCe$RX\&kuy\WJ?>$%ue*BRVtWcwNM>l/8+KQuk%YmBN&?LFYZ1Z6=uh$NBqk9\@/a4?ZlnYSu
/T&M\: uHT6!<@^aSWNd?he*9ZQ9!4e1tnXMSbFdiGp\<mB$9P=L<McIwT9F/RLd6DQ\FeJhTCYR#N<Y<DnIbX*
6cNabQ ?6VBuZk:$D+ZCXNu!<$SPbihEcBL*Qu>jHj*B#WK!VlTD$DN^CwbJ\IN:4+8HlkmQ6D8+^yj%VIt#LAc
DCJ\k8 aEtB8L&XdRG>G*9V/8M*4c%$cC5YT=hh9S6iqTJaNteEtRpPS!$$SeCp@ZXj<DN=p^=Atn9h@PbL1uR#
k66w1Y B/GTZDV9^l&1XLmCMiX%#YpWNeGk%&qW\1lEq9MejQy<1pPnhN:CW6L6%mw:$FJQphJFDuPj1HqJ#b/P
DXc9VW 5+Yq65wR*<5D:+K@yHp\8DnLIhMQjdJWe9\$%8l9eL@:hq&QSyXM+c&=EK?Du$aSQ>l<1E$>h>l\Zpye
8aHkM% *Ma$a\SyM&pPl:qPLQe&Gu^aqJKJWm\ZM^EnlqcpM=WDmKY8EPK5XkL8JX\/LF48HZWDTcYn9KI641PA
1=F=&^ KA$4D*GJLN^Id61\:bqD>%6ZPYFQSbi@VlFP/=CbP/VLmLdHqWXWS!tdnF*:pK4cDnT8Inn#FQMSZMc+
@clDu# 1hu@Sc#MN5^li!ND9@m44aw*>wecM$Li*J?@nmG9NC<5dX4K$CAF&<TF:/Tm%@#KPI4>8+C%TAN4kP<R
/9k!Gd uyV$$wyuQm/!nEQ<%4cLSTaF&@\pkd@SiRbLH5$>twNA9QupdEB:VQHtwL#KZc<4>#P^YW@GB>AhBCQi
n\A%eN u?4y*?Q^$ZpHWPYNtVDRj=4uD$%\j9^c4:<LJ><+TTIaEwNw&N!ea:/cP1Ld&%4@:4XR+=T1RQm%ywAY
JjK@Ew KmQW\j=4Ck:9#La+/hJ#i#6hqW<ct=e1nin\&REbQa/kLZNP@l9d9uL^S*%S/uMM$j$HX+6u^!+aEDL+
<Hq8H4 =GcHJQb@aNVlhK5!HWWkAnJHYGXyE4Y8t1VdBLPZ/6!q!G6P%dR@!*Y8J!Ci9*@Kn9Le#eIGmtbCD?$S
HwbF4a kTa8%w\8YC&ZV#J=qnqCaymM@1KDuyPquL1lptG6H:M!p^wZd+Fn:8YQ>*Rn/dI1u>ZiXbFD8uT!jmSa
KYK#8G 5LGih!!AGa#FFS^6L>AFQ5upMuk4$mF>k+HB</c<GedW1+X8^D+j:CYuWSc>&GlEFm9XtkuVnEVbdZy/
:JP#Z8 FbP+4YA/*Tna?E9h8L@\AZM6:!kBjC1$&=<+et6h5!&9CT:H:+AtC@ktc#Y:h%>&KY8/yi*w8*+l4:hC
LlueH9 F5<<&nCI9d?@8j!C\E*G/e&tm&NqA8mRk!hcITVY&*A8$<yXlmuW*ah>%q^MZwt!1ZXEBlYL:>XybeB*
L^Kl!P c:/E%y5IRVuR6wSJbCuZ!n^:\YwIT&diVkpXX68dGWMyGiB$qVSM$buRS#+b<DJFwRF*u?u1n/aFdGe<
8mYZi6 GaMwTp1Z:/:M$4#kcEtZ@Jc+t?d:6ymjhiYP4BHdPwK<Zd6:pmZiRpn\I4p*Q=P?1&EV5NZmuyd@6RpS
FLNF8Y &ah4XD6edljG@Fj4Ed&iP\/^\bZ1k&tFZZG9+pKYH%S\*a=*KLnmiidlYMmNM#eWdqeB+><K*%m*9:Bt
YP%6qq y>@e<9*TucRi9\1*P:/H1PiZ$Q9<Pn*9JQYHCJEq91?+k@cG8q\?FX9e>X*$i+/=^uV%nCW@ZX#ByjHN
^L*\A& C&NlB:PY1pS*n!#WL<<YX&qy%Lh@=M=R?Pm>XePmV?GyK!<ui5mjBKuPwj=&wY5bnCn1@eLnp%IWiGtA
64%uhp =H4Ek!?<cZ=d$=tFy4FWpDjC8>88lwmX=46dd1AN\=YK&cjDF9e%5w6*F496>:y:T=XCGj^GcBa:%BFS
+p:JI9 *b4PGXt!6=^bF*Jd&=GY!8BI445=!wmPTbMT%YTSc$BL?F$bTRT+Q$l8iJH#Rc=n/NCcSILT<?8<LMAI
uc<ewI %t&Rk+P#m$RSu^Ki\<Yl?QKecbD@LAnK6B$:TpRYctbubY59VYJ4>&Hn%nXZBtS\+5YkTcTqTBbR?wnT
ydQ@RB +H%Z5*:JN*jlm\R>/RnCBieETmyTuCR$CXVlT!Jdm1D19TpnS5%:t=I$&yV18RuFy@j?$SeJy/X?ihDp
wDP/b% *kiQmKd8>aHn9:!QmJ%^@KdRW//9!YWRE*/#8%MJbk6RtmKV=*5Syq1kaELP$Y!ykEhtNpBM/4Fmh=+$
XnqDj< !phFL6bI/W5PYimhlZ+\Z4@iQp>edA@>e8dquqnj6Wa>@@+eWQ^\+WhtNXbJ:6YH?WCyHDFGljpW>*RA
&N=?Vk tiuV%iWy4qmbMG#==pF^bYYJ+E88dcebkVHKHV<h\eBb??nb#m\Kn8jY*a9JuQPTtj%#Qc6piJ9#^bHY
/y/NhB 5lVQ8Dd6kV&5+PbQbyDubq4Q!$dPq$*iZ^XtEMmZyTHT&FtXKN8WLnb:^TH/!5:5Xhi6:qkKD6ZP^K=S
P\qq1c +BLic^ymcB@$hRuJiQn\54\89q%1S6:B^YGp*!l:LN=8jEW:PNcbjqPa#<+4q9lDS6\pNlMLh1*W^^HF
Muh8AI F+9EF%qEt4ZHb*djjjQ%QKu$6\lkXwZb/!Eiy#ea*5Jd!aIHd/u44VX&e@D8pt!+:eY1l^h&45IQ96K!
pZFu4y aI8<GtnmNhd$Q9tdic@l$%68cm9#1HS=GCTI4%t%TP\P1@SWG<V^kSCGwF/t/:tb%&!e69Pb48XMn@II
TL?wc% HEb9ku1K#yB:\QM><1tJdntjS>ZEwiQTqlZ/AZknwunQjR5?pImA:!!wmT<uE1&eRZh<WinpCW^KC?IQ
TMKX6J R:yW?w>m8>YiXK!Km+jltYnP98<49WnJa!&nRFX^kW%FSyL#A9ZGp$9qu/SwSC=%<F!lGpaAjL?<+d68
kpYMFB 9i=tt&/6tnyFMQ:M\pKtQW$YbCcM^XwEmkA:Z/19cepFWelV&FRA<^nKtYb+#KqpN6NeSu%qNyGiY%Jp
:N+K$p <T1W@n+8!L*>k&jKDt1h5$LJj8wR=KB$?aePAk*CbLV5l+K+\8Jwb@LmWc*1/?#DilTeL5/51elR%b:Y
jyI%i^ L8WD!P&8+a9aI%NC=S#Th*4ACa=CQ1!h4&KTI$9PuGkFH^EpQ!^VC\tNNT>IhiLRwM^:=+\w%?cjy1mM
BWW9K> N5?L%T4+EDpP>l>>1aj<j6ab9iLX4yInjdqLSVSIHA^A=8Vb&cuZ=48@+?KhVjA\jmD+QIVICe/cH/np
5Y*w>k Aqd94u=n4GY&\6cKI?5KXZT?T<eleuqeT6wj+pYYL=>@u\8bhyWdAPq9eThWLPX?w%+<iKtHC&k4IP^9
H>Pmwl KL^LkImeJic?cAA!jiFlYqH&CqEX4qFNFleS/<#cL:HmhYQLKb>//1!M?pZ=%!\!Z+JwQqF\MhTy9EbF
nCpF/8 tkH1FmTy:e<1\#TRpQDkFt*bEk#l=BN1iF#K4NpA&j6C51YeTap%h\9uRy?\RBZbXy>*!Eb91tT8Be&P
!1hT/# LZMNpnjB+h&pMyap\<9=%S5cGCbl4A9A%%yZem6ySyhD>5n!Bhdd+A*6AZcK:!ISXV+E4Ji*b/a4?n/b
t#p<EM QRGqRGdQBKVI$Xp6IHLNjX&dYd:$jClH%C>pnFci!6&%Nb?mn*I=%m%?^FR*qTKTtW1h*Su*LZyj//K&
tRSTI# G\J9AlJl+\ipy6%\Iau:BwITKb<lyLa:>^+W:q@P+e!#b*PGdJ!Ep*H@yWya4nIJPpqJ?wD!Ltp11=qn
jah\?N BhWM$HeM=KLyRIRZ+c=Q:iL/WEj%9p:bM\cbS\n9DwcP@1F<udSqNk9Ph\lA4BKu#S8Tdu&iVHPFXVL4
wu@MkZ aetm>yuKd$HY+ZjiPX#W/XYK9CIRW#&qJe5LZb%PCb&?b1/4CB$6:>aP&X&85=qDPWMtQ/Q/J=54S=mQ
wRDB%= 4pHbZ^lFF6&AE^5W:V=caujV/ZidTqdi:HR9PC@Xum:X/8dS/t1a/TJPLPBlbpuG9mCV9X4laSceEMHA
VBF^=M nT?m\uiNyuw^j#/<<D9j$yh:9BaSK\^j+QtyAyH6WVZ<8\EEK^dy&^SI%5YHjX/S48@8XjRjVVB<Ei:@
8+YSW> W4*:D6+cHy>t4h4@yiQLMtB^4m5@L1I9*N+w*QYNkFWZ9wwHP:a>h9$NkXXn$m^iBMpek1@ma4SNh\G?
**B%9X c&jcWJpZtW68LIqDNHu8W$4j6ASZ#^AyE>t$PK9M=qJ^9clNbeiD8HmY!\9ant&YVwYQeSmiJ9LNdj9B
FQpYha Y%5P6<#cu&Jj691w^\A5PqTkiqGB6#bm*%y:l*Ly%APp:DMl1P!V8?/m+an@#!RG@1wXj?4EAAy>LDGA
:XX<KE Ry$&MjBdwBYNPnFBAD<i=Q>Nk?b9Nh4S^@Zhn&N@Wn&QQ1:9j5K+J&8$w+@48=?AQXtnHZ%e*@$+>kej
lNkMk< +mV5eZ**E:AuF$mnn?8:u+BFwp@G\9<im#!=<l=>ZN@>BK#IV<+Z?jhaBQ4pBBDmFH/FkQ$Ei\1@ktN?
l$GaWa M5?u<C9+#?d=FH+FE@5J>lS?>SMhjVV!FH:%$#\ME9djkE@lYV@S\penEj<FFupc:MqZMBL%Z&DSy:tT
GW&9pC Vq/^pJn@+u^Q6YKh:FuI$/^aamhjDcnV4Fku$#LRKNl@MT:<9<D?m#I@?w@tRD>X?@?D^9F4a9EETkeK
AR%^Ii ?VjHQK:&@$iC<5e^MTepL@/5#QX:<kIqel1c!Q>M:d>Z:wip9^mXhH<TFY=eBlmpph8SpM\8nYcmYLBM
p6BB4j a<M>w\\A!!hF^1lVctZIPBARbMZY/%#w/CKpX5JNWdIQ+iMiYeFb!Fl/8pWWn<DTTIa?!!XS6u=V5ki1
?u*Fi> 1:utGc6NE5^SljHGN6^uqPJmXtVTec>+nR5CC^u/S*tMCBkw8Put@S@JeFdKDFkEF8acZai\hHGaT>$^
BM4=ND l4NEkk%*?6!5u</S!<6Iaj*n!lq&%S@h:M96G=#j/bclnwuLSEH8KAiZ5m^/T#A5=q%?Cld\EN%ZDM%S
bl*+Cy Nm/?u^iIa/M1<d:%PL*eRM4EEZpy6J6%=NNmQM<dA&QGWCZ!q*YX9WdmI:ZD!w&j&$Hp<q<BBI4Q^eE!
aSl\M: Q4*m$bcK#^HBBQ/^QEVpjMMA44aTm96b/^@eEt9eE=WbR6?R4TaA<a8*B@thuwtQA1t$h$i=NTd$?J6A
JmEVhP PW+#IaTYNlAKe$WL^lDCG<dMIaTP<b9SXT1lEHDm<^y?qRV?YQwGhu<bjtK\\F*SGCHbJZkQQuaWEqw8
-ABBm\ 000c724970c001202b4 Page 44 of binaries2.zip
M>=8m9 wQwTRPB@tX<$AP>REFC>5AWVVT\^*a^tW:SmABB/8my4^lT&L\\pqhn#wwN/6RY$PWCCpp$:jy>XJ&Kn
X@^JHZ 5@n/Z<8pdna+?%n4m>jlcY41BAXhM^mnYh+Zw1n%LIK4kRZDLt46qCG8KI>*d5+Me>TYGWYnk15$ShXL
LR^kYw 6Za8^HYaBw9B*A4bpYZpbPPIIV^HkJL&STeI^bC*9yJw/wLX9IyWnI9+hE$9F1/F5E/+Q5+Yw\e#uZ4t
j@=mKB M1<N9&G9I11>ZTK/AF<+EEWN=i+dDbiZ<\THEF=\Ya\S@S!=<Gwt%bDKY95Fd&ADRuCX/p4hE\ZJtKBi
NdW/nI KY1dPShP=in$5>yKK+S89en=wb5Z?AFMF*qYR51=:Hp&RcqZLNFy1y@9N=a>Z<4c*L%Ju6^E%&kMcYDD
V^QkQe 1%=Ykekd!V$Ttn@HB>BZ9ZbXMe=:mc@bZI=>$iL8#j$&bVZ@NWG46LNJ<a%*WZH&wenekWR**\:##qj\
Gl4Bl^ 8ya=1+^RqWc6?1mwnmNnRXjjaRt4V&I1#$uc^d*$*/kanDy@n4\\+l$u%!yi<>K%w*=<ShAk%5ZI+<Yi
T1*EMq JL?q/pFGHchp\#B^@tK$yG=Cww<lueJ>b<uuu%<h!iVJYi:euH4/TC/m^ZTQi>9MI4:X@hu$pYK^I#^A
9eil9C ppieJmnKq?:T#n=Jih$m*e6Nk/88Pw#m<kadR@+8T65<EGI*4ZSNGke=@Fq+me+mT+iKl\4bbXWiLA=$
mScqAw :*KFCq=de#uE<QNaBK6<KI!bN6tD@GFXI&il\FC<Xcl>DA$6&:y8!QppHVKC:JuLwT&4db+YQiy<$*ye
w&:8C$ e<wm6MX8c6uiKqF9SS9%=4NB&Y?N?4:RF$B\#5NRR/@<MRMY&h#5&CSN=Z+e9C5pBWI:4?/wFkQJ+CbJ
V=+PFq Z5!qW%tDIID/Nlq$!i:/c#VmZZni=M4#T<VA%>:qRZ89&GGjjR9M9n$bhcWkN^CCL5eHyhMK/EP4FT@&
DTJR>H uYPFVC%CZmADNMjcDE1PY5q$Y9Xm#dLEi*5FnIhK/\GkMneGyQG%Z4?H$yu6&8XZn:S^YbtaA/8yRL#<
nuT>*< \!Dt?i8JL=ADiWZCdInl\BE$N:@iCGu/?K$:>1YdIcVZCEpGwu^*1/#P+ub#eW4N%%5D8y4/cIbMH+&y
cIjauT dmhMCSRad!#6<XlGiDnu*SF/cNNY4wI@qud^YuQb&9N+^AVQZn14m:c%KldyKWhTd4%aC\yKXpqRBuCH
&FD9a9 j&VmJ8^YNp<ZaT=W9SN#A=E*EXDAhY%%\<K<K:@+enmQV&a4qIHXwF>LmHMmQw>lTh8tV%^8NLnu*Hmi
Lpuj^< Su=*K##WMEI*q6Yt8Ha/R$^Qp:d+1:a+VI>Yy<cBljeFZ<Ga%#J/j81e\%^uj6ap+9H$M@q\?NKXu8d+
/=+YLD IJIw@DM/p?J<6\#!MHk4<X6lBcDLjd\KejI$>&1>ym>YFuHbFC+q6*yETmpJ<L1L$kMK1li!NwP<<SmM
+?eKuX qR&</Daum8KuQVk?C+IPa\jE=XTelkYWCq=Db4my:kt68Ve%JmSDXIm1*JLCYS?Tp+mdII8e6$R<$?I1
FJnXpl :!q>nCeITIkR>y<5qmY>^&eB8TNDp1@i@9pJ>5/51EmN$GF=9Duj/5%IW6:Z45DW&wdM&qj1^b4b?Vc?
d^8b%h u&bI&&HR/BaCemK9wdMl+j#X:Fy&5W!dZ%G6@Pe1^uCG#9!haS%4>DJc@VP$?+\nyYPZ4#NnF%la6>en
yqKEW> !eBpCyM>\p81/8WdG5\5!qZS@F+PbpWYtEZ5ayJ85kPaLqXe:!=X=m^K8WV:haK?hySShS=btT/dR8tK
:&9=QR c9K?DthcJt@LqR\iP@^liu#=<6Al@=j:P$p#MuH&C%^adF&/VLa8Q\$*<PPH6=MiBpNXat8&FBZ*Z1Aw
A*4e&6 ^bF>%>e#yT:!&LtCetFKlnISD*dpjMji*L1HM1Euk$6AdlnTD+%^5XV%Yu%RF#ejW:\tw%ewGS4C>=\K
Be%^P< PyD&S15:X$?kda$+/8JFE$uL\Z!H^JhySIpYF>mG?e!i\WTVGX=cJQ8>qS:ejmdh!i6@dW:DcSGdp9#G
LGI:** 1aM1@h&FK*XKAdXPq:9Iy1QZk<T&P/=Y%?tcQ+/F4iE&ctXC5!+aVwZTM>\SnN*wpy@k+eN8NGJWay98
8M5VnY GR/:Ct4Wacw6=@9#%<QW!mymqZ8%tb*tdLnuK5e=PeL6PXBMLS$c6MPZcn?iaT8y:C>YC:yW^uCRBtV=
$:u/jj Hu=A^NX4iI>>cVcBy9^!JYtYVGcGplt=m=>!5&:^@aQ=F</VjKMDYZhwhdeREA=hthXpV6>1>d4HXYjH
:?GejR T:/$Td?8KYF/hLc^1=w<daL5&yWM?lT##=c\YTb^5N&Z\mi>yl!lVMXyMtXZ*4#LEHtu94lkaNEp^ulA
P4IQl6 p!<?yi&XXduT<1DJPu%1&mL$4N6HT&%>W8w:LA<S/QB+?LLZ+qpQQXX$$\Z1?lbH6=VHQ1wIW*S9mt5W
VIue?E qP#8C%@cGqWG6WBwyHm/=\WLA/6w@bqwm>mat5b>S45!S4H/mw$a^hp?@$Z>qW#\dkD!!hWqP:4$q&/9
JRBY8F ^:1=+qihI>l%9mA&NL8*ww1tPMLAk!Heju*hSbIH6m4u!%d=XHW\\4uKeb??pWE?^ky<nQ5Y8>W8#8FB
pJp<NN TT!pEqZj^6GidKF5dPd!wp@!R!CFTbRBbpNW#4E=ta14LWL=dnV:p=Fap%^&FGC^mSX*Q:n!jyhP4E!/
i@^#LA w&^q@b+NEX:$<?+uH$Pm^W8R16bWdy\CGH+#c>bDA6+aIttmSE8lJ@H1H#LNVB\WyRek5np8KpG^ycQY
#%9$Jh ?DcDh$IN>BctJ<\MNjIL+%d=T1C:jq#T%n&6Nc5WwNBS/:\nC@I9j1^a<@n?BEEJEDSZXJq4R!+j1Clj
\m:LlW 8/4nwtcZV>KLJpH9Y^8nR#8:kIdB*P&kEZ>ED^?WqKh6JLk!>Mm+#/CKR&9IV9$tS#G4?kw=waic6T6k
^:hLH/ GFkHTkYRX!:b1ncCP#eW\yY6&i9X<kF+ln$KaND?4XkT!h1hWk6wjy%#=5!?:<9e*tjPB>NSba^n>!uj
DCSkl8 TP9^m%=%#*SdI@5t#QIcbI\4?^Cl>mXmtGB?#QqMd1&DtXc#eQhIQ*LY@k/AN#iqN%aWS1IQCG:Y*DNW
uqb4X= 46WXjHFiRj%VTLydSSh4WHBbWLCVP+5uq^6/8jJBLMS?$/PL?yAahBX5I%1RV&aQPI69^/ZGDVdNMj$M
d#Cdi: \<MwjdAbP\C6PD#pA:D&!IjISByFcWQ*jCd!FL@55%kEjwnaHT:S$n$@#thjhAmFA<iZl#kK<1AH!Yu8
GeK+M1 R5b89LV?JkVLdt?WlBR*EIVbNHI!\EehaLa>?iVk<CiXiYT^<4p1pQ6D#be#Z*:^H\dLX*Da^G5+iXLc
uJE:pl CJWTGqnHdb4%yIqtJyIEd/e=IB?QQ^G$IG1^eCinKXYM!BLawuD6nZWiMqMiHWT9/PtSK*dcKDAybww6
G*&&99 N/=TNt5TJ1iy?+H^^yBKt^w%PA<%<RQFLPTkBAcB\$*kn5Db+M\85F!$n9<$SYWTJSt!AAwGD9V^KW9p
1bIEc* Wp9P>8ZPWT5Bl1pFC^l\^Ycp*BIAYn\MP=#C5a\=J@LXLp$?8j<#S:=Cp9^BwqIL9Ep^P<u5YIJu:4aZ
1I=8L% NtqYJ!an*6!lAh%ct!k$PC#QdJXmHBwF9Xu%G49C5Gt&8F^1W#c/P6S\IYR#!lb<qd^WNa?Z&hHZdZmL
h6^pPX V+Wabt@+tFiuTlWn/P^J$=9:$TY?^PM&G?i/qy#LFdqeYRi?\PB*M/^TtJ4d$n%#jFSKBKM\tJeaQ!?G
bMSWj9 Q?ImpbIeWYIQGVSBVJdn*JlmKmBYceXF5!NFQPecHqB>4VX$HD9@%dNS9jalQHbSXQQBK==!HB:&jd:Y
LDaqbi 6d!YlVXFXh:uBl8#>$9<TJ\5dDLHVZQT>ak?ZZY%XdQSWDdDGjc#cdSmiTyilwS=leCiD*1T!JP*ZmR+
a!&/M5 kD1hXc^FIlHMa4W9ejAHWn^8!X+mH=!k!#mh!tHqLPZ8TGD/EWL!nn*V6yC#BCqX1uK6tK6LB4>DQ1ZD
%TjtSl %9y$=?d#ewFQl$L%*S9Ah/4mA!9Tq#P^S!NP:\iddZ5ua+j>TpkJ*wc!:1>uhk^m+<E8*+yu$ZV11tVF
RTlM+Q IX##Eb!4FZV*DK5YZaWnZh&KwX6$*LKN\$Y%PX!KFM/HXDWDJn8R1@tbw^PjMuKME<I#SmlV<?W5\IF\
$+k@*9 *?$uy4anc6#qGTNkhh:%B&G*t8Yk=cFWD/jyI*c85BhkhY%>9Hy8VR/=mYdPi!qAjRSy*D5Q4w?C5&KZ
:ct!Im C/m@BQI#1TGuVHeCq>/P?t8#RcI1:<Xw1Fw@68S&81H8>&b+?cHFX\ckputQ:QXywkqE4>+:>jmE?apT
@BG/y& P/6We&E!T9P?D#P!qX%cQKXDIAed5=Fyl^ti?+=%Z>!+:yuSG:8^t6D5TV</ep5P/iap!NP!<CdLj&iK
FGpC\t 9BYhcciTuKaK!W#knNQwdM?u^T5JXRj=>%<N4mM8\?XD69Mu4DTCt>h/lA$Q4NZCqMk6I+B1%>S%9q!>
@CD4hJ \\hC:4tyC/SQjqTFjMXS?tGEnZinGpu/+pS!R4HLdt!ihIS1pXXW?XZaGuFittbahT&=94ZG=1jyWe6J
P$qD\a WlK%MY*&TGI<B/CDcBkFG%@jHS*TQELP^eXIH/DXJ:CH8HnqpRc5NHZnCY=+/1#dB&AmuVk8?BqHbtc6
#bma5B #a+mq#4e@ycKZSbtS$%8:VcZ94?YIaa4Qb8Y$L</FuBt&FJ>!mLpEYXEkD>^!:$DH\P%Pa:qJd?1B@E?
h?Mt&@ \q^C</4Z*yuKhn?j&BdX49LZu=Dn<:WlE=4IeR<PmkmiqSK$Db*X<^V\Ek&uVWN=h+wtG11Epm%^p&pq
M>uP:C :PphwNNwLyMLdPjnyWW!lGLkhnW$K1FE+?8:<EC:YRh@G$6AjmblmJ#dH4p@Vw#w5:HTaeT&RlTlL$B$
1mLP%R TER&!\Wd\#@F/FLJJ<HBGXZHBTVWlLAjXPq>>+&*>CThXdpnm?F*DTBQw?T\N9=q&X>+CRyq%BB?CXdW
1qMG%u &1tn8#y/>\cB:4WT55y>GS?aQMw5mKdKVhY=Z4Q@1P//68TcWMXqh1?J^&eeuP#^yFnIyikuY8dH86%G
eFQi=1 m9\k^BJ>@6pN1>yWJuRlBB?VZ5/Q*VBd:yHKHT/:/*!G/>Eh&A*iyVHSP$ZcXShNWH\w/?yhdQj%/R9e
&uIb!: 5@SjRlBPP=Lc4QPklhY^4p$y?6KJHSq+dbFbA5G?nLpqK@dG=j:4R!L%E<ZZ=#/A!uRhlBa>^IESQbc&
qG$+@D @iRQRGJeP^VDJWk$*Tcci+JcwCh&QI<9H9/aFAd^1CM<iKTwqcPqEZ:*/n6Z>a<R@&I4!@APM4MP^TYc
PD1k4\ HnCbEnDR1w4nmA8H>#y1^b&1PnX1Qa8#pZ:>I\+HXENwSu8qS/jQi&Hp:\udP!yuy8WZP^I#1AnJSJA1
/<u^Bm QL9/qpHekkw+5KLFQ/Va/@?WVq1^5n!jlEyyl?GKbcVhlp9BTw#%LE5dnp!Vh+6:!%hWR*=!@D!Z#DYw
IS#a?a IcbWbjGJ?+WdMqmkHWZ+T8qI6L\q9&bI<Ke4Tn/!N8h8RHyL1>?lR&9%>nyWqn!LjAwZ+6LY?1NN4iph
wle/&m a^eDR>5CIhpV*aF/1^=F5<WP1:yW96ee<56B$iB<Gp#Ny4MFpJtcPc1BMhSl%#Y\b68\m5ZPuZ&6hc/J
!jMp%> &dWE>?HllhDC!/4c#LhACWK:Hcy9cBQIeF4TnY?VdeA1\i?!Idca:qw%AjR:nIl&j@ZAw@ua=RMj?RS*
wu@$eJ hFWBS*\ZWhMVdmKK=a+uZabE+FKLHqW#yN:l@IhAN@8uPte4:lFdn<NXu&%V4Kmne^++b*dchn6LhSP6
^!^+n6 M6KSAJLcnXtKit/KTIm4e6==!n4\=Lq?m%lVuP<p!nID@YuLau:=cWRd4:YFWZBX+u6:Ay$\q>q>BViW
-Ate&m 00030dd0882001202b4 Page 45 of binaries2.zip
5G9<up R4Pe\6c#YF<%^jTS19RJJWL%Kt!?R/kmlYFh=>1F>wG+T5mVRNG\LGQ&HiYBRRCjHTh9!ST>BAGSA8uh
Qw^I8: $n/%MqK%MEhRYE=W6H?+i8+um6clWWIHRGcC4n/#J*WyB6ymuW@t8HCqJ/tW#C!@@6uC%^Y+J6u/%&hC
*qplN/ 5c^NMYMH$%XuS+Q*DXjIJ\6V4?ebjF%K%ey+nBq@TC8^+Z8E8DdF<=lD4:RRe5lFhtR&MCPVjW$dk?Iq
hElV/y Rjh+#?SVIu&B@a^?X^AP@ZJ^e>TCa#X\m=5J4SN&PLL+KdLHCF4DK^K5ETZ&>TTL&lJjS#?WVB\X8**N
DMjTNJ 4cYXC4AMim/9DP1WnaW1GY@6EKI@X8$4nR#Hcn#?Xyj&IlbyJ<1j5>D@ct!#*knIbDQP1A4$jV8!PGk^
Bpk#aA #4b+I9*w4&L:@?M5I+aXIjbjNahGw#D@w^\nS9SanlGDPY&P<dj+/L>Gew>H9Z@4c@G*Cquw+*$AntN@
y5yy!Q qq5<*kjkPQau/q4w+*$AV5CiLCPPQ6+H+AV5V#IV^@5AHMj?EIR@Ea5<BSb=e4V>iB?AE:A@!Ywe:\N\
Q:YFLy HI5<YYIijd\Q\Auap@6+wNGu<C8E/E><+^S?ljkJ8R^#C4>C\E:?jnGu<C8+/E?\y@C4u/d+MKh\4J<$
!TL4pj WphnV8NatJ>M%mpeC@pV>8Bj?\Dk@pD?P&+b/p<yINHn:Y@Rj?+Q<AjZSFRE@Z<9%$RcWJ9k*+GuA%85
SlWj!1 CmKl^4$lEa\p=Z16YG5qBnpL99\C9/ZZi*m6C\lVjI/#l$VLMR/?<^?ykyCRMa/qniIWl1P9Qc9i\KYR
SNXDqj 5M<F+FSMwZVZ:<Zc\^qbWm6b++c&<W1<W+jqGih*K1Q1ll6bD%=!nXWNju+YpG98V5huI\MWKZkGZ!n6
yD*B>Z :dGaA\/yTDICCIL</WQbk5twAG\bEATK4SCHijwc8$^FYlaNFcpV$VbkcJjCi:DRJy&t6hm+wDZK*KLm
AaDMj# IbL^SQMGHpQwb4MLM:C\%TyPEp?dt%/!Xb9?DD!PZGARRLBkXXCV%iyIE<LYaa1wD^@XBAM1+>euqhWa
uE@AAS uCAWyh9T9ClB4*cGY5JckAlcpFCBCAu!6&IMwRyitAqB*NNdcE*54EZGdC@uulEXVGcEZHlhcymYP:TN
ijd#6M #XVa\lY!T:+PqGQ6hew=>:YGQbeQKXPDl^Y4KjM$F?+QWEYL/&SlN<h!c\CK>HX6lJiJ$LleP\kwqmLQ
bB1K>P hGBJ+JK+dp48HBGApFX4qIk1L*yaXqDFD^YhM&S4GI$KZwiQ:mIkDMXdC&+BWmTD1jXcCWeSTMHw/PD8
+h!cQ< T@ALH@u4/n\6CZRDp9QIMB%PwnNZ+Eutq1mAyJ8*b&KmVE^uLAe5ZpqFH>=EcYlLRMVRhM@b*DVwZkyc
#bKHe& nank5Betciwq=!?u!TW#T5q\ZWyb%p8TpZlq45+YJwy:+H\DKAJ>JYQJwG$#P<Zkk#6DSKCK849IMGCm
%N@4#K bWEabApALh%Z8tqb=6bF>nwJuR<BBABXlF<FaN@ELcc?jCIGTB4KpXZwJ!luIPd>!1%e>h/V+jWqLi#8
mLJWKF \5BH\VlBNCJQK5LN4T:%?XSKHPDlh4KkMTKG!kaW4*:Rthe>uDHlMa%5TXLA8NFh#SNa>a=i8c@QhBbp
R%tWbR c*tj&XQmXVpFlt5tTM&XC9W%!Ey<MmXec6k$\CpZ@c=NRaNW>cKChWDjVVeea1hT^jMCbty!w@i1Z?Q+
c?yIw$ 9MilV6+IKEk6=eK#K8Y:Ht5qD>=+\/1Bd:&4c^e$L!@w/8hnKNAC8TW##hZZ\Ac9L1%/yRVkYXPT/CCj
!t&mQa l645y%<I8bH@WaM%!K<RhAV!h^uL846phann8G%daR#Q/l\njQZ=p4QTPlYRcycb*pM4YJGGGI9FhWRj
LtB@A* EPp4?at*wMP*cBLC@WZ<IX!=%GR9=>4WR>6IkYcHqIt%DDwcAPHPu9#$\TXm><wDPm\QXeV$Hltbj?Hu
a#D5=J JG?Sq9Pi:<Dl8IJHGKw$NjeMQddBTZG5NjFMTahX8bi+RmEuC%5#ZWl88WTaqik$*TcJqK4XK+G<1%uM
k*YP\h kT6A@>tZDi!LFAHXh$!+y^=nSmGJYkawAB5PhjdI\F4FZV@SR%i^QAmckB@AdCy9^X8J#HX?IdQkYZRA
14u?QM +h5kCcSmw$Z^nkMGmXME+/5Nk6&a4ATYwe!=\icCbH\/%BbalV9R5y5:P*L!ZlFuq@j9E8FdajJ/JBp5
lmEZ4F p>5wdGJT8V1jlNG#t\MhGP<Tw?H*Ra?t:@Pc?N%d\kZTjNtYWkwSLycZ#VRnG\JHy^DkFPk8GEVhAVuj
VH%t1l CpME$$qqYFM<nQeI9:j/@aIBM+6=^HnCI#H&1NZP%NmFXbi?J4QeP^=*NR?GSLB%Fm!<yPX/\I<m%c#6
&n=w<Q nKq<dRABp^#yijGnwaB!NiZ8B&&#/mVuL+nF4@bu=uhC55+8dSk6NP8tAj4BFJ@pp^^4Q%V\ayM+wjtc
E8Y6Z^ 6pLqTnL+/CL*bK$*5?\DtVktLm&m<8/1XbW?FljX=<D4qhFmRIiDB^QN=m/$/uWJu\^GhII4kb9Knh$P
DP:qF/ qp#eFNT?4Q/5VV#L>@EBdFJ/N?>&#*%:A:ZPp>dL=>D8QYSc51A^D@%a>kRyjG+t/\t:*lRc6d=EXC^1
9IF@aK u6DhhFm*aBMk^B<NY6&w!QT$euqbS&8bmJ@B#A+Nbm!1q6+QkLSaLP1R*>5&j6M!&E5p=uLQK!B<hXtp
CEk?GW W68KabqRZ%wD8KK\ijienKQ8FZ/=Vnd!&MWA=*JWY%hin=H9Xmyda:$HIFdHD?SZidGQ/I!!BNNYCZNG
K*J:LR <#idFDHJt1dDECtb*6kQb@p1wma$*^\R%S=Kpyw8!Vna!Z4mWq%&hb5jeRc$HC4T^dA?%H=@iaZPZp/K
Pe=KFq TV8%V>9I&n1^PmHq@YY9eQCXapYTkTpD1d*?QVZQA56\h$wpZ#wJRW5LG9m^/Iy9Sa\H!&S9V&I=IZ\!
qyj?*= Z!wpKYYp6WhQ:tWCj49<4i:NNY=5byZB$4^*e5VqlbuYh&bJ6#MbLMmd%wL5GJM/*ZbNSMcAXt9yL@FS
P/H*qq d?=ktZpiFuk^la+yZb=1ccAqN?pW:kJ/9d4Aji?KmZ\I&nChq9Q>6XJ1<mi?8m\TY+X+NRny&1Gt^<!t
PEJM%M 1IpMm8JhBF9CP9Iwt+#u46T6*SSy>IePcMqX$b:L\?y/^4eTT&V#i1>D>1eHZa$=4<jM\XKW>NWwVXc%
y>E5eE 9F/5X5?a%mZ*Bn+mSIL99&GT5SYm?VItl+a:yIkak:T<VX<\nuFaLVE@$5K!p1l*$Kyca*8V/p4c6EFw
!e\\L& uc@CV/PZBA5*Ctje=Z#Pt5yHZT?/tbBBy?y!XpIZR^qA1lIS!N!E#6G4IDD%iDV*6QlCG#dcl9@8<6Ni
lKK=T* 6h8M1NY1@RMm>p$eB$ZwY*5&/t>Wi4p%Zm=VZe&&%wl:yd*YmFkm!QCl#?ndc1k1nXkC9*kI5$Q^EJyZ
DQt8ZE Kibi@ML*G^tWB5k*6e+Z<=+HSG1F#&k<IRB49a%S$DR6S**JnK:B#c1a&5AcNP@^JS=WN>%j8XQReD*+
4ce?95 EqC@&CA*c54$6dZ$TkdZ?Q:Fh@qV>G!?M9DlVNTbd9%d@aW6F\pQ#qbJMC%$VJ$*:d4=\nNeYL!+w+d:
+a9AkZ :l:Z&5A:lPiIyPF#Cp%J5P+X1>=#qicW4QeZP5>Ld6F<d:y8mlZ@nP5j&Y&+n9N9MFNm%K*ZF^KV9?h=
Zm:I>q \ZKSPy:#*KKeh<Z:=V8LjW:46>VGkd*nTumy6>XMN/%WqXX4XXb<NdDnaQ@%G#5QXn6JF8Sw!5!eTwKC
pGA@=B Pb\YlyZ1Vi!6Z9ed%QCL%9SC&#hnG<m%P6++?Tl6Q8dFw*Cm8B<uaNi/AbC*eqD&$lB^5iW*#LGdn/jk
/=F?6/ mqCqBGC:+=h#P*M<G8LD\Y+?=q\ihh^MH$NnTKQi?T>=kB*hnHmZR+QeGkZRK>D%d6/>iLWkRk9FSH5B
T5/+pT &:\=Ik/t%&ZnY<X&i?5?W!E?w?DRXW/j6Xd5e#!dX$Np&Mm>X^*!!8y?ILA1KG#+j9qN16$9\e/6\Fn@
ycHp1Z 6anwG\5nFM4XN8yy4WBt!9kn@&WTm6Xd:+i?W91QZqNRJ1L/CKtT4RK1H14qB:5DMaLbTeBRl\kj%:*W
*Iu@&t nS*e%\TdNIHScLjXe16+EmWcn*XXR/9?yd^dN6kDRJYXdI@Q8M6kk11$cic+:Z4kcP//%?wbAyFw>$1Z
t1J:>@ Yp568$^D>SCTeMHA:<W6jG?Yi^#/p+wHu%MEjqeN@^+hZ:ch@C^5@X5J6Ia%jEiNV#&eBW$%9L=PeD8#
AebTdm Q/E9pA#d4/dA44KXt=Xuq4*tVpk^@n$\WV=/5X4+?@pPZmJ4j4!<NcJXn>y\\$au/Vy?^V4YXTV8Jwp5
V>$^88 FLSX:*Hk#GYGdh8#/w@jC?%!=uIedmQ$=I^cA8V!%Ta!^QGI*miBk9c1*haX!JeFNmMkHK!8HC9>Y$yY
w8bJ<: %WZN4#9>d@Z6ik@EZ/QyL4Jc>FA/C%:4#m%tq:Eyj:5pIYNJqVW?cm5Lchd\i8e5KGVFJR%\tPj!iKAt
A1i>%? Iew@/4Ecd!<91q!CdXS\F:RSN$n5:8aNnHHe#1y\FX#bXqcGmWVnQR&jh:SyYbY#iGl@aAQ@RwGRI=Pj
cJ:9N+ ZEpTmA>?K4VMK<#Hm^Aa@eA=BN4ml$d9Z1JSSaka&LX#euX*^t$ZZ5=<\/uKT:LM==\npaPI%m6JjMI@
+9e%YZ Z16aAdPD91EKNT&F^petY+uWmhunA+eaNJ\WiD^$dLRM>HH%VYd6:QLDS/HSdW/&DBw9#n9Zj4P9@%ap
RD%!+? <b$m?L5L?hu&i?e4Z+NnYjJ66&6!nG9Z!WA4Z\pe^/@b!AbY?6+?BNHdpSW8^Ai1l*@biYAp?FAcb!1q
YRdmCV WimPX&^c&t>hK*Tpc9waYw#yeMH$X<+QA$pGJ=@u&9HKuaXTLPEB*&u65ykN\G6!T=YL@h=65CD^=m*l
X1@>mC pD1T&%!<5*i5u8nG>&8I*BBdeZyAQeRMeI1J85%M@8YIlQWlhB%FdKHBNjt%4EKB::q^VBSGeaB@b#!D
?wb?8S #A=nmeW8p/wQdFL\D5damWphhJ9qRl:RZ5aXC$wWDV4IQwZVpaAnYWKKXRT:4YT+T:Nc%?PZVJlpVGA!
\@y\Qq %4Aw=cuC&aRC6+\yw98hkpKIAZlTFy<uRpVF?IHnyC$jAA:9Ze@*CCq/=:e@/$IhkepVbCXp^1^5T^FB
$%:YD\ B%VCMWHYQNcSF8ZGc$5ZXY^E@h/cle6eyKc:^/Xd4EFhYitRayVW4%!+6><>mPIJDM!F11%Yh4q<$hA>
*5ipe> i:p8F>ihuDdXG4B<yHbWnPneMHpdim*E^Xt*!+SY6HDlyZ49E*e!ik@hq5Jq?GQ9^=j64%%i$GTT#VQq
>V!QmC pWj:&!yd8y6S%X*SuhSd91wY@Mk+bic5XlqYa@Gb=:8it5@uSk:KhAk9kiulZ9+98D:pS%$A9\%HIqq8
tuAHkH =!=ni1:mJ6ZXX*PSbNqZN==yVkNECD%1euj%e?u\D=a>>5CFcpnDHp+PhbIl!%S8iay61p6+XJeMAI5n
SK\QZh X>PRpPm%bW=DYekK#P&XepcCP=Gc>WE49iShGTtNZp??!pSS>PCPVuMWiMw5F5XA/ld5^ikT&nJt=+S^
YJPnB? uNEkDCQyCd$<cQh%8lGa&8Jm5<Yj^\@Y>j8RA%el^D=eJ@MZWkQ*SLt5E@kTdhA&aQZ>=&RLlMCXH!n8
>9@uHJ GEFE9u1Z/hK@K%S=X^y<qilPdH#a5MAB%bhRWy>4:8XI9Nq&F#>KtAp6TP@/$EP95kiFc<^W5R<y^^!y
k#mpAt h^:5ZcN=b^h$6in/tcQJt:n=&cHb4c/Fi\ZdD+Y^?tddX88*c4tC4eqXDH6K\jLny1H$h9IJb&9&4R/Q
MN>QR> ilLYu&*IYJj%uFed\ea&81L6Fb%1Z:qSZTPYRF+>j!aZP4$TG+/t9%<kaWketd1Y4yKJqi&BZ<QdB4ei
-A:+Mb 0002f89f2fa001202b4 Page 46 of binaries2.zip
y#S/SN PpKe9ki1Pbc?58E%^$ScG/l?<MBtEqECMb$E<<1XYH>#i9$NC?Ik=BpFyq\tHZp4m4F//V^dd?1AMG*H
8jYTA/ 5#CJ^>V?PGC1H&uk=R/5iq<kh6dh6@6PXH!/WeK#pQeC5!GDH/#=<8u6d\auTCppk$tW9\LYP/&KpbSQ
JjnkZy w*8wTK99M&*5!$!=AwZ9!MWB$e1y/tq//!S<\hbaA^F%KT4G&GS55j4\^$qbw:R9H!eNKI+p9B9Y=+c@
$%lab/ ^@cu6!aL4H9+iXe#Pi=%^hF@?A!$%A@9jb$TIEWW@/Y$$!@#/NY\*&Z=hFC9M$SICLZ9ED4Va9C?nWaw
>^qH8# hHuPZ%?YbMQA^ZiG$ZKF%K@W/S9%c&5Gptend/!V9y>HZ\u\pAFVE6T\Bu8XkM*nYc/SbukH/ccSmMua
WMIE<d TSm5!!iIMFL\k$G69jdCqM!:w4b4B6KK$hMpCk@NAq<qQH$\6<GkIK^BjA6DtpChQ^u5P9*SyekS/Tc*
19Hd^Q &cERn>%K<uH%DwptNk4nT=W!<F*kIR\Z?4aG?lI5B\19C+*JZAAD9I&QlN^LX6iyu?ZI9PK@lwD1kGK&
565#hP +BTKJyL1K9Rc=S<uIk9%H5wB4jWlCTtl%kq4Wc!#\Rh9P5HkD=<?kui8G^^Y/Pi:q4?JZZ\H5>4L6++%
FEy*IM 6Dq1VHauwp^?e!PX/Sp*?DBPtKNePMMw<bh4/q=bcP:kQpb!&<Y+=H^M/JK%=yd@^!jQw?M!hG=Abhh8
EkmXJ< Kn*%:CRLCk4R+NK@?euDEY?GcF8B%awWd%5lJNqF5H$B%qHpiCCd:^ZaD%eQT4%4WW!4tHIIY:<6+MY1
&wK1Q/ l>I6LAll>j*\dtNGkw=TW<iwRiphESXq\@94KTp18BTJ$Aq>#d*Mh=6uhcy::LY/5/c<jFi&hPDFn&9c
FVt85? hIybHMdLclhdwHL>iR=Gunik4:eRELH:Ek*8%<&i4\%:aeV!WS$B/b4*:5!F*@GjTY8Ih>e6uhj9$w*J
46:uDQ w</Zi:IdpcdB=let/hYW6wEhy%nHN::5c?5SPGdd9>d/A5I99bwRGLC8<MSqPY$8/!uHLeiF4P^etaVe
IKeD/9 9DR:bNy\pZ+Ph<DEndwP^B%mR=Ca%#W1t4HD@uF=c*#&GH^B?bWa%aj9JCe+@Q\KyCV!CqZX</h%\^:&
Vp4:4w +CcH9K/1TZYKQ<!X5!An!%cZCKFjlya\YpS#JQ=EL8&9QT@@D?a4MQ?n96SwWdFn?RyS$hQtK*+LEQ=L
AT&l\J &FH$iH\ZI*dKuIMw:P?^Q<6%mML@H95#pVbS^Ct\Q\t#H8>?ekL&J:H@+>%QntN@NFW?Ea9?i?^Q+>q@
yA6^<B dZ?C?\Q/:&LDtD>E1u=^k^N$^@:eF8Z*&DBMDCd!j*jHl@lPC^/G^hDF^F?n9IMBPKZHPuSuWpmAHhhX
n?$Y<= A?YkTjI4H1M//$5pAW!!%Hchn4KmVA4LeHE4J/PTaLyP+PcST/+RI<m5$k&*iQETM^kwuwA*ch@DyGmh
inBXpy 8C+qd=/i44ikuTbHe%9:WDE$IaJT@9yYbRwjZ8F:ywDiFX&^FN<QHa9qAS1L%j8qbq4>$JmP:G*/<1Ad
K?BKeC EDk+l&t=LwdDE+IIJkkm1C&#CPIbRFPKB#MW9A=*&cl91*S+kKGMY5MH&5$Y+YGqAt@^aW6+Mlyk=9/+
LeL9%< C<GEI61$RwRpG&!l4:Gdn/BSkb#ERLbCVVbAXywtSc@VDRJGANWSA\RGD<ela!$NyCm4F:V5tQLjeEnG
\:yw9M qjLht/*5HJQS!YpmJX<8LFRtq<n5>q^&C\cRD!SCIwP$dDmAl\=iG/EBqdcmV+5h*Nn=?q9N>48VJ?ip
<8S/Tw Y5i*!J/WYXLNQl4$qwW?/YuDT&$5k%ei%AwiZqTEpHp#jaGACaP=IFJDu#cdADRTV</wRa^u>\5W&?Pa
G&&QXZ mcnLBQm$KZM?*ePJkJBqp?TC#mdldICd=9yT4VmaIE*<LLJhH@YpL5a:<KXEMD&FpupbZBGL4qT=KX<Z
Zh<6t* p+4cSV=*>Jt:49^BILqYy$FSW:61TZtF*/T/edyJ<AQ&wQ:qi^@N!GkW>pWecKc&<WII^98&F/A/qSyS
+ZT9!d ZcQKePd!^1j^bSG94!X1q+:/u#A>T^mYlLTX$y:DKMhuDneyc=tGh/*WEBI%E>FI*L5Bi@eqn$h==y^J
NG\QuB tQSWw%S<TIMZ5p&=Qamt69LDeqqWSZXKQMNWhk+AGpQD$9$EN9:pR<?p:?:bCkMtXGm#tiFkZ\eSXhu6
w=Za@m E8Yy+F^Et>&wb4Z^<>A5ZteuqwypRj=duEKiS5NhNhQ\Lhqc+&qbWRmR=1^n95hZM$%!&BKZPSY?hKbP
>+4ZD5 BV<5Sd!mM+1tD#a:pC@Gc#pVj5lq\b><p%!=N$c#cTAAL!bm4?aM*>QwuA+A4^Xd#NA6d+=RML&Ici<+
KJ?pET \4KhTl5/!=@bTiXF48>wLwXTTE%=:m9n/JBJBd\KLeHHZqY$?&nAcadhmBw9E4ViL:/W#EPtatBDpiuQ
@PXn?B XT@><u&dhI&n!QY5=tVwK#N:y>8nbHn<X<9\^4>R\8KX/dm+4/cdHLbi/uJ@!N5RZYkm4icMP$hT9+Bn
PMP<d$ itXbEdC4VF>TC#Xl/Ym\HGWCmJ>By!^Gc\RZSZLJ&u^Lic+TImlw^XWX=4CTWZ\wwtRM+$e9$b?6m9CM
&bdLI+ WhQJc*$iT9jBLmJp4yn@QetC99mY468eV?ZKBy:lw?lw\iYi#q+Zcdd?cZ:inhhFNa8n>/Y<uNWpCb@a
mPXLHK PTVKGJY:SJk<Ep<>GAkkhIQqC=y$d?nF/=EyKeYL!&L<6juwQpcI4P<>WedVJu#ad&!l!umP#&Q<WSCE
@t5RJ6 tcI5tJFnZV$qL+NNTF=CFGYX!Gm<NYk\MkcXHb<l6wp8l!%pRQ1djL8CBBaBwMGuyepE8bAEe?E<9/ju
j8n>tE /c<1nBqL+C6DHuN%WYWucWX4h4iiPW8#i4P@j<K\eMyJCYiXw:jPw?D\\wAL/q@SD4$QY#pk/e<6y^6I
FpCmL% XM4Bbq/W^L^:u&blhytm!^1HTCeQKET#1mm=cHlWN$CLFMK&4n<T91c/qnu4ylSTbyd/pbmRaZFXPHI/
S6tB&* P\>>SMIt=8lSniKAwka:E%ZMQaeEuwbC+KE#!H9id!&a!8%%Tw#/ZJ$mDQP/Y\jka\85bZWJS<ww9:mW
LGFi*1 m?!*9MZYl>!$+yLI!8+QJTi^LM<PDh1J&iI&R#9G/>SuJEINw1<j6HVhwp&V?ZlFm1yJ>?4SK=1Xe$RR
h*cFRm @!iQce<4cZ%N8WJK%Vp<=YwVIHNhacA1?hpb8&@M#bckkG4iMG&1kcpQ%/*/iI8jQHPKm/yidVTjSLTS
Xm=S9! %4tZJiH$Tuu:l:4i5M:&%+dI=RuBi1w4hk?/GkjbRkmAB5q=Zul=5Y>j>jGj1%eShHaaTIPHEb8eh#ZC
RB^H6c cQGy&RY^Q:t1QZHlwVI?\WkZPF9HMPb!M5*ZItXcNXN<*+iKJM^n\GC/&ZmEeX6nb^C$VED#!+4k56Lb
S5C/&Q IQcZL%KKt#LK9K?a4#$TKPCNe?k1V*uWPcN!L%MI/mBuX%SMS/t#jBEaiVPLM:\$hN*Z=E1bpuDj5?ah
jG$IXG =tC$p/kDnPE>qtLKkZ!AR6D9$hY^1<QK?1CQc6eMqSTT1k>$najK548@qMhX5hpB:R&%Kk45ZJ!&KpNh
FJF/9P $E8/lT^#4LFPjZiHhF=$SiGQSdaP*mq/Tb>+MZbwj/IKLcSEw\1<:eHSA\+ZJ=qHl1cpJh$5$S#/Cu!Q
l9@4m1 VXS^8X?queI4i$?k9K%Z>Gd5>c4N\jG$JNLd$TX*D&4FJGl*S:Xh44%?!blIleYi>C#:%>bp@\ijbj@c
Nyp>?Y =?!$#:KaQ/RT@*mY^j#BcQ!:b>ujH&n?=VHyiNi$j^n*X*:>!e?!^:8tuaBFu%!ded^4&kqa^MuQqMi:
*IlEWL yl*H@1#e+HnZ6PNaJPau+/JQkWZ>BI9=i?#QPQLHt/chkIZ>=H#FVwEXPjH=G!Mm<9haPE45bP\y@Ay?
TbNCw6 e6$PS8RWjkWZ?et+y@C4u:$#aESP+XlIlPnJ&NM+%5pCClmSW#kYHIE<Ga9=L:Cm@\XY:DRZ+eqa&Cpe
G*5MdQ C*X!8$WM:BTP>SNcQ\b&G5e/YdkBA@6Z84ta!N??V+ym@9p?mV^ic+V=5#d&Q/ulMNH@X&9$*>WcEaQ?
L@>45+ J:XGhjATN+5Emj$dp+<=AwyXtaqJbk9d<JYXW@ND?u&#?\CDPih/A%TNI^t1K=:B?YLNXdC#TnH*LAEW
=wM/mP P^Q?DHZ6\V<1l$w/G#lIB%dkqVTLQ^S#$%Wbwb4QFk?dBnNmQ#h1VMAIYneE/CGlcwhtI>nE/C>WM8EV
PWC*qS un^6wQkB4M\\BZRTpJWl5BA/hBN96B=bidA\=4ZN6XCQ<#h<BW=l^X*wq=IXyR?D6FC4n4%&p5Fmyt=c
<L%Kj1 mCI1W/+dARnN^1iq1J=b1p+lHc?RZbb^p>Ib/bB^N>FP%YHEl6CXRwjSiyth\\$h%4WR#eT!<qiWcK6m
nBe1yq <VGKHW5ZACG4qNiWVIu<KBHIWpWZ$ADR%*8lq1S\PaVRyPjG<^ThJ$8TI4KBDGEI1pJ&DadpBM=LNE:9
EEKLad ^KXVP^qGMJM*+SJwRd\ii/AIc+eLN1cF%mpE&a9F6C@h%*c!TR+%9+6C$5tqA1mCVMmp%Bm5AcCG9a=:
p*=Cb& c>N/+1@5GL=Ymm&4tZyN/9GcYyyN/u\#yeiBWuNjKa8%ckM8j=VZEiebmmdN^uDeCmni99/!/bJVE:ml
pG:jh@ 8T:>wkt\j$:F<<H+=*jFI6Gyq+nn6dZjckMAa=KM=\4^p/P\XS>!d:CH$pdHh%61LGlT#&YyR8HQ*#Ia
@$=&B8 #pk#!:p:%E*j$bneEQeWu>GM<e/e8aKmT=6B^Mh9L:RGCRiy/cWR^%t>9*@#MyG%@6/l#LZ:4*Sjky@p
t&Ji^k %Rkmp:=Y#tyjHCF&8l/kaH*bDjjLqcAXpCL\dQ#XJi%Z@T<iVp$::a!W&TNGhe@%BAWhkjEu$ck/W>ea
j+NVJA ynCQ@^>:d\EZXd8&n=JDDWMnyhIhW\\DAk:h*h*hKYHRDhIqIpl*TJh$h+PITLiIYIl+>N*9j4?>>/9j
9hh%K9 !*@9@#u@:=#jGZ@Pe5c=%41ii?/%uqu*jV@ZLb6jCF/#:KXK!4VA&^^l1^+?Wm<&8$9wqkEkZ1Pn=<\I
a*WVCj hmAF665m96/+6a=FFDFL!!:/qX+?>Y=8Tt>XPC=X<QCE>=8MGbFG*MD+cY!W>Da^j@W?hbenLTL&<=Ek
jS=S9i PjE!Sp8/L::d??j>Z$GQDaW>*$S?i:ThZ=XLeBlJ\kG1Vy6jbQS6Np/\<pdXEqPk1$6C!uY@hG!i:RdV
B\^<$P XN&#ulIRSb\F$RRh&+?Dy*IKd6Nwji:Y4#FcGCkKyM?T!>dtLbAY&AI+^LdbISKXbeDydhju!1MCc1#X
m#Pnd% klF>VMwEVhkRH/k<&h$c!6=RdNL4caMyc6SGmw?VHHyul\TMV$djFTHBnAy%bEFFCe#&GX!R=^\!&N!B
cd%itW cE+yw!!Za>IZ+e^hdR>Q&TN^:u!?ce&h^#?nND5mTREn%l^H^jCRD&B>9JE=uJQMHkIb:dE<p9hlV&CZ
4d4<5+ FSnT5M^b<H?bSD>tWBG=qlJwq&P5bGjiiEbedlqbtpNP@\JebMK\!=muQmPwAAbdVqD&j6KhFXHmAnVL
!<<%^D BcLhii4Am6M#VP158kF>My8mG:d$Wc:4Wb?/&1i=aW$<!hhM&Gbm:S1!BT@p458@mmi16Sl<bqt1Yjjl
\wBZL@ cWD8aCEP8$$ml:E!4?%R<?:tI+9tDD!GDN@uWw6Wb6E9@MHHWAdt&8HZ8@SB?/YE@E*hV?p9#EL5I\9t
k1Ad!i ?^9^8cK@^NT@j^?EK+Cjji9Md:L!i9jTi#T#q*bl44M4QSHXl&aH^SGq%p!>1a&pp^4L5eCP&5Yq^S:=
L+^hAp NmJ#qqw<1p:4LHWQdbZJG!FT45NW^6QBWmj8ip*+Y:a<Khh>EpiS8w%+ywXq^YH&kaqI68HS%!<1H1ki
-A=CB^ 000bb83dca6001202b4 Page 47 of binaries2.zip
YyNe5i 9Y5J^\PR8?j+1$TA\?/w/c?QPYGVY1i&D^8V<*a9?d!ib>PZEPCqE/>IbA@m/LaIKnhy4^hVC5yD!ky+
W*WQ$h XuA:%1%^*lF<^p++a9HEI!=p6KL@4F##HnG5LqAVMt<Xakm5W5WqCS\N^/1mmHd$P6!pXt+pe#:y8heV
*a%ldn h44/?pRn\pmiYN+NkQFKEh!1yPwJmuChk*1a8^Tt<9X\8wpZa<N5>#cMujchKS6mNF@N4>+8TyST4Fu&
?GJp<: wV8yci:h:?NpaK$4h@eZeN=XaKFNb4ny8p>tl$#ht#w*VHF4e?=MGMBpBJLS=h\#5^<:X!9RLC=IYe<\
qMXjV1 PAJJl*M4n>dh+BpcK<GdYDB=5m6?*&w56%BmAP5q@V8DTe:l?$JjEZS%wjeMCGjwT%ID=tunHwE!^bwS
uIy!ki ?<YLTwN/lPi=1&N*$GaqRQ#1T/dE>tGuL&PuK%C:^C?4\kRDV4l!bBRN?#Eq9S\%:#=W/a4Nw&X6J+m%
+#TRlY !%WneFM\9?NDN=*dahW@8I!pF<9a8^n14>nZWpt%cd\=\/:?RuLqDi5*DMRH@cwbN^RD@Z!wRhq%eXq^
$VhcuL 8TM9ceha5S^VN>?PS&!#?B\NT/<FTe%wn1>q%F:DEJ?5pJqJ$8qhZ4nlZJGC^+M6I?4V@qK<hc4c8m?d
5!NMk/ >wP$J>T1?I8y1hpaV%TML/i$FE&Mht&!H*=AadNK*$=YcY^kJRmWm/8TuTV*!pR5bq1qeG6L<^u=mF#^
GGbCuX XPW+K4&6Lut+1pth<@PbXe&T=t^yw@<qu\+&LQI56?a=qiJK/SDF#Lu^#5GI>aG*d@m!>hPMw\!VF1=i
ZThCj5 em4XL\\%1Y@KNjwTC@$^K6<ik<wep>PCBE8T81KVkKddbI?T1ZP5V/LwS\q*+l<4c:y<&kT*yL@dChyt
HGJj%l Aemn9>SMMalh=lj1Fh*1H&W^9%:hd*De=LKcTcuGhT86D?V@#WQw+uu&1V:YJ&1CXY5D/pi%DhDBKM6d
k<I@#? <\<n\#nLp1V5a6KD%XGtJA?*FRhR5eHmDadKV>$>dC>/tPGJF8!Zh:bjmImEEKNALQ41D&ZbtdRJLcuW
An@/5i XGk?wY&Ciw5jDH64SbZ#aQXKQiY?&J#A/J&XD4ANZDMEYH4KBI>#BGhb+Al>p\d*qy<J&Ke8Y4Jk!<e$
/D#+w/ Kwn#5*Bn+Ti4TSqHSw4#D#Et>/<@nBBK\>jMAH8*MlQ#n=:HD&eYd%@wluKu+9YueL#HB!uleQmwF@dl
PZ:#<E ^\+nqI4V!9#ECNH^XT*#C+$#RupI&N:n^&iNHR*8u@Vk:tniG?p9KdEDPH$nGCdB:GZ%*X!db8$DuJnD
DV^*>R J1*H^TjqHk/mT>Jlh<58hi?cY=:\P66dECMtbAE9YDye=iR%FBj=I>yB%hu!^i:nWy^eiTFM6uSBBLw1
cGm>$q SGe\eAMe:dTycLcmS%%>A/Y%khKJYa\c<eikn<W\Z?TbGPZ1FmG^d@II:u:HuG18aF:hq:X:ElWiR1=4
yQeu9l t$?I/?p1p**Qc9c^nVF@*LajmD=K/4+GT?>^BNkZnE9aq?k1Sdw@>al51\bW91JhAQX#M1!#^??S^49P
y6kQWM 1RIC&q5V+:4^Lph\+^BdyA6dyDKl8RQY:GZiWw*ZSHZJdp?wyHeVGwdV4/q^N<Hh9K+q+m16&RLMb$X4
=ENmJ\ \mCqdbid1bAD<?h^MY+^Q4bqac&:VdXl?*+D8=%&#M^4ywCNH9I!HRaLNwdmVWCb1aydj&=9Eh&aEYY\
jV%W*c ecTq8P1\F%1E:LQRC:k:C%1+u&qCFY&yjSV1kEQClFa>R4<Im=B6FyZa#BF4uJ59GTWlmD=h\4qJd$=R
1S@+$D SB6c\BNtcV1?G*@+pu5EcFm8GFP#FnM&nWBNeCZG/=NtH8%y8>t>8$u/1SCuqb+?qnmik:mHt9/Wkyub
%VId^q mtTDtw&E&eGYqL>#&5iT:qT!$y1AkHhkZ8MWS9#Wm/u&N9pP?#9&a%jVapIJewEeR?qPJ@JwDjJyZ/wV
mDm&t* ^Y>ECI6\a?eCZbiBV!yn>C:=FIJk/:pcdwhu<5/FdXp:^lu>qqMlTQYJ\8Bu/j#YyR8dV=*\%%#qGBNN
MBYFjc h/jChq*D5nYTM8j/T&$HDN%mGaV6#cBpLNiiptAG8E1QpnCV$CKb$>nbyEk6nAAF*AHqm:1tatSJm56V
QDTHAB &Ne<hJt+6KkpnkG+i<#B:P@5%a85<w6&bRYt<tP6nYPL1ICDyA</l\pVSE8HkumlJAJlN>ueJdB1a1A^
q$+Xw8 b<C!VFTELEJt9BJ@^R6$1D:m&e6p@k^L9Ea#Lq46p/qCtBh:RN8Su#>1&NRGK:Ip$a5?yMnl>G:Sb1!F
W#yIFX wZGjJBdcYkW:Iy%p$t@<ZIe4pBYjq=@*8y^uH&&+iwBy:$S=p+QqdXDA!A$F@C?>F!$VuN61pTkJtl&5
q&t9?$ n=BuRC?=:EH%!/i5p+VRb4HcT!J+BS^6SaENn?jRllk:tP>$:MdDeP4cHc/cy<ZHFQmp*:RA=cP+Bb1E
u4R^\5 SyCe/SJJFnywmacXu@4dBqj%5GkedM%/HZpPeu#TI:VEp<!HtY/lim4k?ZRPH+HyKyw<R*iYE##I?GQV
#^CW$T GWmqljkbNMlFRIyM*pk/@5*:i!L:>\$Ly&n!tSHE\^*P&\qce^A==\SN$h\BL\Y+:GQY@V%QhX9?Z9X6
c:mTnq +&CT!?TAJcGWd+wK51=l\HAE6uGQ6hai8NI?Xd5\q&=:EnnhKMqidDQ<NIMJPXk<:e+!Pm=L+>=Dh<tq
a>le6D :^GdGqi41GIcT^k5dCwj%?lmYCw9le>Jp^8>?&m9abnVYB+iIjC\kJJn8!k1Q=%p6em#HJ5!Ae&>5CPl
L\RpM% %Bt?qn+ml>&L8&nFa#@5c%9<KYXj=AcLb8GSh4^<QmI&%4dEXF#tE=^!nHDDM6t6wcAES6cuGR5R@n\j
WKIS<= Xh#ky/&++5Yyy\#B9Kd^n5t<EnAhwKmJNy:HKaeJ@eC&k58E6Ep&VP=PeX$QFKm#nbN5tqBa%cM+%+6l
&DujTq AiE>%y4<MGe#P#6!@EBH^Smqm89%lcIALW\H%ib%45aCBcFNEuF>+q?kA!R#MWpcM9iejJ*q*y/?J/H5
P1AZ^p QKF=T#Q<HR$An$dlK=@CBiF$69QPap4qun1F>D*LEt+5QM*/i@+:::VeP8+S+6EtZN^LK%N#/bdmG+Bc
juqd/Z mtFM#GBMLGJl4dGl*C@BKHBRp!\VEbdL!V9T//\jp>$$G/uLZBEA^XDVZYDB@V9EIA*P1CH4&wZ!pP<&
Ddq#PV Vhm6Si!^!VP*!u%<RJ\@ldE=C695XTacXebee\@bFZ%+Jy4*EbHpKMi1IRA:B\QweDB9W>W=?J#I1iFI
4/N:#@ +phWGHuXR&1@ee%X/npb1j5peXBE*iW^hK+=ee=bB#Xt1cpCZRPY8L&wWAp99bIIwyBJ81A>E?e>V6%Y
BN#EK8 4b4QEL\!SjYmKQI>!SA<!d=1\8t1YNJ\D4Rq1dADnjTbl%==?CVJ+6ANua<DMR%!:tjYRZC?AB%?1nJ#
Nk$N\L meQW@Nq6F^^!:by16#V6+n#*N9J*N9Pddj*GCmQLn1lad%5!9pK<JN#mR*=*BIX>iAFXw1*5pBX=yG8>
!>N8T8 KHpF<BqbKqd=mySAqLS<R$X=C:=TWpLlKYWl5ACwuV!Wb1PqNed4^tJ?4=lEqNwct?A#\De*JYD$\WEw
T1$6kN cLDG/CP#8\5*NKWX1jliBLdt+kV#jmh5k%1hPSKjjnd9q9V<qyKYKK8Z/AnR=mVyeYK*y6:FFP64pi4>
kBS@PG BJ*qik!^eA<#WyJ+FjQKdp6*tCTuLeA^weJ#H>C:tQiAWpn+=ciu4ptqt^9*d8HkD*Y8nqtT#@mybT?6
@aWXIR 8*Rca1Hq&^iGPM>5ieX!PkNtHniQ*J6lwnhj5j*Ihd5^?4EGZDaQFFRpGaFXK8B5/B1RKNaE%&ahFyQK
Vnhc&= WS@%yeM@FC6w$jC4%XD%FRJaKnkV8<pmcpN9<u8\MtE6M&jG8Z@RpXAu<>Xm<Yc6\Ett!Q<e=5cujM?G
6u:N+9 FCD#TK4*hY:iK#a>19Ht/^K!S!ZBMF!8*VQZ&XZ8@Q=DqLc&$NmE=qBX#k8X88Fi*1HD<uWY<@/18*B8
qBm8/c ==H!MP6SH#miVQ%keH%=^Kj!<uj>B@W1IuueK!AD=CmLRL&B@dD$<N!bIihSqpASy@9HTIH*SKE:klGa
ICct:5 WQhSXq+hjjG/e4WSQEcN\Zu1:GHqJ$4aLjyA?ljYDei+EcC/+^i<&THlS6j49mlG:c?QF8ScyJHR9E4R
HCY4%? >SV=pk/k&R=!w&8AN?J6ebpM6ATCI+ub1GI6WEaSetZK8*1h9eCemew69KRCc9b/8F6KCAKX<#\DcpBH
DbF:KG jm<wBql5F!?XcPK\/%#YSnld?8cWY#<QyX%64dZ6+=b/4RP$T\k9F=mZjG\cdP<4%SMDCG!E%DDB?p<=
Kq9=X% K%K?<Hp?w?Y>9Kea<Gd4kV=iplHA6KD?yi%Rw8cKnb^@m>WYwKAwuNL&n9qKycPl5#=heT^e!G1*Rndp
1TTEB> 65l:+j9i\lw?u$&EJd$8Zyt6DN^M8L#u#V<8@FYQ?J5bJ#De?#b?k&$K:nMDb!htG#FTk<p1#dPuL%:!
^%SH4G +TujnT+PL<P>E:y:#?aFMW8Nmn%hQEjy?+G:+cb4+jCA6NCVA$M/#Y*<9cmb*wmi8jD\/:mIGC/:h5E5
6h1uKR 4=$SXl6naN&pV?tMI5/BZFY+wHTn\9D/8N:E<^TkFjh:tnyJX?^$PKk8?aL5ldCWnL!*^NqhX#4dlpJ>
DLbVKA L\yt+M9&#1qY$M8S*p@JHSGy1C!@$*BYRecj1$wL@HP989?V16IC@>KM:1ybJ@mjK1kE+FiywBJ#hud=
:ETdAh @tGD:^@@G*WBPPV*LjV*Li#*Lj#*Lj@9&#?Ymj<6hRZ@YStYAPSQpY?B9%984=b9C$CRX<D!@#\6AlG<
EJ>lGV Ald/e!\WjAW5?PiewbC@^9JDj+GF@nWY@9PWtRAWhkW5+ljnlj<%Fkd@iS4w#=LnQ<FC?H?PSj\%Fm4+
J%uWZy C?\X@A1K?IYh4?BZWMk9:H\F9@yq/ky&Fej/iW&mAA#!H&Cl@\H&Kw/F@Hp/Bkd@D:D<@\H&Cw+F?*u>
QkPN%V ykBM+D@AI9<D4PBXuQLu1dy@%l\Z?&&K$jk?!:lw8u!HT>L#KTF+BZtlkkL<A4!!XtcYEF+qM\e:b^6i
kCj6BF M%+FK%>iXVM:>?>VFn&:1w\14/8qNeh9M>djyy:j=wj94#T<#D%@i$QS#6ul6/uH+5eEKTlI@/NZM?#:
NTRBLb JjPHd9N9p+GL8/YX?@j@A@@&=%?yR1=EFRpD\*/uKtu*jdK&M@j!@EH+S+NQZqW9e$e:m^@W@$*Y<P>#
:BXZB^ GS#JV<<QkhHDBRY8Rl9/Q+D&h&Q@EFtAkjq@a*<F%4A45WdA\jDjYc8ai@/6QTt9y/*XQ#D&+HY^=qZ=
E1l?cp @y/:^+@jRj<Pi>n*!@$Q?4<b@Y4$+j?D/Q<\@9j=E@4>S<tQWX!BQj>X&MME?AZ@jqJ1Y:udYj9?ud&a
I%wn9% %@hub$<:C#6Q*^@$j#6Z@%*&<P>V\A<%p^@G@*EF8kJ>^Q<k?6?ND^XEjtjP@>5w45D?Z\4LBj:wu99L
X@LRK= RwA@m5q@FAII@LuD4\Ae?VQSETV<@\8F=iGM@@ML!%uN\jcQ&tLPSc6LZe!:1eLSm\%y/5XK\W</=KNC
e!w+wF ey+N>#l!wwmJZVC+A%HQeARbJQD4\uJSKDk&B:$1PJSL>:Ay:FS%n%X8Pn>bIA=h5XTIEG1@\CkH4y&t
DJSdVp X4AA1>QJThAe>6i+q?jWn=IS1^HI>RluDwRRJCi^A#R5##6Gc&%6pKGaVTn?CW@WP?qJh?=YRZpG!i=/
ltHamP *q#F%:JD<Jb=SAY=mBlTRXHYkHNt&thQTR+/8ZSL:WAJSA!EcT=yDhbPdlK4Hd11+WAPPjiW5Wu:mASD
8++bpk Mi9lXGypB=\nHaEa$=6kN/ymS1/8AA5HthIitlybtJcclQKy+=VC=EbYDb!Z/=/TtQ^HGGXnD+Q<H8Ea
-AHd6: 000b7b422e3001202b4 Page 48 of binaries2.zip
H6ThYc <j6\9PpF=4h\pFj*QHn8%J9AIlR8jMBG?QEmldjm^DCJpee%Z4@?bc+Ecc#5nBGWe1:MXbXTR&Q4e=VF
Wkkt5L 1bI9/%K<X*4*yM+tM:XiamlS8D1ZMcJ^c%y%Y&A?uV#qQlDy=Y?NSYWpFSPCTh=Gdu6?QV5EQ%C4qwwb
Rn>+qL 5q=^ZSVMPaKn?S1%B8&iQbc1DTZ8?/\XBm%Q:%kK=waSXkaF#EMjet&Y/aM\R+$dS:pWq@DpipBLdmhc
+PpaRm F+<+S=h!XK<y#*8K&T/dhY<@$n>@DuE8i@$EWwYNkimpGmPw^%dqEh#Au6+amZ/RY%Yh<=Ljpp=H:8FS
^1!P:R 4w^cuD!^1X1D+Xi/TRH6/Cc%I8<P!q9SH:<c9ukwht@C5HGa<6Wn&K6!u=emjI%F@tan:R?WFQRWqDli
\n^lM: ?RBNVNa@V6bucLl%+ZR*Dl/aJDDHBm9#^Kuh#</=mJca>ip1&C*Rq1%i+>4uPb/K:&AXunb&:%RC!hqT
wX&=bD \FJnW#Nmedn$HG?Kh?#ld^kEH%qNZw8*BHa:1AA=IY:BFPpb/i6?LtclWuYu/:q#$e**^WIX!45Qn<$k
\V?+Za bycHKi+61Viw#BKm6W%H1Sk?eebPVFWL5I^Ta:1HdK9m/RK\uC4Rmt+<Ee?^=^^^VGLC\Nw!dEaG%>n#
dq^cJ* $tN=^q=Hk\Z\m1J%Xc8T/Q9+kPXa81p?4Bwu?mpy^jHDAh/dlhG/41De!I5$qw!d/ly*ZDn+W*A<5ELJ
Kab^*L !^#qIJh+k?Hp=<^Q?+BXp9Xy*d8dNBtQ5D5ucVGlQVV+u4ww%Dm9EFwRhayBl>j\nb6FuciLREcFP\Z6
YW5kk< X8I:5?Y9X64WeqQN&la1iBiukq#5c%Eh#T!knT!5^MNaZ//lkITpjcpMtGbnG/1ZYpKIAw55%yR=R:bR
a@@VwH /<R1iT#KJY!D6JTb!T/Lk%YBwi@<<R&ww4dHjTX=nqja>F$#\cy8nutNTP*Wb#pTM>TE/ii5$>jY8*tT
R%adS^ %I\wI^Z+/RL9!etBanHRZpmu+>IVHkpcnEuFq=1FpIWF^9LC*@5>\jS4pB?lq8SM<e=j*QQ$BdwFDaYC
P6iNRI S=hkNhn+WJ<bK@wy<6qk*%Fu8>pCN>aFS9*C+<:u6$4X6QdZLVKVc%:%>B=tW&Ry&<j1E@EWNPMGB4*C
lT&iyq n\9K1A&nu&X>!Ypw^%H<dN/$$NDXA:5#pGFwM&/A#F?&<kNha>%tchj1eLm%y*tBb9@/aGaE9T9uy+c=
iJ&RQ< iZh<VQXMeI^jew<CHV/F4^*pMDic5yW:W>>j#kK!&>W&q#=E9u#^4D=1YG68<y*>IT6A?:k/KGD>ehuZ
E?=W!V =%4iSu/RXEeD:pFQY+ymdH:6KqydS%hb/GcL\6IRZL*MQXFn*DY%?d!RnBDNd>w6h&=y==dSXJD1P*G@
FGjRF> /5T%#i96IYDFB6X<#&ljMeu+nCwT@HF?a@&i<w?<bL+dPAb6F@pGu:N<MB#GT$RC*qVVA!8QRln:#qh+
Pw>XaP yHBd/t6=KJycI*W\AB$5lTQq*T@Cw#ht+$eVDyV4DleJjF!JEHbFDZ&9/jQQ#:4ZAtC56DeJA=Wcp?Fq
W9>QHu >CKWTnwTaek<=?e*te6naetpucXTBjjtF8*a<nXnMlZie#cJj$6>*K>m*un$kuW$c:FYYT\dTMT=!9w&
WJ/YGe ABIbHh/QP#B15EM$<uY&be1ccIw<&HjnHYP!*dLEdGG$NVTSpti4L@>&k*&^D8hb@QVYG:&L5c!cTjwy
Mych:u kt6TE6nlKRd*/5jQbb5AYw1FpHYV8D89W+#Ek$#pQ><ZBZ8la?K@!8YKC?5Vw$WkePk1Z$wbLW=?ZuDA
Vm8!p9 \hkkEHj$nwHKZDNK:H^H%?#&R1TQ5t=$J%FhXd/iWPK\MjZw\+#5WpGqCGWY^uNcQ<e:qX5\%wFtTMQ&
nJt>%& K>W91*%K4cBMAbbmHlAV6G4ww@weAhWn%=%4HN1!Jqwb*I@<qV?Q%h>y5j#!h4+Qu!Ck8FSujImBHYLP
ta&:1M e@M5GC<9mR+*hEnV@AQFE@KleF><dCbEH!lWb<M?liW5??cGEpC:*L:qJN^WHH<:*81T5P9kHjk%=^M4
Yq9&Qe k%/^PF@Il>j^4&GYEMa+6&HNFLm4^*X/ZpDuHGYj#\LPXAGSXHy?dbpp6^HXT:8DNuj&6%5qkC@<lA8:
yJDNmJ ?M*m/tjA:u6F6qwbdBIk=?hymZ:ya!^iXakdk&Xjm&wyHRiYBBqHlD*WiCwa5%+R4$:Y1%AA4IWFeWRL
S%tm@j KJ!=&E@G=Ib!8$Z6KFQ\h+WVme+p5iJi+8ke$E@T91$66Iqpl:N@*dJh9/6^uRqQY+Db<#pQ9XYqYGG4
*IN1T9 l^HJhWjGaeId@A!A#m$E6nMP9$Li=@5$SkeKce:jenC4:qjS%h$P&l1dnIeFPc$KDkuWeNJq#KRp6m+t
>A!<^m jJ4?EFV:^6JVF1mJ6>ek*n9yG5*4G!&/^/&dlVb=J:@$dpq&*qn*q$QHJ\QTi4ETtKc1*1HYjJG^tH&w
HG#^@T >M+S#M+XaFuIYL^pnTLnA@uVSPWde1QW/G9:M^MRDMunb!iiEJaXT\XSR4=SP<Bm8iyN>G4l4kq\4=L#
HyIZpV B?Y*cNkNH@4c$aKGc/!FV/WGG\@$V$<Wu+G+>S\aDa8e**/*Ma6%j5RNI/qN\9*LY8#XI16NC%bZwA8N
$M8&HD Bdmljn9SFt$=%AX5F:BhhWD/hpV$DH9VhaIcBA=Rm:!\+IK?Le6tqKb:h!k=ciubTlkke:#+NYSSRdK8
:!jLHw A4>Jn4NVD&&=GF>IM!^d5@<DcE8>uFC>WE&EkunN6dSVN$E:M#SCciPGknT8<uBWFdcquQ!k%1m#ZHZ9
cE6Cp4 K!5cSwWC+5*cB5/AQNStMh14c#n*Na88pi&R!=ce9^m86X9dhMhD$\&wViwLKPdV%ThlD*EyIYNFmJXD
bnHpcA hRA4!T!<QP9L&6bb/Z%?Fb\6lcF\?Syy+!EMe^d+!by?1W#=Y:WV=bB1T=a\eMFhFeCwSZVeHTn%NelF
uN?dlW 4:k6yFiYVZ!YLehTmC<mYkblCK:%HYn\GbK?!>Z!#CbM!$/hNWSc&N^VkCtbV%$$?C**t?m/Qup65ppc
<Zy9^Q 6bwB/5FIHK#ZhQaBbjd9CiqZCjQ4FCPmL4cjaL5L=Xp4:qkAWq#Chwt#D>h4i<hu#@6:8%t#l+?+E%qQ
4H+4Ga qw9y9R/umB$D=GJbu^%G&S*y1pmD^>dYJwGDM&!X^4FM8IAFHk55*qA$!BHT:Im!Z4HRT%F+6qMN&<F?
#WPF@6 k4iEutDTd1jylj8cyb1*m^*#ewY6HK4!wbQ56JMiH8+PaK%:dA?WAyqA+!5P*lGXBi9:&8kSXFQnX5k1
+ECi>V EZ9lPm##8NKqV:yk<HZwmi>/hX@/FZ=E+yZYdBCDye&HTV9=<t+CmK+ByBkE4I$ukI8KQB</p&!D5CGa
J&l4Fm w&m8#K@S<b//El\?eKy&lNplJe8Xi#MRE<<FkPlCpb*A:uZNcQXGtGy9lPntYMAZN/k^b/cXFDYTZq&P
Xm?u=? =ac8Fc<yJybNH%1kE\W19>\YE%??VGk>Q#Gj<SKQD/!C>RuImyBnWRS9dbybV51GPV>!eLWnB!X6BVZR
6%VjDF >$>6*eZCPt9Nj\VGNe*BXcGE5q8lXlNHHKR*KB@Q&nhk:?ykk?b+KXB1F:^\R5bmY>PCJZG<cDJQ?u18
nJaIjK $$tNM\Qb<8nK#@#qt8@KY=SDXyXI1X:uV?yk:/y9+Y6kK\tHq%6:9CRuu\PK#:?XbXZA:%ZCJp<cXu=H
6lK9*F 9ncdBP\pie@Jdk4buJPWKdj\LKEQ+?TFyRtw#t6IC:*%QIquV6SVW%VX*FdB?KbEkcdVl<ad/94&QYW%
cp>6Ka AE$&eukdmNamBVePPNKmaE%a*=!NNXQAy&ZhcthnHC=TG/BST%+9LS$bj44!FyWb=W6YqFYP4R=$5=e6
RlZKPL h5?^><RC*M>MVLddy1Y%@pmqi8Nbwdl<YclBhDS%#WX=k4?iE#m5NFP?6CGjR?na#6TD6G=lMn@+yNkV
BKQZw+ LB^?+Kj^BtL<VpSEAi:6>Tq>+I:\pSZ/&4R8Th$/Mc<nY@^K?iL#wc^J#lVpyPiFSk4!A/Q/AM$4X\iB
*SiAC> <D!W>F9?R>5T#qaVuFpin#*L/dqd=W6+ed8\cTG8NZjtW*58%6wn/bdN+&>Aw4b<DZ#9#S/^9uRmSJBl
<<m:\R jlLW<qMcbFY4ZNK@\ew/5Vw*cyqHc:5TAkZCYb9I+^==bkA%5Pt=Sd%*<NVIJ/Ve+&aKQ1M<k/w\V9lW
MQ$kA! 1wP<11Vb8l91cJ#kciIEwwDm#GPZ?+ia:9CW#W*dli8<ehED>J?bMbkp+n?JN!!A:nyA/=uIt&R$G#!^
qb>enm DPMK$l@mPIiB<G6\a6RPQhTq*E!a5<X:F!*5lEwWlQSC8uqnn$8q5D*^SL8\KHWhEe9MV:\15ZThdu48
5&>B:% bA&tiY1h+bwTuGVc1Z?V$$>=p%*J>*SZjnuc8*S*!DGNXHEGqF1mTyeP8?6%\9+cyc>6S+nN5bySmy>J
RV!*h? cP^!y%b&wdK5yHJ@4#duEK#/eX^Py!E>6hq\djlq*cycKXd4Jk@XQIXw@6S>S@y6<>Y>YR5ulLnQ1J%S
Rypk\e ES6i=S6:bRW@CE#AKlmV4j^PCeC8t664@1E\VqmQ!k8k$1we!PJcH$8I5/NJWVnWYm6aX*b8K^^L++p/
dy:bp: cy!\q!8$N!X+XCha\JYRjnF@:p8In^&uNAt>>?HLSh?IwmZ/!KenIeuiIi!E/cudBCh=FC>>ud^<S>Ze
jTFlNW daS/^!<EYeT>#?C>YLQQ6#/nD?^1J^+/K*\XW^Rijpe8RZmn8end84^Tc>jcyit>w+DRiE#AM<9TMVL^
Xy%X@= S5ZA&P*iai:MdiD?*QwqWQEP&H&^!#unae+?eM$kVqy!k66&94F/nJ1+9\><y$==WLtXKXHEH6p$&XD/
qF%yXD Jn<ayLD=<8llmQZV!8%RuDA/G+iwy8n:1&@4uuPin$QRR?\XLim*t!ITmJwS+$lBI>Y$?PEYC!+GWH@I
i%B/K^ cZ^9jHWcm9#ywNL%t+/9QcFw9y^9mLu88@cuF#=>qXp\=M!KV8ybC!B9%*F4DuFQAkJ$5H^D@KkQXdFK
?%FtBA K@jj!C@c!$%\8+:ej/>u\atX!Cku*CK6Yp8hGe?S:Da=Sqe5!dcp+i55piL6^G>XV<c8CGn1X@$$4E\%
q%:@#k #uhCJ%?hApl#ht&Ienu1iSktbX8E1@5l&cSI$=F%/6duXEiteHFA=:!5b>?=GqZaq/IhN<Y*yZQVZIqp
F!dT:B #ZcPqC+VDEtWWW/A5$i^b9q:uWpDH!A:@4SKD5uu*M!Ct1um%Tp%WEidy$ywa<YD>#Y%6A4#M?^CL8Lb
\<q/Aw /F^cyyM?j^H#i%Hay@qqi^Qa8i>E$=DSN%B+qJ5LlqTcnqZ=^YIXYE9I^PDn*LuGPkp1FZ@4%lNJE\9+
YlTRAF kqQYELMmbFVcE6NnkLXN<+GI4X8&mPlynQRdQRQnmy9ZQu9y/@qL?JwQJuadblRqPcJX8YF!eItcwFSN
KmP\cW $NTc>KtTq6H!HIV461FKK6J8Tlt+PIT=y6&uE^JA%89ABI6HnnwclaHy4CbQbB^C^Fi>AIDGA\dc/WJ*
TWi@*& D@Ze@mwh&iM9d+YXBmQK:AQMjB>R#X4waV$ti98XS4I?X:+XSYNHPd?8?6cjjWlE:&&qHKiC>LW6t8dn
JEbdHk i4hIht^EIjak/NHud4aC<m>pq5W8/C#1^hkcQVaQP1W=XaGN<8>P#^%XW6L\8c9/A=XYqWJ=^*GMH?:T
jmlaVE $kQ9i&>twF96Bwd!SEZ5REJu:y#ZkjXhQG!tH\#R/lc=aEqP+4l#>t%NWCY^cRuw?96Ii8&5DN5+j:Zy
j5i#Ih j:BTIMBYNVC/:4?ZXTkVP*J+J>jt<bnMHW<&+\eDA?GMt+Q!LY%d1wVyRWunN1lwl<jDc\+pWD>+5TQQ
6:c@L/ >4&Dw\l5<@e+m?pDQXWm=GNBl&&*Nm@/RP+A<^Rt/M<qVAVkk9>nW9D<@>:C#@>TYQ<nBj?HX5ZXW9CI
-Ab?+M 000b72bdc16001202b4 Page 49 of binaries2.zip
PjdDM^ 9*%eACH\?^d=?%d\u%Q69$eu@!Zt?ieiu*<d!XXT:Z@8<jpV:C@T^@!\K&Dl9<DC@^4LL@n#%DM@@^Y\
E<t!Ih @L<aL?K95d<R6BdkF:kC>qjnSX+B?+8!lD?4/Q<bC^Q+8c*?4KL@b?\9$>aI!H<C9yJu@V#*nID>B%n+
l#ESGb j+C>mthBj=/LSj^q*kV=6:\JA5IL5dW!5?VX<9mSM@tSFNG^e:Zm>ZVl6dS!6QK$+4Y&e@^?Zjp*5&&C
^d@lhY *!?K<N<VQ9^ZTjn<5+n@@#HmkwL$MCmTHw1E@<d@C4!Sj<Xd+Ah9JL<A+8?yYT5Lh%@Z*^K#b5/Y@=C*
>4%dR! puI!5*Q<D=K#*%*m^\pIl!G8\q9\K4#laDA@>HjiW5:@^F9D#5d=j\Q4H@&:ah@J@Gl/<6i5@:q6k8wj
EFYXZu J<b@q%mD@>eKY!V+#<&ZBj/=uaKtucinFV$:lF:P&hQh^hLL+95a/d?QnPQ:tYnq+jtZ4d4@tKPSmL<j
PA9Ydu X>Zh!y5i<ae\k@KQH^PCk6DjZ$4d8Z@j4aDA*%<4t9*&E9dHdP:%jY@\j/EM@RqqHX5#V$MwFP^B:&^%
LT<@LF l>:P?Rh4it<4h\<:F&h/BC@+9^9BQ#dR@95I@tcaQ^n@RitjmMB?R8T*E@NjdQdj44@?<^F@M>q@&iV9
k+e=aK NwL@5+*+@<qG$H?lB9<JNVF/N!<:C\h/q?>&<dc#89QjMj#H<y:@akn:b=9\@<Rt@D<=5Lmbl=$F9aiu
mL5\/9 qc5H9dYLP:*ZXY\Ek+H@G\c@&\n?E\cIQ/iKaiD9q?V@j<*+9:>tjMS<CjB94Stu?c@?FL<qnR5aT5HN
W4?N5/ WVHE=EN6jHZ*4$EVLH:$y+B#aKFm1X^ZauMXu:CERS&CFwDq8++4wR^Jh?G^p\EGiQKJhW@a8$lZpJS%
5?p<Ce tHuBGIVk@NKqd8ltG:tTE%49?GmTn?w5h5ZbT<ER$8FkIaq^aCMdN8dkc^++:J*yEtEQWk\pTbaukkeM
PnP:hF SN6iHCj5HF@tPL4HTc^IS9/FXZ\/Zk*PyNEnJ#98EZMlkB$HqPB6HKMn+XauDnCjXJ$%4L1q1uE&\m6F
NLM\%Y FJXi*AFGGXL48wMnltRDk?caukimt1kBaw?6GWN=Vqdtqjkh5+Z4wT>9Tp^/lM4l1e?MEbMD+\<<XPcT
mj<DBT $>ZWS5p1iM#u#4T5EQ\dX5@=6M&\W<jFXC&EZ^t>$?S@<DJZ<yubTH1/K5*<HayHN#8W9eK8ARI#b<?Z
C^bd!V Q#PHuD<*R^tTS\X4pFN#<Cc*=RDWth5G65yN#ah4wdR$6M@XWW+b^d#^1w#a+PSuGEcp@nK/L>M<Y!c:
pi\m%j py1/^?W?n8qXN9dW&=VM%WidVkKZS#\c=b^PD5yGQLqdFySIjZ41R#FN%TjX9&C@XSXkRu^?4y9=<ucY
m*E#6C 6h16tQR6>Gj?&VbhlRFjCp@J4n&SijkC!9Y5%th!Me^u^pCI8ZF^FVHC+<tl*yCWXW9htb=<LQm?ZWdl
6HuCnZ dlmQP+8*4i5n%%qZRwX:K<<iK?nbc>WS$8JQHdu84Z!MhSY4+b@eTqL@Imdq+Y4^:HuAp4LG=iXKnN<*
mT=8?q &bXQ!dM:jh$/M9JVu:N*Z+kMjZpZP8QZW!T>d#RM6LTC&QGk*P5j6m##^JIQXVRK&+>Fh5nbPa/#%K*p
R:SVS# >uBV1HNiX<tVeD>QjNFt#yPJlyFMZyYNX<$@Xq@LFkG@whupCmK&JP<tM\>KHMb*XDtt4Py6^E?:wAGC
%i%bqT nZkcpa#>kSnB<9dmqGXa=Jp9&S&AyV/L?i>WW?LFc5P=GApLG1W#u/w%^@DGamFV=N?@d5Z^4CHq=^/+
!\\NQI kSGW\?tBS@&$?htJqctQ!@$ID4pYDiekJh<8>VlTl4IBJeJAi^W5>FZSE9I*%NeX=S:5puA*1ubjQ8bP
?lJSRZ n#<$S<uy+DD14GV:5yQWMH?$hp\=bdkuN/:i#<GcVib?^*9w*99CdTc8!a$CS9Xa9HAWKu5i\!BbtXT9
ny+%ll nN:T+hGbZ5LEDbyeP^Y&cZ>akLQ1\HXW<cV&EKPHE8=A=\jKRZSdtBeD<?\nbkd8dGm5uHYVWIq*=b==
IDe8tR %l/w:GTBFyh>X8imV!IPwk+lHm+uVQLQ1DlZpPDEw%hj*9YBW1^PlweRKLqq/Vn/mtZ8Dt/\LiMH9hH*
Zey#W/ ^+ne@cS$h9%^&D1%etNt%t+bVdl6CERCd$dimFa>Qde:PF^%uMD&mDT9**PBK>%uI$FBEIBcVEByqS1\
>$n#Ik hmW#Pda:N5@G6^JLFHn6!u$I\pqD/ZC%CQByZhI$:nw?wYL*+*GZpG?<w<K+=u&H@#:1iS%>!&R^jVqj
K\nwY% !wj=VqT!5WW#!G#<Z9+:F$*:k^MB96e:dXS?^!c#w@^#S94ce/QuB^eJ<hN>iHJ+:H89de*K9iIcAF?R
bi@6ey ?YNuwb4XkB#mmA&/Nj*F8CMY=/Y>#P9M6m=yIZK+NL5jRu1e*GQb%dBy\51j$J<@hJB#XyKht:K%m1u#
?eSbjh R4!hybitjBC9ET$\R:tbC*:FY9CqKI%hL/N6EJ6&bet>PEu6!Y\EGTK9jKW?#N4q$hCAwJnpVw9bhyKp
R9LlXV >eD6X$aaVWpI1lt=S#K&Y8kF4F%apm&$!mqmZZJuET5#yW4TC$5%?hdDmjMS1wEe5qaFdt+mNX8Li?dK
1Id!RB yNnp@e\t8%H&F1iE&PV4%nPq6%Y1H4<9ZhkeZ#!VCLD%4RTS6/Cu$aT4!deBAktymjZnKc=Hj#&AR#6W
SMLBdi FHX$k=XT@IGRT#1V#q*c#cTRwh!+>a:YEH^Y#P:ID/9cVhj\M6\95qMEB6m6tZtM1YL=+1jFjW^G?GH8
*1DGPT q\=il?4Y+S!$6wWYZw<Se??aQ@8e:5:XNJkGm>8WADN=H^jEpa\\c4bP:$A%L8>=XhHM9Yk=5tH$1DkL
JYQPht /8/RCj8<cYShW<Nc5m@jhC^^*dGeQ<:E91nc&WGn1CI%GKFDRJk#cb<4l59bP#jHb$YIc%cV1li$pKb<
AG=cFL /Ny6JC+&>1bXd<d\R>K&GNX1S<iPk<=N:4=1k*A=jc@Y+4p#$m4A<L:V+@VDq^W^m$&pKP%diGWT8P=q
qMuK>Z 5bDq$Mj/PiVn5Q9%N4bmZ/Qw*n9&#S$@$T%a:n!:L6#lT%RX%nbtZjNBa4bZ+=4c\Xm$ejKH\aiGRyWH
C#cLlL *uTudwAF<j1yh\6PI\Z$#6J^T^VP%JupRVtQ5B<+6N<K%?&tNlP4Lbw8JbSwLX\1%DT\Q=&ttN+Y\XG@
u#FG>9 j<a@HGj>8ultkBH#98+%ce=>&b=^c&/+\n$JJ%FR/q=/nGQ$cVi4h&WbpDp\=+u%TL+\XaNcHF:BRW&6
CeZutu Tbl^H&&C<9c&<D^9@?Jn*Sa5tj%yDKqBDw!#qnh8dt$+e5b$D*#y/4eHa^pL1SbQEnFkIX::>Te/um&B
\p\6i8 I6SeYyQ%e4q5mT:^+Z:!E+F\i6u\A&MKmZ59ct8Lu5udM&QXPFiicuAie\di\MBT&^NhlD\\ad6iZmd\
^b^p6W m5#RZdJ&4u&ky4w$XQHm$:jG<*$/edHyi=qwikV*%FY?KI>>:q/y84PQ=/pQVM^DQaDHR&Hm5nP?44!5
Zw5kRe ^Qb+*b=>IQ:w?#w:&dDlZuXeZ8$CbR$mR?WCIei?ANW615:R:4E\bCtSy!IAkGBCcRP+#hCt#cR/AYE$
l8b?T+ !yK+^4bN=wWkSD>8cI/n61u=6MTQFiW&&IZF\h%Y\i6YB:y8ljdY/=YA9X+:VGHbwLbH<wt&$bwi:Dh+
:yWitm 5iy\tC\>5alVR:LDuKkRPKhc@akm!*/*RtuPNX6*CZVenbN*HJX6^=d6Kun+wic>EdcTZL5XiM6F!let
!d1aH< dGkFuIya8NcQ6@E#JPj:J:HmZjw4<EE>?\%*6+AI8eVk@pI>VkbmY>HRItCPe!tT4W$!dFXbZlw&41=<
lHRT#: /EdM9C9J5h$4Y>lN9IcFk>4uQwp!HRYYWn&P+a$p6tWHBlYjVN5Ppn?!nLBTk1yndTawZ+aQnMwQjDk?
edLF$? ZwpB6jT!kI:eDA@aqI>*A\+DWKBm?C:9bBDPl^*i@YlbSTe8eaGa#kNy8LW#Bu:IX?w^1li<?T+%idVd
l^W*yW LiJ1L&kmAp:ikKJ6Jh<iL\cVDIcSBGGV6Fkwn+Qi$B&?Za=lZ+!&lX<TKG=nSh!yu4jyDRw<Jqcw\H1c
\y@aA= !N*4RuhSRmjAnc6WC$$9T9$\hQL=VVdl*6&QA+wJK6MJjdFwjK:uy&nujacP$98jRE%j+t<<eGC<\BZ?
TZkK8y mLbNcBj^tG&*hnMdcGP5+PVi8NQ=tWiP5e4#m=\=Nmu8ZcLinD:D%p4%VNjS6ly*Y+ZJM=^=<jB6lWy%
MFuiya m?GVWpZN>#Jw/udHGm\lP/RL*JPZbdnejiw4H#tb!KS+M@I@^KP6j5K$VGW4j<^BlYC6k=Pi?4L5*uNG
<BKq*> myZaJ8Peye8M8>u:*!BhHA9&<?^Bmd>=SXtRLYyPdIkBNeVa+#1>EShB^tkbd&b1nX<$D:KnTa5yFtD!
l?k\MW ltPBWEuP$jEqEMX&$mM5=ZimqldCN9tq9C::k//L$^5uR#I?>uIuD^S+L!^4Jbuy\*j\lGRWq/$y\RTY
!4/IZ1 qS#Vcy5IB\6uN&b^\MbFy5Y+bZeLWn#%<5$:uG$dZH4!Z!=aE^D+*^56@%<LpQ?#*QnQA8SICQlQAZIp
HFZIY< ?E>4%JDk1/y<@#%\kAV@hJtb\J>nw:@*RQ%H=i!jS@9?4BV?b?\9qMIF@1\W@yQnIu??qPnQT8E@\eJ@
DBjZF/ LyL&b/Z\Q&Q=pV>jcjJuyjCjaBG@\QJjAR9??c1eQ!8F@^u:1^W>TIE4aBG@\CK9kIZ>a4^Z<C5+=Pha
inH?jP \T9+Fi\Z^^Y<kq>BBZ+?Z5E4?NW9\@YC5Q<EjAZQE9m=B4&AIQ>@kL&Cb@%nkP&j5Fj\4F@$&^WRSF:q
l/jF<= DQ:F6!V+d*NGk5H@ASd!H&Cl@\EY>l>k+j<B>ky?Baj@A9594Y5F@8m4@Z8\G\EXwPj@Qq9>TK9?H8#?
!BG:RX ?<1S*+Lhj=cVSIIF@tKjj\VRwbDj>@qH$Q#HQtH\u?##J!6VaDDaFTR15Z9M$L4^icpJySp^E:Jw<Bpw
*P<6QB 5VBPBbWydRRneA5mjNdeiiq\AV&RuABd^MPaEPJmP9AIEW^mWE4Yy!%GpFl<PIqahXwCEK!T*=PR#CmP
189%B@ wAG8YcR#1L+kCkSJJ$ZFKlPyb$uaa&Dp^nXw*84y\&TRW=$nal^DX&&%lNLl$\*$k&ZQRPJ\1mGLDTVD
4/DVud 5DF?68J&9quYh4M\dZS^9KE%&#Y=l:FdEyt14#kMm+KK1aau&R$\1IB5FM5B4SI5%SIn=pHF?Rc?=HS>
:eiwi\ VGbmcabR8mmR@6GR1>Z#JRJyCVFW\MNK1tQq%u6D?WPn!$j>EmT^D*Mk=Gu!IiX$/%:CXP5Fi5>B*P:I
k:n^eS 6:JlijKGya<LkqRbmM8<:4huX81KGVuAd+j%$$?e4<i#9>E%yA/VI%m64^+$EJ1wG=h9?qKHH8V=qh@<
*C::<& qmN6KGdPLn!&B+umCGZwFTJ9C5dhFAJY?6ehw<6X&@i\&j1J$nGZ4#kulnG$hnjum\Za6<L\Z!DG8!9w
H\w\lV &GjkKmPc=QmB58dW&JkT<h8l+I&kbT^$lVB!wH6TJBj@$YAQu%Bi5QM/KDFb<RYAeLb*QTc9N=</FDNk
B\MWV1 mV5WE*hGqHC/%WIAYj9MX1B?LPiNaAmb4RYbG4yn$<5GpGEJcmRwPI/!6#8pqT<G*1t/W*@MI4wPIu^l
X*KtwE 9D>F:1N/T^BW@k$p?DytHV4m#D&?%=RZI$?8*mXqA^apm%nRCCYQ66QXe1ykZ>iLK\kXBhabtBL4mcHG
b9leh@ ?ACXQNjJFPMWHHn:>q<al\lC$w5b+SZC4PHh^HXb&Q\i1kdPnW=nVHcKQQhcZlm@y>J\n16Z*>=h++t*
6!W@1C EFcwJI5Rj8Xe9E?5=8S9C+<N61dqm%&M&X!J4bS1le$ETpPFR!kZ>he6F5hFw6bia+uFNkYZBh6JpyA9
-AM1XV 000b997d1c2001202b4 Page 50 of binaries2.zip
Lw$!%c pL%&L!<IMYnPQ%$\RXh/4:8t!?RCW8RbjYEhPy&<Vw\uhC?j&DIB@yHV?4%%QLFJdt!4>kR=/H1&C5%a
tCLmtL peJB@a\StYHe<k%PdJ$RLt\=J+KZRMqn!lq!dE!!?GWXM*9b*YQ1q+#WKyT9!J:FJVF?DyGy=L=eGBja
SKk=Le 6RISjlFknhq^N9w1%6KE\/WPeK=pj>G:$8:W<VdnjTa^Q1G4DbtGe=YDimmtmSQIe*L6hFMFM#9Q9b?n
^BV9<W #jcE:hD1BnHKHZQ?DIDiuVtcw^IFC8pc8dei<9J\quHYJTkq&yT\=+:l81SIkRDwnq<:%iG^5cL%t@+l
maF$j9 LQh?Gd9S8\VbTa>pI:nH+m*np&l:9P</nM/X=Qukp:<D!$hJkVkpV>:Epe!b!d4qe5+mq\KVNP^&*dn+
/J<>p^ VqAq6KV*FId/TdwL6h$ppFal?C8ddK^?R&Vt/n:E<?S\+6=lP4XKmTklW4AAi%c5u/aDiyeILZ?lE!*i
t!nmAa HBBC!qciHwJQn9<T!i=YZPH6uc!h#KI*\MAJWB*DiT18aincAAFw4<jRQn&TBeSQ$GA?\CVd6=hI&BQp
KI*ep# /u^%E#Q^ARL@mI^>I\@ubtR9<4l98iXD!Ea1yuR$*p6#yKY!8HbG6Wi6c5#VjITdX9p6BZZehaBu9yeB
5B@NF& *B+^!BCI5am<n8qD:!4ZLkynG^@WYuNK&p<A!e61B8q6lq5Pnd%?#n4BRPFdKRZ>LDIwkM/>VX&h6I@R
lPy>/Z HhX8/<%QhuF&tu6LR=:e1t=Zal!HBc+85e$!E!>WGK&SHII*NT/>4a8h/WwW%q6?W/S8+tPDl!!hXi!h
*!Ny4% W9iI:iy<ISeG>NJ?ac!884kP9Rc8Y:6RVl:P=CmY45=p#4VCJpHuC@MK1#Nm=%DtnCCGW9Qj59YwWmb4
S>5h*R :ukp&#KyHmPZDat%:6?dj/J>%$E%mkdiw8>+!lV#EwD&<1TK<6wNCuq%?dntiM%m\!pqQ^<4aNj#c8JV
@$ydQP X+NkFZW<PX+lTk4lVHJR:t9W>h8TytJ^JIXI/%^9yaWu%&><&bVd@lVTeGL6LA=QB5p#nAWFLB<^$dMu
*R5mW6 PHl>KyB##Tc5cW:l/N&1wNhVt8>$6?KSF!$KiGY!cc?JQN+9RqAp=ynJP%W%MJP#&jHa^t?&JGwHFtmS
iVmY>p Sa9d:HKwAI+Yk>AitYwI1!1MRl/HuD6Hel:a+FAPqdSRK?eeT6Wmw$w16c%G%eRCSeY$/9G#N+:dnM6>
y+Ic+Z KkQtGwP%Yw$6u\HKHPTV8@yND?#I:6tWlb1Ja#YN#jR<NTldF8u#$9h!whl9=t^Y=?yEhjLIDW4EJC#W
:kh&4+ lIXpnIYi&d1*tDY+V1i:$8:aD/*BZ@qBkdG=6d+WV*i%c=8>mGMqK$pY8<ibhL^j?MCX?dj=hi4cuLm?
*y*LZF JPVIZ%c9iMSqYh4N%euVCa\8%9W^p:/5\!FSb:>4nE>8MMk/+NMV@#HdF+>kmn:q=d/IbhTu:CpM@@B=
Cwt6WZ wX\/Bc<^DI&H/F1ldNSaBehCnIHD#TwAK@deJd#ti<QE:DbpV\>ia!WMmXF@&b^i8+#HuJ#EjZ>#C?^5
G@tEit LqcL:$<D\M\%j=VPyiE9>>1/R*>SjbG>&?biKlc^#NB6J*d^=%w%b@8VB#=LY>*qIP@IuGjNNFqGw<T%
cTq?tA 1ewQqq5^$4ZYd!4:cej$=%t^M95>u!Xkw!1\>wi@Nc>Xhm@kqKePKW$B8!#/A:ThCCPqcWmnhiJcKHu/
ESt^\M :$=+d!db%CWLHL^9bTme?tT+w$lZYT+tWM1SW@q&Dh#d?=FQa<NMtjQNhiY=5Aa6$tcNA??dn@!nYRZt
p<uPa$ aAc\#&KV>YHFBjALbK89a&FFc$@TDnCFhh6D@>!>\W+Fy#y5bZ@yti*^%lnGlkQG\J=Zijw5ca<mc*i&
mPZJ4t bA5iTmpe+%WYQ!<u%iQP?a\18<^n:&uqt^QH49nF4BXFn?S>cb9^y9LhBE%HiN*1dJ#\DGcQ^KVZa1jG
IAHKkc <9hmHE!iiJMqTFGR5S9A8q\jbSJw$uT<n&#h!J&<9DNnG/Khi^jkHRSk8KZ:YDn:Gb9Fcn!1$5:++://
d^YMI> %5IEq5FTq^Rj51/jZ/M99LNFTc!XtNZ=heVJeQ1646DJMNMYhk$QqmL^hd6:@wIt14Zcqy$4$LjDLHp8
Wc<dDC L1Sj$q#QM=@Du#6\*ipJp?ISYV^umS<Tae1$!+=ac/Wpd<\!AQb4L1DV/bGb^n=u8lQNNEt4wlTjKVQ5
y&=y=A VcZ&d1mSME#8#6\/?FY\bGVkES$Q=@q#lL>R#18Q!q\W/RVlX149#%X\tM6KA^/FeQIV$l54Kwd&Kl1Q
1mctkH dN8GKZb6T+bKk?#:LC$/X>=M%Ed%?=qdi#6Juh1CYB&*HSNDWDcYpp+K1JTCZt9y=ieuhE:X%FmA#F&t
8<99y* B^k!8K:X>qdE$8hlGFdT>lcwGb^J<TjT\ntAXa5VqK&16\*PC<#Ty8+6SXQ5qkJYGh^D+D5\4q^p^$k?
yQ<h*N 6=H$y&MX<t&b<iPnm\*i1J*np^Qqp>RJ^%^V%Ja#NcGX8!=:8kGu?^8mG\u>*8FdNI<45/6^wX<AwC$e
p9?GQl #YP4APCc@8+?jKQ\KZd==l+*5kJqY^HbPdJL9pyMmu<5c#M/TlmGylA8tR+kL:FFGiSLpd*^M^<$FC!E
/CquS$ t%kYt\+KW9V:!AhMWbCaH6ldWYAhSnlkaFjV8WynYMalT/bWu^eYWTqTIpIQZiMbKBTJX\+\855\CQ8h
^=AM/h I/ZLk=!R%4lSw@*hi?NjKXYSnt6V%Nmt+c+9<Ra%1Qyp1K1YZ*JPC9M59l#eNFIFChtiiPi=c%mY*CSS
lXWMw8 S\a:I1JS<5GypmM*EmjBZ98j4I5A:!$mkM=*a%YN/AtEGpLY$@QZqTS5RYE%>K^a%9Vd<bIu!cMuQwqW
XNGyp8 KmZ1K6n&Cwu1R8!=nFGI&pT\SC&myE@YGh9WWP*!ajtwHZcDF>V+m+QW#eG58tqwLR/Yn=I%$Cpt!J$W
aP>1GD AWW6%I4Q8%dHKh$p*Z&D#u/yE18d^Kydl^M%H^F9Fc8Bc^E^>/cc@<nT/+%Q$tqdIyP:QhniXk%886Xh
8dDtLw a4thWS5THHq*KdS6eTR^PDcJK>b91hl#cS?MuRnKQH*JHS1lE\6jWXJYPF%MnHX>nyjC5yZ@MGC*=uTD
eMlnK< cZPHYW/%GwcMXLFNi5jFDRM4Ri6iVPNH1lhYVCA4&W?$mi*4InH^D5^kYG>lpdQy8%u%mdhI65hBi>nW
&Hl*1% e5^%$c!h%hpbJb8JM4GpcKkK41e+BIXbbPc4p8R8AW*acIuA1a/wdhb6?>Ibq$=H&<4RRuYXW&cD9P^^
Z%G4@* ?X+B:u$:ZM8IjnaSSX=:&<p\1@=a:Ab:=<88MQ!b&HakdybZ4=K\=HqWMmGtQPP/LAKdFD>l@NK>S6\5
b4PE9W wlbShYNeXn<YWB%imC$lY^qd<%II5tdEjb6$#dXZ6YN%Fn>!<GucMi<4aE^ZMl>SPXXRZIN:@8Bb^E8S
#qY:GN ZjwCNkZ^dXaR/K:J4u*\M+LdNc+S^aydJMcJEcQAat=EHb@Wn1JuBNLGa#p1y%9F$%wmW6E5wE?GRHHF
byZdwc +$m/iDFm%p>IDc5/A1\VMF#/D9<qb>AwbI?$?GSbX96<mDuB:TMGNEmQ&!<ytu/%?DE4S?bFtN<C+aeF
a8jZH1 cV<%WGG5?yyRVlM&d!IQ++&jSqmSaMH@k^FYJPRZJek@=C5W:C\>@8E&Fku=Y<$PE9c*ZTH=j*<j?djT
nRFA1P GEHw*&kJI9=Y6!L+i&hFCBn<i!ELBA#>I/n/i!uQ>?Q@R:H#V&=n@:uD\=XD\DDEu$LAMQ:@qSyyJA#<
At>$TY ?&n@Qt4w:%9aQ>XI@@$??X@8/Q@eZPL9=99L#w=ICP!95d?IE!Ml<L@G@tn#<%M5@^Y\A4@AI9+c!@@#
j@l^aC :n@IQ$8*@SpL@^WYiRW5@Bha\T6kj!/@l9!#hN8j5dCjT<al@!#h>lM5:BjaK@nX4<KtTPlXHA9&m\Fj
>c#ty4 \dF?KP@<FH5F^@yFq^ap>A1PlaD@@ETCZ5G^j6FbBkt>mtMJ@GK<X*A5GPLu^+XhTYILDpakEL\T61+@
uG1uuL Cub=aZ@IdDqd<p4=YNmcPh9<iQqDpPnj4NiFjn>uj8Stj8R4jnV8?e8CZTV5L\Y*BH>V4lIRAH<ud8d1
HPBZy9 ciZ?udc#&S>MieX?%Bydij=Yh/#1dtX6>j*!dtH%d\5yRd>jM8DjL?%\Rhn*d\y<qTFA@+eN+eiXC<d@
+ynyNE N!p4GIL@KpPA@R<d\w<!i#np6&9ln=FeaRV\j+=d@@*W?Y<K9@?Ij@?IY@Q@8XAZ?a<cj*@E4SFk^Q@L
yF&XE5 !&T:5Z+4p\Ym@%atm:8iaN64#k/NptbCF=9e!/KPCRWp8V%BRtu^5dBl8iEtV\T9\+Wka9H1Sy!p8XkG
D!qS:4 aE+<l>/kKyndGK5EW?I<F5uu>kAK=>1q\b=dSk$p*5$LYDeIiyeSkp@<\QAaZ5aC^WHVj9I9%waWGhT&
qd19$A #:+q&A=cNtNnBCQG/+ICWPSlV9TnC&G=1NY9&Jn^KNa/XRjH!:ykP5+q9MMNH+:Ga+K/i5mB^>QYNnYl
bZy+4d :c$CltLHc+AEn*q5Dp:>#G5e?>HM%$RhHt*R!ARGN+*A$FHbTG!GJFqwdI<man/EEGqPl+$yTV!JP5*C
<mYCN% IA<:uFHnGeuVHSc8W>>uuyIQ^q%DE5a9#lACwL9hRuJhMdR+aYcwq<SNKQXJt6a!h*BYi^$6P4J$4<tS
e<Xjp$ 8lI>E<EJX56d*1^J1q*<$d:Jl^4!=ltW/%ukcPpW9^KBlWkan/waFJcdj=%=41hak^Q%=5mIWE/L>yb\
*9qBpJ %?5WR+E+L=kqP#a@PYBPN+X+jp4PVMECKlCSjI$*VuH#GDHE\?Jkw8ANM*EPyi\$$NHXp6DT$\/?X&d+
J4GJ$p \584CQeF&QWF?@CekymN4nh*&?ZKNX8%c$Qe=^q*8w/aq^MdK<k5#QS#HYpwVZtTVHVkH:aP%F<S*\wW
+c/^pB Lap=hKWKl/MXM+1KBe*huBELeB!itRVmePKVEb<KQw8NEPNZT6#Ric^M+dtV8iN?iCNuRue<dDGP%Py6
ZmiwYM ywJ8kIEcFw%qCSi5u9\tD?np*Y$&lYe9#Bep1FKcbuaVG!mJRXRPIntltM?plHjP/We\Z\TD&pQtK8LZ
FPQ1=H lGI$HF545aquebi5DXA>uj1=5Wcb6wp^W&wN6?IelZhjw\=mJXG1^STmtk&1@SwQ!/PnR\u4Vt@ymtG:
^d>dNd Vy6XP+ZP\P6Dn^ed8=#5k4BF4Dc$i8c?YZpcW:t1td/mEu=*b@6#RjMD$Ih4MiT?q<w8H6mWwjYSwcRT
K5W$d% Ft6A9aWuRlQCFIdEip=dwRe?>$a5BV=n?8^Nt#%?XdQt1<Q!h9:VuRK=/jZuN/9QKjb4JEcZSIuDEWN/
Y+Z/hQ yPqY>GMJ$MuJ$PpDb%lq$@n6>i\>^ZWnkjEyIlaJ<TLcdu*uCQ=c&9+\F\dc8bD6iKGtqL4XF@58iuEp
>*b*KJ pP=6:\iK=@:<aquZGNBR%>BSetK8kX4hnV#+yuiyua4><HpS9eETu6L!KuG+IqlXlLFA=cl1y@&Ya89q
#nN5DD ^&+N!4^>ZZ$yS6iw&?SDGb1k>iq5bF$TwRGXh8QMtHS=5%%JM1Q%#G#$/tXJybXG%ueyBcVb&#YGelX1
PdaV@# 1Zpcp^DAyPHiWHSi/5GmM1L<8=E&ewjnNcHF9W4Q!PZa?htR@Q:p6L/%t1Cq^$$=1neT=i$i:p1?pkcn
G#=%J= 8q:X81iYbE4#aI4P4hTiJ##5$A#uWAFd?Fa/8VQW!Qy15EVBJ&^myBX\BJJDk=M:M11AL?tDNSPB?>dJ
McB?Dc ynuZBEP?wG>Wk=tX:>%AFpui/$LJ*mu6kQS9HXE1ZyBt:@4/kMMa8NJP#IG=GYXDu+ZcS@h1kWiE#/6C
8bQGZE QkRdaEp/Suy^$T?RXnG1ikGQ%L^bPNphyk%5ucSLk=ww/&^yLNi^c*uDMEIwG:LIHJ=8B#bN#mun&\dy
-At$m! 0001c8d113a001202b4 Page 51 of binaries2.zip
Pj$N5^ tHTF&jdP*BbJ$aAmn9b/u981#?SKJPjBMnFq6Lk\%JdicbTRI<K8ViJm61:=PCi\l:$ndnQ!4>hPGCQQ
Ti=pSC ZmiYGe&hEAWt*8JM+S*T>PjB>Z#M^ep<&/j+PXiFG%FV$Yq#i!:H<HduGD+dT=1E$41@yuTLXKQXi^/N
d<pPkZ IdIWl6i1$:aDSpa<WhmERbAmDVu4e4Qc^Bki4pJ=#Y^HNQb1?jNcDtn?IL+1<9dYXMIeybdBdKJpNqwk
4**?># htN1PC=^$mLR?&Kmpy$QTXcuubK$Vt4a#>\@1k4qSX8lLmIN$J4haPBJ1T%/Ecc?/#TXphwR9@lI9?:h
catI1/ $6NqIJ>Z4nDPiY@K5^4#RV<qtQZKIH&jj=qa?@p6qk9c%duViNJ<kZdWDyEbtmE&>*+lB>Q=R@!#k>bI
eVZmCZ kFhuAieIKd6$95eWd!Z4@EcJjy:Z!Gh$QY*#>BZL/GLk<cPeBRh*P%/8P@EdIMXIi5ipaNikCkyA%cH:
/\YjD+ mW*4:SmQ>W<<\#jFPT=KVKcGQ+XnPqc18>Z$?PR9/S+cpSGt*wD6G8qa*t&&jyF8yqR+ANuW8Wi%h&@C
^Q*CM5 k>9:EA1RClq%>QGwPYKeLe#i!yJ:kpXI1MdCVEPD!YWjNN!eki!VI4IXn5FhP4&@p/iZ?#l&TQ#5=ep4
LJPGV& iSL:t!@mtnu$lIi%*Gek8*c#kGF@#mPpLY^a6$THSi@tm6>lME?!RKcT/=/F:51:$=ddI/?M?qMnK\$a
XiL#D8 u<+^=EQ5F@p1JZnn8=+>QS+jL4k%Ptl&9\ww$NJ5EJe$?nI+^AGGEja5tWQpVhqD<&#Vc/a6a\^F<BRH
@SQD/D B@8ZVi>/RL88TiQ6%P@%8NJDJEE?&GcmQFWKGZM/unHZZITKMcc$Z1HX+G&@dWXE6Rju6aXMqK^y6G@8
\yLDmF Y#N?WHdb9@jMb9mb>q*apyekjV:!*T%Vi!u^@WlCFqu==4i98Q#R1+YDeFyPuw=d&t?ZKw9=Mb:4NGVt
dGQa4T S@l15VByy1R/^G/LXTM<5nwuMXu>h^@=/lXXbm$uHlDd$\&JbCw@heBp#b/8Hdq%bp<<Fm#J^1>pyc>m
D9y1Vw &V4Va6q?yHd#tXe+>\!lD6?ni\j=*ujuBD<#*&ppPdCqQ*wP<56Knjh\?8Cqe^%:&*L!d9%PRM?P=ZZP
LAWhu8 h:Ykti6/:4*QaV!d1>pS$tcj/ckPk+pi\#5!KwiVh&%VYpumYXPh9Nl=k^aWN?Vqa$N<T1n*M<$@Jy$E
BH8?4T CC+@P*WWiPTRPPP\6lc1TSIjM6DE5=DR9J^V1GkPPYp%CAK5aL!dy%!PI<Ajl15<=*T<R>Q?<im>mPKH
qQ+1Lq W=GbE\9lB?FcZ6YXS5G#*tSe<d\W\\?eblGTqC$qRjKSTDQC<9jd^J%FH^S*iRNA:G@HQlZ*8h@B<hSl
@=FH<W /d%46d1KYnX&YZ>kw^:uqQ++^:q%ACX44b<wIR1#^BjHGddAK6dH%GTW4=X:a?1CcW=+%ME9l?<VIj^&
^yLt^K SJ<n^BQbuVW&an8PKaI%KZ6T8y&#Yc=E9&bipMp9VYPQ=9lpn>KjRL5/>KTth=1@^%!8V%LF59lb1G%m
wD&8$Y BD8@=CCCnTw1jnCESSQjhBni6\FWJw=^:VVl=K+6BW!!p5PJX%%XH\C5%1i\Y8yNdiQMJ!YDFmY:FcW\
mGu<^D h1Wpl9uEyjuyDREFhNKY>8B<X@BGa88^wtW=PB5LXShFtnhk@6JK6eaWyS65n4I!w8luXyCi#4EeukMp
H*$ZE# Q$j4Z+KR+@clTV:qb5bEE=aC$y5/1#Em&QLh!BRMLe5=T%pwV$1$Z$S^EiP:IlRQFay+C=q8$=V1==eZ
5<b$$j D!dw>:k=G5Sj=G\um>W$LaSV^1JGi?#qS!R5u#yKK1BF%S^YD:MQJqlXj!#=6FP5C=i\81pa%+59&85w
:8a&Hb Q*/wdG$:c\Me8cp&Q*R$Hcq&XqAiX+JV&RKpG!84c!mb6n#p*mLCh\\&h?!6^kjMX6GQER$b&ptaF:Jp
81\*a> \5Q!Z=Va9:V&HJZ&hM<#9G9c/%+%9M91C1#aAP^RIVk8=\:YZRHHbjm:Jun!Mhb?:wR6+\MN>1\Bh6Cu
YA\nLC 4qmW1*%jYT$pGJ*8&=Itt=B/*&PnbW:MH=V9:/D9n4CpbZE*uiaeaFKXlp#K!&!\q616GSjhQZJSAG!I
a%uK&T X>Yam^Q4KnmK!tEXG>uLb1kYD&%JG45CXHlYS11hhWCu!9uHYnmWCiE6qXPXQkHY4<MCE8Kyewk66a=N
K1VJ\% BbLIB:ATh!$$9+!Zcp9+tFj*AH1EaP?wHuqk9N+!BM&A^Xu<C6<=#%jeEjCA\+9>tcTFAFIIRDDuPN+e
R*%l?M u5S%ek5w46TbXpVE\Pa!LL?EEW?h$B$*u\BSyLbHW>/6=LaY1SD@yPIYRe%8<M=FB$S%bK&QmcT/wIl*
TbF%mW JZT>d=Pta$N#=QDlhTjZTHpD?1q>b?9y6?^llkqDKE+XWeJYPn:iTLW>aW=*Fi:mmNLW?pLlX8:X<=u<
+SZ5yT NwA?/M*$G/+Lj+LX6RAWae:1/>y5&AqkhYm:C*l&VuDZY=K=KD45epQ&+q*acy/<F><R=$:WX/K#4@dK
Sid:Em c!ikYn/cBGiwBjHmQAD1V%l+ATbZaT9?Fl:&m98>jHJ?Y>!qTH^IiTj=:W%ZRKj44cn=ea><iheMn6In
KV9PnA jKl8kt5X*Hd:>qM\ku!/bj5&W?tmFXh=G=ht6TY:P*kXCH+HtkRyXJ>mEW<8SQLJ5&eXYTayaApHK<FA
5/a^/K 14548K<I*>QwlyW?Kd#GapN1=waBT\Dea@EkukQWJ@KVYGG\Rt+IR=m$*XlbD$1q61nW6ynI#J9J15Nc
6yEeGb N:matc=na$YldNtdtSVLJHMtedLqKE!8#bpL1wYw%yi1pdDjZq<D!C*w%GR?ltS@\Z5lFGdaP+ajK/?i
EP%Y5m #mT1bQ@>hFCVwA<!\bwjLh!GPiu!9%5PDyX$>ll>EnMm+uGaEKND</\h/XcKSjLimNX=+A#4TewMHi#V
cBnNcw I:jXjdj%@CN??5*1dPuV\bVLJ=HWN^RnBw>mb9DS5XR\QMcXIjW^&iV!bn^N%kiV*y1c!#aBuh\ac<H8
WqDNnY *1y$YmPL#>uL#ZC!Ch@Jc/q5npc1h<ITQbkmj1+yk9^uHjn@y&Q+@/\pj?WRPj?jbETR@Im4Xpu@jyj>
KindJ/ 4@j8j\/c@b+5?P9I>b>%/j?M@XZEHA:?c?\9?6an+bA4aH<SjabD4+D>iSMPJB^&Bi\9w5>\?F>n?bG@
IpWZkR \QJjAR9>^ZkSj+&F@?1+AqjA\kS@n4&CZ<El9<Bi\c>k9#k8@^Z</liNR=D<X@C4Z$d1?c@kYL?KtQQD
Ye+MuV 4tK5u^im<q@F5RS@eX#?j\ue\RV?MuD*>!LVH+E:JPVQkV9?u/^9S@^RSQq@9SR/6Zta?j@>W8l=?ljl
>V&9kH ieI$IEeY?RBPpj+eh$E6bT9nDmyl?%*!d>\EyIQpaC/FG$%lDAG1R1BwqDW%N1d5C1^T\RjFESiM9#pR
#PQKYu J=FQnRQlL8Mh!?hMN+?9I/^&yMt9nEKee\=*Z%SKX**y4\qW+B!u4I#i8EpkRTB4Va/FEa!NA&bwWtQl
1yLPMn Ad8maGA%NHYcWE^@dKda58S+\iyc5CwTlPq*TBqPjLi$4+IBNWnM!/Xa\%8Xm?1G^!c8^INHp!aZ+VGP
>jt@4n =NZk8GDFM+HaEWjFnIm8W8hV&P==h$piaViA65ZN%Vw^VA=w?+XhupC+HEB?lqW8++yMlGGl!%?RE$Eu
1J@TJF DhlA8YlVZPMn+9P*5BqmPJA%4:H11Ib/*Lh\kQXPJuy!$@pFPn!85hdp&1ih\\&L$RFm$AyT%#YlCc/:
k8iuPa \yRXD4X!#QwEId5D!4QRX/+VHm!9:&CVE$/IG%TZ98S?laDZPMy%aZ#Y%*q&9hq^>Q*buGNM8iKYy>aG
CV&kG< <Tt^PGLM8YPJWu&iZa\4J%h:!88H*L1uc#En%!TYDVw1iyd\^1mb+tQlCnEJ@BcJc/d/=GN\lIMFD@ny
:%/uli <taw8mqKiKH<Z9kndK+eFCRG\V>PDGT/n6Fj+?//HRqKcS>9YlNKjql6*Mwc@tA6D@?w*P/cqZ:Hl6hl
yh6JWd iyjeq?REVmZBJ4WeM@*Yt?ILbWap^wNjSKcc5DEyjZZ6wKmBVB:j$\XWcC%!wj@W+BW88R$Cj<6&d41j
Yqk$4? L=RZ@Hk1QmyRY=%1e<uTTZPddP5D$5VjpE:kR:VQ%lQbp^M4NuGE%AhmN%*G/eb8@kjB>:Y?:BB+H4%@
>@JZ%l +D6tyu<L8<5Ilk>9tb6P5&#<!CB6^*S?>?uCZV@DqZwei>Yuy?*4mZNyd><Kyuk\^auN5I>\MtCe/+!<
?JjL/T jYiF5+#GFAKIVekW=1=1w$pNeAXP8$ywDcwJQ@y+HHy>8X&JYbc^aD+mQPPR=1=1JIASDZW>q&9FN4Ti
PtuT5X G:a=ub4aw&:KKkWQ&nI$/A1P>8M#dY:9#S>Z:@L&Wckqbm*&^%h+^5DPh$F%QWWEdbIidPX!^wuKWePp
PtQhQK h$ZI9yb5bkt9i/NIclhWWnAM#^jFJ<8VnPW\ni\:Y#FQThIFKeST=IjpAF@PiMb^aS6jt%/6b5T:/+BQ
$D$SHA Dij4Q4ha^qTGYlZTBCXjB%qclP9bbXE#=Ei%M8e@WJZjqu*KIWB155EIWEYnRdG1q=lC5ZkW&&yD4NI@
nB5pk: $n^/\w9?&9m:t:iM?4kcw!hVI1tb>iimQt9ZJA>W<Z>w#/1:bYauGB*MC1ZYPYF@YJuR\whuVEiywKaD
w6bBm1 aCqT+Cn95Ec^8?@h5PKV/?HcnlptCMnqCW//eR%hMW/PRI=N@kVX#lwN<w4idS!X<wAq1e@wpw*h4hA<
PBF8!l EmGX:NK*u@9/%CjXe>SY$HKTWJ&m89kk/lNC%E**XtF>j<I<dDBEWdYP<4%qYGHIRNww<$B+@Fyh@G^Z
H#h66c ZEqI8\LGbe51KemA&Dt^!HRCaRh$Ec5nJiD!8Y#ap/h=JJZjRyWb%nC#btZah?uX:81cXBTMuS?9u=Rj
NEMepY C1#Sicp5Np*mYGW#HyK8d<jLIb@PI@Ylk@/bVFphbFcwGKR#XH<6K6t%DqPV41u4Kdp69uNAjXRDIYq*
tJQel9 dR*ijhmknGKCYIqu6WhC91ABciZVW%K=cZWEt<V/I*^B^&iWWSJDI^k:^Iu#+qLV6L!T$&Gn=P@49H%c
X!+>AX &GnF=!mt!d*nNF5MYmY\njnn^B?t6<lIV6iXG*ZH#@MPLT6ee&cPwRAWhIlJY\*SW4YHXPP1m!+ewGa1
I@hQ^p abuaPjMLK$Z5W>!cEHGN^LPkpPI6J@?wnt5<*D!5Nh+&LC@p41HnG:<aV/X4**lWQ/?ShQ:icHk+P&y1
L=8A=! /wPA=C98+Ak9FVIjam*NVbYudY?Dyn<5nHDiklEQW/nCwFcA*9WVPu9^&6DlJh=l1uXM^q4:P+QW4Zhw
yb*YhJ /6J8=cua<RdWC%9J$8bd!T%tpW5+*mJ>eyaHIMdKWyP+LEpaXc?C/HKqM:+TK%F$4K$\M!8V!TM&jIu=
nDnD$@ bJdRn&6ALt%B+=H!\VH?kGble/J\XS4i5i*\PWp1LCSSAinctu?C81=L:VwBje<?tYET9e!<wlRt/q1h
/km8+W #KFRLGZRT/BLdCPEp/PLLcwH<d1qpy1=6$XIbJt5\LyFdBMWL&16e#Rnw#K!$988yWpQbmG<T#%bihM*
LJlM85 Rh@QpqmqYL?nS?k5q^KDJLeCw^%ViM1E\D4#hp#*Y/15!@Tb>@^l#TiX^L&d<$L1Dq8J4/81q4?p9A6#
CV*ySE &=F4bJ$Jte4$1$CM9T>CWGQqikqKc@XyEwXG5lTXeV+Z%@^5pt&6RY115B$+$lcW8Xm19H^wNt:&R*Ce
G^XJpi *84J$qa?5=>^l=mQh1t!e!%4euHb/ewdQ6VW<emZq>pimR:VY1*!N4$BTYh%W%QaXZiywK?$XV$SR!SR
HIt>Xk Nu6h*PECiWVuqC:*e!=w#:JjJYVZy:/^q*&PL6B^h!Yn>K^\GN<IbtAi/%9#*DL^@cS+yi\ib?+cbejZ
-AnHjZ 000798a0dd8001202b4 Page 52 of binaries2.zip
kj+DW\ S*aQZYjad#Yu>1pYFh?^D=\1>d/eGeyYjt/hY%?Lkjbt+hy</L:IGiR>iQtI4T!5QJ*jw*p&Q1M^F9Sk
a55@J> Xm#^*ba1+VpRdhn&i9%?/<Ph8+V%B*l$6&AH5&N/E!1yTk&Zyh5b1q?^lkp4Q@YW#hbk/*6E<Ya@T?L*
6JCLbm +VlKt@*T>m=K@?Kt59=ZFb?\><*aXK$tT$DjRLFZE86KpnN9eFNPu%lV=4cq^c<6XXI<n1TmE>%du&uu
5J\R$= Z*j1GlZwimM!>Dnj@NNNN=!:1ZiPdF/w<#kSMW:PWRtL8:LJ/KyLmhNdLK4*/nNbXA4R8<Q:SEY*^G>L
HkD>wQ yA/#Gub8!i=ck9CjL49#4kKQP*lDTMXDpupDnBW/M>%Mp:AGKHG4L6DFdhX/?6tpPNZNR\FY9B1MmNtN
%&P4Y= ^aea&R?iFtycZD+hBpjJI:TphHQFX:WLb>Q/Emj^@ey&+D\u\w@pXa8\q?@*uyw!j$1VPeLHH<$=!d+@
DydcYC *FLMi/HpttPiQ%$<ecPwNEmQ5$W?NJmRKB%5RYpd&nBYaA6eM<DHD?IL+Riy#qaT^wVI&#bKk=R+hT8+
lji6%m =In&@RtXEJ%^>^GnIK615DXw$Nu!BitcGqalBhd/NI?4BqpSLZbwwcu!/W\S\1\*c!>CE:KjJhej<$l1
u6pMGA kpKi%K$\%WW8?e+W5a=$4h5EpLD\:GkHcp?mjNTDJj/R:5$A%KEIeX\$S^$*@5!=QEQ/#ACV$4N*uP@+
=C*tFp <l=1?$&%@1wdw/l4PPuVaX:t:c41TnNy&:$hT\We&\>9wt^G\1@nVN=>GNW9W?\^RH!u:^ZXkTSAeh$=
kC9Hw* DA6e$KbD5l4jY\EK&HWIc=N%mbKX:QBq<:NZM=\w8y8Ku#qS+yiDE:Gmq1NL9!wjbb=p5!q:m98^\K?y
RLCP1G !wk^4wV=qIWBh?yGXXCVce>%Y&p#/jlPy<*KQ6pwN!c/wDZC\iGq95Xy+LtFHJJuK$b&:<!WbacnDGXe
Et1Q<Z SGQGEdC?>/FT<S^WMK4L8F=aMB?D!/%C!Ktm*tK4iM/Z1Bp$jN<Ah>HRQjpA>^YB/lI9kNWI8yLD8G6i
&nj@ZH ACm1Dc9w:+i\akB:V@VjBAJ4d9NNB*Qkp+MjMnKRhGwt>H1=Sqqnlam=VSL&48w/bjq5$^8Yq!6F:*6a
wRaDeW p@K5VT5#X?6E#X$u4j=eY#i#8dbb5MBul/>CwH@BMw*L8Ct:6pmaSN+9eWM:b>LRewcjDJWVPmE\I^T:
IFwN@: u&+TXpkI+^LphlQau?RhaT:VmLjZ!FG!dpjY^59neS/!LPIV!:8lbiJBSG/h/MatQGeL/9B/CB&!McM4
HFm41A ?HC9aN>:kK4ay68X:KFwRycbNF*>&4cj6j9dEQd!TPJQhRDuuWN\@4V9hH+P&hp+dNjY@DJX5wSGH8%4
F!MY^^ bePuy?5T16KH#AeTi!pT:++p!qd8#!w1HtkCQEGK$yW?C5WL^ZTj&Q#8l&>?BuW^qXtKDhtB+n^u8SP=
18L$Y? n9$5>=THkeT4=TY\\?4HLNPd5QTS$hNS!juS$A>#WuZA@Bdn4h&^emG66hE6:NN^>@n=&i=SH8h/!SjA
nA8aN: eujh5&\=+1\eJb@Z9LwG!waYuTdCt^#anQN+%dy&ucQAmqV6YQ&$!H5elA$G191#<w^QHb<CmCAa9b+y
kcnb?> EbP>:L5jKw$@pmYyF#Z^qTHmk*ajF6&j<nR@Ky5Z&=H&:<EY1mDkwIB*>LJL%G6\!u+F&aVC\8kp6ET$
bQcQt< XjV=!4AGIw<uCn>XyKlwT5dHe9DD\lwkpaKkTN/Z+a$e?Le$Hwy@qbRXX*VTCXDV=*&m\^<51Pmkd=&4
6d5PPa #Y?p:>Y1X:Kn/&Yky=/k\#>k=CZ@LapGZiQG:hP:KiwBY#M>!u6Y&M\eK6Hteum=jAXlC1R=DhQ4*\1D
cy%Y?n bwtaI&M!bPQ8e<pCu>a#+!eeF>XbF659cK8ayp*HXLJMX>SeX^*&6+D:!i/@$IwKi1LJyVCbT<BE/V?=
V^mcp& YXF/t%QckXC%\wI#1KLW8&#kCBlu1AV4E*+&DnuSLhqQ5w+ch<<jIPy*5lyL4hDYEwSZD<VMY#8*1@G^
+6MumQ #uySt?&@\*WaWyecEM1ZHRN\/hmW/5TEFSYT9ydGd>?5HuH$*61KEi6uNS6G5^qAEuK:yw=?ERm6RV%#
n9W:+h >\l+/elKKb/p#+PaD8wNEa@$5^5tN=N!eHMJX9hANq1>em/*el*b@LC=#4Q6*iaNN>yCl/*N=+iSb>SN
A5P+\P T1AYhh%&aDGa%%MC54WQ=SWbXZC=/CpyIMPHWb#eWYMu6S!4QdJLul/CZ6G>6lGPhnP8dyVDA\&j64a\
KK#MJ= CZtRC5@Wk#yj8nnI?nZm<m/WT5lb8Z#MEu@tucEn=CF=*a<jaeByYNSae#h@NV:NDaVZ+pb^a8H%Zq>X
XM9N?a Zcu8W%anM@IP:C:*N*ihqi@8>Ky+!eM/*VAh*S@dSd8^ubTTlhSK%ZK\9F#d^EKT46VKhQ&$B/m?+#>A
T\h:6a DKKCq%W@B/hStE@t&1XnFPWe5FbZH%Hld5:Y?8Q!pCBkP98hQH8FLXQue1NnjGj8\PHYaLpWa8\QM#ap
Mk6RG^ \h4RtNL??=&9<TunK848T&=AGVCNaZdHCFN!>uWj/aNCLk^^j5!uy^d8iiLF@MEl!QS1YLBIhHA<N%P=
9u!J8m TNB>HkqQik6*SE<Dj%=4XI>bNCNJ:GJdLd$SVuw9M*MM&>MHD=E#D+MSAp!KuG/meEH$PGy5uIB?$b\R
IFCKcn QEb4yQkF1&p<F9W6:M+RjLR\LDSZX6M\jHP1hV==wPp\:8+&ETM^Hu$EFuy4/ti*NEG9NF>*@AKB6M?B
?VlXM# /aIlAF>uaFe/CZXCltBKlt>KitAL5P8TP1Mk$:ep5:tRlQy^JuZFI>?!S>VStjVwYaJ>Yd=>tSu6Gb<:
Li$Y&= d#JIQjbhiy!Du4Z$LA9><1dkZud#Q4ui1<#Q/>RB/Nt?8:kB^:kbd=+IFtS>4u@TjJBDjjTE?9Yn#=?j
?Wk8an LB%mCLE<>YNJ@@#^TR6Fhk+ndi+Kdc+tCXwyllBQ:6I=/QQlVZyJ*IBT*M#d?WI!n&q8*D!*K9VVKQA#
:XFI&a !Neu#KIi!lIT!G6^Kjle@!mVyWCjw=k/:%FkPlcK1XA@Jcj=a\tcXKqRZ4=?dAq%RZHL+>#qmph?HtX?
t?Fn?C #hqCN8XCjiXtGa@w^<4Qy!1E=myRbYtbL!6i6<Cw+ikT:bWbXAlpuhC/V\4X8mDXIjdm1M?caa9QPJIy
TXTV!1 @GHVwtDt?&y#lDStIjQ=6=nF9aia8t#/B%HuJ\!$%/w#9<V=HA9$1Cc*+1Q4WcIdRGK1dZP@mDJ4Zc<J
pA?yj+ L1&lJ4d:DKp$NWpK5E6cRkHMdbJ>FbJQnFIE6aHNBmtjLXJ>:Ytd:/Z:y/RLS1h@#tn?uFb!*y:daqdp
n\8!eQ Z+/d<V+@ePYcj*N4c^5cYtR4VhtV*Jh64YN6ZZjccJ?%=F/C%w/99*n=%GCp@XbJ#yeZ:T>YMiljbh*c
wH*Q>W c@e@/1Ah^SBeiP/H%&d&4i*%Cl1/=M*ZEiR4BGY6R%pG\&nwP%&BJDqbDJ$ZJF$M&>jMmQEF*@WIp*WJ
$!&&PZ >uTd6XC?b85X+85^FGlucKC>1=YjShTNRt@%Vem/>VZdWKA*!&%A/PcAKZ4*=>a?9@/dF@+hLX+6K\RD
jVqBcq L+1G/KKH#t*Kt/M4:yaMb:/wyK6Jw>q//HhW6*mPECiG=DkKBhn#wR!=\Vl%GQL5#SVXu?bliitRjI5+
VKy=Fm NDP$>i/MF?lnGJAau*i%!&<ihqKMGk/N4p!KbM$%CL?I%c&cRHMHhL1@w/aH?/M^C&>NMJWK*kK\jibq
9IDwln ydXLC4Bw^H9e/C8Z9KTYknJJCWX9C8lJSXGpB1BwA%8w#NVt:>uN6#6TwGjVQncqCGRGGh%d?B1+mNbG
q>cuCL ciSJt&6K>#ylTTSq/X+!Fj*C+tNVT9Tb#K/$#K:Iyc@S!&Ly=GbAM1Q&F/@lwMAa/5hX!>hnq<%8pAWP
>/aYYB $4/&9Mq\idQLt?l%?M4nttYSRqK^D&TB?RD/??Sm5qRM919*Sq/IHN><QW?ED5WP1CNE4%pV&X6=YWe1
4Ek?KV qpZP5E?:bw>6/w1*>tZN/GDqhVyb=!bwdb8M@l\RwKpcmEX^H&h%1SA@J=Q!hT1IZlRd^a/bi**49pkt
MFj%A! cyb+db1kM+Jk4b?aIjL%JX/ttVq^q#BlVn:B/+VM?&+9>A1y$HGJ84myQyj5jT*KdC@L:Mm?Lqb$eNq%
hJC5<k KNyJHdC$$1XQk%=&JDy*hH?Y^w!b<q+WhXjw<j&>++=DKwc!^Zc#N@e@$Hb<j9MK@a$J=y8Pd!hbnTP6
/>Gi*M jCPj/uTDQWcjTkI?6ec\CMbpVhV=!<QmYYGtLuHm*aAAS!GjAVT4i&lLACVX?=FY!CS&=L5uN/98Vmbd
d1>jKt QD6>^FH>pl!B8ZS&n\uHZPC>#/9*hcENSwJJ9mmApXnDb/qb@:9aZ\Ju9+VPCb4N?ehkwV<+j%B!@4#m
:/NJ%D @F9Nq>9%Z^+$j*uiP1S@=\5>&w*dR^jQ^!+C$C@E%1?hY%::N9H%=m#S&4j#B+M*9!%e*1!=iQD!<9ZG
EbN&At pEpqGkdc&>6QFk+?S9ima+di:CVYhd>A^+pWi\%85lRqIIu5w*j=yIpAw#$a*H#+1b^ZnAlNjm6^<M\Q
PD8/Jj l!NGa6N>!ZFek6Gp=?c:!DN9LyEumy69@inYZYRK%QiTq:%Ee?WBRSH=tSuTXS4I&Z=GVNtkRnl%dGkQ
uZi6cG TZ!A4RAhRhkHj*CAQwTGIB\#EH%\SIM4kuC8C>8:^S&&KH$HW4>wm/CPL4>#ahVpEEN4>Ia?n>?T\kBd
wDQn*\ ^?GVAp9HnEQD1*:E/PQ?Hc>l+/1W$t%lFHl^BTBI=^SNGFF9\L$Ne%IM%eatiGQBEKywLE5MDBMPIpGF
$jbP9: $hP=+%yB$Nwm4G:SKF14C\=&?=ap!kdl<V&b&u99h@HP^i*dnFT$+9$de%@^IYhueq9^d&aPL^niuM6j
lBTR!8 54meWy%*Qt^^R<?Q=>RAFJa\W!YI<4u4j&Bkq*jApkD9K^G%1$:jJ8=kH>bPd+>Q9EQiJ%eP8TaNTb4>
bG@dP6 *F>VYqn/DL<H?l!Yw&yLBVk$H/jlaZC%d+R+*4IhDEjQ$<dte#lAQB<8J?&tpm6HYW?He:pQW9GPqdG\
amn%1m R>e$9ehk$XkQ/AehJGPwFhZXD=5cSnNQ=8W>FEPwiI/T4ISGE:H1BRa%IqC9pCC!mPhl^^LJXGHnHnq:
4^%MT@ RuHQ1w>8^d*4jI88Rw>!JP*%pqHZ4Gik5cEPK\uY%14*$qhPa>X45y194*e^IPhQ5VX@?QTpX#uDYw!G
5q$aiL V+hqKN&bPmRZZ+cICV%hJtWnM5NiS!5nXaPEPSepTG&y=wleuG>PFW9epL64qTnq%KP@wC%X4Q$\L#Dh
T*&>YS NLE9@yW>hY1>4XWcq8!bXeytyCp@=VYuP@yyYL=aKmpA*/eYWRC<6D6/4Gc8$pTl8ewY%ADVD4NZ8qLu
<A5t#1 Ak?*yq\Xp!SL:kT9YK5FYT=RR6JhMu$dZLK56!D8Dtu9:#@Rym!$?@4W6kZ^<KpMmQ\PZPcb4nq6yd6E
yt/N#B ct@w>N*?tVB8\*b&iaX*cK*Xnw9P$$P9+!*yKl?BVc<Bqn6tYCcA#!D\58Z:iW#q4%QL!t1F^l8iHi8j
&=qV#B ?YAn8%#hcZEaYt%RkF5ljdZ&!+W#JXQ$GpGd!E1H5C*p:KPui$*PbbYH4e+HHTh6Ll^N#8qYMmcL*mKy
!QWGZZ hM=iwYdMkuhEF8/<nP=L5*hP^SFMYQjyEIk!nd**VXj*85Da1hZuD:tSY#+*:NLX+u5ZGw@JJHJn4Q&!
&YR\Iw VaJ*TDbjD:1p!k^hQ4lteTu^%t@XnjqiWqm<?e%pKaak+@5*!pd9Y%^+lRhCCVAtdYtJ*y<<@#kI\+wj
iaWHB\ J&ichRqY%Rbl?N^:MBF:ELt&id$uQaMwb=ICRL^LH&4\NwBkp#Np!lucE*EVG/WKm6lX\>VP5Th?ue?H
-AL4+a 000b07ddc22001202b4 Page 53 of binaries2.zip
aM59WP li1k/5Z6DZT%&?ESM&eIPZHCF:9*WPV:BYql5JM+<JMC<M+VRuPQCV<?iT=Rwee%9iyS\we^&4HwbhRY
GWnk!% eJ8aHpW=AwEAYBm=T^^J9!CRyQVp88Yh8A%9abum#>j#Du$j81MZMD$6SKF?ql:u@&5SMV+=J#MdK@H@
5^NPFI P>Qp@Q?itBkT@1e$PSL&9:TT:P@4=\REj%<9B@:uFYT@J::?Nb*&=:\q@^WX9=B@:5L\E!#mF%nIFdCR
FbFp@X u?iH@>!D+e>aj5Gj=?H@*IQlJ%nEL:D\9<dCBZ/i<9^#D+cjaH?^TAmB8AL&=!yqTIVAZ&NlQ%hHR!KR
!k!Q+< X<D?aqEW+ky?Bj*FeRY8+FhR&M>6JZAF9@yqQq#kCw+FS@:m\LD@AH5F^@yXHq:kCw/F?Hq#D/RA+mwu
?+6BL= \!?\X*E5kX><\j@5YH?V1@@9#ZZF^XmCA9V<MMnjYwZA4:IPTPBKdT5kMCkE<ehKJw*9+L?9k@6?aC5:
lj=b1F ::?6a4L#@n+@@N/@+6>e^\SBCu#@C@=?PwQyIaJZ/HPCSIK9$8eEmwRIR9+a\H>%P4qn=&u4+8Z=H#Zh
<5^+<I kH+*NIRjRR?H<*?jTJFZ+R#=q^wPj8Sj%uD\@>H8kq+R?8jPEel@qJ@<udi8m4u>D+4@Sj!*/b?iV>uM
DHPnLA /deZA9S<PucYu4dj4$R\in=bK#5dY$>/jkk>u:mhy+i1qd8Em=P4m@N9e@b9M:Pnm:8G1=uFh/!pqdih
4qQ<lT lbYM8=u9H\Wn<B>#&l<FI=ITtn<yGQt&?P$aDTV&udEXttWA&9jH6^hwEtm+kB?Q:<?+RF\eZCAIH^eZ
LCct5Y H$SMTAkmJCRtAZ=@BkFJmEnJ!MqImcmwcGmw1JkaGStb&Q=+jP6EI<BFk/HnwKM#wu*4Sb9?98Q9@@:?
<5t<W* RQ9>kaYNmRFAS<QB^eMuIEdDRMjE^MDCAPBkju@C<EDH\CVBR5NtIIYI1RHI#BnhA5tlCdp+FDZmVF*1
K9Cw\d W/>lqPau#P=Bd%pp+B1JV&56QL4=JhtT<y+l4tqci9bM4?P!B8QlW%GHJE6J=>hy#&m^$=^89P8h*V!#
=LmpPb <kyNKcn9t>6/d?$hqq4a$D?@@WFAS5jtVulcWiQA\5=HyK!84W>EiuHV+PL8J\=BPV$:*<mMp8clyd*Q
=QR6+/ uEL!?9b?WbtqLeQL??jjZ1JlwbF<Y$dD@VGp&&n^h9i%J4*aC:Q9\bRAA4E$ew:#M6+?DBubM4#%%4:K
jPX!C< wG>wtL+PGhFu>=Q&MhBXmkeGTRuRXVTc5Nbl94iHXTZjnhupqc6^?N:eX=9puEtmpb9WwakiZNZLek@4
#d*#Wd pW9\j5q6ahbW9MeYJ1VC/P9PDFWw5yMNL8PQR8N1%GCFZbB6YW!Q!B:jZtZ@+9WN#h8:q*a+Y>ukiVF@
kP%hSD R%!n&j^6%JL$#Wh=<6G>R%>pa&RG%?yQ4/Yq8^5J!J6%4HeSKV%@qcG!ib6Z5qAPj5SB:GXhk<Kb68!>
/lZ>8I PZ^DLe14QuFGS8/qR4tVFSW#B*yE?iNwILF\+NayJ*!MP@kdGm@iN#R6TKL9#SEIei&mHd6?t+TiNF/S
\C4#KV 94dm!PaD:y1um*deh9wE:EMFk6=JQZiJHLbeYF<BEKuu<BXN&SZ8Ddk&h?DDN:e#bD@HpF%mu://4jLh
SkAQRq QlPjSb?t4JDN#J=RlR+p*<%#\F^b$h>>&*Q#a!J@5yq&CMjtQcXmZb$iLLaE+Yb/XyFd<1+IFpjXN&h!
W:6Db6 V:=Nyn=l?t^J1YGYH^R1EY^%Ze!qq8kNw5yS&aZ%5@w1u4Q%5&qTK5&/Yq4&*XI<4Ma*mBY/+46Q64lC
<*jGj: jPu4ynbqq@K<DhkHkW@L<<<jw@wiDZaa!J@PuKWWeBtR*:Thi9D!<aVm1#WZu48*n&@Ljjywepd%5T4<
8M?ZKA DTT%R@/$@k#Q!<amj\^#ITdTQFSPZT9<+?N$aniZE$DkN#V6Md:LiLLLWqQjm<hd6&!#@cPXdmCjCq6/
#+I/Ht %<bkm?J<jETuh#h!c/Ba/bc<ih&YAnt<8Ln1nVD5h9^FK$%cp9J$\4Wj*:Tw=XBEa%Jd+dNw:YhV9X5$
HS?5$t cmT%D>P\m>mKTmdh1WyP?XIHnG:L4YBiulTJ&^J>jQ#8RYBduWHA#Ft&F>jAQtRlum/m1GV?$d4T=l8P
\RdMKL <n*HiV>p69JhSwVc1ilnk1Q>?^MMlu/j&acQqBFCE6wB/5M\a^Pd4$84n<\E$65Ke9WH!QEK>wcQjA5+
!C!^Aw S!k!GVbEV1WaG*6ZWyJXa^51cbhj!Qnt9Fwij6cW8D=b8p!8%##ka5QyCw%@dkj:NkWVW5y6W1l^1K1a
L5?QK? hejV*8R9Vp5QQWyQ&^w<%eMV9Z^lH4>*\#l1>bd*/ZaJ8>T/$W5^5@&9F85pK/Zj$H#jik+SyS%:>5/!
peR8@C Qc8jeT:u6R=q<jDWDI5Dkiu%FVnI6+LcJ5n9?N&b#R@dN=&YeqMkw$yS1y6c+TLTT>dI4LB4l+KZZhK!
C?*Hm: l5i&KqT!^tDD4:64HB/?Wiu!=DB??9mYBpZmnHn1&58l4Zcqa&CNId^<Lau:SqHl$YXK8+nN=+Y6<G!D
Pcnb5I >tjlm9iEXktKhYSn%XLj#WB4W*kJLd!^nw+C9TyR?>/%i+%C!mYp1i4V1IcLDkBlnb&8/5^^6^#elXh=
b$ay>i ktWm>d&kbYJYXt*l<P4VAMatKVRBiTLuDNdk$S48?Rb*8#8ybdB!+4a!ayV!MBG%:wiV#t!L^44YYcdW
\CByS* @i:LI+a\B^uKMAc!<uZB/!dJpT\!FLup*W*qu4m+aF<Z#cnI9TuthcTjNambwKJLR8Ln?>:^S:paD%&&
+<*^Ay n6SZJTF9E^H!d?P&ZJ4Wn1uWCw\?XAlyaQe\k#>Hda^c!M#GjCVlNp/Ii^WXV/GQpy\4+&T@#bhCMQ:\
5<i8dZ 1RJ%*EiJ8e4b<8J:G9mbT48AXd\<Eb=+I1eYDid:ip<WGqKNd14MPH88m:XcNZP8NM1YtYl4:=Ljw%L#
kL<Qq6 L>4V5G@$m=%@YG4E@!L@wLP:B1D:P6KamZ!1+<D=8YPtm:#t#4hypjP\\L$lwp<8tmV!NRQe=9Je*NC9
<uR/aM =9R/B=1jtFj89aSPV$lFdVtduZ+wDE>11=qH!N&V#R<wn&a?Putd$WB?ECFVyA99cL@MKF<h/pbPFJ8n
a4yZ%= 6NGyk4?WyJVhBNCjHnA6FPj6#J^qdDSGin1bM>jn^+et$EVeuH9>binXc^GP%#M5N*TTqIWeZ6mqJm/J
\AM##4 &RuZ<Lh6Z6Pn?&18%DNWa*jZ#j?4%cEXyQC^q*iy:dSBSFRa9RDb8KRIWbn+k5^WGTSNi6:c+FG\9*8m
^hnZ*p 5Gjmbu/N<E:MTF<Gc!/B%KI1EDH6:HtEb&ZEN:Iek<eiI*RB4I8<B<@^D!91id*RRVSHGJ=^$XRtWn<:
BC1eE6 4#PKqcyc!##NdbZiQ#c1iqQqQm@iZ5K4KTH!GJc&TZ/HwbD:cYY*&HlFw=dj:K*RX^WG?@t9qTZZ6CT!
?Y51/A J5uMa$EMbK^==9K$IN*48p6bK9996NHChk\>PjINZ4EYZE9#k6!l1%Y8VeQ=tKR^c%/+E:uXT<1^kQqX
9aGpR/ S5c@5d%%$p8lPXPP^WSZVP1>dm5>!ZBYayHyZNE4:c<tI#V&QEPu&:p8%>61DQEIAmlqp/bp91H=QWm#
QkhjJH &HlFiLH$>j*#m@:h=^@XDW%GH1\IZQRdQJlq1TV:HGTp^GeJXu:485cVen*N%#blV8b+yc$iVeVQ=66M
VD@L@P t8FL+?9c*Y#^PZwl:nLWDLRy4aM4djh=A!=P4J=jFI^<R*Qe8:%=+iQF>&Z/!h5kq+Wd/MFKLT$#*>Bp
4ZhauS ia+YENt&q%Z+uXycdD=TZC=el&WB4M&%DW$#$>e>nXTEn\nHwwj5^+PuW\LMkLd:*XJ1:%:RFu%Dc<?&
j1+m%h @Ict#9eb@5uG\?:/ckq:+5yL16jceTSepy#n=JqBPCy$LA9aBTpNXSV>YS@e8nB=PuK9n%dJ*dnl%51^
V#>aEQ 41W\y>XIq^!#+D%th\=/8bP+qheiRX%I*?1%n/JthQu$/S6c#Mcq+pCEjJ?=>*Z^SNHA!JGCFVE4J?@q
bEEG=Z &I*!/pl4%+dllA6P?+H>Wa\LLidHAY#+eIMZi<59n:iljX:wu1+uI!Ry88=^k9S^jJFT9l^XEel:wR%Q
>5<VSD VqMFLny9jlb85u#!l4@1\p\S4:nj8wEEVdi6tw@CQH@ip5=i?L6Bb>MpHIiK1V+d/9Hp1>?::=pIw:pG
6d=ich yk1ykMyHm+$tct4+paKh/8h!==!=!>>d#bpb?FnLEGGtiQ5tmlqamXX4Hp^*jLII8F5%w@MN4THt?cp#
PKaEV* N=R?!S%HR&n!\RVLTB#8=kQydXE%$jHCuK>$h:y%/:d1=9q>GdLXuPMTbK\N/^R8H\JDB$TX%E$GKE+u
<XQMX+ L6\<H*+c+d8a/AHKKljcBPjGMJHK$6+Y<41>cZ44T/\+kNDb/T65by/dy9%!@Jb$i@P5=+nDRbQ&1pEI
1yAhh4 /du<T1j&!#5=?$&$a:jjh4X>@^u^aF&Ciu9mVeW*6G$B1Y>wLau4q\cZ4=>9R%>e=9K+5ucR9:I4S+M^
+6hq@p \TR=lmJJWTwWN$q!Xtac&P+B\^bHuE*PXy^=GTKK#&K:VGTLXI/Hw<k8Y8id9<$>Nuk\4J@!Dc*M+^9c
uh+uR% $P:J95uHk65dYK<1lhGhCQ5i*hJjXdkG*dEMLL/?dJ:Vynm:8hMl<Z1t/4c<tPppE5?DL5pI51X:?GtE
AScM>^ dqb*V1d<FhENtVlb?Di$n<>Gu?^@J<u/BHn<6L=yn4Y^NSW=qT6>w!SH&BI4NwQ4+&96Mnwly#b9G4Gw
$V4PK* +@W>R&bIM#+=J%MRnS\PyR*\m#P&k!wI?kHV*yQLk$ql#/k:P!@#ti4%IWH/j*C\&uD%<D\MwyqA=6wY
bY?hS= Icj^DI1LMwySFYCK4Cn>*q/&yDl6WajW&T*@4?JH8bt4S1LVqNi8+iy?u?E$Mp8j++c1Em:=*^Dp:*/l
m5*Py\ <qtB>6KW/CLdEK4!MZQlEq#I+G8H@d=<@k:uDi4b9CD$^a>$kSVZyeph$ylpy#QuK1$WFMLM>?m$>/:S
+%8l@C m=m5R5Z^\#u/<&=@t$@&9cPW&8DZGwk9pqh1pGk$MG><K*m5ciCDn$clHJkw=h#?G>1H1dSLyd/kN%6k
yAqL/L @XiKFb*=yT9u/kt<u:mMH!p&V%iGyEFIcKl64<8=KH#M\6*pyH%Iim5t$9dETN@EpMBYjp<ua1c&WdaI
b9^F?\ ZiMn6$wjdjF!>9Z1F!P**@bN*>:kj9:8NlCCIM9#c$k<J!Qy!<^KTjaE%i6Q6:w$Vn9euIMdNGQ*#dXC
\9Iti* bk56tHWce5$!dpcwl&b45RykQwniLYD*6&a^WHAVhmD9lyQ&*X!WZljpjJAI/mFw?*/qwcPhiK>#!R#J
mYc=5/ h4\<j*Xy+Yu!yaTZc&8>eN/XXVbjIh4*&8#KZaS*8$:m#RGR@i%Z<<>QwA?YyP$jju^jhRF<<pE6R5aP
wFN\Z5 a#?/XKSZiB:ReLcBLRa<aGM$qlN!t@m&5K@iAw@p%mHBKN*X81TZiH8yI@EFPj\HNDQ9/%iH::eGdF?V
tL&uE^ VY&=uhdVXB<h1J*PWtkFHSc4/ZEK!t+8yMZl^nMQJNj1*@Ky9j%Xy:@encFWJDM:BZjn5l>CY+b$*1^Q
6+EWMm XEku&*@G$u%8*=u+yNb*hPNBKl/L::D/Ppam<n+WR=bBT!m@=KKD89Ru=Q?BkZZ^N:RH?6@RPwi?wXqS
HRE4G& lYnH5^chK%W!:8#TQqAGc/w&*hj!9hqDIhcNZBikHGhTnS16$kiqdCCy>9@aYc^yHLI8NWaaZ@Dti=K+
j^p&P5 j>\h>djJ9je**^!ajKK?jblHP8NWWjitI5GN>qF4YLPyKHFBCuF^YjQZ1Qh>JwF&hmK6Mq\AD5dWZH!!
5Hmn%E W9u5G%SQeq$&4L/lMd//LN5a\/Wje=BwZE1/HIaR$My/j8E!pPZhaJ%dtq9SJL:+\Eq*</NNHP+@Hjw9
-Ak6km 00073e62ffa001202b4 Page 54 of binaries2.zip
t5FZtF lt&1JD@MI#@5RM*46KEZT9D$PaPEjy^GR1mwR!y4IpBH9e#@/Tq>EM/ZBPPt5:y/j\NB=5dIq^Z4*BM$
mXTJ=5 ELm?q^Xdk$8J*wMS:y8u4Le@F\uMqn@jTmZ/VHd#a8dS94dJ/RnPSiVDT:8^>%^<u/&CL!WH91HBh:=N
Ln4D<1 yZ?XH:uWM@&GqkD=lnat&FH\jZ#e%R<G$:>j@dJi1hh?R$9X9d&y?PCh<9@!*4jQW>I8c48?&<9mG%1t
A>h#GW ^:%@QBCTXp*B+d4R/Tp6kY>Ba?BYHBP?Ywch&EtAc@cPuqV<lMQVF>H<1hmY&iS/MXAFF>1X*E*m1nhG
edS5wS MweZ\6Ecn8wEB/$LWR=<jJJP?aqc4@qL\qBSk$#dqnu1k*$H<9euDB%%>QQaa<<I6J1+cChjENjbKV1P
jR!S<E %68wq6+CmP^J%CX81FVH1bjbwbED5tQ8Db\*yX*NYNQ@n^uLnc8al?j\8JJ$jLEN*Ba=V4W*=Kehlil?
nHpltE /&Z#ZtGI1iFbywF6D+Y8Sa/=V45j<hi>D54>^tnYl^+K8p!/qZWb!Q/ckL/1WK%QEHXS>A@XI\4j$En9
V?$hHd Q&^+jet!5eh&W?FCyD6LC9u8W<jZE=PL\%ej#:/l9Y=?hPu6<8Z<\euK&Di$Y\Jj9>:?=G#>Di*^w<9L
Np1Xb! J^eC5Ajn*>>?wHJJt@F6J8pd&l?9u8><@>D#::>%CEhj9Z9&+NZ*1%na659uyih9>4/l>ZkIZG**EPy9
mT:iB/ cL&#Jy@qH8\WjjI+/Z*\&%/D@>l4%^>:Zj8^X/!?T>c%=/jjiXS@R\P=uZ@@M1=&:Iq95@?:!J9/V:\X
ekNVPy !H?\^dV:+QpQE6&:*+i\\9\NLY=A:MPDu8TDL:wE16@RmP?y*Z5\LZ!@^tHk+GbPP?@>F6j96=MhjBwy
MPBL/9 Iy\ZhH5Vc=WQ9m*>LGQ*n&%j@kmn<TMl@:>k$4<4tLTl=DP<Ta+QjCE$na?Pyp=hF\\#@4E\/w\eJIcY
iED!ta PTWYY/%QDR?ta@<u\TSZe=y<IGajYS<j=%pewAbqT555uwj%V/yJFp^$w8Yh1y^^bk4t<^IYTBT:&PEK
#B$cjZ Hp+I5acQIDdahBZSPVknD=h\I4BkG&bR^J%yDL=:uT\W$#IJW1eW:dkal^t\lK^*uh%mkXiR!eLHZE%j
u9V>Z* amJB^PS%kM4>qSk&Qmi1VkBDT?Yn5K+5%id?Ca9i#XwHnZX5mD8YCtQHc%RmDA6#qC+uFLMaBS=Bn:Ch
S!5Pp\ ^MI5V>ItbJB%Jmie&VAm1E9^WciG9V<Rwt8RaF?i$4ak>DAcQ#!/a/adKHqkP<%n=Ep8wSY9C1=:*>jI
JFY/#> H$/^KYKJSTa%A6d><DX5akX&Qb6e?>%%9<W=y>nbJiN/y*AH$LXSBmJnRwylcPQaJmHB9AZ^P<?%L1qF
Di>4Y\ 1mXMh4FdBldF+=T4h>y*^^EMqklmW@WiwauJBQKI<V\Em#Cn1F#:dhZcmBe<VD1IM\4*PjDhlRhGtP&9
PSlcS< :tl::T8IdlEKQRHWKeY@h14nZ/t^*@G#eM6hM4P%ZyIu*MTcPGkAqR1FI1SnK*1$m@i!=m*8V@mlqw*L
K>jQVt py\cnE1JRX<59^T5P&t@d>#M%KRG&=:HMNkd66!:$/hWjjdN&mD#iqi:&LJSDFY>8uI1yW*=l+!C\=lD
MMIq5= /1c8aK1iVpp+NCMXkD=<u>PcAyPKYwQwGc#HciNG+eSD<AM1Ic$9@ueyq!&!#^a<Zn\RjL%\F#FVFq4@
pXaMmq ^H@m#wid$k6LHYSThq@RWWhthXuk4Zd:npi*E:^n+%@l^6**D1@X\#N19QZmFe!1:bVPlnA$VC9:$GaF
WJ>*uy :AG!Z1Vt%d4@Y96Fy6<l=A=Kc>SGTRQQQ^/CVbNTF:Bm9^4Ay:5pqLR+R6hD#lQZ&<>BH9J\ItQFin<q
51Klbi yFLLueAp1whjP6T>IWq#Ptea/Ghhe5pFy\Cc!B5a<bLw>Wk*bck@!k+Hch*q?:kdVDj#$aaVL+l&uyF&
YV!V$j tY\Q8#PAP?#DaQhntLT&a$JS6c6/5\Z=>eBa>5XiCVH1Da&9KBJG\h/C5A:M8!4PSK<S$tulbEwB:LbK
Wd=Kp^ >5n1?YF<lpX&HFZjqBV*#XkG/qNw@PMqVlbbc@GNPpClK^&thpP+Eip<LAI<GdSadDNt48^jpq6SPdnF
C=!Eap aWTDLnHtlNE?T^=Ga<GtXEWaJj%b5ZNBuDKY!BPKkihVT&GRDe1NGPeCL*Gnw*k!K1W5Ab*VaRY+Dmu5
aa^k@R *E8<%+Sj5=#XPJ^P8%B@VlKMJVNRt6IpF9<+HXaw1YZdQ<mLETI5D@^pmA%V9Ca:wMMWFbRiElZ=mBql
+6GuF& i<Ve^J:EI1yMmqKNwHkWbD<w>u\<Z9YWY8JqRBIIq=c??!9FI#@E<Gkp+ENyB5*yndnCBLnkYh&MHibN
w&<#SW K*L68F+l:568wJbdHDV>ijZ!Mj8#E&!R&<!WVdyn6n?ySH@JeEFS#Cd6Qc4+89I^>eL8%iqbZ*e5iYpK
ZS4a64 X>5CSe^!4>Hq\QR6$6GZGR?>P*P^?hp/k>ZZQF*DTq!=pj$j:e:9&9cZ%QL1ud>eQVT1HQteLVI@dWj+
YY6X95 #KDKT@ulqA*<lRd$AlTuyjieiWDN5C@tj1^VXu$4/eBG5wnHEcZiI:bCP&K*@Ky!pMtw=Wq/Yw/DTu@1
dE%mNn 5D!V^Y%LJk:X$h11aKEiFF%9kk\=1d#1Hj8EwLc5EqWGw!d<LcZ=q$>Ln?/Z1nHQKewt*/&L9aFHQ*tM
/Bn1:N !%b?!S9^caQW%Jw\5MSiqCKFiplY\Y&PZjy^j#\5ZM5CnXC5>nb>u@5aM!<?i8!/lyZ5a:p%^:nHIi^N
Ym<*Al +EyFnFSbG$1WK#C*&cA<VM4cmdT$G:?PYCp5LnR&Klkwqk#L:?WnA5?C6ew#ZA#!!QMXI6<%:tHW4LDL
RPq4$$ E^=#QR9X1tTTV9MC=w5>=XhLu8/D$>Ia>B\MWk/QV5#lS<!1RhSNN*8CypWJnb\5ScL8p<::Lh!NQ\X&
EPWMFB FLbZQPe!\CEc91bHJ5huTniL#*cAL\@\ZM^l$51cQu%6&GkC49tmj<tC/?^nPqVSF&#<EiwZnn9MR4y?
cYd9@W WbRmF5@LHLAcKB:>Ry<W@Z+8A<8Ah1<I%e9DFm$H4et/P=>CXW?*?lI@I\TCVelWt=5cqP\A+8jIYuwS
5:8MRl c9FhGIyZ1:6i^*#*WhmBcHk5/Iu?cyFaiTc1\Pk&>kLuXM^$1EGF6tT%>Zc8^*LM^L=SEwJGu@J=9Imu
m9uRGL 9P/=QWZ&djH6ATj1D$@aJjIaA%NdBa=6=Pu1<XPVDdw\b\XceBHq^e*/P?+8S#6N>Y*ca&8Bd+:dhaN9
:!^Q%I Zl<Yp@dcW^:yHcH&5mp9jclI4hmYWGniYuh\&9YCRIB&LMLCVnQM%=KV#@Eqw<uYjFiE@NuutlRd4u6K
y!hpLn TnW<4deA?1@k\cut8C8XFl/Ha>W%*5%<WE9PW:/Cb#5j?Iyyii@djilSeFyyGXwWey4Y&IEAiWTE&Maj
?LESKh &^:Xp#?hY*nEKmylS5kuhPBnWZJ/cQmnBdE%uJJeNab/6NJTywDXi:?\YNCd^5GuMNZ/iNi1LCqDw&!c
R6yeFA XZXuLWYlmH8M:j:wbc+?m?up1<W:R\w/4K:5EE*%k8WVYydT^wL1V/1*Mn^T&Ba1C64X:@FwqFVjBu4G
hJ$e!l BZ9/$:^\m=%Pp&e6pC%P?8L@DPI?!<qm8aIVHb=>LqB^1$m4+uHT^@9#&GI9!Y=QdbB9!NHPmSSF94Yp
WAjG%P 5/n%<i1&NjH?el@:cXDFF?YbF*t::&jh9%VTj8H1$A!Pqu\1jZ/ib+q4#jml<M#6ajyVi$S>1HX4Fd%1
@jM?Q1 >&@mR:&1c9p/GB6wk8aIj5d#SG^wp/WuiGR\b?PG4AX4lYTMJKaQuJp1a:QYubpK9lW9F>wtN:DyYY$?
YneZHh &LqGCDa$:G5HlIqP5SAQM!XL=jY14RQWJa*FMNdW15YF^hM%RkK<!6%q$S!lyjQNHPKKtPdh#6%>VPbc
$e5>/+ I\CVQHF+tHBc%HHKh1%AcNb>l/jG4PW&wiiGAY1EXcd%AJVlbMheZ=8=*j1K/!kYh4I:<cw?*uF\<icl
y+dZBd NXnHc46ulNnEc66WY9l^MStSM=w=/?CkNTcSw/=ySd<bada#K+*b!SbBu&%C*GtmyH*PwAKBbE!1wmc1
t:KHNG EA!4!4T\e8<Ft&69iZj9H<jcNJVI!hbJtZ><k>5#n1Ye+A:H>khaIHZ5Kb>dnX\LVTLM8$&+ac/<8Saa
?DZDqY kR8Q>BEL9l9GKRVMV#TAFK?GLK:$^@8Yc9aFc?yb^+WiDXDumhEX5<dJAb+^h<:uj#Iw$ijjCmI$HTcC
1!FYB= nB8!iG6bFYyQQcHkIcN\CIMWmFD$TY=5Kh^p8p%B*EZ4:PniN?:P$p/&S\\maTFlFicjtCN!B>hJ6hSm
H\/Q5A /%yMdnG^J6C+jlluy+^D^Y@%a#MP45LDP\I^=bmBjK!X8n1Y=ZZ>YF1VuWaFH+EH8l=>^64Xw>1R?*HT
D+=JpK \8L>nWTp*9jWlN$JyIkL&wq*cKaAYk\>dBVF1kBL?\4VHnyie1YE/B8%%&+M6XJ^GJFCk81H%m@iD9G?
L\CB8! *YMktT@B=?GdYnH>9>n:C@Cwq1%6FP$RJi+Kejh$88Q8R6#h*h&A8JMRh*h*N+m:8^Km^IqC@LLY%4WZ
aK+>M$ :C@j*9>>#n*uuwauwb6?1<c5itjNtuPM<R+#BQ^wLm&Kh+uwC+dR6W^n9T^pEkbjPJq/MA>a$8=P4%Sn
p?<Ac? wIqnVykt9?\\CGut#cqbHSa:aA4/4D5#\EEDikqE/:by/cE\&JphEkq>^uGt/8:P%w:QZykGGti#JAJL
DbWV^t Z:H6qIQi<#L5MNDRPBBNyaAF#5pX@Nq1AN5uG5^P+5l:C&NtW/#Gm>\Kc\Zu^N&^$G\$%qXP=TRP/+6W
ql9%?e 4hmmWjDwTB#FVtmRS9m^>6*AP=ZJM4%8j9!ATeLh8!PLR5Ja=h1lV?DiK8%CL%=F@BNScj#wYjDpLGj5
A9PN!* tmEGC\\qA:M#ce=pIt#iNciWBm=LLmQ\&K6YCb^*nieR^cdE>1D+mYu/ZCnRnbYTkVeAWCiRTG^pmqlH
QKa8=R uK?5^F@E8PJW!RM<Fh<iJmnEu+N&BW@Q?Q4$Mw&?G/^y&nmlyP8^*LSEl\>/R?IA%AISChi=l>Y>wVpj
G=8qw> cWGLDK6n^:Q9BJ=t8d/dWuQeM6^LBM<w5LG!4aqlXnp8M86*^W65<%/aaMcFpw$mpDn^9*LwR<cIFy#e
YdB<18 +#*QG=G=bap#Eyw&EWiAJbRM^y5tpFb?I*jMTH5MdBI#l$G$H++1lScXkli?ta%WDD\pFi=J/Lab^bE^
E1>aCF B=YZBAjt\8VKY?u9#H>^V\+XtnFTSpHlJT6pIylpnnhb?KSm?C*Rd\Y6y66F*bH8ae=1VDlCF^1RWFjW
h%QVuT KCZm+=%L/\wYPkpIPXq@F%dibH?AyL%Va&G#JlPS>*qVct&waG+Mjy$l1n:$&ZJ9$@#J1*GuEQZicN$S
&F<D!V \nqG?Dwb9$TKp6a>Ni%V8QH<h+&>Va5SC+Y9d6aaHuXu9/\uANcHlTbMcS65Qt:AK*>mXVA5*/ynSF$9
*nBYR/ D9QKP6JXJX>C+6q+==iwml<Huy6F5#HF?tT<j*!:+c5$*6M*WWyKHwHaS@>SPIyY1KL>PSjni@1AK6pa
kITcBR FdF!i$V#HWw%&#+LPZ&\&K5FmT&ah+!cq6k\JpFY^kJjw#=1F:5@BI%ERt4ZdH9b!B:CC\^yXZZwdV61
1WjPQE IBPwaT@=nHYJwLN4!1XA$>HYd#?R&tydkeL61QA%EDhq#G+6WA6w^e%y^DZJyiitbu6eHjTX5\T%!$W=
lVAGNw Apm4ZIWNIQtR/yilN?YDZPq$ba<NA6#F@J5&5j$6#mndJ$4/Vi%#luHWdN&Qu%jqkPta&d*ppZiC\*a5
e?RF9n @CZCKj!PyepM1y%4/bD4R=\ddAj5#Q9KK/*VydQ=ZAAHyWLXB^b8^?aNFRqdXw4HPG?leGJ19:%%6+KQ
-ANnV% 0003b4e6f43001202b4 Page 55 of binaries2.zip
YQYXQV XQ95bTYkctQcY\y#+bd1#b/JYBG*Qd<4D?l?4iRl/A<<CmNFbC@$wD**yLbFNy5\\iqyRA+$/$y1<%59
=RwBP\ i\d6BCV5hCSutb1TtEBMFQtwkX&DtG?w1Y?=J6J94X@TaJuBH8k=n+d?/6%?uQuPK@&SRhGcPwFC&&w@
h/M&dj /\TSwaG%SjA\&4CyFq!a8lY<4:?=8d8HFcT&S/p>G!$&j\R/l=<8Je$TyR>t/Ra#*WiBhuL=Ju4>GJM<
6qk>/L L8E!/y^In1/=64AP5w&*MFt&nAnn#+*h!X@y\?V5eHY6$P6nW8K8WB1m9WMmJ=iiwlLPIBQRl5qln?D+
R=c5@9 #9I5PCKykcN4*Th*PidbdmSbjnTyc*iiLb^ADQ%GtGLZ&HPAAI!?Ij*/d&qaZIbneQwFJD+lmFtHKi6D
<PI1bB eP6dmMSuJIAaPB<Bw89AJI@RyPcIyP8@=F&>A?CqJ%>uy*Dty*DGACDPMDY1W#u4W#&cW\ERKhpQSL@q
tSCGd\ ZR&tNa?tZH>I^98Rh4&a>qp$ujN>85eIZQIZ=M>JSMTlGa8n/hih/e**cS4b/S4hGS/ZGe$ucV+AjAkS
wqTEdL yHYQDL#RDI*H6CX$jH^1VE&C=Bda6BbEAPAaT&MIALFDSD/DD@mW9Smak$?Y?*p**!A:d$p8q$8SmLM\
/K$ieq m+8wAJ<WAIFY!PXTcICY9VmjpZ!ihd$AkGl=&htCySqhVIIK*@KtaQEBAAmB#\1B$m#C<a\8>p#N^L55
F#cb&b 9kpn!Ha49TuD$1\8cDHK\5<6<T\68Wp8cE:P9tp6\?<8<\k8<N^LZlw9<SG6+Jw9d=+69?p5%>TyVNFL
kBQ#>> Et!6ctp9YjK1$ym6cMXK!V4JZmc1du&bke>b^W%PhE6Z+WXYe=%ciy&BjM6it^!i?6t6npC+Vp8<IFYl
wEml*+ *p5nKVe+Vl<4Ck@AeVBk$1Nd89iC$Wl@m9QqP<QYGKH8KFJWN5ktHptb^q64!9%u$N%Kee@GulM9>RNC
qGyeX? pDb/j1F@>5hK9@?HA:#@Fm#&G?C*!LC@BJV>d/P@@%lR?KuS*=^A<L>Gj*MCRW<WTj6dNN!@^6n>Pdd#
D\lMJ> 4^XW@8jA:n?ZJ@+J>liB*Z<8V@^uLQkZItq@Lp@<E?\9?9%#iiKjaEG@\LI<AR9<BSd+BC##L:C5@#MY
PRNjKw >I5=?uN^+y>kj#XY+ChkkV<ZHPN<A1>A#D?QGib<A1>aPZ:S:^N+^j14?iZ<n:Ge#E@kFi9Qhe++tb@A
JuBCEd K>cjX$LlbH+C4+Ae9<A?kXhA#q<e:^N+BRTBj+=>A1>?C:Z>KjaJ9AL?cy!j\C9k#$9heDI@kXe5Q!<>
\i^H/w #<u<BF+Bj^/*#<u!BF/^@L!$D!jLE*nF<9MpFp/YJ@D1X\pTuC^QYdBa&Z/PBj$Z&KeRm=Z>=%m&@/Jj
In>?P\ >1e55n<uJe5VmMZ?K*J\@8haIQN@kYZ=L:DA@\LL?m<JAS#k@#El+G>Cn4<qBLA^@!plkQPjT$u>#dpI
/pa&?^ =tSq?Z?E1GQP@=%EHh5n8kK!kqmp8mdaPt9uKq6wQe9KYE1&dC6:1=k^c<Km9qymIlt<CkIF5yk4IARk
n+jWBj YAiBpE:lFF5RHbuq8d4weya^KA&bLXQd*6*\XbYa>!nnBl&uGiK%l>=?Ki1%&*I6!!QNk*+G+>9&8mcE
6*4B?K H9MFt>!E=^biIKR\XH@E^a8KVku:4tpl?W=#M!RWi1#uIyX%bQB%A\cAE*JFcS%A*jkFuAA45@RdRblB
?w^cIh b\:=u1qZ:kJem9V&CmlMXe=p4\IlAFthDQdTMbl1B%KQKy*D/!bCWJBlJ/LVWYZp>X*MYqAE</Xl$>b1
HI%@d1 EQG^wwy%d#!=qLB%9GRGXXYi&<lACKk*1#We99neJj%tpmTmNL/KSaXi*d/qR8&:wPNE9NA$E4J#BCYt
V:4\/< FAemEY%qR??JwFyI@LaQW?Q>wnWWam+DB\PnMC^VtB>yY%uBhN%P8b^Li\a*NN6&Bmkm9t99LZVNT\k4
LnLFjZ >59>dW6J=u^t*C=jcDKDbYu*BR+G#IJkiPTt@b9/:mqX+klw>QLH\pCeMYSMm?R9C/DKFAy+XG&TtE<m
X=J8@T l>$qS#dLZDccHRPie^DiS*S98^1Z14KtK=CYa8+F4Sh4Fn1Fatl98<8=GGM\VRpCeF8Rl8P=PKaN+l>A
W4BdII ^>%/SI&4&e/FtbaGAlENR8p\uP>FN4JWal5YqYFj!A!@iN8:DQqS!W=%$#db&5^Ke>Nc=$=*pu\TZRc:
nj^AWl BRwT6*5wL@:Ei<WIRWil@J5n:lbdAKRNlpGpWj+d<5+JcTK>&VTeM5\8%+D+L@I^yRT\k\m1iN<bpwlP
lLtBa/ qRJ=XtKK+lC/:R?RLyu:c!=X94l/Hi+JJCq?/hBLi$a1&H=j?%W?Z/ZY&5Mc+4y/y8qb8lMXDQI5bFL<
lkna<= Wk$^94BE!RK1\C/!$chmK&<+R&#8t4q19Yyj:au%?k<W1A>wGC#R!H64DKw6^*M%C++XdEnX<#A+EML*
H1Y@u6 $Cm/pKS\WiNy8DL1mC&E9jaCGK6LtQD/iS@<k%$@bn9acI:ZN!bW:iBATB<K?hSRCd5N?CGm>$Riidn$
l>ha>b WJ$m?ELJl!pwRmi1:<M@T<NqPRtC@En>9XK\#e^5+m%1K:BDN>uc\pMi4yYj+>ML6b5VJ1qLcn@w:&8E
bpJk@A \uu&>5uYauQcP:=Cpb:MW:n<q%4$&/?klimRlHq^wTEM<%mkWcD*tVt=!4J1th&mLA&F%yib%4^CXQaw
8KDIq6 I8tic&F%i$%:P5HnFb6+Mii\*pnTwnpK8CNAW:*wSVyX$Bli8Nuj!1*p/:?:LuT5eq?6NwFHTScClucD
DAQ!Ad MbMYb9qeZXNK^bFLDISQPGdS+1KckmM?J+IRD&VGKAlJM&<^q^G^9w^S!up>Z9^N%P#LhmFwIVK9q6wp
nCCCyd Y+G<wYbC4^8S#+wpnnPccmIREjHiuQcCFXi%m1A+!6u8SKA^t9cNk1+mhqCIbYy@tQNmVBq@jlEQMDm\
CbYqP% =MQT1S$n$\m:5w5Z=nNL\4eGpW^>dCN\ED*&L1E8VBqA=?SaE1EKKMTyb>8WLpwt4tRYddhWGL!<B!6Z
=nD*n? MX?nq>PBE^Kw#n\?\<m&MnT8lj4%:<NKI>%i1hPZEFqVJ<ZeB*W8^l^QPI<pVHNBTFGGR&hl4995#<JL
q?ImbB D4VDE!$aKM&B9+!c+4:e8MC8LSq!=5X#5h!J?^D@Zy/#1=c\tVA%^*<d1mQ?9CbhA*TiL#9pXTN=bw#6
/$H>$% qRPh6b:9=^PpHZ5Qc@Y=R4kJwPmj$1=y1$m+\k/N/J?e?>=<%J+NSwS?P@>h5CwGa@4c:NK&Y8wd?edQ
1BX#BJ k/WVRi6W6<XlclPwuD6dlDwaI#qaFS$4C&JIKPtVhIk%?$SuDXmM#SSX/=?6FRiT5p8tS^PG>B8dXd?9
Ee+CGk qJV61Xp64yc/AQbZCHSXAu6lDdi^J/*R*mNDjARG+RmTVpp>65wBCilF$D>$?SAQMQklGL<1nQ:5>R!S
%ik1?V d99Y5FhVc<cyLi4:PMSGYtypqC9Q<QeHSiP$ww4WGAp6QC<muK=Q\tWBy//IMb%CuF>>S<jIYL/>QXyu
Jj%JwX G!Hw>4C^N?qFE4VI%hkb6H$dB$9b$@1/lLJ6&C65K9%L4^e!?k58wSSj*bF:<k9<AMXtbat>ZGL:^K@%
hI6&h4 +%T+FwV1tD6IhK9#QaQITIcF8!!kX^>1XG5MP?FmXyc6el5eq\%GcSARMqGNcty\SJbFu#QklI<m*iKV
HW4N<4 FXQaQnDWF/lqS^1?wnZiKL<ch#ca+B!lC/+1K@5\M$u4*HYpGu15D+#=d1VSScuwW%FP^!#><C%dhhlm
q5cQb4 lRBG\yc*Y#?8Rmhy>5A/:wRG?D*ke*J8pBp1T+d=QK^HakaZ\=FKT?Wc\y9q:HC#/8KeW?l5^B!hh=L^
Scuq\m kYcN=l%jNuEbQKKVKbk=<+j#8HK%X/LD&M#+Mb518XTKwqAhPJJF*D+TG%PCZ6VItQ9c:\Q+*HS5!MFy
PIyy$S i1@eZbDwP:%LA^<I8A/e:K%WVF&HMJC$CeBXi*yJ9XN:VQKXLl<+&Y9q/@Z%N#16pP6\&wJe#Lk$8d5a
Id*uyG 5IWDyl/Ww&=QdG&G9>Z%=Th:^/8Cn>cw&ka<94EZuqXpKckIPbQVdQ8KL4%hFYVMIHWRnZdB9cL?GBHu
BajN*w XICIX9+/V@#F%yTt+p/^GIF5w>:+F*Z::BhjQWmqjL&4aRJZX5ytn/$5+GGMw#=5cD%M%B^b<EakZGu#
CSVl8c EPX5!:+4mBZKP\kp#q5<nc@JDJZhG@GeKMcG8!65bak!d8##1j6R&XhqYRC+NPNwLIu!*#A94>Rq:itV
qWR+yZ yh*JqS9nFI/TLSG1:E/1kyeZCGZ8kWLPj\>aCH$dFS!ZFPHnIY*@%pw@ucFKXd<4dm@wET=A54\A?Rm#
?wZ<:h Bqc1VHbMumbE*&JlP9RN>NGIpQl^P8$:b@Mb#@Aku@K!t6Cy^C@$d&CH*C!h%Z6C+1tlw5ZQ%m^5qYVm
H8PyXK wRN+GQT*X8VWA==9$Yh%LV^9CR#pY\!u>ct!nlicY@$TkG^ynC\b+GqFH9kej1w9LN$&Gnb$VXQ<MPu4
\FnE5F Tyl=ZtD@%!KckMb<PGTda%bIEP9:N^Dh%nDG?J#Q84mG9uD=N+B#P!=LcEpkyelJC#Fy9%DRu1D:P#$V
BhyM5Y Yce%+lH\$bjNk/LQm4piFtIYy?:!B:I>5@*YheEdVaYie\eFC/L!5cVct5RRX1eTM5KEhJbqphC\8eVe
GDH1wu tCHd51/5%umY=!=Ank#*ed<I%4X*ZXMLhy<^hML@%JHX\XXYtP*8l^qC56CVnQVEy4qh^ZmpcDm=\m<@
S:VweD &lCmBjV+/PBtCSL1c*PkebCRjcT5=8P5V5X$TMYH9<RXeAVqiZ/Vy\+R8aRW6**8$<Xe9TJyp%eRPyJw
HH!<J$ @AIJMBVcY@Xej\kF?Pw>jB*T^&FWkY=!$d\>WjV?Rqenu+4IdRFGu\8jLS:B9nYGVR!!$4y?/Cw+E#Ht
IZQw9R \=Z4mRId$d+/SJkP^BWNmTw>+&yccNe^1#GXG1/9B>>%#dc<Z8tZmXdVpYH4P611j8%1>m>k/1H<XGlH
*jQCeE <jGE\m/YaDijQ5cWMS1c8yk!S&EeHY$YZamN1a8ZEAlJ:PhClLdEhZ1N/@BA6Z?C+SDH1mBJ+m>DMuS5
\eL#P4 I:JMcp?F9+WML#Dp1#nq%EZBADRln*nhF?Nn1\CFtLXKKiacD^5B+#kPuYY+RVhJKVCEGLNHAXS6NQGe
wqwYil qAQ8Ca\=%uBVpp+aKtp/9?1qRX^=Y=uTFm9DTR>LX8McTPGJ1MlJZ%6MKWFD+VlKYZP##%lAJ4LT\5^5
d#Xce9 WuyEc/@GAI^lSM#44H*DAR5%VXEtPC%KX5nLS*HJnXHJWVQNmhdX9%hlqnZMGVNlTK\ARy@!Fbnukp4+
Nup><1 Pt^<#bDI>qX#V<uRW>GQ^bHLpW+LjJdNaJ9QpGZB5CNN&1jy5W&4dp=DZnPqQ*%wEHltFNc\Fn/JKuCG
jDFh^\ nG:Chj=PC+ybX*?RCZ&W/1^EZ4En>ZCXW9EcEjn+pw!ZYTEA=yp:?Yaywe\FVFe*WPGap?XeT4mabRwk
\%b+5t =Ak4#ZJEQJpEt1aub&XlN6\^FyNp#RuE!1tTw>TEA:H!:ubwwS4dANa5Yh9ynFPFMMK?Z5DIV*GVb@Yh
pmc<i9 ti$KP?q\PeMKA=YS>aiF/YjiKu#W\uD64DpejWWm\uwDy/^1kAYFNEM5GVM1Q<9CJ*AYJ:1DA4wXWS1C
!MNBRW tS+ZSYhBnNYm$P?u&NpY6%+Xk&NmuHEZSt<FuWiNKMtJVq>TAA?HqD%X9tk^AI9XJLmiA:QkRkc=RXbC
RLP?S+ y+N$L1umb=pT==%e<Ry<tMTI<RSpNcNCYG?E5FkbtGC%RP^wYXmT8b!Ty\6p^yNEny<\$GkIMRi+jdBa
P$ySTj XE=juu%/lWHMbZM64V^Kwn^B4bD=T81a&iEKJ56P=qSNqm!JQm6W$ZyqXMtF#pqcB/8Z#1ZGw:dB/Npu
-A$VkS 000007df433001202b4 Page 56 of binaries2.zip
p$Fup/ eJ&AY?\ubXb@LhbQY5V>>LM%LBT:Rlk8aubKZDF1uGQ^R8lJD\Fk$FtnEHw^lXM>yXKZQY8lNwaYuc5L
PT=Ju! n<CSecq^X<\m?w\ML=T>Te&?8qtaWeVT/HT+i6=LBSEe1#%JXKZ>wSk8Ka\&^A6&J5A/E4c9nW8SY*\b
wWpiCL k<8&4n<Zb%\Yk<J41564l8wDjY\wau$Li=bd*ASpVl\E+8yEk&lSk!pCR/!9aqJHl6Wq6Ib?4F%D:&A8
NIDnie \hMB<WyNd4EKFPnK<Ndl1DJ=m:d^GqpDTGe:!FhjhtwPpdDutVA?CdQ&!4uwGF@N!&*9K4=/F@bNT&*t
//#Sd# *AVc<=yhHJGGN8QwRhdaTdZ\GA4GVe8I$GP?$5NSMddkVyKKtlTe#B/$>6tC9F?qIRF^+JE<XXPE&yEe
ZXatQ* ^/64$e/BTHL8ZueDB9\5*N:6yaEcMp8ZFHWDEnH:e\M%MtAnDjAdQdEnFI$4A@+ee+CMw<A*bcTyIL$N
\XTX6: <pRnInD/6AL:>85/nq9a8JHESk1XdKQ*kEi1di++JL>9VVGKK9:TXN1WZ9J>IMq/Nk>%kYRXqkCMJFYq
V>!RHc 6K>wjXc5?edmP!ewTV/tuN!T=CNJJ6!ZL@IHDXVSq*tt%nP&X6alH$pQKyC#Q49=hFPde14M4kw:ibqM
Ch+hbn 6YQZVB14IBnHVEEBknYq**QF#>JmXC4&&yptjiJL/9HyiYttHKyeD?F5QT65EXi15wtDS8RNMKWVLwI^
#ZCqml FGjbQPNtJ<!bQ&RDPElh#MBmjTX:F5=&Vj8dnKRHD<>GAAPyMN5%tJlau=:+d<KQanPW?6G+AycW?4>=
?\w?>/ HM8jtj:teW^kR?:uRM!KSBdw?y9\a\6<>i=9#pYQ+lTTFwK5ET!Bp>?em<*61i6tKi5niL=JGJ!nchiV
4:#//J /b\V!Njh1SBJSNiDGb#dGS=dGJ!LcS1jMyI9M#!P$y9:M@C?yjp?aGyCyCZjb8InbQk?EH$?\^R<#@bE
D$:HTP !4li#ide#nI+t\S<!t:?uHXDqitJm/pyMIqQqNbCpZt>t+EQk!qa<pK\B%QkW^/?bPdmicatH^GZXm+Z
X#RV<Q i%/LKb+QSGELhQcTTlG?W+EtAIC9Di5DpcXyqaN9qI*9nw?jlcpbZW\MpiYJpb9!CkC^Y&1RldV8nk?A
ayq4/i KMQ9#Gl^!eC9R@1<k+?ju+9QW5^FXyVmVtmDXwL@wRV@1H\yNdiqnwn4yLDq9lL@QG>y5=\dIqP#86D#
Wuy9!N Qw6#5?1GyqwLy/\Fy+cdw5cLHC@FyZ4yGbdGHiI!b&$4d?&6APLH$ySd!dyYtdydiXa<a\nlNkkNMVa!
CtM89< W%cnQKyctL5=W4Ju*9FwDA/dAS!y^q#/V5\P+Zm=MFVX::mXl?6dhjhcnhl8jS6!iEDL+a$5:/Ym&S8d
HG%?CD Shn\yGR==at>#JyaAtB8e<k=hTpJXKG9#YEYdSL^ZBKVZ?h+?CayCTe%9$@tVE^8XjnAjXtZuJ*Tiy@T
iWWeV> *J81<iHnc>kCniF$ddS$48Fc9L*1NL#MNJ#PY/IK9P&1Fw?8F#SyQkB$L+l8L+nPFSC/!YQ=Cl5=@tuQ
R=y6Vw C?EijRD$C=t!NNbiHw&i%!#Fm:5>dXy>u6^>PaJ>&k=XGy6>K!LRBAm>?B+>Ak/Fdj:hh&RDdZa>daFh
B$*IS> 4!%/iLm:$*TGiMAbceGD4!pG$wmG$@C1W&qG8Kq1XyC/NLb4NZ44iGd48MZ4lX6Hd+$@Cd%q1j+t@R!&
jb?9X> %WQRRE89%dC\6XuFwViBuiiwLRin:Zc/*TT^9hpVF5<:mXk9!Y59GT<PRmM=idH&a#yLcl6TJ!>u&p4>
hZwMFP eD6@FnjG<Iy*=d%+y?iddp&99JecM#ijm=d8b*%L<F8W<dMAeCt^uS<BL\Rk=6/<td?*Su9y%MZ4N4Q1
jFFcM1 A+BRYZmnm/un6ylTQNh8M$<Ateu46bmmNeiqVHT9$=hi86m8m6>iQ>VtXJl85d^1$N@m6yJi94lCMH&9
*CC/bX 64I/Yh*mWhliPcm6N@#THW=ddwdHE8M#@/e*J=qcGPX*=VQ+wTP/cBpEVCPLt/N+%cN9TY4dquY>%P4d
EqEAtG Hn:F&4K#?De%<#hnR+^:SdRtC&=5hGt6dMe9Gp^MB4bLWTX5^p=14WHjdp:i:1y^H$!>wW8?jh#%!Q@I
&=IGCa !:y:##:hl9Ey>iX\?m9+4NLXNmAAIEKR4a!qG\WqALH*54hKJ+wk?#HqIRP?I*<@+*p@d^VSb=Zp#<yR
QXBjAa AmeHHi$>lN&H?1YHHiQ:d/eZjFWPhReQ%!d*iA8LPucQMqcQZtRjE8+i<KYu/8c9<aAQQS4kMnGl>BD&
@he@iJ Y$\BkJPbJc@Vn5j>n\A$9A$$CLV=F:Y#%=9FtiBVucQmyhYeq@b\teIZd#6u>VnQ9dtH8DEYhGFQq&k1
m8a?JM d!BuM5J4CDFGiAa#CjE?6:J9<JHWiZ*:*mw#81#S!nLBy5HT9Q?F!^GkNhM9a1nWSqDB+eH<TbebJ6h4
S/4Mbi :EF+uD9&Y59kFu^@jW&^tXw5=jm<qWCuXXh+9EM<qu<aa1b+I6pw+c*cJJ=nnwhdaya=SA+AHmh1!BDC
tLqF=X A*ZIFbR$p8eWHZCGBI$8+Ren<I\FL\IA<T=ImFTRJFyeI+aGTMw%dm1%HVMwVK4CpDC<A=\DAKXypqpB
wFM^jD R5>H8w\@a1RXut8w\*&u#^pNPKVSuqLDnb<1%u<PaNqtVIjeKu1iq8>#>%dYTkpGpp?F81b&AiWYk>SB
D9TPuJ 4w4%$?F6aHpTamMQ*RWAPk9mVhJMqXK4%mNccM<KH1/F6c5eyblSkRIyDTY=\plQEJq9XyMlENXenQS#
!n4ldd $4IaJ\/!5<ap^MA\P16IJPiwcyWA<$wIhM9l5dh\L6=?*RapZkP=$IlA&AbE%Bw=E:qV$C4/:?1P#9yS
qXAeFd =mK$iMklInq?MCi@m#4iS$\XnZ<?9Z:>pIpmtK#5h9@&MjQVX>QdjPMS&GeCXTB+:w<wHCPtSIi=%K</
a*:Q/E tSFj\qbN9MP$:a^!WBbB*mkK?bn9A^Alle>6SnWX?y1enC\<?a\hZYSTSAY/5+\baB8NBt?CL<^T+@bC
\qcy%q ZL/PA4<4B51NWCL/+q$!e?mKF=LIK@J$<t:$$CRAy4C:?<ilWP65AkBMRJ?ChMlINY&9Q5R8G#:/ancL
NAD5Bt LQA8uu4W!GQH@FZ8/&><+p=RL:tS#uE>YCb1@VV+l&GV#+X!HjM^SPZRSaLy^M>/&1XE:e5!8RVLXQnq
YJl8<> YTlN8GY1i=ZLYFZAKt11K4uMJXh#+PmYaW:4CW\ju=?EcQ\qpPH@ck$?VmDdj^TF\Rd<W^RGG<6Vw#Da
Q*AW+* tH<TleEJ@JMD/T@G@VE1+ieiWTDHE:DAZ&A=u+D>8biip=Z=j<c!5j@epeQK<kV5#!McPFtBV<C!@5Jt
Dd5haC %mhk\V<jK%dRE:C@eF!^ky?ABj+C!@cEPj1=SB+u/%N+^jF#y!d4E*kF?wZ*tJZ#Q<iCu5C4Z#qmRW@k
D=Zeej FRn<<:ECQaFZIPcjS#TAu5A4EQAZ@V/BX:>R!PMEQaFZ4J\@n\+AQaFZ4KBjaJ@AK%d\L?d*Cd^m@Zpp
hAWNA^ FCjwCd^m@Zt=TE:\E*kFBQ><*RA@kXhA>y?9G?Au<A4+m@Wb@ASiAZ>iLyIV@ASi5dD>jH:BV?AX!<<n
n1jy9D 5DnBV?DXL!NH\P^QYcB@eeBQ8SB!@9^EAuM?baH??cL#S*%d?d<n@$%W\6?qCZ?LT9ldEMMj&tV=TcqJ
^d%Bpn =l>Z^Q<*=jp@VZt&?a>Tu4>YSHQBEJV56dT>#/M9@ih5b^mIJM5GILETD1F+bTpLACTn^Ia*CGF8n+qp
#^<%/% IGE<@m=*mJ^:TFF@GnIR$8q%lGB8p\CwY#ENu^$pE$cB&mTkPEuWW%Rn<JFHw55J1:hw\b!ktEF/Hy?*
qN1Ql< Rlw*6RPIka6Qbq$ZTR5THJAHCa<1CSE$!C6u\4J8GwukR&NPGMp1RalW5$4d9&mbqI^\+qqp!$XXwy1i
b46LMj &cbeSHd&p&cPhI#Dk^T/YP>Yu/=dNtcjGw*Xp\Z69!FTBpHI$PnCKK<9M$^j<6ybK9uc/M+8KNH^!+>m
Eu$by5 6V8PL&G8:&NP#w:Gc#S&&tScK^<iKKMm^>eqc\R<<^ibEul%j:EtSZ>$Aqp9QMJL1cP!?q=B/6Y>%Jw&
pFjjw= $QmDFNJtp\cN4yQS\qk@SIkVWbkj&Sa8k#J>WL<^Tm&4*8KEFejCKFLIGKw$+9HLlLy>yITFqY^lG%c#
GVhnQ1 tq8Jmd4+MSep#h\+*6Ryj*>b*MH9d/puJe?F8eYlWF%hwLYV!>Wp&MmRM/q&Y%<tq6bBD1Qq%$EG^X8?
F##BdN c&E%BP+\MBblRw@5XEhA!JIc%9jLk6Vd!h/jdVTZCkJM5?tJ=a$L9@w&I4aGTc>4+%i<%pLNdpYtuVmY
bhq+jc yW%^9iy:ntw<E:k!aX%Pju4^eEwVl?tBbV^m8C9K>%tklAM^?b+tdT1FYMHFLMLdt\dpL#CEmtlWEe>1
p+l4tA wVG*S?Q?#eY@CJyAjke+QiWh\LLIlV8Am8Saq4@ShbGHlTmE>^1jdV5d$IWKb<TW5*DH6q5N:VtZq^EW
?#+uci %e4u#WVQ@5HJGA@T//8md?An^R!mQadFK/N\WZ+kb8VXtpeteq@dlGDC%#N5%n%wCKVn<w?c8dG$mElY
DCY*lu E&M$w5RY^Fbm8kalZB<Tjab>a?KRlkW*P*yiYGARiEKnWtQCR4%E%4Qm<ta?yib#TdFA4!J?a^wDKbC+
E9cQG< edeGIkP^pEL!^$9q=1ViiH>%1BcCVeR&=I4#?ikHJTKB8@y=?dYj1A=NM?uCRHS8LZjpLCEF/N&^jne8
X<kLbk NK4%YPemXD8pP#EKTd6V5*yM^Th1D+?hap91Ve$%VenZh9%+H\p*DNeHt<C\^I9D<dEA^EHYFK:i=u=@
yEaqZX 6ijW?eSkMq9qJ5=kLFy6k*u/aK!yFuG^9e:aakwG\dpcKNND<k5Qq4FX+lw*&!FjAbEkpm:$XQP5LkNE
D8k!&# CY<tt6i><88Z=CCyAFS\W>>A^*nl5=TA4=?q<L@+ak6nYpBDdFCK+d/>NS+lVdXn&Pu<kwV>iaIGFLYG
Kqdp4t *q:a6Ly&$&I:4k:5aB@tkB#&<J#kScPGw$RmLuM**n9tV$/TYN*qwbFC4d+T?6:#hZ&hPCnYn?BD%Cjp
il!cTp Qbhu/yQE*LIm9Z!hEKt&Bm$?Ikuh4:Ly#6Ki8!<G1?mk+<LH&Cn=N9L6dd$k1n$Pu!EPqdM$ke&MkTq?
WaNpAD 49yK>n8^@SlN9#%^u#^YI4t&CcmSPca5RGySV&Mdq#klWtep^5J^X$KpuWj^T9<X5RCTaE<FnQ/cEYF*
Dt/hJk n/Py!$6wCBn$5j!ZQQ+6XkG9eBiIJ\+RCP8?lVAbjCh^ptVjEQpYZ8X:S1EY!1cuVB^YnW+n6CV*ZBhD
!?XLT$ w\C:bXTmtRA@$!W@=lXd:KCZJGWyanwuPJyu@l8^Ch%hIW><hV@ue&GHEYmulDtp:8bGjFeh6QFK^@5b
/LQZwy #m^L=ii<AT::WMX+1dm4l</H!1yT=B4CStV$*WwlEHE<tknde1t%l^&$9N96#hPwSVL^RSh5>mJDSF/G
K=$Zm4 Jm\lKKMQNBIE%nT^H1XHX?6yZ5EcpkSBnw$WYPq$!c+IR8RMkT*6PJJiGuC*KdqR!h!Bp8<>$Ban!KW\
iW1qR! S\KTIFCmLlKcpB+S5GlZ\18tC^!uqtwMhnpbD+b#Y<*+PncK=hNPZkd#Hw?bp68H4CnSY$4dXSj!HVba
+jbY?^ +MB\^!bh!c*It!JL*NX$l^DnaB&WM%baX%Bib+KGiaJ&yQd$B4aw^q@Y6waCXTqda&G^nLWkDbSlFCW?
JX%d\N R/HC&H>/49hCR+18Iyp61%5B59\lQGHHi=48/C*BP%ud1LZyu8FXp%#6Kh99IE\^9MFZChNe#\H=G8y#
AHmW19 J\V?>p\BEKk$kV^IeydcyNQut4EjVbuiy1+4R$8?+A+KIama<S4JQ@jDE#KbF1wuq\$NS=@T51#G64VM
-A!qjW 0000f46476d001202b4 Page 57 of binaries2.zip
G6C/Y! 5#%DuSXVY#ndCn<4Tqm!F/9/4JDNPJ:QJc%kwW$lc4^1tM!P%5XS\+j+HCN$NLqq^?mM@WQ$nqBC<!dd
55YC#! dtpqE?n=1<yEN@>tK>keT8Ecq1!%Z9QSapkbt/4JYn?96hk*/A\M1KY1u@h5Ma5LmyAk//eN!<cRqB?P
BkaY9G ZC5?a9m4y:+$K:eVc#Sy$hQl6jGwLDES?*BicZbYq*XhXw/8eS*?^8D%!Q9wQ15pKu/@qYPWPaV$KThi
4j*nnc 8&A#lPyR>\V@!wEdSekk@nny@BDZFdhCGHhEZBh?tp:pc<a>*PkC!*AB@<:ESH#aBwLMIc9&GtAbNHFl
64?GaD j<q1uJyBh+i5P$@9q:V%^halRFBpG8:it<K$1$#4n+VynY^mGI8TSK+YDe=\6Fbe91$^#nKqPm%e@q>C
uRR8j& <ZZ6LRmwMNyM&pJVP?^l/Kb*ehKm5:XY&W=TA=Rdh=!cZ<B#tX=4#KiyDB#K$8%@jmB^4eN?6SFJa>:K
^R6aR1 ^@KPWy==M*Ln*Hq>h\CTu^T<%q^%VYdmP=N4?jW6X6Q$#MTPiNqMyj5&!w5#tJR%iAHdw/#ZEj6l<C*1
k&J%jh I=VZI\Q&$tE$G$pPXPkHbX5J?ya$:^5l/c<Pn$t=dGielP<P>A*9nnCVlcRpEA*jn!>AA!wEh?PC#ZbY
*&!!V6 1iGnn5nDnVMY1KQ1wDLa?t!NBkubSKWp6&j&#WWRR&qDVB4i\4alSpS1l>SwpQGqlyI>y=P@!59\JMj%
?:iyl* MHY$Ne/VQPCGm@IS4Gw#G/V$Fu&SL8@=5V^t$X=>KB@^jTpte6dKme>l^G=XP?N*qY/Jhq4QnCKBPtqH
mT@Y&W &+AlNt4El=EY:/J%W^9G%*b4686nTPPjIhaFEPnYEY$a$@1PpjY:9k?l:lTJVNu*lCFwik:\lI$XZMy9
lIb\!e Ai*tW8D6$/Ci5Y%BaQbNuayTI^<L?MLR%$YpyMEL?ReTd/N<S^/@K=Cy1epT&IH&T:iXNR\J&e&T%>+J
?I$6&/ !=amkAmuhbjITaQ41njdmBV!mjRD8Z:=!p4eF%BpGaAI5%4Ynucely!%9nhkt#eJ<>#PpW&kIG8*/mM=
kalW#< d6AZ@Q#n>PhB^!dBXWk:ypWH^!kwTYYI:y\wYh%\?/Nqe^ZnbiYX%cSYPYQ:M^YHWc&pIwNt4?:MbMXR
S1HK9< Fa>lDYtqMYCIm^au?jKbwq=><W5*uklFl@NC+@C^NCbX&C?R@S=$Kkt:>^EJ5Ja@h9lt:D5!8k+XRPA4
\tap/p WpiARM!<nRYC8YE?eSimA:yJ6$VIi^4$IhVZD8/&b=/qR:TS^9c=cCMT?@c4y!JicMF+EX?twq:59<<a
:w6WLQ KZ#?wwaGElICW9G+:I#65#ZH:WnMHjLWuR^ek4=?jE<l6P^GY!q&w=m=d$$jt@nPhK+pQuMDmeW+bV+N
aWI5nJ =i:DTq<\qhXX*6Vd?tt^NLl^#Cy<4^?LQ1CLXKAH5dBkG/:t1/W^<5hQPQAEGHA%<NXyQn%#Za+npVXV
e9k8w\ d1#YwFn:S>TGVHQ<CL8+t9IT$!k4$LqRi@qPkP#*#I%*$hST?i6nZ=tLAmVac5yD%1kDZ65:bqJHk\e:
q&&tYE <iBX&CR&PSV//jiB^mdwElR\:!&!jKAb**^eT6%^66uC6SI&%DTP!ahK$!l\%mpMC+W8Aw8XtRZ&Xb@j
G$MW?G kbl$pdjw&TmS+MLIXjiy4<9wTNEQKdhp1X/64E5unN5mE65Nna+*6QmhMC5KJE+nXp+w9anFw!Ddek%N
T8CQ+5 Pda*uI!ay1i1Bq4Y91R<Sq49C*V\ZD\ZCN$NBy&+WcPbkSWcyt1%\P5CHSF<b<Mi:Fb9A=S>>1F\EaIJ
ka&$Ry ?Yuth1J:@B!GI4jiT!5ElEn\LIRXyF65QZ=6eC6S9>w*44YQ!1je<GaS=ypbC?&Qy<ewyC1KB6NGk$%u
dK/?=q Lt#1\wu:9n1uTp?Rq6E#\\VVp5Nmpwh>EV8GG:e68RHap*eDaGa=DpqnSTKHGL4$HYaX^Rb&!MY!qj$+
Ce9btj +tS4EI%N@=IYT4M^>l^?C<b9DE+kC</wkH+>cQ/n:6C?=Y?q?hc*Vy:>#WNd4KAF46h!chamcWH5XEc?
bl1+FV :NX&GhT8H+F^/jnNQR6i%Kqj%dqeRd/eRP^MI41e%d$<%RN@^RB9/+CQ>FRl>F^8hiMj>RRk>K@R>FX&
bZ5le4 hS8i+jpA<LNLAFnuikp+?9Yu?qeplt^W?1=+it^ElkAAym1Fke1>$b!w5iCn@lY:aeNLA&\hp!5M\\Sy
iHtLeG k!5$I#adI#aKW>ZuP1yCTP5i^mTm=t!B^m1#b11+AIl5C^JS5!6lm+bR<\bP*a<AR6emjP#Z?NnSXt!T
?@&FEB b1+F9:ql5SPR4u16ZeX%ZHMNPui6XYNkE&J6G1y%4!I5BZiI&JbN5ai6=#S55D@aZpHakp<M&Ak55e@6
#@e!eQ \bi&JI@&*>Ae&LEeIJKNEy<dbK9w/w</86E+NnI+4w@A=\c4/YQTG$Wwt=EC@iSW$E>WDHZL/*X=e:qX
hA/lpV %RRwh<tVmG$bZi#yE#tkL#%lb4*X\eH1>bE!5#Ep<Wt9+nM%me<%ZW1%L48%=?M>XCb%\QP/PNp/q:jG
6V&j:q nWRtB1&i<VQRAB1HK^M9kB<ei:%Jk+=^al9t6$/D1&CL1%QQK#jhd^<MP5@N5FZ5%ScNGunj5yEba*@&
t1t!nF hF9YWY6<m&%nn>Q1ub*<tlnCG=9X+n95&@tcb$pwblCq9t4Z94:J4:?n9eEY>*X=jM%B=@Q=*Q<:9=Hc
6!lnZR 9HHnl>j5H&#u9*p$8MK^n$Dn$4*GidS9w6Kh:+AD#\a$GZp8TP4lTl5$kaP?&\W*RAb@>*@#DVIp5VTR
pNc/Z! @eDBQhuBnTBRQXajl?^NIp6aI#N<a&W+S*&+i*N+I^8>tt!5u!pq5V*6@pceWEXCQ&FehS@bN<QSnVD1
ccFk:B d*#pk$I\G&>aeKSJ9*G@I#YtVN1JZ*iKaJik*PSmjQcYc&H#HVt#9Z?9m!G5T$=6FFt?1!GGc/PhG@m%
=wp4w: #G!w?peHDc^+h*C/JqailE1^=t!%X4PCX8PmB*6mjH%9GE/tJ/hJpH681F1%Q4a&jFdy&&R:\*WAMl6c
YHi$4H wwbdKQbn+tjJyB>5Xlj*TWBGJyHAJ<qNBpApcum<cW:>Lj&bGACq+b5\%=!<YJ9K/b8cMB!<DyHG&b$E
+Ca&*Z PEqLLnY@up\VAPB+LCb:4Kbj%#5$?=y^Y1ShV&aTl^BpHTN#61a6V86jQ^C6l/ct\Gb/bGh&6taDSLNX
4S5aMF XhKYZ8dka&X!Lq5KRGVhwEPy/4%PZILTbHn4iy5RQ=9DJSumKbQRBA=6$hFhwE1wQ\%#?SC&bPPaXB*i
ECtN:^ +qLwXlu?@X9lyhd:y5F*ZVW\8aMS6lASniKS#!Liljw^d6VS=eCRQV8&^L%$Y9J:=Z=umb@lkQ?8yaCu
>6Iq&n ySqB1St6PA84mK6IFM5w?1cq<kCCNJqGVeY>R5%ib6a*qqk9%5$V?y8*l9/\StN\uIi$=4XTXZ%>9IhP
@e*VJI NchBklbi9u68TMJSIN/iySw?<ti$tl>@b*6\ZHw#%dM6BXeAkGMeL<t/XwtZ<\T%C+pG!\y%ZnJ%4X4%
lKnB@@ 1td%4ZwNBEw%ZlwP4Xb%6*by!^cNZpcNAIl/An46&SupY^P4%FB::8kt4XAQ4@jNdP@45>HCjW/c8N>w
F+i^i% c=X/4yi&6Fa&Nq?>ZK+n8mF1daFwJil&cC%6T*by?=!EybXjS#Ddqn4wiX6b^<X1qp4&&88<RFM4@*6!
JKZ6ln /LiDAyYVklT:n#hPlYqa+by9uPb=LJ>4n\w%MAJ5XIXeSNKa!JdGKHqaZWV=uh6I=WRKl9A*a=aK*Tl=
:RwM=I *V\+a?h>K:<F^1tF^<YZju^l+cB1$Je+cc+Q<SGZ!BkdyV@^%PmKI9@P1*@FLZ<q*BBdwY<PGjyF8Q<L
%t6hkE c>mE%*A<tZ+<:?&9wt%e9RN\BR*bMT^hT=D8mp&^Dl!\Y/*YQabW?/&%K+i^y=C8=t*tapedFAu%P&*d
uJyc#H :B^ih%1>5By?+V*iDnHBC?*\t8B>Tu&S=aTD<KSTt=mVMBiXmp^^$uaZM41DkC%VLpV*lRTnXZIy#PM:
acmb#* N::+ySka&=ZSh6d8QNmIqPFIVj@8b9\jN:w#d/Sk@CF/Yub:8R/JQR<1&V%mG>@E*8uE5ai/j^TeiBP^
GXMt6a eJe<qlcC1jytWV%=tP$ndJ4XCQaH!/8n+c6y1/98Wj%Qa\t6a^DbNtud!*P:+>l/m%iqm\8yBm?nX>6Z
GNdS>P F%<mFF/cP88dKmDnE^5/e>/D8*Y$wN+RPbiyp+6nm:Xd1jG<Eu+lD<8nW8q=G$eA&eey9Zy*tZ5*QIlL
i?qtHY %1@6+Hj*PJDt:/*6/<QH981PN1k#P:LANLVGd$!w5QHc#Z?qiZnFGp6RGV+La8VNiF@uCyc8W/IYT?*L
KbEMH/ ?Kc*b45G1%@il8=?ZmF/MP6+eV/8G#:B8:mlt:%\9#pXeAhnLP95Yh=>hnZ8/W>P89jyHqlFyZlw8N:>
\8&Pw@ ^qyt%p6h^&u?yWj9G?@iXwm?q/H:jH9HHWjHh/N:h@etjNItJJ++YXew4!5ASNBj6cPIQu8hEpGajELa
hn^:HT cuQ:TwV%qb@mVGj&hQ*dGY@t1l9KX<LHGy:R+j5Ip:ZVC&@Jm$cW@di>^XT$N%YK#Jqcu@\M+&eNZumd
1\6!Xl SN?LPA?KK?tP8/:IHd*Fm6Z^/p&=Q?aN:6MJ9@kWjjH&<bRn?hwN/=R@?j1S@hw:@aah:Yd6$eG:@JTI
$Tqe:j @jbD9kN@:k%S<T%@@e$>^QYu&H9?&hD&#XJiAW9<WHXT=\wiMhqN49mip%uQNBy^GTZiC=kNACMiMlRp
h5l%um YqGVNVEuutBYLkmWm<VSLjbdbWl1Dn\lau?T4Aq6pB?m&Fh1+kbES4\8A@8yJy>X>DBJjWPIkAXBc9<8
k?J^/$ MbcmhV>i+tk+SNMFC:laJJ#lQtF<BXJ+#u#WMCkY\EceME$I>Ja\#eKWEVB/VA^nBBRnk5y@qLD5$9Hb
kp#k?/ wXu:PFEii8*Ww^*A<K**/BHC>/Mi\+Lw\d$uwH9nFDj%tA\XRGqak>6G$akWw:6%tunZZuMjQYdwtHVI
nElD$V WI9<PASAH:SYVYYJ@*kAZu#^X8\$a@+RlAiAWC@QH>1>%A\jW!Qw&hC?X86\YV8a*HP?mbymIMhCP^#^
Y$F>D/ XXB9M#bpjNFq$aGuA#AkTZ5uDpVLw<YFV^#^!9XNcuIki@Fh:FQ^nWR5H=\q+bG9SGyLPBqK/jFhP$S*
?ulVN& V+dkQ4=<VBCKy?a%JjLtRtdBZl5NwLDKpA6Z<ASZQ/!wlL519\kmJ!PL=1P<dku6WI>yPX*a&eh1?uDk
qPPi+! SD%ZDGa\1WRN5$VnIHKYJCXDnZHe*8D8ZV:J+Jq%PK%EVF*YDliCeV=>BVHkmnimhK8Y8cwRe^=a<bu$
4b4whH i=h$SQPD\/6CXAn85aQ1B>/^YQyBASSdLVtknJH%9Ime4PGmCPha?HNSmjCiCCuFW18!R&:bGiRVRetD
@hSDC* 46P5:BKy<!DBG6S9kht^^!uhKCuAm/C>hhPaaJKauMiiRcQNb$4tiiljldC\=GAKm?HqnJVB#tBI$9hY
n9Wl\$ N&uCX/@I%A6>!$Q<SAWWw@Jywq?dF1qayyTWq6I86XTY$iEQ%jyKT<%L/#LtW$t!P%:8hM4dGpGN/!HN
Yj=q^M *8#XSCnB6PktEeK5MYK<YJ4Rub>YEbEyZjptJn9h^<R:Zq8$LDCT=BW8qKdMm!E^wt\<L&/aVB@w4/9l
uq$/CK 1yhpCkR#l=ltKj=M%wL#n?Z5@1?Ktjlnad\u^$^\5Q<ybwKD:cp^E*>%pQ!4&?ZQ@m$&%n@=L*@8w@y#
W+Lc!Z td$@a*<X8@DuMu5@\j+mh8HQbjb?k9&FQ?@Qbjb?kkZ@\pZF?RV5L&IZ@q^t:!jau/6AeQ/=#N/j5YD\
D$9$$T L@wFQkHL>uNj:=?4:Q$E!@J#@#V:E*kF@pWTPj5ViAZ/SZ\J?^N+BjyFHAD:E*kF?wZ:p9$J9AL>kyQ5
-A=H=l 000af1b216d001202b4 Page 58 of binaries2.zip
nPEGYe V?AXK?jQ??X+A1>ALD<@Zw+u<I4%F\wTHE@kFi59qB\+u5C4Z@1&Pb=ALLbjBQL<WVBI@8@Ij?hn@q8&
J</y>m ?&<?bp/YQ@8a@%u/=??!&mAR=@<nM6<*@t?W?R:N!8Bu8>$A$X1\DDPSyI&jc%5qkJiZuiw#q+$\9ak4
:aa5Wq yyAqkAj:jN$!5^@C&dpEHDyqtF^R*D1\$!mF:niXS^JuRlE$X9MKL/nEM=iPQ?\CpBpYlX/FC@PXGdMt
nPwTDG lM^iADNI5GYhHZu+*V+tWumVQH5pS6+l5CR&D=8DeeS!ujNh4k5$dDqG#SKi5H!ICT\TJkWli?Tt@dBI
=aq6kT >YjAG165qQM8d^iJ>TEIt6u=pl5KWpeZE+WEmye*wy6Cnq58&\wbM+mpc%FceCCiTHuY^R1HN\C!uLJ^
VN4AiM ?pAENATe^y@ckwqK5TeX&LV9ak5E9cVED<T1j<p:4=L?5cN#68$RND=>=P?+&mp\AFVG%ME#Y$6e*&F@
EQTjC# =^c+\:\RH8kmH9phK>AaG56E^tmK\+bICMpyj/Cy5*6A^%LpXJwhc/S5SZ5m1NQH?K1qFM:$QVjR1Aqc
^a+kQK jJFTJp+mBlTh\K%w%SEknWHy^YB<6pqAAZPP5MhTau*^uI$84G:86M#JZb/+Tu/G8c+m9PdYWZkP>S^q
%55w4i yVV8pGYF8YVdAFtL>Ka@In!!&uEN+TlR*PbRJ4By\Fh5wLF:?a&TFI54?4Yw4NZlIbhK/68d#mp5=IjG
#!I+YX W^:V%V=X:tidqha9/K>AZ%$R/V5b@S5/i!9<nhAmYSGuPdGNFX=d+6P#XFuGBiGN/TW%nNX$y@SbQJ4F
aCA^^F eV65wI?cqYS+M@RX:jP>?DJiWyBXP@VSCCRkV#=bNAaB^eJ:wByIIB/Am?Sdy/p%</X^9nVjFNXAWNVy
<iIj:! /y$:lXV9R9$1ma4Bl*kt^@Y/5a=%4BAV:+QwK#:kkuamZa+>uAe5E?X^yn<bkdi?L$eHwK9>p^Y$LeWE
QNBcNH i>FqP&Rm*c1G^cIPH<XPl=ambkCmRXYPITwYlKKylc@CIb9JVt+</:&T=CF^kEDC9V?8ZRAMFm\n%BE!
l*ZQG: RRBMKA#FcPHP+LM=JeVA<K?w@QPZ!Hwy!Y?HBl?#5!dcXaFimDSD#E#jM:VYF/l%1!Z>8>c^EFE=BQ%S
u?$Jd^ <bGw9uBXRCITR$GkA95e>/?Fl*^XEEY9km/&e48$u<HcnYwJd5iV1Rpa?\QSITZM#!E!1<\CyGe4E&iH
=nyID% MidJLRJSTdEGLwu\%dm1k8YYCL8@KSB<D4&m&+w8!AJYVTw=tIVRDZVSA?TdCNI/jLIc>B8V!c5Rep<X
TaP\md B^n%/M$R<#CX>bJ6k5^GPiy^mHlthCDciVtw\Gmd4Rm95@!aC8NH!9%VHtZD+VF\^Lj5=nT:YGkD1<Hk
8K8*N4 E/=qWE<KDK?9+AA@pMS!NkGJw#Jy$SH?GVGN+hq*q1I+GtLV6H8=9TGS/tLh@uR6Eln/mJYWkMkllXaP
#B1+6M p@HuK&TcQHK4&$Rt?5$Jdblyy?mqjXLqEBSp!5dPGXaT%HJmG8%TeINFHIJi<1EcSa5h%&qRPjLnKZJT
pDuHw$ KnK+5%Nntw#w!9SFTc$d#w8?:%eFm/:VmV?6VEZ:d4EH1+kWGycmGW^E&qCbGPh&D>Ad$1YW#m%tFbC&
GJk<PT 8<da!*y&#MMKKQDaJ@Vj5^ZEniSVe%nw&L*CyMbi1>Rc5Alp@e1qAe6Ct#I=CA&D%bk\6dc=Au@qDMmP
:^j!5F /N6uHpC<JHDyCVtMMZ86Lqnh:DwV6bYCw!<qJTW5WZE^1WW4L4&+#WI6>#I4X>W$ptd\/qZeKi8\Y4t<
J?EI/L IMBiwT4bRL#++PX$HTpWjQTh+M\LA=WiBWP/8bIT1*^c1^tyyIM^E*/PRp$4?ABpl@!nH5?#q=dp!m*:
5wl8GH jMhTJVM%th1Z<DBRnaHRKdp+R*$Se*A%\jaVBL9EB4:TR4pj<\e%lQGVFR+J#W4E9:uq*kbp%JR^B/5:
#!KEGB E?TYH@1m!>#S1amV5d#RMI^/H1+y6T6jYHLZEiZyXtnX/cyHG&DAM9W+e:H46^%1wpeT4+Qcb1T81p#c
R8TB:K mt*NGlRcyIQL1QbtXqNyNmuLQ!hi6?lkLui4Q8/q9^iYQS+#1l+HI6:ePjRHQGn^/5bVcF18#W!KcR:1
X#/X8A P!@VtVemWHlIHqXDe?W%9M?w/dV:@I$uG9HnD>RX<QWc6Bh=nhH>piaX?CVDdmG!bVBi+:<q&KP<%LX#
R+lL%u N+CCCEMwwVlZ?GR6kV!q+>E^nX=e/*k?l4PYa/b6q&E/i6GP>$nWj:%ipP5c#tX!dRM6R?L9aDk+$BqG
IS+AG/ WmVRDbe+Sw!<m\kMjqedP?FKQK^li4bEuXJbI9!/Vi/#^8\*FG!45e$?DL+QAn/Cne=D*pNM<Z=BL+5l
d#Hc/i @PuSDc/Tb#Z>p!*L1%l+k#cmqL^Mba6yCn@dH1>PFelcFD6^T\YqJPNdt5jMDat>il/&DayNT5PIMyu!
Z#*B1n :jR4%hnH4d&/#WDFWj!AJF<VEte$4Jc4$RW*4YQJc!j*85X5t:6?#L?C?1%>GKtAF=kA@GJea>4EjB^B
kY@>=T Y1CeM/$ibB@l#&\9^8AyDQP^bYH=\56GyqH*EH59%bX^RN%>8L8J^@H#NH8WlK>95*Rn^Y+NVm*Pb?l:
+&:?Jn cEBD@8i6q@kGWHS1t4X1?&K:^bXY6:QE@qI1>YhBQD^Te+p1@KJLS\GdmpN9tJe<BIl+FY=At&h6A+&j
8Y>SRh 6L<q#F8?9:D*p<&YZ9h9Md!LTKH<PI!VJ%QG1qmm>LteWdcm*=%Je@*ikeBjh!+mYe@W>GX8^h%t>DLD
$F/Lce :8R^DZ>EDCFZkqeVK!n+wEP:N8tm?F!^THDW4+61&dqNh::a5?9T!SRBe&jMCP4FFcTX^c9p\^qN/DnX
u4\\ZY e5V^Qq\w?IGFT9q!?K^>/lSh!+hlYhZhWaFi/^B9FQP%Rh$1pdt1I59:\1F>&\^Dc9YKp1&^w&hnAT<8
XmSyPJ ^?qjq>6P=?<<IwCj$Sh<FV<C=F%%9LL5N@>1EBH&kip519>n9Aql?Q6IF*Lqc^HNitQKDX6<eZLZDbRm
^$lBjl 5RQL#&GKp1lbN*JN:lZ:t?Nh>ZtA8+yZlX>MQR5!mmlL6E8d:BE+HH\YpMImh/ADuCQi%aw9&Adn5qC8
lE%6!4 &bIS%6kJ&jXVMkb#/acLFi$M!A=\&S^kC+Y@SJy<>9b\4p=@+Tyj!Fq5H8Z4m9QPttM%E>wy6Za%8pMk
6qj<yG i5ZEq>iWubmpi&lYBPkKlCIKFBn:W$\=u#D6q%HFP4H/DqCLhSiFw<lpCF<Ntu<uHjy8i9c>#Hw>Kwc%
PAhZkC Alu&thSl1TF9RAm^wj5JKR\:tjW^tc/^WAe>cREDT^tbmV>i1j=Nd\*yd6hj5!qF/mn%w+n%Hj?TVRpF
WcV/K@ 5KjWD+I*^H*9e%kn<Ej>%nM$EmAYmTMiTe%LpnMTWmA&AJ&G6IcBhB&CyAcI+5lJX5NLX5NKEkN<IjlI
%kYtJ/ HmNDZmPQ+mlM/wlGHpNDwTn:RqGFVFH?lRAEYa\YBXCNSFGaap1FCq&G$qGW5mcW@C!RI5cP8paKIw8A
hBVe%1 ?5!h/M!P*DGWJmchBPlGmq=Jk5=C=$lH16lPh>bJD?!qh@#Imnd#Y$/mR5%je^J#qYXL*hZy6KFk1k:D
9RhpL\ VVtER^t/C^1J4RXL%MpbMR@>aHmne4l#$BnMFlu!@dn$uSkb?%^4+R61nymN*bmW$Np\EF@=VdM/EVCY
R?>&T= 9\TTCmE/VNK9/*II\:/e@E!w5Ee+iWwpwEeWjW?MDp$ek$Rj/<AP>KA/c/e/+/WDayGhi=P5A*C!9uFM
S5<1=S S=DX9PTwje>bG$8Fnpjt/<ZqXMlbW$1uXM\N=CYyje@NGp$Y/$N$Hpq$Z5>%X5+>ZW/H$ey^Fp81/M*D
wZBnpl /5LH8p%TM<1CQ5qK!eetdMB\V5mX=aS9&MZ5iM4a!=kjJ5/Kj5&abWqV*Rl$?HlwWueMuGbS8lSp9du8
%1l9H* ZyB$kyE$uBb/>6ahlMdk^E/RA=IW<ta>eBLGwAH=GaCtFRmJMcFQ%^VQNRm4V<Sa#wu$l+t!?wuPIIu%
pD\E9F 5al4WQmeR!X1ZWmu&pq>wkCamcR^Xe<^5/YA4b\G>M<^T/Z1W1Zm!1Yh1!YuSKW/GX/BK1W\jACa9c<8
W!S^9L Bq>qM*A=>$w:J*IciQHELe8eJ##HZH#q>JpYe%V1wy$WFC$^C$E!jeB*?X\wFw<@#J1C>abyc6@GpFX+
1u@>TT W$MR&w?5T=c4bw>b!AMjBEXhS<GQ95n9>FIBiCBTT<F+!cqIF1\$C:#6CqTipiZ5LwKycGi5W!eBcW9w
>$c+R1 G+GF:5X1heR^DNmW9hnmjCXWINZ4I>kBkBe1<bT#<ZLAew*/YI&bT>LcCI&biEpjCckaFdt/D%LET%A?
6IcpqH T!>W8yB18%@NqG6h%tw:&yAy>&6n%Y84>G4HjZmq<pG*9kimd9cX!14PdK?M<wti!\SW*GhbqRMheK%5
H\VX1n *aq?jTeh=niy&Yc=tWL%K\yDS#J=^&pGC4<VIbGD#YJt5$KkLS+BBqnluJQbF5?IFR+t!+DX^iwq!=!E
WuDhqE 9wGcmyMa!/:a6J/+5wj+6JWE1=%l\t9ItAHIBF?/8WD#lpBT^%4#8Rl&q&aL%jj5Vy$pDbu5Bq=/NZnt
kal<eG n5EcK66$b?KYe<*pDi&TRGuNtp+!%qlNydHuQ5p&GGM+Da8$e=@My4wNi#^lwB!yNt9I+QqF<89WtjIb
Ni9YEF uHtN<&y6b%=^=T$$Jtmydq!1CXmw^hqCZ#m^kh#auL*bbwJ6%XlI&K4yZR9NE>LJXGM6=6uyXByJ%ETh
G:hQJF 5ZM69+uVV1h!+KlbJJBb^iRcuFFRZndcA4N=eC#p=q*eeG#e*D^+=1*eeFnhG!N5a&bEqiqa#&>e$XLI
A?1<IE !b&%MGnJy5=XRPmNFDZW^Kd54BVGa?6tKkkiKmnKhBwiY:dpFdkM:MWC*<wJ&B6MMCYj#!naAT!i#&Pa
WK%Bw4 dG/CleAPe*cP1p:1ck#8C>A?:5@=HJ6>91Q=kl+yjH&I9lQ+ju@y^$Hm=$:l%$Vni#H5>=*B*^*5*$V&
5Nd5E^ 1wp#kIM*\Q&qQ+hw\HhJ9!VBRA/F\G#jkAYNIA:lX$%aRW$&:4kI\S\8\a=wHylW4%WEGTHq*4m6phPE
\q/8VP HH%dbDL^M>:XQ+EZDetBMV=\Wt1M=RinlQy%pd8H5FQWl^\Qm?A5piBtm!Vq1*!9At%IWZ$:ETML+Gc@
@X$VWY hGm\ADeTPaJ>#XTC#bw<*uNAB*&@>kYKwPJBSHFCS*qAB/qV$SFDSCXnSTZy?H8kSZ8RSPEl?YpR^ZDm
@tSTN$ SDiy9L>tmNck<5eD^*4A^8LTSiQi^6Y\9NhR<FF@\?<?h1jY:ItdVLkRdT!AKcdR4JKniNmWpB?pDI5:
4dB^qh @PJC!^6k+m%k=l*@^k!H^5\=+PXmeuL#*&Y%bXKcW\ARPZDJ>cu/Ijme:cuZH%KVG>Q\BqN>IFK8i%M%
5w8Gy! B6Q\yqPd=%MZi>P8p\B+$?uZu#Pcn>I=6%+8:1WtH/X!u1bjL&h/*Kb4uGh^#1hu=&aq>&hh>&diaGX:
JYt^I* VKa9RYjnDYh^+iZkM/TuwGWqq<a%F?b^mib=T8c%!CRuS559?QQuhSJ<G\j/Vaetqwa14nYT&^@mbDZ&
aWQ$:\ F+cwF?e4$><W!DI6/RuHAmVWP=ueXlwZBpQWh1=d@Pk==pHjpCK8I^!^9B%h@B$dQB!9qWwdI*J9?Dp>
<@!mDt BM5<BLXdB588Te1YJ55>wM5%F<6VX569Jm8+659ml<9\bE1ZL6&dXTGEj945@+>K!@@b5@@@<IH@H+Yc
XXI^mD u@4Au+Yb?W>bpn<?i*Kc=F?jX@*4W:A@Q&:p+Hn1+:e@K#@@d<A5@@L<:c@Rj@j<:i@mqLI@@leI@QMD
4^iiDh 8D>1Rm6dPF8dEFMDmeXNuJ$6dM&Ij$!Qw:PJMe$Qa$&ejy66hucPQ\qq@8P=?>?tA<#B>nhum:!nmi5Q
-Akj^8 000b0278bf0001202b4 Page 59 of binaries2.zip
*Ce/wj %N<XMH@nCR8a>Y@9^T\ej:VL!jt*S+t9DH=@?\?Sebjjb9hjdGd>me&KL4c&9%p5L!:@:/\Fe+L?bP%j
VT%!am B8H9%uF!ku+!V1Cj>Kum>NeimW$h:Y^??+iNmc*L9?5iBQy**j<?X9<am:>c<=QWuD?1a9@eGmeZi*8:
t6bjpY *!cQ&MVG\MKc&MDi*64C!MDb\5:Y/S<te4C!@^9l$%?cCQ1Z/YQ:=?u:ebI^@&H?\Q>mQh8@5==JSqJG
1c9RL5 >N<bCAL@#ED\H\iN@TiD^9+@D=1#8eq9d=#6:K!h@uuE@5piMMiVBk#<^\Fn?/N=HD<^n?Mu=mtbYJ5a
C*LEyI @Z+tPywaYhld@LcI@V6d@nqJ<=i&5Q@SF5/j&ML=E%8WDc^?M<VJ@Ai4nF#?aMi@Xe@>yS$ej%kV@p/c
#?RymG j#Lp4^@?1!W@b5nK^MPJ&MLI#yda&MVW\6dmZ&u>d*YVj&pS=<<5?EpcHP5QW9/@YZD@cSbe^Q<!C!=w
k*5Den I+9+J#8T9%:j@@&Y=Q@\X8SHu/#@&X:p:\tb@:RZ?We6nZ?#F^G$6dZ:<Y&6*::@>^*J:#8W9%@Sj@#n
a^VTy! b+W%jln:J*jjZ\@kCiW^ju\V@AR$C=DnF&m&y@VN<c8?&b?CB4L<A5*^BDV+=$u+Q::J?SR$/!@/@4Nc
LlYC9A @p@RRPbjwXtikQ:XF9EHHQnj\XtjhPT@tHGYy:CN@ij!BV@R+Q<K@ST&kZ?8j@<D#j=jwVu?K#Vup@nC
jql9Jk @uM$pQt@R9?SdZ?=h9+QDj^%#j6>Yj4^V5uF$Qu*D%=b&F4>98ab@haI<MeKB8JkIYd>RZVRn^*6:&8Y
Vlh>p8 ucQ^n\8tFnH#:*@?bM\jX@N@&QH*G^!&H&et?Mj!!QdZBqZ@EXV\q^5e%y>e9@>X5Q@Q#j:>9wu=d<*?
XTMVlJ +%:y>*dB\J?%?<?m@Z<bp:<Xb94HwQ^?R$#MJG6k<@5dXtItNR9n*#aRQ+/CTeLE\5#<6:5ln6<G^<Lb
qZ#+nE Th:EWhnP^6:P>9jLCQGQT+Y%ucPT9aHSD:CImc8Fpat+w+HH**elLC#5aQA@>mEm\5w@&ae<Ln\iA=AF
heE88+ j^l6AnD&Aj^+QT+DlAF\ML?>j9!ER+TDlWNElwiDk$hGSWJCSpJCSWQ<<SMbER$FHRMVA^$FF^ejH^iZ
\\%8mZ nJTWqI#1:/@Hn\AEPEAGlBMEBCuk5Re\>cNlYInjZwC@91CkIb@BRABk+b:DI/ACupFARn/DikaDC@un
Ry*SF5 ^#MumGiRcFAAcBJ$FpEFGA\DWkhjVGB$Nm^Y6SBby?Lpb%b5\/@pnu/uFMIkybmeGmPuL4AIXY^8LS8P
/AhH&? 54F#>>RGHKZ@e*le9IA+WdG<P6XyFY4<5<*#uyt6C^PZ\Qn<?6:b:W6V%/CEkwc?8b$4huE%M:jk^MLG
m&eZcm @9uhd^\T/8d8IWqFVRMLZ::VeEy1YHmEJle*D!:8ZhN!TYqciwcqqLRMLi*jQK+CwAC+n$5A8N<PmS>\
lmnFQA <l%FaSc$Tp8i16n8%<iyLa!bCKT*uGKtpMilW#S*HRnRT*JW6*L<wt5<uaG>dp6@TWiwy9wNi@dl*pnA
p#c6uk SJi@AbPjMG@/heLTAbjKbiIiHeGA4jWn+NQZqyd=/:jwdqeHj5R6jl8aGi\9mE\1ql<BVPQ+<*Ml^14J
jymERh \pJ$^FRFWM*#%naLYWb$#!CiN^W//Ta>A1a%:Sn=1t==48Yu6<<:l+d&<YTWn?H/VWhV&c\Zc$%Hw#+\
M:6%c& i^^e/BV8qcM^%N?VLwbbDy9aF&\5CtauRVPYqh+KuBb1V6Y^Vh=6bquJaKJ1*?DEbMX\$&X@GSu1!6=W
8q=CHR ZXLlH<e#?hc6\XS8&CT6F9Ze?Jd8y9T#61Lp=$BC!Si$@XinutcQE<e^qt\5NK:y444PMHu?W@/R+yWY
#@QeZF J*VblmW=yYSIKipYu/CY>qZhA8nSXRc&Q^+KENn=uj@N\1=SJdYccyMc>18Eq9RlX9XPN>LCI4XPD#w$
8njKZ# *VbQa#&J8?G/GK6&@yE=+Bi*G/iRT8tHl%pE&^m<VV$@hmL$64ATL=dBMudZSqTEWw@NqNXkmlS&^EDQ
#1**$% GYAM#d9GnwcYmQ\kAaZumLI#lY>PV>^5ZuTED=XTwh>JFuS*RDZNHSJ4l9KK$R&15FjYi=p\Nle!9$6&
dR&dZl V?bG8:K+Y<Qq\56ymnAJdCc#li6qL4uXd1^688DAk=?jIb+K49yW+j$+ti1SM:W<lt%ZiKD\*CcWppLu
m@Im!G *T6QHy5b=6MH9F$dN>q#&P*nh851HaqTK/c=86J+K6<XFd@:1NX$d>>^!T?8jPy*A&j*tTqGQk8Y:BdT
nETKdy 1c&\dN?ie/tRm:99:RNtN@hlMI>C=LcJiQd<WtT4dew$m:ecqtIILIIDGStE!hmdR\!5G>@c%B4h!A&=
RLHque FV:RX!Wk#QJhwBA<A4w&mDc+jXc$lq5&MqEtc+q/BZE6nL^ke5&RLl8b^F!&$tb!WW^X5/GM=+hHpDMF
TakhJK +HKnJMFR6?+GDhaLk?TS=BaW?6FFyh!wAMltKnKeD<t/R6Qd#C9Zj5M#BFmSCk\w9lei$+nPit\iXmPK
D@:ld8 p6nBJXy/$8nBMhVGmQ6=$>G/hSW9hpbD^$G8Z>8tWpnl1\e8==Q^JeK$^Qic!dE6tVeQiYV6>WdpmN5V
VmwKHu !*ji$\e%Gt>>t/6Cn%P/&k+QyPbQFy9=lPSN%6b9WmHI99$6&TD5blY4wm/?Yj:P@aTib6lijFuKqw@J
MWlZh^ i8@dy<VG18dMae*L*8S>?yQ??cQ:PFBbdiHhP*=/t1cG8=+1imcRBNmEKudFw6FZ&m9JV5V$\?Ea=B59
Y5d9LZ ?YC4>@SYDw*&DYIKn\Bw!AHY^/t+9b5X6&?Wa>J$!\n9Z+%Wj%1Y6NcBlDKXp+ij1Ky+1XGqXTRJZZV\
w@^>JY 6Vmd?/JCn6X$%PiTRi*XbHuK8Yyd$NCm=/kDcX@>X?mB+15^y:K*d/>SbE\nS+>hNGBt/<QD%P/>@HHY
eHlVii pVF@uM=nEl/G+kkPib>/uliTZ?SqHX8M56d$p51k!?B6^XA:&/F&bY&iG:ntquaZ%wkNGWe*$4LqjN@q
IPei\V P4@!L:\?Y?l%\?@pId+ZP%L&4I=hVC&qPY:uT#<Q5PCcV@4AeLiJ?M&GVFyj6L&*qeW+bVJCE:VhCAMd
%B%mL* <@*q?jV:4WeA+$GCScp=lp^88lmwTc8e+S+#Z95=&uanTXdW!Y^M^*eb>wSHAHNh%4CFp%GqFtE^FT@j
hVJ!/i huEV4E<K>t$mRL4aI&El85SDTXtN1N/TyF*u\=Cj46:ZJu\=$A%c&:\tac$NqJT8^e=$wjwpyp4/WkAA
N6K6<d b89#YbW?ul8WMyFSnB^>%Yj:PnC$yPWhL^9t/TCMTN9H+@pXViI$bim*^##&lj!Q$##umRu/=:KlaH<A
/L\=N8 a^TihV=@LVYB*X*=qT#tn&Hn6K\X6h6BaX4JIFJ^Q=+p51Z9#E/y*=PVac%e58R/pLGDQp/wL55Ldyd$
JYQ1h1 Fe*BkR$L=w:8h=yHF4Zw/F>?*ddNw6tR8QMIAP:>tQA&G*L<?ByZ5Za%%1K9MP4J^Ti^VA!CJB/&CM\S
TC?L@5 +wC5FFamw1lBT89hD$q9*ie9JJYE#&^nKT9LB*E1:SZbp^pMDSXiVnGY>iA@<:JL+%e/T>\XV&jp%VEe
4bkSW? i6m1L8q**4PD>!:GjI@QNNFpp?e>^u&h+uB\$Dm*bA*Q!TW<6P?JNADjl9H\aqhm+m=/?^E\ZQ1J!Rwj
B<AyiC M$aPPb9Mamu\wuJkKLGIeQFL6wLcjBBaE&Z=JF&J#X4whI%dR+j5Mwutj9HLc$e+N@KL1!FmXEE5YENp
:dQ@P: ?*56Gj:E#GS<&W1V&*a84cJnA$n>/5VuV4ADhESb:!+15k%&PBuNEtW/I1E<!M^:$qJCm4B!N%TmQbmy
1u6<k@ +4p*\#$T+DaFwqj1WayJ/BS8?<CQAGi@Lm=+ijl9!\+yKu*FQQSkLbZGhCSP5tj9t%jFKeu$8diW#wXt
16mJHT a?YtLt@jXNTqC/$w8=k#pW6#dq!#F^Z8=QI@#tV+TAJ5=RSnT*F%%?cw<\!QT$?^\YD8/T?hiDX$8+<A
9&B?aJ D1%4dtG4CuM\Ra*NSXEiw5w^Rjbd\KVTEj=h/!:BQD<q#*ZbYwV\cIj=>J1GXwDnKKlH?W+*ViJWyHV/
VW98*6 5ILAR8<<\yXY=VLhW&Qt&LA&$QA&L#:@ESBm@G&+R?CMQ?GpAlV?pwc9=14pEcDV#Fe*%e@mV1Fm\hhL
\B&48= #Ytj>V&I+J4RR>aZP>t=b?%L^a*K4GhC@j&KI>H*abVu@I9G5Y#mQCMuR:knAlVQMh!wY4c<mjqVMqSp
m:i5Jd 4ES6hBj=X+KTk1S<Y#@!$cA?Ap19k1e*a!wHhh+i:=:NR5pVLKjV:pmDjNm^niqntZwEd?uaQ6F@ceA9
nIAE?^ c/!S^qka6b&p4WcQBP?w9?ay%15NWl<$nHVQ<#NB\T^SFDGRH?wKqQmGN*BZnnuu!1+yMtb<n?dqW6lN
#+%EN! l=<R>B!?T&+Rnpn5qVMewhd/@pk^/6c&DN%/+Y:MaiABew$qK=cyQk4S??1ZAqej<Ywjb:ZP4wd*mbL=
Qt?wRG *PWp6*$Yiea^TT9/ZCQjW9Muuit#=m^*SGPMeqXpF%a4YB6G8<hMpVEu5LT1mNNt9nBy9<BlS%?!iDDI
$IKqnh +K1p5NkE?58j9Wai9cZN^H4:n4h8b8Qt+uT<bFpTZREd9pTmkwNtY>Q6ESC1%CBM=iT\T\VWS1uFYNIw
pGhy/% jkT<W^*tj6P*TeGFZh\hqHE/H<*#End!EaD/\Ep?tpb\F16pXVqc!jWe9>#bNq@#EWC9bwD=B9::I&B$
$!SZhw Xi5ehmBq!P1G5Jy#+yIT+a6WMeli64SN&$RMRy8Jw4AD/T:6d9leLd%?iJXd&<16wcGY6dRZy?Cl5Bmj
P#/l^C ReJT<h%1nSq$t65XjtK$4Z4QSKlShbJLlJF^W&$$:+cp+icD55*uGBTG@ew!C?cXFiK\K?DeWkDp@d\L
X+np#8 ^EYlZCK+=H5=MwEb<ZuqL9S8hN9XDi>S#61Zen8wQHGSy6CM68Vu*:X644SP<MDX=+tJ4?i#bh=pj\1h
pFBTt^ D$EZ!WR<bZZYMPJH>*P6FF:+#Gc>T=VYwN9ld?V1X:P<YwJCCM!FjARkq1dZuJ&Q!PNaWVNWdL:#*T8N
JuGe1i beu?H9leFCc+H+N44S/SkZ=JtQe=jHZ6GXq5^eFiw=^5jeX/<et4=6hVDhN!$LMBG^JE9lLmSiQ!YttY
d9DhGj R1^WZY?J&bd:u:??LPw6?5Jq:j4bV*h@#kH\$bbl?&abVWkR5=EnDRPERV+EaW#ma/DR+Q$+h=#me4cQ
KwW#Ik /npWTP%i^S%&8dDi69n^\!=FaR#4h5nEBE^d:H*M9VdVc44ecIb/%X*uYjL$5jq:B*V6lSZFA4\l^$nB
X9Q4nt w%PFNpHPLdPYe@GE?8eZCt@eC4YZl9RVeM%mtC5KI%h\+h%jZJ+pd#dXlHX4%N6>$5C\wY6iutyi>&q?
wpT5Re WGtT$Bp@C@1+ee#AQaK68cKm\#S!Kt4H/*y^w5Cy!j$h#&kd\#88CKmVFn/itb4aIZ#iw/p!?tMPynY/
i>Z5Zk RTGbWKi6QGHnBG<TF5Y:Q4q*8>>6@%lBPWJPRHVVHM1E>c%*/CJ!y8?P?h:\QP@jNI/kmNmIWupyXeZd
t>:B4Q metJhJeel5R>#DZcjn6T%X@?Sl9e^NQen\445m1&uQbq4nElcIci$CAP%G5TJl%9/mK*BmnDLh49:n=e
>H\!<^ L&i:i9mec#Jue<#\&hF5G#hMNVIjY1Zq6aT=%#%B&y:V/1nN&JWEiZSTuJW1jTBdh9GJ=5Ya%jc*t>:/
wq1la4 :hNH\Q5nwah6:^t9+nj<*\YAK4u:tayGCQ&nFGR8SKm<jGtJ^6\@h8a$Ema&\a6HnYLj8qaYIM??!Vc%
5CaNJR #jJ<&1EVRq%hE!^e=y=SwWeq*=cAQYLF19\^mjPH$SbLb*VJaNGWcu9%Eh4Tpdn9+aStYYVbB*4YKBTb
-A@#Dy 00072d5e5cc001202b4 Page 60 of binaries2.zip
jCKB1b !WakI:MmEcXyWlMcCuW51lkjnwtVqZjG4wL9^FWuD#?Hwbw&6<mHXh>IhCSLwT?@q9KCPJwn!8biYS\5
>@%y&a Gek*u1&kuIHQ!Gb<$Wd:bw+R+eKact#N/5ePbIe<jCmnejcl:F$juWkV^GIci<?y=AIm/TMkQ9%/<Y=i
<$Z/FA :^6m?MQk8jjR&N*lk%ZqdbDwI<D+?/hBZ4F6d%DeJ&WhT:R%eZ5<h!L=+tb:Xd@kPB*Y1R#V5@9*Ke:e
YjVP?n w\kKty%8iQIZ^SF>y$MhZ#/mycGe/W&etYY/4PKM5N64cI8n%RmD\5LJl+EPcItpdWGdZL9yhnb%TG4m
mlj$Tl </@Ca8YAm!B!u&tmh:%>4hmEihH9WbTmd#p^:!dc#>$T58R+QYAPK>JLd5SX\nnIp9Dk!?^%wPNjXII&
$!@:S+ CSVVeVn::<yP^5b*Yl+BVeb/X*JSi8ADQ1N=F!Q9ublhSbaeIpY5Sn5b1?=9qmF<KRatkjhZ!a/Jum+>
%y:l%T CjM$NeMaYDc*NnPEt:\wY#y1w=+F/j9ZCd$&Z&C#Hd*h!HN:%\8:#=e/<PkHhyMQQ<laEt1huWZKiBZ*
y#y*e& kwb@dMntjA9VHkEjjjnTpuSFwidXBNS%?!u/KXMumX9JkqXMNEn=c#uyMYe%jT+1!E^Bd14%M4JZ1<at
&CeZ#$ LDp6n8?T@B%LQPNKIn<1BlB?Q>B1VS&ptHa8>#V!Wp%Ae$GqHXIWp!jaJKi#S=yR!qw^%LYP$@GIqb!c
d^ucTT PhNljP/CEQ5I\F=SuX8Jam9Y$>:\RL\dQNjdwWwA!*B%D=p1GFEEPI%?Ye#98ltuu!%6W:V4ab\hj=\I
BHZSL6 i\V<aYc9Q&!d9ZZ%B5@jh@?kRM*4MI@^pR:Ze/KbV&PE^ViNSjRnDcW&>:5wmtqp:^MZ6C@jS>u^jhnK
ZnC*bP bFyXLX6/W>Q<CGAkW@@$kCj4pHp>$I+lXVjnZMp5VN6j4H5Y6L@!ylkhqWQ8ZQM4?KDSh/^&Y+:4&8/e
@l&6m: TK\h*%HmT+nNTStnm1J<VdE<C4dJ^nw?/wLM%9ZY8X!mdX648bd&58jA&jIwMC=PWT1$P/!!mGKVtZk/
%thw>% tbc9#?tq>>mHDELhPeaLC>8<Fm6XiEcGMyIahqYI/G=/&CMctGCH6QuSyW@J>jeKht%#&95I<D$hbRm&
ZlL6N6 c#EJhF>J^dm1%=IW#D#eCqewX6?N&#ukqWlnaBqe9L6kmuK^a>69IC^MylhlCaSbP@*kS9@lRFD88$&H
JLt^=K BtPCTBB:muAj^$^4>bhuadGld>Z*WuwLa<964BM+<8b5n<FY<Wu^QI!E$RAP@1XRqhKaat8Zc=8B%H$%
S6dD^Y %tRI\nJnZ%TE4>E45Z4uZ?CY>=u:!S$>QJ<nDAWqSEcXlZC1=H%9^cEM4wD88CjI*p5J?kCVeKZt/XJQ
T@$R*D u=#?CQB\5P>I/eIKRZ!n1q^eL6pXRh6n$YKTpaHCXCwWnj%kGAblq*eT:EqQ1TNGGCjXZFu%$M\/<Lb>
hFNDV? :&&$A#+t/MZkq^F9e\NV#P9*t9mEKYaS9FcL1#b%6\yZBe%^y&E5F<h9clV!NZT9neS1#/+!iT6LwX6I
9961P+ W6#k<T?VSl%H/4e<d6ICaX?D4V+A6jAIN?aRptLaZY/c>A@*K%TEcn<5$Z=+??Q&?iASWFn9IlanA&<j
I!=!lX B<MIyDGql\Rw?md+6VWe4VXJ:>^d!kmL/YA^XNAZ#l:#=S%\jVY!^B^&wbZQDM^SIk1lb@5+qK%MG$cN
iD&IbE CZAGGATF+i+#B<bP4!T5^RQW*p@H<m^8c$mini>?>8CD6nFLy1y#&/t@htkcX#FLiV%+Dd8LpMt!Pq/\
AwBQZc w4Y19mb:Z4:hp$<8TIdDX*NK4/=YM6i^!6yw1jt!:c%KXjW5a%cMDmY*I=Qh>^8k>DP+qjF>bah+n&ii
b+$ip= aVP&MBnL%/ZDHj1Jh&ndFy?dI!Z!yIe@Yn#4d/^w/QPSa$HS<@?5iWbqT=XqB4kd8Y5<b<@kb%t6c+Jm
TIkSa: R:C!4dXWtnXR=FSSc&&5ib<P6N9&H8Ku8Yd5QTH*&Y@JIYF+\^XYZKnq@p*>\c8^k!+Xu1jT\c=5u!5#
Vu!CEV PTS1wc5!i+?%B+Lm@epJw&4bB!RFXAe\CHRRA=ZSSbeNd/YG!1FAL1HwIp<l&Q@NXK+t9\SC::LbyXjt
aq*!9& +t!=?4%TZZweLJI4ZC/4iP<Qu5C6%+e?EPH5W>i#V8F@%%b%5LR?m8+9^\8QRee89T&B^qKTP@M<mVym
=LTC/! hJ6JPSqB>^>ZV%4yRXFypCi6p:NdKcptG8qHBGy5V*!TL?Wu%n:XuA>=?TET>c*^>h4JwKbLRAJ&>e1c
j<yJHn yb1$GWTV1dwSQh&aLBHcNiLn%METY:PLT@F\45/kta8VFRF+c\:^#mD?qd+\TNFyZX%C/5:4qN8M@^GR
m9!Qpe Fn/6iVCE4SpGZ^?+H<!HN9I8+BHRGhD6QXA8++I!*E4N1T4Db*FEju4:>5ec*mZFQH?Peuame4/hSySZ
+^X?c? kh?*Q=\+Y=t:?dX$PpcmWtDI*Z?G/G&V=JaN^wB*A581IE+TTj6M=hD#S+B:BB%e5+NEiScR@!kVI+bP
G61bZW 1%\\be6DT!wF%Ba%a8im\nb*!uwuc>mw#=lSy9EhW%:njR>h#E5tPT=u^Bnbd&15uCu:?\KRpmRRHk/c
ZqZ&4k 6D+qYM4PkNjuIR?YD#4Z1iNETjISyJ<Ca>RFa9e^bwtF>%>JuYZV#@CdCHI+=D<wZ>5Ni15cqlhd#8^<
S:$8^l ?\d@nGbQkuTFkWiT/lM=48APnicDFSQXE4yh@Vi&w@+!XS@Xjci#<Cm>%%<!Pt16R&$K>4/ttmPIw>@+
Ne&i@: wAlm\4tjCP1hF&nMk\tMnaw5FMZYm5KaSH6<b^QE%Bb5&9VStqheq5wILTQB:\<$dT=RKM\Lu5%pXSyF
e>y@%D Q\LAqk=Ydp6m!hbc?>Z?ydw\$HLHm>q%EdPNYHHeh=6>luP?ETMpSFPG?%D^ljkb#V!FHaKXP/^4ep!p
ndw:pm H=5*6I\EJ=TiTbLd>=%LhbK>\*E#EmnJ!a9^kwnPHD/\iH&@5@l/&#HAHB<B*BGKAj@eX8L:MS#@WP5>
Dp\qK+ *e1LA:u5QWZhny!4#w4XKdG+Y4W$1:%eyC@\qXIGphcQ$^uZaeJP8$aE6mt81WTFl>>1B@i>8=awXSGt
%yN6um #c!<F9LWi!J$Td#u946??$TFX^9+%9FB+#yee*=?NEM4mBQKheAP61TaPtGqGy*/LjHDIjXmciM4mG99
b\I/=1 ujintj^c?\^GP>JYy6N9tBSMcu*Vi:IHcQyw9X68h&ZPh1IhhyBkZ<$^6jYY4IA9!%mHZ#mJY988Rp4+
jT4WwQ :>6*hae49!ubbd/:Q#MymC@a<##PtIeYGdX\8\\QQbdG\^\pPG8PEaNhN=n9S1qLHy*jKum@I&$ik!R<
VwHS5a ZHk\N+wikFYh@ntqDXBb@1#KG@<pQjtq5Yn$&&FA>=bd9+H8B=b\PSNE=aFPWi:IQI!#kTBlu4*TV#w/
CYPBNM G6hE\@$J>iZMwT9i@i&6cnQS^hPjadi!MlH*q4#n6mePRc95k8%5e!t9Ec\NcPFm!we5q6wTb!\Vduuj
k=9D?p XNPW9b:Bwt1YqlHdB\NwJLyRq:qkZNR1&\ZI/l$alMc8$DXjw6M<<!u>+lh5/q:Cm!i8:ujWd#tVZl^!
8k1SC/ HV+*jShSJ6bA>m4GQkE6#@G=yJa@XwDnPXF>d%jpBTTEYCk/9aNQpR>6$SjAA1K4=F$nN&>dqKe?9YqH
8NKmeJ %4FtK%E4=!Qkdk6p#bNi8Nb@hRVtMId>mF6AXJHMP&Wa?Wt4Hd8Gj>c8jGPGF=8+5y^%kN^=KThdNch8
TLCy$= @HHtmND5:L+\^bq8>hu%E4jZDN!W8NCRmu<yE:PwMQZaM*/G8p>WD<bjhLXtGM%tuCN5ccmHVm\Q1NFy
!Q:/+e @Y^YMH4n9d/NJYa>1Hm<bGVK@VD6LcGnwX%D*^k4\&!iy>IW@5%&t\<#mtVbMY@4Xt:K8b!TZ%!/84Et
=MGNu% @JwlS!L^?B$mZm1d<PXm8+/awKI1M!bpFaHhK?LbitqiHNtttbNQki$%=$+4X@AhFJHhcHi=p=W8PG%*
%VM/t/ 9jMaEeeX9C<bIS??XC5%+n<CQ5DhCFRiGh@?+FN1@llniW?EQhuFG+$Z%i6eDG\/^hZ=>y@auElIY5>S
X*IcdF pmyVK?i^y@nN!@WnPB+BA*%S>^^$tEF!a5cJIdcIBKFjLD18RVe4u<:G9J58Y^:td$<K6cucJ^n#Y!\M
1ec=A5 w*WwHNZV\?a9h+u9Xn?$?utlpP#FQAjLGPS1^R8>^a!Sp<X6>8/N?LHyw6yN=:W8c<9h98eicplk^%Gh
Em9%bB /M4Pc^Cq!BNZyi@5XLW\Zmu?%6iL>c+5iyp99*CR#yjiSERwV/qJ/8ZX=kV<XHl%$aTL8u#+G$9H*tam
u!QSZP hTjM:&?^Tt$tHkGbTk#AV@L%9l5#6k?6XG\5+=%GjMtFYCcCWlF>kuej!&%&F^G5W!IVEeSi/+==JAn\
>>ya@S leiNQ<=t/JjCFeRew$EL\?1F\J>?1yB%M6LBFnFjWXHHM6lA:8eb9nd^wN48*\p<TRDHj6Fca%ZHI#Jl
RI4k?F GJC$AH9H>*ZjY^>/Plh9IT^iqM9K!R&:jYN!!LNE65A1c$R$n8u:HDqbHJWRG6tZL%qP1*C>Xqy!LVR9
d48R+@ N6$@h<pki\W>dbNNpmHWqy\8eB?9Ph8C1H58aEj@wKy^Ve@l6j\bPadn\8Jpy:^V:$^ip8\8!NqF9kVL
Hn6?$@ Fb+c61yjZ$bw+yNtje8Hb#*+W:qGPthaP#?t1^9@=XX4MShDi<#bB9Ibl1mwuJ5nylwJj?\TY*tJ=wFi
9lL6pK Wk#kbm!Zjdd8:CKuK#Jw9bDLX?G&@86t8w^6&#I<m8IWVSIupqB49tckBiuyjZ1SuLcKT:pmhjdNVn#6
=wcY%4 KLZlMB=n>JSR/Z=L1hL/m\m/I>$td5qbj5t8pc5VG=CZNGJ1QJk$:eQC*eNy\KipTWt1tE8#WGuiEuG9
w+nBHL HljTKiNY!#hwB1SXLtyKK9y+emHe@wp^hk!mRFHYhlF4Nd@wtcu<nu$D<b$Gj/1p68BTDc%54/SeHNh>
+b?eut hw1nkdmmq<QWJpR<6GhW!Rc#dbZdu+B6Q8EeSBJ#Y9eZ*hQQQN+$C\XeIXCSXZFP5V:PSiq^ZR?jF::T
XyJjwN ad/bI%S5hJ&^XZQYC6/X<EeKh/TqPX#Dt*L&*%?#\lF&*&yFE%pN<eQN<Y/SQ:k\cLBi4AyYt/^kLLR1
u\%dct i5FCnQL1WJS6aSj6ZGy\%&=EC&Y+XMQDap:ydJdmZRyL1MeI*TMAK+8cj=l#*pXGT/K^SRaQ1dhpARI?
H/n5Ek *H&<wLTL<u+!an=eyMI9D=XVMcm=@F=/MVAn6qKcJBLaQcQ1?ByB<p4>&TQAB/d%*R94%+9\eJ5#u=6+
I#I#Sj +C/NA<R<Jl!&Twk5d^<BB68Nqbj8HdX!iu+*db=Pld%!lb#=deDqk\i#PlQ?qluwAW8d9VXB#CL9>i:*
QSM>9P 8VCdt?LSju*=1XWEcTp*:N+uJ>@Epj%9Q?*8?b&uiCRP64\MVkNqe9Lk8KZE#?YXe&jFiM6!YP>e^FD4
<$@\R9 /\RZa*w%!1HFTNcneP8lk>JJ=&ZD4<^tK^AG9L<5>Wn\ZReQR#/E*9W&W%V\DB1a/C*WV4?K8?ahHjd8
*kV6#K eYA:C$/lZN5e8+u\*kn*+qA:Sp$#?!+<l8dh%8HbDqtXMVbt>?GdlT@X&Zlty9!$:ZG>DK8/Dyi1A@uX
//ie&? tec4W/pktm\:kSZ^Zq?pK:/y+pFHe$*Q=+JC\\#W#!9l9WpPMl@un&=5p%LeTu89d\Lpw+W\Zd5SF&5k
jW*NF% 48P9DR19d&cyIpX4=w+TI<1QcM9c*?B>ZCu*JC#>=9>mA1\*p9:5$^*L4ni>>I+MM%NP+%WRh=B:m$M<
e6#Q\L Pa<J=5Ndlp*6JQMGR5$J<yk*5EP%m&6n%AhaJZ%dL:>:VuGEmneY9&J6tGJm8qS*YdWuqVVH6Wl^6lqq
-AnEqH 00091a40758001202b4 Page 61 of binaries2.zip
m&hk*M GQEQH!YdeEyP@L#kIClQy>n#CGC#Jn*Zm:9+\Gq^c1E=LHQJ5cMXHAb:eT@pG/?\FHD/9dTijYA<y1L!
u@+N%F +kQ%u1hc+kZin9tt1bH#J<ZGmH#Z=KlBDw8M\D*qWN@Vd4ZG8?EYEQ5NY%1\>/1Y>t4V%Vd>*L:*8lm+
CCK+tn 4ZbZ5yj^>S+RepdV+141jhaRqX$@Py@$Pi&h@QYtE5wtPb5n$>%#H!Pm+e\p=q^/Zi9GtX^>qTM\A^5J
Fen+nM RjFC1cV=KSn819NB=&#:55HZK8@k\Z>X9VLd#5Z<iCXLJtj:kDTq=A:EW!w%@^4aP5FAJZ4l:WV1$?bV
hI^@F^ SP#NjQ16Y**TTDRCGk8kR6l6*ddXpll:N:nF+Hk\5mdawCM8QmQHaDSMjqwMynn!ekNBPp!>a+N:BIT*
Q@NC@5 ybhyN4!uTucSw##1&^X9Wt=\:#^+wVTPGIF@BWEPRA+DKt&@@*wbFAj!Hp=%TeE8nqZeGLX?eVk>cu>^
?Yy6@1 $@$ImA1+k9W:!Z!ePJ:DX4C+e6Dwp1aZCq!bZR&qQ?M<H88yJeL\e#IhViX<t::NT#BI/MaXqG#m:i*t
S1Y*Ee b8SAQqXp5bZmFS/!9PG$%+pFbhPKSaR6th><%>uPe&kNG1ZqC:?<#t>Niu?YY+<t>pGpQPVB:@!!e>hy
+yWTqG y>VKqLj5w1:waQLaLLZ@?ki=:bLJijLQP\4HH?mC^5CQAF>%qk?j?dqFH</8>*h6@ZdqcyQi<Km!j6?b
k85$b+ etdm$9S+b>qT9ybcyCX6e$t*TBKyybE9+pRQBPq>iFhu5kKlIN>Qum5!*ZQEZqlLA$N&biu%H6Et+V%T
upn1BA ^QKKYG>eJcdaj9%BB>:PZ>*T++?VJ>i%ykQ#GV#dlheERnct%/@!B1KYq&pk66&+A!9Q5p#=/Zt4P8yu
<bbphS D559CYmk=lwX<mcp&9FiPCy>i+H&X?j:::<MqdT$XyVtR!p&4#!KLF?Z5AkAMApkJw#qbP<?V6a#ei*#
/8ZY=t Tjq?tDwpXWPjeakS%NQFikVRE15>EF\:QW:>b5LwQ#j&?/@H/S?jt:Hhdb=qJFh+PNwa*8?!:muMVbHH
myiL45 9lQMn<bcnEtNaS6<u@C/&YldlyIBR!dG4Na*PX54?BIQMpMW1?kDC1u5m#<$Y=PpIkEXF1d5Rum:T#LJ
6V<P>C V@?/6jC6ma/$FZln6HBy!hJ?#G#4mLhuZyK>1Qe6lW9IM>+^q:9HtX<aN*6!ZeP!+#db%q&+h1*kEm:>
DIdH&5 StmL*JTM*w/Y&eWV%/N$=4RZdMh*#T*W!wbjWY6n+%#\@4ulTJB9MSXk=VpmHJLW=+4+5n&8:eb=pNiC
J!&BPq Zdt@QZB=wIbcH&KnX#I:t?DF!*@8Wh>4?aCZde41+Hy1cR1cCZSYyc#!emE6:A6Za\L+Qa8q46EWiFt4
jJ*umy N/F4dW*L&J/R9D:GR>N51>M9W#i%HJ44e*%l&q&86/Q%+iW\ZwZkBwq$TDkL>^%pa8?F\b4*+>\9DuD?
XkS\hb SI&PY&8pwcJ/BhMAKyKV6ypIAilHC:HQP9wkj>e^Cd=*Wy=1Y/>h<wmX5#B89mm<tN1RNVZm4mYd%KER
Ve/ycu c1PywmJQINR/X$8+8NhT?#AD<m$>eNLMb#^Y&WlbG5IS?$#SA+TNZmkG/@4*e+$uZA^enLK+m%Y%L&wX
%dt@5y d$lMaYpRklT#TbWXBQ^cdh&/*@&#deSEcb1!^TWi6B5!nEw/jCIh#VZE8Mhb@y98iT<@FuK=dWaS!A*j
*mqqt! p>+PJ&miSC5TMHk4+KCY/K!P\6ilm+Q4kqd=GMWm*@GdIS&>nmY=^>5cLtiXcJ>tKEh1tyNmGP*TKeG#
4w4#b5 FcahSK^?i:tWcj+tJT#6pP*1XHP=%?ybRBCW?wbkqayk4<A%SNn8+<R9St+!?n4Q5916@4/4/mNASYWY
dhyD\d JJdBuSkc+IiLp5@RmtpZ$XJq$<D#=qTmLhVDJ5hmmYi\SLB+V$<>BpqL8ntMk=G1PZdiCZmGD8&GID>=
&X!=4W !L&4@we8DQlVNqL5/K*Rq5jtyqI=9:?Kw<<V/:@!JX\edt9P6hI%1D*4c*de<#Iy/La1ikmwn&Ck%Vwk
TR4</6 DP5diWn%BBLdE$Sa#SmQD*dw+89Yqq1!nBhJI&&Wlq!KEPaBB<qnbDAXHcBn/4nSY!QPdFLb9H>?c8Ki
XBFi6L miN8p$G>yP&B?L=Lh+/hc%H$%yBXm<Q4Dbq+^6VDbk:>N?6*WZR9p??bI5Q%Q8:?PJE@?6EmCc/kJj:l
q$Shhp TE#4h%=mDDee8FVwhS5kbLDWHYQY8yNiGy*lRb>::\VHM:dXi^l6*$8>FFiiXck:IDDZWRqwyJ+5m@H5
@9uE<# =TD>b4Vt*!H^&6jtbiT:F5<1C*4T8qwuIdw>nW+qMWknMn=y%l@h<Q@$>E&DHZ$Rb6ie?%B&kPT^R>B1
:qVny# eY@8*BS?y5Z==Y6TnqD=ulkumdHSKe%*:5?XCTB9/nhm=*hW&a64el/wRS9WLyAPVpmR#+:5m9PRI>5i
Q$*eiu ^taLbJ\@kMaT$bhHHX5C&*Q#NQ*cKPeX1wFK@19L>/Gp+Ie#=m!pL<PK@L<6Gj>5m?AH=6iXiRhKFmpF
8ASGb+ =hbtnhY5\1AT!H5hK9m8##uP<Zk1G@A4$W&q&Qhy@laJLdaS#MEnLhmBlW%JMkYYDKb95?&#@Z6P>/6b
DWRW6L !<\5+&NI96uEDDPwupl*1DQpN#T$#!RZNp^bwP@Nh/TR<u<=cJIGTw6mZZw?Awl9NZmuV:Ju!n/*?\D#
/H**>! en4T@MN#IZ5*w:&A#LVhQjyy9%<Vj4IphMpBB:iH/WlKQCLXn$n1RYEZ4cL$%4ePRiylR\lKl<YjTNqh
%!t^m# q*VL8ud*eY=mJn!hLDXBVyGkliIEA1@a<?$kZd&y8\?aS*dQk@1<$4h4\?Y+6B6J*yLYIQma^w8!4<?e
atcet/ LqNi@%l^@4udb=@&&jBXT6j&*SR$q919h6QuRETHTd:S=DN6%Y?u=QI:T=b8<tJhnA^iS$pQP#GlCGcq
qFR#NT jBkbtP$FnhN>eeQl#\NhM^D8aJh1S*BNeZ@J8^XP>cR&<4:M4bC&5et6<>X@F+PhX+6j!+y?jQlcI=RK
^n+CyY ?@h?@*SK:!whMF6X*BVWFk<ZZL@JT*qJINiRIP*B%FG^qycwNGy*?^u9VdT!d:>48aZ9ZibP1w:4wWYK
R@=?t1 5X8Kck+J1!@D:l/CIly^hK::MeXqIF>X%1pIGJH#NSXXmt4l=TpQS9?q%!$:t8/!YyR1YWwLGJb/T&qR
ZwCadb M/Q9HS^cJ4$/W:KbN@j?QmNFk1TcREPmi#tDpSPtI/p64$ZV8h8BEKa%e+pM>:p5E:9tjw&eua8yEHqD
:*J&ab \\t=1pRAX\6Rt6NR$NbWVnIqt/bcu\8yN$$#Qdyl^kA#/6qyWLE+RXCp/Ia\uY$b6dlPyHlb&^V>/&1Q
$/TN1Z w9*ACq6Rc9LFIm<#4*V!=<#>CTkF\VFHJX9j%G=Mj<q=8<Pqp=HG<:#IA4%JL8qW=^AIBdmth&XuH\#Z
!wVG>K ewy=AV<&E95yLl*?D9!#F:in5qQjcR^inu#dEIBX9clHQ@$\qYiRZ=EL\p?c8MSGeTBueDB^lEZnWamZ
qV+6ec FKbiNH:ZeqdRk!4KD9n$6*FZIH+t?^E?Nt%8ZuV8>Y#B$uYVNM/inc^Iwt#Mupm%lcb#RE%:j85ei^QL
9pL@95 KeYCc8FHJeSy&ct!C1V/<ZR\bJE+THYE56&Hja=KV=G/HSL%jY#Fjl6:y&dM9pPu6:N@RtN&D!PDZV!m
+uH#d@ lReEC6X5RYGZl/h%Be!Ri<5y>*PG\EQ<?ImKZG54/BYYFTE==*mS<P<9MH=ulNt@LwiwHt^MSX?\Y$Cy
Kd5X/5 &u6p??#\uuNEkiVZWtuGlQ&A9i44aMXb/A<yhhKW6R&lY@:!##l^X@46>@BE#X^q:RNnC:8<4yAdM&j9
lGwuXD ?69DF8a+RP:ah=F?cp*^S@Ejly:9E$Z*%4YC//1c#6:XDFwPWiu\dXC!6GyJnZ#=?8NG*FYI!N<NC8bL
BDC+B* N#!we4m$XRhHhhJFnuq%H*W@:9/$bCnN^MPnX8I5!A!^=AI?Z=Rt4N@B+6yt?#9I6d%=Ht!^&yh5RajH
l:<mVR iJ#9KJXDR/<K9m?+yY8?/5p>P%1L*w+k%t9KPB=ZjK<?q/jVLWp@#69n*&6k+iFhpp\!=+LC4NZyepMp
NL<Z\@ lXPD1:+kXT58VCQuQ^hy%9mh<*KVyKnLlttp\+H>9KB=P*t>GqZAbt&lt#:wLj<i@EY#!id\wbjLn=86
6Ke5SN /d*GS4&<6t@d!%dP^nFhR!j!HiKa=nHdmp8+Y>uE4P^pWk>n4@+&!maG&HFj4#*luPt/mP5d<:lMl9FF
lM9kKa 9pdp?DR9tpTa^@FdykZd%^h=MA&uFPTB4bd=Fd>KRn%p^akT=6i@ah5w\<uP6VpFRP\F4qth$\=m>Tj\
auSDc8 NKuJu&N6&V#4S66KCCitutiQ4EinlbSH/iuZB+4uYW#8+e5E^TJkl*Y6Eck9HEy%lcQ!P//9@GY&9j@q
R9Q>EF akJj?dpt++an6!qtZwZt1+\%y\SbeYEb9CRS@Q#:Il4N$$@Q^1%&kRX$d=Sp=X$^Bw%aZAl=5L@TEVX=
WtPu+V /h6SLq6kG/p$%4dHK5\tHD=p6DcLldt%WPhd9m98a*uJ!$eET^l\E5#%+e8H+5!yP::!AahhZh*CR$@6
YF=hCD 6@^K%?/9XjcmF!?YJjYB@cZZjkmG6CRSnPG?u#WaMnaj<J6%FjSI<!?u95n1cV%L4C^/a*RS4ajHL^Ha
C4:E9j >QuCaVAT4SPy1<8Yy>/BaDHGZYPXLkTJj#9F=EW$mmXh+bpQe>Z?l!T*SA#%#8$DZtaGIe6G6c+htCQ%
cm1Bc^ w@XI#6T6P^a>!1W>N5Z>8XP>n9#K<1:$6&eddEGtTjtGidcqjcmb1%AqT6ue8@><yVNWI%K:IL?bS!p>
!yPZq1 =Y55qZ*Bd=ZJWC#*IqDZi/m!<KTn<M8*C<=:9d$LjyhZMX?IQu<1a9y86P?hi@D%+j%FP?*$A@X*1/Dt
^yaW\u 9#Z&q!9V?PQmV#Pp@4uI:h@C^wH5aPd@PZ5N865A$AZQmIepSkwbuaaQV+IN>i!MW^ddnDMELn@Ejh&S
t<KdcC <RWeVDjcP&RlEIF+u^BE$+k&b*#c8/y#EE?AeuD+RHe$FH$^GB1JuNpeDCeAinEwXmXaNYLPmB?^Hml5
C6QEMG #RjFtTh+kDHWdp1kmw1F/Qw5i+&RGm>MK1nIA>5iQuDFIGyhjwiQ^W<<d<albEKRCK?VWpt!95PbNYQB
&BJc\W HNLnhWWwjh>pu<NyY=pVI<H&IXliqR>JD^yBZ^km+K^ZFeiCcW:h\%yiBVQeL8e9ku&Ha5LSk5NGda!I
wdl8+j VXwK=kQt%KlwX&R9Q<?:6IGTPY<nJwap1QGe?$q@E?#nVN<\?*yN*+Y\i:ahnIhYNbhJE#<LSyWmJ<X!
Mky/Ku 1qE@d!Bkyy&wb@BSiuiiNaF@GEZPbJtBF!TJ5DYY9#@WWmFE5!p\CYc5/dwHGjmn#pHI&Ke\S^lJ4LAG
eP>LH& RMK6AMqp18S=&EmK=Fpm$PVHMWTSN>8C8!H<:lclP>@^payH+N<m%YeLJK\EpWVJ<#SWHHSAW\tY>tTS
Bd/mJE ji///^?t?&yIpFj/WRA@GKJG6:n&*jpyHA\Gll^1+LM5^S%wTPFEKmVY%MmqIEaB^W$^y:6ddnbF?&:?
Nwd+m! aAmB>i&k#\J:@H$!w@mj8McE<=qc+5^*YCbpD5<Y*\uKaEm!?WI>dI=Nwe1#n^pIuCnJR?c4B#SD<8#!
/QbWWC #jk::?BNM^!l\E#PW8l9S5dLiBkwPF8q4TtDJBb=wVF9*<51X58+1ClitA5cN>ah=YEmn+bHMp>i=kiA
i%wpyV =!/@uD59PM54mW$e<*b<k1=hJh:T4w=@VltIha<lQq+Q!18TRK=!wwPQIX@AFS!j<TL4RdI@X+X8pBjW
pc4qWp +en?ei@ZI4M8KL=S4&Xpw^RSh/81lJQ@@bPKMF&wYCS8QwGPtQ4l*WdVb48didQd*c:a&GT<VJ1^BnJE
-A1aHj 000f68aa717001202b4 Page 62 of binaries2.zip
It?H!e FnRwQNF&wpIkc^8/jD$:i\K!:F45ZdN!itpklFNmBNR#YWEdSDa98<R9DSQD8Hy^Y8F+%9PHn^F!DQEa
4KQ@j+ KY#JD*aC=6\!P6!j<AlFZ?p4LGDTR58ILAeanPJcBQCZ8#A8H%i$Y1pHe5#T6Jm=IMW41LQaC:wEee^1
pFqF4W SHDP!LF6Khl<WMS$/lVNXFG/*JHcDMASq>yu8/j5^JJ%hKQeR41QGHaIBP>calyl1Snk1ZikiM!J4uwd
y=BZ!* LX=4jLLheqPjhqwde=?&16LhhB>%?=:Be:DuhZVC6IJ5=J$y4kJm*46i6aq>4>F$:!/A8@d5#4=aywen
%i6M$l X!wGCX:M<Vp=C+!!:R*YbKNq<M9/>wKPt>HYn&^jibQVc6*L$#@ct$li<lVNhyWppqT#ja/*I6*Mi+kW
%ZYMc6 MEA8k^Cy4HZH$\?LqLYpGC1c=dCi+YBRm=4ab!uT6i+EtCBXcVN*1Suj+J>DTkWHbGICDPZHBWpE>pIC
GpY!V& ed8jycCpRQH%MCCpkGBTJ@h6?EQJKXLQ:Ru%dnFXBJ6akqSZT9^#FP\HXimmLqy<Ec/JyRh>mcPEwyJ>
JaXDTF S@V=VZpt^I\&NtYp?CI5QqJV5hw/S5jFM#&@FwCJ6WSekM<PRRq5G+I5c5C^LQM9uuR6euPF\=5AKlS9
bm&Fay +apaJ%Xm9//ZQN4DdI59PFNG4IudQ^Z6D==p/BTekyE/$&&64:CnXB=SwSJ5>k8$L1BMp$8W&:clhZjP
%mL5a4 t::NlKEiYC1cJcIyEKIZq*!Xnm=^+^QtDtI1uKm1!w5kt/IyDn6:NR<Ltbb4km/L=J9H$yy\aY9kh!CQ
j\8c5T K16WPP8Cpt#+BwZpI^hMkkK5ah#45D#uKLKNbq/=RYQ?+8@%8S>NybPA191FLAHMSXQh?m!unk^dG/Z>
ZiD1&e b!Z?1eVJb9KL%A5JD54t>IqqJt%X1D9bmQCqb8Ja4YpN#:dXy$j%Ye81WM$HhBCc&GEAK?hXTamYY*/E
bIl!K5 aPeSMymwMciTb/6BZ*1&5KM$e\R6N/ABjTWT6YQt<B:\HC18ZuI=liyY!&nRkG4?9HYBYyQF?RRE9A\C
Dq=dZV eFHY!4Mn=*jy1tXNl9Y#G+69/Nd/cAY&Yw*LtDtXn!h/R66NanjcFWM9*w&/PEDl4YawqjbPnM+CeQZ^
L6AhH4 iTSEpqd>+FW:>!ASHGK*eLG+VQG:/i*bJRa+yQbMdYMQ/K$S+^d:cZMeZ1=pcCL/Ha=A!e/m^e>Bw/Sd
aih^=+ 4nS5Dck8$+wJ=68uD9l#b4ZSN?QRNDbTMQjSLE:=1dY*4*#e^!%/PiPGM%yJRJPEc686d%8m+5NpbL\A
ZaMaC+ /ZJZ8DMY\Q$PP>NR1^WbE@tLW8?l>TEqnH8Wnw+<ZV^tF1&%>FeT\wHpc$NF^%ywYC/%!41d!6F%X*bc
yWH#85 C5\keFF5>YKh+%iJXZ1SB=9V&F^:?NF=KhE>Xp!6EnatW+eKBNPZRCRa9YVwKjJDaYyB!hG+>/6!8dS=
6!ui/I y=m=ZaHmTnR9KL:i?SP?at<8bGPQT+@VRJjX*H$y9VpTXqyL#\Wn614e?8/BaJ+^RBMQbu\\:<a^cT=T
<=wCL1 dmG:y/4F+Jub4JEpk$auPMF%/TWB5M>cJ/?/KZKm9IhjLTYER^^J=HwbW9!NC!1\MNb&GBn+PH:W4$YN
m4W%c: p>cC#FAyn:J6&RbnqcTNRGLZTKXwJebbk!d>cPbbe$MN#?T?MnlkcA9HXX<Tqt6QZ+qA&T6!=Dpyi#Re
Ah6H/p QFX$WdB^##FkaLy5#P$/$EWFWYuAjVXh5Y81c&NTXAu#!T#K>5+KB:ytR^cn:?c!/i5LaQYTq4pN@H$E
G><B/N ua&@HIN^Y>5!99ES\klip!FnNmIMby*yJc4JLiWd<?HAq/IRuRbVTVME/EM$Qkej6RTd6*j&!S!P1DeK
BDZ?MS Ciuj>h\pq>K$\aGEL#%6!>=>jDFL?eXw**qjW=1Z8Y>@>i!a:YV%!*cnCIGi%aph9Vu#1F6diC5tR+<e
+>FwnX Im1jX$bJS9e$GXQ^t%QaV4ydnCPQB4PT/t@ZDbFc6*ZH@5>GQkc66cVMT\+HaNiX&+GFW+?PiW&#%dRX
/CEyjQ w$99i/yAa+NNQGb%DELq/l4*4#5cNG?wDXh1=pkYK!t!Bp&NY84*&eiYM1K8V*eqG=l!bp6WnPF+I11$
I=!l58 ZqnpiKy<m!ITpY+4S>Q8NKF6S?bQ%$w&8NAwmn%#VLuZi1l9d\9$Pjh<9j1>Mq:XD>HqBQ65+l5&bjH=
ApAQ*e ua4>kmdSq*cc1:bGXVlCk8HDpjN+9u#pSBlZuc!hS$tJE>P6JFFCF%kB*je9^4wn\/m9\9\^TdbGKJ/q
qh^QJi NR+tpCQBqIc%NepGbEyk!\LitbZmm<uTl=*\#Z%Sd@6wKkHHCIWkJXe!CR$6^Lch$jqXTy=1wCM9aTuQ
%1KHcd GE=@K<hi+55At&n9F<Y5Lyh!M&nwPY8+!PCAHVEJQ*qw/:u%4qD#QId8ASdcCy:RLYLD8+Ve8h/Qy1WC
!!wHHe &wJ?unVGa!S?ylBCQ5mpSIk=WBS=pT!dJpm96Jq!yGC/:ymJLaHEjc\?85?Jq%kAIWkdlQBp<P<HwcLk
nmy%yb HyINwTn5l/Kllqk6T!w&9kmZjG\KIm+\Q^+SMXctZC<i@<=%WPRXl1wcjAbLJ5Wi#ce$KaHeP>AlQdJq
LNICHd +SwtSk5><cW$/Al^1+N1/Ad$jn$#V\ht%#Y$VEK$V$B>@Y849^SMunGm#dQIL=bd<yF!?WQ%P/F+BS$b
El<k+a wlnQFh+hSn##KHkhI8^AEJLHIi%P=TeXB@Y^mawC!thw@!mE+&6eVqYPibY<twJ>tmYZpLR@lkR1iMDi
IFID#E 9<eMnpXZ8=BnY%S>bPkARRCV?PhTAWC&@?>WLtATa&ElBwQa@mEq<Lep$N@R9&X<@nXV>H<6NABp@<?E
i1/paN B5DkQ\5NkEH@P/EB<L<KDj\%A@bQKd5@!Z\G@pqRB9mLQH5k=^QR9>RZaGX?Ay1N+%hwq1ik&Z/SN<$K
8aB1Lw jAIc#MH/C#V4j+WGQRENa9?F4kI4?Cqw6q?wE:C!QRWN?lYc@TuwZ&p/5D/Fc!\e#L>AQ+q4Q!>h\eIM
NNQYYF ik4Zjm&4AGJ=$1D@kt\k+H?Fbu*TqQ*mNAE>mY!@PpXBV!EdP@M9yk#E>q?l&j<4>FQIB94X+kJ/E6p+
XX/jnc jnFnaPd@C9%#Tah@&<DVJB%aPhq@ZQXaj=CFtSnEAu/KyAQ+V=IPRQd@TdQ8H#IP9&595LQ>SH5B#Q1@
Ye@qiJ %%+A@$N:AjS*:RZkn?Q+n:RZkM\5:Q@Zcm@MR:n?@+9&R5^il9^EQai8l:YNTnhy:KYYK@$4laG^WZL4
E^WwNY *uDPC1SHRL#*>5t%Wj$nII>d:!a@>WHqEbD+aV6!@mH1!H5@\i=c:WH*EbD\+@?Ej*!uSPQD66/%&+Q/
?i<w4Z pjei<9^D5iuQ<h:@H8@%Q?E@@B@F/@^Q?E?@^1QJdN@DeCmI^V=QpiG!EbG:yLM4DR1iJw!&p&wLnct4
8\u1S4 FA!I%XV9BFqRSl6$dpek9JGCWQHAblW!PlC4IQIPd99\CFAh%45S?/%49A@hc*1QkFKV!u5!#WjALPKu
awSnpC #!hMQ*:Z#D>Eq*99B*p@VuA<AqA<9B@KE#=eSFk>AySb@=hN&H*>q9kI&F@<kbYa?*Ay#Q:hc@kSeGu>
unwQ6> &>Fb/h%py>:^dn<Cdly?aKjAqjj!w\?Eb+?Ai!$G:#*<?aem$@>:h&>!68N#Jww:dRNdVG+8Yh<AR6+9
:tK9^& 9J@mjwFY+PE&uQk&:pM&\!^q=NaNP=94q<:!uVDWk!=\TbPlepbPWpLy>u8tj8>5W9M4!j$%mbme=V:I
hVFYKS w6wY?:I&!:eWMBqpKHi6Xm@tyq5qkbtKLBK:CiBHkEjYjhK1tQjn=L/ijQD>4hMnRFKN/FKNjadpEjB&
TnIeyN =eeS19Vj1+^i\uq@c8T@mHh+BKk+9SEm?ua$jp?l:V&4@iu@=$APE1D9d%SkyQ&RBGF&%m?JVtPl*+dX
WiLe&P Q*m>9=F1?nH/#S>Ej\\/d@>jGnYa8Nl<*pl1BKEL\%Rt%^&K8hp@p<@Mp/E<acILZE4WDM1Xb5GC!V1?
K?%i!9 n&T@w@k^/hjG@Gh5i6iX:N?qj%DmdMB:!@4D8c:h%<RjlNtPikRMLH496H*/#QSnQwh@YBlh<\ka>Zme
!1l@A^ &9j?q+<?hPu?wEDC@+i>9\/41%u&SiGJ8:8:P$#e*YZmH6#hJdm:i$J\h*h*h\kRHIJdICEE8Zq6udZ&
F5lQjk Z8?*e<+?**jQ<>*L\^<>^ym@:8wiXV&11/1:^F<BFPc9kP\9AcG@5Rln^I9W#&w=n%+BeD<=TAjqKT:n
:+C!mm ^Zd/Bj$ui#$%pH\uaHqc#jqjy?Q@\Ed*W!a/MB$cyP$tn5WbGBjBaVhS@SVEZmbt6q+?VW/Pdiljw^51
weQ*%E Bdd!?:B\yhkq&B!SLHckM/VHKlppj81pu:B#l\@m>bhD\V4=bq!cN5cX59n<k?SbZDVC?*Z^LK9l68H&
jd&A?M V^ib%+N\6@=j\YMjZye8Q9/HTA+n8wD>/y@C!4w1jP8!VdG??qTT?=Q5&P&9XPWt^A19AK@ckCPGF#QS
\n4<QL bIGQ4<6uYh+/*ny@aL9ipt#XIE@@w?/X@%l*HYd9#eyQ8e?$@jCh%#Hy\9bFVjuuCI$+@pBj1tilLpRk
dTpNkj cLCYcm@dhL5nI^tpXBjc>ywY9@kY8/ue85Z^8uwYI\YYG1:YSl1M@Adn=?&qjC\K9@B>V8=mTcWhha@j
NhD@+n j:4$F?bjC$M@@Qa=WX1*&GTk1N/eldn?Vw:NYMIaBVT6X^5pQmha@nYR=:#EZIN^mD=8uB@AXn>JPEab
4Wm@GW 6TLlEF?E/m>l?V4*H@1!lm#/etm9dP#w^HjX8jF%:QJu6?lKj::>ji:uKB664d!%Td?TmWR=E/84whkj
mXX@c+ T/44uA>$T@EcYPQIyeXEpmb1bLFD51w1k9l=WilN??SyD*w6Q^!n+8CWeqe\>DiXJ$Sycnp!WqYmR$&@
\*W=\e mwKWm\=H<\dSuByt$A49k1N\$Xd*nwTaDTG9FD95w%+BEW\SXiPWa%?\GVWmIVKE/\4Qp$/JXmKPN+Sj
Aw<^p* =+<>i9V$9A:C=h5Qw/LaC6X&EAEPie9bccddjtZcPK$b>pTn9JhEwd*cG6d$/wun>cZ$wJQXl?YXhcVm
FLeaiQ y9pGij=MNFYiZCXShSawaLG9bttQ/iEDHKYmW%=FIZ$dwIK?tldH=l1LQAKS/TK5!V<d^%l%&WZ:$qdW
&NGViK MNAD\nn/^lEmJ<cLeFP9:&l9C+ad?=1*4VXwtBST4lpG@8m&J<hqqiTEZjw??Q\qlFJTZm5NWc:pA<tR
1P+>cu 5K&DN9Y&cHM4tFFdIw1/QFqF<4C=4Ici\#TS<EhPPu*EZK%F<YWHM=SlWdaGCm^y#WKkVXF$!e/F19I/
mc$YLP =#k!6k&?aE&?P>dR:XkC4lIDkSNNTARJ?yPSXnXKlBM4\9e*!tbY/$imJCXJFe6eEy#<N:XDB+$i=VeR
ta^Dda &MV/m:FT%PqT<a%jCIND#1/SCTKJiPDX<nehFZ!5hH$pCdqe^qGKZbnN#BIdBZI#mnR%@TXC<LBk5Bd8
hF8\\w :IZq9e*1tCE4Kp:%P?cqB/^<:*@e&B6PCIw46VYtm&K/XPQNmwAl*Vl$&9e<IE#mT@l\=h^4Z$4PYiPL
&ltZyq p#<u!pBEZ:=q>T<%ST+$y!1/NI&dTDe9q5bGFJ1ncAq+ZVlb?Q=G*udiy/GBS%Ien@dact4bQEpdQ?P:
FyKV#* Y\uRY%=B$^BDnwhM#pWV/MGjjD4Tii=L>LljJXB8ZK1RQAmMu#knSajhh18XK@up/^ln/&QXud9mIY<6
uwD>M* RWj9+!pX*ICdRQXAWqwc6y%9?uN8E8S+RR^aS5R4PlHdAPHaalYSGTYV6%S4PnlmcQS/Ek<8>8Pul=mY
>w4F!w j=J&>&a5ZITFqCYL5<Z#$K\AXY4h9QA<8ApKIVS*SlXnFNM1#QShWZp#5CGyWYm&YijAY<#dH*X&6F6H
-AC=yQ 0008e16c431001202b4 Page 63 of binaries2.zip
GE>a@D Ji?MZtQFXpCJa:ARC?MAGXGEDJ^^*:cc&mPYP*KM*IahMwtTThknac4F<dBh4L:FKLL/8m/VbZ?WdEw1
wcuI8% e1TJ/A<R&e1FRj#!:yM*Z5*YBF%8u:bP&Gh:QLcttaJ*l/qTmmm*L#^F8jLejA$&*AGF8i8d1m5DHCen
t&FF8J %W<LcGn*KHQ5Y1Z4*VputqMcQdYtnAw*CeEX>lGDF!%4wP1ACi8jW@9D>C9ASDeh/=n9decnZXp!dN8d
Tn\%Y> KP?+NVB:@LhAj1=:4P<HEY4%:X*caX%H%LHJ?EYkmtL#A4?C%B<$yka*QHiXWW!c&/1>!dimFMJXYGSA
<=mH>< 1*XtkBn$aJ46Tq9BCXi@k$bMZciDT//?wnh&HwP++mNSQb+dkt!RX4I8G/QX<pNp4Ia*hPp*<j6>?:jh
4I5@n9 nyCwk+^jqI#yRb?tScR6JamW5V:Lch$n9m+iB?#GAY6l&L66^^1jyJNWQXXR#8<I@ElBXueM8GtB:G^t
6iM#FS cM8d#XnKXB>dBD^Q?hCSyB#u8A\4=TjiSLI*8Fap!91Hiu$w:dc^MeY$SdSF%+wGXI:H+KNkt<k?P9<&
Li:CJY \&WplQ^a:5MlXq>$mH%yuJRQunw6SkZjdDYE:b%S@m=>waWVM9p%jXeVn\y$C1i>LP9ALp%j@8A@phqH
%w^>F@ QQT\B#GSdeZJR9eSSq**$c/1tVbcic*p=jMF86M*lNw:QWYyQj/5LWt4Nti$X1V=b<tHXFiCB?=>Bik6
/ZX1@H >eYQ85Kc=tJS?BYylBK?=%=ci%R^!KG=:&uLdqjith+X5e8p=TVZA>B+JN$FND#&WwtJYw8JBZyLS#FX
B=1Rq1 %l@V^:FGX%+B:tTX9TZGbJNj1PV\$cK6%/q#m5ab$>GAWmwXp/j<VJkk1>ll@>\&?56QDn6Y?Kptye/k
R5J/%P /<TN8JaN%EZk+cJJM86tdAPiduA$HAAp1S^PX/a6Z1+4?P+\uSiY5ynlPuG:ChjnitDnA@%JB4KB44a<
i6#:XH 1SmFphV51e9#ce@B@aZC/>Jy?ydP+kWX?<B65DauA6&J<*&Him*FnZ*:!bXcGp^c$=q6nG&PN$&<9Jcu
bi?:y! uK!Ku=Tu8d@IEwqKApuyY!*NBdMqb1bTedk:hHW/Ql!abdd5cDR=H!?WJ&Huy@R*6=T9AH&$W18Gn>9X
L@QTwh b+@\&Hlp?=DteQjE*PYeF!h:HRpbh^icy@!Xe:i+A%CS9PyX=l@%hk9XeY=iPN@1IthAVSlKanCi!QGp
k%b61@ G=#MZmC:PX+S%MdnYR#5F@a=Ym^BNmBEGZJDX+n=!J@M\=C51+yY??\lHE:TLn@nWeXL^>M1=EiR%qMM
P$I>ID <T#b!a*b4uj8QY4G&SbY^hnh>qck51YFpATm$qwJ!QKaJlL^**+>G4C?w8^w:8^^8<64!>/<mRL5=b8m
yK<8*Z KGjX@FSXdaWu#!aJ=I9Dd=idGRaW%qQVl#jXZ\be>=1I&GYLV//K+$mW9AXNLW8:P/hkWKj^YyVW!$8b
n:q4HK Pe@CjQ=bFdG+Lcn!$AKV%pqLtK:iwWG^QijRYnQBcdYa?Zky\eTN#Bp9JFCtVieaY#E9Yq=?Eqb91*Y:
$8eGcT ?aqpjtq^V>KKSXC!56$BMaGIX*1\W18ak:uX*$D>?M6N?Yj!B9ad#EI!Ne%Dk^:6=59CAEm44%>S!I45
HcG8mG >m$?Jw^Ew/+tQ!T64leF9C+jB=S!A8nZtj4!Na#kMY/\5Rlq!\kDTJB89taj4CcPAuZj=uFA?88B&nH>
*#?S+J 1XQNhh&@9RJ$w>:d16E&TBjJiVPpEBA#nZ5=u#cB6bN<1aaeLneeY>STT5LttT!qS*dwXuq:%1J%wqhQ
e&VLS$ L?Z&$Ywl<*9$DT#Q!%&8wBD#i!i@4qwkHYXmypGaLk%ytlCY1lRhcEiaeJpa+td/6+I18KDGB9VShA/C
+:&QMb 8/AJE6PidKHq9cwPtB\?dJ6tai*FX\In4/hSY$4m61m??<LY@i9Xh!FyZMIj4*dTY4Nw*9W!Eh?45#5F
G5Q+p! !M!NuMjM:pGe*%IGGaR#&B>l8PT9Kub4YESK/YJI!eJC!>&B&jc?=j5nL9b*ZY?kYp5@Rd/66jt^/y9c
Te&k\C btYV<$cb1e^TI+c1aQkY4&*Xdbi<t1qH^WFCFc:iIuRXDDtD*B^J1j<heDy56py9%Q<4qHcVMYID9QMd
y&wJyG qVDDN?!DcAqV&A*+tia!wbyjkFPFkZ1JI*\1!b/G@MmqJEXu/i6hKhKPlFHH>G!YtDCbNY9YPX\RQ%Z9
jI1N=N hn&R+p86e?<Q@4j^b&>85*<1<l\Bc?uFRY=^ewLC!pu4eNRY&b\I<B\y<qb\%DqIQVyW$i4bqGp\k?Vl
1jD/e> l1Kye>HSqTwJTZ$?#V?59\:5mkF+M%ntGJ%q&Z+w+@/eZBa>IADD6i%BNWI%1@RF#KBBDMbw@VynKW<6
<%EVSD lKG*ey9KJ5+E@CjXpub8$nKPhM/VYXlJlbDl1pX=D#\Jlja*^lXuSyMGFBq>%jBShDjwFcai@D<=y&\>
6EPMV: PPI6X4GNXpc#jCiELcW:i9JRLVQ6BHc?:YVTh:X6^AwBtQ$QQ^Zk=4@i<QLjF%Rljm#@<jL9BiZppeEb
pjmQ=R LN566a#Khb?w%JpuN81hH@awhBQ%Q5$!j*BGYVc%%mAK/IKjcSKny^eLWZ=LaP^?9!FVE+^=D!akY:cY
b^pAmm X9G?wmSNdjQ*1P@jA^#@WwNBkGmmES8I%dhhQ^eM9Ck@$yw^Z\EJ9uE@un9@hhVnd&iL:&X%VDSTWt$y
D:6:j+ e=bQIBWadk@qnD>JB#+=E%V1&c+NcaHkWQF91CJW%P<wG6GCDmP6X&/XT>inT5B\F1%J*DT*Rl>DuVXN
y*+8Ce AAR:CI4K&l%6uY*^@F1LTSyG&l@Zh/uLn1lW9HJy9WHK\<*ID\Xd*4Eh1<16dMHiQGqB=l5JYQ+C565Z
EHNXPb J18N6mbALw?dDHA8+#H<:JedYH>T=GYa:Yb+E9$94Fl<:8&pbZ8N:yC6%JCLiRm6Q:S@!D@dHPEiJQed
D\4k\D P+mcIX94<t1=R+cDy=Km:i@\B9^W1/ZPy1cm#<#BidWPChyI8j6Qe8XGu@Kp9!i^KXh#KJk*S*PmyeAi
!<u=h6 wNDl%Pi9ejy<uZmecV$6iFdm\E5NV$qeJ^8JG<%a=?V*Nj4l?V=j1n*PNDMlD9XY^T<KA4P&d91NeZdQ
EGG%h/ IGdk!:&V\<<%W/9cE9N=LqXLw&@hCWN>LB8>YkVYk*yCVNKy6GJq$Q:!QZVIpn&ZbIA8V#ijwFhdyY!Z
H45DZB /c=l&qB%5#B:8/6RNBw9tjlbuqAPP@S/6caG+/hKPbPY>h^&>9AMKc5RwD/DkD6cQZElD=A5=d9V&X<4
LBm9B> 6+YLn*YXGp9NBQ\^9u:Cm4:::J$e+Zj#+HSAT!QNKm5AyV?i4X>F#qDaZa8iBcXkZ#c=8pbdLtHR!hCH
y8>pum $pFZlVW>/pJuwl<dCNK&ZkM+:aXkN+t>MINT?^MqEWdIXMT%Q5y$dmitpbKPbQcV&P?+KhZ*pE!hK94t
/j%W>W 4uT>itYZ4nnl1QZiC?qS^cpW!5Eicd>XL!NmZiT!k!EVL4dZ:CV\Dbc&mYl>cThc/V$E@4a!6*kF%DQJ
h1#Ync k=@k6HJ%9A%jZ/==N+&:q\eA6ASFteyh#hpuc^i#T!Sn5tYwDBMCJpGGVHKZ4NmX@m65au9ciinnJ$&L
JtnBbn bG=9kna%NFI1caq<h&A=e$bT=8:6c#+@>6bTi5!uuJCA$GQuJ@uGJW&Y^A*K6=u=**6kpEXIB&F>LAyR
Zhqhda pwCYEkAA!aVIGXT*eJqj>uYXTEDN5kC4GQVJG#Lldq%8bE4puA<DweIuKG!l#G=q*#XE+m#E4G>8VSV=
BI819& RB:jSuXQ?ccu8>nj<!>a$DeW^XbIn$^ekt&qAkKqA?^1c:+uXW!YTnVD^D1TZ:S>!pL\1Pu#E+!iN:B%
mqcF%: 1Lu>PI1F=yZ9d9F=LKIWR+^YFI8mtK6c?uZ^SFl@=Xp%RqtJWL51YPKHTDa+Qa4w!<whi>Tl%ZK^yC\5
DeMtBm %L\!KW1kDbQ@8d6!/!cH?k?@RY/Km&?I!$LdV5PpNM69Vu=dIwe>9y<yhP^*?&H5NFYn#BSwyKGmtRh@
?<++e* Y#6tR9=DS<?*uZySdB#Vpc1BMwa$KWRah=apEn%jYitBc<D/pwp<?+lFTlMtGXXcVESA#@&AP*@V4b@*
+4Pl?> H%G/@<Q1AGl@/t641G@4/Zq<B&Z8Xe&ENhWwQ^^hT+Ze^cCkhQWF@ubmbF$&jd!bwRGT#$$Xl:#$?TML
@51eC$ K*bI#Wiclh1TJdQFYta5hB&tt1EaDNj+emC5F:iV%$Xa^#>4CpaG=Ehj6=XVV4tpd1Y!lWV+TFYa<9m#
^aWZYT mH#8MAiJdDZdFy611@66>ew^I*iTA9ii<B+cce1K+wEdJ4:jB6cc@R^QCZJ!?F$J1XZ1tCaTRDdN>8p1
!=:&iD XaYP/$TQm#=/4\BPnjbSM^l$VPnWJ+&%D#cP!wZd&F*h1/jdwMhtZlaW4cXcp9XDBeV%mJ^kD6m14AlJ
ZhT*&N #jSP5KhN1cNP>de*M9ep:PQka*N/wt!/Va\#V*ySG>u+j4YD*K69=\!WH*HqyKiXK#^Sjt#SJJ/?F:^Y
$&%^:6 jH>by!pieM!A:!PQ\kXS:i%T:G9C+ujEy1^wV?A<lpG/5ZiwPN9Mc6:>e^&D@dlcPyt$i*JdT4^<+QQ=
LV56By hjupnZ:P^5%Li$<:h?9?5>P+dkWTnPl?^q>jn&FTmtYD8y+#$Gy?6q6L9X/^PE%lw\R8QddG$hSAe%+%
8SYE%> :jJ/KqCXTX#::4N%qam=hVKpZHa1YAFqQRuCY\*HhA41\mM5DCAZApNikB\+9yCp%>^nejRe84SeM*$u
w@/6a* l9kV$>LqQaP*paHRpu=q?L%wYVE?c!?JcCQd!RbaV&qNYbS@HpTVaXGVy451TN8lTC5tZVXpD%n&DiS+
L9WBJ& Q+k1DFJYu#Glq/jXj5Ca8m<:FAY6*bYXYF*i4/E1iq5%?MVl5wy=5+QZEMj!QetX?4?LW+S!p94kZCWL
Gl5Ium VD4X4B<K>L@W#5:LXX^m1%*d9%9FYm:8nqB1!%BTYbZ4:WBEkF>T9>FNEi&GB4<h*14&LaF4#w#XIl#V
PaqB&a 4RWjA^SmZaS4JT5nNew/hB%AYjFp=DFCeEPS=WR9*SDpbtyRF>iIa<l!JtD9XTWNlH6R^iF*Gan5d9w9
BY4Xq% i^\:j!l//p8e86YtT>P5F<j%RLySDSejTeY</LbXDk9Z5<q?cI?tZyRAhaYby:ypWlw@SBD!*B:\i=RJ
WCp5Zb AV&/!&&+eDS64c/HdW:+Q<pC&SYYE^d9F5k\Tn:u8Ne1NuCcj$blW<4\dAWNPywnTXcS1L&9PT\NWFB8
!B$Q\@ >k%R9F/e$Q&Y/i+djactN+maJM?wIwpbSR@q6T^w+W%p$#<:1LR6FjC/e5bZjhRINh!F4=G5Z%X^\hkk
AhHql! DKqEL^ehj:=Wincy>>:^LDJbS@KiZTbbM4$BIP<5wAk>tMD$bL&B^GF5q>Fc/Z>h*MnbbI\k&>>DikB8
8:BRV% /mVnIFAlCddS:TEuKK:>\>X/$\SN4^56SGcY%ynStA6m\b?#WnXuqcSw/#VDSaEVRhRiu^+*$+Z\XInm
y98>CN ^9FP6dAH*\\C>GYt&NmP=Bqb@8VR/1LKXM5Ep^8LR<bCJei>dGV4?:=Gm!<@Lj:Ab%B:jlw1V#DYe<GZ
lqmKF8 4QLYmh=\&d8#h5jT89ceII@kG*qJR/RBL^X&>bay:G/uY6%ZRP4m=C9kJ8hq1JuSM?*lYepuYLtTSQ\X
ABqFS+ \D#uc:!LqmSY>G$#jq6KnbGqpad5T9!JqYuy$V/=<BMa@6kiy\p>L/1iC?aeTLb<A&#>DF>^K1QM@4BX
APH&Wy D$<X#/\>LF@KGkYLLR9XSjjd!ZcJ*yt@aZ#ZwYVB!D&>@%SZNN1%w!HTdeqD$*y/qEP\:H5$SQ>8tb<1
nlQeaH bDLA>jwen6?Eyj1:D*WYbSyYukN/eEq?%B:M&uaAwy9QcMbl^BtcQGHmqbdwGD!4GH:Whc=$@6C&\i&h
-AY%NQ 000032542e0001202b4 Page 64 of binaries2.zip
Y=MT+i Zj+:WKF%P!RqyPlam5S%?TPd#L$j9GWc8ZtAyJt*ZLXabCT/%t:6+Jly4=!Xj%=M<lh4RWCZwy?wZP*c
epAwp^ K+DY<uZ%>Jw#dIuP&cGTWlY?M64^FaAR<$RMe$Y!!KuY>@\K?Jlh98Q@CnkjJ1W:4Rd:<RywlL:a<Z@c
?*%I9: <CLybZCE?Hd+&\YEb=X%Pn1RY!*!WH6wtkk9W$y9<dPpYm6VbS#jWXJ@ER=ykbK>RTwHXJcpk4$ppAK<
hwdhnd NL5JY*Zc^SS5!6*hTNm5Wy&PWJ59<T$!4GKAXQIdCRQcnCWbHqa#wcK8dp:CJd<c/E##%1AjZ?#@dJl4
nBh!b# C?b1?8iN&=b4aZ@DQ!@?<SSkeKc4GLjpwbZBkDVWl:69ImuPDdCX</6/uV9H:qlJ<uY!b*JI%k5MFph@
H8jNXP Q=D68Llhk4LS>@#>6:wk:bYG1hJ^Ek5HEHnMnYm^Qylw^nZWd@R>EF1i^DE*k4qW&aj+QCp#R&H!$?&l
YXYlEY DIGh4F+PM#aVIEpcuBhnWN4*j:TXY?lE=@+im@W9BE$1L/\$9RLTjj?#pd8PJ5&S1d11Bt1yYFi?k5uG
euw!uG ClIX@kMWMa%h/lQ^K!AeawtV\I>QYFW>cSVda:jQYRImyV+yEeC\H:T19qlLq8bkt9+Jb==tba@4jb9a
a!DEZj /Z#n9jFKy^E8y#C#u9c#&N=NDXteywN1wWM!Y#y4q#4EcN&dS1Yq@qdhlI#hTIRT!Ymbdq$?P>M>*hLh
>whQYG /=1%8JuP\*V$aW>c<4XdN/@MG#yTJSHuC!y8*Q9qy%bZYDi*bL/9<W%GP/AIwpn@WRny/8?1M/^GBaQ$
PWFEJZ $$//6NwJu&/5+iC:&8%RqLab5anL<@k*JXESthKq&^mINL!i&CFEX?69Jy<=C/y1WhMpE8nCXpM$Qy\u
An!FJT ?lP>iHGBtd5Ti4KSC>n^Tn$BkMCVMZW*ZJy9Smyc%:P9<&jdML&:PV9junni@namhDAwG6d/BK$>>6&*
+T^y+c Lh<tN:dlPYZ9aB&$:4Ly5pK618adu$8M<bjXw%jVlN:J&PV1hNSqkDSq1+&VDDY%Q&dKe8PnB*q46Mh9
&RMD&J X!Kc6m\/&H?uSP9CwXP:l8h4E:bC&&R:&+>B<DZ1D=ZDhVM1KMm5&j4i<t*/6<c?&F?q6jaa@8Q/tq>H
I%4Yl+ S:C@$\86By:SRnY9FbJ1&ZaHL\1*6BBk>JJ>T^C?^@D6tjiu*9#D>&lnG?\>m/JR5**KM%t*:FeTAyX!
?IH&qQ yu$NTlK$lBVq8qVY=E<wNPk6jSwDn<dV@GH4dYi?<9KT=5%l^y1eSwEA=juw#mK4taM\Fb&E8t&K5<<J
&IIuWZ VEK=:mCBkhEZZj#%ZjW4^Zay8P%B=kB?d=j%FaKN1JL+LShI=yXXRL9DP/*FA>9dRel5l5w#lDI+1=Kt
hVQDNt ZJt%aQ1cqctT<FD:@XC?j>cKnLW!6mZqiZ9qyDE/>SQDNVV*itIJM&<%>\Lj#!ypC1#MlcK#JtV6Bd%n
@hMh/+ WtTRLL9G%T8jLtqcKdDIqNY$MwVRBe\Z*lapKehmGK/B4%>JeDVI&4w!h5VGEAaja1Xt/wTcl@GwPDPm
ml/VL& LIbee4=uIydZ!W9KVwcPT*\4F/tVkAP^C>!DY@8RC>Z^lT8PENV<1Z1WYGHVED?XNbW1E/&X&CkYndt%
9w8PF@ ?NGYLFkuu!cbL<>IEyS&5wRTm!y#LdlTNql64VtmddS+FE&:tYke=hX/GVhcBw/<!:Zl%?Yp4n5ew8hu
y4N!:m 9bNPG<Pi:%=KL&XPmT\<WZ1C8W$9GCCh%k&$bNVRCXSXHlE4I/ZnyA4@=DRdc?DqV@Fw9m!A59&eXbH:
e^VK:: V=Qll>jF5&XqmG?9AA8d$1DjbpQM\NKKJym4q!u+LdPFjXjC4TwHLu1XFEQDVE!SWSj@e!JVQ>8!ni4q
yiT?8% emaMhDB?N^/c*Y9lkK<YD&>@%y&yFXBl>bYdm4u9ecFADkd%VSALjl1qX#4AjZMS@aQYZA%bNpHtXD&e
Piw96E YY5/HypF+nWaST&$emV66uFC+?yhiaGtZL?DkZHRAVnRb5TM$HdlHb:uybB&TW/NhWjqPFbqc!X1=VAy
YEnLPR :b*kR^*Me**+G=Vj/aZaMlm&BM8c*\1Fp5m*wKt4b89\i<KQ/%$l$%VBLT!ea/<:SYKI:?y81a>WhB/n
BJ+@@\ w$Vtj=>YbL4+FTSQpk=\=LA/p^6dw5lRY5:j1N*6QX@q?J+kH!e8i$b4A@cn^ZR5VMA1i8QqSukuuM/&
KDBEyH >pT4FY%Dd*L/WMN1%uTGnRj4b5hY?hm1i19e$bw%1CBhB@=LpSE?p*Y*#QXRkJLwK+A^R@mc+ceCddKT
FmNYt5 Zh!>?R4RRyQHjIe9mR/k4>DRDeYa1^81hZ>tWi=KWG=QTn@T$JLR5CA$iGchtmmm4a&*NjCX/?y+VGWu
GkTk9: $c>q4aGHiJFLB/@mD*ymuj%>^C%@LnFiAZ?MAaC494TweYlKZG>%TXBTR%iMu9>GCunY\u%*qDQljw@4
YdCtLF y><kw+%ycFMkF4SJu#L$5NjlZ&=cRVF8hmRSi<M$S?LeAy8#eGh&L*4*pP9:M5$>+?*@I89HN@BFSj:G
QF/aYB KE\wL&FeQS9E$%>9H:=5tL9Yp4eFTkDXhT^l1HBjZc>SaH6m9YlLi4%@VB5*L%%?68e+VeQiXp&bP%\N
8&TInM 5&@V:L\dMQmZD$V9bLL%6a/eP/:w9cMk:ceqXAb:#DVK<wJ=yYjYDZ$D9Jh1+uKCXBPSQZ@W48T8cZ1e
4Q@!Q* D!mN9jPVBQdiiV1DnpTl?uuQh$unYLk$JhIX<5LD191Ill9/m:WW8Xb:H<Ic1tJH8DcFTZpASc$j6#Jn
y#P@?H 9DQpRI#XtE>=pEpDXXwjm4#tHHkS=:>HTHj1LFHG#tHL=48DBeLj8lt*PewGj5P>85HPteHhn:e+/yhB
a1VV\: ?M1k\w6Wy5lFyG\e4ZPY4uWLY:&Z5\Ttp:SEB*>5wPhZ*m^p!ZG&d1hWTV:^4qKK%BuVWnu!bZbNMMDA
#5kRuT mu*lh85Gd%<YJ\wRBcct!9DJ!8>p5XVj<A@ha%4>h=ty<CLyCqD+X@EVjq*?T!Dy\JR%4H/Z1pjL!c?*
NjubHG :JMYSwq9GRWyVY>piM499J>L!MLim9b4?1\p*Y5pj$JEjSLAmJS:dQAJkK>>E^q59XBIJ#Bb!q$<VS%u
F&$c8d /ScPVW?RtpBVPJKW#5?6Kkt>SaE5SQJ:K?mun?pSyl^ETy9<5KqbC4bWwK!JW4FQynTD#Q8/C<cbk=TM
HM>^@> C!^ZANmmY*S&d8KuwMnY!YLuX4/n?G6J1mpY?6bKIF9tWMR*Rqu*W#+i$qY5GIN/e^bKS^Siay:9<D=l
MFwmhT GunchmlDNZpR*S:DVb>MJnWR:WM1!R8BL9GIpNGE>leVEZ$ZPVw>na6N*^%1$dawT@9^Hmc%HGl5@B+?
TyhP5B bF\%Zak4!4@u++4G6pCM>!jhihKQ9@??Cttnlc%=DhMh5^#dLKdChX^Nb<P%Db@9YGl@Zh+e\QLJECy=
VL/Wmi dN^=TicGVBn<m?q+/\QP*ui@:H&K%c=8SFq&ZTDciJ&nyJdXCh8cw\Sm:h$VJ?h\$:P+SGeYYXQh*V4&
+L?NSP Z6Ewi8TEcqQ?SqRt<@b$!@Lw/cCT:SCGu9/$E$Y%jRpdmBjj=jte>PwNIe!k+m8k$4@\FTB4?VJ^dbkK
Tlc8Cn QP\8$q^X&eS>X/p@bR+FReQc&=PJ>LCZ$VGVWHwcbT>kj@@hXH!c+pBCpT#Pi/#RHFG96y6N#<BV?ciw
aEFVB* 9@P9tNDK9EhLJLpXNcIjHF#d@VD+B:>eQ=D$@8B+ZVt>NVni$!9#L/N$Gq&GVY16JK<WS8:5^t1^IetL
VdNdE* 4ui*^::FTd1Imp%=*mQVwXVj:>h#6&VRILlTlqjZVQI4*ybt#Lb:T+F$k^wEpc*&H9C%=MjP^%k^QMT<
yIB/&F #Ihep>=G^T<j65aQ&l!AG=ZV*C1&=iA%:<L*yBQB8jbSP/n<#W!T8XN&Xk8qFy8lX$4q/QT!KN$VNtNK
<Y*SRk $BI/1V^KNtiLu$F!G\S+C9BD!SVX4RBd6eX6PQjc:+wC9c<A9N=#ihW?ZdYVeW5CG>1ykq5PDHC9!llK
5w8!== kTKTCb\Mk+k*d\YZ#BhWBn1mk\pV*@Ydu?b>KWmDW?&%*c*tZ$VN@maXVmB49^6@lJ*c:&A@baiYybNJ
iMB5i& BeY>L+e$a<8p4RnELyV4dNHB!8#M$%+ITePN@+#^RTiPtX!<&GCewybbFDNNI&PS<^Ykth>!EWtVYW*i
qAX$W% kVbbdLAl:#I5DlRB^yiD9pwQQ#Wje>*$>=cIyQQE9@i<Ti+cMm9LW>MW<IDJCDkV8jpi4BpwT=*kE/@K
RAXC9t BhiZ*Zldeh=M/PYknX\IyXnSSF9q>mQDAqbPmlh6m4hp+AMK$w5yb9PT=1pTmXy:qDK>LQ&%LlP*RCB=
<buDM! <+ah\V>E@?eL%SBA&SI8?XQ!@*X=M98/i1/Cic<b?N8>MNMyjEJ&h5HKkS%R&$m<Q=*ZnXBRRNQFyF?e
ebGeWS :VbP!+1d6j%?t\!m:HXpYyL/!%inmECT\^8L$pmiYQ!9paLp/Rt\:\9D1hH!K+EquG<&M$kb46SE/QtV
kGp\q< hGD?aK<Bi#&hBdj^VeP?!#$1p^Qe%FTVP#ttN%>^:@c9i1le1+:4NmeJY&K@RVLI!?\#dyybLiHuT8Ru
qd\F6d bE\/b##/!wdDt89ymLZq!mSS1F1ncTdYE9W\G+j^*R<LK&4Lu*S@1p11!%yaZXceyK>paCGF^$EGXHN9
#mGYJ? RF4:NPiYEQbn%nYEi5ytlL!%14*1YI*^IqSV6*W&J>eZeXBXDytD8Wlb:?/!ndJ!?Tl4XGq8j/>haBGZ
iQnRw+ 6:H4*PuAh%@6dC>*PVP#Ki8Jq5/?\aVXKtJ?iDQ*qk#8=uwd@tC%!dEKSZNCni%8*CIKRY6JZipyT6NI
&Vt\eE W5CGR@e5G&4ZM9^VD^/p%VR5+p#CD#yqNbN:LBXQ+FYP<54dhuh9w8c$h6p%B1tjZ&!&?PRK%GGa<=E?
XW<P*a 9/&%tm1*L%=SuMXVZ!LQJ6ah=cLG=4m9<t98d@4eFu6QQ=Y>AldiQL@j/ca>&j5S1=tlw9>#G6meQk$P
I#KyAM T5q<5/&wPQF#GnnKMK/km1&ZYW&YmnYp@Z+Vh<BY!kXT+hZCcq=q9L#5KcuZq/al%m?JKyS:BbBcaDK6
6acA+8 Zk+KS@#PGVt@j@iNkhu^pR&Gw=V\ElI==V^DE#PS6<+8SW?mwJ=QhHjS4+DZ8hMGt\+/HDdBh9PkYJhK
d+=WwS CjCtA6IBKtRac16yuCE@ZA1bJdeLKh/m^V&4?Vh:XBJ9^$pe*981?Z*6Z<RNbejDVIYZn::H*Pb>D66P
q@Rk%$ 1ZZuLc=j1D*wdI=qdDZb8bHIi^BW<^!!Z@Q>edVw&JZD5u19^<V?\4PW=Pu9AF?bhmcLj:WH5WHX+tlQ
LX1q4w 8c/id1P/jE=qlhWSPh=Mm@!=BiPj*TcBViX8D*d:jtIW=DFnW+w@cQjGCbce*#Skp8C:Z/k+X55ZDGP/
CS^D!= uN/p^@GmmX^JQumuc@hZ?GW91hHQ1m&EyVwYDW/5VS<HX5^X%BN8@Bk&:IcJRYYVX\ShC5G=je@LCBtn
*QhheQ 5HEeZM#VFNC5QqZ#eh9Gh:eiTp1aV<ue4PZG1wCG6hHMYZ!QJIBMbu6E%iFN4mnpVA@yD?p@YG+pY\^G
JEXW\m 1RK^l!I*Q%86H!<tTL?dBTt^^A1VyYTMRnRSedZd#X%a5H^b:FZIy*:VYK@F:I?qI1QFI8i+PyL=uhPd
A@+PtQ \l&ybBPL5#KQcZVQjSP1>n\?:Y^ZVEyZ9*tAR>cY1yMPIndW5hpj*<96Yd6d:Z5A+dL!+bP4luDG#dV/
JSElkH !=6S#4>8Pe9AQ%bi9@C?#y<WV8QL!e#u/Gk5Ei6ne=?^qK:R?NjaGu=R\n9^dQEyL9J5tW8NVXhH^tR6
A!bKSl jQ9GLLhIC=4S1jbnuJaSF<APTZw@wi^/\F:6#TJ\51TqI&4LGZ:/8mK:pDeYYYt!q&\Sj@$wF:F1leMu
-AMnWm 000bbeb07ac001202b4 Page 65 of binaries2.zip
N&KW15 *LPXhKm4!A5<P@yDyIjc=nq*mbZ:D<+w/w/t>Ap+ct*:hdM>YVh4d*dX<l5!pkTFN$4LF@e/ll#t#w=W
/Da5w# :YW+IPjNlDWnHX5^@t?D\1GcIdZ/CGXVmi9%4HnnyJRmC>XLd\*K=XdS=!?N&l8RpH1ZB@kyluZuS>ej
\+KAh4 it&c#^KYcm?cjnl#VqqIMGLT*@AHG9dmkZ:\i>aM9tZJteJ*!1d>*JAy6/9*4T^1!BY69K11?XPqbQpR
p#HIq* VI=d*mZT?!H:/>8D!CyqC4!KnAPiN8P&4jC$makbjM/yqb91y5%D^$@y&q?F5X<BDpZuH4wyG%A&C>4Q
h\u4!R #lVyM*6:#mVMH4iQ/tJDkP&i<M/R@eBK+=@jmYu^q?Tj<?IX6LY1h5!XEn>@Jw*X?:SL1u6yKDQp!l<u
ZA@\t@ =b*MhL/%&l>6wp1ct:+aCFlVANEik!m<EiWMI^K^pDd1l?*h!^^1i549=e9$E5kw=^1p*^^<Z5^+$*pa
y+lEZh :p/MX!HAt6>5L&niIe6pBpJ<S=W+A88NySAe1JE\$A#>we4I>kQH<W$@bAc1nH>D%*=Wp4\#G&NZbLZR
/jJj5C =EIQJ>:QFVnZknkRdXQ5Hd1:n5kcTTR+4%w*&!LRFnGP@Fcp1P+Ge>PTj?GilN4A86XpW1I4Rmc<y:Py
L^DGJN p1nV@pdF#!H81pXq/TtHK>Dl<>^X\Z!leEi<6Rdw&PP8kN6*/Y/Dtp6XV=+=lithBaNqZXJi=L*&V>E6
^n>*#% Cd$nj9kQ\WNkC=hMVNZp9y*PjM<ibHmuwJimWBu5Zm!/84Qhd6b6#YWt8+M\B*651/WwicKJ:DTyKEX9
#$J1nl XwjPcAn>^VPMHAc>dtGq=J*N!bNHJuX#ZiE4*HkSJuWHn&*tYhBTce=C?$JeG*#XAl/amy^/6in&@wQH
?NSl9E >#*&$+:%LEFBnM!EF^aX&d9JiX8qN%naljn8*i1GBI=#Lypd1>1Y!D\yYF++&#5/QBh9$GLp!&\ypkiL
@DYQmt \l*5!w:M>+jeQAmD64<:S+BYY$GFiXRweIL8yML\<ddnm4#&>V#5itibY=#aWCGlnPIaw%tFEIw>KB>&
K#RnPZ XjHM!@W@?XkaeMt:8@VHbD99abaddTwQ/>1HE$deww\?Hl$IJ@wL4*KVQaZe9LT*w^!RJN^Qn\YRQkZW
qycQJ4 PIl@l>q@hydB>ct<Vll>*HX<mHhQK8R#T<a/NcIc@bcd=5?baH>19bl@dQ&/iL1!jnaN4pkXt>V%#w?u
AVA1*e %eTYN8\S1R%c%ZbjcSR>apy6@ESLMVHKEQm<mE%L4AcZLDKSKm1*$9pMHjGdc&MkVp$9R!q6L*=Ajwc6
!y8MDD 1uBiGI%SZ#XPXHV\i&heQWMC1!#WWQ1p$aKA1DewEm^dTk=nNLKm#H#dJ!nh@T^BnM=$pVLyEKPlkG8:
bYXZ=E uWFEqkDu5I/mnKJG$D&tLBmlE!d8KG$@TH%yn4:y:dF8/P&i6YHcTVB\Y5=*b?>wSJ=dJCL&A!yXIpib
T\4QR^ 5iJ<Awq@Y$ctP<>hNihq:6wu?DDWY4?aY^wjKAVh@V8CM#>y?iDdhSR^P4AmR$l$=L&$:S/Y5t*PYHD#
St8+ku \Cq==:&m?PFP/M*F/Ih/CATTKbhSh/^K//9Vu55$j#qaE?FQd@W!TMLnZqwJVd^#yWRNBKIke*PC!Hc\
?A*:Et $+=1Jwy?j9tT8TD9aEk5n*mbD/M=T465cYN9GSX=E?t??pVjq6/1@#B6>wm/WtWyG*WtH^+d?!IAXB&C
XLVPB< iq+Z>CT/^mu19diNiEtliRXWcHQIYlZ&*5ZFi6^&MW@TK%KPSnebb*!LVC$*Zl#E/X+ycX+1ZN^hLPqA
wmNd^d nGJMGj&KbnDqi*51nY+qqP$?8u/cwjdJ#>CQ*hb1apuykN*%<kPa$I<Q?#?q@5@kBhwWQeupE/V!bH:N
BE4LAM QS*9bDQ+BjwdM!I=Fc!!eq*HlcKXYEYZYYNG@^nebPp<hNcEFVt5R\qPadTQ96@!+lnW:JX+#Y!qt?<&
LTRH+? w16/4cK%uNh?@GaGeP&wa8jIM>ik!lkCY?Rhuu=JIFq1puq1hZSqt1kKWaw@uBALhj%M!8cp\lA>/X6p
FbPKC1 eFy@:Q#hj?9:lam%99:a*Icc5i1N*hbp<k>imt\@it%V%KG9/E*PEC4Sm8Z\R8J&NQ@1lRa:$W4W$bZ/
Z9461& 5qHXj$W8ahwyNVI8BCVceAATZDZ:aQkyc^pIYct9?@VFT<j=mi6Yp<wS&\qdcXl^V:qH/a:\4:q>HE>Y
5ey?Qi n=qLhE1EeXR$w!>?IbbR@/4dKl4Z5M#JWPq6pTNn//p>9^6Z4GytYc*tV?W%y=X+FTZWYFuXINXBIIMc
GZB#e= #>kI\JNQLV81+INjcB:X6hXchjKyLJLHAAeXb4WSm\duey+&eWI8*5@ZXy/yT<hI%q+iY5cX\Q6JAk1k
NVthI/ <$q\=Bb4J*EWyhY<tTG5*%JEth*F!DBR5K#6m%uQd6yuu8yGbm\?a*yq\eMJmw+8pq\PN99H6\uBtTXn
/Q=c&M i8iln9ZlSPd1K$hRAZqK!b+Kj=j*\#@pujaQibjij*b%IbpRJnuLTZ\BQd\C>FYlmT8iKG=i&9SiTH9S
R^$akt &atI6jb@kHAwj5\1pG!Nam<JhQq%9NQh%t6Ql$\*+JIyTptA>Tjj*w4M:RYWRyudQ#:n9T/j5y=>Y@DS
n<tCmm d+1!blmJCHJSETml>lcW&Z>RS>bV9=1DV@S:a^!GZ>LwYVy^5*GT9A$Xb\cNLpwXE>!Lj4$SYD65MQLy
@?@ueG lmHP+=Ikmtq@pVJ%CL81?GT<!K^a\6!@D&Yq<&/T:>M4IB<#/aShIDq16uT5GqHTm<=CXJ!G1RJG\ii$
Zpd<Kk I%SWemX:>?eeEC4q:Y^IQ=<qh+8kP1\hu*4hn&?S:?%FcHl!bZKKGnlDChpA:a:a>ANS:5j>pMBptZTy
XC:A@$ 6c1?4BWLbtIJNJbc9et5!kckihmN+KGbmZ:4Fli1!\Wep1Lkl5wjZ<&?*p@1Xw<Y5t/DIJ%yNQm&tqc*
Tayl9: F:=>K=ZAZdBnB/LGRJ1:&LtpK\Ce%=!FFKwILi&BR6neZ\C=^/!HAcEqmXSHEShF8\H5XD*yYP%=lc:u
mR+Xkn j9mC<!^1ZjmN5yi1XJ^/EAjJFy6eubXcHC%e?dFj=HVqNF!Z9Pim9TPi/d&kjQ4?EDdDeIA:!?$P!YdA
eDaDF+ e5#QNZ%T!M8+p$MKpMH**u*S*t=h=9&#u5YBnJRp@ZbH#Qed&$?G6^81<RMd<8tu:FGW4dSiBVA8:@^b
Y1/#14 5TLl6RP*c$q5!>>M8^@4Y:9wTa:$c4NV%A1hThk5%4\CYAk=jk>@CWP*=Tl1qYqlXQ*W#ZQkCNLa4GS@
c$NnQk BZSE:Y95n*5:TB8Pn>b5EZm&jbBQy6e\WbLM&w+w/$WBcPkXK!96>^ttqT8ZnVKtjJR%:&<4WDSWwNP>
uCI>h$ I^tFXmTN^!M5M/4R4w&D59:\8yI&Y48tZDFc58b61>!YE?ndum\JB=+NMumy:QSF:BRMWP#8/Rmiue^&
b$%eV@ %XpHh&nGIK<mC/R5E>b+KN<<cJq^/@kk%^:@W@84V=iI<+VHZc<D%c%yDeI%@@PKj9w\Me/c#p!Vny$h
EaFppw Y$Z8R<XAM>c^qe#kyYYj*!A*^+:RdyA:\tTPnKaX$+wVIX\RGe?w8Bb$SH=yc^VEY:1Yych?y8:D$$FL
Y#G!p? V:k$HKX+<NNlZl<Zu?GIkjGqRH/$*SDD#@1\Cl=%\B\:Sb!9b:*p9p^eQ!4Eml#jDnY\E?DKBZcbc$LJ
W<hGuZ E=MFEdanq?RRb:*SZ>&*Qpliac<!\d+P^E@:QIY6T1hLY9:S%tCp@?81wSE*GpKunAT#NX65!MuebB6n
iXkDy1 Z:PI*EY#:>ZRS6a%mhQ$%ANKt<ZSY=lNDqelmE8<>k>k*^A*b\N@lD9<%l*MwITKVyR&w@YuS1*D6Deb
?VD?YP u*+:M9*?8:FTeeYdn%M*G>1CC%XY8*N5D%qbMk<1CiHBVRK6J*J:nqW&aqDJk8#TTdpccKDWBVcNA:tL
ck\:4A 1ZMW=b%wt%^Lie@pjWuXt<bq$&!?BnAKMptwCu<5\?/ZZa@X^/Xp1R\?:VBh%Rab/4nkIdXE9#l=q\ib
bVyYbS $4bB*cj/=FHCMhM$4QpYM!NaaXcZiW%P&Gk51Z+SANk=&@J*m>yJ?q/YV8biSnFjQd%pyPp8Nc!QCyHX
b@Wckp ek<8MPnQPMY9kEtp*1ew=i?qYMELC&9yLc*S/B65eXm!^E<mjVkh8cZI^WSy8bt4KypL5k:65QQi9GKX
5^!jw> W<+Y<MZqp+PnJLb?qdL8J\dY+Rk8#a>>/VRQQ+L#\p5NZkFViK8H&d&MhCqcZdIPw$8W4B9J>Y&cXZH>
@>i^FP te/EuqAbehI8:EZL6RYQ@Z=<Tt\e$mkweWXCtWuc>ApNupR?i+?c?b+BlLZ8bq<qCcIyC%%?<9T#6pD&
lYR:BN 8WnyJLl@#MI4+DB<?$Ym>Gu^\?9eiWDBZi>*+>cjep4*CkD8/$M6&&PJcPnbBkI\AVC6a%@@hc5Kl8SQ
$c#K\q BdnF9cZBN<>MK4GWKLC%>WGcbX&\$#e&NaITKiIJ>mXV4>KG+?PnLGKh&G*EntXCetMbwYp6V@B6:dyF
<G6SQK Zq>MnWHB6nPcncNFIy5<V#V/I9bu@PR9DNeA@QJTjhSY#/@%pShN1SyI#=8P?LRH6!:G%&A@/Lii/m54
Aqwd%X V%>1m=pV%X*X::Eq#PmZD*bCc\hFq^DL:k%M\/c?+V5YJa$R\%dkjY^HuSml<q@mb>tP\?>yMmS*e/u4
p#uwjk ^DI^RAAw/J9q1dYP*BQ=E@L>^y#CJd?#+/QF4%&aJQLic=Z?9ER1@@wn*PcDa=9FZ\ZL%@t#%qYjIm$+
6*paIC w4TKYd!::^\1jkYH5?RmlJ4C*SFl<Elqb$pu4y8KyjTGI/b*8:FScTHP!NKqN:qa>tWM+T&*p=Sw++#?
hN&a\\ 1jH=8aIJ&BV86T%$cu<GYE*@d!1MKNJF$%EC$KP%+h*#c1SM9kAdJJKJ^JXXV*F4mhP\T4<>ZN$Rj4l*
ymJ^kA Zu\F:ATe9RT<Ly^y6nJ=8=aa5MI94p*TcS\n=Fnp@dnP?NeRCdmCLS95qbpYVTcQEkq4dcC<CNQFC>c>
GDH=BL kSDF/mAm=:QNb+Xwpp1yEy*&SF$P<meAc1mWcGW!qK<yp*8*=6EARu*^VdJ6k9RCyV*Jn/he/GnapqiA
$V<:6Y AQ41?lw5l4Ka*pX/EmdLRHmuT?*RFNj%WI4/KpJcm5!?&F%SEt1@bwWwnIP$a*Vt<qL#<WLn!aSb5qGT
H?8j*R SCm?qA1u#twtyp>$6u>F6cqj>W@=i1NN!hwRn5FAAjADMwcCK*<LC^VcX5L@dYwmYj^>du*t?J?/\A!c
nBACTd 4in?ieuciyiSGSwdbbSCi#!EK@4<GV=ipWb!M@/84K^a1&YJ5!RIj&<Idn5PVSJRqE>=yH$lacR%E6FC
%ckW!> kX^+lH$Zw%*w/4YmRY>!N%>Mi/8S>j$6CcwK\$y*P<q9EZd\uQLQN86cBq#n#KqTXX$>aFMbB:^Zm>EZ
l1dVQa T5?8Q^e+GjnydSuw+qDJHcT/M1C&hHdY6bAdCBLmpF$c9*DVkCMITCpG*KpcG1cbM1#E&1I18NylXiT:
Pw1nVW nd=X+qcjA#BNZ@Y$p4SqQ<ElK\$=F!AY@HARhR+KeRF\Mp=Z=c^CV^1mVIpJDW4imVl9M?Z4&inGN6wZ
q**^a! w1@=yTe8?mj%eJc1jNFl88m/Mc9FMD$M?acGd/\>9tqhQ?K\R<#\1iYV+uQ6FYI9PdCRBk1tpq5n1JSn
GmWm:q 4ajGlRp6Ay1j5&@=ETE+Z>wmVcMuiB*cGKAEp8p#h5YyeN&MqwmS#y$b+6V$w@iD4i>D\?F*iSMq11Jt
Kw5:Se a/IbyMAw%iPdBNt4*RZ>\8y#y:WunDA1l8an&!<+hV=F:T/>FY\6%1\+Zi>c$dJ&cN#RK=R?hY*V9SYI
8?!KGt uk@\^yE#a4qBjAZe8@#p:IM*#?>&ylt$e&?@uW+LNp@+KJQb88i4XpXD?N??cb=/Z18?8G\qLmb1Dw6%
-AuH^B 00029e7484c001202b4 Page 66 of binaries2.zip
Y1+Y9H %Zt$?1I@65q6TV?YT$u:W>%IWQC4utqb%Yi^&=W*FN+cy1H?9FZS:$@e<<\/W:y^mXjl%:Md^t:Dq#*y
^Q*>Gl ijI^I^=hFXW6l6@JyKw$TXN%w1DV4@waTqG&#Bd6&TkHc!h&jmNXKN@+JEJHS=$PH4?m#*HZ<P^E!!h6
pw8%=/ !cYq$Kcqyqyt#9F/5j*1C+HSiJHXZ4IpIFY%V/$e9B$@b5wVZTJ?QV!*PJZ6neK=VLZ\X1#uR*nAa:9%
N?C8P9 K?CY=YZGTce6>:DydICI!li9^P6m\IW14lELSE9SE@C/qH%GdZ#pB!=t!a:uHWdPwl&Rd!MhCZC1wTqe
Y:1I+R q&Sp=^iwpJeGET/MeLXGjDX%^#X>FIKRG*h8Xd:LikYeqwA6pdY%5nKqc8E\MaT/PNSk1YnaVEqEPHA?
CZw/yN Pkp&<R*t8Le*i@WDP+#>iAFwZ\9BXbXiiP^@&%?eRZKZ<69?aw:jNmWjnn=V@6RLFZ:dqQ#>=%%bdyJ:
%8kEYT 6V<&Ji5HLCmPQ16Q@@<I$=ilPeDRLWmSi/my<=+T@Ml9TY@1:8ZL>%SC/I81Sy:Y+J$\c@CMnndhRBTW
$w\Gk: by:ut4*tb/pVc\*XL@1X1L!$uY%A\YE@Be>quPhZkQ8jt/9yLnAb$ATZSaS9:u<nlDYdbtq>yQ<mdHmy
/\=4uk WXiewjQVbl:#GAJdkF4CD?L:4##NuG:Ilknl<CRSCB<4bA::=tb@/Kq:jK8GiX%PLdS>!cdRW:KE$<Hh
<<5X+H tmuVS961#Z9&yuAdcdjbMp4Zt6p$Md4B#&Fued%AZ?$$=8Yu695KKKyMiK\MSFS:>9tKY>48T6VELw=l
E%FC91 5Aq%n%hK$FwPMpVRS:Jp48ReGHX%hEXW:JSl9p!A9!FDMmPM@=HW88p5>dnAqZ@e9V\w:w\8mdNTA+XY
acH:Ew EQd8k5bB5mGNM$\?/pk&A4cI6T<nA%FZknNl:>:&JpSP4dYd%V/Yjhcc5JZFHZMKljJ^ii^TBGl6R<?h
YwPtVT j^I5XNb:>cQ&n/*ndYwIt*FCiGmZq=dJ6tYnn+4V\y/Mb!VWYkZSBW^KApn1mq4l?*QY+LWE+#EXPHHi
MM^S#t \qi#=?tt!wm5&W8M:P!#d9CX1Q:N#p5wD?NlmRVjw8ipHM#9GZi!mt^#E9GqIV/MuwbBIy$wut*WeIHX
<Dh#A: bPyaBB5:XSISuDYGY6B<T!5/TIl\q69Q=^61pNBh*?QSH#*F/ZuHB/&!wA+Z=@Y?=SXkbXmKIGy>K8u1
QAP*@u Xu5/$Q!+QC1XllX?/\tD?5/GkZQIa*=V41^$*1K#VWR98CF=tktYWRc+1dcNbqwh+VZehBBPuIN\Fk?F
b!H5lK \q!/nGt?9:6yHFje6cBZ?Kq=mmQ:T/!lQm6B6kQX>hBq96WX<Hnl/Jl!WTabyX4jAcy4Ai#=<^hcHtT6
4e58dH ba&5\6b&1\nY9C*>L$\cdBiuhn\ap=61iHC4NFcFZ5!p=DcKbJ*9jp:n?Y$9L<&p&RGbk?JY+iic66tS
HIa1+F $!k4qtYX<HPQcX5leJ!+Ab?NFk4ay/SZluGu/b^jR6=cNiAe\a^>jq%J%^p1GV?\dY*WKB!uh>yKZM?D
\FAM=? YhImch*A5nKQ14cMAiWi+hEE\bFnaEa^1N^+JSJ@aGSi+eScwG/P*46>/D/q$GPpk&CRPhTcX^%Z<Si1
TC!AQ% d8%&W1>%lww:TNdjHLPuNy+k\/paE/4ltW<J*/wpD9pey1qd@d!Td$VYqt=LEAE8VYXVyC<JF1*?&CTJ
I:\ci8 APP+j6HCQ/XdQSJdaHXq:1Ikj61%w+M:WjF=ARpNTFnG6+4MyGq6Z?Nj:!6ADchIST/5\qL1MMCqE8c@
utiIa< XJyZA^H9Y<=5c89dtYY*+88Xc!$lR%V$umKbGb#KYhK$Y:S&#1ZbN!iHwhPL4Nem?TLNNK\pt4%1Q$P1
j/cY@1 JYWHw4^epI8HYXmZZ&?&>w$mZuN8HB?pB<L^$BM6iTG!K5qcDbd&/bW9y%FZB%8W$b&j8kyX*CHc?Jmj
E&D!qe Aa>KRN4&KM!yyW4\I!$Ve%FAFiXCqeC?YE?cZ9S6c+wD9jX+@a149LM^=c!um:A*lqTj=Jt1DDaIB#%I
ydeW@& cEP6hDGMyh^t#nc8SFEkMwyR6h\#LI1J9FK5u^RmA:wejq5J:^Tlk8t<$9d6ZB@SE5!PCFpey9>lHM>m
dbbPGu PR&mRIN=F$/WL+QTuQ^JPCZTWkPuIGiCmYbBIa1ie1NL%j\64Veb+%CIYDQBSV$F$V&D+/H\6j&#T$?^
5F>8Zn @XQyC%J9#b8q/6:WX$B@/@*Ea%44:aeH4yh&&hJ%1SlC=&5JRk&NVAB$H\Cb@%S#i!Jkb?Q^/B<@iq$>
q61D1# :XX6iXF:BWB94#L<>j#RQ/ES&R#6!R!Kbd^CyB!<?bni=iY96qSQ96yMVSLlVi8HG<tCB::@6td?LLj^
%t>E&9 ZjtJIEC@6%\9+PeKI<V^LPi989dXqB9n9EbJwM1Btpd$R+%ECT/&<j>wZ&ypLS1Vp4k\JWC@cQGCRmPP
?WaWhS am<c9KKTFaAWCCD<H:Xq@NXq=>4Tn&NhqAub&eTMW%InliYnju?%Zj69jq%h?4Fi$?w:P:GMQB8>DAPw
le>Ml6 b\Phdj5j@iZ?y%EL1@b&EmmZ8:Xb9B1dKZhE@TKXkAwV%AEbuj$K/PJ?Q6P9XGQ$/MuSuTajR%8R!eZ/
VJ4ID* ?WHacGl+VNc58L=n?LuETli*6*hRP?$\8$bn=JB=1YLYt*e\AyWR$=V\HSE\dEH@pLDNR1eKYjJ54aW1
CZW$\6 &h:KhtD#w9HC>*kMuYEt?qnI=ClCbKK46dL>w^d=Abqj*w8Gjj%pFZ9*MFmHR5h?!n%aYdYTyKLJSAl@
9kh@nb 6XmA4ZYFc#%qcNZHd+Q!4cBM<l:8j8bIAbC>aMJYlA84*=1mhkY8wc%/cK5bMu$uH\FY6jdMZVP+%=L8
V?mXGF jbdIa%1jSZ9$ydZ<B9w$aiVuZS$$V:SFG^NQ%w$6jIPVDQSm<i9:QEutCk4$6?!*6YB!LmX$iLTNbjWj
u4n<ph al5bK+I8SyHSS1KG8$$:tpR8&+LZN$b$hle6+/$y+&XL&j9Pl/q$EkdMIjaa%4N1:M=4YTm/P^cw54X#
KIw$?K pt>>HTnnSSHwpu4GZJ866:GMmH:KNpIR$YAq:wIMcyq&N%u@kyEwJDlZH/9Xw%@DClL#n4/G<wybNl\8
?@ZYR# cCl8&E>D5q4aDJGI^:5pYcPqM*b<nL8WK1@MG4Ikj%$MbaCQEK%+y5N%5/&l9ZkRlmK6Z1CXiil^<t6Y
wwthX& bh$k!/L+m:cD@\@HH:VVn%aBp$m#&@c9AHP<ZpYW:<d6Q!=/#\8=V@JjAa#e\u/6#/pY#$Dl\@DQX#?@
NQjL&W GA&^k#4qiZZ6NAM6&%>B<e?MQ@XLl=?j+NKA*/4T?cp5jj1yEmm>A4/C+lS6q!TV?SHTyeDTqnbRST>l
RyiXH: &&bj=$?ET!Ki/ncj9@/E=>#N9RLTCV:$dL^MeQlup>\P8u:dCQkw=jnjIG@:@@d1nc6Ym<QGH?%@X5N!
KdQ$c# %%<eIQ%J^b&#>Vh\\ttG<1P9=BJT%WV+heGRktElXu%QNS&h<kcSHucI!8L/#PITBnT1FJJ>VWDGC=9y
F$Q8RR T*hJ\HD9ZaL4K$C><ZWl/>qZ+SWRE*BC@Qtq*PL^/$@XFQ5X5CA+?/\/jZ@B<eL$W^Q!@jBauHP&d9tp
H*<&at >\1R?Tb<L<?>&nV:$Q1ThQudmXC%%l>8HJ<yNq<B!+#dlw9Ci>8Q$8&@HR*X<<<6?j$j%W!<@DMQZ?1>
c$h:%? N$R#W+*5K!BFB@Yb!IdJn4^n%XCYIlm!Q18cSnpehhiRFGcIWQdG9SyuEFJ9:WTY^*jcb5>A?w!Bk*%D
ESqt5d Jm*DiWnK^Ec>@MH*4VwYn&WShaTyJ&dL6%b8K1b5YlM9T>eVQN/8\CwNt%=XY/ZkuKZJj?/d<P9m@&PG
=564&N jpVb6^TIZwGH&iVRFhe>DcWT@iGVG/=W5m:u?!Fw>Vm=Y8k+=5#Fh>L:Hm&RDnqE*?\k9Jkm/#STWXq+
bJMLkX &+Z1AAn<1S@Zq&%pHS9KS6IE/cZ@J4<EJ@A@==jk+PVm@1@#T$mk$1KN#TBBwecAk*pVqwJ#9B8CXB$m
/Q<\>= hiHFRbRcAK9dhGItSIcEEI&e$8iPG=tS$ldNSuWPFapnl&$!+TRpSKJEy/QMXmHFumkPLGkL@ATLm%Bw
WNYBa9 CkbFceab*N<9H8&&a$wVF!iXPmG#IMtRQkDQGw!tm5yCkY^pAq:Wl5tNk!!q9qE<eEAcM&JPESM+=\J5
IF8<mn IdDG4C#t!!MNEaN1Tk455:XnY&CK<BK%W%HEnJETB^MNXiZC^Q<C9BE6&4Tem9$TnQnX!wcYG+@e=:**
G1T/1/ 9lA6&@H>WbCT1%:Sa4a::#SQTDk6%bEW:!D#=yePVMJl1wX<iqVJS9C<>C+b?m@elA6t:L^MS1IpPY6k
<i9A$m tthM:&I=tniMeY#jP+uihTpYttb>?\I?LnS#tpuQV11GY>ykX/cCF$aYcaIJnaS4%k+FHll@!BEeE45M
>wCuZI BeGS^>%j=*YA!kEYa:nhGDiqkApJ@yaXE>+ly?Idp\#G\RYqey%JE9?JnE$KhQ<AF#&4Ckh5DhTEV<G\
+*dZ<V !FWwdH<+YQRSQZ8kGmN%LIXiKQcEa8DMCp>@yNXedM*dh4ayD6\h%ptZ+$M<9n:X8hGSTSjYh*YXA!J>
/l4MS6 $GRhNVul@hpKiJT1qIAPEXFZ@D:bHVWeTYk*5+yJ?EJZcdc+iC9h%R=blwJD$X*AF%V=SK>VXCRpK!hM
K4E5\M =H=FLWZPC%MPndkkGVNM^h$^pDbHe/aKP/@G*C$1alwq+byYEET^clkcqAA1<1Yc!Jdw9mL:%AyFhaby
l/9%9R $<K#?yywm:$IJuIGWduBBqcjtkEpqq*duFdc6LAFEliRtB5T&<pT8bFDk9H\nWtk>1EmX8Mdq+<bkmpw
!IdSnk WI$EaZ4V*@!Eqa&^?YNQqinN&muD!TcJ/YGVA+%ySJy<<b9qEnWb>FynD#6B&59hT6^1YmH5e>1Im%y/
Nq4KIX C6+G\<!cZ/qN5SG%qG#>%V\^N\?l9+tFaK5%><T9NZt:^8SQ*?8lqXlQR:l1HX$\jSJ11tE8&Y4FVq9Y
dnX9dt TKAIH@^khbGmb/A/hiR!jay1::A4imEPuHQw8QDHuMdu&Yl&5Kj>GDNmyFKGbcbKLDeCQh>M9jDS$$\D
eMCZqH #Tl6R=BwM*dcZjGNi*48Q4RcEiP$ncIM!Gy9WH<CXhEZhnF!TqVEwF5!GFd$w$J@lu\8FFHNl+$9?VDe
C@L4Q& H!:j#dLN8:G>ij?&9>wjL&<Zc>WabmuDM8k#nMFulVtQFL@&m8XEY:@Y^?d6AQatj^K%8dDtSY?@=t1a
Hp&\<T St!hcV@Gu8XKQmkaRbXTeNV>lTB8WFWtHlW*C^n^*m=!bVW&%%E&\YDYAnCC5/R@Sd5+>R89hZp\Aukp
PWdGV@ hW$&jbQp^R%dV1I=tMKCKXCiGFpEKBaDWdAWkJC/RGlqmyVPN^M/y+JKh1k=yEdIGX/^9NpQ1RMdS+?p
N$H*&I +GRhWwP=ndAZ4e?SYEJYYibq8%5q=P@5X!\i/haw@5+a?dy?Lq9ec\:N!DN&6+84dYkjHJ$6V1XGWbKc
$>mIF! En$6D:@I88Lhb6W+bEj1q#d*&tu#y4qh51Z/Yp9c/p?hmTLaGueS/liQnHVFq@CtaBNJKL9?9XI=NEqG
np9y4? ^4RLRcYp>+YESN<LSY@#nW5cR/$wXSpSb:Q<^n!SG<EkaK%LdquBAZtlRYI+p5am<*nqF5V1=^T1q%&H
4J/y$\ *I&PqQ4+Hat**e!nX5kHFGP5$Eim%LS=>lCJ186cw*C9QCI1Gc6$?FBwQWwhwTP>i\6apGBMH/jKp1%Y
:Tn9&N IYi5y$T*<Ne1BXL5%pX4\HZIS!P^%k@PweBPbm6LuZyY\C8NZMH&FIi@P8K/XTYYi!TT><$RYcYtGMK:
KiY>wl *>J#9m*jwwDXeE8QcTwWIVLdb*!@?QFSnZeV:\%Dq*y$NSauXZ4FKZ?HcC%TLLbVtj=miRl$nZwiBKp?
-AAX4G 000147d938a001202b4 Page 67 of binaries2.zip
cH*Pk9 Eqkt4>SWGITTZMiEmAw6RnkRN#m^DD??@TP@NiMXTb+Ipp*YAe&R*YH\/b=QnDM49$lkXw419X=@HXjN
jm5IDD pF%84qY#$bTwPG$^ee$Hw!K$<WlTPMp1V5!qbCPIhkm/ICA1XF&HGkRbt@L!T*tcp+*?A4&\<1H=^K4J
wG+E&w ERG5mB1nbPJ=i6Tw86K64#LhJ!Ge&%Tb/HqecKNq5TK%e#XMPbA=LPap=E+8Fnl>C$hCPHGj&RFcT4+h
wyqq!9 $%BtLhyiwCpNBt%qSyCW>FAl!XTh4HFWRRdnlDHK=qPd9V\qZ<6SCk&T#/*iGYA%&:wp+$4*%EV?GFQ?
=B=XFT V9MpVc@T*!nIpPu?kABC:5bi98X:VhyB!$4FX!+WpIWSZt#a\n=awa98%!4j4chq8S/N/1Cm/WMmV+Sh
*WF\!W eqPu:kV5!XETWQPSet9?*qVEqBYEq\pmYbS8FaYDLV5#8J9NS<M8GllCbN<D^=uAw$y*^nXc!q9PMkE?
%LXq/S cI$kduQ%SYVeF>4K+5&cEERB*8Slb9NI8?<R!F4nZ>!&/L6cH6>WHF9^?66TDjP/jTk\ua1A^^Vqkey8
\qn?>H ZHG%+5MRKj>/E%QaH^5pk*&6FAWkeFXkF4*J=iJ4/4DBdS\K4Z8HKVpG:4IZ$:+w$+A*!c1/cPI8kB#W
?Zd#YP 1!QNW>bBln<jk>bA8NT&X>&$8c\9qj!tR@6hJBJ%iN<Xl5aR/THY9S8SQt8GthLcd5c/FZNyENYYGI\<
IeA1A> HuCQbiYK\all4SVZwTWywVEiK4QQ8yQWj?An=1h:mc?DDVkR:RmJRD\Gm&\mLAqX4bI8j5JqKGVP\wmk
QmwiV* L5T=#5H5qYJ%$k?uNXPD*LwdJBkPM\9%QY<!>GHBh&mlBAlu/aanR@TkbMKt^PNQ6ipGN\u!clQEw<VD
KNM%kY :JyYTcDhPu!%/B965eu&9cEX%k9EB$WuQWe=ERJL+P&4F*qawM?:Fn<R&+>16=G@S!m6<apNnyWGi=QV
RZ8=YC 4*uGq%NX@JaRkpp!l6Hh*?^!iLw$ncwMjtq%mY8SpLbY4<Dkw#^%@HqEk$6BFqE!ly4YNlD4h5:#@TRW
L*uqeF Qd/BRBMZkqj1C6\:PW?F$9jCk<e>F6T/KWX<\hHRPM\8^hlCl+P\V5n\!!WqK>uSKeVYl$R%CD<EBY1K
9#t\K@ K8yVAK*4Vh>la/b6j1l?qL%nQGwGjw/8XE>ICuWN&<XN\bZmWiSiaR:lchkt6*$I$Hul\lRw<*jM?9=F
%i&1\Z kXdIKlp9lPXI!@>VW&hK#9$GCw*CnYSJPEuqVcu9MTSa#GF\mJ*PYSW@Ant@cah$kbRK1V/$Lc^AkZ>N
%cH9$y ^TY6#Y$D@YN%^e8uQRZtM*mcM^T\QhS/e&T/GPIGBtyTiZ1/ThbGCbuGTmH6GIqtJ&TK@bFtWp8wQm5b
XVyAEt ek>IBCM\iVM\5SE!mwdYGI>YKV+cmYBKI\htKFnlM*\RiJHIqR^wELjN#59%KD5WBqw<$WpCaFEYh\aj
pTyGi= Ia=kh<hya+AIPFW<JF<P!aaPMWSluTwmNai9eZl@HL%bR9\a>+^IVc&I&yZLimhc6*N5bZe4+/>j%+>e
=a:j>S Bd>XXeES+XFiYTNX&WSNeeweYpS1K$Y>a+$ppR\Nlh5&FN<\qMwGZtR&l%p=wkCN^MniX^bRyI%w:iW/
D%ke^i 9yh/$BeKJ<aS#+BGC?$SI8AIp+RYimSEih+1jkEL?Wl^I\WhH$+H+wc+ERtmwd\4\^<N6QE$$1Yp+IEh
^YLh:c ASnI%MXHBeeiD&Si1A^BplAM<1^XP&%VjX&K=4ImHat*4?Bn/*A6al/jH>16Eme5i:h!k?%eWAM>Get&
ntjG!L D\SJ1+JmHe^8bBcWqWTX</AAbVjt\Z:n%^1PjDe\T9e5t56ZX5?%J6@btX>S%nkV%BH#By/X/<=GN<na
D4TuA* ZES9ye=He4qnA?*w&qI?n>$Q>:&N1bIGyaQJGFaek4NC\yA/A!8uKXWqMB@q4!PNhN?aH?lR+8cK/KbY
GZl!ha @$CLTcDie=M?A&ePF:uLM<a48*Xu>NwRESpiicqwAEM@6&PZ/&Nj/Mt&$&hCI=VcE<aRH\tuQ:<#m/Cb
V5?e<4 uLk4i&deAiEQ6YuJ4E&a8\Zd*14J?EA:9?ld^/+ymBJLi&YXeYZDDuEi4?ld%@YG?%?EFiLE%PMMaqIA
qw:LZm HN/J:=L5!WAjqFTGK:kMaWIQ??GLPIpFSyBXpScbGmJbDYNI49YP?YhTViqVJZ?AE9lT9PDF?A1A>Ze/
8MjVIk V:ht^FT\S*R4mVa8>5W*Z@wGp\KkZ&K!YcP5L+Ai?k+>+AB6=AkdAkm:KaTn9/dcR?MjeKNl>&KPim>k
=lP85A I5tQqkmJ&6IbApA$m+dcTWa1JIaN*Gw^\1\XM/NPhnK6e^SCVic\idGWi^FWEcVBSEM*I/\VMcJWJ/+J
lc?CK$ btNMtaSJtcy%wk+1TBFDCJjq&KIA9&IyT1=u=cNh+la4?mK^MC+?\F/BKhb$Nm5$MAbHQpNdE</+p\kJ
:kH$9: u58+E\wQCBjat+E%KmELnEVMP$emHWHMm$eYGWAlS+WnnaRE/$D5X$i?c=b*c=h9/wI&:yVd#eRL+qBw
aJwPCt tqc+t%ja8XLAHCK=G%Y<&%WC:tAAX^XIy@BTQ!ty*!8=uTp&jXQejeFW@/Lkh1Kai1ZmhpC!?$JCJpHC
l@VnlT mcYT?pQq:y5K&T*TQSMw>bNK$+W!Fk$wTAJVk$YNp$I6hXh^GS^V6IJRhFkhT%klVS1EJR<K?1Jl6A%c
qe+CWw NqBbq5ELBNN!G%XNA+GcwVV98bXJ\hRBZkA5Z=A:Aik?VLpQkI?Xl/tSwAMAW?FEW>N+S?#ilA@akkuK
QR9$#y %:u9X$=#X8\DEB66ES9u/&w\GSl6/&CS/d8:/@h6/&J%/&JhGC#u1GyMpHBicdp@9<H/wy+&caANy1^S
APYn!1 4/w??tdyXjE4mlaZnlIZAWmV!5TD#mRwT>&DSHqZR/X9&4SF$QT41BuyFH#VwFtLw6qZpDpZk:tHnpqI
%nYPue 4VRty\W=?L>jPZL?d$*I\p*/i+cHj<*Nw5:?Y?1T9<*N\pu/=$u!@>P=YVn@JVZBH!jM@&#54+Q$j!j&
c@YtH\ u<:S@?$8^:?pciHp?bP5Q*wt>phPFqbTJp=TIB5yB>5@?1^w:Pbm@j5#bqd&*:M^5Q=#<jijYd8+8wqd
?D>GAt Gd8R59&<WnD?<?K*BmWhj1/<4S$5j&994+Q*j*9+&*D@VkVQu#h@Q^u@6>\9Q%9@+@<@HiZ@Z/cnaYQq
Bp^Gpp =9$*?Ym+ij=#Qly8:q@IS@NH=yp@#@@@V?V<t\RNuL?eP+cV>^jRj=8*lw9%F>Be9H?V9+YL:XjRj=iB
*dHAwy la9>X>D5j=Q>la9nF>Ce9H?VYwIL?C6wL5/@RZQ?A9y9M<>\ej$K?8<!#*B^@\4/:#LQeQ$K4\Fb@\:>
8u+X=W K:#GAj!dWiQ?FX:n?L8&8Z?F%>k=@?b>e@<K4:H>Hdh\e@!*$L@Cc*?jeaj:q=n6:/aHd1:@tLcE<^jT
*La$^6 q9!bI?8Q6CY<@!=6CVj*j:cYA4qb@>9Y$4E?jS=CYPkR6M\&S\JCKXNLCpdTcXk!LDL\Y>abcFJ/?Z=^
^VlGDM b/eDM%JeFWmM<d6IT%!C&XF&WDi#p*&wmw$aLJBWn^kZEaanlEnCRAhjCjp/iC&9kk+:Xm4+n?T=/>Dm
khdRW8 TcIV<&:MmLYc<%aVK/RW/>De+6WV^>d5^nW+bIqDJ4S+i?G@J<?FJb<KWyH6X5jCTaPFH9SYCJcpVJE/
:C%?BN hJqVQ>/HDeKZRLMc5yZk\be?aPe#5>P4DMWckn/>e!lm^pM!1uNT&SMWJpCG=p5CLFtQ+58aJ^?LTlqu
bw!!WD b&981GXKwkiwjbGybM5N*QMCE1:JyRHWjiNEDq\1*p%$B^DYME^MeNE#G1qPWNjIi\$$Rh6=4RC4Ed\?
F:F=nq RVQ6C=BnR1J1/$GHwid+a:K^4t>F%Tq+*WC#:iQP\$NBIA4CD!iGC8PEwVbJI5LbwY?%Dhy=*da$XLXl
l%nPRB bpPZh+:NFy:Bq<S!\^L5+jA^wh4E$q^qF?VVM6:YdeBHH&P?lCM5DDXAkSjM+ail/ewMl%<QHDSHk<ta
q+4/4t +EIl\m>kKuG<e?bXmwqhF=lS<BLqutt<+?iFhnW=^c!96%J6np<MZ5JE8nPdS+EtT&Xq1Ad4A<p!te+N
P$n\ye hIK1bE!==t^QX*mkPP^qS8Q&t$XSqhV5EX9t^DP*8Pbn@bDWc=iiDywHZLXQ6BdTkP5DNTGE8JnI1e%$
9++uC/ 9M^NEEVeM8\hC\i5L4Sq=CKeAtA5qYDJ>8AKTepuJ6Yt4Kwh19uJY:^Ihd1j4WDy1KbAR/AknSGVb!\X
p8XAD* ?mBE$XJ#DjBc%JQ%T?weL%N4Yl+15wjLZee8w+GkB^TaP=:EuMhW#$q+j=p#iY*F+>N*jbTKHq^K>6P1
l>\j@L K8lXAjmG$6SVEW!%GLq64GpISkE<yTDAF:t\Fu*&VpXVbl^aI>9#p#Kt6K1Fh8W18iMKX9Wq4>G6^TJ^
K#$PAI 9#X6\ntPNR#JR4ZVL^Jt8I9L\/DYjYPFPR:XVyQ#ypYN9eW/WEy^ahF=!\e+8Gp\<\l8qpdJ>=^^Mb+I
h^MtRT qw/:Im8weFQa\j%RcIIed=&CaGC+4nnFDwF&uAYLRPVFNE+p:b\/$IV8w/i$>WWYA8PcHB/Z!pq>@uS*
?wI*VF ?1RuaV?#^VQpQNdKGlTKu8/:i#KPRalRA<%/P*@BJFyilRF<<\^a^*$G5NJSN=FF?4utuaeqNwH/e<TV
myRDYS B&Y@MnXq*cXF5Nn>#LGD:ymCJPMJWD\+6E?Pi4KX8l^4B\!X\pAI4C8TR*6Fd*FSH5HiwwpWqmAj/Xdi
WP@i9Y nQ!qG4TkXV*N$*^iIVkWNGbVi4QMT?aikmJae&^?Jt:?blYKPKJ=L>?DR$iRiJJh@Atb+Gyk1?#kpQC+
L+H8lE Bk8&!5DcqE<JmPqCGX1V*HR\b<QVLt/4\WupY@\pY=SIQ#QXRX@tB%F#K5aVQpnX8S^N?mnpcD\#keP1
%M<CiE K8^WS48pbRZ^HdQT@MI%:<ql?iaX?P^W8X/DCY?hi1kmInBIMTcdGcG!Ik=CA>Y!?M5>4Jy::EJDq*DH
e^ynZ> CTyjtWHI>=VJ8FEZP1kXl#+FcWNam8nICu^$cFRl&iGIL8mE9QiyLiRdqJ:#@lSh6MtBY5u:nQu%5I!a
u<KP@: %P&=E@a^IG!YEG4%B&y?=6mE>!^apYPb&#K!mZPy4SuJZ\9SCAnjNCb4mD5N$/R6mTtmP9i#yHMIBIq@
bLTG%8 X%#pDebB6TkRJ<BD6yPEk1G:l<WMyahE8SpibXWVu1!G@eBc@HbYEn9<<!c#KT5+cS>H?N=8It$mI=$W
@G<aCT K?+d=P$&Y9eK4uCY:*i>X5$$BT4Z:iS4GNItiKp^#ukPC8a>dZId:Q1^ZVhh1hk=IDldNmd$tM1D:%B/
Cc6<I% MeTlyIGW6MQAauq6V&c/$:T^:F#Ch^y1IhHYpSMYc^E^Bhl9:6Kn!9u1cjS@?Kyw%KY4jFQ=Tw=iyq%G
wENMnY h!/D!/?HW:pYdKNWZTw*Ea/bdK>L>hKm4WGaa!ea=W8*$A=KXPqM:*bWD*9&Kn@DZl=dVtF8Ib1uHSdW
+lHPFb &!PDlR<5B+SA\8BF>*GIPFLl1R?mX+i+lllZNkp$YTRcp$F=ml@iXLi$bwlQByK&:8V^b%JF+8tcBLjd
u\ipNy 69ZMN5*NV*a^%Ek?<eCwDHMR?kRnGceK%B?#\+LD&4ZF:\/NGaukXl?:c!G%==iZ#H5RWDKGep5mG8Ik
C+aPH1 RcknKS4nQH=TkA!#YaY:dWG5eMJY*Wje!nNYqdMlE!:ZSJA9KDE?Nk#RN9154W5jcIn5NFASWhM<n/CH
#tYH!* hJ$tWhCtc*L>MeTtjBPX=@c+P?M&GDpwHC=DkaT?dyq?/DwywYCJKiF>&wVBYF!IEcE@LJcJ%WCDP>iB
FHjqFT p\1CjnyGS9E4%V+W+hA:9ITlJkPmk&#*wA6#eYkME&A%=NIcbcD^qFj>IP:>&Z9&PXNEZtY/QW1&%EE9
-AKb+y 0005099bbf5001202b4 Page 68 of binaries2.zip
+GFT>h ^>HmPqRLkaJ?F&dt8m^K%tM@=EYe<ARqBe:beH\m^n6m+hqXPyM!Y6cQPNFSW@aZcQ9YjL4tH8\LiN+K
cQy!?G k4^=5MDJl5YHWVt/c4++@SZwby$TS*XCHN8EqQH&Gk&5\tdYqc8B*F+XHcNhh?4!11JuLcSllGAw4/K=
ywBn<M lTk^8Pc^$^nGuWqjGRudn/KCNwhJBMEDmnZ#jDBc=DpcBDG&<iy6yhIpqF6>Vl9tk/c%ea9i&b@5+H&n
8=keEw p?Se5ijFmMF&+6k$kqNQB6cwD>^k#%GlBL@m#YW=d99iN%u+ih4c?*JEiRE^KhLWVa+HlA5u$JBaPVH5
EEN^ER =@yEtWGT=%\<1IZj9nna+nRR54ulhHleKECCwdJ9u:WKmahDmTFCu?h#mcBjWb%BklYtL%T?u<ADPLV:
$^AL%F aN<*Hh%+PP:QjL=a/8uNt>lPiYP14TlHPtktQMZdEPQSY9Q>LA<4tH1SXh<Sl!8ePYdwnV+DT+Kw$d4t
<MchP^ ^=kK<+MC^Vl@Vl9ljZ$KY\$phwpI?IQXuQRuD/Y6KG=J=G#<^VD*P9MKH+J:PpIpImb?WI8l#e6a?kbX
b8hPP1 #K^*&uS1c*A:89FB1QF:8l1MeL1B:FpYNhH&tMcE#j6e%$S9^AQWm<SQ8TtV5@^<\Fn*uJj5$JXZM6/*
nbeA/5 XhdSYw8%e*m/*>yb1n::u^H6n#k\N$SXb$>#Cq<JSHDT=eyp9hjVTtLlL>NdP9ijaEYc#D8>4GkdDn%J
%pqA<8 CD\b^hWt4WEm9SP:4PmN*:5a&Pw&YntX4*5AuDdXBy+=hPn54F$h%9VX$aGb4HVb?9RXX$EBhlDLT?nH
h/8WY6 R:</du&6QbA*HXuh5Y5^G%P!uaI&ekCSqmCYpw>DAX$TWw>FBqakIKPLebY9$?jlM%ZA6/FKMh%IJ<Sk
lbeitJ \i?bMDXHMmYMIn&p6l!85^9PplAk5NXEhC81V&B6?JnDu>SGc>V/DH%Si^RBJjC&cRlF4QAmJWhTLV+Z
tYK?TD Zi1nh?NqFYIYYLB#/>1T&WymY<FtWt+:K1:W&Y<wqbnwV56ny6^GJKFbN4M@D?SIDyZJ#FkMneWNCSZS
P\*TEh K*&Ah\nhPR?a1Aw8948y6uP&IBeHdBqHdQZSHCknk5@X%PSFdJ:LPIR/&*&AhR5>JXRdaXTV*5CNXN?w
XQJY@c pnKSY%JVFA1RW#Jqe\1a4!ttFB8Q^n!MhMR8jRe9P\eFKQFRMpejRTD+*Jab:iNql@+&Fui/!M+8%9?H
GKaFyp yht!uhNQQYPFwTaZl1hCKqwqnEjX4tt<8Mb:cE>6/B#Enm$P1Bw>Ie^GdH1/eQD85!WXWcFq!Z8CbH>@
?1FF>t MiBi9VB/ZeF!@9S$Q8I>Y#iKLkpZbWpG@!:hHHcJXj8LC\Q=naPL9P4qlbj\:HH5RaW*/akPFKKwPYq!
/DcMZ8 GPw1P9yl6DC/&V4!b+pWe&$jKBANNYc\!WJqu!X?CKRb*Da!5qMG5<%N*%b/MY^wbZ\Iqd?t6VS%8V/w
MHTaCY &ESq*F<mAncNj5pJjMY\ZBWTJdhy+FVVVmqiIdYa*iMK4p9@yEN+8M8d6aiqalw^WA>Snj!Npk4Vih&I
1<%Z%C !6KIlBjV#lyT@F^6I948NK44F/=H/4iK#E&JjY8Qp?hh=aI$JkLRqYde5%8^LHdtS!c4P^aYNMu9?t^T
C\QG+t h/\W+abaCwpNblEk1FPSaelFyXHuaYDhKl?NW9J8L\?TYGCk\lQnae#8TEZYLIX5Il!5aCwRG@M$I9AL
PCE+K: c&l%%d4^I5#=/hS9a%L+4mmhG6Q9FSjctJT!Whl6\5PX\8eJ\#<T:8k!PT?M1N$\\G8:^19dJ%deu\R@
T9+N++ %&>/5i%eecB?w*5=mGR%pdyXW?Ht?EKL8DM*^bTymNG%lb^6:\^hEDPnK&EZPq6pbepq9ujBmBIpIh&I
Ha?hj< eypDXL5lnPRREV8GbVIGX94w1p$DIbB4yBXCkZcTb5jmKk&8P!JIXE+Bp8?cVyDEq/JBI?NTjR999>BA
I\q&TA MqY$N=LI84p>8!IKn:h>w=w/CN#GuiIyynhVmha5H^aph\AGtn?cJk*VMEV:qhtwlPpw%S5m*bTpHL<N
5n#*t4 6!p!R%u=Tlj?NZa6%1TbYMTI>qKYi#GR!VY<QCW&*ath/b1dX:4P=###tSq&yBS:D+y/e&>u*eZt+PnY
Iqm$bl wYDL#8Tq9RGSXS:#tTqG\AFPHTbHM&KNXWFc/N=qk:q1K*WmqDSQcXkAHmBK#w\:+udyF51<V<qGRR6N
nZ#=S/ !&qaZ9Eb\+%W#+&Kc/>jXeSmnZL5tQb6E?NA?TI%<<CJcIQC+>T\?8!68BR*SFm6aRTnhJVqG\l$>%A*
iGt\@I WJ?81eZKQVd+K8VXG^WFV!n$n8BZA\cSR*T#k&6Iu=n5HYbqI\<!+MkaEwc1T/PtWiBMc@P%h1tGTN?5
Ju6bm= MZT+May1nb4Ih^AN8*NwE\j<NE*<ReyWt!!iibKhWV18PAa?6JKDt1a9#$kJY?KMWt!>mBGIk#XL@w9A
kyi6*F KyiWd1AldC1p&p1qMePIV:!/T+tk/FAaKNEea:t9ibpTimJcIa$JjZRKCw9D&NuRu8/&*apdHe9KChIT
5%6iXY MwpMMNPCYE>9F@N$k#X#H5=mhwy>kR&:L@LSAj9$\maLMKRFWy5=diS*\Ew&T595Wa:9nXpXLd%*YkFD
a/?KeR K*q*YutGa65wI4a6k$aGli/JpWwilYynj9H&G>W*m!qKZ!#%=M>Wt4L1^^/^&$bVmNNjEc91RnuaK<hX
MMI5u^ c8Ejh=aqwLBL4ibuVP/kZKBC*KY466*XuiXeVi/hZKVC6CHbZCGFQIba6LnFpFGa?JRZNPIKZK1@L5\8
FLd*4J YC>N$^R$euPd/$e5?yST<RYK*AV9RnXt**E<jDbnNMQ+^F6db4M+:I?5VCuX=byTL8#$kR@nl/Wq4MFI
pSe\Tu nE66pM9iAamFHdH%wj58\qeb&WMdW=6n^@a4pP&wdF84udjW$daT>&CuET$C$Xy44:qyESN:^w>=Zn^F
pF^Aay kmYl1!k5&QpRYCPLLm/%HB:1NVBdbBLGn*mIIVBC?jpenIELLIyBQM4=<Wb8#Yi$DIpu6tGt%/kp<*\1
L@8+48 Jk1dW#AGX=5GPkD1C%SqYulMYbh&i%^t41VJcl#$mwRV?$e=Tm8dh>t+kt?8DYYM!tn&S&k$?#H!4Gn*
KiKqW/ S:#m9:+D1CAEN:AdqTGJ5*KI<@CcYkHJkdLBA>\lbT?DLb\F1J#:*HIWFl#:NlRYP*^tPcqmTyuBActF
m4DT+I wV\ly@IAEZmSiC/ACJ!aA=L+Ne6mB/qJMF!iCIJSB!*yGBhp4l!XMkXq6qBINSe9K9V*IpdTNVJACZ>l
6paB!e D:XS:F69hQKlqA\hEWkIjPnBSEy!IGW:9kZFMd%bA&>w1\jNAq^jLu#pbutkt//1l$^wLI*PypZBkALA
4eAZ>L mK/<MY@%?Iw>YCEq*QZlM>yleAn1&=VI8$FZ\wbb1aSLFWi^:?V^mNb\?dkyMMAhETXGR/Zq^NM4dEp+
c#pVy5 H65#5lBdS9FJ5=RI/PYh#\Z*89ayW@dbE6Etl?b#*$Vp5wlILdw4K>JHaKW$St!KZW6P8#dYjYZbd=uX
8qHkG> FT:mlEHK^uu8w?+Xd&M>LVEqJ!NMJ6Tk$A&yTJ>K<>E8qSDbJWaPKWG$wjhR/P<9&8uI>/5##:Yy/Ijw
5nX^%@ Q>TY</uN?akD+t1@TKkuR^@5dFSD5>Hw:tY$dI4uAA\VXBe&TP1kwkjY#%XD+B5@i1I$JJ9p<FQZqV^6
inI8Yb IN>VFTlFD?yb6ZD\98WIERBC&Ku^muHmYccGcHN?jM8q\>>mc\de>$$QL8QMeyDdK<*I<55El<wW#&Xp
6PK&%L #%M!E5*CT<9Ki5jNt\h6EyIhWkQXb=6EWJjM&=+#kM/lM!Q4Qjtih+ZWJB=1\%@8w\8>YbQ\M1W*=BlL
5@b=#= iMldNY49tGTXXMA+hJ?hPVyeVbeaqMBGY!NlG@KIIla!>C4Kb#w$i^Gj<CjtMG$:TP1n/<\atHKItHn9
9X:BR: %qpm1h6B>w+\T=IwDy4EVu$\5Z@9wiHt?d@BR@Q4Qll8*u@9pHD>iTX9did/##a@Nqai%n<L9H<R\edG
c/qL!: >w<C^=?F*+Mbj!9\@Fqk@@MSEl9:u\T#5ZN^@PYQaBF*hQ@h:jE@ZCCeRP=@a@dnaj%jhJ*\@l9ZCi?9
Jim$Ne 8$=+@:*4lPjjGIZ@HJ=jeF@\5Q<K?8@M?D\e9+Jt@^6nPA@\9+Zt@AW$J<jj>b94F>B@/\Vk+j=9wZq?
tKTul@ Ae*BAj\dNP?9wNu?y6?<4L?Ab8j=G<y=j+ZZ@6/M#@64#Qa*bu#iZ&I&n4@^<9ECj?tX@X*d9<J5HP^@
ee!%im p*/i>#<=IQ:E@u>$RQ!XK9$*B\Rd&:>#RQD?P\jEd$L=@+b4@?<Q%%d<u\nZbn9GPLmmSIR+n/Yl^SjA
\FNHSM kdcY5aqqNmtEkwD1D!Wea%M\paWMWtkm^PEpc:QAlE@!>TKEk1AXwiWXHRMllLMj>GGHe/CKHDSjYyql
wWcEAy <q=A^E=Dy^ATMC6PB/wJRHF+HW^NKhwS<!qZ:ai^Ii&:jeMG8ydXwndqK\\JIuI</LElJ6y64TDda+me
LwJS8A RDYYmjKEwWGJaTLuA$=RPh#Mnw@u<pX&&F9J:N4FB@MXcqW=k\Cj>XFW4/i+b+?Z>jGWt1pW?iJdGA<q
J&jmhY FeG/PwZCILwIiKYWGy8KwjMHTaBR@cpLw>HBFNC+am=tBZQVW@5j#DVB*4ZV</W9bE:LewtD8Y#8^5cA
R#^#CY %:9I<hP!D&SPeIuYtL66euCq\VqLl5CK#P51&Z5e/t4e@aByW>IGGaXCeMbaI?$:EGBVkR*>AGpaR&mp
wj\Ahk laF%HLGbX8$eu=mAtZL\cme/5LQQ1/Ei5^>+Sa414w8Z1c=?^mTY@!Abl%Xw9je\p!M#nXF&u&p!d!E^
=$\L&D NbqtSyIC%Vcn8t>aqhd9DMNNNW$y1^\KS#*PwRTLcX/^=pKkZQ*&5=hFc4mn$QS6uq+9JIGEBSVWZ5Fu
pc?nJw A1aJGX9TR5<?K:\I6yb65L+/AqwwKQB>jN\\<4!q5$:t>aL5YqHI<F!B<8iuIXydF/MLTLkQ&nulM*yn
iE=^*a H%!/e=aK!1+=+FHl^jlMWPHp6bhKNlpBq$Hq\XamVDEXStPb6ci1EkVRmJD^%T:!H@4/pCJFT8wb+!jt
6qd^Wc CHwa*L!JtD>pmnyD4<JLpqZ598<I&GIHw=hm/?VtZMEI>qKH4Skm+q:GZhe*pyI14t6FN?tTnkcLlRb5
qeVpFa N4PM:ESq1IEb\H/e#VIKDqH6DFA1PhS5KtwnZNbnScyTPKSS!:bC>mZYtuJu1MJ\kIY\Mw/k48KD^yAa
4h?pQu #i?WMwdLl/paPt&Cw/ZqSD*tE?>VIhB8RAqV*M$pl>A5NEtB$:WIptR=HwHHiK#tGDjI#@F\G!JWZai1
eh%eCC $?=By%=yt#VNpTZ6T^K^ppDW&1TCkneHWm>dFMT>DbY$lGeH6k*Cc:A9JCER<bYJtDVF:Yd#^qw*XJJP
%AKeX8 +KqQ&CVVH=G#8*4qtK#V!>*GNbAit4tpTcTdXPl!$QNKXbmC=Yw$#HMZ:=!YacjGKp6%LiEXEchSknQC
D*!jKL V/MiWu@=RIuHD\6Ey?6qTpdFAqN>juM^V!Z>ESIyPn<H19!iGby$kQARpna=!TBq5p!LLnW=!ZRcmntJ
/q1ik^ n4$?>8ah<1SBBZujMM%i5I6J%IpEp:t>KI$iTqSJMdcEL9T1KMD^k!&?la1:L*um&?>KkPLalw>X+CWD
eS/#e1 <JpNl9/#Wl*#Xw9mY6WuQT!\LV9c%&:l5Syl:?/LhqPThXS*<4cwKd8^VDHMTlKL=Yu/#DIkwmdpLtlZ
BIpKXW G:ZuqtkWFQL#8%D^w!QE/QmNPE1?M4QBp#H4lP4q*/*Ep\?G4tmEPlZilWKJ$V=$JQIT\CjDYXFm!aYw
WJeLN& LdpCMiKAmq^K444bwS!!?pjF\$!k#<dbtdR>6G^DltXk1ZbXP#Na\Z$m8QGkQG6XdGb6V6\8^tC6*D9t
-AA#/d 00081ad09aa001202b4 Page 69 of binaries2.zip
N>cRyh Yb$tLjT%8%BVL1:Pn/jtcIy+:&^AWu&1MwHqXZHKHLI*#QVqHAbJp6=yw*li?kTS:%Z8@ZV6qWK$a^JM
\q/:AK SNNmFGFRq#+Yy648&/w%5RwP9+>I>=k=&Yck#Y#LaQj^#5Xwy4ym?pT$j*hYE*jw?VpLmMMhDpwEe@Nt
KyJmW# aVyKyMqX!$%bppk\PA?GcjHIQh@ykhL9:GF9RRk1h^*kaY*9TeS<:APbp6Ga@/BweupiY*^$:=81ZQIC
!y#lKb ?EYdkCjaJkYK!MkEX/&^1^%#<tYdT1WNC4\4+XtwHq@G#DqR%ii5qDZJtkyiE1j%n4GWM*6H/@6tc5Jh
6*lPRM HhHdl/j=8t$M$>YH&WTkh9$\St6CMqH>?NNMajcIKcT$/Qje8E*PkAT!L*mINuY4EdTL&YjMCtuu!X%T
un+<bn /nWq%tVw=9q#Y*y!E/ATt:Je5yaytn/LD\*SnEnHQq9HK@Z^$>R?pEl$dJbXH@M+^G1Nn:ySJc5?j$kL
8%b=!j Dktc$LFR^6ZPY<bQZP1ka:PbdP8Pl1bKRQXB+td5M#W/D$/Mdw+jJq$$KtT4XlC6n%1DhW4D$PBVcL16
cctia^ 5V9RJ8DTWJbQ\eHVd^V=eHE=yul$E+bJtDm#GMKu1Bhn+/B?RMDXw1d+uW&^WmP8ui*WBCSVMuX^mq@T
KE$1*\ /9C>5YHXS*h6tpESipX>Q5j9cpipPc&HG\15$WIuAtY\bScd<<ikt#SiLbhiIG6I^\81FlDLKA/<SEq9
IZ*l?l dabS@SRZyPy8I>i<8YKwAw?*\FC<8!K96>a@/%EKF&NHIiSknttFJMF%8Fm%!*4JQ*&+kHJpS#6nN8NZ
8c=aR9 q6Jh4TR*w$6/H:Hme^EXubP*=WcHlXV^tc*<C?Zu<YL#PV=HZYX=a/%\+kVTjS#mI5JkJD6M#DpMBMR5
A9Fmbq \XCBCPShHY<6X<tk\iKHZB%Bu+p<IAbbL%S/@y/G5tjKI:n1lVCG/%Qc?+&HL&*b6Hc%P1FH^=u*DN@<
=$WnnM q#JKZ$Z!FnwC^X?CQ1yi?XSuj$ZNHH$h##D<i5lH!c*eaV$jH&m>*6?&YVw>LiEtS/\w^PJtd>>Z+>YL
:8ia<e 5ADuGw19ytT%MuA6N4eM9@pn&jb<W=tQlD8w=DttZM%udqEAkA1Diw49n=cQqMWR1e!!9pPlLX4!6CY:
b##8/c NmaJ&HQk&S!*twdcRdK9Gqh5&C$$1*aR1b==M4Bj&$c1mnFXiE:E*y=8&Kt8YnQXA1MR?YBS5n/h?WP=
c5#/tY HtCQ9n/:>5#kXlRZ@Tq?Ze%w=^P1$A5ABIX1DSqY<8kW&LDQ#uu6<N/?ASKyHuA66BH*>Hl5^cGE@kq\
EK5Qn: 8\/*Ay@*CZLa1Ki8JV*9C%Ta/kc4MIRV4j:yX8Aa4MQPBNjRuN!J?u4<bwb<&WZjVKa5NTi5GyIDwE+l
/G+\&y etyeh>1/TApcYBSnp?uWWt<1mlJGAZpJpJ<:V=4yTTtPq46?+Tk*Y#kc5IGn%yDKT/FhS4?$GdG%Y!w8
PRetqL El@W9EcTMV6KFh&bTV&h+n1lRd?B#+lJF#*QQBuu?/d$+FDXp^NwN1YpNFhWk$l9lt^*HH&?BtKetn98
FDJT@# $^$lZdHu&dQ#cyb>A6t6:S:^KbYkbnGw1E^=LePY^Cn=B$%d6N\WLMPdZa+9^hm6eR*4\hBdJe58Vb<p
t>j@DA I+<\1qt:LCPJ4F\KI<+HRcA%+5FQ9DN4Y#/WY\b<^mjhIGZ4W+YPN:X%$/EmI+d9^GLVXpY!R&Tu\=W>
ueC+5F iH?<m^6JGNtAPA$!#GJTcV?MI4Fdt:q+ATbNW5Y8IdJ>QTyQZuJ\cn>&!Ven\YeF4$i!^#<!RnacYAk4
bX%ea* taaq@Yb^ttP#HlnXNaICduQ/Lw>&\JTc55YtytSI&^4?$kR?NP%E$?c$wM&i&me55iH$ubMFcTuck*ME
1iicG8 wV<F6I8SuW8iGhRw5!6nl>jeuB!MtJ8quN5Pb8iwW^h+WbiWQ9TiY@ZbnIhaDe*?p5jpGuZMyu9^AZTX
>@juEd MB6NCJ6JKBqMbC>=b1?qW&?iTP@uk6%#TJ@SPq@yNlwFVGk4u5F#\4iN<Q=VnIPIRME!eu<aW9IyweEl
P4k8I* u\BECSu!S$MFJc>#hXpqKXEb%CAb*KCbP!bac1un+^D+#bDp!/6cH+jm5WSJ+5aEy&6pVeuLhMRGpe&b
?A*Ic< 9e9LFDl$$lmn!E9TKeTbQeR<ZVn+XF%VtYcwwu5LlT\K*j6ceKkVR6nj>tqpn<9$IRMGLyuVLiW<MiKt
\M<F8E ?e6=kMl:bmnwn/w4p#LM<hN8>w&X@Bk%wScZe$u+Eeh>5FH:I1TmMC#ll<WtKpqh$dSh!4I&C@awE4BV
HYbZT1 WjSD5VLJpT=!e99FpQZycliRe$ZdSPwtEqdJ=ZVJaSM6ene6aY\nlymGMSdETp&l5ijyF4BXEVMue6BG
RD<$q> +6Nmlykq//t&E1wJ+GZAlGy@/ImhB\ktmeknBdpb$<qp:cZQayCGLeZFyIEkIbtn#Rybk91mD65<Zjuk
mec#:t =qRqW\VhXkbp?TnGlZ&iXw!HC1tZyhSV:dP/Jthd?Z*DFq5+EQJ/NBCLBEKjw?K$h6/q\c/wFnYXp>FG
CNPYyC <lbHI@^GGjp/*1wyuEER\Q^J%c1tnZXN#J%I^S/#MhKCD*E4*1JbW?tiFWchDRP/?%!G\yYS%Qc<Y\VV
^h1d:F a<?eHRN&@4PSF=K44m8\F^c<X#1N+@M:H@RJH$5@+BS<*<Emy=nE@N=u#uNTb9hhPPpq9%l8dkqj:lA\
/<>mTd :mpFcD5bGjkDtZPRVqT#iNGE\?$I4<6ECdRh5q%F9JmC*1I&LdmCDtLdc9mbMj^Bw8TV$/K&Wq/EpAZ1
DC=Q=% Hn5CaGeFE9Bi!DSdhN?i8m=/?/4SkpJ:DyIEb9A6$P^PX$I>DY*p$X#BeSJ!1wR?^l!#JF%@ND*<^uub
kbPwSa GkA!IVjSC?8mSV>/T#F1KyE/HNWGuhIkK8eG^K!WG86VkB\T&\iKqi<yY8>L5+^BA8KncCe!Cl*m8F\c
pmntep bJj^bG*=*ZdiT>I=yFt$q5>EZqbW$jbL1:?SqXT9mK^&+H4JXhuWyF*XyQXH@n1InZImi%h8HlukJDM4
D+PbP& LhM1mbulQJF:FC%piMh8Q#jNe=5lu41tY=lc9*lb%Zk8tZkZVd14^Q1aSbHNpb=ZZXADQh!l>:ZmnVwZ
NL<8Ly Y>NeVlVAaZ>C4qAEnpJK>IR/qR*dPL1I5=!?A5+w^4\1tp*AYHLuSX\L+WdDX*dbb^+JVhaiC&R6al&a
hA:k=F #<J56mPKw4K8KS8G:t^4jYAImeKah?JI>1%Cp:9jI!wMDcTjFXpRa?$@AY>kieLc\8JT?C*Am<qFu<pn
iH$9ij RTINy%ZVAP&Fjd=5PntTa%4*w$ecd&TjJiTGl@1qq5RYwp%kFq6<NPSY*CG*T>T!E6PDCVw9SK^*/Qm1
Pd/%Yt 8Z*JhNJ=XaPPPlMXXYR4Dj$XneeCw4YdjKc^S@RpEd1YIJ&L%kL6hDITKZ5WKbXNGF6=XC5XjZJpZDX^
t5ACkh HJw:+9VdN!$hBw/YRjXhndN4TGk<5jPCwXeqH?9KAVEj+k4q>nL&QpHa/c1+CpVjIN4Q\!<u<@>N!D:9
?aS&Z@ @>pGaX:i@#W#K^9dj#c#54H>myqX%MHB$i%*R#Md&%?&a#dPj>mH^j=+<t?65G!5@<c8>1h6?4?&\9=t
6<P\hT @jt9$b#e*H?Db9<X>N?EJLP^e9\CG5nD?#hw+K?k&j<P#jujRuQ>Ay1h??@GuQ8@lid=FjVjW5::K&nY
Z#DLTW 9$G#@R19@c$X>8jj4:ALJ@9jwH?F&aAeZH?D=9ljFPw@N@d<m%D@I$L:F+Wc?JiLmJQ%Q\k%J>8@FY1&
T/IcHI j&X8e%i*Q/aAn9<w%&#@a:D?:NV9#j:#ymEFc\jd*@6p?q5qHP#eyP!<ZKTeQ?9m?MqL9=Qm/GJt:9L:
lLi9p8 91E@>\L>K#Ge@><m=8j4a?eB@8+#?I&tZ/HqQ^t$iZu@c+M&:#<d6Du?nY96n&u/Q^1$ihnb@9<lw4:l
a=u!WI D$N$Fulimp<bQR5>KqL+dSbp6C^%*MSlZ9u<CBw+MJJ<QuIq%AtaMGdtN4dY1kHLEIt$jQ^JSy<h9>>w
6J<<?D J*@I^=?LENEhHK^5MScaPEp%F^\:!AG5:m6qncb<KV%M$nRX8Bt/68K6T/MHqH*DDlw>YPb%>*ulc/6q
tn1G>6 wF$41\?Ty<%8b>1Hu<P4*>hicGLch<N8nd$PXEEXFdZD^SSV9FabGyV*wi=u&^@CHw$%qcDGSGR>y<Q1
&yqR&Z 9::V^^T4S&Tt1yQ*&Whm&=>au&D9W:ZCL:pmEEmww5>t*el#DNR@ByJX5H:wpa5P#Y85/DMGa<lVi<CF
h<tq<K bm?Cdak/S:XEl8LkGiXke%ymFwk:c%QlC$XIZ8Y5u/!EdI/6W#EllIIwPmTc8l=m+186%F=lV!AD:CJY
leuZjN :<8hN>Zile=#DIFFPmLEahbhCE+*MYAwnyAqG4XApWZcm5#IN*&B1VbFQSPF1m!GR\pDjpL6leIIQiBd
bI*&M& u9L#cI/HKB9mR8LRZSTdh:P:$NRRqhnZHdk9PMFT&Ge<I=YdqI@9H\9Pm\JAw<S&5uTy+c4\n*Kq!kw!
mH^anF l=nmwaTqKTwd4:c<?<JuEKNI#wYW$djVyGHdePLH6w<?%#\IlMdE4na%J#DZ=bHk%hZah#wnYncGbl*h
C&1n&e /\ie>mn#HFb/Dm9+K/Cc^j4na!JXaYtq#Z6S?caQ:HQlCL=bhbHN6FDy@mB1?X%B8$pF>+pqKK#bpBEa
LW&qmw 6/:SMyEQu1hiKc>/WA%YqiH!PDyatYhkGRw8YVL!!Wqm\!y?@qPldLm<*=q9Za9?9I$ER8=1eCm&YqJ*
=uQK6B VZQJQJR1u>RqZ8$?<Y!hp6+p!1CKtwCymLN9^*GQQSnkm?h6b+$@KqLh%K9ly%&wH&*Hb+ykhe9b#=WV
t+!=$! X=&l:uuZ:^*tY$&:5eDT4hMVuDAhq>@RLN%=J8y>C8Qc\cwW\XJ:bYFACS/8mZMH*&9>al^*FhVQIRPC
eY\q/h ?Z!Z!<huVyc1I/1XMh1wN5QJn*AAIyN8\#VWihJVj%1:*p/CAwK9q&>%<tw^6K6FpIwR#CWd?$eZe@T$
X9!++\ lD/J\=L/%<l/NtIyjN5^CR1pyw\V8jh/&wH#CL+K+8lbh41bc*P$qD9tE=M!B8kSbPu5W1t*nYH&pInc
+#X=pn 91$#c51<ZZ@W>LENQ1dnmPAB:#bPtjCPtK5NASjDRn@SNtB!>?<4Wy?cP<hS14nSyY84$ThjH>KiHB@w
hM=:QA KA&CFkYjn1Z1^?A&&ktb>KuSw+bVB%@t/ybZ^aqHEDYkCb$Jq>hFN&&A1&ZIW/&qwA^VlK?G4$/nRV4k
BTGp?F 1>hVmFM94=5w$V=QkkKLppyj=mVQmlY$h/EZa!4u^NG=C+>TNKVGl5u6IM/GW1!waT^%WnYk>F&#n1+8
F@#$SR wNZ+RK5b:j@tdA1Xw+S$NYWTY9F\9FR$>dl^#h9Ywj^>PZS/$VCY@wDDXjE:?hYit=nFP$kMKb%<n%QE
9$QCX# %M*eiH58nE\8bh1WtA</y*+m:Nc8$CVAETaH8/cT4+^%PFcpc5!CZ/C>1#1QF5G<tWCHE$QNGK8<&6BD
*R*V&1 H&9p!S@KEX!AMjV9wWT>RTII<piI%jEC\aBT+mP\lARZclGPMT^!<Tp9qm>5VW&1l\BKmt^hG+hEechh
jVcNe4 mt&k4>w%Li6EYDN?ib/=^B\>>*^&EP*BuTi4@JdkSQkQMW1?$pI4\=nSMXc>La:lRw=+&iYQ#HQcN%b1
uEu9Vw 4mMcKtMbtNtLe\\:<&DMScJWiaSmdKhKjwNcl+DBIn$Nl:B4Nm#XN>8WiGWNSQESQu!9YedPcp:WN61n
jnq9uZ d<#jLj9u$5*w=Z6kCSwS<LqEF\9!i<Fa1E*u5Dd5mXhS\!k#Zu\Ien+cGHH:lG>:u?\YhaC1X/RIhjEY
kc&91* N+G!Ac^@&N&8YniwVlu5^!!hbn66MXyW5WN$8uanl%uIDXLM!Sjwubu+@cnk69Q%c!WLYbuE?1kT^?EC
-AFein 000e7a6b9cc001202b4 Page 70 of binaries2.zip
/J%*uY Ih6&tBn>*DK8JQ!PWM48I+lQ8pHFkXQYPVJ1m>hcGV%jk\Qu9e*iu4A1b>X*FZelBbZ^!IVh%Yd5::Wh
Sh*Wp+ Y8>%!Ab*NC<54e*NeVMbI*G^WAFCq5AutIP1WCEQ%9SBVBH86ZE=VN!8MIk?H=mAV8*WaX!=iP>+NBmJ
bww\$F enT#%1KLGl:ENQb^S>P5S6Z>=hp5lKHuBw6DYSNJ>WcAlDYEdJnJScCwNk<hKItD/LR/WulM5:/b1bZI
Qj5X9! wkWiD!i8^XCumhC$^m&NCZ5wim@h:k^ZK@E/D</\6#lPcV\?mL\Z?4#Zk!l#hlA5$XnVK=%/qkm!duHG
p8p91K <##6:/+5*+nV#!4le@dnASeJCdPSnch+LEL9ci:<KQK6aYB&CcpS/<1AA%hedeYQJ+#!>BXDkKqn<Em4
+H=>ES V%WF!?b5$\aY4W*#X:HCGy=RYEc\EyNBmni6/9B!t>T+#@LcntI6N^H>u@k1>t$1w%CPQqq^V#*m9aMI
WPuXM& *BmE5QJ4Ij!Y=>LTTiNeSc9?16JBX/>ukA$6iPIRp4:Rk\<X*Nm1&D=bQeKWuy?wK=?<6IC56jLS/5S<
SQtpH/ 1l8L&V=NY>j=lhhZ6tYhKL*SIbD%1w&hmNiB@TQD*4bGSqAd+&j1a8%^=Z=@ECVDal<#/jRZt>d:ad^9
$B$n!/ 9JblL#84$%*\9BiE!Du&y\*cMMJ+V&\BDMIeTyici!&KBThQ1F\*+bZmBjcw6nB*D#ZqD?5MJ1:qZ:>Y
=5#K\t N$q!1=*E5^8B^6w$%k5Hj4Ven\t/>K4PDjXR1JiXY8t#bmcj^FhR<CetQdK/bAu9*RINwaTRHmc$V%T@
H$m@Iy ?htI*XLlhkkLCq6uBG:WB!luLF?XHu+85F@9iYM+1*Z$XD$:!BCBqQpyWA<C%n/Rum>&TP\n!kwX*uy6
d!=XZI SM=d^$TVL/Gwt&+8PCL9<Iy@5N%N/8//bG5MjZFcPIB?ieW^km4SZZb&VKWH5NbT:X91d:ne/ccV%Hyi
y$jZRP *tJ>nk9AcLpV58IJaNqp5=\15>>:P\eiiGquKRu@WkjbM9\VMchBA<<eiQ^C1tJaht+q$*a$t#=PB%RG
k/PlXq *+aw$u=tSkCZ+aRMjmk^>\cjuXF!PN/BtR8ER:cMA/cIVCFh!%VVMp9Ku9+kD=+$:/NB:Pt\Nm^RY4e6
cdi\6M JtaJ*wcVi%E@WP?m9b$@aNTVbN?pW8&V6T1pKtE/mpKAn4eH:CBDQmbhQIpNWWyIYpQT5/ePQGyaC\#V
FNhuBP q!\jQC#8dR$lAiEk%*KyANHXE8yZbCl%l?CH1mt5/!FRZJcTwXyDAqp*<IWXZ\$Pt?FC+N<P/!5H1l1i
@mEV6J YmNWu!/!>4BhL+lhRI>FTQ&k*+cN1dAhwpA!ElE>^^RjY$YJWD%R&St%Q*Y1yC/pyGh!awP8@aJ+5kEq
J<5+ic ?\*BTh<k<k88!KtlJDh<HdB8kqZN5pI=i5HNPhR<5aab1lqDJVeY<nyCPRa^WY=<4lV>BkI8elWZlIbu
^Pm!ee jm5&+cP6cHF?8cIANYCkpm\&q&up>K=<!l^iRpAQhCeB\tR/PMH+#KWhPIunAIHMq5mMSqk<I!W&*/Cu
MV&VB# e8$\4+P#n&%+Q6YHD8&9TwM#::L4*Iyh5GMTynRePI\45^/pWCFDckkj:C<k=pdSb:MY+4MK5KLhH=4<
/wDeAh uE6LV\<FcGMkNaEmLWMTb?ck+PIX6\BCXQGJSZPdqmmRq*Gc/uLicHKJC*AFe>Mqy\Q*qQcD@jqFMHpw
^%TKKL jp:hJjAmCjRm1hR:T$J:V&+D$LTp&bCAFwTCaMRRR>tlQL:BPTHVTt4\ABb\H=1h*$NJR:1wnYKjZQVJ
RbmdIK l^Lq>unbVQGlB?My!iPlC?PBJ4q!A!Z!FI<hwS&Mii@kh5ykc?^k=NtImpJll/LaTDEyC?9bl*1k\ZNk
N8*\ip ydP@JY%>t%hCaPLLqq\QqY==KP%c6n!KeQYTnI!6Mn1KMN4!P:NRR%X+A^91q#V$PK#>GMuBJ!*KK$QD
lQDa8b b^81<Qp#Q$8+#8Fc<LEC5k\9uBpdu+TIy/Xa$G!D8IkBb+E+LGIuq\L:FNZaXQDEZVq+a>G%t8Yy*!Ap
9cB&lL e!TQH8*Ke8CkeM%nAw#HLAJQucPE5eVDjPBuWYW<$XSwc/M#$dBWNZ6^$hKb6^l=mp8+eY=eY\ZH<@ch
!@&F*w IqiT+nZl!#i/C8emM%BiR=G**$&&Fp6EI8hqLlB=ac9wFcR/pI&&H8RBDhQyEZG=&>FQyp9^bVYJ#jJ<
Ky<c/% nnXmatiScqcMT?yXLW1w8=N8w9J:DdN!/yhP9qTl:Wmm5nGahcSdY\uy*emZC!eCan8ZRdD5LPS*mhh6
+TamJI :^\Al!l8<tw<?nFqBmID&5jR#FSZGKAT^CN8yPM#=Hyw5e8P6:Qy$$#KJMW1d9b/JHAT+4R^?M&ICa1W
%dWaAZ K6jCJJR+wAaGI6R56S5@8GRcDGW=Nb6\Qhy4$@IkcAY9PZWI%KE=5cRCFdTGitj>FA$>hYW*A:R>&@w$
@\ne9\ e1e5nVEaVEw4=Pa$54qXR6Aaw5kpB5kI5i:+*VTINIcJaEFahj+:#u^15A\MLmkKjR#i+H=Rk*P1F9FJ
#^j%<5 dB/IYN<NT4^RSjttc6XQ^lbGEhjAnEb9yi#GYLQNB!NNbJGlPu>GCGw$+l#YhGQRw8XX8T?Tq4^G@A18
ZGS:QB ZC@EVQ%KMBYHyMtEetPK!p/ni<CwM:1QIkIm@QJ8SCPAaAGHWnK9CY5qXRQ*DXcENlh$!@THN^WeGLe+
18!KYL FP/8wGRp$%5SQR%dLDRI6eMdWJ1\BanG&uuaEnMG$@!DL1XAWVkj9LP\Ehhd!dPXpP5mN?e#++w/^bZ*
9\SjnB 8tEwXmBimq6$=Q4WbKhB\\l=+L!eA5yAY1QS6<?ZVG#J4%a4XZVb\aiQ5&^$pMPy#+t+imwRytHclTPi
Xl>WDV DyH<a9ahQEyk+NCBahCaTZPKLqFCwCZ&HS\M=#8Aei#LYFT<tCRkAe46=RI@kBZZ!HJcWpaF5R:*uduF
N^%n+% $SAdbJTme5$mDeZn6%QXJKYH4?=VVkXdQ9<Zi*<hF>iZya9Dld8:8#5WVwK:8^QeuWCAEN#hNRS*h\%8
+Z$Mjd \aK:8\eIBAqRL?uyuyu8@ta8*V**uj8=9%6@\Kuc=>quu**Yq4QYi6a11C&EC#?n@^SZkuqPH^phB68H
ikWbM6 >CuK5ElZ!a6YJbJDNB>/\^1/B+yGKVlyKIjwwDBb:aThX1p9w5imWM:55N$c/lQmLtIRTtlt5IEF6GPK
Vw91!: LYKc=k$/a4mXSJT*%IV&BiadC#u>565ePWK&Hup9e1nZC1>:kS<pc^Vm#p*bDpY?<9A1:&Htc*HT?F<^
c5T\wy M6wP#1G*:b=DG>wAu\e+SQJ:<e:Z::+R:VT=A+!auBRlaH$%\/J\e*i1LITem$\haijeLdSD#56h8*aT
@5FP9a 1b@iTh48Y!wyWI/LF1ES+Yc9NCjd\RmpB><9NXem:hP:+Pc:t8=IqLt:XhX!wPh#tQB^dF9dp%h#1>SV
B*!!C/ 8JM^PH?ty?Cph+/JJ4ZuE$8nm&<M!T6mtP4tAA>mnB>nRy>lJQ*GqC*MhLuN:H#EDbq6#$E4HZ@F%/WH
#m&B&$ ui8VkIHDTw4FcwnJu+9PRbp5VS/WSC4M>y$m1ctL=#5Lw$kRl<c=^>aI5XWMFD%ISREMM8=KMX/F&qqL
=+9kc? K9j6ZHuh1>F1ISWu4&<NNM:9R>n>cIY\wqJ9wuyVw5G=YKdyGCneTb*d/MFSPSh?eQH<#DC$jwWH!X&d
k%8Vl/ Gh5dFAeiEKh%\:kF^WTSGdhIF1?!p/%NL:$q\w8iTHQH#bKt\<9?=K<K^b1t!D1NTkQ8tlTa^NdDtdSl
!\y=Eb T98hQt^:Q&n:Tkn<PkYkBL@ld>/XD:LXe+Y%6AN<lQ$8BT$b/!EYp61Dq6HW^b*j\MZT$e9p!aDQn*tm
iaZa5! n!<4=Z5c*/VqwRb:8Vw$dwj5&EJ@humX&BTWXXRtLJ4Ra\4aPTwI!8i!4b$JQGC\pS*mXKMGFd@Nn:%>
YIe+Z% ZuR?XVE^%>uu56tjmiLP$@w:9G>yTM49adk>#Lld@mmE>VHAmD=>Q:D%BLnape@?mRh9QVq6t:FqQ!:6
iKVCTC G%NIR##:byd#AajKchaP1JwQJ1FF5QakM\hQMpjElE$5Lbe!LYqJP/qpMqt54AcjK%tl4<+a5W/YEVt/
u!\?H8 TL6+wyt9jhcGeTpKiTQD?eCl546HypjI@MFqlcWu=uXwAXj+dkn*%AIH1an^RX?wMn?6u4a+=kTmn8MR
y!/Iu4 iIpnudY>qJHM8jnyy@9<SZqa#F9:MtnJtndNw\qaCD+ypd^/u1Cbk/JbwNZ$y*5wJdX9YcptRPp#4y=W
%mh=Ka =*uXR</#&bb5!\euSjK>1#5:eae?=nE#YmnEJaeH&9^<y=:CFXZ:c1Z!p*cJ5/MXTu8WleJhCDu1#:u6
W$4LeP Eq4!mKK!?>m?%@*+u@8GFDV%%CbMmMWk8j8FBpT=TXqK=lK&KB*F99dA1DyDBjZ4SSES14qA\c@WAm^J
*TF>@P >:I!Iwl\J+ie:CXY?Jndjd?8PI6:%ccbu<yAAl5mHILGiaQhGa4WuyIq4Q**8VR@k1Z*@KHJ=6>MG@@H
4NRHVk tt#?#Rj@u>H8e9D?9ZcZk?ej$?=!@MZ9u?M96l5P44>S<@=b=@m*&p#&9>iu@+XP<ALdDV9dT>C@<YJu
F$<X?m a&h@Ab4#N+F\&Nk=@mW$<AZw*+Z\aYQujAGck?h*cK/ZwH>:di/ZwNq?a!>n=*pBty*uh$?M>!Zw*@W=
\hCH^! ^$6pnb*>h?mZ!N49LV<eL^E&D5:j&G++PQ=*GTCA#&Ph/*pW@4KG@HLkj+EFkkQ+9>Ec\5ZK<#\#e9?y
<ZpYW1 VT>yC?j@e64naPZ+?&tQk=Q%:/a>DmD9T\qBHECiQ=#PPLn?5G5+PQ>8VkL?k%*#!$4E@w\CeuGR5uP<
GGl$BY !FLE\j$*q1K@CN^@bTu/h:dDu!^Fj#dP@W&>QH>kKiJ<:6D@S**+:/e?SQ&#%IiuAp4l/4?tQlkcE*TV
hQZnBu 1nJT6kn*<YEGC:h4VRd:mZ/cEAP#diWLSNwyu?9i4tMuDEK&NMNG#HNWbWAPwN&F45h\XGLuXZ&9#T5#
Hic#// #5HJ*K^1Bln@/li=^l:Nc5QDX&>*Xa$ZlFE5^INIpd4HI>e6hldFpbe/nC%eP/$6DK%!<E&Aw%L>FYen
ALawD1 SwaM=5S5k6KEP94B$8n\>HV?YC9ncC94*Hid!CP?CZdj5tDlWPe@MS\G<yWwM!mDGRHF\#J!B^5<mHtI
LTA=QM b>mVGwlbVBNGRu*59dNT!1\ntpVDi!6^lkinI@LdB8!BEF4DA1*Ch9LM/w%R8?KBEALdWtP%jY$B5*Xa
IkeZWc DC1dViX*#y#jd%Zt6!/$lAVY\MTG%nnWp1p+DX\hlh>9CI6jt^nG1hPq:DBnCK&5^H++lAuER^TaHhCR
Z\ciBC K5dTMjKj6RGV$/?^%I&5:9*Ic>hH\B!bF/\%\cM!5#PBiD%PnV8<TJXykmmKlJG6D?!4khqkkq:CSEa/
JlBFNX $%6iW*4@!u!BHmtK6b/kjLNm/@%$?4n1Fcq1BhiylC\&IluWP&iPnN$*6y66+m8H6wTXBWPtKwM$yja/
niZb5p X<Kn+=1Wm>:/J6^WQh<%BM!lLN*THjK6lH*N!A<486b=KX5jLadjJScRejEaRBLIeKI/K8FAkkNF**ZZ
p9ElW9 *^B!n@@5#XDq$h5QaBmilJDmSYy4Q#!+4j$t1ZXVahm9njSE^CB:jt*dJm?L=L*6>dZB?@!46:&qiWb9
ik=B6b KmMpjNn6=:iN6clkK@VmAkqJw5T?e@FT$6Ja+G$cZaq!%Zy8G/NpDb\GCPwHhCy?Ri?dR5Kh5LJyuYR#
\NGY9> Xi5^5CBkL/K%DX9M!!<ZIiWMYZYX%GtEk#e5y+$?1TFC:a1JEc<IY:WyZEAbeKepj5ahajTR8GkVt#&:
=/LN?^ %/Ik=bX/^W:jMDRHaYl4M<pWuu=DHL:qT^8=>@t/luacn*T1JK#<B%NH$ESd4klNYDu6cE$mHm!aEGjR
-AGBkn 000df658e98001202b4 Page 71 of binaries2.zip
/NjmN! CB&k1:aTCc!cR%Jy=R5\EL1JYI5P*1<Wb<kD*SB^Tq1h\bwRYJ</yeVH>a=P&bq1SkB^eiN6iDlVK%XA
/Y4=G? 1q$*SL>KmNS5Y><cRY@PkQ+keIJQ$@MtAd?SX>yNQZi\ND<^9%HSme6RwmA\km1?Sm>eSVZ:TtkVc/p4
VmC8\6 MEHCymQ\IS?>#ppPk^cX95F*IVF@py9n+!/h>N5W$Y\HTJRKJkWa:\IIp<E$b@B*JhwSLGlG8hbA\H+D
QdcHl: qlTC^h5A8wl+jMdhHBw=G$tl/6&<68VKqiplWyFJVmVYDTZM!C@buHYW!+*956j!?IZ$8>HkYNXI^A@^
*>*/TG hjXHZZ8y5u6j1$#u!a#VGTyP>P%E%S$mMu^\dG\YSFP!%wAc:9EP^C^6TWVR%tB1nY&+Kq>Q>HeRX?$y
=MyuH< DhcSb*\V+Y9tTl*JcC&9X6J&+T!S\>!/F#lJBT+NDTemKX&a/y>u!TEj++=JaAJMK8aZRCwJY9aQuDGQ
>IAdAd u?dZ^HVj4=S&pFWLLAk+9B5MwP#cL+>INPVC:qiqCubPMN/YbikaCkBY5ES8+&nC=im$nKl>SFd:LH++
N#tXAe 6:DIBh%YajdJke6=KaTtFuGtIFQ#wJw:b+?N4YK5PM9TpZ6SF:56Ck6YpY68wFI*iITSKVj@B@bBdY1u
MACE!= @jSXkB84FC+JnJW+&ZWe6Ebtm@nd6S@Cmdjqd4\6\#?8HkmtLw6wPdtuB?:LW\4WP1KN#!6Vq+u>:HI$
^4SdA8 %H*HbQu9mKaPY>=Z:ZGp\<bcRymD&X#YjIaiIVCLM^9k*C^p*T^pWbVuqG*i<GWeZ%JwET%>y<TIy4@J
tdRF6+ j$BpVE&wmc8JW*k%c&^hKhA4*EwulEmmG!1?HhI\c!&/$e5TZ^6tpil=%91&&yK=%NaF4mab@@1%#VSe
ibdkpB FXD&%LetZcCuNkBJVIwdp91&Kmq6:+$^*Yhi1pK?AmJ<Y/jD&t1D991n9PPE!PEihNL=$J>AbFiDJd!Y
wI\4u? T4H^bA+*9/\mPAb#Ni*eACaDn*84ZR&8\XSqa@1Swa:eBd&&>I4y1Hd%H5IKYQhGKuV+#^4DN!GwS=&+
jj^RZ1 =E<w>Hy#BhqV:XEjbKh4EZGCSQcmIy!pwdNHChBc&JEay4lC$L$qa*&XeBA6&iJXqKCI@I%%l5M+YaS<
=bQ&eE m*HBQV%mujbimViuEyWa!!Nj*K@EhpYhPZ8Q9%Q?qcNABEewH?*H4R!VWZFl4!mAcAlQDm:dq!qwKlWQ
CuF:9Y Lq\R8m<WQ/&JWAS?dynbT/$R8keXe\VNqJ<1l>dYu#Fcn5=>F\FIIKyAy>j6!AFhyp/Sbb#1t>!QLm#M
+m\!/$ R^MpFMHkJ<VuZW$$u^^w4a9kSM*R==+6Gt5@8SHSAI&kEjaqq/6^Rppy%VAHIZ&Hai:56J6Z&9yw++VA
AYjIAj Q1$@4#w^:tQdj8&MQ9PwT^MSJuna=V=@t@JJ+&E@BJ<69QY?lc*eee*mK*yn@9IP+SMDNicj>CYyuV=P
WciL+^ S6P6@kmS^VnE:pB4=eH^d!RjN!Z69utR=X@q*pwXt*LtuI%wM4&#K>e+eQqRPt#T$mT5n1VdNuSbBnMB
%96pV5 *X+%hR4F+Vi?=D/^DCmMHEb$&X*:c5/e%KGA+5G54j<Y48%XRS/TJpda8^DiQDk>aGicEuRi=:i8<y?&
GcG>hL m^^bEqa>BaS9%TueVYSV>1>p%ma>by&p%Xj6X:F<HW*dZYAGPtpFuEZF4IQZF8SG>WunEWj&kBD8ijSC
SNRmAL DnLGn9CYunD5BbScBRFA?TQn<FQmHEl6<KPJIukFt^mAiLl*ccq@D6XW@mAqa8Ecdc?>5\\#b*mwuyTA
lmDnWY Y4CAaZkB>KuGhhl46+L$pQE%+eNEbi41LKGBmSI*4m*Kt/Dl\HBkEHP4@Fu>%:AJ\@^/ekqa?=*/8!Bc
Sk!tqP KlN:&*/6Y#qTc*HjnP1?5!>Z&aCBl!QAW=+&W9YTthXVMnV5n#!B@JmD6HABy/Mq\>lE>RLcl@PjTC#n
\c&Q4j 1hZFQ@hFa8*cX*5d?jM/%m1!teu*%u1+qEXSci$Yq4jMX$V5wZ&6wY6aBj!>Fmh=Z5u@<CNQZV<D*:CH
bhX9J9 X/ed*1TW&w\tlERt=XikyQF@^N!J*mdX&<1X^Np/&?:C*AFkMl1n<%P/^^tu+Y$I:Wd4Wb1G+PhHajYm
?+HNd6 $56P6B<KHEP%yk\1VMeEq%cVRCCc/>M*F8?>uTnmAKB>Bce&%Gh/P^?i:#Ce:AehD!*C44$FtaPMYCYN
9aYJKy /!>yQ469?\+T5&S<TZS\ABmKKPcaj!I8q/$Ii^Kyb<VEXe//=p&/C#e1CTl16Bp<<=E8#*Tt=!Pu@GAy
%GuLLw Im5bL:\@@AGSWQlddMBRyZlIV*cJCmI:4XGBuFQ&YZnaXMD+bhK8*CjtaJ5yZby+I#4J$9CTDh?9Wnqt
A*1c:R 1VqV$NJjhWBKEaRRVQDTYnXPB+>H5I@jcp5ehtSCEqP?4ImPQ/tE#ZEEuZHEdA&dVcY##+nHV6!jaK8c
SpFmKb PCDDbVGHdCNBKj#<ewYm/JYCi6q==Gpal>$@$bW8Pe$R$\Bytb+NX+a/!Ce#5bSCiqLBp6/Ft9&Y@Tmn
#iAJAA !6ytG9<1M4FTwjKwtDypkkeaEJnaNayEPk^XRRwFmG$5PMkCLERiTJVt:/n+98HMM=CkHyBkPJ6Zeqee
$Q5@>> 18T&FNQ1Z+aaLnXpdC/JLH=#iD<G4<6NR^%iiM*4MIqp8=A8C=?X*!MjGwj/9bj#TEGnbAYJl6YEhFYk
%ptdVt 5GP$j?Y#/J6ZP$5tbjb%i>jel<tGV6jAuTSPFn*wd+d5+?6MW>FiqNW!W++Gk*%ASu%/?Fi$1K\8=bnG
<CBDe% +6:l#MFiq/^lq<B*6TRmDFcCy8*>k?&e?!6/V6C6tDR5?=?!1w9#91dY:bHR5SM@%HM>R8im1BHRCi$#
m&dqQM Bn:5:+=Z:\5=\Zkml/^!BLbJ%C6MF<9!Jwy=5=bcM:eKu>Xde<nN^uYTV6Y?w+l998!XFa4Plp9MS8iV
%Yb*qi lc^HDt9?/F8yAbiLw9SYC@ZkMiR>c5p5Y=tq*eS=>*pt16p$t:p1\+^i65uH^$9YY4ZSt^KhDNWM?dC4
E5%pLN 6NwJ<bltQh889AHHH:9?#u96/T!?V/MJ5wGJS+GamDdyKydi#h>TY%$K/$*T=WNTa/%^yaRe&R:bR$RH
jT+wNS hGnMaE$@H8$:T=?wji64Dclc!tLJ%yB\qQj>^VaR*!E8bwERDa*Q*?NAHE!5*59q*nYYqSeuNq5b8!/i
%4E<Il hC*pnpC*GYQ%=M^&yGbZ^SwZ94l$*c4TTLInCdGFD8P=H6=dCn<J/TwGt9jMSNnAX!*D::RiK!=q%jjK
/BR+#! &HT$=n<cB6P4ITVY%W?>HRT9L11656>?Hhktj+SG%Y<pPWjd^FDjeILdWJl:EVPukbyin$*jG^1mYMVV
ZXX*Jm ^FDhV4X1FNEwj<^iWhluPnCAQMLu/?d5am6$!pZeJR6jb:y&icX&dH<tu=\lhu^IV&6?4XJc1XLyQ+Q<
+@b##Z &D>qENmK%Hj!iP4y!IqwLHddaHcB^NWiMjCK8BDYVpJu@l4Nqpctk!:FhpAuNIAH!i$<HbW\kpamqRKw
1pBu?c mV$VI@:X*tZCPYaMpG@k/\a\FnW8&Z56S=$:RJGpd*mEKLTASJ%hWjHYMLHSVe46ikyX6&SL:dn%nVt*
6#%=mE &Mt6d=TpSYtdK=YkB4L9XbL=u86ik91yhV&MblnuY^NGY!#@LXMnTp6EC*S@=*k</V$Qtp68ia5<pSuu
yTDNIC J/qcn@*^D%?G9^^iW^eKiwdpmX6qRTeY!m1kWX15Wmt68MT@wb!ay4FEE6:V?KR=Sk<LJ+&DdQBqq=\>
<VGthY $jhh4n^hqw?lp1<$nAG*udX#mcd5F:X+&C>#i\&$KqtFYn=RQ^Rp&M&XX8H5CK$q*&8:b6m/j8wj1qV4
lL\kdN cwcCj?Y*6?<Kha\nyYJl!whIiySFIS\aht@I/G6R<Fwq1VwycMWamabnV>eycF\QP5ipX<lm%:#XuMt9
B\CMZe $FcDm>Mc?9!6%ZGInAA<NKq?e1iaF1ZLY!GDIqbbwYaw/q*>*jke%\PG@6JeTQq*Th<blJSNAlhb9^Qt
/8ADQ@ eFpjY/X@t4@mPw?Qhn:LG?Fkk>D+GZd!KZdqZeu5?!QIyJMcbjSI@btjT6aRnFkw5qJ\MSGIE<CJA@R6
W19FXE y:DE%1LS9Fq1u@up%JJh6IS$eqWCXhdb&Cqqc$XX*%K!KHbE!tI95$ldJX=Vi=hd#wM1yeA&+pL\RAyk
?cmaH: <c*66Nu44wIXehWeHeNXP5BIey:YqES&#c+RM8J4^d+itc<5#I8qy6wlH%#KDaM$>A1qQGiX:c%W\9Le
THV%Ew 4cQijR^etydJM$6#nthi<tmy!*n*G1SR>EdTVuNYBtn#+&SnKR^e&88YX>:e:SL:c*aB@Xp>l6el=lPE
?88DTV SM9?*ue*ptBL4S!Sk^XK^$NnMZ@wCP8hVB9c4bmhBwl+jRjLT1MditB&H*J^@1NJlMPR\J\FVW!4tR5P
?d8N$& y#KT<=8DLSGi><=T!1tBdZbVYt@T*YZF<EkW:AmMnTp8Hq:Zqm+F=5dVWRh69X+Cu>W+=H+uESYF?#XK
W\VSyb k$jecejIna/a@eidqqb>n8yYC>nw\4PCw>JTTey!wR&HRTwmS#M??m?1Sh9R=6uP>F<kJLa+a8WB<C\A
@1%ipu XA<hJdL!Rqn>&6h/Icn=w1yI@jL/<Vhw8>MXDTw^pC6mi+<AcRwTVS8NZD?D>D4j9w@?MZ4?6#Qc5@:R
+q%Aba P?6cIaq*!T4Y%I/!wtJ1T%JX%yEyI+Yj*:>&9TAuJj%D$\kH:@@SylHkH?q>PX=1a\C!9RVN!9wdNQ5L
^i^jXc $J#e9&EdADqikAb!@pbnDRT?AM*P@S6hP=D#Binj/:8BZC@yNm:kd>DeL$G#@aauAiV=q>B@Je*Cj^I9
#+PGk1 %YeJe%B#iMcLpdLI<#L#M4P^59K\M*NatltbMk8d@5wM\t#EdG@&n6uX^e!b&h:I#w#b\bub!NVW&e#q
GyVMEY X^\6CXJcJWpqbphVe:w@mi@LqQP@hLQ@tHKip@Z@tNd@Sb9Q#jFTdV+u&>>y4Du?%^449>Ab@1T^@p6$
jpu1yh u:?8q@$QNNbeZJ#@X&RL!Q*@W4aAZE4!*Faw\S^j&\!lCFIq$t4bdCHP!L\lIS=EX9?%N54auyQ/aDth
<\W<hm B$^plFn4%mCP+8EP/PNAG5HwSCREZ6G!YCQ<ILKQ4AJS^?L\jPPJCeGaZ!?&mjt4XaeYt1A\HAjSJ#BS
^kBu#F i<YCkW!9WFqXH?c=Kly5YXtnIZ!HYceb#JkRqSMF&MTC/lp%FRLBA<C^K@$DF$utN!FwS&TPbYP:l*K#
<V=/@! \\CnTlBHIJq1?lEqJka>$wdipXpnpcqGR&Wq6t+ljcXiMLpdIE9=B&*6N$bmt6IT\pppPuPmRjT+Z&?S
>ERmC: TPCtNA?Ebbk*la/6FF*=y1XFqbJyG!J4?KaF8+%CHVGS!4HB*u/qaPbYYT&uQBmee\6cVayW=\RjZD<P
j6bK?G b8L4*u=4m/i1YV69#J\&NA#e9Tu*D+V*W&?8GBt84Tb+4aq=^:@Gdd&84=BP!AK4Qq5ymhln<^+hh*IV
KICw*E Tn88*&tFw!EIt*JjcKXdHy=NmTeB4*tCq\kGaheE@4dySFmmHqQ6YEpbV&NCq/BDhJ9=c@$cRit$!BtB
$dK&?I ZWnH?4VMb6LmA/+T$RSuMluKqmi&XLj!?T\X6/5wp1VIqhd4RYeDASeTFNd*i?IFP4+cGaAKnc8iI4q1
*ii<#Q 4m*8Zu+BEP1a1Q5l%lyDJIlQZncbX<H%\<t&$I^tWedWHM/:/9/9^>9EnRepIw5NuyEjNFAh$NbdqIM=
>Zb&<c ^ybZ>/=Cc6@wjD@%5bdZcna:!a?pD#I\4P@$B\ll46Yh/ek#*mhTJI9kk\*^WT=pX^TF8p@>HGTWVt&9
*&bPRP l#1ZTA1+C/LdHcC=wl/c1KXAbJAB$M+>jE==n\aJN5Md4HaRPye8\yKjmCheLhRRcet4!&DuEAA4NBN#
-ANdl$ 000b081171f001202b4 Page 72 of binaries2.zip
Ju9jTV CYE>jlGZp*@=SW5+\l!l+dlDe1Bhq#jGB9=Xy@@<XLc1Tnq#uJN8K?VTjy1Pw\lmNJ6@1A\TV1$HJFwN
cEX@wP ZLHcG1+wQ:&4$AciGGcq&8l*e518LwL8HmeM?F=a>*:DkS:8SATePqdE5TWI&58V46liC?@?h4=ZX$hQ
dQh8+^ tHF&h5#>:e!><EM#M8<nVqQ4&aGptWwj/WZGelBqp%XKINw^*Ku!E\M<ePX#SSdmLwVKC&a/p8jl#XtL
:\Ppt5 dX5bXLF*b<A?&Nyj*NH8c:^Sh@J*m=%<FTK?>NPC#AcFMS%CnP61eG<+HetT*ZE5dK=@QnFa!kn*A5Q@
NEcja\ :XB<N\Rq6i<!lJI6pw4@15!I%<?Q*/<5E8C<+<&<ccTNl%EZ\6^Wm/$bR+Tt9tHGa>5Buj!dciH9E#a5
hCB$#A FT+$mL5$N@qJ$9\#lV@QXK19+a5c=&XB1imM8SAVmNLcPYB5pTntl<cFVeqJm<MZwLLc9#&kBidA1h%n
/mh=^A AY6h$JhMA?u5mnpN\%6X:+8mE<JWmtbiq=GbiJVDC*YW8d@>+TiY<c=&BXP%cCtGLAFN^F1AZTHF/=P!
b/MXwP >kjXawQQPYHeiB@%4SYH8%$+nl+PN%XTwSmn4tY9ZlM\<6WmN%Rk+ekEb@Yc8d6adWGIqD:kMYH\&>6G
bPKT*t C5^bTh$G!QVXh^ePX&qbD/puPVaMNaSP@8VkH>G!VbYG&?!d6y%SlW^Mb/F:iNXp?SQn%mGFCSy@^HWm
H^TJ*4 &#:*jW5lp$n#$TAEy4X4/*^\:HmZ$DXtAw#?cauM^\#dj6PS#Q1W^wPylWjE/hNXKKy!*qZIP^yGSQ1E
F5yLMp :&=QPLmQjE5nH1\q^j^4@E$KBd5CV4h+<Wa!RcbuY:=PG<&wyMG%lL6SLj+y&JdK\Gd*yRbC=i5$pc*l
bWB4i> I*#6%Z5unT??kk&WBFp1/e#V5!Il/L9kCKJ\k!+GQ%9:&LSn6<p/E?wIi=MY?jF:KcwcpH+!cyJt/9h^
1PStwm 9#8+EKqMqCnD/+FV\9%P44E%%VPK5i8$EeC5qWTM%!5BFMWPi4QQ&J*tHN=l\M1MCR+IiJNWEmPCq>&S
E&a=dC B<t6:&JJP5LS\LjDkV:lSKDRAqStd4DXD/?dQ5=Mb!E\=#S!$?TTl\Sd/GduLdKEeLMd<nTl6\#K$?Qw
b5yqpK !K^cyL>J49+T!WD>#yC1I1B#DMGBWMQn$=GNuIZF#$K&WNyQu5S!ZH\d^hle^9MI?J*$Zqt9&jyPGlQ1
h6nLB& ?I?a?I$tmj^C&\ANS>JlGdHHkpM6tS6/<yVJZ=N$BYi$?<BV=$4^GM@L9##\LXMR^=CjYKpnGVaX:kCH
pP&nt$ D5i<%ePqn?Vj8!CyR><\5aWSMeB?:b5DQ&V=iVj?:TGAX8<TXbH?a/6V%>VV/n1ME6VW?#4+VjM:#y=G
yVJ^h? ?t^WLdinV?:#&Jw4SmGZ\XVh:IIp8#J#c1Wln4y*F&:M\XTC?#%QYA\$4=96PN:%E<wbNBZe>W1<PnRT
NHZ#mV X>miNY=KeSm?YGXjIKL:5GYjhwkIQcQ9^pKN%?W=&!6hdWFe=q>tME#Kiu%FCBI&JG*@ENL6%qKSY+XQ
*&jKCt >yEi?*Rn&FCYe6?:9n\?t+:a<VPBaISZ#h*lDjL%?@L*n=?%YN!8JeQCK9p%uNni8VE$#&Lu&Z@%m19q
mPCMZG G!CR!J4WZ:&?98e6uwZ9n<nNt%qdam?n6Vluwu8:#8XJ?H/l^AFHye?I^@m%>NDN+M/KJ*LyZ8:b\Bec
?jL>H1 NHlZTBJ+6/IdJ#!ePyjXV^ZaKj&^J>Xhnni$>Y#Rd\1M6WqPnl\RT96&c>iEDPPL+lqLqNm5yJJyGl?q
i/8D#K ^lY6YCh&8YwbYZ5Pi<HEQ+AF+l/R4!Wh>?\aV%k/Ay$GYcGwmJPQy!GX8M/CbSIl5XYEhn=b8Z@\u\i4
K%!+=d CE$bHLa%*FQM^##?N8EaK&hkP%iJuQ%89:mC<mlJ+TDl*I$yqlNRnjylH>euRm:aXlkPBkp/:B$e/R:I
M+m$Wi Xtw1Wp:P9nc@*%ay%LuD#F5#D=$=F4?H6G?>INhyDDaSyXJn+N#R#N9ClLlYHQL?yF^LRp$>KyiqTBiq
@9*Xd& u%1@kFtW!6NMqm8nZ+JyF@iVGTXmDdbc+a#tHuLMRHZ65Le/qEEEFBY!<Td/D18t&Tq!bLq!HQtuE/=V
#&4BuT R!H+M*4%Qa$Hl6#bW*L*tKi$YMl\m!:H<Wq+@!&tnRGpe^Zq$?>k4Aym%AQjm>Y?d#%XI1I1:>I4u\ND
nqmKkS dNqkJ#%@$NyAI/Cu\C*CH^&hwbXCqjCw\Rpldi\pK4E&lcqC:$4D&kJhT*Yah9j<@j%ben6aiujm+Yqq
RAIWp< 1kG!WRhjn>>1u4JPML5yqP6%$hY?P:Z<WwE?d<h?Fup\QAW=I#@/:qTl5pIX5WKtKYyl6yd+i>nCuD\4
*etpZ\ JKTI$!u$Y4XIF4JCy8@KNGL\k9*BR6H>8H^5RqT!m6!6tH$&E*Z+GFNnpdQuk+4=#Xq8b4BMj+F*=eA^
>+dZnE e6DYmq!yWkZ^XVF>Gt%mttW/NNKYi*Cy*DkalT#6GVT+t1TlwuX\y6^WmMZMlC!l1@^qBF&lm6DC#6mQ
Xpn8S1 &SHWTjtV!YlcJn4L4h$6M?9Z?\XK6YK##M#Bb?nnueiwt=Y?y1#8&?mNCanpl!4N\!e>&!Nw:GnWClX>
ju/XGZ VC/a!5ZYb9c<:IDL9KMNmZG>n\XKl1ip:1!NabNZcRETc#F<#EFD+WX1Bic*a=dt4ww>E?Lk!95aqH6k
XE%Y:B *CXLA=hH\qaC!8I!=THk!GHGGZWjiJGTNRa5M&*PFILQpuiJpSQK^i95?NFcW^KK6VACSc^Km\656SL<
pZGye$ W^KGXBDP#C\8<MauZIZYEMi6DedpZKduZ:u$1NyV<jkjEtJ\9nyT=cp/=m%DL=#&wejRmJiN#YXWpy6+
Y5Z#&: &!F&yBpuIX=Qnl^ZBl<dtaD19aXJ*<W^ycJGIRdJSlT4<iEmNtXHE4?ET/qiF#B&qAmFd5i^h#??CnWl
R4kD\A eabcZmkFt^L*!WG&\:BAY8!mBudCeV9@EqqGV6GyhFN%^!P8VCw8Ze6tGe@TS9!1qLttBd@iRqn^99pe
4FSb9w eI\KLX+=?y*=+FJSp4t5<WJ8:>TYFlG+<Du/l84:!XumcL9lu1PeCHQbkaN$1RQ>R>9d?<:mH\utA!eF
QtbwM/ B&iDX\/p8%A$P*une=<XS4$nYa?:i1+mHuymSLyb9#FuC!HcjPaIXR55kX?^u=TQd8?k@Maa6HY5hwPk
a%u<>5 %wqhRWQjZ&5>W!S=#kpj@wB$$VeS$!>?L5%@Rc#t8\<#aAmHSkjb>R&@R8yhQahI6cpwKnAjK$kCM\J!
hpq91X jFye+XD1ZIkydwdyalE?BE1/\RF!M4eTW^KHhA*yaq%AKWIZ5I?L!TAdK$?WFCBydchL1R9ZaKkdZ/Z^
d9h*@X q6lD^h5e9auXu4WI&9aV5yhyXcJ9yjp&M9dt+QC:G8y6=H!pcC?L!c=&bF+GF#ItM#NVdCyVXYZTM@k^
&\#w*Z D5IpT?6c%DNSi5<D>MaR\^Yp?I=FqWcp\JZ6/AJ&>CbVDW@j&pFnXebKbQMH/Y6PR<M!be8%KKqQXdQI
twZwTH CwHG>BNP#9QE<H18R6u#/PiLIn6PNwS%BWiKNt:mL6Eb&F$cba^m=5mZ^%C&%P*%!WQyB:/KN6bNNyT&
18B14E Fn<W/Ze&yNSYbKFF>#T6K*DD4?t4I*C5HcD5EQiRKBhE>m@RNawe8FbJj&TTtq/t&\R+wj?$9PwRi69V
QN<^GE an!m>JZ/#H/kq:qZ$SY%QpZt9N^CCbH&bJb$kbH&w8ku#Ql=eCpd4MKt95&JKNc&kkP>C<IpAWPqRyQG
:NSPeL HPbiF?X*NSbay>mDK?V9C8XpQCjWCatd9ClE5MhdQd=:F^^^H8Qd48>W/8j4=MpQ%h>?j9NXcT&bXS&d
N6GBKk E/KP!qLq&FSI&GJe$DS/+\BbJ+8S9BKRa#J%#MFB\e\eylB=Z+pBZ+V6CIpB9/51anGC\#LPc8\PbXkA
Bk$:Ii adW*YuQLCFW/1Hnt9151#V\mTYh?8c9A$@+DmiWhn*8KRF4+y:WW:<@#@69XM11*iIwPW5d>XFADSq/Y
?m>:Ia %%:qYM!X?>+N1A4%Y$<\tG*&$/<ap<%^nJueLh#/YPHauM>>>>&64iRX=8Z/8SEnXp/l#+MQHk%+LBVj
/SG9WM laV$p:E+^bykGi^Y!*#?K9&t6nV6T!1$Hd%ej\!F@LBBuD:1:669+4d1F+d%6qq<My9wScSLZCDtA#YN
bH>YJ< G1ca!Cpu#tAtDq+J%VnMZZIw%Cp:1mDWIJWbqB\#5S?IE!5bJ?nDR?+/nF+1i><V?pM:6bp\C/RV?wQa
S+6dpM bmwalWdm6c/Mqj4MJBXSm=\<*t%wcd<SpH$VP&uiQG5tQG$pT@?RXG@aj8EmhnHmj+!apPmD\J1QhBXn
I?XRVQ MA$H%?B9QM$JX%PG&?<AX!I4AuTTkD^:E=JGEM8JZ^%FAI861qX5ADT+mh/Ec=Am%+1DT61Z<lmVeSa4
X$ZiiK 1mqqy8RyH@RB6MIF8i>hw>h/!Qm4w^\n@1BYdYW<#/jMYKBW8SB/<DDZ*A$W/ciEcwpR/KhmMne1pQtR
mtpKXb PN=CAZtWcWcX+AT68WiNnCceMQp15WckB$E:kj$RMjdH?!Ryq:V\9SaB#WL9>R8wLP%wQ?q4apM#+t\4
!n9<yL +4%QjV*Sc:/jlwb*diq:lkbSWBCVuXuq&jyNdiG*qYAWIhmR=IjhuWT&iW<ZQ6u+J/S9:V8/9#6b5C%b
BV!W@I l1B%HIjh5IhBaa:!X<ij5JeWXHBT^l9p1XX\X+CBj/8+w^beuXFE@FduY*c>q<m?w$?wYXWIhd$yF9n8
Pu$EG: Y=DVHy>qjJlFKQSbyX^\ijI8cknt#ww46@I:Fl=yRdihG!l?&*ac^y&1Kh?b?Bntk<>XM/4Tw/e$VW4:
:t6\8p R^t^DGklR&I$y\=\ZQJ!cE%=<CtBb/wT+<HHhFDLd?eGih5ee4mWtJuyB@RXISw^:EWBb/$Ke=D:#et$
Sb<CSj 95GXK\dn51JRFFBStJ=yk>EmI/$@A^*p!MZXKjR#An:DZjwH5JPB@#F@kJQnj/ppj+q!@N<%+9?kEy\V
u\/+Fq ?E@!A*n?IQwL##<a@iZQTa1jD*n?e5D:N@\AH6a@hKnq@AM6>J?VC@\uXT:QH+ePb?Qpiktc/#i?/y#e
qCHwRq L$EDj&M*?IP$!9<It9eFcM:j/i:@IK*!H/B@p/!Y:R@TK9<Bt8N*cQcZwH@HD@mD6My@n?d+ui4?D>I1
&uL>*% @#&c@ZjT\9WTYYQ@ZZAtL1=@Cj$TYj8XViPQ$T?S6h@dc4liJG#A*%!e?$ZC^9+:NN8L88$*BnL8q\kd
1dq*9l >??Me>\9E:djZS9+L/FjIt!e9*9k*F#@Ey4:JVamhq+&IBe#?=>5SKKYbma&@&aq5nH#eGE&j#+&e*b$
1B<T8y 6uyiN@+=+^AH=@N1\eQ&J>MYJ!@HT/^Dj=%F=*?t&d!<yJ#Q\?XZEy6j4Z>J1*u@pBL!Z$4KC:8Rq+$W
ZCL\SR ?F\>pANIC8S>WYQ?Pu?P$u?$+:<$5Q&FBjLL\MdP!95HB4d@uAnu#+*ZWnT&@6ZP@&n>u%\ATFpWnP#?
DA&H&a >IYLqEZV!9T6=b?tNSayM!5L!?hN!QMC<H\ZXt>hqM!eSS*5HB*5j?%NiEmj6^?&D5/1npat#&A^M#e4
%5c\HV E#NJb!PQj#ju<RC=@=M=V$^W:R@MicAF$BpAYjm=#YaAW%@A<\i$DBAF\EL@?n#@lWYElaFFSIcHlaXH
XZ$%IC SpXCRpbCRpXDjQ/LnImGkw/BmaGPkw8Ln+?LT$FPVp=B<?<jWBeAAScRB&kGA!MHkQwAW<<X\+D>?kD?
AFLYy/ @IGEkkCHBkQA\MLBI/AC\MEkIMAl\cFlIJ:@kL8AkWPkRRKk!NDblJYlMa#Iuj\\&iN!aLB1SCm/XTa*
5I$=@I PdCN#!th@T?wSIG1<dt%Jm+>uGI$CZq%ZDl1yt>:y:bk1RQk+HH^AlQFJjL4NcdXcjE96:@*#i^etdpG
-A:8IE 0004c34735b001202b4 Page 73 of binaries2.zip
i%5W*# JSW$>M@8Zy8:BTeZNk:M:j*kq6T$iBiTW6R$PL>@\!Pqbipitq4eQLS\eE9HK/%6=SGYX6L!bjH\ny=Q
mtQ>jW S5jcM#!>6HX+/iki6A1ABCCCqkC\9&=JEBB:?Fy%+qy1L%tiSYGZRCKKM6tGM9w4JEjh$P=e8a=1MMpG
Q@An?L E5SVliidS%KcS:Y^J<CE+NF<ARk\Bi+#K:j?Q%u&FVTSCkL+AqH8G\=>4u!#4qY=d!GERIA!k^RRRAwP
BN^aw$ BFDu<QtjKYWNGX6Vtck@SXB:P*Y%5c*Rup^uZCiXL$$89nY<puFZK=:4M$mmDkKakABKZI8k!ePJ8*en
y/9@KM c+FaW*a:<XIB/iIplk$$KeTu+V+lAy$kkAcQ#+/i+HeNl@Q>=\5eDcI<SIR<Ya<>EX/CAI>ct!BAuCMI
6y=n*E MKdh&j9y#ZMnCAW9tWu8!4l9ZWbAkG8VpCj^ZlCA$^\ERQd\iTy@QuPw&Yi9jH*#K\5IMB6NewiD<nCd
e+aHZq <eC:C\Le%#!jTj=eZ*4hQ*Sl$NVSt@@G/9/l?&Ci9$KCbwJS@aVEDt5SDAhjHRZBALpD!@CGpQp:CQDk
TKN$9% !Ku+$&\hBPmn/H?4iL66*Zume\T?VNZ+tWq\D^eEGQ$Itn=h%ML?wKnRGN99>A=SBYqat4#M+WTB=6=G
wSe4Vt EkSI@8q#l=<%#*%aRjKpi\wC:Fn:/HuyXKaBI#C=a/Wy<Ppy\$i>lRl^M4kMNG^BM/e6%Wk@Gk16c58=
+$IN$9 /?/h&d@Da1%eqGAJaJXMdJT>D&ZimN=d:I5h=1YwEtGVY*RZ*%P<p:#89P&qiWnVm@EAAb=+<I5ic:?B
l15jqC AF6wY/$$D$+Nd*+IZwQb^S@4>^e>>JLeJjmCAGL/GX@5hXW!qZi8Kj\W8:K^:GGT*E1SE=j!Pu^A5+e?
9FWWyG t/9C?1>i/Y^QSd^Fwa#WT96kepR5FA6G**bXaDMNh@&X^WDjBmjFJ=9J%dLI%LKkJXXCmXGckBd#Rk@5
ntQX1\ CdeFBCllWAAB<4NP^y=\YkY9?1*Y4^IiW+<h/I=IC6/&ydc*YBR\FW^>=S#FeHEPn!:ktY+^>I=M5edu
D$RYk\ !9Pe44XG:!IM<TNu>IPuwC?l>^:B$Ln+$Z<%^u\&jHT=>j+Le@J?tFR?w\b:BRYJHLwRJN<JnQ$6*^Fh
<nRcA# aYM/4X+@a?kIajcHbCN^l?^9ki8dn$K9VGa4$X/=yRSyq^ASWk1%+W>9HG>+PZ*NN4mQAiwWhHtaZXN1
#bISPt tNNm=We6WlmIlt:nKY?PaNbPPyRHDV*T9P1XB^jHVHm\I\\q>QV#Hn^FYX#LTAkCAVdZYb@qhAeE/F4^
kuiZ:A YXV\Ae$h4Q@%V>n4Hn=c&tc/aXRh:IM+SW:+LX6Ka&4p$pTh65VNV48QNP1%E%V%u+!b#c>%wK^nlKS$
MJCt4j R+5b*T4ej6b+9GXaV5%DQ*1H^8hb@k4dpFiGD^$?SW*R@DNdXnauB9*+WpP*pYMC4y<Stqlt\hZR:wn:
t&hulX e5lTV8HGXi<SCTLFh=1H9Q9>B/PEJ:qKTT<RAARkSFJ>Yu\HAq#AZ8nnQQE5Xj$p8jh6@BLW4m^4bW<y
>%jKa% :mtS8ANY%CQkYH5#E9GlyPElSSEh5qHLJEmpq4M<BtmQF$FZp8RHST9?P9:PK!D@ZqQY^5uJkZMla!an
ZbRQmj 9cZ<IE=1^9YXtE@a^XjR@MF>W\LyHI6bT=bTT#VeI^uVS*F5L4SBTu&S:=BljMGaSX@Stl+/y=leIYhI
T&yqVI Q?$c5JRBye!5+bnW+:TLle*M4Nt9#k5ed?Tt:K=PtRjq4QWRCN#6NK\\5a*kaZ8JQ%9yaX*L94uy<#qH
QnD/8C iPV+wDL@iEH!AA+C!K&4NaAAZ5?nDNA=#V*L=LPP>9\IYK:G@5tVRSPuJQ>5nRkCa@mT8^ZKJpwS%%d!
@wGaXJ tIDZZ</H=4NAkG&@Wy>q=8iSTWdM<D^qE@^=!5bibQRVLenqhH<$1IiMG5#u>#wuKln49&:X%%%EpbBJ
ElXCWW *HeeuwG5*KA4WmS<Y/eu4Kk^B>#BDX>y*JTpjw#8Mpaw!X6F\I!GdlW<<*Q4j?yKeh%<mEV&iX+GFC8Z
XjI5$Q B6?wCiQ6DEPtKARt$qj$AR$dV@mM\$4#G&9ZSVFXhaZ/1bIbWtKlhb^JIM*41&^dZNWDj6/c^FR^c/In
+nNkCK A>X<\t5i?KW?9+@q?&nd&1eEG^uZl&<$VB5$pwd4DHe?RMG5TCGnY5tEhV!?^%P^#h^?XLndje9n#D@A
FN#Y?+ qS>85!HeF%!BF#N*bRJLibYcERctYeTPm*6W4#\$u:%!GpG%E!>/HhRaM+YIY6QmJEFJC\p$DI>ubb9d
RTLV@n ItRAu%N+uZyhYHaywPq:%eG5Bm^Tkn6k8#!1/jyGYCMYlahA^5$m#qSN>bpQVL>5k1l%V%::#R\CPAV1
e1wwNk Luu>bRtJiY+WKqWIb&uWDVEF+=E%BZ81MT#tK@tS<JKwRpVBh<$dphaC5EjI9A*IdGtjeFXaT$jH*k=n
yl*6&F <u8cyFBm*kb^H:mAyk/V:$e%:hCZSRp@jj/Ak#HTjdn/bt4L?/uF!jym:PDiTi!Dy/ja!lAENqB>VdD?
@CMV6A QZL>imFeW*N#c<^5W:%phD*ThR4YDXbMDpHAmpPMl#*y^n!&pdEXSYm6Hki1tY8aInHDc48naGwICjP^
YMPMGG DF^8L/tTNQB^/lMIIQCmmV6w#6Q:5=F6e1#?aty85emQ!?Re+*W$DD@>B:d+=cN=q*9F><d#&EjTW68b
$qA#KC y8KJYD6m:+VC@Yy?XnN/au&6RP>u#nyiTNWYGZRcR=TthH^iP&X&9PF\9jRqS:AcJ%lPTYcc8PC*LFwR
G#SNS# DVNDp+ZWF=^dZwt?Qe\CVS>!QSuM&GGdN6n\aG<1W/GJP!jB$uccH!nh^4X<T&JJ4myWXHAw@wJZdGyy
MmaEG% L%QNRPmqLV<Lt$>Ze%/q%=dFjIRVJ+:XZY5clE%dknReG#y<\E5%ahIjm/b/Q<:*XZmYpTA#Q>ty/S9*
+aQ&?I XcZY$$?@&Ih*pm/HLK6?PbhSa/%JIWjl?j/TCLXI9PH+1%j=pZSV\bt5Myd+=b:94cTbTle:Z!8Z/96@
?%BawM pGDiVt*dq&B$1+RlXt%SX%e&=RqTN<KcJ$X@W$/:i>&lK*&BBAIaMLn5ql$*9e5/w5yQ59BtZet&\yI#
YTEBuC CyW6kNtpJEGXh$+b$h!5JI4/GPQ&KYqEFt5tcM=ZKa$=+$:m:5%tSNhW>Z&5qT>/HNaRI/T#ENl#>#%J
e%w9YD j@#AiS#iqHJNdT@*R?!iZbj616Kd6wA1Z?P=>DaCR$Zlil$>aARuiX:/QcAt&n%hMnLW*4%M>5h6$X^#
Fuk\Hc ?HRBB&ntkPdL>^wJ<6F/G*\K^:bhKT%yalBA6+SiKIh@At\CpcN^?91aS\#:B65G@VHJ$y++IF6>**pG
1I^tJh w9w\@FX!t/P^dFtEK9\IbmY=9:w#ib^bdy%eq&bMMMYj>kSj@&%QEH**N/LF<8?mqaDkuy5<6TIXjlXF
?6uR=1 N\TlGPm?TX!\<@PD<nZ8td&i>yEmbu^ZppyHI9q!PK5%RE*#bK=n&Snm<99I5TN#WtY!9VK9c&bmeykM
>@TanY @EZlKF#^+Ra$HWue&>VKmt@^Y!j/T+Pa4F?QYEln5c=/pRpN@AC*j56:%k6iaWZhL6eLqSc/\c&/Ld1^
BYw*y& >Fiyi4m*4KVRynwQnaZTTA%%dPbBeQ#^ctybdaKk&Z>5Mpb^ZHK6!*jY9a\ZGk*Dcl6hWTw&pXIikwk>
TVHVJ6 D48@>*twWZ#iYPPRZE6!X^YBACPaIMCXu^MIwPdm?X<Z9984Ry@jARXBe!h8l$c81Pt+TntMubl/8P^5
#iaNj6 EqD//u/I5C9Guj@KP5FiD\J+pIIApXakABy8l+b6?/I&cQ/$ye=W</9C=MF>Rl/Y&bSD1BtRa49lRMKn
a86TNw ?5%/QM^e+jNPPP4Sch4AwQYdK!6FHl!B\!Ci*Z599<mdiGn/aX/bI<\AhWNS@BpWSMmqm9NQG4w6^aw>
n\94>X 4!T#L++Y<9u/RRB1nhd$#=LjCP+*a1c+^=ydM=+p8K?@+CSp#*Im9XNMKp4XqZTBi<e<A*RXEFi+P&Vm
Q8MNR% @=pGA8\^j*@KLZl?y#yhWN:L8yQpXL\LVupmh&ddB\F8N/!#jw\<d?FDJeMQ5m+Gbu$YRIAb1EaT/#HH
dNAQF\ nniKbS!MBZbhylcmdcTe:u/8d>Bl=KK5ZD^1^E@#wY*CnPLHW\RmKK94Sw:dwc?1JVeHm1X#8t@e5qIn
QEjTq1 aQn6SMb&4^ZQNFkbMD!qPkpK/D5JMn<*nTTVnE4K#kj9jaE9IyBcjE*nc5y+=M&KNeP1ILu=tQ%i=9VS
%+@myV wc#@P6##AYi&TPE6ai9:4Sd6P6DpcW56*j:Z&/&n4B>jPpCA5KZ>6IRKL@/H!$<GDK4!VVT>AIE156iy
nj6RWD C?>I$X$RbJPXYR4hE&VmGltMm9Vj4ADhnq/nZcn=KT!!VZuXIMwjGYSy6>GewG\=P?R5q?5EyYDBq\GF
qTpGNG \KyJeMhdmu^eBB@/%*^t%Jw=BJ@jj=/iu&?mm^wIpG4q5$XDRi\DApSDq+AA6t*QuSjwZlu^9J8#$*!M
Nd@j?@ iSVTNS&ij6\JiGI4ilA#6XH?@4wBj$Y<$A4eJ9XMb+u!ZZ!:54tQ>9TWe9<nYl>D9Klt+$H9*n4:cHV9
<ypu8Q <D8T6qL&mNAnc6m#!RiyBpAR+X#il%J^SL<G8pAE^<c1^@t!A%anMkeFVVdXKF+N6wqQu@uW5L/tXlpY
QScqu8 IdHMm/ItKlIPVqJ&FqIkV\d9446C4D5F#?FM4w6h=kb6MqauqRm86km>@%AA%9ESR*qDpPR+Gbbj!b6u
!J=9Ta =jpN1Xq$V>c>e4PqMe%DpnuD9dI6QIC1K6mJTjiL^8V!&P6Q*+=I>&yi+cJ!p^K*RLeGjpGER/&\9qS/
n:!$/! h\A#GZ/Id#Q!61a/G:#KwBibSV>dWFNM9Rt/QjXMeZM#CJ5>%PG#8:RGnNFmT1ji+b#dby+t^KaljJbJ
qplw+c B@:lEI=!*jQItjVyG*BF?p<m&y*/u?ZVBVTV?q<5\VaXMpkp+9wTt<STPhHM$1mIP!%TZWw!<&+ZQT$Q
JLq@aZ l\:RPWkBXnettV&/<t#1Y<FC:5%da%<\\*qJLH#AwZR>ntXcGl8dbY$t:LY!A=eVGC&tMcyKm*Xn1Qm>
WeEnXq ak\XeJG5l@i/Ybbw4q/^XGAb?+54wDe6Tqy#u+Y8P*nZI#u5IYEj#:Dy41IS*H5FP1M86<IweP:pD<4<
EJA4G$ nCRw%D>ML:in1ue8RmcMN=Ccic8N%j!y%EM%SWT+EQt?w8tT=JamY6aTK+A?XtLnpwap+*qGQYyhZ$y+
XS%YeK Y4#J8uTiJ+XPZM<ih=<:q!=bp!y8^^ayLadBj??$VPCW*#=KFaYCYt<eHQZanFSQX&qcpaHK$Q>JB^#Z
F\P5== dj9S1jHiSEjtRy<%4p^yR\u?h1yFaQKwpc%uqGkLkN+=<qM\tND1=^F&%pW/!&*/98^$b$9Yp@E*\TN/
>w&GkK Qd\k+9>T^n%Ae?u@iY1RwY/8cb\!VqDi5p5nC$8KHeI4wCP$/ldFbn\BaB::Dcb=jab$LG/QyuSlXB45
WN:N#T V=^dRFEHh*4?BdQIF#jR&@E!Z/t*X!taXl55WDqPBIyJYB&kLKtaE6yhWu!auyt9!TcnM/WkS$P9DABZ
65B9cb >#cw>Y8CSpSS8K8w9Fw$&4j^$pFXF+/p\S<lC:MTj!!C%B\phLDFLLc=WVp\W^L^X>iN<B=Wj!Yy9A=%
M$ZHXB D@PpR@W#+eq1pJKT>ZX:qEIjE<wK&%%%q5=QFb@q%>?jFHV&RjNEZ9%&ylVNkMeN\8BqAjpTQX4!TAlj
%E=?6M FJejuaSw4+dycG8XTNeCZc9C99tT#^yj\?j:jZVR+ISy/k\G#DC#IE:l19mFMq$+NJ@A/MZiYX@1lkVn
VD$Nm/ 4WhPD1^MF*FmKpuG/H^M6X1@tKn@Ji5kRF@\&<?@Fjc@u+\:@/QHjWAVJ!T1nb*Vlp%6mm4p%b@y%WJm
-AT1\4 000308bb2dc001202b4 Page 74 of binaries2.zip
^aS?MD IpPQlwWS!:Q>?jj$PcRdXWu4@XtV*GJ#\X<VW!$PXdlj$+AN+mTSbe^GcyW*EiKmGyjB#uVnCS9+1SWZ
%^ZjbW hVBBNedbRLJbDc#B^44ElCJ?!knV$\#:CbMa/KDRVMSa*%c<Hd%&6NCQD+m\H!@4@qV&S5bIja?4e9a\
@6BDNh iWpn#h&5GcQ4Kh8IwY?1PK<P?8uMECjB8aL9p\ENhMGMRi+!%YNJ!yb/1Q*P+I@?X#wQ4<:qnF*/H!$#
NFyZKL ac6/wywyc9ce=BaWK#/WCJ=tQa>9GmcZV*4m^<KWRlP%5Tl?y<>*P?p9Zey\NBt44eFHPR+\EMNRHh^c
6l94/Z Q8#>WtHewlbQG9<&?<NEhN5$HuRIw1&bm<a4NZmYIiNc*c=RyiKFYc8d/FV5:1CPB8QqcIYLb=qPLLw*
*!$i?j BREWupW/1PnBQPcJt1QAcu*qK\nA>m:4Gw5b5TeGCAIM<=d/nAI:L#DmakSBkEGIb%!nQkn\ICKkKjcM
=qLwFJ =Cy:Gu#Kb1w%5*1/FAaBeKij!DqAW!e*dyN4T%<6/M!m6:mDqnn/i=4ybcwQ*m%5IlK4ZW:GBcCWn+1K
aNjL:A p%ybTyh@Jc@6:eJ@6L9#F:S^/6m4PW#?wZG8e*lEFw*YR^5bmWt4@jw45\@PkL!X/nyC^uDnJTa*Y6kn
?9>@dl 6*c5NG98WCHHEFRkWl>>@RFkAXGDlIWSqcuhPB^M\$F*!/!WXiN%m9nXZNcTW>GIW&8>M\9Q^!dc!N+\
4b?TWD ^F#YB6Vk*CDM>YLIGd@k^ql=G$T8Ep\dSNwcKp4KIQE64k%?SLRM8P81By4H8t?CP:8XRnaja>+$e1YQ
=iThZq uhDVTTMWF=ujN9:<DywP8:Qju9Hd48B^EQ$Yn/K#lMZp8KqbW$#\!CQ6WYtXjTE6LLk@5cGLpD#u?q:1
V5MmDa 6B<dG4$>wKnHJj>\@YK!RjDm4e<FY!cD\6Pi#%%EP\lRZPJwn8qS>KR<y9ypXQA5/l<nj#@JJ#Aw*5Tn
uiGA!S *A=pZcD=ZYjANd#m5!F+H%Q/lSPt11>FCbi4&$ARljB=\/:mATGV999N6Q$#n5wab%@<IK9EQ8>6plaL
Jkbh!9 y#1A*uib6pC1q!IZ+RP9LbNy5kL4w=dMA:=T^<jmTy&+!=!WA16N?ZMkQ6X8i\ZjtPM+kkCdCl8t:Rh<
be9b<R iybTKiGDyP$*6Xbuwm#JDyB\KFXpt@C>:ewZ6%4wRl##Ec18qA>9WE@n%iQNqDw%EmjAXFTd^8W<bepM
9uPtY! ph4DWVREcF@9<#\<m@4n9+8/M$TeI6iBwL=!<ZKBibRXi*S=RM=NwRlbT*y*kMlwWaGpCMypFtl&H*&>
YJI4y+ jVQA9??G<=59XPieGT^1Y+J+hkuqD+CF=PX?TwJp!G#K+&GT6?Cq<GQ/Vyd<Q!*e+u<5*G^iXN?bpq5?
B9y+X\ FJZ#RT%y4+alAPQbqFTu+>^uXWS@LCw1LILtn8KYnmc$SJn6Q?68ppC\M@Bw<<n*D$F5FZFCutMXKPyA
FmM!c/ p5ZwBJ&c+wlQtqN9LW/=kaMVPpq@iK%\4QbVlpE^W*byeI#?iFCF\/<L#%S:Y^A8TSyNHAhybtB=jk5T
b<P*mB 9=K&?1=W5C!^NTyTF1YaEwhy1C!Aui&KG#p:htcHaVBdIPb6W*M+XQl%=n:NXu^<dR&FY>uAS*y4>!8m
HMEki1 KFb9Y=w=PYQDiKpc8QLKZMuaC\QdH*$5LI=F=IK=mk?NPn=Dt^qZ\wIZh<?4HpW\=1wHnt!dY>^i9ab>
YjwFqE AR%Ae!AA4Gt*Mh=Khkk:$<1^:ZHnibWA%q/cJZ<WZSw#y!^AnGI%@#uW9b:#QKppL!9iEdLb9KLKcjP*
:Ain$l cK@jJA\>qR+S/91$!DP%c6waL<ay#Y!@TqCn$bKWFFID*e\QL#ANA6D8Qc?54FQQ/+GClMDjKAM@RHPu
KhT1d^ !M#pS119=Baj16nc?S:HS>Gj&65FtuMH&#nGnYC&i$B$wZyDG/4>+P!?$=adD6ejWqjYwMpG8D=9:+?W
D&NB:F QHLunkS%q5dQyMJ!t/Zt&5CSKJN$AqHFJWZDjWI^u4Tau\=<nl4b*:A9/@bNK%1=aCyHK%Le\=jCPI?>
>/H/Yp k8d^CGaH\?a&JiwGJ:t9TF<jbX96ceL?kiPAMS>^ERklwyFdl>T+eNQ9I>j$1F9=hCB+%PE\#RRCcB^*
StNNtX 61LeX&XenjnM6u+:C*k1&*6pZ:?&d@8bDRKW*uZ?L$@jB$$i9!uWjc1a>*qLe9&G?#AbBCl#ZX?FihRe
VjQl=6 8#j4QFy>h@M5q?4j9hMe:y9$H!h<b4*AK6c?Fq9i#HHh8<=ZPCEMp4AI5XC4RCtYP!a<C@>F%/#kce4#
S?&Y?# Lka%B5bD>ZH*iS5VYj&<plJXE5nW>9K$?TF?nP%%Rpe6Q*muWlB1IDXdIE?4IHd/pJa:cN9+*cw%MSKN
B6jbHa k4t8!!>RpVBWG@9aV!AZ$T*uXc8TZYhK@Z9J8I4/VHF55=bw1el#cV#bDtnVVccSeA#<8HB6!=/=+Y&y
4+P61p /wbQW<PZY9Lh#ba^BP=&t@XZFFeFTct684/!1mY9F:nXy>e5#>Al#eQQ5Q*jSp#9=biI^&FdT$mymlA5
&5X^t# >/TBy9l>!K!ekiljm6a>1?5+&B8cEe5HSHGlD=IIw<TSJKPe#8<\yKMutWkWbmnX\\^hn4y!b5%\TQA4
bQY$+5 JqS@n6*e9T%A14mTdJJNBS:4Swl/1Tp/<a8+$+Ll=wS4p/TR%QJy>qJPmlPmWcIYT?Wy^YXnk1pykX*m
@jKN#L u4TZL>cbn&YByw@V/5!H59:/%ShukGt*Kh*K4l#9%DmTye4cLN/A/$JcqKa<<cecCVKBuyYPtI1VQ6>M
#VYkF< 8Kc:c6>Q+#h=X%u*nW5k\FDmW%1u=KHk6h*#t*ae*TN4k5dM&\@$F?ZLpw%^T\lYlk#\u^TBCiZl*eKG
6Z1h+/ YKVF\PPcI*wmq9qnXN&98!PYu#SC&i6JYbF@TP$F?bn1%#!@iweSjDjcdY=kpl&b&:1JF:9+*Nw>t5Ht
I>LGwI QNanBH?SpjnlZiG1$FjRDP@ey*tyaD\C8ip%ceQtPHJW@/<CqtdlyK?^qa:!uZN8G^>#@Hcc$$\#Xah4
&$==4m c98tjNe%HEIq96M!uD6<WYGut$>ibb8Wy+\Zwd!5yXTS1&tQ5Q1TJEYR/CMV5LXc%wDe6/XmIH8RJ:#L
6K$!eG /THj?wYeM/MaI:Z!a^?CBBh/Q@#<R?8Qjw9pI+c$VYK%wDl1NqH!:mGi^$QN$mLSduyQbC*tebd!yXY=
1S:C\d J#%@P1M+mnBmRH6mA&W5nJIY?aMcmW%&X:ImVhuB8wedcdCX5Y/e/SXER1kHPRW^Q>PdAySG189585Nn
*SNL6< :yTNN\dp$*&VplB\\1b$QYy^/$:m&+y:NGGLCG/#bw*Vh*h8tJuydK=phX8+YQZ5Gq\m1nFX4FYpDCTj
G!15Wk Yd$@y1A9LI!>#>ah8B!1Z8&eYW=HES5%9\K@*D=Cpc%/E%G+EL<mS!V&TV&TL5YQjDaGc^@\C5PdkiKV
Xqec5Q QpH$kqPB69A:i@QPmawK*Wq@JWRy&HmyP%p$Dc#Hbi>=#?uTn/Db%KiaKb?nbS5RkF#%*9!SJB<EtG&e
HJaIVI j^I48l4+aqVA/M\#dWeji5aA:/4P!G>1w>IT:MBmI\!<bhKSJ:>i*K/@d$PtD@D%MVAR?u:a>*d5cjja
88V%@C VkH#K1hwVqDeE\R\<5u\TZJYYC@piq/+W1d9GRabHph>qkcjh4W:X\aj!**P%NN<=JS<BmWQH4HpPt@a
T</RY* RAAdqy>J=mCAC<tQYlCkSeQlL:>bkPbTu*?I?cu65%LG@jQ=8CHqednP=:@yF=Vy=\5ikkDY=XX@8mLJ
ip@Kp+ 4!9Py@+/WR5EYCuDa#tMSu1/8SJ$8NIp#u^5h/b:h!>:yXF&jQ</b1dw?lZL=I4:^j4<jhP*D@Rj1lT*
:Nld/J #6eFRa6@/LDK<\ipca=jZp@@L<#uj*?a#:F@IM\up^VG#mtqa4X^HQ?lqHWChHeQF#&4Ekh5JhT\b&/@
9EHnHV $AppdHe\HCM/FH5QAn6lEAVy$CbWCaMlS*N*1PX+m:^ZL%5$$p+4ZlCE?!G19JGw$nm!*JAV8&!P&DT#
d^ayNW dC@lPCae5>wCPSRHeA$XleL>tC?w49%yW4dmjabA!%qiPSRVwyh6E\ZeCH\:JTLAtKD$5NpYL:<:Zy^e
Hh\5I< CCEjEpiG4S/?j\/L5HAEkR&CC^P=kpAVC+lpT<#NK>!86TtLVZt&Mypn6IA=AqH<BVyaYGl+t$MX6\hX
DG>At+ up#8G:it*La!<@n*W8D+e6*u&BYFTeMn*5ktDtFdcFWmCBPqBNb9DQYN9py<*Ip8Ye:!PjL9^Nj>wGDH
wMtCy6 PFK$^qCkNaB*$wb#4D1W9E48I^an8B6KZK6=TItaWJ9!F!ID+JtHdQZ!EBuYLceAjV!XVjjmqtqdZG5C
M@wT5R W4pJQZ^ww%FdeuaXL!T/IQB6jD\w<8!b+#dtqiS9kqJd>y@c^:Z$M&9k<XhT?aZB#hP4yDbMCY\5%/1#
PNh6KG SpwXt1>yT%>H@+RZ+VNGlbQXtmu<\kk+<!9^6^Smmmk%HE1h!cC%^cQjLN$uH:!tX^&\5WqhCIT*RS</
YcGBee 1RB4&%bRA#:!K:Me1akSRMN&tiQQPnPeFKy9?y1&HI^YX#FAXdkZYEPB8!FPKAqaiFKEcHETyd?ctXyw
ZyQWCn km+LhcnWmLT$d+BQy+\etHZN\GQV&JS$^N&8cD+aZSndjwP1=4w6!aWIAt1LQTS6CJ5LV@eNG59%%mXb
p#A8AB N&8:@pn^k>mG1pyKbHJ6:eXqPQTX^iNlNFHK\GG*=T#J8cHyV\=RNTTFI$NLKlS*i$V%yJiQ=a!yTd^!
G4?dDY nn!?jXQim5pE4HbK4Au*!N:hn/69nZ<DF8Nb\1aFAXPdTJT\?5de!yZ<FlI^\hnc8@w6d^F5HJ#e%ICK
A/wCki R#=*8bAP+1c^9qc*$&J>j?ud!Bp<FVlQ8uJ#GAAT9wuwq:eVakip5CR#anwntJk\qLeYFD4:$ei%6EXB
I8@/Le dpRWK@be1Kua?J#:iJ5E^^>p^LEqEuLVe*95NG9bLByuc1&XQMw%S*l^?nnXTTJ*R9ua/i:TiYBV6Gdi
Laal+8 cwjX5uYuEabVEldHu!NL>KJmawGyCZuGYPu$=6EtWY!PGBbAw^jTKnRcZyIHnlmA+WP+n@mBV<8YSG+K
Qq&l<# Hbb&nk=*e:I:taAD^nnu!LI=+cLei\\*Yk4#1JNb@G$yYmVb<NIbAuLp&C9i^c/Md/yR!N5Ta8WiI1?%
kjA+E% 4Xl?FX?T@e/ER!/p\X9+&aW1IBBSw=RaCQM/lH?wkm%KnCY5*N>N1TY+ilLSljPKFA?NhGMa/&kAWYLX
4/1pV^ alL1y&!!5VqR&nlG\qQmyD89M:q+FIww?M^6@PkXJGAG9:X\^pQ/y+:h1Z6Kp>9ALAEDQ\ZWcpP9hcJT
TEIeay 1KmVikFdc=QdyXDGwwLDPBk/D#eCWE<$96l\IbPat^V^YJY@In>5^LiIHV\CD+/jPY1TD/hLIS=JFQ1w
%iX6eP aK=$46AE#F<l?$8D5Xm4R6kC8@PdGjh6FmWqbFVVS6e>$lKNGYw9XII=V>L84$Ad%Kl!9VY=P1VFRT&?
84#Td^ IeRb8%y/66BBuwYc?X&eGP^KGmcqZX5CQ9jMPKIuqyH*jGM/QdKaqSJ/HnS5AjqELT4MB>LRhHcuW!Db
pYX6bD MCN#QaImWtb&>BbAV61I<WTWkVdd/+KyWFS8hQulTW$PK>==T4jd?QIhAYnA&JJ5L*:5mbdcB>S&%k4i
jjTl4d Bh9wD<uK58u&W^/L/Np!Yq/YA6#yaR8EphjJ8uY%kPCjDLS1Kpm!<P^54FbD<K4+TWZlbq@nLER?qG*q
/6F:ap WX\a=:T^J*&kZ:*#QM5jpm%1Xb?8<aKCdbYFAa#\KJ6nKF#Ry&84DRTqYCwlGTWKDED6l/WIPY1j!KmV
MIuHJp #ndEy=#w?NG6SSSEnCnCt:^&E=1piYZSGQ96i>*::C>y^XQFpenYA\ZNtTdR*ANYyIhj9c6!4w&=pKlN
-AnIQA 0009b3f376b001202b4 Page 75 of binaries2.zip
8l<H%k uZK>Y*a\Lip+yPjaQtX!+EqRe&md1JyPbbTDI$y!SlYmGdY+T%!\RJ?99a&mnk\w$VG^KtG?%&bmlweF
$%?+Yu nw5XqFbGiacIn1TIFp+5A%#JdYhXiHbGtjD!CknVpFw=qBlY^lDyNnYl^/5H>\1PM%TC\Mhb*6ILEpuV
5WZCq9 1\Knb!M$IjD9ClC8Q<u!TpjyW@in6B^/#mICt*T4LSc68/EaG1X*qlWP?N8M?DE=4@VbnkIZ!aV6p^Ey
LSw89V yZlQ4=bAe\4HVbm6A\eSuP@bJnPaiT6>>k:iI%hhI4@Q\RWG8/FSaH=KFw/j\B=4+$nH9F8qpZwk\K^h
48WKNm 6C!ZeCVDmh$G:qlFCKu5&DHiSCt8mR5^+he8<+BBPa5t<iSuJqP=tGE:%\tQCF64He*H?aAn$N85>ydJ
1VBS^! Ww>w:%G+Y=A:t@lKt/BRhZ#/lASBjMwqNS9M9GhZ^T4lIdW1$hBek%TZR\q>Nl%Dlbuy+%e*W&PcRX1l
!etA*P kZ%9cbYbS%9NjajXQM\/tlh&n8D+?94lI?wH88ntMG!6e?ZiFPkj6TweR<Ep<4%?pP4=9M<:!W\@Kh9C
E^Lelt :htjcaFuYayT18>KV+8B<$Xn8\yN8ZcZ:*iY:\HKuY49p1/!YChwS<\\69C!DSD#LPp?FDVAR%&GCK!S
uVmhLq p5DDGA8w\H@QtGY8$Pm@u#Rd=V^B8bHch5:eKXhEEq!bTDjJ%uNapYC8dS#jWnES<k+R/uE+TpPYRwyF
QSAwY/ QI+aNV@#6S6@wpWB6/RP65!HF:L!61LAl/bP6#4!6Ccj5:aPLIKiE9D*w4BbimZSWhJnYRy8H\a>aSNi
dVem4N ?pC?b\<iPWnjcp9jARuj+=A6=LChZF+E/>ln@LaMQA^/leKCqMGCHlI%Da4?1QLw<qWBK?!kkAXFi@@Y
6IuIym RXWI4l&WP4!+BDPqt?Dl8S6+@u54N&GlQ!WTK$VpCAtjkD94n&&t:Gtu/QG6kTq<mQc9RScTka%hDmNh
RN41AD pBG=QC!<&W$Q/?Z^5q6IMB6IqdY5la4MQ/leFW@@MyShP@Iy+yAdHR/@hmR%Myw!Rd4%yPlImSWc%1/%
V%DX!u pW$mTl^!qQHKt:bR#9aw:IIH68<N&wkiWpGkX1<hNtT#%wm9uNN4p\9M%Mq\d6lwn4l+ld\$#MP#<D%9
k9mHtq Fu?^+H%eGN1*=?Z8>WPin*T?!M^4tlW:I&d*Yq@TJ$9kQ+ty!XqNyJwIIePCC%jMyAM&$m@YM8BCh$=^
Eh+wyP MPLtQpAS=mJ=R1MFF$\I8e56/IbX46ike5SNDE<cR\H/ELNHFXBKS+d&YlkSPiL=Sttt95ANpq6XEVpD
M6/Scl n8Lb!J*t$udLj?cmymDXwV1Bc<Dk9m@1YAuEB<LqK+?b!<It^nE\4q//WEIT>:JbJ+8@qdNq=LRmLLDE
$lAmju =c:/hBX=FEAF:y$9pFEBia1i4XpWuacI&Cm1WXNl*<48bqnGGFD?JPj5ZdC#MA5=APW4VJP6JLINFKq5
BVL16E ni9@wYq/K*!pI^>@L?/:N!Q/kYW:jjk\nwuF8&Ac95mM8Ymky^k<9%kEcAj?GW1mDwa?FW!mm%4JlF*p
4euBy$ Fj=*S46aHX44BmSTableKJl#j+Q1+QIRKNmnCZ/qSEy^mZN!edm>FR5WGCB11a9MXZ?@\ACMKCJqAyi9
WwF+9k I@&8kH1CuB8D%GAyiAMpFkcCQ+?wkdl+1c@atSEGbwQWJ\Wph\W&Ht?whPV!ebYL<1^5e=jJewQCAFRE
WJP<1= %IiSS+Jn:CJY/QF5S$FjJXk4L1TaH/ede?KXc:!$XiD\Ht\D?h9p&S4kay\m<SZ?$HZ\D$:Gml#k9S\m
X#F%JA Jn#pB%GSB?iPBeK$ZyStCqCnqwmt+XAd<Wm=ZLC?/>!@!hDD\@E@EId8L&:89!4/=hQ?b%@+j=mj^@NQ
89WA<? <9Qa&hn@ny@H#5d&D@H#&Fu@uLcHubZ#L\hej#uk@55B#%<#>9=CBQk:m5EjEF6+kC?N65jD>RI$J@h9
lWVKw# I6:^eL<EDj\N>+!H=!Xw>6?liX?ABuL@lw4E!@wT>P<m@jG!9RVN<V5$?\9RHL!@IVL^e4\A#e:>G>+d
BE<6Hq L@AqcI:jyMZljat55dQ>D9$TYj56=+/Z?^?u9LD>P?ZqYR:?Ruq=um@?mQCC>L>m9HB\eHL<n#JiqAGq
McXanZ @%e#ZlD?k@GTjQkpi8t/q&Zl+b1uK?9p=IA+QZ!5+WEbyd<c=buM&T%+YjpRA\JwMCniwy!PkRD$^$Mk
59ZJeS \LX^QRnk?:T!@4iF*@/B\9cZI@@#NWEVGV:DdbiCn%wXkl8CVh\QbXWWIMB5?QRV^E?Z9!uy@QeTy+1:
X<?TXX >#61K6>!himL1XI4ABAq%M%cZy%*cq#*RTEQaMPQaHj1IAAnN5p=W5aX#K:tR:WYCNDF=VBBp9Vt565E
MbDl8b BAA59J+jYp?b4\+:Bd/u!/YM6t#AIlJi==E<PEc=M+>=WqE5ja^:HQ^=@KlwC=w<9Ph?eKyj9\65AkET
e$\j!$ yPQ1Kt\$d8aWud>iI*#JCic%RmD#pN1JymDejlMi&uetDJ&FRm&>=<BDwL*ZhLtNb^T%A:6Val!BECS?
eC5HR6 %N@TDFHX8>%I!FXYIX#\>b%HaXKddB\t%<Sq%pep<11!u:Fn6in!RwjVCB&h?/quc/1Fpp!^<Tj=Z65w
\uiXjP l@Sme+W=*TWPT1w^95CjYlYje9bqM=bbK1!WhdV^CuRd$jP!^Pm85tKalY1K=Aih+mMZ/<!@k1aPuA/Y
+L@cp> NQK4ZH$55Ed*4CbG/KH6/aClEcwL6ABV5@49nLES<6D>^?/GdW$&=6hp9u1\jWEnyb?WGL/MQC4*#cQZ
LBpTN@ VX@DGYw#Q%SaaFdau>YER6<k&Npiw#$idqV\n:jHtBF#W9MSJ>t<h?H5KM6i$9X$P^<6MGV+5yN?SA$S
M#E=QL b>e5Ekt#SNl$*p$Pc:5>X%/lJG/H?YQ6I%$6C^8iQWYDwl=Y$b&DWQN$iXGYjFP<qX&&B/ZqVB&HSEF1
Tl&:qh 84%$%>JcWP/CN6\yMEJpV&9dk*l>Xm9QDj/!*muJHF+A%*%VM5q&c<+m$#YGTj5\DB</G6995/S=EW6W
:1Cy:& eZ*E!cihd?e^DZRkAQ!h\%PFS8equW<lykiYCHWF9t*etqVwb@<!>tITW5A+FRkRyiEDt9:4b^^Spbu:
=bSB+^ =ckeLa#B\AmV$<6GVyjL>yh>KEMRNHQpaAVS^tPX^?nB*m5\TWhV5wqSPuP#VHDQS*J#Qj>I6jI5yZ44
K=H:la iVpkkI??#=V?%$j%5d<11m9T8Wj9qmA*Sw\?t=LTWw*Amc$nBtJYaqiqtEiJPXp*^R%p$$5p!JTYe5GZ
*k6F@V %kIASMF9DlC!:69j?A#hhS+XPp#kCF/:h+AAeh>@$ec!tZ&PLn/AABS:IEByK4j5XMXXed/WLQ@wuuT?
lqwKh* m+d=1*GQESAA9^\$?>e*/L@#Nk^jYw9TEwG@BkDkyp!abykLthcYK!b*?tJc9KEb=1*Z1lyc+h^Sb+td
jN8=/L $^4ICtR+alItdNN<CLklhJluhAh&/kbM1$4+KL9:T<6k9NqVii&iN?bAEBn9HnhGY:=BhC\jM:Sq>>/\
yZeq:4 &NStCB^1V&5+G\1yN<qtPuu&a8S>G&&clt\#Y11/1FS&LAy<iNdi<u:!DZbNnVT#paS?t9aMt9l?5?DP
SiHt@u 6<8?LPXyp*jTLIaT+6epmiGAN?kKC>t6>i!iIu9pQ$>\9d?wG*&HGqm:A<$hdb$NZdZ=#pjSpV<6qL=:
MX^qd$ #Jpi^I4KVjMRy=jKuw/9J8<kMGu&Ti#$6mjbbXuQCLtV9hudjFJ=9Q8dH*jbp@muB&&@p#^^cwQtD=h+
HCRVQ% EZIQ!?WBhW&WYde>cXD%6biM&NY/inbSV6i8:u*?EmKHyEwn4M4>k>*Cd^c#%$N:@ew>?JBiM*E^mZA*
<#+K4b TKGQFpm!mJP:\\!wT\Q6>>H=5tI#Z@Em54N\pCL&tnPN=&$6N$*A?A=&%P&ESG9%%STX\:hSZDmEbZ+y
IXju/: 6t>Ii44pI%VbH!YYd$&!TLh<FI<#b!#HTem6JjPthM+&CTXTHKJEFaNEFX/^S%EZ^FG$NV9L&:G=*kai
<\4hwe hTIW$&<:KKYaTDB?%y4K5<+m%Hc6wm!H5=?t!CYN4mKnLI+!8w%l?1Kt<>QZM:J\>mF<cPkWw<!@5uI*
PA*Q8t AKKy@<8aQBjpn?XCB8#PuYLViM8hWIH!5=%1Vub+RR%?d1e5$EVTq+w:c9&hNAV$!Di#>8K=1wTt%b:^
&KtVqP ya=1^LcZtW$eDkLKcdDMc5ZWGjDyQ\lREHWj:Hc@*6p1*qI>6ZRP4PtBAMq>IID@t?PMj/Yk&eQ19WP^
^5IeuL V1?H>baWqW/iQ!^=9q8qS>GjlH*!WMjuIY@8#Ze\qIhWQb:LN\?=jDRQ*eIkAC48?+^@G<ybwKq9h:?G
%ARj+y >QNZ5M8Rl:#GN*TCP<j:YTDASiuZ=\ulJXZM@FhX#B/&!5ABZ:%Cpcl6WqXw/<pD%#:p?=FqlSTXpuyG
i9Z?SJ *6ApHk::XGG=wm!P=TFAFRWV%6>S5Sh#u%ayiIn>>cua@L+yZjDI9BpE!NeX9M@JPF1#BAFK$4ij+t^B
MI\1LW kKNkl#KQ9KhCt=l:<d4uka@**\Y%AM$hptl<q*!Wt!i=m4AAAhR+Q8mPpX^#/QqMMYW>Kw%hP\B>b5ce
k#mSaT RACySy>4Wi:b>ppRRJX#<JF<<Zq8R%#@:+K!TmRXWTeXhSeNW5lWk:?TBHCk!/K:?@J>@B:!d$Q#4&c#
QnJC!E RDTQPb9m<1XBmicYhQhQ81Gw9lPJNwacqiAh</?58XYRcFe$W$b%hk\/H+:4P9PuaJ8q*/k4J*t\uQZV
k9iK1C +%dD>F1j?uQK9%P4TRm1DHL!LIVhR+:&hjF+^S%W<uXL@DcK+eGS@c=I&RNZMu6XkI+5dE>W^:EFi?wV
#<QP58 wTk^uVaM@mWS@/Th!YkV96$XNuc//j!WZQH\!Bew$&8iClqYpqWHFV1>wuuPPw8mXjFeth19H6j9q/X^
RWmTGN eeKJ$d*96F@n8/khN$%K>M&Q/1\Zj1XJ&bNRb<TW$w*D<CSFb9NlGb!1Q@Wn?&:jWS6lp<Y5MFYGRhHZ
lcYuHJ l!Ib>$bhQVFle/DlqeV!^5<wH/%\n!ptcK9NtK\e>p+T#WkJNVAhX4YYZC>hmHXdX^Ak6jJpw<b$!mJ=
:LItjT :\hP4K=tBEXS$e>C\*JiLDh4%>^$?NQuRZ$kYHTGIbYq*DJN+:<FJ$j>^e@ei8Sk+PmkHE<L6c@CK5!!
=DldV+ \*nG%YyL8%::=NR<Kq?&!bXP9cluYIS%Lh88W:qJbHN9uZZXT64DdLiq9?>HmR6+t:QRN^wTGjp</@P<
Si^H5d $?*99c>5*uSP1iM#Wi9&t\at+At8nRt+QTXle/?KjY\/:>Me%hq$n&69eadRT:W\anTXBL<k$V:>/4cI
cYFK@m uS@?9LclY$iaFPqJ=<mqeN?RL!!tQP?&=A856M+L\ER/5YA<6<t?c^R^@9m^L>R5VauKPbYmM5E+NadB
<1^uuN ARYVAlYT%j\cYJIeW&1NH\k8L!1dIy5/QGTaFlk!nVBGmRJ4i68KKyY#*FQaWnichV64Abw<\tiqpbl?
mQQpVi *n\\JwMAq%c5DlmdGYHua*&*=q6iHE/9<b1#EFeWk?%yi4u@XQC<!#y8@$@j@?BEkeq4D^BkZSEEwJQ*
NhJJ$& @9KL\dT4:QM&/!ltNtd5Q!cV*ba@V!c%#!i//@*G*5*:p6j@*\hS+Z*J?@@9RyG\5:L?T&m&j\uN@mKh
$iN=9> C<>9$B#@E91Qe<u?q^Y<NDwGP!pZJ^eypIPVqI8L=\ZSMj=N?@YC:K$e4F#@cJbhLq=TIDj*u/KhAHq+
WM=<D$ Z>Ra49>hnZtYXCAZJ!tRqi%QdZyJY:ljF5QpQ$ieiYHHeHPT@k45<16njmuBZ6Iau9>hnZu8tF>luDl?
t#S:dL lWHljyuE<Q=6QBYiF<SV?W8Pkn@FW@q#y9T@4yiN>S>ZLkH@wq^m=@$Q=SI9=#?uZPLmB9L<n!1Z*wCS
-ANiH1 0008cd1a99f001202b4 Page 76 of binaries2.zip
NQJ^F4 @%?6ZML+D?XT^pI#Dq<1deXVB9Ni\$?/DRuEc=#HH%uu/><%HJS>%1%AAKSjeT#?V@/S\PND4$E#dNuQ
CdVtp& ^lZN8=T?n/CJd+6@ZuQ@<m>nwdbm9BkiGkTRV*F=5/5I#kGcQQDP>iqI?ib\X<bhuQY6+Pj!p@ZaEe*Q
wPi!ny R?<j9&KAiIa>*d@=*LqZ99a@h^bTi<j\jCW+%P5Mi+cHpT$F/dyj4#hN9&=yii@=4>**Z:h*N*bm88%T
kc>KSw Ep*9M&&&E9W$dQlX<!H\b^%w?5C:/k:8^9#cb$m^Db/q+YewW&H<wG#<&S=NHFR%dPRICbYXbwKZ:BBT
@tRj!+ TQ<FWlN8\*mSX!BXa>c+KQ1RKABk@C/!\Z*Gy!IT@%MJwccKu6XRS#yn<8d#66FZ#p=EmnShI=Hu?Q&n
/E:uFd @qp!:>ZBhlQNXmJ:QA!!Q5Pdy9P4Ahuma@1^\$PuJEJjkbtbaDDa&?B?c$Wb8*p9uVpRRNp</#mbDy+?
^=e6l8 JCk^GD1*kpByL96WS&qD8e!t9GawZe!&QHV*k#l$@miSepqllaYknwc1$WlNcSH%SR@YK#?hAql6kmSL
yDnpwy *YZ:bqy49uqKywKBwi:iaqhEZIC16+>y\8Ck>W<VH&pdEYaL1ek9A+X5XN^dTBB+Zna*:&hW4ZWP4Zm5
SI*bZ4 $JRpkqp9+#RFddHSmVMdD#?@N!+y6l+u#KVuPeRBwqD9KR@WQDD:DPjetTkWqMN5*=QlTRF>XGQ/q@Jt
yVju:5 ?Ip:Xq>>cZy?j9p@%=?5i^%aYl8PjeM:&?\GYjdiwD9L@6ItjX85aYkLQVt%cE9EIET44<S^w\@Zt5y*
tkl:lM cMVpV4hNG9ZSdDbHXG+8=TTTS1ii5ney$Mt18+CQ8tmNTde4l?4T%T/KZ@Z*#SGS@6GC/T%yS1<GAmTh
XZW>1Y Z\?AABFZS\PIPBS#pX@kcLN=\bcuadKY!Yt!9+u/q\9$t^XL&!A/KSI&!XJA^4P@+5DmbT!RlcJ8IJna
P8T#!Q dQ##THCl4V!%w=4bcaF=j\naXyHi!1A9y6\Mq*Wkb+!4wnTE4@d$S^HlG6BVSETX=R%LFa6<EIZ@SF/Q
?D*lcV lRic@al\i/hRmLX4^>1W?e1RpM%>t$w=Tba?VcQA4YepTqi$?SMhHW</DL1u=RwetS:+R<<DKaVGwYnL
L:L/Ca qkKjD@D\C+R<XH%6p5mthlJM#\w8?4yyPHF8$qLdh5F*mR!M4p/N#GSZqFE5MFGabW@%$pAukq6NJCaY
VAp&V> ^t?G8lG8VBmQ!d5%h*ahVMMpP+Lud^a#EkYHjDa//:lyjYJBkG+je*5qEIAMBQB@Gq*JiSIFAcAi$%yE
4GW?qb H$KiEH=!PIjewV#k@DDjSdpp8YW=Gj8dKy=HtAq*Xd@W/:TX>Kiyu/ayZLck8Y<LtcP^wk:AJ8AXlaSX
M?Vl!^ C*\$RL&W8*JBtCZX1<Ji1qp6KGi4al#j<i1XlDy%l1e=hjcJy%HEpa+e94?8q/BPm%4Y4Fm^tVQV6q8e
:K=%4/ PDhR8DMaN$qXSIlKZ8*VRGL^QdLBZ&cqQTXhLZ$>c=HLSa96>*RGSq4\yY<Sw?Sa\=nI^MN^=b\1l$QX
S*QSMb %XAMMRkE*L=*M$JK=c1bMya*EAdS$\h1kk<YLp6M<<b:EH8MnXbSTH\dGpykL&5Zn$PR/ASHFiAA#TjK
=WjtG@ X>/=!IeVyJKd+%STTDSGNqGdK@@5JbTM9y#jY9qS$y*CX^D$5eKiNGuX9a=THPYtaM^K?LPtn#Q@S#Gd
FIpJu= SmdMW<:MGYM!HEyHPNiQRRbkw5=FbEP88AYFFXbPV6hm6T&BbP+nQQC?A=m?5C1\lw4wA1?%Mt#t\45+
%AAjMH w^cKm+8XdDS$WCWGnaSubw#ndDTeJX$yq9S/4:WCV!m*EMlWul<SGPTEQj?:Q6Q9TIt&G\64VyE\:?kB
6XiNc/ G$Qn8PyicuR\Pj\*jcVj%SMu<#=IHGct=yWDa?q&8:^:cmy5ju!wF9WIHkPa%:VShk?=dt\p^5\!uG5/
Ctd\MH I<He/b1l5GqN5e?>p/1$qHYEkq=8je!G5ua::GD%TJ:I/#\+ZmLDXMJIk!!hn#Gw8CZ^$uahpWR?6HCi
c9iJba #A&=y5>GqXb6A>B&Imq&%lR\h^yQ\:+8iw8ZNR&#RXHBwK#jYh!4$@$RBRJAC8=Feq*iSc=%Rlq?+F1y
l%A/wH F1#9*IqMMB@45AXNuN*WLw9dWSnAL%inDSZIZq:DS6JAIi4GYc8pwnQJTq!L5dc/^Q*aCwpA=qjd/:qQ
^/!WW= L5d$/&ADn*&@8jw\/Tym4R=FjmX+%Kc/CuP@nh61>$hSqyhaum?<yZ9+pm6B\?ViihAF:GJA#&uFl!4B
F6Rd%m Am=*LNC91>T$y8w84%At+Md9TBV=!MkuQWqCQc<NZ4?E4MNFX4JJNqN!LqHC+F=M!cwNT+c&BI5G=mLp
RiX46< :85D!w>619iYTq<wI#GXdIQCKC<AWJV^$kh5cP?N>XHdl$#6cW&dp5BMJy^hqaP?ecW+8Kek?QSkSWW5
qZN9u> l>+=K%@Aw:&y?XE!K*qHI\mc@ClddIXKQ<K$SB4Q\e=GWQ<Y!?m#%GE!C:Apl@*SVIjKMdD&>AmiXRjn
=:ERmm S/8T5aZtyH@!@Rcbl&a+>p@IMn?b5*yPw8BHNw9&/h^wP6NYNipDI*MAhQH8?djND5kE*e8:$DTY&L+N
1W>+$9 cMVAcJcJ/mjXLdh?H>tD6b!I++CbN@Z6TPJ\pFpAuwR*TQet111V=FHki1E#dRN^>&cKRMJMh%6l4QN9
^NjjGi *<KJXKXW%C6:1lFqc4GAR4LySD>!1ywymkiw/*KH%DY8wC%He@Dkt/Ck\8lu!H$%9Z\PZ>GY%1+/I!PR
?mVnFq 1bpZI@Z?5Qu=B9btGhQ@8$I45KpXQYEwt4!ND1#6^\/4JK:QS^CkC\T\6&eFAZlBAL?uFc:L&$mDVt#K
&=LRT/ i:5c#MiCt!@M6w9X4/:e+uXc%%qqujyZS%J:Ek&QXtbKhFmlG:/Cyp/T=#=yTY<uV$qBFn@pwu&6N6>K
56dY/< XNM5RKFcTm#B9b4&c4T\IbFb$9YXm:In$>d*WC+:HNI1QyR9=nh5uAIY9a$:!YaMN>Eb1Ih*6=NSjb#4
VDVAQ\ hGPATp11&dX#\GST+I#CW5T@LP1Bu8*@@8jhWDJ#m5tHh!Y9ytQFX!cD$Ee#YGZC^aVYW1%:EN^dyB$n
TRAM8l CA*B^@XP8FdV4B&bS94&yKCthEjASh&y#e#Xqhb1&Y/FH5QnDEIkX9TYY/Lu=FYtIHHpZX\J&jn\#ln/
GBkRku <&PV:Sq%Y*$b>DyFS?a1Tc&a^E4ZjDYkX9DE^X#NtC+amNw=YCjRq@nuplh$Ph8p+T>8=RR?cJkyEQGp
%pWGN> j\SNy>c*Rq4Qnd$1#Y9b^<Hwc!b%ykl/QXHk=SV#SNJplhVX&PTiE8EbF?RkZ+bL5XEF9i1DcJW%54IS
w&DyCu eI^>jFmjC?6j4VSbS?u9^#QD#pZF?F16Lc1M1w\eqdCQ!FLDq\E*pZnd=IHN@4XY:kD^RGSPpyn^S&qn
JwV<dF qIZDH#F4L6I$!VN+tci+Z&mkH!e64Ak&TYMWp:!bL54ZNLabu\wmQtkWc5LCKRdM<y<@cS%jGehL:k+J
b!b%L\ Sa8c?/<&F:NNTQT$wc^PY1ui@N\IQduKTL#c^y/TlAD1mclSEK%c>Vy+/SC>HqlMP$&G%Z/cq5SV5ddy
ejRe&C ^CT/eJAZZC?=+Z/a#ylY9Du/MAaCADe4jhFamCLDleLKbMLlK$EAXD#!/L$qbc$CTe^hhWM*!k1*%?Sy
SIN<5k NpBtBIw!&mNlTHl$RT&iTShdW#R+yTFyya<l=J1u<By6:@1FEeGk5<>k9+Y8TnyRAq9InCYnXjw8\HJh
YL*HN4 p?l>=yTDApdY>KNWp?4Fqm6WJE!?<EAbYM?Y^l&mlKw/jj<Ktnt%Mmww#L?Qnj%k4wyu^w+5<MkXVI&\
&@eawT *b&Kk9?SmHP&wh&Bec1W$uy<J/+&t!yt5t@:5@54Re$bSRZj:#5<p^%j1ny6uY8dh\LbQ&*MtDA#&=&T
cXe@mi &WTWcPA11i@E?SjjJcT9dTEW1:!*\4b<<#aP%p!RuE&?JpKAGaI!jHnhNBkTj:4wAZZWQEm6VTyHcEi4
Yd*1C8 Pl5AwjNIkZ8V:JR8eFG!wy\y5RH>T6HRJq!T$nqctc@%6kVTH8#$^JHq$I:lTdeCBFmLKjH^#Q1t?FD*
tY8%l9 wi1d#>BQk<WSb9Jkt$e^8S9ykVMDeFm=MBYMdcSDcWuMlRBqj\i1^ua@$uniVLWHES9ijE$wHT:pHJ^m
@TuER9 ?=t88ebY5*wXEbWjypuwNPm>9Liw<VA>ASZ9Lk:>FR?CNVY4+*yBAI@lKR$tXhZltt<hh^qZenEMI&cM
*MLuCW lb4cJJu=FSjp5HNJMhYH+eB:t$AWC\daL&\BXuSdC95^b#<1ciS^<!Vi*6D&SBcP//AyYj1<&?IA#TaP
HS4Mu$ L?qhC6R6!hP=#&Gn&DAk\@b*=eVeSZtjmPn1\%8yYAH9bEt#TVST/VC*L&kXcB#RIp1tWJNq+VAVl8K5
hCj+jM cM654Z*i#h6cX+audli^V^e\:tC8bN&5l@EcjAwDAVV&%*%8wk$/BFi9q+upTdJK:q@huZl<WNA=wSXe
68V5YJ @SC5F=W@<4kdGVQlySGjXe6V>dP186?\6dyBqPl#?TTbRHlBiSj/?*VJiX9N1+<p*<ym:mW!um#H:lXR
Kp@ywT dtaHH!upu?ZZ@JEG=8jS>qNe+jNLDc6dZJZX*H^$E+qYbD8LEFMlp+JWkj?>*WVeMpNIamkC=j^bcji5
qa5MV5 jHpyGBKBLj11JL=aKW+&EaB@c$LQ\*yyacuZ!S64hn6y4H^*pbCqT#FHMeS*8:Eu&*Z+84*T%ML1Y/l=
FF5X$/ ZQmnmuK>j=AHW:Q*<$LhWtAn^%Z:uVuA^MLBBEHjW&PTp8&!94pKh+b<Lk/=F?Q#h?/Wc%#KP19K&DJ^
A^kY5j C5#/n:XJQl45/y6GI5bu4Qp?RTcN/W6\%=DZE*&tN8@V+QQ\YmDSSaSKX%kQFaKVnnbyp91&jM1QCD?L
VCj/8p yjk%bIVSem6%cm/?KXF8CkJACILtDwtdEyceZNlZ^<kXtYdMVm6D<Kl>qJ@/bNYLTSDW:FKa9mdSJEX?
WDnIEA >j4^FXJnd&l=%bQRmDP1?X/9BVtyEuGc5=QyEL6ucuRNNunn%iihnM\9lN9ApyXy5L5anRtB\WLFA4^>
\4\$d? cSme6ctDIHNpCk6%eYA^yeQM8<PMEj#w5N$^/qhAQZ$>LQP+jK=*FG/QTeSb\5Gc4/$9H%hW6YTyl1/*
#?wI/8 HI<ct<Ai8S/ZYS@u:W$R9N6&W:eamQ19XAZ<ybtl!qeYA#8%qQ54Sw*n:ZtK?^+X/e1h?!HYlY4V6D@#
8kR?+$ c@jnc=Pq^M>BDIdMV1yp+1^:miA?XCH&tLZQcIZ8BpR5<hMWeJP5JuK%T^u\&&$H<*p*:b=TT=9h4#=W
HEd^%K 9VWK#el+H+!qM+ljhKaG*9@$pi\?&R<EaHL^GSb?wkRBw8*tq$AAL^Ck+8uNA#PV4jCuB*j>abRNS<XX
+ynhKM 9&>G/X8LY$$bE+pZhE\MjYZRl<wG1hw+KitCeyp!B:Y=qFu6qG^ce?V4PBT1Iy:ZQFbYD6i!q1iSFh!F
6GG+Kn QQi%1Q1he?Tyuc5bb&M*F1D=4MhFH#iHN8:u:<M@c=>P%9@$^Zha<NB!N?j11R#w>hPb9c6Le/eIIWWw
!AP<P/ M^G8+ju^$&p6FK>uTyWABZF@h4m@\#?QW1y^#pcYq$tHX=9K&P=+4kV:m^*n6HWNHh5He+T*+ZcHR^<M
ytXhBc PYEyV4+VZcDq5AqpKVW#!56<9=Z5:k&@&V=S9B:PEI*ZDAIByBS%*iKqyMq#<mpuR!Fmhcb*G@ta$MZm
iXXCqa /W^ucM!n=pS!m58^P!FRh4?CJk=Iuq5K!Kj/X6Wd4LWj9I4X#YBA9eGNVRT:^>yBBQ?DY5NPRb4&KV<w
nNnbiS 4D^JkVFKA6NAuTKKd#NmaF>6D\^&#utApkkm#emRaX8eBw#cZ#1w$1E\5e@a8L$D^#K%6R=C@?lhV4jT
-A8C>C 000aac1e158001202b4 Page 77 of binaries2.zip
d9uPaN kmJ^mbQZQFXPI1*8l+N&#Tl8+@4Ku@CdIc8?%=AY59d\8pG#hR*e8jqDw<98aHw+N$c&%a6n%DuZC>md
5FihI6 &B:NE6&KA%Q>?Bj:RuBMMkqBT%EyKi9T4jF#e:TX/Dm9M\aQS?MywJ#/\qF=qYLhZw&=iGR9LtlV=>9c
eK?HCd ub*lP^FIpn>hK5u#TAkJ+kR=apjduiXMZ$M&?1@yy6y@%nwhGJEQhFBCwVya8$$8Rm4uK=nLeLFD!m1&
eQatu? \MaRSlS9taq\w5%I*hmLGEJyELL!4&<VD^D8CL?H*jt$14@GJeb\HhRWuE@8^et!/B*J\L4aYFX1hh=X
hJ8S<c aihkR#q!uiEnw!R^QITwVL#Xbyy4\<>d5S%*%i*n$6i!XVIpnm<EX^:pmRi>h166bacycuXVSwl\Zeea
&Au&GE =+q&nwClY/Nip5ehJWWmKR!cbJ54Q/Ya&amit!X9cI/Z&5$/KmPu!WiRPlySwS*y?t=RDu5aWH=1T/a9
L*m5NE Rh$W@X+45?BKyAy:$>wWE1XPJ/w/l##5dEj:K4>JyVb*KWqE&Se^cqT!9\M\LnM5GiTwWZiNK>Bp=$w@
MFR:\L \IJFeTW4We6B1VVIGHaS@XEaBHDADB+jYNh5+u1h&X<%l%Z?LR=Nh8B<SJ&cW^&+4iM*5cHI&t9aiENu
8lb5H8 #%VBHEi8JVIRA+\ZWJa!6deiL6Qty9L?1C1BQZX+M%+nMZK6hBcE+=jM\\\uILVq#dqM=JF#PPe+S5+^
yTtjKI R1uk=!H8eFnNpe@$\^k/pcbVL@ckC+t<C<t*KV#k$dh:Wh9n?aWnKTXDEDS%kFhd?&84!aBRlBP49$ad
6yXhDJ nEiSdIWuP/^&ac+J5\p@QQ!qBkbCHnFBYAC<b+4D5aA1nhJB/jJI6wa!@h6uS<&=1lJSG>5N64j:hJRa
bb#9dc t+QSbLR6/XI:ZI$Z1aHl8d^TJJ>J$ARC9C=81q:uEQT?N:JmF%^Cawn8kGTqPBnw9!=Ph<PiaG%^<#C^
h>w\N4 5k=JL<W1aQlJ#IPQAF6l*BI?LX9Z^G%ajmqJ+YIhLYkX^8@YLZ#YR@@BAKQ*SHCPTA?<NJJZ#ASw/J>H
mW9LtY \DJub8N!4i9i*$TG*p?uLCFK>Jyb^Jj\ddBXS8IQdBj<GVlKe/ZBW@aeAdWtb?k:$HSm$X!<hkH&BAc@
<hBYE4 e#\Hp%IATc=Ga8Z^6+!dVwIQIlMn=EpiT=yYWlSl8^R%Jp%ljcQ54*K%^m\eBGB#SEdaK5AbVhE@elt&
q=RI>j SYyw6KbXLC\6b#h/P+Z8Wj!RWh*cwbQww/!Q>pni&=cy?iT141km!YSAV+E+amDRZE^awtNe!w^6ba:h
lTYHVG CAJ$1E6G#D+81p9G^KA#6Lb<m$TVRbI9q=?*cG6&ZY$=1&KA8QDT=@5Y5jVF%eaP1XaaV$9bSMWCK#je
u*%P<F l=4l88*4uWZEp&VMZS:**DjB*W<5h<VQd:4488$kRLJ:=+::<&4P<eH??=Q&FkkR6@&</Q<G+hnTCT\w
yHWQnS N@>M^@&\tMleJXZeGBtD^9P6/hKE?GtQ##P&y#%NTYMD9m/&?QYkBuWA!ZZbEec%=REZ#V\B!T%mXeYc
?!Dtqy #+nAt$5Bu#E<$E#1+\58?I<*<c<R4Jj96jE%BQIIt4SNup!iNGm8yRYj#!MkibnNPI4*iY+Lq?BhGje5
Sn\@b? =hM#\Ndu8+bD1jVDle@RAkm\X:/8quD*/&I%9!JBh=VRjP<HATlMjtq#Q/kw:pe<TR#?$qVj=&h>^ZtI
AG8XDE mut!H99D!kXB5+iC@!$%@je*M?/#\<n$EW:yyHZ%Rqdymml:j9X>MB/i^%B:Q8c&<Ge8Httc^IyK:NPN
L#DqR< iWdD?p!tkS!m>wu#*K@<SikY4&QNQbpE4h#P8$h&=att*8H*EHnwpGmd6DX1*WGJlb!\Iq#e&>eZZy$&
AH/&!t pqm&mtFLQN1hddWtY!*yNuH$nNb!p@n%&auuV9qu5u:>\^9$ih=9@jj$G5N@jlS@cJ@@N%LD*@DS&Zua
SM>tlA 8Q?9TPK>>j?yJN=D8Z>K+l&AZ<QwJ%TC$G<Wc64jb^M@S\9FpI?NX?Eu<<kZDCc$$RTFIVjHK&\Wc>@I
!BDGc4 #EawRkmF/m?NHiWun<*h$^%=mawwLA@NHeR^1wkTCPF%R@R%>8NMI%SCHRqm48nHB$!p:e@muIGacwew
t1*&=< !pc@MuRjITRHRp8hP^MEX#WZp\8SBi!!nLIR\6iG>p1N>%VX+=?$T91X5\+F%R9y%DMbFVmR$V8QyK+E
jc+8EN =/VcGYpqkFjnCnujB+DL=dnchqS>j<8tK$YZGuqBA#e%qXn9F^liH!#5cPWm&!R@#:#/>iwLBBR+<A=Q
PNQEMF Sdu<#lIcKKKFCt%p+!Ky$\&=WX?#Dd9H?@Zh\<@Z#CN/uQ#SJp!&P*&IYGnmPw8i<^InTib&EYJ9T>jq
W618+l #JSjjTeLuYIa>KGmF?lDbYqtNe+9\qZy1BDCWZ%pZnRT55blkwPCJ1?Y%Z9i!<T&dk6Wn1m^9WeBD4Bn
K^k=uF /mBMHW8!dAjLI%SFiN$I>N6+L/e+qAYb!I4Y:i:#u@J@%Klj<wNB/P#QI::wSWbwqM+T*Y+k+lQBJBS6
5P1SZt Rm^ZaFAJK55Y48>>kN?5/!Y5uSca4CeS\ZVVKy=DlV9B@E++ukEhjSneZi#p6%GHcuqu*S*aWn:KEp%e
mKEn*Y G$H^HmGKCR>JMGuG^Q%RV8E1i9Gp9&NXW@5hGE!XkH#G=@hNc*=CCbJ5Y=VdmMcSu59<F^:9=HVZj=+1
4BZcl* HSl><\he=mWMy!1!qLi>94u@qNyMy\!9Lq\*KLT@&4MmCqaJ?ZwBYWj&uqu=T!Xa5!8&46yHdGXYR>+R
&DI?=c ejk^1iq#lY<=tq*mtkn#Qe&9K+RPW!iei#Vw!GTHwM!wNTSYI^FilS=YI6MIDejMPAhAk1%$W>iVB94J
N^ypnc #LFSVidT<lS*k+pc&uZ=Mld9Bi6k+4yCIt8L=^TPaT9%aPlM95WWF:jY%WtLaGKt:ClKdR\tmFT&D@4C
8<tuBy ^#X#MD1mS<lTKNBe=Q:cSQh>bBVm9WB4C?V&?u6&lj:!Dq1k8<pPK/*LyL>EelP\iB9NB>+wYS:wZFnb
Y/W8Dq yi^C\j4k^*!V4yQ?^a!FhAm9$Q&TaHNalKX\Vpi$N>b\C?#c?4m?nK1?hF=&c$a+%HY!u\:<TDi@!IF5
LuC%RM lk&/c?4MqMet:BIhHMiDhpm#Fq@MJXTk/@c<IY+u!La&HDqa8^/ictuN*9FXLw+aDhu!FA:myhZ6%\JW
c:9<M9 W#NuLWH4<<N&S*PpajVi$Ek&+\T#nV+\$%Aw5LR?wcKX@BtEZF9Y41aP*+N:CC>PSNbT\!RVjMq=JqRt
jEqp%C DtKTBnX\^EIVXCScBRMcJjPGn:db@6VImDuDAjDVde=5X^h<&E5?8B4*>&@CmDmXTp6u^6McDW?>CBmN
WI>lIH Q#tyhN<q\\ZmVb4F>1!qt!5Qp?W!RC<Xa&R:Kyj9<6MIDa#tI:kkN*^GlIGe%mYR@ccCXh+cnQqnP!KS
I\CpLa RYhe==M@#F=DXy&pXBl8JtXjwqJ=DRVR6<WF*>qDM:/iu>:K1m!yPaR>jK#Rypm??6PG$nj>hE@E!l=b
HNFVHX 4SDT#j\FYulwKN9qpwXN!>ukTkY!eF1ilbGQN6!5Mka>DCIH=#tV\6a5hH6mM5/y\4pRN8Zae$XyGq6+
W>RJ\/ t#dM*Qlh+!HdaKN9E&QNy1BLZW>lYPT*wZB!d\R^j&SQcN5w1/TypwZ#@KD$hWC14AD&:cNBVI=khYlP
Zj@81d <yW/Lu5qwd>qLbmKDJGDN=+lSk5Y4^#A@hpL9?^T1=DTe%>Ce\et&9C#F&$P!XCK#e5QQK1Sy?S^Bww\
P+48&H GPID!P+dE1&APR!K8VlZA<44/eyY^9p*R:VX*GG9wSiAalWn:<*BPkbwWma?Z11^?LLJ<=6b5kZqEQwG
=qjMR9 %H6Ct!%\9%LhQXBp<5XZCI/SY&Ma6Ecl:NVZXbyn+96mE=aa9#RLR:>cE1HI9C8\<yE:9y\mynl!8JNt
48%b\t IHRJ6e%bGi!Vc1$?j8m1paN4h+neEBL^K96&l1nM&G84SecR1#5%=<*p#iTMC=?*bI/S&1%E^AT$65my
4eDeBP *ML%Z#k^bu$!!<TL6CMjQ:Kb1^uywVuHlb9b?M>%jM8Ju%PAb%:nNyj$6H6WqwNMQyK#@MC85nTaX8DX
TuN^F6 1SHdDI?^dYw@qMtLT%XPaM5*l^VW%\ySlItJIij!ec!Rw&:G:n%yD\J#Su@TYFnHa#hAucqP14:CT6VE
HME!M^ u%RQmyuBVy54YV$X\D19QXdCKWMXi>cm^cJiEFPS<BEiuDClb:Phi%6QE&K>Ed+h9/JQbEMFehd@^/Bt
Ch=6q^ k+clRFj8SaAyXH&+\FaSjnD4?>BiLaXmya!mVGh$*h\wK#a^DdK/P:aaYDcNiA:h>&B%^KPndZ\<i:kG
IcB5Te SN$Ri/#Tp?jaVS&*^jhMi?im<8a+E!eSQ:>@bqtw#?Yil&iD#qj:$AP#$+E\RckGHGX6lP=1ywLY?lEc
utImaq :GmeiN9Ah>?dV*<lE<Pp\mP@$VIGy/uGCEY/#HMl5>IatlEYK69!u4RRimuXNCMK\>1m/V=CM^h9q&uu
G=WDXb :ZB\:lTjiTp=#H#<&14DX6+y8?FkE^Pbk\=%k5La19ID=BY?AKP=T^bc<\i<8qSl!HD:wR9PpLVLP<^V
G/\6:@ ClG:@YMqH8JG:G18bhtRKab%1+FHNj/l<6jFWEI#HBBAnnBDZtwAlbp@Sa<IlRm4l/ERd%<&I$Wnb!+1
//ymiZ =#aZ>LeDZawVSqbaQq>dTuNES6KB%:+GeKSLyEKlTN66+CcGGlVtaEKYLCKiNN8XZLtJ$4V8Nphq+BTB
e\N&eN QLF/KREm6H9\Y8T<$D$#*CLFuQ=9?d8\\ANMwKwNKE946=WEaW&<PFH^aESDwMSmyZMLA%Gn+LbF?LdZ
6$d@8K ITEPaIZm1W$CKj*N+RBCt4ut5ELb5I:+%IdB<Mc+5L:D@jSu5L5AFHJWPNJRTDAR1lMeck$5RR$cGl5Y
BmA%6p tlMiYk$S&kWyRVaaPl5X8lMyAE\cjbIRAAdCaCQBRPQHWMdB<JQGbCQASH8FiTGQ+cTK+TTPiWGH#WcC
#>18?w PttF/tVMkVwPyyREy=RGFiZIVc=k+t8dp>5DdikE!%wKDT+n\%wDE?SbS5:FT>&JT&wKk+4NTQtJZ!pP
6lQNDw mnWF!5SWM!RVb5PcamII9/dTG6#LeCKcl:YPwMTawlVVqeKbpm&LWHtI\qGE&qGKpXYSIDd^KWDA&6mh
u4IjN6 c:IW8niYpZHyXeA=DIWj8Ak/l?nWK%SnWpN4\@\<@F\X1&MSjhNT&j*mmkLWKkjV%@$LyDLt5yGl?yR>
dW5&qc HkP%P/I:NyXV<4Ad:+eq11&\1/5C#bmQLLh@q+#$*$nD@*%W/d>PT94ZqGk&$n>#JXZ?#Wu6#<=6@!lB
Xp&P9% ty&N+=<pTHQ\@n%B?5<6j#FB?5>iq@>Bj9/#%>:j?kP!@V&h>h<c@yJ$yi^5uC>B@!bhKV5d%\9RuB!@
jCVN<u 8#d*T>C@!YdI#5d#AnTR>*hw*yikj*jj:K\9RRN@l&b:Cb4>h&n&F/Db&Z@V=?\eL$D@wtj@Mjwq55dG
Pudn=5 @V9$T&V66>:8:P\9EnbY46?k8X<pL5DjwF<pdB!@R:>E&H:4K<@B?m?l&j+qNQ8@lH/J5Q&c/Q+aDj!Z
aPAl+T $H@wYQ>jX@DTNKLe#<9R4@YH>W<P:T@\&idk?l8j:d?$+:@!&j:*6Jh@<6uta9$Du&&Pj!IkAP<j=<Bp
^+=wb9 ?!h#aHJ\<j/QPt*u@L<etQ<9B?d@**JkHtt5cX%?Z^a=LXnG6y!y8Wy^Xu69*Luy\P\#Y:u<JM=!NjcE
X^!Q4& jdu@1HQc8cMCA5mSTq/cn6puL\GhPj6m!RQ5$j*hVJE8WBc*XRTnF%mZ:1n5ti&YFS8l^!mV6^VFbin:
15wdX8 \D#nXu&?Nmk*KqK8nkBb4S#4i8w+unb=uncCZFF?\FX%eEH5&QkQ6>4Td?KLT#cyY<CHpYq%@=TZlkIe
-AKy*G 0006a1979ca001202b4 Page 78 of binaries2.zip
wHll?Z Z*bn8*XIh#VHL^G>ZyAtajqGywcICc:NC/deiZEa!uJLhJ4ZJ5?PHc\yNSpId*NEqmSF=Et*jEyWDM8k
K#kV^q V*NL#t>yu!EdEVqWt@6B#&Y4Q::A<&SE>D5^#/LyJcZi%+MFW/*nL:q?d$+/m=1I^pEA^&P=KS@@YVB=
HHn@ce ct\*K+1wX=la:4Q+\WupHcW@Ty<tMIGk1W@nHVL%@uSuX<%G/M9>d:F!bIKTpnpX\Xe!5kiCL^qi>hpW
$8T4/! m8m5/l<am1QD>6Seyh&Y#ZCKI&<nG%?8J^iGtiuVL#BE!&wqPHwT6V8BAL@6+@WZqjS$5ut<E&/eeMZd
h/6mjw tK:aV8d*\KQWt5Emp+eF>u^>eb1E/hNFdcLw:/MX8NFVA=l\pPIj^C^nycae*hZ\GKRtTELlmWKQI#Y@
jy4cZJ G<ZhcT*ha%RNI4BQwFi%PbpMbRY!<45VjWYL+iwpkc!9DYRRwuTYA8k%/E?Hj=q1YP?:QuJCiL@PmXL?
666L/5 cN?#F66QF6p*hnFeW#cAmp&XqB1*jH/diL?iLy#%PNmqGbGlR4YilBW4\@BWLcCw+:cPp*p6yWPBqInp
MjYV@N kGuV4^b@McJAPRDAmqJLYww/qSQlB\Fa=W$IL:Sw=9Ty>kpDB>DF/R:>CRQ/R\TLa1\@IqN>%&>y5!!*
K*dYe@ 5*##mM@=!kPLBIMBww>aLL=lQS5CSyK/+pnk6Emp*D\Z>jkIX+j5k4iCF$aM1XP+\SIPnPq4P4XEW<9W
KSkYL4 cXb<n\#JtymdY!#/FE5juwb9PAyGFtnt5P:I\BV:bMI1aM+tT+F$B?$AZVMnKFG=qEFuK58N6<y49BbI
q9k1Z\ *pQ8Dc$6ZP/qV=Ry&A/VcP9*H44+J$>=mwGyLqeTa+=N6pE5#BEYDD:/$Y8cZZpRIBGXZ1d^YGY8w%bq
WiPl:V WJHJ:61FjwS&??e+tV@cKPi:HEKdaDeY>^@F<\e%K:PBwXpY=tST6%tqE>jhiP+9#leqX!G+JmY+ni@V
Ab6:cH J<GTBbw>#jiqq\i5JAVXHN<LnKF*8!Zk/S54+?%KYE@HEpG=XaZlW4pm+GBkNw5\>iKFGy%D@lS9y+9W
T:F6?Y %=X#wbW6Z8nF@cSWwXLD8qMyhCJeTiq/T14ANLbm6ABi46knLiAijDlp%>V^?yYNhMwp&y4aYk5CE5Ey
l9G!$! B%m@6@qu6yE!1$1m?CM84epCN/S1MiQI&ZQE?1+jHecVDkSBu=ja1MQqlTldIkEKjjFeF\Sd=#d+?mNP
F$aR4Q VY*lw9%bt+cTtEBn^WaBc\$p9ER>t5JcZP&!KTFi#D8@bh#Yn6VNNQ864jDK5TEA%qew/<^mZh9m/$\8
V@yGFM t/V/aNh+DYVLJENEY:Tppwu=\jXiRhDeca6Hdb*bytT/#!:l4PAi@y9d5KHB9$$w>n!Gjy6SnF&V4i<T
/W/k\@ mqqbF6Kk$L?iSAA$j/k$awI+>eWlY!dRW!*J4kiayKmTF/6/LlXi?QutkMEQj&616^AE!QV&8RyMZ#1M
Jt%$?G $%aKBq8ikiXXDq8+&J@j4AB#$hNh$wEw89Mw\6CSRJ6m9=ct<QlAy^6CDbapZMVea9tnlEQ\%1y9atBi
NhHDdQ w>bVjbhYtW^w=VX$YdytV/a*wbBmIc6:#8YhSHPTCua/1eu>1FiFd%Gkh\nF+I>*9XB6%R%JbQn<XGNn
\D#8jw &eqcPaEJ$tLS=#X1SEV8/XiMDHKIIhL8qbRb\9FV@Jdyq=yce1d%#FSZE$Em@e$BCw<wVyHB<4TDdmBA
PJ+:9X >1i%ydYq+<\8SZqKhWK1/HwJkidMBc?cG@VDG%WC&C6i/yy\\&><DAP96LHIuW*Wh:Rpic6aWJIbCpeK
>LH4LB %>F\J<$c@He%VNN!/cM^yq9Fue9Ed%NQq8$Wde$Ke+M&5&RtI5%*?mu$QA$BqPdZaqG+yc$XCp@p>d$M
WVcbML n&<Q%*W<!8*^CS#^#MWaKRH16^N1VnjH!+KkmeQDQaa$/c8*GTpGnCM$&LA4WF4kGk&*W9yN\BN4VB@Y
@$QJtq BKK!yWX=ju$SbuBAh^#B!Z%EZ?*nG4Apt%a\6Wy:XPNi@m5uGpjd\AMMc?VFDJMHRP1\JpeR?a=5=J>M
C?FkYC QeQtbZP=5jJ/FRZ@lGF=pEJq?Y+5P%mKiX9dR:AMM\#LQbCc:$IDK8LE5p5qbKD#ij%FM64VypG?n=VF
u<*BKQ h:ceA&=J5*pc9lKGEw&jKX1QcCe&9D/qCn<mpTcD<+CwEB$XS\#jBMQpu:d?ci!<hBhZWhH#S1TJ6yVG
/=*/&S $Je!TtQQt>LVi+#8TYPX6n>pnA&8bWZaeYDJCAcX@E&=M:GjhXqYue+*Sj6h!=#9KHuP6Z1mS>I+>^SJ
E&QBXC c*ViLI&qQLZy$TAAE6*Fl>!l$+j^Bm9t$^&!dqnM*EVp@BIB9BDKaykjQ5PXR@$ti:4cpYZ8KdSQKV#=
$&#GAG %kC=qV$/4TXjCqd>i\Ddi\Rj6lLBjPbNX:QTe!E<*RlpT1kmFcV@H*6@HXhZp&WB\^h*h\58\ZKBm:8:
l%T8nV 8#9B*aP:8$N\h+eRkq8\+B:eHRIECQLqcb?iJ>N$#@#ih>:=?4>4/%VhW*X&%h/%%%=Y!&5ane*jbJRZ
#+PI9: M$eY*kbLM!!I\G6+&1w?hV*YF+ThX*qGThu\n:qlH^BaKky5M+>PM8=?ktiHwlZ%SjEP+iE#5Hy!YPqL
iVKJ:k pcd*KuBB@IIc=iu9Hp!:e9TBi4?pL&w8&!#BZjPNRR#8$SmYQLY64JmSY6JtV>q1J4BK@Hu1wMJ1h#+!
ZaQI8L b*+nSq&EnnC?A6IHdyRh:MJL==:w$\@ct!e#e##nn?HW$kHh/aLmkhPa5uHJn*8n@q<@Sp=6#ibnXFe\
a96PKI !/&EFyABet9R>INwT94%ty+Ak@>RKpRZ+/?/\epqQ#:DQBnL*+d%Z>cY&#EhaH>H5KLjMVMYcNh?jJld
eTVe<D #qD\Mue<>iw6$uJAH=dtmWdBXPynHt:ii<<*6N94qQM<jSk+=wqu44B!\ZIB>%uKV*8clIpd1Xn=56?P
A1kB44 y:>\kZ9RmS$DM^\!NBK%ZyK+PpIC<!9:<DMA%iJmiZuMWR8/Xe$q8F@H$:485$LVD@1Fk@diRtEdP>j9
XH$%iI kF+Z9A^wBi$EbJI+tI?qh%tqD@%FW5FVT81#GtCdEw#:Jk19N/GyLZb6GK?yM&CMdi^R=q+=FnK\$#h!
e5b$CH Z!yKSdmNyI+81dDhjJeu9*enE$cDqb8aj?>#$9:PLHL$HnVGLM=J6j1/twyT\!EGiwPWFdiT/!dXj6+C
mV\?%F 5V9:5?ciqMKFum1hqwwZVDHpM\DHjE$*buDG%qH$mP+C>FXNILTV4P1Bc!9*t%/5C:&pHdqEAl#8EPcp
9VieZ# N!W#jtDHajV$:bdyN>haRmWi&<6&b!S$$l$6dHL9em#Jw=>4>Eu8nF1R4hnV56uI9/!9W+pEFS!h=64T
a@Xa&Z E9NK?+M1klcL=IhukGd+ZSb+St4!b8J5#GW*=i$VE#%yBVtM>=F?iLB<B/iLHRPya?we4RqQh1IRJ#=W
Wd18D< &Y%u55CZ=>pnCLZLmjlmuDp!<SL&/@\KBTk5uyaFSC&CMi!uDd+cB!5uB%Sn*BmJdSjw4LBNTakmB?:M
&pLD## M<dCDedV!yS*nkKcJtE<J5qPDjk%jdqd96J*=k=Fn:Fhqnphpeb>SiL>D=XmHEh/i1a$LkSpqVRnS@%C
dSaDPY @P6%F+j*tKP%w6+Y=B<&+!94/mk@RmF>en^ndNT&ALjEYPwqJ/jSZGW%J5!^Xl!/%cm?VjIeVCXVqdlG
pqE5ZR wFRqXIHL^*^FdAYe+&p849A%RdJTBPu%*u&1u>c<QDbW+^Z/LHTeK+6ca6NBV$nTFDjINSCqKq>EAnn8
PiJ>$Z Rku/+eip<>9T?1@6T=L>YD696>b<B?D+N/pS44*bnE9Yu1Kc\m!l<V1K6WBdS^h&$1tpWp+qP6Fc?#+i
!1PPh9 &RPKd1#B:%i/A:CcNL&lMV:T$iS1kwXGQPlZ+u?&eR=SmV:hW5<M8J<5XL#ZPdnAjF#\XP@di=:j@#+Z
4LNewV *%&&u!AK*8jV&qYj1^9h9w\PVepRQhPlnY/Se6FejGM?N!YJZ<8C&+@klMtQw:Zl*SG>8^9YZ6^QFIXI
WuDQTt @5=iKwmuYMma$QihHP>6!EJCp\q!+J=?yX!Fk?q?&yH6V\>MADJELwwDi^Ftp&<ia&l=FB8BPNW8c#u*
F4Xid4 QeNCPuq5:ADMpq/l*dRZE*dhm8/l#HqqJcPA$nB?#u:#RGbWlPb?^:8Wacw&K%#GAJy$@K>IP4mL/VKY
+RG?yQ G+Jk1b*jdBSK1Zkl^q@n:dpaZGI8bA4&<Xeh?k^ZmSj>/C^8^L!Nej=Kheq^Cq%F%H+<#c&hbkk*kHGD
:ne=#y X5=8i6Gh4Ryynm*qTq9h!P5Z*$W5Stn&#$tP@wilC9:ia*FGWmi=BF5W+pFBW%hum\RQ^Xe9<XyT%4XL
Ln#m1l j$PY@!:$pX#Vh=HS:4\+=/H*Kd/!<#mX@Xbb@5u\y=e/y*<nHTG+M@JPE*K8wbHbZ=DCZ4NA+j14nj?Z
l*bPT^ u<8lpwji5L1FcX^:nDS*$/h+I:u6BB5*cwIu#J<tN<%*mnZ%MYH*GRD@e^5&!u?AQ@L$&ZF/iI/y9p&!
ATDHYB j!bEVj5hmTASLNp<b89qMa/nb+5/Cp<TSFc6=peF%\y6nHDj+J<Gabj+K64$GYD!wdMu\@ed!4%a@VPk
99LJGm Ztj6d*4NP4e=:HH!%Pq!@e/eaaqtI?S4Sn*we^?6>lW+1Y!6V!4F8B%=mq54tp\FbpI=*dp=cW1RYH^M
m5S&$B >V9DED*jj%tW%PlPA%4@>unJh=Sl@mG48j88@4eKihM@h/1cDV>NYcik&b#6B=a1By8P*u4jn+!iF?SE
KeLce% ^YJp4VPV$5D:1a!Q&Q^u4J&8FB5^i9>S9?&@qPu<G\Y*!B$DlHD!TLZtFDW+jC%hqk<kAE\#SeI:SJj5
GB1cp? lmL>8wm=HT$DVc&9S+ShNZwK\>mC#V>1bC@t6h+Z^Sj%&pM*Wy!e^+k*A\>9nFV>c1<%pqY46+P9aR<i
pnSD\u mq8#Mp:jw+wqCPTL1peqtA>*6bA&4+My9WMcA?4Qyh/l4D&tjZPC:/Z5K=tPAYw89QhVXHJ/un*tL:41
Ya$$DM qDT:H$=de#G\SJJ@%V9I8Ka&hdy4>W+:KWZFKCc5K&/a48@H6MMt*d4>&>/##I*9ZjNe$etFpWm>>S@L
nV=:qZ uMH\!5ER/qVJ&6MAZApCb?HmqReaW4Y>dwRJVAkmBnMMA%pS<>EiyXmuAwhPw9LV:M:QkBS6@V6Py&VD
SkIT9t y&9LuG@wuhhIhwH%=\Xn@Je^Q><n9ZpR&Vd?n?yX@H<u9jpjH=F=l%:GEpl%AK:i?IpyVJ:TVZjF6KYB
6I*!Vp N?*k!CZZ1waWw/tayjTla\HN%be8ZByTH?KGciJTda6/HXEuD+Gd+^QI&QMLTlV?JT^CRR1m=ly4/DdZ
HTNA>C WA5u!GMluh:#4p9PdX+S%Aqw*!WJ9!J8>*WQb%?/hJF9=<\JSd1FiRX%=n%Q=@D+Z8TjkKjlt::4+6iD
KZ65^w u+tTtuHR>PK9JdET6td!c/D%/HE9F^VY1ci>/15\1+&WMeRyKI6I/IVkB$a$Z>hG#R?EjQ4&QH?Ed=8?
=9^nC< e!Rhw&WiJih@I+pRl^9pG@VSVe1\yZjV=?^p:Q\&=?MQ?^cqYNEWnXTq>$w1$B1Ki$^wk+>L=ST/<*ej
Z1/&lh nSRQ5uXCNlj#$TmG8p?TJMV:8>ZK&@h>wJTu%!D:@<Z:nnZy8^Xh@k!wi\cWIqk@V^#j=J^SEF>E<&?T
yCMtj4 +\#*LC<aj=nJc$qVi%%=8lYuq1#&#yR:%6n@/kSBZHJi6TZ8/+1nEiPnuGCa95RJD8+NSK#<IFGySVNP
i5\X69 c1&8Lqu:ZLE\uG&QCFM4iT6yLh*?uP*NGeWWVk9Ru9JyQ6iEKST#\Njh15Z@EK#4$5NPPpW$RXMu/haa
cll!$C KlkN>\V@kb8BD=ZdBhM!m!9*knmG><T+9V=nV6^b$=JZI1&kdCFEnAmYP\y/XZhKM!tlt:c\n^B&WYX+
-AC++4 000e19fd017001202b4 Page 79 of binaries2.zip
VbeZXE BX+=Fu&1RZpkTCu6<a*ANPlnwJP=^9np9h^+h:lC4&58qq$R8Gh&mYjYd#4L6hB=lnaiFQI<J^m>F\Na
/e4*^= TayJwi1*@nZwhQL%:\IF@Suc/@IZX$Sb/#*q1kpB9b8tK8BNc+>#BMbdC^p%%&ppe:bBW:TPVe$q=FJV
4\Fttj $qt8/jSPPyb&GDD/XVTqK::6e:jG1j>Ad6c>P9^*4hjd=/tVSR*bmp?6u$K+e>Tu55hQ5aEDq^#Ie=8N
dHY:a4 +V1^:+E%<p%V>Hb<uWh/iCM+#nHn:y6G/6Nj9dGNc%h4=4*$:4&=dua=m/SVND+J>l+/VRcFGS6IlmdV
kZEXZj 9CPEA4Gyw&8Q<KSY*?^CQF*Km:Q6CmH+:HdmXHR<lubAb$yQ9+%@yXp#FAWbDhZWyTycKqJT%It%XLL/
!V!a/E !TJ$4emte<&N@!4T/StkWnhqmi<>X6meGNtwKRmX5HTk+d!Clw*Bt=4KpB6P*hw8LSHFBJt\=CLEKXFB
D!&9<c @EcAPEa/81ZKHH4bwIy1VZ!KMiQ!6b%y?8bX%teLZmRNJp>/mE*R&t14!:%n:=&6:\H/*qQb&?jyw=\T
PN\p>u i9/W9ch+S6@DFP^D?TJLJ&FR6GM5#ALb5LF84$KKZ$KVw81?QXF#Vy:YT1<Vb8yPu9$/d>PIT9qA$814
X9=?$t uI<%l!iCDbcwI?>eKP#edP5FdiQHW^IVl>ujy#ta!:@FbSh6nhmXqh^kHG/lDS1PJWlk5Lt9nAk>:>Xy
:!y@EX y@pt@%CRWjLRK@$MRPQE@jb#n&9QK9@DhP&ul$Li:!^@8&Zbii^:CL=MyjdZ=?W*ktT4d1t+@S8GW<PY
55=55l h$Ecb8F>bpBB6?Cby?56#MjFQt@yL@e6P4:h&4/#Z6T##1>h*l&>G+uWu1kXy!j:1ne@djJiTwbI=5yY
e4C=cW PFa9!@W51IW+NaWhXh:c8paNn<!eSQYh:>jZEZNkA!$\!XAJ^BEjd\*:MmAVDl$Q=c$<mjamV4BijZYZ
@d!lC? S1ScRH8KW\ppRBZW8+YjH&1VjV@d6II98@>PZ*=Ktai?5!&?JDdbqu*#SN@uiw%m>H6Wph^:l>cTyidj
PlC4qj JA\^a+i$*Qb@9CN+#*!wZ!FIXD=ebS%eEN=ZMiS6/G>4XQkI:lj@e<pNPA=4X/96lQM?CE?tD4apmT<P
&djK%$ *eRlLI<c>H\+*=KdZydYuJ1YdWN\aNGSHD6b?Pcy95q!!e8hGQm*N?B=N591qVdZ:LL8!1I88M%aDc1N
L\@np1 1^y/lbiR@ZJ+6CA@4b$1/I^B&<I6*N8mYI>?KBa>Xt&FGw=\YGWk5h^/%KJ=VTB995#nN=ZF&F5/8@8c
$u<hc\ CQN#HbH:wBdWStLND?l>MRw6cHcR1u!JHD<W5&@j@8Nu<Xe:Ce$@SdnM^qKVM>t5u?hQF9>S8A9?eq9I
XDPC#! t?5J*D%eD$Vht=^eY+&E5:SV$XT\wkWX\t1i6T^=IRbR+#?VX#Y<WP:*e8SdT%ipMQ4yh+8cTAyc9R:6
L6<Mk= J5<ulVpC5X/DLbh+Gp*+GCCEJHCeXV%1#Lqiba!d86:ZwKk1Iu$l/$*LQb59Stn<=4J#HZWj@Gu5R<lZ
&h/jGW ^T#Y4QK%>lD8JIZmQWeq%Z9Z*@R!q%\4:N8<Lw?MPK1QC//4?$nC?p^q@ChatHI*S?dL5?l!9tGM1H$4
Ywbi/n cy?TTiA%=/Zm4wDpnt&cRXZL<+i!Cyi?T>+y14h1yWlR*k@jnQXZ&mnGL5@@lD6p$Vp/kT1=p=4t9L^j
>TMe4t R^W>LG+AwR9!A=R4#>cRTC^/unXDNdjQ&?bKy:^:b/jlyP*B5P$ta1!mTZAEh^Fe\6C&8X4<$^XpWM8=
\M:wT@ m1b?VDc:b9%!b>u$DCnW=D?8aC?4>l%SLZppq*\GtGy?puX/$14/8WYX@$E:htmXe#u:e#Aqyu\Z%i!W
p*=Nq> j!5bYmF@L=d+NN#ktdH*$KVqP\ZK8XHN?du@:jnQDVV?dMDmL\*WQJJ>@95G84:j*DeZtDwa<*/6nhlp
IXXPum C^@Yq5CF^8TS@MC>kjMj^@q%*8yVdIBy^1w4Bwl=+EJEX?ySdbY9+KGRk@qI1iWDdA>C/$=MS%dA%=k?
TDQLdl ^YV@H%JjB+i8Ai6$Ft4n@GJV$C$SVXid$+9au?lE+=AZck:kj8+w%?+FE=@KN^Ydcmwy5%ehiXW@PIiM
nE<+5B >qGpA?AwB1y%c4BKl6\NS11p+A+@&#uGDE&$9qPteBS:Bql!G68p?*:JI*pGQE>qWV:Em&M!>jdREI=A
8hN$81 YlW4Ku/ldRNe1jE5P&\/cLm<G#FQRLC@EMbFIFR<GC$9=/I6H\JA$H4Lce>e5cJWnql4ct:EnBZ5>aZA
hFahww d#jMY4IVQYt\ZB$VZ+/+QRQICAmw$&^I>S!:ujC96mh1mV$GpX^ZImK6<qGE>>u5yt6>S^nYH5K5%$wM
VGaeie j68KhN/lLudKCV+D/F6<L$pdjN+HQtu?>Pt&le$i8YEi/4<?A+bC^8=hWi=Mj#/C<Wk=#>MH^H?L:Q+L
ejI++/ M86*pEQj5<:W9w@ej+mBK>C+?4n?lh+WTlQhD&N6k!MJ#8uc\5KKjpCn+L=\j^*!GTAiLpne41Za#R5e
TeI^4? j=4d6jyAEiy51ZAJWZ9BRZCI5$y<j9RHSpn\>>AH4n?RS9K<N=+B!J*j%QA5J1Wl=S1P?<6yBbeC8:Jm
\+bkBi hjc#Vh6c5\a4Q1Y^jL#*Z=\5iMMmWwb486ZDHp%RJDZ9%PH:QMQBy@XNW1lpFGtwBn5^/hPJTZN=1RGa
/d&*\W J1Hpp!LYM4SHw8C5T%@&K1<kYbMLZ=RJ%9wAhiVt^kZV:1ceV8nm%1DuP1hZ!&/1l+=HeK8EVylkQQmq
S1cN:! ucKA@dajRw8WF/u/G5Tln<a*$N\#+PQeK\6lCW!/64l/iu<h:Hk*aSLR#k@!8tIp8#h*\Tet$T/CNm\6
aA1aNW FFhttXFTBqeyFFmCEwYQi+!5Q6E!aub$HnFHEdJXVnGe^8u1TjuFuEwKTARdm^cK$\jL:CqiI&Qy4DjP
%J14DK JnHM>cBkDd?X:W&C5G*6+=niG4?KN\!HKYw*#RjqH!Q6l!RVXKHpaeVZa:D4YwA+^<ppSEtImB*c*\RI
h*lXYn ^h1:NdFpVbInWFMXW>VwEXVGa#8hIYw@<&WTHRP^blm^QSATpwwWWTSG@LIPHqdWd#e>p#DpnIF&jc>W
yHtW:q DLmt?/LA4lHPWG=hjtQ8QM?tiA9>/H$m<6&6ZFQwPH<GlP4jXYAH#J%T6P+wnCFW?1LYpE<qeiLQ&LC1
MYqGj> ZD:XMu14\Wm%S=YyElcc!kH5+$iIk#??#jyV=c@u8Y>Q%w5NXW<m9wQTG5?AKDVj9tXP%d$j<@\QJ4/*
??EH65 <Z%P9@*P>*u?=<?I<=+Bk*c!Q=iNW9:6#d%jMIFaPH=HtjK*BJh@K%Q?n!6V\mD>#!qVukZBWWGNY8:T
ZuJ+8i M95y$=M&pHayeLJ6$Yull9kL:E>#C5ay#Akikwa^PT9ZV%GSnW9:YcPNcT+Q8GJ1MS8bL8yZw1nyce@n
DpG#wS kGBl6lZFG:XtmhCTtPEA^nnM@EFthD>DGEHtYkY!=1&GyQtw?1$WVBSGFqbkYKDEKA5TPa$YBchk?<Lw
Z8mBX+ KLuBA65HbRSiaVapZDNM1E$KI?\=NTIVXLptPuFkNGPe6tJV%JkyFp6kwS=Zw@XJIcdcuKw<p&AD:Jq<
RwR+Nu MByW>8\mt+5apRmVcc1NS4^y5M*CyPuMPIj1:Vm:?llhyN5mY@TYn$\9iVKDkS1QKi@4FK<E*FB/>%I!
Vwyy+F wLWNEZmha%T*VQ&56J%11!!W4wdtN+VM6<9S4R9L<>li4:/\8B!Bb1Nc69SYh1bYCQSn!aP4*LjbGXw!
S1BqXl >ic?%5FE1WtL\\VQI&wm5JCP$mqDK<NYKi#bS4jp45!tlMXa6HAwFCNnajqYB&Ni=:Cae:AXMm@P<jq1
CutAGa 5mhDcDCbe?4tMJm#NZuaYdbAiVS!VA?n$pJyqN6SD$&qeK^ApTcJc1t=JQICq<dIM+%*$Yj9twJ^Yh*:
p\ZH@W HIG?:I&Z>N8CMI$KduVa?8F9>Np9PaHKNXdplB<?1/Tcd!!Q!tF&P>/\@wn8cqV#>y*?<PlWPAYJR?!?
:6pBD^ ac$#+qabjVNR!PZ?DZaZ&MK:*a1>tPHM&&G^lpm<IeN#c<\mm!F96Z4>XWQ^=K$?=hi8/AKWdK9qd#X8
uqkhMp hy>:ATYw@aKBPA=!9K$b!4ah*bI%=k!wM*kq&=eahbZt$S?\&ZeQIJYN:AZLQ^?TN+=QRmC?<nt/d1Ac
:Fi+bS \9?8E%l9k%k=IT^1Nw#ZY^$5tB^I@$$jpWBa*/+&CyMNK@hl$wuV*D?FlKGS^*JD&TYIhlPQwbWA*l?e
=Y8GTc %94IJ1X69!*\1*c4th$JMFRDj+YMQFnMH1?9hWctTEAbD^ybenB9^!RMei6nBQVF>/+>E?hwHXe%5\DM
PWy<%X 11CtX+Z+y>yueQ46X#&#lL*jatH49uKqw:>N9uZtLQbDlX=EHNbNtNNHMq*4XY8ktt@MpdQ<QJjXt^Ww
F8ZCV@ 5+GPHH@BIyTwTWayEteqB/*C&:XQ$A%bEW@md$*@VbC<WIdZEDq5RpaJNJ+iFcXih\Qj#nGVue5hDR%X
Z\uq=u NmBPat&Auk@94BV>6wKC^\L%Y:GZ:aiMVNiHHtR@i!5W^A%^J&b#ckI6Gyw/J*!+cSkFT!*&TN/YD:k?
XtcyYc #6kT%F\KccnM4SLu%Litd*eDQAQC&y#\Lipk\jB>PqN%aCFiN:5KlpRG?G$IJ^4RC>a?SZ\=F*DcI1mR
ajdtyA Fy\6b*HNKu%j%=F9H\T5DGPSG>5Pi4>j=>CRRThFMF%kcQ8KLh%T?DWydZ$J@Pn5yQ4KnD@aPey4#:LK
Py8t&l LWGy$5pJFJB4lyIYLh+l@H1PYZ&T/t/\%1TT+Z9dDM\J@NJIFQ?JQPi^waCRBQN^I:j1tXpd:8H1jhMA
XqaDZG ?4Ve#!#14WKyib?#1pkCa1aP@XI6cEkRb%#LFmXQc#R^=<9CcIh#F#=4SWNblChdA&iZ?YBy/%wk5bBu
dHa9Z> Fid>yY%a$S88%BL/QqP?QY=!dc/k4J$N*eZC$LZId&1nd>#T1yuj#pJWbM:8=Bl:&$6nl6!an!bp54SN
9@hl$L kL+kM!6Z&p4S/LV6@at>&HWRSt5QXn@N5I&NNKF/H+FN^nnTGJdwhbE!@hqlayFP*8KNS4D:\d+Yjai5
$HZIpV tT+$#9q%Bn1Kd/5\iAl:Q1/iyWZ1imBAkB+KVqeX8mPJh/Pn1LFK!+uP*dq:pS1t<H:TB^ZS+YLL5M*#
T&Zqy% Rni4nVN*nIX9i!\<B>?\F=T?dmmmF+aMd1YJ$LVL8C^KkK4k%6W1=D?+Eth%:p+!ZD?DYa#FC>J!=elw
qMk5^Y ucedKwEAjQXKhw6=Q%INA#wH&uI+!:!&&?N+?F:4=>lXN6:B&!JulcGe/*#d!WJF!QZE5y*4%bw$p#?w
!/Ph%> hbANLY#^$?KTK!%w=*kGVNQmmYDFGekZ*#%L>NMZF!am8^uH5Smyu$kYHn*Ak^hWJCcwdlRhltJAPI!=
J&/*EJ lZ@m!J$YtFJ8ByhH1?In^u#K\$V*W!l$^+FkbqQ*L=ieEX<wjp%P\I:/Pm4Vq1imKPEYup!1IF6>jHGF
@kjBwa QGq=I%AB15!elnFV*$5+tL4=eAC*wn#W\!KS&RkN8!nZ!A<^IXI%C%HJS1B$!?e6hM$/kReDFHAEKb$L
GEb$DD JbTGn%+b^kNZ9@%Ib8bPKSVRM?E?B^>wWF#JDqVELLHETAl>DhNQNVqA#nq5<SAcJe<wDJ>H1^YNHMZm
Y%4J#d JBGP5\>?5RQ\w!\^%=@kmQk$ky&S#EdH$?/BLE?:9wAjGQm1N!5SnTEL\+bmG%/%8@5ym>cT5FhliqEY
nqShRN qmS5=lX+:TwaaZeJlD<l@pQ4n:nLD#\p+j=C&M$^%uMiLILSCAP+\nN1E=4?YYY94cL\R/N\M$ZJ64#t
+bSL>m ZAi+5C5d5/\M9!yZ&F*q1!i=/Sk4>uB!jNKVdL:IqTdcTP+Icl#Hn<<Q9S^dF?p1#51Y?:FA%SG<a61^
-Ae=:l 0004e4ad634001202b4 Page 80 of binaries2.zip
@L5MaH qlHjYdN1!55Wb+5+\==>TnVMLwipTjmnWYT+iwu+l=6j%llajt=^?%+VGTYKXtJQTt5bC@R*SVY?jn9B
&u1w6@ 1\l*l9QX5%qIEqecH5/yamM4&Dmu&Hk@:tiR^wQ5Xj#J9dk\K1$aCeXbHQVt9yE=/q$@9hmaHt#ZFPIS
eTcp1e hle6QFTyn&D$HBSA!>HQBtAK!b*9LL=8QSPH8#cIK&BT98bZmmSm96CLKhLDdERGcYcT\ENl9S/&4dT@
dWRYIe *ppSCp+nBWKq<VI\WSPVT+\TlSDllClWl%nZEk:J1ADp4kc>kh8tZR&Nah%LMBGPKWcNA+Z/cJ?H/hV&
BZmdlM yEd!I=4=YC1$m<d\NP#VIR:Q4iZLGEEkH/H8H=tnT6lqZ@XlIkRbcJ%X4$c95IlHua>K^IXeYawI1EtY
tDPmR# c&#9blWH1RteI@ky4XXF!E<a$b=LpB8DwHwpwLiL4^VeHRLy1iYX=yA%19b>d1ChSY&5Be9ljWR:B5+5
LNKR:Z G+en6CA*c*aEPLj$Dw4S5GK%@L@wFSpL4Y^4\QWtiVna+McGWbEqHXbZu=^CweA%L1P?MyLXP>&@d!=c
beRYC9 \+Nd?PSkK@9GhkGbu6Zm54*aRQBRwcBAETDceauAX!kiXXA%\Hd+FT<Zp^6en+4PkMwQ$%Fw*VJjDHwe
!pDhGA wJDQB<QEIY/MTtMWRdQX!GCTT4\Jk81!bLVhI5pZebTNJ^eF=^XcwVjAyEJ@SYYESkKbAASapMV#pDmm
R/HR4& pJJ%pkbEE#6TLEIeB$!^p#uTpSk=D+dXT?RG\bGN$?TcRQiM\\EELQQHj!NWGa@V4@?JWNZqN+CaG+M5
EuN:m= A!RFJMD/CSDpntIJuNE#>>M:j1dQNTPwd<j#V<NkZtTw@<y\8aJ<?aYB>JqB/aV^<wJ^k+XScRK^P=&^
!849t8 @lkK<QwN<:e*nu69ykF+jkG\LJB+jtBM*$njKN$^Jl#Dp5w#?RH\<$SbuNkA/CjA1S>9L5?auAmJTT6A
VMIy^^ *<kbqAYbE!+BGDL+DT^5GQ#MVtmM*&BADjK5GMT5!lakbRmkp!+:m^!tMm?D$#5t=qtkemA4Bm6Hk#yd
LHCDHY k^kWSmwdSmb:Ik4:NAGV5k+^!\j8SFPP/S4GBl!tBl^tnDE&y%+tbWawDC!tSD6kR!^9dmCD<mD9=RZu
HJcKy9 N%E?J#1tSDm8cYEk^nYV$^%@\\WVCIyj?ReQ^4MkCEMk:%u\mqRISCpEq5:imCjw4\4eWSh&=lS8=FE%
q$1J?j 1GDAFBX^qlSyqPG/>ANVE1TAcCGn1kAVy+D88caMeQauk+d8TcSP+KWTecWYK:>H6!SZeYS$%15kW<Vw
mZA!e> Ejt#yPWM4N<19SA1Ceu9?#1e@+<^6VlJ@yVE@p>#5$DAj=Gd^ja:+yX5@/S+JT9Hu^R1YVu@n1V%y#V>
Z/64kV 9!eAkH/HljFuje>@1FDJDGJ?Cb1N/ShwqyikRd>Ck%/Ab8Z<BXpJ^QwTNQ89$G\9RdQ?C5*?EnVL4>Ae
69@%dL L$EDj<H+AZG?AA*m?MX+5\JjkGbl?kZFm@Wqe+*=X<R+%yjMNYd&Z/FjM6iaj$YMa**JZQ5%Ra#%JbQ6
aY4un4 6$b?H@&T!jbL1lQ4m!ddL&SB@&lQ@wIY@IQ^W@=y@?^W:H:mSWni!HI\enK!MHF!enA!tb5ctnC1Pqua
y!MPIQ 9tXWEFhkXLi\N&X$6tM$MdW&hVbqNLP\@tut*wmS$Q#&yd&J&i5@GNaZMy6?tt$t$B?WMXma&X:CdGLq
6@Tp?X @F@S<=?#tRZIVMLM^9/HQ@CCn4MB@=/TBRL?a$4Yu=W#@pDJa8j+HWwY&??WDGJlb?Z+9%A!KJV5@*LJ
\&HMi^ IApecB8F9!$bNF!?n@pWkwVjX\<FX14VTIGkEauit!i%#+XaWY6E$I5Rb+WhVHh%&DG?ycHM^Wmcy5D#
1%wqnE =d^4D^cc%E?BF#EQMQwSK1>Lkj$L9j6Tw=\@=DEt>Ljl8j$kmN^XXGnDkES=iX5JBTbFVIWD1cw+A\X5
pkhbE9 wR*AG1e!PV%QNBVYP@#?CbXkT5RkCCIkJ4ClhW?jce8dEZ8c=S1APcFC!TJd%jTwLV4b8DDGM/YGST$>
<8iiKY :mJ#tnkLl$A#\kbtd+$jmp+:6R%$yCpqE*lNAjbt^HIFnqqFZ5GSRJ:qE/mn!5XAcXC>iekEW&dDF5qq
h#L9^R TQ*>tu5R\tFHJ=>/@&%NCB^5&S5/5KAK<MyY5l?mSnTHe^VhmWY8k*$5lcam\hnMQ:mEBbN%Z?t$<q^^
4NuIY1 mXyJE?h1*Rw616e$a4<VXeLEV5NVEIRWSlc$$m5S6ED6j%$<%5c1%BS#qE!b9=H?Ci8>klb>AcJCyC^W
bA/Fl* #YGKMFTkheWJbep^l%qLK%A:a$eRYCF#JkG6lu@Zhy+ZhewpLmn!?IHJT8ck6VCV/F&d=ehhb#!=\PIb
!5I/SI VPSq$EZ!jN5yGb/Ii#+1LbRC54D*KILKIIS!YwTkyBuCEVHe?LE$e56dFlQYKpQZnPp^/@d^!B\ty^ui
wKL>KC jWmI<W+8=Dd5#<EHI$L#/?4N@BXHm=lBH+R%n8qiMTEb$*\:<YJ@M+TKYMhQ\!GE+LXVDhRIlM#*B&nK
De^NpI \56iXcyHjW?$kpc5&Vt9AmlEVLe=9I5^=$46B=T1<cA!\q8RXM<^65ipS<QRLea!K%pQDVhR/w@twiJR
>8w+@l a5amiK+b!YZ%RQj4*c*=&*mhh&FCD:tQJ&@JiG$WTjG=Fd?j#ZPGSNy^#G@CnMw5H:A?/\L%F4>/AHjt
PkA4h% ec:YHP:MXTyMLkm^GwALVVWN$auWuw8KJIQAV5L5tY:@/V>j\JZ9#/PR5&RIK>J$<Nt9B&<</EPBFiNS
iWAC%y &$?nw8GVi5I!DAw58FabL>DE%ZPGytJA/<1k#\jt9q=+p\TDRGd<%4hPwKuTbB?jyBjSa@<p8LWE@G6i
Nq6E#! by#\1i!V\P:t4KyIZy^lLS8@cE#+mJi9@=BkKT+qST^G@68wT=9IN%DdmBF*m!a!HpC5Eq6N\Y+**&GS
?NM9qp wkC@WIT<+%BH$pyW!P>pMR4LV+q9=XD1$uM@?^eR/VNPMu!?G5LCMKIL8MnFlAL$Ipjtieq6>HlLBp#q
yKjJbb ^&q/1kHHyWtDlHaXA6<lJeDXqDnVh\hmaWGlLIcR^1$VR6Aa!puVNFI:j&GlNlq@Q&44ulkt=b6c4!eD
1GKTpt #YaXEADMRI/npdWWbi6\Z4>AcJnJmWDLim%!6YZ$dTd&+yMkDHBQcj$hRqVbdlAM<&dayI6TePPFR9/H
Vc&8Xp X$HqW@*=#pJ\Djq#Piq>P?KWW+uX9Y\j!=V^wVGpW4qy=GZ!XFu>=BS4P8\Q:=KGdEQntYRG=%=6cMlT
pSA4dE PwwPM=b!+&HSM?Mm^c8^>u4RBt?4AJCallG^W+k^K5%J+J$5?&k@at+j6^HdM8u=cElC>$#5t>SW<5&4
BhM4?# #RT=K#F^RXMEqT*Ze>lILICk?\\I1ND@WMGI$:++SX=M\H*DbJ<^6t&T@%!SiEa%MZqnmlV*B%6\+bJI
j^kZMt C+WtSXEAy+h!?nVdhD?6n6PSS<I$TjX*IC+El#\CPKKn>#H&Wh+:MJLNyb*+<FXT4XT6<m1S!mayC%YJ
X!>NuC MQNRRen/AN1=J$&<IP*ndCm=<9K^5w<MaQVj>4%8AmVYdn&\+94mNR<9!Yy96@HPnh#/VV8ti5*u<P*d
:MhdJm iWQ>@N1dJJ5mIMRwE>qAIG$PV##!AiF?*C6<&X^BKM5bBRZFYj#8+SWF>T!!wMkh^nXy4</9ZadSbbM/
59A=yC G65H^E6^hpKL<h5q\XmCGC+%d^EQbEKl?knttHeRt#k%?KEKM/X#:i^wJiH/!y=k\hG6K=*J?WN$ehL>
ZcPN4< BSmkKC6j=>j9+/1V5\FFc=kDaKm#W+4nILH+^c8c$&cTA=dX#Z6Ml8hb?Tl5W<cqcD1p\>ty=T6IVGVm
p+SS6& uyZX$l1ub\Ta#m*PYX\wCFZwDkM6</EFVaBQK?Y9A?\T5eyMFmbIbBncuHuDT*JH:>kC4$T8:w^QACNN
/mJ\yZ $5EaDN>QiHq85!<kiQBuQF154ctPnY?CEPh9PM5:bu\#NcI6XMEI:MZcedZY14Tt+Yw=dQM*eN&^Y%!=
4K$aD> 6m64D5@X8?58k@&=bhNcV&!:SYR$Y?/C=?\FWM&a/:cl#q8cL6i!ydXR*$b<Lyac5/nIRQhG#E9mEC+h
6JPIHI #$G#ltdRCHnn#F$*TePCmAleNV:a?<4BupP!j!ZH/ET>>YXY\Rn^E$9ema9#BSk$ucIaX8kp8%D\ja8!
DbEp>E R6HAGI&11!/mNMjlA9Rbnh:Y\9R\\@EMjW8^B$F!Auc4Th9bG+jCIc!XKQ!ne*HAw9QXZZ/:VBMX#<a+
LwJ1b> 586=*MAQu*he$NB8ZR?9LAMY9k\wB/SRViX%F4qkWuELuQDwbHA@w6BP=!&8TWMcn66<@d!^:\G?kb\l
kZ!\Cj =ipX/e*Ln/K5wm5W9jcqJ%/RqiC58e6Tuy:*WtC\BPFl$M@qRbblttDj!?ZTZ&qYWH6YSI5\TTmk$pw%
eqypV: 8L:HQumtEFB&luG>^/AIaMF<1EL>6KpmmlqFXX:?bj>8MA#S%P9N\S*kLM/J6qwa=adJbt+4X/AeE96K
#Pt@$L kpwJG6Hk6epMJEewdi=V#bVZt*Pl6?MmnLXJNcMXZ$1Sh8w*pL6!wtp*lDT$aq>Dw@IF&A8y:kNeQuQ<
ci8PJ> CBHaHNtuPdSWQJW/RP::S5Ewc8IKCWn^H6eRSw$=CXwcmLp$LRVYtP!HFXG<i*%:X^&mYG%bV8E1bFpH
%>l\#1 6:h$8ke/m6H^l8THq&9>9IZdYRwGJ^i*4bDdNw#86kZJGA#:=u#CdH9@N8lWi#jGc!AYMcdcTWwRRd4/
>w+9hy #LS6W?4+R=iBH4^qW>hWclSbua^4LI$:M5ul5CR\:Rk+bS@ZS^?%jy4kIdS/L:+>eMTlmkl1SHV%LtSE
XRS#qS aRSj@ttu\KiT=G?FV*d:/CW!FVtEn5m^EIMmw%^XEekT1KY^yJw>\<u/wRn4FBu:VlFXaV$\Ejt^=TRm
B!QGQK \:$T>4enFJWW4B%:>>$dKI:RpYpe?t?C^4^Ki=:B^Cb<+:nKIiCX^Eup+kR1T>G\WIuBcl/5?n5lcm:q
m+KHPd Bjck=MejJklIAc6Q6dLkeEDQ?QZeTRe!XAuD>aFTTm\T&6!T#hXVCnGN\h\uYp@D@iai!//TCYE!W%iL
Gy+\IY L+hQ>SBa1ELcP!!9JQWiFKi1^8^qAPb/R=wp=/cp+8GpCaS?>kVpIp!p1LRMWWb&JbC*heh^myilla8R
&I/#$/ #CJ?cE@QNW8bb8W:MC^WwV*!TnGBTE5XC9nZ8\+p1BTh<d9jk@dJqE4AckuIhyCkD+iekJlRRT^kTn^R
h8J<mF WI!i/N!R#Q6mZ!\:R!Ckcw:F14pba=6k!unSlc:Sm%A>wFS5aG8a*&=cDRhCF!ihWldLJVC4\ae^:V<=
IS!uPX $/T!RIeFGAm!IlmC#mM1niaPI/aR!iFqn&:D/l<P4P=aAAPILIc$McEk<!5hKM?T:aM**!RWe9hXKMXb
##^hcA nLHq@GcR9nFBl66jw!<CakM1h:F91N>\Y#SH4Eh#V#6\V8PjT??kK>KMkk<*YFANDX$PYL@1qRm4pPbI
wpbG&m wKjwk*@\S\VSSwYE^t5mMPpwY*Z5$SQn:D<IHVP9n/LZ%bmNk&D:aV*\Z4P%FN!\RXlC:<nRmJ//!4ed
$ePD\n H^%S>\$NFyD=n+mq&Rl>G?Y!SnVwDAKb!X*t:aR\$YNBRh6:>b&mpK!H!c+PY^5kVydH%411T1VFnRtL
L\$Y@I T?W*STkKZVGQWB=YN@JIS%kKm+m>ChlQp=>BwpwLq**+HEXnISESA>\Ch!+WK<I*FX4NBFF%RKRypnEH
4StQI$ GWHTkNmFS/KCAblGWCB+9^p1k!kiIj5Y+ZEcqh^Q=EIPbFJe=N6<keej!BM?PQNIMXGaDF9PRb+YmEc5
VpWTCR VD6@ER%:5mARyA1+M^9PE!E^*A*4D5dW*K8NkjX$qulYNmYkkeP@K!XpyM/XkF>yF^/kFptVFAyYy<mm
-AL^kM 0006823bf05001202b4 Page 81 of binaries2.zip
\qDekq bCX$CSyV:K9<6Fue\WlHXP6VZFBeA4tjNa#eh6wla661k%CCBekF$44DI#*CZWRXuH=Hlauah&FWW8%G
4mNGT# m%q>L%NhbLpLt6tWN6:i9CdqFXDIkLe**QPM4=Y+VFR!DNk$/M1NW/%XWH%Tp8Z4edahy&#kK4#!KAuy
YSSIh= a:$ML5PjEDW9FW9/R4c9BKilW8Q8<pct@\$6A%BH:kdZTiTl#bXLIT\yh95$n*/:*MH4wa\^qBL<I<&b
P::FP1 eVN>@Km!+aGZ*N:^6Ql+dH$9?FDWXmGD6M!YjkXl8IJ:ESYVbJm+=Penbtk=tWRyiYSn&CLTX:V6F6Py
Qn+@bE HMwPdIXA=MPGN^lcK6J*EQ$I:N<$XAX$tew!LeyYnXN!?d@ACje<FBiRuSXPkQ\W+M+q4ubD=N?wMwAI
+YmIAb ^X<Vw+SSMSTZI?X9M1a<yeA\1\ZYC$P11kLYwFIltX!VLKVFlEMt<1BK$@J@PIpAG!$C^tpHGHbRGZd$
ARjL\J FKT6YTBA9+kc5@*n?q:@jLV+=jFk6u?%XleH$*?PB@>FLjPF<YB&%n@Fk>ub@!+i@Kea\Z?KQ9^PyI8N
\Y:>k9 =cZ^aDdYF/BB:L<IXdG^9RRN?pYwmw*>JYmtZ\Vb&DlikGd=be<=Z+L?Xdp^h8AL$L?PL4I#9YVIjqXu
:X&L@^ nb*=SX*@^aC#5:^w\H<SXtWH@djR9%>I/d?<\A9DnT!ej=BLb8Fkj1qeMn9dQ*#KYaA5@@pyb\H?=%Mj
!wclyl F8BLVu*??Bl#@9=n#Q/:I5X@:PX@4C9&#$yJ@/dF@F5Hj#8HaGFmihG>+jn:mCddC+yM5j&6MDDu:$W$
\bbk=# &Vu@?TJVHH<yM9WV@bemW#>9%:>WbI1hqju@ZYZkPpDD@@<WthL:uTJVhwnHq=\8FhlJG/F@4KBp>8eK
?/dKKG T5!hZjk\n>1k#u5B?j8!%D>WkX4<e^YwtuNw@&iA&6mdy#mMy*K#b\DAuQnci8wbeADGj%m5@!>e/6QL
i?+A*? L5Z!QJH&l<JQ#Sb@LQ#$=kE5%*i&RjwbWAn=DClQ%@>Djc1M*/%h%jpjit*/#%:uL%$YP^6cR9yW?S&l
#yi>cl /MA$Q*wd5EAJy<4\>DA$iG5*$quCT##Jqy%#G*4+\I8=6j<We9%I1*#5tWQEu?u%@p:=ejjnM!C1>lp\
ncP4i! R%V6?#^=>HF*ni&8bc#D=y6hy6j!:lyeRiaw8/L+V=5!BVhJGW/l1hp#qNhqXAuqhlJe:^F!R!YT<A!R
+9T9QE W/aDPYAR>SQF#&G9#^aAV4ELLQiiy>JK$5/I<FXtRHQS=B:dDpVhKlEkVT%^%9^TNaI5QC9jcn*8RV9i
%QFiN5 TEq<mqkCWj8wCqIZIhZliGWC:\ZG+i<K?IEYdRp>J5BHI$/GP/lNZLHlEXK1Jn/P*JV:Ze$k=LyCPcZR
ZB8H+n =e=Fn6R=Y\>:>4lAwc?mNHT/6<1Y^y?$l=u8X$ACttNm\^@SjbBulqq$a*\QHIlq$DjM?/C1ZPGPHcd+
6iCBVP ClD%NbkLe9N!X*Qn?JQeN=eCucb55=N&:ElL^8CG*n!CmG>bjL>GW4=TjRb+XD<D68n=4&G5Rlijy+@T
l%c81w @=n?9cB9e@%D&y\B1q!CaXNCJL9#qSA4*El5waYYe$@@BPpGw4LFmANYa#SDwiQKnJDtJ!GMKF1Jue+?
GkB&\+ ii9JP<eiGt@aK@M=e5\+LwRQNBhT?i\^<wFdimSk\+$uPe<#?@m81ji$FpY%$!q9NNHb=C5VG5XV6GIW
^1JjIj MhR<F81w9ZCR19w!Tk=iV^wm&N4M5jw16YhJcLW4JY%F^:!6#>k\ChDpqWTwEMpKl49wYtFA>MKjP$tn
PHLkMc i%P1:DVebLac*EHiwZ@QIVtl4i99RCD!DQl+*J>S+NPJN%ylAl=w/8^iA*Z:?l#e9DnW6>HH?$LVFnJq
@*y14/ VTXpd5NKwH*Cn/b41wtD/p:KAwjt1>ym>%*a8GDuRi+#wD9#/XmV=4Lt^=ndM\DQ<BqR!1*DN=d#QH8p
\hbGt5 NIKJ%n:NNaly$DC$VX5i@huIFYCEWta^ta18&%NM>b4GA6ZBwGm+Tc/Qluwu?X=i>kyyjy:p9yWYedZe
kZm:J! Ht4YSHC+<Vb?NnTMbA8=wTAE%kZBaLRj@H=!yn=GJ6j^EH4dcPC?V*I@M!&w/QGN@I!i#n=BMJ&iCm>V
h*u:1d b&Hn1Sq@Xi<lNI*!nNRqqL?YimqV!+wZEMSuPFETNwbhaG%MGG=M!\DPGb/=Td/^ZcliDJiwPL%lqKk4
#P>Knj VEBHaX%DXwbC5l$l!K9lVHR^>5+p5cymScRF$d&TewaV6CQRXCN:Eck<4XG4*R1u:y+Gy&^Bn8ZM@XkE
&?Amyd +dCMu1w>SiKu!*9MF!kSF/:aY%NGAwXhyyjuj&e*nhp\/:^<P/ZNZd14n1kiCb<n+@eMkF9dKK$J<Z&i
BupKPq P/#X%@lKLt*nlDtbY>H8TFhKeC1XKBeK@tWZCj$4Ya18EBnliH#jy1mBqllV<cFej%LEXYt*+y1YLHGF
YRYuTW HdNMbpdj+VZ<AF5J^1I@Ma<cZTVuppmIT*!?LZw=qqH$R!YE6a<:nq1&qVtbqbDH$HF^QGlMJES!Q:+A
aD4juV jNTd!/ZL<%YBl@iwu6lFdRSiCti8qaj!LDPhPIZ%YX9cjYAH<5#Ql!DV+^tAT@pMCCQ<cd1tBb<Bki!Q
w5BNSP C@YKP@LjM</itH8jAR184S=HwlNDj6Fl>F!^JZS#wa@*PijTn@cMSVaY=Sw/F9Ma\TEHmEyyZ!H5dhLA
?dy!5E X<wWt*&j=@iSh5dAV1GYcV&*l/c=luBtLa#N5+bST%tSB\*aKd+Q=DD5?!4q!Ee@$qtFK/qFW\kWVIh\
&cqh1+ m$R^\J?nCXZ$BY:N+&a4Zbb*:@M&K6YW$V>pT:YWeY!iDAH=*&/<kwD1#>6HZZq$yDHTVmSJG/ZkGa$w
\V@G\F Etb^4MDH$Lw?hP6!8JMiwiQ6:/5V6=>uS*I>a1tkTW@@tpbVwp^/yB5RE>E+69$MiJ&&lGaFZ=B+CEdK
FNVA#I $+5/Y9M=YlkL1=@/5mZFFujwZI#/DYLI8ySMi>Wk:Be&I=@BHm>%c@$41lAZuFpVqbTLHa#KBMtS\LC6
F?Rmjl !HZICS9$uDTa&1/KuVj$uk&!Dwl8T4L$mSnewb8tCb4ytNae*>/QweVY=1>6hDJkKN9l*e=bkm4FT?QV
h$S&HE 5IWRyqPL?/*tmT^!#hq\?LWcSMKnHH5t\&tnGuBHW6YMqZ<WEbQK8KTE=l/MMF6eFJY&S9Y@KcJnWEt^
hHBc/T jP^5W1hP%d*ji==+@!dJ1/Ej&*%1L@RXA%&XbRJQh/hd4+<T?n6C=yc//YQ/y=ITV@5?@!AHPD:+n?pc
D$uVCF GapjYhDqhb#y>1XB=SeNe6%ywJ/AVG6\qQc#=X^MyEwlXkTN9Hln?+SWM4aRMc%ii1uDFkE^1adAC\N>
KyBTbP Sw5>tY996*4!tDTZ>e6CW$MlTteHY5T!+kPA5@9#NTYTk>SkCbL8%=D+5dXi#DDQAFtaJ<T%:$cj^bN>
<K!MGZ X/$/d$hRHkYZNkd==X+J1H\#lTk?IXY<9\nbCV!uRq&j1Ku+JG>y@*&kc6$S9B%Sqkb!6wa^y&+%:Tyd
I/PcE\ HCTIki?aQ!\*&QF=t9>=<9CyFlW$VwPST5L?A#JRLl6Z>@14h=h:++l46J<Jk@8\XL!m+4YV<NW/u6hu
\S?J1K N+S:bhHmRYwtaymbYi%$TuCF:y5Q4#G:5h8c/>:Bj1m94@@kH++Aau@KS!?JBH!&Fi6VYB@nXtl6!>+h
MHnT8b 9%!$1daJ5l%P<C^X$6PS<EHLiIDPV#QMbMQR>WkbtNw=$TMINV@h1w9jmp&kG<F$CnWiMWEAqy$IYRnI
\>4?M< \hS>C*u9!%wJZF+yZ\*DZ*WX8X4R/cZ5<bI/chYIJb$lqG!@KGba4>QY@pBq:HB\d$FAF/u*11AAnpd>
NbKK%h i!c^5bd^!eNi<awwa1TNi!#walqYC?KRVlw*uYlYYlGZqhN>98jD<>TB1%a:X*CGuna=&XCImKb:TK+V
W!iCDI eX@=ht#D$%64DK9Tdnj/<$E$Nd?JqQ$8:9:Q=wP&D5DXNQ1L%\wA%8LbJ&w<9=4P4WT*Q^tA=q@djZdc
G8/S:\ L$mwntSCM$V!iB:K=*%IWR!kSN/ptCuWWRJ@LAWAcPjp!YXEt<D=B>e:iIZAe@YNk^@ihSjc+lA\Ih*^
dD?e?T AihRR9C9iW4=*lA1LA@j%QiyXElRFL%#wli%?QdqijwRVh+JW:F9!YdTSFTM%ta+IShe@QZM>C+\bY6E
jucWu: m*X&dHb:CYyES$<YcjV!GXAA#c#6S$:?TF*ES9=J%u=RynqYwlGdDX>&&@Z\W1J8dtXm?IRPVD5:K&$c
&M^A@d 1:/y>bH!ZcppRp<1Yni?KQW4q>Cb:eEyD?#RtYW9=5&%ab@nFi$:?c?bpd/9j>VSHG<Ed!eR8EV95mbQ
du^SQ^ k1j!$R85%Zl%q9hLDPa&l9/I:@QCJQSBcq/&1T>wDKFtF4W6QhbMu\XRjPJMEHm5J88pX@@DXSJEVMVE
CH5?kT IKGZCt1&jm:/l=@NJqNN*m1Vd8?wAVXLwdVCQ?RPb#9Zl4GPDA$ja\GmQtLukXTCPau<ibt4:Ky1EMIR
&pit/@ LtP!ymSY1eA1?m/TFTat#5L%jRiy#y/A9>HN4RN>j&Gl4ZjnILS<48!iAd^%9k1?HD??iRdiDc=q#lCQ
#hYuMR <#&5=n+=jN?>l9pY&<u@e@u&?i6d>qL?LP?:V+IQY&hnl!l:^D=&@\YYAPT*QHaBeZ::DElm?5Qui<>#
VJ>5u# ?@jQkDKGRkR+M#5%1W19!PV:1pFT+8ILwBGZa5m6>k:tXY??PL%CyLc?EJ$@TdL^npP@!Z%jw1V?hcbl
^CqXw% M>E9@=9?*@!*6=^J&8W>Cn\NlRJDSVN\6yAt!anJ8ZcEBQjk#+Au4SQjA/VP+^L&jaSu\J*Xd!^l6thA
H8P>Al jhbc:y6u\E:%@FQe<6P\p+>j=#Mk=cQ?9dDhn>hn@!Z\ij:wQ&J>R<@?6T9>X%%+I9:qbinN8j\PQC#y
&%!6/1 /y+BIn?@HH+E<*$GMLl&ZwY5*TkHi:/Q:m@MJ@n+WcRFndXZ?6wC5$\N:YSk6+u$m*!K:@QEkban4K%b
5aJyic pCVt+WR*q+=IhZ6RNP$FqTRqBa1<#a@Nq4YL#:@=B?nQkD=6p4Y4Ch@%5YiAK*&Tl@4jPk:+u&<aukG:
i5jAn5 #Cn*pVIyj&JGVy:h@appYS84GL+>b>Mne#+%J=WEc@Xn/Q+?+qd*wNF#dK1>mwq6dnD^A6Lue5@PZ?Z6
>:KVIP V^9%@bh6K9?DNl8iy@@e/IL<#*$KWS4@L4d<Hie4HMtjd#:t*AW*Q\MTW#tC9#<+&9:e!$B&ZtB@ib:=
l6+!#u ijPLA=<B$Ha@/p\Kln9QYNeiVEPjep@5=?V4jn+lVHG?M%wtDd>h@?iqj#+Sj&/D89$bEDNK@A&B?mE4
iQVkGF F5H$==89Z^=/qu$@n&TJ@ZnmbQi>CNC@nVRliMyAieD4QP*Qib:L?aj*:dj!R9N@ckFn%ZjRDPW8PQFJ
\5&hin Vn!+@lp\cL9*bGnV8d$#V8:>DCDM:L#6j9MkYw@$6<5t@%?Y#b>L@cGnh/V9ZXVkW@+$=b><q5YG6*<i
:dce@D G6l4knCG/$\uunJWK$&PXIPt^&%988Ai<:h#66q\&K4ae%*%REN>yV&d86TZVRQe4&NEVa*K\^I^*K%+
jYB@H6 aWwDPh4!m\1TZ=/uVwk*dRkiH/pj\uKi!ucjASntc&eH@N5@Qa>4ijddVLFukP@QETKn@8uwiuV&LdH@
MS<8a4 8Ji@R?N@XB=:wy45ZJ9!HRy@Bl^t&%&\SV<>JV/J!D<DXL:=lnjcjd@K8TV#9T@JjJA6<P$5jAdEa#\D
^mCGPn buuY@4ZYj194>D@TWa^D4c>J*@h9Y6D:jC4*G!I6$8lT^RAl5V=y!WW#/y:9i$ZybJVtFq?JS?hVB1=k
cCTiV1 uNjZ^L#?=aD?hS?$@tNVNM/ke5YY#A!&<1VjXnW6YGDWHMwXD=8L+YRk#>jByebT&wdukLWR?*^XjD?j
-AJVI8 00006587082001202b4 Page 82 of binaries2.zip
?4w>58 i<n+B+n$\\Y*M\V@<$!1Sadk>KuN1ep</:5c\b&*Eic&?J#a5n%e:R\*KI9p#a9pn=SYD\*QkCtGL+>K
^G5>qm a@hT<*h9j%wt:b#:w5!4=J4LL<<AmSd?c&u&A#4>ub!uiF9j\^T:KdZPEj=H5yYjh=%?4dDKN<Z*Z9VD
<hSauX #=8n&Tty>R!kj\d<5elLk$>C$=QtM?AAi??y#P^q:j^<$A:=j**JY8R/aGh6\6!WXcbFXl+G\/iqY9nD
u=Bl=Z WRl^ZLJe=e=YZtc?D9$McR8nD@QZDm#6Scd?d=RDPP\n<yJd>A^td8GXEYWVYbh%Q%ee!k=4WFp=&NnH
?i/C:\ Qi&+M>MYCkb<9pu*WG1%M%66L9F\DCeJ*&kS6TB*Q^!c^kbIqd68M$tj*Y=@jRaM\Qq8M5Vb*b9#u=9>
AFuqcA hKC^yZnKu4:y@9^e\@eRiS:JVD8$Q6*GBE$H:W*Bc$C\n&^jS5nTJ>iiER&ij1!?@M5uVy5uWHVARBB/
pkXInG ?EGhI4Gi!Iq8=*D%8Dq4D<Mm1<TZEpSJS\+ThPqS#\V%TIj6JkDm#/Z#y8:I!wwiS:%Y$uZDt!AwJw5Y
hEBPi^ 9PY$+pIy&L>/4\pIC6<X=qH5h+HJW*1%jqH&KkL\qIP!l*m%e/JqF/uXZ!*1kKGn%?<E=46GA^8MKp+6
keDVGd Sh$up&W%ZVJ1JI9haTmSN$6/ZcB?dia?EZBG#TGwmqAdhdGWjHR56pnjLJn\hCXLj=tIc\TwnCCaXuA4
5?*?=n Wl!P8Py?tC<l*bk^w<>XmaQStt>tamTNZ?ZaXuQt$SYEDMt%SL5p&dyn@BHhhnaNhKEPM=DZW9hctc<l
Cel8tw :bRhMDkWFRbH:kq!Y?Q@8Z^K$n6CtZ@X%FCXIJq=b=111FYLihRy@/*cXqy1Sup9nR6h\ECmTqVeJpcD
FpAKVK =BSJ9Bt<+/iqqX%:MEl>Iq8E@yZ6H6:q1D/&6eE*SE$&m%=BW%Yn^**Rh4:wR6i+<*uuF4N4ZmSbKJ&8
t!?w$! MR##Gk^KS:G=k6&PWAwJSdA^b5iuqyh:J$cTe!kZK$dN&iYk=dZR4jP\LMcI/?d4DJe>/^B!?:idElDV
C&9c5c >n8cay5CKJM=#^Nb91EQu\nXRS?&XK?Y%NKIJXYlQ9GSC\y^j%<8ZmBdG>FmKA#RYJ!>e%I?4MZp/ciB
=>#*\Q lZTID*pG%GB@tL!11PLmbSR4SLNjF\d$l9TWhQSFFW&CVN8$X%5RDqBWC!um+cmA5>#Vk>ZR4#Rt9=SQ
6b4&#b nXEpTJ!S^I$IFe$Hk9ZGdkXRVF!q=+Y51y5F\BcGkJk^SJNw?LG5c1WR9b6nC:YpMTi<tIXGD\iE?ly1
cA+eca wBtGMp:C1kPLKbNTLLkDkZ/!@EDhy&yB1Ztd&\h68\nN@VdhyI=&btIXcMIq1b^XKGRjp!4Z9y!SNwJ#
S<@6Jy bWX$<DLa=Fc@\jmT@wiiVl/Zt6R4dbXklSS#n4VFRu+L9yFJCc*wH&:u*i^e4yp8LqnH$RPd1JC&CXlF
4LBLb% eL!a$#e^95?V?&=c4=LhtFIpabFGQ?N/y*$pV*l*dQ#kw=pyPEWku!4L/A%u!9IBSc!CuR4M9^SKHmYF
wDEe@Y Iq6u!8lhTend/P1<qMZl%q5qQYK#V@Mlc#F+m<8LGkPV&pBXX<bb!\i^\A@u8CNV!It8k1XA/iqH6TH?
JVdp$L Z<Z\eFLK*qu\bpWNycK%!%%pM$KWKcteCZe5mMLE6*<m?EJ^#41Tmwm*/wyXT9wbuBT*knqkINu&4ywu
?4<G4q i8hnGHtLqRWYtaTBEuXTT+Eh5DWG@&NLF*=BH:kAPWd:R?jq:LFn::XdCGjClmcyI^>*nu^Y8Za<Im@Y
le44<^ J6?Z88=JD*+l9%HDB9hHF?h$Ja6bVSPi>%KX@8d!#X<du1iPHASI\puD+Rj^k$VZVBWF?I=>5b?W9=86
b#:J4p @<H%IQm#/>HkaLjD:&4L<FB!P6dhtjT+&Ny!tjPSHj1*u@:XT<q=un:/1:9!S\#ELBSw8W5WJi@Nk<A&
EhI#=A !y@*JRt^6L:6<:+ZKeV*kW%h*>6<M^tdDBtc<^uwDV:EcG!TE9L\JeWQlWbW5G4iPjkE\dQdF!eTb<=h
EmbB5\ R5<YSXh^jGlX9i1F*5AX+KDc!tF&I*cFcJq89*M\^HS4K\V1kP!INmStb6Pw<Wnei#DJQYi<!/iN&8Y4
=XWVqC <61dckMIFl<>nGJYPh@YLMh#XCawl=HH4:u!m?EejNe#\TljCW/BNtX8>EehpJ9Kb&bYXd@^hb$>GI1N
$b<8bM lNR8:lAJ&d$Biw8l$WISj=VEmYV9iRbk^yjXZCbP*D#Q:C6y*+WEF<\cI\qkcaE&JS\%epI?X9j&QqRZ
LLeR!W j!IGjqc%EcLyyc6AlXBPGl<iXnY&DG868cm?uR5hSi8%5:Q^!y9C%1SK1m!aKh5c1k<%uqD#e/F\:V<t
6c<T\q uYM+Fb<:T>meT$kqkN+h4R\Y^^CFmN5c5WNH\y#@i?@u9*KXe9/nX+W/G?$<pw<pQ48>>llyA9QuaRqh
V*teRJ IqyJRbY1%=KuHb<aIik4H%a@4BZ@Pu<V6%F!pQh#KeV^Qj@DEaSQB9Fq>$@uG@Cd:5Vjj5MeW%?w5KCL
5yEtp^ /lu\e%8m!6SbSQIM1DD><lAS?&R%h1?Ee6?5<\\aK9&=A&%j?>9999^edF:<+@?Z9*8i@+>h:c6lFYcI
!cA>:c :t@u<y/\IHMYZjhVVjJ@P9+?XCS??>5/ajpMYItpWB6a5mKkRpFRYkXKP6jIP<XiXV$a@uRta?>*4/4c
VP:tqS j?jXj@*6Z%/hDG#pqc/>nj$6#MdVQ6&W?ZG^MFINi&LE9k@!jT6qb?FRP<=:n$6d&Xcm%>PEIB5q#4$W
C>X$\& a1AZiu5*84wHl#n6lSK@i$GG4TkWNC!&b=B4ltubVF<^Rl:DV5?\tq1\S68k$w!BD=cQ4qwn414F#wt^
l>1P&M ZE6>R@Ne<tb#NK1T88m4?HyXlcLqDWP:%*!ER?DyFHYlIctthl+kbh%i>KK?cBwjPeD&!k=Q6B#hkdd:
&e8XX^ V&ebl9l/:PY9d9@?%bjuTb+=$w/M\+P1:L4Q5BISaaR\G+NtCcKtc:*w%#AHc$1hMLiJ<*9L$+<IB=:J
/:XVSh =*9u<+QY*<V?/Ei^YV>Q@cF&#q>e6/&%1:JuRI9/+%iYZ>VG+RD?npw&M!j:9&9n@E@Y^5GH?1$&D9R@
bTneHh W^8HcS>n?+\CEiI+mywG@/tIR4DYMw4S1AAKA1w:!Ac<#qHK>k>qeYk=Fh/=E\SD$EYNRej:KiFBG\1:
#Di/4c a+iR>uJ^Cqb=Nd/PkVBRb8FRB8/QNt$AlubpYCK=&YWtAX4#VSmq@j^5>bYcRqARj5Q5WM!>Sj#>Ai8K
Gi<Z^p iF\V#Q8q^cTq8uAlkt*:6LBSBQmDZXHKiDCC#HEK=EnpHEektWSqF5ak5E\Yi1k1CRYC1Vn\@hMT\XI#
XP\m+q k6hYy5IWp1wW/SADW=H$nFAkG^R^cNIpDT/p4WBdXKV#1%yW=PmhC9yqI#<q\tDWn/#\K!eI!a\j<4Ji
k9Cb*T :a$tHBZm1TZ9a#GL^&X8MC5dlnpycX^#mT4NCu<MmtbD<#4#l+J\Q*5#T8y!%emkYL>C\Ekcb^*QI6X1
/*^S@6 VkCN!+hAWVecLE86p8Km66!1VM+^A+KwTGclhF!Y\A88CNJDFYPl1F^88V!ihDjHbG%mqyq&Xp@:aCm!
JN%%Dw i/lWmkqi^tuB8!M9+M/wKm$FK/KBGSGw/qW5wLK$W/$^m>qh<:uTFmWXMRd%LdBltpcS#+lB>AIdWiul
#+$Xpe I/4hTZMbQl?h!&$SNNm+AB:Wb^I:58%nG>+k&>eMTmPCTTH$&IZ5AkGVDau6a>!n$RBB<hG^:dc=yt?m
+D+M@I A<!nlpuE1IcJV9w#lnE&<+6cZ$&4S:>$WIhP!AnK^dFGFa!:MMaRBW19Y#88K#B=jN$TQQRW=lmjB6u:
eS?$nB QG=hh/nWk?dk/DX*WjlRBXm<YXD5J=C1Xc9&DlY5BPiqGhtSZTMWYGGkij&+#cCZ%aSt4ZcB8GnNQiYy
Gkij1k LDK/NK#Pk6lZ=kt>a%4TZ&ECwKp8eVZ:hC6=:\T9Sl$!:^iC+X#51&ec%?Q>&*ZBknYw*yy@%CFDpS&b
pwH1PE \SRTHW4VVXm#GHBEja@quQY%un/5uMtbEdJnaq:IKpV!QZS*tqwWlmXTYPTul:/p+$DqWT%=l#D&nPBP
LIGB+J SE!<b1mK9En&pwiwtdwMTd4%LqywNWR+<p\wPMX$Jm!#TAkEFK*^m^<lPGy&GCCR4/RyW!Bt:RdmN4iw
1qI$1c I=\n\%8V\&lCi8qhS:GmRJ+$+mEG6RS$j4#GiyHCk@hGj4ueiGu=1h5R6<lkM$^WP^Q&1WK$mTkcp@kR
Cu/u#: GW$^H4qR<c1HLZjP1@QY4i\w?H4=k&KHlwhIeZbLqI!#iHDdw:1JwdS$WJ^wYEVHhpyF#PC%XLCqYXd&
*W**6> K5hNWFS>K!u+ASy!Dt*Y6de6%CXiQnRp8VN$w6Bt5yCYPp=IYAFR&I/yI6>CB1+\?hK+59aY&%P:@EWX
R@!WIa >1NYE!>!FWQ<^h8KeD5yXTS>/1=&M#+$WE>+E^6lLG=%N6kJ:m#:I4L5ip*GKjS%S>^=#4#iuwJ5EqY\
\$PPQ% 9MuFPI^tcCM^j>&+TR1tkCWZMA5^&mRPBeP:V%pRqEK#dB#Mml#P=%Ipt9>^51BSq\WGD4?NKLFGZX#!
t5C>En p=KC\6/t=d$BHD^aEk\JIupl4BNLui44pnB>MAF%V4HV%KuTVJt=yD96bCRWlj5Q$t9>%q/NAWpK5$lI
RK$8Jj Q>*HHFB>m/IXJbP86+X9\/::uKV\t#KV*tn#Yy=yk<Pj#wW*c%qIbX6dTH=XyGL=9k9$LMh:Ei9kECnE
Llde:Q ST6?Lej4p**VT5!qkYd&J>YnRpnce*!u4nVC?1$MWhPBeGa1nI\WbE>pWj<^B@ckTZVdS^!6:$unweKc
jHGQ?w HlQiB:+ITteM=E/iJA6Pmeid=^Quc#mL^@^c*VG*11D#jLWpCdpG$^=8*KjDBT%hXy!Ii!%+8!Cnp!B9
%8MK=1 ?T$w=huBEJ\PlNT\aEe>SIu?uIj6/l&QSLdDdH?bYpuFKM<>eannalLIGGmpit:/5A9\KYeZ$?HcGj!n
94t/=I pPyEpSwq?DuSmuRSiLCii:/^*DJ/4JA/l&QE@t58ZkYSR:#*9S\Kp#4ME=TX8La5E#tpKdQ1?C*&NFuA
/8ZpmP eyYqdI*kVnXdEyyCG>G8NRJSw?Zb5ic^\+ayVFHV+\i=mTS!aT*Q^qTu^R=%iTA1nMIG%tG!d9DbI*?C
iSS/AP q&9uchc8Q*#&$Zlpa$C^>/dlkRHdSlV6DPI81T@ZK+4$je$RCB?5mN&IC:*MH/!&9NcVN^id8Ve&YtSi
E!iGp= j6IHGet!uIVua=VHHS4P:KHT*=uJn>X:QlL#e8Bny\ByX+T:^u/5TuSn9itJccuVTR=+Q\RQEXW>hLtc
=eVG%% 8&n#$*aky*WiHScdDkKN\b1FBPW8*BZ/XCcVkB:IYNICbqVB:whEH^F9=4:Pej6Kb/>iI?cq6JL%qdai
NkJ4Ab utGXPm6Ft8Fy=FX>#h1e\tYCWSnF1%c:l5R?*VC9wPyDu#BN4mqQM#?%Ce%:#%QuhFybXJHih4AdQP*R
:?hZ$= />PXuM!FE1#ASSjJe41p$>4:Vp/Gup?j\H::$&\Bkk!9Q#cLVVww/5ljt5nCWVJM8YQ=jttLX4CHeqG4
jGeVMK pB9:N5>1^J^!peBdF5cnjdhGn:D*QY=?^//PI/$!+d\K\eP4Z8*J&*EQ\pmHB&hh9TZne6eX!!JQ!=Ka
Ly\+#Z %q=IVbFPeamMyX+6wnBw%F$u&ZjaTdM$WERBSqwZ*jIWZh9S>h!=EwWP^CcFmEp+BckKI\=AdwGXJtKV
pYT/\: #^iTuY&MFIX+1bCi8FMed?BIG?MlBXa%\kVBju<Q^jV@YM$NDyI@=jV>$#uYHL?V^Q1jel%@tdZM\jIC
BqYn/c NIn#F*WwPEA9RdQ?Rk&Wk@WFcJbj%WVkaH5J?qe%EVnaZ+L?XW$EDw/ZwH<qF5#B?SI$<BhwV8AL$L@>
-AwT8Q 00083ab902a001202b4 Page 83 of binaries2.zip
/y5VB! 9>>HM:$E@T8Jbe/Z#LXjXyLkjMqe?*Y8N?hLJ659c$F\54/w/:>RTibpi>Fn<w5<e$:&@^d/Q/WR5:Q>
nT6l/N +^VmQ>hB?C&FtIYb/ZhTmDu@lSSmJ8D@cA+^J>QQajq*D9G@e+n@uWQ<9#iHYJX*LaPXwCJu+k8m9ddW
D$B=?p BLNE6/^m8yW!+t\N@5*=h$wauY?+Paeu=Red\/CQ+*u8iRdQAL#GLhZ%Yc#1le+Daqc5=IGTE1\A>k#Z
bunet% ?%FumW%KE#h?%WYXM5kemCl9:VFacuKq&4lq89aD#CQ!@MElZqWG9I=ZTN<Jqe+W9<XpY4\1eYJ6dA:P
NMVXn! B\\epSnT$idq6pTWi!BHMT8:5M<=T%b#ZF^Zcet^XuGKcTZjP/L>Imu8^9h@h!J!5P8<+*/L?5WZR#h:
9PA#kc St1Q4ZecRSFa:+eRNiPeTW=$!QHNRt^E&>9pGmn!Peu8J+P>^bnDPcWy1Va9%hS5bdm&?qPTcm*61h=Z
:1L*tk $S+&%!@1KMH8w:@NEHPBF4=R&@n$1WG$^MPVNX^diDbLGLWq>n66b/8c1$St$MkRGN*4uS9@&*K*d1:C
PhFYj\ C8@</5kTC<<kMJQ\9P5NMC#nbNPN#!cPWFA+qmkypqVl/^MWAjI6YPum^b5XYMlC@<=n@6?b^/#/65pm
^5bj^u a$FcM<uSyQl1iY*FRFjLw!w*9Ay8n:\?R&TcFS&QPq<5CwHy/tAidN<#i8e:p\jBRA?Ntec8j>YP9MyR
%:NLKC FYF<R<il<TH!Ldj!M!DGb8?*5&MTS=nj#=9b&K9CETaDb!PyQiVL16Em@u:w&@*t81568ct+#NClSEeP
hD/8$5 t/CRTe4aGct:&RDB5Wl5<h@b!@@:5=h4@jSaD>^Hk*tBmL$SXaKkY:wQEGX*Ll#EGpGY&HZCbAMdqI\m
4CiXDH NwlSVTEc!dP&jqHJd&E&8#y$y5jVD?@H&:NyFHhMt+PL+lGL%1ac?VJmw<DY4ne/CkYu*<DHCRaw\dIT
ApGG/= G>!c@P&B/nQkL!i19VE?YV^?bd9DMLJLRkZZY$knMP5!yN%=?81i&VMdb>HcZh6R:4kbCuAXi44<^y?a
BlI!cu Dulm#APwRD8mTi>n9SPLjj?h99!T>GW>Bnp<F:ywXpM!cjMy<dnnRpp>Hl@ct@Q8puAyQ:A16ywLnqGw
R:VVJ: F!SbdZ^Re#eQnEjH#n%$H^uPCTG^N4RwVD<8hI$LMXmBLjeDK*qn>/%cc&G=bHF/RTtIPKAVSZ:=JDbm
9NRAK\ mRPZl\$^C5iQFqXSepj\\u$#bFY>KaY5TE8Rpt+=*alPQ69*@*V8<lG^Yp4:J$qPyiVN=JIHcGcQ1S/T
%&NedK ?VjphLW1+M#HYpGVTynd4yBZ\$$h#i&MJG?G8b\p!h*VwG5\BqTFlaW:KF?R$LnSGBRGBl$/T=B#P^bW
H5dGCG @tTZtIQHaKk<u9%l8#9C4^&TyAbbqV!?J64iT:ac\TKwRT5#V^C5AlQpTyphEaRiLAyqLkcG=qH@tk4+
Bn941P hRup!F%@j*11unDyHl^6D4aY:bMqh>C?R>R8BGhn?6+>%IS<p#TejqM$Cw4YZPlM5Sp?!TMuHLmmBeQ:
AY$L>B Qq^RdVWynLlBTmZ:8pyR@*p&8>HH/8hP*4#GSnXd+d\k+dB5<Ej=9cZa+@ec*VaD9:a:HMS=65Q^@Rt!
w#\/!I Pl/qpltl$%AjWN/tG^H:\PAVBj1Wh1R!HK$p+54A6TiKZGb$ct<u4W1/%tiuc?j:+@nM/Eh=pdnp/lYQ
#Y@&?* nK9?j=l*9YWYS?DSRiJDVH\bRpYXe&SdGF5BP%M\a$h165$%d!m*?P@</*@uZ@>Q=X@n/5pVXiZ4nL9*
wTybB% I+$!T<^RScSKnb4V!9Wm?k=wAb$q$i>jPa1ninV?YJnkGTiL+9+MZu=yBq/+j8e!^klHHcF=?>t/t$wP
a5k#W\ YRNdtCaZRc*<NT68=XL%i#9:=kah59H^?LAn=ZH>$=uyQN9bL9*NKwApy1^u8StmMTMibnBp+8ebyN5M
bH9<t5 >=9?#FF<Ec??F4:$ePElCuEl#GTy!Stm>IAemL1?#Y>5pY@!?SwP&k@%PLdF%ZJX+&c\qnj59Ri&MGX>
$\kA=G ySLa+6?Yq!W^1b4q?m>^+y+nmc4JjluyM/*?XAl$bE#>dy!WnMkSpe^#!IiQc1Z*@69#>Fu=<CES4KpB
P6d@nW jP$K1mhc#B@e41#/RWkd?py$$Ni$t*=k>4eud1D9KH*PyTMQa?IV6^9@N\Tdb\A%w\QC*?TM=9\/+h#B
y\^iiS &&u!EattNZE18EkpRdeD!!ybcR$N\uK?GpQZ<pq:64lF@B64Z6yZ:T@W5=<wEub!p$%meMBQp9%yAaT?
9&1k^a lMp@J*J!+aeMTb5=:XAHm6XTVaJWKEGF$^qC>$qQ6@+ene8d*M<5ZT*$:b1ElZdVL1#dZybAeN$:S8qC
I+#k1y PLQ5V#uw=Xk1KG1Xqiy^/n9Ka1!4u<:FD?Syc5Z8m#+kCk&5JqEXKtI!Qq*ljm8>$+m6cM4mWeu=my8Z
>pIM6A c^ie8XGnZ?>#QFdnwX5B$a<Gm!&HGK<AW\p@R=YD<+w+SMt!R%ZMpKmRh4RkB#ejT:hM>#8E*+<R^FeY
nwE#dH W?aTVwL#^#d%Lh@ekj^!95?#J^Cncwm$FcT9TN+<#Ka?pha>cjL6@Kdc=B6t:b5m@?E*#cbNA8Kh^FQ>
Hwu/6+ 8\4&&=DBP=Mj1W?Ya*@>bS%BqbNpBp#MAYGQ^bhpVG6BLJ=Bl<m@\1Fbah>eJ\FDZ4%9CNpGHJG=a&#+
/P>+RE :@\L1j9ew:XNZ%JQDaT\C8M^YjBy1wbQB:9eit!$NXL%NI=Q41Xl6#><cLdI$>=JN>E\p<TtIcXVNcQq
!:1J9$ Il4Hp>&?QVY=b1\5VA6=K>AX\@QbXV<\*JT?d:LmJKJ*^<XQm4#Yl+X5pK!FVcpe*L<@uAmcpn1^cmh^
1V<NeA NqE?Qn85miGN^CDte1wC>!aPu&l#c=AAjWt\mwM\ARe6@&hEDY>RNd\hdcm1ipN/1!N6j?GP?k>blc@!
M^@&aD Y4e#*@8tl>YmaJB+5<n8iZZ>+EkVa+:hWPa:dhN??NIJ+yVYcuKYE*n+WD6%?%YcNKC#FT<YZTayM%uR
e:?cTM W=1^IuyI6^wQBX:aI6nJE=*4+DQ$6#wkFhTWDpkm\hGQjVCT8*8iQ@A61QqyQ4Qqd#E!4%!iAR<Nu=<B
Q^t*My +E+?Md<bVk@?hVt:!jqu\PWZ/ki+5Z88u@bV</hj+5@^jmDilaeBe?:T$$bPyj!K=B1*bQ@wy%q?t@kE
559Fhm 8bql&u=#**&>bZ/u#j=KKLp\MqL/Q^A=w9?G!DHE@6h5V=Y@#jdM?Yqp8V=>@H1kyDYk18ilSQpYyKC*
jM\5KY VpM9\G$ZNhPwc/hwL1LPB4#<&JS>\P5cn/n&nYKFSF:WuYqnQ4:59Nim@d&^k=PDC&6jn&T&1:^M5CwP
+V<6N: SFSY@F%Blle4YXL^dBq=:pTXWXQK:HcKcw1V<?m+?PD=BTaBF1F+#!\8PD?X^iT=T:aDe::aPJ=:dZSj
cVnkn6 \ZhSKjlcLF1IX$%Xp8<<%FkVbXNY:#iyy*QmdWZTXdNGKP^cMS%udGLYjGm>cp1<\Ck#&PRI<VT6jlTc
B+D5a# D@SLeLPH/6/uqB6@9kiTbbeuZ@Q!MV9RWwVuY1KCWWi?H=PZ9hGCd:/<D1/$\5jD4SB=?B1IQuGlTqWR
idV<it e^mB@NZ@pC=5eMiGm!11aG!A=lMcu5G\!6D$k$:T#DjLS+ktT#5dP/JK6PZipipwB#u4eZQ?aWjJj1e@
8GeujA LmS>d^mWLlhQ*1hnT$GdFJuD<njC41b%wB&!w&wj5i%/KJHM%V5\h9?&6KknBE%<1j#Kk$=j#qDqd&LR
yFMV4m $%E$9t#<=tZERjXSmJSR?@eiR/X5%K/6<G\K<q:QW@F49eY!DP%6b8FaYTGZW=1ST!KRVIJeWmh&FAB?
LVWFwV K4lQ+5&TNc>/Ly?$E/9$lG$9B?u6ldF/$uyEL6wK:HN*n\qQq1F+X!N8FDS>En?B\&aRK+l#9N$P=8#E
DZT8b* DbcwE5Q?%JE!/cD:VpEVb@d1CTGkpQQYY<CaMp^Sc5bkSD5VMtBB:+nhDRi%<R*FCPVpjRn/qby1SJaG
BI9kd9 i^@*XG6Ej@+WPXYDL$ZeID*h/^n:j4MmT#ZTH$KhIY?5:!p@>dE$X*l#6Pk^>aPetChCqEi?p!TKe<>j
hh4X8\ t!Zwp9dncHSE*j5p1*G&RNdSY?E5Fdne&:8pXBXwa9Q46?WpmCYq9F=ApSX!lJn/IT8XljhCIp#PQ$Xl
b%D/@a eR<?@Xn\hXuTq4Ewemb*q&GQRmHA>/9*RiR#+G?8GZTj$tLKi<>d%XhHZMFF9:qpB4<#/Whc5FbMciGC
eZRQh+ 6XymQ!p%nhuWLB/@bS=8<B*!kd=mK?JFG$Y?&*kVZDy&k4D$ADy8B?%pM%IFFu\\*SDStMl*D1Z/K:yY
tI\ayZ T\uL<q!!FqD6:QH*NDGZ8E>n5Lbieq<BZ@=Nb@p*uiZjhJb@$%u?VYj=N=*q@@6$q5+$HRqdT9@Z=BRC
c6=+m$ 1IWD>VVIM>h8:4%wW$GuHeT@5XqRYABnYGN=q5k$@Z:W/R^15BKE4kVEJYZqh<tHHXZqIi1R1Vdl/djJ
$!et\9 /:p=K<FELd\PXW@pMRV94D!&LEVw/*Ypl9hjqaRdm:lcK65uHTqGLmDb$5Y%#KPPYIyWnqbhlNB*yJXA
!NDld? *d4Q&\*Y59+#NQ?>j>Na@p%n?ViN=b?q5dAAkj>CplLVu=PWYJlBj$qT+tD?%*KWtDmbtj<lcab@ZaGD
M!Ay@i Al5JJpnIWKHXlI$IJW#ETJGnWI$BJ$4MYLF%&=YZPE:CSItVIpYYPpuKXPtDTdQ8t#RbM&ZP\npd>m!=
k:%Euc 6<wj6t?<?ZMX#FY+KLGn^R8XLFVcVNui!=i1YKy!FcqX1Xi1Yct&:dl?$1@X5Fdnyp\bi>8wbcQ&$dV=
p*c5mP 1%&4n1$/h>HemX8:uy*/^=&dS><8A*5NHmweyNA?I\iNhnN&w6klE$hNLqmIu*6wkY?e%1MI*Gpni+%c
9q^WtP mKi?pt#Vbqhe*1<ctA4G4X\t9YQiCdjM:h&$Qi:PK%iE&dX\S?@l8BW6P:Lw\H/lm<+IhG^+l^!$X=R@
AB^WI1 dh&Y<hSy!VS$jN4C?/4ELSL>>N6HH=<%?Zi#5W/jhHN<9weZ*55+9jhh/!$@+D5:!nntpNji9?ymYCK<
TE6:Bp aJZdl4<k1SZikSK\kcmD#a*Yby^y@1Jqj6XS\\Q/#wdCa4+ybQ58Fc5*4qEa1lh%?RmQVbFRFLu@9KJ+
:Zi=n* XknFlACHP::HD1%F$hwdS%m?ul*ACTSjQ@?MclIWPw!P/E@eL^hw>%wCZejklJ?YMCFa9QyT=q4!nKI4
YA=ytB RaaS+iGGEqmI9DaGV#<R^IFK1\yQewb+\MLHcFLGQ+=alCR<mTtLJV1bbEMpQwWbVTuc/X#FIQ$qRySJ
@<\XY= hlw8tFP?T?XcWEG=Z^GXP^/LX%XXFe6GYZpY\@yEYSZLXFqhhjcV5hK5!=mD/l!p1EpTAK9IVt>86m4R
P/a%Z% 5DAZdFWX^%T%!H#JNdnIT56$+e!MS5&q#t/J4cndSn8e/JPDLk=W6i=KiQIZq%We&Rcd/Vq9Gh1at&=W
1+IZeh MnTe&V5LDTtZV?@Y&I1??/#QQ<w/Ft4kwZuyL+mBBS8<tV$JZY@NyqR&TnMThq4D/i@%$d?J9k5#KneV
PYp/YQ +N=YC=EMN@p?4yT!+&Hlq41$GIQny4t#K5T>:e:uFQZY\kjcQPjP6K^R*#X>%W*j#VK#+IC5P5Z*wDpp
weVXR/ y*R%k@Yp$EI6Ja*Ma5p99E#9I*bF^SHqcp9DWbp46C4SbnYd?ip<&y49Kc*iZ69yn:GcV&5jD#W:V?eG
jHty!m #pZ56Hh=R%cZT#CK#6XTaXZ6Q?9BPGk>uNSb&lBeu+\:#hZ\n*:^Jyd?+w!hw#ntw18:MZ&^@=lq@9=^
k/ylJP $NH6?@5>b@Q4NpdX4><j#:#Z*Dq#WDdhu>l>6&@KaP!?*4<@!=u&$JtXNX=pXViiKFNn$Nic9^d9uF@I
-AK$>D 000ea535338001202b4 Page 84 of binaries2.zip
4JA=q\ @l19@@AWc*Q6qZ&&*Lmp<4Zy:d+in1nXW&@u?cB?d4q9#cNQb@H&6kEBwX?N/W\Xc^b*1PPWcY!aiWV^
\u*P=\ eii/wdmVQS@5B:<KKJIGwWA/6Mu8IW1aYSBY\NENYkt8%QV/MWa\MATSd=Qna:i=Ku\iKub+<5%6!n6n
NR>#?F L!k1R8FTD=RACkE5Sdk4hQhI=I%njyXJ1Ey&YG6^I!@^CCE!Y6clc4HMLBS*%H8WVnj/4VSMYI8L/FA@
mWETAN &NG9=MJ/99GX8kMTK<<F*MGSB+!5!Q8LiMb>>4G!Sic>eYFaSqGTEXc1=n%V+YktQPHl$qymk\$hZ$SX
?+//^K R8LS!CT4eSHHKQw!EyRayTS9<S?%QL@EVBTNm:C!Ey81&CVH8KwL:i>!F$ZSwKGAc+p5TDL5nGIt%>?b
?d?:?d 6RG%AKRVDGu4AP^lTX+t:PPBhHR!$>GFD?TEjTq5mXIta=ybVeXB@XyP4&#VLTwQW/I&HKEhbaJXc<m\
IJp+pi k>^>tVtbpP<Yph>/nWXNn>8ktd:u*ZPe!5a+BVBbk9G>naI$\LmKTDeWISLeH5&qZ#WdHuDk^h+H=F&J
@GFV?H iVEj$nE86yQqBTtFK5JVNG=5Ah\^>iIuqqkqT$<\m%SC<M5&<tV:WZtkK85qJt<@a1Xl5iNn:4:9@XDc
$6645= >j1lTTMbQq>=PJb5$=TlMJu=9eyB5lKbnt1bIwhH#Ma8mMaQM%$%ky$#?Hlu9#8=w5tuhw+#q58Kq>X<
@@Zjc% 64wYa4kQ\a4TQya=jW^hcqtQ#685^1Ww%k>5q<n!pSP=tZFAp4YPK@\myjcG+yZGCMF4it<qDnd<QlX8
ae#JY6 P6QA1lm6FKGiSY=ie\cp6EbZC/lwBA/Ck%ciWqX+:yn4cWP+jWDV*K5FJASV/^Pu:<$*6THLFj4Y6qDh
H5MKZF 99QItV499B%61pdNA5h:Xi>6m\=WLqSV$Zm@C8/=XDttjKT#QGtl??VP&MjTH6F<11Q>^iaN%1E/VlP#
X&kcuV ^45K1!ww$*m4W!LlmkN%B1T%Vt!6S>q*h:=&>?+hC:AA@SVE=:Nna8WF^y4%FdnAlX&$:6e*1*kn8a&:
\tu<*/ dcttG5+nl6h=aTyN8<l=uTk/WJHle#=p%i+%&M5<iw\ZR5u6<@t*+/u?pZ%nlhTy1$hd<$!^e!tC9i=P
Cqp+8j 4%/4qlNhCyS@Fn<CM>F=#<Eew%#64n4Np&ZEXVekLZQL\9ky1nQN5XnH/T+D#A#B@pMDqbY?bk::kt4E
>S&+ll 8c+6KX+/dM:+/HtV$=!Zy=k&=>55+?^9cAljFyP6#IuR5\pn/#?TRHAqRi<X=tWuVh+L!#B+8AEc!*iu
aMYR9m 8KVqD\4=L4I4^t\Vq&YL9SXP5^9cb!*lculP>C9j:#d16T*4YjF1=cm?+1J>B&NI?llYLD<*PC<qd&d>
WSS>8H NW5LF9d*6\/@I@4G#AIC@u>j>A*jKPV@6PndJk+ZA?yjSh<CcPq1!98ClMEpTqtynFn/51kF/#*^yPkP
X:FGln ijBD/5%L!RSIk!Ibcai:nLt:KtmmY1DR+w^\^Swl+B6DEW1HWSpFT^Z\k58pwaRk\dPpMEZ6qdcd1ph$
N!wj!H ecRb/N*Z8^ZJDbS=J$ByCq!RcLDGIn%aA4*KDCCTNTYFPmJ<VERXKN8Y9p6+XQ^l?Ctl^k?IlGheA6$C
PW\?Le 4bm\VR4u\PkKAX6MFT9bGtX!cd>Y#Q1w^lG!hw8yKV!w:qI#A9b=IdHCEt!Vc:CStu$DjAGujRXT4Y/B
FDGYdu d<y%%#d!X6X54cPap$C68b:1qM$=Lml@1Y6Ek#y#ycaw>$Sm4JZ#u1Z6cT!P6>lF@4I%YIZ?At8lI4kE
!??=PX PFa^kqBGVX6ZntWS8<$D55qCHlJ:/jNyAwwySuuRKCJ#^=:HA:$RQ8@m>#?Me?CGcFK^ykcD8XKYq!CI
Q\5$#1 Etq9+!Y4qkVnn1h>lG1<eaMKWbHa!+>JF<6:Q=tC?etEKY<5qcjmcKdV4HeyX#EEC5Ltueltt^++?@:6
XDdSWd #W:CY>\WG>uNbi8in6$5>>=?K$IjhiW1B&Sa#BDQctQFyT**9c\>Al?*4E&/a!DVVkd$GI\Bah8n/1Wt
i@qD?X Muj?ebw/R9+?IjKH%t&6kTMHMKFeXWAIcV9k9tIneNAd&WNwj1\cJN?W4J*plKFi=!!^*X/npX\hdmT6
=phVjA */5!C@Fi<&d&HcV+^S\YL!HunM8d1@+p^&h:&ZAXGDGK5NtItLhFn@e<AVN*Cu*R5uGCGM&yHyBLLIWt
T1b1Rl =pN69HMl#&5>lt/YX+&qt=8Im@mNnLELtDC8nanyBL4RWtm?hjM@IDGNQ@1Qqau$J5!D4@8=iXnA:jFC
<Ld!P6 uu/T/w/&&$u81tiB#>hl+Ycp@FSWJw::FWI#\Ec$A?!%iH*bWpYtpSV//=R8bc#<mnbDG>ntAXEALItV
w&i+ZJ cqTyGTmWbJXwm>BM!Z?CQRBGS*68!+ulJF%I\JRGX<W+VdnP4#@q>kJ^T+pB1T1A6VR6E&yEk#HMXPMk
ZSZd%> $GR#Z94IG#4$5\i9puW&RPtGVyEiE<LwhE=ckPP%RT=yKmW5AaR$HkNqP&8byq/#CeDCd>RbqV#lju@m
l\?:*a %5NKhpu8<:pknj1Hantd<<wEQEX$>e<tWGBR$J#54tEKt\EKabaThKLR\=GJ=GKn^eRkQDe8lCN!FIAj
YSk*=^ i%YCPCV1=SFDtJt&SJQRmKDqQCTC/Z/1Cl+QcYA\w:SiAIM:w9HID6#:&lt<6tT=>XEM66nEwqn!aRVP
:b^@4P A5eq/$cGXTAi/u/!XFN8@*WjLtW%:m+SuN1*kiS/Dm68c5\uywt\y5EIndP!JYbwc/QAJnaI5aQCVN5>
@JB9M1 &jcYq6L4%MIb8!F$G*/14wJ$BuD@5ZF@$S8q:$V9Q1ZdMbqI4n9R+AkA*$\qpQP!u1CZ=+>SJ@RhkQ8X
*#HPLM +JpkSq9ZTpFLqKHy1daF^WXy^wiKGk$6PWjFwF*j<R85+S6uJ6Wpk\8TlnX\d6H4J6B:NVY^mT*nBi4X
t8W\Bn 1Dq1!QVq5SRHY?t>EYy=\/tBlhqGb=BA?VWa$KM6R&kGXe:BwW&4#4q54QwtLmP!qt\cikt>\X^qVJ#W
+J?+de #B1*&wAtwQEEMST\ntiMehGwGp&1y1&wJVe/y=qRdpY=YEeH%9hwJhAap>KWH&5^GX9MMB:QklQQ9*<N
cj=%ZA uqiy!a+>VDb$>qY5!Fb#R@<dnpTJFe#:1@GkNVNP9yw^Hmk$5/%%V\VbnSneQDT81A%cd*@1I@<PFWjZ
!CCKYF Ne/JL9$h^5C4<n#kFR8j6DhNZ/MVtCGl!QF5pZAST:a8M<>4duC9AYlL1qMCBHuNZY?LJtY=pyKYanY\
5qKj9< wBJ>bWenjwFBI^$MGK&dX+GTkCXe/&!hETTHm=THD+:yEubC$%twhE9$y?9qdY=P5\Jmc8@5/?uL$n?R
+VR#I4 #R^#1>M/?t6uuF\j1KMQI$9H^*+!eSGZXtGdje5W1!BS?IEt!^iCcEFV*htnlXQtLXpq\19e&D8p$lP1
RmG8<X <1$RFGhuBPpNW\#b:iENCe*VS1\j9VqZTFZ<u!>66KG=m1YDG^pMK=qDW@48J>y>lA=n6B5cTaYdySkX
kCCy&R +F5:S=uZcnE%9baP\bu$I^%RhA15LcV$4jPeRWP>Db<bcVE5TcN#!GbuI9LP*L5FJ\VKT88JnaH<Vl@:
hSGBu5 ?D<ibKBHd?#=6jIG+?XR#1e1=:nXiqNmFuA#bN$#AF8MAqc^%X4=b<WF&GjKP&w<=>*q95cNn#AcL%TC
ZdZ*%G >!NdnQPIC@dkj99pL4mE$cSnTu:4lXJlL#4alQN8BLem&#R&XnXXjRI^q?iHP:%iMGkk$8dmDc>6DG58
tp!ntH TP^kcpS4>tD$GF68Nc<!VET$:LJc=a*%?:!18YYGB?\e=Wb1eCb%8\AcjY6\\In#F9!5@$cQp#c\D<?6
:!\La& :#^?YIiI@%^\+\eAuwY1K#P4H6XS>4MwhDAI=?%i9yTkQ/uu/>Jqwka6ITTQ#NhqSt@9GwT*MdTWNIK5
?+MCQR tZIE>NCFLRMl\XDb*/<JdmHF%!bbFicWQ/6J/L/t%Q9G5=>bdG59S^\4d?LqH=?4e!AICcTuy4u^<8WD
/utl$^ n#tH9/L1Y@R4\K@ntT!+LAw>pDt*>I=E!iaR^#l^9\<>aFme65\S**uCYNZ\6tC=kZqiithZT\wP@99d
p$>@n9 Lid@^<m!VECTQ>HZqQ+W:@qVwPmjJe@?Wbdph/SLuH/?p:a\ejyd16:QZ+Q??IKJ=W@TRm!5VH>?\j/u
6u$Glc F=^@qQhkAkH@JEeQa9unX$lMILa@+WEej%WpE4b#?aMM$q@FWqlB:Q?b4jjH69<XpSXtq9<555LM@E>J
\?wSXQ KdE\ej:y*#ED@/PW$y?bldy@*>9@#Ld<<>*:^/SpFmDdT>D59$K#9\V>C=F+FmDHC>C5HL>1t@Mq/F<R
j=l\8d k%takC>Ak$C@RnP>BA*<Se?btF?A@1&N*$i#9AD>T&49d?4kL:l6VMBjwF<!&Z=F4&Xli6Fp?+XIQA5V
W$dZ=9 ?*<L#jHjR9@9pHpH5dD>:CQVH\V1&bljww4$S#Q!9$Kku9W*pZwPyn@<kbh$uPu98Nl@H1:@pw9N?dhe
RqptwG dND9!Du>$TD@Zc\C>J8h?Hi%49@=cq&!@&1%Ll+ecA8JQ%V4kwSmMuVCn^iI\nZAI#e1wIFm:w+WG+hG
Tpy+yE d%ZAaRZtlnM&%4u9ewEM$^R+Rab>QhkjDAZ/hpARFWu#MVHYC\V>kRZ8&EPp\yt5pEmam!^!*XHui^MP
L&=jM\ Bu8<*cQHVTAYbXWEHm+Fh\E8EeTb$T%w\X^FbtXBWV!aKRiDXi+^l5BpJW:qjlI<YbXTBY!RDSTu9Aya
k>+XMm $ynmq%pdXVcqZuIYHyWCE*&qiSCq6@d$N\bS%jtGhk*M/V#ScDcYyDHuFbBVL/?<%nh#AcbqbiCGQwhc
XEH*#4 j+E\F=6#/!HZ?FRTjmnmP%bK=WyAKbqph?AG%YhEA+MtKRWXZVaRlNM:Y$Q5cP8=WLbMXuppy\aBumAI
/e@9/h /TI&cBZq=JmXR/SK$A^aDNeeC$jaMkeW=4m5Kp5kl&D!SpPe64%J/@=$ZCPEGWP+XtM%N&>n%JY/lG:/
4nJ%PY D\@44b6GjE#E>Kh+KeHYE\5&%n5B:dA>Nq9>uN&\CeX51<Zb4M&nD/:!$V8utK>aw5jb1FMPG*lV<jSw
QL#$aD VSb\wAZDHAjZHJ%qlylpDP\kl#MCYTVbVpdaQ$JX9e6lY#pB:KMm@*Ai+:X6HTWa&@AcbC&lcHQ^^$c$
S6G^4N QnjqpXPN\h/hG@jL^h\EjtTF9$peYy%#cZ\R6I\8RQ^5?SXpS:kG^eIcQZZu^E+%&@aK1$#HFW^MjZCd
jp@=w> NGy&a*w=WjLWNqyLdVqc>=F*epNFquHX/8RV?I:!cp$P\%JT<*pR9L</kyjaXCa>F8LuZBHw16&KcRFe
t8!Fjb biFad<apXL+BdpC*kJ9T/Tqp%8AR\b4\i=Cq^!^%cH6JaGc!e*n/bAe5u:tCNddSihFZeMD8@ymRncFM
Lc1i44 B$dHY=I=NXRGl^D@4X=:laeNVKyAe&jMpqB^ML%TJ:Zwc+5cTIAdjL\<%MlEFa++8H?CAqBjAuMAA891
%mL51I &X>AB%41wL<Ah6k?:ek?#C\>HYTGkV1Hwiq#RQbcXBm\8u#p!^B=TR<BA>&Fm@+eldyLXDZ+1yA\mV+M
6t<YlI cJ4cm=QdyHAq=uTcL6cZYl!JJS\dXM8JDa&XDm9dDlXW4@8>iH+HkS#>9Rih4GZI4huuDdS5tTp8CKq?
mYj$?c HmV@Qmi?j8By!/ceK1IuSG\aMmNH/D+YlPIyk<SCC&<B9MBu6DW/pwWw/cD<?GFJ/hhX=:*9b^ITN=h@
C$9S1@ MNXeR$FBpYRE91NW<a>^\XiYe$^c<EA/Zy\1D69P^M$%ScGYwkdpV$SLG>1Kl?&*KaC<XD>@$JIIb:cY
/qw9GD 8aJMKLmH!n!=:5M#!KHdB6Gc\*9eheP<k>C84IeCY#\MkDP@N8?hSbcZ6Q!pCWh6!wC9mPcBLa&u64>i
-AN:+J 0008a85213a001202b4 Page 85 of binaries2.zip
W^R!Np *8A$u5!M*!LtuB*wqEnqtDPqCwRq^jnpiPulKET>C\9lFT@Q:HDaIQ+SYq<qG>p\yE^J$%pB96*DHkPb
@tN4WM 9qdmk/b=ldHGmAeYQ\=QN1=Te%W=J^@nuImVLAYnH<QpCc>yVM<5YC=:mN?GPwV6cCYS5$=*F@M<@9G^
KCN5mN YyX@VRRa5@w5dy<\:ck!qV>IYSwiHpq+V*&PA#nZ6K!96KYhM1T/VFWII1R@#G=\8ZPBRcA>TpejXWVt
%MwGRq SXYjPC!c5N/9eVu5!JkbJW4^H+5@6>?Tu@@G+h?wL!kaBy^uETqJd#T&6k*=5A^eH<ATL1qna@$8V@9h
m!\Z1V :mlnR^::bkWjkeXt#6P/AiCQRDI6eD\/lhJ&eP?>\5tIK?^u*@kFm$ih9WnjunJS@iS?hucE$nG#CcSn
e:MS5j *4FRew!eWjtAaMRYp1b^VP18ant1IMeQ!^T&=:S%mG\jR<EBnSHWb*&R&\V$4Ku^/P1wIJQ8h@J=w^dZ
G=?El6 kGh#XKp==!K:DJ%lH\$%bB#BPXkPFbd:h4JA<FAhu=%h^RF>15eItQ&NecR?9b/ThiVkk:GGPAHFBnhY
6Q$^mV b&+#mpA+6buSK^ZND*X6d&X/<A!H/b\tP>+%a8LZMXqJGH@R=/\WVwyp\1@Wcn=Bp?TJK+@&KP&p1YW^
LFPWQS j^l8P/y*X$8V^y@Dj6SaRXjMq!AmG\Ce@mAqR%Ii&G$:DNLau9D?BAW*\6DHVlk+h%@8u:F+Q#@TuDeJ
eVW/m6 V+?pNdHj#uQj!1ypYB\TIhYu^b/IwaJk*Nc6#Dpw=cV1?mqw@^&mhY4Kk/9DXA$Vm4HXqtbnb5Gc^j%H
QEAt=1 c!y:\bd4t^dF+a$YdS1#+l%Z<:B*mt5bh@6Y/%IymlqIqqT=&:YyytNmBuTaRIy$#c%4m^E=\ibM4/Rj
M&Ca^* cqWKG8/m5y?>*4>*!J>NuNJl5ZBl#kam+G=/<pcZBI1pX$q6Jt#A4i!Q1QjN$BIlp5=LZ#!!jde8h#iQ
d%QG$k $+:cjm6heN5S8Q@/B\%MX5?Fc>n4KVwkw>cA$mpi#?:pmtd^8qe&?6+<R^SJTjCdX\Sc8NA<>tl?\IXV
AtIjHl NAZ4/P+PD8dSWMAld8&4<huITLR4TZT#1F&5ZnamBuDpCt@D/Xbq6$$1cm48XVcZuG4:uF1#BkEedm4d
yue&n5 +9V8D&Z1LZwu&XljWH4pq1#iG1iupAni?H#Y!QRd1mFpQhX4ZN/Anu85h41Q4jlBXE5Fl$6Ab6/1?WcT
jL+!+W cc=EF$@l6RIcEkwul6TZmtX4p>$MnEY%EGhpY<Tk!$K</*ju/i?dRD@&G&4XQ:1>=XM=JYNkW<phWaHq
RGG=Q? 5/m^pham*BRlmMLYLPb/>Tt%5bqRNLd%S/<TFE1Q<yiBwHX4\RK>ZZI>cV1X^%4M^dQN<YI>yJD<G45k
Gu6>9% NbNh$cDX8\F4hikMTJV^tlC8qtP=:&KRYXVk?jBV:FSp4NZ=6ybZ#954lYacekQ%:aN!!MX^clNekYHD
/a/pNC b<b/CmK9pI8FYHhw6+y*:<NCwW8tJt%YVj8IaWWJ4TYZwqFyBQjNFw@dbEd1A:5YpKlwYaDaA:ptppL6
6QP4Ej pqGPBucipkJt*:e^+e@b&1&IIEWcQ$YdBb*^YB5Mu%tGLjd^CP+Cd<KR/^XEt1%<41W^XeZyY/*Yt?&9
LHJ<Z$ V1YnwRjqcyBmYHIF&mI4wil1lcTdYc*cc1\/d1S?wAI@wCDW*++qiJ<B%A5pYw\=We!1S^^kD@!KEium
eidm@q qp/HtTZPy@h9&lAKHWkCX8lCV4b:6L@I%Fl#a6Cb5R*lhmHkjyMR1LFl5!LySdH>kZ8B&+nGMZ8B&k4@
A6QaIw A^*%ym:8pWBSF6X&8@+$LiFwyq6^BN%19iFM#u9pLYb@PuaFC+b5R1iDM5cS&6CkZMMy+#!Tb@iF/$ce
4*Kdk% Rn+MaPd6dSZnpt$%1m9Xd6tdKhu6<!SJ16uR65WIp?B\%EYS$RI+<&W:5kV#PLbNm1Z^yKT+DK*w?49l
+dpcM* KDhH?yTmkSL1<pKSR:bLMy@\i#8F<aELu?<&I9c!WwJ!=lQDl<btbB!mQF?a+&V/cc&w%BRL6ECA8Yhl
p%HnCV WDSX6tbpca*6ne^a&y#B8tbC^*k^GVJkC4E?Z&YC:K=aHpcMHCa/+KA?GWLCQPF!A+X=#n!MGJ!8u9Ye
+1Hm?< juG1Xc%P^?S!Fy^K!MWJ*nAtq1C?ZK64\SlTqTSEyKFIw#y*hC<Yj44+DtiwitNmKZa!kLt4B%FPd5+5
eN>Giw ?<BeVlXGc6@paj#<iMw/EIX?<<5J@Da!J=Hb:plqpAy>V^pTyA^>\qFSKW5MZ\Q>#LD+jw>AJITDw*HF
/JEAlI b/\c9Z&=IudIdb56D^mYbDdH:e>PjpPu4cb:liPJeVpTen5^:CTu+:FV&QyqpIITImY9y#^LQW9K4Kkh
lF8>Da tBiH5#6*$w1ueyMRIG*LujAQ&?6je^TF6wWMaZ6IW9QdaF?FYSie>Cu*+<4MpJtGIjCne<^L9C1%hE++
ZeV6D+ EQ9kKKBdwBapaa%54yjk?JdmmERhE#qM*qG@jDSL+mpKt5%Qd68cl6+mSKS*qEyZEdX^Mm4wI14l!qa:
qe%JR> \4#bEad%Rt*NRSFnqLaM4j1iTeVRC4&u5dn/=A8%9MV%FjmumTQm&y69$VmTq@W>%B>JwAlISHNhSIlJ
1+NtM$ ylP=yCqSMGbJ/b%QcD/C*tI&ICGj&ct^4Y>\k>K=J=^hEkMkAeQY#LCJ\pt!5w^dM5h4a48I$&<=!BWW
V+?^!T +yG*uNyCwm=bV%+lu4#cPwHXwRRe1@Ibm5khYA?Md:hPl?#CV58#:<?^ZT6MW:X4#%4Jn\H*huuGE?WX
F?paBy SS=B$#dKyd=!JXC<6Y4RMMkGJiml=V!QIPcw16WEe&8pK:b!NCj=&It:Eijk=P#%mcEtW&#d5n$6PK1m
#IVbKS R%YPM1+CnHQpK%VDJB1up1:!$K@CFuK!laN<1miWeBIF^hkFl\1&>a/QMK?&SC9ID>$w&CA=e<%EJD\>
nEK?eQ T\PekjJm!5JmlXnEtC+MTb:ip?e$9eu!mXGumylZVN<^p:8e4>Ep4adWbyI?kA1M/:ZCw>B:/4B\ENep
qSNAj1 44XmqD^y$H*$tRNBtPj=tFh?WATkjdu>j6kDmpi%BqY+Jm8FKyJyGKBFE=V=4L@!N%&L+n$FaT*qWjD&
buCu=H pQ16t/nJ<^\V1wTJ+%=%kiHt/YqL>P%=S&wy$+XnXRm8lpC4C9uZMChKFt<+YH*Y%N^\T1<m68kSBWc5
AMkFXq E<8nc$k?ncF\Yh+Ghl$iT:QaVQ9Kmw%^PQX#HI6!Ty$ZJCc4J#PQS@1MK?6!l?TwJN$a>!>c!:G#+hCM
P/X45< +VB\KNk+MdL#FDP^8R=dDKt6IdP4NWZ%M+h<h+^\aLm%PAqdy=SJBDbB9tbeqVXBKlwjEt8%PFu&kG#>
5CJpRV KCAAS*Y+HKu8Zl9lSpu!4mXn4cVKp$ZS$%SntTc6^KG+lqbDL4J<9tyleel^t>LBK%BDM@yW9jAe&i@M
yMA&qk K:WuGAw@*HF%keFpIb^9hudamGF>A>FCnF=bE/=V$*dBL*e*bLChhT?RepklB?1hadE@HM\:15EXL1#h
XEe%km R8w*?4&eRT+>V?lTHqF4qBAcZ1dYBZBVd4FV!uCM:6Sh:4Wq8qImj1WI@Mc/IybASHN+6*4Zw6uCC4V5
iQ+W4: +MFhGR9G<kJt=T/6^bFi=hu^nmpLI#9ZnV*IK1a4=&y>Xmmlh*S1jTnX4P5ndBltY>iRi!\B+&JtY6l%
?VmhnK ZNX<tu:n@dMYZAWcwmJnN4LI+*L>4$:b#ce8RDi4R>ZbS%EyS?Nya/yc:$y5Zn9%emGl8I&u5w/8F#Z9
/RDtj9 &EqpdDnNKa!1GWkPPXC#kFPHC4AyJJ#ILXK65J=w*J>\cBWNii+KQLLWtHA!/TA$ppp@ihtqdI5VG8eP
:+ll9p !G@q4<mMmy15?eiSy&QX#u?I</iTC:HyitjB:L??9SnCuc:C==/\=Aa<N6*#pRN>VKM5T!%ni5<\JZQZ
cDKwa4 8mm5u#HbGyLipA*F==*cH+D6V=wwWpW!knjA6ZX<ykEau6yqe6Sp+Y1TaV6NPaDPcGBHbd%?:XJG4aFH
%!GZnE M9qNZ1&+YpjbI/1@YVPDIcIyMqwtdRSNt%Xha+PK#5bNYGHipIPL!DX^1E<tj<1K%c*%ah8hlHqem8&d
qY%<XL *A/JwEdm^HncmDN5KG8\G%h%umS?I94NX@HLMq%%^!?8BZtRC=5bEG^DeqMu^FEXLKRZd>neFDaN6BAZ
8WnSK^ ?Vya<eTlF6$aHVehNMJnHN8^!:mc8?Vup1PdKGWc4EjhjCILI#aBBqIMMqEFQCM+Jh=9R?cA$J4lZ\K*
8C4:GB 8Db\*MM#<SN*X<\a5k^qt9e@W<lYJ5qKcclE8NZ&eTEheeqDt&59w!?1iBmKpVXSG?WW@QLalJuqH^/d
&@uGF? @QQHJT<@AGH?#=HZQ=>89CBR#<#/EnRV<!@RdC>A5@/m>8l9%VXjkQ=X5J!b+!ZwZ\Z1tVqjk9=FBW<Y
DNDL&K F8AL$CCPZ/GbZwJt@5YI5VC@BQ&4R\IYqliktZ<XcYh=!X^n@pZFXlcYq<\%b6bjwX<!%=lbjwX?!X^n
HDWidT @8X+9&T8@jy\lPWqp+&N?SjuYTDkj\9N>N>C9&m!5j#CQIBa@q6w$H<L@bLJB94XkSVwJbQ66%QP*$i#
c%YH\1 @:jRj%<6>5@a@?1E+m<Fa9>\R5HG@D5uFCDP*#tlaGJn@#?SVYu$j#mdE6j&wLt:>1@bqLZL<BH:tE<l
m>>QC9 CFN>>XDk5EyNDIp<VDk!G&pK:DH^YlL>IWiqTkP>CAq#uNYpcTcamNc$?=^CGAIH*CF=A6>a/nak4#CS
IFa?T8 \YRPQ<wnSB$!hejdRGI1uEwwCqWbi%F#B95DB6kuWa?k?K5c4\XSGVC1GLnqMS*9t:wN+?!dpX&</AhX
amFSFi qh@4w$C#QQ1KSbFCCuQNdkGXhShu9:/Xa4y?L</8eGWV#n@Q84C5GRTS8+11/A1qMDl6Xc9XYS@XYQ%d
BMyaMM @tWELY\ejBNA?9L4HulqReAJTE\\/yBd65/t\WJ6=F!BNcykdNbACKPTGn+Ikw$ME!pK!\R#BEPQYkPc
hAZl+8 +^T>cZ%DSK&^PyCSD@XNyDeK!54%/19B#h5HBqi%1$hKPbu4XZFRCP6ZSbVwTt!8%1&Ch8qElyHky/cw
58*6/$ D$@G&eIZPt+^emP!BKqX>+*c!d8X/Aj&Qje*Bcln?AKKd=Wubqc+6qm1Q@AM$RmWa8q>TjwE=HFdX/AB
h&@6BQ $5t5$BlXmAwHSGiKKVW1$nWQFnF\He??e5mV^<ciJAXMy!=k8tINpc9eL4B^iBL=Y+>%A@y:td#/kM*n
$mX<a1 *1\E\/IXwt+L5nNc$+lPWh=jb1LjJ+PN8Pdb8K%iN$4w5t\LnZ:l9^W8FiC1TaG^?GKTwdP#*R5PuGJ#
#Gw$l= #c+m+K=!n6XFWnh&1>uRuNj=F8#^c1*GhWm:HS^*>h%T:eCwQh9VBTG<L#\KKt6:L:d&QB$StRJm+\eF
bI@J\t p<pq!*Fn$$>TkyAW*&dAHBkPt:KABin:K4T&mQTtC^W*IkXj6X^WEX>n=F**6Qbt^F98jJIS8HHPYp?I
8mLYk# <B6>NCqudaXZhq!#KDWnywPJCmEq5%XFhMY9t<F8JwY*C/9G^tINw<*YHIYVQVHwccA+k%58ljebuKpJ
QanbyL BLhP%Y@:ISPdAW>@+/!9:ARyX&4i^yD$FI6G/K\1+<\MD45An$l*/tLd!kchDN#Y>:A!DNMNbT4mI\np
+6JenX Dud=+5MDku!/ZLh!%9&MTQ/K#F+8A%/D^CSwk5DAE8u#Pl5$LPI>5Wt6n=!tt1@N\a<B%\e$lHb&lqmT
ASeV^% n#Ry+JtB1C+iaMWT8NSK/TMcHpmZWJ\nM$BCmMyAPWhMykBw*Q\6iBGJ9kM1m9^khmXHBZKDPiY5kP#p
mwi$Vd +R\6@mGpS/^#e:@qT#NbBFE=B6Dy:ib\XKSX*mc6ciq:wkwKHaVpNc1m1TP1^wFeVDSR&a:W/j8IMtZ4
-Ay6uq 000df507908001202b4 Page 86 of binaries2.zip
aR*L*w S/5JKLQ/4=6dTHpl+J@MZF8XE&#XdLCR?pM\Y\TFId&:k>X:SP*lydW4%J*d@Fm88jLXicu5D#&5G@9&
KEwdKj iBN:c$6W&LKw!1*LNdu/Ze5Q59p+iuGH8+AWVHqiPX9dc?tiL1KYqCHqbmplpXwaVyRZ$S@d?6F!iuDV
ikA#h6 yRaE\KFXhQKNwjSQ6#@ku1<*1!ccP>EIIbVGnW:MbEIXSkKA5!uP&5jk=W/9/$VtC=tp!yX+tK:Hi=64
:B+uhX L:<ecaQHRZ%t%^SNMmn/Jw6+jXE8#1+^wElpWy?Z*dCk6WBpuY8cmBkm!/>&@y#6LK=#MCeRTK&5694c
qVl?A9 1l=6yb6:iNGiIXJS<ZAubmqT/5k/E$y+atqi5$LTjmT\X1:!1dQ+HdmY<tNPIq9Cme+Qtm:Xqi+cdLYD
a+QZVR 8lu/R!5Nlyaw99M^RL>VFWYwW!%tS=Z/b?TcjSwabdKq/uMV>bGLT:&/iLA*Re*J&leiuI\LP?BB1MaV
#%e6M* p*aFSh&PIBda#ltdt+#ER!9XGi\JC<tAwu*95+$+Si>V=jNWt84^#dKdjPF!6ydS>GMiFZHjZZ>HSjbX
N>M945 aTQJtqny4hTBC9AlXpRB?Fi/<5*Zam^FP%jQ$w#w$K$KVWGbERR%p*bI@nQMpnye=h6k4t<uu\TteZAH
h%=XF8 tPuDB85bWBa>\tPNy#BMqNT/e\8@tB5H+k=?8J:4dkXiG>+!MKahCi*AHQmZPBV4^Sh=WeHe?tNRcdq&
KI><8: VjIH1a^4d%nalWl&$IYKjkdL%<&MHG@nB!%<nF^epR\=cBNP9iiG1kW*l\V4wG8+#eSiPC&IqLMIKHWX
8j>+Kp ca$d*kkW!MNIa*Mj!l6XNGa\:<<dLcAcl9Q8Bp^D<Z55jKwNMEEA%lB1RbujLmnF6&StyDNF\Xb5qEeZ
k<G9l< 6N^^Va^/hlpwqdpw6mZS4eDmd4!CLM=eim=*neltX:KVn#yF?jyycGuLEW@8?Ij46MBc8+aiBhISJ:?P
p=i&y9 KW@qltX+<Z1i$64=d89bjW*J^#X\FZyQR6Ql#B&yIu5/EHd&4N#N69PP8BlS9jPwPcii?^6cC/%<6c9i
+S5Kk\ y+u+I!+!h9aMnyTIj4dMM1NFJ=IbGa4J1wS#$AB*S9/c:mD>i*pZ:MFMw4ec+*nBmM/#tCM5I5uH&EL%
?$\Fm$ A:P8CP\5GcP\S&/MWeQBm<@!bhwaAu8F<+^i4LbCn+\/u<+F<!k1cqZV<*uNQ>P6E4!KnhKWa:+KZ$Ip
yjpIhh H6A+bt4SyVpjcXC&6#j*mV@8PXN:@+tPW^t8aD+WkdFk+TNq/Y*B@HH!1@/tTG+diedGl9M!cAIYjw6h
RGdn!a ^6cWFK:?*pCe18PQZj1q:*quqYqc^%TLH$FMhq:bNB>phw1wIlJ$5V:H&lwtB!njtIZRE/IcX/b??>Lp
JiQFY@ 8wV\A<i$FYi5^1cn9EbklVEyV*SepV:BMtTkW!Ly!%u>G^tq=lAXJN4XN+XQ&6VMm8j$^%RD@RMVekZw
cj!p^> H></D>4Dn>Fd^*:PZ#K*Hm4lWn!PMh*e:@*T#Blq#kma?4#4$!i#KYe6Fb<@^YASlulTLTHep&q5RJEj
YLyVDu RY85RFMtSY=kSkHRkVcT!>wj+69K=ljttjy5*8%uEC*?AFeyy$n^ct^HVN*Wy$wBN>%ki:bTEjJ+NiI%
Vn5Rb@ en8Xy/EbAXkMSSZJeXEw/6l=S@>JeWZe9na%Sd%FC8L/lPKwkmb\M?N<*^Z%+W*?IZLQblZbeTbJqEVB
A!j<qH RGbRRyJpq+FpH!VADL196N^CK$q!lw/?QEYwA>4CY5c9>Dkij*CH=$TidA#&?Au=N1HPC89#nj!&WMkk
9B?Knc V<*w1uQj$#HK1:P+t$+@E+ahiPE!5k:cyGbp5lM+!LFn5ZFSybMS^qmJdjeCbKT\1^P=^6G81Wta%Y&b
un@5NC Cb&nR/HV^qm=SZT1kaQVn#muQYZ!/LGKP@k!K*FBM&I!454RZ6?pe4>XEyHI@j@a??8\K4i%dSmu=1Rt
AtI/VW *THTHdNJhhINp&/pJ6$qam!/RSyEXL1:yFT/RXyASLyBBFVEYD>h#%y:4+D%5Qh?*8@:j5@^@1HHlIQ#
J#Z8/: 91>:nQMia+=#uPP/EkZL+u\BiXE>1X>L=L:8?u9n5nm@THZpuAppM:hiu?!6LQQLt<e+jRNBpS>55=#I
Vm5cAG Q4LlkV?Cq=QIwJcceV5F4e$Fh>mJWlWHFqjnN@8\Bn+WLHet!uPE/6cDq%$W49=MTKtqci/QG4DQG!QD
b<1J1# &?F^>W@!^BHkL#lctV>YSGu8KD%%:dM8>c%%t!\Q8>6I%I=>YPXRM6K4$FCi&G#*XmMac@E=Ly/Bt/*/
jF*H&J iE%=hKcYujc#/C\A1eX4VEt>/uS+XP6ea9PHkY%bap1nH4quA89dlBWN6uKEAmBbke^/XW4?MKIc>Zpl
*ZQ\Nh L6?/i#QBYAQ%cmQQXPcc:J>nF=$<45F1YG%LeYa?XknVBJC1>&kAQSWcR1eaPMjd?DnXkT!:uAh=eRM&
u$y&jM d<iE?dWXFMiqk/aXimW\1\h/lHF&@KJmE@Gjae+/IjB81lLbWXG^N6Te1+T$@b^Iu5XeNKeZ4LHYB1tS
9WdKFk Nbil4bAE<=V#5wJ5#L%WHC4uT$<HPe>=Tjn&lwpWRy>HTTZ^5$KYV@V#X5RXw:1y:EAVlPCnR%t1FYqd
5=XF<^ nNRS$5Cd/PjEHQQ6InYe8GQFIyphDGtmedE&b%5m:>hDZnEZW+%F>DelC?QK%Je&\pdD1/YXH%\$*:CF
?<XIBn bc=XauN4tu@!9MF:d^C@u#q+Qi+6YhSHwK@%+T$i6#ad55jKyjLeBZ*h\Nd*^==P%Qc!^<:LyNjahIce
+Nwnca 1PNq5d4^iN9=!eVc/!Vc*<wS>nM4lqbnl/Qe>@Q/F/j^<IdcIA!m:8byI4c&MYcAZtQ%!hP*FM8E\l<M
H!8KlN mY$%n=Nd+h5Pma!QFZL^\HVZ1IAc#1apa%H8mw:hFQF=<6Clw+M?VW8Fh#W!8\>$np/F*NGu8?lul++>
DG>j=P :NM6hY@^!nVF\Z!<w@VNVlF=Na<c891<El9dI9#K:>qYkFq>\p9imGTPni4d<YVtIB+#EpL^5A4KR@!E
Cj+^+= jJK8cIZNh:Fy?D#T?6::8<=*<q/dAd&uI$lMdG6PCqFy9Ry&^#L1YN8!&k<AiLiuC8e6*#F?d:dQ^P<%
<=Whje B8%JymbJYF<aD$!aVTk$JGR%lN$hmW\!KnRY\u!#LtY:@6bTHSHTH6I+$DiIJVP\bL81^?>9cE6p8B:I
E\F6FC Y/HSY$iqw/H\VkEj94X:b+B?%VFJMG<$y$EZD=km9n4=?BmAHn=iIjJ<9DdFmSH?nLY=/K#$jG9Lj6e@
qB=Weh P<w#c<%S4^!4IW=B*#&I&$GTIBky6S^mYN\Bl!TK=1/tbJpSSXye<$DH9Qkb$TAHII54=\+45%wPc=8@
nJuG1: X/6^@#9n6h8$ETw?9j4qjEXhDcilB=6GjLSlk<Kc$Z!W^FJH!9YW!$JWuGqW*HlepK6+PF?A^WM1uV9W
FjV5>9 \Teq$AIWJQEabe%hw\9EtTc\$SKnqHDASD#9tHC\?t^V<AVJF>innqM5/q!LRk&P6QkYd!hMiBuwAt6%
6\&B<M M6YuY:^h/6TEGuqII%qVWRLC<Y=DyL/h<\CcacQF^e?VFRb8P@yl*>!=jIpIK*=&QmCqZLC#^ZZ\VLX=
%R*H\V 59#6Se*5m$me*V##q=ya=BuHM11*Ru&JLAccJ8DQ6b@:1aIckVuQ8at1?Wh&w8wAZJVNyR$NZF@&BRb^
:j+59G :J&ji5pLGQJ&^5k=qI:/8Z9*HVHA</@\:\SX1#=Y&T!FS*\X1MWYBPkE$e5GKcTZ^6<\=LB$5ZDE^+5!
MdjJcq J\*c6H9:W+PCMBjRI9=TyL#D#bud1m5FKwaliHR=p9!F@nX=t\Nq^:JiARc6Dne/k<Dkqy=$paJ:JqmD
P*plmj u5I4uq:=MMHu*A$@e\@:BQ4JqB<I&\uw\R^BnVWdwTh:+VF^YmejGl6uc1D9+W=?ht<HRlRNu=bp6DmS
PE@JtL RN@1q1e:?eqjFtlmm^I4nBAL&\T5?ej!q5SF5%c\6t!:L?:FQh>P$yWVn>WiCmc+K8i:dc@d8Dy5Hkw*
b>aKC5 >+qNnTm@juMFiy=!nkD@9/1eI!D@ymEjCj?4IS<J?>eM?Rm^*<+h@PdMS+J@?\D=p$Z@X#uu#$IS+k#D
%YDB5Q >/@HGT/k@CNkF$AnpPjw1Rn+ShD\<>CIC/DQ%%MS!A9A+jB#SG!E/L@b:iLR9*c:PPSj/*c^*:yhVQ^Q
QZ9d^# uT\PQ48V@!k>a:!<@?6^Sj?tdNdF9NM\eeRQl@I948<jB%58aJ=GmQ?jCpd<?$9<@T&GmaF@mipC5TD@
VWkZ=! Y\i/8LC+MFSMXBR5LG69/i/N<SSY6*T%6Q6lR%jF*QRTquc%Ej+?+Hn@+p9*^Nlm9ui?>T<Hl@+6L@1Q
9m*yC\ e\n\:@>?cW?w&IYiAjL@5Yj+$R%kPC5Wm9nqWT:!CNA@??pSpQ>i4ad@*p@@K@Q@hF*aZ>X1GPS:5@=j
X&=tqk Q@*@5J@iGqButdlKVaRntV^CSA4VyRcNBL\B61@Ew+cAR4j8nwlCiNHplAiNcL=t%>L=*m#NyNb+MFpN
iJjHch PDQL/VR=AhliAt/Km1EG$WGK=kuc\:BnIkc\%i1McjQKA:RbuyD1X1&H%uVGMAADWWhpwhq>cIpR*ICb
Awe=ma /VwKNSbwjd!>B<%\8%\@nBT*V=15G:&DwBq!Hl1TmNQC$/ei\pa6nwWhTTbVk&R6J4:DDAi9cFGB*k1w
A>ETDG VtDI=MauJ9JyXBP:mjuXPPwa%*YZanywydNV5K<mXp1#Sabk=XKmM9A9HSJwchpMBu%bc+WS\\umtG&J
TJjnW/ WYlAchkQ+*qWEAh%D^C:la%dGme9c%DL$9GJJRAG::jT$6CS6qb:\qp$mwjdeqP+j8ZPmkI5Y@Y/8Ztk
1V%AMb jKASHt:?m\Ah+hld\l#chWWnwLk4HlB^9XS<SV&c>/>D*kR?MIhML1W\dk!pyHTG^KZLTweNqy5VJ<5/
FkQ>4X H%&*kPpqtVla#V!TyFuW&$SJ&4TnXyhWc:wpaVdaD=iCXmt>><!ub!ye!VEp\EAakuI@*!L8j8c\4>1$
LeaGj* 1R&AKFD*99M4V/pHnK>P\Cdmniy?L?+cm+++yG6+e>bdYu+8TA5J\SWd6HCLhdwi@pTe>MPwJ8\XVL\#
8w&\/S P@pyc5@4CuG?h6$#FyliVhjJKEqnuAi\ntT%W$#ZBc@J!I6NZk@j$E#JDDna\c5nQ1Yh%!B18cI$SI+Y
yd4nlJ $*kk6*Vm9AHX5Hb95kKctu%he=y&:c#P$#cp:8:H4q%!p=aXeHtqya?5SDcld+YM8qP:Qa&AwY>QZNX1
6h:1l@ ^4JijtN8cK&\KDnM8IBaEbHp9&MW!9mbGn6Z?kC:Se^t@JJ8=JQdDyl9:QW!bjRtn?>cbH<S=AI:JR:w
NV^4MM IayD#eYRZ*=PMLVEI<kj9wcljlSMtSM!^D4TBK>cM4PlCZV*ypdwL^<y!d:\6\W#QKYhIGA6eae:lKKD
@c<p+l eQPIhb$F>W4/y$ybB+tV^VQW&P=DiYi!QHIT4RLCauWp<jVuTh:hX^Q&+i@w1<1^\FPXh>5/8D>D?&qF
q$kua/ \lLY+$\NDhH6%IE:kpymFdy<GHeYw#lA+LF+YjhFB19T%<m6>w@ZkKJ$n<X<+q/5uZbF<H/^wl\KF+15
Xhk#Pc SabR$:#WwhMt:JFRF668Mny/hM<iidZDVwVh1tW6eh%?HhXa\e\18^Hwuwk9d4>8^+b:M&RMn%^RVK^/
M61uS& VhI5kMB:cyA*YCn#mC\&Hk:8PZIq+GA*$Z4*1b=*>meTC<yXLbn:yb\NV=iqQDFuT9eih9&B>$\eM!15
VVeXFZ Yem\k@Zu$&l4EI?!ZPaET1/\1#ct%p!tX@qL1uZ899T&WPpwDFZJ1Ieh+pqmtFM%Yb/W?hGmZH1N:V&X
*%9:X% AuWA*?&^l8Ck!a4kiZ=L\*:hJT=ndZ5>p<hcAmQlMnVp8Wa!ZybqZD4Qp>!8WbFk=R:!k5NkZ6LFZ%El
-AG5G8 00080d92dd3001202b4 Page 87 of binaries2.zip
nKR1^p +Ln5mmVW8L+&=PbENTe8jp/kZjC$NG^Ed1ndnnBLIDtml68:m^BCpY?VE/8FtG:cMC>NMNSJENtdXuAk
6F@G?e \/LTnW/9tMwHGp$Ie+NG:tPu&uPlWcH/SA!k$SEd^yAu%Lkln6W^#\^RBG*b1=M:!9hGdtVh1CRdZuMZ
84+Mwp L/<Gbl#L$ijLNIndKcSY%nF894+@^1/#JciaeWNBGqjY\VXdD1^Wc@?!9@J^M9I^D$In:j=chXdJ\HS&
:GXLBh 9=cZT\:q>bh\$VG<ny*hju5lyepuLN4:h!4iiWt8&VApbVtP*V6X=MQA/ckQe?4HbiPeT!*cNDpEcVAw
*V:ZLG h%BktBGeRI^lBQa&Y4>EKmkqPj<lnqYdCMp<\@1Jjdy11wcm*QyEn%?&c=?CRtnXE++/V#Q\P%#kt8tD
wyp&n# FC!uY&:KH@kmmE1tdm$t8bW/EA49>jFPnyFQ$#lHHmp\A6GDjHtqQ=hDipD=ERL!VN=LMVNV@jK:pjDZ
Ap6m#T Nt<T5uLEkQV9?Md#C/LHK%RX&:V\lE!mE5iK!FHN4Y<=NWTnEdRm?I^!8a<yBlyuuZMNET!ZDu&$p*^h
QKcq%N 8QTCGTK&b%NJ9i9BGiFGeyVhZ@SucBw#b+&Dy+I&EepXKS4Yn*cwq8PeG5LqF8*$e8>*5:nd!V^e=Vq>
8#$N1R Y5V9N4\6uQCTKL4w$uLalIT\d1j*qZ\8KT46<nhwl^6V&jT\dXL@aDtu6E%9N648Ti!FA6:k//YZ=eP8
JW8l+V :$\B8/tW/%cj+5=<5L$pFGNGPm=VMR4#4bjj@pTXE:JY\WDb414\#tb$6Ty/ck#@Vb</#t=h*%DhN\Mk
hKwN1b ?R+BK@D+8pDpY4@DDd15BX*p&<!N@F**T&/VSW9kIF4MVi^$GipBHd%CKVF:w/cQ@H4/VJZMNq%nw1\X
^WldD& DuPXn%u=LAcaijSjq#^=ia$#i4B^GD+n46C/JMC>tG:wFG^L*88aMdt?THt+yF?/QPp8#?q19JWVVPn?
eCHCu6 51METP\=@6bH9:hE=XFh$at9W#6@@RSDG9A?@J1AJ41h!mKq$:9KI&84Yb@H%/Y<b:#p4yGydI8m#jDa
HPA$K: +$VDnVI?8Z1DTcdt6=je\l+<lVe!b85k9Qe1FQMa>j\jW@bi1!Z=/V:>!<ylNRjHb@MpMIEilkRyuV&T
+^I>kC \F1J>yCV5tatLET=M>I*FLP6bX\i!a$bMdu5Mn&i6&B+6jbN+Rd\p6YXP^<V<<XZWc>*N@K!P+wj4L:c
WRh#py HJP@M!=\?5\I9?Hu:F%QS!@XyG@&Z%!j+u*>cY#HmGKlqPiu#G>8&pC#qA\qHhVP*Kd8mLu+kF$y*Htk
w:IWTd 4LdCPd!LPw4AeFGb5qiiyb\WlF^j8C8$t>m#G%Qe1LyZNPTe?aqAQ&4VjppaL#Tt>Rq9XwZ>K=!?8nJR
Q8b>1X *?!A^S&?LnW?wuFm<<<1+:*>p/&+=Q!K#IDBkahhRPNSLBQF9EhahkVAed<N=9&&9HdBLC9FbB@ubbX:
*H=HC6 KlNDYN/Xkm+>m\5X8?/+1DLPJ$R^ZTN8y:WeeM=SZ<l1$hQ<QPQ+&\@LV49ZI8bh:HW^jXHh=Aj:=BN6
Lp4WT> e=PEJ?+PH\GwhbL68BEl$+piqiE>FZtL@StT1wI\Am*8^JBeyiqRnda%$M6<EwI8?lLi$bt<<iEX1hF1
hJPIp? @8FqBT&<hYDqq&/$K^5k+lt4jihcTjimJWq?=4GV=+wt5!8uuD*?wqqSuC6ZRHR8k6l&H&S4+R4^wX%q
RF*Cd4 8Z/9KJQXFA<4Wd:4!&wCM#I5XSZ+kMB6JHBAceMq=+:tF%8IIbl<^Jm4RCn?NuV5Hq*lyCY88Y@q86X?
hTMl&< #S%FIunwmQVmuI%4:cX*&+@CAwAat^tQSk^^un/89u%=MYQQjq?$9W1C4%PbP=hH$/XPqP^1%daCkkZQ
RJt+#T kQ=h%Dkb&6^t?HK?VSmlHX6jLZqb#bIm8%pWNFNwqtMe@J:mk*Z?>E%bt%/kF?CieY6%!j+l&5?lp$G=
Ew?JNM LdB/qpua1mVARkcNB\VC=?&\%LmIiiTh#RAKB15Xu&ye?M6444M4*bXQ%yMdM4RY=>5PBk4:V@dj8:SB
h\WAbJ ZaHQiEeiJ#!j&a!MNc$M6F%+uZ$SyWDAI$nalXGFAV8d=c1<yVl&tAiSTmFEJunJL1#lRA/@6+8LNwZe
>L5SbK h\PeLaya:hiwCNy5aaT6%<Mw+#^RJ!KNayFwBEteFpeTY&mjK8/nqCLZ:%N=wW$4pi*QyBXEB!yYBtHF
!4:PN# %F4Q\Xl&aQuHJBTDNAha4%aEmRmPQRwX:muby<YnR5ak%C9ENK#WZa9P?JRJ?AW>^9hR$5M>V+VHBQt6
1thhAM ?1I&*%I?bAyyNFLc@cJn9&uj5hk&<+uDRHK%:LT4k+S1>RYwp*>:/cw5lXSj%\=tTL=d5C?GiYc#Sqha
X<KaNS iGpRKwqD#5y/yn!FlQ?@Kp<l#^JJSQ<m:=^n4pRmL+IYQR<6ilE$=B#ZGFL5AtmEPPIe6QlF$KLuwEZB
FG9j^1 F$HD#^HFSCEZRb>u#STFZkS>unXVFHaBNQ!<9BYm<I8k#:NHmq/Ec*DIiimLeA$tjl:/Iq!DuXQRHmb/
eI*XK^ Ec:B#nMSm%/Ec#@TW=!JF45I%/Du<X#5Iq!Duli=GQR@Rq?Ec?eL5GIZIh99SeA@wlH@ES4=H/FFL>S5
ebhY@> ==lK^e+Wa@@iqZ4BFB\IJC9$i!A@^EMwW9\m!y8a?Q?yaL/@1XA+klZ?@h?QtC+Rm#n+L!1k/H?9A9=t
pQiGPb W@&lA5LBmDNWRQE#MwB?H<VE@qh+XuQ?N*qYY=CJSTWQ$Dq%JFZPnGH6:k:ejN5%Xe>SYD1u>J#SqH*W
DDK+K& SNJK:6&X&ck=$dnSIGZTtCY5DSnRw&kiHBiwA1eGq@pdSyK5^KMp+1#=h^tA=J$ApiGniCeIYNX+tZ=$
LME@Zd M:=D9L#PAm$c+&Xn*AVA#ciVnRpEAKqJn=JjMcCQanbw1w<QJ$V8\SHeEm>$V%+cKAdGc?u*<cZHMBc<
$FnD6? =dl/4+\@A##Qc6qT!AX$YLVDjlcXEjSCAD9ItX?ky1cKae/hj+CZNJh!VDa&YKu*pm^N^8hLHT6Dp?*/
TcDRXP a<5LLcw46ZlMR*T*Y^9M+49k#eKD/q5*bHH9HBGPetAtt+S8MD?@E+wdIlJt$8:TLt:iTHIIM#ttQK&Q
?X^LJ= c@T?C4XMmyw\Wb8R%*$8&\mRFXuhMS\Z6cbQ+dt>RC$#ASA?HqyLFNb^^cPjHn%K8tMu^wq1R4MBbH<C
CFDc$: +C4NIDFX?+CEDYMA\QSbN5:+K6lu<bhE1jmPA/h+>dncB><iF%ipEF?K^SA*9GFS#*WCQLaVndhGhc4i
VcWc#a #R/^>W/%NuGE4VueLWj*lJyIY<a<d^GC8Y:hByStTVeI%/dw6GuDyVAw>Xj:ydLV%CyLI@9El5NNpC?>
H+BE8B dLAR*BiR<ZKBp&uwQVcjR*JCDqH4S\hZ8HQ#*$t=EQS+*>FMG6Kbc!8mRRuXF%eXHuA?8Xc>E:5FYVDD
<$tTyC 4\eJNVNnu9c$Vpy1!hjGlZY<mbcuyq=+VEI&?Jt<h@c&@h&9y<>D^iY+:+<cPbFW*w/<Nn/h?&a:X99i
pHp:AE eY?BQTtS1uHGZSJt?p1FFF^GS<<k@t^p!+iFF^NbjHeKECD\&8dZ/eQ4JQGPwMcWZpJ5uFyZh*Z>lkQD
P>/=XG A8wn*4CK?1l4jq=an^8>TP@BB<uDH<%IN?5J+H@hRRaMMbwpNwlE*ptA>wHYnY91daiNmm9yltpj^yly
W$p8!1 JMl:6pVeJdype5Ph/?uLSup%p#HnKDPHETG^pLtFS$P?ANK6Mlacj+$HWAYiA#*4lCyHHZ*5R/P5^5?b
RyKk@P S<h&me&DK5Yt>Fj$/wl\emwe*ac/m6tZ&&WFKd$yRmYKjD+DHt<H?8+W^$kdRIpNe1?l>&YIYb5W/CiP
4Y&QX< NppDC@R4=XnLk^uhlcG^X=@\9lY&*t/=6&ypRe$iXDWIw8GCKuNjA65wch:Z86?:X#WeYp4=Tl\nketK
+BHuuN =#y+FGqwn=F^G>aSphP@4p8AmXqC6VYl$hSeS4hVRNuL5C=PI6&qIQTi8n>!>hXqhkEnpj#d#!>#6>*S
h$4dll QDJ*nqS:%?>85^@w\AybI9ZECWYZB@8=*Sb=T6GIXYB1%Aa%n*+9&@EiX@J%MH&?b:=!&Cn1E8?ucDu9
twwaM1 #Ch$?5htjHKXh>%JH#%@:&^ybHWVD#8Py5BHTDXRD8wknQ&i66qm6ZmV6VCC:%wS6i:IcMhC!M/<BL+C
aJd:c@ *5?=cFdmkJ^A/qE$HdacqTP@eT:Cu>J:*FDMINc=J#n%1i^$nLK@6:Tkq8+VG96netG5IH>/L6!4q:y$
F/=mlQ $Gw=!AJk$CX:GSqi8CD>yj9XFtV9XuL5V68Xd$KNHj\@Q6LA+pXncX%S9XPP*l/?XDK?IFe5b8p1@>Sn
^<cnnh :AHqIKNSiIntR=Ee?mb%aiKB%Q:/eAFdKjMaM*:=$8Qt1#T+Cq!!lp+?/$@Hd9KV<H1NPV5wXRdL+ZQ%
LJmEqH C//K6?ZE1SJV*6<mQwT+G&hiDZ?Y<ZmT*l^X@*FC#JJ$H5Vt&d/AV>5uFubbD>e1dbu\XSGEiPkP&D*G
Ru91+E W8R=?w%/qj4dWuLnS!J1q\n=9$LMD\JQk@A<Q:Gequ8KLH$K?jk#9mQ:ejeJ$bZ:KqRW8%\QE:&C8FN%
KPwJ+* PN!K&5S+&4L+^1cq55jYlLLWEity>XNSGW#Z%C9G^C61^n<aDnB&QCFhKPbCl$F*C^w6<^NppVbtMXiN
6kZQD\ d/4ed<X+k=paH:kNCSZ\Z:iF9l*eJ%L:yEY^/meV%m=LIiSi>1^G9te6E@iJNh91JY8dWHQ5eu<uA@<Z
lymadn XFGZPVXVC5^9QAW4h\LR>IQ$*k^FEtFDA!Y!!4hhFkQ+6<81:?<#6SKE>99L*8knkNQ?yN:<ECVJN*4J
aP8a68 $c^#YL4FInYq4dGCeh*i?@W^=p9mtNBSlHu*lFn/^$mZN\yD\/@$D8^5dbmRh:&GI=d\Z6QkJq>PX!dI
=P4iHk tM*LVZuSqNLpihhj\5Yky!Y@p5&wT8h&bZ=pb\L<5<SwiX=:dWueX9VcKCBY<Rc*6%@tP^%>S#chmQt%
bR:WE# @5:B&/I9JJNw*5W8V#HG!R8JE6*C4<D6dVVdA#wC:qbM>aW%C4A*E\\/TwXeKZ?j\YVy&*Lje>&XTM\p
cC\<aw RFNmDITuT=?qhVZA89>Fl54u@CHm9Ba:Ia%NL@?CuubF<RBtIKHZKcTtA@yyP&4Y5HWn&=IqJVi^^pnw
&=tmwM /djE:E=m*=CHR9//4#/QZ6+JYSbci4>Dl<Zp#p@4e5LCXnnQ?NW>NHKXZkh4&RBdKF59DuBy%4Q:^Q=V
I%51W@ elS>Y*#NcR8bbNmCqy*HXh59ujlaqE:A&8tq=#$+yB&9*4\?CwwiH$y^ae54Y!N=e!qu#C%h+Hq:lZTq
:LZbiN 6uW@A91NQymjXtkV%i^%c#N1@M8lb1P+?K9J=<iTZSYPA4HmHT$lbqj46W1S/>5+>=1a/b:Z\#^lT1@u
m1uMb$ GQ!8LEn6cc1w948TWdmS=NpQRn?VRGt4F?tQFNn<ZCBw1!:ZDwVKa:+N9QkAiX9W4>c15\wq^XwEXdHe
HQSuDl qGQ%&>uC=8Y8h/%!/bW!**h6LB^K\1APFd$H!nhXZ4l?HbTA>#^4XjQNny6^\e6+Kw@VYephG9+M=A^%
*:ZDlF FIS&cN1EmRmc^&AVEFB&Kw+H>@qBNt?:A&SCIuB84^jnd\@^l#@dS&eA5Hcj9cZ9GAK*:i\jDH/B:H#a
iDemSi *>lie49/Re*&5@**Z!+L5>1/^^5AC8w!l6<C8e4iqH>AeTT?&jeE88Ya^lJMp6:hKT8^=iJeK:Bh6GPN
Zddj5H :X<A8u*a&B^b%TBccX6>:ySQSiBiFHhZhw##^RaqwC?mXy*:/$:HH4t6K9GI1yQGkd8EI&6YICp^X5AT
kN&6Ep 64L=:WnuKAYwqk&+5X9BjLEVC<KIZlY<c>GNN=I+bhGJE!@+5!I9?8%pm>54/y*uNF\=Ap=AqWZuCe+G
-AqTqW 000ea9c930d001202b4 Page 88 of binaries2.zip
Cl/a8^ u8lJ<:ka*<ISwZW=M%LD$Nm/4*m?iFmLkZlZ6Vtj$?:n8C1^nPJ<8wRHB9ZeHZTiu\%uj1eqHMa:>LL4
$FAlm^ /k^?JHaZA*MFul^GVZY>RM/PjBCA+:PGi:t1<THl6e5ii^SFM+jcYKj:GuEi?JeE=>$W8hk^^#JYC$pq
SnGl$k BW:p8\5DZ:=^jGq%>kLtDJLaQTiyyD\M:!u6A+jJc&j8bC*qVH>XSa:HY>Vl%DJy4n9%C#<6yGKH$1eW
$B=\Pw RR951Nl:^q@cCM5RYtpw^1%/*QWid>ZiXB1NNPQAE@\y4y1lm9<$/PXq1H=lca#I8=F1!F!K+*1R=!y@
?KH/jD 9B<A!u?TJ<KFT+8Gd9iW%uML6H=EH$e/e4:laH!#4Q%Wq8W>Sb<%uykn4^Q:EXcIRID<RJ5Gh&JbZ+Wn
t$G>85 9$Il8pl6T$LPC:Y5mFWMbBIPYdWn<T&C/h>W!WhRIh8^FtV=W+9+t?*pedRHdEL#=pwIR$yFRPc>1Ph8
TBCDp@ H<XDebc<WmFiMIBN#IMActELW!MLS\G4aEn8F@@<E5GeR!DKXlwpyi>\Y$MiS<b1W?FFQeD1qCjAFanq
a$n&B$ !n%8W:ui!h$#!EN/Vcw*KMbP@XJ*<*^?^?h\=A:q5dj1B:?c6tC?^WM:PbB/&!8bVZtdPb<ESuDA!MPh
F=nERe LFqPEha\$l&ep$umLA?ecVjqFZtmBSG%8*J&aBq:mcdhK>KLL*B:6PRZ$WC95kjYWpC=DGB?/6YnNkG?
Idn!HR Xu?ld*kWJ$KWXeG%c$yabpwwb>HSh>#i$Wy+JaIF=n@q#RqX!?l&:SdtdZ<l?\a=dk9tS6865Ml+a/8P
b:eW@c =bt@W?G&KI1*e8hScMDH&dlGJA\MmyN!\wyWGCqj4kGm6IpCJtG+eFl\KnJaSpRtTDT+!M&4kYiqAbFD
KH5Qm^ nqlB+8Fm6IJhyD18pFy4mFc>%ZuQm\kPER84+djII%m^\MNK=q/e9IbZSLwM=GZN\MN1IM+JAkXdGE+^
!ZGb46 m5N#iFc&qJTJ<HCPV%khiSbu&LAKJHPjGTkqTqq=b^A?MR+GmuLpGub1WTyZGhZhFk<yqJJ4IFwM58b5
8cT+C: ht#L@Cqu+V&BEtFd*Fl^SWXZCHjwVYMb<lQ?L<:>9H\%>mk6@WR%j\C?j\!*=\\?FwV4b#cZNl56WHBb
D+=pqb ql8Ae!B^BpN=HA9yT%X/wn#?Tp/\8bREY%cj9n<&*tXD*pap#+/HS%cZWW5Z91LB^hyJCP<&p^%A/ZWT
dJ:B>: CaF9!CAy#GZK4?Mt<^\hZc?akFJ>CRYH9V9I^i+\4EBQc=Au&c4qYMXacV9dQq6<T+1Fcn5waNj+aP6/
ZYW!KD i1j$JKTIP^V\Xwk1LQRiyTM$=AM/n8Sk4mR?CcVE*bb*dD4C@QPcm%Qlhq8b*XWCmZjkk9YD#h&iV4:l
blR&cu R>/>u&%*5m^:mII<\TAacVla^mH^MnaqLu@CT^FmPpLwGwiuHnnT$+MVCq45FK\^:Cui^eP1$hB?#4yd
u\tiW5 jmqSKwVLPST#^VZWFlyqWWVYKGV^$w9V+FL%G4ncC#T+^&ZA?SC1J%lV:D5?MFl\Ep\=8q@p\Cq14eFK
R?XSet *W8Mi*%HShYJE%T<KkMkw#AR@Iy#ik58:!SALT9QtF9#JbwLInV&1I!kD5J6CGkkiDIeWQNpW9@nGM5c
m:PCG< /V%mIY#m&#Ew/d9yPKEi*Q1D=DEp6#X8WA9b>>@iHG@e8X%Vk*$:R1ui6k1GMIaFT!t#I:YCC^L%YDuj
&yE6L5 P/q\BG1*$inkYmG64!IdbaChBd!N1myBWmw$A4yd>Zy/SnwIe%a>K@HqV9&\D*k$dkcIG\d%WXwlGjCy
DZGW5Y MPqe&elkd#!cXG!>DG#bXnaPlHFw!Q*/mwRkGR:NwI#XZD*&EGNmbS19wVh9RS&F#aPkJ:L:*<4YFwT=
C8!AJ+ Da?KTH>c@6qqim^8kn^dVD#W^$VHklwa4HR@!<qILPiEK&Jt+ptwtI?PtJV+jSAHndTK#FZYt@RbIpGJ
mq:c?P i9\<l4YlKanRYRF6/>IEYYi6?=hJQ$pt+wb44%ktPV^JtFFKaBBJ\WGC4DeJWIue%1FKPLcENDHAHF5C
>@:9wP XBcBqS!*SSmSFV%B\IBc5V9B+m1I>bCNbBIQP^/Lwj:B#Wa5LHwG:HkKl8:Mt@$Qq8=u*l?qaHnG5HV@
\kG<i/ ahQ4l:PVDA!#D#?>iTT?<ZAyAQ9?m+e*N^pC<QAaQn+!&1VH$mA%^u*$cR+LhRLIIH8MyWF9>P4S:K5H
9kuTFZ S1?!M^m^GL1\A>eiMb^kj^wlb>l=cBq\PjDVa*@^S>IBDJ>tH^y4MC\FZD=XatB+u!Ml^:D$niEWp=?h
E8t//6 ny%l\eIwt+ZC#phlF*:c!MtIjN^5jQp$yhk@4WA/wbnl#aNQE\?^GWwaNtEM6/JyM4Fq#4dtm9@Q=kIZ
69KKHY baYJ@*p:SERZ!kwBI=D@#6/IPP#j<*DC\cJ@<ZDC\ekLiDl@MYu?JqL>Sj+/R\@>Na*+::bL^M+S\MWS
6RcWZm F$Gj=<RXS%+EDV9u5Lt+/EZRpHNpbHG^C/AS+8il^T?CFn$dDRiDL+IGm=?Dlq\Ajc+ADkhDL>J5=&Rw
6>A&cq l+NlF*y\/Duwm=D6QAEe@5i<:8l@a9>Y1j*Nw9tLWk8D@%Yylj<?+@5@c#YB@&@?+@<V?a?H@+Z<^$JK
EAylQW XK6:\GJe4M>!a^PHV#pC!##ykj*pSi&wIjbGP4:6cB4eZHePaM?AaBd%ICHaKYKwDyh?XlmAY/VNHI4L
yIa1?j &ddEK^VTR+&kWpJJhXF^h5QnNHRN^hT>H1AkcyTjW<iHTAaNkHY+lkNTIXT!KFF%F\!DKDwRNaCMkcP%
biCTwY 4mG5:RjE+/^Be/QmFdqqACHRdieuHITDSK&K:SG8yRXLXZdMFb=TYM$wcT@GE^YWDy$bpBlhLAD6IGEb
1c?C>n q<PP5KEtnhNLla9Z=ma#hej&8XQLad5p#=BPQ?RCc<W5V6mQ?d4Wa$J\uXLRcuTIlkXa/9AVGDDBY6F@
95XlcI Ftp1SX8@D$Q+^/S^CeNjNW\XB&w$6Kl6kw:84GHmcm6IJIiwH8=e9b:P=PWC^\cRkMX*y!X6Z@uh&j8y
Y^bC^1 Gi!TqtSt8Qae991T>Hye4HDKC%1#YdPH6*VXW81=kY!DLQ\E<V415dt/4W#kSSnkC+N=4waZLcKY</8#
^$\</4 *e%WS5qZI>TZm^ea4tcN6Jjj8Zh*$ek%1cR8F#Ql5*=V\*ZL=JdNK<!m6DhG1=!mbPcJph=%ZAN>RmYL
GNYmeh $4+!kA6u5cN#ithL@atqWR*quWB#\$BW5e%/5t&TCGp6MlG/NBuHAX#I^q1CPHBRQ&MA89D&*pM9KYH\
V:uD/d ^#m<nF=JH@?pw@\i6Du^^E\/hpi>&c^FAnaJicnEwj91XPn!%TqXdAPPya\cb5/Fmb>^>Z\GtT^Sbblk
ba?VS> 9IEqta1lQGTitR55PGBR\edhyYLBSIhH?bX=%bPbWF*\Vh5lu&<Mw+9MqKiV/pTN<%LpHj*$&k6GAtcK
J+Ah$Y hiVwlj5:m#CX#WyP&/lV/TS@RGW>QhCR<5tampkRRdWaSHj:ZaIN66l\nBkjY48iQyHWjDkG@F^8\QPl
=X#ab: G5C$J&CBu?AP/GWJ9*p%VSpM4?$%dW5ikZ$ah\dYak:=8:^\*m9PGjlS&=atJ$E9>1yDhP9Jymi$\uak
?i&u9m lTn>TT?TdWe+aTTtQV^Vl*WG:EnKV*djT8$#<TL9uc&9u?V<Pn\jV!yyc$S/CG$c$EuLmjmA/?HlS6TZ
?1MQE% LBkVE:SI?V5dE\>5R6\AlE6?ZS@*8QQ!9BKX1lhqCb#4&TVh:yJuJ\jVXHL4Hn=IZ1\cKqCt\iE\6HVA
XLaPRp l/wZEKS@Y^!MAGa6>6b?hB&N64pMCZq6*5S1W&:cb/&tHC<8qYVPNFE/wCWCiCFJn4yE55Sq51M6#&%l
=RL:$$ *L=m/PW$PP&ihbSSj+q/F\Td>ttR*!dt%L$mZhF#R/M9XMI5=1P/Vwp<WIK<kRI:n>Tdq^^AMGKZX4aR
C#MenK t#TH/M8V1y>JQQH6ibw/k5q\+KD!!/&mlYte@IVL<=BJQ4y+DX*E*$Xq+y?^YT%a*nV\k5XhF/C5#m/8
<q+=HG t:m$*pFpiF^E&$LdSJwcZS$PAXT*A8y&%S&!@L\BaJV:VAbwumSe##a&+:ThV<9R%da@$S^&p+cLKwXE
:<Vcy\ ZM@TZcqpPw88%NGZd:tk&Ij<juaZ!nq^Fkq@wpK5p!^!k*\AJ<!^aJ4C#N?PJJtccaDTI&6aS5W?I%ie
<iEL?8 %Z=$jynYSPEy<WTLZNR\=W@mBREdlS?V!I%RN=^G8q<IQyG#^@Y:piqXR6VC1KpWc:1JWd&VMFiFh5t1
>w=BaK GWbaQmZV/JEF<Wc>X>MNGGwIhl$$KEM?XD:%+56%LYVqj^V#pcG\$8V86DBwTZV/jZKD=AMQ#8kG6HQP
d5C/At WR<@ye9M?^Z^5WhD8w#lY8&JY1kCw>AYQEt?Mb#cb^B@m/B+&@ybhnI^>XmdqyjP8>a%8eEYR\hyape5
nTyH=! /:F!dSyG@jt/%DRnPl@dB=SjG?B%EDBqX=d\FR&dPE4GYDuc%BkPP^jIM&DiiSYGc^SJNC?Pn@QA5hPm
NYTm<@ uetBQMytE^u5WipnZwP9YJ<:NZYab#><LY#Vn<tdLJh?u:DWIblPR&X8WZd@J1*8q=+?AXe%N?iV$1EQ
SWIWI? +jBW*NY8XA@L4GJ^!JD$RG=<AV$#X^E#HCtIQHRuX$Q&Z:iTBJSR>Pl6^k@%PbGEy&kCD\eN&d5Pq=+E
aX9bJw Hn/eKC@i#a%6*R>nRH!6melKN/6@N#p?\X?Rj4>wq@6l?DmKZJukV1pJ!^PE^M%1e\eNJ:PauL9cbhD6
*Kk5y% wtBd6<@4>9a$@c\dw=mM6X\$:cjF=#Ep=V1jY6%IX<hc/G9yKG/L=!YdDyZL##itJZVh<G+Tcdt$uJF1
+QEWa: RtJ?:M1%d+Sw$DI1N\=ei&y#=WN$>9nu#Fh:NCyGh9E^K<l/Bh8j86WqGGWS+b1uKVR6<lVQPlX^Wl9c
Rum8aj 1<Q&>99F&h?V5cWqP/P%pl+@@K44/=k:4F+W8K&/>WkVd%K&=CibI5FHc*5h$!*BW1C5ZMuNBk$lD*YL
c%VE\A ?$^=#9CH8L:H9LTyG*w<mPNRb<%Hn*Gh>wkiB+/a/>TTi$quDIK<8/XRleH1Sa^D:Ly!L<hPnGlwNc@9
E=<D+E yHepFBFa9uC9Fb&$VZVb+dtu1D++pE56:AW<9j8+!aCYNPtwI@?V*jmuBIL%MKP4<5^8T<ytq^y%T1K<
5?\5:c u9%M\@iF:Jn$<P/:G<EKhY>>H\i&Ik8?Ha^@EXaHCJl9nFn5#V#FRQbjC/hQHL?T9ZLy+<PH4=a@Z4=*
Mai!?? YBp>5QhepbD>>Kjyyl6^?%juL6%+4E>5yq/et$uKd=qW+c6$b8XL?B<4+Q\@dV&D@:GE#4?\9IIl@:1<
#L<QYj ?pj&19>?ijZ4N<8@jGj>/$Ll6?JM@@*!Cu=GVb+#$Mn#$JCLwM>bZ5HQ1Mq#B91e=SZ<nJw<j$Yj6:!C
?6=YA$ u%GT=\\$AuaPGuESNBS!Dly=AVSe>L^:m@=HcLELwH<IHGinL<I%&Dt?TVn$Iq!DuiPdlEM9\4Z#@GS\
KHAS\8 /EY+BlW>D*$S4pES=/E9\nWw:D#$SdkGlb!H9knZ#q@KR$W9>JKhR^jwSemGPKj?E^\1@y?kaSel&:qC
R#R?b6 AP\mbIPjJ&HAwQ<SG9ajwiF@pnB?\@/hlQEQj>p9E5c9S?#@hF*EGYa#MB#=9<J569!@!&#G?CM*Iu%j
$l$5i6 dIjaZL%$YRT>BL>@YSqR8c1wIqB#$!JSWJWX#S:K%1bFFYcJYlTNp<*Tbk1qTB+pDGNLhkLK+9a6TMSJ
n/pwBa a!%K^MlccCi1=>KnEDG=jhKZAFT/M/In<ePphiW4<JjIpcV*YI&@tem85SiyEEG+kG\6Bc?A:bpSn=<=
/ydBSS ^5y<dYMLKShWXbq5\RZkkKSYR/q6X8T1hPLHYIS&cmcR/J$DNHKMqm9\i4jVyyQ=m/NpGRakib5PSm6c
-A+m>= 000083faf85001202b4 Page 89 of binaries2.zip
Fpt%G# dW$b$JCPkyII4Q&EMQmAWFYB4FCPPXSqP:=EtL!$paCFWNWHWY6TkeBmMl?nZ6+\bWQN\GP<=SQ4a>%X
1%Z\14 /elGy?hii4/^BI!Jt>TjTIeMGR/6BXkSJ+Ql!\e>19hp!ei*RpQyAAZ\&FS9cE6u6uwN%P4q9IH#:PnD
DKIHF4 Y6pJpTJWZSQwplk@RW4$t1AA5b=4#Y!$imGJtm:ZG^enk%^tcuuu8:^%%b<\:bH4E5>5a\G+>SRq/4t&
qI#5@D 5$FCZ5h4LKcGKaFX^k>/nMwly@8Zt&iNAIZN\uW!4%DYku:#=KSL11R>SpjCZ*5<=ybZ/%>PCPh!c4T1
iQ!aV1 j$4%1A5^4qPV>StDdpnJ1aI5BR19DM@=YlPcLh>^W/AhMqu@Sk&a?Hb*ADw=$bZJw^N:jWY*ZqJQKHRp
<Vc9XE i9Z$/lV^+h1A++ph>uSWt/W?1yT*?N1e:%+Z6P6D%*DyF%MlLIu4!Ni%^%Y6c:E&F5^4K\/9=>jJyB*j
wPVLN@ IECZcA/ZRc!B!5INFkW5BEVeWi:9p9IXE1Kw!Xn686eV!S%JCRXi11kVFN@j1FQTdyqT6i9jD\y@bt\c
dL:iRW #?j8XN!WudmdQ*uLTHP4t1be#NAWX!Db9Mm?Q9h\6Ia8J#4M!j=b/yP?il*wc@Z+y>A8cklqJ9>:QMA:
A$\>W% JP8Vwdt$EmqukW*ck8:Q%Eq#h+RG$HWF*JSb%A!ipHj&%NhP:6dVtWKE*EE\Ny!F^\t#RRC54WXPhmpT
Rb#cY& </buRQud8^*A^A4m@u+\1w%SCF^k#A:*E\b^6R1H^1>N*+aL1^&RK%yweVHPQXPQ&u9e%dHI#NcIeh?1
GY=EwY kk+wR@QJp^>w8PaI!&?/bp$Ki11%l&t1PHnuyi1KSlFD+e1Skt9S8=qERD#cNFSYN68^tap/*qc\9ZAl
cKhb\+ I%559lCLdN*LcwLwCW$A>t5C&kLHy&w1P!V:<J/kAMQ8nG&MMDV&YuMaqcSh%FPTybGd&TF6#YPTAA5K
1:N@B= k6+$l:qt<w=ENX*/*4CDX%I<^hFGBK6%ZSl8Fy%Q>+SKD5&A5/ibXH!lGQ9tmB!cBMZNCP@HhXB&YT/@
!wF88K P4$9Z?*JPjq^<1$JYQ1@lWV/G<l&y<qb&#Ru1>W@$J:cIF<1hp<:>FjYybPya>N!V^Fa=<W*>K:eP1R!
?eqRlE >lDQHPbQInX$8BQ45T&1#l<8HE\6HlW*Z>>Ra5&TRJ^=w#dnjl=*JCK\c!di#bu^Mq?#RZ8AKI4Ryk\*
jN*R8! BJ@RSktSaDH/JERbRn!S!Gn56PVQ#YqApdiuqR!!HIhyj&58VC/KyC\bGSnX$ZwqA\Z:*lR9=C?&5@ym
XRRjX^ u$G+dc:HJC*nHH^VVeQ%ybGBpC&*cVTA/wyMYqi**kR@8dG>Y9%L!wWuPqT^%q4HM%K#FcMntZMQIkCe
QeYuW4 l9A/c#614B!cy^VF9CEN8nWaPd/I^8#8tMdkZLMcpbwaZLw*YtyC9cVHCX/VJn*#K<\PPRXCyFw^\P=p
B8BPtS 1+F!I4ZGHQA/9bPHh*6S$EnLhLDbj6MhkdZV=#1*Ymee=mNE>Hu4?9w9eSKH1meD4%yQ#eIZh@9h8n$/
F^4DKY @NYTIZ#BRnuc:!5t>B4j<JSM%uyXQ=8b&:FqFm4y#lH4<Zyty^P>4hh?@\qy%en+ep$XjC@F*11\WDBR
WiVXED %!q/KjcnMnSwMNVM6h#9AS$tq!41Y?w8NX6X/P&<EW:h^@Nhu$$<%qhC+N>&Wq>61BqM9?Sn*=JP:!bV
RZF4>V S@W>1b<V<ynA8j!RL<y#bej$hhHlN\%A?Wu=@Ve=^/=?ENiW1b1l6?LBh\tFn6:>lIPX4YDGPJGLiT/@
1#Y^@l 1H44$ZS?^Znb6JjnAG*DSG1>t:?pXuaap<p^5>I\Fu>GKa*lBNu:eNY?jk#dCp8n<N$1M@*hhup#8ipK
<VYLZm XRd%R=<JJ=K8AS?1+nI9qaC=?6EbYi/NbI1dyYZ>Sp^VC*ZVyP@HuK9McRm@pAmMa#Ey5b1TEIt9QGkA
kqVVnB bYZJpBQlLBpBYjQ+kdqk&=mXThkYPEFyC8XGt65ncX5Z\ukp!1Q?tPu:>>=HuBWw=j*&c/6&BM9THTHW
6EAeXp RiJXiNm<D<J!D/=uY8L!55HJAXZNcFp&ApnY#CyVdZISYa/GQ^T?qbe%I+N#@:Zp6tP:P>jX^KlMTyZY
VyP=5K 86jJh$qBT:mnikh?Q>P$4l4J8G5TSRaiKR/I?:B1Q>DJ&$^MqKRjZSlVH^:weh5AY=4dpT8Dyy@#Vhpk
41JQ^d EnQt^bNIL:WZwq/d/qk+pA\81<q*ElK@Aw$Kc&S:&\wY>A^Sap#!S=G\!!!bR*+?hZGibtdey/85JA4i
XAMiS? F4*ZF<W<L/p8lS@hEmI=<J^$1:X=hYA*?VQe*@QDC&c81V$qc48%cian?F/cwd1aM?%i!MRR:q^@C1Cy
D%nk9i eN=1nDt>uc9m/Fdy+ci^T<5hZmuRdKjh6dR4>>GZa**qyuj4bXtm8tcimuk@Y15yIP5#5W>%ZP#E/1d<
ei>SbR RnamXHD*iYlbdip*><KlDtj8YbiMV!ENuZ5=tcmPCwHJcV#YG>!XiP8HVSl8EPiZ^m%i+SD>1CJ#S*e4
PF!bLy w%%P#e&ed^8pGAe\1Q9&/P/IiYkl$DE=L9<4aIZYtT@t^iaeYGcVqMA#at8aID:XNt>GJM#<i8?+DCci
C!L@?4 PM#+D6n^I:ww#ncZCJ\MKl6!IWtFCZ9Dk1Zk8M=:8L+IWw6XYWQEmDhT%u:N1kc?+4@PZwTI5>j4KNkk
ye1E#> >h+I\69wjCVI84?JRt*G^Y!SJuNwbPDl^ApK=\ALe/qaWh8L%D85%JIhqDAq#q$8%K/%>^WqKMy%Mnn*
:CP9%% =JdG9C4PRLS/w$liq/#!K!\k!MjqBCk*R^1FA<VWpAa$AwTcd<RhTAq@RPLIKC*Lp5wk>YV<PN?bmlZt
:GYi4N mR9DY>bVR>BZq:4hCXiF#ecmjG#kVt*#>ZILS#HAb:^%yuIj*4PmNc5up#cQ$$Ak4!BPp4W&J\9W@J/n
&q>G$E ITbGVT+kpJiPwiJbEEBPF#<S#twL6QILqnhi:\mChV5Y+8GMSZaS!yPdR+/QMa<\:Ce1BXZl%c5tNewe
DK:#iw *X%#\>Nt>uZ1WYw&+&kj+K+ey%m>jA$ybw5#aFY>B=<nF/@W$%!nSlNjjyq*M=e:HJeB15jm\Q1WPJTH
N\I8dy aqjYJbbFP@\!NLqw?jR>&n5H#@YFhwQq=4J44\^RXhDH$+/#8Eha!#NX&>D%WMuNE&ZRBb+Kne9e1PmI
!%l%w^ #MMpX4qBhZn=Ck1mZHA:uWhWu>$Kce$HaIEeDb@q5tT=5&k:nCh8SlX8#Wudep@KC+1<ue!QIejD&5*H
*hhqQj NDkN!&YnH%>?IVE@H8NbK=XE^Y$YNQ%6Rytw!9R%/*yt4hW$TXpN%^MAtVWmTTFHih=GeT+bbwA@\b>H
&+liQl FjK+%n^NuZbIwaNpdj/GkGQtSHK4\/1&8#naW*kyGl5CeLeB9PR4IHDB?>JX%Qh6m+?i5mTW5p5>lwRh
%m?6tR b%cke8y!=RR$/\&Q9dadbbnl?QBX>@9R4A$lunqbS+L4TXly1F+/?X1lLS@l:tub<TN8YGaBydF/YP/X
mMb!RR AGqid<+iuT?#5NhTY5G<u5:PePm4ISh?ubF9:*:tyL+1T%B>dZu=a?*Q@Dy:lEj#yVZKMlN94uDX!l<>
/PGNXA aS4:91baDmthnkuX%ZDGy\9awyP>LG@dmX!q4:HGE@L!>h$tjR/k8Dd1GXP:dkK=t:ki#BDZ/6eX6<mq
CbjK/t BweEBG+<b5K>^!S9eVDPlpjKtcu+dAyQSL=+!CLYZ6yJ@$n*CPWmq^/DJeS>tMw*BC1tBMy\*m$Zb@cC
@QG6S: Y^J/EA=A%F!Qh<a$k1D$RTE=a>E%i^AR4<cMABS<$QPRGj<ym<1#Ew8PZ14MatLu/^aD+aLN=SF#=Y:$
<GKjLP $T@RdpR%JZDnDK$?%&M6GJ?X1ey$8tNAFCkwNwW&>4%:DB>u$yDhbaLJi!:nd\t?^ZPHXV1LjZJ+1lHb
a^m9yE 1WjK&8XAh%W=9e\nYKB$8am14w^LGMB11/F>GlD/JV?KYY6TZlyuT<LDQ*QCk?XFZSLJQVM1VSX?jSe$
LRMk!m XN9S5KPQpqeRulC5=pDe?KqQL1G+1^w^wIaK88+\LuS<D?eAcaG#<HZ6NbanB%$<e=5iba#V66$tqt8@
GS=G>D D!c@!ESpIc9uJ:MBRcEQGN5Zy!>DXlWG61^4^:M1S#4ethY%5>C$Ntu9q?#DmLJjnKTliYXB*I/</>>T
1eK4+H Vu%IwFPP!Dm*Zd8IZ58I4!dP!M4/%mwcFXW>nY1c91=mSkBYpuF^lFy6q^8a>w:>Rui9aA<l^Jmk%%lh
RbXjdu yeH>d9JWjHw6j%=+#?8G#TlC6em&ARm*ATHBjw#>4LNm!YIe1DJGE4e4Y!PS<%Rb\nG&@yPL=YY!IChk
:@JeyB ke#cbC&k\hlm<kSwj=\H%1\$aPqyILtlaTTmJl#cN4$lylk!<L456qjMWJTB!XZukw<<PkTF4Gtmei<@
wK^4J% /ledjL?8?YG!l:BwuHp5%wh:=lCwJaPw6?9HBqNN1i9*WDQh^Q+m<KP\aM5ZmT$*^JZeRMAlGeG54pGi
hQS&d@ 8$c1i4IpetwjhZ$\w?Pl*DI&Fn*n1:K4?wy&TL9FwhAN5M\JubDTyk!6&5L/ZbNKXyGQ???yD&RZF<uE
8ejhZD iDN*>G6Cjla<wS+/ab\$BBeinYKmqIVA6+%Rk$ECVpF=pCD&FS+^%b6+%KC*uQbkmX9/jPCR5yA<iE?N
VaNBPa EpSpQE^uXN=&*eM=\Yn+Pd>ItBuP6DFWPe#86w*L+BZAdbHN^t>4u?XV5m!yT+YW5<\W#I>eV6ILkpuc
^jKJqu 1M<?CA:@a?tS@/?bwiC\j#PlHj!jPR9@1hd@+$#ij/@Y@#NQ+S@DPWMTk+qiXK$@w%dKGin#%Qw#c1Ye
Ep$Kje kRcjw>/iWT9q4&kE+l!>@a^cKYikaiilaShBu:hVeEc6qL?m+ij6FJ^SK?WM>HqG4DN1yb!BQ4jXSC?C
bFWpCH Q4jXL5I%?Lt6hlG8\e=4NeSF8Aa:4>WRF?Ec:L^YR%!Ec:D#Yk%^Ec:B\Pjw:amLeA%/VpWlPPImZIPi
wnSB\B i??LeA$mhl:/Iq!DuLenl4kI%<:jb$BelG!R<@abpBel&:qc@^@#VKL@mj%d^j\*u><9m4uaYcc@*!h@
wt/#Ht @EiTS9H9k@Q@Nj*>n=9?<Eu?b$%@ad5ln?kkyimmH?pclYuDqtR#cN6Z5ncZXGMD6JpBJHIDK&wpYE8\
&Qn%y@ WN^TtHCMVnwcCYAdXJWWliEbn1uZHB^Gkn1VycG^=e!Gc*Bekl<C?6BM4ARH:/1p>qnT*%u>6LM5PXBq
tMi$9+ y5X/$6A?NGhMP>cYyGm5*\A=KjYA!8dIyFT#KEDw#l*kaIP8wYTVhL!YSTl6ClXaiku4!IE$G%AMNl+/
y^1%Ad EwZB%Nb?$yFQ?VLwkEicMm9T@kE#Vk%KGnKE#5di@w\Q\E%tbAnF:X8/wjwp@>$hQNwF4Pt\yFjTWuB5
?kL?q^ *JBSCS*D#469ZP4ck\\dci=FD+:wnZq%G:IP*u+lnbXNCCB9NWm4%c?N&hb^6Gu@%i<Z\%#Kl/%ZbWqq
*B9h5Z IFm%E%NHm&Tulap:/$W<TeJ:H>6\?plq^CHBwnQR=L/AMlJwGQ5T:6m$I%p:=n\>DN\nieyS+^ndalJE
nGbeQk P5Q!yGE*G:WpybyLYy@TbBl6TH=>h+%MXN9WXBL+8t\R6iBRRh&T+D:M\m=Gtp8HjYY\Xi*uymQ>F%\\
P!K5/@ 1#wjdK?t5nW8hVceLL%5*Vu8GIc4qK*W+p&%CukM^1@/VFI$Lu$6w\Ne/jpWEjXIXd!8jb>cj\6wYKtC
qY5\wH uJ?apKPji:&VG?*IJ9@V>mhLlWMG/Y<H1^8jE!^/!Y?uNYAjjaYFy6M9Z$$J@T!8R=d+@wHZQcA#^Rta
CDemXH ynXa9\/kwTnpG*cAe4#56EAch&u<RX4AXt1Nt#yb>RQk5hTkdHd4V/AW?LWmEJQ54Wp+Yc^<ddnX:4m1
-Apb\i 0009a393696001202b4 Page 90 of binaries2.zip
9t+*6b LCyTQdj&8Gw<PEDI4CiRHJh/qNk$/JMcTN:4&uLR\8VNZQF:uC<#*?<*Q6=?/cwKKYnq^yyI5NE\QZkQ
S@!QbL F/bVcb!=%Y>i!HeF&dN=<mC+IGKui/L=JdyntTplaq>LBL^meCqt1>mdeJ+/j<KIlmPEA^F*y/J^lV#a
41m>8/ MMdXc!9l=yPWPAdn:RYQMZ</4EKd$Sm9BpmEiF:&6N^!\m%T>@c5/j!bM1eSKn!^mlTjclw!ZA+4C#Pq
dV@<D6 b!#X6G%S+=@Dpw81ySn!Lk6b!>ZIJ:cP5G&EdT=QWJl4&GINAZaQ<^JFTG98HDd%TnEcjA:V^q+*GRnY
t:GmaH PKV@I1SkV=?F!%p$1+cL<k%^bcnVJT&%dPRqFtq:Yenb=9V/>QYNlPN=H5:*X*ZtPWn9Xd8&4!/Gb\6G
15B8tp mFJEJnd=M6Ld5\6GKQ651V4Ti=pS4^mNyEb$Vm=*+8cSQl=pP?%ha@/<miNtDMeCl/8AH+?SpFnW>eCi
aEH<9% Ku=ai!Pq/4tP/bTljc>1bd$Yk1dw++qRiGbkTiqLqjD\Yhl6E$aR^IG1Qyj8p\T>I\!9FEbCy4k^!\6c
nC+k48 >4#Sk:EDj4^4^^4+DAA6\WQVE4AWP+$ZlXM&lQaGkE1IRl:HBu:N\F1SKcZmkyP>hlI+E6jjQlY5+qHl
pPeTZM !mBK\GLciXXhN\I$dEMjZyaSJIS*j\LL*!FI4je$AqaR/^eRZl*GShiCYeTiA#p5uJaFMX6dR8XP6y@M
:\C>!Z <!yEK/+IQ$P!Z=4:QFKqE/ui:=<Zt%L&REX+!+!b<:nHFP#8VLl%\6C%*a=L@Pm/q5Sq^P1:c/NP/ni=
TnN#cu jht8Vn#1%6t&d!:N>tXd^MmVcqWmkEEPC>SQd^4X5#X1QY!@:nR?p!1#$W^e6<AhGpa9G#y?t?$=kE<%
TiR#Lp e&:E=i$Va9ySydXR:>&u1ua//jRcWXq:DF@:M#ju@F/IJnqNY8<*K9k*cNA5i?p/>Shc%Q>p!n%lX:JV
hWn:&+ AE6=qK:IdIqlZPi=uj&5A:GbhC@Pp\Vlt^$\#^N/*hN^A+>1X5Wp+@W6im/H6yRuq&ih:*b/jH$YyXpu
1@W\hn &5W=qlI+#blbnK:phM#^C!\j:EI6M8R:4JlF?itydSHcWKW%*^@+wI/QNj9A1M1h^JBX:wZVDRSD<RkJ
b:aZCV n:wYhHcSMjMl/XjqIcaZ@uSZNnQTQGI5\Cy>hPkNG=y<$Ml>eby!cS!5kqj<iIwPHuupkDa$hc+TJt4<
:8<duh /$RGH=W&mcqyj*uIm8lwJAjq>1E/!V!%YRHXVeMIW+CEKKu6@DYR*kP=JM<d8nnnuw@mXF>4c!ICtD?k
mW9imR 16+*>CKZ$tFR%AC^nD#EWp*:KnjicI/?JLucXIwpXPBKjH$HSwG%QmKE!1&8wiDiPDib:Abu+WME6Hp<
Cq:cE! pP#KAtm#\^5+PAy<iu$VluK9E/?Wa@kE5:<Bi8b>nbFH!k6q>%X*iIMqT%@qCRZ>bP#DBT#EqQkB?*cQ
qt4W4/ %F!TQ+aE?maY#bHen16YtaIKanNKM5GqM*tj&PmGbBGjc1DJk@@E=JY=ujm%jKKl8d^WcR^cPqBdMD8?
8F%56> jdPThI8p55l5JE<qSVPV?y69q:h8L+pk=pQG=QFDn=\d1l@EFW?R^HNNMiASbwpdqKChq$S*W@uJp%Cb
&AKu>P Z$tH+>JaNG?HWPNZIQ69teeBtW^K?=5tl8*CCuhc@BnB/wL>Xw/u:NLDY$LY/EiQp!QLdV*bwJQd>5LL
yR9Z<S I%4>V/pYpQIMS1L%&ZeB+q^#MW%*Jhjk!y94u!@LlwM@=85d^#HmPp^I*YCjh4tta@Z<@5tZyMp+9@S>
FZ$S+: *6&<XkIpJa6J>awqa5a*=>XP*Lj4T$>/pc6P?YF>m5\&@NVV\qejl#QHE:L*KRwcEW^HFJ*M<tnED+YA
yc6k$8 lH^lXa^ii?t#Zc$*<jV^5GI<i5HYJZj9Ad<>Dll\JL>151ES*ZN/n!Vh=/$M@*ct*i:C95QMi#J6A?WQ
$p!Wjn :n!Jbc+E&W=RF&:uQM^1Fnj:*h&ckuCXF%m&L=RW<e6!VE1Sh!1PeLj=<$KMCPX4km^CnQmDNQJGZ?DS
a!?tBM *\<:NS$c<TRa!T$JGwk<!A+u#!K9MZQEpMyhJ\FBV@iy>>+&9EKjNkWLj8HNe?^/m8iPC>y!9TM!AK8t
i*PPG\ @Wy$%Zn+\EwE//acB<qiJJcm^5<i6BthC1ZKu:AL/k+K#h&15J/+K?J5XnqX/S1>tH@WJ?!p6It+N&?$
Q1q<pY $^\ZGncnhaq<uRNI<B/:GP9dAi55\aJ:yAWIdbNy/\MM8\Z5B:<Lm?E5qmAe$qdhIZ4Y%%aW&>yjPEhm
TTTPla kX45NLeGn&8Hp1wD96X^bdk+:TcTcAQIhY9dEw*CPJnLwId9=w^h+/KWKY$Wt#Mk6aC^biPm\\QI+5<S
YTFVtP J/6cL%qpnhhC?SnD&dYD@SIk<5!WlM^&LJw>nL5iL>uqy/*!BPXZ+Z%cy9i%^qN*NJ:%6%qR$B4EYVSY
ycD@C9 $yD6P?/HWH>:=^!@*lHdW+?h6aThj+J<8+>H%55KXYpyGwuHb+:yXTEqCcZ4/+5qdw+h#w4t+#dcnI5j
abW%Cl 6*FFwal&q6$58lCJn&bI\1Li#mj!6pt@e/ERYamLb$\E!$XBd:611R6FqmW+uHl4/+i?!$mTh<P*Fu^k
m@K&\u K&m8IMCl85iieQ^5X+iq?mT/tw+Nn@En45Ja@Enb9hR:idw9XlDaa^$?MDbYD\W4HkNwcDuMT>CtXkB5
M$%BQj Z+dSATKTcG%YYhcIPDWw?Tk<KiWV9<LqB/FW?C#cLQIBR?G=$y!JBGa>K?!WKP>cY^&?nlhEB<YRq^T%
M^4qP+ nQi+J!$uyBwVh*ewD?#jQyPY#*9V@eG!m\ZE4dTRlDdhH:F$cnMNcVXHe/yX/d1*haH!j=a5DcWbD:Lp
Et:j:Y A!KQ&pZCwC6+Z!YXtY<X8^yQHLFGB$8N?Rke<Ww9nyCYd::S1W54dhbGdbMCnXm=F<^6%cW<:I$=h&<V
Z>ed$& +#MjLh!L*yLBlFpT=Bq1d!iPG>5jiCbSH5PFXl>HeSC<w!X%PwaH/V?Pm4@Z9/uYji>1pWJSL>T6=HdC
:<Y\bG %5p*wtDT1HDTP69<dT\@VY<ky5!bMLpY/F^5Nc1RM!QW&/n4*cDdnic\9/$4QK@ZqeluqcEeVCybEKQu
\LWJaG XRLE>@^C=Tej\hw1%&EPZ#b^/1wXnL\Em&iZY>CP*KNW*TYJ4DwwwhiYJ<yG9cEWnIG4Rq*6dqK9RSQ#
\KFL=Z Jc=!wSR:>>SpkB^6ypD9N6*XhKY8?K5h/j1<N96KNw@aK/daV\B+y8u!WjEW>1+RRqTNJBN4%l/QJlJE
YG/WS4 JT#Z=k$teppIycNM\^$RJhPaY*LM/?K%9$MwpVqqKL*Q^!TAM8HX:qN:=y%X$L5&%PQ5cL44J14!wXGQ
MN8Ca+ 6uc*Edqu&45tkpBMRWF6!N$wDh&5hB5FpGNDuc11jL>FyMKyRS>#i?J4&eK=tN%8+@1cAETD/=DNnM?#
6TiBYh t?@i!m%ZAN5eS=eDGXRijXcVYE@JYF?qBkYHtK=IBaaeSD8eBBF<$TlTpMN4J5NQMCJVB1:jI^6^Vm4M
cltI/S ePc+iVZEtnKeDYXQL!>:R/pp*y>#5bVKDI1LNt44C5<:*nlmj1KJ1<>*a5%^HXQeI+qn#5$6!B%AQbLu
n9QVDj Cc^46%KdadWCK^WQ<HGM<%yF<c:WChp<hLL/Bk+@+P#al%pqk&t*uJe:5GX/5GW5Zc^5&YkdAhP64G/6
LSRi5Z KpF!hnuJuAyq!5EWLnm^nw5$49hchVHnT1B6H9%uQPw%IJ6+AqTm+HKWj<+IIScKd*upq^P@CwKL9=#+
ZLJC!I njX?kDXA5Lmck$NP!B4^+<R9*e$dV&:@i8KZL6L9Tc\j&*&@q<pWhEEMT@h9j5#&y$6uwH9wL=44j/QW
l5LX=^ u!$AP!*y=yP!H!h?/X4<$<y?uQk%/L$q?8nHmh?$mX5wDZ1D^:jwH6>Ii*#u=RIYZRS&+J1@RT9&^$S!
4^p\qP 851d&V>P@N=/<6W@MIDl+<Pd/bR@V9!ikBnwt8:/Ej\+<Z9CF:mWny*P!WKQj#5AP#AAP$T$>P/M?1$V
p\QMA& q55uS1GNJpGBCcEG8Z/mcViqGeIM!mR?ZuPV/V1uGA<eCj5jFdu@Zi9=H=P8@k6m66kb%uP^m%9Q^e/&
$6&QLC uy?SlBZ?c@tj@::GD9!MJK^uwJHu!NFuJGE>A\$>S\w@I\u4Z>GI<$#Wb!SlQRN>uqS&SlLYM>Bk5ZQR
mb1DD1 pA8k+ih6IJ!SlQWM>HpdCGepaV$DDV%HaD\nCi6j$iiK81IZ+h1=w1:wSdkGQW>jFL$I%/Du5WZ$Iq!D
a1aYZ= \5@l8ilF8Aa>:!T*&EY+h4+5K\c=WPnuWFZ5ItSDmJ&nla6hlG\@5mtjnj/LDjwjheu?S6SF@1=PQPI*
&MydNa *@Rj4*8YDS4/9b*?F>mk\>u@F>iJb%KmA:1k#/pVV<k@Gk@ESmY&A>$*6SNqejMM^IVbY5F<I>YP8#&l
TDe8Ml FLy9pCHEmhMe/46?C>SNApZT#PWC^55MahKwI/SRM5wJlJbGQbdVBl>aK+Zkpt5#A/mq%PZW&c#YRKSi
\PSW%B jdPma?%18=A^pN?Y/Ak5<=XWCI*@BH#$YKpHQH&5^q19Y=Y=lKw5NR6Y4Yl*@Fq@Y4Zepby$WN=cW6Q=
$>uYEw V9y#dX$lXXN\cSbK5u9mSM9pXYj?a#WqwRBVJtB&X>S9FiMJ4P<MDkwXA#T>%L=1ltJ:<R:!n##e8wXH
$X6CaL 9Q*5?XYDui*KWnVie/E*:9\D<$N9*hH5Xc1t*E?tD$=Z+BZVKGqj*RVn<YbRHWudM$XL6ZH\Y1tb\@XR
cBQt&* CqNFa!QccGb1GcwGm$d:wd6J6P*J*i*J=ehT%^+IYXi+N&KP:mmZ!9ue*19T4A@LJuu6j$RH*/u/Fq1l
5=hu</ ^VnIwBKGaB$5CCWiiC>cpVGDEmQNyi*PM&=t@+cI!S&lyy*9!H8n6B9H?Ly&8Gt9*Ma=8FZX##Lt>ad@
:DEFR: \9+DS8a*juX6>MCV<Ty/Kd@*uW\#dLLECuPD8:9pI6EV6HZ6cySd>8QmJ#bQ%1Xnhh\&yw=IY*bL6^eR
\:/H#w XZwAGJ/RXNl/1mK/LS!wjqWw5KqH6VA$<&P$ZaLQ>88ZHp%^LEN?5Vj4at\aluQB&5*cH1&\N*Lp4VKk
XFmQDe ChWqM:hlbNm^FGm!$jKtm1X6+e8Al%qWjDjp8>?p<dIipa<FY@ID@B:45+QT$?FYSaCa@QE!jSIwuq1k
T9Q1^P cV8j:\KD:8G/k^6Nl8lHuMY=Y>j<?m!:<NNGJkchjAKnA&D<GKXLq6Fj\^&Li>kCDth^m%nD%jce88JS
Z8=iHZ DFwT:mC&8uaWVWu@1^ATl#*l!>$j8X?be!VbFm<>R6wZnFyL5BtSZAWI/jiFSy>aPThkWPC/ELSBb/=*
*WaQpL /Tj5@NY&>G^6+B&5AGRaZhda%KKZcj/W+qNi^tyL4#H=Gm8&%Qw++>XXnBGkZ8/bV\$wJ>6J:>%\LV9%
?S9tWL d5hn:j91#t!j?XGw9DtJAq@N%!CXFh1!/hdHQ&ZXT\y$#+iyKWE$^n?qqSd@SEbHiVPN?Kbcj:@*y@YM
XiK\aw Feml8t6&?J!^Vq&T4p1mZ9@tjQ*m!pPmkBK1/mBb\9StT=S4$!bdW=SFW8$uDYJ=bC:9Di!^RAj%cklc
/Yw$\& hi6php$GwS$R>BN*!p#thbWADR&Zn!%?nZ5bIi8!#9iH/\QR%A!<9GC8>/4n?A=ZhQJPjBcHJTqa*<41
\ECyiF iI1tVeySm?ieF6Q4ZyLmw*<wey!aTpCQKF\QiIYL6qXS&u%:NZ^Y<HJTt1ShWwp%%VAWn%4GbEl%WMHi
EXn?Ql nFna+buJBmYhRjhV/!wLcVKqSDil6#N%/S>mGkj#/W#cW^X!&h@\9:J\AYWQmahSP<iN+#=WTn/I%nqP
tnPw=l $%#Ztmk1AK*1=qZwnp@8Y!5H=ScIW=NdT$tk?=>K5t%VNlnKkRH<bkSZbT@dFjqp!qLQl4Dq9CSL5:aY
-AFuC8 000b61bd0b4001202b4 Page 91 of binaries2.zip
&G5Gaw Iy&HlbqaliGC6M*WnTV^Ci/+ae6?eEpA#11l6E^nd4%>wP@h^B$@5BCa=CkT>:yNnIjH\h^J$ZdA*L>\
EjCL/D MIY5w46LA#t!ql&GpWGdQW+!+K5aKq4CMXKjhN$y&c1RnAtbdN%T$1tkyHJa*B1an^VM#lPXLhq9\tYZ
\^NbMA puP$khipW5nmit*I!w<SNk#SiC!MWDqk%!leZSY?Vm<u4T*t\MVHLL#<<yR?NQT+N/eqM@Tk:KEnjj:S
8\KP$# %Cjj8pCbHECJKSKaTWIGd4*cul/I6qH$DWt#TZX$9T1tLX@&euZWB:TWjdVp9@4YR/WZRHVCkBc@KW8e
85TWak /NI9:Qq%yH?F$AdGZNPhDA:HYtT\h5/X&eR<N*qR:1F/&+*EI4DtGta8hNcR>%=5jtuhThpWS=Cp4qCm
>=>TWl VWHcpa#ZM6&Lq:FQFMwpS8HEJlH<me?BB4SN8i>kBL$StVwVI?npW+%1PYhGZC@@&!ZGS<YF*IZXNe?T
<%T!#M uS?W1qR$>X1qq6?XBjX4L!X<*eLHinDbE6R:NA99HJX?uL1&1n6kH6%!c#\D@j=VSZRSPC^VuI+1@:ai
V%^Ll/ ReQeNuWaSTLjCw<!lI6ccAd%I8yI%GI/t<5+DR*/kFYmHD1=!AttaHQ=aEy><*m56&S@tjb&iX1#:WI6
4i9hd? RKnS4Ech@^RQ<\VJ6FZ6=b:TpF+X+1LXnyKa:@LQ^dY?R$AFa8eBGW$6Mw@@qL=6++ccF8:kuQJ!JW46
TadGNn $dyC*E&:EJdpPL8TARD%kEwdme%jG%iREhy88m?bRL6p>1:WiL6R9DlY5Ml9Gm=Q%?N+<IAnhR\:VYGF
uj?9IX 6h8b9FWED%5twRTXjVe6me^daG*e5%H=?W$@MHB8D+wQ8AP5mSiTIVInVG&<:=6t+/A%jhMNL5>i85iX
A?=6GH &<K9iKXq$XI8TY18@ca+wL%wVb?GJhtYNX@^cyZ^/=V4wiq8da%4L^$#leQ9S@DGdZ@<tJ4@^Se%6l*e
!LAh\= >edB=eWX!S4:Ah!=V!L+1$h5BM@9b*+Cp&9h$G&Y$q=cdcG@JYZeKWpWj1hhyGyDGu<J^DH$ydqI=M9$
Dc9X<e k8yL8MGZYWVc=QnZjQ::J#TBwCbd^\Lnq#w^jRcE<kauWh84h4cQ6tLt*ucZlQM&J>qPd5ha^G!X8Cnb
p#Ye/N P?Kh:QAGnGCkMRR^w!EKP@upANI&tj&8WhKB&@5n5TTW4kRTu*6a+:tP>+hG+m5H*pdTaL&a>$YNHKDt
K#>Tun SaI&>hSa91pZ>G!y&Ai#!My^86y>pF&l9P?w/=K#Ka@^DS55B=dhNqWeti*SFk+4C%P<V>nVGF+Rp>R&
d6=H:L D#yRC8@#DmlMj#JECEK#hA8MhHYLjYKq@tTu@*D@WEl#yFi?VY?>yF+X@ttQ9ZE\bD^!Z$kI4#>/lX#%
c68kqK Ddb1DH<e5!uYw9&R&4NK+<WB!wchdbi<ZZt*uJ+m%?aNd98I$<D!VB&lmkJ?!qK?XyDAD9qP%ZMmcnVl
$Lm^NI F>%w%=m1KP$h%$d<pab*CADl=FBH%jQSHcDM\F/Ahu:WXZ<A=j8<&^5!e:\:?81d4WB=JSpLDKGePQ+G
wJRM=H QN#S5$yhwTwaYTTZ\i>+Y:ppkkQDGpL$uh%S$>dHd>m4Ge5>4WE+Qq*VFj!/h<1!G66YTWN5tpKXFHyh
*8I<dm P:t@6addc9V*LA@G!PB**iIj<iBK9+5%SKwcpLPGi5JVA^w:Zi/^u^<E9qaqblcc4<b!udJABiCwMtyN
M&hmLX Bk?!mwe<AbI+??Adq^RM/jTYcjG#*P</JFYVcPp8!dFbJNqK>F%eTM$Dp^!TJwZRbudHG!q@^wctb/9Y
=l=ayI pYIYKyZ&?FaQQ*C\JEej*mu8TI9^9p5++B+c4^>!W4cXa%#<ula+LKDCmpj+pI?4c6+lXtl^m>Xlj+:#
ekN<1K E:?GD*iw+ad&Itt**@#w1nXFRAtBm5<Ra=LCuCXA4X<n<Yd5I!FmJbIaEcmk:@8hKE8C^6S81JitR9>w
@<E$eD IY^L=RSIHmX+6%PNuWT\E4hL&LGHZHkMA=G#iV@We@8ICaaH:n%!:SqtpjNC&<tli9KEP>ZpS1NqS4\w
dN#l54 F*jdSQLtikS:ESQM&n189l==@X86G#t48nHi9Wt!yFSAAY+56jnYSjB+N<FywXaLS!h!enqwTwAT#yHI
&8TCBS E/R^VVE66th@#VH4JjG*q=wnL@PFZ/=CEQKVD+/?#iI:P1n1!pL^wT6E*dCG=X:9YZ9@ibhHtKyl/F+d
d&%FaM t6mLk@\NNFH5NWZ4/^%T=X!kKEePH1lbJXGd*/cYK&GNleh\ua@ca+R$hQ*A6uT<jID*ci*XaM%h&!we
&GquG^ F>9^CDRHL8?1pP%ZZCH81FYN^jXWN/\P>%G+i*T/A1ARpTi<ldP+ZVRqStaq8!e15et+M?T=6SYAGY#8
teD@:c *tQiLPVBe\uKE^+a:iZ8KykFc>&&y84pY9u&b5JY9&ianu5a$VMLD^puLakX5HjVLBn+:NT5L?l?tyDq
YW#4Wb RC!qunY!1mT^GyK#?4aVMG/mREn8M&IdZS%#!!utj65C!iE5tJe^FePi5@yKILSHC@JlR@EFd&R#!iLe
j^&*Lq Wwt&:/yu8EPi1XJRn%IVV*V/+k4S*YkQ91*:QN&?Mh%yI6Hn8kG:/ZKC>wiLyJE^b8?^6HmmTdybi:Rn
6EqYNt $4W:\YB64\N>d:V^>Rlq$6A9Z*aM6TG?#%^J9?&t/Xb!tRhN#^#hX/8Yi5E%^XaYap4e$Sw?@ZTM6JFc
%+GR1b WJkC*W&>Hb^@5K@b6mdTNc##\e4VKpFQ^tAj6ak@aFGR4b*CaYI%4iE?j&RjmdW&tiKVaa<JY8^cNK^I
dyy5#D ND#K/I@<W4h:*:lkqthcyWh^4w^MSqh8D/QhyX:V4%E64<&?LLVq:lJBR6:&^pDjN!E8YRPRI5GQEw=T
9Y1d#@ $EbYjQwR:?tdiu6+GKC^H1<uht%1JpHF9F^DRy$9mSkj@u/5RWpY!wb4DuPpS%yRC%5+<?VeBac!m5wA
XV!&b5 8hkV4dm*iZID5GXD^FJ*aeFT\6ci\IbVBKq8Cl&&b:C#yLY^bMMtpucjnjc>Y%BMCK//i&/6i%TC?$e1
Am<8w# L>>DnnbQ+IBlEhu41!R4unk^uDu@TQkaA5t^JcSGA>q@TjlwkeLH5TY\KGALmADXF+A5Bu:N?amXTBCA
MR1e9$ a5^&ye%&8jYp/hdLb61Z#&nd:Yt#C?k6cWG5:Zh8#N==Mp?<tEquGWM9uWMu:W6u5QeV*h8jSA@wyQYJ
E8#yBL &Z#y5$PaLL$byFMb@EkC/epC^WC$/Xn$kTHM&EEMdMq$kT1WM=BkNpG1yVkGT=eAin!tGX:/huITNuJ/
h:^PnR 6lkG:ES/Nlbm!:5MjyeC^Nkb^QVJA4:SaqNTTujSw+=Jq/lCq=\CV>kb@QVJLBqbyMjJ5>bJ59Xb5K?F
F$n9Lj uq\Lp&=n5I!uY@^AKV%QHTlF!/bQtc%CebIhkl*C#JdIkP%Nln1p5lTncdikbVMqd?8PwQ<iWl#>plXF
qW^!6b RCN^&?\>9\@jF$:$aqhmyJ<^YQyTL<qSBI^RB/JyLQXy5E/w^TVD^ABSq64p&T#pYTQpqk1$kVaW$tkG
JPi?yJ :GRG\>\k:DaG665WdS@I5yG$1C?Wu/Ra/MpbDIQDyP8nA9%w&>H$&ct$F19Wjk!ylq$M5%aM$ptBq4FB
:wm\RD /ZSlYQWBdGFMu&V9j<wP?BSGi#<6RH1AMd8EedcPedd/kZnLA?#d^NJ?>P&iVE6QM#?NMu$c#9\$#hSi
JbNI11 S>d8^^mIme&&j6T$>?nVAc%$F6Q>Ecd:Z=l8jtHK\H=<m5QW*5!+A4qlRT$=S*8iGC/G@Q?EGC:&d#1:
m^dTaV ESD\Z<S\BFn<Z!yXn9k%Xia@JQLj%KK@/FBumH>mwliX!MZEL+KGuCNdmwM9kEceW!MNLk/=CBy!n1qT
JJChIh HHwBNQ#ei<M8kQ=S48l5NQ\CcKn+Pd4nGRqH#$Cjq!upnITnj$YjL:mipZH$nA+ZP$j$FL<R&SDu$iXC
4y$<Ji bD9H8w\Ak@<nNPR@Rq?IdGLIe>AZIl5aik+c@l?lL$R&lNk=/I8RDap<4>Z?\DZyZ<bdui>D4y88&*i<
8Bqwk9 HK8I84m\8DBWHAJHCpQ6Mba&\4L&GG5uB%e:aW6lJ<^NL&Hd:=<^u8/iD6@HYlEFXq/$Iq4a*ecY:=iB
SmtT4? @ELF6KDjb\GI1Bn4n&R9EHH\BcyyIj/ajk9>#$j?Y&Xj:Hh&dRRW>qhqH@H:QF4@WQcSawn@c>j?H:X4
M/!wJq l@/Tw@Xj5Y6DN1qY**KCeHhniHkbD=u#&W4AVXE^%CA/TDE%RZ5aST$9AN1^cFQamb%:uR=R=a+YA?Y/
%cuipG c:<M\e%nbAwqYaG9m:ZH&%P4TV9*4R?!!V4Vl?qa\/D1MMM?/uA&PYqSWXJhFwu&dNR4cRBX!GWS^BG=
4NML!1 6SVykd$h6M:Xap%bC#c$l@w9B#b8WSeT8W?Ftl<E*+H@plJFS\LGdLmqhV#jj&$w8XqX:wZuwDt6hK$b
AT4\1L jA6NnhdTl6Mm6IT$J4wj1PmM\Iy&JFZRn5!R\#=Vlq>6$#4$>FW+ia<GRi4ML&$$y%LT<GM6AS/pV/y6
SDZkZh Zwp&/TR#TT!<\+kIn8V!LyqyY\6Fmw/q%K1<YlKT=%/B/bk>%ykR%bHXu/HnNIwGmcq>9LyMyd6uQDV$
>eC<&! tmyp\8BP68<wBeAyiE!$D<ZYyH=uZW!9E@G#lFq>Pbu8mq?eI6R1?R9GpTlRN@%B9+WPHciK8%wYNWF6
+ACmI# w>cX/RyclKJ<5NMD1P4Wc<L4AG^*Hd:8ILE*+D*4*J6tP?<55wG%<c$4VW$8INu$wdnd6e4N/6!!mHHp
Yq?dCL Pq&5/k!\$wlpyeYwc6^u>&D?aAJ=p^\i:LjSGMLWib6/&D1#c>\49W/KGWD>HCRcY$9/JmkW%lMZ+mBK
8BNJ=n He@IeRNPW#LK&NXjd1W4km@4jHB*yY5ntX8/h1#F5HeI5SJ8Si$&>ebM#T8Y>8hu@k<Yl89<4QKa44:@
J<FV6/ 6lE&ytwT@XnI:\/V:=4F%eh5Sq>c*ZDBXk8/V:bPuA>56tq!yY$$Q$%KlY!ZVlMFAp4WSJ?Lpch15Kj:
VEE*iJ ::X@p\SV:&tLkc?TIA4#JmPcSp9wkA:^9I\<T8@M6@IpWMQ^jLTH:w<@XVq9JX\Jl4MM^6+Yl5YtM&RA
CDMpMY <tLc6P!FqGci+FLK*etBjBJBBVAGi!/TBAa*KZX#=mhQNXmP:F=TX=B?SV?bGSSWE+ZaNu&b!hQAED^p
wGkhiK c&BH9RblHcNQ5LApLc+Za8yMQ/SP>!aSEIaYwVjj/&C=!R=nVWPA<FJT@\tF<K+uHF*iby\i9%SLD#dM
GpiI@G cHl^CkRZ5BdV6%pp^k6iMw%XGkS+Jh5#C9CTCVbBpYCd#qeTV1CC&d&ejP=8?8*4AGDY5JR6S6C\<ca6
+J>K!$ XlAhH<Lm8YEY1*:W/%La^@FuBk<IRYWaT#Zj5wKWpM=$WQ9Nwa&a&1tRBT&aR+J1MDSnh5:Hiti&S>*u
Z@VH8w WZYc%Y+kMJCM5TpR!nZ?PIH<c^/<CB1b5/KBiuiu8Dp**cYVKM@At$@=1X=I5$F:Xub$A$F6J*yBKTqZ
W\kc+E *V=k1tH6k=%5Vlb!A#/K65:F6j@<Sp>>8IdNh$!X\uRkuh4Du%88!+=b+LG&Vht4eZ/X&cFFN>Jll:/5
T6^p1G 1WTZpaSTEBjn9TJFNJN>MKS\>@=TW<l$iFKdF\llXc#c5EuE:@E\d?ADql4l!S:Q<TYX<RRp<umd*u:T
DniacM I<hdI$N5+!ZcwN#TJTWhM4*hZEJq5qtMCt4Zt>5uwp#WMc<AYC1!ct@#Hpuq^je@W5\H4+FYHcZj>*R&
D^!Z:e uq+#w19Zq\?M/^>*hF&cjGlc&/D\=CW>>^jL>/E%*8K$ip\<b6^+j1YVX4Z6N:<$9l:KSl*eAiA4bnM:
6l$EhJ WN4AJ4I@muqQq%A@PM%YLkM*=?88ZH@kIYjyVw$Vd@8eYtC6!cEGD%KEW*Wb$HM#^qXinn\tPM<T\wP8
-A+&$l 0002ba469c8001202b4 Page 92 of binaries2.zip
qba*GZ w4?5QhNwV/u$nAR?mG>6HI=4a\6WCDRjPJK\Xej#%m^EjpkNeVRl>8A&mjb4F5c:#:NJ6FKibLFtBLCl
&M>8Na \%c%6bc9jq1ul%Bqp1GV6*eILA=h:*!wpw+w49DkK/HTb1\4p$?m\\&cHj*CqqB=*:=G4=VQVFDE$Tl!
AD?Jki 5a$=pc5?bQ44mcuV*TZPADeVjm=EZ<4hDIPTyT8:GiE&L%V^Cll6u$wDLI5S*6P!eCQuPG<Zc?iwcY*m
\H/@Bu kWWBtKXG>4Q+eL9i\MtHXIQIaCcVkt1!/8cY/tR6Yu9@FkQR?:H1uW61?DJeX%/bma?TFq:BNB!qiYh&
Ce4/At FSFy:e%ipZT#/HwWjFP*J:ZRi@JRII1$1a/&eN4*GSHIA<d**n6w&mYimcuh:q:D9eK9+RKqRwu6=EVd
8AFZpa 4C<QSk5<5tB>qTbVK*AHYa>!#i\1yPk8MB4&RcX65^I4R=VDp8TT+p8&6X1L<audGqMj?CLHqbXqpCVa
\qjE9a nRk?yjj5/YIqqqE^b8F%RNI*^4N<D&X5ES6ZT@A6B6yJBP&Hl8KH!m<yM1e@y4H=LI=WdLS+V8M6bl+9
hZm:#H 9Cynue+m@aY&@XYHWt/h%%M4a*%lb4K:@Zt+QNy!nI6laId&SqR1\TR$/*RN99PSluWCJ$/nind>YD**
$<PnwM u5/t+<MKQ6ZtAPqG9ay&\/WtMb&QYk&BCp>nT8KH%X!VHj!*1#*McFJlI@HSLKqNP&cS%4%NtyuD@tY#
H=@ySB nm%%?c5/4$>LJ@jFiFkSFZMQd**$&%M:e9N4cX8Pe*#6F&p#K1ki:u>A/#h#=&Fm<X:cK$q<d^I^wATQ
htRyCH ultkZ9&$W&1NT\d9t>QwMj/D&\=yQKPLc\?qP&d=*mN:Z/JL1Hc?9j6&E:<?XJhBq9T86dqmQiQQ5VEY
*+HXA% \Xe?>H5<9N>6*$j6iij>*w&+P%ZdceXQGH9ck41CEcSSc\M&kGjdDF^ycGKVc!E9B:SEk/d9Q9:J:wXB
6&CPt/ uan!q$FKMGHA+N9%#+L?Gut/d#tTd>4KkVR%uqb1R<w1HQJ:5wIFDSS\TEu:D6WLNQNVNZJDEK86/lan
P+itA/ BSyBt68Q?9AYZ%lDA\ySYkKWRHpd\:m!hICMXdhCG9w1Ymn55WPAN5<VjM/=JdC^Dqw6VNuGHK%9HkNc
P5>q6H hpDD:YL^\aL!acb\<68^:5dP@RVyYEq+jDPd*C4TB=:/EZiI<uq\:byltnan<atmpVdH/@K+bdj\!MQi
6nX<#k E>@hEDKhm5KcYlEWW&lD45+X4akb1D/TZ<jVGmqL+$C>/6SZ#ZYXX:64n*XIT9:NqpQMmaL&j8eh5qli
G:y!*5 VR1+/w5%ekKd61luwMwQl1kl#i&:ZS:ew4H==CPLT&9p?8FcNBR!AEDAhDpVNYdd!AMuEMJBcW@?SVmC
+etNiI ND<CVmGBQFCpeXTpW9DXR&</PBh%:N?YXtTehQLY<@Cl+H>P8&W^E9Xqe8A1HpYdZVV+qJT&hLhQw$h8
VM/\1^ bHZ*WS<\=^%Wl$SnR1%tyG\w5?S1niQ6$lI%Wpi$Zd#=W?hyCIqCnR5XW!p8E*mp!^%uwy#=9t^G&I5=
A%?Hbc A<@LLCXDhXwXE$VDDJ9R@nnj=@LQRmmTnTDkPInNdBm6YwmWuyaWJ8G1hpLMZc%+:V\ntln@wwJDQ+8B
WbQY=/ V\4EDDYP&dnc1nbNZNXKI&y!5?9!^I:?wLbP8nAFH!CMn!TWRK:tb@^C#w%\muHVMwBTYM\1I4GF!lMN
d4m:nK p4>GZZALpFlm!\QkmCNK^p69e=!SJ&1##b9S*AZbLhw$ch9Z>NE&Hc:lewmDKYp66/Z5Ah@CwL9nCu%y
Au>6V> wd/i*d4FHq@ti#@M/#Bdiy:1C+lCqTdqwc91bTA6:Xa$F84tEbeIZ6??eK%\YBPeLC8MC+EAiMI>dNMm
Z^=^RB FH!kc@ClhV@lketRiqllmLePq:Bm@EqBtYF<cn4BENDtybmZy++#CdVYeIy<i/4t1uKNnLT&KyYYwIhN
GqBQ+B nbqhkZlJCqjNEB:q5BT=6:wH@MP&I5>+qZXmy!A+@mXWj>DtliB&P<?Ek9!/1R@qHZLquqtLJh1pdt1:
J%w1Nk BN\IK1u^8KeSAZ#BeN?Xuw:?d/dqlw%lBRRcan>%=wlZb1/E4ny#/hcA&*LjC84dntln$Einc/L=Q9!>
pKw1NK \6eFSlHYn#:LH/JDD6I+/\\11?Z!iXWXEdJ19m<&J%8yH4p=SLl5894WYi*X4G6T55Mm:hXChG@H4Cq$
wSyd4E 5TBA6GqcZYtcI!jehSyXMBJa/wn8HeYiKnYm%KBJi9:h4Gi:IpL>*<4nT<1*S9^D+hjLjKSCV4b1wad=
mWjW^* l<8EZj1EibM/VN\BA!5mWly<E?LqXmq%:^S$=MYBDN!S$/CcKB9Cwh+&>CjFbR%YqFqwDGm4DE*awaZ@
@REbQd BSb/c6mn4RX$%RiC>NH^?5Zd<9jmJ&%%:$QFB4^KVKJtZpRGiQbc51NYTV%^lY^DSmn1ekpDAENKL!HQ
lKZ>ma Cp8hm+qpTBe:/y*p@H\ilje?GyIX9<VQZYP^&dAG4m$RHHQ5KI!+QXL&@JK6?GZHnlIl9J4n>hhW#dbR
!wWHwa #wbkI?c5#VIw/ZnwDXM$e#pHA\/96QH:p<DR:au1SRu8tjn1<ZEi:R4Btm4KhS<m:8b!BS8iuD^46<5%
b/kcS& aHEFqpEw5LENXVuN9DVkQ%J>*EJ^bP$4LEE^WJA\Zq8K8CRjIpG$ZBBJJIF*lS$NDV8\S*/\F6m:bENM
PMwdA# dI$4!VaRK/*<Yd%TZ:qp=nFACpN8d=M4qm=9E/6=6$h=iaV:59b^y/!66C+QlpVBSG?K6k\pb+mKh<N5
b:/yCb cMDj/!AN6EABGTuW=m=&Xn&Ll4bqn*Bhj*c=c>hNweehaBc/*wi=SlEZp=JQBNyKNF4dpFAVIj*IZu/9
@aFdLD KBATLiBy*LQcL<n^!FDd?jp:J$qjV^8hlqm=j5+XPWM6M>y+bX1ZNM:c+Y8i*P$YN&RnA!q$h1e6ZqAp
<MR1FY TQQ$jyE?kHubFbL$&/Rt>AYKZ8M1>4PbGEc5!R6CEH#h?uw%DkKWN:p+JD$yJhYHEGV!qJtwDu*C%cE%
Ndl6h^ 4GW5/S8aS<8&pil:I=d4*6*>D>#B8DhHZd@&$Py8e8GH!hpCaybJ1!!E&akyQhjWF!KC4BbpkMIaqwW&
tZhCR% FN<!GDl<EtXNIBBS5Tl\GK#LGb%qaX1EI816e6:RDmP1$G9dJ\EVpIDtdtQ%pjAL*#k\Jw%^8&R^BP@G
!B#!hG IEMyDSS#\$t1%NVu&%hh%+yb%$=wI&$t?jj6w^!RKG%yA#A9AK8tV1FuE*bwM*&Jei?T!cDKyP%QX!nY
>:nRqB MQc*4ab1TmPJdtttnpC>VIjISJBE+\t5ya9TF6H8PZp:q9^RF<e$!>Kuq8>bDZ\=!=D<id*lq<S1dMc?
HE&88i VG:utm1EM6jj46^V1C14icJQhW9=mu1@jHAIndMP&Fel=CHGWlepai><T*Lttd&thZR\!wNd4ajC\5Db
XQH:lR &EMQK$*?5&9+b$^B!PeDh?Vm54m!5e:HV=4=EL*IMHMj1?Jk<:/NCAQM8QbRRJ>h?A&H@LSiG6$Cc5Q?
H@j4Pu cV@j?SS+6TNR\DDj?JH4yK@iN\jHthRZYVX1#@TdmwXVJ<V4BJ&DH:MS$Cmt4cREb&jwWcY5ZGjk\nkt
/cm^8i VqHQHyTP?@iBnA%8j46iFiHa4?j/enk##HYXC=Q8HQaku>^\!CeF>#+4d?!Dw\^h$b%eL59McMIH>Y/S
qnI6FE >tKR1Ji*B1e8?Y4^&SWtdF?DSGI\Md$F1qA6Ewu/5Y<jFEI1EA?+8Z#qLBd!ltw6pdaV>S>iA\<dQByC
ENw46y <eP1V4L&V\wKXZpDQlAkwuI9D*CZ<c?a$u\YiN<*:nhc9+$1t<85FJKyw@ZI5*tRGEKY&FQkbKVyP/6W
@jRM^a 85e8#/PayHZ\Fhj%Se?wiGG19c^W?PCZqkqeRwqFD#e8Adm*HIDdZ?:$nm%L9PF<nekX?TnXau#L/nY\
IX%&^m e/e?WVmpp1y%W?JL&*cB6t$u9/:9!#X8n#thP61q!4yDWlM!L6?TIENXB$uiq$cK*5tBD9#C/c<<1lCj
cw5Eqw wn>%en#lCnw+DKG*+=bFIRk^QHQ+$jGjlTBt6P9Tu8>=u^VFJ\Y9D\\?/!nL#$9tmc\emJG\4\jXXb&c
\<FIFP *44JeZt144VEj1KWB:DMhRp^=?@#=q:Km8E+4d4d6?GBp5tVA&%j155Kk9mkicD*YCS:Hk#VIK^YkZLP
<PAD:b /?VPe<:/WclRa1Zt:Q\/mD>tcQ@Q5>&LKEAk4An+9=NMB@HHjP>ud4pkwMk#6q!kmL>88WDl@>1YC@T@
^CHXnq #LpRBBV/y:&ZZ@Y<Q!8Fb?TZ@/<u8Imannkn9@\bcKVwPYn+BhAIBQkeNPIm/HMPN!DP!C@@X#RMmVkH
*cJcD@ LZwB>Lp:GIk#E5#@FZ=iLk:EGRut@\Z$GRut#?k!/Du:AH>MMH?iH9+n5#lEYAqncRMX%uG\e@$ll*8=
uHVM*: 8YDeZDFi\8+?X5+P%n@E<Z>ZD$j?iDeS4D?!D9*IyZRBQj!Qti*@Z\4:P>%leNFj$kHBEPIZCl9&J^u@
>^^i+i 6=:/P^u@H=:<Z&S<GQkMGj@*!jd@tZZqP&Q?@>?k9^#G@4<4V*q<mYYW#Cm!9ew^5SuM6Qp6nQka/@S=
$P*F=i j^%BDRAu$!bSIhi:kcE#X\\qRWK^cMZamc$!TW$K+y<Ak&S6uqGDuKpuELHY9IeD$Q:@TpJ?>X+bj\b+
BF8*q? u6Y!ybA##IHZJ9/ba%SIX8%A=#h?kb1eG1a!:dbHhjnpt#4wpcIJYkbb14pF$ZJm\&%!kMC^ea68y!AW
p=p:KN IyRhd$G6F?k+nRRI5t4Z^\WLBVV4wd6X>cd1cYRplbjpYJ6qjDmuLp%DeAG/?nVJ@X4h8juYbmG$/4eM
^Kiu/B VEyNDhChcui!cC8ma=5M!/%J^1pNmhZGdkLjqRLRe=d!*YdG?kSw=CTF<=:X\ki#t:b^6Eww$bmy&M?G
6<KS$4 T9DE<XY\N%aSP+w6BF>6AD91J+G&RW!8961JJAC5tAT+=RkRD#y<cm#kctIwWt4/Tm\YX9aGyMuSb?R!
/+yRXG Jb/8bdCy9awkXQPNMWkutX*DQFTuTCYAdV?lYcS&>NP>XmpemLWIua:^Q&q&RGi&Q\k#Gy1CP\/cS>Gy
NEV/AN G##!y!cRX9><yjy#lX:1n6=CI#^&4AwD61dcyPaHwEuXNhap#T?uLnG!YIj9jQbecuR%Y9lJ*KEX5$q6
nBHj/Y u+*%FkE=CI$56t%Y#=HaA:e6#eYK*u=b8GmT5ZR4%muXEklkSB:Nat1>p8DVbl6PJ4yqQ+uP:cdGD$t>
$&&AVT A&G?6l%@1?leMDYcPe4Z?*46+jTNw>ZRQp@DD$yqpNceAjG1i1K>IGHIyihJEI@LRec1Sl/!pj6adAFh
MqdZ>p d^=9u/m4>XGZ%uH@VF+FMdBSp8D96ppjM@u!E/<F8A!9<btcS:S5^C!m9bc!PBD*QWbqu?T=n!>^IJcC
/w/=w@ 851i9pCncadJHLq1@BXhjCV\1iY!h:ALe$>&\F8kul!VdL?Hb!iTyYIJ#cySS6/CM@ZBJF*dI9!AC=TJ
9Hn&n6 9I=nbwLuWXuiX=MYnJiqGtDkewppP<KHN59bNhC>kqTtmL?Du6YTNPGylDDeBD<JL<C9kPB=6=kSLY/!
FkP&+d mc46qcn5jnweT\pP$uj99yd*EYR5%qTaW8k%A\@ipp9n5FqRnBCWN9HlY/i#puwecyj\jGLJ%lWNhqqG
@WpQ<q BkFQmjXAn4KWWZl>E!^BE*n<<hLn:Fh/wC54ApeyCSK5k+Tmq:NtZW\V6^u4/65Ye#6c$pq#iKTjALn%
kZ>uDl 1GT6QF^wtwwyLkjm@l^TNuXbTWEQMJn+QqZLTkR8*uaJG+>Jd9P&tH^pKeqL/nt46l#e!luWecEFL!C8
K/XXnV lBP5&#mcy6Q:kEyGpH*nHwDZtTqNK!dpcneehNqDZ+CILbqYF@=eN5ChJHDh4TBuPn#V?CR@%l<8MDM/
-AbFI+ 000cb8ebd94001202b4 Page 93 of binaries2.zip
uH^<5C 1c4TI8@B%T/Sy9@5Ae+51K/>B=ll*+T4jL9k1H6\@GQId9GkcqVbLqIH+#6lWPKa%h*jXtheMG&1Xleb
WaG$jj !FlKy+Q*twJIAiL+ccGqb9T=4JI#1D+jHaSQwb*!Y4F5LE6mKt4PiDREXMK4\bLP%Zhc6I8^KZ8Ip/w@
+*Nh<H 6+9SH9Qy>>pVC?q/!:j6d@@&ZV5mcLG<VQw>4/JkNM=1K5t>q56*m6ZKeQHK4cXqSaGY/waD$HH4NYjy
ImJD1G i\qA@aHmNmcLGdeI5M8wXA*ZNhZd@FqXjMKK@cA^:q*DNLX=SmN<VjimqL=wEXjbHFENX!FCHi%\eH9R
TF>ijM wn%JaEawD!lwnC?We\Bd%w<w5QkcC:8:SmI$mhYBiT/lNyqE&qPhd+NG?jEDJb#EIP&uM?#Vn!R6LNCu
XFlt4X 6lc/a>NhhY*yTe:Z:Tu8FNVJDYXRjBWL+c%kA5e9ZLJp6!Cln?lN5^q>pLmtatF+l>#A@quI#yCiL68#
d@q5Xk 8mH!unq/FbSH%^mKBi1h@XbL8y?IT#/lhmtA?m=8ud!/!8N%ScYw$/m:1C^i8X%Y/<M>WZD?&EMbLm$c
m*N*?< XTQK=q$>hJXa^ZM4+!N>uXTDX&n$yilw81D?:INJ/1bH1mWjTi@N>/=Db/w6=Hm5VlqM%$?HVYA/B8H!
D!pX1j FRVyJ!\4q%>%XqA*%<4yD?QA+jm/aQ<&R@9QldqZCN#i=pI*YSiiH6qMC!h!GSdEdFFcKIRE*&>lcI6q
ZEaDbY M6FS/?WXhP+JV4%!T<kqSyZe\Dk:>td=ER^RI4F%K?\TTaGc8Z8e^%5N+BZ86?atAbCD>wqPZyqBPHHl
e^Qbpj 1>Q45qu%q<Y84?yM/jIb>68NNePlH$qcjqKbyB\9Rc\q*QVH>YYuFj/WEV$+#Dl\a&MaP!hX8^4!PXjd
>i5ey4 6A<ZB=j$/?keNtnDQ4<45>p=pCucwuFdKqup1wqX$uZdR@YD>pdn%?yW:?>8$:S*c:<&YKZKQ:auXS+K
k8LET> qE8ciGAh6*>a*AjH<9B%bpI=jZyZ8=Ly9<ppG?e<?1ai<dN8+CZe!#8QyB@:j19i?I!M=lwBHXFJC\a!
Ku+Vhi H6H:QyJ8khR+LdK>8FL!eD?n$i=!SJF\wh!k4GK=a@!hnbNQJum5IaE1>k+FX!^Mp!ldVctY46itjDEm
D+l@5# N!paLcFTy>l?M5Y:ae@$1qR%w9#PBGFB=e&K^!LF&cpm+!jQd!iL/Y9iG&qS%6G=yFtp1#=iIGKuTC5q
5ye4@j hcjlI?4b/D$:A@Li!uK@B9GYw5S!Kq\@hXiC&6TjW\=8n!N!p>nmm+hw?%*<Dapa:ymFEmP*uwK8!:5D
u::QyD CNMPQ<ZN1BIE1:^Hj=8dZpmJ6\NXl8?A$=8LR%Z$!DdXw+!\dQtF?LN$Sb\#Ni</mXCi1I4bF>b>&e8$
CnbDCX FJpYJnI5D1d<S8m8K#Q6VT:^e\n+MQK885#tDeW\pTwB*C4k!5au9KAqLB:$b%iNA\FDkhYeRh9YA5HN
P#k&^i dJ^^1/$yAK9XqG%aa+G8TCG>4ALBZkFibyc6CjuhBX!YX!FIIbjY!XFjNWLlCjJME+CMF/9N?+FHckMN
Y=N*+i JX\L4=iZhhqQCulukK16?p1pRkKJ$pGdn:F/CbYa=ayY1&\M\$h:\QKj!RB%l/9kQZVPhaH^iIi8F4I\
4@d8Hw QQLtXj/:t&Q588C?RJYeEECj!h6\!mICwC8y!eCn1PJk$uDknc4+%cI?G^G<RT\LIdV*WcZTnjYSEmhm
@nFVDc An8^X*Kn^AHwPJFp+kD6PB=hB\14n=1CS<T<%^*HZi<=pMjV+ZAiq<u*jeHpEPHn?Y/8j=VQ?8qiMAQ:
n<G9!D wy$G1b8d%YGEIS+?NETRM/h4nPtFnbDF$Q6!q61AkW<KV<q=9&l\jdPw@E\:%u&b#Qh/4%4/Y&^<*NWD
+l<*%Q S=TAw!4%pMJdwmR!FKyCbqRhpE&biJt!+%mY!DplNAPQp6%bZRGCm\ji=jZLp5bcj5t?QiTe5^1%iYnJ
VPqGD$ uVE>etDq@y+#*wANjN5%<nT19$\p@#My%%%:dyBn%/ktqF9^pIHBZpb9Fc:LQ!+e$NehLldCNen=\wYL
#p^eSD VH>X&%&>c>GwWKq5>\19a+HRnlA\apB:1KI>/JtIY5N8Z65!5WR\6$$M>&R\&hWhD@A4\j&e1IbV^@V>
4ZXC>H e16Dwa\qF@4b+uhCYpC4^h$W9PqZ?/!9hp>*dV?<Hy*en*%A6PH:Mw:q1FAQpnk9T+L%NtRL=u1ViWRl
6::LyW iu@=diWaNZ:1D54Y*BQ49tDnaNj8EJj9FHS*Nal#W&=/5XJm9?T8pP$:>pI<wum%F%%64@cMG$uB4!N+
hwBqLc b&8S&$4*lF*1I8NM*=Ie9muHBu9JLLniuSct*T?Ei5S6*mNbj$$!5=L$TDXkkhT%FFG1*?=p@IX*1Jq>
M:R6Ec Ihj?^EBp@nZ/?AqQZEl*SeCER4Fh^lL:hFJpPaqm!:WI>BP:8FH:L:%Jy/E14IG<46q&GlpS!%ECn^++
qF+wYw wJweY4*ZBXmTw8L5ZiNXpHenH@%E8Ht4lHFdX??c6:c?$plLNa&I#1^kX$=:X:X5SFY<e5tVmM!kYQQE
$&let8 w5aYbc5Ynay:\?T!pZ/lZG$b8q#5ZujhladCIybJqYW5iRFEFl**IkHKQh#JSPub^TW^AtVM^JZ$lQ4J
Gb*$l? pjjl!Xc^<J@wTRj$1NQAY*n*I6qN+bIKXT=ZP4<MYt^@Wk9wEbGw>ZyL&#bRS^JTb@&BDhi#dph:FqRP
RnqKhu ZK/bXhB8WN66mFXSh>bPtbRXlW@^p>^>VSX@9dV1^Tb=a&Yb?d+DD:j^yIbk>tnblyj>S8>we&na#WTX
lW*MAD jSwDKPBL=6lXIch&LeGm%mB\/<++4/48$*\w4<DmM>ZNh4\<pbwSaQCcNwYJaBtXh6AA5jAPaY\SpR5Y
iP&APY !AZ$WweB$t&ne<k@LYV%c4@=iup^/j+mmLXuWeV@=RdAIQHLp9\DMLlk6qcEQEqXJ\#9yi+qlnDRk9d8
J+LkeP pu&ETSLB:tdG@FE^#*a/Tj%NaueBBHj<a1TPhEVWYPSBK!61Jp#m1c&5CWDISKH4HZuhR<:n+l&y\$+!
A@AAHI @jZGY!44P^bhBZaY61SZH*Zu?Nc+X1ud*5F9M?b!>8Ey\h##e:Qw$l?4!bK:11E!RaB*:Qpm#!RkEhV*
SdTG?Z kQyD9IMh*4EGn%*^jM\1=FLl:SK4d:XaM:e*bV\W\<XIj^c$@yIHh@+<cNG$XWJTY1@BB!\+ew>YaW^S
@/E>Wu EtZmYp/kI9hI>w8DR*&Ft1:kc*V$L\nb#*kpC$aSXqyFme4dYd$k*H^pa^FL<Ep*Z<8>EwQhh$QcVlPX
B\mddK #K\:!YyWbH!9dV&>TC\Cu8dyVVSST1cy^@==a\qD$^bIT&H1M*AHC$Z+j6KWbtcL^I5=wGQn9iq&Le9K
685e^9 NHiABlcI%eS9YP^%#GiL8INqElK#ekuI\T9&+cKQiV$9>W:tTT=bDp<:pN!WLM@a@hl!p?a%l:B?SaQa
G\^KjN cAEw@GW?8ByhDb9VaS?WX9^pHYGjqtakn@MGqdV:nCjm5#Z$HI<++w>X/@/j46GJ?GQb8*<KqX:jj%J%
?@yh+< 5QH/9VV$@c>Fj@&A?P$*a9?qKEKREQFjQ<B@?^9S@=I!IcKRZ=PBR$Sl$F>@lj!HECpm/?d#R\+F@%Mc
p/bpma Sj^/mV>FK9y9T11IM%#5eQGLyuV=VV#=m!^#lu\H9dB@GZFG#d=@Bj:Hwu*wj+L@XlV/#e:=m!kpKu=G
6QTDHn I@?^uJ?8k:e#lyWZ^1y8?eQN!t4yc5M1:&h6d?q1>?NHXe^NL::9\YP<jlAYA9:%DMH9>eh@T1j@/F\^
w^HXPK =G?Swn$^91#m+4?qm6j+\ZYIGQ\*BX#B\hQ4S/jCj95DNe6jjwcL@cM@j&GP/J?jAZ4GM*!QqhZc#hWc
Kjyb#G +?:>>#Enj8eC@mi^aJA@BItAuYYM@YM>\q>9@F9V5j+RDh$6HV^@j*jw*?XiQ8Q89:Va:%4p6&nkb$WD
XaTPY8 Q!Mc&i?Dn@h@^iN8/iZqd8>y/aXl>dc*>Gc>/idDi5Ql?/$>MT+aF!9M:\PFRGB@e=dmd\KF@TqR^FtB
uC/Fmy I5+IXN4G=6e\:h&<*i\<Lh*6Hc^bqiXa9h%?SP4=w#q@H!AC@8?%JQ^QATLQClD=h!*ym4uB/8Xn=jVH
<\X8>w q\EKkj%:ATH?FNBbR?GjTnZ<p?E/:5+P*n?m?u$p9&%uuXpK>G<mRj+yE4G#IlE:I=L9p=k*^91Z^9t6
BbNuSZ 1*:jNDD\Z:JQZT\k$V<FhPaAJu=GRHIP*&hhB!8jj+d$Z$L?u$u$c?PjjbDmd\IV?&NkePmjSnA+?E<n
B5wp^# GPRQI^n$V<@\^@IV9#/D518%5+@NGR@A/8D/jYBt^dlaPnm#8tC<9L:Qmd>9djELEqH<V\>^St%VBQ!5
G*y$Gn /WHi#>*N</!t@jG8Y4LcPnn@Qy/@4!%:Sn!@NnL<4D$M?FqD9ccX6/ZDn*&d:?Mc=ujliLG/&dK/jj?h
:Ln?V8 y>jj^9Q:m4F@$?q@dm@pu#5h>1hPS@!l$&F@jyT#Jk>F#C>9<^<i\6dV#iZZ/eRL+?u:l*H/:=Q=@@Nl
5:awmG +H?cRPBuVTB\?Qun<q<C?kQ>@6C?j=9I/w!Rj899Q$$h<LPtD9lbW+i!!&><6Q\>GZ>66#@V<Y<#bj%N
qT!Jqy iGi&&FpVlV:G$<H&=t>$6QV=@4?46+P%k@jNH*!$@NMa>QiH8e/u+%>/>K^=A*:Y9QH4J8ijZydjljV*
Ip/WPY ?<y@E>KjJlD+YSMIZP!C6Qi&>*V#5dNu>jd$<jLG&H\j>d\>*Y^<4Q@+Ny?^?a?<!BiX5=94nINP5P@4
*@N/F9 k@>:#8q@@y!V?5ZQPi&$<BKe8bSG@AeGwH>*@a#+h+$?a6C@4p4FIQ?c$WeW?h6T?^>4d4E@PZ=?ZiX>
<p?8aw 9@db!>k#TkD>64n@:\6qIe+wAjSZNAS/nuHwnBJAb>^d:L^:I!/ClpLPRTM9kQ:S\GinST?CSy^nHD1n
:CEQD8 BNBj$jB#Dt$n#1kAhAace5/>#/kA>K?kIShA\<:JSI6AZwS45QQak4\I%<=ZVJD\@\^?EdcJk5>4N?S@
:Q%cJZ lBc>ENQQc:iL5A%^u4pQKj/jwEZB@^H/It#:5jw/G*$S65Gl==\*F+XhmPuu9KPmF!Hdn=J*b/MS@>/e
nAWc/> Ik1B@GXPEj%uDw<L#Ttm+F@uFNFjE*h<@@CuPWZ$%^Rkj\u:n!V@:S8bKPI9@j*Q<iFm44pj!^4w>=u5
Py8ZVh l>WWKk/=mG98V=tI@\iDEShulZ:9h>n**95S$$XmEj99nIhmQ@IHmEHEIeK!>yd8*:>dC86=@VAi@nAa
GDGDiL *uD\6uj#<ScY@&YF>i@bD4@HDQ6Pnl?mFA\K8%DM+u<YtBF@el$m9>Qk^!9/I!jLd\L#d$dDZ\St5dNY
1%+Q+H :GLk@?//@^C8\j?<41n+Q/?LlJ!q$j$?AjM@919@YN#>6%@YAb&YYB%E\k\pC8!+CbtMSG!$iDmH+l1$
F9Ak?k h8ISBQpSjw8i\5\E\E/KGFIbPJNmn\^&+=CyiEytVNWSZCyEN#!/4#MBV:AaATDlBN5nCFB\=u/FK8t1
IQ<&w1 IZ6l^6nFWFuu1*nmihI:XANQdbu$!YqA9nnbC!!<nER1aWW*ch&JR8e6+^jS/%elRay=p^+Sw>KZGh1=
jSkbRe hbV4u*uDH5*a+>/<ZSEy&DQY+@G86e^LtGq6F+HY9$y!HWB5Ia5he6m6V?ekMt%+$^t6S^*6q9Nj>5lh
9HcXpK BhpE/WH4XtFRw+tYjb<>L#uFB+=LT!>>Y8H*^V@Hnk+w<VIi>%n>5EiKQ%!&P@kp&EG<edkY#pBSNj&a
Cdk$ZQ L&WKRc:C!W:nXYN+%MAE=l?6F\4RmVuKGtZenieWeZ#EEKbM9NwI+VXBnTFEww@H\5mmV/tJ4HuuwTRe
!+>q4\ :mQpIQAJmk?WT#<An^5DKYK^HYSbQEhK8%6%ERX^Yw&F5VX*jFYRD44>4Z=$5+i/KX5%:n/H6JIXQRDZ
-AW*8M 000a1b53943001202b4 Page 94 of binaries2.zip
CqDq4i Zy5BkE5\\RNpR<*5T::Aeu#HT*Dm@l^!SQtXJc?$DeWanq%nZq\de*R\&pu8LWJW+5tK=pi!FcHlTEEC
EtCQe: LaEG:iAIB1C4ZMFKnDiYmVTII>mKWbWn%*MY8Ley4h1dnZ1uHE1hAlET>\#wiK%C#jtIttTT&HX8pA*A
<d/i@: 9BP:N$WyGaKd::k<Bu?XynbXuq\DiVLC/$=NJt^GycYVt/i51^huY4MF1P6Dma>G8cNl5@1^wjJm:ck6
K/y%eY E<$QTeXcL/iq<yauEJLS8yQ%ZET4SpIyXGbn&LKb5=46ANw=$?T%RC@n%HwjV##eP:*tyk*j<Bci/F?^
:61W>R qJi5?Q!S5dq>/Dq#QTXqwYSh@IRJ@%S%I*yLJ^8wyjaEQl#JN+lW4XVYRj4<VNp@1WH5L4dTaBIlMete
&I1GY/ 8SLV4u:994+wI%XaGLVky=>M^d??qB8a8/R$8$%/qad9^hTnVPwJwR@BpV6CBV<qdtn:pqRAcM16<%^c
td$9SK MB@wZ:S:F@Jju!q6i<R#kGYX@bRRSIc+$m?AK*dXuYPQWDklGVlSY/:t?5*GTmk+CdQpGmht/hycKhmq
85w<^c ^ZuN>e*\\&yZ<?qaueE^!C$:De&Zy5WC14hG1S?1j6/?DENFu$4D\w=WCBnDXJ/Vj/*i\\NQKFG5m%:S
EeN&P: #HBNZ\CXj:^PcXnSPGncIQRW/>ZymNnk*lMN5diqbyNKl<9Id+9G4%:?=C#%CpB=biNkqwct$?Q69wK:
9MWL$u e?\K4\1^&Z+hF=Sl91qX^/qe4%+QtnyhB%IB45tm>C!1P\u5RJXX%KK&t#q^jL*?jFy9H+S?JbBGihkQ
88+9p$ d9G%&Y&*!yw!BXT?5?:\/TmiA^HcdEqk=@eI$tB4T!K+%Ri\ep$bbEF$>mw^<*YNal%9uDbM*8dd!F4j
T#?K$# I&GKjl6CI1@@\D9PiYER+lXQM*bN9tmchhpk+GAdWEuQZE^d8^a/^m?AE=G*<RBuYZu\pqFdkj6u/<RE
SiHBR+ WuIb8t9&nEMep<c^Ync98tecQJc%Q+8ylIkl%?:SY$><BXXu4kSlhV$%=?8LIp=?>W#Slb^?E/\^FMQL
?n?:Y^ uGZ5llQmE8Yk:5jp*iCeZiwe:#c8LDG1uTQ6cJCRqZ?NYS/Gu:eyjVjT?XXXQVTL/4BFl&$TNp\w=&^:
t#Yi6K 8!8p9Z%H=Ga%<T#<kdnDmeV\nN1qPJQc%BnWLJh!mC5*hDG>>1+6uMQ%CdXKZLLIIj=#?eSKYZLM@dE=
ieWF<: :+eKPb:V^>tPlKi\\1$FltDaqJ*A\%H%E8CC>mbSC8FaQ&QhMaPFqbFn#i\yP&yJiLn%dj^p%F%N?=1&
AWI=RI na\yAFb%1TL/CJ+&!pyK4iIdFBdX/NA=1^KyuKSwdHI%K?PBZ9FyTnXRneZ/E9Vl<ZL?<?%TYR&=h\<Q
n6lpJk &F*+<?@ycVHQb>W6m^Tqa>STRn^CKi@G!J+E4YyVqN+5$tjQ&H#t^6W!:4Yq*SIWMJ*ITDZ88ZHJFbY%
H$EJ#R teW!Pbe*+cDM5^d%ShBFR+JRjLda+Te!J>QYi&^n?TK?K1qK\:hMl1$/<+PLu89G^n^Rhu%1yGSP4HNk
5k?//J Yh5A+Bhw=9ebIi#IBp:hu4RyiNy=y$\qMQJWNywLZ\@kIwlQR^R51^>ZGym9?I/RVi1DA1W5tLZkkF1m
4<iCF1 F>*^nYZGJ^c!4mkSSZN=SJ+%hq^a^t^dp+*V>L4al\Ge9mjLhhihe$PinH*4NcLD^<cLi*aal!Pjt=uC
d5Q+b$ h?ZnV=S^H9^NX*lbL=*i9ii1@+Dtu1Dq?$HPMp#5c:\h:<%FMNBi@Iy&/DHDP9G^IVT5dkK^InM6*c\1
p@=W=L %P\RSJVSEuhF#&A\uCcjcFCTJRYhZ=$cymG?&5cjhF\c@b^nAGR:q#aq<^SBWcL^cb8An+Vck5nZ4#*n
9NLu@K BdP^/YbldT5+CCRk$I=CD+1MiPwwXF>c+nK:t+J$Mm%BtI^&$DbHRJ8LaJFc&lL*G\c+kZ\yem$G$X>W
n4l#FB &R1Y=a9hyLjmYY>9a&T86cmX4jy4*bMk++T/$BS+T*4ai6&=W:l*?jbe:Y^alY?6?964MQ%NwZ5Y8RwQ
1K5Xl$ jPbLn4:>@>n:/:m+tt^6GG:eZaIFh=jGIdm:i*B*DSATCP:8EN#hQWB\h\5R*N$DBPmQ#Jt=b?/bP*M!
y9q<=$ M?e>#@5?9/@@/N/:h%>X1&19ZqY%>1y4qShITL$i\C+9epW8XQTEw6%LcMHVeeZmKttj=nR&?T:eQG5b
1Hi!e4 >9FDG6XDt^6=wGte6?:&y^il8/*LQJeH<cXR^wHPdeZGS/+F8\8+FjGTh1&qD&#<mZZ&X=Q#!*J9LEZu
*6eab9 #6BmEM%Nw:Vwy/W>9>m6YK^aB+1\T<Lny>Fhe6XjVN8dZ+AaJFCT#w/6/iAJalMZ6>Scd4L5I&GhpBPZ
npQqCT qG+?^Vq=BdVn$=+p&?c:MD*$HM+k!W>/?dDBSA9m?pucBCy/<!w%JkZ#eJeFn<T!mR^Q<%Al&8mjnt6K
G/%FX9 Fq&/k<qCIE=ye+uWt6^t>lDanT&<CBBYQ$pQpTF=\+!H!@w81EXWDA4Maiyq#b!PnIiVa?SSc:T58DF<
GC4%:! nBedJB1X:>G6RciTIDJXNCy$6NA1Y8N:GKwKNZhm9VXXypBK<lEwKC>\VWS*bhkubk1e/BtlCd\t1VWj
1#ccae Tq>A\\6JblP?KJkBZ\lKtYk:VbK%Gh\&Jl9VATETJH<?t8m#HEMF<FjH!Pi54Sii/kk4bHIMD/Q*EGMZ
MbkRy# /atH?+cK=HqdD=mW6#^&S<4l4j/hIy>nPdkEQ^Cu^HaHSemV>5APeyk9XYX1=DhIJ:t?\i@&$6^tjJh9
:I&Zt# aL%Z%&5V!4Yq!!pF$KWHAWL\\jKlua8ZQ!K49yiE@^Bl5+45Y^CMGh&@X6@=FS\mS^5X*AnYcp<THyTq
Gah5@w BB+AA?l6cFY+G1JY:!#M$#iPuM^:RJJ1=!SL*w+5<SRjRw1kZYGYHl6P65^SN+bI:m=jMLdcETEQNLEP
yaFE!P #m\&k=a4MSq/?6!=amQD9B+!y=u*\MuM1pTbAAbQcbJZ=AyhNbK%\>$dBY?kBKQaNYa=y#Y51WV%cwYm
1DcTjK FXFK6B1BXu@9\BV%qc@=HpiSb*?a41HpIaJjEeiPX%QXKW1yHp1+DhLbSJR$e4K=CtIB\Mhk^TK@#E\$
+FXA#b T#$9G&q\Rd><ktEel%FE$MH8+dl!=tIe@C\upTTK/%\B=*!eYE:R:J99nZIW>GPMBdMC%&Zu<u$Z+yYC
HLlnZS =NY+I6P+K9G+>9Yy$a&>F$**HHVZA%8WB%/PQ:HS\/$B=t$Y=8$GMeNyM6?8P:jjCntLJ+8@&Z%l>Q*G
cmAWB: Z9e85dn\@ZkFiV#>?!H=%!4=ZIhn\cQYdp9lYePn/b>HJ=4>KEYaFmm/ye<w8X1wpq5C>=/Gc>dJ:NcN
X*J*11 I?NCeM#D^Dpnt#4Dduab5&c4?VcqyA&y+T*K^/aG/9\LG#/J:RRl8/qcL%GGWLhD9W>H&It*Qy1#eIpM
FwEBA* J=<d1Dw988mEI\$wpa?Wd+1D4jKNBeVqQ$*tZ&m^=8p!hZLq%ZALu+$!6WpnL85ZeZubHLGe*BkheeLb
XETNJD 4:VE+lLtMij&mePcEpCd!uIdS&wF$EbSeMqRlMcc#H&F*AKCb!n:K9JhpD=YSD<^=?#d9S@wQbQ&&iwa
8kkWQb QZQc!4LI9\&nwWTYMIYkB5PAVTJH!tiNaJ*dhJ<5iwY$5^N/uKe8By=K4S&1YDbNmd^lQeZ6CFR#Q+KY
cT9%/L /PTWNXLc6NMKTa$5CK$^JXTm5jPM5?GI:M5q%tE&8mePT^a*eBAcZ&8ySV<y8$<Sq$Ph+nNH>WFpIePI
yLeX/4 9pXYat\Q/FIV4VuAmAG#1EDcGecedpcl!QEWc@w<!cX81<MjIJ^mSaW=jTCNbDIXQcbV/5/%y4tP@BE#
uMX9D8 YDM\L#KiRkFF<eM4=IK<!p:PEF*yiDwM/LwtYpw!mmiD:T/N\WBQXV^y%M+?CuXqFX?#e$d6ECi*LmR+
GMk5:I eZaG1#YJ&kyJ&Z5hqLa6P5mCAyPG9EI!%mML/HNl$%uP\BK@R$*>k9n+IuYX!#RMtMWkCHiu:aI=$\^P
ZjKjBZ $^:p?KL*yclec+8e6P%YjjEGGC:eCCHeWFFeby8!G/dRyp@IL4&9uDnt#F<y#JSL^Ih/8:V#^Eh!qip&
CKdycQ quyIVaDJa^4\R?+I=cBCh#1\kCPSp46@q!A\pW>5JG5R!45BaT#dHFCc:9ncRX9wKpaw1dk1Xj8VwM<1
%4J:K^ \@M<GW5w??u^#qV5BY>L1P^XId!KF*FT/H*qZenDDd&nR8iBkmwpcR*QnhKy8c?4^B/yK:mmuu@SJMh#
qc<e<y a8#QNEqjN*BRR^ilYi@EDb:LDPMJlH/mBbhkHq6#\mIWMV5/YeQCE5V<!Z:i*&jF?a@bW*>5898HLd/1
^6Pe8+ 4M@4Vjb@c+99:>Q8@L1ZlwPF/^?<NB\5uQ?Tq+cDBjmZ5D9&*#6u@4I/@99%QNejiKT+@mE!+GjiMC:&
YC\b^X Z$D@%M@Q^jEL/J@/?dp+j\Z>5!eWj$A4?+>w>y>p\&L@A%4bQ$C#@MVj@Ri$5u?A@pqGK9a@wJZ>X>C5
=u^d5A 9+D?pc@4n>F59+V?Yh*A@\n>K:wGbQ?J:=Td+=jRQ>FWd5:@CQ$48kbp?+tZu=9:q>B@jMe+tJu@I@T9
:KqVAM /B1RBjkV>C@yGk9HV>B5@^H/X*TNnbQqJ&n&Z$K#@RVN<S?lj$ZZ&Nm+j+L?FX%nA@/5*h#@Cb4qX*V6
NSFYEw y+@TPFl?Shqa&H:TdT!@wt\@\uQ?GM*&H/GBj@lR+b<Y<I6QPDnamZ>EZQ=+\9EnJ8c@>>B#@B*%^j?k
\bQ$e1 MM?Y/Ae:\I<uLV>p?lXbPQ:i1<@F>6?Hw*Q>#hMCD8AjSFS#@C*F^q?<?1!eLQ>jy^48B1m!dFV:\cIy
P1@8H= u5I!lMKdKWuYtRA^<eMD$@eGuLQbk6q!YZ!!8tn\>%^cuIq><n>P::I6RlB&K4YMl!JS&VL/VNt^HjYC
mqAjHp I/=mKu%c?ClGlma$:Nm^K#4ch9#?NGAcE^@19\9K\T&*6pJ6bdScE\Juk19lICmeMAdQa!+V#m6kSeR^
5*8yJ+ KC\Qd<IeCc^IK<IDqnPdaMKD<@Lk%Pj+1e=BRdBJ+\XAiQEh?INdF?L\b5hy4\T!?AlT>S^dFJ!*XX:M
D6?%#5 DJXQHkl&Cp+yP$NYT1=b+RX<>4GJkR>H^e\464LRLT!ln!>y:1ybbl&BA1e*++SmYXDG=<tYNiAdZShe
d5V5A< =\mA!C&a1+8\?WIakC!nney?/R@C+elNQ=kmW$XCZ8hGc$*pua##&RM1C$FlejHI&b\KIpP+d@PLIji5
C1F8ER Lda+?*F#<V4&98DnW:YF+^t:8ma@X$mR!Vme1B&=Pb*Mhj<1^ljFnFpHZRY@HC=%^y:eCW*TWyEY?Dt>
9\m&j% tFXGpVZ=y5bchcl*KL8YCItN6E$BS\XL>R5Z8?#XLm+$TcjmQ65pnmD4X>eFHiYY#&GCjJEaW::d+b\D
ClN:/A k^l%tNP<ZMCI+HG94!Z8m4\>J\Z+?1>J^Fni%X%Sp4^wQQu/MG>$mtEe*A@l5^:Hi^#8QwHIla&#K1=J
<w:I&* TJJm4FJlHND5@ku4\:wtjn:c6qdb?95/*M=l9=qtRWWYFBJwS=jGa:W\YH&uY!PCL/SbIRnR/N&pWL1I
Q:@<+R ?j%A$aw&6aTid>EHdAHqFEneWLnjndB=*GZT?XcR\/S^t%%/hdH4pCt?wVZKF?TNNZDq!PCeS?1<jhiT
K8cC=F @wIa8+E*+W*@PY<qYb8?C!H!e8TLd8t=K:8uZS^8QtnTCdQ!<C>ES8t9uApM6ATeMPZVacSS*Xl5#6?&
4KXnEB ilXI<dSytIRa\*>R:?\@ip6H=<R?e4#NG%AhXI&D=KhAJel?bRiJ5@GqetDm@D$:<\Gu$tZ/ITj>piFy
wd5y$B H^Jq!B*9k<T=\Q\K5!Ci%9hhTLA=RLX^NEK!$DAehZMZReNNG\H+FdS5?ppq%bwd+Rk!d>@XhL6^$dp1
-AeGRE 00019d12712001202b4 Page 95 of binaries2.zip
Nt8%14 &BL\VPwLIW\d9B\jquhq?tb1ZHw9Euji/#LD#qhNRAiDK/C^Rn%Zbj*Cw5cTn=kC9V@jDD&mC6ppT%k9
S9=G#@ Y*d>DpE*:TMH8XR@QnbHqbAp1/PTHljiyi>/Wp!//\k&JpHX$EBE5KFTaN$=W<PXk\kC4V46Dmh*$%SG
GGl9yV #8S1bNERZ<HAP+lI?KV\56+Amdm<t\T+PcnTId/Z\lSpYmQidD/DH8CA4CWlaWy4m^ki*!9=hLV1cnnm
e*:&9L jA<!$=8&PJWwFYXlXu^^&t6=^NDZem!hQDD^5=&1+nKYcuVaA@EJS1J!dA^ul$GKk6?Y\d+1nlhk%udP
W$YBCl +c1qRSkeHm&pm<t\SmCAy=Rld4Z*?:m8Gh&pwY6l<BqpW&Wu!<GS5LQLmTVm?6E9yMtM9l@h*^uXQLlN
w>$IQI ki8>4ILdBi1p5^peje#5SqY&\QEp+ZbG^i:mQwVI:&ql6RC#L@<TAI%qp8qbB%!H:lS$&$Vk</GPnJt5
$ip?<\ qeehuZJRWmL^jit!eQCTu$ES:T/EHRjuWeTWJ4@PWbtW5!>+dL?R5*SRFt>B5CSq#c:\^DNSDpjeZF8c
k>heL+ T6R?BY$KZk=?pwD16S4pYYDQuutTMYbS8M?aXI6FXJEyjjJM?TPdbWFpyB=@LL*$S#WL%QbXX#TQ1cMl
:EZu=P 6Bdc=Gt!tZmZ/lhT1u6*<:/Z+SX6<!<6L5^^8a!Sh8*+&nVJeFY??\SK^/@$J:4%qC&?=:ED6&9Ky%=S
M^Z?*I GV=$@V\&?AYG8Cj*t4/?$+h*Me<IF5?\8y1nJTG>qVXeJI8+wi>V%^J#%&\5jZPqm:\?JdEBpuL*VDBm
?d+W1Q yQPRBTW<Bh=*KI!cbN@yR5YmYXWwLK$nK6lF^LJb*YIJ8decYqJ1*ZKEyWpJ9G#>4awHu&TRPIM=PRN=
JhwWSc YimW<tP4VTcW6WP*#^CSpALuQmyj9+GK+c+&RL^wBwijC8+8uw86n=?iid58Wa4iYa1+LhRnp?D<\Ziq
Ce<C9A STZ^AQ^:PZWM@>LH?5>Zc*FCkSE^=aX1u+SYcP*P55daT>:W+NhCXDk!#C4*TGih95+:t*q>:>CtEbPl
He\64& Nu!Fp>q:n5VPWJS?8B@JlK*yB>#PMD^akKh4<iH+R99S?N+%p6:W1W&D^Jl<lq\aLHWci1$VQ$t<LTBu
yj#wu: hnVp5?J<1qjX=t#aiZFVM9b8LF9G=cFYtJ^DA@9>4cpPdq\LVSaiW%NN<FhwCC+TB>#ZIa\Y+K<K8V&L
H=EeK5 #np&a<Q^I$:q\6QJPKYH4BMwpCWyu^JT*\uD5=Np>k^d<&bptWkN=R\Ky&1HWi1qZmMyjWae^Z9QuN!&
:i:@^G pYL<1m6IZ4wTcm55ZeYGl?SnYGZm?%cP=lynu?\CI!*\ed\5W/MLYnADWS$?NVK:dDt!%&\DcI\I\lIM
9jN^>5 AW%b5R=YTMFwGXChE@keL?qCkV$TqiM1\um%&nm=XlGFPtI+yEl+%uaZQ6B<PpDNbmdiRu4lLqa\HCjZ
I1?ht? HHiLcZ98=aD:!c^qYHCYF4G+IcQaF4GRMQF*WyDEWbqAyEpyVA!1H\pTuX!<ypapNqm+TIMWB+41H9Fh
a!jP@b q^C#5J^jIW=VnmRn8iqu9\XQSRW\pD8RKj9/GIbppl49TZul8TEV=i@qG4PSaMZkLe#PGX5^^>wTXXk!
9wWNZ/ Hm+a<W:I+SQTj=SjbWR<%+BBCK=*!C@4cG&VPVA#4T8EG/8e4N%6yi/i?Ck/&\uPP4luZuRH\e1ZFDQB
ApNyD& qjM^8K@<=AwijMA$1=$AE*K9bw6jRunNnAaVHWXZ5pq6k1#h#MCCnBXXyKLbcT@!XQLVq*CVqDb9hBw8
*ti%@j KuH!Vp?aam*S@4u:m@V/V&pG+<Z^I@::b@W1RTeQAuBkHAylS=?<B!?<K^hq<b=a\%ZqAKFI\#^>?\@u
IXAPXt 8aq\<Ed\Q5wPKMKmB5pQVK1*>y1*+!M!P%&Q6Li>VPujWF\+Wh!@nRViM9W>nR@hIWZiKh\Gu%\$n+&F
j^C+q9 hJdJ:hAjEk@%$Dpkb9XX>#+>IC</=!5tkThQCRQQpSnQ^RhajP!5C+9BSBVAwmSFh<HA!VWXjeuD1Kh&
MNjL\i #yKlWNNd4bZkyatdtZ$Q^=H9@Kk9dSiRDuq1D5I@udmpMXNAXy:e4kp84Np\dXZhSHM>S9N>5?9<X9qi
PV=<L@ ZFH!&q\EjD^cP9#&bPSycm<PwAm:$4pN&L5aC/^GXEIFXaY#$d%!AP!F>ipmRa8?<#@:bD*lQK+Edu?I
58Jch+ #QTch5&CF9+SBeXGD5Wb^X<CW5GuthEQ5lwclBJN*qWEuBkAnh5DHPB=1wq=R9m<6wKkLb9l?!jP1tqk
NPkEVl @XkSjadEJ5WqKHd+JC@MwWK\^*88HSZJqhT\wkjGw*tiyQGiWN/mI5V!k^6ym?bmtSSJu?$\pSHIhLY^
:wyX8y kAe!hQ*lFtCP*#QB@h6dkQ@I\jt9?VR=j5<1>!@+NH?L>j<du?bjN:#<tp@###8Puk@?n4d\L&8D9%>%
GiMd>J @AGL*X?&Ij@*ZppPXybjRQ@MI<4B!9wLcA:8u/HbjkZ>M<<BK@BZ$D>d9dP!@\L/l!j5n>Ee9+L?CYWm
Zb&e@d B!9u4/CBQ$N#@R4/J^=Snn@aej$9wNq?ShiA:D?=a&!@wt9Au:p<&H=F%%naj*LH&H=F%*:84YH:FYXn
Ij9?u% ?=tm5@&K5n*@:Chwn9<I@W9K>nQHIl9Zj>V8Z%G&u>F#ekCb@!M$!^<=l9==^@&/q?wHc?WQL>WQu?w9
B6?n$M iIb?9$Q#j%KaH#G6RE=mX8bjbhLpAQ+>p?bj^QluZ14j\p*@=KZm@IN>al^@8%H!#:J4Kllb@SD#4<L@
p?nQ\d /WpqMbP<wi&jVy=:pEuD$8THQ?6bV=ppVT*NLZ/\H:D@cIcqm:Pm1bPI9c&D9h&QRbiL?Hqe6dF*WuE\
bi@8M= NH=Gm=1/YS1dTnkbi9#tFGNl=u1&#L>=^WSFXQ@AK\bcAJ$ApIYiyVaFtQkAuq?kJaAIABd/^?9=HSaS
>8NwEl FkaYESpiFlaiGSWJCSpJCSWN<jphGSENBS$DE\MhBReHD\<Hl+!WqJTM/4eZ1BPAAA6wBl!DkbECRD&A
4DRB5# 1iiCaeB?9AB@jpFCRaBDk\FkaPHkEXAB+GAREPCR+NA\EM>9+M=k+BBwpAAwEuRYITXwDENT^\?a4DHb
Mj?#9W MFnX\tTjqTjZ&dCN#5mhjM<ySIA15Vp%^5=h:KJWedt%HC>WVX!/y#bkKj*k+HF\@iQF^QQ1%KjX1QE8
Ycl$Zu Nm>:b4c8VF$DE9L4i&i*4<*eAlMLG94tht++JVVM*\RqFVd&#?>?+=LW6HAQVm=1Gqna8/Zlq6K!>AlJ
qQ:F\a KY+i@LJ@S<5n4Y*qGbyc$nK$iHAQ?k1ABKCAFkG\Q=wpAInij/W!eT&=p!nHJL?NL^=?wXWY!<9j^qa:
H#$9!N 5D%Zy1$TTLTGBQFWu14@TE#%1D4/BJkRPQmTD\JMkZ9Q!1:?j?RccCIbBQABw6\*YHyj?YSi1*DiRkmC
e:ek8J AKXtTTCAJB\IwMdt@j@WXicZ8\qitaW%?eeFMRlNJcYcDJbVhTkj9IZ9EB/9e=@qA+AA1bj9A!=ijD?W
t&EaKL AAH!\EAA>y%HlC&td*NS#$XAQFu*&n/$dwW%J//54Ey+/J5wFBYSZ&iXltMR^V*WIR*J=FmPVen6B<qI
yS/mqK #nm!mDEiiH!LZ4h=W48a8BRLcJ1$/XEwZBp+k!Zh$KP5WVQmtmy=YZ#JDbyM&=Mh#D8\<!?qWT:n<cY*
Ycl!9l LZKIG4qlk9nWEJY6M?4IulWLF>EW5=Wlty/waj?%Mti!V!ib4@qDw<Py4j9LNRY/L&pB/qidd=*CTFlY
DwBm>9 &uSNYB$I\qF>/<thBaT:FV4RtWEABK$&1>mYqp:MK9E&6Aet=w$^5ka??e&$h#B84#WcE*p>V8qh66VF
*?QPe5 4MQen=cbnX@$FJQHl4:@=mD4dY/q5jG=ZS@<HiPA\9eX=tn8B#&Cw5MntqC=c%?q<tM!kdb+#K9?L?E6
tc9A>d VKTYN<pRTk1FLJ^mH>YHcE5D51N8NB88!*uA&tt5D$byQS5e!?n4GjdQmYed?NyFMKRwa4Fec!LLCYRX
@>wknC CtCSNWPE5C1:/wmNe%:I$bIu56Cm6!$FL/Dtuiyj%^#T!WkidXn+q?NTAA!!QmnVZdKj>e%6>iXbuki6
4K^#:c eReKQc+9V+C@S+Wbc!Kh=Se?hLTItcAS?Y^lqSW#e#1RntZ@PM5L:jBKKBlCADS%&F^4kCTNe@J/dMwF
S%yB<5 ZYieLY?T+?CAaTicDup#%8@KpLE<b&>P\cS1u!MM<!K?8ethZ!\E$t=#ZdmkakkV:=4@LHSXjqbde#N#
cc=Kmt cA+T&Qb!myAYT!:b4HSa?@*Fdknbi*kLH8!9m!5/Ytp^&&Ge/+YD#p#*dPCNqykZu44<\6I\pi\L5<%i
DpTQlG 9P1^DQ1mW<BDm$y/?y!G=5mhBjJJcuG\\km<AC<lM1c4h+u=P\kL4kk8#TFaZ=VXEMHk#J6kHw*>9L9c
E+J?Ru hb=%Yc*!IXS@Q@1nAZ9CXiINwXyh5^C9&Kjcy^N&bYWNq$wY!6M#BpHqDk!$PC/?<8&=RI=*4JQLJap8
IF$dVQ @4VXbE+qH1kwAR=?I+9!Kjp4FkwFm:%YW\iwiRXaeIMmyW4FJ/#c>&>^<%L^m\&8NZq#/Pt=IVWQ?DW@
Fjb6$K 6k<l*&E$YWih9$4Q%LVZPGk<8*<k*i&@mknZN=??P8!&4<$EVYh+GQR%cBRw=:CR/\/4SL#K6>cid+Dj
TG5y?Y #RGAH<lt&YC=\9qAhIK^A$aQLD18ud&@B+<?@^<9QXPbHuXZu#da9Gi>q1@$:=5:Hu5wRaCT&=K9i#F>
SP>J^J MSJ9\MtNR!FV%Q%&!8CG:$>mRACG<?i@1eLDc6ylm<SDa#<IICX\?h/?ay@wayZwpS\EGL%4d<*#H9d!
?NQ6TH 9wwDAVl*@k*MSqn^9tT&?5*!<:<j8@BlNlM$e/Cj:>J^b?9*JF=+QZ19IRMCJC+IdFq=/%bP6ik@NH\G
B^u#NX AelW:nie>T&?\ZZJLLmSJCR/lPi>$SBHLN^!SFESi:=6cTDA54n>jYZc#KV*\R+I<A$6:cq$=^4+%!dj
l8V9c* Ni?bFL<>y%bHSNj=Rm=h9AWuSYEK=D%lbn@Tqy96u<8iVb\!k?V>:IBcL^\^^QP^m*G&wB9%Q4@!WddY
h\ZqcR i<waBJm%YXY6B\GKE?*9bd*9!>MPEn88Yb>:Yi4bhKuXJCqMEd1djb1LYG6$ViVcdh/B!Ea5+^/aYZad
48p!Ec lPS5$EDcZ%wYw@8kZN%TZSmBtS/$:D&pXinhS\eCjC>i&AZNJty:D:GXQ+5yeAC?^IN5</ZYdDTN+<jH
iEpPVV PGn88Qt*5/=HhdGRw=eSkGd<me^918$+WL8JMtHAykTKiL+!SI5B4ukkynhm/N<XQ@?niQcjFD@^N<X*
kw#cZM <pS>Y*##$AMCnKR+ymb>u#X?155<l+kPm:1VAb:i>u1DAK/<BKDJ*=j*A995kVWpP=9w\?mAh#K*d6Ch
jY&Vhk Z>L9DyySLtHwwpEAb1i:=!NPpmiDdTimHYV>=+PhLaESA6DWejw@@4d9EYdN/da^cD&y6$$AeXtu?&^w
!>A@P% a+WwWQ?=NnbHi=S88nD*>#k\TyB!lc4i@SMkRB#4l8hQSb:?uelMTyNHmEu&>^n!1dh!L85u!y>:n8p4
inG/YN l1ddIt8bWFeFCIANE/iSedtLu+cZ$1!yTbKFGKmH+ZM^VTn$8#$nN:&WWblYSIln/1&dLepb%d/+J@m4
j>KlDB VC<kbh/$PVc?%$4e8JG=heXQ5#VNM5ckeD@m=?@qW4T6F=M16^R44?M6hVQnTSnJ/n8jEwePTEuS>a:Q
m9wBB8 L4=CFJ+Zt5Yi#jw$T=HRLWpck+KNXm&8bkTjTNh=<mc:5J&::SP\l4/!cJqbT68mZcB&LC9W:+9em?=P
GhyinX Q>tJP#e%m:ADDVa^6P*QY$kc/QihF*aT^teQDd$:p?a^#SL9?FSbE<AGmh4WFQHKt+SyQ:&/n!%QVGDQ
-AK4FX 000da3934a4001202b4 Page 96 of binaries2.zip
/FQ&*< JiQj8w!Zl=T<Xq>yT<a:+SNHYX5lCl:>*CcAq8du@y/ME@45Rh\dNHQ+kN>>n69EGdVB=tCQ$tQ&+%i>
YkJ/p\ =VF?L%6N/EbicX=Cb=u/h5%>ki46mhZXd!*PuLJEwP$h6IIXlut>bKAuM>m!*PC&cJbmmqSjM*&wET5h
m6u:Ya =hcJq+HWZ*!?jV^N#kMh>KbA9$>>nNic89\%GWt<FDC&61>#WPkV?M9BW><VF#q^uZ$:\\=*$ylJZ@ya
*=&PZ: Rn:y&KGKEd@%%*#8=<9X1#ctGWGqm/$!nIWWI/FFKnNt5GQ=M6DT$SCA+hXnnbLVCmCD5qH@qh?D>M\t
i/C<6e ?cSQu*1MBd1<D@Q*y168jy/lp\qhlNKGN6aSp+l$5M>eyLChik&$C6MlB^ZS:bupbWXlV4SHk8DXM564
&Kuuul d=hK6W/PE8E&E@\pJeZXkY69F4b+Ny?WS*tjYQSBkK@!@RI@@5TyH8c/XDZI#>cwQ/A^pQXCl8N?8D8*
bGLAdh L1tWaZlytCLFujJ/?\&KR%uM+Fty:dq44!%J4a+i5T=\tD<m+XQhB%6G:RnWmDR@B+Bcd9dCehn?yEY1
Ji#ciH nSQkY@mWPGuCCKj%ti?wYw+Z%ecSI!:\EVFEqMpDJ$Yam?MdQVWiJidnR8E*@clluBc:KK\yBZ6ud\Jh
8mPSX9 mpn*h@kF%>m9>iGMmRT%Q>G>j4Tm%LGFX#hn<PTi+hL^/DSaqqKGJKSdey#\IkdE:c@w8pb:F^VHcCHp
bRYt>Y 9aAZ>EA*qlbS1Mi:PT?*e4BuiDF>6i<tWVI>5:R<u?a*:m%n+IHSKNJW5QCTwa/eiP/1CBpe*?QYn^R&
#X5n<= *aj+yTyTC*KuabquR!ctNVyCBnX+Jb%%AbCRjnL&jj1d@XImlKl:5iduQ/NYl=#t4c:*FMQ+w@Lw9XX@
:aZpB= %?bVnJ**RcL>6Q14F$SZae+kkGw6cG+@5/DMm%FkH*9*1hn5ph%+*jF=86kweC*D?bP!i5899@J4J6=*
TPHC/b Ln%y@TlQIk<:<G$IW5Cu#+tYyll!WBM^j1$<F!CA$Q6R\i?cm%4Q=4%p?pu$1@iKANR?J:c/huK#6eY^
j^W@S1 wlC=1c%Bm:uSKRcN+dXpA&HKccl8G5%yj19Mq#WyQaI<hW/lD<4%Bq6E+TZu=hSk>wFq<1\nPq>cbi/q
tZd<qq V##AC\9Hyp/Qm=W>1nZw!<A\?Yp6&>Y/Fyi^#V8TL>R^*!I$AFK$DS6Y+T?I+M/\qt#ay89yENAeCA<P
q9MZeJ h8iVS\yphHIWMWZZ/HCZ%mytD1eb9?6WJe1REe*BS4/*E!99:&1QD>QdPDeM#4>!@1w6cGjYHA?5HNN=
9HSyea $\nGNRE&^DW#%W#RBALE%<1DAPEc#\PmT9W+cD=ykY^\?/5bX<#HBYyXRc$RDw+qACeXTtTnkhT6Zee?
BYRRC\ >PXVpTF$I>:B@M$<1yX&REKhpk#mtbCyX@/nplA^KTwE%XG1#b9PN=+MEX@LEy$PY4y:BRy1ui6d&TZZ
V4IGY9 4N@VRqWy+4WNFP1?&W5#&w/5L@eB1II9Hn&R+lniN88<9BMbmbEd@Qcb^:d?W<VMG@RD:a>Dud5VpVK<
8Tl5Gu m#mQ5PXhR?>R\9%\9iH4LjZPRIC44$EZZ:&upHajFWj9:d49@m!h&TPu+WPn@yYj^:Nm5L%Q1*4T1d\Z
I@+FTa cu8??:khek9iDQPQ^C9i5+m4BWeCmahQ$jaCB+H&$&=E\/:Q?5KbiT*C8h?K56*!9QVAH:@QV98dTy:H
$#j&!E \Yeq?%hSj!8cmci%c$6He*QV#DWJ=LRIH<jbF*%^Ww:9pJBmLT&QXiK::/41//SiW@6bL^cqKE68thb%
!H9Q/V \HjJMBY4cW^ScEyJCbGju4dn:ni+1Z6Y:1i%Hw8j:DH$TFcc8yPlnjM8A#A:=XT^=D>lG4%J6H#4+RFM
ipk+=H #enFjMFaXm%mZpRm14uCYw>&?<tKn:qj?m$Dw>TY>cn$/V\cM5cZ4\pm/A/W#A*hWc@!ZCy\u*/q\<mb
cmRKt^ TD@N&CK%KEkt1yDJ&D4CS$wDdk5n&i@yayd?aS=kldH@Zt@Y@nlB&?I%BN/ken%Ha6m=eqA:+V8SMaGL
T*kDyi L+ZiA!EhB^Z&SS:>V#4A$#5$#pi%$Y5WLlBk&P\nCED/a&dY*J/>T*SuM>&^Jdy/4eE=\:j=QKXMjjMR
^d#8/a uQbW5uMjqP/>@WPJa#C<b*XZFT?nHlw5X!>I:i>L$\+Iu<%A+4MJFyX:uwI=@#>TI&l1u?l@9hJ@5=p>
XySjkd nMTZ@ml&kaj!>1<XJIuEdcPkQWGA6$@mbNjHdqQj=GXK$@BdhR/D/w&6a8uw!J&pdqLFmW=cDPZ/H@Kj
=q%ci% BVH1AAFcQpb/k/bnum8mn1^@?6V^KKK%K@Qu!iGjQpA#9=8N19L!?@cycT/H9uk6<#n#TSZ4$X&matuR
i6p8<K 98nPC\NY^G5*uAYu<d=8KVPmK9L9S<6@X5ueV?cpD1WnIMD=^MY*l*/BS^GFtNLj/?Q<Q!6#+6<4e@J*
nN1HRh bY:FHw=+>1AL9H#%&jbS^n>RJ$LaIpVH*PLLFpLlRM^<pL#=d6T$%/bq$cKtLpXd>tu=YnNcEV*G@E+d
GMy$nG RwJC#ZqCPa#^NCMSq+:5BNYMZc=%EP!HCZm%h+Jde?uT<>+&cAIy=dauAZpNq*T%n5L1H=/+N8u4q$98
R++DCj /^tpFVGY\Dp@MmlldW&ja6dWR4KEVtyYttYZ$%J:&pj=nZF\19j64K^+aCGWFYGHS?EKDu\8@pRPa%9e
:Vl!4A 4uQZRELc@#Kk??p/J&phWIuua?F=aTn&<8p6hlTZ/GicRn$/h5*TjPw\14#SAcjZQl*/6i%\#bjpdmMH
AiZcce N&<Rne9hwi^mRl1!X+$X5t=kmC^*aC5yNDj4W>VCwBKT%t/FQ\/Wk&$LKnk+hB@1d:$Z?JL&S^?bwKtn
m/aX!c D8*uXh#=$<n1V#/Xcj#>ji5KP&+M>jjVGtPX:E*^^Rl1SC5yQw5d+?M5uG5TylYjyq$%=IIA>M#iW!wk
DhXPbG \BePB6MTBj/NL<6L=GIdHp1d!aPQT?L?1JMTC1jRFI+:M4\/#jVdnbu^y8?BX<856jSi5$yltSFN$%GM
H:44aR 4dbSW\@hl1WnS9YSyntiJSjWcwbun^pkRAQ9t&:>wM:H=>LV%5<E9G<MZwyuNH^W8LMp8nDVydpWiHDl
WpY\RP ?\RC5I!DAI4VY%b@y>P@@?P5S&bDb8:dM*\55b^Z$eQh#nm=+LJE4Mm9pI=B9#T5P8e%tp8NGN@:Dn$F
@I$HMl >Dh!GdbpWK\NEN!V>J5*qKjyFcMdh9BWZj@+ccYaaY6!&dIW1e=mFHJH5Ze%AXNS6dD4VijWAh:+HMPp
N1K:X* T+CB^at5#^qBA9qG6=$R\aT6>n5AZ<6K5#&=&c/\tj>A<jekDH=aRFM&=9L<?\YGTuahF>JXTYZ+F^8^
JISL5m yE>ZA^ySip>E\a*jNj6u?LwRA@pyeKAXJHF>a\6I^:?L18t9H#<+mG1$qIW+uBdClmw8=W4tb=bd>^dB
5Fch4I LuXMS:^>NDTFdXG$GKpyLKLRly%l!melKD&QhV8Ybc=Q%VLeh4ZhG%aGl>t8+5XRIILjtNZjjyC*14^+
=J1hFa w8KpiNL9&TpBAbk&uJ<ZGNh@hMHS&1k61u8yH>d$Q9%!uN^V8ip/Z>!bX%^4<59LyyJw&5=$?*^:EEDh
CWeHF: =ZqeLkRBWl%i^<=XH=CTFDLWnTPG^+dIhwC*CW%9kCjRF?+NNe<jqhjD&b4WcXFIpiYKD=*$N9ZqWYNh
F@R+eQ 9/KF1tRpmbJYL?MdNZ#D=8pY<cIdN&ayR8&qd/pA*kN:6A6qYy#<N<ihXp$bTH>PLLP6m^J\dQZkS8?k
w+DbYn NT1:X4DuEZ5^Zn8+mRcl>>wnHJE<m>^jml5A6:S=GnEniX%**LG==#&a+qD+V$*M:$*li5CDW?Y<Hjq>
WX/pei Hkj/1JPh*qQnQuGwl1BhKt?iwG=EP&El6QclHHcEIWXGc5Xy+YhHyHVbASV1#/nh4>ZkX49Z#:6^4mZm
9BLCG/ D1ZyVc+b?ptI^L%ZbHDYS+1Y^aa4SaJjXd9Fmujp=Lq@KTc4bFX/n^IYw1Vj+Ib@9KpI$d*n!L:h/#Ph
bq#VVE l!HKLj/i6MJZCINqA$=dI$qEKa!n<e%AZ+95<mCaFLK/j^X=11JnXtZW$a^mwpTqjk^ctumKTB*6YN6m
<6yt:5 SmZ#chiH&$K\Ga$N4AKGi?$:BtZ#1aWSa@1#a15khXY/Ku9$d8<cnpy#mhJqKV1Ji$a%PDySLV?AK4Na
bXITue nI!TyADc+eVd$FRuwkEBw5P$/CilY^BAh#uwA1Z@jthLIQ1>\D\u!aQj?XM#cP:\+R??dpdbIw1/:m%Q
%VFDk! hlKA^Z@:nI$a^G*K&NA5S>PaV@FiKR$?WBaZ6$PdqKCEQE/+q9LiVlHab#&>Z@6E<8/qp6FdE+t*Hq1t
j/ADwc GKM5aITwk%I6Vq9IK#m5q*4a6Y$INnl=Zem!9bm^$S%h:9WKy+eK&?4<^TE/H9=/VqJqY1T1Ed6y$i:8
HPIay4 R/Nw%E9PctRdXtDTGjGqnH#n?>lwm#RdbdPJKm?Fl!ch9mQXa>k:9jmlN%H:aA=!6W8Q4+&SKLMaSCX&
#:cLRa AFV&pZ:+Sbt4qp6kV@ECY!NNKn9i6*5id=?MM=?!C\ht@&/e@9%\6^=^MSB+eTFTIGb=1IejcM8l%TQM
R:mW9> 4ai=QJB$Qy6Z?Q*W!jQb*mT&<lep8u#qtdR6tD/tIw&X\PQ>MMb%Y\&GS6Q4?ZDY%*iwp!^%QW^6cB1P
IJp<Nc CbY54l#VmK/$jT8CnaZXYjQ%4qndZ4^9Tm\epMAa5DT=5&^NA?ubAX6MhF=XMQM\mLWM9/m19CnFK*\W
t&Xik+ Qp#cQ%I!i9NSEEFa/HB#GlI@p:qI=X4G@I6HTTJ$9kIni&Kc\Q1JyG4QmmZM+&/6qZMSybDKQw6ku1Vd
wbep1# 6Z6wnLbGJ#wqZH$6SN8baC&SdJ=B4TJ1n8q*a\eS4N9YmHQ&yp8apyK=lyWW%%LjJYI#hB8VR&tHB<5J
*^FlPR uMXQu#<kdVuTZ>*&mIX1LMXWV6=8LQ>WWb+u@d?wSmMVZ*YZl&+YnYKA%W@*T#QS>*cVF&?8qjQPK&Z6
J#!45d e&&jd1eE>tG>b:*\e@qa4I!?Eqi4pKNLt6V=VV486<u$B5eewBVjG5*#QM=?8twIK@Remk!NIwka:E+k
X/b^NT eG?#!yEdh6!XJ$5mCc?:JQkt9>KiiDNBt#5\Xd%X6K%cT@ZT>/K+iA?@JTb%e?TNEndc@4J9KVP4FLp4
$9J:>@ Ay&E6miVhEBSySNMP/:qwu>T%>1kPWXlNp8A8u*hG1qAEXje&Y\\EZ&=cJTP@ALKXR\IRGucqepGA9TL
!WE$MJ DK>iEwAA%$m9^C5E68tuP#c^RIDHtTQu9=994H<<\qA@XHT4%lFN*j9KNd*=eS&PL5j#k?:AMRZ$\:6#
CL+DyM >+hiQn!:<PFC8Ne*jRlS!<mw@YjmL+XJY/qXTM@XXB1HEaqutdd4E#&AnaGcP!#pmAM!^IYuJZpQ9B<D
u$q?cC =CFBAFR4Z^YWQTqeH<Sq@T#LDK#9p4t8<6:!X@k:Nbjp*?cP!dX%\<nq!J*J=pL*MH*KR1?LdG?K5nHL
GhP9+: \X^TX+wX9q1mDF1P99:$VnEh5&RmA!cJ=C#!<bKn5hSL8wW6BMCa\JjkK:hje:FBLY8eZLuyY?HK8@B!
S19yW= my>49Ni*YF\AQaFl\A8+XKl@P=?\iQDtDYN&*Y+wl\hGtw$\6ZI5qpNk^HCl$91c<jlD#Di#*TjJ::ZP
6I@hCe IAD=8!@NIED51/NqEGCR!M$dNHZ+<KenP??61FbPkR8J4&tbh&Ru9iXyG:#IGdk+tYwBJ^Z9LP8K>CkV
L8$#Bb BiVhScRl:a!lF5aT1CI<nRYp9n!9ENVDuyibl!CAKbiA/E^Pt5y>GXQlEB+elXqNMFpqVImkEWYT<eF:
&nWREd HNJh#bu%>5SFPklH>Bda4<a^I6C$?VJXt\P1>i>HadR@yylZHDn#+yi#qG?ITeRp9^41FTK8Kbi?KIYH
-AEj<9 000fd4bab92001202b4 Page 97 of binaries2.zip
KGZa?l B*ni#PQ6FAZ+<:^XyGNNDDW4$6KCH9kpZWV<>6a?$NQ%iHclmXM>eKcZJbJ=qtKCqLN++w$SS/Y5nB4m
IZ<nRP 5WFJH\eucjkHD=T9M6QJlnGQi68y*\WVSS!!>Ah<iSNC=PitH$TtqP:QM9=lMmRL+TGl4VL^1Rt+AAK$
R6:#5w #ZtRJk&%AG9+apXQVtVa/t4RyR/pGN1^4RpdWy^6LR*N**uk>:&JQFpZXp4ptqB1m14ZG%k\+nk8+^>^
dhlik! %N*uuP\c^j9WbaZPyZlYF:+5G:1KtCZ8BkLRIhYN<y?W=Yde&S$#EmZ^Pu9\a8Ym$uyep*pj?wIAIp5k
@M@@Fh RMeJCLDQ/H%juHdF*@H>/jRyh9h=PbdT<d><DVT#u=q>DAK5j9P?TlJ+XB&>J%^>uti?ARGpu9X1Xud%
NL#!eM u%%$&ti8PHS$E>k:iT+*=1/THeQd&h#W&J6&cSVStm?yET$9=6Z$pH@e+:TdkIWhe**>/J8yWJjJitky
Z%YXAE bYE/d\ha%=4:DV1c4!KT@LV%AwG+?#ZYuQiNeA!X6m:SnjDV\&<Emp^D*\V!$MSIIwiMF#1&W*t<K^H#
D\?96Q <LA$NZ*48MenkSn^%lY9k@44wayiTdddijhLY6:9k%S/\m9*9YSwRHV&1#L!ujS$JXMKca:?/@ZM9RER
d*elJu aL9p<m?hIm:^9NLX!Q^V\@4cw!ADEJd%1mPc5#thn&dwqL/Qk#9pc6Sn*+<ula:!yXjpFcXcW8D4DDcl
XeAFLC 5\EeY9=?%blm1V/u+WqbDJ&#VQ<qq^Qh/iw&=+6&5>%d^$*yibdGCWF/4$EQ5Y#ni&XybFqnwyP^w#\n
?L/WNP tTh<T$anEAB>yXT4ETFTP*+I1&QPHDChZTnT1K8ya!E:E4dD&*ZaH+5p@%ypSwqW%dt!y\#&y4<?MDK/
Y+NXRw %&HFwF*V9DlRyFkc1@P\=*K%RljQLe=JXih\@mISC+\hN@tw:>Z+\%4qPBRIEJkDAyRYFD@j6YpRaFT4
T\E5Ch w%9Ji*bc>ZtC8k<C:JT64lh%HP!ZiE<>V%p9%i*Qb9T9ZYaF>ut<:$w=d/&a:q85M1<?Cn#Myn&\9*nW
=HJAWT a%i+q<><5ly>\k6:1pk6jKSTAAHa#WAAJDERRENP=Tu8^/T*%9991kVN:iu@L%V#Q><!+/!L4*pcD1?q
8n!@lI ZD%eKYyjBNlXtKbkyWlnI=CR%6pR@/M4M&%Q@YdiW::R&8Qyap!hLnTDdQw691q*tJWZXeWLC>R:8$iG
WtFEk/ kEVjeakFlCJ:E#GZ:Gmyc!F&!\G&h>EY%PKhmLSJKleQYJGZR&?a&&cd$8ZRb+yn\/e\btuZ9Qd%CX+%
&$haG# Vd9w9E&dWYAeiCE9YbGdCN8yp/TbmlWCVlSiky/9eNZ=l4QlncIYR*>mQa4$DLE9X5lRaTqSiY>mAl<<
RZL@kA %H+Q+c*B9Lb+IH$>AlL4=mGiQ^IpS*W@cW$@8NTd@YShbKwa$uV4$IMM^!Dy\N:6/bPMnZ8wJluB#E?9
V8y#E^ qaXk<wa:V4tZm\wdl!G>R=VwCb<P?udtA+:W\iGt\<QNMulNa<C?!*^j$Wh!\$u<8FQZu6lHA@!iyn+D
P*&ceD H?cYAq?P6@!%Zk4mKGDn4Wa:ujtPTe8MiBy:^Gni/HW8ZJM<8JD%*p!@j9&IZPN>?dFQ*BkuMmaIEHVN
X1D48T w8qj4wunTCqEXPBY!ZDaiLCK@*du1^R&bhZE!e+&=nn6IGKS5tV*tWKX>WD@\98y1Yd:ZXj+qeTah<D#
?lEi$$ BCtGYFJVDR9dE?tc==G^pi:%>=hXLwVGH4b=#WuTu#+wH>6!<VGc$E41q$EKnllnLaenQ>t/#=uHmZiI
6mHG:! ?e6KYYlC:PM^INGe*:AZnu6/k!cTF#&GDnTQEuiFP!IQN1QK<d1&^AaTGGeXq+Y$ZS++i^ucN8ay1j8m
5qIbjy *4:5#qMi6CYZ4TF*qn\LNC&a8W4PWF&C5u=6&DVBRJ^^1yB+ILXnIj^qVyD&kcTatFAb9AMqRp^?F5q:
!dIbbk J&&QQIT?VtdJQ:yVhIhKhbNB=pLdYjmD=FjQ1Xc<hh@DM++tF!bl6dSNWnNqMnwCS?qiuci*Ja?*?mny
IP=+Ci t<$NmS9#$8*yQahE5P6G&tWDX%cPJbnbYEXF=hC*6*#LSAw#%*TjcG?GpFlZD=t8k$N^ASy8pu:K?i:&
Y!#TC% T%=8KV8%^T9qbb=/Y+:Ad^\:=:tWkLp!ySBQF#NI?F8XmkXCAb/!HTZL@K@L>=VKZXA::u%qk>MG8yYw
T>Zj@1 >bWBd:KG9Xu=P+PSGK>^h!P@#ptc!NQS$te$Wkt&aih^jEjddKARTENn^+@kYiucPJC^qGX6w^8$\9+/
h9\8^l YPLL<aJ@@$clkWijR/ek$>IdK:>u=<a/tKF<W>nE4EF1Y\AqDMG+^#*h4HAZFql1DXha%e!tL$/lw^k$
PBIC?C I#$M%RG69:Q4%P1Nl<k&^T:FLqukaYNH4+&4#TT@#aY>?h%!wjlIZJ#^:/cS1SacHdq4KYcNH@%HEc9d
u\TNM1 qJKWP>Rcw==Z>9FBTAL!u$EA?pd9C=Junju68Qd>S:<uLV5RaE9E:JEZ=1HtK\k\EDn$%<Ql9^/P*48l
*Qw@jH *Jt&kkA^TGqZS$RZ\<<nJTp?*X<Qtj=/!Lt@ILChiQwp!tE@ZiW>#LD/EG^V?h6S^&>HwKq>kWIDECBS
dGF44L y?MP>W9HZ&Z5?J<WN?G9l$q@&Im@m19^&=HaCaZ>PiXH^:*ly$9>+Z&HX+WwW^^M4%??H:5DVZ@W$dt@
NMT6?Q +bBQl:%9M+khEnBj*5lW54<RYI6:N4HZ&CAA&SPeRIX>WiMh$buWD>6?H?d>9BKA#J#uuNF=mLwq@&Hj
RnH&#A *+q%QI@b9k4Q>9wZ9#^MdAkQ4###I5eR%:/?+edZE^mNw%he@84yKEci@SyZM9+!pb5$WYR55lm9^dH!
KY?6tR ?N*H$9mdX\/b$6MMm?8G4S@tiJ8N+kQh@c*!6+^G%Su^*#%a/qX4%kp\h=98T=ZY>\#d<=E1KI9b1$9t
/#<&q! TP=YE8Q/>Y*SbL%?b$Z4Db4lIhTbN<Iwd/maKP?yHYnDLebNaSyuSRAB?EjE\%ca*=%@+!FKCiZXPbk%
JKKV\P jIEXQE\:Y$1hHdj^tQJma*NY9Q6G98+RwWu=#y/S*>tSJSHKEwHi<aHEYF@DWbD#NpJPe9NGGAV+4\/<
wTdXFC *@q9??4#:@9=iTn<b*%9<FJ=:uC/WXKpTm6M8wyX+$N+%CLj?#qAp=>//6lEQ$F$W<!mlbDGBu#FnCYk
\bayT* pHb/w=MVi#GtdZ1V5HIP/8P%HA^^pHJ%QAQ*?R4^i<J*dKDb!/i@miWa#RVN@i/L#&jQT#*$!!ine8?6
j<%Yd* 4*QiwC>@8Iuqd%N^@EdA?mQk@@?ChQI%@:YlPkW<K</#mJcJFlWy<CIFMqTKMtJwP/6+5k<NHBlMPlp<
Zd4t$C =?<AnBw\eSqacFTDyR6Gt6*:K1uLm9jbaC&:^@M>B\GmK#la$ZR+MH1aa5I*9J5NYN=b!B^K@qT+na1+
Ikk@Q+ V:yi!ijIl+h5R!H6R<9jt?X+^!/9>:wh==ZXHmcInkt>D+w?J*WDQ\DCGbMXmhuy9kX^HhDX#GD5MIDK
hNKNLJ AJb5kAp9$@wCG6GlS^\VmX:^CQN#hBkYjKnD\V^WAB46jZ%XtieShpXMHlh&>&jBWI/imVb6#PyNA?Wl
u+XX\H %yHypY^wtq5n@Bc=Il8<\wnYuj9PD<qYFdSDuRby<NE<R:STCP+4hW!d>ARS+1W%M=kwbD::=DBkwk^I
A<ikl^ et\VP<D\!!Q!n5l#TSQeAIm5CXTGMk9F4wBT#jXZW!:BT8^ncI54QI^AF\:YkdnpLtBE>JwyTnlbABWZ
jcNEZ9 py>pH@Qai9kFMPLTe/XlMCR=k1qNcwy=1Wkc/Z*XpKYp&W#SCa@\QT$H\t$qNKLLb:BT>NTiGmnp&Iqw
na1p89 /FI&KJ*SeE%VcIuD1:%G=Y?\l>\M*?nNFe89ebSdyGVpYlHWqFXRQQwcFyRRJ1:p8nE4+9RaaBSIAH8e
\#G4*i @tl%q?\#//LB&PQAbFPbTGN1Rd/9PEBHN\WqhmF9A$^SqdhRL&c8R<cBB\8aG*Rde<\VhP?B#DtcY:P8
QjNmG= IkuD\BjT/#*6hW%HBP&$5Iq?MJchpYKXpELX&CS<pTI&nLmDhKK+FNJ9?HbRpVi>uMMPw+$^kkPt^EW!
8PWCW9 LXKSA*HyDm>*<^cnHyQA/MBmPXtZ\GK*Wa=b6kCa<GeunEBtYe?N85@SCXHS!\5d$/IGC$nEPC6*99M>
Z!JBil pm?Cqi6:4W?$Q?8tV!m!/b!LRKGeD:?Z^?ui#PV8Q@e<SMi?ckVcPu/qP$dqtGw=ySNqTpdSu*MpEaMa
FHZ^+n HFhX=W&D+yLnuwKC/MdTHH>NyLA*4l546ZI^k6Z/elIM^l4c!EYW5d*:/bWK4lQCc/wX4$Q#5G9:J^Ww
kI:A4* $jjbSq8LI<YXFwDbdHDwaGPlaRt:pJDYA9S&:XRQW+MBbm:KNiWhyXb\/\4H+P15LAPqNYy+SNu?F=AE
\eFPS8 nTIqJ%Bk\Z^X<:G^H=*&SC8>&JQICENq9Km<FSJ+Y*$WN:AQ<WRu*1FBAaRRZ^/RT<GV+mXNE<KThD$!
KpAtKC WQLLe5%j\IK9WVPL:cMEhC4DK>+T?>1KI*LnqPRP^\dLK!VE>LKDMI%E?H&I1YuBC?Iuq#/DbENT9I6b
QpR5Ld X+p!*///:9CnX&Mb:Pjl:i5PTJ$YVV*FEB@5^aRTh%Wq!iLEGIGkYI1V8TB=HwRESjVHTKmL*am%F+d&
@J?LAi \8XVPK8hNqyF*lbbw:BQe@h*$H*^*EqCL*iYBP!F94/9q$LWDiE^X@SD1EXDY1>Z\Y:<TGP/wKkjCQqJ
cqmI^L tK1uJ&<@LInyBEmXPDWijMc88ZQhSA\lQaX6wY1Q^Ij=Im+cZnnLTpN\PT&D+@%T%KAYVh+GXCNGn$<a
=j5R8@ 6bnR6C4LTQ!4jk#jBKPDZqGPJA?CYE8kl9@cS*#jP1p%X1NM=/#9k4juEB<?SQkTb$M^BncBTPK@!J<H
y\5y9= <FbaT9d8RQTEw=nyT\au=t>dn^yGylyKc<5*D$6=8$^6TFZPpWdPHePKZM$/M=jwe?Vu6imlcK+!$/dS
j/j5XL t\#nT<G?X?u#uhLba/NLR8hPKkpAQ/INRKYh$TTaDEciLN!apA&GA/jAE<eJC\a!uPSaFRj%1+@wiTwM
b9K5iW plI**#wbtcaGKkCSHkq<qDk*$&^>In+%?au9<yn4iIGy%H*C^h*p&!*t+XHbmMB1+X1^Vq&Ah\c#t*8L
LElcEp 9X<YkKdl=8@QCS+qcVEI!uY?6tl5&X8Sip!q#@KN4c?LD6<cMM/9VnSuk&1q\YZ9N#*u^&CBc5tdMPqw
h:W4*9 Wd$lbB=8JydSk&&JNlW9u@?1NiJy:%ZyMcT:N/GH6l\q@tH5w9L:SMm/c4KLBc5Ym!8#u6JXeim+X$@>
1+\$BS F=>Aw/X:@+c??wVLKptb++Tc*T?Y<jn5=qV9M5FEy##yF1A5GYaLGkQ&C#kVpwmwMbmXMLGTei:SwBA^
:l&/>* <bn&Z6ey51MGH88tKVA^$nEV+Aaib^B!B^H5abnAInI59?ty9a@yKyHY&Z>wmm=/u>C&tCq4#RDW\/!4
6F=5w* H$l6XhJW$?6kNc5a8YGCL!H9Lly+u<h?pJR+9YLqhpRlMP$=hpFBV%85VEQAp>16Ha%La!?+TjcTGk$<
bGwNph XjZ1w+!R^SV#w1:K/JWB4A1:JiR%Jh4l5m5mX4I/EkPdnFtm*Hd=W9eL=ltXn?bG6\<9ApV#^iD4e&5e
d!4bD$ eJ5klCQh5%=njj#kCD+P6\Wi@4tTeyj/T!yEqW5mYC8Q/<I^Zli1hjmMIwi+?!Jc:acWt%Sl?SL#dDyG
^Y=Z>@ WAB<5nL5h%kKDIib>#KZB5TtpH<mHyYGNYHjHe#C#%&SGIc:=1u%#@#wZ/MyakkLd?=\1w*wZ#Z*Byaq
@WjE?a /+5yP4EhpyBdk=d=VHE<Bp?>LV5ACw!LKpA\nENw>tRCW*wSpCM6iVnduKpbJ1=#IAStl$wNS=ITWYWM
-Ap@$Q 000c46e62c6001202b4 Page 98 of binaries2.zip
Hw$C:@ B??ucdjVteYdVAyCpepN>5bT$%#8&S>dq#p5k!QyFe+cH=5I^SL>m4YTJCn+WtcDH^JDGnH=Sej<C&at
1@L8L& M$AYyZ>$cpnV@bcE=Yl9pe@aT^F#cec&8&<4L^+#qQXm64cLX9c5%m*HRdl=WIR^#VV^GblinA!$8hn%
+1Vkia /NP#qW:Z%mY8hwE9SPCM5CKD<n@%mGDm/L?\1qck^A1:cb%1kcB46Q:Y:ChZ9+TAcS:MTP$>TD^Pk%p1
SI??<M pic1yNta4T?GM9JC?>NRHyiu/XVbB?G+$TkK#K^BqA8e?T\YD=Yi6=YyM?>Py$LSVYEaX!:m*JAu&e^e
qDLDl= ^6Q$dP5dJ9GZkt!kdCEM/$CMe:#R!T8C>uQkDSin!:^SFmjKpM8d/jVEJ%<NBL?Y4/\\:HBCbJELYqAh
MN!n#T Z@F$L/^Y+RYjRK:=w4M^w6LcabLJ+$H:^WL%S6KeZqGL<FRWSEbF8X#t4I%CCb9bX$lJTQ5S4!E!6h!d
V<IPNG %#DA*>mKa<Gk?JmNNRTP:S#:nCDtdap:YIpQVh!a9T:JE8\5ZQRMBFmV+%\ZZlXJ5mI1Fuu&6@h9?bD6
K/&&N% >&SE6$!aDDRG=E&cHYk#aEd=T88a?ieF$#9/KHcYnd*6I$!ntBMXFDRN/Hp@YGMYySkkLkQuWPbE!a5<
y1&Nw+ WGEI+<qkJwRm&GW14tw8L8#H9I%GS@n>/NYeDYpiHZ$FLR<hNV:mH9EPeS\5@B&1hXi+lZI\HFB=uDFl
RaEV## ^El+HNP@1A<bXn9eZDE@5P+Y%leT5KaMDa+wGS%KdicXJ+6pMISCi194M^J8Ma>Pt/e:1e&Iquw&pBF8
HtaWnk +YK5bFQk+Ba$1Yw5Q+@XNcXjDKpHn>p&4lkpbuS=:uS!L85um8Qu@!ya19PyL@RDC=hMtd\PTkn?Z8\h
BWyiL! 9VF8WW:$uyhKDkluM8aFPRN8AjAR#bp+imN%b<y/LjwpiG\*b=wAkkmQ!l1YA8&q@%Wwm>*dc5Wd!ldj
/?dHH# 18nA:Wq!ct$D&G+TYYQ!ZhYw9S#j*yck/9n\<%9X*qdTRSp5!V:@5CL#kaM<NBEwNGj</q6n!X^e<15k
t$^Z!> !d+AyTCm/nRc$mZ!/nLjC$JV&J\k?Z^w\WMe1EpemXlIhMRAbajQNPyBp=Z$QhEy/JQW/HpFF=\Mkc*p
wh*\Q? %Gw9YX!lHMN\LyIl$XVjtR6?b6%FH>mL:M6!QZ!6W%MmFPPqlCd>%mGD+eKR$5d+JVwcHl9k*b+S\!c/
tK&9eF 9muuC?IL:*H5^JltPqk?j@C>+B=bPMjIJy?lEHSPT9T#WNcK9YqiTw1uENk?SbaR?L&^p1B&jXlcSJa$
IEG#6: y1Jcb6?CBS>McGFqH9AhckWAHcP8FTDebIj$iG9LWi4XBI#wTt%G?jp^D<$VCWAS&uh1jpJ<w#8SS>CM
^6/VV+ *KT>c&KR^!!%mjw&4L>JKSAubZit&VG>nVH=>uBFRi!%GaI?/hbDK/S<hI&m9LtmAq&9REqb<!XpKSBL
BXRY<V ELCX\qaZIpcAHD8R=t<yhEA\5mWLmT\P&>$%B<DeRL+h/EZt&u!DEZkl!AV>!8KPJ@>Ypa:kK9TJKSid
8w5u5V &iRK&n?c$WhdIe8IAc4Fqt$J6:eqXhDMcE>RCT:QpF#+PN+*XGqWmulNDBnLCQTT&\Q1au4baNcJWI:y
NBNaXN bK*5Fuk>MC$9C1PTG:qDh*XB>+CJhWFVHZSAk4@@Wuu^IMLFdTT?:99i^<>CY5RBYMm<Cq:Ed8VCY:t+
FcV6Su IGI5q%hkkdpyd#6X$Z6EB4^a!9Z@51t9tCNM/<1+^A+AAuhkTDpRnR>kBYMynZ%XN<#kAII5PYc\kqt\
<6TMX$ BwI\+Gc\BkWpQ5GIYWh1uWP\c%8I^BepkFlaH$Gm/\R6%^T6?w>c%>ucADB6%&L6LADKhcd&GpnH6Xtu
A6P>d: 9qK4E@Bm@iuF>cB864iPc+hYjS*KhdF8@cRP%1!8&1ni:JjZYCq/4p8/Cc8/YN89Zehj%*@YTdnW9==?
*!NI$& jb&pQ#5G\M4Zum*ZJkFyZ$<daS*4eIAb*6By1^*1*TDw5A>1J$\c#maa1wH$EwY$*QBNGySM&dN%G4SM
+?>6yQ G#Sb4>ZB%HCX@Dm=lc>wE8DAlL5WV*Dq\cE=45/XtBaYwbA#EkVXSS!q/w*FetL=&bKy/8Xjbd&GI%+p
Bbm\9% >^GE>XpF@\q%\8<#L9+9eeV?bZQun+L?6JQ##%6A@&Y/BiC@thKek?5jW=y#eHL@c*RLuH@P^e:B?beW
Z5i@Rh :y^@IbZ>T?b&Dp/P9&Nm?QQ?%*@aYj5Ht/YB@=DIp95uG:YB*L?Cb9@JXt6&=q>B@&!#ND9LL/B@=LH/
Lq/L61 a#V44/Bbj5JA<Rjb<@+SDj\yG9kjwhq@Ae*G@4N&e@\Kt8%uh+##X>A5Q>EY>q@SNScPu&#4b@<XZj5=
54&MKP G\LHL!pd=$</uiNZqI*qb:RjHK#@Eb46Q=L<X=TNqj5u=Bpe9/J5RPDQ/9+Xbj6BVQLHcM=j?wQ@lD!D
T*^:<V k?5@RuQ@J?*t@BXhA:L?lC!F<=eM&$@Sj$#d<E@X:hhwG%mjLR@45$K\euMS5#=**C@\N9\?F><j=W@n
*6X>nN @qQ?NE=P=6@!y<pb&ltc@$mlJtQ1+e\wbGjC1QJjTaWbFb%M#W!jB>ejI!uT9=hP:WiG!^<M&#>+MH+\
*NE$aX EQ>KG+D@L&9DD=JZLlbm%8iy^I?t@EwV&Q?:J4C\QdiBnbPNtb&S^eLW$ISS*hZG#6VJ$MnT^6LF<quY
IbBit< j:P:8Xu?SD:>w:8B4L>ETQ9:ZIV@m:J!e@<yj##4<>n?R?SjEbZ#:%qJ@yKM?y?^p9\%QjyjE#L?Zdqe
+PwXy@ @\a4Ci6jYEtiC@&NqaRL?P?SpkB@#FQ@V*KT1AJK@1@tJEH+K!hJ+9/V!IZ4V1c=l&88nw!nw#*m>NCl
m?5:bW 8kh=lN:ZCM>E>5<CF^WQWTCAPy*CLe4^KAlAi#kAAq\d%aEAQp@L1*>@<jSj8Nn&/<m@4SM$pia>%Hwl
*q/\<N <KlbL4At$Mn=WFyJBkLMlp+@RZ^*@454Hd>heT!@i:8q1u!cw$%dSJFeDwAwyt#T>P1+W?Y+D\l/AB6/
PS$itw BL6VA\Hw5auPpNK8aLa%H1w$RaBPD95JwkV>m<@GIABk+hZ<\G4TjFZIMjA6VR==yEW>%p8lXT/J9WPW
+=+*!k P:PwJ&YFp5ia^@:9l+<KN1DJjY!d\i%TDbHiJIZk+yhC1I^*/Jj5eb*n64q:dyjLw=aHRm!N%+R!IYVy
>>hQmC 5SY44jym8SFy9:F?pL6nDGPd8c19ShpytXA\cVP!+uI^MRunqW5SnE@W:H>:GHmqZ89iJdp?B<l9Tq6@
p1j\FC mdXDwNYnZlm!Q>48X$yE6#V<58=dA+<XnJl%&y<wQ+n?m@Ln$n6WwLci4l*Q\#dqTpd+TNQuAI+h1GG1
+YjHSM hAWt!@:nmT%wc5>^d%E>4>LX&^^4bMh!aykY&w+GGB!t5pANMDG68/TQDyPD:n%$N&l66Dc:J9HSli$J
k5Fhc/ GC:JWKRdHH=W/yqH4=&?lnQRau\wN<e56#8yDwd?ltB4e+n&8L>Y#n9YFtXK!E:JR=lk@hcb9d$$c%HH
IG1QJH $?%5JN?AduA4>aATI5c&TVkebyGk<i\#Kc#N=q^b8cKaLidNTnyNDSML4l%b9aI8X8Gh9YDVhFqlyq^n
GbHuVD 4KX6qki=^W\6t*l?e11hXPjmTpDPkldeMVBMiEh#$+N\hXa#%\*?w5+^\R!iD<h>ZTLBbtQP@KN4FIQY
?4Gp1I jkkihCV&l$<TbwXMEWX%aWebY/huWjW$IAD<uj%V8Z4HBa%*AcaHqnBqPb=N#Iyp<CjjW6amItLAGAWI
JSDnXM EKH8Db4iZ?SC!6p9/WT%Pj+M+!AW\AIC=GcBl#EMFT*Rj6Z%kjEB%\bL8*ISPD&59Jj=5Vi+8WNC=Puy
1Kc\eV ^^dP%5#:$6>hcmLF!jYqCMTC\+PuDZ>9</ZYHDS#aG<I$eyqtW99\h4NN$qDXd!PWVL#dRu@uwjw&@Z<
:hTihe I<Z!5%d448btk\Dii6=Vi8PQc1P@8%Sd1H&Q@qte%Ak^<tSKWqMq:EX$LTER5\K:M5p5R6VS1nGtL+6Y
FZlSt^ QE//yIRD91RGAHkb1L?HpHujy8<>eNh^WGA@<WLk&4$hBIm=@EH&p<ZwjZD?DkRk&*pYN=qVb14<1mlQ
WVWDIp Wwb*bEe1#%uhnH@Ma^kE\C5D#i:je#++%1*i?VYCAHFT$V/pRew%da*NnY=5Za\d>6J5iMWEP%LNGTab
\ayFVd 8kj9mh&Y9SSmy@WT=>#H$+=#WuIhIjJ!n^PCk6kWLjA+q:$=J+Pk6dKthl9<S4DuNYy$R*KdMp#C@F@u
GqBa#K 6IywQpw@$GypHRc5=1n#N4d:nedpnXM56*FV\T@uTSe41MiLB*cai&aEictQK%^X&qVc6!$tic8tcwZV
*8n8T4 V\caJpkHN<QSmXY?m\1WFyC%FLla6Z%8YT+IpFwDA9#?9PN*y:Z9p/i<6>8ZumRpRAB&$/i@QVMH#i&D
mTQdiV AAZA#D9:l8hit@\Sw8n>?%Q>*=@?5:LNHqu!RIDlh+$QpXFQX5P@P^9/*huw9dEWCJD+*j:8JhHD4P>t
9h9wM= LHiMceCe=JK4C$q<qBHd!P464Dqwjq@d?!F*V9<TDPWlYSh6G\qBNHNwpY>/Q#FYlmKhkV\K$tcpF?#b
E/RS@p Jpy^8V/>9AABH4X6RIB>R1c:R5:dN<?*>61!>qq^*V6&$qjZX=ti>c6k@Cqt+%q5b?<k4+=uM=$teC<S
G/1kE> >tR=?n?KFkBNHGj?L>d**/Ch1LdPZk\u$taBIH*AJqCWLu&<N>W!u\*>**a8%+Z?R\+Q%eNuISAAFij6
4HTdEV n!maK9:<khcRjIV8<FwS/ju9Kc@^H9uwjNuMRXPuh*<PqAG:CH4IdhCuEhk/*M$EAe=L^y<6VI8!b!y&
q%ANmw =p9L5TGw!nE5HAZD+pPiX\qIH!6c<#=>DAiR+SBKZPYI<WWXPy>:$SecL489#e/%#XKW4ImWYMb&:SNW
C>dl$S ^>jFJ&y%6BC@M:<=4He54:nL^t\>8Fe8CWHAduAABD#TQG8P#GMRu$:upTQLnn+#PtD8!4NcDGLCh5Tu
6I!?Ac #5A:@&qCYTKTmcN&y>WN:qXyj5?PQ>tTbLt\8=?I/>iIX?=lh*EnLQM#e%i8G#um&^D\hMnTja*9+E?R
A5:tTK iX=/n<^n+F8\S%B1#hVWThph4XYM\Jh@hV5NEct\u699a#CYXH*9DAI+:PSIKhBA&h*ncpdBH$eR&5/N
@m^qIA SL#a@$wYK$yqjQ%te:?&V8n8$V1EaKJ+%VkWBAnl/#/RiLH@mT1>kqRMi+ww9LSJyY>9Kwen*+5NNLNu
!m9LYa 4uQJdFCwQhtNnSb\Sbm@+K\KAum&JC!nIN4\uKa\Twi>e^cQd\aVhiBXVa&G\e>>KD#=:K%%&jnR8L>/
pKC8SR FeL=GL?JhQ4^R?G<!?XFdh4VpCQu4Ne/j9DYDHDdCR=?L6bZ<MB:ye#1pNDYAbihu<WQFVNMC=a<Fpyk
LcNqNw 1p&w4/B^y^ku#:Mm<RTBS1$?P4X\CjPFj8$1RYyHY4+#kYhm/kthtw/WFGc?y==*QG9iuNe/Sy:>Y!M<
#8\:=a 8X\mydRN+LaaCCC%c1m4M5\mAS%pmil$*@ZKck1L=n!EkG6D1lC:/DDDE\VwK^Z+1+Z%@=PFDWl5q::a
M\DFSL Lt@DZqZFwKkp5VGnTIGacEK19p$6:*C!dMB6V$N$w#E%c+>*KKNB%E*#LY>YF<Zc:njN6@!&L9yiJ\I^
#G/LEV @!k:cjb6IetJ454l?KF8%4yhZ8puqF=6SbWC>wj<RwVpE<Py+$**k5B%LWb!/W>6VmIwZcVE5HM1jjG4
SZKlD1 L&beYIwVa>@mwJ6djN\J*SE%a/=!9#9*nSIY5CAR%/hhWECb*bp<Jk<uh@Cbb<Qa:%dCe:w1FWSmJ46:
^GPLee Ijjm#IyFM&j=M/<iuNlM1Lb+<uKGjlP9M>ZSXK/^L5GVht$MGyFpHTtZ?y#AXalXXh>VutQ^qSW+==hC
-AE@VG 0005a4ac32e001202b4 Page 99 of binaries2.zip
^CRuCC iV<dw#5NBXG$mkk#XFHd#98in1?Jq9AkkQQDFMjnG//6m>=R*WhH+F9&#Fpbu+$N9j#I6yeT8YJ$A%Mb
YPyHbN XD&:wLp>DI6BS?yWY>dbbXqGIW=$SXu\y#MW<aSd#IhPjph<Baa9C*&p>XMM/M!H%CKPhJGY4!GDAp4:
E#8bJI a?nY*uS:1/k<t%64:#9Cb$5l\qqe@G!K&V5iw4#95\Q\CtKK4VVR=JX^QuFE6PMHRTb@p8h>%H>m5K5@
c=ehnp D8:hZw4jJNQy@AcHGB&!8H*ubV5m<H*$J4akcBXjIMpXwTH/K#$nJd&i8yNjnL1mKwJ6w=NC!GHa@mJH
dWI/pt h1E<STR%LkRdLZ:Raqa=#L&A$MD^p+uicML&:GnE#F^$mk$CWNe8GYLRuXC*HPj&bjD*16eJJnjaM4ap
t^H?MX WI>Tyuc<QtaJP^6\+G$iW*ZnZCDAD/5%@*5>m6/cy4>/jDYch/u*PjHmK!V/MA&LhI:F^?&RX\6WM&4j
V1!IEX >Z4hi55/8t<+5S5qSq?wIDEQw$pXdGNGDMYY4eKeE6aW+e@a!niVy?qM%8ZJYA@j=419S+1MNq=>@WRi
wG?8eE jj$q#VD!&S48BS4cMiY\%6JCInYd^?6R*=9cEjFE>tP&#:tW5<@^jm>ce!Q\dX:J^AaBFKALB&=NKS9#
G+Fyu! yc!^n6=I*6RPEai/Fw9HSGG>FqS^u4n1hQVwGK:XT!N9n=1F^lL=#nmhKq:WdSY*XKF<%#FeI&XL<GJ!
MiRQ%V dF+B$SG&ui\yY41u^*XnlEc@A=QRcwJjI1ATnVLT$nceH1ZI^L?tTSW<V$$P>nAmcdV>heCc^Cilc%>j
R*9Kkd n8^NKcY<mDC$KwPCwH/:b6DEZ9jIp#/H$&1EMIaqBGTm%RQ6TC>A+Cl?+&b^JeHD?b4Z8tm4PSeDWPTA
m+WhA4 %5SJRa#YhBwiN5JDQ5?m%j5PaXu8eWcwujJ\+l%Sca>^Jj6ZIwY$k&?N%WJMujADM>pJVSRKRmwS*5\Y
atGN1t %TL&nlSHWpmLjIqnjS?tTIdE5a:CY6$ST^YaLVY?5T%1K^\M&1M4pAlK41%^:Z>ZJW:kQYGl8NSQ\w&B
+@+Ym6 #wilwm%BWI#6=MIHAYJuZ$FW$L^IeeHh851iIjHkh/9dKFe=#CWF/nNQWh<:VHN+^Q%y^nd=i#*\5jZK
P+:jN4 *t=q#uu=m4YwIw\kj$iR@M4DC+P6ZGF&e!Y#%m>95m=EJ5YGIZ%aZ:GPJWM*mt!w>JQ<*S5<<Vl*Ed$F
YQ:#%j HZqli5FliP/%<qGXDbY#\GWWAmG9^m!wGQp$Y?KEFaq4WmucKcuD^t<jG1=j$d4AFPm6Jq%bH#bXXl^6
w1MCZT yt/kl8FZpaMS5jyF8Gi<!uWqKnIItL1cCTGY?bH%bDcTBB%KC?p>8:am^/+Z!w5pF%lyuK6Y\et#6S&e
#Iek<a aSSbyXipiR>plaF/HWqZhGwl6qhLtw@kEYmwlSRYAYRG!>cDd\tdmmi9E1?=NZYI%Bc%4BHN$=ywV%cS
XP*LYq n#+Hp%>Z5PwlmCW4!@F<cWVTF/QF%jC6M1mHbP!M/QMGVi&:QiqQqJNiQbhyIwLZ%Tu1Z$P!XdIXYw@@
VJh54H :96yYHiBbeNF&buYb<\lYC%qeuY\CE%wJd%^ZRTa^LaP8>Ca@eRiMth=S@wABVLmDSNEReRiH^/*j4u6
9betN8 a?!Nl+M*&E4D:6J^hL/#%Qtw=%RS1m<d?q<F=E4cNm>$1p?c!Fk$MSZmnT1wlL85u#8iQd1Z+cpuYS?<
P^+<Bi $^=cIXJ#q>u9CSpW>6>aXqX%XKSba+F>?JR6Sl>H?hGPQCFYuJIhcBFQdmwC@mJa4&t/9+KGMCSZnN!y
JZ!qcR 6%A:L#4c!DYRiWBCPI>BnL@K#icT/wqhC#T6Ik<CJK#i9^w@/Ml>Xd+uh9*?jSKVk8@b>85HT%@9LX:9
>Ydcp: ^hIuKVMRIQwaBLC19KNIi^JyjC#y&E1$9$Ni9Tq=%n16nu@*X=tktYi%JXq/t6Y@pPF<CLL@48a>TL>/
QZIH8D <dLn?HqSVq:4QiAGA6S4QMTP@48@&q%>Zu\q&Z<4jZ1i%D*dw$eqECBk@CeS!b#e@^mSDQ^B59*@V^:%
aKH>AI 9=E<C9>jVB=%bk$wH?l!ll&WBSlFRZ%PXedLSWk8?k\tc&RQ@$FYW^eH?1kMPFIwi!A<F^#Db*AILb@X
*^n\+L 6SZItK5/Lk/SyX\aACFTkN8KFL:Ll+^$tVehLmVyeNbm^+/?Y&?uPa<^H4=y^NhuuH=KJHb8m+R#hb/%
aq!nl% #$>iHd\4^Y*<TikX$n1kK/H^M&BjhjbD8nnLVAT^$RVZB&9BMZX=QXbtj\meXeEy^&SB#6+bQlDQhD*j
FYJp@l h**=SQi9@JN^%mXnhbl=G=mcH\V*qSEn$^>J?ecX+@GC$Lt$T\NJ+56IlV@:k#HK#Cj554VC\!wij#Y5
<eqL?W %V&MIDMRip?tMjwww?j+p5F6hh%cj16&kT%^e&^Bnn6MdT^hky?>jQblTjTepF>e<bmM@=Wm=/^6mLc6
Bei\wN #ZGkIa/BIAeTh:lEWw<lFD^&H%wmQb@wFbe8b6$/wFbTJhp+d%^L>jD6?@X!41>1QKea^RE>Hnet4NbK
wV%P6$ PIej?!DM^LF41\M#jZjT?B@aD&IPVT&mGFRGua1VhN5JCnj!%?tHL=dIGK8VZFlH^DqpplRYE<mjJyS8
Y9EE&e 9p4bYy%C/iE1EPl>+&&JmT9mhhRXE%HYn%5V/ybLH%k!Z9S/%D/S9?I6%>M/jm6pjDd4?4EZ&jc+ZJ&D
ePXPql uWyqW8&^EWM>+8GchNWqY##wnebTPpp4DG*AKwJE1SuIe:TNkAMVQ9#+WhFETQ:XL9!w8<qCt+bP5a=C
XhEV*% EnLCne:e6Dc1!h!1!%#Ew:##jW9tlPL*yM5#SMMAZkIM45<4GIk?8@ReHXAFLhPdb:\Yi=nABkVI%bR^
kyVN^> 1@GZ*kTCSud//MG1nFwt+NFt/bHP*%RC/$Gpt$aQL&AbFM<aRMJF&N6bNFpKmpLi:c=6<QyyGX=MEd5W
49==*M 5V=1u@*e!Y#**jQNulJ#6G>NtVQkG^RX^?a9LhY!!::TeBn6^VZ*Yht$HalWtZVpHLS#Wc+Rm5hq9St%
ua%m:d ykua=RF&ZldnI85A\<+idS8tBR<@l:P^qac9qccAh!5J4TPS^GVZR/k/9D++BJ+hZ@e*E%dk\aQWD+lQ
@MMcmB <WT$LSbK5yX>GykJ5K&teKhZ+5S>?j9m4Pdm66\m^H$XC\iy&#WI^P^K1#?L>6&cp84MP>BwieG\&%lk
D#Xh$V ?D&cMF?L%N!YYH:%dPWe$ly1/VVJ:p=&hwyINW:hk\>@AituY88/!jZGHu6SJE4eumE>jh:#aH9Tlbc<
RH/%F@ y\uC\E\KIc>hSwq4pHNK%DThYEVJet</EHY6ec^GRS5GCyWAXa9&A$BZ4*MWH^?%1&/QbnDT8t^C!WhJ
L+%dh= QFJVJw:&DJNG^JmhSGkq=^kNXC/?FcN<wECn59!B$*V^c98YPjMT4n*=?5^5wdnc>MyPyB^waCZ5T/J>
#8TeSq +5WG4a&ib<Wc@p=ti&CmlN^<ulSX5L<8HGh#J\D@T%^tJBnVhGGhtY+Nw:/<^aEpXAKmiy%qFI!dcBZP
Pk!PpX #eTmnbmiKVq?ATVkmw\QXMb\VXayAb/eV5\ip?h@wEl6Cy5XPtN=\4#j</LVDihYRbH8qpeA=1L9k^C/
T<@b#p a1GaZJCpW:n?FXe+e>q&IC<nj4jZVKyCbAKX5#GmKl?A>!B\4F#tXVeEIn/*\&TiePH4eKLabZ?PnHH6
$uB6wH 8QT1E:*T=kaj:4aYbRjl+ZkknNT<tNZ4b8ptDn&Ep6e1@uXIK#Zu%Tl&<>SXK?Xy4G$K@qKZeqB+=yle
cdYnA* QKWMb*n=yJ\GaQY?\uCP<CSbTtwVi/yIE9hZ8Myj*i%^=e1!q85XC4=:YyN*q1*q>BNktwT@qEtDa9Qq
&/yWZY ySyAAKm$yQekpc:FAM%DXI*6wlH8yMtk\B8/e$YC<:QJ%ncMNIST4F+Z?<E9<LEd^n=<$pjYjmNMp&in
:A/KXF N@QGTTZS41w&!aWY<&8c:ceW&t8i:jmZ&Z#INAd$FD#+I4ah+Xn:tPB4q6FG*LlJ=WenNctah\Yh#n1q
<8i8hX *F8BYPKqbph8l6J8=4RTynIYKuW1Bl@5Qy5abK9!1m5y&%NQ6FJ9Sq^GN=q>F&LRZt!kwYZV1Z*@NSX^
k#AhyF =8IDRKwPiYdZ51\^N@K%>#6+BtXL4a@kN8FyR@Ni@qCC1t&!:@lap&*LZ+w4%>Kt=FqVb=m?qCam6XZP
>KcwqR Dy?Y!mBwtZFM\%1J9=ad^m>Vh$W/94EC&#Z8:+?1N\\u+nceVY/9nT:R#w?C^K@*!wX?+ZXn&LXREDA5
X@?mSF NqBG/PcF!@6=JhGYLcBJbjDLW6?\A&X?liW*e9X+hk*&cTT9hjA%/lpaX=FWe9uJN:LEm&*El+=RdM%c
CR6GI= :&>LDB$\D\BC4b!D@i!M%d:N6pQYC+^ZK&u^RGN8+Ph9+\nG:HKK#F@TbP469mNu?jt!R+N*y1#M1GDQ
Bjh$?$ y=>?jG#l?l:W8LS6eHaT%9=6=h6KJi%nw*XQm*PIW!hFVhX/PL\\M<@Jb!=/KP^\QB%t#>%ncAX+6@=m
IiX#P% #jumq>&Y!MWyQY=NPiW1&XR1*RSX=eFj/Mw=H+HLH+&e9:A5mQh@Y9PHMBI$4uulNXCy*HXEN!qI?GZp
AE=yQ? \^6+1K/<a>N!mDQq<dE>4iF<?*Kb#:ZY4?H%m6:*G/JWjGBB*F+Kj18aCMtw9Vc6\8NB&8FLM/$@5Ck/
EFth@N p#AZ@mwMT6L!@GVkuZ8T%:p1$=i?6G@::%h#:QB>W8NEAnu^b4jc^y9F?%X<ad:!Z9kqc=>$!%u^%ctW
P6QT:t <@SLG=#$SFNTLECHHHYJ+J$YZ^**%&tMaEyP\N8HkXiimn:$%F$X*\5j#4E^1P1a/IaG$Ve@V*>Kt?ca
/I/>&w %N%NH/+HjNLHndTn#IbP*S4#lS8*^LP*!?yFjG9&:LmHZhmQbDXSVKE1&>@JL15jQmWFC$DAi*dDXHXd
RPX#MW GAG*dR#F\G*wBL%Glj$lDh/NFeRQC@cRJYyCyKeGK9aaX>pMqMNdiQ1LP<YTGZ$uN^D9!!1tREGGAQa!
bBdnKN j$YpSwAqh\h8E%4pjwT9VHVjM6CkupTe?A\hYI5II?=QYdeiu1juwK6nAT8@%^qZYw#iu%wA=&c*e#E\
Dqubd! EH5<NNTXj&byu1^6?5DVcSa6ww*IMAYEGiEJkPeJt5wY+ZI1iK&++&X<kIENlji8Y^5aTt>Wy9kWwwaF
*/9Z=/ b%amle=dwQTCtnacbt+/YJmhiAmbkkP=&q<uENc+PkauJla=c@&F5au^8R<9CuKqXcIPLZKCWm$8SC\R
yii>lP Dl<Xd1NkbPe1SyRq@<VBJ%#$tFIlT6Pj#tVc>CE\d+G>NA:cA46SQqu?*Fe:&Q>R<R*WRTE^C>:H9TKj
$5K=lt cAZm*GyItiAtBQEcBPbJ/FeBmn:4ke:RW+LNVJ6pi*a<+!upLL1!p?$1>t<wWNw*V5iTtVpGJYADte/t
+>npTi ^&>$GER=J!^tJkAyy1y9D4Tl<l/t!yGuc?Lh!>1=S$uI#J\Sde/kaLk+^$?tS1ZZk<RRSV:SqX6=MH&u
Z\j+PJ D8tcbP/d<Q8MuuitGwJuVm^EbPE?dLBqaLBKMhmbkW\@j#wPIe9/qptSni1P9Jehy>5ZYZDSc!kA1yRj
4DK<Na 1nT>wikh&hw1=NwiR+n1h/cC>cFa+CW:<tqVD9y!wp>ZkARii>aPXMVPB\jQDNLpDPMb5nW4/C:IM1mN
:p*LGD %^abXiEeJY6tQKiE<8RG!FpLH!=YElVw4ck4pTmjX%DmTJVmbtMdyhDLt98Jy6We89u#HCwYD#EHTY9t
9@>tR> uDC\!DAtScjpZPm9wbt8SLI5^CGF&L9&?HNpQTpYM!q9By^e\PRWwblJV:KKGG&<bHJp!cNS1REt$1TT
YpijR* XSYLuhGECH:+@Bk*@PBGDM+G@B5eA&SdXH+HXJe:A5LLqBA#:*$6?H5\!W$a1a#*1CbmGa&91HMmk*5R
-AX=$B 000e392ec38001202b4 Page 100 of binaries2.zip
lQGEwe +RYnlIunGR^t8pSi:j6C$@mpRkIcEHKTEZ%S=T4=W6eEB=m/!EY4wLP5cIC$MMBIM!NWiKMii4>yRN!V
bDA1j# XF+!PRRAY6CMEYIZ!<lXJ8SJBlKS^t>SSydYjyMX4nMDQm4HN?\16bL%$kRTVBW<w^5\+IA#$F<!CEFR
SS+WwL qZ@&QS<=NymL&#kN!kpu6FA*eK&ePh?hJ#KN!XG=hh\1/P\VhC$yF^6&\/l\4q?mh*>wA5$18eGKH$K<
+=VLY4 @kD5i*RBwpMLLpba*/B%p4M\?j&VMjJFV?dpkiMA11CG5Y+nD\yJ4kRDTRw8BeT8ichGnhP4wjGuL?Xu
IEEbp= <yLTY6K^MiS!/GwF:DWd*I+*Pyc6&JW?GnuppVF=1k!$1R#CP4dmK5ZhNCF>TybD<?n6<#bXPmQ%NM4&
klZPu1 VCPB4PZ?$FkAB#?ZGLdk4D\#e?h&Q9cu8JMY6pq6T?kCe#9SShS*Bkh=94F/K9pQa*&/w8ewL!G5cj$1
hup/^k +5$EnFF8K6mD8aJJ4eWiLC&4nWWTNVmpZkK&#KklVCFE#GR4VWNuLC4LPNlLwt@ewPAJa%W1?Dcu?F&w
E\NJ>I SJ*d!d6jmt+i!bMhm@n1C=PcWibeT%atp&MuW=&FW%&yW\@XMeadm16cmueDpK?e^P5<JMcQJWtBWDMl
uIadY1 9Ae6#Jl^W5b\hyD6#IA9$5ACE4JyGWkpGe^ttT:SnM&#EJeBaiCajh$$qi9>Y\5*+C/%+6wJY\kGuTY/
taScT+ ZJCb<+lm6lm>t+u8NFwT6a>!1:YRM$T%EWTd4/PZbnGH$/VbiSm6pV&1QD\Q##hTupd18G5MkE4X=XAd
LuK$5@ 8bTW:enKqj*a%cY#WBuHbe>IX#lZkumbPMK/paGma$$FF*FGu8S>#*WaLwZt*6=acCPnK!i4@QcDW$!5
1u?k^d <&CibhFeB$TtJ\Z+BiZZh$p>PwQFBH/F:!EhQdcM=KGhFB6J9H\WLYAM*\Sq$G:eh51!!mI!5^HdHdJ5
T/9ZY? 9NbInjjVj5ie^:PV?Zcd$BnTl/**IW@TQRnc!<NHTQ<Ct6%5^HZQK>+Mb&!a!&qw#$w6PJBhP!FR%uBV
5*5*SB \:>/AlJH>a5^u@ZpuauJk*=TS<Bt8?EkF@AYXuh54M%ZpG#YYcE<kN?Ga%cNH=J<G#JcB*JN5PbC&t>A
TE&P5G $QlM&XWN%R%BkaVXJGd4RI&CJ:t*TB=YM\EJDmba^N>ClDkBk@k\KZ#MGtbQX1i#G\b!1?+cny^4RnSW
$YI*/I m:!+=y5%E=u5I$#i&Y*@YlQh8+n8JNa\DS@JEI#\ne4lEj9/c\mVnEjBNYVApJy^Sc1jnkZ=\@maLnDb
D+8@8* wJKduZ&L@DI9=^W=kkd:HX^QQWTYIt#uFPLcRVV/nS8+iL4+RL!QI4VMN>qtM#Blq++5G^wQl$IQ\eJ?
>RNu5y &C?:b6E\*ilKbZXSPIaaiNpTB=6XI>^WwmmWZn#ehh#P9itIQhtCc?Hh&5W:iApl9jy*6Ilbw^>yE=j9
d<94Ba \NNF4>KlwXjJYyRpc!PN$+GSH@TmR$e4b6%lw?pY$CC+5P6aie#P6F9tAp>!y5H6?cD*=D>Bw=PDb:FY
kyA6L= C#FD%uW:*9TmVZB#KMiS1yMd<%p+F>^Q$5VR5C1wWd*wdqQ%kQ@KiYca/?e6Z1h+4^hdVSBHjQd>mpSp
kQS\ZV e+/@cE#Qq$MmS^c/>kG/m@uP:>STBM\KkCZTp=pTdF41I%VCWTwV^e>l/m5DiA%H9QVKIBny=wca?A>>
y?G!#* M%#M@?jn>qtJ@^\p>T@H:ZQ>RRd:Q<jM@$K+P^j44/B@FuLP^jajwaG@kGduBQ+E#j+4/J<qw8Qm?BW$
L6iym$ &<@RuL?ABnL@DM*%C&k&4y@hMi=jRj<5D^$*</?kj=bwp96ZhI*%b@id?%h$nSZ+M#Vd9^FCCQ\65hq#
a4aKM@ l@\qlJCh=h<MIiVmaQp@GpLIBkd#j*WIIh4jyDY#jK<&+WyhpQGPVR/cM\JQ!tbP\5&hJCXDk4Hi#EMi
/Pmipt GRTA<LBPCd6/H*eAD1bR%D?AnkCtwNIE8eHtIVCpKHw=cy=dypVnRZTkNEE:HaeuNcGBFVc\wyZ8FNk6
yX!^A! FiQ&qh:a5Kqwu!1RS+HW\+teXcdRW6K9qD$WRNiwR5u&kLF6QDW5iTK\R9*hFRS\e?9BH<1R%?pwat?I
cwR#Kk dDTeE^D<Ip/Wqm5h%nQ+ZVJeatC6@8JFW4KVH1i$aj9Gb^T=n6WWlT$BS6ECKiA^Dc14YdWk#JSJD>ER
QSRD#? wXKwc**56IVWX=p!Y%Meel1\+LKQaamwjB?&L&mBw@S?IADnn=SnLLEiSMM51DWLq6VcdTJc+uCF&81!
<k6^8t \%9i>NW=C=d$q6wI%IQ=*G=^*X+w%69&qK9RHIu*\GXX!YZ/VcA/@aiwW+EW!d6\nCiwm%WBlij?Gd>:
!Y6mZ: qbP\nDE>e+aV$B@9qY5N5d!59ZjiVjR6qn*iWN&jb88hZJGtSnepXR^jM#EqQ/?$A\iFniLyqXRtcCI^
9SNwm& p?#PBF9FMM<*RMVQ>KYRjR*KKWiqnd\>=b*!Cy!hYi$WPw=1ZR$?>X+JHGVnKee!RbFZ=nch9\h^*iTY
S8$?+k =JheN^*1AeTe54#:n+K>cRQ6P6IZ$%eJ?ZR/tERYp>=jQ+:L41:bM*kJuAlI*Z:V9<L=Xlq$!9InA1H?
VEyP^u C5:X*Dl9FGI?QMRwREybLind^&SWS@5#/A<kkQww$%M$^qPJkejD^&%im+!*aZKEZDq<Jt+%+XC9aL/q
#h@ueG EYl=lY#*F<u^Tl9Xde6kAw8KKp@=&ATmH%4^p8Lpy&Ji@LnV4$\Gk^9n&ky1\>S4J*8&<bVRc1KTwA1y
Z:qKm@ Cw5uuHCKL=kT?@WEyJalu5+KlT%R9u&<>Q:RX1jnM*&X+W4Zj<A!H$$RZFk<q:al6*XKW:b9M?jJqTH9
5hLkcj Se1lhQH1I<L^\j6^Eq*QP/1la*pPHlF%H?Wl66j/=w>jX6IMPbQd<4P%?#Hl<9iHnn*!cai^Wpp&?T@E
ZHbK$% TB6:qlQmFTMcK9AZq!R<5qaZl&1danetTla^6b4::e%yHXmnP!#bRJN5QHLbVVLX%yZqM$=\/q95SWuJ
1EF1:b AejJTh5DF%y\4=/YnKL*CX?H49C/Zi\WW+66/H$XMn^+NN=AY!+BAV#PZRbSpp=eitcwc88u:ewa#RIw
1HL&QM uF%WA!PStat%bYk\6**d^nHjiL/b!R5<MJkTe=VB\EtR1=6eypQSmqhJLdj<^M1<cJ?WQnT/Zc/RQ5w&
9DYJwn 6N=XdS%%19Dblib%#phiFc#aciHE6c?D&=@pVlC4haFqc*H$lIWF^$<Ju@nN:?c*k#J$Q6WG!d:nYWEw
uldL#^ $yCMWE1<uGc6TYBEMucDQD:?+Fw8iPBY5>@II%?Mu1k<Jhn\$A/NXG&y1Vl>$mWF6GiWH/eaV:#tNwqN
:lEu>? V/<yGF4J<TF6EkN\T1QayXD/nXVV##W+Yd=JLGW4R&$4SSYWH$LB%d\=/<\\d1^4uTFLQPl/PmaJ6JdA
qhD/*B DmVBKN9kj1pjH$IlkbYN&hXW=kIL!?^l4^wc5n>J95HqcabMnqD?YWVp&*ZQYFw&iJV>>4H!mmnLiT!H
YQ&AbJ >Hup6u&V$ktPW4:iVVtQCqR*PjNh/PcI5eSM?De$?6e^pc8l$Xnck1K#ydVWAp\JCGNSPVK+ph>Ebm6t
bFaZ:k !w4i1eCu!8%B4<Dq<nNEw>m&1JC@%<1WcWnWI%Ka6uQbEGw%dcbhdyR5%XhZ*<N<l/Q$6uBj^c4SM&I8
V>$=4T 1pTQjTu95LP4Gqy#QiR%Gibp?/Fhl$&19dV1LtmK@#:\\@+k!1&>Kyy$hV?>pVRhQi8nEdHGwiw6?jK:
586ntR 4/^V+&Kl&*cGF#eFRZF6%ZMeW8<p<*#K\5mQ#<=VGnAQk!WKNaH6u==T!qaG8:nGm+\E%eF\@L+ZJ=RT
Sw/VB: RSNjHJLNF?Z8Vq?qdDcG8NkcphjDS\jE+AWV#c=@H%^h=/hbu/ak%ImV=:Fi5p!M@TJp!XjN*4d%Rw9k
JnPFtR $Wm8i:Dc$59^:cQypTqL\WhZ6^KLKb*k$EBmVw\^WZ/WRPF=meqTqmV^PVPhNL?*V4F<L4FdihX<8?HD
JGZ#lI 9TtW&RlmC+1IHFN&L5h\yuyM\+9leNVlQA?IhTH9kFq9A\8:%?jdWYcSkqIitp4=/&jtNEakE^X4!Kjw
t:Nqpc VbQ:SpeWmSViM<L6^/^P<tCGW:SN5F5Q?4>QK8Yqau\X8um/9$^eYiDu?Zc6NL//Jba!VtIPppXH\w^l
ZhIM!c NqiNyY6D<$8/\5GqPmB\X>iFJp>uqVL@SbI4!^8CG9tcJJl9eTw#SkY:Ih5>/DV#EI<TEt<dQ:XP8Mw$
mNpKZi y$yS/G5KmX%46lKnDcZHFl4MF1/1Q?wQ+%p^DF:5bN8@dK9YlWQ\\bcMt=RAAV!>p+\*X=Ei9n^ih##$
>yT4I% :ZX<W>dXH@bi=u#w$@GiwcnA8QQXp&M!aba@h%lnTHmb=GESM!6^56^YD?D*NAhNJ?q?jj%T9a51Pp9L
Z/$>Bt *$pCq\R@wZXk8i$>w<@DtYuHR@+\CGC#L:D%+P:K>H$1<>#Zjy+R#E?8yYWcBJBpPJ:u!LB+1wV9XFPn
EHF/!y elin5/e:K9YldK=ycJ1ii8tmy<B*nDRcNtk%=niX+GPIcHHRJcb$8aSjCAJ<!nABAbTb:wC*=5/YL%iK
y?>1jW 1YPZ9?K51$im$auTntGt?5IwEFDMR?WuNFSm>cZjPH/GaGnQjnqTKWXI/NlK5/EtM/9YTBAjQ8<&cutQ
NI@9EK @HW*hn9*W#B8AZG4/+EkL1u>:T$IEL:=JN5jLN%4=QbTPQdXl=Dl@GWlW%8*^anN51wRM+iGwbkHY19?
GwPlt^ k^H\B#Z!n#=W<EChyj*F4!e:4L&8aC+Pb<NwCbyPph#EpW\lal+$qeFe:\IcMm<TPS</mi:+tp\!V>p4
klJw%D H\^q+a4/#B4RAJy6XW^aSuq#JkSYjM<hPyMpanNalHPu1<YRy@#89W55G>+Lbl#@eqdyMKGSYFWXV*St
:/9\KX &@4b:Fp:?4J4$%qDHZe#CSTIBDiQYCEhW/E1%ePy>q6nH/@KcR$RwCG<+<KPuyW+#kqGlYjCi=^mPBJ&
MET/Ac !%6<==ZT1:GC4EiCN%&chh6%e?\iJBqKhyE^Etc/hVJQWakB@c@pqQZ:5T:GH^^hwt/HtS:G8^Eq=R9M
4%N&IR @dLD!hAq<RX+ZAY&DHm@S\lDI>ubQ4JN#>HnjZwc+^Z@%D#nMt^>&KT?w8PQjm?>*Ku?>W*YRSQ?1MD=
\=?lb+ =:ducaV*lkn8#9lyPRm\\!pGA4VEdn#yQK%*:LA8QYW#PFC&a/=cqkHa!NlEcRbD$AWX5InR5ycuG/ni
Cec$NW IRa8DN9yZ!*dMbIEF%%FjNcZLFR+GR4FiGmhc\dNj6V^H6JPAAFKuWGA\d&#A@%9?RKdpK5XjGC&TL%y
V&b%AF 9Nw4Mm>ah$$?FL%eNMy1p=*b&t$ZYb?8FJAYMynkkuMtmNNn&ha<8l$ttNGeqTldSTGWmJREkkDjcpe!
M1j4K/ D=/FyM^EQMtyd=1qdG^N=J4MFme5#8I#ka^Iwj8&4q=K\GQd=wauFH1!5c>L#6IMn$qL=w5uBaN6n9nh
WKSKj4 D5ycEbu%B5LKle/bVGbj4!5nN:XY<iWkN@HjKFlNpHJRLnnK>Aj!tlai&:EW4IhT4BEF^AVJX<V:?^tm
Y5=H\+ \9mF:YJZ9G<jla?#W%j$Zp%l9*kB1@p<\1tpquVABmkmjZqL!M*i6cS\J+Q@bID!pKHL19A6hj/J8aDE
8BpJ@Q \^L18t#8DT$l:p!8L>nCN+IQYC@FMc&V!CTuWte4VGXpAw*&ChV*Z^D#//?\C5MH$jVqCwDt+n*i!CW&
4lP@>6 iLb?kPjQLhGJ%i8ji<*4N>4Wj?P8WmDFnJJ\d\WC*E\tQeu%?y=8M&89!yb*=yW5*!9HMN:T9W/Vdb/1
+=yhXp <E>mReQD6ZkybT@#LS%&m^a@Cy$*QMVmVE>dZ^jBRuyjI*m/yqG!EE#qG:%CL*:Sa5dL11XlkjQiKaFN
-A!Xae 00057f92e1e001202b4 Page 101 of binaries2.zip
hc/@&5 ?w=LAWRYDw^e#+dai\!$*6V$lHkZ=H461Xd:^mq4wqtkVnNW:&\4!$!BMdqGR:blCqG\epCGGmWulHja
Gla\LK Zn:%Y#MKHSqHQt9MLmB/L>GC?Aa*4Ze5enhC&:PqIeAj9>b+ItjJ5Ht/Z*$!h6H@Z5^I6:%SMPhAKbpu
i6Jc\$ E?d^atdbm<Q6p$a5WV?!qeD1ZMeb1@eZec8wd>iXD+mbN$4BEydkB&Eq@D%<e>ANX=6RRwmHXKT9yZke
ch5uW/ ^$H#B<w6\BB/DVV\pn&%J&KS<!eNpi>eR:>BW*MjH/&jq\bWn@EGF9T&G$tKcahKF#Nac4=HSWyc6N!T
My^?Wm Y@NJpdDS=Q*^Nh1<:nWCn^y>ba+pJj!yGRt\t$>>LQmqZHbd>dE!!SkH6SSh>%ch5bp%HmPd*wq\FB=D
M<qpIp !l9k5X#9YeEqThS+<wwj&uFL@pD+9=HA4AkE<NaGAVwHRRBVHH@%cM4Ci:pK$6$>jG>=bqZFy9h1HpVh
cE!8MV YEJhZB8e&GNpm1Enqh4ICb6ePAi@FSblEMqXq^nPB<>NhI$Y?djF+aIt>1?JVk@%d*EFnuLSy&*L/$:L
pB4Wea a^#^$%wDt\%iwiauwBcXNn?GZ9j1j:C$=G?XwIPtIW*Ml5ewpe+k^MuM66<$BRFIX=>KN$hlmWi6SS1@
b#H%D@ ^D$N5TDkT:y<y>PSbN!puQ$!8/!K?uBDT$D$#V\T>uhX@#jNNyCVHtKRH4LGbdVh%AyA!PpkEhGPXIpJ
<PI%MW iGYhTBpL4cFe?nduk6kZ=u9M//c4891*P6#pnTFj!#jw^@FakN18yqRN>5Xc*5Q$SBiWAuiFuDNqHh8J
!/T1D= KHeaSA@VcRj1?ljDMA<lWW?Yw>h$VHitjp?m@TAAeBe$tj\wQj!pbRAC^LCAAKQe:juQ:cP9<l=Ij4b?
bdP1iA /c9KNTBAw1dAq1#*yj!@ZQ4PjWLTR<*u=@+!@lH^@?=9K?LCX=K^j5q#eaGQ+JHj?GE:pk^iKeXT/M#H
mLAm=5 IYNZT!^/*DyuKa\>EewpA%M4uFZGHu<=i\8%<qSQ+8mBL$#FSlul5HW?%J1JThR&L%b6ud$+WDB$kG#H
1cWZSJ JE6=wQhR?9&+4w&Ghm=%^BYCYlMh@5RTcy&q4M%I9dqmCT<$@:=IZi!tRqYpe1pqABM/I@^h@*%V$1>%
j**^n! %6V@Yte=$lW^MB!hXKCQLdR^6+YM+i\Qi11HeuTh8=yj!\!TNhTt/ql$a&pcb^qyjQJEjh^9^#=wDKPM
DRMK44 eydSJNP51E9l/19&/c$MWL6qWZ+FhqM%LAMCwL?Qcql@w6ney!KTiiD9Tljn84^6j##Vj#lc@ZaFA1\*
1tkKhM y#&=&Z?@>#=dHkWBiDpjH\X8:e^AkI>yV$?bD=^5*tQQZ*54QPGukKdnRIDj#ny&u*@W<V#ZRSyb9c#%
>>kuaF Zu&&awE:>uhjPp:*RaB8b<=jK=+FF\VwthG@p@LiLd^%Q89^@qPyj4?X?9t*W6h?qA4b?$T=%uH^LEeX
=:Ybpq CID5iQ><M*/6:uHR#Q?W<Ab9^<<=<:!*!jc<P*+I$dZ**ISqelAk5q@w^45:@9C:JwImCID/V8th>^Vj
$iXtRH ?&44@pPm4E?M:%5euyiV:W\1Cj!$D\V:+&5XQ&Nm=j+XH?@QKT/+j<ZJ?&N9<^?nPj+n>K<+ihq?SynA
KVPu/E @T6P*l?d*9<a#j$jwDtbj<ZJ!<4N<SQ$L#q=kb\@Rj@TA+YjPJk=thq?!T*@M#V\Q=Ke@V?+*=#MHH>I
QGbVC6 W5HC@R>pMQ<1TRWdF<h#6S#ERFb8anb&4q@a^5@J#Qu@RyIKXw:@I1qk=RV?Wl8+@6>HW5HK@q<pFV?c
PSdRte <m6N+Q+:NwY@/NM@bXQk=Q\dNkZYQ&BV+GSl@wNkem+Yq9<d/K$DN&L*FSNkTWe?KEy>W5X/pRAL*i$l
d##9?8 /!6GHmi?:VTl84eJ?\FQFM&m^%1WC$>mm=ZH^Ecu%B?4B@4k!m/QESjJwMyBeaNjAB<btmeGMGQbn!hy
=SmVC5 G45uJG/at11?yyI5l8/6ekpL:SLnMJ@FqaEE\+GiL+lF8KuIVXBT!FySGamT$\IqeDDeX@%Bl41kKZBh
LudQaR eLpZ$W?Y5L*Cn$8R8WJGe=pXEpHRDAeKQQcp>*M8AS5/FIRMJm<W5\%=4*BZPq@>=\?m58*qNuTE4XCq
*l5qL> ihdIAXY*m1RS%Z\5L/Dw*SiGYAiV\@EKV5qiSbZSynI9E>5T/?LYC=W\b:cZlQyu%R=%GqQDS^QA>=ZJ
&5JZk= EC9Gq<NBEJKPMd9E+pJB=G\$Xu!PF!Jt?m^+Th+D+c+mYFW1i!e!98t:nCpCq44AQVu5Q5qdWYhK#D%8
1mmYC? KMwEE<nYna+hlHt&L#ND4:&11AAG/KjIm=GNp^I@%J\ZX8q!V<T5?PCTQQ^B!L$w5<%!?kpueN*HDyYy
JBhW4N bqECCB8HPY$yBCdaDAFFtnW#\mc:tdkIJKt!\PYW+@Z<pQ8=%Ge8G?p6B!1HBwRNQuR^6WXXa&VP6M6Z
1XiC>I P+#k:!PGkD!!BnBAjF1E\6RDK9I*RWFKj@CFq1#\CB?:@SY:Ah&1>9pK=qqnGhkFj*m:\\+1LVhcBqwD
nc5B5H %yc8#+&MaYKM*GCyI5^4<PqDqbZTY<6$\ZTC%1nV+K:InTFAZpI1&QXbFPZ85uKjXGqeSW!<\8#AF?Bj
mtP:^Q yBiKLh4QwP*b/XD<q!AD\CXHWFGA#D4RphqREt\BtP\^C1Ju:+MclZL#+1AuELTZYm9wbI@ci^Cq>^5a
yVb*9= bh<jN$ppTA1!DyVKEDL*!ukqN1+ka5tR#9GXE9TiLc8b%M%W>V#!qcNcDI>P/MI15mC**y^?eYb4CG!*
jCuA4E d:%ja#:^^BFceW%49=PhI&QMyi^M:iI6d:Gcpp?*\YDq6P\M:jPpFWKkX*6*HTq@V1A8w*15ij/S<AmV
W%9?il 8VVQ9TMCbHQBA5ZPkHTPkwi1mK%+dTPj6cw5>T:$ZAGGZVE9M^^THc15y>XF@lGLXkCSbJt=eJw\cycu
SVy+y1 Xlq5MqDRSdEIM/:t9Xn>Pj?bWVAJkBy^u:!@nZpqS6cK&p%!h1maT4ZapJZ+k?%/MTZyqLm5>Y9QIpAc
?>&aj$ j&DVjMbB6KkX%/y9eQJPF5a16QVpjW?i=:qKn@IHiEP+hm4wDKJ%T*i=&:4CAMbkA4y$5i*4:ECVYD%<
^lyFGn y&IucudTqukJZC^J!$mcNW+t<N86uMP*Ktn4/u%J!Le^4QtMR\qCTXP4GB9hiR\HEdP?kAQ<QFIcyMnB
IZRWlq JZEDFV\EpZVSC#!iZtMW!pp8!/mDipR^D@SDMuwI1Q\K>TVBBZ!I+YFNMEW5LKM1SH!Ch4wn9hyE#WHM
SI*tN* tTGl$LF!8Q!8lY&lYEp9nJhTXLtRjtw+dC\H6?*Fc@=BYY*#WGnNay!cpFFk<Ynykn=e&h9pPV1=AZcZ
C@WKy: u:P:p=D*%4W5@XpnHWp+^ZF&SePbycWyPV*K6M%/%qTtlidqTi>aCRmGSVG&6!a&6tFN4Ky6y$p>Z:FD
e9\68b kEYj&*>kCeapd@#MaYnFtW1eLhN5L9q%5mXYjS?1W$=1FEGJJ#%hbdCV:kKNCj/MYjdw:mnl#CKXXJcT
yD9T8Y =d#FXtqnHwBJG!SBCTe&1NmXd?RWyR+9lWYHbR%>ELeh=yA6!$q?pJ$Qb8<j<FSSVQMIc?!EyE#>Sa=#
N\THh$ //qR#hVF%iI<i^c?Sth6<:$m5CG$ieBRY#ZbMMDlw^4&WNi8yc9HP*a^XB\6#IKQeh>K4PJ=BEV^<FeH
MA<AMu @cAAVcnAJAqh%Y6dL+1uVECJ#+L$!Pimi6l:$TR@:nRQB\iZ/\9PWwhVuVdD/wn1#WbM8:%6K#\wJnnS
lS5wu4 TSm9C><QH?\?CQcBB\ut?hH4%YV=5ty>i+h+jN$9+YDBF+VRWyltZj+8Wp!>lcb49j^4bCMHNY8dwCCP
>K?e*T H:Yb?@bmcJPqT!MPVVydu<<TlNyM*?mZIp?H>J8KY6*QGmGbHHt&4lk>+M%Je+l/awy#VF5>1k9+WAbd
FTK!mW eQ:yF%*hl4\wS9S!#T^t4%!F1kYMc!$tKuLiD*T1WIBJ8Q8uFPkPc^p#R+$M+JZFCa@By=y\l/Rc?aa5
HQm/dN CSMV9EC8&FpqMdj^5:R8ha1&HC6yVT#?iJFpaW?:$WqjedV%&AGFHeAuN^^p4RC9SCWh+LM4FlM&Z/I9
wQmLHd k$6GW5B&$*me#CcHFE61MqEWc+qt\jVNZJVM?p:qqFZKCm\AcY<?EM@t>i6ED^?e#/nuMJkV45kYdSHC
w=?NMa YWK8YFIjqLY#?YR>:ZNeFt\a11+N<l/&l1c/%AhwLBqjKq>Hn&jjDFLhbM%\lh>E<>n^YQd5k@5EcX*K
\GX6Lq cXdPP/yTBjBT$eF@>Gdl?K#hQ>lwcbTM!P#WwS+MQaQG>WbFdc^6*qRYj#p%1lIIJ1h^WA$D#EqY6SXS
$BClM4 ?q#/Rw5kqtwbQ<%Gp=&qjyKH$6ZX4qw6TTtX<iKDd^Y\5jVaRqHhY99%1ZKYH&\a8kdqCM5/ikqNpwbS
*t$qdu R8>!Gc>/*$W?SEM?W1uKuNZdWi*8#*TI8G1<in^Yin8bT6A*T88VV!KwkynH/mC9<\@IScm4E=nj?IiH
+#aaK+ Cn%=&kMMiG#1KutQ&/kJa#wTi8$Q<!9G:X\8P+<TTty$@BIhIm^euwhVchRu+uKp$J1Xuw+9DDpHCqtK
t556Ru B1ww:>R=+GPk4\%PFup!pK>h5$6kejQTm6=wVJPCDqX/=PEtScF9dae^J8#SZyiL!5/TeEJc!E=$<+<1
b&lmlY m%a@wqNhIckW5ZqL*/@jp1+atJ$&JKI5SlSVGARndHcht!H$DW1m6hVu15:6aa^/>A=IDmpRNCDRVYJh
6Z@>mW 95\PS:NY*y6Y?S/Gk<p#RA%utKmdR!G=n>FFGeZ6^RZ>EWhj>t%D8Z4hB<!ZaH/Eut4*anB6DY=uP4K9
XwRj*1 1MZhtLwm1eZdF!yLG8lV:c!cR4P/yM!QI9bWtTY\!+l:dQ5C/$mjZEZQRpKmpRHDECG^%WHRnkbNWAnc
yGl&cW 6LaAnm\L/C+dWHAkHRN$54V@1hHR%dm!E**jyBkjhNnMDX\<NLP!ASpjJ<WBhQeq+NCMw:?KQ15Jm1aJ
yIePe< &qy#LwVkM+TpX5DAy5k?NHQ!SEAChKemiZt!KLJpZnC>MkJ&Ii!CF&YkZ<>:S9FAyd+%u&Dm9L^aB15Y
Dj8I4# Bm5nqTG#uD\<H\lC@/AAbLm?$MIVC+P6^YAk$wGLA?DEd*VN6+l=BZXMQK6Q9PwCCqJ#&tkD&9\S!cBL
CM:@6Y 4ZMXYR\!INI5wm>4X/bK4IRj^kR9kBG##baVFd:GQ5@1R+uu<XEkhMYYXmB#MNQNSHpp*b4b=6b!jKS$
4QpwN@ anEREpcWaS<^\byAnTW?p/F5l&I6DkJTAjbtPwR9HndXRKptXuw9CJ=^9Y8q6LyHcE5\4uVLTZAlRcu:
LcHRy/ bhmJ6%LDpm%QuRW5JKAt!<yPATECq%\<1nyiHT$ZZ/uLV1pB8ZAQ1mARKRRJFn1\cSiISQP/\MDE&b@b
Rd\X6^ LkVenW/:j4i5!H>PFnaY/X^ShiI4XyCJ?1/+iLXFDq$#/pF/T%><\VuRD%$?$y>QbWwGei<%JGAqkHuF
DdREtV K>k8lh\T!=@=QdwMt8KDV:WSa=/XiJEK^WWCqnpA/X^XDHZ5\9^l+>!L1wdS:K\b&6yML1lJdlR=yGJS
A>4Tlm cheE9q>X1EVY^Xy%I^IQPcKkYQyK5YKKYaV\$Bc9Z4B9&dbGcaN<X/tpct!YKE!%c6>pyldVVS=HJW?#
!nuS6n Vw^uQa!%PHyGpSG#JnIJNT>cudGyEw1FnXF:VX/DKHdS%S@EHChBF@^iqj\#NGW>GHN!CHWK5ku%KG#c
QbdtnR !!%bB<CeR>XV%Q/NInu=6wV+ME9/J+Y8l?F:$YyNMXElnpL=:ePb#Q:RkPyXLw\TqTqYBuQTn#JPD!!e
X@XL@W lQ9c%VE4mPHL<YIR>IimXj+19Bmh#kQ^ZpN!ZLJV\6Su!qL+ZM#u@FQaDJiNL/9XG<t=IttZtiZ:E1GM
-AkZKS 000d22bfa50001202b4 Page 102 of binaries2.zip
AbBNtH ?iP<kwKTN&F!aKkK+bRFeM#1!WYZX\6HpYlPFNAD*Rck*$&+m%hDWdIGIl95WkL/MhkAZp4&*CmBZqPX
ScWR$/ 6BctKDZFtIWThGJ<Rw=cTBhNV/QBdEaiWF$TkIptYhT&/dLWL:5n!l6:JX6ZHYH8m5R&bhSh#4+ZwRby
yat@Jj %D%EWpZ11SKnMk/WDqB8/?i<tHq+@uGMl=K\H+1@\RhED#npEc6w9*W&cBCFb=BNFdIiG>tVXT$4tVp5
R6GPLL /Rm4R8\eXlSic&P>!n@QEc14lJq=C^BJJwMEB$+adNbFRIj+DBccyEik8#m*1A^Tj#4$eh1EFAXM#Tuh
B6FHGe cw^P!uZ^cVEJ$PX+tctT*$@%!Dq$enKKj8p=YI>>lIqXa&ihe9dJYDqWw>ytJyWj1lpd&#tpAEctn%Lw
@lGRqV d985w5YB^!9:K^/kQ%^5%R98c=bekl$%A=EjkhJ*+6Mbi%dhPpNDw8eTill:8hIZ!QbWe5TKCI!YYtyD
?VcR<c F^Z4L!J*Z%!?QnqDL=JNSVSXbDBaPji*^ekuJ=XRE+YLb/TR6l^n=M>4+8\8XGj6%BcFBkYWTt?TAbC5
4GJiJt VJtaPhDi9Cl?V%Q6b/BK\&G!@GX*RHEeH:NHe<T8=!#AqHnP/HTCpNSS>pllFk%bY6FlE:N#d/M@?W/<
^neq8k :LPQJcCk&SVL4EmmE1G@IaVKXEL=K@KYEp$h9:kTG<Z5wu$%G!Zek%4YQmY51E<w1c?T1PJPIFLYptd@
&%Hq4i SH*?ndFdm9=+Hu&%FQW&FYa\Q?JcN%1ymnX&Z*X@4$mQ6d&TI?biCTTcbG:XRbAnG$&NC8cWF8dwJ6b=
q$*d!9 N$*l1uk*EYaabEbD6S$WiX&a4AJ/4Qi=HCW<n:8JXbAnA/XdI?%Nm+<CHXpQRFDSElF&$:u\Kk1CWE\b
ZKK:*8 5aac$n6<bYpQPM\cGy5uu^=>VnK8R\m9G&l?yR1@d#k1*hdw/TeBd&G&+&k4ypSPkSjpu%B?y<VbmMj^
*P%hYc \88Ft>CWm6jcyd9@$%h1PA>IbhG8@jeSt!SBa^ZSI#=J%h+c:>=l+mSbi61mK5ApDRnN6/1mW49Ep94+
N8$BiZ HnGG+HqJJq8a&:/n%aM:e+<hAL%bY^d8Cb@1WjC6*Zm!$9P4iIqWTCa\ml@\at^dYqeN61\&9Mu:&=\h
YmhBtn \$^/9Z!e$\91^m5*bVd@jkuP\85Q#5Fld*Kc#lb>NPdjteMIWkbb>Q1\$aP#=Tc#=LnjW@SBh+8Rdk>$
^uGSEJ G%mShZZ^tm/AmZ$qQZ6N4a\dLmkWBm=L6YbBjwTu%u$E6ScLXHeG/:Nm$8i5DI:KJC\NR<1l/>:P%S$6
4lH+6? Zadc:heEJ9^AFjkmPutuy@8Kq^54QPiKp&66@wkn%Cwm%4mP*heq%K\/=6kd+\8jwYb@QM:VlBa!<Lbb
>:5\t* lc8HuJ5mQEWpIaYRVLTB:\:><<IVj*e$y\h:hN?LSG//iCdPTA@mdk?K=BVLyKcPPG/EmB#y448WBC%e
W%EhQS 1C<^<e&85Tut1R8VKdmP<X>C$yyjyB%^pL5*y&mlY<MWynVn<Gk=pY9=JiA1jP^=bec>ue1hFMP>@JG5
EbLIA8 MQ%8N!/qPDPqnY4pi!^8d\#*aP\mW4SHh=1HcWL#>?#@H*69HSjZp1/NN6a+\b%AeNeGGpq\h*h*h\JE
6Fc\ka eHj*+P+8Idm:B\@8dmGE\M&itV$#i$?an*Qtu8@i?@%8@$FZh@NW9dZY5$yi1!chGK=b:8Rq*a&#JJmB
kQ%>Ml dK:A#GRetCcwKB9QuHt$tBSY:9NQGcS<KSw<Ke&CZIJ9e9$H54mc5nXKC/?b58cc<lhpp4LSCnVN5y6t
EiwlcI ayLuE:$\8VeeN>^jFN\clPZ%lZJq=VX>#eN*=KeQ#EuS!6TWm:$XqL:=pyj!:pMKY!q8Zha*8T^Db+*d
Q/Xu#< 4uS<l5IFqyV8Sm5<cY%D!ZT89cJ%b>NPyh!Wp/IFkdDtuXV8l:\F&PJ=:Jh8VSWLiqtcDqZk4aKWw1yi
V8In+L uA?LyKBDlyIepWIAb11kwwh:dJIY?+ii96mQRlW<WBXG5HuJuCq9^MwFh@Kc$dL^B?1lK:Kd?<wE$VAY
dqjtVP :ewYR5m=I&6<DCZG!m&:Jq@m1+ZQ%RKBqd&pGW4w*jRqPe1b<mi=@5>1I9a:N&?Aj8&D81W?K*uCy+/M
K$Eky# Qt1wL+t56Cw1w#TMEaD6?l+Z?pG=RQ1!Y/de$!4uP^cjHju4!5cLSpbqc?XmlJt/T/:%GA%DZ8tneH4c
P&R$C1 IQ4Mjpa/*DWy^14RRhjiAJkDVT8w$9ciJD4wX=ewQM$pCmJZw&<l%&h>JKZC**#/?MX&XS=8LJltcF>l
ZJGKSj XHcdLlK@hwtVqB5Y6GpEFZe<bCCHTYNy9QTF1q9Ib+H=qB^y<@q5m5hG%?XWddVF>?TPKyCTCpJJLu>c
GHSTHw c8&5n%Kj<!ah+Y5Vlnj\LcImk1IqbHE5NlalZym@h8QubGH=u*jnF@*bCD8I+&p?@TCT9*p6@%h>?nqb
9wX=y6 YQ>:8jk=&Xn?JSe@J^9#j!pZQ?jjK9=b+Q!>AQ=n=9*j6bJ@%ui!@K9&@1>hiWwwAmeL/Aqw>pjS:Q<S
6*B5Wt t8My/EeTXHP!eD+F@Wk+ACeL?AqwEQkS8\ML%%QR:I@aiqmbu+Jti\#N<kV$w<a>VqdYJ<A=H#p5kbQ%
D#?C^n TYSnjiTG5+L?I@SV!Md^1PRe@=Q=#EE@l/*j<ytD&Ftia1Nk=j^@MJE&P^j#*@KYQ<ti\k4?j!/SNn5u
d5lujD %%<Tcj<t<qNE@dQy=*h?@D9V#>>#b@@F>MQB@A9VD>59VD?5+H>Pdj*@=^H/H<\nSQkj=BF1CcRS6\^n
QcZHYL NM!BllGMGyhuBE1/KhIm!=*cpXQT!q5Tml<t&hal?JDV+\/YBtH&?Hj+<CDXIE*L:4NFL?d9n6tYt4%1
#mc#de M1^Wa98+FtZ@JiK+ejCA/kY@Dmq98?IEYZYJ9ZWW!=D!d8?IqjE!9Y#X@n!Z$kWBA&>V&K4%cdNBcyXc
QnRMkV R>Y+QDeMk#p@N#JKt8kpiSd@nucVph51=5^Xq/??1yDd5l/ZWiaK194Xt#I6WXqp?>tbWVeqLbV+=Vhk
$6YDW< XX9%@6EJG#jn8RljPAEeD5bK<*HpDe8=$bq%8kK%*kqlCa^iuEu&q/1CPRWmhZIW6JqVwihiJcQwbcK>
J8B+i! qKhq+4&DqXP5#BEJ!9caDd:cy5FcS%C=W*NH+iu1T%QjK?ht!*NK5Y8ll5*mb1>l>8^/5h&$HBZhqH6a
N=&t%5 Z/y:tSQ\a!nQB$?j?19CeDuihWuBVZjPNhB$XDwAqNd<lVlG#q<^!AXIq+M\+XuT6QGc\=W?yiyN^G48
ZK!jIl GWCqN=?ye^^b#m//l9jydTWR8Sly+I%1^C>=t:VXN<$1CdR6jZV!hX1%iYjm/wh6+t>w\E1@nX8<S^pb
wH#Abl PJw%/Fqy8BbK4M!TNH#l=F@&$l56\yZZwEZ+6d^CKmeI4DAwN94chN+bSYhyS>$k*tTSB<*ZA:9*PdHL
6YbF&u Eyed5?de1wKjVedM8yiT!Hi&cdEDnlhAL49#DTT*1W$bQ9J^><S++%FSFFLj:b8I#L&%M\J4:bKJYD=Q
%4NJqG &tYMlp*Vd!6KCn^n!J5qXN^=ppb<bDR8Cm@$>XM^wtNq\6Q&<DbFc&a4caCYDIJAHQ*>eKhRGImk$?iW
F*SPNp :/&q%?R$/aq\K*\VZLIEqqXq=YhVlA!@jYq=FXC^k51P+ZQ^?bIdB1JDG\wLt$kn6ThIAZM/RH:>c\i@
!BX<!\ T=BA?%HNXSPcT6hZhnFw:pA+!JJ%cyLARAM?pT$aBKll/aAJte/$YQ:e=XAFe@:jDnu6uFJ9bPbH=l*&
GuHBhK M=b%TDb!i&?L6bpC+G>R>hlE56KidaDT4FNyZuaMcWGqu4Hinq<jX:PP\?TCEl<d#R*u5tw@=PnTJmLI
KVJyth >qH6hXRV@+yI4nNM#<FK+#lRp:C!JqthmIl6MDVAkBaP*i^I%#@PMCjhVCt5Eay8$E$Kjm=I6t>HblM?
<Q4pd+ &:#JeVJ<!M\=*CQAJ8a/MuL^uh9/GI>61@>ddllQG85>F9/FAE@t>$Cnei4X#u+J8Q!cjl%Jil/<L5M6
46i4dk a44PhD6$YF/uV+J+:tPcP\1NSKL&SNTkXTCI@IR*#kDD=A%9N58/FTR<$6m5DTpK9^hH\NXtGQZ\=<nw
Bneq^Q d>Q%XP4yY4S81ijy/<Ne/9W!AEjppmJZinHR$keKCJ+bhK#W%T@$cwm#iuTHtC>4QhyGiCBX>yB>85!G
1Q9tdR N?I@:t66%$W#4Y+nRpC=&yi+JyMabp8L*:AD8?ESYEAHJLqRP4+YY+!<PiXbH%w$pL$dq\X^>SCMl8p>
AdCGmS aPE+kEpy1$mZwi<QpB*X^5%hP1Al6ENj/6AIaYF+8#mT!E5Ehck!It*mP:K>/H^DBlYVHhH^ERVw^Zw^
&hkc+C dl+GWjhBCp:+PpdjWStXIX<\!nThHdNhw#QLTatTPycdqMQM&<pc8K&mpFhDaMMISukJ*X$*i:Hp+\*n
Lj\Gj# CM#%c5iaPp^DElBm/G/@+w1^iD$$5\de/1BaMZ\@NyS<T=**jDqVQ^j6iFYT\cA\*&iDn$weV^w?$+9B
Y=mnnk j#IJD$:ISMtT>l8Ye$J<S!E:DaZy*kw@Q\Ee9^K>TNSqkq?j+=n4e@+BECy9!c=+=RA8MCwe>59p:l9%
DNEl/G ZF!=F&A1j=HLM8<b$u^JuY#6&Tl>@AP><q:FXD#!A=8>mYV>CY:FdHeeKlVL&qIuCbGaBkR+!Dyi8cmk
%?WLFk jiyF:AcNqFj&wbTK!8+B*#6ElLT&i%Lb9lE^h*t5Jc6W5qSwN%Dmd1RpK=:ZE?/>jKbluJX?9a8>1Y<Y
uZjbJE k@DSyPE49PJI5/*@>qYJ<EE9qpJ5MNWpEu8AhQyI@RKCZiGHQJ:VLD\mma*m$pFGk&j8u1VtMGZIN8Se
eW6=i$ n9k$<w*cdZp=6cPabt1nw1anbmImAewte/@pn$jnt#i<F&k$dBCy1<^d^^%R8bhq+4cNl<5VkenBNcq=
V$ZaqZ h&QlIB1*i64y=$VDXnIqa/y>L9wB1\KG/ai&w^C^4<5&iK*W+udiH##uFMYGdbMyG9%CmCB4L*I*9MlR
QV!h<& yhiHaVtjy\i44Nu%JyDl8\QSLYHnFBR!4@4+PS:ZAJ1#P@R#n@aD//Il=NAR5=Qtbb&QC^=nFmh$JP$j
$>Vb$h mBW>Qb:NHH#$G$:=ktwbEbu%18pHIP6L:R9QTymnhtFETM\NANGyJH6HEni:AV1:h=X9eb+jGhLc^//=
MiRMu& KkBCN#>%XXV5XCmL:9Pi:8QVqyIen5qtIE*Tt8JGYb55J/t:Y6YYhYHq5Sp+I&kXQhyBSeVLYyW\RtRM
e81Xt% y$e\JYRk\ih#ewH5cQyG9d*Mi?e5>$=5h#t\+=$dNSh#Xkc?J+LL&?Ih%SGaMia8\4iZ6pA4^YeWE$$R
Jc$L@C nc^B%C%YYi\?ZwHI1X$Vw6?@we%1R6wL8ptJPwdl<eP$kS#QR#Y$>caCcenIYqi!W:nySm1D^VHD%pPS
j/CyYZ 4CB\/X%\91N$lu:jZ>+e/KQ=j1>8<I&/d&dEZQ&1y%Xq>bT6<LlBuLT#p:h&PCaKm4YB$XSS!D=KLw#h
^WV/mP TNP@#=n:cFNqY:kNKpEemqjqJDeQ@kaEp!6Mq4DWQ<=8q4d?VAR1kqCDjuZFX#b>bLYpL!y8R=cLkRCG
acZl\8 +ZI$4>?L9DqF?nA6d=dL9Qt&BFXmw#YTtRET:yy&%Xy/M<JH<IbeVN+\LPXpk@CWy6YGPeDGhCFyQ!1B
IR%IMV lN<Sql+GKllie5=&Y>%PH5:L%!hYInQM<yYtyVCKGinKTDN>yDFABqQajnblK#QG8n=yn#pHFmG^j:w+
/#S+I* cqTuAHPh1hDl5NTSX9lNq^#T/4b4AaInQDZ:+HS5mLD45%N%yp9:$$58m:lCkALA9AjRJ#+y&9&%4HPk
$mk&h% m%yFhBTJ=LhEE$mWy1ChGQb!+:ibuS5TlKAw$%CEBedRFmX>$%h$9kn:J+kW4=!j?j!Yc&I*W^@SMH1I
-Ay+#< 0003d8559c2001202b4 Page 103 of binaries2.zip
nAXuP> 5bJEp%%jH1mk#h?%RMX9ChT*y4H!?*wRwtlX*aawKIMWBbT$%:YlHkk=h<pjqmNh%RHae@6j\qS5c1Kl
9$kFqZ ?qFan/J&^\X^/#6\c\ama1CBXM:AR\+BbX/hTR:CZn*>MjDCTBb8VtIjRAmDcuLbMGT!%@/$m%&5bGh*
tbXe6: *BH1^j6JKI/IbA1AwZM#kH&eZRG4ThR*FKC4tmK/4ZuqCLP5jYE#CNDyJPGY=@<Sk$aemWXY1>^+\i\F
E*cjSu YVl&VyEEddeaGSMBtZW4euXK9GLt=hbHC1nSq/T@QP:^4:1Y@>%yI=/8R&L::?1RPFn@XajE\jIEHhJj
LIiXPZ hWN@&:d<iWQE>w96P68@dJuB9#/$nbMN>BR$=!Q?5G#5V$C#e#*YN5h@lPb<Cy4qEa>YN9AV$KDH6Fy5
mK1VJ/ ZE>Be#!mykA^Q\WNi8Tck%miktb>DM*/FDV#I@$GQaX49:tp@l4>FK/^kS=4?!qea&N=:Jw@lY85n>%9
FLFpMV $FP+^54^GQwyZGNqjWTLCiL/V>D5V?Hc+=yE>1iRnj$^54G#@phw6me>bI>%HQRjwhu@I@SV!Qcw@yZ>
b^4N$u KYVniPVwW$:&y=D65cN8PhtjR4djy1bjw9>+d14<Q:D@XnjH?5?/PjC9*LL@?WVX9:6q5+I=@$>\!\+p
6CGVX8 @V@ZLZ9E!#K!qDdJmKwBd5N!Bqn6y4>d6F>htSETSam\mBAqPEk/RQ?YGFX+!PMR*^>1eApVBWKcu%8C
FqcCk4 BXwFXiA<Tb=66IPj9:E9T#kWLIV+XnpeBp1ju^9=ZH1NSMGZ?:DZH<y6H<^R+5dQGVa%A6$lM^V!lcPH
?%eelY XZIF4GD%VkbYu1*hCJYl6IRSl6K:&Qce:h#HL#MH9hCRwNtt$94K9!PF+:ca@j66BSCD9L6WQST>H^MS
Z&:NF$ FB1D!X\mR+YllN4NVl:kk9<h#F!T9YnVh^C*T1$5nVCJ1a8XDmMP\:HpddPE6nCBL=Iq#I\HC<G@S#!P
JX8E6a =HnkPeWy9ijql!RV1F#GuueBXqZZaSEyM$JX<qt58V!#&akd@8:wl/=Ly%\tbe4pm&Lkew+uL\mcpl/k
k\/SRV K+Q%m5Rb=teP4!pqwNm1K6SIZywun/tdBqMLeBpwl^IHRpM%h5Y8#w<R&!n?ZGBtqnEK\iwk?FBp+yK#
eb!?jV IYhBLS^5EknKCEm9hyjHESKDlRew5Y8*jj9ZiGE?9n891?K+Et&VH<akSwIy$Xb8GHC?MkFP<n=D1b8%
eRyB6J Q$EFI:YW+wMh/j!aM1^+/\?dlKH+mNXqwckHQ>wyKE:=HF@eiBQ55$wVpJdS9#%\*@<i6=F5<tbpcM!B
4Kt6&I b#a!ai<&n5A&REMMqpA:8a?i?=KZ@kjKdD>@IbcNRZMVE>%>iBu$din5X<h!MD%LtB/:K%>8th9#A+^%
N*b#md hRaeMIySH8MI<S!%WT?cAm8Hil4&bKX:YGFZEcW&W8ldwGWqNDe\IPHVck$D$w9^6a:ZK%pb=6TtemK*
Q$F5#S pF/Fi!SDAI9?NLK&c@#C&BIaHW5+np:M&\kXXBJZpWtCRwy>w&EEp5DXVQdeBA5+yhm**998FT>*&6<N
*<HcXK *p/?>i1\#Feyd>Qwe4CVNtc8X1*Wpu/Vw^<CS>PSGEG$NGHqZ?bkC^t#i#KZe1Bw<CtLQTF8TPmN85Jb
:+c&Sj 5ne4P&W4>mI<!#/k6q\%1B*X&6H*tRy^FZuWpFCcT>RlHGbCjSc8pbFM6M&ic&QR:NCe5*$$jT6<l&5X
khZ@Nd Yh!\iZAt#Wt>c:@ZaAj=&/%+iElAbw6*KAkBwyR%MPdtW*L55l1EjMaHXte^:$IPEyFLHCnBCLhFq1>9
GWE%Z? uTVyAJu!PKnMNAnileN+PYDHpc\5aAtcHpFZaitaSV6:L5uu=Ebu/?FdNi:MXV#yKXp:ATm5hA4=YWK!
%4L%*I aFBIpmLehn51hLa6j8VEi<6eyE!@eZ:5#n$ByIBPS\KLZnq5ibJZ:hN+ya1eI4MTBMl?JDVyW/*TuY#4
I9ED*@ Th$ciqn5Q84TiE%T5SSW\>8V:$KTBhkt8<91C<a^jN!WbRAD1FA@>*W#k^?ylPPmjaZi1yLt9W!l^m!V
pe:4yW ATE1=TXS\%QCP^cnV@y1895\&Ky$5?It4SNF5euC!YyZt1+iwb+n&=h^9TZ#l>Gc<bNEMn>6K5D9:qyP
l+ZhXF #ZNA!\6l#1Z$/BDMek#/$Iwn=9bDKn4THm84=/Wbtlbinyd\4p/<cl/BmVXbT=nL?kT#/p8%aS%9Mj@T
G@8hq% XuX&j9$T1DAqdMPQTbRIa\KY>1:T6LMJqZ8cXlw?ynFw&=K%9t^TC1*eymDCiwpeiqZN1dhF*t!pkY=N
8*/+w/ lwe+MXbHuV#=Gqbpb!:Gyi=Sw66IA$bDM!dMPnF65^G*=X99Z>QbSBW^L*SqHPbYYG*&=cn$cCX=GTVM
#hL8#l *LX*m8\HMaZ=GIt?qNE%Q*l4S*Ei^1\1!kI6S%y^^&/IdISWQ8>Qy<h9kQK/hVnZR8=%Sbm8S%cESPYi
1:h&+\ Rpm&KpKpt&wqLIhZ=PuW^:aw?G<=YtyRC$i8*hI6&Ebe+G/$55@/$kqHdcGj*6nBPddanRS1*VB=cM$e
!4it^E tDRJw5$u&L#R/F^EpZPkHP#QWKa=t6SpmNpQ$HLR$wVGiZ*<k1L?c$L8$RK!M6$iSkpqIp!w=C6Z8Epm
qTyJw# LcA&pwG8aJ??D#P#GpC4C<+WcjRLZaLQ!kqP6a9bLt>DaIJ^SuwumYP#:8CPFmL%yXCiW5@bN!4u&G\4
@k+TH8 c99^?l^bcyKL\6q%ZkQJb>J5q<4ny:YhdCDWWd\NASF9j&q/61Va<aF4%^%%lQV<Znh4n%icBW*VGW1W
ub$GXL :\p^At4MpcHTy*G>=Z$@1B5JJYhNC\a4TQK/cAt<JHP&nSlqYEi^\CLQ:TajWd^Kd!5Ka5!*RwuKY\DI
VLSkel F!$y&HAX?<5wDtc49:X4GWEV\R=AcGV5hDK&IMG8XKu%6VIp?dS%V@/F<<QITjlZ$+M!aEGA\98%F\/M
#q/L=\ cRK?K&bmGmiR*\ScBPR4dD&CIGG&ph/?E/LTNW&d&4i*SI^Qy8\=Q?8R*ELP>Qa4%@!GPKetKm>bD&PM
C%tJKQ k@yJI<8d=aeQt4JZtF6\B#e:DBaN8tJwZVA1J=ZZ^q6:w>PK5cXX@8D*cn%eV11CnZawAtWmNj^L@4/6
/=GJ<J CTblp\lXPMbcG#C6nGwlbQ\pB@Eq%8/KaXnb@M>w>ZCwuXYdEuIu/##mLS^d%h?$+EMyTT$u9Icu+<1u
iFE61: mjPw%6nCc*QY=MWWMNHYB>ekSn/u:1\S+X4*BykmXh1yHcVT+mq:lql166e%^H#PHNdm?=wlEE^Xly#n
>#?/Z4 w6dyMA#N+8/JXdFTbVjdWBElSy^/\kh#yt@V^?<V&j#yQ4Ej1i*L=b8^:K>!d=%qyH<k1>>S9D1V9n:w
pyyM*m uHYK#JeNq:/FX?%GKL\P!kRCnN@KEqbK>5yVFw<nwmIjTM+P*m8T<&9qqD88!y?SW<j+*N/HLMklwbcZ
9IC!b\ AFE5V?5DEaDYpk/wqw%mlW#=CH*HWlAt>&ely?XYqyZMkl@JjYTB!kbmRS+Tj4!$eS^Rw>T!>%hGkpDj
D64\!C GC:waw&kVD/!D*!?9Q#F$<YDtbVn4H=d8I:b>&&tIh@CFY?SwA*Iq^+w<KB:u!6+<TNGH1wIK*yYXCI#
*&pS&& DV$dwlTl#Q$lNi9uy/^heI9wyZna+*\=euhF+RiKRPBi6Td9dm>+b5kXdHlTTV6QY<%6T<@NL\>u=?NL
ZnS%mj ca/<81JnCqD1H##QZDtnDbKZSnD%e@PGR6DQ*h>BSNhueS\tuc$/qi<MYXA=<Z1u+NNS=Td4wB*k4!8Z
HjW9<5 d+FnP=kp&9/lpl:w8>8$CRHy%#9mZ@/lTqKkTy/B>DPA\j:#5\=IlEQ+Zq6GekEaGXhh?jjXqjki#<K?
lJV4Lc MXX?S9b+RAZI&tW>D:l?#cB+p:5HKFj$PX6Xlj^CnFa<uN@PddFL$#6w+<DQu+NjRm1FtjNeBwZdY#=I
F\tu4R %wT^A#y5S%\KZ+J/Z!G1T6SiGF$$%n^C%lyhYXEQL?C=$umakkP85X$FqdVd=lESXW?66uZ:pMkRXh?6
JnXMCT u*pu@JqH!$:^ENAemVIw11@aEpX+\qkPu+q&8@IAP=iJ$8TI511Iy4SjhTMjPKc6J64bFJytja^>$4Zd
m<qE%m ZFD4pkN6$pj9N8bQjYA6G$myR44mDt9y=u>a/SZtD199IZp+Mpa:T9WGalLkduk9jGVLAQ5BG6di\SVZ
uT&MAw 6bBdAak:ljmh5iJiwJDiySTDich$e?ehjYGc>Yb:Aq!&lqW^E%W&5#C@9B??TCkWS!?&RGHMQqJ:Ycmm
N+neqY RLp9+^GTa@/qiAEjc=T/d96TMDQnaVpVPN>&Cy1Ak>?CI$4l8hmqKt*n%^y?D#M<b9$BVwu*&4uTAtW8
?wHb?P QMd<4+<%VXiu\D&D!PMw\!kiFqQGRKhKPJI=lTpZLpVAHMKlySA^b+$9j<$RN*\=p%J=ptkZA<CBRbGe
%iwJaC $Z/<&DKL+W!\&d?Ci@%YGDcILQ5#aVF*#db1k&$cW!=?WHWI@Q1tRGbC^eEGWFbQ^G!&nyK!Zpcd1YB8
N+#pij jP#iL^^kILycmt4LemuPEE1=Q#lyqCeiZwA$&K6cG46iC!$HZ>Fma1X=TiM#ZD*GRHMl!EyD+J@hVJ*Q
c+XaW\ JFu6h?DEM^^SCm*dIeLaET^wCI5Rji\+LJ*jp4%:ke1lbYW?JNedA\j?qF@d&/&BuY5q5\Zhd*%VQw\C
M9GXQ4 A&?9G?Rai:Dd$R5bBmjbI%&DP?%aC4NGPIP=h+YuyKTewnl4dikk%V8B%J@DTFGl^BIZHSpQcl>$4YET
9lVnF^ nVp5BR!:\%c*>PuB?nG/=8@/Xh?Pa$F@51W>^+m#S&l*MX&Y4*9D/GKmX19:5T?1qFp#qP4Db!uYSK<L
kPQ!dY #ep:F:<H!T$:BDuyp<*eyGJcMu6GmY&+X!H&1:KuZI^ZTHH6J<aRR4AV!PKwDDCWTJVp6yck#q^?<j#L
@k9yi= &l$6WCeFW\GhHmYyh:i!cim=wdGdBNDe1Q6P1&DX$BZd8J@RlGT!nVpddwL$mFd>C6J9Fa$?l!!Gk5SG
lWM9^S S/b>Di1HaJ$M=M\8jcclC<1kYC=pmiS/BaN4y=@Qi>F$JSJV@Vwee!CmCFJEHawWYpA^w%K>mSWK\^Y<
P!#Iw< ^LmmWL8<?j46nPGYGBNa%Nqe8Dap&wqAdA8/6jy\t\GyI5npqdt+YICCyCk%$NbJDH9RR/TB5\Vd$yn*
#!\W!a @XaDnHmj/K^#6Y1%:uY85#Qu5\IGeW+ai@beP>W</+S^bR6@KSC^qGq*W=&wne5/jS*eIFB*WJ!^p::+
$+6#F9 E%BQnwb!KDVeWbtE:JLC<Y1VDpSQu&qmG5hn8ly5B#K#G\w!\Y+V1*qXB^C\n1i\Xu6PK6tmpEkMnYpm
P:e#Dy bnL$P1E=eBlPb+ddyD=enCPcy:bau9>E*DZDjknHX9ZG*/VB/m85Yh\:MVW$c@+h<hjE%m4\B8T?+p1X
Pe:>#Q dS^dV6&?EyBVL*KknVADLTZu\nmY^T?DHTVWZHBwGBLXE=mb%/LGt\6h9RWjeQ6X5N5*6hSPy$A^P8bJ
I<Nmku =SQtF>$@QC69b%lM@i\#L+PDEe\#e:!5PRj&p>5hW&BTCny>Ww4KW&u1W<8C&HKTn1GAbAm5<#+eJ$ib
XeMpGT :IN\HBKhHF*+*G+i:Mkyh8HNEBI@VA^>MmZlq4#+q:1mqlF\wbFu5!qJPcC&X\WFC@$?=NB!eG<5WN%$
KlCtCX 4^cLRplKRkm%jAtS#%Qq9>#MMVb=!%LF18<DyP1WuumtV&6u#G!SV%@5XTktZnn<#cn?qXyI$m6I\YKj
?uZcI+ XK<LQbQLHmmTXKJ6TPST$4=lX%JlPeWA?ZdyhMN?^ndRq6Nlae9$+VChV:D!=ejLaNbl%:dLm%l4KQqk
Qa4!Q# BZq4?dF<ZW6^!jAA%5m\h$yHAipnwaE$t&VCH%/PXM@uEHIu?cRuBT\$^S#LN!YZ^HHdyC#kjqm>!X+T
-A6<ck 000949e2371001202b4 Page 104 of binaries2.zip
61wQ5J lAqJK5&Tte\1Jk+NwYS#c=YK1pyPGp#G/8h&V\=*Y\^jN#IG:/9nHyNyqE>Aubqw6Gn5VDm=T\/C65N4
STVhY# D=!X#>VWyDKL5LVt4CEEj&$c+YD>j:XylIQ69&pc+j1Fi!*Zj>G>F9^ub%4\4=%yPZ/lGiSk?^hu&peM
I?K<ye B^#5V$F#Q1IK=8B+Cy4>MVVuW>B5n/HBV$E@bnDl+HwC?qE*aE:ty/Aj8&1eLE>B5#<mPTj4W>CQZVXP
K4TY6V 61ikYS=DQ+X4IQAn:5?eV?EcmPM^>FP+BtJ>SBQM?ST8kbkj$h%#QwX4dI?q&iF<C6jaRI<aB5FQ+Swd
+R1WWC !!P/i@BV8QbaJubP<FP+^54&mQ+e@BT85dI<lu+K%%nAn>kN\E@l&8PGI9BV!Qcw!RQ<FLK^QDc+@Cu6
ZTNS4Q @>@e99?>yitJ46R5LCTku^Mu?$?ik%mjqCEI@C@?!Z@4!L?%kj#8p9!dDRV<6=u/n@X!@Tw%De6QL9#@
1=kp4C @5u@+@:Jw/tF8Q>F@?V#/eG!nnCEbkq^ZN8T@LXK!$a1?njRMDT$tmp+NQ8l=DlAmBSPBG>y:R:EL9y&
!uA@Z= iX1&Kn?V=$%G=LcH:Du/k>^5$XMJS@=qaii#a?FBQX^l=dY*tCkG$yiwTKQXW4knYWINau=ReAJe55np
#X&B^X wq\SejctJ>*P8F1+*Eyi8/CSM/>qeV<wE*cbmBm!aSkGmFLIBnL+aVL6TwkRZl^y<XZVMKAEclFh?/DS
SXjK*q Rm@qBSqqW@YWa9qwLwN=lTZQY8l9j5#y4!c%bPJy%I9YSJ1^B&T:DGjAwC:DTS%pG\#HYeceWn#8SCkB
mH?yh! kWAIwV^uWS^!k*im:D4Wb>ykml$9@#lqWXRW/%W#6Bc%<PthCht<@c$J%iYQanYJ8n\T^1D+d/E4^=pC
YI$9JX *wy+1tK^t:WjC@k+=+REa5cR4=a\aYdmTMcppd+@J=W/6Au4:#LkN=/5c>4X9KtF>FX:Q#:>*WXQAbul
mi/JZG XVDZ:Ia1AR?P!C!y<LeY&du%K6G8WqZ//:KcJmN68abDAj/Lyy*pm?p<aFcQVTdLYFJS6uSy8w&bPVNM
w&WWF@ V8/?kLpb49AEMWHjSkVm^%IFB8BYH+l\KQHn?pR5:?!Z4#L#Nu6^99!wTP<\4%V<G\=%uLWPD+!E6HQM
T1@G+b Beb6hF=LaHVd%tnNcu<>iZ5!juV\1cRY:&BAw\!hi==<\NI+XW<Twh?&EVk#E>E^JA*/%DtMnVVA^qL9
R/hJN* B^wimZ?8Sc!E=59FQZ4^QXH1QV5Mt8#mq^ulIw!WAlZKkc?$M:4*m=N%1y91WdnRTBZwD5V1JNQ+$aHD
8Ba$E= %cnBS?<AHVqb?5bJZ>Tyka^=Bi^RwH*Nn?dmDKX#LbuG%81LhNy:IhleT9^yeh!uRF8Ziq?KX+TJ9ydK
5NnLkn \lci?DY!SY6c=W4H:dnX?bNYlknu9KlZe5*&Cqma94aB:hp9/8EW$*S1&aNQb?qFd8#:I^B4kmLYN1n/
8:1K6Q hS$Z#ui=w>?mpl4^l8GZckSPaHqBi1$8aWy4luR5VXdM=WCRtqMHAwd*kh@k#BIQS5W#1Yple?qVCDYT
D/<>h\ LY#DY&w9CIQ^p&ja:Yj=??wdZ?iEkTLCw=$=VA>\%?>MdAHiI>ZA%SQM::K?l\+:8idaHl?KwBn6>D>B
kC^X+m Rtb?jZ:i#?#9\In4BnLCVdc&RLXFye\5VB*lnqeCVplY5#NcEECtGXGy&w6$=X55$/8qPeX^XqyW8/XC
uaKyQC d#pNSejDTqV?/HL?ctV>h5puqy<\$cAMyJ>9Q!a^IEDF#JIP><GF!dh%n5y/l<8yM:A8WaFJJXNWhaAW
E1%nZ6 TFhIDKWj$p=tew6ICYd&V6DWF/8S!K:\t=^WVc&ClbZj4kimLm+CnLRn!514&eeaW1Fak/Kl>=p+=c*W
MQ1Act Y8R>m=F&5%$:bGeHM:Ibp*cWQLJubiGeA<Sp$AL\c=iZh&qiH%#PEP*BjRl@K%WTY:R&bqH49AkNLw%h
+5B^F* 5CQ1SR41imh96B5&!wEAwXJMwX=+6B$tweFaT=pe1#+iIFPju+cCiEMhH=CmRIDDcCW4FYEWp+W*hh*b
8EHRY8 H*EiHE&=X/5y!4!5X8wW^4\i!G?Wdy+$=RaNT#k=jYt/t$nkXnPd4J1&IaGbK&ZV\DlJZ!V^HEu6/AM!
>WS?c! E$$yMNVMQ485L/1nppNX!ce\?>Ik6XS#qwl@\MKZQMaDJq<9R@Ha8+LF/iXqGH=eqBZMF\n@=I4\T:^d
l8%GnA >Y>IPTF?qNaVnHAJqpLW6tLS1=lFy?iEiIQ&HIZy:%M8X<&VjE=FaTp*Geui&\lS&!B^*y\YD!:#V*8p
$y#G>R BYHSe*j:E@QaHB^*^acRW1i\RBc8Hihm96PBE9\pDyF*SCPlAcjwS@X8QB9j!F8iHVe9JJFc!bN&hbQA
J\1C>5 X:q*Dh9R!AL^XYJ!XHXaIq&i&HDa!9mG4nty$VNnc?E9#Cc9Sn8kKIcHDRPynRVWWZI>A=ATRc\eplta
aKG8B1 >\Vey6/yanCa1bHR1y&le/MykBZu<FiPJZA*uNudqI:#WnlI%lkm#NLVD$I=mF\8MuJdm<4NF:+MRjpb
PbD:YP +n:A*IY$pA!HE4<bBb?pbqb?L96nhPTP^XPpDEZL5BNTw9ck81C=Yy*IpPR!*yA8:G^nYZ@:@ijYG4Jd
#JIV=m Ped5L1tmVDt^t1NcycHeMd6d8X^ePB5=Hy@k^JNme*P@lPd+Ck=^hPeDLNk%^dW@A$c589qZCFQnk9YV
ltp@Zp K\VTKw<:<M@nQq9V<a*tHZdk9R4KKu*&5qL68$9ND9J1/DnZCh%SAybTP=eHHbNQ?P&\j9t/L+YpQ#4m
e!niln C9JZYjq?#LaZt<yDKB$P<y>lACWX+ebc4D=tXRRXdumJb5IEHdQlRP>Z:KEP#$c8Y5B*>?8Z9paV%4X$
Q?ybaa hXTIPTpEDcllJ@#ShQiDLy#1h5%aGi#LEm&EVpwtt<IlI^\XpGq$tjaS\q?mcQtKC1*y:HbaBCLDaK6u
i6lQZy GXMZDK9L/*bH%:lt#>#!4qppG4INe4?FIC&iTTb#>yyTLA?<J*#*%jj%9lZq4W?*P46DJ8WDBQZlF?J%
idP@k6 WneqLGntFNyX^/+pm<=\:#pPT!IWIq&<6Wdd@R1%<C!>qw%n*X8F%#umBhPE\u4HPS?9F\4pXb#Zi!+6
bRBFJK >V1R#C6Wdn8pSVy9KCJEJ@T*?Ze$XNEElS!wP8FLSQFQdN/1:t=#9EaNPS$>dJAZIGkPT+5/C+<@XI>#
hb+Rc8 &n=>PK#>MeRBbnw>NAyn6!W%:DX&/Du*6?n?jJS$\lRu9A$bhZI@#+\IaVwh6Tiy6L1dKPqnJ%m?6H$Q
XAM+/F qFt!q*XpnbB*kMJuLSS<q<N96D%eGwAEk6IXlc4@DFXbGw:jZqlemuC1IB=mI*J55AHY1:RhCjTJ5@iL
c<6P%+ dFjWK=Wil*<NJX+cCL<8c:JhQ=+K/><8CkQM56DM11!YSel*MWXh<%9X6i?ZM!YC!>55pY+eR9kBh?yS
6aYCKV ky4=hXMM*wT=*AS#F/t:lNpC=Wk#^pb*8#St=%u:dBi8:$t@K=#=R1>+k9%:HRTjCD4SBQM&\PGqW^kQ
&u9Cwu SIDw1n*t=@:4PbR1>Q+dhjMKKPSRlQ+?1JFRcD4L^GDKYXSycqS=\WMdNPHKQDGW=X\tIQRMDE^l94+<
JE%VC& RnqIkW#VWFTdb:ChQhi+%EJa\Tm6Iw>eRWl#VPT=DcW!E9Y>NXy4X>:#45B+YBnMAJT:48l5dhHubZ&c
BqMLJ$ ^91LlCR4\!G?iF59<CXnwa\14cG@Ejc9XNKY*y?XF9dYENDV+FtmRkPt8WX8qj#yTCK*up><jlF64tw9
S$!ZI/ cXecN<6k8t\+@jaM**=Z$BXKhkla&CYN\B%A/!>cYR14muKEWtcK!pG?KTj1aVLIkn*JkkQ$^dGbdu9Y
I6@X1X BVNBGE5mD:Rdn8*m%>\lFLb<Z!h/kI+1C1c^n^VlA=mZ*pil\pAF^TDuGy9QIFI!$I!E/T1Ylk*XD9qK
HR@*X$ enA>QKhejVnqw/hB=R=q%Zd5R/BiDX$>=SI*jNnWLw*JAek#ACJtdW6QD?$8@W%yQ^iYAZbdWS\Z$SZZ
Tb4q=j j&\aG8T<JM$&6A5ju+X##ZQ$1JIDcjk?>/MT=mBbdThSHLICN^ZKV@ejkqa#h\8*XW#E:@t:u#G&Spn#
?aR!Gq INI/ilb\bA$MecD\HqZe!t<%9=jdFM+yF=GpAXE!K%!+tpkMNkZnt=4DKik*\5B/!jE*\nDiRYQEe$/T
B6HSS% !8!ujD=?@qZJip#T=kYnCB65Fa=@M5+i+$XALMEkGmEhRHmneKm18lkSekmy*R:>Bc\n/uZAGYqRcXFE
!^WdRV :^//ib^=Kb^JbaY^Eb<@G9=Ww:HqCdEN^<VAjpH9Gau%$R9RC$J//YJqY18k!WP$TqE1b&Nd!IwahE5l
\AawVb YWe1C1bLCMH?bF1d:t*!dnJVL\tS#C&S6K$IitCta4@9*ha#LNaic%b>P:JK%d#8jncTEBX:N!TH<%K$
HS#^XX hqA=WmLLGG5Ic+=b@k6Ib!BT5yl!9EV+==enh4mmMjqX*RXIe\5Z>SYT5#%P>emZ@MaPM+L=15m:yeYt
n5eHa1 %J+FdkY?99nVXnIuIcJwS:IdQmWtW+KTYjmV^!iTYV^?&6NRBjlAWijmH<Lu$Fuw<HlCPmTZDKl=ynC%
V%m>*w ZhK&FtSKe&>48QNpHC%I86uCX$R1X:^MmF=ktS4C\GYMte6K+C1n^5Q=^tlZwEyZM:GiPhL%lI5NF+kn
>b<wIw P+k4B?YA\1Y&9&JjD1paM#1IS4GSFCBi9P?5#ZW9SL<NM+KBCbCB+=S\1X\P$XLbaPWKpB#Lq!!RSdkZ
wbbbj& XVjc5VReAh*L5mDA/i8Hk!M\9?uV*$+#dW=JwH\yuZ%6D:qcnnuTjY%ek:8c&dt^<a=Dehi+nAnP=NCW
5u9n>\ 9y?Dj6dM=uyD=46/uR\M1dA>$Q>qlK1D9wI+KGC4e$LVGEc#&pu#k5Pe$ZZ&AF6GPX6Blu8T6kMpmc6d
MI8tPj wN4SyTWyQewXGcFZ\tcM:XWbVNtLXWm&?\wYGpIHNIKVR!PDiCCn55I%QXe<WecHMBiBTTRdGCk:mCbM
DGFBZP RRJtS=T#*PibSmb!*m\PVMnCyLQ8RXdAapJA?KBaT%58y><XL!IuqE/1\qw$pi>ti8qK*9mt9kaN^e/M
55E@@M Yj%PZ9jPc^GiAlZFTLe/nEapbACJ?XlpW8#bSwqVWPq\9I<&e/WYI/5&y=CqmmS=:^*RX5FE$S*GyE/q
KI+!R! mNtQ%AW*X=T4uA*J:EIlXAW$nyR6BBdF\HQc:tCp&kI%tQN8VFJCVhedtpMIm4@^Bjl9BbELy/L*iQ*q
lH+QaV BN:IN&T#L:QFkh&N$HC91AS66RShTjR6e/E8GVy:IhR1KhWc*yT?jw?bIJZa#YkKIPMeyu+>VuE$>D+Z
9<YS5i &i9Rpp^6SV$:Cet+HI+@lu+>SE^\FB=uFWk/C5ijCYh$VL<ckGCIC?e%mDKWkJRbkeLj?a\WFb+pCB4m
q/8PG* IiDGISD5E8ntH6nwAeD%DkL:ARAQkWqB#&/mk<H^RWt8AIn*^G8iIiBeuJ@jJLpE4V+EkjNCGpNDdnJC
MN<PJ6 *ByC\S<D\XYl/ntlTctlN^$lTV*BndFle@Mle\PB8J>D9CACd\KD*N+T*\TH#H$Qe\5Qd@\Yyi+by6+W
/hV6kI wS+iA9aNcj\ceHMTuqRV*ikR1WES$<RR&Bkj!<WiT#dtT+Lq?j1S\#w=8j:uw!:?m>aE49>%wAYali6j
tpJ$8j 4RqkF9C@YBQALJ#@JY5CtIZ>n>cE*:W!j>d*eQ%Cb<j%4?EZn?n5jyHF@Sjw^@!Mj=HE@X@S:I@yTZ?S
JmV5@^ ^Q%j$cDHpyu@Iwu:L>Cen$pPjk1c@VE$%%QRn!RXAj<mmj59$M!QwXtikGaDQ+btjR4/phAQMQNV8Md/
qJj^/u cN6Q+S44I:auMQNV8MdK?ynpV?EcK@Nn/Kh\:XHhNJn=KYS:VDeNb8d/V>A5#Q<S?mqpa&eGQaJtjhL\
-AkK6A 00051ea346d001202b4 Page 105 of binaries2.zip
:wRilu <AlhYJ=CN9bHE4tAYb=EN9Bn@Yd@u$4p<y5&u@Xu>TB&44<E#j!9Nj4kQ/a\p9>HS@/6Sl@<V%EN+L>E
N%*Re6 Qmu?8X:Pj>Zw5#M#@^<R%WBkGQB@eqTDn&BSAA$m@!K\w%l!N<i88LTWcZC>Bbj<6!AC8GneRba?:*b=
FtSw&W *kmwHPm?Htt*bWRp=pXwQH@W@YqMqC:/Ke!\1dijee4a&pe^8#GtLWnLZlVKM+i#c6EPiW6pY1c&lN&?
X9:&*M 1m\&::L*DnlPK<VL#awSaum%n?+#SwheYRSSA8H#uqaApd1I9N^ZCByQBHZ@DlPFXac\e/JKP1c8i>le
&y^aw/ uu&A@1$q%<mw>AZ*AF5ZPt=HF4RXEwPXVS/+N>y!nq66TQ$ETZqK?+VZu@%tq*P=%q:A11P1hMK%ctMp
y:/iBC BSMFB&9A6e\%Y^!V=aXNnbhehQGSmVcECBT:u4V#ljuE#PTWL8PLhHeddYZnM&ebBeWyXAtu=eF/$e4*
*C?4R4 5CGG4+MW*FnYkKS>&^BCCM*GN=cLTRN^&V/%PjTY>dS\MVeGT8*&6DM5Am@+V*Vtl6+8Y<QkXywIL!VG
Yn:Nc# ld6&R*t6WbS^IT\VcNc?Zjc%=HwdC?#$cDq9Fcmc8RH4Ekki^bjlqGCpIcqNjp</QLX^EWQKAtT&>&Z^
#%STRT b=Gw*h:*ewi6YT5*hF!/4tLC#L/eJ+TBSPtn&NecLeceYC^jb#6>8:^eh&q%KNAbRhB!NtWhKyQ?cZ6m
146Q6l %TlM1DaFqSbGp>XGdekiGKk=qwnJ$9%XWTT6q8HdCmhGSj1eQAj!T>G^A&Vjju+YBpK1VM\*L65jcqjc
&d<Bab <Ni@hE\LZ@keVWWRuh+d&QXeM$/yjS=<Y#N&naBykK?\G!/i=T#cyteM^*BmRNBPqcCDu>KC#DB#AN\y
w?\*WS 4wA\<NGXT!?tK>C>GjeI6t99d/mBec9CpRc/i?Z>iMYJG/EdR&NV#MXNCld<THTK+IcMq<84*Q:8Pd?J
=%:YwA F?XLec:4Z9?Fm$\d/tV9AB#IBb&eiJ9n+Cd&HjQDDLJ5yQK%p$?d56NLGLtMAP<?Dt#4Vi*WI<jSEKS1
QDwm/y @jMn1EIT:!4W&liFQZkaF!bIE#1F=KyAPNI*SjcqtLl6V5RaGF*Nc5HX#QVt\<ME^1@N<wSSRbC%EkNh
!J=T!B I1>P<JlISDV#b4KNNQ$@YSZG!adm+npIw?!BGWtGR/LyW6\6%twT98p9bBk?a#l6%ea?ZZ886CV:%uG=
BhwNYD 8Wt$h*SKYTe^t4p86#ccZkN@KPF<F=Q/6jcRutE#\#Et/+m\?qGaF4t&E6b:5IahqAIW5+!+hEhBekHc
pJ/L>4 ?1&EnLTtc/M/FP\EhD>DbBl#\G6ELkyn5ES^ZmbQDT!q+t&=Kl!ESp8A/WLaG$:GpnYLmtpCpR<jW\^K
:PRNhF KEqlSjFHNBVhtCn&!Mj1<pn\:P&RD?Q1Y1GuG/lVBy$w>un>+tI1cJCWNKYuPZK8WZHuwcm%lTZ<=K?6
A*Y!&+ lJQBNpkk*4X/be6\6S!GA8j+&ECRqSRc9=FJ^LX*X^PHP9tByIX@HPt4PmIwbRhZ^8C1&=e%#^G@&K8?
q\>?iA p=6aqnJb?CGq>h/WFlw:wZtGEVePRqiqccLq/?F?1KcI&Nk+y/B@6X@iyy&<\G#d$PAIAELC&h*cn$N1
K$G=WS mKPNPBhPab^%8J%bM/YWHENiwGuaF$>/B%Le%q?mYBBHtM#T1kXVXntBa?H1Qd:Xtti%pk>+AP^<c9p6
TD!mH/ I4c+t&CY@ju!>l\JTwp:Ktu&Hk?1bYCm>R6L/ck8hB8GYi5w:plN%RPmjCp+qJD>^DI5hMK8WqY4PJu8
%BqqR5 qjX=TRKZ\#ADRSc\#^hQVBh:kT#&1mq4wH=wypn?=S+1l!8p:%E?w49=EX1bG@N8M9i6Z>XMK18#uhR\
SFZuGD ^6Eu=8$KWEp16ca6Nw9q^dMJME^AGYTLh1nCJdM$Nl#qn%C%SAEnHQ/SMQyRw=dnLjLqBm:Wc64IFlpj
wK@#SI \aJ+QETX4ipMq!8^=i^XaX<W^eVIDCKFtN&a?X+N\S5BF&MVV:wnS9$iK&q8QY516/G*q\JX6#cj*%Sl
yK/@@k c#tk&>X$wY5H<#tPR*Y=I%I/!EK9j\CSDpq\1qTQ>mBuj#b5$=i&E/wZZTKaX!JIptyp*w%*9kwN!&ZA
Fl6L:\ !Z9NBQN?8NduXBmI^e=el^/6=b4F+D*/jk@bSHy?p<65S#1DCB>NdZDGaP\t5>w9cum+kKLH!h9@a+=W
IPXEe1 4l=hdVVDlWcDKVk!lnJMSKCG8=9/i\jdCRFERkpieFTmTJJ!!ClJR5^&/F*tB>Qe#TX>*>hJK8=9M:yT
YNITkj ql#5^EWtN:NjE!/$&d=kB*<ML%>A1IqXa?PulEbJYuL5CpeL4p?/h6XcHX:6ayll%%d^lMZwyK%%CKXp
6R9!mC C$A%NLB+=%1l<dG@ER&ihBnTc/wlbMNGZHQ:4wlS9SqiqN/#t9&=5MiRJS>hj&n@pB!q&mqMtFM4W>#i
8aweNM &*8t6PZNRyY\uKn8I@6S$5@k<mS6XA?881JXXC%WSd$d*ul8S^*/$%1AX>ayY^B/cGbTQJGNKki4hYGS
d1A4nc 4qdBk6HNEGWn4yM!#tjJii55u$SZ*R=NK#Aec4^=DuNGm+d4/*u/n#acQ=ti@%FpYKpu<RVk5=whNY>!
\IDG&1 qKcSlm\ViWqMWZDa&ZQ^1wctm8=Nk!$Bi5R4hpP1TKd>yJmLDmBnX:dl*w/XTiB%9EPGc#qG^VWSIl$*
=68R\A QM6KC$=yuj@J4NSqR:pjQtH6\y1*VZ^RadK<\TK%kj%5jDjh$DhwZBFc+>b95RE@6D>+8qH@KKihLP#y
/+DY5Z BF1=:w?wP!FRj@M^li91ywJ$jt&mVGL+Zk6GtE#jHNmXV:/^?/44XEZwt56&QR+aw<yWcJFu/!WheCMP
md@1^e LZ&We6Gd@:H:eF9+P\!hq==I*GYWI9L8HhQB1q+l6Djp4Cupmqmk+LLQP55t8NYt<u5^6XhJ/\BqK#K6
@@\^TG X*dA1I@<Y+HPlWAKimXIb/WiMLX<4VKpI6CiHPk9TdNHVY8mV4jSi!5c$hTXQ/%9#:D/\Y89YX6G@9RA
G^Q&:$ =a\?bhjjd$BeQaetSmEWi:*Hj6C&Wu+H#ul%86p$j=nT%R#tC1Wu\Hn#?XL^*nMHkMJtkw\C1+:Iy8c&
$N?QZ8 ?j6R#a@tn6#G^dA\nE#b4W^h8$ih%aFF9HT4y5w:WamMQlEAjw66wLHMZLB+uF4@4A%k$D=j?\h@h:Ca
/WiTj+ iVSMAnT58V!DLEyldnnqRpiB?n9n8KDB\:D&$ZCYEG5#SD!+TSS+/Glb\*ipp#CAW^$L@HNkd+mp9G@b
I1P@p^ jbmyNyKa?Y5+WdPRjB5a!Lmi*EdVDWKF6+^\ke<m?#AqkY6A9#k$hT%+d94mN<<!6&j>F\R4Ky+X5AbT
Lwi5tK itNY!RIXFIHS18c>kXCu+*G\$YV!T\KbAe#!Ht@%X>?MRlEEJ?TI>BCmNYa!nI@tClB8u:/L5W#M%%\P
%G<N5: *lX4F!Bju$#P/$:a8lXG&<\Iwe/ppRKEP<hWk@nJyM*>i5t4JYFkdA*Q*Y+WA>IaPu5GL+k&F#:INP8k
pDNIk^ R1bZy!RG!%>TLRPlwAY1plV/SXhli%eqDypqVkjNe8mDd=HKYe*RW>KC*hLFF9cwi>Q<Ii*SD!n/4>@c
E=b:p! NC+GD?BAj5cS!W$yH+WBPDhPkymN9tHBtJBFbmFD%=DDGGjq>8d1Y#FB#eIkYP@*RB4J&i6bS6VtMl1a
>mV4I5 jhDjAiiEpHkBF4IqHZM5jXy!4\5wWG:IbXG&<W&Ch+*$9*CJbl4S8@/\dV/I9Dpwe55YhSZB5GaIa5$Q
Cb9Q&Y L/PV#I=C=tQ\\!@!p?M%B?/kl1PEltN/YYGPybNeCNK^mRcP+<=F6LPE>udGNEhHZd<#KYQa!9eDKQHV
l+lQP& Y/+E\dP8nmKQjPQjHqWDIVACJt&**b!CIK@K=w^Fq!RM:=9N+YR6*C^N/jkEN*m/bi&*wBEA88&l?8Y4
KAN?nl KS*KKE!S1\MFCWuVTJaS%VQX<4*h?KhW?YMFjt6FCE%>1?tWtTkF:bWu5t@%Nh@:!YDIy=$y^QlRmj1i
uy6?MS P!MHWjhE*YyEKH6ilp^ThCbTLi&\>H5:X>jC#5PbPpmTVucb$:=4=$j$p9jqN%j#cwSlkTW6lmY>?ELG
ViGBX1 !pqYyW6HFRqc9&KuFAZtC4CZG:A\Tn6FP946K6?e*u488Zp!BVH5+w<Y#CGV1+9$t/dpk><FReHDwu5X
%kTdk# *=TBwQ*GDLjFCn8e^=ShGC5S:N@NWQ5GhaqQ%y:DMc=Ady:8qH1Y=DIKV\hR\GtKY#w\I:Hy/=BldLDF
wH%Sih d5>SBe8DA9pRd?^PLkjam#WpX^ZcW?BB/l4TtAibt5p^dl?&dlcDdSQMFy^buShStleqYdZwYl&/w*44
1N$cpL ?yhN8*64+NJ>h5Q#N6P^%yemXIWBu/pen@AWXXA5/1MmJ5RSa/H/*:KWyM*KEL4V:Aj%Atip?EiLZCh#
?nMEmB :YDLYPXAt:K4yk4VJ!nl#L&d5uj=$&ydRX=!^<HA*8<ldDkW$BNMuhG>=NQ>l@8DwpBSdXKSL&aJquK\
a\G*:% :RJq!Zm1l5JH/Qetaj184!cWTl8HJhjm5/XmlKYNB<WbFd%Enyq1Bm*lWL*+h<8ljSRGN*84mtC*lj9/
u^Z+Hl RV1!khT!WV>kMc\N9$nRy>kYt*i/pG?JIwnLHjBJ#K$CGa^#5M&\m9XN&=unZFQ/Tw%FJJnLt$qFeLi^
jVewlj Q#9K1Iuy/&lRi6KTXT8j1W5ny6NSVNtJ=c6hQ$nP6wl=tXm#%6u&>j9LYnAl&XAJj=hW$>C6Z%I99uLi
/L5e64 l4!^#?=X9ZE6%@?R1D!6/F\SqtyV#P4A!alm!=y:LC9$PWL$5/PPty/pTQ@6:PlNEI^naV=ViRynqJ5\
M$cDJc NI5Khu96\AJKIyQD/<yhX%&6tm9*SFnYGeenT8>ZmwWqP+Gk1QctcRX&@W!b#wl54LidJyMMnanM>6iM
6yPB=Z u=EPuBEETt:&VL+Kq:^&!djY!V%%at:QFKHB\kCVKL*EW5pk8#m!alc&^H+tjA#uIEkqbqEE+@mJ$m6#
PeM<N8 mKw*R>GEiX^JS&aqZt^qEwQc!!S8IJy/&S@qCJcLlt1iCtXAX*>\*l</R@Fi$?aLpSKhp+<@qBetWFBT
cEuKqa 56&cn@NcqiPFy8^#m<!\N$#w%*J\\EASmX\jGG^9t6NlLq?u$Lu&YGEEIMc?C65yVKKJ88Et!&Ynwcl\
@d4KKG 84Fw!6##^5=dClJ>+Dc:S1dVC#l*ecu$=<Wp6m!L/AHnY8K=$XYF4SEBlaX4^L&wKLnYNpDZ:B$qR4HE
qYP*&u >/JF5bhZ9ljL4*DFRLmh5jHbF84!>DqP6JeGaNQiL++LVqJp#EH!ji:BeTM4!?eS#9d9E>Vj/I%<DFA<
u*IVY9 $9P:$E+K%qeb$M?XR/FQkZiHApSh9K^LqK9PyQ9Ky*Gt#X>q=G\!G<ZQH#p=V%nA/Lk%Lw^eYDq^1NA@
DNJ%=* /Zl&H^YM%GKBjyjeSi?8q+uZjRTVP#e^A$hS:eKqPYmKw5ujk<5!H$<=JiC\<mWm:kA68*iB=\%MZA\T
K?yN4# V#aTPB+qqdCJ%cZM$AAVDSiIq4NnH<qcq+Nd=etiuuAFQcew&NT?q4T1RGDVwi*Fn/\@?A!ed*\!w#**
Q$juwi NpQtC%Mlpwdwy?B>!A#%My*ZquIYw\uC9Fe!PTY+EZLWaJd#I+y1G*y$n\>&kdkm:=j*:HLptyj5V?hH
pq$+dZ q9^:WZiw><K9^4XX<hJEc\QJYF>A/dLbpZDwa&E#6=KbmANuE8lyEM\by#qJP*u$MeFC\bY?aLaJR!yj
M<>hQC cTNFEA<ypJNMtwFjy>yIuW1wBWIL!MGDZAZR<j!PW@XS1QanKamHyuwStwNAYGLhu@1NSa&S<$9=npcT
WiBc+Q *qj6j9CpytDSep4>KGkwjEy>Q\SAADVAuqL@N<6TciaSjQ5k*Eu:*<%KLS>HY4=QjPKb?jStFpC\@Pu:
-Am@M> 000a8b5cf4c001202b4 Page 106 of binaries2.zip
Q1SH6b KkD\<Eq4<>u*w>d9b/%cp*<%K:ZhAZC?H:XyVdStQu!/k&l@5>Q?<Z5:L$d:HW:LHZIH\WPH%6iPF1J&
nmtw1W :Sh6d$+/$>nd$!lcq6nc?TE?jh^w=bpn@4:Xu1dY!dQZ>Xcqq&C^p^C4t&C9:j8Z>4hKLT%TZh4Q?6/M
@4KBS8 >BB/>:<N@9Vt4Q<88u?DyRtAXeinXQeG+RYM6HJ&J/MnCJcWk^*!9eJHZVABLhlIu@Kt#mZHCTJSp@Nn
N*mGCl GqZmQSiQXG%Z$<BHy$yjp$F?l<HWNK4PN$QMjWPJD@X*HZZciTNCF$/bXmM6W<Qb:^pNtct?l%ATJ5F<
*Jkqa& n\N?V&=16&wt!G6PLj5I$Q8w%jS^MLGFy/@@p<n$P+uyV#LVQ$Rl*<4%c\hA/qQ%L$u%y$uN<w!%94Qw
HM6QJN J#L1@ulIjIe#i@h/%85ib<&p<?Y:uye8e!>M=uSi#*&ed>YJuj@l*=$Y&4+WP=?i8pCW6dAe9knl8cnn
EEDJiI 8jlTHpAW8:l55yT85QSna9uq#QK:?j/YBJ=Q1+>E/aD@tHn<Q#cq@Vj6b?A@bnD@l@*56+M/yT!Muj=b
/\nCHj Ke5CbtZ?Y+H>>&@Aj#YB5ZC^@P$uL4dj9?Fp?X8B/&>1Vqbt%4@?^54M@9e<bW^Chm/@Yita@&G^a@?d
jlIbyc D9iQp9+^Y@y@\hLH@1>^R&B&=1itXQ6hL@6uni<9$1@@juu?%?u&\d@I99+L>CNYPjA951@@A5*!YN8k
B9Y4RK @\nN@kR$P\j+EVVHW>CQ>y9#KYnY^>DkJ/BBZJ!QwLtiku:Eqkqta*+K?nE#C>6V8Ab/:I/^QaX4dI<^
wmH5K\ qi$yZH55uS8a:Tqei!#PB5#&FK/^kl>4t?M@Rn?Fc+>F/aDbu5K%^/&SdF#@ES#$FLc^e*I<ku+K&^+%
tMhYGw KIJau@Te5D/Cj6LI>pk<G9mQ!RQq@+H>h%c+9+jT@MWKB@:X%QQH6ILKF5:YJmVWIBKqu@>kaY6GatB4
u6eAbR VKJwatSm+j4dJ!WVI^hHE^ISG\MLc=y@GCdb@#aN@dNF>^?Q?>?uQnDH:#+w<w+t4n>lj#>WS9c*JRE4
Mek>nG C@n*#/IYnp/@#Ztk*<YZN9n4b//@V*i@Vc!kQ@iF+^h>EdE%euT*h@/>M$+Yb4c@qW*?q*%k@!iuqZ>M
i$8\SP \!D&j=d=u$V/8<!ej=Ib@AibYj<5M?jVbZ=6+Y^P+8Smd&@u/G^m@Ne8pBna&%6dGBp+Y>nbP9%#j<D@
iK9R!: L945u@4D<cj?kH>FE9C@F@K9pnndpbk=&4uaP=HatbI+tllb&F9<6mTl?Ze^cj<Lwj=KFQA9F$%@VA#=
P$PZJc N/GEVj=\=X^NHC%M*Z>%9@?>F<I9:9j9w9\mPA*M@w9kNDaPD4d@Q#n6j$6\G6=@eHlGY=EE1nX?DtJT
T+FF@y aRiEhMwMk4i$89ck?GENM!a<A=$YD5&^Xlw*6$G:QEn+1J@@!L>K1HI&\5qekdiR\Z/W%R?b#PkXeE1y
SS//An bXTG#Hq>y>pG1w!:&dh@nRQI=kTiDa9t+WhFPiMyEwDBMQ+Pqm@ZH%\bLdQKR&98CBYRGl?FK=NH1n*T
RJGtH/ @nK^Fq1ImqT4k5AeJwhlyK:EX5KQLZwX!9<=RDaQm:6&DhAqQVyKRZI!du&EmKhaZ5cL?i!FDCey:?Tk
5d6LiI X<q<%uAuKc9mnSqDq@V\Hw<1J9qZG@aPtSSM8i8wXVBTD4Lt8G/HW#p1uEP/9:XC9Lk<i><=uD!F@+9W
PFIVuR SEtbmdldXBYM8mbPnjN*Rm?X5W:q>>ktmA^<^e4XC@i/uj\#9@ll=&mym<Y=6EpwK#ME:hZXjKD\GFP4
YeHPSb :Hwj^upQ=d%!5>#9l?C655k5^QceZZB#SKtF&R?u*pF$<?9MJ/6bCGnJ$bEJyZVi^eaD4Z!p8q$q^cb=
Qq:GF$ ^l$VQe/X&6YnYFiIBwPIa\d@5tliWhJhCGH4MY/jAFyMB+#cAP#%?deHcA5c^&K&y<wt68#Dw?y4nbw#
Sw$bb1 W=/^Vm4A<uuqHE/%cV$<+*eFR<W6?aVml=i6a%XjnY8a?p1M!Bm4Et^LpQ$l!yG\e^p#1#tdqX!9X@Sp
kRu=S= 4QSCFRRmtduCGCtFS&$nL8hY6!Zw1lVD&&BPYtFi%eS/&F+m6^%iIFMNe=P1=4@:GGbd/>^IKG=98#b^
6/HY94 ^bh@?pEY\hynLF!6\TX1C$Zh#uMEiweSt@i:F8IppwH@LYFD+>j\wVMb1>%^K6ncd%MKt>4qe@kj@WeS
5G>?$1 E!WQLD5G94Pa4XkbFFZ:4jth9VI4RCDb??T=@^JZ\EkLEEeQdXmkaQmJ=QA&M?X4IK^MKBtbF1#t4l$$
p#RCHL ^CRGKZMZFEE*q:eaI*X4=kK8\VAS1eDIqVCFe9A$9au6IV+Y6u&l>uCSLR*JNJ/9Iei^h@aJc@p*BF+R
=Hb6<i haA*9#bLbnitQ@?$?=nEAT*=>ChIPE*Skd*4N/IpYRu4?l=^<KCZ@dSTWDF8:!T?J<d/pYVH8R^:?$TJ
5bV>BM WbJ+WYBZVm5biH8ldCLqR@<qbb+$pq<QNbTleD^mmn1h\tHV5Ne@nq9\5w&B1!Jll5Pn>IFJRe:!/\N8
BiBKeE /8N%VlQVDYWh5RT@ZKNpV5Qw#Au!ZN%:^\Qil\\XFI5pJ+pXS=>PDLQiaIlBY/ZECiTH!DdRbcVyd5*e
@$9Bt5 @91mlhwd\ibKGDeH#X6aZJpbe/>alj6llQS#GJyL/KVa6GY5^Il<X9l8&e/D^E!c5n?CM*aPFBlyNFja
H&B#ti l#pt4B*5TLDi\/uSu^=KD@Z8tZwhIbq<H1qZ#kV>tMdS!!*nRl#$HW1J8%R?SR?NYC=1ta=CD9KiqXK^
pRc5TJ &%4=LW9WBQSBiTqFGIbB=?dEwFt>aY\4F9ny*yn&GYny:HyE:>KSmulN5^G<jEE=/iZWYE5:6KI8m1Cn
mTyuYF TMt4a8h+Y5BbLEc@4:$4T5DyLl\WYt98/h8>Vm^EDFq6m<K+?CVBIChMk#6kiK$8wJ$::pdQGN+Z:j&H
:qDb#^ X\WJQh+R^S?&M89pc1c>yZJVkTSLJdMAW#u91pkyGQK<Ib<M<lZTa=bL\wGpY&\5:LW1$\Ibk:cbtDEG
j1!:nC tmHjWMW#+T9NMCl^W&&TkYGk%W1a:CID>Yi@eb@FTeK8W5kt=&5+9WEZ>IyMcw/5lL5e4$pCG1Fb9c>S
ky$K/& y\FJHHuIaI6CZAZiJid\X/GGEqWJDBSL%Z#E^6W9A#DTwVAHyp?y4NyaepPGp&QKF!A/@eWB6XPXMFl8
ZcYtIk mRnMS8L6*F>e*H%qHHJq?wL*1MRFZRkMC8TCXniuLPZNwiShWN\M4$\\E1MWk6Q:p:ZuCRkD=1d1^RP>
b^*BP1 Cmm&?\GSCXuV\+hX#ZJ8Gwnyp#nAmC6EKGlAInZMtN8&Mj%CQV6<X*Hc!LRjHyn*^W6Nc!yP8cMC!6nt
TekVk\ Yl6phq+1Z/F5Nw@WyIB$pabeXFn==b#u*dmKaWX9kX*hbptXFpl4BhI=kQueWh$Mul%FCFw\T#uYRNYM
D9kae& teG4RD@b%Hy<d?RJ&>pc<1q!GpHt&Td@whY<V4QWdI6y<a<!NqkhlhY$XC&cR6yM:P>hV6>%F8Y^eHhB
ttS*jj b!BX^R@%$9YQW8+@4$HtPbpJd8bYZq++Y8=uji%?:L$#Z=FJyi8bbi+4\%56cDFFS<QBQ:DH+W1ImbNK
:^cekH m#!e8h4?XTaba#$BXPC96DAnjPu#aqRBTTPmiEm4:qV&p:Cqk1DQlcRLbKYJGue*bk:mXy8Bl1S@C\^V
J<GB1& @KGFAJKq%5e+HIF<MeEWw6S%Pdq+L9%iCu^c4qb#cc=516udnDkwF<:l=LT>t8\ki^Xp*eGLcldKbA?M
DC:JZ8 A#:b<V5&YmD&9M*/P!QEdVk\nDkCVm4uJJLj%Ni/\&1tmXHVkiYAA68X*M?>\=?H9:hQ>\^>^BE>YY*5
BPXYV\ ^$X4SV%F4$PWC>kEE<&6l@%kI?6LSi5InPLjp&XhQ\qJDPZY#!\M=<H@Tpiq%ua>Q!&L5CTK5PYRSt!=
$8h#/F wba85YHik5udKNje$5T@1uH\!u*aauI+d$ZcX8PCC1uW1dG1REV&BZePDGaabucZ<Li5aSlAb\d&KBRK
*>1EHl AXjDFFq#B>LJ9t\Bk@SciwRhtidMXuPdd$\nXB1TKImDIi#dhw\?EN1?=:nh@L&G*?pD=ZNRRKW#M<LR
/YuaHI Kd4^:95jDIW6wy65ZX4RWM+F#CVRkA8w55:AQ9ML=CWhPa=$1*yyG\>npTV=+8hi\9y?+\1\eHM:FTt8
lZ:H<5 +ji:h4t4h5XT$wcb5D/>tjLp\@aeVQ&1P@4H%M\YRb+\^yedEh111@!Ziai/@hD5=jeYpT6/kMG#b%+k
CZQ4$* qP8VW%FnWdA%KnRHBj>lQkqZ6=hJQ4XDXMAb@iG8>Pt6dVnR8BZ+4N^T*:R*6LZP45W$>L!IcjaitMLB
qYVL5N VK$ZaV9u:#1J!wJ8QC%DEYJTKi9WT/?TV:?N:A+><WwW1H/V1\>QM9^iQKdVT\C6+kRn9AXJhQ%8q:e#
Xa@c=y tkNy/$Qi!ZiMZAieLYaam8^JNPqli8AEm#qdD9?dEjWHt/S&8%$iKB?4TuwFKAHemEqPCphl$:pqm^Mk
FZ6=IM uBF1SC!<^Y!Y9DXZn!wMnA@u?L+%+C@&BGym*A$j1$lce@>t<>+wQSq*mB:HRinL>$KG^lP945pMD\8+
b:qPBe ZSl:dVhmqC#NueiZuPTZEe/&pQP\D/ut=QIEeH1QV!kRajL$THyVFqp?cP%\G=kI9GC?@VD!Gi/p<MKI
BWiWSc hb*1jl>+Smb1Kw>&:a9TS6\DWEcb*bIDK6kPpbm$u<M$t&&FeVqTKt&<I?%db#PDIMyj>aX:u$<SwN1n
6y:6ab S+M!V</!<pMlqKb!&k+t1hDWXFMP&:p/W+9<%8l\ZJHJ?BccbLq1ECH\:VnF14VnG<n!Fn*$WV%@CIn<
^iIcn9 BG5kk9+&89PpPtej\BDJXdcZ8lHq&5X?*YB!>VTRR/d*mN^&*MRp^4=Rhn@A@M!$XjW</ln&K&:=DqMq
M1I:FD /ewW\AIaD:FqS&%^dEqbAF?M:dI4dPXRlhD6cw%i14W>8N+:GZneck>e6bX!iCGtRV<J<N1<6N5tX$bZ
YuWpLY QbB46N>Bh#C=h8mqh!V*a>hZ+D/ahyK>h1w<hGb8ha:%S<lDeBE=6cLTidpLhGZnk\5:*w$^a+JtkK?w
E9+:Jm 4EHAyyK&h?@LHPq@H>=#Q5Q$wVc\nhQK?Y&wc8:PyP$?ban\ZXdBim/XhCle6!e66#@m5Pe?e+=+ZP$q
Rmt/T^ D*nRLe#KDW\%:Z*k=TNYdIjAHNLQ?ypcZJjj@KbpMuhZVGCE*E@?jlXPn*HuLS5%iTA6cb&+c^H\NL6E
ePb\u# m*@RSbnPP6l&$6$*IZn:PIV<QMS5SFT<E5Y<NnSWT+Tmq/i@l\=8W:=\VAK6*cy\WYSd95l=DM+1IGK9
t\6tdR <9Z8ViS+SMaAWBC/MYwhNbwGP:4wihEAKaNXbdFFC=%\c>^BJwqlPhX?QeX?e=\KKqA+9!ypWQ91PdYE
h15X@P P9WRNW&\aaLqEnVCcmIF8N#mdSK<Z\X$nkJNe<XA55wRdkwAM+Wjp>+KqY?k9HEIp#G+PjZkPh9/h#S/
$<^E/F hWF/ZhcI8QTB%R>Ctl@<ylmDV:58>#Q!X1mlKDPXLqhwpT\6$jh!4h?nPthnM5BK81pFHGhQ/$uC^hTj
!=H98G y+6eMuPHmIqPh+mXXa5mKHQ6c<tT<PhVDd?VNM?j#m*k=^eX<lYYjF<I!nYtDcpqM=JRthhE?BCHpE&4
&t6h#n Rm5t6KhRQEyQklt:d1IaLD=SZB/QMM^whFqGM/GMMEimI1ce\/i<KX<i4%!?Mb&WLh#1\/tKCGB$6c/5
Jcpk&$ 5/#e8H$=LKa&lKiPRy$/MAk#LF@6Km5wY5DZ*X6nyXqV\teRyCC/!??QKQ>idMSATpM*@DYt5&+>mL9i
1LpKV^ bdK?d6b&F%q+!Nud!mQC1d&S!5L\%&jJkNu@Z*&YDJn>9^9m>I@pcQ<\jQ#h=j!JIW=knn?FPQ%NRjc#
-AyFp! 00024076364001202b4 Page 107 of binaries2.zip
YuIZh+ AQ/qZiRZJ#L<dm*/=&mqS*V$9#mS+X@SLK!QcF%@eTLDL>wGQ>a&^%QRn$Y9@PJElu>F5+Mi$X#?+pTG
:ByZ<t Z/BbHyPe/\qw$CPuRaA=tJ?CBn&mw?hkiR1c=SF6MRj4E>B5ZI@aSVmi\nW&#5jRV?EcG>5n>=9nKX^n
/iXdbI jiSkInDHW:nG!9pa?mqea**$nn&Fc+<dF#m+@mM+=%Qa^9qabB$u!*?Eb9&Q$E>l&&MbB5GewQ<I@cTS
hy8bWp :dF^pjMydAP^Q6a&=*?Ejk4dRI@bwnmjNLK^Q#K/kJu@E<uBV^4btB>D5@=H/CiNdI?e5RMGQ&qpi!R@
WI>YuP IjmQYj/i96:ka8d/q@WGF#Q+1a+YZM!@DJ+Gk*>=aQ99nmj@dLqu@m@H?ZGS5Q+WG9S#F9w6K9WJeZ=@
Mjld&k VEIw@+@4?ueLI\j#d<iX5@#F>iN*C?Q9wZ%@6VD?!un$^@TE9/4*:=bL=u@W?:8^<4h/j:><j/1Z/^hG
Dqk4h! F#c&J=^aD6NqAPlEaMSDFmYFmp:DS*mBDR%=#mYLdeaXBJeZ=Ld1!EkIB?^CC$MSBBGI>RyCNA=4e<Yu
D8lDaM lXXikHn>qAND?:8mwitL&GGR!buN&iH+RaRDwyWCqeQtnQnl1@=C%1?k8ZIFDnAGQ=pT1KJmIdqCb1$<
c:tiJG y<aQpR\whMi&S@BjMwlcqh>?^iInqn96EDR8RI#ZRcppWhj1#Qbl#l#K@Y%=MH*9SK@DYW8yE!QB%mG:
4R?SZ= 9Pw4bD$aSH$lCL@#HqWeC/bbhZh4iSZMWL959\apHwwKSR5MGdW\InX1Kbn*t%Pnwq&VEc%>htpBJZN>
WMlTFu D^<jFKeteP+%@C$kpT6>*i#$G*$u+5:=XmAiY8X5Bp*<DD81JDpyqqP%?pW>AVQ6iB&Dq%LaSia+@tEW
K8/9tq PbQqB:\ACeVNSlb1Lj+J>lhllD@aP\8*Rj+9k9R^pWiCdDGS%1B=uwXAknM^G:\B\=\Nw+*<NGE=8I1E
@4ab:A MCn&ym6lXTBiVLk8<juuH!QPmSGAmBjGPEB/@pJT<TPCyMw8CQ=<dllGZu*t5KPl=lN9mZHLM&1+G@5&
dL4lBq qk9YP>!AQhyVXGBY8*Xm5jWG:^%dbcEh4TTD8ApXZ=q>IYcA@M*+X5ALaVB8RFpi*KdwKK1CWL&!iJek
5cIVu^ y/?jLTbK?LD>F$WF6yCNb9tcIpIW=!DnqRqu<^=5=W6:+<XyYZa1qCFq6^NBFbiTTHyXA@+9au+w#8<Z
E:/mG/ by\9w4Gcn=WXWCda4:kEPc/JQLntXbThMQ4m=8bSJuKGiZVDe=C%WNW\6$d5hbDVhNT%4*@k1Wea8MAV
J5FMin LRlK<^DNaiY+KAyX>eR4j++*tXh4TCI1*BT9kWTtcP+a:1P1R!builYAaHW#P*6yE+Dh:dJwwn8EB?PQ
%>bwQA $8%Tl5@hGE*+B4NlnV<4Z6QJXC+YGwyiTLS*88VNP*<enFDlKbpEK#V@CP%Z1N#1Wktab8W6SpTS*LRa
RLYnEL Pj:+Mp9LCp$&tI9C!T8+/^P%u^Ch\bZ*Kb5ww#1^Bj5i*$$IpcdJI4P+S@qHWDm89>58:T=eP:X184M@
c+GN91 E\*:GGGB5+X*L:1JqGPDm1u#=4knSh&>=q%j#>!hYI>BwX5lqlHmMReM?<JZCPHiTb5G+R8DmC<=$QmZ
GhGVCy XcqP<\</nPL^#?XTlZtpwum@pqWa/X=XjZEcMF6kRPjidHLhiMPl1S/:&\TF<pQMiGqW!hPjRE@6YQm>
JV$Yu* HNG<%XFnN&6>W%*ia4h#@qlmp+CXi@Ih=CjPVlTmI&6eLR\4VRG<^kDqwMSqnF\=!1ky+6!wHCK8ekTD
%:Ywcn h8dt1alI9aq1lWIH6LbydTIF?AbL/uiLPWHkpbGYF&<Cq58w^@u:I=wDPZd6=%?yVCFFCE^!!G6nbq&%
j#Q9YT DtWh5P54\PAI84%*Rj*Y4iwh^F8VcJmZaW$JR^&?t6a6D9iC6wFDtlInB!MC:kXBt^mc<wyIk9MeHp%D
n8<W/e 5KTAe>YF:RZcdW4klC!=MQWB&tKZqDMJ#WTXMu$GMu\P9&uXNGVAj8RM%CB!y4eD>%bA^C^dJcipkBWy
EpBc@u <$J?lPY+y9ulW8wAPkJPLb\$qX<GJ6!>$ea64M#1NC/W9Lc?W6EFj?A<QI=\NMt1R\+R?l6@!4YlA/c+
ja6Gn$ BZJH&qcFu?1XkMCk5BMSeW<kbiYC6ltH?CFLW/*>nAa61^j1*thRu?wa<9pcq!WHF$&Q5QZm\yeW$>Y\
t?:!8& 9648bDkQT*:@8!nK&wXa8BiCNK9d/lp%#<*Sw=WTKjM+PqDq5XX4/NK5YdTAaMA+Nt*q8\KF8NL8X#?W
4LntnB bdC=ECEmZ*^?RaTGYK:IKw:h+A:Kn<b%lpbPacuj/h#RKR+FZ/AiVGKhLl6G%?nKu/FFy+BQSkXGPiPp
SdeATK q/yV%HMT\pXku4ERVd8bS?+6#55H4ZLDTpdkV9PWI>jSy4KyGPjwbu>CbFnIXKb+wdBi@CuT+S1tA$wP
%9Z%\+ 55QH!!nTIlPY9R^u%LG\NGBLp^+1Iw@I=Y%Y!H$HDSbT+/JR8aL=Idk<=h!FVFt+NG4@lT<:i4EKJHGX
/mJG1E jybcN=ThCV&Bu58$j+!1FCDmeKE@>B1jkcePH6bI^KeGbF56k!mpu%$/LS@$dtTWikPjnwK8N1/qlVBW
IN<Y&9 ^V^/1V9R14/P#uR@/HDlQDde^:ZE<nA+D<5/p^XTK\QQk+l&SKdkRFK$MAY>juZc&w=Yi&M&NX^8\5hQ
XHkyGp kb*tc/EIkV:B&+SYtakDQW91cV4Y#FcH!eJcttcC@eP\yNL$pqWMI<5V*5TI?PVFL*e\%FVP8T^mWauQ
D\4Yk: LSRCyc6ib%A#?<q%ehJHF5EuqP4:LZju9W=c1!#I:=%YD\:p&5<?qN>>h$8Aaa6JP&iLW1ZQYSP%DJN<
BY^K^j Y=KKYEQIJTpa%EWy</:kPV/B@TlBichwuEYE+lniAi>PnLZM%Na<qdReZ?SLAD6qI5+LXTwtl#k/V4lp
Ric45S LhF+&!<h$H%&XLV4P*uwt?Fyp!F>aL!Zh\iSPXm>?m!#4N4mq\>411LYiKSW6cl4/iFDqq4J+^5NLZCP
+a6Nq= /<BI<FwA>ch$Mk$wFNhRYt*5^S\#jiS64<AkV>GiJN%tk%i8kim5uGSJu&\&jIl%#CQI68I/ZKQKIH8T
A/!1Lu PkXuGui4<a?iT<Xa=wHmBY?aiFJD%/bIb*1>&i&Y6&A\5=&AYLuL<pcP^an=6#bDh:WNqDnI?/:em6\6
>/*1V$ eDRJZ#5\BW=6/WchKtS^\mA?DZCtD:VnyQMX1i9Kd&W:!:H8&dQ$beb9$=#CRTRu\:SQSbk/R4?Di$W4
#/^HFq B$?CX<WN6KCL<$iIMNEWjSQcmQ^BT9p#9GKJMKjMC>qulhT8@eQ+R9E%I$Fe+pit6A%JZ::hL5ay6RYN
lA>8>E pW<qVlpeMQQ1S?h&4ceZjLDeRwikMd$GI&tEVyQ%H:$n%HW1VKQd:VPV^/:a5w/TtiSB:wl8J*B/G+E9
4Z86tw !jC8jKV%1&1t+<nHl6yQ^TSj6%aR>SiEJ9AhWq5nnqjCI+NQymC*T&=%F1/MVc4\#^PN8RiR$ImVlb<n
6uEWbt LL\KiHYLN^wpVQ&PkPcHRF/6YK=H/JkSNqTIyTR/mmSYR/#lkF5jSKIlLAL=m%SMB%WXhV9p4<<:GGlQ
PGJA\u DG%VcyG@9k1@C*&^mWbW*<!je:Twj&J/VAT!MQkp+$dA&jyFAP<&ae#H4X9Xn4m+=MeXW:yYKJ4S9W8N
>F?XkG #wMy!WNBP*^iw?JiIVVkA+I?Q#u%NZuPAm^$4!FWp1Gh1/V\hhti:Scb>lyWlAd\Z5tMR<\ibEZ=IR!l
j@EIjP Yp1pNF\pVtiQ6#eMN*!Q5nZQF>4EWFMpTaEm#XRCyCW*Z8uQ<R#^Yl$lRWNTEL\XJuSW1kjdnuK14:%X
c$X66I Y\tV4d$X>acpX$5WFtw4LqA<RSWi9$#5HSCt>L9@uHK^w$Jl5RK6ibqW6diEM:86:Ne>lFSj6<56hDWn
jBbjH* N#eK/?Vi6!YMe@=nIcFt:+@F&q$*ZX$ym5*ly=XJb8%lPnZqN$NF4MWXWN*5X<Wwe6?X=J<>c$Ld#qcw
lSlG+: A4TFm>/MpiVtab/Jq<IKJaV8ZyQ\Y!aA?K>Z>eFhcyCMne/4<tBThH/whnqdMknlhYpLb#dTLpn!P/48
ca<$yS a4leRWYbh85>jI:6W6Ne%:Ze>4$\DklBHakINm\HD>CEX/JNZBV=*d!961lqZDF6HJJX*:PD8#bEETmG
^?Y+AD qWZE8!Y9*T>ME*B>d%5SiKHSNlBHDV95FEQCY#8Qiwn/K%9w:uZ&HeF:$&Idn56M=&&P<EVMLepIeR6w
@EP+i# aHMc$Jh>:P5eIZ\HSVq:RpPF>=HnqJJ=qXw>e%wW6/4MyX*R>\dB\lL&PBAX9qnq*Ic?%&Z4TFHSytDB
8+!*RB TRaH&\?R1!RP4mRdEnmV=qHCcbKb?h4:=uq=Nulh:WQS&VhpXFlXyTPP\RVpZ!mHQ^MMCa1G9^yu&G?^
8D@VeG >CTS@BDM5NJ!69\eCd$$9QE5?4m>CPSc<wM?X#^YeZc$G4w%jF#Fea>RjI>lFIdJbn4C5d*Z6L^D1N!J
aBLHcd wq/piIDeJtk=@AC&tLhISFLaMR%E?pGC^J/eSj$4K^>q#lZq^ue1Fm81aDEe6B\eiV^1jkQcdX1\>ILR
J4JTFS ?B#:SJD8hlb^H:=:4&ZwF1QaYamahjbdRAHH!Hq?>I*=FBM?XC?E$K!4wKwEllaB*N*Z1md&amSS!@#d
<GQ%1K e=S&K*yLBBYG!NI/PuLX5j:\b/PNF8t<RWE%ydl1J/XZnI:9$CKE>9CFVkdVS8Rd4RRaFjDNEiM+uCb+
?9W?d% EXG@XSR&W*y>K:!G1WuqRPiBBNJK$C<pYmKn5<BkHBciKhAu\YT:BXJi>L%Dn:yAQ!E>PbnCeCBGHtcl
pLl<MN 1QCFYMjBm6bl&*Q&LyA<GFW?*&:*:Iw\^eR$=ihHpEGha4#uMJhFRjlk$1<eTn%4ET%yhTIahPTSFNTK
6:5jX< JQMGNlCMSLL1thu=iZjY9=4Tiwn^#H\&ENpnAAb>ElTmA*MZJ!E9B*$Q$&=La+lDiXanmF/dcKTctP9V
B84$%/ JE$AI@VYawJiF5WNB1C=I>5lI%9N/JPBSYK>mY:BnXajB!$D/q^/5j=4P\EZ<@@TV9C@J?5btP5Z1wq@
JC1CAB &SB#Q1da+GJ>A9ySJj59pyu>K@4S\IhjJDQ:^Xai@IlC=^jJ#H/Bj8SMhjA9pyu>A9%w9#tjkGb:JBWc
cXHLG\ ?BjJ#H/Bjp#>>+6pb9?Kbu&pdc=jJDQ:Bj1SjuM^Q+X44M!Qwb@C6Wi%^X#MV!HdQ&6?@wkG@Wjwy=D6
mk^MPw 5dSeZM^@#kn%P@dj?1L@4l#/m$du>+P^@%n9Q&iE?18cT%*P$QI*nha@>F^@5XcTMMpc&Q#q\<>SmEuN
!+\HFi \6nbuITXnbPETh#E\5#<N!$i?&<KL\6uJ*pVS!E:G*5:&>?Wi&ATJmE:c#6HJZ5Dw=>waSNZC!MVMWeD
iPCn=m >:<4pFmaj+9n?d5GTXlI?SecyIi=l&MAm5BQ1W$A^q/Au/?HSaARAA:+&?9uZ#kpPFk+JBREPDkEFFSp
ME*8d# bBSpbFR$yJ>@WbDRu1FnaGKkQ<QF^ejH^TWnJTWqw@4://EhkAkHcAIeRWCRAl//AbM@K+cF?P$F?N5L
Wc!mZw GkaKEkkBkIYDS$BEBWBCREFBRpMCacF?@wF$kwCERwMG\L^Ab^FRAGIapDy+a:JGb<FmXRtThTlP4LFl
/C*b/t G=/TP@1eWRmBqGK!1+&eP6tF1YJ#cnl\qI&h8!dZ+Tl>+SF\<j#mSES#c%YuXKn^##e881e*L$%e@PQ#
m@NhWQ /uyt61=MZRMT<86:b:i9PeZW#F+HJla$>H*i?RwYX#h*C$w1dP!j&:&l+bLR5HAQVm=1Gynj?$dLLcqy
JAaEuV /SGTW6\<8LB@?:AMkAa<i%kA\Q*YJV=A%N+4yjE4<i$EGTdbLRLS5HPN$lmiq!%5Nj%d5/YcTkHE1<lR
-A65?+ 000265e254c001202b4 Page 108 of binaries2.zip
WJ<ZVD >&Wyin>I1H+wn>\D^9u&=@MiAJPRunQTZ@+@<69DiNID\A9$:Ldi\9QTK?NKmjMGm9<BWGKc?AARl*<A
K?Z$cy 1LB=@p@>!p!$E@<&w/A/:!k@G4G^8ETh\YK!>yt*y?A*^B>ZPV@qA#\AWm:i?=@njD<Ri\DpRn\A&Lh@
/jp%lG IG+!jb&N@FpF%L%Xn<*h^<*RywTXqT>m:u4GewYF=FibJYEa^LF*6emDW6pYw?M!i+FT+6MPLCKM??=j
JFLEM/ w>c5:%ZP^!>E@B5u4L9qCqd/V?FI%*Ww1%WM\bQFSEWZZA<V1d9TA:u:6u+qNI1q*D:$NwZ&peQZVFCj
=NL%&i /mP#6Eae&DNn+MMdw#e@CKeq1Np6X&SQ>Gwq<Vb=N>mj&LkS4e4S#cj/1%=89HEMjeG!$1J6#GyQGId1
QY/G<P W$j8^CjaJhiG#9\ARNSw5a^ydt:H4BS6Rd6naq+jJc9uqh%IjRj4119YpMDnjpL99Kp1alZ1h4nEdIVV
tC?w?w ZWRiE@L?1:&$y=tq&uyH1^:pP<b?8i<4#FFeh#1ElRiHNCE!X#+KbWhpjC%^tJh><&HNVKRY%$qRCuIF
E96+cp LJ\m/c1D6CZ?YbHZ/9XZbh\R4VSY?!P$H9WPyjS%DH6uJDQ%9K%CGBIWMXk8%SFqlNJ!?ZAw/5ECYBYh
8DpGWH 6TSG&Vk!6PRJLLVwLa6Be/m=J*yZ%Rh$W8KH/?b?bZkWAQ%Md$Y/C@dV*6uN*q!L5<BX4kCBH&6L+=D9
&4w19# WYFHG$quZkwiPJlHn>MIhbldbpbQu@Tuahu>tPEB&4<TCILmi=k<cK4SS=dEQhahuZSG%^yn!=*k&N>u
BAX%Nu &I/mR>tI<d$$aC#L*y&XM/:e+\nFQI>4cuS:KSIMdd8^JyljQwmJj@Z!NPTL:I!t?pdG+C\$1IXw<np6
ZqjW#\ qp!TcetR=99#uYC!>\nt*NnLC!6cG1uSY/Gec\WDVp!*dJANFynuH6w9BTXlI>nuby4i<1nGMPkJV+IP
1?66Q6 #C9w/dQ4t!K&=<ku1EWlC5L^@h<KpDFh9p9I&$cee$F$dk4GtqhWRaKAN&8E@YHp/>ub19YV!!wXh!F/
kP@El= i%Hy?8#^q\uZ#%X1t\S+SD:X*B?#K!11PXi\WJ/eM9A46tGk^aJ=!:btA#ni5W+5FTe+?>FYpVpY8/M?
L*54LR <:j*HX/RVe=dMbjLZ?m^uN^H#e*Hkl<RKqEwPtdX9H&Dq=6CWKS@ye/VVW@QBc&?@%I>9ZWR=S6Gw%Zp
CGLNPA &c8$DHW:6j&G$>5:$y&?!@A\QdPy!+M88=1Ml/pQ:91>>Y4=m6p5=NyDT8G9<1\$Q>en:GRDIQiqM/&^
qbR+jV ZPC>wNwl&AEn??b6X$/i*+NGjn/QF^+yVD?$9>!95*uP9F&/%L66c99SVjpAKL+yZ6/N:w$Yi\%JdlRC
yH*HpB uc#18%$KQ*S:HQ$AaDn:?bnK*Z%JQYkY8&9wi\BI<F&<6!9jI#:@R9!D@AE\<1*%a/:u$F9Q!>kHAPj&
+Ja$+X j\P#Hq1$J=/qi4*$<?uHL4md!Zma*6jLe&::b8N:L%y\NZK4J9WATJnn&:V$%K/adNc:1?>+AJAy*c+:
5+K/it /bq@li?WtuN>Eb>kH=d:Yp$W1YDV+btT!M@dq9wAYBK%8/%Iub:\*N>?AH^FT:$9&d+C@cQL*=y&na9i
JQbS&5 uFG4I1F4#bNLFt*CT%CakHmPthpQNYXt?tc#blItVcF=P8^S/\VDB:uVP^qu<46Rd@M1jpnZiE+cQRBt
tj<1eS 4L<w%#$AmlL5d1W>d<6T>^Qc4ql@ZtYJu$PZTuYm*PS#N>NQ5?G4DT+J+J&tdck5yFK8@8pq%\Fw#uw%
MRV+#b =L*FJSE/d<Y1=11CeM!$\CZQRa$C#%//B<D*w4thl=pEVe>B64Kja9L6R!=!w%nQ%=mPyHL<>nd&MH9W
HbQh!b >QhQuV>WSaIQmeIBVRVnGX?XY*FlhlKpRpGN<SS^9KXI=9*kPBCtJ%LIu/4@@F9%:I>WQ@=Q%dh#S*=h
aAZN+V iH*Z@RAaVubITj\?a*Sjt*EGFSWc?W$KhHLV+@pAePEljJn+a*$+&Kh*4MFbYeViI@&iTX#ckh><E@>R
&AJ%Lt cHy&AW5Z>RBkh9#&5<V=+q=@!=F+G$Z9b&F:p&?a<GH!KP%j@:j*B?!1+$%D+FymV\5j$yJY%?uk?ky^
iSCPnD kN:Q%6ke:J=%$aY/9eiFXaCYKXD&:B6@AMT!4u5<K9LWH$StWyk+SE1$8<YRVdtSeX+:X8#wQ1I9H=^1
Le:<IP mcllR9*CS\m1H#?JmM%b?DT$tGyF@TJJkIF/CCEH$=lC4<5na8P6+nPtFTGT/D14Jk6!SyX=6*k@ycp=
LLq!%K =I#4FwiG>^wJ/>hTN!+E1SattWaaFG/HL%@&kPX6/pRp!m^E!ty=Tq^N8iPHM*9QJpYB@5uJ&y=^YWYZ
6:aMRF TIKjBYc\b#I@#XDEh+tVSn@DS15TXVFETKB4Q*/hXhDK%jIJXE%jWdnELKFy*5yZM=wb+n59k>QX:m5>
6?IA<% @5%X^V^$Z+%NBG&4a^NbDj&&@h^Y#Pn$44=ui<I58pu5Hc<!c##EAHGLmn^?YcMk:chZ6#FqCjH5PYR9
Xa<qw9 N!@mbKHF4%SZYyL\n*qFu/&8EAiNhLV\wcZ/84$u+\Ti*wq/Qp\j*BF$uiE%ekc85>udQi5&@i&@i51m
>pt*\V jap?G6MN9%K@AGcc?HVP#5Q$hMhw/*$5!ym$RKV6GdCEE+VXZhVZpSywZ1y*ZVBNNpG81=+/WI8SnHS6
BC*LEI ^@?A*Fh$6uW$Se+NDH!h4>i4P5ynSX&tT@amVkIWW>QdQmD\CbJw+MVu&FqGXG9Q%1DNnVS/\we?=nt9
Cwn<CA bM^k?dD9tm/9&>qT%Sh4p\?BJR5jySkLKIbDCyYtViFG</TApqFRkKE9S&4FJ?WkBpZD9p9jP<uyDjIJ
<5/YD+ 4%:XcHN$YT@t:+&ZZT?=B+@H6SFL/q6al+*D$!A/\KS\:V4%6HJV\j9qWc$b=KYFwa/$l@!RXXJL1&<Y
D@u:kQ T#TPD^QkN?J>^eXFXWG44?e&8Vj8FWh+:qu$HkDL5u%<9#*EKi=t&qVXKD>Hw#:@lkDYe!tP&/G8uN4E
PAybpi Ewcl^TGKbDjK1/*Z#?^Lw\hPT&#PZHy5Z6Sw/bBwk+bil5h@19Y&ahRMS\%Q>dWH1PSp#S&F:p&ay%k:
44bE\T A4/GVa1T^k>#Yy*/nKlp9/XcQ*VAA@%AClbte5hNFkS#jKYu^1jE@DFZ<FW9ekm*&VaTc%LP#5tVWJ5m
y+:u6j \8$hRj+X61+i9BE^9?auP6$jqyScNkm1yk\iZNNkLjh&@TWJSinuhI5P+&>JALF:K>w8Wb:=ShEcmLp+
HNXJnp CQ#8/EcTRuJ%?Nhubbd&hk\+W=h:4tLFW>PLT=>Vjee<yjVhMS1EG9QumBl1!WqtL\6SIAued*^J+hK<
*l?%Y! TImWpb6S&k%KQiw#MK*REV>RR%dRYiYDu6NQ^L^Qi:%ZRw\aiT9T>QNl%GmVWd@S>y^pGQ8lPHJ4&hi=
6?!K+= eS>6/:tjaDiq?k1H?DLW/RGkZQM\8=iSZ@1YpY<Qi?i?!QRH8>Gc\<@qakQjqSVuI*Z%qF$69%SQ8G%j
GdKjhj 9Nj+4V/^ZP!AN<HI@y</Em^MMGSk^1N>Q*KjQ\AE*wj\j%hj$Qk=9BhQ*R59i/:\\i^^a161JnXbtS@J
clanYq C=Cd&Pk*t^tiaNAaZIuZQ$<?ChFPyVuJ?!k%9!1lR=m4!muk4Xmu9$peXu^YSk%lF%A1!#15Nj>S/qd!
+RV?Db &B&!wGB$<8TwTNG>Tw&?FAL#Jc%F1$4u\lK&YX9T8T4tG<S/RLKtRj$ZlHNm?FP5SY8&1Vw/SDV:=@9:
FTebA4 P=?Vl9Pq6LLqMaXZ/jAYX<8uD/aa9&6XJpmSEe@CSd!*FTu4/&!NC>XbQ#MI!46$Y6dp6#X6mkNXnG1>
I^uh@I dwAAn$MMk1eut\kdH\B^NdIQkDC%u^PmW6Za\?jEPdKB4YXVeHV/HLW!9$a\B<emkJQ1YWTD95TNdh5i
*5qmhB <PK?$ADakL@@?jw#11Ytj*!6klVT1aDJ&:\jCkIpyKlRXIey%1@dZ*5\lC?ZJnn8N*j%<PZZPNX>bBhj
+X$%\d 6ZyQC%Myn>@TZ/D>injXeC8m45\LwA!=eHlHmt6\$/SF>E%wPFyt+G5H6$*hy@Dy%?n:t8tD:V9nEXI<
b5Zm@@ C:k@+Mw/B><>C@QF<$Tw5>A=jRBeLkiiL*6PI8@<pB?=6i*/>njyVH>\G6\%/F*/89<pB69:%My:4ayd
%Gd^j^ kbcjh^?9VYdPp?H#D=IX#^tpL@tHjApH>%F&jQ5BhqP8^EM8Q@uCtZEq^Lu*<hqY<<?6B<HadXd1Q#Z!
8:j+9n e^:<TdL@K81jSVQ&5HJydt61cy!?ikE>JeVLeV19J$4K<S$cY1T=?Wiq/M/:!4ycCX%1Z/8F\tSF<W&V
V#1KK< &ncEVmttIlY%TRy%CRpB<yPVX4!>iqhXn+1>%I>Hw5i:DN*mFTb8bGlnQE5A#HabbT#bV=mG4^M5*4m:
y?AZEQ k%I?=GDmMJbYCbpX9lBYZ&G6R:9=bMuL*Cj=lwFSa6N1SQLpM^wK^9^!9BC/QTX#jXjp1%#ue4#:y%\\
?jcbmk emdTV>M&!M%!+kqKbFI&DkkSpwCdkkn&Y:4w^Z>bB%lm:L*ZtdE:m6e$%+ZCH%C5+$kIQXMMdH*?VtmW
STY/=Z :*!?\LM@8G&@*K:R9i>iC*V!Da*#l<4I%VQ\A&DINQ$BRQ4d!1!yNY8H?J9%XN8t<Je4Ne=y*w&jT<1W
*EL#IJ %*hB1jjF&:iBcb=d9=E+G5N#S98L@EZpZd*Fq*NT8>8T%Q*uQ+iBlJ>D5LDM#!Ya$@>Im\?Vi<V@&^9>
&iWpa^ d*c#t=Hp\8?bdeCB4J&8uDm^1E$p$PMB<PbiqP#1!HZ!1/^WTT4BS/&D\Dwn!^k/PuJHmi5WWiLnbkPb
>BLYy4 948<u+Ia6n$At6MnQB?twu<&SB%Sh@?y:aiR^w:W*^cHj*q:tQ:DcqTb=/XQ4+4/WkmP46TQ/W@KYD@e
YTXMpE ^MwZB?\K9:*FkBN/8^QGk66\Y:8aEX+b<ijb<6<%M99It6T?bQkBeDb?@9Y8n??HpF^$!S@=?Quj%Vu?
ub^ECS */6#+k>%d5aeDH6$w@MS9i1\?THqF/AXLtki4GXtQ4?JYNAj@VqR%t\ue846lpZlk4w&SW9YThq1E%wl
c5!W9e Qedu:SdEiLu15@k!YKMyStK\q9R+%dS6nqWkuQe+k5w:@5*bNMuQu6bwjMqqN5j?8jWZhDWPk14i>?AN
iqJHmA ?41q+65/Bpq=nEXI#uRGBc#N1SQM/lywqyAJ>R4V4DJcck?:TN>SDp:X*8&XFZe5^NJC:LBIQQ:?n1JQ
Ee%1nD =LA&Sc%c*?yjpQaS?ZjhZ&Wu4kE1<L*MQe+NSIn8*&BHkwW:cAy$/NnXT@KwR/q!S@whhd*c>Gyc+b58
+A<*TJ !F&H>/>jI^tX8eHaSkjZb*$^p58<lmY&&Ic4wFDj1E6YCaYJV%!>EW#9L+Qa+yi#6?</$N6<##ij?18*
$bPH=Y nIjJ\#dNu:8+5@9lL+?<K>L+?juWF4ShG?n6yVdEKNmbEIkRXk6ZWHTIGlHk#y&yQ$<6Ppt>4M>=ANA#
cpH1k= i$+1QRDtPSlMm8Xi45<9LbKL4L54dCRN@FkW>WPhEJM:AXI+dE9^cDZSd#Xp^Jt<B%$85hdR9=%SCM$I
d?REyw d=!KbQ^wE#q=%&XRMt^aF&GT:XF<V1%meQ4n\\Pku8h%q%=k?+?j6ci8ujJ=Z85VmZ/wV=j:bpF<d1yN
ELW^&& e<F*=<#:/RHAM9aApJ@c6Q\Vy@@++K^FbEFu:Np^yBhdjFdT\h9/eH\P6pA1#!8ZnEc@MKk<+#GeVRpj
t<y/Z9 &@$PuAV=GVwQYVDI%@n#:+4:jncRyipSwS8!>%BiT@?$W5T\PdFpWaJec#+C9T*j<!WiW%/=wQN%??R?
JqDdVa @6k5\+T#9::=5dVZKYE<?Z1Z4RDl8I*tP\B9<$1VHduyn1CyZ*@S>$CMq*CA^m#Mye@9=^k1&LYeTd?I
-AypIV 000990d6cc1001202b4 Page 109 of binaries2.zip
HS/dq$ K!Lk4MiR*q@&1$Z1*BMHNZ^Z:=9t:WRKiEtBC=RV^@PJ!Teh?!/5w4h&hGe94NbeGt^@WkAZI4?aI=/Z
6mA>YB WYdXW\m*&DaX@8cHkRqe5:#=eHXBIaWt*DSV*k9Cp4Ma%!Ny=4wWDaM6F=9hIWXI&K%KHk\=awV%Gd&6
aEmcH# P%uLm9N:Kp/Ki:*8:iIHANP/$<<N^6Y9juC\Mt!J:F45k#P=Vd5aI@hRdL#KE*ZmEhYatCh1LI/mdW?#
/iyNwF !:N:AKk/@=!ZC^+AKjc/MdNX?/R9Cll1^=DCawKq&!BdBKdYIiQyC*aHt#+jq6ZB&^nZcqBIpPYIDl:*
+4n/jb NQdtWtNh9cKF1YB<ETtyY5w:a9Cc#eM%HKeLL*w^ZIZIy+RQ@++>!yp!NXd&1<Q&S*WycD>PLNQN<&JI
:yMFc& dNYkB5@AXT4dn^A@b?!FPM&kSl4Eum9*MCV!VHI@CT+A@PLGTjm$?FZ6Wh9G48hA5u*B9^%m@nkW49uj
NFu=X/ PXb<6mY@#iXAH*G$%dq9&CMJWiP*ViHJ=hePd*%iANR<pMEPN/D+pFJ?W6DlkJ\t*j?M8kP%T%eF@p9Z
:Fj:VG &qpZ:yXa:IEp9jEXR><LaqHQFTue6iHCJbGlC1GkX%Y8McJ6&dq8<$XpFc\K:=?FBm9w%d5THG*IR*X6
icPZ@Z P:B9>ZlN=YIIe+t?J!**EeBkYajZXE5WWknqcHnh*>559VRAIaGm/qhJumL9pFpSiVk6u!BYwSiNqm1c
+M9Z%= LFSLP>1!<KGC?cVV?/aAaqy6HT8j+Xd#G+Pm&iVe5BH>cbFqwKw!ZcWhiyhuNWiFtXnJpkTh&C&nCn!h
&GS1\? 5Ia9RJqbJFyKRb\Q:YD<VWmKI*E@H@FBc6T>\M$DRH5y<Q^b*?*&Jq@Wi::QuC@8jM@8t^=tD?=?<ZZV
j+9w&J 5$*m!K8i5mSHQnmCN#?^+RN+nS@Y%e9R%D+ui//WBP$4mw4cwp&IWWIj^X>JiG+q<?&^u6!8ju4^npnB
6%b+kn <I&^&B6*DSPMEScI=/kDE5&Pt!k48K\ZP6k%LanY8LthKNI>tDFSdb%8hZIuB*Jd1m?Lk4Ze@ZReJWw%
HML>bt TJZDh%Kn*N\GS>CwF=%W!Na6ITR@^JW\<w:6acM6$K!Z#mRwERpPVnl?S/:D5HQE?a$*pZ5R>nI%m#>$
\FTjNN nbAyM^tE^daBXHaS9kTFGX<5FmH8+@k&l^8X6n%9h6*j*B6q*GeX>M@<cb:?+*T*Fu:iH*B?LyR9auGk
YV^S1C R^Bk\/HSLemqk:uWu*k&p%9\@eVS+?h+p@D^bZ/C<#L*lE*?%BEXca\aQw@*KQmtCkKNy5jn:4T*>$A4
V=//T^ TiJ1mN4AJA\VJpqXMdwBZYH4SkkdC/8>i9qdpcchcP?pTBkku6F@eYJ:!awG&1MN4wn+4DJ@?t+Ac\ql
@tX&/w RXq^RaJH<DB5mLS98HnpPy$jWXDkaGMKtmCD8XDyT5y5*4$+Abku^<mipM1*hm!8*L%mAj6ny<dT1bBT
mE!<=e RGtQlV>Z*QZKLTScW/$huSK?4kc1=bT@lqk/X:>GHnZd=L8S9SDY#ej\M@dGC>nm+6u/qYTZEy>FEqN$
1k=D&l c?MDTj5:m*HelW<h*5mdD9TZN>$mIY1L$SWVN?6Ln^Lq=/L@mVRcHq@YZl1<ZnCMBqZh*!=PS>*cVy!@
j%*Vj@ 9qLMQc8R658^8d?b=N8D<=^=T=DD!&Jy8E^TyWTPLt=e/#9l5Nem%SMW9j?5/Md\M@iQtW?Z>cEFHwMS
5B$GL@ IbGE+RNh<aS8LbdbMpMPP:JpmT@Ccm<I9<186Cben>Qt>E>YdSb8KhhREjteF^Z6EnSHy&\M9%dAS66d
D!NRPj <mqlbyWkh$GpE>Q$aJL$L/^\lG*F5%n\T?^eHVCnKMlm<Xi%1%$q=T5E^=:PBBHVq\qHc5uPQd8MjkBR
L5^q9j tuSt5D$A?wTG9q\RQkC8pF?Jq9N6$W?%dYA>AH=MH#4>cd&#qu/IwZwk:%1qJb!!8\!i&pljk/jL>9DY
IFyXC& :n?mAN/>P*P:/?HF6\$dKwDZ9i=FnF^CRi$:FTWTJQ%I4WS/y1LWMISEM5P$XbjkDtwIWN>tIWj1q!Iy
#*/5#1 PCuP9iNJ>=iFjkCkY9wwQh8X\QNCY6LL6QmA>X$<^$ZYW@cTaL9/k9#4:BG=yuaw8R!=E>q5!C/tX&uI
N8*a5D XcHNhYEYbltEe<yKph!!^dMBm^HhV?@p$#CL^#@AJ4++njl^\hFR<qc!tT$a\BnQG?<n5%h>9p+6dbSW
9:RHKK 5iFV:5I#S#V=En#Y+%Mp!wei#>D@F4SawHj#PZ=l@@X4^1#cuSAPh+^Wc$F1^Sk5?+D\wRKF6XYn5d9w
I:*p\T 4/a:>?Ljc=\iAPV9=y5iADG9DyeiAAQE4y+Qp\h*j!ubit=Gj8VpP^hdV5*+SudeW=c/#wQ!AR<*R<Z@
B8aPLT 8Q!hSY&lDtWCu/!dpCT$4SHM*Gk<XdmHEb@E@M<hkt4w#&*t\RQABM\uQJ&h1uSd!qR\mA>QaXwhSFaB
<GIEL5 G<^9TJFw6Q<iq*SHjZ16NYGBD5wB9Sq8&TlcCEmdJ%Y=$c>e>*+EXnM>&c^<*+tHwI!qdF%ELD4y%YCQ
<LA8+^ AEq%tiS=CRIC\PQ/M@=&wd<j>^6=P6cEENNCDR%k@!jJRyI*N*aBHm=HM*PNuKwB$#$5Ee\#FPPpuEZn
*hG#*< 4\$=K1TqXJCP>I6:PVlJ\:#hu!%LVTWbSQ@R&W4=#y<kbJ?y%?@DE^<5P#6%J#TyeH9/+X<YR>JR:tKc
1a\wal T8PjGpF#D+CYYZjT^MFtWDX9nQD^5SSddVY/^L+ER!8&%jQ/bCedC\P#h?+E9c<nn6eEFSLA+\1NpZW/
?<X1:Z @ZPGHEiqL+eh6Qe+J#yH<D>%Y1KD=W>4\=cpR:+kba1/QkDwpG6HZl/Z=u#+bu9ETJ#I+?VPk=YDT86?
m?<Xc@ Sib=+QMAEFy<ALRhQ\D&GD%9m%I9Z:b>9#?=n>u=8S%Ld99j@N9D>F=G%6ED+M6Z#<6E9l@KI:jQ9@^e
*6q!XL b:=?AEn<=NYM>Jh@>/QnHuQ=kaM4*?:^#*1n9%Y\a*k/tbpaihI8nmBb<Ta&wPXG9=wc>I9>MiZKb&:L
CQ*C>= ZFe*<uw!^HtmDmmlKEnucR@uWu&:Vpi#LCV?p4cPL\B94>1K<:aBu1HC^nt1AYF1/DXjwWuI/\B8ttl^
1\==AV qPC^AwhYK9h*^TL8:latJt<eh4uFpMLj8PC*WT<jKPpWb:tihSHS<u\jwNISZLu6IWMDwdNjqyJ9y/Wy
eb6EJL tFBIe9Sh4YZ5>n<A6ww9j4<wwtI@h:y1GZ@yYG>4JLR@+yJPXZlVF1jV+VTh\9e^TQ5e6V45&:HEpBHi
pSKZZd 6QLe\lRLCkK6kWb$NwB><=>*nepY14N1HySF\P\q?9peVuVH!=95ie$t&#ePG=KjYS4G?iujD4mLbBuh
%tZRtS Kp1mTB5SH+<i=lyK*SNaMBw?ANBZTnRcECM$+\c^&tdNAFNbBWIN&8yc=6LDwh5<uRh>Mem!8pLVC1VK
#?i>H$ VlZhyZDZjZWBEXE>>m9/4iytSRFCSbJa:RjhF%@K6jFha^&X6R+?u!hkRdDnJS*&9l1:Y/$ak*pABGR@
TuH^\X AE4!m*:i6cpH\IlGY=iC=<!W<5<F/6+DaL9$!%yl&@=i5ijp#!Z4lc4h/dViqjMM*^/*=:eT#l6Ly66t
wjM@5X !+#LhL/:thR:hy\jP8^!6:Ib>=an>@ml>?WyBV?w=B+A:KaQAGTSB+CcnNJ>:G?L*l4QQ#Z=ML84>:?l
+NDX&h tj@:i&cWid/e1&c9K?Hm:pJSk?N9Y&/TnJW5ma*+k4VYt8SjXbty8/4Zu#%pC/#e:<>HXiqCQyBN9TE\
YTF>#d <R!%jE6XntPP?5*&B+N@k5<a%B^mwb&^mHNYqMTXAL6FQ>8:KHN1$Zap&pTq<#85mI9B%<\6M+%yM8nV
\1y6ad SVFlp^k#6K69>@RIZ#XPPY8>Tb&Ya?#HpSW9#$tAc>hKXE@BCwapDm6G#=P:dH@NYj>cZwPlL/H8tiR$
aNR6nZ mR>Y<GBBCZFbV$I<L\LMZ9j#G@*Qt1IB>HYI!K\dB@l?!NAeXZ&p%Z&RE1@*p4SS1KJJ$/^C>n<+BEwG
\<Ak#1 >G^NHZ>a9+XyqPLQ?KT4KACdP>S&\4XWYNA\BP$b4ED@@H/@h@8#@/E1JQ^WYJnyB^/VcIn9W6>Z>JBh
:#!SyH eSQT6&6dE*yyRN>VXceSRq&VEe4\q=d4JKAP@hjj1LZTtY$dN$?Ly4KHn?TPZPZAN<yCCqn6V9jy%R*L
<ua^!Y NN!YHZuFnuKmaD+AA1>a%Q*K%HEhKAYI<%$4GA+c>4<R9Nqiq5Ct4B\@*6:CHKMhRCyWFP</qc8$/8?d
bXG8jb i#<=&YT*++K\plD>DuRYL<ERR&1mbt=#LFu>e&b5wNQ>VqVy@N#I*Tc*KXH!p:jmpR&aq>GaXq!9FJy@
Ly5eRT &Al4KR#q*5b6%m^Y6E*EV%4CZB%1D=<Btid5t4%k#MQ#aV^y\Z%\Z@$\aWi\LYJ@I:IM9*NVyD?ieWb?
>N9=>4 TWDV?a/#l/Fq@VMqhY@pG/K8ZMWBG*LycuIu<hMAp@#y!/RQ!w5\X4wGniMMJB>P=BL&JddNBihu?Yu9
ZdQ=@* ZlTSQFiEdH5YLmI:k?!=udyLHp^jK:ZwF>W89E&q9MEkhc:yJPk698\^?SF@#ijkqKQStWqRJZYD%FTS
K+&ySY nI:RRdJH/@=N<a<d9YhyG$*%Ci8jJX9V8k?I+haMNW9:L!$hmnG#5AwL!+A*N:^L^HLVX*TjcK<HpXt@
1&&uNR HDBhBaZkAhSe^Z$X<>#5F6?/Jt@ZFK&WqZ4wdD1A9uJ5u?XRAtbLFaI>uE&lEY/W!8ii<*GZdm6a=C$9
t#cZSK *XI1h5J58@YYDp#yc%ik%qZ+9<+e<tS>&S/E#HmF6^P^QC68LE6HT@?lka1@BV8Z+#9cSn$FZ!wcP$E+
8L*^9R >$4u?4/WlVS4C>&AJjd!RLEQB<:L9Y8=it+>D1*<DA6Q4L#8:Y84IIc!DWFn$*1JLd=uwalG*Y=yykW:
5DL&LN eKATK@mC!ma&QXEKLjuAcepltDck*9cP+$hQjCT&TZaJh9F<h&6dip$<VTdbLVD&^uiL8cJDWXHGQ!$n
*kjunL W<#X&uJYp$$d$9%GpKycFBIX&%RcIu@8:PMCpjqpP^+A>A&i=!>?M8d9=b4*/d:*G4aQkE$l$^<<5HjX
pqbICF !\?A@wDBj^TH@qEe8ZX>>5*p+\MkGnu%<yD+jPnuVEqKRQiQI6M@my^:e*^dCTj*\l^&W=YiR\^j:wK5
n66#A= K@=ic96:/YF!n/>A@\GRwNZ&DZY?:S<!69*jKY:<Q+1J9?#EQ<SX?*6J=JnC:w\!*YF*/Q=Cd&nQ@qZB
!qQajl 5$pPJq&m>/QjH1dT6dS84#qp$?B8Y@SnB9uMq6a#FP#P?Xbnj\/^X>kQALJ:iL=!8<KGd<TuE4?N:dil
Yu&aCh un>*A6Abu#tu6i+md<l@G>@jmdV>uLN>=H/P%$@<<mClQm!5+9R6Pacw=6W%F+EP*$k59j#T5wiDCHtY
4iF\6t Ly=+*EWCF&tC$GlEEZ/#R<ZS8@TT8P6Z>ltTW\\Lc\aj9Yh=tk#nA6#<LQM&DWhWGRui*XuwXKuZ<nF*
a6\N^1 ti^JqNS%D>u^p5wym6mymtiL:%TR+Qu&d6Jp/4/#yQX<tPb?49ZbEKP59u!<4L8t9\Y9CC?bca\X<RH\
q1dH5Z eqk$hIZ=*hqZd8LpEB/6@SpDHK!kIh1bE815&QWj!Vn4G#PmZhi!6RiIna4j:BljPnt\JMBaINI:*L$\
k<XbZB $qN#+Pi<CbeS*:kYjAD<>RLid9<94%ZHH/@##/u\*%%:jTLF&aPyBuGlTw%R!WyYNi?\!AZi>:PASq@X
BdFw*^ qNH^Q5Kw^8kFe\G%haV!cR6AAi*Win5u>pJ$!>VG<+ybtQR4GXmTRMY1PAc85^YT><@j5V*MZN#@p!@H
tRwMh5 TMdD:B??/Dn>8hXD9:k*LQQeZJ:%jJn@qTe?%#?j%99*5Pdj@Gu@Q=6LXyElAM^jH<PMm&\V/CbkLc@C
-AV=?J 000e5fea874001202b4 Page 110 of binaries2.zip
jj9RPJ FTKT<<I4e>KYdd6w*S8CQ#IFh$eTEw1qVbkhp>AQlw$^qN5IM$!W%Li<#cl8&RJ8eWPm^my%>HA$=ZCq
^&R\q* jhNk/jmTh$J$8qtbRlC8Zq<b@ZM\nK:ySwy$kBlFKS#b^S5A:dJJVZTA/$h4$mPue4lZZ+N44S$#?A+S
NcwZ:h Mi>cpD\?DFSu<X99?pQpCPM^CklJV:MLABV^cuLa*u+GM$TqLNYn?EblepKE/1QCu&dK$@k#j1!GaWCK
N!KYqQ kd=6waEC*PZAD\L@pDLYZ48j#DAHF+dGJ+ecl4WDPw?tS8yCjAIa$/J>W/cR5lSb$u@8lWi:qtSK!CCa
ZMQ*Y8 GhR^kKTF*=h@:w!?FuB+ATL$S$dcZ@HQC68Q>+MwEed#l:AT^1R>/4ilc@d^W=+cAnujdwdIkp$Epa^p
D8C6Y\ MDFSpIWQbMlpC=jqaKC!KdA@Qk5#4tjw5G=9Jbii$++ButN?ylSj<^GlpIqP?#CETD>8n<pXP!iAQl/N
bF<1SV YcQR9Tb8Rq@#\uy@w<FIZ$qpIbyMjnpmjHkjXc9tXB+E\?A%&M$Jw1lipm6dbliJ\Hpu+nlhP4*QCFRd
@^aHZ9 enJa+QmSVl?B5eYImcScl?P8kW\!!^4JiXll=w>5e#m*DH=da:8kS4VuFQa=AYt@D4hTuui8dJX@q!$y
/V8HL+ >^cQ8:KilHW?aYa^lL\Jh!%M/dySIcubmd^PiTAE5wIXqn=8SuiAXV5MX+>bPM8RR!lhkL/YEXp5bh>>
81E&R> WTHB5t^P^<\p14ale%bV*:#h@K44le/iW5CEZw<SI=@L+88!HpR&6$?j\wXj9+L!&XEZ*We%MBwTZ1:l
jhmYIF ccu!ijaC$D@NNXja!Sd&NX+M4SbE$SG<qMm<&LGDVjt%^SAH/eDSLk8RF*!e$89mXwj>*MDD8WPWEFX#
dddMBH /mnR*aG6RlCdp*XM+yP&>6EP&6#*e4+P$^#hup!c&F&hdQPbqnZRkHZqB+4%=98?*RDFq^t%HyP<My#m
Li54?D qi#9wINeWSY5ZPdL=8uDdabm8LY>I>RZJl^E8LP:5nQq9V?XXHiT+*yL9wGlR?JttH$BkV^p+GDQSb?!
+Fy!bd EdM^+?l1tnZ!$Q1X*H?i+B4p:h>ZnM6<QFeKabnjFMVqcntIWhIEJ9G?b!?+DIcKGYW4^=$8/uXBTC=F
5SbH/M DXn%+8!a<\c5$6Z44YbX?M#AaS5ac5mF?P>pj<$i:\kXaamM/*@y6^LhpYJlm%n>QJ5C49DLwVFdTdSI
d*AZKV Y9>C/:1CkDE5Pb6RktpkNpGGwtq$GHZnuI61!F^AhJaNFGaNWRTe8?t&lY>:wkllL4q\hNVNcDt8jL1S
dWCh98 p/cCI@TpRDCTm=B9naJ>*GlS:kFmdEiYt/KyiN<5P$tiW+A?+kjy4B#ZnT^MW>&1kVkyF@uR#p^ctTCB
B!LKXG T%CN<%SaDdukAhJKSbLw!qw@t^VqVF\Z9!I!51@c@<ZiY+dXqY#4\k6d8L5Eh*h*h*h*h\kJBIIV*C%A
V$FM<6 eHj*+P+P\X$DIWkThH%$u?=>89jy:MQi?==:u?ji:>hcW>/1Mc9GHFW%^/l*/KuJlFP>R?nDPKHSK@uA
R@q18t J@p!I*eeHkXc>d+:WNpTMZVFkt:p>ER\KC&lY@RH#Ya?LVB9G*E!^=H&<J+Aq+\RAc#XJmJ$9LHDQH/X
Yu9FuM !M:VZe$CCG*JBb>InlSZZ4&wIu=dK&cCLyJwK61Ceb8:!qK6XkVJK:D9F&pN!$JZE=T6:IYPNZ>mH*Gc
DJj/L5 bp+>RB!B%WYnlN!VZSVw*HXA+P%L&c$5$!^ee/^HZD#KI!1pcRqDLC:AMaLC#\uu9i/jtF1!Y=pn5miG
*^Ai4* VDAu1qM9jTmb19%B#N1lR9+B8+VDTwE\ac+I5iT!dHDtS=cipq4qIaaa6AM$:8!NSi^iaknKAcK<SIk9
Tb^6:i mpR5hjQu5M<bZAk5qKR/k>nRC5i>@mn>+X&W=8hb=RIl%ii:#c*SX9d6JP>1<Cm/#T>lKpJNAl6yQ?E8
aj$c<n hE^t+qDD^ZZQ5ipSl:\j=ZkLZ@IBHIy>dG\WJV!j%Lm\!*nGbwt#tqLu$@6G:VCF%XA=Xl4uTnQ&HQKL
GWp6CR DcR!CZ:ed%::eikQH!MD1KR\#4h6VS4hyh>ZGP^n>BJC$LH:4<=SJA*qRMmdK@9u#DAc4:*GXe>1D%8u
SuVlc9 MB4DF:Tuh*c>=Bt5&mq===Td!kGHSnD$Hk9i1bW+m:kIj4&h=p%qKq^4\>e<=aZ*Hy<b8kPLSERNMLQl
*Sa\NX =E@dc6<JYFHyEdubn>InpE!l/A/KY#pkRhR9MmJ49JG!MMF^c/D$\P9S8wM<4SR8P:FJZPqc^@@/Vd6k
EMXDd/ j5E@WBe8hRQh151Gk&LTFXXRc!Rk1?+^>eNMWuw^c$9lcRG*<wlHX5tlPpLPDmXy/neup&d*c8eNchcS
@u=FtY lLS=VS>kRS<8lIYbR4EGu=dcJ@%<!m%u$dc#q?kh6+#WBk\LESC/<S>c8@$5&?I$1^199GhITlW@=K&$
1@F5+R yKiN4?nnE&V9i=GbabKk5mb>$6dd/w:SE#P%1$mJeaS=%ZL?*i+W%$e<<Q&a<S5Ft%Kb<m\:@%#FNp:X
5PpeWL *GILP#$elqtLWTX&1mI5\+1FIw&L#JZ5#a8%!GAh^pYHeuciCqV<n%A+RMLcp+Fl5TwpKNVD#jJCTbZW
GLXGK< JR8Zw/*^Tp1=9qVZV+:&Ic\Mk=Kul1\H#XbR>9N44$>X^L1=R9aNmk\wuX+kw?&Y&:k^y%W+p&1dtnh+
<b\l%^ pLRbC9G^JQa+KLCcV4*$YMYKbJJR%<&8TR>wXqkyut&chn4bS*JJVciTMJAal$V*nmBdEwMqwT4L:w*?
*NBEX^ +Pt8+#n?ip=wJTSL4d?jdT%&Byn=A+b9c<!!$6i%Jyq=kd5wiGmIhVQpdL&^Zh$q<HWM\tC#/\h>n86t
a@HVN8 !4e!h5Mw%d%WMSe*MiZT*?\mZhLqkKllpNja*<q:*ZHTmmPmlcQ&1uF\HL>F1yneyFKIN%#Lj$ahRnH>
:\>/8# DBXJaBSkEhPF+aXLlcV=wy9:tCte8m:Hq@ENSL:kYZeXLCW?5>LLm=I6=>18&a9*G=XlTetd*+LPuYpJ
=AL9I= l&:6dIEehj#YjQbe?9Ey%%:SmawI6pZtR$ZF+i>P=EMqi?yHyB9&%h5u!+iK:EN!!ajy1<@l=bHqmBFQ
S1BRFb ap9p1G6l:MC5Z+KXid$dAwVb6@4$c5iNFb1YEd9aX\+QKI=54w>RW+?b5+An8F6J&>aEPpGeWP8XiS>B
VS1c&D =&eHp65ZDW#ajLabP<?!@!aJmM!GdKipj^\@Fb/\*@cBwIi61t#d!%ACBQqd5/9a%A>G$C5jINndt5AS
KLP^iy a<#cwkBN>/<XkJyj%N5AGGFBDLDb8qR!?h=H8@#nMD+w!TLPcR\w&S1^?WA@?#VS6CpF$cy\RFYZMn#^
^kZDtq CJJqJ+y^yIc=Ni&ieYENVyXqMnCPeP+A1>q?bF>CtBM?h<^FMW!!y+/tCAECldMkyQmaY&iCE4HGQKT9
Lm<4kL N1nIAkGG&dec#n>PM#m&#>teZRqG&#R5a&q\p^M%de#F%Zc*Dm6EZVu$6WW\H+/<Bp:ELVhh:8k^PhLB
W@<8m9 JidiP##bR=achuubm\&WemA5\qFSZ%F=hG=kRCD<et%IJc@T$lkRiC+6SWRSYpjt\XqEimaZ\FYFyXRw
^G5w!1 Rq#JA!GZymwl!4:9R\y>C#eDa^tySmIlkqYLTR\jwK#aGJbj!!1<*qjJ:YKy4GKNEyX>Tu4C?#YC5/6a
JKA@W# nH^@aMAYThD&ARDuXY*PZD:G&ltDbBEVeDYKnaBe?8DIDie*hWj9Xi5u:QdXK!YTY6&MF%TeRp*J#qd%
FSeSmL mk/JZG!He<%iQVIac:yjXCK$?MiR+/NV>wW$8TpC#BwEQ&K+GIQVQlhcdq\iy*I+@Zq=l*9Xb=DhwY@X
8$$P4y jqq6X#@!aay%!BGc9jeWiNXu^/J1LmlL!%wW/tH4=BXt$eGwCDAqGtC%h<ml+mlC?+QqAJ?yITXhB1Wj
SunVK^ l9!:u9Z<6:Qt:tLkGe#R:4QG6w^t!>T=$Z!=C:TpKEcp:w\8\4Vdd%W*:YuEAEBTX/myNT#THnDSAVBS
j<MjCI E/+AK//>VC>VdtChMVN/FA<\tMhBmw5$m9%TE&kLEKJ/mT^/\I%iLZWbQYe<IP%uCE8<VLpbm4nhL$TM
p@RN+M RW#<%?5Mu9>^b6Bjh@:?9wQ9F?!9&@X?&?j*#&+M@w<5dQ<Kh^ed?*@q:tJn?/i+Ruua@yaCn8ZQyKG@
%c!ZPM :&V<?#&TLQ>%c?u9iiV??+*IQC!5#$D@dBM$D\9dM>A@&<dM\<L?HDRd%$@RHM>B@+THpIiF<^uwu?XR
#*i:Vy +&Hlikcc@chw:u<L#jMMNN6Q8GF=YJtjk@=b*c#Q$dYj=jQmaZ&P49%<G#Q4e=TNni$u154K@t?lu/N5
NFe/?G HB\@&V9P?l^qa?j/YcN#@X9wb!ud#*ci5@L<P<@>=+S>I4<cZ4Wu&?8p:9TEF!htWtBla?SlbPNma?bk
Li/mWP bLG&MDFu%H^y:&nlctJ1a&@nd9NpXJppmctXybRbue$6cZ+%+<<mJYVnaZq/kVmJPb+MFQ8Vuj*9TRq=
F$8m@i @y\i<H?n4D^Qw^kdB#E4B>89In>HXNc@&^Z@i=j<w%*^j/M&@HXZQPhj=Lum?YPY\6<@CD/X\9H9jlAe
Xet%55 /6LuJwABB1KtNn9lE$mcYbHSE+@DpGCTkF<\V\CJciY/^X!eh<&JebRl$ai9R1%\<CeHYXW?Mnw:BCud
DlQBi4 m5K\E?5S+mBA5\Y?EDjR\XNEPk>a!m/q\a1WDQkQY5JqwFme!Mm$P!NCqic$>ekCMhp!pE85a8VRl6Yp
aCQn8E Ey5p65?WG6<$JQeZYpIa$nF@bbtQ/ynaTVDAZp@=AAu!BMp>%!u%\^$aj#^^XP5?P*F8QKqhXq=#i:&!
Y/u=mn IM\?+QGXa#+nL1J^6dQ!6wARQlKRN\+\b#PIJ&$Sj!kmcbKYy4tyqm1B=16&CRQ$aXlaj<%P5CTdBFB@
?K6a^Q E!Y</%1cMjLS&#khL9\R+:GM=ph^nd<e:RVYP*nVZh^kCPuXFyE<dtF1bny=atwG5A^mFISi4%MkFBkp
V8@8cE L\+WiNwPMNL=6ZJQmF#yNLCT:4MkGTJ#6nKulA8>Epb$HIaqBkKL<$S#dZp#Sl1\yG%wM8<E4nCTC\#<
MkGQ&p K4/NAeW&Wuk!6#C:dkRB9LleYqm=QWR?6JmD$yVbmayKMhWcH?mceF>aBE:cn5NT8n&EAh9:YnWKC5!N
GPH+yX iqTl%t/RP:m:&ybAyy4alB<8ajc+1uGYAFnPyEcQn6a9I8*$a5yPh$eq$m^dhde9L*6cyAh%bB/c=T94
*MB>^S dePWl9GYClSEkaY?1A&=LN@<N$^FDFE:iXMWJA?BRBkYpmkyw$<IGKb5W!<4QtlDRiB>HkmGGK@F$H1J
6S4Z^# e&T&#QHC9lMKkqpN8B^wIh5@b=$a1BFTe?%E18H55NDR/^?yVFKB4aFM\eD8RCVhct@6SnqV6&S<I/^M
+Z\6tj j1JEZ$=:=:WTG:@d$DNDL&QeX+<&M:m8En1M6<H!AkaFcR^6I%qTL9jHwCkQy#MZJP+5$T8w5u9tdnEV
HSY:ZI \G\&$</ED*aRlP/i>&/c>lqGyV?WSpI\F5MNt8*NRIYn^9h%G^RGiP%bRkd5IbECb9uZ^!nt!4cjY?%j
%8c&@I </LRRtpukwHSkWYVRNK*6J9lXi!+wZZ$w!R!aHY*wB%qI8nJaY$MLy1i+nHA?^JkPG<q11AdbIV1ic@K
$+nN49 jbcq&^p>9ild^KyYKcuk*nT#8H!=RdQC5GM<P&BuX>mGE<W#b<4F<QFDTLj/T&?XH6*&B<&GV^\YWD9m
HX$hRt M+yj&thPIB<WbuG/qCp4>ijiaXWGwEQ&S1%E&#q9uEe:/Wb*?qLNB*PNI=+I8!WiXqiX*6=:J>ccPwX:
=j&ab< 51Zp#/Yn/Vw1A48\1VkbNVHi/=p!tiN!%V>m>NwGT5BmbnBetbctZ\R:VqFIwAi+K!VGJ/1PTMiY=MMk
-AmX1^ 000fa46fd16001202b4 Page 111 of binaries2.zip
%TV+XF wu6BK&*/$cSRJX>kp6mEuQW:yqCMbT@PqG8MN<Cppm5dEbhSTE^<51Gd$+<&tcJGQCHHVV+Z@k\Yn&lQ
yS$VAR 9+ZZN^?@GGiHH/+CnnBAQaKRlI<Z^PI>&A?ERnbDJ*Wd?ebFGq156>CD>*49?4Y+lhiTcTqFqN\?PRtp
?@\6/i X?n&CJLpKJI\%9u/6dwwSDACi*eNDHklCl8tW*XDF:t+bBRT9u1+!BTKEKdFm\K$JiQSW!T5K>aPC%5K
PDW+jk T?4a=l#\W*T=:byAqWm5HEnK<hlnCtAyDp:&ZFy5HJp#k5nH%GLlpajh!I>pt*P+lh>95<D!AjLlNm#E
b<\IJb wZC8I4J&CmWjJd4/CjKS8*YCJZR/+q1c6bdcYhY&DG1dp\XdENB8JG9JWTC@/+h&=*ZFEE>:6<bHL?#K
8$NINW Zlm=mXCRD&GB?>eIKJCHaHVVMGwcJ*kLVep16wI9lKjE=#FT=#IQ@BD8LPHV<j/K?aqyX:h<@k%djuE&
JN\6%/ ^@Tt<tG8*K^I#6cmttWXYTLiw*q@l?YRyd:beqyh<XW6qd#1=8K^8==n+uJPHwXq6Adip9*WFt^L1YlM
HC%nWc Xuhu4yR+CuQ!C+1Eqdh9uD>&Fu%HCqVHJNi\#8:Juq4Y%/eNDN\5tP#nm5VSWQ*5W^dPXSc@mJhddcJ*
AE^MY6 9p/uFX#/NjucVb<Ty1G5h5Qah4pu+qDEZ9LdG>NycnhNVXiDV<$SqtXV%HZF&Xm$DZaCw:cjK&pdVQQ\
L*LdwQ Ae6:c*YX^TM<HT8tJSE9a!RyG6@RW&m+KAiNP/aAyepL9?w19eD:wPVF^RG%*1a^Rm%8MeQcQK<blQhS
Z%=c4V n#H!@cGBS^S%SWTY/M98&4/VN\!j$51pI!SZkBS:4k9cy9w1Pkj=ew9tw\1jw%@hN=e*GS6k?nkZ#u*<
HJ8ZSJ myXWlp^VdhIh%#&t#$h8BQ@\+N:A?#u*4uFQVq>Q*RcLjP98TJ5<cnIkXpeySN!%Gh+Y$YciN\VV4Ilu
mYBbbP LyTX:5AT1\8:mW8N%b4XLS^!Rq1BJ%Z@KIBt9*:+@bLYPQ=/TIXyZP>TPq/ph^QLnVwKqNWJpdt$Shhi
5/jwyE >&l!8^$56R<1#&BQdVj5\ne:hWa/qIHwWt#ZJuyZl8lZlM8//bKBGV?eclhd^*Jkmt^%/&PtQAJ/^W>\
6$Qb^B ph%YNB5LGip$4&@\MA>N:MMn&^ST<@Fqi6>DkYGKJH@9^y@c5nHmnSMXW!jGyEYmN5E6CW61SQ5<^aG6
G\Z^Wt ^mWnKHACb1\%I5FkEwPdipHlK$@n4q<na=Y4MjPSQWVua!QK+PeG:@d=<RWh=dB:hQuIlDEZZQ>QhF^h
A/aa!4 NE%eeb#mPdNJe6QeK8uFDVctcDakRl=iNC&<M/DHS=<qeSZHK6d^b4ylM*&C1*C&@jnJWhh6XkQwlkY5
d=cymN h/<ZGy\FX%lpM#tmjewp9lwmetV>eBkjGB=1\N<y%A\VqJ>AWKM/?dT4w<@#4wFp*KA1E>clKu/:^YpG
LkhWT$ yYQi@H\S*:qy<c&*W6EJAVXDTX>+*LEhRLj+&9VGG!1@KceQj$=F+iJw6LVLZjkwKBHZ*Ybe<<&q8npm
tV^9a\ PbhW<18BE:bw+5nZ<R$G<^DR>PmEm&+u*Ce%XFq8ktFDMSWY9F+:TTJ\4H*F&:=tEpi&!Sij9ed$<b&Q
t9M&X1 J>F\9yPPpA^APckZqmbJ:A<qB:YX\cJq#a&WcdqAPpe>?481^y/wQlAXm*aue1<=u^#&BqqEdcZMiiuc
*eCl5Z 9^B:X>RTIat@TJ*HMK46mWTa54TK%\Dn:&V8m%QT<aZ#/u5AS&L>wXmAS@!G$#SD6Dd%\NCk\IMk@ejw
6KL?yL uSlCuwQd?>wjHRqSK*mQS*ZaHR<WdjXw<\:/SAQT:$nXuXyu*uHQ=e68:9%IGWjbFneDPE$WVpEAa9lu
NPTuuq S\pRGPm@u%SPPiM5TFXY$K!8B@$RH8b%QldZm4^cqk!w6ZSi:m>iwTj$<89=XC$DPNE*mllbeWlDQQWL
hJV6a/ JX%\yYIGYmR*IpmLbH<&kAItYT#yS1Wh!y^>&w8?#!NeDn9Zu+wM1\\Jqjd:+lmydwHk*mWMmX\dw/!Q
Twc5Ew JC!MtB?WHbX>nq!5lq#?J8nHi6@nw%&RReH4/i^h^HLyh!i^pVdKZtFjpGthpMw<E1M#GE/%=+a9wCC=
5FYn#y GiPRVlkM=!R*6<</\SA5R#i%hTIIh1Rqce&TPeFXkhu&^PJ>8V8Qk?hLd@1tkKbuWAn6LQ$ZTNqLZw!S
Ytj@bY 48<aZ>YA8=8V9yJ/K$1X/m#VAR\GPpkFiXb#?:IIaVBBpqH\Bnkl9DEhRRL$TB@$mBR?AQNIjTE:lE^S
@&h=6K !A5JQW!DAm\wIHdHwMbu@AGGeAF9%<L!!e**!<9hN+\h?i&>$$Nl+AN1kVR>@lC5uPBP/HtCuLte&YTF
F#Zm$l 5ut9iiQc?e^$TTAM&T\nPX$i&Stu!G6lPJBWhWTLPRKD8GQAca*#ad:?kBX%SBR:b^11JDaNkM$Ylnh8
:d*SXK yTaiIwHA!/Y8JbiiptWiIRHaA9NPKWXj!&a9pRAK?jI/Mt\JbaQ!1XXDbahLBZIqW^&uk9Qd1eY:iEJ8
Ala:bH #@eEad5!+cKpw+*hnXDD%?!n\eT4wTGp^@QQ%1q1>$d#%Yl++WJ/FKlYD!uhScH6*?$:T#E<Y5ecmtjQ
=T?/G& 9C/\a&T>RQT:eIVcV:dNMJhi6:>EpIAYu#n$MP=j<wDLbbcmXLj88KiEb/KXuR%?jcQGcFjmH6%HH+VR
S::%6K ^H4<twHKl^F1\KL@Q5lqpX/YPn/EeE>c?<&5AK8^eqEEE^N\1GRw&!Bp/tnQY4MPuaq+GKHAp>5NHHHt
8hpe!K kX%en5ZN969clYtIXh%%*<=YkRp\!#Q:%pC!WNj&S>nRXaT=HG@8KYThQ*Q\yyjqKw91n&T=AMp/>m/&
PVaFe* AC9Y<>eJL\YWD%%n=>:ALqha<ECKQ<=VYDJVJ\nLn&qaJQ6W%VEY:G>G?BqtC?6bBMPl1C<Z8$A:q<GC
>8V5<Z L!D6qWBdN#=ClchIYL/8JNCKjRXXub^=ST+K/IYiiC>!Dk<*@AZ!*L=tX#D#Tq@:<66i6ktBNLYk5mTL
@eJS*p hK5SHTqV:u19P@&<Yye?SwldLQGhqC#Re1/#PNYmnpKt^IylKQ6n\J&A>XWa9KFBdAR1De4h>t=Wjwm!
B%nVaS MpbK:kJD9mDm9y?tPiQLQndlI9&GIpF:8pH=A!M=/B=Zc#GE$JBd/9CWeu1^1?%tbE%teV#d9c+wGRjb
$C<?bb 4&nu1N>JA4ubiwW==@KyL8D&YJE+Ak&IA5$=A$ZDe*9XK8YyLqDJ!IjJ+kXI+wYJXeX=6u8RL8Rl$XRw
/@DdVH XHWwi6l=\MXpSWWF+=&wPQ\k$d#AXN?CmdYVpHFR:^bSl6JS9Z#Ld1\juy8qpS5pV@WkNHn@abkQGd/!
a#ynjy P4HR!IuS&VFAW=\Pl=/\T@TRIumAlcJ4dD>RN=iZ/ml@dSJPcEmQkcy>A/MNKRLTIeHQ+iT&S9=eJ#bG
#Pp:BY 8VRDabj!mQdCmQym8?\&CDw?bCT#M*6Mm9/5k=/AKXm!wZ:QYH1tl<a^htD#haEpw9HIlZ8lRWmq8qYl
4B*EEX kTc@^KEjEtDVWD&/eFBYH<8$h?TN4F?9yai!j9^!t$T#8jwK/&H4TlkyNW&q:@WFHd*&dXE:DM&bNhSF
Mijhwt EPa+X1l#+YC11FPpey\h&#5cdA9#qHhS>kDql94E\wFwX<&ZPJd4mHElZ8ctNqQ6w4LbpqTJ46aXhnAD
VMGBjq 4$e\\1l$uQ4MnYbJVI5>9w=Yimb@K>DCCyPK6Pk9SDlR%Rnq*l@!5+>#69>P$NtEnnZ6ja:%kSN8G4HL
tGb11K PCEI=G!qc+ZP^n8Bw8?&BYl+dCl+5QI\%9iAMZInNkR5Icb\M%^<:4=abTEZ+4bc65aP=4Q?#yZR!XuZ
e$/ul\ b*jb1/4td\J##h6p>jLdl8hAQ?6q8BhXu/dVT@+=hpt6wT^$j@+/i<8#YY=$P5+tK?=/=#u%*DDyc>at
+T+R^1 K!u:Lcp?YF\dQpZ+MTT@5:m>+pkGSL4Rny=?HVwuZQj\ERyT:@K+XKE=kN4%9ddCqa=#9yiH>ijkV<b#
H1+j5V 1X1JyFyS/cK^BXDB?=@K?Jl1t:PSXi5qDwLhHW!Wd?6DQlwZD5NkR$l<6+G5a>hHbVJ%F$Pp8$W<nhi1
j$@X+q TAp>j<Zh*:YpV5jVlB<ph\i4/S6+dQ?yIEb#tk8Zh6KYT\&n!\RJTqCenepK&#1IiNT<eeHRYJmF<lAJ
9jj6%H ?jZlN?*RS5IGaVYFT!cVKnYLa@W5&SLY\@j</P%uChTH*$IeLBZM:i+5QXImF=ILV4y66Nh5\9Fki1S#
J!X&Vy htVJTa5T!Pb%A^JwIN^i5tc5c*eB+bdXQ5QH=lHiX<ZjPIbbYGnc%4YGF5iHt8=46Bn^HZ5tu@T+Nlwn
Jjt6jK qWE\/9l#JHu^Wd#AQ*$yNWRmDjuaqa<u/nSpqG@8Q55NhES>Q=hlc>@F+LVhITX5YMpEJB/GMV%=QR+S
w&t/%= jZ#aIZ!w=Xp85cj8m$uLFui9RP>IV*1jcl4PR+FHVu1kNeQI=+hJ+uqXHqDIqN?TFTi1$9IbiBSC6Vpk
ye^hM$ /BeET&4JLZ=McS\4IP^KcS\EB\mBBDlVGwjAtiLA?I$kDZwkbEenCjekp/LAEwhCkwEKiT$K9Y\KY^$K
a%uKT8 d%&KiF<YiZpY6bwC<Q!LiaPL9eKKhb$BaG>S<JJK9N/Z6GckAMCK6#1\d$6KY!6Kd&6K<RyK@RF\aGCq
hIL^dW !&%q6&Zq9C&q9I+A9EL5&+>q!&WXZ9$X85Nq8yMXJB%E6&&q4TiX6!XX^Dpq9PPF!>Pq@wd+6=?1>YA4
cRi<5+ :1A4$9c1<YdL<F?W<aIKY/j\:&l1&^l1:$mKd^NKdn@W6A:Y<6yW<^GX+^YXy#*W/jGWdwGXi1*X*+EX
N!+6DX 6\bY*CcWi6$$4Ikm<dp$<dpnEaNX*Gqm*/GZ*YEZGkPITF!c:?Kc9>k%6R:YLa>YA#c^N:iKmZhclNXc
^6#RG6 $qycXl!c@T?ITA+J>LwI>C4c<K*1?Clc?a1K<W8^<XPcX8T1&>+X/pY$hX?&<\%?ZN/1$SMy8y68Vj@T
%p6DTi p8Qd&LbVhNjYhuj/Md&1E#?\:e%iY@8L:yYpEkK\B4*9SZet^jkcdj4RHZyF=eJk9i%5bYu9i>y8&kmE
j4>4jD &6Q4Twl#?4&%?9^BjdeyA\Sm^Y*5&LiBq15W>SpP#YCGKHk9m<FA4jw8NT69AYCb8Qhe#j/h^Y?Il64n
kDQlSD ?qj&&9VDT6?<GTHI1:&91e&AGQc8/NBu/4u%GiQ9H@MiHt5jH<6n!hXIJIGwHJTpqB&B<Y@=VF=4Stqi
\MKY$b SwIyCmbNq:WMQ#G91BVyIh9qNBEkq4N6Mm=5qP6uq65:B:#q!E5V!MeVl:1X!i<cLMDVKQDDLFk&GZ5R
ZSIDyA GM9wuPPN1mh^1Q8kWNL&9RLMah=Hb@/n\j\>>L!BLL\I&H\P&MIHl<WZe9MpujM?Nw5mDw5Qhw64Vk5j
+pywIt #Sb#HK1IG?a@JH%KP@*pE#N9Iwu@+L@5W:d<IY4^k>GKV<9Tjh*Kk<t<kN#ede1uF\+4Bm$Lc&?YQtw6
$+eA:S C<#Py&56CZ^cY>8a?@nt$<in6aih=dY/YwQ^DRQR&5jy>a<:<&6t^T>P%6h//$uppj!<AaT\c#+9t+$B
uS$^#T PP9$GP6E&+Ret$>FGd^1>n@bJauc/w:c:qBaM$n+>CnWIZKM=H?M5</MqGt^@=bp:iPdnW!6wphhyE^/
RewW<d /HYGk$i=hWKIA*/nZWPG+k/X#SXlAKHE@5jb#a<16acw&\KY<Idq<IdRt&APA?qml#=N/+LEGCbT9V+Y
D/S%jE ^*+AQLCeaeHSE<QJaZ/np#YV^jc!In/1qV8GV@\6k\<T^S?E9uR<jLtjyRd<#LuI^9+@u*bRpwYNtIPd
?p=%WS >h@NRenD>1@tBPL/4#pIiVn@8S!EQJ#59@pXPVq?@@N*YRq@@!n<Z#+*@+Z*k8&@elY#@MRH\QWe>E@T
-Aw5GF 000f268b638001202b4 Page 112 of binaries2.zip
=PntkV KQG\eV<H#jG#8utikid+ChM^D#9#e>B5Q@F>5LM<B<*!M#V4M>A@a*ntaYh:D9wuQMp<:P#QRQ?Mw=tH
KE$DYS uiM=cM/jTj+eZYNn@Su/Pd4G^9\#>HN$nbZnJ*+&>8jwG86QWqj!eD^H%%lbj+b?n1:>*LHK<S^qa?Z<
Gl9jRA mS?ik?*jR4M@/^Z>Gb4n*$I@!:C^@$VSPb/ndB#5Q+q>+HmP54G^@R#>LGZn@5q#e#L@P#*G!jI5Sj<b
$VV@5T ?qt/^9w#>HN$na*qJ<QB*?W1@X?aBI@61dHaYVmibk^Q5+au+b@l^Q&:%Ki@C@MQM!5?W=muai<ZB@m9
S/y\5\ #8@jE6*>h<J\@p<J\@MpC^jQ4+d9F=tiI<9jb\j<9aj@wZj:h=4*Z:*dQB^@+h*?a<dYb*P?e@&N<@%J
hqq=DQ >Z:ujH<!6@<T=V9:L*q?@$<!94PBRj>j#jmP?kjGh=8*GqM91R5#jhkWkF^SiDL&C%Ii4$uib$w^Nql/
//eM6D KmKBABCih8<n46+tHIPDKSWQD1HBk!tyNWN85*pKnTmLZ+=d=bY4$HkTHc6M$e+t+MqMcYFGDK*4bLmG
=ZJ5lL >M4Eic#St=p$F^>SljA1pZ1/p4QKFhqIB=b^lAQwt6Rw&i:S><^tS1ZQlNcy:%/CAB+ijjkntay/ueWe
<?!SIS nhFNJk6C\y<pmhL#bCQ/l8?pI/YGNl585FNTZR&+bE$/648SFVw**m96CnGKF<1\u>Kk9LT5EaciMi<n
KXYB!\ GmFWCZ@bED<4JdMtX?=kkWNPA^bc@mECAaZjj??Cqu&eQlAEaQ!Fnb$q*yNwqAYqh5tGY4hhVEeT6plZ
c%>Tpl W*=$%=i?JujJl6=GF==/8IDHI/HZG>q8#+q!A<mbjM8?1m/>T4@D4pu9H@NF/L*$VTV/I>VFlyDTW@6M
H&kM/m *kntJ1&m#</h+\RQJu4u&WG548wij8$q?l:QpYmmGWT#//NR4K*XC$pX^>>CVCuAJ?9MTYG9@PXKJk5$
XJ=?9/ qb^FhtPPyYcTH^A5Ftn^R5TyF9pLb=Y>wlQqniw/4KNq*R\cnuy>LV:%aTp5bNMZ#qYCa8?5QdwkV?L/
&kWYJp /X*yV*pii6SDCLuq?dejlQ9Vl#4$bC>t4=IK/QR\mK!ujhe?VMy9dDw^iA8hCeu<?G=$ljP>/6$Zq8RP
EbN<IJ &a8GK>mZXtd=+^CLpYGt\VK1G8??j$lFeZE/B@1DAJ4nVI?^/I?q^y:*H@d+4DQjSCkRe8j!t*9WSpIJ
!!aCN> Ru>QJ>D^D65dLFdkp#Y6*=QDaC<8494C#!aWi>?Gq=KkPBPH@W6QC=wQl#aq6BjYSYnYVjj6+ctk%5cp
MJR6PH RBXSFbXM8iKWZDAqD^wI!c^CQJ+ZmXwnj@>\/i9jZ1@uN*8X?bJ8<JlqMbak6KlpIZ%dajeLVjtS@aIZ
BS6=SS h/cmN!tu!wZkB@nV+:iVJQyiN%Rny+1e9GKcj1wndIbGXk?j%6NN8FLdC*J$B#FkC+=GVn$LcEe^$$l&
#VDPC? BC+pTJ9/XyMTqcMcK@GZX/R<5#iYS?1c+:iuTye^hFwGuc^wuXqnP&*aRNN59Aw=#ZI%hqWXe//\t45e
e*#wik ^Tty\ciyKZ6DF#1\kw<4y4FHlIdl/*\iF@5q%BLdBt5mJ5eQb68w1/WkkPhZ>&HpqDQ*9nt18wbb^*JG
*dYeVP !&AKN*j%pGkpbtJhPS1M9aD&Ta^ZZ1@t<pPPnYepZPVRebIW/1hZ/bB%E6ZTKt\?5nI9P/XpnI#9XTlq
Rnu1B^ nLPNdQZW&MX<Wiy&y#HM@eCullp@K=1<8Vc<>%HlDKFGu:%<M+Gi5Kn\>DHyw+DX#iLi8$!>n*Z9=H%+
^MAcY? %?GL6cTnXJI9b%q4p^kS#V\kV$@>Z%aIH*9WHnZ^KyckJc9PCDjih\ASc&!$qYjQitVauSkXJ!ptp/>=
ZkWwnJ #PM#MtwLS>b#@WmdJRBe55mP:!pD^&4wF^yhdX+qq:GXw:TZwRk4nmDncu<::<w$c/y9t!NLQ8==QCWJ
!Pe+An 5bQCCmFBL>@tiYGWGEallbtD$hNe:k+D\?#yyB+ihnSN95*6baqEDq@SLTd&@dy9In$HQMby:%S%Zb#q
V&=^<S c#!u:NjwQchtqVMeqRKDd^Y<cqC>=M\*+V6nbqJ#ph>S/R*nwnjCa#F%leZu!&mylbmT+Chme8X\w:?L
<AmuTA #XjPqSj:1MGqKS\C%&H#BBlmpS%c%enj/tVJNTadECuNP4y9m:Sb6NC8NptZGYq1HtL++Km<KVyT5&*!
%@M@d4 mq1IKVZkYMp@/i1yAYy9lStTaW^*uDl&&1e=!cwjkGaEdpQ<n+cSj#myw<4YDNKd!6LS5#/aEt8h1Q<k
#!Nn#V Z@Xba=&bqAnje#T=?Fd+L1G>bwFV^pe/*/<<k9#$@P9:Sw!VWKpmdjcPn+@9!>iHi:kum$&FNeF\A8>K
6d^@&t p51IkMRZJ&TL^ZpH5%j9h=4C*B%M!S9kawQn<EKJ=4j8lni&BGm&bmpI6SIWii%YdJLnQ+ua<Nh\6P>m
utKQhD /^A<tC4$D6jaiL8<idD+dMFT?PGqS/u%nF=wiAk^F@1E8AB!mPmm%HRbT+4pk1Xii8Ad%*l?>@nh@B4?
FKSeDh k<nS@9iWPjATT<wIuDPP:1i\FkbMw<8S5NTS9QeI>YE?:Nq9Rwy/6^a:pPeS*:&@d!+VcJld$B1DVFc8
$%j+be Jb?l6$khGB>VJqJ/!\l:FLe^#a5SThE?^YE*HQR&ya!QmqE\jQuL$Ty^XYGk%=9N55Tc%unKBKpFTBa>
K9@%*i KW8G?V\Nqy=6:W<bT5iZtwCRA*%*tu!>DewC:JTZLK<IclX4W/C@J/nNtSailP*%whE5Rn^ITd%y?6k&
nCCLa: >XK8JW&G\pldSPJc8+$ahTRn95l+9tlD<<FwFM?YajlmQ<jySZ8NQm!<H=b$\4RWCPDqt&K&5+F+@?ul
a@J4&* 89N?+LD#8/1?$cn9K6j>kJ:9HEWq?p&AkRKVPdQmX?hNl1RZKb:YejNTb/96DRABL!9RdI4?t8EL#S/1
y!<y?Z &G!hIFeyZBL<yLcl%jc*nH:*=^ch>\YnIID>phD8@i8ZVHe#YX<DuBaJ\RIXYq6uRRByl6NF#p#4^!1+
:M=%Qa Lk$N16eThE=$u<9<KF61G=6ub%/+G!n^u!KPS\#dVkVPJQtbIFkj>$mwZK:kF+EAH#QNRRBXyl9&H%b8
Z:@llb Nm@YT/nnX>h\6nTnWiuEcTe\$kKkqRkwF1EKpl14MAe!94q$R#B$=L\a1=IlJHSyw>uYpJ9ZcCJInF#$
ac9WIm GLi=SXw:mN@L?^mKY$ne>9JaGJjW/eeQECB!=%F?MFT&*>VnlYm<wH@acMG1mIYD^*LWVuq%tKX#+$ne
6M6QiB Qc*6+QEa?L$G?Re@Knl&9bYn=dY#jhd?q&D8#8in1Euc46E<^NFMaSKiNFYl*D:BnXpZ!X#*ZWR*@M*t
Dkp<QQ YX<+18=N=GGLB!\dWRHc:hXMtKd=C?aE69^QDV1ZIta@ZI^#w/@DpK@1<>a>uk$Qt^pu1IJXNpJpLF=h
ad1Hww #R8N&cFlQtjipd:<&tLiSP?%ySR!SJKHb:!IuwXI6j4JVMeQM#@91qp6EKA^59QCpb/XPMEXYw%*!uiT
uMXcMS anRcb6hZeq>RSZCmMQ8B+FYQh9%i@RKHJ$ttmtN$uJTqj4*ea\^C<KCkk14SIPdF=L&Li<!QWcd:!X+E
u<N?D6 ceXC1<CeTDI$cZ\l*yhC8<b<h%GmRESHl\i&&RX/9I?QE*!TH%9t*Ej6Vyw%%@YC$G=qX:5$%%=qH#jn
1$RetM n\6>:Y=@tpd+dw9l:p>?1RAB>4ppRIDY?P%H9ei6#u*YqeeeBtjKDw\Nt*IAG^tdPM%\GJ1\EmaSc9d1
tD&QVn dCPXD$LI$1mn$hY1I!NJcQFXXLiShJHT&Wk+?u*dRk6w@wPi:+l8EklR=kaCDB?iH^6>L^Dckh!w=Ah#
Dc4q^\ RP^Q=>Nhq<NtQVD*L*/^dJ4hLn?*i>Al6nXdJTR4an#FDi6GpGDA51j>?eew\b#&9FV=BnKlXLR$P\n\
eu%MPt 9Y+5/@lJTMw5lLQel8b=!1c&bP:yHEuCpt^?e<mw>*Vj6#VLCHkh&n*\SMLQ6w@$!Xqc+DBw!RL\bKC^
&kSc++ 4BD8HKH5qJFa9$Ha86P=pephGjSp=1ZXKd<a=mH?k+LX9qN>q\iPQP6QZ69K/#D^H9P?DHNMCTFJYyD+
4MnalN /ClVZBT@1EQmm8@Nk?lyV61/kiAMFna&nQdVCKiYX6wJE/!M?PpNIR>H#+4TnS#?w#H!jca?1>L*6MXH
mp#8H6 =pITV^8w/@KFX:TE8HN=AYBL*\u<MX>Ia6mqpEuQyM%ZY5nJlbkiEYkiaSMLGK&#m5K>w^uIE\I6JH1?
ENnJ?: Wpl8>G4#l^QIK>YLN^leMPRLHG<i@Qbc4XCGGVuy%laE?Dch<1nRH@Bqn%q*R:/mK:>$>Xa%n9EHuYG/
ZVchaN jM6MbXAKC!wi49WLGTi=:^p\8:V+MYl<pYHY=\c/S94\%4JHY1G#6W*TSYB1*?tX?9GLq#NjXK?MCu*6
*#nFF% u^Hcwi?<FEJk+WVQ<&1M9$XH:W@LTEy$S&4RuYq#cy1^I=yu%&8B/y>9a=p4NCQZc5\^iW<W1l1e1WHJ
@S6@YW BiEdeXlA@ecTRp@Plh<Pw+eh4b>wTZKdl>a*H1pZ99*J$lDkV%=4QbK#bNw@*t+<t4pd*bW\$8%6F!++
Reu?C= W$4u!$X+a5?6iuN/jNTKJ^yE5lZcYPk<b@Z>JGpd<@&//l+l/=6K1JRN?HFE1WAj@\K\<YwHTkVllI4W
nTD*pQ WIdZbSK$iK#c!l=G4+WKZu1w<Wk5>9XST?!Pi?S9$LT<l\i:y/WB%WPm5VY>\*cKe91J!5WeypdA=&IX
dw^CYa HXwi/h*FqGmaYQLB^Fyh96i%Rk>cA?W8JKWCcbqJMD8QA!#+bh!P8\*^e1uw^*WWQdi&ZjFb6b=nP::J
Nj:lYk 5BTiI/4d+QHed%uByWp$iQNL:n6\T@>C?D>IaFpMA9n1kkBh\!CABW/Rbm^q$c%CJiuBId/9I4P/e9Nd
&bc1$q DW?mZp!SH8=6L1\JM8Z\5TyhyKRhdy#n9^WYbS#NZb<e!R@HR*TNG9*H+uBBW$jZSF>PnH:kCu*PR=6%
5KaRqu 1Kn@WlHuky@iF6JmLIlTpISTZNd!EH:hd?S9a!QRJpWHyCFN#wFDL=ZNJMVJ!uHc5RABTDei!*dGaanH
=dE4RG :eTcQmW<n4DA+$8:*>HyTVQ8WM=@tq>XS:u@Sp6A>N$1G8bQXj<*n&&5ID9CID6ml<9w5KMVDJ@dTTKt
jd/nnu G/$YF!^wq$\bD>STLZ8Vi$EeAH$Zb>l<Xh@\Sw?H9Cq54YKdjlKQlX**yRXXw%PJn8<wQhEFyhBNEhhe
D$PYye iihiM9INP6H>dQ1^y6HFKQS>YM!n#jk%HhPNSiCn?CAI\H+Atp=>pB%>%DEGAiJaRIB^uw/Cy?in4@ah
Rp!AtL Tu&!jlpd14WkRLK&$K/<:/ZmQ%*/@t%T!u%6>%N:taEAcY+?j/!IG%>F#8+F:<WFQ4^uRbQ@ZnRbuMy:
\6w!>Q G=F#Q?jMA^&J&Et:*JWIntRw<$\MuWlYPTj<%b^hqKw9BqKj:@pn%P^X+W@cF5Q6tJnEHjLnNda+TpKE
S:D\lJ \+jI>5&#Xaj/V&VjV84dc?utWWhh\Y5$$?FQ4cDW&<ndn#XaKbj!ARYP^P4nh=T1w%ZLdAAa\M^Iu<Hd
XSYJ8e =yVuNhdM@:dGe1E4btD+jFcJN4HW#6\iNwF#NP!qGe:b<@Yq%dZeMFqnZb1ihT?t6qt&1hbHL=THw\/5
5ubL// +/aI!lk*PY$!:e4/>>\DNZ:>XeEcQ%lWBeG?Xa@KkRBwd&Mc6^+yhw/wmPV8BZw!JLk9j*R<uB9hj>:+
qqV=l/ jkWCdLYpQ*w+*h*/u1?Pk\B<ZA<QRn<eLWGAD?tQn%u*ZG!?E$?ujbWi<h?DblNAkL<hhS+<*hV=NNhB
<tNad\ HN8+4QQhiLJmIj6PN=</9^!BAL%8ZM<4ukWZBPmdM:1S<V$w?8F&*8j:c/tBj!8%?&?qd9=TKtV@I?Xt
-AQi65 000f92f6ba6001202b4 Page 113 of binaries2.zip
FIi<@K =<YVHNWkAJLL:XNuQK@8ThDe@!4lnh>Mj8ZK>>$nP@V6@EYIu5PuS%kqB\GmB$Y??jatu6^y\!8DACk?
dBVet1 Kn/?M@^9c?\GV+m!Q#K?dZX?Yp=&MKpqChDiE^^Ndqd?nKTGp?i9TGw+&Q=@py4@yTR%*Rww=m%RmG#K
RyS/5H <=Bk$yaVpiPZ?y8Nwuc8T:^I\514RAa@acwiE?FCnNc#Ia^/Btu$+:Q<$dcLK<a9cKy+Ih*PNwVC\14^
NqcAmt BTW=4yuFNhX5AF1YiBV>IXdSZ=l1iwyXCcARSnpu8WlTqcjaK*nqaB4AayX=8Wm1qdtmh5#d/IQRSVp+
Kt!4!b tlnI@JaRb+5HiJCbj!l#K?dq$?KMR5C55m1:h8&#n?>\4<H%q$Te6\LyWp*^T+?c:ZFDT98T8<Hp*dMW
ecank1 YX#qM*EEZSQScMZeqIXbJ>p!91&G?A6jeC81hwtIITVI!WnW5&XeaC*pRL#l1YNaEVJCPKX#a&P@PM?^
1>My:+ Gn9FYNRMlnBnp?:jb1QAbSn1ei&ykwWAp<9dTqPVG=1B9!kW4u%6SnFe@61Ea5T?6uKeuI$=T=kV5j\4
d6I+a& WGitX^F4YjXnKc:e4Qtc:ATa6IX8JDjpI$ann9i+yCqmq^/KAw==T!lQ%J4yY9C$YjYQAV4V%dp<pkLP
V6S1^R dDK\YH8<pBQnMDXY%KRVV:KZ/5WaMHQGin!Sy!he8kZ&<@y+S>*C88QRJMIY^Z8<FS@!R4appaNPpw9%
p9Bu:K T5inMP&+dG9u>VpdMM6mPBDHV=94>Y:e<FMNQhP=mFSQWp5?DI<F1&YFwNKn=l#j+ckpB8j$QtLAMtB6
YENenX a4S\J>t^Y%<!V+@\6pdTlS&teW1Iub=Ga&BB<e+u5LqZe8dFKLwqnuM9b/#\#VSE#ly9j!iwQ^1:ty>n
mwCT*d m/qde\&pH/8k<lp#jXG6kuL<MWGcj:iP?YS!Ic>NyjIYDXT\dJ/yaFR<!hCB\jQtbRQa#1&?8h!iZumH
4Re=Np I\G4*yJJ&LA*qQmRFc9qc/$MutS+!4CR:J*ZK\yplJcV@HMeGmG&GniDmna6RSTH=GtB?KqA^VHP?t#L
#eYC4i bPK<cXMbq*:BbpyL@\!5q$#W^!VJyhM=5y>5w%@tFYd9H!NqE!NIbm?^F?!@u!1bW/wCLAyaK%htj=cT
Fq?PTW a:d=%P*iEY/5c85D/$lTA!Pjqt8TL$+<AE&c=QY%G%\*$Dt8>AMuejZe6keHdQElQp\8HMGKFA<XK$5:
TK?i#h %@wy\p1cBA6QI&/D@pmem:#%ES+nBjdX^@eZ5P+KL$*KqIj\^Gy!hbT#MaDT@P?n@d5D@Ia4R+bC$9^h
GG/6NZ a!%5k&<k6A/X\iKXjBEP8=9Xe^PMqwZ<mLMVtL1eHZ9I:h\HZA:K$iNjEK!keJc&IDR5eKipi6M1mDln
n$<DC4 kCi*Y5wj/pP^ee<A4$*j9+h4+Jl=NG:6Wm$LwL$Q?@#!T1:9DlIDW95qaGk6uTecnw!%IY$#>?ZE%Ly>
Hl<BKC EX!Qd9mEt*DaVM<Cdal8uI<BFM<GW^F?uZ%Z:w8GYc>p!lG46FFqFMYdA^RDKNV$Tk?lV4Rpt1\T4R>?
BZXqYF ?&K!<+\q?9DB!ZaKiRW:mwe$ytdtNCZ91Hda\L5B4<\mpanK=tHTi66w#FZDlWiCM4ZC$H&V5u9!t<ZN
5m5@RZ P$TE%VqkQei4MZwS^9W/+CS6K49JJhQuVG&SEQG!!wDMDiy6R&>yqj5\TRWj\NJ=cJJwTFVD>^QZqhWS
$Y6?*T ySFctdD5pbA@8DpDBeXL<YGtdIPM=G%bSA6*1>$R@ZQE8<PH\Q*Pdcu5MJHAEyp:*1$u^:GQ^YJ?JThE
#$Ltwd a=MiLZA*HJ*PXL>Ct>cX!dY4!muNeJijI:BVbbPh\%utQjcHm?MFqyYRcpq>X/P4L/&BwdTSK<L=*DQt
WNdmD% Lnh%k\=pF&Mm>n=FeybXHG!cBW<:htXQAB<Vp=%XRdDHJ>>VnS&TqcGnWXDIu=tkGTNV$j159&F/wF4>
pqLw+\ Rj*CHn*BAD:YwY@569umA<AbKTiMm:L5>nPXZRim1<^EK<\:QpKJA+:C@W<hXCu?^!Z#d\DbdEc4?J/b
+h%Q=k :<h!q1IuC5>H!4+<GFu9u$%T:Du8W*LeDqAGM+FDe4$#BJLJci>^WB>Q/1AN<Fp\*#eTD?$\Ibbqj\SR
kwaHb> $+KZK6nS5!wJM<CMA4@S9<Db65!%kk\D+yIy>TKblMkLH%Jci/Tq#u+Ru&QC/l@d6TF>cCm@YtNm&eq\
&9ZYLl NHp#QH:&Eu=a&$yCM^>b8@EGj&HGXDEmqyNeE//kH6ja4L8l$9w%akkHZ9:$iAC??Ek*typ$c6RXZ+e+
nTZ>V6 w\IV*WIdnpqcyGayn^q>mpj%D6:+1!E=*B!e&>S=9=i#j6PVi95^?ZR*\9t1YD?$=Y65>#LNQyV4eW:C
*MB4e5 cHbXm#cwidG+EwK:I/H+?H>1?NVdZK%tGGp4RNjuqTjpdQ%wc*A^!wnyVS#@pmG?8::9?k&MbyTS/DtC
D9lc&d M?hTBJV^/HZkF&ymSJMW?QTGlM=qA\Sp+wB?1/5BHDF81<:Y#ath$eFRPt/L^e5tAm1=!T:tA*B^:a/K
1Kw>Ym kPW&u&qT\</G!DtK<HE@HpW^>qnX4I%%\1Y$p?LlnN#/dd!^WH@kR><>CW6Ii^GNBZ>k9u6TX@?I5pZA
SDY/8W c#tFm*iPRnbc6pp<64=#SVWcmIKZVk6MayVS6Rd4lu5G+JFh$@+dt6dM+jaZDjQIBM99q:%h*i\w@X9^
Rca5iY aMB9J>^IW&Bjnbe\e1^GykW!?WdI:HF+WuWqE&#E55BNV:#j\HFTa*X5b=B1Ed?QCQ%KQ*hq/MEADe?%
!1TEJ! ceD=<Y61#M!NwyDT@RVyTS9n>&@RWK+Y:uY99aJ*R+a/E@EmD4WWd$+=5dmZ&5R:QTyhXpu1^*$58jAY
/uF6D% aj!FtB@GXphq4m\P=&WT?=#%y/iIkaw<SBDJAeXw8MHTA\VuR9ZIT^9LTep&im&ZDGmLp6F!pPTteKb!
VF\Qcu A$9yR&<h1RPKhyK*@WcWdCa$C\B5BbBcj5JI9Z+&IbEK\tNKXX&P?bd/akAlbuFmC&atyVukh19BiC86
P88dQW RnaIHmdbPQ/%SdluwEe16jYeqV5W+68:CFj8W8a9p4JeXyWhXeTtWtN#KK=5\/Rl=dT8qcTIpKI1m8nA
%wJj#c h?GNR>485K\S<CPK+l@l:M%>#q&k1=MSy?^:!h9jId^HkDKhGwm&p!y8L/yCRItCNa&Cee4?pH$5J^dA
/bkBj6 hk+GL?E>aq?/#8R*K$c@GFIKB#AWG:y\Bcl1b1hqMCjcYkq9qG6AB/$nId&Yk:<Xy>p6Q\QZ&F@c@m!@
\1N:!j Z%H4?WZ@!P=1w*\FQBKy5+b^kDFI8*y:4@h%u/Pp*^qB%%hS4jI4/@Pi8d/BL\/Qia#C^m!8%@DHa+y1
qjpl#k 8I#kl>PRI!P1TTiGdCea?/QHuNC4k&Zip5l>1lJDIAqGNXLPRIePjiQmS\ka8yn>?1J9/4HG/u81u@84
cC@jXw 6+N>\M+8jCSeL&!>NcbamIluIR4JQ=VLew<+IW6kta1*^%YWK>w!e<n$/bIQtcJKPk#5+Bh<^D?S%*iY
?A%:$k %y?TN&AbAWJ/AT*9H%F$<<jy4WI=p!&?8iTYwI:wb6l:6Wj=yjpJe#9jTqCa#qi1eyd#>5I8=CmTF8/D
\jJJ$T Z!9^WQXJt6Q9d:Mtd14cdpMLm:F\Z+aRP5#ab%=A\%Qa$WyK&q>Ey\XRWMb&$qRHcQdlmFpn&Rtjbe8c
Y#/ZN8 t/1t+QSKMcCNFE$a&8W=><IWjlHHWad9$ZJ>lVl8BAFJj:9QR&iJpdG9dC1LwSeGteT\8w=W?tqQed$I
^#Am6: ^TZ+FkwREtIV\GY?NBq=Bku48n<!IS=TGt+?y%SaP9wFIRBR9kLQQ$XJLMctGG#q?yZ?M?Ltey>FwjE\
Wn&F\! 6c/4DDy$/AyR$Y?@%TWKT!?\pYLdNDjZt1>YuNuQ*4tYH&n5Y4E6d4d6D6#iF<kNy>=ybdCV@SDp>YA5
NY+6dq VCj8Bi\FYA/4TkQ5wM!YGZy?IdZl&:apRi?V:lEHb45!Ry$>CD5ItHJ1B#A#ZnbV#!cCTh19!pAJ=H5@
4k:Ftt mHIIwa<K&WajWRlDdeanqm4C?K*V1*PDmaL@=h1Em@q@ci#yQ&T#+TL?LaLlu++/=YL=F/NPidn@c>Ry
&M@6Ne D>e@F*ZK\@yd5CpQ&?>@&Q<8/9T*aI&@D\Ql?w6AIT/Y=%LLeLE>A<*^M%wdL9buwNq=j5Kb\eZ^HDVZ
6!PeDN #>Ce#$H@LCmNm?5=cPcjQVj*M>B5uD?4t?jjRZM#Q\j>M<t=Yb/Bb8Z?TYAa>*N$nbZ#b*W@S>haj^aI
JIASFy !Q$eZYNq?WupJ@h#hI*qb:4G@S^h?*ueKQi#qI*nb\@P@c^Z>Cjl66\<@\/c=#uK^5Z<p$duibc!@a!B
GS*nGL maj%4&L6@uHa/9Nm:b=c=biCuuTNlbmXtiM=\Za<dH<y#D>5!YhGIV/Nny\euMV5LG#EuJ#Qw8Dlaj?j
>\>bW= Ewch@Yu<jBwVjwu5bPF?Z56\@H$a+t>!@MM\^N>=hbkWu*1AqiW9\lB=PQ?FMETP*<MRYb=c>je\SBa&
S\AS*D 6u<6DyGD=YuP<Z<!DnEaWQy@hS\m@H@GITajQayh9N#Q59J<tceu=?LmlDA:e1LyTS=q5Bdqqe#SLZSS
!N\b1E iS<DAtnTKj%AQl$HAYlQlpCAc>N/EMD9eZZn:!>??Te86n<j?ee/RXQy9mN6F$IQ&lXCt$JNZQhqXYRk
?>Y?a$ \H#+:CQEuh9jZiu<&^YZmy5*8?11Z*J%ca5yWm5AECYW#h4iuVj1uLjB:?:BSl:AdnSAAHw5wuQE>C9w
kmDXTy Qc*:ct$RwI9Vcaww!imm&\\EAC\JLk=6yC^Yl=&!9/HJJa?&d5B<IdLBLZX+ku^nGjPw1qV/EQe\iHj!
mFL4!B wGRQtn//=dy*1h?+CYwCASJp+8w1:DT@L!m=Vq:DD?iE<NnAp*lK:$cVEi\alaj&uapA5=Aybjch8QF%
kZiedH >y58huBNwublhp6MI?CDJa::Y=wl1uy*Gkp+!!yECmbjiSat6euFaZBPZYSqIJJYqh*Fn6imKRkj#eJ*
<wAbP: hB/pu1&4FWw^^Mb@#9jiRV/mFX<w#Pp8eXJYm@Fn9>P8!M\=pE6jac1\WhHX\T*Rc$VL!^Ku8e1KaST8
#eE*X< KXIahItQ@FSuPRtcPZR=ZNdM4*4yc+W=6t<#NWwLhKSlD+%RY/IGtF9WZ>LHSmkA?$>iG:e%&Xqip@ny
auN#?G \@RFn=btK6MNn#/w>C&m%e%i\^44MN=ZYGFWPJ:XlAK@\#9au/A?HG%Y<E&$^%kReqD!Emdb9ZHn/CnL
9?E/>= Z6d#<nkjK#CtG>=NP/cEmHNwFw&EZmbwP8<tldHjYTm9WJb\\Qm&upFV!<TC/$nYwKTQYZVnJN\<Y%/W
FuB9G/ yhAWd?PR:Wq8QXjHJqtRt8aw$:Y<Hy!:yAN:!l+l81?>+$t+Mc?h=\F*Wi?TbAuHn@N/T!4Jju9B/5QL
=HjA@$ GAchw#A<aDTY@$ey!!Kt1PL/mM?b8%@Pa^ywRAC+G/jHC5*PC^4jRk^QVFHKCn#:8HZy$I<Bbc#FSMTA
d%9lI/ CRwRIE4VF#V:=#/P1QmRP*^enlyGb&mC\iF6J/@*Y+yjIhDe5bMJSB8*VS/>J&59@#RNXepYi8ue>^Z<
KBLk@& Y%/m:>iLD^T4V%119=GZA\L+G9nPGE\?cI#@/XJhpi+6Y4ep1TqC>NtM6LbcBHb5HTE:SmXYXayqqLmL
KE>Ya$ dXQeRDc6bIJ5cTpuZGp6AQAm^PkRQ88&*el*/Kd#8NByCq9w?uWHCBB*/V599=HN/H9<%ReEIN5HAWyV
Mc4k9c 8iStK1/K</Zq?Md&bjLhNC$FJn^HRRC<e6D<Wc6/BFb\$el?cLI!G=EJZEJ+^Wu4P#&??HI\/NuQd#M/
?TG<e? K==8yNeT8tC/e@N^NLw^dZt1\ueq@eRXBBnFuL!QiH1V>XIi6T6>h+&?:h?8hq:$8+EAyCBAE>jCHkmR
-AN5Hp 0008f80ee7d001202b4 Page 114 of binaries2.zip
YaL*mH VJh%k@*R$6HEhF?nD\IMhb/PZ:j+:wWjQE1AAI=Pj!ke6HD5?:?pwJ>IcYwLqI^Dt>t6y$eVPdw!Ld$/
d1%hIB 8c>EauJ\VqH^K5cXwlK6=K/&Zl4wm4FW!:RBARdKlECLl></L!L%jFh+tY:j/ee8k\D6%W>Z&EGA$Ek>
Di68h4 #y5/!\%Pl<8uq&u1hGX@9MQ?W>N+8neb/nDHYVatI\*tM4e%IV9pk?/G=Z=ZXw1<a%y@^b/qc6D1&4\C
b^VkZT 4hCM^WqjZKd#j>R#@R@1$j1dk5*<upEc\8V^&nd4E1Q#G6HJ:<qeulYCAKqqudhlKj^49&u65\1ei*/B
J/dP/j <<>5maW@6AVaj%91u>5ZtdDF&X!:W/dZCWE\h+&P%DZanKl%8%JMXl?^^%E\\+Cn\9aNk?D&BHuLdR</
AP/utF jYFNej+\ZlMKIt*p&F5nTiZPT^9ZV5$thRK+Ij&=EA5pZAlCC1&+V?t>Z8ylVb&LcSb!wckaK>npZL*Z
<lpyIn \dVe&FDFlWZj9H!/pYeE4iqHGE#=eeEwtpPkMLQi>Zt^pHaGi+\nkkBypSHZEhcR^1yKm1LcYS4R=L8T
@Au>&& /*F8a15ImIRN?#Yi%#d%%>Ru%NEY=LT6NPcM64&BSP?KBa/Y+PNBkLGSMhKt5P=h%Ak\5jP9>AKKmSW&
wJBEeB H#$PiXky:!bRB@cMA#R%HMHTI>lkWbmphl+?8X$lJYZnyPkilyeZt%?uKth>q!pnKTbYX/j#wZ4:DnS%
SYK&ea SPP::>y68E/B+Vw=yQd=:cELG41l4%*%C>li:W4GTF6LEuNmN*YKSMI4ewc*u%>XMX%t4Lh*V4l=ZaAA
E9eJ*Q QPMuw@eHZL?je&/EyhJL@/:b+16=1ldX&6P6NF@^THY6tj%ty*/i#wp&tXFmjE&uSP$^kjEkFIJ@/#?/
H/Iq9M c91wXbY?qVALQ##9p*A=9$m\!FBDW!1nI+NJ&1VWHGY+NFpmVqYqnqyGCGZawh$EM\T4u\JT%$+Dwy#G
HH@!^X bqVSEX=R@M!XjILTc@CGXttHH>Y^48m5FVTjYleJ$6ynmIQbDXV&SIkYWB$4\TVnPSPSw!Wk:cE<98e5
+4E\p* XYEXYZ@V6bm4N8nuLPBjGLXhdAKd#6FbijlE1yWkm1Kb*6#:klG%YE>KaQ#nZtJ$RS15a&XLChIR*Xi\
M$i9dp 4%C:jFNuRPRHVIjH?!h4pF?YhX8Yj1ZShHh^<Blj/Z6e/VT68jFqNP6Y>8q1cW8ulJ=9J/Q9Ei*Ba?u?
FE:P+u u$BbwJpnECC*wuMnSik1/eptcdm>DY<EAh+?tcEbnX@6PP*K\<*VBSp6wY5645M!y?>:p\<W?4<c@H<S
eX\l+R N*&pYaQNM8^cKHqAk1*F%+TTJQV^ZJqb+tP:bk&MTSYT@Aa/Y+&X/Ye=Hp5PT!1**$*Y*+%ZeTi?9Qwd
>Ck>RQ u!Sit8Rb<DVL\KF$bEhLcFDZqV4t6Km@4wA=pihT$L^j$qq4CIS@9@Cy5QbHT$/GyuybcL@y#dj%%KX4
Zqi@Lb Jtb8@$=^1RFDT6Gb4!^#EK*J8&<Ydd<X#q8RhT:$mF^@+MAe1!Hj=>#QITD&WCdj=c:nWH#kS!a?mZk\
+&h+1> =I8SjMFC4ub<Hm6#Qk&PRV<&1tkS81NR58wWBk<C5LCSQwaHa>S:4^WC\*Vqcq6?6FXCj%!+QyHTNEA6
aV\E9+ mImWH<dh9*d/k8IeG^=w=NB&5YT@&D4DlqM@F!jGlZwMSiGnTQ!F/8:L>8$d6Y$bJ9+BC<#bHFV&8MZE
\6@!a< >H!JEk1+whZ$/K9qh#hq6epycc5%\^RVH\mRn:Cm$aq6S\w/\FYG\AbjuDVikPaPL#d5m4YqCkcye#dZ
:pJP6Y e!6BAERiCJ4qJL=ZK$&W4A%y4=AeHiJ=?imNYS!qpZ9&*&%XBT9TDj9G?SKhyD?>=/TQRw6eFI<T>:/X
!998=w nuL*Ed<tnE/=\j+qm!@VBhQPk=84$c:S+P&?q:%\kaSNy8q@>NL<Wbyi/lW?NH=T4d?j+FSJ%:JAT94L
Lb8eQH KNyJDRZFEe#&aC461L\c=bQSGKb!8Nt>kQ!Lk*S!AGiX^ZqcAAPFKmLMeSQbIQ+n#1ZSk/GD:^Gi:^*6
#1Fq8? ?Q@+$bN^Q@Lhm8F+W5:>^ei+IlCk6u#n@@C^W$1X%b!:uX^dt6eMuh8P4wbBm1NEnBQBbienl\=w<WnZ
>Syti^ >#=9\ikTDQp?Xb@:\8k?q=j19q5EBEDBijP*uFXVZ&=?!%kFh9H8Q1@SmEbw>?RkC\V+Yn4=bQc<uKqG
lwlEnS 9\p:KpT!E%%&8!DViR/PJlQ1#=SZMTFweZ/4pYC*^A*VWkhL5S=c&84<<Z*E>@yyWI>ui=KTj&Nu+&tm
nj48GR Ph@:KD$JA1lj?5b+Q\t6lZ^DJ9TkN9+weJH%wC?$G@t$=qHmin/\/^8l=<Y1JtiNkc*?GS4P\m5Y^Zuu
GYI:iK dJc>w!<hMCAA+a*Ta!ZSlcV9dhGV%V4^@b?R+J<Au1iMaIIATN4^MKW6aQ:AECp!5$#j9#SWkY=QjWD#
6*Niw4 AcP$D1D@XXkBqy%BbKicmwutBdu!%&wLAX\F1ZZYT!9R*Mu:y<=KG8i=>Z:H/:yneDSVQ#aSytmQHRjZ
E&k&8B \F+mABmR+pi4I%jN1=%nLRMZkT!y+IeyyEuuH@=6F9QuPwNRQSu*688d=nnK\4b4\:any5Gl%!w?!HFS
!Kltc@ :jY6ENWnL@N>b9H$VmkeQyp=8^A1b+@iw<R5L/@5R59@YwweNQj!K#ib?pXBaRXXCejyL5PlqL$QdpA$
Dw5MP! m<\J>I?pDpw?qnNBMRmtBFJY>k9dqI/c&GH<RhJmbWcJXd9?/i/hj8ZFW?1eF>TNhZ5iC$:b4Tt1tVmt
1Fe>Ee /yJN+SFDVCXnq^ndSuPa&R>bTR#6ieaLty^KL#&Gm>ai9GDq5$jMh$lh4HaM&bNcuhcd\&?w=KYZ!X9d
%*S>qW +EcW5#VpAJc*@b/5YBWi\DcpVG=eIcdQ8Xpb9EqZK5B45#B!qS:h^dS:1NhQD#?RXMLB#dp#9ICNQ8u/
T>?5/! @XWE\!AdYZ/*NK8+5YpRk>wY?d*Aw&l$=$Z4i4ibNRh<cMWy!b6ZeL$b^i99wVL>\BHEGtlWbAqAC+hC
S6nhtP Y:&EeaJ^V5Y4RYq1%GtcP8dCM:eZp9nl!by4d$p>8JMn>4nhQdjdd1@u^*5py#9L1M:Tp:m898><p^K:
jCT$Jh 4AS#It99+V=:GjGiXJj8@GGqqtulNSMF9?@P\jaQJWa!i:/&t4pC<d4/ht$H^QbaBVI!nmHZDNI$Hkmw
H:Z1Na $k@nY4+EnBHDC?jbLMjaym@=b\#6#wiQ9QkVZay%uRd1d\En#SecWTM4:Cqc5G=P6w$P@Ak%Znq15\jW
l@lPm/ eJ=cN#KFQZu&mpLp9bVJ!+a=9kInq?HcqX1SdkQV@RV$cGIV@yEmnc8E%^5aNSecITpqp?YjDQVVn!Kn
nD4Qqe =TeIYYiwm4+Gc%my%PR+VB#+uJ<N+NiHpe?SS<9N+8X@AZiPVKT*>a@kJ5IYHX#ykJ6p>h*S!H1c/84!
EH*N\Y L#hQZ&$&c9c@LZH1T&?CnJG^q4:NKhwIFQA^i>S&/D^mXdwnG:&?n4p^ibwp=A<Lja/lY%\R&k6biW\k
XHVkSG j:J&@P5hNW>4HM/N1@hWD*H:j:1S1/4eh^T^/aFTBkR\>*#:^^9*9G+H:/6ZjGjM5:=Jyj?y\E+n:ch%
\91?Tn Fd:V4Z#C+>Dq$!##V#Z5*j+BtHS!RuVS/@A$Xau*@WVw>CjkM!8+?QmH=^#@B?XNEnn+d5V:n5mMjtd/
md5/K: DkJ<1Yy/&LnZYd!Q@Eq\Jk@ZZ\SuM9M\@%>BGL:>@\JlPA#?Nnd9H\nDi\jBlKQ1pY1l\QMkB/QAyB&d
VMPe8P ^WiQF:mq!?aI5EL1&m?+whnM%*CBdEM>HWyp%MJ>9e1lc5BIMk55DMRV<R8&aLalaSbX6m=qj1Y!&>&G
EeuKKH TDK@VhcJtplJuH+MatW5ydLZImI#K9S8\B+:iZ^$Gh4\wL%GYGqdA6+SqGJT8qH\=nJ=Pa^yAwVQ6Hhe
:w>#D5 qcQ=huLAYl#hikcVhPySLhq$@6YRuFV:8!WQc6QaLw/=TelkMHj=V9GG@lcK$Ep$=\<MJNZ/iTG\6#Pb
8w*^YA AmdNnlucMYWQqG9e#Mbj8?GyI=6W=PSXbBt?9b^wuiw8%w&j4K@u41?=\npR%P\YZ&/1uIeTdFV8qw9H
!auG1Q WMFyh^Miit@\Ip&N8+MGLXI:^A$+t#S?SNu?1pj64XF*4H=eCVjFiJB<iC??lWH1L5+SFDn>P>kRq6DD
8JMIqb =n%eh^Z8ham^P\^X4lCG/lA>kl>NR>X?B*Hd/I=68A/%^AjX+uqILVnVtM%HdbJ<?!C$TM>&p9e>1Nc/
S*l%Nc DXF9?GYy\p^pn%:y8cwX+t6h&N=YXW$t\=ZVcjJD5=nk&M>$T@L\d:JJ5jt<+K4pI#KDN4$TwqkPJumy
!j&bij I5^kN4VJ!\D9?:49?=d4F!JDeNp>DISQL^qYjpTBWl9G!&TQiG6P>9SbEQLw1dRaYlIj&SdK<db&JVCN
t&Wl<6 hX5N4kHCuLQqBt4dE*hB9BnTwMnR+mRTD\cqQS&1:\NnBQE<StjZ6@tcuHCEbQ9?#m>pcjcDqPXplyn6
dn54qp Tcc#6l6dS/qjKhm@D\X1qi168dY4:\8ASF>Lj<&/ZFiS?ZnFA8mFD!\Hb:DFZiuReH!SeI#mQ!V!1bed
J+ZQ&^ SXhPd!Sk$*<!EKK&FajY+mXN#kH&a9bX*IX4AP\%<GQKZE/Pm+9F5ZN>\<F=/I6&mXh?AXARGB9I8TQu
i&QymZ *9ImYF*etuCEGKmTjkWadGkktQiRp5EV#TmpSh:l1IFhd/j:GwK6HHFNMCARcqbSyDk*ejLW9WQQEVZb
&bXli? JIhGI1&yjbm/tD8/XFDIERS<+TRmBn*GwXI!eHk6&Rt/?&P%S9nW/c8t\/TdLSA!h?+6ct!N8\C>L*aC
w#PF+J S*\PE$tKbwqR#Y!hwm8FWTA9IeMJTwtCS!!$FDmIH+u=GV*PCZlDhBL9$hXiBdP?liV::5qX+Nd4m@^m
@wPeK+ GB!tq#J^m##CTWh4#FLjdF@eKmq<1q6Yane?IJ5&?VMnViYRBh>?K=QFDC%H#a&w5jRWhi=WLc+TnPRZ
cnNWae MnVQSGhM4m:QJS\STFb%N<?XQucQ4AQ#I$pGY*J\9#RMtu\IPKi#>%^LBwV9!=FnN*PGW5/*Z9VTC&iy
4qdB9F /9wpj*jmwpBH?SAnpVIQ&@NI1J=y+W=R^6QEl+/u?kCMDm61Naib&\JRe%GQq$QF4y6w6NFJXP\%#&N>
CA%mta pSXDqNZXpEq1q>nCnk*$j86\*qkF9l\PAbj+aX/YM@W:Mn+yAk1yE5tPqPnuhV&&Vwh#pR+hGb#AqMC?
<wdtL< G5#dF#ZR1?>t$D$@JF9W!=S8d8Nj?El!dH@EcVA\$uFdc6V<SMSP&%=Ncq+Z/MDnRW1FA!JYmHM?=l!c
C?#K9l GES$QEtnF4jbZ\CQ+F#5qtbnPaNCi&h=a:HST6%<LIGljd/Qj%AZJJ$eQ:u/Sn#MCcwhMThpy>tXjH$u
i4H?$Q ##SZd1?hNPRGLTYXCT:wIVhy4/j=BEKP?mB186W$wLXdYJ?P8A<nYHnPEtE/R!9Ei#t8uq?T%KYIK^<l
pKDQHI /$Ph4mmmb*yW!CRTHw1qc@mNChe:XhapMY*ucJJ4ckqIGpk*a^l\FT=E1e%PeMCb<AmMAmTaQYMm!yA>
RXM?%D Y15P$HkKd\h:Z^TyllCaD/Lb$^jFl^FY+!9!jl>pCi&9G1Alc!PPknN@lSAGS&kn<eKh+4QH&$X&ItGJ
6wK<KP SC4I<?KF>CHiCE!ZuQ^6h^tS@Bbl9/:CXTpXujAB>SV%V&5%\ANV>^Ku/wLHk!duRY@Hm5Y/$kc$H5yL
TNSqTT M>M%*/bZlY6L%NZliRXXHb^\WnyaN<RaDJ?!+jyjFeX89Q#!IwcS!:c+PLbu$mC=$SV4nTlLP+dt=ql>
n+d#jT <lkNG\iB1iTJ6Fpn&%EqCYD>BWb4DCNNS#94L9/4lL8l%dnGm>XF/N1EN&\MHwba%P?55$+!&%!?dq5b
-AP*Gn 000470f80ee001202b4 Page 115 of binaries2.zip
p?AGpX tIM<\NL>GQBniSd*wD#R*+\w>t%yN>tBb*$iw$?>m$J4VBM@wjGG&Pb/=aqV9%H!Hq=AyH^>=p^+w<ul
w!iB:* ?JKN?*+Ch$jaITJhFy4eCVjiY!a1ilP8u*IR!@XiAD*5C#5H\R4i64%#p!!Y\PANyL<=Y/c&K&<^JC+h
nAjXmH yjuudEjXaVeK@pp/9@Jc?Ny%B&kB?/l>AGc1u<w/CcWNLRXy<I1dDS+Qdl<P8*9dDD4a9c$$:4#ndaw<
C%nME$ 4pH\Iy6$V+4C$YD=LeG4R@QBH+WDBN>HebV8%SJy9?eG9lb:9h/P*PiJIZu?/6ld+S+*6P&SwWc9E/:S
BDZilm C?Z<$M^aSybGnRMKP<6!XnIb4HJJd6n5SXaGq<=pQLl:IkeW>eYQTKhTLDE5mbmt%/S/9c?hZCS1*>nK
PK$N?L cIebm4LQj4MRKFwmDp66i+8RFik&#HeNunA/#eB*5WH+<yW@YM95QtDc^+%6%\iFptpG?kdAY#J#C%X>
iW4k?u l!mNWCH+69kmI8RYeV!%delhqHnMjqkWEuCMbE+?F$VjKTpwpke8b8jlqY?cFA9aMF=mKA!TmhEjb%!q
NCwyBD b6!MGwktM:&maD4:kuC?HFZ>R?#?T>AW4?&TBE#yTpScE#Z^%mTK:\Al!/V5Y5uXtlLK?b:&qlQpX!Vy
lEn8<l !!4y&$InGEX1eTnCuiw<8HP@Bt46m#$MQ?hGyY$KGKV:WPZCHcjK</JKKMDbmnpJuJQ$:aF:%CS9%1:=
GlX+b\ lmQuqVV^6cK1nDS#PbXwe<CIndIHFCCWYj#m@JRFb1yamdt<EKWdZ8wEQul#>+SWtkF+Fh48ZAW\SEY4
!H/kKk 5ep@Q@?&5YuabF!?:di:W>&%a*Y@K$9P/HiE=ET:W$YHH4WyZpWAla!VJ$YB=JV@6u4EEQAFc=S$jdnD
BDknJS +kmRDM*?Hh=9tT=E9>#hlJ=RBIEWCwG&=:M:NV$u&XmlMpXRaG+h5GAeGtyJCn4VN>S%I>>YdK@W1:>T
CQiq:* 5e9enhqe:/#L4twNV$4cAPFdD:F1GW51dc?4N5DT&Dw6:JRkeQJdVlTqk9SI<P/tlXP!8F<&1Sppk&&q
AP\G^p /cF/pDtnJuS=NGA#alLB9?ld#lEHWqpj5@l/KkYB9!&\Baw@RwLbF@bCdE>W*Ta/!H4Vb%k/SFdXF%1@
D@cN/X FJcMDA+8Q#!*<VAFQ>aTKHHF$:6FRBEPBGdutBHMYL^@aV1#!QCN6+yd>=BRV#YiY8X#%>=RPJWMkS?G
^taVqq l4q<V$>=t<R*em9?blp:EqaeE>wJp/AybT9TX!jHVSdWlhuC4YXD8XKRH^F=:Wa:P8W$ZhYAC&waFuce
>!T#B: m5Z4n1HKVZdd!uak\mBk$+EAm8\kmy?!da<\!:F%h5\HFny%C#ewGPBCb:+eK%$6R\J%WMkZ%yN#njHG
bq^XkF VZHy?bA9#Aew6*dSLwQEtWZW49*LW>Gc@a1/QIH^bBC%9Lu%e8CmbGwb>KVT?&J?jYj8uABH8bPAVecA
e/bVTp <j^GG%NSaJi%nhwaJGBA<JjEkT5EkFDE#\M@m/:p+j/jb@d<L&Tij^h%!WH<Y<DGQ^%%!eQ#L$Xh5nK#
k+h@\1 59%>%PZVPhb@J84!/Z:tQ<Xa@m$T=e<^L1#M#H<SB5ZD<:\a!!e$!*QRuC\@RdM?B<*C>SM$&#QRHN\@
PB><>4 1=9>*$J#QAjN\9wVNPe#$P\<Q/8d/#qw>y?%G9h#$M\@/&?ib/Db&Jn@G5*C@G?lu/N4Q+uRjEI@S>ha
#+*ZJu &hq@ku/P44H?4L>bu1N4LJ\@/VGY=?nc#!I$u?DQWVaP%y<>PNi@lid?6>A<##I8*H?Nb9%9E\>!M9I\
W#P!p! 5n/bVnbG>9@I=YjlctQy!jnK^6&c$aVS*MdK^6*Eu6HT^6HK\6Zb%ed^q?DCj!t>H!9HL:u>PH>>KXtj
IyiZSp E\j=t:Z?W?klD<>@H*4+P?ul4/GH:J#@JjV\6&Hp:#:Z5ZQ<?=@4@9?>%H@cT^$M%m8P!!kmJn@HIRJR
uCF*uN ^c*La@Ni=GcIVX66SA1M^iACm#BGkV*QX1aJbt!4lYJAmIi<dciBAN#u\a+AP$6pWP#^<8BVm:9B=F<d
eaACNX N<BFGtMMRuWHQc$%=c8L=+Am\qMaISNq&8#BJM*KuHKX^c1:w@GZ4Dn9EItHX851!y\\pSTG4DGR!j\P
11hAnA ^?ZauFW+GpmE>eilGalXeSXN=i\^^BS\SFmD$X5DSbVn/%TEY<ETQMct6\B>4JF=:6W#<yeKPG!#*hbt
+CQ65N \yF%P:^a!llB?<^BEQb:LG#%jZX/WKkwqlkIP@RM$4>?%w6pC#ZnYeVR:%YT+%Dnu=PdbnAe%*J4u:cc
$\Eu8/ t:q?d\nFq5GA#cLBdCAHVS>dVMy5H^R:Ip5mjDdH=hy?KTZHqYT>6I:=Ey>jXY*e%>\w/WWn<*4WZlVQ
*bq%jB +y!F/A#T?Qk4A:qLSF!P8hpMpLN$KeCCemwTctKk=8J%mRj4HL8WiN<y^wGhA86HBZXIHD4d/Sm$k8@!
HE?jN/ pZQt*W^Ktl1%GCdPhX^Bil=JZ>Y+*Cw6SBy^C1JuDG+q5ymMt?w5Yb5\&ZnZS=wF98Twpndk5K:h9l:q
5SFKm* QlcB+qPKJMN/>ibw>wMP84L8C#iSyyeMmnMIuB:+JTbc8##5y$k\q+=V&n*9ZjSVPKayc4a?LEI8/M=@
qPh6dH $hh/$pWnC:&Q>BnctqV\ep%5<w>aW!TAh$CHm**jQERZeZYKuqNK8H$=EtDWKlVYP4!puqu^/P\%c/wb
9A4:WB :j41@1tXpm/ZFK@m+8/%qcXk+kCGbRtn$?wTJ^FHZnPuE9V/#J8>n5<p+Npc5VI6YDLbZ4P?DJXG?F!X
#4S@\! M@WKK+ySwpdn\y&E4nhK<tNLZEY1=^l*^l1d@94$uJF=PIFP@5I=P^VK+ddw1Ry\KAdl8R$qWIknGkFP
lB9R<R QkG%A&j\Gm5/TnpXjiCA#e6iP5R*ClZ$dXe>Z:BY$T$A8RR$*?C!X9LS9R<@8yChP=6H4lAAI#$Hc#HH
RnIF%N +8PNtXYHlWjS<>mqFbb$EQi9&d9buK*\Y>9WJq<wA*HMT+uqQmkiT/TIecQlK=R&Kh5DJpLRSdQM\9Jj
wI5<V4 DkJbi5md9\ZtwCtF:TtF5P@kEQD/IKHe<k>^H8jLn<Ryjq*k1A+YLCMS!Wi<INl6?aStyiCtB<Zm#lKC
?Ey@B\ e+h4^t9/m1YWy+S/tNAWq+XGiIE5Ed^!S<+5luZGWcm5?e#K+tR*$n?aYcCam6CC*+m6Iu6J=45IGWyL
KuYXX% t&teP=@Wi?=:Tkmph#GGcq%h/&P1:d*^6RI<a:mWNyV6uwk=Iean48REP&MnZCE=>BNJk9$dw5^\\iP+
/p^8pJ !h9^mCKyuGR8=Hk<=Fdw<n4l=8dEGFC>^Akm$81IW6buL:b#FiTtmIH%aQmE46/T/#!l%BdN1T@t5STR
$:AIFP aS@!yB?nE&buTmLiu%IZ9InMm5%HHR+qlyWw=<CaH#CGcIGk<YhHkcy8XaMkabH!Y+yV1Ze%SmQS#h1d
A6^ecI KFKbYlIFj&>K@</=H5L6WK@WM=kJ+/WelMYktpmPD>A<nCTd>hDj!FbcSqKdC9K<BGwH\G5VVithl>el
b49%$N C55B^cAmnkQlHwh8bK@p+>iF^&m%@t/uJ\9JbIKQeqn>HmQCX8&T$t:5CB9S*KdqFX$H5%VhK?+DBFKp
1DiHnG =MLS5p6nB*J/jTQWAG%PtkbC*dB1#8!^6dFlDn4:&/lWpk:HqeaLY=#Zy9J5tAdL&Dj$1kd?411jZEyj
X/^^+t EdVK6M4WGE>FVVY5$JkStKcL6QQTqEmt^q<l1JaW&lbm*Hmbjj4R#4n59LyAZ4:L$\cJwJJJmhQyJD@n
Tql8bw Fph=J6Ek==Hp6J$hbS*Em/@iu6YhTCy4ZL>pyDj%AeYaYL8bh!PN<!4JplG<q&SbcNn<w\*mmpQ:n*j\
St<A1< AjBluJZ?K$XW4<<JTY5SaLeP1c/C95*I85wjhuMBC%%nXP>jK^>>eKSJZM?a4aXTpu$yZC\epK68G/ec
BnEME9 Nm?jJ@hCP#a<H:/YWI<bW^>KI^bDi$lt6b^/8^c%hFLTQ++!t^w8diGmAMM=Wq&qYR>JlIjM5i44S&Y8
#^Q@Ea A/!Y1S!LKN=C*=J9RKQL6/uPi=i>$nd5t*P>PW!j$n4LJN4b9eYhuYu9&F<NPG#6P\TSaE+^RJY?VWAV
RRI/tt j/5tey@Hph?MF6EcB!enX>R9GNECp!T1Tue1?P4%KBV*h/bAn<FZPXtI\M*l6<8>%kw$C:9/qNhMYc%%
GI<y$J aw1A%SyMBVjy?D1p4RIyAw\1Kq$9$qDcMb=*pN%NC#=FS6R/STHXI%6L@Y@um?hjYQc=I+m$cFF?a&?&
G\84&E +q*=IG9lLLQwRa*#CJEb+HM=@iqcY:R*<B$#khhc$luRqpAuVG96NmpumHQ:i<PLL%MPW@ITSSWP&^p@
^KjBu& L8wtc?6=68\=W=&4ujyVP8Hj$V@CkbtC6EltwdceX+4Fmwk:9HNY6P1=m*tk=YhWuSTQM5GCh#p@:AmR
?>SN:y HkwY#Jy^R1yI+^+Xh@a%J&uY6qp5YG1iKS^<Wl*8S+\?^CmS4uVCGMStp!?RQuVnVDd/%Md^JuE6y@>X
Mjw4*a TF9L^\SBNIiQSdS41FlJSkIj$F=yK/cJGh5nC^Jn*XAYLK6laWAS<m>Jh$weEycy<4!D#8HYkV$MXC6I
LkaE** h\S\iZ$ad%LpyXyjP?WXl$kI8t*j81LmG*&VjLM&G&q>ycS^?k4b/kVX@8bpBZLIZlA9RXZIZBjqk@C:
4*d^u& ^EtaAuQ#c?i\uw%=w5<m6wbmai1V/X@5L\ldBq<Jupw%9\XN<XeVI&dFnJTc%+yLkF<!eRGkl>kK1TMl
PI*N1= WP/eh1@5JpBSI:LXYJe!=^IHYGb&PQ\Dk4e^6Y$K*pCA9hukipCXbbJb5X*jFcLWRI^F9V@D=$5#d!&w
&^dcXG #>1X=n1W//>CIkQwp8YbV5FR=L$&6#QD>l?mtIAYQ/+yn6Z&jIDAySCw#/>C%n*jXh4%^*MNGeEEE+dE
FVX!NN $L+h=8WNqaEyLIMFh9&I4ahCWj/t4P+h9c%nIjkyJk<<wnkFlVYecqYE!5MwlyC6BM9P$6^8!M?C<uQA
eBt8/9 :1$ynDydaRY5Ekl!cFtbctD64AwPNquVt6Kbkk$/n\@/!\MMbiHdRlSH^nTXk+HWA??*LB#w%hFGk:^I
Eq1L8# $B%8WDjIFLjiCK1#Be=c9dyGIi$B%k1wbKW1edb8%dwuSR8*pT$RkjV:?dlA!Y?eiTdkF4*kA:\yhNXd
&+A6pi EXldy/FB\G>H=&l8u*tkpBIHpPm=HJq:Gh@8>&nKM@4mjY&Zb=R>LPhBDiVhahL6nZ*4GK&=C=#1G&WY
eF$tMX Q\8Q1mcYb>q+kendHt$bn>w*Y<=DyCDLmd1pbPa/c&jyHuF%YFQ?$YbjtW/#<Z\8Fpp+5RA+W&uyw4#i
MYFnqA P9$BB^+VI9h^Wpa?mBYn=aA*dum:4w!?tY/W6MSR:Tkk:bB!8&>b:TmDnT!?Si=Yny#>RWcQ\Mw%E=/L
*\PHLX AydkR$Xy!5pSBi^eF\%:Ep*=>*iqWXGq!dCKMeTH>YHCcajckiZEuRyI!k^w54WDWABFn%#!%+M\*?MX
Eq^/*D I/PY%Zd$Xit<M%^<eM>/lQ8CjDdjp%mi#Z/hpP5%d+VK*ZPA&RWe9il1lwKj/DE#ac15qAncl@hVdV<$
?BW@uw kDHYXVSiN!tV%dSH/+$dec5qu^^DEp>AbC?t*Nt#:HD6TP%N*kuVbue=%1LdQ#mk%ZJDYepY\T>ujB!P
q&l*5= \uuZAFTyIWl\S@4MREa6&DQ#BWL%t\lN1Kc>>6HtF+ICe:e#LSLG<F$p$:inY^\&>h&MIt^l6Vcj$jde
qbw%=# Mt%Pi%SbGqMuZ8<C>k>4FR5S^eW9e/65=QkwLHj:Z\qRc1cjYjhG9YA@h:Z=84wjuT5TKYmpYP^&XpET
S\:*n* Zi6&%mlQN+yaNI8>G%p&^aPpEPJ#N5wFWPYE1wDb+TI=P=QhS$GpmL\HutIZMF5Wwak4lc=Dl\^kWGiJ
-Au8GX 000036c1bf4001202b4 Page 116 of binaries2.zip
WcCay% AVb5SShkj%BAipFCEyiQPW<E9IhIDDEI^<5=J5$%^lmRqS<I!B@wElaDekJ#PR9GQLK&k?mJMjJ##R5\
81YRhq 5y5C=QQb!:QNXMe\c1pDIwiFlajD=ai:lEjk*pLCBZDRF^iZSuictt:T5w1BC$uV=naqjl8EVCPZH^wd
8F^C*i t^KENIabch?\Z&AM:%H@ZE88@ycM^pbc6t>LHBqHYBtYZJDhPF8CuBkKpK?SZ\m$<IAl#qC&AJi%AK?T
H*Ebc! t=Y58GIIYGYEnKa/kctiEbYi#wEwFeM#Dy1BEeK!Wu=dM=FAVcp>H^:MYlt+PSMm+/hiV11X+LH??X+n
%?=p&Q 9>Lp1:YI*+kc6CyQMISPd/q#Rd6KQ+V8dwM8/4i9=5IGR<#jHIAmjk5JMEPRkE8>*6i6!DM!&Y/c\$:p
?q!@uN KK#TI:5%hpX+LwmRLm!\%<8R\Me9KwR&i#kIW@1P@cG#NhCaDcY/=&c\<d6G!Tm%LIT&\5$>^PbeFPA/
j!*\<8 qG/I+4Y<h6b&W&Wtp$$aFJXBFw%i:*lNLCTXD>*kh!?^FjcSAMePw&i#:^l$uV%+1PXjJTTde*lMw1eb
Jm$EhP XJBcV9kK!<$TWV1RKl4Rq6Ncn9ERSyemMGyS!y%C8VJ4PlD\A4WEHK19E##^9?kI#L4*S*IjJcD5\m/T
mj*//B YiD%Smt#J^B<LdktabQX4mA@aGk6y6Hq<eBRhuXnXlTimYT?BdLIlNP#aGRYTMCWV\AHbWZp+CVp%J9#
uc&S86 Q\iRtYcYh#p!8k<pL:IZ15>5aT\WaT\ZSZtM1B?P%J?XpLWymVw8J4=SPwN!B<?ScwA4p=<lHiHhtHM5
TY/5/1 iWpP:CY5mHJS*e/ZHqt/*j$Amj/BF5%^@c5KLYS#bptDwXm<G9C%Y#\@VbSZibeqiTCF6B&KkiyFDj&%
bI*nEF Pj$&*MCEy9QEP+>\Y&R1WTWLdAV&YYyihR5e+&4un=^KWB/1L6nd6y1/GhX#FtimCq!4\FDBAK8Bh!!K
9n++lQ $j*i\G\V!d!LLhJ<Nn<D:@\5H#kMGjZ\uKDHZLH6?TS#T4J#^uDSVi^ZWq$YTyXht/i8#AWD#D6h+eSY
>Y@8tl =Hc\a8bweEE<%Np#$d8%/kWjR!&np/!:EKJ!NS&KjTNG^CR18S8cFBZZ#JBSScKY=SG&hjdKhB$dNAGS
jPTi^< p61cG$FPKmP<t?CCE&debDAy1u&\uqZX6/QaEFd48bkl:y9PRy9KL<$qRZ=4aQ6un1H1IdZK1Z5*kEAZ
$<c$JH mcuGiDVqW*M^A/iSK?dwSKB>c9=*ME@c@kH:Fbh#!@HJ?EGRwJK<HQHT/i^iyNI^8*m6$pE+B?RMKBdN
Cjqm:+ c5hQtYtcYt&Z:XBTw$XdnyM5Hta+Zkhip4EK#KpnI/kD>B:9L1nnWtQZkyKb>nA!DQNY9<H%Dn8#DiFK
=*4$kb yc>h>5VhQ@:?%Q4EBdwdHLj4t*t:QFVcn#!XnIQN+^9?B\1WyK4*/Z6Id5Fp&AZtd=R\I*audKQanTR+
JnpH+< k@5nX@GAD8+mVIPK$/u5b6KJajFj^Xm9JnY@+*WNM41m<pJ1CD?NF+&L$QJ5q1ZjmYewPN%EPIGudJ=n
ap=$@? 9RtYGYn$H?u&i?Pd<lV+whBjc!Vq^Yu&C:plE5jheHLYedPcV5dhEJm*:=b?t=p*Il9ENX1elZmXk&T^
#tbW:m aq^6dm5<C69I@ZGWZpp1$=yNjLdaJH5IClPXlwKH$MLJ\kdXND%aCD$&CnN:%CypF46X^k\q&W?<Cb48
uy*PVt q1$wqD%JC8/kC8pL*8W\VEIl</&qtBmP>B&pye?qu<dZRatB#APNBcYkGe+mtHk1N>:<W1:<P+G#wA!K
?k/LQi Rp:+bRZcK^j=4t^ccQCi>w1$QC%LMb5<By<8Y>H\Ge94$e1ZjWd1P41D68Jc>h6uRXaM/+*B\CC>IP>k
cK@y*d D\Y:Yc<>R9phE:&pyeB<u6T?jaXZlH\Bj?YK?e$u<d@SFePp#9/L$+L>u*i<@Id/t/#@5aQ&1dnj9>d>
IXInMM K65jQ6d>eyd6V!+aDt:P*>$69>\5?l@?Ft=mBybjbGXn@h5nKym+8>4<ew&b<XhuB9N@@9u%Fl6ZN*e^
BC^qk= c^NZ+q@Tlemd@PFA\6HM!h#G$i1Z89:t:ut/?E9L@mwA?&<uj>*$?+6Ql?M99lJ!@I5iJuci@?yla8j?
:NXkHl =#^M:B^@=&Fm=@^LD^Q4j@pA@b9k#@I\5ZI>B@$#D^M4>*QR:D>D<#\H#e##%&k&=tikPdl?<6YjniW=
Z#jFA% cLcj6Bwd/*QR#D>=dnc&b/Dbj?ada&N@By4%b=@6&Vmik@/bu+d6Pd4G\9&#8y?nc#@*6LA>S>qa8Vl?
&QZ5$i k8d=h>D5#%E&#4>PNjmEjyc!ej:EMejP?t?lu/h5Q?p!h9bu9YR@ee!^@%WC49?t&b@JN5HCT5#?>Gn5
!cPZVi V!cWuaQnPT/jQ?e>XQ=QPj/B!?e@CTb?hju<umV$#?X!@R65E>^@a=9k=QlQ6kp8:u?NdaKLk+ju@!nd
=$pAB! SC&k+Q<X6wtWV=:I\+5itp&9iDu1t:BSJPlucnW?4GG8yd@NV>5GAZ+ujnD/E!6E\=>bIj+*Z9\D&aV9
LbSjK\ H!pqF9>IN9HLFX!1YQ=*eJey+9WcFdS1h!=E=$y:G\?/>CDAJyLV$@?Du@#@@S+Gwn$RIHdj$PW\PjIn
G$ZiRq Lj1he:kS8ci$=@1mIy=Ahd$D:j=Y#6d=i<*6V=mV#bypS<Q4TTAA\RilS^NnECBBLk5$jhKmW&i^b#uc
X6\^\8 p^:F&c5&X+t6*Bm>b^K\&qhddF!\jlCui:ZZy:WZyF8baPd$?q5!4$DK*alqp+*Dy:=LnSP+%JG9%MX+
m:VYj1 Ii$6cw:NYqlbye!ESWuqKh@6!Ll!b8PmP&FT+$jKB&MMT4JAM$IG@JY=^Ptn!SGY*=pqCEAALR+Y/i\/
q\PBN+ 4kH4?c4c::%SS8I#:Ci9HV@Vd#e&!=WyJ+nu+AA#&W$$9twTd#Zel4VWc\JKLI9=A4?=$MY1YwZnc<eR
HqbY+V !Sia:t1##Wlm$H*D>nJ&@8=ZXFEp:ye/H^1VBB@c+yQ\EX=wqW%!eaa&c@w<YkVYTX+bC$Z4Y%MS#>86
<Pm^K: 1:ActaLam4%IFYwJ+qLpik$=^PGHZJiuBXL!1d1KiCLAHd<SR?GynhAtH=icnK+^:h==ch&:%wMAN<GB
4!9NtD n\1MCJPk&bQ*9:be%/!PGH>tGT/cIwqeL*%5jHa<lBhnS5uR#Ehcq/!jp#Q<mdhlEnS*LJVuEKb/!y?n
*w8cXN #T*nTBZHR:Pdu^@Qt9cmZ=LG#VcF^Ha5P1V$yAdu*iGS$F/6:\?!>C9*4I6QR9iwV<W1*hluQeL5Q:!k
@8QG@c 8t>WAkEkuTWcc9ZwAQ&j^uXYTumI$pEATw15l^4H#tQcSTV*dT&JYnJV?m%mEGAT5:<wjtEJ\wW:mCZ*
CY/>9w QRYh&pJkAwK<ke%i9wyHeC=BAYHnaX+bX*@%#RFw@4n!Y<%ei:j%/$#XPMth!inV^YkRkF=Sdy!ZAyql
kR%^8e %dyARHqeAE^&>wPe#+jdudV6jt$!@YIQjk*=PjK=C5DiNp\@GeyIkHR?a%S4:XAjWS#$m!PtCN@8y89S
MyhK8L 1=V?#5&X&#$98i&Ne+eH6>>?ZS<w9n4>+H^5Ma#@$ZTQ:/8@@659cPFE<Li@uVLiiw?IubXc?S$MIAB\
!JdIbE a=H4>#>MM$baIECk$$qmZtTGCDqt=Y:t+\*Bu%8CHRV+5c$DAw\SCF%aPBP>%=NHYcE5N4</TJtTmK#e
$A<K*m /%=4?iFTIhZH>/1Ltl$@>K\TKWtIPqGK&Xk<u1+qJG6h\<><X?dL%=hhVW&<Kt\#A?j^cEbqRXEw6*dZ
cAlHam n5Sy5>?>@cELpMZ$Ra5y?DFMd+@ZFSn*%GL!EG5ma%HJqhc>dQ5iYw=Gpw:=#tn5&j$hted#L!YEkJH9
ky1XpJ CWc1!Gw565eKYTPq*6cjAYGcLnFn8BpaV1%Rt/NILCT881\jlMH&y6Yh6tIT^lyX%wa61!jy?pdm&XW8
JW%6@S Nikjp?>quP4=YR<8Z^T$Z+1i//Mmq+!wC$<@u815dCPKjIQb/J!Nd4mE1yn6!k#8w>^/+P::it8X>KJa
JpL&k& DP<115%JwZ1FCihC/kXQ5?:X49DD/+%!QSCkW?$S^9K&9@Q8Ytk#^Be$hWKp*RRC9C&/S^t@n9D>j8#d
c^dTd/ ndD^?=qS>C=yeHZ!#\CV>IiX^<Ej8/=P>/uJ96@/Y$GA+nJ>:twRIJwm/:/:>/pu6F+WC&!uap&k$4EH
it6**Q <VFDtSGtu*8W$STXDLVd&8lDiZTaT?i>aZQWMZFnF<i4u+h/#VuceX$lqJ9eYVVtEiX8w1ZbjH6MZWWB
NZ8&85 %h?bd>j$PWEj5tL@cI5?#MGJqc9*JFwmMauC%%&B>\WIkACcQpJpdMQun+JW#WpnIXAS/16BqaqkC+a5
DHd4t& e?S*kbi+lMj61>EV\i9Kubhc^kdukGyEEPChR:y#H^V%H4\P>mS6$AddwZWqYWJiWaZ\QuVlN4&pKtLX
k8?!1y y<lJp$=<J?#DSt!M#B66bFa$HiJB?1QZRF4mBQnDB!<JRK$::*j5TSSZCDjcI/C+AB@&E6i<N94Y:k&*
cHumRV +RI8tR+hlYMMylbhG!dEKh!QZe@!BlMI*l54ia@a*BWmliV!5i:I+6ESnt$/6htN/qV*qjqpXM?>n\Jt
G41ywS !Zc9q:4^bI+Gym<!yem4Q4u$\Vp$uwcPY*k9q>VZZ?!F%h*&DF/HXj#+G5VuFT*6!KC>WDLapkMlBJ1J
5t<cyw Z#u!G5!S1&K\5V!an*GH1WtFhjTS1+=FEq##81K%^T1EunN:K1G<eNpCK>IlDK*HRd^<A!dHSEDN:P4X
GkHY%j kQ/S?<XE^c9m\&<i&LH>jM5CyhEmtD^TFDacLyjDYZhND#Fjl*a*dqmiS1dVmJekkIyt<<9CKkHCjm@Z
kad>uk in?6A:RhD9m&Fatt&*a/N@LLjKB@pwyiuA%i^niMu4kK#@#!\Z8l9wHKcYCL&qnJD/$6Nhta!$JBJibn
*6>cJc q/YK:yt5E!I>P$p@dGIw%RFFPh\jupnEM=taS@+X>@*:uy8NV>1F^B#mmEl:8!pdc5n8edYG:q\=l6ZA
EVL?5c @<ap14KpR5t4Ymtj+&NL=89q4RJN\pVV/lF\>ejLLu<qI1IuR//iWph%D\5CyNYYeF*?^:>LXch>yS@w
YSyt5j IADHj9:GYNa=%cQh8E#ui/FNyj9F6ASjX6?84J51qLRl^Y$yS%c%5Nhy&1q?6lA+BadC/nMjYaTt<^=A
MGKT>k AK+H<q?aF:\*<1V8Hy%8yZ>lldnyqI#=j4>^FjjWQl1Zd/PI96^$HyEiQJahkPcP@uSnhAw?ElN=QMth
wnwL6a DQpmWmR@L1FyPdK#JL#GY@&M\AaAIGbBWawTBBkP5\IB:QY1d5Mdim6at1&@Meq?4jid*WQd4HRFAV1$
+ZPNDw HmY#dk8TJw!?n+AAR:MkkH1hY<4DSijFp?&dy%>>tn^+X>%HCX*LejH+d6CBAGSKD/4nj:\dNH@C@>@j
w#h$Ha >e?X?W>K5QBHCSkMIq#M+Y!W^T=AkCl5Mnjj*d+/EKCSajFBRui4@>&>!=Q!:TMS*dC&/Jc@m5G=nbyb
h8tFwM GhPWmDL$+\?GXSl@P\=:/LHSCFWZ1I+>hGp4\$<&b?M\4$+W<c+Rmm5d&Qp1Gtw&T<YV:GQ:k4Gh<\kl
NpC%&Q BpRkTphpF4wL*h&nMLL>yF$X9*!C:jR!Z6+k/Xe*R*9bVBQd<8!*A4!tm:%/%yb/d$/5C/<>/SbDyTEy
wDKm1V PZ>wC#=&4q&y5Y58>\ATdL<!l/Eb1W6th&Iq65S=KyNwmmm@<Sku<MyR\m+y//iZ+Y*jLT*#M6FPda*:
k?<Y?a mqdW\Abc#KVH/+1Zpc^Aj*6j:ijjd<!YbE:Q6hjuRwmwEq$Zw^w6b?Q$<9Y8MQh1N%=XQ=$1cu?bMtTd
A&L$*! ?<pZjeHSpjF$JnyP\%?M6hDb^nilRdKEu:bW<=1tkMACtT?/NK^:JBZ6=!k&PBLIW$Vl4^B\&!tn!>:V
-AkN6p 00059869012001202b4 Page 117 of binaries2.zip
1KPHTM /:&RNj1<+1NhR@*^qqhRG9yq\XjBZ6GJ^<!$uWup/pwq<6!TbtE\<RZt/NI1%ueJppS5mm6$d/mTC&4a
i?5?5/ %9RWBB4Ke&h*YF?G%?dF1A\T$=$*Gh!#pApqk#YH&NtFIdm$h>ShW1wjuDmH>h:4NSH#C#J=G^AJN+Zw
1Z#5tl %Rj5#HnbSAc%waVmYeAX*Ql@>Ta4@k!E<4nI/El>k@6D9%anLE:n:im:YK@5a1l:91^QHI\8i=@I\&et
tN@YEm bq+!PV65#NmRAtAFPF$$</lwyBVZiNYEukcCBT@PhBPi%wb*RRM55G<hN\Ae<JKtjEl4uEiB6ii%S$!X
K#ES:/ Z<mdGn:c5RhR=%PRTVFc&CSiZI8=Z\ZV:AR6S>$h1jFn4^8ueWqH>cw8aIF^9hBpt/6ky4$JYB*&SjiM
eY\IWE 6>/hFa>!n%<Yn+Vp>$^ESGFTFQ8<Q<@jc=humI<wNqdd:+=1\iKnTeqQEK^bPmBB&&W^ZLWm+abahyPt
YCw:p? yL16\:BDb+h1/AI&WW/&yNEe+QWllI\w#h/!/dd94YXmXRtB@65TqLi1hduiqL^V>jb$5$k9yc<4tBVd
#T/8RF =qI$QcQ!qdlDyEukHqQ*?5PydjE<8H$iV$EA5*5*$E#/u/i!9M+M8b@AYnmh@aRP\ue+?E:^SmA:=nP=
KjL6QR e@^d!BhllKWAVSTMdZk$1/b$?#=k&jF:L&EmYYDVyCCuJb1Byl/HGeE?+:#::<a/nN4TFtCaeyL6CuRe
*qGcZ5 MNDp/CM$/JwM1jdyP9XjHV&kGZBhbT&wZB*BW%Z%S%1F<y?eQ!VBiSIGlDTHZ4=KZydi^k8!&I8X\Mq#
?#J:M= QAnG@k\C>Eh<*!^8YCN>E&iFPMP@4<QR#KD$^RR#D4cA6uP^F^4ZDJ@R/B\bBGDj<STbuN9&EiXP8X19
#S<jae B>bZEd=@Y@:&chyH896LI1wui!:+l$P9GlAk/deDb@I\=ya*/VyJCDYDBBEe:VQIc?!SBc@=%S?9Fl1/
PCb@!i W9C5&?IKY?X\<<&9Q8%Y9\<VWeXI+FKawBPw@<:C#\Ye$M/HMyi1?bAW/JM6p8Y%dcY+=*p4E6?*nkun
^&h:y8 1BC$ZwTCA*X\wlpah@hXP:5qMC6*Ii+&&n\lKuIuwYb*am:LXjF/JH:bW^bZIV%%mh?m*Iyj&=*5??PN
55PHTi %pJVYqVGN&^5=qBHM?5CqtXFwwlwl4:/MdCeFdMRYnEbnR4\tRKhN!BAIqDK<p<Y@=hqA?<jq!XeG6NZ
htRAqj +//L^:wN4Y6/dnwCXBW<JD?WimRy&SFSbDB!i=BekP4<$HjXPc=Tp8S>dS??>iNL#8AELQ9WwhnCl4CJ
Cqbc@\ +nRLYh&ECjHL*R9q?ekmCnlkMnlp#RY\$&jw$<TppJPW>aiYeB>i9eCmi%q9ILnc%bD9lNj<I>T!m6qP
<?&B+? Ndi=*e9^A$cAhkYJDGdEP?$ybp5AG#mW4VY65/Kly9*VRQL4WqNhuaaac$q>ynDwcX:&CtJdcQQh>Tl1
Eiu$jh DV6GCRlA:c69KjuuS?#>TQjIw?6:*>Q>NGFMERI6bCupHG6^yYAnq!w++ddJ6Yq9it!nppa#mWw+lLNJ
1N\Q:J nQp*>c%>::Q*dm4StVS^w/^^+i5>lF@cnSjD/Il14&bS6:LFJa@q<@kl=jMX/1K!nPKw8ZtSWcKFT>++
plnY#H SCeSuXpEY$eRM!dCah8Dt^Tbdq$Ekjq6b1h:kEW1Z:MNAW!jEpd$Xk8hYwyCtMCSiAMS@Rp&<^HuN>*V
A6!q6N @61qF1:cC#iKEX!!=MnXSmE\InLFhFP*G!FXP/+AIqbdeDPaMHJQKJ+!N91ww/C*WaPYG>@KAw\9^l<c
jltNRF X6tmHC?&!YZ!+9HjWWnHCpHe=SEiG=X5tMmcJ@^1\lh@YYl8a$MGwkQiayQHFyTwt?k!QmlC#R4Y&Jql
R&^V5C j4!jhHN=ITbQG198!p?udC5/ld=SmTkZiqM=Pijd8nH+wQ@&4=1W>@etlcie9/:#hEGMV4RMYV+q<TSu
S*>M#: RKa#\*C<FLiA1^TQQDqQ?Cb%1j+$ntSwH#>cyL%B4n\mlhidB4PETyPPYBqq::F+mFEWF@>SatnIHZC!
T^ZeQy dyN=6cJ:8NFc5jmq/AC8PIk+9PAh%nZ8N>yZ?FQKt^E?e8PVCKR:E6KFdLT4TbteEtF=CDPTA5Lc=WtR
BB+tNV iP:LDeW/%\Ii%QXduJqa&=6CC@PiR*G%6cXTI/lW!Mw5@FEcNy*S&IKh?>jYy!EBmC8=!RR^8iW>=%pd
*=q6WN !G8jmaNtW*T+F#6k$:W8hXZby:4VJBMq:8bbk1Wn1Lk$q?1tuJTRL/wNW+46t4lTWG^%ui8mTTDEN<Mk
<\y>A\ \4CWqN&R5I1HGky5DBN@XJ>\G9=CV*d!99ce5MDN#ed&P&ee:ltyDCHhT*dY%u/!<yedy<\RhNKhHS>4
4948dG >CKYhNjN!E8Pp5\y!JL!wlZS9PYPTh@qHPp#T:pi\:IZQ:#P@Q9Yj+Q4k+k$+?X/>Vu*4RDhACb:>@T!
m?@D?G ui6AQQ\d=ShmAEj#5/hJEQ*Tq&K:4C<ST4e!Ca@DhcCbp$:qScEN4K!4BK1HBM9dpJdHH$<9jj=:we@y
cFn8ZL VMh+B*jd5+@^=mBA4Z*XH*E?V/6QkLi8:+^<%niFqG6E6+i9NmCADK99J$/6Pa:J:@%FD?VDIID=y+/e
iB9^SV T6<PB1EnT1W:!6E@qW:*y>I*@mCF%bPl@cNWFk>@4C*Tl$5uF9D6Y^CE!tMCp&HY^ZnpA&1b:!lH%RQF
N=aVKS $&Bp@wN\j%c>L9/VRpWNF%y1dETJB!qZY6EDWR>@e/Xn%Jn!JAFl^qebi6iXMR9wGi8y1P&al=8hFhm@
GdVmXw t@F!??:l9*9<>QZy4H<C9NH*bPRjA%qjWeQ*u!#nq$?@5VDXYaHtu\=MBN6n!G^Ck<H5uqa=l4amDT*F
Z\&jW8 hMP?llkChd4H!ZH?eIQZd*JLIA%nwV<$!BA5tdD@iTFnlZ!j=\\C4AkK*VC#t6kaqV/>QDm#n/R5DyhP
>^Iu%^ /h/klT>*?^8eN$*nHd<i4@^!AF4<=TV5>Te5G9at=#+j?<@lE::4i6FD5D&nbcH:</jk$BmNLXZec$KP
Yh/d>4 K$XQc&PTQ*&hRNl/M9mPSHhYk$>ukjl/N?EeVYEK\Z5cGES4SebC&&Nc>#La>>YG9pNQZXZ/94M9#ueW
nFau4j /8D?1i6L$u>/JR5$>Vq4Y:y#L?D!WcLwRZ*<pV#mWb6JcFj*F+dQ@<$ZJpHVj^KtC!?#:41y>841dwJ=
dwR*SH apd&hY=5IY^85YCSwTwCtJM#pXy>E+$:LpNq/4BuZ=&tuGP\V18J>=<:!e+PZ&:9#nyYa*&AR8ZMYJtX
/>/D*G 1>lVeqb4*u!iA%:9CLJ^?>MylJ/Z5G4\+Ji!WbNPY+jwh<NiBPliZ&%iuSCuu<BwdqN5*4hpWnmC=SS=
yXAGYn J@1+?6+&4V=<A\G8ndkY1WCAMy@JDchjqt$@9\KcPSdT#*15?C:p$@tkNZ:>>Hahd:l>Z@q%Gjk@e1F4
Qcqtbm ?X%b5jc1>5iwEaa?B*Vt&#Jq=mKy%MC+WX@!I>VdDi%bJ!4YaaS5:CdqEJmhMA$cAYHB#L9Fl1h=WkwS
KnuRK& :XEIS>SuDtlaB<!$m$\$AS\Cj69lp*NH>1I?yA%?ASEZ\SKwWV$bTBY>TZ#&Rwbq1iBEMI^+\4kM&n>@
H691q/ Tc8jEJP1wcdhWA<MFSTMu!X#b51/+jmeGaMhRk$CTLYIpa=RtbH:^+aPZYX+/:?Vhc:eqW/b&JF4y+R*
>MeSuZ K<qd4wm@AFKytuHS*=XkqN&hXqjy*XbqHLR$idR&lW>VBXm1cYV$kMQtJKtaS<RS*LIRqIkCeY&4?DqX
RJ8:^K 5DPqbb1nLNQR9=dVZ:pY1L6HkkCMT*LZJceNQw#+C4JuN+/X?nW/Q6L^T&JpWC&ceCN:#Xea9a/GFucj
kj%P+N 6BdAb*mp<46wW/TRD6+:twe?R9$R#j#w6Wh>Taiy&YK8G91mDJZ+Nt\5J9D$@GAqS9EGNJhSu?tmHw!u
c\*ea6 6I=YSl=&qFV<mq=91^kKX:K*8B6Xcl@>Did1JdeIjuq5iZcBHa68NkbD8:9VB&e?44SKl#!5SXb1/qE!
iFLiDk ^SKCktZ&S\%F8I1JaM&GIwj#ThpEdVV=6IkYDjY4%EVmBQL<L#kGQe/IDj^<Y!pqXJhE:j9Z=I>t*#QY
m15X=G <:QG*q/tHM9eD*:lMj#%IH$8+Tbt*jXBSmn%+WDwcay%@#/QQ+\98yM5#1d#\qVu!YBluV#tXnldyqRe
!SX^4u SSR5qeq8JT>ntl\1%cAYp%tjc^&N$#*ek\AZyL/*BiqZ?!tQn:+*1EJQC@BdN%pR\FjwQnV45eVMTH6/
Ril%?\ F!NihBQQd?H!\&N1VXd?FbQV4YV/a+uqA%ZPG><b>w&u=j8SAQ#Ka%#lp<uS/bR=NN!+m8J/WJ$ELS\?
y@+uHL nTVQ9u@<Xpu$/dZK6?p<Vucc<eJ8imBV?PWn\N8E1a?hS*lP9+mbGj!$4JGi>b&u*@m4kkuTP1Ji?HDS
+LpmQ# GLa::BPX$wMYp^SK6Z&nQ%e?TF+y^4*CFyJ$ctS$\M9\EVVkt$t%eEB9mIwV94y6j:tyDVh:u^B#SZti
ZK9:V* <kkLAqR/mV4B?t=t*i:@k#Qw6mZ:lZMM&#Q=#E8yik8^yZ!\N$JFS1yF\c<9&cqmqAnW=B59iR*%Jp9p
Cl^jy1 <Q61/4qk!6@T%pjZ8WCEYt^HmN!Qh@RCqw5?XPKlZQ4wGHJ/Spck+*!I9Dj>=Q6cLXHDKRnQNM#lICqA
K86b%c *C:WWAbTpphGWTYyLW%GK:\9J$K**pa*cuD&!cIu4VP>X+LJia8G#\FQLwLk1:e^#@wiw\qQdVd:SHjL
$uLH<@ JYJTWk#\RcyL/K$tcabjcNau/JTXF#SG>qltq?+tQLXDluyPc6QYl*E\W+1APDD!Eb#FG<Z%:6#G!+Qe
=SpEmc /EWZZAF8iDyu*YbyH/Q9twP^KX<\CtY\+HPe:Cp6+%?GcZ1T$YQtE>pW%?Nu&Xe>w:%?Q:Mq$CQ*TD&d
JQ!Wd$ 5HN\!\5C6LpYLhm@8Z+cEIL$RID&4:+nb6?\:/4Pd6<P*knmFD%miZci%+&DAMGbV9j$q:=dXp@YB==@
yIIuP> ++jPQknRM<u%H>euRVMlQ:u$S&k+$*e$*^Ghd#6*Sq?WbIScRaD\#w*Mi:c@yAL:LaDw:@aY5uK^ej#j
a4&p/J RAZ&n9V@DTw\aaIGpXIYCMH\6IBJaZ<@^$4cpb:+Guy@$a9hclE@B\#yM6pnhKa!:e%8l5?$M\&S<ml&
j*9JSN L!4Qw!C\15yiC*Q$quudSpFBnELlBIF91klBRZBRe>XEqB>&Tpim\*R#tGXQI$%i/Y:AX4AIH^EEX=<4
le<G\Q 5$#R+/lw>Fd:dckD*Z+I</1^>>^Jc!Z>WFGby>ihFYPW$^+$alISZt=l8Q\ak#&Htc1GM#ehj+9j%+ma
?CFb^< dkypC^c\$^cB$t=qTudk56CJC@$p9Lbqi&Rj/ZFq=lcMKhGDkZCq$Cc@mmySl!:D+KiQD<#yT/69RTBI
j?LD^/ w+WJQ#h8Ga9F1>EjS=FY=1kpTXTSW9MHZ&:R>tnhIA*l*Q/MY@H/5$yelitt/kn4TF%SpIpI?K>5ZKT*
$aBLtb bX9SSGB$!I?56iMt=e9Z5>Z*qDk4<C<4FJFP^EEpbp64bil1ea=%<lJ+*ta?w9DlG%WcKmQTGJw*?at$
Fnb\cH WNwJDwC^qq%ETB9+lTV%EI?>%+N#d*S*HA%MlPM^n5HEiZ!CIPDS5FamFhX\YewNtuq!hZ8JipI#^FZp
nuQkSM Yd:=$yFY9FFh>FEFh=%&qM=J^PM<h:p/chT>jGAAunj5JMTjm!nBt5>@c!Pc$yu>&N^V?YFidpNQ:pGm
GQ6PFN V^RC=5nNBh=RC8&VV\Xa9CHZlqpX!*YlVFEQ>5pLI8Q!hiTkLeh$QIK6t<j\&LM$kQHZL>kWLTy#>h\n
Yacd+Z lLw:C!@6p+TK$BaMMqAhjGn4a\I%d!j<++#+tKc#5pZuy49FWTZN@VAkMRe&%8:1klATP/yJm/?\YGIR
-A>G8\ 000d5c97b29001202b4 Page 118 of binaries2.zip
M\LE@E bY<e!bIW+hV8Ga$wlnFILGB8%5BZhjd!B!9ICF>w\1$mXJQAkQe6l+tXiIjKuwF%>t#CkLP+5y\Q\^bh
dQ#w:C w4X9p+JepYaac1tB8ZQk+e^KWA%>PQYQY$FKCFQD4\bIb>Jm*jW5XXkb?k:!6$ukMyCbc:C4JY%9*@ii
6Sty&W tqS%bRlSBpl8qEp+H8Z#lYAQNYR5L/1VhACTB?W:CWSm+nd>=ju1Ja%&a/qh95L8C$JVt<&=+pEl+=cW
^4imEd Fbd8cbniiTy?SS:q/JwVTa6Fe1%=XT9DSD@H@>=%lNMEjK<!H>?N$<h?:$MN5@Xpi1tyL&^?jHi>M51&
F^$AR* QVZmXu6nY=Ny+i\QNh%>R4IPG\++<m$Q%#w@DJ:Fn#TG/PPyMbtcAn^MqFQdd/CApLkpDcYHpY>1+w/P
P=HEpZ epm%&PFIYa<bFbe\5n@^b9ZGE5QY\e:Ruk8n>/RTp#PSRC6n9?iNjP&YR!9M$w#y\EW+6=Fn1++^?u+Z
WFDIDW @^DmMPd#&ni&w6ZijDw$W*5N=p/yT$ED>#5wmyq5$5HW1uVhY@*wd\#9R9K4>ZRuE?Me%CHIL?cLJSA>
*5V@%5 FFV&GcEkQ$@d*Vuu=Hh\N8Gnu5B*M*AwnI:Snu\!^k$V?\IttH+VY1bC&%e/MZ$bMplED?GK>Sw5Qy<E
c^4wGZ YK14:CAdHXXbScb>wh9#I6mIR\RG&/LFQNC<Y<?THmj:p!4Cl:5nS+#Dt!eLBcVunZVt<LG5@JaL4#H*
G>jl!? lqu=pWt5Q#J4ip<:=Pmle=HLekSL4E/%1&FtJetCJeN<YLBcJFQ?%9WljJ/jDlEPAW1CeFlhFX8Mty$c
=HX=EX qcM$cQTN:!@Md/SeE<G><GRmBX?6T%p*QCP>ZET^m@6#k+T416:Mm^iZ9BwSX$GeX\8XnBcIB\epk:wl
tEFBDN +mXk>lcMqy4%Fw><EdR&MhTj=mM9:AX?!T8:Aeh:^mC9=lpB&dT?B:I!Ic%F1Ltl\MDC8h8I+lXiiH@V
+D1^d* Hd=B8+qnn<mykqae\cu9IyHquLw?TNaiwi8!L%EyuG5t*G4DSl#KHQBKkLtRB<&*MB$QGBF6^pV&CEjb
S5h4w* W!EBQ?DKSD69?QW!LQhEGAP!D5wyeX6EnVtL1Cna5M$p4h@k@&Q94<Q1Y4K>WZnl:t:B*YE6QMHh*h*h
i^B#c! CSATLLm:8:5:BHj*aAuBQZkIRV/!8*j4Vl@/>Lu9i:@#*Ch@yBb#@tcN1ly#%Jk%nKbjm&/PlImGLEib
!Wl*lk AitNWTJWSpZy8Db*LGcn%<iViy6e<Y9L9wwWyR$uY@aWG&cc8yZMcctXK:?^q*h4N5^8bG?/8p+B6B5&
CDDFG* 9Dad:\^NIu&l%*jdWGP5KjyC+WjZGe:L1/Zt8$NhS\+>d\IEbdLh*GZ15Y<#NDPl<SLe:hXZ4QjS/6kn
?e!t@< PwKVDD@Bt+bJwa&TR8%q?n6a9j$a\GQlLDIw?N+B4:hm^?M%GuyVR#PC\l:N1H$BM*E61y&BA<ec1t48
lPWmlZ $H8wPDRYFTTSMjIZbA=!MjYwb49eAAtn88/TlS^9X4GG?jP>V4&Z^IGyBY9?&5FlqWKB<\b?nt!mZah\
A<e=!Q BmT%#P^mFq$nHh1K>mWInuDN\lkIK4CG$/GGhp/RWqt8Z+qKJk8wKE=IpIKHPGZWYYIK*<//wEID/a?w
@>#yDb EDq4>=ME8/Whqt1pdSBMT*w4#LPdWp9KA>5!TwXPtpBL&NuL&S%HTGFmhFHCm=d$WYZLIMbVeIWF9Y<i
w!BL<% tCht^+tPL4wPAkT<ah&CJZ&6$F$jZ:n%R<XY4#b6XuENdJX9nH%CILhbu55n8I&?FJ*>+B/:y%6F@E/e
W+q$C+ cF#aR<I5FILc$/VnG8i#hWLeFndL:QtLjW+Lqt</Q=dX$CeTlKkdJA5JA6JKH4TQSAmwH<KcFPTh:uuS
D+@dtT KV&FM%BW#@X+^*hVcKbyZme>C84i\*W!jT?+VVwlj#FGdX\\>Z=AX!96RCn1$!$mV>4Z?6l>V>PmbDJS
XmXJ9= A/%D>LP?&*b4wclD5XapwWQ^p:u*M%&IL^Tkt46:NnwQL^eNS41qGlpN^u#BF*1C*S\n*Q4G%PdH#*8u
8:eyim SB!1STFHQnkbHD$PlX@I=wwkE9d+4CQDA41CyAFjbSVBF&EwZh!SLLTqJ^BJBKGaa!8:DqctBM=Rnc4N
J%9aEQ Z<KFm&lH&#uI6MybJ+DVF&=CM>#$Ie5!>C!YVISZ:YZ8KiTFjLlZiHZ95+MebJVkL#LL&JXT\Zh\YLnt
IdGKCW MGJpW<6RlJ\q!kB6TibtT1l9%1WX=DC@W&5#JibP>iEM#qMInauXdPK%RtAJ\/e+GF^F8E?uD4Y*+8Bm
bDA&hB 4CSVG=<a!+/RVq9%#QJFVF$<n8t5lIM\#mk^jBT1h!w#SBR^SSSYIF@bRkEcB?cE$EJ\$cnkHX&^KM$k
6T&We& aXSEay\Thq<lK<a@TyK>JYjnALhdFeA5HdBnII<qN\J!p6k\WCqSB&dV?Y8Aik$M\h@*V<?Rp*pVRmM#
nJh@n* pFkIV?@>u1X18T=dANduE&<8KkuJH&8?*Q@u1wB!pj#byjQjDw5A5j\*w\W+@!AjFii@ta@1#%ZSulye
Gwy#b9 9#i+@!F?kJQqD?MHRH@kuA^miY:<AIn6PYn&Z*nlk>mjkRd>5t@ke>DAZ<RQkEDQRLN#@+y!n8ikPZ>F
AC?<R$ Pih#$K!@ePpGeV$D#jc4@Fak:8ikRd@wt+QqPYn&Z@VN<S^i?*WEAMh#tA*I<w9kBR:&@\n>LGaD@TIC
ZCH6BG kAQ$H@ZN<X>JFnbYF4b@qm!5LK#@JFqaYXn?Qeu!=*4Ej=Wnj!=c@E>Ee9/l5#<H^:?w?jqMb*<Y>meT
S^M9lk kV?LK9+&\<>\>8jk?u?KGG=8ElA:G\p:G<69ND&HF8+@yPXjL9<#E%<>dXTky^G\edQ<qk*9GeV<R$H6
=kLa>h 9>L^L/Mkj5>%>X5W^P>F1@@?8c#@nTkI:6?nINmiN1G@SEG\eQ\*w!Da8Dn?4$bBYAF?@K?PkpD>@><w
h=KC\! mQ?lm=QQn1d+u:$C>5qD?H^F*nZ!R4w&+KPV18tuVCA8#l>Z?X#1FHmu/n$KFZWHaj4ke%j/CElERLtB
cFSa?1 CLV<@tbLE$99Jjy$nI?y1baj<4wj5pBuV/dPQjZ?R:l@$E*byjeL<C!%i/KDY@/Dm=5QHw@V9:u$8Q^$
kw*XQ6 /jqbXEdcu@*Qb8#j@u8ePY!yM?8SAL+pXwk+1T4QcY:&PBGYJwM&R6>RWbA<XRYaYH&Xy!#W=SY5mdYw
RhS=RE RtyyiGQGXK%TK1PjTw18uPG&\ZFVy:tj=DVm>*YW\/FQM#wG\CClT5Qj\cicuBX?SD9VVC++T>:iLQ*Y
:&X!#D iHRlMZ<FL:$eEpYBT+/pntQNnjjdjlCc=RKQjnLD=t#F#D^%a#M:lZC\W^RKiyh4EdtMlPW%V%I!CNaX
t?=\jw \j*EYHAaZSWS:QI+RICjn&EiYMdFVN%aM*YWNw6hCQZGtDVBNCqm4FR^?6$Pm#^!@q%ZV$4FX$bn>LZ9
FD5Dqb TmMWL$KHiyANkGZ&w!:SS=Zujt5\cJiXni1!lH^iBXat=m@KaHGCCkiaKFE1FkKqFqec<jR66L#iKVdQ
Q=M$5I MRHV4F<1&tTcw\=k>4QI/aPXwjZ>?QK$GN/dRbdun6>+VakjEn@j<Hm9XjE@#9:4mb::PhFhEWXhtmq/
:+<X$b :6@S?+&cM!uKZ5kImbMXq+B+ZWj8mXB?*B+?^J:<X9l6/lHRYht=#@Sd4di@8jKKAJe$cRFcpkJR&n+#
RhkP$p !1wkReFe@uYkH15RwtNc:YB4VhAbqF>PT!=\FNCw8y1nQI%nNY5njAp%ic@H*LqQbu>dp9dLH^F^w:Fn
H:c9^T EbnLBX5%ZHSu:VP%6btqI#Pwk6>/*$l4&FVpNjmkER1F/W/GWP<+y*9Q4D\CaPS@NQ!M=QmnedNy91VJ
#F>RZZ %GP+\&!C^DLL45B$V\<d4QBw!Gq1nlPZtG?tHAPb^bl!$1K6e=S/M8nHEFZ#*@lQ%PSHeQmXn>ynD6Xk
jXqya8 <&Weu^B6q6nZ%+um#&RR*C9J%aj\ha$:8d4HknlqGFY=YLFZZ:$R%dEji=M=>#Z$XWu^IIQc>VZXNqK4
Z/pw5q %P!<m4NXJE#$I+C1wbKTw/qeqL$QYKp1eIw/ipc<B1QGb>H?X9t#y&%C&eG*cI>*SIJE\B<l+>t^pw1c
N#+W^F BqhdESR:SPIjpV*DI^+!=4\Q*GaiAj9+@Q6yq!h=n\Dq^1SHkMV$I$DteiHXQY@^I&D88PASMAQ$upWB
qA*y:# I4&:QS#qTM$a\qqpp*WtcEe4DbJkMw?cW%YWQ<p6Q8N>*Y?!iFY<6tqLXaHQF/:c\wk6Jk1^9qyd#P6T
DDEKS! KWH<n44QZ4ct=T>8J1!QkIKtB?T5d>cVn+6@NMpRu#=yY!:EjhdnL:K%m&CaWemp!e&jF8TT>>/Xb>4@
A+Q1*W l1+q:/K%\@N\AHVdE8HZkm@H<T$*Ri9kNYL=@t%WueQ?NhV\c&u#hw=&T&daDS#Eim6tJ5ctjmH4D+M+
d$$tIN n\B<D@5DyRQw/<SVuu=Y%8Fl*X\eE5#N$S>%YnMb4i9H@N1#4wwnQea5WFnB+yl5+wiWHnRF!q+PdVN=
NwtQVt 4IIMA>!jTFu<F?$E/ewW<lw$EC*tkQ1c68P>DDP<wwT&DKFn?:*SCuMXL$Z*Q!+!VPbN\yt@hujuK$wd
!By<8? Fwy^bFluYZ5HI9qY?bE+KdF+MJmR$9y%Fc5pVlJV&bTDjhnS$i8S*i&w54iPjwQ&@eV#<jZG+XH:ii>P
nyH?q> tebYILIiy@amH:VEXXln^\iDBepZ5>A:DXE8K4#w/PiM#uR6S4SkM$W$a4ae<FXFXKm#!AXKBa>iD*ce
+H$pi= ^KG1JYw1J?FDi/lEi8$QT##JY:j=Kmu:5GH9wlY6i!NJYF?NI4d?CGE5<1NEIMptn94MJ%I/KW%b>=u&
!tcia= CHmpyCA!?iJ&6$?=CbY<q=pb+^l#u$R$!WFAW/jTjE=<P\$n!\yLNq4Z?AC$?9=p6mlbK&uXcDiq6\M*
Q4IYCp =e8SYZb+lWq?beF4\#i1KY<F<J1uXCYK%ld^q!6VE\?hb6A\@FTtY%+\wAWlE=dm#5SZPJcWY#1^pWqI
E%lV4u ^kWX%Tueblu+><RdN*m1&:WIc$?uclyyJ=n:jYnC*5I59R&Ryw5bDcdKeH5FA!u5ai=IWTQWu\p^wKkZ
Y+AQp8 =Ln&ip%mybt4\@lB?X9Wjt4NI+D&^?DqmAEW:J:w/??#*EH*nJ&uV>#Yy8j>^^5IiuPV*\pew=&^ypGK
C^VG5p qDSBcBu6S#>Y4mPG*C$q!LJRX9Ia<tDbWbYVWtm8bT%<CEm#DL1\L+P>Ze4+%>nMR6huteCmLq=p<maD
$PFW&\ !!T5lHS$TRaYeeLa&9dIWnA#qe8E1GdB\i%kImd8Q1ZYZuIGc@^lJVmBaSLweH=L5HHpGKK&&=y<9i!E
ZL*b*L ZiT^MbHaKlmT6qRuIwEXkq65b9tbDX<8wACeCcVa6nSbDKZRHWL%ebPMEBGG9NB%DANqZ?CPSwi/?haZ
th94J1 Z@Q!kPb16+>HXw/H&X1m/Q$>:QAD6nQeqDFV=LXNYP4S9t11Pae@C&9Y:cQJ$58!DS=IC\#P8TJXa?aP
>SnWya RZ<B9CKB9^\R#q+SKCALJAp9D$BwWTJ$6A@IJ<8*%c6jKXSJlWS9HYa4L$>*V/FK?DB8YTjqJV<J!bFe
#951uK bePIS<wC9aMcX?i$P@VC6a4^qQ9<9pbFD^/d+\wX4kDV$^Gq96NTdMVd*Ewy^YpQXjb/Z8AT1kLhW5GV
RTNBD< @H=SJMF6SJ=bc=BAyEb<9>+YVJum9ci>\kk>%R44cJ^AR+I1bTA6iG*#%5qu>NKB@Dm1S\Cm>YJQl>PK
y>i=?a pP@^#H^8eC>?LhtFy<<S$RhtyRcG:IZt>FjchW$85dB=alELK9t%Cn^?wbaH5$e%8NhV6u1T?ScG&\/+
%e%c!4 5tIGBKuJH<>RyM/M/BihN^^E<D$ca!&#NYKqA*jbXVLF9ZFYT9d>Z9JY:aS>jRTp%Zt?%l@H?j+I1B&e
-ACBGm 00048e7dc65001202b4 Page 119 of binaries2.zip
Nqcu>p ETmqKCLl1bJT8d6IjyKTj>p$j4FbRyS4TJd59@d$+pT!bP\#A:aID8ebV@jMY<6uml9hjclHFck:TQXj
1Nie6@ :i>NGBu9/$SSRJa/JFtXQH5Vi9!BeQ?Xj5Q$ZEH:N\#cGFQ\:d=<4QB?WVM>+T?9RMi#NpnFFteHESdt
<mDC\# #e%?NKRYlaGaD94S88H^9PB6wRwdmjk/dtm/ap&9qRl<RwqmjAXCB4?5l:Zl^:+>SV$j4!Y\JQ@R4uq<
PKw%#$ <?:Cq<:h1RI6n>SKI?ND/qi61JEF^e>y@c&65J\mK8>eCd!e&G4I*^bD$cAw/1niNSmT<ht@>y4tFTeJ
&%GVWY n$nIBTqq6c^5V:pXRQE@#tWKd6?@Yk8n:N@Zi%eej4=BpJ^pREbeu#%%+*WtHaE@5TG9wKMu=JGCM\MJ
&ywJBF pNRdIFjk<1HZdh\DRNkal9b#MVSlMAL8D%yAbc!&$jC^c#=ELQwL=Kji*:EjASh!/u>6@5%j:e9F%=>$
H1\D>% i5bH\E:/b+&w:pjAq9anaJ#:R\&^@!Nk1Ptue@6dI*/aS$CM@TMA8HQd>\:qEWD&?eF!@C4+n9lB6QN8
pIR=mw N8E94cT@6EKD%EZyhZ$J@IyKn44?d5@/I<WkJ8%iiQ!\XHh=Q>Y%QVGGDqR?Y=ehuTW>y?bkWd>%b+Em
Z+IL+& &%ZW>:HT/*a&T&%TZ69SIi\/j<h&/Pcn+6AY41*i*A4WQw/iSY8p?n#D<VFEX=Y6tNElK#GtM\qndbQD
CKqyCe &15*/MNq:$#i1y4Lpk&d9dE$8?*RHbEqnNhI/SCBdH<V>Y/#Jcj6ImiTLSHd<Ed&$Dpl/C9tAkR8XGq=
D!9aZP QTR/b=WBN/:q?cHNBIktX^ThJ4!Qb*A@X4PMZ8Fm^iBhbk:>5dycR?m<nc*YZ4*XDAk*at:KTdhW+uCq
+ARJqd p6!^*LyGY=lQ4XCTTKPhDM>cNWbS%5PLd/FC8Htqeyh\icCbpZH:6kSDcy6TZp46e5=8^qF*TB@?VtYq
diHA\p e1JyAdSpt&kJQI<qcGl!q#TqSYCL$11*$^HGu%L?$I9!W9#BPP6^+jDlTjhkHV@k9!D<>B?$JmVl=dY<
Gw@$pL MhI:@/1&@1NtEd1t8/!l*dF&idcmLT=MeeE#mQ<$$NepTBNan+B\4/hH1h>#Q5TSQQHL1Yypb@bBHMFd
C5P@c< hyZ/nuScb/!GQ1Xt^Sw:%ny<?$A8*@b/VWSbS>\aDZJT%!&<D!M^ipYNTuyLp5SqSH*!SEIZ/pwN^u*\
kBS%cF @qJ^nWA4LYhP4Ld*VcSEpCF/y9epHb+ZN=cdnc?p&!SCNM$n+BQWEA>ktc<FT\:tXll$q>H\MAbE<59F
YBmiWL W?>E*$*yjmNL&:qhK!B:%i/TnQ*?Rn?ebp9K9lumdR%WuK#l1T\iSNST6AIMwEn51/KMypGVK*IYiuXy
akDyJA 6bEkyC9B=weKqQP5>piA#ti%wP@!u:\4:e8E:+1?<m@!@+^L@ai@ee:uQP&ZYahyB%M@N<#J1=Hdi9/S
G\<%ll h^j*Vk?@i5\@Rec9LL#n:*h9h*/H@wYC#n>DZyTmP84=F%:hi+\>Kb/&n\D@w99qm*@cl6NWb4@M8@!I
aylYF9 iPWpJJe8HFWj@wwm^u6EDC!wiWn$W*Q*ZTjTjm49#q^E^Jdd8cjqwVmtd+h1$TBBJqQb88A\6D@^QyHR
NYTq@= wj:dL*J1QQb*SlGh*m^Q1%6dASPc@jJeQQ16t#\hpeFp<hLc/G94%\Bu@Lc<$j*E\LLSI$44cwmp1Q/A
tT%*&E 5:X*i6*t>KJF1?K\Z^\YSp!lQ^S<lqMn=SlwQMiQLB*>8L=Ce>j\^y&9^ja1lIq^R\J1nT=\t9mRH4?V
HEPAq4 LJ+QT#1kbPWD8YPbB:FK+wHddCY#qmSye<cttm5d1aSlnNCwKAZLHln\e!H6P:+I=JBCuWtE^nnIJL?J
*AueR4 Ja%16/n==yVQeii&^$5B&lW5P8ki!tw#=w**^E+LYmJRD&X$I@u>ntltZ+aj&BSmYqacMWXLQNCZLSyw
iRNw=I KykbCpQY&/C?q$paN!VV%a/V9\*iNNm$D<%\EmZP9QS+\ZXQWG?Jn=pjnXXWmbYRYyRdXPaPpJh^$Z5>
S\\I:K R:%lELwleJwYaBylwTCR>PcF!*cQaFPWnyR<@%=MF#Z4c6QHdj\?^PBJVI\#q&$FwVYTX%hENSJ*?<bZ
IWDcWH $tYnabadwb>8LEi+I8YPTk<8:RnXN*K&b>KPu@TLnKZ9H!aX=w+9X:R6J<6N%SNFYIPZtX\Rei%Hb?&C
NL$%8Y :G:mH#!un*jjtAj8F$Vp1/tEk%+!/TSQZ&6XeBP%16Qy9>\:9ViP^*t9ue9F4&=A8hMiKn!TukIH9%tH
#wTKZw d=A&!Yuy^lPj1nP>Cn\DTl\VmwqAG^SaKcT?4h^<N>>X6V6PbNRTa@9XqGMmJutn!h\D:@B?T5uDESD4
Kl1p=! BZdKbjyt=?Y4kVeYlJK$dT48tbSRRpQhYMq%nNA*AW>:QQD+%aG&bE/LJYp19S64@:C$VGb8VIj:dAjQ
Mc?S*9 bRW!>RN\?mY^4yc/H5jZjw\$^=aqiT!KP^n#W%:Z@k19?aI%>q\+NbHAN+pSe@T\^$8Kp!>WX#@$:twb
u::=5n TH8@*E8CD<jiaCWNym=BW^m\@FDiLt9^?YpDk\MSlG:*:qbkY=8*\Duq5lQVyGIePCa5p*\Bw!k&Zd%4
JR:ZDD m\t%itXjQ@Q%=PmE$i+F4$Tmimat5=w^:tZQeVN/TeZd%w%q>hV/ed%dY^/wXNw9DICMq/\pC8W!4mDd
<bSYBl hEK?<jVBj@Eq#+c$<=X8>aCuIiMpC\M:W\S>LBLnaJa5iiH/@b%KRIdqty>dye\^w$F6R?DEQKTDht+@
5$mVnG wuF8LnLh1!>lJ1?X=>1HW9&%LLFbl*G+5M\#CEuWJbjNtIne^DSc*VM:5uD&4\N:D4:J%hpKTE%@Tp=L
mCA6cG kkWj:9:m\SZ#a\I!+kH@&^:CwZ=!SNhdaXplR/i6aZLt!qhh^Rc4Yqpnqu4NqSuW1iV6phk#S^ZH\mJN
4TpLZq 5YI!Z4:B:H^<$w6lZpD!JmXPyLdGC::F/F/5k6D>/ptHjn#MwJBwCu*4GKkP<h$?=5D%>M+1n:WM+!m=
a4@ee& iml5a5$CM%HK9k>X?aydXaXCNy:*@AlWeiQu?^mT4\5%bE98DbWtX9*PaDPckdEL\qLp>5Kdndmc\#6^
%^j9G& d@eQYJdjCw!!wA5S#F&1+p^9XbFmtVM1$XeV\B>yWu^!1::6%dbe>p4eH^IplB<qy@MuBAuV/L?ut%M@
\Fpl\9 Pt=k4b:eVh^%cqXLn!B9a!adbwGama1LFME&FT91u+*\XClh%HN8hk*iZ:A/a%?RXE%BwJ:*p$Tm&JMi
acuSVL 9&=PBX9Fj\R<#1YPi8!?V=W\4K=L<*mBy=pJ6FnRmAW/V\lXDyua9Zj=ly5:94QECPKWy5i>Cn==X%Wp
JJbVYS !e^16>B8FDiZEF$jD5EiFbkY/i?F>Ld$?#Lu=hFq5t=I=Q9aEV1d?Y=:Jb=H\B6icIleyNd%CKuDei^9
iySi#Y W+L=?\9uu96wdY$Pd@qX!pN@lKDhFEEi=E>6Lum#ci=h=:m51H/+81jNdtR\pEnL\lP+\WZY5SaaTJ96
Fwp?pT Rp^/<LlTw/pjbZj6Fyadiam8ww+S95$Ee/9k66Y:wh4+P5pc%p8W+P>p5TkLj>/C!YjK!Y>5^w?P8jh1
8M\L5* AWS>$ch+<Qw%m>dR5MXpwYc@W8G&PKWtJ$4L$ke/q=\B1R>8#cp9%B4STFI@!n5W^ZZWPZJGu$c@yLMi
k<AKA@ *Dn>@tYm/1waGKI&M<P:pkBj4a*=I5bPkJ4CDFQ%+QX^I=nj:kV/=#/>tatZwG&n@4B:R+NTV+P1X*\*
ilh\Mu mh5u6HJd9K9j:!dy?5&Lk4HN$hn4$%Q^5&TLKZ/wEPQINS5Y/u4+Thjaq&tJa\yB^?\G8dDhFmmB1MV+
YCh#cJ %$JVK/?Pb=Gh@%+#*QQWc<qqTnKwKNW5a/!HH%qpBaiNEIVE/ha9etG?dX*!uyHl9>C#u&*F8hi%/h!u
QQ<A8j I9=i^dt@l9BR&cl@Gah!6=l&ijIplhT%tY<qk^/5^&>jC#$C!m1T:mq/j$da*@QtiM<9nD:EG9/M9H?Z
&5lEQD MhX=eGn/CJB<&8LGQV4q>9T9ZG5jAjuJ*n96u@<j:?>^ad@#j>&kJn=$FD$pQd$Y6mWQ#Ljnd>%L>l=C
FjH?m6 H/:dT*y@P+y+ZM#W>6\aGJ%BE4au51D9aL%1i%B@BQn!#+L5jk8jZbi@HNj8*Qc?\dluX@9/Zj<B<lEk
:Wp4ji M@>9*RS&pMVV$BAiy>E*5%4i8GyMM%DV$Gj>c1S<SWR4u=c<kmZ&p@ea#G^j4IDjeT\HaVkh*hSL<cJ=
*/M<W! 1hHiBP$?MBt6A??Z\wS%wyBPnyF8pbTZH^j9tYiW8MG%:*eKPH/+jpwtp:^dSMw5w<+=pMYFpaae/H<k
5leyA8 A/<XKR!K+McQ$byTMDC^=>ZyG^wyNR5Stn\XIpqJh>:GQ6tkT%ZeP<m4a6BZdL:\VcT=*EPVYalml%E%
8K#AyD Dh*kY9X<XeVn=hV85uIWCMKejJ#mdtt>GLPqdGjBTa4LS\<It#Hw8S\+5Y:kE6R9GwTG<>4EttZ9mq$P
QFlN$Z ?RkqnGw9pXah*tBa4X?GwS@c@pMb#i&mX$N1+e84StQjL&#BCS/kNnkFb5Yi#VD$NZWD*p&Vqw9/M5e4
%eC=Lt nbie&=#=6iZCywudyB6Y+8lqeFcyW\&<ll<T9dytQ:?LF>XR!^$NRyj@imLQ:FiaGbT*&PGk?#?&TH?>
ClFLNL cY#kFN#mun@yB^8q<5QV^$N**Np>XNdnhB9^6>CXB&Z:p:kjXVZZ+l<jAhT>pN=juH@/*ch@96H=/Zi@
EhmX!n !@tA\>%=&9LV:*:C@w:J?X>h>*/e\ZnPjd?+#1Z@eQIIKI!/Q*\E=GYhiB>\Q9VZ@eKbu@MQCkY^5:G\
Z9XV!1 @u?Fk9+HC\Zb:RYA?j?QFA4!p8t91Rccnj!5EVRP*T$\6SwwX/^M$#Q&$SIPmuSIaR@cWJkNV>ytqIhL
P:y%4q /n!??GM4YLR>K$h6%>A+DPKFM$5+8epJJ6I^k6IMw1DMy$Z&9L:5GcRLpV!8AAmZBi/AdktV6jjkMunm
ic/1kZ WCZ$En^Tl8Fqal#GM6@+&i9:Ra4KK1=<tCwS=KKMIW=HFVSSnKN^AqPG5knCAjEJNN#VejMkMWVnAp4G
Neb5&l >=ldm\1mqd%aMkF#!W:D<H+W5VnRaP%wXAER&w1M$\uqn/LTX!I>*Ey!5kt1+iVbkw:5>iV8tBM=kBPY
:jcAeG icYKCFjRLKZPAYhh?Vk>6E9iY!S%#k5VquXT$WZ=ee+JItiSJJqPlA*un=>DNDtQw#>4LF+Y!a!BwKat
=C>y>n %A\Fqnt*PCFuGi1hCb9ebaRLeDp&q6+Ll<lb#P9mpIJu1*VZImkWD+DJ8NcRl<acM:DN#X!F+$=WqQG/
R^%*?A KAML\4QHXVRE8BAbJy4HDu\F95RE5q%N+a+/a9dYKLyPKW4$nbME&Rhk#H%YqD*8b=8IeBSS%Snnj6>W
u9DlZh MqFyW5%qnR\:Yt*4+Vw9QPJ=yS>/HLiNpt:@k&PL=\!=m1BC+ZV:eQTe4e+i!&1&@lP99DE#WlAui^Zh
tF>B/8 Re<!AC9HI9y>VH:Nq+!TI8&KTpY6#>*R\+\nl9G=i>D5d/j\6yjEp%y/#q/t+bTE4>Y\5YBZXA=ScL$K
W$*cc5 ^yZRw<keH%$Sh68<=d!@+#+$nD>hea6aiTQVTIB#qI8Edmk5be4A4>L#I:a&SjbpnAjpa=Kl*y$KdTuC
<9Np5R uW8q<DuP?d9elM5P@=XMh?\ekj#Z:#%FLF1jyqWwuKhw&*PLGe^X!!l<tRe\YJRqm6PQmN@JEeX$e=tD
NEjA6E >:mk9>*J+R\TPLFIq\HnaJG$T\&C*=+&I9hF@WDy6!CNlwEyBRpQDe/h^=E5*BQDdtq+ZH=iYb?a8!BS
TPy?Lc bwD:Cn6/^6hQYyBW>+:&I:wNb8?\qRQl/1D:c&!XYY$8tlCi\V4*n=G\JQdnC:\TwkVE\6!D*wW=M:S=
-AtJ!: 0007d78112f001202b4 Page 120 of binaries2.zip
P5Xjw\ KYSC/&#9l1e\IZ5Xp9!qVYVa+Eu>Qy/cV/Vp1be<!BSKe6Yc=F4FF&jA>bK4p<iJFAcahZFAy&AH!++w
nT&#Si ^kh/T1hX4<JTI6c\R8e$n^bq^^8!Y$KB:YmApwCFGTMV4&&SRjZ1*wV+^u$8hmXn*NR/<EV9F>^pdYuc
T1<TAa Zy5$^SBWyEb$X^b<W<I##+%=Li?C>@LW+5baTa#eQtZ>=debQ!HEGlNtK>Ty?4qCyhJmtXKyRPaDItTM
1Y?MwG H%^Kqy1ej9&^SWd6CMk8jt@wD:mF=:Z8p\K*GZ6MQ6u1JXDbBEb#yM&%*:>Rbap=5M#5ctIYL1Hp!WQT
yP#+RP m\PHY/?icqWNbDiKKc48Gh:A6!?$EyMX9<\CSu@J%=By+b!:W9tmLcScIJDNP=:W4EDPc^uBmFawh9FC
m=mKVu j&Eyph6qP:m\YcbD:h^dl&/bj&:?+@DaRdmBnX6WicPi%K!EqjH\pp4jIY/!St!Ft>tZiGcT=Sbec$bV
RAXy\@ SwPQ>M5eS$6^6Jy^S/%a/Kn=*R=AcNQm\qi$4ak$SHdckC>j5qP$EPh+=KWHYbu=<wBJpT?nW%pa?Fb/
%DVPkI *VjXBK\S/^SHG/tZB>DRFY*6Q>Vl4mlclTqNSWDX?6R*NAkminqY$y:!E1keDM?WX*9MDCe^1/1?$T$+
BP*K4% DD:VjKWZuCaCJqIBHT4%1cbXw!#y*MIQpQ?SiwipR$ELFRw\\Jc9DG<EH:MuBNje1uYwNeNwJjMGVAGE
waRCNB 8$1lp#n:KcIwDWF5IMItL/JBP&d/RX+6l*1e^LB+pZGyccl&pWw:^dYY1c8J\bbH^^WVCpPWecTX:56c
4:FRBA BW$#\IiY=4ZYBPFw1F8E++IjQH1leptH9mdXc^DPiabnI=@S6?tyVb9<9D\KW9QC%\VWCXA+5TE=^1j9
#jaFnV YZpMFHK18pkRTd8+wLY!9HeL=45Z4Sy$S#+&5A4F6h5GdNM8>^F>*MSWtZ+%k#p1A?=d#AVhPE&\b/%Q
bRd/8G pEZwyP&LC^!JM*la=KtNFa9GH?:TMw9>XDFVMHYKpY$NPcKZGauh@dpJ!BmEEtIqb61eZiHnJD<*#PQS
m^@l#t 6jB%dbdWSy>Z#D$IGSN<46%C?e&Qh^Vq1BCcMt9wZW1Iqa+/QRM&ASG+km8KYLR#X:Jw1pKKmA=cmmX$
V:Zent =Qc4M@b4N+CQP4!+F^6KQXJ58y#HAYByN%T98+9:dt&EZG/y9\6p=WeV=DNtcP8@CLW5yyT&mXaI#Kt4
>Mwe!j M\5dD9SDI8!jShw&QbJM=C8pKhPIDc<<5I<4ld?IW5%#4!/4HVhY?Yclt>y5!mMJY1Jt/4XFaW8+Gk>p
mw@J6& q6/+aHAKN%K#Cmhww#FZlyE*bYE%ukt8\tMpt+ItiPF:6G:k6WjX6m^BPVD#nbPh/wN&J\\Sk$Sw9EXN
q+H<VZ c=tXnYAq>+BZqi$^9/^N?QR*aWtu?Jhn:%tJYS^Rq:DHy16QF?TLJF%KChy1MlE#CS1:W4LluXMj&E>/
bt+CW! K4?G9IFLEaw=bZqQEnkMtTA5u5nyt\=$analMqF*<ESd@&^B*cw/>\%:/8I6yS+9c4!N88=i>GlGDjJB
4YYm1: C#c/wXHa%>:Fpi856iVZ6&>h/:p$!Ey*SG1M=Hw5ZdQ!nM<J1@b4eXIZ>T::iVyynDqA1yeY\8NL$5C/
mj<dE& Kj>y/k?iVn5$%Zac8tQ+4<Q$?w/F?wWb$t*ePw@!9@d!k5MNncQMXMpE9+E?kAVW558PTDE:6JR*!#Lp
JkaMTI n$yw!b+!RTL/BF5FP#QaIE=m/w@hmXStn%Q9RqK!Tje6e#4k8l*q&!9RDbaGy\=4RR5:FY+nk<J6S5i&
iQc9u# ZKRjHEPM+TltM5KN\eMZ#QedAH*l$<l5e<IM!Hb/XSFWP&GIWqR$%dAQhenyi@IVD$kG6/YZ5qRYl\F*
RyulMG i8JtHMY&mQSClqXSmHL8l>XdB:AtKmkLlyQLWp^FTIEKl!S:i%EHXWFtn!mX*C#khkICh>8+QA+cn=Q^
SEw8X8 <kdL8kY+yaGIS&TXVAI&ZyZnaQD\@jRDhme9aeb/SMWl5MJ#FW=ylIZhBkcX\TXL%^$mEXqMnIy+HE@#
j=5Gbt E/FHdBEVM+Q5Jw>e*E!ARC5Y&XM9%=LLNNF5<WPLC9ANn&pb4&NBLP4mhkPd8PA?GEl!dGt*P<qA>9YD
i91?1@ iZ6c\9%!JQ@\e!w/K+XMII4uGb\4%AFX/nB?ZMBWM>yYDBRNe9H=MJTepwRY8@XM55W^WdnQPpBLLu8J
^mm+e? !HEdL=Al8dnW9PhnGCVZy=L!tMpZwSBP5q>ldW9<!YqVa!*LIhHGW4h/=JW\A!y9PCAeZ+VM9^AatlK1
pFZhCn \8?q$ILm5&Zpp=kM64TChk@mlpE?6Zc!EIGeP?=%5^GSy%XKjR*DhBe4\&/lNW4F+mdPnFjnumTP#$&>
k:i8M$ \EZBVVZ5T\>=1bhh8Fa1nW6J+ShL=:Vuy&w\kqmTG*1+!LSu6><9w%hd\BlpAtihPABl#lkVj//WdVhK
C4NWQ8 !B&1VmcZ#kZD\wGi4!ISt!SKYDVwmkCQSGM?=XWWnBkkmpb*I!>NN:=%=&5KkY*!Kb!T\tZZFd?Cp:yG
&^y#aE uEDJL!J!1l>=wN$Ei*t\lw#<ARyN\^VPM<ap%+FCKc#A/ENMwin=c\:YG5!a^4Se8*dan>ud#Y?NDawb
aSw$9^ QwFCa><L<=Sb!c%BN8bKA4wkS@ui*!WQGw$j/QKNHlTZi8c9D=VCFR1?u\w8hZ%FibR@E9mB9Xdiiy:@
/6dpq\ bJjZ4lZb?TTkl5&bn4C+D:hI6I@VPbFZ8Jq*uEuJ1HInY\Dc!IqbRIB&I^a/q\QE!Ean%AMtbAAtqEpm
p+=FkM jG=@KT/e=$K^5WQj\$K>QmD^Y^q^GpA\$pajKjkj%/:kbQ<@F=:BVjJuZ>N@P#!D<\<e8Q@JH=mD?^iy
PKQhnQ #DqB#$H@!6?jp?M=/F@XTiDpjA/c:Xhw4tikRX!@mJLk=H+Pt8MZcC/Y=/B@FS*C^jwe>K@1q*P^QRMN
#Kb%%u @FX<B^j:e>C@1m:B>S^iA+J?lZ+P4\F@PY9Q+dXjFn4kik/9@ZVZ@tQ$e*mNnjXZ*QIeZtQ>FiZe#?G%
$tTIW4 Z<iYeD?H&hm+jmEi8Nu?I@S#tP%9R^Z?Hk*<n>DQaVdR4\1CeD?H&aC@SD<#bPS9J?==pSH5V%MKjBw!
SpjGk# pJ*n6%wS#+mM+Pd/^<kIDw:@PnLm>=IRQ!MnYNqBj^Ab\e*>:$hG5LH<yV:E$$D?EluB#94jm+^+p8:5
#<RinZ @%enI@\B*j?4I!PR@lwbEd*@Tuu1TtIuWbbbhy6ALQ^e5#!Yq\>%a8JE%/1@kM9\AVDFj:D$$?$Z@GeT
FEeWtl 5uWpmIiKXQ%:E81j/eu?**N6<uE1?SHkA$T=ddV$99VJ8qLt9IERiATWtj*$aab:BKm!i@@j8e4!enG&
IyB48\ 9eN/H&jGbSlh#MTkWcKeFnMTqm?6NZJy8^RF<Yw^\j8VhijNKM1>+QL8#?!Jj@cK4pdP48Jh$YKaEcl4
KDSGcc C*KZ^<pXP\jkB/aX>&TInS=A#+A/Q<ScL#%WkKhq\k&JW^#y*uCmwqMh9e:8kX\$6M+1ddP1/X^+XR\l
W$m@m4 B/WnCYq?:StqX=kJ5=9%PMN6/#bQ%ylR&RB&qidBqQC1ht!EZF==&k/%YqQw95EI@BHAP5^nTcY6&mI4
8E*@4V hi<^RKFkZpHZH9CPEKyEZ&h!1<%/mjndN+:1aXaAwH<DieWq=&X%t?c=jiJqD5K655\*HFydVNnNPcP6
ZJ>$DS 8Q*m<HP/Ww$F@&CKGBtT$NpSy*1c^6e/Sip4ye==>HC&Z@KCA5VyhJ^IySWkQ6BdF*=Z?!1byB\/5^9@
cYKqal GuY=w1m+WD*Y*dBFa^MB:*=h5/e&FhBhcpEj*FGX+Ne&YKRuXiLEmBe#FcZRZ1N5e1lSJk@^4RR4K/+\
^<a+L+ FncY%q<cM=dduAE6D*tAjK?d8R?LG&RyIK+%C!P@ZaHQ#%mXdLPSCHeQVPW1MHpHM1B^4:wp@:lX!G*T
pNjINw QHYy8YN$QwyyV==bQt=JTuE*+WH<$uqd@%91%\i&*piAkq8#h>dQ<lWit4ZuV@>PZ@c*JA?eDSpqanMT
mwRL<W ?BAe$\4BN\/chT*mi*%#^GY1SHhQDelL@ET6LK!wcmBG9/j@CBm%9+8J\4>PmmWZy@#w+1A/uSQ8l>!H
Q165%p K4c??#l*RK#c<YW@4A5>ZTnaGIAeV&CEp<4A9nie%?M8mtmJ1eyjl*<KTCXi?mwDA!yK5SMKm#QqlEd?
5^T8KY pI$pVwT4>6t+W$h=>pL@^@Z5X@+4ahR+?eX6=N4C#A%%>CE<ReRDLNZq^l@X1kBmG!Xii@ciD?tMy9k1
J/P%YZ tdTuwVWMA*/jY$Ben\D=ei?9K@L6n+B=SKEL8R95QJ64>hkXAk<LC9k?jHAC?%WWFEI5b/6GDu#dYFcV
EXBV:9 ^u!/\SK$FTtj4Da?*<!Y</wj+/<jAZmGn+BmZl&?/NwKyRRKyH/^uW^!ENYD!TQA%@=:%e<<c!yy*?N?
a6dDEe Y5:GQZ/bMb:^u*QHc@>VE9tt9<pt@?ei?C@$4GV9ll<B+J@@$9Licb@:&TNW=$::+<J#i9@DQqM$9:Q^
?dc#wq a\nA$5Ei/1N:5WBZZh6&d6J:D+jWDZIjb6E>A6wZ9e<TmY@>G*ydQFG8p1:C*\p9K6*%aE</WmYbn9D4
H<&+Ba 915m+I+b5=ki&B<SJVSJ+jc>C+i!w9N?ZE\Sjd8:^C%=?/yQ#CSFWZiNEnbASEa>nbbb:D/uAZpNGijB
</VuA: \*GjMTBZ:n*>$Je^GSG*5Wp5!mym^S$AmEQ^W@PQ5Ep?ed:1dtN#FpdiFTuyZN!a+$TK?N6\NZH%=CQc
5J?DQ6 &59QWE8/Hu/me#l1VcFktLYMhT6#baL:RiI:p%4uRP4k:<nN*kiTh:8@=eYd?FPT9L@<?Jppd@K*JHuy
<BCu?q >:9$@@#D?ZH1<NM@\@:8S:n*6$L>/H9dkN9PyebHRHnFI+CKcyJ\6>K4:PFC>^E\wPF>kL!I9L*H9/C@
L?J4j% \Q4hR@NJBKI+&^Mpd!Yk>iDB%\HethX#:tM&\#pZyC4HuXFXKHZDK4AT$^PcQwcG:uC/PatM%R:TiWpJ
Bn!lTq %VbIlddP6EZ#lK5jNHy@4Z@cD9A?qJp@@JD@n5*?Xt*!@n44FIJ#*8aS<Nu!EWA&wQ:Zy9:9VRDd:\m&
iVQc1V %IWqnc1<F\NbJ6+!XYZc*l?Mu#mMiJb#91L#M?5nwC61@$tYHn\C%J+G=VZ+^Gu<ljb@iF9c\eLu4$?d
8CEwlI $:4+=TDKX?%:%Z6dH%j9P68uq$Z:RWa&p*6T=:9/@W:d$>^WQ\LtmCyjTE==q*iYG\?SG#jcqFQP6=eb
Qn:kSE X<lV>5@FSTtlkWq<lAI+*<!WTuWRl94Q&1W<#tc8ilCQjtN9Q>i5%yTy+KM:b*CTbF<btYFSRtFTm=q=
4YpTaY n&LD/m@cWPQujpS1Mhc@bVklQCK8l&Xua%$NeDhwZjZ?kQKJZY*#@9VhYYwV<Xj@d?H##W<nIt+*1^n<
@Q+%k9 5Z/@CdLn@\##Fc@M<iGG*:$@tb*XnpJqIZ=p@SQM!Zl*P<yct4<:eS9@+>#lKpHZ@XI#y??QPkh:mG>G
awPnT+ LtSt^WW>uSZX@?yhYXB%WP$!jTtIlWi$iJhq9aM\!y6TYhkWPK&L9\#Sda1PSS*HCJ5NHj>>\*:Lq5&X
9bC=lA XXhuVSa<:dWj9&bM*l5XYk\+nLAGBP\eQ85X$GCMT+9T1cmnM+K?b=attb#k?@JaVpZXV/^C?aVS\8d&
*Dc5S1 mGkCcJ1GwmEIhI8l!PVbECi+V:9$!mQk\=M<<Jb=Ep#E/p&QkLjWh:AQKS?1:B>8=Y@R:6uj/u&?9<\/
XLi5Y^ Jd<%8?*w@LHQ@:TI+%h99L@NiQ?&56iQkK@=j%:\+!eYp9\#H@#q8b@@:aj?>ID?I%Jal\ph:\NW1@SI
jZD&F% WPb>RQ?Kj+lGY*%u!n9kmAaD\V4tTG8dA?eEub$hih4!%WdPt*B9Aw$kZG+CKY@q=G@44dI8w/n9=6M8
-AVacw 0000ac51271001202b4 Page 121 of binaries2.zip
Kti=&W +:P8LPd=>%@Ij!@n*PjtQ=k8>b:l!:yR5=>S<y:QW*pE=H9\:=S@#6>/tnY^pmjh=6^:ZQN^ei>#j9:j
??W^wu @1XV<puw1pWwQ<V<#Byj>!+&:1EC9?mi@Pt9ILN:T8y:LbD<4Znek>Z+@$D*ubKTj>hb*K<:p@y4b#<n
p!%qFJ y$+QamR>pMIZZnjGVqSPyTX@AlpTIW\qHk<b^mK#5jqJ=Kcm!&$%Sa$Cuq=\5=WH61c:=DR?=*@e=ZmV
<T+$#/ 5l<Bt6+cQY%qQ>:Tn:ulLIbQ4+SyF*iwlpwK8FqI?XYZET>^wji1#XbWXlR&L=+WSYK/JuL+QeVmKJ?l
>*HC1X 1q8l$#=WlZCN!54L?S&d^it*8R9K4!a*RIPyS=G1K\<q!IH+^:TL<e^X1#tH*WA@CpJMpG*:iH!XepI&
&jMDmA #&mQ4G>iJQSG<I>4EcWuSd\1e*TJG#>aKW>5+t?J<1MJSpNi^?K>@#EZ<*uVt>F:XKZ#<timZ^Xu:+m:
+bj6MN lpeAw>KVD5&+iK<+?TS5@@Wh+\?e=+6*DhJQW>/pj!ZPijN=XQ><u9tidM%:u9D@DyT/e/H?*qy@imL%
t<bJjJ ZK4^dP%&dGweX<<cXZhdlPCM?*HtpQ#H\yQi:c%6RKS@6PI>wQaImMM\n*SijKZ/CQCwjAS5M9Bj\XkH
iJ*a$J ^hKc=pdDp5!FZwLPeMW44JdZA1+1C6MKCc/cR>W5B!qFakCZt&+=15l8Jd!8u\5liKw!Z+1JVlt8a$pN
ltuGY\ &bFnWYGb=aakd!mybhC<Y9VCK#4ING46qKm5>:W&1#^dqVGBLNHIe#XbhScLTjEA<&F!@e\%CPwS#M/9
Q=^$pM EZc^#jXYmXKFK=ZlYILutY@c/Qaq/qukGW^n5y*itd1uSSwl^+=Bjc6S>JWTh5b=y^ceK*PPQBHZMpuQ
@8<uu\ INXWXt/A%$KGab!56Rd>kqR=hPm1%M+Lib:LW6I:^j6JW=qQnZ$E5D%6QFuj!@mjXFXk$9ip*^Ri#SLt
k&XF*? C?djFJ+/Jj$h@h<WH4Q<#4HPJ+ZHc9\Q$CDKB>QjqCw%K?t:$h>W1jK=b#%6XNYkQ<YZA1!/TPyHF8Hn
H:btP# *L:u9>4/WZ=1$9%!9e/Sq%5Q!6<ILhZ$/&p9<Gy4L=/Ee5yQQd9PhN6$&/#u?G?Y<*FlQiWj>yK:<4DY
cTaLHY :<8/M8ZMTB%B=b<Je#u#yWp*qIQ/QAaF^TBCKue^G^59cpXmX9YYyDa&1D*<1lu6$GQ:8<RAht<CK#h6
\ElQA8 Y:<E%H9te<T<T$nqNqX:WVakwK\bZ@ky%WY*4Gt$T:j<!Nm:9JZ?NlaKLPqH>jF?S46TMk%Q8$EiNGGW
W5+1SA 5F+9l>4Q*QiLQ#<N@9S^WGjw>4ed*?NWq5jjTYqmR+V9p/MquQPy&@hYI^?T@a!5\V%4qYK8he?8M?*Q
8?*?!D n<?%JG$>!=6taBqd/HM5+Sq<JX!lJNY%%Ai^$5b8KiC%yLMB1hdGIp+mnee>11R1MeLj499LZT6+%iwD
tt/Jh$ 9<uF//#I!!GDATK6ChTnQ$d1ItN%yyYV$F?qeWbweccD=L>b$L%cqY#JiX1RlD^<6EAPu4YC:j1/dkRJ
IR>LK& $uCJR:5i4SctR8BGd5YQ%88Q+XDPP/Qch1aX*?t\6Cm/X=%W+8LKHS9Rw\cn1VhYQ8N^yq>iN4Yp+5yM
MZV4<F &n9ahtAqiCmK9lT@pajcQ4$uJ:djGZ&VHBdtmEGNFYQcLFCRecQGKiK\%/HdciI&pMY=#IjG^?IL4ELH
WFmL@+ *W=SIjGkmEkb!WQFFEP!@CEhFVYiYMFZLY$#Hi?@GH:4e^5lXT=>CyB?/EiTPPI^j=#iK/5c9NK\$@4p
mH?S#A y/T?GW&>6GYBteP*JqVL@E:*#Rd>Vl5=8eA$BM8Gmmldc!ewJ1l\XcX^9?9+PwLq$<R=jb?=SkaZ1%R5
EQD1+9 jAP@FRh+?Ied5n<Hlw=4QALm:#h9VSj+6@uhH%JWw::Lj?I9%Q%#?Gm\5AK1RJZYN+li9IDqj<ZX@E?C
*8*ScV 1BpcmXm1MY:id\J*m*R&YqCQVVp%!4nQ%p>6iW$:6Th$HttIBnydAZ?&c%%>&1WEI1k?IqET*%!Jk?u+
k5d859 kF&=Q<%=\$F/bWCBRcwtkcREaTceMBViqh^LnJe!kCKW=uk#Wm6FpZTnRniKlMB#w+^\KEe^V=WIEP::
Vm+Rp* CMAaI$?S^4Lwhl+PDk>NlT1=8aNm#XLqw+kKJ/TpLNAZN/M8Mb#$*P/*8#+L#4+$muk*RmG1+8Zn=W&R
tAkNu\ >Y*L?^Vt/eNuaQj?P@Eh&M@9I<iYS<A:<Tjq?Pqd/uH&+M:P?*QMp+n+/YQ:Z>/@?q@ejHb&P!LQIcbE
Dq<@WZ K=D@I98deiVj9iTS#9QYlpYn68aM%&wZE6hu&LEcMS?uLX=SRX:m/ieB1&/d6J/$BP<LPi@H8cTH<JuP
yIA+yT k:WuHX:m:Gi5Z/iayj/X*e>cDP/@lRH?:i*&$/u1>>wXV?wG@@em#4%^?wiKlTjhkQl8N8*TLPFJyVl<
\ZEII\ Wl8mHm^Hhhpq65<5G?N#1BLQ+11y5*X9VS!b1FKZ:G#9/1#bJK$b?=CIc4p5eR/SCJ$enjed!MJm:<Vn
=^\5dw #w:pEP8@WJZbtuy54&m@iSNHI!qdZaZJCTZ4Qm$Qt<eu>\nA^4FMP6j9NuhqVtTMyX%wR88%1yWq\pbH
PHS>Vp wF*HqKB+LheJT/R^lb54myTbuJSKqP<bMD/m4WPSiBb<e><WLT&mhj5YABN*S>+HZy>=jnI#eM=Q4+Zb
^$=ZZ/ inu1uSecaGG:dbaDHww9KWBhlSaYFDP@^FiBj%cQRbhGTVHB+V=JFbtF*YWuehN1@nmj@C=$FlL:K%YK
/TTKj> Yi\\ju$ymSR$?RbEK4*TB:IY@j@PlI*j5p5>KYm8V#4a+M@A!u8<A8@=%6tHtM&uyZccqb:SuJhL5^RT
uI<Z\J +N@:8Wbe!wY/A6?1T!$dw>udy&>n6Bq5T16HXtNF+#N8\K:j:KdY#T/@99G@jF6FQK9#q1IIbW4H55>q
?J1/Hn >?#6n@Y5:^<:n#$iAW/Iu!>19Je9H4d\HleT9Tj/H\HYp#?m#S+BGYEQm%ujTMajAd\+>%Z<J+JyD&:M
$TiMM= Q@T<X@$=:+:$4>5jAT*RwEhAu\4^&e4lD@%5&9A@aal@^%V?n6H=HhQ<E&Q@5&jH9@T<?dCFt?5h@HSy
Q>?/*Z =86>%B/<?iQm9$&G@X<Ga@$I?NPntyd9\iTcyZF8kk/lP:YKB8<Z>+nXe$:9uKP<u&V&e6SD=5WjP?4?
Q9bp\@ KX*YQ&dh=8aA@m@I84$S?L<$/*ad^$Y^aPk:*MCVNB5C/JJNl??9wpuM<M9CTBVwwGmtFDk4EG=&tt6!
+d!&8: BFdbSL4nFjkmnln/$T1?ABa\^<qy#qGSnWX/t5Lyc?icITHen@qaN^u&$TQnEAu+wew$Snu/IS^G^RJb
n<+Vt> LE+\i>C^aHmHcbMntQk5b%lYccTR=KyH+CVM=tqPlIT?q+Kp4/9wRiqR+I#TtP*:A=aABjy1cc<:@E4W
jqJq=5 %B?apBl?W\V>Z/DA8<YA/X1^Mt=ie=lLtBdcFwke:cV&YtlqL@w1a>l8G<KX%+a\NT:J6lwmMaRY$acu
t1N96P ZD66S4DZp6Bu4YYM*eiTQkwTXl^8b=h1lY9NaCIy>^u:LiPK*uMK$d5&tRk696&W@PVki59Fw9kJSFnB
nCWjNe a55c5EY8e+p6R@?DbyRD#KYaWDyMP4y:%C<:lBtyHIPadIbWVNiXiRp4l%6MA=6\<D*8XR8b1iQXA1dt
=4dqpt +5eDXD$i5pZl@WWRu1*^nTyetP+tp:?NVjiCMdEKe:EP@9#^1euQBN:iLjTp:Y%kbZCWd!EDEEbn8/HB
4/!YCL en@dK*/H4p1T6>=?kXulTSpn1NW16MCP^L1hZ/?Jt44RX<Fi@GXWZ<F1lhYAa\AB?kJMGKP=tQ:k\>HC
E\<baE t<@kEX%$6hWhD6dMmQluaBuhI%dLMmiD4G+?F!\%*!t:Cci5/&jHHZIEqKHDQ/*XdqW&^5G*I5hhXVe9
*Fp*a/ w&bW<*mG/YkDl<4$q=wmHqZ+TTc^^Y9E:nAD#t@ScI^qwu\+Pmn$+QZJDD&Kl\>4eY=1mhqREWtu@S8@
Vk^@\I 1RPE*Y%5V!$F8&A?Ge@%+muaj<TEjy%>4l@*ZR?SA$Bt68G!%MdNa\ap4F6$?RT@$8EA>bc^HV5<FeQV
YG%LTh ZYc<k^?CEyC5=85GdTZJS^cpy6Y#Vt6tTb5lnCy\:P99Ra&/mk8B:ipV&9$aNIt$pV$ZG9Sbch=a@4Tl
p>jSaF Gm5/P4uuNTQDeQ/HT+WW#FJDMZ4cm=4mI*nm6Ewl&#+/<CI9>eq\a&b=%Q15c^X+SiGhCMu=/QjJepE+
p!6?qV Ewc56CE#9LCySl<q$TMSYKQjT/A&KkwLG1NqwyHC*kV%PAqLbA>dRM>5bAm@YVP$V*\yBc5IkTdTbITK
E*l8GT &FAdqIJ9c4Ym#=KMP!JYSd#bSiNVd6E#hB*HEpN\//MIF+ehS\!D?4+u/l^cZZwylbd$DRh$?Rb>L+eH
pjQDKT >u\Zm:4W?qt&*<lewqCeE%^>R/Nbc+ym*C=nSS>&4J4DYY:dc$i1qC^=mW:TndE4/jE%k?VV\Pm6YGPp
BQl4Nh :Wd4t1L1$PT=wVku^dIA+PuY%I!I=!^$FKR^FK5!QGw/?uhW<PR+/q=*Y!8ktiHLEBb+SDlQKFmH?9Kk
#m9<dn JGtEN=MyBhYwTkiJX:RJ4IZlkcw1AZiNXMW$WNP!1j$YNhnF%q=<X5h49X9huDqc&*u:G\=h^eB>GS$^
SKnlI= KNl/:K=w4Ri@%He/<QBiHi<h9tZQAH$FjGea*#9nqeM9Xb+tqQkB?44XBN\6JPJbk1AP/njPd#Y^:Q!E
DyajjP +SatLFRN\u!/Q+tBj+nLPYXulQyRph*DA\>8/KiFmNuK/Bbp6RZ&8yKt*&^FSC<:>j&Q6IDVX8w>Tn8e
^YbK!q u6m5EQSXWmCJpit!wS<$1<q1/%+nlIFq/=+AcLW/$!Dc:\yy\VEX4&Yiq/!*PSQy6IL#!u*T9Fdj5PTt
=cIK&G 1ZpuNlAhX+HMyeP&8aHRcF4w^kyMkCXyAMP:%@?BKSS8JGj?/1&JH&YeSc+^u<85>8KBmVIHc\4wDdEh
61q:b= R?^HLVWN6k1i1aMy&/*RSM>LLXTLV<Y8J/<9JZ5IW8uk\itEW<BtdCT@%Tnq6c?!NQRp=KyJwp*=PCN:
el?L5c 9MC1Tk@#6h\##JhE#llhCtADA^kZ8k1%VMFHlkm=T<jjqFa8*cJ@au%:/MA%M65&81u=!hSVV!Y^EdiP
Yc<MGS tBnXJ5$KL<R:CiNF=8E+S+EeTVNQ\<!R<!^iDa4upMdkXhCSdt\Fd8Vw+mkRH5@Q/A$8F58iY=Zl\k1D
+H5<4G Y\lI&!eQZ:&:tX$!IiB#d?1\=XtPchZ=#AA\*mDeTEZGGEcNA6^Hc^6dkKM5cF+dd>QJKSNMeD:m$bRp
tX:45= 6B=iKN6KSV\+HcMkWW^HpePqa1!Ch?Dcq?^pdL#/6uMSMBt>LMuRlH@/?jDR6d4JXq5ZtF^j1b&/n!>q
^#qZR% 1+q*6pP8FS9%dac&WcECE!lk:mMhl>#%w:FH^mK1#YDc^cCCCwNluGVGJ5/SKnVPK5HIZT*pqVtFKVZI
&L+S#m n55XX\F$B6%aH$$Y:9VlC^ZjqL^t5eBht4cGV1I?nXQBck8\MZ?NW=+HkXKu?e8+wjJDlE^N@wlXWtBl
lpkh@H jJ%kHV:jBt$Lk@4KYcwWGXT^iq6yG5F>RC4<>wWEN4:@t?MWCiEG<V=nh9#*1&pP/BC9iJ%!QdJ$@Kwn
C8Vy+L T+RPS<NI+*kD&^Pbyt=im^li6u6jipRH$Lc\?F9aS!VIq4*HL/DYnjY&4N8PWB!?uVQDJ9Zq$^cWJcLR
EuX4j@ Z9JjQFPTM>WiECa?Z%P1DKlmZ1k&NRn#144k5ScaTVGZQhLy8XnlX@!Wm6i$mX!bTRQBtjeRQ#6q@SHb
C5$jkb &mP@ZtRtV%FMYEd$\88Mp:N4Pa#$?&HcZ6iYtM+M&al:j>$l:8*?<jEEb1&*b>u6Md@J\^j9C\#e\ehw
-AFW8d 0001c874e49001202b4 Page 122 of binaries2.zip
<lwP=J BbNAydTm=Q9C/5/wwR5/?Kcwt+iTh$tl<J?t\CGS1+>RpbED\i>S>pV5LVyDF=mLBZyaaH@AIm9SyQhR
lB=ZhJ X!QKRX@&9Y9Ij@ZS*CynEuw?VP/$D=c%&E5n>GC+T8PdVPtb!eG6bdPjXT%nRZLW:q*#5eW*!atp!WB9
lER@WJ !?bW/t1HWbYFWCcSwIPpp8l$icypiba4<lePZSdK:/YG+BS<9w=ajZ%*aYZSXh/JEAYCG+mDB@TWMc5q
Zdd>R! ndtN?k\mMbuEl5BGn*=<JT$Vq4j%kV1V8jlV1eCBQnL&=!IBejNYm:JE:eHpZ9GVW9E^\<FLyy+>5aJw
#IPbn: I<bqk/JpISGK>>PI+pMH<YeC4D6?^XYQcNtH/HKuNa:At:AS6*KhAaTQ*^Yh!ph*nEYy#5a+tGmXykLl
PMeXD^ P/j>ITebLE%Pt^mZQ\VESqk:mFNt6=:AH\c$M=:q%<k:uRZGXyec/MACG/$h*k@6/ecERmEKCS@T#SR#
$p$SEi 4Du+hR%EEFBRMb+NI#yPYF8&+G@j*FJYMnyP9nBRiJNHVMAAiYkK@dW9Aiw4bPAITcdM^#AtJiuJamGa
RQe^96 8<d6S#JVZCWwQe5h:DZbk$PnH+RmN6FRa+d&u!pEVIVkm5mQAtqP9yIHyn:A$5WWmwLX$qQB%MAj\Qik
cKKGYd 9:JmwlI?bTyAw^KhXq5ITG%H\KJpEc5nEcTlV>dj?\=^5tG%i$blemM/I%Y/QcE6+$&LuENbn6*hh$!L
>XYqDk ZwhcYaFT5qij*!=jt1>AA^n#\YRuN/DcVCRF9>6&Ik\iPIEl+&A^P?Eqk%:j&iGC$CKF$GM*T1e#AbJ*
Zpw6Ln YbE:uhB9CNF5TEHu9pM$*wNcn$ZKZ+WEBCN669:Ch@XQGZL@#@m854GR@Npd/N@%Zj%Ve6<@TAD5@QSL
c4W91k &6LE?Y@hyy:8b9>#+<>p5dGCjt>\@cq:61jYu^6A%n<*@8^Xm<VG^9&uXMJ5:H>?pP=9CaShj!a\b@q4
\BCkPR !tHRu:Pp@\Pq:Q@NXMZ5uQ?e1ymh+^tymu>LT9!:/=Z8Q=L##:=^9$@Qj=*euJWF>B\$=/@RHM>B5*H@
&ATBMt A5*=HDVL4>Be#$CDPIC@RHM@B\*<^dlbYb/BBuK\@RLN?l#$L@6ti\/c:Xhw>tik&Vq@Mii5#?E%hlDw
p/XdkQ F&nRj+S?D1@>K1E<K?6#iP%ZCiXbYb@Dc#@F!^?nu<N49*I+btX:D1@>Kl$>K>6#iP&J^F?ku<N44F!e
/\cNX8 9$C#@$jw=@DcL=&hYhti\&\kVw=jwDu?I#Vuj+S?qtD:SjWCX4duMB8R<^hw>teJ6q@%#e:/4FiW/^hw
%L&DGm 6ti>w4>C5@<ue<:?HGaD@yJ!$D@+Xj?P@bh?%d<utj@N4^4$B*:Xj%IP@8FkFknp+Q#@Mmn<D&hRmQ99
/Hj<a# bqCIk8yPXj1DDAw&PP!TCG/pI/RCH%eDdT=4$NpF5^XAVW\!^hlBaMI/E^HnR!ca\wL6>dGNyNJetEk=
enHmZX EItwmLaPy5^IiV=KBFI#K>aC!QEEEn^IGMyq@FPd<X5V+i\T^1BIa\SH:pljcS:k1DPZw1T5p+@JY5?$
ELtX=u p%EBhE+9^ZlA>@94Luk@e8klC1E<ZCnYiR6nDeu\c4<=GHbVIKa!cjn1byPLk:dp%NHetpknBD*1uK!d
lJD9h? !L:e$kJqudW<p9B4bNqi&*bM?RX6D=tA^yhEZEJn1^&8w^^%n1bNdk*eA5l#CmNnc+\p=#8!9SWJbyAR
@4QGS* GmN<c*WjFea?hw6mwLXmbMJajaq#\&BYIyW&aIQmRGbtp5PF+w@RWFuDC%t?CQkiBqT/CnQjTw#ZPtJX
TAyVI/ $>BXDGJIMNaeeP%\\1ZcKHlnC%ZyIwBy#KE#G1nBm4uw<bGD$X>Py6LaEDnidXKKmpkK%aj>pRpci=\D
!c=b^5 *!!cjWjhRaFXPBH&#QHR*&ihLb^Vd:RYtLSy/CLCmFYQi&AwM%wPlb\Fb4dZ:KDMmekVJ=u+>SwJ\*n#
pGFS6I B<eL*LG&!1m*Z<EAZ:F56B6\qM\e*a8^#IQZdCute?IDemJ6n@%ab:=X+hR$&a!KI<q$JECa%6X&8GGm
Bimh@& 5BkIeDjY8XI!jM\SFRZN6SR+qAZP!/4l8iaWGGyKNFkajL>!:Z&B!/mFmRF%>MIq>#EAk*CHA+p#FeVe
A%DJ+d n!RKwK^VG56SqmmF1WcEQ&>+E/lBmFjkF+>Bj9S&E81t$*\QDRqDXXE!@+ARtt<L<Ri^SptFTMy5bDd8
FunYWe ndV@X:Tw*MGh*uG<KbHlj6N!b&A&#mcp<&pDb<uypDP&Cd6lyj5eP?^LlCY<PWmEi!8CLpF+kmN/jbab
%jwNXV 6I4=^G#THt5h!RTuawkIXB!l5jiGMZ8=*+19R5HW#SH*V%=^8FVM5K?:Ij5!>Sw4yMnetAe:4E>WW@Sa
89kt!9 +4LD!pq/+1dMw/hPw>9yPulCMk%KiWp45VNPGQSE5+t+l+/k$ky$#%MI^T1NYHP!:Qyt^cyEj=Q^4^Kp
#ZTij< M8I6/W@Pn+#Fh4iRHTPqXWu!c$XWD4S%I8u%eXKn$^RPnapp^LNLKLl4eVGuSKKGM$9>lD+j8YQ/RI/^
ju4G// y^$#\5pWJ$1W+GTHyE@PKTB@Ba=FQjBh<!\K&n+lJ$AWe*5FHl9w%G?cB5YXqybMpuGMJkC6&ujcDVct
Z<Z5%P AFiITkweiy@/9aTu:y^e?8P:W>&YB9c!ZM>!D6\WYbML1hQtmcwlkjRaJEnnMEbtctPuFBYb1$RdpP9$
Z?tl8@ uFST$T!=Rk!AdWw$hGaDE6b9J>Kbwbp4D#8?^wG>i+lAYe!cwICbM@kqX#8H!TMSV=*1#N55j!m41X+b
61SK&& Xtu&puC!wmnG^NF#A<a9+pLdQ%D\qTW+cV$&Wlw%iuJ/NIXFwRc4C$dX<#H66W=a5cA*I<<n5Pm=TG64
YZH@XK @ipt&9cpq4JyY?9>A5/#1Zn$kElPNcqTm$bpHjwBcuV6j5HN?G4$LTA58beFR=cG\1+ym6dZ<BB$X&cJ
@D4^<* 88tGc1?\yXdkt=MdekM\Pc1Yy1cCm#EkbM1hJqTCFGuRiZepG#X>C>hu$V@caANnSA&=*HjSnB6RPXGq
e9mlpD $lnh5^m6DX#>*TIEhNVuB9*cJh4C\:iYQwc+CliVIEbHD5&$qYHaHJAXYuw&VB\8Y$K+nmpPJ@wWI&\q
cyqn*R qK&VIMy8jFma/<BTkY94@D4Ty>HG!@4JKDSV5LWWKJwCa$?wT+yF6e=V$uNwm6YdQpFp!l4papQact$6
=#*S<K %!JeHL>?49QG!5M%=BW%6e$wkaK>5MD+HneWt<YbXJnS^Bqu\i::yBy@+9ny<*BndM!<lBhCe4+hZpX<
Qj*1>m ltLuBH=!*CKeSc1w&Sp6=cPc#JBd+V%dqMeDNjpXK&&1\RVu9t*8SXAX$nJRmStuLuIjY>^*CG5m5Phw
B+tljM waB8MaZ9t\J>%AkqSuyS81De@b#8QymplQdSqMVtV9P&>6Au5:T4?wuE#Yn/^Y$TF/V4HMi<JHCkb?E8
%RyZ&! lEZPG/e+!qbKASX6=?W9cl8c?DdSKh/#>C#9JM%e88NSJmS+^#C%&l&tit*Y^T+1LCSwy8w5y\GcD*%n
iL</Fh $JM14pAHYu&ZEMu&H%NVwLqt\9%J?$jq6ILu#E#pTT>qP!W?im#RHRtb%nqP%TcywQL8+MYudk+PcqwV
4SWu8h y<GcDdBHAdkNP<tLZc:cX6VlB8B&1aJ5DH5MFtTH8KuJ#PRI\wqZblnSKSwq/p=%MhQutWWmP#H#ZcLH
aqMctI CJNb?5W>@dptP@S8aj5puFCyh*j&nCC@GeNLiT+ViTZMnMJ&8C<d$PmqhAt#>1@bSR!PVaYH6>Bmm<%\
bncRie YDEa9awKIX\/I8!^\^GB@%aEJbWiVFFYkH+DD!:bYKCB:<qXelkkBCK9kkj*J>KTk5ijw!<>d\!k\ce%
^KXT<n L<aT!y6ynM:RIn9iT\%4d<kqij*+I1$>KmB*dTd\6XuMSlYQV\iHG=FB$eZ1ucyRAe9bq$tPZbuY5luc
c!I#VV $F4AC:QZRTa@Nn@6eWCma@ApL@tVI6%p?Wnn:KdkMA+LjSWte$l9C^B/@^y+tLa*ShYbbh*n<Hy&q&yD
mEIM>1 d#<GhWhdJhl4@Y6?T:!mEIMRhHTM=61huXMTHLJ:^b:b$W*Kl^iThb&elX+@iGca1/>y&qYlXMKy:B^k
e!CTVZ l$yE*p?Zy8<KM>!Te<np!Yt\pECLnHAm\Nbb?HFc%E+Y*Nwi45wlGNSdudLdm>lD%?jCpDn9GPmMwp5H
T<N9$Y bA=L=RQDHDmPqwP1JX+nKQS9%#cFy$8QRXiEnySct<u$+TKFew#RdBn9&WNI8DkaK#lC4n8hPlt9B>cn
D#S!Rm <5m^5DXRqB9pmRRMc%WXcnTN^E<H8p<jBkcJA94:/6p6w?Yp^hb&MN5*@T:NMAPydS#y!Vlk68^6pRMp
ydFBiH BCyM&4u!IntRlWT@tuq9/#EGn/nL:uuJCIJ%KSVtGh^SS/:un<tQPSmK<<NJE&AwLGjLtAHJ@Tb68nG5
+Yumjd >:+:C8ZAl+<^RM8WG>!l4G@I>AKRAaNn1ZjnY8=nR=?*Vpe4W#AlK>&l5AeDkpe&uc!y:8TS<ejCX&XR
u9&CpP t!FSjFbP5%9LX\iR<cHGWcHYm=p5MXpM4MS:PFS>LNJN#MK4uHaFFBD<TcBJqPB>=u=G=E>a<JHjRmK/
TLaI%! W@6QWY?/9CSjb8\^+C*bwww=&na\T#iiwe/d$a8=w#EKyVpbwjZJl>$\kkVEM^4M^XFeP@hA$@1pRkIc
Ww:KP% EZKVEj&MtE>$mRFtLJDB>EK^$Lt:JJ5AJD>WiKM?B9>tSwBh!pt>8InDwcta=CpnMbTaiIFTt9E=diTE
Yd5EkH BjJM5$E/*Hw^dIWBnE\ckX$X6RAtSW<:ia?Qq+GhX\$?G*ymZKGLlYQ?YlYm6Mn1P&EiJM8hdH?l9Q\B
B@8:V8 h#M!Vq5^N&6<^C1!D1W^#9!F4?jLm9/Fenb>RL54l1@\QXZTnFBDYpy#=RJcc<ECF=TBmJVu@h6FYHp<
F:W^VQ &a!IuTM/\TkeQcXK!WXwTFaP$^BNbHu6jHAppJApFD%jTSX9tB\jKM@y1I!5TZ4JtMl&PhAG65qZTLik
9YFa#e tYKy!Y1bTJVacJ<Y==\HEy&jkp&eI6eF8phECJ!F/X!N*pCZeqcDti\4qRAYqR<tk^E/d$kJhd+4>a+h
YeNiN/ lRmLBKXX:DABLaplNZXQZQGeIFP8TW!k\&cpJ/AQMZ6KPdATKP^t@H+WhS?NdpKJu$qJa:me*PwPP4hc
X#q#<% Da/B^c<=V9HA@F!yJGkRCaIBQ1ALGPpXMHN4D*iT^^1ddW+whVDWIiYXAlnbH>M+RM+*qQIC?l!<FqtI
1cdL%b BMwBC&1BP%nkpK8PZb??lQGR!c/uVH<R1*XQ6Y5<:H5n&GZFBBu\e4n%YN:yGI*mPH@w?GSD^A1&y+4u
98BtJp 4NDEWP+CBl+a8V:!>T9+LKQZcS$q>HV\FiNdGZqtq9+kIAyhVj&l:M=ASZ^ZMA1?a+XZ!&EhK>TAmDKJ
TN/\QI @RHJqaVQXR!$&%i>V&nwd/kdZaGX<c\Wd=BZ&a6JM14/dHanMFBPN5MHcmyjnS%MDSku$dtKBFhhGpy?
EyjJ!@ nES:XW**aG6#cq\Rwtw5NtAkkPCn<K:Ld4qLcXS!1/dB@jFKdI!=qL*iT=1F^N&SXeIP@!cId!#edJ^m
BmGNP# DHp*C!A1=%pNj^&Djd$XwZTK*!#/FkcS#kw%*JEcXqnFcXSe^Hwu%Z/R$CylWaCKITu96X=Zn>SlMRiE
T8Cay: pMnPS$/1XV8EDV8^QSi^!:jmN&d#:b:dYn/5iFK#P^I#A+JpM5h>c$\M+Y::8/#bC?>1k4$S8G^X<iRH
BKuSLd hk!MZ:QLhnIF?J#LK?!hP4mZ<51CpQinPLSWiwFFyL4Dc#CaN%IwpJ>kP:ZQMN?wWZ*DypeHncPducF*
HId@EQ :Y1^Clmj<i1:tw$4ltC/Ct8!Ktkwlp?Xn/!n/a$wttk!JR?#&n!1!iI\Rl8chGQYiD/k9hPS!ePXYMKh
-Ain+C 00079e8b633001202b4 Page 123 of binaries2.zip
PkNell TJih4=/wP5R4I<A:BVEW*B1^qt4GXJ+nEBCwSBHWXqDY>Hq*/SJtP^N8au1SJVe4LlLXjH=BkkW<l\KS
y8BCa$ FaCMkLS^:mVPJnSPaB!%eC+C>y!P*#md=Ek^jMqIBLtewLm!Bdq&:Lubp:l4SV1We!k&kPVPXbR%:hA>
?IGYwM uL!#*Z#C/&KACGykHF>>C6<G/CWbDCFd!M5/j%1+huYqSLcbNN4#QD1ZKL4/PH4\G\1yNQ4G&LSLwLwc
9c%8B5 W@N4THh:e8M6Xeaki<cFqZhYyTN5B!cIMe^$HP=PN<WNL:/c\=<w\=n9YewuIP4FaYc!E!km:$BmjteL
>TVekW kGI:GtiuP%AMbP5aMqR5+\X!dJ9duZ#CijuCH<&F>WVJlSV$Vh?qF<$X\=JE&bap%++m:=6L1Y*kc^Pc
?@^&m+ ^Tc*Yq1*e%b!hZeRi\wFnniFj^9FdD/JkSuhSVpy8ma9c$ew8/9jnDqX*TC%bV=6TMqLhD>%m@+*/yc9
8y+dCq MLctT%=c%y%\aJ\9!l##%#&alEpL&DRILQL\^wJVKeH8DFajRZ=:/Re68Y:Nth6J?6HZijMDuec>=IXt
HKhuMn GNwNE$c>^tIFl*N9aQMNKS=BNQm>EVeML@5dKW&WwHQTKKNnt4##kKcKPBim8GKAQGR\4EA5\$cwM@kE
t\&N^8 HB\l\@y:iEDkT/EJYINCWy>k^P!nh!Rn5J8bKGTweCVBpGB5CP6F1h\F1S/F<AJHYDt6&F@55Jec$qKc
9!FN%@ $q41$Z#P5ZLt<H!V<V#G<A^n5eBiaiSIbwAqw*MQy4hMyueuE=Jt+ky/\l4$aT%6bu4MbyCYE*Y9E1:u
V<A>\n w*eHbZ$j#8a?IP^iJq!@#<Vd#9E+\QQN^M6yJWwq#hWC+IFNEbAY+*$y^@<!S:lMu4=Mub:n?eJ\qem*
C5yFmk B><ZFaXpCEtLP<iR8CAXqnD:DqiRA/:d9kAjkP1:R>RcVJSnkJZnmT\Rnu8Lqh+cpJ&cnhn6lN8%nP1b
lPIM/: myecWN\cnCd\kQwFkI6jmidLk=E/ZP+#ZbJ1ubu!yeIVL>h\kanuT!ZQh1YkFa1lFhd6YSZQXbYlDyb9
k+Btlw Y>YZXwI$5Pw*ENZGDapi#DXpj&^*a?j<H:Y:ebK\e@?nCa=bla&E>W?FY9>6k^5:%*@VnAZ/A#MYmPQj
dD@k#J 14nJ?q6h&:?y8Qu:?he@uc#>\Yut:#Q!Z^8*kC#QRQ@TSASpjR/c:SjtCmDdM>DAZ&TXaRY!Q\QN#9YL
R^HH?! <$kk<Dqwnq>SD91Q$B#QRj@K+ADpjAd/q&acINh#$L<!$\Cj\&8@NNPAu5N49<wL\\y/D1@>&6kBik/#
ReChEu @jL\G<V?H/H@n6pEj=M:!p?m^%:F@kp9R5I5!<4P^M*E^5aP+tcTMDW$aYhTjt*w\GStcYQ1#GV9^PSt
^mHDPl /iVmctnDbG61c?@p<TViTGkW^BYaHE#McH<Vce?5E<6G\5HCSRJp+!dlaGN=SnaWX6A@uh1#e@&Zy@b@
E#X<&* TaD!&/p>F<5juN1D@8nWuw8N<*?FP:ZS@$=*/tdMXPmT61HJ9EQ+\uBPYF!:@ed8c16\keue\8!/pT/D
@Q6nJ8 /J<P8k$M$mRKbAH$&Wjha8RMXQmDw\eLuAGp\ZcaR6bHC1nMeS@QMZ5RdC+^peNE46pm!nGIliWhkWia
WCaqF+ !BhnyD>hp#GEI<Bp>mYb8$W?+R/\nu^Gt+5Z^eIb!wqZ+GBS5BAW1&D\5l1eLmFS=IP1Y%QEuZL\$iT4
nj%\wp Pw^hSGV/IyCNK6yR<by9ejc>1T=mw#YS15KX*&jB1uJ*RcpK%6BnZbX=Xe>tJa\KaV%=X<JN@d+<yAcm
e>B9YK mtqGDPjb88^SDEt/aIH/FpVCXD4a$FPDFbq1@Gy<eki?ii!c^njEeI51K#k9N/J>>lydYGp?5WPBwyWn
FjI*8X I?PQm#Fu8CEJCC9WC:YcJ\*h^HHjk<6e+G=Me@DKRLPKee6HZk#\eC6!HjM/DH+<?1G!y=!>u<nwQ1VA
I#@^8A Q5q^LT$6pe4+mu5@S&AqYa<<WAHVSuuNMQEAVI^pMJ#udWmIjG1ZaP&AS9DuW1*NBG*wmPJEeS=pa<VQ
XBPp5: /pdjGtXldZA&Gh:D?/wlQydF5Z*AH+5YGw&G158ijeGI<G=*apBV%$Pqen:lc/HbGaNXW+?ncIZ!F1uA
dbAS<e SR*uN=B!wu^$>i#5Vm!NMa><<>/\=nWdnXa4CmqkiqN&DA6u!q^cu*9=i\JPi9@%l&DFMdpEpY?j=XJ#
B@k4\+ d=8tc+wE%@jZyL/4@NAqND:SY=PLm1^pIJT?eZ/4>>LT6XX1wRp5^q+iQy?ua$5KD$L/WI!$9IX<?^a<
PP%TS\ *S4/>Z+BbA:1Km!E<at6QJbJTaNWYDa?/%6a:t6cFj!:%SuG>?8?B/*1%d9?L1Rm%caQFK<F\VLu/DTQ
dwYhF^ TVkF<5tMqC?bZXll?=K?YYl@5c==HZXLXJ1$jy&4qTGK5u@MH%Tw9SSn1Z\W*9DiAwSM61uHwkA*%&XS
%t$m*k dE1wk?w+SqQqD$Ve#1=LDk?&^KN85Mn=^Q:TdWRQ4Ib6T*5B9@c6Hcq1umw=Q41mM4h=QA=Lq%q<TC@W
dSu<G< 1\K9RY:en+l\lJkMBX6+EC!FBSI#I5n\Qk&%AJQMyR$ZNcmy=n^541\bnEGS$wl^1nqVl1RYc?VTBql/
9Py:BC &QwR%d\hMdwh:5TGked=aJw+u?tauK9\8qX!cTZTLyaGwe@$m9ThMG!p*qn5jAdhDmDwQ6n5c9EZKcnw
GV=HBY pC?hLDBFp!>l\WiEhaM:#EBB+ZQT5h:IbRX9^/++MliHHS\qcV:EhSuwl!EAYLP*jaey?6R?TpH/&jDA
i%^+wB q:?Z1P$Bj6e!LYeLXL4S*5pnb#*Ww9YLj<Ac\&!RN?^?G&k\51ILCYX:eTXbWw>jSZm?44Y*p#A4KqRt
1#Vu#X +@XBt#ECqatHY#=MK%C\IkRVGq>TwKVZ$ZpKDFMATCCV/EATnJSVM*&1CIF\?!*ey#?GqmeBihT#Y4iW
X^6kFF ^%iNSKFI?m&j+KTbuXn?HCEh!AIKLIT9Tn\#qL!X^p#8*lY:Z8Z#p&CTb<u\uA9NN=wYeLjGclHkAh<+
Rw!+WP VH64X/p1C6i!Ja!$+p=mHt:w8ZR:#LnR+T5SH?K5nn%wnqQPkKk1m15%J+XYNp=WN18IZZ54E&Iy$qty
ZaSA96 W58RJCCA1p%pXip+IWCh<A1*/AnFn$*Y9*yySk%l:kmShK%n%JNdEd?%6SDSVWtMmm#G9KhXP*S@5kL:
+=$WFc /BQmG$<V&>MRcA^+ZZTpaKTKl94GN4ZL6Djt*5h1Qhp:9J=aGCGtE8KAYb+&m:R*T8$XW&%/h*AB1k&/
Hi=@bT !NcIHYS1#dDMmP<:QywJq+AIQL4qILR8pRdE/96=CPNkZmu&:IED?yZLVBCFAQW<I/B!+*WmimcqBi9K
tDJ:Tl 6NFw9dZP>41HyyJD>Q^i6t$>1:Yd19AMGS\8ElV&Mb/K1+KZ5^9jqLlDRw^Wla^MDj*$+9SBbnIqBk5M
ckyK=H KH!$ZBq1R8<XuG8!Pd4tY9#YdSB^4jRtq%d9lq1a>QN4IR$8c1CT^Bil54CPZHbi$TyReGpyC8E^Zly$
5lWqP= p+IjjTmS@1nhLhNNFyweA$EENM*SAdcJ!Ytb6lY/YHm^#qGn+l1$?MWZS?D4+5+wTM9E!AyPSI@iK<GC
j>!&Jb $l#q9>9L=h=:kC%6BCCbNuFDt1T/D<?w^ELB&FKcXI6N?5=K%:upWPHS86bELPWGJG/^#TPG&G8lYnh>
ma#8@! B9?<Jj:/$\P619^M4uXA9yHKT/*wJtwa/5d/L@bMCLbeeD$^JJ@j^?M9?ql<$Lb*peJh*4P%T=5P+$Bp
%nXNt= kRe#I*G+I!P^n%*5QlWc?*I6%\iNQVM#G&c<Dm?cTSbPGc!/\9<Fc>HAnk11P4<NMTPhHuyq/%1p?ahB
MK5p?h y%hH8ePJ9SE?V+pn*<SZk\G6>Z%/X6>mZd:>>Lpk<pWayC?hkYn$>*+5CX=iI?Kih6jh<&!/\S6YaNZ/
y:Z%u9 ^*9TZPTMG@V89I&Ji^98@Iw:hPKqByGKH/4>GZeRB4HX4W5EL?Ya>?^<:$4ddW$VhJ^CYn%1lt#kV/=6
/bLdPP e/MhCF5ME!a8d#kkL/dBkniR$wkhcP\88nQ=ekM+>?5+1d8mJnqMp!\!4/WCFZ<Aka8DXn6#QVuZJ<QI
F&V!8G /@1GP&&lm><CtYa@KR\jG/?X#TKZ1Ba?i6c4nFDijH/HIH=h6GtZGYykAX9:#Y>Gc<H1ME>\TZ9MJ8kK
cnCXE= $d6e5H\E=klkRu?A8ke=5acEHLE%B%ePi\^h@aqC1mhM\?/ICbFB:5c$HhE8%5ai<SR=9mF\V$T/hYQm
@&yXPS ?6&8$Shd1T>q1P$FhEdMpAhnkL*^>c=I1p>lI<jdPXAB%R+D%a=MLDWw&P5:ZXbmHE8I&F5KV5YS:9wu
<=G=5n ZnuSpQ^nB4FdW&5GC8P\d9I&:#aCHCyC6LJk@aaD\DQKlFLYm:>bkSDwhlSNBEapa$jC\%P&6WTl%9Y6
=a@$Au G8iRDEb5X1DLT=AyyIyEnLIy6wbHS=aCJpc4T@X5alAK45imd&/HdVK6QaWkEPC*$$ji:?lMSJ=*>TGZ
BpGZKI D%&Nqi9LV@WQ$>#d#9Bb4A@C\CL:\\5YdNqJ?BRi9nPCXMVecYim%uCqSJe@AaSA\TwCi5+w+ajFJ1L>
FPD8bM QytkKMt9:&IN%F1WjXA=M+YuPHii?tlmeq$X=a5N&B8Xc>W<$*PnEFM?W:QLX#B>V!K:!<b1Wh*k=?AC
d\Mn1P iT1@I:NDN&MN*a@ZV>XVK5X+%wcNFwFu6/HC8pkaVBnBQCPnAC5RkRaQGLDaj@FDYp+?h&?iWSlDRWYV
M61SuC =q^bZly1P%$>pI!qiE<XSaI=h$<ip8TBay<e!pW6+mdyHFNukC#P^+R=T86&Q%d9TPGPMwYMcmNSkpW+
QyJqWn *$km>#MXmp!%#>cV\H=yZ!!@u*p@Ckhn&8w=PDAu*11&6Zjq6/hl<kDZm$Zdn/wDC^=pSp+8kX6GH$QD
t\NNap ?kcuNw=5SG^eqBWLZb@M1h^?6ACny#aZwRyn@&MV1#bpcc+/&WKD\w<ZET:9R$i?T&MQ=<+\ljw$VyeH
hibRNC $=XultTYDY9JlYa&Fmn$W9EWm$Ki\d8\Hkcl:kyWItc1$M1<1c:Y6*b4PuI\QaymwWy5uka\Hyma%tBG
^pXPqL KbN%l!=wldaH^Ft#HbJW#d1$%!F\qB/$t9RJwG<!:u<MG4\MWtJ=/Ju^&LXCCw1>CyZtL44$u/mkK8V^
kDLqj= E4QpGy\ItlS\&>KS9Wl&u5$P!VjtBy>tylpIFqkNMWWWw%$N5!*qE*Ka!J8kEbXa/SYCN4Dm#N8cEn:l
V4Z<91 *4^pH=:HlGN!R5%ByBXT>*9+Y6kZV/jXSH94EBGCGYC#BE%VckEDCn$9p$B9mCk<!>cD>*8*A5+k^ZBC
pAE<RZ Hm<nL&A#&TMp*F5IdR8??4/LP&SERHJEEC=iIQ8uuaahA5kikVky^CHe+!/X=<+V/JqP:kQKSRX6e6RL
mR6hQ! t:F9Yp5a%<dp!ZFYS=MQ>>H=c*AJB:?1q+MZmPRACMAJ&TEJu$+DVpmM@PC!BSAMYtqIlnkk1@lJLCn1
K9NJ+C DhTM$Ql6Q:^WPaGcP@>y4VF8=h$\k?&!t+mZp5w9EmZjFQYjk#a8p65cpy/VY^%BFyn<CAYww6@ck^hZ
jW*cc1 yw86NS5kk?8KlJHiJe/Qq$#ABBP\wm=F#1Hww/%PyGhJFjC^EaBhl=Y$GRq:ydM>EB%lRBhak:c#+R+Q
IJBRna %KtlElyLjteqyWLBJE!&q+jq^\S%QShINn?8mABV*$\4yFP11XWR?MPmDAuFW:6@X4M9SK5ljum&Yu8w
Cy9h#E J*KVYGP1hVkK*^qpMA&Q8d5@%lyK#YXkaYBneXFtnDqhd&Ju5%TVlL*Db+JFMW^J>4qjtcDRST=GTX$1
iitlFb RA<SlYluTK@t*eEMQ>>PdVl4N\H$lm4bemI$nXqM>HBqjmQJ$XFC1B9XB+YAhkq^&HWSTbQ5Hh?RV#WI
-AC8pT 000c645fbc3001202b4 Page 124 of binaries2.zip
F:V<:S 9hT5yVWIC*J:9STK/ebqLcct1nTBEplj<htBR?#?L!WEBJmMyKD>imW&=GZnE/V>t<FW$ntAiXbhbuGa
8\\54k qV\S4NcdnYA1HYICknI1\#I>WLIRtR#ABjN5Rht=L*I1?@K=P=RpV8VG?@L?\k=pu8T8pGC15GDC:cVp
E#unI! \JWGjKp<cE:!*JeCB6V^=/@e9kmI>A8E%cmL#NQDYipe/:S>@bTM#mwG9pTFue=wH#=@wdNRwE+&<BdS
LFY^$/ /Sa^/mcCCmA6+CBb/$jPPJjVi<?EcJS45e=nakaDiR%*KqWR^6NXc55mj1S9^TCauX$^m%=Ku<CS*aMM
thL9!b YG?S&mw=MKk@=QDcQu^6mc:@>XGNjN5>4DT&4^<\SQj+LXEWEKl1l>6bqYc?AN\/EZPp/YttW4M>iTkP
X$PB>D bdPu%:CB\hAG*:ML#jASFV1Yw?qE:85ScIcCqKP\nIimNn1nu$tbVQClC#=Cdw<4TGC8:DiVZaM<8i&l
D%wZEm 1n:\?aT<a>Jdle@#?1$:#kwAhJ9#qb^JBXqLtc6t5XJVRKAJR\kTWNkWc6bi15C!M/lD>^ET1*$PT5@G
*N+\&? ?w*FwDY#NJ%de&$DqC&#YW?BV$<XZehdwawkGNwkwR?<FMQ9MJG+nPw#@KpTJYyl\BPl5AR5aT+>/\c8
\FjL%F ?yWCaN@ZC/!?k@*k8V9!R@yWT&DGZ+LJ>XChi4DTY@\LN<X4:9tB/llRNQ$:d@Hd#N!bCyLbYMACJHy^
ZqVNTN MQXq4d!TJS/HGA$\ICA&8Da?CmwYcekq@MDKqX59qJ9HE!:#Yq\\Rh#GLQR\R6$dDlwCV8MNAA8+Sp$u
SJ!/Ib K+FtmEei8k54D*q6D$XYFcmh&1YAkn56A@+DkN&kqn<ahGTTEh$VGaPie5Cw=S/FhFWXEqATMmYt%%!R
XelRF$ EH11JSPnJ#a$F4&k=AmR6&phC>pN1$58y5ejX!SAD!@NSp#Zh?^#SbHVc+nICm<iqYpiHakiR/QGaIuT
StEaL* >$mI^ItAY+CWXc@*^HBpy>H$yG55b?iwKS9%yLh1$K^u\8RwySLWk/LKy!I4t<X6PylEPdVME/%$:!Q%
SDd?!k =C!<bhYwVHXDLL%R*#W\LXPyhq/Q+Cm\WSumEEKN?Rcp*wMR6Xl#lwnPwZ+*=dbmi=qq=b>T=9iBkn!Y
B*<=S@ 9Li8ZG8DZG9FBnQFeT/6DJlZphydhkYk9y+5h+lS9W!1\M^RE4/DdpCu<^C8dF%Kd:&ZNll+=jMin5!M
GuDL+/ T=YC!mBc15eMXmAd%pAAB6#5h%9Ied#BCP#P=i?&ED>Wk^QpFi9G:PQGFietdeetdijGH!:w9nd+aHKa
n1m:F1 dSHNQ&JciBNcTHGS9>kR?1dnGcc$9mq1%T:GT/6wVc64#WuGiJQST6DWSqDX4q*X#q9R6yLX!n9aV11H
CQtYYB $e&A*k*EJll9c?95$B:B@JLX/l8PBecDaVAEB?dj<Yc@k*eM@itB&9q+l8p+yA:IPewj*p!*E!!kk#Zm
#JMWKm h%eVkLGkC6Lk=5Dm/JB?cB9DAhMn/G+tMLnD<XqFAu9bu6dR=WZbuyPM+<8EdpmFbPmER%KL#Kjbqp:?
a^H^I4 aXY:QaeL=+5VZQ9LLy$*H:\MMMF\$XjSlqaF8*RMS@m$l?=!B8<1B6QTCdwuCFhdS65:S8?/S:@+wQkt
c+aCdQ a1iQn>%Nn@QNn^6caHi*nN>>tiDdu9Dcu+Bk4X$?t@!FhRV$@&:4CPm@c^*l+9yu/\kZ=:>uHiHp@kj4
44k<?j !J@QGj@yBQMQV1^B#:cPeLA<B\*<^ap%B?6#$L<K@iFki\:/X/E@HP#QRQ<1*#<4B@A=/F@bN#lA@^Gc
uQ</#i +^uwZ&Z5b?ZkjA/c<%hw4tik&Z/Jjk/95j&m9kM4=*N+ni%Z/<*=HF=n@SZquM@lNXdR4>DQ+dXjY&a+
=*+TEH kj<b@Due^5d%C\5tJ<h@lH+Y6@$T#jWjwdu@KG*?9!d?iaamIA8IBQm$RRCBZCSA$HQT=4Q?japQld@T
66p\I1 <T<NScC@MST^5RL@\FD$><W@XC^hdE^JcEAp15/Yh8apC8IKJGd&VmVKy5c8V1apaybQF=Xh:J&i>mDc
1w&TI1 9<\IK^iI:b?1IQ^X>Q\qnyYL+@ehTMHJ%P$JB9\LeV<*Yna8:6@6>&KYV5+@>#c8*@e&GeM@@Rd>bX9:
n#jpS9 GTWL@Mil5Q*BWQ+/EBh:EqM:a!eQB^eTR#5VElQVQ:X@M\H?!>GARG#@NJw@V>^j1Yjqa9?n&YZ@A=KW
i^h&n: Le*6jlL%N%V<@QpdITT9LX$5TA^JuB%5LF%I4E$>@wa!:n<HNj?6+S@+4!n:db:@bly@y@RQ?RD+L!hQ
=STTt8 *jKJm=>t$MVW^9SJe@tHTj59wy#?BYu5@$DcH$Wk@Z&hq4<n#eZC>Dj!^J^Mu#n#6<IMQ!q%?pt15a&y
^8R4IV wS&J&e<4#4>h5den<ZlTpWlMLJ&6@+:+j&qu@ljE@?E<e9\*!qC\@q/GAkn/c^pK>1jF@Y?Xwjkb:Mu>
:8aeDY Z^y/?V?9\%JkI<G<F#JWcDdlIEIJFnFT=MyZa<RJF#NYdN=!i$peLYGm^E&SKE5hL&Y1%GKC%11cLGPt
+XKpVu #J&@aM8bLti8*LJ%@ba@Y<FClaeTP$I<Z<qTyYWL1*XNb5=KqchA4WK>ZM%c6ZZd4WP@Y5NGnbe!eh!<
hpB>my Z56Y4e*Wyp#Pi@bEudhk+jl%8=/>i69&>d%*q+GDBl<XDqJRu=GnS49yMd6>pw=nC%?lPtQTtJt#b99P
ldVD+< c/mw=1eH9KSKpm&c5*JKSa\5$/*/cPPt@dJkX\Nk6>Za%4H#:Y*u8t$6ReRmVMVkqyN>D/&Nn/nZ!wtH
%D<^EE :15m>ZCACNEQ*R?:4#5?u:y:/jFDd%^Nd%^%/HYc^RQcXL*i/jMZLS=@8*9u4j>8M9Z$p69PmtP*w=wi
tNV1j6 h$hAak!&DXLMiIP*G%YKCR%=Y:pP1uIK@Pbdi@VST=R?qE5p6P4wLWGMjnRSpbatKIY9GKK5+TduQVX9
cnj:8K *p>XGcK=&ZW/H4$qHn!ba$YZCD6!jTGBLyNAMTSh4$$?:BTij!il/KLYKm\>G:#bjh+i^q^=9lLBND!>
dN6SQk %de?Yq696%Dq#DhNIIMSi5dJlcF$mD$SeXjB!*R?e5HZNL8%LXmyA9FGWKGP9aBJ>FKp?58$$#\=W5uA
<LZ>VP kW/T$mTIXYdYkmhL654FFa=4cl/K4XX=Vld?pYVc&FFG6c^DqE@JBqJhX4Wl\JYb8Y:%!/5bFJqi4ep#
mE+B<T LGbh=c6?Sj1=$ZFS^hE4Su6n/dpKii5q:Ia+VjW#W!^D=wYCKuX64I%:jb&SAH?pn*FISdc4VRH19G9$
H?P?YC BXpYEwpJTW=/CcaJ:158&!%YK&iM/84L>eiHC6PNB+j<e1>6Mq/9a+91cm!X>Z@%Eup>@>%pE%j$T=nS
DEV>j5 S&\a6kRX$JKeIXcp4E?%85lmk9amNQY:4cV:ZS@t=E@e+M51FaLy5>?JH6QZRJu\*h9%nS:Y^9RQJw>4
9*PhmM #ucWuuK8A/I&Fw8JiAG:Z@XiGye5nN?H:u%jpPjh6<Ft4VeQj%FpII/bcF88/c+GpYTjBy/XbePLVXtu
m:LPC! $<Ia=Z@$:aZ8G<NqJ8Y!<jwV\Rwu6%t\qq/i!tPHYbuC*DaHRwTKt1>nJ\tDJ*eSHSM51\QE+@J*ka/V
iHGpG1 Ll$wIkeYjLe@%qk!ZqqK84=G$R=e+\wItt95cLLdju%e>HdJ+^PX?b:qEBdi#He:+bA6nujiFc!*YwWH
XH/KlE :aMTPPMZ><V!<%j*Yjb4q\RF1$FHHXuMu*<<Ep>i*D^+P14eb<&B?TlAQdA&lTe4Lk*m&B9iEny@emLS
G^t%wA /yYcw6kW1Le/$@Z%FKKSCP*<mH>95IHBDI8GI>k5JBKhe+cG/q:W=e/Q<MW*nt>aDq>aiS>TL&$%pPZp
Pqp=tc BT+845&AMWLA%DYbmEwE*JVmqD<4QyZIknj1lw6m1ER5nTlZBhbE9twatl$V\X+RaBQTMF\^pp%Ma^^9
e*!4*j W<R!R4GTR?#n/l*l/CcVEStQ8Ma^$YcjS=Vm!T9^n@jEY=C?$W4IRlKcTKSdImE^Tp^mEp6EbQ4wNtG%
ja+^!L eqKmi$tWJu$yIFa4YepqQ6P64c^+yjA?KV^J&t*Bh@E#lYyT<<TEBT+%mZIjNKT=dSqMhb1TqM^$Sq9i
QaWXQb +ykihTa4c8HAwL$k:$WeTFGtM^t4*tVjEbqMXbaBnhPYke!mDXQ44C#Hy#db#hLZ$T:+iGXcS5l*cR#V
W/Z#p# e>K=km#u!H9=VyF:qN\u96C?>Pi:SP:Bjn8=hEN1QlTR:ILMNW!&#:5n5wpK69^?#DIY%$JtQN%b#H\C
=RmDiu 4wc>b>$^>%LQZ9b:uckqFAw!GaB4a8RFWdHPcdwSJqiI=L!p8a>n%pY#$KTW15^?*$WYED$Vl$cHppwW
dw%j@K 5RCVJ$CtbBBaSLmSm8pFtwDLE69bX5^4pLPdCJpY**W=#qAynFeaZ8Ku:456mN9^tY\hq4e<apwBX^CA
Cm%eTI 9bYWjq@AXl\jtV8YTm=i%4hRyj11XAu?u6$T!#i*j1BblYhVa%iZLhM\<K%C!?NL/9uwI6heQ/EDc/+n
uC&XW< 95Fe#Mk1qXS1>qKRhF1>*RjwqmyL//8*/S!X:ZKn8qK:c+\%eRP%5N?@&$IYAGw^+WeWiPbIGMedC+Xi
*S*bS1 Nc4nT\yblA@q^<h&/!!jeVITicR8ALmt$#KE>:Ete^9MVJaQyNYFZ^ytJP=p\Fm@5e>9ZpNQ1N*RkXeX
Mq&tbM ltT$!%pw6Nj!BL*h/Tm5Z%TdlXlj\BDc98*<CEpXmJ4tKyTS*/C8hK#4?hLAGtVYSE*DbKnDGHA/kNi4
X^B*t$ u4/pci%Dcl@S*+#DbB@R%S6aI@C1y:ta!YmMMdRcG1\uy@LSkM<I@!!Vyli*DZ8#ZDd1:JWk#BIp!=bP
e9L<\* lE#S&CW*%\<1+*I8G>4:@8dp\J6ySQqR^^P?ul^6iH?jbm#jc+M^kZX/mQD^qA5^!*HNhGKI<JY$C&m/
>SVaD* CW%#H1P^+#k&L9Nce&L+tDH/8HE9ytc5c1E9Q%daYBy%^qKmMZh$S6A88GnHQiYqLHWbC?1n8Yb=FDB*
BA#RNj :6cKHE?we5E!Q=q*NRQITRCV6+B==V6l#/@BAWQNui!YGb!F>S>c^ppt&c*HZc58^BwZ&tB$#MK*a!!b
6&+H&D yPh8m%RQilXNK^4jN<+*m\h$BeQ/SC/6cN5AnnNcIh$i91!5SDua!jc*9BddZhNPe:QLYGu8^9+A^YPP
1ZjIYp dcJIY>5k<Im4@jYh@hy>b#B&KWIcn?!uNH>bi%%dJEe!%ABhWL/9Y!:mn*Xj?\jG@tdp<jZA^FH6DDlb
VQ^<ha wTdE>:e@PE#$cD<$h>J?>nL*Qc8VqV<nPpT:C/RAwGPNB!>!AQm?bpS*tdh*D/L%4YaqPFX1Q4%>?+Z6
blW6wt bI*SQtSwQEGKB+KwiFh!&enk%B1HAy8qX=F=m/%NT6B9w&4h>Edd*#C4Hc%X%aK#tK<$BbPh/A=BZk8l
5Ckq$P >hb^$CHTLbtBGt?uqlA<tX1?lZ/6Sb4&$IVa%CYbXL+9pnZ+TAdV\&j^ZdF6P#BE@9!VnyuH6D9V*W*d
u>@*y1 ybC:d1mkG*WHhjGqZ>!<=&jhA$n*#G5!V&PH$8@HhF!PcJ\dh<bSd!&4paFI:/K@?AC\Kqt1*nAjyNR!
eVy$m$ N>#5L6E/u/bu?:pdkG*\<IeD*dRL^y\R\h+S=%<KI$!HVY48**6ZZbPS!MNGGdN&PnmmailNB9?+56!y
5@/5N: /m/y$\9*Q#Lw4:wHMNRBYMClJ8@AJ9\i8=4^tWMZ18/?m&6<*!+BN&5*&4m<6Z&+4R#>\X^@Xwt+VAw@
CCQHME 6\EQk/KC9L+I&VYG=KCE&DWG$:X^#&^\*<%ZWY&B>kWNP546@qVqMKJ4%\AcWD=&R*<#\GD%4c9=w!$F
^pZ@5I FApRmkS>jAwP$QWYMIWIXw&I+K8!C\D5u91D\:kbBYKBB>HyD?BAIN%D!IYj!YqD=QH<CA8F>aMHpDSn
-AKN?a 00050a817ce001202b4 Page 125 of binaries2.zip
CjeX%J hCh@MeKGXNmES6G/bq=an64A/F1A#!an:RIHHKp<pm^$M=nAhAPknZAlFDIj^*uG8+kA/+Ra$:kpQmId
<B!w8T !IHj:S:WHSnMHjtaHab8J!6@wE+nKjAqq5%Dw1/T?IAnGd4nW?mS&uinwCne^>lDjX%FR*P=!TXFnjL4
p*F4#< KRh$kSGnd&DPX5MB19QkTZV&TBc^5kGRCu=Dh6@B1*LNwIPN9?a9&Tq<4l:db8HGkkB8XlnnhpHDhL@E
dtcaEZ F5IFbQhekZqAw%=jk\G8Fi=S!ikADK6=Mk:\B5%\NbtpMVFwb+un%alkZb9+cP!\LLMIliGu1J&ICqT&
$HT^S5 R68a66<JVykJYj9apR$Y$HKR\X+VKX4e5h1mMJ9eS??SA>C:cP5HFENJw#MAcHFkJF=kbjipTCC\5%I#
T+GM/W mJiI$TC!CXdMe*bC8@ktiq@ecV%M*#b5I!#51tu5Kb84Ynq!X6k8kSa$I%\\%nk<lS^+^WeM%DkMe!/u
bdbX?Y ZqFMi^VMCTkc6kA5/hCKtB#C<%hwcI5WTtpw1Kb$bMDb1t8+HGJ<eQV^GWN/FmS$JYTTtkLtGY\8Nyw#
9JbYE< yB@p/FMky<Ayy*CEYH/tH8R:FFtmGdE4CSq!Ab$d8DLeHk\TFlkTbX=TyH&EPDTCPC#1<$uYEwH%MVHW
5dKh@$ &tY+uABc6w*L5<@5#A1IQTVknNYp/@D>$1WaM#ip/Qj$:GBRM#a#<6leGBkk\\DYPB*YCMnt:GM&6p?p
uaXwEj QnDI==La5^!pALM8qm$$DAFT/d6P=^GT<^y86DkY6nb<h4t69Z=RZSH4#F\G@DIM/mep\&S<6uZTTwhh
lp\!?N AZJanPc4&ulTA+eQZ^Z=/$JJAel=LJ59!RkBBmkp#HhRZS6enkZeeTne$!&9uNNi=YFPTdZS>eASZ9#k
4%y\Pm *&AAa^P=\5RuYZhI4dabY^@H/WEnQIJkNtICABqj4yPN^@N\H6&T8\mLTEy%$EatZ<BkViH\>:AVj6Zt
=MdNhP 9dlPu4wnE\D9HBEZE1JEnd1ZhM^hSFSbpptV5YGW/KXKLkMn#%:pBYd^?tD8Dtji^/8RajAk8dmR5!??
>ChRpW QEej:X4wmS?YeStZPb!yhB^D<E$t1N<l8>T+AmeRa#buT<BQW&Rk6?WXbwiV\AKQLRqNhRyH51hZJGPW
^9LlTc ?5KHRaaQ^d^%d$RFIT$46<HPBd!C1:%Zy1XJLtXLP^9H^5^R<6p\bhPFP66X\bLKa\<t>!FRnhka8@!l
/P9hXS J8t4+M4Nd=lLNP@#a+ME$PBGtw%<a&?5lK=VQ$>FY9?J6E5JFWQtK>BjW!I@8W^i:XKb!QAFu1<dG6wS
AN+n8^ 1RD$ni5GKi5pD6d/d1VdKkB/y?9y9acB!ZbIARWJwmlkKd8V?1Bw#MLDANJ$lq1WLR5W1ym%YFtRtiu\
uZ$L4B RSKp#w*9XKYlV4j8G$W\YG#RAJjyFu6I>n8hc9CpK8myPZtGdEuTC@mn9YXTemIWi^y^%^RyX@cc%\\A
Nh%Ru< AD\c5\k?/Y5EeDTyL=JmQTlTZ>C991BJw!^eK%mqZt5#q$Pna1IILtmh&I\ddlaCaG%6*IbiCd1JTtw4
#Le=TG Y/dJ1tabG&FCCt#!N\JJjelq*j^F9qLnwJmmZ<J?p\I?LN#h8PlD&wCj8=tRpwmkZRLH5Wa+%$YCSAd5
l?mtnR 6@!E+DTNJPQW48tJ*Fk89$GVSHXhZB*5uBil:MtmY6<>LAJTG/8+Sp9#%B\A1JKpYFGGC:%PpFPijq5i
!XEm:! pqRBI^utZ^+6TKAl=ZJe!ND5$Ga6@SkAV6YyNS+Pcu8A+\*TLphHbhm6JH#PeRYBHNZZ$A?PJcK&py*+
&?!*@G &Aju%/9puIXanSH8jt^R#Q88S5^E/KmA+:e&EHF9!FjitHcyJ:q1P14pq!\n5%>l#d><9eGJ>iWq$dpA
J%Wy8c id%S<tI/8aAbpt8@$6Gp=$/6QVY/!qph/Vuq8<pMj^l5D9XV@TLBN\5iCqbl8F%p!KT6SI5nbJeadBe@
WZDpBw QMDyBXq5<6SZ!iL<pVqN<RY<+A6ZheVYLeSt\Y619Kpt<VeN*%M^cVb>M/KjKhljM:@KJqjh8bQZ8Km9
m+#H5X J*QHpX8RD>!kXytpyl4*klu!55IN6MPhp6aI%:PHik>FSW1NG:VZGDAulV!#nGT+F9AiC=qb/qJim9ad
$Yhu*B D^p8>9$EXqkQGcV$LeaemKZ5Q4\K!y>4R6&yV/F=Rh6>taM4Z4%bIt:S\*6>Wnpu#<iQCbDhjB<qlC89
X@&4%= LA4/RPb\LBY%dj<hpZR!EmHt?#5MPJd559AaLw9C6kk<$8AWGmQVq:E*eY@ii<Sb<lRhKGS!kbMp9mC?
VYBc!a $TInkSEn=eQ$Vec&q>chqLu5#5XLNuZENQcI%phS*I%t6aSF8?#Q+SQmIIlyib&$SQc>=b%wC4*@\P8I
*:H<QM *4BI<N&R=6&R@bQ<&q\w$yiyV#6kKkLYMwK?*P8k1F:h!cFLihtwK4pL$tR$nDBLVG<4^Z&eXK=45p<4
Pa^Y=i qb/4?Pm:MSAcB&\qNde*bImHJI=JwDl\NtJM*MBd1q6X9APH:#+kVVcu*MP5+J4IMAi$DTTyL?=Ep#\Z
c8LQMM LY*<hV@I9:nlJalhKS1ZcMZm11:m&A@:jFW%B1%mpKKJ=Sy$Aa99FjjT*aRi#1/I6edTWE/?hY$CAYNj
a&e1QB GeA!9494>4L:B@IZ\dkDd>%MeMWn6h=%$D6p5k5Ta:$5WX&#?HkjNcuJ1ZBG?*Z8\>jZH1*VFRlZ6hcZ
4!Kcjb A@JiE\=akHB\j$?&Lp<>ybkG@##G!1WVt>TLK6EXd<*wPKq*YjT+PZ+auBM:J>1YuC8PniM%Vdc%K$lN
MHtjPR VV<<ATTmB4#B+B#kK:^l#T5J?t$S?Xnje4S#Yup\TXEj8lAiA<SV*QwPp=i>Ru@wbaa<c15=WjwE>=hd
u$9ly= hCbb9>F8cTn^1Eaa16Z8d#hTFGP>=>59=ZqN*CEB/@&Nd4*41D#WDG%hnPI/?9&JK$8WX=ypbVi%R<Rh
J9?XY1 +X6@!CA+yaB^mX1+8<!9S$iS^ejyHEeV#Wi49L&Su*8>PH6QBk+nT*49yI:5ek<1^++uQl:ddiJLZ*ei
W@EYqu yBE9cy9>&KJMjB$ZmhTFRFFaIbHXHyl%B!kQw&kP5$L<AtmuA#VTcYVDDbTXN6cFpyZSJ?jd9QkRWy^C
X&IKYl q@w6/9VD4j\a&yWS*k<5ubnPP+a5Q1c5EbeM\6n!pIP5hJcC$I$5#48c$5AM8LpW&yH$phK$$iL/%Lt1
w6<tP$ >KFH?6P$NPG^?au%%jDGMawtucCl<yl&BLQC%cWSlynP@jZ1R=P/pPX&P1XKcd!SWy^S/@\QbZpD:d*#
Jj@bMC yeB8*y4y+KKiMM^!/hGi$e*^XabcKb8!pwhG!d%lBJNMF/upWjTCWy:t@eJWPwt$$9T<5K>Vc>4VW1AF
>88Q6& !iB>ZdK!ET6E&weMKWCN6P6KcN65B?*\tp>/1W+nuX/P=eeCPyteDPuJ8>9eMM&qk/8y5w8yA&BcS5YC
?\@Y8X >W#t&<Atudt56p?%eM9q<EM%Xl8bI$94d#e?$EqXq+SuJN&Xn8nq4D+$lPM5E@a8$^<>E9&a4y%jCa>6
?:1%e: j>6eCHhhb6Y=VS<&%?/Z8V?Z?aF+np=*Mk\&I>S+:S*>1E^=Q4%T!cS:%h8#<pQ=Lb1<up^A^wlL=8FR
Fh1anG #69k4FL5#MPiY5IjE+iEtRVGe\>YGYZhP=@wmm$u$l:an=mhWq@+XI$in&Z!XYYGl+!<R/RdHT=bd@jK
cL?i*k GQ=A5Hm+PTj=dRj8yMDu?GNt*dnpS5GDVidmZWcy=L=pdpFtZ/:i=D^6!ciH+JL>T16Q!&<+QZdkDtyj
C^BJy/ :DSL+$\mYI=L#1@SE/$jtPVmJSaRFnWT?X?XHy>/w&*CFT^><B:NPF^?1V:X!Zm?c=<m%d\k%X/5p*H=
n:hWQ1 nu^PG4u5R<pI9Hdu@XVdA?qHP1PP\++na4mN8@416^t:I!YdHchPLH%/G56P?8:e8Q8N4?TKyDHLM66P
Jc!yyw \w\uydS1+G=1R4i!/CRt>cl9yA\@41Xt<y9piKM@ji@:eHYNWiNmI1QBBRm6t#YL<BC8lal5^JBAc4dl
D@/cum lA>5Plc*i*Lnl\=6^YwCM^XyE/T&a=heQlm!y5n5^JwM1+B^&*X8FWQWBNDE<=IcDFyijwe*F<?^GBdt
!FFeb< WR1Pb=tcAB/\yt@KmC?kN6Cbwp/+TcuJ#bWl\k@K?<$nk@\d5GH+^Xh&=#WweDil*86X1TedDlD=hEtb
L<:y<b wMPtl@JT>Mp/J1?/<bQGDJ95KH8M/ZqRFMkjaqtbllby%/yc8a!+^nab<TyGLnQ1V9l1b&9dPhAX$QtK
cp9P*> ee*V^E5^Lm!?/>Bb6:ll\CJ?<@/#jZW/lSE:#>/Z#TZ*StdcyYP*H^tj46WeiecGnnq+Et94qCi%>*q/
$aQcFS pc?4=CytcF^iJmD\1q\eu*m&cZ869aRqN>l1H:%E*1w<@JEa\H$p<!I1D=E??&6QhV$#wnB6GMMbSStb
Fw^>4X #%$b++yI:19T$yE:Yq6NRBphWt=?hdu6\ZJyPb&PGH5VQDypIjYpW*=>C%%9bE$>DWQkNnMV!!bqh#AB
P!BhDF :D/QZX5JubVDZBYDNN65C#I:HF$N6kkciAadb/uIG^KGM4J*>!W^wWNXH$a&LhmLSqQuJ16aEA^JPCJ!
NjV<5m Q=M#upw%RVaPcch&T48w+wky%88$bw\iwBhlFI%A$SR%PNJ=FW&Wwa@qmFh5H4R&SFZI*hFY4IyWNqqD
b=>Cwy TT$N#Jwpq*QNGq$YpFlkSLaJK4$qM6Dk\AweXELBy!edpBjKbb>96NZF=GTPQ%%+ldtSLqS*WV9&a&dp
eSu<4l #ZynPVIy@G4^Sb:IZDi#$WbDX>uqpY>^I8Y8y%=VLdY^<N^I<81KNQ=IT\tR*IN%qy*!t/4?X<<k8R>X
t?DGKF Qi<9q1LwJlcKDn$#F$E+L/*G5=YER@VW9*$Rn#Yyun?Q%bEGcXSZKFNa?#ewJp</Fh8PPiYZ%XG?Ku=X
D&K\hM i6<yQ+hR9/dE!EmY*Fkm!:5pIDAKj8E>=S<yY&4XYpehV?Ec=ua%FZ@R^Kb$EIlhXe^lS&SY#Knm6ISI
*9X!w^ l86FDLWT8h5WdITQ+L>Lb^YFKXyl<lY@Q#YRWRyW/lZjlMlTX^$u^SbaNeVt=TR>\N5/HlPp<:/k1Z4>
B=uGk? IpA^m/FbKQaPpV8:6\tSN=mR&NZHkyDR%ehB5Bqt^T5pBiV=aLH\K4HJqcklF5IeXi&>N*cTW*5S?R:d
:>kjqi C^XcBKi>jL$4B9dI:mR=8wi4&lWCeeY=/\+HB&ljA\9Rlhi/^h6qtB+LL>wHkk>DqdPqKA%YDdmHl>Yi
:p+!#6 yikkVyQmZmJqVHHWuAYjZTFIItFEF\Q!Kb??RClBaL+winmPL\5?hFeRNZlpN=tQk$>w6*MBHB\lqhTk
a1&nkk HuRH4CCM\SaSBa9ZcM>my8mLGA#b@yLiq+HIum8$bWHF&\wq*:yYQ?MmihXRZ4!K^weFVJHA%anSm1IY
y=%Lbw amnQ$AT^RmY*mp%wbtIW94JHFM4iw+Tjm5htPXXm/^tmid<id?HQk5#ind6GtD%uGdEuBn8aLQ/CjI+?
yJQNwX 51cTS=#4peD+!DH/dJqjEJd@Bb\IJ=u5@XRy?d1/j5>+YElCjc9dy$QhaQ\RhD<FpcAS<M<5?G:&ndRB
iXL\%u ZR8+jldYwbZbp^\Y>XN+K%jtqVEbuRdHiPR8%IJuu#mH!NGI<lHj9FjCN^#m^mGtEQFL^tA!FC<la1hm
wZYZM? iBNXy<eqblpHLATG?GGRYeWb>!TFpH6w%e4e%m/&1$6ntByMbDRD>mX8>Tu!\LILL1Ze$#B/LJlDjR@w
Nw=8HY k4JVTTm>FGH/Vaw+*N/q1>&nbKk\&4B+iL*Q%nFQ1/W#:lyGI55it*nQ>5JW5CZX$KJ>ItdtAX9wlln^
WK1=@y C>+<6SlVqA^6B%5JA%RBScpE$pLjJC:D!>m^:#d<yn#:+ASPIc^$m1>K^GpL?PSD$iVWA:w&BTEBu1la
-Ai>HV 000eb857903001202b4 Page 126 of binaries2.zip
Ny9pj8 m6<TcRI6T>Fb^bnu5#C@8/ZRqKJGauDEK:aKpyLKA6P8epWZ<huFVW!5anAD+ad\\LVL<yhVuj%T^?tW
WlCj$D JZhJF#T&FLP\F%BReK$FbPhhk#C8%:?Vme4F^@1im:S^ji<GmENmAylE<ZR6lciM!4D#8byk/yh6\9K%
Ga\h<G YR%!T9HDtIT=cRyC%B^ndm#lDZTy@XFLQ^N^TV9cH6H+VVXGC8#S&/>jMj6iH*#8wR>#1XSqdy*:qD\L
ewjti@ j@bCJ=&b+m\=j4blRh*!ZwRPC>!6dqhl%bR!1ja<=R4RetaGtJQQSqNkp8y1j8G*4h/FC?+L5Tt%QGJ4
M<FH9N wC^iWVhch/W=y\L1H4TGSS?nt1<8B&@C*EyWdnQ1qRZ6>T/MH:L*#K%<>bKP4!1<%iiYjjY%I/iWI%JN
iL&FyR !/hj>XnAy\6pAH1@KDPi^k+RL&p8#aLGE=q%R@NkA1aII^IFDPi9WdE5W6PM=eVNBLD%%B?6qdm?8tb\
lh:L>Z cbFy\Z1uE9aF9XS=G\c*e5JwCwlTNTSdd^n/?QuIYdXjDVBweJNFDnuV<*t$VV=ew:J>DT:HlaQRQNIc
11*Ch5 XX4DW#XD+XWJn>l*#TZB%Ky1pu4PLh4Qa:5?:>%>bt?>iaQK%D#LDX6pVWp4yZ6<QFdXAlj\?$6Nm$Cq
Pmu>SR C=uljXAqC#5&1mEdep\l/mM@@P=B/ScMn^Pi:?dY<c6KbFQ9LGHH$>kKGQ%hE^hZECdPDi?6Hnm8>Pt$
Mc%GLX lI4$/V>ZP*Mp>HQ?@/n:!@DIq8^1GE\^M#M#M#M#M#M#qJmbYT1yyBI#M#NVmbty^C!XYFP*&?%^&**j
<9LWJw >>1ib?cd<!M#M9K5\B&^h/#M=/!=N+Y*HSTZNNatHp1J1C1SPFB%VnkQJDd45B\%GP<\Wa9V>a5e!DDu
N@=tYp HE\SLju5hBZ&kVMRwG#q*WWD9BEWF94>8b4<y>YLTL@:#hhyNR6eNh>V?pEI<wM>ZkX4=TQXXKNCE@PF
*yM/l& :\ZmJZ&i>Yk:d!VB!P8nlClPpndVL>1%\:6D6kNHaC^LV<dLE@!unwSkQMm#aJPH>hSVJRhBIN=ZVw1E
QC!LA= aQc=C^tID=#/\@$bhcZWEh^h81N5WFbwQ/18^+<*eN^eP$L:L>1M#=c?J48cmAWWwSWN>^>Ldd!8^^Z4
m=*<Y4 dSu&cb/pt9hShEbZ4p?+uHt8H88C4SiCBiVED=%jYuj:8HCCZJd=uW/#utpHL%\ycbMMdXN8p$tY6R#b
/ue6/q CpqVMC6IEVSyuI4j94:db/Hhht15QP9SZ>lYE+B5:%bA:d<i:D!y=h>weKJ5P!:Q@$^Pqc^QEc8cZGhJ
DRQp4d y\?Q9LiuwjJT6#lb4R<A@4Y=/JK1S6lQk*QqSND=@wZ/I=?Z#!FB4%i%L!>&9TE&w!&HB:a+1LudbdCd
XdKyc: YL\Rb:A+1w?WFqVR&bwK=R!*DLKm@LIElw^<#c!+dSlj&cT*9/N+J=M6L#yhKk1@Ln^SSI>*@yd6:EjJ
^c*%bc Qq5ZCmeZTDpdwTCI!TIdJB<d#G5dw%/enE<T#%e+JGqRAGMGbquZAkkXe$cB<wARTWi9eX48*4q\9#Hj
u5$w^\ 1SQp/R=@P+Tk!pH9@HBiCFSHQ!1X!#B=DGRjLmMyKW%p=m*85&8!aFuKDVyCeH+:!#V9?t%4k*:JYlF*
:Pb^RP <lilZmaRR!bRSZyRH#Gl>Se&kF/Z#XIdw*4Q/mI!D%*icu<Equb5XtaNhFe*<Nj1BeWBZVy/c*b?Y4w?
&H\LjI /nb?+&aSbw5P#*Emq!*?=EMS=qT^T5Y&MS@?8eGI4QRtLm*5F:jPm5uYRp\Bt5IGuXl8=#ek::tcM=#!
mN:eDl ZwpRXY8lHVE\t/Z&8^ylFJ:k1QjA/*!W89:5+$$E#nZt>1N1u1=mWQaB+c9?@FPi&&%/+Xn/q\N/qQ/P
Ah*NW& emh/qp=BH+W<Z1>PZuhJ/LQi#CR^HuIGZQ&py%ueE&&CXV@e6ZGkP:aYZH=8F8eAueIYXuQ8#M>cpBhS
QQ$m16 q=jlT48iXqYBm5Ti%XcaTD+pJL%wd:4W&WSaE/1SkY*+P\yBb/i^*6FPX>@i*RN$EDwa#>%MTGtW6y*K
*iP/LI 1IJ&qX8Sk^nY/NnGC1j<EI8G4Kw8GWZ^T85R:/W8F$Z8N<KYnEDk*hbp\*9W*L15@VDS?<#i6Y>TB@=^
JIc#Tk ?#An\Z$M5NDMPpe!IX4CCShD1^PTJyi\J#LShXEmneDR9Sm$/*jmI4eqa\<e*GVNPJ\CYaweldbCP^Jn
!KNL#i wnXeIm@6b:mkw:&m6b*JRGm>TP=\65%6ua6Vy4&$kpqbV!*RLldjYA8beP8LTM*aaW%bcIyclJ@yaL/A
>GMZw4 #C&EdqkQV$/JF%d*VNbI9@K$bFdCk9kE:S\k*BDBT=d&K*b!+m=NH%#GJGXuDbJ#PbuSGtFDp$T&/&L$
$yD5jS EC5^mY=KH5P^lP#YDcbIH/5QD^:Kt::!&j/W4SWE9SaEFb&qqG!PVk^AKtmIhq&Wj\CdMe!kYpX6Sh^p
1bit*b Q@MHkVXlEw&h&wkb#+by#EK6m/ww:>X4KdV>$Vp6MEuR$MFVC\n4J\^K9F:HQJ/D1\IVbIKXXE1c:Rmb
/l^yR\ iByZY1YZlc1T4<PGp/4Ga!KH#t8X6l&YNS&8E+Q>#9WLSJM6BKCtlKp1QpW#4Wddn@4blmqdN\TIkc*9
/cW/tS F$IdT@+/#/JSt$i4hCKlwwiQ15eiN*/L!#WRNaeH/lYc$mDJ&cE9#n9e\:TeZTYaH<FY*18t*CW!N#k=
MW>Wip ZME#6!MKCwkA$X4E^TZDBM#kR#dm?9lLXKyZuYd!GQhQSA?V$+\IFtaZa!N&LMyJ*P:&H/1K<A\S44iS
m9:chG &HyZ/%I8ZHDTe5HH#BLJ1KL!jYZDA9cTY+Ryq+Pj9%uJCm1Hy\\Ql9wX4KpA?mC1QHp\Lb9KNKAMGXVP
Cdcty* S:Rk\&WQw:pVNWklB6\tPIpp@AdjdS9CC<%X$S+@=Kw5iJ6F$?T5Eh^d@AbYX5<qlnlK6e1VYq8PA*1d
X=STie :CnS6F/$SPK58H?4CklZD:WEI%VR>FBYlF+M58SVFh$ju9j1YdSbGn\ij15Q9NGKYV*NkFKH$9PXcZJi
@!?!kT Fp9X$wXdFcWupdcY&p#XGNmu/qIjKpyj=wZpX+YmWZPLme1PYYtCp/^Fq=NYECNjI8MdQanyI8SeeXRG
NTt$b/ S#RHI>RLm>ALJR8jNa6YH1\SP1k5H=KI5GS5tZSaY4XFidZP8FFdGGiPc@1/?615bbdXB?a$IM6aZ\p:
Vkm&+& ^Kc%GGXHqYpmHL\*EH!$uy1#Y8@A+<a=?^R%^a1cmJWb^ekaCGa<j&nC+QZ!ubFA*VhC8>SI8>e!DK%M
ZE>*Ca 8/t<Va<KVFXTiVJyjABI!c^i<*XPC:I>Fc+^%1NBA=YPepFypc>%A%T=8yCcXLyZ1%BX^GS*PWX%8ilk
eHiWlc 8eq#@eFu9dEqnY/wW4Ek5iE1GZWi!NXE6*K4lY=ma=R6^Lh!4hR!qNB!4i58NQ8HH6#eZQJ4E+nZWyM6
5Lq+6b tRhS!<ReH++9NjW\G1Mkqq=#>Xj1pjNAMi9Wnt>586Ka1#GhXE^WP4:!C&<5%Rh5Etycp8mRP<aZ+/C?
N#VYhK c9yRI=PBm*DHW=+ymW#bZ:6++5Z+%QHIcwKWT9wuCDVy%WN@/IFXkK$aGbBnlWWwcHhXpju?/1ppaNiy
&DbKM> IQNkdD\+\T9>qaHHqRN:P=FF8lYGMK>CI=NIy#d\W?w5G*9wBDLVNhW*Eaa\WGZl9nH%Mq@wF8C5mGjI
>8kM^Z 8Vb%H:y=9<&PDS=ldqS4GZ1E%/bJRMhL\KiCK=:AtX<jR8AttF%KqA&nStp$RII%Sm>Qa\kCNV6/6V/V
=?Clb/ 6q=BdS!cjJAt9bQ1b#\VCj&5#pSMqFnM&K=4ymqMtl%=6<<JHnk$yS/G9hbW6qbXblcHG^dHwh$4pS?h
mPdX<5 &Hn/GYSNjRA8bA:1tI4FiZDhMtN9emRCh:Bmj@CenwQEqK$Y*MNd?y%dqR^4#WT6DC\Hc<XDIpSRAXRp
?T$VQw %YmJ&+C5uE6j6%up!?Gq\SG<EJCVRm1^c$=6=bG<%<@c^Ny>5S1lQj&F?^@&#EXR!><JCXm5!EEjH4Td
6wP6CK LIFLkRJ?S=Ta1N6kERb<Q$AjhYWL=54V*BikH4Q#=kYkPBMNZ!!/E*<&&LXG#1RNwJnkpVi\B=y\W^C+
Yy^p#y qYyZe+AnKkA=wkdKuRjtakMuMIaT/wQq=PwBqMXj1Pm\1a/Aq9DKH4P4%d/>!HTYTuM%T#TFWSeRGXuu
?JjDWB b=94PDVj%kM=i!uL<VN+iS<1Qc/FBc<%qaN/WAG=N%8%wkbRAkXXB?<PYSJEqRta^%cYLb%cQX1T^=%\
=5q>b5 =*/9ZD!6<#1uDeDIbn>l4!ddaRq$G<5ZnVNBLm^ClCCVimmXn#TkC#<&BAy$BF\AkC+ATCFm6=6++SQ$
Ync?Ry ^cw\:IGQck%Yc$DDeYbcc/iiM!YG6chhc4\+A+cVH9Xl&^Qq=!Q=>9#N<Qw\HaJmCnZALa6itI9!t+bm
^B/8mR :mQbdd#el^&/*YFuwie\!NCZNW&Q1CZ%!ukBeJd+RT6lG1E4CkD+YV9\^\BP%MC:XAi^Kn9:INJ4SDQ>
cDAE#C qec\%/91%TKkXpacB\ayl+9y9dJ?+Y/S++9*:C&!DZ&&A<HaVc&GjR%@TQ+R!m$B/G6SNc$y*SLG^GmW
DTkDDE >C\w#1nttq%*c@&VFh9tCaiQ!W&+C4CnB\ApGAAT>GV+Y/C4tP$YZy#WI%:e!pWWiZdaG+EB$hZ9iZKt
PZNm&& 1CZ1dIBF8^nCHkySZw*y/8ZL%9ttTn/XX4ZyVw9V1*ZdjJC%NcT*%<*h=&k9hX*pCpYYl/pq@>XJGj*n
yKRyBL !wSena\eA$l1BYmE>%Cj>hC8LDSD\Y4w@B=DCES9Xn9:wYZ/<+ye#e/BIN9<%5/B8DGa@d9&MB:&cyW*
q88SaP VeWC//y&l9$*my*a4+/t#MKNj5ZGdi6?J&+KhI:jPA^VPB%n8$qm?^c#n8*%9qP=uN6Qt$W*BKC4FcC?
NX4Jnc @JKd44XN=:pKi*KbYyGlL>EMMDLjmuIq\LYcjnbk%F4^WPD<Lut%y1n:uSA9ddu\+@%YP:<%M1i$Eq^4
@j=*ca BM!^W*h#jd?*BZ=IAMaF#<QNAaK</Yj9^Wd%L=<:AT>>5*/*LeSILK:p4<nHN@NRN+9bu59uCiCVG8FZ
TPYCIb AVRMt=SQScbZ@DktCRw+<WJdE/qG#SyYyd%++WV8n$9*^W9bRR4PBIR65*Q&Y/Luwy&19*^HCwM8WV*h
6H\/I9 5Le<c:L:L*i4t=R8D8Zw1+>i+MXi$H@86G<bM1m+?ij6hJ<b%mD\4!SGCCH@aAqIj^I89EI:4!X\=<<K
<T<S$= @BLJ5KaPwmpc4Cp1n@Z4jGw/>H6M=+nRTSy&&MZ>Xd/CM>DDSV!cJRHB%i4DGRNbQd$9>BiZC9WKFj8B
Fbn!C# TG>INhdeyMq5$=HB8LFD=yu8CMR>LN%?QEWwuQTyi%Red+L/X+bGd$EFMLYZp>RI5B%qA:t\umyLA\:4
/t1QN= neeZG*w%X:?Zi\68>&Xy9L\qb94iC8aN?p^5Y>1i!/<\d/1ci>%Wd*E!i>/WF#?PZA#$$c:*E^R1wCqm
9ZVn*B *</\9ApmZ>pp#J@WjApXyA!cNud$nYwEdtJu6L6D9G6/:N^M#S5pCi\udYnad=WCjcAJ+/8V@I>M*nI+
DZt<iR I+AG?=&ClA\hSWES?@tJpmYG?ujbmXAE5YiQk/M<te5X1NP6F>e<iY$IEPIw:&?VSA8X/Xjp$EnERl4T
SDS+W+ K>hw&w#=Jjpl\MN:X/<=HiEJ+Cu&w@C\R*q^ITuuXPwXy$M=F^KQ9FLNwN&FY&\YZ<HClp#16Y!Z9MYK
Zk#X4F F&&chi!YZpPHD%*chbLJFMEP&#@4lR^ucP:^+ip^WCPLKAQDCL*w5jhGI#de^bLnS\@195w&c*FP$^@P
/+96Pa uTl::M5Y#qQ%qX$kS=aY1Xn5Rh&E%iqY&6tRi^$/u*X5PZ^b@+CACB%w&:\mlNt<Z*I/9L*/hW^PkVbQ
-AW!eN 0003b66ccdf001202b4 Page 127 of binaries2.zip
LhP\bG n=<d<hFQRpGeMIyl\\Y9p$/n\FmCQCaD\$a5eV#Tq&9@Db9#Phm!WZF=L9d88!LdGHPleFL5iA6\WkLq
RZ%8P& ?b/Rwm+YiN?MD&ED=<VeW%*dyVHpac&pa9<RI9BP9&kMk^X!hIjyHjW$L:lSlu1lFdH<bE4wQ86MpSnJ
9mpXMS &9jAZJ&ujK1/q+B<j1whH$TKE>1ajG1:4>D4:AWNhyDn!6@K1Mju9yEjCFikXB>#\:6pIawWA9wFKiV:
L>!CYA iFNEd$S+j&CFSi1ky^bE+b=%J6c4QpbHWtL\@/k:VTcBkBPPim=XcFA8/ZYEL1AR9Pm5pb^V#ccT41!j
u*Gn#$ TK4LQRjqaCCM<PnuE&YKWtJnn4Vm#S115?/$#Ky5wE>8*/?Zj!^^KH#u:$dF&Sd1Z4!Xj1Wch+&CAIXL
Ibc%*e ckHMVk*C!Yk6?ibb61wPN6h&qe15&$+$41E^<cC@#dNN^aQ$wM5>cI6^p=bS6uLYqea8kY?yVdq+Wny$
9NiRqn Rd=V#TEKQleY\EKR#:1/I4K5cjInli#KpJX&q+h+ZNkTtu4BQ?b/hE4aL5#4eP6qe9ALJQDT8m*qp?c=
+cjih@ @A+XpA=Q>BRhC4T<6>%^hQPyydP^lZ64cY!4h#$@AuQuNK&H#+&yPQ6=pB/HE:WWqMD/an5Tld:Ga*^l
Rhk4<* %WwwSAAYnTy5p\:$=Me!%@E1GSeW#KNWJ:pRJWyAB//Ey=6\4lLmS4@y9JIun/lDdGCmFEVP%E>lTZ#!
#NEqHw I+nidH/ZH58RR9JI&Yn>cByuGdLXVTTNR9XMNW9QthCVyBd%d^Kw<cduaheM!RKm?dyZ8Puk?>%14i4%
nQI@h/ wkwp<Z$bZQnETkCY<>j$IE>y<pcMEmy1b8Y/&5bLhWW%5:&yt<Dh*j&ZtS<%Sc@iyZ!e8kRYmNAXqIkk
9NTp4d #ciXNL+61+@9E^CP6X?$q4>5j^p5eS9wKq>H$>/kF^4F/k5b^iBSS#hlP1lPYMybS+YVCP<::$wdB\@R
GA69=y 5XRpw!JGW!:9^epINaSt8$5Xd8:::pMYMuZ+qQwL>H$R=QGLa>NL/^j\*dZkYI?DCHQplVWQ1A+N6QLT
A!BE?E cYIujCqBq%!9m>ALh9Mq*%mnS$Knd+E$\5WdK/AEQtiME9$iVik45qR$$&ATQTGkG:m<NI:Z>hmSQ=pb
!4t9NQ CJG?i$F%+<eM1piP>81c\Z9^en&SIT9MTdAbQpePAbeKRiey\>NnSWTKJ$MSH<Rtn55#\K$Mj?T=QQwn
5%Z<wd Bd/$pky?=4Y#pFI%A!Zi4!Ma\<\n$aB=%uBTQ8^J6@GD%@pGLK+N/YV>nI1HFtulkl<p>VVmRu+$JB\n
tj&?nd \TVBn5?wlpd4GIRZSSEbna*X9INl<yDDjN/tAA$mR1#XA<uN9:XqI1wZVaY%pwYC=n/AqbdJL!MGBi&n
n5WYJq tj9+wwATTCyK&bBW4+^FTJXR5K5dICh<jahXZE%@=JtnB8:JqlkpCbNQR^$^I?++9wIjh\B/^Im1Gewp
+pbPJ1 !acK$&cSj6ejQ@&<#R9>VwSVhJw+y/$pVeXHY>laYIedJTXJbWbj/J1W1F^8IF*G^qiIMyau!^ZNb$=b
n&eA5B pJF<Y$l$Q\5\MYaNy=^q4#6a!b^FFnPnm*Qk5/aRVe<VldN^nqH!wlPQFlMwaR%LXtp*p/\R5/%c!DFR
Qc@ML> >#LSyhy$4ZKdc>QA96M18*AwRRQ/@pQTqKJeNK*&^=SEy$dekc=QaVunKikk&RbC1bqYQL^u9WSLa&jk
dtI%d+ #ZRq6ZN6Yj8Eu5&Fj:Z1bK*/&1J?lb^>=iJcy*ctm<#blWh#e*t9eNB%KA#JW?u<CekQ1%m?p1qRtJC<
Cu5*EB pS^4!ClK1G\%yJqb6Y9hH89BGkuucuWqcpwliY9MnuJQ8RRiCh5L1yGtqMa8ZK<4&S1&1td$+XaNd#5h
yZGV?8 B4c!+8Z1#1*ZCdt1Cikp+4n<TBt@*W5!EZ>N8G*!eWkbi#9RNw5\I5k\!y^n8:S+y1PIbl$iVhRHhL&t
::kPli CM+6uy?&DG:qQbmb9>a/VPSy=CtHNJLinT6pdK@PaEw%$TVY*<AeSTt4TnMPJVaChaKqaLpmGIlRIwCR
E*N^VW eaX^SRMdlXLXwpnME\<?Gu+!5wW+Zu%JiwawYC:P%B>*a!m4am%J/d<*5BcIywp#t%^N/6K\MXBwRLee
4<Ntm? dq*dLK4\w4\tE^%bkec!GA?nQbIL/YNkVIe/1lBcSn=S$PK1FaI6C1MhYPKjt:ID^/&HB4KpBPuq^TY:
VHI:Zk b#TwR+b4ZJq:w1JV!N/&9S>J^5HLyZXVCkH4H#tG%Ewm*a58bewb\^SnCi$NF\EC!Y:k%CjyC9pW!FR>
@NHbCu kmdMSRXtSAX!#&WbKDW>M1bVh&nT6/Xd6&*ju6J<Led4!Xq=%dHQNp6k1*\I6elRn%*RqFE1BQCa=5d<
%:iCwB >pb4=k?cRh\KynN:?MIkWic4P:uRkQi!@4/dm=$&A/edjFKNB*j8GP<KnVPieQ=atI\WVTEue1<iM/mD
S6eMH> 4dFZHFPJwAkM#Plj<D!C1ID*p9:HQHImWw^\atcw\iin!w&&S&>h\RnIQp^K&FH<jFj<=Qal@DbTEZiC
R9FAVl #m4@d9l=hKIA\b#i<+J^M?qdH+cV4ZDj9Mc&E6dYA$TiEMKCy4c89b>h*d*YF\/P=a#^$Lp1?YBah*\6
#Xmt<W ?m%jJB!9SMu/1$K<CN5>NJIX#?nG!i<@p9J1/l+XwRFA!Be\kdyIJ#PW\AEkmD4c/c$ajEM<ZhmyG/%*
SK9jc8 SabW>&mCn#PRGbeF>9bjV%9QMq#Ibe?S#CtF?/+SJdTqcnj6KQd%/WS8eTT?Z6e/:k:w@\DLdVpIFEc=
/d^q5: 9+HD9!j@=Tm#Zb>/EP>/k6&>!+qw5hJHWGwl@GQqFRKmREweYVT/k:#TAiZ68la8wkkJ/WjL\!RRkXtw
w<#D%A QV\EQPySRKYXiF\$djep:W^^?hGp6j$$>GP^6j4p?TK\I*KQ:Fd*DPWm:F^SLi9C1T>R^Yqn6AHRNjj$
*e4N+e ^Pu/^GlQ>MGR#i&\:DthQVXmni8JheRnEj=^4nk\wjpJR?in:hMBtdWXwB?5q=RmYFH@B*IR9C!X/Zl4
b@^=?B /VA$jSREI4mk+N=^Fii6IQSPcc@k&jDk/S66?VQalQ$\+@n/^A*5VG>V:ikm4Y=#LSdM&h+m+p4u>Tda
KNyHHi yQkRnYY#4GE*+tBZ@%^PjQ>DdD:pPiRTHYAN\A#ISaYAnlm=#ELcyWR*b%i6CtJT&AMcnac!/wGKW^i%
Z:kIi< wq$KkZ@cChp%SEYR8H:cERiPG\ethIRJAiWB^EEKT5DM*DaBn<E1*wFh4<Kh!he+?cPj@aC6@RYH=I&b
uPyX9p wD%$+:hIa+dJqNKatA\9?^Md<a&iK5^STH!#Jk5^R96h$Z\NRL#4bAA^HhS!5TEB%1lD!k$VRHy>%IeT
!HeaSK m1nb1$6wAaw!6a^>ALwG$EG#K\&6/%!nH\hXpuiWQ#<*XISA5kGJGcihhS/5K+Nney%PWB&&>pT@Qt=!
%T^Sda <5TAPb/Etah*!ka/Y$Tw9eJYF8=YqkCnukXXNQ=B^p!4$H?Xl:>#Sj$8JA/y>HFpGJFVM>hLE?KwSK=>
4GRmn% HRbLGI+Z?tJRe+I!uI+Ky@>FLljeH6%S+94e/SGRT+J/6E6i^Rpy1H*HbD&E?AtLFA:H#ETM*EMC1+iq
T=j=YJ ?Ap@iWD4*EF#dRA/G$>H8+^kK+FX1aLB>B%iKa*&&4SXCQ?SMG+NkIbY6aRet*8p\A/w>ZmRt>teBJ\w
EmXL:D Zaa=RP8=pP8VCTKm$MjW#CLVtidWY+QXk5KE\KQcG\EEabCK<KG4nel#teEN6eG6J+kWWhe4:Pn9#EAR
/N^ua+ 6<pa8in8HNmb6$Gb&VAX$Rhn6Dk1N$HG@d49QDF5#<BkLcimNLlSI1aeGipmmiE5B%lC<YFu8>i1#NkI
81PVlu iaEJ^WEI$bCma6:G/BG4+JCX\X68\b&T6^\9&jkXFuJtd>eCSE5Dclny$R*lRI<RYCF!uZkBwpIJpuR%
h$HEKT #hZ%QLC5$M1M!6K8TET8KQT8SA#P/64=jhR:eb5XQmNP=tD\XkIw$EiEqCBM9aD/6/X:^hy\+JqpLwbJ
GkcwHD ?I^w&N+1!FF+N1R?A5cy$6IW^%&+WmBXh5S1BJaheRkAKtVIyMWkttD@1nDM=VT%mZDRwVSJTM&XnHRK
9DtLF/ Kb&#BFDTQj$CLY$IGB5>E6w=<B1A>!nFu^H\i/jkw%a\aymj/RZj?SF4lE44nT#l5=SmQqK1?!QqFjFH
>ZcEqY *FyA=bIK+IkJHSFl:knkBGHIC#$b<QKAu%+i+8k/D1k*VZKBBhwlEP&NAEPXuy@:hkJ%wZl@nuRBPcQ/
1S?N%e =4j\/HC5?>&KikpPQLSBleD%C^JhKW!MG@XPCABkDm1y94SIyAubYm9%IN5wy%GIAM*TP#@jC!TZi+YE
c6TuMl 8qai$!ypHmQ8cmGj+JhHPVN1@KXJ@#6=8m/E#*ju:?SXye?twPiCT4kA^^?SF*1EnmCEXI4!Keh5\j1n
EeH$6& e51T\<iNp?eLamy!BZ4!WeCEjAc^bc4p44$RtE!>!/yTETMn=&GkW>A:T6TZ\#8***YNwNiRu9#t?ck6
h4LYmF y:>MS+EdWwKX/nDFGq@eF>P#X4w*1&14laYyil!yCmES+1<^1Spa5lntRm@q^wHcI=lj=JHumwQ$Lnu<
4i^HcQ BQ/P%p:EH9KbS1E%clncS/YdT=!M>k%ITh?9bum?X+u=LB^:q@ITZbeijhBIjXV4+VaGyWXQIRuRdMe4
DCJEki !GKQDmTZXAmwM:BEB+Jt#\RlFNN=JHV+Ca>Ed&RIWHJkB^INj=ACApDiV+J@RiFJI=KIm+JJHe+Il/in
NIw*!u eSCe$RB1<EhwaZNJ\IPhP*NqdiFWKRFTbyFB%JJSmkSYZwSH4iC5*PhW*kSq!eMGunYHHDGS+#N$ikTt
YYpM\B !\htZba#bD=PSu^YpZD<A9wbIHpp!PjWRlqGtEZap81wEi^5&T9d8+\pE@hqyp4pLJ:R8S1Eqe$dk%yR
nwW$*u 4wp&Mh=ZtRdYpaMwcbN&Ya18@kie+lWD:L4\F^XMbDH@yN9Bin=c=FXcJCCb@8GM/h/uP>BhAC<IE+1l
wuSqWX G$6ke/Sh9D/wi^MES&1RIPyuk+kJ/TRm&4^X#bkKwEIZNRHyBk&1u$cqlphZ++6lP8XZDCSj=D5lSkGy
Q%RXTQ Y#4@/^QcXk8\>GYMFT5R^&i5lB8yL$\!tIAYXDVMYY@jlGt/MlK%t8:nJ8d=HRI=P#+LJZRRRy*A6BXR
yZAmiX X+<%>m9nZF+kRj#QZCe91AjFnQ:Q6IA:R#E4TF+4R&ckJ?qdPKHkjni6=d/R+9R+SkSlGkY8imy*#Y^m
TEFQau %P^\nSNTDCXP%&^cbncctS5E%TdyY8yJL4nIXa^p#FT8GTYT>EW!tTul9i=Sm59u&IKwlTq>#n4bZkLQ
?Q^6^w SS:bK+bknNLn=DHbSS\V#ujn&l14^X<^4Ze5mCCl4E:&4VKMAD/H?JL+65D\BAd5L?5BLNpI!liJt5EI
!RKV4@ CdN?GGh8!&bT#&Y?!:>wQRe\Y%c#QA9<=\lTcD^w4SL<Htwa1+yTi$qWPP9RQNmm$$+5$tke6V#Nu\>q
bP6lTL =/>#jn=<%#I@N!RG$u#XBiDLn9mL@QTVudMGJq#PAKjK#:kD\lDmeJVn+8BkZ<nL!tRBln*ntB^#uVFm
eqyTX: V/AkappE=tamVhewwnZn%yaDXeRk?cLA#T*B+iIy:XTqZY4\=W9Rib1hQn$1$G&VuQ\+e61XX=^SVAcd
iJ!Iq@ lwiS4ub/8TA$ePl/<I@db>Q^uWd?V*4wN+?#4\y*8wnjaDuNLhGu/D#mbW#CyV&mE:<Ce*nNC8:6JBGZ
Tipkl> P\1Z??%TMYLy^cRH1%TdST$!A/j\:^1TjQE1e6R5@&#h%ZHV1eMw5&5u!&?umk<E4GtqIMLqR4i*!\=K
P&eD:D XM4DJKBmbC=pCLN4$6&uF\\EN&HQF&nSNMXZ9tIj$Ku4%ty?jFekp6M<B6J5!b$1+ZY#SRSW1e<bR9@^
-A:V+N 00020a6b268001202b4 Page 128 of binaries2.zip
^QZ6Pj =>H+%6=RPhYy&yX>d=#INy!C%l4&b\??Sl!i@ID+4#!<$IR5DY6+nVm<L&=ZudE/AjtDQBC\4bAcKw*L
yKPZ8e nBh<Kt!bS?/=M+GIBK>ZQVl*QWTKpAFmhhd^IZ$EQdwRQWAd+IaEG6WEHhmD<>1wXwmP\MG%SKRTQ5Ck
EuVIJi TF!yub*M:yHE^5R%ZiTEn9It>6mSPA?<8=cDTn5Q9h?kikImIFM>Y6Gc9&^w>AcE>n:JhFL+R@YcG<eZ
hNnFI/ k*6*#58tN9V8IWm#E4hQDPktPYDtY8u!J1P#A1qDWd99D#1<Wq6PC8+1DYjha^lYDG*w!V$bi@m$>Ami
mNDY5Z Dd&Tj@L\I&LPn5dBDA?uGS?Imwy6ZFeVnIqqN/64c*6Q$=IulFq!Pm1/:tJYHthM%h1dR$Aejiu:Pyq%
P?Tjwc njY6b?l%!e@Ie:dnb1mDK#?V1pKlqDnZEZcKFYt@1pKpW9ddKaL8yjLG4Z8&Km$X5ZHpHBHdaDduCaHK
/byjI< <Q#KPPqPG:Ry@FemjL^NcwLh#VtAla/e5d<R*\4R=?^PbL+iw&\:/W=ZLuElQ?RdJcFJ%WJ\tq=BqjM%
4c9wap T*KhJ*i/jJYKVRt6RYHZGHjTIYmHup5:X\pnuV8ujiY4Hmnm#<*p!M*=YFeW:+C9wk#6qK8hk5nj<pE>
??6?a* y4:ewII\k:hCZD5Kwc\Tje+lP@ybWYL+ER\65PY6>@SuWSaI6pK?%^NSYiVL^N%8htC6jQu&!+yY$=>Y
hkAy6W Xmj=/&!AJ=pj+%mAmkZ^l\Ftt%CE4FTt4MqS&>\QWX4nVj*huYWtn5nAnFFA#RR/%H%Gy>w1Z>lq!6cZ
YHCe<: LbyV\klIZXTQd\^><9mm^Mmk8t9#i4X/Y^ML?uKajpydYq$JY>/HdVYe4GkB?Gd$*qwBPlJl=h9\GQNX
Q**>ch mqK8t4/S*F>?BQWT!8N1H/WCiQ%ipB=WBK8@P:aS?nTh9uXJ*5CH?tK6Ey=iQ6%Xb8Lqc=NNG#=Mbbie
:AFCuS h$9h=!+%i1LRe9Fh<9%$1<5/>IV+JuPZPDedX4HP\TEDNEN<*=4%m%>4@Xb?Ttc%\E6+!MXb&ACe=6D5
?a=nTh 4N+Qu9AT<l%B#86mPRj#BL>1BT>5^M=/5<6*h%i6y>N:lK@t4Gh$Zw:%>kjM\nb@hp*Xk:/Xu+8VZ++D
tW*EbD $iel1eBb?C4M^>i^u<<pYAAAIh\MmD5acLDkV1&tKD$TXFkjWT=pnDAiiNTRpXNEwVaZ4t!15TLHt#8p
ht^CXi E&e8/ilhFP<AhS4J>CmwV?=TkDVJVPq>QlAMV%a=JZR=Gu^acV+TFYypjT\XZ^cSJc5%hZtBcm+TyA4Z
<Cq\u9 6^\6=4RMSST655E&q4wXYjIP8eyYG*wypkVPGHpP&Ddhui8u$DW\=K+6B+*%ciBj5D&:Jm*Sq>n:Q9*C
S11XKD hSt$>kJp1V&/SJ\^9NwmcbGH6$?9*R+m\XMYnc5S>$H9JEtayuQBej%cNNX+SWiiPj68HCWpk!bMEkmS
hmeZ&i k$k*apC:mNN%M6KWT!/yBCRSM49Z:S6ED4S6FFi!FYGwCu+nt+&cqj#J?yQL=bM:L9^ZciWuh/<Y@E>b
B&&5ja +RNMkS<CnCDu+V*Z5GDA9hhC:jENXe:e!WIu1wSy#TTSqKuFWIQM*$4!iW4*Y+$\<\>A@nn\lpn6=^RQ
GX$%jX !iPKIdSjFwSBk^D%t?GRukl***eM#P#nn>mjLnWl!Kl59DR^!l#$CCdJQJP#%k#eWWwn!&atFDBZAqHL
*@nTZ9 MP>BkVXXlPAu5$PJYK@&$+$*b!DC>d5jRCyFJ!CDG6Ki@pR5!5\RdkPP$h@nqCiplA!#ZqP<SwT?deEj
6?>h5i 8VKi^+<PpY!>pXT?wJFS9l>mpXN^QiRPqnqB:X?hXA!&4Tpc$#dPLkGJ<8aMSdqY+8SmKV!qy/1P!m!Y
45FLnC y?eX\?R$9KcEFl?j/%PbnCenZ^8yAF=wRmKB+:QThm?15NF?VBY$:!9h&Z6a9<MdaNY<n1G6WuACmVWR
#Sl@LN J<K#Bw+P^Za<V4Q*uh8d\VAplqb#J<JQH:=uGdDWS4ydF18M6/5LNjI\^\uZwVMVVyKXC=X!Ww%WR>/E
6QKp8V H>CJ=G?@<dXA%G8w&6aX5VwZmB<t!14eA?phN@$&9CAGZY*I#k<y!A=@PtG=?\IiuGjyShwX5i+C%%89
:lmK$/ 5>JMud=kJc*PGQjkuakSEuB@CkaVR8*N1\A1Z*/15aR+wHd$=TFThPEJ*q&m5mNIK?T+w@m5\@:&5Mti
^JTBwl iB=qGcIbSy&KcSEVCl@b8muYECpw8SSA#DG4BSP*tc/y=AMGGEYqLq=Ney1?pF=ch/b=DL8bh*&ZWFE+
V8^Lw? jq&DK!bhBu>jMh:A^W>^41aX+SlEan*F6Tt:6S64@aytiKCIDtt8XZa>@YQt?hjq!qWeu$dFthiV@aPT
6&AAeR qWhVZ/@D/^5^=@pZp^mpZ*WCSDWmVh/lG?1AZNETd6=j&ZA9WDtLJ\u+I/?jAk@Mn^tbli/MTEwh=JVZ
Q%%@WQ G/$5a5ilCQZm$4C#Yy\WDq*:iPK/#wISYQyBMTewlew@<X&?/X:6jBYEXII&WuwPpPTKckIh@KKZAlq/
X:!m#^ pMGVHV+i@5$WTeV$TbwC#N^ye?+Zh\CjWjKmC$S/\VhQM#daA4PuHn^at1lEhS4l^jaLwwwGwY8$1E+N
yt*kQ! ?56e#$Gk<%V89H#*hl^pj<=eZwmIJ>/wPI>R15lncck>u?W6KBaQ/twcmYjAb@/An!:>HIlk8Du&A9CV
&R%d6J tcQ8ASDGDJCWLd?Qw#=V>Z\+8JA\5Yn5X#RJJC1KYSWDEiGtGwpq$/T$jNqRK:6R/iE4Y6TNaLhb8/kJ
GlVBih V&l9dJN/W&X4CTp#R%AVSnCpw*9G$YNeJ\&hhBea&PJ^q\LpkkY*=K6ye6+^NiwD1Bin&:H&1YQkM@!N
Cq1uE4 6wSb1>ZJ5a!>Rq95tF/^tJLXyc:W%#T#t</eQqFq?TLildmJKX/K$p\mbcY<*NDBljVC&5TJMniBBhwJ
l@M6iq LG=Cc#k$JEE4=bC9>Rnm546SBicK$:QW5AHH5#i5J:b6bCkaRqQAGYplce+!aZuwK@ZEuE1lmF^cThtA
Fi=b&R tQ+MIYiD*mhcGNN=Skw\d5Yt6XkE:j9bFP5VQV!5B1uSL8#<E#FcbPEV%XI^tQJG:twp/R1%$T/6*EY@
NpMC?S JFJuF5$KKG\mWh5*biyNES5:$t1*+XwN4?MmK<9NMQD?4/#4kFeeZJM9VHWbREh<S8VC@tDNdIKWXCJk
cPNC%J wFV5*?ZFKXR6d#9*p##K&ZL1F>h\@e?I=T5ZT%<I5F6W#^@$1^iZ/6imqNVy/G1d%TS@#ZGZ/h6aQXT^
l>!mt6 cY6NW$LAEwA^l6:*e1/RuXic>n6>nikY4!?IkNF6SRJXK1bRhZb^G@hPVDt8Rl$Sw4JR:4J9=Em1?::8
&6S/m< +uH^+FKq/nP9#/QmdcXZ&Z\pSLWi9i5hT\ddQE^j6Y:n!RHV>c5Zw*B/ma^B@^LNV:Wl>ZK5WV5<Nak?
XZIEH@ S!=1TFRGi!INpyNC$8ywqaMp@Pj<R<=V&w*m^JKyA>h4F$ht>E#tYLTDYh+\=*Dm?41G!E%&Y%Y1>cIB
ailYZ@ 4pNA*j9*ae%uPePCVn5C+IK?4?\ba=4P+h@KA+KYWA>Ac<%lLHJSkT/?N5m1Mn8auPtZ%mw4yn\1iTm#
d+LST$ kdI<\d>uk1bdNwVmMu/6n@pJkmJBTaZJ#LtY<9PP&n\Yn:BI/+^d/@!ZHwQd4/4DH!L!wCBJ8IlG<HNw
d5Hk5R N+au%N%a1uD!FDy$5lXR#QJm5jM:Zl^Je@1lCc5WFNdq$F4Kuq<J5+GX&\Yjb$11cNmG/q*Z>uWIjj%<
?\Y6nR 4>Z<+Ge/W/*EBw4RSX9J$KHBce=RK?WZa*PT6N$tP\ySuih@D5SK4yQ4cac/RH<Mwm5n&9A8X4uD$*d?
Mb%cw# WNhRnnV4YLGK!S<qh4S9?BuWYG+Ji>&da1Xmm?5BnCK4Kb$%TQ4T#Wc?Nu>ZNBkWnR6:P$=t@By\Vi%K
DwcGwj 9=yRk%M/t@el%!$$16QpQVaYpZFN*G%:Z%c:+%NDKh=bjXn@k%Gh5JE!PM+CKV6%tH*TVCuyXn69LKw<
Qjk#lR iTP/\NW>MClT@bWhGQYKtw>tH4GPe48\hpPVnm8%\NVY8RbD!RmtcLC*MGLP5VihmGPwFe4=\?KhyMZ>
T^ZLl% wc^&Ej@>aMPKJS#@bIJhAAD:E4A9<&8$+5uLH>\!AmJW5+Q?VX$t&4j5BHtlwy5TS@SY+hj+h\Z/@yb=
b5/Gw: JR+h1y+<E:e6^PyB$p%Pmajw=FC$%Mt4h?6lh$S<+BK!@wD!JF&NY:WD%c89T%$DY@4lXdXHNPnI&i8t
Q1anXZ XmLYwh*W/Qi/QXBQdBia:tEwD@WYpeBLLac5A*/Q>im/uu#4?Zh>lVM9$FE#c:6^Fcuw$!96\Re!cy=M
RD4iJi aeJEC#TQqqhn$8Wn?/!@4q=/=tKw<#XbE/F=#*=pJ1eGN^l*IVJ&\bVkjl*5^QbI*a&Hy#+BKBLRuF%R
lFC6p/ JZ$qyMbKau=lPphmGmCp$W/wp*/lA$Ym$$WVWq:yI*qmbt+Xw8=p85ip8$hlwMH1C\aXew#4TE=D>C=N
b6<VVy NnGGMmu4/E%FdDB84Pl8bh#NwiunL#&Fu+EIIktEatqu%qpuG?@JbV1q+*u1$*ttteSt$8Gy1eBuBpXu
A9ltR* t5RVWb+XGuAZ/4m9J=+Z+dbuyq+TwTGlGZklM=Hmy%\hBK^CMeG\m<!K$ll*c/puqP%#m9R!J<8VILq?
9GMeG* c+WNRqKKVXlD#DLnewHk&qWYAtY5C?cQdpCn!*w1+>=m8Yil*w5jeQpqA9%GA@#P\D*DwM4c5<<%SI5&
Yt$!cI WMp4pQpyFQHMp:kt1FQCPe5PyiIZR4pl4GMK\4tC*dDW@q#Bu=tXN<QT4$w11E8YEE*GebbW\pI8@L4D
Dyt?q5 KI4WX<pp^1w9aw5/wwMZT%*dq?W?FI$*IF$*yIw9\aw#MEA$XPkn\a1K+CLFdbMKq*\pKGMGFb#K8TCG
lNXpl% YLhd&#+$HAKNBKDuk&Rb=9ELKbnyRmpS9$:uBEuleyZHnuFCPB/l9BMSBEF68Q%5>Bkit4>l/iCk>Pb1
ZDC6/C lPXyBHp6A^Ec/*kd&<mW1MBuyW$S5J\X^N=BhN=FnE:uQh/A+mphXVHnA?pEkTT9^JZ+1u$w/ZIA$tnV
YKhjRa mqLipe9T^iId*DAnVtLe#C8eGd$@l1PVy#!HjLa>kNNK=$ud%JApljKD+/&RD!Y99bAWe:%EZDEDH<iG
B:cKj$ DRcKGI5nhwaq8LGuHVhGB4X1jM/+X&ht6Hehe#%NtHBDqAuRpyk@ab5=pVYb%PuMh:iXAELKcE4EdFwj
:LeHKB cX9DmeIwdDKZct8PK^I!@C$CHyN68NMtm>X$apP$@n/GuDbGenB/Wwwhe#X:ZMhWtLS%&9auw&^?@lkV
=\*SkK $lm4DC^NN\$n^:pFt!4b8BE:cEFqJ#dlwPZiaPPtQK:N5P1D4P1>QG!hyKyaN!&adM!9<aXL^M1jQ!dj
<pMB$$ EWYNGHZB/m*ZywIQ8ZFm^SYqFV^aJqGy8EI&wt!HFH*MFHk*FWMlyh?GFJ6kwDa&8@YAB!Xbjt\mK5Ec
9#@#aj VpeJM&wyC/8G5FccNBa/\B&5!p5%KQmWjcetam^FBib>tEub@cH:wGAHP?MLEupBM?qGIK9F4wSpK*5\
F5mMYn @YMBtG^TXkJ&mW8JhXJt6%eNZyGJHTTCmHVkGB/VbCwXj@aRG8wCV:^#CJS&W$W$SyGNVYpSYuKIqM^#
?F4n$: Wed#a^l=:#85MJS5ddNI/dmyYL5dSL@8bpe8TY+6EdD64wIe$+Ii=P\D&%\Vm#\i#B\e<W!Fc#iIl<CA
ZAaB^u 5NSBe6Wk9\kLZ$Z!J!5K65A/tqntM59<hT?e\5JC#yD%l<mFPuYZypTXGyEbMy/#e%/F5hy^c55J8@Jp
IKDnce V<iRIIylV5iR6GKVmc4y1\1hlA41A&L=&L#5=k\d4KId5&1!6kkw1pV:tqCKK%&qj><Eajp*FJFN^$a%
-AT\Ly 000ee1331ab001202b4 Page 129 of binaries2.zip
K6h!BT l:+FL!E?=&Zly4=#Z\$:q=E:TYcl*lFaPk\/Q8XwciWJ9&FN^lp&hQqDF9XRy1WlTH+>8Ku#Z5XWTclR
J8AYqk KepK/ZuTXeWWM@L^l+H^VhW**+Zd#iYCJ=H//8ZK=tWRWSE^h!&>lC44n%W$V^w&LTahnIqpu<Z^hLX%
EABY@1 $^Fa5PuYbG:e<%GSEp%VM&E!CSY/$KqNeWW?E$$4hRZiLclFmPE8pLZCXYZw\EXa>S=eHXn8B#FThywP
6/K>#4 :CG9#&Y#bLF9ZAI8\D**GnR?4DS!nR#b4k\XRP6&ZnYN5:F1=N>RIQlq#H+p#<w9DGq&=TpYtT&Flm4\
?:a\pM Qm!^BK1wyCn!npbi?E?G:C8T=C9/Gka*^Y4E?C*4JW8aJYwXiKmB8tuFywlp#+4^^Yq8?G!mba#\LY!<
tyh8!+ jncnjcM=>Kq+Zi>h=E@\#Y6hYbYl4hKt!X5SG%SXk%!RI&^h1Fp#G>@+Nml466896!8*PFWSK:@w1%Pc
a5a>I8 >M+Rw/9tq5+I<>KIy%Eu6nkYpp8=wV!tt<\!tT#AuSV@wBkn\1/tSwdNBI/GXAS@8m5BRn1#*>a^?Cy*
1KiapQ ECw4?!!4X:DDN:RXW4XT8AwXKmmQNl\Mh+mmT\+X&KBjFVjl&4T#Ga8ePD>=E$auD>5%T%?^Zw>G>m=/
RaMmVW &#P5a=IR*c=R\cCLN/u8n1*1Xn4Q?1lPDnp=JcnID:WGP1E>1ajc>NITt/WFew$Nn$kZ<VyjnKSTVI+5
5ZLmTe A<bZXmRB6qH9P1n!tn!w?G*Gb*VtCGT*eqMiHdN%aXTlawaj>%uPJ^w1qHQjq%SuC/X^tJ5Y>HIF:1i?
eND%/k PJMJQL?5PQDE&i!5P$?dPKey:Z9Fqwmy9JlJ:N1B9wTy#>GB8KSynnRZ8JSy6c#yPPyB6=#yyRKi84#y
YT81@F l=IbX9+l9LIb9!1t9w1b9L1bqZ#YnQ>luJbbn4bb6a=b6/:b6J:bq4:byaHbl/E=9JE=94E=9ap=9/t=
B+&tYl 9Jt=94ubnH$t9+b=uJY!:K^=6a%=6/*=6J*=q4*=yaQ=l/MF9JMF94MF9a5F9/8F9J8F948FyVuw6IhF
*9p*k< uKhFnyhF6dhF6+@F6K@Fqy@Fyd@FS+AqjKAqjyAqjdAqj+mqjKmq9l<WyH?aiaSqZKSqVySqhdSqh+#q
=Fbu#l hK#qXy#qbd#qS+IXjKIXjyIXjdIXj+1XjK1Xjt#IhLmXiabX*Fi4uE!4/m!4:t>Y$>qY=PtRciEuY:uY
NRH!1K <HuY?QuY>AZY@F?6nkFYH+ZY>mZYjnEScZuYccZY%SYY%WZYl8ak*hZYq#ZYH:W&<HW&?QW&>A$&@I$&
d>w\jA <p*YH^Wu/PZY+C$u?p%uPi$&%S$&*b$k*SGu$^FH>n$&H:%tn*E&eSFHyic&=JFueWNR<Q*u=qF!/BG&
<iM9wq :KNJ*YPu^iPY%T*uw\Bd@qHd/1u#w*ld?Fp:@Nun6G:L8M+L?WW:@TWd?6l#<Tp:<Pl#@iF#?qXd@5Hn
R4d!GI 6DK:8Aud4VZd8Eudn@YL4X%:<uXd<bkL?$N:@TPd+1+V9\k:<lQ:HDNd@F&:/4GL:y&Lyd*L:k8:/dYL
H8aDJh w^?Z:PiY#iP&*dh&+Q*&+6GZ^d<e@A\9&I<6\+/81q<h8159@Kc9$Ce8n#=6H@eeLm<8+1b6#ai8$Z<+
dLFnDD $6>eQF=i1><jH:$=^pQb/j<<ii!?Cwh%uNc=dL/?NkB*aADaE+BhyK$+TIBjQY:jMAB8<G@5y^<6Y?Ce
cJtDtb +4Ee$tH5JKB8iuB6>N<hL$h8BBAhBNCh<D<9j^I=\*>i/h>eDD<+YyA+G&Aeq?Di^qQbEECjG5DeyNM/
MQ*b&c ?MM:8b>hj=#j+n<+KnC=RCCe8+?j&&@hMLDeGqC+TKBd@1T>m#6%K1F^c1G///G/&cc*Y$c!qd?!Il?!
w8qh^d Tti>@em<G^F^n1e?6iB!%b?:Y91+&y1?ycA+9yI<Cb8<Pj41cmFu<<q69T^!@\q%=1Bp>WQSnj:%ZwHt
K*:#9+ jq9NZELy\V:#\WDVZED?+a8&Y+&PY+?8hhn<\\>>6!5D6$>D!+@Kl*lnh\aVh\FVh*phY$:@u\+Y:9/Y
n9XlKP :9FY:6?6*Y65*H65LTV>I!D@=eQhPVu?1\RmM\e#%@>YA4F&\=EiF^+WSClmWyenhulcZFMwE>EySDCY
=Iy//@ GLLStA$ZF++Wtaw$W=ERjd\wIL<%aBMTE/dABAmM%JR61K>QJMy%^+RmNqa<bX^!Vw\t4S?cMRlJGbGB
^6EXaF BN:RGLm\FbWDA%=ehd&w@+A\i6mMJDyk^yt%GeeK6cKIP=e\YJp8nFP\PapSE<+8*EQIXqGNK$15kCkk
t$KXEb h</i=cl5L^BIMD+V</e$MAlVn!kdKt+IGA6>NLeJcw\+eZB%n$uVylZp?4=Wk$*Y>Qq$=9qY:+HS^8W>
Sci8B> :/#+R451tVBp5/E1<uIptL:=j1b5tASbJTVJuViAi6P5IVHM9ePY?MKqGyL@X&Tn4jN*kZMa%LhPYK?e
hukNei 5jw<Rj9nWKACWT^/ISHbBValkDJYR\GL##IuZWLtSnN<eAI1B%C$ITLWhc+mXTl>S#$aHY\T/E5uFRnk
yD$VkN 4RB1HD\i4C>VGd5AJ1P$D$nYS*cw46LDek\/Jlh%kpJ&Vuk#pp:RElX8c6S$Dw\P<=lXS4=WGae%1HcL
t>d$ul uaMw!\M%HEl\dY$!EDCIG4a4ww5q9V@A^k!YhPcPCP<TwMSK&wA/85ETKHmM&5b<b5R\!aww!M#BRnnQ
hWHX4% Gk1T5dVSS8J^TN>G$8CMP:%kBmHL$YC:#hTaEtBCF<P1i#&H\HwwQd%IS*mqCAaj5pm:iK<tP^jKSmI@
j=>^hw %c>Py$M@j8GT4DjL&kZN!abma+*Xa8SKl$FP4YmN!!^pZa$FVnTbRe^wG!SK#bSE1a5y:8^CT<&Gw61:
%cQKR8 Aq5@aeT@wYyuQlucWBG*PaXCDwG5k1wQR1@8wZ4t*X:P1L#CWdY!65Dlp5ZNQH>QKRR9Z#8j^MtNKk@E
$lDp$N jZCHNmVd\qI1JBdG/Y&u9=#lnpY#XLu?JaEnEP!Lp#4cRRQTEba4BawY:WaLnFHq\qpPKEkaq!^d8+8J
+u8W&F 4QE96Q1N<VNVLEbSE:4te!LkZDZZMBm%XhLNY>+5$QtZleH%5%V1aA+^:RtX6kp$M/18tMcmwi1a@TwG
kG#b$Q :t8ltG4tKbRclP/hFhA>^p6/!HE<5R/!Di!S$ZYPL#>kAYY8iyNlm==k\D8tJj&BlhXaDT41?a\NSDH4
8WXbA! a>^hqY6LZMupQNY4kiJF+!&?T^jMMm!pat^PXaSuG?^XtH1VR/>5<?6T!LSIFA><tndR+HaBJ84kcPaF
aCdY&K bl1V^#<FX&XH#hJFhDc88J9%IWiiy^d%yBVCXFRe^=iT^>YmpDk:$cq9FN8NXiQq:QqK?GGld<>e\@kl
#8=u/w ?XJmn4NF!6&m:*8A\+hlXC\=yeWV4aEZlI8$VJ\N+VYueCC5#^Nt/LVKneb:%e!*akPH+Gkyh@JJ%$wY
^C^aua CV%BEjlm!MqRRHBubRM9R=1F&Njkh819>BF5J+SK8u8W4muBbYXSRT^du?h6!FVnK>e/ZN8@Ke+X!q<?
iNcCu= F=M=44uCBZuylupmpl>SY+na&1p\yTJL8Fij:lhI\pe6Gk/G/MQ$=:tIt:YVkSD1\kFqeIp:!5Q\6Tmd
yiy?*G EtC1\pqaZ8L6=e9J#BC/lF#jw>!=imqa&bND8CKmeAuKne>mWl#e*#iXKT1PW$q+T^^RkVwdR\I4&eCJ
Z&@%D/ 5YJRlQpInl9KkRLb$1j$n54KQE8Vmqu&pkw*Kk8X8YRGBLAnBlS4SlN6$CEJm!Yc&l4JDQ:WDXk#utK4
imu*yS nXh@AW+*t\X8Zq4wpK&Xl>yXJK+aadSe^\&HHB%6S6?VlRP1bYEE=/aCeX<+wVSpFL#w8kRGlH%QydXZ
9@QEYj 5:9+IHN^6FBQe8PGYlSt@ltESaZhD/+W!w$6#b&S6j=Ly1!SB^iES?cASK>a6a1DV9!Z6Dy\tqqn*\M\
=EuR/6 cK@+%*\*XaZHjG#Su#C+\M&q=Iq!4eY9!mAiZ<y68:@Py4TBCNqB=LHTPXY4Vc@Dlmnc&chS#a4Rdll+
P+%j=l W=ilnlWBl+1c4!CX^5bB\dKIDbcB=BQ4qnqPFdpS>6k<BB5yA^eRX+Bl#9nK5<H5hYqRJERqNIZc#\F*
5*=AZF FBiDZ<Ym$F5<DLhKCPwa$pc+Nq\<%8c:iP%5wcW&$LIicja/Y/PS/XcZ/<?*BLQ*XXaAElDpWm8q?:Qq
*X:ZY& 8M4%t=G$%q/1HJM&K*\Zjcj+4Fjcq?&RuJRWWhuB<m6AiBANe@P$P$lEW#e4FK#:?mKwZEjH6bw8ncDS
ACG*H+ pDVNK@5Ym6yMa%d#5#Yw$=duce$=tGm&W=d54>=e/+>/b#wI^#GX1B@Ndb<Y!DwPF51QRLlm&u!GlyYH
4Y<#RC 6D5E1&WakDd*8ehp#>lBkZ:CbW&mCJwi>QCMBN\k%X1JSEi/yCXq6I$uGVAeP8$KFMbJtTSQK*!:4YFC
uEY\V6 *mpkbD=lMH94I%TBLeEEZDEDka=@Vic&SMt%XeAAF<<e55YRT=LIpPueBFL^AWNuS9/CNM=B@*WRWd=6
iwKn%a QSGw?w8pJ&e^QnT^1ZE5M4>dP&yyGun1G1/=1Q5N>$1:+GJFY<jMWXIKhm#&=IppIc\:FQh^qmd59KLD
IM14EE :PRGKkZdpEXTE@&e\:6Y=pGN*lS?MyqZWb@KTQH*4d^a$wpA4CHwATdVWAR:dQn#Qku=IPNPGGtJN%Rq
JLJkP* X*EeEJuQM1BKSNAne/h=a1?=y/lNYyTMY6jFXJEM\DaLLC%PqT@9PmBjlG:G6tWbNm+I+865q?9ZPn*k
i\JATC G!Gc&a+F:@#uG8+^%TmwD/JM:bLWA$@wI!6qP6KFJuyR5Ac=n#\DMclTPSl9iX$<Fa4m!=GuwLD!E%88
Q^jn>L pyWnTL#<kP&^6Ty!LP%mdB#<bbbylaAT>Zm6TGC14KXtd4wdHV%BeVkK&ht%?$XELGYK1JNG>K?F%WE:
u!XqN\ X5<@mmT#8Zy6qji5w1y<Lmn5i%ZI+!P69?XTPTG>d:XCA*&VcKRRG6\u/641&8D$VSQeGT4Q*L\#B1<E
%Sm4SK **M1\wZt!Y1&91T4I^+?HHWMNwb?9Pt/ScqCN9W%wWSLhZHLGRND!4!RHHRRB86XGpCZ<:S@/E6+Aj6t
4mlNjA 1#P96?5aNK<cXyl#Z^IVILjJTp</mnQA:h^e>uMF4Fhqend!ut:m%#eRb>Cja+Repu16tHyS5?:*yPjT
mY+^Xd w8Ht1&\Kmmt<at5^1^H5lKEQGb\Y*b4k1$X?/Fp?^uaDRBHe&?Ql$j+WRD&6VaJ5=ubSVNB>QV$y1PDt
yJ8=Z@ *A&>+&dpp9&$+9$^w9%Z\?c&&Pw^&9CX?p/W#t4Se&Bk:J$V4EM%H?$l?6TZ$:wMqJW@yd&lq=l:#&YQ
DX^Dmw FRMPj8@<Kcj$e/+R84hVMh:W^PCnnN8&%B%Ft4cm=A@B/yAnEh\q?cI:JRBVNWkT!Rj#BKijaSGq>%>A
!QQL&I ycX*?w>wCK@qFV$JFb$wA1!1ZmEa1\AD\XCK\I>R4WWF%mLpluIqZ6XDnNdtB&^^u^A:@dBH>!bte6A#
#tm\MY $/GWM%>?^4XM9+PFDtcWV+FDjkeZlb&^WLTk/+\=l!@?cV\Zd/k61X6iuLaLk:qDuYbl&1=/qBA@yC=Z
VBh!NT 6Zci\LtF1L%qTY1H<P*&cB&<yJWiwXm8NpE&96*TDLqF*NRA5dN@THMAZNu\TAZa=8AD5u8Hqy5hF6cM
:uK6>y >KZ<^#Mk*9yc=lARY:yDH/IYA>\64t!M^M>nc<1#X/kd6QM5i\aimV?hc=p+ACCSYut8VKMqSE$%9eGN
E8\EWy uHteuTbXcmW>h^YB\meXHJaM$IemZNMNEIRM&QwGRCWp@Ne^L?j@D\TN@9F<?#<K?69D:Q@6Kjn@dd$n
:llDm& V1:@th+SM^QHj>E:atbm@&@yHVE#5j!#*6E@=DJ?J>n?yjAS%:?Rp?H<#\wN:P^@ImjD^jRZ$E#MuH?C
-Ab9&# 00088d1211f001202b4 Page 130 of binaries2.zip
^%9YZm b9+4hj?b?BAZ!%>BM@?JnA+Z/%>A5:H@mckKF>6jRdQ?mX\WF@6jRLN!@FuLPj=ZcM/@kGdl@DM$%%>A
hB<8Mk @/pGD#Mn+@<P#9TZi5:=J?m@at*@WjQqu>E5@!9$Z:K&@/DZ<e>w69<Xt9%@lj+4%5dG<thn@qi5na&S
LCpj!< ?W@Rj<ZctLu?6c*?*tV@T6*Mj>J9y4>mc&^M4H?Cb9/@?kB&N5d@/kQ?$In:##/AubZ#9?WD&Fu@:kN?
@!*Y$u J%n@pYD:b/@A#54?4=#B*:*Hj>GK?u69@qqLmQ&@1SZF<68u5*C!@b=4%6@itPM9cEZ>*ZQ>p%aWJ>e@
^:q*9y c$Z>wY4H>u5e@6Dq?+hYFCjnj>TK?lhCQH@Q@D?Y??<cXI#@Z8/@!$:>4X\Ynu>XL96@biyaPH=:pQ<4
C=#+K: W\e&aAVwl/dHklMuBpu<lk%NlA+KjM5qn&:BFRFbFPG^+$!QC\p?kBRDL<!KI#E5DNR/1e8X?m&t>w/X
+&NeIB N$R%QHy$IBGW6w\NDI/W$bINWyAXh$!<X1l&$yIiP*auXMTYH=T4WPkMbd#LHEehER*YHVl9C=<TB%w/
cy*yp@ 4NRV*SE/hMMwaWj^mJ<yTKJ\\TqmSwkA1+>eSc1y&=Wqb<WT^NPuPyJ&iHda/cc#$wWi=@CeVXGhH<+A
d$KD:! DMbRBCnphpkh\+ylThQVXqENNhwlQ#mn$JcT?X^eJFFw\1TVH4bXS<q!%JITEitSBG>*&c&V>T9Zc?#M
?+TEq6 8CRq#9%\j6KJamyZ>y:F>VN6Q<#Q&<N\LKVcyi>W1a65mNKp^Gk8>by*#VmM%DNNhAE1MZi=M>nuCcRM
p^+K\E %nqaaXI\B/%MqD1C5&#$>j*94EdBmE6Aew/bnLEDpNP55RPektR^BiM5mN^!CaaHaER^?qR^Bdpu!KLV
9116pj ?=*l@aFBd/6kjVH5^BK^tMa+@SiYmyVpIm!&y^!^%/adeAM+#q95%YjhaBSCFaP=JL9>d!PVNQh^TVXA
iRM/AE AG6e<DG9+ttYH\QeC+*%5ph#4D@PhKuFtVNtD68BJP*Z&PqcBXFd?\SHMF99Zp&*aFpFnXHl+idn8MYJ
C\>yZC B5w\Y1a!BJunpTI5yPFTEBWba>paN\WXA&NbESW8Y4iFR$G/MA>W$B!X6EId&aTWXQh6$nEYYjHW%&Mc
$Ja*uy ?XARyY:5?ER=H%H%XJ4b<PK6\bw\j=m8Aap^/aimSV5m\nuJ&PmB\yM+/M/4:V9I6?:Vjh6jqijdRNZi
#RLDIy Bh^yLe8:SFN6IaW$%p4C%:w\RCiSZtL8Ik/i\Q$REq#GHL1a5Pjhm#$#^k=Fp\*%WekV@BHVZPilJ<WF
^l!>+k LG5mNa<1Kem+$Qy1I:4p=H8KK6c+SCi5^K1y9V?8VyI8FcQG@8Z4X9KVChXSW^XTqqqL4W1YVpGPP:j=
tI1CNH $/Cb*1tSTLceJd$a#biV!\IHCpZQhS@$@c?dGpY#P9V^YZHBj9beb$<ZkcX6&A5G^Xe<pEJ%c/u+A:KY
wlbDkp t8@wYGK9$!bKMTTyCIGB\4t1C/\J:4maFC8^GQHLKZmFb*NXcX$PM&+!Dt4:ma\VT&Ak#TKLJuJyGT54
lwNl%X jjJe5*P?@t+P+1#+Cqc*Vl86%!ZnaH4AFGY\CK^lXT8/9XNZ*!BjlYWK9aEcL&Bby5eW*+RQH?yI$8%5
DVB6nJ Yla>+?M/>A!el=RYY8kunu$tn9#8iIPC\QPCq?D%!%/bnkJJ$Fn8H*>EI!tEM#q?c!!&X<W?MLNREtw1
P>4u$p It>dQ@6yE$JYA=#5pVhNNiJpLhhWk!bd1NwiaXiikW+bWkKJ45Nmp6C:H?:mHA\pZKS6P?RFn5!Ml/%e
q@MF4d AHe>Dp$CKR^N&IlnE9$ell5l9w#/nVieik8T5qkHh1GYWtw1MAZ<ik$T^Een5H1N8ImTQpbIqI=VCe85
jyJqTy NKL%^^:%Ta^R=%h1p<LEcWEH8>Qa9cIY&mNMa*h9l$D+PuLt/jY:JyMaV^6thQGqXXw4M<VbE5:S+bED
plTLDB E/ipKY1MwZVmnTTjqLB49R4T^/&WDSE9p%NSLEyPX:eNH$pV\5BG/TIJYy$MF@5Kh?+5n<8<@QEGJi4K
Nme6B/ Xap^=B$kYh&pPYX=VuW&51>nw=q$adIh=C84BSNBGe#jD5C^LM8KIl\e+=BFS?aICPdd5SMp#ZkLe$jL
NXlb81 =cpLhE@pI4<yKq:9&ZBADb@$>B/^Fthn6TkVNt/B>/:kG/kRGa!!?#iVYV1p#Flq#8=KDm=&d<CN:=nj
<Pa?w$ LYDSlq1?/RR#eN!#^=ScHX&VpJ\bwyCi$wMWhmGSEihG>IpYuqSnm=mSeTHEjb%BKRNB5y&ABn<S?qde
hK^AqQ wnlNm/SV^unaut/ci+#XtZ@Ny<*m1mS^\u9pZK*9&qaabT&WCY>M\^THS<uj9Vtkd?eclpaqnX+/kF#E
5=+@Qn jnu:a&Sp^+p\=49JGbqLKajmMyB%5Ey=4KjRj5IFPiqEXXNT4<dy*Qh%8&A8wK>4G6VclZ$k6dp&aut4
@V*!?@ :p=GkRBFL6XJTt*EM%%qZ>iGC1w+$IaKm??^kVqu5AiCVSTteEMi8k:nLw8D#Nad1:+CphSb8F=P+y1:
u=JRhc k>#uY+FDA=:P<IJ881h^wa8k^uc:C#c1bjIlhDM4L\6b@JGNct/4/:qaRGBMG6T^Sew4Fyc=m$W/Vjw&
dtjX^< heFSI*A*M/LFy\iXWD%pNcBeY56<5ZWFHtMd8R#RIXWHtWFy\6PW>PBl56<b<&F@Pdc>k\E=#wGkAuSp
k=Ga>n QJ&>GXa/EkT6RmbYYCWFY<6R=pCXS+%akMRAuDp!e=BMJK?WQ%6DMM=X#TGJ/cuBadDA9Jp%aV&WIb>Y
l6JWbi !DAVFwStML<M>RcRB\GcMTRbVZpDNqtNnSPEkaC?kij?wE@^/baiMEKAN8Yq#FDyVYK$emPFm4u4Tc1L
11>p<5 E9wcI!LJ^ep:Ctp6d?#P%5hJETwa6T1$cFilMM?b6BeCN\dNB\=8Y464ny?h^AJyVAS?KLY!Ln61Sq8m
6E>=jq :R+@AqmyN9Kqnyaednk6YbjB^WMwTyE84ww1HLYcP!nSeBN6%K1S@<:&!%S&K=8/$eAnm#kVkV+FK@>h
<&&lGY Ted5kbt4iBm%BW=NwV!/%^:Y5#YLGp#!tG*VPhwCCmTYEBKVc6IIY+6Z9k8wPEq=W8uS6/1t:BpXhctG
Q@eW+l Zh&RW?VR5t%l^qFylmqkl88kCt/CHXaw%dki^D:PtNNN?%iWZ$YJiQSC?diGm65AHZu5>yT6i:H4FpY/
%@d?y% P@9YaBwkuWTC?EY%/1+?+D5hbI:\wNT>Z6MTPAQ&&/1&ACPk<6h9kXVW=*X1=W%wm!m6w&uT/qEYFbi/
p4k&F@ Yu:RdqI@wGnLq&aHk$?96>\mYHmNR&T1dPb8SEtNL*iYJq*9+%Q/8G=k?wWt%FXnhjC<tE6j%Pkeb^TT
u@tYdZ qBHu5FycDA$T/cWX&ee&K/h14q*#Ei:GbwG?PDJ!c5ALl*F&nlP9heA4ScECl$WX=/iw^cqA9#H6^?P9
Z@j45D w1Ke%M4=CT$WpL/pwEVXpeQ1y#1eplac::kyR+/+#=X%@5ntYpDVcawwPlQB4XTS*NRbKR4ELn!ZmPS9
mJV#NH &S$<#BnyA=lEWF@N+TmIeZT/he>AEX$Y#NMe\nuVXj6?X<5c#A+pX%NXpi6G:j@ey5:ab\4%u>Iy\*Du
*C>Vc+ INQZKV$&Q*dqmA^l9$w!1%tK4QuGd1kLCwk^baVu1DbYITq>NqN<n:?*CLaHC=%Vk8c%pDQ<Ga\@cA4K
R&hd>j cl^CcWj>e:#Vi$Cb1tbt\CRE*NSTk\c*YRd^!+H5!SD+64R\QA\ydP:pSjtnP<#kq+I$^YnV$AJ#VyJa
!cY<>K $Jk*?4A$NpLuwW4/@muG&^BDPq9B+j+DXwke\tBk5pEjlymAwet\aSJIIFq4aeDeCQDyaK:kD&Lh\Wu%
%4HnEY we1RaSB\INpa8MpE*9PW5bl9+<B9+/Kt+#GXE@DGE:dnnCSL\:CDp#F8TDN#W+TwW+cwW@tEhD<9bYPP
:ZW@mF KCw9\j8Fj=C8BaB\IP##i+5!H+NiiweSl$5/K6PMe>at5M6eQ@b1j<bJK\&BaDCteI>ta+VYcplI=\?+
HBeBkC wbht\p8EtW%:>JPR*<4N\mcWW>86YDpRi=y!59ZtXFH\K=4:6A@1t>8Zt#B<W\a*F48bVlMDQ\mFNRED
*KqD?q %+k8VRwN!R@4\B6hCT5\XyHT9L<<<EAK?EZbju#I4$y6D56$=EcTVlChE\QGZTabn%PK4R\X\aCk@P9+
HlnRh^ KRIGXw8\Z*^a$ZhMXi\wmuQu%K#ET<#\CN+1yJN/#tVRkMSe5dd1$XAmluB1#9BcQb6JW/K8Cwj<G:6M
mk&ijP #NFWw$pwd1\%<5qqGj+S1i/+8PuyT5SP#Fpac=6>yhlqy?+Sy<+lwZye=*qBcc#>T?mlHeWwht*A^pq>
RtQJY* Lu^yd/GhV!1$iH+=<hbqF<myBVZT$bj/ZLniCcli$$L:Sq5bidmAibyaX\Vtdwj//RwF@Bqpb%aHCw1A
kmN?ap 6j5j!6^Z#VcA!&h^\bmIRXD\$<eB<%?n$eVPK<HJlHiW!Snk#VGTjqWX=!cH%L?PmYECFBjE=JkSZDWl
utHcWT !=$FC/ENk>S9MbMMI*\mXVt9tP>aCKN!6eEwHT@Ji1NKC/QECy$SFMGPSDl8dMEA^Wwku6#:eVAB!pX^
H1cGl4 p1HHPc?Y=SbD+5dPlW@=#G>WAKQ1IQDauaR!/&T1%5VLGN9Ic5jIWp%peqZ#y+PIy:m\CiA/H?9Dhn5X
4kHVYw AkE=^^R1b9kkb9k^#hRJ:tR19:Tl#t@FWi%nB^c8=EtSwRTSWXqq4h>KG+T6YQlVKPHDDH6/j+wYM&eq
\DKM$K 5V6TCdKjpLBE+wn<^MADC*CkKlCS1TGZjK8IJRM4SRJu:5?L*GW>^GWpe=Km=tYZJM+yj%^1WFh%T1eC
we*H4> %G5EtLauB$^TS?lA$Wqd6Y?hGPCT8J=Q>+Km$NDDeP9e%&8kn6im48t^^wphmi6R8JA#H<4XcG6Lchjj
QWiFi5 dM9hWtCBRVCwdyE\SWMWqZQE?lKuDD8IqjAGJ?SW*mtMtaue5eqAQ58:MEmJ/lClEemWk!j%HlhR*4Cw
I=ZT%% d8&aWcnTja6FRZ!V+EIL%u&^uHuJFd\:nwyTa+$1MW*/Iccm\l#NRlkSTcZl4EPJ=1n?\J&pHJE<85Gi
acAn@j w1=?k1@5+KRXlbpWL/!/GKq?bltD\MImPjp\yEM\Yl6^@FM6mWtcGXiJbRwKpn4IDdKk\Ewpcy&Y/XpQ
!?LT/t ^P5F19/Xwjuq=<#qpK#bk@dQAhtAjZH\AZXn8yeh^BV&T%Cy$&W%?ukniiVaME/yWW:>S\LGIe6V5PPi
99JT^W WEyDi8^<N&Y>$PGC8Jnk/QPp8a\\\@w15m5/iQwn!\TXS%HyTBFcp81hch\mMDnVPMMDhQIcThHt$CFD
\H8TE? hNpDcmSL<HbDhl9I$GQaJTcP=AWnF*Vl/4CEi5Y1*LYwY8#cWDuFmPukCDKD^VZ8?*JR%P11Jm9F@hJ\
LDkY/C \MEhK^AtbI<amZtW<q^\cwj8a/imJiP>&qJEcVLuKSD#9KB&FJb<$:ttWpBWC\\LA@NLnbI!=BA#iwe?
CB8etL A+9Pebj1KPe9!*%4W^c?BF&ZTEm&mb&akN#1l^aLKA\85G86wdZt8FQVcR?/j9^@Vh4@ud*?@#by@=hb
Z9#YLd ?h?H@Q<lK<@K?F>biSc8@^+4#<L?u%n=j!MR@k9q<X<J4:<*@J>IS8a@we8aGj<C?5@I?N?*@kZ$u=H^
/twhES 9/?@ktd@M#VLZ$G#eQ\Jt9W9wFu?lBBubtd:K&nYQ/8d@T?ktVu?4N<ej\H>=*\+M?hjMShG^n>B@^Xn
uNG6Ww a@<#ZymF<T<N?y<aG\9V@\4>%+#6V:lbq4>tdH?!!Fn?m4E^e@:b1Q$Xa&Nt@:P/&j<%Qj6@G4m@S5<!
mNSLQ! @:F*eZES5nC^ELI#Mj$XiycF+#@S1Q>w^*?qWVua@6<$K66@wFHbPj<Fne4C?V?RHtj=l@R+C\j49$8Q
-An*%p 000070d9aed001202b4 Page 131 of binaries2.zip
E4a<>= @%Hb@$^/uJHyh=Q@udaXFXH>F:V6=<4uJRBi/Hi4#RCtAaDj%?e/RARACj:H>j5XElaTAlIYHlwTElwi
>Z$$hy ER+PHk+PERu&>!5<LBICMkw1CnICJma&NmatCVE^MRuF9%?j9RAaTMA!pD5REDHke^A\>:6kCKA@L5C@
NPuPPS ZcBkIMDkRAAITClwGERAMBAICDAwMDkE!P<ZaBekaBApWAAaEVKVpBI+mlG^W!A1e&IiBF1hMEtj<8\8
4ibML! C:4^Ncq#$A&bCK6KWu/>mW5@t!lFepEDP+c11i9A*B+piVAWNCbYTI1aiGGn?4\cJjd6@6*k\5G>tX6w
JqJ:P1 cqHV$PLlk:q:YFy^<@DT$TPHlIdFq@D$pycS=b?@PCW%LV$mMpydS%iPu/m+yLT5QCP@q4YN4b+<W*NL
G5ac5A c%6:SYYY6+?9ud=<dkJAAbmjc\DIQ:wpAEk/!XGeciLW>:T%W^5kVu:ReciXXS1humK%Ha4t1wd:BKV/
Y/!MAC H%+>t#S>Aky=DF/K5n:WQkHyQah^!^<JF@/ucR:QGl@/u+C$*>?J@L/uZK9u$PD=!+jtlj<J@QJHtjt@
TI\%Z= ^99@u@Hi@#h<#@>H<Z4@N@#&u?PS=A:j\VtX^JPlM8Y+:WRXHtkeK5LC=@EVHcR:I=Mcc+SCp4W%?%m6
Sjbd8N !BPN?k=naZ!qkhR<$XtEVe:E1\u<\#6:QkH1E\a9+u>WnhW#5GZ\Cck\1*pu$j+ELMJ8:%+^@H/9Z@=I
5h=wdt 4QI@DjQ@uPH<BCB+?u>WyjZe^>y<AqSb@y6FPF#@T9<EuK:?^pw8>V!IeD^=V*\CHt#@/J&N\W6i%l9j
:wl4*h +Tjkyjp*hw/6=q%^/kQ@>lQ\4pQuj+K>@FF1@9@j%b9hHkZemtHP&$GWpXyKNVY#\y?Y9M@^+CIXi*/b
JjKZVt TQhL/etnY!TQP*nlaHe@:15/mpI</&e4d#XY#euQTK5+nGea<e<n6u!WP6&TVMyjH\aydYl*4P!$>mMD
*P!R98 #!FBiP8\\X&c:=Bm@1:MJQp#ni$V+Ju:u4Ey:9<=i&1kGQ:?/9IJpNIkiNDkYCD/BQl6@P/l&5m:&6RD
H!T1BJ yQ>&m<B>16MuRM*FX=nk%<YQh#Jh@$Zh:j@Hkb\pYb><%eBqk8CE\I>&Hkl8p5H<wyw?9PNjyF6@n*=d
BelahT n>n9Ried?Z8lSnQ*?%A6^CbA?8AMqRwDpcn:I\6FnL\=1nNt?5^4/hylBVJMcPC=q?>^HG>p9!j>&XVk
!$wHkk q6*k8adnTic*Th!P?l@a>6#yP%!u@#ca\+SQ\Pm1@%Hu>m:D:@te?N*C^QyQ\JVu=>!y@*@K/8uZ@&$C
1R5$KJ cTKjABK#V$DtuZ@IH!bCG@+l@46a61NQANS9C>JCiI6N@:Cb?pD?dX=9>RVQPA^9!%u@<*d<Q:DT@iV^
V?Hi*M hqV:ikud<YMSG6y=aMkNSF>b+a@^/c&Q#atJ$ZZhc&S>?aAYHm<G>tVdiP5nk9q&bJ1$GHt>lM$P/uFd
qQ*CH? N?lALn>yBLTVZ$aq1cQ5!jQ94\V9IpLluy@#b%@4d?69G<!u56l6X#&iBLy$<j=I@e:+@4q\5jy9Z@#n
6W/mGb #bDKj:@1>&JqZBc+hh+tYX6?K<:=*i!a:Wi!MtN<&W?AS+*@Ee&H1XAT:?4u+6qZV!%Q4d>nP*$I614l
Q:B#yw y@/>:KZ@ZHa6c5@N$8>%u&H#@buLIjHC=pNF+jeIDV8<Im@WMbAZ\PDWY+t*qY/+*lMSDJC1<t>:VIqe
uXAdEl @I4bWGnba9qeQw5YB$wJW&pqDII*RQth9bCHS8Id65@GWTRt9/Q1@4hdF@/B?ijE+K99Ql6C!^cVJBmb
&i>HZQ \Xt\!>?ca#$cQ$wCV8uSCw4NByS*#ey=Zt!tSn6IHV9GA&C1t<AhJa%eE4YQK$V$E:Z+uQqQjXtBF@w+
t^Qn#a 6FM\euDp98yaj^!>@N$61yLj5:@Q<S=y4ctS8#LlY#!iIG%5iVWa<:1k9Md&SLWRy+a&Bq>TlCht4EIW
uAql&A M!mq4MmHuS8J*LlQuQ1p$@#1EBpLJb?#lKK:wVA8SFHDpy/mGBXm<mmpyFB+PJI:kPSaQ+%WeB<Wmat$
<8SHAK 9HjEV/<QimZZdlj=CRmuC/<eI^&>R/hXm\BJF/k6PE<<^X5KQ%+Z?J\>h8@Y$jE+CJNyP+!MbCyR&aEF
LSE+1/ &Pe8b1ccdQ8YctK$yN9lnZBh+wZ$cKybWc5tnNYXWC8hLD<6L1*BFVZP%59\bCAye?dIC/p!kLEYic8Z
<B>Y1i hJ5eQpGS!nutqlhR6\LK1c5wMc!9$anDaip8Rl9>MnGMqBihNT>6lQRD*EGMwt+eRLKmQZA*hH1Q>4ak
b/=9dD PNC98XydAweIRcYdIKCQd48#uJeJVykqHwLPQ+JJ^YR$WtGqm:<VDA4a&G8Td\5%6RAb6mak1MwRqTeN
P6nW>d tWty/hlQ+Rt55qHy\8bw#I55&y5mDAp^%bPkTckZ5FwZSlZ9ZCk44LGN\cNda@NX=:tlDh/P^tQK$?A+
@l/45J WkTHE!C@GYyWIaR:M5I<G!maY1+hCSEWJ=a95w8!<h#WDB+$8JjhkKDn/<:HmJPumee%*PEGBb>h\?NE
V9WNK* +HFC1?S6PMl/YYy:miG!P+<lFDuVt=wtNQDtyBi11@8JBtPlRcDN*h5J!Hmc%6KDqyij/4dQT9Sdin?<
t!am+6 *6nyn@PJ!Le&yAtlPqhl@SAEk48^::D4jwKb\Bd%a5>/$L\Wt:HCFmF?V=AEmd4$ajR4MaE9MCM49DTJ
DSKq^y HW<#K=JAl?YjIYu&@=\:tZ5&pLGb>c19=^RV\cI<6y^eNE9W^E=@hm%t>bTSXhhHpiappubYb*ZuTVwh
W6S<el :nn*^u9b4?R6M!1SVSyknS5@I$TG*Hc6pT:i>HcI69G!:Mybeyi^E1Ym>9wmHqTQGW@&SFBTE41hb@J:
EnP&@5 d?Jn?aD%Z+VFKn\SZqjC5EE4JDJMIt/8W4h*RFH4?aI@MN?HuSb5W4ay+ibJY#AQCTyFFG8D=c=i4qTl
W#t#Z\ ejQB?iVK^\@V%BFblFJEKV9hi$ZtTeMEy$Km*t1XBY$?c*jW$h=tFbt$M*KNFqMPJwLCkC?A\W1L\K@u
$#YmDF lPuVatIHY?dAMu\dipkuSCS1B+i1E59JhLH5k%Jw?dkt?hZ8KMtEWQBIHhaQILmXA\F:>&*VE/6/c=\1
TLF:tQ y%hVK@TuHSbV+*V?6<MWeVtE&\@P\l\bD8=/c\:@ky!%DiYqjycV+c1*PTTpB+Rbbw&T6c/5E@XJ6i+c
ik>V>B E%4bt@mke49\ka9tFcW1@*G4*%9:$>Ru\Fk:Di&a&!j>^da$CdLXINI#hkZID68Hqaj>Ai*=IF!q41%V
k<\SG? M:V#mD\tCd6R1d#ILN<*Q?YX\pV9l9P?IyJPjX8=J?qYmETkEw&I%ZKNHmAMQyB15>Tcj<Lib/<YZh6l
?RJyH6 :=!nK?iJup5nI9iCX+jqCmMX1JGp#WS48jkWEcQtCX:!T?Sl*</u!\EWeaD&V6/IYtq#TqDCRlSQAi&u
:b1Ci5 6MaD:Pj<5j>8LG5NBHPZ#YnDt$Tm<lhFlQN:HF>CJe6:G5#WAGatW/VFnTa$BdLXb6+9y>#IePIPM?#/
nX@k+% FVLnBlHM>T:qCXJ?IS:jT:154W%RdYB6pDYmABXn$hkI/MbTL$=@:HDy<eG9m:$a?K4#>nEjDSM!RbPu
?nP@KV SanAG!*/pD*VC5<TF^wa\SPQcd91YGSKy%Ccm%L&#BLWbW>?+^t>?INQi!Dntbb5DFT4EK4cL:cXVbSS
>DXiP? Cm9FH#<9pB%@\hVe/<mJ:@F<*SK#dHXCcwGdjSh:TuHBiiLaq\ZjWy%j%SbRN^PP^C=Q\SZ%Q9jR&CPL
cqk&an lk@J!ca59X*/buJj!C!btyXWB$DmFHQnXZQjT<HHc!uC=?$yGWFXZH6JG$MdYjwE8BFX>BRdEW*epWqn
t=Nj@I I$Xb4bFuFa:SymG^mm8YV=#!$KE1YeaM?iY$Wq>8&8>aa1eaq#kyZTi5^#c9I</#H5+dJ#F8^NSncRhF
QH=Q<C RRGW^BVC1Ew%Se1$?d+hyuFBpldSZCh5N&K/Z@i9j/e?TajZ$>cWISRtMSV@ei4<j6y><HAl?:q\t4cq
E>%e*w NZ>B^6^@G/VJBpN%+9VR4qyDetQZhuKqpk1S&ultE&&V=WpSJ/Q^SXyK$Xj<m=tj+AKBan^Bma?G?y#y
#QW>aZ An%hmRnWQdI1FVeG^CJVblTT6JeH\y8A$%8c\T*yJ$AZ1eT!juY:/8\FGl&LcB@WDPwBu/PM:iJp4#$?
dYPy#Z @j=C@bTua8aY5^<5kp8%$t^Xb:hAFiQtk<%HG#+hdF^jDIZ&SJw#Vi@p^\Y<1<MXVp$equu@jpG9k@pC
Sqki@5 cD%MyD+HiLt\q<#JLAVBt4JRqhei#PEE=iI:FqteSB!qdF++aS*JIPiC4jTw#X4H*w6/4E%BbdV6dW<=
bnQW#j IqN1MEEAI1Wq4^TuTRIi#?*nWd@XFYq:W$i*/*%8c?dGVTSkL<<ERiF4>i>R%Wbk+t\CS/aw:Hc^mcbj
?SwmD& hm$qdYlD>cQjbc<Sn%t1/PT1KJbA*yQQ^KKp1&MTAuEK1%qi6c!Eu8$5%P5@lmLt6@tX:lyAEq1y<XNX
19\6Rp P^RIN8e5Gm9GGC*t$/8ZwuRe<G^^@L!qtqRPMiY#RtXqJ/F%Nl1*G=5E5\9#i&KYDH^mFY*&5QF+ZBID
DXp=#: FSyFLQR6ju11^*e*bV?J/=q9WA8IXNRQ>dw%t!+L@EE6H^<SmAy6><%Z++inEJiVulKZ%\4>Q^iQ@W9a
AJSF=: ANS4hL%=cwdRKDjwcLlTydn?BHA*n=pH!\pn4Nw?8T!kjnyKdcl?=Cqt&t/@QkHcphp&KyV%EwZTunVJ
A^V=a5 PQl$a^=Py+%AdRS*XcBDbj1n<^4!mimeE!ZW<Qbhmn=u#SwuPuZW+1/4quMb#%E*pJ\j>#q<@QVbn4/h
jXqnEj Nc^WyApbi1HcFITy@GnK+qSKP\K+m@kkN%N@JJTB?hVY\a?t5tDe?I#l/QcpCm\iqLYAyLElY>WLcm+i
FBHBG6 eR\>*pb5TQFdI*5jCq4&4=i@Bci!C/^i:cT&jKZ+%pPH@/DK:Pk9PVN<H9%nD?V<qnSRL+#G:knFPY>b
B4Tw&8 4p9NQEJeG$XeClJe?l:Iy5iH?&>B$h>n9j+1Dh%+thcYyyjKZ!wdFa%P//Wtpk5NKMy<aX6eNyY*uVI1
S99YFK J8:qB@GXtD4#+JWR^DVTM\Rqj9i5W/E@KuXG@B:BNB8NaP8luR\WR@WNtAiR+mjS/:E##CSD%P>aJ\5C
bt&dSS hBKG8SYV98n#\JeRFJ/q4ZWtT#nkSl=VM%tkRtSW4%lq5aQ<D4*dhJVpQt1eiq==jPLPDG+#j\j!LQ+4
yDG:*u cWYB44HTjAIKmY6R=PcbdDDRLMp!qqDpYZDhYtSS1ytp1SAD^GH/Rmp#WXEXm9GJ9X=N4%cQ@d9CAK=$
EZ@+T1 llqcJ!ttX\ZM*=9L9D5IaKmtLdCc9*1bPy>icRCFNp1*%pn<m\dMwI@$lwK^E\:QTbYa4c8EyAPX$<SZ
tdR>KP 6MRC$DDq\6\u#9kC8^8n<nQDCV&T>N+1/Em1G?S!E*ii*=bV8laW:wNYbK&S*mVVAYJD/wceNFlDV#tP
1p:G+t ute#pjm55k%d#k8^@@%*AN#$n^qi@QPEM5n4+6<u@+FQYkaitMcm#WLD5E#:nW!Xju!>#8qyn$R:RYj#
d&y+6T B@%*J+SFE!5%QQ>P/PqGaYy1+YAFH^\n6+h%!iwk%AekZ1uTqhV!:QLmXJWN\&>@n*4>@#$MXkJE+R%d
mN+Mbe k!#:hQ+?MHAl9Ka&wZ+C+4%nZ><:@uuW+&=@FD%IcSt4JcjapGa6uwDK$6\iTl66TkT<PiFW/Nm5DGww
5WM#eb RTFm*=CFK/4ip#RkBS=GYC*hKyT5SSaDae^dEdm1d+Y<lDmyG\N\htDpFDVdY#6c+*k$=lQXDDXZ%*dJ
B\m/JJ T+@IFD%!KD&XFIcc+J@!6#^n&yeXYymCQDqVA<*Y+>H<iKY&L+!ZG&!MYhuhd>KB&a%G5VM@dmD>CPEZ
-AH8P# 0005830c5eb001202b4 Page 132 of binaries2.zip
L/qAdX IdcdwAq$:^nS8N*cCE9*G6^AY<lB=*NlYq+%Z&Zi4a<\D=L/nP!FVPG66Lp$*EDDkFMIpjb*8Q^@l>Zm
bGa<uk b=PVWYht\F\cl#m6lB^>J#uTI&?=E5?JVAyXLLJtVXF5TMtRB\lWGHX=K&^in?M9$!&u?i@!LFkyaepJ
pRV=?Z c$VD5TQyc&\<*wc9Z:L#^N6mVVLma^F9FZ$nRXB4c1eMnDK:B%ADQl+e:Z?jtXyWF8nQe<mcG:^4V&n1
MyJ%>M aymwXeLSuqVnw^NQJiR1A9eZH<CDF?#a^j!%Pd8+?V^cK/R/VZd%W\i4tkTa&%#+w=C+mEVPe9t#tMHZ
l*mkqe 16VXcDe4yI&d%*LctMQT^T&DYZXyiN&R/9ALPFtJpy<h#@=^ey8:YK&6WF6w\8GJ>9aXpQQib?=kCd8j
5Bnw<I Bcbm6VBW4:REpQyl&jmYb\&G*nj4tJQ!>YaT1/1%=8AGuk^?L^q\pX*SIT>\\u6hl=G\<inHcC5A8puw
eLicCZ kSkR*^<9DniEJ<P9<XKken$^mSB#ILKdRQ@GRc1/B&jmYN+:e/Z6$TP%eMWGSc/V#c>DF16aIA%=yPtn
FeT+J1 Yw4HPM>8C$EpWGTu*wHnHTSlHh:!$ac*%HQI?5jJ*Q\VWEeuA*!C$eLi:lP&6qn>dRy#L^eAcA/MNJG?
@M=88G t4FL$m^mFp%CbWyZHMIFVCny$$qjM1JZ?C$^Ci>y=mKQuVVPE:pcBG/w1TXZWPJ=:$C!bR$u###aXj><
E\KFyW /cplhb>NQmFRRw/buiAiE#NiENE4&/du!ZbHIR1ZCESdLjTZF\WZ=\Y\E9EV$!l9ahJ@:G9LE!k%TRE5
kb&wZ+ w=EudwkE84R=+Eul5::*l\meIDCF$L8YQ15J^ywLY>*eG56^K:u@G6E?=b/c/tVP=yp#y/+9nCtZGB/@
YQ5e!@ BNyKARSI?N9YXD<uqp?WmDbB^DkRZ:S8jwX^4?:%=a8c%dP^4:=hHWFD<5l#M@<=Gq/CIp\ylEbT^F+q
?tiEA\ <Vq@I1C:>K+e4mCQ1%pbJQw1tAqMnTD$5ZVQHHqw8XkpJkWJN16AmBBkVih*:1dR55Gm?8w:\EF!<R6&
m1GSi4 pZ@deamRa6Hk=I<ne8lL>uTBR=@41=HnbLWCZaClt1J/L9S6#ck^<c8Ynued?d#\GKwDYV%yNGFm5ADt
i?%d6S D+II=D\F?Tj&j16LP8LMI\b^hakpSAqlRX+h6\PP9A*ZQ1=@uKD@A?5AcH94dc&9c?*8j9pGb8bSSae&
HSwGWY &TA#FFXDB6>JI!6@hRh>P#/<JyW&%pSVD<461w^BZQK?!5CIHq!>TnFZW:^kPq>Dn+c5SXe>GI*mEqjG
&\S/!^ C8uB+il^Eh4?H!MFR#*mw<h6liSVh9Fd<W^?RY=CSdyeu1>+Z9iwA*k&/1*#nVXXjVa/bckSP+pBi&>a
=!<@Nt V\$WyaX^4P9G*4@/X=y<>W>^54J+ZHDJFY9y^8PX4J95$lR4C^#Y<F:t9ZR?AY^1dTPtEMmw+Cq9cm9j
*1j\4H 4S$WC4dSP:8YV:iXZy1+GBA$FtwI%k=qahjC5+JaIC8@lw8yy*WA9Y&IH*Yw?6^IQlA\n\GQ#8kIMYp*
INYCRw $p/@/WT8b&L:%k^\LQ9M/Ct<aEyLVCtWj$F+*cJIPM*t8=dL91^XF@E@y5H&ppFkB/u!hC:!Ntd\QYJT
>SX!$9 pLQDeSyFIX#jP=V:$eSw%9Z:HIQ?5q\!pdl:eq8C9*nk>jN#<eSAN&9>=1P68+&nbj@heW!:HA=CcD@>
pTp?%p H>=nmJBpWc?&?$^yPT@V6dqPy$mEw1BBFJMcZi%w54<y6+y!eT&FXbqPSQQ?y%YqwJqXE1l$bkyRQtph
*cehPl Aa!QtpMcCZuBESwKK#5MVc/@NDA&9=nH#E6S%A!!lHRVhRiK!B9h\8WDncilH9?CdpZak%ByEVbnD+FR
LbP5J8 A>QJPqB*TZXyyF<8TKN?acP/t:KTyu&lSuTce9Aic?p9JaiHAWRBJRZXcYN1GW4NJ=VJl>JDIcYX?>Jm
d%pAEJ !<8HFWR=V<6/4%lMStFQb8B1@Bn8N?pT9&?^etCP+6?hK1XaE$@X/\aD@C+%M*N#=Bcacqd&:=jSFw8/
c@CkaE \8Xd$?WXq/X:&tFlwBhWd:TVld4AkY?H611<m/GcMtI$eEi%c+BHARXwF&EcTRy\DXL&uRhkqy#y8dRk
mcq:qm HGBEYXELN#k=GY4pShWmKFJ5<il:qau>ai=p5hmhiwK:G*/L:5hP*\9jilMtd#YyW6Z4SDDh+Y/W\$TG
TYK+F9 W%A98t\WR5N$4DPj&1LI=$YXPpQNWy\#TI&i\uE=d\>+*E9=Yh&:!1#bMhS6LK?H4E>+N1XatYWZ+?j9
uY^9Y@ =+lRmu>t8hZI%dPb@WSkpp@@$1I$+GAGJ%bJwJJhjXnmL/9R=P$9h#$@49$4\<$:/k^Jb\A&WabYWR\%
FeSaS? pl4Ma=HQ*BQQ88@HkQ!&8Q@u$lq*%XED&FAu6q1TdtZ=BY&>AKk<6ZSW*QqC!htEV4dDYWTTq6kD5&TT
pHZPJH YFw>RMcJX\=<IJ:8#Ywhn5ZIN4&q\8?/1IG6$RlG11?d<ADa^FHTu4heDGm>!%&cV$V#%eX1\^lJy\5y
lKpK\d YQIHySG6EV9IuB>dlZLYMpHl%tt/5!\dnJAhNnXtlnQ8KV@JneP>epE*6mtI$6%$pbE6\V8<#Mtl=WYq
&ZK\Ai maa^Kkecm/T=aybd/jDY<:=c5#eQJZd@V/Y&9FSE#mC$>@!:4&W6+#%lW9hudR+q6Y%bki=BN#Jm?uD>
AI#pj= Hw4M15&V/F&PNh1jkJV=mW@AVhdHaBQ6q>Tuh*t9IIWKAyFQAQ&M6>E8W1J\+c?N8G%^FX1GBk1mK=E*
=G>ckL S41FF:8pkp$k:NE>NtN1LpRhb>RbJct!hcC%M&!=!jST8<MYHT^qLNP&$D^^K\R$y1?I#61@V4cLhe:<
%Z9W5& >PM/D<Z!l^?w@Ta:w=C8HjVldw8jG6jTI8&DyLKSaQ&/JH?HpEpAq?6#KB=nl1yuL@K9yKqw8jdIReX=
HVRNmM pZ5RK>9?5K=iI?tH+YhIM4kJX^yCw>CM\6mS%#pTiaQdi4j*6uujqA15&pBJRaXGp$Y9!%/aJB><wT%T
@kPcFQ me*<^W\>yc8EI!KRNZb4BpbNi1R6@ZKnp?/5?AChe4=C$nW4u\BKm<@q$&8&$AW1J@5KWtZwmmmHV\BM
HqH/^h >B5?^BZBQJ6K:@5uaDY#dMj9E*A?SEl%YkZ$?kqwAL@a<Z6d>!DwwZEA?ZZ+^\iRL=XYcem5HCwSl=1D
9</6!Z W*laGiI/<#@FXF4wKtK=n^L:CnEI<?Z6>FJa\L/K!h1J5bIAq&R&wm6QPb5AVd1=GR1aX1lT+Yy!J@nA
jDDdQ> R<4=m!ebmPySym>IenKc<lh&h4HlL9lYk&ia6RT?*6u>Y<Z5Y^BZW:<#dy89Bj#$@?*D9*<L$D9Vqw6h
jjkkZ/ eNhIy+Ed:MZeN^aV+RDaTQ6Yj5/ew:e9JZw:&6HbJ?pEBIpkb@huP5^9F!P5>:+@@%EY1J*<EFpcSpJB
b^4/9C Q\!utTEq&uhn>hn/89ZiJ%!Lp%n/BmDuT46k4#eFinBWH1w>lEGkp?ZLIhwtHDk^9jMmFFK:9qWd/dpP
bDp=J: bI:uGLS@c6CE\6^T+!ek#j8@p6!%FKpPhFYX%YALShw!=ZVYq1CI$N@B<Cq5W>:\Q\FlIA65PL:eA511
WQZn8F mTQw:48>V1Ik!ZYJCRCc@eBq%jpcwqS:p:SNnFtKyV*&:Fdl$>tGB/PqDpNMNkF/He%*+d&dc1JahZ9q
5dt?h5 A95pynVGVqYRpX1DB9tF9ld6?QVhCJlm5TnJLt%8Y=M>:bLh/?1X&PtP\#VpwT?W^C8*4l+bN%TE<wJP
9bmwW8 F&RetA?Ld!$8pK/8Th!Qea&GP$4liBF?I!ATXe@K$+!G?RQWW+:cqJ4^t#hYWNChddaI<68$cQlq8V\d
6#BKY$ awm\hGpT4VS+cl=9#CBC!*W*E?>5?bW%mKtm<XTl!<F1*<<V@QA?QNmB#F^\9#AS<>y!md<BYFqQSqXh
TbFmMI MTq?GTy1ZQ@+uD*dl8nb#h4=>edm<<iIWEEk1Fuy+4S$&*ZhN9?cYN?GbyP/l:VZ8M?p?lymYVud<F=5
VN@H8? lL&wG4Ye!9>N$nyH1:$&ZWqh15wwWX>he#XDmkMdPhBV4T%88\LYyHui*8/bFKpVk$4qGy1:XeATcaQy
:/XuFH dD<c^68\L$Rc$>W\Q#?ni88=?hjWH=Zh&X&q6uV4@@9uc^+6Ld/?Dk?pctlce?ZeFqC!Sb5h4EnMpkKA
BwyI8< +WjtLW:aH5&9h/:jejP4>>H/NqA&k^^@p%*!P%GZ%CMBntIb*d+cKRFTjLJCdRyn$maCBZJ#4%4@m>EW
JAcM:* V?lc/=t*nI!aYXPwpV1daRBAaVc1w>B!?mBWWT8?hy9p:Ge<HZ?Pt^J9@<mHN9dc481XZJ5+%QaA9V?Q
/t8!1F y@QcE5=/bHHeqnMw@hI!wM*?t<d<ke*6AGktVeWbVCtWbZFnn8SKEHZ%$tS^YInhjkn*j+!KnDVT6<Xp
qe6yVI 8H1pJXA/hBQC%NV*8tN\M&:X>\K!j<lt<C:NlCA#^u@hC@^GJ$enXu1N1XM&Xh!+qG?iIcX81R?mDbk6
nKKZ9R 8M%QXIlB$X<BZ45TbctZ5uGlda?J^k$/SE9J$Aw^C?XWhKJFtA??bM8t\=jS!p*MVAKQVjCSn6CK^\Db
t^J?cN bh&DY9tiA>b?^^/L1>T$YVYCL:8ln=*CtEKYkhTCd^mDSN>T>GJDFKTXS=HEuY5wyyS/5wARk!l=#dhW
\aRD=C PqBqyV/5cVl@FEY=pYAW/hF!GV6TCk!@!::8&?tw1n$W4PN46bNGGe&e=%bCLY=GCm<\ZuKC8p*N=!?S
Q^*yDT &5X1Rc8tFcC5MC^eTpnFSlc&/jknS5@Dn?VFdJEZaj9>c*uPj>kM9*@Pu!$1kQ#/BJldq\V?5S8mByTW
q@/l?& N$JejW^Cd=uP:d9kdqZc5%M4J894b/AKnnn:uiPb?N1W4qe6q6GlIAQ^8HJT:F+L?D?cQ@u<Ln6D\:@e
9$kK59 <yGDnL:*bT=jGkLSIJABP=ZWI\*k6nGQ@F%nyywwE!hn5k:K6CWNm<ke>l1IyAbeIaJ!&!m?ajt?LF>h
mnHZd% 85>i#!n\AJnXi6kW%&d8G>cZT*:N+1^11@cKMdTKqk4EmmFC!u8?y%1I>:w\A+T@6ShpT&@IA8n4:FaI
Wc9SjY tGmiPWX6FXP::^6&dM<TpdwmbpHBDHQ6KS^NZGhZe%&EuNMwFTp<V*b1weu<w=IMRS4AkeZ!VHy$kTSh
du>h^V jnF99Yc*=*!b=VqiJqbE/w#TG8m%&YR$qNe!c9*nStAunM1t=pTnBYqhb&L1WM*!l<p$E!jc#a/N\4Fq
9%MwMQ %Xcbk^XnaH/cF9ShwTE&uXYZ=QYk9:#RJ+A&ZiCc=ueAdd!WYhT%<RuRRJJB@aa6lk!kLqjVDpGb1S&5
i*W?S# eZ6uWPmMX&lLVD6T$^BXM<jXi&ieHC?p4It#$jPY:t^@TYEt$K%l4IaG?bBPA/:pCZ^n@QG*Edj+jeV+
nTt1an BQ^>DAD5hTYFDaPVIn4LC*^mc64C%D\*+1^u#S#*S%undk?a944%py1w?6d=\wEd%MtDV*96jtWt=TSn
t\apIl ypimMVh$M\SP#bBbe@itD$L*V#uiH%Me$==?H%K?*Q%*mnI*l1H<8jFn1yqKuH%%htGL?np4#dqdT9FK
IyiVj/ 6i$LKIweX>e4JPlj$D+$^V!!Z%LH#EwY*?%aVqQS6=YVb\/ZR?%c%V98?@Z?!WH$VCSbZY6J8&EKQVn\
8htH?K WY+8INLawccTq8ZQ!4<#4891aZ%W+bjlyBkL:9plhmb%VqFnjEhw/Jth\LH##NWceMAL$e%>9$<eR<Pp
>KPZ:e KJawq^EaW6cF%X@Zuc<l!dHe?^=cZ^p##L+lRMkJKG^b*e1I>p!ZX1K6Ru*LBW*54>V+Z8k^a<<FP@5e
YDQwku L6Gl6WAcM+M8qieGFAB>/&4W/mAX<A9#/ka>c^y#Q<:<1E<T=yFGpR88XI+hV<EwT855ViMY5tw9c\FI
-AyGH? 000da5b047d001202b4 Page 133 of binaries2.zip
W@ipGD K*GBC9yaV<i*4Iujk8X5#Xc?kun<Y+W+wSP1lWLE^+<XQu<>T?c=&/$d4H$ynElAJJCKM5&tyi@JjIt8
u=a^Ll @6>nn!uX9/&bek?CVu@bj%=?Ay?L@%mRXEAKcyb@Y%W9FlPQ6<\V=waJQ4S<yCa*py^q>=:9^WTlQpJ>
MAN8XB /q=LmR>1Tb8\mG?<KBHTL@Xi@6A%BlFBXuMFXL\VJS^FW?T^F1=l/NR+KjEWBePJcV\e!tLkY!V\@AS@
AkXWHM 1\Z=>CW6*IRFV*/DB#Lq1/\NthLZ<SLlVSPKAjy>:VtnnAFT&ntGK\Bp+T$!M\j?Y&BE!$TSW\9*Wh!%
:\q<<Z GNppA*XLBT6V^tD+L%\y6%N8V5Jq6Gm>PnMGWkeELu#Pb&m9WDW5VX8E\iyepC:*webN+\p%YL9kC8IC
>aktVH X8e+YNAwZL8L<jDim!!6:wd=^tj:G1R6$yI?4KeJDZ5Kc>?u:?qZnSemenLb*P^S/Pc\eZ/EP&?/eR@Q
@Y/M## !/DYG8n1%^Bh$a5^VeKK:MhXXNd5&>B=DkX&%&XN@k!d?tBJw&NPC=I*SALAh!bnLW<ai<??tj5p!=%h
wi#6yE 5FLM&1^Ia:WPal1YJ$\4D1K\Njh9dG^Dni<mwl%jmSy4:>jR>\yHpCQGqS9#%mM#/LiutlhHVkjpdRbS
RFn>1C hHTuHEt1:I1bqLm\uh@QCc<MeCEG=D+BFZ+Fu\Aym+@^c@$W%5P8R9Xq^R*Md^Y/p&bkIBTMQh$beE>:
pmdLJA /i*V<TYupZc<hk@QJmJVJAimepT^u1MFb4A/NX%MPuyjFH+9>Y>?=iMcGR>ICRT*RwdWA\M48><H@t+9
?tZ@Kk %$<EQc<5u$8u6*4Hi#1qj1YpnmPLpIp6FeRXA9AhZYnN%kT=WZX8h8m*GIpZpVHJ:*6EY1T1?*$/dla$
dpXA&# cnlZC6C1/wt?Sh5T6Jt&QmS\N+mBIJp1&aDH+6ih%SllLNnenKee+=+G8d99Y&MH4jc5/^XVHIw&beDX
i?V?&c *<L&JBKA&jeS&<u<VI&VPJJ*qk9E==9Aq$1p1ZT?p44Fd$RZI<X*pLpZd@\wiqiTZ5jBpwWiVCKyckHa
@?XkN@ 1M^9R:uXQM9^>u\C5H4PbbS:6XXP^m^\4Cpu<&>bWIA>K1JJiR5J^nHT>eINjQkY#PaW?>8nkuAV99Yb
YVmqL/ uidi=chCKjja:Fd^#CNt@lIQ\=G!&+$:Rp@y5:id6EZ/1yXBB5c^L\$*dWPuKeiKZmDh$c!Fq6GS1#pZ
XeH%TW uIwb>^Qq8%a5QdFIph+aTR&>EG11Y9w<&!hAQc@=IwImw+1+HYtmTG>h^uqIlFYRNc=M/XFm/K*ytQ&t
e<!BKG 4/haMI$#L99LVXLuwGqy4ww/4#6E89?b+M%#pH1AFHt<X=\!P%S9b5N6?ZpV4wi>Ju\BtF^=I&Yq/&8/
ML\8S< PcT$PBjTJFh^@*eE8A<V%KaF>XN=AyY&TAX1Kiy4dVwP*kDmyuXduH>j?4<uXI$ZaW8k?N>Y@n<jV*=<
k@Y&yu Ly<4wn/wB@!SF&w!ma*L#M^Z$d?n%Dwe=$jqeeMj/N>+MiEdc:PN$d#pctY**!wJK*Whpb1w?9FwGB=A
5FK\C% eHlnZlLBGaQ>GMFHuBaQtX$RSw/WX<Fc#Gc\pW=Ie/WmTM&V1AZ^h@Q16>QStuMh&>D99h\nM#:BVEp^
Xt*=l? 9yitM*nE9N?@/mb#1V!8*bnAda:=BWwnI:qQ8&F18aChI=wZu#:lqQ:mLSWGcccnJh!cI=qIwt!FyJ=R
ZTq#jZ k>hNd^VK@VApIKeye>K%Ybqa?*X8iXF8k41ClwERGkMiWMY^Dt4q%bSVnN8HYq5j<pW1QhnH58c1jVuc
/&/=8l A%hF%edJnFlZ$F=bIZkG+mJ=4c9VJ6LTiXZK5MLM:pE#*#\&h**Z1ePi?/HK!W:/euy/R?wLWl4#Pl%c
QJZ?mG m/Db+e&MD^HW#jW&>MF!w$Mqk91+C6Q>tHppnMcC19^dyL1lGK<%m@bbJ6m8ShltN^cw=SRp:HV<K=YC
Lc!>k+ m9EDt8IZ%155lTYjNnhQ9KdWN1pXG9HjHy5yL1peeRnmjLnZh&8q86L%#mPT4Yn!L8J5jM%BPuJ$l8M1
jJRZRe 4@4ly6h%98h$5@RVMGj\u4*VSZt!>^1nu1/w?*5d&Jk/DRyM#nDaqyMd@:$NHKWdqbQF%Ep8J+uH/FM?
TNyFMJ *<RiMJY\K!q!ccA%LhNiZuaZ%?qKWPD4FpeYTH<CCM%S/ba9B\VC@&abYZ@#?$c5tZES>jwnyNCmwqqq
Ym1m/< uIQn$^G*V5/Fd$JK*b6W>%GjkM?b$*44hmwMJ4+&5<Aa=\yS+Mb<\u+!iAl!!!tMRX>ME5pF%\6^45L=
pPJVC+ Qe6bk#$!Wb<^A965d^Zj^:==#BBtLNRWcJtwB>S649jR:iRcN//m84tck+/tGNwY+=$d$h\uQyW9k*a4
9Zkt%> *1>H<\/hYR#LD#y$#B?eC+qj@P!lK%LQyLC9>pDY!bwh:EnZXNP5qSjQ!T#S&mQGtmnlj#cn@MijVRIc
cV9dWN !%!jdQh>lWtIw$eu=X+y><b\Fy\M/qEJ5N$8FB&1bQKHWJ%Qd>Jm8bAE4<TiQNM$?<y>M^hW1H?w#IYt
dBp&Di PBRPnK>MHRiW#=VZ+c/@D8q*RWRnM5uIKX*!R:p?=/aHn=JaP\#M=/4#1qih1um=dtP:YR$t^5<tb&#W
G/$Qy5 eKCXk$Nc1&jNb<Q^\lQbHJG%i^LL<V6Sk@1B?k&WGWwXAbE1k8\lTM@?1NKNE?cn*9$KK44ACQFX*kkB
C!<$j& d##<c4iLw!B@<dLIw+Bd>cclVwQiD$%SWwNB&tF=PPPb#bQEDc=+A+&6Iyh8bM>6A/#tQC:%dFhaZF8*
i4XQjZ 1b>F!wc5k\wpJ5Tl!R@d\@Xh5$9q&S>*WiH\#WXNIQ%tT9ZDaIV6H%qPp6A9FhejZJ?#J\XV&NKT5%qc
%BIwJB ck9+88keb\\qT^S?%Vd/*?Y^V4+$i^WXjttiTaqJW+XHbT#\MVDNKhRAy*Y5Ya*XMGRH&MJJ:MiZZ9jd
$j&Py/ 1SnM5$+WN:hHdnqBV%&Zb^b\^eDLV@RR#YP9HiZAXm/^iIX>cTEe:C#$AM/M?l:l44J^#qF5/jdKFpui
REDcWM *yk&DpY8cdht8mjqc8ZJ4F^&R$RRL&5k9*n^wKZQa8dpRNbYm1Hp6BG@a1lqI<##c$AkSD&+SlithDJl
&Ne^4L 4a+Sc+!RXHC8c5FH4$^/GZu&$4C6Hk/8b:Gjl&SIi*bp:cuH88p5j1Htw9HXmY*TZJRYqj1GJ$C@B$9y
qNE#8K qihL>aAQR>ap6tMt=e@/DPqhuX?qpaM8TGYXqW&dFYJqk^Bb44tZeNtDh6i*B^GXCmSa=ipHuK%G4X6l
5iB\@M 1iQl$>l5p$5*Xa$dl\/dcb1QA8mjAQ9Ce*j6=HW\/#uNh!iT6Pt>QTeCi9jdF%ZlReB&h%lH<H=AlhF9
GqltPq Q#Eq<yH$i%?<A4hT%w!?p8jl!cC\#E/>JH8RADPF4*k>Ki8ky@K8$X!%nm^8c4#V+:WmaWX/CTV^lJZY
<!/Ai* D$>Ak%89G:J#K:Y9:m=:pCuXmTemuctZMDn+Pb>8$HEa=wcQXe:LtNhp^&jYLpXu1kV:nT^lGNIVVVaw
eWiMal RC&?9\u<i/Yl#ZiY+=5?$HSETd@/#9*ISBpuJ64PmC4?mdq8N1#jJ*D&PSFYyA*ld<l8YwI4BBHAZCyh
We6LE^ VQP5N4C^^LiCldW*1B5YQHMQBPS/Xm*GE/Kh+bJl*S&NFZkhhniK99c^X<&KC&>b:AH&Q&i8<teLBN4n
nWAGpi 4NTWn6*9<#t<F?:Z!htXhYVwp?t?thNa%CdtSn^w@q//^TH*?E@@/e>DRHPZhHSX^N+hV6#9:pSay$wj
$#J/CY lTGT/D%wXLXu8%&M&?1LhLaHwjb&/JaLpVJ++=ty+yF!uw#&HXEk89NuKFp$Pq$C<pp:G^MuL*T1b6wC
Gbeaha X=l^kuT1>8:d>D?WFp1!=64taq8lK?i\kBTqXc8E69ij*J@*tE@d%::!<cFp^H<\KE4hV<#c!B8kwShk
<bF5LL 8*Yy/8M+#Dlu4C>4Y5B#J1N=aG#9cHFiGCBF!=VcpCRNFIdb&=aiti$Q844nBt+@P+W4LdewFiTTIWD^
w^b5Gl 8SEKRMjbnMq^&hX^M88ebY!^waMFl>CKwI^<LRCS/$d+918MbXct8?qq45e8+?deF=*y6Ihcb4mlMKS6
qIZA94 F+adjw5\<uJ$IJDkJ:DMRjRYjQQS%wb\RBD@MDZ1V@ntZ&$9<k!^@?+pmiqXeS$@<4L4<BVuqqnAdb1E
W:N*=l htyIN9I4J>YQLh:8%Gw?:>n1e@=$ci%5CqmPLCc^<=59b+8^DYZwC%\48LLN99\Ie9mp!6mJlq^CyD:4
*Tn9<I ?#\/Jd+KXJLkiI1R>FLHP*n+H#>6>Mi1/KVLy?:F>e6MM%WY#Awk$iw1^\wJDV^*^NdS^DNKkR&tVSnP
:k@6M4 <Ry=KpWAbayLw+^EqJicdZ5Fy4th^R6Vte!VJl/m%Pi#d:jSCE4laB#YpyTTXQP=SbeG\ZSA^B/q:ki1
PNDcjB L5^RN@wec+je:quyy=+E5W=Ji?@5HR*LeAmG^*^HJE6kKVYTt+$u<G6N#*Dn9K>m8<^b&aRPSc#^nd/q
TSWKwQ <AKD$h/@^#u#qbAJ8q%DEKaCK6RHSadjT>*8bmnhbw5BNk8aqHHcK+\d/kDjtI>/1kPBIbl$HuFD1:C/
8#y4k9 P8&?VQYVlnRY&QVSTTeIm@%w\VZ&#BEZ$8PNBM*JCmVcRW<>1l+9@P*=p6lB:!EILI/+/A?nYEw/dTln
$FQLP& dtuq8BKwH4&mdp68XX>Nt6\n4=RbTpiemIhGS?>+YbWH\h:Z?L:kZYMW>n#alH<pW*\C!nXbyC\Li8=n
W!VM=@ a>^9P?pu1PXIS/IcnhJ@ScTWGe$QaHR6FVe6FM#9#li*\$dTJw<<I8qNi6?iTmBd<ti/nc!hy165?84:
VQPu=> M66anm@IH#C:ZH+H+u@>99>:%j@du^ewp*ZEpp:k!yJ+%Qi$QJNMwiiwd$#^yBZST58$HiaKq&LpuH<a
Euilib $jyFa!bJ=CI#^m>Jw^&K5kpk4Z4@!w&qWdGV=#K%pYm/Z+?1:LGM$uBcij&DBuBy4&St!VXVI$5jBJ4u
Di#S%F Gy4/mChacJS<c*F\wS89DJcQP^\ZDuH=Tenp1EkVNiFh1Hhch?#$:Lj%jCFwyc5:P4P8a1S<a:5%pjVK
uymQ1q SbLyT/%yknn+mN#wBKIaJXeG#T>mT@HQ9$IDuYkpcGtL*/%Z>q$Sm=y$mA?Q<dQm4h8#+q\%icH+Ktnw
\e:^G^ <X814uu%^puE?wywX^FK+>5KYKybep!/SYwQ</!+4w+q1WdQJDn?9>n:C:A+8t=dFG/55edhQeG%$TCN
$bYS&t 8:5Gh*iT+P+TLBDB*X$V*N%hk$5CARIE/E5?&iiVN@6p:@jee@::*>5QD$>Xh+&1XXXn4duYtuQNpaDw
:ttI+/ yGnPtQ>AL1F^yhewGq5#!<%W/tPbKYQuyVP=Gb89bt=X48=H=#&lujAqW4m&6K^G1wXEBnPP8SbAJJ>e
Y/ZLH\ 6F5mkDJX*/>uy#*9@KI$V^+HXnZ*VSP=cNB::5M/d9ny!<uK$mMN/YnJ!6Mh1>kCFF>JRA+\t+JAd4y!
S\iRM$ tEBSY6&HFe:tFW&p?WY$DBMN&<K&tM*+mpQ/wX=E&9R>49edFGRl$j=ym6Q8i4?+JtFp<!Seu!#MkR/C
ayXSPC mQeG!8F$aL=C149e9>V*ud@Yh@1@%ujy:Z5*X+wlEa1n#IRH%Y5w\EANTF=!S*Q&$KV@RQpJt=PMZH9:
yV9$5J l!wB#a>^Ba1%j9\b\Vdjq4h//@4N1jCyln\!ic@npj!w%>em*u<CFCJaPN#iE$FuD>tQ9p?>MKmL6GH1
ENR9a! C\>$XSE5iPInJLN>4aG84@FqAmZB>:qJKHFB4Xjl$Nu!RhI/R1\=EF8WLn4wE@dZ=aDKZ5P?%VPtYM>V
&q@>!\ ppmY:Yuc=B:<59!D\V##jApL9\/M8hcLaaFXKCAdN@GAW#Aye4^\wB\p/e%kKT4?qKWEWiHFaW8I1PSe
-A1^Q^ 0007a32ce7a001202b4 Page 134 of binaries2.zip
6Xl#5k ^8bnG^Am=iNm^Dn=S8+eXc%ZJ!:=c!i^bdcQN/uS\SjVR<!AMX4+G1AH1P+HTP:Hba@keJF$wa&ckc\%
GQA4wK G&=CASBQ9hy$ZGWbWN@4VuJh#<K+hp/I$PaKC$?Ve$duS/#8WP$4hc=QD%?%VJLK$l>$Zp/9>\tqiT&b
^qqlnQ ^EPwbRP8\qCcN>?qwM$jq6?CnSIlD!9qtpdE\p<R@cQ=S!dWlpSKZWXCDJ$ctEPN^H*%?#tGn=i>J>^H
k?=yVF pW5m#=Y>%cSmNRK=KNa+=K15%YQypa9*jTNGT$iS&?T>yl&emM\8liSV6*9\tZ4>QhnPN!lY@GinH<j$
8qPPqH meEQk</P4<FML!<>yl*5q&Vi*i6djycSptSed+t?PdNdNVyjXw94YybQQiTMyG&p><=BhH*4^++ZkcIV
bpRCIm 5F=JaXj<jNSn*<DGXX?!:=MPJ$&q<JGE:ZRFFMBG!9YZ<JhRdD889EcbBtc%%Zc?#$/1tm8quFBAT?T&
V#ywhM =9ckn/P$$YB@^S1JX>MH?TSGVXMq!Vj4+WYjMACc?9uKT65hSmuF!pZ>#K<ZbT$/t*IWnSRa>C+w?wGK
9#ZbBy qHFEyEZGJV1X5Rk&H/B#Kj&XC<wq@RWLQudKVbpBL=8VJJFlM%RNH$ydZ+Jclj\X&#?&BI$Qb:nyL5E/
Zm>XW> %8NRq%EF$BcJcF+Z4*^8GHN9?TDZHQja?/6Pqan%RmFe1qK6Y6D8S1:@^^H>/E=C4A&D8SaDJ!i?m6!H
j/FkPt p1=/9H%4ti=V1\:jdq/8DiHNRA@W+W\bLY8YPYhT=EA19u=^dYB+htFnJN\4lwcb8$/Y>y*Ddm59=BRC
qQC\^$ yVna\%:?F/+9i5P:BteCutF6Bl96GTAyiFcBM?$XCc/PQqG@bPH=WTKY=@T1y+cVlFA8wM%CC$GiuC1R
j@<aPd 6Bt>IJQ<#ZPD?Y&d#$q#uGYt?F<DmFQ&S9DXGQRwm^j6DQ5/4?cNnHt^WF6qJFl6PGKCD!cGt=k:/mF!
hdCN%8 J@W99@R59@qK+V\/ew*SbLu:CuGF!$$a:yTw?RQMh>DKiMCQMMij6+MdGF@Tm6Fp9HSZ1:&V<n^6>RN$
eQhBnV @8V!^pRy9?V=+5nb5w:RXJu%=kVH>b5*M6e1<YFBhaKNB*JdVtY&aklJRy#Tmi<%5XTVy#k$Q<8hnB^n
hhMWAe KG>E&d/*p9hK&ybWP/8hNe5R1IGlwbJEKQHDM&y@&QTe9=%JppwV$AuXW/8SiSId%KPi+B54:*w6W>nW
B9y5/& 4ZhZuhSQPtCYknjbaG/MJML8P1uFnSTFJ>WJAeAee<#iYFaPM*=mc&Z>^C#&Wq<@CY&$VS%9WTGmZP:c
e\$\=8 FSH:umAjCllG?*RZ1Z^VmBe$NdYR&6Aald*MEa5uT*+H/TBwiX?Iup?Y<n=>ZmX>T6c^GYuTl%?5hMVF
wJ4<48 EmY@iLm:u<LP6%VY+<DRJk#X6j/&I@Zy>a?k4LBCR!lklGl?J?MVM<N4:Vbb^@+bY9dqyPwt4dLa#uRZ
Rp^p>5 Wm?E6FlyX</<&e1e&$=jATWPLtpMnNk<+jSEHed+Gm?!F%8*Y6qi@1TXH8bZpmSS6Lt8n=!?%^HMPIaW
8Xi9N^ D5Q/SW>BAV6l/\<TlZjVH/AV^@+=F=>8VBwj/!pDFADiNpCaheCDcP4dBRB\AamNA%j@9FRFS@K^A>#k
Tit9$! $XD#M56eK1GRLKC^<X1cdWtw>YXMenk6Y9kh$pP/j1p6%?K6LKlK:D^<\!w?1dcI%K!TL?m<e5p!1!P/
XMwtEh \nBu*RZL%5p!kWPiL\y:Gu?QPPpd$%eAeZGlAYcn%%X%^Eqh5mdc@awVMj*ue%iV4#A@GNj81p6LD^<1
jBjQaD <%pVNN\$L9Eq#BquQ&?EXHcL#wCKLk*NRpi?E#9qJjcSI=WRLVbnD9ZS?e$<a%8QJj=ab$V6:q4Xmth1
QWReXC mAyRMDDQWt@58!V#I^Z+TW/Sk4@R<hd!>*bME@k96R5jh>GK4*/E&Z=\c4L<?+aXhQKwej=Funa!YW4J
w9pY+< PNHFDbiKd<:PPDYEXE8pQV\WBc*wKQHAdWY^pNGw#?^mM!a!JhkFZd4\:D&iR^FVYMQ=MC*YILNjeq#&
//1J9q i/F+jB1Q!kaG>d<FYI*?L>4wW&TIa1AFaEjywHlpXWmbjkQZTCTSmT84HSJYp1jkFZ/@@uJG?8HTbSwK
1>BpK! &QA@i9CHVl%yNdL+8BWa51NML\\#cP/nbqyt@jmc>5<lE5k=c:d+e&MNYm!iBSI&PtB=CM9JA>/qwVDN
M9=tq: jDiI?>=&V!GKwqT1RLe=Ra?L?k/AGTIqYy1E<NKM^cNhc:eL6V4@LMp8Zu1K%wHm^>%:aBSTASRkmD&@
1@Vbu5 6ICEw!!tj=KcmM9YFhd1Y6p#\9P%=:ZGQG4Kc=q65a8<SM^P4SJSSEhyy/n$&bu/@cuck!H#JPNEmSBm
J%PFcV KSX8*jq$*BhSGZ+q=Yc?=a@%/:pPLZ6NGA+VDeAZ#B\C1@\>NEB+Zau+b>NEMj&Z69Yi/:?$k^5+Z6L?
JtVZ:8 8M9iiJGYHlIVcj!cj4?HWQS?D!XP<cupT6^FWXG?h5MMh$Ek<XaQ<uw5qmRkL=6&X?hE\qm:L:!BBn%*
E!t&kQ F@<mYmjZ#Z6Pp>H$anKj@q###e$4Cp\Xy4u&bw1jEZaw*QL*6p9cln!D4MqTbY$jaWdTQ9N@ta+/Wdy*
9wI#tp i^#kyBGuN1Xlm!Mp6XD1!ck&yZK!L\Tj\XGRB&<?>R$#<>?Fk=hmIl!yiMw!XwTZWJqZlq#b1+b?5h\^
MLkDeE V>:++nPM%p8NqIKWYX?lHt6NPXe\Hpy9+JNMDQIe<HC5u5ySmd+$ZJETC^cC9DN=%5441/Q?=ZY5d&SZ
4+G*AF &aWH4kaH%elYckJSwZ4ai6H#?akjtdKNnJ:diH:Z@uyL\Ap*J1CiVWuM5=YLQ?QISlpkqE^6k/yTnLeW
mQ9?1$ El51QA&w9<<+j\cC+*=wmnCLG8J*dGJCEE^mVN5Wy!N$N=+lS#6&aayXN+ncD4K=DAqD&iSQpCmLHI?P
I^BE/l ayKCwhYI1^QmLQeR<k&6jn?1M&TMW>I#GhF<\1&:G4p=<$1wMX?4=HCydW:d^4F&YV>Z?6C6Ti>eMG4T
w!R=Py *+hA#yn6DARFZLw?M99#<@8*G/NMP8@Q9^?PC6WQ9XCt59QIXm8Lk9M:j%+@e4>RjuLcTJ=QXl<c+/b:
b6AGDa c@*NaGCF%+y^+D$6@YN*I%:B6*!5ah/A#Z=V*plp4jjyp:&%pp+@<w@*:GPF!/hEJd+jN$M=dRW!l4$P
S*Q56# F6Qm5NW\%cPjPb8YFTb11R*q6Q1Y:!Mw!ldbah$db?J6^E\8J\6ut^!E/?y1MKARq*R+dSwhHYm@TJq^
SQ+!/! dem%dckwq=q\?n4h@PWdmjFku9XYpmRkYc%D9Sm&tVl/^A6dIt+y:H%?M5h#lYPbeyG%GK@4MQ@dbl5w
PbC<yM +J#6ae^b6?u>V6%SF^uhT/IC:=M8X:4aYn^Xiy1Q@6CbnKMuJ48?5GJYuER?whS5P9:b66ISAPiKy:qL
FFI&BV p5!e#\SL=KXXTcj/iB4D4<\<CM%8liHpBq$cqT@iRAGHBVA#XE&N:C#J&kR5VCG8nlX+Ky1&I^Lln6!*
^kpey: #pJ%A6&bH5*%*y*kFlNjjkDYXT/5t6IDu<QQ>eXyFBi9j/+9=91=KHtu@=:&5X?w<HNS<5*n6:K<FJj1
VQihAu j%&WdPA@yhl@4#H/9\uVpcdX^hR8SQN?S$9*HT*548?M@5nF\:idbFLkTXp6Z&QRS1kNdFyLp%+ABpa>
&=tGXk ***FX9&>%IGNy6w*k%JMj94YJ4BR4/?C%!#BQSVk<djF%R\u8E^aR4MRpdQLu\Xl#*k/5>VZiSLcP%P4
ue9BaV J<:W841T^V1A!8G9H9?D@QKK4=:dHh$INR!FIl^%5WSty&Nm@Ii?l8j*epVwdHK8*WMGnd/TFdI8+hya
jy&<Fk pR:YqR*@$jQehdVNi16IQS6Y5+TwGq@HnitqHAQ%\?mH^>+8FJBZGu>dGkBT9*>^SXna:EbY^!tPa:mC
jNKmth eEqWTNJa4G1EcwBt^X4K*hZ9=8RGWt!XaV&NS#tnRnMunj8S&LnmIuW:^bP>*#:dLi/CLWp\X+GAqSQ/
X+4N\e >8Tyw&SNCuiwjPT8dDlTHu6HYlyIV+I:j89T:m^aV4&^uh$lluQel4TS#RN*BIQ&hudkFAK&5YZp#V+I
F!V18\ Em:/>PXH=X?Znniyw/:EClNlub=cJhpX>h<1nwy+MS>SQNHPmeylWSJE$%DWD68i5IG6JBtMLmGI>SH=
*u:^a% Mu/ec1aMa5?aaidpHHhHKeZ$1*ib\dkiDE$k?S+%IiXweet<<TdQLnPBYB48R@>lKD#ckiLSekWQVEY/
J?&jiN 4tYRmZMyGeqSdanq$?<yib@n\%*p64MFitwp>Jc&?A#/D\p?9lWA1p^yIMh/9&8AA1!NCqFFdR+q*h\4
pp&qRC D:91d&j:yXL\\5/>EDHj&nJ^>*lP45kXFW=c6nbB>IN1ppbbpJlq\C91/%lt=iHi9ZYj\<k#Wa@mEDBa
8ijGhb C&h^Lda*X$^m<>8t>HNZ/$i+M4:FGBt\p&R+$u*6Pe&&@kLiu>4hy=&YTeIwN*BEcJ8C8h@:S5?H4n&4
W@^YXH ?Tc*5hp/uD%4#iAdm!dH!cE>H<:\mnwS<9^V/%^9Xpy1Y$Y1%4iQ#Zl&$<NDQYYGj*1*8HZa5bbhS5Rw
c44=4^ ^y^XWTuK^G*KYnA!N/H@u9FWD8iI>F\9+TmD!$Q\K?5ckq*EkV*wZKy8V<Hkb:9GY5*eRWdu6aTqLMRb
4GlTHX da4GbV^4m<l!1&nX>:6EV\PS1ZF\I=qW#4\V!D<\5<=^+$$>1a@cP4>8Q/VSb&cAa=Lb$b=WG%V^E!=9
KVnR<I dHjY1HSBmQ&ebLA!+QDEbImKwGSA8IJ9<uZaYmq=<F/wqq:=@X!&MXXV1l%JPK\$uY&ikTSMqMb6uTR1
#N#QIw w6QTTeP#Ed*!9yke/!<Y4k4ml&$d8wSDJZ6VcFlk$mKBiZRYLS8HC4@1q+JQpBZy1EXW&Awh8*lWR9%t
1MdhpI C4M1+PJiF4Pc&d%5jYM@>>L:9a&EDFuiP=wpXqk/F$t#h6HKChj/q=tbVK*iXJ<5p$=T#EILwnnL66Pp
6L+V?V Gq=9\BWZC@H\5a4wQhMj4*!8TFV@QqaA*lN%9?iPunwZZa%mwRJQ=@DLT&:n6lcPTPMLZ\$X86kh4MEB
Ej4mnC Z$M?Fj?W>Z:ER!8XwF6/F6a<@#Lc1VLBddGQKjyS=+&9HSq6B19u*PShVGnH9X^FjHCpPmTQ%GV\XRt\
tYY6RA A+YZ%R8uR>tKdTj5ak5WBTMmThYK9WInYclL^Vwy+hKA^Tn4TpTH1CW5^/X&4!a/!GaRN!BW5dl?P:F<
n*ACBL $<XQRaI%Ft$EpT?bqCdpD<Jw$Yb18IY++$&%euI^>JX4Ze5t#?q>1Jl:k5Z1TW/1cek8tb^&SL+/*L6?
mG!tjV #Hi+K*^A?%V^jKd<W#IW$Nq+PZTd$un?+b4uwXt&eEp1t6Vq1\Tyyta/ANkBRH>&1LW?=L?^jL9:H\hB
E@L9#@ =\<@1VW<1EMB\QX=y4@@98MZZ+68nuXun5A&YAIyl1*jb*S>?Q8%%A/8dEiG!alGDeKMbYED*u%j5LmZ
?b=iTk Y:=S9mQ^N@lW4P@@PMIIhn4K@Q8=66YXc&P>?!pRm5Fc^w\>6YV^4ub^@*F>1d/FKF^c<6#Z@kb=$!e$
S@+C&p t4E$Y%G\JcZ5ALRAAPu@PF9c*&@bydJ\ecCNNn+nk=^=SKw96:nj>?@Z49!Dw<5LF/8%4G<+!YZpPSlq
R5\eQC tFR@LtN#4Q@H@jL?\%MLLjh^Fm!YP:ih@nI\X8!E?W$1HlM^5AW?KkMKcPP>Q#IwXYj&@JmyN$w>kDWq
VabQ5% <^:9$TA5%>VeJttXjL%kil^myaw:PDm1H:caj<Xm=yJ=KGQXu*R$Xm$kj%wk5E9C6Ad<IYH*By58iMc4
inChl\ 5SKlaH$6\=HD?/p*5ih6!Bk4&YI8m^PE#FSQi&:>S!Z/Njw#ii?uuE5H<@mdP$G/NLwPI^=B!t1qFCX%
-AF+VH 00068215703001202b4 Page 135 of binaries2.zip
wAQ=4^ y5LE<@tCHI%#QE89i?bj?C:V9lKTThwm*E:9!\F#=k#bRZn\Pt%wK8iRc=4Ki>d1+XM*5qGS%C1QQLTC
#CiP^T Qqp^9H5D8W*y5G!PP4YSZ<aiJa*a&>VF<5Kc6nZ%aq>iI#a<TMQPF@>/tTZJYpKD@a4#9BJG#4YAkam?
l#$+eQ 61n/R$\6e$ukTV</Xq>pd:6bT^*p6CqwcdqQh*QcK5/GNp/&pLQn8JhPN::LAt/LciqNlj%^JS6Ni<5W
neJDdc ZabPb6L=T$jcPFFWl5TQA&:%N86+^tTQhS5%pK!:qHBKB4NIy=&1e<yaFB/Yy+Qh?6c*bk/NheNAW*uP
dlwXCD QAPbWLWu66hZW:Je^B^E^8hVpKVb$Bw#PMBdTJhXbAPjp:$pl6EqRI1XQ>dm66JW$=#jnWmVWm*a!Ny#
:jlLTm P*#%y4T1t&%c@EHH$i?H$\@/$X64@&G$<ZWHKMCC/JMm^w%J<+?VV<i=9AjbWAA#4+l9+*&!=V%abCh5
q#\H@= :<8n^cmJ/ha6#1y1j64X5H/qGujQ@Nm@hH\$\aZ?Q$?q?>lbYu*5EmlBAXi15ay&M=JJ#%BVyYBTbya^
<FAt?t SW?St5clp\emBiF*XT9*X+@\#I5JKCCX=MQH=aelL4<Mm9N86?@L@w6TVu?miP9@^$>9WncjH#y+/@B+
bbj1>/ G4cL#u^@/XWXD?:Gu?D+\#Vq&=iTM&lqR&Fje*wWnHL^1n?YM#AwL=Qy+\i4VC?NVe@kADGq$B\1@NMi
9<>#@X PM\i&k9<i#>h^L6BAS1%$Kp*>!<XwIBw@\Q!9ahm!>84^/+yQlR\JVS?4#b/ieL%\QLaE*4=+Va@<&nJ
yMP+^# /p+jCyD=LuIy##6jN*:h?JB+?nMnXKZNl#Pui=wXKGCYih%wYtS4@Xc/?Yh11I@@iCZj@=?/VJ#<Qb>A
HbPIum <1WQZD%LlT\W<FwZ<=:Mq5Yi8tZiTJatCL:/VjqV=VDMVTNK^B=T&VPQewJ8iQ&FA%t?q/P&Y+dTS$^e
>qPHC9 uM5!KYp8QXKt6l4F%!>jciD^YiW>CVj#\t*+*5lL^=JBd?y6=ZbA^N<YWKby?$uNVmpwe&d+H?>NBD4>
Y#Y6XP @=yH*/j<5lCMZWKEY?jaF65?m1AT>YHXuXA1Ta@:ZR>RI%c8ElnLtn:>Xu4d5\HiMbQ58#&eN$6EqYa!
T$8LVH Jl6@5*AXAQXb<8LT4K&5W$%SZ+wRw#S$<R<#8uL^@:8kCjlu@6D@^$wQG@jB$YPy>EeSG1Q<SZyapV%K
TD!=h\ !w^K6JW4E=iwq+c1Kt8KAV?Y1$YINX1GHlP:q!NdNI*:4iDd1^?kB?jXMq\miKL5kK#CZMIVV>QkRyw*
bH$LB% a>NHw$5udCC4Zu1*PH$ll8VSMe/41$\HINVI:N!KX*I1t^FV5la&K:XNl9EdL?tWPTe@m#Ep98AIkN9I
A5d?^W ZMwZR%S8b+9b!t1:IRypR/:lIT&e!IZNa!<V!!9kGFF:*<AbwM=M$8Awa#<DFE*/nI5C?$!F5BY>N8yL
<@CHb= cIt*Ct>QN8R#JuJ=8m$8F$hyFEj@cMAHk1cKb\9jaiVFb94KP!N5E>k^*jMb^bmt?ImHVAL5E%FmMHH#
u*Dm#N mt&6DRyL/CF/ihWtLR9>I!dP^wTKI=tM8Cm^EEheNBkb=/WRLQ6LjMunnVuPSqaT/&eVDu#/Rw*j4khF
@M/!DI ?*G>XcXpuhu6+M5H86^A$!MAW=KTk!b:wmG:6>$k$jG!BWIFuJB=jmB#56m\MqZ$c:q^S%LdYYp<RlW?
L@BK94 WQqh!AJ@Zh$Qmyk/pAF?PIeF8tA984!HmZduc+&SMCZ/DV/$^FeQ$*W%%QKW8q!4k!RN:mE1Y/G^tb4&
kq+Lpq >h45X5IIHQe?uty#dh<6i>E$Ec#%NMR>=PHl8Hyj4y9bG*&i+BDuJ=BV6TVFu%e5>ciI1=a<^Z#84Y?M
hPiCj8 P<%FHFBcHVnK\+kWE+KFH1n=h4hicSIuYC/MiiPRk^94itGbuk1m@#+W?\u:XG!\R1SI4I6+1R9NcMC$
P$/Tt< tXRu\88*/?m5AaedHtY/L*Re^PXP^t?/?Tcq1tiiC>Z!XdA8&cNjt%pjh$IYbSh8%&bFRlhyqpFT6Tq%
5kCED# k^c%MZ5Ce?1t<ylKq<QS\u$XmypX4jn9MWTPeT&4y969e%@LHyhLRKZMCK?deJ&t#M9SuuBSGyQt1i!l
R5Pn>M c8?<W4V8t>8E^IBn6p5da*SnJjh\yyaI>X?GCTu16AkZV>kTlW&#/k!++GnnyZ&u*qDDhEjnQ5h%@aE?
yGE$c9 ^TQD<eN6WyhC+udYGP>chjnbG+wX\cuc/$NMX=B=\PITVb%S?^LMY*k$wnJ!Gn/m=\#nCMX*!*B$y&5p
iF*#A: Abb?=eXqyD^!Z=EG\B4H::kcidTPy^QaQR5ait9Xti?^IjSijTNdXi:G44H!u1Dl*ykk?KD*e!*j*BS6
@NYY8a Nup6TnHTd*L%dhEJTNZDGn+5yRy&bApGAVdGq8S&I<a:a!T5R*GIPu9>NuNIk5L9/9Sk9#pWu!I^WKy=
kli4yi tS^dtL6Rqd:XDG4dqNAMqa/mpjncm/9/+q9WpiJ/6XaB$jISad^C!qPGjn*W\C\8Fyqbl4TiJu$1YDhP
^N#AtA yRXCJt*C$TBPN4$u:!y=\9bR*6<\TTLh^ZFE\1EyDSPc&98Ieahq$1CXSCddGpy#yQI+G@*k$&M$?bR*
iaVn<j EXM\FYR4lW$6mR8\wManLpqmdih66:AiYl$RSYC<$m/jVua^6Vdl*W&S:jwKIhQlZ^YWH>M44B?yI5E1
lLL@iM Fcl+J=dVYPe/IudPp>*qp1ud%be4mCJRCCa5@E:%hM:?+4*WP/FQ8?!8+1C:\IRql?FIiH8ctp%DheYe
S!NYQ= 4kSI*bc#TXcC!1!!5!myI4Q?B\cEq^PYuA+=6ZRMTY?TP:>Sqqt/y&kN44:pKhb\5Ja:CWQ*JSmTwe%c
=k*&I8 ^DEPSWYP!>W<HWkZkEy?9b=/h:pyYGT&HwThqNi?Le<!m9*hkNpW1NHC&yqMTQp81eSP/V1Y\qkI%tA#
\=VLS! 6cSM?=MI*lEM@^H!ZZ*SP>!uR$eBMcI&*bh*h#pTL548pSS=PJ1!YWJGQlB/S6leK61D/KcCkQ\Y>19n
Gu\#EN <TXciPq9=\C\DGYhnwJRjEGKecZuPkNS=/D6Hy%\<=MI#:paXu:Ph#+l!VcpLA1M>qk8F!KHLckYhK+t
^\N#>e e%4B$&b>p<V%1jZXhCKbX%TPn8:5VY\6a^JD1cVENJAYF?1ywGkua#T%eP9AZYJJ1#*H=/%=QIF=QMC?
L85H6Y DyL!$XpB5PcG+SPyRZ6:Yw:mV8%CdXe!uEQ@Rm+hVARc1TSdk!u4E/SS$y8!inVGuy^98<BXM:uP:Spb
ehCjhN $NPI$!A+D?=akeqTi$$wl*4ZujNdc%/eQbBWjWPi6V6i%CdYq!&TN1L1Kk8EdPylE<*8mLI5i6N4XELa
=uFpd< Y+ba4G6%FBj!4^W$KXFjQ!L!y46AJH$E>!$dSQ4aWZ4Z$$ByBhaw9yeBnMA<WEWiP$4/45S>K!*:CPaY
Y8Eq>> FRLch<:m51pNN^Q1eZS$GdY:4yG<8meIMKmW=hLW>k\XNAb88^ql>ZP#/C!/QKmu?k$wG^@^LXMLNZNK
6AaJ/6 JX=4c4Hdd5cCVL?KNJi%QJedi9tqkhcY$e8446Y+<1mm?QAKpuZwYc^5^\JS%De$N4tt4NVTNc:amWin
ib<R<Z CSFbcDl5X6eH&b+8H&MAS<aRpi5%mp>dywt$WpTH>D<aeK1NH%V%!dw^P=S<uPEQh<Ipija5hKuK/V&Z
heTLW4 949p!TGlN51i:X^D##8>KAj&H<ejYB@W+JQhaqpRZJhPVB*491?&/:nQ=i1*WDlX+HXd8@19Ju!n:%1w
^j%S&P YLHP+a6E?kJ\LD<ekG5jY!<9lhYtZQQ1#MT5pPclXd=j5!i&b%54XZN!#yXGl%FpTG9&$c/X9$HT#Y%?
\%:%6J u=$ccKC*aL>l&9j/k6F8t=VVNllZ<VD!P@4e64^5@R>lB:5c9#L8VKp>kd6Xj5t5#^&1PwQ$QNLjQm:t
G1n>jT 1altW:&aMjI6mBR/GEX^><DNLwn$8Y#tVnE#Q*lj==mpqC8Gw1n6G<A$FnaXwFy*<EtnYTlF48/PY>!+
k@id5R Wd^/$T@hpY^WGP5?a9c&%YI%$kVP/puMXwd1q$4CuiW!9JdFmi>!<%?Hc6$@68t&nD<F?nky&V==i*BM
b%Hi%I #XVb:4de$L1d?jBDTj84/I8a*ddu91%G>qDNa:A$4nZmW!Wdn@pK:ijdjd!IQajqZGt?JFE$>y%91D<w
l5:Rie >V6ED9MMj9F$i:1!$XjXF&HpqKe&W\ZkC9:wl8/6dbaKlVN&k4@TwhE!&GmTyDVuA?#ju8IdHX#4wp55
9:CBRi $TR4P^SpDFe=^FQBYyPZ5X*=Y^#YF\n9MSpwP?QQFQNNu#LAI4db>h?6F4RnayK8I*>iy>EEG86$V>kP
:n<RQ5 1Ml6XaXJM\5lPIjCM#L/1\m5P@Zp^I9J^pY<Piq#q1i%HHQhnm+L*ZcQGH8PM5luhJwQF%G^Xm\^^Iah
DkM=&9 MadQFjdXDX*PD8%\S%FPJ4J5QeRS:STYZ+p$ElDq^<di^TnXYjX%G>mBandA#!^X*#5$JJ:BX#XtGJGI
VD^l\w StQ<:M9%EGRN4cwajjDeHk9IE<iiY11^jSR!yHK/19kAL4k%#>&k&#JhELMilbnVdFQVBFk?:iL=WI\=
\YDDY/ Lmtq5QYS*nTKj95#m@p$jye:1:G>F5CA!^kCn5RmyubHyA=ly5SqN5b>klZ*^BSVp5PbHWGJh6KS$qTa
XMGJ<> 1W<J&AZl\I1ku#RjqXkS:jXnyicS=EknWB&kljRyREKR1ejw5<!BY&QIYDuAuDEpTBcT&RQ#S6mk5SFT
<YIkHa \BB/Z#IwK\+h$wXBnaqMGREQe$h^@w#tZIkYY=JYVamYW=:YXbu&ZJdtZJ6&Ty5tP+J5TyWt&^KV/w/C
LT6EXG CwIbGIY#!W#S!W!$CTa\ReKuT5eNnMMMHKV4jCDhjEI5Kpk1PwGiHaiZZWXAPaB4uI\b!I+qKpQRmW8M
KM^@p# uW!/Ta%H/WjSiWhKFaeH\+QXca+jcIpbKACmCpD9^CSITmaMYMGnI5VNh5VcqMHM=pESnYhR5/Va:CIK
ZYGSKu #KQadCE!YTMSVTiB&TJ*R/bVW/Qw*MIPTEKt\mThk8A>nu*Qu*NtA:A*=ZAyd$Ge\4k\6CC1YnAulBTG
8Dldl$ HE&WB=R6nAwVS4HynmP1!9*cpDc:DS5!kANw\?twI5l?\A+$+*ZV=/#S\5^P^nES^k=ayKqN=Fh@TdP=
nDT\qi kmpK^kt+JeWYIIHBEyl?\=u>kCX1lGZeT6N=nE*qIKmPTk6Vk6:Sk=<pTN4^RNkymQw/VilennmdHb*4
=HAclP kLNnAV>dCXW$XPDdD=F9?&Td=Hk\SumdjMnbcaK8M5VbjDkhD$TmyIRtWaThWaVbaETVcbEpAiJ5Hp\a
XyGR!E BZLKB&K\MMqtFB=An>ShltK#BCidEMhplMlEkwlKmnA\Cp8WtELDpnldDLhnkVn:n1kVH/58HYj#Wm^J
A$XqAP nZVnG69pnDb:lW!nmmIbm?:%IQNMK%%h8:!4wNDbQRq%L::b4uDFqn!CCk*5L6Da<cp+kCPplS$iutY!
Kjlu>i YRuYk/k+tq^nZ$qT+kX<FdB8T&Edl5J$DJq!KdADklT\4uDYmP@TNk1^j!4t^&YcBK^?pd:l!G1LL6KD
n4aj?9 RFn>WiN5VtCLk+DPXq:<Fyl<VG?/T1Lc>EVXFy#CVPQBnnALy9VkX?@%$Idh$?BaXcQ=@FVMmX^VY<qD
FcHF+k lqceJ@%5WlWYS!HLmL=kn>IWmMmJReYJL%6DVJXEST$?TX*DS5QJR*E=cFA@cuA=cWkJa?m^cMk>BwAy
e8RF>= \hZeMaLAGM+PAYDPmi59Di8QKT:Quu6eEcZ<iH==RX^@a#mHdJ\6cXT@dtm5c5K>ciK^lln\?Bh5m4h6
cCH^6> pnIAkMp&!@JGVQqK\TNy4wXt$AEk>%RlB1!dZm+cymIadi/mdi+T+\8nZVqaZuGdib1mZRtbNd\m^uh:
-AXt%q 00006ae9d6e001202b4 Page 136 of binaries2.zip
/NeR!K *4pL\9i%cMA\u%P*=pE$>Qll$@DP=m4dcGbRDe>EVhYP\GWGYLitFI^p>WSJMVGMCp<CS18cWDWHpZ1V
1ZMyyN 6MCXht5**eNN/bJKm<PcCu?aNE@VkX4T\WPA$wPLiC6Tl?hIX/6J@iyTP@WHYY19M^/CHRRm5LYy:9qS
iPLdEl Tc9d/T^Ym>6VuL=WG<>BSZZaychch@IH^SamyWRtbcmh*np8InaS%Y\46WeuDRCQBkIl8e1l?G=n!?6p
<9tV%+ T?BpjVu6GRDA:hlHuE5^/Q\IkIu%*qV$%n#!<awA\B#=dMb/W<X/#^edNEcSb?&Vb<j/WB/<dG\*Tc6<
N:PZAQ &SmHPB@@14HR+HFdP>=/:w$9*9$Lk9AZe:!?>ThiQP>J9y@=<%:/i=*b8w@/Z?&wtjG\XieTc**Z?W=D
&49!nl nBhI&M&nCh:VyK6*N:9Z=Gb!kWh$=Cq*DQ1kMypdlCDBC85jqKL9\peW:E%DC85XJPcZIJaT+5WR4IMp
ScuT\S !VEd5KYwta/njdd5ttMYAn?W:!*y$1Tw=PIW!m81l\$AelhyiKu1W#:Zh/Yk=nYpunj^FG&Ncm1Q81/P
1l/a@1 =18Q>t/Pdt4*Vi<$VK>?n4eZ$#S1+6%HeTWh/:$aT%ly%CAFL+1JFCAbt\WV!:iFFIkXG@k6h1E<Dq<!
!!DCB6 DmIb4#Mj9%CcRHmV$QRqhlMcy+6NRRtBJ\KS%B<q/PIp<V@%+^/n+CiI9?/PIY^Q=yhM>yH%u/\uEaQ>
\1QTkW \/pGMQ9@W9Ga@/EaI<ZBRepN@4ZMP^jq*^RH@58CMtCP@/ckDP<jCM4\@BeFbZm+@/d1#5Q#>\*ij=Ga
babW?u ?b8+\4@KNwD@RD9nL:j!Y!I^aK:jRQ>TwAaM@k$$#/@$uMHe9+Q?qe\LtPe*$N!@$8$A<@+yNN@9wLq@
<6kWi& wXeC=9<#cG:&*$CD8Z@^%Lk=jkj>K^X5:6@lGlj@L<S^8H?Hc%^<9:4&:*CN/%iCSN!@\#Y8Z#:#*?Ec
qGhAXP F>i949$:ZQ5y%QLH/N@lGmj*4/:N@&jRQL@D6X@LGjH<D6t+iZ+lb<V#P&V:&ZD?Mjy*!MdN@+8GnRj<
@/yj@9 Q:WFjGD\9>5CQnDu9>pC94>h>uh6Ah@j#NjnB9<@t\C?9^uBj!56>^@KCQGA@^Qq1N>Xiih=6L^eqN!Q
Km!<1I :AS#eQ&PnBAQ#@>hliF+bAVZ+^9:1W5Eb9?>\9^V%SQ>T^>A@dEd+KVl>FkYCWw&SS=Yjqa\P\<QD/8+
a6<M++ 6dPMlap=K^i4wwthncMX1+tnPc8p6=t%mcQX#%%=C^?*^@+HJd&K6A145:pq\%@/F:>h<y?tq89S=Q%5
w8=pH5 Bu?u=H#@15d$H#V/V>Ta@1=n@^e%Jn:?Q%Bn+9pDH^A*:&Q=@1RQcKDDkI<WCSmMqh:pSEI1bYbF\$\=
#DbwS: mpTFS\X:#n+GyGTW:^S*ej=5VptwAw<#iBFlSWk!*5?y&5:1:BCmam8GBKdWJ!eEIZIFp$pa/lI4wZ<N
lZ!cWF Y5k1aeCQpR4/1\d>EqA<WZSw$y$XXKp%cV$$S$t#BPRXL^@c6?E$1TCkT8k^yTjb11H:m+QtDY#Y/^hF
%G^YI5 nG!MtGll=&@kw&Tj^A:6bBXQ>tHBkmPwJ!QtRy#B<RQt:kMLnbyIVBFw5@84Mkce^J*GG>p>L@^+TEEi
E?*86X 5DBF$#HklGG/mcCadm=\iWeli^V6R?EPJ1l9e4NT$EYRGN&iVm/AWck*!?YGY<uR/CPl5P$?LyTJDd5Q
HmCbMS kVuHY1$jAR:qe**5lP66je!&#Ew9cBPR&q46uK+mGE4X5wkaCkNQ?\pB#upAp\Wt*SkZ^T=GRpA!8$mX
d/mdHZ GKHWkJt4YlTR%ayRt4PNASwYt!hm4jwenm6&:N&QLa61S#@MJe5aXX^*!CT<FNbbbE<AVDy@Z<1Ei6:M
Y>S?9R !ZSA*XPDAB5Mm>@ZFVDZFMbShS+J+5nlJwpVX<AuCwZDQBSRT1#V1R8HkR!KleKB:@pp&R%^yQ8/<?/T
MS16QQ EPC<X^p+m>NnmA8?pAnGq#Ft5C>utdVt5\J66te=Qk=lB+%%BAcJMWLWGZpaIWj$Be&T&!>&IGk%lGba
jRw>FE <HC9w84KN\H:aMuTF>5TQZQ\VklLS!e\qC1+*taEMR4ac%&lJWIX@R8V&NhEKqnt1nm>*\$B@A6cE/yQ
#Z+*N: K/9^&kuGiWmjtW*KT!a<1>DISCBa9I1S\?&F$$iAGLI@WGC6#d9P9\K1+t*KqDQ:5WBY6P<VipId=#Cm
kkw*M^ DAMlG=$T+ydK5V&wTqTy^9#M<4:dCSd94M&ceiX+6u%/&F\Z5^WKmpJR=iM/b&C#Im1B?ILnMCQF>V+<
LBQcXP KJn/=B&>6!NE+WC1%\RTQTRwC=nG$SP1$lXJ6uM>aYCb6YilC^bL#A8mKj$I9b8AjpSYu#GlMNP4wFtF
yTi:Tt &CQH!?1i*E>wbKI8Di!+Lth5kBcyVALP^8ZM=#RJ:Jp:qhX/LlV+tQc6?Pi+:A%Rp8G9ltRbAp+<nwFX
V%ntcX :wGK^X$IeQX5JPm?WAm8^ZRqEd:%lpwSum%iR!E5$KQ>JTTiC9aGT&iNi6X@:h6>:Y8Y4&$PwHFXjG<m
>eXu8G !Y*/=T@\PN?::R^uKlCGEDm1lnBS%q$*k%miEY!lWPkL9YTLuGQdQh#5BEkbFWY$MkSAmMSSqNXSSeYF
LiZC%Q 9J1GW^PDZycapAwFa^6T&C$H=*hih8^h\8C:jR5K:d\V!S1CpuBBA?k=aV:ywJl%tn*%RjHaEi\?#yBd
BT*=SK cqJE\8QPCqu/HwN1cneEW$Z4JdEw4+96FbkwZ%GkhjTimXmCYdc:Kd<wPFY<DiT\I>Gd:4kRdK8wY/$y
dN>R&L W>mpBp1YD\6tdeIEA>SAI!@mJXTLR*MC9yDRdNP!8CVkmkNWWNP9bh$P<N+>/#M>!1My>?>eSbRP+>5q
\tGTFI NJ%^a^uAVd98JW&\%+?QPP58qQ4^bD*ubjII!?i&^p^MFY^+yY4etpy691Bqu/DIka@A6B9:ZK$iB6:^
?DeiDw TS8C*4#%N\Jhnt#YhVp$1MS$*j!5wR$Y*eqBphw>P6E&N%mm%HQh$Wi?IH1D^pdkdiSVVqt4:NB#@KC%
<&HYc? 8mjQBNp6Yj#a8<pH/bndVc^jYNC@ISKiFH5S^?d\I$i&4eDKdiuNCCiA$&eRk14np:a=Y$hIR^/TnICS
iY%JZA yTH1Nnkann/XX^G?$jGll#/GSH@RHZ%\w4>SY&p!i*NDk*b@Cl8:WFGGpF*?5I*+dhJLYiXmHTBk6Vkw
ccl!Ac +C&lFn$DTtC^Mw=bn%Lp%4wAC&$bXpHb>AGJme?PMdGGXCXYWMcEGcQ=5<KAXTSL@hj1ewaTab#FR6EB
!Zk%We #nKaq6WXNS5pd+j8Kqqj&JZSGwWiEaiZPi^kMheuGuYLj%i!Dp14jCP85?nlY+WWCi1@+DiFWTkMXiA+
:pu?:! lkWepua#iHLW\Rw6DwyF4?59%LL1+pF?1AZdtT&><WSl$YIjIGJ/E%%SLj5=GV@=iiA:8qL5\aLTyI?k
HiM#Dl <e^yZbpGbT&\m!6Fjy#j$X#%y#+%pmRDpGRJ4B%#bJ>BIk=6FW@GZt4n8JWitbuEjlVka<k#R@pp8tc:
hGt>w/ %N*eb&@e:emmPCS:CYwJaI*py$kNuRM*14LGZ#lw^nZ!wa899+AW^mQ#QXXInmp%lZ<8/5\F6Dwy=Ian
1KKXnE uStt%\K^+ZcultKd&lHH1*KjaAwt&clZJZ:81qjTldP6^D^ktp:Wd5dV^+ecjht&15baG<ln$mJLN!iT
6JLVVV @IK*8uCW>nL#QEPt5dtBuiTeJJnpi#Z1h*wnSKuwa^uKc86$n9t1w+mbqB4:6B=MIPZ\c>\BS&4?J%MY
/YD$<= 6%n<^=:mEw9hjECXMTJXjdhY@KnWV+LpbR:Z+Cdc4VJ<qYKh5u%Qb%A>8n=leaaJYW!5V$G4=dJCeFye
tcAC:e kPFAyKI6Q\w^uDeqG4FmdXPiR+1#WMGM:8G$ybCIuRNQEjyJL8@8&+%Dby1!&QQ#pMY:A/SLMM$Wbm*5
C+F1:A TB8/kS%bM&yAVlMmi^PK6hKk*$6E<TuGp6u<KA9IaC&6D95laViEe5lT&EIyH:T4+Ge!QAan$VJd??##
G!yJ9q 1Nec*uqDb#:dE^cT&a>&aQbh!mF!G#j!!T<4jIk19bGpF><!/XN:t+1/#ayTd*Li9I^&/qA6M\9#&BaM
m&&yl8 EelDDC^L:ejW6iQXuG4@=pBGj8c*ti6@>kPd>Q9cc9m5X6KKcc*&?@i?A<eeQ@Vcwmp<u1k:6Ta*HmK@
#wdbR? mdR$Tu9nZZP>8ycRJa=i\ayWMY&4Q&m=4qkkMWdjGM=?bLiwn&RT<at^8KI*>Ym=cD@KKucBjjW6icX=
KC%%lM bikp8Scahj*q4F>&yapm$AAA16561Qcb1qM?RdNyJl&VYMLGX$eSH=6Y&8kumcN^cq@?PPET9+W9#d*&
*?B8Fb nI#\?+Cn%\BLR*qMdSTu\%kFeiZduXP:E*59d4caq:I8IM&WbHtQ*D6t#Jj48n*!8e+*JK5abi@t**uq
&G1WE? Ph^p6=M/^at>+@ZC*dnKZA&KLK5%<PLiiqpR1RA%9jpa!<V*ZK*J?8W4>^l4umchq??*I/&Ht1X/$u%6
4$ZIQt FC$nW@hQ\GMXF*PwV+/5ZahLTXZ6FNABR=Jm6DNqF@9HRRiS?/MKl+NHaM6^?64V4iEJYLSVu84S%IQ^
ClY#D$ GhAZ?4j&AWe^=!j&y@X^<ANP>L6wMT=&a6t5F@h>TR>w8A?&WpXPy!=nLdPKP9jKVR$5:+@m#h6H8p!/
h8=@>< E&E45BACIQ*tSkeT<pCWDd<VuWbGqC?n/plqW^*HVbKu<mn:ii&RZcNwBbCh/jMC?\u$uy1^kqw:&Ltw
b*ud8Z 9tyu>Lhj#C%:5+=b:?1hmMetH1a4tcqRJCBSLR>jWd+1J5l?#XBZ#Pn=cq9uIApd>*aMXAJKPK&QXyB$
=k6NFK SKp@Dkah::<LQ&%kjSn1W<najVncheCNZEcY%&ykiaaT>*cpKk6E8YFlh\=mw/iYJwMy#=KR$\c!De%M
EF^1!9 EIPe/D@%ceIX/+Z*&t468D:5Yj9BP=hbnS&#51GZIPpN*>qLHd+>iwqIcRCG&JaPXi%FNVAh8!4GTNTN
=MVihD ^W$Nt$/#EX/N<w*GqAI1<5148w:5q%=pDR%XqhW=ttAF4R%X$45/lnlq4VW!L^MwL=QLVZ%pCedN&5Nl
B=dKS? NaGS/+iJiVHK@Lt&a?NpZKHMnqB1RyRKEkTKyc$d1bySBW=m8p@cC$V$?KN<LRaYl^Q5WE5i%%A4AIC&
akMA>Q G$mSAq?5FFk&N9bQhIuRni6Q*=/HiJ<pkcHna%:Xa95n$>lu/\lJ5dBK+elqRYMkADC&yk:qK5SFB^/6
FJIGYY EDm&C!yBJhpK+ljD=Ij9AMKX$K5bLi<YFEq/9uD%bIG*S+pmVAk9Y\JyLdPI$I:u!Pb@wbNPa58!a#uj
FJ=KKH t8R$JM&dimmKJWC6j%Jnib+aBc1wb/4Sa4T\=HenIJYLwPe$kmSPSZTI$mh1%C6GWtIhaR^#MESYHKuB
H5!!?S n5X1waMCqlT4/t\N^qH/WYRDLKeiKl*LF1\aaC1nGecwi</Mc5:LJCchup\SRq&&15h1^kI</C!VNjNX
Li&cRZ dCCPiapD*iNk&<TJd$HDkF*B6++t:CnELNRHBDm\/XaqIDXCB<YbdJcqP8q:1uE>nyPlcGYJu9FWTTj<
uVN<5a n%kjdhRqJ8MQTA>qH5:yN<4cbq$Y^BPKEEy\WKJN>+>9Jh$PkE^wCFYt\%MJ>c+y@MYya5#Zw=\^\=MM
kMXutN nLJy&KhwADw?8iC:EkXYAjYQbtDemCu/NdjVwSB?TadWGR&Bbjcm4&1+%#NGw#R+9D&T!HFSu*JwV#G#
WVt==% +WcD+bu5n/48lmi^/^$TJ6V4tPBKye//kGj>$t=nE&Mwi=k/nW^tMMu<\wZA/yq+mTVm/6El1WuG1dw*
B16/#i W1^:tC4c!K4uC!n$wFl%BS^5ZqkbEdh&Rh\JBJ^AqDln6QGFIi^PlNhSm+4tbSjJ^wMX9XlKG/m*w+pP
-AJ@F$ 0001f15bd46001202b4 Page 137 of binaries2.zip
6\QH$6 MAt%#F&*4l%:#=+tATEG\N#Q9Lu=wy!:*<CEHHXpTpe#P<j6<H&E>yC8F%W#%/eKL$8yIM4X$meL?ulS
%&%>EQ =Vm*ZyX*l^lJ/e#6!BG:+wenX/BDZ\95C>wpB%tbG*iX/!<!ytwmlBm=BlX&pDn$:R4n*e4*8&lZI=^!
&ETjc@ W@KA>b^yC9W/AjWtbm+!^MTS9GtFl\%S+\a$+^w#dA&SJ^N%\/ADL4WBNnZ9hNh4nt<eK8+T$c=JFhly
dDe$^B @Pd1@EyjS=N%GbuVGM*=DiMyqYHy8A@:%Y5CNRC1ZFHCR%YP&/pW<qNcD:Dky=ep$8y!yZEBm1?nynhE
t1%amk 6cj5%C*9GnlSQuKmT>RJL+CVblPZqjQ&LLlm4lK!CV&N9!4QudIk<KGMdhRkTKBku#BmLnHmWD#>AqQF
=#!uEh RBt%wc+1YIuHaeeyVXYLa/Y<R+1^nbkKLN$c?1IRBHL81*P=b^^blMMJMl?c^u+m&F=<SI68AnDu?%I1
j8w\b= L>89e/StjX!^?@W#9*I@@uRye<a*M=TKnpdXCkqIPBZnJp&XWwm4@T/kEKqnqhp+hiQdC+qGY/Y>ep?X
I8i\^G qVb*DLwGkMlXWMVEJn8HRc%KC11Z1wi<6Ej1NLeVa=tZGiy*K^wJ#4y=%=uykw4RSKBF9#p<Q+C%d!^8
BTD>KG FGem+iQ\1q*M!4E1Ec&<659+te=B=bN=R<tSiW$YSa6S=u1upBnijBbMF^c#G<#EhIZKW!SucX:EQbQa
eMnScZ G1D:m?1y<#y#*LhMFLJH&<\&jbLGWSlwE:M^P=+y!#le@C^mIX!=RL+NX?CYA@k%yT*H&*:5W<XpQ=ch
ki8^4E ELiI\=eL61\=Y>$Kl<w>/T@6C<QCG>Bq=FVkTXu&iN^/XMMb!S*LDJBG1DWp9=G!dhq\G\ly8tkX=HJK
Yj8tbm ?wd*GGGIdWeiG&9I=ZRNFTp!P$ndluyd9F1$*APXutDIc*654B#9N@y/V8Ti61yBilqLX/cL*^9Kd>Py
u+DRaY uM?pLXKDF>1HZXhP+5=8WQ!m#$i$HD<%P4KnILYmKnTC4/AZGwhX&im^>BtZT8u&WAq?Ck\9lS@KXNdP
:PwVG! TTQaW?H^c#ci*?m&lt$1/1ad?tbh%W/?/61B58Q:julZMi?jSSJ!Eyjb4<\M>J*kH1e:BQ6ltV#yGQT9
/yd+^y 1EAG:wK1/Aia*KlnN5*5yJM4q@Wt*5Wl#:+MWEGuQLKS\^=kWWB*aWHhtKl$lnHZ>8Q:/mZ6ij9C:4p5
LD&WB@ bmWQ+t+Dl=C<B/\P?#%lhh^HQ6\lRp=+BALCwW$mat!u4EEKMFYYFaPRJ8nFXKKMJE/tam&ppX8V9\ki
KduQ@i WPE8n%%&Fy+>TiekwdAuujFCakEyamE^cF@ZEtTMYC5&9IKMhM1KTy$yBjB%#ED4ML4imEA^Lp^T1\8G
ljm!lt uIe#:Ia!:Fa#Tjm!KFkl+1aNA>K9D<imq#l&8wElkj:D1BBy&*h/Qj1MmMAA$RIJknKd9aI^/p+cmpKJ
c1JNuw =+XlXIXZ<pXQG+XWCH#mblBcHGim^8bPt+teVy\YGCZbF8Qp9:*J#+\4NS1hEX^&Q/EE6a*4^Sj#91%#
a&SJE\ :Stq+$+1c=5<Mh<q+aRu+iH+IjDGRS+j6FB:I1qWicFdVd:>9XSma##\$9NLn:c/!uZMM%DE$5Id=&L^
j\JET+ I>MBAZiPY&?bC@Awb$LbD/YZX+I#4Tb9<?T#qmm!Wc+cuwuRtdF#d#t^BINLLQS+k9!eXL8a1hX+e88+
d::A&T k#C=P@DcP8\%epK4+CCP%QA91L*nkHjCYTHI%Jb<LLlQnBMwnc&jGIikAMLkAe=QnMPLKa&R*qTlMhek
AyJ$19 di#w@C$Aa:Z:FZ>*t%D*uYmQwGVQK>tiNmpA1Y19wGd9K>*iN5NiRREAVG:jK=8?Nwi?P=h?1l\A1Xt@
mZeAi\ kY@@+@bd@n/D\IE&@\ED*wG*5aP9uAblXkeN*k\Ji9Y*=R<b9B5mLS%a1S\Y#B&/i#=<%>t:wnn!cuCp
:WG4h! ddTut?%VB?/#%m:?LnElhZ#/%5%&?A:GaC*8tmZ=H%6cWpq$%F&Pkm6CqI/<cQmkq#inpPehAK5PA?TP
yu>MT8 Fc^PA/LPFW19qchhYh?/:4lG:4tujjq::4y:A!Ku:*V:KCNu&lXu:qXu:5yu*1uQ619P9k1jZdYacVeb
DN44yV FLKcM:Rd9HicZZWFpHuN64?e9%hjEA1hNYn6E=L5NSSjFDTbdu?*iDe?T6Qe*64GR&QEu^5@i6c@VCuc
kYW**< Nu6uV@&Ch\PZn!cMT!^Ve+8utjS?Pi<n8HX/Se^nNHPFB<=m6L&y&@!nk9+IV?6B8:n&!49m>98qk8Y>
b+?1Q% %S$%G9nihdLJV/atp&S+p$G#p!5+uec+CHjEXP?ihpGG8>+!\^l\hB6tj^cY:DF<$!8W>4qhh?Gn=5^h
i>y%NZ =a/j+e^H@b$H:X%lm+YQN496@45QLuMQHu8?Fu5jjYjd&n>@XF=<L:*@pEC&tn@1Y\Bn8P9djnSBhkyM
bFD?\u MS^*ZcE95CCq1X*jD8G?H^<>Tu!@8kAt?VdY*Zn\@6*T^>^qpw6t8D^kWDhLh=cN<HC:H<!JMD\a61A4
eRI4@Z !E>uS$tIYpwB6u6mniVVqkVRmG4Tn/un+itWMEiZENQ&S=EDRjuQu%l/DeKIlRL:SZn:!ZZulMK@jSD@
&@ZhTC 6m+!6@4<+4u!^Rj=ieQa!?j/jR?lF&R&q^VQ?%aDB<q<4@\Nb%a<99t:jH>8e8EjjCum@@%V/NX//HeK
Y+i6dL 6uMw\$$:@<G4^VYn&cX:&HkejKEeSM&iESb89BYnL%@Y<CXuDYkb/#T&866>6#iEDt:jjXpl9iJadbKl
heH9># p#%i:V@/?LZW/Q9hG5ch!PyZZ*TaHAAKRWwQHFaHD:^MWK\J:DpYJI\!8CQCkkQRFtH^nFnBWw%@wM5u
$YeSKE BF5tCNH>9TyDm6\PWkB<G!AmXe:!1S6HiwpqRGF%YpQm\X<kXaW?Gdb5TAPk1Y4>8pYSM=Myjidy^WE8
Hu48k4 b#F4!45Dn#jGMPt6Bbwq<1%+5IQm/RyY1e5iH#Eqcd6RiGXE?#A=MIpqCBI:Pk\+TbGA+t<BI^aIHec>
8MPcMZ 8XkSVZcS@ERttPIiQ&AT8>D/?WnJ?R#ambG+etQJqVA6Y&E4AcY#*#kTinb1e$qq?nq=MFHhY%=qMdF+
#QRW^K 6Y%jmMGEp*m%B/%j/an&#YPd<ZRlcjQla1PllaKpJlbiTV%lm?4h=tk/>lPuTXw?PV<Iyjdl#l^#+JIR
^^jyGb ZSt<8b9I6+/j945HSRupcWLa8R+BpAtBjARI8?kd+Ci&ptcptQmkC5NP=SIXAQPE/<y*81?6m>k5@ZjK
Zu<$VC 8JIeGmyNLeNFiASbqH<abeD:j%PW\Z<^ewD*9^5=\M@^:=ED@P!@+T*/c$RAH@<j8wN+@<B^^999Z9qj
TuEn?4 ?Dy=8j+WG9\:cJ=j8N%+8j<Wt8h*$B!@<HZ!<9+yNN>9wLq=j^FQ\M9@b>B<:L?Db9<Xt8M*$GD8Z#^#
\PTRRT Q5+@lj+h4wHbj@HM?eB@C9$:ZQ8%d=99h<nG#ji4G@<h5wE=j8Hd=95h59&nj@Yj$j#@/qup@R*Q+6?m
?WwnIj n@:1YiV@I<<mQ@8@i^a=?eFe@>@159?>1<8e@#84!\b?jEiWp<W%JpHw#FAn#pX6K81EpbM^J1^\QydA
4K?kDp SR1t*/MGm4c=:#jqBthp%a&TSJQ!5>!q\aqml?AVeJm$BHLR1ECK1Kqk:H8IXSR!teCK+mRNjW4bEe/+
uI6\Sl IHWX!G/aE9$E=:SdqaykL\^pW\Z5=4^P4NkJy!#Q:jJPpyT9atYjJ=VL8X8J4>/ZqVi&E#D+HAE8jaPH
Sw\yX5 ^:&Xe&5t5YywW!j&S:VKhLcp<PbwN8R6?#!Pt+NNnE694VqC>wCKRCk4T/6PKM!5BCccR*&N+A!X@cyq
u&iXSP ZV&j46iaX/5$^e\tk4bZJI9ECnWCm?b*&\&N#KVNeViWkNI\$X!iBqWeNAClcnW1M@>C<DMlI+QL&qcN
LS#aie BmI/YiKbduwD*C%Ph?^Gw^u+yT!k&wBq><TFh^Cun5P:Wd?yS8+A>pYa&NEIwcwP@TnVcXdPaWZ\c/pX
q:Pcmd JW$eJj#=K*TVkpC^LI$RBFmh+SeI%Ft#\yb8>:CBwbPKJDGV8uYm$qFtpLXuPiL6Ipu1%&+t8Iw4CKLi
k&69%m m>W@\wqH8!Fh1%I4lnZ5ddNP!JT8cQT:9DGihF/18y6A@/\=wmiN8c+%CIQ=l&&a*<1YG8kCFw=9@E#4
jhHqEL V4K$:ByDm>q6+%YY<=H1XciFS%<a6&lMXk=GT>\&5A!H?+kB%>B\PBTc91yRu15:H<%edEK&*Xh8JD>%
c8BK4Z umYZ5*KC&yWmVb>hXYmN9SKTGV?6>^!h>NAGh*jbwyjG</E:nJWqB\!TIZt>awW=l\WMEawVYl8lD4/5
pB\p@P 8V!&l<&!%kp:TGZeXtpPy6qFG<9ACA4j1nVtqLCI<%*w$4S?MKk>RB9P6m<NCTtk+H4Ck?tkX6iV4p:<
BP&4&d $5YY&ZmAa=ceVQ#NtwdwdF/^5!n!bP6ub*pW6C=Ja@j8MyJkFeKD<yCXAq%KL%BqA^9ybRubkl!9ETLM
>VdF=B 6<#$wWp+eZ1*4$ce+d!pR%SVSj15lJn<!RE*BQy:<JmV9KLhjNCbdCp8>qqeWl%/J#LbLqByGZ8bVMdG
bD5y9m R4Ryl$S!A?HFGKEi:P8E#SH?X58PphjjYq+w4BLuJ>mdWhM<h6h=qItMm?uV?N#+K%d*5uLYSyN^QBSe
@\N>XH Q?1MQK*JZYAt$JNGTBdGZdDS$l$QPliM=Qi?wX9u<\VXGAa!>1q%Jp/PSaITMBEV%5lE+iI!FdL9kF:\
bmSIlW P=TmZhdSWaV>>SL%!\8PmTCl+ZEbSV/C$6lZTWJ*\KcFG+K<d+HXhJ&IFuJFyN/W4kp*lS^m+Jupq=eY
+i!=J@ cFmh\K<DbMwT*kHALu1^c@h/*QM5hFCYRBkDG%jcVbWL8tk9P>?BTG=IjLkcIT:uFSHR=DPbieKlGLPt
c&QAT\ *CRM@HkW&=tV5Bl6*ZMc&6CNRLMP+/=&pt<u:%=u8AMJ+I9I:/Kn9=qGehAH>i1$C1Y18ZA>wVTYYtNI
jZG5JI XdJMEiVn48ZJ:/w$GJmaKy9XK$TZt:iAYe\D$^:PQ#HtXD6^pF>ApIw?1mu^a^ac#iBtR*89ht/Zue^K
CaAF%@ uYBlWqC!mI=du%hli+FCya/SNY!?VJw/$YD*YdXcQRT@1WBXt/=H61:&RcJbu6ub?N5R:>+VR*JpWceS
6+RWt6 eY%?/Ti4NR*pVeu6*btHcy&!1j%/$<#9$?W+Yk8eb=F6/e%B=$C5my5j8IT+#1<t=SIHBAnhMw>i9KMK
SX+jyI <!lQP/Q+kE4>cu4IteXn&&Gnyl^qh!!=nLlb#jcPPZFGLtmceFtV6k\a45BmM&y#8nkGh%*cH%R#YG#i
pm$V:p #*1RcpDXemitI$=VnP*8#5WD^>yT$9^e5$mnFC6JwJZe:pC!Dq!Q@^+5M&FdiCERGM&FRnJ\V/EE>\L>
TcV6hp ^Me?nMqw$?pE:q*mdS\bp4#e*QAq>%BDpau8CeJ&HQ*HYjVEu8BANbwES#+6>K=TlMnI5&mJ=<APDm%t
:5ttTR D>W*qyLhnWbty4lP58iiwHe#ehJ>pAGTQbw$%+T\H@!9St1LBZyCyX!M%a<bi$^l6Gp1HuVi&APu>@FN
Il6NbE Fchb:1#+^%%h%D<ZK:@:P4H>ZIKmN>eC6\XPHitb@*#t6VMl@RLjFt&BGR%q\EmW>G:n>P815TkLtFaJ
yw:5p# C^Lhq#l=1&*nBeITpXew#IeMAVQu!Jpbyk@+<Me?!XyWY1qe?nteXw&IAmX1w#cb&T^!Rb=4bC!a+??L
w59%Q4 %qSuyL45liWQM/94LI#6&hqu>F^@FAKV?q+H>uT*N&J+bMa9XQH+&<4ejNR1q&k1+%\?>FRX!DYtuLBX
H^TKwn <^aA#cjNct&%nB6CDIi&\jZIR=PXlhndwAc4=\?VG*bKq@\CmSYW=RBW4k<8\t>QGIlRPpGW\Z=9hi6=
-AT^:: 000d80535c1001202b4 Page 138 of binaries2.zip
1paLA8 Gi4>NVT^p5$YP><H5/GPEMucV@p+<VY6^IE!N!>!b#%i+tdulGI>=!u&?K/+qc:bXtZa1TT5?JFj9?Wq
#ma%Nk $Y&5G@>^9Xb4Q#!MGBu\411^Bpe9aMltm4uMRcSXjZ?\>qyR#m4nqE/?NTZtM%F6LjFMJ$RTA/cVn/d5
WDHy=c ^GC/bHcF<&^q1Duwp4!Ba9YJdq6n1*m!\G1bn8yR$SkK5yclEu?X9EYQqA+iVHZh!18%YFQN:+MB>yFy
RKeNA@ @qYj11cb!eTEYmCqN%SYL^eP?uDc$JA:$:Sy9w?nB/:8/9M#uc8ZTL>@!:8<+9Gt!NFS^@VdBa>i<?IL
5A%&qu l5!kF5c*=8H$m9EnH^uI6$a9hmZ%Q4BWLCplLbh^wy@KBS*HBXyec%pVR$jJu?YG=JXuCXR\9w1^H:Mu
cAZLKl nEL5\kCS<pp1PW8d<!q=9kb&hQiH9e+uS\@Pph=^B6Jw<QT5FQa#i*=?@\IB?:LQ&W4Ki&WHpByKntS>
pkKk4h ZpAd^BY!Y&$N84SSku#ST$hASH=cpp1H%EwjNV=8/^T^66nd>6*1!a?lnI@nAi@mYK@D^1/H1C$A/\kS
SWhMj$ e48HaL/!+^6/pJ>Vnt$9jiDB%qT*<d=6XDH#5R:>ZikBHB4IDM55/keD@c9R4bmTJ\<PuC5q:K<QbIw1
w>K/?> L=Sa#wQ&#AhD*WG!a=P5KuynVb1qTBak?>HV88en#l<G&:En=taQMYQKDmPj1I\B+Si6mb&pXNBQ*/Ba
SN>FMt 6@TG!&YlC\ewPC?kyWJ*FtKKWLTR*I6q$pM1qVa=InElEPQ<pucM*i/S&=&ntZXdqMTh@jpP!AJC$HAq
tX::yb :e8^p8#>>&>SFFdnWq%*:*ynnDQSB+dyRbNQy+yw?Au6nVPC/QCKREaMdBn^IjQSy^<tu<FIPH/ARK:Q
%ZM@CS #t?RRQNKBZtPJDRaGwFXtVm>@eTnY9:w?N6^==!>uCBHqMN<!AM#Z:j#A#\!QX49@tIqDE^?%>enhIPi
m5L5t^ tiZVY<*1HLY#Aw&T1L=SH%!P8n9d4/5JtdVMJ9DlXlnh4#E^eQ9RGZWW9hXXp\W1ZwK1Q+=H4XTk%yWQ
p?@iXP ^mpekP/i9FjdYPCbt6weMJjet$NkWuD>HHF<91Spdm?NMKLX^<kD:<KTb?*KTB4&PWkL5IBGL</TNe$G
@BdAyT :/iS<PLBdIMK>w<Zd@B#@E?uXZ+=ujLjuWQl=@#9#cF\5j>:^C$ZP<h9#/H\@@EeC9<jnE#=Pj>%NwD9
*Lae:B F/51?MG@k?dl@RYc?#jRaM=j^I9#<@\G?6jnYu:i*!p/:!?tj@n=jkjN>c9H>t<nW*:P@@uI>P>l4n>H
aek@1i yq^@D<4?^@N!5j@n!QT9%Q4:11H@EdH:q*qCTnaqE+i@:Q#Mm1J6a@++l8ZkA%P!!XnaYFt:Q>Ke/!h#
MZ9lih dN#hXC^e^b$euJ$ej%L#<Xl^J*5uX*XuE:NH6ITFy+&bldT4me>@DIV=\I<q@w?B5IT+^l<MlKEL$FMA
Gb\Ty/ 88lnwT$A=kGA^\>$GTAPRAL?@D#?S\IlITKB$FGRpFDRMhHR$NHRMLFAn@@SRXka&Dm+PNkalIVE^ITE
H!DB$4 NNVW%DSQ@?MD:RCkIkF!AW$\MNRAcA>k/9HEmDA@Q+C@jiAS+GCBMABEJGRWXE\ALA\eHC\<LBAS:9Ej
ta#&j? 4B5MLB\YQACBCy6DXBYIa$L6EwnLtbmNmFe6S6PyN4uJlY@/qha%/I^PHK!iqFNn=6dFLjH$hY+6D+GG
Sn8>uk 8Z9*%BdTp&BpFEKmpGSJ1d\/4YqNi8L#:Y<>M=<9LD^CW@L4i&h*Lm$>\%ILG94th1>+ydY69MLVCl9:
mWNLZ+ =@i?<<uwYH6HyBe%DT#5Z#Q\!?4c?ET?KY+iZD!+aSTR$:N>EbXS$nK$hHkLZRZAA$DRJRDT#%5TATRe
8ZYKE^ CK6QZM45ym1!Ki&RTMZTy64S^w*De>WP:M!X/ctHWY!k\V&W9*l?V@u$ZtQ$AVAlenmjD\XM\j:M*9q@
CwC%!G <4h^/ER/FBAA^4m6Q@C@CQl\1e=:DRiBAp1N$1AAGiTjtWd>@<@<!l+?81a&WZiC18E?hdG^4hTY!tBc
Tb&+q& K=MuT!&=NdTTiXMntiQjV/EJBblBATw<m>DJk+pd4?G%EL\yl<>JM5EbplVG>W@V!E?m@MN@yy@Z+9Q@
e^VjtZ dCD!Ve9y/>:nBR::Mi/m\^>5S^>I#/GAi=%NKCDSGRwa%j*W@XMN6ySW=J!X+1cW>>y6GA1+NA6@pP!G
QRjNaw A4k6wRB$H@?H55enB=4<h<9YN<jbwIDbPIwdAw!:&e\:@l$w+Ld/<Wn1^@Nq%Q/ZLk!hPu#?9@B$@/Z:
4Z</6^ aJ&@RAP!IK1@S?NE5kyDS1tKlYPC@+#E>J!W>S5WePjM4j#Dal$K/KHyhXi?*4d>hP^@CL6M%>DPI4JL
41wh=W CAYM9IXPu!#1+Q51K#Wp>Ly+khVRltTyT=&Pqb:i&pqDAcp@@G?IQ<##HySVQPmjRAGjdj$NZ8qX9AFH
5@V4Hk +@It!NIRM>JGnjlBTAp!ia!$:KE#J<%XcFj%BVa%bd!%6//e*=D\X5/K<RV^mme&Tq>G5G:E:T:&JA#^
FLDTkj $%TKeTk5ip98K6>IZ*//:u=/><ak*keKiPAnL4!9?RIFdGF66V!>e/q@jmX!CiPRhGVaY*nZVZH#PkAK
FRdwZe pDDMHHVWX*8u?9tTJqC=I\9QEVHF5\R>iTu*w#>$>5B@e%ZWWElId*51&l&DNpdunc@bIVppAac^>TLj
T!$&SX dl4=ey#N!NCPIM$@m<ZD86DeP4<=ZW1FYbcEH9jMAPcB5BpKKGbTkkL!Ql!QQlC$mF#$&1^j9L=QQ*Jm
LN>G^^ PKVIh&>Nd&8&!tjJu^4uH5F^e+&K!?iddnd&m$t#JidJjVFha+9hRSwiTM$emELDYM#wN+!nhZdXi#HK
Mqi^!k iny$iL:%eyA%hT>TJw>bm:PelpIBG\I9eI#wiC%\!FDRpEF9$M5eMW!c=b61I8tW>TXpjjMiItR&Y+Eq
kAJbZG =JpY1q6MSpwLcTYi*nnciPW!utX$G\@Y!?@\5dmp%dKp^<8LZcR^Ew@aJqLhHMc6tZR1C^&+j!4W4Rk4
wcnPI8 mj9/#wE$k9SFwF@@CedmY8d4WClke=*>pcijwaCPFj>FJZ@w*Q:/Q*?F9?:n4/N4wS>J>=G#u/DRldl=
wJ1BQE T&XWk%1Y:JM>ibQL#9%V#bwJ844*y1!Yq*wI69ERGj&IItdQe5<j%V:8VM9y8hmHZqkCL<1E<I*==RT\
Re:XBB WhI$SC#dPV=peiM\nm*Xh=w+9!aMNMGTiJh@MdA#:L$e9ySh5HHSjWkBw9u&>C:*h8@P=QYDRwZ$K!kA
wMuWkP CmBFW*>a>IIC#yDPDApi?Ja1j%DeBnRMl4cy!65+$p1?pE4?DFQaJile<*$+&4i+@m=NGS8?Ree5XK!G
Iajjyl 8!\i:EkW#XCeEwlAL!tehQM1PP>YY>:P^eYJi!F#JnPn8Y\@WYdGR$nCQ@J5HD1@j>9+tuKP#cL=k$y#
W<a666 HQI>Fe6dTZ\i4H=cR:F9<JECadmF+%mNh=?tYD#kb!nj:^m^qaJqLG!SYVRVha6ELT^5PT??=n6@X=l!
pnBw^# 8Dll:Xi\NWAq<ZdR55HFN$FB/mb96#HA8=S@@4*H@!91Qbi9&9#>GeWhLBTk5K=SD\Y<i1^qkE@V9LM5
X=Ki$& @86an/?A:YL$9*p\hPKE+4>:SqVBWYLyuZJXM=ZwT^6FZID\+NiB?R>R\Hbkmj<!/&QNyCJuit!!Tj:Y
SnJyBy bPM9MkiK=?h\i><d%eHH>8e>i@YXLH?$>:LFWH<SR$w8ie>=cAc?awPlWJuW9hbAXFq4D9!bMG1qaXQ/
Kc/?/F !Z%el!q1ei+1Kt+e5EZpNNC#>/En#YQ#Lkdh@>EMKFe5>V@ZECZ/QATjylTT#FniA#b8PBa\nT#Jc/lb
*AVwJV F<hX%+j$$1W!yTWA>X\y+C*4K8&dQVTDj%!d^Xi!ctPnk#Z<w/49u5t$9$\RiG9j$1PCFJQaR&\!SB</
W>Lk>4 @IdRFjq4H\&4Mw&eikWL*6HaLq@=Nt9daeFP=#Yj/:M?u4\w8\*Su4B!w9m=C#Mp&w9$#Eka:WJPR5LD
V1k$?H P6YB?c!Xp&m/#$umq/EN<XMk#PytF!qcium\eXRTP<jeFmpV:J!TeQyqRit=wHdA^WhYDZClC9I?^@ql
hDdSVL heeZ$t1JYCJWKq+&Tba18uaBGMQTCdKYZWZh=#Pw5HCaP>S%=<WWqnt^tHVl*CY^*<qytA>6cVnVVbF\
I#dW=d lSTHw+ynC$AmZp$dMdcCTIjw@QZwHG@iE/1^q+!M8k@lQu6lqpcLi^*K8?<GuVyI9S*Sh5BiFmh>*?=L
$WGd4% kDQeidD/jG4L:/Hb^jb5hQ@YSeL*^R8JqRE+jLDttpnhT@T/>RLp^1ctq9nb^n4y8D1$!#T<:*n^&TVB
auw41N K$:^Qw/WG@Q+J1a&NBE%Bq!aFl/S!8SM1&*PI8ulFK^He5k=*bR158D:1jhRkPB9Nh!le!@<&p*5W^MM
$11aG5 F>N#m5T8#qP#Vhi^eAIN:#mTqk@u*Y/XZ=4P+^@K!t!@M=hM^955+RYJC1#?WeZ<At?<HL8Z>eQSR418
lp?ZkZ YL@LKEmY%9uSh5y>>pMtjGWwQa#ZMMF&RnHV!IP!bhWMMu+ZpR4SZHB6FlJ*Q@kAuV:kiVCceeA*4:jn
G6R1d/ \>>WyePThE%Bw9>p8c>!uhn<JaW66dJAYetycJCw!N#cWc/KmjTX48I5Wl=D>hhKk>aQ4IeEmbJ+uVZt
!5N*k% wjn$^YlDCSFD?@^$E&c>CXn16&MC+/K##CV9<qJhG4@\ZqVwQQ\IVLn#pua:aF5N#D/QHY%JCV?M!k8T
/!hEEu S1%B++<mZ4*Im&GaCu9HLthNZQdmya$5T<umJ&HXE5MkZ!uY:jVYQTqt#\yEe9XtVW%Xe:=RVSP<iW45
9pHTbt =&Z$P=ej>YZQ$KAAI!c*uhKnS1<Ql*S=KXb?:C6bNukKJlH!?amd6BTam1=y\>1dFYT^d?M>*/eM!?QN
YHb??w lM+F1L^l#d!S8ut?Gh$^XZYdaBPAuak*\A#9CwF=jH\Q5t>>8a?mG6M8u#k1ZEuee8y#ZFV+$ijV=Yp>
S4W+9d @uwhncPthLtPHV^MpDw9?^JRHiihIS$V+ilhKu>%ZVnZFDYh#\Yh&Z</?K%cmu1p#w/a^4q%S$bHql\K
$#1uRu $C>tlGR@t+CbAHE%VF<i<Wukj<i*\:=Q5ZapD<:T*HPhkc5/mBJKdZW&qT?NXpeb^1&kD6J$yW/$!KqX
:ewZXP /NCPD/Q=T=>k@K>>k4mdj/EY&*>R/#Y1h$:1%IyM%EW5\\Ceewn*Juu?=^??1yiEy++G8wjK8EphKYwj
X!E6cK p/tZw>l6AS4c^*Mjq$*l#4<NH#t#yqTpP14!i:^LVw&WR#p4GEE8P6kAMqAp81hZqH>J&nw&ZP4HbS<@
>1\^H< bKNM\L9wSme%CkSeB!:9&m/<mm#5hL6e1LDTD&9Sd>bQaL^IN!C<b1eEt89hNSVIw6ZZeqmGIn>L$6D+
F=eW/e $CwCuj&9Neaa#p5i6Zt8?8hJpJFI9NcSFbWmM^uXAdmEw<ndY@?:c8ZHnnWB^cW$d&WlFDCMC\XeBLyA
R9c9NY ASy8L@:#H:*?/Wj@Z\FFwHQHuketHykblC4b#J>\DRk=PcRRDDWDRWk4yy@?nJ*k4IMCjCmlkBkdKACL
yB$EBl <KPYjh8mLuV?yLuYZH6ecZL@>uW8u5YWW+RFtGc:jq@Ky?4=ilLmZMFnV#n&*tZc!Knqm\e:VT+!mXM@
Hq%P!+ peQLX+E^*=PAnEQ<ewi+\b4G+5R#GCD+yjK9::Z$t+8W8+Tp5<+PF@IEi1GAJ%w6Gi*TZ$l8N?KuiEid
NQHWBw YnIjyHk9B\qib<%!w*pyy^Tt/$8:IZ8^#wA>BCYXdk=au9%+A\Z55u=:!Mq@HFPhLKn8j4mS=qc?CW6:
&Al1Zt wHdq&IMC4nh5Q%\NQ*dlI/Tn>n?e>e*/L$ABM\kNFLcn#l?jK=h!Mie:hJldmdhTeu5Hin#HSqTI6ZH#
-APWRY 0005bc4261f001202b4 Page 139 of binaries2.zip
bnA+bb 1ba<!RQcSbwpncWJS6NY%R+j6RE911R*?+yp5#8@i*=In$b<=mA&8uPyjK4F#wV#R8aVTV:nJ=J*:a*D
ppS@wu 1SRn$9L#ad8DKIWpMw9CV#*MtR@>&QFt&JYpN??#Z51h*D8X>q=G9dkntC%Wemh6iduX4F5LuV^y4tHa
5Ik?/& G:@iP9^\NjkSCwle&u9#89#X5:9#>$bM/w1NV:5BkyXW\8pLZyVad1n!1cy5Bh/9=SIdtE\KDb?9kD$Q
bnqWJw ldHPNAKXFnttZqYDFA?NQ8m&Qn*G&HJ%!q+8$\6N\$MyBWNk1mkI^=wL@h%E:u4Z@Ge$t4lEH5e@D+@9
wDLEn& N>qNA\yI6@HjipyD:k<F^AGLwRD:%5iHF?JhEj*at*QR9w?@l?mdD$*jj\=?+Cm<p#C*W@$tZE?<Iqqk
q4?FEq A&8Zj11*SP8X%Kb1/c<:QcZci+@X\=Rp46&\*:&:#npT%#*pShFc\lphejkE/ZV!V1aiEEw/q?6dIkpK
ku!GFn 4GeIRZX81L!jL>%uN/F!W6LtWI@q%?KaiN<8wIE*uq=yZInGNm?Ptc^M&n>J?/tABu$!dGjhA&:hJY!P
1Zy*DG aHJh+n\uhJP=K1XabLWb<6I*H?dnY^#XDSGKw%Tpb!y?jC8QI/Rt<X%=:+4N=wa*Q6K5th+X4XHBhJXl
F*a9Y/ Lm#/k%1V!/QC::<eW8=YC^Fm<qKTN\NdRkbB!Jnq68e1Z98Ip%EH^HdD:6XXYdCXS6*wdIbbI6wTtw*A
DiCbMJ 69SV=e*NWH#PCKh&d%p6SJQF6E<GB*Pit:uceJ9GKB@MQlIjDBCw%n:YuEu@un+Q6H?kcGj/Q@LVDV1V
d1JXY^ @y?aaL6!PVRKTWPyVZKb:DlYYW#R=&cbDlY=ie?#48c:A!hkNq1\#Zi#h%*/ml!cY&ER:/c6$WHeKH+K
T<Sjq> K*>aBH&jI:utlwatid5JS=&5pPZZ#FdVPJWqSj4^hM>i^S54EcLbD8%&5m$>9SBmK<e#DbJW\t=eqLdq
E5&EpS Qa%ah@K4R*QcSeM@t8HRZ<Wm8Z$X+w1=*IKw^Q$=4%@8S\^JkiFBSypDZb%4IVyypyHMnL58Z6Q:El@%
4Mhh9V NDHSA9Vd<5b#mt8cPHq49GDGBKtN</eWta<6/tHL?6L4l<Z9H<=h=!tB!i6ba>=#Z&YL%&TK&9DFTwwR
GJe%HR mX?/LJP+=LYN$MXmaNcbl5ZiN/HXMXTaq&hmM9Y?%+Mq>N!?h&t+NhPVP#NpV!^X&XBB8b=1Fy\<dPDw
YTBe\! GmHdAtB@G9+lEpb1<?MR@<NbB66%^y:<>KjtD\?tZ$RPGR&IR5u@W+::RPe!@4FypH9TXN$\bjyche9l
BdFAaI DXXpT5IAWV+D1W&uPD:#MRD*KLD@#c6&iPim6nlcN&cX@6:p8RWMVXmZ^&>\C\MIR@!e#@NW846X\8l%
18?44K aWJWE<WRYER%Ac4T!tpSueXFB^u9<4R==QTtqBTiM1wCaDZ>nGwCG+EkDKYd<w1LSbM>8%h/tJ1mMW?J
kyCk$F l/pmdTV9C?G%?$th:HGL:L/4:X8wmAXy/pj:>Y5KTc88I>\mQ8nS@Zn>aNNQT<58*Bc4%MPC5eJ^W@XB
JytkRQ :+ic@:L\6\eq9V*wQNt4Zkh#tmdA@Rby&LKka4EBQZWMZACG&>WuWm!lIRd/GlZK6SCQ!5k9AhT#yyew
Bn8Gtp iaF9udT+ES5@lRFtYNqAW+S1kSE5b$=N^+kGCVi&=@4laWV4MbN>K>PF*Lk1$9F/d>N6%5<t/u=!HR4w
yiJDYC CZN9@!Zb@:$^@9R@u4k@hPKaR4*l$:S^a/8!GuXXP/NGiH^M^PGRKKk5K?nb4mGZdIM/bX$Ri+yuRk/5
l1TlME MDuh+pC=>?XVtH/CFK4M&Smh5pbTRp#VW1TbVmJSw$CNw5KQLAkNmZd\HDb>c$kJd9ESwQibpRdcpV<R
8\Taac p$PeqJ4ItP6cm:dn%k+ZiwpB$a=nyb*9T=@LtYn8<qVMH1R8cd*^6tnC/ZnIMtH1tT4K4RW?uBwV9Ha6
kq&PET F*l9>BTaQ&PW5$^*Z=!&ySul?Lu@1qhI:$:w1+KyY??>>V8p!1:aJy41ZSiFBiX!*&KSp\?Q>j5ym>6:
4heaNa A<pnWX4ISE$CS8DJ+>%PB5tYMB%PJ8l1ChCPAa\peNV:6=aQ8kjLVb5%pmmV*LN<J?Jcy+tA+TB:C#e6
TT/JGe IR$W6kHVG9&PCJYmlXtd:*Hy?J&lH?6Nq?PW#l+=uX^+c@+ZSaC+$MI:!@mHJ%#=N854+%AAl>iHT#^Y
a^/pQ$ WFe<GAwa+m@^H\F@P5NJnBiBA94lHuENlqDAubmk65Rnp1j$wj<lm/ZG\8dlZBRKIJ^?wPcCVl%@>=^e
c8?>JP Y^1*a4CI&?INZiL1:YymqK9c>%4aBJF4uE<tBtPWnalLW6ya!=cNW>h$h^DjP>\Emhm=jN!6Qpm>$911
ye!/*R h*BIFajXSS<Vk$89K##P/p@Ry&mn9w/cPhS\n58LFZuQ1=5k!=+#WMA%kBCC%5Na6\>aAGqS5DFn54Tb
Bjb6*i S5FwPiq9YbT\c\tuTX:MjXl!KS^&ccq#biN:&$kj$^$J!tG9^\#LCeXhL+KjCR^4TFC$A@EW+>1B/K9y
dF\+WL cGqDJdh+Ny/B5DKSL!94u>:ZjlH=9FMB5Z5d@:!BJ&Q$tJFBF4Yw$QK/+ee*/HVpniQ&VPB&Pb?V?Jep
jVV<pu DL$qQBduVi*1IyJ:QqtjCy85M%qSpd&JDZ*W%DtQq#Iu9jlA:Ldk\m/*9IQ%5<q/pVN*@#PPh$^KD:9?
MHIc5q N>F6WEBS5dMq4p@lk?1w?wNJ@mQX*<d<8yF@#cV<QRun88@DGXdkbTb!9bCAHeuL?JJBd5VKutaXRy=P
/yMbKl I^EM$5eP8=wQuF#G#lj#6uaC6XH8u1S?h1p>@85WHVb8VRBn\DJ>9p\*VR/1L:<>m*t1E98>n6\h5e4H
ACLYd1 6$WXiwuu&Yu=Ny8KZ<HEhD66=RKn#tPwkl^1HLn&95TMdCW!w95y&<>4dE:F&XKh+JE^K1p&Wd4dXM?8
:Zelna hdAlZQQS/l/$h<<^V=I$p!^WQtpqV<Cw1ViPKd!Ry#JGc+9C$BKpF>:n8*8p?9%@WN$XLqGbb%@EWLXw
CaX+py Ph<!%wa#4m\+?*8BGFX#Sti\&Ell94Ra^8RH/P\i>u4dbuBR#*j8L\EIu?a5pDBdZ$6tFhNiAc!p#@jT
=+RHbj Zp8H#/dhH/V+mb!L*th<@1D+*!c*=B?Vt?MX*ViY%Gdj\nIBlCZh%WlWeBKHm9y$w9i5t9nXw4LTIuV8
bd\V#D MHHyeEJHnNY^ZZ?VAw/VmW?ZV:F*AG/4pB9?K%/?5l+<Xd^i/Ip=kiTp=bP6^TqQYFlTF%qjacWnnS>!
$>cTIS VM49=Jj/S^tQ?6Y+An8I#HY*SbBVbLEpChBt?ydu6?CJK?m4dpyETyNdatQpMaywCXkGTwM=PT=+$dMT
KSNVub bn+#>YeJ^45*NpWlSF&?&*8/qbSWW$*nYh4*q6HY?+I5q6*Q@8tek1q^pp\%eqqFnuVCtbH>XR<dt*Ml
?DpXDp 6WmP<q&Du9@Ab8cF1Mnb#cQXw\uDZjWlpG@%VN!6$*LMj\4R:k8Gch^yTLKSH<B@b?Qei4@^cCZANieY
Z^FTII 1Y@Fq$a6cjNB5i!YQ\a/%:MjG=ZWbiWdWk+:Id45%mC464yN$wkV&ZBI^@6F91qX<+apCY=bX5hXpt16
Q+&!Ce =yTW<Gyk$#MW\YpwkH:*$dK!V#*cA!Wy\Z?bDQRF<1dJ#iVEcK:pFB&w&V5EHCZFMy++PwSa<wdbPTeP
uwH/:% +:d=\HXk?kGNNc/+P&>$FacmDAe$XdYibkE<H49*l!w?PZPHIuyLa/e!pVqNMuP65Gm$KZwltJLT+qH?
HYS8Nj EVkQP1\Q?@/HDb#QPbj%i/cXdh^\XiPWcY=STlBhS+YAjD=luDD+9PbpudAW6?Wb/!Me1%&N?FeEVnn#
1m&yCh $YeleGJcPdXwDR9ji@$XG8@%K^:&SR+@Pp&#RAFcS=>cMG+4M!?G@Yhd9y\GQ=V8*uP8Z#1&@5mCApy8
PTqG<Z Q9%QD>?DVl+>L>B@KJ@*h/i+jM=:pAwFqH154!Lic+@iYu\/ZQZ/@5lL#Y>?d=^8G\*9J@^uZ<GW4+$Z
LX$p*F YZ?j+:u%tC>*Ri&uaIP\QXFDWC=#j9%I@4PPYbGV6MhiDGa<ww@/@e=nN!ct/6GTpqYR!NX$<:WGk6+t
\GXICD hL6ka=d6i/uqS^nJ#Pa4$m6JuN!>!it*d@lt$=Iek$ZDY65SGKJMG1GLj^RwtAQ!#Bb1WZH+qFd*Wn1^
l5*MR< 9P/hJL=Fe=^M#FhbI9tQRQNNq8EwHPLEKF*444tldbt1?9hVR?e/my%N%9Ep*k/dhSe$F@py/T*/AjL1
mISRe^ ^eIL9J4Vc>cu&QCYWcj+Ri:S$:6=^bKJ?LbTM8ymJM6hd/BV#@!ydF#B&IPF/!?1c4p+/=6AbZ*mlMD>
?&wZ&V FNJaTVVyYJi9N#m!ebM5FEw#6J1S^t/HHht#FkRW^PWV/n>G9>?+=/PXZ$k*!1iDn@Tn^X>yKL5<E@Pt
AI<CaA l!HMn6KqTKPwEhD8yy&WJMYm^T!T!XXJ#MKF$XCBPTe<dm6d4LWe@RChQuyVc#u\+b?H9kS>LD8NGVaP
we!k*9 bWRuynF5qdaYTWa<b:LmV<8Tj&lRwJMa&PlJ1LpaC5^EcZ84>@\\jb=:<iG&aRpKGEl?iQNJ?pDp$1H?
Pnw!bb y<n6Qj644Sq*Z<c#5tZyl5RqXB6nJyV*!8DZbXGhw5b+qEZkw?yDSnK&?TNM@jGhai9*YlGehbV5/Fe!
\AbR<X 8/H?=wdXn$Q9TJJ9Jn6N>T#!\*Nd*=Mp#6ydPpe!PX^H8!Awb=uJ9q+F1=B^/A#@*Q6=tVAmEwZyNXun
RiJ\Y* ypS1#KB^RY8LKEyljJZDQNj5/+d::MDQVY@M*/pQXhj$VAY5c#qFTH&nb@41NKnG!VCj85w^1WmdJEb:
*ija$> ZpP4yqDhFt$#tCJDp8\9F:!%Yq1Q*4PqbmT@u!8/\?&n&DJI#b%blJNi<daHXawH8^hq@1:q16e1>bDy
Sa<8JL #Tc=StnmE\=^/5+B995D:bJC<W:GF?k/4GN5bW84Ck<GRR\tmVTS=IC&=H4cBERXHiw:DR1:4I=W=ciq
wNK*!C ??5?uySlN1d/miaZeK<njKly!J?^QM@HcKC:#Kw>PPJN&*l8SD*hM!pNl!^1#6Cqpdn8I4t69Q5$elHX
<Z95QQ e>cmaj4t^lQ*ZRcHB%Z6FmFiHceYn=l/jCX:JTWVSV8:*>5$:IYF$bhb?u*uA%Y4u&cYM#ApSm\9aM?*
Atp*hq D#HpK=>HF!\p4TmRTd#ZnGFIC/TinejdA\nl?DHS9DepmX6\!heX>ZK$@DSSZ1+@GcRCppFKp4tS^>LC
nkB^/$ 8%@&t*<^ZjIYPy9?ED@qj:l5B\XR1>>c*qQpRRG#DjMQEwWZjaMt?e!8jNMPnBGuVCkit5#Q#P*Wt5Pe
j!\k4G &P^E\he5iw4Wq+9dhdi6/I#BAj=GSyB9B#*8w\<:S\=K8BjblZMmpm?kABQ@VQ<WX/Z%Ay=H\=W&je9W
d5jcGM #*R@+4@W@:Cn?&tq@::M@%V#nd?Cmu?@>Q+>u5Ku:^^RkB*dn^SLKMCN+1wGCtnYe94:h%dR8jVHL?J@
4c$Fc+ /Q19qQL?iN!8V:5j19Z@Z@RN^9VnBR?kAN8!!4>epiLuFijVj^/wA\Y5qBK^HeTlQZ!@EHG/$Cb@h>@t
R>#*9d !8B%K*?lXZy$K^\@W*ky^Dc=+u&&Qu@d?MYZ$dhTii9485kjm>u<NeduZ=adeQ#MC94@B+uM\1tVDqST
dmJi=G pKlHAqXp&#Z\CFKRkN$?CpGT6K?qhq\uNQc*pRKJJdC5i?\p?ImqQ*MKtN94q+dk>RAQL^##YIuRnK8e
EknAnY XdcESEnRkRKJkBtdjtIbm/S>WTtVnA!6DjX$TY^@>Y>IRDQ44@NbjP@SEHt\<!F+=N51@KRqlb\XqYEa
Y<+J:J PT$IIwjDjhYB<9Rb8NYhpK=tFnN*<w@qbu^V9B#mjBC/mtMDiq\MKluHBnEamCl!bThplSMiFYJJmACd
-AkSVd 000073abb0e001202b4 Page 140 of binaries2.zip
FQN?PH 5a$Xq?l5m!8XdV8QGuP5A1Fu:dVhd?4i=y!w::M4i$a6!h=N#6FVI:e$XHP<JFae^wAKYRb&q5n6=#1X
C6CXHC qJY^DY$N+CLqhmPR^NDa5*aCVTS<?CT/pTDew*aB=&&XL4bV>ZHaTM/+cN5lEaS>S*XPyJ&=M5MMNaN@
T/NAZH !X^GI@!Z#GW4qCc6lc^AG*4#lBHqqyC5&1F8i$cIdaj^l/kE5THc#5BpVcATB=?/cmlISl?4tmyGC6\b
T1M+H1 4ZNk!1JB?</k4$ISGTk^8^wD%kabTPQ*el^P<\*!GJdVeXR=1>ZHynIjGW/abi&*G9CI#ZEkkEqRY1VK
n4H=jF Z8Wd>t*CLq9yST9c</:DRL:R#B*RKuwbN%nC&SyQKjkDyWAwW:kwlAG1k1I%C8LAHK%WlBD>&R9yAN$F
SMu?I\ WuhelNT8?hn1c#kKu!WPtV:&=Wu:wy>J!^I/y+K!Im1bGFh%5=npeejaX/1J4^6*bkkluKM/+KXPKZ^c
&e?Sp9 cSDLN15twnm1*IF^H@FKXq$jj5=/Bp5ubL#ey4y4w9F+^MCE54Nqaa+#upP+&tl4jwdIS>5E$m9IXl%&
y!#?y8 Xn:BnK@@KSTZb:>@4a/<4MuGBGIIjE/hd&jX?F&w8#1MI!Vd9IInuGuw!GX55?=IIb<cATXRw/>!plmM
T9%:ja $%e^y\R#h4cm6ew<yp4A$NnV#i9b?J*yV9+bPl#G/$c*6k?mlPk6CtS:a$hyIN\?8AHhEV*&&?WN>&#y
4H9Qeh <9Nd*+h*&PhWW66#*V?AP>k9lAp?uM@QKZ^yi/qieZZ*?y#B6@TmM\%+lWRl:?J>JLVB4#$$?8=q6ZXW
idQ+Gk wqc46L&8Gp#R<*$P4Ndb8!>#JGX5$ad^RM5D+P\%QX1yBmcdlqR>X15i55MYXm*&QM1\*BY:*CyJ8n4=
M15Vey #nL%yPWG@hhmNZeypDY@Y8nFRh1YnBLS#ZeI/BItXTZG?P*4DZ%qRFhdTQy=1nMQY#ZMSI+qa&h/+k9V
LBtG?Y cM$8/nS$WlJbV^dHp\%yaA%yeK=Q*HApS8=e#Zh1uEwSBP8E&1KpehNIC>TALJw\4bad8Ne!6nG>JQ&\
IQ\hwP W%udTiM5=*w!#D=Qen6lIqtP5CpH/VD*!PH>JIa:C!RDXMllN^mCpDXGMtEhZRhEB&p/in+p5b8n^k*C
Wn\=!a IeKuKGEX?/uJbbh^>*W1+ZFPwSZ\m/SJtH<IXuFEW=JAE8=ww\&dqWKCyZS/qpebEQDHDTZu@+&LbQ<q
6XKt*G ?#aj=h?m:j/4<b>e:F#@#jnQ9?WC@/j+V#D*j!unK6jj54a?duD>e<dX9<eVG9=4cj<>\QP9h@A:mc?=
Z*9<l$ &Lq@B<$D@kYc=$?liZ<H@a9kWm=&9n?F=9<hNQ59T5:B@1jRHL?B=8dn@kYc<$?l8Z+H#eQ#C#V+V/F@
>9VM9< l&9euL<1Pe?jR9<P%<A<jL>A<@$y>P>\De#=^!HaZJ#5j\4>P%#:&in<Mb4#V/F@l&5@*?5jw*?Hc=^<
+TAShM 9$J#@!u$:*D65WZ?Bb4*V/F@l&8@DJ4u+9!6lw*#n%ime*H>D6t+iZ@^\4q?l&!@Yk#P^jW:bAN#@cJB
$5ZY\H =@w65wF@WWY=jwh5ZJ!@88@jIl9@4>C@SVd\4=+c:=>/=u^@C5*@b>Bk>n?F@l&8kZ?^PIV4u=XK@mkb
aciA81 P^<4Q?6n!<*Q^<yl@VMX8/dd#<V4Q@P6c>5+Y:C/P:GcY>ld8F8\Y64aY@^*p:GDH$$q?LHYeD<cX9Bn
VD#@/q tj:u!hm=@qpq=j>a!Z?8QkE@tma8d5/@*MH9qB#<L$61@9/?@6MqNj#@8KTGq?eQq6V<w*dLj$kJ@&VZ
p&@uIV @=j5+Z>d5khTHpeb+@>P5wj^\!?Ie9Kby<ql&XWG^QL5Vj?pI8\5<a\66DPaByM#G^K*#BQ5%nZTEG\Y
4SFi?Z SlkPA=unnGjhN8bDX?$\JR&FC=bcmlQQXTK5F&h!Z+KHc:YeBb@IC*C1#Em!$GWn@jmP1CGLc<IC6FHR
@m1*CP cKw\#WXk/&a4t!C5L9QG+^16E>#ERwA%BGAm5:#DyEdkl5?E/&S!*SSt9i\\nqWWw^$Fc%cnMqPG\BY6
iV@%wY Tw@uSl\8A$XdVZAN6LcDPGQH4M&*Xmd#i!H%F/PaB*XiPPHEK?LPS!>C+i^X6tK$6:6tBHKShqi=#*4C
dAlwEb *WC5%9w8BkTaA:lNni%h8Pnj8Yi&aku#?%@^/:S!WeZC\EP>yVjhXF?mBE8P4E1Xl*:i&F/I%64cuGi!
<K*kJ^ Et:>41<\w+yN<#!^?h4QZ%l1&#XGaH$i5#j#tT&/SSaCwZmycZ6Xl>=j$$nwci=<n>+FddhNN8WYLbdA
A^6h$F E^%Fl$44$Bl#Yq!9?iG9iY&MCi#eiH1P^Y\CQ:Tmd:NMaF4^hcnNw6%\A#d5!<N^+y4K^6l/R8DTJ>ld
&BkJyB :e*5im^MyBpT%8cjqA+dcF?EVyqhN^&X1tat^dAj6F%*<jKJ5>t!4!\dJY\8hGXy>NKYY6kQ8$:9D*Dc
B\nNei e6^*Ct@ecMa?%iZmVmZX#W:m54Ruy:P#tYhTj^KmZZ>hJBmHXqZEDbtR!EdIFi:c5>InQ%:pyZ%P=5*+
Cc9IWn QBk!NBlLMmc=pTZ+qyjXF8iIZyW1Gb?b^ylI+<WYj\ubJD9QK!VaBHX>%K?<>RS!9X&$YAlIp?<l?^IP
CJ8^#4 GR9$CBWl6ET=6q@TeNtjb?XN6Vw@l+YBTKCaKB=\y<T>Hnb^NQuTi>#iYHZ@IZhLd#\XNyTdQAh858GF
Ik?+h1 HhZ*%P8I8>q$Hn$&LG+t<\pR$9I6=@kbu1k&=!jeIX<MBcThIHluWDcVY5CEdDQH\5bi6&/HWkI&iX=@
46=Qtp Mb+y<amjp+&ilHQSk8tQG??NLKy/*N5ttA\IN:A+uAawV19#X6%*E8FclnwRZ>M?Ry8^ki*JlDHc:Iwb
JLyJAh &PaTCk6<MyD?LhJ!TBQK%8*Z1%>Z@n#t:RcDFlyAMeDM4bCY5&y8\pGe%le!CaQA=FYJbe/$bj>El#w<
k>wBLp aBNuPaIqRK465u64<5t8@Zk$!m/LmI$t&a=>yaEm6m:dwQXwjt6T?9qB>HC*ESIe9Ze/ntGJAqi!m*kt
BtkhJ% a>DSGW&8iqJ?4P18KemuKEMLM*=qKMy$M=tnaq/5Dd&5&Y!pHbiXl=ZwCbhW15tcZ4ZQ%n:S6+heHKC@
9FYKkQ k6a^hH::6YX%n6@djaDhcHW9L#6QaJqy?6\$mXE!Y$D9$B5/&Vme%@/dm#P\aZN4MGI@?GyGy%Z:VB9E
k6knd4 $#&K/+Wpu8%n:+w#ibyPVu:kBWB\k8p>k@4yW5DGEG!+q/Hwp+hl9I#i9adeGFLHQp9V4+$Hn&dNbHAd
:pTI8l 14TiK1!Ykt<?^FKH6R#Dp?!4q:>#k1WRyKFmyMGPjB/L*hhwMbJIFG*4hP1!!DapK4?h/cYK%lI9LSY#
e:NIl+ 9@QPSYu+9G<y+jSp8S1:kDWW?p^jde95^bZN6?d=@6!RV\RiL@q14#E%JpT%M\S<QSS8alYel%$YYk?1
DCZVR& T><$KiWcp=^a$B9GQu!5QpnBYC5dm>1BFSMcSD<n=*SB5p9uE>q8jFKy5QZ/Y^LLJ\?dX=w66bHcA=Tl
Y^Ma<^ jANNYha5!9p%GGCQuy^5Be=RSFyMiEkW:qeq%PBc<p=tR9y1&klJJP=GlJwFmSHcCEy%V4&PBY<!J4E6
:#!pee B1BnYCT^AWuIJmq/Q:4uVk6Jba#iKcplDwybEca?4ZkInmyliiNdaQLB&?4<+uMh44+:?*$VHQTWeNmD
e?khe! VWk9nA$6hS&&bNLuwyE=dA5S8^VpH$^<4cwkC/uak$6=tw9nd\/&9FLJ=u9Kpn&DI/K=>5M?i@YcM/+!
CqCN4M 1iH8G1Gq%e:uJN%q%!tYbb<@T/nDeC4!tQTq<YeC:^GREy#S5!QZ#b9I4Nu#jAwStRWutPt4>F+LhYW\
!!A8Sw ^L%Nu=1%encbKRlHP@B%Kmi+R5$EhcQaFbFX#HAS6q!yQ6G%8&jkCyW!tQpkHc/jnmqPy+A&m4^HTwi$
?&NTnj <1b?5N^!*1HYm5d\PGZT8uR^y9G&YV*#S=D@/TiLKetJ$XLNEjjldD>#1Z!=GZY?adT:k#YtqBd4&Y$d
aJCD!4 hMq?&=XJ#m<KkZ/TkNeEqG/YV>LypWZd>6?1?+j!9il@m<y+?Wq&?PZ5qnT+DYFPtR#HmTGVwE48FpGH
%a$WSw 5tD*yGADHkdE8+1&NqwP<:b&XG%AcW>lqaX5A8$WukQ+>R!TZmScHHhbw4E15*+RVFpj&?*LChmV!I:Y
<#:+eA cKqDT*l/ii%w=8#aR915l5P=aLPFY=k%MlpBn6MhLi4ebAiwV&uGK?n!Pb1Li*nQywqeQQHHJ^>/NPha
9enJBT Dh+9DIjemq:+ib!159iJMd69YtLXByyIhGeb\*dX&tQnPI+!u:Ze*1$?JH&1Nj/YAJPjd*wqNlMP/CLc
eMI+%Z TiiSiDiITKFPtN:b^C/K=BdV5Bk@L@Sc\Acu9*^iK?@$qp!q/auZhLXjByphHw6bb@GuS4SC1d96F#H:
Z9+8p* !/tGRC8VXG:kNRX1:\#?y!G<N$tJL$1pm&4hIDG:I%9a5Qe$PnEb$t$h!EXea^XBMe/9Gh1mI9tmBkW@
!kj4#K D>@1>yaw$RXb>V9ZH5SaDh%=w5K9DZ9Y:&b=!yuuPBL*Tn%5B9R6hhi6IN8uQlW:5juK%Z6>?EY5dunE
8=X9iM uSKC5t%yFw+Pipy/@FYtBBP<j&mDBBeAaphJ*BnwyD8?nIa9GV<@ACb+q6#!TXuY5F%wwRVaXc=6M:n/
Nkh?l% j>aLC>F=Q$RG=%CkHu1NjkV9icTIZCYZt^PDhkR!S<tw5DV%mq$=4DLhP+$=Ww/:/T=yFZ>:W@dmbpQ6
qLkp<# S8J&w>A^wPwnPC84Tq=HZ!wEZInh?6lji\L=\BAklAG8SA#!69BGmk8w4wBBmF4^QG14kyT6&DJdn:Mn
<CW6@I wGj^wG^WKQan!*:Pj@w\kWy5PX#kYlZt^AlIK%Va4#B*H>KcR4WD!hcAK%GcK=<5XX&bd9Th!<P@^+^y
eldJj# RZ!+P?d:#QI&?wk>$naD>QZ+^1tpjpD+ujFKRKuuN>8566^w9K&FKV95Gw/TI/TXQj4QhZ*Q!T$VCwAT
e\%mGI Bj9\lawVh!+Qc%lZbl%>baw98tKd%nA6W:GAp>WD:qL\%C+:TAeJ>bS>@qQ+cFd\\YGCB&i%PEXNHbmW
yLR\JJ HEYy1AE1E^CXtIlSGlaWpC9jRhabjC\p\Hq6&5\ajVR5E^NFFjFl*QcK@/pAqMX^kR=:*1b1Flmum8$<
P$EHnk d^<#b:qDd=8D:wC:cHN5wBmJ%@ebNWChVl+?JlS#48D$Bhb:A$X#umyYjucX1hMc$=Q\J/Q:W/+BhVL$
m4HKEB %*%=m=#=KGeN!c+!mkAdp4!6a/\puyJh1h/JY+=ZaDaXWGtYi4l61GYi9Y5%+:kB6d^Phhbca$hjC$bX
*wQH>Q ?5GT/XHDSnk5i6dG^1Ci>5T4p:N!!tuMTq8FqD:C%T<FaCttJ:L4CJcMT#YZPQ*:\DIapul1Y$4LJH1X
W#B*>c Zculy@$KZmkq*Al1q6>\#dEKiHel?*SajLLW9mCDQJXRAdR4D:WHGRR8@9K%6u$wnCN6B8yK58V:q#9i
eVyaJ8 TFa<SqFQu+!JnT19uHW#w\BBJmB!NMDu6G>du=BKQpp%GhAu/EZFCk*#CFnRy1MmwGbB4u19na?P!Ah5
@>Nm#: K>Z<*NpT*Ia#SR@8LN%R\t1Fnj1W!WbNtEj+iSY@=yd*m^d9*tGptp*^ydG#<ZLEFI#dG&<HjC!?M=/5
!D\I4D SC8yRP5uEZbcSqW@wR!=4eEAi6L9IAd5uuh*PE=c\?Q\PB&JTLEcd/wNqG#$elY<1kc>N$jF9JlGd^t&
#DGFn: R\\=ReN%>MS%==@^d98&V=Nq8+%J^#Xba+:=qnecRbb!Di%4pY%$Y*wl^HywqIcN>n5A5qVS$54Ea#bD
B#>\?? /%>KI6L@n6nmBn%5=H!L4$4c6kdbqXwNi@Yy5TQKpqFH4H4Xw8Tbu%R@>wilQAS5>QSh!%5Z^lQ&T8Hp
-AakTl 00024829b91001202b4 Page 141 of binaries2.zip
?9ytap mNFmSZaEH&\YjAGZ%PMVK4Gad+wM*$YTF&X4aD$SRjY56+/RMBeQV!iXEmhqlWANP*H%4=/INIyYR6K^
Y%8\=! E%ew>m*IC!$Vh?N5H>N\>iZSuE6Pd6%eiD!jCkpGVY&^*daZk:aya:aLAWEnCj#GP<<Syn+#jQ#EKljN
b&48?I VkEb=6SH1DMaSYa8u#t9j@ltthDMJJ^db:t1dQ%e&6dtE455nN?$Zq/i:j\:1lWa8GQA#5/uiG!nRV1B
l%JhGS i%1q/WHAtJE1t>Rhw!k>FYEdS!R/E+4K9QCA=%k$nRBt#<W5BV4KceGn@ECVG1RyJ$MdpmYw%?ED!89F
Iu6PBm W1<ZP6Fkk@t\?iH!i<b:A8WV*G5+unkhMn46ai?YhyJ\*M/K6=mNLbkY/FQdlhqH>VSe^T6\<NZW?lkQ
$Vhk<4 yGt4eV9EVmQGC*>LVnK&#F9iE#Iwu:N%JEAdD4nw=&Y9y?/h6I@6PB$:6Hej$kN^KL5t8B5M&=t1T^nL
KF@A<X p:mk&Y<p!lnNjX*qKawh@iaG:ul9>hnqCDFFlc?WG!XSFiTeMT>V>!B?pk^!+:KP$!t8hu5Te88G6qTC
LGwY+M n9%i@nt%qcK#W?y*=L9q*Z\ZqT*:%L\G6YMD=aKGim^Q4C\?\Bw/E1wD/:JbBJM:w9tMFK#yF&*:PBK!
+@M%Ly mW4B+p#BA!D$A8WXa\^KWy:HH46$Ph>=\V\EE^@ckK#X?*:$GFc^dK8Y@Rp@P?QM?ST@I8c:KShtSSS+
*=pV5p qDeMTKTtZp1h+8@h=5hbXTDn%a+X\WpBnY9KiX>6!%PuK$Sep6Ih%T@T/bu*yV=uaw@NuTj:QIptpmG>
1eVy>M Tk<+h:D&Q@GM6=&b5u*j4cMRy+k:D8!Zy*u>FFYhX?ap6D8%ZNNK^9PqEMS$CaNCG+:FSh=9F%Qm%lcV
TJT%TQ 1^GNtqB15IBJ@LMnik%uQReC8@i+c$tty4PaKV==t&*YQ58M+?VEqX%TQiYi6!*?aIpmSSnq/kY#&WkA
EYTi^G WM6i^iJ/^tuEN5WD5b!M4KNtmknV5y@DLwt&^HE4jNd/4QG11JVVeXcVMjuID:*KdGmtBSE?IG99NYNY
\Bl8^e /&\PZ>%4!VSGpL!58Ldk^mYeZaYyi>WP8*dbhGy\8J%WQcIm6%q$yI>=CWCWD9k=J8T&8q:LE>?Cp9cF
NqD55& l%iMw:4%14lkC#aeIXM/T9&D>cJS@5akW@A:Dd1?W!$jXQQ6#Jk^e+K%h^:>QulVWQbRqnpZyB4tSd9Z
#@=K!h +5\MBQ#Y6?bRbH:VdE9YD%Kt%V/6CHImel!KYc1i6dwXM*&JCew/1%j^/e*6d$G9#PaFnp9&C?ZkcPqj
cL9cR\ CeNmW9=l+tK8j^c9@h?Taaj4u!X9@>DD!5ZH@keiXq/?j@i\<9L?%#!59PC@iXl=8j@F\@1*/cX@t:n/
E@9K%= k$qTMP@9iqn@RGL**>HkZ$%M@+HE:l?kPZ?F=9kN>M@y/#>Ge@+P?qj?t#?R&Q%*>M<WRZ?MB9<Pt9hZ
ZmCB/A cP:jRZQ@C5*#P?@:X%:6Q=Da@c?kj+64+F?>Mj+@k?d=Hc:^eQ\K#jGu$L@DNi=j5aYH/$?lj+h49@S1
KT^1W! <*D@KjV9eI&d/%hw*n?F@l&8eZQ<\kHD<#6e?:Yjp9i*!QaL:ZA8*6<l&!>>S:!ej\4>P&RD@$LHt88j
nIF^DS 5>L@Tkcap\@M^j$*@+*+w:%&@?uCedV\auZ#MLZ::+9@@5^?#9%a5y@?Jt+i@6@^&9^#H9#@#iZ>/YZm
J#4=n@ jnTNQ/YCj=d:h<4L</>iJnD9@>VL>B?=&u=/teB@n?*/=@Q!@48Z/dEG<j<@Q<cZ%DV5@!W^9uI=JR=m
8Dy6Em WSM<uXY&JAmhiS<LT+c/p!wWT1=N@^KP!^CZm#uZXK+Kd+mDDyi\^ke14WWpbSYFVNY^jM8bm$T@wEMA
u?Vqb< AqXXBukuPZM5caBWJa:uZE+Cwh\lMApP:MBwWD8:kqNJLqn+CB5L=&iidhp&&T+Q8h\nWA*^ZNG&dY^n
wheVe8 ^I>eV5l4V4GjEeAtJ1PVES6%mKkB@cKlDhanklPi>l#YwXku%jm=K5/RutX5a^W8EDNLFR<Cn@W?yyLb
Z#5Q8# kKlFn+5pkV*4VAJ8l6w+5Z5ML\y&5B<#XaVnReQRM>hQPmkbRiNM8PY15NZ%G6m+KF@*J/W+:F/>p\yB
%##NZS nRQ@nF@PIyLCBnqlluGEynd&XT5Cp!S%EY1BWnCA=ZmYcH5%>9=tJT=5!>\ZQ=jVMW6K:lJItd^FN#FY
nI?STL /?9yCpak1YKcWC%t+YkTjh>H=Cj&#CdnBSS:B!6kDdeQ^JKBmb:iN9<lBGhyqhT8E:Ii&>NhMI:dY*Zh
pTSb5A %dQemJDb5qP>RyS\i6*SuY<8cH=eh?^XE%VZDCJnbpTKP1?JZZk6a*!=JW<@^C8H1mR8\4E>5EqcpYu?
qlD1>p 4Hc1G9!peVYabSW:D6Qd4LNCq=t\@*IKW#Z/5>A:tIWRLJRjQcKJVaiadNF=N%P:eI1FPJQ!Vwp:RCM4
\nw<DX W+EB49JQ8RN9$Aaq$ZP6hHEMG@%n\HhMPwa^<IRq$=dZ$RG4u+<jCN=jcPnl/b*w+qecF/G<uaI^&VEt
m#AkWI V1qd$5X$HbHw4MQN+=!IHh=CC*+mlF\&MbbIQG*1&IjW@=HA?81>mR*HX>Y!:M?P^$RkPFqMA%!CyI6k
e@>iBn ZEFcbe^JN$:Mu5SPmQ%nm+Pbp#BupNlGKaHG@+HtG?^BSlPqKq%ia%nCAkpM\CQa8dt6!T55GBhZ*:N1
A!pBJ$ $w8=Tm>&+#AwbKkc6@9CjZ6M\b:FLqCpJ!?YbF9?RK15</abZkFjy@6i6DKk<=p+9WYEBGIk:iJaGjbH
TQDJT> $GjVRXApbtP@>$T+&YTRYiTwyJRtd5nI5$$J+\B\i\FjE#ENt$Sw9qTj/SwJHT^qWpA&QyX*RtT8P=5b
HX8JNc c9dPMEV6?iT\$<8AHG&1QS9!Gj8k=NQLQG1yhZaNY$GDn5HPIi8Q#@XtB1L*8*T:iq8RcG9pYPlnF?kZ
>L@K<\ &$:kSwaR5LFhet!G58nM8qNhI:Wk%ym?E*ByEG9ejkFMqXdnIZa@c?/QPRqJSB<&k^\wA/PH=>$n8t9X
jbm:@/ ^Z5jSGuk&ZQF#Xb!pluTm!cGY4GnqV*wW::nl$nhEiXKTwK%+uJ5y1Yjtk$aXwcT=Qc>\/Yn:dT5Ta$V
eE5:W9 C6CL&H*:%Y1tBwZ4<=Na?5@m:JIX+V&ac69!KVTYNYTMA\XQVFXJhqI5!b?Zy\N#DcePbV%MW#V/c::b
+n61Bl MXL/F&DNWF5jcKt*:9F?K:@WmpLSY:h4X6ZIEXHl+a8$FpL&u&H9E!Z\SKGQ<T6XYH!nXbeedK>HF&?>
*<<jH% Fqb9&#Wmj$ScQYCTMHt=bQAGnc:CQS5+:dq8HEPLpAlkLGY&CBhi5LuR=Z1BLwG\m49<ApiMMy?p9%uc
BAHhKi QMH<e>=5@kp%d!F/MttKA\y#a#:RiG5=a=@qm<5GaV1#uwZlW$iV>#C=<PTVYKP/n4^wIItML^!5Q\#b
Y+jG<Y =dqF>DC:u6PS#aVaw*l<JEyDXcPKq^p=ySVPuD5:8cYwXC8A4p&wRqbmT\WbDZYLe+IKCZHkcc#d+uFj
:/dm?w :@9Gh#&IYLGM\@Fj:L&>i$CJaG@<NQXAP1i*CmwXw6H^XJX@F?mWEB<q8#YdeX1c1&#PXDFin:mT6Zaw
*QS:>R b#T<DeT!eNXakIEDB#SQKELM4VW=m^u6PRCRuikW1:Ny*jAPZQld9k?aQj&m<S8h6GC>KLERbh%55RD/
:^wYI! 5uF%8ABuR\Jd#=ZDN?T4u$<<WjW=N%/ecPL^?#L6ZN@!9@t1=Z\ZB<T=R1^t6*Di*8hDjCJIT<lWN!A8
pDdmiF qPKTZck\ZhTmy^yMpD5VmJEuNp>pK&mdw+Z<RjCHC>*BLiQ$PDC:P&4KXIMbp5ZIypDFFF=a>FA<@/K/
8:F5^S dqy8biYTe*8Y$$4qcc#/e:JaPG>m&Dqqh^T6FDFL+Lh4wquT8+VAIF+p/&cymdp%1I$iHW86K#RIWNla
/lpG+/ PZRID+Mh/aVZu=<XVYZRd%Rwq8jCS!\k!8wem>E%GCk8?5:b:&\Aq&4+#H>N#aM6>l^LdLAw9E^k*8HH
emMejD ccCDiEFcaFj1lA#<NH<pRaP/iyw8Z*^w6i?m\Xw\acyJnY/:qP=I5pbSmR8^:8DlH4PN8F%l/q6P>eF6
j*m=h6 Dw5kMk#P<ZjPQc^IhPQ\Dy9X?GIM&cSQ1KNTQVPwe?8$8inWXQ4&9W1H5qdCCtbVpp::T*e9EbbN5CeG
>@ik4I 8HR&^@K^q/=!Z\6akptdjWHXd*i1FGX4bJ&m/kG+yLDie\yNY6<6hNj\mn:Y5=q>LS\=c#A44#&@tyVW
/VLmm8 Y:w:J=VTanTiT5I8QJAlbFhAD!Al+H!S!h=qK?lnWFaYRaqZEiT9l\48CYcR\5wkHR^/H=LJqn5p=b+w
JaA!*> <mFkTe44A1dl\5cm==WBYBZ/w5*SeJQD:\aH$d>piyKa$LK5WYWT&1GQE!P6*68=jN@SG:Y<SLP%ZH91
Z8!$Zi IpL^ua\^>whC8&WD^6kFCQhCIRwT=P%qGnWlVnwq=n#SNaTW>SWhcMRcy9DDhE*PGja/*@#/K?lGm9kt
XEJ\hw Ah>6HCpIw<Aja+R6V?y&u%wKw+/X4Tp4V?4HlM+hW^yCL<A/98RF^yVNDwyl^#DMq&6b1T^YYtN$1%*4
M9E>iB BP9l4nXXYt4qEktY<K!t@+8>9\CLa>&&liHGZaNDeHhy*N*h*Ru8ECDBJdk:BHh*h>jkpADBIdmVAAH/
GP+MwS J%9ZZu6qu?^#:4*u9?i:D$?ihFjX/Hy4%1^Z=1\^^@/YD9l?6=tS@qVD9N\?a+l4ELNeepSZKbIy4GLd
#WZD>< jjHZl:Ah@b+lT%NC^J^?^Gtb::EV>#W?WnTI#pJC#kEQ$Gcj\IKpHl%t*chhGYLD!^#dFGB>9whGM%X@
I^GE1J R4BYM&Cib+T6R#a/@EcSdmYiut1tkPk+CT?Lc4YjAG&!I?baE9V1:jCMTAC#L5aF9SXW?yPVNuSym*nR
p%#ZF9 HZKeAhKPF6KFJHRe^+TSWpD+^uc%!LYJc@FbHPA+G+!caH4$%u<\H8/X:ihyWmnANTNVGMAS@w:=DKLt
u\@WF6 1#>V#1=FNtT$!cMVF+w!BKL5$QjR$?d#nSdHYuR$ZJRhpWhHkE\F%8$$HE=%E5+=E5RJ<qh#DdmiMYWK
$=KjE! QSXHbqY$c5A=#%$^WDWM#\V8AhcJCCq&qXTwn<5bAkb!F=1^F6WJD\wRcctWulnE<!B@clp!lXGmpSdd
yub&X% qaZRWLN*K4a^kLTN<NLPBBJ%D1/P*Pyw*pNFT4JYFcGPFttYCX%5q!Du$tw/CtQQXcq/EutCWDAQNS+J
c<b%Zp i5WpaGiIMtT!4ey8mMGbDKuP%eDpkK4/R/NaGXShAVTKN@LyX?naG/KA5d\LH!nAGZS<<u6uNpJ1=yAi
Pcm81H !<qbk>i5d#8WFXc1Y%lbM/qF?Xl/>Hkt?/lXKtpL\$*pHwuN#\DK^#=dew^&#YBw*%m1#hVB^?CF^yB:
\4qX@\ %l:qZjB1V+nQ8iTX?GquCi/JqaEwW$C^L&l^duVu>wlY5NbwXtR1W6?XNjS:>lB4NSGX&ip&^5VjTbmb
WH@&ku 4GPFlYk:Y%EWbqBeln=K^cP\epQ:BYI+44a/Yj4GY@R\6bLTyZAwn&Pk6mQVC9I+S+46cNJHRVA+4>D&
#DnqSl nbM!StD:jWGe5aLbGEC8?e\:R?liF$N*d9uE1yYqPIWXe^!8=JMTeIByj\mJka5S#mNtKeld9W:=I5TD
nlA6q% Lyn14JYdlT>V6lmXT1QF9J68KI!$8yF<9^%/QPXF@BFnwmAlGulM8T<PM\^PLCj!^R&aK6iM8VL:^llT
T!4bmY #lywny\!Hy=KXStjVb%E?X+?BqKIyT$ApE8tdIW><JJcbXPw*we&*4HX6XJewyen6m4@K9G>T+8!CmuT
JI:Jmu >CVuL4nZm&D5lDCp8VlbX951=@Mnb4WYS%<ibRkJ1Y&JIDu+8BZ^GRnwlE\^J$8p/*G8K^epb%6E+5?!
-A9KwF 000f96d0b72001202b4 Page 142 of binaries2.zip
RydaNd ^G9jXXjXtT<a+yytqESMuFAa1i6qKamwXc6kkZZ/$$4C%=iL4By8$*bma/<F=yej4lLR4nIW=KaREaK?
6d!tQ8 8DqGZQMTMDlLaJCS1abdJ5Sw#l+QF%9JNbKIwHuaZ#+^9tl:8Gb<PKCm*M9X1I>EVKlcnn8CaKjj*uCW
aG:Q+? udt>e?GDAyVAph6cH>nD1LhR%pD#&FGBKcbIl?BLn=BA?=X#5R=nZE%D9lDtm%pmtFEWCp=Sb<8^H@/K
c9/tK: +KeMX$1J:FdBeuYnqhNQTW5cVV!G+Ke!Pi*:p6=waaEEee/GjQ1XRDp!5n8XKHP%lyw^!8!bW1&mCtcy
S#jFqF TnGNAYp#Cnm:K8p+:$EwayI?P8ah^#k@K51T8b89GB19!a!X4tM:HAcqtZ!kbXKMyVRTR5+MlRu=+^hJ
uY?iu% ?jpFIVXXcLj9ZC^YJmWJYQF^/q?C#RDDKwDQRpp$Pw+uKqjd8PKSa!QEFFEhGZ&Lu!EIc?pDZ5Ey5X#5
T8\E&P 5WEAj^Lc@$eq8H<96Q>HNC5tCSd&H&F!:9>M#Q<jliZ?9Q#@$=q@5@4@5bZq^!4<V=ZQj=#6?R#&#&61
tM+JLp K@6Z^P^eHH@qX+pa8=n@Ce8pbtXu:5Ik+tB4>49V@cMT*h>VDC:Q*&T6#F^?G:b=Q94QXj1j%@+ej@uA
umAB^> ^9!ZD?^5j@u\q<6tbYj=!!:&9$aNYNu@Iq9G!5:>N=IYp/mD&*MLu\@?Y%KD@c?lmH>5Ke6@LlpCbGd@
W=M:1q y&RIpBu+d!XDkH?SJ@ldD8T9\a@jl%Z?RF#94$d:lS#IH+n4@RGc<&hw+K?kYZ+TWj<Ded%@S4N#@!R8
jw%d@Q @Rjciu?A=9\bt9NZ$MCjWB4?RF99D>A@a:l^ej<CG9k#1*E#@\L/^%F@nGd=FVV:V:JY*L@mc&^5Q$Q@
>tK8/e m1@>aHV>MjyZjP*uWY*8Z*G&u$cY8Vu?T&nP@^L/X=\N!Q1VS=Td?:?ABnL@m4P^5#H@BQ&Q#td8+9wj
#pDuER u@:Z\5<@jAu+*H<A&VmIke@t@a@D#<DjMb#@*w=@GZ:?K/@lV?Fu%n<kPRB@!$u?bh$R#4@ylkC=@1ad
hR$%BA \5u/u=MNaYQ:ddD:9$E&SA1R?D>cNkV?::IlKb<<WWcZ*DYcZ@P\N#Snw+4V#>cy9@?M?VuDy!B>C\T+
:GiDB# 4H1IARE$/A^9WW+tRRDc5^ER+McpERV\i%yh@>?#W?LLTJbRjZB^/$#FXylZP?X/6TBwP6dH:/EMBElG
:X<SIL IL1F!LmG&hX<1NECAZwI%uMEcd6*A+cjAB6lD@q*Lpn9Dpn!q&Z6lcqNlV^S+Wm5i>Te&K5XdpXMH8wk
bcAhGM A*eDaA@=1d5Qt^\WL+ijCkNBANI<EKD5W/jkPNF>M5yDiMSV8ZF$VK/Q4w%1a&PZQ/I1>R//=V\YSCWZ
<$dleN :@Y*pjXd%jH5!!aRRMRuM9DcaZ>h<#AVB6ude&/ab#EJBCCwFH\!NkIBEtT#RVM@Tm6NbuDa\ukI6e=>
JYD9Z* CwYq<yF#B&?cK!pXwBj1p>haMtlQWR:9P>by9:e4Y4&KtXbVX*CT<W9nF/Zm&P&JBtIi5wFtW@1L:k1y
+>Cae$ hkYKHaAIyNt!C=aVeaE5JP>N!wnCBbK?e#Xq&P#SiW8RqZ#8hdI$c:ZCw^I$LnG/\SKlq6mKC$iE<TkE
%!eHYT eyh^XT>Xj*Ru<NA:=c<#P\N#J=p?jd*Dmq9h@+Yd!S+=pE<1SC11Z84Cm^VX4yW8X/Ca8e@=e#k1GKYj
%G<Whm DQBi$6R&BS$4#XTbVtEtVXb%/\dSEId&b46J5pS\%<lbB=ND68XA!c^c:9qY:n1AAM$c4k^$V>\/9k>>
Q9N:<P 9TAAbR4Wq#>ZtK4p=GitP6Bui>J>Np=e/cPLV>Ke+G+V!y>FPj/?*ct/=ICXSy4^=D%?YWNe4I>Sy8n<
AeD+Qb =bi4V>+ZFnh<4R>jDh>1k?aQCI6VBLQG#!I\p5@E$qHK?Si/C+ZA+bT6FDI>cky=XiFBALE:#46NEKCk
t1npG^ /QuY6ud@?Ld^l>>ciPYdL^<LPq\@ph^pwtJc*Pm<q#JRGHBhT+MFAedYRRD:m9VEijLLDyaDX6n1=TE$
G&Np+Y G#KXCK1CD8phHB<ek&ZFVQM*:@ShlVHm1J6my5QT8eY6J\c%tNuZh<<CK8pjJ5iXRp+jHPP^bBGCyi+p
ZDY<5e /cR=edtee4immJa44iaERR8JAtq*wVMT&>4?4&#eQjP$VGGdGWld\qqHlkNK#SFj=&Bm4mM1bP#6lYFj
P8C:L/ V>Ai&hc$M:TW!>W=e\LiJ>c>BibCXDK@=Xk8aF:NPKy%^N*%&C@LNcESm@b@uZ6tiJA^:uKa%#hb%Sml
/G+b=L %u^N^mJTmcpPGc/MG\4h=bi:Wqy5ucVjPQRG9i&p^M\@?XVpaHnBcMFBZmdp5PM6nTG1S1b%ZjqAqqtV
8Pk81q t1P\q^kPiIeQi5QFA@@Z9QS<6yA4IGFRHL&=wN5wDqHaVI?KNBGT+9*cS+4$A^ZI\AuWptna:hnY5HGb
yT8CHn DL=G8!jGlu9iijnb1tXateQ$^5d=wWR#!&upk89mKIFIwu6F?ijuiWV\l^wLcQG$8?B/@e+&<Etm?Gd5
imb^6k pi4=>w!dEX&!C%a=#Hw=QDRJk\Bp19i:V\q#946%j*IeBQcMI=16ytn<%AIZ^$R^N>Mc?=+9>H?>d@5/
/qDMW/ tk@PDTDAZZDkp#\nRl?@/mTYq?4c\GK#y14YIMaWWwPJlF61J:>ktLlppa&PCd4upuV+muJ:QHeRn:G!
e8PQ?c 5$jyh$&Zk^5lk5X+ZVdjewZ94$BL!VEVhBCI4^EK4iWSc%etMTLkte%d\SLB/>=Q+:YelDD5RZZP8mFE
%LWHD% 9HpVwX&=8Eje4P^qT^:C+TP5N=Q+6hD:p6qpLnh?ijFNyaS8cW=#81K+dW8kI<jHbZSPJEZnkI1G:\lj
t</H!h p5lc==Z/D!/bdqDl+mD>cLA5GlDyAkZ:F:M9X:!@jjL>lP^\jqQ<$LV8@hZ\1&nGA:<XCMDR9P/h<lm:
V9D>wa B\Kk/QmP&*%dN\eB#Lm:j+LJBp$uk\D9Ky?j98>uhTBAHeH/=yHmuX*Z>?Q8+*ie6%=#V:wPZh?b9yMM
S$a8:a &AM*C$PbK5:5I$6h:HC%8<yGSwGnCIEHPkQ4=8$eL*:!^G>:W*e1/kdeN&\jKnpZB*9N+VFW>6YFK6E>
1k/SpL %tAwVT>=N/<VqyZpKpEy%$AaRj8Cbk/dt>d%/q5ch98Q$Qn$:8jTp!4=!+PeLN88qeY^q+=ZSeL\/n@X
9$<*d$ Yp8AX!yYec=kQGL9kipajny4BRFEHd=Vn#@m:lHhPhR@Q<?e#^eV8b:Q%@>5p1??%!Ek\FjqnP6Z1d/:
n%1I8J ZXNQ5i6Qa&\?pXewD<&jRIBbjBDkp+VDVJd^D&pk\Z6S*?@Wp@h5E+KZ//>AAKuu!#LH:bd\jQipi\\C
MpRA!/ HCCBAMj=k1Db:H?JH>mh95twq8H6FFqhKblSPEK1J?QM&%L1TH>XhLRby@lR?h!i\>HEqKX$*^VZw\\/
&XR?E6 #a=aea61TG96S\/6SRtq>kY%BL<Q=Z6H:#w+hMSpEc%>myaaVX@H5n+\Jl$M*EAHjX6^Tu:6<<ytQ/?#
wyy1\= ^y@?$>+LQjLA?LK!i@wZCbwJG6$qS9lStl>m/T>>kpPp6q=kwMt<#I+SqA!@lE#tw&8Y8RdmGBediIdL
j=YN8W L4=Vt<5QYK\LQTYJM#!88a+w6VjEY<w=Cy:S9#9B8E>*c!neVa%YKYEbW5bDP+@Fm<hT*aK^d\ZNbi5c
*=Q4&M i8bii%1$#Y:HcIkTIdnFIcyAd^+/?c1cNDw$KkTman?=Z&>Z^Xtd9ak^TCGCc\K+ZLjjX!n&n\WP%=I!
hLA#X@ uZa5ymRMF&9ynqytbieCb=Y/GRtiWFie!y<\11DudqB+bhqd=wESq5RYWjdc4/ATWb@K1SF:@D#t8y8h
\utZ?E NNPdM+^cP&&<TTl4ty<&?*&?CmHll:6kjk#B?HdYyDZj5h8*<S+Q9V?5ab6%=q$JSBl*G/w*1<#J9IQM
l+t=NJ 6M1ln*QM+bqdRb>yT5BanTBuXNc?8A4*hNpKwX**<yqCpp&y=:KXEb5X%wZ8!Niu<nRj<1nTt<CBS88A
6pBAHi D5tayn8K$BFVXi4<y?peI4>Zn^+QwQuu<T#N><?8L>9\&WV1iwX/Sd/6VLi9IKR^h^89W6^i?GR#wF8?
4T#+$D ?XHZ9u8nW9C+uQQkieJRd4j$kFu<tLn*!LF?a>eGAkR<h$=%ti6FK$?X#aduG6qj%VP8X*\Ztw/i+Pii
+$^c$1 ^q^<Ml#8t#::>84<Th=w+aCwmII*m9H54QEH1u5PHRSa1L4/<:j%Iw4u*>j@5t:#:Lne*ZK!#@P1>1t8
e+SRdS yce^=?mGdhMm@bkMuYiHXhD<VV8TLQ/lHSY@caj1d>6S@=6&cQ!RYRIBjuNpLFGFNAlA=*5EA1lqQ*E>
@#DIud QFX@n%HJKm:W8Z?kiS44?pVe6QT&qTLy9h6uh9li9L4PHSJ@mF!CC<W=AV$RwDV\8cEFH*?ItBY>jZ/i
hNbLkH XcFVRADytn>Jl<uh8V\XIVE>JSn@pB*#Td@<<mmHb@lI?Tjy5Ei&*cu:XGD*9j\Q&dH:X?QbN<^Y96eb
R!ml+V KA<LRY%qh/@X&4Sl$8u6Nt!5TF1p1uMl^*8*R6RJT\#>=CbdK6Y>4$BL#HMTWcaqPwdTi%G5\m@pD@5a
anR8dC N^F/%*c*6eyb6kA6kNIubXH@4h4y6M1m418w#Qw?Wqdtn5A\q4yt&Pq^MeZQPT?jFq/dy4t8M#K$l6+N
Fe6e=C VYbHGt864tA?4wNh=KcGRI1%i=!h^L59QnTwWBAc#cEW?eQbnD9K<#+\!DpebDQ/#9j?pMG#@cGk>p?G
JqGYWX /QnZlpn:8TGtRNP/S&$PD^Ww5>pF6mCA^FQIje4TW#*K\qQ6$Z%YVQqWnIAkNtHD%B<ZFkV?64dVZ>hl
A\N=5> 4J!e\Q>Hdj<@T&$*?>>LdR@AiMeIP\J5*w\<ZPKM*ndm=JnMPh$MIiqS+wq&RIIVbi8*A#?M8ql=JayI
Z%+CF= Sn#!/WQXmly46N&eJTy!*MD%t4K^$JJpMMTpDBemA=jJA1?#HmJiL=$#e&a@i#5AJ?T\#S+j&5dQImw<
hQD&S% E1Md5c6i!KlS*wX9GjhVHAI>jTNal+Q$>IWwF!yTbaa/eamd:D8<SqElqhqXMKHnV/5M>SH&$ql6kT>%
St\AMT Q/m9:c&>by>iu$WTqjZl!IXC<?Ywj1GYL*=X#nwEldY9m&M\GiVp&i:^Jl+X5iuEpBn+6ian^uI9FB%&
=G/M*u w%wZTZkIw#!*Lcht1lCdmS$n+pjpm#eJ*5BQAGXT+%NGS%RW:mlpXI8YB4>=QT/w<<Nk>1Tah^M8C=c$
cdiq!4 5AuAcb^D>+S5#*p%D1np>pcw&p#EZPni@PBtbHd=aE=9SZZ%%JPDjKlbctH8=R@jE\1*8FPFTW$>JhTa
GqP!CI Y^5aZY\+d>>?^hm+NYD!$??XmEl5\9eRd9tmucw%4>AGHeVVay!kutYC4RAYb@cBkiuh^5uL:ynqqT>p
1+@Q&I cS5EqHB%B>ZY1LSRelw%VT\d/ypnS&!Sq^@adt%5b=9%Z^ln/D:^Bk41?dln&:m=e5mu5cPBpnE<K>Xj
/\kF@J 8D^kRny><cyW#jmm%^9BjjdI#tc^>Z%:/58=Zc:EWRkp?MncT&FbA$Vn+AN\\Ny%/l&FPu*5Gu>#EaLP
%d1mI+ 8dE^T558unwMAIPq#TetLn#@q9ITeY:5dT#PTTDF&nY!El5*QdhD&Y+@8Cbe9>YH<^F$<5YF8RBTKZl>
VQn#A@ u4cttp=mXV1wet%F%leKXkwQXJ/VWNaN:BM^5*Bq?w=KK<^ZSnlJL&4Dc9p?e1qZa8NVP@LJlyBXFSle
<^hh=h pq/BGd@CHPl:XjSF%M<NWi:6:JAtGKL8G\ch!aXm<q%4PTW4X?<BJIPWHCEp+da&Xqqebl!%IiPy<u=w
?Y9VEc P@tNDtcn>QSyNVXJ>dkM$cD6lF6#Ja9I4bLA9p/n>H%8Y/:V#H%yYw\KbA64^#A8heTBXY6Qu6^E9yia
-Aa=L: 00036606f24001202b4 Page 143 of binaries2.zip
%X8@qN jRV>iS/K9btw6C/bn@u:ElylRlHwEIDAyQpk5mNp$WCVK5Velpl6YD8Pmta@M/^\J>1>uNlK5?kyaTFH
LZKCkj ^Kw5ZjDkmc%WlC4^$Dba$yHL*yj\/<lk9S@bpkpdM<HZ*^hq?Xc?S6^T^*h:h#:/GZl8q1GQFt>hYwQD
&nHen1 t6b%u6:C?a=T=>$HIeia9qS#$+Q=Fh\ln>^5QT1>h\KeCneiQcK/P\W%DEW1#e^FBkZW9B8nN4Ili%>$
WTV8Cp cN*$^uDtmuWWiZQkcu!Gp4N=aJWt=jPE8TtjE9FCpE9$li9ba8@5itVm<j5LSa$c>yJ18D:V>N1<L+9K
9Y5D:8 \@\kt6k$H=HyieJXHtlpI#pG8YR6ZliYbmE^p<c/cXKGt%VV<+YI&pcyctEV4&m&E/ppR=NXEZIe*b49
^!Jh/I FjlLb?>me5/Rd?u6?tN!DBnYFwBC!:wC?dim1G5EHieqiEtb99LSabaaCE4%>PF&twu/=nmLDbtd*<8B
<Iw&qm FYtm+Dej+eFhINtwH?*#ElKZwl?=Yu5:PKaTW4@4tlypTa!P+b5nQ1b/HuIl>H*S*>ca!aFA4aXncRk+
i1FHld QNWIl$JlMbwNW$D\=H!F!AMjq%ZAkcG4G^C<&MyaG:wAna!yQje1<hkYXT?F8p*LBhYbW+eI4&kH=>YS
lqhqPt QyA/n\K9yKaZauDaVQYahR\G<wtAtSnBL&</N!A%VWk=pw!/wI%hqIRC4:G6iZTADD4&\$66$dY!wS=<
J+9FD5 5YthYVAl65H!q#BEK1=IGunGR@Mtu?qq1iHBN&n5K\5ZJ^K#hBGeSiS#XmiZp6+mkd&QHcbyGSyXV@KS
C#5?\H c?IZ*&5C1NSyC4DTYZG%ElL6XF\@JiSQThS+HE>4H*CktjJ+qaDAQm@C#4kKEjem+WM^T>AyIwXEehNA
^uPukN #t=mje48lTn*ZMB5\NMR/D<$#m5$<tMSCZJ$epIeVjQ$b<NG5NTy5CKH*y&m/R>PV\edewTCQI#BW\1Q
5QLpA1 YJdqMeTF*etm=weuaBB=ydCXqHFVpcMZj&GMwE&eN9STGqtZhHqcAIwq1t8aXyawkQuP5e+8Qe+EZhC<
CDw+*K ^tP8bBK#AYNR!9n4C:Rl<9CBtX6Hd68e4VPNGJetZVDEXd\+6jeju<C5BX&5jc4=w?K\DW/pq4>Hl=CQ
F:1KT6 Hd$=GqiGaXBaLhyb!Kki^IjCMmeB>@8Iy$>TmGRW+JIlc4d5CwH!/aT4TG9qm:hq\h4T%+P6>jLdV$SS
YbeCHc wK\YGNMNmeTtq^peHGBC#E%8jLtB\a#FmHc8B?y4l/>8tBL^5qI&<<YP4A!IDD#iPaeRTPE+CYyPI@EM
!?^h&$ PmN:t==w1MtQ5&\WlZ8P?bhSe*QdQ9TibuSt!NcGX?HL6u:c>eBbiiH=cZ/bSRPqy*uF5tcm<a9uP!Vb
P/C#X= !C>SX=IWF*eyHFHcmJiGKHXQH6%wWI#%jDM9a*itJYtPE>qbiqJ$ZQcnHXDP6Fqw>Jj9qAt9168QQ+jM
pW^!Nc 9myq6K68?1A</8#l8uA!wNS9p@!^dSZj5?Ndbj?*%#Ni>51%6AJkR=lEH+#aK6@:+CANYZ%cYPa>/PiN
G^y$9b wj4t1Ei+?8d%5Tmw+dPEe!An/=PFGNBtaI8SYHJZ4GS5b&QaDk^iy5Yi5Y&1GEDbJHp&9%*AdA&B5?MR
%1<Y=$ jTjD/GH86!6?H4Gl<taTT/%uDIWY+\VTFw:&NhTAV%lwmPW4!mAIFZa#Z<n1/iKTDCn1eG/yTymRRimT
Nd6:W6 HtQEwQByi\=wGPm!/c<RQ8GIIZ&Wc8Ldu9DWc>Nm6tcYZ8I:QyGt%nF!TneM$B9dEalKEbDVTqiRhwm\
G@FPZb +@BB@wlRc1PYquu9jQbN5aa6Zd@&^@5Qh*qJB:S5h?tM/AWW:peNGd!TN$VhZd8EWH8:4SaI9Se+b6Iu
>tA?h^ PiI#SH!>d@KYBVEEDSH^%YLbq&Z9jRp9!ZnqEau!EY4@5d15W4N618+ZASTaMp%i+Z*q!wl?PeMab9d%
&iZNLC w#5?<CJ9@R+klDCSm/wt<+u#STpXGM9cJ8HXVAimK<GNB&u\cC*u/KLLFG8!!m#cimbMCk:jdpjkSVMZ
ku!dQR q5Zd=y8NmD1?DhF^K*=QEG=ScRqkq&8/we\WADhl5DW1DnktM&pm:?NR*>4RlIPH#65VEqtqlNmlG&AN
BEJkAu Ncpt:lEtC6kt/4GH44B\&I&E&wlH1u1C>X8nF@pJiSH+n?XL@<5FbVtJ&dl@yda5J@FjMnL@:q5R\H?5
M*5XLD tQy9JQ6b8j<=&e@K>i<q?%q@S*n<c/4yu=Ja@=^J@P8LEd>J8HN^@!Rj^@W4cI/jwdq@Be*!^$q9+B<W
!tWeh> b9%uND94V#KJj%Ca>R@R#D@Ja9=Bahb@SkP=jwbt?^W$^<@R\F>B@/V1I@AQC4Q?M=1X:Ye&=@kXNQQQ
Gael^i #9$499dVlD8R=Xie:YhJd!DL4#nd#$w9Aqtb@$6wq9>K!%qb@$9wZ*M&4y?kj<ubj5I/BQ/8M86j$9Z@
j\=5H1 &uC@tK=@:yF?9D\CbH9?^\#<qZR>/?@bau>6^:>K%@?NIQcuhD$:?^?p/*>dA9cZ$@ZA9/Z48aB@T>j@
KB\k\w wMD>y@L%ZMDuF9>*=89#AT*@w@Q%mH@Q%<eiCKlP*$n6Je5#Ki#mT$TSJ>8RS$>B56YQ:C=Y/KmGEG$k
%Bya$j RV^Xilp?EqM>1p$?AcaFD=h?^B9BjSjp%9<:>$&ByqNBAD<k!u*nki?%Z@cNK8e6lBAIWG/RAkJI\aEA
\ATtVp /t!?@#%:th>N41qMN=\k1LuPZt>5K*Rp$=nWT^XIp+y9nc%t*NYJ=@pPE@%FC=nnE&ntaQ48>jlcEPc5
:ATVA& *W/<XGC/PJFSI%WK+Wt+:#8?dlBAk<6*S?>HeQj<!@MJDwhSHmJ?^KtjCC=BkEi6VSAk#9FQwh*?LMQu
buwqli SlAIZnIT*bX#*41Mk\A*y8?i^Q<W&kWBpD%>u!1in^^y?SEa*y^mAkEYwwu85FEiFnIi8HhBkQ9c=!NJ
$bW>=Y N*@Elj?6E+NtD\*@F@:e9*WhnE9ZTNAMMKybTK!\4$Lk+G8mIPkkh&DyDApa4$CAB$h&^i@t/!DAANtk
E54LQ\ 1?L66uZ*5i<l?AyFW!iD+B+PCDCSCbw:?cTF=c&w$BR:/QRcWRXyVJ1$*PFaki4iS9JHL5:*#&<WXBI>
B^tC8B /b/AAD<T!&>%16KAESme5hJpiLVp+SM?RkVaGS\GG4ck?bQYG1T9nWXYhSYe>jjP4Fi\tK5Zybl<tKZV
\$^PYh G?X9Rlp*w9e?DeTPebNXm:DIjjIR@=Pph@ijJd%@TT*iD\RR$<<a6hhXic?<e$Qt4>mVk&pQp?Sily!+
y>J55b uN@%I/un8@qbYJ?jZ&h:N5IXlV^TK<*d>JBRKBcM69&/$GaP:tcK!WDjBn9FN+jB#dLa#LK\NXXCmX+c
9G@\tX u^4nRk@5CceXBCmqW\ABC4KQJ=?\&\T9B/*Y4^MiW+<ecA/JCq*dW#6cZ^W!FM=P5W?<eHEPn!:ptt5%
XPq*@d <wqM5edn!Qic1:NG:!F+=$>K:\>QSq6K/#Q?R8Qm/?D%JPQy&PHq%y6S^8R9aXIF>B15qYSEe8lCpD#H
5C>4N4 MQc*QIe$SW*y%H1D>KHnBDui!edmDnquRi8dn$L<yk6XcQ#8KeHcyT<J!IZc<ia&nndiPp*qGN#HAHWK
+bR4X@ i##Nd<k%LKk^C/I?pStIlt:nKt?Pa>VNPFREn#^T<jjLk+6nJD#aEaRTiQu:DJ?kjF4LTAkGAVdZtb@>
Z*nt4y hAeE/Fu>W^=5eZ@>H#hl4Z9/cttd/+bShLEPa^e:+dX8KW&1pW1@:LaqdHHcjcST4=8tcMk!adT+$aG!
:C9cFq nlGT$k$6wZi9hQ>i/?qK6=Kcn*:+Gw*H1+Ij!+ldlkehQpXN$KKVJV8H@RZ6l?ZGZtQHBB^@a#T^>+ZZ
A@jEBh I:9nHm99quPLN1::D+pR!c/wH9L99#\aJ##JXWt?@b&!u#:&E>h!>Zimi:?t$iAPbXp4i*J^L+uEHdDm
^j<DSJ Qn:H8t@nEh/qnR<ym8mRVX1t\TJ%:BW^RH9eCJ4TJH<wcuGB?L8*kRZ*t4I&Vp+P:B<#=nQTY!9&+/Vt
$jSC?Z *jnFjMM8ypBL?@jNCeTLVPc6&W16$ZCQJA!b+qkecMQp?mJZpGE<ISnFW&nND>&#DG/R<<Sb8\bM=WAy
PmG=<R e&5+B9W+:SJle*N4%89#R5h9e4N&%!iM\*LYikn+HuacXlla^9C\@aThXu1aj!n699:9/MD@^\iDy9<>
W$JWnR bju%@+y<P:&@cGEi8<inRRNp%HAB:>9#q+YVk#h6?41jWCSpE4<+n5%DXt*RFC5T8Nd4CT61LAJ*eMJZ
4uqmyl t#aqKS?ni$\RT9M@I&BER:eJu91:D#:%yLl6QpRm?#+QA+yX!<PGc5K+P&PRKRyBmdTXA$CnytMip:C!
CXem!p k1c/hXEMXX&lRayp8ySacB%uIpmLlt4dXnj%\P?*ynHXnJ4w!EA%*@DcB%/y#ni^QJt&dRNK5JF^A*nG
t<4<i: a>VB+&p+#uDuR&TMmtR!1qWMtEej>4k16^p:Dw6&i&?=uHtHPA4CdVcEB$I1eYMY4$%l!c>VM<LANI6b
RT<imy eZAPG=SHquJYV!Iwh8JFd+KdataSWY6duTVI1TGBS8H^#C!LY\S$+I5KA1p*SiYZjJy?%%&Mc5BmJdl>
XGm#qt q59D&y+#kq1^KF\EEp+teaacmp+iMQ*!/bh6i@Lcl9MI+BCw8/RNq/XEFuqS1BV9&M8m9lGT$S>cp:Gt
=CY+8/ t5Bm<M8Ql=hGFTEK9t:bmLVtk#%E=t=EbpuL\qFlLy8ahB*D+QW!VTHH8A*t*HeB#S+p*$>w&1G9mBJp
Tn?:NM hZyn9^n9Qjl5PL9q<>V1bH$^8Z@9JPd6=TY&PkKBBXSjE&^+k>!\ZkVZ*NLTF4QR*CAb*aB$p+L=DVMt
>4t?YZ F#>\%THG$==+a\uL&MTKLLSPn\*X*C%MpbD8e+inaPw:I5anGdm<jtIqciDndBaI\QhLHZj\wyhQy:F6
X\dWA> e1#?y>T<EyG9q<t=J86wL@#%H%nmX\/ZZP+X*=k5aS%KT&&@N^NQ^N\Si!$W:q@:9adiC*P1Eu&RMj9w
Y:S&T& a/1&!LDVJKI$8iQ#&Ct#+\PH<%bjel!#cb4ylGm?tRN?/%W4w6H:$GRl>a@P4j!m4kjbwLpDnmiDiV55
$Vm@cj 5$adL1^NbRw$eiepYPy8m*&q&:nY5!Tt=PwmSRYHpqHeEnNLi=pcPwK*&9IL5AW$6ijXi8*bnIjaeiKa
cZnK54 9ZXt\XnWyWln5cFn?>\W$/cD5Ym1>^>+ywRZ/QHjF!R:Nb>^ZqhyQZ**n*%+Liq!\QVbQ@e!c4I6/h%l
>TW*K< iEGAJEIhEue+*8j4kpmc&bD*#DKYiBXid/!pGew?hR5wq?pHiE5\d1i&j=Gkh/?CIXS6XXhZN8MKXnjG
@Dp?hD ZCJGN/!k*4*y$yY?RAIBDPleh58Qtq>uH%IWJL*!aX:N5eKWM\/XLaVbJChCqZhPGhje4HwbqSunuyW$
MWbkyj Lw5=H:#wy=VGtHEueYi+GhE#Y*Mjc?YHHwe=Rk@yLAV&dL+u/W^9>1Q\=yRdTu8=4&L*4Lw5%%W?%IWW
4pN<IR BS4Qi&<nZ1kw*K!nB+=nJ!>J9\HWSu8pT$cG&u8W!*/>LX=5Cb<4bAQN:%PNZ6XKpE+$&PCSPdd9TtqJ
iQmW48 E+IA81Y$R4t<$&DVmG^Ne#hHZGJa*:B5$B?VLP$JA*QW9#nQR>RelQMu6#8c!JbH1MKQa%TSB1k:p<cb
^k+JHN =>ZL>YnGlJD>cW+\>ie=RjVh:%!L/i@K^kkiiet#1%Ll%%E$I^CKRS/dlIW:*:&Xd*BP:jY$D^W^+u8T
Eu$lL: XLwTTXjCtc$Bcy4Hm%$4JlCZX?NHnw^JXeu&!6^8:^PV\&VkL+wt+EwPN1BymPJeW/51#?K*n9YZl#Ga
NtiaEp y\/bmGM^4@8SCR#<Adj?K*9YH>?GFji/*H!5i1Wd$1dd1l6Li=&1l*QLVA^6y9QRXCTN%FnQalEM^^89
-A<!yu 000fb848992001202b4 Page 144 of binaries2.zip
/69eNl yydhLklc?Qe/a^VHbdj/Atjh!*mlmVDM>wqXySJVKiWSmNmn5Q6:*+hc^iiJNVdSnTSuhVEIMI+BAq#:
XAZXBS P+EAcm=i@*4u/*@a/j5#wCBw<hn>\NkNNS%HKbi?G$MQl=XFApyj*S<Sh6Yp?:<!V4A&kACi^CBAyBWI
9G#%cF kIdVyYHd<Wpd6HVTYt?tPcW\5*?jpI>yQ85Rck+p&&:eq@C5MX!Ql%p5iy+JS#$/#Spa6J&=MbQq\?E:
CiTetc DPQc9Zu4H@p6Hyy&nF9tECNR*WkWd^+FEZK=<n^LR:i%SLGQZ#Lu+9BnAe<kCECy$bdiKZtGj:<SM<5=
R>\AQA &hKY<TVBiVPKubC#\I:$YnGyPFXZ$kZ8NiM<$I%QZPH8kPE*59LQc/1Vn@>cYV:::<4!SNcVnq&Gm8X5
@pKnp> >IX&QYc9SN8J&V*<*R#SaiTm4F\<c<XQC1B6\w#nQ/V\SbDZ%I<jhWBj%$l8DyXI=@b?e<>PnaDl6SPb
FP@yuV *L%SQNXkyu9lJhYNZ$ndnj??5*p<tYlCWuaybG<W9llj/yMAqb5b@cEQM?a<5+Lp=tQPG=tVS+j!\b6\
AKWL=F 4\j5lYIFX+K&N%86&9YktbQYPyw9W:hdl>qjS:6AkLDqL&pJqY>=H!/#DPlW=b8y?kF<%TRC1S>jE/P:
nR!p?+ IMktK#MXiTVI^DZSGSj4G/+C*R<F$C:W@BW?5e!?4WYWQ#VI%t/uPpdbeudIZcuRCW:BlC<HCwHXEPF<
d:QQSH cC*&hSF<GF##uXh4aSN<Z9<<Qh@jSBe%ECDX!uiLmw#RF\TIlm+FAY#du+$Z=FEX<V!d5>N<nHpW$nWd
C:kBwZ t*9eCZ^mKZ+RM:NS9lJw^F5XL:IC6$p>%Xptj^*jwY#l1#$*1##+mDbAF!?1&dVj9:jPPlHhQ@cc1L&M
WlC?C^ NTL$pBL&hPbB1lERVLCa:%$tn8njTBPE+NlW@dlW95>5VPKkwMtmG5Y6\VKh%etnlntXYt%WnMT$JI1c
?%Y?R4 1Ek\QEQiZWTGQBP!8?+G5i+W5wk>5!=&tSi<TX?VXC4+8XZwnZelYFjtC?WNRcKnbFliJS?8%ieXWw9w
?JDu^# u1^H%Yb4W=1uJGPGS%X:iCBFhakVk?/w^5#KyEDY&TH^Zm$@DmwuMYE4hF9RKCIec1Z%yhL4jbmb<AM<
5p+^pE t*HZ&ywe<G1DjtRt@S^BVVH%b8mP%FQF#e%kLNbRl$+QcR$a+$<y*ZwHm?/d?bwRt$d\&cbhiAen&M4%
8N<RR/ #$@PnP@ApB9Td%!$N@Y*@8pCtp@>F$P\VcWMEyG+95RtwXS8NKM$K8JP1%TQp5!T?$Xj/<PBA*R8W1DX
@ARDEi N>Q*jd4!LPydIWIiLX8Vw^nl*ET9jMGlhD&QbF1dtqypdcd66ZKCXlLwZ<&>1C+4$a&l+H$da/TAk&R>
Xu5jQn 66jL6E^%#e>WmYpTIK/A*9^J$y4#NHVh\ceB!YEQCi6wupZ*M^4?@h5kb>TXNlkF>y&Cabu9pjlF?kjy
+4cMjt FZaWDe:F!AV^BqL#461aLXqqu1wyI5JF!QiX#bhE6&VS5ycakdT^El8ZXERb##*1ah9/e5LVy&@bq<=L
HPy<$b ^NCJ/#pjQBdQyW9ZyEw/5EVKTtD\*nm6+D5XhE^RSKGkNymESD&&IDZRXJqXb1DTDYdykPP+d#</Nh&d
9LIIta /5le/DQHqT66KMHj#4d!#S\&5jSN9N\CwHiQj^eMIdD/jwmXjbHPhJ9?SZc88#Z:!iSM<JBYD#ia<F@/
S5T?6R 8ChwMj&*ZaMMbW66$/^Jk9KYZSyJYFL5CG+lDaFX4!kY@VEA+<l@PP%6J/SnTWe$8R8>$9Bk+8JHFHX\
F?D:Ij y?e6GMX?PEE?nyeFT9*>TmHW&tBB!uEmWA#C/kBqTeYW$N:TpwQ$>\YcLDI/5\y!XLVKAHB%H+M/@&bw
/E6AVW SBTF8<11/$@GZ&#i/1C1C$hT+a&VlFtJQ^bDck+VPNlmqNl<W>p*X^IJWNiN<BqY==hWZwi/l*uTwjmi
Tcw<@M <GR%VE:PLNASyVDAkLLKeqiV4jNh^ZhF+PyJRieLcPuq&$E:M:IY\PMGRekKu*!yHnXyJIRjm59ZdkI$
$\>MWm @nEc/nwq+4Wk6?1\M#@TBbMd?AL@VAeNhynt:lDAQCMV+m!Pmu<w\+XD!#GMZ8!h>cZ88^De>embwhY=
:jI#Wc auaMJepaue^W1@YL/aaj9k+CDIT+h9:W&j?=M?:?8<X>RhQHSKyN*ZNG#i&KK1R%udS1:&ImR\@HlBE4
J4NV+j ekJ+>@VbyJ6WmS5CtJQea@QABRkyQw%Wi6^RkR%nJ=FpLES1XVRV+KCcqMQP>?IKG@m4qSS*MWA%^hqA
u:u=Y5 5qkN4eHG85TEItbqlPqylu&HTR^!WGl=Th@RZ4Ih9Zd+eSAQEGH@wd\*1>^R^ql>n/N1+TB=YTQN\:#q
RTTFFH Se>VnnHh\G^Jjn*$$/pShwJ#JW?YASX$+d^B*k4Fa&uKqu1w@e:\%$F?uRj?e#pVq<FH!@i\%Z%SLYT%
yJ4cl? i$=!H^W49W5FV:Kju&<1Bye5QjEnaZKl/dyaFQ?V=/8hCbA8w#8emhZY+CH@ADARi/E/9LX!$D>cchK1
^VGWWS Fp<e:=4nQS*hQweL@R:S%6^Fk%<NutuEyE/*J%Ty=PPC%djwXK#i+K=Gp=Xwla6uu$+59neDASTiZV1+
%E^j\/ ?MEm=wtT4hB1jZWKBGB=uZ&D!anaF\MEAec+!*\ukN$ZL?JmBEGAaaluZJM?CQAk\1ey>w#pKH<cj5yl
p:AYV# 1DP*i4wWBkF\=y=I&WC#^>@eb>cYy%:StEh9eRa95\*&6hDK%P!@@4mJTKl&PSMZmFI^ITyPdGWyZVFF
&qQ^E1 Y6jjk@hwh^ekcPQW6Xh:pQ^X+%#u+JApG1&QPnITk%ydaI4SF*6I*py%HTFn4PpTk^M6:JFVP%ccPY?p
IJ/Vie mG$EKklykLblH@ASWaPImS/XweMpHE#DRZjL9I^bR!BF@Hw^i>tyiN!y4eGbmT8#tV1!Q\\^n:pSNTR9
Q#LbPT GGP>BHLiQ/RyX6+GpcMW\\cS8ycCuD^ajI6nk^eSLRQ8y41S/4H?VHBu6$4IJnQG5IpnjjKaqpacwcVa
FV&$pC +4dy?^XwL8#Pju9ij:8T!$H$LB=Fb^tV\ZFV5:aE@=FL&4QKK8hCYqn\!@TGLpL!w65d1bNBLGn$n5Dm
ciunAJ QyiCk@YLtWdBC%jjC=d*hAyQi:=*ES$kREtyw\YGb@GV<1V1p*Hl5/6uS9/<p$?kW@\Yn*I:qH&B=u?V
ZVYG4V AhjI#&PD@!ctdJRhyu1kXRtHw>hAEIZkieK8+kplp:=:b6dSmc$!!V+RQ<\5<aZ:NptLmX$hRP8*Rq$w
SV6D$P %W?Yl?DNde6kq1#A@Kkq<+Cu%JXbW1WVh=tdWtm%KZ<P^KQa:cnptZV<kMDHw5KCai8NS<6WJmY<u:S6
*a:\%L YGh%K51W:AAJl%JN5kuj*/F<ec8FL5T&FKH1S9=kmQ1nLyt=W4hG+nTamt4#B#p9YSInyI=\FA$?cwE9
icqaWC ZA@Q49:+N%h*lwlV=NkZ%Fe8YTt$mLJmnc+I#Q%YJELTt6+dKDJSZCkyknKVDX4+k4:i5SpaMQCN@e\Q
MQNpuS 1u9SHBc%QWE<y=V<K?CX=PYZqAVJh\5yn\hJQwKZ\w@yP>u!@&uuF9>n=&b=T*HFpN#1ZX#BA:Y5@VpM
dp+<bN ASnQw1R/F?i^wCL/>bPm\mjR+tHe<8G$qkmnjcj8JlEEK^&ZNyj<+AnEXnE:=DqtwcIPJEtMV9CJGdd+
ZF1uN! nAZq%1hbh*B\Amhyd\GFI:Z9MuTK:&YZl!hyn+bX&Q^:eM&$6\Zlp1VS^LGS=whYq4ak<c1wc?:KBM5V
S4mXuL &/ImbXFK!LEbS5wDYXt8PbF#a8h*/Ib#?GJet%9CweJ9*u?l&w1Q4/5qe!<j!1T%>4l?GeZ5a$8%KGhm
#W<AdS FC>XC%hSqTebi&Fk?*YAmet^tFR\V@GlTeh*bDQnYqn\+8==%CML\jn5mT*d:l/*%/BlZ$kF$B\KBG9i
++P9JD da1*pl*Bit@q&Q/+<V^KAP58#bM#SbeuLekLEcPaLd/Q>K:uQue1!T8Kh\R5N9\W8i$B4#wcNkqCV/Vj
eb5%d6 CjXpjiKc@Y#YFC@GL5%w@^t@X1M%KiqhLZRLL##jHAlA9je<5nLQQw<HClJ<9\5GipN#y5nM=$Y14?cX
uR!6># HKna&9ph^WjSu6ndBXq\l6k+^w%nhHlC>KD/RB8yjYZ99hPYG\9ZH%FZ%1DKAdk>V?<QqV##Fk<Fhba@
C8m!KN uE1F=dXILdcDI=Eu/RTlmp8Kl98G9unTau#c>#%5anXpZhEhtFP$e5FRnqap8+e9k*Gi=Ijt<k^lBeQm
y>?FFt NH9bC$=$Z=t?Q5H!8c<b/!8&\+8qmI5kCBGN9H1pyw@jBu*qtl>%1=:&BR?:HPaaRACNw?+&qQ91nP6^
uwXL6I *+Y&5>QAy@K>S>d%G@9&:#pkRNqh>*>+?BjR#JFlpi=V=bK9K>GNIihBMklR:4d?GibSe@Li9Q9\<?69
FT#cDy #*/yj8YV=uDj4Q<+:d9\F1^!dc4E<65m^:*dW1WV\nASp^AVyR1WawXn\4Q#Z@R5CJ/pQM>mWGNkQFWj
EuXF+N h=?uMbE%#!Qy!!y<tdy?4ub@^M#ajmh$%I4>%!1FwRbTC+Z!%AymJ\>yieP&VXhYdatScGTM>V*?RawE
u/i:HK whyaS@=<ian88j^6TudhKR%9JPM1G>/La=t*Sp6Fup9n!ubBt&$!nIi@\I5L%:d5Y^#dq1yy#Jwh8>TT
c6EN=D :&&^nMH*5N658Cc:Lp^KdhQ%p%W6FjnI1V/*butKDtpSjwwX+Bw^6%hRKl/HbT$lyT1C9>KZBy4q>TY^
uVla4+ ekcmn^c9i>ZW5:E&6mBYDIumRP<uEWTJI$qGPb*j9bCPutEkWykuX\<#enu5!X$\^!dC1=^Y@V:=:e/%
aD4Z?8 EKu!Y4JbNlX+yB5l?qbN$aqZ^IMcDCe*ZJ5wlcmPS:PjjEceAI$e6WR1Z!p8B\NMVRu5E8i+w?JV9eXp
A^!%SS >y>JtCQb@:n$^S=m&G%P6:K4\D$^mYT16ncQN?C+pBcq1pn<4pcEnK>uyTPt+1VQM^?8/cE/<N*EMQ</
<\4?ai ?:=yGRRaTZ^K/=a<EL!^i%=y^>E<Mmhw#L6/$%=W4Ek&^T$nYBuS\YeyAlM1\u8FnVCJT+BH6ai$L=tY
GmZ%KJ nqB%y*dHLdM$RqpdmJtS9$46Bj8c/he?L:*D<K?Mh%5cGYVHF:i?^a6hhLd%VtT\PE@&CeFjbCS/9!:/
CHIPA: LDRFt8hi#F1TC5HFq=6dp#b1mTNFDbnm5#RQJ^dAWnw5eM/>dZ4M>h>yTVN:4#yYY#e\/:i8+SA1eWXN
:%<*:k h?+\15JK5=V<tYXGun^ilQ!!nq^F44an\tw$TRw@$XeteP6#iTQ!\JcKki^?99A88/h<&!kyi$dJm>T1
t+KhZq #AEECR:$Rjmql:c9k/?TD?uTNkuXk8MwYWSJi$i+Hk<$!+yFi&t>pLWaQ#BXLH?Yi>ILwDGPI\5nBHRp
k$LF^a NyLH\mlypV/wEhup>CR4WyZ94*8/E+hatinGtX%DJIS/pyIS<nIaF1I$Wh#p%B<eecb5GB1R#k*MTELA
N!\Tbm Cb9S>KuF4V8Jd!98WaX>RuBjMG?c8:6#^*mj#8JGW4?Fk>uA15ElwlyV#X^NVEjW!i!VtaL?<iQpt^#h
lkTA\9 we8St5@h<!9yKGIVF6jkq>8HKLLXllFFH?NZ=X/KbcqH$1V+p!:EaH+B<L@\wTQL$5iQ@8lW1C*<&6/m
MQ5Qb= i:1!WuetRAqSCnbi/p+YVRQ#eeXu!Y88LBP$pQwWM?6:8GIDAyC1*q5<ElYAAA6NT$>m^hhDw<cF>M=e
ZE?u<? e*c$wch$<G:1>L^tNm16IR=MN5LAY\ahihKdV>5N>?*I6IF?9kaGRqeHA//VV:6Hhkwa%:uFm+LmZmCA
?+KJ## 5Y?Gd=K#\uwS^@QAqVJ*V#hM>#nl8##<6K9h9V4<YPF:1y:tK/jpP!!=@+ky%@&NBRT\aj1ibAEC8BB>
-AemhQ 000ca200fa9001202b4 Page 145 of binaries2.zip
QKnnph 4RMBYnWe@446FYk^>ZqD#Hh6*>X!#8@Qu^6VH5j1jj<ZdWGbi#:lARlkZXH>y#MT@VnnW81QA:XAkNX!
TL&%WY ZKcDcKTud>iCD6iclP<jP=^yZ6@LZt8WH>$L^M\Z*@A##c^/ZK\9*VijihN/X!68uc<L@wTN<%6q*4>X
mkPy9# SRAC&j=HqAA&?j>ECiCQ%nEX6KtthM&\&>aL$HW6S98ql*W%8GRtBhAXendwI^n\@hR:\EwEn\t?D%EQ
wKeWyQ cllXeejZ1Mmtd&<^pC4R%%1GMNAQEBXFcT<:Fe4NhKKkIIJJ?/bEMcE=XNl!VHERnRGL4AN@1k%e&n+!
DNJlkN NR/QHlAyt@8nQG>9#T8/+4P!jE*B5uPnFZqX%1=P?YpyJjJi@<T9<YI#>Na:\SBmPLm%VkT/KLM#BITN
B#&Xd5 qW%B%5NBGJhLDkQ>LZ%lLP!^!u^#t&KS8J>WtJ*eimQ$e4CYI&pQFBmWi+S+qDTC1#GmHE&J1HRCQW=S
T:5Y!/ DaVFIai4J8\!WMb\E8P=6T>c?y&$*a8kG/M*FTm5GDnWEmKZPh/Z6R*e9IC!qtbB^ENX%e^M<GH\<PHB
Y*y==E pK!^nS<IdtwCm=P+jZmJNV@XI9TnWK<KLY#T8XGGFnQ=^<4\YJF^YWYq>Q%&A/eSW*Mp%8A9e6Cc:?>k
=w^#F# SN5l=SG1qF6GkNEVGJKKWBDES>XR?AcSQFH>b1HN%SpE$9EDK=lJXlL+8>*tq58:KFIu1\^J:#/yYWCN
X$H+lm t4MEmZThJ<599buN&QnIkWICLY$yjLu/6i6WYC=Pcl<5$hm*Sp>LFejSmX%T/wdn6dm\E^:#%RRW99ki
nWpRiF 1petpGYqL4IPqSbK@d4byKJ>S^hnyNjYwjG8TbQ:k<6D!Jh^KB#ci\!wiV^KQtdN4MpQJ@Ea**AW=<RQ
L1%L@= A99%H/+JbY%C>ElcX:qi+ZRmHM::MR1LXHQe+tjPe4/8dHZ5cbDD#+duelZ!+?q>qdn!$1YaWXb=I!?F
9!i&:$ K%bV6XLmNLc=yjk4QFFGEXRIZF+uS6pNFy1&DbIXCk<&/yiZS%hInGu#\Fh6WY6m%D4Vd19><+ph/$LE
?JY:SB blTFcD$i4DP=KnLleX!w$CN5CCVkuMEjd4BI%iF%bN>1B%D:6bJcjmmEpA%RaSH9+l//Zeq%PYGMInpA
AtCd&Q =6*Z>PbiY%N>B1BnqjuL1u/EAqMPbI&@Q$Pwt$A5!bK1l\IEw8GJ5b\5DEkZJNcny6twBujS5JcKlCJ5
M$4CR\ m!RkenW\tPZWa!Ym8+d\5he6m8p5+Hk1d+^y6LlXMm\=8#KeYn&AJ^6V1FXR&\c*<k@S9EFePkImq@8w
Y!?Rtl A:FWIdPYX%Q1M6tk6eCnKA+*$^K<B<aZmikKYTWh/qpW5FJTtNEt%KHaVQDytqJNleeXa<&NnamB<LX+
$F6jiV a\//>JYl1VjkjYnM^4qIaDc5pwmBK%LW!KMW9yW$=KGJyI^mA*YS!qBjSAup5T\\nEQAp@cGMW^DZlZ^
iu>Q1p S>TSERuN\9McXB##MH&FRFL/#5y!jPBNc4R865e/XkRMVqKYcGp4^cnR\TlMWH/*dJCcVpN@>DYILWTD
SK<5!5 aCVY6STw+8XZ+pTC?X$^i>AIj/TRjtj<DbwEBmFT%SkTM\+?u8G%MF15Ge+byRt:?&auGaM%J9SKlC&$
C%*4tJ 1n<P@iXm+GKP1XF=E&+6:hdVa1GZ*ZFJW:5ZA?8+hM!4p4:^D+&yE%tBNb:ANQPK\66GnM9=Y4iN=tYQ
$:**Xm n#1!n#18\mH>/ln&#h4n:W4BA<$l%?>X#aqjI?%lN4IY#6HR\/eu5LG<YC*uq#wXqT+@$c5TVcpY$tDq
t4HTSQ dm=l&T$Yp=TS#X8*YD#EIL?*\BWNZ5:MGjTe*pcSIEaa:/li5CaJYG6Vp+tLPq*V@PkFLEanPNGZ!p4l
CwWBS? 8aJi5?qMEH6>+1WA*i+SEhmmKC56GkDa!C^Ni>68hjmh>FX$aT@A*Aj%kZZ>I#D:QHAkMXXy5GXq:+y^
:M1MP/ D#4GR?TdMX/:=nkndcBtucTS<%aDm+h=j!YaV>iT*p#ASQt\<D\1n!T?SM$lXR<!EhKauH^$nWu!+NL:
$1GV\H jFQyNQIbYkphlL1#mRG9iQI\G&V5D&hWLVwFVkFip?!T:CaVd8F1$c<T96&>yhG#!dS+PhF@5M?#>XBX
RnhM:Q IB4a&/cwWRMBl/R%h55YP*&^SR1M9MaKKp%K$PGeHj%\>LtPpPZ!DPikk9/qKEc?RZCZh5XC#u%1daAa
HPwTQa Kmdcki+TZ+EQ&wVc&G8=SW?YmKCSTTePa=8DdeXC9VG^*n/6k>ci65a/jy$M&qA!/JaGDu6tjhWZ8yQP
1ZJW1B t:Z8Gp=XFiWtJ\!cJc\?8V&1*bwy6NwXDY4idia?S\eAI%M#>c=A+?CSmjFRiEc*1pdt*nkhDBYCp!&b
8AK1JF iaaqI4tBkKlD4+*!+tD%F$XD%X^6hSyB65iF#k4iKLY*/5QH8@%JDt+/hRD4&E5JG5qR\@/ZYEyjcW=c
A+JCE: Qm5EI9mW&4bkK6M1YMND6Fk%!Tk:9lPj?aChN!<!EV+Tk9yJ&tuL6c9mS9RLj$m*Wmj:quX?iJ!=n61C
I6SYpZ 9:GGYMFNQJtE<\5/GXwL4$N&k^WW=DSLe6lI1qTG!6k1C\MGGtVdAL<eI&H4K*n$L$nYS<kEECG1E=qw
dL<ZhC Qm6!yq5j9c+/WG1lSVZmqW!j95YTd*uu\A?/^jI+yCSwj:%FhVd6E*W@wL>a1BV/mCjKbYt45Q/yLqq?
XbT+>K <nMM+Pc!P%A&&96EI*=M^IQdQRAJ86*bVNX6HRu#nS==8+FN5*$y5y6IpMN<m1Puh^9DEiZ:E!GTVayV
e!yBNB TT+MTP+*K1IiD4w%M9GpT4pBquVIPc/NaVATZIt^JyVGnekbM=u*iYZln\WC#%=8RaQuS:$1Va6cZBRJ
1iFB4Q Kk5bLc5\DcFNDntGDkt*6IAW!%q:5k:wGTdi6=bI&a9uMdKF#uFWy#t%t8K!q1lbG/>/F:QGXESebP9c
hN6!q# h:#ZKdieMdHSDa5cVA<@b85/JSGJKPj1A=Z/*jL?CtBG6%$ZP<Z#Vlwn:l*1aBmqFK4qDCK#aa%nQ114
cn\Xbi +wHjTLmb4yLQnTLy$laINykMhwkj5aL^$taLC6dC=<P>*4FJ@DFqY1T4GY%Jc?V!GG&d4LkZtKR6%LRe
uC&@Yb V%?RNZVB%ctK=ytIXp@pX!V+pCA?yk*dqB!hjCE4qF$Q6u=u/Q^FRSa$NLNq/?KQ+npqTPIKjCKPXAyj
Zb1j6V 8TH!KGh$aIn64ePklRy>h8F8=cp>$ZaSZ+XMM%l#KX:RKmw#?5!\Km4K:IiEup&yuWPXR6QD+CENiV6!
E5I5\t !FBSS^W+h=/XGMI9jpBLhm<#a\!mdK#%R9y!ldm^=kMhV^t5\8ipSSYa1BZ/SG/TAGZh\&h*LBD1\ep$
Fy>dV6 ^LD%IeLp>9Hhhb?a9a+$/&kBL@EARV\q$PCwV#mtFNypD4<CGSI^6BFB!w>$Z/Yj5Eh1%p\<$iWW#%iF
5DC:&u 5e/B9CDIldmtBSLNp@#ET:KEkmR5@uV\kQ#+JjkqMa5y+aAbu8:?N!TaDmnW!CdT/VD$eLFSR?4bkMlL
Qn>XbI DlB^Q/W$=b&apWJIQ^W6\j6#CclyYem>bB/4<&\qdY^I\D8#6W/qplZ^9eq\=mtq?:Vw#AK@Tac<6Tp=
^KcRq! =uyYm!N+=9:!BVnIMnbTXQb6Dn$!C#DScnkVBZISCY=\ER%XVLw<FSk!Q#DSIK+EeLa+LnyTX1w6CVL\
\%^*:V eCalQRPAELTInBByCZ8AK&<QJnPEKdMLQE<aBN$eFqZIHE9jG%a&K1a6NLa=IX4LF*AB+t#InLHMKc!I
GP@&be /RI>RZCpFq^m$=SGeWBmT$1nIHlACCVAphIwBN+EB>b9DHqwDDEuGqtwD+WWFa++FBK5DdFZDjq1kh@q
iVcQu# E*@>K4S^P>>tK1+@t$D>meDXleDGteCLHcK4L+LZaEJA\A8&d\LEE:kJn+IdT8CJWEJ1eIKJKMIp1dDE
M9!Y\$ keLG1RAMFqEknFD>h<GNAI^4YkBaGacc6JkjtPA%phA<tlAGnentJX/D5cn1F*Ek4=ARtQlt8bmcm#kG
P%XQ#Z 6\kRVDlSZ\LDXBVnqYTDy4Ac45S%5ATa8NnXkhR<laA464Tc1bn4i+qEd*E@bbqEF=u=CBGMGJF=KwuN
A@q>8q K:tGeWuZdLpZn!KJDCKJdQLZu9J1XGIAbSFZPmtMq#Ia^:B5Z?RVL+TA6iK8h/L#hMIN*iJ1L=SecbRc
M\:ppi pbTAFMy8ME4#e<1aFC41BER*LK45:Ky84LmJWT1N6Jl1^IkL$t1N<tw*Twk>=RL5&81N?8w*St\9a5FW
?p$K*a qhpl8Hb1IdqF85lJ4<qtDn5DbDTI:bn:jHlNhVplPGV4QenW\+D54nQ><#DkMqhGR\I>BuDE!$\>R4B?
4BGp&: c:^=Q/PK5ZL@L/YK@W6?GJD+L^TAj=5j^5d<u?TH5j?#Ml/R@h>V^kP!5@/%=m*\h$R^h9a@JI1^@RGH
8aui1/ =T?Fe@@n14A@cB1@kPd<Gb46X>DM4D>BA*<B#e:%E<wVG@89wDq?l8d+FVV\b&nPZ$G#@M^1ZL?AbtQ@
$FP%ED Gb4:X>A@$ZkDAyq@Ae*/M=5Dj<ZZYJ?j8n>G@+195VL@DQ$499b#pl4\X=#6y&R6IQ6@Ce*^Z$L@m4N^
@1JGwH 5Q\M#jXjR9?K5:E#@+St^9+4#9bD@QTQ$d@pdD<yuk#<uZDt@$1K&:MuAnubmH@Wyj=StjaZKG:@1MQ=
YLk#$\ d+\wj/C%C9\q4hW@D^tej#^p@E:a</?&?W8X>h@iYPC@c^5PLtKY=!H9B\ta=bjE:aD@1BP1>Qid@C@y
Qli^9% j/!@4hdL?Wj$9><1mQ+!@a@>4@R@Xp:t9>Q@YQ/V>D>8>8ey^u<u@e<JDQq@NQ$Q:jjqiyQ@Sduinn@X
ak\n=K %XZ<T%*hw#@X%Y*+c>Hh@!p:RhMb9tN6q+KQYyYCG+LNuA@q%YRk\EL+*BQEh=j@K@e+C%diEa%yQBqh
%i@9dm Vqd\<NeJ9*b^dYaJ?4VI!%$k6E/y=AKcPiSS@E%JW!^FG@:B\k>=nFZLbnbbYE&ZwR8hePbScJJ++CJk
V+>Cyn lkRSVGuZm<\n>w*mDT*Im%iQ^qwnJjW5LLVRZ#4d1+bLDje?Td6>JE*u$4<^*<Z^%K:Cm16J5:PRyMZ%
@SNlMe hTQDJCe5i/PW/dbmdQc6&1XE4QVGc=lmFBt1V=KySJ*W@VySCn5Ybt9=@dtaX&Z?T#u&6aL8jJKdHeKY
#HT!l8 ujHS&Lj$bby^P6H/Jh:?94j^=K*6IX694tYhVbB8el6t^t?$IiIV4^<Xwuq>Q6DjQ*daH<+i8w4HSTDE
=kTRKL ?4auc<tmBB::jDq=+^@m^Zh^lP&4Hu&pHQQ+$4/%eXn<NZY=TITBpDPWJ:^d$RLjDKEVbj+4?mtiV/8l
Z*Ay@? 8jG1w:hAFqpJc@kHBeeXD66Q>ibjRLN@K5AehHF\cR%&Y6DhFyc8QSjEim=WK$>PJ+:\WMKe4&^5!n+9
iF&JM$ :Xd!kV+@RDcA$XKw^V%KlkqmlFnm%jqLY9i?WL=i!MQ8#9p6C/tZn:1^=hmL/KNLm@a\AVHX>qdjpRI4
hac9Q4 &SHihE1:LuVMa$t$&>Diu>S1XSZhIJpkDHaX4Z4WAwuVnb9KVRYTm1hKXk+=HSn1:pQn^!jlIG*HNB&h
=S!WcA %5#<tW/Bn/#P<yX##EqRuAY^%L!B$>\>95>8*::J?aAPAp#mTJji8a##&N*Y*neP>t=m^AMXWI1w*nPa
4m1!%V *6m<^I=#%6\1*X1^C:y*1$/yKk#Hn$AI6mph$BnWF>+c/uq4M%k!iuM%AjF$=JD*/5jVM>:%\4iZ/YHG
6Zi=/^ #</%*bj^4q?lhp=:EcFq^/wjXhay&kTMGD+<l<61n?lPlm<ZBGDS#L+BE@AF#S*!@LcR451!*8Cw*Ytp
!ma^k^ E:auPM=MmbpL*aPa=kuL\JJCtkc=>nae&C=+lIij1Emn5GLRVPnKMPa%E\m\&@\pNb\^*R$CJK@jpSFT
-AR%8W 000076b6945001202b4 Page 146 of binaries2.zip
dE$I>D LtInj#l#ny!qKnk&Cp&Yj+IGju:Nc</a#TQWNPwaab>D&<i\BR9aB=>N#hNbp?lRPcihV/hu<Xi^X8l9
PhKS8\ Hj@dD$dZ%?8K<tXP^K?PHp:5kGuA%wdVHk6k+NDSMj*+E@^S16NV&%MLWie9Ved/e=Qhp==I/d/td6pX
l5TjPP j:k1HNenW<TlVeD*mCnlF&tp=hu1CkaBHyyAkFGem?yZdtRTq@y$RQpQqJbpFF1qC4LK6X5Dd/M=6lY!
LNuI>^ L4Ed&>6ahWhw/E&AK8PLtZ+qR>b6d:@bPdlaH1bwDKT&ynMi^*V*QY/@dNQek@D!5RWBjJc>9#!XtDCb
5w>/Re :8FT*P#wR1j:i&5AtnH=Am+=duL5Ll\WJ**QXlR:un5E^LZ5hBBk9iuH?&XqPP?:IpwWK*T6:!9meP$\
ncHViL p>Hk!FHHDmRIM**Q?6=5ES1DAIu=a$SZtM@HK4*+Aq4+^^8G9t+b6>44Cl%b6#bP%/G=!nB/Y<AahekY
5dw$hI BwY>\1S$8hnw=P9ycXYlJ@/!N#mupZ/L!\Nq*YqDa6bS99&6AhjH6:p?eV*pT#iW<dmDu$nq*\@T+F<l
dyA@wj /lB&\*m*l&>W/w/uiCYtIBEY8>t>uBd#&HJZ^m6n=T^WDMLcXXW@bMbMmciwnTKN$J:u=!yw>5lD4<8n
HYSQQE l@AIwCtGw:tAmKt=#C1*wcme9:<=ZpK>>/uDMwWMN4y9n=H@iD!RJ4m+*kTdMy+iN*6<QZIV$d*KF:J%
\\%=F^ E*M9F>ilKqE?!ZWcSXyD@uLy4jq/$6qyX#//DYiN8JWhH*1HCuP!NkX<KX&nyajTdE:&Y#T**cQ&yEdq
KLPVSb ewMBw?a*Xnwe/t#aTq*%F<4TGA>C$W<LpK%<MWBF?nkd4$kLK?N$SRWXdmBL1LS>RSy+6GRZuID&RpEY
1<bcLk VIy88%dqh1Ma&q5GM1FZN*n&inPh/ptid@uXCIl!4dB%=GMd&>4Vu>R>cX^+idpq+4La:Y%Z!l4ykyl&
QA\S#e mXl=EktN*tPMGiTMn&Zt<u9LN$W>EhXjGN*!qj9cV9d4hejlMyJ65<HBl\&+tq6DjCAn/qGW!Z/l#5SZ
YhQZ=< @@4%QS>n=S9:Jmq$beSwj8?Y!<Sp<8dY169QuGPG?Vh1C>qKHi*^ZAZBbC$8yGWni!JkZ5&ZWXP&wMZM
B\yK+X $X%9*Su^h*wh4JLk88BjNw*m\@k%m\jM66Zyac5Y#nTFh&Ecb*JuVt:wSwJW&j5@p%&pm/^G$NZNtW!N
BY1+Cu j@HL8eRedE#p$Ln@Yw#lKJS<EbSawl/61IRJWcm=KjCbt1N*PTa^@iu8BuLikcGII&<WD*6LZc^YRa6=
%#9SAI 4eIp*!QATb>#@HY/i<=T5Ybu8!V4XXPdk\1Q#Nn+kC%GMS+DnM#6BwQm/G8<QGp:kWwQl5KdV:G<dttd
94#/mN 4qD!c1FB=BR$MqtN*AYZ:uuEyP9/*jhV&P4^&tdtjH%WA@:9Q1pDm^/mdMKyE19un9#hVwRmit^G^*Fm
:N!j&J iwTD5t9dZF?G+bI$N*8Rcw*#XRB&!VQ1WRH$XpJ$Cu=k+iePEN<5N6bkVmh:8^MjQ:X\?u?9h@#46nHm
y@^1L6 \K=QPFewD+YETmBAc9uW9X?&IGnyH<hd1l\4L@PlhM15MVl#1>NY1R5!FlBAP6Fi1k4*KZkGBDle6\MB
RDS!uK TE%BkHRZu@@l**?<8b:4/u9j9PI:pkwC:GY8@%@=nb\nZa@#>eYkVVGMd5FPCkq/*KMB8Akkcn+l+LwY
D1IRZ* WF>aI\!d6T>BXk#9di%RQ&^6#JV18$6>?i=l$MB*H9L8^*#56^$6$&:*:W:%\/5&EKAp:e?VpD@JQ##@
+tEj9H N\YcQju:6<pMkJb9y$:^\!DVw/n8lm#V1iGVCiP#kYq6TZ:9k:<djVE5W=aual84$5@nZl/jN<mnqB^G
WSW!KS $a$5IZydhpE^DS5yML/h<Wc$G!P1b8cWmX?YFLMIjAe&pGI<qZd1bbE^+jZeM1QtPdkpPcl?NAXYGm5a
4b!w44 StJ%ta5HS%ii#\?Z/\NNR&\YWqE:AQy&Fmky%cd?l@6AR%cdiQwwl<KGZHXEP!Z@WcXV/pQadb$*Y/XX
RA&\bp S$Pd!6jF88=Ke4*d=P^IcpZDFll*DtFh*Z9CiNKE5VwFIcKp$PDqA+@yD8M*G&q8*ybYV^*8ct$ttMb<
T@uHEu P6t\Fk\D4491SMI>#RLGT%6NXyy!=uHK+#Sd%?cP=X<Fy1p>*a+qQ8LeBW:Ppn8LFydS<TV9RZt#?5WN
wWI*Q> =T^&QwX4I61#9@il1NB^KJ6ZHbAKLE5t:dC19jXh\cEeX=8*^/teLNeNXCt++EWY6LELI=@d9i^h%</+
I###>e i:e1YQT1I=qc#B>^\n!EpdcSYJb$cQK<>JPw5!A>jh9X!&MK9HY=?D$mDct>PI/N&y4d@ePPX44Tq?ZK
NP#4wK ?8ZS:W8NPQd&t$%#lL5MM+TW1kPnW*Qj?bI#9N+>RV+TkiaQF>5t4>P#>:>*eqhP*+?qaCJH#nkcV/ME
j:Bddp #\yJ6yA%Ed@6>Yp1WnW!WC4MCB@6!@$pyDIDdnQe*:Xl?1G%6NC9*a=TqKXX%:i<FCwJN$t8Y5khp%@A
uQweR8 t!Xb\KT>#X!!%6!EiA?<8<@Ca<GjpweRjmeiTiDqqiIid+pdRkTJ$Ype>QWyBuy\I5q6F&Gm/b^*>Ph#
iA/<ZL ncRK^dhLyH9#K\^6ak?lXCpq\cu\ba@y96uPe*99=bM%A1Y6IM$%&?d9*/=GT/6\1/9Nid*bKI>/w^TC
KZPl#c W/VQN^Jqc@@Tj*?48%XbSBcy!?$wMuCCJ/nb*j&pGDYFkZb5P@5$kJZ&ele9eITVSGEN>%%1I/B+ajb=
ju#R9V nPA>X^+LwcDAdAu<tmb#anDeBSin&@JF&ncVcwq\dq=JClc^4C:L89855bInH^:h9Y?$a/Gm:#kt4!$J
uW#!D= EL\:W46#$eqXTDQG*!EM$<t5pd9H8$L#JaTj9?l/X!9QZDN@AiJW#A!=*WG^GPck4cA6KN/=tXtmLNK@
GT6b94 F>tV6LY/9>>p$N&?#JF1pcK=a^=HT6&5ZW^hT$h%bEZ*bpPeL1Z+HhdE!$DPSedDHyZ8A%Z*hhmPjlCA
D%Yne8 SnJSeI@&/mtHc84HBP1*@d:LWeVSG&<FjuLl%&/i4w#&^1m>FljV$q=Q&cZ<DXGG%*d?ykc/44$c!%*%
FyPcd4 pBdW4mjYpPLIM+YN/TWYdmI\?M\+M/&E:KQ9>5jQ:n9YjH8$RaBQnA+#Ki5*u5<VQd>/EKBPd#&j1j9\
/QIcA9 /uu/B9a<V#h4:ba\>F*a8*wCu*wchjGJ:AIB!mi@QEBqQ<d9QiJ/k\CcGXP*CILjKTd9Yd<@XZNtu&Q=
!$:D=% jyZN8Dd@>tnkILlBD\Iey*D??8qcEJT!n1TT?&neM6b+k1eYSIQ1<%nC6bM!H4F#4%5i8aTjKK@EDnCT
8d8enm a&*ww>n4iIFamT#!n>5p>#qQ^@dT6&@RYX#&WFmBcLIaZmPJ+?mV>q<ZH#w=NiqH%qWR%M*Bk/Ldy^&!
RDD<jW Ra8J*cq8Pa6\&Ahy=P*\FnGHm&N&w*5w=S>GdHFy^w8&pX*V*JB$FRPXa#T:\1mk+4qJ/=EBJ9t^HAH9
iG%cL6 dHF9=BYj1q>uZ#L?5Ii*181#QV=@ian+<:Yw#V>*uN?iL+d$?MiFM^&tb#<cuAu8/D?dc@e@PJl#kX*\
\VpjKF 9uQNh/V>l#X9?H>?t8+!c>?dN<<YnHN@6uZT9&1Stbjh6TJhWcMH*m6$KR@6>B4%/P+#y58e!h\$Z$pX
!<pcBH K^$44L$dHW%+*Ja%lWbTh9G1#*=>%e\k\Jn!L5yh?A<1Dh#Xn=uHd*6>mSY6ch91188lBj5V9GYQtYCM
PW>JQq AjN&Nnq$n89Xp\MyuZb+p>EK!*khuZZKhui:ck85^V1w:<:J5BlMC*j&mmw$aTnMh+:>S>p5H$JjLQD6
P#a4kq S:++kl/Qp@SnJ1^LQLk%Ku<Wqb4haVE<88wuD4cZTa:MF6@XhW9aDH1kqFRji!R4<HIea%>Jn6/TDME!
8X4^%I wMjhT4MniM6MGD>Tj4%WhI9@IL1:4nV+SN4CYnF8c\4A96HDW6@i%<^d:ITtK:G?b$\CJ6?HhLwk%pJd
XQ^jlI kRGC+W9J%JQBPdTXd5+m^n&LSP&RXw=TBDY#1F4C^dh/<!QC*G>JBF@F4qSletb$%NZq?YT*Z*@CEuXW
LTZiH@ F:MpCI+WyBaF*#qynwdNu8BB18?lYLIQ$pVkD6?AbEt\*cNSKahnl<T#E+HS$#uTt1E@@XLV8qTX*>yW
@5i1tS p5/ce:EN5#k%RE#4/*Jl/>%&E4=tiKDnp+8e+qt%K8:N^/w9d8>^cbpH>jq4$DZ<ml5RiBDXNN?RMV=!
t^6=n\ @h*P?iDW9L4+JcATM@NBA6AP8>J6:hb#/jq89Gb!Z*/QLuS>/:5S:RN!Le8P$ddRB<:1dnqX%eWGBwLQ
wTII/B XaX:CBH8hYw&5WIWa5Hke$E\ea>d^+&p:X58ulHnn9LpL##n*iKJbRNqqF!?M?\4h:hd1%dQ5wGtD>C$
Gqa94# eSQ=hN/9$Km:iR$QqMMHFA!KZy6p=@<RiWlcj<A\9JHq*B@%Qh^>DRJAaV?1QQeDl9i6?mBA4#kIwFd9
p#^uB^ E=u!XKZyi/:58$C@@9<HwF+PnVBVi+b6h#ep<8ChZJQbh4thC+TF#E#m*$>&jnilp5#RtmjTc1%@N^=m
VhnD*: th5YSum&ccD<IHpEMc?P%N8G4L:Y<n+4*>hVIJ5<T=Nq8b@aQCMiy6qhW>I6PAtqd^%q*BiSCLE=ytlb
d8D?:% umqqFn@MAuZ%W<IL&L#Tm5^aRmEwDIB*@%9/h?yZ:L94hN*$Ew81EW1+Yc#:hbyHFKQXVQJiDDD9*mLn
YuYW#F c!@mVS$S1wW5++iS&w!?uBt4KPCLEd8iI1i6IK1WnMa%:Qi&yAh?hIX%w!/<q6<ha^$peMC%&MFTeBD#
IBEihV \q!**u!4/XW:d?>Aj8uq:ePPQFhRw1PwQ6kPbaWGJlBJ?>uL%myE=@J#S8lY$?YqNe6!#u*BYq:@ABjJ
A1uEJG DDWHllDN6u^VmcFC@NcynTZnR$hV<wt%kVd?nHt+!bj*LewLCyMnd6XNtD4Y!%HHljtZwhhy<+yp>$:h
\#JVmC 8H$y>t!p#pBB4N9GtcS16=e<VHRWC\G4w6bZ#8Lwk\\h#nL:hXBkyu^K\WB?4<Cwh/yL^e%99BXFR6iA
NJJeBS yBKNJaS=DYjkbh$Dkm/a8Ai1F?Fku/Zppnqe4NP^W:dc=6Q*dK#F^kH^tEunmwi!u$wNd8!9%@H6dmJ\
M$>MEM GiQu^pVInS%N#C&6/ISGGe1cDRSKZ%5@nTPmqX9#uNVW#6M*5L>Ql!98%1A=HCb*=BYFhcMMG9G+ZDh^
HPt^9i TnC\huKJZl@#*>b5kd9w!W$tS+BMQDtmMd<\TF\ZBM%t4qw9h\bZStL^wL%J1>VbpyZ/4MKqV?/QS/VE
4LVY:k BD>4+iADuZwm1Z4F*utB^TQWY1<4VFISZtGQJ//Ka*$6S1?\<uYa54:1WiJ!d%8eiR1^>GXne$YX8WVK
V#\*qR LNPwPFdE^WP6qB8@n!\Cj54M\G6NdB4M#@pKhJCI8#w?\yc4tq9d#TG5b=yZpNk1k*b=:BQW^:Xn>cVP
!NYyI9 +ALY<>=?F4hiJ=6lwyX*WhYp+h6C4w*8c9GdqBK$iC>IjDBkR8QD68h*y!w>\@pbb!@=\Za/$^Y\NR#1
X>%And IPBDmkXMewM=B!mY*u:G1Ina4TXFWaqPpSZ6^b^@K!W\a>LNEtD:QL?%Keuyunb4DB/DchHPV%JNjH5w
&nDhS* E48P<EDq+I6Het<#MZhw54\m8Yu/enQAbyVk4SLh9i*l8$AI$bGZR#buLEh^%m+H>?:BFM9>S%D95&eq
jMt65: 4*Pd$/SiKRnm/&Hk*/miCVj#XDYnj?4Aa=5//mX9yntT1ER5^*WNPlZi8hbbDGk<<SNW>K\l^dwe>\1k
B&ID<5 <I!#N\Etnyq/VB@nlX$EKl9ce6Y&#qjNWGY6HIwnn9JZJL+!1bVK+pb48TBYP%qjRb%^p#i=Y?dZqjaG
-AB6w$ 000aa6c531e001202b4 Page 147 of binaries2.zip
bkk&=u lm:MhIwu!YK=tbZNBkGK%%ye+tJ?Q?LN@iPeC!J:Ek?1a4dZ!bjAYbm$q>qimL=CI*STSuQd5MNWMwP9
F\k*T1 bdLHt5Zq9mPq+*X%Ly^=5kmNwX??t69Km?\QAu4?CN+?*Hl%6MPE^%M9QWt9CcIE<LInt8Ad44Am9E$y
LRN/hj <&*ea&^kwX?6qYtBa%VT/S<w9t#dIy95$1MKuTi4Ht:Ej%\MiQYaNhK#pZH!Yt4PR9dNWWPA=8akZ8Qn
Jj>a$b YiuBa1C>ReS5>=mV+AZl8=5*84Zi8AF*+VyThNK+\k#!:RDy4?6FMDEj<CCZEB!RqpwMKNI=^iq^?MIA
k>MCWy \kNaZ#/I*%4yu=5*NSh?Hn$Rh5S6pccG$4cPdaqY+cd?nnk?+q=!kRQFh:B4lcuN#lX1w8:8Fe<V:qT%
XYmPyk 5A+nZYZF9Nd%utKYahWew5>G!S^V+jQRW#?Ed<Vd>1t=S^Im=6yYHZaQ8TKyqiN4e<\1wGj@PIX&TCEc
H:M%Y> 9Een>\5D8RKXyI?=%Z:4SZDQk!h:+@bHijeIF@^lk4mbGK^EcHEVKClSmNbVQmh=Z8*bG#iLPj9+ZZZ%
B?#QTC WbunKm&T%hednk#h/R@h4mYLT?YeyeN#cywYSmP#IiwIKl%waj^RdKD=A/inbdtcKeeW56utMEb#=\wc
ERhDnQ SQ<YKVChYA@tqSc!pkHXTRHDiDC*q\>&eN<bIbRiwA*j&V$>4&:$*aiwMnycTi5ye*Hl\?n\PD<ta:hJ
TkKXyM jPjjC59aH+?a%CFIj>8Y4^hc5bqY8bM8=HGylJhVKc^TuMKaPP:A:8pG#tdN:E@GR%Kcc#tmijKhL>m:
n^ZKbF ?TDJjK<TSdu4uYJ6K@aLidR$iHDNGPZ^ql%ceaq4L5wqk=p#5*k/t=EhD>PdA5B5ZQldN!BGL5!P<L+E
SekjL* CW#/&&+Zy=eFuBiNA+XmVwVCaV=/:pa<=>!cB6cZN+tZPy?6$eTB=QT%Yiw1A:TB\k6lPSeu$ab5?+#p
kWIeJm NL:+5Pum<WqA=tuycXiXj6?*5=:=+^e<pw!=/L#X:IlTbRtpq/88Fa\CMet/h!tmWk^XPlhmtn:FC#Ha
SVKl%< =jiTRapGjF%aH$?YGFFaLVXXRwt:\ud6kVK^Q6SSI=XC^cj9tJI6H+d#^=Rwil<*k=mwh\!@FZ<Q<KVP
WAlc?t mV$8H9Cjn&VVRA:j!tGGhIbTiCL^I#5aH=u/^%nF:+LCw1h8KN?aQP&K:m^+M$4PVG>Ph=Ry%E1bYCm5
!wNRin M=k\%p99Np+ehZWyFwIMhGXVhhnDZ/B1hSy1/*BE+cy:#EkdN6Hy9P:4jeM&EH>IKK@S%l!dPkcIwE<R
\idHKR GyJR5^#qc^dBc:>bT&Y^j>>\+uJhuK!^JN@eGHLKK#Z6$lKuZGkbF1wennPN%HTYXJRlL^phS=Wpy/M:
L++15h ?h4YQkw?S9w&^h+/ZpYq$:6>d:+1X*jW#Ych41NiB$/H6<qIpw+mX9h+VLDn9n?I?PZIpYLI*n!pI@tT
+mVT?B kb1H<X^Rkm+J9Lw=w!qlytN?%CF?E8?C1E4L4XuA%6PWR9a+nGK$b$EWE\cyq<X!M%wdDua?pG+?/6+b
hJ5kXX b<TN:mM=V=CQcnyNZuA<hd/nAK==/FlbALN@K8B58!?kyjNmDq8p4c9qe15mnEiaIm#MNC:qCB^&S=6M
@eFn?6 jlkL@T%:5e!GeIX\Xh&+aEyRA1twI?dw*pNB?5y<YNDdAmtN\1/Z4VFy?A=RnWMSVu\<@A&LZ&9pwSwd
%?HyXV 4McpDTbGIRWmw^biat?\q%V4MXypck&dP8$MJ6hI^Kh/=Kqd4/yh5AJk?X=Zi5*tJGS<i8S*FKXKES>A
aRt?R> =#P@WSN*^lq+$E?b&@FIZiT=@Ik&l&@n?QY48$=\edJQycj#Y6DZR>JwKXQE!R5i^pPF:b^%L&PB>%lJ
VAju1j =yDwSQS/XyjDDAXKEpQTquWJ%85+/IDRiE+KRe8Zk%/?wMY+n>cZW%:q=np+&!%cijQ>ATQJibDJ\CmS
iB$@Y1 5w5dSuMMiGHc^\?5CBqSMq@pMl/Ip!?A6Yt9HK6K/uLDQn11XiN<jC8GYjVbK1a%nl*Va#l^YjjNt+^!
R9whPC eSay+=*pWwc!EZBThZ%8$tk@h1#&Gi&#*8m%D%@GdJQ6*ykXH+iK/tHELFKZIHmJq+lT+>6L!8pj*D8K
JSBSph QtH8ww?b/B+YF\:8TJNu#G$QheQ//M5DK6*lCuhQ5%%+lZjFYZwhF^ihhethBBePi:PLJYkN4eFS4t#X
RTNVBd b!b<<^ylWbLqI&PFLmR6AII/wZR1FJq=*9tNPN?1IJ5!D\wRFCud^G1HHi9BI@6&pqV^Am1yN%<+w\k@
^uD?j4 NMARqa%d&ZlcWW\qa*qY=h+Q^Nh1IAAL+I^<@bNcy6F%:de:<aF^C1Tbu9\VqjbWh5uECZyTAX9aiTH$
#9>J:/ lbm6\i#FIR\I??=aN6=aIYnp*epn?SKVB/HtLiJb$XG>&8NPSi59/Xb\4h:aA55%jPpc*C<mpm%^?bWS
?^:4h4 dbEGVRR!ZF+Rnk5d=tP&6DbTKYl%XCXM9k$\DPicq?^>+YPR\d^SX$MR<L+E?4y96:5qaP&#^YZmid<h
L>1#<q j<+NamPjGy*RJZNMbkAXAGA#WFLJ/y9!#?Q6$n/iRd%>t*p+i?eTiZP\Vm\*y6d<!*QNk*cH8^<S#ILZ
p$ZZ$* p@j&K$@cy>$HL/><MyyAkPR*%jiTd>iLV4y*5+/i+6a=@*5P:b=#Z:?eekMByM/!u>hKl9<h:dpEAiSZ
AhZWDw jMj=q^:J89+Nm=E6u^amblqhNw:%P/In6Mh8>G*G<PL:eWW@5wFt*885*H@qWMmE9i<\ml@njbPyi5n\
QZ#CWI JQtA:n8y*bY*98QdT@Y\pQF@cyQJbF#TE$1\Q>C5E8\4N&GK?BIViebTy%t+hJFFM?5L8InFJw>6%eqM
6V6lLL tHB5Fc9#FG6+6*bBy1MtLE&5w:K$5a@5qitZdkZ4Gp*?FKYtR@G/:iG?*Qi?wFtimQEuW+<Dq*IZK^IQ
ljC8<Y ^tRLK%J*J>cGW6R<Q:FTeX+t?Lh/4ebDKWYHHM$1:L9jFw*8Y=wDYQi!\amqTb9:#M!LKcEp:@nQZ<*4
S/:14J Q5Vep9?wW?\6*n$CAkRw*yX#@4h8lGh@I!$w6a<YDQMwwAtpXWMy$aiQS+L?@kw$h@Xp?>9IQ+e9cQ=*
DTLEtu t&APRIA#!uIRkQu=u:LG*W<I\i!ej$AIbthl?*@!jQ>u=jp5@>jL<^tZjS#&X?ZT\+Gt!/Aec=upCbl8
+hhDt? Mt:Z&Qw\TXiEmt#15d\C#cC$^wta6/PC!?Gk1wVdBPF*!IKWcCM*D/!nkQ<w96tn^D+hyZTJMiwIZKAt
*yR^cc HaWAk!GDG+QGL#6w5eY6Ap9uwGXYiYC>u+V4+GYcQNaV=wE@EieDe4kG&9F#HnB\+cwyi=MRTQTZ1BA$
:BQTe4 wbQl9tSHWp<lltJR#eDZ*aSk^XYhl=ApY6uPj&eyejw+P>Mw1q?\C<VE$Z*F1X!n@ZyXR@!><%4mk+9D
TNtIb> 88d8+l4R>cyy9qX%Ea^ab:Hu\Fy!&:KQB*n>8YGuupGhVu:HQhSpb^4uTG*G:MRAGtNKqQ#!w$t81P9P
t8cEJ> 44adTdI=J1F8JBSY+#imh9iXh!yLt16DPP@aqEyIYVE:Qlq<WEbkpFaJqA9#u5X=L?\N4icuL&6m#*e/
n:y8QC %!l1h\1MmpiRjdiVA19EF=^B:wk#jQJk@WFXRhaY/!n@\^uS9uIVXdN8t8Y+t\Miw1G>wj5N$c6XijFc
INyKCK M^WC$a!l%jqlG5ZI@BElF5S<M$i5FiRM6*tZW\j6*mcCXX<#B*5%XcpPBWXFY&RWSIMF!:MjRu&1\Gue
BH<*Fj k?X/PW+L#e><e:MRnhY!R%WKb4Qu#RBhjyYGpKQpF1hK<dplQFnl!nquyDR*R=h6+HVWP6LtbKN?Wd<n
RY1T%8 NN8T@tWRSJBTeXVhmn*5+$KZ^1q%^6\*bcqC$l:XeJBc11*C8J&<$LXTy#:C8nt1@t:u/%IwyLSBd$q?
^lmHLt ?X/&?P#%V+Qc$M=wjRqGG@Gmi$GPmM6h\&NjFhEGHe:AXQmIMT+R@iQqR:TA*W%KiEb$%G!W$/n<FF?6
u^FYMW XPC#AmVlpYplqGL/^$%>I#BJ\EMkuj%6QLtN@G9I9y+YRJSj556>qu1J9RqDaDIu@wYmEenXm=8j\Sm>
:=pm=n pRhXM5mJ4lcy/jRBkAFN$RbQuLA98SFAJ+G%>%p9AlG1#NMmA:wla499R*^6/RPiNlk^GSh%uI\BF4&q
%q/Kc# XF*Bm$t4pB:i9C6b@M#qYJ@ym\I^KD>E5EAXF8qB+##K9hNqlFcL/Eyd*m<>9Wb!lhC$Zn^%h:C\yCLm
JcEeGe V6GVGLnD^uStESiIH*ydSIj*h9P8#q^Wyc8d&L??IwTZp^/lwM/bQYAmG18qI*hV^/X\VpYpNYZ?55AJ
mn9TB# AYYd95dcc%$/Ve5L4VJPllG6L#T!%idPY1ikn1ShZmeRS@Y\4aM8GQ8BR&!pZ^LbZ*yR#a/+khd=w&/T
DakBc+ hVqna1Ft*N&VStnj98\IX^HhaIBP$4$qNMdtL1bdyCGamKS*V8=c^qZb*mIQW&1FQNcaWe:Tb?$Fw>\k
JEGj*6 Llkw&1!E?46EmapFqu1L1^p9L@6LqWL\$EdT#WM=t6AF#pwI<utKFtc4$V1jPp<9<$VVqay^HILM&Dk6
k^ZJFK 6Zbiu#ESPGnHGRS@TMbk^\Xy$pCbScP!#LeK@nNc?SJj5?hbItNm6+dTc4cNei^4Wh5?+MP?NDIM&6Pi
iH+^>\ K$VW/Cj%YZ:du8N<m>6/MIGMMpIN/\+&Ridb!+#dhk!JqK:bVD#%9I4L#Gm/Y?Rw:np8Stl$55YkcMMN
VeJ14k @dJuY^L4*\cekA5cYBeQmn>^W8#CTpXMVbyPSXR\W6NFn#P5#jSn!>8mehh+5C>6#eT18eQI5Wb?wT4D
ueuL4p EkX5$wTeD4eE6?9bCiMi*^l^NeakmeQ\Yce1$lwwYR/^APV\edBQF?PJ&$C4N?ByZJEw+L*u4N4IwTY>
==:L84 +1yDQ8q9bXKy%HNWXW9^4@N1EG?6h=8h!KayXlRPKX@6%%q>@>K$Q:X%cpHTC$eS\<bqRw+SQH\&BN:E
e/m<*R ZEBwQlaZjj+hM&69m51ckhEeQXyP&mDm=1I^=>e&yLJdc1mTHA#T6!JXa*E<6Dlp#LmI8PG1IZRIjwXl
@Z@/$% u//+4Cdy1lSqTeXdP:Hk:X>w1VSn!k$uh?^45uSLHw@cGk+EIjluZqBDGaI%HQe#wwy$b#ieaicL?R#L
eC$Gbh /:BL:wZlDWG9\c6hQTte>FZw$KjCE6wl1u!l!EmdhLZT6h%AaZmaQeal^DNTmB1NII&qi4QPjhMpY<>4
#6K<m+ QDNCNjIKaknj%85%ZeH5HC?5lB/n$Me+IHDhu!HK1e4=DDQIuLjtJ88d#tSuh#ZWYp^9k*GnE6>^^a:i
cVB/ju mRih98%Ea@SbT1d%l<w:WmY9mn+KP1YbIeuN:$<mb#=5<e5Ti8Kc?ewNub6/hGZNu6y1JNCwi??Vi$\l
iB/yIy MiH584@eVDBZ%baLV\tj/5m&9dB&Iwj$!DFlqWKcT!=t=cI\TKNKDN6=@!di58y#hYM61huk4qEN+@IN
w$AI!& cpA+QXqSH6dd\/FS1T#&SK>\%m!n5j&9A%95Za*P8KGe>>Mh+A#t1#^jHCRVtkd#y>!=iESLcXwcuP!W
SGR4TM !@\65!nJJbqk?LCnP#4upPlQ?44t=6d>L+j&=N\&q@6jtSm?w14n9nZi@&/4PIB/Y^=wA@J#I=Pd@@Rh
C91mC% e5pk<@%Ljc&lm!:GKyiI9E+by=B85Qbcc1+DMID==SEZ%%6Np9MGy<apFTbSGt>$c/DQdLWP&^GdR+$6
i*^M*\ FWQ/cp5E8wu6cMi=8l%LNX*%TZAGD=>@P4iA*t#*6p\$My*+6?6ka1qZLZpR65hFQK>5!S>*@JCDK+\u
1tRI\/ cAB$=Acw$N<uH\KDpXYteYwyIaPDl>=FWIH6jwhRFDC#ke%DPaiC$@twlPNbPG6!$1cwSI95mA9wV:<!
-AkS%j 000a0876b38001202b4 Page 148 of binaries2.zip
%buiQ+ YqNC^REJKaWNju!TJQcLaqYb<C8VP?%SNP8yWQlcHF$e6P<&ci>NuippF%=Gw%Wi#LlmKnMEa?I!ZiFp
IK#5LH $RYJIMDNZFjTd\NZ>DBGR>@9tISaeD*ed*Ruq*yZ#I<a?\G^\w?48C9PMWhu/DcE8WJ9i6:%qXmT1D1m
P?<K+m Z^@m^weSBXhhCDEQNMST%C1FL\w<lS?CD5i/\&\%1/i#C%wGHZGm!>4B#wW+wKC@GZ&BKQA#D^eCqp:a
G*=*t$ XPkwuDN!m=dyT1pbuPNmRTQ/^n\$>+e@laE9ukRldb!Auj6mVuZ+d@Rywipkuh5m^?pkMmQl$HDbKeq>
ijDM8T e$yX/TNH&8+!WTLCLbWH&^nTP:ZQR$ZCtNKRD4QN#5ebhEyWGiKInKTAhH\Bq1<PYd^1GKiVEM8Gnd4+
5Icp!k #eu%ciaCq?u8bTkmKG+hiyS4>=CERAt^jHDDW6RKil4H%nFk\MckN$4BKlK>lK\J*t??5a/<eny$IuKa
6*#6IP aN!C>WMbcF<YZ1JJBi1+hR<!Cb4<5WluBQIcicbIi$nAlAt/Y5Fm4#@%FcYjk&IRy=B%\Dlq:CCjSiGR
AlCli4 =B/nhqE:qNA\%ZE1::dRX5G=ibG%bhFD9^YZJd1HcY\l8Qt6jdEDeSGYSe+\Sd+H1iLRV1W5&cH4%CG+
%TXbnB Awy>!yV#>\4dd^ZW6+kjS>>l*WJJ1MC<kcupPKL/?E%Wb$+J?j9qX!PH?D5Z\A^KXtJq$P$La6jh%HM@
mH?@H: wdG/^ZF!ICY6*5%EN<QE\EHR&pS^+mTp$1R1Nl%N%ki+=A>!?^<RV+Z:D/jE66=QdnNeMp=dDJPJ4ktR
RKX^^: GkqI=%D/aYmEt#AD4G$y%Im6Vjd#+wXIR/n#a4lE>\RKLet8+mHSR<n:VuMDZuMHDdGAl#D$DaGyBqC1
ScpEE@ luENDHP@TM^/pZ++%!ipYpC^ledd@%X+dwQSyRy14y/dXC:Fd$mVPAmP>AN%9lV>Sm\phB@>^k?15iDY
jN>ZWW B%mnIlK@WMScH*:AQ@GM4/ZFG8VF4yYknh9FTH:\nMY9nTYA=lLEb?J1YpVZ8yJAN$qZ%^hAG*GnCh^E
^A:tl$ J<uEWABGqQm<4<S%tHlDqHSDlnTGuSVRTiw/VcyZZPc/Y94cY\aalP5H\FDLpAW4\<5Xq#MC\Q1B!YD+
<jR@c5 !?aACIVA=F\*FWnKAGBw<5Btihh*<k*9=c?*AGD1C9MJMt1hetCDell#56idenhk5wuFewp4T9Qhe4pk
KF9*CV YZWI&abP=RWEth=!Fhe*Kk*9XG:kqPb:JX*QyNXe=G>EbbJ+qSNj!!\R1c9y1nXCTTbt1ALuJNuNXibV
K1<4@8 FIYCNc+Z%PbVbH5FZ6^+c:ILckG#Nhn=6hkD6ZyB&ni=P8!FPtByKw%y&9:1M5TV8t/68w&h8l5V<Lq6
RIyi?> @Ni\aK4njQq:+#I+XCI?$EaYbMnJ\HAVektFAXNPQyF?94qD/EQLij6kk=6F\aEY&kPREPpHPPJq$a%R
@WM^*= yK$BEuD\Q%+De9&jw^Y#E@?FY9S9$+4b@+BL>$?WK\:8u%A9Pbl@AR*p@wqeHAjL4/A=jpLW=YD>FVV\
Q/PlHT b&m&Z$C#ej?EkekB@BZ$#!muHP!@kGdq?kpDpaQnX>C5Q:6nuL?Cb9+Jj=GD/^jRQ$V1@ln>K::G\9EV
%kM$yl pnDu4@nc#/t&uL@mdP\@8*BP%9<T?qie:chWY$:kL#%pQ*F$#u>mM9+F?!?bnH@XL9#BbGV@1@LlQ@:8
cwGm8H j+dJ!Q1HVMbu+@/utI\54F#@#XVGm9>Hbj^@XMd@n%Eb\YMWE=SR*Cki=?XtQ&TTJASAlZ8T/FAd:k4:
CW#dat NWcw#>Ln*h$kHADmeRI!55D4J=I*/l&6AYcqK$YTMcuGt&RlC!KXhjyDBq=\YI4qwR9\?VGS1#QTPdj!
%WPEpp qy#><n\inWkm5tCi9lDml&>XQkMM=>J69MVK*tX@@/Dh@BF65WWt!/L=Vd94VTNtW#wcL$54aa+&Fy!^
X5C5:: EhjF$/tQAl!ByhieE?4S+tWHQPX<^yK4$IE441>H5kw!qh?P=NJmjm@B%%YJlDLSepXVSE/<iIVV6>yX
+8keaw QmNTbP<#ZPGF4L^=wHjHG<FI=i<SulbjQ#8$+JQhbB:jq4#EB?$56@yYNFH!+wS#T=Qp!HuM&<#Nyl<J
aLD&15 kjGy@$he@D>IZB^TNHb!R\9a&/RMK>HlJk/d9!AJX9jHS>N#hW?JI^*E@Ck%DTYtSRbj^kEAeEA\&Dtk
yq1L!a w1d+C%PEwk=^Wlbeu#y^8h/h#PR*6$nFjY!9eL?k6uBwGKBi#d4hQ/:KJVB8$=1j#TYPp8kl*8iq>a@=
P#ek9u A!+p#+hJP<SLF%bbF/y!6qkwLhIl/9KcY!Ynmw1PH*@@n<Q++>+^R6RLu5GCqRARHuK?\R\#BaIA*d1u
Z*qTDd lujFuDDQLYyi:d=T5Eh=iuSw>h*LZCX/9F>*jubB:ldB:#hh8#@+Tw/?*+/<^$EA+N+GCHC&?D*q!Y1!
LlbHV^ >:q6qh?aH8d<1<@I=m1j/uuH^pjJ%MI\Q/hL\IcZaV6L>\S1J9tSKT#A<kdRb:%:i5F$*dB?a:@ki\AH
&6#kaA A8^FX5@P?T/$1+MABXVQy&AFAYVqu#9+E<&u&P\u!:FHB5=H*WdDi^Hj8@^@^IEY>^&1/Eq$>8cWt<Qi
RLNc@b p>$WNblFAmQJFPSGlVYMtFj?+NI$l?wpEJIS6XBF9p4a>:#GKVLR?N8jBN@9!A8@I/*BKnbT*c>jqG%j
Akt?5@ tet5nKX@!aZ@:Bq?aBFcY/A\EcYthn9i#FEP@9%>8dARy<hqX9HLD1p5+/=+4Y&6LMtph#^!<YpwA?9a
:GCS<l pHSu16h$uCtNTe&#J!h8ycMNcV5hYb4&L8Wn=B84%nLXu=SH:NcT1k\bdXD:$eY4>iSJabZZ6w4nKect
CwiS*k TB:u1Aa8cKILNN+QCRk!Yieii?9dd</PeTuFc596ph:a?PF99WLp^n8X&AbuTuJ4#SN&&/M4&hZ%Fe@/
P@>$Bi @JFPc8de11WXcLTP84+QHaT\\JC6MF5y>\%hu/F#MpKi:h%4W4wkV*InBQh##L9N^dR>EIB^&c4J9Y/N
ahV5mn TAYYNF^GtJ5kDn#h=&nA1Q8mP>q*6:F:S?^=*FZp9F$jF:^eZ4<p>d$9#ul\&M&?5*P+R^N<XJ%<+4!e
9\1Qu= itl1jknNjmy>@nu<8%hQ84yQawwkkNwXcHy@:hWXS$T=qcDT*CtiVb1>:bkETbw%?mE8@86IyCVyj68Q
N/XHQ& R$>jmY+!u8T:BQ?W*l$jt<#kpHn:8=9$8^ih@*1Vhql8mJnZ4cX*X!Kty8<VFTmnQZK$TV4<6jXd5PtX
#6?Lq1 A<46%5>\TSaIjXR8P6/\EXl@:WXqVyjyJ9?Mu/DEkG4@qyq@emw6ZR6>dJaYl!V?Xbyj#MJNQ69k1C#Z
bpn$1i +^S#eVC*KwVettiw9pKaPdNlSYhqG>bPD<q>lc$i<a=Pbk!6V<*6!whTV=8n\w^Q:PMS&XLNbW$:VAW?
p:H6kS nHVKEq>p#tV5\n4YQLBXS&J%&FP1!AJ+bl&pQ8h=Fj6kaK%tXN15NLEihDNnnWndyn8%!dJ@RYZq=G%$
Jul%K/ YMMbl\S:/VNm@/+/tq6#cphG?*ycc<#aeP&BPP>i8Iu**c/lA\H*dHTNec\NDjkE\d&h:eTa$uW%WAV&
akR:*? +C#\<4L858:1^&nw1jX*5#LS@i&Q:J@/ndp@N8\twwE^t5%J*lFY*/Iukp>E&^HBVP%*5KqQZ6Rqy+=D
Z4V=a# >%?WSDuu!eIGK&!Ac/XG&qw6Y^%i91@dHT::I5/+EcS>14HT*F^+JTFnl@HaCV:EEMipGeCDAFDW\&<%
/*mI6h tNkMFFu:5cKebWalZ?6%aWW5Sm^c=Pw\C%p6Xai\jy>M?LR&dy9PQ*<8nKDIQ+aWT\9uWZjBY%QJibJ/
#9y%H% q/@EeVGJHPnJXy8ScR$@LhGSV#6dBu%ne*=h:L$Q#&FkQ%<6b=6q&Idcukh*/DGVp5BeBmE8mH!>Z5p<
hS#6\G J:=a=Ta!?4yI:?BDdaYjHp*8n4c&cQC&?lbHycZn>t<b<H?*uZae^kW>&QuanitVeebC#F&Ik+dkHt/u
RZWt4A FkmRc9E96@FLGiFK$h1I<EildLG!@Z/kZjnnLteVPu@9JdHwK!@/+9q*FRFaIb<KLQZVqHllqGdtye?#
m<KLPj q$<Cd&RnyKdPnk&?#T4NJww=!BM$IulFN8:&HNQNwdXhKRTdH/chiqS&KC9T$V8#X4lp5dA4!*5TIWJ&
Rt=k*n ?X:&IFP%&d!P%k$q=Cd%Ctp$1eQL1!tEIiqY>K+^!N$:kbC%\44e4!/aJImMp!X>y/Y^Z$$>E?^NlSVh
*q555e eGZk:?&JFN!+aXQ8Q+aV#yNMGK>uN!qWZW\MjH1H:QLu>#I<Ra9Qe#BV@P<jjSeh:nn8W4+Q*\61kHe5
1k9Nlj dNc=*=Ap=WRF/PpVG!1R1kpPn\dcX5Dq9c@>%u^mA?R+\G8j1PmyhSVAnmdPpTTw$E+*B#kNpC!pd?Jy
GT6\pY !heQFCcPWGSqJny9CM=aT&PT94eK:**n=pI/mPm?t=y#Y@kieKQ?Ca:J866tn8=1BT%dG?5T1Cy6YiYZ
MC+:li VNn\^Yk6\:Z^MYFy^TiXhP*!VaScq:n@Cb+!uEhldI$FmYR9Phw**4Mk>@8l9CZWbE=wV1^I@c%RZi+&
pp!anq M&&!5IS9nVFbC\?9S^X5Q+:+6lEhTaMAXIbpYd>@jyb?<9#ahYBy+1X%%LbnN4GK94dDleRtD?e/dLDP
tF6HBC #6w8X:jbc>CGq*XhQHQMyJAc8h*TTi>Wd!t:FMRy=HQ8SMJd%5kMJW&ap@1eq8l#A6MDT=pIWeV\6M*Q
H1?M%4 nj?NMFG<$@VeTeZh^@8h@JFjkTH>*PEy@ekC$h#tPSy9A^@Z!YLN5GJ54<bBweV5b%$95NS*!Yy$T/FB
E**#Tt /Q*F@VmG?Xm!**F^!9RGJnlJ>KYJ5JGH:=486t4HCWdI\^dFHPwPlYF&JAV@?m^M@<P#aQ=$<ST#+Ge@
<6TDbW GDn^NWE9Wj8&e:KGLFAJTyYGX5a=^:Clw<$le6++bG<LY*apJ=u+QDGYL9ARKAiDQmaKLXbE5e<n5RkC
tPt?IV GNb4:b15bT@pA?w+wdj+FV>bFH&G8?AmyYPRAIlyPlI:!MW!cFbIJ9w&j&jwuu4Bw#:DjqNb9tRnD4F8
S*q#:h :#$$QGD4QylZ%!Y%*j!t=Kp5u4+T$j&ImFIG<:cXCP#cLwlnVV?i4wRCVcamY\*1yb$aYtM:tV!>A?:N
hFchY\ XMpLi<Nk>?VhZXPTy**jT11H>&?nQh<>1eSR?$/wj*pWW5#?&SC#kZ5>#FqnwD%?+%\>6mpT<BJq^jC4
l4QSEX @8P*w@uATS>^R>dDN9iK=pw:lpCJZkCFhFm/tLEIb*u/:Y*pm>e:DDBK<\t1*T@$yGIqdWt5yGImhe8X
kmic%k LXj9cLQ$!5<nMhaWy\in%4L6MJJn%%K5I6FHWGl<=kDH+=eaPee5e=/T\1$bS>n8J$/PBnRF/hJt=cQk
q&8CNA RJd&544TQF=+qa#4ki%L\=TV4Y9d#jkFlJX&&PLpwPWQnF6q:ZYQ6a6J^Y?FP+J*8*Y$e@%#YC8pXDl8
Mk^YKw SRc=&@LKwau\$#u9iBta9!uMXX!Ze^*Vp%*d=bbEC<nNR!aZ/6YidRjW%j*SMQLu&^@:?GwE48!8cGYm
hp1S*B @P%=19<Z&PwVCYJ:TPbme5Q6dnuCNjFy<<XV>1Pp=Dj6::VlP\wpI5QLm6kX!G&:iPiZ5ASpL&ekHlED
A/nbwX EFD:QQ9BJ!k5h5k4bcQhu1!#CnaQT<Vl/eR^MMujh$mZel*@cVJ9J9kb=caABEmwny9/D@kQ5B5>>ZS^
yNP@TN +#+aPly?dq8K6tECcX<mQyKE/!9y%QD6G6XiptQp8RS4Gwp/DG?>FQt1bjZpEdJG!hQB!atAX#B#4#^W
wI8CAS <bRHHce:8@L6:XT\Je$/EYH&F>j\ZZ!6yul6DeF!tYt\A^=BGlkw+XE#^Ze8/phh<I5MHj$iIIB1Ve6>
-A6:&I 0008f52f981001202b4 Page 149 of binaries2.zip
nk#*E? A:w8S9KJTDSdGmuj6DM4$&t!EPjHtmQ@CtAM^:Ji9t!qJH>%?a6^^Fy5E*?bCT\SaRPJVEuV:n68enw1
iIIAWI 1%RWbBaRAGN5t?u:ZjjGn&wBdE+yn\@4=<>dJ*Fd^y?iHG=^j5!DX<%BAF@PB$VjK\u:=>q#h<aV6PBh
=aeAp& Qmi8:@wpCABB>DCVEhq>>n\D<+>=5y\eM9^&=h5#@D!D6@nND#<Qd*#@$c?ppq%1YGt*#Q8JIPhWH=j\
/j8YhH I^6CnNT%/5!YkehcQhWq^FpB%:uYQw+mYGi4y\Y9&w6I\KGDN$&?GPlItj&+hQJme#/$8j+1aJT=bh++
/Wq6HY uk\5tlI6n*Z!RHLI4eBB?SCt4Pd5GB1GR?CN^\TEYkn*m@DK>WJ<PK=?Y>^qARl@V:GlkIcTq!EEB^#L
u<l5N< E&kKda**u&Y8&IR8^ELS<RC%eeM8T9LiB*yEj*^6@+:SCCJ/Siad+hmB%RP!lH:I^YRG@<F/Tn*RYmi+
$5@<>> iVG&F!?NIp46HYYe#IXc4KRBb1?l&wLkinIIeQ/<WGY*8C<1jZywj4+F9ujquA95m6>&8^<Ruq8p*XXc
K^$Dq= =69NAAJ5GD=bV>:I1#:iPaAA+CDAqabDtZZ&&dn9LjcjZyBWXZ6i\?mCAD*hQ>+8VT@?j4u?BQX<HSZ4
!4nE86 @@9Pp@$<hQ>jiSp%PPuZ$u\8p#awlV\4=X#Gp?qe8^m**X6nSlHTb8uI#5HweJSSLW5^y+Wi%uVdjc%E
Mdi?5$ j%C9=Jj4WW#@R#$K8I&t?DiVemE^wc$/>HE\8jiN*e:>8H>t!nP*6JiDCjuPFy%$wj*#GQQdVk6tl4&V
1dEK!Q epwSXh>AHKPej+ueAlC?K8P4*B@1b5i^J/mDpLwV5<Y*+I?l&N^>^:=PK&<wF\VB5G1NG\hGL#CjdiSd
P>:yEh h^Ki<b%>h<!M\Gc58JBP=>uktWaLDWMGN1@SqMDwCXTmyle:L@yXcq=6NMMcJG*lcCV8#8%&5VVc5Xnm
kFEGJL uSL4NJV:/:kXQhdPY48nCT&^/yH&?GEuh<NCR1n+TPJVXliJ$XG5T6jcjWRJXpV*CY\maWy6pKI=MlV#
Tp:&i= /!=WeWjYuN>ThHnujT=4ui/e#n=lLctplh#S9bj\#TVM$+:Ct%6$#uVam:C#!?P5R9^l*Z<a#wR5lSqK
Tdl4Gn bQ/pHR@5PmH^XbMKlCIP?RYk=uPbSnbQAG9WR6:ahEdwRAta^#m!DIyMhF+4cQbEq4?>GVIN6$R*%Eki
Ad=+4b dE8in//J59u?Vj>NWEj\<+#cJ\!n&EDR88Gwmdwbc!KKhA1jqLQwGAiXkJBQ?6mtpTZP+PMHP1l=%uCc
q&Rc5h Y\KPD^/qK*jS@jTjhcDn=AiEe!HH8MN#APmGjZ:SLj9FVbp%AS/:NCK>PP#e!LI/HqFD=M5ltRZqBpI+
4J%whF VmY5%II+P=$kkKW>/?SNRN/I@Td5wbpEK\M<p!b$8@>&e9MmA&%Q5&PcXyJYj/tJG4RSh1WR<Y:q=+!q
bZ!y#c +Au=ASb4LmC5=e*#m9ntjJn<//ZtZByl>A\lQeyR+$/G#*S8!WC&!y!ya:^BV:TRWTXywEV^C^E99JQw
@m:bJh N?QWu=JP<#Rp$FyiAh+bn/w6=bJ=tWVRw=CJ^ihL?dHq5B9lH<j#lH@6Y>FN#i%eRA5KinSHW1El<P%a
^#d%CZ jJ!SGuD>ltL:wSG\1l?Lk!q+y9bbFCD^i+@<*jyQ\uY+M*CihFa*Fiy+/ah/hMWw*XAh*VD6m=y>>/@D
\KYReV GSJ6It:W:HCW:m&5jLB^#4ybjQMZDye\Mmal@dJYPyK#%b?$JQlJaeAPcMRQ1MnPG#u=PR:$MMFC%uR@
M8TJ@y 1Ty&t@4a5Da+%WYF*1w%<n+6PDLZ#8uPe@Ia=L1R=&ywW^#&1yFi\yE!>umaL5=Jc!h9854&<yRIM<Np
aRueqB w!qly%T1WF6h48A6<4BJ%A1<e^<4TN1BI+/H8+%edh:i*6=!e1cZ4%9&Ci%ELZhSB\@y<ECJYNm6P?be
$BaBc6 cTJlTE=ncNiJwu#mTtWNqypS4at>pElKPKHty+tKpb@Jp=y^%X$iHw=+EH/H%kk@RdM6*Qn/KIA1R4:F
Rw1j6w +IXq5#q%D4WB5bPluBJ>nue5#DRjNJ$NR&YGT@N56ZKJ8M\qXR4ijENBhk*Q4XH*:NpQZd?yP/#8K\Nh
/&GQq? c!5?k<Sq:*N\1WICW!YdF^Zq*:&=1c5\%^pn1Awy<?&<n:\t:K4IyhAY6V@=+JRPYt8:a^\1S6N+*&N6
Sa69ik YSp1%*ZF4y<HDhPKad+Z+V\hJ4tIA\lK?ILt>=tSYJiWih=ZbZlDVyldabJG$6**en89hb48WH5qdEi=
kRDp<k %eY#+T>dt!ZSVRYyk$Y<EEJBW>y^jZk>ed=@1W$SiKA=BQ6FN:W*Cp=VlP6W%^H<a1*hZLi\5J$P*%9D
X\YaRW KC5$!q^4SBp5KmZWALlnatAAHE8uw#p4tMhdWWMjXSat+FMn=GXe!KHG4#bMK+tAP:ui=t=8tA>:V/aa
#+&Yyb #SWDly/ppql<ydca%/$Ahl?h1mKYQKicKPXJcIY<DqMwnnAAN5A+9^!R&K9/KLPJ!q>WRCEqWMEI/RVH
Q^T\?# FZ:l5I9epS+J+M%WwK+kVX<$jqXKXJ4CQH#R>?JdhF&5mNQK9IHw9X&mZWMZChc\m6aCibTy8lAkTaj5
8huk6\ 8*1J^BdheqIqND*iBHPe:R$JeT8uj=?p$5DIKw&P$?PXi*WZ8DidBMWAn$??A$G&QdXytN1DC994$kM/
uikTtt J5Q/ACdnt8=p:eLGBhTJ#S&6SZaX<CCYPFX%aNZn8WG&J@L:<dtGijMhDCIN48nDMCIt9/yhW!Wj4X/j
dwA6** YZuZ5%eqjZX/FTQG/mwnJCG5qbL:&5n\5/>$M=n$%YQ=B>h:mjQBGa5ktTF9nVu@NduRu1@<=Yp^ad/9
4=VVC< qe<J?JT>*SdHEB!/SAeC%VA%Z<6cQC*H8CLFuR>Q$E\nEAwL8M%u4c!?1N!d9MP=dNA+?81AG\R+ZQL<
YZt\:@ p:49X?YM/$\R+Mdtibye:Q8hi9Ji\ji?ee%*495^$iKST9BS=$#\aQ%ynM$uIj8y<uZ&>dQLt8N&T$<>
dw%e6u i&::%Q%4EKA8e4*kC\lR49@qpSeE?CVlMP5CAm^WZV&>B\GP<#q@>YSGTLKL<^R%Gaja$/QF1>:Y4Hq4
^Lju#^ ph+$htPNnJ4&dESjt@1wP#J!JW1uJPeN^PQlbP>nK*ZY9*eGj%m9^qKp5$K\b^AWQ+!!^?Qt=$#H86%E
!YRNw& LFt\CikL*:F%j<pD:\6cVBBMh9$p:=elN%<RIR@jFFjji^/<B*:=IpATF*ah8TE=RZy8a&=::1^IT=m\
J6K9d! ItAqA<6py^t*y%IZ?u@*bj>95HH$#Ha!L!Hd\QVI*Gjbk&=Caa9YhLN1<QG9i1=em4<QLj$8tm&=N&ij
EWTN$M 4hHb&uVF86L^Dc8nE9^=ACFl98b1!La&5PqGXWR/bN&8Z$DpMa@$Mbe8n6/Rj?Mmln/FXq/lQDk/QNkV
LnA/6a *Wt*GcuQyKW46jB&GX/tK+kVBhHY\LAC%^yHly5VbZZcubC4Kyj6WLN8^Y4NIu^$Ebd5Gk9w<pFdR!^N
*/1:dZ c/TnW%$XB&G:/Sd>%E+F&Cn4\Lw<TjdlKcXH59^In@!<d+k1w$B=FD$Y!tc&bd*M^kLYHu9TCc56GTGW
5YTC5K #FX4b9P&XTJTN+tAWHT#Wl^JWy\yRYPiZd1\@w1@MT84h+APVyyeywBFW6&$b>caR9/N@@wtbyqp&TBW
qjRt/b bYXZ8^*p+ntj=y!CCC?j9\b8\KW%/ynQ#Nu<B8dqZnNj#TlS^1hVMalAeywLCZ%bKW!L#*wAFJ&Z<=F9
QepN$a :?&L?ReW5VNM\9iaKkc+Bwyn5^TW!eN8\q?k$daDFPX49**XiWlJtZVa5!S=H+NkR\mtVQ:GQA1#:QSI
Q@wayN t++ck/1I\e%^PYyAJ!S6V/8!M4ln8nCjNNEV#BL^\+jDG&tb8h&%qpqYJH8E*6LD65iPNl&&HDFm8t/1
SQuT4E aPXQJYWciR&H@Yew!Bq:&qSJXS$#mALbHC\mbWjuM9Enb5knc1SPPlDNDN?NP8*ymq8N5q+>+mIZBB=c
M@HwqG %yJ5%BCuc+b4&QPYJbQH%Cu1q!ViY>RjTyQh6Sw#VeAPwJYSmDp?CKh*k<WT6m6yDk8Cyk?t>Z46dDCY
Z:\EjB t1jdieCZ\IKeBNG?dt8?B8A>P>L\bJuX+yKkYp64NM&E^HbkniFuGqmDat6\CY1tm9CS9n*Tt6l/%CM^
dlaqCH $^4NhSQ9!?DH5Gl8<ZpJ:p#^F@eSk/9ypKL/!=$l&q%%!DMb1aGq6KPV%nnkk%LXP9C:pmWHq!N^+1<S
qbt**^ Swtl$M^WJ8BVwIVa&bZ?j?#>BXleWbwFmlbY8L8E+K=FWYkT*KX\h\u8EknB*h%DeHiHEN\68AiH+EEV
XcNc!n IAt<yKiub:w:#GYt:=%:**8*<u&R+6R/b>e=/=^@:@Z99Z:FET/DlZ^ykW<mNXKYbMHmKQ*%8R$Y:9*i
ynGC>h !XMHGwh#X@nFX<1=@pWhXy6^?w9nZbR6+SLQ<J>wypi@kduV8>NMdG%MR/9ywq$S$VK:4cW\XC\ZF#NQ
j+DYnL &q\h\E8?/!jpqHjFe\JIT:11b<NE>*/FN%p/tWX^!8K?Wt%Ve!XLp1R#Y*MAdt<c=F>P+WWMMl\<WT^N
jjZ$6n bBwI4%:LEhAkb&iX1^G4LSQeGFZqS6?QJa?EFFey:pj:H<^6+>wKP5P$eFbd\Ww>Ne$/eNTN9Qp9>TTC
uB^jV% y@RYVqbeX8:a*L*uw$%MNQdBjK4a\^!bWk6jqJ$1BNN&9pPCya+@FVWbV1!Ac=E%w6Rp\YaCnF5hTpLY
+eb?K1 e5TaKjWYLP9V/\*aT<6T>Q/$L&FMu^Bl#T/>S$NAnBi55=8WTlacIe^XX#=*&4H@Pi*FRqD19n@9=b1T
Q+h5+b INlkcL8/&mjYYMmFX@A8qlNchK!elF@A1Lej\I*J9uhdMj9lJMiK94tBwuMuE!EHjK*t@/:iM^LRLuHi
Ba$*C* QTV\W@#XClN%*=C@Ew&qH\DLit#wMKD1^@5<1\VTmP>KkkWmBC^dl5SC8hXQ!Hb4#$?mm8V^^>+&IYiH
@H6:>d HE\M/p5!w<5mDWB5@W\WWa/D9tcJu*<1Rb5:hnk\5Xn%IF=E5<J?qS+>$lE#An?!I+?!?jZkduh=49q>
J!4l>/ FuMJ<YI^nV?&:XP5Ap?KF^:>+n9wGBlKwnC!YqSTyk%wK$TT#C5T5%Wec65?T/99N&5>Zp1%%4%?IkH#
H1*wbj Gm$FS%?1:1SRC=ZVn4uZT:D>KYdY>jVPW:cW8L6<Qnq/4bkT>9+t*Vi8QnGdtJ$+tG>86/1<!uK5CE/Z
RBJc$G hdYnCTcGdP&G^+typ:qRm:t9T!Mq?*SN5^VQX$dHYQ*4BPTyt@ma>Lhl8DVicY\!9:8j&uQZX=6pJ=ln
\!8J6d QB:SYX^8!CjwYyCkjlq5BEY*14AJJNqM<hci1C4k$6QKn\jL&tqZh4SK+FBF5#D&JYJJZM?i6+jk9?$L
yQFV^j ?qAe9Lw4u8+TqiypqnD@SL1w*>M+#5NhQHl<4q5AVDCu\nyYdq1#AiIy4qWLw\qie\::=GEk*J+qt@Gi
cbEHB& Jq&L1K/8Ln*bRL=^S\d@iJwwT@u<$l*bLhuLn61ScbR&<RX*#MEX/*nSN^@pK9&dk9PWqML1y1uXIi<C
=QZ>+d m:8CN1b#Bwp1J9>K$1y&pAGhl:+qY1%q#aYhaSJd^!yV@*ht#EZl<?N\:S8Xpc<<&J<YF$QyR<8w?<@b
p>S4RI >4Jmm#FFiG&ED>ia&Bu*qFdd<&$@!QcuXd=^N&h=pmp9ukMZ/knqbH=H6<jVG4kWheV8VN8XPIRZ*e@$
%KVm>B Ej@D?$uI#\m#w8C:GZ#HuR1Mjhc64DE>Y/4Z4^&$:wn!SZELSP%XnZuPu9Qm*hAQF+l+S$XTbahleRYy
n%1dQu c1F6KIp1YY!@4b+dWKmd4qmcG8emR^8@T*9ykBba=:m4:b8knX+NTh5=jm4lqmDZiF6nm5$lGX8mb8=c
-A^Pme 000ea156982001202b4 Page 150 of binaries2.zip
5ie>Hn !wXQR\kGX=Katw!?PE@$EL$#4uy^AP9%n\MkTZcXWWb*X?cdeFSTFZiTL8Jw^ti<1XXE/cZQGat\Y:+e
:9a4*A y#^:q=Eh@FLQG@qq?Lmt?H6lE9XNwYPEEipPuEm%X&idRuSJ9CR/Qq\HYL%j5%+&9ybPN/GypRkXA%GD
SSn/@u \acc=?n!<%GIMa/N%yX>lRd:p+j1*&:LtbGD%cFSiHcIjbR@Q:QJqK8FH5+9<C@i>FX+DFS&j58ZI%kP
t1/ITX %H<4\!TS$?6XG5mXwQBiPbXLVbF#=TD8Cd61W@$$a5FBR6h1ZMT:Cm?Y\9j%V?5bST>*t!:wb?5ZkA$\
&t/Tm9 Yek$d^V&JCIPiyMATM6J9A%<$Jk<tM1$*Xij\#j%HNqy%=QQq:4lBYjy\*bN!b4D*uC:$66%%AWVWK8G
HPXBp5 j+>cLTI:bj*X$hFMBF5>p$l:Z1u<:QyY>kCS9pLD4dD9T<HNE4N=uPARZuuS^k+<A$p=Zw+*HyuCdPHh
<mMSkN kkD$J=kd@=*C:QFhtaDapBq:ITMJWI8EB$Y4=RZMY5tK4T@PW!=yIyeLMn1jMtGBbScH%nuiSZ4ZYAtt
kyKMi? GQdG6YC/&J6GY:D85pj!*M6peDKIKyT>j@^XGIMpCXb&a5uY5lhQc@%<@1#y/#hY9LdyW8pCV&XAl!T=
XbL5Vj F@ymBLTLYtWdnb<e=Rti&M&FcM^T#FDFEjC8<9dT#/y:m#uT<HBV=hZwXTjINq%$Sc<eiGdmWuCmlkVq
hKA*CH XXGnSa!>wlENKb?5$b:%Bb??8J@JEFuKj/Hb$D14bQdiu+mFVVw!?RM!<\mNhY?^enA@+=P\\m6KQeEB
u!@YKX P%dYnFG*<+di4LkYm$&JE4>bYKwTlHVF<KVnT^M&&^?jdDFQ8Qj5VBq1?PIMR&q16IjnP^bi&G%5^Xah
HJuw8j BZ$4SLwNTdY>DK=9uDh=I@P/IiG\F5GI#Ku+==IpQah:GhN^+&J?*aXqT#VCjLcai8IRSjB#?YGyWW/m
n=I%Kk yjiqVm51^W>*#Kha8RNuqh?Inp1@8SKDNEG5I4C8Wy*SllQlp@JRwywKpcb!Lmmc5k+8XJ6cp!yC\?FX
+>R>iA L@PcC$TJ%aTbL%&iL\hQ5:a6%QW<L/nWTW*5Q>eP*ZI+uRl&yAwN*S$FLGY<IhaPK5ww/HC9t#h51E>L
#%^%8I !\:dmt1YRKuN!5#p9jcMj8a?E4<<X5Pqw6&W#QjMR?%cpqnMLXIHRbp$F6C+jXZ+ta%bpW>tw*CP>VmJ
?wAeCD pbRlnE:D<B6<>a9*qM%kA<!dF@#F!i*t/RPKMbjduQ45e?K>@4#d8Ft8kSY\d$L9J4SN<8w9BEEDZIh8
\>Sk/: F$I4KH$$Mt$D8Ta?1:VMYnKDDP&jPFFh=5ZW+=@uS?<e>hcpWiX:YX=%H#EjiA:4?D=BNklW#qW9XePZ
<<q%$6 JcAAcJYwKP#/w4u>$!TRj<nI+udEk@t8mK<Ecql:/$db^P\ypeuC!=MmJdA8VY4wER/<NTadQGmTd\ue
19e*=% W/uGyMtAWwhm&RLw*\ylZ1Ve1VNT5bcXnk=j\IDZ5DXH<YlcmnyjG^>8j$IlbbWaHmh5pFhi$NKV^w5&
NY$\Fb tFK%TAky%wYF!%4?XmtkeP+hW9kyTkVydSYBhaTj\#tjuace9nmqqHJiN4#d&S1^?@aHqCQhy\yTL%8$
iAE$yC =tSDh:^>>1pDP&^c$/M#@ay5dLIp#!?EcVl/cD6Kk:qwuKWHGZ&kySjt?9qjV^^%jBk5pn&DGk55eZ8i
aVhhQ1 qeeQ%<e6cw=GS=jZEm^@C@T6Z>99Dau#11cEdI:it1qbH5w*EWkmKQIHDNN!p^QS?VD9J%l!YSTdBW>=
pCua9n BI$k^L$NCP8dZDi@+k&P6Z6&?mRqHy^B<<ynSBBuAEii4EJBH4=YEhj:eBw&&H!:Q5@Ge/:Rae<6wqDQ
d4@mhk $l$@m*VL!c=MqaX6ehXMH^:@cS5FhPdXP4Jk%I/Hq6bS1bwI?^e#WwBG*VWbwjNPBepZbV%>HTj&&dmk
<DmuRP ZmhyWnZ5Dj#LSiF4GnQ8k?ic5?iN\a&RhIjGF&w%Q5yLZC^FETS*p>=m>lQy^6kiQGJNaWd%8M8=I@ce
Fl/?Dk 1qu1<E9N!S^mpb6JiPDXh^K@lw?bYnip\4X9&jDN+#bR4:!hG1ma!VkIFAVh#S1n&<1t:Y:euw8jn&jN
ijmDyF Vip5ecSQ=Ip!!#J!S\hbu$$ZX#DKdCWM/i8n5<V4%NjJPn1:tX5T<eaj9<%HtW#e#JaYR1\=dFi=wS:y
i5=9^u &+\uIpitct=wqamYZD^cJPH5m/BFE1yw*FwNkihJ4AjPhMltGF!81Twi*Mc4yFJ&da#ELPEZ<G</*:CQ
?SuktP 8LM!!=64FcbX=n<9#/%>D\=1>Nq%5y#G4#89DDG!jj*T&t:I6ym=aAYwyWWtlhLSQj+1Hy&y99QL6n*L
INTF9q i$J4!K/^JtyaIjw?yadtAe%*!lti&?Y4AaMdAdEb&5b$5Xhn=a#YJL$:\5Fe\&C:D6PEd%?T:yDQN/J=
wZ9K@u q=apNLPnb@q$FcTCCV:n1A+b?F+?5&^p86Pw5ccy9c4Ey&=LkY4B9*6cBw/ZPhS?E:MGt8:=+N/di/+j
jJ5jtI lBC9KbdAwwV<DQh\WAbe56<YTl\iVDFjyP9X4nS=kl+!J%bZtJYX!TuL*AwblHE%pj@AaeEkKIFkQ@KF
!mHZXY PTmjwAI8nC4NNF1DXy<Y8\S/NNKK\hy+D^BM&Q%HZ/d=6MYq$HKYYV8&QeNIZ*a&QM#kSID$eaTu=J$&
P8I+Cc ?+6>@5>*%tQ:V&<5jwY5@MN*N%W<?V+:8Sh*CbW?8&&4ejiA=ImQ6\w6>+D$m@>q^ClqCh\laWd5m>ZD
*4XBc4 4N%*H\N=>I$d@R4C!H?tteaVjd+>:kyK=:P6YG\Bq=!YjXKKEi=4+$#*TYi%6!%IG5<lc=!n8>8pjMP*
t86<EV TdC$hFV$Lj8E4Vue:/8C#@$E?B=A5H?Wp!\9ke*>ZueJQP>8$K+6*$uXj&VX9@KD6jhEIN&wMKXp&cyJ
V8<!Ft YX8W?*\ID%X\>pQ#<+^+yY!j%Vj%blSu^e9iC!d@n#^uD!Lw=mmi=9>w8&8aNH4D=D@9ZAi\ae6aN:+!
P+F*Id !H6^Q=tw:SQ1ujj!\D9/d9M=>>Yl\9PF18>9:\EN>n<F#i<B#l%jK?+BSbF4J?=*5^&Zb^p@^?<BT$%*
yiPajH YX\?LY9j%i<B$@*&*\V8AXb46/@G:n::HP9eA^TJP%c?@C##&h@m?i@6TjQuM!ZF!admw8?Ve??N*V4!
!#$m=b j$4iy8#b1&StFiWhPH%YPnnj?K=dMuLYh@Km>/qG!1FQ:q%F%\ejnduLu@#pZni&@Y?6j+$#W4V9M6j9
d=/tWL Aew@eZ5!QLNm!lTXP=/!QY*Rd?:+ea#H@jPJ#K?B8<>W^44Q@&u6@l?ikcDYqH*FKw6j*eZdqBeXR%eG
!i>4p# muMdl&?WN>8dYK>9hjeH9ya56V^k%<L#S:5YMPSj6Y5b:NVqJWMCBtCuN68Vppta9KStwSlDw5TulD*u
Y%$$y5 GAhTMMq&mVw/dJ6TEEHleae8R%<TpZ+eACq>aHP\DaScmTCBKZVImhAR8RKimPqypTlkuQw9bJe!EpSK
!>MB=5 ?Aip=65\kJcAwuHC\=M8dGlX/yMY\*MW%E6AH6GK+V%LpFEqIYX54#EDtZF\d9\?NAtJc6RQK9%BFb<\
\l5VmJ CRua+!HuL$/VILHnNKG/6+ZpS!KGdhF4LebLI4pN+ni%$TpL^P<FHq#c=dMSw^6YP$A*u:$k^RD!^\Ft
w1F9y$ LAhIyM#m>+RqnNLV%hhXW5X^jFR8pIAtF1j#&d^b/IkRuAIljQI6KB>bcSGw5mwaM:eX+eZBTH?Nu!^D
J*hAZ* Pq=Nq%B*C/8JC*q:lRu9FA?uKK<RdiYSLkMiJ1YWZcMInJA\eqYZ$AwIHqZIuAkBNu$LP#4P\RyQI5h1
9tmcb6 HnZ!CC4E\Nbq6hje5\YccPm*LlikE8jwIij54bXbG1=hX:akKj^C@V!tuCtha+ZCQqX*4%/+qPNhi&q+
u/V+IH aHdheKh^dHk5mV?VMC1D5EAR&/k<\ZBac8RbQjKEXXc\C6W$i?:BRnEX<@BwDi>pNj<kH6IwqkMiPwiy
iLEh!N QZpF?D%KW$Eem@b&EE!hN!GHW1AQEGkpC65iLC!Ww!:YuRE@ME$b^TM4L85mS^8bN$#VY*E=QE&ESt&t
>9AYlb nIh?heZH$>5qL<YypY!%KkmK4MXc1epb4c=9RZ9!XPL=KeC8ptuc>TP@59E/qKIG*H^5KV^1>qw&$wRb
wC?65q y:=mA=DXIkHu1!Idue#Ndn=%&ujhmPwuZ<e$jD:5cyJHtY&V\b:nJJFjSEn#TdLVkbtpS6tabFI&C59M
/imQP5 tCj1$Ec=ic&GwS5L\*XMl#!aM@C6bmS%H1y5bXimWcyaV:=wblAS#q18iQWQc:#FBuX4:bjEe&wY?*Q^
nFN1#m <+pX*HbyBRnE%$yYat:K$uL1<aG88Pk&iLF+\VbiI9XXY?&&bNdCEm%%5&l&NZkSpCTh+mNi5pTC@k*A
CyjXHG Y4Zq&TeLu5@Y=lq+ZS8JplV>6^T8IYXhbZN4RJu9hd\t</Jj+tGESe/*k/m!b%@wjmF^&R@8Kubpaad^
KH<iJL #+miLJ8Z1\&d5#DBn81!IY+K66c4!eekJ&T*=D\4ujZeJ<k&W#>c>w=4u:4acYBGtlw\Qe<jh?%a?icm
pBJFk! S\1+uHdi=!<j&TcqelRahRd8eA>5D<^aG*^h\k>>KTL*6w$kkj!JdK$wK\cNkH@<*n!^F/yG%XqdTFIG
5QqmBI VAaTlZbW^T&5:\KJ+eGF<1pL%nNc:V9wSSm/k+8kQ&BKS$hkXTc:Qw6E!LByQJZV@YPJW\CeVV+YyYcI
eQu$N$ jceAT$4$Euu/h#EH!^+m=d$uMHCTuF?R8%PElHGTnhH<4SytA&n#hVb>*hEa?hR@$MmS>8VhYA?G$jJ5
\*lJEV $n!B<%D%BLLY>4y>S6Q%4\?uR?/1wLHH#iV#MiC5!j=AXF<y1!&ljE/BS\9<<hHWXDZTN/i>nJBP8#5Z
G&y9tn #i>k$kRe4Q6V=dBIF<Em+j&kJ^18/KtX9Z\t$Xh<nJSmpGGeqSAN\S4PY4&!JYeNVeem!a/t6L</TAE5
#1I9F@ 8T*ZREqtp>I%SnMEiRhHa@4SZ8uAp1jBlF%u$AnD!b5q@@w#9d4IXLL=M=4WqPBqLNQ61QkDA$qp4>Hq
qC\*w6 EX94RldmM1KVM1N+K%&5jVDuNmAVN<=AYawYS%SM$GRK4X4j1SPWan/PT1Dd:9@qPXG\SuK=91YF^$/B
ZS5DQ# =kecmjbI*C6^J6PtuBBewm+bu1CKZiBp*<FT#*C^y@MP4ICpLRaiqYqI&Bkjj+m1jtSGyS8c%AIh9=%*
at^F@Y ?Mn?8/peMAXwGF6jB<bB^ZWpD&yiMQF/qkQ1Tb%CtEDLtIj6bekwuFup=ce*FX=m&P*Lqk:@jTd6JZR9
&?jF$1 *nqam$&Z+d%$4mXnZX/mBJEw#4Cq1&&/W8GE#nw?w@D5VjZEdy5BqS/NS5FXmca%4YRt+^8%TnWm#SFc
tVL<IM @Z%8lDCZSp%RCyhJSJC:@^\J9GRS4^<#!\>+*JMuM<*ik#Lh1/+I!Yw=Y6PtP+Gh>qnpmFJEi&H=yl^m
lptIMy $!CI*F+>Ett>bBTZM4i8=<t!Ribl$&p!:!jIS@cZTY99ydnVchJRWAk#!YLn^6?QDbdw:bdY9/^p?mLS
N5Zt?N >I:WD&BTkNWHHhAwEtB>ya1kYB:XC+?KWdGmJTZ#%W8:nhDcuwbD+5B<Vc8e&HltN5y&46At6\/BDX8G
$%V\tl n!&SH!=q<F&\eTRlS&yeI\5bVXnlHEMb8#5BndlPYQqRDHy18A!*^^5/YSpiM/bG\y#FN*EPtlS56H6+
BQ*5IA mLn\SuD!?=/9^nGB/9kJ=Iub4/?S4+4LHDTGu!NL$4cnX5%pZ!:K!64KW*CZyIVYyeJP11bFY>bZC^%$
/l^Itw yRyHSVD^J!hKuCb?!QeJPnQ8H<HSYV^AW^qbC1EJqe&6X9/Jy4aW\T\D5q@lS@iES4*=\G<chZu*4M88
-AB*Yi 0002f809329001202b4 Page 151 of binaries2.zip
BW/@Bd uMVe4dE1Iy^n#KK4MiY$L$%ahPRhTSec?<y?85N&#pn5bW84KR4c#P6V>it*em&GT5c1VB&qH1^ELHV4
<C^J#@ *=RadP*RQ?SR=cEt+I9q/GLMLm>#FT1YVBiEIw@B1*#Vk4/D1+F!E>wJBI%y9>QcK8uMRhk\DT55B?EK
DNmV%8 X=E+B<b9S@Y+StIIj*m#QXbF4dd:LReqX%iGyK>%*NIAiDG*&B/%\dmIaAeplaP96Zwih#uM+!q%^CYC
FlCmtl 8F%c!QXNA1$kT>NPLdMFb&Ru*CVlA1CE5tGFP*dRb&!CmlbMZ=5ueVGMNI%pcHBVttc?$Sy4!cA#8J6i
NBuD6C M+SPqR+:yZ#TZFDQ+bRYe:kZJDVC8tG:<!G96C#Q\GA$&h\DB5yKa&mp1eQGcnTb1&B8HQL6HN&Jnd5u
$uIWh# #^5yAQY%5c%iNKR$8!JlJ?y8MH\F#>$mn9k%E>%H%je6BQ&lE#b:nBLwu:4=TE=&LJdVND4>1Kpk9a6b
hS9R:b *jZSP@j6jCEwBTQ&cj/$H>+ew:9/:n!#DjukX<<+?*4$=VNpM#im*qT=iV=Y<hl^9jEi\Y*=kA@eIQb#
cH>Yh+ 5^?cJRJHYKc!\WnSR+#>Q!%e=D+*%Li?j&GNF1yt+jCnQ54A1?SN$tVI?B$kb\6$XTN+?RE9<9%8=$F+
h/Dh1* +#J>?:JX6C=/y$9k#I1Xq/8X9?9^XHEAyHm5hZP<tZuQdYRj1wC+u5C&bN>=aNb4WbbQJAG98jc^9e!1
%mpuR< *AJD/KaH^*P*P&:<8TZ1PMJ\6^eHth^Y4kpYVbEyREkB@M&*%GhQ!u8LQAmneMKicKEmiul#4w!l<!!t
5Dk/J9 u%yK8RY\<1GEX#<&5I+b+l6dmW+j1FchYBq&KqbMptD/QKAaF+ZlK*9qD*Zjk+N1G$RkS\m#qVIdKJSi
D?cC9E dIGYL6aBe5EPWa?SEeMT5Tk<Q&at&BN#^Aw??ew+aRpMQihET<knQ<<Y!nHiE@/mdLN:<nWdtk9<Ijcb
K%NukQ /t^RFm5KS=!XZJ#8c=T=5c49K5bu19PVqen6TD8/CK#k%NTSck5#4!5:G\^HJQR9C8y^RnaBBPcMIk!M
6c#8L# EwmMMmHlE*yY5Eqay>uBM+5MdEP?T+bmLlIImX&&J=HanYYSBNH:LBmB@k9n/=:G%!Qa4Rct?neYKENB
<k8J+* /jGh^!StJtT=<!SW1@b&WHGc!EEY9CHj:jck+/ewGMi=6:&\e&&MqS\Kk/p!KM8\D69A=kXMV:bk*Sc#
HR&F1K TKC=QYYajmdV48YSE/6n@>a8\h8Ca#JpN!QH%5F6AdJ>qwc#KA#y&=HKN8b%t$wWyKqT*ctVJW?d9Y1$
a:+QnB c$=V\^pKIRet6Dt5yXp4A>TQEntMM^JIl5t&HJNXuyuHe4+XN1#aJ:QahGiBhFj5#XFlw%ywi&ND4cqM
AW5ym5 8^&$!W===BmwMC^^6R8lC>QtE*uHTJHu%Rn\pV=S>5^!?$\K/$Q^:=mtjM>1aA8n*PTu#ENGWd!S?jN4
cqT\w8 N^QpRZeMNJtDGLbm\VpDPJIee+=wl9A+C#u5IA:#CRN+jw!C^DJeD996&CW=A1jKjIiyXaM/lm+^i?++
V<Z/j6 JnaXCa%<TRCTPW&SHhD5I!AIFjDSHVH&KApNB&18kIlkdDyKaDP6u\!e&dPP\GQ&b1QHRVF#<tWT<Z>=
!=$9L# 4S$D^<c\Zt1y#?4</qM5eQpmBNdmDTiDD^\:pSuV<<4%:H+8MjbAP\#eHSCn5V4ZKijL/?p1knJeSWlW
aG$nc* hI$W&H@d:8=\EI%m@chRD#jZ9iCBNT!Kk<+wN1JI:enEc?LNaYAj>KBuHRER*tN4#TG9ZPX@J%ct4w%#
VcT/+n y\+1+Bw%u5a=MFSR%=k1pDBQ#pX\=baNNpPHJ8%XMNY8MY>LMtZQXi:eT?d#58e>FRt*YT+EJRE5upja
XA?LTS EpiDkWF#*yl$q9Cb:D6PEti=Ec#^Tb?9uYwbMA^Z+/b#JddJ6$W&qjhHZ%iP::LG&:?<69kT9Mm=F%ZC
L5W#ZG \qEm1J?+yhk4L:6#CGpABw%!WiWFl=/6ImCSDCZlhdtm!+i*TNb@X#AlXJCucMZ4\h1L+S<wW1KDu:T1
@L1byQ b\5i:ddlp4P!yN*ydqIF8$58bT8?&w9Hae<Zywp8V*hI>yjMN!kuW^u!RweKwCwCYq!nXYnh%BE<ySE&
@?!%A@ B$yE8Km\8LekRV*tZMc%5wHDWNNPGtNBFyajd9:F*AGB9EtqZAGCFmIet\G%NCYt<Akwey5m4$\K=iAc
1JIXYL 8jQic=5acZhn/\uydwbaRY&\>cqncXl?WQjI/%?NGAnlPZWZ$c:d/?j&GM\BkI*\>P9>##9%pTtY*D6D
w*i^^q $c@PaWVdaEV?:PjC<*?8u\5QBSjja/^hRBS@>X4+d%8:<QD>#?y:e*Q\@XN>d&+P*pjW>@=LHY:u*\aX
=cWum% *B#@bnIB?8&J<hj@@K*5>:@XAj>*Y+q@NK#k@aQQB\@jQ#4T<QL>&i/Cq@M^cMlDcNAn$N!<D@nb<HI>
/h5Ced B9*k5eGQRaMjRuM@B5*=kC5ML?SjR9M<A9*dE@jQcN:HwEEQ8ML\<n$C#RX?\JmF:#Fe+\I>aM#C>^m8
1wd>He kS+!b8F:DNhAQA?lH<M%$EMPSH!Q+S1I+\Gi<#&Gc=\Q*cF<n?EcJ<>D=@\^ZPQp=u\A@Sm8Qi\l^Qea
\@1!P= 5n*p+<QN<Tm!eZA>kH+M&Z+dW@$bDZ4WVjbR!@?idGdPLu@b\X<j+Q?JMiD@&MFjA<=jR5K9h*?#BJK#
\9pLYj 6LQ?T:\^?d$VLp:R4?D*K^b!e%PA@^yFSP!hVM&ejt*p?M8@j&4M**FZ?C>lWPXZJLSZ6j@XFnEKhupI
#AaDEQ G^<dJ\iID<LGcYFtbM1ta9uT#6L8Jb8LlStdk/8^ncWJt:Yb^/@AT<EAqaT!PbmcM@+q6D/1^iBj$jH*
#9New/ cj:>NQ\htB@Va8:@Y%9<m:Xk:q@hmF<B=ujDH>Nk!D>/S9H\@S>:S9H<b<<wMPe@i$b^e@D<D#!n?Q:h
#y@EpE M+1LC@\*#!n8@/qqFPe9w9$j1jwC&XBiGkJ$^EASI&m#KiRJb1ma5SJ99nw4acTEmXL#668#y:FTy5y<
Bn+6Rd NQn*>Ip!b5w6yw%/:Kq!=my<?ZP&QJpKL%Xc64??ajTuaqDqy!YIp5^Z6qS6NaP<XT^Y6XLnL%C9$ClZ
L^ZFBl 6+m=SZiTNcnY6FEZwE%cCc$T1mC\Nt9<bN?5YiEk<Ld@&L%N*%=DXn:4??6PR\hN*p>#Q^EA^w/cdZKT
98k/L& yIGDyp:KklDmFaDhqBDS$c4m5*eVa8hNy*A@*^jNYE+TL=D#/GZMd=*j4Hk#/=R9CpN$*taNcNXNuL=T
Td9$Dh ipJPLX<!a*XGm9ET#kB&/eL#Gj4hwYQH=?Qd#Pij*ZD:QnuiEGhX9SkdY*h8i/>Rbh&$6Hj%ji%FWaDP
y5miY> =4bV/&4Xb<Zd4<@&8N^lPtKY>?Gc:i8!j*C#V/@*Q+8q6qq6nVd^ANVEMlP5j1kYE^\Wqt5n&9=k5$tJ
ht6HeI &5tR1aVbF+ptM6Xt1!wV$8&w<?NR%FFXkGAka6RA8%@yKIm!a9JY&&:AmTcJN8@Mm^J6KD+!Q:wZqFuB
=R<#dt uA<14&EhCY&4n?9uR89nHE%kntMd\QFKaB:b^&=%y:<I%?AbR&5lb%QEHd*mHuc&E4FLWqFDEJ=IbJtb
bk5/Cn Xml9CbTeVLRqaXPMV@\SC$YVKlYVt^unBpukTeGIV</+WwyXH&+P!Qnm6dm4#Tdb/tuM+WibcW4nmS$1
/\EF9u V9yJQ>ZVWQqA#VBYEbA>N$BA!w/T*TC8y4YadQ6YR:$8D>6++Y5=ZWS@I*j$XjjaDCh?AZ=ZIN/K?^Nm
A$+pFD KRZyiJ\XQ4jn$M98$IaAc:%9BZ6LYtB$bVG6d<e@6XY1<hi<hN!ttN$MW&pnn+#e4pwV+DYn?y!MW*ll
+\*9Vn R4iI^4tn6qJQ\Ap=lPcIIWac6e\iG:^9/9\*>9CV9A%8wu=c4C8$1<Vuyp1RJt@\+jFpQ8tDm1qbyL+h
He$E\h $b<mwW51&E?*i%8$:+h#::tS*Pm%dIFBhV8m5@ml/QZ/kJ6Btp&!t/XqY:Nh:aBtt9!Gq/$AWN9QRq5>
$:q5*< Ku^?Kjn1\^j6bJF9hq4pYka=Y1LYjl6aWSi!=1V5V*#Xq@I=Lyi8u!>hL:5SXLkL&h5h=p=/Ql64?@KY
PJ4Tt: Zd/D+wj<eduEn#L^mkQ*e58bM@i%y<6LSJm$j8/lniJX9Z5c#*KM>VAaJ/iI9mZ6*PlFh+jIi%F*LPk=
YDLDH! Rn!YF6<MPNb>e+CW4dpbwJD8bh@1PVlk*$6PS4m5&Z&LHZn&45#DM+JA9+JbjM&XdS+juj\!ZntB?mBH
NNIijD XEkVHWa*+we1=w$Bp^T<bCLemV>W9klCK<kL^CMPkFyIh5KH\R$ibASCw$BM+pkq?I^YHlP=BEKjD%GN
k$*nd$ AqpC5jyJcPwpbDFR>pPkJ?TmC&<\l@cVGBFbP!qXYh!\$:=w:?*Tbu\:\>$MXAyZWtATX\/Q#tXeDJP5
1/p6h= Z<q!95itLDhmDeXGLA>WDne??!^S:epyMRZ?dMLaJuKY9!?y\WlK:iJliLVEVnu+I>*a=K&nW6a#KYZB
ZlCehS <NXAZYjWmmiDainWm<NRK1X^GpEc@5Q<\LREbV5F/eXu>D9\RSRWj^y?@65A:B>!qPDjV?4@6/VE@&yJ
+cV#Vh Cb9@TWtJ4qC4YA+5q\ItEiayZyJlI%?dPJSI4L?9K>H/8//Eym+SEFYFdnkI&$GdhEBJ#He6BPPXNqFh
djP!JH FK@V:EhdXKZu<HDb&@!VS1K8\m*SV+BVpbN>8E?mVBk8bCEB%h$RBLCAwqlpa1V@huRm&F/1/XJ&:t6u
+>*>SK X#qPE#Z!KJh8NW!wZXulS9XL^pyuNE:E=*YtBV^nK1cjBH1FlRJQ?PRbh1j#K%GXlB4u/mSt+ZEwVDiZ
lIeQK> c/dVmduXP<*^BC:Y#^idt>T\di1XAw#5Y\JE#ejS1QNCZKSkAQP96HQE%%:D\&GyQBiMqyeYd8H5l>Fe
&5R9Xl VcX&>XX1V84p&^IYYucKP9/J:B<W:TAe$F#VE!EF=jt8!luJl<8L^WYbiM&*hQ^&*4P=JeEnBRGj65+y
MFG+q% iy+6!HWQ:5*Tk8/^TmQB\I$b4bhBq%\KG6Tb%=l54n5:#H#e^qSaECQ%tNZZMpj<T9nVK>59JA*cCc=P
S>KC88 CK#MVa/NJP1ElRbcV$d1GnTjHD96pGTEa?q4ZTpVVQAp>Y:Yud#EjVPyKRch6T@jXeZDPH/KPZKSDuHN
5hE5&a 99S+nn^&wA9*#6j!NqSFcQNa:Ri@M!@D$w\8Kb9q\FRiCt*1iVS=JRKKu*wZ9^^8+ELjpX8W+t9nJFMq
C^^ajk %@%9itBmQT>N<?$yQDIjKwV*NkdQLViThYy9Z*?e&t$S$DR@8dw+5q=+R\u+<k&e>+d?mE@%CXHu55qQ
=ch&9p nXFm\51t4%PEZnCil^WuBhTG^=PqZqK5t@AX5WIY&emNQ5N1E+JjQTQGbcJ<5JAq1EW6+bT8ZaI\l!=E
QT$KD/ lKCwEeaM$PN!w5^W\buJMmq@6CXCReV8lpV4@iARP8SMqR\M?WCi\AG%MtdJ$LMEEtiFMp:i\p:#6*HI
!S1Yj@ !blMFqMlcue^QR^8keCbM#dAPLG^wJ^EX#C:j!lkFd&tV&W*/tt\^ZDbMC1=NLD#E^\?HCH%XIBhbQ=m
d&T*K5 MRFDVk?LdSS4TY5?+5KI^tTBFAjSnET?N%EAk^uQb@Zu#ZQjkKT>GbDTkpAk\&iTdj=9E9%9u<9RE/By
FH^*PH !L/PqBPc=ttSGl+nEXIN=^\jRTdKu8HunbqCGBHpCVeqq^%I^wT\M8djEKbM9bCmK>X1&6c*\beLVV?R
u5BXJP j$:m4G&@t!lyqGC/KnqL6QjWbF6<%+F@*A#?HhqBkLQE8K5m>V9A5m/ici$6SZFc41$tVyanD5TPFLEL
L+/FFp Ze$LVy%%$%%?y@=dHuWiY8&Hy@=I9aP:Gjuki9=\W1V8HbwJ^6!/ZE?yZl<8Q=FaQ5w54=cdKD^eE$l+
-Auc:J 000957efc32001202b4 Page 152 of binaries2.zip
Hh>4C$ &CASHBm4utw!L<5tTw4HX+kE:VapWk+ppkFamZ:1>e*eKD/jBLymY$ktdG1>:/5G%I:DR%jqX6QEw^EX
%CAXVV I9pEa5#l19qIQ!*<XG=HX#X$+W6D5:==8ym<hBmjVkIimS+iJb#G9mWdntt:cRKPKWhJb5<:dR8$$ZmH
NkV6lu \tAJe%njEw=E+/85P8p+?kF#t^tBmkJ\WpTJ>nKH9PmMXQtW:*R^$8tITKMM9BaL^a/Hj8n*L@CAYTQ@
u\=8FJ R>PcBBJmLW=yAeE!D^Pb%tX&*^#1RRwwGTQ!dN#=ZbNW$ttE?lKLT8G8#HCiKyGw4$PK$^^/94SZl^Z#
R^^5e5 S<WEFFG1K+^j\e4JGnDEq:VhPd<b!pG*=<bW^P%nat@Y#b6DB=9i#HLMpQAcH6H5NZ%ikl<GC<DC>nkk
!>8BYP M=qhc4L$lZMl/PRbwmRnP=G:cWNaZh+Qe1iELbE!&!QPTm?K1B48$R1/L^n>&$/&KW=<jWXiE*I$Ln<#
&5l?<Z Dk=%$NwuBkhbA!#pM/DZVem>R5yYcVmHd/I+iC4JuN=>I4um+?%1N!RiQ^%8lkC#N*T+E+ntWe%P6YTj
JWK5^J >/tR&BMwtLmZl/QNen4LhKVnGZ1#+q>@Jqt>J<hVRNmA6m\%=>uC%JBKbDiVmD8Vy8dtpwqSbLQSC^tn
lWKwY$ mGSdQj9ei%PaeBRaS1:LSn8c>i:k*DjCpiP=ApY/yW8>RY#\Y@1L\X+<WLnT<VAGmnBb1n<kWd6H&X\Q
6WwyHy e<E95VMhCZbBn>E9NnZqQFESbpmDdV?$Am@Y8kmmpAEQW^&IAP4X\k!#pF?<uX@c4ncB1Z%J::5T!YZc
h1m%Ta bYk:Scykc<hEdJmJ&=$6Zy=>\M@?GwyhwYVD&y6cld*yi@/N#wlV=nb6%=1ERDNSV@#RF#KXF=H^X6hL
w%Gdd\ B?tub<diAFJWF4XbJTy?MRHG/Ce+qA\b?C>LeQw!c^GFyna!a!*tG^1&uGtTS&EP@BkW6wtwhjb6qwZt
L@^bCn bV\bJGqX+<mEtdCSi>uP%SVdyY*n#pjuCW<^A6pDI>m=G>?u=5cS6pe\G8<GKc\?NZ:^AZe^G#=&hIJ1
mL%p^R 5Sl/IW!S45*&/Tt/lI4M$?1M+jCi=c:N+XjjGm5KXyCwD%+ej5dnt4qT#lMw9/qklh&9%S>5^<5MdjtI
cQSLac #p!bm>Ze=RkXy=&5p55nVajhbAScmY$XJ!mM>#la=6meiFhbqRnB?d1m/Y&T/l*w+eaEN#^@PjM>46yC
H*^B^k jVyN<EZ?Het:a!Hb1^I886dMa6ww6i^&^lhC&l>MW8SjX4m&\M:V<uam99GMkRC:+Wt^dt^M&/Y/eqW$
$l#e&? hLnYdi+ud!PBM#A/tkkEIB\96*&Zl8<Bnnnkb4q66nu19W>mi/NlmcQdy%FH/lKFcJi$E>\wVC1!\:1A
<dm?R4 hTp&lyb^jYA%BRI/?ZuWqLB=@Tk<:!Fm:CV4ZE%qam*m61t=d<+\\ecBVKda4R/V/m/!^X5YyykDYaVh
A4CL5N Rq@4mXjtFP$>EAbaPV&p!uZbk*bStnFa8Yb^YCSVjeu>8\IW/N5JDpNA61Bp8VJ#4PY8JCIKGXwy!n/$
LCAQ\G 4en$&l<F/%*?>d9VTt/lbJYJAZTM4<yluV8F1+bactmqcJFtWutYJP@:=5wS?+FqmeyMWHkWcA9YkT9W
uF<lMX EV$/m++1eeTtqitw@YCLw1tG4Tc9XmI9QuwjB4WTBIZ?MA1mm^JXVV=m<ljNjG<JAI6*wppDMBEq*qp^
LlL=ME 8R?Hb%61^>W<Bem#RKPRpW+qRMDYyyEhGISeyM+y6QWDRaX%ZZkFJR46kY!LD%B+^wADiutAZBX@E%8n
mbbkJu S?u1FM%MVHhmDi#8lAuB6>NaLaZ/$dKnm?%Vi6qLBEByyMW6u/nRFl1Bpt<JuQuJ/!Bb^CL%*P^Wbbdm
*@ZWiC TKq%i^8^tHmeAdN/Z\8:IZ1tRDw<KDZI5q@8Dd#N$IAE?m=N#&l^KI%NeKT/W4AXqGLh*pplK$<X@X^b
ykC^u\ 5b!SM8k:>e/y$Yekn<%iL/ewNq!:YYHJ$$y99>HuBqN8?+Hipw:FI=\$DNkMB=NVl^^!:R16N6E#eeFL
@##a8L &a\K*FCt%8^y%B+%^KNLX1aDGBEZcN\\G^\X5C?<HeXC!<wBASAy9m@wN<mScpblN%Ey8Y/ncNh9lQ$X
@RiN%: cka4aL/bHT:XHcqD+jRDWllBF+KShL/b4wKu61ZDBthwyIIlCThLIH?!SwPuRFNI*Yp+W4bA+&9QTl<N
J:=mYc SI=9y$>n4RbL!c\m=J%#R:P>/MlmLAlCEK@*cwkCLeC?>9*K6Aw%!C:%IA$&1<&hC\bIklWtNnGp$EIe
wX56DM Qqke@9wbau@#SYHw$Sq@*%!wlT:D+ACQ=dw+#18h>e<CjjA?pTtWl/IkBnnt+e<5cD>phq^pQ1:LW6p^
&EBt?! d1+naw+*weI#S!BNDX8Aw%Hl#=iRklT$P:8*JcXmcK5D>5+D+EyDitReVW4#GT/EDp56^DhdC$^ALMHm
:R?GGA Y#K6bm?j%aE%WLZ9^cw%?u!yZ%bVH:8@kL:k^k/?GCG=LP8QiYqQq/eMFV?/*A@6hZGK1dVcPbq1H9!A
e>%LP# nq1yVQ5<m+FMmqE:hBhdiknyZdlW!mCaY#YKQ>FJSj!aPNBZtcQ6XGlB=aIw8aTl8Rjp/<\REmVNXJ<K
FWTyJ# RT%mN+>n#:P+&5iX4&MaWLRAD!^\T?*8ZH/N\hA%SFDBuBuYu#qCn/EL/$+>KP<mNYEX\!q$^KTCILbK
F!KepN jITFbI>mbC?+Tu8?!ahYWK!au8\YeQNK56&mD$aQ8m4HwIW\l>\PmaX@1XJ%XdmF^#V?cnmX9S9d?9JA
*8m8Zn BXV+ShSIlX9h4%yD5n@&dY$lY5qZe<M?=YLqD?DAXEuhd6cn5KHwhncp>wS:wl/Y^FmZ#cE*MJ&tBy$u
kaEk9H 4=C>hQhTh$:wZF&uDBF/8TKQ@IyMiRF:i=X9>P\5qBRGN/bLBPpAY!iyG\1???NRKQh1e9EVt9%u*D&J
hdhF!6 dR*n9Im1+:N#hR&VGCeiFPQj&I>iG!KR/yp@*+EAhyK8V#EmDMA$j85>inbHH>DPTML*u^&eMIbjmMQZ
?:kFF1 Y%59k1$BHKdDHNM@\mju\dY=&5#p>bbTy>JPGC+5j4Na>WH<=RX4ZKD8i/4Wll&9Sm1I^qV@wj!EFlbT
qL!+IY 8F%n$@qTM#%S5*Y+@mR?wY^!eBmYBY1&a$RBBt1yBY4%i+t9dR1G:\>V:EaG>c*HQ*AIYqQ69ADNiDk4
<N#Cqk FLLXn\HM?Kb%8NilHTE>lI\YF4nXLdGjiTK!Np#Q^iF>eC&>jAHt^cER@&I$:&u9IcS?S^i4MPVNwG\6
8m%K\B $+Rm#w6BL/SZR*aeIX>J=Wi?C/cIRRnh?khc\\@LuSP/bP5$QSqQlpIPDBD4k\i@?u+L6eiNBneb<V59
EHP%Hh WPJZcwtTQwua%nyNQVIYpX\9SC8R!lDq>eJ\Km>TSRwZT!:A6MS<?ZRjS/&j+R#lWmjA=I&JDR<8kmT>
uPyMHl t5Vu>e$?PPY<CM?<HS!YFpb=HkhSm5J9Dhcnp\w!6Rl5G*yF5AGmMm44W<wPtw:ty#4IwiD1CY?pe%+^
MHnTkN j?mYN&<#4<M%/K%=YqA1c<Bq6R?9ywAVw<duVZT&W#&#=^l=#=k5!@DXmWPIbBB\GTS*A**!TmZCFaQ6
Gnd\*d qF*\a>MHL*^nuGDp^inpbblNC?tPWhnR9phEq=AJPVGIaN%GTZ\##th&5@5&9e+B4>#a9j5chYp&6@88
mmt=d/ KudGQwqF=juM6^eABK@:&l>59L$M@qHS#e6IytRl9F6SeD<tey?@MP!ZE@yQhYIRJ9/lVp\p6^Nc>n@X
MeJeBj mdp^T@c\VG/^AS1>V>4+ZTetyiXN!w%j!91ZFGKZy#j81Vh^cZ!^8H\lKSTn^GqS1i6R&LTpNK&$%LS*
PL/w$I /bTyTBRB/WcyAPK8VL/W6JcI%HX@9J6YAE\yu6dmY%?a%J816MYeNPKYnI%#pyc#VC**LL/SNCGa4I&!
lFJRJ^ 6>y\YeSDGZ^^/YuH:+k9Mwt@bdh<V6e1iZiL@\=G@P&NS<=mR+yHWc:Y^X6Q%ujy/Ft?TuuyeHqLyBpp
\6K9We V#MYt>=6ZBT$/tS:5leRS&YpjelI/!t<ST:WcuwLWM4\iJ>DZJFH+wZE=%/a:yjGL=#qGbc=?D/>XVFL
dq=Z?A K/@Ew/Yp>Y$JZ$Pyb$4JpppyTWPbh9uV&/=!@4=!#&:m>Chq4c*+Y6XwT+5X4b<1d6jSP56T?Qe4Y+<4
lLQ>Mj d$?j*hBGy%>QXdHAmBLS!=wYhqh1mQe*W8%!&TJHm!HGJ5lH>aK<8ERVpA$d8!F9Nq*tQelb%8QS<%Zl
Py5QY! AcHw^=WQ#DH+6<#:@:X#DNlXRSTeHQ?=YM\@VDnkw@m4WQ@juZDA#eu^Q=^\APd/=\pHaNAnJl#<&$TC
lhp+J+ 9?ac@nGL\juQGdN@c?Ljq:d=e+KXt^Q$GDVQA>p/V1:HwLpjRwMjk?b/CM*>GDVuR&nII>De9J\QwHpi
Si!\j& k+a<lPb>DQ1B1RDeuH#@Cl4E<Rk$tP8B@C4wMX\De#=$:Mh\na99IjSn8MdF<^D/MX#:ub:>M@w^ZPQm
i&JL!K ikn>GK+>tBEHQab4IN/H$I@lGkkEiRD>GK/BPQ+<@aKd/#Fe+?S>CQ$a4uFCHpI@lt5QVwHk=uwM&dkj
FSF^y* i1l!Qay5uA@ebF#e@^Ic<m?lH$M&L6/H9nj99+Vt?%jR+EiS:cFAB8d<l/pA@+:>4/aC@K%m%F?tApB+
MbWd*F @#AXAA#/R#44>$!!@%>ae4j=@\>L:w/Y^*PAnNjGyK&&%VapSXE>i>?F14Td!=ll@L%@L:R4AWy5iW/T
N%i\ai B5K^9CYNyMbc\K8T$#ZCDaVV*mTY\Ea4Vk96K4W:=>1::T:JR?<GVmFMe>np6TCnHlRZ!/A?A=eb=!NC
1:i/#p YYRywQ5X!QAT>NXK9l5C4JNkK/IRGKGJLmqHG&WGDpydK\cw/QB%$:!5bne9B8/KBLlcmT!:RZn&4dW=
GDkE6K K!jbn4c+YmiWWAGdm&FEJiKk9iP=Q%Xdib+4@piYtYwyKDE4/y5YA?1c1C%MwJHRAtkaXj=Cc#\X\ccj
W1WD\^ naBB!VARduTHEkG8Ep&kYy*:lMhRGIkRXJqRV95/WndyE4ReQ@bB6H$DwR>R*%$\?4$V8YE&GRkVlR>S
i+mc@6 :ewW<AlB$V5Pqwy+<?*%Y9GMI^Cw^BGB^q:Z>#+/1Kdhi/%*wy$%%>A^?DW858iH\C/Lbw/qL6dd=lZ?
qFB9XY =VV1I9aRQHXFJ*ym*Yq=IRitYdi^Wj\Luj+6Fl*MDVn</!:P4&&TXSW5Z1EDXZFERkLYj8KyVYiC4mdQ
9E/iG< %AWti9C4XR4>B:w8cY9dQ*+@Fi18clyib1%Ep=utS^MMFi=AY>CXiE<Vi@G$hkYk$mNiyJZ$SCHd1My:
mJ^nQ# AnJi?+1Iu?q%lEKHui/pa@CFILK!iayDKPmnpa%p#\CB<Z/?tPPZBq\$khWk\/AITV!?yZhIK6w@CGKp
QI<t=b F:h/&KjQAy<pJ4d*41W9EI9GWmC#F?QBm:euTiiGC=48T^YjB<Gyy86S9&#Pw15:Wy$=G&WGL1bpK%>?
CM?F5Y ?5W?+cAK4X#DZhIiT$ik4T6PCL\aC5H:iG%pQy@1SKJ%1Ap/Aw5yJBlQJEBumhEa!I$It$kXRQmD#:m4
jACXLj 4XTpMJ^W>JXd&IkHbn6$Hu%Wt#yp>>u*l9ul:=SEDJLF*Qpki9+KI<ak6nAEGyF9W?<MStG<cpy\iC*$
<w@h?R >ZJylFph$PPEDI*j4jN9<J8D!iwkK^4#J8#!#AYR:M%qdE4?n%wYuERWq+bQ+BnD*LL>R9tDm88^!<ZW
TGad!H n<#Pm:4u!PBR/!XCY+typYp^I1ShFB%@I5wW6IWd6<=!Gk=y=^K:uFAI1e1K4d<qu:AST5ECM*!PcuyG
qZTFFw =Z<qLKR4%JuQBM#nMI@eG8jcuaq/S#%qn=H9k>A=5$+!lYW>8pABpbmaCIAc!mkMFjGWy#51TKW:KJBp
-A*>DY 000340b8c8e001202b4 Page 153 of binaries2.zip
$R<y^\ MlqJWYeAlHDCt1%imN<1aIH<eaWBP1kF<CBT?BaBaV>caFDkh#nwT@nwCt!EGVp5aDeY*9n?tlKtBELe
:u66pY T?@<J#eBQP\$N%JeW8hynCw1==VRdNA\49<4XcTTM!K+@P8*NKm6Tt!ukW4W/%JRBk:Gmkdu6yD<qRVh
>VehE8 KJShbP$!%@P*PZWF\cm8IXR1PF>*nL>LMtKwW:tibM5tcTV=:X#YMq\>WYwhFctkjJ=>XcP=aCY5ndqa
8WhWjH ?mJSRD@m&yW>DH&J/HaXS+TCAt$P61KPA4yB5$SdPV#Z%B=?G!a1@?16Pu4e?%khySIQT#+klmldZZ@^
VVV5>% BN!pb$ET^b^WX1uXeybn=Nq#&DB8\6n8l5c>>JZbiyiJqVNX+cnkyjL#%i+S9d1GIeaeTm:!HS^TTphl
/6QJD1 ?T<T6Cd&wpk8GJYV%ZGMekEXl/WX<>=hR1nBahpp%L/D1%?wpt+4hA>8Im8b94R!h%mdLVAk=AS@Yt=A
BAlkyI 6M&$anZ%k?K4#p/6!QRPBPJ9SD/Z?ektuGTqYQ5h!V><tVA%qhGAJ/!QE4RcVDk1ZApS>kyB1I\/MwFN
VuR:j9 aPdGSRRebCZubYq>JWXTL*5iCkMudACS@#mAKG/CR*YDpFPEA^81F*Wt<D$S%b%mHhqqb5Fe8qe1AQmy
\FLWRY 8Tb^Dn*IeZa!N>lNFJYDHMEeCXnW%T!E\%VRLq\8XL<mpa=Cb6\kqb4:bMPePmDyWqYe:!p@$i8Z#9d<
uX%Gyl jMI6a:lG\QQM5*=@#wNQ+#wIL$PXw$M^MV<MEQcT=p%TB*$W4:Biw=EllS9#uyaYpK@u5e/na9Pa%CaW
CI:Qtk RW!@%Jue5bhBtEV8RNp9wlIXuXd+RJ%#+Ji1weQXlSwFX&15Yc+epCZFV>cWjS$jLl6t:!w#^:Q\pt$Y
D8l%*$ p4GhdQ*b>pBVJVlV!BtNM/1Mtbne+DL/1XWGLbFN9VA6CFTVkNI9#!K$n$6k$wASKENIeIFTwZqA9j^?
4/Q86T ^/61/l=@y*D!$$=?^<q\a%qTDD!uuSBi$iqA\/GLtRHnEN+/9bQ=!:NM4w<+hkW6@a1jaim#l%Zj9Y$b
1Jnd$4 lT$T4wE+&$\ECJtt!tI!<p!H+*>$\HPIy8XpWDu*keImCEX:GGFeEtFB\@FFGX!Jhu6VRE4c:GMPaRa5
Z@/S+j +FeI!kA<>%DyhH?<HGuqdD%b@ncCh?JIH%WV=/%\XTqik<+4emG^ETh%Y\/:k8?NChK/hiGdYI$TQ9kH
FX:K&Q jeeY?II1=9FWh9MnCnEhdKmkC6aC4bQ@i=^QSA#dlqiFQMtP+*JLe5%QQmiq==ap9Ip&5y!T6*A^$p\p
?k+TGk <Rqj:ePC:SV/Vp*Ca+t<wbW4YH=5$PBhM+VRS/SDS9aFuFGDD+TjETjJj$>yJG6c\AZHqTt=H$n$wkGT
9S^tJ8 @uNR1BV@:BRByd1?hMjwR/!btw:<\bi!EeN1PGahK#Smp@JWA@w=F/Q*L\1GbA519SH1VXt>*cu<Vdh1
D65\wJ XcR^>NCG+#AX>Q4Y4aAP?6tF?pjyBna8M<P?w49\/y8*FwYZ6h%V%tY<qXK>J8dbXbniDkMuFcMpI#K4
qF/bl6 %ZKyNcH\NVR!StL<S1ML&tmC+4Lk41DYmwN&A?D#K4V$e#wbY!6iM=q$P$!b&$EltkJqGkAW/TZI$HVV
a^&\DM N?VT=ZPnlyk>Twm/kTSVE16VncVFqkXTLT4c6?y!\%J*%C$en8N6Z%>lhERdHS1:/%+=B:qE/+K5=Ym1
iZQ98c Ma=d\#*@EnpS^!QQYLn+iVEJi!DK#*/mP<#6>nlenJBtWc!VMKE?NEq4yQ=^aPGWcciy4pMCDLQCbVF9
eF=jHM ZQ:16Lk>11p5T4DaqXt6tGtpSWG1i8tqBLC>yle/L:M=FYewmwnZJu=BpE?tcGcq9duuJRwW/?\nRKjV
R+pyKi Sqt>!^=&Lw\k&D6km+&5q=m\XSI^\<Jc+CCRq\@Z/*FGwZ/K&ti%d88$*w?^CtTbnBXWy^BC*8a%wbFb
M?db\# b*CJRlcbD5!$1I=$6=Llilq+C%>Dah!>:T5EFM*N5*#%uY*eI$dp?<6CZZ8yWW5m%e+R8Kl$T>lX!iy%
I<@eIT K*lPa1cQ\B+p@aNL5e=5%?#h\e$%c4uE8P=N$=kMC4b?9\QquC$d>l/b:@T?lidGC+w!uMXCMRHpE9tG
XhK<mq :FTZSh6TZ+YEmiWh^CqYq!tE%9IVuV8:$S!@Bm8kdEkqD#C>MnV:$Ra5ZwttE^9$qwDjqpC@<#Hhb+4K
/ttI6C bI$cZ\Xy&$&X^yiDja+:b/1?d8ZL^KCQWFh55N1?b>&D*XRAN!M65c=9P<aqw:G&a6mY>lW^1dN?IpeK
%cd!*+ :/$a*T#nq/qGmdYYKwpeRA+&InMiS15nll8?6KkRid@6nG&wQB+4\wc=IM/^n!t#F:>N#D$kFJ$9wY>y
YiYidE ahmb:1PmkqGInnY^%#8InFcDF%4$DHI56!=8*B*cHEtH#m>L<8&nQR?w$*um$mYTThE&j:!&didCkEZM
dk+=:# Dt**CnnR@?%IJAt4jy1hED5l&Duj$It?ic8*6DNIu46/HtI<D/piu?hpaqN^eAZmCySPuc1paMil+$\m
*Y+e9H aE*M\GMVmSnQ8a+ewBWaP55:?clEe<mtwR$MaMTlQ@9e*CbtX=F:V&D4+PWedNk=R4\dn5aXI\m:kiCI
DH%yn+ ^Y4aP<P%JlwD?#4BXmkaybn4e6RWZ5>pL!=:\emWXF1WQIYcjI/Xj^#aPh?dcMI%I%^idpK9aLjuLB%t
d94KHw 8B#SY^/=!nap%anZ^DKVJ#BJE^kDt>JD@nG^tJNt4+/nZ&SZJBdHFPpnuXLRAyM>J#$5lMMT1C\PMR5+
QQhi9D =>8/Q5/6Bn4=WSuZtp%C&\=n^V4:J?Mlphcl%SM&Fw4i:Q6R^cn8wQ=AhERL#a?^N?ElhPGKhPQD!wGn
E^N\n# 5w+mnKBZlXJkIe#YWVPS8KyPNeX?6jLIH#8t>:F<^M+@ELDJNHd<NX*\:kwT:+8kYn8S&t1b&l?9I&61
Q5<QK+ EA<CADY664GJw/+phmyTiu9I5NVpa<k8YpHucKh<A89Vi9L\myhX4DKZC5Fa$?6VW#MwWYZiddIMXtI!
&d\IcH /5d#iqcXpn8iyp1WB9D!mJ!i:Y4Za&KGCjqGTLQ%l^I1MI^4bHT:DabKKJnh/6X6NbNEQ6A/AeWF$Y$@
NdQHAW WR5p6a8pF*FwcEY/NT>JMcF:\:m/>p!4%y^WayPMwnNQMFHYMFY%uS$/=>Bn=!ut9D46MyQ<9X=i#mkT
aSG?<y m4LKwm5S@R\iQVwV6FWSnK$V<w\Kwh<VRwHh@lLcdYT<bmdXLRpJji&cCI<Mq5A<+\6+16W+&Dw&IZ1Y
pKb$!y 4u?YbeAS8a%l?G=wDpdIHQk=twcd/JZ+AnTeB\>YEDK88+el\yYZ=5ADjKbGhLRy\8HPRtG5w1/kT/@R
ZaTa=E 8W9F+WFX!MwDwj>G\@\NmZ<iB<*pCEpwu5+pmFLEHBpHB=l4nmTWnYRwlAl4@n9*EqKJ$VtFbnmM6L+h
B$&cyF $w%XA^Am#T+F84@%?Jdn!XQk$hXKtn&KL@VqNW@Dc@iY%>p9QdNHmj%TeZtG9J4G9L/Nau#4<P^Kjj16
YStBRE :<&*DY?ihX!iYT@CbY<KGB?ie=V5Mt?N@Vj8QY@ti\EAMhIeXZ!Nc*klGJ?W#>=Nm:=CAH#l%1jj!u#Z
$RZQyD !@\$md$$:4$ZKQCF:@%@SSelMa^4#kBiH4>4^IAF+WBNcd>Z<u+LeEG<L#^T6RKd9u8>M9LiTQQujSuI
dqBZ$J K^ua6Bb+dSL!/yq@K9y4Iu^9*1ARVT4Tyq1p%G^+#RT@byk\*!<?tnZl4\JCiCpAMNl9N4C\AYE?9EpS
y#:Hd& 1i=9N8=>NZ9CAVDl1Z!S*=djLQRnye=HNViFN%Q/G5JE99wR?YwpluDNS#kXt/nGb&HMt^nXY=M:>ka@
T<XuPy 46p^ltk/uw<&*wPGPNW=dyGD&E@NF#CY$QI5+Wa+pYIWycp55WW?<Waymb4V>cR><?8QZbM1l%qawK>N
eWW:GZ ym85j&t584@eVy/Y+>DW6tk1@=WJqDw?#:mdZWGLp1&alae@H*L:FuKjVC*C1tYXNT=Q&TTha9etbYk!
YnEp@p DiP%m%*6cFykJuX6upptlaatHdEt\nhn+Q^LTkyL6&@P:8/9*heNZ9GE9G1K^8TJ4?GyiE*+Qy5jL4^y
ni9/\i +A$J86eNeRL9y!DCXRRAa+=tm1@\:^Sb#wJ:BNF^uAiMq=A@*m*V:@!a6um?Nqe8#$b8166V!4ICD+R<
pRT=&m #VX9IbkC+dJ<pyjS6\bi&p<L?DWKWwjmd8&I$%pL?h$LnMTnq?T>Tb+Wc&9q<$jq<NMlpCRXi1aXLBHu
E\aewT L6EZWq/W<heX64+JItHMZYLMI*qh%t!T%<1e/<qe^IeiT<KA^M>Z\Wic9@Vy#Y%H*FJMyieTA5q^ZQy!
/u<\h+ yii*QE@<uFh\<SuI<S/5&Sq\*qw<Z5VmNT*mmYp16RK$um$cciPhD$^RBuQ>*=C:iu^!Ck#?H!cuiDn?
@8ZD:w PVpF+j994acFRQ//CBdC<\?LaQ<1n9&V:QaH1SMM@1je%WPmHiR^/AeqQ=:HwB@KZaF=H+MG<V&A=96Z
@Y8pl1 $N\en$A@tH*m=u\MG9\RG9RaNPklNNen$L>>!9/MBn<G@hAX+?d?q>CQ+S4ZR:pM:5h\ni8lZAd*a:kG
*64pXF +u$kl<Q>GK/BHnw&=DFeA+EjRn?Gc\<6*?YGQIb4D&cjII@l&wQbJ<ln8Qbk>ku!GK+>uH&CRQ+9Y+n/
V8Nw^n /+yAjuEb#MFFAju%WH:EKppI#@@S5p=iNn+&Lp+?Q6/@L86We@/>1QQ*Cp+NT\e#Nlh:NqM#G#MZM#b#
lWG*q= T=6j5ib@64\V^MXF<V8M@Dcw+PdqiFVLij<^1jQZc@BjJuZ?jWuuZ=I/jB^@TPyA?Q/R%AH>i8d>9&8W
B+?^D< @njZKMqJERV@@S1qQynm9/%S!4Rb:eNkGHkKkjZT*&#?a4KC\A4#%^XCDNW\+ZeFNMLXXyF5^uu\CI!@
15\Zj< P8aNwuWAQW/=PFRYJ9Gn>Rt<>#tA:DN8yY=@QA^MXQNb944*C1TNFVMuG<H!$CHCByX4/GmNu>Am+RS&
bCe!w^ y#EbtFJYFR6NyW=GEGKW<iw#B8=k>*FRVpV<J&Xd*&a<Nd#5aXC#p!yHISNn?D1yuCWiL^WI^&YaaJRd
:=q4SK LDReBM5^^SZhRGFCCltVNTVq^kNw#/l$bc6w!YGNHL\F=1VcFFRpda>^$1k\RNpRKB&WthCq^KAJVBHu
#8SEmA 95S!q<!$nyw5%8RIt4m<^1RLnqnR6>#IcDcWa@WP!tV%C=yKqEH%&jP<ECJ^YS+EeHd*&qRWd86pI:w+
cQ#/dH KkEC=\<DhdAhK@\5B8+dStYnSDNB95kt6j9abbT&inLyTjEDE9$n6T6*VabqitQ=JPaEuku<aLFbFDl$
$@<$&= yYCwW1M&*kTBTwVEM*u^%J%A9Gi!m8D4&ce!CyN%+1R1yFJKCyd!P!KkGTi/Wn\>>W=>Jnad1=Z<=ecj
KRcppB 8+SA9%Tu@nXW5&<aan!C9WTj*C*\48ta>c!?m$m6G=aNT^@?IKy$\FqJjT+Mc==iJdZ%jd!n=I/6q<GK
becdHJ Kect1#5&bnlMXuPtMGmGRWkk&<w\HR9X?CAXSAh16tWJSk$5aC@Vlj&5/#EKYAlE5eab9K+kA9/IwEGD
pPDG<Y j<IEn&bw8=199GDhDZSu/WBpnKpIABuaXGjTl@8#KiMl!yM9NH!$Apy@>ELAMY/VDIe%<mmJ<&Lj<Y1j
!dMNM1 *+@kLCuGk$>$ey<BWGDTnY:tBaR@$S!lFAeYC*VWQdj/BQPSN>8ZH*k1SDV6^YlmQnyPRtQwFF*5Ep#u
$NyVC8 5Q^EQT8LKDeTCnQKF\Jp^Jme%qe!n/d$V+nAqA<ppnnny\qk$MD5RcIILXiTnFeuJa!&aVb&YGWRd4bD
NA^DG# Jemyny^\a^JBaCk*SQul&*ec^/VltbS$mi=5T+JEl/jeKXh6G+kP=aiFc!>A=?Zpq4TXCPFDpSqd5EI@
-ABW\j 000854a9221001202b4 Page 154 of binaries2.zip
@$Z?Da y=pq9Y=#&CD?!Lmi\%QnuAR$IS/CDMN!pcX^DI:NbAR#iTkNR=Vw8l\wnIhl&awV9@cMP?QctHjTm8DV
h?dt@5 Et/Z9wXkNSLtljG\cmwZlB$d/#I5wtIW+qZC+\R4?wjJIlYI*mXE$4aYL?1YpudqeeX%$RaJ1W=pKmH^
m$F+t^ D4h6XQcb9$GJ$\C8#=Bm$d1bawtacVLhwmD$K1NNWR+kqHPc%FLLpAbIV<Mn\\TVZwR:BFCNke8Fqy+$
m1DMVy MJAdk>\X1\9F$ma?W8bCLhEVySNFW4##1Y+?BnG&+$@$m$JM4+nBPhZk!bb?m#Gwhd:j4k?DC4RHBnci
*C<:GC b#V59ydjDGiQPCe@HG8YFTW?nKDuXFTMwmkFJ#6AA#qY6?dKl=mBpVKlVm6XJjddP>#hua<6YlcIy??\
Fy:8:L t+TPWJFRZAIH$@qCqNFjF6m<GQ<AI<C+19Kp46qh+Y^NEN+\ly!/*+ch=1%k6dA?m5pE5&E#TawABSJ=
FMIE6I M<y4Cwcc&IVNt/ipG%:=qyicq+&w!iiEdpGVN?!:MM<VBDJm$TD=R!c1:k8t@iCeRWl^Q=G#*Hca^DRJ
QJ:Lde H8N4L^R+ZA#$W*@TRY&Hu8PbIcM+%/wT5iB\BdQ8=qL%BAqiD!RVdy+p4N=btYu\/CJ<nT<!C$EXRt5u
^pG*?@ 8@WHD?jhb*S<W^*$u?4i&PC%\+beqyknF!mYi&$YTXhdBR#HK<j/+SGQw1NP<VIEE9H4qJiI&b>mF@Qu
PpGTcI hJWaqewWpLRYGKWTW?kHKh9t61Wycb4AVSW\bE^H9qC4kctaqMyCkk5tCLjKF/C/mM>NFDT%WYdAp\lK
\pYV@d mXC\K8pH#1^6Wl6FyT4:KpqnWkFdFK#m\eMI\CFF4yh*+#JR:yjScH%#%TZp/TSdRNSpFHCTQGVJyna+
/#Ml&L 4W5<+\ykWi9atDn@4LnJ4VCL^FS/SB1t55ApmdEY+$WkbXBhH+j&Wlyn6R4hYDAQ&ywKuw/#Ze8V>$&y
JXAba% Y$@Tqy@yy!XqX+L514dP>j^n58:IhP/!cY1#MPJdJX/&eHH9kmBhcW?%M>A!WM^ecJXc>Cpa+EBYBVKR
DCu5h9 VG^mIbq/q#!<QHBchAdTIZFIZYFmTC4TwYutwBb#+4b/kda$ad1i$@Kt<5F:W1!nuni9ied%Q!&p\JBK
66$Nm1 j@K4Z=KqA<wwd@hj?*DV85\H^dbiJbD%yG:XSCJ!dk??WCC%/eER=hd<!t/5wmF&G1Fk?k4#Tj?QlInJ
/$&WyE %&ldt9A:bHw5L*q@>EC5Yyte9QV!E?j&+4<>J$:Zy=WhW+j8<qb@&T96m+P#\=:G51W+Y/GN48<$/<6$
CJbSI6 luPS:!8E\@KAj<Ia:yTyqF*u#Y\eHCc:umqac@dBFEaq*WWHaent/y/Fn!PFim6TICjn9Wc=Nu1e54:a
mlmSHL A5qt$6Cuuh4$BypC<NZST/$IJV1u6ld:<y8!5N#FAE<jZ5%\QAR$HWeXGRbLy$a6TQD\%*GC!#Ye%&LW
NZu^PT FJ>&t*qRNk/GF>@JIR\RNXF4/bbeQG@In=6XQ9peh56SG+VTQM<n4@etL<l4^@MD@^hZji6>mcy%@<=Y
9SAdan DTil6+5KHAVEG=wy$SZlLV\PBjwNH\A99$16LV9EcB$>K^Q$!#1#pTEIu!mk1VCS*qS*4/bp>*19dV^%
<QkHVa iIWAw$9St=$@dynJm<TmqJ&J>Qq&#h\ltmd>pkL9nS%B^S/Xu:&!u$#nyTTp4C<WHlCQNkk8b/GbBl+p
E&Pe=< >BpPB\uKd*9#:M/AV?/+dTqWJ9m%&cLLdZmlW8utS!I4w4%JAhBFPHQLRkWX\HB8RL\WuCyGAZTe4R&l
1CTZS4 AIBSk1c&R^:C+bql/1%aDFw98IEb4tTA4h^RIJwb9Acl1&yGl$cMnejc\m5jbm&GJm<mNT/YBM+Z=1jL
yaJS!t bm&PSc6Fb\e!/mcNqZenpKT5L/QL9<aeaqALtPLqMI^Cu=8HT$Ed+<C\#Y\^J$6D<\?k?ILqMI5lIVEb
qy$6/M byiG\DFyI6E/XII&MZMp!iBTbe1pcQEt6:K&K4^mAQA6EEn:teuq+In8M>1M@YbFhRQ?\VyDVGKDNeD6
$ZJ!a? T&c%jd::b@<c^QDd4Y*kq$=+^CW&PCy+#A@ENXtuI^\@!ulj9?!WWX!TKW1ppWS:a>4/b1hi%NwE6pK8
!*aR<p $hIqw%<Bp<QJ1BVDXDTemmM*^$EJc>n*PHlR@Elw&:ICd4\#ju*5!a+BMQAWnWPKV%\tp!Z$TGTCXRyJ
Tw+yk? !*/BLb=GSpt=6kly#X1XpdcVa+DNu=1wjR@Q*!#Wj#S/n&+#hDSWwTeiR#R>P<IG#ER\BVLtqd\M*8G%
!IeIJR /q!n:Th:L+MuENpI/dWJ5E%CtTD\nSBmC^p$PC9tMlcthl#YKD9^y\&$&IXHwqnIM\qH^>EMYB>Q!DbD
J>B*Pn tIkQQp%n#wbKSJq8edl^Fja<DTdy:d*8y8:q4XbX!8:FKI@uF5>AS:hVlwbuD<aHH#q$BimnKdIESGwZ
YQNuG= KiSLwS8cmk6C6<yaS8I9c86L$QLSB#Y:cXbDIl%M=RlP/6DRYa4:/CR=^SE+qMha5ZA!T#/mVlZPMy8n
eWaW5\ H?>qPIn^GG=V!h?t>#w6SFV!ea^mJL#E59WP4uML6tm#piJCl^:EDVZ\T8AED<tqI:YqC&&n5RdPnWM!
B$n1Ni =D9DXM\Zwl1\KJb!uAYR#b@\$JKQKCH!qG89:Eky4\<<m=&qN<qE+*1JIR%cS$=hl=ajSe/mHy+cVHRd
NKN!>^ m5PjjPEZFI$jKAhA/6EG!*eZa8PNaqN#a%$WLnmpWM!X?/Eq6DR??!C$A6:kT=wMF*y!YpG$*djQ%+h=
m8y6%D &MqXMQJD%1j&YFa^+I>/#dAK^G^!/MTCc%?KBHBn>epEkAZF#%&pkyLaYGIp$Wny^G/NAqhXPphwphqF
=R6c<h bpDF8N?+1/tjIQ&\GGTAK9hRRt$K5A=Wa:EtA5Lu4KDLB%A:iNWXK!HXQFpEKZ9B9eEC\K/iGDTpZ\Ky
qb&*&b X%?q>%m&9ui6Z%IBLu^?S=G#J$99hP=LZ%5KJ4>YwX$WQBRC?K^a<I\YaIa++#$=<^/c?AGqWMIau%%F
T$^FVZ ZHDi%FbB=mpRILR/EWK8<GQ5InbK>b81HK&WkpMJSqdLd8@*R+9k!&cXIbhh%?it+qS<NlqKNku1W*6L
nQH#Sm =X/N98cyhJ5jMe^%eK@>XH:+M/5\>dBK8+lB51iFuSHBaJF$F?ZBwREJb>nEtch\q#qQVhTa4?4#n>bp
YSlT%i lD:yHeW*8&nwYTT4ee=LD$=B+$N$^:8E8V5+n6p=Xh*A>XmDATA%$AF9>1KS:R$H\qN&6S?V@eSGwC8h
*PpIq< &S*J!n=6c?PGL\R$bibIw!6YTQYG6ZnhwTyG+E^BWV/FMZcG:ttaECE&ED?F&S+m$!jmEGZG#e49=^AP
uEl&m\ @&d*QI#uDSYt<J^MuXCWWF*\@5y#tY4%+F5&YhtZA^Mk5R:6\ci\uad9GBkqkFwM8N8DaTkShHRb+\WW
a#6ubj qudwZ#6=\wYN\mZNyaA@qS1>qBQ4^i?wD%XacQiAb@%*p/Nu$cQ65>WI5JWhRaAL$ZBFFm$8q5S6c16y
KCPTXD iB$#RA=+>Bp<kwnTWZ+BYuFdyawCj4Ac1:hS=Ah8W+/Za>K\bn>jDPILWdQwS&tjP^ll4/<8q^VR>QDS
u+Yq@n In^:#6lAH\dJB?4##T%M+^aaJAq!m=wyYEyJMucSmHctJaTw8$8njAS8wE9w#/5=TBI$$p^bAuGG#A!S
&55pdZ Ie5TewIDCm15^ZbKT6!cymiHTXbVyme:<^!1etlRWbqV&p?iXTkk/1?ny!^c%8a$<%l9*eHdDWR6qiyD
Sae>ch SDm4+&K^jjm?qXXeNChD#96PJ/=?QBI:/>&Hw4Li+&4?=w^mF:LmHQwKy/plJ\66^XQ::t^d$ebLRVA!
<I@@a$ lAT:LGldpXGmCZYPY?<DYClGNFGGLi&GB*$e^W+QW4=+StQ/8Nj+nM:KI9^w6QpEZ$H6BVb!h^DWWqAm
hR>ES/ #+6=Ep?wwKCqTdiFE4e?+E!!X<E^/GIZT9<6atFR8X4QG\FGhL>jKaZRP^kZ/a9k>LjL$hVp>ma6IXS#
@H4D?< :h+9Cy$PL/kni@4TXaaq^dkQh8SmYHB=Y!:\%F!A889KJ$&lb=jyJYmk++dy\F&J\HyejT%T^>tnEuy=
epI6W8 A<LB?WV4^BbT*jER/A\QEIIR4/wCuTHIaVtVdSlTd&lI5E95Sq9n&HedZmSN^imL5ePJIc##Saj1%$wb
9eSSw* T4EK5@t9TEY8DBdHJR/H^\twMK\pmF&n::PcuXdk=j==GR+Q^@?nW^p<uQ@DXAaj/J>VGZ!en%=u<%jN
YE?QMW =^@XJJ+@1JE<uI@NXjB\QRaNieCbnkj<GQSDtn$Q>&QRHA>pG*kkn$B#<#/E=upM?kHVVG+i*5ikH%4n
HIH^&K \<Q*CDV+wT9&B+QYQ/Aj!4L<\cD%D&kR:\Qw^*AN@NAX+*$M%:ki8tK<n?EcF?Rl>GP+^kX?CQ$a4uE>
Dbjl4R qBjnjR#ZRH\QeI**MX^:YLQujSVb8B=I$9!>R!9$Q:D@yXV>:$5Pjp9XENCjyP4@:N*/6=I@HKD@u%l@
+9w#WR EEL%@+eqj&\yhK@?48TQaY^+LBuK>i<%BCSBI!JCbAm\ijDERZBCK1TSNVdQ\SXhRp6huF8?c$A^J!Sn
y<Nue8 app<@@ZiC5=tIi:I9MEYHIRcwtc<IM=ABX+MPId8>#SJ<JKm+tCSNVRXyXFJaYmT@^\DB\kL!1ATMH!n
+P=?BY EZ&E#/kq4p1pJAjp@EBP%P9GNC&DEIp9d/u5ky+Itp%ERMYJAd<S\eQIke?84#uNyDcDS&Q/L5Vc/L>B
F6&Jdl MB#q1$5K#Pu>ZSYI4JwJKj#W!II=9LcctK+:H/6&E9@Tmyn%cya=FAH9DRMYG>h&bpPphi$XqtcZ$D4i
n$1X!? ^%S9cy\c!5kd^Q+d<BM*5idcNawJGMAiV!Be:Td^BF\T6upRDtkjc=pT5M5V%V#PlLeb&#jS>#Fm?KyR
Q!MWKV #N1PZa:%=we>?VL@nCNmybHRI5di$6eYGSMHl:*8aM:kb#KYKtPH#EkjeS#iKn64A><6aYVapQL^6HYB
i#a8&c &:?%#j%5iRZ1ACpIK6iBnb!QmF?!+p*$JQcjtZiycFLCS*qIeV==S#4yV1baKEHmCkbN8qy$k/QmLM!I
n@XdL& ZGyI6wm5QuX&e%WKbFc^FCu@cM%=yaL^a^cI@JuwP=P#TY1=XnMLepDuSZWCpQPeY=>n=bNECyGN1*&Q
X/*:/! 9hK#FYImn44N4hBwH:$Et&ue*jKPZtcb?RlYH#p=n9%bP+=eXb$/+hGjR5@BeqP1W5+a6u:aijNH^q%y
Q>NKw= Mec!BDBCak:b/R\8Ailhaq&G&+X4jBG5^>k1#:e#C?DIkPlj^4Fb/m@DEt?y#NcHTuMhlIl!Eyqp5JC+
CKIAjE W/u8#NB1pFB<T@#kEP+!5\JtlXqb/9QkI%G%T9q5m%<%lQk1/%HFe/nckyDbEQ4\=yp?5<y>eA#?4NA<
4*8HTl Kt&9FZcKBW!6De9#MqAhCdJtE/eyVEb#S$A/c^EnSEFjD?YBS:m5iy8+*1uL1MX5^:&j>C&*P/FtYqG!
*j%tM! E\@BGV=1Bqe4lA==te6+Rth:?MI%dub?1EF@*#mnTSZl\/9cJk@+CYPBlAk/dlH<Zy&=Zl\qhHZFZE8:
*jM@?& \RAtI6bDNRNabP>Te#!HqNwk?=\4D>R=&Lj5pSK/A<%tIHYVd<Jl=%aDM/XRW\wP>wEy5Yi\QNSanJ+K
5ZQ*GK NT#E>LHcW6n?*knFu>+qN*ZHW!dkGJ$dAb?L/+i>ZGDRXq#BR9R+?D+Dt?wm#$p/AX1aVP5qiXhSGp^q
yKdDyp %9tXSC8Gw&DTGRIED&1DyKWy@PJ!\iVcC&e^E6XTQQpYm&JJ66SmPTJa1RSaXS8uDCHF*DV%w8Sm^iCc
lW<\k6 HK\Y^^w4p4m>Pth?/+$*Wq!FJ5LD>*FIiBZQ/DAy<kNqR^AKqwqw44N#@ctNm4u9TmT*!JkBZGWFlSB\
-AZ>N$ 0009a00989e001202b4 Page 155 of binaries2.zip
e%wIN8 >>!?eMJBYX>%P%Wm%GVh^WR15nTCKmq@\bw+^uK&NJi?4<?kXG!XcbdX1/yqthe9j>6Rj6jqGj#/6nSL
KGV/cw A19F$Gpi$A&FpB<epbVLZMZ:YpMXqqJ6a\LWb\\8$D8XkA^E4Xi>JwGt\pWDeh@C?Q61SwlpY>EbEdQw
PVt@?N mLR=FTpJN+Hw1J@SwJkW/cBb#u^mEIj$b<PXY<ea6cBLZMG9\ABEKw*\^eytc/>GZ!t<+*ytYZdy4S9Z
XN&4q\ <lJKGNwWPL!LI$J&I^y$Sdw15p1kcp#Z:y9:Zd$Vm49Zh>Qb^ecXC?dWKp8@nJq8I>V%>?=kCqJ&:F!m
&lHqnR JhAb$wASQ?mF\XdP6X+IEQF@khIWkYXkK8qNt$:ce#kCpBDwaVq#R%Se#@%SNQI%*QSCTCweqyp^mYtC
<mt^Q5 nqye^GwWd!L69A+9mtnIMKhT45A4P@p!T/P9L&bd*Vjcam6Qm@bKS4tJphMb6DRc<SE*>Tc*PwNGTKaG
myRVat a/kIH1lqlX:qW>!XtCK$lwCHEQ:<HGNk$NmSD\y$1*WZH!JIAqRTyp1:q5JIEpVt9ddW4pJ^m@:R!QR=
1%bX$a lYkZSu%c5/u<B=q8E4hheSTMKh?Hb*+NENYl+qSPNlyJ/>V&TnYWEtqG<e*RT=\jJet<XiQQMLF6h^Ke
pXdeMK pBhIbBhZMJAPPFNc$G8At4*bZA4C:>I1:HPV@I6GNq/yBu%6V&:4dE\E1m^#Vl1\/cp&w814wC?@BFe!
QKHytY <bKaTTTP!5k/<@EqV9A$:ymm6pjtPS^&<PJ$5eq>ncRiJ:TQNTGe%ZuHRwk$=m4*!kbhRQ?6deXE&$Z<
*&BFdm %\XZQ8@bJ#FWyq=TC<$8iM>iQRWwBXDQNCjFWMNdqbR8uj9I9ZAGZm8kRNAnT?yCVHV4Q?ZtY>tZaakL
A\YjIG TwN9BJQ5a6NK?\GGV=n&mDHTqM@%eG&9hFGwqk4S?I@XJ4qD^BQ=\>VV6HR1Gtqjw^dcH%*m^=bH#>YS
BQ+kj# =b:4wC4#j=Nhupu?RmH/9Rc:u\!&NXptZY>t#iAeJet&>atm\e4dQdXwNh=W&VmnG1NCpM9#phScPp9=
YF\a:$ k8n/Qwcj/mQWy8*8>XVJ!5N#Kt^tYa&&uBKYbMR>@EQqX%XkP1FJdWGp/6Yc8>T9mVN?CcymWj4/nZdW
pquR/M *LZjDhtmww%DZtR&/pkb&VwENVXk?A*1=LuJ!t?ZNCZjY5n\$jIkV8:!tpR:/TyKA^*JQ*ppH4&4<N^p
q>&11i @>w+Yd!n8VKk\Fub1qJp8699aINEk#bk/F:<\@$\W6c$W:c*Ya=KYT=<SlFqp*F:l5q$TRmbRMl$Ji+q
J9BY&X Xd#$cu\pXqmJd^1Lj>pY9NSLW\$#V<Zw:bS1jiE?1I%Xd:J%/T1V8tJ+j+:X6W@8umKhd:h$?$SWiC$:
dP8e1E k^B/@A=/<68wVEZ=*GpVd>FBqKXS6>YwH?ZA=<8=e<+XC^!^X16Ik?wP>i9A\j9R\1pCL:X\%ZEc=bWV
F6kVth PGB=EdAcD>%*iEK/e!JQdt@wCZLJNQLteB&HnARc*uGBN91iit/y1inlwL=e8MTBnKXJQF5y4LGM4nRW
tB9qd> *lJwE+D<R&#pc=Xe?8YSt%WjYK\a>u1w$yRJ<u**BhK+YPNJGDL$l/FX?TR4$REePXScAH8LjKTQSG6#
HD\DQD V%uBSnme%+!cZAtwdtMjuGX41mJ9VhTySIRBj&TtjFVw!^=w6<hP5SBBWc5A9a8P=/\k+tGp+#^/u4hV
ia?qhn &^CE5%5tyWP@\t8jJd\D<ANTFbTeF!L^G6QZ*!Kl=Dy8wy?6GC9+pQ6CMTd#@j8dJZDRu\SVjR:yiHL&
#%?*:m XY#!%u<Rub^G^n@R5B^B&*@Ruhw?!%lKGmjpuEP/?QWWtp>F>c\T@<*bbyG%wBJIpkCPl:ST1wenPW:J
<*t>iK uq/tqmZjchilDJnhC/&iYbQ&9N>lS5piNtQ44ZeIDBw5RnC4b>$QRKlERLVX%=h&1$eJSDeWRuHAynmC
blMaSV VaJiIeQDaXbkMdQF6t#6PdFqV=/5!LA/tM4dTI64##kq%^jTPBjEu6mNu?Fkp<QB#=ybVR&tNnmnHTl6
M<\IH* T*#BT5JYbYZR#R8WlSHH5ZE1+dBaPycHHkjXc:CN1#GZRlFmyZwN6hD=9?A\56Y^k1nY=$9na+a/#^Zp
n#85dj CRwyQEYG$aQI:=!c<+eDJiyeqPCX6R:lLcNkVSQ$bjJAqLB@FwD?9ndDH\Yk^\k@@/H&TQ#c@G8*ZQ<V
ud1Atk 8ij9T#*<t>##q!Q@y!qB9@@K?Z8<<^jZ>N>HR&eZMZI&?<9u&FW<dI*6dj=^6@@DCdER$D?4TBDRw%Yp
S#qYQ5 j^?P@hNA:\@na#:\I<8?eQ?l1MRj$A?N#j>RXPIQcM+HF6n@wcnEQ/P=H%JV@qBV+k@wB?d1R9=RW?IQ
d^nlF? cP/H$J!QRZM>lAa>B5*=EJ44EimHNCkIB@k^/AjQ&tP+Bu:\4D&Gc?AHb9yCPB:D6ae$KAnHa:kG+wM<
RK@b?a kH+M%$AQ#DKGeD/Gc!D8l>CQ+S1I/!H$a:kG+u\I@Sm8ejI>lH+M%#kl*A?kH<P%B>W#CPhn!QbR!SpI
Fc<=BK =/QI>lBhPB>DNm+P<ANw9u<FDjwu*a@9EXNW@*%Y/q>$Q#Dpu*W@CPlQ86@9md@@:^VX@:$y1w%&Wwd@
Il<R9? F>uwY/#\I<kdPSn&>:JW=+PmJ:9><hB6BR%uQ>4mjeXCa!QTZpI*aVnjGHLk5Ic9GP^&Sy8TA^mVq8+*
G!$*MC &^AQY&j&wAq@LF<kppQ#&wCwPMI^+TFVe\n6B8W$R<EIuNenwlJn5&#VCK!5Sqwaqbw>B9NSLI=/Vii+
G*SJB$ SwLmS%9hm<G&kWyQ/!kV\w<un4aWyy4WI1#%%NX/9ZjuZR8T4JwdKaRE?#Dpa\^%=ZX>u8qTt?1VTS!@
bH1tGJ NVNhGpMFL:YyS&$=1c6*Gw>nNMG>5>h#6:*RY?C5!QN6lA6/b^NEeG#tQpF+QIGuQ%=S>F^JI*Tha>q^
W9JPVS Nl5QIX:WWHDXV?lR+qq%H!bZMPWaPSNTbCA&#@n91d5kX>$\L!uKeaGu#WaJ16PdtmQtX%w6ChBb!A^=
B@^w?e k1Zqwl1tqnW4\^Hiqth=tGl>?YlB$Q4X#1jTylNYk>KFw>*Qpi4SdN$LGGjiI+*45$qH&<%1\e5jwkIM
qcAV5G y@d:mAuij#n!@J:$:L%:9%G#@i9&=Yi&4hb1h5h6ZH!6RZAB$IMN@myCai=9B6Kl\SwD#PGZ6*ZKiGn!
K>RtW\ an=>N5iFquRwjm1WQKyLGJl1aqwW=+SYbcaGV?iTw?\+$SyQpy\5+$VX&miP%YhH^IpIc:!CY6Web1Z<
Tw%46Z I8KuG#S=J5tm<$\DDLlJ%P^9Gy?/$%5ePj?+uE1WM4Z9:^I4d11*VJyiqCk5Pi8+KwD>^H#8XyY@ZicY
P<aNMq *YFA?6qw:/e*#<6VyN<G$\1MiDSkJ!R+uR$j\%\+lkt<W#qqbhd\%BFELl6LlcYjVp!L?4WF6^hw^qNB
:RELZE R*^T8Hkpi8V<KT1$y1Ry<Q>l$1:8Z$Tbd1X1<=Qj*:i+b4^p$^y=?\Rpnw!CCVPmF+hG#ZCbLS:jncGe
SC<J>q n^aD8&/8Lq^CFL&u^=tVJJcbV1aq=\TVK#=XcaYMWm6%RLbba?L61pF%4V8/9hT!4Sulb*YNkwX9%@!=
55n&4I nR#P@/8/9LBii<wHG4Y6iM*DDhMl!hTqV><lRPuBKn4kc+wq*N=kJp?&AH14C=1lG>:^&jIK4AXm9aQJ
q+@*4H AQawb/w$Jw5^XaSA#HX\FuZ<aV^#>Y6Y%^M+\ncdHYMG4kSY15=>q46CBkcjIkJElnVj#<J!dI!l5*#k
bHCIpt LX4YcXPR@Ju6N4G^QBXM%^CTE/XYA>mPhG\/JmVdV!A6L#:LTMau?Nll>5qZqJPWEV*$C6$F54uYC4Ju
lb9da\ 1BDFJjLK*n8:nMRJBD^d:$p8:&X%qG8Q&Pc!AEM4DD!9T$:D1he>^QBuCT=/KKF6&&WTZWD@8L4<^Gey
qjPiit >Qui6?1=DEaYQ/c4k1KuC1!8+jHRST6IK4Nl\1<Fh68XSRMnJNcalEyq+\4WNIaRTYp\4c8S4=n:a#?W
=MbMb? NlCB=Vp+Xhil=E!Wdap\mS^bNN=NTn?=#E8/$/e>uXqG\:/@DBacE6T/iCE5BM=PAJBS6ddRQ6u/1Pn4
H^mtnK L>=ab^yqualtb8hp@Z:&5/GwE>n!5&&Biynli?!KKy4!waAuGwR\<>SViVA6QjK9\&?aT$LFQ:6FR9nQ
BVmT+J e<bq\9I\4HI#G?6k$\>ct+WcQu%!WLKPj9Q?@RT!cL6%kV8qYdl$MmRVD=Z!YaVyhY#muXhhc?C5Y5/u
wK<@KP AKqGj\Sa8wk^%bk&=9Xq%6i\TLC?SkpXM6Y6YuSVijlYCGYTCP51SuwaLQu1514dXbb19ISuyRF1X$5L
*YD5+9 1G+=LE?C1ypP$lSJCed&G+/LNL1H&lKLlQBn^V8BFdj$dc!Bl6MyZbYh+/bASj>VuWLiyy$p?Y&@IC&d
hhh^Ac /tcmAD1kq9bNASiF4@qdLdQaiYD<5$Kn?iLW^LIu4\5K+68q^>+8Yq1?ThLW<K+umE*Z$8/MIuuSSM^H
5uiYwV ^4%pjGiS<hNTcu%#p8BKbIdNR#H%/J\5</6Xtw$\QQK6GY!/eqS>u4KhNLb*ShBuEh&j8JWl1n!jV@it
F<4Gmt qc:hy!tuawWQp&TNV9IkGPkY?=puVyqPY?m*<pqVF*#q>aMttm/qacW@6YMb9qLNityVc4d51w&c<LjV
lNPu44 CT8c:\ctWl$SPy>t\RX@=8$MMF@n!uqdQ8tK1b+bnY+4WadJQc*kKEyuYyPYRc^@/%G@$=*jHncpY1<S
ym:A:p n%/?Ret:1I&VmcX<p$1LwCY#t5Slqlu^YR%w#kGeFAtY:hcKeNb6I\#YT+A8<IbkdLI>CaeFkt<IWWc*
RlFnGQ I!6Z^Al+P<D<Idt?8ZaX^b/DVuPjh^$KTDIVjK#uL6:$@4lQ=Gnw/ii>1ZbqP6byeY%:+wFZ<%^uK9Ma
=udAak /DS?wc&@bnt8#>SM>mFKdX9DT&6ue#96GW#cDh84n/?*6C:apkT9D16wcCdMBt%\9!/uu/SFljDn11Gu
Dl/5It qdw#d&E1Wd5Dm!<t4N/np=4mPd>V?w/hDNQWXuX\KEWHySC+&6:8Tam*KC6yXNj:FD!:^LZ>TpC@X??<
8/cLbH ki@8d6</MtG\mHj$kGS41C&I?XKZ&J=Xw<9JpNj?att<eK@a>9nmp@/pLCKT$ulB*YL@%QHReQXX6V$l
laLMey 9p:lVjcI>wVEAFjp!CXR%@>CE*jR1t=^KJRwwuZ:RH<c:kQFKZB!>dNEYlFB#IaJ*YKBJbqa@5hEdX4@
cb$ycZ Fw1VtZ\uB^Pb!yDSyAwMwIp1^5j4pH=+h*a$4+>Z5AESMHCJG&m*88\$*RETQ+L%G<#8Ajd<yhI5u&NE
dqyF%e 4nkAQAGlBmQbFcKXTa#h69a@EWcQyQICn:1^k6HQV=A1m&uX>@5V#T%d8eYn#%tZXnH6$BFQ*%1wM\!N
:9?=*\ IS*SkA5IpTtkE5FHd?GkQkHtd!N*FjMKL/8cA/^jDSkKw&Iq4@h%y$PLQct6$Ii1K?nM@aQdlpcR*I4/
MA4wZM *>Im8iXGwqWZ#!IPqmHewbY5&p&<C9we8Edu9VRE8>dDE9E=*ZjHlT8+WTL$FbVm\Q1qiX9Rh<#TKhhI
8*ZSZu tw1<bQRBwe!Z/T+!KD&eCt/BZ=&Dm$&\teADVl<AW=<14HRDHM\KMC!nM\8S\BbuEq#FaF5^d=hS84km
*>bl\# K=eI:!dtHt\pT1ISFiIV9Gq5@9X5:V#5YF8ceAjP+y&<$4dV<kPwq/4h?n8&ZhBRibD6NDJY6>blAmwT
qTW6FP @/=DGNyljCCDBDyn@Ge#QB>J>T$FZ/@J8dee&Y<4$@*G5\Q*WJJ&n+4Np#AR:NLCi5GVe$jmb1TMd+p^
tkwl8% ?!9pTH\p?*jKV/%4D5\heeqKALZF>RyR5n4A+Q5BwVetEtDc/+\6m?dDNunpXuCNHd19MEFlhc8y9\GP
-A=V!q 0001d4d5ccf001202b4 Page 156 of binaries2.zip
GEIt&d q!tPZjNP>Eepm5aRP5uD#BdWQLwV:TawjFPiIbJ94Q+/FGE>qHejqP4W8nuMkeu=ctle:piQBG?6?Zy@
c?=e?^ Kny#hG5\8be5dD=PMkVHkM$y<SN#/kieJD\51&>lDFNP!#R%BP?CjXW6WhR5Y^Nj+6KZenk#aKA4^B8#
m6&E!t ZiEDPjGATjkX>LnaSaT:YQBatiPPkucT=p=ImASAKdh1N*?eli#SAQAWnkG&6mM8&CNpDJ5lNGy4P*R#
*X44P: Na!YR%bWmtuVKS\PKJiHJ5?&CWT1+TkBjEhM\JH$R1PZk@m8S<LJNWeKSS/ditbQZYI=8S$Hh&WQ<<yS
:jCneW KiIYK:H+RRcZR9PPw1u&w5*a1Qi?YudL8VFeC*iu^8\GYkVJe+^\^P/D&H&l>TWp/&EW\+H/*pM5HjG6
bQ4Bdk CYb+Zbc5@MkmqT#k>%>kF>GEST#X!+GJTb>45?Rtm1^iI=+$9n1nRED&W4VtVXX8aYiMVIQZu!4Q><il
*GZTPi pTnIQAwFt*/&T1>w>pjyh:Hb>XF&GHDaiK114?:\Gcpa9Cec:+NdZpF*MtG#C+@DEtTBw^Gkmuc&/+Q%
?@jhaG DR<w#pnnVBHynw4lkbbup#b\8T1>Y+656adK>5+T5I!k@8:mDy^hmFb/!mecd@P=5pVWEIqC&RCnX=6y
CA/et1 n+>CQ!V@=BNHb*!5cu/A98EaY&+DthGl6R#VRubyNEVbi:LQ!py&Iu=+w5SEZSQl4m+1@aNhmimS^blq
J4DFLS &/HnFALin<8b@HHVu#kDRBeVMc<BJ<%^m6:l?t6/8bBa</TKJ4Tc<ILQTFLF+M1a*Yh1*mMTT>4Ftqj$
FJy?c! Rn!?\8wq!4cqPFPXb8nWHYV5!yDS!*1%YkTA:wGe+inJwlm6JC%86EKRiy*!i*F1Q8bIyD#p/D#W#tdP
<1FCn& IkQyDQw4@4cnT%SjcF:<Ac19<5$A\SqR\/B&F^=R^qd&kh$CA=pmNEAT::*ER9QWy1aMMt8NN^>HbI5N
&cd?\Z VXL<M5MwJkP:+Rj5&D&WA$iubVMCV1JTyAQblaP1*EM+C8CqJF<A!=H!BRH6KZndS^diZ>hmSBAm%1Iw
mXVl#= b$*N/%P+^q\*tn&$tu/G1*6<MMbw<*K<CZ89FXn?Yb\&6!#w6y=8w6=cBq!twM&/@S\Y/<@GCSDR@<qm
LIwSRN <*>QZwd<\V+a^Aq/=QR>!B@5k@?AjpmI?+N><B@RD\q^j:AQ@kQ/Iju!D@dBj$A@JF@?\V:+u>He+IjW
mkMEyl Dd:HwEEQHQ5Q>5H@nAbDHqB%@tAj@Aj$A\9ZIZ?\D@+DG9RR?nFe+*1k9n1E/#FeA*E<>L$j\:YHlVm8
Lp&F65 ^=D66^9Cu>E<@^Kc>%>CQ+b5aJ+H1Ay?DNqAD?SGIGDPj\u>KLJ^QmB?k9>a6j1@Q9\nc$B#<@\YDTq?
hEuKXe F\Vu+8F=^JJ:CQlSXc6B9F\eZG^TbpctuG^mq4<ClcY^1<69#\A6i%euN8m@XaKY@S>Zk8d/>TV>dZQ!
1lcPa= P!u#&\dmMi*t@u>A8*?h=6<t&L@>MH+*@#HN@5eK%9>?&j<4?jl9M$Z@Il>D8Q+kH+Q@B^Y5j#&8@%4B
VeSCV8 G9V49Q>:BY6Pd6:@YRq4Qp=i49>R1<XEXj?kX6<9*J<AMIS@NhwMaPwL?QY/Z\cIAyCA9%?@jmKlITEm
@/qJ4i wYGkICGlaGClw&Pkw&Nlw@*/maGGnatDm+iLk$qESEJCSESNSWXFVj?*%*$uABWJpAYalaGlA6#*A1b?
dwd>8* :SkS=9eL<NeZQAIeLBAGkImEnIKKBaCFkaPDlaeFI5L>?kH4DAMLl\$QRKDE+SSYA8IcWVu/+aHmelD^
YbabDy c$Tw8=RuN:kInE>yuQ#QcEZBK9G=6TdP*h^m>Aq=hSBCXXPZu1qNJLwAbBRm+5BEeau<i9XyNRcT</&L
&#j^&i *yu6T#QZwKTCl4:buT6#6?Dp\5d?8h&9QJIcL>%DWw1cB8a@j?PX$4S+Fbyc*D!+5HjN!Ci6bipSqqdT
cD^/Hn M4T+j<QEL/N6=StiZ6w/9HS\i@<JAA@A8F<CIQ*?Tm<AKa5itEQ#d8yN:9#e>W&EYPI5W:X1d#@lj<4\
/1ITjB #p@j9AieX@/I8RiwM^6ea^/Q*RPa9k#iA//MG?+B9ue4c@?+<jC@&9nqj&Xn&><&j4!j!QAbju@?+1ht
elp+KL le@/m!ciH&Wh%QiA&jD=P:n9#9@1F5CuG<Z#<Z+DpT>!NiHcGu+1WM\wnlh:tMNXN+a%9^yn$#H^NMuk
+YW8Bl 9M9pHkBaNMl?\hT^+#>\B%Q#YyHJY&6Nhp@d5lE$LC/CRBHLQ%XjTTm::eMRI:C$*!QbTBBXwL5CFu!P
:BN\lN !:TmR>Z!DcZ*Db@AXMhYR6E>aJVq/dpq%@*paW8h?XkG^Gd^>/<Z>%PH#Z4F&564859ci4%%!/*DH%HD
jt/9nm T=kI\!m8NbAcdJ@KN:R&N6bN5jl@^B8qV\i/ePXEGVZ>@MS:t:q\9tataET%eLALpp^m$Sy%Gp#!ycBX
@QX1?^ @#/qDnVj%M66ZQ:SiA8@56BGKFi&M!JbX%E:+GAdZ8hb%+NYQuTAW/>F=njnYGadp4IppXc\a6qE+y49
Vih:t/ X5i>+kmPLSbSCuBTGcny%:d$hC51QilScwniE=5p?1tGQyC\+qVk>T4tQiI>IMm4/hjXKnP+\i8ay1lL
CA:q*W W:?^NV4@EB8$#Wk:tq#4$EmiH@eP!qmiqW+qJVQB+jlXmDYl/4R1?S=\MG6>D/BK8VWC=lW8YHydV?SN
b*9WiD X&\%TL?SmDPG=wRuwpmS\$RV!h<DEnA?*m$$GX#lY+h+c9^\e4pH*ARF*MuVwZ&<u@/He#l#eLE5:pA+
Rn?b*h 5+%CW6d@lVV<!PI5!ekkm@1Y@?t*1@tj6C8@YKC:qyh#D@DS<=uT?@lVdi#9NnXMH<>PTXkYeGbJ$YXb
lXQXJY 19IwCJ8=cZ?bT<W+FNG1NG%yjJ<%YZB*KW\6PSn?h6Tt+eD#i6Mkt<*u+P#NQWAc%&hYd8&@iPjcpbId
m:w^yV jW//ZFd!ldcyJGR?:q*ae+VFtE??ljiAwbCZ>\Aduc4d<Ic8mX+:<E@atSEcyjHa@CnWil8S^TEK56mA
InlADG 4:FGIhhY<*e/:B*:dAa*bV#@?e&L?>tDh^8@LwJN?#$k9<Xu6*#6@!9j*e@>4*<NtHJL=MKFnBH4pS+Y
mJ/C=j J^HA/#Smm/ue>BK\ABpM#=&e\I99^y><b6R1mVZ9Aa+:XapGX#AR1W>#*N5@taChCewYEEDt!#u1W=<d
BHTTZy R9wj$^tH&Ne9jpRp*Fq?9J<@j1wb$*WQ&Nb>h/FkZ!/=@85=#Kb+W<V#l$?QZaZ?iHwuQuRQAP@i>uyn
EhmD:K @4w^68<B/e=9nF@<85QmuH#G?Ny4ukdeA\bdZ8^t49*L?:&j?Ned=#Sq<cpbR:laC1*<QicX:%q*B>e>
DLhp%8 aIBe<ZwE<WiYHEZGQaD8!d8jNZahB$##cPW?#ij#\?!*9lp$lE?NjPaX4&P:a#m6ibcpRk+kHVwiBJIY
nqI5*h 5?TT?icey?ZiW:khRj^^wj6bX5HjFGw?YQRYut66:hm4S!pVy/@NGe>5=kh>%?iq?/kj9^@QB^==:/F%
aAu@=> nS>Q6+tk5uuF&J@w=Hp*>MV!*j*p98X8H!jNqPY<NF=^FF+\TGqJRShd?/$<+Pb6t+N6aj&<5w/EDX5P
ZYpYK@ X=leFI%eGZcMA%u5<+Z9+J?9!A$+=iIZ?<EnXbhlYuVq6yyd$Bii4<yReH4P9nT?pJ?*+!a6#mN^:j9R
9u?X>c Fuw$4WlKm*K&JTwDudt/bR:S18XB#JncJ>GSl=!<\mwqNlFbj!>Bm=LD=$IjSyj+9L<=Z>@Cpy##q8qm
A+=!B> &wMEptS544w=HJK1NQ\?RRlV<Wu%/$Np@B>8wPZlCPb!JX$RNmtZ^MYdWy?+ke>By^:S6%IX1*wpB=Bp
*GHN/\ d9hTd9!MXGaF5pdGFVnS/RI^:eP/qiG+^nSukLicl=I9Z1l5C+yu9Ed@l#d<PY:Pkl:Ytem:SPMZRdBZ
\j<hPl dw+6b9a:>+Du#b!>^hm>w:P986TSSamVFMYiSD8QRWS9bccEKJV:B<L#GXIaS5@C<yQN$6IC&@c<aYbi
ka&M$t #>>QHj>?+Id^jJ><il6#P+$1?QEiRPd^a86ZTQQk<Lj@pi4t<:Y9>S=RZKaL14udGnFk/DmA6aphL^@p
>+V<T? ^SADNVA4SCJ*w:@YtGd=jQqq9hp/%cc!!pnH*NXh/lW^yRy1lhdZdAHd1AuZV:SS^^X9M?jWp/Ne\jMJ
h?B::Q qJitFubt@y8K?lYDKbFN9hcK!aTaw=yF>R$66bNjhyQNW*Y%mWK#<IN!u=Lau$uXqjWLXDtG4>!e1F&y
H9t@$9 n+l$9M%N!>p%y1JDym@W=V<HY=ELiP&@8=<?bntHFR16Q4L1tGiiTjq=:4Pie46:SZ5Q<Hy*VZ9Z<pHc
Eb%@HG b+*?D6tu$q:b+N59:95dHGd<N#?&cWQ*E5VWmkPdSji55?TyXehaw4K#k4EEIDmHW:uWA<QZuWkiMRYH
Tui9lN NQV#bh=&qu>>CR:LPY*JD8\RP>hI&NPSd$djT6m@@:4X86m9Q6:QHJQuh*^J8AjAh<##@P*9a\i!h#e9
@BCwXc VtX@Pu9G*\QcFZ@k*AN$e\+El+<!<hYCyBGhNHy&k6y@Bbhw\Zhu!bk*k1uCD#:WClKt>HXq:jCaylyM
klAW<j FJewnG%YBqq6n5TFcCVeu9ua5@Cl>84\G8#<@MS#?N$nINaD>YXX#Mul<w<Pt^yt>KA&*>ii9!Lh+k/y
QyHY^H j&+F16?tuMth?e9:&cMPHaN9!#=h+9eANc+*6n=469eABMKj1tNZ9#y:d=y?+Bqe1jDM#j@<8uc1>D6m
jDY<=M @8>@?8Q>*GMcmcjXIpX6<Rpb\e<P9QS8iG\4!Q6^b=Z6ije>wQLhGcYjK?uI?=hl4K\@uctpQyEEVdAn
^#H5:b *VBR<y%@q&>eRHBX=QR?#AwZw4mhTieTQXPJ/Y58ACYwZeDiA#:\e\1bSjMQMEu^CuncZAI:pA$H:JJP
bKLih& ??ltZP9nPi$LI+Lm6Yb?/KjAl@*pZa\M<XE=68F@6iHhku5RMNK+>CG*hMXAnM%YM%n=DjEII=P<SPjG
htZaXb =?8u\!?8Znd?/8H?CqPH>+B%H+bj*b?5=V5+u9@aNHcHiB:#W?8+a=*L^?>H*1<?*t9:c:T%@>ZQ@84?
tqJ:jQ @%*#WASuh#Bb6G/5Nh+*VK$Hd/JKd\i4cwNc<@DNuqN5jGw@6QDbVLlNAN!<8?M>>?uZjLF>dkT@h5N^
\iKWlk hA<+nuC>B!myN=8b@B^Idqj!taFjyGn?nu4Z/6MdDQwC4c=i6/@ecMDSCKtmGllP4CI*XW@1a#&^QhuR
nTA@J9 mbCPj$ZiSl5YpJQDbDEC6SDuqLPJq<SJTb4FklIaA$4AyP>\HDB1CnWQ*Qda6%<yL@b%K?JX\EpMw%#k
k!H6p# TKlYn4=iS#n9T$lGL4YKXJ$5KjqEkkMH9j9YGbD^k@*qTMn?M=Y*jI+@cX&%ZT1i/h=QHn#hpDY+ddH1
Ce*VkG ?Id#@l=R&6LSuh^^=VV4e$L4@w8i#n=B4D+HP/Z*kBYbL*iq//?nEGWdZKLj/Kl1$cBNb5@aE+eZaa*C
/6YMut D5wnelyp$h>TT>$D!m14j9XA=>e8>P$uTTS@/4u/*C4</98pu!Xa6wI=&/JKD>bR*kjh@6^n*e?V/jKR
K@kna5 klGEbmJd&yw+?>\?1:#T*MElilyhBe/p^W/:q1wb%=IY4>#C?C<d6Z5QRNH?heFG%P+B#Wq49#4bh*m@
ZGX8/t d1T!=LJj6\X#^&%b^k@GZ%%@DXcN8$$Nu!5Nut9q?d6K:c1j9bY@SkYXQ9hV?:W*L^T#iII*9!8uE<Nw
nYP:w# WTXAY%*MBQDNLJEw45u+%$9ADP?b<lDIi*!:%^:Z=<D>GZRQ$H8^KRy#RNDp>EquSahGteX^nLT<e9IL
HWwJ4< 6hm\S1TV^9e/Z%89%nGd8DY\WeB1m6SAMi!1\kYt@CiNCKb1?LP#@u6ARH$:HVdNwj**&y4<IJp&$!Rj
-Auu/E 0000e1fc1af001202b4 Page 157 of binaries2.zip
D!=L$P Ja54tNCX!%5G18<n/n\Za?CQFLnyI$VMI1@KZjFX9nP96qPFiGF+9T&5F9M\h\tuStE$hKNNVd/&YG=b
Lk@<Sw CH<%+/K>Nh!1NnJ<Hwce&D<PB>Pt=Ip<wZH$=aKe%Bl$I!AjG/^qLwtkTAF>GnK>DSH?G9mG**:cTH^=
6>T5<W ?Nc/H8ML<:N/a!Km=6L?Yyae:@H9SY>?S:YD1J**Kp<TaV*c1$^neQ4HB19hJE8e#%Rh5p?QSYCAdt+n
/H*9jP b6dw8RJT5R^SJCKwnu1JPIAK+P#lXlDJ%h8^9p@%p>yD4mlhkmAY@VDKLG86/ZShYaDyC\%Dm\Z!JiLn
&EA?cA <1I/E4WjYYXPtJR%*Dp1*#i8PtJTTJ=9^T:d9Je1dGl5chRn9$RNnTiIi=+hw^1YjWZeZt>%cbj:F9FG
NiM#t& QKITjFlDNpZ*#luy<tVd#emt8L&k9PbW#Z@#JXNF4%nm6hX!?9wden/j*6K4Jw8?qen+=TF4/9HkXj8%
a1>EtS $edG^1N*8GjZd=9wF>JP@nLei@e4I1LjZW4i=h*Xh*@<d*a>jVkQ$l9j:hEq\K:IW<u5WtQHbW^dlQS<
Y9JJZ? *<N*e:JTdFL^1*<HXm!&dQ\tm?cPK&iQkJ5Ju/GXSS6qdMReS5VApn>nH?EV/m1W@\VD&cE>k:8Xq+ac
AwwbPe y*^qWR%bGhnXlLk\1jQY:8/JlA=Sjh4LcG+$N4X&FFANRknJXLH*AQY^N8#d<dy!*!4dAp/pFVd1lHj5
u?aA:6 Z%+FS?bt!i=ZWRt>5HmFuZJH?h+!mY11/FWLjybmKFH*<GqCV=CP^R*G5>etBdNZ1XumiyRFiYJa#FN?
6bnRjy t^lZhkk/AihQpi@\JSR=Dl^qpY*JDaV*cI$PCJV9awB*i^4j??Fhm&<&Q&9QqCGA\!\P:&JqTZyZe!Z:
j?tSJn \/NGHi%e>Z6?D^=6K#?XE>k5/R+=8<Z##GyGT$&&55MiEF5N>\Z@SA!Tp9mt?RE+&B5<Q>ia:LGb/Gn/
AD55$S c4elIEKAGXB&FW#d@EY?ecT^dccTyik>&^tSVqm$tFJ@kiTZnPtjc^l1*t&T$j^Vl!w6nT*Nq5S!&DRn
<kPpc> KA#8qJ8Y#S!ZGkG#4!c?p^<1H:=>1Z!=1\kN&uBy#%Z!8##PV/KXWBZ6Y^RP/:Bk6tH$1!>lw:/Aq^KX
w#nF?e 6GehndDJ5W>MSYm4/Lc9yP4ZTR??>kq!59?LCtA5@%hG@I41B?*@#RAh?N!1ZajTbm&Qctaq9:^+d+w@
D5NJlQ !CIAcba/<e6\WhHmnVG@bB4LC#H^b\ZyeKBXSjRGZ\Rck8qW*aHVkdMZ!!5cCNK:1Ztqd=<jF/4uheeS
@C&9%A 8MIQqt=n>QbKj9K9dNm#*hXWZ64eLME4&I!MJdApwXV//petZeDBptZeG1La$Q+G=Gc=1pVd!kmmplk6
@=yTT8 6XT5Z\eYBdp9p&ibl&W!c?yVEY!cYyD+^>PwkiF>?e+FZQw:$1tm65QK&V/<Y9MLyYAS=tJ1#muC*aNe
46b>1@ Y^y=5t>\qaNEtABcKSF9pp!cckT>DhjLF?@un#VT#Tw8+&SjFNh&Q#GJS!:\/^=WdV**&/LBmck=:Z$l
yb$V/i 4HWQ/Qnme$L=?6hD@eLd9?+i+LQ///E8<8&8dI9&@Cw!4nYNVT6eKuV1$<ww*kmymCdNXK6GSNaCV5@\
eq?a%F *B^@^pFeSd&KQJj8TpNDT%lBW6+4c&y\4c$pZiJll:MY<C>*:b?HDq#*E^q@y@RE1:>a<dDiIj\yJB?Q
?cu#4N jQej%&it\8XntcIn15\K:idpS#AcHql*=w$8%#M4wuAdk8c5lHKL^uT>mqH%j1R9>C*a6+KXwnJ%6VJ*
DMlZu! DW\i5RaJdqZBcBqnJC=K+NL+RhFdR/V^:dLYBy@aW+H\ucw$G?<C&1PcIc\\Tk>wEA9<bJm1KneE5iX\
*qawt5 8pGF*G=Kt#e@Wy/?4D?$J59/+!#1tKb@\/XP%WEZqpiMdBbltmpV6cdYdCjc<>yhB6W9NT@^iue9IBu+
WFI%QN >aSB6BaueKBaZ*#pRZLhXB>t=hV5C@KWQhKW8L^I=ME4R4<ZGtacAG+i\TAklhh!ISBqCJVALCwyXFl&
^45cy6 +GVFBc5il>8p:%?a4i#SI?qwe#Dq1eHcK>@##WJ//@6eBYHNDjbY5Lbdhu1p$&AwXJ\!E4jbhdPYJ8Jw
/6ML!/ eH*m<qe\tD#?t##&6^9n9*yW99kXiRu?+<Tn^qS*HBd>pDI!d/C^hLTYjX%!k8d5eJ5uqp@Q$HJ^6S%y
pYN@:Z >&w1FXG&=Z#8dZ+ZVM!B&<XHq=1qV$HtZJ+j$d6Le?J+#P&DMBjyG^!<&5$tYVe<uqinmN^FMFHHp\iY
d9%ET8 1pVQdqw8p*Mjp:@tekVu5K/I%TJQJtKYW:lIdnP&N6+>Pc8^95W4P8SWKB<6l&@QaGVG1S@NVJNelPyE
6a8&FL 9jt?=ZK5I>HlFw*$kjH6%k=b:Kt=t?m4@GPbtNC4^dLLe6ijNPI5>\DNekh+EFa<CVKMKRXCGT\MN^G=
N9$9pp QaiHuRX%e@K4#<FtG&SbGXLq6aRmGhS9<qBlu>XI8>wCD&d$FQdBYETF/9F$h1#MSDqt/nLu=tA<@D+Y
<t5:X$ %#G&&&*NBTqcK4yEEQ6Jh%=w?H^NCip4?&C68q@D!Z<@%#X$>\BQ/q>>#Z8A66HL6H9AXk#>D:PAP$W/
LK%8w? 4Ie+@n8YEbJKwCQu=RkK$@tFtJX$/:t4VN45Ntaw#c\y^Iy#m8ABVE4BRV<%<:hE@N<?#+T^4@KkI<KX
=?=+Ay j/MkEHAw\C\QZc%aj=$uITaPu@?=TPG6\<nqq&T^=PV&i6*Q\eSH<>QGJMVd5qJctClimp+qh!N9!wK>
yWiS<9 dBK4L^Gp>XYDw6/<1GtY9=:iPP**=LjHi1it#+THeQ5impBVDBhm*J<Y!i?aSH>djbXub$ul%\NeN/=+
njZ4JK =WPNj&PCWJueGN^uK>VASM&BSMcwB1PK*XNNcqdStFyHG6RI1\!dk5Xd4K@/M*w%:<*uAcJGdSqmLX5l
8T5VpP Ln#RP\uFmGquKw&N9jJiQ*?qClQB9NA<pyq!N5^iD^/^p?XMu:?wWQl@W/HC@$PFp4+HkD@j#@/:jKZ/
tyJAWQ H@IX$>@p1\iB@!=j=j<udW*=Q:T%p9@R%u:9F<\d9+ETuK%SatyGtuVTciV?<LWM!E/!QjL1eKb/L+:T
XiE!1A P=Y/=TFVWl9Hl^?tXVLp8^@@cq9cSN4EeQCAtMmFTX!a?NiIW+NjL&muX$PDk!XBmJnc^KB&b48eu&M=
e6N^b= V+Nn14:lP$S>!$XALPDXANLH^b>Bm%/eyFH5a5ELkuMVw9cY*ab1aqd?!AnDV\Nm88MbQF$14?M>E1TT
!$m6Z& CKSY*TV\%RqT^LB@jWZH6e$u:Q%dh*F5HRjS>teaKX8P>\CyFIM4Th!RMSLY:lS@4Z\%+<klc!elw%t*
D>:*m5 pPJK^n9K1S>&L@b^D8?Kj@Zk5jc>ib=il9$cM/p/Rm+p\8MHWEhAI/^9\JAt!w\aji4J%cT?F:*<BqED
TX$lwB Q/u$jGdJHn\e#*YI:Fu#QTBj68w&:>*>@EGNS=:+8*h=LFPiNp4ZT!9yHAiF5XhESj@=a^p@SA88X*!t
id=S5< cPh@Kw%/>SZ+KW@:<4<4@Z$e$?e9J!8y6LKVLcp<E?Na:eLVTY#EuqM@jdD%#n/lLl&pMdhm4d>GW*!m
5R<=Qj w?uTmTLp#5!M4w1qip=M?dA#q=+awnDY/XEj9tdPNba+ZAnGJ1qaP?X6JBHNb6E1Xb<+qQ/h49X*cS!P
$\nPAp Pm*@+@1=1a%pC&16*qlbRPIeD4IF1p=?hBB^cRemCRKSBmVeQHLknuIPN#EF=K^nud&8/&tG^+Q=VTqt
>Yd=mK k<cF96DujmJX64C?MX+L$qJTKu*qjFD\htt+A9dWG\$BhqBA^WT$uWmu+NQ8P?9<WhQ@D*6@GSDZq8%:
GQ1YNE \+XdRjCkCi=PaTG+FX/+8:5VIAS*>&DB*h%CCP:8Fl!CY+ApBHuJ:8=#Yud/$6*u8i@#*L8@WhV/4%y#
k:%Aan 4nHHuG85PZ+nmSRW9<?FtXhEIKC!E@ZJ1/4wTHG\@HR1lL!y8*/I@tQ^!8JCdTiV:&84pFtJm#\nNeW1
\uDZ5P ?u+wAZST8c&=Bp!hQe*A\%y&T!:XIj5^en#>D%S5+$8mSiG:NQTDCNTFm*#$XRiML/=YiNNic:$9LV:B
Bq9ALI l^=^\J=kdHFAQIi^L<tLZQR9#54u/myttJP@YJ!p81:y4Swk$1?qmVbjy9tY/yhh4Pl/&8?y1@MldqXG
?Zh=Qm ?y*tFV=Dw84ued@L\A=hFXjVWB16yE8E4J/!P8pqiF<%yhcYKC:jQI8%D%81QKcyR9KTyj%TyZNbA+\N
cm=lki ca#n:%6c+QE@d!V=nNeyhL8LV><bWji?KZwmR#buZj>?Kan#qiLi<yF^R\a4c9ekebemiBH^uT\T69=/
@dZ$+E 5DeRtCyZRyHEMX%lYJiBHqG\et+twSauCEq#G#9!lal*J8\K1>/yN@p>pd?+!mi@^8kaPdL6*!d!p%hM
1:Q+e4 y%hF/YqeQi%mFJB84Z4hWN9/91&yJR!SSK8yEL#PCm?9Z4ej@yFEM!*%Xhj5%J^eFI^=^JpaZyCLZ8mC
<hNmAW tIbJwcy?>&^clpV^p5D>BE@$$NjStyjZH\:b\HF>i%%&Hti$ebRl+I\<k>tI@F*%p^@1dJ9kq8d*%$5H
lhuR%u V!ht%W*N!Yyc%QiRc?^XLkck9mh^WH8+/S>wwVR#pE*eY6k1JJiQdFWNRiF8Jbu\j$B=@<T9>M5T@Q+X
u9^%&$ t5$Jme<A<Gp%>tZ=VM4c&?kCCyYwT8FY4@:=!taidQ?l%NRZ:\<c&?55y#B5*KcdXDY<Zb?><NDNta6Y
4QJF%i 4NeNN6Edau8Q!VEmK!LyRA1><8X&yTRp$?m\4:N6K!Q=<#lV$kb>eu*+FbKVFa@9WcYwX#4eG@Y?++F9
WPBka^ $<@4>YB$t=ptn$\^q!&jklW6?5G=wBLl^LYCh@N^jb@q=5%mR#?iG!#eA=b\D?=!!l&8uu1$9uBJMNYT
D\e5Li at\X54JnBTFm1$Z&<Bw?nHeP8/?Zldjp&6+L+ucVBI$@41d8am5EDuP=>qC%dt<6H4#I%D%kRh#:juL*
1CEy%J ib/L*hinl+Qq:\Et?B@Bq15uB@LZ+k>iw!bm>iiJnu==wl<@V#V*@Ewl:TK1@P:8aYYdb^Z>k/b:Xd$6
ph@MI1 $5V5jbWCDIQnLH=JJat1KQtBkIX@PWIdJ/Qn<Y8F%/lZ:!mLVaSi>NAKn\wZdVFbNP9Dc%tyqY!\8^5M
nPVHN\ >?5npma*FtY^W<L%YEK6+tWabMl8jy^K5eLd1lyY4cuJM*w:T/9GXQj58@\P@kb\Wt?99?mEpF&EShel
KtSNV^ tI&b8Y\<<YLydTAcu<6Rw*MpM\Q^qytwmy?li1?\yJT&LW+!6Ai$A>lFS*#nibtRp^GFhykntAypR1pl
5V8wL! !<SJEut&?6h>=*$@>hA@n?&DwIe?1Q6#H+^em/niA:\Y9Te=?t+VVG>JT:$@&kn5EZn@@qjqD%>6*k&!
qYkC\j SL&PBL6*hu/b1d@Wp9pR%Sc\#M$+puq+jhQ5cF9jeVZHqpdIyPyW#4lbeJy/NQjnWPukaibqiPn+kijZ
FJFqkB =YtQ?@C\Lp1:NdkHdCh=j*>aWcuW9uuWl=4IL1Zd:e\:<D%k^nyTF^Z%5up4idZQ<:##GRYGl!TL6De+
!%:6<k 5!/SyqVPPD1$iMZ*TG&IZQ/nqkc#ZCd=ppe=Z8MF8ep:Gj/*WH9wa>&99uuCK!6>b&PFq4eypmadRa?T
Pl5?\m #tXl6Mj&%CMKT?@j*HiAcYTcj=i*Il:Gn\J*PHpc@DZSRRCLw>p9I#:ZEhPD%J#Hm:6W^^&#>4!tij5!
>4+/VP ?HyEJ9&Dya=HS8GJ%h*DFi8$96d9c#uQ4DVa%>C?#6SI8*nFNu*bX9&phE>X$?H!qn<V%T8hc/LC?S+\
DlilBS Q45yZy68MeQ9Y&d&Z8*HRLNL8hW1*K?:=*:t*?t:S*/wKuCZ@EL5u&\Cb&&uLQ/G*=yka#kJP#+T8\m?
-AZYmM 0008c93362b001202b4 Page 158 of binaries2.zip
CwdJYu ZKeHcmZ#j8F*N^H@hht69?\Wa98=:@d@?#!:ncD@G*q&h5uc8*@N5?91k!1F<lPtE$Kl<i5RhdBYwkEL
KTW8i\ Cc:Wmb>&T=DDC\qPakhnRw\II/5PFamEI9k\BCAa!tJa4C\&V$Rn!E&wBRK4Y%<VB5Bk**WE\uVB>w%J
=jka^W 1*j?mY!u+EAynA$*JIcFP^lYY@Admc/6>PDLLlq>l#><Bh%kX%\%k/?knjRe1hW/Swn#1SHG?NY<Aw$+
+9^cKE nDdi^>DVDWp5$iwmE>G^k&?>ZANDd&bE^>i6Jh\CkVSG\lYpERdce&ZLjj4#BwqlBPyZM18tyWh%i?bl
a\HFny miwRpPLQp9blMMlL!5!^Vi6lww/w6\l\>DM&lK6%ZdD++>Q9iPWu/+qpqSV4FchWXT+n#iDF9^*bD:LN
>1%\\B ZCEa\PJTRE<lJ+teAPkN<^CkJ%\DMLGyE/jY5BHL5MpcFXF@QMXVDd?Sinq>Ia*eN9+iKMN6JC&<$5c+
ZmH=k! /cPEb^n8NhN\$EYnpcGDjtPJN<Fd5k=pyM<TwtEWEu6b6=V\Ed$?$1%Xpjwpb8P/d+/n*D&4:bwJmKe?
MX^JWR $J9Iui9lmt<mm%WEIdJb8C&LC5RLt!LeTDFq^N^$F>ZyAhb8n**eB54na@%MMYbTHYyZdBd6p94ibb@C
#Z#<nL IW<ahV*:A:9nB8/<\/1$$EyK9n:*8WiRk5<q9AI=e/AhLMdkH5S?Fb59CY&qeR*dLS6?AC&1GjQ8VGS\
DtZ5it S5<<tX#k%hbYuKAyJQ#5$@5h>S<J:JjG6y><T1<RJ?STIlFwDjLKed4%hG4jQ/G4\/cbuB^CV:EVq16n
u?bG5n D%KZcb+pb$AhA&B#%W^tG=AjPPTZj!/G5:^Q5dACC5$TmGDLI15J9#c^5/+4!u&PD5QAdlhFDI@*>bmI
S&wMpe qQC44*uKdiHeD^^h<6+*=Ye@P5EpZ?h4#$QGJjEEZwYnQ^MbjpYT^jT!=4wFD%EbVwb&5lAY5K<caweG
=1%1hW miq<K:+XMn6lyd#LI%PaIP^94B$wKe/^IR+dV#=nSMqwMM:Xc$wL^G/qRLPkiC<y5S<XwWX1ZGGITW=F
yL^\ck V/MJ4WJu^nAQa!mDKqRNVeQmpy<Eq?!L=cVIpL?FD<QlnA^NQ8\?LEtWNZqw$IWywejPeSc$Bb1jkWaN
SIubuN Q<dHdKT$ZXk\upmE1kK>*\cjKbj&MR6PG9pl%SlNP45=BSbw\dndC+bL>4QaP$^WLZmqK/YX&MVW=Wyn
RCTGyp V!5Qu%HCB^JqT*enA<u*B=mupLAwDKjIjKWb\CV>nb%m?#ucJP#BIV6TCLV6IX*EFJ=P^AJhFDyQcIaE
*u?I\h >KpDGiILAcu>?KRk?HtC^L^iNGLcK\Gp565lTb?P##>R1ad=mke@t$bS=RTqVnDmNmZ%L<#^8C4:hyC$
?!eHAu ^R#nY^:+l^yE5PX#eTj8FiNKJ/\#J?E$PI>WL<n5nYa4BT#/aKZJ!@bN#MDBRGeK?=BAnq441N?mD?FA
ADGm&H j+Yn?WSPnkKQnHHAEH//*IV*FlmqRFAwV^1+TuGBd<nARGpw^iE$H\P=utl=+qu8kqF6ile!u@%GHKkB
$<<@Gm bA8iSydP>yVuNMhYu=bF&cnQNnKjHQeDHNmG?>Yb9CZ>$JRwneFE@$N4JMM\^=VY$nRB$#iYp:ZTqNy\
jHKlqn !D<6CYL+S1lS:DthyEaM1k^Z9\8Jw+bX1C:8G!#+m\nki46BdFaYl!VJVp65!!e4X+XuYR8mlNQYCbL5
hFDI@Q #ZH#QhS+J\GbAdSdDc8\eeR\BhCKR=uR!iiWXLGh*t$AH=+BBk+j5m*>PM+N!bKlV=aJaMe8?pm:\eaG
%69qwt HRwy6Bk**%h4<>K9<?K>&^n6$MSS8wZJJ\jpFG?L%Hy!5i%kC*%e?dj=WdB#<bIk+qeGte6dW4kRA:8/
HLk>!k nqqaM4HYM85DS5c4c+#6wRy6JlHeWYdH8eZl/j^EuQ:*Db&udJRwhp!=DDXed^SND>1Q=u6XkQZiau#a
!TRHn^ BkdnX<?cGnTTplK=B^V<\%?4jlHcWdX+qckME#ReVi=VF5?58mKnMeM+k?DPH:Y$+Rqy?anh@qL$/yKM
hNi>lH Wk1akqBEbJFmw?A<1#+V@^RHp/k@aaIyny@I1pC/:C#LDuX>^QdkM=c9RV5p%DEJumalIta/a=uX&b>A
PT8$L= Xa^K6PEtjt!>@8yANmK$abwcDl+P?!mQEGH6&eqCTF\Wu?Q54P=WJ?MQ%c<V$%KE$mH5?eP4&5#Z\ER@
ky=cT= %k%1:Qp9CbSZkl$j:MthGjdmuQak<eTmQB#+$Q:eQLw^<GYG?IGuV:>LSQyupRR&#ZPyA5&96CEp61IY
cmT>mh qF#yNtJ9N!*DZl#&%cRPJ%wJdXK4NDTw%nhI!Y5WWlVu6I#:J/h4Yu9SM*LMEHPYlT^uY+kn>\AXb8@Y
cP@K*6 bDBFAlK9nRISAe6pWlY1!P/>4X#Q@N@#J&1NJEy#c:eWe:5Lta<G/WJRJu%u\?E6B!pw*6K88=F#bI<e
LWwm4G 4*4Mui<66V4aQ?FC^iKI&:Npd*PBjR4w!b9emuk/#VF*=$CGh@qT/>cYa#$nqESQ>8qIYaFtd+$j%ZIR
98A\He +DNJ4cl/AtQB&EynThkQ5I9eIFRVFiPSt%un45:dBTHP#!tJ1\m>kV%+d/TL$Zm*X5Rwi:>^m*Nja:DQ
Rp945: 4Ie>&?D+DQhK&u8WBi9=Mc&h\iWCSuT>dw5//hZ<V6Tp%bcMpi*+!im*Y#GR+ptSSKt^cQ?GQ1&yRA+/
T/^:pM 9LCdum*hcS=k/:PeDHI!R%aEK5qwnapq&P>P$/wX45#cJacpwm8bm#pp8#Jm\E#G$u#jmc1:\Jc5uAI^
C=HLe? %/<NkW#P1jMqc>hP/=+HQDywBypG5dhJ6$BeItiqFGlw&G/6&eitHLplqA66EqPlEutaK/kwCT8X$&hN
=8t#n& GX$$K^yDJwK=bkR4D1?4Yq!n\JJ8c61M81&+9tbJub6A9Zj8L@qNp#wG<VB4emnP=Lnd^4SJ/KTFSYL!
Pc#l!n iuh@jbPNFEcZ*R1Y$+mVq$q+1@MqBapyw+m#Q=!jnGEu4#+&6$kwykk*?$BaW1eZm+pZBVtBj46%id5q
uTW@I& H/5w6Wk4qAIbJ!56DupMu<nYF15iN5bLjqblnqlJVHR1mnB:X/Pyy*=iieI5=Q1>@P&/TCTLat8CmD+4
??L1%y 9NXNWMLR9:>&=jpj^i*@dTLeZ:du@^V<6lj@#=9+@?W<8d<6L99j9DTul$@TF5bPj=%e<uA$/=@@?E9y
#*Gpl^ Z$:8Q%$jG>hjn8H/LTQy=^>@9mA&44?\4ht+8Q>WMaCNt+Z%9!wGm>m=QLTeqiY@CY$ej%d?*bZ?4?5D
KFc?Tm @Kp%j$>&+?V+S:IdJ?ljKuZM!jqjDYj:&%LHj$tw?Q6Wnh<yuQ8Z*u6E@8H9FM:>HjW9aQTe9%M+>^@X
u&uNwH Q=H%9/@tiIV/X$X:PZ?ueP+@16ubjwGX?y*C8j?w@mYM/*eK=@/n?6i=eL>VPjj*P9$ZcZ!@W#u*h:1N
GDk&>9 ?^j=cH>dPjj*EyJa&Z/YZRX^eLM\Chud@$^KalJtWua$5HW!NZF$@JtXJQ/#*C1V5Iu#K^MVY!bue^Mt
#?T::A YRMniTWtA%6nJnYLl%>/>ZNR@=9XYNpidnudd!qYQ>9\mF!q9/*t?@?/F9E<?FQPu&/V+:iGQcbB:H?Z
SJS:%b jQYZ&@6Qp/@?k89/LjtKG@R:j8&9T\@@X*qbLk/8Q>lh@*9bZed@K46L<M?54WEbkGE$ZEi1IpE8TuJS
E9@\=H B=RWYD?61^bSG+@%J&8LapSalKKlw\uC!Ytn9IEN6LY&SkeJlej#N8:SJ@Kk!jRdE<p=m8lQnHdIdA5G
XIp&FZ PZW%>MLBDD6!K+\c!iHXm:\lFR8TlZ#tHXQ+pdw%bcQCQ\FZl?ZC>@=CnGw4e6M1HX$=Y*DmcY*<?&BI
kbDA/8 IDRjaGGT@aMbCS!n<y+eJ*d*%9CMKmW<N6\IIVe/C5nahn51G?^E#IG1+m&*MPyyQVXV\iBA!HXyNV*S
bLNa!* h$!WqF\5XPSAQbQ6lEe$5JEX$mM@bQReA+\&4&WZpV&8=D:eWXaZ&X9LJ#!k>\WND5ltLkllEmM6W1SD
c\@pk5 ldDa$in/%l>SD\9=&Nd4Dj6^5RZYwl5^m#JW?YQ#5Phba1MhyaYV%JWQ/+F#HN+<q?qQ6CE:/65eGZ#B
=APVAD :XC1@AJ%HSD/6P?w^k?d>?#PB%84NtclmFPl:G:cuLMCu>w+P5/bEAFD$Vhl&<1WQtFw@ypSi^ATL48j
ZjAS:d JTikAtTq?hJ!9:qF^iXy*ekeN44D>FQp#&Pn*6mkFp<WbXCnhmWI&=GV*p#WVBYBtp^PY==mYp/EHIRN
SqCkNM =!8LMhdQG4DD1T69mcF/>CN5^uQ%%jEJ?+=d/\nI=H6ym5+/FGBIT?wenuNn\bbGTA88Nu=kuGjbla!q
H/+<QN VuhGh!5AB5Zd:uIcZbDh\%ui=tnbEdDH^<M\HD#4+HyjjiS!##j5CI=dXB!5=&G1nTQYhdwDS+9=$\R!
QFmNX^ yCh$^q1mYGV+#cD@EMphXwa9autjpI\DySBnN:KZkp?h$JGTM1lT9G=B+CSXkFEmENk:9XymbJ1i9EH4
AkFpHL nedDA\%aI^dBhAbXniR%4<&Pwmt&?%k1uGhRll&lEp/L:bPP618hRT8IjIXA5yaS+PV8TdW1XEy:8u9M
>E\Hlt en=*DZK@b9SBS%B*5@CX#A<1CKKASy!<k!tVW:AB4=Z9Kn8K5BmkXTMNme#mH95wp?kDQ@k&Bp^*pQyQ
H^a<6V cJX/59JTL?>MqVGE^lIQF4w\dK8Y$HJCWT!p>Dkm+pk9i+bdTk:tF=Sy\Zw>QC:deEl5M5\tG/BNmFtW
VkuNH: B1=6#Dudc+S>eB5YK:nbqm1XaP=?IVY?XVn%jm?+6Q^=^d#mnWn/NCj!65+\ilj6GycIq9tCdT<HdleF
A8b>9= BNuPIn8&RFZSTFj=E:!N?>Q!$<Qb!J!tDFtVy?>W/ku!5YNBFXRKVIF6lbGmZ@!6dAlT85&BclGG9LXZ
QVZTh5 8N\8:cN4SLSbeyy?1aEjPcLw!qI9$Ehq=%dFwABGYjDj^SVB>$VFXqEJkn=e+=edS?dZadu$8y+EcqXY
d9IW#w i>*&?96W&XQmRGAiY*9BDJJhdbdyd1JFQyu!ebAW:YA6!SumP+aCnQhN$8VDhb@kbY:6@WJjIb6%nwRH
NRnV@8 #hct>I\DqaY=+^VclGqNR<K\/y^<dSl%chXd:?mqK:RPXM9A#5q6Gt^jcRADwVDmNL$W%6FG%m:SNhmy
ZB#eZZ GCu+pa\>86$%Rh<?cXn%&XWT8BRQ6mQn6=RZb?X6%M+4^5k1Cc6W^ya&FhSbSq&QqhZWX=eGqiyCCcyE
*69>SC MV58yCt:m&G#j&*KS8ImML9Bp%6$jMJaI5w=BJIS1nGn:\=#1TqRQ=$TSnRF=mi>#BLE&SB?#%%8te^u
BG6P&u =XP<^%ntWH<=%n#n5WlWS>9&qAid@HTMnml54y&qcDJwcEFMN9>H?%qa>Z9EY%W#BaL*Eph4MDnjQ8Zy
pZ6dCK FEwW#an!1y$<WZ\S\u&RN!??=dm%L11ea1@cSKA@j+\:T^5wPVB6^C:LNGMb+8nE=1BwdZ&nui!YWW1P
yh=1?I ccTtw4P9<k&Xt+C?^Cp?884!?\B<Kc:BDQbuQjLp@t@#ZQAT%Q=w$6Y8ymctVFP/>nZP:hbuqak1ncHp
qN=Kjp hF<\VWM4LwR5A81W5R%>!m/qMGmQC%S=*+$iYG<Xj^ZI^BFNMbNd%PdZ$J!l@GcVhu:Z?NGFyw/mLTZ?
cbSBRP 9IJjq4JRK9@P+&&XmRZ>IYe61FNW<T*4:y/TcqcF:?mW\=E?nRpGS<SP^plX+Gd!9GVcEdhJ*=QY%Z:#
iSj#KJ d>pSc@bwWEqYNMGV*+tpBNV5LGpk&JA<Eh<NmdQm=<Z?<R&=ReTLZQlZp5b:WXFctb!>H$t%hZy6/8lT
nJTeN* uE1>GqM%6?YW+16HS\Yu!T>d<nTqXlhN#@1aeW4jNd\BTy\!8m*D6FqhdV>%ZV#!WbqqYB%8KC#9e=SX
-A\bE* 000c23b5bed001202b4 Page 159 of binaries2.zip
SdlNEu /*WquQGE+#%iSG1mQ&&bJ6@V8lmjKBJXEP=\VNc/GZATYSF9cdb<+jZT$wBAS/W9+nPNM@bMyyPT918B
jFQ@Nn 9DDc#wJhMFQ58Q9k:8\iDl<%mjcNl$eH#^8#MK9q>Sj^tLS%Y?X=SQ6d!DDtN848P+R6TBh%BVi8Eu\b
%@w?YY 1t$c>5ShcLZnepK<R\EuJXFTlYtYS$JTGXhF$+QNy$1WFw1W=DT1ViLyTldERiM4%VNZPey^>#JTKR=b
biti:C 9ta/4hF+R>!dLjn&jtl$DIu^d/XFh4@%FIZy==yaD\ZnJSpW!tpkZXy&lS&c?%aFp\#VTiqT*Mw=#&wh
$85#cK 8+nCG*YGZ>&pjBW9t?%J^eXwT*Z&Du+/BZtjjIKt$KP<V+=LjY?>RW\a#q6$!6K66X!F!W@S:T=LR9lF
m*1i+u /64PCXn>4BF=*X9ZLjBc*+ll6H^ZW\^/nn+X>jDdn%BlHlyH?HCkCC\Sj?XX6VkbG@uX=ieIpRDlG5PM
6Ka=bt tkJSt%L8!+Lh>%59N\bt+e%qbQWnNJ<$SZhjjLDqXnV*RDK!ynilk+ZX>9a*j>tLAY@4PB\G@>a@=#QA
YkCmue YJHFW#PG4Ga4w&X#m=dEBp+a>u&yaC65@>\t:1kbaDRj@VSa%Q##>HR$en\#tuKk+%twu*^bLVB!<k!?
uhcMQj P=:yVw$&=/lT?GSpm$^\N=FyYwqYAVXW>X=Wu^cTS\Nh+edAWmjhk\LRd<&dDWS5B&X6wGXNaR\nSlid
q8\Ri4 S+hjSWyY1Qn461<66&<&DA+G8Wkjh+/a?+i>=MVk@\lWD!/%lP\FYEZ?\BZWDBJJcq@V=DSyR\IG6S@1
Mec4Ji 9wa^B>M=etjy+S!KdpcId%9=wF1nQcH^@IkSAJ1k$c^PmQayRwYdRN^V%n^NG8tikIQ6lni>eRj4m@hj
JZ6X#1 SM1aV^i6lFZLSTHuli&8LPkQXwqaQR9tS<6ck\X$l=4%h@jQByu9jD#\cYbhZGKWt4jqZPp@I\:dn!wK
ppq=#p ?\+pmIq:bw&EPGp?><#/YiV?bET8AVGG5eepK6Dc<RlX/pLYy>X/1?:IQwu/I1=<jH9+tlWtjR1>B&Y:
bJ8wdG QVVP<m+@V#=1l<ePD!JQqGdlnhL6nL1ulT4^FMkYwnb?H5>!BeJ\XICQW/SDX^u\K6u!W8&lSWXWw5ZI
TK9ju^ yII#=$Qhi46B5S65Sqn8Fn6tCLSnWYK#wN+ty^>w15!hw9DSNA@XX>?&XF*dPeY$@R=j!D\wT^k5!>kV
eKLaE^ F!?V$Sb1PStIR!<?Gq#$Rp5!T+up&I8Yl*YdLq%m+*SpWp5^S6*Cu!pjBW&MdX1iJH$Q@S*6:KG<$hPk
MA5V6j l5QnJCXc%+:<CJ/SC<*njnpqIp*>Je1iA9&iHtyGKuqdw4kSc&j+dLd6kqp#Ajb6hndHhk*+kpT&E9N+
!<F#<C d5@+p1JkG=/am&^te!YYI!/q%mN#TnV#MWb+\N#\lw#Fw49k<Qtb+6Gl<^5nPc&n^d^V>NVhcA1dPZd!
WGSLBW EnTujVnABVBj><NIFFB5q49M*n%QZ=qe9PIwm85w@X5jQ%B\WC+M4c^WP:Q@G:*#M#mAI:pn5El@yi#M
k5Ch@< ?k*t:l9Yy9pLjweB<*iaW^Tu%S#BCck:tT<C?epEV&mhM1t6jGa6/8qlDJmujN/!Q\FFS5#tTnD5j8iS
>&&/== jCuBd55X!D<u:j9mVFqVeMWTTZNecWTTqpWnXQ>ak8+++npI=iL6hwRnW9$VC%S^GBI&TJX$8D!YQQR%
/wN:t+ bq!k1Bi9R+u+\C65CVBcRb*EMXwy\M@c?SAXi>ecMFwt%w%K4i\bwWE1Bl6nDJqn9Tm4l=/N9EF6u$hq
@\uIZe VeE%*8XCkJdaMqjK#\8EKRE#FjDRHDhX1?HYk^#nm8WGFc*k&4W8qRMDQ\waj%WyyI6tiM/HIpcEEAyu
PmnNCp m1RYMceTi\FpA#uEHyH*:#n66mXntRibZ#m6#Wa=91#9Ib8\Ga?k8RGBM<t:&n\t8hXMc<qXLJ6K>Vp5
$8jJ@8 T8Bw9&6nZ*EwCm9TtPHB*nu6:tnq^85BIHGq5>HkqY@ail\kR^q:GD=>e:*ClDTY1^e%hYYBbQGj!$:R
8u#P/G $Zk8l#MQ6l#lYHL$VXiw5h>Rw=?GH:@I6RbX8tt6:T1ci1uBeTy!QqPGp:E5X?a8AGd/T$H/qI\**YCS
J*B!%T iPDF@Zc4M<&w>W#P:R\dIwFmFjIm!uq>wyuV!+j\*\/P8>T:GA4*>ml5Fw8SA^RAm?qbbq!Ckta1dh<a
uuiClp :6JuB<mLaua&>R9ES%%:+>JD8+6&k=1#huQJ+%wCptqntA\h$E^aMjX^<YV6\mt5bnD#9tNNCHFQKL=C
^QtW=Y wqjF<ESqRBPQIqBHaHud4%mt5yHb+^PTK+%Nh@MSA=\h%:L>XamASl@WmIdK>VL:qYcFCA<i5thP/KCK
ZV?eSj CqFqWSIuAw>\?Feu5bl9ZPJi6EP+KIejR\^B#E4wkSihjRF5<Bww!CS%J<9>MVFNhwe*NNe*mJ/B1Fk9
8IQ?MS ^XIE\<>iP^>GmpmXZS/B<uVq^qKIG!5>@jY@\lGEm/m<Dwt*wmV:pY96MXd\ZZZ^+>Q#\MBp4X\i4?mC
l!kL@B G!e&5IkB*<HyT!Y@n*C86!+Byp4VhW1L5k//*HZR\JFBA\\u1*n6?F^^BZyXd?qW#\EG8G%&9<$I:t&j
KYQ%yA +=uPJ9MbL%5iRWbJ1/E$\c1EpeC/lIA6*y%RiGye9>%d5ZuM#?#Zcbe?L<$1NwM6+SCnew!t9inaKtnh
QDV#AP jHEC*neW%X&%&@i$VePQMHXdb&@#&9wu8?bnPG!u&NCiTu!^%Xa>LTq/\m=LeiY&<uc?4iVay\A=dF<p
B+>Pc! \#\MEQN$Cne\YdP\:F\/QQ4a^Ry9VWJ>:yX$1p/XTw!KdDVd+ZhM<c^I#NEFhJ*<Nqj1<wkW\wm=twn\
6qZwS& KS\iRw48*wM9cmkmnDE>5Kdd!eme9jFMw$CuKLTE><VF>bT&K!+Q$>pR+I#Y!/?yq&e1\it:94Jp#h8%
CcKt$m *pV&wM!A4SMuR#pq#*FJJWu$SHT+A?klQFa4a46V#l1\w%G9EC#LP%k4HNmGP$NyTWcJBES*cK/<W#WV
??e5WM G5+?W<59KHRm*Xy:@E8=/S>NPQij?KGPXteI:mT*4&hE=&J*5aYqHL/PD^qk%\W*j$WT$aYd9SAeV&WM
D!cTPI =*^QquWIKaahE4Xnu/&#M*V/DC?GVNXVNu!LkN$*=?4\Ydl*iHLInJWE@L&Ai1dAnGwkbLb@wH9w5?/1
a/WDpV =Bep!^!+SZ+t8^@8DjtEy=!GEuG!=knYnIlJ6MNF=/Q1mD%G8*i>1hW?&:B^%Iw/?GVbtChPmd9t\!Eh
\VlSa\ LYmLZ>y<I1c9GZnK:bw!EV%tS1@ADISkYSL^Bu$^FBhj#NV?>%AX<ZXlM8Be1lA$T!T/%I<Xe:WX&>my
Dtc1R< jRQXt1ZYcGt<C\y=A\S8d@M>#W+>WK5?FuSw&tWpp<m>L14RW4py=:kq::?wtHjeMKqD6pt1hQlEj81p
d+eNt@ chu>\Y\D&H<B#Nw5X\FWm8W@D<NFTZQT=BnQD6kP=V4&l5e8JSR6$6VRSVKTK<\yy%q6eWZ&9$KV?4=w
=\^S>Q KN%n$QJ5Gmbj4t<!#KeJn8Gbp56KXhG*5jCNy9h4<X4:VkQ<?#A<ipu$AV*J<yINP5:e/wAh!MBS>pZQ
#umN&q ^:Sc$!YRE4BM+u1S++c$k5&Y*b?>W<R*?:nT9mENDapBFytCS#+%iltnbH=!*><*EWYYEud!mlqh8j9T
9c#<Pu e%e^6W5bJKiYSS@m/djVlJANcLYKwi4W:lQ4qBT?y$Z@NRmRp?N@BAV+i?YG@<X*Hb!e@?adBG/8j*!D
&<jQ8a \M*=4:%B+Gd@8^eHj\+G@pPa<ZhC+H>?&@KIF\ie*I>S@!4<#5u#CQW9Z^^\5V^G@c9j=tJ>lB4E<\8t
AWL!=X &8>Wc@+h>c?And>V4jq*%KBj6S9$GQY9K1j<V4Zt*%G#@E4N?Rk%&!<1B*N!QedYj9*ClP5^^5dG?k8A
D1>S^R H^jQj/Ltjw!^@iR/@4:/Wed&m*LNuN!QMncYZ/q@F?D*#=9?TIAjmJ&EuSNEAu4\Vi\Qq9GIq^y@Y@$b
=89ESe <6@Z<W>jc9\FI9j#yRaZC<@99NV+/:4Rn!ZK5ZH?n^Lq8Fq=iQ+k!9%BqQ8DKQeHWi+Qw6\jSLu@p+l!
#$Pd%W pp/tQ+q^j&6<+*@?nQW+uA*q\/Hij=*$@Te9<KjQTDiQRuZFdVn\Zp<^p\9%?4%*:6GWw>QICIPVyQKB
C#H^lk Tw5u:9Lm<W#4@u\@hZTV%4&#6WLNSZZG$<\XPnLRKte48?FRIAjc8mnPK5/ZD>J:?Md#>\=!8y@?i:Ym
i6W11Z <9Te\+*>&?F:\Fqj@B%d^#&APl/S/t>M8I9??jHL?9Q\8!!1ATd$k%TX*4^JC4X+ncCIjMPI@9KBZM5Q
DNenZY mAJQC5T:mc?uDJemcbb9Xa!d$!YRY&VCWcDZQ=ywHhGFuYX9u^=cjXDp%&9e1Py=@RcuTW!JALw\\SAu
4XI8J$ 5k6&QnAw&Pa:pRcw4%EM6*HP1&RABb?JuM$9=9^bJw=/Z!?lp!@X?cLM1Z@SclqL5YAJaS4<ydTVl/$:
+Q4m&l YMA5K:9C?&G\aKq4i/k/LK+8><:Y+kN4&muNIlMVP1iXq#cK?Pij&eCCjiH#m=ADJMPS*$cT8=q#p#qR
:YZe!1 TGyGdhV%DYV*pEChZBI*?+l*M<RlcdmGh!6?5Fk%mIwYc+k!@*\><\X9pR6=lp=GbyV?S>9NGJ%Ld!Tb
StN:nN GXcQR:FPjc8jeSlN>pYaBK?VCYNQPE:Ylln6XHcBwuuaFMZdX+&9cLG4^+A&^DSu+HNt<9d#?bKMVPM*
#wh8MW 8Nh$I$+MZ*S%Jn+6pIjm\^FX=@u/B&jbpl8ellFZ=$ypWLA8:18B!^*uMEG^wAwn6!T1+Hmqym&CSQ\K
?Yy&Yl b%IHlY9^G!S<+KXiZZZ*1aM8an4>YG^Bh%V!%RVbK:ZZ6/KJ1lFwQ4uXl1lpD@N\+5FJ%bC@YIPji5FV
aGaDky 6WtRLKE9yjy#?ZhR6/5m\:Q9:Bq:R+9p5YNSNa$%q\pNGdWTlF&*/8mGhIu=i5VdN:=1!9b<mc/\jM1I
QTP^$q wwZ!PtRnMIhy4jp!MYGCeQPRNZmwCu@T4uKjTJXbMtG&IJCd\<%ctjKF!&4S\?&a*T8WZLhMt6DXaeW1
h:Q>R= P&E+1+6wl%HYlYdmwM1K:LPhV*kBm:8DG@aDalwE%98/uAep>jIE4@GQW*muFN<DbyY?W>\Da8%8YeHd
llEXut GnAAQMXMC/q9*!Jw9\nePG#hA!K19Ai&PyH?P5HSj4D9S#Tnb<:DeEK1pR=+WX:u6MIPupRnAYB1wC5t
Ft@6*F :pdpp4>w5c#T:wGQ6b$KnlI*VdZ!Ti>5lL9E%A9ikG+N8w&CV=X%=PM@h=uKQImS6mJCj&P+HmeYI*L=
VXF+ey FyY\Fn$n>$J9ahjDWQb=&5J*ISPM\E%Xie&hDT+$BjY!5EbMyR%K%+1:yR&FVJ+B>ATL/8Nhdw:y@S98
nh>wRj SncXCywuLJ!X<5?/:NS$R+@Yc859Vc*59!SqdIphuD4&^!F=IKk5?BV^iW#h#\pWy5!/\e+mM1/+^btG
N!\JnX uY?I1&hGe^aYbb1Yu*q*j8&VjJ1m+d/wtj6E>R^b%5EJZ#q$kbGk4Zy:9?Te/6%h#EJ\mu+MnMtB/Dy$
cWtN#n uhLakNb+pwb:=T#cTkpb/n*A1t*tQhl#luGa*5WK!Dq/:qFVQ6LF%k6kjRc9d@uyaREV@/%8G$W!L*cy
%^V#tA l@Kh^LKJ>%\RAdTH&6^y/Z9^/1Yc51l#THX1ulPn%LnB%X<:S\PBS?EX+4VSb1?tB4idEVVl/a/#nl4u
G8>>&Y DhI8*nSGbJ=#/u&9=N4>aae95GZ><Tek/&1F#d6@\Z8uhVZ*1NZ+\Rl1:kEn:l<qq6\G:kHpJ9iA%C>i
\nEQnN $R%u<ZjmR@eAn5@*E+ejH*Qk#8%#t$*1t<m*h%b>ZSb&61Nu!C>>EE\b8kM4MXTyC<uDIY+:YYenRy8y
-A5+IZ 0009b868020001202b4 Page 160 of binaries2.zip
PqTH6$ @u$eCFGYV+mtu@EW9ZTC8H%?ePAQj^jZC*ZcQR=!%CSha6YRTlHQN?$+MMAulq:IGNPHD^6Z<u/R66<*
mMD\Kk jKlmWRSd5Rd<S4>HRdnYp/nbp&+Xl@9hdNbXWZ9nM<8/B9epcipMXkHaGDKHlHnM!n#*G?&IA:qdB/%w
R4KmXy NuW6Ya:*FJW9&bJVRSDJQK>1b+=e\Ah#K>%Q4PQj\\a*iQF6eqIN9M^>ndInJ6T9q+9:#BC&t=bw*Q*k
6pu8L6 A\8p4aI*YSyy\5yt/QVi+a^PQ*>^%Y*n&V@*K6Vm&d5ZybIhBjdRhNlwFEXFAlnRGe?j!qm9&E&S!yu!
MiDb@l 4IdL%JTRMGV+Z<6$1&&w&6Ywbn*MRj8N85dXDSRMV61KiMjiD9mPS4HDItGH*eX/IXARX6Ih6#mW$I1!
Ac8GLQ a%J#6^d^y@HTSJE>?Q^nQeIw#Iid=b:>d:tCyljpMY9ilyplR$EBA@nAG/:#hkwjbYT?j=ViBQyTG!iI
D84<@$ DCTS!bm/dwV6ZbY8/w8>WM*FdjuCGFmhwpDb=ActJBXen8t69T:1LpqE*uk@h+Jn$=l!^JVZGEb9FcYG
NFjMaK luZImJtNB\4k?Rb&EH=w/LHuDNCl*/c5\6bEV$WBl^@ZLeYIV6%^ZZEJq=k@k4Qtk>aE1@1KkLC1d+AQ
V@/=B@ 6JVTlmdYci1SN6b95@nDnLqc+&Z$db*4pebPNZ%m%JklctWXtqB$TWB1dXTw?d#5SYctNVQBdX+RD>!H
WPm#RH wiSypA!1:$cFG*Vl#D\4>lL8m&?G&E54eXw?t9P*XV^uh%?LwJ9CD&c>5ej5uD=CV*JNe*HejyJ<&?*J
YQ4+RD 9VXup@mG=1km$cD$XK<IpMBRNw%=hAaQ?&$PM&%EqbNq!IFPS\Vd8@ZhkbGR/y4PH9MZc<ti%iF1<i!<
SJMwHn 1CQ5e$C681@KT/&!D%F>$JZJF<&14*C@uAYbBc%XXWGbpnlJdJN<T%H*:GY?I/<Z$yQcFwd=TA@AMZyJ
QGq9n? iL6WyYl^qHp@5*8$A@acpuk%DeG6*ue:8\i+*kMT/4=H=H<SBR1ZjGIFbV*Sq>\!@*m<<4pAPLW!y&BS
&b?heq jw8pd++n*jjThb1i%uSyElN%pi>$dD@BNWb1iXplLWKF^JX/cylSKt/IQakQ4L:9CuQ:>bC6=#&n&?nG
=Zh&Tu B@PHl:cbq^@F=d?d^^>H*=tQ:D+Md$dMN^MQw^*@A::Ahw=<m<D*ZK=e/y5/!c<T>\CR/eYDN$kK=h?>
N+FW#: B?^E4D#+tAu1V<>9J6It+8<$KZ:pQnkG%4QejHj\yNy*9!Q=T^YuS=P1JP*j1p:qj*#K8eQF56^4bEFt
@kHW%I 4Aw%=:8lEan+*RDYT/\/Im@el45JM&@MumJTX##K49\JlL!ER/>+W&qV=$#q*F4+Vqbw<8nV=/eYV!8K
i#YdGu mb^k#cX:1<GbFunF^S^+@c*l?SL+EZ8XJAb+SlVbwSi9w8yVM>H8Ai=uQK=*+J4/^ma@Rw&8V$KWiXMy
F8c/c& Cuut?R^>S&DX*KT?KDIB=nwuY<dQW*u9SAXW6<=L+lEbi\kuE/EK/S\LtdHCQ4p@qY/Fa4KtmmQ=I4tH
uXQMSu Q+ct^qR4JZl=6ZYk!RnQ@CVBl6G9QD<>l8a>kV@hC@TykI5T>@=yZSJpbPj8y@$idGWlLbIwdNiPqeY%
hPbQCQ nJb$jHaL6=udS#L!N%D=6iiy9Sa?:n4p:tyl?CpcjwEJEE@5\1A?kj8=*WY:6=5VS&Ib:+^Qq@#:1Vq5
?5iI6w hlEY*hW95A?CNHZihV>>/#RemGpe1Jk9TRq5dS8\?+^u>beF<><565*?GbhKY+:LVqPFK666ZKud5DY/
<K8MwZ ebuhpZ@Xj1V@^=58L9Kn4<Dqj@K95ahq?9K@J9u6Z$#%TqNFS\G@6lj99$W+cbQMMZLRF!a/@&m5w&L:
@Tqb!E mD\kdnmS?HJVqX+\kw=4qSnpEb:j11BhA&HJ5GX*%Eu#WXpVVdjpwyVMq!N%Kqn6Q^?A4*RmHL%JpXG!
SXEY\9 F/NmE1c5:BImhDm+1y/DYJ+9!??85Gt&=1n:cM!KQe6EI#t%Td#n=\*cP+%\cTZI>yjVY8yn$<!<!BR#
%+Q#@S $XMGABlYp4i<5Bw^c6*CNuQ4Q4C<XNRdI@T+K\GH$%eL64yqYNI18n6<ptmn6M16i^4/mnQdmX8T#!Tp
KP&CKD n^q>GXdCqeF4SQ\iIK8%RTN96wPEpeS:H9nMCaat@SuV<5bu>cWaqY<$XuL%*HR:T$49ije^q^#>KI#5
mupA>T 5DPB@aeubEFT#/TE$d%iR+\E^D=%\ZX#y1cj*S4=5+Qa+8LkQ#QE^pk<l<TB><::NQie6HRJc+8YyWjA
ebNumR 1b^l?5SN&GnL/5mS^a&C9Dj1PPW9i+$Cd4&@uwd+pMnkBNmyaV+S<<hHPHIw!8e1=utapplhqD^M8D^6
i%!<uD @Bt!aVH4\TGmb&e=b*I1*uY9CmeDW4*!b5<Cbm4klm%@JPi9Da>j\!V4WyTpey<Mid=i$L8G6Kjth!A*
#j?lVk wnD$Wt9kDR+cG9VR1niT>^YK9DW4GLB/1abcyC%LKcJ>HmbISXiP^%A1llA1NHXq@@qA\i$9tP/m%9@C
c6>8S< hE@4@nhD*JL=9^nm>W@@m!G8Gj+Z@De6$RCJjt5k:XZm&::9Qy&bn%ytCD^MT$&T^aT>LRcwl\&:YYka
CuTPCN mCF:tujuZH\*nyS*XDMn!%Zme%>EaMiAe?nl4t9w@ju9WF81:p+/A+lDS=lV:ZKpyec<98k8EC/=paQ^
%=F^YP F:=>\d&+4uwbHRX#D<A@MH<L:%cQq+F\+ji<>McYMi<>ZZ$>MVjeQeDE9/K%4$^nHtXl<Sc@w1&pK6d&
juQLNE !VQKkEP9<m9P=VDj&WKa5S$Bn4Le<abyZRw8ae9!bmdT$K*AdBPj/JWYPJ#uhc#TH>uejbqMG11mFb6X
dE:EJG ^Mp&y\KXu$8cRubuB#>yShL4ASXeXquD*XB8HTwYi=mbGPjGkSXd>MIqNyKWYyWi46VYS8:S\=LwGXy9
4/eP<h JMqXDXnI=t9I5tM?\H$k#PjH?uaW/l%&$:/KnZ8hjlbFqMHlE^*Fue>LCFq>Wm1ZCJy*!d+6c#te/KQ5
G%hJ?V PV^%El^P##JVBbHm9XGSGQQ?mPw5YdF+jLY!5*&5TPG:!SdTAVie@dFF>E+wYPN?=4<i/c5!@>qVe5i+
M1ZuAJ XMMX9%=#4E=PwKGFnEN499ICPD&58&^/1>&=T?#L5+S>ap%ZXWAymuRPI1?jkFQt\>!D8i>BhI=9jD%G
dKSjdC Ltll+\c@$5qkNqj*=L9HQTD9>hl%jtT<+9pliHJ\nyaAi9VI#k$A+!nJcyD+wiChC?\4#8$MYtW&Ltwe
8<4Y$a lIWmmj/N#F#Gq+S*1B<4:CcTMl/Y@jC4e<l9Fe+*/<KJ+1Z*iEYQ5NWWcX^?TI>!L<n!Siu>>e?pHT\m
Hatk%8 *H#\u8V:jK9a!%t/ubjE4T5htKS=dc:jCq#&PH8YhFEl<FjH>DBi<1HNTqIGcCMp$QZ*#l=PW#Q^GS:%
CW*1I# 4$Z@*<PiC6ch51Pw6WJ^y@SnyauDN<BM:dbTq>cm1AnW?BN:Ty+=1VAS&i9h>G!q@e*5+pp!%mqh>kiB
ITuK9u 4^1!Dd89H?c&GMq5dYuL1&CNn<4ik6jlF1+%>MLendn4klY<T8Xw*!\K=*Y%6dR59qJ8l=1+X^dGWkwP
>I9#^J :IMt&n?1K:5Y$#*ypmPJ&kT/kF1mbcebGHZBa8QMFp/a@V8$/nQVIVBkKQKa*:BVPLycK*wn9J#=4!*j
CdYWuE MqNE/Di&W4GNc\wZE!R4+#!^QjS+p?Nc$YYD8d?+iLZai*=?9Q<>X6G1!CVWJn+pel9iH45K^^K6\C>l
pVNdT! GTX8\QpiIFqPbqhTJk&M:WXlC:tK:I\PLcInTKT&A\d*dC<6MF=$N<>WG5RN1Nm?RYSY%<dbXnM%n\65
:6jmhT 6wN+ADYHSD>WtiP+<A+XddwSmGik4IkbJXupaX?p6kcWjQAA^m%b%H^CiX?cbbDlSY8PmmJGJJFkI:@D
#u*uuL =tt&/HQS!ik/yQYl!enMliuh/K!$^Td/5p#&MkhFbFdw>Hm5PB4i1>Q&kd#>HEpnHcphi5q%^EGdE!yu
1J<bET F*eKPKVGmL6=HFl4Y4pAT496<BCTm*8A9KYmRDaS$e45abSCQ<WqdYi>j19Yt*5ApG*1+9$R\u54*1H*
^^=9lI B?FFYZ=\:<Pew:DRnT@D=a4iu<MXN^h/<6u\Pi?8eacMaT8EtKq<i=ikp1Vyak1W6Yni<ulZ?\h=/k@!
m>ZkMP %B@p1V@IW*?Ry@=l%^w*=#>tbdK#54Q?H$GiM9!@pD^qA*CekT@1>Lw8weQ$G/Ml!$Qk:IATQ6<KJM8c
GNKuiK VkuycK%=><Kk!yJIG4qh9/ARt1\XV?cWCJq\CDwQ9TdEGuMPIekkB5IcCTXN$BPM\XIw!:wyk!<6pS%l
DXkAFR B+VLVqbRkAjX5eyPX:h/R+R/bF@\qFiAIh^KwMZDn6u/qp&6KbYETH*WW&M:9RyjF^C&Spje1yqWjHjX
qy1Y%+ &XnpCB+lCaRS9n\5kj$ERDZqYFatj+A=kKWp4X:S#Hw^dEDGiN16n!:Bac:k4tK%jaHP&Dm#S<TmZGj%
FK?=H> S9kk\R+XqS8X$Wi@/u!FW><^pNh#ey+R5#+\A5jE6S5qd6X+XcVMD/@d\caWtqGT^ewYFpW/ytPmEdNc
wFKktK mj:6m:diV^CyBXWXFRaDbayEdZ\X!SpK@Njh8Z/jNIMWmB$KGT>GL6:DK@l$<qVR8\qqmd=6/8#e&HSd
NN4^KQ p4WTKimkphAMEPe$Z^hj1/5?R#S/HiXRy5mXu@wcM%J$CV=WBbc\#5C+q=AmAZhYMckG&\FKeKpEnpnb
ct*/:S !u*98q5jc+:?B<$RKZTYmpkR6k%PY96Z*hG/AW\BTpqHILcBZm<G$MCM<TWqQ&/*l?5TGcNn$Ep8e=qu
m/F:1t yG\*!?*bky/46!<YePGqdhPWWhl&>@hN%@q/WTlA5$4plDW@TINiHt6SNJMFRm\W+h&Djit%LbcH%nnG
&<j+/M &4BG4:i\*D**>jlWW/9/Ddm5k$Gm/TtWFJM>jReP\=Z!LpAy^$#M^J:1!nWn\jEAdahYJmtSwTlSm55t
D=QR4/ 5AK6<t9e%?h$6C#=?bX5mJ^/$np$4Eea@6CJ^<Tpp6=w>9*aCEda5XBl:<TKC4CTtl!*bVD5\C^:tJ&\
JRDCP# BNE/^1n?a^n\ZaIK&FDy\5bw%!TqctFcKB8$+YG8tMZGj6wd=&qYMVntV/pW?/F#tMR^Ey?I#RhyDp5X
RNNXbW G:FYp=N^8!M9\#nBt!?@EL\wlZ&L^<Iw5\&NE#CcP&VkEBP=y$LZw*&I5ih56S>=$ddlFc4%wn%8R9Ia
jASWW: V>t<IFE=nnFe4IC6\Vk#AaaXZ8cR+Lt+DVtYL/Ke&C=BwjJ^a9#kc$=Am#wNNmD:KSA4XyEX?m&uS^=G
p>1ke8 HVVnTZj>CHl@EtM+FTtYA!%w%/epKR>h/k9m8>kae>VRtyWW+AJATA*eSPFDkpLDm6Gt8EI5BNPycE<L
BIZ:a: =Fn4ZJ$IBIl&:L#tWjHT?#\>/ZJTA5pLC6HBi!teR<YIl^BEL41%TJ=bYw&ht%R!NaPq!Ilin^&EK&jW
Rt*&SL SjhE!ZbDXkKi4EDc#TTtS#$D6*l<?CeFnGFtppqNu6j$NY!aNX1+qF5BI8q4GlYDKp+!=^jL\DiT$j*P
\M4IQX L!6*u8GFm$#q&eIhmTb6?SMXGS9J/%bAI&#KYH=TFR*jR*wL#u+&e9QP+LIBjl^hMDdhTJ#%cBljKuYK
H^/^Y8 ?yt&pq:mlH@XldRR^Sa>9AKTd/WJW*t/n6RVyt?N%aH#k%5mZQ:a6/JMGmT4iNBqBw+P%LlXPnIL^6*!
Bn+Pb+ i@y6R=LY1Y15Z<%1nq=RG=>tJHX*JSj8qw$&k6$PN@!L/F9dT9Kw@EZmmynB!cT58@6ucX8Cd?a\&%wq
t+CHb+ ZmQTVETEHVil\%yX1**cHlMNq^*L%?m#qXt8bdIST!/mj$N8CXehP&:wXwMTAy^Shk=Bh1XuDupBuCCT
-AVdN^ 0001de2bd00001202b4 Page 161 of binaries2.zip
8A:16$ a>&8d>X4CbR\1P&Pea#NF<M:<a66k@X8\t@PYka8MYnBiy&=9m!GRFA\8Etm/X=Bmchi/Wh+TwR>eb\Y
ZGS:iH &w!Sn=>mK%R?F@YHF4GGMIV:M%!ZpX/BR*b4d$VZ&:pXE:%K\nhykWIJ:Q#KE4GdJaemX&Tua&H^CI6i
NT#RV1 a6$$mb8=VjQL>EIYw9$:HtM!iYGRY9ukGYAH=GZ/6lC<uekV&c>J4S%Q\:Ykmwd#n!4SFTP:$J!1n/bw
uCQbI% =wtGFM9FW8kQe:SJEBVHEn1Bm1=JS%Z$JP9GG\PK9Vn4>WHQFw/%TblTFV=&$%ZFHQ1Jj$V4bYh+\c*b
qim?>W /Z<EB\?Hb+XN$I$dq/=+:dBRZHSXcPuHbV9<p164t/8$:yRGdZ%\kpZY1VRpukR6WtP&t=ww9&+c>ZZp
pS//!? ka/F?IZY#GmqI^JB$pK\BJqGL*j5+58cI^:8PTei1?n/QSWX=F8BXDBN6*uK^>pk/nCkPn94?yRdBqZ:
wBZSck >wwjtaQ=11!5XnPGm+GXk!Sed+QyiMZm//RP*w+S<RX6TYX+RJKa=?GtT<?LP55RlSyBAn#KXJ$P9^JF
e?piLR 8u\<Luc$aQ5PP%S4CaTAK%Fp>B*l+KhYCL$+nA=DYc+l1B=aS?H%JCncb1KLayjPwiAI5q+Di%ly\SG<
q:8*/a <:t$R\aJ>A1G6/1l1P8!RS%\q>LC&y^#>iE*LDViVZY/4>J+u<1?+YJGcQtR1jd?Jdln&L?81THZbM*9
d::ZE! Vd*#i5yWQjIic!68m66l#ii=6C+WebNYu6$t5nh\$j8a=EweX1^5Z6PcZ/ne+KDCEc+#ljm%wl#H:kJ#
#=!9Pl tjXMmT*mP%X$B\n#nQYL\n*+XGSTRt+RCV1Zti!?SiI<V<cSRicN>k^*F/GC%=QSBn%6GiTlnyanmZAL
W\EIDi :jS<8a&pG5Nm/#^TBaLQP>*NFDu$\qL+\YM9J#VeA&j&X69B@ppTMb<ejMZcyC%KCSQ%Mlw!GlNk?L+Q
DKaNP# 6+AmuZG6F=lZ<KPu+wcMRVyktn!G\iVJPLt?Pe&cNy>llm^bkY\p4uM@qXp$DWQ9S1j5&5iSFa9DjVlA
Ti5K9G lA>X?$wZ:nJA$DGRbkq<bhX94+>A5+JA>HXua<WM8MKaH8AQ8:IqC>>Hntlm1TI?jeX+Q54+GY/E\Y4$
*YL&eB ?HZpP8L^C*6J:l:4e&N$R\eJZ9mnC$bpC6RhkB$+a4NK5&wZ&yGJc8MIe*pd>6&\bRdeHGCEIm^AQLk*
&a4FWB DElHXTDZ\4kQl$C!D^Sjc&jCjt&cLEa!C!\yKdZwqMy=CZ<M&$64Kpk8p$Lq?eJ?tl<A?h\**X@C/Y:i
W:Rt:4 EyAZ%LGYhY#!AltDG4Npw&P65#?YEB*q&i6aSKEIMI55&5ew:enKnHyw9@y<>KVKb:&XbHeS6uFIb6kt
!htG1a L*d5Mm:Mad>ImSbLGaQlN/+4K+CX6aSqm#>Ck4=YXq\kdL#ySd8R/m<RC:6G&&GKNeGM:WjMWtV!^>#b
NaL^*# tDR<HC/d/B/YVuCkc#e1$!C&a@1BQEBWDm>Wh9^64P=+t+6WZwqkaqqN8uXwJ!MEihcEDTl5PA6WaG1W
H&kjM\ j+wQjXN@i4XNXqhE5%Gq!Cb^?wS\@J+II!mddEMe?q6iFNEdSW9j+tQjZ4BT6RKiKZRItNNLDn8*L\%l
qE6^5F +k$6M!@b#51/+m81w&+$DLTe+B?$D818NC*FqML4Wy#qb&TMbt&6XcL58etcEH:=#kdb+uq/Fyp&JP^Q
JS5lmB MecwJKQj@Ca9@P:k^>nkAJ1?ItRtlkY!S5qeJJb<Sq?\+iD\C#^>+hJ:+91Vu:SLC%@Db?uA=DR\p4HI
Yn+d!A H##FN+Fn*LE6anFq*E$@RGPL>FMHmRc!=l5j=#=nwXVlCJCb:XFt/6MEF&FjV=yAhiiRmYCBJJKBnH+?
PZe=bJ +BcJk6bTiQHIMAaVji6pH@8WaYQV&KR?Mm++/w@\DpSk/Zc\IWX+YEGRa^cVtLI9%nN&eu&1p^$w1i6d
Zq#Dbm 9$+Yw\$GewIpjS5?8%u1HC>iI$%TGD$?cEuw<&M?>5qp9<+aJ%ya\J<lay1C9$HEeu/XP<QN>V@KEQ6q
k*YY=@ D5*j+5VaPEu?9IQ:Z$/^+id?>%J58Flb@!HFlw8X=SEyN4<q$@^qE@w@dG@@uS!DQ^QLHyFM\<Q!GQY9
aFZLB# KF\<4I>R@#Kblwj6EiyjW4l+&B?n@qXcCA@wEi1jCRc@4?b+nQyZDC<i#5iwYZ>%^:kiwYd:=j*tjwV/
4j6E9H %?p\QI<!6q@\\:laYQ+nNi6@yGb:qKu?T5*?H/qB@=Gc+#>1N?h@>N8QMdbjEh?+YB=ndP\QX9H:cy/@
yTj6Q\ #>9=5@cj=8*<lV@&Y>+PP?5@=8*<!iZ?Qa!M=cGZ@+CS@Y?Fpbu@D<LI<AbPh:F^l+Z!l6B4B6klMe%p
\Zm+PR bd1ZeE#$@X5BMFunC:YS6TY5eKSNpBiByF*JP$G!pJZXIGcIICiuRbw5PBB%Kq!WR?tLQ%eD/k8ytau!
qY&XYL kE6?H4tmmIYt8p6K5NLFJAW*HCP>AET?QqJ$apKyXJ>uT4qHnG<cNC:IMw9KGE+M51XbNZy9pKn$6Jtl
Y:+Am< *$TIy:diStI!6n9a8B<+qcImj6tqmn8%D6PG*<\=:d\?aBGYRBCM?cd@Kc99<CAbG:4wCAm8\$i@u5&/
VIhcu> CQK!B=ZBASJX<YqACBdH#%?wHqWFmmCaXHAi%J@AHp^RL#M<+NA:mk&bMSmld^SBJc@VE\J#q/dy%/MX
W$BdWu #jp%1:6>mc<d8dF/u5NBw9G$:+yRIc#^tGaAt#9dW<>?PYLH969EhXe4B^ndt+1NY9&/=JQqWeQ#TqAL
ED+hV# 4$4pBKtw^jNIe6N&dARlPZyZ9nI<K$b!l@IjwnX1*b$N4D>YwPHkwLeWCRLJ5tbk+M<Dq\q%MV&:<iC@
^9W8@M \X@&uZE6h?Pj%^yFqy6Yj>6F=\X^IDtC/8BR\@5VWa#!uJwIG!anGY?B:IiSpBVlbac6$NL?q%<pJEFj
D>jQu9 Ki\Y+KBecJ5p+%=lj/jwTD69Zu*:qc#B<hZlRB9y5+kbhH*l>K?Pmk1>k:#%GNiWi1<9dT4JNPaDkV\c
C^S/S1 DdZT+8#y6^1ue*yG+SySd?F\m*EJL=V$/!MFKW$Jqb14+Pn4&VQu$k$HwhS$T=j:MTtGp!P5Wm$HEW@T
NY#ttZ qaIY=M\bIbJH#+NWlm%G/GJ+!=tiyBd&#/!V%l9IhNRW^y5ljnKt$kdZb?j$E4lqhyPB/D%IPMmXb>ZI
unG6D! *LTFEq/TZXIR\hAZK$IClRn#K5w*Ykp=wXK^Ci1<Jyde*MNqKDiDAj6+&a4^wGwyPMH&I8RI*#m:TuFk
689paA FbZy/Ce4Ly9l:hlWuPF8YZbL#$1ey\$5ebGESIcc!KmLjpFE$hP?/YA/jHF/6:ky1DA*1#nn#<XZ=hSw
1b4w6$ T#lYI@D<@eZM?ITid&IQBZGL1ck5*+pIepJXKFV^eGaRS:\^l&A!>5NQMSydM*MGm<5XW@yCJ&<1GpEa
I>kCue t*!KXk#n*5@L:IZkM^iCJ8a>MmR?9\pd/W4+MWJRH^e$QEQn4#?c>@D<XEY/DJ:4HwkWnwQF5wB\eq<V
Ldct*= jZ/6#nq5#qZCaqmk$#uCH5ilT9/%G@t=eS\ep+iHjM1+w<dNDCeRw*R5EVGCT5RE#dJDSL+Fk%5=:Zuc
n6P#B$ MMcM^A!/lTyWTWdR98>\h\4:V8w6jJTJ:$9eWB=C$P6M$u:P$h\MM^1L*I!C#wTSC^iJDA=M^uDHuIu6
Bt:i#4 14=hd1QC5W8!n>@9SYewEZJPQbIa#B\p*u$TBNhFAjlFFjMY$*DBhhk4BJ#$Y6V6JBDMMNhWpNj8@kih
^aA4%b wmu>@VtnbMK%H#6wCeiFml5aMk?&>Dwp%HaAii/JJ5+4Fi^dj&Y/%<KH?cRT/%HNE4Z5yk6ymDZPDqJ?
Ln*e?i kFY8?BHbh\%^=Z=lu#XLbT/!Rea#t9nh:VPW$LZTWZIEqMJuYabjHMK:5&CwnqEJB@H<4lndt:mR%!jN
d/y91l ^S&wRI$+4+M&*^:EPEJWLjnRdVk!Dt85ylLHJYwd5qLABtk^!R9C6awHCWBQ:alVhF=Z8mn5?Qj9&KBL
?wPJu6 PFZLnFDX&VupCWydA+D^^>t5FP*VlPnW8c+biiQp6lyi@t+HS5@PF>BPMn+!\FHaJP5dRTJWVNPVeAT^
@M5Meh MTQCZQm$e!*#eknF8E8t?qp&m8C:YK6VR4:=eR:Q6cNWtcL=Cjc<N5D8e6Y9jiPQ!#ApX5RLuR%XFI!i
4uWq<W lFX1QntZw:Ryy=?Dq$HWaJNh!l!MlLnaPc$iZk1GBB?a$ay!WGIwAmXm*XPySQiI5bZ#qBY4XllwcPwV
dALelR >h+qS&DL5Zb4#^b8HNC>Tkqut:h+S<V&+1:VaSSI?btDiDhiX%FlZ$+/\hKMPE@dSl/@%A<JDbGTHRi6
FL&R>I B5RN*?&jbbbA&uaqXMG&Z@yEHtMkYIqc8anQ!adC>cMJG$+^kcyiI9qlHSiu$H#@J#*e:Y<p!eyF&KQ1
IRFj!y Hlqu8c^>hS@BR5H$?aRj%1wV##?N:H&RKJ>=yyCt/V6?&SJYPPPTAny&K=+Pd:tC@ecNXiMq9\@FVe<H
j^*HEL P*8<H/N^?dH>A9k&l*$\nI/A$ZnLl4D$iGNlVGyA$qTYimllI*GcAVX*&B?\DPn+dD\+kVQ!QS<+@M^i
XXN*4= $m%YHDh&IICy<%8>DdTL$nI>h>YaDu$b+4l\J1eX>61T$GeJna%/+5<yl*nX?cRi#FHJe8NLBZY>^9km
c1IQE! NQd:ajkZk?S!YhFaStnE#JX?Re1FJ/1LAW9$XeW9FeQuT?6&6jNYHK:%N<?qF&VW9PQl#ch\@Z*5u#DG
CW4@qw Mje%6e^la:E4!6^DD=Q#AA&Q4uqaikqFGh/9dS!<iFP6IYRTGDN#aVm9HbG6JT$YlMmyPnup:4#c1aNh
XVD#=9 =e#yed=NRNVhZNX*W?E%=8QjLb+45yN%FZX<wmZ=6iApQ^uhV5LJcDT61m@Wyt56h1+Q#^1?%wh%lnRJ
#atkML i%MS\qJMeuw&cBBY4b&i41iZeB:YP<pb^^V@NtSt5iy:ChIXWicWuDLZ$V^P&k?K5PtTp*/8GPkKcypd
96j1j+ Ej$:^HLAYLK!SHhCcF^?<M99I8%6VIhLlYXLJ^G5N6%5w<D!RJJ!inJDbJbNKdTc#=+eB<c%BZS4:d$N
D!Y99H +/LeyYA!cdqwK<ZheNXZKJ4%y@!Gyeb=TIS\k!@#k6L#pHa@DZt!l@9$DbW=qIaXmF\lB%PqmuKL$1jT
5X%em* HtR+IL^F5ky^DG?aJCeapIubc5?L#5@nGn+$*?PYkQWKSh4m*8M?RB?Zl=P#RaI6P$T5LMJ#q<GpM>!A
NVV$6y Q<TnRY@1:&iS1SBunbLyamL154e$lTu^&8:WMq9$D4:^pbdl*eHL:LG5LI+Htk/1t5Pt\RFSV!1?$eal
nmAawp t+CWIPM91lu!KFXnVWDFNAqNbQ\ILDi&bWH>XXqd>P@SHhB&=ZR%S!P5@F8P1kM+Md\5bVtVtdndYMM?
J$Re>u M@1auAp9!WPCtY4PT!C1:aPHFa8^Xd$G^+cNRjTweAqLCqG\GDLA/8==tDd^Q4?\+\\i<M9Dm6&FMden
JwVMmi mjNCPCSEC/dh<wc1I=KP+@NJGlK:VWcaR%l6=tE^iHYZ5CL6&F:^jIyQA\SX^yAMecK\HY^+1SiYnNlb
5Hk6<& <Lnc^uW<eXSk/5XR8IJ4S@+l6QcX/pZ8AleKe6F4?bb=RDSq^dAaJlj=PWXi*/RtG#=bMWPPw5jYbylX
=A9VG4 YCLFYB4=6ulmAVANdy\V=W=S%J\#%QXNpZCP+B=FaIN+Jidw\M:>bETGjCB$h??*EpNY8=l1u<P?/K#%
a>:=1X +t%W6G#TRWeRVN6FYMW4E+w:hGm$MLL<+nlN!X:L<:YmmEaYFKuwK8R?@<uGMQni59P:p@$jmyC\L<AQ
HiJKFe Xy55FwTA!w9YEyaStDliPlc#LT8<>lWVmeY:9jFyYCeMc\Hw8F+&#Et&>u#YHkEwB%GimSFYpXhR%mNM
-A9uCN 000ea848a48001202b4 Page 162 of binaries2.zip
\#19jq 6bRAB4jwa+AP!iL\&LHJ+bX+8^CL6V9ZYC&#qL*Vhk?ACm**yG1^A1*p$HRR6cmTQKq8<Jc4ZjD/*JND
4TCmJt GCnBDqH$/RI\DB5c>ZI=KRGt*uD9*!JSJCjtCN1cahy&+VaDI#yPYTayBEl<IKLd@adqaAFKCpTLDi+1
8yynX< %*J+8nJ!1cl>Ki8<KQFeKW:=QHu/8@\TpBk!n8D^<BBM!Zw8n$m^i5p=G!ik>\*%%VGKG*iNERWIZFhL
u?9W\d qFmJdLCJIb/%//^9?tb9*H?Tb8yLE<>F1Fm9Fb%@#dZM8HXhp6IFnYwl?JyTlGd/=ck!1!RVbm:!cedR
Qc<@?i 4ikVAaynAST^dh^hYlJF/AFu^HM=#1#l^ZB=:8Fca6u?mm6yqm@>bqIZpcSYK$Cb+VF^6G/G?SB=LZt:
dXtkqt N=C5@aD??ZAX=IHhFyDmF*pP6FwE<+Ri&InA\iAkAWqdcG&=ZpZ@%1Hi>=Cm?T>n4@t:ka!RK+W<hyYA
1eED$: C4wN&*dlCpwaCluwPF4DXF%@NQ:CHGpF%@j5luCAI9$hQ:XwaYBB#SH<yEFitIF</y5<</:hMGDY54jC
#%D:<e &yn>PiI\PtNADkWMRKm:lMTckXqRpN%RSu4GYwS<*?FaDIc/WnBkK/^mltCWp:iaALGWGt?6<:B/^cCY
iAbMep /LNCB1hD4wSCYBnKlea8N+<h@I:L@uC>\HQ>+cHBT5%AG@*Lmn%P/Q*1>CPRM=Bp^JBceZHc^TA&QYAk
R6<<Za pHyAW>?CWEqEYmuYMKXEu/%>GK%m#*Am/&m$nMNIGm<@cM>e=4A/c1b$W?QJ4YFp=LQimA$$%TYFlwTK
@$9RW4 RCYp\^TTNTDVppHWpDEqA9FX$cl4KJQKXS9H6ZyT\Q/V*j9S!j&K\YMVG!F!A<IGKL!#:^yWqDVAhwun
#8E$Fm 6>D=Z>T&d@RSRAGW\9LP88XWi5!>k/kD@F=FWMD\b#\5@MX1cIWpt8ceN&jd#naP?%dqhVHm#+^AEewp
66IutE W\=4!@GY<N9d^5GX<Ca%pNLib!yJ!utDNWN&<@1d*L6::WdmWya!aE58iNDRBTl4j&dEjpX<$PaXYK8A
=>m^15 *+&PAnZW%dDS#uZQTM4$=c9iT1jDB6RbTQ?c4R:YXhQWhVMduE=n&%buli#GN#l5yq#E:Gi86kjqlJLD
qd9me* +=D&4AXXN&*XH8K#Ji8TT85VTjJnDTIp^K>ai4K+F=uHMp%#@bBy9DduSa6w=^DqnVuuh=18=Iw!:S#!
&eYmCX Q4tjy>*pQdSuKCFMRZEuV4=8JB^k6^G84bEe1mSb?QC!!=eP&la8/D^Pw4q+\yjlLLDa<=HMbLH/e$F%
uIPXH: J+He&N9ud$CHbYJ:Td+J@Z/W8@$Jw@/IY@1KNSAaca@NNXLw*!%T<ci\/@<d+E^@1l@^:$TP&WH@GDqt
P/W$<6 b@?Z+E^e:C^@C&j/T*Dp:<M84Q<a/9yL+a9@hV!bm^Z$CDYI=^eBI%cP^/k=jlG5a8X<nJ1N<^h14piw
HVH1Q! &Xq@Ec^m=Z/Etw*#X:@N<^n%4*/dniWS/q@GhLuaYB@Vdi!@8PF5dQ?St9%Sue:%C#ZwQ%I@^6k+jpGq
@qac\V +tLn@I@Wn#E&4q>FS6pia&#5*B!@WD@K&EC@@?LpV&:pH>BP@:#yn$W:ebQ<4K$C+8H+Lb#>9$a:@etF
n&JZcI @ZYI?C@Z<e>C^Q>Fe@w6SA#/HdRVF#9d9+=&?4q9<u<R:eVF\\u/A?*$B>4yD:VVH&muQ>BPj/Ch@pA:
P19:VH @V?Ah64=:TSVj*iT/h<?B>\>CpEANuWXlcQ64!tmWQaWSW5#eYm?B*lJQDk<:=*YbX99%hl:RQ9#:=Xe
6T%RnL lJqj6:^QEi/5Suw@**=@jkQ%p+j!%\jj#^\S@T9H@@Lp*#L@Lhu@+tCB?>u@>jZST>YWkAe:E1M:<<&F
@Mw+cF unG5eG95iH@dHLkH+P5@PKKBAC#94c:ci$AD+>!6tPb/a9VZb=4j^i+BEC^n9<%D=88>i\Atuq:Jy\MY
<mF#!@ iXlNp^^=dJ<WE+<ddNIZnyy^P9L>uJ9YNyE::#tYa%jWKZD:T!XFk1npA=Ny6q9PLPGZ:F**XMieh6SZ
5:^wwD =IWupYI%@JSQGimE/&YCEwB=aZdmi/ju#q#QDM&JC?6<1VVW@E4nutF!Xh\DWQ#uHPE96wZ/Z!=tJp56
5yJEa# MFcpcNmTC/m#VSkFGSi=^AapIwP@cakw&>I9m=YQJch8\LZW?8wd*MWM@5mt%R9i5FY&6/4cy>Zy9=@d
l>4&Hc M@$/wn4EQtJA*L:FS+yAEFcJeX1Zp#8>@BXq\^JdqI9jlK&Z86bHFDqFB%XT5WM1y<+9$I61!!QMGqYe
P%Hhpq ?yXAc4JMWqIXI*+Tn$ckqG*JLk>L=bGumG$Ch?8Wi^n*$T!lG%Y<#@XWjI>:9wk>$V*kW^wPeYQ^Wam$
iDD%dd >+:T*1&cZEV%Jb>wTyQ9HllPXe#%:8^J^?qJ<$5QDMilm9AWVEI*k8YEm*jJjqATu+jiDA=$XZ&#YpW^
cW@wjp tZ/=YB%LHAB9QpEkJE/TCRd=5i<D=I9eT5/Qtp@<dY^9P8l%Gc+k9iVl6#nj8ZwEutpV!^@iCDwmXF?%
\+*y^1 j*$SuYI##F1SHQ?i41\TCb+n5SqN<H*&SReP4%ynG&LV?>u%6w8&mtk#l6k<^i/!$bIipjjH!9dF?\JS
VCZ@EY 5K?n8dm9Y+SkdYNlKH8+VBpG%D5e*#XDMnIH%SXiY*%pq!SDCcjJmYC:L1PS^WM?i%dPD/Pbi9#Cd9#L
n1u:^l \*B>eBVXXQeAn+e%meI>RNQA:HERGJVw1w<HlVhk\#<N>9@!HVC48p5YDW=/K\KFh4d=&^=aa5</C=G>
aMHl1P i^d%jt#<8I8^@dmjlD#X&qXw?Xdi^P/A5qQmAK@RV@$JtndQE\*euCcLu*:n\i<$^Z6@\Hl\MQiAeydc
NGt?wb ^+LdaP<BB6=#<6>mPy>\:NaemC>!lGcAJQ&qCbdi=:ILD*V45Pl<I$kqdnkJMhjpdETLN4N!I68d$l^#
%L%SQ= I8?^E+^nmG?N9cEbLYy>j1k<Q6WFNJ1wS@#\\nJ85BnplBQ@hwGID@\hwXkSc^%X6%\#FWilLu^\WEp=
Dbcu:J I=+lP@E4<8VWSumweDb!FNq:8<%R4X$%#mT1YYJ^h!J=!5EB<uy=Ft@ZR!VRq98#tcQIl9F/SK4GJl9V
aB$SC8 HVZ@VJ16d:pPyPZERyyul^=*AB5S\jh6p1R9<qaTPpS>G\TR?#?R5baV^p*DIhk&>b:j=jGDbm8paWW^
My?u4d YMuanEBQVnM<\/LDN:J6?k8:M8?u>8N&*>cM:h?>da1EHcGJa9TX5BZH*hI5kS<TyA*=?JbyP$TM5>!?
8E$:mc c*$H!wMdA!>FG^Ty+8mPMdjcaeM4$qK%WYQ=>1qCCVmhpqy@Hjy5VYJ?\%^Y:u9YSGZe*H/6bZ!#l5Jt
+pKERL E&!wFIM$IZqed:&Z@FjXJ6>^Dmw&4DJ6/t/?b\^d5BihVS6/qZSu^aa$ZBV%R8/yuS6nk!@GM</qG%+:
EBW85e >d*#R5h4#1J5LM*MwnqTqH>h4Lq5PdueX/tiu=*iH>I+wNmcEKeYF#uDjecLJ6c!ZlD<&8#%Vw#%eW+L
Lc4bPP ^q=E#W6MlyK<=Yqca\b/tiTjW+*%\>TCiuelebh:X>e=>nl&%hQuj:cRe68n>ba/H$8B*Dn\n19D:5\C
F15Ap* Aa:CZW#WC=+>Z+b/SqedylW4uHDF&GPt6dkNXa\d>GYyYMpjmamY5YiLcVEPy1%j%QBlZhFB5VXbDG/q
mQM=&y M$cMbHeZE$KtYXh<:cmPi8/yQBymAjKEmSiIA1aj#YWqRD>EZBC!4:mH\8<B:B$%C&LWSRd1dpFFnA15
:8p@%+ d<Q:T*BLbY<<Jy9!S@yTn5wQJ&hZWIcCwG^%^kycA/W=XN1Rji6ldF?@im&:I<uhT^JG9m<?RyhI9^hp
1^kBld y<JhG/<IRQbENZ@TFXu#aY/T=1%CLTwbBbq4XCbl9+qIX*kXpXT9=u8A=BBZlpuE5QHW865pymG4=EC1
AG\/pM j8bkn^jt=th=#+jFY5Ndk1%JuSERC4aWShV5y%$pb$hMeZ*=#4WVihTYKjT+4!MJt&mb%tPEDkq%kRwJ
*RJ1B9 YZTu1hMVB=B&%>WKSli8FJ+qRm$*aZRC?&=MJAd8=>EGel#$8ljqNQ$wJ=\l8bikJRjYGIc\PEhhIm5X
*9KQ\B \/EQRkh!8SW9yZhMGtPN/+QeM!TlwbZJCw<H#:@%KQ*w$HV<\RHnKee^J=*%X1bYnCF:WGG*LbeiZV4:
RZ!KE\ B=FY+YaD8i&KZbCG>9^CkLM8ZRA#L8JPGwjY^kc1jQ?WA$XA@+V+bJEG56@B&9T!6d!*y>jDM5SR>5>Y
AdXjK& M9bwFBKamd@#HqCSiWd1+<JVn?Fmb&MA54?PHYGIyBDZ9LdB>IEiIBbw=hbDc!/lVGipLGy6a6PVIBe6
hHjt!p J:kH=MlTKB!?pZ1K!L5^1=uSM6+@%/KlRi+pGMXQ\WbYmjEBLN^>D!m>W&W&K:LCimu6pp@w\4VHi%&$
DdAPDN 4t^DtM?q@?qcCh%GV&hL&L^MLY4aSPwLSlJ=cMF!H<GGYtyqm81u^VG\c4LVBwFe8nDPT@Q/apNc#cQ\
Q@pmbe TDX%DFtKFmZ^mWKc8YR9?j*pd>E!ZIeVNS<q4YLXq*ZpC@#bq8&DFwl\L:k4i/ZPm#<4XQXT%XbInZi*
JTSHda <FLpFVXnkkGSP4IWRP^k1EBWXH9d&GIhT&klF>P4cHSAeDFe<\AluCGe^b:@^ii@YYq&y>*8S6>K*FwE
eNE^6a b9^X6/d<M/wS$6&jP#dRa@LqX>!GmR+Lh4!h?MR6*TJIJPaEkF:1!?1&D<QqF\5dK&8GZDdiV=ZbytY=
t5^N*> 6\T:T/^BqG4qXmPBH5y4jZQMKjkGW>ScQnAqA+TuhCky&Q&qk56GYRhuLQq1u8Q8j86H^8:PB:+85JAB
>RaW$j ^y4e/i6JpHJ$HLVdKYZD$uada6%MBbNJGC%wKh^?8/5%nL5R5+Ni44Zyc8><Fjw=1!=/AS@B+Zup<q6^
HQpqlZ \dIT4TpBKM6GRiHJbnZN8$KC^ypL>&X@T4^THQ+$bk#B%u8AY*p%aQ^dYL1Cb+jVyRcV!iVukJJ8SXwa
eM#ySc S$cGqYCaHpKHY5?ZDV!b&l@<ln<6Y>Sm&p/8eC8n*/Y*8wHdy/FS:Htu*61@wL!ndNE9Sw6%wFkL#CBD
HtLWaI Vl+Tn!P%LJhKe1!H8bIjAny@WPXVP1DmZtG%wSj5/elq!!m^EKcX?@:Zc@d@59N@=k$F@ldk>Jh=*MC$
pRRN9K V1PC$VB5pLe+\wud\8!%F*I=8n+B>^b%4MFZjYp?n<p?&em<GuN?*14VycwWqc\t6#^dS\?bqh!V1>eu
QRCW99 @pbjutYeMS#Z>PA*YTqPmk5C1?8&B*CibiL<iMMjaXPbW9ent^RJJI58+bLIjaMteRKnZK!mNNC+<K4*
l^W1*K Pcj=YmijmPRdnH+HW8BhIb^*iLpl!XVdjH=ne4u6whp$a@p^SSA6H\Xm&Al4WdG9TnRL9idGp=$nX9p8
MI1Ap& uK=5B6lRDF4qGFHqim?5JyCqnh\YWQNpPEqXnhutJZ8RqKNLhF!WRpwJtNj/mS:MQAHCM:8ywVJ9%bbL
h*iJB> @F5B?Tt+nw*KM:JtA<mTnhJ=*#$k#MawCIuJbpemqT1B\Y1j8uPHu=+8JpL/TZB9d4hl%jiwWc9MWk?5
AuJ+\$ *Pe!yT$$I95kKS1Sb^p6<WjB?H@%&QN9LKe!H/c!y+Vm1Em=&T?F1H!DVaw:*?uiA\VDN1CK^!naR@Lh
$P?XZY tklD?5QnpFA<Z4y8QV%/k@hE:k6#9FHRCkylD?8R^lyDLa?hL1TuiVB9Jn@bli@$tQeh4$JD\*6BJy56
h%Q4*Q JAe4/4#SF!wWin=uAqEt+ZJ!&w!J:4TS^dchSbKG\Y8:pqVJ?VaIBKJi!LC*R$i>4ScuNqLdayjeGw6+
/w8b#^ d#lnb5ZBP6IaXa!m1<?wA<X\6JHnldDjTSdjSu\5p%m:B=#V!Z<9yJ@^+iJHHT6pqn^a?9nE?1??ISm#
-A:*4e 0009423c55c001202b4 Page 163 of binaries2.zip
SPK4yh Qm\:T#LtEDb\FLw15at/:9d/Ta:K?+$ebTn\p^!q/D*C<@C<>q\>?me^Tnu#m=#hj=?Ac=d<%Q5:D9ZN
u%k\Qk XNwB^niBt:DjTFRlN<@9^CS@I%H>@9uc1y@@JFEX@!SS@jh=Rh^^/<lBYY4F^mcEmej6B1>?jZj<5^J6
%MV8e^ Dn$@PyG>F$Q8up#ihJe14wuq\RuXKB:\&R5K*?GnuZ=Sh%kGya4:XlV>Fc#Z=+hH84%G4k!6%mdy$mLV
nB6Km* JQYJdMZb6!a!6pLG#lhNNZFR8VAJ6y+Xl8ym8SRYRkS>Bw:ykk+$!IyR<yEmN15+@y4nwCGK^8Db^64/
:bILwn CDwaK=eie1GNCYjA1=:++XTbpB4^L#W5JXX%LTVS*:Gmj5$A+1cZu!/4B/PPSLTXTS$SayaF5F$1%6BX
Xc?EQX Hc#:%i4VH&uJV?umXXLTW@cSA5&n/S8JF<M^*$Qey6D@CXZwa@eL9em?Y:KjkKLXDYLt*5&:YKcQ?%Hi
1*FqbI j?CP@8h^S$@uGC48Cq>dta+l65AhXbB4QJ?MnhTSc1<pkd$SDPTN%=&ZjJX9?dStiKVwp^bn%<5IA:?L
Kcn@9: =CESG<\e=1!5Tl1mnE##m+18541DJdhnt!Qd++4CXtMWnt+q$ac>d9J?%M/TPK:jcEi4FKyuBhEWhnba
#@8dD@ lK!aHR\Kjwe=A5h=!F!Y!EEFu?&AaX%=&kM&ijt#6WXCnH+=u>:w4q\GD5kJ98eqR>jK8EVI/nqpaALN
N1:+TT Nm4Q%KM$deb>!4MKj#$?ZC*4<NLQn^QlwhPhJq:6BZ549XXIP4@i^VQJnHAXK6LE!*t=/TmRp9i6@#9M
Ky<H!^ FHuLWXLnc@9i$Z$h*uhqTXP>yE$yIp&YpwSCYMZbbBFELCj499GTM/J^9T&J\/4^uSkJT!5!8@9uaGR5
hcEC$/ P@#dKn4EieX*mFK4R$@Sljd8M1d#9IY=iV/WL^Dq^pn8K\Xch4k%@LnDM!uei=Z$^HZ&%h6Ze$<XlGBS
NS9N>5 ZtH9EXGSDB#k9qN+6aYm=CV*#YQSa&?m*Rank!aZjdV$nJitqKF8j^k9he1y@=LZ:A@i$S?<w#>+S*@\
DGPkEX n9:kHj*DSnB&>6@lHZG!5@\j\V9K?d?Rh&TZ4L%dJ%VCp6qYElcRXV9a4l<VFpPEnD?KLn^I^!KWDAHB
I%6CEI 5VaNQc<aIF6nB>akG8I#wZjd$WAW!b?%mSwAq8Dqqb&Xt<YB>M>^t$pFX?yEnZ!G^ES>del+J*$FJ#5R
1R:8=Y ML4^Mebmt+TIb4H&%$ID/jPy/1w*WXWdI<PhbdmF%lMMkM#Xka^!+leBZ:YWLqpWqBqBa6:T9cjnVhl5
#RIySM EZZVYe*tk5cEeB&q5#hljtT6bWNaaYXq=Ib=l>mIZiDSF?NVF>Fa<DMACG=Ql/CSN##8aWu^TJS^Xhau
GFJA!T L8&XCkbj\Td5\HHDi*<1R@d8hG4yZe8IwHWjY*RNJlG*hB*=XmnZh598J!El5#m1hd$a?!8h=S!Y/lPt
qyc@<P !SWYYHCk*c\P%pQkbjbeLGe5jMYpGGKTBqTpJt6EWV^t++=BlD:LQM<6j?QPBE8Q16I5?qpEqBw=GE@/
4R\V>> J#4yW:MM<6q&KT/=#cEj*Sc&tpHCJXLSyiy:8RCaAJ&QXRwjapuQ8GPW/1VPS%@Wp=<mN:RFDlDEJ^kM
DZ&tnX j91WTQ@!emi8HAqYAq?hqYAVV\4@^1ya6G5pN&&e@68RbDuESR*npyXD\5CqbVy^Pbw<\KqMXI9iY:4<
qVm6ej atPYG#L5NqT+MT*9$/ElJKQjeAWFGFu<L8%6@@H!$9ydZd?Z9eIHSu1>9p@8jCjILF$w*14al6tS^k\#
*/<AZT >+mRNkJ!RctkDqb@mQ*TV=wPa+>LWkGJL*Ku8c:Bl!=!?>&T/SebpwN<YEXQ<TI:y5#=T6@F\bC%/WZu
@VAn8T $lyE#4mnB%HwSmR4w<1a^Gc\PV6*%MEdtAMKt96JjLBEGAPPFtCVnLC%qI9>tNeF&>@PS1EM^ZpkbXQC
+LIP>4 9b%e?aG>PG$*>LI8?:Qn6AKLp$K@cHj%69IXh18PSKtpJQe$%dF?l=XXJXItk#q5a%!X8DV/@D^Yb=*p
pQn!^k Ayq6eBuHPB9N5/EWV#Ep$ySLM5#4HP#9BN/uL9A$AZjE8y91G9AkdNICQ<&NL1:ZkquhJVM=w*pqcI#I
\wyw4l A\nJ*FQWqA!9yQILBGBTAE6b!5CaI1SZmh<^Na\h*<ZS:4:IticQJXIEJk4Y1#cAuJFlnQ6F?:jlC:8i
IQl$+$ EWl9wMJmti^J%Y6Q/ul+CP<t5Q6%+$Xk<Pcuw5K:>F@I%EE5^XQYjBeE<RA/XG!$1XJH6%LFFMND$?PS
mtuWmh ?jq9wGhTT$!*lqT1K&#HVcR=a%LLJThnP8SD6/J&IqdE1wB\eILKu+%jAJ^qSFqcZdRQmRA$dnRh@Q\$
$t5M<* +:i4bc8MJ\/1w!ueF!16tWIh5@GTPFwCBE6RicQHmZ!cmme/?/T8$:&J4Y!#b^d5Z%tbpVT!BtR$u>t<
>d+>%< !J68TM>J1kubC>>t6ZwYNmESkG?b989=bKXkYuBhkjm:Zh:a6kbuGB?MYymnH+6pTGEaMWel%5#4&ECK
nK8BiY aFHLR1MIC*?cK^6%JGZN@nk=iWY^LJqZedG?1THk\Z1KIN+uPyD4VKX!MXFw\K4b^lc?JPYmHDS59AWh
/$PYP> I=iiiTB<p:H=8MKHWNR4eIN<cwa@<E&P?PGGX=Nc9PWmWuT6VWLja6i#m1tyFVlPE$1b$=Y<I^9Z*HPe
6#L&YE MdXm#@h1ciD+IHlJZj1MT=$j8>=HePCQawH+P5NLyTk9G>@##8aRH%uWFHMa/Fu&&QpKG5b6u@*RK+NT
Vm@G&k \GSL!/lpMk^G*Atbya&&bN@ItLH/c5^T#%LYlL@WG?l=w!5HKFNdnP\LP*uT+T5SEymW46yZ1lZLcF@G
DF?FPB 4RXNbqLMaZj$BSdV<H9l#a8^$\m#yQmK1&Ak$dpqYRTne>L*cipnGah!FheuGY4GBLKW^IQiwuY>tWw$
@Wu^1G Zb:DhCH>e\8uKpSA9ALkdytGRm?*hF%ZcG&taL+Xnq>+h<kJGe9wYk/N&H\lnqAe8b*auZXScFEPiw1#
=$wH=h tAeqJh*<EHF!&VjSdDZlp1^Q%DHj^NBc?QApehC#1@!I$^equ\#PM?nZeSbqDnJ$+F=<m/Di9Gw#iC?T
\bFYVT A&d*\SE8#$Lc=aRjtI\y%In89R:YS*lHl$nqAqeKe5K1&bFI#+y!$DZyDSZE#lbWSQbwTAuBLqq/Wqdu
F4Q\@Q ?wI!#XX8MPFb=JFlTIqqjWXVn/cYGkFFZjaHekQJ51l^E+T//uBHt$96?5dB6/>A4KJ!=w$%PCMHdpLn
Y=WSE: /P^5i/bMabT4C+1&W#1Vlw9yiPLHlD4&^MZ6+Z4AmMbbX+jdhXZI6S!nc:n*ac85/=T4\@9S+Bh6L4!=
BA@^4S MQX>jSwuL#<ddwX<&a5i8:t>>I8dK#4>RK%A6GSCy6<jm@K/k*F:RdXXYV8C&B9R>KIaKBek6b/ly?\P
\>YSZQ McHSGQ1e:<4jbc>=djcW@Tq>FZ^%e/yu^+5!q?W/jX8$Fqd>=C6/CWJuHy@VJC^@5GJ1?k?kEH44qq?!
lE?D&R CTySA8\y=LC5u*M4LT$QNe<B=$19V:&A1TRp68hnFXtCW%/ebbT<k8ZpXQG*PK#B@KmiS5wjiHNq+XIi
<^!$4C X=HlE^eu!5k\IL9ppLh6?&><X#i:a1PDdKJ4$G%qc#PVjG8?aK9%l!FC!*#?lwL5\d$phnwhy1A/dwQA
XbFFG< !iFLJ^%Yk^c9cVYaWt8AW^>p#kpQ4Mit:*RD:X4FFjCekCK&B$!>lYYM=dN<1hcCB*^?nP%<MBaHW/ji
yHZn?I Wu%LG?d*b:1?#PN@lenQ/LPnZ6D8pLMlh8AlY5XhLV^datJ<9#5GHcpCDT6Z6ZYB=6Py+Lh:G@Rh?pp@
w@X+GI tl<FpPaq1=YkGEpuT/q68MYcZWS!8DtLA1D**q:bu$J+Wnb=B%uWh&iuFb:5A/*&kHTJWEqYF/%+G@S5
I:Dp!M SXRe51qjHMyPEZL91@Hl45>8*T!m#TTR@8FuEX5TKMBph?9$#tG1&WFL$cyhjV4DwjCh\WQLabaXNGC@
MwZ!lE S%qF1ct^P$MPJCLbFh=?CYZ<P#1$V!Y<E!\$cAA^$A:>#QD<4QJbNI&qWVSF5MnFiiHLRLBeCK&H5Y!G
@np+ii 4u=BNV%iGVw86?GGt^lplYdSIVkA#Yb6tnwR%*dq6hZ<%?B4YBnMeAhdehmI?FBNJWw@8VB=qM<p$jJp
6V\qMH :Ich%/!KBtNFkuuDw=XXPb<Np/%ttT5:M!Xd+?$5+!VVw$V\SMctXYnLXKR\&<VnWmW:$:aIJEKH*?VJ
AK>El5 JFcP9l6=R^VduSG/^4wLaGRB$QWV9WX@ktZ^BmeCkpD4^RVu&wuIIw=&@R/VmhZPiRZPR/JRBaGClTq<
?MM@^: VWq@lJ#S:#X>Vq+ytq1^8EKkFTtEDJ:yWF+<y\L!CaET&pWGwJ+#!%LE$LJ>T+QWhljN4/paTY/^/Bal
ek=KCL nPcwRmHGBHcW<\a!\AIKciJ5!AiMTXFVR>D#bL5QpQN9MmND*ARu=<aZZ#G%\^5>P$S\R/ZIbnm88mKb
JD<dGH #MC$j^*I>TR+LuI:K6+YLFSe%EJd<<&TtAq>SY@!XFLc>m66\SXD<dNw\^cJJHDe*uQJEKdSR$%^8wK5
>e\QM1 wy*ictc=iJcKqcW^I^d#WjWnFnGTCiaSG&bdJXb4KctcNuka/$WM%hG<8Gc4yNyTTD6KRLZ5Vn&\KG/w
&<b%q# aG19EXjcb$*<D5$jtTp<uhXa9M48Qi8WQ<>^HJC8RNTyRZVw:R9/CwtV86Deb?btAT%a?V!^k=qFB@S=
SdDC5N mMEa5qmIpPAJd9:hpLMR\!AHMaI9c/eYeISY#R#$dcNbj6cBwAPWm4!c4cISn!eMkI?mIjKR1pPbKXat
FYHua! *DBEN4Ri=PWRql@YReW!%nPTbS4!l??P&+haQwpY>?E^dXmY\ld%RkM96M*PcI^w9tL:aQPR5jpc\lE1
Mt9YMn :Rwmu@6YqnFWh<dt=:DEt>JNP>6m9\d$Q=Za1CYV?e^kH5+&wM8+y<qw<R+YtT$!ZwGN6y4NTXK1V=j%
IlEky= m<L#TK*u8?N#6d+<Fq9d5IwbiaTa:FuhwHKGkdiMtDQR^</cTyKklJ4q/tGS1WIiS!?QYpBCBKCD/aZI
L@<h5C Se8HwktbYqb=bkE1t\%FJ!:epLK<:ih5%m9PeE<EqY!p@Ab9dVH#!11y8*MyT5Lynj*&C?Q5^*ZL+SSF
SN6!!C L#Zwm4ITJq?D:Ji6tE>\++yX1<VWnP<S%9dwbWn<V81ySIqy+=JnJ^9^+bSk>5M$XX=y\kt*&N!q=X*T
%5YQVm %X89$^X55GTM+wmPltmGXDn&&&bNqAYEY&P!:Paeue6ewJIDKX=MnbNVJe:Yn\@JM8I#e1BqX4SjSFYp
@W4iuj a8P1qPQN%l\jBDhDh!5iFmhNTHKKZ=:PXl@/W>t:H*#Y6?$>nyjS4H%8nK4Hym4EFyXt\Kn5k#d5:t\J
uZh>8? JeLGCY&4DZKE>\5lN/wJcLepN!IIcLhtwL:kI&@k!EHu8HCpCJk%V9Km#9Fmu4WEmXR+pRpDnR:l%8JR
m4*Y!e c=blATGwt!&@!pBmB@*@A*HF#p4!==*5@*KmEn9H9=tw^QE:mC5Pqu<6WRuE@ZiJT1DjBX>^5j>PBka:
4<eQj6 ^&MVqhm=H1Ht?FWPBV9*j/Vtia!c=Sh1EM5n%CA86q?wYS?n=9lF4+HaH1Q?SS%+LlD:a>T@!ypBkS/l
:aL1j! b8j<Sh+KmPMS/q<uTaE+H*Zy9<lMA*H>t?PJm?Wj^^Mu#/PSeb^e9#6!RN!@t<MD+9y:E@!4%KuH=jC\
B>I<6P <uCV5LP^pLA>hDj:k?>=SA+Q/P<^V*@y%*?c\@MZ56N9PV^@d8djuyiD=jjw=6\5j&Ci@9hmu1#@E<^V
qCuh>4 c#A6&DKC!VAZFp+pFlHCJEbcyEmHCtG^w/Gmk%kTTi/D>jHkD!BFbK\!X5@k+G4ndAh15kW4u>a4hH5h
-AWICM 000f8c2025d001202b4 Page 164 of binaries2.zip
89A1WB BVMBhjEdaFy%6!a\Ai6EVR/qKtV\4N@tJ^y!Weq\G=YHbCapn4=y^nW4qGQnNaPKnGhR!?5W5dtEdLAk
eKC?nQ jb8w+MZbP4AkT=R9dKmY?Lw5/EWj8a&5Mm#$9CBVaIjMY^nJR<6Q&EXaCZ8<<qkAHb+P>MQ9NuIVKA\N
i=E18/ a896EBAeE<&WblDDtyAdi&TN*?eXynh!w/lMceEYa$p>en@SV=t<&XlHdZnp4*C^?=j4WC%:+dDj!V>j
*kc9h4 teEJJkT6&<\R\DP1<4wa5X=V:QSY!C+aGyj:>BGbpIy^SeQlm5tLw%cLTW&4#dCa#ynPCC/!RlJqSa>/
+8PlVk K<1J<#/=:$TK>F!@huh8\NjBIkumkt!^miGe>yXbca4w^jaV=IwyNjNaaTS6+^Z+m/NyjFFG6+/e\WP*
!V=GTL 8e^V1P5=8&9C:X8HZ>#c\e8@8<1G#qL8b%Nc9luR:lBQY4SA#YXdNJ^R$y?wq:NSTJ!=qIeb%XM^E<X?
8=P\VZ AmW:p?A<?q#EK\Bt%GAK4T=EpA&XuH61qweNhb4VbWSqdc8FEXX&@Q!I&V*%9PJAjPNW>l*?\p#4Jd/4
JW$%kH ZV1MQyj8^L*T#MVN1nCuWZ%t$:VEXaV?QLK@&PyyANw*++$j:=p561?!bdG8V<@N5I&jI4<&YP5I!TGZ
einL6j CeM&#NaFb<*\8^#H+yMYkWwuQnA*DE=M8HHBRY%nE<KHZL&6#qi*%TlEWKi^mZ8jy6n45yDT^\i>4mtp
SF?#N1 RF1>JpJFD=9h<6W#JtK!!%#ZI69mub?Q:#l>Wn1lQ+q%AE9^iNH&DLy&GaFX=MlAS%E8*MRQ*BiuY=PX
y+1Qp4 +/PjTISKQXAp8\GFh+*^cck?p6?btuElPY1GEeCT=uWKbV<LnTE8FebQA/qFJ@AhB4XBGB\=jXk!BjmK
dn*hJq NL1R!L$<!D+l+VhYj&pp5a>G$pl^DE/?+i9QY?D&Eb?VL/5XhJ!uK*q>?ySA/Xk?C8:IqdN<N=WSM4/Z
d?*iVW <yGd5*ZS8hK6I$t%8REKj?wLR1TXb!<bHHTbpA\Yt1p^9qC8/QXIHXbWMN>+duDYBMu$SGlRmVX=aWbp
j:<Tli q$c6X##FVGXKRe%V^jkZBi?WGS1P<aRA4+A5DyhN%FXt8DB=1ScaY9njB?*!T4mh1Vt6@FJ1icnTF#N:
t8=y#w >?a?WJtIbG$W&y4bcpEK:q1T\wQmDTALFeZHnqFq^6/nVCBJ5kYYae%%S<dd#/^jL^aW499jYNwwEE*y
%dK81q kZbNGHq<J%*bG+VNndH#LKb*dQ^<dM&u\T#1:Xt+<p?4?8QwCT*1d6ByPi55!iNL+KDtV%X!9iY:5nFL
$LA4:\ y6^\?/h$J$nVW$1F/pISQD!e/N!4WLNdica5Sbn*!B^V/6+JN49XTlm<%<k?hCAnRL=^/pnZpeCqI5ZQ
WleCea qcyVB#AnB+=a+dFaGaIZPiDc^@H>+\pcIb6S!i&$4IW5^mqVaGS?&P:/SE^LZX<AB*!SaEdt>5dmECI!
VC/1H! FeJAC=dIaWB=CCe=*Mym@PXZY&STeSFEdq4a%?1a+i1Y6GZw:RmP<E4RqmMw?T^5/Q=+1MtpbQBb<@FQ
*MIK=V uV>cl$q16Ab&N\h%wtMQaSn#W&b#LCkhkwHRcFJbQ9k\dG6iS:F1KZtl#Nw%8&?5JuZpVhZyA=/PI$Mu
%!9Z=t CmH%ATnT%>I^Pmb!hiR9Lcuc5XGqR:lc4W\CC^WZ#QG$LR%ac!bT>PQ\*+Y#KJDPTppWw#:j=5tPl%Sw
A$A4Vt kKa6Q<kT?ZMwZBy&lFHpbI$#>kiH4uV=4M9S1=nwTXE@1%#AN6jK:hMF%=<GI5HAXY%+hkM?a&mp\!dP
bLSjRF <>QI&ZLlqH<l&DIc#HuXu5Z^eaC#TNtI$^d^\&i?\y^F84R4V^R&&je6^KBXL=?EJ#Q4niXI$VSPYhG>
S#XN5$ &T+1Z@VQX:wKM*nPDHjl!CtW\a\e?Gl9Y#@BwYtnSZyXcp!&mlVtPk/u>VIH*yS+uPCd\65tc>V%:F#C
Z8Iyai ePaPi:$La$9qe8hmJ=uC4XI1CT/JDEKtZ8>SJ?T*pn>XEFi^V885TD+b+Nq%eC*d=aRc6YEk#lRCjaC&
PaVV>N hdT%HTp?k4^!HpyBWPccAQeBbaum+=%idy^aCm+w/#8ucj%kPak^pE^&<emZkp9=&NJ19S$wlJdaK:m/
t%c:SI GC=A*TPhE?TRS#P+a1y\M>cQb=$+W*I+awd=w9REES%?+VNECM/eS>*PcDwR?<Qm6l@uWEtTleet9$Xd
/^A5wV ILm%wu^+eLKc*y6HS>6u^/uYkA?+Dd*>yDJ!cHjI<tn>C*@letVmBn<Rcj&Yi4@1uwV5p?%Aa66BRES4
Hq@iA= Qt>+Tqm#kKAaht+BLL8V:b8JF55&6$@P:1+X&!9pc5ENtMcF:l*qi/iNG^DhH^9C<yE@Q81!*c*?/Aam
$!&\ny 5iqI:*IZ/Ah?BLl5l@aWXV@X&>Jk\5Ga$BF9jne<#=!%F=w:yn<TRZSAmm?F9H4RA#P<$NNembZ9Gau+
dbZ+PM SqBR*#^<YtyChWWjG@bFqaPdNaJ/lQZpKFH:Hmc9DKjCZki*P8/8imc?<n+FL&6<1cnc&Mw&QuE%&+:1
ndnSyK >YJu1IabV8*<&HA=#k>?8@H%?4*&*VH^8n8d!eHQjuymy4h:9dNh?4\$F&L>cqCBpP8i<:8VeV+IwuQI
B*pyK1 PejJCWDe:=NF!iBP>/w+kG:NYua4R><WiaTeyD&acGSMQMACW&JH*^>mPnFRe$?ZJIFEwReG/WSdK8@*
85pCLk y@iBVSBBaNytRFXIj#GXElIBZBGIc<5dmX\PXJXqY9RbKbIZcV?Jh*5=*X>$nJyPL*RA8ck6pTZhQSJ6
+Gch5u KFAMK6AMpLZ&E4\F:PwW&#=A41w!w1H#q:iX>B6uqD=5&CJ1&KPk&:C6>X8nlKH+awSIH+VI54q9eGL?
9e:p?R DR!@dk=EnuF?Wh:9NM#JT*q?pce?/RM^w@MCq4VF:bj\l9Z#=4b>F8utWABuBu*nIb?N!E99G1NkC9?K
NyQQJC d1XQEhApjH\wNQbT#9k\H+:6R4<p1=?P6?\PqL?AL<tFKmKN/l?Q4cC6aY%cp6ZJ>Vq>bS??Cq:@SXbu
e#^+JB HLu!b?y5R6wBIlF>^+J9*GWd!!mA$pkAb%@YWJA=M5amb*YhcZEBeN!==AnuGaIMtPG1eFMiQ5SiA=%B
HJt=Zp >^m=pk1*R?ycE6F^kS#mD*d%y&F!K1bDyVbX<FuYleN@akRQ9&ccN\Sm%Vhup=u&mR:RnlcuP/Jl>wH<
=&Pbw? wJ=F\\Bua+D/?lZnJWTiBW+nA@i=tL<=?*TmAhcWLHVIiqmmJ&&N1q+>#%Y>5cpA%#!Fe/B\PBGHq$?k
NbC?e1 wJ#?*56pWYXCbq<L*&Yb1y?NBtPFB8uppSB&&\4KHn>XLcaCVp+lkEGn%KWM/G<aHDKli4Cw&+hw$EjJ
bG6!4R VK<X^LCR:h$1JL1iwJeWTKYRAi<ST6=TFeLAI#<LL^=k<=qnQj@ADBGZ:X/nAa:1D<8^!k61&@EdFJIN
VAIe@T Se5?/\JhFhC<HIX5>PYMCm4C?*PdB=ySwB%SXLwcII+ja14BnaY^DZL*VyHBak+^Vp+\V5+9am=d51%=
/mFa98 mlt\W8Y!GmZBa8+c%qmCFd8udNLVa?Kb&e*a5JyW^V<@m@9BNHFcdG*8:LNPNDYa1bVL#GKyMQWSPRB!
c$X8ZH F>FJG\Mb\SI@:8tYIWPZ$ajWA+H%Qc%tb&Emeaw>WqKS?hCIA%Ik/uQuupQdLVuhI%FXjeNk:Bj/V:lF
KuQTnk lNG:MYW?56>yRVRE>b9kKHNpaXd+!Z+@X5VB?9>+4Ilbti*lta1D<>?JDHH<VkDkH=+dj^q$+YB@lJ1D
Aw1CZ/ >SeBAA:RI>Rk4q?EVVk+H1Nt?RW5lIQ#EYy&nq>hPhhn%K!@CF%\eD>C#jc4aBMH#&QWuL>wN!jLa>S5
Gj6FjQ 9:njuK!QWdQ<T9$aY@6%!Id#Med&K%A/F!jwWbj?m%9G!jEwR@>Xy*Q?S&189\?w@Fu:V\M1wL?Gw9!=
I^Wh5F MMLjubj:*+Cm5Q*QRqE+H*#eH%CWQ/Awj$BS@wCm@AFF?RPK<keW=i?lKFAhVIY9>n?W%#iHW4kq=nW=
y%b#dk G?$%ap1XweF9>kueV^!8bD\MLIcG#I6+/68+ua9Ln>>Nj8:FV^E+jM6XYH+QGGI59KWa8AeaN*@k5:9V
&AX@jK 5BHaw=L@RVt!h?B>QtV^aHS5*k6Mh9Jc>+ApLjq4!jm:ATeQn>YdtpZ9TbuMK?t$1htj&:Tu:8KM:\E%
+GYb>S &u@#a^6eeRie11?iSq6aD6kSDk+!GSen=we<*%&bD$mN!wb=w4w+:<9AKpZi:P1M%X<N9&a#>:&$GchL
alXVFm b1H&Z/i/JD/M^6cyB:iw$uiVd5*?MKlQ96jWjDEhTR!<@uynj@uC=V49aRc#1a1H%MbScEXj/J?+YP!*
^w&EpL &tQHB5@t:N>q*>kj@KR/@E5ktIj:N#l?D%nS8Aj5$G*i!VZk:+#h#=^<@?*?QV%aQi8cj9kG$@5:=:^i
Q#ke\X 1Zh4>e?4K:\X:jH@$=&i@jqduh/Qk\I$%?1nEP9JV^t^/EwycwYHN\VmEA<ldmNQZ<!<:<>C&^4ZV:MD
py9C4i tc9FW*:+MG>BwS?CDM/1SbPCewb^tP4Dqtjb4eTW9/^ZnyEbGGdDbM!e!Ald+&4@=Qy%#=?^p4FmiMmP
/EBXu> t6&PZITyY&H8/EpI<m*?@h#Jku86/YA:\e@PE@kipHpu&@B$j@YE\j5L#wNXKLD1H@+$&M#j:NXA+HFA
<RJBj> D8&F1qnVPBlknD4lWuTbZ5n8eMqHQF6GRiX#P61lyp4LRAK681Rb\@N#i8$^$tqL>EBBHF^Sk?p1SK?\
acEkY/ %^61ZJQTnHtbYeMb:@Kip4H*&*M^9XEjNuC4n5mJX+DI8laAy?y6^FdkbJGP!mpKK@bXyFl$BV=N8EMJ
k=y$D1 $9F/%wlp*p@<9DQ@!^d>CTqWqjqawAiV>d\K<ainuuKG?8eVQe^M886FpaM+MdYidDA@lMR5cbC8S9k1
Q?$9$# CmqL<D!:EIYHni^dSYmRK\1E&FuZi/J/&/k?wqjn94hkKBlT1=@GT#IL8:n&imiDdLH48CBeD\h@FJa\
LcD\TM a*8M&nFhulY?Z%I&i<=dIlM%Sw<+Z+LN&8Iyip=eQAi#4L=9^>A\61QTTFP!m\GSR4R@B+YhZJuVNm^q
H&l&TF ?QuDcby:%BGpVFQNc1w9b!hNm@RRl5R+*J$XCdk*>19Yah>QHcpticTVpXJpVY/9RKapcXt\9ikH^qZ<
QT/!+T E^j>di?wHt/8%+iHMekuj&hA@ZBjdRK9G*<MQd@y$jTiqqHu@bQd?ypc*CV@YQDQY$:4CM8uL%V1t&*p
9RFaw> iB8BLmTwKXqI?#*DA6*9t#iK$L4V<#/id&yy>Vla9KdkQB?Pdi*Ad5%lXlR%nAyem8:wc%8dlkptMQZh
bL#qy4 Hp4n44SiN=XPX8G9QkBV^JGWEu^^Y@WPjLw6k>ttQ4ElGdhI%cC^u4EmF4kk^9TGqh!BIp19SbQI8p%q
wmL64\ p8yTI$qiE#Jw^1RyGMYhAL^yI*CdP<X:>ZD*H\b\VSZ<L>85RjAF8cul+*Ve!5:hQpyAEL$/hi1L*nFM
aTE?l= Akd1K=YF$4:QAW!yQ$RyG<+9l*&:db:#maMnmSZT+kbaVPmpqVEcEK<4/tDtlJ5aCNcwmSY?^SJ=qw@I
#FL6iq %N<ibn/SdXuQYiTL$FR=D\@ZG4C%MY4!QVbPFE!ewakImlQqJW4>E:415ZTIB?jW1ic9pDSM#Da=8Y>Z
<y9MlR @1u*H1C6GVL^1dtKH%kC1jRT1i4A9d1?WXN=+bZSwIm^V?dJhk4BEJw9SZ@Hj/k:enQwXYEcNWEPYhWI
5jI^pE lFH&&1@Picd<HB?ucE@QMpl/nC6=JnL9PWc5cqdR*XE1qR8ct!@b?EpVYdJJZq6d4@!W\qLPthLVtaZR
?MwWdt LYqHXhR%&qXW>y>#*eq*hSnhl/6@>4CAbaq@GFMNudhc6>9Sh+dqA96WDBRjknYcQnT@wh1uB?M1%yBu
-AMY\W 00020c2b673001202b4 Page 165 of binaries2.zip
:b&i>A ^>V=1mYpZSSqbb*&L/<ab/^w/KeNN%lS5PGb/ktFT1ChJuw\h=&Ji@^+F1DePdty%>awZT14Tc5j%$1l
nMTq+w JWunXm*!k#k5%m@Mm9P6Ky9qq/+*quPRZnLqm<H?a%\i1H5AccSF@M8F9*jC@+\Mwd%RR%w5d$B&@VR%
=tuGPt :>1bhe!NCui@@TN64piKTqG&Cl=!hF%Zb/Sp<ZedY:YbYV5KJ@\pVkCAXIn\CiS$?RaH==y4^Mllt%A<
Md?#h8 /HyJ4bZtK:%nb86Y#e8I*cJXXB%=ZABYQc>^#lQR:qiBbcp^RWIVQmRVlBPqeK@M1nQ9d$T4lae9>i+R
kD%e6$ 8Qb?QHq/D@Ah8jcY@/6@Q$#%S>=@?lN\+LGhpM1bT+C:NX6dMtNPb/VQRyZ>ttK\aZX*i:Pq:qKBmtGj
EBeqV= 9@cy<5XdZC5haj^C#6M8pBQaBJZmBA6NK15T^$?l<Xq4%aidn@86ebJ=/4WnL*VB9h9:blF$ibpu%BB!
S8J:XA QK4J#19PV#dYF#@A?5I>bNLF$FE!PpZ<^S6>HL*9mqd=c5c\$TZk86Wa>ukHX=5h1NEnaWW&<9qu=>$j
eCS#QY Fn4#@<^VjQ=d>MNDj%N:d^>a9S?IiH5%e$u+FdNZI?cVh<6TbLjL=*teXa^:AHClH&nqZlmq>@:&W!Q8
bkLQq& :c+AI1*np>:eS8&8wabmenAHIdy<Id+I$pZH%kki^1&Xn/%&ed*H^wR=LX^*ELH+IM><HmbeI&pJ#\6^
9ltG=B \icDM%aaHALQRBFW\?FmE<E*YMKnMGV*kA></kVSSM+6P6%A#Di15=^&NbXRmq/C!#?M>PVnPD=VXb8G
6NKwc5 6$5PbJQaG@ZwFu\?nK@mjqhjPd5XS&lnPmqyEJ8XSA4nyIG8EqQeZC/+86%G+@\hB8hFV:IJBX8!4BCR
Fk4HEd uPSlPZaQaIj:9yp*YWE1TbGtWl>JqyYaAb&NqM?D=XS9?iL#@hV8HAHPTE@i@uX?W?DMby!R:dS8$a>d
4$ulcD \$RqdZ\cm:D4/<RRiXXca>c8nut6+cD$pT/9icV^<XTD54hJMjiA%\:a*p<ER1e>1Y&%MnK?P?ywCR@G
hj:EAj nSDbZt!W6YQyJ5D?MJI>T8&6=ikYykbJwqVmet!iyw/jNCl<4Cc&#X=K>Hd:YMQD=hZqFHqLZal>CdhF
@FVT<6 SQj$dXHCXqhe&F\^+XykHJhl$j+\kAIcCcwF/$9jw^hR*4?66+!bhX4QDji=&C%X#?XL%JhF\PMjT!aq
KcE%yM pMHS$Nhl?a1<1X!YDY6#n81&>\Ctm#S#J5QGq1b*^1>&A8?1D#Sa/+F:lL%Rd::=jERunK!te+hi\dPi
j:<cLy :FNkZ=KEb8^D+nPm!5lWC%&Kl@%EnlHjnhwPPnV^yw+:6BPR%hXa+d5<Z:KeYIb%uLmPcnk6&qB=/l5j
qJ5WEC V/>5h/btEBl/D/Dd:+FQhMnVnVenBP8c&Hj9#h+Xqy>Kbd$wVYW4!tZh$?b^c!*hKjha&ZC4%F*Q8$mm
*KtI:P hShD58G^yS&RSJY@tPX%Yd4Jpnw^8/t=jW+$yV:tA1$Pnm4=MpDBYW*mLcW=$1<C*9\wbR6QMGT*FW*@
iT@AJ1 TYnH!6#a6TX^I&TyXm1ebl8:B69%t%6a:/i*?jDjyI1*cICV6%JZ%%5WdeuyA/e99h+6^*4Ey9a8=$F/
Y/\qT< Yl^YdZN5dV$4!<XhlpL4iS&K?*N&F6uTGdiDcMbKGeR$E/Ki%\p6JXubTA??eH**Pl?tiKS\H!G6X>A<
W<%i?= =!q&t\GKtKnKQWA/X#HZ<6uM@e^dZR59+Tkh66ED1cduij4mE9eA<LwhAhe5mhbdVK?6FH/<9pm%Aw+K
DV%Rp$ V@?hh*K#p#4<G5jH/%4GqTApVBHm#+W$WRy>aaNbS*Q4:a8>?X69SLVm#1>=q=16d<pyIH/umyMdZ?VF
^M^*Wb nTQP5=Ip/VXl^QmRm1Lbw1u*IP48Zq<pYyy4G^Si&XcBP5lFcM1JnhFGCRKN?F/:/iQ6*H^\I&>8u4Aq
MPbZqd i=5+FP=<tSE^kmquyBID9:%j@E%<>cp\Gm%e=9a!aH/pRH=98d=WhA+&AbCZ1SbGK@1BZA>!Y@/X\/b1
Iaa6<n 9&>ME^bhc&FJT!>AjYqC\@CXLY5JD@ALL!8y:95M9\<$MlY>^:\@8JpN+I#i+a1yAXmA>PKAh&ii@>Sy
ennnI+ 4i%Tc4%?#4#eZ#ElZA$1+F=SLLHPp^M#XLX$%H>lpQM>Y5wF4b!ZH1ATtD<BT>#^9Hu5j9bA+K<+FZbu
>k59@8 cG<*HS//?c*iyRVW<4/ZtkFj#/eQI8Y&qEthVkPKAS+S+:bQR\:Y\^aQhQXCNcXyXnnT4/MtNLSyZQp$
dJlNqE tn1c9@deA*:B\IC@=h5i8uVN%e+uREK1cZIREV:nPyd:SMeC@kKj^Au9+V*<E*9S:1%=*wmi1Wkp<aJ=
pDN+pM h&@9S$jH%jZHI/c?Q6nF@Y8Mywcyw*8AC?&YDctXlRG$@<cceTm&>YwWRb=D*>CWtJ!%#nej84=TAlei
Pl9X4Z /=J>lZaVA*FFPpT?KE:8uAAMVAd><bk5=HE+awEBCP9*?:q>l@$:HV>*%RZ9%#B+Jqc9NhLlwbRL8R%N
F?>*\L qu!IZ:<&!y%%=6dI\N8PZD&1$hA861!XQMPA9\hk%ZwPuQWI@FWnJT@jIY$>^bRkq<4^W/%ybkC<LP:9
u@Z+:? $FSYw@Z5!X4yIi1jqMh^:>+a*b:NKS&R#*uVT=h/FShYqNGT+%NTc8aMkNEHwG@jA*/FEeuipcWaJH*C
ydptL: p=nRWnnD%I!nCGZy\ahA/qM@I4:!R<=KT:uJQRM5XX#j4HA/GGE=lqp$@+yd=c<hHjGi*6uA\^QyD8/V
4MjF*p :/BppW1L^nmN?5DY8A/<BEqkXcm5IWebbZtetuDbnJ=@JHRE>h5lyeFAAdq>K:WtL!8dX<NI**AkK=p@
FpetX\ !k1YuQq1@:<F:pDL1>WStLICy?$QEZSSPQkN=@Dq&8h8YCIH=W58hbGi8d6iTd>lbZK^tni8WhHKFEcb
QPPB>A jR4u44KRTyF61#Z>#B?*bwLbtkBPS?=<u*5FQ4dR:&85?uc1BS\jXTWyZcY8Q$XDm*Qne<*Ybun<ua&p
4Kd5uX ^G^#SjJS45I9?Q#5S+Ii?5S9/p8@H=m=e/bPcplcPSF$PLCXXSDEma/LH>SmmKQlwdZlEjDckKXB$mW/
KE%jZN ZTaP$L&DNmjW5SS1TaJGS4AT6@M=YhEBm8<R^biEZ:@&q4+SK?&@B/lF4ca6/5TP$w1&qhN1%qVmjt8<
R>pTw? aStV>>8W=Vw1ZNY#jKwY$&Fu*Xk%HN68kQ1<RqP@6Mq?SHd5&Vj89aNCCck/ediNCJEZ$cELalwtb/bA
Zq\i9c Ya9tLa>*6Z?AP@+Ah@\B:9kD*QEH8PMj>5S\<9#nXu+&Hm/P@!QAHS6@kD5GEa8lS5bFbdDD@BXN!X>K
6yAi>Y hnwV=JI&/SMGwEkyEkSD^RuVIach%#LI:6hW+W*ECA?T5\m%R$Ah5c&9liCAhC6Ja1YH6wTMVGq\iMyM
J*mkH> aAmNpG<!yL$!P%G%k@Z5%wJTEwbqMEt$1uPFNcJ$T^GhFdVNCld1MyHDSn*+@:H*qtF^LhpcMB+<8CjB
QkD<&G *dyytt=CCP:T8L8:E$KC8:6Dk48:B*eIDwEEh@eplCSjMuQP*DuulH8=M=<@<+Qu/W**8@i1Xc61X/%c
j^%lhF :%4&C4KBwEwBkGK>TVwjML\cq%??5>t/6ku#AcqI?>+u+#TFT8yK$k<E$VB&bIJSM>^KXy56A1^Ka@*G
8tVDl5 BRBMmcC!VtD%*uKP!&hyDB@bG8cl5!Hu&pBBi<9Ll9qR5h\Ca8yKEl%<*#eT4NKWMNL8LMh^CmaDkeAt
YK<lPA MWV>KWa&F4e=wq=1VKtiMqhGE&Y>jY%HpqqXY^><Ic9MRTK^byL^J4E#/8XWN5MA@VwXA^Shk5qbY!w9
Np>DEl FVI=*$=XVZ?HTtR!uc6cm<?HJ=%5%<:K9A6YIudbk/1JASwTuhc&PFcLnEw%Dhi$9BAdiHG$n5*JALbt
*wDH&i 5<9w1VJ#I<jQYRjCd/p$dEt$DADn5d$hjWE<D\kY$bPiMclJ^JC<t\+k>VamE\#*qE$ie=CIGFAb4lZD
MZpay? eWu5YpaLBATe%jc<jK4!yu8CSKNWbDJIyiTVn=lbd6Y%=6SGV^i&e*>9tpySS&ZJ*8/i6bY5VldkyP6L
eIBBKJ dT<@p5Hqm:AE1#1QVtF<6Sei^dNM:=#:@jXjMbt:!FY>d9au!W956Hlym1aGbpT9m:b//e4&?VK=:nyM
=F=@SD MR5X*d6IuBKljqeD*>q?5^*ZN!DicL4VR&YM/S:X:Bh$NV+eXjpmFRRW:a&bPA>ZK<y$N6YSwFV*Ww/T
Ch4ADV CR>8bcpL%GtkXenw@eBp?=Xa@C6p%5%EpZ5H^SyutFcH6tnenb/LQwk*wT\Q/qwpyQdi5$TEDl9Mm@aH
^ImdjM +Yub&#w^il\*kHl%+t8G&hmPGB1e6%EEqMpXBDwm!8QS^$uS$X:tViRXd>B4VR\/I&F4aQiDFPN^4KNE
Jl@PCI Bd#dTh#!c%c#1=@d\wBD^FyIp^nK>/p/e*QeLncJYC1E^<8XTcnutDjNGSMPA&Yykp:leDqhE@6a&&m#
GP1ek& J!M*QyuiB:mKITRyEPFTD$mEN5$$d?1\C:NYQZMW$@AN1D\^%1RZ&kLkT$ypQ=C8^ZXTSMFtl?pdTc%V
?=Z>X1 a+b^/%YeLSqwb64wSa<l%kPZ6BVeGI*H\T:^iNhNQqpZSnB*6@J<@q\NHJH$CDSyj6LRPp#*ISGVZlKE
TDdY#d h=!cP=NJIw4y6VpwymR1F#IiYS$RSWLP+J%4dHG/>1R!M$RyPXJj>8AuL<T8^w1ybKwLCEdjkGi5>YTi
54nbV> ?+RA$F>q>5SItheaaPQucbjW&VGy8kB!ktM/imiZbqM>>P%uDGwH$DGhQ!Bt^/nk=p$dT+*GpIcp+/My
J:A+*+ hw%4qlSJq?8=DCw4D<Z/adnBCu1:C8XE9Jlqun8wTJL%#Iil1Xw/lIplu^aMp$aHh&NSqWye9At$:FXl
hREVan W6dR1%D9:Jw=XIBHSK\cybNY$4\w5EA%1MW^5JEdSQHP*KjkD&6CK#LDnnm<whi:CFEjeuehZCTqda\n
1+FXy= #FL#q&ceEZltE*FN\L6lT\cQQJ5@APIByV^\JPm=Eh/5*=ReKu@@tlt4bWmZnEy4WBDu/:/FKj@TWwIX
?1yy!9 ?Zwqt?IWK+lY^JceHZMem&*n#bk^&Z8Pm/Xp+u6ITWd*jaXhFnwbZ&*Rdknc+JZ/bw\+Bta1%qFL5=TZ
4%\PTa HMc<ZN^GZ!iu6Ik5%ppTK$wMMYB%c:EeJ8\LRmVj96G5bZa>k/^6P5Z+plZF+Nt45^SR/IwTccyJ:9TJ
K1%X5F ZX>tqVnZRX+>HpHXC!:#e?=VE9VXS6IPy*t5=tDjR6Dp4D^aA9R^bETcak\Ty+KSIcQEEn+DXt1iLtV*
6Gu#j$ 5%q*11E$$w@mNmyKW6Z!nNC:Gt+6jBe:SMMuNnuM9GD?du%Ny/IH\V!cMX/^6B!#=:cmnmi86JMe=/bl
15J>=! 51E\/uc#GWhhq#d*q&q*>1D^^NauGGRnRCjKN&I#GFaJ@Cy%1JZt:\%hM?cY?T^V%?:8m*G>1T9^*ecK
hN45BP h>Yb%XT\$JWQE?e^6Rk*NTw%iGZ!iNA1YScLtpW#9$R/\Nue$kl*?/Yd*$QihBERLpHTEFm@HN>tGe@R
ABelPl 1wN/^XA/*:!?^J5e?u=GmFGqTj+CXE1SLwAPu<idKjwlEqn/^n/H:IEy*GAKYK\Hj#nGVnk1Bj?iYB%A
D:/D@K C/>LXS/8?b:N$NVXw9DG>cVSmGpZ!TE%=&dahY#ylW=:SlbiH8wCp<1M&!Fm#m1Ki<wu:mZVd/>bi:eb
KNT<Kp *YtuZ<TZ+5wINYq<Ln8:EHkHXaP=9ZR1J91YYtBKd4m:m$V/8GuY?SMn^Gpt!<FGl1e8+>F>q:jKBD66
IM!Md5 N:M^D#b!#DM\u?$cS!w<ZNtLI^$CX?D1lKpd?u#+:5d*aYKF?I#u>E9NTNH+5P9L>t<utXp$NQelWT4P
-A=eE5 000ad70af78001202b4 Page 166 of binaries2.zip
?eA*yN P:$5n!i!mpadCtT\LKYH<5FEM$%HMBM%^V\NFZ?:N*!/X&8PeCiX/@4Ql\mCZdbqFmum<4*q5//iwyX?
#dYt6l VY>^hD@bJ=jFcGVtwK>:^K4ImS*4YKJh4uPk\PY9kaaTMV@E<+Yi=4kNA%GTYn+aN:b#uWHTk#&i+^Pq
L&Gip+ 98%uZ:D&Fm95PFjY/H1lw6yw*>XacK!j:j*=<eNViZ+^iVhp4L/QFiPyKCkZNpMdFa!JpypuWu*HqmJ5
!4@<VH ^%Jh^\GIY:ES8YLuWb1jBAS1S4<mGp5nF#KP:^N\HPlnb@bwTJqZw?<l\e%mFmWl&=\muADb:$?k\PmQ
Y5I#+< !/I@DNKjw/#W!+/j:<=&m+GNK5y%<pY\C%?JB>N8!jH%F=aG?68c*WQT\BpQQVC&Gbn8E=m$Gb%i&t8i
Z<q#6B *bF/!WHhll\jIMwiEB%5$*EY5y$aK:annKR9Gy/eKJQiL?GJlE6$!lAhk4DWktY:cD5RNSI@D/iA^/1P
c=?%SZ Fe/a9lHb^Fl9dt%jQpD$\bkpN#nY%u5iK%\*GlQWQeD9*DiIn/R<DDjiJ#PKm<^?Z!VS9nJ+k:EM^>y=
1D&n++ ScTay4jX=Rk:a\@91A@5h%ni9TMRI!4#SukFGX6kP*PqNF1k%yaPA:6cFbpXHTiMbQ\w#%I#%>I*H+Mc
h6WBC6 p$Y>MeR+P>K6Nq<tKLw/I^><nE/^mEMYI$b69Cc\NuBqN*d#+T$AKdyTiMMH@hnXP6y%P\L:E<=VFIFS
QpM@C6 lC%@EjMq%eyZFpYbX?a=FPMSKAKluLDJ&W1=q\ZQcP!ILm^PppRV\/ywLT4EL6D*WjGWpQ4#q<eb\=qL
S9EZ^A 4i!VGI:Jw4FZX94=n$4jb*SNb&WQaZ6*cjw8p!J!eku4eytYkw*AYhV64P#w<9+hKIa*MDyKPpy4Xyy/
cjHS^N iGF@TG\yq^?j>ywd8H5DuP$J!KeG>XI?Aa+^CLjCK^cDkXX5*eI58a%IiD5<mn$wthc$ZX/5b=NWiMYA
elX=Fq dCtPHpS+%K5uZHDkMZTGPQ4j<!S$@C%QRk5wp+CT<ye4jS:P@%Pn*@@d>AlA!6>mY9@ZRjA<kH?S#k&B
9YGKR$ @JZPDiH=*/XHkID?qB:l6&DhQ+eB<@\miywHeNhIjS/8P/C=PY>JM5AD8kMchF5%XB:8P/C=ILil\ZhB
4l^TXe *@y5u48kRdilIZhB*%cBqkh/B#V\661=EM+:wG?QqweA:6Vl6!R+kAD@LjShnP*Yc1kR$C?#Gj!*n:>n
F%TJ*C ShIjk@n9FWplh/%IC8H?e@A>D?B@D4:@QaHB*+L9wbBjBN>D\Q>C<D*Z@/uB>=Cj5@N@k8@@E*#@u?D:
SIJ>HT @\Vj@!j+@n@B>@>@C4/*=?Q5&hGa=mKP#j$m$W&Fa*qh19p1taQk1#DMVaF8HaQ18hHY\FL!N5uG6FC@
!!\D4Q P>qX^ji=uYjQ&k$C/N!eJbd>a<XJ^DlGFcVSGGXM4QyZ!e<1aBaDMl^qd%?k^5qI9\C\wGqZe+H$u?L*
Tpn%YP b+nhQH9\SipqqyZZF5b4PaM5b1*1G+unL9%i\8uV=Q/GZmHi!A#BV6lk8i%HVYYJaqw/w&kwu^DRkc@=
a4QeQN VR>V9=H5KiF$HW8=6EF&$>wpIq*HlWKChnHIM$9^jYI+j#w8=pL4FJ%#Z8n!uQu:Fk+19JcCw16?GKL#
GtZ>VZ :94\C9T/>6F^Xh4i8Fh:H=EX/pSb486ptGt1aRRHwXGQKG%<4uhpIYe=^qeljF1E/V*dB6N=tWIe=t8a
pHt*I^ XL+\!Xy&Niitu+i5*aV\NVWNN*:1hTFBdP/kjQA+Tl:9h#kKPipMS!ab4/^JWSP^pIRP\qJJ/8FVV4%n
W8W<cq DATY/qh6Dm@EbttdI6l4B%adKpmN6@!uR9k/NMliE>=:<PY+V9LNVPb*PI@\:?PHn%V>9q=^iYni@#k@
c*DHe6 itu?hNtI=?>jLj@<Q\C/EpL>VBR?Zlq*tkL@4tH=Dm^iS%HZb#?GbN?AdH*de/KKA41bmF1mc:<i!mcm
uFtDFF jH+dX5?TdNq>dqK4tYmuyR#P4j8AQS=\nHbuLq>:=5a\SY8CPFulFp&YbcDmW?PI/?*9E:6#bE5qhk/5
ilS#Jw 4*N$bb@AthmZ$:F$yu\n\%XltdK<&eE1d!wcP!q4V%#FGk?$iQRcq=k#WPWV\Ze+\FZ?X#G$MNYYnAKe
KeJ\Wa *VQCmFSI^1DARR&=?!6JYA6SaZq*\d6C!M98I1t^5t!=<PJelL:eKlPMK@Cu&QVI/iX<h8+!EY1Jc:=P
9<CL6% hi!Z/kC^T$kCM*HM\>j>MKbFbk<4lWlJk!DJSCXT6FENmT*>!/@%tG+Qj4#\cEDD\+6=LB+Yq^cKEI$I
4bN>md >SK?tKBwNtYQ\PJL!Q&S+=i5K%F!Ai#5Jttlw6R$9l=R<1@#Any>&&W5A8+G8n:qip>KitdF>*H%MLTC
GC:91* mi=Lb1M\bwTHQXC&*a1/pmm\PbHldWn%=<GV#V/#6dTJq9A6jC?w?1t=/EuH+tbn\uVh@L8qddqe&>NT
hK&Sa\ 1X!wKGBkpw6pGI<k?/1mX%BJJ4j>uEX!>GJcaqia8DD<Pb1!I#cJ#T:kCY<+j%ja*A#hNG%DhbM/VTl1
XSSG\Y LtWZHX*8e?WnhTZ#Q1@9p:9%C:Nq*JG9YeEwY%byYlbd$b/H$CHCQI^lt@m+8Rj5hcX>+**NwL#NABLj
eq8N?u ISW#IHP4>e=IqyCK*\9VPJY=6cRyZ9HCWlwAWIKyTVSceywPP8&!+::!Fd!9&GkStGX&CW6Hpl*Xtm/p
h1>b%A m!BwILPy?9ci$Pq4#&6Y6d8!V%ail=lX%VSq$PC:M+EG!S#bN^#nKXXW8b?AK+cymy/XyZk&YY^mtQp!
RTq*5/ Dt5XZ1#H9/j4Em56H+JETcb<i&5V\Tny*&=!49!M^dbh+#tY5SpL::lIA9yR4%CmcTcG*p9hhh%#$DNH
YRMn$N eiIpVYqS61/NMi>+GAu?A&a$#eQ%i1@9W:984uXd=CXy=peZaF?$X/KyK%Kq%Cw1d1<miyPjWtPl>D\n
CDu^Cb kGT<VZd=w6bt<jINW*&kj1IndiElu<BVKITBZqmbR9t!eLVk5=>8?>S^?Xnk!dA6ntdHee@aSpMl+%/A
%mGYFt WCS>&*/DnCKYp!:Z+INbH=ADa>QFb1V/ep4aFCeet8IV@dhNmCEEWNZ4+?SZY$8QK#mpMjFIE6hMWyti
8Ze1*\ <D5<quL#W$Xn>q<5=G84imK8jt:M&:^wea*VPBZ469+mB<kW!^AX%?\uS$Hl$&aqM/6&9XT?61^%61c%
eY$c%\ YG4DAe&NZBZJFw*AwhR6I*?5X5i$jD?4kTnW5KalpKSaR1IjZtp=6I\qXHZ:<+?qui@Ve#uLH?>@X1<V
a5MJSp <Y<Yw%19N/P?wZ/HG+YYPN*<YAX&Q9yekQliZhl%Vd4q5eX:dKw<&Ab&dRqX:+SyBBFpQRRZVpYFFk/q
%JNe86 A+:+b!%w\1b9Q/cVqcmd1hTGy<PQduB@%8*/4?iASS6n$HG<\V&BDN?+i$@8#lRS@%AZ%l@:\pNE5+e&
nFp#Sb qe=jIEwR5\L4Pj>*PGL$XbTG4ie9*#\uDM\yH&A*m<kQlS#pPA/EH9Rku%!<Za&5PTje!uJ*@9JE>:p6
u%JLtT Ey4n$@F5bSQ:mF=n^$IhqY:kZD=F@@%pHWS\/WTeup>bb8GQ%SF6=jJ&lK!<T6Y4w<t6Xjb*dKIn\FyD
N=\KJi aNud!dYlRH<::i<#P=wbjYY=:>+Y/8#L5K$RSyjq!p#V5uja8t>+/9Hq5k#J&81*btq?FYQ&@QyEtd8M
6Dh5/1 1d@mmpKVk/jYY$$#A!%lhi*cQSCLnNlRFK%A>CG4&8eA8h4hT\@FIT!lPR$:Mbi6>DJ1LLt$eNWy^SpZ
AGnEwd euL%!XY&I:*>X&Xhja?Tyw>Wy^WwVmt/Hb<G5q^/iH&4iHy^TCSt?*KVLlPL9+1*lH8BBkPCctSaQ1Wa
@j9mwn <S&P5FJl?m5N>5YZDDYqkCQY!?yV&84F^P9T^/%+IKDTa81n%>wil*$6ia6yH/eDJwWGhP@=k4BLP!W&
BG#k?Q $mKdtAd!Y$y%Nh/!lG*XBdAVVVIc?6A@M$LRV9!/8mFLY1@ddcDNYu9P?4F+C<6S1l>yVm:CDK<!FAY%
+\IHS: y\S&JLee\au@jFXE6*K&uQRJl#dl%QnN\+15eYi?FkyAuG/LNPBq<?IkYqQm1MhnCYqRJdEGR6=#Mujb
9l:wb1 !9hV?p:jb?Q:6>bb%aAS4nCddK:p%CEAnje^MWuPW*!AeeHDquDh8bF1ZW6E&TA>P+*=Wyt4GGwwinW&
&a<alZ =uRF=jL>TKqcnMY\4>!tLe^V8VWhS#uBhpJt@p<iE/EyBd4huYlD5<M6aELtW9S1Z9+yKTqSZ9maMjq:
h>wCmc PwHw!piwm@m^\/1J1?!dp#R9pkNwM4KDB*I/6h>QG$/j*@?1>S%8XiudWI*T!NNL8^?:A@p9#D%!cWZ!
@qh1/w dL&>M@F4FndjTq@F>lCKe!nF*Y8pQV:4j+9T+ELi:bBZYmXb$*jcN!T8TYkXm?*%jY/*T4m<t/\dP=pt
kVyELl BE+=kpbWBVEVVu5e$+Y9?<h&+#9eJ?Z9eNYq@@VEKlcQ^+4X95n%Xitn^LQQW+mwk@chMJI!6d#Fmeu6
nXRq+d ykkLp4*&q4@Dwd??W9EJVC5MaATyC>ZWqtcnFl4dD^&J#@JQ*cN<hRty6h?9LJJ\:mSLNGPP!a/W/@%R
=99<W= !P=iA&BaJu%tW1dZMb8p!q+ywVaNKH&=W$1?88pw/6yhWd4pNXP>ji#*4eVk!YdA%=+yuy$KZca<Li<p
D!CPa% RDiXJJIFq6yZ/k!cp@LQ4^a%a<IG<$y11EJTe5Jnk+4^dD$HV$d6dEwZSCn4JtNSXX8NRmEVw4K!lLaC
a^6>N^ ?!GDBZ8^jXSJamH4&JQBC!TlITTJFw!&FkPJ6K>j+5y#@6m!9QqG?QVk^?y@jQjm9#SSjYGlP#ScNnt$
LSLyd< yemRpchQBTh^@ukkp:TbBaCI#Yc4iIVWGE/wX6HXFa+Kwy^5R:%4diEtViI9He9u?M?@\!pwGd#/5ip!
V<nC<i Mj8NGDj<e^NY&91VjLpZ$<6cQdAGSjW>&5^lalTqHduecL9l/hSpayANnlGTTZlk<cY9a?q81#HHYw/Q
!ZC>^L Qt?&/M?@bih*<@&&!=9/nTZ=6%&j9?wn$@X9l8XiG?jd*/j*4=@iPK%@l>PW@\!bJ::#=Kwc<P&E=/bu
c5y+LE !Y6cih:5=+$%u6j<ne9%p\Tc^5IB61cy@EL</J#R/eihZ8NQjIhdj@*wi6J45P@8FZj@&ycjYu9/p>j$
/>XVew +&ttw\qJcYDeia?\1M?lVV@G=68RuS@T9+*/c9F$a%%j:<+ew+C>%K$!@c6W#=SC#h%55&tG&Bh4&YAt
6^che@ >\He=%F%y*Qq=D9Z&<q&6SlY?&+$d^4#4tYbHXbyE=P\pMTw!RB>?9+XE&>ieqiqnTlJ8<$B^JHwMt\R
ljY#yW C%qd>cdE>GN9yIbc^%bCR>W!ydd&S=^AZ4AGmVAG5IdQYq=eTETcZRm6wmBCPPyCkn:i4NeVWV5Ky<YF
^8bAQ% >*I$45>y9*:RJq^:*Y!aTYn$JnmQ/VTtmme%iwlP!&^:u??^M6XcIEq!aGVJRPPt%AFkR8h#<Ihikm8H
Z!J*LP ZL!BqaE*8KH<tAQG8jF5w\J<L^%IdF?8#SFX9hjW/A5ZdDdtwC/?y&KL4ZMjLCTB#Mku6+KSiK\GY:Z^
GMLb%K ZthlnC+!&A*VW=d5kyJGtH%mjG^#HQ#P$4*ut/?<5e1<kP*>@J%CdYm<=$uwcjbFlVdj&=?YZA*hnuD<
=:FG!n M6!8*VVn@GqmP!Lt?SCGPFpL55WDbX>#Z49blIZGi&iLI<%9W9uc:T/Ve:V<+@61BCC=\aV1*FDPDSc^
dk$Y46 4H\by^<YA?*@%D&K6m*l*G&H9^9*kV84Zyt@tLyKZ49Nc6^yX?/yy%Ry@&n@Vc@&D=Qe:nP@4cQ@&<K&
4ZR6SE &69Q=yy9=4cqJtJu#VR+!pu6\9!X6i1FP/Q=L#*VQhPhH=1iI%nkDlKIcVX8Nni<\4CX^19L4Sd+>qw#
-AZ$4P 0003a48994f001202b4 Page 167 of binaries2.zip
HD*AHb WtHCuYljdl++yZt8HGZQQnWJ>:wplwFT\Ja/q?!Ib+jyPIpl8Y=Y:$JmI&EwlJBMny#\KRdSnuAbN6iN
H6yYyJ /JciHN%%/dB>b<4$RB/ettkBuYhy8j!+K?TLl>hI=P6hw5q?Bp=GinFh\p?y4TY\i+H$*MjeV<IGL=?F
/>mDwc uyL^e/cw#I\udQj/liJAZjwY>%@beZ*ACB+IMh1&>lBW>SV@cB4X*yiR8Z5eT9>t!\?a5<ndN<pIhB<T
V8aWct EL=K9qEy:Ncd=QpPh#dBeIM:im*&Hi/dJ8&QhSZ$neTQmZ%a=QYJ?I@bahe4><h:b#Nd@lNNAL@^PZ>P
HPyj/5 nkX\Kci&dNAIRa\cMHK/TjYk4TWX?^Q^+JL%VF$d\%!VpkY6:G=<eGX+KA1!5G*Lw=4a?@@Da*l&!d@D
leLaQI jVcQ?+c/>bZG/#5eG==ZJ$ZIt*V8kbjhtQIIZ^Y*qM#nKnlK5htNNpa%Hayu+*iZ/h^qS#91=bTpNLj&
/F6!ca NyXLlRSRW@aHY>!PA%MbcYTD<SW^E@mj6qyn*jEFdjcV@wR!\%iXd^p*MDjEwAA/mlptdC$P!HN<@<Ve
LY!/NC tLykGiH>w6cP9hcm%1lnFXpyiHdRNlN=KhmZ<MGy:*=CbTQiuubnC+pHTdh*&N6Y!yhc#F>i9<K5C1nI
e==Lac 9E\<8/JSLKMw\8QMKlALi1PNj\&W@&#*a%KKjZwy#4M#?HT#jj69ec<W!#p@>JL+=jZQeE%qJ<@\8G>c
5w>:%M S%+dWX<XS9@*pA:*9L4SnQAGkN=:anuRBlYNK<c*/+>99<@ELTj:j!S#46dXaj^pHE:ZGnwpFE8K1eQQ
:8n@PC mT!&Dh@6kBXSKt&GuaXX$WME$Y<RqZwRBI>V\B#=+iS5cW\/YKV4/yA\bI%CCA8ip99J\\myeLWL+>hu
%pT@@/ !#<teq199Wm:mXm9aa?*N#F@a*CITj:w!a>Q#<T@Fc=Iy&pF&:FTcu&JJAbK^CwLc>LmDVF>1hkTDKkt
lL:$Sp X&ju4%@du&Fn4y5W6^:Bw==IM5PbDjJbcPTStT:AE#i!e!nW!w$h:5&LlM64b$1J4&YI6lq:^*H&&TlH
>@TReM p/8B*yk8iVI*pVbPC89$$i*D@b+k<?L<b<<6WhhR\yA<RN>bkyIJ6TMLZw%THQ\WF9GI8%Klm<W:haST
h!ZbA! N9bk!mQW4&Ni*&h*dX:p%HC=j#TK++Jyc5MeDj8@QdtSA*$\:@N@/&4S?B%P?LZh>dP?Rc>5pRnYBnWL
VPG+J# MwT^R\5IHNak:iJt*qWINY9M?\@X+L&8Tej:Z^>9j4WV@>FXaY?9SX=@G##*?Pi4$?k>Vc!8t5=uL6Rq
P4TcRX BKdTGkPadYyYuntQL65ijhQpiL1L=@YFajTjL@4Aibt=XX$ju$t#%q&ML+!SNq/8<Xi$5WShL$Z>WD4^
WVbVp& /+8Ry%@n69=\6eant:Yp%XddRJ#%MIHFA9Iab@q5>DDM\$y5R&88beQ>hhHdN%<jd*?j&%NF!:i5G1TL
PKY/IF iB?dK&eWF&9Q9D>NtMl6%+*<LTV1/%iGt=@FqT>p>I=*u/+?*W49q\wRNH$qAFjEENn>:S//+VTIcS&9
:PTji& <=pV1+$8WN!K1!l4#c%/Mj4bk/4a?mDR:Hqh:<+LM:QI^LnJC9Ii1&<SN?WPitZt!<hj*q\L@%$^Q&aI
wp5!<L 4!Yd1c<@G>yJyDpYbpLA/\#WBwnRe%6y^Y+1l>al$YRbBP@@y&:9@\9wQ\9YDWJHi#5pb1>DNSGFJ5S^
%1cVSu N<tXQwi@J4*KjMIbyqM>i&^L<8/DhIFVZi!CY\<QQ8M#LEpce&wZEK&CZ?CDG$/kBY>l4Q1eaqQwyJ5R
S\%6#* MP*FaMaDZWq+Ib9%y@ZIk8VwTqqwYy<N%%CjQJ%cmI@cEd@HW>hCE??I>pVK9p!hk&nb1^8#>m9:YijS
?WQMJy \6nb$jZcHmPqn?%cBw%@D?pV\/qm>l5jT%8Lbh4E&j&e=Ie#yC8SXMlDHD$H&cZXW%ey/9?w&S59t1en
1ldjbL Wh*YX%Qa!Xw%@CkQ8i$k8mmY\F@!WdHQd>\juSPdthKGb&>$QP\WIt5EH!>&G#uGKCKbj\Zy5k1>Aa+1
#SiBVe i4L#p\C=t>Ipw+Rp6=8^N>p4#H!%ZIq/Ew*yQV:M9!VWi@XP5<$9:eWAJXAa?WD$mbYL1S9h?t+IwXHJ
M\kuy/ iMYncnDLpb\w=hqYjtV=>iEJG%q6n=a8N#6lw6/HwMlZTaX%/>Nqcqu9%M=G!u5muJSkp>wTAk&6*?Gi
5Di9/= FYe##H<BuFR$MiSDL#D!GpP*&A!@?tw9nPt@5Jy+XAC9y\4+W8*Jji>R4YP8ZL1&SeP@kT^kpmDXEa>^
^GHXcw qDp/#+&y\JY&/9NWQitG+S?GnEjAWkX&lkqy+tTaHa:t+wk5AnLl8wQe@J6@WH#?\W4=?phYmyit%!Vw
\qdX4X P>!X\89@$H@?R@@=D@*u@?9$H\nQ4?k@APB@Kuu<*%9J\@:j1iV^ypkT^=w5B!P=5BNiTpKjlBc&R$A$
BbG^m% IqmL<:NkS^F^wIHAPEH@P1MAI=>TYP6J:<HK$HL@GdZWJuK=6DNS+KH*\48*Cm@W1JAST^JZA&YXHWTR
qZ8@Kw Ej&@<!IVQMHD\V:jq!GwLVe*Elq#?CT\NWWwdapDPVBB*Yl^bwE<Bn6hYyLW^PewR$S^9\BJIYXjKShl
c\bHi$ bZ=mM$yVCXDyCY+5G+ZcYpRlHA\jATY/duVDdH?Rn:$qBa6$bmE%EP@qKAl=mwaPy:1Le=I458:>*nT*
h6l%#J ^L1CTECb!B4J5wGAmW%d@h:PhaHkkC%bpbZJBPiHG84=@l:Bu<X:S#QPjTZDlKd:!maK4aqS:Ic&lZLR
$1T+/n V/\+DM=^DF\Mp@V%TV/wieNwSFh:^XNB$FEcSZFXWib=qJq/L1HGek14S!$kCl&!t5lS>I&^W\>#kn1q
#4w!L5 BVWCd6p9Wli\c^IBwNpw9^6uSK!IZTbIth$bB%Qn\u+!mtRNN&a%tBChGPA#PyQ+whVY^44^+1H@#GMd
&Z9Wh9 &MGJQ^Gm%Ml<$:u%&61Z&qRc!e<I8EY=1^q!tTmCnlLpt?H?e<td\<49Rpi@8KT99eM8d!SAnY>#I%B+
#m^NZc Q8%LWV5L55cSTJt#H5Q!K!MYY5mTm*5Z+Th:j*H/4a1w!4VTc@%yX+WTbh1IyRnW!Vqucc@>RucQk1yQ
MC8Ct! Hn%/@ZWQXmb=6InG6S=>Qqnby*/PH!*+acw>8VFWMP*R=dDMw6Yy:\yitQSb%MwCVbAhjAVLh<XK6KE*
\eq#t> ZQ4ZC6uFn4&A6wdbd<d+LIW/SWW+>DQ1^RS448yM<N1Q:d55Sqp5QAJ#CXAanW6Y%c$\5#b\YGimb/dJ
XbwJlL GnW6VkZLEqJ:=\eAiqR/q/Wdi<iyM9\K\^4X@F5?BET69Qeb5+VJ8b?m#\BDNFFP<&mMuI6tWutXaZW/
ieF9II #JV1jaqK$1ISV=cR:*%EG*6yHuSeXFTW<PAlDb?iqnenM$IP\TlJYy1M\ES1q@+TK9b%mQXk#*KL/\CG
EeV#Xk qy8#uP*:^TiJkYTncZPkKl5TkLFm^#4IlF5&F1Y%\L=!I#beaR<VS^J1t1/mueaXP@<BqDmb8dqSDm*D
Bt<Wqp =9F>b$>mZJRii&c1\*Zq\mH4H&Qt1ACl\G?$yy%5km1/#cARQ*n$Gn+Hp6X8q%EZAy1Ee+:L:+CPNa$+
EHCZ5c GPJ>VPhKZ^&Aa1DTTyuJKDDnXctAe&p\LVWN6tm4Gt4SETSM*WQ4CiyB8qE4nmHi@ZTW1aZ/qm5#>:LQ
BjEcJ@ WCC%*GWpP=nF!QCy\VWZX6!+N!4I?ETKd^4hP+\YumQnw55yMa6KWq<m8F/\E#BwWIuPLE=G+K:CtBu:
a@DtkC bdJcp<#mwWIVKAnb$\<INiMNVPR6MH9\!R6mbESu8M#&Q8=Pl1ml$<**=T<h#Mcd8@iq4JV8dE19WcA?
nPMmAK 66=LXbZAJb*b4@H!1RRnwLwkaA%QqRGq&1qD:N@4%=pk\e>Y#Gy\RNhj6H4bw=&PtqCmQyI1hd$54=:n
4jNR?J =dXM\PlTq9eupD:*p@Cn&jXFk/h8@/V&SJ*X9@lkkAV^?Xq!>JeT+GnAW=EbT<\T9G?1VkFpd&a#4Ytd
ML&^qE <lS*eku88aSn4p\J1!RBwLXlkhYy=BdIXbyGDDnd#99D\t=ddbS=>kyE!:#DkdZ<?>*#ZynH*G<W1CL*
Ktl==K l4TYVTLd=4QH$emWt&yeKq1n&\JjHicW8Dq^PM8&qy>>SkndYek4Sina8++VKVJ%5PiNliWZ*V^$XuA=
m+\a!* kVm>Kj!PbYBXi$#&?I*n/CFd8dlAm>TbmV%cJM:A<&8VEEAlLi98dCGpQ+A/hnCZck6RwYEm9V+bYRkc
R1mVR9 5&Eaul#9DkBcTaZIFyKcQJ!%688cbZ>pIHFT+5hGIheb#D6Pepw!Y#%/V$=nQM<JP$LNMkEwW:@+>y&M
QTDY*: W1iEMyaE&TI$b$M^mW#iyPQDnBEZKd>MyS^+:PS^Xb1Qmp&wuBTGh>!mM1+NmAc:^CJ!ph:KkWc>WNBd
&**l=e nj:G\E@MD6en6p&c:I9IVF:PGRJnR<WGXIV6pejl#Z!V=hZFa&j:4$uu9HMR^WNE$L4Qk<*qYSkDaX!t
QAL4e8 ciK\1n%Aj\1cFjEpI#Pc?!*$eHl:eq+46J%6ZEbey6!JAHMpnkDaKdGIKC!XQSMLEh>dJcRwTi/VYww&
bj>b\J KniT>M=&Dm&HF^l*J^KP1b8#^V5Hj@DPD$H=8uM=LatZ^p+iTA:Zq%6y5KB*n?qWtuKZa%R=%#K8IjRM
I+iH4E G?wZ/bm@eXdNMi:pHBFSHVJdE^bZwuL&:I1ajG:u/@y\lH9/<<Yu/=#nPI:YcE#Q*b>8!ykK9kG8KbM?
N?E$1Y #kI!HD9SW?#6ude99NW+>#^/kKD$nAGyBFPTm%R@:AWV#AI:k$9miPS4ttBd*ayPpK^<Qp*Em$hw5yq?
R#Appn CnyYhW!8#Ip#=@#h=Nli<QC^Dn&%y49cVR:*y&YTuIam>^&LSReJPICmlFMSu>GSMNP<^B$BX>@iX&Da
\JEbC5 9b6:WliQ&HZNke6Ne+Vk^R>>wMn!9YbM^T##S9jKQSRy=?XR%EeKn#1*F@y^ZL+FS:BuQM<$Qubt+aah
ke:Wj1 !/nFM4/THdF*:6d>J81><lyWtw&95XcV9LG#h#:qj5Y?wDG<:iI5QP8/4Q%&8eBlh/^u8HlGQabwb=$/
SF#1@k cPBbkHw#A\:Yj1J!ntt%5LPbcHSuEJG*eH&$Di*dQ4H*eq9j*1cZlNpl*9<W\wtWlS=9Sh@/5q5K6ItH
PD=J!6 PT+BLl!Lw#E%p>=:=u@AJ<41k<\B%&Fwe/IIFR=XM+wN!L&<J*&JJJ485Cq#\e+M&#a&6!L^kS6KCI^>
<Y:S6? 9GGDa8q5GVcD&k9E#EN/a!<F6bj#CW4e4cVjQ$/&G>8d\kHKtCHJq9JiDEhmm*yj&TVP5SK>HE:8aHPN
%l5GG9 /n?d\*!K#hJ^F9Re8$^>8l8TZPDbVc9d:R<Dqi^beK=%YW8y:cTiCah!5ei@5+u8&uJQ:m/&KdD6#F#G
HlkAB# 4V\Al+4$uH^1HE:GD5hGntJ9**?X^+mLX@ph:>kiCSjEFRQFH%>a=wmpRn5!LA8hQ/C::!CuME\$D?AH
bAntyW qWuiq$Ghu&AnMnIk:L*bXaDmadLk>IqA=RIuVu$%KAZcV/+\4SXXBGI6J%l#Bj1^T<t^C5p/K!?tD^Be
Z9aXbQ :VnB$XjJD8KED8!8S:y=X4y#PXD5K4:P+qX5<>TQ+iD#ZePP!w?QbC?Jye1@w=*Xl#dLFuJ!I*u/$d68
QliD/J +l!XC!nc:KPAln:qCw^:ljcXww6WGCZYDA%=BR=5ALDZJwHiRdbap+!/n1wD+\R?GA<6YEBewdQQB&86
LP5$4a Laiyk#=lb:=nwNG9DZ:\!ETWMZRqLyd#QM1*yq4#$D?bH<GR#cRhZl/QHe/cE>NRY\kMCBJtMWSB!cWW
PpbZp* EHyQn%hJt\55!1Xmwa:u^K5*Nt^%R?4+TiEyC$i/b<p1lHMLj\eC?Z?p$mpZ=Y<S<9>4Kk<E?1>SiTCe
-Ap&+C 0005d0a07be001202b4 Page 168 of binaries2.zip
ZWD4d+ 9/nMCL%:bWaw=JipHik9TB\R/F%JP%DAZhCkY&wYRIF*Rh>YqSVKhRe$N@A&NPkPcBDpq9IcWP/:wLq8
ajKD*& 1beABh<B#ZY4#uu8kL/hhkPF@Jp9AwH?#*!S*?5#@PTLRADRZ@BFwL>IteHF^RQ/@$QKnG1/9&%wW^A!
jPpy5& +>\LtVtaedAC#%KRRmZyI+a&M+5t?uASRMHWE<G#@9ck1AFn=+H=BlXWqtC5tb$QE6yA5p:>qc\ih$<\
%YSFBT BcaLAu#lXDkwiyl8*Di<t\6W%qHAGW4:4YAVB:N9a4YC#+GQDN8cV51d?Wq9y5Nudnph*ZaTj55hk8<5
9WZ<K# HHl>!K#b=w4>!InwG*WS++:ZhiH4E8>:MXjlEq81:JNljAFW#i@8BeAn$d=BS4Rj\GGDV>auRLeKF?EX
:yHZ4< #TyWIEM8$Ydq1lKE!&^BL5qi9+<=LDSH!q/=EWRkhPDYn!iJaeW+DC?bcbuYcu*GZ%q5*t*4W&9kND$i
&^wE\h YNnqie*MnPe:XkIjZ5+5AKMl1&L%Edc9yeX$m?$W\qE*\a9$E:uyLX6FPCNFMW\ZIPp>5@:P$E<qmpV!
6lS#\S >k#JtmeAcISEGwAwR!^*Z*qEyHG<m9JaunctDXk*Lm$L\eF&wa$qFX&9umBuy$y:JC%T!tlQkI%lD?Pb
$4eT## /BS\ET/qRV@WlEYdK<plJ\Rak=Y84F?dm5Y+CR1M8$RL<M!#8P$1K<Z*e18JPIlw*BiLERZamCSeV6HM
M#kuY& K^nu#\X$XqyTTP%LS*cP4qG*q8a+?bcBS$=+l^/@nW>+%Tm$j@ChTBSndXi$F^TkCJLAWAqC:y5Q9bTd
j*Y/uu b49p=SGtGRXRBmAYH/IkIRa?j1A/dbISJ+=H^FkZabWAch^\RQkmb*L\<6q4pVy%lWA&\Llm*VdEST>B
un5DVk PMYb1N<jWZ&Id^bQYa8&M/E?6hE<T/AJh>N*SbEabkBZ*Tq/$jMlee6h>kkb*WeXya+qtjiN@%kDuBK=
ptew^N 69PDpJK!GLAiqd$4y%JLY=TTP/uhc5/&D@@mMbBb+A9\km!APuM/Jdm#6VKDX&*t$$$J5/ZDCA9GHDiW
?Pi9\C qt>nn:44RkAGiGj6Ra!4#mK4E1ZWtiEXL?lA&IBe>mIy\Y$K6EZh9>$&X^AXCCAmIYXdh/%8*Q4\hR4Z
K&V=iu J1&%dKy8V%?jQH?eada5NMQ*Da?4S#kY4#>8SICqCuhCihn5pLim^XhHc8:cqTRCbQ5>BRGWE$G+Yeh$
NAZ*a: :GE*SwVaHZ*yHWdj9IpZyI1qFy$6?^+FEu%?mRkb\8lu&D/6+KJ+ZSJ6=mJF=LJ:mLRm*\uYy6uaQ!PZ
uq@D$G FhyZh4>+a64l<=!hKDawKda*YIyd68wCNpYKaTMT^pd<bkeDN=P=Yn%49L+<X/Iydt>H!%:RnwW\kBBi
9EK:^I &FAN>^Y^mDP5ShieKYla=XqLw@=p+utW*?l1&!Pnd=%Kacl!\XTJTdVYYq4JJ4dXXPV5nW5DJE=+Gl&>
9kR@qe iuWEMywaL%\\C>ATpmVbGBTp:!NlKTS!t@b>:B=&EZiE%NZ&<YYtjFuCLA$Sd\#ei!n5C:K%hPi5B4uN
y94#GM I4K!/cBKNASG#!>TGn?RC95<\#HHmIq^umVLTn4cNIP><\A@%:p@bJwn+Tyl1Q9a=RCVlQ+#\5%!1#<1
L?BBVj QTeBTi!TwdVWG/YP8q%YY4j//Ca:IaqRA=cL\PBeIR:pLhTGHlM6PmIKqp#KdJ@EFPDW?B+%>kT!kj^F
q$qq%e 4Pd\?5MWLMMuhPJ9idDe8B*#An:!d1<6dZN=C1C%BhAk=>jyZhl+A!IEP^RZ+hhAAP$TRy8Pqi::1#e8
%Bbl=@ &IitD$6u@j8#h:%Ean1nKqCPNC$I^l$:jL!E%PWj?jm><!!:TZ65kjykPp*PJE#u/T#Ji<%yVT@6TeI$
cAPdn5 Su9n\l^JB:Yh=J:^pBY6@jlDRbhSQNy=<*Xl!!aqu%H#WpI9Dd?ZLEy$:ZyF18$p%q#aSinGBAn>&THC
K@Z^4G dw:MwTbQ=%IbeEy*tNV&&b:&Vp9F!QBFa!8+PCmNC=BpXwXXSH^wue#WQ+RS4N4n+ZT>Fhw=$S%%S!+M
k@ele/ \i>AC4I*<&&89eCqVb4^\5CIi/5VV>H@@pX84&*hKI4W%!wPweukYPSFpRamYHhLkPM4LiFaS8BBG:l!
R>C9u& *CiX&qcS1FCuiC8Z1t+j<DH&I+K@Y#Q:+M6u51/Z8qNISlN>mJ$5Cem##4aq<wwQGmG+H*TmN?a4CJ?*
K$qZFt k5iiLGyY&yltP#caJC+%eQ8>nB>SaGPX6W4?5pZ8AGH$Cy5kLR=KnXN^5=PwG:X>Pm%WaSQSIcI!8/cA
IieB#X 9Em&VEuJ?nGNbEM$jSwkqYGLF/A<jFWXyjH6cYE!+1QC?my4l18u@ZaGGl?$QZPu%:Dqm@Qh?L=aQDLD
aRdJA> PEt@NE%p$DDXD<5NX65m/6e%ZA5:u<XPWu*ES@ulukq5lSJ#yD!wcpYAXLnVX*+%pKl1bSY:HNYpiuV5
9Q@BQC I9ETYbhPu>FK%pt?=5W>iq!YKjcIIct>MF%Ty?a<+bE&h^b6:Q=*ZJ4qJid6M6yi^StLI?^++W$<bFjD
VG\WZL yk1w*aQ%<bp<l=VD:Mq9ZD1kRSIl=wpIZc@R9=HqeJ9w8MR!iqemu@W*yjD5=d=>nD$#D<*&W$5@HZBt
%\ht+$ n&B8Xl5*#V<9TRiqjPcWcqB%IPQpqAl>ZuA!F9CJbpyE\8VXl\6i4i/SaMBlDYGD?Wj^\W=iqI=GMn>D
bFY4hp bEt>\K?i!WFtM&6D*<JiQ5%uMaRKMF9YYdRqF*A!9^K1qaZSFLC>5P1<L>IewjA<w4!Wwy&W%w1&b%1*
=#cCkY V*S@1MF^j8KlySj=i15uHmhcj$*W%<d$hJR#:dlHca+^FmF^p*$mH+KdTdYci\4jWVLjIBW\yIHj:PWF
u8%GBa 4=Ie8:jwZHZJM%GQH*YNqtqJLM^\%Bb@MXk8H=64d$I@Q\S?eYl<FNHp<cX?Q<mF5&IWhJA+jE@M>pHk
mBR??E 84^aX?>R$@Kw*V!HhHN#^6FbDj4n/l1@<&mCwuiP^p@^%aBk#4\JT8KV@qReY<mdMT4GMndQPyNy4CHi
1uj8#V IJ1qF1G#HP+XJZ4?w?R*8WcP><L/9&*Q44$6TAEEQ8*#$mBjN<<I#bjnZTTai5SZ<c#iphS<wEqk\%NA
%6@RWt y^yGZ9RB?T4t$tPykRqqmcq!!he<#Scwl=d1E6KV8%jyaRbm#e^6ymHm6BPKqb1X*CESEpjFa5BY&\QK
YT&8D= H\:qhISL:RuAT+p<YSQc8H@#>DBX64k=4?B5jmPR#h#=C+:yQL&%PG1kBe^bhBQJP^Twm@^?!M^*/F/\
lNEcNX \bc1cd<nDC5Anc=YeNkQJielX8BGRk=TVJqaDMK*?EB4:H#ZymK<uX:4Gi6<K%k:b5ipWSH&pIW#^<uC
X$ZZ&: HI/4KF^QuJ&8kL$e!LJ\4%Btd@9>Qw^5leYh<dB/hc!n%Z8uld*%#BB$LJ*JWXJ8iX@%qFdmjNn*+u:^
RN+1J\ lXX/1$*wbZt:cGt=BT:%Ge9%\j:cTPVbBb#AG!TST#8b%4G6aZcK\\%yIluM%lFm6LDyh49pL9TVM%at
B\CI$5 Iq#td5!8Yn8J6S@hdti<jG!bX*:Y^>Hwd6j/BXP*n/NQE6Y\d:Na//D9c*n%%^HjM>d$WXHqd:p^TI#<
KZ:tw$ !$#y*!6J98@ty@d#L%uWLl%jLA6@Y@djR^?udh^pjtZmlaX$Mp>4LTSBIw/&?YlL%Sk\5qRyCZemR:P&
nmhXjb =XF&6eFme*@aiRFJC6$B*MLGGXyBR!kiPC/9?p4jNAiVdJwBcZZC>wk69E%B:CR\&8jR6nZG@>L@yWEl
k^m$kF =:hC=9kNmhdI5!4y/ZQM$NQnwTFH96baeJ>Mj8HSi\8M/6awFy1*16@l6JDPH6&u?*:jaZcj:d&uI!5t
j8hCDh 9anwPy=jaQ\SuihpHkRdSjXcXFH<*m6S8BGn+8q9Ak15+<tNhJwckh+el&JYbWBPYIj<qtXN>awF+/6J
CMdnum MRw%JQcaGwR85a+nSPSH?jHt<yXK@e$P8eDAM4ju:N@Wn4AhMwhbccYT/aw^8bma$NbJ*84dteq5lDbS
jMASJ& D!M5\t%lt%8!l=Gh^<yWYcY1:MPG^Lc<kte4@IM%DpkWM\X&:CN64W/1ajZ&\+!elaHqP?p#uKpLR!PC
RR$Gju Qhc1+>bjLbN+eIXRVQV\uP\4YK:L1\JXnd?XhhFYe/YL:88#^*u\?N6AtaN>R5@KKGE&Re:jV9bi?jKn
$b^E4c qK^>wG:@aQ>y&dE?FZM9PpmAnZyu#bhZ!V6RNFe*TF1^%HCD:ak5lV+i:aIbGRpe49nT&L/>R=b?9JC?
1QLGH/ KZLMJ*JT@pCK#cyLyMJ#!BGJQTljhQ>dF$5p&^whT+>qw!k/ZXk!hk^C4dQyb$p/nAP<$6IC5R%yBnwq
I&^E!= ?4W=!RCw$L:R<XBpdhE:nGMAejqZCYe%#8C%YPt8$aGQD$&?*Je1V\e!5WSbG\p@lIq!5C6Pm6kAScd\
uA8<V: ZmCb5T6@AMVhp=neEBKc^XV?%Pl<KD4tBFQib\9QA%a+^>q#hmbkP8TGmy=LmRhA+khIRdX:J1A%!%=F
>V^/?# <Y+EY$euEbS+W!q>#EFC#yFnjtaDn1=QL/Q*8BB8<aD<*T@\**6A@m*Q^=%hG^DPj#FLCRRI@I64A\IE
L4XAj\ @K?!qEAApD>tKjq>q/4#b!H@/uV+8?B*eZlAPLu8k4/qImmEE*RZNQh6cP/:wLq8R+Q9kAcBRLikii/C
StZ9BF BuLikwdeAe$Fkh!Cl6+F#j*4HCeRAPhh$IBd6AaA*AEN=LqFc+C:&B4\Ny$D:tJ4kF6eXBDAZY#6XneS
6>dPHE BHAZa:56R\wEeChn+:=NhJ=@C\*=XZcY@@+Gh<#PAkJVepMlqCAwmBIM+L^Dhyc@V$L@:G*:Za:@%69&
V&/T+d i$KY9*udjy8L@*ljIPi@pJ$F>H6&qy??^h?#5\AlZQ>chlaRF@j@uA@*/jIKKm$S%n%@IRNaw#H+\j%k
MTtk>h EWMFTK+1G*G+tJFC++d4p$jSE5cKWNyEYab+Kj*>/6J/Ha=pGXMqcP/5DW?/uJqT$<cX^>NMtLp!L^%S
%%B1pm BNm*jM+m%RTeIX?wdKuCt/hcyqc1c1ZT9Pucyqiyd1*/tC+^Z!Z*#YJ>m$u>B:6GdX8%^*t#l<>chi*W
h?+Bj4 Ync99uy%/N84<>H%eyu:5l?1c=9!QIkcMHdW+M6Z@S=W8%tn$d4%:Mu4eZM8puVhINtCcW5Z#hdIeQnR
LMB19G YY6Z4Tj=e<Lq<#aNYt%dH#&e*q5<8?FuII:IYDu>4N%8B9+/8P*545N9J%\$h?D1ttE:>/!6EFe1&=hq
5*4L@% &iuN>wYJN/4jt+aQ^=>ii8w>Lbldkt6:*9d$#Sc^4wwADma!jEe$K^bmJ\:?@A*H@cp9>&w=MH1C?MKC
w66<@T SW\FEF9y$LJ<eI=WupRZH>+V\tWB#:XQ!KkR68MaL6$RC4e1EIuFqK#BCb@Gp@X\H^HIQ148^HY%:RT!
JKi$q@ S6B$!F8L%QjlEaVRT8GF*/MVA#n8+$ukDXQemI?C8Fnaa9\db+dQTq%HlyYpcRAnMhN/%LIS!mXe:Ge>
+L*ddm M+<4#5PWiNtteF9al!jmQ:Q$S+!eCqe1VX@:qyqV6ak4uJlRTW!cQ!HubHPt/IdIu+?!EC6cnY##mDm#
^K@$p^ \a8waI\Tek=N8=BKVF/Gy<kw5=l\m$$q<B/1Kcwee4aw8*#BWqIBM*>YtTZMMJHRmEP&Mm/dcZ8pZXH:
pXG=TT %WC6\lX#dFJ>h8@WYLZiJpq*\y#d^H\/%1VIcQy?L&9:wqJbmJ%8YEcuy9c5dK?Ju54Z9Kh1$uqqL=eI
^wEK6C CCid=idK&q/W1>y<eNS<hnlY9@^S</QQI5dt88IwmiwV&ZEmV#ShXii9yR%4iTw^Pl@1&\L$>h?=L@89
ZRdT=d Z<1ytRK8Zwd+#bG1QLbe@jkRHW=V>iHn%FWNHcaWyiFAyV!VFF9/XmNu?1le*XT@J\Zd=+qGN9*NjW@a
-Aydy< 000fe04686b001202b4 Page 169 of binaries2.zip
Vl^FCy >XtQGu%pt?uhtp#VCI/yKLWmN=8P$5wQY++^FJ:SVbtw44ciWN^HdmJ9YRy66Gq^uy/4C@kRRCKtTK:Y
d@%neY L<=48Nl#1mVDk$&q6dcI*5i*DQEZHwjHjY8V>Jy4y5:iPG@8C8eiSi9=A#Q4IehS6JV*b%@X:Jb4H^CL
^+hSTF n:Y&jjSb*&14mNpe%XXL&i:@>m^4>$%:W6F?/:iG15MY@4tt+&b6?Z8uN/<=S5?@QyKj8j#/&8:D^&?Q
JC!8IX A1G&:Luml%??Q*y:?jZ:/?Pd:!6I<N+\dARBhT#+FSE$H^k:m5A<^Zh!Jm8ddG4WhqSY!=Yee&8PYjSP
W*nmPk N#/L#GFX#+BJuM=QM6aGVB%89Z$EZY:cF16Ya9+ta!Shu/#NDE1+Ap!/KL4hZyyR:dhbuqSnh*<KN/BG
kA:DMV 5@b%IAkTee9Awm!X%qy*?ha!<Bw4Y\a9!KThNS>jKtlaQ%mqbFPZtWlpZA%>QpIKCCwZe?+phj^1MJLI
%1TjGR I84$mNk\=lpeCq8CGGwS!dVtVeSyXu<6wRcF<YQccIhWIZEmmd^*$/:AmVY&^J*tHGpqb5waZ\DHIHai
h#R$Xj :a%Q#EGmBPe8b5<tYct^I%lW\lCZN9\mQ6n?nJ+w#!%w+!BLFbDdKQWPphwa!TytiE%qBBw?8SFiCXRe
8$\Ad* Ip%ma5<bID6<Ww&kI1Yc&GVc#KF!Y1auD1%lTHG/d#^$4T!8Ec?jd$#8H#64R^VT$XEAmE/l8*+?=9TW
@yLFc# X^pE$#4\>$W9e1/q?\wQ4JuX4YFGi^K?<et*l9>JEmuQ$$KSy%tmC+E<:9Amln$K5Zu%kVkLAN#ChI1e
e9c&6Z m$mZ#1J#4t\&&9TL\NnJal%^^8tc5Qn<yH=LDj/mMw:<m?#$1YInLpP/J*uVS=uV#JIKhHqmlSjjZJSC
emt1VH E<TaSdtKLn\LB!$6qHhG/dNehE8F>pypMGyPT%Wm1%W%S#Z&ST$<SJe1?plwEQeDHMyX^y4XNA>%>u5R
pJa!eR @Py1/*yVZ16yK!hX^Ck&#A#DnXwV!8SiElYwQ$5!6J\l1K!Hd4>DFXY!&GRD%BYQcT\?MV6E6mkCT\%M
4\mSc: 5wAMnQC:/%VLb#Zu^DJbc%B#ZJ1uTAb/#Y%/t^yWn#/ML?Sb5LcF%d1CceXdun5emR+&!Se91%m?M!#?
=!Vb^J WMj8k?PLJMZpWK:#4pZN>8D>R1e>Y\K\cjbXELLc1R5X*Z^LW9tX:5LM5:K<qRC%$PQ*I44W/LAY=<p6
lVtGK* I6&TD%+uKQAiQF*6e!%bL$5NHND#K9N+4e1+K1+R86Vq$Zu+$A#aQjJcp#AdpaRJHwjyawtR<D<$wGAJ
p!Bu6n PSW>:L41?#!NCjXXe99?aN/uc:upM#EA#NT9j4Sl&IwXYFH*Jt9\P/tSWELESn&$Q+YDZ8QAI>AYc/Ld
XpE/H? yH+ji\$=@BR%8Ch=uZ:#jb8bw!h1wKwSmiHb58>b9cl>p^&:!e&H6H$mk&c=@G5>C6<+9IeYdBw$6N8a
:t=qA^ Z%<jtXV&j^aHGNPV?==m:RTt5Amaj*kRWE5Ec+Y$CJ51449AwXm@cZ+1b@GBK1Y&qui5pSmc@Nm8wE+5
&6WXHY cp^DZ5FC8n>nBKXkl9j6W<5&A=\/q<5c<MKe%RiQmm6++pqia6W6YeGTR>Hu::R+VK$@bNR5#&bNNpY8
4nwNE< &n\yM*qR##1Y89*a11*!BD\:QcT=dFh@&LZG>my*Jm&^a?eJR%X>i@PH!B1uA=&TcuDm8SZ=hIN+^tB:
T5Spdq <4idPjL8q>cieJMRA1pQECPZE$@Eqmw:yCX6pkcLCJB8<q65Zt%/Np6?$nihSA<qnL/L!p88>$W5W=C*
k?t5H: jLEnllNSpqIX$eM:WuNIieNI#&ee$=y6ew4X$FN@>Jp<M%kELYF$pH+PqL#Q=CC>/#H=iiQb>tKawRQQ
\c/ECZ $?h=ZlKSGd^Kk>?c1KHV\Z6QyCWhHl#QNDLLwBePJFTS:E:tTR96u*E%Pu4&9*9&uYZX=dP*N@c5ELy!
!B*KqJ V%wd5>:wGn/*CbL>$hXm$XHpp&YM%%TH@mR!ai$ekn65^KitW\tPa\HL4eq\VPq/w?Lq%m%<:?LP&++G
<j5P?/ Q?PELL!%86yb!5P:j9Nw@&XpC6*:yIXH!#aNQG4Qh+^^y%>MVS%j*?9ejEP1jBQ=h6!6aESY::HD#b9e
SNRwy$ 4G<FK6iQhQk<M1SdQhe$9:#u&jS<%LL?4GFtS!<F*@QJh:*9Bq??Lt9Xjmj\8jt8h@K6@@YN^$Q?:*a>
ai+PQR Z:G8L/Qc\SZ!eKk^eHIwu+?HEkQ*iPR=\cQt\<jZN?nZZyFL5Tn=tYn%Y:%ZcXEw8=!km*I:^QJPyEHF
I\D4YL BS\XbH6%ZITVT46LJEuF<N%9qlaQn$LeV5yhh>qVE!Jhh+<iwGBkbk*&HLG:IFakJeC<L$=iIEYu:8@Y
VTlQ5# wGLjS^ZFS$d4SiVMnR@^Rhwmm^m9RIG>QBCnQYK:SQiDC>>6*1wW&#1SSm51\$CV$imnRpNVVa<mYMEb
<9ykJ^ 5cmWiD4Yeq>W=Z+q#4hKqK8VEkVPT=#iR=#^w<9:^QeBCI85>?G1Hqw4QMA#+<K4au$@RZ$VA#SRAPCZ
/T/IF$ +?LdBSAkS?CjTllN!BJ5:lMCqLWtNAm4yAuph+tRY\lQ#XX\damP1+np=+nq^\b\VcHnDCSYpS\^nyAV
?AI8SL HiK84bKaTMlEHKuRPttM&@j8BNLVVLdVQBJeh#AMP!itkk\RRYdQCl:eJ=6wb+8yHw?lBiH\y%55W\^Y
k:Ep%W G6K>X$PtVeD?<LD<?RP&bjmwd>!e65u$KR?S<=X^N!qNHCkun1tA/K5VF\h9y:q^>nEaG&ZQ<B@t5V!M
5H@WHq 9j@R+bR!<n=X8hincEPkKSe/Y4y<Hk<NHlcNI#GNIqBHDy=t4PmBEZ<pV6tDM!dKpIcHkZIca\/Wb*wW
EIANLP kDw!Q!mt:$hKlY&GTVqP&+NCSj*V6#/Q1mpNEd=TK4=WnZuMXDH=SVmFPccCBjei$=pRV*WVGX+d9PQD
l/Jy^C hai*=Hk?D^TkbNYVdJND1\1wn#t%&K5Q&e>PQL8?pFa9Cb=>=5n=#LEi&HQmS/GA#GLnT<$bYMCF^DN1
K!^CjL *MHK9ulP#myL$lJH9alQ#^NlVJt@!iYL#DZ5A6^u+tJZdB!8A9Y69bqmL8MT1b1T+FF/^HX8Aub/DPIm
XuQW4k !1@SBW<bWnybkM+Fc4p$K<<hPcMuEE*qKtyi6mpJk5=6PK9>KI^t5GG>><&@&eaykJ&TG:l<K@GDtJV!
9mZbTX WQ8My<>4?J!WwJWFuGQnZHqLCWYFW$:<qHGQ?jGX?JZ1\H5i$HN5pbN6dKb&bT:Z61u/pywY>Ewi%Amm
!w=iMH LtiEEkIWV4wqp*n5LtY<atimAH#XFtZ1wk6/:4l99WwHlW:nZ+\!lK*iCi$qCDMCANSW\5W1I6$1HI#a
:Rm5e4 /<wcuIlyanT\?\R&aleP+mAZeiju+4Wi+le?E1AACieRmhwIma5aTXD<jd!=S+=n$NwpKXCiqHPSXG&b
SiGMMl %EYXBDBM?IRMPt$nT6AyA?1lJ4CShny>RyMpjSwm/?Rnp*$y=me41\#*<wJFN1=P686eDqFaVlu!euyj
A>PG1= duySMu=bPnbL88MW!4ZPi:/6\GZBE:i5kQ?C4!mHQ+E?!1p/qb6P$Yqd<bIDht<Bn8AW?SKNqc6X&#/L
bw>!hG %qlHQwGPY+bN1a=mE6@1MTGZkqKFckK^K1GbIni=W9?eMmG!QLi+1J#MKYe*w??mmkyA=bJe6e=Bqh6J
cNJYt= =Z^RXiYBJ4iG^w!Ntw6dl+9RMb+SY?+e^8dIj9S>?RSG!ytp^@l<QVMqtm/9qiI&NSQTNAqhNFS16FT<
HK#X:u qJZjm8Du$CiE+TDMcTeakGbYNc%yhF!Su%^P1Lui%$ua%b@F%RB>%<$@Xb5iba5SM?Pc\/cZmb6SkV1q
Rya%4a KM+a<TeK16SS<TR5G%%JK<+RG6TLG16TGaJydc?aaC:u$ntkmNlEh8+aW@B#8aRGF4uH4IV?=wR*HFjQ
9y6n6w #P1n:X*N%It5aLXb5K5+T+bBC=hV\\qj1G1WyYwh:/\Z9c49b*A/NLHG!uYA$4YF4aKQF>^9ZX>uthDE
pm/H4h NN8y:Ghn+@4PE9#BHQ8T*clI?1Lj49/4nP9aMZkKNq%n*+Bq@^HZkahR9J=Fe9aEMpj5!EQu?I#J5hbJ
QGSYee 591B\+WJJ:ijp+PZ=WTD$>5wy\aSYhCqe+/Z<*1u*ZEIhE/RWVniQMnI%Smd&FnDnP9a=V\VKmB1dwTR
Yu:uZW nSR8CV6%>15S<cN?QeB5j^:kqmCXectAbhEaV!<mQ6MX*59#DDud1nyY6Y<P>C^FIKV#$hHiNu%!P:IY
u$DW$W e$M=b$QMR=/tF?lJF9YdTJI8L?Y!QAQJ*YN%H1y$i/nXCia@<^kTF*IFtqR6JM<hbM&hMkEh5NdlQR#*
%dTj^@ u!5%9dkk^SmQ\j1a++/TK=tM:+GuRPQ:*ch4%=eA&Sj&qqq!Xh*p$M?S&Ei6Zyj+PyJEXFBhRttm^XPP
dt1>QZ <%ZDKIdcPc=J#R6Fh!YiF8==W%/ieCCJaEDDh:hu1<<ttpKTu\b%4RiC/IKNMy:qdk\E\WqElRY4J#/i
PkeVVm %T@6PuN%T*mthB:cwA=H$9Bm95WF1ebFjZ+VWlT^QlE^9\F8*I*MMa9<hBJA5l=qXBiq@qY$<W5$VRW1
y64%L@ :KF/@d=byREmV9\ynpXMu?:8FR>m6Gi!^MbJNIjwP?/+=^B9p+*%4u&51Rk@#w?^5LdabC^t8Y%9ZIEZ
PMTBKw d+GKA+6aWPualu+MC^u6#&wSu*XmmkLD:X@FRtYPGqH*<#+teBY^jZa>l?%m!Vq+nXppjp=#4!ZHV5qB
+%i@+F k4^LkabyZYACauCV=Ik5wS4?J!HyZFHSmY<iya!wpMbq$FJqQJ>*d*1V5ZGe<Y:nCZV*XWHNK?mJNQV+
kQQXVF 6XHL//cdF$&ZtdVTtYTw9Kqath9hti+EV%Q^5*JK5qIyu=A>!ncKl$D^e*lB6q*1VC#uPhiC8d!m8i/T
bj81CK 8e&!8heKid\1ii+cie$/iheG?d\t?i+Y?e$&iYCX<G8ZA9juBTY/6*n5kaBjlWy^e@/HZ9S@Nd&I1InK
Z%up9* &*AR5KLMT%wtp<bMkELqB!P6W+BypkT8y5Wi>B:CI1hSbJW6:6hnW<KPA/wwaV!>B5INbQYaQcw#tAb\
ceI!eD 4!t+=j=GNQyJ59qJNB1YRhI9!X?66I\Kw8wCM*M1+KPYI\?=b@5L?#kS%a6\ljMN@mR#MTP#5Rd9%h4A
6eR8WX 8wD!=bk9eVCy+PaEtlVeaH\VQuBdm?JA#pM^QnaT?*qwXq#a$/pI<qAR4DbHSXJ=8w:#MFB=ZkAM6qGT
LI4:K* j<mn:JVG%NFbm6ekPGT$S<4PSm%KuA99dciD:p6DGRMaWTLu1^=1kWXQPd:W*alEbQEp1$j\6!WKwlLI
DTJw8@ ZJ*M>w<p1at<BMdY%<@DAHZ\adGLC1QV?kVITYFln6^!=y4pAaS$VVdI+BXBN=$EQ/ty&wcAekK5b?89
D*li=Y 9XakLH<nPJF69D@a=HAGN?+w9NCHS$^:WeMtARMkh<w/+DITISKSAXYXb?=4+Jj!>4Eqim9wc^y$^%I6
bBX6#L GIkc8KwcbC^Ne!64K<pyy!Bc:+W55PeVaK@C>SC5IBa1!WdG:!9#NH^G$Ww1Q5h^$EF8muhKjViXq@T1
5YZik1 =*#4pcI?I1MA=j+F>/c\/LW1ZjEJ8%L5+&YFR&ctD//dHMTN4XaGRucHV<Ce5\V9k+pYI+m\^DC%Q#V!
4?Ei=* /dLL$ZJGEk%$uYwqqDY>4I<ZF49pJ8E?6D@Gi&SX/5D&VZ1a?#t:>qW*89ET5nmX9Vt=cFli:IDMKibn
KphTV6 b>8+eSkN/I6XKFhpBiE&hW/E5BVSqaN+D\GKJ$YSd4iEkBZW=y84hd=Gp:<MMnKyiTG*\GV#9Fcc%VEK
@k4CQF *Md4:DNPLQlp5C*ti^K8^LY9I=Xm85\&Gp*#>Plpy*q$FwK>dB*YK^yY$YB+bCE!FhT\GaeeLS<I5DF\
-Aun5i 000e2a7cc04001202b4 Page 170 of binaries2.zip
BH5e4J \a!a?n*pkG?SA4c^Qq&$mwRVQ\XJ+4TiZW>DadciiKBc@#1#JhhpM$8H#u<FK!=GX>$KLldSei9<ZTQA
QI%=QH y+QyMiK#ayMRLpEwFb%dc9+\Jnp?wcWWAe/DlK/aNjS\dJ<&N/cN\Iu*?F4/cDl4#RKGnYyDkk=mSbKF
\HkHJ% /miP!haYCuDiEEaX>aJ%GYiJWFZlc9&qu6R#DqD?HpZj\Fc8MKaLyCBLcHARFX%6*6tTJS<5baFVuHNV
R&#FM+ EZq@a^5B4wb&XEqZ!ZFp6h+*QuuSRA*k9Yu<FLRS6BmQKa?c#nM\$@mAMCZhPuBpI+cPbG<$hSW<RpI9
Ze!V&\ AkjDJh>@cX>kIq8SjIBKj/Cb>8MNY%5$+FAA@MLFIAX5&MLE\$1D5=*ci%qPj@%8mXddlk5?8Sj@I>HD
ALkNn+ 6Ap=XGj!$k5=8XT$*9BI\8yGJtZ4BaX/N^nT?5MEqRiFp&IYkb%huIlAT#<dKm9bT&1KJMpH8bme8jSj
NRQd8l mXN/iV5Y%5TMS<ZCy=JhLYuiDYMX<Mb%V#?ZJaWZ!+HL#y=MjSqJE!KjK%PII!atEDuD/@i/M5Pd8d?>
lwiE8n A#EFD&9dR$*B=b*Wc\XA$tFyyk#nh+C1R+Tb$pMPRST^jDW+S1MD#FM!hcFB@ZkJE<pH>4=\\+<TX\\K
%EyC*+ >i6pk=AN\LpahIw8X&%pIZWtyJajDea55>IEXplp4>MWedI%NjLDcMja\qR/&:9IpThI%FyAKQpSiYwu
kauG!@ MK!paEcW1$qN+GZ\Ry1S4YqA6SEm/n$k:LC@@G%d=65l!=^P!YI6%8S*SZWT#+^N&JJ5E$IKpbu6Sqq$
JA9d1n 8SLbC84166\TH1iBCn!LhCRCi@Y=mBXCy+?GRpYmKF=+/XltmD%JPHcnjjDB5MFAnEcM&:W+#e6+4&t<
ATTZW= *i&4nipJJiye<bjmF@eXD=SC11a*&%S@4Cm*$ElSFHVZKylmM$Jw>WTSEkP:Th\dXawL5I6ql+VlSm&b
dq$?5l M\L/$V8J!$a5$S@STMWFEZ1S=XFcYL<kjw*=lJ?t:&B1dBnFkHl/VHPG%$GYh@Z^IR64dR8yE4CFPDy#
>tAER+ 1Q!hFR69Ta@*/$^9Wn@jGjT1F#T=%lSHn@NXLH*E*QwJ1d!N$!PnNN!WpbZbwKRW<w/GLj^^qKP#XTa:
AuMd>^ LXV<^tA$?GkS^mZ:Sa6m6DljZDqcp/hbSM+&6bhhRZSjYZXH>*ZyubS4c&KHbQML$yS1=%p$nHIYqHu<
VJ4I?N W6i?dLP5DS5EQt!+\DWpy4T8aYedK6j9^DM5#HITFJQuT6L>dBEZ@6tkHA*K/lqi@p\G4=56J@$VKNM*
R&a#Mk @GGWc%XBKdGcM=P&ZR9+6DK6mNwiqQ?yA*6aC6*hRK4ClKj?YiS:a^+uL&tyM!%8ZeRS?hjiLPR5YB^m
=Bm\^+ l^a6@nm&bT>hnMhw^6SckX*Pd4N?I&&bIP^/X6GJEBBhu$cW6NBP9N\du#ky=ikJ6+t&L#uuLDbK6u\#
eIQMRn V1H=JT4aPe@pW4GB!aj$bm4EEn\#5qMTiE+eF#umBCpW^uIid+mQ8h=w#+Y\j?RbphY/9@8Bm<PC*TCJ
YdCCE& Rtb1%&+DB:pD%m4LXC*^?H8=J9i:Zy*D>=PJGJZ*YIl#t<Em+k?!eX&8ElRj<CnMjjDNe&*Y:Lp^jVk8
u^d*qn Jwn$XQuRMiW1b9kil^dyIHtV5BGVN6Yt8=B6FR1mc<GMV!ZP9YS@M<TKAq%5K@@AqR?:nqhX+Bj*4IDQ
HZ+8<D <:y5<>+1S+1iZ:5e59A\d?8n/:T&i!Y\EcN1I#@GmDX<EFGN/W8=CaL8c:Y?RZX!TA@$tBkDti\$pD!V
?R%6Gd LQLMmD6ue#%c@ABTdQYuF1GJi<+1LayF%VI%PS6@9981^T>:4P?dhdt9*jEBV&Awq9e:iEb6X:4Y&aA?
?SPPKh 9/lF8CCb&j:&t<#*/<QwYHbnCmiep=bm&n9SPqEu?#qAeNVG\JmIXFS^YcuIJm4JYXumPbLePR!%%jV/
9Xt\8B Rqntt^ntyX#k^\Dtn<M4^RKVu+=cEQ9HNnl+FRyBhmXuu!6mZ&?8/a?<cl+?SD*&9q!Buc>Lw!KdwdJ*
=jK/4u 6XZYN8%n9q#*lFT/YhpNaWW=*ENZ9Tu4&e<e?Inp@b*=DD9#HTw/uIi>@9X?5MbA9X#Z6%+yi9H\?y&I
&EFFYV WpYWX%HBuHcbA6n:Al?NZ8tb9$hGd8iKaj<cRI4dC+MXn6qn1BE\*eeN8QILVQ@pJ$$\51Fu%D=TiIC%
9AXlN? 5lCn9^XV5thRLGbB/%pAeI/H:a^XWYAXdiqn*EABR4FD#@BmuHqEQ^I!/SFGc\yn!@R+IIR^::$#L?&X
4N<dJM SE<!aVeT6t/^BTEH$yGdl1hN6F9akySKEW4HZ8Cl$aPK!K^StTXMl=T*/tj%VT%p*LRBT%awX&pVi<*w
8a5FlK 5ip+PCD45=e=RK&a4XM$<#M/b668bW9A\t:=A\ySV461BP!aMbZkeRl&:a5hSeXC8SBEQSJFw6YJdFQp
n\yI#J aG>D#!\5>E%d^ijl!6>k$:qY9NM^lKkVAwb9jjXSpBcKe+&nt^8alFwCL:BSSQI1EqjyTYCD6i8>nVW5
B&R6Z8 u*LC/X@um%V&T>mZAuZC\dWBm6H$4+/^XAn&IJhD*u:IhK!d%RdaE/\tD=inEZTQVHQSQj9LA@W^BtbP
1%J!=m uSnM?E*YW5n5ndQa5D&^6h$:?wtE$<?*aEy!Zec+JFA&d/++:DG+SR4JjAQ&B+Cn=9!hcR8Byil<Ka8l
miyHNH N=TT^XA:PReWWIF@EAlSQ=iF!EKkT>XI&Z!98mV\bl8\<MHSD*MLL45A:wMh*81WB^$HA?eWnyET\X/p
6eA?Vj h^GmjYw5PXCTZm9G%C<PB8W!wTkWBj9yY>u8XE8bFyuKKaY\q+/N1<dJewi&4y+:=wy^*<>hSV+MXXew
8tBA5c h4je?GK=b>dFd<=wnFpc1^nicw$5!8YM5C>&qwGdkF//EVpTC5b5j88u:^BTCR+DG?byw^>cCPbj4:@%
JXu*Mn nB#R4m!EDDp#kt9yFa!p4J#+14Cdl$94\bnjuC!e<FlHblHXBNAL5*eapXu%^=\qwE1yMLTZnVn/!ba4
NYeuY% ae\EaaHQPHQau8A&j+w^aPA!Zb$1%?%?XT\qDB+:KV#&+a15VRmWip#@Tt9DFG\WBlKP%<eHWT8yy/GA
@V6RGR MJ%WRP6bEDp<^?A4:QQ*<MI4>NT#dl99pd9B6Edk=\ICTq$9ca#=R%EJAAmBdF*/#:GTu@bRmNXlelJ<
pu\%=< qM?$SFunHP@wp/ZWScNeiF/^h!5y:P@^SQ<*FZWCWj=&G9?@DyeC@nY?A\kG@TWT/heXn!BA$F*RQLjE
JW!eR# MRG=:+IG*SJmARVjAZ$d>RwC=LpLt9M&NPRPcNC6:adiBZ%d8:p+:+IG*waG*AHNhb9pZMB@C*$ZY?MC
M1K&FK *IaG@X9w8>nc:bFIZHe^6q5npdl+@m*$H+^N<G>DY8uH1LbV698BF/HppAX\5WQbATA\FMA8aYJkDGSZ
tFDG49 Nnhll+uD&J&i&>maPD6cGLEdYJ9bPXw+t>5+@blLKBq@jtq9dM4$6>umVuFHZCDkn>HETeu>R<QeQ?#k
:mbpLN DuFHZND@N\kPlj/6Bld\^>>Q?i<kN+n#V@FT9*jYj^e9>R>C+6@myZ+H@QG?9*C=kZ=Yp@9@MD8SlKy!
1+SIhb *yKSJFSM!CiRlX1HGT<LTTPcGa&u&Dj:LA68*w+yYmI*%9^>8Tb/BwWBDw&EL^6JlIW+w5SNwLlMSJnL
bjnayF 8G?n>\jhmPtAd1yTIt^$C9GChaPPjuXK5kmw5CSt6R+1+\lZnhS:hCjWdQp>#^m+Eb8HbBj>?J&bY%*K
^jVIti lRk=:%Q9ecRYR@ic&$u+>*aI+Xp+kH?uKJIEW9&>1nj>H/6/e@=Y%h6HRBDnn%Y><TNn+l=SBJSwk@?L
CP<?DR wwkdQm\$S%=ilSqF%B$h*E<\GGdFPe4%X6GjyGA%&Hcjl>ZS:WQ:<RkPcYD^YtpyCqyqEZJyh8:Dlwk#
@c=mBa bYXwPXW<Nc?w6STIAL5dM:5l*IlXj%DM#@iknl&Se%l$$JqERYlwbMmWSyaD/B#Pa+uuJ<eK9PmaLV#T
/PTXYN FLylBq*AXdB\<&GYCpyV\1k/V#QuP?@BC$\&KN1:tSJkGTA=eTAnCt&TaXcFc%LPlW6N>piP9&DA/M1T
lyNRMj j5SW^ltBTXCiTQAIj<FHwNhPQc=RC@?h6H1*GRw+IA>Ndu!#9FNLVWLlwel=Yamn!BZ\m#FR?6P1wPaE
d:pilZ Ae$L:AN<BmQAlThBw&:*/Cl?bEQ%b@!Bp\ndluZ8\=wZm/i\YYAWIL^C8a^h/^+w%JhP\*WW^q9%lFWq
X<$awu h1%lmDY=4\XFIXiKbIJ:bXeu%$hkPd%ZGM58i+AMJb!k#!<^SK<jaQM%P/JYSIXkJZbF+Tudcdka>&!y
aD/IY+ =9L49pTm=&TehRQd@Fn4kRHie&4=4^p=Xc+ZmRI/=iT?ItH56d@l@?^MRwBP6AL41GkXJ<C^1Mw9EBA<
p8aHch +*aL5TH#uCia+/ueNdJ/%/4TiPSk^=D#+iyCm@iR1$PShF&4RbSy8\qq16t1NCNDP?DpJVZQwaPcBbuq
&5$8!$ =R$>1enJ&yVi&YN\A>FBtE#TZBiAI&@:?uu9e5c?dl%yE>6%1aii?aKIY6:uNA+N?19Y%$?jSiT<?9LE
8nc=Ep /5Y%Z@^d\VGNdqZW?WKjcEF*$*IK%kKqbHSM=4h8ayKwYh#FtnLJqC+DGZq6ILqD@IZ:w9J6&dphAuF+
/i*Pi! wY>iSE$e5%^6SGLGSJpHqE&DXH9CNBZ9C:N@L5kme9M*$Q#wnH+D>pYKLXidP6Dj!Z9h<ppJASM*KuCu
<##RSk 1KjNCRE#+WbY\h8utk1SKGTNtXGIethRpEC^DD/$TTQ<JXMK>W//n$WWE4\>AdSQ\N@k9byu5Vw!5wB!
a+n>X\ /nk=1#hcqZ1n@WCj6Kdpe/8P&m1^l&X#n!u%XnLbESLQ$PGNPhkM/HD<^R=\nWm+kI/mVw?XR?AHP^*b
ER*9?+ N6<NE9uL9Z@XGt!Ekq4u??+SZjIuWZcyLiAADIcSG<$aG$JARJ6e^1=:Bww46$Yq#5jVp*EuXw>m$5:y
6Gk>=6 6&#I%ZVl&MqH1q9:hCkh@paWiNA5nX4GGubkGD<YabV:Lnw$S\Aad!QaQJAC!/FVRptwdyeiBqu1^@DF
KZ8$cM 8HiMETHE#uEduu6FDqYTQN&=Wy9eRGR6M^WeXXdkIKK\#Iwk^Em<Ete*D?%%PSApTJ^bCE/+CW:DhapC
h!5S\e Kd5b#E%EQSjhJWTlHCJNAnk4YFtRWliWEXAXSSpY=uIF\6=*9&4GD\e!DTQMiKKT^FJlF?E^XZPi/YHp
?iDJld iCSu?tnKWX@:t^Vb!Wt:EATtQmFLZVY*Bu$#/kX@jeBIDlS\J8PnFKyQt+pjWkNTciimQGW\1G=B4kE%
@8JebY mTMJC>Ml8<hJNPH+wpZ^Fp/*Xpl6Yk8+jFXn+FME&kLVNiln!%qyY#X/^^^XulN<bZ&BEmKGXnd&4FFQ
kFlk!8 /:F4^5=SK$LwIYH8b:6!ki!b?hR\<i:+Pj*>c$<PlKXcG>F5WVYEHpB!@Mh5m8%cMQ5en=Yd*wFFqF#^
$IyhK= %$&6h$k=:IbnBqZ$I$uTPjc=EYdTlHu1+5WLw!^?Re@aQKBnwV%j/FlEZ<JqZjD6cwh5uhwqTu+DVn?n
%?8Qh4 Z^4?bICEuJH>l4iKujy=uIjB8\p?wtl!HZ\JejaqEn$69ceKXww9w$J:/kJ4K#MRy41>@ZA1WC+NWtje
lWZh\n R?ih<Pw@aYGRI=H*qIjMQIthj$&icTjJpu&KE#4yC^?\XccBE1D^Yb4c*4<$eZMwb:SDkTe/jAXFSeNb
5Akbtj ubbc!#S>&?Q!/LttP4d@TnbRCN^8IL<:C4<@#Sln>Xq:H8G:AKMHnj5?=M$HF!@P+XKPFK/%c#uwGmyC
+1uWQi @GbmCS/kQCnH#lmBqqNmm6Xp@XEK<GBpPG9I^LS$I+iAd^6VpX?@y?@RBDNhWan6c1QDQmJ:+YWa6wAj
-AnZ?p 00034ea0691001202b4 Page 171 of binaries2.zip
n58VNE n&ZKp&\Nd9QI:X*+&W8>Mpjtq8jMb<t/q=VwnKpkVMcVl9%C!*JhBd<Z1BI@ykNHA=qZQi>iTBwBl9nK
XK*tW6 XcZ:ZSqj6V#Y!aBt%@iyY&/YJIqX=&C5&mEuEnddPK=WP?^:M#JA*5Zm?R=48QGaemL#MKCS/Q1pIWek
E=y5CV q+$@+iFhM/#!EW8u<k5Ci^y*Y&upBjT%p+LhnBiw=$T6CjN&LyjlZ=8SCP+e?^:AdiqKu!Mn+bAiA4+c
^aZp?m JtJIWuqlq1a@HeJ=ZknlqH=H/JPLAnGPWdAEuw+Z^iMLTi4NwC$hu!ajP^QHhtXcMu?k*I4:mPTDJjhy
KL/H$% Nu*j+?tZ6&>Wal%h!*SV:h*Ma\m@E!TXM#d/eZ56RNHC%FmkqZ*knH=dK>$NCy*tmW<R#hWhw+&5N?Eq
@tya\c T\#pieQ>:CEM9XeD:$pYm8!whd+*WXiRjDk@jHSM+j*+p*IP=5IJ:?ctG*pL%8ZMi\d8#NCtyA%hGJc#
GyEXCy Pkm\16&uWFK9cV*!%6buJ1^B4T/uE$HJ9FT8m*$*VD/b8X9pW#EqpHDDQ*tB?VQGcFSluihDah>QH^eK
pw4A\L hJK@#lF<W/5*SGe/W:#&ut89RYpLi:dKe8t1%i*:Li%S*w8ZA:ZNV>cy6P!b*5w>Dd+\+pQ8y4mHNLqq
kjTQM4 huEyn9$bnil4YRjR49KG@6y8T\uPHl%FHAWqCD$#\4w5Z:?Ni8n!&JDN#6^H6llkdQ/Pa#=R6pNLNqB\
=kV*J9 $*F?HNbWmlAcMmSQ<#B@\@#L#9SCkN5Tp6lNAMuN1GhS1Lta@+*4l6ku<d:+E/tdLi#=$WqSYAlT4:6C
MFH8Rn \EmG/XQW6XWMid\Qk+:/Ny+Le1y68!@>4JdSCk8Nw?F+^^u6cW1>GK=WaVuwJ!MRKXC>dN@\+Bj5<ZP$
E1mYCE wujw?kLaeMQa*m81Y=!>KQ##E=l9m/!S:y>n><dhm#=FH4?+SyKyG>?bP?#F*HTdb\y9GueZD8!TmlFF
u\/%YV #==D6*@ah1K9=8<>VK6%u*PuCGeH8=I/MkmJeWX@d=^%H%q81/8c+cl%RF>j?jAtuu1TQdBeSMbNSN<Z
\F$SHZ !*6i8!?$6K\!*Xk@*B^dheMe<#V#<JSh#hleQDCMqJqiB:qTQTcP*HSQ#D<@\RL9qA$YLdTWNJEjA^kK
JSLAa* RC*qCNclRQamya$mNhb/mGyyyQA1=nV9Ac$&=p/nb=jMSV<m5b*m95k:SP6A^tN6Duq>Nqw$JPtt??N!
!eEqnq uDAqG1R$XE:NRke%plNnC!dHwuEZ9Mw9NH&Wkc^him^LybYldaHyTb#^6yWy>!wLMQwc=$=ihuM15\Pt
>11%:h b:DiwN9ZjnjQ^?VM\cH5^tSb^4R@^C\G+EYQm#JuaNpnwXTmajYy\J%SClmnq^X>G1k/CS:VXui+K1Z>
m#S<a& VwF!u\!Xm+K&pA%DVK5Ih4YjY/i+<#cHZtJu84R5nHVmAi8GTIVwSZQ5X54b!1H^C?#CWte5yajH\^!&
=lhJl: +PEAY/BD4Y*ZAijc^kLDIBChHuCPlw9$Hal*W^q+H:TSuX8>J^J:FCQd6RQ*Zun!A=A^MFQYnJ4614W$
lN6quj :B=YyA?c+@^pEb=<Q:y>ALJTiEb$E#$8=%#jId=q+Q5!H&RqQ:!#NILKZW!BLp%tJq\Fh1FNV$\Fapd1
>A?%XC PTK<HIn*MQ/EyVTeL4y@M\PCM#@mi\kuK+y9JN>aCkq:PlWcmTCq+l+NtC8Hj<qQlAeB@NwZ#LNiLwSa
N/ch*B @4ldu\4StK6DAJ^nC@Ijb@CX+^d&\iw8E\bSRHImq+V<$RWm\jwCcEK&YMLZHMPaqIc?cJpCGQ4NnJRD
h8$N=J aKNDPCElYRVQy#VX@Ali+kICYL++/EahjKL5!/Ik/m=?X8y<bVkBiRF4=i+F=h^^=jY#uV#XjTMWW?wl
n?bte\ 6I=Z/CHG4wYN<Xl4>AFe@Ak+6DtNwG$EYh<$iKS*JNlPJNcl1MY15Bn&wkDHL&l>/8d&GjFHVeWSkJGn
pcF8MK tHMY?q%a>MCp69R!Ph1CcNY55hDtk?A1WLRiy+kTJd1@?JAI^<wWJYJ+9EK<t9JNFW5aZ9\qLQ!^54H@
WPN9*@ 1/=D^VmT:X%<qeQPl<b!5BM/YiG6LhnTXt#Zjy!49Y&H@hGB/ynaMT9BD9cup\4GwLLa+GGeGhNtN4NY
cP>&Qk Z%bul&QGR\FB>Rwk+BkMFF4CQyw?<qjYmAKJ$KhyePhwSEy=eujmXSCpn$&i+njwMq?\S=+IGV&eenqX
qNRDVj 9/#Fn6TkT%k/mGKBR+TKhQPDcMS+1LhwEMIEqaFbIAw\TFawHpNwt6SkZW&apbLbV$<EYbHbYXJpGpcy
lJiDd+ 4M\4%IX>wa%EaCCtdCHY:ed46#BA@WLeEFe<W=5jdIyTd!WBCyLI^8P1#bC5VbJe+=aTN#AL#&i/EtIW
hmTKj? F8bS8ynD+c8QV5@c&MYLN6S>G!PQJ#B*1wR>wey&1wW=qWM*8mJc>aR^8NbtiAtV?eWVR:MuZdb<G@i^
ZYY=J* ay9k51Zl#L+?yhQ%h9yC#QX6V+BR@+LPkPc%kTF+!Buj!JDHWFnQMJ:PeA=Ze5YSb++W1<6LiD*CI69Q
?kbYVu &JuPPFQRiD*JBK^tWt8KSGDJNY%uK4S6&pFwS8VmW9<TZnpaZ4ndHBSqc<JnZl?5XJ5qJS=NR%BmET?!
8A<eIt $@*K%HqDXcA<*PnlPH$4&5^TdNAPYpiWnNqntV#AM%XdlmyHXqaj&W598SljReT6ki!^M<q?QH1ld/LS
SC#ytd ^aFDS%$:/MadwcN#6HACcJVB/in<GlE#9IGNu>j^6A4H#T5t9\$89c$#F1LW<tIkTC#JIpAly<mqXthL
P9uNXX Vhe@$hum@Xmh?/WSb$I1ewq^/pY<B6#+&4:^wnwkmAV4ypLKQttaW4R+NntjGR8JuV*MY>$@$ly\AnVH
ehiH61 a>Mj1DGF^?/B1QbJB!PJ!8Qw?1qHBNG@ae=9XS@%F\F$?EI5STXl>TJCSVEH/:lDdC6:YMuF:HQqIyaB
J\wq?M YkPk^j4!4=mj#PQ$DT#t5$&:T9wiCiq@CHKLXC6:JVhjF:q%ZSLukKkPR?p?Yl/XT?YG&R+<>h%n\y@A
KBZZkc \F5b>5^4kWl\E$p9GSd4WJRPFdyPb9m4$j9VMcJq5y%I$=w>>4bqR=bSn6>>^&j^#5j1Tm#E59C#YH=%
FGBY:G c6=5jX=yCm*uXjdIcPKbGl#GIK5/LCy:KQ@5#L#+GSwDkhBlnA9SKIjqE%$ZI1\+iaye%=jJGY#tbG#w
Bh4IdC u#djqibIYTka=:MuM:/c\pat+eB6T8EtTYQ#ZewXy5j!m\Ch\^p4!SX>^k%pLDW5j5Fl/eXltSKG&eTt
+PlmAb lIG@N5WJ*Xlm>bRNudeu!t@cST&$JtqJ\HdKXt@^:154MY^LIPyBM6cS=lSunpSQBViFYbcH?Tj$q/h%
^Ahm:L $\?y4hWkH%SmZt&^EY#&^:PHccaMBI1Ykh**\$Wqm?&p4l8q/#KHeYy=9jKQe%6T+%9&W9J#^?9DG5&j
6$jiD6 N:dWISh#ZNeMc?qQI>FjwDtc88<miBpTp#9^QBImakdQelkELJw%D#wS<WGTiN#K+EWcuw1C%J\DjW#m
*qD*@i nb\@KuK/G6LT9#Ca$*FF<Ky$jTGlbtGPaCRy?9lbh9i#1$R9WK+K&c:F>n%1nhBt6:P<^FX:I>=dZQ+k
8:uG#u +Q@qiiA+qIGWAE:8j!Z4G\VE>Y616NPQK&pLa/i@5b9@n8ZmlQL<k<w5dPj!R%AAD@nHb%pVa\8D9#Pl
eaMSeN j\wEBkAyj/bR?+5LDjR@Q8wjZ4Wj9?d?:eN9FiGBEPnj!hl@!*j>>\<k\G<j8H@:DjR*CdG+PIG@C\&C
C\S!pS @Fqw#9@mjj?nVZ<Tqj6@JI#@9Vq@Jw!D\Z<qnIP=:=wL:*eZ+X<$>\9Y/t@/8RM%HMS#F@R6PiEkIMkh
qB:$D8 $N#e6/Glh$F#*uI\\e%=B#Vw6th#A?/C91*h*MC:wG<:DPLt8kPcC*!Lh=<dhBe$F@RYNQhh$IBdTP*e
AXcLT: h:G%H\Q6F9ShdA*Ie^9/L4aGBN*Ya*i^NTD\FnV+L4aG=L\NjShdA$B8R>@F%t+@mALj!hl+dnt9BaQ?
YACieT #ARHej@QJ^8@p:@@h4IB?WZi^d>Qi*<=&aBC@lNM@Q>MMLFkHP#9\eRBqb>kNHZ\eTypatM@T^j<I=m+
&kuuip VlASRFkuVCLA$M?tFHu%yEN^uK!V^bE#9S8+CE@C9N9+Y>WCEWFu9wm1ASEwN+wTF!M!eG^Emd^*XiSk
L%KClS #S<L^*Cn>4V!aBFqXhm=wB=^&HSnIFJmn!CI#T>NBA54&ZRVqkY*BEEG5hGV%a/tKjM$:LLSWT9A\&$L
ECH*uM ITPcmMwkI=Kud#XSIRJJ:&FyY+=lStTkE>hd4!^BIR+#SqLV*XnT$t@HbNX^NAnc!Am\4%mW8TheAknJ
ld1F?! J1>1pk?4jERjTWRc=dWJ%MuPYPu&EYJcR/jm&ZVI8hlWCJ@PE8=wCRXEpENYl/J:LIpBQmPX#Knl91Jk
Me6WXM H/YZjIN!%uZ^BNPEl>T4AjYe^<R%<YWC\Nq+Nyd\^4JcK^4FWj<Rn$*CSj*qcXIh9tpqtnEVB!TTJi&y
+pnR!w &4JbnTk\Z6l4%/%X8B:kP5t5+pkh%N^\&VCmuC%#uW&XS<uaIFE/Gb^V=:5\eP&Bu^dbLK$M*E>IpK%5
j!J<?^ RA\WLqd9SlWA>%+=u:?GNcmke+bjC!l=?\lqK9imRQmEk%CT?ct*XQDpN8XA6T<6J<PXD:Zm^$F6JtXk
Vl@w&Q wy:wVXBD/&jJPw$H5SNdVy9Sa%\Z*DcK!?8w&<LVB6KlkHM1ki=Jb&\MBY%@BG\qD#WiI?u*pStnplZl
$bGh:& QBuN%IwQh946IY$+CkQRX&4/<&DqMJ9^iq6GHYy@BNtcR*@EA4Yq5kll/V%6RXuHD=C&Ldm4LAy<KmTS
9cI6la 1S#&V+4p>e<//4SjCeiY^BVZkc#!np9\^d:1+\>=!>6+q8MIdI&^:GP66m*\h:hu/ZudabW<9?V?SQaX
@V:d?Y Y^FwIt?\>CT@ucJ#!55LLa<pB<EdM<+dBJTl\!Z1EXJ/6MPIEhJD=l6hTBdN!TNN&=PHCLNQ^NulSNqJ
&Lh=eT jClKILW/9l@AF5t&\%YV?Dc8PX%86bI#KHGLSG/lCTSYCE4:!H<8T=by*bH=tG><5kYd$RI:JltMwwJC
LujqWT @wneY?1W>VN?yl%B6DB&1IJCkQDGB!J%Z+bIA&YCtqq#G#&bJHQMW&FJN@aQk5ICtGXF$wGNY!RynY=Y
*iD<4K b!cJINYV!$*!=NnM#PM&>c&^NIJ5t$PV&IK+ukcDYBXJyFemBAnquiy<K4ICuh>E@Yj\5^eawKXNCjYW
1i>89! A1TIM9yewjcb^dQJ8Wbe#w/&P??KWd1!bQFJRZ%8$$\+<?SE:!1$Sy?VNVR6qBk%WtJby+!Q=n^@M1j+
y5TlLM @jYaJQ$dJ1FIFaT9l8jKa&J^Bp@nWSq6R:h5!hS^MPNdV^XqQRNlX?&#GtF/TiktFjL/Yw>#t1FSZLJX
AqEEC/ apdAXiN>hmWb?=tCRh>9&tRYKHChATNdn$B/=#\&+eZTkjwnu!b&bMZbK/jJmn#NbTc#RFXNa!^PwTYS
Wq!u$& JWJYw!H=bMXX!ypQPPQmbIWtX%awEFuNVaB6Y1wh9byF<it1MH1+<wXCB/$yi?e!5jJ?5VeMLG$\4bK>
LS=*:= KtuiCISFbFAqqklZQ?<=B\NNitYwd&<^B4u5i!^wGFQ%c$TS?dY66WQX9R%iyp9>tFHF+dkC86MCjH*<
#hS^Q< R<WPc&tb+=K+huN+JBiR=SaTk<9+ebLNt!k4E!&6l9LNM9TAJ?\:WEc*naPepMyu/G*&FKqdiZNybw:D
#/5u5b SEQMZ<1nD&FP>/\?#dQP\lyXDE94BH\Z=4VG!nR9XbC=u/56Zq/<+cD&$PJS?eDla9XCNiQGe%jq1%L^
NPItBG e=ypT^wDY>cyHBZHPiaQMlb%uuIcZQ4E<KLByjEQwkyTLpmN8AR1/1y*=kuJS6+bmYGYbSW8J1Wwcdj$
-ALBlu 000d4c656be001202b4 Page 172 of binaries2.zip
6$QhFp J:yyjCnb!k&dRX+Z4+5mb$Q@HM=myG%/?IdReGBV%>+eECF4D/\DS=D/5jPbHa1eXCjaiP>&?>eECpJq
TBPa*V YV=6FAYMRWP4ZJuT9C#><t/\Qmh<KmJ9L?HEK$!j::TD1nl=^W8>$:TKyEJI^cI$TEPWeiAu:$=&DTR^
?j>#ti FyB#RKeYMa>P<AXJAjIcT*akYeC%FP5W=TPYFCTy6c:eyK!bQCh%:$ZNHBXtbYb1Hk:JbYi#CLD/^DSa
1GSei6 Mj/aQ^PSQwiq1N?1&+BeH/X&>t*wm<$I!pSRCwDtnLJywA#aSY8FcVDktWq1\WTZamVS:Ym4MV8$%W=H
$A!NFm 6A\FymyLQqjlV5Y*T=nW4dXq:tRVFDG6IaF!$#^IA*TGwW#JH!N^:tb?q/tn!V!:5y*5i@!W#DFFNR\>
ePL9:D XVK^F#1t@CH6EG9?:jPq>^QQ<>ceib%VS4*:XJA=qDFGl/6TkbG!AZVy<c>ielSAk=bhV#P=9mjK4\mT
/lNN^e t?Xqy:etl4P9?*/cKHY589ew$V:+!+n4=:^X!/A+JTZl:8SDXND:5bV1QYcu6dN\1$8qLAktBwHF99>C
GDBaVD JY?#&9k?T#jd<>YSMGb!CwEG*&TVpwQWjTtW=XmXMRa%:jaid9=Va<9YG6P6EN5nXa&t8Y>p5ahEQTlp
u+lc\4 d#W6Z$BN\MI$*QP!5Nq#eP^l@CK4FTIVtbQNRF1^9EdpG?CYqd?D^C5Henq\&La+a$T4*LM?Y=XDJtqc
aKXQ@I e^a!n*N<J%pRW6hpFbRXED?6q1!6$puG/G@i>VwuY<d@p#5i+<FZHy?4?PkDA:*\5?d$#Vy4^!S$Hct&
%5%nV/ he@iBTLY$Wu9\%pXTK/8@P48/nlQQ&>yibFjy?mi/A/a^qk5n@wVLia:lQqJd&5ciuVG?<W^RVi^N5&^
?\>$k/ l:X^a6q^Ec%uN51JhDL^jj:9<^aTSB6#LDVnBuW@FBtD!qcY^PEe:ZGYteL%I<=T&QmYC/59#Y/TEGMX
kQ6>5M e=yVncV9IebD<46WK=*LC:#NliZ5&A%%SB$X%mF&jeZXnISwqVbwjiqRG5<?WR#$+5!Q<4Vq$Y/>j5*d
EWQuGG hPq<+lR#?S\aa\N!J#%L>P?*KDYlJ8dH:Ib#>=*Bk#d*AyMX6%:!=6PZ5LeYMBEe5GIPF>^aBEHM^q:k
/uq^VV >PbCLdhRSNEHceJ\kmq6B@i<#bY@m@kcF4G*H!YLBqYL4wic&L4Q=MVlaW9Nd9tH=XwjBcC:G#8Pdik1
+:AGFN :5jl=@w1t:>HMT4?j1y+ldXP8KIAJ$5=CWPZjb9@1hBi%q/@+/%mkWV6!9*$+F^LFDlLTGdwDI^QpR/m
^VuJ5E dB!=uYh88DKmd1iF8*8WcmJIQIn!nyIkCEiZWn+<JbS#&h^>k6u:e+j%Nc:u6WV1hRRAQ4m/E=EX%hSj
d99Z** IpAA1:CZ\C#YMi<p16A\YmAC#y<AZ5A!&h<IZ8H<\WC&#ICu4JAh1T<D+8lb++tRHpyZdWB%PJ4*S*@H
Tm!&=b Jpu&n=5uY!99G*QhJSCqFHLmcJuymKX$8cW$cI5^<C!KFdh&aEYN8V*HDDR!npZNP\iKSk=p*w4B#6$G
V^KRDX nQRKhCn1&*TPYEBnV*1khqn\p8QD/DN1ja5a/yBEEdSHNNl>&#VN*JndLFK:#IMCYAMh1pZFWFy9TeyM
>Pi+=^ eS^?hN!Z+@LB+#uWV&&!H8^+QYRMBMZ55PH/WFWFMqW#eDJYA*KFH?W/+hJIW+1%S&Z8aFdnBVwMp%AT
<w@=LW SHhawp#M\D8<n^HHam%&BSRRWV6wI8NBcZy5CHBi:ktu/4AyJ\SBnM*SSVjmmQLan\JLI<*+=M=>mB%i
aBKXdX kbG<qciMJRb:dAHP1YaR=Pl/^TDQ*SlXe!ZuC1XTNXFHVHPeAJpP6ZADTBXt@4kTCF<W8dwdMMp=:IB\
:A\$?E +GCw!amkeH?uhjmVdpupaaA5:kCFd@?I6j^%BWaPli@p6bCI+Em<EQWFEmIQ%aw%C6K<LEI5p^MJ$%wP
ZEbPQi N=ILmtRT6+neEc6>W&D&+1cAa8HbVF=!Y+mASJ!y6=?dEbL%c^NCKpWTcTEBVmRK/T+WqI$8G1MK1w%S
uD>j:A ISEkj&EP/ACjlkDm%XEnT1j4KLqlw>BlEq1wXhm^+1ie6!MwjJGiibVcFqIC64F%/k$*:n&aG>mY#qHX
\b4uJ/ Y*puM@yG16RcK</@B/Y4&1>A!6aCjX&5qMFHnmbit$QV6Ta!L::R1Z#JZNbDSm^hGcZ%^jVF*Jm*<tk+
=YhFAS G<IMSh<4aY=/GRImNRRbqJ=GtjX:Ru=aRlilKjHBMiKjyyHJiQNWXe>Mh^EVNSBL!HMcVa14m#MFD6a:
b5NmSK JNcqPVPNab6YalkA4ty!eRI:5XyHtqN4JESJ155wyYB*\Yu@FAj+S\:J#N8i6JR\KjThMyVGR?hcy<Ad
k%uytk >etnX!6baykTFlK6^VdKq1c&qy5e^F$yD?^mYEYiKB9#AmL:kkmLwaC9w5Ek9#Aeu<J6+VGRC+1tMmyA
hqcNw* YwZCd@<6@w/aj*/9QlGT^FD>m$FVmb$N4EK!F!aQ*bADjdjVhjyBQm5\LX^b6AI*=!uQSH%BR?byJ?<?
\*5?Y1 D>N\^%p\NG1umpCt/\C+\=n@61RBNXDSA\MAeP^E96\IqW?TGP6LNZFW#B>DI8!GZQd%wHmktwSjXmb8
bI4ukS \4*H499A$iM<jwA=XThMcmPRH>$e/jyKDb#>edjF^I/!baI9e:$EuVPW&$m1M9+GqF<8TS?kw5muQnVi
FTCmde #L!ml^NDZBc/=ByAW6?m1\m5KiEZYbQX#AuVe:4RXLqSRH=6MK8wSKj1PQ#yXXmh%A:4Y<\4h*4HlyX6
E+R%6y jptkAuK?m1mGTjtiNwPM*9:C1CybM>iG^kYjuhXup+QTD5VEDtEVTBC4qwuMmMm4NqjPG^VF6+pN89l\
mjA>Da %&iD%8^>KHHFP*D&:MIS9EYN*bqc?6Q<YMC>JW1BX<^C!l%:%6!\iBTbDc:m^*c#P<#a14WmJ5nWWYw#
yuuenZ dGw:wL=pNT/\XAQ&?JTWmAY%%/k\upu$G8NGbTLVm!ILa:W4dTq&4kB#4cL1iDkB>Py%H?K#q+W68N+\
/u@Z>b 9VI:^t=qS%H&9ADLe/ph/#^nSekn8wc6&Wa%a>9e%deD$Gi#Y\FPH5Vu:CcFZ@Kt6Syq9Jq*XMTWA5>m
%6CTp! Z5!6?yw%mkMuubIG\HC^1MpC<qHj8I>=*S6Nc\mZq4E8Php!#M<XD&^DcGw!8>RH=R+/\Z%A44lee\WH
W>j4=4 E/b?6!l<6M!mTCWDN1a?9ZLBEH9?w/CPjLGA<Gh:4%a8966Tk?Q!>I#KVi4L$$%V\n@N:kdREKBpRXaE
nW?XV$ \nJN%YmA!mVD$i9TEbYy/w=!aN^<Cbw\^Au>L/XpmwAcS9uXBDj@8qHN@QE$RtTPtPQX1Dt$KH$B%CGL
/H#J$K YQ@\?dh!BR=\C&+w\I=ltlVd!=^adP^6j/VaX?!%P9qD=l4JyZBn=yk<\SHX<5#V!t<F1kpcy&ZK:F^F
<pP$$w Gp1it/kM^A*c4\?cLqy49WJ=Cn>c&TSQdc/i9biH9pV1Ztmh/k=+!a?kT<>8T^@HV#MV#HS!Z=kBR#*T
B/9hM% F*ptWpAwqHF>k<%FACY+IB6lT%#+kqcVVD1XZNEamc&4D%:IID9dqI1Mp\cSS\NjmNIqu5d>Wc=RWLa:
tm$MyM C4@mR&u@B@tG&*u8*HqhaE#neXTBYNc%WJD9GB1bN88KQ#yeIK*lGKy?QyX*eFVH=BP+TG!JIT4TM%I+
bDk%G= ?JL4#qJKPHmjcFJ+*NL4mVLiAhLW1dI5*FKjX/Tyt?Z8&&Y4MiY<8?Yyl^XpP!S\yGYy1^XW!ZACkyXp
N?mdXW ^^XW*pk4t=WLu<5FpP=:c%TqZmP6ByS4jm#ZjFP8SXM6AF?/R9JRe:?T<qGbD*!F=kwJ@KhHcjC%9Eep
:/=NTS <K@Libj4jF/S\H?9w+1y?MJY8@41$i44?m@GyN/p>Xt46a9aePT/ePRlFiSeVa?S/\Y@N**Jcmc*JTXQ
uh5P&Z K$<hLF6a\E$41cBbL5\p#G&Y88ZpBA#?9/iC#6$QT<A<@?K^ABV\%&MBKPihn\Wk9<+aC@/F8@T*$=I:
dC*kjB HA8AwZhB*^c*#<N=F#V*dYnAZhBe6/GBh$HjF9ZQ\*WHNQh6Y8MB*RX>1>c+:+K?XY9k8/B9%S4QZhC*
J8=SPk c8$86kc/XY6*5dXd8VGR8>nc4h\a!F%5:Xb8DPR865aF9eY^D?H/6>B*5VW8<C%HWJC:&BwZ/Dd$ZY!N
\i@wuB /#atFiR86ud:kRdpV5dGiW6/a5ljW69?l9%9D#V?Rij+icAB=j:Fkea@X!V:S@Hqu/tq@*>C%YA$bYJQ
Sb5\YG RIQ=5k+RI1ZNCCw<l*qd<<RQ$CyKkt#X&JDqIntDeZMFj>!+665u%%PaJq?56@tVwLcAdaZau6B1>C#G
Y8+8<Z QYS5t1uV!lYnMl\55jT1*EANhu<CW>LhQF6p1L<C\?XVtLeyPA4L*T>pbh#JkFpbZ8FIBVF=t#uT6:\m
IT8yi? <H=ZM:KA=jBaqa<$a!yBIFW\nLNeY9$DPpiJ?lkwakR&lwNt%WKMGaA+wEliFq$I\^HGPIH^aQwknJMG
96S$51 \k9pN@am=y4&>\6c#tFnH5AEGNp:LZeci@!A+*Z>GKYm6KLnB:TAZpZLlbEcjWX#59^nadGwW8bW#mXK
JdBlj! G\H6n:Yh^b!9*#CH?tjYTuZwy/FH<?GX5WyV\5l/BB*HKbkecpWkdBk9w^8G\1TYRIPCXk@=@HF*DAen
l5Cd#* +GY5lH5hqA5ypBFjIA*&IWy6pAdk#6AVaIHPytBmmqLn@XM#jKEp9jB\S=&mBKYYwAuGeSkICZFWSTt!
FIy%5> #qwHp#&5Dm1DlLEyL/PB=\LXLd8ekjFI5P\6Q=ZG!6V89+i*hq%S<dan8IIXjc&$XNBy9Eb?1yTA#uBK
&#yD\e WGwZW<uQZ1C4wpywIXdE&mP<4m9l+nGiIlEFuXnFSV!hXJimGBKZkcDAQNm\4w%RGcn\<1q:iZKyjmju
^uRGl5 Jdip<yKCS\dcQbq8WAXK^R6@Wt&j9FFuFPDG@lMPhm6p/JR9^Zi=IbupZZRWBXFSd@%QTBXJd\!R?^H1
?cak&1 lQLiI5qJLdq?:anLJcui4qtdJEEbTR/l/<6=GW$!FdclnaM&peckI61hn$JkLtm6$C\$=@@C1B!YIFLd
GK^iBL BV65Kh^:^8^R$4\ccPRmtCZYSh5F:/>VME!h1X#mpQZKyiJMi6^1CIY9i5:4IQ#X/qBkZSA#/XVMHHdt
ImIQHA u8&ieIqbB4HpqPkV>tHC$Jeq=JHP#SIKqBjqB*1#mnjq%kTAJ!^%lME/luQ+48/JFqPt%#%wm^%:HeaS
peu1T\ wSpw*c<D^=MamRKjjXShZYI=qG^^a#q<>94VAcFp@ly*j&d+iC^R>K*KFSXD=VVF=I:n+PbA8&9j6cD\
6y\cX? 9phiXa5@<eu!DCWqYpAYAdkYF1bRa86y<=+h\a<EueC!ZbWJ$q:WIdAptIwuWS^:u\1+ETGe++hmW5yV
m*kthe /dRW8ymhG&lykwipDpFH:A!FBiVqQjZiSCXp#nGKmMmtAT/lppM6>KPZGN@RmyXl/G5n5#c^6wnZH/b4
+?lu\Z :4!$B%V!Mw^j^/Rh?W+wanLFc@5NT?WGM?b#MB84wSu\TmuFHFL:MYwdl&q#Bp1MeZS?c5JYTPj#mpFk
Hw^Llb EkE!+K=J<TQn5uMKb<@ld:^<FXyS#VLk4WAp4R#&uHAtFSc@wXkuMGaiGZ@>RK%&XHj9\E#!*Tu:HDXY
ADmc^A *Gu*QiS&Gp/#T\IFB\i&%WGJKpRGaI!/K!bXFT1#MH4%5CPL!FmCY+=GBT/8a\PK^A#/$%4Kmjl1Ft!j
j\iDQE N6NS8C/hAlJG1dli1j=+%hm$>:89WGh5BaLAe@C?ea=wk&i<CG=b!wl8R5nqq1IF\SGK8jya=ltEtb@Q
%M:R54 98A=/:N#ttSJJVAQcP4kBF@aEQk^IpRYeb*/5XHYJTiljy>HaHXunp*ylTyJWiAulJa5Yey&CIwwCIp1
-AVQGd 000fc870ef7001202b4 Page 173 of binaries2.zip
9QNJ1J ^RecA<kClFi48d%F!%%TGBFCCq6u&Th<VKjZmawa*HFE$it$K@Sl&NP54t#YmpWqGnKp^pMj5iw5bS8J
Diyy?L &PV<GFtF<B=$b>mda&W6K9JiJFQW=Jj:clqdI/MGCCMpTCw#\F5=ln4WJJ:S>lW@+C%A@+a@56BKK5jH
J?%I5L pPihZhhRZB:c^jY6NK<46eHhB+NI*cDcPVcJm5R:TD1VE88TAkiFeqmD^aRYCj:HSuEw6MCtL5h&bcEJ
ym9tYa *KP1*#q/#*+#q%nN@i^R5$SNVtCyE!<BZX^RRDuL48jNw4F9>6:bk+DyLLImqTRX5^AHwI5JnV\6bb&k
hkYWW> XH1=1u9i$wytAZ%YWMt$TMMEeIy1\yGulQt#TNH\CD4Dupd=#Eyqa/INtVq<5=W=db5/I^8#X4N@Ide/
:Jtje% V&8\eWJ+VJViVmqAn<TGahaKJ$wyBA&Zene$P5&%>%!=6\T&FYe=!wVy%wEDcyD#B>DVT=bn&>LSTRdF
%I*tMG 1B5FNW:5bQ8l/^BIu@hAb4/@&:nSnS<PRq/F9Z:q/PJ:>AKEEpB^@wH=HmJFLDw!Fa!d6J9QHQ6=I/mm
aACA*+ NnMh5hJj4uMbVE9=L8ZG*YcW6IuG6tM@%puX*tw&APLN8E+StK*eFT$P>9ct\:ij>kw:1/e$RcL*lc5u
$BBIKT qpI%Bkh>5I5qZlB:P:HAV@6h!Sh8ZkklbZXMdP@B1@iHYaXE:tBNtWY4J!myId6Qb:e^6NP\!NJ1A&Qj
%F!1Z@ Lmn:YDnq1\8*y!GSQbQji!Btb%L#mncQYDtnW96qqBNku4hF*awc:#pC>@S\n\au@St$^RLWEh*j*Ey9
1#hd5l d*u+hpJJ:y/kK*e86wcR9V^/DJqd>XScw1c9quV8Vt#GFG!/QE&#YRLjm:&/je!ceEF=4%k^Y+1GcKj4
h?ZwY# keL>FiCw1CYJbepJP%h5WYLhm?ita$?!I<D#Remt@ktl/SJAn@m#^5>GJetM:c:>TdPj$qTQ=1%5L%#R
>aF19c 1EJGB>aK/LJDQ1ij?Fjd#*:YyPYw*DLqy^%:SN81HXI%nl?kb$KCIG6:*9t6+8C%%t/:E4Xk8/Be1eFC
+DD9VI nILN!1eX1D#+WRS=m+ST5tX>#%CF?\@5e<8KFmP=/Re*1tJDNh6?Xht#GDEJ\!MpaK+QJATjTH6>cal%
:+hqSJ FB*KHZA@^>nX%DhCYCl+%ktBhXhkSbX*IVJp*a#QPaK#%=LP<c4X@CVETp#nq=Xj1Mt+tbR=>:<44nDS
q>Mk1^ I1kaSHyapb@CeKR%#*jcumZR5VTihjSp4qD%AF:BI:nyiDtW$Wn1hVH^b?P%l+8l#$lE#1?aEX$iMd5:
*%KAYB %!B4kmnM5<1LqYW!&%bk&dc<wpP<!tFu:Bn#>c^I^dcbHTM!mp##HeXLEq9S\TIm/p#XKpK#&Ltl>c!&
j\e%^q HdbmcwN:^hF5CCkRhu>*!YkXPEqqISt<$c:dem@<5TV5@?5CMj>ae@d89kWw+K??BTnk:4/F*=c/j%=E
1HM5*e @/KI:i<BtHhb\j?mm8*@C5:>=!W<FQk@L?El@<T&luL>K1:#n\X8qT&e4W$wGeGW5kc&BtaY6tcW$mdQ
^uL4lw uTkNdI$yj=mG<<>@\B^NVE%?cQ?H1yu?1&aH+C>qdZu?KSD\>@:m@1>>^+@d8Q/E@h=Xen?6na5L<99*
HCc^qC alcPVn<:?QhkXA+bk=@ZWM=@qFH?i?R1%=@d\@PL>9!nNe>@&Amq%a<t@dime@PA@!L/d=4/l/k@41F@
<m9n!y FlZ!B%H@/@w*Wj<5KiRZpm1dt%DC^GE@ScS<b9Hny<@?TXLkd+YVjy$N+b<p@YXHR*@^PFE*A^5L&=?c
5lZ1RE MjmyFt$kpNPJ$9:HCDF^hLd+R\eD@&K46#\d@IeP@1@??:9YwJ!RQ&wN?w>c&d>*MM<j6Ad=a#Pkj!!l
#LYYVp >X5#qP^NnC^Mu@?>Heatyka8%5+@&$Nyd&Dl?E?N+AL>be9MDj%XI/B@El4\X+XC@%SC/??T1Jw+@mcI
D:/dNB p=&Nmb&6!Y<1hVG$6nD/KhI@TRQmBN>NyhA@1QT@NQc:hMBjTRj<lZVmnkc&j^9E#w+8Q&R\6j9daKB$
#VV*yt NdC&MDb\64C#@ieiB@FA@#Z^AH<Tn?6Z+uH>Rn\SC!iDH*4/&a5@Jl\V&><8@nSi@!wZF!jZZiRC@pp8
CKt+Gl $K@pA9%KLlN4E?h@DBJYTmeLM%5Db^hHE%dKH^y$eVJ^yJRW?TeJ8Z>:&j!#<^S+F\t=@mRl>/<p=Q/F
u8/9/G lMLtB4d@NeHBDJ!e:M$hDb^M@q8l8ACk8\kF?yNR+F<J>c8*mKTN9b&n<?@hKi4&?=Z$H@8VG@TZ>DSR
H\?6t$ !F$E+@/VaD!@E8^Z4\NFE%e:1*@$=#?LAkZ>c!d@T=*<cu:@@T*/6*/!@?Y4FAkA@5Z>Dd:LVQ9uTR9/
kGFhi9 K/Gk9^VK\NHI@KhaQ&iEQ!9q9\?e9qYij<#$j*k?+BeiR>C@u>9qQ^HR@&IEhM:@PkJcceZ@%>5JKAD\
6i1#@9 4%i*@BjQH/GAj*YQ<I>w@Z@cI*BB::yH?H$6@iMD=FidBik9CkJC@#K8\V!@by^Aj%ER<K>wAQA&NQhh
\<$FMV uk&B*wIG*\WN+4\F#ZMH>M>y>6hw!F*RQLilwZhBe>$mPbD#DtnRde<GA8/A=4169+HAj\6>F%9nA6#Y
L:ENJl :49aG9A&c\Hi^hcA+N9Rh:E%+C%HcqDkZY\NeM5BLBS+F%5DkAG*wP>mc:j8=1FeuQ<i@E:YBkVik4/L
q##T%: 6jHe\8PDeuH>Y&nR9+Y?$<#Ghe5a=d1L6ZFDdlpuj<^PCQ59:D<eMPAjB5u>+&*^M::ph\eMqQ8jHVC@
L<Ea4G YlH>MY@l4?::D<jPn$ut6@9?\=j#6@6!@&wu<<>yBj?JdAd>u=hc!N$GeF*w:KSaa6TIMiqp/FSETAlu
?<!1Pc WDpmM&k\cq/\&+wnP\W1Tnek$>5eHBZ8n%NI\Vq<u$6+RFVC4VWemmM$FIeDt^SG<bQQ:a/Jy^aCp&G8
GHkSDl GCXV\Sd9?&CL^aXG!N%ZVBi&SEDIm1^Zj6#hm?kkCb8=V#$KD&5^BqKkW@V*eWyeaA8BTAcN%mFWR:4w
m/?ljW 4&T&ek*T6=4+!MMKw:XNGakqw!I&lXNl!$#cBd/FJEQnnFwIJJkMlA9iLeJ$qeLDl4/F8X4QCTl/cR\E
bCI9ZV p:TBFKHatwiD>mb9*tGICR5KiEiXp^#J6ZkM=k/PLJ!lhB5Wblw!pcKnQIA9#G%Yy6Qj^9<@&Q9L<LmY
<ZydLh JW5aLnE#k!%t4lI#M#M#M%8TLdKatYW^M/NqMVQLa4dRaq85V?j&dd#HQi/?M>*9#Nj%w=/1&4X&=5/M
TVuajj #I!MnBXS8ntISV6?X&5TN=kq!wc99Kh/Tw@8D^8pW*=#M8@eA$X9R#5B^Yq4nASiSRMijR9XuYwc?!XC
j/nSem B#Gw98JBF4eHbWihtuM4%BAVHwJ+=m5MtPDCGT<m4uW9qcWZQ!F=^cy?jDBJ?%l4kbCjhV5IjwX>wkE5
IK:9Mu Wu$GNA/\I8p<%T#B:AWVuN1FNlKeybStTPSHSdV9E/B19A#6+YR*En\++a!16?TCSQdcQ&kKTB%aC%b<
<A>L\C LMIhIWNXJlmQClYpltIanh+T^VlR@BbWT@?NNwn=WRGFM^>&nbKHqX\cXjEKHRmT9^41bYp^EpqBd#c!
bBu5LE KRi^k+kX5TE^*WmEG8e!8$GNE!Z4QFLS61Z1m9Ynb9KBTP%l$6NdEZXe5>HEi\yB/GM:LE4AJH8P4$%I
cb$WYN IicBEN+F&@$wCQiL8em!\cT5qh\6#=IMwkqW&pki^ynI*=N1=ejiKTyb!phVH&$Ge?naKiuhQP%<CAJ#
!!pAWY 1:5Rm/H%GSABk<RklM/6F!Tp1SmBjCA?pKX8:8pPSCA%Ijuw=lJ?8Ze56%ny:SM=GjXBRKAyD4Ga5aqM
Hh#4P% $>jjZ/yB@XJ5GNJ+RN^1#BdH!D?hu$AaN^H^CcVa49l5RqI+N1@IR9>CQSqHQ*i$>\NLGp?clehFtk5:
eK#41q 1%X<mWNVeIW:H/FtKaaXXah=Nn=$w:pyY9jmA#hn%RStY#6Dkuc#uI6XW#MIww^d*u/<p6J&=9pY$:Fd
t!+ISJ <K9cBe>DQKdKl<yb6:N8\CHXJ8bKLjZb?#P<Mju^a1yKP+^FPM>Y#B9RyDaB4mDZVZ/l<wqeS\!hMAij
:$A$@V uhjbmuCPc5lP#Zl9qMB!<N!Y!LZ**6w>IWIR?wbVNVNtT^wDn?8Jc#?XkRdGRD%KC\?lR84:CiJ9#G^Z
duIwqh k>qtw+!aF!iVaFDMm$*bpHuySKS>:KjDmnp*tTQ?InPGaJ?wGRICuRl5tH$ulla@1RpjEmQe?qP&jKFX
:wLk\I Y:ldMP1Sb9dZ=uQJi=TuDjRSZ$Py^l=+uLyqyA5SmlP/m4$u^89*1#de=jBkR?+YybC68hGFaB?:X+++
W=iWkB j/@a*jq^Ll</&^bGKZm+HmRSidt5M!VJ^A1F*@nhGYitXm*1<JKT:Yl@BZRnKR?%PWCXFcd^cGRRw!VX
JimqR1 &ilDkLN1/u@/8D4\p?I6GZ1k<<ZWh8+Rj1m<$LkBRkZdb%dqeYHkuYEBd?9HVRe$@>bI?An@k61Dil^n
MiJK^9 ?G5Ppy1>nNkXCLu/QnFqYTlebTVK:ipmcCnYb&a5L/$5wiH+GWNWRnJb^*HSVFbAn$J/#WeC59CDTHkQ
5DN@X9 WGG@S&tcb/hY^L!$bCN?8V!>c1Bh=THNE1:Nc1Iub?%ZGptwY\S$a+&a+XPBcuXh8+Z$t:mcJLcBEQI*
a?=QGV b4^a*HTM\8LF!JZ:NeV15Se?6JmLpD15h%EYnFRTjbpJ!HRJuBJtNJ>mF#pLTD6W/nt*JZde:iZji<XK
4VH<KV j:Y1yq4EMqNi+i$ch5AcD1KQyCNpBW!pXnuPEPSFt9PA8BwKly>6JpaTDY/kd8qkFjeuSlw?nKCbXVh:
E#Wcww LiSF19K\IT&y\wCH/Z8&bu\#L^de+%HNDQn+*4BlhTDjT5Nk#4kWT*i:G>Z$SW*VLYh!:/p^dP#M8u/P
NjYyIe k=aQbY=+#wEPqwE>CY5aPu%ee*!eY%16kwMywK+4@YEZkbuN/$$/Hql<F$$=Numt8J1GAu15jX!6%5:\
Fqq/M# nP55Py!e:uHBWYu+^<ThRGNIbDpS4RLbuX=/JWTtw&W%qVJCCD>QPYd&JX1%&:CX?RyHq1w%/y?ZiCJ>
=X9+AP w=HVnY=VFuqFIpkhpInl+?N$FiY+pEy!mq@SM#HKuZHlbhun^CkG*y9ipV/pNLN:nld<QLP9k8ywKVXu
M:41?= c/P+e:JZt&kbQ%TnCwPCyyHXcJk^V=P=6=:D:GtK51>WYnEGAe1>4ym/m6LyIla!%$C#LwhApqLtE+L#
!L@SXT @Dwq@+aXw*uFFi*b^u+y9ZRMK@IJBC%yGH14V/N\QC\+BIyIXdbHIa141ae!:EqBtARBeE!Wyi@jT44u
Cp%\l< GhV?!FuCKVMS8eyLX65JQXXu1$QKDSLL9bFe\wu9H=&$^cMKPZLCXniZJSunKqW>!Z1n1!DLPIX1A5uj
$*:Ql* kHw@bKnqL5FRjC5+npcTMw6KTIKaH<65<#am8IK8b+TI<BMwKkNNZARE4ehYTjk?^$*NV%wcK<kpuT#N
9cd:&N C:N:^\YFAy/cnTqTlRkjeTZYDF1pN%u#=E%cY#&<%LTilRB=wLqD?b=>KF?c$N/wYE>NR*1^Lh$%Jp#T
R/1LGe nHQFcG/F/9b6GZiRR1K61wPPhliMN15Vnk%qYVE%P?HQ!@\1>KLq<<DXk655?#ME%1t>*dnSbR$b6$4t
%^AmSk SWSV@F!wmhDeeWN9h>=hnuI1!QKwNN>pW5lTGaKGw$K6tJ8n4mZ8QkJ/61ahNWZYyXFCJ\&:Sn$*Jcym
mcB8hd t4d%C4We>luEqW@cTcZIE$X/<*tNGa%W\8XB/98QX%bZl@WN6+5mFX4ZK+9Rndy=FFchN?5:cklT>ijt
@I@9kn 11tyLC+lEnbiF*k%:JPSkTPE!5+ZBmahnC9THTZY4p1$*i?LnZ4dEKYh%I4$B9T!ZD>Gc6uXhe>4&Jka
-A4ES^ 000bc610171001202b4 Page 174 of binaries2.zip
6be+b# H?%1c$?9mHIRkInG%QlGH!/u8HRZpCaAB*n8=DHDty8*Ai:+\u5?TyK/mFN8a%YF#9Q/NylkKu^u/l*1
DDJICL LWcIu9%/FtwPu%dnt<iiQFW49hBT=qulJ#W1iNyk5MwSL=&kBpS<Gccet@em?/TRlNk$EHjQuI4Nd8Y:
uh1L9P QbVKJ=!STSiSny6<LL+b=hnXPWy@*&J?WJnL$q6km/hw:1%P\I4lNi%6PBXmBwJmQ^i9y>t9e=n!i?/t
/&@:%5 9+Pd<tZcZVyD=mh&ZJACZqMqF#E&FEZq4VG8cqWJd^6PQjRX:H:uk8lc19YdKC@d%@68G^w4&#Ni6F6b
4?4C5e XI^AC\X@qH+$DIZM9S$6Z+HK4ID5%VV!&EFHY5mAjNXqT&LYWlmVXVmRA%6/+HQcyB*NGp+nL%1&MDSJ
YQe&my ZT9hllmc6*?$<E&i5lI8V\t=I5aG>tBpERG?4?b<1pdMWe9RXXFR5P::6qbXKR!Fi4NeX#m#PSJnmZbX
JcZ<?l ?DuM$I+MdE&$wA\hB*TXbG%a&dI>@YZ5>8=S&!jwVpTcwlK1wZu=mt+/cbN<eh*9<4YKZnpBXnAZ?J#m
A$WkpM %?Xq6&EFC\hhq#ZlyRnM%=XmGyDuSh9lJZYIC*DM=yM%bRhD?ckVntj>1#X?^%lH@VkV<u8%H*MDR6e1
!H&9^< /diX%Hhq\QCIlYC5*<w4Q1DTAZIp\/ByJNq*bdDLy6GQ88+RMTZJ^I@q!NpauN$LyHPDG#VJLFXCQbV<
tb6^qH lpcnDZpkyX*lJ<=1Y&#Ne9EKWlYRy*kau=WCQuCmZZMYJ6/m>HVI?T*JXMp=HckY6<uDB9id#*&akR+\
c&JJ9% ZXm>yCD46bVdp<&F=H<y$TG^N/?8lI+M!$w:maj@1DwIDuq%/EYhV$\qFdkIy!?\1akRIM^>/AktQBMj
mR5QYu TGpFnW*5b\/hB!uWI!5jSp<e!A5%kE@Sa$m!8WQhNRMJ1e8wuGnWl$Y#R$5e4Ed:<b=y5\wT5C4Sm\59
c>d/FM GEQhqeneNYieJ+&<:W#eqR+JcELIR$RMw:dahcI^hSeHCIIaVMW9E/H4weq#qpk&m$k&<!mF=/:5am$K
pqiiS\ VC&EuYqFQek@JlwDq+n:@JIqEmYLEyiJM:h!FPEPp#5KF&D4qbB&DGeDu#tIe!ABt#tDYGTqpEQq6>IW
KVB9cH &@a:81%:d:qL=9VMDwqDuVekP!B4QVpyiI8B*HyWq*ZujX<8G4T5&1R*S#p6SemCDQYL/<aNN/WP/NY@
luVA1b bZuQj8JqjwR18PCAJ=WFFRTaqQqHw5b6I<F?B%#LbR:8jMQw6XWAdK?mdjaWEF+YNYlJ>9lTYVhYk\pl
&whpPT Mey$:hyJI94Wj@kipM?ZB%V6=%TZJtH9B<ynSIt+Mwa%$J+W&@hZjqk&e:@bCa*5#&THDSJ%Fk!TZawG
#l1=uS >E^bj+R*1dt$8lEcFHRN:Ay!tVwyKcpk9=DaeSPYGSZa9Xd6/lZFNDYQD^eYZkdX^WMC#CXEXyuRB^q*
$Mnp/= <TtEu&k*5inIKime&!#SE?MLEGVm<#btMtVSy^qW?CHS%^nS>^nn!lp*lbmAQ=u1Zqk\c=+HQnHuEVFj
hZZH/L V!8TnT8/+IPy9AXVITWFu\ePiIIk+9py\^Ryk!Z!:!Z&tSht:/*lPutlkJ4$N*#=NZ4t<<Rmlt/Y^K:u
bP6lpI lWItdqKJ<m15lItN^8:&QVL#py\=l>KAZ9HAd&IN>IFal9+m>XIKL8^WR>AD//L=XZ/>Vh<6j$4M9tw?
jM>FBD PMKB@YIRdmJ#ki#E?+<JWhKaXyINn8e^4JTHtpbpM?T5XiQX/Mba4MctmALRnQiWHG>pK^IlPe%aVmHE
X1hIL/ #n>@L#AEnKk+djwiP:FBtC:X+FIqpSMQiHE/P=I*49L%paJeBBpP>ZXDY*VRR@k?w6=FaeMR&>NWEkta
bpaKIQ A=jSq1VEINNGYn/FJejBKtGkjApWmYD@J4>8mh6Y*XXlayt+D+b$hGti<J&/Euh/QN6$uuebmM=VCM<E
VjQN5W WITqq>ICR9ynGc=S4S+GA@SDVP8wj+11N#m+6j&a%:CtN\^9LFd>Bn:cpK4mb9wW8YcHbh64ehq*Vb<u
n5C16N l1e?4GAuBmRnZ9<kEmGXFPq\$1dKyt&I?XE4iqR1$dLF=c6+RX?#R:n/VaBwIyF8j/MT1Vl=@RWeI#k4
CHRlWe G*<m>yQ/@D5hVDFuC?^$9*u%PjX$8%K%SH*PeAZX!lI%5YQd@Al%VD$y#FR@KB::/FG*PSle>Y9:T!H*
Fp>n:* lWd%jlXyLDPyTR6:KMliKNP#E!T!an:llW+*6SB4DkkL/nKXymed%X#CWYqJ?tL>?W5&Y?dS5*WdKp+%
ZPd!K% h&jy5:EyGFNXBFMXhE:>mp5NeTlaDYd!iQ8WG^mZA894!DhYI4=Ykaam8:iGkN*nk+>>CF$lETPX%QhP
DT:WlW J<\hV8DjNWuH#h+SFWkn&p?J:G/Y^\Fm:PeD^BJ=1BtZC>Xqade?+lL/m+<:%G\PaDk9B8EF&RSLFe$=
uL\A>p @mV=CMZJH4*B*EITwEp<b15e#lt>YNbV:^IYT4<a#KB8u9LkI9jmpuBDFYdt51Pl\b1up6P#KD@1\jbP
B!Y$5l XK^MBSQB1&wpEQ6KmC#C&YNeXE&=/RiWk:Qk#=R$P<CkXI1GbFM6=^!DB$iQ/mKKa>C*><t#cnA6b+91
KZX#GM Q\96=cRQtlcy*Jd8jK*i/u^W<B*HVpXNHD!u9thE<P6BX<9jbA5uRaj9l<V<SPApkP*Wy8bAZG=ZaQQh
AA%<#% L#NuyqciDZL#$t:9F9F:=I/mL/EbD^aKDT/c=tGNjc&md6tI++/EPlSkEyNXQ=C!EW@LGlK\kDT!mD@K
VZPmLt E+qYnPaZak*:W$J$ReyEZ:TYjA<&DE?SZe/SJ#\t^aWyA\+qq#XABKMwB\tbDSI%d@i<nY5w:&CpHVhA
:=yRt# V%P/a6iCPk<BX#6pGN4SBQL$T>uZ&^4Ip!NQ?&Yd\LL\Sj!TWHuQptK#>AypaH%RBtbp=I=TY9=FNT=n
^ac:1$ JBL^hR%1Qh=*Nq\E=QK!46$:?1tqe6<jERqF*MeWQTSea9:k5XCa4t#H/B>\XhuQM:iNkZ&Y1P@yFlC>
Nj1@bp pkSuqQM5=iW55ewPC<+>J6tkj&^:iIXXAE$XF58$l?!d*H96KZP$!@JWQhnlLu8=y<tl>c568TlG8PP+
6<@P\h K=dVy:!Wp:Yw+SZkWZtwp>=/VTpt%m&H@In!?9/V&cc1tVS5WkP/?LkAFqWGFctcAJTFB\1j@JSXG9KG
i1?Y51 KmWdV5nR51TySNH=QX!e5!CmnDPmK4ti=b!TF9aX&mN!#la=qFwyR6eD?WkddWXuRKmyJ8%wCYc=n1NT
=9cZWH Pme:bJEC%E/w:M?Y<DI*MXBnRD+kb\I=b+TV#K1ahIyBGQ^Q#*Q?VaKH@&&yibnEYXmI&Xnb@%+HMT=Y
TMQpLn q9@p+R@d*<cp+&L::bl$@&l9?:eYR6a@5c9?NS:j9:B6@5w1!\4/DjR9#*^aYZ<D@e5#H%c&*$H@!w4@
k\1bMT J:H+@ldN>58!PZ+H@e8!PZ<H@R5KF>ij^PL:Y#V4L\lBZH<Tm?>9$cBjQjij^PL:E#V#4>C@I&8@QpBk
4w!85\ ?!%l?\X9nw96*<bH?$j59?iL?E@Y::?a4Lu?#CtI:e@mw#F#5Q:j/^$kDNWR=>i#4<4Tk&D<$b>RtRE*
DdY?e< 5m=a6tZIuyw%5=<5V1lC?T?=aHTaciF5?n=Yk=#GKWZI+lek$i+/@LD5/:+P>jLwNcG=6!=CEpd$LdN#
M4$@85 bd5!5$a!plbG+CBCe!IGI^1CG4GR:$kE?+^T<KKkIG^d?8^B8H6<Z!y1G5!P1D@$k+NJnlqmIp/KTHJ$
F@unZm kAu8QpGCY@be<@%^tq>j4Xk$&<mIQ8jQPi=wHe8M4GmCXM^wjS$NZdNpTEA8uA<JSWP4ua=De^TBPRDN
Zi$RD* lEAK^aM<bh@Ec/lCTSeFMcR<GRlSLnwbYWj\a/TVjpl^ky>MW9puFD1Q>GkItKA9QJ8k<lS?T:p#C&14
ww1/?P CkHk=^?S$9B/dV?w:>FESiCiXeb>h5dqbVu^tjlCJ1n<EpXtGy@V/WnGQI+ea<MtIHCNc\eBBS!>jiAV
*6dpB8 CYCT/LweS/IC^TkiVa!T9THFXGLqLciyX<*+nmpa:\1PHX\D\cR=QSjAR1yc=+cL1b+Lma*hEIBqQwWW
B+M&KL IPe<n5KtMm</QLitA4F\5<ipM4#AS$I@wlAqP1d$w@HDcEMTq9CQ/b6!MTyYNYalG/*JFe+HSjSQJiP5
1>dVid p+%9WhX8wmBeqBVYK9Xt&e#88TP94p+%P/NE&+yAcIE&#QAj!V=u6Nj&+8K^ZE$y!Wml1!Ln<bQb%h$k
CZ>QN^ t&SJ?NN5Cc:=LQaYamR8w/k4GMt\QpmqLMT4VV^FetuLWNXhW54ShInae&ImyXMWpq1i/$6!SY@JC/td
5LX1pA uEX6FJtM6e>^jMQZXLILh1M5>LaT<jG8CW4Sjewiyu<RT#!6ZmXV&iN&M/Q@V5bdhL9jLhnDJW*k6w8K
$kc@#% /KlyS4@*V4WqEN=j=VP8GKnB<48JCHY9T@%qAk9>Ii8HwJyACNSSM!kIVJRtSDb5*\BwXS9PGXek^5u6
1WM!?t tli5pwA/K\eW4i9:V/tV!?mP^^NB&LKFElh<>9*4jK&KKyy#hXS8*+\IWph+%RnPq*?MpCnEjY6+?@PV
WR\buJ B^REy!D99Wq%kP4N\+@GY1mKJ=<d1GWNKXkiu/LaH/P<D#>\p&Wm\PVb\9KdcKPF+9y+JiLIY+IVebj8
YS$5^= l>:Vc6GHmNXXcF$ePWl^#bBVyM@=C&j#nklFeqBRV+GFc\p=CJXT*&4AJYuuBhb<Ri!FtIiJuIEEKac?
Bki\Dt yIdm4&GjEG8MJYQ*aBd=Dt9uT<NLdam1L*kF\LyCwn:!EG9/IkpB*u$<m1i1QtlHYTNdCe#>#FX*e\dI
pEt>8Z IcZuwXecjyQMHINC:BIm*b>ja=w=9QJ?!9R:X1tR?9ct^yXV5NRNVSMPB5^ZGTpR#DQZF@Wj6/a/?nFW
kH\bk4 J:MRGN6j=\*jJTBWmVi?Y$Qc>cC*qm=M1BnaLX8hI+5*\^h8*H?iMSl:/^:=/jVnR5@$4k&F8ZY$=68m
iT6MiM :T>alFHIM6/>Z%k@$ciJ+l4WQbZT%/#*KFbAPE&ZDPTdY8A9BiBL\:MJNF+6j=c>hXRaVhy5F=QP@+d@
!c5qJC &VHB&%<+LZJ<J5QD#AqKGB\KMZ<KweFhkWc>Zt9Ey^iwDD1qmM/?teujKCP!q/W?I4JeSWLiRVeiNB8m
b8JD@* W9tMGL1KINGXR@+&4KZBYHycIL#T+HNlLw519t1Bp?BE:>j$m8V6GY$G$RjSjk&yqi=VH=pm!B1!W=K5
Tb#/=5 :iLm!$>tcR5>=R4L&TD+kT^&jPW+G5<:EM#WSDq?\dPG=*p<i1pup:w9FT*LA:Id9\PSmaB!mSyJwhAM
t\wmh+ D^H?$BatG%@56*:q&iXl*a$kQk8Z4^y^?V>P$y/edNq!NT6lBQ*Wi^B>ueZ4aJnh<CuVZj\q%@DqEwb\
pMW:/q eL9abKA5McEp?61F\JMXI/HeK*ybK>ZZjB4t\<$KRbKZ%mbjNWi9Yj9X<1169P+?AQWMql?W<*9qP1#R
\PEmkS \=bp6B@nqewFQ$Ta%!*8+kkHGG>wwuC?BM5IN<!Zk?p^i/5A/%<eC+NEYdG:6ZTVq5>qH%cCbQ^9Jh!Y
wB&k/P CW4%VyXe*Li$t!jcST1tbAy%<Tu4Ad%cAC=nVCq<yhSqSKaV^*\:yMeG$!RtjjwaTHT9A8qSCM!Ah4/p
5i%b@H 89V*/5Qc1>yqckq?H*u\mlGVSSw/*aDIWtnEl&SCV4cchyW%k!HR1^j%NK=S4JlbFTI$?T9KD5HS@V&<
\GYjB5 <yW^/1ly!QHc^F1PT%Mk9X:bb^w6cMw?bl:mduE=&#qaLk\%dem&WupewqW!&JNiZFLb?>p9^Ah96ld+
9G*a4^ Nb*X:ct9e@G&8KZiH*LV41ayj>B<nM^w4eGW$jy\&$CJc?jbKM6Gj+^W8c+QpwTe*KiY>L$G?bmhnKkj
-ATtmc 00099df08d1001202b4 Page 175 of binaries2.zip
*4\%$4 &5EiEwC?j4l++$>$\=?5HkC4QJy$aaqbZ1L5cJTMHEAuJ$*d4%Tpp:EA6cJ45tPb5VP6Ej%ym6i6JP:6
ZQu4DY b\\9t<Lw55aN+i4wH1@*am5<ajM!l+Y4H8mN&:a@!<y?nF@bl9N6K/e@*#6E?Qb8?w?JYwjWa5Xj9D@1
uAGaSD 9?L=/TDn*qb8b45:JkDB@&Sy#Ntbey5DRXcuETeQGiY1HjcyDDlRL=ePXdA:?jZWw+L%+#jYFJJdb4<n
Hl>t6N RyaqM>ejk=HWXwtQ/hL^K>\Ipe/5XVhG@Ei=<nySX5m!X@HESt8y+^V&=dmJd\wcYSNV>My^V+$NuTWn
%A#NAI RLWC=CEj<+$#T1Y><b=Xp&a18h^qXV<5QGGk/9p1TAuT*5KAhiunSk6Nw9DG&4<=Eu@i19RYml!X#m^M
PSGc8k VTpkiXm!Nw4YyMQ%YGNa4k&9qGjt+N@Tpy$Dnyic^dh4M+?k4Nthe+b!hBPSKTyLkt^BmB#D^chRYI$T
njEEw4 wbYHKy/Y?kR/Ql+FWVI6ceGX9JdRwlHPhFHbC#&EF/FmQ%A@5@VQSbRT?LwGllh4F*>AhKPiVwmJ649I
EHMM@% T9nJwCWNYYQSqCNnqu!I!%Lkw5@CV&*Rh9/le/FI4im>>:LX#1yMVhM/j$5&H8c+V%FRYYh$Edjk&R>V
?KmjqJ Q^DIwQNiNZ8:PKS6&&KANWa!jy!+h:TwpNFR#ZBb+*BX^%#=BcWb+HD9Gwn>@1!9diRwNlch4#T^#WK!
<Z**hA Wq:T&k^>ISw<mw=&K+J<WaK^eHN@dlh^WqI^ep?>h>^+yQL/QRP>yl^6S5Z*5aQ*$HLt$nYtZ/lN&$@G
!&c&G9 b4<ZiAwPRw89t+c%LVNkc+6>F/S6tQ#&\!/pH?/5A+cM&ba=Bn:w5jC<GLdmZ6C1HhdSEKpte+%BD:dT
<@RYeu Y6/&l6j9CGp$$5d1K*Kle@:PHCke>bt^dXQ?!&a+Ie5IMWM$=6aEL6CiXAbe54=eX!%5\h4ePGuwZnW5
#+BRW+ Xe*\BPtE&KFt!WI&=:FI8Saqc$lKAAP/#6yejpHm^KdCeqb^>ayCBe/5\b/G$5LK*TW+MiWRQ@d5l=X5
9IP#\i e8GJ@lecMP\B?RA4SwPK/MTlb&u4uE%G/BN/kNEF14EFcj488h<AG<cPbKS+n/cp8BTbbMEbhVd%i@BV
!Vn+Qn +kBd/#E@^Z:/WI5ydD:^9PL1A5FlYq8Y8eD\/EA=u/GRw=Cen^%?RllYlpwZ6%P%jRKY6=QtcIS\Li:R
ncTDAw ?$k=G<RZY%kwtY$D*>/c>$RQ6>\NI+jW6p#XEYw4DXk4PKA!K&akV^n9My5I45?Eju:QHI+ec+yI*Xe+
QkYq?C yQDYMZbG9C?pNukCTZem&4d\ENpX&VZAdQ6tikYh&ZS&j*@inqHNd^=c5The6kkp61+5iR5cnuSF6b$P
e5P4YL !R!I>WTWpIJGkmNXHu5Q6Q!k/E8BRJwZX4HRh<pd!Vw^L9uNDFa4mFZdRn=qQI6Qbn6HIqQ@CnJ#4$Sb
k6Qc@j eCVL#u%CPSGFiI8=L>+M?Q^beC^4n:m:hCtew8kLR%%5$CmLlQYu+SuE\9l>1R?y$C4MW5kQTwKKCiIb
9nwQb< lw1deHqGXX&h*=FRS$lHL6X=YB41npFw9c#d@c^6y@k:1GcI=@*WSZ%1hp6IF@^KJ#6$lRZqa141RMQ=
NTy*Lu &W^I>Fn9/RYLW>nS8l/RIkI#c4LAiRcCw^+<9Z:lXbtJujb$9^a6pl+911pT*bj=IV+1DPYpTnlKJQ4=
F9Lpj! eSBITuG&EuyP+S6CyAHT=he*eSD+hM<uVmZGqJT**@GlL:X=w+!w^?m9yR>GwLjNk#TSDtuhI#XLERp4
me#VdA V5L\+yV=1a+Ce\Vl1Py^iu@mRZ>PRBVCHDnykSQq:@%limE==+laCu$QmWmeR8PVllp+FCteFCRdX:eA
nwnWc9 8la5leM9H^SE<FMWKHHYq\1Ph=Y%b@F14M%KB!1#qFMSAK#FKFud#hAw^aw?a<=LFFak?Cq4&wScSC\l
dtGXJ* SiR>t&uQtIZ\FW<btwP*:eG&$:41Y*?R/q4>nLGMSL#cLDPlclM=Xq:WcDnVedWm*S@e/4i1K+NhZJcE
YL%j/\ $wl:HjP&Vc^H%ecuTP!6:k/d*I%pY$Tmy^1W5wmW*I$1FFI>VLX$tN!Fi6&c5KN1ZnCRN&FlWQYLcyh&
#\Y6Rj TuCm/dY6qM^&lc5GncH&dMmqLS#=CQSM+dYkR\W8u%1!*dD/mHqQLEKXTYYV6iX8Ay1tL*PWbtHbCI!!
?pMK%A VbF:w1wijC>4E6tLH8J:i8b8#GpNA*ymFnVbYKuAYMA*jTZ#BK!?&*\<+ZHZcCWSEYIqiVEJ\\GQMNwe
hV<hPX NWj>wWSBJIt?YCZbeQG&umJSK!uKt8ADC@I\WeRW/JHwiC8jCQEp4AHN@nnc+X4XV$uVBniJ9c/<W11t
J^AQTE NwZiSnB&i8d*QXl>>8!BQp!Q4ME^GqZ+C<jWWSN#?aaDNhKB^SX?6hIZkEw45AAiDZm9TnHHT&pb@b%y
@+VF8w /QD\Ekj!!mQ>JcTtw4Jt*1FK^dJd*ZkVG8u%i^nky>DRE4iV%N+ht+Aj%hmXDGb=t6It%k8X$kpt1CA4
FI/\C< %AV:LdT!>EABni8lSTZ<dWM4VmdD6QNY&qknIdH95*djycamEBu+GKVcci4tEiJE?bRN\!*/*mMpMNnl
Pw<4Vw i<4B/XEJaS\%$nGRP5^uRKP<F^!SJJX^:n:qih$RC6D%9=96RuaPey8yl4dSk1/t+\j$<nl8+cQB+K5T
MeCkn4 h&qRLqIn5@nb%m&WHFt5TWSuiVyL^=MZjB>?/!BtiZSqIlVBS!Pj@ppCETRYyN>$5pjX<:GY6AchBLw\
yucMR! iQ>+l+W<WehbPqiF5IIm%S$y*yhC&wIB#B6cjR>KHBI=WF9BALC++RHa*J8\d^1TCGV$$$k=YKNBLl4K
uS!huw DYLIK8*jC&INXdZuCl^8iXymL@^8L<kWBut=#1NWJbbMREJ6i8?ImC^YF\y5CSlFuk6%>eDK$LV\D*Q8
<uwB%< YR@V%4uEDeIqH+1?91BeWGibJ1&>Cq<cKtHLIAHT&9*+CSA*eLB?jHKY@K\=:w$&b1nARVC+Gky1=$bN
n65AX9 <Ma\qeuZJAH@e!5qG@6@*89<q+uDj><G!jcjDIDF^jWuNpm8*:FB@mYS:%>Tk*D>qbQ*#=dJ9=yX@5bk
N@pTm/ <!hYMncP*:W6@ppYkd>F@>K8?ThbBQ+Y@W9L=J>pEjkV>C?!SuD>TScBQ$H@Ip\T%=<pEjkV>K?MbP!5
=*lECj 9+Ntaj<Ft8$*$G^e9$K#@\ccqj%ZNij+HVVwX#*&P:L&T*>!h1/@B<*^P:IG?lZ:kPN*bP%Z?W&+PH=H
^=%/yG %pB59$L@n1!B&H@S*^!@I&8kZ\V$+8Jk?!$$^!@R9!N49:bEe@!P5LH@IqMHF\ju*+Z?HYFn=jnF=MLJ
/BGMNN @Hilj&6ma@qFq*ECj$6Wj%W&/P>C5@=h#<*&h/Hbj&8a@K4XPQ+8NPjjM$\+8j+iNNh9LcJ59/k=%&@J
WJA+1E G659Jyh@HadnH%tl@*/u@XWS?w81<9yN^e*a>T<@!F4b&@^FD#L=+!b@#KX54$PaqbZ#hT%n@ke>^5Hb
bt>1lq %M#=4*uVtQ?&M1B@i@VE>4?PbQhQBAptiYIRM@DQny:?bZTP9%biW<Ha?w>/@uQ6@*LaVe\pd&V*q!<k
+tV?Cj htItDT9VQ\/yYEHEVJJtXlcY45R54?4T/&Na8dwwtntLPNk=P6md@TYP\c8mb?9k4PJwbQKKFnX#6#I^
*iNSWt p*A&<9#up!=Yn9>%JmCBnW%aet\ptEBlI<WYW@a*KKGm^p1eBiwMPJHmJpw68?=<SLGTy5ye=Mq!XIuT
:*+6/? b5w65!\kyqSbe^Y8kkW:np^=C=ZY*S@iAntKq14eFNlSEkZKXm1+hE>yCmY1%t4eli1XGlZ1Nty6i?+h
qThmRD BnYc68w<FMunFk*cht1R+?!LDm&/>lw<lR8u:#:4&:A9WZCqkZebPt4!W8IkljRbP&q?N8h+E#Np/1#F
&imTi! Y/VBpDJt:1L/5Au?>Cub$qYdn#JF4ulP%PZHwTNai@YT4d5PZ>GmZjP1@V8hn9&j*y&dnl//@FR+WaP:
?+5P5+ #l/6J@6%K!MH4q=/@MWcqa5u:8>%%5&dH5bQd#@wC%CqnH?:hty9ZVMwZn8:@iBnIFDW8Vm^/P%4$Qu6
$+m!@J =?QLq*GhL\6h1QSIEN&wM9Nk@Pi1d&B/WCMBD%*&H!kRiqHHYE>/at$=WQ4REEZZi166JVD/$YSB/J?S
NkF88l c54\B6Am#jAG+m45CAdS^6#iDMch&K@$Z%\HpR#F$$iSTKL#JqEM^>9/4InFp6tC5IR4K8qG$eecGWdn
>k:6Ch V#1a^nAR?%qGnVIecGWVbPjb^lN5l$HT#lX4ZBMJFceM<pkX?Rn5?T!yi6HZTFBCW+pMTCLVtHJaa6PJ
XW6/q5 ht?E^c=+Z!StEm5bbGa^:elwbq#H?SVt5JBk=CaXViZ+$$KehR9up/\ViicmCy:W%Pa4dZQXMedNXPjh
<pI!^w P4\Nmt=GHjk/&aSYP=uWyjhqq%V*a5!$EcLTNJ9eQ5Xb4mD\Fi8^8%NRYK^\\I@c4j#w/HeyZ/V+=KKH
#B+t!9 a@*VjK:Kq5=+<S*W&96!HLWwh\Pew/<i?5%:V#+dewWhdy5iem@Y:PyNYEGGVbW1@pa@^Wt@G9=ey@Qj
XFlN4b Qw%?E:YbCp*^*lVHuZ9JlBNb=wQy1a>A$q14XZ9KQk/@YiK8S=GNtdqY$V9dd!%b9lttt9%!&D9cd*y#
m+:b5Z h6QXew556J%QM\+8p?N4e5J>/5!J!<IS!&!<j4SZAiC#P865$>j4G$@cnahL/FcRy^9K<J@ZKt*d5eh4
wQm=NZ 9?5M#DihbWJQ6=i*j^#<epGAk6Xbyw9<4jb:l9^X5$M=e1tu!HJdh=Pn4kNJl!5l=eZkGh@dmid#pj&>
^b&!GG EWe>C+qJh$ImtXqu:&!84/6inH!=np?DGl98HVAG!?+/&ea6#6>@kyLwhd>SLF<@XQ69P?lcpE%Yip5*
wYZak+ d>^&9K9eeu9Cmbn^R6BwHL@*TZu#:ZdDR8@G+Yt\j5$M9?J8*\bYaCDR+aN:&*Q&!miH!cEGj8i/u=>5
4Vn=#S +X^ndkaEjp!54YFM9/NuYY8a/RRRB1J/MHF6C+c$k^Fqa9yWGcq$lp^D4D?e?66VuHh>!\Z@JHJ6NuE^
LS64n9 n=4<BKPLTQ@BRS1:i?AWpJP?cqR#@hk8/RLacn@^Pnj4d>Mp9<8NZdNAR$dAYu1DbwmIEBKpN>IQK+c+
#qaMII ZcH4\&I$%d4Eip5ATW#9mNj!Gd$SS&6qtC?KFEQwZV?T5eqFmJI:y/Bt*tRPV%PWtNFIF\\FaEQ&R/!>
ybq&R8 6pCjyAKSmY!EmhQRI/N/RSPbcR4nydpenld%=>&GV%yAb!WeGmpcjXGqeEi%pyFREhSC$!wt>C\6:DV?
JnI/pk !/>nnhdP:M!nJS*$TIF?KVMhSy%tl+#tlEWy<W&tA/$yIQZE56TbaE6beVR&<@4$DAS4K&HJR!APHIE&
I@\aD5 eKwXdTEF6NC*daul6mi5%hWpCQmiyVLlycB%\lP$Gy?t=J$&6H$PkFIM#XFF@1mwDbudW*G9=bJ4Paq*
^W5!4e J9K6+T:#/qJ6DP?^khwNNX>qP$k/:a+=wlGQQWlY4@nmuhTl5F>?9ZnM6QPX8PWcTy=KXdkeX#YuXSS?
qJk5Z4 pi%qME+bEQWnYm%6R%EinJiGSBGpaX4RSKyK&4H<N<KVcD66:yqLS5and+tWK?X5BibXkmm@MaKG?ASX
Y1QER/ cVW=Y6tuqML%w4uDd/4+*54^Di9bm9lIikj+H*QbnJ9uT?$W4D=e5/5l%!6:SYuVdw>WN4bFK*HQmqt4
$cB4N/ +Yc=Sya1c!5yqi>iXpH6P?QAm@KWI=uWNTduLS+%/>G4ZpPKw1KyHuNRH!jtNGI<i<:BB/4S!KXtJZ?S
thHAP: Y+J:bn^A/pdDY9/5EaFC!ZCnq!Wa9ku4h&bnFjY=QuqAX$\/Yihk*KCBLZ:WD\FpalQFWPpGHF/GMNC5
-AZQu= 0005a14f99d001202b4 Page 176 of binaries2.zip
#I$^9E &k6C\$:9ZKi4$4X$JK%+^@=6plTiJ=S95^X#\WFNc5QR>qN#Ra4:&SwNu:MXZE4Z#QijCkkuAtij\G4h
1m8eiX #Ahqhi/j#y+/Y#Vk6^e#P8#QnM#4t>:DE9LmBNDJEViqdJq5EXKFMyeyF5*caC$nnG8iwmuX#YZhdP1K
mZPn6e wN4K<jeXR&B5S\a+X!e#KQ\W@tS!%?yLbd9SNte+4JDy4iywi#lp@8QDpI%S51Z6%VCuCKZy19Fu=/nu
?M=bDN EW@FnV%dGk<uPedCP>5%lZTplAl55m@abR9cJ^i^LMp+1ZjX:ASnqXIZ\a=D^?TVq6aA&wak5F^8&1?4
&9BBuR =Zl=Dt5^A&+cJATPbMW*ADVmNANyE&qt$Y/55Sq\M1ub5Y:Vlm?yw@k&Ryb6FeJhwY5NPP\h^/R*YeZB
:4cnLn dRRN^YyH1=&bDul8@hjjTFPpHHkcKJG#NpNJZ+WR6mGb1Ly6Wkeu^\Z5S>ZmQAiE:bEiq^?n99jZ6Kjt
^SRaR+ Ndqeik%5nEZ8M>5nPd$/Jp@uEkIjSq8G5Nb*Z>aK8ELXEG4dBK+aWL<&MFG4<dI$YMmlLGjw&F1QN=w*
b<PAhq G^p8RjZpPLT$64nJq&$TEQudqmi@/SM9*j\y@LCSleN@W&T%>hCV1iD>4ia/Ft%>NWE/Ja6u<N&P+ebe
k@tVFV 99FF$8^HFp$AjFMF\IAlbRDEA#*4acGyaCkK/X=XP95VbKDHy>@kec*LDD&R5MW\Q5<MI*&aAm4i1G#N
B5Lj>9 <W\P&M?R5R4T?6d+@eX?<ap5G=L^w%1wk<QeEpVaWWbIn$WuW&HtaMk:Ywa/G#NWTL%q#*hlF>JiHBLH
waLM#N ^!I%R#LS$:#4!h6G/9i#VC^#/te1&*klaZVINK:WVGtPHiijZRE8y\<Q?l&&k<9P69%6Jd/%N$kE&qh4
6Fi8nR iPK6!KXjJ1@1:#8=Jl?8yY!!9J&e/lbZLC4ac>@$Dq\cpJqRlXXn/a>?9TjKu5JjdH<TTPB>tDu<RXY<
ERW?QA ShAbe@V>yHD%NtcV&GBY>8q\M&!!=Ndl@Qd5t8n5DmAy@y*y<ijIKtkK?X^8Rk<AiBJ9Ba<=il!#Ly$m
$&NA>S jIytjS/dB>mZR!kTkTNQk<8&EhiAQ#nARNA/=/B!RXVlX#t1#$!^Rb&NdEBnepW4RVG4kVN%k6Za$y%t
5t4Sk: Qb?>*cAbIR&tj^48CV6H4cPblaPYk=m\kC%6cnm*kK<JkqP5wXMMkVk9SdAXR%D5wn&4SDR8SKkyly5c
m4^^Hj i/ylRZJ5SXSeR#\98JmcS&bmk$E>SYBiRTE6S$I>1FTMRtEiSYcBRby/AuP<BeX8weRlIDpl*$/n$<aS
>%BSjT IE=VIVwS\X?R$4LRIcJ^IDk^\W!DMJS\WJWppKj=Lena5FnW5I^T$=\$5C+MkZHcHhMt&LY&LE:tF:Gt
t>4%e< ?yWtPLZiPBj?8DVuu=YCeG8neC@<eJ#C<NDT<Gw#T<?Nt<TWMEp@a<u8+H>5^??uIAB9JXBw^VE4R=#8
M<9#Yu J*RcJ1\hJ:!aj5M!@<dy/=9c6VeZW@AFp&@SD6@Yu4/>8Hkd6!96hEXW?$S$CjcYukFMXI&+Dwq+=:EP
wY&ZLl Ha*EGa?pkQNG?R$ypILWJIbEtad$pwYMTjt&nw&5nw?5nwH5Ww#eXIWeKEX?1TntVEIB%KIwICPj$cME
ebMQme tkw+G%E/&%H8#FIYByMAucn1QuA/8^y&AST*+ck8w/l*uKnJnItD\G5Kwcn4+tmB?VRmy#Vq<HX:ECmZ
cLJ<$+ lZVPP4V^IdTZtTW#4jVPhnVKZ!4/aW91?8un9%LEB>AjP=Pkl#HWHbLH4#hE6mutpVDY*bFi861YlXEd
d:l$W8 unFIS%G:IJdMw6FC&GIRl:HW+!Q9iM*:tSQ:teQuA6u4<Xm/\wAR#1&dAGkZa4\EX6kESwKeM%aZ/YjD
t%e\*Q 5iW4j9leXZcRApmFm^*E^kb<wEB@aRbB%@SDeTSAKny*MynaMijB\\c+I=?KplCVkSIMmc<mPRCl^J9t
nSAa6$ n<bIwIS<:8y9ZKTwC1B1#5wRHleH8ny%\=/5K+S&KARptmA+=yqG#w>\ZD6PRGN<eJA?P<a1AGNVwV/S
lM/k:= ?KyTIPCE^HTLy*/hwAETkPVCC%#nNY6d5qb5u<Pj8kyk\jBuhkqp4#<VILQlF*/:&Y5kjBqQe9ZAA&%P
9E!%=L HF%DktEkYC<qPwet>Ee<@#hCDZlC5:/eIF?cK*kPVF:&1?<p=Z5m>bu5^+9e<ttm1kkkj*hIFYuE&Te^
mH$Y^Z #BCcSA&^iFkPEV*iERXtqh6CqWZllBX8ciWKEVMiSeXH%T=mj#TJHpSw%#b&qVNRakc%maFp%VD4N84t
Ct1Puk HD\JJw9WyRSqk+F$k#H^ZLtM<w*+6b6Ekky*wlkj1FC&B$eK\pm\kW9PhWNkRJhE>d%<HwwCb5=DkbSR
nPiW<+ +y*ChduKhc&\6bwEPBGS1#9d8RJXky^1I!b^kw\<Jy!!cwD<ZIh!D^L:QA8=/w%K&JXKa5ZWnam\C=b\
JanNp+ D\u\YppNHE<6D\>+hebqncG5bmTqW5:jTMC6&kZP&1HB=map#1KS>F+wD:/>EWLXDb4piE@#/k8JQbKE
Bj=ecV G+*A>l6S%q=Sa$R5ITDmHIw/KSLIDWNH4Xt5RW<n5bkip$KGLbk>+W\PVE$?N$%dGEpLc%:NhcIFG<5A
pEY@iI uEAjM@QbGEi&mWdRhRB^@w:5<pYu>+4&?phJR1h1$1WbPDKPt+W?mEjmbp&ZhqDYpE#4bpeht=kEm$:m
y:d^w9 ?y$G6kBy@IcyYQnt9IwY8^LQ@E\R^t&F$D8kC#&:1+6q$enu1*dPiSIV%%X&5HhmYAdt&Fa!5/I$X%F9
1!5e*a Be<5Fu^Ej\VwLBVT#DSck!Mja:IbNhYRJGh41Y?y!R?^a>5b::k4:FnwRVkIw>KB*CiJb<dX$L96Au#%
TkZ*6T QtIR8SiRJL/*ICWkM4G^\PDnNuu9CGEuDPZmtAI9y6#llIQiu8@9qL#PVmbIpqVL*$Pp@=NPYiXMP<DF
kt@W&9 SeT/\\mXwZ^*HyVt<tNcJ#DZXdpd1&qFM?GdDt5jTSMjX*MEN^cFZHM<l+cX*i\G/Edn*V5QWiXTkb>?
P^kS4S JeFDuB1!l<&X:JmDH:CSuHF/&JPMQH5>9enMC!FjbPc+9H/?N?n%bXEQ4ZCHH+19h5lXw&tP<t:?/j*P
yGWR#c pQmutYi!mw?GEI9IJZEhl#VR*\FTkV&BkI*+DGka=6jk^Qy8$l?TZ:Q\MGA!#H?JK>CD&\\>JZAt=h&T
k1HpC9 XJAyl4&ta4mtmI1tX4Ay?eYTWBDHaZC11^D!Z9A=S4Dt8%BPn!pQ9GCY:qDNYBGN?nDPXIHWqLCYHH/Q
\>4Nim :HDPE4/q+9CYG6/Y/knPFl/Q=wmYL8:?WDdP+emY<end/TnPEb>?@/mY6cnd4YnP9YmQ\&nlJdc+%lnP
Eu^6MZ G+#Wm^mQy=nD+DJQ5FlQ&ER61NlY6DmK:!^$>#S:auF*JQFeFQFttQy*NQF*LAqenLTM!uhe9JDmbW\Z
HknQ#K DwtiWwu=:FG\5WHmB%GD<8@9=JL8nJK&C@bIW19^lPJ1hSK$*FI<QiQVFQ%L$cPGtn=w9W>6nW4hk$n\
tV4?F5 E/YF$M<Ti6:nEputKp#*LCGYmQc\/QMc>AucLp^9:enawW4&VC=w?J!qqb8CF@iJc@/Vb*!E=%wGq&da
>F<YlC WDy6&6i5%lMX41TE5+S$48:5%peRFc?*yX/G%uc5?EQ&QXw8GWTtWPyt/^Dd*eR+%=85i=1<%4iS4Y1y
!lYdjn 5NwiFmY$?A#=>+KKuqjbem4b/XkF>+4Mk<dS>:DiX5kSYtKF*GdyZ4kaDMRF&>q=ZCkF*J:F4ZTyuq4=
>?$Ft= uwySyPZF!%Gj$lLX9P\L&6^m<C%K:%X!8J1C98$GeXZS+8iYe<qpmpMq*%PpeMhWeH9GL@hZ6HwYiEpX
cyXuRK LDhYiudEiZ&69NBKmPSG\@$8/IqXhZ>8nQ6R#Z%ZZX%G$:bX\\NX<^/8S4!F&GP?qki4>n%idV5lKhn#
GQ!IYd L&Jiej&J!#II!ML%@$\GBQ9@$^pRXCMKDYy8LAKE^kNLFcEpYqYSLdlLDtmQdk&9!uPWS/mb/TTN@^JM
1LcZPW w=Zl&NIaF\yCl*te*d?M9/dMKJJ%uT^1XBi@X!mk4Ll5yM5MuG=phKK&1%8\CLQHTQCkkYEHXut\cqVZ
\N5#!p 9uek$tMXFImY6$EWBCEC&X?:BenFF+/X^cEc1HFiH8!b5a*ESIcIZReNSGn89YHb5YWe4#@VD5R6*k1%
Ht4LY9 Q&+Y1nEqwFCwQ+@lD$j@PC%IP&SjJXa&$%eHBb/n9A+F+cHeYi$jmWNRTcj4&5dadYqPKD/G@kLJiG/C
WSY/=> *qB=:1Hh^qBiRD<&DyhnuhGBSMnBS=d$aVW^&M=XhpMMbh^\tk+5+BS<56adhmmwwW8*ARd8ZJGWWckD
R&De<k A^@cTAV?!>hi>KuG1IlR:eGkylbFqmC/uCZYXRVbGqRWXqW5K?YTKTW1cjXI@G:t</S<BKa/8/F8qt6q
iFpDPE TW!p$jluSmle4ESGKQcdGFX&j^hCRnYdA%*<lbKqEqJFG6lTR#1\Pq6ceRRG^IbqwMyd+D4t/VhmaV1^
9d?4XM VLbADLcZN%Dq8t?dN+GY*:8Buq@A*kRlTl?/cZ%hulpiKn>ZbI/G<B6l4q1<9:PAm5TpKblSVMyE6ZcY
QQ>lBH >@i%dN**>YbaidMBKkQyQAiKYVFdE^BLI#MJ#u85Kqj*+WHBpmGSeS/::@/+DEtB\n/qH:LDtmtc=5k6
u<hMRV +pPt\8&>4C=?1MHm#:5tNCtdiPh^SmHZLjwYh^aHEtjK^kM41#WIk6X!?GdYBEiC5h^Bm*R4<@Q?Q4NH
\FM9BV SDXYCE<%iRYHd5N>l+5M>YpJWNFA9DH1lEETFYuHV<WCPe5d\?>IN4HlT/Y*G+5aX*tJIE9X6A/PlaVT
Adlh1% #<d9&mAaT%SEV8TauIH$yi<eV<!/>Kha/G\?kN\:+l4BN?6V41+IaqW+YJt+/*F8u6YX>X<Amt<m+#EN
y=pWCK 8uLaKdEKYwRE:j#:c<@Ak:GDAWy:cwEHmWq=<4Cawa#1PiM^4iV*juMRKS1Fhl%p&Let^KT#X1K%lI^Z
$DcYtb nIY^?eGMEcnNFe+HeSwnRXKKYuda%=tG!e=\$NJGXBX:@DP^ZkWMkHF+y6CKAu!CM1S#N$X\9:=^BE@*
bMNcPd h:SqYEttqAnSl!ZBkBFi!t?$=%Pa9CbB*mm<TjDH!^hYnJG=<9S19EYjMBaDw?QkW!m4ClC<un<+aTNZ
:m!qD@ c1S1==SL!>S+8tHjM4hNjhCZl84/Itdae:heN<qy?/#CAL:=FEpay>ZjD<?MGS&F&chwJbZcpC9qMdPb
l!Fcp< &SKy4G#EB?h*4FTR!&Cj^wJLnn&:tbtcwn\DLtY&@1SDE!bi#++/m5eGM*1apDJmLm&h:E6chPn4SAHb
\SJ:jD $D:+eXeXITuY#C\KmM9+XWQ=Beq@\bkd1/E?$Zyc<\y1HnIeBVJCPnX*$+>%K1&VZkl<IR^X!kI/@i%^
C=dcb9 aTy^^JXiD\p=h15iuH6?VmE<u/H&D$V$cTSYKM9k\/HPYD*m<It!pQ^TIYq5X^Y@Pe9tQ6KD1LY<YIQ4
B>nJNG tZe=Nc:dRl/1ekYdu>D&%\X#R=tbJ8EcY5%*I<EEheY/Ctml<#p6w5AtPcCV8D+=Ym6MkC%Fu*+8I+A\
nd1Dl4 6cQPdYc%DEYFII%jS>L1D5ac&\dpS#wVKkuDC:*>DJqun^?#=iP*m=kVPCYI*ZMwlBk<#dHRK@<BL\#Y
+M?^Zy PK\41lnwWi$Q5CWBp#*QAy1nJh^>w^I%R5Zm5hTW^i5R@ec/HlB/:d$mE<GNkm=ELbmJ$bMnFpCeX@^F
uMKC=^ \\ti4LCPBDKbN^:ZZ5Ymn%6R/4tcT@^a+PP\5#bV9C8N?<SMAAF4CuC4jL&\4%kp@alJy5N1BMdYiMiT
YlKK<E &F<y1t5nkX^:=n$=FJwNRAZuku+ip#W\YP+DD:EkYkb/Z5hS>CQn9uFVm55QcHQ??$uK^AKtV:5?EhMP
-Ae?F1 0006cff2d7b001202b4 Page 177 of binaries2.zip
l?5iY/ KjVTBnI?8MIWq*iNRTB8W&t&jw%5<FLLilqWW=MpVhJdHH4eyTw9T%Dn=lR?tcS>^HS4FZRh#yL$pRhA
CNIJZK 1S=$5>?+?#G/N?ybqqPL<&#JJMdSXm%!^J*VZ\8mTFPpI^ETY*6M1=#Lm8+A%C\Y?KnN@VW#%etwWbB&
DqSBC\ AbDjJ!^:$/!PD:?/F*/QSLcDL*@$jY6I@Mljl1=Kc\BLXmaw4\W5H9M>eItnw=iTeI8:6Aq6:1D<a=G%
JLqqd1 FH^>5KkDWq!kkmNlt6d$RbN\:<\IS9K$/#kubHN@aYdCluK&KmhiybT8nmw+5L^N8wXk96#aBe!QM:nC
jm<9*: uLCC+E58PAXY+S#eG\Qt!?aI&=RIJK?:81CMcD*+m#Ze:&p\dPeG!<#AIuHJNymTCEJ1@\VEKDWW48Q?
y?b<ei X4!n9SKKZAci6IP#wVqjSR+e#bJD^I*C5FDE1tZD1qR?d?*Y?CLpGbwmmpj6&:+%^$M/V<d:&MPFH@9X
*NctIq \$/%@Gpk@+c?SYSVtbl^8DViE:\^cL@JIL$C/Pyyi?ja$cRFG9ZEyt^q:qtqKGKe4%/yLKIduE@E\\&G
j$F*dy q5t6?tDjWyFiP+VlT$SenK1&PVyFIHH:Hp?8u1bCHRM9Fk5Zp/TRX@DmCu/JY4n+SDBpEwyLi>$F%eLe
c!!QVh RqeP=XARblBEmd*+YYum<jWd!J@8R%@%N5#jFj5G@<m1leb^>p+8Sh4!ey=$%%l\E%YN#jhpJR:*KK!!
jkGi@8 1%9A$&MJKWAFAFP#bJkd:*YpNiiZ*>56j$G*Lh+69^&ia8?H4WP\!my<!Hy*DVu\?j8mPI?h=dYDcIQl
BSP9!@ wDFm%5KVhE8S!e>?!XZJ^dMWPKP9%QDG*9Vb@9ID%ViWaqj:94*^iAKXZ#lR>9M/!cGkBFY*LJ*ye$b<
T9FEd^ ?n/Il$5KGY5mSl<EMal@NSMuu:k&F1iYh<kWNPijkeV%b6JH:NuiM/QXbwciSdkZMq/P6w8jm:/5:4&%
i&yNM& B=m*l\G!a<HF=h8iWdqhm&GS1I##1!l@IkPTyRVHGitX1jq:^mi<lkZ98$blTDiSFhwaKDINluC@FGD:
%mGjZH >I*C\$&=^=a<DW^5VnmLti/BF&l?/%8Nujy+dbZFPFB%K<p1Te&y=Bm5k4#bV/\e?jE4tG*\CP$=?&nS
MXTY@c NIKk9LB$5+pZDjWQ1kn+tyNRX4Ke+IA1u9\/nw@<=LLJZAGj1$b%WBCLWRR^J!S9G%Ejy*wi!Z6<6IMJ
BckAeF l$<?%!IYVEMbtlj:pLNk^wAL!+5iLFNNCAAC+WnNPRjYKR%niam6KR*@!H+JCZCpNA!GN<cF>S6B:l>C
6lp4hm #ItYNd\pAeVD?kpTZbVm%%dmZ>RT5DRTPLWT%HaRZHRV59!6IYeBkLcFQ:*%q8Vq4hQi&?q#AF4y&:lD
eh\\1l R1Wd@NwHww5ZIte++nwEI1WHw8p>E1hnpukapp5wEmAYMV4aY!AMTS$LGVwVCh4+Y&e8AuR?I1e:WuRW
9w/=5w \nwyeuRc+8qG$w6lpp5R5dIKGXCD<JKQFJ&BHClGCcS:M?NJXihNhiqQXthD1l^A\LKJjBqHA+!nnw>+
9AVQPW t\NGA@cPFqmA+=^AE?>L5*qG/>^IC!!u1V&tA#dVA$8RL:Yw/4LykWu$/IW$#9:$q+*$<VaM\Hc1LkBi
JdCmwW jCQ%=T!%<\%>HR@nVDEh?kcNe#c#<#B#ZTYlISnn=V!Nem6#*SWheQmN<nHVVD+L5JX5yy5Sja@b?a+F
dTj=4M :IZyTkk+M$unRpTd\EM$e\dci5i1ZA=E4/XS+RK11AH4C8uRh%lubaA55<BbG#bqG&C>H5l=m%*=lYPt
!TH:pi t%YFmRPpRMl!\%q9R?Pm\iBm\FcQ\yXkAc!*IJ56=FTSi*NX#XZZ#+ES^F%j!Rc1bpZ9B%&qpCmjES8>
\i8MYb +%Q?TXt:RuVbVP$<#ie$#b@R!*<bIcD!p%8=R&C&B!@BVbAXmp+wnVj?pG?Yu?kcR\A>kMt=R>mXS4mB
pi^Etb RjmcSaTXVeTXT/S&ABSuP#qNY$t=ACc1#t*m\>WDyN4hJ$NRlCE@SI651:1Ylb:Vhaa:FEjV4T:=HtFT
Wm<\cq B^$Hl&%5Dpi<4J+nCP8*kb:*=:/XZP#@DRqC@9He@a<d@iYR@c?u<@>l%$!8@=^4Jwkb?Di8tc?@@ahe
CZdT>5 M%@@@/>hM@@J:iB9HB4?^K8E/&@hI*@lt5uF>V6w>n@%KkE^M#Q@D94QjbBi$T!@kj:D4iQQ$eDjRZP\
=P+Mn8 @RIN?l$$G>e9$K!@k\d?16ZajkjN<18!&Z<H#e#?C#VHd/Bbj>ut9!N4RI=jQjj9!B1R>SjT\9I:5kd<
X8?T<d e/L?K@y*bI&F<^jT\9I:55dC@w5ia@phYj8Xk?M4@LiEnj$ZHe:!P<LG@8i?%/@w*^K&Z#d/:\kdC>i9
Vth=m: !8d<4Wbu@RYc/??yPjC*lI*#F&WDYj+8>J?:!@&:N@k>h#tY%*9<phMZ?Ly$54KB@6j8eu>hhQ/X8^#Z
^J?hX8 d:nLeaH?ld5e/><GF*/>:*@GZa:6H>*q@5ln>E@8e1?T@=>!q?NpjX&t@<uKKm1m?mhY%yiqq?<AbKHZ
WF>jlK Ty5BVQ$A4/?ZFaAIABd/n>j4P!\mLA\5InI<LC\<MmwTEnITEmwc+85:MmIcCnwGJka/Cm+8Qn+8Llpy
9Z/RFn KTpb%V?>Z4wACLCAI5A!GBky+KWQMQN/a^m\Q%/A9:+kwTDAweEAMLB\<AmwAHA\CAl\THBwGInZN*AZ
pu*j\A MHAINEkAFAp/m=ATNIaS1bM@JnA8F\c4Xym5Y*q/C+S6jE:8@QGCRwSXJV/9#5Tql$&WKmG@ul%H%hT%
\kc?6Q h&adqnIADl+ZL#BSVL!kRZ%YnS4@e8i1d&:*&5\6KKt\5Z>?:<deQVm=1Gqkaj<Hl+TG^d8RqPLt\eX9
HjG:ie Q#pqNT$>RqNLYwcYDt=y8KT$4D#D$pydl:<i*6F!T&6di+Yuq:YNLB@h9/\BIAHIL<5A&D<iTRCRwu&H
nGWVj< M=!Cnd&+tM=ZQ5/KN8pE1nw=\**u#9bhmk4RuN#J%E*5cbTKHNupHP5><NXk1*Q$BZCj6QEeY@me%6u4
N/nk:S I@kCKNX:AS#CG^^tQHL5w9#%Wm46+QBG!4J@E5tWwbVS#qE@K\NBmheF4*+GQ4:l^y&G95RLwB!4?BHt
J5qwS= ^@+LIMq6%@i?X68*!>ji+Z@*Jh?Z1R#jpdbLkTjNTwFNkYcP^@J15ljAjQn5M<TDI>8*8MekM%^QXq#C
C\eGXX &n\JVAc!Smk=LG6*ZJlHnn9jF+B!?\6kB4N#q8QY+jIF<F#+:kXRRPNd=HC?ET6\yPF:L=^!d</9?@lF
Q6<qYA WebV#+<k*4a\l<nhVtd$4YlDW%QY=GnV+1VHq<IK!\IZcbyhYGR9#1hMtmiWHN?=n>t8uVemHAjiEM<F
A?:^YQ tA?FL+A!9E/SA/Id+8I%ymjF<Z8!Q%wXm9@R>!ma$JJj@jJ61^*=/N/^yXuRtI8wcn4#PVuNn%Yp1\mj
qp6!+A /JwZRLLqC&CQ:L=/mYnX>$9u*I@Jq?qD>/EbV/>%X1^*6XG1HkpAmLjy!Xpp1l^PA%9k5YMRNIZWcmXC
%HW=SW iKkJ\9h4qY$!?=D%4eH4MqaFH<&VLN=>qPS9&w1pMGXmamh+T4y61wLnF5d>4uwZDj^J&#6Hy+Ju$*1G
Wm>lyY W1kXC6>nlEFV1Tb?c=GL&>D6u6JYkcNj*ne%lKi!Fd&MT@VVbE6iYZ!<**$D/9A/SY88tyVphDh+kZNQ
tkFbBd Sa$BL:Q6I!>ZJQ6+B496%:14q=un6Jw*P\We:CuwNbKKR&>FjtkptnKSLSjdS1/KqMmX4?u1HCeu@\D1
y&lLIm W1#C:lWbZ9SC$lGIX$KlJ5dYwPQQi#tETiTQa81u*=X1=k?VT*\5qQXZ9D?Jl&D1QkLw6D5@^dJkZ%+P
Sw1F8m a\+>Y&=dmKy9n!51W$aZhlmNSHcuFNJed?&uN*q=#PHLcjM$jjc^LAmEBZiELS<Q5W+8qD4&S*5:IEBH
>\TL!H WGPEuh#NKIPWV<1JiuYii^!!WhVki?jR@AKIm*l!J9I8qmuSa#*hd:GdpuGeEk+mD!PLT?&4^w\cEL<h
?C=GC$ bdEL\kS4hFTLKtDZ:nFwVtYwawle^Bm%Q?tNKSjChFK*$GiJVu1#Wk6t?m>9/lk##NLtp&\PTde8idAY
F#NpI> Zk<1lXuVJN#c8J*:>nJ:lG@ANM*6C\=&Z$FpmT:RbkDP4HDYtT=\C@$CTL@!idnLj\H+Ph^Xe@^Z@en$
wG9k+d e&Pe/BHCh>##bi=a+M9#1$S8En#dnD?e:ee<k*Z8j>:+D@@Y>/$bl?bR6\BDR95<uuSW/YVCpiQAn8hb
*&8P<k $:d#EM>*9&In6?H5#1n8hWCc9hcq*mh+6uM9iQR=L8Zbi9!iRQ=%YBA\*a5d*JXD/@RpZ+VtTi=EimiG
QT*jAD eXJZ/=Y=nBQ>$a##mZhFS$iV\?t8VRuDDqRIanip#qEmKNKqMF^Lm+*n^/X4L+Cl8>imIN&!YZZHGE:h
e>HKnj iA+ynD*!hGY$\bS>FkW=?tBTH*8unlc#4^PaHliDp??jY!=Wn>/b9kAGQAZ&K%Ce>yE<CaFH:+IEd\?h
!u!5a= GH5HV+&?SJRjK!?9KVAY8t=Pp?*^Bte*TJb@1NWnWy*j$K&N%qM?pq#jy&DBM/XXHewyB=<nVj5KMl<b
@&=WI: He>?YVl84VejV$4=a<VWY/T?AC=KJ%<Y+?+Gu^YniJ=$FP=Aed:$B/DX4@w&QZMGDQtXHbX^!5eMjaXK
PPF5F@ u9+QcFiIH>^QhRYttF#QGI+VGlh#Qey64+/%5%G^wilE/<PJ\jP>58H$K@Y@wnbPR?iTT5H4TGD%5jAc
QlH>M% T!=B!k\pBTbJEKbnSRhaE<F9QnBRWETYpa4ZT#qaYP8nF*caGh64J\#lGG4uNHwHM*utELB#cL#%C<LY
ATCC\n CXMmNTele\*CFJ>wSA?LF&yb?WCAHETbYu5RKDy^/KY5YNu*tT%&yqyiDFPq=n5#w8QK!q*YCP^Ie9DS
*lt4j+ PwhqN:!iH6d#6MpQ@+%P9+uYQ^:d<&Z1PP&%Ej:TBPdnYZ?$e:HA!*T<b??#+1i@NwIi#5T:hPkwq$K4
wCjW:a /jP5$>GPWV=9wKB$Z/aaC6yeb1R%h>Jnp%#S@cwh+Z$MQJVmh\F4+d!1D%\ajyX8Wea<q1jc>\:!1+PH
ia%L%V ^C:>mIKl6/@#M4jS>$@XS^F&FC&bM^JcCH=e!NVG<MX%F/\=@cePnZD&iSHH!p4l?S>Ew<HW?dyQ$AD*
PKZ?A4 #M9HGuN<Y1wVit@MFKNq1DHIB5cjG!u5#n5qP6/Qi@XI^bR!6@t@thlNeqP$&Tl!Z@%cX*hq<VwH@ppH
d:/laM #!dhJc@1*uHIS/d:jJ?LTR*lctlVt:PeKWEMFSMW\H=/4cE5XV6$a^jC?Wn9+AjR:QQ$Y!:mYhKha:*t
TWdMk% 4$1H^jeVTL=dNppkF*i1jJ?KbXMl6#YcdVDJ6tbqd9A9bZcji6q6K#=@jS&#j%L&jKyN?iTIq@FChu9n
LX<FZW +R5A%=tEuLi5nBd/&\wyh$G\lLEpK&9%n!*/iNyXWniL=XRd<+y+S$jX&#e^P@HHLWlBnbY=#^eJ^^m?
ew%lWD qR!\SPhknw$V<@$NDTmXXtLqa8%?5:Z<iVeVZ@?lY^j?4F5ZW&$1l9jpGBJXk^48ajIZmSe=*yGqCT6#
5+$IF# 9Gw98$$48<dHd9\RZ$mKD4i9XJymQ/1VDRj^ID&hL!1&AuZ^AEmk8MMHdDcqT\ket%JVE!ji#AY=%Wa\
b>/Ryp KY/5+tBcmS=4*!1tA6>BC:pZRG1L\P:&N>9^DDwt>qhh+e>can4JM&h&PN$DWalqGi^%btp>nNXmJL69
AuECN+ mGeyCZTKiY#XhMJ<ATm1:9wwelK!V%Zm9?FRuCeHpFI*K+9=WJF?qpPmdkH#tQmYLdHSFiMW4l8SRC>%
dQ%wue mIjNMy^llu!hR@=kuQ!VhA8QAy#hYb&djV<D*!k+WG1B>Zd%$ewN\L<#y$%+?4Zi#G^@<lemEu@Z%4qb
-A@Z#N 000937673c9001202b4 Page 178 of binaries2.zip
4%<1ap !dMN!/u6dLJ%<I*bKkIM>@uWyw@I=\ZAY^lYTE1PbWEm?JMQKLXQR#y#HcEHV51u8dn\ti:=$WudG#BL
XqAq%S 88ATAu?5AP/nceihqpPLY!uGlanpaF>>p>PkuEQ?wc$TE$%p^TZAXS^+*Pac/nP?C1>Vn/JpI@6h1>=E
uTp$\^ Nm+1wpTAJYM8=t:^DK>D<kZ\!iem?%YknKcd%CEjCD>@@eii6WkV?I6W^h=N?i>/e:+AEm^iAJR8KYiC
9d1!ha K=ue$=5iy9hda9aEPjbJF!8><E!t!XcFX5NYlFt!:>bd$KhFVj^P*t<hyje^M@TJK<1!we>GTVl6BV^Y
b:R:5! F:PtN\bPq=iJ9WPDnGhHy!pE6b41u?p6hE18cT&6>JmEP=RQZJbj:h*\bFTbW/?&W=WTT8QCN&wHGDw6
4KkFmy iA&tY4S1jujhedCjF6^YRanHG?M91:u^\Zh^i&M%GLhmVMEa@cqAb>T8TM!Z4@>:@SF$aD8SWQX*E<LE
4^VHjP N<8TeS\ZK!mjt\?5::ZZ>R>@VI?ab#GdBNJ!m>EN^BQ:mEiZwckE9\D!YVj8VAKi^cm8J%@F@H/?5LJ?
ed*5%c Te4PkhDltQNytSdnIW\B*#@R@h$:<@5%@8a*8?@ReLI\+T668%Yukt=D?n!tj&/5pKW:bQKPi>1bPQGu
Adt>?y aT1+%*wqN<SK+Zp!tJR:G\pi<:VhdNMMLed&:%^SbTDGm9HHYq@\%6M4%eTHC=nMPYMF1AK/Lw6dBu%D
&^@WCe Q*#F#*Ca%m>eK^N8bk$Z%<IN/+5Z9wuC^R=u#u>5m\h\pe=<9!FIa\1/cjEucdE<=ehY>$mEq=!uL+/4
RktR=X lG?YX1XbIY*V!Llyu?VT6?SRl/c#qLyiLt>BGZRcnL&qjY^X9MklR8*G<dG<wl*KG=ZTIp8?6NHWT^cY
@NeXQn %puSMnhVS1L6SLqTuC$bjKM#acCh:Fc#a>6$5L&&W:49W>BZZhTZ<uVce@=6HpwTEn*S^@A11m8bdidn
8M$R@i PII\4Bl6dy@nJK@<>^q\ZD^WLALWL=!$K&Q<S1&y4F+1V&yby$LM*EN<eBVS^KI#w9!5Wjkhw+18XPVe
!&i\eL 1n>V8N$c:kN6pFbD<V%mPiE*SmD>PDaCRGP?j!#?m/@Dbqttt5J1iqD/wwH!C#llRH@?CpXe$nepS#yN
$t=XWG cpF6%>K#1KbYL!?/^V9jIlIua/1\+8nM^PtRL?mF!l41K%/#KBZldbAAq1KdA&duJ?Y9EkWDW5eZWA>p
udPn&d BCdPp%YHa?S8I8@5?bnu>QaE4jt8G9dH+&S$ut^t+/:n*4?JtHTiyq&%Pmn<Wp8hYLa1dkwaIT46j\FI
@/:L<b iqdjuZWiWpt@Ln^cuj@1&<6Wb8Y*XMVc$ZePd8/pFQuSNyYe%McFZD/:+q+5b^<:bc\*dm\E4qN5ZkB1
6Geqtt IJ@p?e/nCh>D^5ZuM9MuluLj?e#Zja^i>bQ1?L&P?85?mi6XdYw*8C@N8G/1jkGw8:\AyN\:d%R+D8%$
a/qj\X um8?Qeij?l+XPe\5N#>yVV=SLL@8qtR*Cl5h:88#:&WcZ&8V>89mDKM+XJJ@9M@RmSB9TF<TH/5ph+dY
jI+SdC E1IXEhZ$teD:y\p%^hMj+W=CFnC:&XA>P6$D>/GVyX+u5iACPCiFX/4>\!nP$=dm+%aayC<N4q@c\kpJ
D5\LR? K>N=#eZh\=b?aR@BC$DtJJpk^muauiRJw$@^VXn9KJaWR%1+u%yL?966ddu1l/!G*XX%8ld+kLuuC/6Q
*4E?D/ AtQ+>wXqRqljQu&\=ZB!At4M5hRBL$K9%SpW\nQkb:&M1C@X</wt*:a#j&M1W=9j#W5auaYbq:@bPP>&
p$19^! j/9iYhimqc*PwZV9tC@CT9/w^C14bawiw8nNuuhb1F&eSC&FqMkhXStAbM/DZb><LYX9JpaSZdRIcE5#
/*cyGN iRG+DYk+VS>j\d$NepERlEqnMNiMSJ!+w8dNVX<Y*?c9YiF%^PL=!Sh6k+T<n&G=!G@ekGS4!Il8Yckq
b9/:yn LaE84YYi5GX88dK>?ml/+9I!A=SnWt!wiY?n=#YmE@y>y/W=T/hR$WVGe58Iiw@^qLc?=5BGL?^4ihGS
u&:EN\ ++caL*K#1dtYX6E*4!IcM9PppP<i/eCKZK9J9HA$YhP*im&cla$ba$$DyFu^5qVm#y>68=$4PZyPFm:S
MVn@Y# %ew%hnq/Q/G9<:GhFdVQu>wn#jjX>TGNeBRVTJEXGGWy%GEF#!$6P6PI?Fby?w//XV?Sm:\A&Qd9V$Mi
JI9aQY t:XjSW^W+E4jwY4yZ%:c?@YqZ/J&G1^!5nZu<iGW#VSQMV@LX#ZC*^DG^wY$:m5<Y48<#KahI/8M6Dtk
qZ@h5w I1TiCpNMba6cCNVN8*t@QbIiFwVdi&Nh*I9I!QbAN>Vd&EH%SuIJj%j>4uWX:+lPP=16J!N%YYjJuy^6
<?djtS >cP#AqdntLc%jAYm9W@Zk?B6J685!Z69?uH1hT&AGJ@pShiCj5G/Xb$bmaqMKEKqlIGTJj@Yy&^&Y@lq
1lQ\SR >/\V9XMTe^N%E@^+1i@8I$>+ST?AWWKmT^1BIwPDea=u#e*ZQb#WE?lq:5nku%iA<Z9R1:/S#Ct\1?\4
\PQ&&D 8=H9?w9j@<Z@Pj/D9@@=jjy#t=1dIZX/+1Aj>NPDKup>InX+B%<AWjK?L@My^?j*#$1#Cd:jV?ZZjF8H
y%YhI^ hLYhXbPFu$@D%uSYSCZKQuPFM#DnHFSZ$5eLh*tblP%JQ?F1q$K%q<LcW\8^Z5CRM=P4TbpymGNIm@JQ
Wl/NJd h&6w&B/^\/1mRcwXw#&PB?44cSHw%<cLnEl$BH$NWVnD8dY\c=?nQ$E$@1/EqlIdubN?RbmS\=y#$cim
J@BpXT QdPdqlP>y!$G&\iaK+k5CeSZuM>E18X<:M?Z#MydR\dV85N!I#TlJ=^Q>M/m:F^t5bl9PAm$I><T#YPQ
KuRFZE #t%G9:!iqG6%=H!Ipl/bIYH4/!a#9aFAXilY%hhB\eM=G!k1L?cXA1=TFhMaEZ\K\F\4HjuW@LwiH+dw
Lkb$&C #RRC=i$FJXM!A!JeEMb#T?X=9!\#H<a<5STqKcQwi6X^D?I:Yhe#8+P=d%k8QiG!TS4m8yK&l^P%:P&@
9:L^&j d59?w6n<hV*JPIy4!FK6kdiTbAk#Y9IT?SDAMY?dXQ^?MPq><wEAI4W>l*L5qXMpju=uVLB1IHqtRc6a
&RyB4k nGqeM+^Q/uFElI*tWGP$@\<eFG&M$^%@%!iSa*y+KWEwda6XQ*bimTc/h>+tDQTu**k6:NEulVX@&n%4
P*bjB: C5l?yQN?J/NJkT=1d#jCjQdRQ%Fc8d1!RtCiNZme^KkWnw&YJC>/Em$t$T#+jk4%uWB?Vn4ME^GtHFD+
+9hct\ w6bZYpFyL:JCup!q4pFT8#mHFWppXI\><NL=miCkVAS!dL!d:L4wXuKd\FW6Kc&5kbX9kQ9?VLd^T^^!
Jbb8K5 +lXj#5e%YW56d&+Z=bK!FatJDKVY>=55JX1/>/l/B^9\q?EWaEukeKLH1QK<um#NtNLjS<SH9*DL4HF9
PMCCSS WmR6JQjP?twb?WutB*Y>E#=EQSJYPt/W$H&bTy?Eny!YaD9NB<4a\ca5Jk&4b6uDW*>#D4ckcK6cJ+$M
SKi/%w Wb4idVZ:&A*dRGtccK9bhRwq$T6PwljPaKNZ\5:y/X$tb6l6AX:ESjp%iJSk+NQl<&Q%6H>q++d?+nGD
RqA?<S Gc<5%VW?69k?>ii9++K*\uPu>^hEF&RE9q4$bldKjJKhq8Aim!iQwV<&5P5Y+!>QV:>W$m6Xq/l9#h*d
d^4t$> qmyE/eVkP/#i8qYN6X<^FIAppG48l>Q!NQiWShtTCtP&E?tw6/ehNqb5Mh$!tEw#?l&FC=!q$Im=/V>L
RcyZH8 :6NcCT+S!T&T#%Fh9^&\MhHATpT4w?XktINZP%!5=L5>hN8LRqeLp\YTYC+NZ+Be1DFy!XV6SkiT6uHD
#yZ+*W nb$<$?j*kmkm?^I8hpkMLdYJKn+Ib$GC:Z^l!4iJP?c9LpcLFK>6IW>RwtK/FH#K/w8bD@:4=Dn>8tZe
*8=LkV P9&eZhRGdy$eQue5ku!4p!Nm=qJ\%HVbT^?=EKpy?LtR%nVtweccL9ti:!#F>YGuCK?+XcbeQe6nG@1T
T#Aw?q AM=p@=H5=Gk@Tqde!YRjq&&cuD5\@?liF%%=qYFHMl=?nNVi\QJSakZSFhimwcN^!umiFGmquhBjIu:a
4/?!L> 6!deR?bRF\^b*Fikad+B&<BX$deA8^lq^hB8Qa?GHbKSpiTS:^uw$K<V9R5SwH?=<Ib>@:9tcTYd#8mV
>68#1R ^LZcnNyyZ8bK:+X*4A<FI6blLX6^IM?wA5pC/*^teK4i!mYbp+Gcni\yj8ZcW+:j$w1*cV8\#cG=^!Qh
wa$#GG V@C&M#%k%Wm5j@@L%Em6btZj1eMInVby<eM\X#=>Ybq%iDaK:h\%tTNNhCQ4PZ%!dGN6GwTLwlab8HIj
Z8lXdZ @Ipa1niQTZHC&CkIq#S5C@tcCNd+w^k<qE=y=GK#4/%4uYjA<RW=e>>CKdu\%5dYLj##ST=Q9BBqI$Rn
@^$AaP #$/8A:P*?eEpIZ@M&biKEVFJ#G8S^$u/q=qQ<89Ydm=anb$X=Vn=bBiF$nSyNpQbb%b!dVR@?n&6t:G9
i@pi69 l1E1bN#j58Cq<&NyZ?%/?6Lpi:<AGqPe*j44Gq6$JCuu8M:Ve%lW4RS9jWmcph8j<N#jya<qmNcLikMn
C/6c8j NS9McME!66piGM+HPH@8K6nF!eRAeVESLBe8Jie#L@Je\Lk?1Q$p<ZSw51K<+9N&C<WM*>:#^pIa*uyA
Xlm?bL ^Rh=QP1JL^YI/LA*W@/a&WljcR*u:HKeBZ@ESGw1nwtbSG>9ZVCPN&>1SNKcJ9YXLyL5RF@hJdd%X5S^
pd=Jq9 BL\bQAq9ThG*5X#8Sm8<wWI/SmdQ1:>uEFFwAN^L<5B98n!V^Npu4klTFBl9^Fi@SRjhl&6Z@lBW*9pt
PeelI> Q$lE5ym<V8LkAN9y5Y6FEL1JS!+cmpQk/*4cQJGc\bR/e+uHWJp4Kj9BQ4+p6?AG$\ZK<$*C?h=G6PSj
e^t6YK b>nbnCM96@ZTQV9?=YG%I6VqFuXmiNmRtEt!=GjhK:QYA5X:NWnueDhqGG%XAhp*$Q::dG>#wZtmB55T
<hPJ&? AIMd<a&PWJQJ9I6pW9RP^PtKpQES/cDba4KJauk:*yS9PkTF4a&S+w@?nQWD8KmihAGnJb\XQ9JZ8StS
p\nZl\ bjmA5RN<W#MXpn$TyXF:CbhkDE?iMRZ<Z5EL5SHJ:S8epJJNPtdIE$uMunYBwYjL^9tGl*44ME\PS^uH
b%h$8G =\4#8IL\TcGS+m&<&S6aNnn>?SMK#TecL6tKPR%l&G$JtP161=/p!?>Fw^k!qdy\cAy5/5cj$>F\>C$%
=#NuCQ /V+Ih=^LVb%F6ZZjc?@Eyp9J6q@TH9idQPllqQRNlJTqbYuM:$IpF4Ey4q4SWm&4WIuG5mmmmEl9jt%a
Na*Tq+ cVX9!VVk6YP4dSbX:PHeFjl?w?<6ajieCj=Fj\/n1J+LEd/bWeK+JMqkHb==Y?:h<i6?@aBK=M6>S/cI
@TQ^h5 i9b<I$b\+8LQAWW%^F\>t<PFjN>&^lZ^PiLI98ZEiDSiF@I19hR!qHCP6<Zm@AR1ni>Gc/i4V?%JYqJW
k*Rb\j +6YmNFtS^yP?^mqZ/I6Z+5pklil&kKVuV6@mXVXm<FV+bE/nupV><GHdjiDw*byhL<n=$P!Ij>=jJwj/
+<D6c5 &ZlQ5Yb:dGlMQS=yTN98iYuahjT4uW@%9hB$+KW$ybnle&LtISy@5i1*</\MqBDcZ8u&iqQQS4!1NI\b
GR!<BL WwWc>cT>kiKh9Rh>AmNZL+uWREt##5w?y^:@bHhA/1/+n=6jPdccAA:!NjFN@>c$t+P!iM9eWpnmGB?I
&R?NtG 8JlJLNIRn^wVh+u/BCYchqu5\jJmKWye>R8a!H1\<YCJd/Q&!eAunmLC9j%JqljAnp4&!*#/X@=m/G#V
p*k\wj n@jKii8M4MG4W%D\MH$=Q@1@%Ji?1wG&G=iWK<>Yw@eV4><a/u&HMl#8m8tP8dMjt<bjAKS&uj8bG%y#
-AM!tD 0003f9ea0f1001202b4 Page 179 of binaries2.zip
iQE@Vi L+C>Jwe:DL5ZAP9?@WV^Q@?V/bm:?J@@YX%^=H8=\9Ea%9RCTHj^6qB=%i??h8:KNV@Py1+h\ecR6\ZY
emm/\i Fqn4yZdd8?6*t5H%:F&ybR##P6$FyDXJ^B9ZmAy1nkduwmp%S*$bh*49:et+Gd/@wk5Wah&j+WAXE&GG
&iTR!P cnuDZwEQtCXATVZJ84Yc64G%q@Mwu5<Hc$uDVHJBRieT*ct&Fj1\an:FN4SINKQ=bP=RSu^Lk\ChG>\i
EZ^$C^ EVy$WiZ:5yAT\#\\ycjup&EEqdml%yyWtR?j+JWXW1!C9C5Raw\m#BK%d+uNquK>$tC9TWhSae8QF=V:
b1A@ID \J#8e@N^J??KWEY9I>F4Nt*HQT^^iRCG@PaPYS#j:5cKw>wlGdb8*y/N\KBK<!liD6a\MMJD<cP1JH5<
TV+^cy &%M!d9PCt<KhZec#/I49PJjB9>PcHA68A9@$^*@XQ?M*u^Tihe^j>ZV&nT6=l%?*e#KnG%D\@n19AD:X
ucSEcy 49$FWD6Bh\Q=@Lyly5tid$QPHy?6*5y?Ya#X5jF11Y6A&e8aqTTDH*W!EcbbjB??uX*MJuCj#QRCPKV5
&?MbTb jS+B?YT?%9SI5@N%<=&B<pA>j8@!Yp/y<R9kPh=Y+CTj+*Be+dp\+kX\L%Z#A1mL*Qm:$AmqN8?I<5@+
>ID5\w P@e!#p1>>R$1F:bHH:IEQn@k<Lb=PAVF&cS#qGXqJ$$K4HpbHPK:$TkhPL+AyA5Fp4P8#<K58hhnq+Zl
aZ%w+8 H85h$?&MN?&1/F6iAI:4KV<=!GiuK@q1iP<uRu$1#C:ZdtMYVc##6nhmTw<EmB6cDmiVGY\1D+\K&b?%
H9e@\Q W16b#nMmGHqLdZ1u>%^tH/J=&R>qZ/a$46jVd6:H*C*ah/BW6Z/t*J:I%4:bL<q1Fnld@?By><Q1kVPy
y>#9:y 1Dp9Atl+Ph?4>cRqA6NT6*Znk@y>6Wy<%b6j:Y#Sc*Qq$#9=?:q5*e6&d=6FBbZ=q6uY?$iD&Y1/55Wa
u8ybZ$ dt@?Y#K^SaGywmiW9anJM4^l=^S5ZhHQPKdjZH=+#GT/h:<A@l6:bcQwSn4e$@!=EjMFIFX#4Ni=5<M%
?pN8!t !Qp1dRb*$9\hQ$^iAP>>n^cj#u=tZ#n<NNm#iQu/J</dj@Xa@DjWNCAHCQk@&VS?M=6G=H<8t+c#/B+$
jhqPJw Dab=auAy5!$ltjG@T1SBe&^Cl5pRk+5=HH=P^u!DLKI=<+VW!*Q*JkmmSbtAFYZ1kFWI5b^^5yP?h*5C
S8ARiI lARlPmaFwTqI^%eh/ZwdFXB?#S=bmcE+D!ancL%hPhVnjDR?B4FcZ4SXa=+ALaWyi<RqF+F:N1D$9k/Z
%TR*+l q/Yipqa1y5cGn1>mTwm8upS\bHRaAqibEA1mEH>KMDF$hYLcCIw!J\mmh$WYGVNHpS&KKSId8!H8ab6D
pp!Imy GhN^t1qiGeR<Gak=!#!8$8BKm1p<%+imN/Ptmw$::ZbDynRMbmL?6GSm5$K8TTJ+4DC6P1=n^D?yyn?n
NBQN^@ eua:VQLq^>TcnR!aYD$L@%#@1IM!l<n=jd96mwne1D48CYd>Vd</>%4wjIK!iqQB^BEI#hCaeN\+J@SM
*iR*NM MSFSTYm1t4lZaSl^b?^yPLqjVR?cKiLPhjE4J9hVk=dtJuBt4QiF1Q+eab6*>$^^!&T*IZaM&QX#cDSc
+eV/Ku M<dtSc4##w+b%VRtYwT<@44^TuV4S?H5y>FtN^%bM>dpkl8d%mEq*^H6iTq%$BWG&<iDLit5y?MH%4k<
\njF=p t#dCGAen@JWjLBcwBXP$WJwFMum%pYQYq#wi%Bd%4Mq4*yyBVKwB?9MN8tu>pb>Xj64XS#=J>H?LWi>Q
1*XKja LYkSEFL@\88l!B^F>p:<^+ZVw?iebeWk#ph*MHEh<:yVTw+bF\IZN4wGj@euBLt\WP6ab6S9Kc?1DeCc
?1Q&F^ wAw5WQ^\?$IFCRhM9yiRaH9&yi8C>!P?PuN$*K*&=E4p:cSMy\uCZaB*C<?PupcTdS#%DFNFVlLm9RC4
4%>JSF @#kDnKt4^d^JqNStLyDZShhbJn>a*8#\EEInC\q=t?y>%*l*CSt?!S\#NZ!+t&I\?<h>I8FKq!:@P=1d
<\h8m> %D1F&*iRMH6bcTb5TPlyKW4tkdMRbM?\^MAKcHE4D?4GmpQXDAR=En!&*MDqK+^ASd+?H&R?WptE9LL*
Z@/#B# +tHZyb\1d!QZL><+H1^ijndWqqTMhWXpkJ\MpVSjt!!LEKB*1!munF?JCT9TR5FLTl:$kpe*KpA5Z:wn
PhttTT D>$lESJ=/$:d^QN^Eh51chMXcc6DuiY<:?Pm>KCXWTAu<HaS@6MMqMe$hSH#*IpWkktG<V+du#kEL8L5
Xm>9VM HAt$Wty51X@\i%Z6CmuaJ?uGyQ8XH6eYu&E58THS#A4E=htW?KCdhQXXm^$RWe#anYn9HkZmbGpBQLVV
!#Q:9& EHqkqeZMqId&IRW=VCu@wZIBW%C<K*DmHR:H=CwMFL!*apnc:l86:ik5JKub<49kkpZy%jVym&pwc8!T
SAt4@? ihhXI$uXSe\ec&RMHTSwYd:RpYIEGQ$n=pCaPI1!^a@QG9BTB5!6@TGmKKKLLt@6/PSTb>SZ<?cPwFEa
NGnp6! y%Dy1MmLytBBt9CNEA#Ym9e$>h414l/a$6^+NCZicMut*InT!hSP!Kh+JtmS\\GeL\#Ij6VJ*=bik46t
e%#45V D6GHmFQbuAIKk8RIXNjE=hCV6V+%uKwW/tCX$V^FDkm:tk*DbeQdh5!A&AF?ND9ib9Cq^WQ5$+1J@h=8
8ijpLy qql!\CdL%iKMh=C\l?VE&P6:iD115ZJlic^lwX>%ME\6tyVWFu@MR?C#MyjWeC5uiewHW>h?FWFGE^4F
tR4>j? GLw<:mE9q>>Vy\u$NVb=:BRYCy=tu#KNy<lZ=^NT1mkaWq?JWVN^Li6wHL!lHK+KKFjb>++BGla:hA6/
Ht#pF= ^d+#@%/R6EKJPFPlX?a/\*<nnB5*E/E/8w@NT/#ER@+AVGSR^\dPT8dQY^Y$n1iJ%at<8E?8dcye$C/1
%jmZhG ^98yHYTkXpEBY\jaT4AkqD?\w:qlR+l$/iEtaBwD&:/TlA1nBWlcbGQAKdWSP+B*Y$NB1>eebcC:lk4X
:S9+pi $jc^TR=MB^1?I+FqlMSDjBdNt\wcNdJQNw*FS&64Rcm#bFbR:^9aBuYE^SCL1%/HmZ&=am:CRJjW9M/d
tVt/EI BLylI$$&VIh5eRJ:1Y+@!NbHnF>T6H<yEkADA&lMDD:!TTPW^CD8I=IS4?L!\%PIMZ>T?SAZ!\n8q+t4
WpnE<J aWyu+9d5Y6=H?eXA1YC!LQ/+$R!u$Ayh5m&cWd1PI9blj6P+?9DDbIljC:\#A/KeA5Z*LJM/:#FwK*K@
hVl8!e %eE>aRhX@S>!bZ+=BDLCJjDk>AkF+YbTcjj!\+t#D6dBN8cH^&RCBV&y@tWZkNJ\p@4JNXCD/\WL9q!Z
%!RK+l Wluq@QkMM!bV\P:kwSwyu&!VBYnJd!ZtmTY?8N!=c:\MAeV!pF>L&uuTKNb6Vi!/*J=6&Y4GZuA+i+GW
dK&J^a &?q#$p:RGPC#qt8XD#&N?Lc*Jyuu@cVY?jEHQ$@$Dtw%TmP^5l@1l$RNN#dWS+qMMNJLTjPD6b/?N8qm
B&Q6mA *6IEPAI!k>hQ<c%BI\yS5EyG\*W8XWuPFiCm?!F>ZHV#GMSF&Ahyd\R!C!KELdT\C/wSLK@^dkqGGjSI
K%t5&c F6m1a\LM+BKZe4j/R1^Ci\nTBC4wA^Nk?y8$EPVZ5NRT%GTZuwLNQYhMCh=YD*nVFccRN6IkTH@bLHkJ
J%\nkQ J5Am:tW45GRMM%1cb%qZJ+19Z*k:1XuNY%A5p*hDnciiXW=p&TdHX9*Mq1\yjtcFd^h**B%<T%9+kp=P
:&Yt!i XX!9awB9/TNT*Wyj5jVP?%cjYBC9GtDY*D1h6b1%aN^!m6a+YLSp>1E!ln14q^F:>*c?paZCXKjRuKyp
8TXmmC Xw+SyyE?MhQ?1JlFyHD6me>$RX&i+hwJwccAX9/!KqR/+pNJIK\iDi!<6LyNXB/j+HyRj%iN&a^k1A?!
iRJE+l GcWW!yRYnXj/FL/A=jW5jBkEM#WWKmaWWy@APR@+N>e/?#L@kqn9jZ+lC^#IGuth@qpw\j%KaiQeCh:E
Tl<+WN !bby5kdnwS:SEtHaAP=DT9%8lJF8&ccP+i*uMhSdi9Ba?PjQ%5I#MLSh$WNP61kc@eJj/ABKw/GNXJw?
^YaI9I KEX65bL*D8n9/Lw/l#NBCM@Ti>l1FL4Ya6mIlRYG\:Bbp!jIPaLtXB>A=cRceaCdWQ%Q=jnHKM>/XL8*
NeTS&6 FeVVmP/P=iaB9c6L=pPCJw^<p8kuAZN/Re\=eN8IR=w1i<^F>y?9Ge+@D?qQ=yl/MJQ!CjalX8aF$%Za
Gj$w/J D!SDB/</tiBDwkwA<1W\VN&\$iTkS/Pk:ClX+GcWln=Al*Sn>MiDJNduSFak+$K\udLiKd1CmYlTpm/<
*aq+Zi n>Nt!lF5PR$jWi4lG<8SF:V%6EDp/FtqBGDttdI#B6c?Ej=GeJJDd4IyF95581pQS:\MddwA/:hPL+#/
*l*BSb y^Eb@p4i?V?R6jLQ8Eq5^H>%lj+QeyNiWj>bdlI4^>>!p%nb@&QeJNb@+Cc>jkD>G=IT/=>q6u!6:h@+
Vq<@>& <9@%Cj+XC+H4X>:+ZL?Bb8Z<BYpF^Q\:cNbjiPPDYH+DDjyq&eDjRVN#@kIN?49R4L?Bb9pXC\HE>l9w
KWk&8e Z=NYRP!@$?l59?D/kDl?A<*B@K6G@^%lA:H<k85D?n%l?\ZHmbZ=:$L@L@QSkpCkQ^uWIDcY9^uWIDdt
y&CdC\ *<^H?*yL4n<h6c^@^pV=c!%@%SP@^$RB9R=yFk=Ya6dZ/4B\59<PE?ZjyLj>^<4<8+*:i=WBM4MS5:?P
F44XPm j!A4=%?CYQ>Pbj=NA6N@15i@R+9==<DSj/HFeID?lBd#L@Qw@na6l8N@K!&Gm\ZI@D?$tQ?l^j^jTa6B
!V^Q@X <KY+k?&FZFnG16k?FPu86<TVSMV9JI6<AWDe1V\Z/nle*aN<@S>LZ?>i&Z#*lNjb>c#/&wd1K+@QpS8d
6C=L@> 94T?e?X&#::mVDc:CtT4=Sk=&9u=V1+$&pSbn6uVC$TZ+$TQBd=1D^AQMV<Z::P?@k<F=u<dBTctN81W
RK4<We >RtcJ+tFFZ8/wL6yi^ThB8tTDPt=\?L=BSD#DG6pYpab&#wZB$NFuSibk?:^5jJH>M*GCtdEhQm84EP?
XqeHm! ^!lQHd4:*k@lS\t#=^cB+\Zj5>5Z\Ga\TXH5yP6^Y$NB/apR&!TZ:^>uc@>@\Y\b?P^AilE4i4\=HT?A
C=wW=! $@henQP\9@E5?kIa9@9!==?@@w9Q6=?qD15BcK18cKYK@PGbX^#QdF#@\&V=9+jJW846*5R?:n\$A$Yh
Y!iQ4R m%yC*l+/eAtpZt9QyK!@Tp=\k%^Whtq5C8#C6$K$L%khY/kN:!b9iN1i8m#p98=dtZ^YFT\<P<BV/tcS
^%elmX pRiTnmV^5yi%>DJInPGdy/BWP6HaK:LN!iAuA<YnMH*BH6ma8MG?*QRM<V:66TcqT/&9lwTBD^Pw*y<*
qVA$\* nyq/GjZDm&>I*1t/l?*dMa&l/^cqVyK8$AQ^6PDyGH41TiSXHd+T#!H?9$t+iTN^=ABw@6\1a$SGJ#=^
Ii$pZm pe6AAAiD^1dY4NiQnNXjjPjG^MlW%QF^&!aZy9JI^l+4@i8Vyt/BMB6n%HV$A!IG=q9NICQN<jAKLNRa
X!p/P/ bXymcqITH+a9aLL1+qQtdVJjLS4il$:%^dNP^/PFtl5$T1QuQEH$M8^P/bbcXeSkDQqeMu/Y>S%@LEw6
Jw*1WZ $#>pTVb6c%T*h1cnF$!*ySM@#Z/bPjI6cNm+5&6/AeSN9\=&4W+y1<:LFd5ZAFu?Z$l8<dP?i$$4#^K9
IeiiJT m#1d?SQFH&/uh5&Q$VF@eN=p@uD?ZHG+i$Q$PJ>^ub#^AtBw&4npF4k4=#lp+HnY5i9ehjY>Wuia$Zb+
Q=R4MH dF4^HVy+Ai^ZdQ^u!?5*ctq8kX\bJ?!Y\?$:&u#d\A6Z=QpK\5@<Q$=cKmK/p&Th9GH$*ccJ#*\X#MtZ
-AZDb& 000ee8b6418001202b4 Page 180 of binaries2.zip
VN?FIV 8dP:j^LVwhQFS:h1kjtIb%KZj*Ae?m<kMw&nQBdkY>!uCF^kD59@Mc&>LQ!:Xj19JVhy#%Z6#VLc5bq1
9ZEj\m /nGM>k&#S8GRCiBPpWVVlNu41ETV?4KRwiNKY/*ujFQDD$l+1CKXV@c6$+R+C&@Pj8Q6w/mJWub9wQpC
Vk$ut& WEna9Bty$P&eikHa%lSSwi#n4$4YhL@NJw?tLYt?SJiw9JH:+>4GB5\p4eCa=q+ecSn46*n^MDV^uN*p
&JXFZh #KBRqG8BbewAJBYD^VemXTq&InQN<cWQ/YPE4=NMhnHd^u*n<16Tcb9>R!4ni9>X9%S9N:mZT*kiB9qp
naS:pX L9wiLh1<AKV1jL>TP5!tu#%yu@wi5m5<pI@j8:#1&PX/%W?W\!<A$:SPib9PG=9GX&*$1<BJA5jl?L9u
l+JyaH T9jP/\!1y*n#J//1X@Y&c9E=+ZWc1=Qh?E<Y&Wecj:t>@d=>!cVb$\M1tpddTFSd6X+Cb$*&!8CQyjm@
XwP*F& t!6&$6#E9l\wwNG8jBE5BaN6culS+&4tMXJDE8VPmZiNlK!h=uy5aa/ML^GGL*JWImWXG&*ckttmuZWd
\Nmn6W %JuCY+M6tVhdTWp418Imt6c6GIt&LG>Zw<yK%dX>caqQH6iLajZnKBdITl6Z=5k!SKZ+Gj#$CFu%REG*
:wbujY yIEBip4<+9BHdTw<:m/L^LC5L/IyF%db<*DXpuFwZIupHG%$iJ/jN+VA1=+LqEQp=dQCFqAKhLw!@J^=
4n=mN! 4Xc6@IEFwXK/b$R#y/%F5mmVJblTACP\GFk?h%FT^ZHhqQ&1blK=?My8FDc<AH:iQtVet#<^FL<APkhZ
j?%=GR N&a=D8$Euy:=>%<*ZVJYL+C#m=<e%?Q*Pkw9AN?a%5+@TC!?D+@i+$<ku?VbX?He?i=\tQFu6#V?<XQ>
Xwl4Tl y%DWb@<ijDd8APu9!J:F@#Cb@djS/+/!LFpWHKA@Vi#bt<W^Mn\ZI!aM/%lw&R#R5uF4jKDmFw?@+y64
p+KR^t e&@+Cd\C!h^\DdLHM+t6lQhlTYG^KZJ\Im9RHVkAS%mj:CR+C>KkMneFewpKWY>J6bZ>$6&Kk=ETJGjM
VPJk$J LCqT=Bi!dD#IG1QN/:NVmnHCeGJSL$#P@bY=9VtVumPK%!&H<!mTG>?$!XF$Mbt=kJ#n8a^Z=lTYdn!L
!qbTu< A<1cH8c=QuVp%$phYC&Q8dRtBa=dPP?!n5SJ#t*T1eq@K/WTiJtLFew>QHSP+YD*t8<P%:SutF1cKI8B
d&Q5R> TE5<jTPuthAbXpkZ9bD*yY*88pNGadbc+iCtVV*<QWH1HWF<eE+@BFJL%6JbqYjIe<X4#<*\uV*F:>>@
S+Vt4^ T?$<Glh+Iq6@AZ^qhKn!nQnZF**@9a9@G9tj9C&ly@YSXeHu+E95yuaXkkdp?AFlblL6lEEMi/HVVI!@
5<eGSL mM#@eayn*i6!VGPi<AJk@8q:SWiJ>:4RbQ@4BijDC?A!^h4kC8=%TKBu<P:<A>9n9=n#Xnu+J>Ye?q>Z
4lGCK= <:?WHecp$=I6<:q&aT64Ge%i?&9WStqZSyHp4EjdB=HTFjDl8+CTjli&@QFm?mpe>NL\T#@^4QJtS6b6
?V6J!: DB<>@phwAhd9kjH>4E&wu=*FeNFFQDX8yp&nE1pyR=L+chHp#p&#W:pnqd5^FI1^Y+Mae*c\htDC^VYu
^uIGtI p=Ip!i9>ld+k#Z=a4D+/4^#I9Di>aHFD#65FtBA#Y<?EdL>^jHiw\PqL?c4DWd\A1u^jFWPDR6/6^*TH
4p?%lm ^=Vu%p=y#>+:%w$:ymeZu<T4pM6Zqe*kj9?J=l9K:1#9d8jN?L*KBNH\1/+&P@nuu+h>n#P8m#MFEq+%
q&Q*98 lQkZ\CLH9!#MaTdL<XtP+%utBcC:<ViF*u5<6:!h&FD%Xn=VuejjtG8J^qXmcL$AJ>$9u49+q8Z?D#8E
+6bJ6u @$cCq5@*maXuw9J%$Zyl/YaaLMLET=W4TLQCV*tpA:HmJhqG\6VkAeE>&TM$ph^8Ad#PBJ16Qb/m1>lq
F/JP#A HwpqK*h!LEJY%nl?H=pdm6<mTEMM\c9$Ld/6FR*EFFPtE\aRYe=@8Xwp!9+FZj/@tEyqMT>jWk5#$%Nj
ulAHn* N1KquWR89y+KF9K8&CqwFwYN+uMhZb?yKBM?5dJYN%E:aZKtB<dbtN6PE/NAH*IKGD:#MY<iNK>H/lQd
46dnt< >V*NpkC^4@YZyeDBeX>MJX\b+GB*6$Fk1EKJh9tD<pp:WV6pH&@ZiuYJMeSWw4n:/:I==+S&?MPdu*QF
iSHyET :Iy1$amDAc\iVQS%D>BejAF<=PQ/5TL\5uD\+\XR*IhBMXp\t?F!MFVklENapGM$iHJB<=Pw<FZ>\Rl:
b\EGIJ K*GN#?SZ\AbY<wbQWChGPdM$^8&Kct:c^BL1Y<u1Wuw^@L#CX!Jm:ypp6mw/e:c8T&@du8GH8LeQ5!Fu
KVnd5+ MV$hu6e>=%>54wW5SJ^RTPh&88@A8:#n6PGSN*AcuZjjP6!<!jeRHmbN^d!k\*iKT#P:6Z=H#a?^8IIh
Wqp51: >Huwpqa/DJ<EZL\5!!TR55#nBeDqa\C:WuR>?KyIln+yJ\j#$=5djw5CRQFlaYuQXZw6dqhdI=yRyah4
W\XywL q*mImB5eS^j+ZEni<nEQu>j<ZBu5jYQHqJ1%P$\1dJe5waL4NBw?VA19JQ@w$jS6^i=<yN6B4M+u%w!D
?&#ip6 =\yPPH@duyXE++iXLqdGQ:L9@n@AGY59?d11V&<F?j!^%QmpehiVJ5KaF&5y=4LW9@Jcm/EKja9J%F\>
FReEee 5I/#LCteK4CR!^cqSGhy6kw/a^Scm#!PcT?RN$EcuSp<kIXlNT5#Sq4DAZHt#6u+nJZni#&Zhn9ED*WV
45^yLN J1Kk+FZNPb@bD@1el+@6>EeqdulJJpDeIakpeu6Z<?1VT#J4u<uL:ble?RYubTSl:aLIjZPIBHBQKF=+
&q9V&8 l=4T5<=w*=iyA^nBV^SYPb*^%RIXw^TcYEDSecKiEa@#!E48N=>bNB85EqT=E@THePde:<6m%841Lkn9
!%RqjZ NLdjptdaliqa9uN9t4S5u1RFCT84W=kyJnSeQk4u^BPF4u#VFZqpeePZuD11^%6uW*$HwK$nD!$Wh1K:
HYq:WL +D#\ku@H!Y@H8G*#qjK?P^1QIZ$>VFE6XTW?i8/I+==uW?yDM?8XDNpSeKC!&%m!DL!5?&B^t$H<t*4J
4y8S:% cdNLhLbkY:^PS5pNNA:G\EWJ4ViF8V^lV*uAH:cH6h4DZF%!BbSDGn%ViL\$CbIi<Xk58wFIpcqtbS>/
X95!ey 6+EwJ^e*95uF6?mZbH*lM4TB5J\#=jXJFIP?Ih:NEw@MWPZclhjDI!=eTV=jK&^\h*$#NmGd^?^$<awP
F6I$\W E#VZ>FcquC%\lAkm\Dp=kcCLendWK$IJB+^k4j1^:D<&uj@9M<P+C<ijYmKP5Qih?!M#lhMB6DB>w#?m
bZm^mG ISw!^9^G5W:ReFnG#1Zi<QFdp/CS9hWNwdT+l%dL8cI*M&=lpTJ$J4/J+9y5XLI:NXQIednI8P+AbE*J
b<ajP% <#CBniN5QPBT/Jii*X/nqaTe6Y>jJLJ^1w:I\ppiMnJ>y+Kuq&dX\$:ScbQ!mCyRL^K6=ZdkJ:WX4j=A
@H5=JL 1ip#LqQe*^>1:WVQd@K/<<q/5lpdN*w9MK>EBaj^Xi\<lV^<LDK#XNHhIPKDt8pXhhTudd?ccEE!GBet
LF>&JW dJcc&>LBYIVY\!?/m>yH\*ca:6%lpn/%^AlhQBZ4nZBPQ@A\#kd1:<Lq?NXFSV>Z6k9t?SHX#Ad9889u
S:l1Wn D%d!tAp@Y>/wKtC?#T:lTmI:<Wy<%Sa+H6wZMiw!^k/Iw:>D^R+mtt>>AW#5K%hkB8<MmVd!qVqNDi>*
VSWibm 11P^58?DcCM?+miG6u>W1i:DlBDb&hHq^\KAY$8w:Q^q^h5Z?A5H?@>!NlcB#WylFAMX>md&DTE&+88<
IJluMe b!<\Rqn#A1BGTWX!KNBjYTX@ASRW^EIHjucGMcWlXMAwkbcLTQqtkE1um<CjXCX:mXJ%EbF+CwQ*Te6d
/B+V^m an>y=?&Y^6c&nh!R9b>S@4G!hQ^pKXdbWF%bjd1#iDR@L/K$^^\LL<=&hTPWTPHGwB$>k<<qd@#AMSpP
%JKRt! jY$?DVY5pd#R8:6Q>$4^qmt&ht@aeLR1<%l+C%mA/CJ1L\AQ>yLD&>5Z\M6e>tn8Wd\<49Wq8dkWycP@
:HAcp> j*tDtaq&P#I<Y8tYRSd4AZjGWFCnFVbuCJdwnaCuG8C?MdF=?h#?BWB4>hn=*yPw$M%uG&TF%b/Zatkt
=lI+^A Mq#Eb4ciw*l#$a*nSj=V!m9dIAqyLuaab=pWSc\98^%5$b&5im6MJGi>u*dI#YwZZHBQ<<8t%BHY<&Wm
Sn!&F= *ju%kJaqh%L5S>b=9L!taM=<SMJk5<Tl@1uS&TBWl%qGI1aNMZyG6+kR#WI6Qh^chMD*jjd!:MBkmIQ8
BydwpJ W/9*>$JW$b5Ic61+t8*w\uWBe<lFSS%P5K#qB=XQqJ*9+6LSJ&SP!NR$+GWTL8JW@AX/W@a&p?Y$%bPJ
YpPyBQ XLHBBmqTAl!j:#>db@F^w+w=TVZIKX51L%+*SKBZNKcJ$P>?Dn%WS%i<WB!h:bVFKX+!$Nahy?k@dA&c
?6HJKy F4Z5>qjHRu#unptLe%m/kun%X>9k@=C=@wjM>V>p49<le@$*p4qa&j<p#^kHM<9@M*uGuQ?@tGiM$yn=
jPD+PF n=^h?Q\%bbc>H9/NaI:tm>AqQV+QbdVwH/jy+Ghc!8uAI6qy/S&bFSM4+RD&tLC&/A95WC!QSETS6ynW
MRtct4 dIGI<R6Wp4K/%L^RNMTK*A\IHu1$6ah>beNSmPkH\PH!c##IENR@$wR=e*?qHRecS6D&BLn&$$&k^^>%
ta=jRq C:uRLqAn$8&T<Wbn\M?$Ma+1KnJZktY8++:VSXKn5nCuKuEkA5q>PEbJBCe\1*i\8CTl$QNtlmjuNDe=
=&$aR@ EjQlV/GW4mTF^KEX>TA^IXEVb=p44*iCMbG9NyX+GC=6kPQ%Y!/ElCI&M1uhA>8pu*GlJbhK\T9!bW@\
8JGE9= qBbatS>L=N>dSqbLw=bcCVBnXaIQ%Pw/%+XPiV*AI?=WapBXphm%EW!TYP>mRn6&^Jd&j\@\\8<:Y=9E
%aw&L! Z4+%hecWMe/bS@\<*PN/9IXwKiRb%J%nm$9P1VhVMjDV?M9X&ybkbLee<\e:BVN@Ejnt?b8KG&D6X5eN
dw#=mi R!X4cma\ik8Rc<VM/l/m!WLu9TiD:G^aZhkVMFhPNB%^6MDF\5:hERN6k@SJP+R>jAkV\X@$t/btR9>%
R<yJh@ C:I&XyBk6Et\md/CnS=+K+MLGjuk8B8q:8BSQY6a!8I<laB^yI!npn#DDi5aI^RuJkny<?GWhmT$Wcm>
/nE$ij Q%QLGS9YGmy<jY^ZB>awwc%6^:hR^1&Qm@XZ:G?C/Jpc*K:GGZMBl!LRHL%RSI6<lT%6/>yubyw1^*L6
c/M$h4 HSe&TaRkq1VBNMQ1inu94YNMP%6W4&5*A@6I:%&e4y/$mlutadwVH&:*m=h^meW*c@nNn\q>>#^HaKJl
P4MN#9 *yLPGkW8K8<dYe\Kj<Ia:^dwQd\+Rk*D+\\GV+AJinJLe*&9J+M$Yd>95XhEE?91?R1S/E4\DmYM4$PV
p&==W= ?/k*+>SL#51$wnHhdRZC&NV<MLmP4WR#A>eX/cn\tn#bXqjy%wYlBt!N6/<uKR?<SZ/clLRCT9qN+m:A
pcWaIC %%1#J$X\&jVVXbh6V8FXG9p5=1dNYIkXJ!a$G#DJ+Ck<nFb6p!IWeIcaKSY&L\XQ!*GDV>!kHpc^&@G=
Nah<>F T=BALe<K&cGPM5Ze6p\uRXWX%Wj$a&n$#:!imCAY6mG^RW*>ZP$NiL>TjK!j<mQC8ba5F$8w$J^=J4N%
Wcy*>L ^XAwkulyHFep5by&pKlT/=@ueLCMcH#DYBkpaKTMIJZLEKAmHqEq=@ZZnY%FYHcqFV<8aY89T6iFTE?\
:w\5cw k@8h+J46t5Y#DH?tCkYnIW1W>eB\6?%LLEGM#hNW1EMnt9CeTXL4t$+iTiaGD\5&MImMadF<61*em/Ne
-AdDNW 000168b4b80001202b4 Page 181 of binaries2.zip
Lh&K=S TIjW69%ITJa#T16GjmV4$1%Sc1b<m8lqJHF/CMIb\8EudYhmyLut=HCBAel/BeXY**YX*GNu1?WtiLL/
nnWhbZ JJb/MklnTP8RTY<4Fq1V/=Lh/^d&F#RZt$bS=LYujB#l#ppSW^E4hdbCWXX5DDd#l1cb+$%6cCyRDh:>
iS+@qu iNmBJJ!p4KRTPlT\m/YZ*Wj1J<K1Ql\?5tBGHpVi\/!5l?ZMy?VYiBP5lwG1cqMSFASq\ZL8QKRl#AJ>
y1e6kS nXqZCKhcuh/t^uADhXWkjGlTBPcRhSWF+9Ce11L5T\+JX^%8Z6w&>SjL%MAYdEunSBK9lIy>u:CkVlec
Wc=8F& HMSA9\^XY6C#qG+iMJ4n?qFh5pFLiJEkN9>#uuXSW@JDaN/e#HXL1Z/:bkt+\R=F8&hPR&PIwyDRdtMZ
XhG*dq m:te^y#q5E1X#EXYcbDpAq9Z+wI@b\$%dGY9lmlTVD%Nj6tcVnQh^?%EGZj%\@mYkaJ$A#PSeI*?L&=$
1Aqccw %IkXGM:Ne6%lem1S$CjJhA$6E#SA8ue#lhZDn8%\q8*qj4Ey*>Me9PLuyiSM!$:>bja$XbBTQpIu^/\H
>NnXMl mnKK<@J8QqV//w!$1lSlj/iuq$FVI@6ela6NRiWtZyEbC%>S56C>9q*VVE<YEja/6Nt5hWi*<X8R6+I=
@>H=Yu 5H@PyJL%?4yL$!kEaCq^GK<ltDWeM\/hjIAZ!qlQ4hNGq^GlRq%Yj^M!IA?1?\pV^RL%In56q1/S$9It
KQ5D#L I6wy5N#heW<&9AIl*G1<Ylqi$wR!1B=p/5#^uw=P?FAaXV6yyDTDl*i?HC4BZH51QXjM+pE+!+FhymN$
!iM>&W DE4@aZ6y?=PA^Faq$FTYKD4ytcKl>B&e?jb/GuQHV=>W5&8J1Ik\^=HtS88uA/1XjJk/HtB8k*PMPyc9
uD/yI& bAN6nZWbq^:I8/&KPKF<lWQH8J6$wb#FYP<4!+ciDkX>AwcL%SD<KW?S4ECSmw6*G4\C?VGXSPWdNP5S
?IylES EB8hELX\\PHJY=W#j!NKnLh+N6dSWkq8TnyjD+8WX?tl6lT#Y=W@D<mnAp$KCc?Y*qk1/kuC&\cbD6YT
RwpHQi eXyEkY?#t8>GBbC6K<6yhSPdQy=qwKQcnn$#5n?i#KV\1$$lk!&y:mp8Eb4E65CuK5Q8V/H?Ne5hJBIW
lwIc%6 *EhAPm#+pl+%Ti\!pX1myPe=P*uj+?PdQF+p1Siu:+b?:Kl?SS+K?Hk%H>JRTFtFR:4BG:@4Q9RF8Hn6
KhnS?j c<HhGwa<?/*Q%<CDP!4Al$&MByR<^W9qJ^4*Eeh@tqWePME/:dBEml?iL^pl\NWK=%A:GDKnI4?<9tF8
d8YQqd 8PD:/1:HbJcZ<QP\R!4+N6q$P^*lq6$\#F##mGC84D?ndPa#Dh>MZpet6l^6B&M#%YEt<cQy\>jY9jjL
m/=G6y #dh<jTpKZ+b/u64/+:W&m5k=et9Ym\b9=<^*:Sqy!ZbYGBXJ6??qcX?K5b>K9p6Q=tuAjwm8WB+#wbTB
IT=Ii> d:y%mNcA4c4d+?!ZaRLR>epPimlNqun5X1k^Sjcl51wSj$e/5=$@N5<cJqW*Ibe+m=@4YemFI4\djGc\
&Y^BhI PP@d4RcES:?ka4PaRR8HBeh?l$<INh@dlVTqXC/CD+cCD+iCRa?tRE?#d85QCm?5TXY84Jm!d56DZM%#
G$%N*L LAyR:KqAFb\SLc8Ci8+Pw@<K:%y$6G%S\y$AM>QMQMFmmq$8Li5Y1/:GmF5Pt%:1y@nF81%5iLPe%6Z?
N^PFeC MLP<d^\^QLaqp48kkL#kEJl>H4qFP&h4Hb69aX1NlwEa&+EaIi>A/cG8?IB\=AS*QqR<pkA*^5%eF6yd
#WH%ji CYujT*+HS^>8>l/=R9#^<AJJblSXCRM%>6F:GkYDZnh?Gy?ey1&!nDT5bq%=SAjb+9S%B+*PjD$M1:ub
BlTjNY bWk=bC%iaG>G@6HN6Be5Ayqb>k\!mH6RD8maV%qCc&=AD>5HlikH%aD+jTB?RNhPDpSI*#AScc/<G/>l
n/AKRX bjFG*DRppn8*nI4\aMl9BqunEnEX:q!NKliN5m^<MA?JiApJTBqa:EReHmnjS+$a/ViGCAkw$uiQA1w^
HD%pFd #M#6mRN6KtHL\F%nhKE9G5!wQB/*%@&GtSqyI=W?4n8cY%FJepM:<=iZY81W\pB>\/cI*GR\ZbAy$6&t
V@aHF% %!G1C=@4<@qyYlHd*$+%tK+$qM^!M1LW@/neX>MQlR1WDw&=>EM1!jPiKbI^Hb5TiY6yD&kh?4AnFpS#
I9#T=8 Mpk*=RdXH&+9jBB/\EIX8A/6nF\!JWHLWk*db$IkIT%P6&\GqB%DMCJB4BAYwR\\Z6ejRq?&A=E!lBFG
lXJ*<R 4kHNjI1bQItXqyd&8JFtTVWAM$#^C1T:>E#%m9ujjukaZwdYDyIj6nEPwYye/XF<uJJ$Wi<jXk=N+G&#
$Pj+ha A*EEG&cn4SGl98%DP?P58!HbuPX$!TCd#S!=bCN^>pIld=wNHIPntS8:R9@@5jeZWHF%/ha\Y4m:R\n8
uQ\/>F ZwK:8:8:8$NIeHiHpBDeLVkpBA@8Lpq\J:mEIDh9u:j:uP+P=>B>@8?@+>:^%YBRSSX#:dZ*uu86Zi6=
VFBi$< =nN%LeyYwY6TK@IlFT6!JYn$594!A>N?%5jTTh?aZhK<LRlX%Ldlh\M5i!ZVn9e?hqq:FZDVmZ1#CN9V
jp^FjT nlyjYD5PnCeN$9/ECk>A/?X?/VK/tE@4ZL^ecGe<Z&wbn<8>JL?NDpeaRj@5!<+Jdh/iddF#p1P+tDw/
YWdCd# b*AXZZib@1kBmT&!4/I>qDw!GJcZ%>mc@6#=w5Q+w5wCD1AtXT$tcVGyE&Bb+$=5EwImFWau%SE4QIdI
++AF4t c#eq/&A4YbQAnJyQA?a54@cpQ:9%nZ>Jq4QAYhCKFq:Ft1#9%Y6CVwZHPJm4YDCdDF@GeTwjZY>/L5+4
KA+DQX wS:G=N=GEt5NB^CX1jeFXVYDaeVB\i=Wm8wR^V#1:&F:\S%RmkteXit1wy^8am>W8*ZW$I6&1mwp1t4*
wuhu4! HbQ&8&AQeEMPVPHyYWeQYYeQ<%>I4wElqKLj<^9lSw@J#e1+S1?Q^kAWXQ#m+5L$GmpuqGCiIFE*WhWD
iApBJ? ei%>/BC\qIV$&dm\p4GWyKb@?P9*RCq\R4PHc<wMl&t^#ZYXK1X5Z=XjYXB6Cdae:PL/#Fj9neu5uiiB
<V%A!D W?K^+upj8+1&yZ!ynyTW6^R4>lC\N>#nA!!64ZamLP\LXIjk:JmNAMLwDEFBjRBue*1Lkc<P%6STP>j\
MPehHP CTT\+keqk:\^WXwWy4em>5QGnJeTa@TkFX8tW*MBy\N>ZQe6Pl&y\uP1:kLBMC:XI5!Bc5*ltWcQ*tX:
QH9hwV e%14qD!k!/i$S8:BDj1ZLJ/SPeI%\>K*5CXFX6a1w/J/F<>&IiT<eM*WhhNt*c=HhGC#9C+1VV5d>ClP
Z!*MQ# WW#NQFFGY^>H%6NScuui5FciwC=W5&P+qTT$?n^aRAVcSh\n1p\\%@>=J#qJDk=!!J>c!Q@SXw/L@E?=
Gh#LNd #4<5*RS#@=9TVc:jTDi=@pZyJ6e@&5y^kZ/9@j1NDA:M@XVFJwV>KYnIa&mPy/Aj<&/CAJ?AluA@In&E
Zb9l:J kJ/C=u\MDZ+KG9!I>BACiR1c+^H^IIV#CYn\a<b\EK+uwEGQCSel*E>Be#/&*$@lGkn<TM<=u<I%$GNt
bC:D5t jJ^Q+S1R=^GNLihV8Adpi5Ran9MyZAN!Q8KQ^9pW4kHBn%\quE@l&8Q/Z5/upI&V<^GFL8hV!QcIb?W9
uNuQPn >FQIBwE<h6l+uuTJQ6J#4miSnj$SwuQ>#@yihl:8*+#<QL<^FPYBQFZj!<:#?#Gi/@j/Zm/Pj*LS@Fj%
tu9Bim 9YB&n4@Ic9?R%RN@DXlQpNS!kj=SWk9t@y<q6Z?dJ^Z@e#j@wh%@^&tP?/?TYt:R*^T%9&cG*?qy$j+u
aE&RFH RT&aB@\@L4IL4Tl#W?PnIaTItmk*t*PTapTIt/y\F&m!EMSIt1p$d*kKpCXIt\EAMQe!$EpDBdW!<6p/
i+ET81 >MtDSTB//qw>WKd5=ySQCL+ida1!6Vw!dqG$+P8J+tNiA?^+:8KJHjjTpNb\4Z\XJ9Cm?6e/?b#J9XVi
#*t&1u YN:*<8ZcDNPLeK?mie5G1#ldD%<=YNdLY%\^HNyTPVb$Xe%GCMTh\HiIPSQc5%B&&*cdP1naiakt!:TN
@LnCV9 YpGY5:Eq*w$dF!$K$Kdbm$>dt/#A1XIbXM@di@T>LJ1#%kDaI4/8WQ9k>&ZFYc>mqA:Qe>nk%Ee@?hP&
>ZKy>n &5jRAK:SNT!W$N+DX^/@V$=C8WG:YdHL?FaahZ&Hy^@c41*pm49PQF<ayu:nYnm<?9D^*ZP85ecjkkha
tu+E\^ u4MhIYK/C!JwIXCAZA!*<#68DKcNe<ERMSy+$b%AL>RPB1bXnB/MEC=+kiJdMb^tqYe!&L%a@By+9au&
$u/^at E8mTKLDtn9ZD\:a>Wk#%&HPjE=iRHh5q%GPyE6F/RmKdKE5m5GR^TjSwbP^8I^^dZMHJ=INq^yF$5qC+
W$e>>* lT^DJRFRVEQAN!*AkX1@jBdbbCa<MI>c!B^4!aR<Aw1mk9+L\iF^dTm+eXRNPFHq1qkM94EetKR$#lRL
Xq=*#5 a9>Q>dHa:XZudSCF1bSDAcXySFZw*>:he9$:8t?i9=KWk\Q!N=d?tm*?Lhp*=NjN=j<nLDXZ=cFPW/BL
a/IwJF ESEGIN^Y\VGuDhG+IdtQG4FtnNK^!:!b>PDJXLCc<tGi%GM4WLW?#\\Fc9AZViS+MB4\?qQt1=hBiDil
9q/$1a $^WKNi#PBnWpZ^wu#64M/l/Y>b4Y!Xip/la?u>DPW/ThK=>SZGh5/>!8<!ZF:tQwNLXu6=QI\uMQ@ZJC
N+JQ:F \Q8Kneukk=+dEZPSIy=Z?VRnnn$Nkk#H5FHhay6qa/DA9L$u:+E\%JitbWe99dbQdnaWT$:eimPZ>$Kh
HihBuQ 1/hiH&*ayh=kdV4@YH%8Hq<<5iy?W@9<uXjd6&QQ>T+c%cPS:ZQjq<nXXp*#Ea\Z@C46qFTHX:i9@KYD
5T\SC/ lK/?Z*>!!l<<T+Sln\BlacnNZk4q<Z$DCNMQ:eN&hFHeW+ylLIMjQmqH5b+TYB1QwHSnhm=Vm4CyLWyK
:w>JJ+ JQn^aXDY9JGqSH:@l9PuSIk=D/HaEVMV#MeJ?lE+kVG*XaK?mPS>FDEMjnTW#$jVFNS=L4C9KHGw^WQP
Kpp*uR w9LKS!ndc9qLwmSXei%@IkbEi8GK8d:=HCEP6!^F%DZ=LBkTwnb<RcW\=W8KNK4eI$Q^cYPaA%clX9\&
HuTD/W VJENnALV!/:m^T+^4d>!wIdYkmYlP9#VRtpcLbR*pkh*!H%6&9=Pjp&D@1*5#6TFk+!c^wYEicht:ImD
St5#Pm *99WwZSDT5mLqJW=V&kN@jqGwI?8D1j1uZKny$il#YJcbcZhE9=Ik<NT&tGd$#IBY1>h#8?@%uH>Lm#J
a^Mcj& @Y9p@:<%J9?uGyNtj/p^mjw9%=nE@LQ$a:e<#HJ<tI&$dR#HATd8b^CVGTWeH@1p?Aq@QL9?Pj#B?P9L
q%W/ce eCl^SQ\\E?ED*H\S+eH:h4Pl^dGP\PR%*4bKc9R4IVM:Nt4l@JI6aAkM/n61>H\*TX^RVQecJlwR=wEN
klSiMZ BFX*!j+i>cMd*KhX<Ru!8pltD\c+mt5Sj6C^@lnd$Al%?QPPXZ6ZVQR#N^ERHE!PGk$enNkTSD+*=u+T
b^Ym5y F1cRSpRw9t/c1S>%l9ElZuW/aG!aDZTFDFF\VTEP^@#AVmAnM5#KmBl*/9m>=@9R5$b?a#Xc95q1>c$S
^Ka6$W ^XwJHGqadDMbN5Z8\mle6CTa/Z6F<HVk<*/*<SZe8tMBe1/aW=l%F$HPHYYiQQWZ$^^\IG@XC\PM?Y$b
ZeWdPF ^WqyY%\XCwhal*dQ6:uQy<A94@#$$tG8#Cee==ZbF=5>B6!E9ELeZ5LBhLP>ZMLRKJ1R>*JY=wk>VcX\
FwP*qh 1pP>y:\\WHh>S&Gmw/%CycG$41IbFcn&pbCjR+<wY^8DjAT+1TyRGwycX@+ANFE>u!EK+>:W*6M$cjRl
-Ab5Eh 000f47a2b80001202b4 Page 182 of binaries2.zip
Y9dBZ1 tIQ5%<jPJX1d><$#b>S!La!D&P^mt*5!lw$e<I$<%P4m=K<:+mMPQS^>kwZMJywle<\4d4BFh*Gb?i6P
iWt4*8 hhj+WK=dNZFp96>JDQM>n8dW8\ZRM#/9ZdmpK&aFGGlX+F?kb\X55B>#Y<yqmd:uDTmjdjlW>&/:Rw&R
DGE$q# lC<LnTBqXES?G8V+jkSFR\t*pW#1E>k%YGI\&@DN*iAp4F6BJ^FtD@>Kdw!dDAl*T*^\RnSWLh=EB>aX
1#*!4N EkIVpu$l=ca^=C6RHWQ\HA+:nbV=ht^?Xe*p1@y$u<yE86e8qEbqBt!B\cqwAFV1hllw$j?dHklWjPj$
BnNuZc :8Lbbda=qM<+NTbeH?^JMC1B\9j*d$BF>T<T%jnIyV6NYG5?N<hMwlmbNHkVT%J?tm::1a98wl\W$I!5
iTlinF ?uQZpCY#P4?EFE8XtMekamR4I/<KLVYwNuK:CK<lSSiXiF&Rn?=LV6jW1CXYQ%AKpE8W*&&LDE*$Nt!R
\EY?T? AXlmKYtq6XAp4+^:Ad5#QW^mS8RnK$\ADRnK!<Q%<Zc&pYdX*yIh5*MAFjhMpFtK96EK#BBRGpXFwM$p
*BaEqt TSaypCj9u=TehmZe!PPJh@VqV/S4D6nR9XX!1CDKQP=nGJ6*EkdKhAq$V#%@>kakSG5<R1b5Ht?^pPp5
:P^>4e *Qn5iVDaP9HA%VJ*kdRW4y#pVbKAE6wu<dLt%?X=Ri<>>5aJ!$*uD&bP+mXeDAk?FDinJ18uCB$EJyT8
yu*qb> 1FC41awyec!&be>C9/aV!Ruc:kGQFyaRm$%nbCinC+y#!?Cp?m$KV6kVp@bZHFL8Jph9JSBq85pRmYS\
SY:VSn C*IW@CR:ume&h4WB=\V^1e\j9</aiPinllR$%A?Sa$AYeT!!>YN4bm$Jh4PDX%KE/iuVXcQZbtecMZu:
6m6=$k 64@i<?$kl+4\lISKWCp^69%DEehuAK\ad!yP@dXFqEBly:69*EKJKY48G*DaD1DhJ9uE@uMTD@BtpGmj
P%R?9Y N%uF$nd%Hh=^wq/bRLFeGHp6a<N#k5XINa!AaZpaHuS1&#I$>^?cQhj=uI5%QCY^%wTWQ#=HMe1#^B?=
MGT%F@ *<&LTX<ZqXpw1ILHQwXHjZqGdAAHZ8kew%1#\8$TK8\@#C51!QB#+G<&b1jNYA#JFTVYNpGH/kC&>:!\
?@/lSC wTwk#1/W>WJI&:QcuR\^BkT1X*@R*/VLLJK1MhnKQF=B\c<6j>5btpBZVPynLEHd5u><PTYuBTt>ZjIE
u4EaZH ?S$yS1lGE>%8<mh*b5CIkWp\!WE%hPjZ?i!YqwF\t9BTh/$F>RE&BCGE81Y>FIWA*jN<u?N*B%EIJ9u!
YRK@<a hdmi$G&$NlVj>n*jPB>?EtV\NYwY8@q$dQ??h!ZZ1SCXTWCyaiChM^Z??w8p?CqNKCPV&1ZZ+wXl:!>m
hRnePB dBQqp+#pGC#i9q?A:<QGJ?Ln+nLaj%c9<wuu/+iAX=P?!!<Xk#cEl:/i9yFHpl5/hK&Si&64?B^^iPk:
h69?@T Ay*>&uB*tHYVb5hh@w>RB&KB^wC$4j*C4HAZN:S=JS$u!N48XpFXDdq8C%#u6449:Si1+CEjZ/T=cDYS
PN^u>p L/=%u&^Z*+:T8M?S#pSKXiTMnVHwV\VL%/t?dtE*SJaA$J$jGA/488%KcPlmnXm&9=+CQJ@&#bP@6bDt
K\y@%d DcnHL>HWi^%J#w:AbJ%db!t=cR&p+qVjLb>MW>QIDihp<YY8c%Q&kTbbj58Ri$X#9jk/BbE?ai!Pp^y&
/#8hHq iyBP>8AdRTGE?8KKlq4qRhyN9=:mbdbEa>K#Xd4t<tR@8Mcw!!<<E8##E@C6WZkjYqFa$XcCwn!CRBZJ
@&#uyu \1Wn<1+pW&tp+pmw8!aQ\yF4&V5+b<*H#:Gw/eI!96qb994PE<Fibb8\Et44e^!PTlQ?:Q/4^H!><*Qp
@tAdW> $?<i%B6PdN/a#^FdGy<nMqQ!%GNQ=QFI5><<e=deL>jTDEy?TA4RHBGD:hqIF%j4Slpul:i/d9+RS&&C
Ku\9Lp 9LZK!CN?NP*+R:ppkl+=9RJV>pK^8>56=1Cbm15R5N@?d6I=a*YMPQN+awPND5dnI$FDFm8&c<I8DFXH
tL1ItQ C?aXFSAqdw%&#Ww*:>5LnlZVG=/auJWY/BCK=#wT5&cPF^\#B%KcY#RDNbFLqb9Bwl&@l6+K@D!iXb/9
K!mDQd C%@=HaZ*VKY#C&I5YSZW!6VWIdNZ6jF&H$@N*1F*?*q9*VBAG@%+hZ#Z8WGXS9E\jwkH+$C+S=Le*H6q
L/8+aq N%:=^cFkPX>aYZLuXMRtTTWp#H>LHN$<\%8&&SLlZp<tbChp#dlk#RlXPnn+FB#yJ!kD@64u1TG=LCAt
PL%Cc@ :>$lQDckuQ<bC5y1H:D91Vk8KtTSA^JHDQw54tTiJKC54tnZcK/5Le>t9p589G/9B?@Iu>MjJ*TMiBY>
+:bRdI QLc!E+CBB5%8?qWbNVm5KA9q?dSM1/ip=!Cm+nH%9L@hiA6kbSJ?8LBu=c&hdua@ILcEZbmh>pPM=I1M
$8%/^Z 8&C=aG5l@1==#p9WP*ky?Euu1Cdp/jGK^nb$a!Mt%cHnqhdnk$Q+e8TDnKlCh<%>%tmuc@+k?ae>VlXq
JK9WtE bmuld*DH&u9>p:JauJ6MKMlT5VnHRP@>iLnNV\yT#cQnJEnWXeEl$NW^?I1dIB\ZReSiI4VkNXNc:G:^
:YRZ#N K:mEjDnF<jiD8Qj=**M@i*1Y$@QV8TNHL?:&%Ikm$DdHTdjRy5J5*P!!>ke4LP18>G#VklXHuMe*=iP5
@ilEpp #4ATE/JEW/Jm*pT6PF:$95R8$T&N=w:J6=W1p^Wc!^5CHMSYdTM4D=jS!XdJ/pcW98=E9ATyGK/wayd%
Y>q+eN iE9SL+ID68LESaX5LF%hGc%ZhJXX5TnMAc>L&enN6+KG>L?XXcYnTFGWDCC@Z/VHT4p@qEGya8Yn<TJt
m/cH<e uFbX$N*4!Qpa<@\D*BY1Jc/*e+LKd6!XQcPJR+!K?XjhI6a4m$G#^M>Zq8A+B>Vt<P6EycCQcGudTau$
T%99Qd Cy:ZRP>kiZkR:Q&E:ade$QD4\=KLAF\bWYH+Wq*YJF84::el?$Cka$@Cb<QW1NpctE9+a@/8#X5+=E!Y
cG!6ij :nJPTk@YAQ8qW>8w\$Ew/Z/lkBI$5hDun8kTpiPcAjaIMBGhb4Z\iZ#QcX?F&5bqXeMAJA&*thVj>1XT
>Mhn?1 a<tmS41:DQmByH1yTpu\%?X6:M\u\>M!%/ZSm/QKdcwY1bdl5dap<4>!:D%@\:GnhXAGB+k1KyJWL9MM
NX:n4B p6t!REnKphMZWLP8mhHh6%*PpWpAq/#$jijBKIM6q4b<ZR*Y!Q?nD8mS/%4/ynW:!m$D/\H<TQ*1tPlj
jA@DHL mwDmCa&8<WkQ4>J?w8=9lk?48IAYS#YZ@!QeXAd5JQ?nCGl1Hn5CJTh%kD$%nJe+ybNIl\E+GJQiHb+C
9jeWZ# +CIi?/pEX$ECq@6:u8Tkp#TXP#Z#PTM@LwiaMJ=\pDq6AG=8ny$w?pc^8*X$<KF$>Zi84mn/<:APJYXa
w*%p^G JG:GI$A?yTeZuDZV8adWhIB<T1l$Tp#HtyDahAp:d6wFDJSMX\#NPTjX8yMI6I!e1bT5GPC:R**HEdJ+
:y5cNP S\kT=Tl>uVV#TkI5\Ba?d^SSPAjS#JN=JR#bqBA^aIme@DN1Vy#:!mpFIAp^RJn5kpi6RWD6RpRhI1H8
5CeWYW IcQiwKB?wcIB$hD\$NFwMNC+MNGEYGl/&Gk&YAL\ZNStZLRwH4R<QLStAkB+QF1yQlwcwYwN$hwZ<hwi
?wC/mt tVwNYhwc$hw#H4wiL*SV$*W9WuWllVy+mX1RhN&GVu&<hq$<A!&QAZY<EY&QTD&<h^wNC\b+LVw#EuwZ
KGNa&K P4wZ*Vwc/@1Rda&LEV&<NkQInBHpk?a5puEnt9Eqqu:DV#%NHHYIM@wqlTpulWpcmXaPqCtWq^putMCV
%9PZMI !nRN\*Vq!M^V\w!V#:VllVtuqAWuN@4F4uEnt\WunRW?^NRV!?JT\mL%y!YuuHEHkClN\8VT#MR#%KJl
Yh*:GK !G1Y!^#j!hTV#ebV^/bSRMMa!84T\qSV^1a^&J^VS%Q#ljW5!JbVSu>Y^R4j\<a#$ld1\jy!\t:Y!NT#
9Kb$mS &m^6TH9Y**:X!$GV#\=j^FS#\E=#$/+Saw:9=nC:bAe^5=9>/cn^$/:^$N:V^Wp#*uqY^WG#*bu#t\ap
>i=4en %KZ^y/uu61ZupYQnP>i$K:9GK@$=mI9tF<$4IhhGDYeCQLetAWe8IRh<Dj54Pq%Nj^$VL$@NeKMGP?%L
9ttyS< KSNQE$<QE/>$Nc>LEt?6eDhNBi<=XcJ$PB?8XHPSVI<$H<@bWdK4jG><HG6QlShiLT?c&q=ehjy^>jy=
X!lwy+ Djk%cELed/FE?%+?Y4?Y/@><yQS*<XB8<n@ZYqZ@ZJ#/e%Z4Z\/Qe9%tij?jq1R=iS/J=*D^QAEN+Z\p
=X/*ZC K5LN@lR$/JF+DnjHW>Aen/GBV$CDiS=Dk=/Cjm\c^A%?Cl4$TFCEG@IWNMenqYc=Pb?ABuE@E5:l=uwK
nq\y$E ?4EaG9hV8Ab<hN6Q+h4nMVTiJ=GN/=GD#5Q^9$I@nY!QuDKij+4XeHH<#:Ec49>T@yRD?L6aDe?@Ec9=
E#QC5+ NTV>8R\P+94QaA$HN@i@6\+PAwKi5BD?dRZ^/R9lYaW/=w$GdBu!qtw<BdMPZG<W4hScNm=jC8WwY/9#
Y66@#l Wy<mj*E55qF96iB<1%Tmd19BY/lb1XYlccjS88ubbqTndc<SXEu/IF&9//D=\cL^m%P#91MYZ?H5whhH
iJD%V5 R!i6D=8Zh@/6Sja%pwj9wMJ:VF&$Q%y!ped*/>hw&5hy5cRQY:4yjHSWRkwd6ZdZFcBNX@AhA:C*94S5
<MYeEd M1miN+Q\65ZNPVR6P*n/ww%i9Y^j5c@^4h^GmP*deHZI?1VF>Zb5?a!ZXLBaT&^!*@PF>u9eInDql$8?
TC!:ZT X$I$P+AI9y8Zl8%YVX?P49%iEXhkaNl5*4=!JIhdLL>>/MBElaQ1TGBGk&:D!N5/EXK&9j:?wV?@w#FE
/TVN65 $8!Y4\5#mlwLjXN6A1qY1T+cRV!/:91HBJc<?uYuuJ1/B9wJ9^dS=@kEKQVQVAXE&H*SEiIGYVZ<wSV>
+A1N+W CW^VtC\ej9:p@dZ&d&GpV$J$t/XeDmwc8YND&BlK5j^1=+beW#!\bM<a9:ANa\*P5Rpi8lh!mLlSn@AM
Y6@*1N kP#$8CWtWTi+JEFh/+!nTjXZ#QSd?+lh!tPFYPIV%9\jYFqAy^Pe+ub6KPKV:pG:ZCM1KA#Cw!uQDQDH
&qh44k #!WWJGVhDaBNp/wHF*!1I^yKWqN!d*q$K>*lSLCuNjTV%XW8$VmMSn^/>eR$#56&JYe%Hb^dNM>IlR!G
R^Qn6: G\=DnVR>TVWpqS5Zb<\tw:>pP8yel9^WHD6LLYXcuCZ%h=\u<Am%4&!CT*aS$YD=?FEZFF95$hjpePW#
q/::#/ *bTNbFib@q:D5$1LYQ*V6@w#Ia9emp1&\QF$FylA8a!ZHBytC&m^:1yiH$d<Fy1T#mK?eN&5#GAS^Xqp
k@#4Eu t5pL:LT5+*$qW8Q\GeWLM&qScHlh8YBi/mHpAM6dn+XH5//&l?Iw+t&!mC<RaN/wAZ4#De>TS59EI>R5
?5Pk!k SY9BaC^QT$$QLZVZ<u8Y1dZ*jYmyjY4&aeyKc<>?JVn#9tjKi8nXFAH#6T=T+iFqd&DR^C!L%wh=j596
m6k#W< Nl%E*Id1BSIMFuAAQ8>T=\CVkB#/CcS\6eZntShX:<Xd!Sdl9l$Cm+ZL6>WPT%ipa:cP/c/T5l1iAuPl
+Pm*Gn 1>h9?:!^*EaNE>N#jMTtmn$<JQNFZi:VC^*6jKtH:#qy9pAIQkNlVI/pTKVTtkK\mBF49^PTGcY/^1mD
88GFB$ $ClJV/iRQyP>&\pZm#@B9I6&!%G%XR?KK5d6Iq=FNI*9PTWVj\i#EkV#wt<tZVA$bZWFnBw5eZJIVJGJ
>Hd%Ay aI^6+D*&Cc%Lhju?*hIFQ>6d$H66BbRyMEWa=pmdGL$N&5\!b#nth<K8jl?M%YHBCC#$==*cpXmVH*pn
-AMMLH 000ae88969a001202b4 Page 183 of binaries2.zip
X%BH6+ 5bkQ^W5!eWdjKEbl!Y>KWLEkwdct<&KbMuLVl>mad8kEF/&^></qatZum@pme#T#Zmy@!1:66a%%tCun
+cci\% u4+$#NiK^/wXcE%6dIyW\$lRjQ8^L$#mtXq!eu^WHFjF#nhK5@\1$<NEL\kQjZ6Gqpl5:GbY%@#iS4+>
e$uQGc wlN&uDC9X#t^6ulTW1*CNcj&QqMldE:K/Tkj5\\Kp+YcYn4&^HTNn?cCGaN6CNPipICFC+NFmt/K/1XE
d!DRlu %XWh@d4<aD1IcLbJlwJ!k*w<@tVEqWpT8LF5Z@WC/>S=AI?Wn8Bb?^8*NGTb=C8i^j1b%^Nd%4KS^h#4
n1+/t* :8<TXh9/=NNJYDdMq\^X>:RHhSEE#M<4e6T^hyRbqJl#?GBh+hbM^m=#L4b^?>$uL6WHiDcb6wbh<>*l
1e8wm% ubS>V5DYQj9$y?nSp/>%yBla<FX^jRXGGDWwu@e!Fc6>Vy1Rdki>e!hNL86yuecla6j^QRqPnQXWH*^J
NN^F?4 #IAuKV/>YD16%c=YKJ@NkjM?8S%9X=W\YVltJw=^/tbAb^T5YaqZMchb61A*\8JalVe<Kwy=a4Dj/%P6
qB@I*c <j&V%8Kh$RFeaI$tiyi&Hy4JkWVpi$*Y#>yLyMaF9capnaKDPuw5Fki>tZYcn1M/k%*jlnT<RnunJuZ%
^XW%Kk FG\PJd#1Dw@4hitm:R=D*#h1nm:1/Vp+HQc&NGq?@<4HDtYdcj?h=dL%/:Ji4M6*maEYLha69jJZ#%q$
CqVkmT ZJ9VPjeM>Cw>99e86KRL:1TVFH6Y\/%?%Iw:NbB4edbQ@jc^1i4TePuLm!?y&>aZ\9Xj!%hjH9Z?cNe<
KlhShM @TG^9&5u%4*d:w$Bdc!Qiul$AFW^1\Sa<TMNQk:>*5u1D@jNum4$?DNSC/EmcJu!T&nNLEYQh6!<Tc>d
h9Z*?D 1LMnhc>&NV/j9RL:i$uw*8a^a6Nul44G?PTjt+?iG%W+/uKMM9T%aFAc?d%TBcID?%9acA&b+%Sh+lRG
5?/Q6C hSV*N&/VW+Gjhd1>wH?54m*F%e/cDG8&M%p</<5<E?5hd4w65ETh!n1V6B914iP!Rn%M1$9h:hj=Jtny
qJF8q@ h&dNX9Xm4BYDij8uVya:j5mEDyiaAR6P*uta&EVVC/qhWybaeKd#cK8Swyq>m*>hy6&W4=i1CTuI?d!1
D%Li1V eEddTG*%V1*5Ik^ly5Xjc=@W+hXF6965/#hDI#T*pwc9djNc%WcLyME%q^K4</$INQb9*:+H*!PQbIA5
FH415L D?+1c^9neBh>+?$Pq=J4n?Fuqydm64/naVW*$i+PiatiY/N%6#cFDm$91Zpj/eX@9N!/@KcE+&j@<14>
%wVjSK !?#hq&e\Rj!CeJ*ipnSL*F+C#wI+*ahZKD$@uj^h$JE/4=8IQD?c^dyMI9T<D<hhZZ+Sja41p6qCS:V?
i!4lJe ynnCtWqq/Ee+^=d?eIT4jYAW<^HQ69=S669Zq&MHBq<t*<Lp8S9GV6^I!XTuTZqyKd/^a$yZ&yMWK:pR
lVj@=9 4DC>1hdcq+Ty8Qn$$jDt!PlAa1utWuDpk#9@YwG:VjHkkI5&H^<kVJ*apk6jR*!:!TZ<=al/p?FQ66Ja
9bE?Rq >TMX1p>!lu8Nt8d^^!=iu&S69hd+:BT@Q&hF8#deY@aLJdWhdK*+IY&$YaLktVe>W@^nnG+:n#Y*EJZp
nQCVk9 k&jX&e=LehBJ4c+bd^GH/F:ji*ZT>C?iVn=HL\nc4$qj4QwJNy!<+6L<ket%*FyA<9^DGw4^<&#quKMT
n4Z:Z@ H:@/DuPX<kH=iNCKBWTqXK*YhVRil<1<+P*6N+?+Cb@&FV4S8aV&JMtd*e14niZ+&+ihV*j9AL=X>?tP
BACe@E P?XHm/pa^=h>PkBG!y>:SAA&^#6&*QTBmHPJN&e%%KY!TY@mF9Qa>GCCqY<Wn&A\:t@b*pLb5F+MVJa+
?$1D<I !/ew$WAjT<FkTl?Q#WCNe$HH*/jXwL@E6AQEd<I1<:K^*j/MQ<+jTAqW6uej%+BnKEZA6M&5?kIXMZ9C
tGF\tt <A=K&Rwy\RD^PBdP^k6=QP/mVA?ySuDSPSF=>\QT8AR!=k9++!tW/yZCZT4pa<85BCepJVT$cqIE=#EM
IT*L4/ iBeMtSu$lAXEVPE<&*DpG6E<=a?uDP=b+/:F!qnw%YhaT4a9c&#kqW@Q^$S6&Te\c?mnqhdmnu$\c1+Q
LlM<X# 5KC#Jc6^c!L8>wRL+&+#h#N8pJ^\^$dj^Y>q5%pZIb5Z&a4G9#hWQ4G*VhSMe\IYFt%mSWtltq/jI%&C
&/?Y$i wlLiWmui:H+6L/p1DeXqk:5mTkASupnBW+tZa!4GaL\8ib>LVN>HdMGekZEI?^+KXTuy1n1h%QE6/j9q
RPViJ@ KyjX=+#ju495XLweQ6<dI?M+4*D=RXbNBI5N?M:^RG/h\?YwR<HpVPMES#:t9yXERRtpwZTqy<#NaHdq
y>X#T+ wAJC1F^=1GwF1E=F1Cq4!ZQ9mbIW1E>XcIAcNK+/NLWGNKet6EALYqed&qwH&qMZP1AHuc5QZi%L&q\R
Jw>+?b hbI@9Y5pjY$5@YpmA#CX\VYVNmtIQEtPwdcR$dYW5dcT<jR>k&4&T&AhW&$dk!pT$&p95&5lp&5?ha<h
wIyaCS C*CG^ZYByeCGAd8dCj5L1?58c?&BIFCJiXJ^+XTNFcnCDF\nu%SmX=WuQ+MH+KB\IAy^1GF\8PG\ViGV
Nu*^=> %/1\Jb*S1!1^uuGARGDJ&kiPbB\k<ChwmlV5B5PlJki1E+HkTNG+eWH1DCD4W<DcZDcH6&CRA<SNniNM
E8BpZk CJ!5\FYuAeTl+eKl+/!#aEyt+<SJ=AF8R>SIIG:BZGyi+DMj4nMmunW5GqA1H/mB=XTBVXWBtI#BP+ZE
lV*Mp+ e?dG/#aC^KEC%\u\14X#J*<AVp:\8Y$Ktu*lVZaT\Dql^*uBkVMnBQLm1b5RVIEVXw6tQ89pBX$J8QYC
X1qd%q V??E%EmE/9lE/91JWnD+y6cF*Vu+RIj$hSMM8CC^5&VlP85FpJmw1:>adc^w*RySmwlEuRF#W1VE6AWI
Ew*IGe LCFRL!PJ:T?lbmYF/!NX@%L1QJDiuWWcHCqhH!6>:5M<mThnb^?<uWXbu!5LLyT%XmXd?*&YEe>9DD%B
1XnT/d :H<pD@*@kRbeB%XV9FYhSlT^nq\h&$pDVtJVFK4t1^y=wk#%SI6?QS+9h^i=bCK5Lkj^JDy<+k@W8E\T
QER4ih @H$VPBiw%ncTWyR\MY*tb:ne<W1j8\QnKwRl^K/TTWVt4bk1GXc$1e&+Y%nm:/d95FqDZ*XQbcMleGIZ
WN\F?w C8M>*%Dt$S<5=1&1D5NkdIXn#k8G4k?nEM+BwnEqjY$Mw\lRlwR!j\CP=?<nF<X\mRDMmjIH/Y%d<mu!
8T/#Yn PG@?pH?QM$EF&Fa^nTQ*%MJBA=h^Se4q1WGjD^kuu:HtM+dlN>unWtMC=d%LP1Xl^J$wEF%h9:LHVl14
%5:*#Z QGjbn+tnb%iY:8KJM\8ybGDNqb%q4=LV*1cRwSDDIi8Dpnd6G$Hbt?XWqQj?^mRHJT#MIZt&9MI9Y6Fq
a>ted! TTX^^PmPH=d4dJua8:?nu%nK$BFJYK+TkQ9R\iFh<4+nWIK+ul11Ybt!Sp/@4Cp8Y4\Y6$88hpbIkWL+
>EBSFh VCAMCP9ZJ6?RIe\6h?G/aCK9uDKkI:?@Wa89BCp+\NXw/FeBw6cYVddC\n#d=K9SAJPw/Yqp#FH44L%<
@^tGGD VXPqLG$k&9Y>@Np#Xa4p=YupqA@j1#6pc&8Y%W+K$tF%VSRWPHZY*DeG16mqn/mW8pKDJdY>R*ylB&ak
CX8$W9 F4^5MZ/lwZ%1MaGM$%P?$4lcKEW<mA6D^!yk4iCAFYAMW!MjIt8/QuP=RYjqC1c1TND6niGE*T:WN/hC
!>ee\1 +h1\GZIXn>De4yh1NZIF=dA##hD4Ec!#9ZqEK?!KXZ$ltGE6bYH5muZe%SWb!/ABIk&+&qAa+Hl:4b!l
AFPR/< a6QlV*dXXuP=wq+lJ^DL?>bR@MuJ9wHJ!>T/$XwENJ=FuLTY/8F!idIByeY9MFanmHNWAR+j/wmiwRXd
eDLwq4 h4P?N$p%t+n4qA<elH*tEJ+ak6i8#H9\ua$l>NnuA!?B\Zq$GSG:?&Y\u@kNNiDh6\dWZnWFHQZ8RL9Y
1EEYwj 6eM%C#in$9FFGQ>t>mZDn5@N$$N&/R8#te1:Qci99lbjV5<d%YB/6GuK<MDl>Fy&XRW:>d<LY1GHI^<i
uu:@Gl cCM+dS\!??weGJ6GDZ9eb#Sl=:>FVXltLF^8^HjA+c^#p$9nA9X6/RWe^w<>k1S#<#i6TLBR>RQeBVQ\
m>HdPG lFQVqkwV*?CE%a8R=>YFdb*#<:uihC?*hMKl+AYpZTSectJcwARWi4SAP*h??!n1WCVR%:pbW4aWjc&*
wq\%<m h>:R>bu*WKP4qXXTpTwIi8*H:Q6kX!cbVC:AcS&q5*QEc1wFB@a**E:SB*l&jQ!kkF/+YX\Vye+\bAw/
MpGMl1 *R+mW/SatkuuVkbAjR18q$KqiqPqYFV!VAC>ep!eLE@K^9:GaAkL4aJ%AY\mtpu4qcV!:p9?CD<hMi\k
LZ6^Yh n6QIbmpp/44bTHjV\m:\wEZbBZEFl=MKn?=RGuVHHBYnbW^Fm!n\8?t1cweb/*A4LiZNHM$TRYdwSeR\
5W=bPh A#^SN#Kc&bFKpc#%ii@#QNHw#/S#$GHCjWZPLP\J/N/X9::9BA4:Tw8<%tGc:ckWR!%Y:tApwTK<LEyb
da?j8A c$p>RYM4\u%nkJe<4tAeCF<dhD$HBWYlYS/1yu!yPb\E\<#mTKTGID&c\ACDbSi#GJmYHnCcHpWD*:Qk
nQ%e/P Y^yqk#=l#&P>ppM!@GNR6XNanFXctlM?@duiHQGYc$i8P@TmyuH^#$>Y#N@VaW#4yY$1!lVh!T9+bjHd
SFMuA^ N!1WYaFjW6t6GW&H9L%kpb^dcePcM*D\VPJ6Wu@T*H^?q?\4uFjy#N=i%J!>wM4QRuMu#Gl?GXK\FK^#
y5ybB# FJdHE@D%<5$H^5II@bNp6&E4hX6TSy5S%MS8S<qyH*+EBQumN?:14$d6K/*GcPRyjV$^%Z!ePEC%FC!t
PlqL&A Z?Q^i%>11&j\$Pk8LlCjT46N/VDM\aXK=h6LP&>&NH=a5</V/iRXm:DPNRDCw+&YNkiEFLV41u&Qm6@L
!VPF/p KMhh>RPd&/ltBYqE^btWh^Zdw&m\i<Am<jB!5T99&:$>XJ1<:Y9RlDhP*V>paYk6EW!c<<>AIR=%#E&n
L16!kw wQ\lI!j^$GE:GKNA9jHDPWd5W=^t!<w5XWm8PyR8&B&*?^p<Im=&Wb6EB!cCPuuHAw=^n+5pC9up6/mV
B?=Qh1 8uh/@X>+K:8?b1N+?&SHY\^L#tKF%$ne=En4=$^8S/AdR8Adwl!4Qk=/*l!bLTqeH?y<Mu5immKuH?tM
!V#WFY PqA^$H!wqwRWjHTTM5u>E?4hK+jMkAF!m+>IPq5!hmQ^A5N6&@YqPRepd$jN?N8>S85N1+LRFV<nXmLe
Mw9lDy Z&!wbcCCM\?*?%E#eB#>kpWGnD>=*a5Hj!VPc&p66u/LjG*mGi\bNTM5m<n<AXECLqY+t&H<VWW5l@5a
CJCS@> clGh%qDw/=!$HpQ#F\BeBPZqGh*yMbqSlS9GnD\DGGPQiY*p+nq&aZ^6!==Qik4ecVYn!Xu!h8@&BWKd
>mcH/k aQhnL<Y#5@WEQ:LMHZFA#lKYpa@B8YmjB+PqLYN\BH<\Gdl8EFL6/Z\aCTGmw58X&*SIQ86NdQDq1KCu
nPyVD= LnY!>V$F4R<yhn8?:Vm%@NDtHqhyF?jtX/*aImqGHXJi!>YLylR<Dq$/5C?16jAbH<GGade9?TI$M@XV
VcJ^8> Y%1j&SA:qaLTAqKK>56wQlGAq&!mmGcB<<=X<!C8Bh=ZqPb5FNL8G1j1L/Vpw5JY!M%l6eWRF#?GQW>C
NIG%H@ y%/@cJ9XHj!\b5IQq5\bH%tqm*j&9*lma/QYIp8$9n&C@SDnITj#I#puw+qBj>p&AR9JX1J=5QJF%ccG
4wL:!M j4t@SEVnM\NCD&q6ZRwK&IBuZLC&Ed8#VV$ym%Q+9V8mKtdNG=R*mV5wdLEqhGMT#=\&ceT=e%@lW@/$
-AH<C% 0005b53056e001202b4 Page 184 of binaries2.zip
ZZX4*y S\%b/$9$\J4=L4QA9Mw*9HSiL15ayn$Wtydmea:+diG&&Iwit#@&b5Jp9t>YZHiDPVm?S4D8Pl:l\9S#
a^cm*J <8w4S@E?y!>a?Q!IERReJnyk%VGht#R%NQSkR\6SSJwKC?HVF:G86q*nHN88Z8GeDmPIcMdL#4VjQY*b
I%+5l1 QcYcZ\@6:aliP<I@RH>8:R+y5yG<>+T4Z%WMRS8PTJe/>qTGZ8w#hw+PlCp&h=Q\B?^t8I$DL<NXaALG
69YJuK a&8E+Q8WZTNYyDeB$uF^$#ZtdX54*+w$wMpu*T9T:4jD9K9Q!?YLJCwh%bueNS%VkPIBF=<ql$bh*^dj
RFSn8< 9#nWDWGpj8G5H!my:wh++&hXMwW\twAIHKJuupH:PmQ=&S@ljyS<F^XXYcFwI/ZjiIL><#m>+EVFjEm5
@n=kC5 +Vh+RphySKWS!Xkuj>VmB@S?IT^FQ?iahi^KRaWC<9!ht=*R/e!c:DXG%LWRc^Rt\JmW=I99nik8tp1n
wyGHNP Fh6&*^XFh@am&FteSF>YjZJGF!PkZy6*DMVaWuiWbq+Zuh<8<LbAD=Bmtw#CTq5@uwXFqIe*w#ah6/:c
+bJ%B$ Y^=h?\yZZIL&QYDjMWJWYy/bDlHhiMemTua4EjlTid4n^HI9HHGjDuHj*M?6Z@9X^MaXm&W+K&P=%Y9t
&NM/J+ ct@=mMcwc6?J<JL9dCHGGLdn%bnuHI==+TZSGJ<WYRB8YG@M1VhE^bAD16bPLI?%Fa$Aw<w@S>=Ta@m?
aiH?pS e=#>$n@KeSR^E:B*kwaeJ+&JYw48mQSKI\:@Pn=G=mkJFnB<W\yH6\i+hXm?HRDiqDSG\*1HSeEjmAPK
lT6\>4 >6ZXkNB8i%5!w^jWpl8ttK>6h+IYP/aA6B&KSRZJ:QCcSjkFDNpa6Bpb+Z+kW$^PK6/<aF6Rn1M+XRF<
mDm?q6 h=qa+ZP/DW^D5YbIh\V*=BcwY=m6h/M?8IcGHqG5S=<8:=WwyT^>jm6p9b&X!wI%CI5DIaCc/ytlZK8H
cDR%hQ BDF>kV6%un?\DkEE\AP4pZ@EpaQWeheuC@KIh1GcHj!S+yBj?+im>w\XT1\DT9TSd\V@:*th@94p#\DQ
69bCZd 9^\S=uuE/>V6%%>!N8b@CF9@yyn>t+D1d$/JIMmjuRJ^@YtVCPLt?a?RN9k@DDy@9iAG@5eLNIP@CHw<
Ph$/6^ j8$uF?jjCZJ@G/@m@l<:>4jR&K@@@w?NknmAj::DAaH<?aL:#*iAHH</1\JBj@ab?Ke*I^wI!QZZ#@=W
mKY+XQ j9%uX#ua@$=B^9Y:49L<i>I#D8A@T<<+kJB@TZV<l/Qku*9?D?4n9+aB@!HA!MH?t>Dwu+j99?aA@D+8
tteV%D ?$j5<RqwL6AncPBV$JDH$KCuwIGRS>Dky/DbH$NDuwCGeQM<k8b<C94Sw<d%FQTnS+*:KYkR=!Nwu1ik
Fu#Mw^ PS=Be#!Fc!DRI<ie+!qei<^5qwQnKX\D<uA<ku+K%+Cen&*:KX\DQ1Kd@pN!>kV$I>:EHB^Q+h1ntSMe
9%kIZ@ HE<l&/@B>BE$>@<K@TT!AS<lPyD>6=Ld@*d#V=VeA9?\$?WtB*N!pwN=&J<k8j&QiinjtSMk+H?iE!Ck
i@w>#8 j&%PkQ^%V9l#W9:QPREC@P&eAQ!6Y9t9p?u@^w$aCAcTe@!/\MG@BqAPMNiVD6$@beD<iR4@&\\au9?c
XtHyKJ AjQud9=D8@>PBk#\h^p\j&R6@X5bMGA\EQJ@M&D?LkPt!FtCISc^/k646XhdHIAT@X/IL9$9WqDDh5&!
%E\l#+ *iYn&%hc+>CHGu>IRa*c6/>8H>4HeJaH8B*!6&HiX*&wmiKV5^c*FF#@mAiZJ+L=ZaNj&Zd6YkS#H*DV
q!in#n qwk1khZtVD\>k!j&WRSdI6F8HmB/w41NLnbShw=FaHpASh1Z8H>:$m$u4@JMT8W<q14>FFaNl?Yp\IG8
C5<mwJ 1w4KBHEkTq!FAZJcpE:WWeZ+NS^a^q@JYDtFt@N^CH9a9GH\GGSAM?SMSh@TIC=?!Dh/SpZeSXK*6m5p
GmJL/! 9%<@^VZm\8<l$qAZm6\5M&RNGBjhF<HCWWwyZ$=X1weNqbXZ:\WyVW:Q\QA1DFt\h/qPEW<wpX?wj8Ei
lj6m4X :>ZA@Ck@hTHiP1E&PTe=QR!^pM/1j<8qyaGtEe*Y+TpkIne@/=C8WuZ^Nq^nwhEmpqbhw*XCY%yhRM=/
BY=\kI ajwPbMC1Mh#CW/Z?En%IqSP9%G:l\u:BjJqVI@:Feq1wk6PZ!:h1Lt1cI\PPGy:udjSj$\^Pt=iupwYE
JW%6&Y Km/b&d#pQRVi?1uQK/nF4q&lZckcZ*n<>Q>&YeVe6JLWmNw&P%9bwC?lI:6p1BBB8uM!qc4B>*bM^^E1
ndXe1P Y>?4!Cl?JH%LI6p<4iG8pKWqbTqlNGN/8G&%b9qDlKEhc:1WmSh?^QCmL4?TyYF>&&w%!&6Q#Vc4/e9T
*tVa:9 nAqZ^&yi+^$GneVhLEqRE!9^<*clucZbaK>^QA8:\P<<GlahZ*nVaV@5%X688&>\YS/%6*^Am?nhicFF
X!*NMb WGLLe>@d:$m<q#^RBjcFt:u\<&hjPhP8XuC&iCd@5&E#<$w1A$CWuD:6XPJp8P*JRmc\X1<j6?u8:Spe
\da1ce Pi+n$Ql8B!!w?8Y%V<&=!?!L:KP&w%5!nB:HhFh$bI$Z@kR#F*j9EQ1^9Gc?BS+MH=YdGt!@u>b+%pnY
lN&e%? a:1d*Z$8X1KAnIW\4K65!^CRkB6Pajchpy\Q>MwbGbuadVtJ9IhIKH:q1yPdCYGEyA=5B5RTJlSBG9/I
XZypS9 EylAiNm=w+K!GtkVM9/bYEVcC5&p8#95iP5=YNwL\^R/MQ\EuyJKP^#LXPR5+wTYquR?Hee$eC#!SJL^
mqRCD= YWR^utqui>TYTD6SWbHd&wGP1^L:uCSlG&L55GYM5m!RXnNqikb=T5&?\dRM6?#nG>=ba=dWZF4yjdLZ
9c=Yc> MNLP5b8h&EW5yJqV##$X$cL/G:b1M$E9ElTJ?jw!ecmI#&me1*dhc1/It&hj=Hq\:Ma%Sq#Y#Hj:JTa=
J%eDCH >A$P1DCa8?ic5eTykVLXKA6Cc8NWDdZaIP8@49/YDJY&pF4/GSL1<@\WqIXcMCj5b^4a?kVZYYGyBSN\
w@iI\q *t&:%eHd>PHLAY4L/bbWq$Yu@l@P*/mYZc!BtybDCBkeSZc%5ZB=SAtSwu*+a9yb11M&%bF6dNV1W&q8
:KjeP6 wm@pm9wI6y=Xy=>1/w:d9PVd=K@Ip#M%Xtw<@p4Z/b*>jp%eAd<Z6Bt#p^iLLDhit5>h!4?ReQlecC!#
%&aW^# mj#N5@C*6b^TWypL@KYFCG>\+t^HhikddGKGm&t?^w:n*d#dwKw9^hqnXiJJ&W@BW%S*i>a&4YYkRh%6
aj68W: H!JuY!HZ1t<!q*liJ4&wwMqbTYJtaMQ#*4FBe$wJ6d9ZyWyn6FXL>@DSDBm@=Gy!^@p5W4PD$MScVeY@
G=69e9 bMBpiMSW5XiN/m\JYB*C=Xb^Yu#Gn?d</TBS&1BbNc8:bQC*DBk6dRAL1XWt#ciyJd8ZV6@lPy8%$Nj$
Jc4JNJ >c\eaZwLjNQA@L#q5Y:jR!hc6SV*>QWTZcNV&%1dHL<dLLX=jR?hc>K$*j1KM8J#JLHdy8S:I5uu1Xe%
X9hQa% 5@>Jc@VGTP@qC$PDI=ct##?Nq8:<n&GY&#EMCjC#jkR+T!J%c9qDDWeQ8NWaauXyK/+b#@u4wlkmhGW+
LS9WqX wb55caT?T!Np$ddDMNXZmP\udYtdF<I%ZVaIh+G!DbqQJqnZh*nyEkQ5cH^>88:*M9+wt!e:+/DAVD+\
:N+<qt <XSm5q?Cmtl>PVu=NHT%X&5d*?Jbbiy*iDu*/&ka<+Q*/Yh\XWM/ZImY#$a!9&tc>ciDkF5^Z:L/<Y&H
YL&Bpp M5++6%EQM>^Td%k!Tjm&q>>q8%c>G6e^E6dXn$/9j^+=RI!@8V&Cq*<mGjPBq$4cS6?kIDw8duLSCYp*
hubQRe cLYwjm8*p>j*1+&CSPq^ZMEu+m^%&&Ya5819FVPLw#@6WK<1Gwyc&u!ZWQhnQc1QPD@&?Q+$66h41cu>
8$i^V$ :nG@SGbtH:Ndi!R+PLQEJ*dIp86?&Xm!tFqu>^Y649V!c<=T5=dqJn@Tt<81>R>L@m1PyJG6VdT>Z=d1
9\SZk! 9QXbhw8=5m<?9QmteQV&\wN4K?*d$kPNw%/!>#uu<5wdAl>Hi>I8L\KW^neI55iCNC:NSRq4!$diB?le
<^kQCT jX^N<B?I4d^P$iY99S@wNyY1jScjG@\qA$beLN#E:/Lc99$@M&Da1Dd?M\Ptcya6JQ*tk%=48CnHuXDJ
/<6q$5 lTGb/\cDXJH/4F%@C@*ZZiw4q/qL:$bQL%w:Lp*k8cP8*EL*uLYCjp4!aiPEL8J/Wdk6X%66<Km8&6LQ
TN@Aw^ R*AF?JZ14C+JmB@ehCS=p#iB::bA1IGS%@Cm%#NK+K5FReBiN9PI%<CMEyGZjkL+%Em6YkT+AaE4=Jn4
QXE1^d qEKj&pd%#:/+EQ+E%A4YFulZA@uE6j!nKbnnb5+tPZ6ujjdZ?DZ$<QpHGjP$bZ9t&dDT+A&bWwlHjPuF
!lScCn 9iQPV#LHYL?nq18d>JXdI/@DX$InEV:6&*j/m=>j6e?e6*5N*YNiyZ:Kb:qhh?uLw8ZReSP/*eKw!B?M
du:5&5 ?DuaA##!i^j<ZFQ+GMqaAK1GFP1aAy1hB61bAd1GBVwAkJ!LKd\=ZWb=ilT^he/ttDj/MYqk8Ali<ZT\
NY6&9# N16M5\m85RYRD5>8Ai>5A%@nAH@5k5D8Ad<mAEPBTiAemMkim8kemXkVm*memMTim4l^\^YYDF66*ce$
\/p+b* iDLkicK+htw#kn\Raak+uii5#+CJm<?cWqNDlDCinuw<kea?k/V<&5+JHID^=6$S/#5M>9QI&T!p=aNh
?w!Syp <WKM$^\qhiYXa=JPM$\ZJM#*cJkuYFkeiFk8SFmaR#DKe>keNNnPtVBX\<hqMZ6didqIw:p!6/i!<uq:
iu*#*% PBmPY?:56<jP8GT4dZk8Pun9DjBPVQA=LQBhdQC^!BBPGAk+QNCWF&$\h@a4TucLp8J4bQQLiAkV+FAm
wy!hkl 4lPe^HChMT>KN9Ga<WptuAleKwqQtJAGyLMb%JiQynCk:\B:GVGjad$wL@A+:Ek=bplhF9AT!$t\Xy>n
Xb!a%u ?hwj*\VZFJMWYq?^h8K+:JJ^nDbl\YHX\yG:IyG@S!A>Ycjk<Hn8IpN$%LXZ$+%1l+L\uwJCqRZdqjCT
/!E999 HVG1Bk@K&i8QDBmkBL!#u^L&j<&A$Xj5P\FR*n\kPn>WQ>D8C>GK@1CN5A%YjWq*GpkQDKW*P#=$=d^u
Cn:tER c/hLTnl^VYX\uGGwjdNZt<9ItlN&6M?+4:\dX/Q1/5JW&<b$&pE=YlNtReiEQi!H^h#4tMXeP<bT:5V5
lb:hIE >Jaq/R9L=BRl5HEh8QXNhb>pdIqX>a^=<kyHhJN6<wH^DQw8ca+NB*ubDj$P?!iHG9:mGjFu%ZWkD8YC
Gy<NY9 G^&!!meYEBL\8\KIPi!&nk<$!kNG#RVYTY?/!R?=ec115WBaQCC8A=A#+>qpC\mP:RcPE%nNlw6Fn<6N
KGC1?/ q\FHmt6pu^8HnD8PnZ5Kl\ihlpj%mCiPkKh4t>56F/m/!yXe>8&5pN*6BS<4E?>bpDdwA><IGb@yPt>!
L/6%k5 @@yWJ@jbFEj!HI@d+qLhMC9PlCDIRiD5uiBI41DyN<G/C//#E%/*Q1GDR/GkL$LVmF@1ajlT5L?1E@Cj
^>=K@6 I+lWVAl*LaukW1?wp\ttWIpiuImBjw1=e\?h$:Pp5Im#+Itd#wuZ!+?:K:Pwc$na*$uW<annGk@mYpCt
Xq*N!e dbjWBaVQdcSaCKVetcV1@jy^udnXR/Z6Z$4Z>e1kuWnn!pmjb*!8V=W+#^8iLydFLi864=bnlelM1<ul
MlZiD^ N9hMN<t#+Mmih58jV!kAP?YtDYnP9!me4!1CN^Zhh^Z4D^ZQV=VAF$488<?u8lunt^k>AJWceM4Ye<wN
Y%iJY@ 1NERLBZ/elWQ\mkI1eyPqm1EPyLiWjNaNe:KMe5t/45Ga@la&:M!NKT6J4lWRdML%4\w&L#hpnTI+k8I
-A6pW\ 0001e2906da001202b4 Page 185 of binaries2.zip
*AK8#% /t5NKSSd%\eQR#e<NR!qaC&bCLZEZ5*%hW*Gb@pRGa#Q/q+iAYINIaXaaSWN$9dn?V1RaHYInYbWZQti
yA=J&5 uK=$1G/<@y6+PjWJMV*^ZNZWu4DWAj$TE@&L<XC<GRN4EaPG=cCGFdEGj^$<NEN#LMPGjEbITMqi%\ti
AE?+^4 Z>bMlXY<k#+d<Nkm/RCD69npyWbCKb!6BN^+1**ym6qa5EpyCbpan>H:t$TIilti?QGMii1qpHEn!J!n
IBdh#W !h!X^MJV+BqYu?/ap%dp11XnuYF*9t/cAhyEVtuC<4YXq*FD6J15lt:DT#XN#e9bSQQbb/YeS6kZ&tie
69^^i8 &h!#QG1yWWWDW=cKE&1eH6m:#Y<$5k<kh6bS&nbyqicN^wY#:Vc:A@d4kX1ep<YaeNd+9ZCc1imZL%A5
Nkd15= ?K\++1%u*>4mH%!MIVtX9ZP+^HD$PAh=yJ8t&Vyyd8li+iGt&4<Fpyl4K8qhCmdS4?9NNnuN6n5V<Dp*
Jl:H>c &nmuFXwltV9M!ShNZBc<n#6\d6hn/LNMN*Dj&eX6pw%Qk@Gwc9Lp\6PPX$P@5wLqlLkR!GAEe#t9^*4Q
ZhmNM^ i56C+tHG=I!<*uB!j4EJ=9Htm9iNYM:&!FHY8NP>1PGGuBlCVPm9PtK$&9&5nQ!cly&8Jq=ClG?dF9#T
%kjDSV i%@8=L:$&qD*&u%XMQd1/qlt*W5?DyHG\<Hj>w8CNqJAM%4AGnXSWF?kN%FkM&ukNWWRN$&RN#$VJVLb
dBTD=F cta\N!Vat!i+YTD+YmTEY!LEY!cpYTHpYmYWY!QWY!i$&TD$&mTMY^tHt!%M&!H5&mYe&!Qe&!i<?YZ+
uM@:4T 6XJaEFI\aYBEe&#EhYIph&1p>+5ICdLInN\w:5JkT1Rw:<1wc=*I?elkcwQw=4dw/<+a14=wR4Gw=9Ra
nt#GS+ :aqa:ypadpm$Nuk1k^6A8B+XlBd59StXISA#j^muQSLZ9B59mlG5@VQ8?mI8RmalCCZiB!j&pC9a?$8\
*XR6k< >q\TD$&T&WVe@FZC>XqWC$HTD:bpH:VpVIVpH&IJ&n<TYnlT4kYTMnXT9chmt?&C8XiV=l>TmjAT4w?T
5:Hb1A M&YTj%mqbGKq/L^I!=SK>%FInGXJZDCK#6VJ=EtS!LTI!<NKYMBJYTlM@?GR%9L!>a@A%=qethhetV=6
G!CkAK Yi6V1jQlGdFMeV:=KV@EEu&e+u>A^T<I9Q*lu?JV@FaHJaMmM+$dqQkn<R*Sn/\jiAtbE!p6H6p6yXqE
V4P>yD dtp6CDp/D1>>QHIY46/%W1St>pd?MEq51RnJZMlbSEyjSH4dMyZ&A%JAnBi@CCyw/b<pmu*nR=HH1=P1
q$:!<K +=JQ1Je>d=Hl:XHa/yCpT^j6e^JQbBGcCSQPc^NP:QXPJLQwJnc%icCWN:4pJnQ/^1*kpK^WN:uEJ:=M
V5RLi6 6:L5=u$=d$Q\VYT=d%9=VYeFh*T$%8&16dVqQFaq:$!q//hH59V?I:n!n%q/uECi@%5T/apqpbn@=bJI
>/LE?C &NPB*CN8Tc$kipLH<1LXG66tP6b%YDkGS6*ZBA^:$dmj+W*K=95DFd8J%@mX!E8l1bVt8$cq<5qF+MKW
6KIAp! I8d9R&F!ltA?tAk9D:YJIi:klqF$KANDaEJKTPBkELh+lqS&Jtlq1VIGJ!Bw!4n%p5yh!#F$4BW4HRL>
KBbwMH %=ayH:FM^SuF9/6t#L<QDG+l=wlduD<JqM<c^S@5hGN>^mwmVn+Mu!6in#?b#<RtP*AWIeJRpC5<kVl+
eeiN5@ 9uTJ??pkj%<=CuYhjSIM#LGeuLyIWIEGaeR/u<Fl<+E=bLEQ!YDAVq<C<N9ElydWb1lIqtSnk^Zi!wL#
@P^+i> ybhB5\%wp6hV/6&Zk&$Nd@Y$=!CFlcb#V4G<h>GB+yTE>WE4c5aVW*IqQ@uaQnSV<k%<?ED<QnCbVB^w
EGbcV^ ppw1!SkwHDXWh*=w!SQZ!I^BPX*^<@1ukP44h!wCFhPSVPwa<:5P5?/#LKyCFNH*R@BcPBjpwHZ=pk8\
iFBW6w W4TCIT^M#Vi1kibwce/N5c<Y6F9XZ$u%+kIBji?$M\w\#E%4QS^mhVH5Hm!5aK!@FXtjK18PdWFJpAc1
R4#MCL Z*ewM*hpjM&MZtkRY+h4$?ZQHkdyKVAq6KjZ/SjC=@caD$8pl=k#GmYK%SL!k?uRn%iTDk%w?#G8Sb:L
c6G8Z1 L4=!WShydiSlSRZ/NaPG5Gu+8iWtC!wt/MENW1!8T/?YeV&\N!EDdqDC*!<@CikJZ>ch<kp^i>c?W@9m
MhQqDa ncjRKRq!tnWj8+RW&@J=+dW4GP/9TqL?BIp=Y1tiGl1b:Ia<u&J@PM&8+^%^t%R1Zkl>>tLG6?6>YVYY
?k&YSi $!DC%9u:Y^cW#5?J>XG=a^T$Km54%!GR5McqEmi\dKEC#ih=*!DpSw$BHZLl>hMGdKyliWAl1*Dac@@J
j^wZ^B e#Rlc>m^?k9GSTY%NRFqkR9GDAHEZGNJ&jC:*HJP:\Hn%b@YtJ8KteXX<Z4E&cKSyV?cb8<:a=#BSqa?
jt#:Gq QXVeGi6aW/S8NkaIlSKM#&Ca*A^S&C>+CD\6WZ@t?ac>%Pe=XpQ8^4YAk%4XI?6XJSRL$WbqdVk1%P#F
B/$#C4 HFcZiFWFIHti\4/1W5MPj<LVVVnN9m/Ti\mPidba#9:Gq\I&Ck=1ISN/*LKmt%>X^LcN8uLc6>K\i#IF
w@&uWT GFnL!QY=XL+HHVE<q$qGVj4bCDk65B@PXuc:BEYBPn6\eLXYV6m$WAR&NiqRX1%lX@W>Sq&:RKp##$jc
tD>iVE @q6KK4>+y?Wp@L:#6R%K#9SnKQGkkFLedGytbQR$Q9:^qi@=Bca?%VYak66ilAduiVEViSDJ##9^?SEY
hk1Z#P eW+PY$H>FR6tL/y>em8QJQJqcE&$jYJFbyXy?1eSKah=9BZ:eh?hD\kVDp&qVDk\C<CJEShHa:%k6dtE
?cbk+I ?\#:kqRPIn8!ib*TB$kWGRy?9Y%4Z/LKGYi=9\bP5l@lDj8iTnPW=11a>E=KVabu#C:%*jqyQ1QcPyl1
kRBXDZ iDJmybt+&NhJjt9^\Z@!&TtMJ41$WnTKD?cqauec:TEJmFlA?hP#44=/%IJwDL8?VlmcDNikiV?T+FLq
GucjHG EW**%5^!8:jX<R$t>aZK@yP<t&E=8XbcMHKwP%%JTHd+=GYiF<@L*5lE88Kl#^Rmb!@dj$6HhhZ9Gumi
%RSFXi 4D=b=*qEnptY#mNlEGT5dyqIK+p:\teaLScCiuLK?\NEmM@8FJ9$WyXcdDw6>ZY/cbR%Ea*N=Tt=#5t:
:q%C<H $WKKSQJ6?=pQVRJV&EyLSRW&DKc&QNLNeGV8&9wFSQLPmS#*qGi%QpY4!amhBcB\LiamVcRlp+Ae@B^q
#9c?1q 8?haInPe%H6q\iac95jID&&!qH!l\6PleR!PbwDtc+4VRH*G*N*Ze:Y99%:B4=5pb1VY*Z@45/VeS>%d
h1@+Ca dpSkpYiWIGZdkW:N8nnCplB?$/Rl:hXRLRH*:p1=VAH4RW=:pk?BZuRJ6@TNZJJGK5$TV4I!6iZuuEC#
!&G>dc Q96<+tNw?!=cilK5BCj!ttbY/wA96>ZL9DuXEjSDNYm5tnTm!eM@8>wSituqWYB:k=Gq#JE#Fc^pH6=k
!Vp5T8 j*iNmp6WX=6SWFFDiSdT\JyZGDAe#=L@Yw<&KddRK11aWdbL5CQ*$A#%y\q1X=$Xt+M?SL&mS?M6d&u@
A/W449 V&F1PIGeXJL&eTVLZByQP/abDu9NGZaPnb@M6@dhq%Vkd4RcqG<K!+/Pt4+\Inc*??ac<Ct?%XB%/4IB
DptE<: X:MZ$lP8d!t6Lh1KJ\t6WJpHtCVK6HL1R^N%=46XG/kEA?SuN#KJ8BTH+YR?%8P#Be=Dy?P==uR$Mke1
+QlNb% PhL*&ReQ\Jw*CM&eb9L%*4/i5G9wTI<cw!Y:49i#hK%46dVqap/iIMLP*>KNSB&hD\e@8<:<ti@a@JQ5
1ieQm> ?JA8w+:Kq:@nL8!C#jN/DL&yiMtmnaCPLejbdNM%::ATJGB&keH:Id\Qi+@Xk4tXmp/DRu1$P#yRCiPt
:iytpK CuS%cZcc#eb!cn8+!^Z/Ik<6Mwml$YwFh&Zk#L84nJTjBHTRYNV+E>Ddm6%w#RuJa5XW45G8<^^C<XEK
>/FiAN ?^F$8Tmp/&ZD>atbFnm8@8A8K=9@k6P!y1wF^R:>Ept=RTF*p*Dn/lRN41wiNN%#wpbuQ!dcS>XZM1dJ
Y>9&&1 #Gh?8MMIZZmVe?RTN$IS\%Z/qd*&WAqjTN+t9KIhJbXm<HWGe16?WC4n5$Ym%<t$!h?5<XVRkVLyH=G<
y>8lAy MXW6hbMFdXPqZ\hMGp*hX6=ZKaHpGCZtuXY8CyTihYChW6p#w&m5tZL:q<HVK+\:@yV?4lKeA+iI8quw
ISq4JA 1:<dl&bhq4FQt#RP@St>j:::1<BICK8\9bK6bYR=Q^?=QX<+5c4>/=e55\I!</BC^q\^X4pwRm<bVp&4
?w<&In HQ*TiX*:%*t:=?yw#I%I!>JYp>I&c*qY#hwl4*N/R$\V@PVRKk4bXXYHnN<mNLwZ1/KY*pGn>%\WF?Wt
#a@LS# !N>6F@SZ?hYI6<Al1L=pq^Z5bj\kP=5pNVkAI@8Tj44B\46R*9V6>uSe:!a$!+$#w?q<IZKCM!hHn:NL
k\8&G^ PdHb&J6h5$6VM:CciIYhpuc94Kb/GLk@Sn*DYq6P:m$tQZ=t1A1TiIYip/J:nuqiI4=>d\A+4Ga>:qRt
iS=YKd =/5DR+c%A:6Mli^/uHpDRLZR8BB#lAeQmR+@^uPZPmJ%l\8H4kp#/wEA\%5D6lp6b@E5w6WQFZCb*!@M
H9nn6M Rtpj<BY6t9KFm*MQFjDE5t^1\nSe^Xw6j>1W?VXeD*cNPj/QE&L%5qTw\WN5y*ja:>uQcZ\I5Ra>5Y^I
9K%@Z? ?*W\NpQ^LNit\=J^Peb4PRL^\^wIE=%I#ANW1tMMC1QCXK4RVkI1J?^yZJ1kPVIT1n$\nI*4ajy%B/^#
luX^QW S&?F%\Z>=B1V:X>:T+mmWZ5dmQHKSh+YYmt4$:StC86i&81KBXh\H\A:8uaPWd=iweXTdlQ@:LDCh+H&
+IE\8@ p%dMH=amQm441VmwG89F*9l$e=!mY5b=jql%c\hR4X+qn>C?Kml^h+G?hTyK^iLXNB9D!S@CZ4H<FkQL
8NJ^l< KLa5peDKHV*6L+Qaca4bYjEeTp!db5$$k>IcTn1q9P5nXaB6ie?c+AF4?Vk4B*RajX+eyG9&a+C%JHMQ
6cn$T/ XhJZ%lXL1uXH/yALn1A8KNHQWKItRGlLCl#waXF^eVXWhl\5XNEWynNm?5q4KDWkuXtbDuSXT=+WMBkk
=6VK#t L54Pc9^bjPW96Z>!dPG:SyEAI8#@YQ6uMCukn>w@@S%@4j%#%599N5BjN<J@NmEAtlF\Y^Cw?!J\6mwI
*Wam+6 &lS$&^Y5P^R<P^ECZRm=uRJ\:9mV:+SYH+VBWMIy1ACeZtF%PEFeLH=*AyF/ElE\nck:uRk8kWkKqBka
cR4BJY RW!hT1!iR9TeR&TcXPmeT5^hRZ^cVuS1X^m5\V?6I\LGE=6tEuT*pJmYEE&iEK@dFK6ZE5X%En>*E/#Z
BF6C%Q Eb8YpVk*pV1ZEpyJqZHQqKq@K?EiLw::n9@5F9&<W9dZn*1^5DGWdKiZ*HpHkZ8%uH1YZM/SQHlC:4^Q
416B&^ #l%B@u^K+d\H@h^D^9&D\9q:liqPPjBd^jwJSjX\^jM=tRAAWe1EdQ&SLASL$X%LPcXdj91uHQmDKulV
<LAl&d %Z%ApB^K8j=EDuhG%RND@u^VCA>BJcXh>Z^GI8YL$k!WKkSQ6jNByeFAQYXjD5Iu4/Eqpw1mpi8qmh8u
EF1Ict Nn$ml/iln8im:6+yQ@&ktY1qhucpul18lS88:8GnAd:V^mQSTjtmmTiujYEueI/q/^E8B*FVk4#R<tDT
WJqaPj $\lY>\mYTP*W^dMSclnTe%@Xu5uX>^nR9BnTtF:XcKkV\$MSyjA!\5PSh45T1b?TBS<ckR/NNd+b%^id
HmdnbW +PQw+!/ayH+qTp$$8cSRkMw$%IA#T6Wq8&R#uu/uAq+\==R\>=R^d%R\9%T^+NT\eF8D8EYCwZ9b<k$=
-AX&&u 000410b7304001202b4 Page 186 of binaries2.zip
<w^L+i 1d+#pN8!t6&BlIY4pD?!:4+1u*WChj6#iu1#WuN?1$M8C>1&dE!lh8d6Tk+RZ#FEIq?ED>yCDQltTa::
%DQC*V ?:yB@=Hw>@>TLmmR@M>Wl*<%F=RD?M?yQ@?eA5L=YI+dpQ5ycM:H$D^QRV?YyRbmj\4/EZeQDlDHE>AR
#J>Xik u5jR\KikH<5WA+Gikka@lka@BR%<=JmDIE>BQ?IF\\HmjAIc#Q%a#=@CNVDZa<j<KX\Dk^@JpAM>lY6k
lSi<D5 +CNw<FP+B8J?=KmBu<I%ECj+EjSV8AaCQ+b?C6h?9jWI?mqeA*K#Q+J?C6iAn?:*W:kGjP^<k=@C6ee#
utkQ&Y I5FQIh6@#a#:i#VQ@\aNaj<@qbkH+8EtB*K\@?Z/BkKBV$uM?\j91Q<HP<QDR<:^S*>?ucp@?9TW9kD@
BBnh#+ IWu\4>*+:=IE@%ab/!>Jk6!@pS%\@FiQ14>q:RG=Pj:@SMi6QQ\j/<E/Ca^IZGXBici=kHpulkVykmV4
:<eP/G =Tyh=LjQVDCyyINaCGN6yGCpd<Pp=GPnQecDtkP?GMbPl*bVXPCnI#?VKq+*/inVJmiP=SGVRc$%RKRj
?F8YC% B6ZJLmP:Iiay:d*KJJB5N>qVkk@PRqLNRa=*6Z:&!WE68:^<NZm+KqCPQ1inpmJCtS+%YHcn1VI*\lkZ
e*RDXN #j+DeCG5=Kc4NI^>!DPPC<*cDnWMQT?:uAp1mbNSPKyH>n%#wHABMDdjh:\yd6\6BBi6W*aH>HqXYJk>
C^XVlw BEwYnI8PnhnFE?e1:\tYGm1H^bY^m&ajkbLJ5e*/iIkL#1Yu:^EpDQ6i=$wC:##+/menCPc&YqlNH:H&
+1waEu 5=u6PEpwXw$FHQ1R5DP8!HmKD*$@Vp<+bjYpiN1AmN!KFdW5T6+B@6k/wlyTbh$TkhT9LZNIT15Q+=G!
:Q\HGT mIkjAyXS5Ye=yejj5wlQ86%lN5RF9:Sm=GAkX?:ylCnAQi>dXWAVENGICSqkMZ9&HXeXYBmA1>^\V9i<
\C4pik p8qq9q=@tkRiLV1?:cG/dK=:4A+Ke\whCX!>>#:q+Ju6=GcN/*\JyTLtM?Z1J51<Q8lRjHW?Sqb%+mtl
#4m#Qj 94wi?<=RtL#^94IaZN4tV4Wc*Xdn@aKd?6XVeKl>hdtBa6@p$N=C/CwR8APehMeW=qa^5TND4E4dl^Nc
qP8S\G ?kEQ@aqnQ$ahX%@L9ycK9:VLudBNFn<meLmT*AEKdnS@:&e:CPb/&*A%bLLK64Zi=BX!E9CdP>9q#X!E
9>H6&= ?mR/^nQWYqKS%Au*cTyy8<pWL/&J&u1&h$NPRA<PMX9<H\W$FK<=mePS&PB\&uHe^AkE*#5e**!#a/KT
DS=\Fu 6Ww?>eNFP5Alw:QmwZ+BB$8w+WF9XtFwaDdB#keu%StDk+E+5Y+pS1X!JY\G=#t8wV$RI!e/q:CXFCH!
=J*y4A NdSe?+^l>qJ%5m<&YCuXQ>bMilq$?jI=8Qq<FWG>@mLB>5hTX<ylclT:5yaRBW1k/EbmNbVT!<H6RiTd
pqSPuM 1\c8:N1E*6hqF=WX8WpdIZM+PQB\FdSyAbcFSni+Hw/b/6CALSNDQXh+td5D+jGhZVIaCulylXCCGS/+
QkheZ@ d<!w!y$mG6AltG/a?nScATM1NX8TRRuq!>L!lpnFTS9=M&cEeJkm@8@J#dNSwt4Xw%=lWNPWZBMIA%XY
D@QTc5 ^#HF66DRXyhiG!5FwjiWmFjN/pMBnRNhY:YVY9MT!FGhdY!/CPP?W+bw1IXJ>=X!&<Gy>TmGDS!*mInB
L>\58G =mdWc9N?=u=G$@A%8*Q\%DB<FhAi@m#k*b1/R+REQ$HQ<ZC?VSDR>lPqPEJCa!1qQ?1R#X=^8A#<WFDV
Weml1C C+8J&W:eb!HaRG>Qta5<MYQhdD\VJ@aKTe^PLYZhnYE&=eG*m^W%i\$$MHqJ9WZMI9m?Z?d<@PI:?19V
&9\MdV %@jJB:6?JK^$Rqw\qYZWVmdkwNA5C8HeTdy>M>*i4+4u5/8mD4?GwQh?h1itq<=JiY<up@mitypt+^Cq
ePa>l+ *PGNDdLCS#\\Tdh6W\n!V9Pw/C^YEylF9YbVSLG@peTcMXlLE4hX*96<Ty>/KDNu$1wa8u/YtpKH!Y/Z
ada=jn 5GF!$u\!$MtB%eI@HDCENbVZyEY9wEwZ6wPMb/+pbRNwD/Mb%?988hcD/p1H^%jN%!I=#5V/HlPEqIR/
iII@By RMThaA&wCQaXnw+H#<LH6R^&$D#H!RFYqWh5\hCjB<4MR>t\Bp+my%%bG5t@paq&$W\S*X6MCKKGX>4b
4FH!Z\ cWZkNq$y*qC6Vqu=$DH+SV>RQC8I$dP&q=9HaN&>Y*y%6FY>nA%a=9/mDPG%NVt^bCBnHtpmBX^tAa%*
9Yq\*T 1dIHb#G\^R:/>R8qVkpSLSt<!VDmCCKdNmq#/\N<cp9Cb!\#Ni1dFh\mp>>5%aquG/Pw?bjk=q\1VWWL
cy?TPQ N%8T<t9ZRyc\?>!4IwWtM$X9b4@I5IY&biL@>FA+IwwY>Ym4LmAIY#Rd@M+:CT%CB:5SI&PByD/\G<$B
cP/DC> m&81QwQQPAMWZEl:4jt8>&$m^kceL1+YJGF+kYWXH/=G4&^dp?ZVB%tcCRL^ZE^Yk^+Xi+w*ZLDHk*ba
uJ<qDA 9p*iJ4G4hpwIC:Sp4IS/tNZL+HKtiRcqI@yYQpb69T=>JH$bWp<86@=$a8LuVwX\/IXupw+KQ<nEB&yF
SQKPlb !jIL@BZR%CZWk<d:W@d6tTn=hC/!t\l:T5y^eZp1P<Ml:GuKDTniJyW^qVR5QWG:dEA%&eKGh#RXCSJJ
uBc$@J Q>TehlNBYLX^VmluEa\YeL*X$WjBq6HZ4#56VCYIy^QTL#lXV=RkY/EelT=q*=IGBTLXC5taGNT*8^*9
yWSdmj HG#&EZZq:8$%YywH?Auw/</TiVY%A6MatV##F=KTqIclqEyL=@Y\u<tn:R65&uI^wt1p$uaQTCnb*dHZ
edY!Vp #wu8#R^8RX1Xi^dFT6^Re#N+>@aJe\wY@D?^$kyXE^i$1ilQ9T:y+cwyWaFHja9PY9a%T9TMIHIGCn64
B1LLju WNA:KPRuQZ&$dXlL41+K>pFSHu@!dEW1uHN1jbL:>KqM*XJkIR$+%cy?VXy991@Gp/9u/&!hCCKnX!:E
NSQy\V NS5Z>hSMY8MaGl&>bZ+PNaytMpLJ:pXWE5p:qh5&Cu:9SAGKhXR>A&TiCp<@QCk%udJ=D6^1lpy$I^4u
DY=ZVt >$PmM64YNCKB\q/58ub!Qh:e=m$pBRwC9tT8jJmXQ>W+J<?1RT^S#cib<&bXt&h+DNuL?8X9CM&aNIut
B:cwcj +>+ZynIL#knmRIE8k>J%ib@S*YBPcpC4184/>N6KebVbRH>cQdbRj=%EW%X>Mh/Nj^Qjiymt%Rem+:%Y
X^A9YK ^WELjE<SNlD1t=Zp:ZaR%Ml1Hq4><5SB%H:A9%RAR5?F:>jjTjT^ukWRjw=6JB?HIAaD=Q?pG^#F<^%a
4Zm6np *9\Di&Q1FkwB*YC+p+B:N?dF6t?bwFIny\^>m>/Z<5DCiWECCVcN@bcc8JP4n:AFSZRS*kP5KuVbQ8F9
pQ6Gu@ w1V!jJ%t5:<#*t$*cwpV*piIim1n:>N%*EqN94VESAqj>m=uNlnIiB*F@iYIu+pB%X>l!!n<q1$E\LwD
1?Xptd D+iIdECQBSiBG!c>w5/cFCS>\EKDGkLuG^NhF6WuGw^JklC=HFKm!LEnQa5WFS11Gm:=Na#JMm#pQ94R
nNw/8a WFubNW+/TFw/4Mp=JGbZQ/w@I$/=EwG>I%c/Tm9pPFw<JLwRB:YpK<acB^Y#E*q<ZAYJp1*GW\P#*$!=
&ISp?1 JPwk1ud9>bhTGNkRA>k>$ZJ1W?u+AA&pb+/ay/tq>E%&%GuH&a5w&Mu^n5qd#?>SpFMK:%N&*j$a6K6w
G@tTaj $6Lw<>JCjhN/HhMbCKXq9FN:n6N*5C>*:i9Zu=?WJtM/m&bPwB1l4eMlaYjB$YeJJ>mQ8py*#i:E&P:E
e\*G^4 !cN@#$T$PX:4p*XnXq?H^>/mQmNtL:mRPhny\h*icWR:1eun!Q8ILy&>N::Ym=&L$Etm/AF@aL6h:j+P
A!XADj :ie#BW&hkSPm/I+NYc4uDAiwLyP\TMN^NMIdw#9^<H+hEdijHJbjVYAd!kqLePAcSW6Zww=Ht1/NMRm:
&EY5=G :hJiqT&HBP&w>n:Q65CYwj\cDQh<hc?Z84CB!qJTla*+qdIwZ\^&@yARHad$j9uHRu6\+cAJ>1AX>qGe
/WwDV> q<^BI:K*6K!jNJN=4AX&+&BWp#nqLe5ekV%!JnMYdL#+up$^bh=k8RN4ACX9?X=ZJT*tMLqq^Ym4PT*t
+:Nj>@ XVXm=aH/+V:n5iJHYPR#iPZ5/4L:!mE<ZCdp+:*95CladEYEW11V?/:L$98W?$Q$^=mCZ/LBbWB!mWuZ
9N$Ga> ApdBk6D4Lw+wJYR5?DB$yZ*N*Il*PPk>YtY\w@5qDp!%F*cVH$JCRThAh^#>aHnF:DDND$#GQq6p>Mb:
X+X5cD VZK4DKhF>TNYpJAkw/:bJ4tEyhP\>+q:\<X4%n%jwcSVDLGR/aHp>T#QJacjT%KiSkwZHFnJ1$uTIQWu
jhFCkD KeG#>4Fu/AdZ:!jEPEnJaXJYKBu4\?jap/5kju1Qdhl:ja*J#^aheRmd+$$hb%HW^%jY^LNYBKaG<lSj
TtTZdk <R+Y9Ya6i6$VXn!kdeXGDA4C=BVnX<8*l=LqF1N1=wPSFB@Bb15Zb1d/CCWY^Z*PCXwZlR?blP91Fk!8
bFadEp wF+SDqn*lamq<iWd$wq%RctDPXQ+^M:N1eu6^E*F^QM#JhYXIihcaySaWnC1nFbSu<^iTqK6&Hb@nSH:
t&>hGb nmmeSG5YLSlpmRSVA=>u?ehC8LE\A4RqwuESSWAEcwH4pZAe8uAZBmWtEupELNTDW9&h$kYWMkSP&RNJ
$\DMAd 8RFN?RJLBaKu+pGp$pC1epGlC1FS>YBRdYBSDaBTA#?wReB@%M**EFIul%J1+FN4IFB*9%PjWhHAp@tn
HnL@im cQ/MqQ1Mpy1Hnh1MuWc1m+cHlccHtkaEwyH1wA$J%5a#W:uk$Y/A$d/RWY>\$<Rn%YqI%tw\W9aIXGq\
KwwF+e $hdR$6WI%W&q$L=\$:yI%jFw$Jyl$&<a$d?aMIDE/5%+GYnA1bEjGWI&DTFLBnQ<AL\%Aw<LI^M9R+%>
yATCEc A:^n>I5j^4@?uDqWt+W#V5M#!nuTdSk^\5e#>MR^<6k%+KR\>mVSt/W^ulpFRGWci/!ccm!ai=J1#\wb
j!*VG# yeGa+i$c+i8aNBwaZSAC<EXMQdcNG\*MNiFMG8nMbyYMNC&MG?JNPEFtun4tncbpq!w&uQ/tiL6YiD?6
=QkFnD b=VM<SMIQNPNb6&MIh9YnX/&um?NQGHMNN@b#H1wc94d#Sd4#d/$9a\$+&!!\B<#+W!*^8?%^eNV>@^m
G@M\>J N:N4t<bkl%>ymd>9q@dTLnZi!ZQP=wLDGj@R^LQd\jQP/dLRGV@b^DQSMhZKHE?d\I9PQLXNhWdFPHZB
jJqtlM qI6Bqa9QSW9EaE:KQi*K?E4JSTVV*p9D\^PiKJ*E4IuNB84BW$9MRFQG?M4H1?tq%%YkN%iw6%iph%P5
YuMwa* TnCZ*A1i%Lt@NJmdAnhTuDEH9p8i:n^XjK%Wyn8G$>V^4N=EHNeSHpbFeq&bc:4!BXY:n*88tJthL<BG
9PVc/u HF4M%/5Mq1BcJu%CR16JGnjj4?CLdL$u@X!HAtWNNZtjZFMK*HpZ@HTjjQ&aAulPwj+4*Qt/w9GRa9&S
5pCi+i E9nK?@19YZ6ZL>R8Z81pS1y4tGqy>FyjDPnMFPyi/^qi9NN5%ku#!A*S1A#VENP<N6J1enP+h6Qlqwnk
JjWwc? 66Q%jAmFRIZPNBqeTaSuiPulwaW*9\!dTZZ#nnYb5\wljB<NtVNIn#VunI\m+LHkSDKc::SQQZNQ+*Gj
C@?#%5 yjQAJ+yy1I#%bLB5?GHcCBYH@<=Mp<6nb5l5nmZ/ClI&P&DXPBXHPGD^A!*1A5Q?%&98Mb9GdT8V#AVN
RRm84N IVQI1nZ?D=5YLPWtHL9GNmjNWm6PJ>5=NQ8$\8T$>#cbdBdZZ*T=1JJ@MCT%mNt$TLu4!NttI!SjEhl^
-Aaq^X 00009aa5dae001202b4 Page 187 of binaries2.zip
<^%AME L6mua#u<WHDW<Wn#?JDiiGLTIyDP?VQXP>/XmC96S&Kc>pYG==GLnqptF+dLJWGmJwK4B%P!=$9QFwj+
#nVTC9 H/BE<E?*&apau%RXAyQa#H!VH$P^caEiP6@e$@ZiRm4jiq^=ERT1#*G+EX%+i*qF/<Lq?CLq6KLq*GCy
cwp\^L NmZ^E^M?W4tC+??h69<jnqa<QS#^>=dh@+KEql9!#^Jcd9C@J1Hq@5h1C6!@4/d\G&j\9=ciiELM=DjP
V6GqNY +L>BQ^a#?a$#?G@R\EjYXH@nDQ+d>GQ%EH:nDQ:QcMln1@?@eRd@Dj1^mkc@eRd@DS4$TP#kN<:k9$E@
1QCF9Q JqH@nVQ+d>CQ^W^?+\#?G@Snm<GeV?EctQ8S<<*=FK/BH%8B=*\K%<CR^+:cW:n&tAeGB>hV8AdtiGVd
+?t<Ni ZE@lG8m^PlBeV?EcCQLIFe4%FK/BRI?lu<I%EMhncMmV$I@6>%P+Bu#E^IKD/!qei##m\9WW5n$cM?F/
+NmD%l C6pkn\ZJ8J>CNlD+pWA$>:>b>kHI\jFQe^cRk@&yL9SAh1:j#p:e9/@4\Q*QdmV@eptMZ^MjEML=F>Me
tRAB1b +K@B+RplG?=@4P9\%?Q/*+b5@q4K+a?R#X>*<^@cBj<t1b?HHjJ@p@1jtNR9@?<q>V9dJ4CnK=8lFdQc
Mic^n? u5jB%<\dp%CL=9@Z#H:BjVM1jD/K+PcVRQtMICAwuq&bwQbI?a>an9eBMASnTJA*S5^ahdki$:&IBA=c
H=:JLh i=C@ZpFMHa+F1n!1mRwLJSXak?FcqSZY?ac#4>j^n!#?8F5Hwn+&XP?BcDb4T%#lyJ!>$ZCM?e?++#Zc
MN&W^6 8yNw\#8&h^MKXN\ZwQm/i$^XCkuml<ueXDca<Z\tNtc$c99*$CDW<RQe8k95wL58C8FXqXBeR6$LXQt&
#8:Cm* ==^waD+PbqkaA\Nt8Zk:MKa\lRPb8t\CH@9aFPwHGhyQXW8ew?&H1EWn+LGGRQPJhipFp%AwN!q6\VHq
A\*mkI E4DKCI\Ew%C/QJRBHAE%AWawVGG5:5Ka^:/8LqldtSM6#R#M%%b^><&5K?pta%kTK5KNA#tI/tQYl^!%
pu5hY@ tn/P5*qq@pGuYBnh=jNi+1SR*Mwe44l$T^WX$DG*?ZYi&CeDwhlL%D5FYb@QYJqjMNyPeW6ZJSdW9/%t
*@aKWI E@qw&6@mZ+B%Yd:ycL#tjAGD!l6LqkGHtAIn88GV9P/>w#WduV?aRF9I<P$!YIHCLlPGR&ljF&YtV8iF
@%a*5d 5alI@i95bp!L%p<QaduRPi1uN4tT:/y&Wq+X>&#hjN/9wlR4e1M?!6^T=uX?FujQ=/C^ZHTlPhe4q&PZ
t<EBdK Dt=DpdiJ@w8c\\qTV6HFke8ZHI%aJauKb^a:M9WJ\65en>QQ1M\J/Cajk1HJ#+GFCaYQlePP>d%ZG&F8
W9?V\9 /yB>AS6%F!?w<GPm*Yt+bEnyARTSdXNAWhl^l:E1X6XMJhBmS=#C=RCK^XYMH$Sek=lal\tE1a1m$e9e
6MdEK& yileTDK/G@WIV:dl!9DeSIAd!JmBGTy:I^b5%:\Da+5*Ftmp8a!d#!<^8tbiMtyE5t=XEZ>hy>iJmdl<
utq9>> l%6ktV4a=CJyIJ4nWa!8yPb1:+AFu#*nYY*KWalG$R#1^4$j!ntuA%ae$MNL%F6m^LBHI1IV6?SjEpCJ
Ru1mq1 awZtP8P&ZctHGw6e<6H++L+*h@cMYCI!M^/I!^c&kJNBipA1*8%6QF9:%y&Xcc@R<AHMPjyyZB8wZBPF
Bb+8TH &dJX6wDSyTc$4@+DBw<:bjnc^m>YWam5ci*H5*+Hy%MdP\k\=6MZ=B?\/Cb86i:*yMS4I1D>%:#T!uYM
Nmy8Ql B5^$!whR9aNd*yM$<nF11KWyA=EwqPwM6/<&>WqkqJ$#MwJBylc%ZHVclL$VT^GkwpR>888An4YFu>y!
D=n1hB +@^h\eJY<yNRL#l+!6uw=T8I5e8%>1DK&/q+4YaaC6/8BDwAI:Y\%bH>$e5kQ1LWD*!4JkW^8!<n=Bi!
XTh<ZD qcqc+8DDZY*#$/NlFAjJklATmCyylnDRA?kS:W#K!T:SBInFWIKHwMktlj6S8yJ?/piq?W^/cJb4\+wL
RN??eG Tm*R6X&:aW*#D<nJVynYS\+*a+KR5mNXZ\6It%1tt##wB\SR5VIYK=dbc85H68lJq\ui#j5NC>CdStXM
wLI9Qb hW5!RWmpm19+CV1Wed5bXa5S:w^pLMNRLiWyqT9#ZmycF<QP6tT<4NV\K6E&Jp4kuhZAGB>t<HZ@qPy:
PwSc>: WC=%ZC$T9PnjHYClWk=FZyqYStmZTm<H>Ra*8*Ta5EKdHkQqi&k!hm1wKGRaH4DFtT%?k!J@X+yi#Z>h
Smp<6G Qj@AE^#/1hRY9&kltpK#+wDmSYPW>@N!MLJ1d=@S>u*Qw8$Fu+t6jDt?IYuR:K:4>\TL%8IDdplYtuY1
kRQCB! 6*P6Bm&#YGPkL?M+k>BqI:nQ4VHLM4@Q!K8TXw*+^L%V\1Q85^?*VKGi=TJ^>b8b49E!^q$9%p@\LSup
P>la!@ tLD!NNdEqcZ%cc@j5pe9lhTIM\6wFwc\YLA@a^/PdH49ic%!eRLMq$B4lIN?D!NGy1Qh^SZuM68R&?!6
B1qP^y ATW5HkqEbX<WD/YtB5auDwqwD<!8>T9NP/HL:#bDNIWVCpFGdSt^u+Pm4N?hmuudDu?TKu@Y$:<5N%G1
SiDnTP StqWKCQ=k?dTbKk!b+TSNyXC:GPBkP1NDn*k?\4SWPB\6Il?I&A*5>8SZi+MSDTCV>*L^HD5Lcq+81l?
mWS8V# V=KK&@Aya#D<e#+wh9VWM$=tS8C=5INWjm>Fkc&85=d/i%V!wYppc*#p6T9Ei<\Yi=dSZk\C<HVEGDRJ
/CGGNn DjyGb>+/cp\&$WLAa8!#>Y:cW?\*hP@B#*>a4LM=ipdR!#kJ!LY^%F+WL1b41/WC1njjNyJ!#9tlaTi#
<SHtQ! TSZqZ@F6D5J4n\mc4SX1wckIHZiPP/S9qLySZet#%m<IVa<?KLqDWSpQp/VD4umk1!N#%Bq!hX#F/1/p
=/NWaq +BdA&&q*N8#!4eIilKV#?G46cBmd&N<yHZeF1+cEw5/VmQ6Y9=RRt=ZnY5Md/iCkMhVTiE/<y1?\?X:$
$V/\nK =h!qCy=y1&m$:HNY\/>mlFSaBVGJYZw%N=R9h@K<PW1KTcpW*mBDyXIHFW%jTH*+tGhD?YW+t9?8@%qa
bt>?tL L9uy9h6:D\tBLHLWPynA64IQLYSb5Mka=SJHR#1!:=DG#QVNhRTIPQLGGD?Y<jX^uGB9&/tN41<VwC&*
%6cVBE QbhW?@1Nktu:Ii*5IAuNet4>!&Y^jWcCl6tTb?nPdR+=/59yl*H^$MQe*M9WLT>&m=t*Yl<&44M9&B!<
e!lF:L MII1cA&1y\wNdY#R^HwJF\uNqthFP*9J8H#i<G/@y#Ei@VFaITa:$D4lqii15*HBE@aR!Y9b^<ccNL>u
^9J\6w =>NYn>=9wXWucu9QMjHc1*!C:#V&WL\TGd!&Vy6jBD6DjV>nXX9G1k?TXT!WLT15%C:eM:XB6qRjJ:+8
651Euk e?/WhV@1=n<QhVcMd!!S/C<yZCtYVVC1HAjJ%4cIq$JFFbWXjm/tDaW4c!!9Aqekp<icPbyYmqae9/wW
hbX$AZ w/YVj\W/ILT6iLd6lNt/a%y66qlh\!6amB!Xj>+ql\\8VQlwy>ye=h+1h%$dmn#L^N/!#=$pM&w#JNw6
bt^^BE J:56y/\b4YtD59Nkp@NRXX6y=:kEb>lp4>+Y66KME1LMFQElaPWnW#JTiecd<j=Py4ZY<AHM\Y9D$lGW
cpFR6$ WN\Q?@ejtV::Mk&*H?m&!iXmBK>n&P5lMi*5hinDq<DG$T>:w<qYGyi$8@DKSD$kY>YwdNR:!5\P9di5
Rp&<EH *F6HRm94pQ&8ZEHh\E#jNTTEStQhdZdbW\+QP4JZXS:8mjlARN:XC^lEbj4et/P>^PV6EwPH9D>HnQ+Y
R8+l88 y@Vc6wJ?4>ma6\5V%AW$NaXqTQCLZdFASE8CB>nlthGYFWYA>1Y6JiDVC6AFcP:jGn6thPnYF#/jQubj
QD\8S^ w!!kE@%I%dXL85Wy9l$Tb%NdcT\MN+ILMhPqlhF@F&RNJW54b9wSF8pNK/\!LK!6+KR+P+\jjX+<Xd+l
abJy55 J:t%Rwe?P*R>FjR4iFNB#nXyTilQ>KdL#Mb+XEEYXKhm6HpT%Hpy%K11DKh&NEHlNF&GFNn8hGbqtpeb
!=PuN5 hEp&6B&8nB98q?KcmMJJ#G6S<Du&#C8J%AG&#C5l!IA\L6QSQ\MHPRhcPaPIK^8w=H>Lwwhnh$Nm4$Nn
KKa4W? Q<QmAPF^8BF^%JF!uFEARVSAN\bkHR9\D/5SCMkNCMASaE<YAK$?kEEm+GS=AA+eYE$CmKQC:1aF1hPD
bE1pBi kC\+*c\kPF1RbBE8pBTZtlqZuRuutR6p!kB$b5dqF55>Fe$=^RAGydJQbWJAGq^VhpC*Ry/yWM=pLP+/
WCd@/a G1//iE/ec8/#PtBhJ6hWJM>bL6>bPCn=#/S?H4e?dy^9:Gj</GiHk4>?%LdB^qCCuX=C=\AC6!Ml6TYl
HF%b>< uCNlMJdRPaKRt=V\Pa:IPT#/YaPA&$?S5^PScTkl$BjSim^S6V:Se\KBQ=Lw5RV4&RVBK1J8/iIyMMLV
4B%Qb= jEKku=JkGpq*JCA=qHk>l^A8u1T:p9A=DRlZTmL=RjIen!iFXG^cSBK5Ihu=IFH@Xn1FTRn<Rqk>HbIm
labbHk J=Q4Ja8LIDYNJwTdKw*:Z6whTulcTDcqYP1MVV1qV\/uV>1>SRa5II?4y=BCKw5dLZ>i#uGtw8niJ\T8
TNSkw5 E\N@pHP*W%L9qud9=ptFW5R6BVYkKLqV!E?9Ku5k!X/k!E^V!NTjeiHKeXJ+1iG1<d6^Riy^BME5cmAY
:%?jtB hR$!>dy6DV\%bX\mnhVuSCpVGletIqCb18wTcmt9!T/e%Ki?TaCJ6CGl&l/S&k&^&liJPyBWHVhKmP6u
^8aP?F KNXRi6XI1m+5?qNJjtk@K6e5GnM5S5waY54bBY\4ctFllS=lh8^!81R/9d^8Zi^m1n\4*S\dcqEJQSkQ
wwqYaQ Qhh*BpGSi1jlnEti%GKyVNl?%K=N?nt84Amt1K:hPm6G#LYn<6mV+4WLLJM4<6md4EtHdNkZdEq*:Hmb
\:b9*W byem@=HW4/$t\?&Y#\NT+y#!=#@QFAAX<=/%YK4>+E*&5PS$+Y%W+9N$Ap@=YCcHcp*6Yp&>Nd?M6XJ:
dXDDZq 4=^t\N=w^a?#1*+bdI*#keM#%N4Vm?hC^MchVk6j#1/^VSBuZRi5IMNb4k+&EAEn&NhQCe&wmWP$^QD$
ibjYKV SDqu?D^Z^eAi\tCIePP?dI1RPJ/XkL1Wt8iA&1YZAnlWaZdjAY#n+6uCpVKnMH9wpFKwlB6AqI/lwC+k
@$PR#? YB?6DC=$1eNVti/Xh*?RA:?WTtqTeb?T9SKV1<>*T:F^hK6WubQ=hZLey\5><JR<%P6WCGSWeh5W\XM1
iw9@pH >d5i:phiX!:<Y1FK>VV8Zm?X6W^5WyueCZ^<ty!e4lKXW5p<=>/1yDKIEyCJ+HGA6ETpQV!<9JDe=pnb
N61D?% NcRWGmh<#pk$G>h>y^qic1=LN^m>TqZV%Q4C=:W1nQhC8$=L4aHQ@!JSG:<>+Bw4pB99n$ILhSCh46/k
F^VSaw S+WPj&>Z?@?%$MF9jG@@ihGDp?iSXh4j?N:?b5up5ZZY*@ni@kdN?enm%Y><d*?DBn?C@w*6:Y@Rn>Yh
cN!aHP @a*6:V?nRV!Q4Pu@^9d&N&m8^>Cky/DBn?Tt<+Cjku/5eC\Q=Cqw>5jRV?Ec<DE>AM>V8AdpjA#>FK+B
GX%^TE \a?lu<K%S%hyki^QIh6n=6JA>1iRDe#P?Rkc?L>CQ+X5+EhCApB&<Q<K@ST!Qdc&DYVu@F<he/=@ZIHq
4lydVm jpLTQQh@TbwH@4Xp@h?*!@%9XNdq?G6q*d?+R9@NY^4!:%ZY=YDu@6Y%9/*+mw8y@&dF>&H?+V5AZiSZ
CcZ!6n 4!$A=kGAZ+?HJaAaABH?n<i9*+mwmAmI1PnImInI/JlwcPlwcJla1L>?w/NmaYDn+PJka^ATElMVEqJS
-AHWmY 0007eb942f4001202b4 Page 188 of binaries2.zip
Mc^GT4 WqJT$j*6<hABREEE6AAPwcAwAR<>kMqjDTNA@jEA@QtAlaPBlweCICAmIcNkA1ClaGCkacHlEYB?@aJ&
#l<y^L k+KG\aIF\FFke+mw\PPaWLwE+kIVe^H\*w6ThcyP4IL\Va?yZaNPcMVAcpq=6Yb8ZSB^88V<Pp+ChZQ*
h5598i :5p%SNykJGSCwyAWCetCi5$yDZ4m$@Y#u8tNe\8Q$NVCl6/b#R6L#:C$w5dQ5%8ZZFJcXq:l/eXNjZQd
n@E8qe X>#T&6diESpq#j*#P>eMQDI/Nn/StcW6A\8:Q^l=bZX6jcNiq:WPL8:hQH\B\AI\HlaBmH@5plAkaXhR
<\8X#? dj^Cim6NkW%^p$R!=qTuIwqQ+CPw4u>#6pJZLa^5BR*t99K%$S$=*b*/!D%kZGl9wjABMAu6Q!Q@:j>H
YkBY^G Qu5a#*kABIA^dly6@M<D*q&weX*DCD<A!m*VH\DTTA<ADbD@@/qQ&Wt*W@*iFheYHlaqwnTZqY8#&E#Y
K*T$p! a\V/m@=A8d9I@>W@\AQk>ht4$FPCu@6TD+AC1AeAbP5PbaQ6cnd?X^M\>*c>D4ejN1Jd$4=?@Tdqa&T8
\*h4lw XFJCjbFVHwNDqu^dn#awq&e#P1/\G!+uQi*CIeG/=*PX5Gy@4*E/jmaS&n^l*/NW@LZ@GJF!#aC&X5PW
uTIR*n i:KM6QTM=&Emc$h?wGDQMcTeRdYCN+nbweR=j9mTDcc6MV=Zd<RFpyPEFN8e8JE6@mbN!?qLhh:Eb:$M
:CT/Fb @ydAJ8enB&@TFTYtlc^R#jQ%F/:SFB^jQ?1dA=&j^YAGNXC:Caq&K:Xn5#<AWHR?&mc%6udk%pl?^Lyq
!&XYnk a%<dyY4pX%#QiwukccnXqMdue<V591EyaSj6jdDMdpdRW$1hFQZ1!qui*<yYc/*#p^H$T>b?yb>j&SN+
NNB/F% dk&iqi\jMERyZATyXB=TCZ%M\V*9Y+lybcP$8e!AWXE1=8CTiK5=!Fkitl6@1h%+WepL>auBdt?E$djS
T1ZQl: yaK=kYZ*lH!tpj?VGI+MVSKiS&%e=VN=yTJEhP%IEd#14uy!5#\CBWd1NA=G:I>LEjPaBWhGF:Z:VHLT
nWNVj> B&9YIbXENADnuEBXynQI<ijbne<FNmjlK#^lIui4!?QR4#ASSy5yb\SE>%&5E<eb^D16dZMTy+@/*?A=
n$TicQ *e*\\V5LmpVACD%M:4jWGcQJEu+*HJ%$^>adA^XMeP:65Y\qMKG9J\Yjt:BY=8*MKyuZ:HJG+=/t6DS:
6VDK&a C$lE\n184+wYXR*mEq<IHEh>W=#S%X=@N#kLC@=IP9teEW<l\:J<TQjX/Zap%T6pc%:<L+6j>ZT!Enin
%BP#8k 8XcLB>#adpDRVVc+y::/A1K!CHGR?bpYQ#:NJBan<Wu\9uW%M*Nia$9e%n#%BL$pXHE5ecmjCBZd?e8$
wt+qA< \m&WiR<W>=bI9AXXDXRwJK6tlD8#aQ?8V*1@8K^SjS6q6J9\%lmTiy=&?X!n9pYEV/K6:9+:SFXX!:&c
Q5u5kC k@dwtEXa6S$HK=td9*J#Nw##JZBm8T#NQaV^QbX4tR<tS1l#<QCmatdlX&8qw5Xi&<p>#IImQKRB5ZKX
iN9b5P $8>A*b5ZSAY9TW1NL:V=<ymbiYC%>\T$**+cSQ?B$&\Zj!L+=y&&p>bi$@HNLiX&**q5nJHX%Qq?6%Qh
PIK!&k 8+iydB@n#+%cScy=HNV/R&1^kwX&8uPN!N6=APk>?S^:QA?pAJkPKAlkbM?/@eLN@&jE!K@4<e#*Nh8h
K9V8^Z @4j:NbD@nN@!8hFNT@6hD?$DwP!/:M6P+8hEKT>wc4Mw&E#N+K$KyKGd:+pQAJcVZ=iy$8&*4Q%Y1h8t
8ciW6! 9kiAnNDbK/i1ZdLVd&S*%A?ApS?jQlV+D@u=u!e@ALm&@k*MYuVy4uT8=8Z!4/5j9@l&=6*D>J=SwZ9:
!%MqER D+jki<umm=EdLdpHRN1<$Ic69*:%bK9SdYQuA+BK:YdN#en/C1qLd6/VInZNPcdAT$5T6ZnDBWNN+6hy
+!j&%w !*wALE5/*XSuVW@+:&$>AK/\58:L6!:A@:uLQ%y&#E6juNB4wtL4LXDLqt+k!hBakQt?5$MPhBXt?tb#
T5:n1h b>ItLYH=Py$^G$SnB*ujh4HPFHXn*lSY*<uZ?W?cQRBt:L?yN#\AT6Ped8V>d!1#>6LcL+C@n4LM4/FL
hYFRij w#bhcjK=6&ZddP^Kp$ec>*dLFp\8ckXQ@@T!=\A5X/MY&8:T5kSVwP4:%9jF5dl9\yj>B*YK@V<#QRB?
6!ZSCH q5=9Q<!p/jwQkmy@hXNwD*1JF>%?we=!JI9#n/i^l>uDq4@>%ZYuKSF=RBwLcCEbj*iq@wpRdn6NLl4e
J+#hn+ uE1V\q?Bc6*QuRLG>WiN?wjt=@=wH9JI<?Q@yjpP*9m4Sc@dukjAeKdL/@TjM&d*>i>PaBKm+*@Ika?8
B:GA&F i@$jAB=<#^+t@4+>A9#nY&Bpdm=b+Em@j\cQj9mQ+QT@i>GCeadAqQAAaHj><i5XF<Y><ca4&Sc/$c<Z
+S#*W# Y^6C\<<iJk@j@QQ@j4=DYHG>dkyjVi@>KIT/4Nh>QLn&qT#M/NjYRC=PGN%M$h/9CBFWaBYK%j*:^l<A
DHiiXJ !eA%*$i:QQX*ZYbVtVlAVZi/\XF<jc*k99yh6dQupLq1ePynZB$d=nilb?DG<cP+=Q#F61GqLD6/mk\S
/bhPPQ F9wl=H^ee^1nd6?+hV>XDLc9a8TJDZa6N6T5Gk9i1TF1W@Nw:!+@8nT>$pqd8=T:>mDJ54HIMePl<V+R
@5c=Se EPnqXubwpJCy6JGw4Pe4>:VpVS*P?Z\!KRpjtyty:=?TY*1PKnwuMwM@p>M&R=QcLW&bmIGQ>X=T\^R=
?5dVT/ ncun8%h8<Tiin&*kY8d1ptX&GX*4V$J%w#qS\R5KBN$h\jLnQ#\%4KQ*6EATYJ8hG&lc&Dehy+=Tb5i*
1%DK/$ nd%dE%cJLXI9?hYB1XADbB<%qIp4t$Wb&\S9pm4VWmH=XAIdb!tK5NIZtq<@blB@==jEYQqKFnHT?XEI
=/IZPM K!9a?^WXF@#^4cV@\@V?LWu*CXE#X@kc!NpJw<j!n@@14W\MJ9%k#nR51H$Gu&MS%DY:ANjdp/S9>KH$
a<X1Z1 *cRNCtQ9kC&mKILlp4GB*ED4e1QuwtYtBXyD:hT?XyJ59GeHeVbcZ?uJ=8EWNT><8FiS$YjNWV+:?pyD
dDkmiQ KwwWGZBT*iiPAbE&cNKBw/D9:k1Ti48PJ8*iqIpVRe^J#@qqp\c4lwNZDjt>V=djj:P*!A+9Z@\k^%yM
YRt!tw M^^Xwnb6mVlcKAe9t\ADGQy&1FX&XAXtWVZ6P\??qb%iy=+I?K!bcI&6GMD?5@t<Y+B*<Q8+Qpy=+$jk
hC/TJn 5Hu5G/lPdp4EDwNGS1Yy!L&1lE@91C6Kwq$bD+Tl*<564:^aK6j=jyCG6J+cLC$61Rqi<b4j+F&@X^*l
IpFXTe 8?e\ikB<Wi\V?8Mmj8%nyW>Zm@=4NPwLdRwDu5y^*k^%=>iuq:MMLR*SbH4VZt^/aVlZJA+eq#8eiQR/
Sb\aTP WNVyGbD4k+eEaqQd/kMhYHXnMYP#ky$BG9t=<+jS8^QY4?%hAXe^p=KW1eNeh5hBI^y=juS4B!=E+D9W
ZQXQ<e THE&H<JMWY:PK&b/aq4e8@umK/Q+IeJY^*m<TTWuN@>u?nS^*m>Jmm:\Da&R#MmEhh8aDP>5cjWepDW6
Ki!&^K YZ^=y4u%jD1Mq&XWab<#LdtM?=EDpui@/u5p?BiXJ81kFBAkC@6kt<tKKVWRZ==W&nw:5SBMui>/TyXN
G!bQeL VT<6#&WFn@uLGj9kNIp%F<&V56SVp<?iq/BDp@leB%Mm9kpkJ%XHc$Z9MKu\dZ!Hc+iNpp$QZe%pX\S?
IDM8+i #n!S>P1N%&+=GW4<nWVL4+6Sy%%B?%4jj=Jq:E=%=Mc&4&9>Q6HSj!@NcWyVpID5QN46AcBi>#C:?//w
VD=u!L \w>XcBh@?::W<k=m684!/*c^TilCn88S6uw4L:+IcKjhhC#h/@#SuqRBj6mLTLVR65+$G\5eBdn^^PAQ
jLE!Iw 9KeQAJFZWeI@6Sh%jk*9bXQ*+q@<9\4B:ZLlc?yt6NlbH!1LWF5+GLhctS:lMJleTDe?##!K$5>mPC4<
%$Xt44 ILi\ItQ\4ECVT!SR6eF+k!!t:KTTH5wy4EISPK!*<EH8S9c:D*S^<inp$YGy15>:LiaKKF\BSy6QGq&L
@eatb& !@lY:Stut4k9WBwBtdwtnh?RV<tRn9GY:EFVDW\wYM:Q>@c&=#KGm?V$<yS^^XiamJbY11d*y%l@/6Yp
&!m?BV !XGS#TLG9ZKW1P#4?yRTddB&alJSiP:&SXja$dIqBX\>18jXBMW>DnZIQV*b<1#=AbBTy@kAmNH/NTG1
BEneAm 9S>:tE8jy^4a@GLJujl&uq=hYCiTp*MJ\EYHEhhpLHQ6&L+Lj*bjakLjSL\*h#tHcc5dtq19Iwh/LGLl
Cilepa X*muIpJPmRqDh@Dc*19D!=eq>p6Ft86ic*i9WFGhY<MHmQTK*T6G8Byq+w@>^jyiP%ttt*ENqREAhinF
JqM*Qd k%6KRyQ4Fn*TH&LDmRwDX=&<Dk%65hNi&H8/d\e:65jn=QkYCi<RK:5GZ&LEBBQ=I#jaGB\@AM/@lJ>?
$*$$JC <b>E&:=VH4q^:Q:^b?<5::lMdy8M#wN>jlED>C14=q/9?pdp+/?#V>T8MP@QMuhH@6X@B9Xd$aFR&9=>
Te?XbL kyQRZynVqCjbpMe99uC>8^Dn&9&A5hu///5H!hlNd6b@&em9ijAZ!j=X%H@6t4t9uWh4i$6L<@RFBi!W
HDHdF8 GD@u<aKSJCZuV%lamhdY8^4J:be%DjW!l9VBhw5qtc4TG^d%:elhet!qGq1VNNw!MmLWS$ijmHadQVX>
b%E:p= 1*i#Ql^Kj6>l/bG869Ct\l4nY\dkhmmw+!t&+by/yht<<QEB9<:P^!Xk4Zk9bqXCIc:>FhmAhh%t!<@i
DYF*bH J@8ClXXt\&=E>tkPC^%u+W81GLa#LZ6nh:^kkZ5X$j%VDlk%G&Zd6ANc1=J$tl1XuIMLey\5+Lw+DuLD
8:8PbG qLn$V@eB6nm:4\^tuA=Vhc$NaakHXB5+$/JQXMM@QZ<yNmy$8qD5*^@b9qjqXPLVh/<HQ91B^ZYuMZKB
CA+JkK \j$AGLJ<?\Ck@PQP4PXV:ndbD@8y>k*^d^hcZNQ</:>8KX>:*Wbp*bh6*aT@<h@<k<TJPQ+#?6?W#?J9
6cq\?d G&&?uXI/*bSu:V*@NR!p@S1C^SX?*aK=@S@b+5QpL6u@/^9>N*i#l=Z<LAVDMY^j$eqRTbyM$mEi*9eB
9t&nBP <PJip84m$HQ!TqG8QI9pk>=?iIPbdSIVE:Y4#PX4TdL94TaKjdiF9#ym&9+AcH$d=@<\qjl4R@S^Djh6
SA#Tcm :ZhmP66!j>+e@8Zyaj49:pdX?RTCQt6wL$eSGM4hVdiy+>%=T%W6DVmX@QDDRSV#&+:lIG!/1X>/F%5V
!PStFy >+?#=Z?*phqH:pth!+ejACjny%i*jWJ*ap1J=Z@Q^:u@45*^j/@Nmd>4e!Nyj>m*B%8IXLDV+W+8JE\9
Q=:kp# X6R/W5@KitEDydk@eT=e$Yw:j5y9*cbpWX8j=tQ8WiXKC%aJM<:e%piWXKZcp>SKBLMyXnJ8Qjq^8tuH
L?<WRX jL6\^MB^bI&Z\l8#d&Vu@P&^lDI4Hd/HFnTiMhY=mGwG*uP9M#e5q>$$5Mk1+!^Be:%qWeHdtD4C4c&D
wBL=!+ =amc$K/&#K%pyQh%mk<i=iVT@L#%>c5QHpyFCZ=MQJF\j&hyG#YCR?pu9S?NFJS>yKHh>^h=/c8Ac8IA
5CKnpd c>>VE\uT?^j+<h#muR#FBp\R:jJC?tm/kyF?X<PAh1P/V$k6b>Ti\*8ZZ1ltqh=\nwtSnduj#JS!LlHI
ZQ#14F dLaR1&t$%^5!NcLlW6NZ4pZj>qhCdRw4PV6*:^669BJc!Q4h$:8H!aN&*X@j+p:8l:<><1#KEBITXF@e
j4k@LK jtqm6J9XqKVmbEEm<c^Y9J1tW>KMlHD?SQ6=X8qS%uqn@kPAth%@W8$B5MDJaqGtJLC&5L^ELdHtw:Ki
-A<R!I 0002eec8ae3001202b4 Page 189 of binaries2.zip
KD+Z#: MZC*JBtCPTGqhASQ+:Iq^/jZ\4#b>C:F+lZ+jBqa^?\*w^L>L4b=Ky:%k$Q<=G&*Tjt\cWPeSb=9&Tt>
w#G+#h l5u^ZjaDwJHQ1>5w9PQ8X?6b1<hC@yjGyJLbnY?Xj6mRuX41M=\J*d4#6#$APMaiAMyVG:d@\Pt@9*BY
h+LM/j +*Jl*?$/5d\65=qVM!Dc#Q=?!t&DYqXaJb8IjYbTe<JuP95/ht#uJ@\pPMVWjemGSdp8XHlHPunPSJGl
VGe:4i X+Jy!NqZjjX6&>hTqw&Jbb6!6H44Ehk6=h=91dnK/5XhZl&Vi<Sn5!\V:1HG%6@qA+/jyXK9hV8KQB6*
nj*lXd $H$J+G@>&8JEddp6cluTZ@w#HEeAEhCem:5<>&1iyS1m=$:=VXwXtYA6mjL?9F<4*8CiLKLyy*djNH<Z
6LcQWe cykADTG<pnSSWFIS=hlQeR&n%eNdb*G6%wyI=/Nm^CnqyZ#y\uiXh4$qmE96W:E9:p\5EF8X4ah4m$6w
BP@bNy hBGu&RwyuyYjJHpi!4M*9Na^&jS\&BqTlWda4PHDWTJDZy5^&4^X6K$?9cjnw4p*/6p1i\C\4du>?wJ^
p+tPNn <d5QZP^MQ<b*L@WlY6!<PS8n>qX69mmWhPPV%JqaIG$8T&D5iPNW/QRA$HV@NT<ZQ\BiP^5t#d:jw/Rw
QqkZ9u b1pjR+%JmyS9l@+wM4WGueye9DQaMuhR&aDpaF/9R!NDqT<=?L&*?ZMBQh/FICNeNT6F9K^tBj?ImSjI
aYQNLe %#PYwJ5weTqYk#TwZIn+FyLkVy8X4Hnq59XBY\+&lA9Qe8P$DByjM/LJQ*!F#9ED%K<bi#FFN/KbAcZ*
?^IZ/V \meGqV1HPpTGB+C$6H+WP!%>WZ@a94:nQ=DyZQ#jDnF@Q^T8l6//X5<=W6<WeGKQ8Dwc*Dj6pphyCV8?
^XnBPu =m5R%w@>>L\aZuhjAV@YlCd:hhXSeceL&l9=jk#/V5^8R\&pd>&4J>&EF%LJ?:LM=le5jSSpp9=j=RlZ
BK/X9& l$8YJac1^TIE**5tTdduFZk9qFJXA%XiaWSH1lk%iyIe4m9DhG?=RDb:A/aKeMS=JF>SXkYJ+HC5Iiq1
T:CeiQ ya8ySHM&ijX@dyXjHwCTRheM1cF?4i!TW^%@MK&eJqX6qImXJbpyX5<+?uE^8=4>1C9\8ll1Yt5N4+nq
!ccZ4\ S9eHm/4X=Q!\GjN^1Y&+ynyVnSN&6*<6b:YXXQt!DJQWDc5GEyP+VnBAuX$mWW=FYkl4j@^F%G6Z5u+l
y<6apI 59&5lH8S/\iA@uL+KWdj#hcGWMI4wVp8m69kp@8Yl>u>&>?<*aK^RSb@$X8b+T1ETQLmF#b&kKk=i$&:
9pc1Xt Ep64L6Q@c*uEu11pyCQYlBR6:GH1la#@b1dRL9Dwb1YN+mYym8pLe/pZQnwYPCMeWM<^B&ScZVjR9^IC
e>+qd9 #\#\/#/m&BMYhKHL>?ItJdS*iVewHi$4dYwKqEd1?aRa8MyW/FC1^&=uJZl:D+=k$T?=cXC6&WLJb1iW
!jd^=# 5@KQ:iJnLVK5Xe!p1bGKDp/+@pS4\HF!JjmDN@G:WM+KhW6*ltbw6Dp5+qJdAD1u8GCTpujjdJck:qPE
tm/RbW Nwcd%dd<4*h<Z6!d9d9QLi/j?ah=?8?u8>Za$@/\$%P^IktdjRPTMAhPuS=SHkQe=j:$p=tC+y>H44/@
dV18$h ^y8$D\JFci=jiCeem1aP/TmVyIn=Api=4>>DaVH$?6+ij@/<4=ele#FEd&ISk\8Zwctc&IT65up6lw?H
aEjy#& %%H:=Wiy4yQp=$tJGEA1c?nT^Nc!HRP5d#6mKhqJVhH$:RDiM9Km881mDJ@wRe\Rbh>\&enqY&EWWbH>
6XAY$? >Tqapuj5JYwZeqaLQtXy<IXK4JC$LKHX:>L1QX>6EP/&/&#hTtlF%Ha=lA8pQT?<w^J%6V1\cbEc/tA?
+W5FPi Hk9ZpepZGNeya?bb@DS#F5P:@lB:Atp?R!k4t&*<t8qSH4SEdwq6d:+9/*^4M$/+&NabmLdl\9#@ai<6
bnFtPm w?Nc5mZlEnM#&YLtEnM#M#M#p!YLtbtbtet!tJuSpm!Y^e!Y>N*d4^>%6?j=>e\*c>c5Yj1VWqZW!bQc
&5h6Ft qTh#b$V5&<eB$Rn%d@G%5+<:/:<MqD<Y@d<bSlM#G#44a@h4S9E5>Y@Q*^dmu8%t4>*9qI18ctZ5C&*j
#SJ5cJ H8j+n/B>F:*^Cuta4I\&CP8XTXEqVJwCb^&Q9pwQl5WjI=W@Gm%#9T=&*4bEqu1N^WVE+piQ>mjni*!%
tX6KN& KyAhh#!WI$pqmt1/\Z?R&?^K8b?lLl!b1><4&%hyyCAI8C+9@+H*JV=nh<JhESQqcD&kpyFbp6RXnpbe
Fw%RiS !+6BK4m5%kt1C<h!LTm%d&9WuK\$u!qa#d=ym=m@nCQ^enH5I&&%TK!&*A4Tdj\:kN!$L^j+DlkYH9>?
9$ZMV! k@<P8EQkE/9l*/ih:>:FiAi<Ly\/@<%/b#9:FE*6SMG6Zq5p+<eG^@^8>naMVaGZ9<:IGSupV=<4n=?D
?B%Xa! QLl&WiPqMH4*R*C^/+nI\=hmBELEHbVK^Fi1!1*n<ITLDQ9NKb+54TEcB$!p<CQTlKWZFWW@8dPD=eDj
L@=ySQ AelYAeyIQ!S^@PDZ>jM5e#BiJAyh=Z#qd9EPGt=IH=dPTLX$IpqqTb%JqmJ?wQ6XSh!X&h/Z=cNZk:lp
S$1IGJ dJdLd%kmnXyP/uZ/KGTlX<#pRKWTZec<*4C%XuyLjRGGA?mVibIDbI<c4uewba#VcueDcq!=X\ntiDtt
$#Aa6c B\QK^jlSp?qG9Ft?qiw@Lmi9Hd8:$?e*HWc\icJq&klSKmXkPISEn=e1dt<bV@?Mj#A:jJN+cZS?B=D/
NLkZbM 4Lc@A^L+V6jjAcMj*Z#j=$=?@1Xq=:5Z&<HPj!&?pbu:SHI?YJ&=\+&ak+Ph1^y<Z8Nn&XTtT=:CL?el
=kFHPe LAX8b\!^MyXMEi%q#C?=?5ePRT*!n&*t!V9AqINjbKEkW@t=m1F$DBiG#K\lnKRYKq#AmC#X?Qk#N9Gl
D5+q#w ^5J&X<wcDbkn/ljwDiN+aWn1a8t/*SGX=5?VWF4b/ia%^<:eiNXM%V8m+9FyjGPDkwRN%XLZqdC\AK@:
LW*jL/ bh!D58Ak4p<KNM\yEYbqty1RI=%TbaTjH8%D9F#QFqjc&NXCFkcbalkZ!YcI&e6u*I*actYpXiHQDC1G
DM^JZp &NmJw@\>pVcp=>MM+%>%>#NiBFKEHjL$S\K+p<Qqq8b@C5<yQq@t@N%mTAdMW%^Licc#nYZqHjB%!bM+
*E6XFD hi\LT\NQk5n=8VT\1RFX<qmT4k9V?pNL84P6ycG=n!jipH9M?dcRak4HnGJddLQ8!IwS&%pX:+Tn#lH:
%IuBu/ dN<pdtijFT1H\tXV%LyM^Hj+QDG*h\ANR6Mp:*qXae/V*Su>^%S8b$>8nEJpc5<:E6?VkHiA<Lh*RQj=
kBiT!6 P?CI*9i=QQPY6@9q:iI6+jCQ:Xl/>@@t%>+ZnuL##>+B*^><d%Q=Z%Wtu#><@&Ph/j+PpQ\n4lbq99?Q
ItX8Jk ZuR/a1\=eZVn@*H?^?jGQ>Y!w9p/t=5c?%J@t+T*=pq6STtK==5jC$y<uZjn6:BndG/ihJ?LeJq6lySW
NMp?Ah E1L^haB&dZniwcHcEJdkyY:tD<E=c4Btj&/Fwc8%haq4lb$jh?e9M+%\D?GmmyhADJ<8hi!m<QTyEQZ$
Dj1M%@ 6DR%@iV+k$5eQ91VK&+*=ecJ5t=F966XQ\E%><5wlc:R=9MkCRwLK866FiqBXycmKbpW&@Dhh8/QpZjA
?M&JW? j5ZN9\/KtQkjP%*%*L@e&FBZLHk\*Ly8jZS:Q49#/RKN+55$1EPlinQt<*S1^CSQXp%SYaaqGb:&cB51
<ih*I+ EPD\=Y>*nitYcp91Z8VqpAZ46K8F:KlP6+<F1%46hy<eh/YYtXyuBGm>S#%F<+&jqcRRba\@up?hFlqJ
H*=<h6 9?Fb$l8>A%A*K#Xd+YK$p5a\8yjMAjQ=yeK6Pl4cFnIVpRjejTjDCRl!i5ILm5R1#4WDXhD*\<$lMZGD
$E@uQB Dy5GZS4t=THC=XIaQTeDN>>4hHDhEy%W6E?Y4%M\RFl^$p/H?Kb@d6XPR:\DRk4iAbWq=Z@<%?djAbPc
yNAaJ^ *j&K9w9#Ku<5WI@iARhX*:jL8w?QKu#u@qm!*1nbZ!:w*:p5<l>^?V=X5n>cMV^@5e1>#id@8bn=p^Z4
p<Qm*6 XbhX@qp8><%1<k$*<1$tw@TXR9+h\G4&DpARjRiw!!1@Jj/=/G*$@b6L9m@>$Q@jeJu@>ZhtuHi>WcV8
F&bd!^ wCjy/8qK%wkXdFhntw/SLwWJS$VebEQ+>/uM#B>1><6ie1ZYut@ZW&w$EVpp<=@\VH$n4d\yc4A5pJ@5
D1?%Q@ Z8tCW\Kt\Xdk!8^NSF*!+!V9BFp6S+A?eScWan*\%KuK%#<^at:G*Bt@L4bq!cI8qChE#cE6Wt>=H?un
<Bikw6 <:ZN8&l@!q!Ry^@BpyPwKW!B:6FP%enACAj>GFYBYm^@&?QP*8K8wEp*uNKMJLXAGIASQqbc?dF/MCYb
!<*GL1 B^dmcPDDw<G!qqkIdVMeA9Q8CY+RAnld@VB^\#CwyQ6Stk+mSV^^quZEea=n1FVI+Q:<ie:PM$Td6EB8
/1qRTV y=/TIFVSiQeF=*ybci5+8G?+I8&H6?Plk?ZkW#XRtQtwKLMed6N+pBjyq$%>BDj5qP!Dy1/WIT1Yq$!%
MH1&AF BhlI6*Vac6#%nYbJ5NQkuW@1ZVVtB!bjF5R!YcMum!d9CtHc=EAF4Z<5DP5*V<m&Qqij?TXP5TPm9\NC
q@tA?d :=k$k1w%5B*JBV?Y8NZTudRij<j:hLAlmWqiN*N?5I<?VV$KZ/ap$Z<yZ&e>M4#!iY/8*j:RFZa#Jh/H
XnRT%Z =Tybpm/B&FVh\9be18GQJ&M4nh+LRb*LB&NQ&/L&XKqPj/W#Y\+iilN1Cj$1eIEJa+#%KMR*Y+<q<$T^
/i<JT9 d6EkGWpLDdAnZDwE116:%6JyL>@*tdR%#:FnnhPWR/H8tPQh&G4e9n*SpYV/SaX%RT&Zu?!DhF>*q5py
mm4i\9 l&I@EjRZKa*cp5w$pDyLZIcaqm#ey8YwjIP\%nN5t/En#LtRV#tYQLARYq$TwQ=JXE:+RRt$G!qcXG+S
QJkIPP \jek<\hyPG&V>Lik8B/SA\1XZV4yc!%uIZ?JDc?=D6#6kJNL6naZBmHX#F%mM!WTGu^H1WH66$<X4+@/
RkjA*: TFt::T$yP<6TZXpDJ^?l6+&$1pb84S\4$QM^!511IS<jiha@!m@e$ZST*+<lMH<@adkLm<AB1L6JBCwX
QDN&@: i>l@<*bLQ&k5*/!8<6Lhe&S=aD8+KmRHLFWylu8=tIHDQm4Z4H#k=/w/WLR5*ql@Jqj1k#n\GKwcuVjR
le#4N6 1WX84k%&#^9*bid6CWPk9<M=nNqapnCSw/Gt#YtqEQmKYeV&k4LdR5cjmeKKF<&%&dh#LG$y\@!Xb6RK
L/wi48 e&P$IwANm@jwZ4/FT=>N8!VZ$liniPDk*n1M4uyZ!MT5SZKjH!pT#unAI<85>BCcyhIcy4T8Hck9S1c6
9FI9$t ELwkNR:SDcq@ePnW+a5LD=^nqYTXKQG$5cQX\6FmpN9u\N^>5X\yQ^WVw@?dbYTGlZy*+Xc/YY6&$CS<
5nRaLQ @XjFXKX8%hdaQ*d&TcEI@HK>:\DcX6>4wn<m=6@cnb?#A><$:h+Bi<Jt4>^RQ^5&*kEnIYQ@*l#@>?dp
njYjay 5^9Tp&uHP!AiIjQ&>PQ%?B>QTtI<tu>9M9^:p@%wlZ<@=iJNlM%?95=*uP::##Cd&u>4hj>d/**8mL@W
d<!X9k +B&Rw6*>lL#c@i>>:Q=j&h*pj&?t@5Pd?Qj819>dT@Te#Q/KQN9^^@ndnj:+pRNjKhIeG+Mi\iiyy@j=
RXXqBj dG*6=*5&8T#w=/<GCYQ<=85:8a4&%@^dmZ>M5Zia:\CTN^n?G98!%1iQq=J@#8*Qpd=@:AVAe=jbF:S@
L8nR6L ^n/T@nt@?+l&@@HMDyD@a::?#V?iyLSEShXiiyPmmYuh*ZQm/jJQJ6I14G>+Pa1T=89lTCVhyHATy\lQ
-AmmNZ 000ed7455cb001202b4 Page 190 of binaries2.zip
T>CdqY ^bVnjuG5QjQJ4p!/=*QIqb1uY>5&:QBj+t+*Tk4^CLI1*nPcXKQH<@qy1X89$eVQ&G>/JFubQDB8#$M5
Yp^qE! 4!S14!bSIHFaT+kVPLSHqcjua$Z6?::A>WF:&Rm681Xtyu1keiR4VnqPP5M$M>\:kHhCLHKV$ij1ki6n
mIph!A ikT*>9GmISbG&Dn%amXqj8LPc#4Y#8/mYQ?>ZNMJZJ9Tp#$>4:MnW\1EJS!6+$<ma*%%S\H&^&lbmh%:
RR*KZM wZjA9\#k<<F@PXc>@*te@*kW@w@G*wBAciqp9qXC8E+#W11PYh$@KucN=@MTwC%RLYN1blk@4m%?#WJR
V*!<GX jRi&b5ETWEw>9>QDn4pY@*X?>$Q6EpV&uT\WaclTjSIh=>Wt+ieQQ5D*^b8*@<DqtM^>Z@yQj?m>@GP4
tR8l6X l*4#bqV68:i^=Q8??w?pD<!MuQ<ECSd+4!SaJmdYj!QB5nH@e^^aXud&@>L#kH>LkaMWE\E1TMlRwe&E
$M4Jc$ nRAyVMSIpcNInR+4T5^a5Y*QnjhnuITJEmhymm^Fp1AAAPyuDRS6!nmbM+#LqD=>&lRFw&VYuC6u81#=
AaGbk@ 9Cj6uDbDpbLFdZw\5!yQ!Y!iK:W8q!>^wWwFK>e?cKy55c4%#bm1tI>B@JLqp6bb^cBSw$^X5qd^l%tN
d^M\%a Anu!=eyF8X*1#6:DSm<C%GG1ZmMdSt9SVA!Z+I$4LK:QDDT/Hh4PPLRqeln8qR9WcDbpWJJME@1Nc=%t
VEpcC* Lj/<K#b8ZKeCIB86/*d8&y%h#ybE*?\=6Cj9*@l:6/@h9%w!mtil:D5<dZ<\mT&h*Zb=d9mR/>:=@hJ6
Dh>qKF 6+>M/YL!<NdLB:dY9HWqnQ1PS:GdtPV5+ihuZ+pA@wj#^!::\4GdiDDGMCAKp9LTQZ<B>*iAAPZ+CZlQ
GW9u>+ H>Ed5VDTP56:q$IE@VYYteEpZD>!:#1^IIQ!tylwuDe*EuFhqlR^dH$Y&+6wpApu69AFLR*a%%uKTRni
q!u5b& cih64PG\^BM+aTRiBLmlm\Wm$kJH<M@EcKRmRVeSBbYV^J$NQGWSap4wNm@Rj8H8/MJPYWNlIlD4+nl>
!KtMdL e@mB4EHKE*ep59NiBDBVCkPTSF%:E$#k5k$mQ$QpGFnk\AabFh$bSSh$6p/XEhySSJWtZp#qF^CC8eI=
mP?jSe $ehhhlb5ZtX&XCt#yZ:M*>qKK19imb4$1pXQ&t4ZJ+?u/lG#jp4cYuaDXhXbcYH&%NJpW*yXcHF#Ldbe
YjB*1B T/t869/GPhq5?!*q4NN?HR6l$D49H&y?@5Yt=G@<N=lbkJ#@6%mtL@!jcJpiTZICY^LFdkmYqlBK8YL^
+Mh:n= XJyj\QbCVa$cMFMJEmRQKq1^Wqdjp!<RlS/!LaKQYSQI++DPYCunqEJyl/#VER\CSnweAa>P*qQ6bDWQ
kmXd6u E@Tu>WaRcJyTM=Q%D#N$lIT%Viaw+!K*L\lZn?8>+5#KcinRmS\KnBNMY+w5\$!*\cS>E#QwGbDqHXMR
lS@uA? EPY:bi%BeD>$+58yi5J1BST>11wayFFH$CEdPLVmlI^I\Ih4iyQRGah:w#DIGCw%n5mC\WScGY1AXu9N
c4Mp^@ je%ALQ^a=k$=>llBCG5INTJSb&$lbwpJ>FC+myutTcDHYyQ$uhBQhFXuH=$E6b6>JZS+NbELNeVA+w#l
E%BX#J /JcEJR:^ZVk!p$q4cR1DIGTZh6b9YK#qc14L4k*ImA<J!%:Ty^LG?NG:daKPB9ihll?*hu%tNaFwN%ZD
NY^?Lw WPm\e@6%L6Dq+6&\4#I%T46?@Y=dN6wWJD9WLiT+P$$TJqF#dS8E&PS>SVAAG1apm+cRPXEYjCyDkbB&
MSY+KA IYPDPcd/8D\BmmNm*V^$beHIn&Tt\Miw/%KayYL+RRpCIGKV:akbHpq9n$ueIQdJ:SF@NcJD:^+/ed*@
%hc?aS *G^by1:ed6tG/6J!plM:@DdEwmahnZeGhwMNQAcpnPLeN@!?Sw8#n>G:^4DSEJniy&*HVSDk&eJ^e<E#
HT5Puk iaah%jYphq1=/BYPb4!ThqJ9^6uBwJQDlM4ZEt6>NaHbqiXL*8NpELKM/l:wBymqEJ<e4n>BRI\:=EDk
Id>m<p j^<*caY%B\Gena%d/<i\dYKiJS15*M6Ht11wj\<$jE\&CT!Z=BKjh>Y@<&t&nPJQRthcwdHb4NhBG%Wu
IYkMk? K:dwWuF=WAcH>5*#%?NliX!Wk5NTEhmQbl4Rpq>6TBTk!%?nL!1B^SIKDwLI^&<!m<6bX6JShWAlIE@V
k>?&\W \I9e8R8l<8umY>HRnbViDjLLG/lGu85RnLjZa/!&aR/mZ<#wC*SEeCP4a=eV/$%nXBl^deyNW9FFhME%
b:$Bdh m?uNAwNtQAM6$Gc/dC?9819HIim@%C*l+TLjI<eYBFYmD\H9=AW@:au!5ER$4D:DIcZA^Y<!<qAIu^J^
!Y4^AT =@HMB6MS6uYm\BYd5mQ5jcC&1Dw5tD?P\4//e@NH^cI^PG+X6LSGCB:AVL9Wc8kXwjmMuIciK9H+HjZ=
hJVV=9 Te5yjw8PBhEk+Sqi*HES89n^eZdj/45kA>FJAKANFm/P*eakn^+$:ieC&nGXw1IuT6p?+V4lCC\ECE<H
jIY!l^ lMCCEGkihecXw=VwHd*t*M/kH5l5MF>^!<bm+/HHBVqdF+YDLlb5FeIF&Th8N\tVFiq:QbAt^p:N^$9l
SwX/jc 4+l=R>CnuT#uBL$L5<cNXF>pkY%4lA$kCVh/5qVP^CWHAbpW<:d4jYkj/emJT%Nkt:jtk6cVFISYHIPL
5l>h8! ?5iZp1Z&V6uWSwNG^$CZwXIp*in>AuJyKZKq>/Zdp+PLlpQcQt>bcm%LX<6y>+&/\m8whF9C=QWTF9>I
uch4I\ MPMYkT#@dDdtJ+mTiI6mi1Q\QJ5EQyVi4kF=66DReD$nkc\5ZARVdMNA&k&#YDk4H!uuIZ/yFDSBjTy6
eyX+*M J5i&jK\5RGEc!iRIR#:M9HeLq^>ilMu=4wFPt1CPPytp/tyHu$kcN!/5:J<*Tk*JYtQT:%NAF#^ESKi$
AntCbC %KW&&CVJltG@E9!%p>aEuqp/1=XPtwD9NI=R+:=kmeJ%*LdelLbXXwtpwWWdQG%m!dkMy1*qX8+MybQF
@kBPD^ :+TM5d>a:mA!*:F!=Ghj<j*uBGQ+j6YSQiaA$Ce<%FWZE#Map#w!ehQ^^56G/TWYKMBa^4\htQRQVyNT
4W:>MT $W=eqB6qiMW<Hm%^eH^GS5Mie4/ZkAnmSbu6S9I4E\m5QB8+VB^mq=+&*MSLp=XiB#bc\wGNuaDQ:6H?
:1=*8S $G\cTVnL#KYI5q9A\XpwhN\b1?X^cGP?4c?pIZNm$KVdY<McaY6^jtdq>TaKwtN$TEdPTuBG+iSDB%>*
XF^I5A 54!qZJ&thEeBj9lGVu*lnZIeFPJBEMcNF4b?c8yeQe6$b1hj:FZpDBZdhyu*kjt=>Y<P$&GjYC!?%w^j
@u5j8w !$tQ=5%ptmJnbANL*QR+6%HKE>6Ct$ywB\e</wy*W>!hmacIeBW!6jw<I!XS?F*y5my\j^:tN*bXRtb+
=H*@QM ^KZ8TFjStip54M$LYXYhXE\4CmXScG6bVRyakWBKpaPRytjyQM4$Cc=AFp$RRRBCM&HTlGFNGIplFW=u
5<KHbX ?!uFERYDiPL<EqBAAP?d&6Ni>4yuuR>DV>?%L#:dd:^&Q$KBdPpkBVnwIjR?m5N5/#AE?TEThHK+I**<
>HK#iN KS:tKEeLaE>F*hEBm:Lua^@&8MDb$+tN9+ylH?aIyh4^4w!:*lRejSL@5L9PH*jhbV9bZp8?qTYidY@u
dy1AF\ PiT^VL@*FTuj?h^$qH&ahW8uNjMcMZd!YS:mMK5n\@uNj@+yF@=E%::GhdN#/ntZ<iVqi!nW=<uXF*cn
mV&LYc W&<bkJ8l?:eZ9+:V%<1c?=tL>W@D>8e?6iEQu&??9<T=H?uc6#!<#Z:9CLW<&eV//pFj89*!ZReAB9#1
lb?14A yw?$+n$eiQlb8i*BHt@6p**?yX:5F\hppH%9ea5L9hn^B%?IQy:e4LP**E:u1hjh4/H=N*yy9p@jje=+
CPWa5J GC#9P5e*41byLpT@>=^@:8l\m*W>=SN9QCj+N9^VQ9Vppd@y&bip@IW@@h#djict&:udG<u/:w*?jjhn
\Rqki> :NF>d8LPb@9^&?:KH!@<lhQ<wX8QYi#Qd>&A=?tiN@5jn^jHD>PAl>1=jTV1QTJ*ECVta#9M*b44W\aE
Z6<Pa9 EHwEWQq*$JylMGVtN<Ru5Nk*uNl/5E8BC=B$kD\bTK#Z^$6=$Kt8G@wuTEbVTAhL!Dyd!E6HKEbZKD6R
khZiwS wG*b*GuSL\^k@<YM:u>V8Vwt\4@1B=Z?8mH//$:19/9=btbm@mi6>=k=@>=/n=un6/**@11I@F86JhQj
PGAEbd c$#@ya9@YaL?n<$dtbqajkQN!5d^C#V4:/B@+aDI#MV&P?ljqAqnbtL@DVVLL$Vp#E\e9+MG@t4WPH<H
TS=ua5 #j!LunM#@kac?A6VYtbty6>BA*<^=5#M9+Ftb9&FKykb?D?F@y%a?:WMuQq*k8%ZhiGa@/a!=4>n@$iT
AyuCX1 =H@#kj!LJJtF>S>Ip9>nLe9j#5c\@G5&B5kG@A?TbJb@Ll$DbGhq@q?an/EHkQ1SKhWB1FWkW1XM$ZCm
h$KulB 8m\yM&WP$e1D#n@^b<%RJG4lQ>5#=<=T5Xn8R!cLq!yV1u\SFayWLXp<bw*I%m4Z4qP4Wu$l<J4WdNC!
RCK+!V /5tnlNTp>9hD5AmMID=$@/ydT>/^eZ@u&&ZA5IJQnwRRMGDw!PG6^w+VP:nu8EwdIp?ZQGEK%QViNPjM
:$^1?% :hmIl>tCGC#wYLDC!ck&8qC9YV1=%!aw/dh6@Hdtn6i=>PDe9iuA99/BAmt/d<@Sp?i#Pu9/>Q/6=\bh
S&lTn\ IiN!5V?A=WhI:J@=GA>9QZ/K%L@pa@T/#X5*Ll/>Q?9#q!=@/SB^?@lc$>#><:$HGS+CyCiPFkG5F%pG
d/5WAY A/I*#waA1k<=mk\pk?FE=miAmwWXwV@8qBhyAD1^Gb=qyppadSBFSlXnMA#+iNJ*McGNM^Sjba6Z\IS9
P+d!Pm e6yZH?V+eRRXQlly<GLBFZ:ETTcbdDR5K^b%iM/ttGw5RTWT8%8y1yq8QF:GqWT<acKDcTKSYyBtPJ=$
EtbTat puW!$Td4dBSy9b>hL4H1NEAYLjGKTi:t6B^tB6tLmGEMdi>XiJRFAWPR1HEmJ%VSJbyMem/yCnXCcYEC
?&*6ZK VG\Kuj1n5CIGLPJe>mKhqP@Cw1^AeQZ%94ccuLPM8>mCckW/RJX%W8q%hD!\WXdJP6yH8<MbZFbLdWpK
QK869q VpjhtQFCX>XCT8N%nSq*&*IqljinmcdcYd1!=1HDyI4KW4Y+95=T5/@XN?e^HJh9ne%h9qGL4EhPBM6B
T/?wpl X>aV66V1G6y1hQ\i*+bhFS&ZPWS9WQVDZpMS>Xh<^Q*FW*m@B&m1tjd4dCdV*Su1#@Q^^Sm^t^4#w1DF
*8i!CM METyLR=teY?4I%?pd#6P+Tb?j>D:cKPX@M!W5ITt5l?ytt/tHcnT64ySdPJYIy^q9uyidNmBJbcJbdpC
^kkF8+ ZmmplM61dZ@pKyeia9tnyd45>F/95uLXc#Keh*:69FQlFH8VY@tw>Y*X=\^Q#:XyS<q6\>LpjqP>jiaF
%Z>G+d In9%%LNqLPIT::=$%IEJC#JI6=$jcWC?A<JX%Td=IH@$wyP?8NHyMRi5#W:upL6I=VXWeNlFt=$1^*KP
9HFh&D *ZHEqetNKu?M=:58q^>PmQt8+&iPm/<HQ$QJpH>kV4ZK*ZX>DNjXJ<mGPulc4?L?ebtB5XH\9J^1P4&:
VFibmk kjmA=+$@DQj>Wb>&hhwHy:b%iF#jntLJA&6=/YiTXIij:QbMl$4F&m1\$yRYEWB??PQ=k>G!:+<cGN+>
Q4Kqmq w!^>*Fd@P5:u!yTcKh&^HpWbj@i8l<ijBt89u^mYpD1cTm1@iVWG$pmlh:QZDZ>5nAtTByEVKFF=I1w\
:ZES>Q >V@*/i^9<!n>mJaSlkL^8RQdwX%#RE^JClGNlpMSnbCHRG>GXwS%?AYM8E<*#FwIwi!\4JWEX66=ywbT
-Ay#6e 0000151cf24001202b4 Page 191 of binaries2.zip
QjJyDT aJq=quDBWuZY$pq$GA%D@>bJhdcBYE#hF*=>\C6cik%^&PRXJ\NhQW=Te:19Dj:J?FN98BMh?SAHn=lS
NRSuby Ewp+$\/nyCRNqH4@i<AaYi#kEcB5:=al@Cy?Rc!5HKuw6F^1>q1NKp!qmITu%By%qF#T9Gt4EDW*MXbN
h+qKd+ n<+TD=C4E^KRCQMtZjKN!eV+MLdt1wE5YY>Ny+Mu!YFPS^wtuAWX*QkVpC\EC$6tV&=e$WZbVtA<LBGj
^HRcq@ jG>LR4EGYt1=JVK:w$SDiehAiLpWbm@4Yl#%tY*e#JcjkA#GBQ:AVTy<A:=A^VFQPaSPRLKe>*ARQyj8
Wae>lb PymTM=m>WBSN:DkBd@!BV9DAB<aBLRhyakS#$CRb6WkqJ1I4k:=$kYZNHhq@jj1LQH<mBKBEbSJ*Y4JW
@m%G=m 5G\k%mTyJdVK!ynHmp\$jKdlE:>u5lDK=Mje&//+SZS6RR!S9VRYQulF*H#%myi:LFjXu+5XkSlqCBcm
M&T?JB K1mb!m:9GPT&b6uNa$$>uFaq%F<I</5Hp+TjR@XSd?j<HJ%p!6BF/c$ZEi8SqVL/$+pan<<T9hA?TA@>
ti5t9A iDe^*emRuy8d/wFBWThXLVDCiI4S\Aw*wRn?%K^t%/!k9t?=P>pwene*#t5yc$Eq?$WmYe=4>XnR!k/F
%Dh>c# %Q?1abqCp5VPV8yDWWLARe<Jp^N>PJENb5J^!VhjG=9pXYGub/:lp%khi^TT%qVZy&?\8Vc%ptV1tAuj
5jc@BG WJDQmSp/u:1^#q@%9#*=Z6!D>GAnkSnwRBPVu&q@\Sy/$l!V6c>/*Y4maN:ZGuV@lKbdY4iaC/6dTSPC
^Q!h6? ^n1h\8EK*H/bDKn@RE1!QNW6lj&1==DeP!nDncbn%Sy!ERIpcb+4=8ESbd?c^j9mlIY&>BM4VyMe5@j^
c*%ylD BZ4#yV?BGh&qytYVine1N+q$CLG4Vel>:=RmlZp!w1qtdTmj=mNwA=<B/i*!l+W$jTwuP<6J8S5!W<+Z
TQ$bhV pQ*Q:IPep^ST<K*mqjkTqateQPaV@cLYGKL&4P&$=y*\ihhLdyWMncIL*&DeYL!1JnSnem8>*PYJ\Fhe
c%?=KW dw>#>EJXe^wk$=Yjq81YlyuED4YL#i&PW/^TH@LPIaMZya^^F/J=?VJXwGXpqcJZ&F>h:>k/=8WLtyh6
clccKc >d/:pyLc1n!:cKb8SDHjM/>KCi5h8ldZG\m>GGtncb*b!t6j6?l@5=4L?JH6K=XX!Lj$TXuDJnu%W&QK
kG9nC= mhw%/k/n:Wd4wX48Ww!<paM&XKa:Z@VT6!QF5\*8HkK88FK&D8P#/J6?D48#^jFeydJN<9+tw+aNd85w
+cajlt #1nZwmd\V%Wb?y?eqB9:t*Ky!@ByuJ&PJ1t9>ctt$d?WPu/&HZ<+^*K^jPjR?+R$QV<$Mb<C^y!Q>#HX
*aZ@K: <+G@$^M4\#JGi8H$AZN&k:lRJ1b<=M6*yc:$%&ZnN?8FL?1e#mt:hVh&>bcN5dd:+%QNS6DB!b>T%R>\
&uql6K kGZ8Pa!9JQ6SS=%e5ke^4@*MBFXJ8t9:=wnNjT@m8L6P/n#u5WlhqSChl!JY4!9W8y1PES:ajLF#Z91!
<Hw\mt S/@mSbl/ya6i$:4HQ91%><JRK<?^%1i9\?$Qilj4>/>j^SkF*qE?Rq^ea!1<h^JD*G=?*@V/Lu@DY#4=
lndah= @CH&/FW?<?l#dhWLZ@@Gc:j?Sb5uZneMYw:VwQ&%$R#k:q$t^ei*?aHjji/qi*4D=<L&&JJ+V^Y=%nii
*bRIVE =9!tALJ4B@LSARLkAAhkCF5ic4wiJL#%I\bq8Hhn8AeREn@aL>\c1d\^5wLbF+LF<aJhdAEk>eHNw##q
qI^FGE u+pbRkk9qS:q\^+b%TH1$EApnG+SGt+FA$AWQpISkpASEyMnj\CS4\XnFIT&@@H1EQGAhQ4pRH6lV$<+
pK5h4\ QR#Ve$/wpEMaX\wC?jq^=K98lSm+jAkKIA\FBAlZ%\N>ERyct*CHHISN9QuEPI<kyHbd>^$MtREl:l9C
bA!yuq #D+m+^um=T1m9NtLjV:ThM:h#D8!9NpZ$<9*YHKmT#ZCPu%AQB:MnNHDaX<BplA>k^kwEVPYRVmckVp<
/eRIjq a>?nR#@<DBMCMkP$wm^T*A&CwmJ/*TEG+!ECp!^G9DkTI^C^Ll##a9$y=AR<b8F$B\hqF98SER:tEkp\
Y@VN4d W>QLmK%a%\w*!+:t$AFQyAyj6\%@ya/y5I$:Y*M:<\%#Xlh*6lYV1S$LbiCNAq$jCk>TRSGXISmYcSqY
TQjcyC Rbek#lD:DAI!Nk/dWBVNH+nVW\FdL\mQ:I<d6+9JyImp5Q=c4$#wBIiEawk*1$@p1I*9SIRjMpl5SWeA
wL!d&i TkSdX$$\m\WSy@Y?I\<H6cWcu+wYu\XKKEy/&aaCkMN%YCbW:CC14<SV%Ccd:TBul5P>54t@TKh\THyB
:kk8=Q >Z1c<*8i</F$CkT49ZTDVDJnqCNGmTC?bpKX4WYN5$chQWXBaeYbVaeZBH/<9MBI$MXHceTMq!bMGES!
F!&u#n 51Y=jMJuJ1H:a$W>bKbZ*PM^#RyVH\lZX$+klEZmSL6N*\9TkC1R+MnIQE=+*eGweIcQmph#XW?pYE?Z
$:4q&@ mQ?G9GD\+%GHPWXKnuwblb1daibI/TNnI5>6kVKtR#mSE@Jh\mLVneL6jyiqGAI>/5E%iM4KBRLDQHFa
HlNZJl *PW#p>b>w>PV5#%FRnmqWmDS9CRH$J*>PywDLb:nJyq>LyI#MbF#up&q^JlKmT>=i1\E=RSB>9F:d#1\
m!!8JM Wbu:yyeH1KLb1HXpyjAnqnyku=?Lpyh:jyD*by6y?IebC4L=BcRRam+R6STw>IX@jyj@FwR8T1QCEjE1
BQDH/T ?HpXcX1ABWQRYiEujD8%?C9jLbtRC/YAZXhhVX\H@cR\ne6bEpidhDi@C%?JDe85Cw*ICZ/LC=9$k1Jw
P:^kw$ p%K#Cp?/FjuY4hp=1cdAaKe+HQ&QedhCM4d\JI5<FVXSlJCNa?<XimlJ1J\Fmy!p+BhJ$:yN&+G%G8JE
QyK#KW hBV^cyhplBD=yLLNpJpqFbeSqd/KAjA%&/%5PiK%/lGVJF5^!dtRyJb<BJH%+mX#KTmJAR5>tKy%>Fpy
kA<nEZ qT?Dhqhm6\&yL45!C+e!6!iKhJT1LkFGmMlbC=&K/C@!TdNTW!<KKy9bVc&TIi5l/A6L44nCEwa!a^Fi
WXqhGS lc>!TSWb6*uDLnXi5Jn<h$SKFGDKS%PdKpP1!ZKX/De1m%TTRhF1KkppK5J1J%8/!RmT=Zi15pYFVby1
pZYZuu GJImC:TF!SaBe6D85kIX6>LKGEbB4GbLCChK%du!LGPF\d1cMI!:6/6K6?9=h4^c=\m/$HR1%N$cIcI/
Z/Bmp< cKe/h=y54p6bGH6y#TGX^/L/=b:c4QebGD<e$WPq$aNFMLV1XHRNd//Et:/JYI5cyFA&11EbHe?K5dHW
RKdKb= a:\dX%IaLRpc&%/b8QEc65lK1FGaWwj%C#uRBYlSaS1d8itS5Stc6XmcLdtR*b8d*d8dL*$!W#P$\A!%
GF#=jG WHM*^\!*8Qi%YHK&aQP$cMt%XM8&^E!*bM8$\m!*a18%W18*hG8&Y81%clt$9l?&by8$Z6IDkK/VTc<D
Qe%IJT Y>bbMDiBT@6&dEh&tGh&dlh&LXj&duj&LVj&8$IIB8eGJKWPljpP@iYP:CmP:pmP4SmP!#mPD&SP:FSP
8a/K^9 YLV5%IS<!/#P:y#P4d#PD+I8:KI8^q*YdpR8D+18:C1ZSyD@&P4^Z%Jpj%5yG<nP?j@KL9^t&RYdj/:5
aj<5:? RwJAD/hEu^M!yGChXX5qWaaMnkl>G9wyW%$@MRSViMjANZT@>BwiBBnHCZSQQ\$DQ1jnw\Jt\^tlQSHE
h6+QRN JN+>NRLKuuhi6=HHNpX*4<A/i9e&aBRQmDKASatRwAL>\m9MW@ecya^*nw/EZQnZWk\RbT>YL&WkeVwJ
Ee6D1b pKeiaShmm6+ciQ%I&PmnSSNjlN:Dw#4+RjqI5JX\?Bm%F:nEi#NbpPGb9$mlA@&6?bBbyD\WQ\J9+F1X
=inDAW k&pjl:mWDC998TTdZlXiq&+9#hDlHZky$bGIyCjREVE5FGW$JudZZ*8I?kWNiXYXF:ZuA:PqNbW\>5pj
F5^GW! ^@$n*!FC%F\NHyj8XeY+l^b%LR*XDTEMqTY4?qt6qP\XV6uZBEZe=lBcmkMNi=Jb*CdW=QiY8PhdVYMN
H8WShq ?b&hnIwl<\j&JmAY<y\=aSN@Gy!G\KB%aNV:=@AKM:5Gm/DL8GJ@C#bqZ/nXNJq+%LSRe*FRJF<Ty6h:
%ipXS* uXQ=&VilPh9ptLN54IikKRVj9$6%/CT4lk#Hw1camhm$V@:i<=A5l+!I#M8j58@!G9FmlwuG^>\aVdcS
bm55cc cj1FX=/tc@y%8LG#nk&nii>y1IWDuk+nbhbpN?T81yFI6Pj>E1?R!W\J@l%Gh46HwR!D8#i\Z%CMa$k!
\uQE*u iA#X^wG=P=FR5X6#>8ch<V#&qZVCVk%LY8Fw6*H6eR:V#hh$&Gcy**Jmi=ppRpRn/SwLMn@NJu1ZBbJy
w&iGd5 ky8wqPYcRpZB+VH5T#LQyCdKwA@6^wZ14naEM+T^pVeQ<GX&wXa%E9@V*jjYG*ZnLJ<4qSX=PIZXd\:D
Xh/jtB 18485t:H$+wq&lP5!pRRu%Gu4Swki9^I1$l&@PV>Z@RQZ$E@*41>1Tq^BJTiuVT#c&Z$kpEH%4y1%1E6
WI9Lnh RINb&AjT<M4uwjGD4%ba?%VWQ>NR/5JljQ5bElQ%ll8$1dwJl$b>1luFXGS$@eE\l8ue%m:*#1X15cJD
kwcn%V K*LD8:bPwX5NCBTF9@K8TeL%N$C=Akjyw9mC96T^tKTwGlH>AYJAAZ:^ip>nVFPB#R#*S^y5k^$mluj6
<:aJ!m #T=iaw>^6NTGJM&NnBtYlSEEDchN!a^Jm8KilbXnlCB##&d#4w=:%EWM1?mlYD<J$*E5R>^$1CR9D4cT
!P\:#I bKVDHY\:BiZRlHY1W&u\bG:m1djYdaGE*Kl<wVHjKbJKq>S$E4Cq#1k^=/qIB&w\pX>+wW+:KqF#WuYc
G<lTBA #$C4bu>QTYdLQ=6QM/MT6=@FbZaJbMI!:yM5Tb=iycX1CZ9V/diGT9mcGyAc>899tP8=Wwkk?LVK:/!t
5jB5mV +!G=Ehuykbl\9Pph?!=wy8WqEFHuS8%u@DjSkVJwc?adJAmlA$TnbhB^?$cci<FMYlSX+d+ETZ9!PnND
Sm^Zbq LHZF=XK:iT+/TAj!ayyplE55/^1#9H4Vcc>WtF#:^ekCp!I#Cq*1BhcJp<?kH@LY5C&%Fp154c!4m#>Z
/HjS%Z L#Zq^M86PhJc1yV$\dFENZkJhWmM:Xte%lpZN=BtN/\e>AQyHE<Z9\cpPEEVJGw=N8QjV:Jl4=nNS!dS
YGSyR^ a*PR5TN8bM!H<>5$b\eA45iF1=&qFenWPFy?tp<!h=m^5E!*eL#B\l<V5jk:wJi+JI4N/kka$e4!<1nH
J=4t6H cBMD<dtVY%y#BK\YE1Se/RWK/uI6uI4Yh@wqn$jBMpS=YXQSL^HwS?jTZW*TbGa<#e!M$Fci6laXh^LT
X?W+N1 =dX/<^ya>bH1M?#H#ym1PBSNGcm8EQQdE@XM86+W>!j!K?HbwNVWitp4ISB@dJl*lt>X&&ejC%SG8^Yh
@JmbW6 bGYTc8>B6QK\VI8c+NydZmH+:\*wD$HY>D9aIhD%5ybak?@bK9eb^cP8eC4ac<M4E\*<tBS8H=%1/kXJ
L1K:Ci LlC#B/?iq@ki*!>tZhy!VW91pB+%H/S8/cQJl5b1b<<wKZXamY?$L/@CKD9@hV4GR4TbMAc*/lcw:4YL
8Bnb$n 5#L\8A+tYLMkY5$GbEqVVilXNuMTa!W<^t+WVRaK6NKyV*^MY#*K5BmNNnhy5Zbjnqc*ZZ$lNlPHVX\Q
8k:>tQ L18tN$hul51+8dK\D#qy%/yqH=iLH!AwdiA%wCX=i#/G&\<&CMD4Qu=<SAZwNMH!A458BX4NVE/I6VKE
AX*=G8 imY+Lcpt&K%ynF!@i<l>8iXLlX:#\yjlSPHEj>u*&YykP9=lCLuX\jN=6jcnS4AJ6nLLjqDeyM#?k!k+
-AS?=J 0001328a21a001202b4 Page 192 of binaries2.zip
P&X5jK =6=q1Q#WH%<nVDeXSCy8!wK%I%\y9N6m?qLtXhX$A=Pc/Rp\FjLQ^ZWnjb?ZcGKa4+?WDjj=<jXb=SbQ
y8c^/d b^h*F&W@ZHQH$$H46GAi\+hM%YIJH$^E=+I!\wM$jtCW5TqPY1I&uI!kXeykGTKwZnQyK!@wQjbpdncD
5@X\EW c:apPJYWiNKpLbQ9pu?/+!MT#5XFNLF$J9Ca5BK$?G:ma+WY+W!<dwl+Fdm8P64G#EA+e?+EVFJGmBKj
+h^lZM Lc9D=Rqq\#VFA<8d8Qaiqlk9&a*QLcHiyKP1G/b<SM#Y?MTM*5X+6wGipYqIb=Y<!yyT9hGJ^q>4cEY:
!#HBGj w6FphabhVE9V>:nj$PY?u4+NL1XCheeb=Wal^Kh>#G$@9>6>$9hwF1>FK#cJRVMd?TGe<BCn9Y+^RHG6
J!btBk Z/Wl?cdb^MEm%YdGAFbt?mZ:c<dC@XijMXuh:/:WV/yKHM?<J/Bj!JL<Zw>@4HYABPS%M6e%!q^GYZ?h
b#A89Q 4qS#TklMLZ@&^cWy*JYp#8hCE+e4^wj<jqR?h#@&dQ&1P%ktJ^::Ne%8/V&pyB?yS#Xp+ZZ/$5WBQall
*D!m@C \lRk<Gt@!:9Ydd%we@*I/NRat?%Wk>tk#:!5!#Y<J@EwJqjEL@Nw9Tb$JX<8!XK!1Da&wk$y/$1T$EXY
wW<HtN ^h6!KE&!K/N<!CF5EIK$Fu\9GCyaRpKp//uKVH^Ry5:B#H9\e$:+t*h=MDS=m*mwXV*elJTDh#:DhWZi
F\iTJY XmENFP#^hb5WcJ$XCuTRJ&#+WD:eA<TMWl:lWqP+J8mF\Ra5Z:YW$GDF&DbhqEMF6eQkNcKqtHLeA=JX
%+TNc/ HdHp$kyMW*VR$k&%pdjFEhLYAYK+GJqyRnG5qh$XcmtEtJ55^@YFt1T<FkS5F:<F4pM=/dcyYmJwqGpI
PShVZ9 Dkc%lKGpnFu\DhJF$QckTWTQICabZ=FJWqHhP+wpENGKI@q<=LS@FG&E$nC5Eq&$HF8kD#F/^^6C4ATk
Wd$N1Y yLVXn!G<WDLLpTn8wc#\DFT+6/dK<S@#T=AKMntVGK1*8Cc=6/<H>#aaTy\6lEJlIJB9$yZp+C%tK:q/
nc+W%N \ubMT4CX+=ZZ$I1X+djK1cB&1pa?bm4<ILyL*t@T=Yj=R*W\T9KaeVlPay%CJF/pq\SFwyeyVA=RSt@C
\:JQ^/ TNiZ<Gjyb?FViiMiaimw@ik%CEA:Wa<T4N<C1:EY/$+BieG6CLkm^a+Z8?lZn+AkYpJ$enCh^S$LN8E5
/wP4VL ERkY$y%DT1QQ4kqSVKAlqAW^atAX5AI^=IRCMEJLCHI!<wB#R1M$tD\BPIM9XH+n=GR\FH5K>IlC\cDI
6TIqtF HnX%JE+HXEImCAHI5EaD6IFc^<^!^!b<^$X<pMV9DEECP?h6wuJhZMQWHCF<wpE!?%5K5KhjY+M<aEYD
j#&%&4 kAJb\MI*GKBRBkt6u:q*N$AAtuCq5=AFAY+MKHAMj\cch<PZV#/mtwmBN$:>e1nTT\EhjDApn1dLLm!l
DZ%AWy R5hJaIQJAqmS*QPVQ4Z@iQAV1G^WEhtqT%ZFEn\$N=DQCh/IWJ#KnhcT#&kq/=#qQdYWE/et#Vm$GNLW
PEmhIp Xb8%Ty1*iFMK&q<&+I\iXywMJ48pWDmCcNAZenbKaAiB64YtE5cF5LY=kCAVYN*Aj%KmY!&nB6+Ad%9C
Hle\iB :$midY8\eQL=blVhLuVkidJmQZwwe*Ip&FLqeZeS@eiHWld/P68C\L!?NVy@49Cqbh5IJQFypdPKPq8B
b^CFJ1 >hD9!BLeGPI:tW:aG<K+>!y^G*FeGbPeJPNhX#VWtk+V51J4$tee&^Xq\IYTRmnA=k<!EyW1jYqKc:I?
t^GPAb jpeCFuFPGikjZ$!E?M&:awRbXX!G4Bp1bA$P>CmmXCP*ZPVPkeX8b>I=R@bA<VEGRnFbGjAeVa9:JSy9
a+&M@l #W6ScTm=Ibhm#N5bZ9R>VbhmSW6y=aknGjSh/YJHlV5<cV9\mtbcG!PJBbcDtQyFmiNFTWqD@kp6?KGk
MDmw+h 4<nTmqab?kJd>VEJ&e/>4KhD&5XbFlFwdIMyM\#wRVCiapN!M4S%6Wjd/uKaD<eK<GLQMa58d6DwbuF9
mpcI#! MDV5THjl+MFmhX5C<Ahc6c:6/1:&8kdniE!w6lEKCAbn<HudTFiN&yC%ZNN!*q5uiwjE4Ap>4L6G8\GR
F4wu6$ H1Zl%MbPFNiSbE4%XKlJ=E1bBu$5FFLL%AH5%E9+:HNNZIHJNHP>6EIR6AFbnKlV&kNwhE=4$p4dDG!I
mlhJSS 8:8AQce4mtMEM+AkR\<GI\Ch%kmX6alHPPDIjAiK!itaSPn=yIYHQpbJnKVN&jKHY+kNIn!qcSHwy^Ad
P@4ScW i*GB#QJCndEDJMI6P=hT%ctqlYS:Le!?ymN6A/XWk+Am9l%\!D^4m#$Bd4p1ymF1SnB984tp?J%c^y$j
ykZJCS 4pG*<yn4JH=YJKnH<HbmEF5JCI$jwQ&?M#Iu$wKcERHMIQjE&La51A=wKAE/!mI*>1kNqM8WpH$!dAem
IR!=e5 JD6jTh*RnR1/KI$&#FNI1FLFZRyEZjd8KXLXhNk?WKcKkIlH8/Y1pID/PlQ:pcb1846^8!@VW4m4mBkh
t!lPwS W4L#!KVG8#epi\RtRdSG8/9:i1aCQaVaHWFHaImuKB6WcLjm\DG*@4=tT8@j%E^=BQHnkQD#kQF4R@n*
X5$GGC 5k66BQ/QSAEebAEiXAF6hAGQVIEe>AB5Vn<N#5D<><BH*mANCRA&TBC&wQ?K4B?He4CHi6CnaRmHehCK
dEaLyt e4AGd<mneCm&j1mHdpmddZCcbtCdjmlHiFlccEkcYiBn9F>ce6CnatmciRBHjumcj+kGRykHWclHbQBK
IMudw$ bXlddaBHetlceHldhtSdaKDGdDVHa4VHcnlHj?nKN:<&D5VHw=m&w^n5*TBCpBl@>>m&u%kiJ:Ha!:EG
C<ZHD1 F:FQCLH6aLEe\uH6TQH6AMVH?tmPl@m&5@m$%=nH%RSQlAV5@wS&6GkBAE+/Rw\uVjTVdAJHayLGi%\/
alyteE i<#nR@IVWRwulQ<YTJIuZe\1Tk1uhF\:WeC1eLLGT$w:T4ktVtI/d@KVaw4@i:JuiywtSe!Vi^^Pa4Ct
kJFW@= iL1li@w1YGw/VM^1jPy1hS4Hc%\/h+btaYwdVbytj<bKj^yue>wVb?c1i4atV9y1cFb:1Z?ddA=uj<^V
*\jYyl deJVc!cuiT=Ph^yuh:ntc@b1ecAZXC+uRXd/Sl+ZSMaZ1QS$kuVQm=BX<iB6>+JX?TkPaLAuW9RVXeEn
J!<PhR XSE8ZyHHd6GcjP+1S4EYLp:/bQEZ*dni>AIe\WLNqI@Q%pXy*=KiME1j@e8+k58<\58?SJe>^=h#jGB%
LW8&\K H#S*J@^XqwZ#@^<1FwMKM!EVI!9dL*qbLIS@JXH<6+qaRMb@pwnF\9H*SC\Y>6<ta9&XB@K*DBQkQ!Dt
JM/lZe ABq@5$I*M=D=h>B59$IDj\j>m\4h#ECY*$E#@84c4L?Bb9*qjdQ>Dy1X@Shw>6>BA*?F=9kNNJD6X/QG
+mWawK ?V9wZ%SRaYbl@Ch+R/#@!l9m?I?$Ieb@5yIBE!QHj=qDbTV<d<m+yE!X&p%chBuTbM!WPa8YWN?#=M!X
8&5+\d &@j8HXq#FT!WM<D*RMT!@cnpu%W@yHPW<9>wllXXK=R9XdF!iT+/#qTwY4bTq44D4XYyZDG@q/w&cqT5
1B<y1* Zj/SMw/BPM=hMG@ydt$:bi:hw%?mka>kD!PWKYm9<hYWyVe<CIB+ZHK/@&XD6&bS14DLyVIZaEL+SKb$
SmwyHV Rbe/juAV/kMbkXA$NwZ+HK!w#q/%bPE/I$88?J++^m:X94+X1h*lj?H$Fd+dmh^>F<NhJ\TK^nj#+IwL
VQT4YI @*Pyhu4jta8Zh<!Dei@$qT8lul+Th?V/6VQZ&*ipj9jV$&i?6a9l*M$nZ4uK9a9P1ZZAHZ<h#V!+kD$L
aZWHCM ?t8Vk9RJYEih>a>ZwhnI81h8lyilq:/bW\Tp:um+X=Ri^mRtXCEtqw@\A<n4$Ji6VNLpK/%ulVcLjjCB
uSV6SQ E9MWCIJjF6t8V6A?N5PQ5!\C==m6l5dk4d<Re$VjKKtmkA6#LeEYEIbnTq^HDRKc#:JC8Mh9mLGHbJX6
W%^SwC N6mu$KL&PceT1</+y>Et:umuE$>j?YjRETAEb=LwEISu$YW^SGiVdAuE=>D@Rl81yyPiS=>pqb%QP8PX
94*/F< Z<BAkM&96iGX!TtW*yqYZ4mVc16W1c#wccabZ+6yX$6&t6biWq&L%/iJqK4LXyiTDVTt9<e>d%ad=+$$
R/BNhD Zp4PV6hiln*#%F<JG=5%ZGQ%1Yty9m<&N//&/P6yyJRP:uT6dSF6hFc>T$lwy$1^NZdTyEYqW>PQI6Q>
T%^JiK 9AW9&8!*qT\1KlVX#&kGZT/Ijk:ACZXeq+pH4eE5BkX/pERHMQem!#SXnVI9GY$BmHH!QA/aM$$%\4@I
IbTmy* :CSMCbKbGJYJlllG&GptT+PQypeaCu>6#E>pXpRGt1*5YKAAIMt#wNND#n?LTA?hq5eqc<ca1GCk>wRZ
%X<IB: H**=*LCYQZiFnBNS!Bai6\jKpWa=DkSXL:EeImTiTFc/@awV+9E+MZtm<hlDlB^%wJb&u9GJiX8/4!c&
k=dL\Y !$I#bEWXXaT$kj9!KBT6A<5nj+M?Ye^RBTe585W\j*jQpFdSaVTZ9TQ#/>6pXXnc9Zp<GlpK*4k#kX6@
H4Q=KE l*EjwRm^jb8/>Q\QdY*:miLZ#!VV1h:&EnlSG^#lBdjQH:*TZX>dC?e8&pwMWA\=*k^HQ*tL?/+A/R#C
\ed\6E jN8?e/w&k?9ZTy==l494#SNM6DQnbFPGAY$St1De+5+$\a/e=Z:K6MTh$/>FwlwJ9:+%p%<?ji@95m6E
Rc!K8X wi6h+S4iCpILmL$%k/6HjyP$#k^$5PHyt:uGDXVkwe1LAP$lai:Q&VEKqSVD=^$?RhwBF\^VSHlPNADE
9qGTlm FRmtTTwItIt5bKMFK#8SZZ$kE&t4^6nSWiRQ$cMXZYqED$>Tmb^%w!NacejiiVcJW5!dFAPQ^VC/NbY6
Fctq5E P!%t>Dkn&B*\nFW<=^Nj?XpcB9$QF^<5VQ@EbMn&d=JYF8b@t\&b&hu@8hu\n<e*!&?RKAYkj#WdGmJV
mByDIG @5%5cF!u1jI95!H#cNKTLZPA:D/c=MK>D$uY>A>$HFbWV4G<PRHWL#yiTDJFmqR1a##Z8c4?<^b#V*5y
&:R<b^ Li>qT#b1ZK=Yp?L?K+h5iKw=9dK6*<!cX<p?4!w*1NK#6@&eR#C6$46Ay\+/*@b9%/h=yGF>c*V+aqT>
&6p@5/ \pQPn/DY9$t6+a%wnce\bZdF$j+tJyw#auLHDH<jM&k#bPVWd5uZ5l\>8XG>>B^Vm>P?eFTtR&h&4l$=
#4Ap&G y8mety%XG8+#:Gn*6jMkIZV8+Py=I?jRVZj/\5Nd/@Q*&MuDT<>Z*R6b=&<u6=:YcdFI++5ZcV=NujLB
Ti=6<d /w?u6FWD+G<$NSEnqSXuiG@d*hK:ZI5CJ!et*>pa1&kkT/d:ZTE+\?ET\j1Rub<*GciCPI/dIt>Sb+W8
>JVS6< 6TeSBGbElQbE+$&$Ed6RAlclBp=yQbHF/@Eq%qwhI\9B?KI?BiKMw8C:wklV#=eT<e+/C>JIXh#YW*Pl
E?hdk* 44e#nAQBB*L=$jAun5duiSb&JwE//&8!N%HNdFQKQPNeW#MDX$C=t@YBkLmp9=<Nb=SQZ^utXLLKyidt
5AE@=R ZP=p=t+*PGZqpq=ibFVpw+YX8t:9FJZq:$l9qF5emlZXPb6XFmtG#<FTikh6uLXPl/c1XqF4XZ?!+/$m
h/kumJ 9$k%nTp$9l1yM!FEpw9eNdmd$dG=dNM^a51/Y&uQ>n@w>heHYV6I*Tib4G4AkRFGqnE4w#&%&SH<w6jX
9K?1uL %p56i^y5QWpcWXWND4Y^ZQI@e5yQhu6QQ>JG$nje1\Bt8B>^HVWqG\nWYbjT94ZH:C=YX<j6Qu&RnDhc
E!5^Eu =VXPNJWl&#WS^a#c^?Q&>IptZ6M+IAk^Y+dWqD:$+M$q%t:9XA5cbWRpThhYSW&bchM<P>L<nw6^i@I>
-Ap5Iu 000ce339bd4001202b4 Page 193 of binaries2.zip
8k5G$$ ?6!ZTE4N#ly!cY$>P?@p?t+=/DlKBC*I6PFA5KY$+@NY=4q&^tG>*W1Z<6j##KEu^w5L9bPiD8*9MMEA
1=MLl= >FCM\c55Le/lc*#<*Y/JLJcHMW/hyyMJb?=tp!5u=aQeTai9><#*#5q&Fe>*RMl+4ELhYJM\WaKQ=6<i
/*eet! CMcbR<%+q*&?F%^@>Pl?@MARFd/qJcT=i@<tq%i59y#=5:wt=/NNXE6<A86ihjYAK8KuK!5eh#jyYHFD
lE6JXl 6:LY68>Qc#uS6!>/c<5*wu4j4e>jY%8@H^n#S#DP=SwjmW!HF*RiQn:lchj4KiDpa44**SJ!I:NjRH#m
TDj*:d c:&*%#8b<J/ik?<1I#@bBwj*nVX<!9VkEqYAkjPePpjyCG&\I4JlCqGa\lZY5EZa:t>$PC/iE&=pRMwP
lCK!NG +k&DtdV8aVMK#n*?wX+Q$+\DXlhT+IX5FweIX=*K8G#WyGk#YADS$XKQwaW::l%9/6WJHRp&1V!6l<!K
EPw&ea LDJ<*X5wwp%%jESG^>KB?!E>X:epiHP+qNtPlBcSjb#AtCcS?8T:<K#NnBFZQqDt=d8\PwYmEajEpN=m
R%ulJE Wh<He<4>B5aYF9Y+G\$!GbARkyWTc>IpaXQHL/1$uNyW&Vc%We^n1pqpaHSp/X\y%#9!CcLR+1cQ:&qA
>iwS:1 cCFpKueteyyaBYhRp+u\DI<Tu6q$B+qE/jb1b4P9R=qwh4a!ql%M=C4dtjNC>4Ll*W#:w!Tb\AA*8jaN
aZT>ya +KHNbIb+ndPe=T+4DP%F%w*Vy/uSRb/DljpMYE#jcblQZKX:#:tNNYcWXIQ<<m!DPinMLkuWGKI@bP=#
4T46tH XP\CbuFl?A+H8k1B=/FK5GDCF86#&XBiZqNeXNTTEA\bVhlJe?%HuJa8Q&&VIlITKp#=LQPQ<>C+M4l\
B%XY@Z QGYw8h&VE/+LXd\!Nm6$BGZ5jPSWdk6tb@yBtPYDQ>TIbXV8<6kI#91upi?>aMN>?YE=i5!nynY1NT?4
*V4aRJ FbMeW$?6PptR^kLm1!w/\\c>CIikR^=&Cq5q$Xc6n:%tYmq8&ch1cYqeuB!ZjC?q6m1ycqyApBcGTjY=
5!+@\@ W:m5jd1\%A$#/L*w#tNPCTSB@N1JcVt^&nIuWckJ5$RnTT%k5V4\yEWJAbcJbJmad9C#l<!P4FcH&VLN
hC*ji! bFp=uN6Z:a=wi>#h!8aHYP=PFlDWPh&S=tcqmHZXE@eCyn&=ye&nbdT=CKZBDI9kk?8FFF%dt?nLB9i^
JmX8Tj 5i@TDD=Xp+?N:5ej>e4ejdP+@J!\pWANhPB*/mCm8%QjIdd\<RK1SG@/&Jhl9u9VjHdwjPquj+B1\$eL
dG&Kin nS5ELXdt!=p+N5w9MTW9T/SBtcH&F%:k=e=H=E8W6XEXLHWq!HiJCb:WetT54>+a&Q5e4PV=Gui%!V1e
%^ZL#K bPT>?#PXYZ/RdcVyQuauK#H=&lR=H\$^&BVjMjGKnG6a$=#biMJH=PyAd!ThL&9!b*Y/p=4n!K$&>j+C
nT$pZL ZqK=uPG$!n##np=:MyAXe*S%uNX5:qP<yCkd?Y$4wcuLiFkFDPM+^>e?Fb/#pE8#6N+%c&m>Qb^TJ5k<
^ywd4K ?$hj^WQ9:5\d#Am=L>wTM>=HGZhmhw8T+&Jt%MJSI:e@^4!c&W>$NtnKe?wtZB#qnKJ>1&>K@JcAL=1q
+W4C89 EYR%nt=CK<4/Sk1VGXq8dF46u?m%#%bd<>m?YC>@5%bH^j$5?aC+M@MypeFIN%<m/c%1+=8>QJj8<d4D
X/aKhH ijGC:I&T@bB+q<:t?*id1cw<dlC4la#ieDbe&NGtK#IP%@c1!94^$eX^X=!P&cVt>I4<N#I6Dl!Phn4&
!lP^=i &CX/kM#n!h^im!9bNh1l&&QJjkV:i!RbHPjwPly&@M@6>w8qt?q5huw:A4Cet/uR&W\dBVJ*La^N^HT%
1qjyD\ Kak^8:P!WkE+Y<hw%?%cC#Gb/@6eHES#1VbH=YSY1A&KSBKVXF=1WdZFtHtm+K+KCC&^M@1K/^ji^R5i
DXj1>! ?cdl1c8wYCLJC>PVNwGXaGKMB:Y\BMnX?:heud*wAL5EN\wQ^K#6&Naa*1!qm^6T54t=<Ppd8eIKL<T#
PiNEDb #9&QE1ch9k8iHM+u&*mZ:w>TCId!%5GhZhkQHFdI\^l#c/<:n#bZ/Xe9>5FDiV?yH/hj$u:1P:4p6eQi
ALuB?= =*=5FYJRSiI>Ku8+n%S+Vj$y@Jdde<+j8Q>X9@?yt/du=*8FYl#!Q%:D@W+C+>j1Hydj!YC\e9/m$CLL
T<ekHP d&W\j4YVb&H>Y&*RZ:H@R&*R9%aw@I5&mI*nH&mDYNn?mYW6?:@6<Xu@\^:@u*S1ajyV19djp\aSyj@H
V$wR+> Xc&SA8ZCu/6cWiMEuD>Y6Tn^w@6KdSMqtk^y\99#PEW==1^bE8R*/Z9N::^=+8a88KSCwcIFmpjw5K4$
ZXL#@t u4Kqe6RaPMX!=a!X+9uNdjk%nWI%cmj#V%HIIGCN1*/au*SLNuTV%ZjX4EXu*!*>6SuaabwV/q$:%/1Z
J/E9G= Zn19bb%!Di\iIt8AMJ@:><lTdil1dn^ch1=T8GyA?/MGSG/b9L9M&9NGJXpe4SEmh58ZV\\>^?uH#Y9#
*w!>^@ 6N&%P:e#8ZpBBI8!K*m8Z#y$K=LFQ^81b\G?V*NRF*@Hml:ch=4/?Sb%YD4kV@B<ZFBL$@46l/$HQn*i
Gqa5?X ??wR>R&uEj%lbjHFk%QZS=L8ta4d&k96&=>6bme:&@!%XcA9Qjdi<G@<M/B/m+X!th?kBC/!MGBcaIJw
VLFiuA h+TSk>lG?<8>?WH=HWTI#$6SiIR^SG\L9@+W9b^@^!T9h:/DGpLyPMQy4X<Hkk@Q/QnDnTmmS!IKKIuA
eMH*E$ ER$/@6VGqYR/JWPX4Ai9^JP/TmwqHL%Y?dI8tPCmVC<PW?VKPDa9be\/eW$/%DZPJPL^%Iut\4QNk?R<
6hwiiM hN&lGDXK!FYGXtQZ\eAK\TWa@K%tn=N?QFP$kV:SW*wiNYtBtE@i88:Q:EHcYWRBaVluWX$BWEa%$8aP
&>la%B y\P5W/=EyPdGLY>S/k8@#4I$lFjSW9QQhEPK=9&\JR$&Zl^V<ldY6PlXNm>le!*J=EK4T4ZP89b9ct6M
/=a*m/ Xq16EMYPtk>p/e/c/1K^4l1yy5H8/k@Bu##X%R61Q%Gu>lZ/WC*9yQyTaaNG?t6k*6aHKumIK666!&Lm
#VDI#Q lBSnj!c!N4JXI\9jTl=mCDNtLcG^*QY\+#dc9e?S!nc=&%T1N4ZC%G4jQ:I#6n?\Jde1wQQ<R1hm=NR^
N+Y^D\ 4$:MjP/jd$=8uJ?j@:Tntt8^JpXYa4pY+y6*>EW66jVw!^lSthYZwedeW+Ty:JwVLdu+Rw5Z9qIam*QI
EA4/+l nydVL$9d%iiba9PNh4kN5kXu$F>B&m>^C&k/!YAR&!La6VanB!/%MBY#YZSCTWah9lbEn#9>:E&Q&>Nb
hTR8\P b5he:EV$l^p5hbih9!PRX*HH<mdZ^d@#mXXj18ypMQ%&8%FRn?cmc8m?<KBL4AbR\WCK*u*CRBB:j*nq
K>6!D\ D^k6>wPTF@:!I>*NVAt5DiVkkhjNeQ6&B#qa8KDJ*@*5W:b=b:w*AiM/8%jJSjWy=$h^^eQK#XnFa??8
Fp+$q: /bdZ:>w5H8cpI6VR<NeG\9iiM^CbjLQ4:AciR#m^I?G<4wVEH*@C8hZCJ*I6#:*BSbAH&C8lCpu\ZBIc
dNcIBY XkuQ^KD&cjA+EaLnBTp$:aJk&!L$lF5HZldFp^h4kS9+D/5kMYN*6Bwe>!KL1PSFEQYth5Auj1wQR?aD
u@ipRn FbFkSWqW4k>uwmj9d<5LLWkTnMkVa^ANK$RFSEtBC$VkkXKPZSbMcMHYbBGL@XDEtkW&<MZQejNbCMlt
\5#*ie N$tw^C?keJuHI$EZbnuaddKPLM5W:@a@8!MYH^GEw^Cd\CjG:@GwTuw!wi\6bCaYT<tMqwbV=J@tJhFh
DFc*!u tZ&B<61Ftak\SB$NqBd6yE6bd>NGQZJwQ@Jw&:@6hXb/hbyA5&Z/a*@mdIbnLbPiDS\SBQuHn!Q&9&iN
YEEVHJ @1Xi>@<qbpH4@!icBc&GqD**qae\n49F5CNaYMPHIBdpXNKA^NuX$I^N1FHVPqBQ5NPB6Ct\SX?XKjTF
E?>a:F kwlaaA:%F^ERm5@PVKEQ=\Q/pCEwF#B:tS%EdCHFFb^?eEadA5:\S\INqQ4Elc%&JwACTlc+JSjewkmW
Gb5kQj W4BMTCFEHXZ4Id%b#Lqha%F4:/LXI?YkNCBBX>lXBjAb#XF#Akye>E\Ny#mCkwAd<q:FCjT?tkTnu?n\
!L!mi1 LN+aa5EkkB?nVL5mGVk%lV/M/BLdWSnKyMuRjcQmldm#KtwLkXl+mMbb?M$T#hHcEp8GTatG\SnQT>\1
819Y+4 KMZG5y1P+&uw$8M!FK4SXeq</EN#16p1VMBwaeuFZqE/k9E:PNLttF&Ed6HSXqW&Lm$bD$EGDT^ib\ml
!PlcIq XpyBW#*MDDI+taw@naGeBe1ISi6yNZ:TdEhDNpBkNI@V$\i/mtHYBNK#hFRuYH@AqMJKYPLbSjpY^S^X
/Zu=$K Jh8l&N@KJtkl:9l<l%iuKpw:HNQiTJGt6\bRXFaFw&$t:@PWYPH/SmMZ1S$M+yI^GkR/DqG$y/qGB/Ft
q%H5KZ l?/Vc/ab\!/#+Xt^N@1Nw$5\=@Rl^JlM5pHm4MlMa:?<^J^YR%6FMyEatSyC?jSKRIB!*VACMbu=B?PC
kiwe<& /+#kwLK@DHuL%dL49PT*D5yND8NqCRGk?tZ&FW\N1#kXlJZY@R9eSB>\LI6CI?qlXR/a\aadC6%j>6^%
jdc:\= MdH&^np4%IX:/Z^!IkRBY6R?dB6=mwFQ4>JqC&F5R&CCDA8Z?KGu?t*5idmiSnclq<=/L^8&t5c:id>Z
?CntbQ 4h19:/iYlYuy^adN#A&F5nhd91<Eul!ej&a4=NEGYt:R9aWK#J%AGAkIJntqmcAX4!9>*tkREF\Z>TyS
?4>6G5 PnL=l1:PJGnP$IjP%9XDTM@K+dmkNRJSZX9A@EewXXll5^NPlW=X9c?GX9ijipbc$#DGp8EpR$NkVN8:
!u48V^ Ww:d6dSq#emGpG4KSL+qC=YEZ!bRm8!#nYF\@YCwhPFPG!aBX:^l6A<icS/mnCuTD/DYwN%1T48n4jlk
4q=!V: hSNJJ@qeb&CmQu=%b^kqCMLnSkpjKaIcS@1ID5EJ8luqVW5H!c566qJSXnClyP!\u$nalF^qBLcERCt1
mc^+DI ImKKAjuh&mN?V6G*$8mIppTdXEllTYJIEkX*6TncnLwQPK:JTdQb+^4X+$e+8BKNkb/=a^bBmyuTeIbT
LF@#kA /G%ni=YlJTWRDd6QA5=t$DaMFnVV8?DHccl+YwZN>pFVGe%Fe:D#pat<pCYQ!TeYMMjLPNiT8+pKcmlQ
LT:E4> JI!b=KZ@WhuWcd1M5Zk9RA9P$%HIhNYASGl#q^J5X&^!WmNEVYInKTFF9L/+kp*VJGn68C^9dNTYVlm<
L<#PBj Fm@T%We/=I@NiB9PcmEi*ZGGZ?%h&/BYl/F+&i5JWDKtZbnTIT?+mup/aF95TBXYw4mVJQW=WBw8WF!N
FB?SJI !1F%iu>tnTwcNNq9<MQC+CKBIQmKIitPHSMt?nd5KJ9Dn>GBbmDte=dNWL!hGC9tAupXjJcLc&k<T&Kl
TQKZh4 B$K9H#9=@AwYKm8SPpWWRk/AGlKnDD?1^F5Q@14EYGl=\VS#DR&m&kTj^wX<IbQpP?%CPuE?S=LYy1b%
=<Fphu DFN!HJqJJNweD?EuSb<:*9&BAA#SG4HyaNp%K?>upC#C5PK8tht>Z4VVy<nQ=Vqjpw$<%MJ=NYQ&wwyY
tY5LBc wJ<M1@DllX9\G+KineXYtuteFLXRtq#RbM18&R1m6k%WKaX6Ld%RJJudY#Ajp=b\:<:$EL#KqRRW1XPd
!aISk8 ckVuZ&9%K66q5Cbl!6DJyqL8DZq@TEtXHQ6<tu88hqQIh*JJZW9FVLIX&\9WK$jAtS4AB>FKAi<N#?<H
#nP1X\ T+Z11<N@jjqKV4?wG6HMX8P!+dDwL/k4!4FQ=GG9d^>6RMM^XwaF4%Nan1nc6mmNcSI\H/GeQ6e5hwmt
-AiS^V 00089900e58001202b4 Page 194 of binaries2.zip
d5R&9P #9ZaJF*mWGmkM\qcIE8jVn6cAYQWce6#MDJ&bqDl>/NuaeXipd*c5^I!=$BqVX5q!hPcQ8BHm?1TuuKV
1IZK*^ P\Pd\pEuMJ&&?ApT8<^:uM!cD1H+9J1=DSL*!wdau=R%11F9uh/kQATV98p4V!m+!=&Yq\l<c4cIRuyi
bkbYeR VGcIc+qj\SwX<u\bD8^d<6k1u8AZ%m1YF5M81$Hwel\h*jmY>uCJ%b1^8nt<8w4M^W<aMCi!#G*NW=$t
*tY#@h hJ\tIhSw^AtElNG$=nJAeA#+TB&KJS!/V41XTFXm44J\F8@B<&mJBu&k>>Lc5caN4uAl*w6@dK1<qPn%
Z!WWHb n@n^<:jl5Ehp8w!KWe&V^jEtWtc8qM%XIZualH41\AdA>TSyjG#>8LI<X<u+RFKLZQH^c!jtp*hd#pA1
BYil@n uRY#dINK\/w:Z:NJS\&Ja^Q^I8/^iqXQaPaqH!W5^=u5#5<D1Y5Z&%E\%!b46M^CXZjN\l49C*>uN<>/
EMZEYC PZtE<e@WBYj\4hT+48cWebV4L:/CZeKaQZW!NSyjumqtBlWnAluWp/P>Kk$#%Ji%&CmCdIXSb:QlT8wG
u<1nHn ^T<AkamhNpRB9YLbA/*LnWab?5wXmiZKuCbN/V^5$F#jDW8C=\i*8F<C4B4CNVK*IF\l\DT?bIBpZ^CB
j6IV$\ *h6y/GT#t8&@6pI=e+wp61%VB1<nYHZ#TbWb4CcK^WSGny%Xu#?86Y!>1bp1+KQN+8WMNPW*Ful:wmF!
&awM^Y !<lHqn%E9d!H\u5p9H591G%J9mEQ9=unLjmW^#q9dFa>?nah/AM#Q5ZM9ZwFB^@L5NZ#^MdwTAaM\8kk
X5RXID Yu6>F9EK4y=B&Q5McZ8cM!mW&uh\Ey9YtmjkA\84htaNm8kTj1dpPBIJT9=FZZ#>NLLLt&ay@J^4A%qI
d:8DXQ WNR4iWdyJWR1:XIAk5Ew@BI=V9\aGGlGjlkAItBGCqMGDu=K$tMqIq^DJ*EBZXDG8t6EBIdQ6XNCS&kJ
YYF\yD R<\P6cNEau^AYtwCd*#?J?e1#$IYEIc\&!M9XMLCYMLX+\\HweP:i<<hAMuypMK>!/P@c\PmMEhS6<I%
PbQuX< HLbXkAJ4JAZb%%jdu$JL8I1$<\4NBM$\iIEC=8FHwwwW+I6<iepkYea?SIAcX^K#<=qd&BNGpWWJXBc6
\&n8m$ Hwm$C$q!SR\^<+KtKA?nCIPII5Rq:G&pCIhTV$$!upB1ZNZPJBT#J<M6aI6bL+#qKEHmGIy8JCJTH+\C
nPy%Sm Kw*5<A$4H6<Q?RFDpRKZ\lSLPIYW!c8&Ql5/QlwFiSHZWS$^4lSVYBW6wI@9ml%S5S:jpd4h5RND5S8%
9JeiPk 9w>X5SN#hl^l6p=n>nL\1lH@KwWNBRW6ZkpTbS+u<BMGW#:B%T1PIk+t$#5iKlcBI#hCA\Jt#<S*lS5E
lX/N4y I^FTl*YTtT$8wV:8PakQeZj+q=8p#KKIV6IpD15E1E4kENEa1JI\lV!%wF+WY%bDiic\Xk*ChR5W%^Ie
&QC#QT ldGIlZ\5^K@a#A#Rnu8WSpLCqcqpAT+<lPl5AllWnB5WSy>b4n>#%4iVJaRSwXdV^BXT\:/RC%lTCjZV
L#9lec KMuDBbnDZe?BI\@D=&FRB@JD%Z$tASmRpy/!B&/S%lPTJmS^%/ZVKtR#k6$c#IQVZD?/A:FJldl1C+Vy
MkBZC> Bmdy\hZyuW:k?+ISWF+@BwkJM^GT#HF\DemT%/NAJ%AL#!GlFu4m:8$m#A1J^J8%ZTHkp9KSPkbAPqcT
%^WV%H #8KknaC\P>=kpaFuJFynZyMR#96?BGYqIFFqB@y#P91!Zn%lBP/^Kq6!Cut\Al&y/tQbG?QS$iR=4n=!
R/$Sa\ wHGnwjB@eARlA4d!wGuIJ4c!K:/kZK+!P4=kIc?\B!wVI:<A>%bSI<=a4:K=4la@#nwJN::\5MD^w#V#
aJ41mG AP@yqNC+AmY=uS/+WcjcE\*^p&AREkXIZKD+qDP=p%Dk$Ly=$WGEd%a=YFl^qblIqMi==9lJ4*/!A&X?
!$XBWM =a9F\9G@#^iLqjC9bBTq9=/1@9W+X8t9&cm@y4H?&?\5F5=@py*F#9V*:C^&^6>tb@$%E@i*PV:Yj&C/
pDtwZI ^ML=8?\5X1djRj?KueZK@D6w=q>aXdECj\jN?C5$!&?kYVq?lYd>DVRL&!@+Xc^59+Nt?aZSFT9::/Cb
@%AG9Z jwZt?A$$pQMZGYFY#6>B@<1mm?%*a8&ZFq%59^N4#P!@5GSna@/jR9>P4Q*Jt@9H/N?J6V?6%@+^?uhm
^<P\J& :heHCG!@E&#5nL?k+:H>V4C^5j@m?IGN+&<QEFk+@?5DlH@%E@9LARIu<#<+RGD:b/#iPj@NZI!D/h>Q
Gt=pBA EIBM@!R9lwZ%9</bAj:HLEGmt9<BT>CYudWuk/b>:>/HQ$@BRwYLDDNc9EnJW8YLKX8&jJtKqTyZ5bIV
Iyju!M ID6nnjZL9q8ujy&GnSw*Ye1pibPY4X1Hce8Gjb8PuVy*\Ht6bw!i9Z4H@9&4d+?Bk$LqwNEy\G:HWiP4
?8T+M+ GV6B:ImJp!bQmVyh/wTb5?dZA*ji*BpLb\@44w?myR6Y4q1hb1&/6T6tVauXdMP&@&L&jnB5*4l=/cHD
R+Y6Dt S+EXZjy>p?Nuq#q:>9S*R$>h^FL%/8XVhp>89ip@#eY5Q#uuI9%yLtd!%TNY9uZn+6V4:TN@/ZLw>e6u
Blmw$& Z/%6VESGFCBD@\NIV>RnRAV^<n?am^HiM<?k\<H%\?eBhJMX@nRZR+EZSStIy=WEF+1dL#wZb4IYiTi8
CH?&lM <lM^E!:<clCB8K?CAtC8c>L>&Bm*Vpa$ppBLkq=9I/mKl?ZEpp$^akD8nChW4#%KKI$R:&a*MHjc!VAR
@hh/D& J^M*MK1\*5+wm!an#TVynEj$WSwa8YCZi?=6#T:VYHVGN6qRmdkqy\J@!DW%X+nHM^Qn<mR519^TK1mE
u%AADq #uMuNI&/m!LT*1T#Qn!FHp$p*WBJt1nILY<EQpnwTmDQ4P!$n$M/6=AX1LKaLKw%y1^<I$$#9*ktKCiW
aZNGE# #B156hBCF515EiZ!Iwtl?mJ89Pm1#cp#*NB54#iP/a4E6MaYHK86dSPeM1RIj>cl6ccYbi9a+HJY#@FN
dt&QK! uc#hZtNPCMGp96XWWYMiGcHVbWMA+p=ldhtH%&QB^kuP/#5tQaEjp\hi<&ih=ShlK<ZtnhyA$VdSZmjn
>$p1RH B:/QIabL19w?1<&Jy4/:4wQLmX6JLu<EBw:1j4BcM4%#61wckuc+VuMPVlmRa@Bd\EETI1@Jjw9QaJ1S
T16+F* y?##lIptJqm+ewbaa5c^=<qk:nE8k4tqVad%^$Ji4cXYt+MyQj<Iya\lnGbd^%iGt4cP#<XjPVLFnKQ6
%5!pwa GmdajC?#GBD/4@Dq@?VFeH:SuY8^hB?/#11qG*J<^M!9PqA>BP8R69MqpqPhb^iq5qQlP=4i4j>Cl5ME
b11*i1 6NeJG&bc<I^1!Z4R*GmNNXu<@wmCJc:4#5*88h85B\\!<%S*n#@5#5/k?QcaBJX@<yDnZu?&6duejnHH
PT!eH8 >>B:6WtkQ*w#ya<%i>j*44:/$K*999*W=b6/>NLJ**4%?yX@?jF>c9#ND^u?YIATBtVKBNIQWR?Tw\*=
q*6kdY V5WdmXtcybh>lDSBu\YLKbIN5uebGpDalM86aIdCnT$IqYhDGFVilT1p\RqLcEL6A^5QJ4VpJjR^m!EE
i$%Y#F WR8HV<#d+1NnGAwKI4GIiNI%$RK*W>#hZbMIGEK!WBCGnIkIA%5/Ak/6S5lyjEZn@q#jmliXSd^@\1Dd
SqLhJk YEM?h#ClHH/AMHR/q6GiZ8VX1Cw6>MEWDktZViX1CtMK@+eCdtjucnaM41ASky&K:Tkt*dlBT!!T*cA+
HyWA9i 9Tk&utG*hDL$Jy6wpniYwVbi9L&5iK9bdBMtnuE!=aH<JKdZm4ESZ/yJjAYb<AX@ptS=a5&9Ceq#TwyT
yZnyD1 bd5Mi\PFWWyh@IL6:BVpQFdynFe!$19?XGRBXjH#R9\!S+bWyFGc&mebtkVF$PXpA+5J#qb/$pi8uAeV
ac\?t> ^64ZYkK!nSmwb5ISmVN8CnJQp&#=lh#^>Y?P<yaaZPRpcypJCB@K$1*SD&FdXBJljedV1+WQ9<yFJVda
Ph^D+R %PQE<8\6WPa$kS4ITjTX@DCJTJPcDbMNH=a5AN<IEWHBu$q@JTH@iqCA*tW^k^M1dL/R:4BkEDB$qCqV
9tjNiG FqYd*MSqJL<pnpY&jqk+!%tlXG=SX!R!u/^+4qK4=mTphi6aeZ9A1%Ae4IwFiyTDjt*cq@FbeM>Y8&J&
146SZQ LqnecyWnjX&n$tY1b8TGF>t$wK=+ehYA+Du>A<X&cnkya9cTlnG$LIK9lc^QKi:a=W+^<*Y>55n^Kneb
NNj%HJ PeakX1IJd4SGiIVycTNNdAy=\jTLMK$FMT/S\$G@TNt1iX+T4G>m*:I<nTHaYiJLT<4mkMmIPmThdHjc
u?w?Ld $6ZR6=Nk/HPE+cAb6Z$hKBBu*eliYZXBFhq9=c=Vwp5hYHahG=Z6:n5?w%?^aka&Vpa>6$%*P4F1Tna4
jh!qh: X#?6<b=*aW$J/6^>5>wmK?XIQewRRiqAeRD*><c/*DaR:%DPnqKyWQZKuKRYFD1G$I6$9ZbXCt=q9G#a
4t4maI 1GEhc%$aY\!5tQD#\6k/I$qH$n6wq8=%eecW!/lWTphk1Eu!Wqcp=8dcHX@6Sj?k9jNFYJ<yBYW\ciuV
:Vw+Ld C8=SlFq^YwdGkhNi!ZI+VR%qGR6dwaq*eIJqmhnap#!WAk&D%8WmcjbWI!Y%nt^TZVDnCHa4*c/*91mG
%qH!=a uh4p\m:W%94iNZM\4dnG5?5C:XPeC*n9TCYi\F:Wc<ISb9CEuT<1*X1lSEY&@XnnAd+lhdMG+%iu1dcR
NjB16j K6Q%w^JMP4IMdKeKA+4?tJMqG6uu6K$6+?nK!qNA@Vu=!A/B8u/#+eM!<@::AN/XD*%\?\1Y9cENh&&>
CM4uLC G%99%&@pF/jS/a:*d6P6L?KYR44q#RbL!><\l$*QPnJdYt/l%9FCRM==S&9h#k?DQ&Y/<ke8*dcGZQ*F
t+q5p/ aF5bpB#?u\&&SdL=\<@@%YA:^GGVwQ<^FGXHS#:CWa>8<HEab%jHQ5b^p*h++I1LaD$&\WqQh9SJuGyj
Su9jT@ y#dFcXN*@CtW/WBuP5Nb#*d!cbn#WPem?^1%jywLT9CHLqKBm%:$:LP+=KHPw$ZMZ9:<e/nm5c+5yW6N
tMTtR8 >RSZ1icjB68pVB9#ZN&Gy#1u@p/j^$eqKC\ABJYNMijjSq:pHe=<P6wj=E+&P64BVu$88y#qiyi>wj\9
autNFw hjtV*N:&%>wyZM?/GQwje#F&Q@HHZ*X&6Hu!TY@>HE/@pYCw9cb@PZ!FCn=@$?:*=Jj?>549jM$ZP@jA
Eq?hL6 IQ:DJ>Vu+5%?:bNi<+<Php@CL8=l>+?K=!?qeZi=aB%P8dbZd?JBy^?GD>!u\!>i&TQ8>PWH9D>YH#?^
H^DM!Z 4#^&5=?:h=6j?$J6C&:8un^&q>>?^yy:%K<h?/^QNMcQhjWt?H*1=4*n>Xq?:dT4>5d*?<J:dNGF9Nhb
5+jZww 4M9h^SZkQPnq+lDE*8yu4Nc?\+iuPB^RB>\uB^VRe:@HGGPAAlNaHe@?DAbwuMkqM6<QbHH\C>C*tp#\
1k68#9 Pp&IPq&I<*:RGeP@GG#d:J?u$ei=Rnq+R6Z=RF*/R#MGR^96HW/iRX@G\#At\#nE@ELt^e:+n<^$tNu?
$tHhKR u=uPd=4ySQ%#bnwPXuGMmA4GCKZ$X4e^pHW4BumpRwZkEFVWYlqaXMiS/EQAeYNmCG=+/:+4j=t$Ek:t
T4B*RA $<e^ytltiADQTDZlBku<NcQA#$d+BeRZCDDKCibmJ\&6/TlnGyEFXkGqGh!&Tmet=Hbqd5AD>XGdDW/@
F5:J8E ndjcQqX$JHbtS@&A^jB\XFwbikkh+e^>w#Cq$uRRYDFpRlM/&CJamH\pJ%&*MdITQkSaySk/atAShGp\
mb8$/l /n##c@T%Lw:I4GFYyZC*R?Rih9hF=e:QJSBlnkjFtlYFYV+/+MS4hCF<yK:Kw9LnC/>\b<mhSuM#aDy/
-A>d@h 000f678af13001202b4 Page 195 of binaries2.zip
5+e+Zm 6$&AMV4JRhF1YaFpl:6JFTLtJSl5E9D+VYYTZTS/G*BIKKF1MIR?^#1?CJnH\9C%:%V:aaY8W&mLICKW
+^&d5b CJ5&IaaPQ$INHb@bkG%\>hZynC:^l!IlEN%D/Z%tyRy\9/k^/W1%kH&ZNn/QiuI:!#j>KMDh&LwBmVtQ
8@$Ge: Tpjq9kwmym?nD!I\DNEI@<yK8Y^##kR8ljF!nAQWwmPhPtAGm6!^VA!y1mQPpC6dn/!?m4E64tIGX5=!
W&qdia aV#Xk/M*M5Z$+5/#$pG/Ku!4lJS@Y%Vw^FA+1wXQu#1pW$bQM=Y^:p>^VnRYnn81N$<iMyt?TLdyCaL%
@aVTXw X@/KLe4leu=8yP/Dp\:JMwApbyd<iFKntC:M*#<Zy:j:^i4uE9e<BIl4hXa+FwHclMAClh%nEC1qdi$5
k8@1ay P5FDJjDJ#L>8LwjpaRWSqRBE%Z*q&^9QIR?9a?1hC&99Cu#:!Qd$dpN*L@Yw?*il^>$%BAeCA%1<#RhK
N*u9ZL pMTGq++$Ge*kn9l8l4C95Z\Gy=yEVlDRAlMMLbShK&M9K5NuJ>TqhX==W6W/pKw^PI%4qkl\$!#X\YK5
GpeD6h y4=R5SGLRNt$P?A\V@5&<Vb9uTSp#8I>Hyl$94=lFW9I%nRWwbPj&<pbSTYbCnwaKR+R>t/#=ld!p*\W
dYXhM8 HDmIA#wLwXXF\BaX<&H=K5eq?y=P?4dV5CqT>+AZ:MhEWkc@QBI&Cn/9nMb8/&kyTB#*#*pdL^9SXw5=
/$Kj#@ 9BAcCS59uKaSS<S6I@TN!XYYEEk+?kGDIEkEMP>cJb@=Gk9ZjQ5%j\ba!8wZt>R%B>J/^M@YC*?<<!kl
a5<&PA bcSn<R5RFHQXtqTdT@P5mFD<E4aJc^!P^m?%@n/!1qNH/qZJj&$ym%QmlG&!$PR+w4KMutiFmEaC4pT+
8Z8XiJ H>l6VD=GEwqqDhj$QyLMpajVw=A$y&W:NwyjW*Tm:*+?mnVt&yP:mP<kXZXkK^p/TE=?p^GAJtZ^5bum
uIHaiR I+dSktyCEV4yWk>&EdJHwNK4^$hM!4aQXyj/lmFTH*H+AeV%FpL:hc%EVb8T5CDyyBCC<Q#G&Q$w>b9C
/T$qM5 <FLMHR<e9uQY*hb!u8iBu1KeSD8?!RiGQcTQLCMjlZeTKbwVm4eE#Kqa&uPXW=CwIyTKVRPNT@\K@BYS
m6qq8L w>KSi?&pLZ4c\h^*+MIJ&bq89ilSt1=n6EV$tE$!tD=iquT9DY#yVlHaW^?9nGe9YyTi<K1tZ^+$#LBc
tmp5h\ 1B$V56eMe8yl$PITT&q/hblDCXyLH6jC#/4T:P:1aX4J/l%@/cq\^aC5nDP5ZZ!mGwyAH%k$eKwFCYqh
ayltPM %y!EW+>pWLHC^pt9^LdWdR:TV+I=4Sn$BPCK>M8R/iDJiCbpY5NBF$pa9nJ?1jKIJYpP5/1t\uGY8E<T
G>k>Pn lXhAHj1lM81En%qiqAc4k/+qp4C!wXXRM>/dDGuK=#8ZXcmHLMDaZtH&@N*KCHyS1!^dDByS=&k:9TiQ
4K9Lud MGhNJR>?L1ie$F?YtqZELNNH51i/ikNKp5\<?\$1PNHu?+KCAy+TcKGhc#$S=:%KLeH#wuF?M1HKed+w
^5\dGq VDRtL!qMcPCuY%i$Wbq&AJXc5MCCWh!V%KCLTX5k1aI&>jccaSZq5BJ\BPQetc$H6lc/X$Gka$P*\ld^
^&:S=^ uXITAnC#<b!alEtpa6IeWlGNSq*dVMyqi9haZu#D4T^qcDjN:y5t@$%W*$^4@bAKSEGZhp=>wq!intiy
XkNDmM FQ*yYIP%aXApHQ>+S16CG=eckeG5bNL=#cJ98%6m4^QG44c=S+EVbLShJ<#6BGNDY1:/YJ^%bEtjhqpy
Jl#@i$ %8JP*5MVkk\h$/?Cud*Ipykki&+NiKJY9KZDaEcpZSi4aLuNJ#d!RW@BNTG>BIGuY6cCwMjXFh9Nj*y@
::4lGN 6!cly5?LK?1>$#R9MTBnMaan:p*Ww8=%hyFIZ6E^5J:!\HeQ9T?Ljq^nwE+BLZdlb<1JuPkp6##:/bZk
$EjnbI <qW>IV8XQhumDPHGHR*691h4h&pbadP/JilJMA/HYmbu@556<:twd6@l*pPP?X5ccFml6:Vw:TB$+\h>
6#+u=* Q<jIuhjZ=c@ejBYueQVV<@aH=@Y/Bq6>uil:1iak6pnBt^kIH5=c9LIdil@KJXc?kHY1KKRM!N1MERSK
BD$eiN 8PlwyDMjJi^+&jEJSnd:+JyahCi\SpR1NJMy$6yWJtV!!e\<cY1X&iG?:#FjnXjEA5%lJPII*p^Z9$lV
>8cASD lPC@b*=K@V!%Pq9Wh*yi+\#y6V%i!K<:Ah:GRuCm&M4R?mNn9lDhLPd:5&4%pZS:WXQZjqwW+yd1%*AJ
9pKm:8 dlK+$!HbkiE64Y?GKnddcw4%:C&TFhWX*jd#=5I59ulPd^<#9>41qqW1CNakNjbDWFV1jaTatMG/wdCJ
+iticn cPN8hHedij$!yKNa*<bP+VJCK4/@=WL+c6k!5GYY&MtL#u%$<aB=kn:eHQ@N6h:ZN<?EBq=%AQTeaeFB
p!TKYE ZGGM+dQ%6IwM*bVe:whI+!bSeqIX/Vh>m!ZkQt$AFF?6*<TDKcYGuRMRtVynj/e=&P%N%Bw$DF9BP5et
k^1A+t d#NQmMWQES\e$DAZqTM^kHpII+bwMFah/qE>n6\5e=p+$YaXYhJSZ1TNNPEQ/RR@\/ajS<>9BD=hRE<u
C^>ZL\ 9R6T%6c&b<h55KblkV+#=XahZnAbXyHty\edeNBXil/?bWNmjAw^wbbibiA4<ZY9H=ju%PbQ5=k>E#dl
1ny=C4 LHDRHC41JubRd^JnbmdRELw?A>blL@K+u!I&*y<XITpKZcTapIqAI!nQNVkFm1B*nMABTZRGC/K:=/bG
q8aEH= pFS?GiCAF4mCNQkAI+chJFKlHMk?PZwVNS1lBMmCR$^HK*DAClGklFbwlLXG/cVRSDm\RqaSRCJmmCqk
$WWH5I RTFkRNJjmtd$R&/pLXJ+BKauB>a9+18jkp@E&pueAttQSeGPZ?Gy#u#$LQKFETVARn=\lJ@mM%@^\\hJ
K6A/Dh RM!kqTpe4t1euT6XpcSJp4Jbqh%E&?Wkn$5kZ<eW94MTGw^audHwkCLklBAS<68FuVI#=iGa:Rhnlk<X
VCBdMi CYyZX>AJ>C!D!M<RVISY<#BP%K1tWX$pttm:it\pbmTtJJmB>1kBu*u/ZhluMhB&#Mn4Ci%*pllSHSHt
#?bRiH ZCl&jhBI!6HmiXHmlRkX^cn/AX1mBwJM1lkS9lk:L5MHeb<FdBlS:GkMhLEWAbcwwXm#@6lC1K#%TdJM
bR1<E/ <iV%tel\&4ktQ:mt>iaub+aule!E=+#NHM\n?&ctl%T&9kMenMa4W+\HWSnHA1KnQe+L%&1t>/KDSh\n
1cFVdQ /h8hAi?Bb&VFQi@Ze1H!Fd^m#cD#/Q#P#P:MDC^XH<wFVFVFKNZSyJp4CNNm:RwN#CytN1EAJq#TRS6R
e>MEI^ qB5mVk9\b5^GLqGmnND&?P8!Fwttu^MwwhY*W9RR*tI6uK!P*WKn+/!ywX%6W:J6T$bFH:m4/^C41@nw
ky%ThV IuSFwn^LhVqNRL*MPbRSqCS4B+DXe8wITi+CAy?Ph:LQ/Seyy6#NF+CZa/&YWit\6RV>>8#%5^#k=^!J
T#\pma ISDkd<cmpAG\$AwMNVyRXZ&%u&PMYRShcF$lM:#u4+lhPMyFtalhBD\hWIHq6bA5TmHXXWAbki?*QC#l
^WS&ML qMbX$KbRAQmia+SEC1EBMNd1h&/KN<TC1N*!<%kYJc5lB\T@MZl/Yl>Ib+ppPien:!+GDaQ!hAK^n\!\
Y4e/5E @B?k8<\CiXqD%w$CJJ/Q^4!G*aAHA8bI4C#tGyDtu=5C8RpV&XTh6*kS#*XL9DTu:cH&i=tTSkRGT%:5
ab@@Nd X?WdyYX4&iJaV8SuPLyH95ph!@ZhTG%GijebND\pZelBLJni:8puddP\E4AMpn@*LJRt#ikdHAL&w=tQ
BM$dw\ cJlbTTSWKiCK5A<Dh*IH=YEQ!Rm5PpHlAw#p@HV1+FXybQTqbZcq?cwl8B49!B5wdF4&T<dAh8ANNyWk
w5up*K W^\quVWH#/id\*TKm/GC%?5lYMZG>9Vtn*WYdCLMW*WG*bw1b1JNw&w^<kHC#?%=Y6GRdSi1LyE5&N\5
twqPiP 1Ebmu%8yYAqH/<:ScZMneBWL?bBEaPHLk@uy!ZYwn8QL>#11Z:TwuI*K?*LKn@j1LCSGITSG1&JKj5ST
laIK/Q HYhSXM5PYiXBd+kYM&cLPiWGkWEhYJ9TJ5Y\!jP#wYcGd=XVXS8:\cdi&*m%\GcLh?k:L5QJlLNYC!Ec
XGECcE >L&RP%^Knq8ltep\/+EwayI4E8D55hH$eiITA:GM9u\thwEmDpaDnTaHM/AY5LDNE+DM5&5DFcM*p1Su
E:1I18 >1SVc$RyRLGP1CMX5LXBRdTn44eJ&LZbCdhq1:e*V1BQQ1e?iCN%Y+eea&EEDIpcBQ*ydyNuBhp*BaP=
C>Hwbj CXp\BT&RB&*5S45XAt8EDi$*hkL?=V?=&##a8n$+84P:846:84j/8D@+i:AHi:mHi:SGi##Ei:Iui:1u
ele%NY i:bti#=pALCK*dGK9R#j9X4LQ&E%AdB59bc4QXLd*S//9hu:Q:XPin>Mj$46>5a1>&t6>Xpi@<\?/8P?
C^TXCi /1$?/PW?:9N\=/6?+/Mi:>Z//1+B<1t%<:Q/9Menky@/tR?Yy!>:>Gj&B?<$LF<QQE<PpM@1X*+iMAH8
**4!VR F%:a9IGQkpEew4/QDJ@V^N*hm^AjXaM>XINY=L&&RIIF*WM<LLA<%INZlEMIL$LcQEM<:IMjcpM>QwX=
dSejFQ &CA?EkR?Gwh=cIbyYAc*mab#iIc6MIS:?AaBADlyu5Ee1WF6:YEQ:=Ha%1EcleF6^qF6$XGQnl==IJEe
XVC^uG /eFyQqGQ4cEi$b=y6XHa=6EiQu:a\SEc=XF6uhGC:%GeELHameF68!E4:>:anZFE:uFy>nEc45Fy4#Hy
1nR<:I PDGQq1EcyjE+TDH81dE+DQFyDDFQSLF6^Rqy@Wua\ZFyN+ticB:8:WqQDMH6iPH6JQGQ<<t4NDFQNH++
u/!ai< qpuyKF/e#5tQ+atcpmqQn9Gi#uEc+ZGe&n=ynh:=:8qyHREQ8h+eu+Lcp6Ndp#NYR#M==DQVP%LT@LN\
t&141c RuDTPdM<S$Q>$>NY1nN\RD<?LYh1mEi&?ii$u?W<ZiX!*8X/Q8Y&9?a?SLC/M+IIDiiqLCIXE>Q*5WGG
dy@qY> ^=CmACAD6wcQ+5SR/Nq*>InALk1ISVnFDPTaW9QX98Pe=wkc/MER4nH$CED:jcj:BSYD@Z>6mVJ&RmDu
58qV8B j>5ml=Q\4$iB@&$TB95@Y/8Mp?Z9TSme\N<taj#%NQN9#$ub@<H^M99j%T4n?MWBMV9L:/B@SWbkb@$h
K=JHW& NBQVL>B59+Ft=j\Xt9%*$K!@8t?P*$H@1qabP?j9wBq@MYwenL?BbtH@BZ&Ek?q*$L?<N9N9wIEe9$L@
J+Q9p9 V1\^@+wA\9E:5ed<!@9?uXn:$#D1H/N@J>b?VaVk?J%ka@pXC+Qn6+KN<%jw*\p&6q<X^8Q<uYBnbj5F
uX8QHI CaQ#h+IN!Qm4c#Q@LaYD@Vj1\@&4:QNQCkj\4@Q>**\8<B@wpDn??Ln@T*SIi@>H/yCK1NPM+yy5^@EV
DY:4i\ 9wS>P/&pAau+VC$RB\/iCS8JD+5Pp!@lkA=QJGEMIVlK1MDPKCl\lEjuYGYHn5C$J$55%y9q@mH11yEe
S>ZI:6 YiDEBR8Q/XRtl1YQWaYGKAm$:n5FBJk^HEq$jSN=&+m%NiMpmGTiXidZM%T?8k1Ljnj@pQMtHy!m@ASl
8qjyeZ qG=a%ICbkj\9:ck$&$tcYLRFlYR\$jDwn6S$WZEK!InYWYbMDVJbu$iHcd&:ePm8>6Cp/?uS5QnwAuFQ
CdF1L# P!XBIn<\RhAW5:TAw$e5wK5aCy\nI\b/CDBPPGRHnNL6Y9S^1SCJet1IXZt5Ttt=^mu\VICA:nXHN?N?
>uByaZ N^y%=iX4@Tb>9ERyN1MMB4PBmq?N5%yyVWE*8q9**c4?AjBNi%Ph4FXjZX4ZuwVl5tpq4=yiG+w>IwD+
-A^^eN 000bb05773b001202b4 Page 196 of binaries2.zip
pAY=cX c%Yqw!kKmGGTcT*DwuA%a^Qh%c51dwmC$ytn&G#&YLjS+=aCX<*myq^#H%N&ZXijb=SQMu\n>V^MeFJ^
@bSZ%S /Ai/P#qhmi4H9p*8PbW8*wJ>ReAA+*#!Pp$GBIk%tZiNVNy&:ykY/l6#LKy5X1<Tcq^@HkRa^*n1\iYK
K?AD4n akE>upp%#FC?VZL^WKSIE4Jk:>hWZ=%9N8aT%c\66XKL&u4\RdD?cl@Yh\SWXDyyyRpX8BZ9>t\bS*B$
WcD/ZB 4hD%DiX?lmNinT%^1Y89jF?\pa==Xi<XV6MhuC#+W=GptuRwTGla/+=acFltq\PJYJC#y!C@t^&?^<J>
k<S$h4 Bjm/WljANZ^T\kTlKTn><ZkWVt=wiI%u9+yNG>/uKhwFX/bdN/dR9h$58y>@14Zu\aamZ+*Yc&&+4=8h
6A!RST 5T#??NF=&uPt8>RmM>GjT&=$Jq?k/VIuB//Q$==AIJpX&p??Aq!phDETQG=CC=8GEwqBF+Iyd\XZYNMS
YNY#bB wwR*J=?MAZyNGyhb6FwPM:XHC!ZNVq5t@$5lEHan@W8yn!XXNy*FJ&RqZEStK+e9Ik+4V!Dkwu:R^^<D
$^HW^l !Z@Gb%y@pmI4JmMe1J5V%mB$ly=CJWe?Ra@TwXE1?+HMEnCu9dlk!ZSqSJDTa8cM9/ACn8!NthKYyK9#
E^PDa* =C%l+$uQLa/:8&JESaQEm6q8eFA/B%84$iPjZ6p5ynXBDVT^V?P5D6Mq&W/Q%GV$R\jhd<wa#Y#^J=?+
N9dPB+ R!iXBb5pbFWWcD9?1H#?YW>!\6NPwk1MSbR+DydCcI#Vtmq$wl/>aFl4+1mdSDW1P9QYF>+\lKLc#!Sw
*KBC6M J>#Cj41/T1\w/u+8+AkCEu!$bkG>R5bLR/lSX:4YcKay/STM/TmbAA9VG1TQ&b=ult1nXN$NZycDQuZa
\=pK&% AJ9:GDIQNmPR<$iK@6jSwQ&aJk+8\n!m!ZLAmI#PJAS>>nKX&>SKCp/CtLX5hmX/wNlCqah6uDhPP98T
BF6+PL 4mAEkXnh#CllKZS<L<A?<DS>TX=hyQl:$/=+M+VKJBdZ%>#6AH8Z<$R?ekn=DbL!<4yFMqW1K1Y5BR@G
4jA#uB +6pYKDhBSBuWHIi#i8dbCH&%PT$8^CSZG9an8iCJ&!dI9G*&8lRlSA%nSM>>W&FPhBXJ@A1G/JEnmVw!
cJ/SV: YVHTR8#RCS9MRnci1G@q5cdNEWN>L?lny^ty?thm1eKle%yc5$/tdn!DbiWkYGS$lG=SyMQ1AkL/<y:q
<:M/IW lk%El=#5Bj9?ma*%ycyW@iaDCStB/jR$CVuy*KFtYZCE>k5JyC$$TVXan#wRkCKe9KK8wQ/Ej1%!K9^%
w=$Gjw 8DJ68PlFPu<H>Qu:^#pqb9t&luDy%GS$>Q:m/WTdnTVll^q<%DlCGGD+^^KZap*N/uNc^5?&AWpWd4%C
8**TV1 cuRQH=/GFq*K<NBb/V^+yjQ&=d/t$jn*a8uYV\%adi\nDK9Ty1<SYG94!nY:%>L#\Z<hB>X$cBCZGKE!
#DqEpD wCqC%>FuXNcGtBQjDb$#PBitlJ:!PipmIW?P?5^ua61=PlaMbkQm@=t9?WeXS1XX8EbqC5^bjHeLq#S9
Ea*1C* XTN%mB^EG:6K$kHX:a4?h1@q^FJBV<cNqEu%%%+c/&d=d!iiaSA*EF5Y!?H+mJ/&GLwXjG*iI*Q:q/cC
+K+Q\y \Tqj9AiKM%ap:iEQCy5Y*/F&?<Yew%<+RuS^aZF?$FYG9da1i=?iaa6SGb45WlPm9#Mmw?M:nih%yRNB
9Sj>Zh t=5L/ynICcm\lq/^ViHTtlA6MNidm6JPu+YD=aa5FA?$EnJ%dmXqDL9=qy8S6i@Hi?p@5!*lH!WwHpm8
n\kaRe TPK*NWRnJ?:D8*@=^ly6jjAN/Qb=baIFFGVNhyjA/Xy+Li&XVD?$E<MS<ud?t?h1\=ERy5*>T+ktq@D!
quEdp> %&4>lmEG5R\T9ADA>mDJGDC5VIdDp8$\K%p6w+T8WQL\nP<dK$ukXQWAB!TtdT/IkIMh9nHR@Aa4I\9c
IjA54* dGayt^=TP/DtnqXAEHwTEy9!XRYa1b\hH%=9YdX&GJYLh@AEJY/qN4HJ\F$+6<+$:HCM^\D:5#c?:C5V
1#I^@N yA+hN<1P%GhFLM6WN:YZDlh1TVG!dyP%LW<!#S#*$R$E>+c?T^AAEHI9icj$!b/PdQTXlX/81:eIVF?n
D8yH6d V5kKyBbP%MXp#cKPMJFuiGK\=ZZYnYdD=SQI4h!FWNMEGcc?bYZHhM+NYPt%?=iYA$&Qn%AC<im6:lEw
lIX+hl l?kjl5$C<1!wB!9Z\bScp^B*jBjL+GwL<m#C$8w$Xb^h4YW#tGTY98=WNm%?VYtK:6FTu#@&!>jTlBXy
Y:c>5F VNlp1edccXZi!QeM^Lb@ibkuud?VmX@+CVtWhH^5F\1cPLpWXM4uB85uM^d$cT!5aFmttD1lGVE6P$JQ
l@\/KP 1=#S?XDI^hVQ+XlQGhBZH5EqYSSTnaD>E4HYKJP%TI=im/Bl8GW\YNMnIEecAmFuG6$tWW&jFBb!GC:Y
@u6yG= PlBpZJKARDpYK9FIb*V1NbRRDeptLuH?LmPk<pMq^:a6yD#CpnEWCqL6?*CLneR:%CFdKYQS6=Ck=WD!
ZG?j*V PJEt<dL:yDk*mRkJNYRVl=FFiGtq+B+B&J$>t!IHlLmM9uLwwdC8/Lm1qcA=T%LmnyCGu?GTmKQj\TP&
?nT46q 6w6WQG1>h5S+15c:LKimy5ZYR<w84W#c8mcjGeWuZENP!$?<\bF&/EZRXj1PWE:6$aL:$Zei/!EbC/Ej
t+TjFF VRi5hEJe=ypp@E^e$WeCClFTyM4:Xp!Rt!a6JQcX/M&@mBt6Ta1XRJ1@a8!lF+X=X/Ja9hWLIRnnaIEu
m9a$a4 JaE?D+We&<+tBB<8aq/^KQ%aX+pPK$Rb^wXHLTKi1$IRiTE@>S/FQ/uAH66H#h@Ve#XHLDtJi1<\$J5l
?1W><K hi+:A1$Y!KGbW4iX/K61K$eciw&k@#I>JybAR5kIWLw+d!!:SA\P5a*nBXA*TNWCRc\mC5t9=ciHmct=
\+tZ+P NQjRZ&BulJkqlp1%*yD&dJSR9=JREF@<mLdNKm!MPtyk@YD?+cw$VhGe%5CeT*X$J*Fe1H:RV9hm!AV$
^p?wQN ^>9S%JVFttabiFH$H\9RI$lGiQ$GPih>P\*VuHDVJ^4SQX<tcQw\CF1!N^&4l5IltA@kMh1Djc9Tbjct
S%<pE/ d+kHwP4^InpW@jVpK/yZL#mw/\k:t9RZ\*Sn>lnpMtylGY9ZR$LBDj4:Qh*kbt:YM6X:K>5%^D8kZhhR
81i<<: 6LCmKWt$qL*^mN@lqk1QHhRmYCSFe+SMYnKS&L4l\qtCi618Z$Dlj*cT&*WQT5pAj9SD$L>H4CjSLLQD
aqBlam A=^F!G?eQc4N9wkNn8mCHtGVq6BHwZ?1i#NFM<w85wYPR4TSb*Ml*wTI9p\eIP?QbVM&W!k=Z?81yY>Q
Ey$>d9 KQFBa*GM@*HKpBH9iDpE^jXt+%X/*QZNZmmC5P?XYR?ijJWa?Ad9Au&n1Ew$=qTiaFA/6q=ai$kF!$Ve
@+qeeC RMA=!dFc5qJGmm!wkLwbbbS#Sj<m?8cM=wy#!FYNCu$?5HIBe=<e/yF<DAkACHAGMKcWWccCJcWK@#T!
8WB1*Y Rq!CL>mSDQPDZpTXmBbW\hccie+mDepKK6GhSa\<YwtmY9i&tCcuPl<hRSEn*d5I\<$>B5$#?5p%l9kk
1Cbyac Rb69\jSlDNcIuJcbl4yX\IFmnHLjRl+Y/kp8*pu@p4+8qB%^L%@+S\jeZnnCR6Z%n#EbmXpF\F^+*C6/
qmqi\K KX84tM/+lT=T*ZuhD/HbRdpaXpATaSRCE#^DSd8mI!LCEE9an*1F8JnZH+51JB@qwS9&\EPXE?YTCQP<
E^TQmH RlL=4HaGV9RYFSSc4P/hEA#p/Wtl!SPm^?SJ=/m@A:+LM&KSt:kC\ZPi^SG:b9hMaW4i4ISJ^>NF\p1W
bm5JdK 4uFADL+S#XG?KIpD@QyJ19bmWb:InwSB4M4Wp=5BEh^ER&Lq^>wWKqVpebl94w6CDJ9XC+w<l?!ELJwW
!4wKZu Cj+cXKmipZcm?+FCVM</\jm1p1SmjkhKXN:N6FuNERe%qe+R%mbQ4pH=W/T6%KSCJpb$%HJ$LnAWTRmC
HQ6@MY 5I1C<p&9%lQ/F+?q<jjj=n#%VX!FBnCEaZ&FbX5&I>T8L:EItV$Nd?HLE<A$K*!JFqQ$L<XBDA+FuiGy
iKNtM& a>5Km#5M:D8RI<TeY=BHJ&TNt#?Bu/wd!u5JMIiJHyWcXV+Z:JF*NAHEHHnb^%qMAR5*qkKtEKEeWnZB
4Z@GFw <#QZb=iIY=5*NmleB&$TN=N&P$88#qJTcnV\FXHmM5l6N+^DjyFeWA#IJ@%K!AT/B\M>!V%J6J\</6nP
eM%:QG a#$TS*H%E%TM\$A:kh8PW=HGSXhk+1qu*#nSGLji#5yQJaj95EW9wKSJNAGFkKHCBl!!GRdMCW8P5YJD
HEJDtJ TEW#cE6BT&G#pFii%G^!<qhN5:lChLH!=b:9TAi86qhpeJQ<%^R&eBQ9qNi1CJqpDP&j4kp<n*$BCam#
B*dM1? I%eih8&W:A/cm@t?EG1TTu?5jkmXFuTA^q!@aL6^59!Z!h9@9u:8>:P9uK#@ZQaX!QV*B8XAy6<^KBi$
%k5JIH 5:Q@+>*cj::@Z#K+j#V?#c:<Z=K#@=1u?L5M!D>IP*G!@1=CnyQ>h>C@W5l^e9\P?qhcL$:P*$C#e9=n
\qQ8RW NJCS<ZjR:L>CM@$PtwZ#F&nt@!p$<DjRLL>IcRMbYZ+DDYV/%dXbj\Q>=*@tH/N@J>caYZ<%=4<Vc<#A
RDk9G/ Z%*:h&KNtjqZ%@/hYGQm@MiJaTDV:<VcL%P:RKdjCdbj1hTAVM#@W?njCdbj/i9?bVd/h:Ty<=@V<B@#
YFiD?= HNQjHRd<??Z@PtQ?bW::+:h@E:#JYNyb@&ZCNQ:Ll\D@XDC#E4L?$WEkpQ%j=nq:J^NVy#>ibQ#L#>>%
SYw#MS l9Z@4<:<Ei>@DlV#H#H&b=>?y!>5j=6*=tV>4@QP@/wY@E9iGen$>*uuj*qe@C*St+YN<j<S9j<Lw4ia
Q:c6i4 PV$RF^aT^#F5*a^y:BM9y/HF?J#CE!\+cH^cn\KR=+^\<!aaLQEcGcaRd8w&!lCRM>XJuCt*$Cc6BL:L
<C\h+b &q5l$MMyGMYT%X+=^+HdL?luE\<dla^iXG=qwXNcRc8MnWNmh/y&PnB8QAVBdES=!SRN*&cDDp@mEwRP
S4\YFc j<$^l^:CeB8XN+4KjS@NS>8@NT:bWGd$CE\IT1YNMhaR+Bc\JX\qmYukYL8HAQ6Q=G>P=R:AjeXj!N<!
T*5nF! *my@IZ>ne$hF&b%^^*<ny?&MYwBMCEcVQy:861>VaGy!I1HHl$D%abZyJKGl^\$G/%FYWI+cXCV5RqdR
I#RH4G XyCa>y6YltkYEBn4>M>pt?tMDS4kXnWWkcKBADM+aX&e6=XDb%HJE?D8VMBQtWSMMQWl:K1XqbThd?Fy
H:d@6W NaqPHqVWXEGXbyJcZ\wPiIXkYT!dpHANnuaQAlPhRhhIlqlD%tayQuNd8/T4>FBYS>9&HA6$j8Dkml4R
4M4IM1 \\+F=yWSe@eGKay!w\DD4umT6:VtaPF*JepcMTAKymiEk^CpNE=@J8wLVQT#c9ICha8apIkk%e%%uXkX
lNL5du /j5uAeyEQ=VERMmB>%5t:@D6m>:I<G!9&w=#Nw>dW+6k+$>B9J!Sd?nhT/<NtEj=5k4MRYD$mZJK/bZM
qc$Zbd /EkpIcDV!/m:1:y/DBKVbCQPQKFj8#YMYRpZ<TF/@aEh>C<Pt4mV\pQBiF@DB!*yMGe>nAB@FqEh@Yw4
F&B>*e ZH@4V1Pl95nKND^i>SMhS\Y5yHI+mmSVyHV#\t?awbMEwZHhXXCa+@/!<=DGa@E&yuj?t=1:81^MntnC
!9hbL8 Qj?<6CS4mH^wAJd&npn5X5@thNc4/^&p6XI\*/e=#8m*+idddtF9AE/nq4/nuh%ulC:8KK/:wdQF?Ve?
8\WIl4 YFty<5W8QD%tTS&:@LG/Y<4DdNBIej1w$@RpF$<\/kyyPq*d=n8VPh#uXuZ#YeeG>c$/HJ^mGW9Gh%1Z
-A!B!/ 0005d126390001202b4 Page 197 of binaries2.zip
Xqy5*Q madFE\H%eXEX5CL!LCuDP&/KqZPtaM^Q$5d+ana?<^A>J5wLV>wRIBDp%AGpiA4K+iG%5kY=#X>Kp+Y:
J>QD=H Ji^GQVJE@BJ^^p4W+9%*$+8?k/&@+AlhabIEcmV+^uuiPbud:8iBV/L*j>JYRVu/Rny<jLpI1l<?qN+i
:JSp8< V@EB:#9euZL<B%yCnTb@E:R?!ekTj6wDXaTXMGb8Mp>$+X*5H\Zw*C/qCTRm\YcTICKP/8MwyX&Mi+8\
iESy:+ \DGX/ht^WE@p4&1wMu#IuB\Bq&W/M?%&XIRLiMmWLklIwFmJ5?DH#AB$YND6cEmDIt4IRnX4YT<tNuEP
i$:LI^ bDD%Bl*yhF=&TSa5GYFplZFHS6ai9@SEFSEE@V^/t1G6ZJSGJ5a^FGnKakKMdIWmqNE\RlnSKqdm*hPt
HyX4$N ES\btD\@88C=NB!aMHd=ayNyiSJASGp\YtcVCm+&aEWINN&IN1Tb5%TJNtT1\w9R>Ge^KuFiuq#YK/eW
N\tAKd Dn=Vp!tEm8WidN\AcWDmBWJy?:MT:PTu>44n/ckPT%YEeJbeKAnTcFI%bhqijYAI@GTKW\b<:!K\IdWp
p#N=te d9XE*e?YcVSZ?ij$1kCVCu\/Y<N>ThAH:kHLTRFp&5Gldj#G5LITu\IB*DSw>D4tENj+FuWw&lX@MHyQ
+Epi1# &ZAnhuaMjYYd4$bp81j%T15WiSY5TiSemwYDiT>/5GD8ML\@8!FB\D:Pc:58QFpIABT6@IWjkjLBGt9n
=<45a5 Pt?XkW8/$%%hctIA9F=\&JdT+q$c4i<a@jCS:9KR!*Sw6\V$aK4<MGcwH>EdV4SaZN4uWHW:5S#XqTc@
hRbel< ?E^Hu!59HVyt:XpEpM8/WwpHiu$Ed%MiLkaPC&ma!!>?/eSc9MX=5IEtSG9*c^bdL@>td%pbZPQu*@\K
cenRdm iZqp>VG+TR>F:?H46&VXcVtRF5R*KlW<pRw/p45YdAu&nWnZ+Q:m:uwP5TiD\<AIXMQuHpdWnV??JXuG
4YM/q4 M1k<dLbIky>+hVMCVZSHBTj@Q@d?Pm41499@^/plb\cpBETqP/bIEaj8:yV8LkES!cG:EbD8LkFS/i+T
&5:*4V EBDyqqSE%N>%*Z%jF>=9Q4i@:?@#?Z*Y>\@ZR6b/#G9QPj6%#8G=>#/dke?\IyD#e#DuC^1BS<6yW>*Y
A8LZi% d!cW<E4!I&NulQRGptTY*uM$^eMGt!85d1Q$qHY4$ua6B@Fpkc&F!>/1aMtBdep/nw$B/68X/u&Nd@mu
Gi1FkI *Z9K!&@dnM!BcAP&mqK&F\5i#Iu\l8Ae?6WY8qbZQ1K8tju6mJ1WCZN*P$ZaBF4j>Wwh5J\8KYQXHVcR
McNIR4 &ZN@SK<w*BBnFDQSJX#1L+jRc$6Iii\F*=8ibh*dwWkXjtFFiKNkS^/RMtPe%TanSFqlYd#8@lllV9XI
JmY9QB &XKmwKTlw$?8/A&q&P$<hE&HXuW$j<&>a4\/+n8%V/nC!*dHNl99CQhWRF/+*c$a5D#Ki?#6qZG//ChT
8QB&<+ jdP\$>%dFdj@E/jF$wk\#Ln%Hy5b/q#y8B18L$CH\^!T+*LtNM:tj&tVGGJk*q1^E9p%ZQyFcj6=<J^Y
:kASeZ ?@kQT+<anZeQ8hj/d!Bip4/8C9S8mB^=\H$<@dH@</*c&DRA:j6H*TtL*=*mY/PdpHujBn^#<hh>%BLu
RKG&Mc YGl/%BZ+VFYIn4qjIH/<>W/&CHh@k61wG6IakSuLcuFZFRm@IYj:WV*K<=m:ecVyEMeYZDEae@bNLQVi
1FR&%C WdaS&#qmq/H+#b^+yGbFJHun#Yj9$TW<>LjluB^?p@P#:p:IunmQL=^QcMRi?T<<&=ayY^h@u^L&HeSJ
WDkD@a M5L^+?dmcCDkwZZG5JXb*ZS>cWn9E>8kwXXtJXjBdCT?ebZQuchN^Np$:&^pt?Twc5yGFXu%@EctB?48
l\+H8S :h1eTZiE%GncG6+>?*Su%bHNn@\NKL/al/@G+LQj8XqFp9ZwQW@jY*CY!4Qc%h^Z%5LaETpc?=+V8JZL
?$H*P+ PKFACBb<u><&H:!+KmmMldaa$:Nat66CtG/*#wQ?ejc>\&H:^=XL=qYM/MR!wn5@>l^wkT:KP*dwpwJK
*RqWNV B/RNG$%q>BMPml/8qk#1pkN&P+t%HIi8<wYiWhR8+R69i&i1k&bLyjPD5M?F1=mT1pMjdBw?GPmcNXIG
dKVTF^ qIFLILuA\Zm9I6#KClhk6b*XYKT%51/L56ED=MDlCJM%=*jLcn&eVX#kLwdY\HP<<558!Y+e&SZ*kc!h
c1Ebt5 V8%5?4?pNy8&MjT*bwZ%5DJ9bc^$wM6MMaqcQVMVb#iSF<j4a6+?AI!D?jw@CRat@pZP\<4P#aCkHiR\
ZkdhbF EPYEW*?Sye5Vc/MHEFZtE8W^TJBb<&LlC/QLm1KL>6DT/^cIH^hk5#CLK#IaGZEBACTmY+YBXNB%WynN
j/!N/l ZwNNAIlth1^ZMET5Dh4l^>BtlEQuc:IB??!pDQY#K&IZmtcwHdFdGuNKN8LmZ><q\MPPlP>6DM9YhtHP
w1L?uy IpJRN6mlipPH=l>#yVi<S!9R^pL/V1&&ltk?kFRYXB&DinnDDY6t:e8pI@4/HMTYHY1t^y!QH$l?:>>e
X/dCI& X8?<jL%XBmmQ\TRC%p>\nc@NY%a\AG6ltVEd/<9IISlL9HkhjR<\P4w<lJ*FBMWSM5!B9R?S6PB\G&Q=
RRAXcQ E4L#16D^VwWRIpLc8S8lKeumktYqbuE5datIm/@$Ld1LIddnY+$wlyW8DS9CXhPZYCp=aIM5BR8?SY99
aBe^m> qbcHDp^KtjQaK#+lwt\5/RYhLAkb?%R>hy>#YCdQed#qmn<w#/@nqHl6nmpD^dpL1c%n6SqRBqY\T@B\
ch*tyQ Tl*&eYHaVB\d:q4AK##iEHe5FDh?B8NL*Yk%Ljj?QGk+!wp%/8V>hV&PlnH*+XBR9&\ip*R@d?iynKp\
4PKcta E5@n\B=46GdiG!h>mJNCkS:SZ&8uc@/iX*/Pi9n=ZhTYR?@4QyYDkb1LMjqP&nLV&\tiw@$iaLRhwALF
&+XB%l kBT=Z1j<TK$hIR!yydLP4@cG!bcE!jX%VYubHRYtX=J\4A%BdDNq6:abaQd^&EAAb=n:9dwy!?!Pp5M>
#85ep% F@uZ%nTDnKFAt?w5P%XCJpk^p5kYQ@#WHmX8FpHnLPp4L:6eI&tMn:Jp&mtFHS@1pPJ?Yw/$W*=KIEYQ
^!XbaD H#8Hc#MScc+MHP9!p6%4LNEnKCK%W^/ZSp%nPXRG!CHePBGNLQwAdA1>mWdaQp%+/h+tdmG+RF\QBBbS
yBnI=K \Aw!Z\41FD=mG\p*S\YHl\ijX1KRKk\+P/mkiYCyu+PLC%ha@j$cD6/<?N1D/ppTFaC%dLyNKF:?:Eh^
ZZ?N@a ZNCwERJ6\WDK!Td/9V\tSK6QHw/6iIkaYicY%YHHkK@NjAWwJ&bd1?^<WPNYpkFJKEHLViVata6ESa>T
\1B4EV iM\T8CXc+PKNWd&C!wHq6Bn!J5We4HFN#+5pi>8W^@yLSW9q^hmW^jKFIWVj5ZCMtJE&E&81EDNhTH?>
5@:t$F ch=>FkbuFlJ%ZQMt>/+5C+q\<^9L&kXVc5T9HdGK&Kd:AGmu>pE+6Da%Btbl1ykQXN%/<aM/DiM*GWwn
I8>P9X 6e5yE4DYeL8&W6pWqVC&C5VQ^eY6KVCdqE%LiYFQ>eS85=n&+c?PCJN\\@Bd9lLGP*<Mu/9n@\JwBd4p
=WwR>y 5Ebq#aYuRMPL+B=<bmjAB^P^5\+Q&I>68X*9RnWYPSBR46A>u@lE9hWnXSyq+YAiK*PYh++c59E#mL!S
4mauPN %e&:ZNcWyw*T^*A?!&kZwZXqwIiu<*:l89uKA<&H4KKMcIynl^8EHQY:G1yiTuG9yWlV6HHpkjbityIS
pLCB46 dDktnp!wT+ID8/y\Y!L!L@n9#Y5YHjEHTut*djbQSbVajDVQ4MDCbXXnZ+Q\DhRauVjYjHq*HmA*=4mb
GcuND^ !6+!9Hi%YtDSFC=@C<aekT9acM%k/DSRq*W>9#Qcb9eYR!@=@y*IbKC>wVB&w$:n>^RuXqQNNPeVHqw?
JniyZS VA@a$JPnASFLh4aV*?WRMd%ww6&I?=dd^Ny6<>>^6!KqXq+*jyLF/1tZ\yTnQ*+Mb6K8nDZpiM9idjRE
%?MpSt %FMJ5H$!qeQE6^I@nVJpY*LNHSQ6tPYej1#a:=i4TYETAM5?K=R<K=XaJVRSw=m49*TL%eRQb6KTj8N\
D<qGEt Sl:8tq#FtGWj+tl6!tN\dM4ZDYqSB<M/ET$Yy@8MjppFIRH8CB8J#KiciNyHZ5bRH@y^Du1L=<aDyqw*
@aZjc$ akP/:HqI9k5FXK168ADRWAadlw++Q9cw$94+W/*8+6u\=RhaKPFkqjAJ1<QEMXeJH<T\Fu>R5jbu=XbE
FAyc\u 6E:M&qS?qIhE4GZdM4D\\$PGYmRR%w=d?il#$DLV4Ki>K545>jdBW4LuC>jWH=cP>p@PHFk\K4HHc^PK
KLE\Gl ^B^+ctSKiEI:9+XB#H4anh4+/1j=P$RmhZ9a^+\aM=InSTPLM&un=:e+cBPKinSphD$HM#wnc8<L!DcJ
l$\#Z1 uaK!q>=IyaNDAn!>6F6M9\XNM#\RiJJ5?<l/=FA?+4#Npi/yZETK4V?t*EI:#4$+I^5e4G*:CE/6jW+H
N?>QwQ Hl?*+hSFm*D\Qn>e!*hydEal=c:VuPh:<Sb5%ZY+Ga+:eNSh&6T>MIJK?w+J$n:>T%&e/Sl$F*JQEj\=
4^:h/Q hEawRCG$e^t@KHFVmV/FMTJuTC%hc&S%iiq%ke@KTdW\9a#X9ABVXIb1#Je$\1NIBby^!@TN=thMYPH^
GZB*8i ?T?VFJQZL/kHL^A4/SCh95a%d>amw9=CGZbuXn*H%Rqd8\cM!weF^+mk#YiFB&uy8WuQ=$lN9F=pY!M@
pd!y#G J/b:FM%/T*qEl9l+/##GD!:$uM8*<i:^ihTbb69%XJqSyZRbmVQ$Ym4k1aKNBwF^k9jRT$wnd:utQKPN
dyH^lD Sy\BF$wB*<%:lEcpX$e5@14<@@?pDi8%\^m@T<D@W^kDDpheEecA\@<e^wDD4y6E@uhh/+?KGi#QG8yj
\N>?HZ Vd^PEnpeB4$P@bMpenkMhl*/b>w^DH+hG9I#GuENtwjuJ/w*nPecNQ!uNP>%/J<y:nC?c>C\u#/d@^4$
wM?I\q ##X#tMA%eAV$J:w%@D4P>4M4:iD@*lJa?b@5j^J*@=FH@Fh^q?<Kejhjt\Z@Zh#qkeJ=@1>IKld%V&cu
+eZ5cZ ?#<61hlaDnIM:<e9yMnu9PZT!%Cb!@8XdcDn5qK<ttCwym$HYR!L6CP=k\CN8W^RBtNThQBmAaqu/AAe
NL1EW^ *m9%\bl=AACRk$kbESXJ/lRGyHjLIAZ/w^Y&m#wHE6!14AYt5EaHDuuZX=lR6@IFR#IK8Lln%Y/\SydX
kJ&F?t *YYw+QCJ:I?Cm#j^eXc*YNBnq:\eGcjj^T?M=LPmeNkX?=A8T<pAyV@MaiHE4%+In&XAw?CYI?/@CiCk
wu5=M= WEbA%LyFG#ywpWmBT6yYq*+SXeTmYnCJYC1ykuEEE^GW%6+Al%QPqKG*l>dP1cM!Tjch*uTbpanFkA!D
>w:/\< !$65biWV%tl$BaN:Nb<\b9ntwX$>d\DEC4V//4WFaq4/:lKw:8uP&*Fe<:ZjAmFVEGYSY/KcbA+CT^:&
T&XX=h 1pT!QEBu\<ZpaRMdEVHQjWeDpTkDj*WinW*%8Tb#>YbPn:ZZ>S&iGyi>9ZXuVQZNh4e^&HDDn&8jV\1+
tCYy$6 R<p=/k1?/k@+a=%bc!w4n>N?5CN!nq1IS#Suc=!=!>AyGMi@^^F%nnJ+J81<QMEHHBS>u>qL$KDQY/&d
kN86#E WWQ*Htda4G@$nKK:R9Mq^+6:55::jT^e84e\Yl\mDqBh9bn!:/lB^t+eR/Mj&b\!5Yp4CGSyjDSICPtN
nk+Gnp m=$m@=Ia4B1#tpp/tSmJY+=NGt%Fmu6QY!>utM#6SW/$Q^c+*84^eH:Z&&<B5#!>^YQK>?#8&S5\uZ+R
ZSIHq5 I/ncp6j>ct#YZ+B^\1\8Ae#^t6Kk:EQ%>Sl>LZW4i#/GjaRpW<lQQNZq1Q#1/M/=+I>qc1BjJuc*<L%a

-A>6uP 0004e51a4d1001202b4 Page 198 of binaries2.zip
h+@:N# /bie!Fh8N*#dI<%i>*c\?:A>%HnZm5*B<+=l<w/^<nMnVmaF&nT?nhJ$iLHH$Qc:t=c#qLP56k?D^?/#
jTNc5> EY>nc5<>+VSi9+?A:AKT*qED$BiX$@lqW^/c@8BGbyND#DYA&WdtaQ!Kh#T4h&d9t6$CEFF?Cym<m$>H
$:WJIC bTm9ZMJKZ4>N?FdGGX9?>niaFm=GRDcdidj%S&F5#c%PGQnS4qX*D8^e:<PHDm:$Npm:Xad8na=c*:BC
@HwbSc KtF6X1w<N%y>@*Jab:aIS5y&MM!c^:/^4\8jjFAnM4kdL\DHM<CWA&I\ZmyYqL8WGB6wF:*?14!1MFJ9
BmR/n> t6dS6!cLLm<MLhp$6%YhSXGP:SQ!MDKYJjFaWy=ZuL</V@&bZC&TCAj*lF&Mu=ZVjF/cYWc?kyFBW?!G
%LQAi@ 8hKA6F6#4H1Zu$8!ulTCchuj&m%NRy#w=5V4l#FquA<AV?Sb<?YHdqPIcId^QK:SpK=QEMW*hMY&4u<^
8kb$Gp m+8b@%GKkFiK*jVPIRM8K%iW9*e%DdJla8%:MwpNGV*bLySAh%mG\@*ScN6BF@MR4$E^q$bAICdy%w1b
huTjYS Chi$WYpmP/IhW!hwC5<N&YD+Tm!QTJ@Wmkj1eX?!E*@RLLdEFeHnand#mkX$ct+NVVL1taPKtBPwW>e&
$Bb#Da h^XP/c%\XB=T!9c\*!QRQRHXHReyAbbc*%K=\lVAwh\AhRw4F*^D>Y1Bt8Z*t18$aTdKTL+AZP%ZqtH8
B>@l$1 ?V9DSyXEK9h9n46A#=biR?jPRM\hH:QGaDDb$p*^Ce::MZIibq\ZHX?%BL8nib=R/1BCNPup1+4bh^w4
H5J*/p D=h/pt%^NiSF*?l+p#$5Yk%Me:d?PPJhRK\JmnXXA?RF^F4mG=NbXLXHSipK*KDELCk^eN=1cHnt&@6&
<!1MaR Q%8uEy<!AC&B\L!l#M=6b+N*&qFy9+9i4tG?5\KjB:?T^/5e9b/9T9B!%+dlc$%>!YQ!q\Yt^ty*cn!<
?k!qk# >/wci*yDa$$dhk6mDC$<E#pq#5$tae=J<a%D>mWQ5Z8u^\jZ4Tk6*BwTnmYdyieIPjYTTKNWk=yWu<t@
PNpFcJ a+4HD\X<%&^IetmHE4!W@yk?&mM%bucpH@iMFP1CqeEZcTdWD%P&Zq1N@eB8PuLL1PDN*VZij11mCDG&
:9$C9< XENB?1b?&8Yhu1/cjyZp>eEELTdNTN5/qwA\\hIei48kuaqiYwEwHw9<h^HpE>^/umj$nAtt\?hQ8iZV
DmdF<R Mt@jNhDlpqT/N=B$ZqcDjc54bkyYF4?hdSdLppPtKY:iNqCqCYKNQTcY4qck:uI/iTW1IE6tajCkmL#=
H#N?5I /TTyFJJhBp#NZH@Z+D!@!jnhT\J!eA$ZSTCmJ*6ZESHR@dBG=n99WHDAjt/K8G8/+$n\A@ph#mnR=\pj
ChnN!k R:$NjN%dSNuEPXwG@hYXHYJ&6jL*hdX&Qi5d!*tjJ=j&+!A:\:IV^+6QX&wY=$5$anY!!#S:qljd61%*
b&WEMA :k>W8nuMGD+P>M&yI#J!Kk%kCA61IW>cLl/eiaCm?1\VtpSl$n!I#jyC>HMenN:NG6!d\nI5my/?%#>M
BY$D9w Fc8X^h=jakY**w?!T$:S5QSapJlIaX#c*q4Y&%ehjbT#ZE>i*VQ^JWXRRZ9W>V&Z*VmBZm&uFc*iGiNW
%j+Z!w VXJGFZim@+?D!E#/6@i>QNFGSbl%#Q6=6%*$hRVJ?e1!k:/a<GeN:8S<Ku@JeE@<yj+icFL+5iC8%1dV
N+*&NY 19Yp4G95SqaJD9WeC!BX+E6@Z?Kqu=*1c&H!/EqbVLu:Gk1$yS!5lXN*+CKekuG=Bd!npYKtq1I54Qu5
#C$m4H w+Ln!jE!p:RF=aNbtwtdL*J&KNQFyKV<tkpmZ#!$@:F+KdMcu4p4DRI>d:#p!Km!+p+P6cejS5SpB&TR
Gp^NG@ 1@c?nZyn?PBbw&qS&YhNJ85Lu$^kcuyP6M*F/9iiTjbLNhnnJlGFRKYN4Ze/dnL5SQ&WkwyNkD=I\aWi
wAw!Gy S*/dM8/EZLYqbP$#&hByFE4HqH^AhKYw&/wy=m5/#l#ckcin+>VLcuLD@8@1DEH9ABtH1\^SBChaB\jy
5HL+A? =pNeRReBiP@SB%51JXE@LQ15i?iLdAN!Pyt^8*P=6>S@RPk$SHY\an%jDyqh5QXnYNANmN6^^jy1mL9y
$V/ZZX YE6k^c!$X\y@D/nG6lSQ1<4Qak:>mJXw%bMw%$Wh9>aKZEc1l*eBetjAcM9nqWcmnHQApGF\XREwWqbJ
$j>*EW MpBZicS1%$j8eI!:jAEtR*y1yP!pAQ91kEP+et+RYb:AQRep1PjeSlPSn:/R=1l#uDW1ZF=&&mhElV+=
M@8P9# MCcP*X5LyYt&TJ+IHnyWYuldyQ=E&p+^aEbYSSy/JAEi1=!Vdtq5K*c#tjDyN#PVJ*/Zu>%R4N:Y=W#B
F^e*Mt N6DWI>=Y8uKl5Q!/4KN<BHilEnnE8hPKnY5/+tq:qFW:y1y=aIBdwF?y/DC?jb/H\RC&wCGWTEiXqh4d
?6Vp41 cP+NPJVqP?YIN#yD<w6*cTqB5SEthl$A4wl%aWpYlwJ?NM+DG</X9Y@PDE?C=wP=bR8/ybMI:jSSqhZm
chjJ9Q ^TDYP=Ztj4J?P+wBY=uB/y<KYpBB1AVYn:Va<\X6C=?I9H%1SWEVtn9:LH%wC=iB#GSPp84T*=@K4MCM
t>l$^X h1^4lG6Cy!:\1Ha*H:Nawb=kw?!Icew*B&VFtYRL#JtL6=t&<:?^VLq%*kq#\Yk9bFnDWt@eqeMBw/Ge
YN&%Et WtQY:Ypu=99H$9AlHCmdAJkVD%/5qad1b?#l*+c>Z98G>CVDRTK\iEC&&C<MB$9G/GHy5yX65V/!n9PE
y5?T%5 K1+/BthwhtD<C*=5dEm5$@9%+ywacd*DQM+/Ad#\tah%a4nPHphH*uNqDk:BF:+:@A>4^9a*JEWniwIX
eLhd&R QqIwuBcEL^8Ee&qG4FLF^Va^+YiBmRw/Xy1Z%#b:LcuW\p$PiB6^?!wKNHZ19E*bGVbbd^NN?tlGjSa<
KXtZ\% K1^mRlRS/ALlDk&KYP81QY/EXK/^6Y+8/li1\6<5jcQZ<#<Xn=&nat%pnEL:QbI@Ip<WtDS/5d^wIy&/
I6>Z=< 5b&b!eW51VtacdAIjJ&q&FTb1\Ghy+JmF\lGZt!qncPP&8@4\9m^J%klP?+jb#*EtKDedh@<Nl+S4Xub
M4P?DZ llJ!&imb&Yq$nYQELA^$dL%IhCeSZbM:NCBmT9bMJQY!BNNN*jHGIViSKlL%M*KY1u\YWKnc*&h8u/wY
^na4=q yKt&HK+P^hcXySc%D8NkE>VnTP*9>4@LtK6q5pw<E6/$5yRbh>\@$GLRP/HjQR81Q=W8YcyJ@AAci1Mk
FGP6nI dchhuKpa+&GLCJSQcQNZ\P1yM1ql:FMkV6d*&=R*&RG!+aw/ZEVc@*a5:!6tK^e%^T>QcK9yYJJlYXW1
G/jPDZ $NV5?K/+<qby:*WQa6/?N8Z?Gwb4L#?uuCPymq%Z>wBMDTN:>?t5+t%qDX<5uLWL1b&HIh4N%6WQ5=H+
Lu\!hc t&iE!t6tWW^?+S69h:#AbEEVe5Vjp54#LN<1X5&S8GH:J\*$u*:1edbKHl5pCqkP^ZICR9aJ#>+T5:jE
^P+J4= ?B&nKtC9dpnwJVplFbJh\@N84k8@/4NZ*apGc@DemT56R\&<p6WSPldk*cZqZl<BhDk>GY1bb=#nFYjt
GDwkP4 VSdj&bE&/CJhPRkcJ<N9Kl!p*DF4KN5YGwn&q+k8mEA8Hk5IB1eJH9AbD*#n*XqKWlFe1qkWKtR*tikX
GDWPmi &<?RKBS@IS86KcE?:%VBZ*LiPtBAtdlKPSl4<Mu$FtRyEwWALjeKFFPDdW9RMGbpX#ay%AJ6:E9+K<p5
d*E<jh V?LD\#i6:Ge@dAnX+p^XHGAKSY!Xq=JbDLb<IEiY+Fc&B*P%u#aKSDm<m6wBn\d+<#G6pE:w:@DblC5Z
*T1SZl M::?eIk%FytS>+lG@:P\6wKPL4Lj4cC+L&bYq&+yK?CHT@:M?F/t8^NS$u46\@!DT@KDD=@%Z?autIi+
c%m<GB RYE8\SLJAcI#qYRF^wM?IqwYBk15ntV1tu!BdEqC:\45yyKV*en^&@PXnLF$&$VZ9tB<^ZIa&4ZF$A?m
BV@5aM mkdl4kYH4pehi\!$QFT!$Ya6aF#j<bh@1DlpeaT*J99wIKXM$GL5:lQCh*hS!X^laVkW8J\ym#ja#b/F
h\K!Zk 6c4=YYW\tR6#$CGXY!V1Fj^^#mR+YpW\:#lE?@Ya?$WPSP<Y#IG%4QX*p*ZZ>jXaXwQYdYSq/n6/A?$m
Vp%>XM pn5B!hZ5kcmAe*&FJi*/\KjeBTk=y!R5y/&\Yk%yWn5qLMPT9WSyQ^5dp:!mGS94PXddAGC**bJWaHk>
X+:bj& l4y&w*:F^A@^A^Fyt^R&q!XQP4QX<yL\nAl*>$AiL^?MAYDjP#5CcDDl\yjc&IjT=q=hI^eKVqIWd*XX
J=tRpW dqNySEGLnY!L<:RP>@ZY8qp1naAca<BKDmBN6>:!+A%q9!ccI8I+L5<?QQj<X6>tPaP6=Cb/+lu^MQw9
jZ=YT5 GGFMne%YHpZli\aC&6H4?4a<n5:e=P\\HDt4=lk$FR/5q&\8$1L^jD+%cJ=uHW@m8YSetBp?CXp?EtFn
DTwi<M QkXu#/Zb<I1!/B9A!D*:^kllntp8h%L\DwIq1>JlDjSEKlHF>=Ee+p?CGqMh+?%Ddb:y^LHl&h54*YjF
ia?u+S +$/9kluAlPK5iVJSNiu4p=pC9Yp86Zdhp<^ie?uXqS\N!RWVpn:b5/Ck:9ScB/X$EJN+<1Q+X%tM@a\+
+BmG=V \&:k=\@EtNu/RyJ1G5K!pTC@!R^9AkHWLFSA>LR+\KT=q&pVK!emAD@?TWc\lwSEkEmRZV=qt&k+H&%#
9%6*hX A8MY6:SL!=PcL^p&jD1Ye$\ZuM>t*#84GSCwGciP!Y68mL@^&NA<4>SteLicuH>bp%l\*6a1W&RB5J1u
K6JKJ$ CKwuRKiRSB^CHCT6:ECqjBSXu6EYAVtu1=X59BYn&HVmR>@Cy4SymkJ#6\ASjS<kdNHp\9y/cC?V?wy*
6AbH$V n18/XW%IHI1uAVZyucpCEZIt$a%:!TePajKTQcMk@5uI\$=ha5$9kyFl84QmVI>ANNQ:=DPwNimtjD+w
4l:W\@ NKu:a9kCq1kZLdiNu<ISmFt1FqZm$Q9XbGa/Mdpb$8QFE<^qqE+bua*N*EJ*Ip+kcM?+p<b@bq^8?T1I
G8/a1! NP&i!h91ej^t*$aL<<iN1a$HZFX6T?D>X>K&=T@S68lpL&9Jq>+M!K//#6uJSy9ebKVm\k:Y\1^Z9PXW
VYIHa* Sl4PV4XejjutW/6tBE$>Nw=NdCb@AGQ>TcWJ%eYKQ8&4tnY6^*S&PwiGbTJ%/$89D>Td:nF^il#4j<cq
Tddcmu $>MTF65Xq:mZ&tNQ=D\m&*51QVd@TG5H=yNZtpy/AXdZ>!9y=#AZ\DuD#b?F!H8==p=\bSV&$GS\1RiE
K4km^6 H1yXT$VFM4WwtM>K4BX/EyZKBai96:aqI=EEj5wGRmPiG+@<Jhp?WS4y/t<B$JwAnJPtjyqnZKi=KeNn
/#ibu= @V#TY?GQ^LPjK64wG5CpdwMqF*a<:PTjbN:&h@I96HVuciLlPYhyZK@>Ih?1?HETu%yEuLL<aj=+QCF^
+R*$SK 5QnR^DMt#4XK#qQ=RbW%:w&bdIdtGTJncMAKX*mA95\?WdcF1A@VM@Z#\aG%Gbq/Gbb^H\M4WQc<NnA%
?DI>p? P&J>S8dlHN=l=c8!idk:WKdl4SqVyuc/:LKFmEFk1H^4cd#Fl1YdJ=HNm&u?9FjuWIh?=%6uBDey6X!A
1Nndb1 E8Y<R*Xnk?@&DG+h&XnMh8F:SR$GyG#MEuJ$>c<5EhLwAwePjLP:w$yaLj8td$nK%DIGbEwa%BbMGMX?
b>XLJV TJA?VlMtV$B&ncitQwtmCbHunZ@NNDn$9uG4d%wa>/eXE*?X:Q?*XW#<Na^\ScnB>dj@!Xtd8j/4@k4@
Vqq+cZ QjQ*L#>A@6c\/Lhj\Q:&A!@j**:k@&5MAw:+Y^pEHIH+t/IKS@D@:Xe<@/!I+Bb#hQ@61$El@%cnecWG
-AMZch 000ec63a923001202b4 Page 199 of binaries2.zip
K%N?8= !@QjSpWE4wmK<F<@K5J*bXREjwXCD:>?bnte:+>KNj^@VpQ?S?d^Z=V19:e<?jjQ=j?#Wk%F@N/a=Q>N
iN@EX5 R:=PG4LP@*Ic5plb?A6/9ME!aDYlViW#XH5yyLec1WbB\cC+Sdy*V*G%B\A#jVp:DK\!W8aF$Na:Wkin
awRNhw Y/u?kEe^&A\BRET/w%HR=SE?AG&^M1\85m8DCCk&?PumFd*jIQ14HPRHcnl/X^cSyH\uD$P9YLacX^S\
KHWMnP >=IIiEkhVcwwj^u\VbTIa+c!j>X9q$jSThu5l#K^8JhkMLFbJn*<A>c+?QDwND/yR1*VABF\!uPRYpw%
hADMp= %JRbMKp*$Zk@ab$hPky9Sb&4SGEqTTkSh^9eS1n8jy4mWaH=qcFERq$J<AQwY=>%1^mb>Zd9yZcSDmt4
q&>d58 Va!#Hu81*aPhY4%uatmI&CNXXmP65w>8X<C^l1@Gu9C<J8%PE%S\ujatBXZVhFLj<=mehBme!V^^1j$w
&j!#=Y @h+H/GyjT!+j4:DLw\8*G@wGbENapII4du>\FmdZ:/b/:&<9!hhG@8til#AS#*9Q+L4%VSYyS^WnFI9\
qipM:D 9k>Q#JV<q8+>yGlWQX$q/ZaK\9jZCDGCRjWwDT8TFb16hI:K*RTMCSXB\pnH5?yllJ4u6n>eDQ#5MRBV
?DqjJT cPcH>Rjpj5ED*WPVH/DX^@^S6tpp*&1Bk8LdJZ$=cF6<A!p#@h=K#<D>Nd*QGt5edD&?b>+QJqF@u:L>
&LC>F& mH#e9G/XpDb^NE*@9hD?VKId@#yFBQT&uhBIj?pdBh:SaRB%w#5?85+?1ueLctSK86ZJe5VV1/$=J*Jj
&F9ccm /P\J*W1GI1liJwyyH**^E1IMSW=5DWD1y?#ml?:#T&n:w$T/u8^><e$mZA+C\TGnQc@ZS+?C!Rk698E/
d@F>wA tm:V:H=AF4LB9mQtJ$TWnlqZF6QaV>P$t!@%amRtZlSnNR>hTC4FqDk!y&\XViWSA+5y!G8epBTG6t6i
8wPNw* e5l#F1\9&A>*jJ=GiWut<Ln5^pHuwN$%5:tQ4L!IXFIj>FGMwl+JAcQwnu\mNMTLAdX^!j%j>b!?1NFd
RSK@9k tY^Q1uE<mYt:!F>n^L1dp?w=GNbb^tnVIma9cPKaM<1\q9yEbWI51AcpYk8a1B$AYnlDp^d9@u:Dly8J
^Xi!QV Zpk6bXW^>&*TAHGku^<MP^Gh!9VTPCS&*J1b@#W\RZaLeaQ/B*adptI8+MJu\<8umD@il<HMK?HGB?1:
A<$HpV !!hE6@c!AYk%:tYQhQB9CH\ILnK:Sdjcq*%:REn%8I&WTV5^lebPIeIlT%<Ih=LajGAenNh@t==^J<1$
KA$$Bq JFWaF?$eS>$yV\#SycVGGqcqHlu6n#YSFtHNLAQaPXGTV*nR*tHE&bWcuTd\QGHDaI!:yNI*Z8b=^MG*
>9Kwtk q+y>>BRmGL:\Rm8w@JpBly18!TMb9L5B1Ju%>cu9YhCK5*c?lR<5BERBeT!\AYtcF^NPJmt%+:#DwjKn
#81<i> qCim>=n>e:Np/q?1MSLt%X&TK1^PIpiu&XG5S$:DM4G?kWVt\L1Md>nKR=TBHLEwhTlW8eXYk6VqwmmG
RMXFVX LWYBQ#E:JqnW:WNq<GSQ/^Qh?p<FN9y$QCZ:/qVLE4:\wRu%8dah>em%ZATZ6Z4>eXC!pG$WLT1Lhj*k
Kc#d68 $C46MH9jmR5n8C5lkPE4kC^5Mwj=<mc/*I/5t\?A1wMImd#/nCH\9@YMkjl#TQj9B+n@8e+SnwBil?d>
SZ%85n GR&:D9&VVwB\BQ\cNA@5J@X?CMR%cDnQV#IjED#ZwTE@i#d9Nimju$+RjNjAj%y:l8D@JX4kD!in9:Q@
mwV@?? ?YVE>!<uI%:EFTenu15/ejD?h6V<9!TG#&LB!yYEy^#A$WiG>Y^cSMXL&e?PL:GQRXWG+cDFCXCMlwVi
#jFR/q !Bj=:aQ4P@*#jeZwC!Y:Y<=F>JEPXbI:wl>mb\l\AGD/!cQ1bhMKIyBpSp$?Twe4mNTCe49AATARyMJ<
+IT%t+ >pA>w8Bl>bqqwMl\WIp!RKybHY\yYL#F6uN8hFKY4V4AAtGZNmHF^/TbcPde6VKlAGD1Rab=@W8F1$8N
@M88u? I^FL>FGD?qThIwGqScWDdYbS+dF5NTReek\WpGndNTFTMQy98\Rukie/FVAHdjW&AMmPIkZTt*tVml!t
8lB<*j Kk5C&LXQCP1MXK&wCn?KTaGKbjGlSNm$L!5Z5h5#EM>j:$T&@Ckdw>dBcKMNPKNwc$jY<6ZK?$Vh1t^Q
8twClS JCeC&+a/pAL6&LcF&%%5bkSqnTN@THD/!*>9=uV6VCeFDbE\M*KKTN^/$PPQNmwna81=%DXEm^TSqRHG
Xj&eRM Pp8QH1hQWAcV%y@SedZd@KAiM\ZtNwLhq%Z8METWMRL/$BY\d<LpW=EMM1=h=QjGSJB:@cLJFWTpkIkp
YCDc+m Db6JZybi?^qN#tAY%hNkYH&6??*dGpBc6CHT/hNk@wd=Bn$+Y#G:ZG4:IEb&GC<K4%/Q6E%&64ltyPFR
/=NeEL 6$WNp6&9WXX9\NDjG:F:y/u9QE4DK:ne==p<q@^n+wawi1jSeP/y$!MQ/dKGl:hkum6L9GbAV/Vkw664
yDX5T! /lckuNkhZw6y>b^WZW%*dblX*m%KW+*XIXj/4R>SGamhq6jYGlyJy+:JuN:y:=@*B*1+$qWRcM>XA/ka
Q$&HDN W9Bk*p5Q!<^m5$WT%^w$F?u*$yJqwtRTp/BJA/HIanKntQ4qe1F#p\GEk$hYFyFNA!in4u&/&!NNZa$m
Bu4Q9M i8q&iWM^V$+!V=GTtuMQm*aSy!V4KY%*p:$Yh\QA?&lL5XFl\TDM%%tI1GeQ#ipiwTQu&$&>d$c6AclA
&P!nJ# :8QRd/p1Fy#5Q@A9k\l&Z4<Su4%%EqTYmnTcNucPjbdTAhQQynmh*%4tq%Gu9m8!QTnQ?qBy\mjq!$!6
*Z?ly6 Ai^CXWDhHeYJ#<BncC#@:FKLc:H^RVBV6$wH\u=HS89qy8kFPT\V!1&lkW$#MD:wR?/^*m%ZYae>H1<4
/INDA> JDWGlPWVhj^wF:?qq8$H!#/i!P+Wau81DDl9p@dRi/>dBc#tuGtZKnTaZ!QCbYhn1J%miGXm^5RXH6Wk
Cy%wJp *4G!tNZ!VZD:uL4/b851HkHPa<Ip\SB*n8#P?GK8/E\/>5$JaCKq9Ybec4>p/FSy9J&n5yG@dW4lYQp:
m@DJpN t*nP*iC%aqiGCu4ZaXXyFWZ!+%Y16/KBTtCnj9Jtaq!CQll5iVlM1Qk+l$FRKiHDc%G&YT&t^FNMDd6G
jl5qP: <Z:T=*T/d5Ymk/VpM4FYi8t4uPDhG*HT4Elhk+mH<cZE<BiuGZ1tkj/A!p1#EJt+P=*iJ>mPPp?cLIp?
88qGL# D&J?RJjy:5tnGh9ZdLdt*BL14<%G:85QmL6?yK=Q@Y^$?/F89Ye%^+6tci#V\CGRY$XDR:NP\CtbPl*u
Fb@Feb \bN6Md161ESQB@8Eu1i6t4PB#$9=etLuH\nM@GBuQD%Nk1NuynBmN#&e/M/I^*4h+HZb?p#PQ/PiWq6G
?t*=AZ t8akt<LhY&+dmFaEj1a\bcJIM$:P9?bMRubpt+b>H\<nhKl^YuTRGX?/lbNS9Vy=%lEewcth@iI6q+H5
Yl!hwy kR=BmRI4Ghh6=6wW:jB^cZXq=C*n^!qtEYV&HP+cCK&<jG#bXpEe1eP!V8w/EX8QB*#8DN&JV==1pyup
:qaBAw 5iL!b5?Wjp=mj+*?IL&+Ik6m4$>Yty@ckGM<9#bhPGuRR!PJC=4MMRiHHttl!MaY+#M^>Y=eWp1khChD
tXbp\k J*1M%#5thb6p>DP/!E5cK@SVJJV4K8:X%DeEGGh@wnF/u9>cSyKaE1+V8=kT&iqd?p1PXtc&dB=pJl%8
ZTGS<Z <YHB<8LpaK%bNThhI:q/b&4%$CpwLyjBWD*86<FdmiZh**!ZS&+&&FDVap&*taJ9qYVhPq5*cZ\$V^wd
R?J^8i u?VyJBZ?mSDl>hmRNEG\Hb84VL*Qw?jn5LmZuMh5lti15Wd?ulY&hJN^C6L$eP$MDD^ti1C/hVFE\^yH
caG\TB IhC&KJXacL4R&TXd@:w>+W=\>YSiN*5u6SmbhGq5uJ5WP@*Nt<CEG^5G^@m^lIBXjTYjdN$=J=$HSNJW
muVB$P Y<eS1+JNDd%$I+>@<KVT+#8dQ!E$M9qCSIeRj%yXc!4B<=Swn<RPVCR\l5RXM<48ehHAXZF+B$FTFAZI
*^h91A bS!&N*K!%!SQGFT*hk>ecnMEa6MGmGnEAYcVW/#%enBKC@F8L@G<P*:N55>wF4uE>KCL+#Z6*yhJb!wk
?GtN4t pqtMdEu9W<nwdeX/$y6b6<GYhXb>5HcPdXCTaw*YL5^aBK*!CF%iP+AK@HFW&^mdB>#w<XXTtZWYiw@a
>F@!:T w@ZlDVq/l8&>8A@VDZ/CpT>ihpZh#Z*!*dcl8hH^hy#Wiyh/LC?>A<c5?HyhaWCeM$@%u1Xt*KF/$+nP
j8eMAd CX@uiyyF!ld55hH+RdZ+iQ4ApHFSP<=><tB9w>le+6Bc>JJmZqnA5pFB6jT<q@QYabuAVT#:elj?NX@6
htp@P? $mK\t@R\pM>X#n!V\pZSc?n>e\j*<IYFZlGHMj9L:FPY!eSdG8Yb6QJ8BbHb$$qeiXVdb^>$$KhdA5k+
!^w@T< <eh*nBiKm8y*\nd&*#h<A81=eF%$i?+R^p>I/p$tBSCa5qTM/@maY%mZ/#+<e58RPMXcKYu@XDSKN6?!
RSVX1I uZR*$KLY9E1AqaJS@dcXtLqV=A5uhmjhCp!#:!C8>qh%SW?i*H^CBSZA:6HZJT6??\RtHXe#jn+@9YER
q=cN:8 $LY=H@*RK!Wm=FdhlEjh%$YqB=bm>^cTW+dPhtF#*+S9hSGy8:pan?=\XqeVSK=<DJ%e6yYMw*uBbq//
8%4PNe !j$ta^n!IV=5&cP#?BMjSpKch:&c+BQ<l%p%C>#8lRaE>A/?I%&w*VYkiGGMWej**uTbjBb\LAm6=DM/
\/E<eX HwdMGQd/Y5b*p>qSkK4XdkPGYcm/E?/4du:S<Q^Z@dpF?B5^Y$wa5c\aHEK9a>cp@ZT%%8KZHak>I1p1
NlAq6w ltM=HT?@E9AQw#BY5T:d?p%Ew^Zn5C=<D\NpXqaTD$Vjlb@:d:5%PKG?4X9nH8bmAWJl=n/c9@%B6LGN
F8K&Ik ^@k/BdCl:NRBNZtQ8=d6MLAea#PYdMamW/*4EFPIM4?FBY1CFBl1MdqJeZ5S!KA+<%pJbRLi+DKaX:jt
&qGXj@ YKQW?/^TmGw=a#i58nt<?&mB#ui+ClaG=benCBBjPYaXN45W4jw+Tmi$!>k!ta>L8pHwK#N%cMkcmXIk
@I>Fu6 XB$eRjNeYVbuueFZWXM!iM!dubb$b$knk4RY!\aLj>q6wMpCL^>tp\GYmu:KL1?Ku/HQDLFmCi4P:4\b
5XGpGk hF\:a1c&6&GQP\P$PWn6bE1kb@5a*qcHZ%#S:ZJe5KS@XIWn/+^V%IYN\mkcy%LCakX*S#bWtwE&u>!X
wlXep* queq/kYN*XuQy>PJGhJF$+%ZcNINe>LhWmIaC>iLYek4iHn*GAea*q15$PRTY$WQF9\eFm>bk$=jT/jD
qZC+/J 8u8ui1eTKwM4!cYb9cVM/qVXHWE+FA5/TmH8QYNEdhNIhBnpaZEjNlMA^6LDdWqpcw8pKN4cJp/k^J>K
/ctY## Qy$\?#%uw+N8#$nHCM1EZicElBhES:wMB+BClM&XDd&&L<<:66q&S4^CI6l&PQIpB8pWlnSmnER5QV%K
eNdm6y EVp>u1B\FynSnGeXQZ9qm6JtAcjLqJh1=ZE+Y1G=6m*?>P$lZKM8A=^IwP:?8jRY8dJqln6L:BM4+kYM
/\<G@@ yd*!L9Q5dBAdHiecS&?l14qF*/8iLk@8uRQ5Qkee<c#C?N\VWbMiI/uIin@ISXth:meyiRhVJpM4^c!i
yC8ZVl 4a?YCZ\^@NauRX:PlccFJ@DRI%+XVSD5R5ceZ&$!mlK@=hWpN/?qHe\5$q+6*&GH%Q5+5knmw+D9a&lu
:G\ZDD 6+/@WKbTZZ4p<t%qJtnCy!cay9TI?D$kHB^M\^mcY1QTRNPVGICGCl*wbb\\mnHc1CXkCI66^wRjXKm6
-AhJJ\ 00004a01bfd001202b4 Page 200 of binaries2.zip
C6H@Ki E\%$qhY<iSAXl&jPVT=lKKQky8i5Y%6Vd=<wHic*WV%8p/cM$K:uymne\44SRN46XACuq6n1lDFk6*Wq
BV4JIS N1kTt\ZiWVi*AlSG%^Aeh:G1>$y4H\?*LSQMYtAX:pWi+!GmZ+8i4:Yy5WZ4R@J9T8%FSyuD=SIDuql>
D=IZZB Cl^eqPQaWHdLeqN<JTjnHi9YCMDYpl??h%j1CJ%L@%Y*PYt>:1MkL:nWe>wit?M?4I1I1WW%NlFV+mnH
P\R8Bj $9Wi\%+wHMip:k=ia%$=$MH6XK*!$*4S5d?n>npZ6tt5M@PtlQBGcb#jeYh5y9AbIyA#Q\?kc8<*bD5%
H5ebN& y#=6iAJGcwmn8G5P>LwL?LA!nEju%dIuNbaZ^k4C^</pW>d9cRiFm$weTSG9c#F:i!Xqk*4jEwM@c4Aw
S8pImm 9>WI&JC?L+Z*iu$c&hi@A=^?1L<>18R/4lyR@$!t?a/b&aeKcmt\I8SWQZSa>Gp+ui<?W5dicV/WcnJK
Ej&68k %Hm55F4B5K6Eja4u\N=9BJ\><KFm^V6$Bw?>d&qHXPPwK<B8!:@ai&44ChpInqJqm44SkC>8tqu*/\W5
6aTZlb q5DlayVEpXE!an^1%kKSwt4nLPW5iCS8Fqj$FZTK1qA&qPuKZm<BJ1HNq&@j<i\QB$6Rcab@$a8del*=
u*h1ZT Ihj%ZawX&J8>>HaGLTGMXGbK*AbPFhp9b%w6Y$+TBk/&Wm1\BuQ/Twjy&+eJJ:Zy#+yc1ZVXMw8iC9lb
q5+ITj 5c\EGWq%G:J$TY\Am>yC@T\ipq9J1?c8DS/m/^/McVEM5+PZViNZApkwZdnT&Mhpk?TmA@%E9hi1HE$1
Hnl&cM HHP@PiHWa&P&SHIDX*uYuJN>FLN4u=9uK>8@6/?nGuYdXyA5@Km?KeN?96+XILKFFtQ*!h?WYZH+qpVB
5bkwRa yma:8mJwLiBtpQEWt%q9tmy#mw=FeqTyt8#y<acG8#VNwE4DG%4%AFSm4<:p5ublki!yFbh/nmY&ESaY
dMyM\? WSkYqXhKyB5AG&RjhCnhFNGDB:8Jdc\&u>D#!R>:T!h$bt>9t$?6#h+9l^itc?81F$D!&ubWS:paA=@y
?4tM=< 8bChJ%j<1T&<ZmMByyF@@kQ:SRDJ5!C$&Y*Wu6&tu/e$dcD$I$p*<TTMqcB#Fk5KGj!iQp8eJBeJXd5w
5I@<e+ 5\AeH+%#G16C:$j<89cyn>#a*nAYS6\:hVu<dDIeCiL!eFdyw@Ek6Gi!\9:MnJYu*dFiJLtZ?^&@KuZD
$8Dt:p 48*V6wbTjbN&lS\^t^4KFi&<CcWSEy/Q##RSHMpXjl6K9Gj>$Y>K<nl*htjZ/YAiS:K#n!b*RNGn6qDd
*y5@@q cMK#$mZDi6nk$/MIluWQp+EKQChCRQ1*qTXRa:XuN:y%maqttmyae>iGJZwFy*bFS*mqHHhaj1L64c$$
/j$hIp #<HmStLDL5Aa8QNckYF#*:i^jP56&j#qCFXR&CJ/mFl1qEBc$5GI$uFIlildeuEWcCy8Wn6AQH1Jm#na
nXTjKp 1@Dd<Gyc$6RIIwWw&8Z6J@HujAeDjMe!9iejZu!nuTtZ*9L&B:uI#KXGMNhGYKAhqn1VJHE>hy&XXLh^
CW5IXY WqHEA9SWnP61:STGJRI%FEiky?VqSaAHNY$c%ZJW5nLbRDMHy4teAm+qC*j!G@P&bYR*N\F*G*VLbne<
>>N@<* 8$?wbqbilS#VIV8ANtY*5G\LmttFT#PYcmy4PDt//*b$c>V^\hkmDDhL8nL11QlXV=RiJ:8%cZAw5w8R
c8%t#\ LK9R5E&y^iN!^kW#F!#H^DGLK=qW\l#ymS:C!VYZ9bh$i^NBF%*&AMQMyEJ5y\#wS5D1+juBS$ic?R9F
L\b^^J j4E:<+ecK1@KJ%lWaW=D+?k*9AQMc!WlY8=K+B>MbBNleW^k4V*yIGKah<cL5X9S&H1k$HVwSb6&!$iC
Mhnjq1 @nmYTHSDC4\!yhc!Jl1:lIFC:K*F#jt\kbhlKGbB6jRj:QQYR*aYPAFYlZ$Z4q%YDWt<=/IP^TdK?C<F
!Z@G=P 6a>+Cm?6Kq%l>i6KY451J!:9unp#66BW\y<%M/R$t:<!WTBN6Sm>h=L88Tq9>!^Ky=?/w/jS%pI1\d6Y
BRGW<: +wLw1##RiGyNM?^aX$>hd<4KjBZ*DTPViT6ymCX9qn/Fl5/G\ihnZ>F#4ySLaK?@mS%>5w$NQJjwJ>Fk
tFJ1J@ H8n@h=XcdppwqIaH<X>XwjHA@56+K!@9u?P69D#Zn4j?Vd#:w!#Ie$W6F\@58mw!D?I/>M>WbB/i/>C\
M>dje% u>G<%/ElQ/Q=4pH#@JVt9\cN?PtwCX!H@yq/#k8=Dk*=GR&>Bk*n@SpN8\d>e@&d>%4P>4Pd&*kSj+#6
NqYLd& <@#Q4T*?Ee:@m+LND:qC\idq8WLBl9LD@6@a@9Xm?&u@D%$^N5wbGct=l$J9tj&*Z6K+!yCw1F8uAu&t
+n8#lA =bEC$lW$Y$JB^Gm/w&&n^T1$pVAuJ%J\nCpQT#AShTWycAI8Q9SASJaHA1VZHpRMjWD4Il%eHb#>B18F
Te4KEk H\:B=hji$A&h/C%Q<wCWTi8^K>pYI5ZBGnS6>$6dHG=lP$*iJSPRNVZyaV4aI6&DD9q+>4>Bn:m<ECcV
keCK1c 8^!=Z+E=?\Ml?%mPV=n\*e:yEE<>/Yq>i<R!LJnnkpGkn=k5uBVw^BC?*@hB&y!:u/Q#ppkuJ?HD\:bG
kkL/nF itEmeP^6i\QlCj=>/\ihV:JP/^LK$<#jeRhqVMmT8H6ba?iIu^p4NM!1tLW%Jm##nZ\1&PieM:XlEATS
TyV/u# PFuT9*$^*Hi/wDZWeY=e\uYDR:bSH&R9u*jjGTPT*kGLFKE^^C#B?yhd!BBYj:&F:Jb/>ILH5hqRh?Qk
<ydBJi K%n?yM@R$GWuQHlYtIpWQ?*PLb@IP9$kI8te?4GSN#MPQA\:uSZ9CPWiaWWX:hH#lyQcQpP1qht66ud4
kc$/=4 &M^V1MRbj=nS\l@9D=h@&jq!jtP8nQ%eu\yq6cDc*q&PMFZyehl\X8cQIit:jAlSd$l<D>hD<IM\E<t1
pnZ1VX bj#SBpeXFkaFTeEqll<qR1j58KW/HT1a@FGu6dY*JlW#NHetn*weKi<lil:hCeb+PXhtq=C1Fpb+n*>*
ZAkGhR *EH:XSK9HMjkGRBd5&pb51Mn9nB/p6/DGiW!11m&@S4h*FJaPIwti\TSZ9WKHtYM6u8\I@#%:I9Xy&@=
q/6R*= *eS\F>*5d1HuZjQNinAq+%GDi#RYmM6pPn9keBn<DbN<V*dE>lQ:MP*Y^K%QSkLdd9c9Dl+WHYeccK5D
NlD!?> qND&d*e4LyBkTGKly?NAQw&Mcm*VlBCA:ujYD&KpVukd:#QcCuh!jW&@?PK4qDFSZ^<:9*Sea*ep+IaS
$qQYn? QJJNi$pYV6n?yiLe=+5C?:GDjPlFYZIDKB:mFEDwS5V4l6d\jw9Fm=N#9%84=dN1HaYZa%SIl@wIyc:5
\HIG=i tLW>n/<W9^4?iQP<$+nRZmCn9BjFybD&+HADJ#a*4pcmlGc=VGk9m*S>@GWKF5G?j?Gteu^?&IWSka6C
454Nwq N>u*&6qBR4eIlWVP%VNte+a1?G/Fljlbh4^tWDMWtKYHQhdJVTJHScj$Zd/$5LIubu+hXEjKN=AY=Ej<
5PnaEi qR^bJ^E8u*\ZdjT$I<$jSXtE\8nD^D?TJ#:pG%/d#=WYb:PwqJTptP\ptIVQINEc\kSMyZFJwipBuDwY
n>nwlw \<qL6%L5cK#l**ASdYNYiw@qpMD&IFK!ZALXBEh*iLy@%jTk?J$/8i^!4CHK\%*yKSyaVGXTQci8?89$
4Jc/J? jH/djy%G*qMRm>p*Cy9NL^Fylep*Gb#++KX4mNFt@ui#%6@#!6*Iu$@ud6%/ky=$1nM!au%=8hRk=%&q
N^ERFD WAa#i/QSKZ@ZB68knLJ#\ujVD#>LqRtDZq9:TSbqk5=?V:JaRck%JR<*$1Z@TjZu1Ya4nAu+&S/yAmLy
c:?DMN u4Z=w\V$TL:<>T<RhncH=:86E#TqGeu!E*QGi:^$\=*ju/ZIa=98*T>q&mm9$9#tt9aSBymXw@dl/I:R
kB?4MM q@Vl#eiW5j$RRXmnGjqN&?c\Qp@C^>@D<%=NcyJ%jyqtnY4$VJ865!=SkW$ej6\##Y%m$:JRF99ici:&
c$:5u& ^JyHYT>ZZ41MD+ymuXy\Mu^X?GSmX#h=Z!yyQiNlmu@B$14\C*L4M@nu9uMYta^M:4R>?BESJa<Sp6#K
<E\ba6 ^1Jkt*<I!6+4EqNG&B+X+IRSQQ<n=SNcayMEBFGu+E*%WnkC<Rdu#a8b<Y%QDt94lTGi!hu8hD&k$Gh&
eiJq5P hP/<PY5wF*/H>15GeZ%8H^LAbY=y6!C@#u5*Y>%5KhuRu66q6V%K59kQcihMGL<K?ZG?!w+9&#BTt5/*
@14mlA =l=P$%ZHh<WSTG:Y\y>wc$ib%bM8KlYcQDYX%HEyVXl?1X5:/6bnddRJGLkh/G8RiCLameq:S#\i+/Hy
XmKiK8 llXj&aJX!kpR&qbP!:$bB5pey96cNC?wbMJ^?4u?&i&!w**hBuNd>wu9!tby94wnFkt/e1LpuMFNC!</
AXALXi 6m9$9w\\GC%p<p5Bm+C$?lId%LPqw5@h$+bmQQ%%SHt5dp81n4tu#LWNMZ+F%tQcVe9/6\qaVajYe\<T
p+J*Ht kmMiTDJqG8*1>hh/5MuMq1mLk&:ReV?Thh8>9T=&*<^>nkB8m%iXy644&MV1M$munY^Y@e^ad@@?uEq^
HQTk65 pJ!Qh\aa*#N+qQm<nJKSCYQ91ZbqNEe%<9c/jC9aj$JQed*6Xn6GhaynyiaS6V?i%t%Rpw5@Swn$P%:G
cnLpuI N?AQ6QPG5tuenPTdqH$:dA%y>$D&qIKanTT+AwP^t<\YdFnb/A8Rct^$GI$iZRmC6@YI5++u:R:$IhG*
>wp:!K JP+D>jJpQ>j%aTayM+A?Qyu^Whymq1G#weF5$teM#ZPAKchjJ=8uI5\u+%&:Z8X>&5<NM@*F8VhjNcyc
*eD*iF p?l?<YE%Qq9T#4Zt@ZymwlcFTQ9$^y4J^KZ%XK%*/e:<ta%G%pp=#dtEX?cGpRi+IC6HS!*5C>C1KP*M
AGjJ/u !Sth$wPluQ9A@QQAwp<jNamYa*:\#Z^/@>*5wSyE14HX:pbWI>1k6i1Q8AT<t:dm:6@VZy^^ZFnjuc:^
#i#LSd y6S%piWZkp<VG5S&^e:iT?/R1X#Zy8JIK>*hBd=m=T:M5NLhwdKXS566&=HlFpJ?*NKJYjp^=Gi!4*w@
?iN*>? BwIFGQHj5@H9@wkYtlW^ik1k9\\lEQWLq*+ahF1?QCTh>\C6=\ac+B8A<HA9/HZuqklYV/XN&\nKThi:
R5Mh^u \PYwc?E4Y>@DDc1=#quLujS\>yiaIS5&\+a6uCcLuE/C%iqPcEklnQm*\^8#DQ1TwB*uMK15WG%LKRbQ
Q:k4NC 9@S*H+?:\ItGReYm<8LipnRyEehcNQE%?C^c!pm<Ep@k=u$RelKMV#Gj6+1L#dIYERe1tVHcJX4a%J<^
uY$/Gl +Xk$&jK\Z&Bc69CwYHQc>BCR<waYttWX\F+!S<I^ya%L5WD>p5@yL:&&uNG5M<DbC%ddGXk+\uy4*#W:
e?W:&$ Pd^:q?+Ha!6*ZwI5y$Ka$=@a<LcZ1L6$S^wh&iQ$q4wWuXFa$bZ9$NVXcJBcK9y*Zm1\ahu8qbhD$@jC
DH1@>X S!p\V$>q1YIbZc#LhSP/imtMpKiTJhR^SBYS!i>^/IJ*1VYD<!emPZGe1Icqja8GT6QYKMd6:CJA^BQ!
kE@dRC \J!mcpRp#^$u=D4p<X*GY4l+4jE?alwwiCk6unFBqD8B4ak:Q%#8V:9iNYd/:c+jepV!#pnkRe<^WNqG
TEwRDL i&49+wEC&ynKWuZN<Z/EDIu6J/N>ah$1!IMa=MNl@n/X+^b\cB\l?bFa4ilH11ACp^n5Q8<<SCS8cmCH
Hh:e%D @JhkE#hyG?uN\+m\Aj*c%Am8&HVeJ&!+ZFFaw&^qI&aERkFnAhY%p&!+Vd=K?hJ6A@a$J#jbSpHTt>S6
BKN>FF VRC<%KlD$jGR$=ASaZ>dAY!Y:Ml6Ic?RVLbc9!^apBVtZSJRI5!5jJpXaYaPND=ltm\#Jk@uT86SDRuc
-ATqkY 0004b763966001202b4 Page 201 of binaries2.zip
tVJQ!I BhY^9FqiiM:b6eil*SP$p\NHHph4Qlk%\M$jAjw%ATDi1bcF&@l!<L#LennZW&hpCIp4y^\PR&?yZ*WI
m:jmCQ BGanZH+MC1ZV&?CKWW9NLd4WuNVYXFu8Ak4Z^!Yuk*9=yY6NXXVIqEC<X1EKJ?R6$64aiAhCjmWR1<ST
<X^#S@ qaG<@PKeW8S<<EAlC1MDy+JM9m>*RP4BAF56SQ4eyuE9EFEw:/h@wAX*>Tk1Wm=huu%hFH$Y<bTc>aR&
MkhnSJ dJmn5B#HLBGL=IMIRZ%Q1iDbRQMDI?Wu!y@!hmJd&h#$TNu!Tl%RLNZqiA1p?FVt<P@bmi!mSMjbG<ud
9#Zwi: an\ThSQjYEuuMCp<!t1*n1jM\IuI!6TEp6Lpjq%>FMiik>9l/p/=1VAldtptp?JG&+bbJjHiilM+4G?V
1@><?y NP9>64*e1ENCjl&h1>6lt\Xeum%XMXlti&FZeWC#B!%=SI\wVH:9kG*ntGZBkqAtYulNpdwtQ#GlQkKc
\ibh:J %$C<9jG6P%p:<6njPl/8YB?Nq>4l=BhE^t6MRAewL$@#Y$JmQ6CRkcRZq/bcmcmBhP8*W=?w^cjFAFkL
%RVa4Z 9M6*np8p5*i*Tl?/C?p*tLXl*>EE!heNVXSnQ>AcXE\>R\^9R#KCdR^Z9*H8@PaD^?Zd1WALPG6D8wNh
\iYhEn k/c<iqyElK=Eq9Fba<KA&G$aTq*TJdm#H>Kdae<TQ@G^m1$&G\m4B146/Ne8!S>PSSLNK&<Bk/\Vyj5^
5Z8:C* !yjnA/#Vdy1NZJSJK=Y/p%88\pNVja8VWVKyITPJ?b&C^y8=RX&jDje1:W=I:bqGI1&AhY*LRXdX9yIn
cBePVH ETE98RLQVLjK:V<SuSKP6dk9TZbbPQWbhtQjiVMt&EytN<YccyC*%GeS&R455P1Zd<&::A=c/mndApjM
BnSPuZ Tu@K5?:Zn&wW4h54Q*Zyc4j#w1%=\VDadlhBD1<L:+!//K*eRGqY<KkYymW*6yKP?YlGhuFk<utptt9W
qqi4I8 l6dml&k8&k:Z&jG?5QjVd>6#T##!Yj%<q/dWL&/ta&N/pcYBqWD5Np6u9$dTSNw/Bt!9HG#&Cq$c?XyP
cYNS1I SwhMP9!61B=Qlnq8<c8%D6&#wJCnnHEqFM6$kccYcGS\n6/!58I8nn=jEGn=9V51SXQG:*DKM+m<Q4^/
phaXiL Yh/>*kwpwlh<CZ+WuSb/LLj#Za59NHFdNAVbAhLRD!KnY?y>/l4?kYCXcXe8$JJ4@wX%@EN&u\bdq!pk
Y/5PLW %An#C@&ta4M6VRLE$N?Y#I@6I9qA8cp:%&cwSG!N6G&AYc6VGu\\y^e?ab=6Fyh6hR>q%jJ=Sy&k#mR$
RZY&t4 Xpd8G$/\mY>FW*MnkA94M/S9JT^PG*mYZStmEP^T^NZ*&hS5>?GkpCJ!IEw/P*D%$mEME5&$aCyhbBk/
ZK#T5@ EiZB4%?<mD8hcGj%/iKnKDC@PFL/E^bc@qNpIAccMq/DQbt:5l>@$Z$tZdd%ik8/8eD!>G<Y69iL\6Bn
$aVGuc HXY+&RGpS4yE8tC!:\MRC68#=4C^^?k^qWBqe@R&bWCJA4a<GmKY/jD6bj\E5TckCp&/66Bq+?8k$HBw
PKRM^t I*I:LW+/?/#QK?/RY+*?AZ15DXBbL*dMh&WcK*jYV%1b8K=6MBH4BecAESJky^%+?hLllYZF915yp<Hu
%4lc8B 4Hywu1/YN6kyZpXMt^dn!6:Nj%Z?@9eqt9L!@biKJV@5#+wqQ@Vcm8Zj^Jw@!WBZcG>@K=Q=F^HyJ!&M
GX\Q1% +d\C%/H=jpL#Rc=B@/^>My\Qil$c<bQMXV:ahimj*dy%Se91Q>PIu#+deR$c@6Q9#ZMhG9+V#jGKq6X@
/I4=nL yu>9D*$%#Zeh?ti>Sjm8+&5@%#9=48N5MQlQd6*/>=:X!9>p@/Qi?jep*d@1uXi$<wZ@c#j4j?mh9?8p
MEByZp @:hp:N4<H=t^G<aYZ6IR#m/>CG&9%1jCLu=*WMbPeN^M!4=N%%WL\QAi/+*&q$YRknBb%u=Q4nZynVR6
V@=@<1 Z5jJ>$h8CRXlWm#^me4:*CG9&bP@iSi/Y&%BC1VQD&Q96:YFDj9@*49*Fan1L:%:Qj%SB/%I!mL@DQqL
FZ?CFL Nl5C<ZJ5QN\TnDdI4d&c6ubpQB?A\^Qb#GuKQ!kK*R&jcPtbcP1w=#R%YTAFSJK!EEutYDqTK=j=ITGS
*>cSZK !6:9=VmQQW&wyeedlIYCac@A4!8em$&XwuaqlIuABLWV@Y<Sb*y/qbm*AICb/WWmWpJi$ANcXXwp518C
pMtM?! +\pV?W!DY+&541aieR5\L@mt<u#e^b!>y8&lm9=5I6%Zleu/<*Hq!Ib%H+ycW<+w8pn/mlXT>deGd1R1
*#>%Fy KjjD*Cw<HLAF^++9ewp+8W^^wPEBDN4q1CP>+/4ttmiamqYc:?+TAPwT!F9W&QiB@b\iL*EC%ERpmmpu
@qh!@d 9T!M/n8T\cJEK8P9F9GCMY@:WG45pVD^R?MSYbTDKW/YTa8/wlM96n!JL@wnL*lwZp>?ehum:Sj<=Jm6
b^6>5$ qc=aqku#Ay#pS#:YiPt8Tjc>I4c/VQdHM?ARcYt#F1ah4VZa4X1*^S=h58DY+c:91w<V=e=:W?+!*=$G
JHCDMi 4ld>K9yhdV5IAN>j>SX/%?SKDi@1IFie$8?J$yD><5VMY=!tXK6K$ec8DQ%BGAl:\GJE5Rkhy^6D8EBQ
jM#14w yX*N<%wQQ9Z8!hMSn&d*!<IVVT\!Q>Mq!Za^@Ba5$li5e+PaL>y*Qu8T*6!j8GM\TRM#:CLuQj$?y64m
dkl9Db YY?qN1Zun=XmFaV=^m<8JX%CK5d@A/MdR>96kA4QkSJ<HFPG+L8*J9*BKl@JZ:TJB#+?<w5=ImnEEh^<
pLK5wc &$tqqD*&QFkCVWi5&Wwna6mJSc1yhn1k/WqXZ@&4*qhabBEjJL6jiZjmHE#H6+\b:Tc^h5b8BGjb<HyH
*d<QqH eMyWF918=F\$i#pLhbe^$:#X1XhZ6>%Z/9a5dX:T<hEWtTBu>N9/PF=LG6!YDee?*18=hh\l^*wnw=P@
^p!EVP +XcK/CC\Y8BYJd>lBRZJIBBbwI8m&B1mjR^&njcKc5FGbNF!MQ5STB#XtZGeLbpM?YV:u!Ij6TWt1?/A
<E*?^! @X?JXSdyABeVH+DNG%bbi@YLmhqZE\peSNMa6RpKYG*^ALq*^D/4*hBaWNAI9!AR??Kml@ua%<5^/1IN
\&%K4w =jTlRL$KC:SGYa=VG#%ZdS<:^wTSd^$MV<hcjH4mZ6+je5d?Qq#ZH&/DZ#FHl4NtW&a1pZVuDY?AYT:B
#m1R4R 84VVARClHk:P*mZpLt1dltwJA!pGHy656bDRa^!:Gm9#mQwn?lu>*lKcaSC:IA9\8h$1<#I:MwNhmPFK
/uH<aE QWS%=Qnq^9:Vn+RcL%hb=iaL!8kTPPy9aIn/8<l8MGym^=?ZaY4V?HeZeIqtK>@CLHh&V9RQJL>R\6e*
4SK419 PiE8pii:4&9TTc=6B<^BCVQ!>W&@l<juVVaQb#ybkj#VnE&+m1q4JDuySj^=e=C5\9Y>e9iuVh1hp%li
4<Y**@ NDA#FNuw6/wTL#%YhT1tan%JC&a5=PDuTT$$ZQiD&a=RW@Qp4>%+=R$#d6dnjepyy=LLC#M@/up\mXZW
p=F?Si KY$H<k5RKeC<cS/*118:Q6+/9?bnRE$Ep>*9Z1Bqtykyu\=5YH>qk<uIT&XVEc>P4quE54KWR%TRc8NZ
#hMYPh wItVjqttq#SmwcbA&T+aw%l=&!^\AqJ?1*TVkd*JPApqJID/uBn\@mJB5@cJt&lKCmcNTw\jNFy4tl&V
B5j9DV S#MS*DTc@4Fbc8#Y\%6d#?y+L^Zuw5?i8^+@V9A%pWtLq1P>jK?d<AW\=CWFZd<*tMR%eXdB@AP8Rd*8
i>=#Bu :lyq>hL!PX%1qGWFB=IT&td%yM#:TR:^@YmwDKQaWBMuD6y5R@Jn/wiWBNH&i@Z6>>5&%6AV%Q6%YJ?Z
Lmama& XG@Mq6+Td>lc9Q%t=cMHJim:tuF\dRQQC=CelVVMk=8VZ*t6ke$%&JtVud6J9*Tbt85Pq/bCcmQVIuVm
qPEFQZ <itwF=jqVjuyHQywFReLJcCFibFSQhDPWXjGbp9uaM$+u*V\I=t%u5a\cj1T416MRJ%t?JV:44qDEDk+
!8P*Z1 I1Z$+&N#Z>^\8IiF4L^w\NEh/*VqC@q:d<i=b^Luka<P<FwyYcHJ?11P65a>ub>:k!BMd=+KCFN?CBdY
SDPMZt h<L5$^X=d!LTBKmCSG!yQ<cR:WQ4jJJyPDbqS8hJ45%a#TT*>4dK$6y8?E=%a*hi@BduP%PRZPRYBaS:
R=!5/H hmZpbutAI=EBcRJ/!JMQSy9%ljw>cT>9eH^p4n:KiQd+mjy/Np*m#X/m@L1ul*hSW!^*@bpheAJP1KHD
Jc6Ra* *^4+^H^bat%1bT6Lhl5?ZC+&yKk1KNwuX1<H*$%b1H9?B6j*k1\?dSbL%m@6XKwpFXX5a4bKuSV?#8D>
EaqjBQ Apdp5>9t$mB4\5:CLaQH/QEM?9wH=Nw/F9MZHiZNDb#NB:h%un#NaL*p4T?+<#IYjeK^met@*?u:&H:\
Fne?ch JH/Gd%Ne+J5HHc*J>k49%9Cl/tp#5p<B4=IHF=*wn#J4NS<6mi6&*!clFn1Yc/*MFlFR#kuY<A<T\L+b
I:V\Mq :QlY^Vtq+X=FW%hn<%klX&iPcn8T@K*c5?FmZi:HPdT*$Y4tkk8GE6kEL:K<hmj+cm*W$#NT^IuN9qhN
\*Pd>u >mp4a1y$5XM=+jM/QZ?<<wBSy:#WhWA$ZIH>G@nSCJ64?VhJV6!B@kluN6:hPP@KG*SyhJJkm\QGqwYS
Z<ZFhQ =ZhKYI?=66:bl!bG/&+1PuTM&t^JCEe#t8&!>L!4mN$hBciXpZNcHZw=DMkinLTKq4@jti4JN41Zj%1^
8$#GT@ hynDLa1Nb9hnHcMQu$:WL<Pc=bNQ9q8>M4duRQb+IJd5&y%/qw8qZXn^tK@F=yT^WtPwqBPaaKy+APE$
qkc5iY pP>q6RR#4*\XH5uF:1d@5hGnm%RZtaN4jiCMp4b$Km^pT/\d>JW<LH$NEFWPJm+hmDTPkBIR9ASLFPD9
DMX$mA G5Ke*lJt1^D8/5w/jRHmDiHSDQ%Rq6>la6nbAXcC6JWl1bC\GQ#1\>1?<>1!e@*8n=lhh6BNJkBc%\5Y
ZLbRE< J$84yhBCPTJIRMNcbaq+bWQBCipGYpFlhj6/ACSPeC\&8%4$jG#<AZ+WD4qEyTnHc=Y8TnX&YZB?84yK
GB&Eu: C9tSiuGe64d6/bl6LHBdj*L9NSdc%NySJ6W+$&MX5^<!!/%XTJM%/e1Q+&V!&Fy5k6=hLF=Dkl<PQL@d
CF<4qH Zt4KGL/TpISJiFlnLIE&R!%G<:W/:>+B=A?FGd/1!n+DRDl9:HpP>h>FaaXkLEZV9cWJqp#M8\NCL5Wj
L+MZY1 M>JcV5Ycb&&Gnt#uYut9>VHL8RG/bGqEA&@5DmDnlp:NnIDB5!ZhiHhL#mPZD/LYYEA$Y%LhjE^l=?Bn
K#B\n+ B%%JW5qNyqVH6l?mF\!%YnimXHjCCbpAGE/dt14dt6=+PWDPWC9#Cuc$AdqiZuqXSXyMd$G^LSbX@dkN
@Km\I^ IRCPHd:jFF8Z?ACNE>MI^4JLjmZYKdJ5wQLR1p>5T%qY=kcVQX=\XpIR\@\!5uCZY1Sp#+n8ZG$uRI=^
JG%NFN #ND$npE5$^j5^#TXmkYXw6X%^P1Ae5Q%E@Kit+kw*Ie&+h1!mTKY+MeTQ*D5Z^9IpZ@1=uy+\1G4BupJ
#/qpWj YDMM^FLF^hKZ!HD1XqbZjHdDbtdHSS<y6k<+NnQ>GP9HdknhJH>uEh@A41qnpi@w&A6p%?&QiZF9J%wG
D%apHQ pCIpRc*eZctS$FWt%=I$%qGq5k1Zi!q$HCX<w&&@BB$cFC/Tu&ZG\CC:E/Bnc<Ny1!ce<IP#E+6:PcCX
a\kIKm FJ!@QCje6pk%PWuRQ+\ZBmpnFM\?wqM1F5$y\CmI$:jy^K&L1%ZL*VK$iRB%EFyhH&m++T%cKi@RP\R>
T*t>4W py/E1mjemCLwdidNjT8B<aE<aYh\k\I+GEeXLpQy#KG4pnl+XJ1@dp>q$\a5NST^WK*QZ1ReWDRI9C6N
-AP%dV 00013013c5c001202b4 Page 202 of binaries2.zip
uPI$5c %LTQl\dMuyM+hcXYEtJupRP5HXii&BTX1Y@ce1mM6CV&tDRWKCtCn<l5VnXF>#b^%!#a\#9L$GS*L^5?
@G6lhE B8XX\\\pIqE1PiJ^Paw>9m>^WD+%\JKS>B/8HK+>S&=w*+<1Ci+SaLC$DERGek:D9\CdYI#9jA?bWHNW
4/EV@j @$!t:5:Iy<E>G+u^k+=M:jc$XRdIcY&=+:K+eY%d>Z8luX1anNcN&e6y#Xqt:e?nVX?+jV?TyeFmFP=J
:&*KEd eNN\Ke:kbyKbJYmF8u#4L6+I=415KtBiN#tRISMAF>\a$^FI+pjcjBV6HiH1?&+k/=CA:#KJTT\#KC%m
+N\dy6 E+m$RL<jajDRqj?4&!*iE8?G1ZimHwC:*I&iE1pbl^*XYDeF%daNFRV%E9FjN6+Wu8GWlMRA&YJLyQcN
R*BFAb PQSEGA68+J#e5#dTTeaCMWb!JVKy>n1L&pKiBLidK5WbP#!nNkN\Y*Blt=*G1>EatW5cFa>VBIjBtNhp
SjP8u# *WwNAR$<YLHARk\hS1VB!uLW8lqRSqE/u^NZDE5DSWDX6kMt&6KYD6LWPDCn^>CjyJ=wSGq4ZBnBI?Ai
^5WNQ/ TjVa=W?^%:D\8jTbMP%aZP>Qi19W/jFJNMAu?h5ikiSDST\H6mRa9p6m4HD=HZy<#M*1Xj%Yj1HJ\PIp
H%F!wB XT!4/eDq6!ehe8eh>pE5&qKd=M^l\D1/!qM*BY+Vb>?uW5GTaiji+*8^N?&MbI+#?nDbX=b<=QC6TbX8
/GB5D5 dyKLYG8jm#9WAS4Xh?SqXE:6#Fk<m=VDJS/+JlK>H<qcJqIBcQBaN5^#cknqp1B^?RXqDWATB:JX%bRN
nuXAe6 /=#W+T^G/!p<tkhPQbke9GH<F5h14mDl@VeQGIm=E1klu%+dVVLpd=&uh\j#=?E@PXqVPTE!inS4=P41
nA9%9G 5@IY\XnJ?RkHdt9!u8Ty4>bdt*DF*LW+jMdkG%1%W$hW$#K4dKFTAm5D8\=YGZ9aY4NaZKlcDha>=SlN
n6pwAk %a=6IMADn<W*QV=ThV&A$+IC?IJJ9=et*%E4SIqY6=Thd9$#M!kXDDAckbKEd&N<tTtQ&5tITiDTT@Z$
pJyXC# %aaTiPdYiN4EY^cjnZmGc?Z1BY@1E@uXnJ<RFQwinHp&JCt&&X:11MP!wIQPDjjEPkd9^GqFlXDTK8W9
LQXy:p KV*VIVQYWh4V1L$Z6#HAiYdJD4jGQHqklLI#l%F^PtPnbCS$Rp:VI?>yn::T1Plb?*L#:91Wlnn=beMV
6:w9c1 nYd/bLLM5I$?#@4HbF:pFpNX6%tn>$4C5e*IuT$PEtXpLN$GKuut&YWQZ54q8P<Y6ySXN156qHK*9qR+
$X?Dpp cLP%$HdtD1qk\pK4=NI!bt=EK=t<eDp@%4Eq41@ecGK@l%Pi1n?XmSN<$ICQ$9cdjFct&eSi?XJ$:<!i
yqMqcq %^a=aSDB^/=VtV/*EE8F$e1i:>QJ@B#^Jh%4@hqM1iheji+8FmGmXHuC^=Yh^FEk$iS$MlcFy<SDw+te
lt#@S^ KJER66EkW&YF%MeGK+dHKE+#a@tS@n!4qB@&j$=YKV@<9>NwEXDEu#ScBBS?ja*&!l:MeQ+4>MK@*YB$
q/#4ew Hh&Mu?jZ<D@&I9$:@B?F5:@uB9+8uCER<K8E5*<Z\1*h:M^yYQlwqKYW#c^hdXu@$aIXJkCF@cp5@=@1
F:ZF6M =6>ulIj@H*1i5w8=B\&MZ?AjN?d@:n^\H6njVbK$huH>jR4=@*/@p4#^:@>HRQ:baQ9*/==+@tk\@^WG
&9Z#>: c%pb8>Fa8@:h:Aj@$Y:ij&$h?\>Q+8j:N#9l@FhhteR9eMZD@@bRGk6#a#h*F*QZ@@n\*>6W@IiH@&ZR
EC*<V8 @tXM@tdMQ*4K@u*RBCD@Ntm@!>V@Ptme5D<aLkC=e6T<cN^h#c<e6j>+CeP@GC:\B$P9/ue4AL*m+d?6
H%P/KI AT=8%k/YNG=Y@:CA^5uF$hLF&Q=jDiHl?%<#=G<nKHBXX1\A:KySeHT^@h&PS>b8X9<\SNQS#6*?*/hT
tFnM+6 +J1G@HE1@*&EEBD+H/eT@kj@l@*:XQ=?*>t@j\9+Fh>C:Lh%@C@DcW#naQ:wH>@D+!@j+#>?Dh+4QjKj
PWKX1e Za#@N4FZ*bMlkLnKEm6nB<8@Y8Jp:P41bPXm:Qw9F5AlCQ+@hjnk?$<Y@H%G+Z?\mPe1m*m85EnE#P\9
ZK!WWp >9\iCHD+jij=y%&8@&wa*=@8VQtZ99V@\VDEH\!:KpAl\H8Fac4t>w+i@&GwwLD49aX@5wnuD^bhhWti
t6j@YF AN>@6Pm*b@^QA@bu<^D@$mntQ=nH?\j#?K<!n@@1tiV?m+t@LSu8JudYynS!=q:@blIQ#*<*au>a@RY8
@XkhtD Y9$F4q4>FZ=@T@</l#>:/j/u>8W@6+4@D&9HFa9cZ*@=S/5$ZQ>1p9*9%ytd@h\$&J>*KF:EhW#:+:IG
>Rq6&a 9e1$1^b?DRj:c\\bDA:=d!d!H$Q$D:6kX>q%%V/k=tS8ct*l>d6h9*&Yljq9D#D>N*iHIRV?P=P8HJ14
G**++# FuEFa&5H6>@?@eYGu?%EeBkj:L@cmj/\yQ@#wQY*uRkBRj^lJ?L:>=$I<ej9eNZ!L?L8=tn@&%bp?65K
+k=*kT +pZ#n/u?>+u?#%@u!l*yu^9u*<*u8Yya4%4@Sa%N@:LD8#9>L=tB?JjYWXia<jjbSj#BLN/4#Ly1>bj\
?%>m96 NQ*:X9pj#BK+%wL&b:N+@tAY*%Xt<j&u@j9*k=t46de=ncQFj*^V@&RlHCb\HR89HKm4Xu%%e%M4l><h
YM9Ntb mpde@LjZ\</X^6nBnEdN*NVh^h4Nm?c*9@Je4e*MZZ=#86>??ljL@6\N:Fw9!y?PcAmI\L?@GFDa@@Bm
%Y^FmM ZLXSmJk+849>l=t?w6$eHHHXPQ=lW+Bi6TqA4>wW%Q@qyQ*d+8dm=jV:mQ&&#X5/@ncRX9d@$bnj<+V?
\L=9dH k#F@H:w@dA9R1>a?/FZdk9I@nlk$#8:Gh4>N:L?hGcHZi\9?aA:$D:5B>K4hAQ4V*iA*n*Q>8=e=8bmd
m6RAtG G49@^eXw*I^6#S%wVL#?@Gj!FdX@%:V$!wGC@#t4=jib?Z?L?K=X^Dj*9%4E%&B9e&Y&+q<Xyj>TF959
D$jkXi W^V@imu&j!N@Ij=eXI%AZL8w?8<!$Y<@ZFqhnaD?PZj6:^h+@&8&+hWJaAkw*#XwKP^uNQ>%u9&VGtWE
u!FeKB XPA/NPL1!!aSX@R&9aKGIH=CR*?Jl9$TDd<G#eQ@M^4^T#VQL>HZ<VWi/M>tnP?ZcQ=jw1@nc\n+%YZl
YPtdZX CDnpq&nwL>HZ<dZj1?c9y8G@SCN?md/P4@&4AQ99NP<9$Z!@SF@H%&D<Q@E%8MC9$AnIL>HZ<dYjlnWR
e&$y6e CNm9+jA@SEZ?D9<nK5L:&!LA<>5?^!5A@&hWlQhjw!JZCJ5IBPJ@?6^@SF6?Y>n@>4u@CLD<=ZQ=4#y1
kRe*+^ I1/+qkHP^*iNqk8AVtP$Du\8TyApHYbeBlW?LVpY^4GAI4tqRCl8Rcnu5k5ZNT=&J#Vd#+w*JnKI1Jkc
9n&*He MpkIF?8VpQb5nSRkEl%IIFKiEMMPXM49>M>855T/BeJ&kk+SFh8H6IZR!*VLq8CWnNA&*EBZ:6Xu8@%l
yYuSJN JRA*9>ktJM:C4>mkpSIMAE6ljMlQ9w<bG+YN1GpqjmCXI5?p&X\>+t1RBi48VNNAE\u9pWG=?k?j5B5W
w$J4ju a>TM&e!!/GFRAJuJhpJjmnFYh\/cBBVu/$Ky<MHiH=K:B88y\<G/?@%P=t@tIn^!@hH9/pMZMl>lBMwp
nMw\PV PFdhA1F!@WQ##XkwZZyY+4iXp*mijhl$Pw4t9kZI?BJ$p%6LNwIqTi&$YlcLn5!^Y86E+^$SY%<hJ=1c
H=<qMA #TuNGIZJYQEA$maZbS\9?wW#WyB<yG+j99INkS/+<4*BJH8NL#1QcBaYdayeYkJkit+lwn4=pT\A&mdq
8qd68a XZ+SbDaSAHI9>PDiKJ4NEZQwSSnGjY5MYR4WS^cVjG#$$5Ml>pnZi<B/^!p&Ct#wX%YAYM%kJaJ@9&?T
+SD%PQ wqHB!Y+F/D^wC8Hb:?9a^cbFL5@#$8i:WANAVWcLCm49ktcnRi?Mlb4k@AN<ALnRH9uRj11ypBVJ%#Ta
l&*+BK Cku@MMq+\nw&d>QJdPe>qhNuD!uF#$D5D@lNed6XS<F1Rd6VyEHdAl4?EnjFAQBFJd$J=<RqeyR^ek/G
F1VWwj SWwR\#?VS?y1#H?W+BAWVL4/<Q=aJW&uYtV$QSMm*W1%TunpEeP\u8IJJ=#/Z8ZZV&>#\PL%hInc49y9
b\VkV+ QKabml>tdYhX6GRi$ahA*+5>IcJwYW$%8GMky*1H8pcY!PaY64S+NGY&DEH5GXnGp#TL!SHDKXMclkmn
nWi\&w qj+RpBLCTJCZ^!LK:5aKdQ?e4W#*\kQVXEVR4e65ebFhhtd+DSEyhSAD9!<>yw!^Y*JG*q+$4J&P\FAt
e5>Zah dp$pZmcZ$W6Y5RnP:5dWbIF@aEad!dhcPDjL?hwdaK!$pN@EEM/&Y:=%#P@kd?*=PnQKND%b9NjGPNZG
i$AYIm *<HV?$HFi91ukDF4i+atWu^*DnNiAXYJjmF=+<VSVACy=E^#CN:Z<VGVMcE51pQQbJ%5YZ8ITccFKKmY
ZV$a\@ WqI#IW:t$/wH&pK$t/HH48Db=i4:S/C?Qhnmnj&ba=T1*1wujBnN/6cdKQY%ZTZKMn8+I5pIZF!pHhqL
!X8bbN nHXuHV+$/pFlju>WpYcSVQ<y>$5mWCh#kn8pF4M9F@WlteLd$Q5It%CFM&h54G+<9y9QpWjwXi@M=^T1
u=%*#X EMG?@1P<EC9<8#CaEh+Hu/KR?Y<DK*6i=enKX%mX1KX1W!NqBSiM/TjaC*5RmY#@i<l#R6\:i5Rm%euw
bk4E>u THH?<^#>t+FeH+T\uZa^J5PjC@d9R\MtZeKty#n$RuV$tX?EAiJm*eE*nEm^cW:AGNq5lq^6IRYQL5:$
1d98Qk Qd*EedT*/#SwTDEE?ZnDL*k^kt8n^P\W*A?:1a8uVRwVuP8Dc+SFYPlhCG=!GEXKY4?q>Z^MBhJ&B>6/
HHPI<X C\wuDXT9PLERRyXZ5FKV%>Bq&\Ed#bR!Y*jI/JchkPZVp9$>YLeCPY+DmPq\?wwHWEb$ttIMP*hSCaGa
VQn%c5 /BkVMJ5\@5E9+dpcJB>WdyBBAqDk?eG=Rl^\c^\m>#/c91e1@/d<=p5u*Rkt8^:NWh\FXD@pZMY4X*=4
9RM/jZ @Ap>buayGeN\tqQDMF%cPm:DZIePCYL>jwKX&\bi4!ieB#Gc4j#5h88!R5tGSdZdT4=Sp\^\dDqRqDtV
J@tkQd pMFEP&:KA4$jeJu%wbXDLWJA@^uN^4Qqqk>aiIZi%T!&JDjEqmP++<tFJD=mmPE/KV4y\%AW5hH9DMm<
!/A1h@ k6u5SL&FKI#eNBM?NtyT!#:DREh!/n9%L@Yj9thMA1dK!!YSD+y@q6%&%\T/6c=IFph@6k1ASbQRCjA&
nwtV\4 hhI95:AA8aduu<pcqj!iw*uGt$nQbm>njW=VXiu?XZRkm=1%^WiNJ==K=4VhaLL4VVEl&+6ZyJ^TJdiB
aPIFaQ 89E8@hlpHi*4^iy?S#:*P9H4/<lA%1:X%VCW%9:D=Xiq?wkBZNbu&Eh*^HByQ&t\b+SH+#L/QbLayNn8
h:!M&^ yR@Gnl8A1YC@ktZ\pGhl+u>^ieTE$8?^^VBejcGG%:M:w@*&95ZnAcalu!=JLT6yIkFcjkXY1ZT?dJ5P
6<?jqN aGJ\<WB9Wi!m#8%*K&HK#T8=5R6!kcwCjLVJNXM9CbSF5PmKE+*biFq/ybJX^=/#a/HW/@T4%Xij^ey!
mYWy?d w*>\i\VwTJZDdYkepH=BKVq5\KH8*/J6yE%Jalp=<ALJiqtL<+uk?i+QE&+FpEy+qL+>tZKD11#k\I8X
l%l\^D 6uL:T*uT+&t%#?<5VIL9%tp18K8#8QQiLIeI6Qu^VcX>TM^y4T:*Z?CdGu6:&:!Bp66VeJC&^QM5nyQq
E\H<Ka iX8n\\MPR>95Da!eSGE!p>:1LGeZ=:CTFbw!nl5TPVV14:aQ*&>Y1@mJ&N$bQTiVL#<>dLV!eZ*a**ML
-ALPpi 000d641abf6001202b4 Page 203 of binaries2.zip
=kC1:\ XV*I6B?hnty^abRHYmbFqh<dX+tPGk!@4=Md*?Q9**4Q9M!A6QcVTnZ@!EB/+/AP#j%/#>k&/I+i:hM1
<EP8j: @J%$tk:4&Gy:u5nw58E1^SmAt8X>R/R^F6t+!1&MX$R:\W1#14E4Fp>1bE!?tR*\+yNVq!dFX=l@VnlC
^F>P^C LE^$nj4P8Pq:yuH::QmRKJ?yM!GIeuwH<Y&dMb6aiRYTDqANVXT5J+6iN<CVZNwQCq<$jP?8iY6e1RuR
nuwX9b 19$YX6JeSD1\9@:$6*hMp>l*&k+uVt&dT#t@Ib/\u!P1yFJahhE+TGDjdjSq8d4GRG#\l51VjJ59:tp%
kXNF!$ %i>M1SWNdmJPH\auyd/@hVcaWMJC$^el=1%d@+q!Jep4F8q*V&ck!wc/k\Z+nDHtRb:R&G!kHKDwFXN/
G#4wj! NNb8FQWD8*lZ<keE=#Xi#Y@jRnl&Z=1/Vt\DGF<I*9W#n/J\*>lmAhNPP!9yPZ$L>Cp>VPydZijEiX1u
Kkd@tY ?CDpZJLR#6Ci6IFpWS/9i+$P+EqNj8!y=Se+\h&R@CZ^BZF%V:Q>dn?=#Z6S<:KhI>XS/@HC\QRMlhFT
kc!!AX 8aene%EaWFSQh<**B=9FD\utQ%aT@cDy=nbk@laeGb#=/Dt%nQue>5YHNb?:lR?@jR6wA4/wQi56Py8?
i$DE#X wb4>SF:j8GY4L^QS\XIdHIy/HFI+aPNdK/8yi!Ch9X+b:NhZ9=Q>bV>=Ll9bc?RpKA9l5bbZ5pI>^>QQ
PFhW** L%64WKV#D+qXZ8/^!LdR=pVKL!?9F5nuX:bNedq<mHaK&K<WhHmJ#b/aZ:WZ:DeTB@+BMFMFq:K<*/9C
Jb>JJZ bM!XD%wT5WbkkYtCw\i\C!h&Pch&cd4/&#wY8pb&yS8Z>^Jj5HDXMe>9qkp%SNj1:neNM%NAi1tD>yce
mTBi<u 6^l<IIwh1=YEdB/jJHwT4TnA65jA*i>jcFSdAMeb=ajnw:#cXeIV9X$uSZ%VFdBN#9wye*EqAQ?EXEj>
%nVA:@ nV8=#C&j\Tl$Pdc89hqV1jIydJjFc9HQ>t#9:HBLTw+FD*YZdE^^B6ZZyFd&KpcWdNJS8CG+!6/:Y#1+
4wdZ/n ?E=k?/F5RqZWKHqZXiMIMN!*$mHu5LS5j^X5DmjLZ!5Qp*\V\aAC6+Y#t^IBjJJq#H=InAV:LcPA8KXE
9CXyjI SN<P\5e=d/IZe@tPXC9bFBBca!u9+kee^G9HbZY8tiPKI:@5>8\QS4<Cyda#$jGm&d#1\^I=PK&l&WpA
XP1JwI eWYELNZE4kV+4aMHKi</la@nXW<Q4M!9tTp/ckMhA$qmAlyG5p6^Z*<1^:ZL*8lVC9np&JP\cpqFTIq:
nBNH6* EH$T%*IP?ZdHQBa$twbZ4D$=WmlFL=+&bNFVNuAS/ZR^^5aXTV/9@JcW8aA&yQ^4!VnnEjd+MIaT<>:R
T6wReS ahwN/hi#SY&1&AB&l\KtLTu/E14liKFVy:aI&EQ$pV1$5NYd?GQB5ij/%bew=CmGcQJeYMq6S&yeM@uk
bVbP%% !D#G4cb*!6T:Fc<@TGV$D/<q%/B!R4pTVD:^emEHI#B^=QayT>e&Et:T8?LlkaEB8<E5h8E:>1e%I<@R
1$nTl6 YdVj:GS@*?\GEKpuBG$5dyGkn/RDaYlC*EW$%pW$BZ+m#Pu6IRceujIIYTFe<+QNZcW:8+t?PA=/ejZj
jL59^j JyX*C=B<dDhIKqVatHNIeY=#HmWGHI8QEe8Y&wEa+V1MMRye61bM#K6MXuibckVj%44n&N#qNW@BPwa<
qhJ:u> L5%Zk+*CmNIZB1TXZKE5J:+Z15t<^Pt>wq5P^:N!SLMya9I5<u=?i>@%\p^G^S\WaT<bmh6+l*=\PC>!
*&p1w1 VQmN1p=+1d*?#nE%Zbee$q5PXF%=/Lw5KXFdh4!ZNZE+NiAJGm<A5QL\Eip4pXnDJ>HT%ZCaRVelk!SR
hwGZLw lC$$:n&$@+GWK%J=q^JY1!=FJ=*5wIMhjljiVakAQ=PF!<mEXCDY#Hqa8PZW6L?Fm@D5S@C!FGbX8@J!
@e*Eu! %d/LH9GMH8Zd:SN!YQJPCGe=mb/Z<@:IZG+S+5iudCY+1@+Gd9ZP/D%^/h4J4qYD$ljXGH4=jhYnCYTC
V>5#d/ :PqbmN$?!^$Fy4i5G8kmR!:iIcpipV:i/tdP^>Z?>Jue/8G8qipwaG^\?Aa\MtP#SEA6wb&TbiLqF9GM
KljanR SP^M\aDA&MTi8C%IT6@ReW%MiVcq1EWFEBA5VY/^J<T:\Z4DEyWe!VJWelnq@kbAe6A%<R=Wmb$*%JY\
&B=j#= %%i$N/1#>%XB1q6#L$=ut9y#d*ph&@Fw?c6d51Na$VM>Vp#yAiHG5ZNCQHq5Rb!/SiY+bu*!SEX/!#$j
V^tEdw &4bAP^lT+p9c5DC>ZjX+c:GdPLHkbBc%61%6<+B<&LT&*dSwMSb4*%QNww:TwyFSTS^t=TPL*ab:AB>k
C:uj^d $lMXM?uLlwHS\#D\L1pq%E:?w@ApCejEinIY\VE@J/^mimyQp^wdXQ\>k6wLX+MMc/S@TL>5A\6alm#d
PKlhdW FuwV?W1@Pk#LWX59Gj558uc\W98>m$WCP!Qe@a9=y#4qa6>8YZBdNQWMVwhFKdyl?ji&PIcV>a@TM*pW
VB>Rbk Jb<y8*9PQLIGV=R5#Wa?MLteGM%<&bk*D6m!!uctYeHqFmM%CkC#TGcbYyAdF*LkMGVcm54LaChCZ+lC
*@J$Jp ?LVSSc>Y$^H@Y&9@Ean@59aj\Z>FZmu@6jNK@/+I@EuD8EL:Rj\y%?^u!lFC+B4$V@X$H5k%cF:iu>HR
4<>Y&> Z/Jl9$VD4$H#<MN@RmN?mid=Jb4*PnVQ#&m?Z/L=j+t?n1<lBH/mFQJCjwtG@lJ>HX@:@X&/twd@Ew*+
+uL=J! Jjw/99b:?64XNP<9$Z!@SF@H%?D\u$S?iAX?licD@BJ>HX?D<j>pSicD@SIN@!Z/P4+GR$B@R9Q<E5*:
Jkp4dR T@S%jA*/5<k8H@<9$RK@R9Nj^>h?H5Lk9+/#RiE@YbL@WK@#L!&$@$Nb!D>mH4<HKumkX=TFIQm9!D^B
blaneX @B+1?9@9%JNPNHZwTp$k:k*qn:me+jkl6NL%Lm^<t=I/J!Yle:tncSL$#mKn+klTK6DFDahIbVjE5<kL
MGB1&p j/Sj66SIyAeAZec6YDdwlq%dMYMXMZ:4eC<mDSk6y$$p6jEJVcNq$JIi8P<^K#G@1W@pXWXmNd9^=KB6
9CjLG! A6IWu5^lpNm:J1LhuquGMRSAD#WdRhu:PT&nQ1TcpQL:&\cS<wQKWM8N/Gm1qCl$=DAGjD@dklRi/<dG
P*j@Rn FAtlN+IGaV\&JMX*aI<?=JR9Zaly1SK*m5PtDa?@^TBTn*@?^4EX1@GBW4XS<=6qNSlDMG$mDAcAcA@\
+K%!BA kiQ6!BH>%Z$>pQynX?>^u5DWeYKWkyuwLLA+5bEQNGHqNCdL?XL\q6\BQQbdMZ/VGSY&C#K$Z%4/HW$:
weDwZM Cn*XylF&4K\M=XEwZ!IC&8eQpILK6/\FkYywKl!APy@=?abEK*P?AbK/6mNJtZC*Y@ZGLhk*5hZa=l:$
tF1aH5 eiVH$hZET^AQShB::lABaiY9&IIdkPp#1lZqMH:6p/S\WtAinam^GCeRV1A?&ZXdY!ulDDi?L^E4i8C6
+&:iEy 5RT>:QDyWBXL*aqhAb@eGhacyakyewAIdAwc6%Lp:VIE+Q64hFGMuh/&whCapIP>=T$@H%eARuE6CceW
#KK<WF #A6HGkJjTlBP?th5RX<E5lneXD^wM1KYwpW#8<ui*pmkC+&@A/LZW5bK+^d#<ERK9b&^+@TCy^S<+RVY
YZ%jPI 6yu!SR?VjbEbIH@Fa<QL%>whPnAV\AkcHAh8<W$$XZe?Xh\^j*F@6CEVL$mFCFPjWnHlVpQB!u\ZZBG?
QZW:NL L^!VE+^8X5e>+eE\ZB1DCH4Y&Qla&%cl:wYXG9CFY/a@kZW/+u%G\:PpuP\B%eLQ%dRW+Pu&S5He\Cc?
PA5q!= %5a6WwjJ^^4ANbjQNDM!!W<=M$@JQn<pWu#e%nP6?pR+wXGZQPubG%/ll#I?^1jQJRRX:8MI?BqyXLTu
PAQDCK 9iXnRC<ZeTaEn$&==RYM4q!R:V?jeHX5tSd^aNmPi9\wyJ+W>HktPQQV&\W=\CG>$/DXJWSQNGDyebc*
?ipdaY :KI#ZIP$:\/cw/9ejSlXD>Ji/=tmwaLIWan!B1X?^=GZEmn!%69Ra\&CNeh>9PqZ1>wN&SGiZ96l>&<W
8HA:1I 6Pbt!n4JKjNaW9W!YGG/6IEGbayF%SR6M$XXXA/j4N:4n4XKj1peVBR/p@<YuDmV<NA5yL?tatawN=CB
/VDZHZ #&XEbdBB9ZD1by6=JL+X*$9iIt^Dt#qP*K=G<uYp>I%^P6=<<:#uG$bQ=8=b1+kIHEC68DFIe6kn$T9G
5n=REI 5JYQ^bN6+5AX5/MXnLD<KV8$eF94?^JG^SZEEPmD\cSB>m$QZB1%W*AFF1XIundX+wwdIY%@H6jaTN?1
jwPWV9 !kel</aQ^P//bhMSiNEdQEGX!5Y9pt$hDZh=TpXFw?+1dDpFRld#&\EBT^6We<ES#4Z>:1<>5*I?G<b6
hVQemL DR*+Hhhyt/Eqel!4=M@JpVA\^C4CKq*=k\Z^d#1^PJi<%8d?JD?A!#AX9NiDkXbw#Wjp^?wX5&Q$MqEY
#tbHe* bd#dp/l5\TTQR6nSD1V4^Nw*N/W+Zc=!*Mam<S1D>I>5V>w1y565QJF\lVq&BBY:Eh@^L9J<!#Gpcl=>
TMXP\/ a$MkL>d=hm4%M!T/wlt&kA4F&<TK5GL?JhV!$lFyEH=&DB1$XWaXu<4G@iF/n44p6Acu@$BqA5*<#Z^#
j#y6$* dmVnN!YY<hCS\5PD#\#A&:F?DaSNhM@Bh/h\uZb9<NXdKaqdW&8p%^1uVlcRJyqNPBZH\hwk/^>q/W^m
6c6Y8c A$EHHRPtit4niPXy=TynPqV=te5*EqKK$jnG?yJE5%hGnde5/NZ%bI>a9LIDcT9i>Zm?RnMMq<ViEFdp
b^bjZk i/EENPb$5LY8l9Zl&1#ec5*SKapMp#+VVh\QRAM1t@ENlA#b5qyDGaa!E^NK/*nb%?dLme#dlyknCW^P
nbeyLu i5D&TEm/XdAV!bM:9JCFSiln<VwL18MZ$&^LLVllwHXeE!iawuYn#Pe:HQQlWil65E/=n%+j:ZN+p1NY
mleHeQ l\yLd!*PD\MVp5du6c\^NM:hM$C5*+*!q%j#M#Ci::E^6iKERS<1WAXELE1@/!j^Q<B%eC<#tG*Y+y%<
qdTu#E N&<cieMqeCp$aQGn&uG?*QiljNd1T1dJGd@Q+KZ=@4/9pd5lJc\%uu4VRT&dn^jWBn>VI=l@+GRPEly<
/F9hmF >GBT4%?/<Bjdc%C4=%ppIyPdq9>iKJ?dVt^^u*indkJY6NWj#!FN^pW6wR$P\FqJi1=eTb\Ry\w4JnX@
#CJ\*E l5<tP1\TY^u@eK8K!jaw:dWnyhp5FbM6:hhTjpml>NaC$/5qBnpk#!4hji19TDa!YkD/HI^bRe!J\a4G
1BApAL ddCYb8Td:H/uL%cmZ\:^qL^SmQN9+=ua65HY:DDRu5$ujYR+4Iuu6%46aRk<NH>C>WJ&/YmQL&TnCE?=
h8AmCq :EH5P*BT@F8#Ai6$dt6M@It/i16:e#b:GiZ+u+EJ\w>&>Y/@t4yEC=i#yE8Vn=/dIq=@>JmRjW>CIQtE
RI5Y:b j9a6%YeXt6dF?*PKa#nAq#aM4F>D%$>yhG@ADX+</eZQidYDSTE\n9wcXeMNj?VEJkq5QN!lypLBc*45
&kn$VX &/^q#:S5>>Hp\5Su6BjqZ4W\HALQDja@THI+658F+GN@!b/ZhNqyKS$DVjiZRS>n&NNkpceLNtKe$wmR
$\IMt1 P\4y8<^\ER5W/Se&5#t8HcdR*u148Njy=\k&H4q%eqQnYX&\=wlEy/AWp=bCTThPG=Mq<9=Ch><?X:%e
:ZL+9Z 5buk^//6bPJQaX8Xt$P$Ti#N=G?IB#<MQyjS@c^wlcP<k@SuSh%H*jH1d9^6m:4NCBR^NLdZ#=>NGj\K
%p1bS% GduXECQZqFEP?h!MV$qJ@jG$QpXwZ%</QCF*cMn?p9\bZ6ba+l1#Iuic%JJ?@aF\/auB>wM&Pa=XVk%#
-AbQ$# 0008daba3fd001202b4 Page 204 of binaries2.zip
H>yjJK HT!56D8ayue1lC#it4\#@&F<:$t?YWl</*iN+whS&w6e9lQ4L6tEF:p>LeF!wYGD%MD5I*Vp569Y&Be<
Rl><>V yqY<++tl+$a=K!ScKGn=wHujY/\wElYiY^*ya4nXFIW&AN=VZnQc&\<mj/X$tam>lIZYBT::>Jp\hVEW
jYLBkP CPjRLIERwt*JB4LeTT^&/K%W^CLTDaRa6Y/L=uE6BVnJjnHj?1!W*6jhwcJRt=m>%GG?ZFLpeqp<K^TD
qpeY?c ZYm%NnLk<GdhH9>nSp4*<6H/RTcncJKn+Ke\au>FKmBpA>VBkI4ND^+SlJbj/qec#8cV/!KdANmj^5yu
*uMu94 NBtRG%9i9>>E#M^dR*C?1KSEAFkG59tWw+I8T<8ATtN#G>1Lbtnq#Bqu+lRi/@FB+aIQcWdK=cl/Fd\I
<BN@1F 1+5Z\^Db\C^Q*NVWMtp5@JHc@kqiAL?W#LIdPFpNidB$bDLqXEAc>k*NVkchdTp5tPI%455G1uSn%ET8
p/@H\X P@ik&8\Si:!Km56F$FciNRlhe8qXVNB=6hXVy@9WuIkqm/BAKHW/EaMilIZBbAZd#?cIHwdLNKMawV&a
SlhcB6 D@P^+5b5//8^qQSlLK*H>t6qkLXmB:&T#1FF=bGHG5Ilj1&!k6dIV4JqbIR5\t$nG&56q^i5du8pYS@Y
#X=6Ib VndETSMmYk^ki4aHbim/<*LW+iH8X<18!BktIG8p6Kp+6c%X4Dn?&^8B4m^=Hnymn%qEEbthhtDWZXa@
/kMlTp @VC@iGBjKwk^XNXF*5%Wj$AC<Y#XqpCl6XM%XS#1#4I61!+Pi:a#\X9Fydd&m6Y5%XGc\VF:uWPFpy4J
9%uXDe bQpw1=<Ndhb!nKj!%l*q$E@YK%t&%C6TT:b?1myHLk1d::HniMBw!l9da/@^btah:qIW6TV6J*J!ypb>
iQ#*jt ^GeB:yWF51XatQYDCpeQ=^WlT@ZXc+/&<!6K6cHRyl#qDb/inHE=RT8GB*iKyEmG$$m=y<y51?$?p5PX
pETu89 %6LaW>>bqL+4ZFuAmX!R=cm9qq#a=R1Qph@CCqwe1Y&4YK5h>>qGM#t^Q>:dQ%ja@<dPFd>M::*5$Pi6
SI>uV^ ikq#IEcC!VP4Q<K4t6=>4H+d=Rl^+G1^QnTZ%F/%MNR:iEAFFu&NF<#AQ54IJj%JWWF\j/mZ8+y4!%/W
Iy:5Vj KZHhampN4c8%&GVDii$^5<9G*u*KGt:8/p1L!ER+HMlZIRnjCV49jR#FYwW1JXAZtTlGW&GSY5\GL:<^
d&GQ!4 Z@6/\8VdQ=N//18t\QTl1KiLPjhbHiIymaAW%p&wP9PD:cZ^SC!d+6TnQPEut^kBw\HPB&QXVC/K$R#:
q5cN*+ <VQ:@R!Gcucj*JwGw*GuS?/D=NG!$SbR<b1iy:Jy4KGijcG1F1iYE8pHi\/1DmiTw>/l+E6hwucE8TT4
&S#ZLM emELIVm/Gp6+Q:ie^FBY*R>A4@4S!yw4JFWu&#A\Q%9E5WyD98mB1%WepVQGtN8YyI?cKuE>\%b9MXG:
lnplS: 1=G8+4tn+%MNX!=FPp$%6hDL@a^9+1ic!1WyWiWh$:+Pb\GhR\k^q4F/AJPajT=K1b&/ZGlN5SiN=CZl
^BEaES blFQ=KF?\YiIt^%Q9DC\RhFKjYLFdXQl%KGc6aP9ktJ\4jFD$jpMay6bkb%\?ltQc?Jij^5\i^pX%c\5
b5LMjC Lhk^:BFK+KSVn!%<mn>@+/5I:AhQ\TCtHWLX\jDAlWHE1AjF+4Adwb*IE5aamVVWeHA591eqlVTe>pGh
>Y44u+ BhkAYhX4ZjYXZjSXjWdD$aB6E!G4>y\l5t1BhtBbweV5dXYPFZWTieDRS^+EtSJbJ5@wdX/\FkuZJ#Dc
&ia5Z^ PD<wNGDVITMi15a=u+&jNTPdMiYKNYYiD@SdWpAp>1!9!+CmduBKkpk%RNlnZatb6wBu^n\#AQIt5FL+
>HVb#W c#!SB$WZuk**bdHRaj$k:a<A@t:>d+qEu=*q*>*E4%nihHLNDhn\5R^P%#ym5@MA<Kl?p=kbX8l:iTQy
mnT91= +yML^96>#!^G8kE$ZceVAMH+QR\*ZHN8X^C&/nQ/&<L4yF1N>/m#=+H5u%VNikFFDyWl+eZlZdlGAjlw
5Q+1!L lXlw1ZnLKD^:Q%DQcVZ$>j/b1X6Jqa&j5ceauCqWWY9n4bn%$pQH@N:XB^\!DKy85W>^HL$5QXZYQ$9Y
+RjBFW MqyL8jy1aR$WBb9*T5tetXL&j=Gwy$CTp#A&NtWZTdp!y*=l+6lEBW8H<1wcnSICd%nHABCl1>cj<8#m
\BjEcB HG&t9Y+YIGyAqQC!=M^CPmhwkh:E*S6?P#>Ptm$6CN$&VCZYq16lR$P4ARNmXm/ikbITXQDqh/GPdR#b
P:T*%C Kl^mD%^8mPk\G8la8@8+?MdeHBbIPic4CI^+lQ8ljmADn@Bl<GhHu4:u%VQIG@pDKq8=nE^cji%+p>/l
\m!+E+ ^/u%>Shy&P?=pTwt6mWaNSq\GlTK/:SnIAc4qDK1!1@>Sw!KY6c:YDDa\R$L&$GMyht4YHBN+h#p4bT?
a$MZ\Z *VGeh?E%&kbw\w+Z6@*tSluL^4G4m>X&nRbL5hXV>8ZPF%99?ySjDw?=%8>BC\q+RwwMAFR/tFcPc*jD
DDG8Bh S9d+GddWNnlVR=1PR\ZF?hPpRiH?A=^5d4^T$HChL$>n4JpESDt+<:*LXtRFA:Dy5V!lGKl:uetHpC=/
+^::I< DBhl4%pIql6DS!8>u+&=pe81tb>Ady=q=PWDMSl8IRM9J4>SBJdni6&#wMQ:tFtchML1JkIbGAl8uS=Y
+YukEA $VebK*$CZ8<#P=ARNDNpkbFW<\/Z\CF?IJbA\N9uFwVQ<>F\nVw==uF=Bqt#X=Q9a/RK4PE#I/$klA9$
w+R<kh 4mP5hA+J81\bHS&$k6A<d=:MAmB:m*8?\IG!46^#5T&>heD#L8&u?<lP6SFF&S&QapGFFnNlZXI&&V4p
e?wD/H C4@=jABD\LK$!e9eqyB!4\$p$4d<bITij4R<5It#+?wwG9@@lywW@9?!JwZuH?t#@\!h<j##tyd@KZV&
V%RWNR h+*1V?4ZFbIn@:YLTjn=4pH@NQDG#*<N?1jlK*/BZ/EFIL>ER/>DR*>THmAA?!Wc@p5$+lw$D?>QbH$B
tJnmJT uq?miZ?J9w/9<j\5ICHA@$8$\C@RQJD4?B4mJ\EJHkn$q&naL>HZ<VZEV\ITQBDEL>E<9$Sj^>jkQ!t^
LjLSIm ++H\@SLN@$9$hZ\ND4</bMkDlj\TDj$q?n1?>6M\Dk@$V=Ww@D#@e!DtH>$p@lKI8iLPEb=@4V#>S!AG
wB@S/I <u@S^ja8@$>jdK>Bhd?TYkp:<Bticnd?=:EYu=$m$ew1FGFyC?DB#8BInd<eT*E*X*85CTqwV+$AJ%Ji
+$^=DA ibc$jVjWwbFLVu5e6/w5i$pRSP>KCk@CCMTw4#AJlA#VktSFT*1pKa#mZ%bALC=i:/RHnLPnl@8!IY*c
e/=Jtb nG/X!>GwAFAmdewIMRI@bCNKijaDT&Ri^WR@Nny!1J:#iNceK#KQB6p9bq1<AY9QTXWt\wM6K>MB&M<Q
&SeDLD ZkA\ehY+BtIZSwd1HN8R>e*?&bc$wiG%NdV6BB\KVB*Ewh5RlXWCEtqkAk5TKpeQuEbAZjbGZui/p4/W
eYqVT* cZL%iakM>%hQ8m?dI<=F*8q1<$EPy8y$VAVM/^dluIqhX?\Z&dWZ=+8c9t$1$#:lW@PkB$%D6+whlm!S
JR+Mh& :E\KZ?Ycebyj%a=$F*$Qi\9*jP9acVwE1RCk8&8tFbc<HB6>WT46!5AcStPVwRKl1/dTuYt4A$LH@HcI
/DjByC kHd^T=CwhmFI\#VJtdQ&WCe8pt*a!i/88bl4bK@ATJ$99jTW%lPAKQjW@T<&DPH4yFZ6E@IpRpGal1Vh
#$NKuq E&RLni&DW>pm#nyn\\M9AiYiA$TY64qjw8cw?Kj1baa+cRT&!IN%6B:kZ\cu&QJYt6X&jInMNPJK1:dq
*DQ9BE $*Q%jeT5p$VWYh$@P?$A$*IH^MHuZGQH<@diTam+a<Q89$9k<R<5><eYeY*yNZ@$!dm1*=Q8dT/&1@5n
QRnmdG PiA#dYW?CawZ5JidVbh9@Ll8^R:\&VhwTJP1jWn1#iW<CXwZ^AF/c6e4hV+%=y8<F@Blc85LLDBSiW1m
#mbpip lQ:+68LuXnFVK#ZR1Pd6\KDt&1e<I%lEWTb<un!Sd+^PDBcKZ/\>epj*FP49eFiq9<RZJZ?SW&&$:%#N
Y<b$tR lh+uE??YA^\\Dcw6Th5y<eP*hu*^milYb?qN$?%WQnyiu<NE!4jt*JT>tJnac$Tq<^DFpw@M/u\atC+Y
S*GyVt D45qd!FtXGc#!!^?%aqCHW:K%eR8MYLGtTie^FaKMRKCuPKy#jtlDEu/NyJG4C^5jA*Iab&YLRBSdG?G
k&hM6R b&Kc?pT&tcQ%A^Ge$IGA*G@IWmknc$1^*pJiMle!t%<\&jiA?LEW$F=G6$SKjwepRbPYRCG6hd$%c>B$
%ejVD8 Xap&M/>Sww=EL9/Yj+$5+u=TAkp64E6DKVPlua+HRMS1a^8e=Nw^MRcT9/j5c6:*A8ZF9:^tG8!$:FiI
%nt1?j mi6Q4tMmlnSQyPuNjw691Ccq+NSH!y4m<Wu%/>%p$Hbi4:uaHb$t+=m+VKMeenu/P>VEunWANHFim?&<
dGy&RE N5++meQ?F4hlYw19k!uDljeXyD<V?&MCXde9H6/u$CA&+ZiNCy/Y=W%h1$@9@JVYudR8Fb4aE4FV1mjT
61!w?q BP&lTB=i=ZA&5^c^^<B:eRe#\#6X+jdWpNqT!#PlMA%8GA^HG+bcQQZ%n5e\E!FJw*>jKwKWabP64M<E
Su&*># 1iP6G!yX5L%?C<^ipLFJIIES!BdFCC&E^#/%qlH8Ec>PVpl+L<</\FJG=p<VH//qmm6Q!1Mlwy#n:cJZ
D:ECbX 95I&Q1Mm#TlPFlE=LJi@SwiTVkVb%LA?bJ^F1!t%TT\k/KAY#4N/bd!NKSDNA@l6#ea*H:b\A%<<\q:8
t<VDQp =N&k&<:G6*pkJ@MibuZPG+<HiJI9WS!>+B@tdlWAa8+phh:L9cYBi@CEe@t\Gn*N$hw>u*^8aMc!u^&F
M%*1Wn #WDe%T+i1JBh>qq*t+YYn/Wau/VbX5EDIQ*YC&QLh6LE%V4hj>R1^uE\dB/Aj?GDwulnVZLtY$$TTwTD
VS4Mbp %uFej9?P!A^ddNNZm/HPJ%=tKnp5VHLSP^>Jjc9mqwqESh>nwGM<\4c/n^J<ymTd$/>bWKTdpnIBA:Ft
NwZ\pH /wnIJYeY>q%pqIt#1y^=!eA*qVA\:&QJ9LWwY^\C*EPQh<kaC?J4ZhuC^YS<G/iYV64VmJIn\*LTaDGa
9^$J#: +C1J44eVJ*qb4h5#WH><P^CW#it8eF?\u8&l*BM%Lp:Tl9j81:=c?WKG!@=hkVIyt9cQ>WPXXq+!d/##
#dkH/H Q/6@#d@n%%E\=%N$K=p$dqcZp?WF:X*GZL58N%/>X>%>=hJJd%KtBK%M#nAnZd!@eXVy<?NwD#589hy:
wetRjK yM1tB>?=>bn#M88=X+uFCyQ\wbtb&<Anu%1W$*9:TX/6d6wEeP9yi$:aF59kBhRpnj/8>VybYYJR8l1u
^PbH^! *iCn=Da6A?eC5^ACi?=meA\\i6Fw#Q/?jYj>q4wYieAty??8%l&Vl94^NY9^E@9A<91*LtR9LY:d$\X!
kZAeF# +qt51>*wnTwwWn9l>c=djNbd+WXtA/NACiI%Y&p<1/%J$wq\bBSRZlbJ=/H#mw*A\X!kYZ#8YMj$l1\b
$l5XwP R=^Aq1CCALwp>#*nRZLA61:kI&Md9#BI6&hFaHJkJ>ilaAkL&mi/?wEI16h1nlLQ@B%n:mk1aMdpSuVt
*YSkX9 JBaT!&4?ePde$l8$>HHn1LJ8Tk:+Qmak?kyMji#^AH?mVp@?:T6mNnR#q1P+My8VEN5=B4M^^*/ZwPGB
nuG=j^ lEDd<4Eq!8QZ81%1ceQ55G*mTMZPySc/Mlh&<yu\ySH\F8<4<mVWKJW\4c4hWaVi>$?l&R5j8qyT8=P#
nc<YQ+ Im^m&>%/YW^EZNNY<+?1LdV^pd^t9F/quQJ=@hpji6#Vdh:!ba$RRGmX=b#GKB:b5Ya<Ie>b+A\WNn@I
-AIBdT 000737893b1001202b4 Page 205 of binaries2.zip
:PIeyE !lnaX<VAib%8&9u/$d6M91NC9t\?nddALD1:dcC^S>&A:K5HPHX!u?IPLW=S\Y\hdKiN\l<DQb*A/P99
<pb:>< Bp8^^#@iHG:<ab$ymH5YWQGT@1mj9ZIGN#E5K>=*nCNyi9C89Zwt#y#/ZWimi!<Rb>8qjd$Vlyc#d$KY
w5QtNj Cyt/Dlk9yPu5ckd1pX8lMNG6:Gmc%>^tK\Z^CpFWuJd%ZBZLZ=lcyyYy+:qY>Al:56wY4Jq=JRl<G#hC
VlNKW< \@IQ8QPak98M6uaD8KKS*\6Q5$bu!1SwNuKZN>dYH8P+yRa5dWkF%JwQqKD<q9FI9&>l@RChd^>k>S*k
K6l\%p :6m5:I^Wn!KXeTHb/qYy=/\LH*6P^:5q5Lq+L\Jt\@1!#=!E%<\TkdaP@5#IM<hqADa%y%!&\pid4<!K
Xw%ZX$ ?+RR>t*J@aE6AF4/J?uDBatieS#NGAZSS>aL*:6t*Jpp9Xjw*nu/9S?eJYRlGtL*qSA@^Chcc8lyRM@H
R\eR/b nuCm5VDKDt::@:D*%&F6hi9cN+\qYBICBKe6^X%D$LdBHaJ:m:6:kdc+8=Xm^h*h&8L8X4!+Y=GY?498
a!4mFF b?>::dZYVjj8*u&?=*8Q=*n@C\j<=l^#bDBuey*nP5?l=@T<DFGpALT?Jc+5!$ly9#%D\MccAR9MeHT%
XiECmp cWhW:CD:XbY5G9Teb?*w81>TVqXHu5iTqNHQnud9JSDlYWZpiX!6PJRDpLKR/*$6%<WA#Fe$NW<X&$%^
Vc*5Wk ZhQd#d*pMd6DF6Mi*He\^Xk>^C&>H1PwWKW<915Xn:>YZeu5#4lc=hTnPIupYM9?W4Yu^ZN66J9Bqh<G
DFVTSt q9IaHc!/Lc$L/*8aNKtYFR+4&*yHJ4+l6q>\!$pD*Fi<qH?H15Ce<m^K6@e8LwQJaS+niG*ASnKVLFkh
L/AMl1 VX:4ndlcnaVdt&E6dCk5tV*@WCqnjemniD8w4qkn/+CFBe<:k^ttWI:TatVWqm#$R^9#mYmNh+!JPFp>
u+BT%l BFRHM4m%:=^9dYhBLL<Ya$81lREXP*dbwG4SlCcJ+$?QK%LYLi4:TtWHZGAAGmhil^\t>wTD1FSuqBl/
d!SGnH LFLXlSeABNIy4B16>YultJIj!u4\91M<4#%V6kK\JXQ6yV^*WJ/ePtT4\duwc$IjbhVHZ#aL%Rp:XhaA
kZetuQ B?T!4IBX$6^/PjnNCm*&94E^IBX4MBwWhFc=Y*kK<TH&96:Ekl#tH6tJeXweAWFF4h=wjT%:Z>Zb%e^e
d>en>q 4YpWkq:mwH=a\q9i\#l^K^$bAwXmLDtuk&pQG6p4h?p5c$R=B8mnI8L!N*Vai8VNcF6W9I!^:n5MRc%&
yNVGqj SYPHi>#M&/QjZ&4^4Vt?=:tHX:$X<akjP/E&YDI6pQHeCJW+Sb*w^5eEm6PIMHy#lIq8WW@Ql$ITp:L9
4ieLRl amVcC11I4+1ZeuM!5dcdt+nVj=W@FPSp:unPjH?/l*JGpn59Wa:#W9LmW6=&NGM91I4pR4KW<d:DiT?b
LTc18/ 8cmTXT^%=S&Y+hl:^BApVFcjIMW!AZW?qR^RhTRJ=1Cud>WqLPA:+SiybY+Hj=C\?BDee<J#bqN9@61D
mPEt5A %$keKKQ<*m#R:WPkw=dl=DTL?wHe>IubKAN#wwbDH/Tw$G>Vi8JXA#qEuntl\J/FcBe:h=lpJqW@dCI>
S4W:p\ LMdlXD=endJbVWnwIp+l8&h@/KS:<Ku4#9*V?pZbtWa=8RQFCPdHp/>RWB56dFN6!ZPHwpd@RVj%JDJb
FIYyEc 6mc&!>6>QjLe$pteCmQS8b>NeP>L!Nu1DmJDJ5wQ=NeGZV^Rt+i!4m1\nY4k=wE?6Q*DRY/#\6!^?qA5
dHtFNN hPad<kVE&kW1Z>Z9GaphH>8CB>QYEXpRp<qL$hk$*JducLqqNK!a^<BI5/LE+DFlEYG9YpX/>ipi6*kn
wkY!!9 5b1eqBDSELPT<5T4CM/Z??eb:Pw/<Yin<p!1\G4&1pX^TEiQ>SPBjitpElX<9=A9yFmiLCcL+@J1Mc?Q
>*>c6> PEVH?AcXAekiJY<N*KFapmAJS%8Vi1yHp+hG&DR69YKp>9W4@Nn1*ANd?&bX=>>8Bd%Vn:NX+u$Ah6?L
V:nR4M ?6AC5:E&5HF\IhY*@GA$QW5jXLb8XWMV64P%!L9^d5A1lqFWwi/WPKw=uDkdqL&PZTYl/4G*YimdZ!#@
%^/BNV a##Al!AFpL69YD*u5MNl1FL>Nb:d*jJ?M*JZqP?n8Syuw%TNNZ&dGJ#S+9*6#AyC>y4*wBq#5\MYX=YA
FpQ@/n L/^Jl8^I:hMSm^%:M$9+b+HH^Mw#%$*RphGM4\IPZ&M@:+iKCY**%Y<K$*b9$hQaARMR>AGm>HSARHey
#wl&?G c/ASp:nJE&I5Pp!9B?KChB6hV9VP*l$&#nR8F\FbmAAHwZM8ZdMpuCJtF:iuck\BuIMW*8ba4KcTZPJ1
KL9h6+ euqKQllAPkpFu/dZIy5twmaeV:Rujd8/88q<@DF9QTZd89>&D+:q4!DHCEALWi@G+6qahJ#H+P9^jbAL
59?IVE qVH%Hy\u>8G5<5@q<j@aHTAlE^BRFDAwC<!>F/KDaGwY94<y>uSCuM/Jtn&:5P!AY>\SctjlIIpZH&!T
SZK*np >\SV<8E8mZj*Lb@8y$BcL%89AJF=F:lu/YBID/DDl5=EJw48dcSul!kc:Gc#h9=@hwn/Q/IA<Q?#?>N@
mD>ZV# R\Hk@Y6\Jn<9#/<4AEI*KRD<N>lJ<j>=nd>T6SH<QX#wZ+w?j<L@YhHu:^68@%jSl?<GF$S?*y9e?<Sw
lHd5iT NF\e*W*5#F&6HB*@>NV<B?i=9@1t@IyB?%?M#^EI@y6GhEP?+l>Yh@@jh8Dj&\/M!!bM$akiGEAXal!G
EFR@?D &kBWRqF4mE11kHp5hFpLekAtHDni/J?KGlP4#p:n:4D*/+QmHu8lYJw4SSK&5&??KjD!@y?@KjD?%$pN
jwGjp^ @HD8G&+KjEJ@9Tu\Cj:!ViHj@*u?>pLk^49DDhbq@#dYj>dJd6:a#*?Dhhqj/b?ym@\*YJjheG:Bu=%d
IMVnT^ +Fhw*y@wB#haq@&X@qtdF@<N%tX@yj>w!L1S95G/:K@$H*t6N>M<9$D@4ItE@\d454@TQ:?h*?Bh>6@C
jd1m8p j&Y%@iM>?b>y@6?m@#Wi=E@&Q+!\8IZ?%Rn4:+4D9#&JduAI=9>uY:Pdn99*J^#*j^!Z:^<M69n=d#!8
^D6MkV +A&!l8Dj@5@@N^qlEWbB^PFWMu*m/M$nBpLJGXHXF*DSII*R!IH8iC#&Eu+AtJ:dml>HVQ\=tF/CJ:9b
uMN96Z SmCABF^>Dh&!Fm&hZd8!*pIW$:CTH&=L6I8m^GHJaNR=?^wJj4QE*a/eEX>V4Fm=+p%KDX>L4BhKnHQ:
$::q\= E&M?S6uk:jNY?nw!Ga4?99PcpYdH=G1NVy%=jm<al#<ITD\MSlutF8ni*c+S$%DniI$HMat9#l/8wwBI
A#ku&D aZM<*Y9tZdQ4#d8dua&WiS9qKYQa6#hq6uQeRtheQaQmkWWFa>/QNY4XaFC&>H4<>d+Ch<Bu*$>mjR@K
jDMuCH qJKGD9T5GIkI<Xy$nuVdAEt\8kw&HhnGQYa+Dut>tM9*iGCyqRWFQXjccuiP*RX!?4ZKM8ipPNiFDm6E
@MJB+! AthbKG4W!&EJIlE*JRBc^$\kB&B\V!EAh:96wm4R:i!YG9P!V*mn<6\MV69b9+kHIQDS\1dlKptmMEk<
/lcakM N\wP8B6yB<ZN\?puE$NHb4EEEWIHwHn9hRaEa9aG%GqF^ewG58uY8=L/^qlSJqV=be%I!qD$&wjFha1d
c#PPQL =/Q%/%G<wh*G?St#\Sn=yaeC<SP1lACPGhtqL9DTI!1B^GaWjKnGd*p@GFNRuVkIp%?M5!@l$IGmWZtp
E*h:Xn HAwJ>DWItuKue66DpKTPK9h5im&^cJ%Wy&*%hiPwp+NeKqBMR?KbKb5muA*IieGKXHQh1L8AhBZNG4<8
XGbWu^ wTY%l54=yT9p8lEA$/9Z1XW#PIS$q5SRT4/=8*nZB$A!1/Di*A%ij##Q<eVabakekZHW*EBq6Bk4mBX!
XYZqHC ^uaeAN%Y/5y@VkhjD?ED\=pX9pmDub<<aDGidHm5GIVy+$\8YSF5BAYq1B5VD*Hi/k%HjPlAmR1Am@6b
5wI?Cq AVtb^8cT%^:S#^wJR:#uk!BRe*L#MW+V<ntK5WIa=FQDQht*qD+SyDbCZ1khBGR8NNDC?%J=wVpH&AN:
cEmB>4 /MDA8NZ#wX&F<tH1R\eaBKIR&dG:6HQBwq6JFhqp#Mq==ZG$wGTcCcCmmR+W4HeNkiFBFM6JBTlT?=?:
+ZP@JW yFhlh\4+bBYRP%Den&T#cVyb5FH!R^YV!QpH15jB%<9ptGJcl8SWwkNXkq%BFXp%R%jEaIEF?dHAe1l4
BN6ym* JbZNq6jVa4QF+Fu</FH%1aKShc?u:9TCECKCk5R&QiB*KQkBk!ZJ>Wte*mF+hnNy*@db6F5F>WZea:8J
=l8aPH 4jRm&dM=/&FnlSH!VA99:*iKceDRY&#a:uJw6@WqHeb:Yi9+uN!j/%$H?GZ#WF=EWGG!k:!huB?&TVMj
@\k1*a b*bVA:E?MhYSWZ6wH!KpP/5S&EpGG<tS\$HG%TK554j^:lk<eJlII5*Rw4YDeKPERINnpupSJNGQG<J&
GQnVmJ *m5kwhM+W%DE+%Q*q=layjcGtQh>B^bWZ=HnPd<5+@T#YN5IphZFkMnNQWK=D::YkV8dJqRHnN!#peVK
hXjCwI k&dn4eb!myPY<:unyR5//P&m\bAyJ@u=\6Xl:*W4YcYRH9qD/9LXLdS6um:kajR9eQ4+iL<<ZS\Nu5c\
b5Ny?T GqZWLW9b/L#FBK%hW6y&lLhHW8T\wP!mZkihVZjK5lmm9JE9IKRKbyJtmEjk9lluGlKCuqNm/qJi*Nbl
DqKk#d qMXke$i?eD>ZkhmlqN!IYijwp#t%bn19GMcn=^cDilZccl&p$>PThaT5Za<@8/Z:a1pQXbVS/YcKFRtu
NheF\N 9aA#IlyiTJib8Gl1#=C9KmaH<=H$lCcyeAcF58^RLiM^=XY@cC6J+^i:HXC6Mb+pXEMYRn$XcY!EQ^4+
>K&h+L cwFbP5YJPeYTNEStAK&TmYW^l&>EGJZmN:e*VT^dy=NRWi*Tb:F$C*W&RH=*qu^E1bVQ5nT*ZLa@^bFR
q/1W>4 FCS=@JleqNETjVda$I>R#iYN8c4\#NCRIZl6p\Q+9V:N8m@B%mJeX89+X8t^abtNVV^9^Ani:RNEa4l=
@HnPFe wtD!QXHdAm?F$pL&hkZkJ!yd^uKT%njW?kJGl#VMwZGjldtjl>J$SmA15Cp4b@MLLBn8EmRNEXHWZEEH
@FS!e: nHPnMw>X4j8t/?$tA<1MDyXV8:*$Hb>@T\V9JY6\LMpVpuWN=a\8:qMd:eS!!uM@hD6d9IiLVHWRd/>S
y@Atqw eGM^>N8lGnQJEGHnVVAM!jNkMX^<bTq9tyFi/G^K^+jL@&FL45>kJTq<Vlm\?yt1\j4bWuSB/%w?SaEF
y5Jdj# >jpb>ZB>GVPFeym@K+ZI5Gc6#eqMtVuIa18pee>ac8mA\L8+&q+BpwhHb>aptq^1>9k!N/Ru1PDbYH&k
>4qCtw Qw&j!FTEmZ5yjy\&PBhaui#M^B\mLn^<<t^VW+tEteRW\ARVByKJKZZudZTu/4cbjlIl%4a@NaJX5KuL
ubN!&& w<8:IBTTnQ\RGd*56>C^GGV5=Qm:9qnaa64V9SBK=C94QW\$*iEBZ<<F>WuW/#BS=>wLbSb9d:MEETWh
ET@huX =/m&9N+bIu=iP*W<*p<qlBFlWH:MV9yCCJmpjFqScLc^ptuSV#1w8=HK6E4^51<9b%FQ>d:hWdIYCl?8
1Z9myS *n+8yhakbWRPeSQS6&R>48jXh\$FqiHHS&thKD:&yL%ibMd$1i:6Yy^^lc!/Y%*HVBk*6?:cM<CMchNY
t1SR=E b6<$ylDN//deam:hcMGJ>#PM*4\*Ypu+XmV/8ePV&^/BV*ZqG@BPVu%IQ%bY6LtQE%mP^c%Tj$V9A%<?
e*be=d Hp9QD4p+8?V&=FiByyW4&VB6t%hXY!*&$=e9RlyC5?#j6:qajT+u\emXcmSI4W/dh:HdVu<SC&pR6jqm
-AwkF> 0002775df57001202b4 Page 206 of binaries2.zip
t5?L<e ^@TT*tGuQ$Xl8M*<6Hat<AtG&@^S\WQn:WBFD>:&<luqGA6=6u1EA>P/QtGtnR=N&q4HlqJ?cqa$=%BQ
LFbauY Zjm*LeyRYa$=w*=wR1BbGuFER@&Q6$T8m6TbZS/1DbSDu??kN9iQC^*F4<jR^=6StWyhC+59HFPWL<d6
dtM8CP VcWdmLTtJAj>9P/=pP\+\E@uF%Raw#*TewEXud8&J5/ekCdC?^%9:*ZVu*B^mPYqJDyE5jA4Qi^X%?tT
HSBi#1 ::GIeEmBb=E9Z61=RkbIP!#19<:#LByQ^/&?5a9eBRhij:KY$lHw5Tj8VJ<iTBe=1K%#t=+JXJ6@\LVD
e!aaJM Xyiuh*Xu>l5&yj9#V%\&bqW/R8MQ>u@+#EVkbQtY!h95w*ZGdQk+ikmcq86Kik6kqRMGBh@aZKCFjQ$B
C!JnHH HBI$H*q<ttX*p9A666q>YBN>jQE6#cw#k^QIakLwcQJN\YSV\R1ICV1tS<D6W^8\qPXDMt4#9McM>L4p
eStNLj RG9&5EKbD+q^Hp@:k5KGYeHMEa+5eeI>i4+^cJeYJ69e@5BBVkFWlGZJe#!uT1?+:BkCcd>nTM&aAk+$
1!ZLjJ 4WnyEF6?L?+W=+4l>q9PakHWABKdG6^un+?*F#4SAyKCT\?RI/yQ/meYHTccG!c<1%Dn+In&mjeat&!Y
?FquNH RJ9!uuGpwGu>V6F=k\N!?%AZq^pqL+P5WbCQP%c&alP<G#jqYGc$nT>b9cWqXa%NHAq<C9G#^*V=FKQe
Mi:DI/ mLeqYJ!K1I\RXntLm5Kb^DV/HJaNbkp\S?4XF8H5d:ZY&WJCJ/$EXCY>au^Va8KG<IFQ?n<Elwb5K&l%
E>i6@n u8uNd?NhX<+5^DP?DDVy1>JV\8DNKw?y4:4>ph*t:enqQNQc!+MEEBhu%yD\$6=%5d*JFLJ9iFD\W8d=
NyW1kJ 4j:CLpi$6?#Lac#!$kPyHVFHJpwtBWTMp1immhEmh<9Z4ubmciLZ*64V>>ZCe+D$H=Ra/Ecj9uYt:kGK
hmZjtL APp?<AhyR=!8\SQQeebV6hGt<cY?EMwXB??ZA!YWtTXyT?qRQdJtVi!KiLkBpSIQlRemW5Ppu#MNyhnl
\*#nNa SJ1jQbY/H+YhFDnkF&Rtd&56GKGekIe#=\&!J#iNT5CSac8$</&^55T=qua8>ZL^bNu:4B@/puWT:bLb
cy#CeK cV9ti$ha/56J=1j>lXGk8chF9h^Ve@FYdmj5PGdF&YH:+1hl%$EYNw<QbV@&5beMbY?/^EpaPdNI/IAP
&cVSlL kiBldQLVE&q</R1d%$cRXp%<TIQqGtk@HqRW!1>1Wu&\GLNnTiF/F+8=lM^Y56w<bDmW%G#M4^\q?QVa
9h&h1l Hjli%4iuha@a4<HY/LHW1GC<D!tdBDXRT<6b&LFMkuZC1/XRMVSeEBRJ*P>Vhw@+9FQ#iliTPn>qAJiR
EKJ^u# VbaY>6\tl&T9BSIHhTt&%8aZS<46ppa?qe@*TPXA6wat%ekSQNmMC8k&!ckcF>8Za8p^FqNPS18B1Bh8
qH8AW: cDkNR!<=Hk^TIQG<P5?&Z8:K9tN1S^^@a\nYMMK!11+a!&SV^iVhlq=mT%nQapudcRFiC?c:IBmR%t!6
IIT:1< ILnw>ImZH>^Dqq*+CHV@/Q&AlKujRlTb:ClN6n*cyN%%dSVKA/R^/=1RPcXVZ=ChEJ#@Bk\>4yKiP=4:
JlSF!X EQ=hRepnl!pyB5\:X?^Qb*:&RRqSXA^55RH=lZ^?Q?ySABckGhKw1tQZJuAb$cnYAmQ/a$HFBDIMhenN
p^BQwn dl&h*XAc<WpF%cuayLny*hVC+#61iC=aIJ8Q9DkjqB#M14Ee^ltdky$YyTqnp>w$K8/y!p%N8/lqnhLd
eKCCA9 ^XB@pB+1%L#D\VLlMPJ#l+CRL9!w%^$^bP@&k6:F/i4?a*j^1q4iC\+#idC1QNRA#t$M=?><wKka+Cn6
^H/E4B qJAJ9VARRVunF\XN4K$RlK+V:KLXXu@CcZmHZ!C>yWTGWywGZ%$RXyhLG!*R%&W!?THBeb@\*<QiVI\E
kHHuB1 uuXM8m<bE^Y9JRquD$\N%Ke+Zm$>SH*Cn!hlml5LWMZE9%J>1GS@V+GN5PEX6c\qhZLH5WZ#NJjh\Muu
=C/mV% TZ5dl<tNJDN%bR8$>$j4&taF1JncW*uWlM$VyX=uDN\yX$Z@P$h:XS>CLc@\4Ya$/cPhhe*QB9qyM>t9
Z>td%$ m^1hnIlW>WAJk@!Ta:^KP8@h5pjyP<*8/M\<65db9S<d\kC%Xh=B6>kj6XQVbXBD!==mj*pR16S4MX%K
?ZY\J> 4I1jwPXYPa1ZMD^LSZ*XhE9SIY9EDTHQ4aauy#9P4\h/KELZwMRG^TISqn\Z:E?^y9H4t1+myqR>RZCa
4Sl^T* aJFIu6mFCZewm*BZ##Z8A#/aP*5!1M@cKmT:DXj8&pQF=:pkSZM&*l/Zc!t4Nl^/++newRlXd!^q:HMh
84c%F^ %bpFP!=V!:qbjdhDVYLPWa@&18^X<Kqiq8*aIQ<LVD1VE$h6tRSCEAu#yL%iCe9WCaA&Dm^C8:P9N9HR
m1#k/5 $#GEJe+teeAymju:l8!%hK^P>Hu%5@NQQGE6ZL!Nj9VT<T\a&Weh*8G=YpTnQH6LHN\l<aPe$VF6h@uJ
6MJnFW @jlkTX/Wn=kPPXQ%\5:4jewajat#jc&J\MS*PCaX+%KNa8QWF1j^pyln\qpaQ!9Pkc=y\!=8B!D$R8kF
n?jL/# +NF8j9QMwKqmk+GPYbc$F#mH6!@\A@jbw<l9l%$@+L#IAA>V?$?hcVLLBLAI^61*CE&qlVEaM=%$HVpM
VP=Db= ZT6a?Vj$\QhX%RFWatDaWunK/tE%bQVw6c%jS*tX5$J%P?@ZSaiE^cKM\&EY9hnY^TQ!ZM<twSFChMbN
N$<MX> I5iQCdkt:ayBkmZARb6ucBXnX!e+L>#lqt=?4?$j^b6GbSVGmLBmGMqiu^ei&+PZP<w?/&e9ktltQj49
WTdCTq TuD!qwS\qq!jdbc$b=B@i\d&MB\:hJK*KJ\EC4?>/$\+y$Rnh4j?WDu1LY*Jn&hSNqQc^aJD$X!kX*c+
$Mw\q% Jt>Ja=L5dJX4?W#Rh8>Y*S/k:/KnMd#qiN98?Wc+XQuL!<>GIJ9lIhReN+cF^%eV=L/GC8Zae=eF<k?i
ICF+/> $4^!X&k6Lc\LFa*hwT*iq\AeeEP<kF/#@dk*IXwL8H+^6L*dD5@klZ41=VEP@9K5E^ucGG#&\E:LEw/w
+nGRd* yG*9LX\Cwm*yGdV*hMhF6<XZ?!&@*W/Y^8l%4M*QX\b=c=e+*M:pyH5&&=?dS:8RFClbVcSRlCGNHXCd
6Mj5NF QT!HEPCe8<mHm!Q!WyMw$N4^Y\<4^1WbQ+KF6PMw>=#Rluah9@8&9yFADu$aj!>qD4iBZMl&&+AG618P
PMwNkT l5!YeF/G+EM9paiucV=u@uIqkmp\Ib^nK$EJY:F18Vk5iT$4ep8LCADcY>pmM$V=T*chhHt%iA8PF#tq
khDCRh Zeb!P^@pmWD<n?>/jnD4jWRa@%EuCyRy+t:=EjL!bN&K<hn&M>mG\QT=e6nLD&PbZJKVXlG&nm/DQH59
8Yi*pl ThLdGD*1=p14BM#bYHdqCP:R??V\qLJDWtK#*NPh<b=bu^yVC&caIe^\Q>QyNAD$RppHch+yNKCL#b%y
Tq!\i< w9W*H?WQ^i#phZTh\Nbq\:<:<>:QY6nwHLmP=wB58A&FWY*XF+T<EJq=:FMcSnY6S$b/c19RmacCeJZh
EhC%jW LXZ6%Z:V&H5id??W:<YZLYLTM$Zqwwu6GJ/wZHFLn>14+pnZNWEuT>NpWP=Ep^ww8E#kE*I!FH:$WbSm
uGT16# \Gw>F#4hMdcdZjlP6&I?i&:e&Yk@B+#&&C:L#>h5bGSBt+m1Xepmq^8Rc!HmS=T\EKRhmi5i#DAc\QRX
jiCbA* RJk\kw%d8M$R\HSITc:u>Rw@JtD?J>$@@Q@5?j>@&pPQ@=>DA@/n+8@/6=<W4M%e@:F<?di@=9u*F\n8
KZ9Dc& j*<l<G@H=WQ<i%+jH\L^:*?DEQn#^b<S4u\C@^:I^TjA<@hItu?Q*9wnHQZ9GkQ*VVtZ@Q?eWQDjECj+
nTybDj d^Au?H>huPC@YbP+IjGA@/@yXn@yP8KH<@$C@XNNAk:@BSwl>BNhAM:@K@SQapZ++aljwZq?W6?GC@\C
jdjEhW #T@$M%4\F?k@:M=8ywX?kid:&el95Fn<K<*L>#Pc=%jwu=::X>ac#<>tnj?Z%y4A#?ljYY6@^LZiVQ@K
jbnSwk Y98=FMQ@K+96b/bc@Q^@EV*kQQ?%4M<u<A?ml<AN1TL<@DiIH9#ej#9d@+W1P9i86ITaYLMcD+#/Wp<C
N9HHlP +Tq4Dw98ySn=MC:!E4=@&e4?/cWdDb$nAJlw$cGjN*MplRHcG#Fm9t9jT\YPu#nNJD?<iuJjK#*&JjRY
*I+tdc tNwB/be?Q::uIZ%@*8@q@BV5c9t%++Qb6lpKRZGMN&>DBB+wZ/MEY6h6c:eme:PVkuDK8GEBHHc!5QdC
mTAZ#a >cGE8H^4%tww*Z=4B+BntHYMDtm46^nEPb#YDJXm/:KLDtY=NPpwAdFBT*mMZbu:c&uW!Tp1FP8+ajTX
lL^4k! 64IWI8nNFnN+BH+w8naZP>CWWI\Vcm/+Fk8+$#mXu5Ja##55!@N1dGpd1>NIdaK!b>mFP/N9&kiNQPTk
?>1k=h %aEKYN!%\<16i8qGQlwX!HAL1FnGCiDn^DHbnX=Z!BwDKu96!\A\m>YwH/AuIwWS/NWwBH\>FTXcj?Kq
S&*tE* A=8w%P?bu6a+jI/m4$BVX%X#pDIRt19NQ6bYk@lw:Dd^S%Q8%uhG\/G1qSJ/C%lE6k?aBhiqM4an@TYT
GEZX#I SPBH*:#GRmwX+w%tJJ=EK6GKFS61<BPdmqMkqK>M96Ey/>m:#6:%c+c%mAGMXVY:\i516JwTey4#a>8m
cCdj+D WMlHjZM%lVHVPIGyta/>HTZCelAbKteWk=ddLqhADF%%\Fm+IptEX/Cl98?Yj#RJj5l$jdR/Cuw9Yaq!
/mIaMC S1iBXF$?tQ&:?jPPV&*9XS?tCCb1!X?&QZijJ5EC:e+SFRK5=cd<#FZqWji%5!^Hy+8ZNJunV18t\NK9
#A<X/F #&bJV+Kkcw5HYTi/1R!jjA@+W:D4V<BK6k=BJE9J6T$eWkFVX41n4^!C@aFNu8yc!y?e#bhE16IF>P$j
Q5+eSq yAKk+FVaSnc1tEV&5d*JSH*/l<%&i=<W9!tud9$cXT^MuN+C=+W65MPy\$N>VPi&nyP#/HY$*c1#6<E9
i\TT@= M5><Z:>5d>D*E565#KBbe45je/@%IwSDSlbt$bKc^ZJN5Ctm?Qk?t@ICM59liqI@n&BWYMm$KaHu/EM9
<yX%$6 ZZ9MI*W^%+5!<Sq#BTeii6qKhN1NT^qRnn\R>PS?WpKK8p=u1Llm&GSKn@hAXB/D4LHmJnPtQAX+CKkl
Bu#GVt %9!*@>>&m8neXQB/R#&NKYya&e5<cPAYN/QEKpyM:Q!^I@4dnPw1HM$INNZ1MNk6X#Pdq*9TTuFwpWTa
kHQG9n cBHV<bnK%hTWkRGXYY5&CHFy:9ScHPc5BY=t*BQ!5%dGub$^wZ\jAm6awWAJdw#aKXDi/lPqDNFBP6&M
Z=i=t! *c=>IeN$@dIyV^$CdXT4K4GS166@!JPLaaCN6Jjt+h%=uZMyuSAB6JLdA<#^VJ4u6b6QGE$Dk^\JJLhD
<9^6ia BSKbF4w=\@CJXCk>LMnN<iX<a+^dG<:eh1H1yEB=KCZ=B<Ha:Fy?YTR#DDC\A^cV%RDLSqEXVyuk?&en
d:dGLK kM:*d9HCA:qG#F^V&aQ/MB?ue+<MGYqbS?&X:A9Q#mbE&kF#FcqaHJI^BqnW?:4eScjNYlcV=MLN1=9I
SBJ&8c 5M+k^Gdp\A6D5hRyKdLCETNba>T/TA5j/=le9\hM:GZZ\1SEP1@e@in&SW\GHt\XA+qMA5ZNhFdb=Rui
mY>?#9 a/HT^/P*l6S&qG*=*IHl14JyD&@hBW$nLd$w1n*PW5mmcVZEB8jVGLM>YEXF<wEubQiGlA9JVYwK^:5!
J*BG:5 /G$<=WeXePD!JqF18&66JatbkL4Q4BQpqTChTd6$*G?*Wdw?\CT^EkT?8<uLSPWtLd\$\:/+h:jS>twN

-A158H 0004c1dfdd9001202b4 Page 207 of binaries2.zip
#44q<L k*\%<d^jFdSM=E>\M:6ytD9MTHERnuW8%=TbdhiGd:qM&cV1ka$LFKAXB1MNX4te8Qp/iKq##*tLljc4
Wh4bJV BX+MT:EdJn?9H#cl%kQEG?wbNyh!uE6Y#BwXB8I%YGwNDT^8QyAn*iQpmM*1yV<+d!4H#*R>emPu%TQp
SP/V:a X\Mb=$j&dLJ5hXtP<4/&lnaEhAQM:P$pALcYYRt449h>KDREHuL9uYF4th<%:1^@T4c<uc&>=w^yHJcu
9^!i=k :Z+CL<il6M<:/+nPQZ@h*YJ:S8Mqkth!81dFRB?ny%PFDS84hteKXKtbi5X&?\eXuRS&6H1:pHG?kIt\
?&T&m: wVEtI^cTc$W>C<Vtbi*jL*Tpb6C!K&dk:L:VcZt=8Tn6HDXnK69VGG&/qtn8D>yI:YYH\Z5RiFTq5%\h
tkWndh yB*:LEb/K@PeY84cD1etnHHXV1#ApeIbBLDnHIhZt164$JHEqF4+Tqu/n44!ehNcT+?>mwYNMGH>n*Z>
<5bQd= !/+Dqwb?ml/wpYJtSp&j1JKA$kQ!tWDA^wb@%N$kRY!$Ii5Tp+J^mwDK&+GFS&:HqWtwDeumm^y4H5Th
6PHX+d 9FQS=ZVG#ICp\8k8?d+iFZ/Ya8cwHTFXTJi88\y&RTT9PwY*$JwGbNn/$qyLKXSptGRe?*tIZCkq$F*$
QB9u*t Y:mXY5GSy9Bd?FmFbma=iqG\:9JeY4RQRW!*#a1el?J^yuVKG8qq8iBHidGRB+WM&$=<NK$qFc6+iP#m
LXR>j5 Ja@*liMyI<J>YA/=AKWtCyRMwqV9FbIGKlm+iBC%y%/LAKDiy/Z$?\<!Bck&T$KiBcXFJmW=hcHppw&k
4SICqa +mVeuqW?!uE^C=+XR?%NZ5N<P<6XMZBm1i+TPphFpY&=W5:Rdt@/GljkuE:Ic5/Eq*mhpP?hamjj>uI>
bhV6\K D%mZ6Yj<T+YC&M8SJX=QjcYB=H6LGc$%BlV=W>!X6hWWL6*1eL5=/54hm4&^Z1QCaNX:Amhq>jdQ*@4Y
ZM?\Ji cHQ!Jc/TE15dDwZ9FMk5V=F>jnV#pBnn#hQh4e@DBBCHeCYM/cSSDi>9&5#kl^q9WCqn#%=wHW/?1H@M
:bhqPK 6=p&d\1/4^tw?eI=@@%ZGGwRJQJb^ijRX&#y!p&wJj@X/eFBiQ:Jdd1Y5w8WHu9lZQjy5u+cBe$QhqWX
juHb^E KR<e6C!ky!h5Z>SVPMibFn^N&S@&*hX+?F1uu\:qt$^Y?IV!Y#=Zk@TMuIt8lb?G!6j*cD6jCB=?Cptl
&+4cHp qVQ/8AGhmyqL6=DE^wNX5u>@6Xq6hLmqQ4^udbyjPLa/6naQ=tkiKSd6HTu6Sq981<1!Bq*4q=N&T+S$
KE4iV5 l#q%!D@5CC$<p4DyncJ?E&:TG#kCX%RWXqmdMJWNayuwB+P5FXhF:Bj=nuyYI^T6FXq:?+P/wdthWS</
+pp#?9 J$4duiK$I98^!ydlBXj+=SyD?CLwI:/6$b#bBYl4TBSI%k\$?u4=<K8Q$lmTHwIkMEWnTF1%j@%65#Gp
DPCNBH mH5=iHp:Ht*5TE%>NL8d=pADdJiu?A+/#Lt!%jZhpu6q>:1@pDPNybAb%\PIKj%<MEktN#ZXPmJ%Q?GF
G9HJ@H &R#PaFy+$P$$*Q!$RMy5t=u5a6J$//+H*iL1w^n&t:tC&@A\dJ*h5SS%VC6n?+eAZIhFJBJ*Itk5uHh:
bbYNDH @@JF%!1kK#6hHm5:tqW=nn/he%:Y$c:b6CMS&%6hmu$y8+9BXllpu1Di5Rm8tjycHXP=&>#MB4VC&/i\
8H^emZ 96<VHPCJLTpj9/Qj*WIBRBtEENLRA%N+aZCG%1hD9Pa1uCWFeX1A%wh+>/*q\<H!@XTAKE+LVqNGlGq^
b8<V<h /^1lFEai4?Pa^#MYeph5<6MkwKX=&w^W>w:%nMb^tn%\NYeR#>W$41D\6W?SFn<LiXRp?/+LpR5LVECP
1lcc<B ^uF9>S6Vlyhy1*q@%J8mBE@i^+#+<<nhJtcJ*DeHeXct!IS>A!F4qCMV!M/9!/H\IBH<+byInt448?qi
SHjL:n %@StMwEKe&&+CTS:dce\!dBQw\dRcq:?Et>NH+nyB8<&i\keiTPSldXnJw4b^B$=X1X&!q/8=ln45V9%
tjnnTm hiipD\6QDk@!lJi#n98RhZec1/W<1/F@dlG=#l?%y=@uY&5q15niJ/#P&<VHGbawLGA%IWV</HdHWCju
winKDk &a14+88yK#CKS8YAkL:4FaSIA=/kA#@l%MVViG^>XF8^&G?YbqSyblM=K&ILRmnjNy@$>ktl%m>/Zd8>
8ah*hQ J?>Z/caPdTe<<yI\91>W9h5deKb8bn:kbSkucuVS1w+M=a8j+5jW&J<8jpD<Ra5%<wEC1^ba9F:>AGH^
?WiVEw lYc#tY@*R4nQZ:la=uc9e4>4$nHYh^T9I1y/:eRJC+5k6:yd>k6B*+^K1?ePVnPBXkyZmnXB\mIK/@R<
YSJtFH !Ymji=D8yhVA>TiCFXaXLHXJnBT4AG9eB=Lk@K6V\a?anh>m9V6WILZdZ:iSa9JJV%e*Q\iP*\?6+u*C
T^=DJi NT9JX6\/1TVy6NbXnW^ETYHF<Ya!PZXD%Z1S!$QtMVb&KRPKJ%M$K@mMSSnHR?4hiVmd:j81S^Qd$4bP
Htt$RF 4=$aawYAiH*!WRCwL6+XHbamLpn^WlNq$Np^nV&Sy>TAGIZt>kQG6kwde+JAM\Z?KpSG9ZE>YkDYMba>
>G/<+M &*KNKhRhTRpY!cS^CKVe^6#J%5*DjAK9hkhnuC9/D8d\LejZ:&FyH/8w>T%QLtK@@yly6al>nRmb?im*
eI18Pc <$NnYZ*<t/:!=^@&Bp<QbPXnH/MVSNp/i6m/YTBh<n@NXn?>19>aJZlqdmnHc/\Rl!=>^Xp$Np+j@V&:
5*KSdY yD+DDSZ6E4JScAh^mXGZb5Vh<ZmM#eM5?&FSTXBIDuHCe+A<D&4t%W6twSbRe>Lb>A$LSVjbNI6n&utG
X?A\cD \4CYTWnJT+J+TF<NcHtu<N&KyLHjiYy:Ztbiu\SQMR4:aPHBNFJ8tkK8+6VmZV+c@cT6K5YyWMbAYADC
PT<mNH =S&Q>u*Hhnpp/&&\w+GZWq:Rt&wl#&jXk:d*wRQSt#w$FQKIdWyD@ydhEhc*^1mqRDMB81#C8RP%\Gnl
RKTj=5 +?ZR<6y*:I%kTI4Rh9XY1HJa!1#Xb4KV1V!pmX\DL$EITP/BKiRk6iRe&iR!K&SV!h/=w/EADucl1*@H
Y@iZ\M NtCA?Ka+!k1EL1au#SyNWlG6wVyb?TSB=&Q9KWMp=9iG#%*^L?*i8nme&hkanT^HP*\4jAe>HD54+mEI
JceMwS VAFXiIL\dZ=EV+YCB=cP@ZVB8+?BnRNJuc#&+ky>D84Rp*pc%PLPhW+WJdLd&aJnq&9+4lhh9Ghi5>Dc
*HGTHd l4WWB:qLSpu&$PyMI/ny&YMGNpJ:FZhM^nd/pJYQnn:&G?aHtn+uWi<E?9&pt==19*l&QAABD*L&m1:5
Fj5Q8\ NBEwcYZbJ\ub?!$ht*q1XC5EX&5JyHbG!&i=X!P9tR$>QwhCD%#JqkZM:$GmVyaQG?@QK*nZj@+&L^N1
Ht@kI5 !SPcJ$cE#WWlh&Fh+%SS\YbWi^Cc%*:Q^p4Bla8TYXkDPYCMI^Fw4?lyu9w1eF1byy?e:%6p/R5ei/!G
+*p!@N <i<KnPF$AXZE*YmCY&=5R=B$!E\qwS4Li/$Z<SW^QBaBlLbWae&<6WyWe&A&e$qDb?+Ni&#+lNib4aHR
wp?p/T 61#/bJy8+JbSbTK:F/qY!Tqa<m%q%**kY\%/%TdT>/*He1Zbi>&cQM>=@aaSPPc/acIltu/:A!H/hiIm
w9P=Ae MeQm%S<E%Kq@:M+JkS*tydm>QX5uFP@4T:n#^B4iu4dL=TNEVq&?/Z/bRtHYGjmAN<^9li&l^id>iEGL
ZdCZP^ Kt!4*YpT//CyDT5a6yBm?eEWZ5Red@kd!b18TpcdbnV%P!:MHw>V#hYAn&9^4Ppi$Lm\4?+!+Z6ic4tJ
TdQ*Ih $Mc9*PHbyDGQNDX9@TlqM!<4Yw/ti1i&+uajLw&TXDctMe%wY9\86^edFqCDY!FNIplQ*8V^h$*C!\h+
9by^*a %?&tVht%%JeeV!lIuMHPdWciPtcPIbY<G841lZ69a:yJhY4:NG\5c8El=ZXB:Xb=#=>RNCc4hbekiPP>
6I<<!= =cNT+4:a<Ibh#a@l9&BtTplcXGAa+VEMwQhpuHP^i6kNjMNGqC!c+La1dbER#?$TeY\%mH%upnhP&FQI
i\AD@e qFLFSSFIwTN4>#%Vc&@CIRQ<q5KYu>VD!6p=14CAtQSAdSm%R?Ae9ILb@:^Pd6wK\G!e?M%PI4T&Vnu5
9n@GH& 8SmkTdAG<YH%I@t>\NLR<9au6h$8tCtk=^V&bYNL%j+EZ@TP&l/8i=aAZ>!j?N6nX$Vd4T!>wX9a/?nW
&G/Rm= wV>J/?&mmQ5D6\?aSY8YYaW1AK*L^iw<wMIk9yZJa4W=H95THu9KKI/ehF><jhKKN:P#=m^d/!\mSYS8
@l1At= NDecn:8mXy*Rm/NA1#VX@m\Tn@$wFE#^!6S6kMNqGSWTPNGL!98BH=k@^CC6ecY1:9S\#IC>I@&d1liP
H8Z@jd !lhe<BKppqWP^#VLji:<T+lQHk6wWTyAVZbX^NdkY\9yR\yTpJS^i^uGwqSC5pleC4BYHRc$qeTZp/I*
emT*IA 4&M\GYhRbyDXndTtR<!>MY9ya>?Z!P5\J:JR:<*Y#$>QtJmNI*\RE!>b<Yqh8/^!ctI6hW^/h5%G9cjk
y\dL6S RWeKkWR?GL/pD<c!8HCa$FlTXeS=p&!wJq$kw*:YuX:u%=kD@kAi>dMj:e:CDewANWhN#<eB586d\9\R
!MQ>/S Ptwi+Paq%VXZ5N+::X*jXIqublq#keultEc88T>GWw?VMbt$+>9cWn>PFl8\cWE/P^J\@BLlaMtFTPqV
R>JWLD Cpyd:cClWaNMlecV61^D^kc9J/D?X@w\Hyp=+li^>$lnu6n=$M4cSGteBYa6?cG?tE6?/AN?bEnIH!TY
/*Lbqe kDGJ\AuED+\cLuwjeG/<ZaGpNYhEB6/P8pe^&69G?KwQy\MJ&lTKip^hPI*h8tl$L>p8mT#w9tu+4J&*
Y%4Xcl YC:$J:%d@Q>:>B5Btu>9wjmjT#pI:9?lQmKA?K5?I5D@!@1IAQ^GjiTGwJe@bcNjWDl8CH4=K@%VhiYG
^<6GtG wJi@$n@XS&+Ii4tBF9kb#j<4>M>/Nt+Ii4tB@quB?+ckq^6wuy@Sk4>A\*>/*WK@RQQ>4E@tl1CZ@\:>
J^QX*y K&8Nn+j:J@T94DZiu=::X>dc#^WPkZ>NKQ<V@p<%C9=@%Cl8XE5Fdpkwl\6^C@^j+niX^eb1!E1Wk/Wd
R%ka*V ^+w4WB1Ri=/DN8@IEmidu&C%ZKtHq$q6DKYVDiAkn:cY\bV>GmKnGB*yQlHR:Lj!MHwt8Q68PTpEn%1t
tMVS/1 cNP+w%?HlnJcTEIPXG8I\##CX!i@nPiKp/6!<DRideV$>q\MW/DacFAJC8DLdMly4==XX4aiiFVyn<Kw
?!H&9w 9YA*Wl6m=XGw%t5F*bX%kIE:bW*?5Jwc1ii\njne$Dtei$Rl91pAE\C6a$#<pRkTBa?PW69E4aw<R$F^
>cJQVV FN4IeGQm>Y?LXKPP/H8:#:KS\tDCyBAwdnu5Lmkap#1FciA85wmp/m!KCc?1LQ8Quk\DQZn$mGI4DH!P
?t^#<X MhXRWh+NB#D/q#ye%M6?:m4JA!<CJ$M=4G!mtE=de:?>Gc16J1e#!eey=^wtGwB^*a&#//SV>K&5D$YZ
\iibJ5 >H:hheR/SSEMZZ/LG5yXAJDGBH\BKAblp1?&mG@cdQZHkIl9y&lN>A1BNKBuJ9$n\^pPk^J1=a1p$##S
P6cVql ed&nM=Tj1/4G1<P1kPkSEqKw8eBn4QL/cMd/CqS#TD*Qy6iT*8B:5:#dIcnWXTHNlmiLMIN%SeutEFin
NR&tKA uidlmhy>E6u1qZPa#khF>1bKlBYMFcCXB/#W9^9+RpbMI?DKMaSNR+?tAnam*VCpc4<^1C=R66ycKTT<
VBljuk TKHPblieYHM*Sayb\t5MF%@ePe\Wh=%>NIPC:YT:!4y8aPSHGLK!kT%C9:p=GX@:4DtuGNmAFqpM6QZB
-AYQD+ 000642228df001202b4 Page 208 of binaries2.zip
M9huc5 nA1JTpZ!HeRDc=kP+#J6w$J1:BL4Ph+nJuGHhAd5EVdw8V@TDwSi4<I5=Sm<ai6c*4+HYKSQGh1aKBpI
\hhRyC pB%^*Mc&T@:IkNj$<Y>aWHJ5mlPhG5TcFZkAj!Xhb5*L4<!hnwFn/FVmdJ1l6NGBTtd%ZccKQ8pTE=tB
?14bPB ?EHW:iEbH*tnRyZP<%RWl1JZ>N=1:<\T9h9Y!QkYT\ZP\q6K>!dC6tWGB=1WcH+</:NZ+ht$DEhl*W=:
jtDE#q !?pbF#EhL:d<I@CnBd1T&GiyQKKJy5>qpw\+6%$FyMya1HmjT<e@t8\CwG?V=HuGFBNGeHnckwNlSFM8
lNHD/Z I=R8iDHMXiuJ%j+cJ9+8h?eHcYe5DCZTHS=d!Qc@:taeG9GbiCl>D>#lbni#IPV9mq1QB%/!dl5u5c9L
VDCAWa /5ARnh?D*ka$YDL4NISA>#1m$pe+T\iJTD8RSetj!aYm>/>T/Snud*jJmp@iwk4tZmSZyTTD?QpJ>BV\
ZjQIw! +&W5/\h*bJNSMLd*p&EY8XV#HAuLBl%95J9KtM?lCVM*9/M%C=STbAulpMTc\88$5R/i>cGZ8J$WKSe4
qP/BR= $TeK:=Lma?\W6?C&BXPJ8uESVLbXQF+Ze$=J@q/DLyFqZ!l@6$YdN#yi9h!$=kBdq6:EdJ9RLRt\<G^\
V8ENM> u+MBZ<:S?<B@p$W!/wIEI=h4Zj!YEC1HW<Gk%mnYDayMC5I*n11G=LSeX\eQ+N%^ieHDiN<6IL#>HRQY
<tJ#MI jAwnV@wLkdDkJj*$YNdHKBW9=9FWjjADb1^$5W5RcI<6*mX^Ab>CaPQDSG8D9+c<:yCdY6K6qpR=:ljj
IQqcYQ Ym@6mB<=8<uLt%M@u?tnKkEq1ZPYMN@hYA%Y6ch:mi\#I1Q9J!SE$4nPmN>NTaQn/bK\!L:*SlaK*&EY
H<>t+G 5>9NVe!=SYdP?^/WZkyyELh95\t:dXyiJb8DlWA%CTmlT?RpM1?Y16cHZe#CMy=X5&cTM>pKWAQR+89B
ww4ElJ N5ZJyH:GSLGlB*+CjT*GlKZG6yDl>T4P:65:6qlMYjK6h:Gby&t&i4/F1eEwZ9DHDC=MmT8++PKpNBeH
L#Q/lb H&p\EWCVqeT>Q%#um/4XZ\#hpYWNJV$CSIV/=Vm*ZFe^&N>:EYe<E1/A$:N6+y=a4^Wu4GeNAFG$ueb\
?VLVmw N?c1$J!RP$lGXt4kayKXMFEeC\YLp^/5!QS:JWEn&bP+Q4?9c\G?iQuqe+G>iC^yG=nGwCJCu5^tS6#u
>YnLlK DlYHIZtaF5*kjMGH8GPl<QdJL1E?:Mh+b5waq8EkMk!M<h5P$qnF1bT<jV=*KL86HD9X\BQQ!=ck^<GT
yLE\Gh 4>X+@RXdtE#ZBX%jy^\knbuak8qbZ<TRHu!m5^4*LKA*LH4LwcVCNp6d>iR4n+jt<ENTBbNc@8I54i?<
XiB=wd $5PWwjV*ad*n1!6c<&X^qZBpC6u*$Sbh>IV%nJI5PZ:X4dn?yP%KWi?QuTk6^qeG/p>eE>kM?+y:G@Qi
pw/8d+ VVM>m5YliPC!nAhmR*BWjH6YdaD<5Zu@YY^5#kt*J/Ka+mF?ti^CE?uXjDTJDh%EMy<CF*MeDnTcT*\a
XyWQy@ uY/9G6WK$96SE#uCc@tK:la4lkBihKY!%VE\?t\MI%XNe<?/R8$XQ::*nKyb8LZPqcAc=@M+Adb:K?!d
Y!WbaK +WbHqGNqaqnMX#d/p=Re*YyHZTXJ?TM%J^Vtut$/hRXmh!nTyD1p*nmpN4%<Y5BbI*6e?Z**E%:RSER&
*6%l+= !Ld/#TuG&%hMp4d&e*L^B6<mcZK?P<yYKLbK=DF%E#b4ea1aPniXjm4*W4+D4JqnVaJ&>/u#qpN5$/ce
Tpe19+ SS?$KhlVL=Et4G=I*#LMh*>5$4#/RY@aqhc=k/cc%A$t46Tb\JSeFHTYhYtc#J>1iCViQH<K*tw#TVlZ
VjkkE6 j9C*4*pM\#m&h>@uK4!/*lA\TR*9y#\HJZqkDPe8=cYcP4uFpDb^YE8ypPbEF$Xw9:GESt%n8?aS18cw
LdC>JN Dl\ijTnL#e*&<Ala6lGT!L1c8#M@<b*<lCPy#ANTNV5=l>i5=de?q^B+GuFQZjmWjD51kZmC6X@!9Q$L
\\*EW# ^lcWQW8jI1&YR:F5Fn69d\u:ni$+\:1Dh9n:y=Ve>&QtQ:q=FDae6u^^M/1+Y#j9M98bT5ZP*T6/J8$k
&%>kCI y4mi*NHc1G$pei<h%#c?jYY^IjiB:6MJAltDd!VP*>uQ*&^Qbm4dTH$\8S%%Zt%IlJuKn+&QFSja5lI^
&@XHeQ li8SmFM4\!JakP8SWW!K4hI19Xddw/##wkPJ:+h1D5<A+&:Mqw!q!cj1Gl*+DtLl?/pN+S^wYG?JlX1>
BJ@:De B1P=BHG/MTwLDtcZl&Pq:Gt=FIk?NBwD+*/>epL6VaCT$Dak&hQa64KyuFFkdt+56QPpWdVW<P<L?>Tu
@nu/GN #Mkj%w!kjFciQhq?M<X6T%c*MkVQKdAiYqlW>AN9&?*b&kFZcPPM^G$:kAeYd4GMZKW<lJ/#u\*W=<B^
ZqL9WC X8?&b\IePHD9Cmkwp!/Hwwq9tc!EX91ae??YWuITA9&hJABtZT>aMBJS4:$J<YVDqREMj64e9jkHuA8M
eSmH5t Vm>q94>&bkWXdRT@9*>TmtHCAE*AbXTTwt>l#ZJqBA:&i8nK#Yn*PuDK9MT4iWTGk>ImNHwyY/wR5Dh*
Kj/p4Y 6M!%S^:LJB>SZD$bFAF^Nu95uBcQyneRNBJCd*MY$W</!b/\djGh@j=ImN*V/Qd<k1CJ!ZBMy96Q8XRy
4V+=5! <?/kA!X^8$pwLL$$bA^9l?QIw@YJVV+E9/@Xqm$6aXVPqc*XXR!db$BE%B\Ft*6AbC\m4jE$:MFW<W>I
%V4/e& ICh5VBRpMnT18?P*CyC=m1TAjK8h5w:n*jppy8\j\$u!pp#WQRywpWteQW\WDL9wAF%$e&u9jpHyQR#@
uTYGwy jSaaI$bi9nGV:GjbIqF%N1lSk5/C<<N>JpZJH4$#m=F&9*q*6blCS^P\*+BC@EP5W#BhTY6iWeDd@JCu
LZi>&& D15<:F>dbItiJjT>pdbutynuqPI%5Q?<QdSu!lmH:QNIeB1GSh9NaLG?MqqXp1V^n%/X4cc=bHDnMDyI
eqeWP* JI1LG$ZTI49pknJ9!RVSKh/Zn^^SP*\6Y>bN6:ctK%54Pj/PD!eVH4alXVR9:mS/ZeYenjaRL?CycJed
me4%VF ZaeN5A6Lh<&KiZQEYXZu\kmtlkWB$BTDJSB<ijiF8l*kIdZCQbeCt=Z*%k\SG<Z<t!aI!!qE6/RABkJw
5&e<W= pkDw/ldGWHc1K^APdEiZmBDeQEj==iNeXPPKP+DF@aSM8mAdRGccNC!$S9#eAFCkBZAuYTSQEhBZm+X=
ae@iVq bqPQec<iG=p>j^i6WBT#l>EwC4m%\!S=44\SLL:%RTAWB&lp5?u1wdh=^twTAGilbdP/#=/hkd6YdHQe
GuNEM< mW=EM\cnX%c*8w5lL^Kw:FRAaTpmMl:C1>!wDbTl6VFnDBX@K^5d#VWqSRP<FN@i+4Ye#/C*&#V@CwB?
Lj9@Ae ql/WLN!^/^D@Huye#/tI6P&dp!4TJ<Rj+cT9HdEGK=b\e&!=8Qi6EB*$6jP+!qtS1*NDp+#Ed59YWXl:
W%!*c= h@jc9J4bWIK%#<E8Nd4&WiWb*V*WuuLET4n^MCbM/e$6i1/>RLkQ=+p^:k:>n9kR^G@X5:^YA=JtER:1
MA5/yP e:>>1N#Cul<!c8MYA$yX\6<:Ce1Y1?pDMCJ=JVu#T&pm!@^1*mi+qA9dhy\elSQX55>*H!YIDePq>*bG
jVT4*W PLHmtZiY*tQF5?*6XadD64JH\V6^m6K6F6TL!yiLXb?%Pe:Hk@V!!<*YCatm<YXZ$FVSCW8:GycZeicY
KpipGw ^>k=\6=1+By=E#N8+Pyy^1DtPIG^5t@RtZLpa+T:/+TqS/>jk\?=6?\pdGkCTNyZP^c*TY>:a%>&Ytc%
mGN>5Y ESK6bHe@Iuu@pJA=BcL$!F%CGkunT/#t&^THt:yIJatJ$ttL8k+Jtl4h^VVnt/+V<4AR+P5SSLkK=+WJ
Ti^pCM >kJbZbj8ZY#iN/i/*:$1q*n%\E@5Rje>JQELaep9!C=CMhJc84pt5Y\T5VYaKC$SZ#%eBi6a\5lRIk<d
i94pd= GW\5ca+Dy^$/V1H6Zq5%$1JeD4K4AZ=@jQ^cKy</WjGH\ajdtl?^/yP@dwGy9Wu9/NDPLS+9T*@EeLYm
k#b?>W j?/k8FEeIN$@@\V@teMcMt4&RBNN:BEyH5V14YpVp<q#>wTay/9D*?h6dHR><DcbP/V1Hmy6Dw4uYhDV
<:Lj!^ F8y%Cau+IR$4ESbcG$KaH+SMQ<Qb!tS&d1q*wQC$8WFGR+pFWTqB1JaTI4^DLut$ATXci6Dd%m\M?6DS
Qq<ILt Hi*S#?=DTJCblu6Hq9\PVFuAT#u@!q:!$6KNTCn\5cSYA4PGatBVyu4IHWGMaeIhi$YVhXYNYl=*%%8&
T8<a$9 k<4HK6w+1/?T<i\AjAAqJ6t6WNpPXVp$MRndkLp6B=Ndq66BH:#/A&iMcKtD4P8F<18RDZYE>K6E!iWL
JuLm9t t9Di?hW!$d\GVEX+18!XPCS8P$RVD&L^ia*=mJPIjSGn#w@yqlR&dRXLa$EQe\EZMGNwITJTBu4AY::F
$I<S/t ZDca%t?$ZDbFc%AcXnJ!H>\jK+?ZpIGt!1C!tl>lb=SkJCt@:P<%HGEnElW$THZhFt*tMBK<W<B1lwXX
BWdjYm RkVkuJZdn!a9LtA6jl^^K?aaKTN9%G/nBBn^bE!q>heyCZh+tGA&!FV4!Tm%H:N:XqRW<Vlyt&V9\M*M
a<$/TA D1h4/@y9>&$lk@R6ypl4cjhtV/^cbD!ipJ^NL^?Bql>*hLITGw@ehqJwIB1S8Ei^ZCV&n/V>LV@ipQb\
X9=/\+ jQ>JA1bi5&ejt?Y^lyttK4%*9Z\WEw&HF%mEGF9WXBJuBb*Qe65nycitQL\E?=t<8l+VY4t$lBQt98Mk
61%ej/ 19cTbEyqipqZt<n?8Hm=XE><\C/h1WMc?^YHbdjbqWML19Ty\wDC8d^:@=NMdt&6:PpZCe>i:n=JHeBp
JDjqD& J:#hQjWp/eXZd:I*VN=I*^eKL=1XTHah^D>h#/t#bdhWtEj5PM<\B&+VGARMTie^muP*pKt!Q#+H9Rl!
uy\$nn h<ja5y%M+ZW?CtHc+$#A+jleSSpIpbHnIjpeXXR814P^Z!1wcK/ZJd%Z:SD\idYGSuGPQy&N<QpF6$KT
\HMHQ6 cDIjY<WC8/Fid*t?Qqm?p=bQYpa9=i*u9e^EXuDBp+4nb=G&9Ze=DqZyjTMXEuJ\N15T$G\H4>YFc^61
5W6nMm q1Y*uapw&!KJic1<c/8tnlL+i>YDbBM<#k?ITZmVh1/d&JV&LYI=?h\eXRGi8paNb%9D:\uyP&T$dRp=
nQ/l?S ^YPEKcLHCCD8Z+\eNNyd5eNanJ&5J#a=&iCTuP*$ZuMmV=15u=l<NC8JBVTNKSF5:DYZ@&kNN/1>#Ekl
DJ6Y!c E++W@?G8PRa!it6M?Vk<+WN&X+&6F+/nR14:LLJla:YGAEe#&d/+lq6iCISulPSp+IX\WE@AG@BTLTJF
uKP#?: !YP%41Y9InWbiEM*9t8DZ+YL56yQFQ8*5*bI/S^Hj?H4bkkWjGjaDqt/qld:!6+DQcdEJZ4IZM^4d1M8
VJIdqD T6PDTYw/u>BbJc^BLcS4wF&t1%BAteuTh4DDhXqb\yS$5Cc>KJd$1eiZ!hiNRdi\N6Y?9hLu5=uuwnFt
@!ubI9 1NL\%tDc%b\HWZmGYWnK#lKL$YVie?JCtiu$^\yaSREBLnt*yFC9RkMCBN?@WBlM?9R6/VNN^iM<?u:X
M%C:ec QKIn=!tETc8iY<jl^G=khP/:jG^VFy<h4w1#?H5EPjDuL$ZD*KtM&uXXYB/Da!/EQEq%#V6?=8V&#>uJ
ea6l^e N/wBZHL&^ydt+9>nXaBLk=iGl=5j<V?SCQ+=uQt@ISEI*hBCIjV4LSSCN:hR*JD&@GhD!T?W/Y>Ii@+4
bCebaY @XN#yB9Tut?kj%bw9!H5?c@$H%uaN>P<9$L#@+#t?^Z/b@EIk9BjwZq?S9Q@A9&#JHu?G&J?d1B@Pt5C
-Ak\S? 00007c5e4c8001202b4 Page 209 of binaries2.zip
k>H4CP 9$L@hNb?bc*>NFSC<FjYG6@Qbp*wX>ac:<>tVilZ%l49#&bN/FjYG8@Qbp*wX>ac:<>tVilZ%l49V&j6
LHJ+Ft X>ac#$>u:XjY&5>qGcG@6I+I@Nh=:H@9F9qDqpH<&YL&#<i>wZYE:\>h/@>4Hjq@b?5I=j?Y%yF?n9kn
BPY+Le q!GP1GdaTAR+F*+C!CqGmRD8hweI6IGSB:QIWcTaLLK#kWKGL?wdN*pDylKLau&Ft9^u\YMGFVZ=hXt#
FA@!a1 *bbpK^T#QJVdWn?I1NhR9uEe5+td4#=^AXN%tmMPhq@Mul+KTu+CQ+/im$MJ\/>YdLdA^GAGYVXq@pR:
>Yy+$K VW\JN@mM&?\VqZyTnmwnTAN+up^8&C\BbnA1%dM>>RH\<dG?QX*qMq\5DwWA^=lNWub$PytSl@IbFhN!
Lqp\aR &>uJD@C1j\&W+EMeFmk4J=tLu6Xj<#<KNL1LZJJh1TliF1:ZTBRuu?\&qVKMDl#NulR/+d>uB^SEQPHe
dIY>6# EnKpl:eNQbZeZp+Du<Fin/Z+J+t++ui!1++^l8VBNV\5be#hVy/n#VuwNFMA^hL#^\#an$WF:ciY\aH&
^IDeQL #=@8\B=GjS@a*X1ZYJC#P/dKl^yC?p4$dc>M+^mnEjjIYp<ddm5q#MEhnw8MWYyRXwBPydZ+kPNl#I^c
qJuYWZ tn65+aFcajX/e%9M?Zda9ahFBbiuijG9>y>plT:8nZ>9@SH%mVHV%dI6VP#NZuSKcM>?i>byc^C%<ny:
TkM:5& !@hMWaS#m$ZF<N15AGk1&F?lM%<wSmc>/LwW@@tYn&>mT=mR#/H?6in1YP?A#\>QlWCQl#>+$\\&TaC+
uWqZ#9 ADH!@96^TaLMdw1VHIEp>Lt^k$XCy$GLARDqwtniLFAX>SE@4NblkVJX9Y>4ARE%8hIL^BaT&+IXTDT?
C%THPm MZKiN8hAq?P$kk?y?IK<LYut+Zu6*/B+&EGSDcFh?TC:VNaEkapYjRuy4aG^bVuAH?ubF=*E#*tBjGh&
!cldYW jJII8@MeYS1R+nJM9KeEJ&b>QQJ>\S6KX>tY8^R4ANdHc+XY>5That?Sy>>GY&c?>mdlW\DS%8@XhKCk
c/M<DC PyJtktD4=6jd*yccGB?j&SWjTiGpdh?tW#Du$t&B:\8PwF9uJ@wFEI5Xdk!@#S$YHdeVEP?PGXk/4I9p
@u@/5R aJ=@kG%#1b!WpSl4*M?!&*m$i8EJulI/4nNFjZ>=eS6SH5B>9%B&bY5+&PH<*4Bwa@+&YeSHK<hka?=1
CiZEhM EnVVV\KtcC^mShymGKcWCSbAZ?H:/4LW*V=5aWYw:biF+951ZY%ab\&i>TX15^CpuE6Ik&XFTDKyuuM%
iImbWX $C:ZS#LRnZ#ZICuLidB6\n#Bl=aqB^:!R4Q:I?NWGtanQDH@lI1bjbpPkC>k9?1Ntp/^6Xc6%=\iXMJ&
m&&IRC hjHj1%N^8F!N4pmVdHk:%JcX5EdB\1wKi>9iB$</S$#G:c5#>XJ4P\dZ*=F:JRnK\IyD#9eQYK%N4:h?
/Z1a=n i!KYNCdV>HSwRnT:6LSEV9QKB:w&\B#GwwajEGLWYiaC$CJe=8:bd5#L:h\LER5T^Mad1u1u:mS$lq#Q
=/6wK# !JMk6QqKJZwTuXJY6\DNT*#k\D@Z1F/$6%q8+CD5jnqh\uywin9cPY6w<q*Q95GCTV+%<t18yY>a=A:n
Sk4HLW %/i<%5i*P$\EMEBD^pE:m^bVq49YMX%61k4*hKY@JFwttVP&XGwS6p:w!%WTnwhiDcuy:Aqd&/48%!58
#JtVEw /QP>YHdSuJ$$QPley\!*bKq5V<49N%mki5H%eK^#8A*?4dC5Fiw$5qpMq<+tdTI46K6cSZe=PM+$=D=<
wA1dG8 btlp*aY?:e%?X8J#1wWu?Fb&!!m^i5p^8npDD+I?=54Hwt9>M4qPVZaDj&*k#PihaK4e$CPL1cqbhYdj
T6pdqE e/ZMDI@4dWcj:tA?8TLlM!TJ&j44=J&FF:ia%E=nlGP<PEhjB/CXY%4abDqW6S4X4!*LRBK4kBB\X$8+
P=wS#k +LH?pcuLGBM@u</k:iut8$RPB%51k&cH6N6CQ5t/w@w9ADV9+bucZ4i9TuZW!tbZq5!=+w:4<XiiP6ij
\!9eIb \k?X>G?QEH4P*lIjS55=K@@!5XD=Ij\XVTC+K?>q9tMKC1n&ihIa4FDMC@+?Shp6d6BMcePu@uctPuYB
4j*>ql T/=hD%<%tYNpIw+eT:8GPADG^m*auBN$dVTp1&Veh\8ZGVFJa*4NHXeC?pS^htl5!DGpD//jR5kaLbQw
=/u=T/ PQtRlu&kqIi9XFZpcl^Sq6BEjW/d6mchL?q@WmS=JD*<ul#w<i%?dt%1WMZ1jE>R^ByFPW?JSY:YJIkc
KcpHen +T!!d/yb:iAqW1HQt1ecSNM\4kCKjem:FEL=*LYAu*LSkMbK%hiN99*l^%MbFyGZ*ChiNHQN#<T$chR1
/p+4CC 8<6mt89ilq?!H6QV=<5<PbDLZ!k\Ltid+b?/SR:uVdG\=t?CA9kj46AXE/C4V5BN%Mm=/@CY*Gb!^5GN
M$!D1B eX8Q#I&qKTMFm/cykGKM1bbW#Mb=WiSCH!YR6<ABYXpnMV#y#LyPC@JKjAjdkX==KiDu?XI5@m8?>e\:
V?laRN V!tR4tj*nV*LJQV5&4y>\WXu??yQmLbFKVElY@KBdFjYbt9GPdXDk*yab$W&V<TKIt/=Qqn/+yM6$jCl
64%WMW RC^1E>tL5KwKApHpVcI8i9h6Tc4FDIeVcEi8I$q%cMhi*hE?5HK5u#jQtXj61D8$84B>d^cnpQJGw4H!
YC!RcG NLW\=9*LXdi*Y!:tDG^X^p6Q9d+QWTqy9XH&\5JFcn1815at9YG&?G+JY^uu6A8=NKhb@hEu4ZMAEXaI
G?Ny8j &k@MH=R!?kaqLea5\I#D^+!TQM^nBy:AiEKtJqm=<#dQ+MGC$:K*6bT9C:iy\RiCtRjF?lKNn^miGuXZ
!6$/E= q8ab/b<FIIbKA!J5ec^qRX\Re:R8JBhYjX+K^MKw&ckjP?Kl4*JM5>XVj1mY*ytXk8MQjK5\95MBw#D!
9N&H#1 :N=:8E+m?GiPtNWV%q5E8ASZ?NBCwdN*pD^LHH9j<h^W\bP8lV:tDC:jPKZK>TIMaEEEjdDD!XAA$tlQ
V@mdGY LTRJ#\cc6$%h9KPG:+e!D<48P<C!:k=+^Xy5nmecF4Fa+uhWdJdY:E\Jju>dT+wc+1^N%N%aMHmYB?DA
N1NQXk S%9Mmn:Iy>P\qtW&S!9iB:n\E?Rn*$6kbmib^/5J4WZAN<*JnXD+jt1HV6jMcGa!E6I<:#H<l4*mbKpu
@=AFyu iAkIGcnqTu\F?yNEn/Bk$/V!+GW5Rt/<!jp916+V\/HAmYyceWWHt8wQ$aJiZi=+cNWBIhLAk4$RZp\<
t*bl%c wNw=EV1qc4EjXFcEY+YK5MPiEK4dacX6Pk:1A?u5$#=FY<*CM+b$IPXqd5NQ6<D!MKF#Rd**K<TM1\Bi
RNhCE/ +i<KF\^ES6FFc>bqq*ql6AFX/I!qE*\:c/N>J#W:V^GABQ:mDi9B1QQJS*jDZ^HWXQJMwypWel/lGc&=
Fe*%aD MLJ5S\Aq#ARbp\SaI+LX8pL#WDyly4hW85L!BIHtCc1e#+C%qMaJiXT$C%RY@LS$#EhtwhT<:Gw1?S&T
jMDq4L :bZbQaE8*/M4DSDDFk+$QjY^Zlu$n/EJhdT=L6yG1jA#G$mIEWKe*wy^q8X>BeEJBYe*C>S/EAB8>Pi>
ddjZDN b8Iht4KqSG:H6Emb8TWkh\@PLtQ4Z$LiM>pwERN%<qu&CAm9IjE^YGkF=E#5kk#Gk9bWJEQ!=9I^JXKL
n5?VN! $j9:bAY*YCdLCEd4kjH%*EbP\G4FDFM?/Fc/TB=KH5NFcC8hy<^*mdmdNy/a*>!wJQESV1Ib?MAaWT8H
tea+1e ZWAN&h<Z+CHn=p56mbjYJ:+uk9EK#6emM4%A!e6<Z>!qGpAL:BW>G9?iHbTpSi9Ch\ARKjBEJqb^8nb\
ZPnX&n %u/p>e6Xw:HIqKIFX1lIMXA:46pbVe:EBVPR$#kBb:SFCn5q?=b+!8X+L8SXLqV8%hd4h6n^w+ZA=aV=
P6wBDC V4?KKE!%l$m:1ZXyZmcBk9KBd1tcSq5KiER6l=!Gq@m5eAJJ8T+V6ZLnC#yCSyDwaenqNPmR<BQh^hH8
/D^5R6 !Z%c<^XB:LZ4YM:VKV$l/c/X5R>SqWjtZPyK5ji%tD8GXc<9*L:4A/\k5bBkZEZ%dk&6yI*t:tTqtK<Z
eTN!8t S49CQhP5lDYTnI\jK&wAiG&Td1HTBb/T=dq:l>Mat=c*yFBacDZ!=R%aIPB1#>VQ6?$K@j@XhkZB@V@e
m=F?T% 1+9+??dA@!nEIj:D*?T@K5V>?b*W<F?H<>eT\=?GL9>%IR=^R:44Z?p@anS9y9q?=h\I^E>w?G@S@L>F
8#SCFi I*/LF9k6Y9C*cKFjwiE*q%aRN/T:@uhwu6?miZ?L=956G9=d>C?66b@5l$j\IH/LF9k6Y9C*cKHjwZt=
pii*?P j+9?ydZGLjRVt9i*cL:jw8G@SjQ@Fw*+LjyZ%6wjJjGdceHjwwX?l?dn@m&c=:hw*6?mj&Y6@hEqeVMN
h\u#^M @!&c@=jwu+$e<X9uF9k6Y9C*/F>cc@\@wiHe9$Z#@BdN?%5$*&@S<N?mj&t6<jH?lEd<Fm*\Y:Vkd>FC
W#jjWB 9$Q#e@<Y@W64:Te>bRl?*6?m?Z/Ll9<Y#j>dNPK*/F>bc#<XL^H<k9<mZ9+J@/jmyhA@>JRlEDj+*mH?
@ccVSm 5hj%V@GTl+<Z@u>LV^t#DR6uMm+1kH&ABC6>Xp#%Me4QVmBykF=ND8/k#RFRn8EPI<\Z?>8B/:9><=>K
RV<9d6 $BXK>:bim^pkHc1pD<VZ+?d\5RER88u*%Y8tFXC\hEbNjwk8b^DMktK@\AEkFKVKhQWA=YjBE&5dT6!b
IBKTbm 9hPqWa#^G5:=W4l+n@Zk&8lLYdaGSuu:IVt5NmJK:am$MlBHnTwa$$tN9CI!aa/QA%>9+*YFp@hiG^DX
dH<Ft# MhWL:lbE%kPN@XB$aDyVYHNZ=MbZGBaG$Wq9X&C?Vu@MEi\idw$#Fm5WEmlyTa8FaR9A/SbD>nQmupNS
6bpM5X LL&SZ^u\^IeQ>um^MNy%!eB$45SeAE#jkQwKY%9iWZ?=dJ9$X&DK?>YqX6%i@mEudY:>hLlj#w4j^H=8
pu*keG J\jK+bSkhK!uu\LE@BXYaZK1Ll8h@hA%e#L\YdMFVFw5+S&1+9JAFmb:N@MBec%VZSwMhJS<H/y%N@tB
LN/QhZ RtYk8%Q4qMbZ?tkNWMI1XF&hISnFiVh*VpD:$G9yaa%dn#ch6tp9@YD@:D%Qdb=Di^W6nj1p=5aRy+Im
Ji5#?\ 1wYGdW&4Tu@A6JwE@#$q*THdAlGZ44!GKk>DnY>%?q*uZ?ld5SY:+T<K/*Lhb9Jb5<n>Z\<iFu<M:1^&
w\qZjE Fby\+1$tX$Y^B4C1wTMNYc4KM!?d19##*upEV!S<ISP:k1L+JT4uucpBp/KVqlZ<q#4WIh\hTDKJ!*tW
IC=FHh IKi1!*Zi#PjdZ5jBSM5FyMAFLieEL5&RBJn8^SPe%*q*$:?!+pR!T9H6VedyWW=TtAt?:k1$eD9bd^pt
:R9i^H aXt?c&Y618XVQ<Fu9=:6RLt<hL=d!c*^#aS$Q\%1&PC$ThyW8dcGKmc^/@S+4N+*plZjb\Z6MB#jY@CI
TMc?k5 V1C**=GcpqyPihVn:N?hPZ9w*e&WNLj\Stc^WnG#+yYuWL>8lj9Z@QZl$9q=l<4H*DDmpa9LnwW:nkcW
yda5P1 :%a1&A1#+49<*dn!Bu>k%<$Du!RbpFt\i$%*lLI1T%$8RE@a*\SQ%9M\?HyL9^y&Jb@B/nea#9SX#wT$
Ck?kc* p^&ect=/Q!qWPwWZR+$N9R*h8dqlHV9!iDTB$1=uT9FmtmnVY\FF>69WXCXuBlRb@t:!n5hdNI&TG+9e
wRic?Y *lKX+Et^:T9AikCu8M4^QccAaAIXq#AVGVPKRNQWV@I?w$D5VI\WqMF*>QDaWAiND%pDIV+d9D:AGlkb
B<pdWn k6c8V?jLdZdJ8$dB!Bq^el?IRH<#ba>JJPuGMFp+%*X=B+:B=uwT&VP$Ka+8w*w>>NJ$V>pJGIj=uMGn
-AStGh 000329945c7001202b4 Page 210 of binaries2.zip
CPSuR* BY5Glt8K^A<hIQ>t:5nnFJGYl96u!@4dV6GbFh$i6e6n4t<lCaV9?98E5I&u>T&qqV1cBh1\<$bie1yE
<q1aHc *Ph5yy#SY\l?bk/wJyL8b+AK/V%P$GSntjweRm!c=mt:wBJ14WD*TFn5Q6FcW:h4I*l%#<%6\Bk:WL4W
H#n&GL <Qb:c#<4+*K8HS6\V9tGY>kLWu=BuS<YII@\eSD<qR!AebF1JwGIFE9F89*VXnY#QV:FK*IB!dMXZp/\
i4/c8N qS6=c:dBLRbhN@9n&mjDHlGSYbRPLwX8RXDwVdXK^D<*>9<j4%Wm@wi?!\mBG&1XmF?9XTJ8>BXA*PAM
ujJ&AA <Kju>K<<G&?\B9l9+j@c49$u@J<>Y9??Fil@QXwFd$mKSj!#c<C@J<YK$&m+GD8+Yym:8Q\SE@8*l?#j
RiAh5/ =qZe*M*V*N!B^5*KuEdJ&JSGSb*G&MGMS69/d+j!hQ&HHNu@QHZ\y#t!@^bc?@eeYVn*u^<F@9cRh*H>
?ZTpp& Z<G!j@yFKB4@&<<Cj*?j@:D!=99ZT$QeeGu1j@9%H>hp+iJw@+?Z+8b+$=Z<%X<cL9mZK@tQ^N8@J?AK
P^Y<WN *DVVAneMS<*e%N#c++<B@j9bcT#?%&R:@8M<@?PI@8w8<A>iFDiM/N@t>n?t:8>#Kjk9e!u+V*QJ</?D
\D8GEA F:^yL6&huB^h*M#NcMTeuP!5Va*h4B$h@tu?@41^>Y>9/k&n9ZG?d9nRB?j>@:!P@>?/aa*1%#i5cXAG
T6u*85 *T!QIRT+@+?HD!ME@1jQGeG@dp=HCQ:!=9R@:<h@i*HnLuZEDjakj&ad@KMh#E>K$Djak@!X@ypNDpIA
&FVG#h @m9u@wp%CWKA@%hw?E>Ke\KIZ/D@&PN:M!*\K:VA#&nBZ/HlQ!qb*NAb<Fecn9kJjWNu\F>yQ9lQyLWd
JhKn^^ PkQ?T9@<<+Wk:?@l9:Lcjla?nBCE@^d>T/8N:!j98PC@Bl@@!j=H<QHjHn4@Eu#<>#LF9*&\88u^JTn\
NekYjI Z^**:^@aiHu?jq#Bj\k?F9m#iQLQ^:$y?QmQEIZ@VeHHQNq?Xwna1CBwMVZ*MAGj^ICW4Fh:qBBWjCkS
<@GC9/ my1TAAc1=Hj:b#hdaqGBkW+<I>Bm?>CPWD1=Z9pT:JK^8\&E/Kl?A>bd/^5B=QuFN1H^Fu:Flw$WEABE
tBE/5& BtM>Q?Wibq\$EF:VV9SA=4pmw%bL>bm4aSc+6@8FJyyaSJ>emK9@/AYdaVFG#aVNQLM?BntImiRk4E&C
Bb&A5? wdy:&CTkPF?Ql^IQ+4&i$nNeV^$B$V5ihDJ@5^Dypi8Qj5iAb#uVE!NRL6G^mkwep85jqt@GVHHi6=G\
+h6:kQ n$4tV%@jhZwj\$WF!QkWSMcqLS@JuK^?YT&QSW9mYK%>wdpEbS&w+$BV6:tptTA*tTkiR64pllkumH@m
^w\FEe mBItHc5:=w84jKPEbyV=wEIuG\/tM$LCP6cS>jDwQK8lqb+<K#X!ACdP5kAYy1<XM?B8B&1Vj%*T/cS6
nm+\K@ Ve&P5q%8+*+8MqaQtSB!6&&I9AVh#/chD&@#Fy+E!yh*Gmn9Jk#Dm*a6lQMQmcS8>pF\#Cmca?yMiEd<
8^VwkJ :Wc+a<A8q#BInG@cClat?i1mW1B4DQp+DM6pWSyVeRKGWu1C!/<WV^W1^j<?tIwQE4$WjA8<TV<5L1Vp
!BB</5 W<k#W5<YnFC=EuFZm?Y<S<5>CVMH\6R:4S\&RM1C>lKn^\WP@LPh!HGncbRVTtCGQhNeSm9c*RG1F5>B
:<ClY? TV+S!P>8P6GhbLC8hSWaVA/Jy^?ZZ!LSLBLHIn$#J>jtDI=FlZBtht6K8tA$9<&BTIc^+pT#TV\bhqwC
&>G/*6 #jk4GewSVY8HwWSn!DIWHnTTEq9N><aH9>Ij!:E%kSMIKM4yV>abyl5GaRS=pdh8BNQQd^\up!WHa:dF
JW<$XZ :G>WY6^!pw!8Q#dj$9Z4niq?n+QppE\$b/bA^d9ydVa8XDTFdhhpk5lEam+/Mynp%p^i91Jetw5h\6Y^
HKD\bN t<DGe?Z%9^<tVI^dCT$&=8@Gid4T>CaclYIdE=ItliL!WD&en#qi<hR+%RdN<&=XdHu!!C!YB/V4JdDi
n15E5B we59>&VPGP#$/KK5hetuGZ$DttG@j1Q9<T1A*@:!dd5Y<jIFET1\@m4CA$J#Ecd%MVmL%=QaN4lDXipc
@/><na lbDWHL6eY5!<an\W@yDy5QDyQu+q*+St<:T6q+S5@>\Y=J/DMCCi*k%1YDcQ&9d=EN^6/4n/KGl6+!/&
nP91p& ?YJ9EwM??bPK&H!a>WuGkhP5jNQVWyIWu18W\=m/VSQ4Njm>Ab#ndQ^hAPj^/y8p5dQuiB>p^Tlw?SN8
/TqEuq k<cbBaDb<<F^=6hQFhC@AeCw8m^5P8^M\kbi!%#mq:5caCn/YtDl*SccCiS4T1VRI>84TY:GDe6wDDJ*
MC<^EJ 6J#bY\&y^KyDQIylTh!9/!wdb=e1BQ%9WhBKGqYw5184e5/Ym8YCuBLY*hq1CNq:QBX6mK:qH615#GI!
5Z6%CT >R\u%@SAeMw*M#&#K>amAwS69ibDP6R1F*P*HPQHGKt8n?a&8<alIQ4D+kKQY@F**$cWCeKAY5XjnZVE
?\!p#$ +k+G>95\C?5b1KNmcydZ!n?IS>GW+<jS=P?H/G4VM>k$c:BHQCl$>&Vd&8<*H#\^iI$<yEQH1BCWJ%\N
:lEE@F %YZlut$Qq<#&a$@dFtLCLKc^QmATF&lahBy6/Z=awjP6B*BF?jcMt^?TR6?plahHQnkhN&Xn!>!^QLq1
I$kekM bYuc$RkR?dT&TS=kB$=eF*>6GaBHRy8L8um@ZnSupVMX?DZuwm<+4^S!ScP@u8d56##l8bbDeue\:@*/
<uYu+B Z1a=^j%CXX^>knSLDmhph?HYFRGl=G/t5I#$!==c1>IKV\\e1u6tZTjb//%QpA*6%@8*?HQR<yi4p#$F
e\AXk# hd6GM1!^YDEK98:9tqqu>yY9%NJ@V<i$1Z/?F/?ccWtkjqiQT>D@jtWJPYubI@=HAT1M>q1MbM49/B?t
=T@Duc M8:k5<1*+>tm&R8yMIl^F=BIQq#^M!C>ZXNhEQIy8>1#JkJG\ib^@y&6tpc=eKhF%wdPdJuZ5wdplWSb
<nG@pI t?kknX/YEGt+aTn*46t^ck6mb/i4mk*NtV%68w+wymV8e=t\&4RLHC8tw4SylMI5+$qm:RiDRTNX%EQS
aABQjp 4y#bQn6bBmY$p9uHcTy4dL&\Rbw6I@NEk68YR<Ei#iw4P\p$8hFWFIqaFpNbhRp8l@LNF>/pQ4#<F=QS
Y@&5uq <k1X/e1*YF:EWcc<c:/MyIVu6SLbjJYdRFKa<c9peDEBS#:/eHP/a19^PRT@KbEJW4indHyQWy$tG&ih
Gwe+R\ +N/L:=idJmb\ZW:KH^yZ!5/Jpa:tQqu5awH:8c8\6$L1^hCwm5ZK!Y8n@cn+/K^Ze/XIVyw?q?klVt6m
lJ=d6u \Mtc=X8qMPM=%A6C<1%ib=l6\F=pXV4*XIP=<*5Qk6+F=kZ#98K#mMPwCQi5I*QSqq8!R\=?8+aQy4L*
p*RB#u M++Jc@4Lbh@Pdac58i=Q/#p1LT=NpISNVPcXMh5@Kjl!Jjj\1/en@^q*ByZ?4hFYdtNYwp5#WJuN9umJ
LKRLa^ 6lhy1$EKdd*t1$$q@?DAhE1%KQ19SVLEuJ9G^!dq:+NyXP$<hSTFQn6hHupGLAG>5HFB64QN=wAm*S>&
Rq>&BG 86$5B*\V<#9>ckHSAwGSdIP#<5M1AW6n65tLEhP<+wcbV>ycu*Pa^pPEjALyFFZmjP*kHb*??*^T#8K=
NG6q&* #kW!>^K+u=e*B\ycGe>9Bp?%P&QMD:WJ8Pu6ed!FqSBP*@I*L4k&nSF=<JG*VMcAKDk>?b=Q<=KK61@W
9?5C%C ?19mZEw9K:6N>e?Z6==mnhJGBkt99\&/KB496u+!yBnYuaCBFqT8mpi:P/^Dil#?Fba@tn5S:8twXYp4
j&G1Zm B&uV1Iyn9/9wp=!ZJ:Rh^kN^&?eehub4DXJM9mjG1>T&iPbe+hNYSMaq@NLtbaj/W1%nZIll9dMABHQ4
KNu81+ Z1Pw\?P:NS::R!6LPZ^d::Ah?h=c=%nZ1SlltqDEt:Jdj!N8j>kQG^Fy$m\=/1B#+D=ey\P?Zw/T@+lq
WqKqud LWCQ?Py4eq<#>dFti#yFWucQyn:^9pLp8kA=nb:H5I*eP#Zui\ThwQ4SC:9hX=5&D/6PZ9NK5Lu4?:TZ
ld8:*i ?*!8IwBQX<#dm^4EBc!<Xt$PI>6=Gww48LQ4<F*\>E\CuDd#VH^Qudyw#$CcPIZ\*j4!b+@a+NVVW\iN
HVPiKR 5d**w%5XnLCAum=H=dZVENq#FeW9n5KVI>L<VyRcXRiyVGek=BCwCkiLkHYXwHFl/$Pd@IBkWFjHBM&C
CZbBb+ LPpJAi#KMiadYF!*<L6H^^CIc?j$PGXa8jCHNa$9nh=$uQTZp1>#FS6ZV4\jJE\?>M19HBp5P?J<mGWA
ER*LHR PyqX!LLQnt6men*e5mc1<p5AVVB@DE6k/eN\CE8B&BM>m&1YH9@?ycSn%C+Aa6iMBVRdMnjG6VC1XR\a
TjFtci Q@AaBANHqhq%P4aRNl1P:NjZSS&QR?$<CtpCqB5F#d=iF/^qKRaMh!DBCmTE*YcREKPcI/Al/FIZd=I+
yRYI&p /qKdW:y*FE&Qkd*ItZ*wyHRW<BLY//XyX$S\%KeW#:+cjRip>AG+6>^581G\NiBZtjbnFC?XL8m<n%TV
K>qPGD *t$&G1ShD1aINpP\>R%dEJ$H!Wa!pV?$<^N&#peyLL<CiK!yql?\mFclbin6$JnF9\dR&dW/R*L<D8IG
6KXuK$ =R6G44AmlFQCR=aQKDAuq=5I4/k^\/cPmB1H/Kkn6Gah!4QKX4NK>S!STLALkFIN=$8+DTI+VWa1SFCm
u5lJ+y MwN?Qp$X?hGtClR?Ve=+nG:1Cl$ywWB8DSLiI>qckAYGRPKtDBtNqM5QWQEcQ*4uyJpim8YFXW*iH>tc
X<iI*F L&b$b/I#T:VSGIVP%/Kh>GG=nZQEZe6:Rk/bli&!BbBhw!HGDPYBDMjwlP^4E<=WJJNe^L!%EBi#:n+/
>Pw\V$ $wt8b1WVld=nJmKnCc=tE=y*aKJ>E9bAbqXL64m6*qGkN=GYL@5/1Xwhw$RSp:PhQ%*acEI==LlRQdmC
p>!iLS tbn^=TF:m?I\NJGM1#c@eKTF&:^uPBHWV@S\EH6uwICPbEwV+k\hV9nGwDbkwLlAYQ6\JN@t89#yJ#A/
EX1=j% @=SpV\mc\$lMpX*?Z4l$XMqA%QGS@h=MTHW@&XaL@iD1*6bHIye1G46+@wn*BQHG#N!QCdPZCIa<Gdb5
+FjGTT BS#FBM1uSYXGBb\y!\wVNG1V?Y4QDFV6GT:pCFFmJBQPJNM>HhMD=*!%E=BAcFp!j@>#n4KpSCIjPK9H
TR9l9y K/Jn\849+A9Y>eRJ*jh8S\#uaZKVk5VbRELjeJiu1DnbaY6y=b1?A>=$8lIb:yGi8mGAmFXlb>SqWY?A
j96SNH FtF%l8VcAZ9jbJA<a66DK>>6hH9!Fm9=iBFc864=8FVZM^l>NYATJ8uYL@@%l:PYw*\k:Rt>eM<$m>1<
plKA:4 Jn=idP>WYX&WYV!6wHpSGYF6kKSdDpj#8MaVaBmJ\EXYV\?@5IVYeNRCA81q#9h/\5YVc/y^kH%?JN9A
tR<Rb/ A11t/QRF\6BnRaJl\thnkD#qC\\H<%Zet$\C%%/\V<<!epW!&iWZe4Rki>/BPemaE1Qc<L?w1XWI88+W
Q^R^++ cC1wcYBV#bLB!9X$n=wLZZ\+E</H+%&XqV/<1%&D$$qQnYhXH?D6hF64TX>1\Be:yq$/bqPLI1hyNSQY
8IcESc ?$\?4e%9Bh5!%RyIKa5j11Byeey/^i@wD/X>PwT@n\p^KL^E1Wh65Z/P+B@^My4j*K@Z8>w^LZq>HcpX
l4C1h< MKcy%!h^Z#QYMLB!dVCk\d$J$=K<kFH8wj5KlY$TiC!TVFHc\i$BKF@Rajm!61D9Y>AG$Fybj@c#VmW:
MyuBC% @+um?&Dt%!/CFjViAS$Su$NlKqIiPb\qK5HNP66ejNWBJe/Jn?cp:mA<F6a5qQ^$5Rk/KjBwt/RW^$mj
-At^#e 000e081dd2d001202b4 Page 211 of binaries2.zip
:E=@ZF YeaWR/VWut#N4KjE%H/Ic<D>m56kcT*#$HBP%8>1Nbhl^$54Rm$q^H#5>58=bB6&J*&HE96Ah\8JeB8Q
L1h#J+ !l^Awn^mc\?ldVPZd1&&Gqa>MtZpdM1!1lGht^mhJYkNpmabWnZ%FB@<c54HK%PEk&IJE9y+q\lpcCby
1R+u5h =BY/V4iZb>:*$m^j*pyb\HW##Jni#V*Q%EY1V>BwaEiY\@q>uCpb6EJd!DLwA=k%HG>j!KWpbCdJS6YV
/i%RiF XQC=hI/uQDnPL=j%@LSE5M8S&4jHaP&>q1CWJ=&4qk:nlWhS$wT&9<j#YMi>^b/?=ic\FNAAdThtYL91
ppNn+i !I6hB:>BQ^WX$ch5=RH5qH9$H>cW\!#IDlKn!K\Jt5@G!%@J^b&#JcYZSI\4bKRTIBMnZ*h&4QXlVTYG
L5&6he p!eiLmjJ>><8lXtkDZZ:hdYMIF96LT^6!*%nS\V6&NNBXQ:8QV%ApRBy4<mDTeihuYaBhPWlM1c/C5bk
kEkHTP 5Q&eAqNhmLLp11G&mFh$mA+#P<VDP9SncZY\la1Wk%aV:@u:GRPyCF>Ze5Y!<Rk<L=*=Fk+yeCVDC#yd
I4Ctw! Gu>#j@L4=le!w/dYqbyT@Ew+=&4+<\F#iT=DBYHQY:<ED:LPX$=EVT!T:1DtW\dyl!\q*ZEkJbBA1\HA
N4J\NJ wJ*b9CMZqytPy/@TB:eE/ic<#IDkRFi<qGtiGLCAH:m9&NeBA^E>=R&a&E!N9:$&BZ+5mIW&/C/S8l<L
LkPytE RkWZ?aVewqlVVRpcD*CP>jF<uNRdLIRX\CF??!i%Y<H@#c$NZNI<QDV@F99=*/:yC9$Q?^\E@qhQ\V@Z
EnGE*5 hAY+iZ/%y96u!ibjm$\*YCu<tW::Z:8KI&/\W9k4@hNT:k%YCu?qj>yneaPX\q>y@y<Xkt?\W9k4@VNu
lQVw#y d<RNXky@yjpEj:JuV$nkF&li*y?NZQAZ/J@ZR+YEj8W6?+uLm<A@h?tk@mHK?D<Vi\Z@aS?XAA@QZ&8H
$yqSPa A9@ad9Q*@FBBd5V@Zbwc$F?&*p\IS1pWkDHu?TAHFmWFZPGi%tKl\kP%VwwNm&RnWn%CNn*TpVRC/WEW
RnaJS^ p/uheJt^KQhihDt*a9pkR48Pawa1I4#&$Z:+C%CMkk=Wb8eDttd45CWh/NlnZty^%\D1W$X5Nd@#=EQH
9EeHuX FHh#SA1:\SDQWSm5D&m4#n+C\GWLi+5NpZYkcFA&$65GRCSE6%5+ZEM&knH=\mdAJ*T&wGB$6LRXRE//
e9FE+L AW<Rlw<XT$8q#\VqK%5Z:w\*#t*@bN?Aw9yPLl$XCB!/l^KEnWSk56unl8SICFIACJEPMAnw$ECwkZ9m
MT6?>n A64q\H&\H1Lp6LjXQNWtLkA&^8yHADDL:MmdP>GG=qTIlpW+/5ZRy4pXc=nX+eGaSpN<$Z!GiQDk8?tQ
5=#CYp eB8tJqV=8/JV>eGkQLjB?#EX*Cm?cGLJYYGqtabd>&hG+=b=ilLdwpSnTQTnbhW$9pT6D5NkuZmCD1+=
hF*bi# /MX+#Ydpwd!!+R\%\&baQ?TkjF^Ma*qPJ%8NQElu\u1mNQ+HkMaq:%q%YDI@c%TMAyKMu&<kpWDhni<i
FMMwiC /=k%?<G$kl%TdeLkI/ASAR+eDu$<Q9i6jj=hD1CBKD4X5A1*<c:h1+BGPqItYd/y*tuYcD1uej?ThTtn
@?%1J! CVYmZ1%b5^#p=hmT=&F\/NIubSW&jl+P$c*qF**YTcaLYGW8\dA9GqA\y6I$:48ww%JT\^yPm#F?ZR>d
i!9eS@ w#+p1ymEX$%amkFh!<@<:1Lh&G$Kjd56^qpCVmX/1NZ=<kCFt6LJGA\@:hy5Yp$mj:9BT1V*qFY!Btt&
YFak9K CW+5:Lh9W9Kalk&:j%WRh\AuWeMe^CI%G*9cDa?dynRJ$FtPZa/aPM/WBcS88^lT!<B/Kp#9VeFu&@i:
d>mJ^j Jm1BY^TNjJJq$<hLH??&:#TEQuJ!51?M^RFkyn:#qe^>4b9t+K6n/V6^Z8W\*!M$jK<l^9jMqHXnQymS
Qu8MYu ApXeeG5kCLNITEJHX41KwjD#Jy@dFXG/IcwiW$R>y#H^wdnh58%*$@DkIi1p/8<b6R!CnAWN/VJ:KY9w
jRkkcH bTC&cDupGa1kE@MQl\5=SC4SANm=WihEnmPWYC*=WYe^1n1<PCD=uN\anXu9LLwuZWeu^Tn*PSdPa@6Z
Ph@H9< TVI+/^GGu8ZBZVuT*C<%k?kCcQ!EP1Hh+G+1qMFE!%aD>#5C/8E9nwYq5DiY<:PQ9KX=mkHqL<Vu=>Z1
@w+\Gm ^JXLmdC1*1a+ntcLIWdyTR6$VDKY$m\6uEhk&CuC>uitmK%HD9nl$qG6tawi$TGq@JRDi?ML$%KtjT>a
c?yKaM ?//&e5t<R%Way$TSTYPVTu!W^y\eec?iC*i8YA@Kq*Mk$/XFcEeqe/%Xu^n*EbN@%Zwebj5?E$8M*PXY
cD5!KF hyRW@$B\ZF5@QYm1\^WRZV*VN1?*1bj1FmFukT:ucpCqqDERC1Xp:$l>kmiGbl><h@RXn+W?CdpGn!Iw
VQhmZ5 BDbtlL1XtpEa5n+1i%jPZ^nVX!CEed>Y!WkXpH9J+k<Gn$n8B?Qi@XS1Hj*$tWw!=MehY!%d\uCLl6:5
TcbMi\ PQPNGjj^J<>pJu1/hQR1*KR#X4nNc&S$&%!6i5tF/\V?>qckTTcN<KJ1bM*q=lQiG#5G9aXd<EmRWibl
%nh5Ap kYJIWH%?R:wGXPbVudueLi6Ct&Z?n/?AcnJG!&?$D/um:MhiFJXaLChJTTdnViuYa$@V/=b?M?jNKXZR
=NaDCl a#Tdw5Vka:ZttG\!!85&He=q+B/@e#qqPthk+uNyN6JbLG$J+YYG+^p@DEqi9=WpXKp8*iequGhSi$8@
aT=MtQ PLHEyP#FY%e#Maq%?Waq!cd>k\P:jI*//F5dydNcKi#mc#WYBR?4=%YWXnTFpm%YJ+cFIJdJdjj1CZBV
cR=8wT /@Rj&wA%=YJCikVa4u^e5+IKG1P@Q\*yGMDB4Jmw>@Pj9BhbSEWBZ>cC$K=TtVjbR9nZWEP$@W$#nCqe
y?%lR1 <QwH5wyp:P+J?8!kJnuiuVeWPyQ\!lh%CL=bPZH/e\eNpY$Hb^I=$Va>IyPy&>+S6PTe<Pw\#bZyeCbK
NQXQGS RCC5Jml>9/>nTDt4a/DW?iW=JTR%FpPI#tS!d1W!Ne!Ki/#?nX>$Ja6plSm:!STDFhF?nd\V&EeFu=6e
1L6ZG6 k9y&w5*hTIatiEkFSw/?6j<Cq^%:<cI6*6CX>+/lcNTWWk!wl<Xy*8S\Y#LF*Dp18:PmL*nhM!+LpApt
68iQYZ STBuCR&ja#!BK@GSF<>hq?pG*ZQ$u#6E>L=/DGN>?+n%P!jXZltGIbFje\T/TlQJRySc^DNJc@5/VIdc
B\baP? VHlM4JYN$c#%HNVGPaJbk!V=NeKc@B&+%p@VSld?Xpp!*A&pH^p#KYuwYY9VAGp5J*$mccu+Qe4Y>a#P
5Mel/4 Ve<RkRX%5C!y#D+6NJE6ymQ1dy<G<YtSn\4T48l>DpX\C8YcYMW+b#hP?yW6?kj+GiBk\QXCJ%aW8X#F
tlTiL1 IB:LuZ=^*5HM:6/*N9SVF/6JQ#bJH#ju#GK9cGpNKpjQRl+yL#1KXZI+jXZekYDeVpj%WS^ecFAZm=Lt
&wZ85Q &H\$8*?\Gn@B@^YIR>1qB^$1l?a!8=aTBnGXS:Wp6pX+<Nk:!\bcJ1\54t+P&<6\^^mXDIE$>#u*=ayt
#NBWM= By89^J@ZVdAX=^#L#Lm:jFZDhe\a!nIJc%$yeDjpTiWNK=uWLi!yh>CaeQYpZ/e6WqH\j=:tePmAR^kM
5^GuZk PyGm+9*aXPbVi<4@NDW<E$lTGT^Tad<%thKb9<t*wkpcQGB^Z^C8nLG=hTwu$QkEj=EWEP&h>mdnP&FL
>meT#t TZDV9I?=?DHRPennhqC+SKll&L=np%u$^:FPdQPLY:Lpnd1EKZY5*qj*&q+8Q8K%p@A#N$^!IR>YKJyV
*HML@1 it+Ic9N9Y+kq54>H6Katq54:&i4L!V&b#1&Y*An?%^4kBD54ki1e6Mp/nh+aZ4Z$mG<eqj&&Xlmk5G@Y
E\kH%5 =q&:YI*QyF!tyeV=XjcPXL^nC%N%ADRIB8w8W\MLEBic!8iZ?^19VA*!V1/dMXEIV1MIc!!W+yBE##tw
9h/*F+ QE1BaG86+EDBy8M:ZaJp@mpcnb/Cnh/Lap&$$\?kcpanlhyy=JAl*XQ%dDZ=c8E/?t16PCyM&^WAKtBp
kq*b%b *?:BKiY&XM^&PdId=/pKVhiIap@=eaSniP%S*$/QZZNQ$FjjPB6?^b+em=Di<51l5&KRuhQRpb5k6MPq
@mH:Ej GpMXdS?Mjd9QI1M@9Lki!891>LY:Y9GccY>A#1Ij^$KF1SZAZnnAF1itKEB+%Dh5q@bqY/i9*G/pa/5j
l/1!LD NiMaBp&$weQNa%=\!q:wLi+AHAX\#L!W5A1k$\tJuqp$6R1VJ\dtSYXlS*\apH+Z@lX!QJNYacBh+69V
k1M5%D $Sj!@nGy*>/Kw4Cc%H^PdBw@uSk=Y^#@kM6G&Q&I>?TTFYMH$8I9#TFDFwWltFcSECAE8dnJW^5iA@TI
<@dB<% 89RLa\<yhmS::&Wa<aEb#c!1\/wcpL4NST:HQIFZZH#F%Z:ElPehK*#lmNcER+#PjHVEYj=!9Q$#&lAY
$kFwpT &6mJTlmAT>cjF=4uyNQNVZ:k/HJYiu56p99LlLhp^Nk?W&$juhZ^YNiJGn=BbTK6w>bILiMHS4enLy9t
d4KyWC aA6BTNHhe>>>#qc49Ykc>1EhBX=:NLWl\wQZpWi/Mt8/A$P!EL$hHKC9FLhbjC$B!m<NL\?h!WY%y=R9
eW\%>Y nMbIdeA4nutMt@%AQqe^:AmWjiaZt!CR*<ReM9e!&N6LPtH#$JFh5qaN+l&<hT%j8@^\b$PIM=\TWq^K
wZwKhM j+>edWM<aTemGKji8b5#nnq\F&<T1^1pn1i<h<#XZ!6\kW/jTFTH#%qHF<*cdcbXa9FibWAQi!Mcl#Em
VmYd^G hP>b4Am9w>en9!:*:tjehdVB8/#6i@YQyQDlc>&IKmMRX+L?CKRyFI5j<IPKK?WmGC4Xwchjiew%NRa1
=Ni?Kl ^EIpnA6h^IZ\%4+cPPdn6npkWwBieDD\+jLZYZKYj+eR+&q9mkpRT=9$%In&\&MI^dji!:BK6!=W/9Y/
YAGm+F !CDMn!BYCb9HM=pDKSBuK@D:<ljHe@bGi??piCQm4hKeW*J\VMYat<T6X:MacF<DGTHY%*9^TcGe$m>H
n=1^\e G$@*VLL*MnI6utLB!CQmB!!KHeJN4TX*98iFq+cPRF@YJQkF/WDGkC5!RSGYJR@Ky=GA:NEa9VptNRX:
:+a15t ^qin<?CSd^#I1cpmFkai6Ypyw?p+9Zq:6!My/N66/cVke%<PFTCnbET$l8DI&X\jVDtTDi%!A<=tl/1j
R165?4 4/@YXS4qjNqSQD<%E$I#b%yYmWl1H6&lWIF@WWnKL&IHkpe6=T&b^@LE5&BLeqchD\chwpw<*uh44Xt!
Lm&Adc >ljn!q\/da\8CJycdib@XVm=h4Y+Ik%:JbPWTJXRGR:Db:GX%+ElZlwl5>?9$%6nKl!VTW^W?wZSWXVK
F4/5QJ ZyVVhM</p>X:$YwI*A1&FHVAP4%TpEnY<K<TZyE^WNP+jjwieZwJe8R#lCGN:$R\/$qC#<@nV1wmQt>D
R8%6N1 Q/4wcI+HHHG%l<jpk9I@KCewc<bCWl$K4<=yS^1PS1w545hYV/dTd&>Tm&RZ9?HP+K*WpIuS\*Q!t\T/
M6^m:p iPXb/lbAeSRK%VCSVw$KGNuI/R+:%Dc>hhJ!Jy$XEKED\PCpRc//n*qjdu?wb/8>l1qcYkdyt=%$iHlc
pV+iSH ayyLy<ml>bTbhcmmM=#QDy&+HBbbDu/F=HpQPdat15$9cuqcI!1H5Sn:ENGtY:YbbmQ!=y@+l/=%i8Nb
uuMVy$ <blHNVAi:Mh6%*>&:Tth&FSX8Xm#6^BGcdKlcJCJuM@XKk#k@N#:TaNK5AEVFMTZZqAN+AEK?<:ZdYJ/
+I#<k1 tV<*!/ME>uy/4PM9eFh?tkD#YNEw#/AlJFTq\q=SALqjVDP6@MISdK@ClKeC@/BTRYJh18I+HjIY*n\S
-A9KDd 000d5d2ffcb001202b4 Page 212 of binaries2.zip
pu\>W6 YRtGZTkj=KlHJ%T4!tpRK9LBHduCbLV&c$&%DRTaZaKb1$Q1SXiL&!TXY?nhm!N^WkQkwyHFKTAHILmp
JcL<NZ %>LKXR/tb\bZ/?tmD&BYEn+?y4Rd1M!ZIne@Yk4>jL4uG<Lj?ylqt>:?ID#i&yhIipZYqqRnXT?/A&lh
E*@wmE CqFQ!mTyVT4bYebE&^nD&&BZIyHFJapX$W1RB8>!B\6WTY8q*>KBQ*\:X$5kRp/P!MSFY=Y&JaQ1HIc=
S+II%W yBNFQ+MdIJJE$#>+dApaMLm6W=%QC+KW!MJ<R#qiP+\<<:i>pl6$i#QwQXJiSh=aQ/k+mB:qDC*=SuKt
Y/FLLj 5?!tSH\$T5^%bP?ibWq@Ecd$ABSqFFFAcN:*%4>=LFV^CS*$R\hZRHl#eh9%WV@l^CPcpMhu^WQZQV%&
==JBXW VlAVBlK5tmh&PaFHR#%G1=AS@ekwy^/:y^jXq#$p$\>t*$bAM?<M?nB!Q6L+kBeZp*iZqQV<IER=bp5q
dp1mWp 9FI=yV\i$9$RM5u\TVtiwDbV<$9M?CPGkSKtRLQ*jBc>=/y$5jX?iTdu>MIjiymQ5a=%XS+>=+ehFBcS
^%H=^L 6Emiu$\eXt+uW#^XjmHA!yH/aM*b5LiEZ^%jIJkSDyDk*l*Th:umIP/H8?L#Vn5@TqTTkS*=JeypunPC
HmCQj1 myW!%cWlFJN56jQ^/mRmF/P*atajpZbNjyyS+$P=KFjYEd@lY6DKi#HYqAl5DhVpZjnRiKqZK4SXh5HA
jWMA<q Z@qDADkqZ?e5/9:n1i:BX&ey>R<dRBL^cHK<mDAHeM&#aHmTbEMpJL<$/&NnpH5V!TX>1CD\maSjb5i?
yyi<8L VC1QH8XnmZl4Hd$5:Z4YmIRN4&b5*?V/u6HDb<CLwAFVKyByTNIDPdKVmCT6EJ=*&8GqITZQDc+neX<I
^9Eh%A !qX1AM5Z^RD*&@t#y?8a/\D6n>nC&tc#<$^N1@6?WQyNX>8cjW^YuD*BE!mdTp<Rh%e\1W?uV#n$!I65
ZIDaK% HWpIe9H?YDeJ6yVR1FFd$MPZDT9?w6!$=VwYZ>X<ZM?&AYbLcwC!^BiK%/8<=y8qdAw^?6:wGVD<&Ip6
Si/uM# 64aIqh?1YS5b$<mAZb98ByiRKTRSjiM8F1G1R9CC9DBpF:>&&p:u/^QWN%K:wTEFd\Y:*yn<JS9VXDkY
G:M?9? 8\LX*M8qqq6l?ykyDenRTKk19beWc!e*GDRjM<^h>D!qQ6VdGZy8h<*8N66L@#KwWeu5IlLpFH=&Fl=*
!a?pI? udNaQ/JVI^&ymeY=&cEq?qXH4^:/KZcy+M=n$i*HA*^CWhhXatmjZ4a=DNLL/D+MuyCMnjmTQHJMmwuZ
6iQ!Gn MW1@nPZk<EL=bPVH!Zc/elG&R<4y8XNbVBH>&PEnw^+nFT:n^$@cB!ebPd6M?9KM^9JaCB+i5Z#Kc*E/
Qn4k$A +QJQDYb?baYNK^*Q8#YCPpttP+Ne:W!#JA94?npmMZqB&/@RGF=4MCtmky68l=SYyhBWHb/>n=$TI<lR
&F1b8h 1SC&wRZT4qu#!J4k?E&yBqNQp1b\bNlyTMEkcBPKMh:P5mak@i\R?p@^Nt?ak&9XkaT#<w$ji>qt\:>N
>k4w&u 4!D>!lmTHjB<SCDyEhKlaN5J\9wjtq:c=@eDucycihQ6I$>NLNjHQuWZblLylWqB#S9B&c9QSqWaapZI
5EI+8F ll$ZLiu*\1@lYK*/qmyYEaIGykd?AJ>qm<?9d%W@=lbd*uFj&R?Q8iT1V#pyN4ZadWqdJ/eJK#/t\pSK
9Hn=D9 VNZulTW8lu>>tup&VJKhXjlMq!5X<1SFbk\c\b>M^jLYE*5!NQ148%Xli/CK:JM6<e^b1Sh99JbXC9MJ
C$$$$: \&YLId9Vj5PR>DCZ$CHIt9e#wwpy9#CZTBLdwKYn!V\^4j%Tu:qVi19un=%6RkTyDD#uqhQmVujw&?PL
ecidQm N+:=D?C4RR+p5pFT+y\kJZ/9n##cn:i=A8mdTJ>@Z!qJkSm>K^ZW4k^?WVu!6yhiyGM5ASRyX<&Id&*^
%<cm$D 4TH$ZEPjJ&a+ylZHyEA+G=\8d4y/+tKV%yS$/6+EVE?ZwH%JX!>mYL@6W:@E?\19+KpC^jpTbd8FXcKn
hYRk>* TH$j?qTda9N8uYSMj+*jQFlE?JZGK\#luHdqlMaHBLG%an&9XSi?c?lq%ayu/cSlc81Gj<Wh!\%hNTTl
y#m8WG >CGLEjLd6jCLLyK8BZYqltZPXpkp1!J/CaMYQcpe:u/TJ!T^H>dy1R%+8=t#mR!@B9k^T!<@@^:C#L<F
y1ecA: Kp##Lq6QEiGP8T6n=SK\15#:hA%hHI&DHD<Ep!jX4>kVGBByEtme9@NHH/l+aHalM#N9V$lZwJ85GV<M
F&R*#^ B<##*m=E&nFe&uRVq>4Qmqq$KI>JF&$N=RId\!JGF?5T@N8ZhjPy+k\6je45MJBL<*+I9XAwFT*eGht5
#+^TIh 4kaq*8<KlM6L*W5e5c/LkM?=C=d&tb4M:>ZYehZ$Fnn4Wde8*aJT5YI5^1>1CeR9d6S+%?VQ&>YAClFy
InDAny t5$wb?E$M$!lphM:6:ypV^6K4yJWLTM!uii6BkKquwi9SV*QcD>@<wl$wEF\j>?6YD++GaB1J8<\RRTS
LB?RIe j=\R<^5m^A9BA@E6G&YjJyF9ty1K5wV+B=TDeuM^aKaASMp6wYumX!DVqH%Fyjn\KEe5t5ml?^mBh@I+
4@HEpL :q#8tWJQZc@Jk#GFihBm8Ytq4@IG86t4muAu#NGm/NJ*+yuEdE#i*?>WyItWwE55nam^MSQACYcJ9B#G
W*\+EJ kk\qha1h+i^m=dKIe/G%q%=\y@Gi4atll*DnH<Kp\wi!Kbk\<+pEB8nT%p+an49hADm=8cS?jnhJW\L@
dpAiB& :BV%j:1VViCj4cd?G&wWD>>j%Tki*q>Yw@=hBQmL9QBZVijjl9k4iyLADh=Xj/X@ytWJ*PBh>Xj/D^?b
dbaQ1P t&tBZ/D=?H<t1\n?A5$4?LN#C@$C@XNFTPAG</wdlm:$p&u:b@M1%H?\@=pm>QeN=Q>LEiK>TSH/S%84
bd?Q*J 9!6CjD!I@&5//%*?j>%b4%Zq\:R!Dk^M^%ZL^w6%Kcaie%jQ@mP6>iDj$q4LnhTGtDuR$?dkj*VMR@Eq
dbZZ$Y bBhdPJ^cQ#hW*t$>cA8GVu&Fki+1mk4\TDklBZ49!y4A5DACMiw4uE^@&lN@XF\5n!>bDtVBKeFADy@*
kWDaRB %AKkCj^EHJ*Ip<aR%JpaTCHTF$Xie/TAVc+a/KjYKyWI11*HSphPp*F5W6FVnE%*p:b!%K$liZ41+Ad>
T6cI<+ E/bTBL#B^CK*?Z1uN#bcFb*tXRY:8&8*H*T9J*&TWet^P=Tq>=emkRM\5\$G8VciIHttuIQ^!WGt9q\1
*djPJ! p8^RXFeIn!?1QwV+1PtiNpu1Ht\<5d%JWdYeJJBdWdGdu=GD$^V:XpRAdV5=<G=4C:88w8>aR>T$:**T
baI9RA <ZnYuWbIbP&Xai<e/QL%LH9C8+e/LEd1\4&8dkjCB9!n:$TC!:I9B#pnw\=/ty&Dl\X=NR/b=H6eAchi
X?@Tw8 qjWV=tV4tun:HD!j5F1eyaaN\\a*t*QuiA#tV%RWN8keSCKXplyFuFh#EqddDEEGl^pkh%GlJ<HEGkip
8TAyZH YJk+TKE>LiI:wdN*kbkbm5/6WFcA%4^S84^NdZYF@BqKXeC+^tS1MDyRKdb8dH4tpGm6L8NSMwDK\:kS
4PKSaj *M&Ic/C#H5pIQ%1/wu#6JIdF#*GCu*$PFXe+y1@uiM?lGkLW\lF4PDPAMQWEW^ny>ei$M/1T1TW!\YEG
9P&NSd :X?NZ>i/1Z*8n:+HM^LkFLR//bVw6Jp5?9k+FE9+:aqDbK6hyK>8y<il+4*FZY<G4jyJnFCX?k81d:5>
5B&#j9 1m+#C&Zwiu$NLQIJkaha=ZY#CuYT/+yVuS=EJ&<JqL@DDT?4Gy@6pn8>j:4Y<N:Y94ZpyX1PQGiPFlhK
Em?nDS L#XLIiAy&?!Q+kLwq#Z$YFC&H&<P:T4FI%:jACnHJj55>Q*E?ddLKA6MnMEhR!eDADy#X$L$&$RP%^aE
Hl&1%5 qY:X%@T/k>d<&M&K8!DhJFnWtP#*@RltPVGt=1n9uJ5<+@^E\NeQ\F>huQcyMQ6KR>45V^R\:^5Qc^Zc
9@:%H! 9G&aYBIeNlw>kLVEw1LYL+p<Jy#Ped<?yKZ1il^iR>m:e:KYIiRa$=p9AHVVmw#K5NGTb+jKM8>R$GWa
H?T?lP SacdRYY5i9RtIyN$iM:+Ty8cWR4:n:n/b?&qNJ5VZ8I?p8eI1k$m=edBHGLp5T*I+l4AI=jkhk9nYlq?
T?Ei61 Rj@\MGGb&K<R>BpDLi!=qq1uGpFuFDc!K!YnYpQX9Qi?a5AcNW#NTR4C1mt:EJA^tijm$6uyVq1>R>*N
l#w!I< c1MTh+Di<nnZAB%NPqpMX#dAL?GEL5jYPPLKtQ*nTGmlp&MGeVk=Nt+G8eWLP$Y4KGHkl#Jaj8hdW/N6
qc:G+G P:pbEPkP^yKqYq^4%/WwNe4GN$w?J\CV=D^RWZ@I*cGbw6MnDIiKH5\6?/1PLjnbQid/>\+Fk\S1M>hl
EF9SuL eXe5EnQw\JVQ\6ZY+WVbBaNmTG*SqE%CGV<FRN@pVwRiMepD*iw=VLdRYNu>+:9Q4tTF?Bp!NZd#TlV5
wb$KY! *45>b#4cVFaRBcwGj%BHiC@P>qJFZ9c=c1d6w&5\YERqlVeL/T%uqMc=JVMWmGpIV+yNh1<tn6w:b16X
1Q:=FH k>YT>D$WYCp%Amd$85&eZMN!5/Y%qjeWmc&euSlNJHDZDNV%b?MhTekyTDjq/hnD4YIjJuJQ4NnpjRtI
hK8Qh& W&KAAn9ti$FQ!qWXANMLR?L/M%TT4mtjF9nyNR!mjBLM?ItpbbKcT#E%WVE:!qIaGGMF!dy8iFaBb*Zc
W^wmGa RT9qBcY%<cM@KAT!TuE:A=Td\CIG5\WtJutQ&P\>?pp8NElwq*EL\qwd!iatYSQXW<JHuARqaIKQcF1b
^!hh!B Pa+46\S>\mteuCNh=6ZRlKkbHpj1HVla^:>?^+jXR$MS#P5qVq6!&Td/>t+C#*F1W\:>9TnCAM<uLD6X
+T1!wH /*FD=M:G#m:#E#CYAkZ&k\LtV9N8P9aZt9EetGDulLK:bu4cIaqy6=>N6TmaF1T:<DBmhhjqjtu\K9bQ
DuDib* qIJ%Z=ePqbQ1>QMcQDM8T&+b^Y1L=:+&:$&aDTp8wk6*B9B^KK*+dN1<SJnb6c1N9SQdQu1i:IdyyPLj
WZZ9m# SYMc4P&LweTqqm4AFtKR>6K/*H^IkEb$<?9#qE=J+ab4%\hpIN<X8KqE*yW//*#WTPPF$qjp5A<ck>@1
jVlA9\ m#QlktS?+VYGu1%lqyLkS<iM4T&bTjw5t\FK89=9y+Y@SyJC^k&H5aSFTt$dD*^dFM4&tw=FSp^ZZn*X
<q6jNc qd6\+e5R4/Y:/<lS1i<?l+>Z5uJ4kQ%5wNN5Y:=tp5J=8YTTHCAWbSb**q@ZNkAd4Y@4TDyMcWZLM#/4
5dj&Q< q&8tSB19AZ:\>mIctCuQ$Y6bnEiaBy%q%aqLGy6ZFu8Y6kq6uP^Chb$ne4eiDV+PYh=b#6NIHRSY5&F&
1\H8?k K@4ZhBV%ZCpjjH8#=>9E=qJj8\+njn8DIDVI&d&uppYk#MN!@uHbL*EMj>A:DqD*NA>6ayuXVhuay:NX
8wT:J* aBq:q9KS?Z+tN^RaE@G<=ct9S99LX8eq&N8>/G>A6IXK1Yb6n%1?QA/&#E+J\ii\8:&LLX^b^>k/HDtu
INNJ&j IXu%DF$WudLQH>T>Yp#tJ:MJ$dHE%q^nBy&J8AbE%4b>W:^R@hJ>:#H#Zb^:%4/y\i%<u>+yQZ#Xa/J>
wI/D?u 8^I6AAj%<1Ehy:dT^*^y:9YMFqe:HuaGR<pndR/S1@?H9j?PcnL5%:SlBBIklFCqm$n9lBBCEbWTRptA
!6m4S& $I8A>N/:kImW$EL9SWX/:$%ESH49$pSEi8<mK84::NuQ@6c<<?mM*?#=9qq4%9^*\<4BjZP6K!85*<F=
%hp/Qp uX>VnW?^aaA:TkI5MlP*m>:pA=c&=::6m5S?q$5Wui>@jN9H>9kwSLE9d<1Iq5M%8nj&I5i<b/n$X$\u
-ALimC 000443ea477001202b4 Page 213 of binaries2.zip
a%meml 46Q&QB^q5/:YbwP%Suc?+\W@wKn$1c\i55Hc&61:+4LN8e<jJG^PtH<pBKkT1kNheZqY^Zm:Qm=4&*W6
P$w<R! !9y%n9yn4uJXqicc59BD%bYmR>i&!K5JRdABbLYKuLA6%n<1$Z%mI%>:KD9b5WMWh%pMnVpwh>:c@WHG
>9#TLB Z#8QX<pkPc>SY/t6KK&Mm1pb/lE?:m1#*ZYNKTLduhEw6<^eb^dh9EbS1FDM??\K9i1ny6Je<uNM#YVw
1W5\tl 8LVYS1&bFK>$ZAwYTMcCCp9*HT6&D!jh:Xjnl*/=><&P!hc=!l&45ijnBndGmuY4C:em4=RP<#TLRlP1
b6PK/u F:j5VK/W8aShQWkhe>%QEAZKAe$udIiH8n/8R!Ln&YYVV9TFl&c1=blIK?4DCe>Jp!&SkYhJClS<^mG8
VF%SiX &&R:u^kk^<LRtXjwIAw^uFd^D9MJ4MdltEIpkZHM*S$!yKSqn/@nP6yB^mJ49cLbuwV^^FWHiWY6JP/i
V4qjI\ =%uPMdpwQEGZ8k=55a$#Q4Rje8*Z?FJ<EcdS#+w/Vm>>#m+TSEG\FPAJ>LAHNTq4*l#tWSwk>XH=hA9L
X/M:<a 6XlG%*Cp:/mNiPq1dVK&h58Y&T51X:F99!Q1e6Z?K1TM&H99FcBMXqLhY=D\QD<mXhl/LA\yw%Q1QK^B
FHmbb! <Kn/Ci?S:yc=HIY:5?IwV8qk1mlpZS*V^Et5d#1C$8:yDB@!lTlFyi?<=!*9lNtw8NwMcbVZCFIRPmCZ
^\ClC< hknulFHjDFGa>N/XAPD/l>%bp>YjEM>FMe<qAE%tMbti5EaZWIEL$4Q/1Aywb5it&K6984u>hM?:eGXd
KhZVIS >+\=S9DaCZ$ST$#+^k$<EHh*1DK>i%>wGH!*P?u14VCyCNm\?\!E4!JI4LRP\jk8CTFG%I%DZVkK\iuc
m&#A%c ^NIIwjd8W:1iAbHEK6bIb!MEB*FIcWk*d*XDHi4S=ElIyiGWp8iE>XJb4CdCShi:uBVj+HX#lHmGplE*
C*4jCb =l*mXSqNY^\aT^hW/me#Cm?Y/<uReB\9C$uDdIeMaR#FhX8+>ymeX!K>ImW<4l^$hIe:S<CD6lQPFZjF
BPHBG\ LVMe6iR>N:jyYGSWl@^yC!$1&!et4>:F*=V#18#tbw<KGbam$*%HB9Lj:4+44ui:*HwAD!Ptk*a=>^TW
Hh1$B& uVCe#Z@Ht6WX=8Wu\KPQKqinbHD&L!T&kX>W9*%P^aYId#jRHtJuXG?PG#=&HRk=Y\jZBG8S\pI=XkLY
#=<*Y* #Tke84p/S::RlZGMC*IT>DLba1N$E=?+$XSwPV<?D$&u5Z:m*R/kEBHhTZ&YaBl1nu<c8p$GDh+BZhZc
>bAtF1 TnJ8FCmL\?51J&?kilWHSD!e##DCXBNp:6B#nSF$<nd6FJl*JJqM6#6cl&L+nk=1APpC:qH4%E:6G<G5
C5G?S/ cbNNkD6*J!nDZ$Z=DqYJcJGq85RbD+>euIQ<yDBG6$XEIn&#pQE5mB:#Z9!C#nbP*i8HTNH!BDlDV^hX
6=<DR\ M?mnyi$ce&\Chi9W*RlhW?TKEG4de4%tEw/c^H*pJPS/=mSnku?MeF\SIb=bT^6/Fn:t&at4&DW&K5@X
?wdaKq J6/%T!dIihi9X5CVG/tt@c+ZB5F6Yc/JE4FB#LeZc6PaAAnQnXTqhZll:^\Lu=W\HdV5*hJYW%=Byeq<
*uuZct 6D?\TpR:iu/dCNVq!#iT%9lGn#FYkB@iwKV@PVt^TddmuE*:uSC/1YhI#$J#/Q^y#FM5epCEN$KPWkyh
*>H=au %!CCN<KAQbTE^PV$a\d+tRi>hZ64wKI4K\My@ZdC\HGjS/!nN+*EFa&k<=pyV5d:PH#D/ZnwS$u^BGJQ
@N\F%: b#Ym5i@=1Q!RLt$\l**$J5^tbm?BK:X4Y\p!/^IDFD5V5I@mWXhGJRwF4+B^+EHHtq+/neJDLLuI<$I8
H8K^H1 pSn@B^t*%i1D:FMiaC>+MGAS9GYy=t\tM4wDyq=jw&Jb$n91wb*<pmSbJEQTaiM!nZehd:=:/ljy9d+4
XDQN18 tmaupkEW5%/*m?D*HCB\8iB%+!L<u6b&ZK&!EpGuGA4pYLH*nmMpDbpCd</5+Fc5wZ9!ERmKpKF5+Inh
de@#ht m9bn*Daa!dGnV4@9N/%YhJt=?qWaRpyMSM655!P9H<q5+@:MKhHFYV&\b<Cp!F%ni*a*+?iV8LLd/!&l
\<YVWm cIEVFE>B@4bd1+m\C=N:bGBw*dk!/wh6GZLh6mh:q>C$=JBmb%Nybjjb=?&luWF9HLSwL#EnVADyIQTC
:pYc!+ RC=F6B$aLiYp>=JtYlbNEJ1M1j#cR6Met<B+KhMYG<ibYSKnjaPDEkHiR#%nPJVc$tklN&\m*PF&Emmb
XCdeCL RnTlh&=YXHyFZVabnyVdlVh+jGZ6%&m^@$T*4Y=Ma6&EL5S*<>/w!Ic\:*y9i&6HTuWMmpa=$lt981jp
FP=KF% D!X1/^b?yV@#IQk1$K^ntFjX$?#lEicSVH^t@mEGdSP51adQG&k9*kcFVN+5HHn>pnnJjtYIF%RAylDJ
l=\CjN u@Z@QJHMbP$c?TVl!#tT>PDS\ND4DTw!Rh@G#JIRdRF@Ih6>@\WntNqm*ukT4?&1@cd9n8q>JJmE!mdR
P&n+nS LXZh9?uYEYI:5+%CeCGFKR9QNSk$ibL%54ml55l+c>*hcC%%I>6R5DLi\<an/$ZM\=jC%9I*Tn?^EW==
8h4YBu e5uFp@QHaIQ>96!La=KP<V8KH*6$5:ZRK>awpXjY%Jw#/PT<mtuY9cZ!jmlm4wq69%1V?ZByyal?m:4c
wYPWib lW8Q=jD\6J?9^^4qt$C%ebnFDNqn*wD9#APaIXuMJ#E:IRNnTtyn+d6:=VaG%4NHCX\l%ahF/\*a*kJV
1Q!tmX pRjMy>!*D$9>N#eQ^+aw5qPK/nSLXemLNZdKm*#CD##edB9uwy1uM&FXqjk&*lHl+/8$HtZ9Fl<9:6AM
%X\\ih GkIN6heiQNEaQ%heSyq9FCBd+K4wY*&QJMFI>niV8VTnREaZ#&ZN96GHDL:/+V<C1FtF%=hkjpWN4?+%
#4$!m? !uYN>i#=/^/9qWGBCl&*C\6VCq<WZu\6*G+tF/eX1jkpEQuwRe>ZqV=QLVKQ<PSV!FTw=@jAEHTVpD+*
b^&9Xm \u\h&mL44:&/$CBCVDQe!kN9KM*lB%1ucTi%uec&m8IZaYD@?%tw?<KeLBtCy=?yB*hEZ\&Xj&?&\!8K
4TV5K* Nkl*IB?IdjK&=JS%mHG>+K=<peWSiP/j15aH^8S@5d?nRbeajX6P6:H$4GFLXlQ^^D+<l9TYYl\@ly5Q
DmpjjF dN^tE<V<qbW6lyY#*FybBj+l$::9>D\^N@RZJ4P6JHJSiPX#D!9Ql%\a88btu/:bK>%lHyYAy/X=V&#a
Sen$^m i!iMdB&W^N%NyM9=hLQ<ky$4Dem^D:nGlL>*qT*Xt#YVmR1LFKQ:&WFQZ/Kky1MjWeiua*kTWi:#56=W
T^chCn ^cYmB<NJa>bGdFjXPm$c/KAYGc=t\/5P?>P1Wb#F/PTQejbnHY5%^S+SR//qVh/neV/j%/d$bd6ZFP&4
RLLI&b nnCi9AFRkX8N/B&a\i4PtB?5b:S*nPT\wp&6L6qL9J!ja>*5T$YGcbba9Ckm*1Me@QX1%j>\TFuciIi?
y%9YtV Qy5wHi$Sa@R\V8DLC>S1/<IM9mI:$ZB!j1?1:D:t#Q?>+/GDmD?BT&SIp?4%lYLtq@Z<KW!jd96GL:=L
+e?d@= nujm=!pTu9?c?jI1<*:cnV5jt6$NJ=1iJ5SSd:D9^ZV$wL^mW=aLiN4tl^E$pNhGb#K8SGptbZNG<XX%
Dyin5^ X&S*<9eDmFmGW%6KJ$RWQ8dR*j:A6Q%S:pQRWcyFAa*wZy?4wMRL%@/ujw#HZ$?Y?uQTTMLn=p9!?D=J
^:eS8d dC=pjFMVN6V>Q5THE!&#qDJZ6$tF&Y^=>F\acm%nV8TWknMuiEj^&$Nyw4MlIkTcpWV<h+8+8bdENnTW
/jCEHT jyd8h\NE\XXMCVGR%hW&YNc&^BY8j:dy+PL%*F&RF>81p9A8*/Hm?6^ipik&5W1/bw#F5*tVQN8GayWe
XDqNkC 4p/QC</1=y<tuh*d=Y?H6!Y1J9t*/pTLtHl%1<6Ke==>1S%>9y@AnJ9?NFNXQmq#tFSV98kctiTcyqi>
84GPl@ R\HeE$MCkJRK5W%qa4ibmaYZyquZCtS8ESL?%lQ<9<@y@@?:J@l@H@V@@+WukQ*GE<D?*lQAj8<Jj6Me
!4y&5t <P?Q?DjJEeujNAj<K!*^l$NhJH@VHQC9>B<u@d>yD9lZ?4<#1=j?t%<e<j5VbTS@W^*\G@wQy^>J\9=q
d>j!me $m<G@^>Q?9<n:9FjJ9*\*^TAT5J?N?tH@tM4@N@5^@?1:AhEJ&wP?L<1?@GLVVmS>wwS1KpLAal#=Gp#
9YjFPZ Ta&5<:^DYQTwmVjhT6TmG8=85GZC8XREkmn1B:VEt:wLT&nmQQhub=1/@R?nIj94jNDS6!tYu:w?!ZXS
RBB6lh Rc=lG8FN6$1^6#EWWh9R8FTMtnVFibTXp4w<Rh>:wQd^tVT&jtIHFWG##m81p*#ena&kuVdX^ME?E#BJ
pEwy:u #CmJ$EG<@PXkE4CbGiu+6Kd4CIR8XM5MCH6ul^l!\d?qibecbV\l1Z:uup=QZi^@JEQE<9/6^LM\<l4M
k=ElC@ j8ub!P!aiMDH<T4h!nnDF&tyWl1nKt/YI%Y%>&*WZH^?QACIC\86TYyI4M+ASeSD/S1Je1RtVF<wpeQC
Q&@lIB mX/j#!n+&4#SZ/WYEa#IX\\blpww+mALkJH>Z!ESlPy^jn*==Ny4qme*j8GpF8=HG59#6h4TG#TQlela
atPbCA 8mVK*Sy:knKIccq>iwP@TR85I>%!MWWqADAR!8K1%:\$V#L%yp%iM$kSNCL:/K&$BJ?D=k=L8t4h?EJu
$*6NVL <RK%uh\wSt4=#qH<ZE$t445lJSV\!u=?+RS^G@PPtKWdV\W&<8=aZ*t*htiAa5utT=!C4<Eh/T+L8Z+T
wdaC%N %:hK%W\Q9EXbJN$PWDhG9HQDHPaiBJ:yPhm#?GHwQ9y&RBeyPN&uZ+<WcHK@qlA&iNV6nSBq!Viuk$k<
t?M@Wt Gq1mty:?VkH@CZ>w^aud8l?\MVR$mDH*IIKhltDF\AYCka@CmYy8Tu@$ShdPdN$j>V*V=!<QwFljiNYE
9=q<<k j=iKhbiI?jBX!m?#qZ:wmZHb\#c?QHtAEiF*eF+I:&&pFwACVSi!/YQSDmA8NK8RA%tpVXj+:d?=L%&1
k1!^8d m+%+S=ky=MJWd+!P5jn//uMJlZt6CaDKy!%C!lNE8MJQVNG4^BjiSGp1i!@M*Z^M9nTDnD%k=5Hw^4^E
=c!qAk ^5D5+m+KFq6&@9!##Q&dDqpW&\>6+GHcYiw==/Rwu$h9dDqTb:VQ>PWn4EX4F/9mQP$iRu6NWm@bw8c@
XGT?\/ 61uZZ^5i5M&9qFeW%1qX!8Qta*>YEM=n=Qwnwb>8<?PN$N+Hnl/yZR=M9Qu+4PCpKm9=l>B8C5?ZunR\
VPHBhV =cIh^8iYV8yJ/45wHl=RbX!iu*GbjVRjwyH\Ph\TTMwMC!N\6qyVK*L5/?&Y:Ld%!H<jkkC?J56%1M=h
mZR*VQ #JIHEDVL*9%!?RN@*l\?yQVwFRuTVS&9=ec#ACJJZQqAESQqJ&L5#/GZJQqE6T@EVabYahyWeyH4u6%&
#5<!4I NYM?npLtE@#n<?%$Q^k^n#*:i/kD*1hE#S:D!kSj5J?B8hcVuTq9p@Lb^*^RX/V@RV8ttyj@A9hIk\nd
:wS#tK 5j+\D^*q+Ql!5EZ!A%FhpQ&RNa1YWZ$p#EI%GtLj=u8*MYip&?DcGAw%cMGZ/!tdnG8DXCbm<SSiCIXp
l=X5+G X$$XZuZ?Y^X%&IbtFQVmeq&*4lwh*@8G^elN&t1!^t1@eb^D6=Dec5T6kmD$bbQBX>EmF6&Wk@L/iZ=F
$dD8\9 \B/!JH#M+b5AXN:1@wwXBmS\Y:#AlNFbPC##nG6\ywjciF&J8LCcTaCQ*<N<w!m$QmS@dED9Py?V\q#X
SDF1CB @q86MaNj?wYjhS&ceR&EwKNd%iL1qdMZ/@#AHBMHqwC$$\AWmRB>NdhTVENl6dw+8aT$w4%LR%M&Ckn@
-A8iPA 0003bb9a7d7001202b4 Page 214 of binaries2.zip
+ZTHJ& K8*p$66$QW?!@:&>y//ilwV<%H96e6^ZS=m!M!%@9VynX8C$pHC6/AS$tQQ^p##\ZVnXc?4P@55ZHBWb
y=jMQT 6bR4C\??/R<9Au/F6AwTtL<VC%5I5RZjYqq@$/AZ!wet5L?Ga*6b+ai#:A/YQPaE\h=6p*Leii#LutYq
$F*&V^ ck6qJcypdD6*/XCI58+6A!Y@lHj=4nE/JK<P6ea!LEMqh4LTClSIZZu/*Cceq59FBHw>ud8i9A^+4Y/Z
Nwb8u! 86#&1T6J?<5NbcJ15?hMcl=Y>5Le!Ti=\/qNh@KF6nIcJ9lIWM9dDZaFT8c9qCdE%QPu>ii8<c6&&ye?
nbw8:# HJB:hVi1bP<CQS<L:#^99PFAbXQpdkmduk>c>wawIqQ1e>bDlqZ1m=TeSyN6e!949:>\6AupbWK!MJkK
b:&Dq+ dd:*CE/VF=deQIyN:Y1Z@A#$$YB+BWlFSXwFp6E$&h*%%D==HVyGNi$$&M^1AjWyECCY\GHQ%CatG*5V
\y4Ihb F@wq$kn*EaF1mCjQujkc%>ewhP?@9>&k@KaF*b\ZiL=5piF9y\F+Nd@<tbkqFSbJJmtY@:Q?t1wR$<eb
ZNG?P+ /t4*qK1q+%+FjqyLS9>Pt\XMnE54c@?6MJGbNba>jCkP@qF\:Yh8HjZ>I#Q!jBQZQ8R4<jS^FjNt1R>Y
yBjSbI 4nu>V#ZC5<5\1#HpMh+58ipq?t*wKW?YKSp*t:wP1KQNC58ZM6:dd8>$ii>89Qa!&^B<$kVZ^H:IiN1*
SmZ:DM ^/I!u$mlBt6Riq*Di:qGy>i&>Wl1A6iNemG1<QC>5^ynT*h?u1ydu!KqwZ=wYM5YSJ6+?DL4W!t6C+1n
q@h?YF m\?6h5yTTuZ/:tq<unZMbh:4<<=t+1/P%IA@jaZ8S>t<q4\enaN*Qhhq\CP:^1W<QZB@^anaYtMPmmhd
FZ*H9W phpyXyQ%VpHHQ\h@nmh?QtqH8aXC5GQqb<uN@kq8at*VL>YJ1j6#JK5&*q81NC/uX%G:YmmPcV\$6GQb
XuGWAS #6te&YQJ4#ytM!cXYiYViJ>Y>BEpW*kRNMlhP^+?6F#hPuj$e/<c6%jV1dMJBiiNkAeM/<dK>$8B/FGp
q<mlh^ R:Z:5uCjQaSkD/!TVEXQVNt=uDi&Z:N+^Yq!SX465+u+XL*$l1@9nZW/juMI5wh+9e/nle=:Qan\LCc6
@b=ce8 L^81LyMpEbTB^PcB&R?q!M%1?GY4!BCKuddwwX&Iw1HXKqhcSK1PE%$Le1mJ*K!/R1EKwB<?hKyQyG6V
B&&/Zm #eEjJw996BjdGHmVcC<ZL@SwWPm\Y*bWw>Tn4IKI5uwn9utE$+=w6P*ueDJCBCMBiibT%9\LT#Mj1WiR
yiPXBw TFMe*d\ZZ:98n4AG$B%Edl@#IBaF&qeI^u+Xu>FAlkwy#GyS5K8+ZWnNY%1TFYI1pa&c#8DB^4$6b8P!
Mtk1cY &19+WEW5@c/a%HhRNEXE8\tkF!IRn+>JA\:tX$=EXR*1@m!GY?*8N6RG:FPFNCwSqp>+R6D4FiT&weii
PLiRT$ KW/P8YY!Ka/H<<S<qd$lGB5>Xtnna8qT>wA/mMm?/ZnCewknjNB/5d^TB?$bR6XJeh^Zy?4dSQcAjH\w
yCi:SZ &X\8*t*btu$HKJAKnJk=nC%PRYMd/84d!IiRmqS%14L4=Gc9^ZRdTc@SJM*YKwXM<qPRDeIhaq=#+4Lu
>cDBnR 68:jhC>GFMHVhlmdCPVThu\=6PyVl1FYkJDeI4:KaRZ:bEbD<kX?$t6py+c%*LZq1w:H>ebZTYPN:6bG
#*Mq>Z $C&KWXh^kT&Ca6D!IA@CTk/CHNNCVquDyl:mwJJcXNyKwh>A8ap&&>mm$l##HcGlinnR&NP<XBN#X*K9
pa$P55 \!jMRJS<&bh4KRW&y8at+Fj#R4kw<bJuN:E!G\iJ%/hqp=kth8/&=JBd^IDem*1KH>kWaw@!NE9c>A@!
<T\y*@ $hy:+pM!blFCCHEJS9T^W/idaAGj/tD?cQm/+:VJXRRu4Z&6F5$:RX4Yd<ljW9&bh4c4Snwlk:V=/Y1c
5TZJ>j DLSaLb%<!d1kL$JeSq1!hq=b6=ZWWt\#+cC<eBYcRZ:&VX=&$mqY5=Dp^&ja@H$Y!1F9EcX!hq:=#/JD
jFiH=C 5P!b+dc?pIa5/ZW%$wHtiIIl<dmy::DtS#R<l>bW#@C6/m8dD+kC#q\P%jhN>JHjjN%/QNuqqwCu\WPW
nZAiIu jBZGY5V!Cwe1eDK&FXW\%m5wSlWp%eWXWbV:4ZAVnT%EKF&h$XIwqRTdJbEwiZ5mm#yFN+P%=HycqNJR
R#%hcG dq$TethKJI+Q4F5%#&Y5mS5%a=QlhH=$MY#lm9LZ/RISI?X+6eT58p^=WGYGA&Md&S&T!TNTb#dh956!
V5qaEn LVuVTV%PHpXP&^!NHTqQk5&GCt\VXZuVch1>T9*KtSW5P#/EhLMCbb%MlwD5XZCSa4V&5B%N9N1D!1!d
Xc:dA+ ZLZa?Le4H$tQT6Fcb^!11aemQKYuHiy8tSTh>!u6LN*:1dSWYpR+hTj*:*cbL=&cG*89!+%\nW8ZYJ:8
=1<8Y= e@tKZB%H>mDTR4/Y/Q1MhdkqbII@8%=^NSpDnLiF?4D5E/:k4mqp6YLiTKC6\uGcyKFE>@Z^EGSJ@hVG
Z+i4MF hwk*#$ppwWchulFP+c6#q^b^?\XqkS=%m1V8%KQJB6*a#LNK<\*1m\jY1//%Kk=q5w*<nBD*FC=:!/aa
88!m\b k8Daq@Cb:^aDtQJBdm$m$*8:nStiZ>k14tPQhy5FjV@S%LDFR*4hC$MVu>YlbnGFq&q4V&/idDF#GY6I
en*=6Z JGdI/anHEqeZiQ+1aY+>QQXN8*LYjKqu>ZP%/j+%%==GCNKcX%>Ce^5=b6nZI!E*uYkQ1b%#A:XTXm@G
E=S?<V k@b4=1k%&lcI%aIJS4a$DQek$$RlelG8%/kuGF^Xl<np>q\T5dXc<tlS*ehFh?lTbSNG89cV#/%<V!jn
BTb?8L *%H!nDVXwkaIi1:wj=qIaFZNLTRFp9EK#@YKn?EpL&!HLK%TSma!FHIu@L!HbCIQ<nG+<^aq/:RM@Ynd
G*+S*L :YRdQ9nwSYESB8kMXdL=Ab&#8ap1pm:nMjwTkJAMW#*9Pw4aqJ4D@TKdYC*!<N$J5TeS>HE=%q#yi$4M
a@LYAD :!?W4Yik6mmyEcN^/aYWc96T4@<qQ/=HB&4hen*DY<89&W+*GMe#/&/\t:SJb/DhPP9q+\kempI@yZaW
^SaQny c11P$i&:8<8B@^BQ6%^:n:h/Vyq?Qtc*md=ZLZm>Nb:Mi4CElibItiF\n6nXkCH/<JNIlZHCkJ=4\dY^
KBNL\t L\LiHtEq\J?Gk11?Y!H:M&AN::%Ikb\^I=^KelH$HcNqCBD:ARJ5X^*M#9K=D?XWN:D?TXwH$8+9jMcN
:=jHBw h*Q8uK<bpK#!j+d<CTJ6hmpB8^/R^W=!pQETc1u#t=Lh\uM?eFh=HA9<H88Ld!ylwtbeD&qkhkqZm%Ky
D!uu&Q m#FkB^Epp@1HuwVb8@Y<DlS#V!dGYpdKiQdDt&1Np=tweqLDQReSmH/1:KTLZCNtl@:a/LP?#JMwRG?H
5?1JW$ CeeCE*GCX?1pbDmXEYQVA\>u1cp=Z#K&Dy65A=Jh&!%HCTN#\<LG65uN9J*:Y1&LTPTM8qE\^ey:P%Fq
ji8WCH dbFGl<I:lpKh!Z/uVd*lTjX4Z1CiDp:M\$nmVT=$NqMA5knw&jyFbPTiMpw^l#81&qi8R6w!Jj^%8yY?
?S+BT% 8qKWb8QAKlw6miy*=LZ*/#eQGTL\iMulTVu&BaTPMewZu/?5+<**N+n/!y6:Dtte<I5S#qA#5!5M^u9D
ncnt>w tcXm:cn^+Z\QRdyyyi=?#L!ybB9+GHTi4bR>mdi/G$DehySdl6X\SW=BcZ>p\h&%SNtknjClFRwFR8j*
l9IPqA =R:IEBdJ&L1L*\$B$bkqnAHnyS+/*C\^?IZyHV9E:w1#d#+y6/:VXKqDXSZ*$V6AbT4TR!^RAladyZaD
iSD!p$ ?lGqi>=qP>SS4Vyd&\MJT=m1Xnn#8qW+u%%j*4tXk%cylJB=d*YFQbkHmC9bWhuE&bibtySJ%ub1cc$Q
!&k<YY &TIdZ*D>*A#VSSHlK^Z^SjdcDb9&SmTS<yFnJ1w=Z6H=yGqDPVck6hM?ua#9/YF&B1S!uk/G\TGyT>^^
^!XZAG !HGVB4lHm>R*AKq/M=Ee&jjkB@/l\TtkSF::54=AZRDiC$YK+E/$YbQh&\\^<%PF>m^=B6DWuQQGDB64
RqupNy G9m/SVl*TkJj#8wuDyKd=bT:Si:4*q>E4+?lP:j+>c=%dKt@Nl4l$N1muHdITE<Zc&6^GG@^J4XE9IeE
GqkkN$ 8H/>dyeQ%@mJqeu?68Z@4c?tK?b%GT5:kJ/l8HQ1e&1qd:cWh\CZy!#dp*=Wc?iHw1b+HI*nF1>DD&>G
iWnwib aV@KSWRFK%NV#J^+?awREcbeKq4Vb/L\dK!m5Q>SGZM%N4/m$MVYa@F4u:FFee%\a^+YqB6YIjHL1>c^
Xc\jk* 5j<Du+*:K^?yu:W=EhdFPDh8ZqVP#aIR5EjHK/hhRD1#RnydCD&uyiNmdu*=L+yb6>kq#ZShVIXmyYj%
X4DR59 :w+Ec<qFt5i9CppJJ1XY=$Kl:ZWFVMtL^=w@lIpbul%hPZLyCR@&IZEu^phZe=?h9&%YY9$RN?N&>XJZ
\$SK!k uj=^t##d5$WX:iP=hW@=$FF+!j+G>uEqq>XZVqlPqHiLc<>yQ&qL1PaQ6hE%DdX^MS?uq#/Q@CNu1Z%j
mKdeHH J<##*y11:@H!&=q?JCe^Ndj+>Lda\+99eldSctuS8PH+>W&y?hEW9Yii<?9/:?I@85$jQX**Q$9MNd&A
+cWnk& #/pWSWahK>p5t!+6pW&VKDt6LN!mKncGM^hu4lZ?ce+N?><:=+d>n?jeplJm9=q#T@^45+5p@K?dZj=n
6/G>VA MQw9I>jj#Lqlj#*u@p%4/d@T@>cE<Z6c<t@wQ*TiT9/t6jSjcVle:A?$>F@R+6K@Q*Bi<ni6yd?lJj<\
LB5Y+H *@>Nc?t@$nDyQ>G\9/Flj%n#*:TY@m9>b#9\t>4T*!\/>A@^CZGJ@^TN?E@Sj:Qb@6R\ICp8>b?myj<#
ihZw6$ NB#/X>9qD$+FL9cjw9>15@&ll$MTL9/jw9>t4<ERj%w%mj<WnjlQ$Z?#%&ATj*Bw<Q?&TjI@&Q?8BaQ>
*q@&W6 %^bM+ueYDQ/dWmEJtQV@KW&T^aIeykI$L+mNEkZIJM6D<$>jEM!:<Ti1FCddL%Wdk=/!YqB^1wRKM<a=
yQlMV: KBPyZPGWMZG^QlPl4TEj#PJtI4y9XhJDRK#KJY5Yuj&G:M^^$w11+HyVW4+S<Rc%JbAZcd:td9BV@XQN
u1ebmc 6teWJAmcI4u4dP5V$pGLJZi4c*CW?Y&Ai:9DI*XQ$H^=nWAu\\q+HB+4J$#B/dni%DY<P>8K&!5@yFMW
l:R$N/ QMbCI/DdT:$Wd\p?$kF8SYGyRGDRXNNd=&++kPhJ8i6bw<1*44ICmpWkT>9wMC8i>/k<@\YjMKl&KTcS
\LQ^+h FjScCM&PFXC1!J6+C*NjN^Q94jM&aICMJJ4*hlipcmRnce=utTKIC8<#DH6b1#VqK=LK!am<VVYB+1%M
N+NXI5 8ltKp9m\a9W/hF6*i$hW:pQG9TyZwGMc%k@II<A1XyASL+WF/hbJ=$<cW=Z?<lkKMee=!c1\CA4hK8#=
Sh6ypm D$*h+*iW!Am/A$N^\K%PLWNld?@dp4y/4?%E>i881>GluhC<NEC><\$GdaSR8?!En/\Lh=ZIjbIdwFCP
WJ/BP* >5yBYHI6M?/$pwaP5u@>ETqFG8ldT#ZeZ\8&HI8e>qM/+bkY^/MXqtX1Wt#&XJTeMC6hEbWBB!wmtEjW
w*^?q8 pHjm5pPNH::Ee>BSlGpRjlL#c:+yXc8DE$#5dlXcaVCwC/y6HMdRc/F4K9*^6<kEl#+uV*?KK+8L5k\E
5WP>e% RKI=QDeaRKEm<ZSpwTFF#?#S/4eM4A$&cSGac</jpn/?^a?Dy#&CNmKR#uVnTZ9mPMyp==#:6FL*MWQ@
P:Sk#+ =5ka#SPHBB1jjbMu=^6:bjS8=D/p65=>yeQ!iqMJbNn=Ej<nyW8MnBTENV*RaqQZ*WwHjNW5\nn<M9pA
-AmcY& 000188896ff001202b4 Page 215 of binaries2.zip
Jm>G9I kh\Qj56kX8iHduaMc8SwiTj+mK1^>$P<IwQ\K+nS++&FLibY!q5pXHTPV<5@9J<Y81+?:PQ%<hbHjLQc
ebB8BG uD*tSPc:?IuQ4\Vja<uV8euDc?4NANie?yd&ntPT<a+iFpqm^4tqZ%m/9X?ic:8ZF$?D1MBmM59FKdjH
:dXKpp k5tld^tW</%nncQ$Ba4KSH%m!4G:%NwRjNNdA8!5jLIh&8d%D@+L8dJJYuQMQqhL5V:+^$&u>8CXF:<R
*%T=l4 Ze9D4P>ji%NSB\lHXlhN$m:bnV5<1tDWu^<P?KpB\eI/kV&^i8e5IkRlW5lTXZI&YSKp%l$#<T>>Z:Ee
bn*5FF tmcW6V\+lt8RqZ*/kD+Kl9Ai+/^=m\D4SAk*$LCnmhAE:A^6knIey:G<SWJ%S=ta8n8^dDS4S\cV?DbC
ACLPbP $nT1b=lHmiN5=A^h!/SER8EmyMcAWu5D#1RA/mj%CC/F:hNaQXkt1RA#@e9<Z%T*Z4lH%KlJ>GRY5LHl
mFTjIP bVT*^b/>cSIn$Zi&Dnp^di6INC<iYk5RZBuIATnQZ%<KuSB=M6Fc5j:NiuFEQA8VNQGt>4$+&5IFmG&u
tQCe9X IpaR4^R9aZ$VVit#yJ>b9n9&+qC6dMy9+Lt^VDijR&w5Re*HcMy4QjMABu:L5THIPhN#KH\T=!m\ESRN
^6&&X+ DqwWQuM+WGR/k&M!&SYkjiEmR*Tn%DSSeS4ZG<dQWbZkS:Smb<6<kuS9\bN/4CJX9T!>wdWjN5FGkm8n
@eVLP* :ZeH/Aa#%uqk4k6#k%tMJ@Mk8:ky\Q+4</HnTb&\ZK\6K?NF*>w%%aTAY>#9ZthwS?cTX+Cd:tyYWMu#
=@8S4% 4c\qlkQ99H6yV>#L5J:1kltk8t&ZjcH9kwqB!WwBGZAZ<kDJl=VG^ZeT>^lGe6:/HV$e#n>i8cF+@a:9
?Fe9ka &NmNYYqc5GtVZ=p?Ab*WjZIDjm89nLI:Q9RGRnZ5aFKjSJw!BeLbLbP\=>:eSbR!ckWkm\<G=W$^p$D&
jRap%n aT/Z\K+!9W!^8!VE4!69Sa8pjq=b+t%TYIw\cSqd#F5\jpp6n+pImFu&iL<qhQ^lKLEcMQVC&C=14?!H
MHtJlK lht55CYPPhA%l>Rh*A^:dCSNiMNWmk<RW+ai:n5RM^DjdclKye>R>pL1KXwXZT5KuYRq6y=tT6F/J@ca
#9?:?& Ri=$?CcV9GkDtQttWm<tb6lj#5dT=YN6C49iJ+e<19YZkq9cQYK*H8X><jSAEc=j/88LQ61qyZ&:E*Z^
*DQCaB >FNR*==/uhCE:j=N4=hK?:BI#TWZ+^X:d&j@bZYJja?WW1=%=?mDVtEG%?l/YD#R?Ri%M8?J%G#qYq>i
?e:*WD 1H&=4QYN8t1>=!q^XC?nYFI>XkM6yJbV&+5ZWt=/@m^L<BI$Tnppyh<NJlEMI=@/Mw+:t8qVt?A@Yne@
lw<Y9I biXY5DKa5Gn+KNhNc!a#L?\*>4M:?4*pJ&h6SeyFPkPHN\?PC89iRjQdh^\eBGdDeBAtCWk:m^I9?+@<
BYG8QM KjHkI/n1t>L1aw*RpALq9Yd=G!=P$?ub=m*6N>RJ*lJ#%Bi4*1>kVQ%%a/T=a?1T<WFE*?dSp5#wjD^^
hF&%L9 b6>\pqH%5+k+M:@GP?>c<#n5FMluqZFy^haLE:BEKRaj6>HDt9Xb#K8*DRH!Re#>N=dEZp&#h?T96&Cd
*e6AnG kJX#E?PlM=q&WZwT9%\TS%+JHm!RE>&6!u4@Tuu$C9J>M@!Ba98Ne94nmYQDH>w=8=\JK9ThHWap#PPV
w<L4kj FwSl^w=yL%*i+B+BeQT%C&<9D$:H*4YpHKZF98GTXQuR^$$^?qM*>4JjIZipcW8KnY*APwlS?JKHSG/b
1%1N^Z jE44>8ei$%B/#?BZ+M6jHBWWEcBD<!tY%65*KFWi^^\=EA=#CdKA$91#WBw%d\QG4a@Qk4>i*yn8&jpR
6bdicD JHaX\bnJ=VC&9$nR4RN/$NJVbi%$9hS5#HlN4ZMpe?:>p?l$:aKbe6!K\:9?GDd%wqD!PL&n&QRcjT$=
Y?%qd4 ISP&!=#$^%*tuY<5uI+\YH:n:k?&QD+8T<\/wwKKF?K&5<59?4?J55C<NZ+!1H>/G%CmhnKyIZiSLuWe
+VKQAL @NbiPPn=wj8nV&PyZRitP?MlJbR9b:Dju!@=5t!y95u@ZlY/WEPk6H@Z#D+9pG#wIGV?b%E\?BB$NYb@
E<%@n4 EG&+5k$>TGT*KYZ5P\V>BHNMEFXP1JP/>uc?+R?YY/?pAF\yq6#hqDMYQhbiLB!4m/<AFAhwpm\hdC5D
SkhZmL n=CDjhYaNbw<kQMVhRFlV4d=ml&TWyHaLha!XPqR#$%TNikQF\Nkw4XS!Ae!kkW!k4E9?<Wk8%6pqM:?
@uD4p< ^=*yi>6w/:c$pB+KEWZAeYw#qZNFL^Rb6htHjR#mVSdiR5WS4k89h#aKN:8=JZdHZtmG%!N6@IXQIC<K
X!wi4* iJ+wdGNX\E%dBC@B4u/YQ$qX=Sc6bTDl86/Y&%4hqNi+b6Nht@ES6apq5hR468E&JwXRGlF8#PMmE61i
dhi81Q nnbBa=GajamHqAH:5udlCwiY@nbK?l1*Pe#Dj@CEkcym>J1aJFZlY@4SMnw^QAB!pe8hy!GGM^DL+%Dq
n4j$PN E\qblunE=D5S:4mFFNZABIZd8!qVJ=ZtAJTuH<aERd9SVEymN?Jp\Ip<*&!N9<ZQ4&up4S?84l#Yu$By
9$a$^t hw?/Xk+64iIFhIDiRA?S#WPCw@+&^eQp&X=u6$*nj*\<4RLq:BRFyt8!4Tpd&Dh9*=R#Fmbm\!y<P+l!
KIkQwG #lj:#GFdhy%9>m$bEeiI@uS%/HEM5@=B+!Xj4XC%lknj+E&=TVaTIuKaHZp<uhCG<>ZwL!LSjct^8<6k
H%jQyZ >p5l4u@:L&Qe<WRXLZHe&^6IPySTEImMjXFbIGjHY5^FRJ<jGl$!FH%kt##Y68@mu$blCcDBX15dyyE8
X^CQ/< lw:m$pJY=8&FkyGw!dmw6Kmi^@\hW>n>DFKRCM%qS:TStQbat5it@\=Xc8qa&ICb+14HNZ:QpFEe8Dy*
%QaHiu m@<&wjNXF@d8@XWQRc%SKtGcS<qCV/wHqmGH?$m#n@GDN=W5CCkQV#WY?KlqipQp&bWJh<VBH\>yhQ9M
K/ay*% +8LWFA>?\i%6h!qY>p:=pHLJ:/yuh$SAK\e@4&knPEn6BK^hbeN>ibXZXEPBZJ\wTcFktW=uICFCXZu1
:5%8*e Htjl9VAFNa?^4%#Jn^KAmd#=<m+!WFm*iMkt46iTw1!/W%%kkISRm=TImbjR1+VAMyZPKGSS8KSQYZ!I
LCm+98 w?jSHiJRIY/ETn=C99a8@*1/kHY8+Pp4+9C4N>d$I8HYMG<#V&=@^WbHMjhnVP<>?S*DHI%!+X&iKn64
b4$CTM :XIB\$L>^!B5H4j@5Q8?DmbEQhWN6dyGTXheYBjX1B9R1F5P69/&C8wK+TaiuKtRt#BX+S<pmhJCq#N4
QZQBNc EG^4FQA1:G?kAYJ1lZPM8=u8XLHm*CblEiY4pjGQa?CBSKC<<=E#mk=V*wtma+!yR:XN8emLGIHCujKW
A5<cJP @S&cAiB>EDb@y\+h^1%6I@BB6%9dB=w9IFCwP</n$S!uJ1jB6c6I9npY5SmuY49IZ=96uQ>1TPBXb%<i
!<aD/e ^lkV+b=DhkyJ$/jaPhP6E>ZdZKHaGZ5%R*+NVyWDpuWH8iME+DB#I?#kI!W*ccZ/hkCRMBRil+WhmQMd
\9AFjH tcm58@eu1M?+//MXQNBKypy<^NhJqH%tlW8J%P98c/=5k9q*$BMHGIpjP6eQKXdp:&>+QRBycTVT/5Sp
uIkHi& tT6HQic>^F6@W8$^$^4B?H@8%cTI%6TlRm4:8kLNN6/hJq%R=e=W1DZXFl$l8kqu*6nl:lP9hAnMmJCu
%w=/1e Q4tAD5!CTt1<B#4udyQ/?k=pj#:LL>QlKJMdAR@l\9eM9bR\aJ%!XLm%THJQ:QSXV8X?JREYbF$d/TI%
#G&Y<G PC*nHJ989^ZLKPK8%GqMmp5nVc@@wbEGAVm*PZ+qtdRuykLyt$e6+qJFwqG&wDdSp:+G=XGJ$dbH%qXP
a9&WHP X4#mY!GQW^S$ai9YbFlmGuwDBtw^>WJ\*u$Eu^<Mk+?wq$1Q9A^XEap?I<BPuj5jFKcRu96X6<j\lkq6
N^Y/Ny G<CFnbkpP4XJ<SFi^BF?<5LDL=^tu+4AJyAP@MCB8#ES<t=dk/^Nni?na+yujK#$d&lc4#+h%nl>N+@$
1Mm9CB i&G1Y/G86/@$&ZJbKhc/YWCy<VqDa>Vkq6+%AW%K#W*%nJbApkVL$DJq*a1A/=8RTLdl!4kA*W4lqJ::
MwaYLl !bYZiEEJQ<JH^CC?9R9TPTWa%cB$^I=J^jc<y#:tkD&q>NpC/aqIqbldqDA$\+bS&BGA?EE18A&6d5/%
@eS\Tp F+1?XEt9V8Pe9?*NEBT6cl+kVlw/D<6Rn^V&<=/*a\8^l?lQ$!W41kGV%dRuyn+M*LaV@mCGb5T5#EYT
yDFVF\ hSlECMPQbi?QpwVw%e6P9hRmYSA?ehdnQ:ay:qN$IMCJThADk4!$DaWyN$ZmwD*>1LCRad#nW=ewe\<8
P?m<L6 bE:Qky8qlBPmJb\LcW!<k4iY$eER/I@eXY\?FN6M^jtjJ/&*<DRFVii9=uMVQ^D4JmXG=lm$m+Teq/:4
/>JLRG k48A^kn!&J=XmNPtM:6eIM+1#mQMShYQN&twtJGM/9w4J&8V?9RRY:YA<w6^F#+4<kpHM&Ze==hcEA/k
Z<*661 VKw*wDYtZitY!NbtW<Jnq^+pMaEejudG6*M&AHEwY5V4EqqjG<w#%1@@^aGIhLkj4M#?MK?+Iu&qN^bj
GD/=Ze G@9IIh!MQEVLBZ!RTVlLH1KVit^CMcX9HH9*ZWaed\W1kL\?&tu?Rl%cn8dQ8\lKh:h@YPGT1e#iSkc1
tMJJtH tk/9$R?yFtFHw9tquF^dP*8?qQXlWb?ibS=nNq*HF5+jy@1+<mau66EYPD&\X?Pwp==\q1G%c/PyDaAY
#!Ha!L &5Z:&ENnF5#XF4ZE^aShnLWB#Ma/>Ldu?Q*!d=BQjITuXdiFXKabcp#KRK$B=K6XdYFTem=SS8q^@99C
%JB9iu Aitpuhwc#MtjND$>KX%6Dd=hG9!<dK&W!*N=cF$q<!%+u58pJG@*+86/=b=K6MN4F@$/J=V@1&F**NeB
Ea/u#b h!n?MG9C4D?HCZ4y8iAlB8\8mF^W#?:M<\y9%CYIW!VE\Z1cF&q1+*pMA?<&Pp&Wp:y?B5^@hP\XQeh:
9R$FQe p1?iA:5ClDFt<+WV+4wt\t?I*cSnpbYc19uV&!YYQR@Mb$awNwlMR94$TTNNEckKAAd!9W\9cj$D%:p*
>+LEtm kRhZ+Y*#>!%BSTqeb?Iau\E4</%ZD&Z<Q=9bHW!*X!A@euCNpmTw/>>wZ>FC4c6YaC\^*%eLTG=wqNE<
u@1*9I Dl#8tFu@AHhV%>j\9:lHEAHWRI+4L=E>D9!y*9k4:/FXLKWWpAX9/p\YpNkqY1G@:5&W#P<Vy!R8beei
$$N4!i i@I!IF\+lcy\eGnXm!qGj?^IqqVA1i&uij=Q^>ZbH8=d@dlA$$IpPGL*1YSy9IwI^XL/whMQeWTdNk5p
QnZ8ck #mSIeibJn@&*qX#Dm8PLl>#QB94iDpbjH^d+&q5pqkp&GX^1GMn=V9/qXKV@=&K/nyLPtqLKF@i/yHDA
wA*mcp pYNEQLcLm&LD@:H>yW+aq<W5XbZNld/NaXy/C@Zu#5liCkPHuR/p$nPe5j$AmbGTi%aEPQ@lKaDH&Cb1
#&<V^Q J8&y%PbLX!Q4%#QajY*WMHC?AMJ6+9qIwTMmSKhZw9J1hdNICKJ<?dYt<IhNqDy?dcLTXm6&4:T1%cV>
4G!C8& :6dGLKu9ljdTQGc>X8!mLYu#44puJ5/t6BP=p5Fnm?9:^IdQ>dwRdipS?1d5@@dlM&&1hhE>ypuk+Aeu
*1V1/5 C\Ye9#N+ChqddJ\I$*PeN/*SD9H16P=eY4@V?Ymn:CQ/euCl96KpYtpRljqS44du/XR5>PAbhIXN<4%H
GIm4q> GCj1F8Xy<%q!&/M+*$Y1%am<$?kDlZjQnLy>q\*IDPj6u%FK!cRSuAL!S8G<BaWP$Dqc^Kj:EH%?qPI4
-A6/X$ 0004dd3735f001202b4 Page 216 of binaries2.zip
5TRkqn 85@1I1@%!+T%6<TEH?d:4!cKp+Jdic\bNXd=R6M#=L$yJCC>:/jC^&a#:!^+DLnPGwT<#lN1Y&&K^Qq&
/nW&RF nle#<SkKHV#Q!jaZjNi59Y^FtnF=&>ch%/Ym\85wG@jw^$/m:&dLeqtF#Mmd^KLe$\&I9h8L^i?%PXLX
te$q18 kh>Kl\Kj1bmLjuYyLTp+5HQ*bQ6RVM=/#9Kw$N5u$$:e%T:4tLhQQJV1>?W5@&:P@9ebQ+p@hG^:@iM4
F:LWlH 6IP%%*<>H9:H1&H@9ECI@jNCW81jF>L@uuRSq+L?<#6TMIq@Zwn@5@>CZE4mu<*cWwn@n@D:n%=:/H@q
N&@m#1 GKHT9!u8@jid@<@ITeS9=KVE*<6Jmh@LTauj?IN@45>@JRn@WGMmKRH@C@1QMSwJmd?k@!#KJBB@<?nm
EhXtkc j^AIEyJ@<?mIQ$kdmZ<SCBK\@:FA?I@p#H<SCJIT9>5h9^MI$6L@N$d#9#lGw@G@4EJq\J&YJ/=#SReG
SZ$ITY ddXIMdp6@1Ldtk:u\iyQS*qL^a$GQ$q1@R:^%4q!FqD@*aejRGTq9WbMSLwmlbmcZ+dmZVAha@B4XnL#
5R#ey! R<L8S\JN%&L^MyyJjDwINaw>PbtIY^WQ+BFEXNy#+IdKnlW6F>$:FIy9W/8wi5XaS?cG4eAjFNZ48F/y
&6b/84 V:y+:!lk%HZLhQCe%@ZZEJ/nlHSk#5\6ncHVpYFBTD4:6GVEhc+GbRD>DjTD!Y6wPYl<QE986y\naa*a
/YD?qk j<Sw51:hG@HPHB=<K#e&$/S9\ued+j%ltdFJ$Z<by1pqaCB1TM@<*LcqVDmjClLtL+>Yt/8/D#LV:d5Y
PYdpX1 aM/w^KA1uylya&+p^Tl9$?X>X=RtuyF+cI:m$8cJ$6BMI<@<P^j9X$EQ=6%Zb/b$\?Tnb8aV:iLtZdB!
jqCHFF Em>la#i!6k*hV=Sc=$iT$ywY*lWp^Yi6le:M#Y9R$\&NN9aLn81&c8Zdy5>aA$BQ>IcDlDMWthmEM/#E
A1VPBA dS4yXa#u#HZCHLm$QAje/jH*<:Te6?Nm:iKG1/JM^1a6YXLmwlC%YQ/aiM#KtN1pwt/$bBQLdRyEK4PE
>kDh=P +JwXJdtT\wX4qw:pY8a\ZG&JRcqd!=hE+>QuP@ewSSDM#\:yQD\@imA<c$8kC=k1ktGy5ZdJ!Hcj\AdV
ZhwVyN #e?t9&::?d&TiNq++Ei@>G5pEE<F*S8VPF#Vbkw$a#J+ipkiF^?XXqH!@u1CF5Jn/mNuuGi\WGZ@GDwu
+V*#%^ iF!Ynnhnjnei/tJh?dcT&<8!*#AXdD:wR@cmcD%h$h=Ft<#wT?i/&t^1@RPpWDRC9lFWQnZCAAB?Jt8$
Jyd!4# 4uYMt?4VkQwEC:nLW=nmKSRHH%HiIyZN$p%1REB>!n6ubnPtQYu6XZwQtk9^L*MepwQIKF:K/WWNjqmD
nVi>ii Y=eF!jC$T1$6lqHcw6?Y%TLpKllypnZ:Amn4Edq>:@baLK=>mGD8/&Dy#4tlLSe1*Fcki&Qi!$^u%J%P
/Xl1n1 k5e!p+9nFmcYG5/h#MZ!ch<V:Et&4DClhhN1^5K<#QwD<\=pmn=YqkN#19:&VPy6yuiRPaX1t5yDyKM<
<$/aj5 5mSmMJm=A6C5\Lc8CTSqP91*\M^18T6/V$TE>$8mw:4Zb#:ahbt!1Ft*dy4CJ=6Fk9C%^@DE@XymEIRd
E9+u@% #SAw^6F\K&iIaI!FDy88>\1PePkWA&KH*HT9FWjh!5L&WGq:yI!5G4H*5d/Ah/S^I\tiV%V6n/ebmi5V
/+BaAD QqTIw^yuhZk4!>chJ#/p\pG5q$t*DA=<J9jmK49p!:&dP&Z^81:8eIbj1K**#:K<#A6aM%IHN6h5wyNZ
Sm\%8& iSFjZ6M>Cj8pYt\V*mu8\Q>B\BBAS=k^#1D>=kc4R1tQAJ%M+RLl!4pW5p!B1\Hb+@VCCll$@Pl$I5NA
yY#:aW piyFqI<Qu^n8&!9hqLMHVk:BFK$!^KQ5aTTS:4iwP:$uaa:Pp6k$@mjM&&PP=W5*eN=ShHw<%Fn&a*dV
4LbhNe a@$TYC\F=n%T\^S&!Dhe<E=n6K^B\eEwiiEqcG6Gl5@y=DyhGW>%nQbZGpT!QMt>kB<EJ1^j@Ad4Z*Np
5*#h@M 4ul1%*ybE+!1Gnd!/:8<jlbL44cw*1*=+J*#l&nECW%Hl4K:EH?QqZ9<iI5Zjnl=*46BN=T=+Z9!KH8S
8>JmEq STP1:BXQ=*cY?y&%ZJ/&$^eX:!Yjd:^@@KZ<!+eKD@tdG$e9RWpIW@IwZI*i^K9G?Q5L>LM9h#ylMRu^
+^qTP% tI@Yd\k#mdM5y6:SDEyE<*F%Y1VY?+wy=R!M5<QSQtIQ*@dPGq&:#=pnSj4\%^6y&%FDawhtahC5=aL%
ldqK$u 9ECtFXnmqtn6D9MLLiPipM!Ib=>&SMPNYGMC\XNC9D#Z+p/IFw6nW^tNHkcA>>9%NPFqJeYS!lq^5V5X
EScRFp %+yi\T@=?ycM*yDh<kK\#%$/*d!$c>DS8JyH!aHVH>YDN%mp/&8N:Tu1>TtidMVi/=d/dt9Idm>Be1>M
?wY1t4 JpW5PTc=whSL48llPk8Slnu<%p5/i@L:L=l8^AKNI5dZyNanu#ljbD*<kkH8Z=R^B=eYaCBlLDjM?:y>
&I=4q8 /?G*W8:tLB^:tlbH%>N5=lnyVY9pX*qX9GlHlJK\qm*FAn&#=d?&Gc>hI<Sa%/Fl8!=i>mMjuVe4CqYk
t:QduB :=19%?MQm8NHh&aP$8&yYhQw9d$j^e*tKn%<*lSXbpV^419<BhtL:^Z9YS#tdm@tGLHF%bjy*bI#8F*K
*wDD@8 ?kVkalkaRhNXAcnhKXh?T:MH1J/>EeqXYJ*F8Bb%#=a9a:%AjwD/Y!nWXdjtyD^GQXJM@=a%S\P4GRn=
4h8NnQ CuYlZuIRt:p/a?*^nLkT^Wy?@iilXiBdjT$d@uF1kVCuT<>*jIMR%utDi^n>:QRl*LYbdL15Rdp\qp<>
1@4HuQ bhe&NLk5S!l=%nHc?dWmQji?/k@6*^e4<ny5C1m/y%dVde4<N4=Ba8Sq:1:J5M1$4S>c@FAcGCe#5@na
T4+6Kq ?6&VqKmFlhWe@9k:tY>4EXL6IB*\&RwRh<eViiy1#h<JN:Y@6byN?nH?Gwpc+Ab$#a*4njL1jTL!pH!F
lRc/Kd RMEZ+XtIwt/ZGE!V5?T66!TNiDE@qhD+*I\NEZ1uT!9TK*6tWyu\TLP>hYu^RjG>6dy!<yBmBauZkIH8
PRj=5# ^/:&:aP1RMVDt^:6V&diTPcnDC?G&wyyH=RRct>\6!tat=kAi5+LiLk$5hiWy1TXi$!L>#X6PBB1=$Z4
PpTun+ QH/DPL?<5akwCDGID5&6<w&KLc>dF=!*<6#G*IijLnLYtlk<Q\=8N?MNeHARM4KQ9Hbk=lE6w5QZ1Y/L
CSLKP= %E/$D1mX%Xa1%DEj$cmXBp+aI$5hn#t^CQ:6+Au*D5+AdT^#8jWTRtkhnI$!yAwpJqaD4\<=HG8$XS+u
NS9:n< d+cm6?l#5j4AiGJETAy^@I4#nti>hdJJ6a!+IH+!uM@RBnEZc/=@/I&\=w9tS9wkP^4KbyyJHc*/>:$$
SkJV*y A9J5ktWWMYn&SESEMAXuPL^C>yE\ARZ@1hMt:FlJ\HNRILI*tE^LmVyM@=W>kLy@u!\G+YENJ/6%8R+w
H@+GqQ SL8jV\&@Bjc5I1MM6VZ=!EpCHkuXMSDyWtAP4lQIpTXlKWTT4qMH%NbeHT1!RN!yCY4y^RXq18Kt/aSF
/8::mM KMRe$i\VDc4&<L+ItkFTwBmTSEV=ltwQpFwJ9IZm5INLVZSe4iEupl4AmuI&jSa5A\NY\1myRj5$yDaP
m8a%4b wu^V4Eh*TM=i?NCGe4cCd#G=:!t:Ykphemqw%N^\?NDIFttdVIDkNCI8uNjp/e4XqL+qS56cPYVRtR!C
&ee!d\ =D16t?h1=c@^9TBa++Zpad?+BhVm&VeAWaMca+@1?4RnkniV6tj!qlP1t$@B:9*lclhn^tnSRkq$F=wj
8*W$^n 88$&<T89PEWI@1TT4!hpk*?<L#F1>wRTtIk49C<T@JPHIBWRZF/A:<G#XliHD!Ta>eVtjjjM@8ZY<cSM
b=&$5: ?>LKlKJMi\%M!\5K5B1*@14=DADJA@RGk%#G$KDRAMiyiB$cw^V/ZelAXF>Qu!KX^al%19aYj<@1&$wX
StptkH 5P5!MTueW*9@&/c8Sij&JW&R*$dyj5$*m6N9HcKlXbmwH@9Q<JV4Vwjqd5BC5LMdn?$eRW<c</a?kwha
LPP1%< ^^#@yGwhVuIBy#aBeu$#YCtTedQ>aY*!tMDaKG=Ja4wQAJyT%KtGE=5Tt1jZyk#6pP!n1P#IFG*l^LJ=
5l%j$S t><cNwephdaa84Wq#^ahhnT$hT=#^E@AZ49?kMe!%jj9VhemG+b&eJK*W=qwCuTpl<INXla4y<@pBZ4q
ACP^k> TdlchEZ\bVEypW6&wA@RBI!eEK%$=CaPCLJZZ%Ed!+WVFF5A/Wl%5YawlMNk5t?Bpj\&tYC^jSpI:5Ni
c!d8l\ uLy6weLnY^5?lID1A%HEBpQB?FV@REwVjIT?B%F!k9ttNuHHC$Y==@\HyLTuEG9btcnE&mk!qX/RqjhW
Y=$BYX D1?>NuK*cIMdJYlF/F&6d58Y4L8dZJ61ZX6$D@=Xp?+4&5+jVwh$&NM>lNt4W8DFRl^+TZad4a<jFEil
lN/hk^ 6&i^kNABbaWHSREYc@n!TkJ#XQl>+G*&$YD6NBm?uqt^CG:WGMcqKt5W5T:Xt\e8Gjlqbj>CP\n6%E*X
ZAad=w yG$I!NNV!6VdCw4k#nSG%99#@m\+H/qThDC$weF99bBMhNHjEhGCQu9<PTmk<6T%WPt?Wl+pd!la!aqm
jSqiQ= P#8\mTPITCCtTiB%VJ5tSZ8Q+&yQy\&Gb?BD?L^BGRtAFNt5%ldML9iBFLIRC/tN?/Jwj%4T4@&yj^?m
p+ayH: Qm6B%9ayImTel!&mq<B&y/i1!Vhpd^<l*A<RNNS^Kc<VLYLd!C\udR546dLm1<h8/+d$jhacKbNY<:mG
4HN@1# llaLFn?w:dB!L&@n?p/HlVhV!iSFeCpP5jwXZV:E=8iKWSLcZ\M/5mmABNENnIGeDmT%R$&>H<kSCZcJ
6kT9V\ GR/AybBIJTQ$Hay8cbYDa:RukWHWX=$/F*4uhb$Ijkh6V5J/8Yd!bu<IKmTplATh4&DDde>?ip#<CiR:
*MJM8G S$muY?@\EBLmJl%dS%nY%6J6/nuy*mJSRlP=@!b=LM?Z8ehn+LZVG&LBI&X199j<R55MyF>:TS?d&/tB
ZwYR14 F><e&mm9!Wyw!cl%>uXkEq\+HRR45CE6@l1T>kb:M=Qw=W/?#uL$#G5m8h1yI&>Ldp<@<aCK9G%q:e>j
JV4ww\ eMGnYD%JbV>BK\@JA6@#$?bWZbh#I?cT6>J^?jbE!TGFQYEEemD4X%4w@S<N9=^tWw?<9:XBW=im>iRm
^qBdZ$ uaIQnh5#qu@FNcqhpPIc>@FN1R+d!*BR@hH^uLe&WcnjXaLVW/I?B!&/c96M=yBWP=?JNNTZEIZWyaX8
&LI&$l N!iib+5&jFWTZ&Wn55Jh%4ZX:1tqP&ea*H!p!GimWy=dibW$!y=QX89cT@C$:KPV5w/KyDMctt!JZAEL
F8b6YM EKSEh&aclt1*Xn:$R^TCDBGSEG*XcYIB1yE%jJJKl+LnA&w5JuPIZWPkJ/i5qqICu%p8n\@Sp8WlIjY>
&FqQ5@ jGni1%PYZqlY=nb?q+@A?q^V%jb\X?ZL9F>6tG@SE*EZZRu>:EBkuAeVK+laCE:\\6F*pD\>FQKT%?VE
+&KP5p i?9a^eM*&D5CC5mdBXiPjiE$<T?nj=\aTNX4QM?yC&m8<ct*>KcpSY=@Icu>pFVip$d\mRSIAjJNIKq6
$EK>1K eC8TR98iMNlDu9KmTbyDqTlJ:KYcE6&9ETk5EMS9SX4^!A&WG/AIepB$EpNMSL\H8Sh<cQNQWW#+ALL$
^WJTDu Am+%@<aA9=IM^\$n%JbThEuR/byy>H1%%H^Ju5%>e@/M#Dbmk=YimbAWbTXD56J4SL$ESj#>lPDZDl=>
VhX&Y& imqhEn1%\I$wIKDRR^hLVFD61XwyRVh:l91eWSa#4/JY%GekyZ+4cD&??NIjtBpW=NK5F%6c@kZ+?EKw
-AWVD# 0007826bedd001202b4 Page 217 of binaries2.zip
XL&A4m Jp1*XyB$l%T*twMLtPi5bj%Gq88NFZum+8iL5NFPbBM>t9*<w:%8ViuhB!yAmJXuYjtbFZQ%kTi4%F^Y
PQA/Xq &V5Cmbq<c$98m6+WEV+HyP<DIVkK+8yy4!!R=hn&ea^C6D?\uLaND5qX/:GIyQ1phak\FhYVnnc#%\=h
Bjw8MT ^+9<eM6P+Ph#*G*EJ\@>TI5YuQVid=C^hl9yB:L?KmM\J+N<BX5@h:4*ePQd#=y#j+^l&e!PlFJWh#Sc
$+Geql +JX5K8R8BGQVWEW*!N@+@d$KSjFDWa#4jZE#!?wbmHqZ5wm1NKX/CWYC/V1%FTn%QpJVJY4D?8CmAkEH
HZWGMy RAyZ+>q@DDB@9KD#1?1dXH59NVN9KKY:TMwT<W//86V=R:j8Mk8F##bLnY@:+%/M>u&C$Q9>6VqjjZw%
5N#Tpm WNVApP^ZkN8hkdK$6X8<dWqXBB6VwmtbGuKj:KGBdm>=R6Ju+FQ^cTRbIQhA$w99tWbJByE/QjclIit9
y8\k@y 5ph9iM<Y=ediAWNdKZ\QAMTj!KTI@a+@>IXjXZLcR%/!pDR@G@h98Vc#I$YTMWDjV>d$QjW!Bi5buYb?
Aw9tLy q6Rip/@*#eH&PZtmE5Z:$uyZlFl+phIe!w1:8tMn&Wq&kaG8@bZjed=h8hP&WVPFN4LF$PE\X%9d5yDw
Ij1ELd ChWC=?CcdP:TWmqK45npJMIS+KWWBEHunuQybGVeXamW<FNnjBq!NM&6#5:ulJpd$P#=NPq$LLq%RA*q
Ppe5KS J5MIV*\tpDAq4i1bMLhYnP=?NKbLB:ycdjEN1jG6/%y+a>wcKJ%%eA64TqXlE!6wp\HJXWm&NFkktJTB
5cwT&5 NY\m<91!A&YW<:dKEhLjMujcJk15wtncT6>>F\TS=C><I6<MZ%nu<?S/E#HPpRPmi5>$LnX$X&$yFn$a
ww/&AT q=p*@PJSQya%MdN#L@=SI:1>9aIpMPwq$V\S<>CR?#B6=4AuZcadBH/Z/&SDQ+u%IkpqTd/BGK>eGi@#
j5y=mB ld8^ue+F*1\?Q#qmlA8:Suk+nyJ\jcetQuEmuVm<5HL8Mb$mtLZl4mtZt<1dZq?&ui1&KmmR>$pCp6bd
mwpJYw T9+phNn@9uE1MFtVp?cAH#pTuWE>M=QDWl41n:@M$cB8b9e*KK6mJtFYP++k%=SkK9*^8LmdD%aY+EwP
j&KNd= hXe8LLjiMqA8NWa9YTnHi/qF:yW+%64>BJh6k<6PnTm?iT1=QpSFy8Xcj?INDwn$4iD1MN$yD6uM%ZG+
>w&8Rb BY<XWA@@EMhDGMBBwp%C/KqQ8yVZ=c=ee+T&iwyBBj^pQN<JiG5mCS>@S*Xt1!l*?H$/*k:@tF<yRyCa
K?a1ZG L/%PTjnnI!mKILXcN\&Y&=&RbjHcQnq8CJ<C>BGK/w:/%y$TTKe1Ln\uPS9h?QJh@4N*>l68*:b9qt9l
^ELlZ9 NSHmGkiHuy$=>EPb91be=Eui*ZSGC<6c%QwjW\k@hAIICh#waqFhV\kK4TZwGJEpSGThR==$iFTmXdmK
w^5WG/ 5SlnDLlEKuNX!9WJZypn4DBamy<SBE/TNk#yiWlFc&:F6%CwLWuH8P1lk+^Z5\lHnhT@pK@*AkwPjNI%
+B\C\M Mqu%+Rn65jbwqiXl+A&Xn@KRY4KE<<ute1$^EaPcyXuIPh^jZMMXYXIb<mXGcVW4C#dKP?uJTHB+Q/V4
8w&KjB Nh?ai5HHDBIA%ZFie??$qKC/D9bQeyY!RA\?QiG8p?@WASTCWi+NyeX!Z4pPAKCASkJcKjV>cQEQ&XCp
:eNS6B GJN1cSjS\?^p>uT<icM\@^TnX\w?9@k5nhSGSu^k6XH41dHVhinVjP<dblpY=HR:Q6M%pCGKlYW9ABZ@
Nh>GYR \/uHdcu:Q$#Jby+bDB@+d>t?>N1p+=BQN95M&Xa+L$D5!9BMFd%\qKP/R$aDt?wahZwAqCPXM4+RIe*^
8@Xc\4 :c4hS>Q*%Y%Q<\\>\dSnYB1eh^8IC46B@15A!4MhCEi%5j:#A9:y9LW<b!+\jYGFkwBMGbpR/%eS??!4
XEL*^= D@Emihny@LI86YlWkbApBK>CS!IAhaA6T+iV>>!E=yi6V##9w8GK8!WHC*KiiC$&SJ?AwXpXEEMLbHc#
RAJ1ti SNC$cyHlSFJ*Y<IyJn#y<d15j4j9yIJmQ6T1<JqEq&mSW@YKlilAGWtwFaXGPJLe/ebBMij4?BcHL6AE
#==Bj$ J>V+l^Eku#&tGECa8$1q>$qBqu=cqac8<i:&DVl5*tG^Aq4kJhM%^?%aaAkdnQY$86P8R<\L=XH^dH#K
mu+eV^ %=TYYq?mV?mDke/5^AmI<bH?XwAl@9eKMIVa@/SXpyV<X/5pmjl41@SQmjHj/lHEd#I6@=S6j^F=R+n@
+WHWLK Bj*H!B5C@ni$^J>wmd?k+Z<!YknEZ>Dm$u?/6?Vj$H</$k+l>Sj$H?6uENJ@R+9>+epqwZ>B@>upTa4>
N\&L9J #ZcS?pPITjJ9Ny9EH?t@&Y#\Q%qE!d@bdQ>YiQN:Y8K@6akI5j?^SbV+4!&mNQR*FqET<d5a$n>?#Q<l
Yb!>E6 MTR?&@>#c*ikn18XqhIXNAN$<6H5&M=/#\E:Skm%8#ph6ALNI/a$GeVF&N&NMcWEP!j@AkPIVE\lGHt=
GXkPeZ 5>6XV>S?!qBRi*/p/i+8+GJF$iahTa6b+Q9TNY<SnN<Xkd64$RE1<qib/6dTTPt\d>Pw%Wc5&PZlRLGk
*CCdHR m!a6/FIhA@y$++E\MYG6n4wtb@J:LRC6>#!hW1\JNp/9n6GJFuDNm/5jS+@Wq!ctNdtnPTN^\=MKC^>S
9<PY/K weN=?B>wc+t%b#c?^LQ/CyDGuNbZ^TS!kStZn6YGJbF::ql^yZnYi@1K84Zhmk<Mmy+\cNF%p#CCY@d:
:Td4<M ^MCX/pI>jdG+G&Ll6J:VAXYjkAR6E+LBNG<6M?i%+u6TwXbIa6ymhTiMi?whM58#R$*LKk<?G+aNCe?9
E&\5yK CWdi4+ndLJ%C>^8*/M!mp=dujyJqA+nwVb><%Ip#qNkTa!65YqGMcAnDX#RbQi$nk4!G&ElT$RpADHS<
IhLm5n jIee9*$YqNjlhu8PNk!@A?u?&tGD6T9\@^my8Fk?B>i/d8aly\>?RKTmAW=>EK5>DZ/9bpVQ?kbd6#h$
1l#G5@ RRZ^5MwJnICnMHTR4$*WjaB4Xq!D^#yH>?nh#<FNn>hMW>?$i?Z$C>G=L8tjMb#Jy@u&j?=kI&HAj+B<
qN#HA< HV?9cQ/<yJHTyNPGZ9M@YuP8uKJ8NJWQXY!YK??$P%w&=TRiuBAKYtwbp:p*#imw@Y8Y#kth&6jcE<Bw
QJCDe# PXmVC\u+dydNDckkyY6HMbITqdpa:MQj!1I\pSuDV<Cqij&h^Gb#!beQIiB4qEJFl1TEuGjk6%qjeXln
#qBuu< GnCN9#D:C#L/T?MwDI$wGI1qI#!Pw89KbIhei%emc4eFTAy^A4@a?FtcebjSp8lElM1=<h:t!BjK6\@W
n1V/+F w>Z+<u^ZnBTaSWTiABIJR$18!e9y\qV^>LBWFI&JCqKhQa?n6*hq%$4MmiJIildFdq$\+jlc1i<P6DS<
uHhtP4 %tw+JkyRNTb^B^w#6j1>^:b*$4RAwNDQY5CuDym/X$t<cybTL8KVdDJa5Z%=t4$w18Q\/EZSF%%\<mY:
FKF$@b q1hFLIM1&^V:qbH=mZ6n5VR6w^YLBW\dPwm$uF&>d9$EBbb&+w6MN1ZtV+CYG/6FK6jHe#\^BBI9HLNd
i4NL1! Nq&j*4WXe>yGMNDuu&aTjViw&QRAd1TcZmN8SDyu#jIm8#ym/&ejKJ%/1K<8^>C!jwK=qu9LJlyddh%K
kGnQd> iTdc&ThB%lM^k#\CP5VS>H$>4>FB@nJ+WR8jPD:XA>Q/CaMw1PRKiPYMV1&iyS!<dJ5w+5p@bZ?1>QPY
I!dJNL X8Nuqe$d:FIdR!HcMVelbX:jR8u!dt8qBjS\64?*E1<4bJl:y=^B98l<WC#\i45$qcjVFq#F@!DT+N!/
&NC<lc Y+lN>NPh8+ww<=HyyVK6SI>CFhJXECHGWdR5YLG*cb?WR?j5/iGnL$%#NL$GnTB*KA>QbmP1l@PSHXnZ
YbHih$ qItD+IZSHlh%^4S6uEK49cYh\w>WFFuY4i$aSpWyt^y6ceptEmLXh%eQR5##ncEB+%V=*I><5EEn81W9
taD?8H JKLi4@Dh$n1hbAwnpyi#C5GM\w4!L<<P8kSFXE5d?YJC15uXulLVuZe$DCid8u^QcK&Tj<$j:j@A1P84
y<X>FL t<+*!4#BS9!GRp&PS1NpYjkNeyH5RQ6D#$<6HFMbY$F8HjDbjRd>c?+mkXV?$XMyH\$:Iw9!^NMRB/H=
qV95eW =QF+VtRV+H1=l+4u>@6QHKPM%DNQC:1<&/t@1dPd#+G#Fd%>u!VhpXAX+Z6iWQ^auRcw1pJXH$:X5<?D
%thCSt =Z<8wCTWj$ca8T<V/liX&qL9!HS@P616n/wd\MP+ZEn?$GWR?8&$9>GeNT^wYP#!1^q8hT*=PA?qdJj:
5G9m1h qI54BF6@mqVyeYaiCnEBH$S@EZCR&qdu:ZmX@PS#WQN%F$MjMc^yKF9=X^1C+i\*N#PcLQLm&Hy9iVeF
9lm:=l ac<Ye\a/Su98T#\\jQiw8ucZAei\>jRpq=\TTDc<MGje#cdGYYh$yFRd=WDF*lWRHhI$PP:jYdlHW^*5
!C<@YY jtit>=$Gp!W^wdDQKcD6k=&hGeYn1DbqjhpA9#4d\Qhq$R4#Y+RhTdbhV4bqZ#eGALp*mB/=i+#jwH4J
c#Hi6< G*\WqnPjCjqk=*JRGH*>uBm6Ehj8$BatHpa?/I*=*C=MMh&pFhb<*/a!Ypw=/LDmDRFcQt=LwHT8Jc#A
:\F4ch *=$k:$aGD>YGCTanhCP91hX88=/%8<M9L!\m*!l+J!p55SB#pXYW>%G<!uqm\S:AjhiM8+ZIhZuqXan$
GZ^R$L $cMjL>>*DcXRQbE>PVkbd=+P<GZ^5jbCuLRcHZ:bhn$a<\S$%LN%8un%*Xq8CZq9Kb$4:uF4qL!qG4tH
u*W<mW j!!ltTXl4H@upMW5qHNQjW/F4#@\>VLM>@Xu*nVElQu:k*\DTGBk+6$QA!8B^k@</y@=ql?&^Z=nKc$l
t6KHpn Q=W>PKJ6@uCV*d^QE*<aPJQi#kGFYE\ZiBA*Fm:uFH\$ISQ6LQp$e9Z/iI*mM\Nlku#Q\W*&>/P8GmXn
6LSd/F bmh??RNkY:w&4#8HN/S1Sam9ITS\9!RHyVYGAm5c:IkAu^DMHhEB:k=J+6btd+8SD^%&nwLlLdh555%/
%Y>#/P :KIV6y916&QIA\plwu^h:*ChyERmPSPjk=<&IIkHT48XSRVTbH@PBku9EhnYVLS\Zb145#&Rp*5AMwHW
5R1$eF A8&Fk%bB8KI?FZAXu^GFMCH\<wHt1wjw5a%6ulWjRRLAMJ4+<qA6hEEk@c6D4VYYy@JaIREyG%\5/&!V
#AqYSe nATNpiJTH/kRX/I1a$9M6aB$1>9H9#DY6pyW#pDmB<ItX6!Mn>E<9!KEjp&a@ZLHN?B54!a5RPZR=1NL
w!<un1 T>Ej%/wD9qPS/mY$4pPlhXSeblN<EPC#d\Qu6qATwkqEDqdYS/pJRJajw==>PHaeXNZuN!/nPH1%&t@<
JVcVta ?cDDDSIETSCKe%6bJY9<1BHp=&1&jMV#ibLSl\S@TLB>1n^PEB9!8NhpVRSZVaqhPaRiC%?<yl1Ie?%^
b+JmKJ P9V&mb4IXWbb!ZWFwHu1J=pXS=iim>V:XMQ&6%:RmS4cWcaAiFa*DuGdInH9ZiM=5D@>KEa$E$Z$pkVY
W/n>n? lBiF\eX&6j5?eXhjI8T9<cb8tm@94uS>Idu4S8u4/lcptjCEPu4JCFKewFXGY\%4^\W5w#JL!pPZN+@6
Cp!8N? 8*:8HeL<iY8%6FalG4CL^BG>TFTZa!wj^#jB6ddAnTqZhu!e!?EYJM?*lMaZ%<5WpY8D?9cijjPn!8ay
dmG&TR WIKN>#+V=Z$t#GjPaTGIG<#wFP:45c5SMuM@9K?q8588#6c9dw&tKlTICcmtZ8MP*h*iDDkj%HYnGF5/
iC6*Gy cZaYI*TI>N*&hHTiayZbhCZlH8h\KAS8q=48qG+MaS>Au>CYd#=\4Q*W>bX$4#mut$iMB/5SC$S^&Yy*
-A=^bM 0009e7bf11b001202b4 Page 218 of binaries2.zip
yt#*&j =ltlb<t+5Bw&JtDamq>p1mibTV>!1RMQEudjD*CJ$kIRPwi5QFa8:%jmET$uLmIqF69+=wN:Le#^uTC/
*&m!=? TTnBXNV?ZG#qM\9lJ&F4<@CwVkZ%K9EGdKRP8@<^RX:i41NcdT%RZMRnqqL$KcXn>pbl>c=&<ka^/tVe
#R+l6Q ?Q%p?>Jl$Kb4/AtN@1c&mZCTeV\1pKb<ZIbetW$M4DMPedMj$k4balp#?!kuB?c6SZQ%pXtjptNn/duc
5l#^RX NMW:DyS>Q:qKNXSH<qNHIV%LyKIj$#Xey>P<V\uK#J=1d$aT!lNZk=$cahbI+d%X+R%&acEMYHV>qyQ9
$8/D!$ <\4*6I1J??wMbEpK>:tq:u5$KEVW!ljeXFmh>!qLWZRG<P&TK\Hbla>Enk6S#hQGl1p!hmN$:>HbdcqM
Sblhem <ke$RDT#aZ!TR1wZC8wp$Cq@/@ARGLauGE:+NXH*CMbQyuTl8bqBVuL<yC<DqGltuRn<j6!*cG/M*u#&
YBFyR8 *cZ$9bLl4+tu=QDKZ\N$YqV:V$H>FD^*bM:j1@Z!CL5:pDljYpa\%mSKcEC4^HDBI1A^<IR>PG@IjwBI
uH+TTp !=19wZSCdK@hDY6K$yhB!6XNcqiChtlReJ6tA=pT8G5JdA\LKumwEhd*88+D9WJePjdu%^5lbX*BtMy=
H8V^*S hTpWkIE:j$wLJGnAk/q*mXFT+$TyuBIVyBaN6l9d6=q*alN6#5qmF*&J#VBqh^hw>yDddR45<=VmNFd5
^Y>>:m &T*&^+wVtMj>h=>1qN/QMnJ!K>JRVyN6!1/QCdEnq&6VM6HkpuY!cZ/4jN:cKWi1jY\aIkj/*G91+*=w
*@B/V5 p&yD&mQM5jNAd8ybVE@$waFpjahctyqRZ6PhZq9L!N65P=&j!@S^/1WuY8*?$<jBNDGd&wqiS=khViPh
M+^>5W pK/qE@DJ+i5deieWhdq&hi#LNAY5AG1YTc+E5iB>P#>d41@W4q5M:Nkj>l>bSk<la*IXY+huw#Jiy=y!
C$eZ\C !B4KI@\ZMVtpL>wylYCBt8SG4?phA1$:TpKk9SLP845Am6DJlCVu\nMZ+9+:+j%Y?mQEaEWGh!j^jQha
!5=J+D 6blenW?8ZMyYAqy8eD1:?nlct8VQ#Tdjhk?>/w:Z^K/R/RFc/5%dZh!T9n#bn5>mqFcQ6GTi#aJ#Dnau
ta4i:V %W#EPH+?=IEWk4#4uLj%<J=It&<FEa$W:E8&=F&9Xh?nG6T>w\kK$4NF6Pijqb6aqpjhJ!ZPmP+%w#wm
H9A9j1 K$u##pmQTG5V\Yam#eeKRjI?c1ScIHujcyFuDQqFR?bqBFPF^Ly=j5W9NwL<6+\CHI:>$t6nmtjqww55
qiX4V/ N*PC:JnhNB+=udnYiSLa%SP9J^&9W$yiQ>#tMejLh4q*:W8yYBb*E?P/8!SXFK8BSPZ<c<t1BbjT^%<q
Vi?DdI i=h#\CbFQadRGJMNPm=hRIQGl1\P4i$DR:X^uHnE<JL\^9jHWAuTI8<uDANQE1qq?:^Wa8H:l8c8@9dE
n&ddkn pQY+db^\bj&\Q#QHCE^FCKcP:*hV#JZPlN<D\*9=m!THdee<bN1JP%:NbYQ!dK<wBq:8=YjwBW#a*Z&M
C/abIE @I!e/*w^*Kl$^lNkG<tu%CI@:IEE%4a=iWQXCd4kCQhTT+jMYi!kcpAjEL$*I8^@cEi?yhAW+i?/Ce:e
AN\1*I M>4Y@1b*ai6W=e!^&Sb8S6H$k5&tCh<nT%HlHIFJTI4kVn!kF@9KyqWdtaAl%YYCGSN99$wy:Znya+tc
H<u8Lk MVuK6n*K!?DBLR=JP:d?SKQA/CM=c/F1HCkWI^T8$=?L5VHAA4&%59J*mFGi6E@9/ZqFE=>qT>h4F9b6
:NquSR cWZyVXw?yKn&%ZS5takyAIWmZ>+\+GEh$HmXk$SBdBD%@ta&JMti%w*1LwPKR#@:pWcP#8tYEdmCucjb
bqdGY& w89R\&bI6PdVl&?IIym8jX%H?t%t/^cYFe$H=ZZ4+#LWJ5I$J?=kNA5$b<cM1IdXhd?tW!%ba<88nVWl
/NB%Ru dISi+?!$Ekp6qVm$$qndqMk%*wG?/bX@h^^Zd@\BBkkZWVl4JRI^bhCJj8Du<u*:#&S*m+SB1a9tckFw
=Sp<TT a:eWH%yk>k6qQ/uA!tWZ%XyKRd4!weN*\6=&:/biHwBYbLw1TP$4+*BcIiMpE1h+$EEqt8CN6&Q?kj&W
Z8@#HD <:bIl1&\%$*c!nPclWie4u#nKcjCQuRiMwi99Zju1*ltI#j4Xe:jhdQNEy9ZKchkmbY4l4=ZR+a#RVq!
&GTA\Q Nhqe$dXN6Fn4tX5G+uIcR*WQF/\ZW>^S6DBH?8Au8weceiCC9iKZ&V&j*mjuYQGM4V>wIc99$w1>NcKw
w%qthl &9m<Tq<kB4P866$VaNN\$@F$ml!Gm%Md6*Z8e+tbej\H1#%V^jwp66yhaGA1eLMitCYlap1B=96JyaK?
\uEylX *&e6<L%S&1LAiu98IDHaJSKLPu1nR&Pb+u&<AAq&Y:?wMlE6:G<ePtqML1yF<&5N9qhXGlTENd9e6/FM
#6X>/= :ydmTW6RDaiw!6=@1GBLNyHRmHRV=e6w6%J!EEk8MpCF#tcG$Z69GXC5:6^E<:VP^Yhi8S6C1nPJn&$I
pijKIG h9yEJp%ZQk/t:JGw?5WL>l$Eljpjc5BW&b8*NK^W6q%XM=G5\aM:DM4KJRNc@RZHu:$?/?jR!*mh6N6d
kPQIFh #t+eJn\lpLjT&u5<&4tiDQHk>iA&aEinM#WB8^><Vd^PBB%q<yF8Km*mX$1HXD5ctX4yiL*MI=nW<yeL
cS%S^@ H>1GX:IqhhhB+%P9::Gy#^#6Mh!p6*j@wi^#*jTJGD+dCZT=@$aj8BtCA6WTd8htwR4#qmBF*<S&PTKW
wl\X@d bAw4^PH9ZQMX>4>Lp?cK=>4@KAC&?iL9E^p1S#$^uJbw&&*5bR!QjkX@J%1>AKHw\/B@BCZe#>h+&w+C
$Lq%lB Q!lR@mB*y?bD*wh=pun$n@k/l=**$T&t9FEKQ+1<Q>?Gj/lY:?d>WMnh+&R1=@q1LCE*l\=4Q9H1Bh*Z
JbhX\F %hI&T^DD+IJJkCR14>G8%alJCWKV%*41chPp^G1QIk@+*wnQc$^mtKGQ815aeXibaWaihT!@&TEEIM>T
tLJHl& WY$&jBdeeiS+H=PDcY1!TEW<yjQc&u1jaHk&HN&4\la*MQNw6I>@b@5X#Hq!n?&^56ndD*V<GV>9>4K$
Ye^+4N HX:y8<1?GAlcGLaFK%&6:B:JC\8Sn+V8>XcGb:TQ*\y*F<@@W*^IW9J@1#&SqQ1j6CjT5H?%J>Jmj&%Q
*?ZG1P @nt<@bi^<G>t<j>MKQ&FQbGC@kW6IjYHSI?W&N@RmD@S5L?k+Z?!CFLmj$H@&TJI\j<C@:jT?6@VEu?#
YiiEqn /H?pEZ?%dH<+np^K<n>FT@$NLRH:A@$*t$$C?wh:T$Q@Y+MlKjW@Nln@EZ*/N+MlBj%hDpyc:DeGR^!K
>jQWT& ?L<=1Q?%Pcn+@=@YCXEI1#nTRV^#%h+D=SP^H>A8?*\\<c1w=XtMtKCDCE+>%yaXIa@bkjPJCeqPwG@l
ea\MYc t^Fwuey6Kwn#Py>pjBW/Vp:#LjJ+Qy!ITu6C\+Q9$&&pl\yYMn+=h\MDhwF1ca#B4:QPVLkWj1EidVCW
^mZS+W l\QFC?9yG&uD4LANd=YalH9E4#9Vch&K^chNZ:M8b8wy!F98$Y+K*#F9:Yc^bX1A5Iy1Vd>FXnI&/XbR
c?X1&n <+@w:DhL^:qkin/>HA5H=kq<T4Sp:R9Nm*ydX\6Q:RPPBI4!/ZllbGb/C5kDXeD\A!6uVVGqJG^Zl1AJ
eV9NKb 4Ht1HT&4EJj>HQM?V5/XDnKG1cXd<&jEmphAJ</w^nt4PjGqw?G:c=RRVG<a>1GmXX1VQMHKi<9YR&/l
Xyh^9L 6ahNV$SYLyyF<#Zme8JE^tWW6em&JiT\!%$8q:P\BBp4T\c5wK&Nm$$*u*#w^+ZCjtwDim16TIVSP9#&
VBa+ln &6!lny!XV%meN$wPY*4hDP?hQKm!b*M^EpiN*HuP1XN/Z*nj?aCpS?jKBDXBKaL=+HVe:5i45>855Ta$
RHj@#6 wt:DN*aTq#i&eKy:!B%tSKV!IXq<!a/mdIXwZA<jh<QQInce1DwL@=qtTbc?1d5CJY:nycNnLbH+uKq^
><<c5V ?NFV$bt99mVJE=?@mb9PP6P*V8edX^W+V@lc?jJV8h/l??D>ktZ=P/@b$a?!6@I*4uyuQIZ^p^V?u8?S
hbuGkw Q/<y>D$eTFPX=mMw%euuk$P?%uRT!L%NwhG*QJd?tW&%RQV5?\Nm1q6+5h4V<%E<qc6e4^nRX:>9Be5Z
68Wun^ Vt+Qd$/^hE&%h<aCH%1VJM1^*FL^Ci4LZJMney+!PLdY=9p1W@*==*wYpm85n8=nnwy=qn45jlT&GNVF
Pn\h!M F^TYJERRAjWpp#GaZ<=bSapXSk%IEbmD%#nD:G%>+uD/4j@a/^yc/wPJwcuN8^R/=Xc&u4hLmhiuGh<n
nuV6+5 4h#JtqkSI8pYaGj%WVaqIHdImW#AJAt#<$\wbLiZ<?X46DNVZPib>w!<<>MW9IYawuWJ#:4&LiYw6Awe
KLeFK= >6P6=&emCh4Cu&CNQWPMT+uGL#I@eC6=i?wWBp5A?>SlWHtPG+Yq1aIZiwM:B5R9huXeDwLX?qXV^JJm
TtT9Hj hl>N^wm*ZQa<j==@=TW\YXaTHVSJT&5T+5p+S=\yMJb^Zt+\?8k:e=niNb*9BCHpnB?#B&le*y6A\4X<
mb^/QF i9uJm1k@unM<tK:u:m$u?Qqih9$=cJeE/=?eGded/%peEEdEca4eZ6!!QkmTcS4IWZ/CQQTPD?DG1wnV
u%RP#i FM6?j9GpLda&^pL?p/uEW^yX5tytZwYWpjDa$W&Z#C+*Jnq6NEa<jKRCtP?aAl5kn\=uIqF^hVRMbNi%
IQ9PR$ 8/dN*hV<a*jK*E:ADQG8VA>WQwY9kHp9<p/d/84JX8m:qEq^N:uZC>JhTL^6d4t6!8H/dKHB!1iWVq4j
9iW=G& pLH:pZX6eXF8CW:!kXPFp:Rk^<D4wy>QBaie%J#ZF\&6>I^tXQN1EEda/y%M^*&>F@iyNG1#yp*tPL:c
8LmYRk C/N$Y*lZ=e\yI=1XTc\4$@JZ@dS9ljHd\BuwVk8aumSK=k\KMdLd#%CbC&wbuRyW5Ga1yBZa5#?54+SF
hbaXij RnebVTMY/94!J5^w4XquD8yIB/aY1b%e+>$CbJX:4buC5CdkkR>9Vi$/>&c5BK+\SWP1P/nKP?>j?8bP
$tmBlT $!j4QJ9nRcnpykW?RE8t%Sd6VcT?j?&m:Z%CAYSEdKd6>D$5t$RZ5*hX$?aZhk8cmBCGF@eNVEABL&LJ
!%8@uF F65N%IkCbdYyEqt6bB%9EK:\>^/cyi4B5!5bIC\PCY=k?KWXdwbw*ZP?VKbaCG>P=G>LVPeT65yRJejT
k/LYDV 5+nu$d!G1qSPe:?Qj69!yHbm^C8VV<1&:/W!HD8CuYjY<DMy:yXmNh@L&6J#L4ytk:T#p^DXX>VNctTF
TelC:N d5q6bSTih>#*9WiSM:Q#dFLEVHHa+Pd/dQ>#R%A@<mWn$=c\RDE$&L=j:+YaGN*Z5lMNm1G94+T^:66&
=$RVV$ #BwYn%:mj!&>V*<m+pu/!p6bA84dFJbDX>=A$WQq/ETmu+*qm#5W+>ibjS9PFYE$1m:^GD&6i*nB%ikX
qS?qnR ybWH8>&&aJ#IQlQZ8mDi9Qb!Z5ytE9Yp\jtSHj??$VPy>+KmhWJW+b6+@H5<N:YMD::A>w/^6S4%a::W
=>ABTV ut+K#@iFS$k1TTBZX/XIG==<$6Zy:Ki1kGZBHFtCkH5tMLJcA#ta4TcEEBwQdRKm*!/$^M4eMZdW@daX
%X!cb+ 9Sk4R+K/NTc8TGh!PcipPp6e#F1i8NtIjPihTeV:Xh81T$!RGYe?P4:FA=1cj%</CQHMEQqb>6bWp/9#
Cyhme+ dt>E9XN=6qhT11#JV9JNW?ReV961leAl&Ew:Pa4Gh&4lkwDFSaQFjHCG1Xm\9$G*N+8m9y8Z%jFXa:96
uuu=9H 8+y^@REwibPw>&8<Sn%J?A6NpnY&*A1DC4#$*QJu$jp1+!tB5&HhI$VyQlZjWaXF:6hIl/dKW?+LS!b4
-AGydX 0009970dfad001202b4 Page 219 of binaries2.zip
kL:bp= :+ee?%\JhjZFY*PBN\$eXl/*j:=!#N?dH\#lXL:%!5quYEZkIimGVBJ8*q<eHc=<NCw=W$V#*5EeK$iq
uJjn>p kju^+bhB1RyFW4lQAK%G@QM>>F*c=%\=aKPdkV8#+V!GbLdk\kuJdea5l<VM9LH/\aC?hj&A59JCVq$I
TP?mtp Giy:u$wN<M$%i>%5M6!Fe9qp5Wptq9%R1Ge6a4WV5LR8JHJqE%C%^&N69!qFQFJJbApwd+T5hNZ&HYJH
%uMXXA MABBjlLpiaWTnWaeuaZ4qGdNF/A\VHFRmcVdXy9kQXq%=!SP^RYd>%TyuE\W4qN<mC$c$ZEQ@R^I%ARA
hc5#kQ 6hYG6Mty%MQ\&t8YYq\<TRJa=^l56i6XESZP?XAdb\9VmuIC:NVQ8W1>&S/b=::enwD84uThX!K$qSLH
n\k9\y +98?X=tam:Se\=SC<B4dFNA>wtAnDMjmCJ%XEZNj*1a#Sqb>bSi5LkjBB$M1T@i6:DePJ>=GSt*?+/>=
F#piZy jPt/LYm%uPCkKPVk8K%?hPpAu:&6FGKSbG6<GK@H%@G%kJ?+hARa5S1H^Z6FlTlR8mb#1$lM=wQhbbMF
QMdXb> t$Dp4$E1Y!B!IZ$mK&bweddRX?cnY?SAeWlNCuu6m1J!#&Dhc\4p49:lqPE\^6qJtIL/eB?<AMKb:HwM
>/5Tda 8a1N*%^jGeRhMZP%8c/<J%@yJ^tIBBil69yMMMDD&bNQbJTbl++J^D&+PM\hD6:!C%Fdp$Ki?4nnJ8X5
n9YKRl I?4#LcZ1<%NMk?&aj&Z1e$*hty1:%e+#jtH&F/LPEDjQ?uG&!lNEbVHC1m!wunKP#1d/<>A*^b+hAW&#
hI41FT GqHLTbV6S?1&CuV:^ZmIEcCEB+R>&i%aV&/EdFANkWHH^>@YHJQFIqdYBipcBQ8cNG$9J?$@$k\LmiT@
Fk1&aF Ym@YTH#&YhH?m/hclhylQRytH^HT:Yq<Xdla*^t?T/=dQp^cW+?>FNZnep9n5aGdNNB!Y!Yn4ieq=A!H
:k=uP^ *iCNaESn5u$6/Kye4dS<8F<$bL$td@>!TpKeVKbj+D9I>1=C#CeYn\$t&B&t/FdXpXGYIeyd%Zd5cnIT
6Lk!tm E/p/wwbFJNtKYkW*FLn!#knHp&tqQTa5Zb?\VudbDE<+JZ$S#5<WH:9dC6nMPh^>TcMkV%\aNZZ^Yae\
Qt=q/B WjlEVJ9\Y:SM8=j9tYd+!VFhday@+?+b4&d1miNK=e1lZ:*dQdZX15n&#9KX?8=MF/TRA6T56\kKGlG\
?Rj6n^ en!nBqA1YNpD/*>iFZu!J#\C<@QWyll^nIMRqcE/qDIT$*S4PtPtSe6t+4QmwuaT5YTWbAXKS^CRiiKD
\I^<ET <RtFKGKVqeP9c6?lS/uaJH=pjb*<i85J<ZdqHpyy9hndFkF&$lPaJna?n+tcNmJQcpYp^p9MAPDuIGuS
yKDbe# G/LKFYINcyj%L?@XLV/y>V<i=Dujd#Y8H>Rpp+qZVWeStcyDqTkHP?REE>i=bB>1@4SLktHHT:&L18PX
ClqKN9 cVKKWJyq4nQ1hBKV#Tau<%I>I^LwTS&$j9JRE$e@+#AMCQLk%*XeDiB1l!mbt>n&/^MjT^/WX^bKe/Wi
I8*=Ju Y9Eqj:/P?LYy+ytmnWmFI!TEEBIKAGJ#nJ+9kM:T!iYPT1TE!tp9C%YdBpp*+=TMY>GBCWTlD&dj@$::
8qDDlw lTNpXa&VG\WS^=G/+qD&/9NLJdwImTYJR+K4ct1n##mEMM=tl%/me\XeHA/=94I^Aq11/q\<55i/#C?!
PX#6:d n+F=*K6=D6>Qqu9mSp*Xl/^S1t^1&IjAXZ9%?1L\HXPWpEec5WLcJaB!+1eiyjBR*J*/=Z8:/b*tYMmy
mW5Y\w n\bF=a8R#Tc=#V4hHJ=p@\jFwt1ibmESan^P/lLyn*kymAP>EJ@%mK%<u5HynY$TBQ^m9m9+BH$yQ=N#
hlc5^Z m>PL$IHA8b!P&C:aN$S&G?5$Tb#5K8Te:#aPnXHW5<*5eK4Y41VDFRIcc1V$i51I$*Qyudi*QkP&Rcw%
9^W*W\ HSa4ZST?CJ6btT?/T/+G=P#1Led^%DA8Zy/yi95!+:Vh#jncy=/TLJ/i5Aj9Dy*DV:Nt%Wcd6TX/#HW$
c&kt6@ J%JcNJD1<VbN4NwMKA9AZWNu$KJ\9QP\5J>\>5h$Zw<9Zla?HVpJ#>aT5Wt1miCXD#=AlI&&&w<^THhq
dIF:/e 6tQ$I\JjRk9Tm@l8c&KC5i?V5yZZ&RJcGu6$RL??VF%E!:mTeZ#9^>5MmkZt>T#LDe$M$tV>++PFwnJN
kYM$dR %ZMlWT^I<*WISb>*PVbT^X?^FZ!XKICR/\K4ln649&jT8P$PPD+mynwEdcJh6KjLkyTIhMh\iBQu:L/c
Y:9yHY J/SKalD\D?4NZkBuHPNBQ+pjNjZly@D1q@SDqV5iQ5FY<4m6a9W1jZBhXMa&WI9V=BDTn<P<XQ9T+MD%
JHLbKj PyJi#pMRDtlt*Ta#Th:u/9a*dE<16*LS8dGb*Fhq<JCVJ=lK>YFXyYc^ewAAki>/d$BW!Iy>ctGQGmm/
/F@k?E d#qK\ySQ8%kNp65hF^jnF$>TG#F8d:LLE$K\FEI1GJhFY8JGFW*XF9/qLSJE5DyKZ<SEB?DEl=a:Sl=L
CnM5T5 W=TVQ!ClVjFiLmdXL8Bt#X#=pBlFkJPd<6:+pYaE#t??!pu469XIZ$h\tnW#dl$MjNKe5uaySnbZb<Jc
:da@N& u@EWlmk?Ny:T5Wu6KtK\%WHq%5<hLt5DIhSwTk4?8?@ib:4p8@ckQWypWu4P#A/TH<\CQ%p=tF*jh6Tw
Np%PBS 6iIbMQ>Tc1tF6Ed^KS1XeB9wbH>hTF@njinR5e+?bM8ZS5A4qFt#qMW\lMAic$Snm8lJMkGJkJwBeB6#
@mpW41 F8tJ:ju^4!?6*>Waj>Y$@^lETWH!FPjW54=$Pl5e@m#n!h8ep5C!ZaqiJam<II\8B:N@InJGbNe59Wmp
XVQRV* DCJ:Gun\PWmAM8W/I5%6INQ+Ztn%yt4$c%5S^SRG@X@d!WECYL?N^ADHwT\dldyLyJd=FKWBl\?bnM<R
GSDFIV a/mKYYhda?hE5I&AQ5XmS*H@@bRw%KVwR6aGHt69AamSVuN^ASR%i/nKSBy*M^ew9HKRT+a8lQebqS>h
kTYna: %c$5Wh^tq%I#5?MBT^nQPB@hAbR#?Y!?W&tLISY\QDMeWdt\X4WP#I6y6PWQk1T?DiGGZ\mT<hpZFMT1
XdmE#Q N?QJXYndZ/Z8hnaC1!p6&:$Ghcu8!>EM<*GV1u6?ncVdVwV9q=NWSNI9JeNy#GuTeD^wHTGRFPL!<u8K
pTuqw@ HMFHSIX^+#DXS>yhe*n\%Z5*#VMQt=NWIDQAuj6eu4JhY#&&w5*c/S5Lka+C5m*SR%HQ\!G&\G*y&?n+
$=ACdR +?!\$11j@yV#cY=L:eDi+Jdud*ppC$6#M\*/pqVL5<l5E:JWhiNjMA^YFDC&cM$Xj%6p1:Py!DHp5lqM
QkF:ul @LEpZ?C*X<n<NE=K#DbMpA8N^pF:n5Q$bB\PTJM5\#!lhdd9&H4V&K@mJa&ddTc!PHaNd46Zbjc>weS&
1lC^%H It9*RMCXnGFl&u/W:XpLM=im4q=LhjeV/Z?4lYKYJu+@G5qEjydGcyS4=S%9ZEh=a#8NXciBHS#Jj6Ld
wY!TWW >>Yu\#l@4tH=Re1q9L6y%9b^I1?iB\qL/c8Hky5d8AKM9kEuJ+44adX&jZ>pDI:Ap6$cc?P?\eMySF14
$E&!bI ^GKtd/*HZQYtwT@Lk#=!Cqj/ltaEq$Ij<pm#W?hknq#a:kaM*y6+*$uK?IjE&:/<ZYG/d$?VX#?kpHqS
16FSPe !A!#nA@F41haaPB=&MS>XJ&>&keZu^8*b54pQTkJapu6*nX?:&B?4tZp$&>NuWJD:9WIl<kc<cN^>%Sb
i!N!Fe !*T9qbw#$\k9WkBlTdM5KZnhP8*k<EjjJEnSkZ1!&&!kn!@Xm5#qQ@G&BlWVBP%!LQk@#4Sjhq&Jc>:S
C:KW:Z I%^Aht?V4E84wP%K>A$4m*61R?y1Kb/S89I=B&!FNTReY/1p6JpkLVWw4?FKNw6Zw688NWFpXb>C^G<*
\WE?hq CDVKTa\4M=h6<jdY:NTZKWS6Kc^JAI/%$!ZPZ66@etlpSjcwL9LMwJLL$DV&>b%Fnm@#Qm=uAN+Fj<ud
hMj/QW Rb@cZ/K8&Z?6m1F:JSHa5niiV4FH>uLNpblqWHHKRW#6Y?Z8J%S#:\jW>!cB8P&%iFj&F@KSq5qKLG<?
wcB5%t JCM@FJ\&16kZ/h1RK#X&F8a^tCF81/n9E1A=VRPI5WueLBR+Ed8INwe\8Ydk1a#Cu/!INP^@1^YSF9?j
6S5N@j 5!JT$H@NqElB@#yV<l<D+Z<bNj>t9Q@Q+>4?\wyIT@\FLjGuKmNy^N@R5D@Spu>B@:FGTX41L&n^Q?W/
>KpZyA yKZ@kwdBj$>LRcF@Ra9>\TXJReZ?k9/n#=GC\9=t$j@kNcTk+9<yG9/jw9<q%@FQ>4>4Sj+n!9Fj4AkM
@bLP%i >1>Y=N@jSQ?6Fjt*P1d@W*Ihn9@u=nwpFR4JmEVSNAN$wCVQdVkWp*8dpcL?&?JtXbK*mun9bFAHqhk6
&>$F1@ b%q+::DJBPPwFt^iBwd^q\enE=Nu/DR<kw\a16?tQyDTZC65VWdiIkK%CVhW!9dkwPhjKQ:6mDlYANHI
a/p!6u NCQF&ipewu91B#qDPFEVbqDyQEwLKi#N1EYuqic6L/:nEe:ImL8G6GPa<#pRyb/qFS1$1QL1GSRSly*9
iEkZZd W=E%Zpc>FV6=D^%XnWXu98&*#I81ERK6XqaC!?jLmC9#HXjy/@dYh&BXapF1eXn!qJ5?+=npYR+N<n$i
n+I=Ne <a?$\p!!btIS=*Tpkwt&hAwGX$cl%TP*8inMM^+^WC$?pVNmMFRMuin@XMe^1RH&H!Q5GXjE/Mq1bZaR
pLM6J# WquNtYP:IqyN+jSXX8dV!XYTI<1IYk9WVd?89WI%?8p5*c>*il/&#YpKm+WW9qXcjcaeVp#Ip/Blp&uY
a=kbWX \8m+1MmRbX*J^WJbJSm$M4nZiHARb=WJh\$HQhH4bB#W#5%LZDy6VVHyJT>?TAta>JG&B6Dn:#lWuZ#+
8GH4ba jt@EB@tXymeIhSIYie&?F&qRpCh9c=cdQ!5>HF6CQYtBy>8+dZFyjKD&:u5eHX%%+l^bN+4q&#V6SXIa
%LbDpF pBW*j^j^1a<?bq4D+\uT>@d8mZDk\MyMb@e>k+=Ce#FI?*HQK&hF@:ud+HdKtqLjc\Vhh\:N>jje=R^w
k?c8^> n&816B89Q+ActlFF4VEhK6Zyb<JS+>imE^=j&<nMRQDFb6=ZXQ4$>E4m\6J1%yJVlH*R:HZ9h6?:XTkb
McCA<? &WINdtPyuJAn#Lb*WAP?^kBkWVm*LL<Snh5mB<wV!FMpX6IBw?lG81Z5nc>SDVi#!=$^m^8EHX$&+ddh
YkyJ6T KJk6uEKAh/u9bSKC&AQB=6DJEF#u/Vj/:q*ZAdyKI8Dqe5\qHHk$WN@k5@&FHR$CWAa%94EmQtI1e\91
GF%uP$ HS\465FbjekB&B?@CCZmwTjq*CQ*&Q%MLYC+*QiE<Ij<^A%h&c=9Jb#9^?NWc^6=#yt*F%bkmt@dd!8k
u$&KE> ?9a=pe?%:TX$Xiknd8RE=yqyVhAJqFHiGLcCS=@cWK1X=GeSbi?q$kVIN@Lac\%d%$JPh!lXGYh@/PZw
$iVumP y1K::tEGqk+*!h$T&EhceE\an\pHN*$6C>c:Le9/q6@Ykpuiic6=j+Ab6LKL@8Nh$nMwMDINw^E?8HaH
ucww8& YD9EyBkYBTqHwiuQ5R@$68&T8N8I^l=i8#$jpG=P?mI\p$@diqFtWGtK1dR%?uIj:Y@*@DnjTR6lB$n?
tA$E=a #PBiXGSBdL/u\tY>u$j#mLJ$IDnDD5dt5!?C+LM&#?W>Q$k@X=&Z9^/w\WmV:8p>$u4Zy$dTe5tW$$HN
PV1CC\ k+m5nIuDP^VAQ\CHKtMGDRIyjS68bhdY#nMb&XDaXliuqY%kL&a8di\*&mWG5m8ZYL1kXe=RlF/iFtjK
tZk6pu N@iwS6IPMc=%qw1udwYjm#5KRN*TV/GY+L\ReRP:B+VVWB6:!HJ4KEE!$^PCl>X9b>XWG?XaakeDpQS5
-AFCpD 00016526cf7001202b4 Page 220 of binaries2.zip
<IGL*q GRZKZ?=XBC&=yuFj/4b&lyTddECm/1!Kybhmy$G?&mu$be$dH/&81anDQD<dR%@=+kXlwb4md*<I?F%b
A!KE$a VhkWR<Wq#A9I+?6$pC/?An\d?j1i8XwS#c>e1\>MhFZ1<REJL1Rihp8%H^>tY!RE:c=?W9Ml#ePaFASX
M<Lp5A y8eICw=W$/%c94Ra6X!?yPaRMS*5tH+:dXL:*yj8i==Ll5k:ybL=q%Z?mN^w5%=n9YWV5*JjBVXDcJqT
S@5=YX IK?lkL9mpDJBcF4ABQq*+l!NFcydyiI^1eV$bykGkkt@1L!q8#BeI$*9?EWa<eknj#*T\awIaL$JQphj
!d9Hm+ XC/QQ^VpYPPy/F4pZ@?TaYDDNqdi4hdlS/bX@kyVtGCN<MQT*6W98yqki5QiKVEN:lHdE:E\#%n^l*#C
Dl%%\\ :<%iqIi&Np#wDk1^L#Kc@bV5@MwWWTISutP5RVI==^IS1e\ZtZL?YDPVXqZ!8kPTZ55yZit%\ldH<u&>
w4TlVY Qbdm#mj1KydLnN%pEV4S<SjKZJiN\*p/R&&D5F&ZkHu&yT$LiC5$mb8/TCZ%bX:Gmhqiq=E</#iSjAdm
#u\y#a b4+G*km9>dXH9Yp:B>!:y5\*lC*%ilecWZhB4II:51ZHV?ZwkqNWGCW?dCb?IMKcW$V9qK8/6j?+Ij:N
^bIZAM Q4uR1m\qmNGhj+mGV>*9/e:lhjh$<&1#V!tj?D>>B$4KntA9&t&@Yj1XpADT\9kie1m$6qSE=KD%<EhI
+:NA:e jWawdlq1RyV<\!@GA?/cl+<jq=bSWTX++hWaqST%<IE*:h/nNHm8N$%EhXtbZ5ed^C<V6:AWtMcN8&KH
T!\Z\c 5CQh1X^hA#!h?MC9jN&$Dp<%!=><ClQVM:@$LhMujXj!6kJEl:>cBFR+qa#RXhdwy8d?1Le?DXRA+=Qe
GX9RS@ 9PbXp+m+yRXVt^w?uR@1\>t*M:+L+XE*!n@:bPmaiTYauqS#%91^jamk*TSR@HKPPIk%%Hj9Xij:LAiL
\A$N:8 ^ENaGaNLS5R:B#hH=N8wAiqK%AQmRPa/=DM8Sl9?>:j<#l9dPhNm?qQyYnb#*5yNuLcthw#jbmC6bu#W
twS%*% #BcS5Th6TTe:e$9yBMC$^Y1#CRn^cL1u5Z^+>9$&%=IDT#Gyip@ZJ<uwe@E<956^YlG5hJ:C?5<LT68S
HL=HpZ <ZT\/Q!AJ8bShFjPPyZcJtqD@^AEFLZ1KA58JXDcNNV8ZIHp>V^Vk=/lRNF<5?9<5!mAP>IS?\qKpHAM
ka:*yA i&\N!=Jd?h4L/LEl>TKCIA^5YVDGc4:9uGd4Ri\\W>AN&l@V!FCJ!m8d:<AcB$$wEduL=MW<IV!Pj#di
<jbL:5 /auFhl:n*?h@JJwwH%hL:Nycpl5kLCiu/*EaKSGA6hTM>I<e^tQC9%W\AIXGllM55+ThhTk#IDYNA?/L
%HnaF! $d*l@XSWaQbQRNHch1yb#eVVC^hDeP$wyGbiuZD&J=e=YpVnY<$\6idWa%9/tQ*d%CV8*wVdhS/\Ae4E
lajMQ% 4+u6VZd#QGNA8c:GetIl5cm<C%9eSbGubXX^>C+mkcLhk$^t>#maI5uV&WZFkChiBPe165=BIic5W/lj
N=bPDw DMFwc5YWiFn/+?!FQiI6eH:$ELpL?&yNuJyPqND*Ve6n>hj$Nm9Xwt>b>*t18YiF>=&F6$B9m/BpTa6=
piSicK =c8Z9a:F=CG&TqRSR949J>PJmdqET/i1^WcK/\4NQL#Z6#eBqe!QlP8B^Qun//t=%VQ/Gm9w9SGd?NbZ
yQe1*5 +!Km/=h6J?D=mk#PCQ*mV5NEAH%e9*>S4<wl??cyaG=GnbC/y@=d<<NE!GZ?eF6LDSJ>&Q^YYTPqFE8^
+<MXG% EhP/SYXaL^X=t94TnSVF5&1\kt&4tw4qCBW6:j1w%LGTyC8H@%aP:HKiiM#1WV!&8/4Nuj6#9*N>V<y<
#XaAqR >:kqtXZjp>D<JB*4WmNMHZ=WPCAGp$N/=H@cmlLyT?+q5YDtMSIYhpb/jBVqZwJ=MX84QH9Fd9&%Jn:9
SNIJ1K qPKtmk$L#:Tw&B4yTu$Y>WlD!CB4j^c\iLt/*PKYbq>cI6KCG&1u>WbW>I9R!ZuyS4*MBymE?=Yk==94
d!>W+M q4WVpG!la6pSJe>*NTLqTw^&wV<ulaPCRu<8lNHQ^Cu+<wA/wk#NG@IKT4pYKSW$S6Z5NhEEp:+m$Pa5
Ea<p$h lXYk>RNyFQ@6jZC%eAI^+T?yWj>y<RRbH9+:B@iahjDNwdQjAj!RhhS5dNDDI:c<eJE44p9!EK#G?Kbb
L@VXtL \1a#yqAuyBZA6X>w@=PejZp8pXa\5W8R\P///nBdIhck>B1nnXSIkl$:dLbcELmd<wC6kbJ6tpy^Q:Ta
Tl*hR& ikRudpFQ9h5>KE^E$S:K>SpFD>E:QjckGYR8km&hi!u%wJ=N94!X9+N$/?hNt4<\Z%K9/YdT?5jL*FR5
yVGWR8 X?*F8t1H#NF^yDwyCyE<H&Hh9PlyReTIWG\+wX9$EKp8Y*FjX=namhlkInFkXuHESRV5TlFJ>W&X@a!Q
Z/^ZC^ RH*V&:JPW1DRR&DFYuD%/t/Dj%PnDF:RWt%%VHMjD*QcZpYPRDSYZ85lnw6d/+YR:YA/j=ecZR\qV?H?
1t?\h8 YeWI^eyli/@JIa%*A@jhI=IAJcheHH@1up*MKhedQdWNjbFQQB5a4j+A9TpNQjJS#tHQN&4lPkTS6Q8R
hk%$Qj :>hD&tqenI>u88y4JAG69Nh=BGF6bZZ*ydnNKCcj/Y*dF6MTQ:deajLaBcjPDFl?1>TlEjdiNcnbFQd5
14*5\a 1pdjHjQbN1i4at95lw/?N9QPP*Y#W/Y8WScZJNdN>a?1aZ$*S/\didM^Fl+NWhJSi?X6QYAVIR=HI^VP
#=^QkL n!GcKtWZ^jSkA$El$qSJ!eyj%$1&dm5qj^pFDZmZQ:P6$V>d%kRE8Fjyc$alkEL*=WnV:LkMi++TbEQ*
k1>dW/ bL^&yIi:%yAHeuI:hkeQbZ^#PbVqyaEMe54W>=\*y%#<PZT!:k/NGCK@*1Q&p*IeMD$R9W8:4:@^ZGJw
@#w:>V :Y:KS^u/*KNX:65Z8i@LVhYuPJa@C!^jPEllyT%By1Aw5<Y#8+Y^XLa&4BSD^<KP=*qN1$1VmSVVZBZD
mpN/KT AVEZBmKCDCLle8lw+6w1\?4PeY<lF6ZTGXMQTYw9LRb\uqpSySe?cIpBn4yiu5&Ach\%XnwFSnCIi66E
ISYRiK yaX4PZ*^4h1h8dCm$S:cZ^@d+/DWKJ5DAS9Z%e=keVyYdA%&ttlBqeN^XS+dD:$#aw@YR99uEwYZFGpA
R&G:#b Z^@b>XN15YMqS6nB#aHe:Ba@j^i+R>W+Y#NcAtX@*AhA?i^lWp1#GtPb9^#BhKJJ#tM6LbhnXmcb+dGB
YDGYMF u1SuGGQ@nDellSdi<AwMtbu=T4K^A>5ZG4b^9@LQ<E<eTt&=idtnJ!1DB9/nS^XWld@a:e#:!it@uMCQ
CEN&@4 mpPVw&AZ&\R@pLIR1yYSccG^AkChpPPb1P6\\kmal?AZPM+LkS?6QbB\\9#aNn<ZW+%G$c^F=@W#Q9K&
#dpQ6K khclM/JcH*8Lbm?K<^q1!S$Z*cjY8lML@YVLSYk!PE#LE#>X+lGZJQVDpa!GpteW:\HF?@1SM*lp?BLV
:C@1FD ^^mNk5>+?bTP*41weKWWMRbJ=bAi8cTEV4tnP$eGTL@/b=mN^Hjl%YMN=@5bE\j\I<NCb<Sc+nGm65Pb
b*kRt% yZX&tYhpiX@hKlIMVh$dRuK4I4$tdLQ$#@QTL<&*1N&G!N^Jj:tMK18KTGiiyhmJT4pmu4yI^L\jbY>H
9q%TN1 QL$u*bFuC^!#N4nHT!*nt+/m1L4d8j=W:mP*?t9d!cJ:$uP=F#TLBF9P#S<ey9Mkwh!!YlP8$mG^e/Bk
SXuH?p mapccu86iFyk=>m#&Q*p@9mukF$L?\heAGnlpBck5LWTG%WN%T<YaBPl<ukcdWVcKR>T=nMwS^nKDcek
i#PHkX Z^hX4mRa>D*4H/Z!h<>cj%CM9W<iX?yBMQcJG=l1>=tWj/\WBC>Sp<uh:\8iRPeXAq**EeG8tFG:AN!?
%<@XaY 5%*ZuMSkn4Ka\6K8tcZTXSKP*9JM8LJ=Xq5/j&u4tEKe:DG1^/Z+kcZXVbcYH!TdlNF&F#4yBmpBuid<
S*B^@J 6<Q5AjS$BmY&D+Ru#SWpADXq#%YEIKGC<:babQmAt+>>JFuXYMcZAV6^mWh?kID16Inm+*K151iT96YL
p:nF!4 &qu@D*6@AhZt8/::\lSI5CT+qqKK8!dBY!S+eNem\h$y6BRN:m/q8L6DDZh*K+Zm:yT&6D*@Phie?>6u
$^!#*% 4ht#i6ba*>lu:LEHk#Fi*uDq9b<*#@PM=Q:q8t@Kq=lDChXq1NVEly:VG$%18lpj:/hq/wZKYD+PPNGX
Qtc<<a BBylnS44=y1\9u9!1$4+iew5*EXu59pXZ1YD9>K6*#&*4RZWQMBW4?jL5mlXV!@MN58L+pqCM>$wnlh\
P/SK&X lPBB#DwQeN=GlTJeH^cIEL/BG\Au$<WND>8ZJZDZ^\AeEnlNjZ!6A^<t6#wQkp1WACy#:+$<9N1cSIRY
Nh5lB4 d!yIQ1HI\qTE?uB8HncYdbW$56u!h6+wdd=AZDX</?1yQBJ\Z>cmCT+l5*CnWJSZ5*qItjwwl#M\l^jP
abJnFb K$JZX16MPH8$CJ<:N=eV8l%S1VZ^?pR:R/p*<@T?8J<#VVT%L^FacH?a?Dyk!1j^i5!jhYj:<%HnTJQ%
/Q<Snb Yc6cYa:*XibV?Wa%L@JWuJ5R<auI@V#dQWHT?NWNh&p\D*K4%q1XVCFl^^aF%D?!ml\9M1>ET>*uaDi$
E8XuXe m6AW@@GpXtCk*#C@H&*?@MbM@ZpI6IbHXpQ6itpW5By@6/yZec:iTt?Q?&61/<upA9iMt=4K8j:E*Jn4
WTAVGj TWj/5eLTIjL%%iQA\@e=Q^C<?!kB8%?$\LX$E#KbIRGy*c!E9VGQwaqFR4eR&F65pnyJ#idl:@Gc=D\B
#SqHK? DkX1?^FPXLlyR#HY4GaM<wP^\kJyl5*aiNC8F+NXpbVMb+k*>NaF+Yai@aT\Vt5WwWB/8Y&tT/!cTadb
C+>dC! n*iWk:p^M<QY4h#1@iQDR+p4En$jNM\?R$eV/8I!S8*V4#e@55iGI&Xt^ee&SnImQ>>tN8Fuac>I$FEL
H/HQAD &ptu9&8eV@QN8hciH=nyE9RRe6N!dZyeAY^CpPLJ%@d:?m^a*lLL4T<MS&%&C?&B!Z!Cm/RCp4Y^1S:$
MD/M^m qw@YmH9KpX4TVk<>+M@c88H6c^V!u%j6@LLjZX?6cM\uS<Yp%Tk/hK5GM@XA$SW&R$hLMA:A1j9<=>@L
S>*bKP ach#RnkXjNRXFmMlwBLHpu:?T=8+C8MwMYnwA9q1^=:Y?&i<BR9Xl<jVNFjT?QC*CXZejyZ:J/Pi@e6Y
>uqFWq !=%YCtY4i%R?VW%tHWjdkyZQQh$cK@4PVD9e<XIdkXbuZ\b<HeLQmF85JT@C65N&h941YC$E4IQC?D:e
5!WKDb !=bYT8JRYn<=jVX>/J=+j+Kt9jh>X8@<ctPCy?*SVPnQD?T=pPm=d<4LYnkbJWQ??6>u%bKe>R8ahbZZ
Dabb&I n?Zd%+6?5aZ=j\9L9T^/*/Wp:&jd<F6H!4<^nQ>q:PZj&5@<X>nL@?ln@n?^F\HBQ&a9@$k:@+iE>u?p
h8Ba>q CQ@5pQPj5^hlj4+@WR9<lpH\<@?B?uj%9IV=Bj=A@V6HmnC@+B?wBaX?N&:wu/l@$%6HtB@&B?4j%jMT
^@bd9X =wj@mj1*%^d/A@Z9!R&@<J?<bL@^5\n#@<qpk$H@6SNHYPBQJ66jy*/n@yQJ^m<E@+%c+N>^u*>1@=?+
/mDkWW #@<\\Q!h?\lC@\Z*ESD<X>#u4^j9@:ll@q9hMPQ@dX&BFF#@=wb^9<<DEGRwFJ/AM!45dKHh&DSL\:Di
K$t>Xh JNECmEG5ZHGFbwNEIFhQ8j56!KMqMmAQ*>=55$1GES!dNCSta!Vydj?5eI?aQ+hKa=8/AEBkWFJayW9!
FqVZki aB!hL>p:*5JwNkQ6>8l6Xan%cFwWd=1hdWjKy*A641kp=@!E>k\V!EDHVyDdZNyhp9ypw/SnKDJ%J?$J
-AK?XI 000dc69013c001202b4 Page 221 of binaries2.zip
Y6k&uu ZtpQdGt1bm%PP<HlG*wNh4SKLHyP@%/5l<mT41ZFS?qWVYYTCGm#Iq!4T:KN&nlYAWYtN4?C*lWqwku<
WqI5pA /\%YlAeNjnAneJnSMaVy%&w$Kue$%1NwSY%hqbdZ1qqk^HNBk=\HSA$dP&+%D!QNcR>9u5*yZBy1i?C:
Pb=\d4 6d1B5jeS1IY^Ith<V$X%9Hp5b\p>khW&Qh9eW!nmFDbm>TnW/FpPP/1*8up#H5L>nyc5mj4TJF?%ZYh!
\=mqK> 64i>laRM^JkuyY/kZ$#*chk<hmIJmhXmRlIn*KpS8KTj$mA$59#AQ!HtqtlNcIhpd9F9<PiEmpq9py!=
6@ZuL< Zi?KGQ4b$*bh@GmGdIuRktRi\kBmdB/h%ae?VuR#Dp1>n=4SF%+ZnbG^NJ8F\^m%mdVi!6nb1?SwK<?a
1ZhiuS p$YMhC5LE$nMNKdEYT>P#A#+V\QITJGd1NSZINGY!XjnAtFLSey+^5p8>:ePQ<cXCj65+D\citaKIQ4W
P$=IYd <11wS&=^LJaad%4IGAX\EX9FiwEtIRT\AenMnBScy4CT=9\nb1TyTS9*nT1M6>/\iPPTZCw1P?4<cP\j
ZdwAYI 6NEbNwKNFM$J\5d#<knTyF&C?m6pGVLT6G+$PaL\mp99++I%1&Yph5nahm<m#WuqbVpW$#DD*6$#=/@S
11Eal? 1nwl+jhqt1MQlRi=cy#uC&yjcpW^8^MDlql\8aHyKTJRj8JEGC#DIcSmTEPDBNV>=X81nK9NC?Ztt!JL
^*HKlk NmMm+tTZ!l<XZMpBXCwHBdCSGGw591T>#SlR\F+MXhiN>>j==ZlqHlI5t6I!6<I<1LJnKD>Ry<!YI4Ij
pty:m/ qJ<t*8!1>dB\$W5N*TEM*eew!L?X$mQG\!5&pH<EVl+D%Mt?1hpW@*A9Q>=$KyNFLu\hSAS%XJLL@MmV
DQwjEb J5MdK%WSk1<^<1nR>ph5XD!k!8yX##PqTQQqGm@pA&l>i<R%8ZK!V5\JJ9JK*bcmeCRnNqN*aLeTV4HS
XpXX+$ lL+$$IQdXSKdXqk>Z^?TKBi?iSWdRR?yZaIA?>AL!>DLJC%m^KQ!a>\^/NhI5/dJJ:PLE!qmpi+iBj!9
A=?SD5 m%kI$1M88bNG?$t>:=IYDuACpmL^SbuaSme#?%Y+\jWN>G8DtS$G^jq+enP!TtShF5?eXA*C:<9X&YjN
8dQ#M= yK9kl9Ek!:+VJSS/Pa:NSiH+?TnGiyA=E6tJR<8w>n?T5$iAW1Nc+Bu+#F1QCB/>1?:+FqFpL=BaRZa8
y?nV=p DtN8Yh^jQXG&L1<bb%yTG6P!>V!yXtpeS5&WXS/=cE=ic%!!<1knPk9\<X$G!n<:qcK?8t6LqPp9NF5/
WdC4hq =uTFcE&N<8m$<nG6ZGepe>Tw?#4hI^?hk9M<etRuB/cVmt?a+>B\NYA4&=Z&c6a**pQXQE8bu6Fyd?FB
^i^NAa nw9L^dSpky/$W+!#4#nIKDFY19tXMGm5bNQe^:KMCLSQYF#J&N8y?nE8^=@WqRudT!4dV+&Ni#E=N56&
uEXW+4 kMWqAb6/NBP/>WGehNEPFwFe\MGXhE6Vl8u=@H#M&6y6:!!AFycd/6eGAY5?ppT>X+9FX!!$ybF^Z^bi
BN$q5S JDbl5<FVT1T*klCwL=mHINM5mY\:kJWadZ81q&t^Na=h$blAj\j@5eJ!^^F#PE<PtNPT!#=6K88cQlJS
ai=Y\m dQKA#XA!@=#XW5huhcqenRS&#lBSh>4DuT@WaC:PBX%KG$8kB>XE44G69mJ41IKNakRKYt*JjVGKFYnm
u?@G^N ?jH^:j&udqYjK%VmGXcAi5KSKla4\%QTYNJG$qR=Mm9b1uGT:JVbuE1wYpYT@6nYytV8VXM=^^E=X5#p
H8DqqZ YA\!y!ZHEW&by@:&4/<btyGZD\Zb=6Sub8:wqVt8F$11WaZJk6dGQEwubS>6q>IWK\JGT\qb<1b#1+Z>
ZCYc5X >B^CmT!5eA88QXVuV&>akTw=ncakHdXn:=*TM<pPl&@w8i<cip*HGW/\D4wld^!FY5DYP:dQ<yILid@!
&uN:Ge >Hc5LjME4b?>tKww6HBKKLB+99mw5MbL\c%%=TGe8%?pS8bi?epyS4BH@E6#YZh1GWIee>J6<^IIl\%5
Kp+\A$ 9><9:nYC:V$#5W4$n?AG@&DZbQ@8NSytA%E98BCy8F8:9:blbMlnlKZX/BTQW>cytNN>PpuHNnXGNCSw
p=We>p !pDyhPyBe\:eluwPSVD<e9qGS6F5q?GDQP/\=5nR=6#a<CN=/qKZHiT\<YGD#X+m64/\Nw^D6tdaNmq%
##C:qT tc:\/FYpQA/ec$b#NNB#w%QkDPVucp?T+XWYcaqI8<>GJS:dpXT>#\J^LDhk:4#IFX@!bSqEbQN<^ZWX
1\l!9i /4/y&=8I+:QYy6Bp!y/SZDW?nC%Kt%c8%^KPEIh&?R:b#M%ncYa\1RRN56N%u!I!#T*NyJ4Q+t$=Dq?C
\*IR/l GXjHZ!=$Y\lHjuK&pY*Ihn9=\8$j6*W<q6hKT6K@lCXDba6p$SVm?X^teLu*>eMJ+pZ5!a<&iVRnYaHb
9@&G6W 4<hLZEPn^98VaE=WiKHFMEG*j@Z:KW9^Qw#X?p4Wd4FTK>Npm1%pc?@wDt@w\TcNT&&MK\hCpJiyZcZA
n*5>q# 9<w=t^p$899?<tR?1qnJL+HL$+aw5Yw\w9yYp?8#L/k#BuuXHdX<dJYSyC^>qtDewWdSyiaATIm!b19c
J<+8Mi +X4>aJYKl%Q%ulFbc$MDwq<@C?^iB=B=Jhm&HQX:P1/P:\b45BZn&BlH+5We>J$WV5VIX=<A<BXk\@PX
?lp=\D dEqNHMP&?G?QkyuC%$>KtL1DIIQt%w?N4Mw5l%M5lpcn=I<85X8RGN9EiMG!KESF9@18uDCK@1S1D%X&
MPXLRh MF?8=P%w*X?8XPIF^C/%Z1^lC:natc<6&Rjau*XHI<\Te5Fd+yb=ptD%p>y/@CcP%hy6GFnSX4GZ/Mw^
bYcN4/ 4ZKKjplNW+N=QBV6>&#a&=u9NaRqLwjwDu#\9tIK9@SR%EPqnpGDw/wEYk=Tind%qC\5^hG6TZhVQEy!
WAXF4$ q%TlRnu1wNJ=AB@6RDl5SBXbbYWhVqSSJhQdhX?y!8q5AG>jP1lmlIT+A1JSX%9j>Pd5C^X&GnD5Inb\
e^ejNF y&I1D/dpdX<^ZLuVd$9Eat5jDCWY%emVw8W\hFe65y5ti#d%k+RjhG#6H4hdWeP@ZJ8*ZJ#ZZ&G&!%n5
Dc9j9S :Mhlb9@ZqNmSID:+@4Beun1$pb/qqGF@849M:SG\qGccRnt^CS9Lk!P98>y6Ba69@5ZPV@:E$IA+ASl:
#lyj>p y^19FFu+yE1SCHZ+DK8L@Vw?VWcI>W8TRh*iq5=?Rp=Yq1K?<XD5N#^XKea:VBqKwSyHjmJMK#\SlaVY
KAeJG: pLJac$VwBX5@kMicp=Ty=ak>\w\^ABL%qDi$G*\JSVTCt8Tu=/It:jyaluA1dMbBkbe!AtGTWMB$*%BG
$iQP4n 5**wY?6#LQZFAKKQYH9L6cXP%EZ5%D5EqCWT*Ql4h6PX*FNZL!MeTI:YaNN?:a#mt9\>>Ajj#E@uc?8Q
N<*nGe tdX!/@C4GciR>qlEntdhy:mQc@m?&d5uPCcP&6YnQC<#+A*1iS=bjZ$M+Hy*=WRjZ4tZD+b<n=WMtDZm
ckAi5V tbQm#Byh/?S8unJlt^F<X88SuN1hu/bHQju<%1Z/M*>6NNl1:!8jARd&:P^8Sa6!GBb8\Lj>mK@&6RmA
8q=Qlm RAT^eP<lhEtJT1Y5IE?l/CiJy5:EcL9LERDn+ljlhBN>MKS&eYbwA\Gb:PADLqZ/IY1:*i%8<&\L*pSD
K6Xipy P++S>iWJVhyitNFP!4!nBWT$E?Z>+j5nC1e:mL#F8*K=ucHiX$$pH!9+Ql=#BESjmVBcK9QYyhkFaba<
*Gp:1E :lKRFW>SW=*a/8F$9J86I1R*6QE5i:*#SLSJh&^dYTMKtSJhAQh$RA!K1Y9j*5$&c6uJI%ujaC1<%Py#
tRhd@m B%%V=W>5*e%1\/IbNSy9*b&!\EPB*=ZVFcIh\VB1Yi&5XKY+Jmb#Pe?9iGN?WRJ6k>HnAaBN<M+L@6&K
i=1A1M $:t$wHAcnSMJk%Mm9<a:DSq4PLPjMm6VFC\ZwlSl\Y\LT>I!p4Y%GGhS<!1!P\C?buuDLlDwcS*1t:w#
SjXSFC lHa&9u=6^D\ynC&8S4miNjcLb+>1A%n/6Pu=hptJlRLQPu1$KHR\^j+nd@Pl\hc8YZKTV\1VTSNdGy+X
+\ib!% &JQckKSdpD:GYT/9etjMPIa&ahnR8cRjbL>8:+bjia=hdX?%JGi+HiXuhtN1bHbWMj#iI54:k>5LIqRD
RYJB=% JHqT6@eTayNV*yBm=J+^+EcVEyFWdZjqjua8%w>t$BJY+#i%u^qHKZ&A4P?V<itydH>T=aCcXuMdcL!!
?Hj+ha ykl+juVnj9/WpD*NdwiZw8E:19/bYK%?G?TT8d:t&d#*GT8<TbC44M!N!jwBTe6LY9wiYw+Fn419NPPD
u<<?j9 6e4PHTY9TIkJCHp8PZA/K6!^t%lGEF>\DHHPu$#%T/e=MS@+W&G^!unFkk>%=ChbhYwd54YH9=eF!dp$
E9+N\A 1+YENyilK8P@K<^J!Nbl8=6hYuJ\T%i#Yydd46t5^>i6!R+*:ZI%4CQE^PMii#w&&JhH:H4S\#V:nhkn
&P\VCI NtAh6Shudutnt=DB#*Z$1nYBBem$n%1&\u9B?PA58>/:%$I6lmieL@tR4*tk1CR?EecZ@pTl#^di/w\&
/TTNkX kE1mhyP8XPK!#W+*mTDQD&#Dk4W/:j4<aw?ZHA<E%wntkWhwAiePRR:hHETuZ1G&^hlQXMw9Pi9ut9SZ
w/dQYF eFTuiStDY=8VSuE1M$T*:LyV&Y6$h&+wVQ>bYF5wwtVqKYVubn\Tnc%MFTIX:l/^RtZn#!lFubFS65ME
Kkp@=< t<y4=$ZyYhFFe1^Y5ISFi:STi=q4?++n&t1n!?mkF%Xq5d@C9cL1dyZY%NjMK+C>?M$lEQjQNc1!&I*B
miRpdN #1S!Tqd^KVt:R8NHJd44WE%Q%=\pA!!pDa$l^:=@uPwIn@FWG4F5P<$GP$a$LtW\b>Hu>VN:b?ni98mG
Ypy%k& a&MRT$BGuFl+mFSkYqGe*IVWjpRp1hI$b6C#FF=Xi#HLm@hQ$/RBpK$w@p%^\TEJc=b1i!QSt&1:FnVE
L4:GA& kypmWt/b>AS<$&<**&FQZW=9j?QS@+wYV>+/eSCl6Ya=%e!+kIG8l>u1HbIRa/PP^^!wZlwn%<*cM#\9
lWmFGk a+wdPJ%ceuR#<?wwSk68bVLWI8Mb&YYKmQYSdMdZ%t@q:<5NQ$JY#\cyW^!4?wKn$*F=\tYd1ZJ:XMHS
$q@!ha Hnwb1<Lc::S&aq=h?h4n4ZYebtY!&VhNFL%ti?u6wG<:&/nM98Bn%/Z:=ZpGVqbImDGi/PQ\\#^qcLdM
Ju=I$> aTct!wZ65MK^a8/QR6tmwaktMyKawnTZLC1D8nYHpt#b1qelTp&JML+K1JqPdWu+:lFVwyDwHACTlq5y
/HnkRE !/ilFd#K4C^SKc&FkdK!6R+N6FbJyNBl/8*k%^:dIh5S\#jH%wL*@m^qF/5@KG6X=/?JmFdW?c18<1F8
Cp/MNy 1:E/^JKwPLA!XL$^YFhFKX!P+E96XbQ&G@/1QHXC+wS+=eLcdB9GCXWy%Ay/M=I8c:P=Q8CFT:mMIdYj
m$eyMt %9MiIlK@yq6\19w9ty^jI%phZl/TMISdl%/SQG9J5y1/#4Q$J6d$G=F<R=yDGTykFt%AXH@+RY\y>ujV
1M\qRp 4S+Vi^ZZiDc%bFWph1%J&&e%AHXJcKitL+!/=up^/5dy@ypD>lhn+YeJnW9tcAW*H<GuPkhJk$pIZq5>
l4mNcq eb1^QjC:MAcI%$LVHT^!461E/1M%Yi#:8PG?mJeCHN<895&G:6C<F48^@j:NdtY#>\4R/a#*%Bnp9QIl
tmBmWw u&#dCStbu@XP1E@:BQ*Kj!=CMM#!ki$1w8\C1hY1H$tVqAX!i^96a#W?!e\aJQ#V9FSXiVl8!EmG=&$1
*Gyh6M #<yP?L/w%dahJhyu>G&C$I+Nui%cKt%Nkq!bJ/J4kwIRYuwj1AQnKjc:tHAa16N@1jBqLPLLcL9yXWYe

-ApQYN 000c1e1d9dd001202b4 Page 222 of binaries2.zip
t8Ai8y &6Aw>AHYRQSR1Q@k$@kEKcBXbJ6J@VSi$w=#Bj%!??u:FZDidl^idDGX9u:FcF8uhaXy?Db4%LNG<bM#
#&yMJH k$HKMFd&6KLYM8HaeQ#PJw/BGNTZBT#Q=9HIiVH9Hj*pSStH8Dp=tStlTNHiDHGlTKGL5l>=mJJ/F?//
VmTm98 51Ea6:d*TJc1hyMu!&uH$%48Wk<$djiTq@CSQ94b6WN=h&TE>^/+Sd&CF&NJWVS9!L&IuHtSa@dnShS*
<biTub XiRDX+9llH!C$lZYJCjj/IC&&yquNiWL&Cqt&/#F=DRjc#RqGq<KQX985X8m<wtm8??<:G4&R&nb>#mQ
>*yTS\ I*=XiIQSSDZ^SXKBT9%tS$8h*^856AYl*45PF9bty$lN1HqaGL:=mupn!Wjb/1aPmhKtat9Q!=ZGqbiP
>ch:GF YC1#$#P:LhEQVBTS1hnQPN4AQ+MmETXA1%hH:F##WLN1q5FKJy&qw4u>Fe:c*K\h%4dKdHNQhj:/^<WH
<@8HMC 886wM8q\9KPZK@\6jn@TcT:*TuBqtSc4JKcpDKL+Y@QQd^YFJ1+M%Qj:TGukmdMZ6NXHAeF/a9Q#XJ:9
eaAZVu h=M!?mF^Y#>^I>#85SDTmSGtSL/?&INSVG$&NiaIjpT=9$?DVZ$i/9PwV68<aa!wX4k9wQeE*>JWeGn^
d=#pGP +<8u@w>V9F:/9h<bE+a:8>hudBRQt%%TlZ/Zu!d4hZ@@F9yRKKAB<QXh9>u/ZPAW*ChM&!%Q/uI6tul$
pP+>i: eZH\@6$VlHZdcd:%uTAjni$!QckAk=$mNk^#+&<bSGB\SLGCMjc@lEEC$Q?qMEkA>q?ERaL\@\mDBGF@
PD<k@p DIQ?pa9?D%u8j+EYBGB@CwMElQ=ELjkdICMk@Ah1tPD94m*!B&4w:/CIIN<j1AX@F:pk@^?wj&9EESV+
@$Zu#C A@Z9ka!k+B?F@l5:m!D$*&MNAhl@nnZ?/YD=P>cACj+L4CEI?^haR\R1<4?NueZ=j%<:C@BSS%86=CHJ
>hq:Bt IBuimQRuC1C!4^SB4Rc>=pBeTCFVc<&n*5eWcLeRby\/nih64ZEd&G6ppGTp6DBAWH8My>=Dm&SndI41
ZAELHN pqLAjX&>G@$w%J!p^5N+SRIRp:JMyL+ST!w+=Wn!T!#PEtHeHH6q>RAQ!PXQRnYt%iTeGhEXLWYHXnm#
&y=uiS aYKV#w9pAPLXqYN!FdwPm!EIwqui/J\Q^n=+8#?J&kFGTZmajCACFV<hVp&yB5llCe@\l%E\w@y1/<Qi
KV@4a< D@RS*I*GAwnNnHVHN>uP%RBakeP>a*wTk$N>BEit@FQ*JC?IEFXWGkFwnSjuRkce^:u*PSZ^y*j+*D=/
<X<W4e tiyNMwG1nS!+Sy5YL+<y*t6y>YPJ!ZkRGZbkp&:nhwhX/9e&<Y?c#RS!C=#N6$&tmH:uJSV!XlINJZ9k
<BkPQZ +F&H#DlNNKi8Mpn1dhjZKNSa?4#YY:5J6+MNm<yJEY$bIPVL6nM#DAh&CQRZ+jbL<A<8jijcjGTPw\G=
Cemb8Q R$hbY?ICtyZKhETRR8<qd8+5NaLcWC#XJ$uuIw\5SG=he86pwG<PqCH&GbdR9#ER*+RXI1/<d%&edH%B
cHM:Mm 6RuZH\tq>^p&=6c@AJ>S#n^AS<d*nLRcm%/LiayVc45FquYyNJQT<Z%$@ZI9XGMS^&VyMPb%<lB*q%!#
W%PtdV 9NGqDKC<#8l&ZVSGQiuVWSl%Z#?Sni@DX@CdV=V6H?Vw+N4N1<nZiWRkGdcSHVt/*AK$X6R%1Gbj5R!t
GC/M$B 8bQa<+1n#?\?=/+TQw&Sm%?6mkdqHP%QKywEnau#9LSR%cQe=XS8lT+\n>DQ#6iD>Q1PkB<%8H!+D#4b
#6hp?u A1STB/X&5QG%:J\e/uwF89X51bCKu8EV/1$FIZSjH^#P<I\FpL+VM4>HHFLuh*yN?YmQa&wn#\JT&@=F
6yVLYj A1iphWVJQtK\p^>/JW=qaeReRb?@#yWW@FVyc<DnTk$&jt8wL5XdRn!&h54t$yRTdZe8nZ=!*j+RynuV
H^L/i@ Tt!IiVYqA4wtP8ueHSt=J5YI5dNKct8VYNQZn<P*q5HpwSDm&wBIJ%t4iDScAkB59T9%N4\&CD/!69ZV
Rep:NV qyA*:1RS&#NN1yBp^HNnp$q/!i%8j5lk==l6$PZ\nKD9wHYP=:=&MF%mFLS9mPTd=jdhuM#^A$G&>S=?
%uB&wd aypaTFSpGa/5<e=EJ:&FI^N69i%iwAt&D?h&iX!9@QMaS8Wd%R$$D^ZVdQ:5t/<9^49=l<w<\QtleG<!
/6m1kP Jww?G>TI&Z%$8G4FjVq+4?EtLY8Em#T5LjQ8!PmPH?%<d&&KpwlEtyuTD8#NQq*G%5bmAyanjHE&>YZ\
SW*HdD &+\H?\9BZP#&:Ry>pqhQewM$eiw\>!bA#?&+D/9l@hnh<%pT1kJi%Kt5Y<bF!!8heqFp#Y<FbtRTji%R
Ph5Hbh eXNm<&!a4^L9Y<9EPq&K8$>t9h4YM+:>CWqLMZ&k*MkX4kMhEqFpb8YwbQH^+tmj/*@d6p6\Zw::Ip%k
A$$qt% b#LEKN@YCdqK%6D9Qj>JJ:Y8id8Xl&>/QnM/1dw<$q8+/cuFIcKu!9/^ktT+mFyWJ%<8y:XjPG:iERP6
mXIKPb Auy!T1#D^\Ge^iBVyN&%Q=u&lu!6b/:Ae?#5<aGL\e\:5TlC/RAJ9a?TnQSYib+/48w&pI5ce9!w&u+m
HQEQMq myVHl^Y#5<*$ic!h>>GYc/H1BeTbju&VW6kGuBj=%lciplWBIMatkq#dS=^6#dRuSjibNEc1%S1!DtE$
1C^tyQ #LeS^#YyjN4mZ/PN^lMy\6Iy*wKjES#4N\p#bKb#4B6ZSVpCRC6k4SS=1&MCLMjFcFC6ZEF+bcShIwmX
TwqMM6 Emu??ChZmHmt?k1JYbF=!Bc6ue6ZcyillI?^S!iK!e@\+iIIM^K*u%SNCT?J?yEl1GyZ@A@#jVH4DA&/
LHIjM5 B\^/$w@1KJydL8ay<aJq^qWGY!cHqDMIyN*Pm\ulp+8hq#Q%\einWQn<lWt!X1LLw^%hc1?:&T6e=>VA
Vbep*c wS/iX4w6+?#W&9WR/Vdp%$mDADQu6tyKCYSHJ:qnnM%lRt8hEGbw\/FV8J#K+M4NB%eDBX5ZV6LHdW4Q
yDbKT6 HFb@TEqP\9*iK\#e1\&?Yd!^&*5!EpZ>tpp>pt<FZ4c:nZhnp9a!jj1PY4nn=pa&RNPHJq#e%%K?\tTV
Qli%=% I+:tRP&nEaSudKXEt>JZ:PQkR1/&wL@HLpe*%NK#B<bmV@KR4EC5>m&5SZnlc>RmQi&IipaVwV6HqGTd
EI6Y#w >W#W=j9G6Lu9PkY^\IlXLjR:Q\Sbljj#QF/V%\+?6euFLblVYI?Dypi!M=9Wb$yZuM5c*#\Lcm+Bq%:l
WjnVLZ W?y$iEud^qVeCS8:GK^*m=BG48p14PSLD69:lcb6DS8?WDSF5=y?Ly98TMR^GKml\J4hy6*Yb*u9:DqD
AFHN&T aYW#TT$#<5I6hdcd?c/c!%nE$@I+nRbwZYD$eR=q^bh/\*DT4L9$Pj*=amV<qtLXSP#:dCF8NbEl#5P%
VmcS?a ndT#m<iY4Z9h%<W$KcI8Z<=y=T=4^Xnhq#y=ItwHWt48L^9JQ/&XPEm*nnQ!d4!ZEZuP1\4HyLIlmI<l
KhiA5k mK*GiwL6aj=&N1tBlETy%wuN181hw>!V^dHnnVMDKCWp$kN+F=>lyEFd<e$^p*le:q!pJCj@t<=Qe!Wt
8Tlmu: e+:*ubbjj#HL?@iihbHeXWBiBq5yqyiqKnXy:1J%+qeH\Z=J#Etn#4SqdAi=Nb:V#BGX8$#kkXF@Yh#^
=Z+wbi ubPMp9HtCMn^L8=q>%YBuPwCYy5H:inBI+&1Mc#4Z>+ekRk+<+DYJ>9/+G:+u%Eq!&+<%mh1eklZn4uR
5d!HDJ ^^Z>c$%ahIV$$?DPeZTJW9qwnk8QhT%wG^h54*wYme6u/kl$H?Y<5*T\@4CXE4V#GKlG$+Bu\j@=K\l^
aub!6n =t%>I%X1i&5uX>Q@Ea!dBpVMk4iB6*&mAWDZZ4p*ECiTaqqy1cIYc<!+&SnQF:8ywK$XWB*WJF4TJGH%
Wdbl4$ ieHYaWpHwFMTX*&JpI$R^M^LG1X:bMjDy#w8XhZ&jKekuX5d?NjG&@@e1+>98P<ntJmc5H5J4AHKT1Vn
/ph5=8 *9t&VY^+X9YGPMJ?yI#D&M&T&PaN^jaD!MHRQS+cIHdl9XDM#4C&t/E4FeuQ%h8mYin%R$T*tway1ylM
=A<5Cw i/nFdY5utIA?l?HZjV6ldm8k9/T%T6G6C8L1^yyMht4LLn^a:SDpIAM=/#/+\$<dK>nLmWGd+IR<1ASq
4WZYbJ Yh*/<y4yEK!nbHXXFKEPu#ej:BZeF9NALuBNc8S8BCklJBlSajiwWKccpK9c!9p=hXiW4ICAVSAaRuqQ
Bjba!* I?iAjY5@+d*TF6Y9@SmI+1BKZ4hc1QkhwX#Z+FjTVZ!4\H:q/IjaW\l@hAe&Su>Htb\PaI/%pPI69lhd
:BVy5K pilZJ6NyK&EGNdMennwjJn$8?i<e$!*FtwGZ4Mdkm#F8*5AcYiA#Neit@bkIjKI9E:dQFE6=y9TQJ^RY
jAMyyl CjW=tY5pw!%yyEiI>?IRlDbp:t#<wjNAlLlX*^LECepV>k&IGm!i5uDd+^TWwiBJ&JEb*#y!ciGSy:MB
lCl>aa *BM56TT/JBi+bCTA1D8:9CDcKVCd:L/+XL@pl*ldi^FyTcP*Ft%^\LBIC>:L^>Zh$#!B^$J>w%IXELih
y<WiL= HidpS@CLDH5XM==EI%EXD@dGHImTD4QmNaFkT/4F%hVpPR@Vww:1HHXaI$9MKK@mRSdJh+=>d4d>X6:^
mDtM8j jm&t4huGM++pDliTet1TNw&L\<inb%?^qb#pR^:ZM*JN*HuH6/BJJnP/!=\^F/RFFqZK^:nhY!I6F6k$
b1*!$T uuANN+514L=TVSM4qh#juGAyXXA/=#P&&GR1t>/<yIlSiq!NSTin<X$i6+h>qpq&Gwhuj%S>=%lB@YIk
Qw%@5% *HQIM<HwkwqQm%<lJSGj%F>ihqpYJ\ZEa6liI15+^YT9ZbYaSCh:dtkX\yRNmJy6TuPche+wbFWi!Fph
R&6JBN <j&KC/ceyqQH9HY=1uMaanH4qMLpVXY!hqP\TRH%9+b1b8&##%:6eP!Qnq4GFZECTZL48qXJH<wjTEAI
yXlTPk 4j*pdST*FqY$JYj:BnRdR#>%jmLiVhXPSL6kd5u8h<\T+Yp%M9BEmn6:\RHE*5@pSl*KLeyh&K^k#9PA
%:%Z1K AjKCZ=nMDF<htJ=XhiqaDYEpnD9\FTVX:XkqP#B:<h%cd=IqVBhi5IS/qY44GG<%K@G86\GICuXWq8V=
*1!!IQ Ldl6GR4Jb?T9Q^leQ5P#^SIIuTWI%MIZ5KR8%1LBdAmcMI$jAjP1nchPHH$h^>M6p46B4ZBPJDAkVu=P
&XwVTk bKT=PXh^dGY#i:G14GWqtZwHNtlP4H=F+@=$YVjnb9qSQX@B5bXwB<<BXj$cj<^6=&>AL4tNP5qtT*?$
LS#8NR @=AEj>5m6Y+&*DknjpW@Gt\SZ@R4M1=&1N\<Lip:lVpVawQbqilDjbcpT1kTkd&DG&+jJ$8V1\TY5/4L
Rt\aZe Vtl<Xie^<%4TIJcnG^Qj#Y#>CGb=5m@CFlF<WK\!B8!cu:XFF%4ZNinQu?KM\J\WqQl9Xq%h+W$>FLdH
b&HhG\ bpl?\@TyPL86bZQM?Ta<NCmcwq/IKD?5Q!h64Rb==nXaW?$1=HAYXc\5ZP>>$?j+//tX:^mJ\>P1ccMw
8CywE5 :I!?%anTmtS6/aZ?^>6>8DQlFWc:B8\XVXdSK$Vd<!1!CH<pyG4:&L9!IGQE%+wqLhRuJ>w8J4D:J+k%
an*u#n y:@SD$IbD=$/NuYlF>Dy<cuYnmd9DYG+XX/\LknDqeZ<=INVVqc\n!jpZY!%IXdcu#GwNPt^Y1c%\ii^
>:Kacc :e&KSGt&yJMwASkYu8B/TbF?bS8BEbGNy<$KDE>@<n8ihjdp8$6CI:!GWdL$W@T:V#BYRn\j5VY^%Ym&
\ij8LP Bq&SuN%TNG4LK6TdB*8eQ\WmADGB9TjZaRJjJC6Q6C6lp8+:!Yp$q>9CJndjJY?ye1c9YZ6@Z9u<86jM
-A>thG 00077da9bb5001202b4 Page 223 of binaries2.zip
JC=w<m EChIBCCe#qd$=?^:aIi9jRQB5$5n54$SQZLFeattt+L%@tk^SnY@<aeL@JDhK^\\@wJ6>l*nW&V<cLa<
A>$iSK Qal?lcE&LqP@HS=/c5M5Fk8m1K4a6p6:HS==LZRDM@aa\+dV!b1hjKj1%llejkXJmcP*nZMKmVI#Y<#A
Siq59e BaD1<5Eh^a=8?4KAaDa6bcYjP=#>*8D8n#l6bXhNcA+KG:NlCISE\?t4*ycEu\<Dn\LQeZ1AZ?twh=S*
JYaS$k :iHi!@RZInwjJiITW*aHm&>FjT@!c8VNQ5=qK%@L9dWb#I5\+YPjj8XFa*F:#*=9p&Y:ZZ8uJ+n$KEPa
VaFdtC qaR*T5DNQ#kn$p:@y&66awkuVHe@:j5IVF8kFaHpEEDeRVKpu#h^k8%S&MBt/!4j=NM#!BBwIEPI$#e^
Ii1QKD LHNXy%\j/I8edtPBcKaTA$S=Mnhp%ue$m:yVR#kj5Idw*n:nelnm4qcYtiZPTdK!Z=KKcmZ&TNh!^6iY
HEbIEW @4#9yK^Zyn49+EDyDnl\<KEW6@:=Aci@P=&wEY$8wDwpE#XS^nHlPyMcT:SSD1qQbNqyyyl#n!mHWAw*
Tw/T^: E<XZND+1n\D^SbZXP?DYP9jdiabZ8Sp:Y$XC!nAlqjJA9!pubSGQ*im1F1ewJ1^Au6JZ\eQGcqZ1cKiM
XJ^W%+ <Lb^Z:L#$/RwZw+?5CNj*Q9&<P/nKcduZ<dQ$hm?PFVP*p@<RmWZKP>SbS8C+>1P#NbN=8\iVkmjbL/I
4/HX/8 E$u*p>$#PyJ+PFl#1<b*yhy@/i?KAPK41FFe5lE<NjS/tp*FmYF:\BH>QQGJyChP+P%4dXYP4#SYSS$M
9wT@Gm S*=c4Q:%pXSCd*$jF4F<pJF@>Hw/tt5b5*=*R@Id@t#DmMe!h#:taal9WM6yR4Ft/^8:&F!MjetL%Sy>
l?kHG@ IWLHh?G/RXIS<wYGM4ZYt6b?j:&^*hJ^D==6MHZd8$G>GTD@QH*YAWA8@CJI9XM8Q!R&i45bdpIZ!W*X
@/!*Gu cEZ8YT6M:QnP#Wqj9+XH@XbtnLW9ipEk^w*1&n6qm!dDQd54$19ZK=9*LyQT:y^mTwLm8dpYi#uy!AJy
TXR$Cu @&88P$eWA9FM<mRGt%cNSGH\%wd!QC:TmyiMu=DBVRhYy6KRpWnl1DJWCi:L5SwSjM^>4yb\ut/j@PtX
^GNGjq yyNt%9*\yR&yb^htGiE>Y4tl9ku=9IpnjncQF+Wp9:J#VieZ9YpYY!X+?@%H5H>Q<HQyu$d%uL:luP=n
y9\VmF d>1EPLSqCwC!I!?+I>?^?Wy\e\qJeH8eh/<?jE&d?4lNn/%JcXRE9y<yynH!<^1Xd\bw\/9K5*FNDh5i
jD:>iR HyIh%N1T/>tY%aqChYWe&Pyc%P*LBR^1k!P<QKX@>qZq!bw$DiM1eX5h>WcjYnWd%mHY*a+TY^%t:c/Z
6Vj>ja 1Lc$n/QbK6$%V^+W+//Q9&Qt#aqHYpT8LI=aElTBkDcTRi9wbIeEHu^Z5FN5R@R:yhttGJ9<qMNcyRG@
:Lk@8A =:HR+P:%\9daq^b4yaSm&d!&d<h8w*e4wl^iR@DTHMy59iynSm4VXt@6WyWBDh%4Edbbd&*!h$j1qeb/
utBCE* $t&NJNAGPiy?TjcwI9>CndPPF4EHjY@NTcienP4/?+#:&1BDjJB/TpGXCT55/JRhea/?Gq<l6a:=wM*G
=**lRq aBMimcAPd&1Vt6!L5X8c+4ZSEkH#mWbG8nNt^\X!>5b!#Kj*nyhP>e/tlp6&e?>cmXKJ?y=T1bR^RuI&
!S8=$/ Zn<QI=X=iGL5%je&>iBF@KRYNLh$by$9eV*WjCuC1dwlc=kw#115SmZ9a8nXKL1Z/X^&j\XN8GJT@CX\
T8NlNS Ti@e6RH5&Q%k>hkl1!F/%9tq&l1aVlcLBdRui+qWANXk>5dp>V91tqu9jmI%auq\mQ<\9X:VbqIjGHV:
NDJ$L> hmDL1lVHjbSMh5S@8?EKb+cyW@cZ$JQ:d&S8SmS@EM<@9RIWaEDJeCHBmRt#/4bp$ZKMn/SCX>tya6c6
ZS!^Tk d&NWeRmwJYQ+#H6SS9jJcQN/mKXTNIZI:18e/a9uc6EuK8eDM%J\X>lTCYV=L*PWTEtm=M$$yXK!HQtD
wP*YF1 bD?nja*NJD*Ei+5GSI1/6b*C?kAJ61:BME\a9y#qQcqbVSE!uXAk/c9ADt%tLCqbKb*JF4d!GFV@N$DB
&iPXFZ LL%a>lqtCGyXHSW&HE1XH%Q^k/XP\W#PkWtMpbHI>LV%P#JPYTCIqkX1L$h@VBCu5&9+TK1tZQ?hw?#e
t+aQ&C 5b5t5*&a#KQbDLKjV=MVZcw>ebt@l=mV&VEdtmNc\Ln#GaeYIZplpaAl1<K:#Ye68PdXGq<>HnktGGF?
!F&19< %kKRHc+Z9HpW>J&=qTB%?6mVmkCNhc>VpkQppGj+A+&9nTFYi$>!NItS+M!\19\wCSVE4&BlV+ai=/Rn
6qeQaG E+&\RQd$1Q6y9?/JqycPpmw4WEeD\BWyRbGYdMQCZHlE*eEM19c=+bB/D8*kd4^R\#+?S1L8A$b\MD5y
MZ>yRw Y1FRpcJ@pC\yC8G5j$GpNN1AGB981hIPm5M1/!MK\&8CEWyeJJ5K^QNK*^iWiTVNEAw/hN#4dd\+yGke
y&alY* JY#a/clb%<cu\8HDBpl>TPEmBpCIHGbLm%YW?QniKN\PE+E>HB5mGjhmwF*TK6lt&R1+^qCB5CaQay\i
yTEYnV :Ra%cNYeu*1n>FVwjQYncJmhPJwVylViWltL\SAXZaD=L@GYIQ!@F&@^!9H#$<Pk<Q<K/^IW?m?!Lln5
M1A=/a Q:I8GQRQYJiW5:QLZ@@>N!V!n!j?/?B@&KD?keL?\T@?A^u=F#lKWPlQWbmk!J?wj\iWwH^@wQ=hy^=l
X/DKJ! KQ?j1Qq@E#qW+A@W$N?NG!4+J&w+@&@W$D>RC\4@Vk*:E#Z$h*eN@mj1*:uJwEJ@wBaR?b*/V?ccAQS*
m#jBC5 +@/V8ed@8&9D@tT8@S+@\9:9p<*K\@M@L/n*n:Z@>>Z=%%>cZlcij#?B6HN&?Q9T6@#dp$D@Y9b@?@*d
hywStG VIZClj=6^d1+w/#e@*1R:?<@@!Eakj>@BTQ!%\:+%>\YFID@Qca@mWZ\*=NXRcH@uK#?$!Q&h:IK@^j6
hl!Vel p@=6+@9*bJZ@4*u=j\^n@=&GMS#Ij=6lVC+tlPpZt18TB!DIH&l+9@qil4wR!I%?tImRH<T!Cct85>kW
jm\5yk ht*V+EYcT=:M6w$hTuBma^WtdTK%MHbF\plV&JdC1q$H6<KJ&j:tbnKduwFyn5+IwFXe=\ZmH&HMmI&e
iyAb$@ 5^$11VB!@eKdjIT6\cF/Xp!%wHZPNk1NuiPWY^dTYFeZdS1L8XwRDE1bEIhQb6lQ#y9LMm#4NTIGq>YP
VBL<W$ a\p=>S:F?n!Y>WBhmwNVa5PIy>!m<??X+dil1MIFFCK//t8%W\BQSl*B4I$\YVm%<K!a>w1/+KaqX:hZ
MWml&Z 5ycSIT^G&a>SJXq#$pCkcB699key+c!*MCi?EwbqyTiwy6Mw9Gt1\YqHlIc%+MTEaeq^B9a&?a58^pQ:
*IE:ZZ HNhFaI*?=1QVJ%y/c%SNa+q55B6Ldine+nkFkQ8:LjT#TC4N=NaWn%ApRLlEu1R=9hwqGEAPkcXQG#y>
1J+SaD E:d#pHZK&N6A1E>ciRjpddVQ6=YSG><LBh<#d6Fe<kTR9ZkbAaPC*m/GawWq#Vuj?F4/jw1DZ18&JF!<
ypRDT< J8:&*$td%>aFH6amDB6nlEGNyCa!*i/Fjw5^G^=cJ4Qtpk*n\^q>tKJZ+8tQuDc+4wbk=?KlYy\6>:@k
h$%!8$ hdl<C#mDNT*tDR64hYH$<y&JSYk8RN:nSM<AcQ1NNu9juA1S^Ik^wRCP*=Xp*i1VQIpZLbQJ1tZYy4NS
uV4li# FKe1!GyiM^XpteCuYP*4L?&QbIY5LJcyS8HiH&!!cMtmZpIJE<5/=GNTe!/6u5n=@m1dwY8h=w?X=A#e
CZw#aY lq<SpSHXM\9Kk@QS*8+jk8#jkIjPVdI6JcQICCCcjAYaZeX<>1plnjanZPPX#hI=yNP/kyFbFDLyF\+l
4XTHL/ w\<6<R^tH\Nmi9I&c6DPR=IXcLl>9pYbC>>eZFd1C+I^jIQRHY?!+DR%<Adtt/hSJ%SXcD>:t8#/CDdX
R+P1^> l$%ZYjla>WN\9pVm:B5VaH/EkFJCb4SpeX%wq@8KWZEDLw?/jbI/MXJ!Z^1#YDCYy18?Z#N\/mLEP$Zh
Cij4Wq R16ISmGQllt%CmFy!PbWTFPk6XuMwL=9lC=QZCPn=kEZaB9Dl4hwcld6h@I4kpKtP?TG#NRuTLJew+eV
1XiCY& E!6\FA/*niuVRHAit6K98J1FBG4qBp4KY&&D&>ABua9mZtYhL!^b#%PiXeZyB$>:*LeTjaC!/<LD56RP
:QbJnG C?ywiXXT41n5*ehdqPPSp!^k1%wRk9tA1h9YuIWtC%9m!XySu*hCtGy:wAMQG?1LcnILXWmIJX85?$Yc
#hFV+w B^MS4/RLQ#/aCFlD<pRmk$FqkYad1Al8\=H^BKZkPnpRVp6p#pIjLLnX1K4TQckj14&@&L6mS4bEWuy6
8kuZB/ wtwa@Vb&9X++e^D18N%L+\tnZ=8n*>hKcqdZQZ#QT%MYe9<nYQ@yDIIjVXMJ\RILAKBV^B&hW1ykFhE1
yZk*Q% Hhm%Ln#Wwj!Xp$8Cu%C&nd=#kjc%b6QJjb*T&#Cmm!CdqJ4H:@!R%k:uFbYK:ZHc>p5wFiuW19YC>&1T
i%@p%$ !@h:ZwVYHD:P%VN5&6N/E%=HY8+:@$da*n#WB9SwiES/Qqc@Y8KbHp8d$NL!%SaZZu9q=ZS8yd%yup^#
&d/D=Z KTVwLbGSahMDntpD4<n>R6&5T>&1Q8&cq1?HeP5ydKtk?<Y<*tpTX\4=?#P9w$1iJde!5>uTK!?\J@BS
<R!ZNt Ti:nAZlJHjqVckkWPq>dH\6:kHj1=*XK#cw=1!5lKX=EdZ/#1X^m/VZ$?Z:Mbn&&FhQbYa>Y?Xdl5S:e
i6*p6F e!dIL>ILJ1#d=PZjw%yk+Mj9mE/6D%>akG@q*5lC!$FQP!$A@F:+&nE16ke/Te&Ljpiq$WI?FE$ES5y8
*JM/QS Lp!NNDiuW:?AkY5@M:MkH*SGD1FDBmWDbe8hZYpWj6SiHPLd^1@J*h6LKK!kT#I/QAjJGTwe+aVdde9F
1K%Qw+ klBH+cX8Nh4Mjb*LK*1h^h:Q>&t6k^e8ZpEMl8B:S1cli<R%*6T%e1\b*1CX*l/9Pn6it^\*QA*m#tq:
#$QYL@ HCE&J64QD&q<+%miTScELZ=1Iy6KdZ/m%h<G*a&=aCaR>YckVbe1TT<^ZWl&MqH4uWFZPc$=eWalmu1V
F4$L8l X4EaDY%H%nl1=1QPCwweWN@5K8>V9F@XpdVJRu:N4&qJ/ca=?cVMAZ#R=5*^iuI?!:c!a=#qWMe9/<B<
@FSMwi hte5XGQXS!BH85cYm+aDtQ1%NeNT!1I1Q$:hS*LT^^H/1Xb+5ajWJC/jAL\?NR^9qFMaFAKjG&:uNXN4
>9Jq/: 4nbE*k6<VJ6Q?!BJKGZ\/+1@HXqSTpM&QXJpwXl9q%Xmu+4p@tGhC:/LDLS8GJGR+mKCX%w$IYj:<<Gh
hcLdAI DdL!TlTHNaLt&&9b9Atb1yKThMm<\DnwSXBCPjn=4Qa==&H?I6@mM<e^M!I&uK>MAIyR8/GIXub=mZ$/
H4II8D ^lQVBBTl+BQ=#5N*c::69B?*E+Q\98k=pPwi@!mFb@nqXYIFKB%:DRSM$uSIXTT?8wjl$TEehcAhFYJ>
5*KTGF bL4!:B1V<^qKmja<9ca@t::Zk1PJ/pXJ+H!!QNHu=Ybc4=eq%@Y9J@&+qQebY46lykY<Vt$@lme&eIXL
FKduIK :&mV9=Jn$^%FDI&+eARH6m6%bTm+dd\XK:&j?bFaMibdpdPpAqi&+y$E^:teDXHHmM#iTT=d:iM*D!^H
@:HyhX tVT4A4DB%yXe/BbejNhh/jND9p:W=$5pZe&IN\!ddjAM>H&d=mSpuV$iu\$DFbSuG:R#QS#h4^nY/+#L
h>cVdT y+cSn!GD%P$e>6tYutF%lVMunewSQR%#QAV!\Bk6lk@qXK!FQ^b11?@%LweI4:Fac\La6I4i#5c%4ek/
-AWm:6 0004bcb1c7d001202b4 Page 224 of binaries2.zip
1GIya? YpI+kXda/lGQZ+d=+CLbq5PquSG>butcwdJEnZHVIl\NLu\hh68a:kuF?Q$p1DQHWD^6T#R\58:>/<pR
ND4AF: TNG6d8@Qw8k6I*dMwimV6:k5=%k@bhW/IkauZRa>+jHTNeWR*TF9%+PK!ER!c+l\ZERuNn/p$DyHBW5d
M5wc?j FlJkk?McM!W/!jR#J1L@/bmyAcNFNQdutwyZJBG=KaumP8it*t!*t5ia+YP8&yLBpaR5EW+SI=&TaF#>
Cw$n>k PE:DVZ:u/*CL>uy:VR*n<MG>TG\twI#FQw4BZHY91IeXY!XLIP/=IG5Z5TM#4uW?d6t!i$Lc5:yFbTea
n<T5+! *uDL=*4VEcJBudMpq@+#uWIy89%DEMEMZi\nMCHe<&#N9d1ed5i*R8M1*<cA$HcF9lByGDEDCjQBCR8\
<XGC@Q hh&J1lApIC1KbNuE\&&uTQCm5whdJy+T5te!qB+!V9ZDAN=1Myc++KSH^G&K<b@QiV58+6Fq>15YY@Ni
d=pSHN $Y!wW%T*&X+=qu6$H&b9DH&*w:kuy!\t4*G#kGpQ:*$CX%AqWu\B1CwTPl*CCDWaF1$cQ4^ZFh^jphCS
@FE5LF CQ%$^6BX:G%ZH8we4jVFl1mR$@mcW?=T=ZFVtHibRN!ai%T*@ZB@nB%:je8d:YEk<X5u@8++dHX#9N^A
1Cqk%4 !+kWquV?RmuiLe&Jaw=^wJyAFIWK&@\MVmHARiGhtVW/^wA1%kaRJ!J+dlk>IneJ+BTM/WRh<?lbi8w=
^<Jt/i /a/MV4yA?A/IiVcn&c#RcIkNH^BXLckqt4V>dT>cZ1nai:=jDSdt4D91SywawaWTEdI8<MCTVQiREtbF
Xd=uh8 jTR%EhP1$:hZiuMK+w+yiF?:m!qn*Ple$T8=6pSwQHBaX=bWBCByR8RFh:5HZ#4l+LBC#uiqB$+=ak:=
!mmRNE dweKYbG/Va+B#a=t?9E$=aS<TnEBHep+GBQT=RR9u1^LNl:!NX&MeBIjQtGXpawKdd$m!+\t?uTCCHIX
5HBkwL =i@y\I?9W>mb*/*PqeIw^\%JkyKA%F#:9bqc#C\6eWb<:Y!pRcWq4yd1JW&lh8\bTlEl8DNw6>&AFpeY
\\44\F Yi^1ldA:bHmW?&!Yw<I8EkBSTttG:hIJ^4=VDyVC*l<N5dTnqHjj8$y\G*B*!bMET^+EdB1HDA9+MkQX
i<5YLI 1>YRhR%8hZGEjF^A&b?J%RJj#?=?VGF?F=#>:pGlC<BW*WuFeVDSuNYjKBGG8^p&M=ykhn1dS<XMDqjw
FJGtuH #yF$&Z@Xa41+dNTG5&VJKBhqe>N5NMM@ZjM>HibqM9N<W\mW&u1GqTCBVhAqh+::qyHPGdMtP9kYkBEJ
4leEw< qe>WSV6RZFl+F:W+!+y4KE>dF=8%DZ^q>!\/DP\FNZj:!N6/^LW4y=\4S9uLD::%JJ1hbGddK*X9mB$!
8J>cEe 1wp&LP&Ece>Y&q8w+S&<cK+A$c?:y>SJy^+5i=+1pw<a:^b=N>&h/GKjBNewaLnK^c<RphpPnjSwY6Wq
ECYeS\ Yk4plY1BMA!FnpX:#!qpBjaY<:a</W?6GP%N*L/AYH!S5V\b!acCR@9CJcZeP?FCLWbCa%E1QRGLdHbY
?iiNnd w%&R1:Zl$%@W4GikNDMQptRRt:jNwK>*R</aKmim445*N6w/@mpIZnc%><q&y5i?^Ze^At4Anc*u9BM@
!c@&l^ hM?TAmdHiY^b8+Em*QyiJ&dRE&9IHe$hhZRF=tmTq@=XehTjDul!&Nd8I8M18X\yE>\$ay^%kiY1bmJb
/F\FQa JT6N$8<&RMlBGBG%AQca98uDGHl<ikt=MqRZ!G4mhG$i+iea@ITIYB6Q??!*?WMjYja??K&@y:*^@LYt
HEHh8y LpL+RkdAGw*eLjp$a+HRtVAKM<*eNm+?W4X8Rl>i%*pKFR8&&Q9A95G%8>kuBlVJ&y?i4!L:%L^B4Pci
/T\\@< Gb:$u#>h9+j4#dyh+%p\Ym^k9bT*#qen/dQ^nPy&B%P*D9nhWMA6a=<6:F&mYNbkD!#6eF!\YIal@kaw
Xl#eEN +lhX#qF#=YclbaFw9kL\$$jR5kk1IT4W89&IBW^YJkSe<u^$MnQE+tYCtc*uKySIE=S*Vyi*Ehcnd8yG
=?KR\y /%&C\&/6APDA$M!V^D<SFk^LE/wP5G1Vnthc#!y9kipTlkN*GRu9S@Sa?XMqlBYXQTjTN&BSC/>w!SLE
@TFLpL h+IqCFlNBQ6<FQj=dN&/+*b>Fy6u>alXT1WQC<Ah1Ecb/KACC&VdjTd$C9pqT\*n$QmIX&q1=&N/:W6d
pj@u&C R*YlN!<Q88K6G>#YyX/W15ZKyT6tLF8*J6G4REH>*@%*M?NVPk^Dwi>tD<X*t%E+Hh@dekIDJ/KbwWeZ
mD/J^5 +mBblkDdCkP:A:l\a\^P4>%Y&Ru>RaDRP!=4+?eD/nQ!y*dCK6LiVG5>MeY:&IFLFpL4QcE*%I4>IyV!
G#Gy1& a&tLiytC%%npEi@4ulA^D@QGh?C=T#/jeqdK1E=w\pR8LbhFdGyh/MJVl?HY+bqDH^S*\1Q:j+R\a:!T
TcTHYn R+@4=q%c9p^L4/h:Xm?c<Tw:@DB:!h$:!VS\!i@qW8B+H%tqmL<@6b@!5*iAW1yKWjw=c=E5eC\p%V@9
J#V9tK 8Cp*\$JRZ6!6nYLI>::Q86qTtpVMQlX?HMM/mjntkBHNwCH1lN>P&HBbelX$*EQ6?yyA45NcyBtmW9b^
t<DHHb %!?&H8G/E+\C<lMcqtb\@:R<X4YZ!>mM+$45!C5hy\@b+aCq<qn6eIC#FALRSM9j\p5#V8!Y*#uJCc@H
=SASt! CaC=%:CBHG6b++LLERnZ&!Wq%i@KZhlFSAM/@S4&::Nb$ANkAX8#6h4iwZw$miEd6qJHau1abHZSWGNp
YXcT=h S:djA8Q>J>ydTmb#+ybGZMn9Gqyl?#\J1Pklb6t>Z<=LA$HVV4=5>!Wc&wTu*:Z8q9ZHaG9NaHjdB$P8
$8:mLp pK:X9%^%Vd?w+*/JNkc9:\4H5A\w*Iph!AELQ&p!^SNbL*<9SNmCMR%X5EnhEh:eX*bV$XRuI5SdNc5!
Zwuq5W 6nG+?$YSX=656&Ele6HEFtHly/aRRXI?>^Cn1ieWK%WKZSV8$**%D8SJ%5db#baM8$H^u*!%=4?uw^*\
F^55Sq 49bKYd\4CVHR=&+DpT&yV:QKD$J$NNZEnB/:!:VRKnd8&&F5Gm>k4!>+mVT*h4$8K>hKqhZbE9h5!l<A
6jm<+T GABpBd#j$H$j%kXKM>*qcQZVKk=A+=DlpW%/hhFD5eQKdBpG/wub&6+J&*%YRpuFYL4N#=we5yqRMny#
6p!<bB *t^nbW*R!+FMitR<9=bt&u!G=>\S=iDhVFP&bJQ@p+GGu!E!Hp*Gd>#6Z$nKtA^eVh4c9>LqY1!MNa%/
tQWM%S L6V$*H@m8caRw44uWH:p4Yb9/1!KtNFI$Xdm>m66NQY5Cp\jy%+CP#/aQCt+NV^!5iyqu%utkQ&JWH$+
4ulS%c hhZLCZ6:K6&ZZ9YF:CiIh>cBm?&9*VKW51Tj=a*EpKXC&n1XZ>q%Lm%B!9Bi1>dHWFXy$qcT?!%1jT!A
P#\dXR 6DWY:l/th>Ceq+5<Cwp=pcmF9NqY@/HDWum@H4nCd%%XlAQX#l5H9V5qX$5d:@MjLnbit&EP&$*Rb8Xh
C+R\GM V?kFdbeaYpW%iX=9:IpLj@^tEFynmS11cM6TA<T6XjeRb!I%P$^#R&\>dT\5eSI>ENQclYHTSmi\Q4/$
T8FdAT tVkhN9AtXa*&P?*jhmD/N/n!9<:+BIQ@F&ER@F>$IIL@iRem?L@5RCRM?^j=i^n<V?9a\aV@RA*:uREI
>#d1qj J9IHc8n9P9HA?j=ALjm::D?e@\@WA4<nVZCBQ%D@ul*ABj>w+L?yJRiH@5uAj%eND9:9?@n<W@9@tJ:@
DL?J?L y>jy:?q=IbF@pb/H@/5?Q9#\@**/?Ln@d>:HB^n^6=++lcHI9y/SPm9KPM9u/pq!YQnLP@$knu$!d1/M
u9DlI& 9TH?\#4D=nFq%DwbJGFQ9SjNh/djLwjq1ETNR%A&RTt:mVS8HnZQWeVnqyKqd+:uI1eqW6$5iphbX/u<
8JC<Md WLD?e4V%5hw5kB<K*p!R=G@RiG=AGh5\K/E+p6^:K1GdWtbJGWw&b$mtqS@:BDtl\&RtKy551!il=hXM
Knnp61 Kl8G^ceq9cC#@pqwDA6lIt?R$89C\5%nmjMkKynldhX1Wp+?NqiR=N<y\a!8ZGLk9MB$*i1^R6l5p^pH
<b^*GP j=B5$%A5=:wFqj+SBhEd5^5kPFVqKyd@BbnSha!CY>naJFSGP$cJwte^cl//TiYwA\JR<bBVth?+L!S6
mC@N@H /65P>%bD8jST?$C=4MV^ItFBcHQ1=RZ@iFGkFl!w:VyPBDpmjTm4MSMkGCTk4%wcXIPF*Da*Zin>&VS>
8MySm+ %QN*!>I!Q/Rncd>Ek/dk&%BM9c+@EcV=!Hmk=yEVLS!eGKjiPS1MQ1Kw!ilj$NW#q\j:ED+CQt+NyYF^
lTMGh? /VcEAw4i!XGPJ@e=j@&P@YE9\!4*@Rc^ZPwV6Mk51p9&n5L8<YXP\iawd:d?^:=nnZBmQRSY?Q&I?y9=
=6b5+/ 6VcnFT4!l6Wdp4bKVyJ9jh+LZYqE*bPX#9SD9F>q!RYRn1?KCYW#Fw1J1ku$i^^S*y>Ey98Y=6Z=y5p<
kqD?h9 ?&:C!B:jL@H*m&&iZj!%6t/WGMIGhuV5T:9&:Cd>>nTRe+?j8iG#$b#qJ1JC=IDXtll4hSV:Pie>8@\#
BX9<BM R<58VEQ8@YildAZV$V$NQD#^4++p>Tpmiy+#YQGYu@SAl+AdqjN!lGM@we!PEVPJ<eHqPe*l<qF^hNIA
B!alEI Vw\8Vu4=4Bic*W^<T8VXGe*mMZmY1kE%Di!CtkhnBDt/DnHVSA!cc$@yNT56mhnlqLJF:<\F\tITI\bK
t1mDey itq#GYNMkB#piJl#?B@$b8YNMRb4$#eQ&8P:::EMKi/Ru>p4cHae+&<QWXcZ<SkT?LHb<qV:6dFwb=9M
wDte*1 Q4DeuwV#TpQ45FCFB1QESXR*cd*I:G+X<QckhIwES*1KYYlDJ=u\9NKZcIRXkkmNqP4h\ch*jKmyQBda
cy8=PG Vt*H1@ZhAe!6SDh/hyc&4jYA?$nZy5:cm=e=&Vini8pu4Eu<kdLDZXdMHl^=1&twjnZlWl%JT$diuh+%
h8*WNu 9JXI#KQAW@DiMNeQ*=96tS&WekPDKDuBZ8Gbp%DE<:!%N@T/5$wStJE1#FLK9q=uRd*eQRCeWp$itep5
DiH9LL mZdhb<!QenIL?b&W$+jqMdDEFM#JhMQc>!YydbVwEklZtYb$>CnJ@ik5!>=^W/RG1hn%MaThb4bw?V$8
pMR>%V mQaL%=mFS$/Rpm\9!awW#GEY\%4Y6@dw&Y$Fy^4khmT/T15^pdLQC!hJS9C%GB?/&DpuQh4/m1i=wlua
a#IaGu YhTeuwACh!Ghbej:mj5/Jct6*:qbX6ELQ&L@jQAIm<&Ck:!p&^<*#<A\SQdamdLMb#y!HaCnc?e$B4*Q
N?BnA9 1pC&<b#:J1i6L6#$/dG&wM^5@?T!q?kPqRX6C+@w/q6qW&M5DpyN44GJbw8%!1XGNyBW/wB1hqL4twT%
&\<JJF =ATH\mR4piHSlt9N#VBKZ@ndEdi>Xj5e#$lB<CeQLD/9?tGqcWyPFZ/uw:&Mqwb/%nhS8N^SWT$?tTS/
jTHTaV ySK8Y%kPbmSBV1c?M6:PCCQQmBj^>A8D5+huAtGKm^5NR>Eap?88H^aP156ySS\hDjq/L8McVCmVA4h5
Mi*p/n ?SR%EH!qQZR$MS^$EAh#iTAXnhF5!C@?/&?hMFm^&&lTuK11bF9G%%ybHtJQbduHy^@PdDAjeqG:N4&p
S>u<&a YyMu^q?85NSLW/d9GyF<=<:BJ^XFVq%&%F@j<$^:>FHj6bXiC?1CPn4$*qSJllAbL9>Q$*hJIdRnK=n%
$\tIc4 m?cl!4+VjJ@*5D\bpM4Xk4hWJk1FAbwjt:nQG9HDnj\%ZT8V//1WiVV%\q+%9S96la$AKh=IkHaD&V/p
T<K<mT Sh$<&8b+iuy>#mPui9:y5Mh:+*1#J?wl+PCNp:i>CuQ+@K5aEcA/VeN?tID*L/*X#l:CuCV4HI>*9W6X
-AXV\\ 0005fa64a49001202b4 Page 225 of binaries2.zip
%MBRjw N$h<&!6QY/Z>FbDcaCdSZWp%u8c>=XX<#KFkAj9*?JSMd%/9bpe&NL^K4m$?=dQcw$<?aTLTY:e&JPN<
aG&qHy 1N:?$NF=qG=BtJ#WnaN61GK$@tFKkmMl:Hd+HQeF9m<lS1d#8?a^ih@MS%e=4n\F>dX=1&5&bMQ<*BJF
\tH?+R >yb^R?+4bPDXb+Vda6#D<>kq&?\DV#cw&pYNIK9ayB@hpmP@QQu5#M=4qCQ!:l%!Sh9yl&wqVIJ#hdw1
K<c?41 :=JZ>jIhlQuhXSNYQkqpGQJa+Q&4F!$Dbwb=?RH6eVL*mLP4A?Qp!=^LldP+!l$ayD:?KD5bj<iSjbCS
tu+K:= uM568VaTulbK9MMYh/<6=Zy=X<u1+NY#FP@ty#kEBYMMy9ij8I\1F/mDj9SBMR@TDEpqj!C\Vmj9pTu6
JuNZqe Qi<:PQX&>SSIZS*tQcC!qu/l55%HET1ladJNe6&/&NMuwcN$pMRHIjhLCa+6R?&Z99iNJWuSKZ8lH9Ca
?Y9KI5 +MbJM@#=?&Q6^^=Z$<u>NnlbQm^Vtb/8ct?H?KLjZ>64WeqME=D1ilaYmn+6SpRF64C1L/6JM$Hm9u$w
Ic8jSI Pktj+KyDHeRmVuTbYuSD4:TX=VS==9YK5%T44LGJIFw^Q%XX4*VQcA\BSi*MX$bahBjdceyYYSb5n6!8
X8q9m< $yjF%Sl1QkBA\DJ\?Z^u?aK:^Zi5k*P#I\pT^\WiqP!qZX$QN89#*atnYn@^q5Ma*<G6$ujkYtM!Sb1y
hFB\9D d$WQPn6\PXj9bF9j=t<bB?M&dR#F%P+PV5yhVhn\IeyXh?LWHc4QQGVSY$B%>^$wN%hkR!>QJiAc4=?l
!jAZkw \uZb\ac?4C+hd\4:ZjnQVKY5qN$dd%aT!#IyAl\T=^INR4aP\@m>*J/c%*lZjjStX!4D9>kKGwy^w$9:
:JtAIj XeJJAT4wYP98y*K&8a#a@hJd%>aqC?F6$inH#/&LQF^<j:w=t?NPcy/:j%Ej%?jL<:BC#LHaA1%<m<IZ
yB6eL6 ZbS%XVZp\PjJYAw%yktDQG^qQG449MY$CWBQ*CKcMFAlyc$EthWF?6#mP?<D<m%#&wl9ei8:6BHQIieb
EJIEa# E:aud*bCcCb5G/c$QiL>:$j$@uSkt6q/Ty6+TAN$iqmQWK>HnnkSXR&tJVySec1M9$I>X1@eT5H##h#*
??k8TM :FY%Qlpci#mY>t:eQcV<NSQ:6IC>h!lG5BWiXM*&?c6B&9jEm<+&6/qqXi:kuTLZDm8Meb=^AjeRE6ZE
<u+V/V ymm=NyjEcdh!db$\@JV8Nc$mAVPBQE%FHWbHlciKP5#4k?Ghk=>RH=q\SeH5TSGcZJtui%iancTVwWuE
CK9FJq $6@*MC#+d=:dDjG\<h\S8y5P1*?J9Xk/EL$tXL&/8L1=YJ@DX@1Pn\y*KZLjdZm1?b%ZLbQQyVP9*P?P
TMm@S# FQKX<?!dYthLCN&h\$?nKGM=nDGi$/*%:cy9Y5A$Sb/!/bNR?lGwA$$k^4AZKRZC<bBCTSq/wL6wu%IS
N4+JW$ uZF=Rb?wHn!qMy:X&%JYPb:SpJN1&<GV^PZ9SmZkd8y1e=5$p:al=<ZJiWlCt5@X4<FG+q=ylb?=Q4$e
%!DYP# JRei<\ZK$&i=YLFcc:HY!RWpTd>Zpp:BwWYReGHnLYiWc&jQyH#d*YeqGW&@+Hpd?W\mBZ8NQamalF5$
pH&MB& 8j*SpYdmTTd*mCl+88JpnJ6yKQyJ&LhP^Y+4AW$=$pXyq8<mjLMSt6E!F&NTDwheR:uTq#$55b1k@X#\
41qAtS VBIQ%:EWDme^tbIemYntScda^iMW$4jyGNPECCuGJAZ6M@%QiN49NLpA%YjyKaAuZJ^MWB>Y9GjE@Mdh
4@Enkw Dj&V8#GSVGCG?G6JldZCCDFJPc=QYMSMKhd9t?^#QEhE4uAiq:JL>MwLD<X\i*cacmXqDpWSR1G>hh+4
N%Bb*5 ^>$@S#XIn<jNeM^th1hjwpE1VC$nCw+Cnw9I5BD!RWu%W+F8%Cl!?+ET4l^+P<tikRuEqYa!4D9JTkdm
MS1i** 14GQq?CQaWHX^yMhQNGSBcyP^VBI:4^EtaJkP6yH*#V448E^LGNd=*ywjWka5Fn&aHL8idi%4bPZ/uCX
jLL!6b <:9\4@y>i/G+RJ/aHu*66:p%+cR<WedXjR\c\6X5BhqcqhKlWuKK$dK#kV!!$kG^:kHJTYA!R#Q&N/bw
%hTJyP hXATcw=>Y%L:ZK=:u#FQEmRQhTjKPlq!E48Rad/ip@M+FTM\iVINDWk>q<M^\!cjW!E4qWDmbpc@X4+M
*>At9n tKyJJn*TNcpbQ?C!QnyV8MR>M<V%%ineCYJhjcy&1=w*kPGRla&S@PVp&Gw:++D9IWcJ8lTc^1Bt@DBW
w5yK41 +X#h?G%my#e^Mw%%FqFM>WI*S:?&CB5n1/%tCPBWa$9jB5AX5\MT&#NJPBRjEAS1l4R+9pXuBcp<Nw5u
8/MuN$ $d9^jZHK<6NF^L=:!WFZTGlKBLXXdkJanuW6!VD4@^J^?HlaHTL*8Kn5t*wbEtnJ1nAVF:ZZ/jwF>F$\
Q@+ELe $/%X!J%y?Hb\lRXdX6AHkeDhhh5twGR&weH@km>EE1%\FJGuScW%GaX$qY4b?$#JFSh>^F5n=nWWk\^i
p#V6TB 68hRj%wT*Pp//K9VF1%<:lX^@TlhuX>lnLbkLe/Dl:jINKZ@+:P!Y5@Y=:EpD%Dl!c:!&XaeABhaqYda
y&bIZ@ D$X=5kQYB!@th^$BGZ4Z8WG/*m@WYeDd^i/lb4k8^RFq=ADXCWDNkyZNdEDjM?bmB6W/M@SNmyY*/hHb
XBJ<RG 9Sjn6!?R$@4n9/^&^\@KnIL*ZLCA!^huJGF=K=mDMYGqlXnTi@*P!!>tcc8PhIR=qq=kD8NHY4qjaK9k
>=18PH S**ei+51Tiu1Qp4d$dW5E6?hi@Cm?i/dwww!T6YCE*/:RQhnN54K?1Jt\j/4YuGEG=ZGWNK$6X:$=jIu
pw^iqL u^lHZG6#kQ=Q*=mwjttuNw?H9ca^wBaX*E?R4cHwRKp+@WYDcaJwq^ny!&Ei^Xd^wakCYXH?&#/%^CY%
4KK89A aTc*%u6w#XqPDMhE&$I?@Mik$</T&5+!&\=8>&?c>dw1lF&Cy/%CcG@?T=4CW*R=!RtE5BNW/>!iLC>k
=pApkm wQ1%ETeqA5hjwjiVmLDqVc*uWL!ekRm9kb/DX!+!*4pmW#BR+F6JIWEW$^C9&9mwmnWAB+N@m<4Z+^!P
q:?bSu @:mp66yW$S@1^w^t!nQlTVGJ\5:de$cZ<iua*LuJJy$c4ITCF#AGwYHF\jpKCmH^/*=dek:dQGkFDpn+
JSKM>i FF</=GZ+pT*@?CFCL4nmaX/nJ?Lby%hXdYmCA:VYHeLtA@:Z$@\T4NewZemijjmk%Y8dm#9&qLBR?aLM
NWnA:G RWq8mm84\TnPGu:ZR>$wybwKyN*=Wwt6Reu=ali@m1FeNEXjRC>*R%9^N+e+cXjMV>q5$:%PAnhpFaa$
GVuyG+ m4Ama@ZGy&dEJIXEy$Vekc4d^jTXDc/Pka6!/lB!jWMR9&SYnhQwEclK8LZ^41l/%@W+F5*WtLE:&nYE
@QMPAd NAjlq?%Hid9teb>=GGN?T/n8*F5aRejwwD9X<TcKDJmqD>4w?q8i$4pCn<=wD%e+HRpb++W^qd$dNiHB
+:XnmP 1q>wBhRkL%lKFcdpHbTaujbiBCEiB?tI1q:qSYW#8cu&&E:ZHWL1DQI?XeP*#8TdDP<@XpNANed4MXCn
Nn?<%F S><NbG@4CmTqMK\!%I#M%ZY/nSW9/@Y6mw?Hy?c%c>u:Y+>IbuAiqjH@<LL4:?Z5BuF?4WKZVV9e!VFb
M/ti1c 1>e8pGiihFiHaCQpQ5SGGc#eey86k!4>K%TEPFlK/w/YIH&Be>H#e%iT$hHh:^#t\$hF*l*?1L*$i/we
&PtKaV itla$nDT\*XaFQq5hLX/>Jh<tL8S6Gq>jkcPGWV9\pWDJhPuZ?K&GF?5VI<j<FV6tj$J9eyljR+qZbM>
&R6>:? W&m9lMI<Sq8JLi>BFNCh:&RwCbunPph4?::P%9/=*<R1CeL\bw=yma*XuCJbW%P<Led+^V8%yqm1!jiq
Awc^lA wWB:ehQcu&%9b+?nkiGhtaNYIKtcD6M/51:uSn1AA^*^5Ae=RcN#:/8cS?y#Xqe9BF+t1aa$*taJTu+m
qnBEq/ A+mNRDLKc!QC&W&$##SJQ$^4N$8WjFenjTiy*bG1jiQY8KV$6W8bZX9:1<bV^YkF>8EWlKSL$/bI=+V$
HDPKCe ZdLeD+/RhkL*R@\=/BPXB#KmKSDX!/<Lpl?jyP!qSP+YX$#Xb*jtGR9CCTC>k1dQ!Z:YSki?hZ+?I?L?
#d8?Vd *KFHuYc=p/99jb:G?&>MVX!$H/Jd*y\d1^B+#^RV%B/#8hN<L+tQc@bdj5P6<M=SbAnR6wDjYQ*8^yqV
VBWa+E 84XK=MNlXw:V/@WD=e+ZN#&=tBi9m6ViWNq^n/8qtK4Z&\:%QZlWTHtjd:4a1q:+D4M!RFZ49C:e15nJ
=ZD$bF P$F&E>Pe#lwAatCRZDbkp>>iq\\a?PXuLBqT>Qad91+tnchDTp!P\ub%B?Pm$:J=$Zm#6\mN+e4&#<V^
BHJ*=M /L#j>:YB@/@6c\Q@4@c%Eid@n^q>ad+@#8n@I\*:H^K<@!K4D9<QuYq?q%WZ+95V>i@!+pL<j/CGCj$t
V/QuI> J!<p<Ah1/P?<I$KCj/AY@F$bNTHwH/kFju9ZaH?m=98hG9+H/6@VBCGlQ=AL<j&GB\kJ@$uw@L@yDmMp
AWX?Ke <8>yA9\Q85QA@?j8MCL\j$EVlQu?BW$R?P95@@t!@*@Zq@*9Shl@luYFJN%HP&qqWLSL!TSMmDk4G&?$
/:tuk6 =W8Pjwbm?We5>$lJT4K$T6qcL+DMMZKZ<b$he1?+pSWjAW\k4A%cX6/51#lkj8ZQ?$#TlaB:hXH4^1WX
Nm=8m% ZMp@1aGHKP!laV=l56FIamLD?&Fad<S+lG$u%WYX6VDY!eKJGeZJpI%Wt6R6MqS:SMmL%Xq1GBnnmC<8
dIqjcN lE$TFqM+#CRI$TCduyhP^6JenEt/8!CDPC6d<Le@pq\p/+Y/:wlPnVX^LLYQB=I%AY5NX&Qpc<QWP+GQ
Sui5X8 Pt1!$X$=wi&DE#Q4l\*8ZNm@JAp5iVpdXb4a^SE/nl@FRE$F!ycnYKQLww6TMYj4G6QZcDKl@C1p5KFk
cZlTbt =@RmAK6ST%\6^jPHJCEQLS<bCD/wIhh/ZQ^K*lCM*QAC14m8j\T1\lnFuq=5He\Jy5&><RaIHV@!\Kap
jP+J+L 4%u1VtSPE^<:F:T#WmXYNku=DNb?<n!MdFNCYQM+VwuMInuRiLdHKT>JEJ5!=>l9?iTB>A@yJH$L&6tC
J94WcC 9El5w@SGDZ\XIjJmd$k559$JQF%T!1XFGIRW&FkYHqE#9Tymt>N9&Ccmc6cuuT5<4A=wtdWZkuH/A8=b
uWJXKk Jt%c\**d1J%V9BiJRDI<!YJ&eHnN%4Lq+&6=:Q6HdiPC+>AjDw=b8kQm#nj?Y6cIukk6HySW!pabkKyV
e5Y:@m Hdb%Y!k?=@4Ye=pIJQJaLX9PVL&MZLE4?P6VKh46n?@&QY91qnR:$pFLGuZF#cIk+Te9^!*dnI@jkk1l
lc?aH! K^?@C9YaKC#PPL?ji!dG/h@dIwW^pu^kGuF+>m%Fb&He=&jK^+P#*QhEFM&#GFLqHmFQY5Pi^kt=JY!?
8q>41K =8H/8wB=+5\=FbJmy6tTMYQ6CDtQcGnmPCRu4jYtH&Pw9BRk#9YZ>8@ceK5bYKYqF4b!tyV+JYGb>Ne:
L8B/cm aTiVMd:T>pZXdF1QVFS$$J9*R4T9Z<9EihdYd*@aQdCL%ea$=:Vqb=teAPec!\D8hXNnB9aP4Y:t1l%k
i^::A9 d*VQN&P8Kd>=/i^GtGNdTQByJAXW4WVe5Gm+ThwDeCJ1d?\9w=itV<DZC&hj=5ISd%\T/=JT!J#kH?#?
JELItL 8Sa6bYDZ^I?bHI84ZZqm4/G>IL+6Bu#6mYe!Y8!E%q:ByeSt5IyXKeeBJE*tdPF=!VNDc#LcH&W$$u6K
Z/IB:* D6ZIWBERytQaSBBaaDXFG1@VHic<:A!G!4Xh6iR1=%9W9%5R\>&1$W\MAYIM^lbdC1!6V684k1Ipc4<Y
-A=k9M 0008b2aa694001202b4 Page 226 of binaries2.zip
#S@n1> 9Fd*P^XGq/iY%EpTGV%9en\F+A+uG/iXSD&WS9jL!jZtk<Dc5&d>thA^%L4nnLK#+E^>cNcYbueRl8W4
uX+jXR 9C/E/k$\ua!>JA?h!eN>^jal+<AMjFuPL$mcqMN&@=GI+Bk=k>qce%CTud<46/lKc8nPLkGpmQhhtNAm
j=6wlm XZ*!D<4mjdey49dq?XK@9pKF5pq&9+j\ZPNdAJH4BA$?IamcJ1GA!!B:%CAq8AR=wLmnT<DV^>N\$QEF
q5MY4t ZDJYXp+lTYYX\P?tHKVRm4G4^%\wd<jhJcBl*\iCCPTweNYWyQTIJ*jq^>95$@juYZqdewTPA?=yRw4L
4>n#aZ q?lLSX:B8a<Y5\XnGtK>auJG<&bw4cK!DI1b/wH=QDA6:ZcyKD9nA?ALZtwh<$#\9YVda8H:T+5jnk#K
AW9I^e XZkyKF6uy>ewqe9h>:*=?JJ%PBc8G^DDGALlkQjy*K=5cY48*8Fa\w:PYASNeHi+:ujQDK+\BdkR!^D:
eBl^eS Iat/h9PdnNVF!8F?Z!QP%WEB<5imtTp4qI+=I11VI8DR8lE*p/dtNPW%&ltebm9HdAEQIw1A*ycjDe5y
^X/n>F HGp6B\EC8LYeY9XXBp=SLG@8IP?PMe%m%VP6*qF:d9B^<Dy8eIi&LMGdTS9j9M19MemGT:pb?1&@>Gm=
6KJIta i!8P@a6?YmBapKcV&jBu<wSP5FCb66BawHWPE<en<G%>+j6m6w?Qku*B=dtnNPqZ*a:&6qpKGcLW9S#6
=@+^\p %yc@WuWyTe1HQ$u1diRXPTj\:!VdP#YEpA&XVIyX*>=Mi^BEFGWPYXkdX?FVG$?>pGLPj*V=<4XALM*w
FF$a?m S15k:>b8wd/ld=q1+cPG8jtISklcb6l5X4=8wPl<%uWk@MiTD6YP=WGXn<dpC/X\k*6S4%j6nY6=:+j4
:V6?+d #c:\cT+:P<&>q!t$w#IRj^jEkhj6\Cn1pFYVyFp?DXN1%PEm!#H#<u*5c^!DedwwbqY/wEdGQLJB:j+=
l/eZ$* Lqa1:SHQt\lc?98Cucq\+W#S8!NH5E=p+8PQ1@+X1=TPWEV=qG%Y>hFW^qlTp@q8\EjqJITnD6&GEQM%
%aE>jw pQwb\eu%:Lyp!>l!6GPPDTFq@S\t#ytyWGnN%@4GmR>M:N=y8FlCLG<$8IS=M1+eYy94QNcLF1TF\t8Q
@!\YE9 4#:diDkIH6Dp%JE=8VSV5y1E<JCmkuA+N5*DA!Xt:N/%9Vq\EZwT+qLElq/%^E+Y=*>t+PiVI14!b9<F
u#KpcP 4IVuQi?eGCj>aXiGwI664j++FLJ#YMX$Vhe+*FQL5Z$^8ZmqyYp4K9N5I!>ReDu8*hy=qQGyiZ1+Ae<:
yi*T4l jmG:Z!^jc51S#Za/V6QpFVhMe#nQXuKKHe>uw9EFiT6>>1Euk+6HDKuVt>abAmm&EuV^6E%a5&1M9Mn%
KW&KC$ ka\a#Wu\mY&cVA>yW?yKw\EuKYySA^pw/n?nh>KVc&wy$9NT<WPai*t1EQnZk:1XbyF%&6h995W&j?&6
p!twJ\ jd<dpMRCkn*dPD6=5aW5/QDt*LpyWC^\HP8ZNijb>1%=H\\FHeEbQXF>FAAM\+p##F&=hj\/jL\iWTMX
kJA!8t ZPt<86:TuZHEP5V^:FeE&TRI@\ZCA5:N=#B^ylKD#kAL=>G9njbwX&^VuS:%\mdqMc!/#dqVwBk:9#ah
mHE@XT 5NuT5Vj6eJVpuIt+$HkqN/EumM+XHMpldLQqI/c?i*\BQtGjQ<dK%Xan?RMh=:CJQ9Eb:lcKG!p*NEip
XHBHdc NekicG&jGeu8hNkI1EEajPNRj1HV1mYTB*GMIAl1$+u6p*ydYM&+CKQpcqluH=bFR1H&=:QP6YG=!WMN
qu/P$+ pBNZYF:*G::i*5wcI&iG@L/a@Y44EVanWPun1DDe5JP*Dn94$L=tRkicC/ITIDcwwwble:@:<$kabHK%
I8aipw Id!hkkhASmRed:hM\Q!AtH%=S:YetE9yXPYt5\b6DNG&CIXHEm6%q1Dk@PRpm9BQi=&dCmWt@BEd4n>@
@+%BVE >E6SVHc?+Tput4#hu<na+Cq4IuDi+R\nG$4lu/!+WD8A=K*G1*?@6/Z\1%LXXq+ku$m%9Y@4/S+FtJpN
%S+ptj m1&y\5^ncF6#5&eK:4<J5uVWalpHS#\k+#lk\$DX+q?X:@kN:KhXlBLl^kwnbGIGWYiuw#WwuJ$J9QF^
tp/m\? @Q=ZMX5NR?w%cpjP&BMael\R?:hZQSaVmA%tPYLMVi8e8lQdC<QYREMn=N5qGa9dKy1eC<SIWy^QWyyH
bBXMp= da5=a!!LQXTFa+GD^JJ>WHRWY+l>$\9#>DGmtk<&dcc9/w\CAqWEjMh:%<$HmZ/lQnLdb*lXD6wwn>6M
*Q!6iY #Z<<=SC4^Ld45V&8>N=ZXD>SN\XkY\\V$t:\5:T/Rh4q#5qHTmbpAlyWJ#>FQKYSVTjb:VAB*aPe6bL^
%\l9^e nLby5jpZj\FZln$MbaMT:TDeLCGV@9j^qkTGBP+18$DEVyD^6X\AJIhy9IaHAHd=SHc/hXG&X+h<@M^q
KuYT8? *lY>tIVE?GCJ<4FlY64FE:FJY#&!@++nl^m#:=P^^ehI9neRmylyiCEj+AapW?59mtFh>iQc5%YWySwT
SeLRXR $K!!Ei*LM6nD#!HP!bijX+=AP8:>%Bl<:*k?Y=8+iBG^<:MT%$ek/m&n8BwJjqDpn6B/FuVcFqA$R$?9
XSnm#4 Q6KQHkcFT!PRIE&kEed<$JkI\1wRWN#MIElIKX8nZ%+!9>WWbLb/&n@8Wu\15V>9n6$deMk\\D#9F<WZ
%\6hd1 69MBi=atw5\WqFkN6RPGuiJcEM54VqMeKtlIFZ<A!#IlP1eRdy8$@HiiKhaS4K!T%S<j=JqJ%l=TX:pG
eWZFkY dh485d%6hWd%lRwJ8WY%eJcA?L6k#lX\hyTMb<JdWn8+&^C<WZYD^$4wCt=M6A6yqN\MFTL$9FIdEcLS
+nb1cF 9piD#mcNQicL?\#jRy:WpG#5nB?PZ&SDQ!JaM9GXenMdwDwVl:l:1Xk+8/^db!CZ<h5<c$M*^DW*9PXW
>JJ8=! MlejK4R?i*jGF!pyYipTM\MEji&<?tK@ikWL?Dtk1Me$4l^&t=8*c?lFa8CmaXlb=BQc?ap=#biy<<9%
yD8@pP <&<uQ+m<I9X+F%<+FlRttL%X!!tiDqaq>#Q5Mj:B&/i4iVDk6mBe:B5ej\BTMZbNj1MAqAVJ?/nla1cX
pQE=?@ h+#8tH=p=h5tPQF!!qt8%IVHMPQcJ:$e6W+9>Z/91yy?\=XiQWK*HSNbycNik8E&w&&8T*J6$/%b*Suq
V6kak5 cLb@lAyZ>M5R*H1h1mE=@SXbmj&=Jt/DS+l+QqK:W1uBV9!#wNLV?DeK@NQ&/DDCwWWZHq=lLnXduZ9p
Xk$M>^ q>/dm84uIAJ%=5ZD^Q/*yL!cD6=ddtPCbYYhnhnK1VC5JJcc#Ri<I>P#1Zh%SHZ/yFe=etVPS\bmDmej
n41^^6 !SAiw\cYj?&5!n1KSWh6R\KJDt8y?N^m%5PN#CY&#DWi/Bnn!H5$%h:A1\dLGAKJeyK\jZ\*ii@Z!QH=
V+>kDY $6uFkR&khhYTyb*+99$^4@D!RF8G6wi#\:CN6X?6qc<8:<GeHw&JECM8/XtIHy@6F^lu1/kJljWu=tcW
!M5l5p ck<&APw&e8GjuNeQQWLm?ZqE!6qG5*4KMbnMI:1*pJHA6FDY8$SH14e\dNY^AVjQeLjTSHee&9eW>ANA
6wX?tn B&E9LYV@*5@t846>A94EktV4J6NVT/MyXMuwt<iEVu#Z@kd+QyTE$$I1mRcyNXiuu1%tQedJw=HIc&ZC
$T5#eT lFK%<Tyw8aIL+w:R+TqBL&S>:e+FZwdhNkq#e*du!LT@iEe<j:FFXBjuE?yL>c1=%!jX&cQY?>8B<b$9
lJ$aQ: *%5tVkNX8/AM!Y<Hu6>Pe:/h<b9!n5:Eb!Xdln!t59aCpwIQja\I%eHZdTCZce<!w?C6ue:CnPw6Htup
?+Hi\h #:5!\:94imN<V+k?A+Q8/wn?#T=uQ^8qQ!@<lL@q+pL*SyCh+hy56Ryn^BM6GZBWW$J1wd>\Ba@hmRJ$
!EMHSQ LmhYJHyMCk>&J:1^e?LRJqyjkAi!WVky!tp&bq1*L^n6/QBw?%lCZ:16>#CmM4Sc@eQb9HC/KJ&it@kw
?PS4<4 YLD%JEWZcin/CVmGMG1w@&!kmGXZq^W&$AM5kLdPQDmhw!=5+&%PF8V&>94T5=mRlqA1%EJMPya@XPp>
9FPJ8Z nGeHlXNtNHML:l\Hw?qjbdaFSdjtlDm&iAtDA/eJhWS!>=8JLW*!mP@WkN?#^thD!8hidS1:lWNTTVBG
Mli!XE 6Cb>4VA&8CP5P*nq\=45&!eR@Q6=YZm99G=tqZIHBm^\&LQt?G!u8EyGpP5VXWZnjW%XS$%:HD6LD4nt
KA8B:N !K69=SWnyBAlFlIwJba*X=\t!AJR&#uKe:?5EVLELcaptkPQij6/!KHEQuBEaKq+F^><yqGGuFeb:ScT
W?AlG% dT+bu5qdHtJql<<T*4Wbn5L<Qqh^y:Re5GJ@?%#W$XHaMYt5qqnDhiaV:V!WhhAR5=9yyMkd5YQVaV\a
:=qy+m S$w^S@TbW+Nmc9I6SIm9W$y&=t/D&$tjB*ZAQ+^\qwiM<#TVP5LFGK9dT<:J/Zh6KKNu1BYFD\q$HmnL
m/IcRd hndnmZ8&nByV#Q89!H&G#4d#HWN4$ub=CCmkk^e!HEyPCp1%jBE6\D#Al@JtwZAT:9C$F<m^#%IWD^&N
yuIJL+ ut1LYWm@icJ%/YM*pDLC5tFZ+\:Bp?A@6@R+kF5Sp\4LLnkSmNG+td/Ri>WTV&\qN>*lwd*4aXlah?m8
qZp6?9 dAeK5XMpKHW$ANy\n9q<$\wElSV@>bpDT*e+@4kpSK?c^qXF%I699R&A9cbKE#A5yn/mFD1nRq?^*XVc
/hlGNE I#tF@:FHlj+F+8$\#XVjaw/9E/\c#Fuy*l:=hZYcR*\ci\jm^AiH^cmI%p#Su^AEc5=p4?8QERPED!Z8
1R!GGh uF:jljSqP+:5&$QGYKydj$k8bVMTHwBFTVwMGuLDjZh>?<1nYSdMdLVTMbiWP%PjnjSBTI9\NuR>G:QC
$jeJ8% F*KS>LdjpA6thqySL51miK?L+=>q$WFFLwTRJ?p$8FcYAjmBp@qDldtecDC$w#&^^9DH@ep4d@l#:G!S
y%b9Ap RdDE@aL&H&NLR:MlL$iHZF?XJZy#htw$$+&tj$QSML&+%B<^?FB$E9DPKEMk@pCq%ha@^6n!lWXu8ZnT
c^ciNC uuT+Q#^TbF%n+Mc^ilLhF=6Tdt5pPeHq\=d&\@&y=MFcit@$kcMJ\S=m!lMy?#wkjA$&CFmB1PJn<$A^
&lkh8q <q/>1?kF$hw1*HYQyd$eHi&wcj4SWL=I8K:#q6uZ#:SM@&8bEm$W?$u=a:1\$d^St9aKdyF?MH*qe5t8
jkac?? nE=N#p8VR&h<yXDIc6!Pn$ZLDt@^HSi+I\L/dcDuSQ$KJe@l*PZ6F>dd<FKiiTGPWX5EK*b*VcP8twnB
?<dHCZ PLtct@^XpqdqeqFJt:NZ:V1RSGCNSFmj4EYn9:J1l#M*uVY@mKPSNb^^/Caw9DS\c#%k=qcY1e&q#p!n
%dI#^K @NdE4CmHlj=cp:b/G$N4LTXd4/4$Y>yZ8mY?uTiVnDGGZE=!>y?D=kyMHQCG6G=Za/i4n=$5RV<>^H:J
+P5WL: @@#/eHnA/+jwT8+9CS!lT*BQ@h46LnXZiYHSI<^@ZcqKtQ>@Kd$RF9lQ/aY\mMm@wBem\9?SZwkI@d<4
DkedPj V9YQAnX@HWD@iRD:h%Y1@yEi@9iJb?F@pi$ZF9n*uIL9N<+Daikj1GG@/$M9DQ5V>i?1FkuD@$AN@X&%
dCAJKb JtGlQ%H#@ea/IC#<B&yB+h<\EtGSQ%H#@?c8mjD>kXyA<Hh1@n>R@=/SmAn<!Y*:HiWR?d>NN1t@4!t6
Q%wb</ 9=cXm:dLZ*wEQc?KCI<In+CI5IAAD>VY!l#Fw?*Ca?:1/tLu:Mqn#wP!<4C#ej=4McJ+*K&<ZS#?lm@p
m!h%5# /NuW=hX=ZFHY:H>j5H>YGWyR+K<kBj/6MyRA>E?1MaqA@:<S?6@1TQH^$R9AlQ+?kn?JHQbHpR5LCjH^
-A&Jcc 0005aeba167001202b4 Page 227 of binaries2.zip
+h&GuY !Nmc8*yc8jPwtD8d&>k=&@AwY#*#+JF!S9H<6bh/@8&E848X6hXj&>uj>m:\j&$IAu@6a*<dk!C@\B?Q
FWwY%b Aj:9<bm\\H?P^@:y4@pdHlQlE@wZiE^E/D@mMck\u?D@JtcdGp+GE\/TjG!DBA+<wa4kkw6<nEWZ>kTF
!$aw@b wmVd%SyD@Fi$=pTMC5HeXLF&<qkKh&l=bG!$%&S\Y?BH$>nb5J=HXSRRjF4=$p*##kF>iyyaESqFWIMJ
wh=W1l L68waKQTK4+HdwHcReA4*R8%nq\\Dy!pYJKedt6T=Qq!/iPcYnSlRRjk!eHIcH&RMq6iE>BBj^IcG/M8
A>Ct!+ !R%t6N>1:l+=tG>DH%cepMq\u1u#ljH64jcB8#A?pREiSckV+aQ\y=8:HH8kAJckC8jLJwX9*iYF+GZk
MlITIk @a/^Ehwa%6PKku\&d9!/%ckEYkIGLtX/hj+GDW@ln4mabDywuXTk8mDkWVa4H:ekYS&%dA?wa+jjhW?!
+4hLd! uj@ReaM:V1cStX?NbQTyKHjTtRb=*=V&&pA5mJV%<XkKtAA&q1?$RF1W@P*d\Gk!u\aWKEnPSl$GW4AW
9Mw^$R $Wwtl=ABluwNP#TkXc%<*MyX&tI#=<<yXePIW$!MS1W\hwSt8DL&^GI+t?>#l=KH5XLMatZ5p\CqPnX\
jLDZ\A ^?A=l5*nw<>*qeQIJa#WDdR>VYF>DdNKbISCZL@8K#wwy*WNTPhF%HJ!4BbWKu/JIY1wta9c=FhVSy1R
q\R9PF 6&t?1!Z8Tn8adB$qP5c#R^\1:SEyW%S5C9M5WyBSLY69mRtwW6&A>eituIwEX6\weF6:D*&qiNcdqNaE
ke:%:< N8y8wERR4LI?*J:&Gp=ndC#>Ee@cS9J9#V96681CNXwpK*GcW?V=qBbeD&RwFky^D#P+9^yL<Y&RPdi4
amC:y< 4H/>/!6jun\8%@lIqtI1dQpwyqqCb%t*@:%Xq<wmAD>Ib^?nM4%kn1NLYBitY&@8<JDA\wQi5LqtyAT9
<%wGyC *iFRyYtI&+*i!E/bwPRqd+Qli/a?6QaXd?\5:X\SHB\!KCqct=M*LRVc\LmW%kb^jIheCN+llLqBL#&y
a>i9jY bRyJJy6nR>VE*G4EhcbEip$hHkaYGm5@ZA6>wJ9YbW/:NnkW&?XhV^uN:<A/%NhV\$bYp#84^VQhlISN
n6qte# i*:K&Z%*?8cdp*>uXHjVBkGd#dP1lu8N%w5:$aXuGw:eqJ*wk1J%Nl<?^cF%Q6*QE%4VD+JGP/p/Y/wI
um+\$B b4HJ8W@&t6@c=F\ajPi^XihjEQXFjEGKiB5mm$eLb8l/6RJSNpV<G>X5TM5%=ZwB<@#$5n#%A1$6pQA\
VDJ$w4 Jt=\lk%B@8aAkPmH*h6C156Hqy@hJ^K/PHBaWJ?$@ATbH6&>>5SRiQwbAHVLj>Ek@NcRcM>Lt9q6d%@#
h^aGSj C%ycbY$Am*l99bB1F&MW6/Zh<JPCYSY/pXAw+F+uZ*EaS@5DJPaLS*6J#FBX!/XRGnYu^DVwpkl#pR^T
*dpi!R t+TNu\$l^tIlH8HhN^R$cKd?\Ck!PhJca1hkn<uRKqtES!uwXh4?E<dm?/Y&1t%<R#+IpP=5tadAXF/V
SK*9C1 $CuX!tbAVGhZuDDqN:&SK\!b#mF%TyK>B!F?Dq+C6/Ke\A=WpimeSXkj5Hlwewu8I6MPpD>P#h=9NPQ*
HqqSah IH6Tk9<>XQieQGqj5/^/6cbEpC9En>m9I84JE>lk=Y6LJ<*c!Hi=CG@XYANbDp>W<j%kPFm1uR/aN^yd
Q<A+#G XDacwJy+B&YneFbB+c>*F#ulH:=CbMKXXmlY%I*bE$*j?M#i^@JZ5*b^Y\F?NS9HT4B#Du5uSEqb1c1d
/pAnIw Ttl699Y\u<p=#4chRu/IL$/uYT:S>88amJWEe!w$J=ChR=MVa\t4&P\X>m\6QHDRk1ePuSh1m5nNp<!n
JVXCRX iI\!ybESuPS&@pn+9w^yt*cG!^1pep6%k@e\phSN^yG=k+YVDy?GZLc8<q1/VPal>%\W8#NBSVEXt*&Z
i1wkj@ w&Npl6eNyPA:LkGTPhm54<T6Vq6#l>p9$P=TaQaD\>W?e+Kt#CqM*eB\$=G4l/%mK5tP/h9$y&tpp!b=
@pT$#N H!X\ewXj%%K9FC@Sn55cGJdmKK6KPD^jFi%cT#/!?w=M\8QSMub$SGwd8N#J<E%=\tt$98j4R#9Z/1SF
LB#LkS e?YCRWPm<XNYIk%lMmJLXFXa*hN&!iKulkQGG$NcM&$=T?VS=F+e4:kZy4<HEFl5&MXyGBc*HV=/&DhY
9FR5/d VhdP?yG5&yd%%hec*Y<Glyh+N1#d/ZZui?>H5yqKVtCS4w6A/@A5hmk?*w65nMq99CKqPNcV$5cuEKRi
NS%%e# 9XVe6p4#c>!AJeG:b8d1NHn1itB9*XG:M^ek1=$+nFkd?@FVQkK<WdmyQp>Fwl%heitI#<eW\+/:1ITj
GG*6/Y \m&K?hMVK!?#/6>:N#tQmL>d@TLIRle!VqDLlAqa#d+*jD/$IEclEtP<wWQ&#jlRDBQ>@XNRM!+d#uwk
pMhBIt %/\>R^>Qh!w9<>/RYuBb&5^<tH1c8biy#W/dnunW:LhVDJW*/&q:Gk=9W5?GqFqX##QF4NRGE=1QhF<H
5!\ZNH FS8qLGc>lS?d:S*8^T$a*IhIPSwVMIR<J>Gw%4P^TQ9q5jN&hta:ZddkGLj#Ib%$5^BHPHJZ#h/^Zd6y
hGRtLS uPZ#^NaVc=<*>@q9@idjbXBF#kG6ZthGZ594L6pWA!WANKQWDK86:9iA$JwSbdqXyX<Y/!/E!P1t>^Za
=&bR*4 *C%NpHjS^qCtSWw%e>:*&4J*!wEh4l?6nyFSaG4<VZe:5pmc$At=<%VMEMDu\PE?:lJ&jRFquZ4YbPpH
@ZHGG+ h6E/ETEmA?^dZ*R>bi@TZPGaPeRGD5cBLh/#Y!bT1^$Md4MRNS^&*Yb>q4D*@ek*uG9#NYKpCD&Ki54K
m94<CV 4?ISnqtCdh@II++jpn6G:+RFX*+QKk:6t:e=d51qmi/V%!tMEB<\!YCLBNRZYdu<+E\bQl&!<$u%D/+M
FnSG%m n=Z>ph:u:W?:<8bP<j\Ln&*4tW8yhiH*&Kw8P:aWwWRj^FWK+PhCNhjlVlCGBikhiL&cd<!BliD!c*55
lW$4C6 cHpGj?c>%ypL:>ka1/tENbP/%X%X*KPYjVJcLI+jAqcZ<*hF1p?QMjN8F?mwj<pN<1?Ql&M*<dNb&$aH
YL1\G4 1EjIPdQLbXl5ycu%@wyq&*jW#wyhL+:hYS\F=bSAnw1li<wNH+1$X*hXna=AJ!MqcmAPS$B\L5C%\=HC
>Nw%jq E*KtLt5j4anCn/@En6=:\^PuY#$a4$T9mqn6CS5Hq\ctdHj4X5tyX%/6a8/6!w/95B8?+GC\bQn=Lka$
I^QH@t 8/@RjX!t#uSmjKTG!btl%LttY@IWl!kZEwP@$15DeEqTBT?8AAKS%VujbYhZLQbY#?Im?6V\w#/H5=$6
cQ%BAZ %1q&&^a^1M!8>Ze8MXjy5kTd!Ny@bE9Le*4@RSa:Wj$tT1XKZiWDV1WHbK<w*A/VJ#cjtH&ul&5d9:hq
iK*PKy >mlP:mkJmE\dK14CuV^IWEeEPHVlM^\aEF%wX1e6PPLLeMGN8S/A6*SA+cy#VC$RS%um/EdA5Zw<&Nu+
YpHInH &L%lCEA&!9KlW%?96<WAa^@W8\XB6ZVa4Qhk#m?kXA9!ay!XG8:JS\A/dhp?@:ZDyd$MDn+\I%NdL\NL
LXEL$/ Y?Q&iwy*i^bcj8Q5SIpGP>E=\VuQy?kRGF@P>:m14aG8VpB8jH@/hRni#+6NdQRSn<yP\:=$>RN:ciBu
tPL/*> ^?u6hXaT@K!I!RP<y9\RT4#!WZ<4D98TeYR^e698C:M1hucTd8j?V=tcu<bD!^AXc&C<L$9m%MPwaVab
p:6$e9 cTGTJ\?P+XqV^\?^*S=1VI61LHP/+*cR=HmdchGhZ:IX8D$5<AQmNZJ5u4L*:uItFV=$@<C&?a1iyJI>
<FJYBB :E\TP/pckjE+aluZbk9wduG8^mLd&*Eb#yc*n\JPl>N8QyaQLqE5#BWKqkPGZNKSnNDJ+?1R6HLke:Q%
GTT%e% mDN^\Jpa=aR+FNm^cK1mXBXD9uBZj#:R*PQp+^tYj@6$ZX$@?KnM=TGEjSdm8kdmFInijY<+NecN<FXk
ip#\6! CtDVCqT\:<VGytHEX+S1pV+<!5$c8I5N4Ty^IhNk9$L5+@4Su@Elq4jQ#Q\c1^#S>Mc:>mC8nl1=#$nJ
LtS^#y C\nR:Gcu/6C//tplHal?R#T=5<YB@tA*^!!Md:+W%LnV1X?^%T+jpFkDTeVwDqVY6^ya%\pd6<L+ZMCI
bjTE4S u%%\P%^TySW=dn@#*y?J\XBbmwW#+E\>T<i%m/5BMTPk+K4P\WqKt+*EX*cwyYVP11&GRM+WCVB&5YPN
ZL/X&m iSKJCe:!PlLl58eedqeBH/aa5cP@JYlIaGG5#jFntDP4X6R5!1=HyjbnN6lB8pHeGQYY?HI5!l+Np*uh
\nK@&* +Cb#/n^DXht*d=kV>I=H%WclK+T?Ma&=6@ltHewNTVXecXES#Z8ju^bu^iQbG*c9qebtE15?V<VnCMDD
k?>&>u DVAdhk/nTGPiVC1QXV8Spb#CwS=KTRVjIlRDbjw+MZyNJBTNp<wSkePP!S+:l*k96F^t^DkNj=LVIpqS
Ru/HVY <VIQ6d\E?qX=1V6uIW$u@uahEW*D1i!bK96FZAXj?ZBZY*uYI8dME1!Z6THYip$q&Z5^wQIaA@aZ/m1l
SA*?mM KTQ8&#Ycp<&$XkS%SyIna4\\ueuH/dM@M@yjank>NjET%maZV:Sy%!CIP>TlNeV89dDV6C&:NLpG<8/1
iGFB>i &8%n!ud&y8L8Q1&1NdSyF!Ju<E?N$lm/N4?8Tm:q?VlW!1WYCCVNe!$V@mZj>1\8mGlhE!p=:t+q!hQ9
GW&BuF >&q:>t$+l%P+Say%\PkAt/?uF<yKPqH8Ni@\kVVG+k<YyPHA4y/8bHQ*64X/EY@BQnu#CupwJp!Ru18^
\m@/j% 1QZG\Nc/Rua>KXFb$qA%<RtI*uQZP5uL?XLi\NaYRD*h^N6EX6NTTn&Q>yB%5\JWT%BEuXWe&1K8+RkX
MCJBW$ !&IlY&@VyaneAP?ck:I#Q:Ta>j^*Y%59B>mNJuPqm/TW@ZF8WB4/Gj#aBQj55w@AVZj%nqDd<+5R\nFJ
mj9Skj hI^9S9P#cZqVXAR1q<VXK*A/1HM%JBIXYKT1wqD4JVkhqG:YR^DZ*G4nHPucaqMB^5YZu1DqQ4E&pk#&
IL#TLi *D9%&Vc*KqkLY%<MLQM&K\6%a=PLpl\T$6Q!/5Qk=??QtPm\/q!F6HbH8XRE6t4bEF*XD9L/DS?=&ha/
>S@THm EDYN:eW!^96ddB@D&BP!Jd8%Ed&jS%lj:k:wDa&d6iGt5qndAPiVbYu5GLGD+C?Njid*+Xk&P@&&t^TP
Bn:#/E y^%/Jj$P<=&&@bAj<89L#H/i?:T=KDH6ZdtjLBBHD^PhMEqHt>:*&#w?P!nHWFEZdNMtQEP#5t&Ceb^u
Wp:A#F >8lIyw$RZ>hN\YYd<Nj/<kBXJcXdn*&bp8=VhJiW*i$dk6XW!VH^#^6Tt*mG5WZ6kGpn@V1EJ>!yh9Sb
6ca@=p d/ilNw95hlCwmTbSphaVWK!>j^&hWXZi1YEe#l+%Kw:&Hj+<JB?qhbX/P/+6m:?$w\=yjG>SL@#?C4eh
6A<Iid MQTaaT9Kh:^hq%8XdX4^+plyn1J&5i6ySLRnhDRiL!&SXZX::=Qi#WQVTHK%%P@t%$%jD+%$\>6Am\F*
DaTqy\ KFqWK$+KV49GWM#*+qGEkl8L9b9D$QPM8Z&%uZp98^eGZ9I^=Dbm85TTZ+9%6+XSN\CB!Du:>XFRC!TX
hCB&eM M6%cl\Sl$J1lcP4hqmuTLpT@tK9W&b%TY!uNA5<9plYL$:ejcI##wZR6WZWPle6\aaqhLkmk9=C:GTGP
Vp%wC= Z56!m&hLNml:atkWMBMV6WAmF$>V4CAwBB:ZL+K4PFY!bjB=IZbbWi?RTS!AW&EdH?Lbw<Jbin>WmlLa
Y8wC%e BWy<S+MHX<QwITc9c8J5BIMiEF^qPW18hhdXjWtZN4qT5h5BchVh#y=FGXW>pJlZZjb:LXh%dKZiIhM<
-AFu*: 0003e72e957001202b4 Page 228 of binaries2.zip
E!GPl5 PF!$#1Bm<SuG6XnQbAuwKYWlXPS4Lh?tik@R^MPq/8w<mjVJMD9HqCuY^L8c<Qp&L:5?WBb%YL/688Cc
%H#k6d nEY/XbJG=lN/6*#NwquZKy<=#%Zj1qwhZii15HL&Gi*QmHNKkGT/Y%kc:YIlLTHaMh:6uh^X=j4&nBLJ
I+J^^< T^u/k=a:T4em!@mecQcd\P85m:h%8SC@y!yEcANABIQlc>q18RS%h<$P:kn18L5R=6mWSI?XhIVu8mVq
&c+<k? yYj4q$hYtGaqDlEDkWn>XNkec&DBy+kb+:w9:+PZ!w!Dj+KEQi&?+B<1m65b>Xu*H>8eJ4WM9Zl#GMh>
*8iH5! ?$!Bbm%T*6^hWm1H:Q=dw^&#WqmFqaWJHCQAX$$4Gyk<J&qQWFiipWLI$t@V*^Y\W5DJ?kZG?16n\d%<
1R8edR RD^1jSI<l18N<SqTS8DZ@L!=GK>R^!p1iDwEMNH:be*R1y\X^#mMTeIB<Xkb9+BH#lk5=Q:e+Ind4PV8
W/tIXV $nNSL>LIatEkI8F%/KD>RqMNl6V#PyD5F@WcmthiSW?<9l#/9e**hiRJdEt=J!Q<P+ImI9#@uX+jImL@
%PF9BI G1j<Li8wdIj!?J<##+ImjH#@PPD@H\em@#kR@Peb/D<ciIn<w>mVwInRQ%KCkmIm@@aaqI@9j:T%==X^
*q%WQ9 <jy4uH<>+j<Q+QCJ@I5p+4>h@L>AjpV+SQ+D?SHlE@=V*<w@M=wt@#/e@=nl@?j>?e@:nwn\Cj!BG9ad
?uLn?! @+aIu?Aj1KG@1TWq\kj>A:Zkd!PH@aFckQ>*%+d@kj1*ZPVjZw9@PWH>V@H@a+L/u=cN9!iw?iH@ct+J
9kZp*c @\9@^6>8+Q@^d@#*?niT@%@/N@:8tYDqZZZ>y&imk1<>KwaM?A6N1EW@>GTnRla4CDpa5!Ih%KbBDH!W
=4aGdd @BRj@klnd&5E8SpDnjQASw+LhyYym#bYi^n\ALBI^YDkEIXX\VaQbhS+C&PuFmiEhP5t4#iwS*$C/Huj
QXtR4c Rklp4kJctp\i#mZDi+T^yADuX=beWS<:8paC5PmqwJ489W%mZie\KSWAKSe:N!E*FAq6tpX?+Pwhk<+J
iJkBlM \AVttGG/F:P!i4&V6$a\uSBLiSMww?eHC?&=$Y6hdAya\pwaFt4EYJ9<l=HyqJT5lPKK?>\dcqEmt5BK
mcAiRE 6FTEB$%WMCN\tNFhu?\Z@$IqL>9\&R<REeRyy%48a/P?q5y<R6WH^Zt?alIm!NFubaul5SNYSXkQw^cu
m%Qtiw tbVpESqc/*:TJ4Iyq&SBc/=#jLbbC1Mu&9!+SC\DRMYw\\Gdm:CaW^iw&$<i@ww>q:LRk:5+&:^p/yP*
:@en!M <^XLJ\?TpWwCD%5CQF@Gc$jXmG^+/QKS&dTXlCkima1#dX4tA&F$??tpYwnwwLR6WZ+c::=CP#CCR\LA
<t*j^M :V*n?Rk#V+iFQ:>n/S=@qN@Tm$bBTa6Njj<EDY*B/Wa$NY\iTm:VSBaMc*Y<JwlMBFSn:EKBH5Z%/AZc
a@a/%e >+JVq\tZ!VAQua>%@GMJlTcNRK<YKaMX11hB$!9Zb@8DC+6#iBN\^ta:ek%lktTi:SPYh\p8c/?qBuc1
?$B9Gy BT$=hEqlYMIGh?t9mb1t=#W*9dwRYn=G<H+>enk@YjPb$mhlndJ9a<b9D!k/!KCE8ESAwVZdl+d6ImQF
99w6@* ZeKTb5t4$kwKej^DYXck!:ZN8+Cw=w8!FM%B$/YKb/4/!%JjFt>ZLLR%iGRSLVd6BI>\&RIeXTcadXJC
X!h:6j NcA5cL/QcV%>\BY5IlkC@W!G=bwWCBHIBX4*Q=KGFi$<>H#\$uXj4q%huYbetXBX5R5hI5RN!c=ClP@4
\tlc6* m@Vk8P><\pTD*QDG:qPNH:\miAw?!=jp!DAdX6GYnme<Nk\PNHbhN\y!6cQ6#:NqjGS5mC5L9F15Y=V<
u/u%Qh 48Y@K59@+EuLypXqdFT4?yBGedbknHMGX?KLcCebLpEL/1Jbetq$lYIBkyM%XV5G4VRXqa&Fwpb6XKSE
V#%%wN =lwy#V<B*%M?euI1MK9jVKc#=ySZt5/5A^1kc!\C4TC<61K6whWCRhL%Mm:t^%q+pnN#!A<cn>IpGjuI
Dq$u:P 5jR/5CWu%RXG&C1?kB9ICS>%&YSV&$=1M#W+ZJ#+=FmKpLJ\Fck=J5#YZ6yT59cYykw&dYYjDR>5G#T<
NV>?mm qy9Yd65X^YWLjbZS&JiVbTiZX?!EtaaSnJbp:Rm#Gq*KVTGdSVaDEJQhu>TnaQlV>pCH:ih>BIFFFN^w
?+dqD5 E/=eVjLZuk*Yt8#SItcwEQ:Rn@/</G$G9ZYZy+PbQ=Ha%eVFt/SCet%m>@t5=@cn*DW8hDJd91C@WBjC
Am?%@G uW1Ykkjp?4M!i#X5XcJaMaGBa*VmAPel5#u$9JkSYF5uKWK*?kNNtIF?ltWh1XW%uCJkVSX5ZYcjM98G
5#*pmI GdSkuGFi:@SVe9\b<D&>j:my&hAL?1mQ=A\>pBi#j6T!GRQIwGV?KKID=95$l$LpZ9Y9KR+wci$Q:#5a
Vb#!qW W&TBYSbpeM%NbB^>Mt:i<*R4=JNXd9+Tny<ZY5GXeGBeje!kw*mMTXBJh#\e&bE@*wyk1\BqZp:I89bV
n+4VJb 4#Cc?G+iTeh!NFe5VYja^H@Q+D<eq5dCnklM:+T=DptPl5p1T1S/WGdHQ&dndnF<=cT!y&dY>*I>5>@G
jeM#NH 85QL&LyQ@QFq#Ip8q1G?w/4C>E=c+&JYp@C5hZ*\AuhICw%8#>VFHCb81!Sj+ZpJ^=1J+hdd?V1JTuQ>
@!@nuC Y:mF5J=D6VIl/C6%mVRnepSqt4#HQ5!?nJq?kK@u@EWt#?j@m:&@Dw44D@M>eRJ$a$*nVlKCP*RDnaRp
bwW5w4 8DdR8BP$ebikCh1+8\b*h$8C8#8EEIK:R\mR=De#P*j4:5\*8>ubY*Z*h&9@yi4FPZ*Pl/L/Le?#55Pj
/@aQ=l d**\i?CI!t^Vlmep=$8FG$<M<Y8LBd^Wt%P8%LQlIW95\QKA>QTAHlVV<5tI$5M%kPSltSeAkDGdJSWw
%>i+AJ ^w6d5X@6YY&iJFKD>e&?y$I5%kJ618%4k5XG*:PnM$%iLCiQ6=8tpB:nq!jXb\LXhSHSSimbN:!VL:9/
CwEk%b ljqX!>M#bPWuqAB=V<wNBX%YpAwb<ZTyPb=GA$yM+tIuhuPnhA4D1y<lMM/WDI&Cmyt/h1Y?:SV<TFqV
JbqT<4 p/q\yc/iu1uQu1a?+XJNY4na/K+$Xn#%D4ypdWY/ZKe??68%m9c=*<Y61:@k9jM&8GF5K&wR<W5I5m:l
RWMEml @%/dn@4cbMP$ndDK#SSRcK&:4^=&/qQTb/bQ@^KYHpl4Z&b#qtD^jnTkQL?WVLlEQLHLE:*wcI/wyAuD
qY=A\p #$&?Y+@@yh9IITbCEbiHJh?iLGV5<kVj?+YBCytJR4hhEX<=Vc:CXtPEP5KJD>YSe+cqX>Gi18wly@bT
jutKwb ?FjMjd6H!AJHWKXT!meqpW>k<IekmhBpXF=R^Y86$<Y!jPPD%uGE4YB^S<hIyS18%/Y<%Z/y/JGQcPiM
uElZaM Wu=eJn98!^i>Fy1t$j%q:m:XbAMbuZ9Y@VlY@NNb6aXPPk=/5=9FyX9N8@PYBj\e5yP4w9Nwm^n8kVjc
eH8Vbh tEYXDNMjZA1XFQ#Z#4Se\&aY9RS!n1Wp/ccQ*q5=@Hme@NyQICl*HnNLaaZ6+d/@1$XTw6L5X#a*T1Ya
=/%kwk J9XF>k:dM$>Z!X<Vq?QRpPQ6GqVeGQd#Bkaq?*hu&!u<T\1th!y:5Am44WFpES#lA4\A:R9=5^/5e\H^
aQmQXt &hap:WkiTdEuE%^NT%iH<ILX<GhGiaqDPi6%qjXM%*NVCeF<MS9>+@jwkPc=wh#jLBI@yBTpGT9Qc/aK
*nM@mI iFBKbRb4Ecb=P?B<Fhy5QLGJ$d8h@68NI4A:p%:u9pI?l4L45CBY#JW:!N!*EBbbZhm:&?mL<Sb%ytYe
+RbE=M 8^i$w+<:\h!MCa6EL8QK9b%u%HCb!qw#d\bKk$IIm@pGy+V/9wJD\Nc&Ln/M4ImyyI>qa^@Z#V@SYZ&!
R1Gjyu w9%bIa8DAbXlLG>^8uKh\G\K#TujMbjKb\SbMlAwL&J6KaDFBn:I/!TWiF1W6abkGQn6AJ9aGDXbpYtl
?8JpX9 d5$EWYNlKj4ucKX!@Q*q\hmV%<RlpySaZZ4:%WL^mAm$5DbuuaE\MWFbV8#TJFWP$5kCR#K=&<PwByIT
yLJKIB 5hjuhGFkh!1LF+TKIXVGY^1!cIbT4BPAXTQRun\a/iS9F&lPtIeYlq*TKMM1XtLnue?!AtI1B*G*H@PR
WXW>%\ %+Z+n5d$uSZ#9#=bj\<RKYAd$J&+P/#BQdQ<R8h<V?iCD#+F>:G<%AnTtN@&Va#mdyFj$%G?b!R\M8lc
hlhhVN LYXH&+eTT*Z%uXjj#ATJ^4J<btCLcyKti:9hVS>P@\&eTA@8^:bJp5itY?dbAQYn9qYTS8C5LeL4=*iK
QR^nKR &=\RPlFYCVFTM>W:c@JDiYl>+CIHq!pAIKFHy:D&Y%GaZ**PY!cw96ZRKJNX$5WGVIbj<GJH5MTc#h1R
K8!1yl *ab?>Zmd&?WKj@4GJ@R#n>4B4mZMcy?GNjabh9@bSVDlbDt^<Zn6FG4nA!EaB<>kjt9%6\JtmT*:4GX%
N>imki MX&yAV+Pi=tI^Vl>X4S*Yqqj<aFceqp6Jkp*$Ab#uwVRehknSpFH<l\^h/A#tYmc#HcTHt+BZdiT58iE
%dF5KP ejp9>Xw@KXAV/m4iD*<ybZ*NabqTWmXMi:wAnX@Lb9kFQN>/HVbmntFcM&pkSDLtwaV^A5uw\^1lBdjH
m6K<5= b8@WGk1<Hqt!PRE=5yTZm1&b8Ka=MmAVpRw\%q?bma4wJG51Dy!6IZp9dDyiAT96?#likQtIG/+ESwi8
:iADy< =+D4BHICLNda#MSKM6kH^**85nBLNWpJ6?epmR9+nX\TwWcIJF!yAe/#$HhmaKM!HnywKc6TcK6=<hX8
QAM!?W H:8%dQTLPeAL4y#4aVF?:N1%dbB6/A4aVWdAAl$^y!IiGyHI<naBde*ib8D%%p5@QDqa&VQJ*F&b*F/=
\GVl4J 8Ta=Bi<Y?D6+I+XpQuNSWwN$paY5uIdCqcPebd8LtBm&tVw<^mMZ!%8bN^B@@c9<V9XQ6RlwI1$#$*yk
B\8W>H BKG6/qE\GkydSp^wX5#cYK!NtV<aA?pV>k6d\%>Sln^*#MMeADKFP\pN8AP^nII^yTSN6WZ+j<6m4k1E
JNP\NH F&kDSQuJJQ\mKnT*+LaST&ew#6/plB!kRWJV\plpwtcR4adq59VWLZ+S8p>$*!lYK\Eb8ku4kW?!Ra<V
5RCPWn KIKE<qN>#IZnBudZTQyWIEm5q<81>pMZIw<MW!J+Du8iu^@*nY/ytIG6H:aAlnd^#1G/1mTh144tPXj+
FD>TwE tdHN&L+:\ECF$G@tqHnaV9uTCwDVb4R4?Nya%T^+@uXbc\I$D=AIhl$^X=nGNwTAZt%$!y?9^PNtRQ#6
QNpE>E IH858E%b<%I9/$P\m>nWVw<%F8\^RYY%BJAd\W8Hwtnt/Xqu\ZE6SKKKTCILZ/!SQc=ceZ#6kLwqXQ+8
=:TZZ* iWSpwiyPcDa5wTF1J9idEe>XJJEYcH%W$CINl+>djHC>kC*PL=wRwi:W\#!X9tM\QX8dC&A?H#$^nF?a
:hdM\* 5H4<jJNF6w@wTV?P$hb#E\ScBPHNcZAn/6#e>RyeVFe>!9La=TSMY1aVl!QXkYZGdDA6@AVV@<lh9t@e
W9iGHV :V8Z>T:n&$ZEP!5$FdP*\XWcWTeAn>!%h\B>\TBSSa%Bn#ec4JQZd^A:MN==LQN9d&duQdpHbpNH+JC*
K%!cd\ Z><w\N++1w+uGNY5jywh+GQ&4\CP!pN+6$eJ*@R#%%aL/8KPkh*YQAeK:YVeBa?w1&*^*4=BNtDSjmN$
Q^uVRk 5NYYl=jV?WD:KkiiT*BVj>t$j555$mB#XF*S?94/SGGi*#/NZt4S&&Hkp!pVQ5XA1wp5q\b^c$LLF\up
Qu/AIt ^!VCXY*k\um%eb\bZ\n#CnJq\!EyS$DGCu@>yPSk@B*AaTaYQCI%bk*Q4bT1Xwy%htJu4Z=#a!j#LMDV
-Aqlc> 000b73da3de001202b4 Page 229 of binaries2.zip
YGAB9c WmKKP\1qmPY!b6H/SG1SWtFJ\IT#Rj*1W#BMM#nIt4@pY#n#nNt%XEL8>n6RPYIWF&VLi/wVX#p?cZB$
<+J6/C eKH?XM&eeQH++d#ed5Fn4@k!^pGKFyGanZZ=Gm4#MSQHJCDNN=eek>^GLpW?VTtSjX:l1kk9JeeiIIm%
k:R<=l E+^QD?J8@Md6HkN!TjeZh=Vu6A+BLRyi#Ee@LJdL^!6IyTllJqjSb&y+LBP\?MR?<:u/#W=yXVtKcchI
^HRynP Y&*KcEXbIDM!XyP&%tDND8Kj1jaMk=YjXC:=^\/8aHPpINMMqSuuA?Vb*bQ*Sa6aZ8DNPQJNXZ^@y^&9
nbpDwT aEG=6d9VcC>+:b/4um$ZJ=XGSEXI<GSkYeT/nY\yy!:8wh4t!JHbPma+Hu9ywC6CQ%qaDI!4LknARB8l
#J<u>w #:q+GGRdF5SX</8TKS#&TCH9TEnyLN==>myalwCLid9FIaK1mdJ?DSGi@q!tM:@NcGT88BBVyuVcb5an
@1^ScP a$yZb<FG4hBb*S=L$q:&m**mG?5KDm94mQ\*VctiS<:CjlpX^K6K%#1WH#^ScGdqe#ZydbE&^dX6mcE&
8Y/Rt? 9+PIwCpX^A+nt?@\cK&\nubub4+wlqud*Nb=uida!eeAYN+K:jnQF%wqtEmG5>9?KEquF1q8L@ZtP^uR
LyRP#j LAwaKY=Z1E4qiZLlVCYK>>NbjYnL<plkpA*L<8P*LuE1BuHuEBC8@cyFI+pa%/pLSG6FBqS@Aqa+Eji\
X^\IFS dR&q9lIayP*bcph\FXB4\mLPdJ8GpD:Q:YCbNkL1J*8l?tF:ie&5pDRtb@pDdL@MdL>eejD!tR8NX\j#
Fu%PMe ha9ediI><y5&W9Kie96=apj!^G5RMDB/VyY4Ac!QNGG!d/d:uF9M9I&R&tcQ<ba$*iy+4YjQ99u=9JE*
!RN6:R 1NFj>TpA@/qXa$I%:#9u?<:Rt/@*TE!eawqP/1<:dS>qB4NHNZ8X1y5ceN4LGdSDq>$$Z*S*uHeZ8IYW
aH6INZ n&*=>Nt4MjmX6WdWaKj8m1SMKQ8Xq^<eh=Rhy=e#b5n95X=Jnd6qu5C:^QDl>Y@+?R$Ie9XmB&:&WQaw
EqFd/V plGXcu!iTc>6y&9*q#:!n\Q:^nRJ9#m^NqeVGQDLnLYI#Ykt$B%8nYXjytpRyBl\qw@XNF+HN$$+yJ&G
>WptSh lPqKm>8HaNyL/^bln6pW9JZ?u1Ey&lEh1n*Y8Zh45Q<<<8YPCyM##+bLFJPHZLK=MCCuLp%:WVpjHPi/
KjuT&% S^#F!VRu1PI8M!d+ZcVFRyq@pG8?=K1F!ViE=8W?T#!k=NYd\Y8**SB*&c/FiIjC$MaAD4IFjC96^*d9
X8>E@N dPhC@AS%KmdFYCVh9nPHd4YDj:1A+RpJ=>@H+km<kQ98lqccJT=Ac$G*u+N=kQ$lm5=j\tPiIJTA>1?E
IWX8>V R*cLkW>lipiPIyYD51%YqHAjh>ZeIP6$+hA5*Gy:948N6Jc?mcDl>8@yZmXjdR:ApST%^Z5&JJJS8Gdj
nNQkM& pk>uG$e@=8=t8D6t1@#\#\VC$wI4?lydm1@>=cPndw9LM*=E*^JZL5h@WYFAilQ@ap1w4\hh%:^y\^!D
8&&yDe 1^lNV9y+?NG1B$uw\mudh&E*NVY<!A@V1&qn@d:+BMZ*MZI?Bp8aAHbaLPCRd#b5&*tG\QR:k@Ya#QZB
yc!j4N PN5n/jCDt4!>dVEN&kw#DP8lECi5<$tLmy>Ek9n%&W9A6LQZYW46V/k>=J#:jh4D*MK?+ZB@SZ$/K+Vn
k*a6+y h!I!k#<GH+iqhd+a:k*wL6=d>*HbB91Y@waNNPX*F?>@?p4&KjZhFb=lL$:4%/$QQjy96^:+N\\M6aEj
FYepkQ NTpu%J<ZTu%8*4y6h*&kGRn:<da5?LSD5F+d/#F<!+n%5TELeYQSdc!XeaVcHI4\=tyu!c@C@/Q^%*5H
R^X?ea ?Z9D8MbDY+IY:1nI\mCZl^@6Dn<1SnR=J8=LJGyL9Gm\JB^V8yZVV&K6eMETcG#pWcHwRYQayu!p6M<\
uQ^B=X uMYu91JVTWThlctPMAF+?%CE4Xc=$>mWEjm<aj6Sat:R\VFuX4hkQWl<b1FEYBTa%C=SKX>X4yH/LVhy
DJ@#e$ 1pJ\4lX4lEdB9^#$j:BX@nib@*>cMiX@5$V?K@aE=D<ZW+Rlku>6V$D?5ZAmDQpHi\L!%@aEBQw*>B@Y
A&N^%I dAlD?Q/CF9nDiCqlCQ>j$H#<j:1&\F@Rj#aaIQ<^Aj@j+Q<#k?F@D:*@t<EA@Tj#CmL+V\dD9>#5@!IJ
RBDMLw iFdp@:44JnkWNmw4kbB@ZViS#&qACeBwAFBE%Wt5EaInJhd+8WaD!!kpA?C69D&I1\%TAw/pXpLR8StK
K9#/h\ XDwk#IpWAmp$dy/e*SwnBe%!*n\jn&ipIcnm\@^CCedAHyTJNqFa+I*cbL>6Caq*jRyFZE15<a+%5w1D
LH+5Ew ABlXPK?m@8WLjS9Wbe1MG>eEdbaEREJ1Ik&@XDJV4IJ8*d?1uw6/&eSN#8SA15q*K+/9i#t#%4h<GNYt
#6p&WM MpDiSERlA?wX?LihE^#aESjhdGL%?Z*%mAZEimQpME^95H1$WIF<<kylSlHN6&hyNJ?Mu$QIp@w#n!iE
Na^+p6 MG!JWIu\!?P*muqKJ6=1cj$J$WbCmL=GLnPLw<Gi\&ITmyA^+q>5XSSHlkFjZS>WKca+u:CaA#mKdh1%
$kGb&1 %Gbt&m*Te5Y%VhKyq%NZlXLMKKG68jayIa<e^EnN96p5G6c:K&NydpkcSat8#*:RqiFPm=Llu:uu$nW$
FdyS!E 9@=FFYBY=/hNp+ii1?t8$GIPwlKu<N@FR/u:MmaAcJ?$cJthZS$G^RV=%ctj8&^ejKlZ@KpnQFbH&b6i
I+#JMl :\d/Va^CuG$QXmYDj^SiGt\@wwC:Y@B$VT<>%c!Y<6QR=XdND4X1P8e$GGmh?/aMFF:$beEZWZRP>VG9
l#t6?R &@Vn5^6@<h=HbEwe!=?WkMln4uEHqCVcW<Zl@bpwJwedm\i=>5tD%P6m6&bw>Zp8YailYqkb8kL8c5$u
6*?M\# ^M$<:j:TCw@cITV5a:JSm/w4qBh?Q6LwhpPL\aqle*D8X<8@$$im$CHbuc$8RNcGmeG?yL^umBSHIBwT
unTuMt 6l+H\Rqd!4dBI&4q9Lll4eNhcu5G!nc<&FE@pNCi1!m/I&d>mC1mXI8$*$q%kTEePQI>#K6=JuYSwV!/
jbT#il 4@t$PeMY#yAGSMR+ih9?$@N1G:IE$^:JN^i@y6T1>APT?LB$8LP?GinBeaQJG\blGcd%RanD^*N$X:PE
NM:\M5 TWJ$Mh8hwl>dCem%\qlXI>qJyM^Zq6ITpkNX/yVwyWZ868Dmpj6XF1@&%t8iZtH=&Z1>=mn!wqlY9GBq
$nw&/> 894ZLSZ6Ku%IiVpmDJd64>RtYSD@&tcGb>8t%ZMpt\+KhXQCTCc$1R69a!64Al/aeRSi949pbLW=/%d4
V4/PJd ?p:HMDeujpaLZiCFF9&VnAc:bm\BbNu1CA?I#y<dQh!n=+6IlLFJ%&P^PAViW8N*TAId^dN><9i:6/\w
hJPA>Q <F8uH1<:$#ZcHueZmQ^EiyXaTSMA@!!iANCq#k^K+FHC&^MSFBl+?\l>&>F@&+&JH%*8>RhtIPBAQ$Z6
biYa/T FySGjRNpG&ET$4QJa#lk^MV^@FnuM4PZp<8ZaTX9Yt4?t4+:+b&NCm1Iantlqe$HR=N@&&9&tqb9kTE9
NmeV&$ Iha=9AN6\4k5QDDDln%Niaj!+=eRhW\!m&uY8/qWDk6>y/S9clRLYI<$p4W\<VXnZtKd<SK/\$4#bw41
>SJ%n@ l9$dymXG@N!GTY1:B8y6FIe1p4ZT1@DR>H4>\wHYWeKL%GitB@Z$1jNl#j#<%MPykKk<+\tVV/^D!hlj
b#884C &KJKebiKWGW9DR^/VeWNF#VMZ?:Q+V+Sn=Xwd9h5:N<qnuXqjmqC^T6G\m4pCEcSJSLCC6>*^!iW1Y>S
54*<D# BZcJpcm/<FkpWlFXtI9iGQ1dTVa8I$X55!4R5>8pPMaJtEP^*?5\BH@Wd5<KwTu>9dnu^n&SJXlApXB9
nY16ZG %@@RNj1CPKX&m%K4Z$Z/i^/*\b!JJ/Zt=q9?6%A/a^PFy#&Q=LXY%6CupPcu@ZE1*#FJDiaG>bjwS^C\
XJN\pW Pp1/jp#mbRR4upI6a^wDT*TKGS6QYi!VqJS/k+\%Q8u9G@Pc6Ka>YhuL%cMTp4w?8>d5>JPqjMw%<!MQ
N><anj H?!bqai:ApiiHSuVZ4nL1i\j%Lj#W$j&bmaC>@mHq>#chKH!XtW@XJm*kp$m1kDJ!1RL5VK\W$/FCVyH
S=XIcS $8akIStaii?Rp/y8&nDVKQES^ihuTt##*/b<\P@u/J<M\b<AR@m9R9PaVLnaEhADJ\R6aSJZbDSCbEnV
8Xl<1= R*<iQl69QEAhtH\RRWcLQ?Pi:n&EGH69/!ADIH8dhyn&*p?>#tulpK81#JADI?:e>@*TZaFh68jB<ybi
bF+@Ei JNY?uQ%Q!>ybmi5Xb/4iqYMCP=yyucL+*H4Wh=jII?Yh%mMBtXd?#<&/<Fh?d!VF=SEu%<tdjMa?y/VV
An*i=q Gbp/:4LkD#/:DQ*C+S:Nl5aRD+EipS8$AphDN:Q>*#!hKDK&FA5d=>J/&m@48\GTSVed6Pq6RKGVd:lF
S%Q8T+ l&/WNT:w?DjuduP!&5GKca&Sm:/NHP=j#6M=FJY&9y4J8Z1jyyFmqaSIWEuEaqJ?V!\jlBdjhR#/Xh?F
&WH*mK XLFRT^$jnu*NitQ:5e*q@VwH^ucaSXtNaD@TyJn4&=\J$Xe#=49mb!EYZ:=H9^F+=94<K$YF@w/D@lJE
n4WH?Y ?!uCFjSChidq^=<4c$@MqaV\#VT9*\i6a5bFk55&Q+EVH8=$iAY%ln>5CK\@F9:mWmtWM*NdXLk>Fl@:
w8LPFC MRZH<k4uY/%P+8aaTYTuEJ^B&eH\a=Wu&B$wtLQc#lH<\ew/aL&E/KZn:?GLL%SGZmWjJ%^KQt=EkMQQ
e6at\y ihw4Z4++@D4@PpQ>@iLwE<iP9VST+X<@V=Z>91>EGdJ=?91ekW>IT*mCj/leSN4yDMik9uNeGN9qF>T5
jJTG:h ia*&QMRR#kR8wqtY:tLSQFK?li#lu8+Gj>mQ?VclmGbV@A6VR9X\wS8ZLqqBAmm9B\\*iq6F&t!MLMK#
YJke$& \?H!@+EL@5I+>^&Q9Xkl\$RTX@y+cay=FXAlM&>9!w*&DT9cEI9J>F!1hZ4nG^bhn@HwEJj^^VJAd*I1
=<ybCd wkyJlVM?6GIFuIi9:>ct#I<d1DM*k^AywN\ijH5b=V%pSb!uF8<c4=RelAHMK$eKYb<EAbL^w4puD5B\
*Qjy9! L6<<K#N5\w?@deRKyThaeI\X\BtP/Hb4KGwV=n:jCB5q<K<FbKDp%IGbj#pkN=H$GJqhJ/Fd/RI8njL4
1*GQ<D eZ4QhGSPN+yViFYH\ckpXw:jNjN/pBHADHKRLn*Ca$iY?$d5i5dqbyKjk*Vn$%bLM4:td&W4kPPWl1T^
&1byaM SDDSkplN%#CuY\$abbaPdMtPaFMDb/IuYS\dM6Q?epAbpGSQQSCD$haJ?pbM41Pe+AqpVRbL#ENSVl<9
\Nh=$q !!4WPJm4NT#wCRnBjdQu5qhp4II=5^*eYlLtTMEc^ZX<5eE5FA4Kmb#+VC644M6KGewWy4LF?Bw?6dL6
+qAZMj \i$@#pT@n1^aC/Z4AiMdQ^D4My4L8VK&MRXjebpn=wDFKJ#m\Zwlt?q8nEn=y#W&Z\dPtmE#Sa+GB#\J
8E^WTm aAV<\XF$y!d6b+&He*%=!*pyq/QHn5yK#<nNQWFZRd/P69?GB1KDwCkhwC!JIe8D&dZ!AWtIj%FhpL9&
K9B6%P FWu+*Zble&LlCB!E^:EWcJGtE&PJ^w9FHcL#%cW/**!ap+TMVaqRVGtDa+6&P9nCJLm#yQ@5QhITe&Nt
yVW&u> DHCmZjTR=pJ89$Nba&?nEay6N%CNRDZdF#i8=u<qQ#+u=IM%pwmWJSy@Dd#4B<dNdC!kME?\Ibkw=uW>
6#B4ld qB!98nSj@y=8:^N<=lTVT^i4Abm9VJ\^M/Y$8y*?SdlA^IqttJQ!V1DK8a#p6CLyiwJ>wn4S1FGjP95$
-A%LHK 00057dc9d3f001202b4 Page 230 of binaries2.zip
lKPHyl F?X4m^#F\eDTRwcZ\c$&?Y5T518:SV>F8dSj!bB94e?aMDi4S4QYP9AdnZ#GaSSF5Ck98DEPP>E9YyHP
TdYV/E P@nGP9B#D^jnVBeDkIG//+En*Q!IGB96iAeQBW>EI?*\Dw*$?148HN&yhJFa>EYiG*NAw#PBMlEPXt&A
%&u8:m 9hF1<D%&*E?^+t*yen@^QX1u^McKaM$Zp&y9b#KmD8%C4FAkju*1WPWR8@1bWBZ<WdqRkkCT5D\=cWVP
ALKG!F +KIm/d!w:FR^t+JtTKuP<JE@A:u!*wKc&%jq+^E%?ZyuiZbM@De1jZK&@Z=$IbkwkC!y9ZhI++cyQJ?e
n61^ZW ^4BK+d^T<E%%WiCC6A=tDC&WE*+1h\AAFSw:d:thd/8jKpeFntTiT**&l&5uW<1kqbANWIbaE*8H8nY+
:p1*XM K$m9G<ik9BA&a%^:YmFpkVLAMBW4R:Y>n$FFbu!M*^Zhd8PHhQt^etj/bmK9+MklFKm4X>qmk&5uLI1b
X$RmX^ Eh8JQ9Gkmqq5XE<>J6\>YD6p=$ympXacV*qiZeEJtXJ\$D^NCNuPql8>tpEMQn89IiK6LYGmpy?LYb:!
aE9>6u >EN&EuA%!yAq6HHSjw=4ZZV+lT!TNS&@ZTV$YGE@YAEe1PAdT6iK#n6FanGX%uChE*Glh5eNmb1itiZj
wEu$SF 9>1T!WDF+=!VtMhXEHGXaBP/9m/et^>16FNujMi*1hD@VRhdY$@&IZJQ!bC5WD?b6IVNXdZbR\NVVNwC
mJN8Y4 HCNqwlQ!RT5pZaYVk$5BA6@*6CwDYKiMuJA^^pu:V6uheB%<=Nqj$S/Ym\Y=lBlQc9YDk@6&<whcXC\?
=BqRJG /Nna+5ImwtdT*6duFM$<hJ@\+qjL<n4A8G8BGtG8GJYQ^P1/<XV\Hmu?BtEyh>iTi/pNbjDTL:lT&nmP
<q:Ib6 Tnkt88I$6*Z6jLjhc6@@+edGkea#eCQI\J*\$$*F?Peb/Yn=:mQF#mY%dmZYalC$BmIZ5c8!<NMlZpGJ
EbQ+V> @D4/G\qbnFElw^aA8+qEy418kN@<ALJ^1&He/&Qn1l<Y:b5/cF5w:5i+d$\mw/L/mEl\6R4jTIpM#ZLL
6J6DZK YN9F#/ewnD9+nn9/RtWQcFR51De1k+!nn\pyBIph1GwQ?$*q*:I$GnE<>aGR&4+bMeNb+lG#>LNm+NK$
>jKd@J K5$heVG&kmy?leJjAM*#uK&W^<NV8JZy!/a/?Dq#Nk<m1ntNje66WbRPATMnq\1XW%m$+:e&KQaNeNVA
6DuJJ/ JEGT?&AZ/<b!iP\wKqJnCy*SDpujaH:4b#\9h!ad:m<&LL%SYZWljRWjPm4GBQAyaNLAK8hKYE@/l4E*
lGGKyQ %RdKInZDI$wm<4hW>6WK>4WBjbkCatZE=lnEFenZ^%SaPCDX89iW6tI<^^/R:S6uXj=VbYZhMXw9LkcK
$J@GW4 ASHFmE?+qwpJd$/%$Z?LHYQn?<>Gt<6w<Yat!RkK&%G8ypQm6@W$tY6T9KRpqETGlQb\lIWVm6#\q+ZJ
Rq/V8W :XNy\@%#tKnnG4iV8IdVbSlB&9m^I^ImB#KFDT#EF^q9S?%it?:b6QThRl!k^55B^/%G5@jyjVJ1P$:q
CDP=uX ZajbMnTbwdl#FnLaT9qTyYaTWmjqyZ1ILXWY#y@bA+@Vh5$^$bc#tEYkZy4!FXt9^*%iZZPdMLDpaHKZ
a/P=NV DPybT+pl+5Tp*LM?d>&=N4>+4!lP*<>5n@M>q+5d51Nt/h@kYyWEd4b#*SJZEASjm#t?bDii>6@L6PKW
1I4^Mw \kJ1YEbA>lwDWI#P49=A#c=BVm\Q\I+86V8BBhnZInC^#9\>C%>?wY\=AAV%D5^BZ\N@V\:BIL@baT4b
Wy69wH mYu4Pm%n9EYcLq#&M5ik65\&5d*aSV/PRmm+\Rk?G/liqY8GMAW9T9uP=d&I>+eMZ!u5S1AqRcqZh<$a
#iP+1B RTZb\h8T1#:/?uiKhkq8^+q8RwnKDwb6GtbYEiZ<Z\uT9AqF\4nME&Q<<<d:V^G=d/jCcLRE$lde\$Ke
e&L!VM MuR$n8JbHu!+p8I=l@YpP<PZQ#8Xb6X+Jdq1at+BYMDQu<b6Xd&Y>6NJLt4A9Au^PPuj&6Z6?c1<<AQ?
iSB$!+ @Tw+EXQbwnM&ZWQj:ZQ?wHKan/B!CF:LpW8e9JS:Q$%#YIElE*Zp9a5%Dk^MilRdh6uKGlQ:QM#QipE@
?q?%B+ uPTV>hFZ?u$H==Hj$aSSF^uA#A\n4Gy*^Te48?5uw%#IZiTWJjdq*H+Tq9FBdD:WiGYhiS6eFQl=6@w!
LP4NL: btmEu6ENN%RAc$nc1nHDeyAq=lLM%1nE1HWRGmQ6mDpT<:F!p5=VI=4j51c9##n#PDp*^TG9qGak6wPL
Tj4NPy KZ&INeGDepE*XW\^K+n#5qdKL9lLydCCD*&SXq\$@WSh!%Zmq1k/w:A/YYTk8e#Ke4\8kFq:YFB@<CF<
wTNjYG EieXtDk<?b6PAT:Wt1ZV156mQ6/GDV&T6Xt@d!iYGcVlu1In6&BCK1Vm$Sw9EFC^F=M$K1Fcn$^h9b=<
MIEKEj #NQBSB*&ykn1j1KRjGFEF8N#nQY1Cub\&!5e5qFZ<FV@BYGG<cmq=p$J*TIYq/H^QRq<QA>yZ*mJnI?*
GMq=c> bX<!QkB%nTZN%5p>=yIn4LShcJLDL<F^&pEyC+B@VJ&Ea5<!:9q==bq4lK*G@WBV#F<NIe/>EXmNm<Tt
8\nQDZ TdXcLPXa6=<9uTWm*\4^JiTt&dhnIyllTe=KV6IwCw=4mnWkZ!?iS?6MmH/=P*GjZMq%BXi^Fq!5nqdh
nycXt> e:ZPVG#%*EAP+$*HeQIWQFWVENkc@PY9aNPD$/T@itj<5GVmS>JRSlKMJE%>?PZinkSTpMVhG9n:^8lt
Qp:DwJ F9pV##ekkYHVyRHdV@DSL8b55*QTq\tp%iH=m\jqa<WC#p?C^bTARH!/XZ!QWhc%^5ubGJ<m*Jt:<VJC
LnwBm< BwyCeh*C/:%=CRld!Wek1bqVp#FJuBVc=CtRti8k9QyP:4CXVaQ^9lSA!y%C5P<HS$kjGX8blIkPP169
^1dB#N >B=VauN^/>*HeMGY=9%/6B8%=hFWt<195FtdNptyX=Ni^BAXtww6cVAXHa?$4hRW4mab/WW*8G*4HyFm
\i>CLq wB4!Nbpj!T8KFRi*ZY=5IBy^^QGaDmQc4wS/j*^N9tJY4=TT9TVq\L:WJ>A\$9aTQ&qqNZp6iZWnbKLB
Mn9e#S c?4+Mku5M!>a\Xc%$#^S>BQM$Lp%%JX:!n%B??QABii8c=CMlKlZ=FE?G1/@@#@cASCl@:q&kQB@$R/A
/6Eq1E @pNdAj4*dRZwQ:eXwL#@II5L@/$hAIZ<Dj$uP\AK@R6ckP>Q%?d:C=4@V*$DKQ>j$H>5K$AF@wL?5=pA
>mJ/aC lj*NB@?Zq@9Q>H@1PpCE@/?6CMl@**Z+>%Q<H*:9Q*ah?GD@Z>jlj*DZwiB@XNhl5MIe<#j\WiL<9*ah
*w5%pJ A8hRibI?8AKTw&yWACLT%4Yi1nSuE9DSF46kMEdl&CI?6LB!41qZQ=EddCJu96V1%IWRWS/QYqkG<NE&
nd$FeT +TwGaQ:/wqDRkKSCPjNbRRZ+cQ6I\dN&yKSk6&\/!nEV6F=iTj9ek:uYiVREBMCFaW?GIKF^t=*RwFQX
L#ZbkD dmTVFIQB48&W=Ph/ci!wFBPt#LnByKD9mk4XwG<paDQca&/?lH/*BS&!YhV8@:HZMNA%w$<F+I41#F>Y
YR:tty !88<tbkeD#L@LNE\bAEDCLwhK19P#4@!\1T\?+4LV?:GwaumRw\16T/SIic%Kh!cEJQcBacp$/$!yKT6
pX\@9? *YkV$Jc1GE!SmZL<i=@S^ml=c&QBeamu%M!HD:wV+^1jeR%:G>Sqwly9JEnXCA5FA=BKcCPmqmbm/>BN
aKdn6I JiuX=dtYFNCmmVP4wcDiiSwyP$Cd&tEI19I#\K$d9Tw%ZVH8%yJdTkt^@bL6t:VMqD%X4kXpM8*LF\PJ
/pD6pk blINe9=y*pT8=TDQqiW9u+M4FAZGLZV:LI+%<R6dqN#JWyYkX^W?AuN4:%NB#*jap5A@KqS^^@XWlEnh
y@>Lh> tp@W=l%MbKX#?X1e>M$$TXMlq8:#?wcj4HYh>5eBGM<Vw/=/<TQj\Jh*DITXP&K%F=1$wpPV:qTVG/4F
?WqH9k MV:<T9n!c?!/*@&e#%ZalB@\bV+!Be*!Ph!4%ZSVL%w:bTZ/^=V=yk96T+M$Wq59m?Q?t^wuNhRcJb%\
=FLEA5 :DkidTJ@GbX\>S8/9HY&ueCP4M5TkcqHG^tynQc$\dVcE?u44=#&NwtQcNWu^nhjy1#at$l8iSXZlkP9
hWtJ5t ZyaaVYQ:lNPPeGNmt5>+H@B^F^%t\1StNP<jK\/$#RVPqj@L\<8ERcnkdBa$iH1Sm#cH^n?yh94\Rh+d
@k>iQD n?RlD5*TC?6j=eMmat?Z1mTn!tq@%Gp/&QEGwk*W=*TIIJ*XlL6k*LnGIK$RdpJCLK>@PeY5Eu^qMa#6
nnaKyw :6RPTZcIRLye6tG/6WNqZp:%mTw?ytEA?TPydA<qJ9Ec#Rk:@c*aN:HuZ9^pI5ZcTRq^+l>qtyL4%Rq#
jS=^:! 8jW4jJ6qtCd\b>SN=P5AtM@:Y59udHy$I1t?qT!JXCdjGZkyW4$1+>%?ymZ=#am#uq=APkwd*bXZlp&V
WJ8C/C 4e!nP4E\Va/9VFP/hFGLh4/kSKEKIQwCCT8SdDiC5WjuKRl\F<<hRuMPXGiX#Gj=>bMI9jq5=D>e\Y4I
^R\#6P DSn$/qM5Y5K#aYa>ibHS>6WDjM^!tbmm!8hya@ty*%tu<ka<l%Sq<lqEB%:HD/kpjWSpJYy5BmRiKp?+
^CSTjm dWCcuepR=yP?yDlm/4je+epTyDBw!l9%=6hKdG=:JYA@!D\Xk%I=?\5+Kl$!ch/?6bDMLDSQY/AbWbuV
8@&>hZ nRu\&@HYWn@4Kj@ekiHHQFH\ZAN?wK1lL4/Vu=TJEFiVt>%YYJ@+wH/&?\nld1e/q6?q$SC8uC:^6E##
+d4?6q A9kCR\uN4n&t\Pua6Ze@lJe+IB*5pm%GR<XEY8n8EuEtwVTT%Q+anQ:W#!t:eKBQmZ%bV^ME?*dF8%LH
hSQm<F YIVykZ?V#++qQLEXYMCdJI=cwpp/BnIcFpqN#^6\5cd1QY6IT!FQ:&HS%dF#iB+wXaI8JH6aTF5\K=Qe
jHHtB# I5&@&9^NJtM?/>W?#Hn/eFiPu1RdWNH/tZ6LHaQe@bWn=*IMilTGX5&QAj!AY6H&&m?K:^>%iX/Q=H?5
X4aQZZ uWti@jCt^%Ej>:Q*#Yj4D#:P<#d64\eMA^ch4L8=S!T!Mm1CV+<KKyHy\!aAG9QEAXcyKHuV4$%jFctW
WV9+L= ^awe/Z@VJpdHGytDEY:dJFmEl^G>^6cD\FDm8RiGX@nQwXbWt5GTpaK!&mKQ$tR*ypwc^\PihDC=\Kp$
XcFDhY ?RCe1Y!bNAwXW%QIl$Cd^EjqYWh8K%1=>R%#/J4na4upP8HbLHR*AdwBwe@bYtD&n#u+*8y&Q&hhubRW
1LR#AN ^/^X1Dy94GF^CNZ$VkQd^JLI%11L#p?pC&VIC$>86h4NXQkZZlh>b^IN!DHMV*Y*:%Y$!p#DjmyTNw%a
PpLNK1 XKPZRS:$1y>NHGV:T&aI6b+YQbQ*:*tkm>L&*$yVqlH+49?Ce%:SVdGm#:d>LbNthkKmMHGp6ey9ZiF#
Q>9GuJ iF!?te%?4KV&qHmL\byIL!1TNdN&I5NyFV\\^<\mmynP$uC+VDBlJPTuMMm$yZV\#^*FPa9KVL!ARY6T
L>aACW yJQNY^cVQXG9jCqh8cF:#R6FZhDI<%A4NeBaA5n9S^6QphYMl#jX919\jQF+Et@\y:J^:=u1>M%eheEF
KDypTH T/:ydIG^=P9G=1BZN<T6EZ+9^1@/9nwE/d@abe:Z5F5e5NF?w*>wd?mhKXX5l@kJQTK#TQ:kJEa&IX>*
MPnmji cD56e<%mFWL:%cuiyuQVhSiV&AB+5#i*+IEPHP5Y?YR\iQ^Cn8buNnj=^ywB<h&Qc6*khn=YhWj&>9S?
X>G\/e ki<e!!Hel!$TRHSM:yPPk>E?T/y*Jj+S+d4*/J+VkqF%WcIlPwSP*8NWpj^dc*b9jqekI^w\55!EmSbh
-AMCHX 000747a0899001202b4 Page 231 of binaries2.zip
+XBdtN Z+E1p$Y>PwM8hdW:91>>L<uahdByDK??Mt\Kk?=Rl4j%<5c1QJ?4au=*qlH/cZBueDIRXa*u/@F/Baj+
l%@yEu cYGkaLwE8R+@nbt@1^#6TBE\8&5Iu=6&L*yt\+F>qc6&yJL<h$p=@?m@@E@Tcdau*mp\FbSF>JmlLMCe
$/EcMP Y^FHc$jp?J#qu\@JyTN8Bnm%ByZ41:8GH+*ajPE5y#hiSi+kl5!Ml11PXw>PXHPHkZSD+My&AaDC%?M/
kyqCSL nDHjqCG*MaKnn/XDeyEZQ9%9Ha@S*K$PWD9YtIMG@ww4L1FD:p:=jyJc$/kJc^c/!qDQ?@I:#c$B5QFP
L?\4A4 CGFqCPHI5cW&:tBa^1bLWBk:LNVjlZDP\mEqc^9*?5n*ud#PD!+>X<cnibC9T!u4K8>JWuVQ&i=MF6P6
QbbZhW p=$@Ht+&Du=PcHRbVqSQaWTP1V!cC\6^hhhIu=uGc<8F<JJ1?/y%:=Pnk%Ahc<aXGMVe5n#LQB:?8&y1
NKSZj@ b=1QWJyd5IVeTDbK6R=^c!FlARJ*Bbq?X@c*nkiZha&hYG1Ayt&TdHFhqD&D#PBCA!A9kDpB*dwny%4@
4Z9aa# +G9CehNNb4&PWBkajH6e^X1l<A6W>+pK8HW\:jSL#6Q&^Em?Np5eP<^4eCGpRCNpq:69$CAw>CjlaDii
d?%^Vp uCXSIGP?#DZ8%ue\bM9Dp1:I5y8kw9\1h!*RMq?lFLQFWwpBcEA9%p5Zkk\BHnK!V*p\*RSJ4jpTc:ld
*$:m6F Md6kDjuLQ5M:K\&JJk+=?+lmSiLZG\Ct?V>KW9<KD\bYmP$kPH64$dX6nm\S>Mb&jICyIE!E#n4Ij>%a
kh?haN dBnp$X9565ayM14MBbnJkXueGk%TAB$+?=Yl@C=h1%Xy=tQ=k$4X$*R#/&dB/*aqHDE!9<>i+5KbQ%6S
KN$w=> anP>+PdEjiD$H?C%EymKCBkjpB4nReiEA:tlYE\y\BM?9wm:u+ea4GhJwZXm&J!<PW/CWH\>9wmX8q=S
5uS*:A 1c+ycRa^T>tZ=q%m>hIJVmnCikK4W\5Z@DF1A9b>>G$Z&NRmNVNmZKwX#HnpwG+?$y@d%aD!mHmCBN\w
h8M/Tw ^*kk$Xau&F+IH=F*q&e@:=ZSHVQTk56EX&?Wqt:ynIHN%V<I<M%JDm??XMc%L+8yRX+?B=n@Lq/tlq^B
ZkiWqq HdqIkpGjiD:?lA=W&?Gc<8Sa1/?De5hA$*8/nmLjJ\hkTqAp&HN%A14li4KuT6\4jj5VK8K/5$p%TYlj
lutG5C PGBXaQ/#\XGcwA&#b1G+6PRq4ndF\Kc$!5#*Gu6^>ZW\1FdS9%>eB6QGejX<\*>dp9b=WW?cFB+y&FKE
y?99$6 l+mCXMG/PM^GGj1hSeKX>CY?TnMI#9k/?KYLB9Q6FbjpPbM$$=c^B4NNneKqnEbdEpR/pSLG#!HL<hbI
#^i!<E bc14?J&EE!HTMc*P9D!L:i=tM886ew?Flwdtcd8jeapEI+j5ehS4IkZ#AYcy9tLDTTSM=8%6HjXHHAh>
Znih>R c:eLii?L:c=Q#ACXm>aVGR%*+$qq\P&hc1=SE?muT4cWnKGWw=</5:nC!N%QF4SF5Y<Kwd?%\/kWTeuE
yEqIk& Nhq4nqLMtwTq=<Btn8wa$CPL?WRJS#5\&niFGu@@jSb>DVQyRT%4^&a\KTtw<a/jVFYH9hbak$Mb1QTW
$%9LKn a=QjR8lnj6yamie1WSS?pa\ja#iqLV4I#A*G@I&&An$YH@AT4SYAT$b1l9!kRt8BqlSInm:kRi%98SA9
@P=Zi6 a&q19GK9$kmYl9EVE11Y=Q5lu\n%Tc&C$9\A%IqKYX^Aaypi\ujYd5A8y^icB^j^Q$qGh*aaCZGD^=JD
wR*h&d DX?m=d&&YCXR#AGRS=&Wwe*9\kPW&JEyTjai8X*>KVAdGBitDVS@qcekme%hqmVG\HbcDM>j:Tka68Q$
V&#:aB yE/%YY1cXYm<YYDed8pkG<bhSTIy!p%8^Ze6q84I@M9DDXJXdtmuDZZm*dhn\a!1ABSaa/u>\I#D*1wj
h?m1pu h1w@PC!<B9LKcVFSj+$4A=t>IP<qwy&TbVqm\Tac^>KYGCJ^8PI$WbT/^pIEAbkN<F$=ZM6!55je?5Au
NEy@D1 :w5Tju^mK8A49hyw\9FbA\m<i6GbE/@ekul8hH:DhqV$a%<G6PKmBai8TW#%EZCnGWe5I4W^EG&6%W^N
@Rb5%D laJeiZJEwTl+cH94\+=cpS^hdFt^EW8N:<GJEy=edEY%T8Rut\nqbl#ChqucjR5KjK!bD^!FHiM+%kXY
4?VL&% eihRYNkZG%5j@:K8hpbV%dIS%Yytiw*Y56GSXYpb8K%Vp41$+*ll\duaF\jwq&yab9<QdG=Th@9GVc/#
tykp\m hqhTwTu=N#lCZ/J:aIpMHuFt&IIyI@$$uMT*Aa8$ZiWJ=9D<nVEcukEVCQ5>J*E*NneYi=AE@y!Nu=*Y
YWY:wQ 1DcycdHBTI6Dn^Q#H1he>XLnRF!\\9m9=bu+y=G99KWIk=pV/XYy@XnlIhlu&ZQ%E9Yc4FlK4I1&4Lqm
Ch/AXk 8Jdl#?^E*%RuM<6lllBP1GMj8e$<wS5uhkGnPdBWbmkq+<tb#=i1Mk*wThTdJu1Sl?\J+\=c^p9J+qZW
bhVRIA 1>j4YNQ61X4H8KD6?KdwYBCL6QT^?^G#BEP?5&uuGhtN!ud6PaCtdDmaQWiSjKlw/iJ+jmHmRA#9<$Y>
#>jMM$ a/<+LR568FeWAteXNTB1$T@Vwq8?KMmZQn8dehcTLq!5c4PXW^Xe%E>6:n>!FPcpIw8qlQHYZVlB9/jW
=wHuGj t:eINw@y^&k1ND\!GZ!haia&aMeR4T=L$m1#R!RGEl9X6u?mw8FHlnA1QK?lqI%$6dj$6i\/>IcIHd<8
uc+>W% IB11n#K1kQNiy\+XET@tp=j1Ki<F^k>WV>eWVQmHPIhVl%lR*<u5qP!=/:lu1La:VM^nu\L*MT^EMc@P
1m4u16 1=ePy16Bh:\&%YhTC!TqhVpB!&+Gy/hQm\jGeqEYWpcc@lqTlcd<==mGK^%ebqdZh*B4>6naWENtq49e
/>#S?# JyRYwn*AeiSiVSQ9uBK@iWlu*B^S<kp4:lWhd%hk&WXRcy&^%I\LF6ID/WiMNSQ+yt6\mB%qbRV?<X^A
9C:6Aq q6E:hAT5/?S9@@VXKahSy5^a?&P=YH5K#c<9TRiMNFhlAlNq*@8y%Ep@VZ=Y&RFRL:Zju*+%&VSwa:KA
Y*enV$ ?+>$%>Vj&6Rac@DiH#GcV&c*\uG6G*X?VDd@L1P5IHJ:ueV!puR?9KHH<4SClpbV^mbd!#G:yhHEDCNc
ScNTWW nTAdAmWYblAZybHt#!AHEtip6c9F6t\%lteCC^ZmY>cKT!PM=K9LFl=b:bmZ%RyFSBw$hat@qbL?\Qc^
<wLK8S dQFiGalI6Pb6N!C*buFwS>N:w:LemW^pWG*4k6n:Rk5:R19#JcM@Ce/pYDP>yL^w54=4Z><PpEF+V$eZ
B@BDlj eXP*e%T*X8K>yAZ:pD^LXTy8JDmA6K+cYqaXESB^&1Z6PYcWM?HCI6G!E&jnY/#cC<SWeZQ$mlZ$ml*+
XD/AF% <SnXHuw1SBXlT?+nW9B1Ey6chtiliJT$R9Zc/mj4TGcR>c*^y6J+Sbi:eW/6QW!dudXZ<wWCN6WIyyI4
\tZ\XF WaQA&K^\&bwiHXKZ:SbwQnm1jKL!?NHaF@/eaQlkj4PF/@%WTi<5HL&Z\?wZKFC9&F^we5*u?Yb$cm+\
MYS+>w >8RV&=#=aHkDNnVpl:GAAJ1Y$:tdeyk9FXNhTEwKH6&E$+?/wyVAnyhB+V#Y6c8b=/^\e#MH*Lw/aT4J
eKBjBK >REQ+%:<yFe4LJ5&NS<\4q:FMlnG?upNNDJJ@tAZ8AqK>QQC5Mh$wcKa=N!6qq:F85tIJ64$*9djmPJL
GY>k\p 9CQ!Y9kXXVtT5Hn:aapm%^LH8+\/8R@i4L$kFY&JMC\n>YSQiDQj9cY$Ri64kdWqIC@i9@6y=A%:Ck6P
dTF\cX 9</8H#tkj^lukFWpIEj+m^1Nk!W&j6YdueH1^d$#^WmDyFLCJLt!6*LHY^WCZw$A^%PI6$YKhd%<!mt/
/La#l% +L*4GwPHpZ:^9YMTJ61w8Mc9u/K%AdF&q6>jTjbGT^Snk8y$kp+?cY=9W\B?mt9519H+NVXM<?*W!R%%
bqnYXR !yh&&&=Q:l6cYlauiQe#G5ZmXt&6YyanFR1E=51YLE5in%1mK#XP?StQ:%>I9:R^ZN9tNm?BPVKIu%6a
DXKGp< u9Mb8&Gl^?ywTHWhCHaKL^uPKH%>I9CWGccep@*%BiBKa8w!9b^JJu:dibYhE&t6&DIY1FD+EqGML<mN
!BIG4F h@*:NbhT6KTl/wXK/P+1jaHnM\$&L*uu:%=:\<MM$Bcc5$Cc1@aH/a%aueb\1VkyQdB69RVnh%^16an$
TQGGZ! =^N&DP<?jTNYj86>T@cPR#YPd4<u9BQak<a1HCGDH8BWcA+l^Ra\#iT^W8QTJ>Q#E9/nQ\EX@u@NFKn@
j6dVeX dZnVj<Y5+Pj>#&aFu@Bjt^Z@@mu?w@LN>\>&A>>jh^j+wH>D@<t5+PQ:C%4kV?$DQ9/@wQu@NNcJV?B9
#@E*iE /D>iG@aZNB@9u&nB9/D@dHZ\Cj%H5+L9L*wV$Q??N\Hn?\i#kp@+H<\KZwnR@#KdA>n@q>$eWMWSWX>L
<k>+Cy PTlSTFlj\&$/>TZ$pXkbid&bJGa:>:NkI#=<CKhwa@?wqSq*VKVEG1ET:<EQ+Rq8RqWI%!c4PF+IS1Mi
56#PG^ XRlJ=RJq@&#WGmt+AMRAu9+th6EG:$a:JKt/EkDA8QH1==1XXYpyThYiASmIAa%$A>*\Zl&%V@&8W?Qp
HyX&:% @hh/5*^cHL=eKnEauJe9b^>J&%GP#ZK?Nkkl!#IWWWKMl=GCTeNGLZYc<h?TT49yHT54#S#>^6eu\$j8
D&pY@W TH?D&!&HhPjcA+Q^FFP/S@LyP!pF/R8^$G5WmahNwK48DaV+6X8mXNL#VVn<5?j$m>m#*+AAp5IW+8NA
EISc$m NXW:A!Eq!YLCy8ndEG^C5JtjySAW:uuT!GWGb1E\%u1R+ka<kueRA>YPGQSDTKKHIccC>:n6wN9Gt&/w
W@uI9Y Chy?n9G=#cKk>P$Zea5a4>tu!Vac*EtpWwiKLLuVSJ::bK9yLw8cG+upVc4I>wE\W66$<@p+//Z4H^y%
wZIAGk Vpi@ZRMpenY>WDn+^&\el=4ZtL5eW5<lpM8#hbEwSDT$Y:HJmJ=*GuE$$#ncQKcpwQMkpEA/W^j%plW9
/n>=Q8 RM/\+pleLIK$PtuJhDm1<Syd>J4Q:dqPd\H@JZn4IWhX<kcW<F5MXQj<Ch<+^>6/Ky%KEkwmjV@jCh:d
K#>bh* ##phY*Y&!8<:ELR!Xac</w/m$QMFPVHip/MSwk?PCW1uLKe#H*/A:/B:q%GA&1QLuD$>*L8jJG1q81jj
Va<\nl iqMyLpLn>nklaS<T&%Cwt!CFZ1iVRu+^^4HMFD%@@Dk1MEyYLV@%QND5>FkCl9#!/A5eM\A98LFWdIqc
qe@!QC M<M:KK+cV$lHL$>4lN9Liq!un6I$/&9F5tSy9Ewi/hn+NHGmk:<@lJ*TFm5J9eKjWQm?dW?8Xi>\Z?c$
4IP<m1 >4/X@MF@qPMbXHtd9Nl<I\?nuSFwubam$wZau!dXa^@Whij88hMiQd<!WuZ*b6L??wSR=F/SYaM<5+E=
uXpa%u he/AGSHTL=\!J<%AV9IanyddF%?epV8Qut^%wT!HnycX$m&tDtAuyB9&F&hT**jRmA&ykFBtlJwHpeCu
<1dE=9 !:JTCbGS/S&Gc4a9L85\YNmJQF%VuR!#u:XywHRX1SQ^E*S4l\!btYt:ie9ew<l@qGi5\59n^:tCYiX>
pJmRV% Q+PI*mEnJLVkP=%u8V=EmSZy%%VdM?&n8CjG@68iLWMQ/^TFAW+BPW<1RuTbtBB$Pua8:!wc^^4mQp>D
dbe#h4 V8V=tJP^!%pauuwG6KNaZb@<uFP%hVqT6W6yTeZijRDcPTi@RP*jqdEJYSL\56Q$DXwDk%k6<*HnSXT@
hH:lRV +=d58hBqeiqKWKa>l8?Nm+bE9mBy%H^ESL95X>II>JB8@9/Ww9IhEG?dk/ebe=um$kZ@Y%MJ4:uSAB$G
-AN/CY 000c9a121bc001202b4 Page 232 of binaries2.zip
XVJHkA 1dH+tHDDDjB#*B/*DGq<mJc*R>$!nbE%eXNSlbm+DwuBkQLInC#q*VmNjwP!hV\pZV8=y\*Eb8%=nN5Y
&ZSWj# KlP%BQIyC!>#D+AY*WWibbIXXWpuyGy6M6Qa869DbRa%FljXb>IEFXkJK#Hw:VWNunp4=t&M%wXC#TM4
lNqj<5 SJThyacyaN%Yw@wm^l=*1:!>V^qTulQ!*A\*5R$MtT><dpn\YP+JautTVN+@aqASKE6?@:b!6KnHjH6j
TFj5<E qjJ&yTYwR:SA4nppqSqX51=b*YEX\b\1:#F699K?LW1py<LY#/Q<!+jpq5cQKZ&culReuyH^IdZpD$Ti
yACu\i /Zq8uZ5j<I!p=L&TZYjcWk+j4T/$L+K!#<&?q%?5Y$?@SWLZPuRejnHNI$F##Nl6AdFka<@X>>NpFwYy
W?E>9^ ckiGJPTyD96&J5CZ^/>&m&L\DF>&LG#mh6IGlNK&8dZ6jh\^#B*wG<9?4phPdtEa#6l4#?jXSPR>9#+$
:=Z$q: 5L9kc\pkKqah/Np\jQ#e$*B/\VPI>R!jaic!uG?n@BWdMGYa&pm/cIbEqQ#+4b:Ci\5*hFL6pBd98Z5Z
KXwQYM pL%IJ?@IhRkqibk?5YaHqAN*mEQAe*4mX>*!%M=5@j%VpCi\nntj!eDNi/tu%5JJ\BDQKkCR6<A=#h&W
Cw/@Y: Ynl9h&@bKLV5!LyVW%RLQ+=J:QdI66=>aY@!Ym+GXL>j4E?b!8T51q6nSKGqd<Sl1&q!ZFX?eI@:/Wy@
Bi!KlE h=utYT4qV:8X:Tabu8KZuX1&jQZ5B\YaqMlGmE=D/?eZP4W#^=F%te@LcXKP:WE4:%bwuqqtjM#Ad:4=
4PpaEj eZIw<8u4e!id+=GyI=S?t8tGCwj>d/9BL/YjTP?G>NIhhC8y6WK@CmFBw^deH$kNtc^5dBdHMcJKQCy*
58j*\n Su%?iTXW/+kAdF@Nd8pwq4h?4NR:1TiFLtl\WTE8FZeN%chDwCbhRt^dkyMyy>4F?^+p#DJmyVy>hncH
II$AY9 qL!ZMj*#Kh1t1wd^pM8duJa&wNq:YBX/EI&tHc#MGTnu49>G!cj6!^$Sh$SjW!Q^Y8F5J8@Ta5nZak+H
5X^SZB QEWh>@N^jEj=^9aM^V^juq>pBQKP#%LGMq>ZH$%LaMqGyn:?mT=h>QES<!i&1c@MkmBF^@:!4d8mwMA^
d4ai?I :4D*E#>M%:E^BBPVLYa^+1DeFw/JSSN<LeJHR!j?TuIc5ha9919+I^Ni^&uaLiw>+>aeB9@tyB8J<Z:c
eZkb/a ht8?t=<EM&W6!*8:PQt1%>n8IQ4NiXpc4*Z?:T@H8h>FW8y:%dY^c@/uK/FM+QyRWSqM<\/$*EEk*AWk
hQG9+D bWtIum<>>A:HRVX\C4KZwTL*GwQ^BtW<XBVPlS/:FX!TldIKSDqyBBTSw&4qAZI&aTN8ZC\P\VI=14!i
$wNSkj RpQi?VJu4G^dS8lP>=dwPTeK^nHKqpHMtYXh898p!Wn/DGc^BJ^$nJ+b4u%#mQuP$HCWq:^RM1I>JZ\5
CBEFM4 lE$nA\tED%jn4??pnF9F:&6pHqXDyea!&KyHm:BHh!LMtbD9=KeCmp9\!pSAhEek*6!5ac9p5>J+G\^e
EL=Z8W jN>ky&!<QmQPuauM5>!$P6cTmdN8=T9*w=EpbnjyRXbRGc*$bLHMYhnETQEpae!pBG\46uX4QTHB9B+w
6QG&BQ ddXkdqRldYXVM4ESc#=j5thVS:lyDj>eK=E\<cS!XEFK1hL?lLZ<+Fj>Vla+B96lRKmcM\/ATT=nnPDq
tp^=W= &Kcy:JIT//Wp5lucu=yuC6:epw1G?IM+?Km59qAXR1kQ5Zj1TyhP#&^&511K6!uGi4Gn5:EuG!hn8<wu
1$^J9j *NL6KckQ#pcLld:^Q6\AlkKK%cahZl1AnN1^*5:HdSVcCGqFL^!d##W!a%cyVpCht^lQ?5A:AQ1?8a>e
a@+>^# &%TnIk9H:b?N^eD4c=ZneTWDS\*Miu+A6Ac8Dyd\RP6SCRiFPY#bF%TSI8=RnSl+*!Rm/VZPFYib9:V=
=q9YSD YPc=+^PWK:H#M/\w1B94F%wMFqyF?t^<4e^#AeymBtIt5SmY$kTuT68\tETkJ5h8EZeabRJcL!iHnCj>
l*icLk YtZ+XAL/mq1^5V@uSFdjBu!claNRXLH?G6i=lZdLpQ\pC4@<FBS*VJ^I*y/@mD9t@yVAtYkj\qij8<YC
kZ+del juyR&DTlQGL:6pM^lC51#Pa\4naI8#A1CtwZ/Fc/GwQLcEA$$Yi6$<PE@5qy4damcuD:6nM!8C&e@SVj
b1HNX9 Bm1^Fn!\1n>/KK\w>BC1LwS!5MJl:1/t/\AlyECB:y!Ew@ntXtN!u&^Lia9im%\tnEC@m4lIKXatLdNu
+P*GMw p+N9PjCL#\lLb@AC6SL$/ujb1J&DN+41GQkJb=DXCGYW>jnb??Q&^aFIeDHdM^RW@#kP@%DmK#Q4N:Gi
X*ne&T hiWXZ+9My<#Etu64tGnSYDFQ\Py#meVeB9+4**aK?FlDyhG&dHJ%yjju=8e\:a?n%E>w6j!*1i8S>5=8
j9kQ\Q 6R+ZntEj*&MBZk%&c1I98A<G?5mqkY1M/qt+XT*LIR#kbI%Tu&QKDyJXi?KDkMESNiSLu8Du<N\?jLES
%$+a5Y F^Z>S:5iIcknWIZX+yYen&!FWqIjA5+j\q@4wh!QCANJ#@Z+wI&<KeJ&&*HCSE6\y%9\LuEc6+anANtp
+F=4TM mVA9y=Mp!?iQqKMP\5A?jV@qdjLI&R5NqXXa<EVAcl:Tle@JN^kd1pZ>wYENP@SLDykL@L#9qJ<5!4+F
?!LXnE 5b>X8\FNWiuMtK?=tSqa+#T1dXdA$$8Rc$haDGdqRDw%+:^8=ID$hHt%\+SB!C>n=4X9=+%jhmcMXh$\
h+w%ld $V:4KlbGC5BjE+PhwpX9G+*64#mq=:$6?aY5qMm4tqCJ?BjldwHu^eFjTKM5*iL1D:EMw!ph^tW8AdW&
wdq5Se 8Y94GkK\EM:wkVSnJcEnVYjBLTq^m@jwpNdC5HY4Pl9WVwYYYkcC4LqS*yY:5y6py8mXNh4YPZct&k?<
1HK^VZ *EFmc:w$$ni/<t>9#F<VY%9S1%It+NBq4w6q\F#=VJq+<M+6I#AMZZ:cEPdDS?cT/qeTuIYpL%tqL/4*
Q>Y/cW bly=^M#4SkjiV<#6PcTbXBwF5!+hBE9dTP$p:8MtCd!\%cV?1kq9kqtX&^1>XW6T6TXBt!$<kniJWkB=
MP6n%h LuN1D@$B^M&aILti!+kpn^hmQEM6i/?eK9%iDQE+XhDmX#c/e\!$S8a=t&6$cEMjE58EFRA9RI*61E>P
lSk9L5 DT/6=nL6WZJDF5G/pdYLW:+QpYq>tA9V*J\QaWqD^/I@W5Tpi>Hlm\pApQR4QGZHbFZ=?R*P*H=q=tBN
in+9&F >DX\@8*Sau6IwwPQ6Kl^4chKj!mB:VLeITLeiNdu>ESF%5CCTWKCwlGASc*Th*H?bqb$<eBF5#Zp?!Z/
/KRHZq ^y11LAqC%6SKX6*Z5l/SnLdLueGN=WNGnG=ay^MLMTwu$ZmQbuY/8+X#yDX:?F#GhjyFLPFD+ncMA9jZ
dM$%eX tXn$ItFljAdp8%mCe=Ad/6EdpJAWZ#KMWPNc<duEYH&:Zb5wliWLCmcQ/S>?hIMA5a$pCmF:>Q*uqTK>
MtbmG< 1bJ9KFT>YqLNpi%apw^t?%LS!EyADe4t1QmVJ\6&&Z:kX4HwTPHy6JZ>%qV$yKeGPb&qNH9JGH<LGXwt
TCA/K: A@P=uA/ZlW@MRCR**=G>cbtXC8aQ!^\yy:YEiqMbj#ZIqnuZFup>N%J>>A$DFTe*=5MXTNTlF+nFRQ>S
BG+=Lc Rehl&5au5w*Q\u6^Gt*Q:jXV!8=E4bSpZZD>MJiYSbjcIX=<PppMu\4JSet4SH$?m&dIYY+/nq:tMI5e
RV5VbT <!8PQWeE=qCt1kA8abe>Ehw8!\<PIR8m8C4m\eIaVANe4$:y>hD\TL#u#EIdnuFJH19e=R9e\SceyX?k
&49Jqw @WQ$an5bN\+*+j:jbLwXuF+S^*WIuXyq95qt9lSWjPM69tRlX<aLhupaGG^D!6$1kPXPC<9j!nJ!Phmh
q=P\^W VGkh5Gp5LePqqN6668PPBG56$R:$6pEHE&>$taJmiu+S$I&t^NTGl9SX##XLF4&JZaEmJ9!KqA>LGCk!
m#E%T$ KaEcLMwhYPyPAmKi49u^*Ae1W^d1Mu9dh%EI6I8DWiLPePZCDIhe*LBphW+X=b$nQZtNhn1FN!W+d!w+
I5BF+^ tk+e=pJX!TJC=TEG54DGmGNGFHRJ=>htG8Eeq<E5!?RVcJwhE>1*+^ch+Huy?bP9E*nc<@/t!R>KC49G
4\=+yG @I6G6lZw#ZV%e&BFPwepenDp&4#KR<J4RW!6?V5P:B+u<iEVA:NL?HRAu!BQ?FnYXCYCGnMB:*GVKq9c
\HHI!m C1*4\W#>8ln8%m84!Mi&dh?JE*G4hSPd#>cVLaSB?\YR1juuhyNECT/nTX/<PIHk>FPit&1uBm1WQnCd
6Gt1n= <NiSFEZ&/JjPZAVYyTDdEqFn$Z+Rd/4n>ueZ+ce8Fy%61W\9KF@FtX<dcp5kKGX1G#/H#IcNFn\b9W8T
6uIBY\ W8>?p^u*TiqX/QnDwYiRJ&Z+^>cwE51+D+98MA8l*6T*CZb?1EW<#?JI#!M&N$=9DiP9#y+bu$a4iDte
&e*9dG BTj/lRV#&EZwt\+KkTWd4=*MZTa95jGH+?IpMpY/?#AAMwi%+i1N&aC5<\h?Hd5W8!%P^e+MSMpN%Lje
bNIp/X j#BJXjHM*51u4+!=VkR!6GZEQjqTK!dpbhk+!1C/FBu^n4C%NujGje+^iX94:bS1RnVYiD@aaWD=JHwH
PkE<@! $Ztm+9:MBZ*L=5*5SGl>GP%YDYylQ/te/<A9PjNLhAa#B!X5/>b$/HKmT#Fh8E@Qqi:#kCbhI6YYFEb$
%iS<Bt wcLVRN&*pLTMkXbQk/SA!GXC!@4Jy1lcb=d&HK?w:wQBRP+ycp#?$=J=l#cVAh!+nWY%#/DD=hB=cp+b
VKAYNm ey$:i^uiujp:H^MZTLM8j%ESw#mM&QkKL9pFeYVqKa/pipHI^XuILjHXHlqS56Ty>eJN*^HIFc@Gb!bC
P:Vh%@ S@iQWnk@:@@W1D+@=L?wj5ME@4Q/DiQ@c@Z:*\ZQ@!mq<9?Dj9*9T^Z?P@%c/A?yeZ/?9/Flj\m<<@Q@
yRbDQN DR*>k@LPL@AZ6IA\=A<$:G@wQ%=d<C>wj5E@KP@<Ru>DC@!JF9+dt9eQh!:A?^j$u=beC\6A@waY?MM#
bq@+iF F@md5@c9m+V@tj/d5\d>\+J6aaG@PY5R+V@Sj*QY@8^ZCQ#NaSQp=j$D@ViHDed*J@19Dl5M>kj/4\/d
+nKjq1 \D>9XBiG@e%lk$L@eG$a=Q@JW+NB@^@SjQ@Sajy*>9@Wajy9Dbl@e=kE?j@BaaL^@<N8/u>>?9>jHib@
mL#NS> dB&t+j>tHaaLZ4=KYckT:QTnSt:hJlHa*RNn=$ZRaFeDS4##l%<hiC<@+1P9QTTPDuK%^IX^NSn\S1q!
StM4e5 TQH*FSS&+\4$5nNSmcCyVXG&%=nX^9ETBQJt=b4<Y/ptA$:F1Mb\hT6!qLE#JB>qh#ecAB>1yRKKb!b5
9pPI>* +uAitlGkumZBX\VFY^E\+Yjb5LtbCXyiWuBTHGJCw4:XAn?G%MheGP^M!1cEQ!%uy1TiXMYnG8ZPL/&E
?uB?4J *&VH8kq8ak@Tdk=LGpkI\V@TJNEbn^R&chap$!IFH?$=pYwjX\un19e!GW1n^D8WFIFKeBy6IJtV&AJj
TZBB+S h+Y1wj/N^cEKuG#iRu?=:9ER#ihu>m&cA5M/+mbAGKP5%cLHS!1HaEy5T$Z>k4lF4L:FL>bE\YSN@N@c
qCW?q5 blZTeiYjldqRX@*4AlE=N$tw<LLd&T4j@Q\+X/DcVY5i*tiuNQN=RBQ9mKB&<*P:iRIBD<JNp!C8jl5l
YLbmG1 n\@4Je&Tcd8^AK1m$8WteYN%?&CKeT/WDbeHl9&t8NmlV\kFKV5l&BNyy4KYhPK!cJI$yB1=aJ?wV8Kw
!cnt<5 =T=KCQ?eLLc+>p#t8un@Fk/uuF>WZwPhiDY>enL!LPd>yqHZ1#1G*>a*Gc1^<J+Y8pZ$4=WdDXaV!Y/c
-AD#^N 00033022602001202b4 Page 233 of binaries2.zip
j/?Ij9 lcdbqZH*DwLLS$C1YcE9pqam$b@Vn6$h=^<dR\>uB1Cpt*a*4!w>*SY6C</NpA*cZtBF5!@cc!$&yCB=
uN+wtp R<mla?4P<%Qh=#tYGYh*P>TLdk#bmb>8nLwMn\EWhNd<L/mp:CSI4b&B<yn6ABpN@^t9P:F%N5WR5VuV
qcYb/Z ZB\Zj=RZe=Dp$$iV=>F!%tKp@KVDYK15&l4D$jbXN<#dC/8M*1Y1>1nFn+VnhVp\>8H*XWEJ=\kN%qAX
@hZcma J66A6DBu$qpDwdFuZp#<G5XBBjIT1LLV*m9Ywn\NmL@VN!?kRDT?yK<cnK:8NHnd4utn4V^EFkCWcBF6
+*R?&c ?a\PCaqHpAKFwl4wb>>HAhMLchQTCJZye#!RbS!>!XqYGLRKRN5Sd5#bMD9VH$%YXc4Ythi#%I6&64cD
IE:6j: XHQ%>Q/c!@e5Fy^XCq*J^IF!4Y^/&>&@^MJa#YKPkBaPH%ZEp!:$1b^aeRcb9Plb^q1n$hpeki=KNLpY
+DEX@4 VE@n8MKk+iT!!Lt9*!Lc+eD?mdLmlQY9CR@lmAY49uBQ8>SAP+ih*KW^<qeR=5&\VQH89MDpLTw6cIdX
Ac1#ZW kdjlT+CRuTVHh^8TkP^MX*=55wP^:PJ4L*T$96PW#l?95bn5J%w@R+LKKuXn\T!>IZihJjL%1hkbFqM@
%&w:&q tmuFMcdXby8DPJ8^lFnD9BJK>lQpW%VbE@k+p+5lMw1alDSV><dkd!GF+!Xd<+?e/NVa>>a1B#>TYl@p
VXn:lD FNhBTpcu%LqZ<6wqHejLcRREcALpe&FV<:+6Ecn\wG^6B?aJE6STt?b&+/DkTWd$uBQmdQ9?4ht*KeG/
5Qjbh= 1b*?uTt/T9!jdQMMI4bqud9iI%8L/lS4uaiH4@X\<%R$64tH=CR4*ai9H+puHT5Y*w$Kna4aQ\@pd<GH
EwpXp8 =wCXqA8wh6KSB9e^qh\+^*%F/jmpX+:9T+5d?>qjjnYe4\cRb\SWKdLcbE#^XZuppZDT!+YV?*Y/%t/W
ASQMVN bFnFjV?Ka<$RiIB>H4X+1uQ4$SSK=X%d1Mt6hnkTQJ#T@iJ8&awnTc\BYD=9kHt:nm@\ut@EW<SRcPW4
X8kV%E %*^jK^nMWdaL6/q^d/u=NuQ@qX*t+I5>t:mc=*BPKVqT<>kc@*nAmSd#bdBY<L4dA8tT146Cd^AaS&m?
lYQ9J= c%M>9a95MWjwc*c9H@L!ZdV#p1RKVpq#%YSN5QpJ$un<>ytM^Km\NHZnR8!IJ?X#Dc^%4Y+\=CA?8=l/
AC&XP< iMwHkaEjV<!t%EW/!#/5\wV/CX+eQdHJm&wTTC+/+jJq@y1#8n:W>8:bB<$SZMmNeb9+#P?qZDKklYq\
9S=H5^ ET>+mC4#m>NyJWjX5?mLDWX^AmK?S=*jd:c?/Q<W+tLcHF1566>nu4dCTK=9VpENn%pm%$@hq?8@jYTk
LBBKu9 $=R:1Vtipqy\qVc++X%&nQP5@yHjMVkK!He\HM=Ljc>1E*X1^YP@u*51@KHFiFe$Q@8*8jEId9edA@\#
?FLIHA i1ZCm\EB1C&9bXJD*n6KEV$h9uCn/H5XGF9WFJ!M1uwn!:GGPGKd?<*L5DeCTRty=>web8Jp</D%?yqF
8ycmq: X/=L<R@Nd:?C::$RtapJXq#RQLD#nie4XEtc%5h5jb?!=uL:98%d#NBMP*wy^$9dn6TDPXT<lA@@%ZMK
:W5bY% @nqyPFh9/FBVaWe=eLH&yC^?GKWp9@+T5M!5d6FBhdT4V#Y<mTw#+!mN5k&m%@a^Kda1J%Y#Imi1&&hN
wTGQqE qJ%cT:HQW:#cihnjPI6E^*6VlH>ApW?dFkta!nQ/eyC\4Ml=pQmmi8RCQ#6Ik@>8=8Md>uc4bkPSMVL*
jw\/Kk ci&e!bJ$*uYlN</9nKk#hk<eG:TLw+*du/<Q:\VDkDuiSYYp/*Ad\ha!l/Pm#1jGF?6=>=p@FQTI!8^p
?l1!ke %8iFuncT:T5Q$\T8^XGKTV*ES?k1!VQVHubu:YjqDmiuQMQZyTELLA6KwBep?Pcd=aDXZHXRDPLTL/wT
G@Q8S5 jS6C1+%lXmG$>IAmPH9&1d@!ZwN*m$/M8yhD9k/uqPHX1bV$B*cZ1@I9#?@!e^JW^4ASYFjD8icA5X4l
NGKwyi nJW/ieL>ClFW#aQLjtQnTI1G@XLauyMhj1hAj+1AVLE?p4A@LQWS=\I5hIJ9\lMY:a1B*/X9PTJyVV/>
/ASiqF Gj*wnP&SDY9cKGjt6m^c>IZA$J1Q^eH<$EJVpEbiLMl%6FQQhmP&8B8h<$yAylIY=%5bPbdK86iG<K\=
dW9^9M W&9AmQwh4ARI5\aMu8PM4ZR^WHa=PlZF8wtDb54Nwl@XNC>Q6tiBSu!PlMdlTVZd>W$%=H%&WTbnI!XX
%%+dA1 G^y&%nllhqWe4Bqwc/PY*n*F/Eb\6ZHbQlnLCc4eVaBBR@JMR??wAD^imHLcGleVR+a1>?V8/eL%lwbb
<YVm:a 6=ue4Hi/RJ!qYy#W5Hk&k4K$9yMj8Dlh@dd?:<5W^u8bk/!FENctaGBMqJKdN$PWNER=qAZ^kC5qij#^
bS8IPG \4dWl<q6HlDFn!FWY!:%u8NMw#iEjDemP\S8IQPTkMteH?&RY9w4EXH^c1:ipY1Qh+tw4R14\6HDaaGd
X%yNn/ /<Ta&uVquQMHC6TNP$/?pXTZ\QRaWp!hPmVG6VRmuZH$TVt4pGy6#uRL#XS=5l$wKMRtb:l?9Tnt5qw4
Cl@:^e aXlb$#/1mM:+X#<iHw+yD9AI=yVltTDtlJMRm%4*KSHN=L*4G+^tlKi>b:HVtNHIW6N/ZXM?MEn1%M@@
K8\a9p 9h:8lNNN\*meBSYntcC\jP=6:LDV5C5K^<yaH4CThMHX8TBAS+J@tKuyY\j8T\4>&G?Wl5\WdEbl!T8\
!QX%Wd MhJydjk9?b9RD<P/FJV4cl5uCwq#JCRE=LJt:Rph?weMtW9H+*Z//ln^6>4X^a:^^+X1Xcq>ntaE+V?J
cD@NT< w6LGIilkiX>%bYBQQ8PZEHiRqVe5KlImjW?=ce$LaS^4EEITRWjmbwqhuAFH<$RNLM!H*F=5iYSSA\+n
lF*M4^ Z$mhRD%1L*51j4G9&\F#uT^\Fda9F9l+L:!LZlApc1*E%:CAuId4>KTtJ9GuSXjLYCM=@Y9P1ej=<DlA
Q6jGj+ w+TqcWuF<wIN:#k*j*H$*i$\@BJY$H1%ijcdK$^j#Et61*^^!KEmRbewSM<IDlXkEIQb=cJPT&kGekRQ
TcF#lN IH#16/iTYwyX#W+H*y<\?=!P9J:K9X!J/6F\w$:dDlCZiVCTmjuemJ/yAbV1Q$Ci*%lHBYj%!T%QHGPi
15n%ju jJhAJu\l!FY\u6Pa4HtqNI#N\&yCqE\#J#I&FT>NlN5*PTma/CeENplWWCZuY+DGY+pD/KjnR<B&mVVM
hIyGFw <#RqpCe1ZhWcbi#INVDSXly*Z!nh8y:>J&1Nn#t>!M<H:&TT8kR\DJAPC#+:/BJq>yLBmw>*E!qQcZPG
+D?CHi #^!tF::bn:$jSIAcJ&uNyC/abED4B@Dla#4X1Y<X^mAX?khu+%j4J5<5DeTG#iBJ>4TP/Ke5C!nFcX1*
MG65AD P!@qwT#qyG?VV\/1$#=bk6Qb56GQV@mh?J&8lVXS>GbpKqyk/qWdcn5PMeG1laMkaaKmGE#\F:!hZ>1q
:q<<aT P*t=M/<hS5/=t#M5t#*J6QkX+*aJp<XPtbFmR=i&9S1cKw4lu>Vm1q=AX^BXed>=@cAeTYCulaH%dZBD
TBKZ$h y$uSXl@YC$KiDl+&/Xj:4PB#DQ+DCAV!*ZC@G#J\nDed6XyWA!yRinLN^:66culyIZL$<j%k=Xkqh/w#
khACNw ZC11DVwmTM\5eujC*lhQDd/54PI4MewXm!X:S*a>WRVjR1m66=WZ#\?<4PEm%T#m4+%tM+tkK!<Hw<1V
4:RZj6 NCJB>wM=TZJhm^\Vp@Gh6R5Pe>c??9dM<?S?X4qH6R6XJLBkN*NhAt5yAT*Q6C*YjLK:KpZ@MtjKdw/#
!cjl5Y Ww/y#l9i/W&N\bC6c8!$a1KdNaE^eh!jXlWb%e*?Wq$dA6^TW4C$KQLk1JB$&*==l&B+#WKI@WlEy5%P
Inblnt b$TB&XC/uWipyYK1uaejqN!6hp#$\dXZ4tGam=YL!@FR*pXIHF*yJaAjY$1S$i%Pwn+TphI#:WdBK^@N
Nq@h%d cHq!&LALqRpSa&q=k%P1MbAkmZ#K91ZpebTYy>mGcYGkYQ1D%S\Ppw/WTYkP5iZ*DKZ^$p=umYhShYqk
/u:Mt/ GjXl:+@J+KX#G#tT1Q>AC<aX/u4nFQii^j>R$DVbdVbIutRc1jbF6FlQHG&RJBSa8!lwyZDd:EIIipMG
tuDASk 5Zqt\#F1H@$1wHucRam$ttQWWy9?IJ+%QF:KJ44RdH*RSklWPjhEwu!cwMnJM/Lc=&c%$aQi<SDjjwqj
DnCKE$ e+uJ1yZaAhicbkttt!dTJlqkA!Z8$q^<h#HVNY#GT<EN6mP?^FRwh=P#A:mcEk*$uPDtq9tYK>lwCAKN
/>w^^C =YMchTwhb&yZ+*GhHF>!MT^ePe=\^!w4^/4SGV8^u?1yFEc\<bn!>1YMH?m/y/Eud1bqml&AyF$?Y*n:
Q<jVqR IHuw\jR?q5<y:DmaLjRy^6ll$$h?Dl%Sy&NKjV9K>Q8JnAe@<+HAah=jDP65ISl1<=Ba!X<1c89a@JZ%
&qDNmH y<V+<nX/bHwF#L^u=8XH+Pb#:yu#THEXC:hC=c==8aY>tDJ>#T=<:q<@wIZ#Zl:u%d6^E%$EA6%/!y>p
+TSJF? p4ZPGZVSkeH*\L5nRJ?p&+//<nhN>+nLXG/8CG!Nw@T$=HjQVu1cQZkQ!b#%NS&PW+\V+!&TmYjq!%/&
HMEG^D NW<+5J$HWuBdqYQ=na\HCJGEXCTMi9S=n@TA+V!96FdH@a?hKEu5F*LuQa4QqjQ%$pm5>BkCL#>1iJ!V
L#%h/B uFcjcZM4X8yIXCRG1u\TbM5P<Mk99^twTuG4$FDYwZCbI9PZ1GDXEPT9ZMl9>WSNWF$WBV%J+iL9TBtJ
y&S>uK LmPPQ91JEZbQNqBpeu!JVSmnWRKM9c88*NPIh*IaIa6DBYqYJQ@AmFwKpTp&Wmw11%:q^>cIF&tMDy5P
YeYRJ! WC9%%e85yG/QhiC4BlpS/M/YY#iH!QXeS9+TpTD<k*MAE@l@V+kiB959&kmC5Q>5I\kK@LYNIMn@n#aC
AiH+SW :B<$!u>j!j\ZIZ1a$F@Rj>^QDBQ?G^4&B%1R>!>wjwE@*Lpk=C>wQ5mjcPlj$H?YqRZ=@8cl@$umFPV@
%<mlp+ n^IuDQb@LZH?6>#<9$teR9<$<WhR+B<pVmEl*9>qqk<+@K?:jADIlq&GLnb/$XeQRC>kw8kQ!DIBeWWq
$#\PnE mjckIJ+45L+K:!M1^X/+RW85wm6=P=a+YnY@>Jn*S49$w<kulATeyG$RAAtnETGeqL?ZS<Zbj=eemDn:
CE</kE LBN>iZSFYwM*bW+/Pt4Q\NN4I9aNn1l#M+JIh@84+nCIT**Sm4InNSdwu:PRF!5MENMluSjHuBdYTl/u
6+YldI JkT=&T*!kJP&=JW%%b*$cAGpnTdcXVj\VpIXQCXNayT:GlPy94n$M\J\pyVn9&$kiB\STN>bPcJYtH9Z
ZlWF?I #eHcB+&1p@4N1@55/kX^TP$+RBXW$SVeX<X*i>INhZY9wJBeGLLRBE!:@KK4XT!IIb$=qFMN1iLMJpLE
i6S#yJ aJV&+*DhP1u1LA4V!klEFW\aNEYNJT^$tA5TV<64NYHKNH>hu6LQ+aJ+d<bKb#\8mPF?lDccBBjSmyY5
DBGh4K Ta6JL^^#h6eYNmG=M9EJJqhPDqIea:>Z*ukp$$>ka!JJE5$HtmFpB&n:8LPXn@See*S4p>:#cEacPp8P
k%cYPR pd&%Iq$lBTlqT^>^<@QX1q*VDc=&\8c4MCtqZw\1ijM4JT>#P:R+uVtndK%eY\lZCHY:w#Yu/9dm%y/j
qtMFFm Hlt<tF8$QVIY9BdPNw\EQH=S59//L9newK>Cn$qDn@DW9tm:AY%*%IYEJ$>jep\=/K6ZkK\Cwi4X?%jD
M\D+RA ?%+nG%Sd?qHP:adjAkW:Z?HitnEbjd^J/FEqi6LZd4^15*YpQywKKJ1P?MS9VKL#!BFJ5L%ND^!LZP/&
-A9NX5 0000fdb264e001202b4 Page 234 of binaries2.zip
+X:!@q kXn5W\J*V%KucTtpeTEq\AH@Rc$PV8p#J16tTk\e\yp&MIm5Q^BIjy*mT8J!:CZK=ZRJ/K*+?eaJECjP
C6B/R: 1DG5K&T6^XSp&&CMGMMaI?I!KSREi4BQcQP=QFKy8\%Cq@8K^+q6chQt^D!E%F9C!A#>qm8cPtlRpY:/
Z#bBeV PhJKkdA<JaT1%>W$/wlKp#>6kwbI9\8b&&TLa6VFLEkwX\FF$HRC^$CJGk+BESGTKdhB%J1bpJmal+@=
GcaNdm X\n#Z6HIKC:P+cbFE1JC>t?l#Dl??d#jMPGi%8CSBKWl<p!mjMp&d++e6lche1&IVc?*muX*I&@<1TV=
?!m>Tn Pc$1PKuaZddYci<CiI+bY@ID%$+L&XW%m1/Gc/%V>QB<Z!RMD*?XcK8eW@S>y+ju*#$tbSRe1jBEJ^ah
/qq99i TW?CYb=MZR/8Ct9yGYI<Ld=H$<X85?JKH*$S?ZAF\Fq9RXFqVWacdQk&JBECmW8:SmQKJe+WQKda/XP*
K/9cY& C#W+$Lw>Y/#1$LJYZQJ6qtMF>IC#GCAmp:JlQ@S\Q1I!cIA>Qq6VN\#A8?F4GY@C=a8FT&&i9GeK+1#n
4cMZh= +bAbKS$>K8J!J<y:64+?XuD*BNpE1JTEXd:jpDSQTFSImch5:4jI&=aN*u@FeJWl%q&F=Ej6WYjui>5p
wE&dkj /J?@pwZ@!tAEKd$QBQ4N?dLIYlyla$ThbnluJ<5!m:^iPTm*&1+1FaD8QebkNVi*ciRVthe$W=VC4*^G
GIZ+k? >VnH^T$8+bFEI\+SA%G6DilRn5>9h:Y5eDNQ=4DuktN>w9MXIwkC:95P/n\$nELF$q51<JcSlKAp?Xke
L^?qd@ F/I:NejR&tZD^y%*inpkmW1b4cF9I$@WA6/IBZ:L8\>/HJXSCmkYlSpE<:DMa%8*:ZZ4XPGq=VpcDpGa
p#mwZ8 j9IcMV#%TCi$/kV=hm8Z1n6Vna1%9CEZden5eKGL?P$9!M/5hm*yjhyn+4@IjtpwCyClV>Lk#I59!D5e
wP8D+: Jh>Mb5^YQW:/hyNMqZBJ>kE:?9t*^XF/w8A<:Yj#JhJ6\&:XPB/T*V8F*LL$WbRApd/IDlLq\1=\p*MZ
EnYJML 4l6F\ltQF=F%HS>:+&5w#FeNeZIcmHQ1HNE456\1kpVl\+4ePM4B5t<a>Dy%dWME&W5*a<?hQJX%?RuN
CY%/VP ?Spmp%jjF$BZwyQdL=KaNuS!NamKJ=a:##D\$bYG5wYNh>/>iuLGFqACjtVS#ukGVZLI#p9/CJ@dMqKe
a1B4T6 +c::LwQ1E=4+yBWRAnWJ\VHbV#BI*uPcmp@b&?6$y4w&i#@jL9XynKYTWk>n@M%Kj8KpIX<%wWN!Xqe?
t+w!J5 T%%8wqn!hYD?=h9ICXRR6Ld*eDJ&?Q6uP8P%uwJ4JZCSej+F+?Mu#^QWS%+#5FM$!SuH8c+&$yG?YETj
Xw9NiX !CcXLK*t!nXHb>!J$6>#e<:ija:%9w65qVT9+/9Q+M*L:i!KiciI$CCX\#!SwI!Cd4FlK<iTuCXJV#1j
9ZtMSZ G1F!$h*H\c*Q4VFy>ATeB?a85?E1=8JMFMd<4$6J%*m@%5uc9%^>CPA:jnydDbunjSEiwPkn+GbRNZqw
kmE>NI aSXKP?c\<AW@SRcdQuJ6b6#%/9ER^d\QuD8cI9eiYLY=Z%SXbNAL18eWAn+tiHE*K5H%W<8/Y+E=qE>n
t>8Tlj c<=XMY@wk@%cd4j6qQXwW=@D=<?n9?dG>hI%:YQ&1:<+SHFhjTBC<hDQ:QkePQk+eHCQj+Ba*hWwDq<N
RPjy@X l#/u!+yuj&<CblS5$J%9F!/LVD?ICc!55V/19ukHhu^mM$jkjQDb^jE:cH&\Vnemmukl/Z9Pyqq>mp>u
G<Y68i wX4y@C!?uEaHH>Gt5:*&^\\Gd?dtcw@/WC*iaZLp1Yt>%6i%1<#y1h#jykc?I*q9e8=QZ^k%Xq9TG%&@
</9$/\ Wny$uaV=Xbk/nKM:Xt!$$/*&:Jt?6\IqK>=B:FunpaRwiJ^LbMTHjjIBTiaBFQtHQ4H^*dF&nl$b\B*W
eZ^wVQ >q??T:F!V\u=&#G&+:PtKCTNt>?PI?kQ6&SCT&D+aYeh6anw\^+8nCejDw<$piblW+F6wHcw6bb>bAGY
MB5^\l p%*HRKDtabT@HKkNE%HK/#9D$S#Y6hyGtQF:&MclD=m1>LFk6\q4p>FikVb5uNkZk>FF&6^Z/yiG4T6?
5bw=:@ iVQW@K/DeM<>%nR4e8?hdI^4*!>p@ly9$VBl<M9*P&tAajKh5EqCiAD+!N?NKc:WZ8wija?d+apqVw:^
8NumX1 NHeS+RlZGD^!?PEWG!%!tqeGTEST%L=8t+eiD:iPX#9nCRJIG%$XYbqJI:m&hVHn>5LMuyL9=D6FjRhJ
M\bE+y acc!q1>mHWV%:EuH:ZD^tqw49PZmVuna+Z5$%tuHXL<8W/\+&8mAKcQQTWa6lnltqKX^N8>EFE?A*l4k
+BI?=Z #I%ala%d/GWV8dY#HuH:D\\^Q/Yc4qV5Gu4DVSw&*j*Wh9qJBVD4VG!4<t&a%Re/@&Qc4m%ulCbh&JNA
*#<##q LN+!k1=&!FqC6Gl^jAZ6&Jd:iZpqhmE4@S*Hb48C>G4Kkalajm%\%EaSLcGw<yA+^KY+!CQu\EaFS$%b
e\?e8a AS=9D$ekp<DF8jbd^1D1YX\ZC^d+Ayj^iwmL?VYVJ56lwVcLul=^tH&=ZuGX/^QV6YJy6%tkS4pFdcSN
QIXcS# j9dEuJccm#XKw/LWwLY?%n4CJ6:K?*8^K&hy8/a5uh/ipXLqV1SLW9BAMy5Kdp1CuMl?BBdVMlQ:qimJ
itX5XC @%9+\>9eISTnKFhS4qdep!Eitd6DJtnaG6iYXJ$mb4#XDi<SQGy9:JLZlq6Y%IBiq=?Q6%&q<uCa:Tt1
Mqd%>$ iH^w//d8K^bia@4=c5!qLT/<&aCDMY#w1JWkqtW&wtM!l46u\c+@n*=GuFd>LTnCqcbuAb5F?pG^BDw6
iKu4$\ KHlBGqNSSb8wFiQ1<buuX$V^KTT@@t%\:cdW!>9%6R&JA^Ann>D&&?*SSt<i>9aJ8dC84c%hY%LiHchk
a+%c6X YaFC$ReLwQT?Fp4bPN:SYEj&FVy&5^jd/8$X&$9b4HWT1jbB#4ZhLLAD5dq5?>aJ9lk<?=Gq@^hLD$>q
!luWmt pNee^55T$hi:N18dnJDnGctRpW9EJ!dXKLEbk#&%IZ6YhXHd+CKJ>YR*SBjtRPFAH5hE9ktp$6a%mAAa
Gl\ulq cF@eRem5$aC4MJ1Rl#Mcp*j%VNEq$Fan1pJ5qF*/HpjtleKS@@j^Tn*mw\XeR/=mq>4mGXNyH>dJ4*Jh
bJ^$jH q$1eYTm%Bi8ET>dm*MKBFj@<Z*n$$<4a#WuY!F+iwXVR4&dZJ+4k9i^!MLLRcGGkZVICQC*:eyE#!p&S
R^JX$M jXH&bj:J*XI$>nTZ9E^6:WM$*WA55I5IC:R?MSYhy#ueCLHRPJj&Bq*#upZNVbTVHq^:$TK>X=DAh\^Q
TTqK9W #tQCVk1aF^$&SuH8GewJhPP!ZQ6d&HJH41G5cVb9d$<j/dt=Fel8Ac?<HhYMHI6WTW1INVijbEYQRTZY
NdyXHq NC\#&thIZa/M8cGXe<p4M/!kN%$uukjE9q5juqXWKquPjGBFX=>tMIw^c8@/dDS@>YQkk=GC\R&*YN+i
L1u=mt &&8WF9+X8i5k\qpPyAbRmDFnMnGZ<WEIRdct9C9!ZyeXLt*uGcE9/VA\*\=FcNBF#IBu6IaHb5qGLlNu
6*Eu\J @B1YHJ8Bqw$m1Xj$dmXDAYhGSa#Nt%iEHSNu/^15+Bk/!+b61RuP#e5\h=bTb%6P:!&=6Z%!Z*WYcdFi
K9yMZ\ TXJ/E<eaq:pui1h1#uRu99=dZ\/DZZjX<G<1JLijc5+<6aPXTA%tVTkP9yd?V8p/dam%ZtBP1En?\mK!
PM11S5 &mX&J>BjX*\BG&L>m4cm$wTem&!+%<qeSkuk=Mj**ZDcHPSB=l1T+yJmy=K@mMR$iXpL=XYp:Qb+lq^k
TT=R/y #TdT$N8XGLZIM:Y6enuYAt848F5<M/wwRT/I1k?@>:IM%EmSy$l%6ACViRwcPlMAVLE9B5kliQNnq$&#
dLNViE nFNA#5au:TTi6!1hh>kV*=nA?JK+ikT6a/iF*+qP*=4*8m:tZ\?GMyidEKmeQb^?i*E/=n@8a6F<wtTl
GNEmuL weQhtPc+<K89^#RXX%G?<H&@Hhi&/CqP#6Yq/QhJl#i^N>>lcNw%k/I+/<w1H@^4t1R6lBDd#mEAld$Y
?=1PaR Eq>N?6&#QyYSq@u#l5+k=4tW\pAX*C>D1!6N!8M/uy1c^TDFM?$tyHYVS*dbJ@ZGmP#IA6%^wSq\cISY
QF>qeE 5Ac4$e@yK&+Y1VQC1<F^%q$m>6QYMl$8Lw/hVy@\uSq<%A#PV?KV+VD:J^uK@T#SN1:ZayJ#eWEywYlE
kp!+C5 WXP+L&Phwi&nc+eF#J@PcNM4pu4P<><q@6C5itLJTaYFR@:J1Z!A+!dJpkVK5RkhpPw=@B+@%hw?\GlY
Ru*$Xh StJ$#Maw=e#wd</^<jC!Zt%QkMW*8piSp4PqZtTjkNjY#tNG!pVd?5yu>yFYYpYaYw#X@K5a/S<^5hmb
=Qjj:F XS+k:6<<4hilE*d>TK9M@bWRJl@6Quu>6MB\l^d1En1ip?K=/LD5&1Yb>I<4T6l=tl:bF4%y/+e^b^>+
WV$Se$ m?al/M+RBWEtG$G4:%NyX!1m:nJeTEKkN?G/1%k4n*K4CIXaR91n5mu^Qut:w1+tPW919ljP/D9&<EP9
#$AXpA C5#6DFEd%k@mK!B4EZZ5!GId/*q#>P*pkWBL#E=#5IEq&NA8h<>P%ckXBmGTtDAREZ^m$X8M95TVwj/K
kaGm^Q h>Z8EA6\!iX9hb5q+8VMi1Nb@dlEY&VG/wMNTZJ^B4G@1yR^Ek$qG$uNcqG+wwSc^ppXaH^dpcSC@hVQ
cZN1c& %d\NBDe=u=tJ5!RnJAE+%8E^TYI#/YJFFpE4FyZn*mjKF4bY8Nitm@nE%YBQidVlEL!N@ayJ81YN=Q?E
>Z=CNH F?a@bkYuw4Wdwkuh!&%VZEQm!*XW*H^\!5P$bw&eTw!@GE\pZt*u/EnRLVC9^Iq#ud1e/u5b<cyaqdAX
BAjT6S +/pDtR@8cihQMQ1G=VWh$h!N?bbt:NXQ%VJ?>LWJ?SGDqwj:#+ZjKcC=p/c*aQIjy?X4cVK@lSVeFu:k
&NW>@u *5weqnK>:Kn$^9Q\$Q:yL*?nZeSlyn*#I:nLS+6V9bXYl1dD9?Xut:LW@IEduNLWWu:dlMi9KuH1e&$j
CEm+JW MHV6djPyp>dXPJdD*i:R=6\4#j+uP\K%iHS4Y@8LE59lauS:IK:hX%YZNmw^Y:F//mnyVwCL#&/\JZaZ
hWLP6d XD49R><HGc\en>\>ip*DAW9mnR=dDdPuL%cWHC118c!H8m!que=1yByFZc>$ZGpn?#WeZ:XRyiJ@CNZ%
=@!n/8 eK#i8Dkb&n@iD@eZj!>$h/HFB=M!qdHI^cYetwpbi6NXA6@HB%%H=Y<hJaY?Lb6a:ATq95E$^q/>n&R4
F6AY6W QG/6$#G8teK*C:E:%K<KT*KaP+4PFP$m=e9@p\A6CQ8jGq$ZFQ\9c5:C@#C+Sin9B:eI@jQkF5F@WI$F
$>Ft\e Bj>VhQ%Q81@\*>B@Ww&FiQ?CFlD<R@BhCQIZND@5D$FwIilj$H>eYT9E>#j$u^S4Ij/@wQ?5YA5J@AZ?
IF#@n? ^%C8EP^9ZyukH?LERwJ@>eL@EGWY?p<nb\RF@/@X<9?YAibS@ye@PX:IQ/nqR5L@yJd#<9%@kiD@\aHk
@Ie4mA *9@:kiA9AEaR^nhcFy/M1^lkZ5W9GpcJA5Cn&wl%k=J!#5SjXMBDe<#jpFw?dkAjji*MBP1+>JAdkJE&
C\%q8N Ek:m&6QunpyEZ?cFnb&yE5G@me&SNyJ\#p$w<\X*\FD1wMF@m\6Vj:B%kV#=TQwenSJ%$P=AA*Rl*tX+
/h#utP ySJWQj\BHkReReTJ%yJm<$HjC#d^:i%6VSbIIuQ:+k4d9/GW*NTtNL=FK&pA!NIRpJBuZRmB^tpB4>jK
D>RE@5 bLWIpilEShFNLZ!uGWH\qJ<<4p1BSRH*9H&a8KF8A:/VEF>XhIQlalY?G\\@cEled:JyXtwY/M+WDb8P
-A!qwb 00074b81c83001202b4 Page 235 of binaries2.zip
n+A^eh V8+lXiJhtmdT/e%&Xq?J^q=&@6!$^d1$%HCw?>1A#QnRZ&iS^9+%JupHa6+w+iknihQmDadDN\k#t>k4
wHm$ne SGEKbTn@Z4kTmym#iEAN#:^/LPc/@<iLSZ^#%uqDi*mHKFCb##$*lBL\Pl9IyhG<FHYHEc$*j/in1m4W
GZ%1<I !&iy5=1?FmtAT>kl^myEa1d8Ga\^Cy>H*4#aj*uEF:aPdS:tem$R\I@$yk:BEBKQXi\R&Q^w?/b$6FBA
p/GEXj *FWh9@F#X?qeE*#uuK5u?j1uh#C%p?wuAEd\hhj8N?W#/EqG5qedmMHMlMV=tZTBta&?ae#e=>XmPRB8
uj5X\c kEa&GlIlK?6=/TG4amG8!65HdZZ1Q^e^tm4/IHRk?jJp&bNt\Eh$>+65>JhF#pMDIaik/p*Q&?ne!:Z:
tNPtjC e^mN/y/D+KM8p$:HF<S8YXnl+\<j8Y8FjN8VC@!nSILMj$a:&aI1!8++@MW!qNA4BPBWlT*c$M*w^GyR
*q1DdW :dM=&t*$a%*VSDEb*5!!VikMia?^C:I5XpR!\VqIlEHV&wP+YW^6kWkPInTeN5?bc#:=#K6c1!y*1%uc
tmcADB M%YL@X!QI:^PtALhJqY?YQN5m=SQJ<w?ae@cqCBARG1wGJip8##EIc>T4K<DyM!H4%l:9Jm?KW:/SMEK
B\9C*a \BX9tZi6T/lKd^lMaIHL@=*T!m!kJ!1?&::XVaptPn\@$m:\!TCyEy=&LWS:JG!yPG&bCp^L@w#RlJFK
pqiI6P Aqd54/aBXFBKd%RZYw%8FDST:y!TTKNl?ia/AGKm118^Guk<VX!kXA6<Zq&:%4+6XT*X9e!Xy!6lp@An
LkaQy8 F&#mwlVE>FC/n8/I4A>dc&FA=1#!b*1Qt%CM5!HDm+=EQND<aiMyq+<*Sq4TkhM#k>9KyV6iVblaWKyu
FeEH#4 bkuIcQtB6AV:JjmdRu5M+8%5/NaZ/8*<cia#S:DTme/pF?Q^+<bpcGZu:?=qpT/c:1#Ik:t9tdLMX5R4
djd?JJ H$NaEXM$K<\&Tll4\V5npiMC=15GD=Xlw?h/XI8F9>mwuS#^Q!cll<J4M9t@i?<Wl\Wt%*bHa/I4<R4$
th9He/ wm?\d1#ME\8AFXLyLi@X4R4hXK1nP#q^lYEWHE?<NhE=%VjNKc&LSA5uMKe$Cw?J>$TVFQ!:YaiDtC*M
e>eYN! ><^Ww1<h5^JN8=nn&^%^$8WGbXTXwn6TZ=?IWhYR/wP54ZM$Fy=XBnGaccd8F/6WW\eq>awth8jFY4m^
Nn1/nt K*a*@AI^dtBnJ\+aQ49&E$HcuP81!4#TT@?EadaHLXAn!/9a@+BQeuSnXiEtwyni8dY^%TkSPjB=bAXX
6qTb%i 5ej?^KDC\dZFj+>Te!6jl:!dIElkBXjJ6XmmPpPpcn@iYV@P4a*#YuYC:Nk>lbSHRQ$/j!JhmaC!@/BY
Z><>Nl 1&h4^X#J?bn#4tKljd:P%hC&^yhM^k1WT?dyMKJwpSpWL9<=:aeIycTRTRGZew%t?dDPF:&J/5u8V94p
#jRS5P CyjXAP1ieQeKVbqtQAQ9:YKhcBKk$!k?%@Qc+qd9Lw+DS?QMj8uTZcd9ZBE&6^bc4^#hBepcTppEPeEe
uS@<&+ @@L>uW1L$%1KWXqkpC!Y^E^5uXKTZNA#?V*JS4L94%$HpkFdLJylYm\tWAa\#:<d9TQ=Fb!\*Ct?NEtp
icH?\t Zdm^kncVweT4*/e^KM1Y5MJyMDIi6/n%+*:C<cySXVw?mpK4$!ubcJyw&uM:w=NK*CJAH@qhiGI=wW4#
Zd&$N/ QM6AeacL1*uDNwhSq@@SF6?itWWJ9wSlRCR$VcDw61aye/w^Kd!K=Rib#nZ/4L=+y4APQwq&M+iASF5G
ayYX+k *qVGw1Xli>*+ALL#=dyi64LCS+&La8=iKw4m$m>?S4FM/<e:pY>+JJG&M9RA\VB:PZNY5!<hn$VyQ\^4
9>8GGD jT?9h:5?J*iE9YDN6M8Q@5#%e&qVXVY/i1enjd>TGQ>V$+pc/V\YW!j\SWZ*AwNqV=b+L&i9FTH<pNS+
j=VERP JFyIkY:qZu>kV/XnVMSS5IT%=euq/1yl6uKp@Ci8=Wd<B@\?4R\TLFl\PmVB$dwm$?A^<>X9wXqQaYZD
1i6$lt qP#M=J?#Lm&F595tiJ?:ZQB#A@i?+5kQLAmMy^4c@FDPZKLh\YXMWm<M%@@S<qLu^c=KS%tdRcdV?Y4S
Nl8<+B l?TGa9QQ^cBVC5^uH$la5kicq?!jp?$e#<c?b&5pC^IlX1uGy5?4>Xh#D1J?4h*h8J#*yK9VW4kcMF8%
qh#FGZ >e#6#yY%amD^8?Gu98FEQ9WDi6%ID5yMtwyEt5cR6Aj+W5%&inAZe:!DWVh91A\Hn*bWu6Cc>T5Sy>%m
YN#$hX V!!E!5ibE1^Zd/memT16WJN4w!EK1=?=Ct?WQ:#&LS?k&VHkm?8A!q@i9^#Ndl9bc\yyE<KCZi/!4\Tp
aL\cLH >kldCc:w:P^N!Y^lAk8hAM&YSRj8ZRhPYA@l@XH?FV%\dDyD5SECHF^RTc*JXyiN!wuj8qn@:6wa=y%:
R:Aw?C tV=G<bqV6JHj#y:ViAwP*hmR?admHuq!CYe#W#1t*PNH<kji^T8Y\JeihqMNS*P@tERTc&p@Ew^M&V&W
Mju:QT nS*%dbw1d1@M&DNQS\^WA6i5dDeYc:lQMcJt8iqeTyTZm6hAk:=LB*9PYFHLpkbLXjJ+EaQ+T5E/^<!i
dT!?Ce tDC#Te:F++kFuIV?AVS>5b/=5$%eEP8EA/QWXM^M/Q1uZiW?^9aF+DW&\T1pbq%>jeVhRe6>eACPqSMk
GqG=wG l1mQA6b*tVjk<X8ERMiNnSZ/CLG=:?=*/aDTG!bI:qwM$SueQnQ&4FytP1*6KG$=!446ILTRZD$bCd%^
6Bp@F^ d1M>Bj9+GD&LKG955PnVn@kD&LARqGaJy6G&t&G<Kj+IdH*wH8@e8^cWywumNJW8Rw6Q++i+^EVw8cMp
cqVI>@ lJVh:9hYT&S1dR5X:Ilt?FAlFARjj$blt+?BLXSw1!wZ5Nm+E<58AylGEw?9HNGPLw6@aiK%F8D&6V6w
pqqPm9 6Xp9CWnGCe%\X%y:%%k>bQ19yS&elG#BtY#1R#bNDWCtm+DA4FMj^6ne#$GGhL6G&VZSVCQ66nKww8Iq
u8KuZ@ ZSW8?9K$>iEMkiEhwE4W\RpI4Ma1NZE%^bECZ8?^/+>Gm:>cu+qpXBnpIDTQal4^1*@HhPF@CyR=L&P*
KV4yeM 1KH46lL6&@Q*Lw?aHW4Du1K#m&P@Z?<FwK&:>jjNe1Za!P#y%!K<Ty@^qKb=YwG>mIS=5GujM$SN!h/G
@b>E9& :B$y$+%CAHM?YAa&a6?+h=WDLiMjET<wM:ZdlG^FYbXHXkEDCZtunBj$T>C<c5=<TpbWLq<RA*Y^HiuX
VZymI9 a*eJCj5laVT+64WA+85u$lc+TuFGb?9#R%bJDh/acH%L8bPQLE+\5VG@!IRhln*A#KL^1+KIIyM$ZJ6\
&Tnj&J !uMYL+*%Ejhk91RldPPQT1++8TM?Ich<<m8qBY@LAFF#T1biFw$iyqQYVLnQMHQbyLSiHBF:4B84X+k&
$:DBtl A1CJ=ZHN$uwttD8/DqGFVq&c@jIm=%FCWYt=&%m9nEuqyCt4A9h\w<k+n%dh$W4^JWudi<RkQjNQB%Vy
hBi/5X TG!A+EA?KQXGmN:/?C>4bRtNpI%hML1A51hWH:QPJN!IQ@B5N?yd@\htbbkWN@>64=WKjt*+<X45q5JY
VbwH=H MaTt/y%5DDLcVnqJcR^p?+!YJXAq5Y>VTqyiaa6@PtP%19=Dw#ZiRJ&\qMKc<eD1AP^ZNj@&ZEV&NDKH
S*ZRpu <K%u%/:CbP$Q@nq6B$N1VW^RMkFutFCi+$bXtammhdCQK1lYkQGWtL%*m>WSPE+\1NZd^P$&q!?k^BuA
qZ1Dj$ &/q=nZ=k+\\TaBY5NJPdqi8VYlea>PZH<4hH8Y$!l&66I9nS^6Z4$@kmXemR+X4I8XwYtVDWp9EE%C!b
bwTGJi %&lkTZtP5ST=6FAw1SeT1^9/K>uXk4PW@*\GX^^6KRc<jnGKCn6QJ658XDTLIqCRmVRi$t>c:Tlhn*Ej
ehYb%w +YeDl99Q^FkXNpjISQuQ^LI6TP\G&tFZ^yZY%\\hNbMN^BZhCmlWKtCbYwbNSXy%%aJFdeqP#M!WE>CG
QTQ#ea a4Cdk%*T55l\ajd9qKX%DWQPWAQJNDI4DqK9#K@9DY/pu$dMnZNHkPL%!WMDV+DuqMc#NN5Vte+V&4LM
i/1P\@ Yn5a6CF?ZCXFL=Wp<a^u1SkZ\w<$6EtyI\@/NGRLZ%5+p!@EiQGhiE+QGN%<II6jPa6jL!6LjBKQc$j$
JIy<b+ <ZZ\9XtWuRjb^nuBy/jpZb9Y<baLF=mE6E%lN9!#=Edd5<n^LKkLypW55@4/RG%5\ybVnqR>je&M=&w<
^\i4Nk 6tT84pmRKE!R8T/WVyAM#@YpK\RdhA=Y5I>b>&Rq5&P8ZZiw%^FWF9k8TH=RR+?H+Y:>$XmR%1yFc1jA
CZN=VJ 6C=G4>jl*wQ@SGBpF#EGK!&L\<H\%Rm?C%>kVBiWRwZP%T5VcQYj8ttHTXZ>14i$JMZ+^hEZ$c%A9ejA
lawtQt *Mn$Ew<nWZu@^Bb6J=X8:bmnWYD$LDQTSu99=DRtN&TkNy9n/GQ@:dGplqbFwFZFRBjd4Q^AHd6!=#Hd
AC:TPe &\>5$9+</B?Sul@4PS6V5HPIX&*^:9bnSmwtPA?J8kTY1BVmEkP=t<Q>5?CWJMF!&jmiV>16uPw4ee&Q
T1p%ni mKTIMVkQZ#tdRdi\A8?GVYGC%MNVtp!Aa%a?*=ChIS\&jXcLN!V>GL=+ak*<GJ^%#A1^&%\5=EujMRP=
>al%=T d?d/uh/ch:$d=CIJQZ\$Y1Qdhap&5Pj1Y81kM?JDwkbLYdJhF%6C>cN=HBpX1kuMHKMylu*%dAhhZPMD
@YyTc4 /+V:D@1+QnwC4:^bcihLqB*T:twBVRKY!q/Dc&XubkK:n\A^QmT*6p>9!/9ipHC&ikLR/w$w51J!pX9c
B\aQyl LaR6#LyTIykWEX:YSY>Ic\5K\m$Q#nRF%uy6kPeW5Tp6HWwVt!pIl*B6VqldyI?cZE%wpaikwS\P:qWj
4nN=Db u<H^K\>B@9YlBmiHVSiKM:MjQm^5u%PyMt4baV1LbT=JHR/MCm4y1jb+bG=94G1?+^5R$CX1V@F^V*ul
Q*$b@K 8Rhc#=#8NGh=>EMtBq4kEpIVS@/V8KdlT$JLjHuuImHZ^kJh\h:X5<!H94GnAa/>keu%ES:k9uR&q&#B
/HqJjq HXj&#4cRq5I:FY?=l+?VQRG6GAH#4ELWcBXLV>=XhBq^wn6/KwDjBH/kXJi:E\:YQiY5W@Bah*=9JwE@
cWi&Ip 9ipI?WRDGEBNhjB=NByJ*bM9@DT$tQbY4W$ZIDW/u#F\LuuMm%N&&89l<W*um5um46+kh=dGGl%@AYYb
5y6^K9 5qbhyC5mBVeZtVIyV6MS?bu9L8nI!^uMyC9BMqYyXjkiN>N<lqA#w*wa9GF\E%RNqBRi\HB1c6?n86n#
m1\@NJ V65jd6#y8<pYQIBqiMTh#IC5ZhE&4hJ6F\XdFhLyiq1WZkZ4wB@/4>%Lckacd:h\dLYe@MkVAV1mM@:E
iA?<w+ M>C*9tki?qq+H*!pd?a\Ibjyw*H1KTdqcS/**>uFajC8*i4an6$DJ@@5tnK9Eh9ntp/e55Z/i8IHwFM*
ib$$uA X5Jw$96&I56^*!^8VPV8^>&qa&9H=?NeM+NImLYy6LJ8RqEiw9qH/FFJ*S9FWP%uFD1>yWdlbm@ma@9^
=V4Y=q jA+<V\kNHeh?bQlj6tD$$k*kd*jBSQF1#F>1ZtVTF#Z%PR+BeC/Yh4d/iC%FdPt?S?=?tNS!eDS5eQ#c
ucTPhX WE:h*WhE\t8YE44hZHRaQZqVWjI1Syuj&%KpTJnVPqEQnm8X9nBq%CA?9J4$:9cAV#/SG<p\#C5RG<&q
C?bqQK =M&e8%u+DB*>H\X8ah:@>!T5lj>4k%4+iZu=@1Qc@T<@k@/q&9&@!+V@WaAW@kjXX@k@VaH+$:kVad/@
hLQ&X: wj<$ipPa@&@wQ+$eESd+C=4@V$NDlGF@RjQ>cXCL5PBj$H@Y1+YF@kL@w%+6LQ^jy@@qHQD?%T5V?kMN
-Acmt4 000ef3249dc001202b4 Page 236 of binaries2.zip
FSclWu ?a>/6jBjDLARE949>G4Ij$=*@@6B@p>/NXV+j=q$6<9@Q/i:G@dbI<1cInnp9pC/c\&wkcYjn!w+\Db6
Rh9=9B nB#jI6/!m*P\Fn?9\9NXcAJk?K6S!wAIuWlB$/=Q?Ej!yJla8LHn%wR^MS1H?eGT8Ri<a$hy+n^THFG%
bBy$My 5HG#5XPcaqQi@&N89NPj1mRkK?1?*Pbje?M+6YZwamM#jjWAwpRAhVB^@m!BXJ:N*peqIu*M+i1b&^t?
T66MY! cpZQGWFNn6\qtMyWF\LK#W&JiC+%blmC\=PZyp18SD\jaq^%yHDQnWtC4VjaH/qpVDy/&Rpn^euQEmP9
PEiXFi AutGA$QRjTlJDVRSCHIAS//+\Yn##/!YlYhTZP:SDEY9@ZVm49P<?##MYH!YFu5BGqIWX>Q/%ZDQCWLN
maL&4e 1LTLN1:WZ:VD/$+#AyRkdXdX!J4/a:RHVD#F6P+y$>!\GmD?9GAcpNk*u^Red=d=8w4ThDETBjG??ABX
a\*/jH >Gae=nJL&!hG1V&w&q5GSCM/kKy?SRSedW8G#@6M!d%JiT8Kjtc9ia<?IXR/NBy5mLp#@%VR=#L*A5uh
#t<pR& wW>BaHN^JJ6X4!@$6RPj!D$bZN&?^ThR4@wPy^iARjpX:/B?QNIeCN*FFwX1FehduPl*9mT9<9F\yum6
*XaKR: /4JI!lkkdhY+4H:QH+\dwGXM8h&+qamykbEV\G*:ZKP=9?y5IZF<:bGnuuB6@i*kYAk6kT+qmDW8p$I^
*T/jP^ pZ/Y+whJWq8=ayDun8Da5!\nEW#$VuHBbWNJFt9FVh?!a/:WuQh#hWK*amJPjBIdLb?uu^b91>K^/cya
Ze5&5/ HLVTIS+Y%M&+HL$iTw^#TBiD+6>XB\<@&&N=NP%K!>YX?:^>!?qIN%@Fw>@*pP&K6Hb>PaTujE?Rp%VW
eq?<kl MM*EYnE1^PRbSiZc6A8QiW#Vc+p6mV1Ve\<8Nq??*9Wl9FShIX:y/X*/5=tK^#b>ajaB<eAl9eWNRwnm
ew*Sh& 9pFV4^n!Y6L$b!luXJ8+Xi:iC8/A=JlZJTYLZqPc8t9$%E@%A5DD=achnZFIFY>@KRaw!^a9G95nZ8&Y
/!#q!S $YXAkyddSQV8J<@hJ!bZq1Gnt6D!NDTcHAN*jAnA6H9Z?Cm&=^GH*Vl/e1k%VmV:M6i*Ltm1iT&qYZ8#
+61=lE Vtq8T^*$Xu?yw%eHL5!D$lI>@j?^>>>SWY*d8niMRBYy15lbEetbTlSB%CJuKHJGe5=JXFBmpZPRyJJ#
Rkd!y* #mImPie5AyJ#ElE^j/=>%#=u:dX$H?=b>&*ui>>&@!5c>c9=#DH:HGPPb@VbB!WZM/StwWqRqDk!j?>q
YPQ?^4 I9STY<yH&^*M5b8^NZWMLqHKI\b#RWu=8\NR#6*NNFGpLR@ba=p5w*l=ekt45SD&AS4#?LRYDZ>T@cqC
QucHtP 1wHMhRw9&W5N6&HWKhXTmdTbQMV8bMHB/1?KJS<:=tmw=qER5/C%\DJ/L!puM>WGh&=j#<PGFE>FBbB\
AB^N6^ /h\P!Sd5+1dau6Hm<aL4C=cFNIhF*Y9*nl>@ZQ/IFc%MFb\juy/k&Yd\YTqBWG515/F=#48BtWw49u1^
l886*m d>KP<HK^=w=E@6e6P9uN*VWX8PPiYN1E?SLnwl+C6nL\iBII*:Q*yDN8C<\h@cS=ijeE/naNVKj:%GT^
1S<91F G^ZqLtR*&1iaht$eeQ*&TMQnYacQuGqTQQbbG!p%H^eK<%tATV5TGCBdZ&mR8E!p$Ej+$JRCaqQ<RY%:
QauLcP CpuK*JiWk1:b%P\Re+*ukt4ZIkbAt5:tyZ8*dctQ:?1HQ/Ct#d8b\qEhiL<+tTR@Wq&n@LSFkMcSCkt%
@amdni nE\&cp<N/SbR?ynN4NFXEpRmw>=ApJLCH9XhV/Qy=cJD<SXt\H^LjN#L6FAV*G#<R&6MhH16Fj4MER@n
n5Duk% JKCI1m?AWcR<H@cjQb^pBSH8ZMJZkh5tV:db:Ict+\j4DtE65@ji+mkbtqpI<Km??NBl&bu4bJ@1VtJc
@6F@F! lD6=P+dTMPa?TcQCS=#Etqc%/NQty11PZS4N8@lE:<mjLW8EeL@j/WtFbawwM@XZ?4%NGyutRPm/EZXt
9I=4a! dAeS=iCKE=:6Q5t=?8BTCD@NiZyNVa1&hCp*wuqic###>YiQk/jeN<5mkW84yu4b\dDN\99J4$l\k?=G
<AJiS? =K%?PQ@GQKIn<kqAe/PSiVQqt@Ca+QR**1&EHuWt?#Bb<ZBpIa4PI<^#&ADB8*ZqKm+<LZG+GYCAJmFQ
InC^tN !Ke/RQiWDFnlD>+>eAm/</Fec%NB4LK<wL=^w>#kY9jtbd!R8miyBnKDSHE:F8ZQ!&XJ\iYLWXX=:l%%
6qQWDG nl1KFbESwXi?nciwX/#R%V&n+M/pJW+u5F55%9jkGIy/jeiFn^>ybyj\ti$Ba/eZLWp=6PLJ/Y5>\5b=
QXt5/e ?ZSnabYlnI<5yANEKuIuh9iT\VKpck4?I=%GF1tu5@nIAm?>BeQH#1u9R<WMc*bkQa!!yEHWM*$>m>Ay
BKnCZX TeGnl\\eXC>:Di$T<mwE$S1N@RYZqb/5C+8iYBIRQjkI!i>Rikk&Na1K#K14iuC$yT>l?VF!ZB#wQP#<
bj%8d6 \hWw\=KMJXXV?a*dAS6ny>$k9iH=@nQq%MKeJ\m>8EySiSdF%N8jH?DcW@W:q!/@$d&PjJC*kN558E*<
NdVNB$ @p\@5a#Z5=WFJb<m#691*4>C49F65IbXSW@m1%?tPMaKWEIj8m?GX%jYMtwT?iX/EbHH/Ie/5!:%jQ8D
hcnbR4 !1b8WYXS1yp+^LH8uYcB>?PA#yeFV&Kn**\&Xt6QeCEMZupJF4c:$5*GIhiYKa65/t%hl:F=>/StbKGh
S4W5LG R@w!daV$Diq4#Pm@SS:Q96y=e6huI&#!@A%4B8TRp1uybh1y$hEX6+CZeRZiD:6cT+9hA81k*%N>LA<\
J!ZmtM 9N!!i@\c$#pDLd$Q=9i/#NS\H9GtC/Kh9?V*jalyYdS:+8Y$PdiMuyPJYPZ*>ZDBQCAbIiZj>5qj>#Bh
y?wkIa 95e&5PT@@PdAP*an1hutIZ+i&m&c/ut$<4LDTL*TDCu#ek99!LIyiw=95&FdtJAA/5Zd5RAe$bK>KSH+
F*6aeW 1WNch6tlDqRe>tE@9edcPY&94wWbDVahAGW69*ERj:X%DucN+tjbIXT1m!%jt6=/pLaVX4@ZWZ>k*yDj
LDqI\G 88#p?W#FM*DQ:6JaXE1S\Bdpyy=C$YJIZlM=:5A^YZM^#R9X#p9hySRp@4PAmFh!t\LS>=:b$hT^9RSX
FnM4EW \=jDd*1:BKNH1HGGCuaKGX!^R?8148/CLTe>/G/ZmB%d$Neah#eH^*lHa9MaAVX?b<N>kT>PXF=<8+tX
kYwPM> hRhD615YVF&>NIjd@qpR>^VTL%@/Ci@I>>lJ4y=JT\d8G*lGId@%?AA1wd&qb&8F6Jj*!Zc4bbQ!eHQn
Xc\&Zc CK&Lq:YIHe6ZJ&BdjT+lCdLAp=YSL1BM$u9T$+uXhcZR#XA%L1*SS8cm949debc4kdpe>5Ck*i1lqGp=
:V>F!p =^Yuun4=#YE$&m>KXcwu^apR^J>j>IE9L$BP>1%h=lmd#9ndE@BdZ\@HL+9LQTN<Qb/Y5wtCHQyFKBAe
$Aj5Hp diK+P1#lLtQbEVlmH/VCTMytqCKuAZFJXRyn&dcW+?GZ%De>HP+bTB&j8/VRlRRRu$uCX^TtYVyc+:uu
c8=!Kc ?dI&FdE*l!^NqNS=LLimkBw>8ZkX%R+M*w/y\e6D!ql9ePB1qlXRjGhA%N?Yc=i18k5pH$MVV5lthHki
Ftp#4* \N#lEN#LXq:L=j/Rm<>&qA9Z*:&eLXTVX!NtWK+bZM6qR<k\ynF#N/wy!I=4u$Bn1B\ApJah5#pNepIX
@nM$tn %4yduBR5uqn&JCReVKy?m<bD1WFiFHkQ%ww=F\y#DV9diMR<ZbehQ?CppmaSiAjlhcC!CuVn//nSXF<n
Q<?>RA pWGdAW+M&ed^mD>lYdaqN=/Lh#eeXlXiC>t&5Q&P9!/LQdbk:*b&\=LF+%*FD@pG=p!J6ER4d==K5e>a
C=@iXT =M@i/L1=^Q9>y48S+l1V*d85d%djbEly=kqRMb6Muqn^N*pD+aB%Rud9?K:^Y>&uhX*:JpuA?CR^tW*e
1DZjj& 6Tpn<<F9+TjG9FY+4e+W4Z%1DHtL6JFujiSht\qY>J\$&+WK6AR5kBDFL?/YaNYI<&+@/pIm/ml!?jGk
+tnRK? t^^=c#$JZ*e*/LD:p?y=:4A9&\J5II:=#=PZi>ldH&=u^45:d*G?wD$$m1a5q&N&aTWYWwNljMj:%1a+
#iD+X& +t%&@dIPueFeVuq%Vy8STn5$$GKBiJhW8HZN8p&HX=tJ$4+QZM6YlT1%^:>HNdm4MMJckP$q^1Peh=ea
SqXaRm 5R4%qYGEeXwHc@bw<$KHib9=c\Hc<P%+bqiPmaH?LD8=\AEV\m>9<N<\n\:w^CVk+/VS:Cde+?mJ<<<D
$PFaKM qdcPK8d^5:#Sj!?6lBWI:BlqPtB&W/jw$Fm*L^+l\K8#kl>hn/DSJCMk+VC\Zt+CWKj++?Ry=+^I6VWB
JYP:w$ 8ARBZBGA$qtRm99#hbGY@1ep$?lce8bn58&=a?NL<uHq#5?q6%H%^=ZpyViDZC69^=Yq<ucCTyMCn\iM
=BjA%i !R=d6kXJkke6>nqBjHbW$K4k@S%XeHQL\Zc#c:B8&>A4yVSRwl8it+B!qRCAVTR%4tXll/b?4=/e=V8+
yu!D+% 4tL8AB8/Zt$b+455$FGZe6*G@VPDG5=TZM6#lceYVqp6@EtB!%%%+iH<wbJ#PIN&yHq/Pl&/k$u#u1:u
A:DaR? SG@WqHbZZJJiX^51>VV5Xci*8jt$W^yI>a4%b4&^&tLy/8H1XK9+>FdQ8aPhZmCbwWmk^>4dV1HME:%F
Q=C+#4 Hi@w^WpDWac5Et+lCdB^Td6>pYi>lh!G18!ZbdiDG1<yam+=w<&wmqZ$IF$CIaF?9C4\<kY#4y+uKu:p
hQSlHC HHT^jahH$XqcZXYT#K<ehj1pciMCI%YVH\Y9Y/L#FilMhCM?d+:whqL5E*pK^Kci>YV%95?L56Lk*<FK
Pin=n4 p!kR+<6CPVYICRZ9q*dj\V$Z<F>+NyF^d>%Wu$#cGL>C/aN@cqFZ8VY#aJtFN/iNejWC?yCti^9HubDY
C/tNZ9 FujZqnI8Npa6WLbIeCPeGa@Gu>mNIp>YiZ8>9iDtXM:ML9c=?lB/W>4$1!&?+^4FA*#>+MA*D\q<8$F*
aKjStT ?N9WthXwymaIh#q8BRcdBjeX1iA4ly\@GQC1WNP:6:L?<64iG^d+Dw5:#?:yS!aPC%dXX*eme@&uTK?8
*t9l*p eSVbt4?KcHwa*QFPLt1ti/FA:1Qth5w41!J55t\+N=>APB#8e!SNZeajT^!ph&ak>#FG<=6E+dq$Qc:Q
l%#Y8! K/A>5TQebp8Ke^>!*1D9EClaVA*YY\t#?l/NhTP$tp$RJNYRau8Fa?%9Da5y<VZSX+ub\W5ImdJa*wy6
DqcpkJ tGu5<bTq9>tm=J59PbQZ^<>d\&4MT*?>Y5E=Z6Z/dc9M<4^HbcRC5pjthGbkPYEM8d9iN:FBPpntw:il
Vcc#?e :F6l:j*A=!$61nw+Z199a%p**Z4y9l%NhWLdDyG4?XmAb*C<DiEu&m:X$Sjyec1GH>j:aq<+K89$9Hyn
+meSX= h%1L*a%uYH=#YR@%>8/hAJK4+yCKJG5Zj!5DdB1qCyb+VI^h%tQ*Nu4S9<A:yj8dGbBAJt9C=NEnSTjC
=ZE18# &^9qX\HjFJMInj61SuXcF<K@TkIMDwh^u^matpt@9E5Zy!P=H5CQc&4Nt=JEB&t?Dh:M#p?Ht^EK^DcN
Hh+JdB B!Xipla6IYV*p!LyW1HepRECd/MMNQGB*lc:%l8b^VT%<Bp1dPB5CS>8E$?b#<DuYN*Gt^9/^HK?^=VD
1tp=ZD FWqGZ\BnA4Q::R!HI*LLB1NTqb?m$@NV>R%/>Ab/nK$$N9cB+DFaBdhu6CCp<=:@MTAR6mpP?*D<F6Ll
:#@bhC F4/iI6Mac*$=@#1D<pn@HcBM:d$KtW<j4#W1QH=P=e>^T!1&LXJ5PRhWY%wbqK44yDLX=NbI&Dqpq8n=
-AH?tc 000d69db1a8001202b4 Page 237 of binaries2.zip
I*dCwa 6dC4cy*n=H$wC+5&YwqY##Pb^MP^*YZhJBCy?$#&Ji*EVai*D^WH9u^^<%JyHA=WFknetG45:k:i^/pp
AX@He8 Him6pQ^WpQZyZcdT^%!=>c1%?La9biGZDi>iQ>6J<tGW+A*4>1R9Pql@iy>PG9?4%Cbq4qlbHT8uDBX:
!SN!JX LpRqGR6!yFE$6RdCiPeN*?%IyKBNp5^N:*C&hZ<9?1J!1@Alt8R$#a/1+M/=X@&8QWPS#FcBaBF@D\n@
ZZ:MJk ZkF=pjWaiD=WKwwY*V^q<KPF1=i6Kecy1Rb46<kE/^Whh1*CL?hH:1d1!&+uyH/+&65@WIV^yDeeGMIe
9/5/=E j@J@!e=&Rl%%VF#q%jLptIC?y$t$JI*MmHA4A6@%X/uc9=9A@*@lbQ@Rk9^9P6q\/F?hdJnwlb%5&M@!
\*yPql 6u@I?a5j@L9EC?S6@@kt/mI$/qi$<AXwwX<iY?RmNAL^C%4$InRW>uMcB4$AnSV=FR&:AI%A@w1GZ+CG
R1ie%l w*=FI!=C@@La!A9R9*L\j?AZCdbji9C\m\Td$I@t?Vq>pYCDC@?K@qQG?Z?\@<dB@<<p<*<+?HDSu#n+
<B#ZQ? 5J>quA5Lmj#jnQQ@a^uulJNl5$CI9DN>9c1y\RaAImY?<a#jA:5ckweIG\Mj5n1ARm:lyC<C5nPMaMG+
/J/Yy> >&&=u%ZeH/8Hq:1cM?TB<Faai@?SeX:hb91#nQQ?AckI%XC6+:a#FTq4/mR@AI?8A\ZkQ>?ES%tW6ap1
M\eF6: HiB5m\jnWe%Mw1RIi$bES@!y/wCXBk6SuIKLPG*Ac@<wT=*y?1^9hHJ=4<cXlACHQ/1qkw4\G5:!CDbd
:uehp1 TtSc1WJJC^uq\cXPSZBJ8w>iPnhDk:=Bc:%njdJYT=P<n8L#DS%I5t@Viqh6uME5clnQttc!Z5b/DBHZ
4wlAMd wpmFXjHRJ*4Fh/AyakD&TpKB+$Ee$=BDJjPX?Y5!^m+lNMjt$$IyRqbiRqJi5c4B%L6KuqM/jwM14/ni
^+dtui &YGY*w>b/YmXA^yR1nR/^FRR%k1Anq=>>Gh*we=BFhW8+cdh%=J*Lq9e+I:LVKELSY\Z5Ym+6iS#AmuK
*6@uyY ?aatucL/:$jB9^+8aaYYNhbRVtHHW<Q6?Dj+N/i^Nuw&nRn@%$BXBHbW<%tWZEE>@ZNNE#6YX5%ai:Cl
</+RQ! DcFSb&wHwq=$#e#D<B4ctB\jF?^ZYL\mY^i6\^?&p:eVI%R\c=56//dnkKyVFN+%TJJ!d/^/Eq>:6CJ#
lJ&J*6 *@&Rcp?@SFhZV:$GKCB$!\Tj5n=4DiS:I:@a>qP=tc/H\a8u+6t+YhwyRPYK&:$ij1n^R5nnmui?IyQc
^%+BTZ tpNiw5NQdXR%*9kXN:%t+=n%LJ<&Y%^h/MQRtL!a/^A>!:dX=N<%QFA1Ah@uXjh$c!Ww6BW!DDJii%85
#>EQ#i y%q%:=BWC*yi4?&ZF$^=e\V/\iPq%ycSk\GkJQ>LZewuy1e?ZD/HB*tBQZPMm/</9j!=b=qDh\<Zmp5i
*4A\wE qK?Mqu:I^$68h499<m4>^48we^Q>T98w/h6mi8k!B1M4j119i81EHZi$h*48ndGJCe?8H<jkw@BJyhha
*BNKc9 cP<Sc!6hNkpa:m$9ekJuGFd:PCS^N*P$9FwF5byWVPe%a*jDyRk>\$8i+GPFP$/VQiJR&A%d>kb?anMK
#@qnS# \+ek9=ut$#k4in*mY#&mmqu?A<@tI&!FiL\ET=I\ybR5^jE<Z?<BVRji#%<1$8aqCulyyiH+SuFM@>wV
+e\EFE Gy:Ei!u4iDE/T9G1LRZ!aiQNlhwVV#A9C1+^#*b<NS#\85>AJFtRu=tTwBGl?W#V9NlK$TIeAyG9:5*u
&yy=B> bQ9!uFRhK>?ud%=w4h!aW91S1M<1c!R%\$NIIppE1J?I</kqL?*kE#?Rnm$1K<<ddph>Tc+&?cyY5!YK
\+e?M+ K>8eh!8bKny>R#qSY\AZb>>h&+Ji!YPj4mSy1pXC8W+I%kej56L:ywq:ytRYnABc#?K@IwR4LI@%%wRh
Du?<VT DpRFXZuLM:Q\&EcLMyEbtb4&Q^:ktuy:njHe5@LK^JlC\/9Z/Y6B!P#HAkc1Y&cbKGEFme<CaSMP8ipn
Mkc*$X SY@>i41*nlqZKV<>PlcANE+6uRjk&Q8<lhX%m1Bi4TA6hcmhW%/GlS$^c*Xmuci*eMP@e?<1dlVbPZ9W
\>S#K6 +Qy4L$c!<!j=>FDip&KK55B:A4R/Tm<R/XbSKNG$e^RV8c9wduJ@Y?8M@!GWWmNm6n#GtG>wFuebVVcb
^u<8Qw 1ZEQ^WM?N\5#K+69FyySX!5FPpc<64kV:E%nL<:l=qD&HJSCXH^HEW<n*DE@%FnkltwG51Fa?$XZlQY#
?SKVyW b?NRDaeK:bJuDm6NVa>CdJnj:WDP/p6cPlNiBV\tScY$t8BGcLZNBFRuP%h+T8khk1k5D^=:k<Qbu=iX
Z$4!<8 ncWdw5cjQhAd9PbutL\F*E#VAcIuaZuNyq1NH:8N<N61JiK4Vatn=p&d?wJH+Jb&k+@9q>&QJb!8Lu^y
b%GJW: udZG8<DI8BL<@Yu+A=a*Z+SCqlLP6B!K>aD:wmAB!bAiA4wXm:5!RT4p8d*eLk\MH=w!6#bqlKIyW6d&
Ec<PGt d\RFPPGl5D9EWFan^8wWHJ66FYG>nLpuqX=?4F:jd5!^qXp:P%w&W/aV/uNbN=puh:SE#n<!$yN#Pu!e
\?npqp *1T&PRA<H%W=1uX^d*y:?>1G=yNeW:m&/MRJLB%V^1n@bHB4i%T>YY#\W9C?^y&PV\Ab!%1J6Pw^y/^S
LR5@?F KWJ%1/18hYM!w14LiMyqbP?8SAE#KHa@ZLt&iKqA/h+VPu8lEXB%V*ND*hKZFi?mq:CJ*q=qh#yGPZe*
MAc%Tq #w#\Kc+pYQW\XiY^e%>:By/RjZqlBR@9SQViEqNYZeiYX<G6%\GV4paS+bXCHA9V<+?$SW*S\ZE=NM:Z
SIl!c< X$h/ye<MNN@C=IkBX++SPN:!e$lk&%#VV8JJA4G?mwL%=d%N4XLj&HMwitSW#a1G:dukVp%+S1/?LN5?
@1Ji+w \:RuyXwt@n:4=HJYH\NY:6T%!dcC!bjaQG/Nm#GKZqb=@:X*\GDpc8DcP*MdeHl61NI/GdD8bbbK%LKW
mM+@!u p5>e>6apklnWpn:\=uLH@Tjld5J!D^*teSqX+$MYSS<dtaZBl:i4uQDKTlP?KymYl&R&aRwXF$RX?Aj&
phliAW >>&CIqdLiYwLA@%ZlA$#XFGQNV5JkAnPGMZD5im=1bLpph/m:n8YZn8JNbt>w^/I&yc$=i9A#>Y*=9N:
dGF6Xl uEkLdXdt/n+u#DuX/k\$w:p&:C\u1y5?<M1?@9IY6B6$%KIp65E*G:IdRFD!uKqpupA&%V:w:4P/V:eY
KS*JQb Sjd/uc=q&5W><l9e&H<Lne8tGB6Y&\dPlV/1<&1ShmBXGHp5:P9:@4VnFViBn&ZdFVjlm4Y=/Qw&hFEH
cEHlk1 YD4bb1J@<\FKRLJ@m/JDWKenKKydNcJ@p/9ZchhbTntSjcC*B&+e8>8@$jE$NlyZ:iSX<cpMRb/iqHqj
!=<6<\ ti^>%Sw\Z>ZLa:Li6wtul\uKEQpi9lj+WLcPQ5^5Fj+A!Yt\a!V?GD8lLFqF$i+p/W%9QCb9y\hCM9ec
8iq/+a CaFF^XRmEW\Q&\!M8+6/AB19RAep@GXGVp>p&P9ewwj\RTBZVP9cllnIWVpCnX:5Fp5h4uIjc%1W$5cQ
+=hV1L 9Wb<ZE?M&TIc+@G%$yCJi\5bhlcF+bw9a/dY6CBPLP:ASYL?QCq%ApnXHpTtJWKhS%iyI!1YC#Eeq5^>
V:T9te buCa1w5=pbEbByiChN15#@mV$9Fe!PINedEed\aZam&tKqhVl*aZpQ&dmC^d:XAKaBESBCSIi>CCBb!n
M\@+Cn 1!PTN=6DeP!FD@LeLDXM^@*w5c6j%nW5!H%%e5MJNy8ZVG$%!<&BXy1Z4VRybaqw^/wpa^Vw^kP%8jCS
#qBn/Q c?VpkFl/&VNy<pac@J6FYjahWtEt<Rt/$KKZ\DWC1&&hN5i/?IIb8@Pudy?K1qFL69tZ8^T:!i9$*Jyp
MTC</A aC*Ak5jMQi#$Gu^V<b%paWuh%VjI&WY9YBkbuelh1jaZCVH%S>8@K8Kp!T8K=S8p&dI&eKX/yVR%8/GQ
mnYuL5 H+SP/5W=%9CZL6eV/jbMGa/#%nCNClH4J4Pipeh*mQChq>qi5Mh6m=kI+T?4mF:EQ&pC%&V\=uGDc!Jt
d6G*lF XM1cHdYKEl:ScBR+^\8e8\4!5Vy\n6^E<bcJnDPa^InNH$X#1>@tYydAK\pZeB>/Q9cit:?aN6\<wcd9
!MGRNR YKP%PekEMT\DhZ<tTBd%hiAYET?P\kch6$9d<@G=e!:CBT9VY4YyWRi8b9Vtb#RG5n<jwibw%He=IR5N
4E6<B: 46RYPuJ*hH\l:QARhdJ61H\<LFn#kj@!Pcu:KIu+Y4:a<<m?F#bmWb4*>4cHB5iYmq^Q\9DZ&*t&*?id
<k%>le R4dPc=T**&6GwSKdu\9PD\uANVS9^yJ:*w=d#i6?h%PY@ccVFYGbmJDMVTV:y4bCt!:#Atnd&9Sk$**a
1%H8@Z ZAy>apJIqh4h$\84M>pwTEd5j\i<8:ZJkuXJ$FHDLdNt?6d>!dn&eFyt\GR+ZZ?wYFDKFlV++$DjyTjN
*Yjb%# n:Zw#Jqu5Na$?nLBh?Q$WEqE6=#DPTLuH/5mcNaLd8&m9X%P6INESLw\k$Z?aQd>:PW?a+&JF*Lj\FNF
E\KR+y n!Ka>Na5JJ%pFAZc9JTbS@4%5wB5FtPC!n&P:5eWB6ZwtZ+h:YmYbCnLYpYpkwXpb&T*Cl8uk1IBGQpM
uPnM=: Db+EJBE/ISPXN/!%pV$8W#YGhWPk=bPA#khk#&4qMdFi1YAubQyWYABNWnC5ZPnG#l6c6LV8%L+hFWi%
imt&<N @Lh5^\hK6yeqp^YNehBKy&X4dilD6nbReb8Jj>jl%ET9VM5bWpAQB\%/H$V4E1NHjDp#qF*QpqM@&TAK
jYIFS9 b?SkdPc&pP&/6n+/>==tRb*\1a:YeJJWjhFW&Ab++!SLT*/t@JF!@:cPW=<!>dm?ua/T=?bdDj8aV9lp
\4?d$M L%<H$Ae%JPbSu\LKRmNCT4+tQ#K55%D:eZ?S=@qB4@D#pB8G&G:H6@lwd#b:CcyNCFTEnQkMQnniYZ>c
p8EK<y 4:4&nliT4NP44GIS^bVN1m:A8d?L+nS+*?B?/1k:Hc8NW1I<w#ei!>w8\ZdC\FadD!dAZ*L=?T1haDj/
S?ZC:h #mdnQYZBq5bT41?$XN&w*X??A^YVjIMwjJYb1iqM\N>DbW$4?Y=:RyBk<#D\5en\1cSkE>c$CWA>q?w>
S<%eLm ppG<+5D:AG6/aK<&1!La/EnK/1lWAB#Fn&DGTJSdp9l4Kp<QLRX=WhZqW$yFRb#mdEiti5m@p5ydk%JP
FS^TR% F\hb6Ml98#5?hC=nqEtJiKh+anq\98Z8C9N*I4Ipk?D*=dkRC%iL:ZA<ND/5%Vqe>@YCPy+Tb5=/b%R$
y+kMIM C=Fp/u\\j>C*5He<=K6/i9IlZAW:1m56d/5b:>=w8#*X1Z4&LT$tWqm\TRbk1kwb>cYPe:N?jH8tTtSp
iNFye> Y$X>+wnH+NBj\8j\6Q#D<F&\9JELuhS+Si4aaa*1>uEqQeLnqSc649!5ped!<P&i8GQ?CEl>V!y6B>b$
E!?@Md $AbQd^wTcj/?W8@M^mJQKRA=dE#nm9Yp%a/T<mkQNKb^%l&P=!&j%a=kXG=V4hEVhjCtNnknN^KK!aGI
&Y6aAd >@JmP86:VjIW?TP@t/aaGkW4&XC@%8*P$=&iB*9n6%mQ=GnPcy/qdyX&6Q1Q+<ipKLt6#5W>1Am!*S$t
\<N\k? hi+@N&uC/yFhA^IdkJaZI?WP*Ht@S\$^+9EYEtKa8^!jTn1G9h!9/h<pt<MM>S?:>8@#^%t&PimE#cAq
q@j<VL \qSD<baui8e<Va+l:jK!aJEFyE@HTdG=>dGd#6%4$YPZ>&#!pH1LlBGD\Dl>j:&mLc!?@D4=*hG4qkXD
%yiB!5 htPZC\=V9kn#?6PYPZ:IZHI8hX:Pp8#YICc$*w>$aAnL&&e*hG?ei%6J:$hdHcQc6eNqw=ZHdheVq$w\
-Ac1^1 0001a68daeb001202b4 Page 238 of binaries2.zip
@ww<Ln ?#DIEl?u:Dl4WGPuMTP6VE4l<l/i8aYDP/lE+DH8tG#kuP\I/JcqD$cADB<IZAq1pM?L+SbkkZbq*Nk!
JBu9h4 n&Zq!LMTEA*NR*WckVj8GW?ZbGN$WpkPQenb4eJXiIAq/RCndKpH16Je+PXSZeC&k=&M\<ae!8y/:n&q
Gb$%EZ ZByZ#d68ie=clF&jbHQ+Nn1&N\HEtFYWZaZD$=DLAnGi5Icp!6J6VXddbA?N&$lPp9#4GwjhD/6!bTtV
L$BF*i VE+>NIP$JcpanalpWiHj541p\ZGWD5BmmTGBBDhjJQM4SeCJKlY>BJ6TK8@*%Mki<NkXQyuDy*c<yZX!
>Auq&1 e4My&=c6&8q^/SG?89MhPl#Fe1MujpK8^qSR4jtQyWDYY^9J%c#1hNRpJy5cqmQ*4Q4+CiqtjBWdejpH
8BJYMJ JiYja\aMRAlY^h+jW#!tKJewN\<Bp&$Y<Q:!YBRnLpii#$b\4=#m@V:L1M*l1:*=S1Mcn594WjdiWn%6
eYwhCu ljahcTGDhRYbIC/<9NAVq<Il6/KPpw^I^au#+dccmG=H=#kYbVuGbBZl=GVy4a?**R5:ZMJpNc$#*/db
A%Dy=: w@T#$&Y?\5>/nP=pH8tGy4:!*BP8\LwR:$:\9QZjM/WTKKIN>Z%$J/$+JA4\YJj5cpaaVmF6wdn#TZMu
B@8*QD 8tXZL?qnetZFTecnGFXcG=iQ$j/C>Lt#S<c9G68Fd6TKELe!kK!Bw+*!ew*=95@\nP/4*LtLHTudEG41
Gu@yBL Zww!ZTwVXNahy*9V?a5p<6>h/@?yKmp@D9>j=w$nwRn+V>^&BP!9dn5CitG*@Zi#:<<&I9\u*m$eh4HK
qm5$Ey *D??mdkI@T9QGw/<AC$E@aZdDli/AI&ECj?CSq&Al1PEjpELZ+D?6i5MF:tI>F?=#uDSQ#8@eNl@:j#C
Jt/=+B @ym:@j6C$d@?LkL/5>^6lMn@S*K*G*lbnHpw59H%+*mIlE5Ce$/!eibe8PQp<^J5F!wMmB>jNmNnqR@p
HLn1DC y+8&p<PV@+KXW+/P>BwLdQJjNItiC8t<XpaDId+5X:lt%6c4^<\RLT1qAKw^J8RcR6R1LlB:EPcw:V=+
qm%LM8 4HPm%9\EVICm!EhVM/&Qmj4PF>/51MTT=nRDd8$PDqWHKHFq%REh>McR$XEaND?a%Z/>9tN\h/aJ8%h!
p5y:bW TCZFi+!BlpC*F:4B:Vl91ADZ\nBp^CDmmjy&^$+pkCPk^Qqhuj!un8Je<D!R5Zq+<HIW=%FJVnaZQ*EX
iN5+qb Zc>pHkE8hw?mn+w+*6cXCk\m5?+8*/8!yFP?JHu!AwBkiW$8M8:ATV$WqM6PwNTPu1RbjC6m*l@%%4GQ
%E/5Mq VNWM9T$<Sp/&JTw6=dQeKQPY&RwTDFIW81=Ga9u<Skmi:&q@Bc<j1YT=I%>D\%DT@k%a>^yWk:=:5M1k
GQV1Ga N@1+HpMGkpawTGCEwB9Zb$:u%G>mEX@J^jnlu>b$bE+V*qAw4iY4aKT>*qHRDH4::=kw4VuF$8LnQXa^
:?^EhJ t/Xp4/LTueH@S6W#aVC^WiWiFqdKi!tJqDj/9ja%ybw:DG#CMi@jN+8QDq1%c$4^Gw*R1#l<EcACPTd%
VLbN!h G!16QYDWAn6T#NDAhba::jly!wjlZYi<6JaRKZC:&:yR/$&!&%R=p:St5Ai$%F%T#YP>d?cMcS1uJNDh
ui\5LH FCF$Ih!G1*jEpXVtDcBBj#5JuF=n5%qI1PDT@BQ/w9XyqAZc>u^lkWyjQ*pCRB!k$XJY/y/<ZFq$WpjS
WtKaaF \E@mi\TJiu9npcmIBH4*Pd>T+HqnMGYeBj@k<>a%&Sk<@$E=:VL1b?%Kdmd9W6VntR$Fa^a<cD&iyb%5
8%uQ$F YMCXjRcVK6I>Di1u&/PMt6/%%Gh$XmDa&Y?6L>!\m*wqW5<NmiwW%86>j<Nw$q$>w@hT*^$*QIDG8btu
+<=e\u RY<\49ViZQi=<?hbu$^<SQ=>QL$BMti9Zp=QBJj5aG*LGEMXHS6LHqqNqLkcdi5>K5l^:&DXpaQ8yn46
>SVJi^ mjuMmlQWZy&@eGLCtF#5C1lEEThuau5>/l/>REk*4RnL>mMqSWQXHYj<$tQ$Hw&?8%S*jtlk1lBSFm/V
Gid=PP ItE4wYVldqle8F$\?<=dMVbDpuljGmW5EZ@SG5iAVpuA\&N%&VSYnp+JP<>RYc4YuG*jMYXLnJInLt%K
nlAFHV jWH=<t6VtcJuWj^!u\^YHE=DwYJZZlai#n*q6ZV5ZcnMTJpKwI%R<D5?=BN#u!PpM4kTHqj?NL@i$YB/
P=XXkL ^eHe6wp&qbYVTX6MII+=/#4ZipN6Pk/#iXp+BBid&5kt!SbH@p1Z>9mINje=Tb\:Y*iQHW>iWlBJRw&@
@4lTq& 1N\bFn8Qc&+aNcLQet:?AbRWt%A#9WW:bbJ!i@YS$wuAJbdniV4Lb5EkauMMkS%Qw*bpW>ySQGP4#:L8
um5!e9 BK5#Z$&#alqlJ4GTWaYMKyd<$Z56$P!R6^YH1w1+dNklt>FBy91b^5kY?8mchCRpWq>Tty*u<R44kAp/
ThP<F* S!BNKK5pM$w+yew9m\Bd^Yky9bCAtLA5^?uq6#Jc^tn\*&D@&BLbtaEMSN#I/!8i!6jJLFbH5kl&A#<^
PL>c&I VttmW^Y6Gei=Nia&c>RWBI6^!B5Zpn6#nAXmbkIC<jqAtN$Y=VmGQKttyEQ1uIdke8=?>nMuVcQ5WFM8
aTD15+ /&TcitAh6d8lX:mnmF#Nhq+B+!WHZnT$HGhLI@p#Y9w>TE!+#lD*maeFF@6y=cP%:ih4y6DwjqYS+T\M
iF!DCy leHukAJQh!qpYCQE$ek:6ZyXL!Y5ZbR#4@F8ancbWDiqKLjXE*:QGw#mVmVLntXp$pc&QL@QjpP!jmJt
#QC:uy JWTjbahM8klQMdhmuYa1>WB8c#4@4tik#QnuP?wk*@5?qAyb?1Ll+Eu:Slu*+h^ci\LQ\SIH:NRTe4c&
nNp?b1 4CXk+NB^8T%D>ySay\#lw$upBSi%JV6?A>nNc5>4=a/WDq9!E\n&Rna%bm#TSP4hdX*Jy&wQNRn6hLY$
i*qW?B :5/HQLJX9Y%<L:XXq4<qJ&NQVN*D/?Y=/uMhV6KRh1pS##I?b8\t#t$q9<uRnRFGWSRn1c55u<!=RMH!
*HVl\i ?pH\$b:@!?*HeFMPGu4wauR9X+8\yhkXwHd*YZy58qDicc+b:?+:y%$\?w%ZP*\S6/>SREl@I@I+h+tX
%+u1k> ^jHcIp!AuieKY+DL:ipZm6Z9jj9VD1&WG^jVcSw$Hp*u1t11?LuChTKtW46q#B!@*bAMcjidQuENmjlw
hZW+$S W:=B%<=Z//wT^i>1Y*1WVZ>qTqy^YlF:iePS=L+blt1Nw&jii*/j<mDGLBkGQN:N8i\ucY6ZDNTall#!
FkYA5/ GmJqBwyiatu9C:n$YN6yl!1\:N^d=yP?DBBIF54bLVpy*&QN4::&Xj^GSq%RBy&4Qiyb#8pIcA?:PJ<$
k$jiBh EdA9?^E*&XB*Z1\hRb9VcaAmD4!@T*Cn&iB%YV!L=i9uuaD<F!PDGaj:?1@91Qipi#C/Q!k!$YFE\R9\
n4MD$q M9dK8EcW^FEX1J8DNp9lV??b&YByLPR>Q1*yb@VL&nMjN8&C\$Gm*<M/b+IJGT4eRZ#9:jIdH/6dZ*K^
m?I/y> K4$=!?5upXj!44MlY8b^LWhMYRM%$^$nC==6qH@6mbG>H>XuLn!mY4ZZQueK*HWY=@J=EahVqSX<EY6F
IJD*t< IYcT=^@MH9tqZ#>JhuHu$L&hII/5Z*BiD:XVqkE1/dbMeNCbKiXZTd>/\4nNAGLeN8yNR$#aLFwc\/e&
6>kZ:N *DW1%A*QF>%pC\&cQQKWmw:hc!?ZEBkt<BA$/>J1*+m@Tm/RbC=@NqlX^&NBulpdtFn1Y:Sqc*t8=QG$
QqEL^# L*85>@YqP\Db>@9$8tN&6>@IFqa^h#!X8=H\FtX=dCw$uckL>p4XinKLV&$MGcybw4@#:b&$#qdYqMHK
ZA*pZW &bMG5EZ#/LCGhZLV/b4Kk>i4jpWM4*h+A@&P9Tci*&=Dk>T/Twi@Re1h5/^mItXN<p6cu\=kjY#kpRM>
cVE5T> WjdA#^*L=dEVGQV8N@cSTnVc&KG6SRt*!kt#8:&b=FAFWhQ:MG^@EMJTH>Z/TNd@8M6E*bHP$uIyl&5@
?ay^@Z dduHwh9b5JktB?mjQMB#DF#&pYF8hKk/CJ@ZhZX@Xtqhi1kcM#LZcMeDMYeuCG=NJ9Gb4^^+d5X\E6#/
p^4c1M 8NV:mK@9p!w8>uB8L=LlZDuXD^>@tnStJeSHLV4qeX@t18CW9@p1:NBbdej@e?qXWy6Q5M$YYehY@l%u
EZ6K<d qVY&HVuF5@*nk>GFBmpAtVY&&\&E!YW!5K@V^Q>MceEBmX*N/8>d1hy?<Scp*4H$R9c$y8wW\M4Wtued
h=jIXk a4*MD?Mt::yNtW5D&@qAVin8EpSENG/4VmBB!ZcLEwC9<baq&Eu!JT<*YSBdmPJVGm^Pq=N<m@XEIZd5
Fj&SC: BTip&c4EZ%:XPZD>nR^hiWm#pq!Ce!:kWkuRy?jWB<1D+T^L\i?@$l9Z!H*5Wd%99%X^F&ek5p^&$wbC
Ej?t>w pp&MqLQDM&LXVAZqCl8?Mpb$iZ#8Z1l%qFPDL&jD*YldF</+dZ6eCEFtmCtccJDJZR+HXHK=Ya/W1eA@
YQt9Q& uHT>h9QhqdG=Za#pdk#XKZAJ9AZZJ9KikAbZH=1GpKui\WiA8L8BWjb*eJdi6@WeDT44BPwqRI6&N9&Q
AJh\Ju iHXKmjZ^D%6mCn/qXnlu6XX<6Z9Q9T/YYnHNA#WtGH^RjVlIGKhJYLF/5I6M/&hJH1^16L@F9qQY5q+T
+C>mDS 9VW#IDqk5#4Sue@^My@DmmNKYmMhK$9uLt>dHM<H6GDK\6$tXVj1CPE\MLZ&ny?p5dZ%*wcphNF=+t::
t545@j 6%p:T>?5:$8a^:EMSwm=ENyB=ZDcHh9e?+Bhi\e\KR=6nY?NmaL\iE&lQ6pljEt4eSZabQBu+phkc=w>
NIZH1K cV45JQaiycXuLb>!w8QSq1i$aG5Ek6BZW^kFLpXWmnJWTc=\LK%WJDZK6t1N&Hj^bP$Kl9G8NjtX+mme
RADh$^ YKa9t\w1kRm=>kj/?^K4hRVCI\/mcKKI:A?/YuP!RkEVHqh5ui5JMYt<hC5>$9mW^!/qTi@pnnW1!b+1
LHD=l1 >PWW&=cR\w@G$Tq%I4dH!6nn5PTSE:8JtehXE/jY5WSpa=q^KjGty*y4uDKIX*mq4ea=4qY+A/eX?\hH
mY@9!n Ypq^Je%p8cA65SP!Xpm+A&EI=G$*At%9I&$yjSD*pLk1tSD@P1>#qLS$nd>u$4MnN%F+6QVauk#FIBEE
cinK:% j4lJL%?J\l:eAQX*^E#cnqLMRNl8EadV<499S:5j<$d&Cpc?SbV\CYlY\ml4laI+LG9lYJ=/=D6&SK&9
Tk4@8X kcMZk865t?WV*P/StPTG81$MuLIP:tEL6:6uGE!VEJaDpaiJJD+BWISyVw4+i>S18h$VWCEl/#nHlq?D
\?bpu* WZQV<JquCXEL4+8B*?XT8+HCTXqlAKMlRLcaX$yyFdt\F*w+XECNF/6PiXhQ8$dFT<yR/F=NI4q&%wci
96PEde pJ%cSTGGe8jtTBXjucLMqG4MqMd+/FTYK%MKmWEN9KcbYJ<\$n5epB:9@PWh%Iyu=$kyb&cji@=a&V1N
*BN+h& +m=*+Ytt%qS!BC>ZNLFAJD!tu!dJuP&wNF5Y*\l!&6S/$1#lIu%5QyE%imSPMM6\kFEpAVpQ&LETRN\m
i:V^@I #&S/eAR*9%<?AVQPkA1mG/?EEu6+P\BNB>t$nbpqq$&*?&%kA!/euXew4%9H#%YMWh^=c<*@>168%@W4
1K!eTl weybHPhTN9c9da46ak>6#?:c9i&+L/l=icdwhP5q8\bjmDaMGZ/eN/b>%ea$$@yEY%dIcMLCGL<aw^ZA
EIIFqt D:+8:*ti=D!VtWRZ9Qu=>5!MS#HQw&wbyS:utInJ&?#QFEt1nVe@!\HAEt#GJ5Y:*wej?KNPMMma$wq&
GtP1e\ @ykPX+G9yw>p9%PMuB:Bp\kA6+wHkhP?LyX\k^uFQC4LZB%1q//uX5pVmq!dmb9?hwHj%ApIba1pHP!S
-ASY&b 000c64a6589001202b4 Page 239 of binaries2.zip
W=P6DN QCH8=bnAm9*\i\AEFWBHP>>uEbnEZ$M&$uZVP4kBe6S+@\n=TqM%MN4PM+hN+$QP+@EWRM=Me/</^b$y
<Pb8Bw XdYB#5plDjil+9\A*^AP/Wh=Yl!6!kyt9n#I#c$5+pj4@9nj%JR%euW#Z+Ia:+cYLEWkwjqRubG*Q5GZ
?^EI%^ jGb$1uyqjRyNjd^j58k??Z^5aChZjCY$twuL?@N&yc>*ya$e4:&Q46N^ByN4u86Yy$6wwnPwNdDlBMQe
S:&a$K BADbPjh&deuR&\:j9n^B>hw8JhDFi5Mu$IYX?HFKuAFhB4dBkl#!^IDPJe46jRAiJ$6DmDXN$:6!SX:i
MaXJP! kh$5?&qF@?4TX^n:J/%D69NFPq*pA=4EPEBF<d=CCI\DBBDt<eXb/LBl/%eSym9Cn#9ZeIF4PT6>A@8n
QAyaJQ \XFc?^+c<:c=<h5QZLX9AJ>J&#LQ>bu&jj@A$:WLVk4#Fm\#eAZkkq?yhnl</*qqjEQV*aD!4e\YqqSW
R%DQln LY:ItHPRAbI%b&BqniHWYCV=<qI$Ge<bHAPX8Spuj<4>4WayY$DiPjeD&/MQ9HjYZ%5i>NN14YdbJbm8
F54q?w 549i5ZP6tZwY4ytmq*w$9bRF4c8hE8V9tPZaTu9CciCK#IDpp<1PpV<h>*JV81%EbcYpTBk&%R^:q<^L
X?GdZ1 lH?HK1qwMKJ/%@ydk^ccduPcbN#a58uqMhQLWEjR^*S@Mpdp91949tQ495uL8+@y:T+JVnKB$+AhR6LB
pt!mm+ !n5B4QkcBI&B#@y/l4C6H#Xeq$eVWSq^?5*k6pql!15J=/e?\j*=u:AV&Nc&<e\Rc<pQIM=aMY!Hqe<<
/l>E*u JY:u@uq%/jjC>$diR$T*qGb/DEy#HRDk>^NXw&SS<Xc$JP:hLtyW9GEPd%*XMIjR1uiSbPeV<N5*c9ek
BEqCa+ #EXXJKQBEb<F8Vc*SM&Bh#Nji*!E!kh?<Wl^J4DFJ$/6&a!F!bh>6Tw#8!<Rtp\kwSwnwH#D<nWZSqyd
P\lQW+ tLl1k%Pkea^CK<!n#tCmH>T\1K6w\Hn@VqaaXQPTZ\nW<946Jq:G&wN=Fbwlb9N%tVd*SYc*btaM<H=b
T4MG!> iWc=9t%!a*%edK>RLdHlM$Q:@FI!T*TESBDuC/+ZL<KC<PJ8!GZR6NnM:&a=6lS6wZiLAd$NDiPeEW+=
SeE@&6 Z\C<YwWm@KdSdYBm6&j>WEZD+FMB\hL=CVbX&Fcb*86QAye=jDW/:%NR#jMYcPCdT!%uFjWmXXiZRP9Q
/uTTuK 5\=!DEDkDud%QK<E\^A6cTP/l:cuLmFSkyGG>\uaNAlw:MW>NXL:?Dh^Sm<L8M@&$<@8/^=5XhCZ?Lud
RWluR\ <nY\#JGq86R=<EXW:a5JQu:Yh$n@y6>#+S:pT=%+Qh>l9&6^@?D:@RpyJpB1&%NFc+N=9F9>#EiZSSZu
EMa?qC Kb:X%VV5>FX!VTACj=ZEnaD>n#4JCQnQuYTQH*<y&Xq/@NFY@QF6^P<jpKK@j$BBj@<k<4<PkIVBlH:@
?VmkA: kQ#>!:B@XmlG\pV@q*IpRkV%V!NbWM4F/<iy\cB@!BTHmk4@#FyE@DhNd/VIZ$%9yQCFVY<p/1itN?Iu
V=6d<X ^9Q9:ZPBFHPE$EZwZ/YaI%AZwZ>qtTPEL$AnSZ>limNELpIL@+wY9RCNRQ!CSpI9R9@K4pjCLpDDpd>w
/P*n?t e!V<A9T9:Zwp+kK+EQRZyXcR!L>FZ!VaEMlj$ck@L^WkEQ@%W5E@<<L@5XRk>LQ:GTu<p/WCwS>u?u?V
TXHRN+ ^Q?QJwt4@n?RJM:1GJ\=\B@XSDWWq68&QNIAI\/pkykySapN^q@tiCXC!Z6jMBnQ5X<\PyF4t/1?W$qn
KTK\5d DXCdyT:e\Jw/IC4mt9qJQMamc\A%JPCSBiC@XD4V!Ew$?EG?/qKae&uBTyZNn#EaeZw86y<^#Z%J:S$n
Hk/K?S u8JRZ#cJbKA@?uy:8#StVBtccpW^&B:6@JwAVDk!mYKXZ>RQ\VPhE^?:qtkES:q@hVAYAtNGlQZL\@y9
?D=mZ^ /QN:m6Nk5&W<nEPE6mZMDSF+twan\%w#lTHWu&?a#&hL9*NYe>\#l5:VSnwSah>!bX&4G+Gm^Sc>D>Lk
hLY/Wq d##4FMXj9%8<T>ER^D\b@Ka^4Ne%lQK^E<Yk?&iSWeM/>yG^%XN1!>h#=c4ZbG=lj55bS:wY5Tm/M:!/
XKh:<: ^B$uZpEFen?&<4Kmt*p\9#Y56Ww#t?%lT$apwBV6%BGAe:J1YE%we/@n*w5BWbWhLuYld6%*maah:TtX
a%&dHk SAc$9J=#&!wamhl>5h4deTlXqijI&upek#eN/bpe$:dNQT?CX<qi9NBDDEjN641?quH^S\#n/Bjdy^^4
:Y!D\@ q8+%9@nAJh*k/FK=Re@@15Nqcp+>=6$ycy@K+E8WWyF1&eH>*NtY><<N68<\JyweQ&:Ryd<ptcZXZq$F
5!j$^q KlmaFudKeJ/QPuki*ACV5:EIy4t99TQX&LB*D=DawmTM%h&:u*9*D81:l<M5@>9TYZ=NjcLZL@tpKw&h
?%?D/J :k!RkW^t5=8^15JXDE8%Ij1!\eKe1JdQy8RXb1F5$\Tcnm=#Z@AiPJ6PC5:PuM*5LW4c&8P$YXh<NGq#
X$uTZH >PhZ^Ei9JVlK+H+Z=jm/j%Nau*n^W/TQGlpht+:4\!XJRknSq/q/L@8Zt1!#By9?<M/#c#m9*$p>eMMl
V+Pha6 R%6>i9Swt^t$M#eZcm&:Fe?uCmCVZ8Q!8hi^GkTJZQaZaT#<>DG4?9H6ml#?\EhQcV6B51BC!KYRZn+T
BkJI54 *b$GQ/mA8C#uJL&E5p*aPAPK9t?yb\*YE/M?Qqe+N^Y8&@E%Iu1IL4%wLqMqTp@E5Z1=BSquwSEqDI@\
*WHS*q Y5hmFl=F+^pdb?h\yKiWDLDEiaZXQH9HkNNE4ALq56N\LcBjj\IG*Wet4m>1$I9KB$JMaTIDXeM*h8n5
B=lScQ !VIn+9kZ*:d&cGZPtnId:HP>c4iceEn?p8\J98jeej+b$bq#LaQdYd!QFte*IL$SbDblW!@c>YY&PA5%
GTwGwp 58qWPiuyEJSudTT^MCK$$#1A!h6I&=t*4W+4CLeXM<6AM6qZ6&t<%I!k!6KW6FJFXcK8S6MCL1%5aZb1
P<B/wY RyQ*h??8NNlp$9W!1:mcJd4ktmS:Q^lT58!ASilu=ENhaK>i$\IXq:\a/l1P&MDTeS#qu5<>4C86=%el
%=hB#w H1<Mm@V^PQR/n*TYt<n\%#VCiA#<m^RZF5W:NdDS<MZm8uR1uWi1Qb##neZLPd\5Kd8k?YcHVE*#lpd=
1R9A9< IX9iTih!q^l@Ziw>PYMu9YJ1<G^k&tqawZy%1bwjlVy:ED<j<aGqm$:j#Q6:9X9WDnXD%9Xa5Y<>Dw@X
qbe$Q9 5Y\5>Q*941ly<?DDn6k@QD6H:#?XTu*wppJTwZjn!lb=YQC^YYJ<<hARK#+wTlX?1Zy8!SbQ^c6y%Q#N
Gq<nn+ T>hb\/e<jY/$DIHybHNjP=Wat1+XpL?MM@lc#NPBCuke$Ea:WD?#y^lpt<VZIM\*G%T!wWPLu8V%mmLE
=tHDM^ $:BTPj+p8MT^mG<ZZl#SCQ/<:HA+E^<FV=\/TGNtX^/hKCF</8a=l&l:I/KKYDMt>:$l/4%H#NFiWWj&
*4F=EB EDLPP$/Mq:AVPt5T5:4lFldQ+&^BbS%d\J+LwN=>$NupLK>tS^*lh6*D=Ml4AZ9bhW?Z!94&M#RXMK<@
9=5HQi #m+Ea1yQQ<kl65K5S%/LR5aL=nhZPh1V>&TJ56L#::6K%*m\DmTNEmH$HJQc5+R:?R:jGhtI9*VCt#WX
YEhuW# Gy9puciZp:1jMTAGV1m@I$M=nEn*KyKMMYhMiy:?Vm/*@GQqdW=SauYPl<y6A/MLii4$m>I$?u#B/<MY
ylA*cP N\BZA/$:\GPm&::ViWaWm%PjF1a^Qc5DbTPqE=Xy6Ryk%%thda5^KJF#1P#!1RGq\YV/e@Q>/NSWqPHN
J>4cw& GelDqe6PHK@4@D=+EldIPe\<F1$4!Lu6I/q1MH?HT?P^%Km%>TP:>BFm#qyuXPIleG:*S6NMCFZp8%A@
I:AypQ phpZCA+q*KX!B=H1KkqyjY$iK!R185%/L&qaYS&XyFn9jI?*uW6t?*d^lptBnJ*wuW$bIa=m!R#SXj6b
mB#PBe Ra+*:#=Eb8l!**mqC:>6c#jV#*<$aMQ*L99n^I\b+l8ItwpGdy>#lWNV^C&NplHMq:I#KB6dLWGkyXRY
FnIFA: k@9Gt699/QT=D!CdkcdLMaa1+jwBEGe@951&IQcV>C%8=9!p1ST#pXdcWeY+wSAFy5*yPG9RFP^B#knn
XRq:&6 4eV\4F%l?88<!m#*1N!FYQyP#:pqkjunZ>4aB4^au?KtFyu%HDh\*<^mn$FpC>+T!mqNCbwI1=X\5%RH
<*KhNS Zb8Ik*91Zk?RtZWRu$%/u:u/qiZL?Xt=!+I1yuQW#@h&69Jb/G!?!+ENQ#WpYF:+$/H#58nI6\<Fp>9h
J?CyNa ^:$Dh+bhdqiWSpH#B^\aLt>A#Ecmh&LNu#&!bNA=iLtlISDPcXcaL&RYin#$+eT:en@Z=h8/kH%!@6^V
KkPD9K CNQTL5@:Ee\HA5?ymM69=IG9T\:LRwnVqnhZ$jQb!nZ#I!KdqWcdmuAyXZ!HWcPuEA&@#aw#i/c5uiQ*
QPutWn 45D9bVZka&Cj\4!6@c+*G>jcwa=$91t6A:yCWZ1dhH?RQ@NdBZK^Ipy4#%T4!*uJn15#QA@IX/Y$*AHc
41@+k& 5XdBCpkG6>TwnKC5<WE>FJ@JmwubFFhK+#K5<b>dcCHCETDLMR5yC*CuyV=PJ+S\E*VeLEVR%bp%EmV%
n>:dRQ ECI@u<lbwy!*j#94NMd%VKyupR!#HiQkRC\*6JB@u@m+B5Zb:LE=Jb^jqndK>J$I/#M1K??ec8Mcp!qq
$DQiD@ :d!<de#8LBRbV<%j<Xm&R1wQ+=YLnlw?j6PZuyY4VaQ@twca4T%+qQnkK^%iItn:NC^5IaHe%NhC1$ZB
@FLDB= e\lj<cn9M&%IVpq%:CZ&LQ*nWjy8!%!iMN%%6HLa^B:^RkdatL!/uHdW=kyR>aqm/\hPZS4!BPu1N5P&
Nk1/J^ yic>e\Q!F=iXhKpAMpRXn+kBaj/nt:ElYeHhZYA5A:l6^MRcNPdRb?uRXadFkH5EejDuLKw&i!eai46Z
ZAK<PA H=JM9D\BNbF8D4I@JbS?!eb8PqY\@eAhaqb/MmlRb:q=yqjc1y#Xh$jDYdm<SZ9DjGi4\W*bn#MTy*jC
h$e8jd &>DP^ADTt4dN!t*q@N\%\Ri<EA4mYiJ!6*H$GT#8$hqHA\k+lqTI1QjFi5t>LW&ZB9cR8TZE*>#WCPW^
lT94K$ IL+JC@kWCN/\^#$qNHDcY$VAy?#/JLdEjZNlM5lapH&*GLC>B<5Vq1*phY>R=5Aj4tY8CduZC:KhGL$D
&db5mT :TW4/=q+DAX%!%h$=9ieShZC5Hjl?\q>Ee<w>\!PenZbB$CS:#kbqRqNqbVniKDQNB4=FB1/RYEkN9Hd
M&*>HY 6aG>t#=Gnt+Cjc&Dmb^\bX<:PZeuRLMwCd$a&Tm9$=+A98JAIylQ$$dRl5@jdu8wc<m?LJ=QXnELXPPp
&=>c49 /X146DtkKGJL*pnaq!H<LqVEeX+tWb@IPb=bNba1F//Z+MjSme:qj<9PKwZ8TSJiN?QabABH=mXwZG:5
npTM=D piQT+Fny6GMNq5*u*Y@yj5:J%6yRyM/nwc^t?w4V/e\C5Ayl*5&PnnA:pWJQRe$H5YBY#>jS45dMtK+c
69aiBJ b=V4^JkHqYWQk%DIjYu<M@CW*ukQnLqAV9/\deG8>lbuPNGGjMhJDRLS%ii@>Bm?CZ:HqKFM%e>99&#V
wGGqtC $p9y$$maD6+Lnnwh5KPE&MVu<<pM<muKQ/Q5Am>9<T8H1?Lb>8NLt1J*dpdI*B^>IhInJ\y<Ic45J=4I
1&hJ8F Eup!=FL+R1%89m@&mCiZ/%Sb+L6mCClIy%enF5ZGXVj1ABnX?S\luXNWF4WLkcnTPL55jXJp?1dIF*+$
^pD6Ha C!k@\uHq?y=%tQXY%RED@$y?u:AR4Mp&FIC=>#lClh6>SpnXY$e:/k!Re:dqnkyd#V:6pI\wM+=>MN+@
-Ak/?& 000528b26e0001202b4 Page 240 of binaries2.zip
Z*ZTCm 5C>D5^@C^CE\e<9TS$N%Hl<9Amm=in%j@DCI?HA>k<w!1\EQVtm/Vw1E161d1>np=AypK:Nuj66kNF!4
#8waj+ PkueQ8ut$<SFVRW1A!%#*8YiuiI^:LAXXJJqEZIRl?%KK8**k?4MXbV>$FP8EV$<!nXSu8AZe8N$bWDW
mi>AID *tq\PnnCaJ?T+%VElEcBqY*IVH6jXb8EbZhS6p+5uPPXk4W&S/GuF?<BT&uEK%:5B:W6/\p4/Vw@KTDD
IuqXcw djK1ZS*4i!p&dMl\DtA%LlWiY@/1X>Gwlt6KaZnE>tpJkPDp4SK1#n+T#^ycY\195H81!&%dGVd98@ME
#\4GGq M1mGi+IJa+$1&6!66q5HH+*yjAC+E18+Y5yYJ$$TKkj^e:bW>e1+Se1/i*?:Q>D4\l8ELJW%5u8T!bPp
!ZGDWE 5:^j+RC1C6Ky8IQJIQ?8EZqd$j+PMTC+9ZhA4&&TlFn^Rh$m9TdFjVC$/bGu?hte<6//Qc#IVKu=Pc!t
N=\:dp wiI/:^A=L4?%@=$R//%eyeMm\/\b>\TV!G%q!:/?9DICJ:t/*a*^i%aDaIhcNnYN!VAKNX6eQcY=NbjA
yNw=Vn b:1yVaFS91WN=XXJ*^HuP/Tu?96/5RWCn@M+eekGYtV4lMK@LJ!Vi+R&*C=%CLBu<B??6=9Kqy8*c14I
@t/WSp %NJydkaZC4Dp6w96JekcD^4$u\E$k=dH:GT/CPZcpHSe$p%AId!wblWRPMq&deIu6<qclwT51#5nEGAS
eEZbG4 !5QkhP=HdL$aqHw%*Q/>Ba&^wHw5XmSIaZlk65py*Aj?l1bjEX=yRnMJTG\ZWM<ZAyQiyGlJt?#tX@+5
6c*?JX LHSDkcaHqcnPy>!$^^e&tNn%GQ=TiF>FZPM%Li?t>9=<Q$n*?y1SR$Pk9<$$ZkEW=L=%QbDhwPVE<m+n
cm1*nq W54YtuKGhd4J1u+MNn&XK1MMlJ\qTSjb!GlNF#a$>cLG\KPluYk9@E?Nk?nPS!$9HQb6b8W>=5RCK*BE
ldB9Hm B8yKke1XKm=5Y?AW8PM#A6h9h&P9d&=/yLu=bjZa9uZG$mji:pVdR/:LPYAu4AGQu1p/abj6u>ZN^Y/q
#wh&<j >NdMmP\<$6hZ/X:/wIw4p5cTZR:nH@#5pYdbNHyaWGBTCLSSFJSPHe9Y\=lEH48@X!dSpq@B6+%bX@u&
>hHM&p ?en%m%A$6hPS6m8V6>QIPwT6l@>I%$IZd^Q+b8^tbtXe6m6Xc@?VFVbi8p<1w1PdS+Q^lEJQ9kEQX<ua
Z?>u!I 5:XXP%PJ>B=hj&kj?IH/WjcA>GMiy1?#DQjib^Dl&bNEaCWKSXmWc!AHFB<Ad@ZYFZNKIP9WtbAkD<KR
>yiqLd #@u1lW^m^ye1J\pd<\*FKH$^PBE<9JewqaAX:Nuk5p?pB:t:$mBu#\@WZpADL?a:bn^nYcDqQemB<kjm
+MLwC= >%lKE=T/RA/%WpIwCEJ+YmBRNB5N44m4I!&>GuGhTh1T&&ReRG4%RPk%I$hQBaS5l?#nXG+XbbkmA+TS
?8!JcV B/ZPkqIZ!S+4p=aH%@A#K*$&$et%TGTtEyQ<qRtPFQpjNeGSw9>Nb%qI>K@P5yDIlb*q*&&^Q^68Rn>^
+W5<ub PZ<**C?RVm$E8\kN@$XT5lD<A4VR4*^yIeSF/F<iG*pBGwu<FT%$AS4^K#>iCHWB?6j84yD\u#%TyPl@
bhdYNi :bH?M+Q/H^+yC9EVn%SI=K<iKRKPRQ%@Jb&c!@4@#cY\A^T!@4Xk>ZQQZqcm#@6FSawpMulAI5JmZN=L
a$%#S^ \eu+bVuy/*RA9D\nKnDWjycIH::iS#eaaL=BJ$Xm1hiKhTQiIBZkXd=BZcEb66\8%buZRhM?D91P=E<e
=!^>d< Yt<h&X8&EluJn61=mXqJEk>Z!hWpRR5Ebd+RWRbSNTFkTj5D*TQ6WlR$ui*8/+&FIM^a8<!y+>GN1dwt
1Q#iaD <>+wdXA@i5^>8Se+HDiHEc4T?6EX#qWHK:aPVS%nEK<Rj4TpqhuhMyKR=H8V6F%cn$E$?JT&4@W^hS9W
X6DLMn I1@Mpy:b<1PEqF^:V5\uN1F8e$W59AND?dnwRa&8G1%&JWm:RcjIRMQ+^P:+>Tlw\lJm?Qlp9/:Gk@mN
1\$6S< wJuR@c6kIP#iS%IXJi$k<mmaFFNZ^TN\MM!5ZbcFTuiHQVSb?t:WYmRAD+65MniL=I#6\c9\l&@RM<^t
e%#X^p Yw+HY=ES$?jMZK>TVq<n*&yPBNBy9Z?lEC5#h8dtDXS@pJlnckDF\Em9ARMihZ!MG!!$t6NV^$njCj16
kG8SQd mLZ&P<QTmJ411njHY5>%6+cM>a*G>@!R@aL9uB=/GWV=^W81?d!pd%y$<*\YZ4%G!pQqtq/#>N!h^LGJ
!88RV> VFp$Th&:l&dIiF\Y4?uNlQ/#bDWHdWQIMFAkQwN#CWA!eNwQ&$=lyFXFlSDSiQky4\qKi<>apb^t1/u6
dC8tl? GIPTPb5<ae!cI6XeW/bN=Y5h++QTD=uXy#iXHPY&AHk%a:%jDi9eY6:\#H#/k8cbK$1l=ZaS+QqIT%NL
?w1Da8 dQq1X%Cb?#$69%Ze:Xje#6JlC1RECiiG!\alRF+>MktKyZNnEXhRh6J#PE9^JYWDw\hKV11F56qERWl&
>DAVJV j48Y^8yi%a*q=&=B>qep$em=5JXeD/ZqkCl?1>5+AVnty5hCIbhFHllMj<4Fw4QER\Ew\^pDN^q!M%MJ
Q/^&IL ?TJmJTQS5Cwkb:tuG9+na6cI\$Am%D9way9t?WQ@69cZhTAQI!I4cAW%%W*tu8BWSZdD6u+HAtGN$GT<
TLESb: K=yqdE%FM11*F?MVDNwH$NjYKNcyNh:i\9F9VV:=+1jd=cEIt!5V*Q4Ylp6yyX/cZCuBWjPX+VtlJapI
YFQ/6% GXB*jWYK6>RhppQER/BcMQd8i9SRiW4NtiQRkpijb9/L^:mQ61i6LCS5ucmdpPGbE@FyuudF>a@Lctd=
9CPKCE =/96HCj/t$4CjMwMu65:1^@WD8FkB1*$tCHq:Pc$M>%C4*\FI^YeWAw=kT&9CWXNJpK+BB6Qp8j\MAdq
YSqiN+ V1SA?q*RtnmjWeC\^%n*RN$54yNE&BkXK@K&dH9t=Rki^T9eXPLqhE1WeXkB!TJ:Z8uZRSWaMmJ=ZGJM
ji?$$9 cKKapVG*t$q49StqV91/d%6hjZF>IaW&<dwYIK?^uG%Xmd9E!Tm&tla4yw&ZwmJeBF1$AZ:RAR*/$i6J
6CheSV LP/k<:1GcABYtR:&XjANS+9yX\=cP$9CL:%QA#SK#lRVjDIW:?A@y&LuTcF!q>ACbImtTPd!SKCieh?d
ImA%ed y>8*6C41h*Qm6<y:SKXlXAQLL*#EC?\4+!jqh!=*$Gjk95YQ@ALwYl&w4@qG6><e#??bk!hER&W\a$lW
:J=B+G a^>Pc5kw@!Gb^:ImLCdp<18Bhd!p>=lH^G8V?hhaF=&1<cpNSt?5*=AjNB:AH4$A=y!&*J:<6PSYa!@K
p4+Qqd 499qJV9QtV@=QXCb6Cl6tjL#cN8cK+&ETaVZ14n<*&jH*?DRjGAP$k!htMq8$yPlYYPnV>qnaC#n/u*+
P=:+y* =F&#Z%TBWJj:M8E%w+lI^A9K&:u5Ic8keK@KJ!ny!Hip&aPEB8$lRR1yK:jcp=+AE\JiMnPA8a1pjwVi
>bu%m= jH+45+T=j4J1b*hi::Tuta#h6th%>^l$!4/y/ISc!*FA4%%eG=!a$9^WC*pY*wX<#cc%KY68%<65?b=I
jct=6T h?=ij%D6Y/Py\blMl*9G#yhi8X5/DpVBDqR\:j*PG!t+YiS?%^%*h&\EqGh1/dTZMQPE5LEQDSqTD?+/
Qtm5WB Vk*IeL:H:iA<FE\MNjEjR=*JVn\SWy^d4&u/mpeHZYMyLNteiHFPql+=p?kVZ^%B%#R!XN^\ScyWuYAw
\n9R!5 V<u^iP<Rh6Diu@N=J#SN*5M%9E5+XYPHtVjS&HE?QcF*>5tnV5kWJM/VVFj+ld4Zp=ib>$cN5Ve!R^eu
?^\TcX m+8iW>Mbk58BDdLFC:TMd5=u5CiZXFKWX944YRcntw:*#q!w*&mp5h*P>Ka\Bl>y%MKb*=eILT&>L8?u
bDkdV9 tKncynQW&Xl?*TZ1ZED6X66!Se*#KcSbJd4B=@YE@RTyYeF5%ycZHNM<XWwSHwK#K!nLyZj:8RZ:%=G8
G@i#\k \ZPQ>Z9#he/y/p*QMq\ZQ^&FHVB9Sed*RHt*9Lk^$1ZS4:>q?hMhGY^\VGh/HQ1NTR^iL<n=XH4=SdjB
Z54+q# K*ayudKRVP>F@%eShMIq46cS?^8&/mTceP*pc!q\YuiBb8J!ubL:<whMdX4QGK?=iQY9Wl#eGEB?yh+S
P\/!d@ <N/:@pD:KNwmRt%E<JaIXWaY!XTtI8M\N@Fu*<wF/uly^ueQZJaIk&A!ptbN9WB#CGEwZ/lbi&49A#G^
t88<@L Nmjl^eFR\5IB/18Nuc$VY%\kWXZwQtqWhlIC/IlH#Gyp$p&ZTM%ZIS\<S^^<BI*AZ#Z$j=I>inhqp5iw
qIcj6n J/!RVK4MIWmESbnqXup+!>Q5q6cCF@cePP<6=YN#PYS5duy5ySd&8\bm<M$WHt#J4X\!*jcV5#&TFktW
/qqSm4 8*tQkEFQnpMyDkI6=wA4M$k:+^!8#pEe>V#pRJk<&j&8%bRmN5<i>?kmN4hhu>ui%tt&%VnIy>!\5Q6b
djMWwp T*=nQAiAEEI!VX!CM1@CbwnKq+c!ld6KZF+dTh<XD=QK$bZtNXQBpt>/XJ%X9MEXJ>:P\wA8<bXk?W%=
TNPLah nJQK*I4k=e+<yC1uB+/NRK<N5Scl!GJ$#MLl!eIBhNd=SCKEMLhNudSZNbDVeS+6AeG8Nw%aF<IwaL6W
%wWABc dkXF5/ahK#\65<N/T/yl5^^5c<:In!M<B5Mncu*1FIZ#M&VLLZEFcJ=QL\k?^ZKq8?cd%C4Ln/%8c>wR
/J<+cD Y?B^/J69/&/WQet!LAnLFPkV!bcqpGTi8^@9?aDjm<dbtBl@!dXkYdX\wDQjnk=*TRc@TY9H8>nbFJC#
TX=LNS R!e:JHq\PqN\V**:McD9MYNaMCCZ1VYM:Pk+!=p<pSGk\5Au:#5mH#/iX#kIdSk@C+6$wn<GhuIddJZd
$@uu*/ ^^G$PKk:b4L46jKh8td6ZT/HX@Temc<V<qXG!jSB*!p+i^Ta<?@:*!EHXiT9>:CX>dkw8qkCy>CPD$ec
6I8yY$ ARCJc\YD>Q9mPuaX=w/uBt/PMA5tc=n>q9pPS^AJyY&tZ*hWBXp&B*8TATnXm=ZDL/\DL9iWGXB\D<M#
diqY:N b\etB5+LBH@kB65LMF9Zkl9/c@KWKnBRK/^n%8aMtiRt?aQCASFjj1\?ScD>CjaN5Y$KSV\DiGE4LIVX
l9p4Nd lpSA+/+AWQwitaHZpBB$k5NESiR$=QCl+Keae\Z16uj$/<>awJmCQ5ZCKASncTWAPAFtPj<mJ\Ci=Kji
>:G8ZI c?C*b6b9t\C*nVKVG1VElpud4J9c:ahK>\I*WkJCbB%DIW/ek5K&A\:<BpZSqLm%WVaFKKl5DHnT>*Q@
A@e8uB pA#EPS1jGdR<yl#11W@wRk*<APe/qABi\4Ybknmq9?Ej<$?M<yNBT+*hIAApRiKk>:6Y^/9WeVFwAKAh
dlWQSe StB&!hu:4t95neJkICcYRHQBtiAY48tTG:/ClBaSu1YblN!8TqYahN:cDXiNJ#JTlHFM?6BMP>tBP?P+
SmS8^1 n9qcH:55yNbujIA4WwZLKc5:+m/CKDc=G%X=D/EqW:J?%G%bNupmFulMt8dd:yct8SNkkaI/B:anPWT1
Yh&hpc MkniTJl/F6Yu4b:N=p@%/+1tR1L@w#+AC94j>AFEWH@%AWTEL8\D@D:%?@PpE9YVtj#9?ZaZtbPm+H<Q
CW$?ql S@^=Tw8C@6hV&u>t?9\&yaZBaD?b$1L?6XK5ucinFVPZFDQG%5/S&eDP!euK*euM&bub^bpbI+jl@mHe
ulI+lC !8P*EED<6uQau$61@1eX<M<LJCTC?1eCnL8X>\<M>e@4wQyd?CBlw9>MZyK%e@j+:a4?^^iW#j:^>#@V
Ww@Vw/ FZ@QVISD@*\CRn<=AX*d8<\K#HjeZZ/E&Z?qG\XF@WZ*:?*!u#1l1J?>Zw%C@iVaY4d@PCc#^>$j4ijy
-ATXqT 000ceb96e2a001202b4 Page 241 of binaries2.zip
Au:1YD dtjBdPbw+?J8=&u4=QEHIeL\9=S!@WQC&E?E@KMB@>A?9\5V@p5DC9?yAiH@$wCwQ=?D<E@PReLe^e9#
J6cPYZ H&hlciby^t#l+8V1d8ZlajenDN^@@MjP&iyjVkZ%q#j<SZ=/K1k@6iuQ6l6Dmj^Tn?iQquW*?@FFy^<@
55INh! :tS8=i:B:PXlbeq5=5H5<d5/B/8:@%+bAwd/h<4?&enCj%L/5:K1KNF@1>Vyl/Vjim6LP=5jc9+wTqnp
Gy9YKl L!EI9akwpV>hiilQSAqDj!JK*8WP5/eL5?69>+PFJ:P4q:unn:D<4c&a4h%@6KcutbP4qd8h5<$jXa4?
T#4uMn JcFSCH+SqcJ@W9t#Zpea>k8Xqm+@i9Dj+5:B!51X&hQh#MKB&eYc?a/6uaZ6@^L<+:nM*tcPhyc*@mBY
LC!*DN BCH<F%5ViRG^@&#C@^AL@=qa?AYc%N*P?:e^:V@d%NLP\<LS^eQL*i1QPqEm@/aR<d@S?hNGSQ^Eq/VX
I>nD#\ uh>c/EidiVmdPj#+aPj+^?PL\Q>TVRN%pW:uV*j8Q#9qj>Z#5/FE^<9S&e4h#N#P$e:V:q>/DXEp:GJ6
*Y/H1j <Te6j?u\lQ<$awn</+kB?@PIIj!#EWQ16!:P^eu86@:E%e#D\>ZY*e#Dm9qHd@QHc@69=TNFj!bj?E<D
\6p:St mjDQBlLlu\$ptQ?+VZ>/k@=XAB!P?ueC@6q?j^=AjyaNLQ!#WWHX^bQb#e98S%NaYnqcij=wKY5:^*?>
M&pbDG y4<H!u@X6j%F$=@n/&enk@DQSkahP@eja+DHQ!/Wq48L9bp#5/&L8<i@1lIY9qCp@WZXu$aB+b?NA5I@
L1TL5X G\W\6ue>:C#MHH?MT^biQ+d?8<#tQ^/6LY#@W>S@WbQ<*+n/$!kk<4NSRPSuw+CY%a<k?uF\M$@QH>&1
Bhm%>V ^:@X<5eK=@>G!=@/iyGjhXMmQ?94Mj?4*@\S$e^tNtb&#n>$tL9aiHp\i>4>GDh@C@h@4??QNhS@4W@p
61**Q! V>&:!M?/h=Gjhi<!Q1:@/L6@i@B%<uL$6PQ@EYZ8Q=:yQD!6uQ=F&q<!>!>&GWXkj=L&5@Wtpb@%<F48
jt/T$j b6dY9#%XPy5=@wm!j!>G/KjQqH<SA@?VtJ>%:!I@uTt+**Z%9JCTQ::R<G?W@LRblH/!:Qbnc9N@*$#+
yY!a$A Q@ytR5#@*y5JPV6bQ:eNSFD@jh9k9?5XmAn@>:\CGA#=F/<ABpNe%C9+==#/^\j+V$$Dpb?<umWmjNE6
H+!ZwP uWXEL$DD+L?kScEZPjc9q8BFaSilEd</N9^9$akL$H?en9\4nj^d6NBFcPm9cNVjwwW9RCPFWd?kSj+Y
^a1<uS jbFaR<J@V5Pk$L>FZ!VYEMK@w8F@m:=I4CFk!F@R!L>FZ!VY+Klj$cm@SX<p%u:yS<KkIu<Q9$m$@hFS
K/JbS$ @BecB9%dNP#QX11I<L>c1Tm+MLQRn@:?6/!8j%1y@$\I?q>Y/p<iJGH@8tjT#*:*Q!^cPP!j9@5j48\@
K:SCeN jleJ@hu9Iu:!?QMd>%<?@\A/#ZA/mAZw\dI5iQGbDMVZcQB^V$SXcY^E\\n#\*!Y*RW8E\I:aXu?61na
!Qm&ZK 1GC!w59RRXKE%I1HmKWIqYl5qGu<>8XkY%lCd+?4XFILNT!M?641CZSIkwSHA:m/MqRCBlbQY*cKuC>y
md:R$d mhJHa5<8ZeK<Jm%66/=//$lwC4*<T6p:\K6XWi6/=/B=aFGiIb41eni4tWVKF@nqCIn89wK4XY\:mc!W
Ih&/j% BNw@>kHh1t1V4$Jij&dHJ4DV4CnLuJ8iGDl@1Tm9Ya6hw&?YIaTX$#:I1be%I1>WHppL/6FkFQ4^RNZW
ZN>9#Q %9Rq9bBql4llWXbeKbZuVA:FPPJ#4T&4\%%<4+H^&w8dk@K^MY\NV=YV#KGM41bBbmHB4wlX@ZchXCS1
@DYeLN t\:InTucdadmldW$6/MD1X/5wA8GkNjRYLd&8Ck88w=46lwD%+?LMKnwFZuudkRwF>RjA94$uVAaL&6A
41&YI4 HBJLcR:kDmkhKm1RTEA#llIcEhQ^PZCFjeiTWba$em4^pd$IW^buRabe<<eIk@m/<41:ZAkN/G6!=SeR
4wt:F< kpN5pm<HE:y8Dpt:q*#uqwY&abBDbqFN\nJX^&PhXRtqq?mGwpw^A/4:Ti>+whBnNE!bu>CR9G4K1GBI
=*T4il dX!GpV^/!4<ZCcCMcwJ48Mtn^YwRTW9CwBZ<$\F<ENZmVT%NLWdF!4e1^4^h/9KcAwBw1m?#Qdd\d<EI
MR!a4K YFZ^6YaT>^X&RRu$muT%\^e=Ri%w=hPJ<W5PmmmJJE$mw<wDLnSnhaC$pAPAyqTJT^IX!eQe98JAec*1
RKNDW= JC/BLbm1?X8H/puTXFi%<<EbqWu@tD11H8qAbI&FZhEaM1%VJcR!DIl?AVXKnNS<MD1W!K*$9Kt8+Lwt
M/kku* CIGR1>G>Cibi=8PR:kwGZieY6KyjbiIB1H%J9NRZS@WwwNw5mRW/WW?&bhXq<iC?=!KwIEkAhIw$D\/l
1W5#%: jCHhcYckeqXhti/kNujw=QYL\wXnC&/!DnFD*my:EW6=B8S#b5^\6bnna4HTw%J%\wNP&>hN>midbdCB
uiQF\k CmcCW9BuqCEX^AY$INw>@X\DFYQtkbucFKTnV8iQ>Ll1KRF>46qyNeiItSmDppmFEJNb=k*P*FBtILPN
R\<A!Z =@BVQ5VEQPPyCZJ!:%&DThP$Ti#u4<l=6M6Fcn4E+>E&iL/99$K#G+A?uqJJ/bMwG@=My8+IbayARM+i
Q>lBw@ lEuMj?dDPhk?:m#a&V!yjk4>Y6F\$<&<YajtD9Z>F*RaBIm%9Cy5emZ+*w+EiZqIy1%BaJYqZdEAeLdP
Gl:E>l LCGS*$KYi1iEC>hYI!EbmyZ8RM9Ak!D:^DCinZB/HZ@VJVh@%c^/Z$u@ATdVBC=ZkZtCRJ^B\qT<iYX4
qNIY$X 56G58Y9E&6KewYFJA=%V?cS#^B1l>9NZ&iuT<NWVEhcXda%=%w+TJB*>%pV%lEXpqkPS:+nX64t>5&c^
FIqZSl ?:MbwjCwc\?=$H$MJtpQad^SHR!%PGA1%6qkM4?dQX$n/Xw5bWw^Ctt5/Km:K5YPcK+DypA<NuS:<dG<
h4!^bn AquVT@nbh&NNQM?m6Pe%$teMY5@<RhjGSdn%mcQXu<uHt/+\5Y=E^ip\mk1wYy%uiTXRk>4DQW8+R%kK
6kXmJM P?tMKb\%1#<S<L$*w^$=DbD1d^9mFDGjG*6H=c?KFWAqt^hc?@y1KcRm5b+6V$Aq/R@6PSmXCcplytLY
^hjC5* yL#<e9LeQwYQmW*TNi*kyZyZLp%u6m8<C^iVwj#AGlDSS5BLbM+YXlZ@JqJMZ:Aa1Kcd?nyndh&#RkM&
/4FRi: %qNRdwHl<6&h4lC!1Z1#\jnJNaci4J/k1tM?/P+>ASy5!?Sqm&Fy^q!8ay5ZlZ*VRXqt>!N!aKGw5w?M
RWlp>9 !F!ZYL/JXl=FP^$u<dnKF^bZbB&*TF:F&^dB!Ej9B8hSMmRBlGkiBZH:q/SmZCHb+a+Te=k&hW5L5P5L
M$8td^ 1W:CZkNGFbtKT?XehDI<hkaPZlY%AQJyhla49LJiSi%>pXLML4*ybc/K=b!YXE&cw1AkRmGl\?:CL6u%
YA@/Hn dK%9*AuM:@4!9HnbHGPB+*/Z?CR@eGt5Spjd#&l\+NhcB<JS<e\<&kP949C8q\QE6JkM&A!wA1$//Ey5
u@:p16 c==1Ywy9M&h!cpt<1L9btHQ=eYD>5+*#AVwinRbDKKiWNZA:B*YiA#t+:q9t?FIaM^Q/JDIC/A/b$?>!
?l+El@ >iR9#=dVmSu9F!pC<ZmewkGLn?hD1P&Zei#1&:L=4!P#Iym%jZTPW+jLZ!GJqbXphdL#^Jnw%S!6FEZn
I*n!Kh E=/hD=J+?9N9jQJ\5<IQQl6Y4\kcpQKmmTKRdZyD4bqnV!1d#n=dn^86jKPkM1*Ww8BNMPV>K88%^jja
=6Tid# D@Ge6<uM4u6G4HE81Jc:ud=/Xqj@Xt*DD/*@H1>%pIFZS6b=bBL?YF6i%q6dQDPQt8SB?KAPBD9EnZBq
pCwCpK buaMp:*dcEWQyWRi6mt!mR?@B%kI<n@$XDk#Hk:4FTqa!:a49=61I>yLAmy*TL&$Bi8\IlL6bCtIHu<^
\??nky X1KI8F:H%%a!HyHjna^@II>mE#TdTKnKK$YPw!&tm@#IpNR9/Dyb6IF&6dwX?wlK=+a:MDn=wH+L\yj9
/4p$Ca c$Phlm!j&TtMd$\=8/#j*X9MP1@h<b/n#M4+YRc9qa%VRZ<hc9W#M<c?K1d+9li$t4DN%IH=tyYR\dR6
B<kZll #XM@wMLMiFIM<$IH=@D^ap1halVW<mYibuMjqRqjTE1q@#dWlZ!TKEpGQc*FD6:5F^GGLC5KeEt^hZSE
5?#45X ^b!d#5dLHQjH>=%Q9q4>\5^+uNNpbb%kXMw#mS%%hR+X?jdBZ$ijt+5JZt56l?k>4y4c46$Sct^+88^l
%@w%^S GHWTenNXSWXnqekyBShTQ9&yX*hkCneAI=M+>m\tbWue>HDElQaXy=!\hKaR9?jhPZBWwjmGai6N%&@n
14pk*i Be?bD1Z>GKM@YGY\*e@E&jE>Q*^u\dWiaNhudHX?YjRd!c8:pqX49K@4:=#t9>b+=HJ+R#D!nt4I?uQ?
dp$$Ml 4bDHcp&t$y*+9wWm?\@<B=bj!<$#\&@Eb1^NBedKnH<cjdbupKLwlE@eXaINCmp4FiZ44i>PXjY*&y$B
pM4jD1 Y#JAL#ML>&N>T>i@VM*jWd>9@?u\hABwRjPAhTY+bCqdWtJ=?jE4:hl*>!T96t5>A=!^IPbtlq+i59u=
mL1i19 HuAayn!ZaQNq@KJ5a/&ST&FJwwpnB<!Q81\m^YYIn<GPkT1Iy9R6KJIm>DwPYq@54ZaGLuZ&PC:ml*EQ
8<M^/Z c\F\I6=mK+VaBaC165lC1uheGL8nFBudt?&k=etDCwj6ut9B1MRk\96SW#t:qtPdki:?HdqR%YZyQBhF
Vmlkwh SV8MhbSXC5c!1h>Tucm+LMPtKA*/BNytLSM!ytyJ6\5%RpI#:++MnP$DZ^h@$>&9&S5<\5eu%P9u5ZFi
@yaM@E &4dkM8y6MBVkA$w*YWT#bAJX5WAN/cDt^>cZuYVF^/$FAF##^6%J/8\uy%&+muJ5X1GT^Q=nqn5%=mEn
G/JIl$ +Hk?ML8pP%a%hW&JXJbMCdy161u/1I>FC#mq%K*w!j:N#GZZWIdae%^MbXQ<ccXQ/:H+T=Yu?D\#duI?
WL8b4G \SEVkccHmX\6L9&TY<W%&E*eip8G^%b/mnJclYGe%NI#YqcKK9Jhkca4nP4Y#jtEZ#dJpHtuqjtE>dIn
iZbwGn tPBDA+WABqaiW4bXSjR8QuqEi>5EPA#pdRYyJt@Sa5546:mb:8ciNZ1iLSk+HZ41*G8h+&48qLWJHSJ+
ni1mZ! $SH*4R\XQ*4eYt^B1=Iq/I::?G&/p!QljG/#*j1VMTnQZBt$\SZi5C@Y!FZ^wSjb8Hwt+Y1Kn#N@n/@k
bRyIFP tcQ>mKK1C*aIa64n9heALt&H=PLa>\#=^1h<nDDE*:b>C:5<FKuZE%HW$+uVT>VnIJ5FRe?:\8Wkjb:Q
BuSwjn mR&$?cJ!8y4!PLI!iF#9nVTCAaHjJbhiCn=+GbIARk>WAQ6K<ynXyXp1&>BqNijXEYhqRhDQAGZRephN
y=YYWl SAPAqM^4L#A!j^Xc=b1#aj=!+A^CjIb>S%QVlut8pXXG&1T9^DR5SdlCwJ\utFBNIEY:nK=$@?IJ$^dm
dmMc*W QDc*4=EPpRENyA1WQYiN1+ItBD/W4wP^y&ldaBBFb>K5m4c<k1DS#RWK4n4T\\RmhqciDFa4J=G89I\B
/y&RHW h*C<1WyZ>uWw1EnbQ*dmGn8bRLLcAZ8eMQ9kaWLX@IQKRGLVkYyCpj5Cb^>LJCh\hn<jXZ%naTLMTdwp
^G9tcF ?hQ>FGD@8kQ4j#9^S=kbIj4*jD*a9&:t?4@l/!Hlj@Z%pLAL?*1@1@*L%QG9W?=@X6n/\<RVD9@F^FQ+
#4nPWI A9T9:D\aVPRCNEwW>k6c>P@RePlFcPT9cNnjw8EZwIX?1S#^6&npSiljKlj/Y@SFak*=T?ZCj+8?TK\l
-AMYZK 000e475cc0f001202b4 Page 242 of binaries2.zip
bYTE1V j/qe>P@RmI9EGkKJ?AWN?%9$SYINL9w4G9G*/I9EG9!Z!wZ?Fu&SYIQ@!qBDCQ<6?mK^>t5uEZGSaIQ>
tcFH@5 awh&&L?Y5MQ<J@99$m4@\@::l&j*5>\e&B?L&@%HNdZjh1n=j?&cyYpQLV\:l5!Rm4!dqh\@c+/:MAL<
i*b*<p McAwc>MDGmF4RT+^!QqaQEIyZ%KLPhIcIMH9E/i>/T!c%&jyd6AYiE8+C4h<^qCW#5clwWNkXt\=/JFQ
LVE%Xp lt\9+9AJMD/pT!8pL6/@>%J$N?lAS1yXZJ&BKqLYRkL>ikLG8N$NIH%a!<bQj@>t+NJ^Fuweuw8aiI9A
\D@b\A MCy?i6ulIQu?SlAht9PFaB?G8%:FIwL^Gap:NQM=&Y8eAYC:1*WT66VjtmFQMlejeD*A*:+B%1dJDH>^
C@YeE! 4RpnDLlYlaG%k^F#+nGpQ1=WpKlPiYSdy/@4hH&Y^nl6q11TPV$d+Ru?RWm:9!qnm#p4XZeQwZR%9+\k
pwbXAD u!WXIVSTnA!e4i#EAKm8m@kGNEPQjYm4#eLApY49lG?kFWt?mL=+X*cZEVt/nl%:Yi9\pSGpy8!JA5M/
9%HnJ8 *%+B4RB+$d&cu=V\i1a<q1ppHQQCJWQ\qFB$hWqXXqj\Kjn%^Tj*ySiwXMt4F8C/$B6W*<FCmjJppKw\
cQAKYk D<bSMGLDbK15:Q\LM5umqj!a<9QnM>tAKP#*?je*dNSWK:?p:4$MeLYpC+Z=FA9KJQTb98%B$Fq+KR@=
^nlQ<T h%/Yp^4/j8W&hb9G\P8+8AF^8ChmcTA1N<VK1WQRt9c/uFAQ:ypC>R!4cK>/L8?D$YVwwM*L?64Q$ZKP
X?eL%n V:kNa?nK*bTMcW/^NDhRI8n4L\:anqRu%N=LD<^qJ>:IZDuQQP6jwj&t?G%eKDMkTw?/NW%9T<mE*m%A
Y$p#l/ Mp5dJ6Pw9Wa#IF!1JHK4HPSpk>XbmBibP84pwbY55S<HKjJ/jPRSDPm1=AFP*/j*=w:FH$E+u6A6IPbt
%F$pDA n!&i1k9=aERkS8C+L/w%A5Yeuh\^P:^e=I=NDT+J\%9RAM$4I\$Pp/1d*@XcKDtjKqCh4\YFZFH=14Ce
Ze%%y/ LcYy1cqjka*&>yanbjG1LRM\i8>ZB4&^YiB$\&+hJ$WM9H%S=9dtw^:Pt=YZ4!#*ZwH4w6/E%dWu<wTd
\XQne& jDZB$4^&&?wPW=Mm:SmI81ZJI!adQ@9t/jKXbKKeZy$HBTH^btmi9eii#:ycLenDF#m&+6=^C6$5tYEa
9m#LLC >8dMG!unuF6N*8M#:L?T!>4NXH\qtEa*K+C=ITTCSHq*T5P5kJRH<T$+!PAFKR@=DXS*A#Xq<!N6HuL>
Rpqk*P +mKj18W/$TDC1i@$Rc?I6CRq6du4GTW+E8I/l\S9SIRjNaT^A:N#/5Qc5qX=yZj6+t6Y@eH/kntyFF8Q
hb&<dk 4&&GqM%Sya$N^FKhP#n8&XuT#^I&te>:!Qa9CiQmTZ/c+e/LXbaWbk*nJciRFI8&#+>ME\=:KwH:WLcQ
PXSYR+ !F?t1yM1RB4t9YuXACe4mKana!a!T?EK61P<ImF>S^jM@qTp%+F:HYEuP%#hH&!>dMmaGKyaQyeq:G<Q
W&\KX/ Iy#jE^@Rwmy#*cEDVVInT1p6?1wG:QJLMI<kB5d=h=CQqLXIHH/wwi6XQM^tcbTNb@hIY$</5A^#j<!e
DY$iKw ^!Bu\XFua>G1Yn$$EJwL#hpK<@R14QEw^S\?Z4:@:Fb5%Im$>9P4E\\#Yn%G*>J1+Xi&GLim4p&EenTt
\/D%@1 Zwq1V>b&XdZP55hy\qBI=d1EtLX$SXndj9wY^X@9nlacc<:eYZSRMZeYtl!mM+:##AJ>@NRT/u>\P!qK
yak^Zq e&X<6ZC4cm!JlRJl4aYcuL><u&u!BWtmJ#%Gk!%PjdLtjw?B:9PT\LEkR?p:FR5M8RX#>&KQ>d&5E@Ld
/l?Pu: lS1?Q#=R5N\/u4ll+E6uJ#bu#p>$<9!<K>GC=WBJ:kHm<YV4dFIbBIqN5!my&?&nEjGTm:\mRn?VWMa!
GeFBI\ Q!Y*5$\t%d<bdCL94FFmye?yF&KTLS*qSpu%ZXI@JcB5QCWpyayMmw:4wFTQK!Z8W8M#ZTtBnNI:*C1:
jA+c+G iGI$Vh8kpAa%&RLd%*9?t=RMllp$^KbmkA*lYESBbqdAVXdL8Q6+a8*Y$AD:RMIXR$FG=wnTaLHP95X:
8CYi&Q 5Te%mPK9cWDMIwu=q!Q9Ib/*9b98MZ#*Gt5da++Gpw%GK$<>&\+k$Dj+!?*JGRy!H>:ijdyP<=L!+Bmj
TR1V#4 !m!Y&bGhqhVWPkJbk%PlS/VMMa^wtyyBF6^L:*JIQNhKuu@!5wZ9>NX:X*^T5:Y^44%wR/9Zh\MEbnVu
TpytDR I/M4linS>jAu#=N9cVtXt@hNl&h4l$uaVH*?+J8/<1/<eVGl^6cnp5Q81t:ly*5/C%@d/SLc/nQmPc^a
MaFFV+ FSANMZ\N#>@jHu9S/8!la:KAi8ht16+dEQ/p1nw%uEy:Z^^iXZjG8waeFuB\T*<EGK4aEwbY=B\ZJA*T
VyujJt yBGwZLq&4eASY9<^Daph1Gj=bk1ccIaBEWWyZR@$+mb%c?#BGtpD8AmlE\wCVJjX+h5n&jG&M!8c/bLH
PDLPM\ Xe!6R*Jci!Sup@Rcu@Xy#J\:?:LF9ZL6^u15HujyFGuClAVHIQiy^Zke$#w#cl+eLV*b/Lti@dT?pWX4
#:JlB8 ==*tdM#Zp>LqjnYtKIQ$6#RuDpNqIq/?G+4eba&=L=e?<6:b<+uy59kWNtTh><*SlGL$/cS5=9X&9Nc1
tPptLJ ?dihBSa^>9Z9hB&Qy\%iBGbk414tKYyKc*u/*J*Tj8\l1:euXM@bc1$YW!dGen1H*FBHPiuuWY%I/?&d
j+lTHZ ?iqtVRCuZw6cY<T8GL#PL%F+Z%:$Bu&*\H8^aejyTaX9!!$A#?$lt9N6bk$4<Xu8N&?qb=aSp5K8KjqX
>^G^1j B4Zu1&QSH\<QSZhK@FmSE$><t<XMWy?hjZ*&#QqyP&SRRQ#PdjTi^+9itbWFh?E:9jA6Ze$n<=\Y*&j>
ph9itI V/^lh#ejndwdFd$@yqc@u?#<bKQw/@QuMRy?4l61G^>t94l4u4=S1&S#i@V^pjey#kJXM?=P5CF>*S#m
$ciRZ4 RPGJSEqVy!4dbX<46\b>?Z/1A+\lJC\/pCW6dwYwQeF4hq>Y5^jR!bGhX#9V=5?1\P=*8+kZV@6TCK4+
#auH#C iEW!+ZLYncnPQq#Acbn@d5mcYL^LVVI\T<8qCd+Jl^AG=!yeh68cAXZlj/4M^%Yi&?CmY5l6<uRC\uGY
W8GbF8 IQ6N:<8TEulmE9dLk4h<Tq$+jHbdq=Z##Hpm*t<N>Ty/D!^nPmP=Kt*TkIW^+PIbQ?5RaJWMIZl8FeKk
R5Z5B/ A\&8hQT=J+QymjYGq=Yy<&$SlV/A^KlYCRIQAA5LG@5*NtK\+e&bk&k=/^Gk=T/TG*KL&PjG@klGNunc
?ANViq **KP&TB%%Dal9*pycCy/dC+?dlNb$udniPbYDLHuQkFa?l%I<C5bPYRNu<\Y*cPXH&PF^Ru1yXI::kAZ
LMNS8K KjLcwt8/YG/Q+>6XjXJ%I+iR4ciP>WJK%/m&VB%JwQbS<<cneS81Bwek/PPlB<tlNFNKN#9BMV4!HS@H
eWK8Tm tBQ!&L=91>ATRd>$uem&LWeIL5!1<q</b6AqW1NXMykhw@4WE@NqS\Fu*jF4Q@R48^68F%9TDne%8^^8
^XNHXR BXij8nEitK>=GHenZ>1tm!b8!!ip\Fh%dT/^/Nk\K\HWp?WHbJ+SYEdpG%ZpRyN6lyK:VlWwCJ<Kt16F
+cS%ek TB<!D&BDG8TI#k@bNk*hXq9m6#>61X*F\XkV%pQYPPVpk=HSKZQXajK88M5cjGy5YP9abeMcHY>w=bZk
NtBk?X 8qV8l88qXe4La^*H#lIkyw+ih*!e46b\nSiqu<w+tY?QhTSc:mcY#cRWP!51u$*E>Ln\jV5j1:6itjJM
:M1>=Y aLiSSAMjJ+E\T6+>t8$aZyX?$KMe9/AptQRY&uJ49PJ#bIi=aI<FZ<J$6Z?c8ukaibap=@IH4nC>eQMa
wiF\^@ T/#Z8mMpc=BlVePIY$%\?BGaQ%BP*XcZ$PjnRXSt=Z5?yRaIVmiD*hLI/ChmdJnikh/h6\EIh+\caT/T
@tin6E Wq4#dh9/Ehbw8P8<i/E19Kb1dWlLTp#CNm8SSDYa\PhNwW>NbjNuFaM5e9GeL4bI:lXtTn@S&kS9SLba
FBY@\E JN&6mWE&Yb\GLqX*:4G/IwF/QE^6YKMRt!iaiR:5L<F=8JyLi6K\%\Vt>$T#VwwHp+Itm:SH/*TKbS9&
BK1SmX =c=a6ubLZiM4&&*WGNp:tiVb!*IlCb5p!XHpJVcGGB\E://GtCEBGMiNtHRTH<L?QEZXn9Sl9tbLk#EN
GY$jEM d?PVheQmDw!<1wGD5$cakR=J$t&i<^bLX@&i+Ba=%hCwGeP<8!!e1q4Tu5FF89L^+y%k^V946FLqIalB
=MCdK5 A^8PlPeD$QDTuwB^QNuk=iXC!EmQ=X*@BQCWRTumEAAwR8TZjYHZqGjGAEyh8JN1FTq6@VWh#!6JPFXR
QVA::Q \QBAl:ci9Fk8bE!W9Q>TMYJA^:F4E#@Kbp*ity\5P&JVc+SA1IRn1<KpVi45Xm/:m6V&HYw<6dcq8$1$
th>hqp /1!TEX=$:eT5Yydi?i^l>YE?6>85D+en<wW\98GHllQdM>N1tPC\BIG/HLm#$8u^l5b>Q54dZDkVW&lV
N+V#cD iijtWTT66PMu+MlAW^*L<Cp@u<41LZBkS?%=<w>L!LKwQ\y5h5mqkR14PhTkQVJ9^LZ%un+qHqYuQInT
=5b*=h *G!LZ*?9ZVLmykAq#CMR+=\B8hn18YIR>aatX4/P6cY*>@w?^L\V1=bY4X4Pp#Fj>dil%*y1tt!IH@jB
ttTGpL SGk8/JB4pA*$JJSJ&88bTRMNkRJW\6W@PF>YujjtCjm#/a!/k98*jKiZ1qF1@HuG9DqKptY4N@a*ZS&?
BPpEhW PPG:>9Ke1ah%jD=+$PDMK%cMHJHSeQXKWbmmP1cm&>i/\t69wa@!*CkLG&5#pN5Hjy9^dbA@iT461ui+
C<HwE% &ciaqIcD^qeT%!YQC#@JjPC=8aDeu@S&h?qpl6kGQ!Y<1a/a$Ad\6SCa+t5*Q?5XiBSlFPBhM/pC*/lX
^hCGnc ah%p9T\j<&w+d!+Sc5Njync5HBun<#!m!$w#Kknd/<u8dJW!>wRdC5qcuyF99Cbn+/qYbjiIc+R\^$4t
=nT?K@ p^$&#$dF<R9Rh\=wFJ@CBT?l89<&PG^VK@16VptQ?@ipq>aN?>$kuep+MT&5KHq=njYG9L:cmc*5%j51
ZqWJhT ic<==IMjJW#DPV%K#4@XCGBpQn6^+CR5n:4*8N5W$mV\i*k5L+QK<::6hCYY<ButViSdNX5WSGTF+F8l
Y>MmQB S&/Zj<QI*l!IE+l1cL^ZdB:HnNGTp6jkIKj4c/T9RMb!lZ%TY$S\5D?EBV\MianIt:8n^^&5AE#E/caq
Fe?^+> M9$W1RDqn\HXtl8JTH>TjttmJ@Pkb=^?jCnYA>>e9mFS?<EGB6u>1CRu4PHRYna?n=%I1ELFJ%XTN9lD
PqH#%\ :*$m<G/qM@DDqw9&Kbq>pMp96mYG@Y8N?9>JG^*=*>!5AjajL>9<\Wd@#^eK@$5d@Zh9=C?8!$?5LmVm
*/8a9: wpd+V?4u@=Z?yRtQSF&A@1WSnlV?Y:VISYm+/C>w$d>D@/TM&W>w/C><5y?WMj9jwiEZwIYEjpWn@lb>
Q?PZpJ pXkVkk9@kld/Y@SFa8%Zt*QAlIV@Fu&SYEMmjlW6wu?HSq$p%lC@&IpdlwL>Ljwm5ad+%SXDIj+YjbFa
qFBMLB k+9<16YE@lb>pXmDw*=^q/CE@^b>pXmDI*:Xc1J@l^c?TK#>i9qA?M@J\Q?E@?$CABL/l\WA$b<qA@@^
h1eA>L yiH@TN4>4S4C@%hKBV4@Q%$1WC5TI#AL+R!TGA+8^kDputqBdMTK6up9BW4!<GbyDLBGB!nKW+H*!b\d
=HmKa5 JJS!#8q1LEA5#dF<uem$5Qbt=%Pp:V?&XX<F$9&&FDALLF/&btl#/TnI1qQ5+14kGc<DX4i%w?jl=hqS
-AP5hc 0001057d4c7001202b4 Page 243 of binaries2.zip
JLtVnL VK$Tc+RnXP%4ZPm8hk6=nj1?E*pNP5qLnp^mW5y#XPuA1p>i^K\Hp9mqyT8B/btEETj6q&@^jJ11=k6A
yhaQV5 B=KB#BS*kPZZwu#daY8Ba:$h:dc8XK1qihZmIbj\&Pw44<Xb%&EeFTe/?//q1p6lEYMVKHATtEBbVTuM
Nd=wF$ wHe<P+?1Mbm!G$+FGpw1ImMX$nwX1^nMR1NGlw#qiKbhM>?4AjB8TQiPK=*T6c6yq%Q1lJRcC=8NI+&J
!Cad8l dkL\yKtNacheGKHbh9TiEV?jn#FAi%Y=GnC8QFTZXT=kRTARpck<V\eWDmcBA!<qnnL^qXbb<Rn\?u=y
WV6W+^ 4GnQtjZ9wMNhwAKQcZKI<VeIWdYY8@bb<Ek$IIn4qyP>KK?8YD^l1i?dbcXyDItW+TPDPQIVmL$=K\Wp
1QEimt ^/VWeXGB+D%5#@VH6Qq%&qiAD1GY=>@I+\*$BRS#X4&lS:Ft6GjWYmCwMw&aQj\BcemE%yXJ<G@4AWLK
&kFZ*$ p%dHCc4p&^QCh5@a9tMXX6AubHb:K9#w/9Q//KSF^8:eCABIlaAV>6:ymk=WKjAkw$L<JpQ41P+N>Th1
44$lkT 98adQGMPG\R9>VRM/cleW$ABtlPuIbVN:S:hRLHwyARl/TkN4h&/Gn>hu9:S\aMZWtMYkkDdSZub:l4$
L>l^Jd uSdH#:iV#jjy&>>%ZZZXN5QQ4J5<%441hk=j8C:IM+t*9whQ54hMD?#@8qdD/<1&hnWt49/WC9DeEL<?
q5dcVq J4IiKN!jWIC1N*m+QGD<bMDwQ6cZuwP&4bWT5YMm@?w?T6KStpqi\tcA@VFN#Z:FK*e!9YG#CnG=jQ\=
w6peNF B?EH=ZbA6w+*RPMMR+8!d1%!nkAAVcKGaX9?WH9HG/IpSXWJ%=DRVl4^d%ja8QnJmy14q#jQGC<lyZw#
AR?pNn H%?ZB/W8e<jIEGWL*dRp%6h<h!R=alXYPF*&iWHjM>K111tNLP1S8Xthj/WjLI61=PN5Y4Mjt68Z6tBC
9@bwBJ *#V^m%N%QJ8$:l6I?4!W\Y/?V9*!VGA!!M?<j%8$A&y4$ipd1t*XI<FbED!e<X^ML$c>JC6ubn4TpB/&
/N:lR\ 5uTnH+%lwn8&TCIdJ1JubV1h%@P&J#<qA=L%DLEyT4FIVKkL9+>ttSG4%iZ>yMTipHP8&9!JkLeDWKAl
GR!XE@ jQu%>e&:%#yIZ4bN<1WdBQD9Zt=t!=1lN<^I5656h/Ch=GDRLF8Q6i>/Z4/M91K$9tm4YT@Pc:i/#Slt
/=CS8L +=VkYph#^yAjyTVlukR\=4c^Dq\\8Eh/4ePbK&:kqLHq1?iqc5NcMiJpK@9*NqRK4CZ$l:MVp=$^MQ*L
<enCKW Bi9itXIpaIGabmYk4Ye!R!&^qiQGa>:Vk41JY4lAbAA*6:*YnwS>mnu*Ll6:WVLP11inL$#t=KdXBk$D
JHpKkA C=H#$RA=dnIj9XTHZ6S+Xmd:?W#1W=B#kBy=4dnQIVG8?=SEMVHLe?t#uK6iWKkm8JZ&qPI>!KBH@qDT
SF$pee q?c+K%DJ^/1m=4\?XIjBw6*Y18y$Sd8yuk?4XR@mJ&L4imT4acD6l\X\*GDSuR=ei^Wb#i@<#J#LM<@A
kpTA8& /4y$ZX6PVudjI%&Vk>9?:&Eu*jLd@tymANuSA46&X<8kqjHaFG$A##W4ZTq6m8&MW**RhBQ\R!p?ajR:
6#I/FK wZ6ZdcJ$N^QemFNW$lT8w*Kp$6\M8W!k1dXMI&tGTYwVEq%L&4Cd>M@yC$iHydH9Dca9+ahtNQ1BK1ky
tB\I#4 :&$9dNp?T1Kb6uq@%RZ<SpN^*wTih&KbLmIqXFd%^ZmSFH8^eyk4wu+W>@WHu/E4V9#dq5&tJGQHnLn:
/^ejYe cd!64=qyI^Ye!&$WJn<haY$iG?w*N$p+dl=cCMY1Pl15^YIWFI4TX8=e@WKJ9\MMECE1^u@:96Q/jW<Y
5LWlpe Y<a:EhaqbY9ht5^W4jit$MX9?JBi*qe<:wN\1jDHQAc>9IW5:\NpH6uh&i^i8+P^*Dht>qGJESu/:Jut
Pn=H1T QHADjB!myQk5RH#E5h$A/1^M%^Bwb8WeunR\XV<@Y?<\DqBwlpp#hI85+QIQ&EP>uuI?i8$jYEHJ$>Sp
Bi>l$S 9/:8YPuBqh#/qP=8E:6$4Ei8Mu:+?^D+w4myj/Kbut@!W^ad?QuKwcJ8ZI!jX6QuFkMDal@Za=QVM16&
+%GS:8 q:jjJkZ+:!:MDBiZdaT:i%n%<\n+Lw^bZ9hiPBmIhQVmI/HlhSc5H^nCnVkEDZ/ctFj?d5*Q5R6K84!l
pjFBH+ :h:Pe@%GhX5BV\>I>cHqpRX?D$u!P*W/:ZTZJ8+PabN:6^DZ:mm*GKT=?d1Xjb^46+q</Y:P5%%8i$Pu
\=$G=N =Q%I$E^%4IL?Da/1q4!R8*hhB%c&WIMAA9QPt!qFu:bWDIX:\Fu*VkKwEq+Z/MbqTkW^nk6>D#&EEB9q
ZEn#P* %R@!<?qa*ClyClMIJmk#<m*d&niNZk=$I#w%iQm8iHj%!6T:tbke#G+paeMY+PwD#VVy+Z^K+T&I/qF:
eNIm#^ @5beXG\=NVXPTw!/^$c*+\cj%w/?<EVI?hLl@N8/k&!lq%jGBjqPZ$W:\M:<?\eN&F@denJ$G*qd*+\a
4FAk&< !HkW%D?k\e+n$uB@WJ!+S%+AeuP&\d^V/aE+WKD!NT*yHRjwb4jDEqQdF/NH$kEE/49yn\uG9G+9C:PE
RJRIFD Q:+?<QGb<KY$K=Ly5SZQ!tjbtLB*Bq@qccjdP9KMBl+FJHd\uL#V?Yk!Du$8$9WlE44e61RcLKC6i6q/
=hM*D< 5\#8et/bT^ldie+m^>Y1LN$CWwWw\:W6a#wQNTSqipJC8al5db$BP8Dq\\=ZeVWM#?F!^!eB%ih:A^Au
?@h>Qb aKjcE>hD=FeZ$@edJ:ih5<^5+T8YVQbDdQ1AkyDwmae>NPdhJk:=MZw>MRX4MVp><Aj?cP5^pJu>wda%
WbtI>t <KnIb^GdIyFZVL^JFt94G1wadA&ERnyYkT+e8uaC6uHN:uFhipj&Fu%YSP#S^FWG%5jSIDL^D1\KpP<e
/#?>=# #VuS9LF>JyCXZ6pq5XPX!MPY$h>t%4HWy+CKGwcGX*SERGKKl^@5lJH64N@dbXtHHSa6XSAYEm^NH#a5
kY<YLH S4k*n9w<nEVDDy#D8Wci:XqGq><45>wEEnLEeDEF<w$6=W5@CBh94Z/kn>Z=lJ=:VHb&nM?lGBYe$FaV
mh&=Rd n*>c:pA5IC5&ayXQGjmyen#m5YBFJkGNam^cVbclI*4Xp\Th%cNeI6Qm%Z8juy@GQF@4wjy#P9B8yt9D
Yp:NVa i%YSNDYDub\c1d:NS4C<^>ab9#QN!+FD/Kd&=bHXSVch+THb>T\MmV@G\H?V^F@D\N>wVSZdRLlDab>!
*n$N=\ E!!YhykpP#K$4nyJcXXpaS+DwADtKl:1ncL=dc^q6qc8Kb$J=kNjX56^5DKqX+:5+YD8\DZc<#PwE@\+
lQZ9ml I+R=Jl+alA?!<&bRn:TYDu5*1>8m8c/T+hcXLYMj>K#j+Y/\nbkqqjQmXayTK&E#/C1TanpN=bm#P<R6
/?Yl@+ iB8%LKmem<GI&F4:uRBlt&XQCjwM4F5\LN6tiWYkPE\Z9C=>?:Nk4/L:pBSXAmM@jQNeaQ<+V8!ihPBy
GAa66M YT^MWeibR?Q6X5%:6?PGu6G4Wh>M+l#q<uEF4Jj4uFL4IM\ayVa4VE+>MRV8uBe+eVpFAQKeeD$6<^Z$
iNA+*t 6#:NY6DTPL9Vl#WqMNKthHWGd&IynVJLyZCIF$WHI+WTp?ykiT8VeXBN>!LBDSVAT>C%RCAphX\k?L=#
JIacG\ PG6wq&?y@iR/HmW?H1ZpALFDIkhFlJZ!I8*\Ln=PwYk*Vt9$T!4?VD&Bbu<Xn^8Rull<J&Da?q*E8kJG
JL>@Jl XNTG<Xyb=C*$5wTk#:%<d/MV$Nd8Fq1tG?$^#KwcTbE+VVH?u1b4nm>4M\ZA%%HXKE*^JFwnF:%ZyItp
^Vy^*< 9l1c<N\K:q&EQeycpe^*q^J5$S6Vp:F!q>?*>VDh%kq?apw=TMF4\eM9Mnpl1X^Vww1MY4XS41Npj6tN
BiN?J6 N8\VeHB!a>WC$#n*!+=@tm$Q$?WW6%:QFInm?bDwd5&PP*k/>=lqTa%T!*%WTR&mWeZK>q$&T!FY$dpG
C@IXuj 4Gyb6K\IpI@9tc1HAIm1MMD1!*cpGD\PF^qku&\k5XXiCpY+klC?NVLXc#*k5y&aRDCF/8q>#BDG&P&\
WH8dSy P+pe/DL@uFKSL/5nmAQ4QtRdnHpL#8QVcN5lJe5RXhWK&d+bcl$Yeq\upP?ttl\a/QYIiL<uHuQ&NmS9
8CyQQ^ YdHC#BWV+5!5%/hlY!DLH=%mm+!T5L<8e#Dq%%XS5I&ACNZ6XXtcJMni^4FNP:Ke5GD:IueiX:4CRdCk
NZd<>u 8aMnEW%a:+<t*yJj^8RK9\<:Lja96>N4weHN4Y+L6LQZ&XG&A%QaKdm*Fwehdlmc1W5t&!qdIc:wC6Za
$n:uJ$ Mthbh8LY$&mMYH/SPBMDu:HFDnn!t:+tnilZah<8P+Iw<NZykF!$*LBdFW:ZSwMHSm>hh6Dyih8VheS^
pi@DMc N*DFhu@l1L1uy4\Na#4TP?KP+d=q1D#V8*:XjkV#^Q/XtDL8R8t#!</?p5S#n@hwi66Ya!9!DVua6qBy
>DRDXS J1D#AInWnbJSh5?VXZbBdm8M4Z$RB9kCHMQ*ctlJ5L=tun4MuZ?STR/mH*wd#E/&W5I#NV#4L5\m&bYX
?EmmaG M\6D9l?@b5Xt!@9JT^nuwj8ht*%u4^9Mdw=LNnqj\8nT4WGD*EyiERb8G#t9>mXa8ct4iNE/?NDCZID>
+FIMT= TNXSY4a%qD&1m^ihMA1=$?D9PbY/1JaDKjqPN:D\ptYDtJNW&CQ%\dc+i*lXQL\ny%eT%LQ=PNH+Z9/a
9QRaDh l<Jdc9?F*pj#h^%\J#4Fj8Y\@&5J4Q>Jl@%Q^c<8:4CLC9*XaShFZ6llF@%y*Rta<E?<JGHpZ>=L@+XQ
DcuSZ@ La!/AQ%Lq%6a?G@SIlilj?X!C+9?HXwEilH/X!/*CP^9$jAL$EK@en%FEH?LSq/E@1X!wd>FZ!VYjyp5
wW/cm! LmL<6?mL^ByC?FjSI9y*cNGL^N19jW6S&N@D@%!4+D?&lj>*61j\H&wXIH=YVA5t?4PKXZKPLl+ib8=*
?DmQ++ @%kj/6?Yc@lX?hk@q&WXEpGK@p\E<teFE/Am@#j=?5LJ%&9@J=P9#X^N/WTPeKn/IBbqLI\AQLJb^lA<
P=Lm/X *1Wy!ZJd1nyk%eA@51$BNN$4#*6aaBJSpjRKARu+J?IhJE9$6<cLNC:LZbN*yyJ##L6H%R6YHmIDC>/Z
JiD%b< F/$q6jn&=Wa$wSX5^DW8nC4$t9S<Rkkb=eaqba>#G$V9Jee8KmJT=h/4e1AZq^R\c\/Va4YWhA5j^qaA
+!Nqli #FTcbqFN5L4&SF+liG:\GBWpCTGEGR#A>@=&I@:h?6SM:QE&E8/?*CGtKunKe1a>Ge\8QyLL!uqbZ<K^
#!n8XC Zi&X@PRZcI+W!djyQpYLe%4F>1FC4p81!&bW%iMYVWj<5Z#Yw?46$w+VIE%@R:p=$lA9:>w:GX@E*!Dw
iqeIZu hmh9JWj#jWQGGd+TMbpBuML4ykD^eFC6^le1\Pl>ZwLlcS!NpTmjIh>9BtcAnah\6::b5JX*nt:^L?eP
wmHkXB LtHH#4?S*B5@e<!nApSqdymF$K=^J6!mPnTYYy/d9P:R$aaywqcEQ^:pGjmkiW$6qqVbVX8P&pPbRcji
4#yd#$ lGt+R\<a1%FVh::jQ%4&tli?**#/PqA:BeJ$9SbWdt\<Y#dqBIWE+HSKIJQa!ck5/qF4#?GiN$!yRQ6Q
e@jRCQ BJ>wp@H!9tn:k411=DwMlwnPpTZj14:%&wckd?<#8=iJqlFV@DW:S+#y$e/HG^Q9VCRmFXCDRTKLkKQW
<=pkMW +Y@n%wJK%?j4AwBm*^CNw+/D+NS9wnih4+htW8pd*QRbH1Nc&Q+PF6F>FQGc4CYcSp6D*w&>@%KX%Z9?
EFGMP4 S\SY>HC<4MET4MbG\HGjPVKT6@\N#@uHAh^XlhH/YTbl<<mE^FynM=WR%8B>P/a^tF1y>EBYQeR8IN*W
-AHhN6 000ccc8fb73001202b4 Page 244 of binaries2.zip
d4l#a* 84e/5>cd/VKhjbi/1<#NT1%&RH#@I@Xn4:$dXe+pWlSP!1=ybnj1/qLH5ueBq$D>/imEuudyY:hAJ5AC
1X@RdR D@m$H5t+HEmHqI&&/#8l%CZj$c^<QI!ydEjP<kPPNKnAP=+D=hIVjdWXqy9CZ^K!mAYAbBC?=uYLT?N*
/lQJcH %?#S&j\*16AqEeTHGn9BNGqne\\talM/!u:Itpj&bbamZBJ&y$m5LNMLndWBuY9lK^\?:%ljD^pbV:Aj
JciRmm 5jeV94?Eu^Sd>y+JF?lHIXZmKMq#=bIEq**\p%*DY?$=MlX>mX!YbW<Vh=%/Z#TI%e:ZEN!KG&:BJkG+
<T/w4% PyYj/qeaeAyR?G9Q:L=S=I*d!\?bbciE&&9Y&8EYiT&>%TF$$T4^h8T=R%EXF?eBQnSddpmW:pq491qY
ldC%6: p?/S>8\F1a*E9ljRe!#Z@$C<eHA1m+Si51!SZuR=mq4d&W98BTBZjG6*Z*XQSd8E6y!QT+nIGcu1qtZA
^<yX<C Wc8<@<a%>AZmTS$Eat=aG4=S%TnD?b*/18b?hCqYCG%Lky5#j#6YIS*K$@d@I?=cwG4K9:>TCWWSKtp1
clSS1V 9XQPPh>##n$*RqPJXFJJp9pq9h<ptnFMpwbK<5k#BlWl=DF=nKE*NbRiCJNlqEeIiVia*#t*:1!^y8@j
ENl^DQ Z4j%u>?!Y88+>:9Q8b?#>*j9#*j9jd:uF$ZhP%q#ub16J?@<#W*>/KuA1wd/ma/96Na=nF=6^yke4:88
N9MkhL I:jdI*&Pc>!JGW4Dj@Z=RWG81YH!+I>B91qlc!au1Hu/uGpbTn/PQ4Vk6Xhi&@+dVZES:chtnL1ipG/!
Qpd/K! P!mm#>GeC?bJI&:?HLlhKY:tD%jGNaiu:w$&@*BKTd8>>eCNJdEVjYK9%hh6%6#9=V*%V1TL5lG>!Z8G
$kGHkL nhu4e4M*R*<:EFc<+E1SS5YR^PPnQ6k864^*kmtqn$<4*SD@JE:HP5n?RFba$L#\/iYNwkH>LCQn<?@F
LRi:nw =ZMmY?8NK8y8h?b%LDhQ56<?bA*>+E=Y/aG>bpM8Xe@QLL^iu*Mue8QaT*HHL:iX4:#>IdRpQ$=X9d1p
*wQm:D \im:1KTnZyZ#V8\JhHwiEX:5HLyQ%GD<SiA!q=uPD?@5aBilyIk:H/diQ^K$l=*@\Y94L4i*eW619n?m
8kc!ZT 8*jdYB?#NaM*lAa$1n^cppnF%</%Q:@KImScajCj&q6>&b&lX%YPP5q>+idSwdQQ\!q$W^%#beH8l1uI
+bK\tZ bKBFXiEw6VI6P?1h5+yI8:iS>an=8=i1F8>wQGkWj>B:?L=9XR&Q//@e?e+<LYT<w6t4#iXF/>YVZZ%4
m*qZJ^ >&tiH%8WNC@:\8dJXj1>DV6&6Md?pd6K%?\Kh&*/@EC&JunlRcQ%9<*T*#&PP1LjWPdhh6nKRt6b?*Yh
hyYwQl $N!u8uEKKjYZK%9%E14&%JdSSj6Y!&q6D%djwXNejM<@^8bM:wnTAjty1%cuJF/@y:/yi6j+jJ6*%VGq
YEk@lc Y/e:t#5YHJ%^#eN+5:/BVTYdGiWV**iJZFyDZjC>><q5$idTpMl<yc\@uiw6dLL&b?b5tJke/d9Md??T
m55+8X EhGZ96:ld1/<yj=SL!@m@ei>J>!4R1kan+P@^@@ec<L\$y?H*l=iymEj=&X@MqNh>Zn9JhuySmQ#qELZ
Sqi?9Z Pl$e9$>dhX*$%98l6jb6S8H6tqFKB&hi$Q*N:MZ+pK>MQViLJlbF*&!KjFTY1cCnXth!^9*%8*6cdt<<
:\m4h1 X<&ciDQQq^#WQ&GZR/Z##NIlc:#njL<5cNI4?j*S1?#R5Z8aKMQNy+&QbGRa4*%5nEbZ49t>^4ZCE#Xp
q>XmWZ uXun@iZe@kq:ym<c+jND*LeV=ukP$XH!i^E^w?+M&yX=?Nk#6!aDy&*QF/^NmIu:I<QA+Mu#YiFt?5NT
A6:/My hNmB6u*WLde9NF!^:V<n4K1u:4F\?L=JP<&@lhJ<>qHL4jut?>Eue&IH49&lMdX6$!<yY+=5EqZE!?$a
AdHcYd GZ^+#L:b<+55ZqV@jEl8=196%teYjhP!VX=8?%Q6=cQZN^dX!??jWiHj@<d^>!<%d9nNK=RLH/X&d=9H
^BhHi* $$h#*dK5^:TjKN!!5Kyl#>!%d^b1iPZ8>nJ?+PQe4<L<#I!W^k<=lppDL*:5=Za+>P*T1ZuPK:\e!$+!
yDAVMZ F4%mD>=cE%t+=euyYbjP%1mY6iRXyEj$K/^ISFX6d%L:wZ*&QubYHaV4t#AV?alB/<wjV%jwcM#%:%j?
NMIRj< #dQi6=!nFJ#Xkna@W@a@4&\d4DLH>cqT=FWd%<X!MatdHRcw*15i*#jl#a4t6tjG$Yw:t$PTw$^T?=@j
FPi5Wn GGV@ZCuEIGdpLWjF>4dd#Z=lJu&uSC^<6qd%eFJW9+w9VX%L%Rw>DnSZSuuYPJVXbF>WMitZbtK1atV/
H*cn:e eQIpq*CDH<8=:IDt%q46ia<?QmTMQ#!5QnZT@CeuJ*1=5*ZRQQtw5>FY@wYGlnPY9#&Z*H\wVV:P9C^&
LAlimt \A=Wcn9+i$>9C+%n@wa@Gdi4*88wKl@1<X#9>4PQVmb?LWt?=My:W<w1%mX:=TS>m*d?u6We5T9d&uQp
5u>=*b yMWZpZ#dCQWyZ&6dleTQ6J/=::=Y=cRH#Waci#e!b4<G1Be+*%8nw&k+JiG?n54Xq:jVLq$cY1&1ZS*t
!WA?a5 Z%&1eW+l4!ZHQh&9#c8$WeXX>*qq816D1$*ckQYBXJVqwQ*1HRp8i4:N^ETH5m4F1?p=X:&N5yXZN<c8
\M=iZc eCyc*dk81TP%muX?RN>wcX5TdD+q6b@jZiI1ah#p:tl$pRyy>@c8iYQ$eLTtRwiLk@?+:#hThlbtja9P
:kh*%E QX:k4jja6c#D*e+/<wGJeY?:ZuWBnyhI+<j!*#nF>e+6*Gy=%6j%w8@h5?uSX8%>*N9hamc$>Aye\\bP
!iG:L/ eB5\WQ84MwXNS?4Td:i18N=/*^##JQnLRKY9LbNP9knTyB%$%!5?GiKwKq?^eQH<n$F886HIVMt!bH#N
T=ElHl /NGYW=Yu=V$%!Xby5=y>cJ1c564b&k^!*wc^SSWV!#ymi$>Y#Ke<?nZuPT<>u#aYKjwH4#Id/Bjk4N+/
p^VtYK LeL4%1Y4e/w%m=$TP$dbZ<q>\n:?nw5NeC$4ey<++KjWb<==i8YQB1!J#T8J*i\eQH^I:Jp:#R4%@h?M
+=8ZaT ubhT=?hZb/hZhP#wKtKLkjL49Pa?^lqZ*\Thjq16MHZujh&:9m\tCjZynyH@!!VWy:6Q\yNRmQ6uEky^
upF#5m pCTWdXSWND?cZ>FSZZ9y$%SZj!l@RE5QYPpB%*ZATRh#$5HT!@FH$6GehLSaPqw5HT&Yuqw5HT#8Gw!I
CYP%eC 46+e@wmTjpSLD/TDTPqZyQT4LyZ\B>I^%F<uw1TnKiqwTn1cpw=GlQSAPllJB!NYimIpHW%LS>QT$dS$
1<a@CL NC$>NT$h#EkHM=V$SI^$NCMh#WlH5>LS4QVW4HRMK^$n?k8cXFqI1m\pXScTKk6^j&&G$bq$qC:>?aN8
:MHkR< Z=XDh4PQKTqtwj&>*i^n?p>y*L/%bDj:tHanniptw:4b^:RdcW^9MhZNQ1dhTBP+c%MAcWbMa/RSSB1V
u558mA ncK/&ei$G&tY^Wk#EGtG^Em#EGuMZ5EWAdE%*E8PKRJmc*@jDQ>Vcam6$YLMQTel6pb#tH6PRt!NFmGM
%59+^1 NMVYcJdATEN5nca^hp=CdI%*j^lymK*^H&GpIdbGE:l:D4E%JMdhe+m6Ie^i+BRJ5VXeX#SFRY\NIb\$
INj\FJ ^NcEiNt>NMVYKDFPGtJ4qAn*!!G&S4Ga?W%BdI*C&VpF5VWK+c+N5VWKb?eW^NaE4>?>NMVYTE\Fn$Kk
\NGpGG GEyn>I%AMSVu#^HE%qkTh&%RDBXn>I%AMbVD/B8BammL$VeC^XAG+>eRKIdTPH&DammF8:aaFIE^%/bB
bQF4CX MXTM8VaNm1Ee:61\GI4^=#RwltKic1JwYA#FZS5WR*F#nAdFWB^uwtE^FGQuNCmG+nkVDa1lIw!?GXAM
\het:5 ^e$^BlSDMS6$WR#E%lCJp\dFWDHGYllRDPW\%5KAa1kI+=EbWA^qMB/bAeXRGlMFGXAMSVl4EaQmN?ci
LcN&:M 5\RwjtQ$#bKk?I&==!#E%4C6BSTLimbPk>kDbyc^VI?p&S=Jm*wp#jXIY6\V/W?jwdPX=Bp>>Ea:Su6G
k5uW$e <@L&i1Mu5%cpFWu\4qE59HbC#>VN$e$1JmDIVJKk:E\$TqKB@Q<<+9\ZTD=\Dw$Kq?Rb=\4bWKE%m?Fw
iH^5eJ QTE4^@A@VbJNmy+jEDmj@=KR@Q9H#+JSRe\W?9T%uh&BEp6ApTKSTFbRAtMWYJWEFK>BCCkE!lFl=8cu
JNwK8P dad@y/a+XqbR9F6l?L51LQMbtkCBAyFZEaaTjNy8&B$wE9GwPIJk?YkmI!l?:T/AptkKCE4WI%AeFBSH
>!C$aa mGYhW^!9Ih=WJKB+\kWBBcLd8JDIAS$FH:h=#mG4?dE<=^bJRAt=M\AwnkSqEDGc+mmwypR<jqp%^aMS
l/Nu$* hZw@IcWHARXcnPIIBEj@@+PTcI4uGlJRIkRCBZIWtK%mKa/Fk=LbWXBmQb48hBSCAlRCTkSclPLMD?ww
G<*!d> TIGS!tl?QD?kEhMJmq?BRWCBe68+iwKakH5@S8a=^jGLXKwVFKIlwMTkBV?8#CGGP\yYhyhP/6F<RJCA
uwnJ*\ /uyN&PhA\VIJGJe8y9<FWI^R*P/pTVRBwpqmWIwCq$RW5&D8^+hNYdpjH*l=#mjpwIRTKRTW1CibE#EH
j1T&%B A<XjSubC!%ATWIKtwKDEQRCFCPJj$BVFi#/iPRw=X5SC9B<CXZJyDE6HBQW9cIy*+\IwmccAwFCQRH*i
kA4*jX WSCh11LFlM#pn?e#\9a/EqSIDELF>CCyl$DFb+Vl\\lWjMbLk=eILKJph4&<l?I/k/Vk/!E*FJRq^iV#
KZ%V:l Ecm1VYH!8\lW%ebLk\M$T<1e^?CBC\WV!R&qRSaKKyhVtDIDItp+KJtyFE>$lX1yBBSmRcBAiX%M>RPS
ydWX<B <CW@JdQy<@TJ/1JTFIlKIXCBu<IWbSAJu<?!W!pSI?GIAmlTnECkRJqw*H!tQl8k/c+A#em?QBFA<ZhX
c1qiiD iJSR&AaNAI1CydlFGFB\S!Hb5p5&Jm?YkJJwCkkK>RkW*FFR5m:=lVbHXyJ6Ruw5CRwuXE>T<wlm\XSK
J9YI:A bp$Jm$iGZ<RLwBlR^ktB8nNaVG$IWh!@AI4uJk#DL@6=X!8<!^wCCqSE\DTNIASp<lRy?C<bRXGpBJSE
dE@Ty= W#BR5H+TLCkKq9Ap^a#McVTcu@aM@#MqwGmRT+e%1tCcwlCm+bWSYSpFp5\u4lMWIpCkaB$\tIWpknMK
jGW9+# Y6a+JdShC\?!T$CSIJePdK*B8HREb^TW#HPKB$S#ZbwmaJwT>!DjntkCVtlqyWuCa@hCTqwASZMkVaGc
/M!6@+ kSkTw!pc#mkItaM9#!JwyqNV6AmpKXCZEWQkNEZD9S@1kcQk%=!hwGkKBA1WG^SlZD4>YWel/m!lMwVM
uEtpJ% /!tcq=V<WeIjKDpD/w9ChYRntkPDE56Pp$RTWBJNAWGJi\KK?c!naDyBeR\l8/NkJTawQAKFaN\Q%MqF
!*<qZ= +:kjA&RWFE9\Fm\nKDHSFaASGBV1ETl\dyBm^LJQKpyQiE^JkkyWR$WM:GEBVJKCAZwKmn<u%\Pcn6lP
Z9#/</ <whANXRE/t4DQePAGA:eReLIHKl+cm/+JApwWA$Xkh4qEKcGmqk\ySDJV9+ED+E/KaWRkkCkRH%+CLPD
4tQI<A Q&I@/!tRSFME9=+T!R^KTCX%?uRl?\WBlWA=d$!KF6Vil!meuypiTePZCEltPmPmJKWb+aaKQcCRG\yK
iBwS4N PtJNu+Qq=!niVpmbmTeyihSEiG=WcHmFkAIqHVE9FECjd$kWTapuLjMKqR<qAmmJytCkRA&JiFCjue>e
#M**Ek y?iqYNuu5%Dt=F&@BBVJkWCB1lMMl1N>9mFSCp4+TdLGTFcT/^dIy@C5KRRW1D1BiV+Cjd+l5iicElm$

-A1&n$ 000a9c03981001202b4 Page 245 of binaries2.zip
TeW&Eu AE1mKTAwWa>AeVBRBMXS4M#EW/\u:KIwkBL&tIPAkqWuMI5=Dyl$yAYj*wMaKd#CTAKKBiY<PXl%ApQS
XECKV\ 8H>5#6eq?>jtjC^9QEL?p?&1AHu>:VWpub9#wZ@8m+e?:Tn5:4^@dj4ZXT:#?65?j<J=YcLd<*c#*^:N
XZk9AE EhV@?F$unL$9<WPtT5!!mG<KtK\Sh^TQ&H1/p>wyA@!*Vh:RdKcqw1lauNuknp:=QDGR6>uSHQhVtwQT
$!J4!p itMF6$CNVW=J?%jLW%TBa@Je<tj*kYPG1jdydZ6JPe@?$I^p\9^KttTj9Hn>cyNl!kaZq$%:$DSyhpbm
qQlTMP !*u%Xe1NRjSc%i#B#@QKbq65VN#4wdXq?Jme:Twul+#dMN@Dadn1^MR:t/8?>M!L8H@1a5#>T6$Z\YE:
=AY?6P >#@^ud8>LuGF\9y=GXZ^Gyt1d15MZ!@hh&/@8XYtk6#Skl*JIViLD4D=5VG@pIhVE5%HVe%IjH@P##&p
J4YBck \F4=/LmHiT=*q<qq&@aK$#Fbh8#55@%l@c@YnqJdh$nV?HK&M%GRh>t6bMY8W1Xn!ZMt@Hw5&ZbC>VqF
6=&hMd 8X+qJ=ZcJ>*YTC/iWG8k&D9?\WtqhZpVDQMj1/&<Smc+8&iaP1qWbCV4q+^>cq>4q%:u5K1p<H1?1j%/
bTAJ#E Fd8L9%cq&#*RnNFCXkyVNewn\lJ@*X?e+J>jQeh?<FnZqG*ZhI>b9pkai4I+j:Am*e8>WtiT?p**&lZ>
biXV># +?ecy&X99X48VQeKG/:uYZ4K+@mG%nPc6t+H^?6eIF5t$bYDNGNHKqIl6ldJ#t1*Gm:wK^Sw1LAc/@:I
wQRJ^M d%?hwHq+bP/lW#:8NtqMa:=%t<bAJK?PclbNCNBK*6jKcmjuqhN:T%CYTd@1y\$9%E^JNh8+ZN4ZJj:p
M#BQbL t%!DdiXQ+:VGVH&bNE9bbqu1Cai>4>cuuN/4<YS<AGG*5+VMd+<5>4S<*uwqXt=/uJ?cq+6*6E<66/HF
9Fn%Yp QutAR8SW^WHj%H6+##?th4^=aQ\$m*4%D<Q$y^RcjY<$/dZPSm&jK#1y?k&yZ/XcZNqpQT=n@!K95APZ
!#l1DX ZYcq9*WqN4T?t*u6<yD9#Bi%@#:enYVL%6??4KSZP!e/I$VLjhnEu\:?>1A?K1QiFc$+ZdNki%VXYj$J
GB\#ea M+?Znkt\G*ew:?Y4py#Luuj6&6=/BYj=i<YHd=n#e99R6nGn&m^h:w4V\5X*\=NT%+TR4+1@tB/=%H*a
5*e!&Y >Fiy1#eFDR\iXyP@ZNhJc@IJT>Kk<tXb>t/4\5V4Pe\W=$*P*uQui5^==<Qh>&QeB<aTV/8G%NI=S$#D
NNYc84 6X*iP\/@<J@ayk>$$+@j84^&<HWWq<jYyF\Ip\86W%S>uq?\\Di\PD^tyq=#AZWq=NFWNWJyANpwu*Cn
wmJ*J^ aWiGycZ?!cH=!t\@>\8YVk<itlWNX9DZW#bXLJmhZh^m@!J#$LnFDn>8GPh=<Zd@XYc&lm9V5^d+Z@eM
hZE\N$ j^ab?14\qEQB$::95pcYG*$kqq9h$uq48mSCZFcW/K:c>GnWwthnc+=y?GjXlH4VKR@Nj:SQWi/>ibGK
aM4*T@ ta%ya1?LJ:%P&!/&Z#9QcFnF%jWn9*NiqV8l6%&C16^y5+nWK<1HX!a%d&yh+tIT5j1CjH!V&1\?$>Re
JbpT<! quF%q<NuiiR8W!%Peek?Pcp&yhDt@FJm!N*>q*:Sm\=d<ZmM=aLh5/:N59MNpuM*QJ/6e#epp8!9\mc@
8WE=W? <<8aMWw^8Ynb+eFqF%Vqn6\e8</l:?Gk/4P?cjd#R^<GbD:+p=y>h?6@tV9Q1Cc&hw>HCBGR$EFWPAaI
$$$\q? EH4KVBLAk1CB$E8pKCAH/R4TFERPepJXWIw=qKn$J1DTFB8KkIIkTAedIEFEWG!IHpX<=Z*Q*LZ8i=l%
qIPM5S =:488>d>Nl@t!e#P<=@>*:NuQ:>6$/8Z*bC%ND$8eV/t%9jCnklX!@^RZdd\1N%/1ThhSdkkM/@mVbe<
IDI6Dh 8hYT!Vl:nFBbqqy>1eT<L/lSaM6PaKh=FbdETp$+c^^5>*e\a+1a=iATHLcW*=i$#:dm&!\yM^Ty^L\V
GA?WQb unTEM&Y>Xy#mHPMtYFStmQ8bqk=plFcw*?CGaYYpPaJA\P>p1/^aPh8mXwFXNp1>/EIyT:M6\tL:yXqP
M9/4m: jB\ndyG&w6*/*4d:++K>y5h\>#t^n88a8+*T$wZidha$RYE%u4X=h\eGMytNqypS^LB$%kYF?mZ:e@Qm
KueyEp KiThS&VC>1*:lY*yiR/edTKMwe#@TNRljLNR!bt9!V^&DlQjVu#\=c4^RLPq@#&B6!SXc\c9!#HXM+dZ
CA$=iX ^<N>>h/d=#cjY&QHdR<TP*\ZI=6#/Nby8/Z^:VbHB=6SJhtCe&YK4\JSV$HDpRd>\qee:#=P=S?uWR<p
we6I!W !@%%BL?$n\^peAcXPu$d6qWclbey>M5+JC!p<BV5GQtmuZM=>$h>6<wqP&?:4bI/q/8/P@J^IMjQh:Z$
KCq14d iIE/tiaYcGtaQMX%1GyB!/j\h*w8KAc::46NHNP@GPRiW=TiKPc@=:j#%w+*S=RP<iJh:q6tlI@*!<du
kR\&X9 Sd>RCL9mTN*KjA=kPSM$b+F&jR*9\8wYGZHm68F%&WicP5/?4:51iX#IZW>>V^hqt+=NyqNnGDi6n?CD
i<j/C6 Xd^CacM?HMy5IwlYbF@qR\&6M?=&1iGaEQD:44ppF^!1^+d$&9K8#SCLhC@J5AiHbAihHkjjcqY%dTH5
CHijYC <9!8Zt!Lj:*\#5I$iGP&VqS*cCB@>:SK!IBFYW1!QK%1ip&8jIqd!hY&LSP1mt+9K@^9eeGpMd!NcSBt
REeW$a P&dh?5c:t\TFHVcMF!y!DIyV!4bLm8:5tEt=XY9Zp^G!>G5FR$#DP&VKNiD4bE@q8WuLM?1JF/*pGpM&
HJmy<h aHW:*Y:h@tQZ\*e8XWQ*Gh>bkdEBVpd!$mFdL#?d6^#+k>>$E>+ua>%hV9t>MjNHW$?\LH:\/h4lA@d/
elFCk? u%5$PVq*#H:>e1*NMWY#4&GL8EM#:^Ln\>\AH@56btb9ccKQlSR8=m1j>TclaeKV^X@:GF!*+99%=Z$m
D9!DqY qbuYTuiX=%ny9H\e>6$6LVd1%adudY15nFpu=$<H4$4l%=^*54ql$HFLWc4pXaqewN<bdN1I9tL>?hBA
<ePJY8 =w^\uP<$&@tM%VSZ@u&RXb4Rh+J4*EtJPDM*Jbi$HTuTn*H#i/TNJNPMQb?eGb$:@hBGehT%5bJld?Dn
RWA%W! u^41w@Z:5he1G?yQ?hIJYQja%weD9&*K#Rqp$dh/Db+AyR#/>#c!Vl6a@yJnX9*!SqEV4:Fj>qX#tEnt
wJTS<Q iaZ&F?FYVW\#DhTCkGchSB*888Xa/i5p?pSDSKH+N\@=&Y?Qi<Ln#MK8be:$#+\&^AG/KAeF&&8D>8AF
meVIT6 dw%j><#*&6<&hQ$=h8#TkE81&ujqk4HA!tMKKGBYNjh1j</VA=$tC5uee\KPa@d41Fm?+hqXYwqFhtdK
K!@^<> +q<1>HHiknuc%V9\+!>Fbl4LE#/<ceJ$9Z@b^d*e>cWH8@SNh\mn??nYPcwBY>?nlH\\li@Q+*GCkSM^
aXuRNC Tu&j^hFhlbnN4<<+E:/pBYapcXhEM/YhqT\Yjc!mH>\j/^kNI\n\Y>l>c^t^\haiFuE=XbuBiVDV?/D&
6+56Jm D=VNb@+dLtd!&m>!hTd/5IVSA*5^u9\Ppicd#J/QEL&!SN!jwNE/MW^jJ%>GphK+1Wwtm#&&b4^jlDu6
k8q<>M JWwjXQWFpnT&hGVe*4jJW<mNFiCSZ<a%8b6W%>VZmc+%DZK++htD+X&&QCd:XL9+R=ye9*AHjwwuij:#
YY?%cX VF4WeXW<yw9S@#LF*qln@JZH$@9H!\*9^1@bFDHSb#bbG!X?e!wYjhk+8maqV&#!JM?96q%u5%DA/KTP
Shy<R4 >F6G!Qe=K+Hm&naCIIAc\c4Qt%nemEeZHtdp9?nm%JN\8GB<1%JQwQCN4>Y!L\P1w9*+DNPdF/5%G4Td
GSpjth 4FyGi>K9>HR!!DZD<96iDS!#PK/&EXNF^:tH&C9SFIK\1!@c<9G5emVMNu8nT*kuq$RqGRi+kl$aAXGi
cInFe+ ^L6y9QK%SCP1aii?XWV9T!q#w/%j!L=b!8eh/5>9^5*+i>kA+#bJMW4pHKFi6I/EZBL?YaD<EnH@5+By
R!8%RM ZGteH\>6/qN6&6TBSw&L1FchdP=?>#:G!e9CZP%CqC&H^I?#tw*$ISic%ZBE^jB=@86N:4Fj9NHIuyT$
&y!!*# LyqR9yjbjT^Q9ti@6XpQ*R8hYH%awjdRkA/j5TddjuWjbqyNTJYE>9S8d#5iX/RccS5bybJp##ebJTXy
MJD6q9 $l5hd9Q?!k9&&XTW4Y*c5Q58b6XqFnqhuYF$&=Q:HuMwX8k45PPP5pBQ4WhE>B&*S5Gn1?\id?!i1@Wk
a@#@Jn 4qab+^MQXjHNW?BNDqm&cXY+C4RJ$T\L#=<am9Db5LHYbNYh^RN:L!iG:1GFaGpZ:Y!LdSZ>\+Jc4c=$
%q1b<1 tKk?%&?!hTX&cQmy#<j58E%Kn+k<yTkt\X/!TPn6ZtKa+1?&Bld!La&+9!V&wFmlp1#+?8HnIwXCd\^N
:EV/^C <4NFdbk/T1cca88VlV94?5ky/\9/&nd5j:mlhMH%\yK>eeNG!bGZ>4/jT^jWam8N$^>KT#whJ=Tym6M%
&AcD96 &WVCSM$YKR%GTJkQ/4/VSKRb@1R=?Ta4=yqtYJCj?IZjTjYy$44KYkVLP\K4Ma/Td^yZ%V#AF^%/&QY&
FF1q>u 9/:mhHulVW4>tcKNcKqdM1G6Di=6t>LKid4Dt:X1@V6qd/8ibH>kBRtM+M5EHjpyGPby9QXtM@!<c@^n
TKYMcL &8w*<6aY4+KNQqwQ:nk^bBC!mHu9H=:GGYV6p*8d:$9!h>FXJF#E%#Wb9w%9EeZ@66=n<y%Zuu%45bqA
89+%<j kTp?\b?!=BT1dQTkKu91=qFqiqDjN18=nEiuVq8dj4jKiIan:#TdiTy6bGK?h+TYuNT86WjtIG/y!Z&L
E!W1@T +D&::WiBpF#m?<5ut5i%<#5ei:tF5=6eyEe6akuK@ADiXp<:%G8:#AF6Zp^qdE4&P#&hiq8F@k86F\e%
A&<Lh: mZFZSDF11e<M:8ywkky!LW<alH61LiknLPE/%XDN\VLY>4KhE1h&%\IG&6ReGT@=W#+8:=c&Acde?jM/
VapNJ= k>ENRVHtG5<F\*b6Vk&YEZFF&#e:jBDM:%dT5XKNMiHY6X$W#4eu%YwTVn&YE/\VM%X&>w>uQG>lQV>t
yje>&c emKK!I4Y?1ltw8=qt14?m%hQJV5mhedJLi!5FJqyHXac*hGD9<VZIF$hZP?wc+X^X!X/DK:*Jy/YPeZ9
yN5W1t ZDn8dNV6J#k6&wq*5a$<!iG48=Pq<V:Jh!w*kaXG<$5EF4Mnll+X#Ei=WPjM%XpXq<>WQdimKG&*JGpd
N#LmKW j\!\Bu6DqA?HcF?qbh/$Lhu#C!5XDKmh>tCwWE/?8YlDqqqpuHw%mu5yWuZNT\JIuXwkjRL%M?ujBI5^
:>&pZ< H?N%+#XwC>cdyCdbKSpSM+IJ5n:a^CcuR\5/P^$WyXVdYV+!SSPDNYuj%W+Li&aYNQWNN@j:NSldChcE
wWJ5G/ TL6@=b!X4#h/^FMHC&qS6Y9CKXE^*u@TcS6&6#=FDZecD>8/TZ:ZC*u1MSFFjWXIdBl#@cS9%j\8@GLR
Dy>XkL a*C6ZAC49YZ:KF?:MN?Z&+d=^JK1pRh4A^qHDA%HSC?w%4ZdtNN8:/^L6LLk4bJXh^uY*9nT$HZE*4Hl
IlqVBQ tb9!=P+%u&!/61kwF^QtQZuV?LM%V6+&?aWeNePRywKa<aKaD6NkH/X<R=HZWcdXQM1JIB?/PT4W!aAh
jH?8=m 9W%>HbX5:FD@>88HQPjR<PT5+JkShtpJL:#a*nuAqy!l4KaSJ:yj56dhhq&Hk1X$BC8pqSZBDM=1&h**
1e&#F1 DX@^1%X:$hG=PVJ:9&65!y8W:@y>+yXbpaGT9Ak\nSH$b$S\ttDAd:GXXWN%Z#!dS4A^#q6dM+R@X&D%
-A=M/h 0005862e5ee001202b4 Page 246 of binaries2.zip
#6&u5/ GFm1N=H%XC64X6ucqEIG6V=>VQ:W/@FR$uK\Wi9#t9VQakpNY^MFXApJ8pTb#>/A@/RDC8kyj6dYiHC&
BkCy$P qN$m*wtdSKMTtEE*XW+>>jGJ=5lFqRP6A9mwVp!bBQ=+=QMEV\u^kpPnHVt4+ka!1BuA=dDb?HDNFFa^
Sh@eM1 @5KT49D%jSYQul/QE%9h=E<Ru4*w5nZX&#1\ZXhE/&Xu$nc^5G*FR=<8nAaZ*\!\tnK8L\n=In@6ZdA9
Sw6>M? bjGK<w+AIqMaHXKhbPl:/A6V%dCRPMF8#c%&ZBPpNHBpIX$#<?QyWpejVnM:@:qZVcd9m\L9j6ytnq41
\5yZKu ku^@h9&iF<MlB#9#>A$<Q5ype5<eC:l?at&al/FQ^tHjK#ucb@VIQ8KLu4&qJn%Xhik/<aW5CdM%8dIH
S+DGYy !/+<W=PNcuD9nNNWD/yuH>tX/ey^Y@Tani1+:h>@Fq@!c$X*Z6ad/\^lj^*c6q^L/in89M#*u@S&dNDL
1Ck<jV *y%Pw499qy\=@Q9ip9WPc!M>jNjJYW>=H^?6jq/FVdKye?cl\md/QTccB**TQ9Z6GjlMuV8dp1bi/Vl^
MbLyZ: h&*pGClnQmL9#dW+Y6+8Yqw%yFYPqmP\NLI$CW=^:=MmqXihm/l>\^5NZG8hJc6bB?^Imc&<H9Gk:qPa
8981%^ keHGbHGZ4\d*4q@ZaAR<KyjDM@YK#:&iDuj$J9RJ+NapXly$Nd^nbmiJ$:LZJX/djq1$Qbjja1ne*Yt%
1AdaD> N$8#t1q=*djFVy6WGPjFHcFjFEnblt44?iD++Q1jH*WEyJ<5dp%@9Dadb:QD<emPF@bXFDS:%%$6dpiu
WV9Ihc y1njkPS6/mK+/:E/q%jj#=Ql#4D#y\=ZZ!*6:#dyJkyI4#>MZ/!Jb^:aZ*SypY=y1??GZb9<XelSP1NS
&8yTp= ZQD!NSMdqq%\j4DKJJt1JI:D4WTDyhD@d&m\Q+tAyhB@EkFLJj+hAW5q@8<R5AD%Z@8D@DkkR\eAhECF
K$&kT? D9/mmkIRL^cAEKRA6AZJn!QwdIlBCpDAYABmn\J$/KelZm\A<YIBQRl9CpDAYAAC^kIRMBcAkLHkZ<Ba
MW?<<$ AIS+5TDEm\YJELpXJEEuRiSaECLHklA=FwVI5TAbPlpC^+Jp1GpkSI+FIZI5CJFnRakeC$LpYJACuR!B
/?Vp*P a$Fw=?pjS>DbEDpYlMm^IETPBTF!LAlCJ$QkYBD<4/bB=FkRI5iCWQyAKH$kqD+RTl<IyR?pRXBcEELI
5T6tjW kqD/RCl>IJR?EEwjCKWQlNIH@yY?H#<E<Z=BKH$kqD+RTl<Iya>K@De/LVSH@dhb>d>@QcHR@*%Pukd*
^PwWew :ZmF4aL?Hk&H6KY5WE#>>&k1DN1X55JYRT6E\>WQ4XD#9EI$ZKGPHlqJNAm#$umF$8RXwkGa@%\QRBIN
BPZi+D 5=pZbaWK+lYmTVDjaQTwTKJlAE\WQTScA&EAVBR>JF1DZh&6l$S4IM!cP+CISG6\/=WBIlK6kVBwX+CI
EpmP$X SG5kDQITICLSGpmE8#aT4RF$8G5n$h1!1/$enWS4!?c/enRT4T$VLXcPS1I%AAaMC^CScA&A/XMBElK6
#E8>*e LX>n=YkpY1QAjGMFTEm$SwHyW\ETE1%SaQyWkISEc^TaQlWkIhEcBaD:#=Fwddt<ciXwJFyd4qlhPS1J
Fe<=I= %mlE8D6H=1E\GTMn<qC+J=TM#EMyMNHIQBTtS!an<qAawD%AS8clMBpnI@NR8Q?em5kFab+TMmIQyeNq
cupqIQ DJtH\4WdtajC6J8C#ENl&p%B=1E\9RMFpajC>ekWbB+K$!NVEHpwVQp1REHpwZTanFERiTkNLtPIQBRG
wV?#TT :RyREHpwDNwXwCD#WBm%AIk<FAaMC\DIQBV8&5k<FEcyACIQyeHhPTIQlS9qA5k<FP:PEZpwVQpdACD#
=@/bDn WJmuBEDtwVBQCaBEc*BLnRERmhdIMM9bASCJ%8BR@ACISG6ptFZuAIlEc<9km=YnpYl6tVC^enRT4T%9
dA1yF^ SLJ!NBK6LY>B6ZI$E1$6W!SZnpa$=\E*!kYScI$EN<1qI6EcLEWa?P?XF@>j%wWCXPSMYn4>y/tMJB\X
9mK8ky YPbPWQ+=MaQp6lANMip\D#aX<SL\H/*/YbnGn:/a8k^eY&+WwmySkIyw:Aw*A9!jc$Ywj\qIn@LVnhID
\uX9NE eM5L!Q@bKLIiwpdSEL&I\HSFXQy@Zu/pH@/&@PHku+$mWSE%C6GdHh^+GYt6CJtpS@6yqNCQRT8wS@yZ
jH!!Ca w+lI19RAG1JZS4llQI*<u=jj<6a/!#Q$!+%cuw6E$mlEHRZe&\WN?Ah9b?IQ=h4@ee9MpJCpR1ZJWtTd
?a1SjF 8bhb6FlHhlPPTyI6P%GWW=&V4MpTpdR+Wak\hpiqDyJpX>IJuaTmppy:=/VHQV!@<*5>4?h?hb&bJ*@A
tmDD?R >P4n81@9hZ&Z/@&ble>9KyclNHScFJ$PJAwwWPAqQiB9SZmQjlCZ=RJNm\I:cilkFYmeG\<+9JyGbjCB
$aa*tH =$Ll/imHAwHWEDyRYw=Z6APGX%P\E+cQRMFqntEMhbBHbRkDKN@Haa+lDGk&>lVE>hDlmkLC6!IMwEIC
AINDEm D4+XAahZ<@/cHL5#I+#ypI+AkhRRBkyWY<EJ/R^\Jm$D=TQ/aXeZ4mk/&EwBBRw1*pwBB\w/lYe@k1p<
em?GLM BK8^eEYlRPeWWL<X\dHmR4+N4@=*TGjRIH:a/hVyC!%YIAaRBhVI^iM<I\D\/lqEA+QPP&%$/uDCty>e
E:86c& XSTktA:WIpb\9MiRd>P4y^ElEELnGSGCtWdCnPpdLR#pZIIA>b=^c*yM&9j@@nA8LBjVkIqmAIW@wKa&
J*8TBM %y:/:/Ia5*FQtlKEVpeKGAmRlAB%!^GeulV/dZ4%@>6WXD:<YPCb*BeG!u%SwD+<nJQ:w6@GX<<kQ/i!
1XqRtT BwSu=CiNY?VpmkLKjXEKYNPXmmMKuGZF^?&Q!c&>epWB=d+wBc\T#eASBXmqkLl$WN/>I#BZLp\Wb6WD
pmHdcL Ik1w^E*BE\XTh1VnaMySwJEE*F>VKh@jNAw:#DADW!=DFRbJWXE1YQ?bmTMKHGJJ=^qmmhDINPwMGBbC
ph8e*e kERBFSN\tt:w6:Ha@\M+E+J\kdDV6F51pCmkakJPL^D>Nld:j\B#aTDe6np&uIe%*$FEAXWhad\>^bkF
t>*L!S tM8WEE\Wq*wLKI4Jn!kI6PyIw>B+*qMauabBt?ETA+pCG%VBFRX>@%I1h$@NpDqSIDIuCnaBk>M^Sd?N
c%&TLC ^j/@&\\X=YhQVc$#h$@Skc=waKM%PI%eFAJE$&H*Vy=bRqk6c$wWh$<Bm1L#JRw$ScClQF?t8Z8KSypl
SFEiAF TIPJa9InCkaMFDAF/%:##lJCb*l:KBB9D\YdM5KbBEBl$EBBk*q8V*BDPn\V@SCk/Ae&95VAmZ+\iIcA
>%+=CC <q4L+8J:wbuwB\NFQ/C=KJTGE@*kj^AwiPh#MdpXR1+wwFwYCnS\lcJ+i+wBCwcq$YE?AkXY<ynGakMq
:/Z9Yw 1ECVZClPKR6FKLP^Wkl*lI/L<AW1bcFAI&IwVmpLScBbPH\^e$P5qIW^9+FKYTnR:BtKW<yCEYRYDq<G
AAT?LA QC&KCRGLR9pTSb8F\^j:@PnWGTw:tCk/Z/Ia5*NPIVPiFAmRJ\WKNIcH+n\8RwG^&Cmhb\>w:pwl$+e9
phR5BK htaBmAKc:$N\*n!lKDRLtT>>KpGEy?HSCBDBF\WcHES\Sl=SFJtN#JjCFaY>*AIXljIqmnadtT@EFVX6
N6Eny$ CkAtm5/ZKFB?QyXPRjtk/CI#4GWEmLYMA5%RInlV4!mNAt\#lDL=5G@AQpG8KA4R*a<GFCl\Hktm@&TE
6+H%ub E8YHZ$/jwYI#kFaKcIRTwiK6%G#WKDCud5\$FBMHSKbGkWawab\uX!l6NtwWW/9EFaZB&RFF$jpTBY!$
4p*1?4 kXD=Kd^kw4CHwcCmtQ!IAl/lbFKa9BhiKNPmIA1wKD1XL%HRLF^waak4ml5wAEZBjIqCb1iclJq^VS5h
KGw&th AEW@wBFKGMe5H1ZVb8PYnuKNAdmmkM#mWcASTlnHLB/qk*4<$YlMu96VW!EGM@Zqm1IAyjNAI=R\DpMe
p8Wawq bXDA9bN+V#$wbGn1=w^Xqcd?PCCmkEawITciKAneP+uBl*ElJwyLi\eWBjMqCumEpk:#VH6HME@%GReF
<Yl@>d FCn#BS1llHAiJKEM&9e@y#DLNA\*Q&$LAdbThKCZdZk4^bmN\^e#<Jk89GBn@!CmkJ+K+n#jRyt#$S/F
@qkEdD WDKX!bn^8kD1ikCNWEI+:AV$H+%R<4=WMHp1!b^?XeaAT1mASmklHCwD!pT?@:RZ>6?lw9Tby*JA>!Rt
I\\eEl &LNJuH5Tp\de!/EljJ!?&L5$nHPAmRMSBjaiE?ii^GTA#@H\jFBNHj&aKP=KAaym<mGKS1GAmpJ+h+/d
Ajyh1& 89lS1VPjH>C\IR%wkyKKM&^IA!IbWYEa=>j@/hQ^:>@P?HSR@@dywKN@?*VAj@6$MLnDLVd@?i@?F=?P
<X=8%i 1iBB=>iuw/R@WG8yJEFa@*C4I#&l5h%+5@+y1cBI9RSF$RyZhPqTCYXyNiXVdQKm=y!\e>XlD$Sq===*
FXRMRS E!R18/QlhZYGS+IH*FaqJBmuNy9eb1tu%a6S\8jdTGp4TV1:CtXZ!>AZT^4d>iZWD=QnGuew^aX%:pK1
qNcFd# qunLFPVwbJInDIkX!YG%9u:W?4t8+cdXNyy!<WTTwY1&u?ycMjMeA#6!uAhSZ#M$/aeuAe#5J9hhD4Zl
JCL?:N 89RTwcKi4W^bV>?1i1%:PkMSMcGunY@C+$/pbM9+P=?F1ipQ=>9emI5Yqy%91!l&K>:+W%B/A=9T=e*<
R1+eaI c=6:8thLyc%ayNZB@TVK$+YTu%dw/!Y&SG6$bpwSNb4aMQR5qE&Q$lykM\qCj9L!WeLm$t*mkiq51Vt9
i=kaKS lBG%1=11MlZW<Yj><c5$X4>KwpmJHbQq8JV+^JN8TiZXCXw+8#?<%mFMc+>ipettEXip6JFNDLQF=InC
e%InkB =p$!WF$KAniw/4p9JtYXESbhjKpcMH+68cYTZCb8F%!qG@T11TWG<q8!$m#FL$PYKJ^=ZhH1pMAI5%*R
:>Ie/T w4hF@:4w1E:Wmy4qyLdCMXXt<<XVi^e19WnNWY<WHjBcwtb^IPD#qbiyh!TmFDP:+%nJh8^cM>NP>&ST
k9E:Rw >&Y4T*iCtpj#44$6*CinjX^m\=b%mjZ4@!LFE/wZp:^XWE4y$acY=jym+1hweJc@lDET6FA^tXF%tTT@
mw&%Mh 4m58d#Ey6V9\$=y*SJaNT$9V&n?/el>#b*Sq%M$6q><X8i!KjuR<?B$u\Zt4i4Sk6eiq**i>4j$#&6^8
abcQ:5 *%m$aAcKqLq6ZSMaJh!pV#DyZlhH4C8V/mPX&@dw!MBqcikK!V99VSZLDa<9<h?KlL4?^1HG=\T/dD1#
^5pQ&L **4FauS9!IMj6D!1ud&i:NT+hHjIjw^/9LIq<PE?t=MH9a:K@K4%4GXH$k5ZtyNTdH%EY>/:nY%y49hN
bubZ6Q /F:86cVj^W5XQDhy#NqhYcpXIhPpH8YR/N@$\HY\J<^i:wJubj9w+LPABw/eehHp*MJ4P/6hq6mYL?&e
yP=\iG *HF:?KSZVYi#PS$im5#REyF#81h1<Kb\mTFBiQ&&n41$yI$Gc/>H*@Vh?KePK!6dpPCSRiJWjh$^Etd@
qcuInQ W#BqTa%DVe#1h8?4H*$<lZQ@?DViq@h/eVGltySXZ=HyK#%b/jDS5WB?jFDR/IPEYey=Vc&%uXWL:yyt
4<Pu6N =G=XjPNmdY=5tq+nJ6:NVNj*P!Cui??nb?9#HEtLuQnc+=KXJwaW4VkjwbS#+^@MLn6+1!h>#u@@yKP9
eD5/9B NHldwE\%p*=Ap6^Me>yy?tIhK$%MQmKGbj=JwJAX@*GSWyK9B#1S/>=+hLqJ!Mc\!69St/CSPkFV$eR@
YGRX4A SK?p4&\>XC=AtiN?>L\1:jZTK+$SL%jaImwPe?QP&G*4aPWWi#p>P6=*j*6D?6LnJNEVLqiTLhm9h%R#
-A+VLi 000d4651e4f001202b4 Page 247 of binaries2.zip
H%lAmB \k+1#n<SuJXNX&FNjnXI*:G:w%9t6?BLAw9m9wmNClw1D/58FS?V<m6\ZbY@<p?b8w59HKudMt/eTH!\
Dc$ict !WLSLq?&$VT16<c%SkNN84T%?ETyiH6h9^L=Rhn%\@&FK?+@>1*NXCVayauNJ^\Lb%H>q>XV=^#yMk&F
1qMk1I km/lm\/yu1+*ny>9WbS/ZqBP+bVd9tI=ewTeW:GFVc4NPKMkk8$lej46Gw6+Vjn5?a?u/u^&YR=pMZKH
yRQ=A^ S#NTGpnYKX*HXWWGM:6Z^*n+FdH!8nqyDnZMA^8d:bh>ICYeNZGBdqYFpkj$bA*#kmZE</A8=Ntb#85F
$YcpT8 q4iCqLN6Y^Y&HLBKn&>ci4Y?LF/8wVYm<L%t5$kKw4BF>pjP=*Rp68V>tcX>SKLB#8I:JS<WJ8wQcCk\
htRldZ #%@c+!pud*TwMEGFw4NBRQ1Ida:tKdM4FSYqe$@?4LVk%EqYjwcwti6#JcQ$atqw+tGY++:EkQqD^qEj
+u4$X\ B!%5$4hG=d8$:L%y/@I<uBynw*GTenkq!ea8LQ<TWVq:NP4wQpQN\#J6!mJtFaJt@WVBP6JqB>wJ&iGS
n8eE^N pEZl1b6L>GSVYjEGl$wXLXdd?ii:y4NWRnNaunG4QEM<AqLYX%RwcyuecuZn\P+98lZNJH$$R\Qb*dIL
6D8Qc& B%udQhe?*YZtE+Qe/%4VThm9X=\@d+YDpi\^^c>48%:B+RI>+VdTZTcYS+y8thu*Cyc8L!V*q9=KbF1<
*J@<Yi /Ccu$6:XKKpw=HSq=*Q5$QwI*^T&VD*1Y@qP%n#KN$T4\imZVkFtXy4FL&TBubI?$pTwebN!*qy==>LG
tFXCX! bSGplTG&T?dyH1yZ?5ZV%ZM5tGYwF6ntJ6PjhjauadNaWTuZB5HR$dq18=?J66VG6e46hG$@>?kMJZ55
C9M1/c $JM#&G=1j=unNGE$SL+X6quF!dI9bM&1@KIcqqhPw:S41Kq$@eV&E>KZleJeJc!NwDPL6RtFDk8&=:p=
B6TMZ8 dwk=eC9cZP4HXLietwEdZ#4hT\>j*Hb\C?PZ=e61:E+qEb<t=W8Gui#*>jTYG\\lHX!YXhIY6+Y<\>%e
^1\G/$ y%*8\9BI\Fm!Z+4p:/ai:>IT58Xd:k%cQ%HhEJ9^hJ$c8\C69%<=>@hFI65djl1@?tG=\iQYK:yNC\&J
aAKZhR lCNJKa+JJyeZ$<QnPw=4:!p18NiWuH+Z*lJT=NZ1XjX%mYKX#cb&wdaV5nj>qE15T9\a:T*Ldup%neRY
DpS#j6 ct&E*&c6MF44pm8594#^5Q?>y$4I$8%*!p&1@^DIHBi?cFH%6jQEdn<%wpJ!*FNF$w:ZkX41++XF:a>?
LQDZw& &^<9yi!?5dF/PP@CSQH&k8CEK@E&TMM>ZcPS+/qHLhL*YkYp6bQH>*w>YG$*!Bp>qJQmE&Lc>ZP@ZE!R
EKThbD @aZLdjwmJy%@Ft^**Bat@mpm9CmYpDC&L:*Mw$<<5tjp#IQWjw@CwVLVS8<Q%de?Cb!hcJik8h\*amTX
!:cIiT Y@!%IVmQKpKhnNu$w%1j+#Ln+l=L#!d!P<@ljR@lWBQ+L6QV@unBe/ch&$IJV&R$4i@tcV&H5/:m6?Qb
K?TYy@ h?*imGn4mYpc/D@c88t&DSKb8YCukX>/hPVLhVJ:PH+l*qhGQLZj4D@aGek?q>>!SeG=S%VP#BEi9!FC
LKHTy\ 1u%iY%Yk<yd?c=!yc<m+Xa:jWH?E>wVC!eHH5ySma?G^J&jJhmZK@YddQBR6+ae%YZiP:i\+8ZX>$pDY
FQ@Ikw +5<!NaI=HRy?mXeVJ=94TcVH9R>Yp6S#h\&NHBp&C@k6$wE$PEBnT#+L5Q<m/iCa/@Eq19h>i<*:IjqJ
Amk^<D j@uJ<^>#mJQZqSHJ9MTdS<h4SG!?S5y@diu5dW&KnX*=?eIi:bW>#%d&9&we:Du/t!DH^M#mpwn^&:>G
*5ZelD Y?$jX*<=:PNCh6hyqZ*V:9jp=inPt:hFI/W65@X/5@WGuJ*$qhcZnL@TG#5!>5S?n>=YeiepB^Z^!1Pb
BqI@Sp :AcNAd>hl4=LVac$&K$ih@R/JV4T\\V8#@Mi#SHZ/*#y$^A6>Wjn6jKX%$pJuibNkeN6w^^jIem=eWjL
S6*ELm wpMNGkblw%d81t^C=Q5Nke%FFYS*u#W56lJHy:Bp5enw=b%#9B#ut?&Q:@diIJTu/4R&>=!tWLhS9Y6C
Ty*$AV ^GH:wNBu1n+&&i/&\tpeabKcY/dcTG:W$\MBpTaMk6ZVHLP%&W:GGy*GlaSLG$RIlAPQlmkGTZ@<+A?X
yIY$6* 9SDQtnh\u!T%K$F?e>GERZ$X:G^nENu#5/<WQQ4bJE@k*LA<QBl9R8mXHJt$I$/c5EVhXGS%e8$#QS!D
Y/H@T= #!W58+/+Qbd?uHl+5#dHQ<1?:?Y<lhwLSap>t:Wd9i4ZQ/Cwm#=8Fytut1DtQDFaQCjyVKL+R?GPlk>Y
@Sha+J Dn>yj*cLHT^*u1mJuEQ&yWpYj=B<QiF1ee\!X=5I?Xq!@444/:TXFW+dht%:dc&pWceWbN>mMSBQ*LJc
BW8d*@ $1+/+GLd8T>#VG#1Au\cT45=@lP:t\SCup4yEXcdYuW*C&5a^LXw5y99mk\E#/YbN5*ZYtY*^$k$iMSS
FmG*BI n=D?Mp4<K&FQicDZ*YQynw1DKp19e1H5Q&@u@Ylk4H+nq6y1KNyCFH1!#*lZ4cQR^!hHbQIVG>aWj6#\
AYJG$\ @I1$8*V&1<aZ!5Lc==CL\%pLtp:LEC8GZC&<ST=j+=!AjAKj4dyK#dP1la\=QyFjQJ=TYR44H9e1&?:^
Gc/!bC j%&YS#^YRtaVp*?AEn1kN>GWqCNj!G^#+@NM!>dwuIk%kcGeN>pj=uB8CM5uDl<kCI#8$i4Zm%Z88YFG
?X6Wlj Pm^&d@i95q$:%C>GH6H?*Wb^:j9mIYqyh>$F@S$ekWjK4\\PL%8knC/I@Ym6cQ>IR<M$GTq*F+DjRwi/
yW9q6L qW%6S$m4ip&V%TmiL\\6=\yRDbY/HQjY5<%FwpTKyZJVjlK<5>yG>RJ4JE9>1GLdBe=EcWYcNjT<:CcB
DDjCYB Yk*=/ECQ\+qT+&@QN#*e9euR?w%&WVc^@FYFZ+mm6TBh4Hb9!/Cc+SXn66#1<4AW&\##%/X4!ltu+=Kb
\li9*u $AttX?<#>#LqNueP6XLHc:6P6<>\TyqN^am8dh!m1IA#h/=d9tqeZjHX14^#?+&WhS=Ty$d84Bh+8D:/
u&A$dH %9wYV%&+bcQtn:wX?*WHjQYW#upE!Z5EKY#=F*ZZHXZX5jYXy1kkKm4YIPYlGPGiNuP8DXDymEk^mERy
k4hJYe CqnAAqlm\$KJZbFt!WNFJKICwRmKQqRMKCI1NnSS:KKC&CX1<8:le5!Z=b%p=>+X9?>dK*?eFYcj/?@M
=+qwWA u6q:>6/#j@VyN&HqpcQb8YdiNZWQ+%/$$e*/mtw*T1Q4?A:&4tYyFiN1c^*mPnt:cX1%#bRi*?HTcc#=
WMLCiF >Hp>uaMaW/j+@l/M^^HtaqTG&9Dh/S8<b@jPcmm6C6I:hHjSk=GYZZVQ=D=:&#d4GXhZY%>1<NTpe=VG
PJidST IF8Q5N&=K:iXVuYShB*j@yX^jMQ%m??H9Yy69?HL=:aXdkuyp$=K48=NaPj+n/%GR$Kj4%>Jn>/dh59&
e!:S!Q X:jT!!NYq>8a>Nhw>d^yScYtqyhb5G8>Tj@j&4dK%>@uMM9ZPSEFiB$QKBnq+NDp4V<85&:D:E&WuV5*
GTjy!k *4KpIPLw@6&*QV4d?8tN!LC%%B:l+6&6<?9!8$>e?9pZ>QFm#hM&J+euVlp*byPN9h&yJ!d4j$Sq?+*e
4mdYG8 :4ASkce%P&=cM5Ake4Vy^Qc@cW?d@<=4QV%8\TVuwHV616CuqcQHcVIHe9#&4nQS/4\65Y5:4tmcq9=m
6GPpt$ W\QZ/J%M\$Pt5iG&y/V?l:6W6?4bEet*VB++ijI&&SX>L*Niw%Iw4wNbVLD4/PI/D/Nu/IFLjKN=@aY#
C9n*@> &kqY5c&6!miGSqwdu?nV8?Hwt?:6y8:9T<@49NS$t</q/lpl:&bwd8<*ii8M^y>GJ%tjiJ/AKu+6!9Mb
ySPt<b YFb+6K1w#eW*^qpul#hI=>4Ynh%<PYQ8P>MP>*$eTtajnJ\\8q6T<BYLl?>j&h@5%<dP=5!eMRW%ctNh
?+NCTt >9mFcD%abthl=SLij@DP?LA*9^S<u^YT&LM!t^q>bdjcmI\%c9bLL@wQ6nVK<H\XPX?4$GlyXN%?u?=q
c&Stqi j6H#l41!Rc8Dq*?d8Gd#$&Gi89::Z:m:FZ6&iV#iJT?$jQTKm*P9=A?P9n9=R/L8?ddHQJN1=5ZGVW<w
Mb6@?Q jtBt:&99wNt%jGVpteQ=F=ytyIa#Hd>?5@M/h>9mPHJ@%DG1i/:h>Pi4+*Mt4d:9>DdeI%G656B&dGCP
XhD1ih */Q+^dN&VZ*RJ8=B<G\$8V/nXjH?^QCS:+IM^^y&tSkSSPiW46\%::qbWwdF9SWVC?=Ei4&IVJ=^=8=W
I5uV<A n*uB5YFjL!1<Tw&+bbye/+K&JjuXV!9>a5cKM#acjVSm<QT\1H?u/D/TcK?+X*nM5tBF<9H$m?YDh!?y
BX>uB! eD^d/B&=qqq*q4iQCF?tb4RkcZ1wc@YFhhE#X$m@mA1+>$*S9JAFC$%m>&&>&th%>@VWS!iTc+JNWi4Y
^jG!iD !SHn8lwQq\T/4:S%4@R#<^/!lR4eXLR+h6Pa?IGJA\diN9q&^mHcj>+?>=9Wi<&P1W#nDXj4tkZhi+SH
p%uWZq Qi4RiFc#kA1Q?qq4@hV+#QTppPi9^kX4FI%j%VnnpWuRFVP#=Re>:JI=ZHjY@E*V45K1:VWb</>iu8aW
FX#E4V Fj4X^WMh8ZcDu5!c6$SVi#HZaDRm&>86eqDjdlqqB>4@1&^E*JtqZ9dPin$qD>jl=HW:yZN&BZ5>Y?M#
jnbkbW CuX!@D+*jQ9BE>99lbpuYN?RjHi5<8uW?%66#F!GZt$<ZDbqmq/VtZ6$lHjjP/PPD9Gy9by<JDF^Z51l
t6ahQJ WZ/Pi^LKM=hJ>@Dqb$589<<!LZte<nShPuS1*44J5VehI:bEDdVXmKH4B@acb&@9>GVPc/wmV16D%55N
:=?ZaB 6Zb>>ue/8TVuXEJ/d>8iZP58C>Qa$LV\qj=ZAlp9VZZ>/<tDd!cW:<=u?1WaYI=l54JM1dB*@t4JZZ&p
BVli+/ qNcl#Y$/Y^ZPG*5\JmZ/&=1+BI?anw6n9AdGdNu19VBm#@ZXK\%u8^$PG#lulQHCqNcD^!<c9>t*KGY9
XmM/G6 =+\4h15LF^bq9Vk!6EjYL1dS=QnM+5JBj5a9l5Y5Q4Tk*L1t<5nt6@=Z4a=&L$u\!jM6ZJkh4GG5ZidQ
ij1>h9 =ddnZPhee5<=1VQ8?Y>h<9*@Xh$?QDb$ZH=awJ:ZX=FV961Zitt5%XchT1Nu&aPZY^ZqQ\*#iZapQ>q&
DpcWE5 1H@l%u54l$#@#9G&!Z*%YSPG4GN%l/^>5ZQ?$/?@j&kWXmp=j&8X1%bp@imklN6t94MG9Nm^1&u/>y=d
JP8AMk +&ii18nh?eCE+JpJ%k6Q:H$^c$iP=i\9<#de\k>tZ@$?+&/41C/?L?iYP%njwM?4>#=nd@y?RHt?wXXT
VLWjtL q#&dckbX&cY=9<\Lemui6*l>%PpPQ#w=?A=^NBtR<+C@9YXVw=1D<i5Gj/N*Y#Nud@^J&#k>#P#D5Jq<
eP1<Ze %#QBc!\<lwjP9Ju=Nwa1N1iKT1$&D*N<tZL&Z\QQS1SXi^w!9b>X*5ZDji6Cl!*qQu#44NM/N$K:n$H*
DlJtwC uNqH<1nnl:$V<>NQhRw</Sq!@jKAcR@$W+cQTm+#=1aQc#9t#1p8di^GH#ut*D9hPhH$>Pdc8\%P<:t%
RDi/tm Fh/c?QdBk$dj#S\@IHP\i<bC#aKj^phE>:ha@PdG+Y*u5?aEB^Yha&+PH>wt5Vw:ND!@>tZ%+aI*8$iY
@Cla#h HT84HiAcuQ$+:WbhAi&*T1ipiu4Nl%B?@<q9cP@huuh#u^%eFH^^wttc4c>^$BWG9X1&QP@D<5ZqR<@9
%GaaRE /?KWNQ?:+%:XXdyhXmYi#:5SiQHe%q5G/kjj?ZldyK=M?K%5CVPpcj?m1pFM=H/HJK*TR/Y^>T<&hQ9^

-AIb9D 000662e20b1001202b4 Page 248 of binaries2.zip
wPew?N <J!j8WhwciF4%/lW#hw6&mctVqMZJ?^$4D*k=IDC:*>n<&Ni$%NHN+icT=t>8+aWLum<cHGT<bT1jPh@
n\k$N8 L>^ybXBu1PZmG6J1q?N>uTi<c/y%Vip%1*8@Y1X:6W@4$^C/X%5!WXQDqQ9%eVY*Rn6L4YK:>d8nW!9m
buQ:Wy G/XYp!:%#dG98XNeF?DZd5KVD5<1S^/<yn/C$c9Q!LS!ZL#H8ShdQLc5ca9FKJ<9%LN*?eh19XpjNdV1
kL&yWZ t@4LFw=b1/=XdS\=b$bV%ujY?u&t@QJ#dYC\WZad%+V/%d<<9SniaP#yM>T#:8b@&m>daqh=<yZbmuQ6
a\XZlK h:d!NFY*Ghqcw&iHPe\^#X*LbyYHML*nNHh%tuWtAB9E6X9yaFnmK#HRCa#l*/<MaNd%1a*P5Tq=FIB/
GnemQC 8kS5nC6^M?ST^ylSnuM%NYJ%&?l>\?t8au44&J/a9TE1AG*RTa5iPYPJ5:i=e&8Qna=8q#S/4+=Xh&J:
Ej%NNS qp*Se+>=:VVI#5b%uXh6Z5lQ=1+Tk?4Vt/a>LA&jqQ&#9%4:p9+?dHjQYNb:u%X44@W&p+&%9X:*MN\+
VQhWXh /9Ge<#bHb>D/B6FG=#NT/*ajYhXl<Nn!%A6lX%Ni:81Z><Ct/@qypWF4D&!4RFi&=a?eQiyhSH?LDpZ^
G+dY$> 9:R%*^m5F&G*eYNpekAd/&WStjt!%=C9>j#&nZNG*c1DHq&d%th9/QP//MQHu@ZI@DuwEN84cZC*l9mM
N&bch+ Hq@/=&c@GdL1l?#n&dit5\bjunuS*<BIi<JRQh$XC*>MNjV#8FA*eqq1TA@N15M@^F1+DYtdIcqK/:db
K1Y=Ql euYnY<?anujc4V\=%juAp=n!uX@&nQHQm%mZ%d?mMau9q^!p*%Guj$lThL<Vjq9bP@EVY8Y48?!5Yu5&
<k%N\P k6PL&jEDK69X>kJ@/6m19S?/YVyeQ==ph4de4Vbu$EnQdZlVaMC%W?1<NaMHFL4hH9QW\ChPW@91e#%h
amkDb5 uSCjP#wYS8dXi</hZ9tdJL6X$PP>4Vhb>+^yiQT+VZG:&<ZbR#M>#4*R/KTYa8ul6K**&\QuQcP:G!/#
LT=quE D8yl6d^@^uLF6EBI<4>KC+Rpj$$L^NMKcIF+t91EFwl9wdiB$kIlpjMF6cRwbA?e?IDFB&uLk%ReI^ZH
D?N+hF THELL\!T6k#CEpy<aMRHVu#A+wM+tBIHW!$bE6tVPJwTS%QmcFweVa89y5W^6DmGweRZMiIkSu\nI+=t
CpGnNt ^Si^+ln&+=@EF*EjZ<TJk#n^Sb\+tlNHm@SKGItDpVkamh<Ia@F9YQ\dFq?E^Sj^+w9ECeHmlGD?++9E
RCJcyG GeFTedR+NXmeGm\XZ!*PDC@PDC<!^e8iPQF@ajFBHC%PDh<!NdIHeZDL#H!p>SFVYy<p!#=N1TIJqNaH
dC=B5+ Kik%<cp$mhaHKik%<cp$mhaHKcC@WCBNKJyDCqyCKJAtXKelBjRZC1RbpnRDpTa$SEaK/C<WTBP/k!AF
em:>JE DSa?qSbKIlSLI+k$J9$&SNiE1tuF$lBhE!:CKJcG/Jy\BXGlNA*SNiFY8YJymK=^lCd#mIdwGpjw!IJw
4kS<ZF mK/^lCd#mIdwt6B6XdE$SNiEJ68KyTG/J4SDWC\N$VYYJ5$*SNham9VdEF%nCdW*mIHwtpCwyqkcwt5M
K%i+?5 kj\KMSBhI>ECIAcmc\^DpwdwGpPS@8WRZYNI1+TB/ByN/PCNGIm8$eS9D6E%t9nNIdyGE\nHEA9SNbyA
j?=1T/ ^aBamK:SlE5:mIZwt6DuWdE$!IaT:kEkFtSDMit*PbD9RQy6mK/S&uWnF1J4k1%WLM&DjAiCJYJBNyS\
Nk:QN\ SSX^IB6KYmWe!IaT/C<RB:KlyFZCMTDjkYANPBbp@Rt4lAQ=c/SX\wF5KMud+$A&qCjNN<mGemSypA$q
b+mFH* >H>HTAK!@kS6RSVIjlP$BaF51JV$&!AdTn4XIJANJb%1EMmGEqyyI\VSNadR5^wlmK/SmQWR+pG?A&GF
wpA%uJ ImuIh!D5=^lpR$u?G1bW<S$\!IcThpZM1PI:aBdpP^C?PadwGwpWCGGR9$a/A&PI4yFIkSAG^V^+$niH
B<<1nu /ByFcEYJiIm8WaTin+mH/B1SFAn^>Q@JW9M@Z9V/$&9/LFclmc6kVCub=A8dDiTjBXpiyEc1/I<Z9j+W
IS8TF* qNK*tmmby!cAEmlDwcCRT1A\@FcJSPuG!LKbpl*jKhtGK^^9IKBAVnEy!QHHm%=@&qBB1n#VEhMM1utt
Q:9X\L aKCpEqXATWHSWRLBH=LTKpp#\G6mptb!PGZXSGmnKYu?wl#wtlmTk5/MJB>D?yeLtyGDwqmq4@:TnMB#
wYAKmF \<qBIR\CBR4wTkutTI1lVitS$6$eKKHnJN5!W^^5ypCSay+$W>LQ\MiGlA6IYA/Kkbk=LIEhu^W:VFlC
*M1\:? @jP:FC$S4q&!eqA$AwECue5=ukCK?ij6CT%#RkR?kGbRFAMCBV4\E:a@LPHk6^TX*j%wXtkkJ:euR8aA
R^Q&p> Ak1$WSAmlXmCwi4HK>%6uPc\pP%6B5YC8k=lWQ1TFJ4Bp5?^WRmkEC$HlTF>N#AwL$1KGGGKk9aGbXZk
#F=BLD ntKdG%R%k&JBG\Ww+ewTEw?akl+SYE4ym?eWm?Rhl\SRFA<C^cwRIeMW@ImAYSYPCI^W998^IPJGDEwS
c?!RH\ p\J*tMJ\AkqPFbaq^DTDanAHA5Y4EBHEqBT<yjPM$k/6$EJJ:ma^CPItaXBTt!GWZ&CcAuMeK6%KmSK&
ti91Tb e$d8JnEknpMM!ya#BI=DVDPjkVyKh8kTYmp%k\K%W5K$KtFhDE4DM+VTB\^K\=PqMblItqbc>YYdmWCd
TualmN Lu^RtwhyCTliVJP$BLmicTSSj8hFZDMji#MwBGpPlEGFA#Rl&aMb<AtB==S&$b1dA4ZMFG\>k!wTcNJ/
M@J@hw b1CGu&KX:pqQ!=TJq4VMFA&dKXDwuCQNFQjQW@eIB%TKq^6?CpV9mYE%FAS/V<#k#$BDLaBC<tMQ^aPP
nq9W>1 QdDmDIy\:AEXb=DCySlWuEGYl66unqIlYm@W4#RVQIGwSVGw/kMS5miabcCuE+EkS6qG4>kR6hA^IBAh
i6H8CT A+cXp^DwGDC5uITR?5T\elKmNAb?WITq!4jaS5&SP#t>C5nlAhYypPm*MT8F$&<4/*R\A4YKaMypck?n
e/mMJA *<c\AlmTKiQk/%qy4pLl+CCApuQG\EDSKwFm+DPFXPlG#dX$JPSAHRp^4GTH$JERe=<lk5jK*DYBkWSP
MmPLBN 4\KKNwB1kWme+ynD+JqCYJWP:*\L9\ZM/RAXGbE+^VEH*!l+yRudbKeFX1a1R1W!C*M/RNXLHMuyRPCN
?BI@Tj R9cj$m^$jDMwPSMJDBT6Emntu=<ywRt/pFF5BkXKu&FR9SXLTJ>l^IFBKe&YKuk#4M#yatTjSTA*l+AC
^mm5m/ SjB+k9FFGE=yV/9RD%MAJchZkaHmXRIF1pdpCQMM1lAnT%M1ThM1TaPZHXdip$JaVkBJRjulMcn$nMRQ
8iBD4V n#E<eK=$WECIMA4EYuIKDFBRAFVV^lJ8CYGMwY%wicp1ulRnP%e&k?NA>lqWLMeR4l>l@BpCde*WF\Iw
$*DpDK weM>DBR9WRWWV\FBTaSLc<w&kejNwPVECnBR6E1k+Ah#mhKklNAN#deRK+CeDqASHpPwk5I<>^uWV:ac
5P=>=d lW6N#cBwpNMBK5JnTF5/n<E#STt@y8mQBSNC%VWEFGmnaAu&tj<5G+W<9TBum\B6/cAmQIdR^^lL1e<A
pIhn5Y TtcncC\@S\w%/lBRwI&CJy\nye#uKTKtpb#?nIaqiEHFjR\y\T9q\Fp8^KlCX5JJYmk\RGFJWHEjVW4\
!+RqhV TwHX8nStyWw:<qmiEGwGBR5+ka4:mAtl9!:8?>%PKi$t!d:w*/QA+EHFjTRKDB=c*Mi^QK$<A+9EpGwJ
e#dZD\ PNGkkBMQK8/nCREuHq4e^$1pK4AcCTRS<w%C8P<BARXK*SHC:V!$8I?tJc#TM<Z@ZRaMHqVeS&LA+KHF
CqI#+m jcyWX#G!k<Vja<DkReX>JAaMZmIFi?pTydh$nnKplLAkpnSj&kGAAlZ*WaVLbn^FkTQV4NL<W+mVk=L=
/L^YHM JFBR6E1k@5bGwVRwkaCFbX6wQYCkYJXAeiB1DPWn$\IBC!M@JFI5A\IF&Tkw\t%FHq:e^:NKy/SqDlbF
FR>m?E !R?JFCMBkRJh/CNew8V@YN#u>465C>8ISBHdCJL<#ndCTXn/W:aS@u>Y=*%pG^GP9j<j&Ed8GSi%n%F*
Q5l:ZB QFpTIn*cXTh9qhiF:Y=/Nn9W4ntW?HEFB4e$e&^Mjy159>w85LZNbuip*%jV>MIPe#*dZLZW^GI*e<5i
q%k+9i c>hNbSdW?>q<5iF&!N#Hk:c6ajK9?*ij9u&YViuGNZjWF!djZ*!&\P?a::Tkk:*C#Te9<//+NQ#19FP4
n&5588 &8*eGHjSLX!@ce&ijk+X9G?QSddT@%mq8SpcN#G^p=JL*hne%q9jX&qtuA5/y&Z=$K*Z5WHGLy1DPm#Z
CW8w$< 8MYhWu6:^%m:*QyK?1%tWyE8G5iyCw@e#q1htBJNi9uAq?h!?<XN%6hXh*D9Fh*SL/Au5<Pb%>Q6hHE?
I!^%e& #l*W19bX<edc89>T>?Z^XK%9*#L5#FM:GW5bM?/>%6y:4!YJMw<:JFPFSE4tm1cnSKdItEwPwalEEe&t
QC4pj9 B4MwVcePIVKFqJJV4+*>Q5@9ic##8*><Vy@*@Y@X=:1Zhc*:&6j/*9h%*h@91qC&P9&YDL=K*W=nR%HQ
4Na*6B cPZHZX4b/:*m#!!==VWl?H%cItS>@XS8DCP=:FjXFTLi8cYp+mAlB5Hm8XB>Z?1jTtah+V==N^PPq@Zt
BW5w8G L4G!H!LZ<^V*F=IhFAZ=R\J%FC1G/>X8YSqK5C^V<^u4%DXXe8$ddB!1KmdT@d8FP#j/58!TlARXHeZL
Ya#$Dl i%@p4NIVkw64ic<It+kdS9L/m>=9&eL?<&GH>l9SE!8%t$^ZLp4!pyDiXM^BWE*19HmZ5LT%SN?CNX8Y
FeZtjp !LhheZTM+$c+:cl?RJt>tJGFVIQL1=W5>enJ/Lw*!??y=$5yN9Xu=XFLih4*LLIbanek%R6QdwbMY*Wy
hlK\d8 9GcJWn1l#pqQi/#ITpqYtph%6HhKQG9>=K>NY^u8q^jGJTKT>*!yVP/y/mV4l!KYZ@PXw%wVuQ#Ee&*j
!qm>XM Za*hNPmti>i^^NbH5q6=@VP8K#XK:>+%SpAj?iXYluK^9c>Z8ppu<><\JHK?Cn@JyS1%h$*$B96&Hd8\
ENaVlP tnXF5RW^JSZdNGXI6cTZP8X$nd8uXAlnVp/d<5Xje:MYmGXFl?+u?t&Y@Mn%^^hFq$di?5h8*!MF/uuE
&?:$%a Iut4iT1tj9Q:A?#QYF<Kwc?<FTAt1=QnqWBIVi\J4:hVP/k%PMFLwR=qZQn&Y4cm+GQY$&?T=dZ?*y/B
6hF9d4 +y>9*lWy5#tc+9*IbmTl!N6<uDk\hH9b8nWX<JNHLWS+!W+/tWNV5JL+KET$dZVh$/#\T@YuW\PZ^M4$
DSdIbk &tW$4:q@9d=na?e+Rd%LPn?p:!hdmni9i@FQGZid!Sc4jq<8uij!Ybj9ekyTdHc>GT\e8=j=yy<a!JXh
5jIq:n 68^B4%HEuXW!:T@KT$QNM*qi!$JHP!SWhl++LHR>+5ADI>cEm!JG!>?XEYw@DK5SA1IYdVl@w1KIXTce
>NS#C@ G6KTy!JLX:qQI?$ept1JMBZMnXy>LiYTp=&wd%^R%=$T+=a+GVNVZ>ZEcyl#e@muQ^^&t58uhMqj@hPF
nK!Zty *Yen9d=M>4TRnR8HZb%b>aQVVuW/SWdK<y:Lqu*^jQqtewjb^uRJXbenBh!t8+@ZQEqX@ZJ*TdM6FHNb
jjE$:e cSWq*it8VM8i&QCMEcY\qG<Y*BX/HSYHXIIE4<YTQP#/G<VCjLS9dda:5\&T&yqqJF=l:Lym><PKt^jd
bm?V4? JPVi9H69/4jn>+i8dYG^99KEHjW=!\l^Et<>T#$H6VdqeaadhB><tK#5Y%Q4=M#qiN*W8T=6m*bJ^Mwh
-ApMW/ 000613dc595001202b4 Page 249 of binaries2.zip
DIklRA w%X&?peqqu8E<ecPQiSj>JT5@9Ja<TLhJjwGd::Z/^/+$:L:M5JVe+A%p5A6H!Ab%/yHC=EZHcu:R@ce
+l&iEZ +IW>c>=dDt@Z<Mm1Q9P1JeXD:mZdkeVB<\tNdb?EyP*E6PBG8!a*!e^Z&?MhP:KwteVwBMpYiG&<tGkt
Ytc:8> F4w?*utTI&jpK&649RTd/SIjK!qYec:+*qa=1Wm/qGnt<RnhQ5?tHZ/cei4/@j\t*\%MmmKV!hlNW@qJ
&V=:AA NiWY/*8d+^NV$%!#k&4#::h&=6FFm8MY!$d5MbG:FWpM<LXWCN%u$eWbqG#%?/qQE*uHYF+/@DG=SQ9T
$QDpjl tY@HZ8WWh9R9K8FBS%j5S*=L:j8bj:T:Mm:#l<SF!p$+?aHaA<PCC8Z#5nVyY5MZ/@WNI1&hZbb?&hQ!
Pjq4+X %Za+I?C<tWy1dI/hkdtLZJTyG?5na>9I4ih9?n8a/>jX:p#d\ZbH^EiuaqLqRjL%Q\Pm5/!$Z?e5E>&c
GYm4MK 4:R<96S+!S8d\$+!8nJ1V1&LNC@:T5wlj1/ZwNGec>R4pcEd$m+mn/w8QmGhl?1M?PWiqL%YZm9V%?*a
@$D!BZ <Y!j1wS^4=MQ*jJ#46TKD\eh9h@W*M<9!Yk\9I@q9YtN*nVSn*C:DFjW?J\M@FHX@1*X9FPK5:KE=cJ#
Aj^6>F 1Q>Bu/+TKGy\RtXkja#RNW&:wTN@TW<c**A<uJ!Yq:F*ihll\=E@HAJ4@?T+ePc1a1jWd:i?Th/V8hEZ
uhC#6e d4S<Z&1QlEKHNQ%>6=XY#CQQ<&#B4kGp14h%QEiF4MQ8jDSN%>h@iNR>dejFP<*mG9+j&Ei^4\eQN%&4
yemQjR NiBm&&nJB5WIc%$=%h8l5Fqlt>?F%?4188Hh8y/eNcLJlNAk<jLeH6?4^L@iln$@P\Jbn%@Ihw+/ch^<
JVIE%T d<jP$%qQ%JdZlZi+u?Y+GC8<IW\@k566V/%$8!%S59/#<Ji1E$1BG$S*?neib6Wwp*hZ#D5Z6!cq\e*A
SuqCn% IXX$Da>Z?XHHq9#l!=@c1lNPC9+^dP?>j#m5aXN\$?1WW4i/yAKQB\LSn:!?yw8&Kj*M9jyNZIaa6H8d
WJ6VBm :$DbkZ899J>q*@@a8SkL9quIS9HJ?KyXtWA9Quyd=WMFhm@+udmINS9h?aH=c%$>&b>LunymK=w+ZW<b
qSZ$LI 6Pu1\D4i9u:p4l8*a9&&@*l@jSuypYQN!@:K$kCQdS4u48&lCpiqhuGd%^al@S6pCn%cF8%?5XuAi:j8
DD>Bu+ k+PFEt>V>wl<ZuTt=!5uc+wQL&Lm5^$JZQ4pyEAd+cCDVw>L!e%em<clwV:LAaG$L$y:FHS@?BcdLX=N
!TER*Y *Cc<d#A*>$cLT>9b!w6jPD*QCh%h@pV1ZwmuH8Ycbq9nEd6SIXV%h9Q161:BNhFiV##iHqw8GPPi89V4
!JY6mh H\IQ6le8/>u<ZcT$WbbZ4PT1=/a%B6mu%@#i?5eFG4S?%6T<l9d14$*:QeD84G!*XZVlt/6l##uPSC=K
@Xq!/< c<4@PFGc1X&T6@Xy%c5+h@5*Zthje\$NE?:+5%YiaR<?+8aaS=I*$HW4/>YI$5%ZYD?$8pjp?FZ$5hjV
H?<nKR C9aZMqj&5R61:4#cNlSBl:&Gbi6p4^$4!CCeYGTtFKQP98ZE$*+#/@/CWd8V1Fa6<Xq/4Zh#iHwui5G5
:n!G*B 6=>Pc8e&N6nqP6DnPTk9@VlY1<Qa%c!RQnC$@KYQ4ii:4w@e^&wW&#+YEn84FHu:D=TEQQ+#$4V@pw*?
5^5bc/ I/*$\eu1$IIG@y$NllMu=Fh=SFEnijVZXd&\X:E>Y4hi1#jLeI>^8lL%kPpLYKbiRF1d9!tZSb8i#:9i
/JeYl/ u1\1&N=!w@5<X+FLX1=mt4Gkja*KyNt^Tc>>6\Zy1V:Z1k66QD#VQe4*<B4E9\1Qd:EaJnih@du:kH@j
nFZ*k# Y+V6K^#e\Taw&GpeiWLwABV<$Ch>^&JZHldX^lQbF%K<QL5@K4P6S/k8:?qtl:uDH\>/Be4w=i<:SqBR
FY:!9B I@V8J9/XddNliK55@=hap=jL>1kFjYBN=?L5n>I*PGuB<8Sc\jH<iQMDTn*?p9#Cp+ZGCbZWbQQjyPn*
G%CnEi wn%Yja+N?@!?\E\@Z/&V1p5k*8>MHX?jQH+5dj#^R!:C$#*HX:Mjy<mR4MQCaww+*^aNaa6<JtKd&N@1
mYEJi6 e5M^hH8=F$/R==>/a/MKlQ/c5D>N4G>Gcy+aPTyiXi>?\qV4bB@C$1NaeFW<=wc!%/*LNauQcqZ5Su+<
Tl4Mm$ b>Zji4^XL5cZubVH:l%=&#h68\51G*%8bX&XXEmq\a=Jk=mleLMLc*\iXmuG%+:$=uSY<uHZCjh@+H<p
9k>DER J5A=#n8k?VNKH\=NYlEX@F%hyTMu8b\X*jX\%?VGKnuY4>496K#q<<j/!&NY$:W5n1qC<lRL6?bah#qn
wSe@l\ L^8ZR=/ey8QdBYV%dLkkE?RV$u/TQdB4k=V<mD#Z\N*PH<h&@cFQ/8E/JeA@$1X=yalH6*^nyPt\\c6k
HjeyBC A\+qtXiZDXW$/*w9^^h1Z6tm&BL&t@Sd@&8*9t>QLPmJPY//tD9PCwcc=JVq4Rp>c$&qXF6%Qh?qjYS>
<F<8>q &1JCEjByl6LD>S/be*BKcGbh@y+VHXY#kb*:t$y#pb^/a<J\YXlBn+l=u&!aFXin8BL:Y&X4payQ\TeE
eB<yZ: ^p=\jhFWGN9&SN\Z>6N?F&BBZM6lNXC=tt/\S@mH<NBYq*iE+Vw^RYJ!>8QVuBt59Qb&^\MFhFNGw@&?
J+yhee Y@MVS51<@Fy<m?mlEQ>k9PX:V<pkw\c=Bm+yZ#hV%*$/18uu1$T<MlPVS4@<GB=HnXP8FJTm8bPqq*P$
6tN@Mw 4=mSQ*FYQ\%M!@HS&%B=L#R/#@mt5JBc9qL1lRVY@D:=Lh&j%Hbt$4p9KS6*$Q&P=FZ>ZAFqRIJIXI>I
9/eGTI ^jb6$GnN&8KLQiH*\m5DKb?$*$H64upTypyH!K/85l?G$CXjD@b&486XSj9p?WNidG6@i:nw?ETW>aSZ
Mb?DHI \hyMnMn@$K!LQ%FqtSV:Y8u/1JZCq4jZD!p*/Z?#&Ln?1X6F#LD>w&5jV/^a:9Pqn*jX<i#Gd4dJ>J+Z
IA*W^c :C!Q?XVZ4RmhLGdj=lmu^4:a866n/Sa9B:H&nc\t89&%Jdc!*Qb1q&\VE<%/::t^By1%<Bk4Pc^>84#\
5tH&nA /1*+G@^8TduI/n$tPSq1=wa:mH^PWRSQkwZ$!h>MdbVq>Y#ep<+bS*EHYTy9H=ZkibbjXWpS1laQmZ%u
qLZKjd IdlpiXI=FJPX#1N^JFM4Zi%cuQW*e>K:K=&aetICyBwp^Zyp@/y%^NEc=/V#5JPQX<tF+^=/P%1Hwq**
AS@>6y :Xm/TXe?@MqI&y9E+c1\d+JC=\YVFm95lQRX&GESG1VjX@EwiteTyqP$TZKnHS^>#m8VS%>N68pyVFRV
T%l=Q1 Z<!>W>dh:=NdA5yY+QuFnQ9L^jbn/*M&C++>&d=:l+&BY\b!%Z=>9NwZ>b84465Yb6dKjuI!cZWh#!N/
\NY+d$ 6y?t95>h/9tNbwp$1#>>S%^jS^JN=4cHVw=1?\WdNXTQ%My58Xce\WLuK@/K/jy%!W#!=j#GP6muYc:N
6=p14h 8@@C/bbwI^@P@9B5j1XFmwW9EC/B\Kiu/q5V:@1jYb:+>Qwq4d$dJ9PMn1WQ*4X5aYuQq!R+?ck*HDqH
Jp>VcG !y>My4euHGliNqBnw&Dhy6I<FQ&SX<$6d1?A:\HHSPNIq8R6^1lBeD#uTV8$\dG$aZ5I6%ddnRT&#RPj
n&EL8W YKpH/i9YJtc:DkWh1h^:yMChy%nbu*&5><8>P#Z%imVZH+&Vca&cn1ipDFE=m^Mi&$m9%k&*9cHXpG+<
SuDKZ9 humTYQZp:Lau/cW6@w1n%^Y*w@X=eW=iEpal*H/5i*iJnFm>&Pn6=VaY*dMd*cc9*$nj9Nm&qMjBm6wa
\mp*Pa iFj8+<6qy/Y59w\j?cDWuqJuZSD8Pi#aMM:=p4W>YdR5Q58MNqc&ynYNuQ6\&NyeK%Sh#?y6aj+A@TbQ
6<j#1a hM$Vp=P<:^6H\9IWIqd9hE$<Mt\5J&l?^:54JaWa\jLk9Z?:N9@RuZyT8&cLy=P$>pP?/widql+n!++T
>V!Qna F!hdS>9YPhm8@56LhJ&$mK*<^%68aXJYbSb?!!beQ%T4Bb*&@qJ!pnhV9%VpVuQGy9=u=kNYS#P9H9$T
ePIiBJ EC^:WCNH*pt/i+&c!b1wkc&h4#qyIb4:8=Xdt/Dn:DLDq=\*n?@nm<T5NNyDPjVFC6:b@6S9$%Xe4aVb
?&kyuX /cA1tyFb#8KY*wFnL%KMR9YEmqK?DY\*>wK>VS?4<Hknt*$1hYkYbmcd<5IIJ5lbwW%:^A!R@RJ1%LTt
Aw?y:# #*#1E*^NQ?p?ewe+JjY4*e*QWnRdJQ<TyK6VV5Pmk@6R/=+9D&k9t6Jj:Mm?WX:P=u@wpi\DcmMW@P1I
:luV$> K@9i5@LHG8yLZ%^lw@ZRmk\JZWY@1RqFc!SFGXXeEZHI@Y#PIT=\d5e!Awjdn?5C!%!<=RMc>8>e96cR
ZD+A\I \B?8MmAZb8<^!e/tti41dGuTY<<id/DRE:/G/=4$&@6mY+Sij9BcFbnXdH*#SNTy4@jQnH?#=npDuhP&
&NTD!> H%e@^&GV/n>t#d:BS1^Cu8Th<b1FQ?C4:Jtt\B$>%<RXD8=1CPG#&Np4&hyV4NXnF6HqY!b/jP9&eWYP
XIijV% :^j&X^$P/998alntR*@@bim^bX&YuaL!$L59nTEqZ4Kd!6\&:4:qeEC<KmH$eE^y*8X!P:&EM6*DK%/F
ZXaal? GLpWFBSt/=!:8Y9#^EGL8#\ie89Q\C8@P@kj!L4#5MVAh5qF<%SH+1GkB$*CJ#<uc>eqe\qh/FNJKS<>
ATm\!e jau4XnG@%j6!LbYn^>8Y=YI@FqQj1^$!W4*FW*DA41Dt4T#jml8&9w951u?*+DA$b6GP#A/SXH\KJ$TI
@PKK+b iD&kqD5tXY6KX^:Pe18Gm5T9=6n9w9Km<u6D6Ii4#:q@:nLmPT\e?k4PjHp>@4=p68bJ8*QFl!!8uI\p
/IuF\= ^Jh:El^%JY15i>J:?#S/S\e#XyE?HJK+/9@ZwtMtGnbH6I<HSmcI&J%/u%IV=&TV&B=!upPQ\?9k6!!$
\4V/Am +1!w=cPe$q&*8Ay58jinknL!J$nNa#Gc1\:FelR6P&VA$t9p@1$\#/Q\K*t4IX>k#@N4I!KH6:h4dble
YXemhA K!C\$YGFw6!FI%!L4/&%LdF#QL4Fwt:Npw$GnSQ=uw<+m$/6Mwnq+Da4hM:mP%y<b6L1\y$Nmnj&VY=y
NXtnka NiNXd1+iq+!+5e>AdH9V/8@uYM6TL$AH6<di/4:!PV<AiS:5yTatIiFh6W8VduYyGQP>hdPk8@#G66$S
JG85$J Y#?Kdnb9>HB+6D4SRH*^GyutVWQ?ucV$lPXh\VyXYT:4ZAMM@k4MmC\9MdAyQbSH94Kq*5B9Q!9B>hQ#
<cd1MP *^Pq@BV<P6I&B#65V6#=$E@$iSS4aLt^>?=:DuHeAWuLXlRZ&d1?!?6y:Z@\F@ZhtWWun\XPCnZ$6C*y
^ER/1j FZ/:<b/pw>ln4Y:qVLFXIRq?/y@l>\e/&<>c8#b?9NMZZNDh??y8k&i#1J/YhLXD*/tJ\BMQ#4+8&G1R
q4$Q#A w4dZJ/48bMZH=dy\!F4dR#yPb\pY4CbS6@X8u%jwQd&>+Xl1qQ9Kp5&LCn#nQ*K/QYphH:!#5t<k@WFA
/ET4$= YHHJ$mTnk\eP>lyE:!+NDiNQj=pT=Adj!j55!?p@iYj944ic6ey<Q>*yERuhT^SG8IX<6+t>F9p<<8qk
p<V=Li *:1R&DNIEy94Dlu/TqdY8aRl$H<>l9!4lTHRj#%8@F@CEQ=V@#L^eQZ@:=9JW>a#8:+WEnJD$$?Bb4Wh
ajVAJ5 KBVT#JNRtAIKY/a%I@bPQVZ%9$RtaBJV#PFjH\Kiq#4F%GMk@%Pha84@+Q>IuRJnTplkJIS=RYXiwLMZ
aV8I$T bBL#AtJiMI%uJ+N9/wyyDVG6Ica%^LTGtLiGtMa\$^mGtDiCtha\$^ytYmNMc+S=c+SynDCNEbS=I\4V
-AJHWA 00004b4988b001202b4 Page 250 of binaries2.zip
VpQd@j t5K$ynC6KW^4C9QYXKa^qYqMSbk*wnK61W^4G6Pc^4TtMY>Na^4VtMawmZpnylRIlnK6Wca%!4VGtLjG
Piwn=j tMaa$\cdha%CIyFtI*F&%1a81M!L&Wkppbp&5:M&heE$b5:c%BZVGtJcR$^4mGpNMY<NMa%lynF#%1c8
bFC&DK tEa\$&l&5ykTF9?*V9I@K#B#uI=u@6L?9a\EP5jy?DqG+@TVwHPeny>nNF:n^l\p>ZPMy8CW$?a+^D:H
?HTP$y cATudnWHTj$ew@EcGia+c#:HcJ#VHPkeJQZ@i#RF\@9dEMlwHHw9hA/T?nqG+@BwwVBI4PESX1E\TK#l
Z\c8H5 MWPlMEm5+XE\wVBI4PF^HcE\TK#lpR1lMEm5IVlp:TkCEt6+*D<wAlJ4CI:wCI1A^B1CI#1CImC^l8B\
WH9m=W b/AITK\lPKInKAITc*nHCXAEJNaRuLQuKAITc#CPuAKKkMRcVMQ=jTMk5RdnpQPnFJBak*HI?XEKTK#B
yY4D^m PN^HKAWp%tAe$uKWAlJ4W\ATb#SI4EE+B/=SCpm5RTlP4FFAak&m+eRcBTVYIB!SGbRCEt5Rn5kMTkGJ
pNlc++ NRnGmVW1TK^BPFIPKBWp%mATV1^SRYKNnENTn%JBaw&MR%KQWpFmna#DbwSTRYKNnMPhkqKB<B4iq+kK
QH4l9A lNhwiE<PlNiwiE<PlNj\MlMNCK@lbTacGRk4+9^CcTC^S5Zy4WhyaHkNd#RRZ5Q4:cKB+VYePKiB+VYe
m8c*%V *EID\t5+FFWwDR!9+WWLGF:DmXRWCK@l!Ick/IL\Gk1G%@D?Nlli\+p%FA!9+eRcCwVZ<L:jKEm5+ZH=
VQw?QV wTkaZ5PJNSRI4?Hqe^RI4?Hqe\\I4<E+ea+B+VWe>kkWA<J4iG6kDAbCZDm^lkHlNd\%MAcE%!l+w+H\
VT>ZJP G6/1BkQCc*m4Gk\I4=F^IlZDkFDQ*NGCpWBmna^DIaCS!ECaCeabDSJ48NIhGAu?j:H#G99Z\#S@e<mC
6K$YSi \wAt</Zuw$w#%PJkEn!>qRd!YGBdknTeh$*>==&cX4tATVNPISCRW&DaFeF^CkX*c6:$jFMLRabPAAQ/
eD:u@S W+G$Z#ATECnGYi^n@*1a=t>QPC/A:bW$:hV$VIE=STa9!CuwF<#W%FKGP9ZnubdDIXPBuIIZ5H#B!Mk9
bVlw1X tKpy:Ml\cu1tAJ&mLMkyKnAQCV^9GquG/WaWt*EK/NA/SkbKFDmH%nE!Cu4Aqnb9>mp!k!&GNnNVFBS5
1W@SI! ywATBe=iC\cSkFuJ!hC<9%MMIpH1FHAmVSeRAJ!C\MwwJB!uIHD?iQK<lTckccitb\4RKZlBVmGkM<WR
NSui*t dyy9?DGwH&eRBcNaA?IWbRGdGBlEBR+@E4\AXuIKNIMwGDWpEKiAhmmwPIkCRwEJm?dQ>D@%jcKRbn/?
S1ELBI FDLR^^iwLE1l+H^<ahI9EJykpAqm5>tQBJV>\P16PK6pDAbNFCRMuVhKu^b6IW<:BWd>mIEXeuEY:^mM
pAu@Bj @IKWQ9YFb=AYMWm9\XkTMdAKMe/iAkbVj$FKl&p#VE\pGNky&wKeAq^/\DV!9KWRGZWTBJuJjkmR!BkG
BuNPmF X6QG&aHBEBK\W!l%AiwbCDTV@SAkpVEM4FmP$^!BIhA@L>:C1Iel=Ju5l\CJnGFkXZmeuk$MAW<W/Q#b
I8SLHQ >lu!P4QbD$lpDAM4:?P$ptAI>b<uX&H\leDwdKIAEluDkQwGEJ\PF\^B\Yh1@6yB6GuNIIbVMJDIGAdW
<>!P*B pIDkNN=kFBI+bRi$AJkEV+8M\hN>FRBPAZW/IDn>RBkF?lW#lW^4Bp$:BTTkkwG%WPCW9VAK<5<V/$%4
hcj/>D B<E#/!qGF\1IW^Tk&k:PiwyC@SZ16qP#BM&5y^nNMTBPASY51Dn4KR4/C%D/%B?B!VPIAkbTpeAwaJW\
bT@P:R HESBJj$CWTIGZS5&k!ka4WRAVkG%1VCwT8h&C9wF?n%VKbbSKYM+BRH^D&NA@T<\D9<\SpX?^TISpwbw
C&uM<b M+mC$ZkF+lSRwmDnIAw1eKKkWmpL&E8HKDPIk6EQB8IWWKIk+TAKKtnXA%uAb8dW^^hCblAFw$$N^Ctk
FRij5P 6nMWB%HRj5uTk#!%WITtJcRa*ZMAVkH%GEE+9XWaDRJuub?*W%NalPHW>E\BPkW9!CpEGKZQt%cWwXkG
nq<wCL pYhkE1NVEeRywP+BuD+&nEaFL$WnC<q?yBtaBAFy5YI$5DbTHJlER@@=?nyDEbAl^Vd6FApIJ6HA?qN^
=cBlm4 aBL/K^LFFD^qTLE^uGK$t\I+BhRk^8Bjuh5y/Bh<jBpMuNRbtMTw%IM+BT?k4\XDpX>R<&XRIE/BV\bQ
?@kHQe K1NCD?IWbTH6Nmn%F>S<y=aiDKitb\4RKh1CuALjw%mAb9mWW<kM>mMDpj>nRE%+bB#!j\\n@jNM$YSG
PWDDBw h^E$k@*IRPV@GAdYeaYD@VAIZLTbNP?>hJI$tV!D@elA=Q<aWN5kGaj<H\N1G<TVqMTA&kd^S%Q@?SiK
W^bjHH VKEbKnTnypCF\X+wWL5DFi?F@wK6BJnBi+#NeB>V\XdhGNllkVp@J:PHk@<iVJNtq>*\9LiHGYWY!1^C
hqSkDk DkXEIYj18aAcw?a?$na%G8#aKBXuNL!k$aB:k^BCud<<C5Skb=?l</XAMNALBcw&#u*?iQdE?D?6V#G%
ED/uLp ZEBtGhwSEId&1eeCP#lB\*EKBa^>MpTb9$AF\=6bmuaElKJ>/4tA?lLtytmjQe4@D?@PMNLWj!VKN9Xa
:/NMmQ RFWE9B@Xj>DyTIEZIH9A1KFPP\XTR=%/LHn?NhSbmkY\?INJ<=+1SltB5i9P$NEnA?XiMqm>ETj*@96Y
+8lp/M S/bZ$%l$9twP=Gt9y8eK$C9ck4^Cj$%Yu%c\uScTA<41bLCCI$=Y@@i>nk6ZlGaWBtEEuyWuA<41RL&P
P9AM$: PEjKb#qJ\JR&EeyClPV?E!Y91eeC1mQMDibu?XZ?%mucdLeQch/NMRnM1B@MJHaIA<y@RL&PMI!V@@=>
pEIGB= 4!PNCT1w<%+qVH&hGE=Nc>pAPpXdpFMw1FML\NPMtb4CYhM#BhIWQjXaRAZH8b8mb#q<@6ayhDbSWPc>
pb\JJ1 >JtiKh15qBKaW$C>n9lPRiAj1uu*&nI$@/c?CVNikZSFV#$Z&GqBEw=Z!Q^*:KhGW^a$t9wjLCby<>cn
j%6AQ6 Jp>41e!wW=GA*mnRl9@e9Wc#JFX@/^W<:hRWSwDtucbInH&<&RN%XDCu5QuVP5\TdwE=6RAly/tbkmt#
Z5WHZQ wnNAZ$tEQH?&mXuT5Q?8#<IeP/9QRy=Lu&XG%YXYu\Ymaj?LhG?YJ?>@/4M\c99@Q?m#hEqHQh\lE^Ze
=tRNQ* :IjepQAk=tX4yE8H4Pewnk58*?%J48S^PYbWb1p1F5%B&KCa=ctw!Y&T9h=cP51NR$e%<NTt>%=a%tNZ
mYIlPb Q@9!a?6wlc^Z&l\\WjjhN!4Xut8$l=\IQKj@CB:cTwk#m&/haCPu@Cqp?TA1nE%W!GwXh$&$@njjqGw/
TwKNKd >MRDt>#mt8JiX&LFjh#<6+ME$wiq@N>Y/tnH%IYyNKeLe1k<y5NRZ!ChF14YV5jaYV*F^WQbiIWdiH%T
&D9i&L /IJe\&#I/481m5Sm<qDjH>EKKp4Dy$mC*QGmBe:V\m&CPSYLVJ%eT:VK4c/JEn\Qn9*k<?#%+Bba!hJD
LVV%M$ CD81*WIM$!tn4>Y=q1D^yF4uqKN+&GNB?:\:Gdh9VSmw6R+@Jy5/PW85<&cl4>JbYb>K9E=jH<JYpXH>
hhBq^F ZmVMe4iGTK&P=!mST:B5+:4cDW+91PZCmc41%$&L:@QF<N:JJyl$yK=k5hmRJj/JD/p$JpI6qaK^N<^X
eSQ=^y /ZEE!?kdmYFH4!Y6NBBI8QjN4QCFySKjadHhWn%iD96w\5lJq+RC*>66#!/d8nwnm*T$*ea&J>8u6Fq!
K=kG!X $=$p5!!@Pwyq^SMjQ>T<ej^I@JYE*jK4hBhquSMp\Kh$nJ<XPww*^hCX%%uIYKZ8Q/m<X*cD%TZjVVbH
iG4AbY M=>>>i#ncFq#Z9LX$p1lLjbZ>l^=>$JS%Piw5\hy6&6d*wWL*%?PDGd9&q\Y<tKAWJLm<?l%K??niEQ#
q@qnl$ :@La>hI*c:Wc>$1wmuK\cSF!&$658EZDdu1&^SCMB+JPhVZLK$h*L9%^15#mqp8Ct9PRtkF$i=@J@aVu
+yu@QG RiaCtXVDqk/Qjq89**h4jDK6:*i6eM6P:I8/CI$wDb:ce@Hb^JBi&aCa&5Q^kh8llieJu:mQp4!nhn\e
pkAIj$ JKm\H/mJPh*R!S$hjci45VKS!E84+Q%yVDVcT+&\LpnSRGLDiFp<ShWY=j&&\$W<hptWupc?=anT*dQ6
dTj:nt J<jF^:ueQY*QZ*w#<JhZ#GYPmum>DyQD>#apDbq/jTkci9N&>KK*S?QTX/R$hWJdpElwq8T+q&4BkM^j
FlK#>< =&<?19MNVckyK4y?**@$Pb$8*G\I$Z6bmLKuewKJ#WHc/ipwahQ:i=cV4DwuIkpEY?utbi<5n=4u9p><
J>^lQA =Qk%?RB5aqlVIhMtY?^\/>:?K^@!&EJh^+/!4:Ln=:^IGY?yme\e%DN^mk$JKD5hij5GwWpIp9q<w>1<
P%E$pQ biPY%aKnCyq4CBh&K9IcW#l!lq&D$w@>>E<9YT8d*l\5He>qXLRDY/\L@d/pic<&#/CGS6mJ^YdZt#^$
\K%#tu \<XD>8@/HH8=NMIu+!M=$QbnZThjVN#L$d6:W&1YG#>bQj^lRKcdd9B:Bu%VkiH*#JJ$%^dF%adDT\<X
E=%whE eE\tSlhCeJhiSudPpd?Y5SuG^^CH:yip9qp^=t/^<jBc\lKX6LNC9^6>1DHTMjIL1?IMeHjd^ct\in<^
ZhX9jq *Zb9!m:JCH&=kXc4c5thX>GZTp?LB=\nnnljd6H<jbM@>=cP+Q%%ZF1F4T\&+XW4\8KqKl?jwl59h&$N
BmQ6iu 1TiK1T*PqJJ9=V@WRyGCN%>:LT#8^d:wCWHcqdM9dWJbd@Xu8!ZjtyNj56d6:p@d9!Fb/Z814JBDj=k%
Dahc<a 68V>F*6H?Rl%wb>/%?6aYma5?Z*QK/cQyYXJP=?YDe++wqDMinjl*huVq%IENR#@%M!M<kl6jT5cRuHh
e9YlY8 q1F!IF%q+^&Duk1idhEBPa&E\+&%mlMba>F1WT/bcSMcKhtP?kcSd&Z4&L=KCC=/d<W:tt^mLS\Wp1&8
E>qd&V <?!KjN$LDk8/d59ilIdmm/8T5J/<b:q\WERn6@Ddmy5c=*kQJYkc<iq&*N/il&!XPu<5kN<%cb9dutM!
QwP8nj LVLm5T6GW?CPX<W=?=GEQc8&YdNpK!<PTApdJD=bc=+jS#&tG*n!y4<T*==dFP+pY8iAe8+w!!WDZdb6
qyNi9G Qa=W9+R!$bDI+8@%X11E@D9q5LntD#t4$*6=8:t9uppZjjhh&&nkG/FeQuV4qj!uN:wCVktV@IadB?<X
@?AW9X qlJ<Ded5?eLLMbph*#w!h!<jGZI<#eHJwTnd&6!ZW^X%wIm@\dkp>Wh58*>/lM:1^ewQ*X>PEHecS\8K
VDMyJ+ Qi&&Z>bupq$YTF^<5DKWLG5Z9D<n^EI*8LV8#FaFi6!uNSe9YiXaXyJdPPQ8!WZ=?dA==:G$>V^J<Mw*
u!w/#^ ?$:PVD^eijj/$L:Pq\u<#&PJ4Itjh$hZ4X$j@bh<^/&l$NPVqdidibSMn*iL=>=iE?#SL!R&MYLS@$bu
+^APZ@ $+tI*lRYn&&Zuw*8y:FJ@KHm^:u1ytnn5+t>t^!TVy%Blq&KKpL!NaQP%>+L<nX\ytAintjP*@/S99e1
W\Wltn DXuDj:Z%\?bHE?9DZSe@CZa8J#*Pe//><5uJ5Y$5@5mwVXGYduT<qNu%^J4>lK+H=:QVct6?1\lV9cTk
iE#\nR $TI&\P4ie!bDdp!Sp+*:E+im=ZDdbW=PXtM?&KlK^GEQC?@KIBqCM9X4\^@nl#+Njm+L@QB%TFum6=\p
BLWe6d 5Y91mlK:T684dLe<<%5c5w&Gu64Z&Q?DX!eMLtbyT%!T=yBk^m/+iJN!1deXy+JXut>m1phc^q4VWIi<
-A*w5# 000e0cfba48001202b4 Page 251 of binaries2.zip
<B^+wF hYq!4miN^M/EHbCRLuPV=^QVV:mq4lh+@j>R>?Z^XG=99PcbEGXwWHcb6h>yD<m+nbp!bE^qKCJW$6!S
84F1M? #G%CcKInW#KW5cTPbEklIT4TbA1XpAdy%LX*>8@i*?j$*45Pu*Q89j?>u#=4:Z#Z<:#Q?/#%jNj#=d1h
K>SXJK ?KJ?SeEb@bA#&kL:M:+4D4=M^:K?RYZhRwJejC9PP^At9aw/BEQ9alc<jG9PCH*k$I@b4&5$8tIVelb6
4jw?B+ /Zyw1uu86$yq@!Mi!8XX=<m?NCi:6<>>cW5+%:=%V#AwXuN\PcIV@TcEQuCqWM!N@d1#>>EDEW=J1:h@
:8?!>Y iLyY11%>qEn\4:@tTJt1*MC=ae5BuV6am?tqTRPQNYq@LBh*@*J6::N#BT=@!up6JP&ZE@@6iuyGtZQi
ZD4ma5 ?yE*$j&94I*V5!jQ6jbtiiy6l%GX4C<uuYyTdZ*G1e/yicei6p?NVDZywmepD9aK:Z9#cGHDy&ZWJ%>j
%e5tST 4j\19unjXJ^=ta%PKuiYi/d<&wQQ$t/REB?hKpJqV@^Yw:5j<*\@LR9kdV*menq1G$%$1a%&*JWqjca%
GAR=QW E\yHnA4NjnVFV\!e:X!AQ5>ZVEl*XnB+dn+/XPwbqCC@Y8nEE+TYatcwqjXY%a\VnjH@hq<pS#jjkYM%
LB?t>? %?+AAb1X!JYLEeRFnWwYnX<D<9wC?R\9yy<V*hw9KyHA&>EVWFhy5b?naIu=@i$Y%a&u591dPi>#uZCM
paBCa^ CV8jJJLJueQZ5tcTWHQ#S+:&lpCPw8dAAE@Q#Xtl/<^@+^*8Qt#m?p$@/Mk>/$HPL$Kb?nq5Ni9D9%/&
+6nkRl qLA!nW6=Q#dYGLKu<S9JILjX>DyQK>jD%$iKqcNFh/\VF4n5Yi<mHNwdYWQt8@<X86KiJckuI1?PnA%?
jbZ8+q >FK&HKCFGE:a=qcdX9eI>jN>H9*8LYbp+QqYQ/ShPP\:<t+*h?6*:>/JY%bjp/^p:q!?^VQGp:1ncy%b
8Ek6W1 :PJ5#+tt:>PN!wjnq?X:FKt#BS4:JW+T+*=V=SJ1PdTb>kW^%nnhpnE5P4%a6Ml:cCVCw>HnRhcGq68<
&W+dZ$ aqE?ZNdVB6:FD&/\B<D8ul\D/8&XC#TPZFIRd*uHQ:P<:@#6ntte=he\#XINDj>mi1XLINy\TiDqQ>TL
$PISEA 69Ab@emWYih:wKh6khD1k5l&at?Dt9VP6>MDYb*4j%<i+8!nj*PT8/4!:i<LFRSMnL>%qelLbCu995PF
$^%Vd< YPdiyMuaJhl6TnCJCSp^>aap?9t&Jdlj=Dt1\KbdF4=WRjiJ5PLX5>#L/QtNyt%8\t$BK@&e#%:$c!qp
aKacZF m%jdL:Zkp9#q8k/i^P8<YdeKLRl=K8^*dG:LF=HC98c*5/>Y=SJPeH8b1cM<:n!!+J%Ap+@Kt$i>>>uF
tPL+uH LNjI^>>YI\wK%bDMFKVi<ebKS*a8Z%Q*wYXA?E*JDZE8d4b8@hdeVcY$IjX9N\N#9?%cST!<KY<ayi=D
IbHM4n c+eEq!cEm*G=mK=!HFeVJMTH6KqG4%KGh$a8ZcNC=Th$L9V58cymw>iT<9=lT4t9e@uI\aZ=Zp5TFciP
6YSjI< B@+I?!w@p1B/@\GySK5mJqy#?!X!@EN^5VS%Z?WB*^\X1=b:H:THt<!849wT*TKwEM+45QM/N@&X^nld
4KM!Ca d:&nmR1*bu94%\u6hYcLhheQ9XNdRGm^Qk<%=6LK%IhHK6e@Z86=!MI<%XtlepL5iV#^t9/X/*y^b6hD
=*4<*q jFe6:PVk>6^1?+J!^bVK8V1$4^uJSIZpZl+6T9*m8XVHRDZJj:GG=*9n:KB6aTtYp>/&8%QLL1j<WB1!
EV=kF@ L#R:&+/P6!BRthAFu!d>yFTih8NqF$9%H9=tCKXD/$+IQ+\!N8hc=cZNLYm!LW^KQ$/pm%ND4$HVNPIl
q4/Ww+ &ZcqT/CQ+J6l*yW<E*=HjLK<u$8a\ujMTR6lhjt^F#b8w=hW#Ch:6Vwitbb%9\=Dd@4H\eM:hW1F4jLX
E6c\8E %d%/?#=5QY^*!T1mR*Ph@!%La/&YS>!T\lRlTjZS\aEQGy/^ISdXk$I1Jl>>:*VS&J4KMT!n#KYZhL&w
J5ZtI5 *E:X:&8u!d4aha+J59dYW9*nH>YQTSAcRnR/GuhFj!8NlY6WKwSWdlwI%lLN>1mwplC4RJ8*A4bBR%jH
c$<EPW e>R^Lb:BNDPV#:4qJq:9Jja6dFy*55X9N&SjY:VB<K4C^<8ci:ad9\6*mR5=VW9@uqnTFdC>m!9b\VMu
6LQ*Gy THD#FiKj?6kV4@!AJc>*8Jth5k9TX8?MZDK=GC==ihk+yY*u4l&4KnSyLl=Jc#kp$MN&tp+#:%1J?9bJ
Yn:WRm a<?HB\I@6A@RD55a:*B8K^S@W@Ku:8BNL<!%>QPY+*i>F@J#j!J:/9N5:MnWVhG6/9m1BMZ6K6m&dk?9
>Ca4/q =%AkV:JI$mei<#jqJ6uGE19EliED6wbV*K9*T&JHiqimb@8h6ew??Ey<Znybqq4DG&B>&Kq6%FqBdFQu
VjJ\V< SjG6%#i:?=e?c9&6?t*$APu><V8tYcJYJyLGut8=k$>b\ChZtHVR<&65HRndQ4*cqY=6RFdc9VZahLGY
&qbhWY Zymp?<NCY=<*&%VPCV:<\!^+&6h$bGh!bQDak<BEC>44aDYPDq1NP/Ft%Qh^p4yHw&G@l=QBKe>MQyZI
%ptTLh DPL4%5P/b@cq$&pbV&kjcuu5:nnYZApMD4G\<aS*?tmEQNnSZyI>@AaXKqSA:NjeFWnKhw8TZDSyG#jb
=PP^Xk MtE=EbdNQSb#a4@I!^=l$yAX@StSVjepaZTBZMZbNm8XW5hi>jZ/u8+HHAL:JF@:1n$m8Q>8h?h$bKum
@Y%@=E wW>%ju8nh*Ih$k^Nq6unj65:/6+a<YQWc1$YRYZqLj/ERS9CR8MG8<h:Q^wt1Qj\hympV=kG&*8IXukX
>Mq=IF ZR*&*Y>q6>cZhw^uJXWiLXj:hECH#4iNLuJ%V=b^#b:\69\I5T5:FuT8TZwa<ZuwQ6y8&wjc&VhEj9=k
l:J/H9 tJ&&tm/9A8pn+:=:FB?b61e5wIlJ&q^Rm8ITDupVW9FS+=SPSILXpaj5ITwN<SHeG>&NHXiYPBd@hm^F
kJICA! b?<?dbP?k4nC9eeqEKj?u8wE^?5N>961R>S1jjb9Nh^@bj1RV/u?#4l>%@I$PM=HNHVwG!uV#nk5jbKh
&q5D/L a1Tn%ym@@QSINa&R$/>1/&CHdEn&8j#DItV\?JeB9$e^k>m%Db$Qh^MyI5e4%piuR/K$EA>6ESY*YF4X
W#$j5l Ke5#8#!\e!Ni1jEdRuTHR%P!\#m?XnS9e&\:=yaRNTDYG/Ht5k@:KDb+J?b>uSEH+4awtp+@HhXbA8@Y
n>&cL6 n+pV!SHalMqj\9ahnR64*li4*5d:b%V>+Q4lwND*S@%LqDX!ZGJ/@=CG!V!Q><SRhNn=m:MDF&y%<?&*
!@Fl?* Y?<68nLV^>:9p+DVA*PhnuaB1RPV+%+:DJ1Fh@%?Iy8t%TWeemXP@<!\q@8?#516P/>?Qtp?6jXSGTEt
q+NW8h 4uZHm!VukKSC?/VB!PMDJew^<a?Wa!PwSqDqeyS:YYk+wdDSh56W1p*d>a\Q@JtpB=pSCqFQ+9&/L$Z9
I#MuhL YGa!!jQAcTytk$uLW#HQCw9n1#JKkt/9e1!XmbaZjlJ=<dZmbL$$j#uSL5VqKH?16ipFle8BX1<N<4lT
aw!=$% lcK8:9d@qC%<j9&+?ej/L:a8Qmhm$&#PKIX?:PqZX@9h=5G^=8<DjK<4JG$*&V8Ec!yuWl!NL1pX$1Y>
WyeicS /=8hGp%$+6@1S^ZE6n6IZ6RP@hk5\qb4Wytqq>W9\qe%JbF\k:d\Bn*@dNH^5!N/q?WcLBd5mA*W58=Y
wHtIFF pW%GEw@qKR?t1QlabJj/bH?>u1NS=K9FuZMnPiqaVcjS95Qu9lHYVN$PbD>hEJ4&!Qi$nL8/w@P+6:Hj
ThP8SC w9&dhw=yu1mVH%9>cEFtyZiMlZP9<BW:$!9:LeKFSE^In^%j:$\8Qd#A9I=&:q#p?uM6tctT>%&tZ1Y&
Gc?$II 4n6^@ji:Ze?+%%X5t^4I&=e$ID*/w%lT5:J<cZFpj6biwRSJcYhi?\QC+Yca<\$+<aB5@hM<<^dPG$5<
99&tFZ dwY5V^PkG*nu&G1Pd*Vhijd^b=t?85uWdw9tyn$tlKa\$yPl6CQdN=mJtVSu1$m$4&!?6mW^iI*PHRGX
8@4E=H wA*!Z4j6F1*NQ$T6!H4MNuAmjWN6meGDhX?DhJZpC+59J>aheQ*&I+NL\K14RdHd:H&hc5+89yMY=*hu
I*Nj+@ Cc<aQCa*S6E661mTP4bcpJKePjZd&!/Hm1pR#%6L8BWpIQPeAaP8<HZ6i$k<i>:/!nj??MduV6E<Tj@^
w>kj*T XH</ScG9#pY?:5\/9+n>juR^A&+&\1LIVm*Hi^>LP^?a</eu<1jHjKEq:#u86u=CduK/</Xhk8#n<RiP
:jVXF+ aViYnly9*NT!Xt\n>j!yc^w=:$le\meT=HY14nje=Xdi=Kh=h@>#Ii4=R6pD=?6:Ynt*uFT:Z@%M\$Q6
@dWhZ< #kc#^RPHdueeiEGw8/G@XJFp&NM*+DS\1QmmljKL\bLBLFL*8:YH1MyWdV9jk*ISlRNJIhaBZ$YTtm=q
9WnM6i Gq^:qZ9!%XBuq@@^6CNKcGh#>:jjXdRyb=hynekN><64j$/W:K<$u+1>w&C:PV=Fe?@c&l#btL#hK?QQ
pjRY>t u*@uqlZ<jI@6paPBZBq^\+>Q*#*=lub$<\lZ#ZdlaYSJT>QFc#<YdD9<$N:VK**R^V#1YKt45*qQeDT%
*Rq9?% NEQkEiLW/m$#<u/<$t1*4c*!F1WjXkL1?S<X8i<e>14/wuTq$>QX:pdE=61QeJFXe68ZW@$Ib@Nyk4mb
ARt>j: Yd>ydp9Y!=1Qq:>>*\8N4lbb?\q6=j>RaZ84?JDt>4C9cbS%I=L<t<L:Dy+/ejD#!Y8j#%#:@L8taT>B
8^lEX\ dH>K#cqVm+8eLud\Q:=?5Qba$\F*uyX5^MXCS945<hZi/4LCZN\G*1kEWbTYaT!9ye>FqBJ/qWM=/tj6
hWti+b V+\^#E#RK:PlTEkdM4Tn=iDF\pc%at^q:84ThKMQ:ljEmi1^BkIJR:F<HnVNluyi!KS81!LFqKipMn&>
i5AcP& kTDXcdHcS/:Xin>/n6:LYbbqHXAwbMlVY=C^$#=FeH5G8$qn6Z?mG:e+FNX6=Z^>uhe+i*XFICY/h?^L
1:XMS? Aq84N%LH^!N@y9tS:IKwBk@SdpjF>eHKMlte1VSaWi/l!Iw#:EYXk5qN9Si/umS%1?qJ/TFu&cP1A=Zc
PX#pWQ *lWjnLj4I%CpSV^PSy>8>mNF6CyPX!W9pqPn$>P##d?FyFpq4?QyQZdl?Z5@ety5$QVtpGP?Pe>GLmKH
W4P?hD Qd*<$Ih9^VZblmc$jZb6=q=6t8H*Y5HuVe+#?S$n8kZb/&\CyRu!GiWCX^4#TqKJwyX<Enyd9D%#C?kE
/@lIK: 91M<a#d?1dhY*QZq$dnWh+B?#Y@m>IyL\<TSm^ECj84TSM=>*Tt4DBLjC+TJNTqZlT9u>1jw?mGm>bm1
+!wwG5 4+RMn#DS8%:F=?:&PFLB$&Kw>J%kYD8:la6%@Z&@ji=NF^IuJJw4at9W??:p4cVHL^Bd!Qbuw@qVt#:8
DK6e?t C^Y856Zn:pHuFXw!!:IWH9dhq\?@%D$6y5\9aCKh%hF5X1nK1YYqXN^iqm9K5/YTc\k?ip=EJ8JD\b%M
KL!pVD <>EqHR?L9bPi&c@Y8=GXT^#c8LYnbe#*l8pJhk5&6FXXWYJqVFVw4@TAbmX6@t@yAe$K?<^BmkitRH?S
W#eaMb +wFb8m>kWn\a^NJbkYA!/+E/?+BA4AiM>eAck:DGwLN@\5\V\9wu%tmWNSyqnebaa#DYGI\%B1P!jwnE
$#K%#A ?t>J4NEp%tkTc#TJ>a6p%tA!c#Aba@$RtVYc#ByNaa&t5EbVYD>NaR&t5AbV@\PN!lyNba&t5pbVb$jD
+MZHwi SIn%kLAiYHyN^Fu>ybpu%tmINSymnabaw&i>BIMl%tCaNblXlMJktDYcbVYabVYabVWaaj$$!*\\!*\\
-A*hmW 000b948244d001202b4 Page 252 of binaries2.zip
VJu1X$ \qy5GGYNbypQ@w@MFM6<MM6<MMac#LInnLEYG&abE5baw%q&lFq&lFq&lFq&lFq&lMt5^abblwVJ4NG#
qDDTLe h9!Qyk?469cZ16%ji5#?S#V4@/nyM#PTDDKdk5QY?K9?^K>tp*BamZ>6>@C4&SlP6j!9?lP@tw*k5Bj?
9:4bEZ &yZlX:PJiLNlkNpaFi<9S$BtW*AaCu@Xu@nXdBIPb?&9QR=?NS9DKZ6nIL/GIVnWMk#E%#Aa^%M^EF@D
L@e==+ mDm%dR#E%%A1n1iTRH\NyiDat\Vmc!kb^>+pEF>DMb\%J+H+GwyH<TcB?BwK+ZkLCeVZGDVWZ<<G<VWE
?BL^a> n@FMA9E%lI^uMSBjR$l+FkQ^NRVFYZM!mK<lCM=dRkd^NRVGmihpEF>D<KImGeVZaCyPbCKD?B1MF^ZJ
:p1iH= IL+Gp@DYHMVZeL1<#<\G<VWa:\wSGeVZaBl9#WF<DebnMFNAjA$t+4#jFBBjk!k+:#eF^Nek9P<aBeVZ
*@GDFW IL#9GAYhV<=E\icVM%FI<<tbKPV==E\W!u^!JkyR9kdnYI\KqK>BPP<*FRLK8HDid!yR9pdB5VeXKF@D
i/w%L@ 8/bCBe4ZMB^:W+H!Nd#aRkZK%@BmC^WwZ<PLLXT\jA*uDcWC=Y5+5RWmA8X49&+tkpFEwH\Nl<WLEeH!
XmF$jK NTLPdKB<DTjDlwlA?SyPlk$SRZ\NS%hubnbR9pdFY*PkjA$uypJE5H!NknMdKF@D8h5JRWD=&1?%bYht
^m>Y#i k?X4PG5PAiX4EI/*RAlR6wiHG!lj\>pDR^BR9wbud\kwZ!Ql4SyR9wdl4SyR9wdm4SyR9wdDyahkwH\N
pjNChT \5ENR$DbH5+dCkQqc*n&lwH!Nb#5HwJSwF\S^&I\mK@lKRLNulZ@Q<j%l@::u6W@hQ&cpj9@qATC\TTB
+kqAi& MAkG!nEyiLcmkuh>tZ9DTjJMwwu>BAX$@SBCkJJZuP8H$H>j6Q4j*cuE1HPYYtBe!!ATj+KCaCBRIG<$
ypJPtX CeZJFlAEKJ@H5VPC#t5&B6\klaVP&jXJew^G\a#Y>BnRJZ$IAW1*ea/5IIRMDG4PDa<a=\kMWA\9ARXF
X>&lBS tSewKuC4Z^mdl^wY^t^$#lDtALu/CKFEwE$bV5KIR5Ck=6^C<cjMA+pJC1XTkEAB:ZISuG<5m9\LHV^u
^8&Y=Y En1W&baWbl=+k+BC=:GNlFD5Z=BPthpJw8nQ#\tKAZ%PkGy&8L6dFQnLV!En!H^RIV<nBawCSR1kcmD8
bm=1j# 4l8qky5KuWeHYbVb\uMGFEkLV\\CKnQmHkaAqSqSBGhJkM1M?LMSaIpVEuuP1qWWb56+^wI!1mpkC\y$
pDiWhT SwG*/<R\$DdZnFk#X>euMX9GM$EB*TcGMLDDD=\wlbGBY@LP8V$Qk@QBcBuQBAY&\\C18CI+6+plnQw9
GwJS8H 6PhlZNBt>I^u64BFkKIWWC$ZS+N=q1d#V:juaSBqGKma6kJEBe<LFRKKm5^+!?h1K!K#FV+VFR\WjIH1
ZY#:hH ##mK%:ME1u?<j#KJ&R1jCawIqKcBFdbSuDTNSQ+*VEXBtd*\GclkwF=!EFnJHIhwAJGw\H8j8TijM><P
?D#+d1 Sm><JmmkXuIRYC$iy=WeSIaAM&wmSy:#6y<KMa<1GW\<^wEuCCm\In@P$T5bAY:RA&Q#$BlnkGJcClAW
q<RXBP Pm>RGPkSH\1S=1G!\?A4MpGlRPEQnJcAR&KB!GVRut9I*LMKE5R<IGGCkwHCH^njAahdA=HB#^Mk!n^P
Zbk4pT jtDmdQTDkKIjGJECl@IDWaDQB^tM^LtL=9:<A5QM5\WRWDBR4RIu?qERWQhD=>^yuWHJbjk=A^TDcAIC
ahTHyw C1l5lWPRkmka1Q8le#>#u>tkMmY=GKDIRMhbRJ\TGIi*BXEAA\YCpii5Z5DwHw@?>D+IA@M?CqDFCM@:
hMQ?Xu 1MBd1nt*MYV<mSA</*%AHW<lIBIMlEMqkcnR9^DSb#\Ptn%MleAPW+HaNSDiaTwXAY!PB%QtLF:APKIk
9Y&N4u #ZdSBC^nAhF&eM6aXA#<lHnP@W=u*mhGGa9BJRE5a\H^kZDLYFV!Q>@Ft6HGpDVdGlRWFGXiwKmk:nh*
bt##mp tRqG$wnNh6HEkLyw\pT\&\&@DlR\ERL8VD9*H5I#*%$Mt?%KV+cARAEXHIpIDmnp*&nmC56lKPquh&/k
$j\?45 jyM\EPeK\?p*CSP^j/iJK#ddSBMWFGqiwMn@SlQZGR5l!E>LwSkRKKBKJytMA+4/:#S^baBmYkwMFBD>
TyGLG^ DBeWBIFGQ*Si*b+bt#Fp=1QI1D/CkAK1bJJkHFDAGRWbuuNG\i!iVtHTIWFBwjMClRGuTVA$D:EFBmmt
GIMcA# ?\GCI5$LFPllJlGq#Fp!uCF6nDGqnSEtY^pEFXCpRQFiK84jRDZ*#!@GSMY$FSk1IQakLmwaApbFl8e8
6VGRjR I5ERL@py>+EBuXLAMBn4AeXBlaCnw5B#D85#YVy=XlwD/JkCBtI<annHFDCMkcNC$HuwLcCpu^*HWcB#
*wR/np ClkGmla+=^R\DB+6GC5?h!atm9%WpYCW>WFRAjEieP/>\VB\ubSKuZ6mMSNyWaR!1#kDFNpS5D89PJEh
YpbT=h ?S9Sa8::1yqEE=*XMENBNM\\GIn#mPI\^&Hpd$RL/y^nIGQ@Ae&1A<EwECwkVkZPHTMaAa$YEIq^q&D8
8KHu96 H9n*JGhkIDwqu8RMnIBHC>Ke1eRw@FMcmKqpA5VTk+H+qCkPT\>G\KMFNGj>ZISSJ<B?Sk5EmKaHA^E1
@hGY&q WS!cHw!CXpyJKHZPDnn#pmA#!<wk5#G8++CAA11WpuFTC&BCJbEE#jpMECM^RVE6BRkKuSewWQ+XmVy*
%ySWdC idRbG#MC#W>=IKB$CalR!VkF@nWwM9Cqk#tZj=tcS<Tj&SICAYXLRH^KBqH6%/CwwQR@hM/Fiwa!JW!h
j9e8T+ qh\mAmXLGFl:A=^pCaQ?iW+nI/>qNN9=1ZpE>KWCItwmMM/Z/t<RNdG=d^iy#QaHVFBpwHeKmKmJRDn9
:BCbFn FDBSp$yG!jMR=&Q<S+^:wR^\IKCAK1W+QWqknA\Mmn4*n!@CBMY$FCAw!4^AAReK<6#FTStkbk6\MFAB
<t!pw% DkdmceI+BVmaBB+w5DtH>JuqaG^$tKBRwPkHSNNp>AD:NTn\RDHuZV*nP<W+\YKCA1LI\$A5VV#XK=kE
yA^@Wk HmnI%HqpFI!1BBMWBBV>TGA6aZCmH+u<#$6DMnJ#Syu/y=IZWEaBSNKEejy@\CV1Q*@6mSHTGZ\w=pXa
nRy1J4 K6A:BWVTlHHcp5Bp$EBBy5/4XMwk!DJBWaD&W$ApVSmu<^bMSwC#hG#P^?wWtEty@ct=B9ThAmJyRunj
?A6l&p KVL\%R>p:n9jGWDR4DI#BHR@EkamcWI+>!NlMluaW9Dew^<1^:la@jN!PXBIB!JyRnnMW@m@Tb4Y@*Q8
ZZAkP1 4JAe<ShCe4Q!e:NCe6l5G>H@@6*@qYZJEyInIjD@H$J!A@LZBTM+Vi849cqXp5JqMjd6chcmile+8p&1
FGVka6 N&NZyX=^F?5Sin\qnl6=5P5q&bApquE#tnYLGyb!yKje6FbiI^$d=+Q5j:hbd*q<4*j\G:XWPqL?hM6m
Vj5yQt *:SA9dwEil@u\hPDl%88d4:68u*4Nhuh!y=HHb5/6b@59SenpJER%YG>Y&KKjuGFTSQFXj1RIjYYVyc%
EuNDnV uQ\WE4uyhJ$%Y5y?:65D:6#Y4c$<c+c5bTN&!J1>kQpYln$tCQdS/Rw4PN*PSh#PI<wT#Bj!NXBEtt4I
Vjnh8F 84F5:*uSct9Q^V\ZT4k=\q6FA@n=EtTZ*c*#Wcpcm%uRLCDN#ZGM&C15i6j#^%4&KG<J+T%5d!WmX?k?
ElGap# d+=RjjqEI:cp:ueP$@eGyw88<T?MleMY:DKZ94!q!F6Y!V!MN6^\Mn%*nN&1kmu<yq^4aD9hI^QiPEEq
hhlIJ= b+*Yb9WyR&?K*uGL*>&=>pFyJ9%Shb=b:1%ekRyj#p#*4F*DX/^Qqw*!<N><9#B<^R&NCY/^njA$9YVI
aBGBTl SbpPt\SKCB?%CBaXW1$VpA+Z1ud@5Vd=hNQ1^qKJ=a8N^JI%bTKk!1:%^Shmq+$>YdM1iw9n??qJCiH&
X$ePMC hG8pQw4Ylq#$q9LXJ/^Q%JcJGI%J$LmW:DwlcuN!ElF<<F=bl^Tl?P*bRb9::6q&L4c=%p6+HEdFS%==
w:9<i^ >@laSZRKF+*YZZ/w1CAReE=Z:yq!&6NkM1p>Wid?lXB#GW5:6/XH4E=N1qacCA/WL/:nG>\w6h/l<w^S
@MST$Z S:LFNc%:6!MIbY4YmV&Jq>YXl*QX^:yLiRn5>\$Mm@Ji8q+ePuXjVtHaHX%=Xc*4Qu9=>69eL++S1eu1
+NK5n! q%!RqLW1R9di%ly4T@dXVQYa16&hMEp$F@nli4Z#RYL>PH%4@y&&8n$*nI6X^^4NQy/jW8DtyCY:I?&P
Se+?\c /#%9Zmue?pX:w/I8STSV>AqK*!8qm>E#:/jBut?!Yn?4T&tW/#9du1<@?ML&pc@Ay1q/LmpD&iDN&VVN
we^/dm FEunLdjVA/I*H8=<811Yj@GSdH&*FMZ/+9!iN*bidX<pG4p+L<LT/PL?luM:kmTi$C<j?Z:\%Za@!/FL
R=itMm #lSFupKq9nVnd?:hS/&%XT#wWFbR&/QGC:8GuXSXDS8Q&4@$MiV^e8Bkc#$1GikuIkJ=X*#MLW>iiNI!
I!G=!Y ^^1J&QBq<MSK1&PYl?69pe#>ujSYc8YJTX$h!KPL1eC$i%%cYq:K*ce=yLY!1\eNZl?wpjDp>T+k4Rk>
Mc5V@! N5B8^*HcPtTRY@hPeHqd&@aw@<*Nb>qiTn5wt\T5#=Ey?C^VqyCPEKL9^b=?4Sn<1FE<%IhdqcCd@t=y
?N65Gm mTMTe6SJ\?+p>!tPG:8X9B^LHEy5q#:XWRl=TWj+$18Y&^phTTBWKeK>Sw*nWq/JG!@W4!yqe/>MDtue
WHwe>y wy4I4j&H+<%N+Y1Tk@wXm6b/?4cB^wY1!+iDm5ZNLk8XTK:YN%=T%pQjuBIV>5=5d+eZkW$8YCY<Ph8/
>4BT+Q =?$G/VRSEd<Qtu5/Sn%D*&*PhyXiZQje@4tR@ypT4:P$wB<KjFIW4@=a/dZ<JyP>1dt<1td&^W:^=c=J
?#bET1 bZEj>Lw4Di:#SNHnWuti:?V$hLP/jeHNEubVd8pmVYVa?G<u^EZVHp<yYbc^dYqihMR\bbFq^4ihed8X
/jAnj< Jy44R8JQCSkFYEy>Z8=kJnNpS#qwumY:lM%d1IPR<q8TjVR6l6kTQ%^EJa/uF/ZWttVKJQnay4DDVq@h
!Mw&!F l@WDKGJ*Rt^1JwZElP:dqYyJ<HI?ibtKeJ>TF=ZkYW\tyy$4Q>j/DLG6CDKtK/Lc!w5k!+9Sa6/qh:eP
G=iF4y RPXEt=M$qb/%tS>/6^p/t+^*d:u6$*@/St/V+t:Vaqt1!e*ZYCtjVcQ9JwnZKbKdy:G4Ne&wKQ4Q1<iI
&Y^VmP @8@hn884J+ZdNY%?KdZBI$j4>8$H!1>N65q?WVNJ/Z>k:4lD>lX/L<WQ=q<tG8t!bILdaW9+44\lb#/P
^bt5ed <AwECZ:*!H=L\Edyj1*H*w9PZ*RIiJpPtSYju/TY=T*#8d<uhjXApVmd:6F::W5#Vld&QyG%T:i?b%YT
86&cuy 5n%&@i65&&=ESDpy?Zy%1Ht=ZqnSLwuLA%ZPQAKeT>6+jMXjFn4\CNy*D&*\q*dRP&S\!I:DY>/ib#1b
PQ4MVk Y/DbdYZ<4ahXtjG\S6uP:ie9FS6%G^4KmT!:/Zn:wq@cp9VN4mQ>muaBtaIS=PjdJM96\4\qFTJX#\9A
BIK*!N hQla*Nt#/ecW4T9KVq!kb!%SyHWh9u%t8Y*!Atp:X=@69S6$%%M9:P<cTXQKC+*ZTu@K+$JT9tBy>?Pi
dSy+1C XiKXK++SW^=64+S<ChLtlCJ9+wm>TJ!M4@VbpN=&/e?NGu111p@eD6pj+Eb=T+t6N?*eVL@/STd\Tn&i
8WLA:P EF6h5QBn6BFH:EmtwQ8apdcYpqhXcQVuT#/hH\nG%\jjiPt5jTF4GCJZKu$#>bYC#T/5%FDH=iYl<XC@
-AZpXu 0008db61fc9001202b4 Page 253 of binaries2.zip
<6ne@J ZR$Qd1^!TVlduy+4PNVcGhZkjiy^BLw%45Q?t8Y%Q=RmJ/6Y:6RNtZRqSL$RZ#&e<nXW<G=>Y>GcFI>I
1u>hyV w*5//R1!F@Iucb*VyN59iaJ&u=$/>LJi1iKy&t+&t?dy8$=j/q<yY8t/FF\X8n?5e1c&!<KBSliij1WR
nDH6J> ccDq9ZkNY#&K/T<M>QS>dXt+cj?NdaF9@X^Z9CedjG4R9HSeJp5+=YtM:4YX=%Vn?=Zjq4yA$Vetk1w1
q:Dk^8 cujWN\wQBH:M4:WZ6%\YP8#\Y<G*?ynwym<Ye1<wt\1/c1biC^j>WZ#q4jd\$a14n^>d4BkM!mctW16m
q&BAdA #$nbcJ^*<q5!hjDk+<K^qtAyNShNqawuY9^:dWJjb#whIXy&qji>tBckP*Q+?I1jeA&1PyE@>8LIF5<#
H>CV/e Z/#Wdn5pt??%=%e9+WYtwn>Q>I&9iJBCpa!?=!wd5%b<RWLi?/PZNEp=1d4>?Y?Jjk/?:#W&pVk4*1k9
bJ%&M* D*qw>cBl&cqq%e66^1e%u/:^G4H<5?DSq/6XVc>?h$IjCYh@euILdnn^\$?JY&epZe>lj>l*^?114Q\S
j?6Dp9 %=/lL+H>Mcj99l\S=ptJ!>YTc^bKd*T5yRny%y#nq:ww+lty/njN=uqp6PiX&8aQh#k<%D5=6!>4&Qd%
6kcSXd Kn$8ybctt=WuVHVNc#VQF%ub1t\*ht<4jP!Jk<iZC5Nk+i1iC$L4PVqRJaKIlWyH@b6Qw\5$:w<ipniY
Tl@LIY tSmLt+\6tM=balw\y8q8jye6<Ly/Sq^i>TcBP=5MFJ<Zh8k$Ql@Zhdc9T^#pjC9$y5YqXyM>4!YIV#*u
HaCKVa Wp+RX=F&pj4qB>%:L&u\eL*<>n+4:WViiiGw16wiT$FJkaCl>>+F:81py^FC:l\h>>S%:jJ1Y8q^SMZX
nl\Zku I4+9A*Y:%^YS:N<SApW5V*QiShu8PHJ1P!Va:N#GbVaRJYJbk\1Q&VhqJCVRHGMG9/pMtjwF@1F9@tV$
MNbA\J ?T9L9j#?B*aa>E/LlZXj@mB\jApl@4K6\6n\1Qau48DYAdNh6VWmlTMJMcJedM$FjbRE9@Skc=/h88ul
iSMkDA w*aST9+JIX&!\#!QL\tp9&cD?+5T%9eaBu=/Rt9jPF!uHLd=qSnQ4YKBP^uuN*99pVMTta=aNNp@pX1e
MJcy4a 5**Bih/Xl8J6^Y\1M1E:d!JEb?HYb$5<:84e!&5TN>Ii46mhqYRT$4kyJyj9:6du>VEBy98ZZ%HWZnMb
=IM+pM ci:@ik&y5!$84T*S&y4W1*:pjQ8TA%H=At$4l*&e%*n5qq@\HYyhhILn++wT!9Qen4ymF?F:Wc/G448>
nj$\al >m+t=K?11/GuY?8ESat\9h!6b4#$4l518m#a$Hhy@c+A\\P/8S1Q$&9XDA<KG**pPH=WXj^t!6kVXP#A
Rmc5>9 qME8^FhE*1Q^%ly$*<=a#4HVSRWp/>!km^P^awu^N1JpGjhEhcPD!1I*9j5W#V#$iQ*>HcLI\mw%>5&c
A+KC>W HHC#<Q>k:n#ewp1/NI+PVRbFARu1IKAICuVj8y&\!VqIDpwcBWWFCbLMI!kmYWu1mDJIX4KIwKA!BAWJ
>E/+T$ pkSWbNwlGBBE#DPCP^i?/:Qjd6>uctHZb@?A$>&u#/t/d%Zhiu?KdmaY#kyDmTBTb=Fq+1S98&1ZJQBT
W%=Idm qC^d9XdFp?a?wyC@mQ8intkS&bCTM%c/h5J@><TXuMQCLWnw8N?\/>LJi#\GQ@<8?5=p5tu><#<%!/46
=\1\JY J*e*/Fy=@<F#+tZ+W:Xejy9ReePF^W5qV$^pT$&89K@!p=KJQa?<*Wc9K6qFH<Kchm%F<8\ynP^JquG/
5Q=&WI N6>hp>YJVkLijmKD/n@FlJ8\m^\d/t?aN1@J/\<9@ptbe5X*W4$?RIiQ@Cq9Idqq1H?5dGZTEtGyye@%
XRY5Ry FETWu/ec9H1&>5Zp%uwy/i%<E/155C9IwWt/#mp?AT=6@5Ch>tQc6\VDN+Z1/AY^VBVTF6t$?L*5DkyQ
<w4BkN c^HVQj9YRGqJ5W=y*Y4EnPY9JBFkIbS@VKJdPpkl5pl&Mnnw11QZ#1FPT@Ldjc/Z=R\tw6%5iQtB*NR8
t>qGK/ hwbeWHL\kqXqXKM4TW6I/=dX:q8uJ&lFi9=\pZq:#9KHmTIQ@#DW8=hm4c4<9P#5%n1/uK>ZVPSG+&Vn
>\!bHY D<cVBRthJ&8$Hi+!#EtNYnEu>i*14JQ9PA^?XiDT*4c88*6%%EdRiE!kVh6u9ia:Yy^bPIm<d&D>SiHw
PeRF^+ F=<&@5W&B/&Cce>1nbN%4:AVqtub$l+M@mLuZqR4FuHc1ny?8E#tFHeP*^eT?=!JZk9@/m*</VHmlT>W
Pp?LE: t4mjJG%!!ayMWPt48!i<J6nQjLHwp5t5$=%>ld6CCwdTVQ*=#5y9?DEylK*RZq:@qC@LjWi!i@5dj5PV
FT%MQH jiWNI$iWX^kFL=QnK>C=e6y&aXD8G?Zc\B\n1+Xdn=W/BtkJh/ich$6#p&1i&J>RiFhJ+yyM>c/*6ENA
:qabFw %k$Z>JGLjyynYbhq=LDG$c8J%>S9u:!$VX^A?@Z9Zu=/S1i6DI%KKR9*YR9I:i?=bNMYt#?+$P=b5?8J
b!na/< 95Q%!V?9MiQtSn^FFZj*XG%:?<qTiaZeD8tYnM?Pml$/9M&iyVjMBK?dw8wJeZ>16R/dPkRejyjX*FuP
k<a5I4 FXZTpX<LHMI:G%#8:YcJJJM9H&M=:5/p%mi@Kj?+1$h=^CMk>*YJl<BuK>6B^bh166E@Y@DIlInj64P9
!99Xbe 6XRd@!JSu*tT!/iu*Pqi5a=m1+\%4iDEI?FuR=5@QD>j+>Y1?*t9=VD*i<Qw4A%&Hbhn:p?=K9uaD$Yj
6ZV9+j &>Q<W@CWML?W\#ED5i\hDlbFL%K<uSc6dXXk1+=585BdJ*86YDNEN#He/\kq>EnI8?qC6>^4hbcBT*\1
pIWyuu ^k>JhGl=LP@*?euYwiSP^nZFQ1+LIyHVi\?R8HaQ&9?+V>:4aN<QS>c5tcIC1:N46^R>CN6HelGZ6BG@
XNBwdD 8>%Va6Nk%i+eXV9Sp61Q>Vu/CT9%L@:5wJyl%BK/b?Gj%GJGpNej^n^YFjtLF%Xal?\<*dy@J>5:p9SI
@t+\PI ?%ZLEecFjh%e/8<*1bujF:K^q4AiminN8DZ1h159K81V/*bTiZVqhy=Nyh9jFN9:%>nV?pp<d\QNn64*
D5%AXP Ny%+LTPTHdXDIE?pIJiqu&Nc&8IaZtuY14j?&1@Bq?+X1//TVH41<jG#XT/dXn86$F9M*Ejd>Iq%diN%
5IZm/B k<8P@pdNS+YVLa#ZZB?>S?I^B9yy&<mdTF^=ANR*6@e=?Ema&Fc\KnRp:k4XdT5+P1dG<yEZj:B9RD@!
Y\FTKJ <Nnpp#FN++VA=b@qdhciXZY9*l:A:@S^S>Tm9w%9a^WCyP\a%PNnd5:/T?Qq4#u4Yll&G\u&>Blhqilu
d11JBq N\yVdk5%HcktP=@eqmbT&1jXWY8/=#%ZiIYDZujX%jj8*b</Cpa&Qn5au4R16hI/yM*QMuH9MZyy59\V
VQi@a$ /Y%cB#^YPTw&/@!k6CBuPmjQ#d=tXFh?\$Z/JkW#%@N46qIipFKd&PZ69>ytBL%i6q>H>RN!N8j!&e5S
B?*%#n 9jFAX*9pbaWu**N>#@kQ*8j/&a>M*>ywuiC89!>PXc*n#WR?@6Bm/yS8i8W%P9FW#EuESZ*#D\8N/j\6
JqJ5pP C1eTJG?5hq:VZY#TXLk?KG%eNe8nYhyhW:=?d=dALa>T>HSqA#XRtJXL<!>=!Yy@+m:EMu$t494GmHhd
?b\Te> tqq&mAEItuRTD!/R8!9\4uXVZAcVEqJ?hZ?WypLk#dl#i?P/yyLnV?@NG^a<6iV\pl#%MiGqBhYPi>X+
e*wuad N/+M&l@B1uql!55I*9M&pD=R/P^dYCWL+lS@XS\\Gj8#MmmX=S<md*/>e96i5<e1&beb<mQT<V9DRy\%
89t@1/ i/mCWaHXCl:NWw<6@ddL!&*8>9@<!Pu/RC#nhatwPm6%DYqD\94P*<p:?%!Z%lh$>A8XDN>?@yBMekQu
NmZAq8 tlihc^9V9ed?//dljuD$YQ>+ltHn8FJS@H9$8J!Pey:NkiQcR6wHSQ^89mVFD^&P%Z+y*Q6p^iAH+a/H
tw9KYI \Z\1yc6dE\+IJn#aXjM?p!Hte/S#j%u@m19TA*Zi4?</WbKqY94H4q/P@X^ZEGG<M>Sn4hRJ!dH>L1au
MY&PTt k@8N5?K%Ql$!bT=6&C#X\QLti8!/hXtTj4@%H6EB4Z:LZ+j4nbN6#?YQ5%Q9G9=XXbl/P*cWq6a@uDR1
W^Z%qn hbMW*\m?N8%?\HNe\=ZQL6JVTu$w=q:ihJH>l%QuY$+NN&&SpVV=5NakQ$HhKdH@Se:t=d6&BhmcNnVY
GQF>lV Y^6bPP1cnQ4S1QFBuZhPFbVV!9eF>n<JiV%R=\h?1@l+6*+/>+Nl1?kJy59H$QC*hlXlaSJ*6n#bZ?nZ
AG>qkd +TP@Iw&ieJKi/19\Q4bL5Xi6*LB4uhcG?*%eXupTZ^RYjw!QTZbid1#QhPyI&1NVwD+\*JKVMMB/GK9J
p@PJbY j9mE<V=jST?@4#BMkj&AJS>#@tC%pBhVX%N%1G?cyTI68eZtaK?w1i&YN!X&hdXC+Z!Pi&/bQQNR8i=X
q5G>9C 8K//jqq:lLMpmQeI>mi*1kiWPaQE68CeC>QnccR!%98m9M84^WK>@^kcjFJ4bLh+/!<nTPk>%ElMmLw>
u\RIy> ZhVJyZV5nK?%lXWnmhjKHY\YHkPqb>VQ^AGlmh:5\/>6=IJ1XHdbXL@+9dLNe!H:jFbuV+y+ZFW:#&in
4Gaqa! <E8dnaVp<$b8*ZSFlnTE%KeYZ*?q5Y\>R/NC&h@C69@bH%ed@Q&=SnTE55X99SwhDb9+RcNHZhLdw9i*
>&?FC@ 6I1i1ctR46C6bhW:jtuKbEX9je=@j=!^+iiFMXp:D/aN=E<9:&jHmFTa?&@/EK+y9!XN^<D4VdYQVK4V
AyIp\* nk#jR/%!N=LTjbW$:#/tLQ@6aM?XM&jicjd@a6SS@Q6G$lGiLpWlX1*n!<wPSe1$&@+KbKY%da#L?/kN
W*ZHi/ B\/6M#1dEZ$::NlWXKNC#?VZ//P8TYH>h!?=Bed8VVPwjlWV8&iXXqZwpTMZ6BmQw+?%8#&KTTnlZekq
hkbmBG 1!#=Y*yGZ*45L4G++#^Qnd86hwnFN9Dau5y!wpkJmIn8mdWSF#wlcKm*RKjh^qX=TZyttD@dZ%dTQH#J
/D%XB9 m>BRV/cWaETZ/Ku&*c4TeY#D99X69EblK>kbaX^biX=H+:eQttT%=VH!LR^V4Ltun>L!^hjYZD4j+m:L
l/Q*Ym qGJuhISYdyWP$%tkG%bVi>Gt#H:Mwed11yi1XF^EbkL*NlhEM6/\SG:%Tnbb^tX!tYmK/np#JE&jP*H%
dJM<?> mLQc&aenN=S1?uhE=R6FBD>cIbFmenNF/a#VaeNe6$+Hd+>DI5ZP4NKHRchV*S!G4%T=$bjhXF#=>hL=
Wt*Cb6 YPSV4ANapTJyVZQ+K!=*F?uaTNq^HiM:=99F:4V^dDa9%1N*d5!SX*<k1IyMYXYhN<@$jHTyqW65RP*W
9ywaP8 8qjy8cb@jTmqmjl4D/w%B:CHm8JhiD4Z?Ia/>jI$t^W$qGbp44^h%ba=@Sy=LTApJlB=\#k8Q1<tRE^p
Ckp#%& b+&:VNbV<+DF@Hu%AjR:d^wdQ<19m4Tmcd#aI9cuY1JZRH4E1%T^m9JSijedTw5FjY>1F#/1Qu<=LDdu
QD*9qY HeM1MQyYahE:=b!mmh4Q\ut4<utcTlie>=@RV*LS9/H4t%u#KQ&=nccapJ?VPj%ma:jZ+qW&mM^1VSZy
eTwZ$c Za1=F+QEGmJiDNb<*XBR=:Pk8TqLSCbm*XEQ<>!w&GLiYqX>i$EiuaKBb:WdVR>Ipd88V4\1cIpSimk:
9D?8pm !ieWwbEZIHuemKa8d>\WB$c/iIJXLQp$Z!t$jc&^<NE9MBjYhyG&Z%VyJ/:X4N?%yDdq/Lpyl/k5Yui8
ndTpL! !ikmY?4FYAMN*bNjymlh#^p=^*pZcL>D\yhaeJM#?j41pTaq8#N4H9Hj#Ew9<V?iI/%9>/4M<4HNcLD%
-A9d\B 000572f6509001202b4 Page 254 of binaries2.zip
#Z+CD& +/ck:Jn8*\49bd8Ml@eGF%&5>N84b=X+I=%cpWq!$\?$qb5\I&iHcViWHlRVM>V^JeuI4*Y*D69Tb?\l
wh4c*+ H&6e+^t6$X8h+QpHty&^ZNE:bj\M#&piYq>#5ImPd:=J*dmW@aLLL6JZk4h%yD^^cQSh:puZ+/yWjFt?
JYXy6+ %/c*qPy\R*c\KGq=dPt%H$%MimK>mmIETn^m<*R8qA!d^dW>WB9VTS9$D#lWNB!wK#P\8c4Hh#i+Ph4!
DlC$#& >\Q=Gd%^/>K1py#l>PnGP/I!YZXdPlH4ym@BiTRl>5Q\VCXc646e/ZVyue**V%hEuXAiZ*<!N?BcE=hT
J&bKFE hVj@Xi:FnEAtM6*Tin$uJjlR5?@ua?jpwmPXPRL:pH?*mjni\D:p*?$k+IF>XJ\E>=?AjXR!:Z<E:AP$
/kJ<j> &R?tAl!4BuC5G5C^ckDH1kEen\h\1l4+l5eDPB+Q+Hk<kPQ^AI:HA#kiD?B+QIDn<eA*QB:A<ZkA^?MB
nwF?5\ HI<HeD\im8Q^WB!Ql?J+QQRdHk@F<Zkwn5hDeV\im8Q^WB!Ql?J+QBVH+/Hj<Hkwn5hDeV\im8Q^WB!Q
W/w!Z* l?J+QBVH+/E+Hk@>l5hDeV\im8Q^WB!Ql?J+QBVH+/E+Hk@F<ZnwN#\im8Q^WB!Ql?J+QBT9I+4ZEeZ4
wim=TR mPJ%SL@l<XC<pCmP^$Q^P1J+HXG<nmliS^T9I<4+>tjnXWQ^11F+%XC<cqT<c6S@Xi$dkk<@qj!9==$e
p1YSjb aDT#w\WGJ+N\eCVlEE%kla>\kNF\mCbAH!AenEM+SBPkD^APMBwP$RSPbkkHk\<P$RTPaRkHGA&HcKIZ
%<P+ER JDn+eQ#*cCKeDMIBS5Mlt5CcBPFkq<Elt8kKClPt%/lWw8?G/VWmuA#ClPp%#IGbe#SM4&H9KHCPl8p%
6BNYtW #Cmbe#SM4&H#BihwtF=D/b^:DbBlik$q<KeAbJli\/+Mea/G/VZ5weA=G1dZWA1DIB1t%%A!$ZjD>Bwk
uqRw&K eCAAbJliA\T*+kEby6eADTYIl8p%:FI!=&maZkMEu4?AA6N4SC?mA\yM4^G><R$wML&GEI^RRIHyNaSk
nYlJy5 lAIKVK<lSCPWA6N4CNEIyeD$GpI$Rmp\9aaRnXAKVK>lF:<=S<Q$G9diLMhwBKdZKATi^\CB/VWKkdp\
kcujWJ RGB/nWJkh\8R?ik%kEDyNeJjD1jZmH+=uF+n/BbpQuwNIQQSc\CB$&5E@#tA/VWc\jXCAPD$GpHFAJSi
A$e1LQ I:C%B\BK4^G<HA<AqF+nkMpBAKZZCGB!AEDyNaTwauRw6Wj\LAGMick>AJn#WH5AJe>H:cGW?ck>FJtQ
#?^MZD &pQBjNRiC1ZZmJ+qKBXK:SH$Gk1q%+ltbBSK4^G5wAEKyheIX6AAlhJ4BC6wRIZVc$VSeH1NwGJWPL%G
pIIH^: WDE1uF+nGCXWKL%G5AaGXDm>S6A6XCm>Bwm?G$19Ec!BASXK4^HNmqRtqPIm/FRcqF+ntlXyML%GCNED
mLwa<Z @*:^:j@LQRhAk:aKw<*b?RK:w#ZL$IM%H\W$8C%Bk1FJk:aK\@/y8b4yW&SykD!dFJV^AKBBcXeC+\H\
CCmVhH ##j1=t<Vm:p8aZYiTR4KiADRwER^kjEAkL%SN^?QdM!LF6P&M$tSwWaFHWy6E?pIPn#6eM/X\t:SWiuw
dCC\\5 VFIai\+tKRS1AWI\ihIl#V#?#y+=H!+q=6M=p^TWV!ikR/$QmHdJ@9qG*VjjiVDu&R>#J\GW&cTkLppD
QE>%&G P6VCk?CTNIDHH6DtdL&MPZVQYA1Tae**AJ$B6jNPMKZ@M@bk%qEXWPn#aCtl56n=GyaWhtIGpSRD/lmF
GHb%KV kEeMGLBZd&p$JtQPqjw:KZS&T5hYZVBJRc*BtASVPkNAR+iwe!jbMGj6nLCpWKnbD?1REcWV#H+MiJLT
K+@pl? uP<Va>:+&Ku&VFIAc1KAP4*EDyk=J\Z6?5Pa5@MnNqGkbMb5WkkbKmtw4R<1\eKK<S*+KBn6Du94Ah6j
Wtb:MM ^Xd$EEqBudimSG58JkWi=DZu=^SGltL?c@cDVA1bX%IAtqBBun9D?P@^^JlX/hnQlWpKdliIRKW#+Zt4
K#DLTV #LtDqBBbdQNmJmpcCyWW*QaT\cKhTj?@l#qkHn:a98XMWqRwqR=%yw$>n#ku>S*MQDA/C*bpMbMWkBG$
1iL=ct KNSlPdbA+bRWT1dAk#VuVu&l#b^m#mSFIWMqlWChCCMETaH9M/aR^8#5l&*=\TTFRt%hMktT?l+VBidQ
*^JLZM SJ>X/Xl!MEqBVSREYH1W@J$tC5\dc!ayPkKXFNSERWaJptJCt!PT=\+hRtdwcDNJRcq$FPyNB+SAycQ@
9hbKyt #D*+Z+BN$?k#hLTbyKBWPk4*CkYBTpey<H5WDNy@MHjt+XD8@S?*V1Wl&R=C5yQGLQe5HMq8B5MaT+Ym
TM1mnD DLLL&uI1&bKhwp$hbi!!yiYWlGTZNYtVdGW9CRh%HwQj<@9>48ib1?@l8X#QH@/<4<6u:96?*?@9=@9?
BDV<ku jq=4MLVwFbiPBuLyEFk&k+qLl%BaeJ8EY:XNkydwcE6FAdq$CC#$\eTqR!n\yei1S^M#iDtwFWPLBnK$
jluE%T EFmclItllXC1/@D+ajGTDC+lb1p+EP<HAeXWtG*aRGnW?6kpBkF*1TkCC1kwIKFkp1YE$PBLn%XQMYhM
MdECXb pYN5\m\XlRWTC1BkDdMNK8nu#IQ@\PP*iJhR/GYlaPAMRa4CAiYetAkFGy\M9*w<%NK?%QIMe$bRHKRw
@6DT/e EKHAI=t+hDR+:Bqc>YB5k1wpD4$<ek<Hh1jAMpdM:lRG%FHk5c5j8dj+=YjA<Sk>InA+HkRWZtIG^+M\
#9&\>j \EKBY@Y+bWbj+8<S@!CkXBV#w4DAe>qZdYkbl$paedTqwqBA*!tk8BYPTjRH\8CB*!u<1wYCAXAmLP?9
H/YkDP k?$pRpA=Lta:mhDQaRh4Z!R!>kWb+d$q+lABTQ&AAtI+JpEyCEK6R%GLnkK:k8dBA1F=IKDpGa+JtkiC
t>M@=M MP9AP&XMWF$l<&CB!D\RBLa>!5SSRFn\:>T1$XAw^9dwCuINCM\DAYZq5E!TX>DQYRj@<@myIqeQeeW9
qPWXLd @p@aFa+epKRDljCaHa1CIHBH5Rcd^FC?bWuHAtF=IKB$H=aJqkjCkpJSFyi91!awLd+l$A1XB\6E=aGA
SwDb4a awNaJqRiCI6bl<h9<hGDX1A<EBCWB\LKI&KbRHpkLLlR+LF4IiQlMT5MPcBtJld5\B&VbmaY*FG5iwI?
@EFIj1 ^NlB^CFZEHJA#W!kBCYYYVMV8\:NVEcAkCG#!/\%wGatWDTVYiRA\1HA%R>ck@w^jDin!\MYPaB\/DXE
JRmi/u DmAeB9!hYn%DGLXW%NKhAm\KYqNS/>CnaMS1GG&4bTkipE*C4TXHAiGAi^T+XY?/Mb=^^n:GMlMQ!Cdl
j8?1JA %yKnkHC1/:BISC>DpSt4JLDIAaSjT++C\wMLBdS1TX?$\p6FaXHAScHZXBTkWC\1GAc*lyZ9E4+clRE8
Lq9Bu& CqyVWiCBK^^lDdSu^4h1tX$IbGmBpypR5%+/Hl!#6tyJb$T1q@:\1p6KCFIWpFA\//Z@QJu=H&mSEVBL
=5KG=d ST*hKdCmkJKbVI5mwNdlP:Z+e&BY&5+a5La#YDKVYh8b5B=LD\kymXulZGGA#uyARMqMDJP#HlAB8\=6
m/$A<a =<ZH+i>BJmEC&Q\FJm/hkF<H$NCm+9$>!CSEAD5w!MTqE<AGP#D=TaACqM!9S1*yc9Tc4kbqJ1QRtFX#
+9e*%1 WBpK!RmPLPMNkSRTKPmIaVKiBFL>G$euXNekJu?QL\eBBS&b<iWkXZAuD&HYe1hR!:LQIKiDFAWWT<A^
DiC\^h pZ%X\KMVKAIik%uL!WMCaRZFB4I<\RIFHSt+<u>ZFQduRWj<Ck6LFWhaC+y6yVtDAt4PaIGCntkt#Su5
KNCHP/ #+PP@!\Kn%=LWT9NGSSRe\aLFHSEMYuPaQ>@$JH!9>i85LBR@+/FlX+bc4jE\5KnCQ@K\5L?*/VmQ%qa
C4<Ba\ /CZj@N@Q\81ZnKy&qI+Kc9GB:t%#EelNX$8XDNHtLEpIKuh#S%X8Ql^MipDhJSLNChNSwL541HMbyY6d
cdV<GV TEa=eY46Plb9PimyT1?q?XmZB?@BF:Lh:4SSFZb&8%iJiKuYE*L8&DZ>G5#+RXkCPdy>nl%%?j%Y/4Pw
Ae8#Hb eHdl4ibTZHZS?u<ibRC9Yq%WF\:RLn5**DZuCnW=e^KGHBLp?ZPHqtb5R:l!T!w9y*I6BaMiQpdBl!F/
GLBL=A KKwedP/mwtH5eL+t8QhqC8?t#?!R+8NhCkIq1QHl6>H!!p1j+=G<ZIuC?aeKZcNlhd^bFc#GD1ju%diM
4wcS1Q @Bl?eyNIE?Xph^j>m4q=wdEBy9YAwqcqwLpE#8IR!yqR<B\9T&kwEVd\uC?89t*cQw9Y@1Cnql4GY*6$
b$yiH* R#tj>!RBQVw:BA9Z$t#uCD?p?SaV!16y\<W6Vi65n9YJ#Ln?nDlQE!:++HhaFFb99u%dYj=<@@i#qK+q
bHWd+a eNb?Rd&6S*\N$/FdJu?$d/*@qFZ&JWR!qJP%$MP$A?9dNa4k&>chc1Rw1+Iwm9b*qwk6MT=5+5b<F#TR
w9%k>5 MhtXi4cknw$\#FtS4mKtajJ>N<ZC#CmKt8wc*H9^Di96@b/Y++<h4G^cp:!@=eja&!mGj\n!jN@A/ueZ
p&aFRc wjEl6AGFPl8nawIPMB:b#au&XY/P@p4WqPcleMTnR>p8>!Cj:wk?H/&Fq5\ZPEikySA\6<Z$ZF=d&NM!
!y+C=b *!n$$QId:>PPp#9nbe5:P\LFDT:qd?L%8FIj<e//6=QFwtc@\Xt>tiM9>?aYCTN&qPdcG!cE:V@<K/uM
FT^l1y T?ZFbh$RbYLe4KNGJK<dyMd>tTcA$/uR+?jpaC<N@YwcaQ5h%u^H=^uu?C8L>F9%p\*Qkw\cQXTC*jLH
JH=?tH u+X=YZqKu/\>!@/h^SRyweM?@nY$mE94YphMlbqH5w%B^*mEqpn>$R9Z>#1NPKy/9eVLuSJw&#lLT@BQ
JPTy+1 54PnH*l4e5YLiCIpM8Nkddq94uVkJ%iS#kcuB>ZheM8wdi+&=Aq<DC@HFI/D4aNX!6T>I$cb>F:nL&^h
64b=9J X$E:wjJS%C=q4%N!?^=cH+4\#k$j8i#K*SDTHDkmu1La/Vi&j<nQN8:VlY*!Q&^F$cPKMdLyn!%PpG^j
H!GDG& >juFmjeE6&qamJ#eF<465i@B@d!ASQQmQihdtl>*FQ=8+/Q4ESRpR@itdBYktl9tC==Sq1e@/qT>AFi<
beuFJR 1T#l6QC:?Y6YL@ipmCiP\pN%@DA1jiH&%4C:LP<muaKc6N=wy86ZSQ\bGJq6=q?ku%llZ/l\aw8IwI1>
#Be4hR /\94S<@hKN?4M9luBhm56aq^=?NEhEPh*^md?DX@$JjitDheeWZ6#JhDZy4?qjdmD*iy*^dT=W>%6^hX
<DQL?% G<Mt*HRIDqiH>^%?lNK>RlRPVJpT^dVdt*EIdID%#G&QNPVe>A+He>b&:5w:hW4jSjel$T@yc8Xj5iFp
TDMyRB S=Gy%B5/Rh:JR=WcDVwcI8c/\hdw4Rdy^XQDFeFJKt&wqGi%jPcT%9N&#ZQ8hTRMS#e<^TXdmZJZY5DP
DcS#bJ e5EuXL+yKM&lnDdk\$L?$IEJ:yl&dm\Y8JTb^Yp$i^!btZb?Z?&Z>Ah>5@%T=wt?u99?Tn?HQm8Y18Db
kE1+we wejYkP8heW1Mme@SE$%E1/hu>BWG?KniRCmWnp95j!%@<j1Qe6YY^=uW:8Nj:@cLl%K?Qm@JQAHJHm+p
KA5X!& YD$:4PRK4$m&Lb1Y8Gb#@91q?IFK+%?&IN9N9%IF6VW/YmkT=pS9p+tlC=L*lB!#+SSJ*\mST>kTK5*&
&B$CLD mp6JMiL=^4IZ!ZZ15HR=w*aHK+95?lKE^TSQ>VTH/e8^nTj5/>PpY=+:Y:YhJ5t=SNbi/u*@J5#qcwLi
X!6my? Z@p??9/Gb8?e&uBi%PHSeham$ktl$^8qn<nc>dKVN$lYX/weJ9MMF>9El1P4qj&1+X&1C>\BYq\d+nY4
-Aln55 000ff337675001202b4 Page 255 of binaries2.zip
hKt@qP 1KK8SH$ZPiQ==BRSJTG9wdemGXQVF>!kW:eF65=j4Jq$F^TGmH/*@qDM5lS/>e=j#/@<kk#c+NlR*5h:
>JM&^: *E4q&Y>k#*6/y/pbqVQ:Ly<!&/EZe*?GW?I6$y#tmV+jh+>M&G<@Ywe\^=kI8W+RLTh6*a/?6huyaj!:
\HN*KS >X+ZYymK*6$:<CV@F*by9^/IWWG<9l:5b:hJ<H#PLM6aJi&EYPN\kMtMuE^t8*I$1!:=WaJGW:+NuBl*
enGi9w jQ8%\GVQ:m6QV4S/ZH@<T5:ZiwEc$Gip+91L*^5m>XhCBe!mL1D5S1Y91Q@XI<4=X#T<p*\hp$RjV>bQ
u/Kiie <FVaGH*bb6tdmLDe\G?kj8T!yQTB<uD!&IH\uj/F9^W?JJ4B$$Q&HE%4WhmaVejDRyW*:%j\dKY:D5lX
+Y@V#P 6R^wi%/m=Rk/>^548X?=h46S58iCMj!KadH:^yJZt4\a#Hb@j+@</JcA8S9<4jyc>bFQhytW5XP<HaaF
Rm*F1D 58$Jt+I@1hyRiZ%Pp44WE&@8V:q/q8XR>le?nYCYHuEhjt>T$<CVwyhKw8%pc8:<MiTa9HyIq1lWc8hA
j*\TcG FhK&hZi:t/DnnCL?Jp%BZMyRwGcIj\j/MjtT^cq5m$A&jQp8P>aD>DmLlN?&HY^ujR1Z<*q=PejpTb/N
Z\IE41 Rl&ubuj!tE1JI:bG19XC8<8$LV$GeV&/LK%</E>N5*6jGkjTbE>tV$imHPdPIwlG<Q5mCiqS6^8j6uG@
cjXX:u #%M=IpNKm??Z!JVS4N8JEiHu8cPZ>9S%#ZtT8N5#1@6:FcpPP+?YF5u:hAbiJC9GmchQ&*=Ji6m<eLZ4
LqG=LN *m:?:ib96u5&Ji!Y@/\yeYC#LE@iZm:9mF5t^4Ii?5qSQCPdY@PK8DQ%$4<m8!1V<1@G?nbIN5TXyI5:
LWRVNW @DIwq!TYkLab8*d<a*ZL+D!=#MNJ1Bwldu@\t+th=eHiZu:^#i>Fej$Q^YT&tYj?q4%^=*5Ny<pL!Xb<
HCjw&! =KM#tb<>$#=ECBPw?SQI/!Xb5ZM9a*8l?:WnB6<TH##yDFadJ$?GQSawHhK!WV+??MC#j/ybIA>?epn>
uhql>c T9iqJ:PdV<cXCwR/%p^?$KWGH6EaWSGhh?5+/%u?8IXn%J$!&9nJQF>>nQVYlWRMqb$ncj45e^m@u!N5
==dJ&N RE+yd?S>$*DnIdtccQBcp^:S4VLZ<*H!VMbyYa=5quQ&ydX*YS1:<n?>b/ZaF?SDC@uQZR1q>8+KS^uB
wDE=Zn ^<d%^#*aN\^YDdleH1kY?mkuVI^hGG!=qhcE=PRJ$HFGbM6Du^DlHD!SidGVuD!JidEH*+&uhBVe5QdM
<T&RdM W8ynGa/^@lL9NPIqMbKuP@Jy&=a6K1\=*k9Qnw\lR=9bBedTy&+Z^lwX?BVqHt8CXTZ%m<%WSe#EJl@5
@FpD=w c?#lPeWHt:=XliQ8=@%ecK$$QKe+FytPpG#!eE1S<wQ^hle+u>1RXqmYpRI4cJPuwK&MF8!dmWt$a&mZ
ZCCkak =QH??N#Y*@JT/:$S1Xe>/bKP:5+ntyFnh4BYp>:kD9hQdNEF/P9I:&\5S+Wem&?w9P&tq^WXtQN>9nGp
\Zc#tn &>H8>FI5=t$8<R1*YjRei%XBdEcyi\%LpjF<h1YlN%8yi?>w+TuY98hj+&WcM!+?t>DmHVk<Xj*\THWX
N1pQ^K D*e1^pD:jd<wLdY?NeM\#=NGHm+lD$yy^^VD^%=#wyGHM94Sp#9+1&**XX&eMmPYj4p8WZ*cnqRkm<B5
w<\RZ+ n&IX:Z51bJRI+\:nNXY*1<?jumD>\15Y^mXYQi1V:B:\Y=^%Vj?pn<hDV?+e4XAWl?89jG%ymkq+@1JI
Iuq<qS P6qMWKjEwtYD4LidSL+<m&I>\6tZNeH&ut!y!pSdIMqI5mc$8&?Y^/p44q@mL\T5F9X1b^TBtth!l6n>
:*CPQy w9tPdHF>9bRG@R:uFy@P5wTC:SN68^9?SPlFny<LhbiiHb?<PGFRQbHP<yuuMGqm$$:ZnnMp=h9P%p@n
5pT<Gm B?iy6TM%W&yQ1?!&bl*dP9jXy%8Gn?5X!qiM?*e^*c+<&u5yy#+CX+M+hZa/>/kC*EZBRHkQZ&TE96S=
lkGP\D 15d4uBLVnMF\VW$+XW?JPu6iN=ZeK/6WNehhHKe&4I:S4J^q*!*na@!C:j:Pkc\EC5&teAn=9JSI!+CF
Rk<YYL &8!l9yCLdtL61:Rc^5kV<jISpRny#$n?m$ut!5EFqN#?&We!Cy>>%Vm&PHAcGIpZ@JD8QT%VyMXnQwTN
Zp6=^5 %pIPh!4%i8t$m?^yF><\WFy11ncYNZl<RLu4m<?NNy+BSi8*5B:M$I@e&GQVmKB\HRTyCWE<%/FiVdtp
:t9Mjw pLDdqb*\qXl:/:=R/GF>N^%qa+&/%l6/W9eRLQbHLLLwh:aJdYtXXFDL:M5JNhX9HuY*y\j8<QQnqqQD
*LFnLR YCl@<pN&?\qbRcL*L!AN/M1BDummQcXmXEc:lj+6y%4:#m$Tu&+F>a+MB//GV:hteE/4$QCSAi4Z6EaP
+HtqP1 9uHQe:l*HGIaiu>+QjIQ8WH6JE&6d^\aT%QI/:1Pu4BKyb??w6!H=n5CJjwnqR9WZK9iI1$6mY=/aWhk
P^6q1p =:YM\$cq>Sd$6X?aVFuN/M#C9bKJRj*J$VK#H\qlW=I?YJdVQqmXuA/%nGDye>>kT8acLiN1tShq5W<*
!HN6kX ZLR$Jke:i!&alZTnRqkM&!4L1B\#/E@tiT?596ZVp!yRmN1FyDQdt:8?!?:WkkT*FaiaI6/yD1et/\1V
Y6a$4/ 9G#Mpp^+bCBDQqt1muW4jh:mt=Eb9b6DcI@FeIty*Hj1Zc:Z^Tpja/VC@ZidYYy4hiyme6=ad9:h$9>B
IW*QWZ de/MdmWX%bH#aZI@6uC<+PmZk\GunAXjwwd+9p6ZljF@R+e?$i?\e8mReMk/SGHy&RKhJKY#?Nw*pR\d
wLtAAN PVP:5!W%+TY^&mWuDYl+>+qLMkHQbJ^?\Hh8%^H5^8pyWNNykbpHn9DX&MZJ!NBe1RdHEGa&L6kk<%9j
A^P&jq ZcI<a+>/@aP=<+/L/8n/8IaTXCCwwCAcRSeLCN+&e??mpTcCwLJSWFSEapFE4IA%J1BIEIEwA1JkR4Gk
u8!h@y kEm%^I+KmqkSa+$>Kn+BT/^=ptj9\5*:?5qPeqk?D?@:*@*\thuq6*Q8#Jp=b<=Z!!jq=Fq91%D:m*Zd
\mLa1! S1IhE:$*?^V>h1b@98j&5d1Q<yG*m%@K:@c:dEQ9W5hjq6MNK@!V/#@chh8/kb=@!edTKGt9+6DW\C+G
mj#<#< httjJZ%9Yyed6H%5%dPNa<6Y#1$P&4>:AcYh&!%<8ePnT?Hd59$d%llhVu4ND6m#tt/*TBd/<>%H=@NT
9G1Ey% l4&RWRZ>L#PGD%<Ebn^chhJn\YY:4G%uR$Im*T$W*@ct>qWt9jKMGFPX?GmL\bj#K4>*8:6B8^Ndu/a#
E:F^AT :+4Q+:!CnGAd%/LAA9P^NaXYNTZydp5mL:\PGH*%p?h6ni^1R^J8L1$%pae@>!*4Q9h5R5DJ?^W#=@*B
GqFptl qnRM1$qb<NJyq=/ZN5:Vn=l>Ky+6HS>yMtuPGc:Q*XK45Y<>/m&H4qmctQyNu<YIiV#I%?8mZcXV5Fc*
\VbJ<C >acnBm$1e+k#=jwH8NmFle+iKP6>S9>u&b\6dh&mw4K4h!+4beJp*jPt9VQR4uYP#&BjQ<w!MXdM!q^$
D6D?^I le6*:Xj1ZLRw@EVM44*9W>eGVR&iNLd6pnid>W!84##jJ?9a9hlF8\L&FM$1?XS@:%:*V%c<YXp=?J^Q
tQjA49 ?@LVZ&\+KqV$TjF^e^>:K$\?VNEZ*+m/qX^*jJ@Z#EZ%GVdlb<MDDYc<ny?:6?>1*b#TKbuWZB1u/Mbd
jl$a>u BA$Pn#quMb<Z*J\&lM!MQq:+yKKZWWFe&aEHbeitdc@=ii&=WdM651&Ty>1?ZyT@\<h*tR9QP*l6T?5<
d=ENBp ^8N1l#b%^&\8j:9=TwjXlRE&6S5N#kTp&9#?i^hVB?NZVHmuL&Li?>kdKAySSmqueN9S+PqC=^m@!m=B
DmA&KD ZnLL1X%8:%PM$6p>bkcheMB4Y>?I?YH!P+d:DMcbcY@JPlnPB1:@jHL+^y:lNceLiu$YG>?&*%^Q6#aZ
LbE*<F *a@ji6QdIj:ckK@cu@T!&8Rp//jR$WqI:yGn9Td8Q4?n:!HFt:jjZK$>MIZj&L>$Sih^K*!@*c1Xu/8j
1IBH9> ?**uu9QqKdR#qi1V=J5#+HZj*R/4N4uI$8hweS+/9$#deu/%V44@@ZS6udSp@6B1n^KZGXh*=B9Q5Y19
NWlVe= @ZHN<P8/+$j8QPyT9YAq6&DlwP!4e*TQWRhQ>C84L%#Bj:9l%*td!65YC^8:Fe>c@YB8*1+jI@h6:u98
@9+nV* J!?nSAjnu6dcMdP4VjZ6i&jK8w:&Mj<5d?*Z+bNNa8>6&B69iMZnYWh9&j#^p!cetQh519uu5^aPGt>i
W&jq:i *m*le51IdTit!F+M<u&bElhSM?yhqt6>\4YNPjMKe/1Tethu9DY^/^D6@!J6Mb/T/?68PXT9ZjH?H\#9
j+JEHk 8q?i?MBXTHM/tdb^\B/hbQ@yD+yLdJ!wVhM@&b9d#8ctY:h8n6<M@</:bN$A1nV6dett!j6mZ<?Mt9#S
6j<&eM %i?8#l^9tVw#^C+kd**W*DG4i<nc>ql&c*@l:aPQdeMt%t&+Z4>*V>RB=:BD9EHQtptq*iT<X64<wyY^
qIQq/: b/w#bp:R5W@KZY4lQ4HQlWV*:C6*X<8i=@4PYq=&@%nu:ciDb66hSq:bDy@=nD#%<Yj^?lEXd!1KXt$9
mwye8< eV/A=>$</X/<h/uZai*yQp>S8LjQ+i1G1SX<F?<PK?<FQapjd?j#4QSXn>EGQV4*T+4b<AhuZX1EBlbe
$HnmM8 @MZ@@k9u<5y>N\%jnZ9+htDhnmQ*L>n5j48+*eG/+/:/c#<ipJ#4:bKdFqPdHPW^N?j5J^ZqyulM&abJ
/QIK:V N*VtXB$QH*Hm54G?d?q#HbQZ^hedjD\<c<*M9pjS+@CVA9h69be9LLleu?>uXut6Y>b$p&MVZa4PqNhe
ZLE@e/ K/<hd?/cjcGmQPnHa/Y^$RjqP^/GnHYVPV+8i:R?e$Spb61$H&VZ9dd<bH%>^y+JQY%<**6$%L9:4+S*
iLBl&$ :##DNw@*4j%?!WT*%J8BPy%8XqTE?@15L*?@M#um+a*$5@ZjQHV@%QbCy:S1p>6XD:^CE\4>F1+K!:M4
lZJPBG udw#9E#4?w&G5T6Cn\mh18@tnQb*ZS6!169%kPwlup5GG9Z>ja#DD^5CX9Z:6+&??<LP?@5>:nmp@+TJ
b4Y?c@ kY@tVN8BQWQ6h$\5VD^iF@H51?FLhC1Zh8=$!9l\/9=Jh:=eq6nXj@Kq9wtFl+?8M*YIiQ#+8M&FCVE@
Sn+8#n *<48Z&G#ZK9!y*h>L</uS6%D>dd&ih@hVHmZ@4cQR+VH88!D4qi5y1&#?4#/@M!#QZdLR6<?PiFV+d>!
SMWYWb 1j*WyWH&=b/G@<=b%t?+>+4!Qpj9PST%WSlEZI^bQY*@iP>4P/%PHJy^?$Hl+5LHhcP/dm#wNMq?\4c*
^TT<RS CjeP5*wLhGWhji+PYhhP>@DC?<9TG*JNR\jFFV8%j>u@SPq9?h6t*9=1Wh&MqPe::>RPMRpPDbp^=d#6
YA?hR: $BF>iw&\i:n86/!Hk\@a%?aipZ?>q%1^h:TL+j1b>8&HbR^hGVG$aa/4R$*+$E&/YY*5#A&%hX!CPGQK
Iw#KX6 !DuV4jhkm\qWX*%h4eZ>E#y&m6WQ&L:aKWT^kIy%#i=atZFVbl1uw#9e+pjF*EV>cPiXIYeDLDb$GLdk
aWh4pp XQiWWYH4NulE=VlY?mF#N%uYuhVne:6dh?^N$^EZB@a$Nn6V=JTZ6h?&IH$X5?VNdWXa54/4:4wSNVht
>6!#/* GF@wh!V#!N:=&6F/h1@Z6Vp#*>%eV>eq^Km&\<hS6jPu8#j$W%kaJ^5wI199Fm/4T4A^%S@YbT%9NtW1
@#a=/5 Xcm>wIhS9H:ahQen%w/$/btVK!JZuX&#>iAVJ?eLB@RC=C9GDM8t!\!*:<!hkt:p*Fla&m9b+EEu#/H%
-AJA@? 0005b5e8c4d001202b4 Page 256 of binaries2.zip
<qHQXi 5=k8eX9Zj*Y4^1u@h@wuQl:9jiWAe!%%1:@HL/hh&IL$%%$u8F1u$68>4Z*eQjJY!QQ4^8dSy!@Y=Plw
eXXDS6 Pa+8mM6hEFAp&=HncH<w9pHBSGuyD*mmdZTjT6a^i9>a??nnYQeuX6d9bjY46H^QD#/$J59wWMFIL6lI
tcJQSZ N#J4dT$XtS1$Jc8T>Y^41YA6VnF^^hRq!^HZCu8+6$*WM*N:bN#?^MDb#y@?Eh*^1dc^4tXG+Ktm9ItL
hYAjGw :GTbt*S/H4d&nL99WP$ZhTY4Z@4PS@mV&CBnYjC:MdSXy98WEwN:IaN*=S8Q%HFtdDMW:IDe&dwF<Wqd
XZWn9T uM^&XS$QYiYt4^&S8*5%=hhNuqlq%y6?GbcpM@^=pNM+18%89\9SQ1dB6VYQ9M6&XqZQtp^XnLEJ8<VH
dGXbXh N@mb:*lWHFPLCq+?nbZHL*YWD?D$Ktdl*DC:RWP<$?&i&ZbIb6:9?PKn6PpPyW?&&yjPejq$4YEHm!pF
JGGKGK ?XY8?^P*X!$NLl&kPPLI@FCFul1Q4np#:?Cqw&h1#Y*c5d?G8wjMt8!hciJZQa+hHSDa9Vde<NNIS*Sy
IIA&Rc qJF9>cT9%\lq*e>N1da=tJnnX*<y>q=GeXJd:%:B!djjSA<Me/dQ#:ZcM!!lI%Xqa56%6&h9#i%h<tS\
5C*YQn XeAhM>:Cy+1jJC>PN=*ked+miP9IuX>4@:V4\YHn@ci9%*WdE:=<eE=YpMWW<=F#dIc94p#&Zl<*QQYT
4l\b&# eQk1&6bnj<dE+/YJXS5HtS44by+hi#C#iES6h/F5+1@=e8dykbM!4X:HTk\&/!aqZ9?<@d&!Mb/9P8@S
A:bQ<D ZSaViPFY#Nybq6+9hN>cNbm@H*TWG!pE4@:m\KCS@y=F@++\^:<G^Fyd/8tyw%8lD+5u6DdhCu%aJAFP
8&we8! 6?Ib/m>$K=/YN+68lTVPFBKEyke=JV$\$kMuQYDywcp^yy4?BaRyS9wVql/pSnRqQWl6cE=/pByLpTcE
\PtWt? Gcp%I:XtyNcM%J1SQy1XG4NTa=cVQwmXY4NTc$=1#Wt6PitnPcp^J#XGj$yDWt5p6WbTc!T%^6JHT:k\
Xt9Bdw nKZGGE5jlKZY9NTcq%4#Wt6i?tlicm^IncZ\ujJJcm%I4cZl\>L\aYuW5DS1YBw%@5>S+/XS+!qPi5DT
%q5F5Y k>ScGn=iGn=iGn/?cjkM@8SWTSHD9<Rm@=1Cky1?+J?=B$lN^R$%9RqX6yEc6wmc*wR1&$lNaR\%9Rue
j5kS6H A/TGLcKtN+F:kNVW4%DVt%CnG/qlm/nyViBWIVXqJ9:ct<TyRt4aIty/C/V9FmC>CXi!EA&^NSKuCnER
R1I/NN Y!N^1lAD5VXEKE&EGIm6Ib4$u$N5Ve#jWN<dat6mH4j/*lBd+\n*#SAD5VYPeLELMSBdE#Qi%jiG&Jya
C$P9%* C$b>d+m6pjJCER8^NXICJtIl6pdKhER5^NbIKaYIlhmc!DhR*^6mc!JDSH%9mK&JuB:%9TG&^qKp*^^m
/\CY6$ c\^yHYMl65aR?D&IlhkcR?D*IA=mc\\mnDeH5VY^<I4/*lBda\l5MMSBdI$l5CaRB:E%tuASG*ERY/NJ
&:$lb8 /^kH5VYc6I=^jE6<Jk=mc!SYFPJA@l4J%lDXEy<J$T*^tSDIZ!P\wlAC?Y8pFSmB@DZTCw\R!Gem@iak
$+^H=h j+&$jmPR9+aI:#eC?Y5e+S%DIH?NeAMcabC@Sq1@MeljI/*jGGJ4HGu>^m#I+!LMLSnp4^E1$TAM<6eI
SC#WXt JX<RB9q4lNw1CMQ<NhJ9D9LZTP5*l6kcmjcEiJm@SunHiJC@SyyVibC@^yJ/k@\%l9Tjk@\%RwWY^CPR
h8c$K1 #$T\Fl=mc+^A5Bai=K>lk4Z\IH?N6JQpRj+c+S+tEpD?G1EcNlJA@l1B>wREB8R#EY^NaEE?E&G<BbC@
*nRPeu Sn16EWD?GwGJlkTI4SFJW?mjL+@>u>\m?QD!&N<RQClG+/J*a5ZbS6IWA!SNIRHpayIY#\>9yj*hSV*M
$T#Q\I c%\dYLuGNyKtGCByC5qB9m6yV!=u+BjKNahh5K4/eCySwQy\TA+:^CSMB^@ih95:jJdth/<bCnhBtSkk
u%LKCp qAuJacinlHut\>68j%<hp&5JqAuJG$YBdlamPYnLTLlbmPRCHHclMYqKcTcNWCaGCGXCe6D?kHC#EFMW
AeiyE< 5J\GJ?KXNb$wBFYNHJWwCmIKW/CNB$5T^WBJW!I6W>PSRw*XJ=Sj^9EIJAy&A5$VSIF&NASQD%PwSd%^
&?8k\n K=V\=WSwDY4<RYpi>IPC6p1euCAK?D+#HM%1@D/LRACiX+pTEWARWcA#e<JiBNMW$J6S*dQYhI%W#4ye
dTPh/Q +<\4HwEDSIGCnC^lp+NyBm1K%b#^J+yT:k>X=ia=ATRK6G5p9XM$B^+yYtN8y4KuTlVDkEYlFwuCRG<G
ta&w!5 m%E6VYGkYCXKbZ=AWZ!LSAqkWdVt*E!q?VG5ClI5luakwpCHNaVNP&aw8CmNKXjK&WkWySwytCmGdyEw
u<%MZ^ Bqb$lYH=FyDniBXiTCYKaWCmRBMF+cAEM^^+yPTcquFVVu+mZWmqmRI6W/CRNp6IBMAMlp=?Iu%RR?6V
n!W<9? itmM\KqPwBk=BwpC#SPEYDqtBQA!JYkMD%H8iFTmqD+%XJT<JcJa?D!lMbBHbEGJwpV#A+1CSjiJwyn@
iakiLV @1cdSyS!6B1ZKRbWSk9D$kaI+SdMe8BN6/A^a$&=$&FWuA&SC$YBSIHP6\q^HM#mXnnIpuP1+nA1WVSw
aA5h\u SweqPuCEGb$X@98Xd<RVbLE+nClK=NlASIFP=Gu%B%taw<A%LCtNy*V^YJh4uClE&CqAFCk%R!\SyF+W
k!QjX? $^1AW&SBN=*=$KA#H\#K?cBJb#+eB*&uiI%HTpSqNw>hk$HJJCS&Dia\8IcqwHqlV1Gb:BwM!%Il#Z/e
w6YA$a AK/MTCPN!#*Tni\cukJmZnA5@aWRZMiIk5>?GljtXQwmnWAiDmwKqqhDFMYA*TTND=NEDt:#kD\aq4BD
q%y<E5 FMY%Rq%a=TVSQCAQBtWCpRI8GPFYEKX$5MRIuqmcGAdp\cAWI^KRB!PlNZlR<tbTlnAwh+pwCkMuCkc#
du>eVd G5j:^GTY=qGGMCkympRb\lk+WXCM\PCYnBStt!lDwHMZWLaXJ5WtMHn4wdtdJJ++m&tdnbRl$PILT8MT
>Lb@S% \<41SYFkjXTqX/1^@aqka@FTSTPSB:V*ACYImRq\/qWJ#XCq?XTBXIG5SuwN/D\J\//qEM/ViGkap^iL
QZ\:Fm =t41W>AYat?XKA1$W9G\MCblyiJdIa\yJ6TJ>h<d/VYkpRIq!!FTkI4uY1GC8ZKNF<N?KqG\ABWwC+<n
PMhI^N Bcl+iH^W+^\mEejaQH\IB1Z*pjAltAjGS=Y4nX##<6BWM@ElGJR*TMKHaIGCm&ySYjbtRTp\KCGSBKZA
8A&1W! A6MKI!Y!G=wFyeCkVEeTqAILZG8I\5*pN&BRCmYJ*+AF*A1mEN6MjkMY?Bde$<NCc$\WjHQ=DSmWRWt/
C!Fc55 QwmlGbRMl#WHb+1H#p*uTT#5QEpP8>XItQ*pwC^=\p$WLGhd%L5XFu+SR5ewLWXEZ+uq9CE@KCmPTdnT
XbbEkA lPGJnm%AdCqHW^Tq1tEQFMY*TNR@95>5+^cXFm@9cH/Y^ZCN!+pawIYIAwWuCBjA?H>PhQ^VqMa=SCKE
kG#QEE ntGcaBeebDulRatPau^W9TkGKwwXND<j=y4JliBBma+pLkSQRR<VcKaF=B#qBEE%EV^wFmRKFMep#H+<
=&KLpK Bb+wBM*JPW4dy=6IyDTISM1DMmkbAwtWy<AVlcD^wdeI>/GS$AT:wECmRBMFyZ/N=Gu\SCE\<lbk\MWE
QlCJEY +5b4KyAhAp@D+yl!kmkG9E=yuMLGI4pFLh+H+eWkLRMTBa6nekSS+FNH4QqS1wBWwqRnBSTFYmRK:qHR
Jj\%DV jA6P58kt^BaNRt#^wA^KtqAQk@<\k%L^Q*&dYC8WP6bKI/GqmdWmeGyaK@#@VwGWYC8w<cLC@*@Y!wQi
hVE^Qe ?#yEc\$@eTSIj5nEwCVY=?JtlbFV=pjZ*I<EwDLVP#1FV4Id$+#ZDJ9c%mqyNDd?XMj1a1c%pY9^S^py
K?Vy<M B^VYA<*mE&c!T@+X+NS#:h&klZY&/ZF5/jW985:cQM@y?L1+i%4LWl<8Q%5YeNR9PHCQicn%6Enj156D
MYHqF% jq^$K4b>%41aGpYw<h8+:bd8XaKj&bi8<5MPY^RY9h?!*$\YMT#FdhN?P/iVe#:\9P:AS\4#/H^#n=<a
qa>#E< 9e=SX&Rh:5ZF>dZW<p?LQ41VMyiN/K^ZaV81/6k4Ze65i?QmqicMcjFK>>Ht1:TmyujV#\+hat\aX?Z+
X1jaKT pw8unM%$n8cESDytlttdH*Q8*iXphEidp44wZ>+ja$<<G@Nnq&muTkX@iK&Nw?B/y:#P#6Yy#c*@WHii
Z\KF:S WXF6!:+uN4tJTnAlNKqJuZ5%IEGk!VpuScDJGWSFebMq6pSFSCW1GTRn/JawPaPw1CmkSAXBXEV*E>*e
eVc?Ih ?<+>>4n4/Dlu9QiJ@pCN:q14=yw%c%Z>@tmXEY:jbGA$GLIQMqRMCPlZL8Ztw>DVlc9WBk*jlXSYYAc/
<tuPF1 SlD<5tE%1/qN$NTE\9aV<bW4>B#9Ga:i<WS#FhEZnTZC+C<!Nd8aW\J8*wZ\NLX8KPhpti@6nHBmEqAj
Rjt\BA #n>4?ihM+G*BHP/$q>eG9Kp<?jNdCw!$DGwaXjTGl9w=YjNWC8&In:mplSWq$9L1PpetZI&I%n^LCSPF
=?6A5H Ek1Z58GLET@4#QSuDynK/?bcTEZSi1CJPl?iAQJE*hE9B?m45Z<\hQqLZR#TWpt+eq46SGRJ6>tJWEet
lY9p&q R>d5ChVF\*TV@PdGn*ZPV>j*h9E49w@5G*TmJ1ydRRhlpE%L=t8^J?wQ^%Q^!y!wQql\%N^b@KdB9D4>
1VV5u1 WY6E%RK4:JY^Jh1<K>51S/d/HRy<#eda$9*9yH*tbSYi6Qik#V8yL#V6eDp6V=Lcw6Ip@eEnVEiKeR9S
1aC$*: WeCi+BX!ET&LGLZ^SpE+lW^QP%$YjRqp*d#4<NqSZG:PdH/Ak@pMmeT4*Kn/eaC$h5!ck*u6@PyuKP8t
pKNi5L ^\tb%NTue8W9C4$dQIN9^p15bB+l*DS=&ncXAGHm6Y*\4CM%XVnWR!Zww/*unkR/#Hj=^H1cX6<&5&Xq
X&ny4Z 1V$n##hk?$/ud:&Q$GqVk6ndP#n4mpm<I9?tV!FH8ZZ#\a$@DK/?^\u*\46GaP<=Vi+ee1>?jJVHYp>c
Yuy5=F LYjGu9FRV%KR?4AQN14>!#Qn%/bM+?KyG!tVw*peNw8*k+WCGiN51n+46N#>k!b$Iu++>kw^kVNChIVn
mj$ibD Bb?%q8?1t#nPDNHb%n$jKyN>W\^tZBl@%hFWX!>HIwb1bW!B#n48TFG:WJ4>MY=#+#Iuuu*mRuc<KuIM
QbSY!i VIHVKpHhdQ5hJ:Siu*^AE=4Q$<1!TEe>@Jat$uakVNu%PPNCjL&!+bbNKW\=P$hKbH1hJWMuKq1Z$I+$
dIFDyG QMGYmRE8cQ9tS=!eTFFJqVNn/SAH<q4=SmbSGw#NR+wd#Jen<1l%?nn+4#6D4>:IQ*K?@cRIL?14j9\&
ymZS=N !^@>i%^pLH^4H49mlPqQN<QF\88FWn9maykq4=py&*J1Q\mY9F86/V^$>>lnb%*BdnSpip4AdCM$tnp=
Z>dtAD 89LVXVb#6#StlntcG>M=kwhj%J?@Q*TN6+y+nht+%&Ba\Ea6JiPN1QbD&hkZeqqhi%eH1lQmW6V>L+YQ
MR=4XW Sed:memI:aX\Pd!J:y4EKM?GCe5LM%9\9+mS/+&SGDJMmNR=+Z%yVj!iEa$GVFh!&/PGQq/IQ*9@<#Md
yPaQTN >k^JR^yci4kM$/uwkBB##Tlcwe6TC^hGd*6^+aPVHYD445MH<y9T8dtb=nTMS4@c**>Nbn8wT%*kHm/6
Y%un8e *6uB8#C#N/K5b9*Kk6^bw%\dlc/GD^w<^$y9MFiSE*JNY4j<Z?VD:JEn%t!*uae&I#DB8q$=cVTM?yj=
-A\dX% 0004c3ada57001202b4 Page 257 of binaries2.zip
dK#cS$ n>KSPF+Fcq<bG:BHNpJISl/=quE*$tn4m1yiEQK%un4%/P$yMET?NHQLVtB*l=?StmnL1L98Gb@FG&!&
Rj#w&Z \HVp=Q%H^$dVE%>ujEZ^GeaN4kw!h*YuZ#l:QumlQh!$>qXq<Znt+&TY^?a4*SeWq<+@d/GhTaH*&\4n
Vt?RS@ /^KF6&!J5euY\y%Pj<!MCt5a>E%Xl/5NpK$C$mwY#!k>hJPYG1N^M*p1j@BqlXNa5h1NCZIwNym8Ic#Y
JQ5@P^ K9tmnGMK#SH>>CQBZq+F99D+@H6JEqt5+5@pu$+4p+&ibBDb9Vpap1dL?!H:L=yPhD=:8DmkF=^A^!Jp
MIZ#ZN >>#C^Sq8?#:$%B44<@pdCRNt/9jVLYmdA^MNQRPK#%T6C$mj<+4k*G>Ku+:/a4weVI\jQ6jhACqYuw1:
k@kAqS TX$IhQQhMh8Z?9KcBXVQ!5#apTm*&XB%Zi=QX@i9X^4jJ#F&&uchPSP94mcQQCdKD=5#:NIpNL@j+#Va
w4mI@p Q/q@H#@/hb1bbTt!pGNIcAp!H$aW>ac9*Lt*b?8yn\%nweHpjt+HHG6L!5qLPLLXw/\m#dWbQRd+yW@8
=PJnTw q@be>yI=:6y?CutL>bnt:W*4mejq+1<ij=c99BtdeL9<mH5/Zj@J/MCi&e!m^ekq%%#!8hM>J#le/aji
:BbE:K \p:idk\?EDM/N:6&jeldPc=uS6B$lL@idtIE99I8N=Il@8Rt/i=5d6TMHM@!ThKH<Wi>pykld!KY?QX^
\NQ9hb =56LZuWJb+LibX5@mm!#TP\?uJLK1XdlbmqA%eN9H4\h\u8Y9LDSb*QIWQ$+NWde9&!KYZ\lp=:cYJqi
9^n\8n &dVh+?B4S+aLRjjGuE1Vq\ZJYu=YNFVVZSiNXyV/Ptn1q$dPn$eL$*Eu<qcFbqiQ1l$?i=MpjTl@MKdN
!:AC/! \ICi84FFP/HdebMKI>Q8:c+AmVC?<ba&XF:>Kc&J5?%uN&$%iSjd%?Mh!T?icXqt=lh@8MTd6Iq&4\nN
%IckLZ A#+RXt4mZ^YJ1j*Xh1w^6L=i\dSQ:4&BZLc*jyM>5QKw?6/e>QGby\<bR4>cSN6:d/?6j:H8ajDpT>=w
4=ZGhR Em*i=m@FQeS#u*EqTR@Q%q@wZ*q^NVVpKd65R<#+KCD*Nmejdqn14XTa^%>>Fn@wKpkK@u4jt=4$tW^a
B?SW*@ t*#d^aHKHqSIkF^i5im#hp+IAGLn4b<>lV?S8JI4+jtmNL6A%4#DTTqtEc4Sm1ELV6XDKbDnYQYdn$Sd
lH#%J/ w>8dR%dkbKL:XSjYX5uMD*Fh4JGM8kP=/t1&GImcVmiNWt?Zdn?k46>K>qyh9:Y<@84$JB%hh:jV>a8h
4a+^8H A&/4#&Mu/TDKhkX%Z<ldL#ywlJZ69\4Z!XD=i9w5&yW+N>/5RyF##ZX8n4De5hB?=1?VEm*h8TXmPRQj
HFt*MT Wmn5aT%F6H9mtl/MECP+%Fji1Ph%$:M$E*8d&#pajSHth%5lL4:?S@wLX=cYH#B=RMybwQu4DM4&n!>K
aMa<@E M\\IbN8:MX:wplG^qw%y@tC\^6Iy\hVV6?\!FyJkR5$ybSG*tITw9Fyb+>CS1e&T1!BD@1n/NVZtcCSX
bkEWqw /:#audbqJQZMa^IHEeM\<yuD$pY<:9uN@T?hl:alMY<$p:bn%^ljdn\uqZ+lmVG<^WD<iIRZ>y@w9lSM
<kSFX5 kt@=jICKjNRwNL/4Me=hKS=6KM&FJJwqc=iGV4MKD=Hy:SZ8V=P%S?wZFEmeI$5i+bXmDS@L<&9Fytbl
R:WT#S yyZ#$/RI=a64j6BawZlm=w1l$#Vm+=<!<*@i#qeZP<F\?#LHZL5XJ<>q6=TZ\$hd*ZJ+=yXb!/ch%CAc
l!T+M= iyJ5V8bwew?qLJ$LnP<LDeT$X^Lm$<Hu/&pph5#/*dHLk>b^yQaJ*=kedbk$5XNLVW/6TILFb\Q1HR%^
F!IPGP etXdRKW^IDJDDZYFMM$D%TKmu58#5&t=h+\1^6q%jhm4*NmZZmG1+6+cu&Iyl1lWPIY4:lXVk/wP?u6Y
EC:HB# phXTW8\q6C<ttRakndN8+:^9N*>c4Yw%SNlCSM<ca6C\9lEP*iMe^GYuTqNS+/ZPh#jZajdSl1qhm@QC
@eLF6M t>/Iw?c?BKnZibl#aHw8ATJ::<&*Lh\Dq^?uD%<+djt!kq>HT?kCieQwPw^tW>wk8>Y\AbZWelCc9pjE
::hd$n A/P*$iuK?kJGFu=6J&4ekT%#/HRmY:>WJ*miH@VLCJ9&Z$>cpIl/LCL4Z5T8ceeEH&A*+I6epWkae1q8
Aa?y<8 LR/+ni64+S?pqXTQ1TKXM1BdCHEy:tWJet@<piXeH&diRGM$FcP8Q&a*PmLwL:\cIDe/>Vb%?1H@bI9@
%EW5L? qL!Z1iZcAaSH=1$8ZehaZlGV?j8$km:D1XKe^D@iMFdHcq?lMZa*alH!5YPpMlSD<tktGnM\N1pc4CKZ
ea*wXa 466CV?&@9<m1QMptycaHD^MM$FAe5XZ6ZTCMYlCYT>RN%B=5bITbQCiKF^FVZ*%G%VEIdb>1jjiHX>\R
!W+?&l 88j$&*%THwCpl+J5Y9H>\MM/:B91!A%IN%X6nSTM?i=?VlEN>$=d=1<KawJ*Zt*P1Tyu&l8i<*EjjZNu
u^8K\S wcSMm=6MMFAPa#j6>?jb^8Re#peS6LapbW$HVb?LJTR1tw4HM+1/lM<^IbXdNh6Q=>Ge%V@LLYw+L?JE
i5?Kt5 %kqjSGkPn%$\X*&48cI8+1BGWFQTm=&iVDXV=@mmJ!wFa?T+#qd=d4%1p:XD8qdV+%&5nMGKRPJFq5ke
GI<6Cm k<W81J9t8dqNyiF6hW*F&bY4dCqj>4+@1+a>@#u<QKSmaHW6#HJ5GN86DZ@ye+#dSZ*hR=?B4JDQdY*A
FZhWV# Jcaq^CDNdFjeIqMFtC%%qhCbN?W*/A+SqhwuqW6cpEQD5w5L#I8BneqCBZ%Vucb$#5I9n^e+Zh#D*D#>
BEyL9! lL46VamwhtRTK/89aQMRG=ZV9VGbjy&wGMtAmVCI58d6Q!^L%lVi8c5K%SNmIq#YZi>ZuGZKN1!FX9Zy
1!Zdk& YG/T*PTm&@BFtX+tZ<*T#1NCq^@qEWn6d9Bw\#d/n^G#I&qSJLTcG!pk+dN1t9WAF=^FXet@Vi5h9\wY
F9WF4q 4hP%^#8%\8Vh8D:mkn6t!V%e!d/nnjQh9AQYjG1?>+CIW*QpHjL$1IWiwNV8SKI@S^?%Ynq&^P6huXcm
KFX#>J 6?^etZH/c>hAp&Qh?&Zk\9b>Wd:5cKH1iu5>t5j#j%4Qa:#Mc8T4wYb#RdNt4S@##W/>H!LjbEL\!tY>
m&qMGj =<6K#My/j<CdV6:1/F*9tt9HW4P*</E4D5T16ENYa$KGeKck1GHFDS<bD#iB68F>1K\n6?9KDW5Rp8qt
Q+t\cZ GJ!6hymPZ+DF?&taJ/$wX6IHQY\mbl5/q^dNNjKq5/bFK<\?eFYP%<<DqwPjGhAX11Qu&PQRyZ6<V!@X
S>6*nc 1lnCap:Dc+?NiM@I<G11q%B16*KIu5JXYAPGJtEp%LDl+R&h*Awqb9$N%89n%Xdc&GWZ=?\ThnEl5<?t
WR:w+X >Ik1Q=:\<Gca/WcKN?a9=S+MWaN6?Lq56<I<ddiDVuPHu*R$i4E1%4d:6A<pjWqPWqR#I@lM:bG#+>5t
WMT6R* XH:&YI$\#j1\6JP^j1LEjEN%!<4AlmZ+ME1D1*LMR!R?\WZq%Mh6*m?8ydY<#6pEp!68unH9Q++ubuAN
L>yPQq \b9IjHLDj1ZH*l#*uF!P#F:?XBh\jn%@5<?Fd>TE@cT5n&:NtSpYLT8?L&YBl5BDV4%C$\t=q=5%j%pl
NJ@Xk5 I1EbEuPjD?YlVN56+uXEk5YCP^&9KFl<hp*yTp<kTX#amPMdnmEtZ5K*t>Lwjp*Bu5KE!H\/V\^>u#1t
p\E$d/ +1JL>iiHXhWN*hPj$6YQ%9Tmp%Vjj*KLndT%Kpw5w+$tQd&K!QmL/FD/NqHVw#cADVA*y4e:$&G^EBk/
Y?1Cit y&5A@HpBm$!Zh8$pHhJ:qHeh:bQC@Tuw=tp%ukBZ#5NpHW?@BCt#n!XW5+$mA5RPYuqYaRL4P$Z%WEMw
!NDZk# $qRy&dXyel&RVaV!dTk&SlbnJ44&ekdZG%t8&$wGMh*1MjHqa:WNq5y8C<?B:<?Jcmych6cYPw>&KE<i
kYGp&F V56>tbpuLtC4:^w1NJSQJ=b#==aqIyCB/ZMMn&Va&+%=YH?eS!E/a\$&SI^!PuYiW?qTSq4T&JbjikM1
Ed&Jd4 SRFNdl?NAJTVFJciMQw4K:PLc$a!*cKD*n&WIdMp##1KHNGVWCBGX4byt8&B#&/X>N>!i!al<?npKV%Z
@<4y#e w/nk%:+G6KGyS@WT%6kTSSNK8B5^*tPcCYh4?t/W8Zd4Qlw6>Qh?l:iw+#tScSn8ecaa/d!@X#kk4CdI
nl>KmG R#I:wV#<&XJQ8=w4G%QFuj:bh96JPw+deK@>#jEQ1p6G/wiKIp/>9PZZ@plW1y/&:ia\!cumMttptI/1
e%j=<= NTVmm^HL8bD5*kQBJ:P91JkaHthRV*MXCK5FVmba$WP*th$D!+hQt1NCX?&ScQhA8J&<qTwBQ5N#Ny?^
&tb+bE y!%Fp==#iRSaL>B+Ync!hchJIDQ@tE=4kwc*a5lXFmP&=#B>9ZIS8mW54bFpew*c19DCqBQQXiP/6j4%
hME$!> *BWD=uGi5mLcJ64>5HMIhh>ttS\%@kyp1\Q8YuQXZ@/J++Hem!%Td?&48JP!E5@TH#ne6%/tFi=qK+SS
&KFNE6 pNmnIG*6YM<Q!+9qTQ8/\l5^W?FS:n#Zu<XW#WQQt/a#6a&BPwSpF>$d@ARj=^4NjD:5u$6maejI1%W=
1H*a8G KNwKV<Yea<?=ayRpqDXJ<<FuT/\IEaYZkF&NRj4=Ny$1:1c/BcASB%p:FRNQ<mX?6GTFuT^:QZK^9Wi^
4qh?\J ?DFS:c+p==>p5jlBVTDl>9Bi^:eQ>\pjM4Kl1pay^D#Nh#Wa8VM$<G4@8I=$:RHCH=?k\m@^V/S>Y4dE
A&ehDN VYm\aRI!h96DndI\h8PX4e%!b5&j1G4*Kk\>&Jew#/*>Yqd@tE@K%aIl@kL:c$NIPDR?wc^?w1!&W*F?
L6SEdH ^Mu?FVVwBG*QVQ9ci//<+RLTy4ych>XBV8=>>*WjIE@:9d>ai$/YNqVa^CZ4Dj&VSqbbZt*>p^>CC/#e
4XqT\L &6STb:/!\WkD5q!>nC+i>GbMD<dcXbZb?G!dVPSSy6Fd&>V!Nd+V5!bVA4^yZ?/tpWy9QL9SHcL^!teD
1jnZ:6 w&9!iu@BkHtJANbwZN#%L?ZCXJlDe&V#CF$#@X$c^8mb\R/u9L9\QlE8G+JPW8Mq\cn1>N44NY6e^!P=
n1$dhm S/15ZSVZZI?MtNLqtDqYtPY%Qp1DulDwHltJFZuDP*ZbpS\+8!SyjwJutd=it&C%y8HXX@!k=5K?8^Pe
P:bbJV ^84KG>/EFpp=qw!BN+KPV/@\G4ReE56adnB?wyY=#:Fl+nw51khL\!Ew?DQFB9\@#ud@y^Wd<Q<+\\%i
jP#c\t 5RH+QwL^n+wNABd^L!p&+HGE9?H:8!IC?F$SAj!8mAB?X$RA9!5mkN<XEeAD8@wI?F*6AQ!8hkB?X#5A
LZ&NWa 9!9>kN<XEeD9ckeAj&5HjQ8\1$aA:GwHAL9cAeC8hkC\1^$A:GwHAL9cAeC8>AQ\Z>IQ\K:$\?:F?@bl
y$t%PS >:>*yS?AZipHaFj^AWD9@k>/X&kB&FX<AQ/Yhjk9jaLhK99@4N@@lL#?+!/Dai*mj#L?@lN4C1^h@E@I
kS>:VH /#?^y5CF^Q>pVQ$u%lVcm9E@Ic@@^ByN/d9^aK\yeJ*^Q!G9@:M%qpDJtkDGG9@#5Wj<V<n4Q:HGWjn8
@68h^Q u<^t@<RcT?H%Q^yM4FFCQ?HSaGINT+F?npiDmVXKlCa<Gp!5aTm6EnTaYMMAqH+=tFnD+Cn>enC^lpFV
%:nWBc 5kaVc^lK%^\DJ6a\CAyQB\!aYENV$PHAa<DE&5:L?y>dk+p%NI:TL\eVc&kKtlB+DJlaw+Vj\GQA^Bwq
VD5j1K ikIiA!dY$BTa$ukMtFmnBDuAa<DEGwyCW!eiC!dYWJSi#YQB^B1K$n6\LJlaR%GaY5Sn\eRcm5IpHS+L
-A@n>V 00042ab3a1a001202b4 Page 258 of binaries2.zip
dnyhiC J6bRFGmPiC!aYEMlKN^9LJlaR%Ia\5Jn<d?ViYABWLpDJY5\5acnkJjD+^C@p#9kpL?VP?BA=Y5WNCH\
*mXZRj PFB:KAXNCD\P%B=KcS@DaWHqDyT5ecB!B\yQB^!aYKQIN<dnkN<#J@\@&jn#9$@Y@VjKqjAdKFjeh%RP
\B51kh YFkEHk>tjXCCSiD^1H>@&#b!y=5Jk@#lFBbWm!pi%EEJwLD\<CAHbqDIHcYyZ&X1+d+VML+:BYymAa<H
?imCDD hRKnMLGA^+MetEES<QljD4?hKj&hEa\hy%Ck?td^wLaqLIWHDS:<6D+i?S6WtS*i?\+@dRh<DMayWQ5h
NSe@&< BZW&QAD?RaFA@RcyceiyuV5F$mpA?X6PkhyIKdWTA?nj55cAuNSGEyC@Dy#i8cIa^I<4mkZX*\1A&1Iy
ElS?pc HbwA<Q&6?N<llP/kPL<:leKAekwQK8?kpK$BAHmtCQI*!QTa:=C<d*>BRjL\AKkmEKXnH9kJ8N?lcPP?
DhR#Y4 /^=?h\4e#p<AXX&m6QMVWGDbX=ljltu8DJbkMH@jKXCWMn\BDc4+R?qPkhaRAHCw*?Ana%CEH$/Bt&$m
AA=bPl kK1HWby6IwC1l%E/L^Q\9&WN@AhT1S*RNQdHBWZn\X%RWIW&C9wF\Q<?Aje*VA!Q@iY=K8T*b#ac<&M>
EA/@K9 w:Fk%nPAAFjBR%B\/n?S!cP@bS#wH=p<GlTkD$CAKk%TAQRBCA^wqCKA?PZ%9IM^@yHJw>EIWE/B1num
8Al4?y WBTe\9*:uj1&HkXSlB@b#A=PEa^VwI1bcA\Fy$AC?qAIBQKZN*+5WlD%:eC^M%&DAwXwASAEWQZhu%e1
GXhAw\ AdAcA6@8FPcZ%^RP?<PyHcA5PKiR!N>!CkWYJwdA@jKc&yp1@c:&kAd6FQ1*uAIQ/Q5NDRFAeEj=ctj&
RqCC!c F\WKykMkRSYMKd!/BJD@\yH@q#Hc*++<KM!Q#Si5W@njekwAt*j?Pt=@l=8AR9@ajFGklBEAJLnZKSR&
JL5SF4 Z^SwqVE5+6e4V9n9&5jjuRKqIRCk\L&u\XN\CuSG<S6u8b$SYeKQPkaKFCEIRIF:AWTk+BVwYkL1%$WE
cJm\Fy pN?&@l&q8^&9pHlRn#>R:StWlBkBFP+@WTEBpN?&+B?uPTRPB<w4QKlZZkAF4$BZB@G@9Q*8#Gn@c*lt
kVd$Yd AFSHCcYKP\C1w\SH+T\IkPwwwY!N?9ejn>G+uVL4*&lwJKl$GqT4!k/B@PhP@Rh$A*hAT#9q%8@ER%Dq
bcE:#M XkBWD\!qem8A^9*::^RG9WN<@S9nCA1MD+B145FSAPMDcQD4?beqDNDAN&e\tB>PkTw=AcC/h4AWTp+A
enlh6H Bq!HGIWHN/m8He4Y1N?!S9?YNic*4LG@bR&/hI:>>ijaVyX=y>V*uh+KKnEG%R/$I&d=e/j?J^ym%@b9
<!<JP5 NAV!b&kI@G=V4K!?IB4:#&AI+B@dlE#hAn%Jk8Jc*p/p$^LjjmIy+AjNu+D:y?*49!5!8:*KYACH@@9L
p&wE8Y DQ%JRV6t/J><+@@hY4TLwpBn5In@L%AW5+L^uTVl?NAlj$#hQniipkK=dMGIw@R%!cH*QV!S4T\P+XwN
=ihJ+B ^6L<CjRRXjF<V*EFby&Cw/cC<e:$K6Kup<^iiSQ!8=#<4i?HK?E4cewtdAl<Ll=%4VIQ=canLy!?Tu!A
pIuJ4* juMMp1!ZMLyFm<^+#tueES>N!<hyI5VeuWD<=JjSdwkdhmN5&#qq8QVYtnBH/9>^FwJa&AQ>hFlFth\d
9QD6qP LVYW#WE9%YYISm&iN5SH!W\dE8lwQAWEwtlb8jybjVMMPblYcVETh/ZFiY1Rd^cuE5Tp+K6JCA:tFL:!
Yw\ERe E=Z8CbB8n5IYcq%:l\j*:y6Wde6ZQLuQA+%IM8bH1=+iR%RNS?I\!6Sb9MLSTchj\?qbq=Rpc@!+FB<B
+SMT#M XX91B/L:T$pC<4jdb6@iM?dB<eSFGE99XVhT5?G9$J^hE&ke:yp99LeYISlJ##uyB?md4E<8C=>\L^iI
aCj/&w QqGF?#TEuLuZ*XWqn=GLPu#jTLJcNj>wyK/StR/jlMSHV\E^ua*Q&KEp&A!lR$b1PT^cJYYGd##M%$P4
^=yA6/ *?S#lZK=*\1#AKSGhiIPN5:Z>WMle%QQ91cKjQ<XCN9&&RMcKh!m/Bcy:WTDw!&8@n!weXa1juyc*Z&B
:9!K/T 4C@wPQmtXppHknVHjH*\$ecFE\PFl=ZjeWBd>D:+V<*an/CP4ydIBw\b?+/i%YwLdHkQh*81q*m<<I5q
Cibp?H YcH&jc*>E\?uy%bG&L6ielKL&mbJp*961D&ckmV9<VC\1:8wY=Hdk*klP1qqGldDWjEi!LBI#:eQZ5SV
>a9kI& jXEK#<>ncKqKYyKM1u?1Z64t+LWT<mI6WCJWwe*^CB8b6?<cSEFFiS1%a8E5HHISi^CNpEpHAqAn+m<^
+E195m BSyZaI>T#ZEtNuIpQ:*=m>G*!X@*Vha^Z:u!\K1Y5hl*AJ+^ahVnHK6y4PPe6KISiNDNe#ZqAByG##Pu
SIVT8\ RCCunPIl%T@wy%KieunQTS%HbD?QF4d#p8NSQi^b<pn#1dM5y+ZbFu&8hXDJG*+d$!de\MLaNp8RK1wm
bi*JC/ %eC8JdWQWB$S1\@1iw9lN$CN4Gkq/kKn:R?mm>nPLSHjXnAWWy8eD?1J#/%ZWN@kWDJYLB+Qdk$kt+$i
H\%Tea =HANN!/cD?tjTqdmh41:b\kFM?V@jD>>4$Pt#pju/h6yp1yWL+$<#8wu?hMyZVw>h$D+p1aZRa4&$4I%
?bn4G+ m:GwKC!nKe9E%Y:ad#m$am\%>cN6d+KpMtIJP$wVY9\m?jB>6VhCXLe$\:QnlpZ>K5>e9^G\j!HVZWWy
J=l#@t dK!Z=tElM/$:t=d5JbSkYu/:ejEddcNL/HJcVA5H:V&XIqPeSFij!+\&6a/wHd!=@6p#b5hkTKt:XQle
TetZhW Mw&X=QajjVjlQF%$WM%6khCTI<eJi=$1H?YGY#:\Zc88^+4#I9$km%>ec<#<=*M*lCKl!X:T4/$uiNb>
:I>@^# *i%DabHE=ZYX/pF4nhkF8bNT&cTm:hMXJHGb?:&wl/68dL$hLLkl=j&$lR+uVFVP!$:*HD#/5lFmeEqX
E=VcPh lan#VP@&njD<c6@N5Np>lcFK/d8hjbt4Yy/#PkXL$wbwI%\H$uS9BWRQB@PhW5\*9b1HLJP^8qb*R#1#
KFB<yB <jJ^@+Y#PbXVjI:cbIZPIKa?ypmY/\tXcdLt$SWc^p=6LCiTDGmA:NG?XN&SccPBMVuBD9?4M!k#X5FR
Vka\%! dDNcL6&tqN8$$k1bXcX9&:Qtc<#h5DZI<JiIpW%eqDb#jwdtSSy!?^ju/bh?QW/t4^udT//Xl?Rbm/am
tpjRc% S\=\ByVW8jY?D:GeTIbyyMFVaPn6MI6JR?>^68a@JR=YMdbjLF+T+Gw+/dHH%lAnR@j596bpI!6@1h+=
p^5Pt+ jiiK/wZ>^=t+%e+y9&weG4K*99VwMeVkya%k%Mc+MPy>H5KN:aJcn41N$HW/cu+1+<iaN/+qJ!ABBC1J
p:a5RT &WVDG%El%^m<E8G6Y>QH^@X<c^ZdBnHGKW^ntR$VemYNBBZ#NJHWp1GRR+J:#pGb^<4kZHi%=e+1n?/h
T5/HVc E:9$!uc\jG/VqQAFhjJTj/%SbR<nVaa91#ly?jqyRYccBkudD+*%Sy*I+#Ch@ek!18RuDjL&4$N/W!:n
:1H5<4 CnQwp5ynHk?&5TtGwHFZYePW<SA@=bwP<cD!aXMqGd>n?ahm+94MG*Zp/I@$1A&X^ZJKiMchN1c&4/Xn
GFMa>8 :b$d8/H9jX+/^5qyEp/&9bkiBXH9Fe^<$yCyE$/i&FLT>JFIeEXkiGSZnc9+iPdMJQZNH#ZJm*8wcq&S
CVMDC4 kF+=enuFPeZ^nmd=GiG%TI6kGE*8<dweb4uZ6hjde8pGZR?HbLhljXcQ6LVk&YR#/IZK$+M+Gk$&Y\iq
G4<pZ# +I!HPGtG*>>:<QT$I:hXj%yVcM*FCN<VMRZiqnuKLXw*?^Z@a5&cXBE*>wJe@ZmtcQb=XwQkE!WJC/MY
1c=Ayq K4S5Z>^N5RYSA9hIG5l/adIu#P&Y8ZiF<>Kwpj4aPd8LLcGqq%QN4n$5T:HIk>b>\y+mPwt*/+/4DKPE
!HalIR n:YESEXAe?TINu8%Yy&Y>1VFSn/Vy%pe9KPVQHHpL!8EjymXe^bd+8ile4M4u8:n5eE*4a&%tdShclEQ
%8LV1m $%4w^86$9941m^:eLIe5?=mJJ#/y14DQ&y9/4E/Ai#LG^FLultmZ<S?8n@ap5KqEn*hF\>?c&>WNQ:68
MwdDaa C^&$Z%hIE%<bi:h8q#l?+F+$Vc4FM%NHu4Ptjj4<16jRYnt9X^FFuVXyHH:Zn5bm%lp$9D>\iNQc?YTm
C/pA\n /<$GGCY1nFYkE>eK+wIdQ*QVXASLB1YIhRm6QM5wHK*Z<uT@F9uJc/D%Rd\>lp9*B9:N\Td&D%pBSabE
$M1kIS >nMjF$6MT1:%NjC:>5#c>auhjRjjJww+CbAiCn8mR=I9C6$&9Q:a96muV^/8pCG8Bh%*DH+tZQQI4bL+
Z%jF9k 4JXMB$a6lTBhe&QV$MT6C1>?qC#Pib*l&cpPjY%a$N:Ny5H#&&4uYRXC=t*+T:6jy!?#Zm5JGlqm?m\&
lt%JP$ tDYL8#Cehq!@jGkj*CHinCGR+D\eKJPW=LRjPt&MN9m/TGY+1JHSM+nL8Ju!w98wbbGudb/ml:PkKuGM
AMBMEk LNkP4SVZkbW9qE?4/8ncJj1#\^JW89NXSCcFbLZDT!Ljh5^L/E4=qS/ep&X6%X8PapPeM\mXYMb>qVqw
=Zalqt &Y1+XcF:DZL$GweV=Nb1q+?9DZ64>YBZdeZAF*HSL</YFkZ$DEpuGIaPnpH>t:^Kn<*W6B>>FR\6@T6m
%t<?Ej NTj!HDI^<1=85%p$*a!a/:t&+uMQjDZdC8&!&$$$I5<b#8b/n<!!QcSQ*K94$eLk?E^CdcRS+V=!MYtV
4ZIHLj kchLhHPWE@1P*j6X^c5t&WW4u&cj!EF1:@L1?j6*yi&>ilhD/Dj6d@t!m6clq>+MCC5Y1BXuLqS=ht^P
m>wCC5 *Z#<b:LD4eI?6K4eW+q!Xmptu4Kk4W=k$qQ1!@@l:h4nw!1!hBPiIyEEH\M?G\aBEild6^:*ZlSJAkSR
N*+4!E ukwKPtA/TbP$h6Kl$\%tqyEAwpGmQHStHejhWRRHH#DI?qNHeek8kWFRZ8w5m\1+kKKn+MIknlHeP6Yh
KjtdkP yQ5eZNjh@i$jG944/uQPh/41uFN%d>*d$dh*=j5hhp#b@=h@@G4etS=hD=/\j9ZNSP9E6k:Lmpj>>m?N
>thY>1 V%&\>1D9<??P%h>#W?WVc=@655V45n8R*ZhW+c=i9TbP&nu54aJGc<Ya%+wc%?>8>$d*8pG^V9jN4C4L
<Bn!:D ujn*8a5j?+?Bk/+9mC?P?Sc?&Q@5tL\J8>hhh<Gwy#@Ji?4166qhqtb@@Na>X:9=Dj9+1y&Z::4+my#8
M=MN^d <WYqw+1&%F^:#=5XP&ah&:Kp1t9:<I+^SSHX?@b**:#<yb#!I%Y4b+:LKi>Yie$%W!?68&Vj5K@#4n$:
b\545D +Xmu5+ju>N:iMQnFIX*iH4i>dq@>y4iYZ4%*?8al@hh>ZZ#699d&uj**FB>t:a/9/QDXmu6H*9Xw/e!L
m>5PSP ?!==JQhI9C=u/ZN:L89+^VQZ*>!4n@*9b<::<$8FR@6QdIke@dckh8@D!/dpQ#@uqVYNT!ieKQL9Ca=b
RbQ?Tp eYQiu1L&y:6Z*j>9L\#j&&=ud9dSW!i/*H4w8YWqIV/#*#jh98l*bQuP<6+qucwcN>*<\IK/<TiL>k:/
X=*wtc iiE%u*ZM11\:%Puc8pi*4Ky9/DQ4\Z/JH8814q<=jicidq58/Q^Q&*dbSee?YQZXuIYZ9:^y&!96l:VJ
lMAbSC !4*<$\i8GQnc>616&Z*Y@S&LL%%j891l?ZZ*N@XbhhZAJZj$YQ:#*Z98i9Gh>\a>M9d<164G1k%N::!$
R1htQ? Mtjd:X6?$&bVu!=9d?8\eG@p4WiZX4!hp*9cQ4qn!L><9GDyM9:mbj#\$R=Fh!&LHq^a:>*\\k&Lj6e#
-AXAN? 000183fe73b001202b4 Page 259 of binaries2.zip
IN+d5j $H9PdYQHjYtQ99DLZiG%L/?^449ptS$QQ%n<^+j@*PZ=a^89@i18qi9#Hw\%hL^@&1adKp=8d@@Cye9K
yc=wAk e<?:cGE8j#<*>tH8J6@WV>?6ZVNZ4J:?#8+Z=4+\aulPR<j?t!@:@itl&*b54#*&:SeZQDVk8bw>V>@$
#HARa9 \Kn*6&/+a?&4h*jhNT!$4j:nX<a??iua\!99Ybu>p=H#m#yP9Yy$%\G4d6#cQ4:+@I9&LnujH*?p+L/d
bGRQ4b 6*c:MQ>WS?@GhRe?j*XpdQu>u>@pSmb6=tZ8%99/b^%59PYZVtVGw9DZm==</W<ZVl6!M8\i:d^=>?@P
&\c?$J t#lk\&iZD4&ta6L#ld@w5C>:@R$QFc:iYd=uS?/Zw=<iP5W*wj*C@i$/@*Z&?hP@KN\Z&jNtu+4=kXN1
DwqRFH <<+@hQlqN6@>^P/6p^+bX*Zd=D68?H&5>:M*V9#y8J=bYie/PP6tu9D+@#++/&aiEWt8%$eFI#Qm$Ww+
JB8><@ QN9<V@MFT\QGBT9$<ub+cEa\Eau4BY=lLDR#Ecw51jE4!=!PLhQLZ!Fl%X<XnSetKp9m+YmqQ*B#NFFb
u^5C\$ mt*k%Adk1^jNJdF\XV\cA+uXJdA$l6N&&aFl\cySwZBbih\Q#^e*!&9#:WDdBTMLI<G!c4$WV9t6IHtG
16tlFa h!B5yi5Y&wGYZ9B:1hibRR9DS1??I<F+8DI/<PbwSdBTj#W/Hw!ET=JekNW6<XDF4Z+Z=E=J/SjK\&#E
P<CJH9 n&Bn1$\&^9^YNp+4G%9b#HE^I>%>A&%Nm%tYyStJ:&NWEI&Wjm<l8G$<nSEw#YRp@?@/^%E6nD#C^4GT
Xq+/K8 LbnFNB9tjl?dJA*Eb!D:9m=!dW^I@Xh#duSF5C^WRHcNMw<FJd$\w4IpYl18LAPK+Sp#RnE>A$J\KJ#y
a+WV@b YYib@>u\Q$/qbi^BRX8NicqNH@mXhJZX<lG&nSW:%^dRPb=G!5RQ:\Bqh?nXy4c&$u@JR<Qd8lN&hC:6
K^!Hk= 9mB@bQiqY&i&1^@t*%W*5j:>dn&:FSieiHZ?\J@&L6m!*5:N8>>jN*@l+iZq6Whnk*>hQH!=j>/Jp>Wd
F:q\iP >\>T%**db8SXV*#\?ct@jX!:bPnGA=>><>C+=!e>i&9@>^=@a>aj:q!#>?=dB=>/eH9y865H9Qi+/=6?
!ALYnt +Nu4>q=WNYjW+q:6L!1ipJN>n1Cw#4G#bb9ZVj+\4j8/bYjqhDp+I:>PZDV#kRL@8mtVL8%ewndXDZ?5
GbSm9X c5Nc@:!Sw*MiK?<*9cBjVtP*mVY>H@eQ99#lb/dM:F*uu:9n#tN@i@jI^mF#q*\!j9cJM&hQ*@Q1*4/u
8?EME^ t#=1tJh@+ce4jD:*!8@8>jucNJ\y<uY@<4a:L#/>PXH48*KDL*Dc=#9:bb8N?!@=^Hjqah@L$>bG9&w@
$d\>i> dh:hiV?4G9VZ>wi!@4St?wTD=>@SeGYYd@1<>==:9aHh@41dhjH#m?i9>4&/wXPQdcj8iu*1P=McjQ*j
JNCBJ% <H\LS8:?hEDN+TQHB#?RY%K:wu=\%np>^M:S<ici&Q>P^=i$9cV?94a>G\jE@HcZ@Cij4l>V:M\9LK^!
>Rc^e@ *juh@P\*^cY>^w!bj68C:MPN<>yXn6G8P4muiLVIm*6ZnHuSHy&V>?ZRnZ9du9+t1<:*bG%=Q>q$b5Ha
qRSilW wqePHL9$paZ:9/8c@MEF5=9??hA$>:bSHW?*:#q9lt@CtkG?K+1/V88+<eCy&W*:n<^/:eQn+$>@8K$y
MZp+FZ N4h^/@wJE\9:6npuS@6@ME$X@@HVqMkRhHK1e?*=yl<hc?pF</:ZH?mF\1^P*R@tDi^i%&Eyi&^4ZuL/
@!MTk# Qc4P?$tQ?5ce<4#cLSYLelc^unW@!<>i*1**Ic>uy!iH=R#QL#nS*A8>hC><N*jwkiQ:Py?6??:Pnc9:
bF1yX@ juQL&X?Quj9d%cL@1kq#C?:6i*V<4=wP*65$?+@@iu#&G#Y/Z>wi#Z9qH*^d9y&:5j9^R$&u4lw*b@GB
5Hnade W$%:#u#$m?ycZ=9VR<:d@>FVjH>*j>PChq&Lmt4@q8P:w5*<Npecin!^/YT:8a6!T+6Y%N>+:5GwjwVQ
SATdV$ hZA1m\Xu/TdBpwT8WAIq+XlJwtJGJHTQQ^AQS:T9AlZBpllWC<Y^EDR5necDJTcBBE4DYqJ%8F1LnaH$
8/*1tj REtwNB!JBQ&B<pSqYVCY1IkEE:yh6E\ZKZj44+NGpJaRCXXZl:ZISCTmS%H#*&\M@Nm@@*5B*QMHbmcm
J!G^yJ eW*LJDJQNZ5IukKi>qX^5Fw:a$ap1ytu<NLmJJwhCEWm+Ty\VKA$YFaGa!@=X:jIhHFXKBa9n!c1k:wP
b\lun1 C>!T<p>bIl\^PmKlGeBy@An#5QmpEwMq@^p#GdXFh>w*?qQ1!^dH/QES4C:*B$IX!d?y#w*Hk1YlmtBM
epK^P: >$+%Xy<TEhZehY4LDp^6/i>AhXY\SMN/dkbKE4Ga1VYlw6PDJHy*1LI+GNMj*dRSEmmJX6WpBYaHw4HT
+1aa8j GcGKeGXaq:Z\n9JAJFwYLkqG+MyWwL!t1n!p#amF!5LXttTw6HWIqwdKamF\eFWpWc$FJLVk?P^whWL:
cFy%$6 Mc\4u$C<ZH@j?nE%1C5T=uZwARPZ\6k%a4Nd^/5iu/&@$8bXBK6LElFnH$RR@jZMSDBtwwn?h:t88%P/
+*d\XN W4CiAuCEPbCjtp*=Ke*=/b&hu@J=j16Z<yQ#Ju?EQ#C5&Sm>aplJGbGTMmJh!wnYZ+>P6S8hcne/4b&8
+\XepA ^%wdn6ClMDA8yZ=</qjnW:<cu!=>jHPn6LqhwXeX+cyInWc4I&d\VE/JtJ\TMVqh^PSY9XPV*?5\XB/N
jc6uQ/ \hAK^ZR^4$iu@m:aHHlTMwLyMwIyM+JybkTV9kyCqG4y8FBKTmkqJbR8JhS1TVnbLn5RVnWMy#eM6#aM
@tG#/X kc51W?1nKiuS%I?mGR/PN4h1@ZXyiFdaRCqHJXICEmpBmR\Bmhaj%1Rc^JPP1tu=l1VDnMy*tF:B^e$X
*=RRh$ Wq&dl&QXed>MQiWuMCaIu=JZRpt1dC=+:>ASL@ZEw&qyZ&heQT&EM<MywaY/44e>d4X<bHyqJ?!Yn#c<
Xp^4t^ ja!*jDR9IG9>X9kFc*u\j/E8IaY6Yl4d@6VVqLJlYT&dL?5GCwW=Sy9/IQ&P%@IV5#lyEi@wMKXcSLl\
Jnt9YI P&S#DX<I6/>cLTW<G/R<PJI4:R#E6j^8JtD:Y!=Gy^B+B$+tI9\&#$T$MyGBiM^91$\EZ8tWmeA6\=tI
!=SZj# =^ebe8DtKmE#EiaZGbLlQq<:E^D?DQ9k?u1tYA=>twuAaahMBE+LbCBAM/MN*PPqMkHt#!Dy\ZGZNP5e
:nma!L e%i<RIn6F#\hkb99bRaA>+!*Ilc<nEWI+YwYVBHaA>nB5AVP#CY\DdBHaN$=Zl4dbllPG/TNl&baAe\J
1cFGRl :AA5CA^&W#wT:LaJHRX&&+RPHA*\dEJHAS%BXC1kI+lKiNGVJ/lKCVBXCT\FXRp5BjGkAycTiFABT<pR
/!wh51 DDiieM9C4cWD6\FLdKD$+Jbuq<J\8MZFh5MBd</I1=Riq=^^Ck8AMS&+K+<#D>5NL#HtNlpu<HbmDbQY
k@eSl# nkAan^M#aY$Hh^w<B+*dLlaCD=*m68eRYAH5E6kB&CP\C&iALAJ:APQ^DW<8$nA^EI=>eW5T&AGaGCmM
JSMI$h TtKkAyl+EB+6wX5V8*Z6!LqDbINnPjE*QIqA\+RPHFun6B9kHAeu$^WP!Y8a5NT=R<PK\A^kamAeaiiC
J9K@M% 5HSByTB&8?AVRi^&\SJB:IdnV=#MiVk&!#tb<*AiquNJlaAHJSWChp51BD^I=mYe\hR\IR@#pp9T<^:R
cc>#A* pdmL+hRm=<wmMNBSnMB\tE&=BAa/m5wGPk/XDZReKl9wPDcBka:DCR^$!C!G5%YeP=LARMhBH6SlEEI9
IESL1N Jt@&K@W+SydwMAmlAM6YFn!DlF5K\<4EYEbkDm?G6AkMehD&MG!GJldmKuMC%EZh+H1/^8G&m?#&LJMd
Tb=ch= <HV%LNepL>Lclhb+&H9/Q<kpLwEly?FS=VEG?bISIVapSydbce!CmM=dC<%tYJ1\#ltCwR#T4uIIDKEZ
NK<M9X nSMN\:MZdE>l&DY>k!^lFpR&C$$yDWN4lmck=mklT=HY5DQJGZIX\NDFcLA^Bwh@PFPIQPPGJbyTAIMq
&AY8\% cP+A:EG?SLL6=FFNqDIAl8HDcG5+Y5KRdB5!pW=TLwHNRTk5SB5H5CA\FA8wdNG\/ZqJlNnRP=Jaal/M
YG9L*Z I+q5e&yiayaTa1!F5m9AaLiF^wq\VKilNAw\hByKw^1G!e&\B+XnJnj&wHDM=MdnY<C#8DSMLIF*bnM<
k8R&&= TRR<Qa5#JnEMTbh^w6J^AWanXumY1Z$I:JyTDl9wtiHnekJD::mC\QBAEFeTGHwH%XXMY1dCR^YHltHP
\NG5qW M++5pSJ!MeN>KiHyQb\yStB\qiIEBy<wRYCR4TTGp@NTEhmwhAkMhFBmbPdF*=\=^G+I%M\lq5CIbR/^
#%6#*R BKwC=lBLaCA#q%mTQHiPHK84e1CD\/MD*ekb18$%DH*JWILSQKBaaHn8PJA1PWPbSMPt@yaal5!9I\Rn
wYRVXe 5HtiDG%6VwblqjCMYG:n\KGunnq5n%1:uktt1Q/GM&5t\hkE6kHtBId5mmPdZ9*Bkk!X@Bw&C&C$RNC\
lFGq!Z Yd:lWiWqq&>+XHu\:A+hqT$CR>tCp+CGadGHB=6iRpI8^n&9ahPc$QFMc#RGQYtY+umtiT1bL%$Ct$D6
bRiN5c ESlCAe/AH4\KunPL!DaDGTeaD%=j#JuA4iH>4b\SqZCRkVQmRdMTaB=tcTy1=npEltWu\:Ll#LH6+eDl
LSa6pM \jqCDbQYENa6+pHaK6T\VYDnK6^y4qtl+^CtaWm/np6kEPIRT%\V%4FQZGDJPCd9Jj*NCR!PFZkki&cb
l&<a:^ :>pElwDuETHJ5kZVkS$X#n\mY=nYtKWHth6tSDbpdy5S&SKKiJ^GNR#4iWbWTkk#nQkE$4@NmCZRq#au
dc6a&* 55&8BTi!whN5/t@HCCG!HTME>/ZutlnLCA!6JjGJYTBI+lQQCCF&R>/^JdEd<w+6mh&imenEdqmN&tSi
n$1npY t14AS1FAy^hIMDccJACD9>EpASkCNbwpAANLNEpABp9RJAEaLEGVBB+uAyc+^EAGQuGJTka?RdYQdeF^
jtEt+T J#kjtkp#p$b6XEBy&DGBk<C\J?=l<k^?4&Fpmc+EIc!nRpVD*BVDHwElR1C%1+al%XtYR&AnlMk&pe*G
#DLP<h 5wZbbJVaRJE5?Y$Ct\wQYYJdWG5!6E+D&FTQp5AtbXDaSDbpme%MNeP^dHl?1+=5FDaBL%$&#BBlX4T6
GFHYb/ KB8pC\X+t#MZcRpDWGZTmEnd$VWwQI/Dm:RKLItCq$ScebhCnX#eFnyS5M!&D1SjLpTtDR/<8=&L6Q&@
kK9dE4 JGw8M/Z6EKSRiB^V&nbICyYAew!CbYt:iTuWcJMI6a$&lXGn#eGw$ibm%GnD*GAICa/=\aybeM!Nt$hN
68u#:e aY/\&T5+=ka:C+Jnd5d4HHMVSl9tJw\&#E$adbmdMNw\N&F/E*PVLHpGE1GkVYLGpQmE^I\l\RtJGb8^
<D9*!j I#FnbdSl^5yw\+!X$aabK/MNM%bGG&aM!\TlMDewkIVC*GASLBVtBkqYKM\NE1qRtJ646GF846GG8dqG
aG4$TI G?dtGt&at&8$aY+R%aTD8WF&Fk:tBqqaPJkdSD4laG+t\nmIt>uLFa:E1NGtMG1$PSk%&q!MGt&It>q1
lMaL$B FT=8c&KJT>1CN5@CKGn#GEbBt+j<+Jya+uGMknaQ?<HEEk@:\eRTD@9B^BIQ?<HEEk>#M:HE\>\kqpkL
/P6M\B e+NaIm*MDYKJ6DA*mCZT\6\kqpkLe^NGG?atnDdMVSl6tJ5$&nA*cdSldlBLJMQeIJbIl4tbGbBYK>9J
GDudF= @Rka%m1N5wFV@4FhA5P#HNMCjnMMVNImjk1Ghd%MC@uNMDBMT?#NMN^Wpbdat&Fku4dAcadB\LT46e$\
-At?jM 00056748dce001202b4 Page 260 of binaries2.zip
W%Pq*q YCKI*ecyk6l69C1J*dBppbLadd\6mc6k!TLVRue#DAbK\lK8cWlFY+Qhm4SY+EFFjAIbRC4mE\WiXMRu
Lki:5b pBtpIn/B*XDyEQKRMcSD!EN^KS%CHnKJhKl5aPpRj$PGpT=SCb8N$mW1IjNIq/mEDT4yEk</=pte^IP\
FM=BQ4 M!Jh+pHIXNIqHwS4yNIqHwRMJq*CEycI$mW5IdNJn:CE=d:$CE9IiNInLGEnW*1EJYSC/YGYH1!TqMWJ
hMynpl dANMY\8AJaEX\I4AL5DaJ*CdmIbhAl8XHwFBJdMIDCwbI#CwbNkub96RMeIT>nwWI!!=WWqae1PT5PSG
QXP!%/ JYEynE4CWlmXlCW5#JSNYMJqRtWVquB4kLIJT>klXnblCSi=qE%aT1PT5JSGJYEynW4CWltXlKW!KkqL
ue@6Jc CB!KSH9aVhW\aRtlRHHCE8c<+wRqVG:FCW9H1CR5HcPT5HTMT5LTNTwJT>iwJC^lS$eJ\6IFqaK\lC5*
&*d?hE TlCY5KY1BGEJ!&bFM1Db@%EpA=1NHpW!wNuSWVkD8td4S8EM/Jw>GwW#wA8ZZ4uCGSCiIk\\I#Cw^BuR
lijH\Z NZ5$CthA%#LSB&hADS8Xp5BGyTI\lF+95:X6Tck*JS4IAEQwSeNi\!bFw>:S5EpbmlEaXC4eG91LT#RB
CT!e:+ NY^p&>lA5^!V1Ph6K=tqqEhkE=H@5:Q@c:wpN?+$\d%iM*/H>&dMhm<&FRAe@<^pMqP4%Yy6p!&81Jti
4*bPkn &dG=TLKTbG+ZK&845mm^Q@*/D?ieN^D?SLX6D!@KtM<dJ^^AAA+H+HA@T%I??QjXR5@&A>Z!mHtp%6+Y
l*D\*y F$<1H>S6GjGpi8?&nHlT&Z#dyQ&pW*RG85dyNtW@/ByK&?#$yJI&a<t$!Gw#%tINkSuL1/XZt:G<Glj>
*e5@/B \LNNFM>&$Xk*nbYiRluW+E=dyFt$S/4w=Sq9WMp!*qBF<RcXN+>Iy&lwhe&WybenWpp4KXA6591taJ>W
:=p?$* bckqW4XPDX>IT49$F6?k?dP*?Aa6y*4DG%T*Fq6He&y95ZW$yjaYY<hYGYL4cJ:6LdcPStL9wCyD:KqT
*L9R84 pKYQ&GccVQ8INhb!wMj?8\b+n@%ZPY>Kn@&*cZ:65j<&#cN>^41%JT*YRmN&HLEYG4Hn\LNi5yH\:BCN
VNbhT+ Nha+HmuYYNQ6TQEdT$tNFN6BPtykDMtRHllDW1ED+$L#<5C+pLp<MC/paRdGla#qkZElw*lkZEkdnaL*
pku\tZ 14\F:%XLG6/4Yql<4?d$adEqye?G^bcWQl5YY%L/dFl5Tc*El<W&t/6p5e*tKqt5t:Ve5Fk*dWcNG6+k
y8YjIA H@5!/wlW:X6uyKyFP!JXiX8KXCX4iINK%9EGqc#HN$n*nb+nXeq/mXT6H8jC=Xp<iw%W=S%+k>y*^DjI
+HF<+/ 9Bkn6w:YNtQE8pu@nlu4ykZQQGLhyJZuEi8tXhA<a5tp1?iBpk*SYDjbQVPPiW$kbea^9#dmb^##tpDK
wItyb> nGN?de@9F\KiXHZLpKc/bWlVLVKp1Sab$qTLPI/XPLjMPL?6Dj=b+u5%Z<\T*/56yFqmt&pYtcXF1t>l
/B>&GK pKbcGKTy9HF$K@q1tZF$4!PCGWi*p1YYGWj*eucdeZR4\YmbeZT9k+Q>\5GV1u%4dEq6M5$c//dNyBp6
FCpP\p BbpDbWbLaXt%M<:h/=Bl^4q:?e>NcAJ6GE%wA5%bE=yAe>cMh8y!ly>^>q??<DQP@86Aak/<X!YL5@</
m?BmN$ yynRD=1h=w#Qcl/c$j/XRXFt6B@Y+eYM>wP!uyWb:RhqDdMDw>9uIV5PQD6E+:eaC5wT:X<bNZbAE*ml
IP%a:W uMbcVJWB+*m1DBnHW&ZAPF=^XcP64PMQy!*T4E\?FtpS^S6Wm+I*1GTqS/1T^hqj^yLVGcqKFth@GW6&
*$hb@5 ^Nqj^yIhFe?1bBZQ1u*niJP^bEeed#yw6mPP6*YeMEb5B%6#Xt\HdTiNEh4l5cp*R<pi8*T^X<>q&<eb
l>m@lY b#pH>hkuH*6cebb?:C?FYXy8$cLZN<kDYD%%B64$*aJN/%VQd9Pd!a>>KVR:J9BcN&?%i&F>8t*R94C?
Z8Vja1 $nb1Z%nhcl8&L:^E6wn:E6tBq<kB9ESP+K/Lw\j\FEa6ZRjb:w9:\pWa6jSPbL5D^\P9\bQ!AT!SPaye
DnDA%1 A!ZqDC!S8RBLbIdI6EVGl6YywPMG9J:8\K8A5YG%CLD>?5aL1+AF6T\TYXDLIyEF6T\TYXBLp<mCY6wT
\hE%Lm mX1cSBy1cSJy1KZ4Geiwyc5W^/lq%d*nmq1/*YCywyacJKtmqlwp1cKYGmTywyacJKtmqlwp?#&NJ?=L
HHV\Hw JG4bq$nW5m?S1PWcJA&%ZIPpwbb4pDVWek&Tlq18RhJR:4FEw6^nmWT==^KJem9kiPy<YmI:u=dIkXy1
SuF>Mt bp$n%qL4DMebYCJHAbdIaeBLbQ!YYn@a:yu?\8y5w\P45+$BQISnLdY!5N%>:IWq<wDILJEJ:<+TtjB8
:ISt!+ W%Mq9KVycWQq?^yyKIp/&<H1LCM4Xmiq%VXVcJPWq>a5DZlyCD!>>Ep#+NXnK@D1Qun*$mh>j@h$k:iw
EP?^Wm :4%i/NTFSy?M#1=YQ#Sdq>P*4:9aEB5Z=n4X>4QB^c4a>du%Midq8d1/?N!j<:ZJ$nQd#QmAT5q=HFew
H1qVjI bbK*YjEB5&AP$ASLkI4K5M&HD#kEc+BLi49C5cV*AI6k1NFakpKNyFF!CnXT4<wy%EncJKhRI?tT*hZ/
NaGJLp ATWwlS4NJTnWTFd::tR61N8N646aQ/CcLw$Aq/AbwAVqI$DXKF>4XFawlJ\DXI%!CXCC5kY+BNWAq/BR
=t&#LG I&tZuEPNyF6!DnZKT*1wpjSKL1FGYW%ZRw$$C9d:K\?wcybRw/L&LKFGGnC:8@wD1ywq%Ekt!P/191A6
$F$RhE RcFGWli:t@wDTyCFGpqXbA5%MqZVRw%pnYRLNcwTbKFG5pT!lS4XJTnWTBb<6qAntTdbRw*cElS1JHY^
dVyel$ Z#>/RH&+Gt1pheX?CYyBcj*hQj<BJd&GG5qG&X*#H%DX4KFGtkS&6@\HXDX41NFRX/!lSpQ9dKFGT+i$
Wel><J WCQypDLm#/Ypb@m=@>6l?QtWmy?lRdSQWGbwEG$IqBpcbC=B%\c^a\q1AT=BQeAqcAT+BM$A9bwYqL>J
QJ!QLG 5XlR@uJ$N\9K*/SaLCl@p&K^wQ#q#?$\%EmVukZqL+>!5/D<=dd6MNRwL?tlSq4yYFD?<4k&C<yj46Xt
5RR#k# Rjt9PhiC<yeL6eNRI&pdC<yjV6FtRjuLJ>w5KH?=SJ5F=T@jb:Pk@BWb!T\wj=MK51D<VT4Ik9LZ%V&#
R^Em9E wQ!Z!YBB?e6D&m\wj:qCt\ZqL#>t5/D<=dB5FyT@QJQNk9KZC:JbWQ:!NVaL!q>P^YbB?e6:&C\wj:u?
/%=\mM tkZqL^>j5/D<=e^4FyT@!d1\wQ^N/5KC<6e6B4Pk@PWKdBcW9*^?#aL!q<89YXD?<5E%C<y@JXC!wQ#4
A=*pPi I!6<DXA>JCl@ie?cBiW9=%t#wQ#qP&5YqH>hTmAw@:1WRFD?hTtBwQ#4WkJB?XhbF^cWj%%KICn@K89C
LCatYR k9JZ?mc#wQ#4G8>B?e6J^T\wj#ueYk91Rk/$%wK/1B49LcmL8m#9wC/1luaL/1J1cLikL11Ghk91Rq+#
bdacS4 %wK/pQP86cA8=KN4LckL8iJcC?yCH4jYk41Ra/&%wC:pQ&561A6=<%kL/1LK8tlBZXRykSdWlj^u4AX%
XtqNp! IZejc$Fh!H9GYqAZey/^F6TFuG/6BZWll^y4RX*I5>bcWBh!SLIY%EYX8tlBZek*!XyRF@K@6SdWlX^$
+LIjNm 4AX%IY>cc$Fh!JjYYqAZeyt%F6TFHGc6BZWl9%l4RX*I@hXcWBj!?dEY%aXMnldX^X#TR+&pkqyWF%JB
yB=X$H LcmLhm#yM$BJD?yC4n4Yk44Rk6bcWBhc$XwL/pLD$qyRF^1B%wK/$Lm!F6TFlyC%wC+$MK\FhcH8:nDW
PK\u=F TB5mLhmK/6pPR+&YattlS4I8Yk5%$qbyc/FGT:G$WKPqYF1wWXu9DDZTC1Y%WCNdkpKNbB/$Htwp</D%
VFI4q$ WCPbB@9=\+JXku1w$XI5QhSwKbaic4RWT\<%1t1/Ht1$hEkQNX41wweccVG!?<<>+FCA?FAp1a5SqJY1
bku>bH dTMwK>ZRSqBYK4iNwK^WGl6BYetJ^pbRX9Kl5SGWqX^wdASqJc<aG$FbKSmpncC5hP^pI!k48eVaCMyK
NQTXD! 9m<&k4KTp+8NwK^YdMkSqNWKD#tC5yLZmw&k4HTPbTMwK@t5&AnKT5+yNwK!pliKncC5hD@VSqBY<nc^
J?RnB* EbTX9Ay6BGYq!=p&k4Jc\T6HWFd!NLESqJXeTt\EbTZjES6BYeqJ^EbRX9IG5SGWqh\?dASqyXB:NwK!
L<9mK\ pmPHncC5=LFlI!k48YdaCMyKQlk&k4KTC+cNwK#pc&EnKC5=XhkI!pyPn#cC56K6T^6BYeq*\pbRXuKh
V$>H1A 5BGWXhh+H$Fb4YQGEbVXPtReRXuJZ>JGWFd!n:ASqFXjtmEw1*ZtPIK!YmiPI!k4?WdaCMyK4lE&k4L1
&XX>pj T%$EbdWPIEhRX89+ea^Rw/XDS1mS4I9h\?wB%jIn%EmG^H/8@aC1?\k%YwyqlBw6^VJCnicTHtwp/&KE
p=WT?B @bDq>#DCj5l!bSllQ&V=LI!\H:JeFpdaD%t?CTQ5l!nCu5MYwBw=:Ii5A>eS>pPY6<II?!H4DHcG@bB%
YGhKwC An9DjwnPZ*&JFcT:Ki<\THi4*YGWQkYDhNhL>Rl/The</^H$ptc!ikT>yJt5HpE9cZ/1S>BLty@1EjTT
ptFqLp y1J/BL&p1ckiRT>y%1qH$E8chiwS>JIttHwE9cT=yB=BL&uc1EjRT=wl/lH$pmcDikT>yMuAacmS1i=B
IV=PpV L$uFP\\%Wl#uI?kq/YmHwWbXNRy/Tb4ZaclSW+&CZyI?hSl1%FV+wJipJS&GG9WqKNTwL$GlSu$JCnZ1
bwI!@l 1qHRT%Ji>Rl/TZ11HpE9TTZXI?kqcb>/BL$pSXPQwJipcPwS>JJ$Tn&CZyJP1WjRT>IW>Rl/Tb1mHpE9
+@I^q= TTuWI?kqKaX/BL&p<X?QwJjpRq1QwJh$4q8QwJjt5Z=?4bHPhP5S>JJPhP5S>NJe/mLwyduWShBLP586
LMc=al KikquiVYFQTT#uF4C98$P5Y6Ki#V/l=kVYGjX4eAc\4:6QIc4Tu5$<w>6Kc\V!99$J4CQ8$5!kIiNq:p
CNBjyP ?FSV&HmbJpFl+$YiwVYFnSi=kNaWNq:p/%qV&HmS?&bNaiNFjyw%la$ZPYVYFDbihNi9y4D^Ip?5t5LG
I5=&F? m?:=%SR&ZuVL4/c\<cI:jnYFnSihuheWNq:p>%qVYM9wPL*tMPLp*%u#mE<1QH$aeay:=nDW*hZHPnm>
!Tid5M \mEa/n/Y>FB*caaeSy#eQheS/^XKil^^$k\=n4kl/ZHETVQpPPKt/l=H*F#TR+&pLuIeeXIZPa++j/mY
I?IHkH /+l489=Z!*ZENX*?1?W/+y4eVG8=n4ktj>Jc4mP8!b&$q88Ic@LS1?W/+yyeVG8=n4mtC*?%ZEheW\Cu
#&W4AG Y1+n48t!Z!$y%El&TEtlS4JDTkw%pl%TW1mS:JCTRw*!ElS1qJikWKP!BIWcqTWw%Kk5RcFGWm\ql^4J
NQFK%H =Ck=%EktS<tlSnI=Tk+%p5qSe1mS6E*JwWc&yIec%TWw%Kk8RcFGhRpKNbK&KTZWTN1tqFAncb6TRw&p
mTw9u! dWwJNbK&KTZW1C%BwWb6CRw%/p6R1FFjkpKN?lIWcmTVw%mwWXhu5FCnwe=kwWdTIeXCncR8mwWcnjZP
tn+&@4 WKPyeq1wpbSA5XCn8ewbc4TW\NXKd&pykc8X*nT=Pp\BT6DXTt?cS&8=Y8p6Le%\6hKdy5^c4qb/$?^a
Xu6V+G !>XKd&qyl18X*6LTDFe49cYqGY1w$hIMLhSIt1EGHcLy4hckR#TV%Sy$mCa6l/H8Wle%/BD=u#wMhbh^
-ARmI: 0007a1ea16c001202b4 Page 261 of binaries2.zip
mCELPK WwMPpbPy\%D*51TH8p8H%KBD=DD1MNSI!=achIke^&wNPpRJHNab%AXK5hTkR^Sd6hckR?RYX&9RIZKK
N9jB=I 1#ZwELt1%ly$mB^Xc\$/SQ/w6RahIt@WYwMPphNy4WGH!F6$HZbhwBSLDVyEVy+PR+&pYG4RIZLbhBl1
h8iLY1 %NS$Raew\Qe/K:9CJTnWTI1qBl$mX#8HwWa!a&4RIjIL4VZwELq@%ly$mJ\@c\$/SD/i6RahIqjPYwMP
!I^p\J peht4WGH!F?#%1lDbMdW1EPpq&4WIhJLNiwRLX61$CF!%/5%/BB==nt5Ac4\RajICY<h>F&lCl>$mF#4
6^H9mV %8ujFi4DBS$ml:qc4!9>Jwi=Y1<4jYZCFR\%$qKw6qCnyaJc1NFTRT*WcKtkFt1pyXB6wWbL&:SRw/X6
S@=V\I i1nS$na>%Em4u6yDnbbm/cFGT:H$WKPqR*1wpbbC6aeccTqWi/nS$mE>%GnypB=1yQ&RPpKNqk+bwWc!
ZIY6NZ YPwINbLFWpiwpT!YPpKN/lL$Z1Q<\bZ<<dc=wT@T*naQhBFqbVk@6+lTZLZ>QVKj#::nRL+Wb:@JH@Jc
&\E^Ry M?^9!Y665L<q4#ZA&X%EbP8jjiXB@M*nT9#N<$4c&>qFHtT<uj%nES<9QX>Jj89qT8!6&=Z+t?8X?J89
/%wcL^ bjc^$K>q>wHR4&Z&WhC9bjalMK=q>9+@4tZ&#n?8bjciQ/=q>t+@4tZ&Qn?8bZd>Q1=q>6+?4tZ&L#m8
8Q+Z!N bZc>QK=qh9$:4&X&QV89bc=KtH$q?Y&:#jBA>4dhbHkk:+k6@HC<yY89pu&W46&1NL*?Y6>td!q$LCZ#
K*wH+6 Dn&4ndeW8ydGS?ld*tqT/F#iS%LwZSyGwZ6=D$mlj@pHV/GDDd*?Y91l%%>LQ@V/c?tHZu<6@hV44/Z*
TXQT:W V=FCN@PBtWI@<=GbRpid+!%hi=w<FNP%1<pXMX*:tu\P$:Y#!dp\ZZ8d9AnV6d9JZVBh?=9<A6P%\<pB
eIWmqT MF%:uD#><9X4!/W9Z:?&jQj!>Y9LTT>j9:c<<jL%c<96Lq?@69#4<9X4!=E8Z:?&QPd!>Y9LNT=j9:b<
dKFAe^ +QL%c<9bLX?@64#c<9X4T?Zt/>iYu%1?jt$=yPZ4%%:y>c=ji/WRCF>d?jQC%%bp@9C%qTA9jG%q\R6j
k<NBER Y/u8\6hYQ49\6XjT8t9yX&c/c?pjKaa81K>Mqqi$Mk=h$ewjhEX/@dZ$K#L&6jSD4:?YjmW$8yb?4Mk%
&<tqHL X/T\K6hCKIlY/AB#Ba8=IpXV8SbmBRm/FtJFB:wYawZH8DSlZXE\$lWy!EP?wlXJ=IyYYI+4$859yc<4
h!+XVj qEY:wlY^+w4$?uFFi9&<wlZ++aL!m8>\Sd1Cjm*>mpS^Lj$KPHE6@aw4eT*>Cl>^Lj&KEuE6@RwGeT&>
/m\@nK wkFhP<B!PD!8ybiZ\HE69Z\Ent9ydh*=9mJhYL1YZt/G^:Z$enK<>wuqaun6E<9BMQRJiRGFQ4F<A1:q
Jel8mR Yl+B%*LJl#D$mZZ\j!*ZP9c@684n$Q?ChDMl>Iq%6u<69R?yLeqDYbjV$nJ*n\CddQWWwQdi#\K@wJ9q
uk#*Y^ b=GjeG&J6\DZyuT@\LT&hM:i>wVc/=kYwK#/YRN$Y&WLYQtE*q^dZMwZ:G@d#dMH%D&4:i4bE&1SFXyJ
5ZNq^K tdDi6lCa=j*8*ib??+J8a/enRm>u84buptY%Bjl<\4W&d^G8=XmE95S4<Wp6\%6+WneK6wZ5E&4N&%KE
IjaIW4 @6%dn6CZV1%E/PX5F1GZ5>WI9VPMF1G/VT!uX5enjA:NK>6/@RXXw\m%%>FtlQ:PH888X81^:6yb4iHu
R?Wm&i m1&!dWi>+D1MmFC:wPGhe8@b61MieQqWXMC%!^TlXy&lpbhQSR&N9Q\j^w#Rc#T*e5:b=AP%dd1J>hXG
Y5CCJ5 =@/a4aSWY4>6Z4+QKAiCLR:EE:1t&RL&9YB=&?L%QcH*>m%e*\9/\9YeEX=\?mw$CNIF=T*T*k9/1nKF
*KqBIa e8y\88eTaZ@dR9K>wC>Be!mu#1G*kH^QYQ#u=<i\b#^5F%S:lQY6%&8N8ndM?4p4?+SNC?q4Nd8<&4i\
WWddH/ mE@wV:bRyCqu1Z+eEcw>4\$!=VDWRyGt\yB5V5JQ/I&^PcA?wZJau=QeC:1k$J=VHm46&y=K%1KYH\G8
WASM%B :aAewNd@6RSw1taK$Ih@4%FR%?iIV\=J6\n%*jGpj/MW!#qXyHtFYyq9aXJiWEPtSPm6XIJ$Ld$*6@\Z
qXQKMj %L:QmNDj&a+ANiJcFNV%=FXR$tHXFunVHwqXq9S4$&Y=Ht\8*$?wV%^/kKau4*ZQ8lc%8Yi@wBiyZ\8@
5A!C\i 5nX8#8EQ1IG\Pai@wA?E%mNW*c?6XNR:Ykd$I8Wbwd:SEcF*&yID>Jq+8+:^lK/>N6@!F@SYG9HuQkVd
T$C$B# 8Ld<m6ValpZwlS>dk!mbqHinjm4=8wLd!wLcEk$Jb6N^Yn@qQKCM&<&Z?RZu&?cM@IS8Bt#P!C?wjdAi
TGaPIa wG8j#i@+Cd&BN4@nF!^9t#@9E&1Z4MX!ilqH4JEY+=99:SN/?&:?pm@wktawy/!<LaLuC@y\Q#@Sk58&
eh1X4w *tJeQ1F@*T*E=SNK$Dp$Z>AdyM\Ayj6:kLJG6%CnD!mQ@M*9iMGld:==QT?w?<B9M$nZqh1*GcV4G8Vd
\lEwQM 6Ql#:VTG#1Bdct>d*LwZLG>d&LwZHG>d%Lwu>DLP$Jh$J?F6l4+pZ@?*Gj1THFnj6wl%L=njy5WciTN9
#8P:?P Mili$P6ia#q>!6\m$L&kF/tGem1R:&!AZ9jR/*St@LdF4*6BF>SGlF/pFk19tZ\LZ9iE@u&&9I+9/HZ9
tw^lij F1HZ9eh!ik9NH59y>b+>q6Nu^!$e*lM&FTtY$<jqHLGe?uBlHE%y<^uGpa#K6!$c*\81<JeuT>bb!Ln&
>w9SJB ybL%9uuXIaL/tyh*qyY*iPb?lV1Z*=!tZ>CLqGiE*mB=BNmqR\B>GM:+e*Zc++nRC*?pCL*8S+:RQ>^S
/S8P4S AqTuQT^CHR*WK>Sl/E^HlQ:lWyC8WB%dAM\Z>K>bkuRhCG+lLX@Rc%S/lFJBF1FWWC!uPqmJ=XRHK:Ge
!p8/NQ /nbHqK=8e$Vy1=FHlG1//#i1myM+eky\cw/:F1uJVB=ZFcRR8bwtLEK*CpeN$I&1Qq1Edu/PH1GWj^R$
:TaSNh NWqhC#?$ehnuEcFQKDNF/HNH5kl%=lZKKh?WLh:!C:wqpEI=6V$+$wlR5&E5y+:dem!uY9+/wRnKD4u&
NkhlFX 81Hq\ZcJ=\W%G+cj/^4icKGeYwiMNmLW1X\wy%c1w+h!cqW=+wiV1Vnml=PyPPKH$+&\EV?ek5&QCWFi
*6tD1j w@nlFNq+8#Z!k9+=btkq^VZidw$$YaBFpRDVFpD6RbXPMt%?i+881Ilym<jRH56/@&=y<<h:WG%HyC%M
GQ&D/$ \+8c$*Mb@cVcSh#!pm&/9I:Tqpj6RdZ9p:bh!BehV5?tihEyYkLXPb!Fhtncu$8dL>cLF6F4!d15@dVF
H@WTS\ pHlTN+nTF9TkQhJH8EtVNnjVF@XcdH/tV?4hLY$8qA<1D:qp<R&Ka=P&DG<Q1y*<6Lt191nKEP1&Stjc
=8TN<j *DBjNItPTLQwnFVTTyVYXu?IJjP^pDc*!\jX4iJW\4ha\#q6b\FQ/4bL56lt8uGd6tApV>yY:+69/K9@
S\BT1R >pn%*6wmXa?1<XphEY@bAX>W@c#HMp!>6+iY:P64npk%C4jdGC@1d>l8NL#wEA&64kXd&8+$QKtPnnjZ
q*mimp ?pYuZE9VEedRqAN@PpLJX9:y6B*C6GiGppQTT1Bn$S4y1pX<k\@YqK/>P1?pHGt:H@Cm$qHbIq%%C>J$
a6yu/T !V/q*CKhwpGcN6XVKpip@wYTSdy//nEmXW?NJX9/ajQBjNK/>E=<4*it6AXAiXGNd58S1phbmXR>%YIb
4eATaX >N&&iChQ8pcA>Wk%lm#YVc+XY*TV>5k&LA&?ZV61:\tB$*c!%S/:Rp5nlm?pHDuTp%hyYT/1cjQXjqDF
\Y1j<X ^$9dFc5uLiyS%%ppb?$SyC%E!+81bDY<RW&d6uk5L/w*%P6:VRw=dbjlZ4TJnpm:/I^WI/5jkc4G&+Y+
$ciTnP J%Yddjj^HqRtSnyC:#QbGPpIa<m$?=8PE6/4WQ!!eTNh=a*QQ51RI%*6EN>k$mZNAyZ?Qc=/WqTcK@hI
iGyBNJ %>m<%t*hMWwYY4%1w>DHbky$9TGMqy1Ynk1nyew#KKW\Yl+&#BF/Z*%<?hBV/@QLZ:@t<4bM&^&>>4:%
:u9W4G p:d:a?%>:!iqHKR6nYlBc%SF9puH%c4IK$lG&t+b98kcLTXT9YFayQ4!w\c/4I1WIq$#d=R&%&mJ:=%4
FjkC#W 9IZ*49=4Rc?9AAuJewyWbRk/6Y1#Q%paF:Y9$h*ni+6$cw@9ZhwwnM&1jjm$bhX>$5jeHcZJ/&4Lmj8m
Y#m>Fc !<wMNhc?dN1!%D:yYFbt?ELV#iT$ije@/Xkc<j4iyu^yKahu%%Y1qK+&VF=*1XIK+*lhjEwynPPtCQky
j9/tu& lX/>4lTqFQSDY>b4c4EM/mWy#A^N6:JVc4Fphd$l%p&Ya:ycIHuhnpqHtKYdLmct:S:Pm!+4M=RlLV5%
=9DeuE cQ9q^J>!tC?cCyX!nhI$nuPaSb4e:XLGi+jiEEdlephQPdcDI5YtHGcey8&YqGQ4KMbq!tHGce6uPIjS
<ZC:?V *iVmtuLw/$%GieyBc#S6>/eeNEFdDy<=/LPt?#My^&?<jD##DK%nc*bKS/TcA&wwtV%1HN=4T$@YEcq/
qVEM>J cw*Qct\iJdTD9KVTEZ8JnpdTEWbY%&YihAR:6ce%M^^ZcZ%=jPaW*1BqTM4BL8uLJ#IH9h/%PEp=#AH>
DK1jIu $R:ZXdNV4eq!/yG1%c?4ecjT>nqw&m+%uZLR1h*Yq\?#cdj%=T&YVG8SdLF8?pLb+u9uGqt^hVT@ba96
YPPIwS MNedam*tKpPw<dLBe>AQZWGwWl+#WyW*YN6#Pi@tMPQM%bIy>L/=LMeWS5DW<W^K\SKdPkSL/hyL6Li5
Sk+HWQ hjeEZc9dEcnYIy9QYu65V/<X!uX5F6QEu@JX@^c4T?>eb^!uYqGXWLKtt&nJ4q>IKRiqQa>IyduKhX!W
#hGTX: 4kDIKX%dZXTn?>41wt1#1*=\88cLWN+8q>!W4n5CwyI&c/TcSYawtVcH$uFhnT6b%B4#%*caT!PtGb:X
uQ6@BY =bNp%#uYQ/NYZ<jXWqACHYta1@Z1XG8u+:4ihK4ih>V+4Qc8n16GXAwiTd6cn4beFNJ^@WJKcTN:=:yQ
ae6TKt +QT^%k6$/48X/+\n1t>ek#RhB1dTknThB1b!ueqE6Y>$HWPm/u*ZPe6Y/lcuM%L%9l:L//wlqc56b!8&
CHNFD@ jm4Zd/FeKTybn*YVBXJ/4J6YwcZH8qY6<u85t:Su/dF8$y/q^:yJi=ai/!a4e*Q>jhKtpw%aN<&tt\N\
%c4F?a j?:Vi865du!L48AqcW5a8YldN!DG&W5iXKiEcjQ=Y:S4+bY&YJd>QeX=&9\Z?tM*ci%4XI5$mX/p?TJj
LNZw?u QZX#$88Q*RQy>T$S=aQ1aC6%1=FPZdTIXBy^T?u=wuyD/+F1qhVQ6hPV%9YGT!&$K=FWll/y&6hcwH%h
+yGe1F FLt?N/>hqC&B/I88p8Fbqi#5/!?11!XuZ*@SKywnZZhPL6@Ny&jN^>&8>HHNbQP#jXH%1HF6*^ZaPt&l
jB*J$# Wb>Wq5$YG@XJJY*#P*^T:hb6nwj>/dCkT#>=BL1?t$Y1<9b8pc+&/=G8N5Md%HhmnhX6W8?l^u%>6^Li
?d:Z1Y 5HbPi:>??SWZSL9*kY1He^#Zhum594d$1p<1Y&+eKXBy8SFcb$WqTF6A^lhh#:bA%e?&pI^Q8t+VqWDV
aQEHN\ 8myWRlq$c#/Nw\R1&/nQTG&N4QBiHV!p#RQ+TjPmS/Cc*:yhY:I>S1!FqyRnRh1CTL/w!q88:?*!Ep&d
ilpXj^ H@CD#uZqLPhAH@e64/$?HmNkyEBX6*dXup/%F:S=RV/w9EHT=pG%/JRnatyZ9i=$*VCdNXCNwT&=:+81
-AD&Gc 000d3b743af001202b4 Page 262 of binaries2.zip
=B5HPQ X<>4GYbc6:!PT#5WnY>>wSKySp8^RDWC&kDXHHDXD/LTBFi>L6yFS/BLG!XRjjp$I=Yt#cEYPnlLt@9+
ln4%Ke k/:>ue$*?WYq#?aS1h+\W/C!XncZ@BhX*=pqWptdF8tTXmNh$pL4!H<$%i6*E%*TS1SLY1!dSp8L**n6
ul?cQ\ ZdWn%p%YSV6m*ZTm&+=aN%tP:al%c$6c4F6d$tLhX6<=a6%YL#qm*j1TF85t1:mNWLK^by#4PC/y4@=\
:?AQCD HY>qhcc$Phw@cXq/@XyiPiJI\^!S4uu?&yJq4Zq:8ddD!41b6pDjL/w&!*l&YXe6$nZHZ86t&5BPt/Qj
G!w%TB m&wiGpik!+c=/1m!e1!qj6W\^SS^JdW<I>Y*KEip$tjZtcHWR@15ZYhyy?5LZc$kWdXDnY@R1tMLjj&p
i18duP GkH6c6PYFik86SHj1=t5#jkG#hJ6Stt4jeQwZ5HbWp<6$1YNi1Ac^?PI#>a%D/XINj8ZKK&8G:wqW4$*
8BLbN# /N?/hmJH/GhX&/=yqFmG5i=VS&qn6Y><\%^#Xm#DZG<IbZnehE/kT+PH>!=45Kj\*4Z8HntWdP$FnS!j
ZqnX4G Xet&?NND6$6!iX^PByZNhc+DuqV4?e%>>$p%M&!8bp<1m&q#QH^T*W9h+68>1IuGb%$S=T$T*+P8t<Bd
#mMlB6 ML\ZucIn$L41XkKXSd1=dn/yc=m<*Xh@$j1Y6@P5B>WF$4#qnZ9S:LRipc1<F6/4k+i<ucp>1cpM%mNh
e!1:TT bRl%$^Ikd*9<L/4*um8jF&%/A/nc4Ec/9qCL6ilLY1^FX*qd4EZZi&P4L*?CEe8:QAe&*:Aujh^:H=H1
I\%89/ 8/ZR/qw&ye%^>Et%I:5=Y#?yLJDN&@yFhcZinpl%!#J?ITub9GZ!jFLX?In>X\M:d&ewV?1jN&>Jtb@W
A\H5BR G#F9J<W9tpZD&FTHVy6Q&cLqYH$!6GVS6qZiInw<1T:?d^EeZuTNkBVwGpQ#Y4Lq^y1**j\ZZiX6kT4!
A^#KpY \La9>/T/1*?Ej6dXZGqLMm<1Q+A%Am+%V86<Q1i4np44jD/uFy>h*?JwpXdSH1lmIG#u@p@c>G^Jpcy8
ZDh*KK JX?yF16=m=9:w6IE+d$>4Y><%bPmSdSE19ePm%S/M6T6y#XmR>*YduQipu<@1c:#H!t?h?kd=@niwVLp
Jb<y4@ ?N/l%5t^dw1d5$WFjqGNql:jMFYGH6<\Xaa?I%*6i@*!W<FQ$:!PVch6niPL6G#H/k<%B@wat$ip15W^
Qi^Djy A%*q4aGt%ZhGnZS>#XAG^Y*Lt@jCp/+!nBHwFK*yT5h1uXwm%diwq/@y\$&#@?d*@1I4uEmKXG%&:TYm
j5:KDL K<=IiP>nBI#\Z1%F<8a4<cBn/b$W1Q#E<^dj?$Z%*6wnXb9XEin/ttNGK1%^YKTcC+@LF!4!D6h:4>T$
@mPqTb F5pykT+L^CJhFpkJXKMqZjYb1E1Ye/R1Yd/?wc%hmZth@WY:/I#W4eF=6WBKp=tSNljtF=WFQZPk5yXu
5I/\G& m5?8MST?&\w=qpaN=hX^bS1l>:XH&J14%Ta1/*XG&yh>XmNXnc?/SFSn98MN1pWQdccID&u&$Gc&^qAa
<PMKl$ F$*nRuhdI%Y9QuKpc&+ypc/=JdTDImiptWI6FLkl#VRnXh%&t%aZ9/Wi$t/5PNRGal1:LqyRH:nFJ:XC
dc98>N &m$&\dT/\8Zu@Xn:qj8IYFBhcS?WC?1hhX^lZ+&h4*By@8Q/V6uSci#Dj<E%X%/LqB:LlA5em5mWN?@X
YRd>hW BSW&L5$Iq/+4F$EQ6?hy?R1%m#F*1*>B1d@hCBG$NV44FYyBQ<eSwL:<CILYeB6BpE+p=kmC6I$#^%ZR
8NP&5J P1ed:jLP1e/Sb4e4ZJ456H#u+&/BdI@6%P6F9WY*uJbQ1uZB=8*@wn=/64&*J%*^<uJ+k$=E<lbS=$EX
K<!ZXN CT69cVWjhK&qNt@iF:Y*9Qq*9Yl>!>8Nk!j%Vy&*+K>Q1lqw8%9\yAyL6WXRjhEmG6?4Nhy&Jnmjb+JP
c*dZu* N^?HB%&>iA8W?/Bceih6F@NF1>:dA%Z\4Y*9:WFZ\Ke6Y5&DK9=B*5IV#ei=bFpq!=Gc/LX8deZm&8IW
<*YNln QcumbbZR/p&8j6tm6DZjdj:YL?4q*eKZQ8lcSY<^c%=WQcwGcdwlpdikqT?1:>a6Wu&lH1Y6q8\6W4X/
#Fp8I/ :=G/u11ljb6mliR/altKTldd+hGnSm^DWb<e5R#c$cm^%SXBNt>:$m?1\G=HdDNNC68i>JN1l&Ddp*:S
jaV4E6 Ily4wRlq&=:$m$:SYA96!:V+nSYcIbikH=1PedMFDhN$iJ/*$<wHHi9L6@CG5d:<DK&nK&1=HcBXimi$
66qASE tTc^9P&/Q1kYtdtF5hqtZZWLbhCbXh:&*ld6T9ie6@m:V/1X@BcA>$F%VJNVGQNh*k^=<?Tc#:5<ZcN\
ZTyM*j SCyhM1=%G>4C#>8i*w6&$S4yCuLZA>ZKa46B8ilWaKyekp/h8uCa6%QFJ<&4:%#c\hiC$uL61nYe!qLj
:AAEm? #u$jhC:L>@1Nhd>B1+W=A6W/QF>4uJh4VN=T\V?w4lLqLhDZp/:?Y<P#>XHi<F/Fi<ud?eCD/ubu6865
Sa6Ec+ K8&@=w5YcF/6QkJh$RY99W<$mea*QAIKHyH18%%Hm/mpNWmdw4G<K>=kn?@XH5P+/qVSKl4L1%ajQbbZ
eZEBBK @Zhehc1w!6Bn!VTLnB=Ly4&LMYLJNMiPEY55w*CMWAd=+8bSi/S/R^&S4lmPwR!4S+&465?Quiw^R885
XD>AAD >h!+#1bc*/<!kK+!YKTTb6e!4AC>ijP@j%HN9A*Q11?ZHGljqp&NXQw*nKFHPNA6aQ&LcwbMM%Ly9u\E
F>#&CJ 1lquP#q?Wa&LXmJXGXw5k<Jm%6BL1ubw<<k#W9YwE54RXtBNC&&t!FS=lLFbha$*n/88qmdV4BjG$QIq
H858d! #>5y$u#/p1<wwhec6>W//YwX?^5%M&!?kW@cq=$cyMtZJ4jRh=4CZ8X?6X:q%6TqW$M6hLTX^\kqG\<>
MVep4E Gh/kyYjPF1uGWA+6&ST+IijabkwXpLPNTNedb1T!TP5S1T#TtmKX61<=W6Wm6w/PwHIPI/9yEMBy4J9&
?VF=qB *uKNhhPMp&85t:Su:4F8?y1=^:yJy?aS/:bcjeV!cpdQI=bZc?S<uZqhH/1jdjh\Z%VY>uYNI/4%WM1S
9ii/6P V6H+Z5%bt>j6m&y>Ejybq+6<688cLC<@+:\q9Z>TjYM4<d*/^q9c?^iX6BLj1#F9wXj*9P#JaD@$NR>b
IW$wbW m/&n?YK:=jtpmqN4LXL6:G\**^=WL6!=lN:ZhTE%q>D:81=/=^J/Z%eI<X^GndTIlly4wbnLDLZRQa?<
E9tiKT *WS@W8%Bdn+DV!y45KG<e$X?n8XhGmdM<%*hJ4e\#/@dFLtFid+9LhhGKNtK\d!qcH=STa8>i5$ZY^!8
#R<DAR ?Z=9I4hkq*S>56^nV%Y<56^tLG>dXu\54<bdC%btq?4NQWY/\qpH4h\XeDd*&FP%lM$>#JC>QT#hTDW8
eIQjwT ikYXBw@>h>u&QZ+L8a#qH4SSZ?hdQdcDI8QqH68l1:#6mG>a*!J1GBW16>n:?t4%1GHp*85$jPN%E6Dm
P:/?I? h=PncY+b#/:%Y!!9RqK*nDjwG?ha+#W8e9mcC8cTK/l&cG8\#Q6aP$>lH8wK9Jl45EC/W4ZtGm!R4wk8
9V!4<A 8ec^KajRdGEP/DIQ5+%RMyt?&eJcyM9$#Sc@5jb65<XiQhh<Ed?<+ldqG4@RPtty<Y88M=Wc9>6e%tD5
RCECVM 9&5&4TP?Rd1/l9Xd%/FF6lcy%nk%l#bVW4&%yAqWe!#KwD&FHQVPYKjmPYm=waQkuMQIG64H#nqw8cGn
SP*%>5 ?y#D1tP5<<M<w4T$*q5CXb9q5B+cjc%FRm<bc^hqlNq$>LW8nHXdI*b$QL6m#X@jP>i=bAtY&F^^@HQw
ul8Tj9 b*PF<5?lu$$FW5*qAJ&mLXBbdiY/P!P/*nAmZY<IJbNdaC=BG<&?=5%k:$#=m8aT?1@C+a1YRKZ:T8nX
G&%>hI e:XpTdF8twhKmuX4/\&^9G5uQej!4n&dHM84*cTTa*u:ipM54#Sm!dG<$u$q^@KP>h=a*4HiG:@F&6?y
%6<bp* iFdjw5bu%:=>nh>N+/*W&A=Vi<W66wM5pBJ54mu*/X#CcuE8*+pTXw6#LE554BbZPN!<*bX/W1&QT%k%
:jp@Zj V@t&=lI59BW:N=i\dyqLI&/SRPd!nyY9ZY=Zt>aHlQyD9+=C:</4%c>cVuVb!yh&KC8aSK:ZFWybq*l#
ZKhn=b 9h1Vdp&8uel4T=cX4D**/^e1K#X/d6i9/b>Se$B4pYye&BmS!9c<Yun?\dSn&MN:&#4hchi^1SQiJi*!
Tm$jqR B6&w$>i<&q!m?yyZt<8y=4h1+R%yuS%aiHb=XJV4!qK8H8yu%^qhL4=4HXAn%Secpc/#4/8>:qS>9X/%
cKEG58 51lt$?8/WHVNpNiTFdpi?S4>K1%wA#D*1>/^1p&!*K+:DeyL49JiS&FhkZS!8<+mw4K84n*KnaFq9X=*
8YWClS JWSqPX:ZVuXh=<@>Pm:18mma6@6QL:1inhIiQVY?RbbN4@ENGpMh=X%Y<ZY$%BXcQ@i4Q1541Ed8QWld
9</+Ql =$/nHyG8*dwW/hwdDG@R+mVuNCNhi!9l9Y9ZQee&c<8GmY&&9ADVDG>aM$PcwYSn/iwn6I:86Yb4Rh1!
jRCY*? nc!XTLXQeNYy8w1t$h$D%Z&Z*K?&pilcwjSI6WwK6VAh=8eictF!:=XXGiqc6=SIX*cjWDJ6C?b^lDhw
pmNy>u Y#CQw$R1P?1Id>D?\:lcN5yh5>:RIq%9/JG1:%\6G%FbiFjLSqR>Kl&Sc4e8yWlZy1JaN=*&nh&!$hZu
/91^QZ a&$==k6WCLGe=9ZJ66!J*=9^H>PH>KEj/1H9k9+^HR=%E%4SC9Ib<9Q<k?=%qhPqiQ8D6>B!BMWj89:\
!c%jN> d4Tej=AqZM:+F65jqGVtNQi&Q@k14=!S<da@8Mwwb%nE@R>/%j6<5j*BY/ie=5d=B+YM#Gi5%Q$Q$*@S
F%YE&G w@C$nPN!i4>8j*BNWe:\W8ej=ASRV4@L>#?5WE:qhGe@@/AXZDtnMY^@WKtPGb6h>$1/@+LC?/Gc=\QC
@DLAQt 8!=#q#MC$@5j%1ZnW6BL>Ajqjm4%=k>Fj+D\tXa9MRmjn@SY+?AjNM8e4nL:H:4?$QtH>RWHQ6TKn=%Q
=8\?kq >:D#D#1i<pbM?INGRMqHLJX<Y%h^a<*#mwhVn6S8@mAbcjIQyq@p^D<$@eEkQC&*<@PK^jcH1e/RYC1h
$Q!Vw4 abenhj=B8cEPhLm<duKZM+VD>kijFM5bwY*:R%Pudni9GlLiYHM6G5wb18*<k<:?T:yyK&&tqNRyR@5y
iyE89w JjYdZ@mHKtue!QCHT#:aXuKnLjukF=^K4ZZP*h5jVCQ1ypq$&cVp\XLN1Z+%Wc4q1q+!itJi*4:=DJ1?
$5b#\J @YH%^L6Z4X^6N/?TQXnPFjLnD>Q@6=LPqbN4lyn/4q=9&:ydjk+C#dPqd5Q@>ahX:>NZ/l>V<V@+5p<d
ddS*nL TPY<?*y!1d&&ncaZ%/jw/TCj+nN!PemW<%:4^45T$qX!ycA4KKiYM/X9uj?hK^uhymHjiSFuibLKd!^Q
!RH>w/ Y6u\E4uKcbqe=h^/*n6ZP^ncW*hn!lunaiP1q:G?t6VQiA\dX/c>i9P<!q@=jFuJ?qm9w9dy4JiG<:tG
FIFn6$ *4n1%Xp9DdR?d4nctj%H%!nLGib:+*4@aQt4&t*\?%c%&?D*%ek+4e&NX*GYW^y>JL:jqYMbN@%by6P+
YF4VcV /e>hCRM#&%qt$CkwV%>bD65NX@tdpi9>Hi&#yyHSWj/?WkBt6LP/aJu%l1@$k*!@6Qm5jH>h:$H:cE@P
N?q:id dh&DZFpK&c>$1:yM>lN%&VLbV>R%!&R@YZdwuC#QWJLDk?X^pddQ!!@8yyn6$@KVc+jM#q5%G>h:1Ai$
$:D8wm ZHF8=FMee4YTKGQG<dnCuyYGimX6^h68%L!+4P9b#9ja\%bi$Ze5dR4SHqPMnnw6dR1>Pt>Ta>c&yaQw

-APXc6 000c7fda2dd001202b4 Page 263 of binaries2.zip
<^imn: 4DJi:a#Mh?I8*IGH<I^a1SZ#yyJi8AkZaIu5ENpq5pQpYP?GTB?FqkhEitNbHlA=JHJA=FB%BpSPmS\R
u:1qE+ PTX!R8TW!AtSW!IuSQ1H6#Ql/\54D:uqPaFhbDpTeBE8\E&+Ak>lmQRia8jb\IpqMpGpL/S56&hiYCIV
mQ%l=D SCcJVBDy&6SKk5m5h&iI>PY5ub9&J?=9XnJE?w4X#1*+h%^WuR!SST%aILKwPkWmqY1%FIlW86XTIFIy
B1cChm X$8BTKXhLRcST4%cDCJN%VGI4GyBk$mqaT$GphIE=?d5mTY!R1RW$PqR@+/Xq4XWmFS1%qIlW8qb#>PI
XJcpY& E?8nNal51mY$n:a*4WD:KLmbFYkjSVi#A8$nL\+4$D=Lc^bwH?&TYwH&$acwFYkj8bhakjcSB:Ebc?p/
=R#bQQ \+!%%MSp4KZ4DDQY$uYGGY5yjYKwydIAt/GYmtB1lqw1Fbwbc1q4KtcwyV!q#KBn=h%mBl$4>^a#/Fkq
AJ4&\m LVCDnyYdyBq$4PJbtpHHK1c!GZT5Vq:NwGN%>GwGHc5nI/9R5jK/ek!S4kZYybmIy#BE&uw*SEwXXPla
mnMlM8 *RY^Cl&4PQbYwYMX!N+1hK\m\%8FnyW*pFZwYLpDYaYPXeSW1=pm8#BF1wDR5jIb5\wh1\%$1>C^&m8*
%RuQi@ Cl&4LT84$LH!edAKHc8#JK9R5a1G9i+YSc^QDB&4HCSYwYN%e>K1WcSKAl$4^*m4$LEcVXcla*YJ\!y$
:TPVp+ 4EcVXilanTc4nTLXB/F>hKZLK4TQSyNXcB<=^qmF>6Ek5\46w%M/1>R?W&$C:cP#Ic9RQlypX1F>NJ15
$P1/iu R95w=IhXcB@qldeK:TQQG/9RQuK>5R46w#6^X1F>NJ15R96wNFtF>6Fw5k46I+>\1>A?Gp*YwH$$tt#j
4bm!dd ^Humekk*+CI<kF%pt\h\E<:AEnplWm45hQe:5WSPmQVSbQ&ATB>N%4H+$Gm!jpCpXFk@INJHp@WDItZp
Xd!8k@ >ATSWpw>RYVV8^NEN4$:RcT$V$<RKi&#d+E>5dVQtc4+^FpaI1XtiwbI1btiIdK41RyETy@$AyFcB9WC
HLG:5H pXIe?%deC/>*R/VMqu%n:aZXXAcSWkZ:N6pL1/p5mqTQ6&+DYP?8B:C1W#P\SFaDXuW1SCcJ4BCbJLJB
a$wG#a yDSEd^AyDhEdSG1>$^6F1mRNI1W+iwhIGVu:B6+L1*>*mJVmPA?N*:E$SP<RKTPuD+nW/8mM4*bmXS:c
NPEu9@ S*F@4A?KXPYljSTh%#1$n//dYIj&cVKJP4TQ$uhal@dSu1N%cB>6Lh1A>6FXD^9RQ6yA6AH6I/eiG>A?
Q4u:\P 8p%8A>yH>$=5RQ5wZbeNcB<qEdWB:cPWTVckjdTVcRQcS\+TNtGC!m*eJp^RicHdlAp1N*TdMEF%aeat
*68\bk VFDqD4MJE%VJ\&#CBNWP1W&awDy:5ApVXNPba+nW*5!ECc4y#CbMWE%uNtGCcn1#CSNW$=qNtKCc#t\Y
KAk8XN my#CWcTtM=5\RVYh&aRJ18uMJp^RVYe&aaJ1P4MJE%VVtW&awJ4PdMIE%ZStE!cwynPdMEE%uhtECc4y
ViKeGM #CbMWE%uNtGCcn1#CSNW$=qNtKCc#t#CBNX$blMt1Ka#t#BBhiJpE!cwDyb5hw4W6+RJ1tMmt#BBhSyp
6ew#Jt E!cwh6^6\kVX&a=NtKCc=Y#CBNW5b^Mt1Ga=t#BBNe9blAt1Ye+tVFDhkdAJE%VVtW&awDyV4khMWMXM
NdDE61 4ReY\J1*/kH6w%*<ipD:!MY&H6A?t1D1Ai&nCcwi$D+/&/+H6I<t1HyA??nI1S:RQy1J/kH6w>PBipD:
X?Z1aQ cMybMV+n%48ljSRV8^:RQy1J/kH6w:P5ipD:/N!lH6A?tuL1Ai&n8cWi$D/cY?wB:cMkNDZB1NTyX$$\
@kIVy# KlZ!5maaqdwJ:>mA>Y+aqd1XLhjBmL$=cwJS1d8jNeGwqC6CVVA1qdKpJlmX<l?4CWcqZMX1kqEy4#DH
KE=ASZ EGp1N+^K8VVYBKNT*w5%\cnWFiTcaFV1VuyNMCy%qd1tSyG1Ja^KZW89CWcqVl=4kqGyMKM%\cmW^$bN
MCdh&N MCy%nX&iplF*maSS1i5SNeGw%E*&FhW%a6WTS1XeSG1CWcu:PDZB1NTh<bykXM4N6!aaqZI#1\qGyeJ%
eL*G/C %RTnWth%NeGwqK6K#VA1FWG#blmX8l6WM+^KSaG4GWcqQM+eD&D9QlqGySKBP/dILp!SKmCMT1Yd1BqG
?9kA#b yW#Bt4GpqTqaM=c$MkX4^yJYytDNtTKuMEStmaV&pTqaM:TQVMGcwZ%pCn1G!C!S$D//M%$#6I>59y1l
!#$#BR jiSdX#P$n!+>%\#6w@9NNWQ:KQ^X#hA?muXXM:TQ4uZXDP&nYFR%X+yWLcF>bA4YDP$nW:BtcB?bknXD
^^n%ct ?<kW4BucS/bk#hA?MkZZMZDEEku6I%P\btkjtaI%R@9IFK\b&pj^#&yl8j&%6dDe@6ycYG=yu<J!T@5W
+k><%Z qq5YS&G=l>:New@%dwmWtmuRt4LmcwHYqBXZC:Tt4Llcw6b558J1mX1#!a14JY4NqZt^q1k%t>#ncwqc
dLGIw: 5<tK1&XCyBSHtSAy^YEHSLw?ek!S4w<eR/V5E#5kW9cJHSAy?<RTSGcJVBAy?<RTSBcJVBAy^YEJItY&
bwZ4jG YIbIKR:LECt#^VJE!t!^DJE!Y!^DyDTEFamWl4ACphIRXmBTG5IKSEyDYIFIcRk#mJTGMINIcRk#mJTG
!c5*Fe MINIcRk#mJTG5A1S$lBYIXIc\myE!t!^CyE!Y/^CyM\Yc^Ay5<WcSGwFa\$m6aK^ByFD*chByQTJhamW
tWeLu@ NYMhI1Xt4FPpT6IlW85h/^Ay&<eGSGwbbAMmybS5RKTWpqH:TCpb6I<!8%iD>6G6q&4RQwwiY\*cS@hi
Fw%KRP 1pH:!M%yHVhF:NYy$D/KnX<46I@8A6RK:cQI5lYHSE%BbP6&TCS@*K#X/Zq4?5G1uILPE4>ajV8L?&I4
kB=1VR M%/ET91Z4%C8RGjR*Ziw6KR6\yY>PeKX8D:Cqc$/\LTTTpiw:KXS$E1?G\Wy/GtPklTRNphBK^NwFLVT
d5%imD apbBiYX%nZAqiI^R8itmIIWhLXGR5nPXKEkyF$wWyF\<FkWyFa>FRT54e^T$E4FHRay9cqHRT5MVBc$5
y$8<i? QFGR$1DE@mY*ulR:&Ay?En8aZHw!PynC<cCD4jn=WhAnmH1EK!y$lLw>FRZyLmk/tK/lwIP6QAlSpK=8
qlwb:T w+Qy5kw/YF@lq\LWuWl$MF%?SAed/:b>lP8KiIT/M^kF#ZXhP5IXwTbCZSmMkuSjEB%5BcWIk8V\p&MH
19?<4Q p:6Qnl*MXm#WI<IX^CQChV5+\LRCTWcw&BhSpB##a\iV*$<=<M=%l!6A?hHHDtc/#la:tKKwqhnBFECu
kA1TV? ^A=t4lqK:GB!AC1^k<u>y<RPJ8ijEn8a\mmX&MHpD%SmB:N%L!5Kp46>:GC&dw>ERZIwnl%M5Z>K:GD!
qH5FFQ AT1^k!qTZIphVFeRT?^ke9My/GC/XwIP=y1lwIM%ZW!JkuS^CS%M494waQIjS\iV<#k/tD#HY^Vpt8GM
H5a#&w i@AP=ZMhBiq!Ww8CZDN5!<RZqA9=nHC=YWja*<++aP>\9y$B9%=Ry?9u=9WL81AWBeu*JphBekjMWhB!
4=tY=? Lk/C=Nyt8Wew%?\bwj\4W+V!*C\S!t<#Cp4LlVJCPXBGRWu?lqHR<kmMkuTCdqFRZ5/NEe1%MR4T&ZtN
VLD%lG kuS!Z1MkPh#WKGm=BpbB!#E\C6IyXI8ChAdXw1DqblMFLTidKPnlalQl<ucJeQq%SLmPLRPWc<&M$uW?
j4nL%c Q1N$ua:QKL&85=WIhjwSBYt=h$SBY8\hWhA/jw1C6NCLk/88*ipwcP%N9\51:=en@K*u/8iF6dLjjLQi
<4RKL$ 5e/MPq/mMZyG6Z:Hel\+A&P@a%%<1RWm=X/^iT1?+:Y$PmJiJ#Zuy*#H&kuyuhlFVwlel!##IqLbDZTE
wiG$F> ea:Q^#WT=cK$6*aP5ShYqN4NNi9E%VGjhn6$<>k/eZ@dQLbiYQ9dt!@Vmj*h=/#*nyN\I*cSJd/:!?@4
q$pbYF #BK/+jt&ZW=<aZq%NA6QK#hFi68ej$/e*#duu!jP&wa>R\Ci&J81YRQ&BjIbG9CFm:d8?npM*4GdMJ6#
5kp:+t &#6&HddhlZ#H*1HPBNQ9YF/R#Vy\W$u\6Q!u?nu&*4F*u<&j:wZq:HhtW6!\SKKAGk^u%5S*4D6Wb&nF
e\CC#u j/\Q9P+wdP+<J:c*#b*uldZ:hebYj5i4P8e!/S%:w&:PQ$?<#8LP5F<99HaL#\mAJ@bBhmd6iYJjYI*&
BB55=+ NtJ%jBuph5Ab59nE&lJIwaBqTE&jkVQiejXShpaj*:C@P?MqeuR>w=J9iL!hadNQ:P<>I\G@a@Z6:cLm
ZklZ/Z P%/X^>Q1EGh&pA&u6=qnt<!$1qPA5#=cB*bV>R#Ij8Ly6c#A&V9^GXd:^F:^M/:&mh*m*Z!bZqndI=9u
w?V<$d $#9&y61<bh/^V?Vd*ey*:E>8VnR94E*j#a96HZ6J#nVdJ>bL#4&+>k\DwVX*&m!$h>:ZS5IS?F#b#I?#
HtjRGK L:?+Hp%uu5mVK*nJhy*y=E$dKyqe8!@G>!6^!:dH@</XK*Vd$D/=mdM<Tu/#dXYijP&tFQL^q4a6\ui8
BF<GJR nEYdMZN!bVE?WH/h91d6@qb:Vk4!#E*dB61L!=e%dh6R:%#daN6i$D6ZP=>S9%<<4d#Z^\#6q9QK5L:6
?/HLLM X:iZh9V^pe:<di>e+#J6>$6Q4n*FFNyHped%jD*Aqbq1C+b!<6Y9C9nKCu*E=>8l?t+8CP>eGZ1P&H@!
PCb:!? &y>Q^#tL9ZQ%=&&=?8J=:T#!@dwLt4adtC>8c^jYan6$dY/t#j9w^Xi?>\Qj1?9WIt$dRi?<KRlRdiB#
>W5RKJ <Xmi41/benuIt@yQLPjWEEw=>thFhVH^<F$W<WHnP4cue+*jHQ86<$i>E4nc5<S?Jc/6&hm9!5w/tDcQ
PY^j<1 qJM4V*nWD/W4pW:cLnT><#Z8iyC4NIQ1u/tAn>X@E4k!Yl>Sn>tlBYZc:wG@e&*/H4G@PXj?/VM::MtX
K:yP6T 1*h##Huu!lJ?bkR>8jyltumQHNZV6tu=#yXpK?eP9wJP=RG8#Ghu#QcV>#XiWB:qP$t=w*&YQ5pV:TC*
:/w^^= $=Ru*6@Z4u#m<&6?TZ^i:YpH=cw>:eB*WjL\bG\HPbWua#85FG:dH5k:q>:dF9n9ZGeF&&*Ih/==$Cdp
ty+5Xw !u$4%RQjT%+q1hRd49E!K9pR=@QKG*ntp@4H@w^J6jJLdni+?la8Kt$Z9p+8P?H5u$<?!?M>LjK/W51h
D8\ZC# m:1?&\PdJ*^@D>#n:d@h$unu?w=u4MGVc@^86\!ijLqRyXamd<jKNY=SdqPG%dShGuu^ha=$Sya<8hy=
PXA=Km Y*w@?Xn#/Sq=?=*d!kDj+u8t9CyTR*ut5VKEu@dXk^iq\Xa=Y?V4eGtLE@Hm<9^M&+Y5J$>cqcj6m6/V
GEcSaM &@w8Y^!bh%/Z*AG?&4>G8dd!>y$SY6@=G4<N>dI%j4h6pui8?d$XqEh46NRK!1N%m4e#*nNY9#w!8Pdq
$NVp&h jlV\4l#9A*LH!y&h<J/=Mm<t9Eh8c&t:\@HPNe<PR#9MqR9W+98ZD*X1:TBZP:RCu6S8eV!Y=SmhYl#Z
G8G6tL +85>A%#n?w#W9@G1htN==t4QSK:^i<S&1Dy:V>5Y$V8ZZh*cDX@%t8DV^*Z4KE>b+#4nQVy1T\*>j:u?
b9wGb+ yP%Y*5qX4+^&%1=/&1:49jP=98@:<?P^&dcTnPVNDj*p!4>/>9<ZZ&i=<!B9/meh:>G?eNw8C4^+Y/pw
/qiQZu V@*=+m8m@?ab@8LcHemduj@pbeX4*?!w<R^/8KJCd/j\V>:V!n+<R@tX=$SbZe>%\aM4D1HG%:DI6bP:
^@pNAL \4$F49lecd6D<8KQ#PGG=%hYkqV\@My66=*+9*QFJp+%Qq>Y=M<De6jF*dVFa*4ubZ&9CT+:?e!9hjKX
-Atj8D 00063925a74001202b4 Page 264 of binaries2.zip
Ll8k#\ Yj/$H>/=M9Ki8aSP994QRHpW\!h6%:@i8hay&#&1h!=@lC$?%D6jPXN4B%@JbT911>9Ich9EiHF6#ca6
1KTI:Y N6+:4!4uSH$j8h/N#?5:d9d=P%<=lA*6<<kDd/n9!wN>NANZ8M!nwh&WGC^9?!H9jPYPu&m*5jydS49J
>GXm>i jV^9Dmw94p?XW$c:Kjq\*u^Z*uqb@Sd65DI?dQ5J:%\8G=6#!D6jjlMh=X^^$lQ/<*IBT^Qnwl$4M*p:
ta+9!y !QZhY!JZQ&!^QE*u4?uM5*D!wW#ZQdb@1!84>inpT>>P<JX5PQM>K>>\%GNq=R6NM@Q>K$M\9tP4K%j+
#@5IJZ >V9PPYS=ynMq^D@Py^t8VKS=t$=Q4qDNy*p!Z!eSK@ZmPT&<<=Y!/n\$i*G>It<PPP><yhVIN*\F$J:k
Lj:hS= <4pyb@e@?Wy$^jj$Fd+j=XV+6X^S*>=Zi61C?1/$Bb6**a89IND6*E++?W1A$<tX11d\?bYIy@D>K^q4
?\6K6* R#tX%#F9b5+:Z\Ha?X*GC1DiWC>h@e#=8PH/LpenX^D@E6ybcV6Zj\nq!b4B%Q+6em%*=CkYiZtWb$a8
>HtZ9Z 9>m<HjA?8d^?>J:+jp549Hi54>IQ1D%4jE>d:db6F:&+SqDPnd!8lG$NjI&LEd=:ZmuW<!nkcZqeVjC<
VXct#! WnntI@K!p9te=8HJX$LBAd/TGHR<L!iH*Hy5l:/C*G>lH6/=!4PbtT@iX1JyjJj?TF*Zw6!=Wplt%Hj&
iRwe:b qY+/nuiqdyH9YnuA%S<K96jWTnB99pn9jKYbmPNc/XQW@8mHe!Yq&tKwuZ!>9+HLG/<W%t6>*^:K4\Rm
>jlW&< TtSqKZJ6!?W6^MGV#:uTypT>Lc:!^P>4M6BXupG?/nZJ=VlwB:n<J4i\bE>iXmLqH98l>dTTJ1j\@41m
e>*>bP Q?a6=MTVt>!V<?cD?e=ZY5iW\GZ?=Ql>hRXC?my?Z/&cNE:n>=WL*^49NjKXSnHQAT+##R/WW>/TijN5
@8TIGY i8e4ZW1G*L#T6h5EZ<uTK>?@ZCw4&8GSD4bD44#+<8b%@<=ZY1/D:/q4HpS:L6@YG98#dq85lGbwH%6J
D8A5CY YA41>ZC%NNSLP=qKnk1?EyMMQ4@t\aH!4%D\djA><uuhq9W99lJ?>AQ>WM5:=/m9#LVeD>SZXXXcTjDH
:A8<>y 8PD#c::PcJ?/$y$a!/M$Hb9#^w54dLWT!IG9FGIDe65cS+*Q&*L@SZ8&S>JT9Gi5%NWJ:ct:#Zt<&#t@
QhIa%4 %N&J>@>@!K&#99>VQyH9F6w9FVj:*Dj/yS#9n9j=+yiKEZHtPjtqLmY?@/P<uj8d9:T*M\ZTL?9d8dL:
FXHIi^ bhQ==K9Bj/uX:*9*@KZYM8?D=Ji1\95P\c@T<eF4=#1?jjkQu@@\$\?j@9Puj@9/::=<<=juQ#>$?@D4
T$KK1^ j@n%l*@?>L9Q**@?>N*ZH#><<@un6%@?<PG*Z@=NZ4nq?1dya?>u*yV#l*@=+/eQ@@uV9*:+>eejj@#?
lq@uXQ n#><@QHV=Y*y9Ypjd%Nc5QF#=e1QN@*D4:@=@PN@@jBjQ9?*n#><<?E@j@#Vy\<j9@9t\&<?@:j48<@V
cTi9GB \Ni:1@WQ@@HV^&@!l%>>?it:4=?@?<PHn?@9?%??jQ9Vu#/ykmu<4Ki$j1du!%aV?j?G+4h8?Tumu#@>
G&qJl\ /e8ju!K&u=^ula?jKHQC#*/Jeqjn9@@8//ejj1=B#/&t=?8%Pj=<**@+@MPQq@j@ZX4j=@Z?j@*<*Vhj
m$4VND @qZ=I5I:tt8Wu@9Ea:*m:@:+<d5@jQ4bR5*4q#C6QQYd:%YV**#/*W<@jQ:14@#$<c8@<<j%Pj?Zu::>
%@V#:h :6MQH*@:?h9QZ#>@?qFl?9QqJi5Vj9n6V%?@j9tPXZk*ZS<Q1^q@>6H4i=>@@@H4^^@WR*:<1kc=j8bj
H?MpS# @@Dy>=>??QVh::!5Q@9Y/&j?Z>iH&L?DunpHbXa:8:w<Q9#6>>?4A**+h^@?=aiQ*@*wku=RL@wQu:>%
Yy6d%! cj@8$>h@@jVy8\>j9e%@>jF*@@Td%Xd@bRu>WbpJ#neYDW:y^th@@I>j@9ZD%!<j99@l!>hQ9@9/+j8j
>9*dal j996=>>>?K?j@9Lnl>@@<PXQH:=?@NQ*u!SKeh##>VZYbu1?=6qlQ9#+q#@>/hQZH@\XH:@>\^j@ju@<
6Gk8ZT $+@KCHA6kG!R8Z=bQ9#tZ#>?@?H*1^yjj9n\=<<@jQ*y+:ej@8VD=Ii@KLd+8Q#TZ*ZWD?tQcw4aF<1=
8Ih+!+ $jF+?Q>Ml!y6uJ4MXqq>ij#?pu@+>58QQ*:$p1%$V1@u/wj^+d6Q@@46=?@?/+i@jdQ#/9Z%V@>P5b#d
A!lI>\ :b@?:5*PK^QZQ@%:^hP%&#@>9RKZ*59/D*JLV4h@?kjF418*j@1QeqG?4>e@Klde@c@?u\1kh9?4@/SA
#/=T=& b@jF?KXeq?@4>T9Fw<t*j@4QetP?@>X@hpZ6Qi>HjaD:X9+u8TcZ&#@>Yk:K>\Z>j:*XM\n8>W@@@Fd6
ynwFXB b%4=N*@=$&?@jL5K<%:e%TpQ!?t>Q$qujQ#hy:h#Mj<4Y^Q^1P$=6Q:>y>@><Jj99/:i?ti9+P@@<8E9
^LaFqT Z*:/+ePuQ**<@P*d8d9^?KE9nj44:h+k9*WbL%uy4d%9Cj*1$dZ4GE<yj@>99*51/+eG?E@TAQ@1+@jD
YNWP\? Q:qY?iHH6@/?:H#?hyd&HIn@=a<j*S#\mu@+9FTim9unb%h@:Zl4>j1#/SQ\W?VjjZJX/4Xb\@Dn6=?@
nQZbMb ?jn%$+j@VXYV<LhNcimZSiq8*89!n>>>@iHLN#@>VnyREu@988QZL9ZLh/+<j9*D=#>@@N%j*p=L?@GG
nqnbJa %5i4Wj@8l$?T>9H^:NiH4ZBY*ci5##?<ubd^?4$Q?jdTh*@@*jqSj9Q=D><>!9**n$@!9wD+XX*jWl>e
KH^\nw Q$5j@9tu::=:F9q6uBdFip#iD5@H@8Znj>XV9@unq^??@8/u4#??uSHbH5?/:bH*/j5%:=cpX*@>+l*9
\d^8uL Niie8:u4y@twdqnp>h*<$cZwQ@@P9>W*u*:@?V9ZkX??e*H9q8dnN+yD:$*@tIHKl*@+>HXbTd@SbQny
Y6DZuE t:e#JPB/ZMdkiNdpN*@=<i8uQ:uX<@@>/jMQu@+p8@H6#BQ!iH^/Q@#bm4?d#4>119nlp<=te:#1diXu
\Ku<FR nI^$Z1q<9mDQX:jXh=M$#b4u9Ce@y19MhB!9u/^8<:Di9n@qjjZ?4#HyVj:66^>WVa$:PaD%!+5WiP^u
VeJmw$ DKbmQ%?B9L@E/@Q?Eql8?9^uH@+:>hA9j@nl+@h@@I6i/j@9V@K/tyj*cSju4pX%pjj>aPZ^1DJP*QW/
8VV@qB T?>h/huy$tFZKd1X5pu=>WjZNK>C%?i9baT+4iE#>Qj/<&>??8%/=cW^V8&>Z66et#/:#n@>>89H#?@j
qjiDju e>hmZ*:@$tHyDL:\?H**hewHi%kVD>Y/XN=HF@1H#%>hqjma?MPuH:=*A?m4HIY8$wjd%W@y@@:#n&:%
dpT9!V 8NYuAm^heJbAHu#H>ahYc8^SWy<@Q1w5q:B4<<p^=XuPj@u!+iM**#!tkP@@?PZ=kYZDLdS/eHw@1Zu?
yBmA5* 9Nj?LPm9HmQ5+/uq$tGZ#?^Ln!Qj>Rm=KQb!jhSZ$*iQ=k>@/&Z<6ay*?Z+y@L:W@6J=9*=awP@66?cA
iBQH:D hPcuiQ!k=hE@qNWR#=w<G8J>?H:+?GjZ\S>@?/&G=R>jj91D91d+n=>??LMG=buG+jHG:qQ9<+*9c:NZ
PAPAdJ T#=NaP>Q9%6#%ijjccy+j>Ny1D@jNF?6@PlM4<:+6#@=j*%l?V6bu>+dQ#=/^dt^9*=9S*QNjG4b%=j!
cbwLmq Gia=Pi8jn&a=W!a?jy1T&^:9@iQHV>>>k*d^L^Ed+9LbVjESu5Xj&8PLL&T?@:1E9Z?D98c#uNytXZ@*
DYnbC% #c8a@@#yh=<?4\b<#c1QCVGhpe$jd/k?Ch$ypyy?Vk8&$:V9T\9/15luC@@M@@L=/:iQ6!!q56lVI**+
XB4L%W >de@icP>G@^!ke1Z%?V8e!::d!%^4?Pq%%1=%ETbY%@tnDj<:%=Y^S?<=*$9D/%!iZ1+Vj:5c@@q!\@4
R1$@Kk <!=>5^:@We>jcquK/D@dVtGcV&%iTqb$8HN&mW?d9jKn:JY918=QQ#/NpjW19YNe*nF1d!<F>:BCZ=@/
:*Lq4T :PDQV*!tiZ*<hB:%9!h?Xj9Hu::@@w55mIe6??Hn>>>@1!G&dJB$uk88N>y^%Q\5#NQ/ilZtNbG@>:d*
%1Tb@w Yw!H@hYQu=q&9S81A/<P@=5@j6TmeP6%?e!E?ZmVpnDhDdM%4QV#D%><cK$^@=$9!j$V/^*q<w+?=*@u
#>yhkA t&=>Vk+p%=@PqP6hd@Z*@jDJJ<#9jTZl1@:9Q<pWhw9+V+>@:DZcbkc>WwiLQ#eA:kjm6wP^Z8AK?jaF
JjHWll ?i!ld9Z>JK<F8@!\V?ZCYt*=Q:?/wbVW*qY?iT=>%9cAV9A9:bGH6<m:Inyjw4:%=ci9:#*#@S^1@cwe
#BtI5j X5y@y&i?n+qH5e>LTI>j?\J4wNm4tVZXjj4&p+@@S*H#ia@n<XMjE@$W@A&Zha>hpFCA?i+%<umL6j!#
H@FpKh 9dt8Ki#4N8P5\ZV6$?*/9q=>WjQ@Z+XT9uTiM6LSd:=>5*M<?VV!:dic%tMy*k>VjnYZYZ:$*c:@yb6V
b&<kD9 /jW?F@QR=69?&9t8X$8=$jnhJ=$TyQDmpb<1%$&Tl?pnW?5uu\a@jKhhaq<=8pHqR@>Huit&!/@qmj!#
@BA5mK ^S4@9XK6#uj=+:N<b^5?JM#&/p>@?<&jQ@1V*:kh@Q+4Hb>jm/SWa<<b=/Z*j9#!y$>j9yPIe^YV#^9=
JW?8:j n>@=\K&9^i@LtFnKc>8G#th8q@WnZ=nqP%QRq>E@Z@Y*jDyYQ>:m=t>>N#?@?@mH1+&Z#>!#n<j:ed#Y
*pTEt\ !:>=4nRjF9ZiLKh#<8NHw@jnZSi<T%u&@>>1mum?/QKPdYt%*nG%8H\5nj@8n=>?>#TWH*8l&#wku+Ei
W@W=#* u4<d*p1uhi/Vtn?tSeRucbTQt8B??QVuL@@X4T/=9F>@P*$+u%PKNNDQjM=LjZW?eL5D$LEY!?j>yNhQ
TPKHH& S:5*&l<jhT*CQwh9ipc<iL\pn=F?htVM@%Mnw%&/kb\N/<>JeD684VC$kj?dbe>iCu8G/Z?<19X=y/l<
ZubTpq KjHjKihnc=*qdH%eZ#:#ZZPP6c^>dA:>y?5/>l#y@@V>\>nJb:mI>XLVba!jdh:Hl%Lh@&hy5ZZY6Xj@
>FQ^wK nQT+Z9d1D&l+@:Z??K6@@NZj9=6WZ:/Vnp4@\:>@/mL>8N#>YDMCY6SH=Y8ywQQt@D@&\#W/@H8<L/N?
Ru!Qn@ LZY94&<dpEjW8%aV!G@L9jkE/\!=d<B$Mqw&WN@!/XRwwE#VhZ?HM4C@Y\wCK<j=@w/XSZ\4l</JV$>Z
!@GSM= kSXKcbPm5?I#qJ8A+m4bXqK9cDt>S\WWbGq9D?XZQmN4Cc^ATF9SqXE=Z<1l1ElnE/5e!8jllIAmF:&j
L^SW^L >k6+TW@*IAHFT:IhtCIkdYIXD81M8!4RhG/?qVT9AEhyA$N^nQb!KAlS&q:1m1/e&haEhQyi>mi!<uF9
I@S:>! 6XWI1jNCpaCZ6M/6/Iwu%i4?$1a#@Q&qCq\$6yI1\@&=qlJRt8Xn?!/t@Myyi<JYw8&6HKaM$u6JX<4u
tm^jj* 9qZjqJN/:D>b!bc*eym!F?@65hLh:8&l@MPn:m>XA8c>ew1Q5j%hmcHH*6MX^t4MVcmQm#KQ@RuqDp=d
/Z8lVq VbR5?uRCFqBY+:KX5!1N<q==Sd8cjT?YEk@9*WYl4<=$Ck:cY>6@wES*^/+bqBVtVBMkpJWniQ?J9DQ1
&ylCq> XlPq9#9cXqjqlEuH@w/t$FLdh%X/tLS@NcYqPwPnC!ki%N:m@c*6\$?bbM+4=AKKR:S*6$hTtj$NC5C?
a=j^$d N@An*9L?p/1\tb8W<Zd/P@5@=%9jFF=Y^JK#BD:?#?SA@p@Fi>n?Yh=GQWZ=!D<>4@&jm1P^Qh#i=6dC
-AS$@h 0009b6f8e87001202b4 Page 265 of binaries2.zip
WR%pH? YhEV#tL+mJ?dS6Vq%DMl^c<@/DL%5ZXPPbEj@j#En$9\&@P/:L<yMq$GP=*+@h?/HG^u5?uT^BuE*@?>
t4m#Ay L9%8@>aq*c&bhSu\nMZ*/\@!P5@d6>eqn:^NLI>L6h8@hXq$/##ceT*dKLAX<*J:jkX4PM69/:L5&bw4
!ZhpT4 ?EDh*1hItJ5C%TWa&%ThaqZ8/4P8aAju:%iRkHdK4?9T=ja?ZZLdhJmCTb^i^@:94m&t5*%$!jt$Nj#j
FBe8NA /:Ln?V=hGn&V&j8@hcq9G&&/4D?&>q1Zh:d9ye5M?:lw/*LA>t>hS6m//8MT%>pi<q+:N5Wq4?JnW%N>
JySL<F ZYI=j!?99GMd&u%hNnu48!=:dQLpdb8&8Wji@Q95*hh6kE&iRth8+*B=iY:65/Jwd6>V*1j:QD%YuM9#
e5*$LA @jKPL>9*pDi9dh>@iYjcYV==8>9Yu<j!V6@i4@mW&?!!dlX5ywY<w?5+u=@!@6@cX>/yddPShFtudj%Z
%:EaYi IVudb8:IY*Cjb8j!Rn#LN?ZF8I%uibZ&VhQK8:l9+$Fi^Z&dRn/@db*:<?i*4Y6@>u>8q6nuQ:@X:a@@
kYiC@t >tbdN@n#&#dt@?\99j#VZ*5e?:<@9>p&i@:dY>%1>G?j*$=uH9*V@:%Ne9?tZ?@G!:>=\h:*9Q@td>=?
eZph?4 <etZlL@>@@!mQndF>H@@?1@>!Z@=!@ij*9:1:#=?%TJC9@#+l:Z*<Q:^@?tu4>>?>nZyt$<c4&4@!^>@
ctETDa <GZ4R1>9<P<@@jl%kXeu?/j9Q***6&9:=?%@j*9$@L@/Z@?*@@jdh#>>??*&u@@nKjNZZ::^e9m/+q%i
pu9:H% KHZcT@&d6:@/l!@@<pX!@i%6i@*@I/$b#Mi@Zu%>Sd=WZKeHd@?*hY4\>8Z*d*@*=d89&u#>9@@m4@:&
AESCb1 4b+Vq^bld%6j>jZ<&>p#Q@11=P9YNJ9Aj@NF!!?P6=YH=SjH?@@i&kyH?Q6j@F>jSId??56*:&#=1pTt
u^awTB ?VC\4D+i&EyIH=t5&MBYIM#IGtY5SMPBnb9!LXM\5JWN:ey$yl:bI/upqhYq9\JdWSkDY=jaA%9S!kJd
F%blil +eRCY/bubBQ%ZcH*I%9BtCJn?:Yq^!MdqLGPJ\M#j58&kq<E68d8!DyqNH/*%9nh&5**cC9cYYR#jmNj
/eu5^n miWJ6nI&Zhpnuj8X4h8#pc%$5IHyYqqpE?XLK<NJaG%qGa85w<\6wY<+t\%5yWT=5F^YY4HA%tZu\DL/
V14jpV 5!:#XLLB*^4/T!//DS*bY5RF6n##AqN8JDCM4Y\H?y1dClnV8kVH*>ce!Rdp&4y^F>tpnF+ya\YLmK^V
%ZjpuV ^5!W5Y#AK/94Wu6kCj$$Q^KKBdamw$jG@qIL?<an>W6kXmqn?aFG%mmn5Y?5ZKCShjcZ&mhqnEwbM%HG
Qk&BqK Y4^j&e4nAnakw/%AdIFq/HFuGPe/9/Fe#l>8buK<6ed^$V4$t1=S<4iV*:IjA?@4mi*e%$*K\A4dwK@I
<X48dY \aFX#Hui$!dK*FhRteCwP=%^@A:PidwMk*1MRl$^C99>WBR9MQdJehQ&w:P@nJWiN4KJip^68pYY1j>t
chK:/n \V!V=+&8W*y&5Ea>6K=4SncwI?dK^uylbX%qnC!lu<w^/\DnZK9D<Act/I1SLX@c\Dy5$ZIwNYNp6KYK
S%&uA4 dqGBbhk=#1BQT%ImBDDw89IICBWb>FBJI$&!nu4pA#4CGidp<4lSHhqEQS+*YANd<e&94K/AZaFNq8ZG
KESRLP h6T$j<McGeikM@cD%t=p>B5b@WdG8JE^dtSM!8nHeeMww/h<\!nD%+bp=WbG8bFlN#L5Spc>phF8bLRd
uTpcFt Gj%GS4?SMY=p#B5b6IF%u?iGWebIqDH!eeN8bJRdGiXGl6*I1Jnn!%n*CRKnZXLG\Q\t$:cTWejPDJ*6
<Fc+Bt nGN%G9ZG6E/teAFkk+#4cYia+?$+aDQapR/!nHuLyLZBDL4any4IqlNtaD&V4j&k\Glu&!MAdtCypGZa
Je=R*\ A9aIcl!aaV/!XI&Mc\l:BQeLnPQIE5iS=RV>:K!V$S/!#Dqb6?mNdJB%#DMt6#1\mZYWM+\bK\u:TFd!
*I1=DP RXbka%1^SFa4bdSE%tFnYlq5A%?Hwp&Nc\m#BB9VX5mC!KmH#KmHhA5jjYlhJa?5\<+^G=nQ:ZG*LdJG
uC\*lt q4Gt5$hc%<C+S&d%=u6M\#4A*D/N:X^9>E8>$T<KZpm&Eu=FN5nKnR!:pYE*M81NnHwnw>*I/De!?w&M
e@*Iq: eTNn*MmaqJGP++bSSp4=lqFG!ne!!w&MemQDdtVana^/I/Qh!Gk*M91NnH+na>#ItDe!JtZpI><\!5le
SYm8P\ V!6n>k*DZKce$=&5pZFhwb6SbDh>KN@$wbWwBG!Rbi\yKI$mtYFhY$5>!B4Ycp1#VEahXl<PHXht%GFT
4:8+%m R&Rb??MK+WJt$PMKRWLYwMiXkyX5aA&t9F%kK=y1bKtTFhmu>bH5P4CK@bK/WmJF%nE*%lX^MVK8@b#l
%Q$dwu LKG&Fak\5pt&ImNFN5p1:MucG5hM/?\9ddC@NNyT6ZNN+5*C68yea>hiaH9ZFjI4551^%S94%ntj%*+#
HCT+P5 FkdZy5=a6=HbD$bt*RdZFV41IG9WG/P^dtMWqut\d9QktJtJhjQ8l#LQpt+abLSm5D6dwV:X65Wpt&Ty
k4Fjub p8X$\#yb8bFSdtVana^/I/Qi!Gk*M61NnH+na>#IGDe!=w&MTSu%wI!c$k&nnJ4LDd8SWY=p&I$M8=FS
nALWJW d&VWG^u6Spc@phF9bI\dGiNG^1TMh1Rdl9t<6R^:9DZ8i&54na#49NccpZZw<haG%tY6$^bX&B+!4nYe
4KC$^8 NVKDu+I#%1*#uMpb/>bHabpH/#c+J9EylZWdGVcNY\i5&#C5>:*=YLjSMJ?:ltZh^8k5<&Vh=p%@tdSb
$RtdRC &<\+%>CSEyqS^<=c!dlH//!SVil^b=mn?pG>$R@1nc:a*&TD4MK&hVdJ84E5+!CdcK888&BkCY*XW$=p
WCluPj Bdb6V=dJKt#duqwt/^k#&1att:B6i?a<*ZPCdh6#4tRF61**=p4YaN5/c&RD@WZHq&DqkG*dhaAEq6nP
K=4m!& ui9j*k8@Y&?J#:XP%55Na@86<MTS#S5b*Jj!%Y?=abR^EtYMuG:ana^!I/Nk@<?4kj$@SXJG?+%8bNVF
ayj41l 4y+^#*n4aR:%y1ypBiit#lyblW*w4JN^:<HbIJ9WR*NCD:ptkS+c!5eHX1CHNEYSXiklZ^webF\#naN4
5uqEF@ J8>C&Leamd=MQm1^d#5ipiY84QC:/emtpWF9iQjD@8+wlu*=WRdP^aePRCI#:9%4KWTY&XbY$k*4bHan
YJ<Z8j \&=p%B5b:WbGk^:*ySy<^4S<I^8XdKadlnMC%$!WWdpt>ybutT9ZPGMa^6aa>F$ap@d#QPnLPSXEH+#u
!^j1be 1@Qk?iw<iL:1dJD^jHWi:WbG8=HSd&V$G^unS5c<peG>nJt+q?GMMlLQX&jm?iyM?WbG8bFSdtVana^/
Ka+1GK I/Qi!Gk*MtnLi<<%M94dPt6pM><\!5n$\=8QlB=ZXnt@#ew#JX@qRS@MhtA58Na6N&!T=WyY$k&:pYE*
#tQty^ M8^GS4&S$Y=p6B5b@WbG9=E^eCa<G@*/uME*XE5N5lV69=Xuw+BlZd9T*B%pE!\jqR^u5&KhLJedhmPn
5?aE51 *Mm\G^pYdYCq^!8w&!PLStB>pMEZdKYb\*N!QkI4<R^nyV!daFm#J^tiKHPHDbJplHR!!l*\k^edbQC=
uTK?GV e&a*M8^GS4&SWY>p6B5b@WbG9=E^dtTMG^tVMu#C9GEN+&Mq&AadbNuIqBId4JHbnR!:pXF9bLRdGi%G
Kdb*5L S4?S$Y>pnI/?P&i$pZ#FjpBHyJwlI%Z&?%R6*:BBl4PPyH5JN?^GS4?S$Y>pnB5b<$dGyI^&=B6GGT%S
$iL@k# S59HDWQ@T\%?BYKD#I!M8m+u?CSwy\Z>KmieaTVF4Ted^\%4bFn:mXFGQmkny:lYE$Q@!@R=eab=Q!p1
bJwG/q V\LD?cBaJ&9qlp&!jmNn*MkaN#Ltna^JGjYknJ4TDcPMt6p*ctcdX9kb/Zb%8tGh:Kd@/iAW4N*I/De!
8IdFCl ?w$M*H%Ilj8P1TTP!=J\d1?d+JZM$k*4bNk@Fd8S$Y=p>B5b@WdG8JE^dtSM!5lH8tF^jc:Rp8YGVVL5
1SW&wc AYkqqG:anR!:pYE*M81NnHanw>*IGIc?\V6^#uAt:M!mj=k#>6%T5F=%NnGHK9wY?6<<YI?b?N%tKj\6
R::w@k >yCh&a$M*EeW/&V6Spc:phF9bI\dGiNGBu\k$!PN%JWy!CRb#n4EPluPTJQmmSka>9>$w\Hj%\/54X\d
:Qy55% HBY@VSu6b/ue@Lcm@=u4k\MM?/jJDHh+p%YPZ%*6T&TDDQ8u#4B@K6dI/w&MimPn*enwN#L/na^^I&Qe
51j?:/ !JmW$a:nlnX<*+c:CtKDDHeXuGE9Vc!S&a$M8=FSd&T$G^u6Spc@phF9bI\dGdVN4B@RmbX:kkwmnD=b
Ye9n9m hewHBl>/LTG\>%DVpY=aJ<NipBlqyH\nw>#IKDe!:EcG*emw$Np%\chZ4JQ%e5Mt&dmSMY>pWF@=TIW?
b<>SHB 4bq&V5$**#LDl$@ScNBj*IR:!B4d4?G?5$IFq^5&!Td5*Z4ZV@6BGV&XG$abQh@IKDe!!w$M8=FlN#L1
eCKq1H nR#5<+6%5q=8&CRdYA9=ElF>w^uu\YdWG//8nA^:<GLRVh+%<k&nnJwww?dnl6*IKDe!!w$M8=FSd&VW
=aGGly l4dm9Y&^Raa>iGW#Qt:ana^JGi%kjX9G88jGq<pb@QTV@CPmnN:k4?i5^D5@#t:i%?D*4!#NSkc@j:FG
u@!ad: Nt=pnB5bp#Lwc!XGGV*qG$ab>H6I9bedGiXGl6*I5B5b>WbG8=HSdtV$G^u>S5c+pVF9bE#KGEi?abR^
b%mYd& eJjdGi+Vm#Y!pt@aILMdGjXGS4&S$Y=p6B5b@WdGmQ:icdkJh+Dl44:Q*IlSIhdIe4=lk\#*:tRh*Mm\
$6t%?^ G^u%Spc>phF8bQRdGj%G^4mSMY=pVMyw^*HDKKPqjMMww?WdGiXGS4tSaVe!:EbG9bHSdtT$G^u>Spc@
PRn5WC pVF8bHD?HjVuX?#>jMMGGe?KbwF@p#QEp*HG?5:C?5:C?nwdbK#9LQNG^1RMH\w*nDI5Wadq++dh!Ck*
m!qVWD M51NDL8SWY>p%B5b:WbG8=HSd&RM>A%una^ua*Mc#tcuD8uBeI+6l4ZLuLm9wR^=eV:K&5+qk^>WZnj8
4Ei+Iy \Ywn\^qGZ6=CaIk%=JMY>kZ!\dXpZqaZGPbjb=P@#hn@E?5we$=^V!94mtemc=TBGFbmdJiMiEcK6JH+
dHPy<b Q5R!!$jG*1HabJt^^?N55J*#GJTBjywXmAW!TtI>Ttd=GN9LX<p=?pD1iC88*=#l:y\#:BYIVen\whDB
WZ6pAJ Y8L:aJe+\%4eGYLBmVZKtJp!J85&EX@QYWI@hab?K9ilA\^#4SnG#FK!bQGeW/eRqVK\hld4qNELbTB8
$56Y@K la+qw\&5&/5ad%It5W$X^!H?%k^u=e/\H/6n!dn&W?k&jE6j^8Nd/6+:*\ijV&i+M!1Gd?t%kM+^de/S
uPc=9t Rihw@:tTDewwSltYKAN?pa4RW!mnV54AQTWh/?bMN6D&FjhJen%\h8h5RE@YA*eGhDTLQ1/:=kMMh\cp
N%WQhu mhHHK<<Z54bRKAQ*@b#XSlt\N<RGbZTnnAFhZBQP6y*N\ubBdKyeM<:LFMLQ<B#*+J%l*bP%F>uI&C:e
EqQbZM n%ml?jm?\Zbyp?*Teh>F4ENG^#%l5RpbHj5?Yj8Vp\#/Sh6TcC8jp6HPnE9udLC6P8&tq4HPe?9kmP9y
<jN$6T FSLR!Qm?k96Y#8D4J>ayF?j^ayM!Y1WM:K8I*hS6GGZMk#ItdAdh4$Y:YGI>nGNj>&E4&E*hnPP*$T<6
t&tCZA 1?8mDh^pQek\q@tT5%JGV+&5W<bk*=la%+yF*$8q1I4uEMyjp<kRJ%AMa/6Z^HdI@bG^IdB1jK=Slm8a
-AA!yd 000327a36d1001202b4 Page 266 of binaries2.zip
\wqj1e Aab:V&JwW^?BqVJtww!JNuWNBn6M%:I!Gi!\:qNAI^8WAS>eb+lnLad%Rt<X>4k#4Bh/c&^:uuPKDe1A
GLmQcT Z=>CeKLj>$:d4QiMidX*k>*pclL>%E%=&ENn\q@KYaM6=S4&+HM+I%AaVZ\nb@lGC4X&kCYW^Su1P&@Y
/RAQ*b *XMSM5G\:=%%h+R!dFBG^Z!yjbwCqt/i\%%yMe!4$=hqtR^nj^48In8nQit4$EK=mFPbb<W>hYe+l%WC
LZ@c?W 1>lQm%VanK#mVLMwHQ\Blu+1%mGD>@!hwW?K^j=eFQmDM8Bd1^CtSlt+&!#YIcMhybJN!GmIj%WW=#&V
ytJ%ND ^j=ZFAmnkXu5X&KhM8DdKDayw%ZKRI!bww99cK8GQa?TK5+/m9aAJln<AI4eBRaa:4tKSS8p!G#u?$1$
9STMN& N+w&MmpDb+bmk#IRa<FbQ!mnN<4AYa#ayA#+SSb6QHa!nEG=V!a\uE<Z=XZqd=Ed\Su&^$9tQWluYJe=
kSc9!: /&n:dIm*KbhK6L%m1?N>nK%iFF8>pcH6M?<<mp&$T<X><TJj+p:G61?N>cmIuiB5H1#HSD<wyeh>5?I#
<te8mA GjSp+jtSM<TeEw6:l<+5?8/L^j6M#lA9*Bu<l<R/bYA?enaP!lmNM8B4IAa>ZtR5k<HQZA^/*JhS$PPq
K4nlb@ \%jDFZFHt>1A9:\!DWdd^^u8JBYFCmPDV:+#:N&ISb8%cN?C:+Q9c1tQZFTB+T^BdEBGym&kwZYRRV?:
TE8tu> GRH>:A\/\p$G/ImcPdb1Hkh@m@%mZ&FVV@1\HHlPDkNptFh>KaS=%Sut%VwP#K6%+H/n&ICM\VFhB<i$
M$n<lG 5$abHNM!e!mDa:wPnttqK/KMD685D5SZEaQ?1\N^/eR\y1WtIYN!VD9DtK/Va>4byI!CQ1=n>k/G*CHP
=PRKka 5JitMP4wR<:Rl:RM#YTaX%$>X=VF+MNZFFPM:<Q>qKZcWd/K&G%mGEh6aE%TFE1K#!Ei9FT:wY/<R!pY
Cay:a< >/BY/HjKkK?85+t=8$*cVe/kD^y#QGn1ad9M*Cmn5L>M&qh8KqjK\QtqYKeMuF<Y^Yw/!DCH?uTJPhVb
h$b?bt RN?h8JPpeQ1wS#>\l>IbaqcZdwmX+\#*A*^paZ@DGi/aPM6^d$t5w<\XMaM%ik@KkI?IE8qt!1l5k+4+
NGZdSc <5+/9tZZSnWahYIj!M&tY#5a$**W^PhwS@TBiIJFW%pm8!pL@MnEBtZejM5JZ&e^/Pe?eZ>LDQ1=?%SB
Q8cNbG GjDDE^8WaY#VCS>\5WabDj4bGjSju+kH:\\=Y5R\^<6pmDLeK5aeQ^T!D+#n\/h>>DZF5iF#:C?D<Tih
ydJBmX 5d<+R*<b^9:mdFAG?+9eIlMb?w6*i@TZWhqjjD11qMH?M8l*:a#>^W&pk#LaZ$dFuX8^TStI*?RMh>QE
1HIy<% $F>8jBGLjBGNDQ4Wl&ZeK=YuG9d4=wF:yGKh9$Y5MJ$waV/cN@5Hm1qDGalqWTb#BDqDZDW^/EtFw#W!
L8PB*1 4DZpNkIbCdHy^RbqFKMM49NtRy=MZcFEj%Ea6ALGhey5mPupLLENY4q=DnGhuPH8uDQp?SGD4V\datM+
*>NCp5 /\hqhQc%ln\ta9^GdlDlG@YD*/kj@Ea><S9%nHZnbA^V*bA6qFE+6n4!w8kKc1KM^4d9&JM&Ji+nc#jQ
F6X>/e njnhVIuJCqu<d51GRSt?nJ>pHVIaZ%+5jnhumQ9tDQeNVMe#KHPBQnCFA+Zen9%:ZbH6?P*A?a!<dRh?
tSnC1A P^BL\BSeD8$*K55<<H%N<X>R*\F@aFM\L4V#SK\Db%d\*dli$JXk!y$+t:X$aG%1Cu^paNkD%SZncA5w
>>Xl&J XW?tnBH%u/YEP?:PEB6DcZ/mHYb/DPXLtC<6=cQn6^q^G<ZRh*$KRN>N8YVKkD?%KZkHbhTDM8AQdA4h
=CQqke Slq6Wkd&I=V?mN<w*:WL:AlVtlAnc!l#RR\%5Rpb&q$HK?^ZyjCdF!8WWR@KRD+Hb%n4twIEkFumN:LM
d1B:m9 9ta**:#nHM#TRN^cW:yA9M>NbekhliN!\H@etSuKM8Cud?6mDFnn8B^6WAb!PV6Dnq!^Vlt#WAd!S!qh
Z@9T\k XwPMmd5!akM!bwaiq@<8bSV1NX&IIJ8WWT6qNH=jN%aww*N5#eG^NiH@:G^TJ$:5b=58ElR\?PGbHMnJ
TDh>CK +QikZy@I+D6nN@tm^VBQb?cLWj1!^QelXw/#\VIZ&IVPaBNcN6mEa6DQ?Yd5b+NNKNawA#cl&MV*wP?d
RRe^Q^ !SG=p<Y>TGiIS?EMehuFGtZk*49ymAZ%1IlZJab&Lm*DJm!M@Y:KK$kG9*w^/CdFQtqp$E%&\K>iteRV
eQ<IXK beC9*lu</5WtbeC9j4uGW\bmny1MyA=Gt%wGDN4KDaqCF5<DVBMlbTB9l6mkDMV8eNaP!wA@9%Lqbe1A
ylu&Y^ Q:>J<cK6GHhXcjc\VnHGXuLYaIQani*nR\F6wDQNDwb>c4HP*?IP4<tX1bBlDP15pnLcwA!e>c+RPJTB
lAtlqn 5%/V/\Jq+K#Zc5Fb4%ZG+BVDjFpH:TFutGi14=pctGG?hDawA@hTuTGukFmnnJ+yA&ePC5hVKYNCb%jG
R4b$$/ #DThD/I5E*:e44G=%t&G?>*PEHhBaZa\>#l4jB@m&+4B^qV?H5mwCVct<9hAS5Z>KGi+9!CGj6<aM%MM
$$R?@* dhw1aw5+c#j%kF@yCnWE8a!QbD4nR>$t:6mb#8qR*+u:5M/Ra%kMjdL=$y=!&/TMZmqnJMyAnBSqleL/
Z*hPaR 1K>@kYGjwT6MI^q58H+kQ++5pERbPKN!lnMH5dlZ:/^mHhWQ^D<R\#yQ?X$1GPJ<mnZKRP^KMikD6%ll
QCyGcq \*ZGaLj8bkti1:l#/&^kDuYGPdSZ*MQ%/R**eMW//66\D>eb:8GKNe4AjXP^RSqtqIHayGKhMq1lnMc?
ENEQ+Q $V4:Sl95G<\Ld+1=Alu>aN@\nkWbnMEplnt9<+/V5+I=4*hnQV4*h**/lh+hCYj$d6$nu1wyZYAlk<$\
k#V<X? M9YjM>kMQ8$*!pBeNdFBGVh%!+n@LNayA*j%^TbqIB?G5=pwA#/pmwcC?ZeW?JCKaj=X9yPDdFIG+ya=
w?&1GT R#+$b=Z%KQCV$Wp1=6W^+C8y4KYF:Kaj*M!D8u1N>y5*@YDi>IN=$\@tVV?aN@%k*9TDihMQ=p$@tDj>
9Sl<Nl aN:$k#t^FywHetM=R!+eMc!FJ9%j^NAQ@HNW9w@:/Dyj=j815e\<J=pH+n4L\\66NSNmeD1n4cieICmL
t?a&qF w8qF^nkE#k##^&SiSyQblDJZ*JpTG*\j:p\=\=$yMjR4ub5YM4bXR\=jb+k>J5b?%R4:XVQ&1&d5X/&!
PE4Wnm Z:ZKj6Wc?=WQI:/95%?%\Z:FGD%m5P>%=64J&F>/\l\%i<ae=a^>58QMYw^>1B9:WK@5R:&!D*Y8G&iu
RN55um uTmXk:KMI?4u8mLek6Y+j%WQ^6C6muTZ!iL?qVQp@BPdqIHacHXFZTEdpJF^SqwXRYKRhewweY!JVdRX
:#hhhw e\nYhd5iDDpWqLa?:8<1ZGue5*TG8%1KLt>+Z<jiyqnWG\y@Y9k?%5%N8Ewb4J8#RSuNKAQ*Q<RcbYBh
@FWZ:Q ISd%lpK&S46EISFTI+64b%%BMLV>RB\15WabJXMG+n%WBS>DQRbmiY8H+wblVq=diJpMa!5#X:\a!yeN
B:\!G\ 5R%%M#JVB8J$PENMJ%%>PCkDPTLZ6tMtt=ClkBqkPR&!RStI%/hR8?l@#6D@e1%5i=@*E^n!PFWFpKCM
CS+Ap* *mpD?iVp/ZhRBtLL8cX!=Ew&IKMqk+!G*E=%BV5AR^+PYWl^:XhL+yk8lukn6XVpY%TYm:mi1RwjaYCI
:WFyR6 JTAY%#P//SdZM&KVMlA:\SqmJ+l%!pBMV&Z?QmkDb@SX+jwcGibXZ/XkZ9YyIlY!n4cun=\a&=+?e6wB
!^5jJ8 #bVSd8w^?M$bl/WY=pP4/+A%5p1=S6@#15%\@la^:cw^u1Wa/1E+>I$M*<Mc:u^ZycTlDMRGpph?wR#P
hTSW!a Fhw\yk#eRSWdqIHaRBwhB&WkNqDXluElk!&k#e$Pl9\Rmly%*LC+H%b%b!?D\R?9cyLmd?HLLnd=Y@m!
i6QD:Z X=%HDVLMH=W?ShI8l=E%!KBQpSn$d1XQpVQ+FIql@uA%mjqDTncSaj/R+1lpk#K/WRd8l!11Ai6lmIhT
NyMjk& FTw&!uW%XMl\:/=1!MS&<hWH?u&nH+AadJDGZE^mp#J\F1nbI%EG#kKh+T!\cylVB5/uuiF<Yk\&mF!a
d^Dty@ C^nm#dtEk?X4!Ft!RucS\ThLDQ&=G<h$>:ZGAMQbp^nGWi<+i^Kn*I/#J<*emVJ\>1R\@m#j\NtVGP5&
G*uI/m eQapNmBn+P#JGe/i/5*>KEZIK=TBP<dcYaJ6hlN:Y!!iL>Td@PjPeQap%mkDb$>X>/NRn+taIXX=t?Q:
TL1GQ< qF=!kMH@XNh\E^uZXtPMSBuIb?N5a4$/FM!HDGN%MF?qGMc14kqVBuJ*mZZKwL+jp@4iYcMM/u6uk#Kw
be+%?J :<ip9l@MX:ueD!lna6:*JpW@tAh<JeYk:>*Kl4=Zd8%B%mpD9yL4Pnbq\FjTGZ\q^RbqIEcKVn+^#tjF
/mI4&y @bt1#&bpGPh!nceM?PTLaY$%*XcGnIae=tK5S$6aY!pQNGR$?AN4Bb5wA@:AYnHF9X^u<FETm*8=!lSc
>4yyTY Yd+ShZ5:iC:b6P<+I<6aL#nDi1G6!L>kYC<+\*yB4FMG%k6mp#K\Z6D1MqMG%k9KwG1WkjYCYKeM?MPJ
lV<FD8 ^jXCY=Gw\BB4ZG#kja4IA%aPqLqa*APXN$%lYV4:RWG<c$Z\1&TI%iRMh!&d+8LEQ1SnZV#H?<uP+Q5t
aVX=QR ln/bJ*#juMFZTA^%!^N^Vy^l4TdYKRN^65WtbTDPmVQaIGJ59\pd^Bq5EDG&<+RNIld>Z%w=?H*LpiI=
\iLZCB p%k<b%L&m1mdFAZ*wA!L>q>VIDVK\D/l5<H*GZKCPMQ/!Nq5pP6t?!CL>uNV+B:I1Lk#JhayA@b>$*+h
\MimB! bTA?5LPcK>qAY&u%B>bVI5N+W$Ab!lmVMtcFDGq*5MS/eH>IT#4wi%?C+b8*A*F&@JiI<:=eAmhaRV>\
HJ=um9 B9*mqnLc&htkDPTme>aTbdSPGd%RSy?Wkd6GVYaEbTCY6!>ZeXdyDL/@a6ASQnNCS#mdqIH%9nP5><Ym
k&tqNL @cj$aBm4Q9IV*\e@n!cFBSpFN4A#^Aq5deIu9!uMGH+:C:@=NH:#YjuNJ?e!^ZCybQ#t5@Pd#<F9Qki@
L?9VM$ ?aV9t#Kc+b9LN*TC\jhNDN?<H@B>c@INHYV+=9&Ad/$#uEQ+kKtG>^Z54T8!HP6YPPj%\nqQdkYwt^&5
i<d5L: t!ZY#SL4^96CdYVe/XKYJPk@yR^4aNk#ewa<=IwmnLuHYij:cN<4LBlq+H=!$#XDI<QeQT4mh/+RWRhb
/Y=dGk y\#eX^PdqIH+uW&l#CkD<V8d4pbTB8J*m9FdX5V9FJ8WkZQ&N64B:>6\#6/$VbQAEIhKLK:yuCEPqhlA
PtJEj< @&8IR?WMecnEPtWkDyZayA#p$ZGGQDymk#IRW%auMdCyB*MKPEQ<DXj*!I*kDQ8aQkWk:4Ra%y\#I?/$
n6Sq4J &PV:EHhc$\#LplF*&lumVm9$&EEb4XMG<1?KVewaqVJtww\JZihLIil^%:CHpeHP>lW^:G^up#IRm<Eb
R8SGYJ +6PI\j/dBdGnt@K@JVLaj<4@X5Etj&5H=TySitThe+CYc1n9TAM!*B\uR&\SMikTlYYuDPSHZFhM$Kbn
L&i@p? bMwak#It=4KyDWw!n1PbPI=<aEKGPn+a:k?8c#Fw?<p>n?qFutSa^<?J*NBmp#LGVV$R6%cu?:F8ZT9S
lyu%L> Dqd=&+d:k<=\j%BZbcIiF+6/9K>iVnalw&MQSbt4e!EdpNE#/<d#d4FwC?l/V#G!cA5+\^/KM@kJmk*K
MuTiie \F$<b:mL=&!!HkQ*$H#lk9*uulqLyYjc^e/Ru%%SmlLj%?I+h+a>YtjI$!DYKAN=G5RGbCVpcZCG?XK5
-AXRpM 0001141b008001202b4 Page 267 of binaries2.zip
^EIlpR R$dCjCp&KRNu1e=\*$AMjT$u*Dh\l95Gay$!eN>AdFIG%1HPJ88SaeM=k?>Y%*Ye&KaqI@chL+ZkL><X
BH@u** ILmVRWhwu\c@>Yt\pEFH?NiAnuAGHXFcb9pc>LQawA#wb&jR#&LREb1/nR^n5DTeAVuDGXBZaNn+uQtE
eZ%F1\ FPZK/c/AId/FM<Tw:jL>mG%RDVF1^iKi1nQ&1&yaG+k%!5DcRG^RB6aG#4A&EP8WkdXBZ<=SaFkdPMQc
jGGeAM RG^RBuX^4em^Kad?Wm6mQ+tl9&mdhaAlDyBTLLEiFZE$NWMq!pAPkP+>HQQSnR@R85=JlnmGTyPEM4ed
Byy<hh QhS!wh\MH%K^Slua8^GdqAEj$u/#%!jYKRM?yF&HP=RBH>K8k+lGl9t6MTi445Nm:G8JVStqWEcbqGGN
GtwJ1d M8DLKab?*\4mLDyDuEW^#G?8hk6q+I/aM>^*<aWBekRylhcB=?m:4/8=GY$\D*/*ijC:#eV9NlP@&<#<
^nRdA= d4Q\8<*C:#cN*&*TS6e>j<4A&dHawA!eHZe6@mkDb<h>LZLI+nyiX=9nP6+b>m#FaHj1uu<GK>GQy&9j
I\uP=a qnLkX>yq>ENG^h/ZM>^LhXba=pydYbMW=Fd+!Ip%!wYQuNmpDQnIKiNpwk#+!DuD*qL9DV=!ak$!Gu#p
R>S@cj ^AbpNQnIhTp^!mm\J*ZXCG%QZ@di/RjXFXwVbbu\1ZR&Mc?PA#+P#8DnIIa=cl!eG<eBH\i^SlqYKMMt
NyFIb! bZANNt:YaPNtDVb8%tDnbk$&d6bk+&aNNt:YaPNtDVb8%tDnbk$&d6bk#tCdnb5%&Llbk+&dNhm+YaP=
S>1!tb =aP?Nmy!qnk#&M1n%54jIli5GG^qZ/uBXl+X@kJmnVJtyw\JY*p$^GJ\lqkMa6B%w?EP9pL&R$eMubcD
SjywEp GZVEcQCneIa#NGe6WWd4qNELbZAj!Yi6mudyuFMGa!t:i8Hc+Gc@#qqDt<:bB^u5F*ptS@6FLP/#PpNe
Tq</Pl F&e=#wNmnVJKyk#EmS+KHYXk&M5hB&QwPwP@1K9JI/QMT8wDluNP1dYwm?Y^HZY^&EA>G6aLR#pJG%tn
Eqh$e5 DK\Z^NlY4dG6YthdNc\Z^5E::5=\^%&5wc%+^%%5+Q9!n48##Hy$&C?8JlG*eTkZau#jVT=ESbThjK:E
k4C!Ty ?hebaqcL^jMKb#kuGaq=Z<WcbiCeSG^RBtJ$P<P?mqme6$bYZl1!cKM:k:?<dmhHG%%5WAb!dDyDnp&^
>>VIpe VluI5Vq$XR9QGZL%/JbDka^/wJ<1hHRFR&^DMjVV4F9BaCXSS8tWkXnn#m44+Za&&5CSpR&$5<@VdIPS
?^\Hk$ KGN$!ymFMtB*K9\RhF*tQ8bRa9laZ>h$cIMmk\kMb>FDTXAMDPi/R\p:Blu/Ylp+%^YdqIF#ZYe+%^YD
T@#lG& dqK!D<mamI5nluqRLnb<H@aVuXHuGM?uuTEP&uBLHu4NGjTcqWRbBZHR^ByqIA/c&KAM?II=k!?aYKiM
h@bWIM B4%t!5wF%1HZ4MCjRR^>#R4!ww#K&CJDi/>pM//J*dBI5C%1ST=:5YmQD%*AVGAGZce>Xe1wtVKRp$6y
Qiwy1w iTyq\DhKLK:b=TwEZc\>Y4SBP%mQl96MduwjeZ*p=nQ&yPWTk#/pQH6<n4bnw^?AGP!lSn<AtjIHbeAQ
!Nuw\D RP+=tVJ\#8S5ak^1GhDAEJ6i$e*Rj5=k=@TMjRbu8L5y^4KWA@1kF<T5FwM?eK$LjiB5WEa^!4BEGhay
%AKEPZ A#FI^KAQhMB%kCEG!bAQJGZkLHDwdtV<4R#QYDe*c8J/!%tK91dP<5Hj=4k*:K^Ej$!^TStIw/:5hDjq
QK=qPX R^^%>X!nDMSSF&8WkjNXMinEpZGZi\!jw\!M>5awlY*1jRNqHkh5JH$RqG<W!l*ay%tlA@t?^41N#41N
*D\^lZ eTMDi/DTENCu8l>/pMF&%Q%RI+Q6PGbt8>#aILw8SBu\L^GdqAH@p1H:wbVS?C%=S<eb#tJeLHLDPIPj
GE\eYk 4#Q+JK#Rm^$MMSDF5PilpMawT/Y6N!66Qi@%$NuPJtX\dVw4%/aKF$pb6BN%FEMbZJ51umBqeG&1iIKW
$HABGZ kj\Ga6Dbmmja!KC#J@j99S5$jw?Be$=u8Ne^*DLDGtL!V5MKlau/V8Q*bj+wb%!4#au#iI*w8AjqDH/M
F8!Bpy W/uTD#DMQd48HP&eijCiq:Mb%#kK*^uukHXXiwCXt>?Pk4Ip=MPhS$:HRhd\&=!#pR*I#iXGlmZKRM^=
*N%eT4 b:XRSy&W$Tyq+J^PdFDGMM1aB&Wk^+m8tyiDnN?<aF&lTLcJ:$Qe51pWN*!jHWdYWPbT&VeK:q\+\*tQ
+qdSuL 45##je#QNJXPBGNlhLdyGG#VMhmta:JN^&Td#wQncCIHkBn4NnQ4MbHLSc^SBuIAmA&M!+pe6DMX:H54
ALkhL\ HG&eQ=SmE**DGj1Geu^q5I!?pR!^dKj!jqFGtbSlqVJ1ww#cKcMX!5A?wXmnDK#b^RbqWIiqipC@JQyL
=$*^i& PaP@qNnEh&QPZcW*njjX^Ac?JZQ8PpQPZdFGGem=K#ayA#q*uTFZuqmunGtR$dBHK>akw&GQ%lu8mE$h
t8$ZCy ped9=6MM>HM&&QjP+QikDGqwK=<?$FdP$FaK/X:B5B+WR%9qm4&S1V^VlR^6qh&i:GTDMuAjRqhqEtXa
9#F#$I y+^cKAQ^1b$lb:E#=C\Y\*nLFVtLqeEe+<$b^q68mQ<ul9p<<?^8Kp+q/5HeDdMajQ^>heT=S+uNa@pK
TKc:?y e/k/R*^k5dl*4i#5li<4ee>Z&Za1bhSEGZXRBtLw/kb96HjFG6yqIIc8YF#QVLuNRedpN!1M5i<MMX!e
=61/d! $T/^kd^+W+FZB^n8j/\qYCPD*FwRd&/F*5qptPNh6YPihnawA#pEy:cBKRM^ihi!pVK\H#a4><PeaV>M
?5?KjP dFAGa9L1bPKkDJ#NVt%hF:K+Qq>L*R/GYQJmk#Lk=?EM5Z\WHkq>WpER$T/8T/KMhtC9c1=kQtTa6%cR
4+KIZZ GVLaww%?D:QS:$G5W\d&4y%l:%15WRd&45WGbYBj%Jj58CMllnqF:n+hDQ9FC9iQ<h5/+8\+k%?+5w!m
PywXW6 D:ZBhY$d^ud^L5:*XddL1G!ZkZn%mwKYKANuTqNyiTkD<iyZ8ujItIlZL+d^&!duw#a=H?u!K&X\Q6Iq
yl+C=? V<w\69%EVQiXwl=>cHI?c4Qj%AP=VKi9AnBQ!*<*q1Wdeqm/BMTjXH1D^8e/^1?#!h<PnN<?PM<+\@lX
KbNXq% h+cM!ZqG<R+la*KieVawk@NMu=^uhI&QMnnQPGPdV5+#MyEwk>@Z9=BSB8ebPdZFQmSH5pKGiYae<P>$
WT?ZPq l6#cTq?Bhl/G8%D!&ME/\M$\Qqjl1?5M944!EMceIn@RARbjZdFJGjDXuV1IyR#8*ek*qDLk1!9G614\
dlc\bi %SXDu=S9KGR$?P1KwW@KN:TSVeyAjAFh?e/WkVPkKh@RDwd:ptL5p\%uRIw!^9:Ted/kdiyM^9YM$wEj
>Lhdep bPl4M<EZeYw#1JE%!wA9w6mpDP=J?+w+WRb<EchTtFMG:m/Jwc@=XIa%5cc*CRbjSGiIj!<G?<YZKaW!
!G4Yek EQ>i6>pdbeV+X<t%XjRFT<1$Fd==W1TPIDjyXuXa=/X%1#1Bbd=Q#kFk<Y/>tB&V4FNG9PP=&KTMXmtn
@M4P+q J<4wk#KGWWdeY%?5wX%G9QQnBt8Kh+PeNdMBF8Q4mjXkI+uFM=HFdtSMq8ZtY/ai>&nF+l/6YN!nZc^S
:Ej+pm S6!nVeypttM:K/#LDS5GF8Qqm5X+8a6NQJjHEi8Y&+G?t^Z=E5^8jt5aS^q^ISadKE64?PbK6$kbeb>B
1Fle?= dBVKGK^9m#c45^:*LBedpPHjHDJ/S4>*%mkn4npZt\W5?w&ISd<S5bn@QCq4QjSGMdbykj>8YmE?+ne9
$jnWIw PGeZT=TLe*c^iM/?&KTMiM+8F5@bF?8WEe@b^iK=%YKNM8I=?&KDMpa>\KIQ?GI>>w&Ce@dFJ61?SS>\
1Y6?AH 5a#9bpieG<Zm?dSaQMhb4Di\XmmnH*^j^=m&a&VKGIM!J88SDw^yZe&FnJR\yy%lVQ8K1XJG!bSSBtZE
c!\X@C e^!^iI/#YJ6k<S^H4N@Wk@*F<5F&dnGt5Xn$#^GL?$PLDdSBt?m:K=E&Gj18Y^dw8<:Rh/*uSlpqW$cB
M&I/Mw ucPW<tnuZtHuKLF$jE/y\Mkt?w9&lm5a^=d!5TT!Ge6T5d=W5t*PFdX!4qnJeMk\X*AQhLFJGZF@Ww^#
=eA*8> ldPPi6Vwa!nYwdP%HE^k@K%CAl4akF*Tnkt:yB$VNq^LB&\+b:DljGpKG//qDB9P&cCMaySl/C@PML?%
Whll$A XNEQ*KVB&Gy%aw=TkGA<%>ljFAm*pcG@?P!G@8J5Wkd:T&6^Q*8^VluNKCQ8b!@Y$C=6\G=ZMN9+uEIq
JbdC?D VnD4bA*/^huk?#4GiWe?Wp$<B?bXBZZCd#QZk\y>\8e1!=L:+G<u:Q6iD9R%1hMD4GBh$W8FVcMkRtk4
#dCL#i *MMRt:C98mZwA<YKSXuMMAc:^b#Qal*>4!6nhGR%*p<Y!%m#K*kSYiZ*^V%45aF%5wLM+LiNP1I*k^:!
+ucWCS Z5<&cA%/!Bu$WFeEZ4B^WMdkN%e$VLIJGj&wpNEV:ESu5BQhw8Fa/PYknNIw\#Jq&KCM!uHWY/KMt@:e
W\*9\I i/GMQmqnXM1aHF6>Rn<4<AJpnARd^But5n=wu:w&\N\+ewLPH4qkV<a6:<du8McYYM4ki6C%M>4bYceM
F\kRia 44F%6+A!8MailY65b&luZRYAnMJ=WKq=KaQ#wDP&ciE<1HCqqMF=$GeQw\#Pk<+cbhB8%/XH!1DhQw^&
Jlh@Ap 8#Qa:eNw6#8D*V=8>Lk8FXJGGbSl:L6G8*%a^j/p+wDn8bqan=tl\\d!p!!G9W$=+Hi\^uE$G@a<hQiB
WAZ\mj M5bBGcNS^5!WMdHuwZSnBT#BHyyH\y\5^?5JXk:KKI$!LFPGDe4k@4lT$qBG#A<l%k6q>Epbw%IG:TFu
9%CEpa 5J6tP4Btu!qlZVF9>kyt=d:A4Fd+HNhM5#dM$:N&>A%u&NidN?8A&Ry5=iu1GY*RG91>ayD\6^*>Zq&e
DK#*9? e5iNnIq?4<Q<Twb?Q#96SGjR8\1:\QiX^QjS4qM+Mn/HNXk/EJNeDH$*<e/A&M^<*+#nR^86eZ\+T=Vl
JZw9LG XT6k8XT!TStqWwbq!4BBGhWww^&WEj%6^cK@:YIVdX4mZZ&^tHe84eGQ=&cMLT^YK5w*LW&!kjJyAINl
W9!Muj j*\NG54AuphcZl%k$b>jDG6a5cm#p$+ZJ%m<\:6a6BuWAcQh:lNF#J<5l4MEb%kLmWXdRD5w$Sb\Fu%E
DQp8@h Fl8Wm#$ib>nnEi8R$dDHI+c?ql4&iJ^ln$h5WAdYd<:mQb9FGtZEi#cLVeyw@Ec6w&?pF8?DybRSq$t5
K484&$ wA$W4+ZQSS>\5Sl#Yc^u!8%^n<LbMM1aB&XEj^<hXEb@u<WtbKTEeb=V^nl*NmmnGGXk9$/Mdi1DlnL1
8NA1#A yI^YKaQj$qtunFEwa^/WMS6piEiwbJl:FKMdMl\t5p+byXBGtbSlqVJ1yw\/KKMbbjTDMu1nnFEwa$#K
mQPK^Y \B=<!mZGwq/5R$cJ5cnFM5hqmdGw^YI5/5WGbeVaMYI^F9XmuVIc^*qyHPiqe=!Z\ZGP@Jhmp?QeDw=#
:D/BB@ \=teM=^XJ4j1&F<RM$q5eA\mD=Ha#jh6B<h?!\&@dVj/\HW&>Gu44G?Q?b:ETpa>85X>AYjX?N6&bDLM
*HWi&R <hy1wa\?KANu$WulSmkDb>E/@aA6+I#>cmT&/al*kljn>^*^V4Ca*enFZqZ!phZJJ8#EWk:MH#1/t&Ta
W*mISm Q*#+wk>y!/mTNe1\VBp&KTQ/h+yF@$/^Dl8pVJ\dJF*l!GCn<4pJ@ieM?5?HPjTjHRu/#^u$u^$b>yAh
EWYq^K &Kh^XnA?4FLjY<ZiahK^Ab=46JYhaR/%qnGHP5M+5qa\n1\b&6qcnBuu^p9CY6^bd*^8Hu^8wp$4jCWZ
-A8+4d 000e130b33b001202b4 Page 268 of binaries2.zip
ClQTYj \=^T+T5yBu<R5W+byXAG#4chaX>bX&R^Xm9*qb%lZ>pb>yZFPtXkZ%q5Wkd&qiWJt\<!4P$4>=X%%jhw
&==bjY bI$!5K?ehB<M#\*+D#tnD6Q!CN>wet^X:wE/K%l4XMVMZA#&cWZ<PnH+XQ4Al\?R5*H#HNh$:YbN%&:Y
Yaatp& hP%tVhh8%uV6bp*Zd6b$:YbN%&:YhF11VVLw<hc+Dtk*c#yucPjYB5b=#=^Zi<+a=>&uKD/H<<cp4dRG
IwR::l l9NGMdSj#>nnhwa>dnHMk^%=RShD?@YCQY=u&PPYK!#$yI:yWN@S5edl@S/^mdtY>*8e+Z/QYIK>^95>
=Y?16H ankuV4#jI%ck5*Y@y=BBb?6?D>wiei%VGlZ:*5/+^#k1=&S9QdTBY^bwA\WwNLCGNuA&KKNZ!wCjnFmu
Gy?><5 nIp&eIb=c>Bj&XuCYtm$BL$:G6jJ<&b64:5Q5Z^VkZZBE6aX!5Yb\DL5CPZm4GDeF=&b?/IKkJDB14HM
=qE>Ik DjyFq&wcGM:QuXHj#$q>Q!j%9dbK<d=Jji>5WAd%9iJBWRd%@b#e\*M&KaN:iL4YSlp*jYQGGLXJ*y&X
\jewFn LN::ZN6/Be<lq1lanLY:YQ\i#tK5*eZm><mK6</!*NTn\m@enTc5^bZ!:/lpei<t8%Wh%+QcEt^<L8a&
?5yu91 Zm#cb4wPEY$#5dmu+C#tN6aYa<#95qmHDG$!ktHiE5N*$$bTB+P>64aVIWMVX&RDh%Ge+T/KM>^FEY8w
#lS@d* :<BhqLYNTSp^ZyAa@M^Z1pHKmLuF^Hye$#tDL+T&V#6p+F/$YMF+!=dS%:KXVld9FIw%6EG&nnb\6a5&
PN5Bj< eHana&KeK&d/Rac^pC9Yj64cnQPdM?\QPb5ak*KJ4tAy:l?I^j$Db>qRqqVR%^VGP4bXWXDi!D4&Hb&q
Z6VhVE !8h\bmmGhm/h?4S$*FMTc=RB@$t^kZdyLhy4CuEW%<Sb<dnJLP/DPK6^*%5M*<$%b/Zen8@t4FQGMM1A
BIdc8w VTPG:&be4#1LPidEC59u>t+ua@pWeRRMQ1SmnVJ/yw\?KGNW!ymJMmc?4>IdhLJwm&cqDE6k&D<XR*?y
DBb4y% B@bQX&m1k!#8wVmLMSWZt=VSKtX$&CY%b9V:Ym&VXilm=bLMbLBB@KiXekh5EGiDM8C9p6%Ekk&m&DH^
JnbnS5 PVhX$M+6JZ##qp4me\Xqpi6?B15aY>4!cGA6W\duH1Xman%GayqH6E?XMkL#d?P?w^5H<MZYMatSJe#V
NFD%S/ 4YjMQc$Z/AlutM>dy$*wdFJG^hl1!kJKNqntnnt?>SHZ!du4WmdakL:1Jeb/YT#8Y#mn#c<>n$GGeiSV
cC4\Ta YcEM?Aa+k@?>5=www\:KcBlH@wuRD*1J5ejEeJ/u%wP?:\N:AM:aV@9EZ1+adIa?5bid=edh!LBi/BN:
NcN:n6 8YLREd=m\q#Y/YipKLNwi#iXB=@D*Rhu6P<X9!T&1eLmJDLK1AqnhhRad*&^SltqWAddbhTd?qd&NTYt
Zu=/QD PMDkQ?t5+*5w/P$EM>l/<puqe@Dy#XyCFDD5h+1ln<5uqVK\*=tXc5dA8C/d*q>RFtNd8atW?X!H#VB6
>S+QG4 5K$M?&b=%5S&XuA?MK6<D8ju#8DjulX@HGX8<MHI&5bE8*D@*lu8lDn4YLM4+Bjp?4wC9?*ak*JYDnKP
V4?uu= @epaG54YejQelL$t>*H$q\Hj$K#kP&mD$VQjN&D@#aG:4&K\@?dp9yRC%B^p$L5KykIb</d>bttWai^@
EuuHqc $!bqXQdJ&jnNb?8W$a$!au!p^hl*=<!WEiMn?Sk/au\p5bk:e:Gw4+yC#9N>8EeqhmQZ?L+T+:&KDd/9
RE+uNX \FbYFM&w@<Tm@m5H:\CYhcEhLFjKKIp!T1eMK=TBi<hmnVJ\JmI&KKMdba^EGcNVS5^l8hmEnBy#mwwl
?t?hpt lw9akI!cDVJ1PTmnhH#jmnQD5m/dS#ad!!LFBldnQC$Y^$^JS<^S9^n/dnwT^5!KYpQYKTQt1F>5WpdM
qqAuAl WT>YM&ZkdNFbM<4wB&Xkn:c5t&lpp#IRc/nI+Z8RDemkHXHplY6pnVK\9!5&KRQ:8#16VbSSMZ:ZCZyp
hHdY8h FjeNuHZne+Q>yW:&q*c\9:TD@cWq>yiY&F>cbu>ylj&qFjcZb8\9Ty^G^9:TG96Lc?\94dP@6MH?\45<
wmANR& #uAQw/S?WG/Hn=hP+/QN=R#*hW6tdBc^!ih\>>Wb:tCJSZ9DtSqq^J^Dm#ZKcIW!&1RM4M8W\TNS^8mW
X%aVG? MR$!<kHh/R!/M*9DNDKMlb!^4?IM?!ymuVK\4!I&KcM&!pCMBdFBGhk:LIwySltnW<a5qIFaeCWZ^I\4
jl>NNh Py\abNCh8YVw#q^\ZmHYKMM!bhmpnFwyw!ZKcJ$!i1EM&uDPGtZMVBtVa>WPntqL/TD4pGGb+>\!^:pX
NX1haT nuM#nuM#nuP4HPe?uXNG+#m*#uF8uiQeB5i=Va=#t^#u>iA+4+un9CcPe?THYI^>1Bd&wY45R=Z4APYH
=b@/FP aJpd?%DqipE=m\6b^:#RcP9qSq9Q%Rb5?h^\Q:uwtknK$tl9=EddRy9NcNN&w=@dnZ:8B>a88Ti5ZdTb
bmpA*q c&VWEa#NJ>dSB9&tu@cdj61=XqPIS4VBTNTJI%Mun6JRFtWbB15eq:=MSl8MtM6QLPd!p?9?\VqkHy\D
EqQK=> FQCXDP8n:M%T!Tdq+m=K!Vj4Ht*iwL=#WNjNRX&H8Pi/qkC@L:Hw>?YMN1aY:RcGYHBm1K?9EI%qGhD6
jkHGJu Y9!lLIly9K=T\I+wCZ+W#k4Y&HK^Sl5p/mEb9GmDSD*pDH1wbPwlHcikDVL%pA\J6EGtHyImS^6p/1GT
C6^8qw 1ae$RFkY/mF>EJTqWA?XG%8q*Nk1yXAQPaMiKwX/!Bu$WLubM!w*i$dF1Ih$VS%6aNSD!qGQN8DbTXEM
wqL#9V W<1Fj/K#\ZFbD+:LiuBe?n!h!Vk8K@YRM+=L*wp4CnFN8hSDdppX!y$Del9<V*ZXCQb>8Xu4qtda?*KG
^MXTd^ 9T>6MSwbdM#C8NlmE&*R8Z>ci5J/Smu%WJbi5Nju1^:1ne/>R#hnMT=NHlKSqa\!t%wX#KA:4hnk??Bd
E9HZ?C y1F\WEd4qNELbZD?6eL=%$4Myd5a>k4M+M9yLLFhDDF?uTHG4>mpDMV+hRajTLFPGdm#+1#^?^ym@DyD
yq9@AS nF?^RSp+R*M&E&XMnA?4B@TBRmFBSp*RB%by?%mq:iNNaJSlB&ZA6<\bjM9EJtZA6/\wjBNq\LhMK65w
@8MpK! A@jj^DCH?1jEHPy5REcDD/R#*H<V/=TB?&>mHPjNPM=d=Vl9qiP<Na=#*nEY+#l9k?QehThqVI:#juCe
uWdYW6 >+Qn9CiP<=+=#u9tPHi>T^tF+:\d^:t9n!mDi<m?18W+:=*n9HiPe\ZaI+NNcPPknJG\F4iB<&qu^9+<
*/hY/E nQ%=+K^TnHMQ<9a6^nbX$C/\BJ9Rb8d+uaZnh^4&WG^Y&IVG&GnPP99R=FtHVb=%KHX4J+P?euYKQTNu
BYT4*p YJ9K*:GRae#e?Da/+@=pQiB*w%D*$M<%ea?5J8/SXX<jRY=C4NmmcaF!EeNF*q!JeuFu1qVGESHDuFh9
ZFk>9F %pj%bu%Wd>bH>Yb>XG@YS@XtjXS9%pj%bu%WC@jSqawJe4Z:V\d>Wt@&e89NZt+6mG%hhPTK9qc+u?mY
dK?pXy C5b?9VqV4#hu/51nmLIa:n$=M<#h%SAHVXdu\dLk@w!YLwqqwb%a9WNuMw#>itP4%B6d^W8M6X4%>SHc
wDL=^H wHK?4I#hY^VYCtZ^>SHcwCZabm/Ya:@B:%1Ma:@B@%RM>pF6mD56l4Xc:ak6=\!^=bT?Au5w891FN8m+
y:B:jp Y/1wM:CHc5jhVT%N5Xc4jXJHhMR#<mX5ww+a>Iu^V$phMSBVS&p+1CNGw++a<JN&N1kn^5Rimy85%BEV
l1m+<Y h&Cebi1Imj58#w\/kuHy^KknJ5>/qc+66wFTime!/Al9Ki#q6kP?Y>yTkI&yuKeVDHeQFYERPpJHBC#L
$^XLDV lI=RdH?WBjuX^Ay5ctjRET*S>$Qyy>EGCjFK^cAnZG%kZL1&\4l59Pj9DQe@uBYM!/cdP&AX+:LqluGy
p><&4e MAp5C@\muTHGbhH^DJ/d6CMW5l>%t:nVyYlX/G9h@>9IMB@%A*/1alld@aD91tdySBue>*EXc=TBi?>m
/Z>9ym nVJ\:%%5WAb%y=bqqEEd#qiNlVIt=w18%BqkCj&?M&iaM?RMe+ceaYKhM8l9=t^TBtJWFKZFw\#E1NC6
SCh$PH N1MM^MRZc=TBtQlm5QY$@IYM#HuLGia6yjKDnE^jVtiNMlAVZ&^RB9!j6T&cKAM^<ZW%5qAG><!XjyA!
lmQHpI EBNjDPNeS/TRIY</Mw=#HecReb^4h^*MPM/Leb\Z&k!>$GdR5T=qhI:#$nuP!?A+L=Qn9E!Pe#5+#8*k
*!QTAN PGjMQYe<4*DGeY/F+>#XH&Wa^:q^ni&4/S5b8EeqlnuWNTL:e/WjT9jFbAJD:lXu^nbq#F5^6mqn*811
6+MZ$C L:>d9hHQnZPnM/!^hVWNe68NntmIF?pM<TKh*jVVh6NQG?=YPeMh\NJ>WpFbiQi/!HYlpGG>:<5Fn56i
F\pb>D PT+:am/Lai@LEiiAeZAPeQMibSpbi%>>FP1lahSDw&L>&\j8!SZqHGhbB8i<iYD>1*TycIPbaM5:k!*j
6QN$>^ b/HiuWc>!#\I#uBu!lu>t98pZ*PjmMW9V#Za<t/Jay+bB@%A^+Ge6tK\=ejNZ6?+&i5dN*6>+&c9d>#5
XIyaCL >a&d9d/SD6a*Jha*$S>8JQ4DiVhqjXNqjSNmd+6B:+:Ei\pn<X/CD\Zw*bES/%VSa/F*S?a==<kXPuHp
88uRDK B4$:M5@cS8bb&!mIk!EG8&pWu9hw?\B6WA\/WcFJ$RcqX5y6mZId/!84AY!\9wZ4^tGJ>VY8G?YtXela
EQa^we Z/854*HhPA^*t=%^*ck:1ClLQYAZn$4@<ZHn:*kVi/#e^B=#lnl<!nKA@S#q9Ghb8A+aDVGl^dCjw:#%
R$+T=\ B^q5WduDwT!NQkSip51!hK^:Sl8NbbtaA\b#EV9DHYlutV1^I*=a$ZZ5Raa=\K$I/5Vi1SM::l/KWTiP
QNF+ay lDQTMVJ%wk<+qGWahcI8D+M%/5TB8:SFajkGGPI*!R5K68P</jj#y6<4>NkER$#Aw6Aulc^VB9h6=i=I
^m/5bd GV\@t9YtDTy!ACkE5XEGekCIah=T8JbCln:yJkn/yF\$J>tkDPRAKJM^9<WcbTD&y>mpDP1e!hmjay$!
HF4wKT pAQAGjjMuYF9duc8K&du8pJl/TCnI\iAYKeM=AARt=TBHADPpANAdFAG@jXpaqIGapI:R\+A5WpbmBH9
k=?5Fb A=Z/*lu$@S#IAiAM<h#EPM=9#m9t#ZuFHF#VKj\RbXTP<>E+#pjnPB?h+*\Mn9M^PM:H=Dmj>JX$^uH8
$eTT+p /=SC^uE?M<j=LB#u5*CeV</%e*K8qc5BbVTPe^>\qMG#Iq@meJ^Q41ju^H4c>I>EF6j5#uBt:R\?9R4X
Xe?klm H9e^=aHdKShu%5:k$?5Mb>aK@Z=W56mthnCu5qne6*WGu%/^PH+XZ6=aFy^bP+N9w#PeYh8SedjAGe/5
Emk4He X\l:qCZn#N1bVbRq+<#cGZ!<^D4cRBeh!Adc\E*?TndSBkZ*NJ*l#Nwbamby%#GnDR4!L#nDtdZy/nZK
KCb5Jj anm#6yZku1!lDR!&n%lHG^nPZY\q9RedHJe&PT+4>9/hai@jGiaAW\J=6EHF@4MyRV9cwEIQPaMiewda
iYS<BN jGLWER%^G<YwI=knZI\/wmHGpTqlPh1A>=Q6+Q%pb:PlLQ&kn8mIN&I48VbatTlLN?1Inum=a6RS&mkp
Qe41!u w++aS#E!/wmSDYWblVymIF/B5$whMbBn$%tun9A=utYb%BEVMR8hJi1ImV9Ga6RSE#E#^cknJ8/=/1TD
+VYET% PtIP/wmJi/:cRaGPTN1nBENehqPC^AMM=:>mnZKyl^LQj&%q<RYnHp1Jimkq/1Gd&A=&E>9BGYJ4PpN5
-A>4ui 000dfe07a52001202b4 Page 269 of binaries2.zip
!n=Wl8 VYi+C&?Jh?Gh#aN!b+QenBlC6mIPk=XwP+ylVKheDZI#^:RTL/G?tYNcpbqRq5I^4bCQKE9ltHaLiKI5
Y\iID? lYN/idGRaW!9ZXY!RduaV#SbSJBl!I@nLFMG+!E:M+#Xqc\H4FZK^S/nY\Ihe/Q!C5c!=IV+ILyJF6iN
Cl%NIR aylVFAA/peH8#Bt^n$*y<#wb^yHeiCAn+&^M4FEGa1iKDe1wqVJcwk#EIDcq@KPMQmqnNM1atVJ\=<^!
D//SAw \b$#W$DyTRadPBjpQBCdqIE>T$WlTJTBZLDPcL@pR99FYcMMuE8KVeyALqlu!AW4%mHDDw+QR*+4Ma#j
p:8C6> jDN?uR*KRQ^Eb:n9J>ayA@iP^TbqII?:M?\Zm\*KGB#ud1NVBt%HBWqPbB#uNZGe%<^^ZnQH8bI:kSuH
d\XmEB PjM$tAIuW\b%b/:Wudq&nuM=+aINn9M/PM:4=Dl9B<h=P#nPY?I+d=un9GYP<<a=*luHicQh4lkRqFE=
4i+mh$ #q9nPG@eQ<mN?\ibMijFYI<PH^5^4NtXV1tTee#$!nHVG<hM^=%kb:kV:P^GQ+<d@V^\J>kb:kVLi+k/
*>nY$u a6#wmIE:\YJaj:nq#Z+/d94yQDkYb8JatBu&8EIINVLa+\1!m94PS4$:G@Z8SI+HMhlN84LT!VD&!$E:
@h!:64 \1$I/BeFQK^k8Pj9DHueuTGQ8#Q+/n1D4/+X?tJdwT?&V1e^nky>5SWFE8Pw$BjdGhi%ld:a#4m8LjuA
5*EVmq *yeCj1E5Q1VS#w!hbaY^5&\F^kF4tG6Z\Ba!4G5L@c:FwP<X#PKG5T!Fh95KkADG8WiZ<FpY^Eq%lnmy
Y\1S%c dt$e5HPKXmykmH6p8mCQh6GqcnLM6d4W!4J\4cHLpT\LanmdL8mlLBX^FuYduiP!G5hqSX\/b+lL=/\Q
VmBnaB qtXkjm5X5hEWTkD:eL1a$MtwI=yl:uEGi<%Nba=LX#tWMVkYG8:St^#tIcMu>9Gi&c<WAB@M?C*qCA1G
c5IH\M 8QbmnVJ+9mCHPMkaPAeVk=$n=!QIGEdhPdlZ9=^V\GkVqy8=6k#EL%dKF<!DQ1R^D&1aR?=EQDI^#wQM
h*8/+y KT4GiZAPa%pRi>b$/FZApE9TGjjI*G4HHyph*CQVBu+C+^/b1#45phuNZwa#>C66:A$!uKFye!tSaa%n
@qhBG1 CZH#FKaDN4B4y51!DQS^Z&Fnj>\!+wccNtBRqw#+^caFMM4mn/ENM8KlmMGPpNHK5k#aEZc#%/iR?Hnj
BMCZ=H SC^Mu*uk>:XCjBka:mCIhd/Qb$D%\B$E5Wab<P$YG=TBP\kKRbIwA*eR4CdeRSBn8!VeRZDG>XFNZB@X
*byaW8 lD5I#uAHRc^VSm&WkZ\EJye5!wDQuhmknGGW\jM*=i?GnI\:w&K\e=T@G#I!ey1JheyAVnNu!GqtN@t:
m%ED6& :Tb@6>*p::cd@N%&p:@dd9J*&$*?d49J*&$*?d96Ju?**iV96y9<*ZcV9>68<ujdVj=8Ma:#al#uyZKe
:5WpSl q<y^:waVbZTP<>I=#8W>Veb^ZmdH8S$e=*b\uF9mPDj8C%Vn9wDC!%NG+Vk*+#m*!uF8qiQeG5i=Na=#
:deN#t +:q#Nb+:P?M+6<q^Zk?Pe!qn5MS^ZyEHRiGYdtVR@$Z^D!wa>/>1:i#Qqjbybb=YZ#HS@$Z^D%DjS9?Z
uB>!W> &lC#aaYIRqqc+@lqnCP4nHHpnQ+9mu?AN8n$j/phMS8e$j>F<R@RB5\bJwc>6N4y@?KMa&dR@$Z^D>AG
NS#Byh k@+9mu?ANln$j/pD94@PiP=etY6LJ*eH!\L@W/8V=</Kj+A&tQS@eRd:95+d&&ji&D:$\:NKQ#^uuH@d
nddZ:> \jqZd9<VnH68:iAewQkHB5d#I&i\:>6BQcV+B:ENY8Ibl8IjFDD/9!n?AhwkeS>h+hLRBwu?L+y@kDbI
Bja\RH >H?S&pAdbP+V65^>Rq&9tGVREWwLqetkI=T!uYZlQtHL*ChW4AP$RiE?wXJBwA$K>\uqnw+&KN\udIZ:
%SZ!/w lI%^*5YkI%\Xa&>P/lq6wFNlM8mI^u\:m4AKHhEMPhGhITi/5>Faqkph$Ty!c<8DADyCd9wwT$WMTYjI
^+$LS& 5TqGHeE+ltLWEc:EYJbJHhERT<<$DcIN9CPkLM&wI*#yk4L+n>EG4R?YbXBH6Ip>KB@=%BEhiTnF1CM/
GyjeR1 >\qd=#=l/\*4AGjWES%*VJ^N/wmB?BdPEuZE\D&HFXISdVARa<Fbya/k4:$!TqFH$NhidFD8bH*yc?@5
bNdjc% Sk@NG#%$++juqnL%$I$juu<N/1EdQ:^&++jZD?1lj8PH=/5i/KF?++iu&C^+46EHR/abu89Idc#RpJl:
%k>uAW hJS/pGEePeI+/y&?d<=kn@h^RG<+k>:RQZZIGBu4!//L5&DFKMMP!4BGGbZja%S?n+G+Rw1Yt!mD98J!
&X:K:& tcWM&5y8QtNMK?>4J5P<4:!9pDGy\=^%!pA8ZdFJGec?NyHjXG^RB9KdP85HbjSGGTNV^ymWkd8=Nk:e
GYjJYk #SZD&BwH:n\/w=??5$abZKe+G=TBGJit>JiWWV6qeQ+aB?iQ+T1HMpctDJ=*n=9#:yERt$wM+>!ZhBnu
%^C:A% #nDPS$J5KtiIVTZYKRQ*wp%^A!mD95pn$Vh=JK+SS?IceVC?1FmuDMTtE5M+>/?Bei/1D8NeKW5kI!M&
1*C+4c qVQEylL4qGHab^k*c+l^5+aaN&8IedPGGDh4mHG#llk*c+l^5+aaN&8IedPGGDh4mHG#llk*c+l^5+aa
<Y=CAA N&8IedPGGDh4mGH$wjebqH&IPV5XNnqVd1i?Wp*AJ9abS1Z@pQJib#KPtaw+>GI+h*aLBQ4bGjV#aC^$
F1IkYd b+mF:wdwRS*SEuXER#^8b+nH:a^utn/h5!!Nb=1n>b8!<E#VGe9Tica=P5<$S?ibynQ5ia#PM$$*9ctj
Kipk:$ P<<$S?ib=8k<$^!Db=yn<E#Vb\@5idmb\@qw<E^#DJ=yn5E#VX<8WCePutt/JWB>NR@11=ty4&cl9yyG
WZjwtS jVW4>hX5%Fi#W%>N*qWap*eX=wHaJ&LRX@NA:BM^/K6=$LbXm85B^u5J!kGj\Cd&GcaT&IIlH+a#=MN\
uE>md& XnAYyw/w\bCVRhuyK8WPnAXu5FZp$nHJeEck=YWtk%&5%N<wT/++I=mbc#A*^&Gd#V\/!#I^h<@ChaB*
$F:hDc b>kHW^t>\A4PCGclLVwLdXG*ek4q$lchlZ5b91#A&Fh+L5k%&pQV8Je^nZ5bd5ZC>qc+adT>eT>DLn6w
leQEAY i/P@kNK4wR$1@dT$QEIdXJ=b/#kAdXB=*&XY*uibqiit5@LeXHFJWJdGP^eKk+c!NPS>MMWdCe@XI$GZ
4eEwXZ PEQ<IVjc5iaWm&QLGhce#4DtFB5wT<cc5?yPPtZ$t@Jl#Tp&KRN4#uwW4DuFPtRW4DqZmwiD4FEG%y^m
u8MiD< k#K\=yVLV1IMnHNuGPhmp#K\=q^yKTkDc$=uYHM1w?nS!BypGNcealM!DG6Pb%l#muZKMQb^\=yV4FEG
Y^5wN@ %y#%=q/?ZKM1bYDNKhayA&6P5RpbFVyYK+Pe!iIi4cIB5A>X=Al!XqtQ&qmQmn\%#uDHW!qLPGbeZ/E5
&j?1DQ LR&W^jXXAnN?6&d<d1&qTlb%y:MdZhhkN#tD*iVG\WEbQXEQ>W\>%E8H*G+G8d%!LQVG5hDH\dKMl9y/
qNmQhC %Rab>i=I%L5nW?<P?Iw:k/?+ZQk+>pjn&B@\FZeGZ*Fup@QMQDnQVQmKm#Y$@VV18tuWhV=lF4KJNynD
dQc&&Q YJab>*m1\6NM5BVQw=T1B:w>KWkKGHL$PWPPQth65m\h?mWh<G<Zm#beVRq&p>mA*AV@hpWq\ZlLCVuH
q\N^HQ =cKJPXuLqAcGYA#P^1DeCj*mLR@>+k#/JiYC5i<M?5XdBYQjGY!RqB94t#94t#94t\j41\VFbLBBW5E>
HX?t%Y NLGP8lZE4K+4E&Xp:Wb8^:$^8c/!*#QteyX4N^qm^e466XDG=Dj1!B@95&Xt@^8+e/FXRJypHJeDj9>m
MG!Xn\ $G6y\8i#=kN=>y#lHyBajK+y#5RE\>%Tb^hj&K<@jQ#<:cejj9HZj@&L9@4N=@@&/c&PZu:^X@@+*i?@
b>=VbI 9Qu4*9:=:Sh@>e>j9u\XQ=:@@5h@@:@@>Ym@:jP*%4:^PcC*d*:9c1H?Z1uG:YQ/je9>d@:/?Pd*%u@j
98Gl*< hRZ=t>>@@Mdt:?e+<8?5j=1>jm#6d@/QZ@#N*@#m^/<jj@n/d#><?9$9XDSj89*mj@1j@9/j@5M9@m@@
kAN=nQ R@@:@\FRT\MEFAACAAkA1XX6JVAB**tMkAEAkH\CADeAAABndGqqduS#L*BueC>6aYM9cY=#hGF5dC>p
?TJ8P1 d&N#L%BHWCBJduN$aY^5aZSyd&+kS*XybGW8atq8:Q$HXBSJF#iMD&tAkTEPGZWa$yAuB=JD#nAMPVyE
G^Y&kW !SqEVGRB!WuESJaMAmwm1&TSuFSEXJKIkImI&hWQZN%uh<XZ>*ui<=*@?b>QV#W>%j&48u*4%8*1Y:j1
t!yaaS AunJPtTwuq>\mJPQn%PIy:<jXCjW$>WN<K9@!J4cWA$%mkuNj:JwD>*h@6QkH:dbENDH@RNkXFVlTRBA
wYJdnn jA59l=SHkeZu=wjH\TApFAH%h@aCK!6D\R4tB\QewAypy@%8Y#@IVpF8jmFRJHH4D54Yd+yd5H>wpI6d
dmQ@cD MBTJ?=1q+i<Z5uZQXk:&Y$/Rj+C/j#nWDw4FRQFIKBcL*@yDlDyA\c11WLCdu?6&bcm@X11=hVQ!C%#B
n6I+Pi &5aY/lj1+:MFS9=^<uee?te+DAG@E\:#M^!cTN\Jl@$yD4>njdmj+4DauZD+u?LRmJ%\lL@mNILe95mX
SnR9<Z yqPIG^T81akpEkqIJBKF^KF\YI#WX5MG?d8G84kFRiH&cD^8K?H6ERmE&9dBbj5R6H*\*#++d^?e6k<l
K%m!aC &\jw>pF#??C=jRn?<+I>?E8G#=<H6#@L?aJBd^@p6\?I:RQ!#\98j%d%u=96\Xb@X8G*jZD></aDZ/4h
e4YkjS ikS##^Cj4aj#@KMd!V9:?*6LjZ%!@/*u$k=!<uW#e9Liipc5QFaibalEPt%hN@J**aEyiC^S/1@MJQ/5
K!Sk1N Ej=#?H54IBH@NjI99jB4J:R&ejb!e\tBKymFPwh<!hH#*i/ZC5bdn:d>A\qX5QJ$DjGA+nBRBX$*#@$i
q4+jR9 IXAWC11k:lpTVHaL$9D*DjD*&?:AlC<h%ee@!C#A!eWNmpV>RbTlt>@?4&l6V=?RLXayGNyccd1=?L8/
$1APC= RdhyC\:ba1e9GBVJZEAtmQGCGYQXuenN44lh:Atc#1cEEp5=9tS6F>QtlVCXQit/4lTmYK/SbLc?G?Y1
XiqaJh /&WHlV^Dh#NmTRR6GLV%nF?L?9c$*:1@*Sbqiu/8d8F84qAFVde\V^e*mw+/FLZXPXCIQ^TK\=<k>L>u
F\tD<M Eiwdm=Aa>J<<R1I\Y>Z8\KY@MRu#N!bl$An<V>pEAEABACakQY%W=Qw@&KVXD5nny+i\APuW&6anNeY+
ulW9w8 @<GtP++RWF#$dGT9B+/Xnc^SPQM&Wl*G&iNy*8KGP<9H^c#b+WRwwAB=RN&SjVMI&%%<\P==tlVX\j%N
WdQ/FW 6t+$c8qDbSKCaNI<NWHVn!Cein\EMLNp#:IdeLQy%GW?<QE8b#iP6n##I@/R6Np8Ytct*i^<HC8Z&q=\
<:8h<h JGtLy9p11pme=NeX8*>L5#thQ+?iqm/^PB<MWDTY#AcJ!@GiQuIn5S@pjPkk8RwFbXjZet4&\euXu6B@
Yk5AZS HGZnGyY$GucIMlq8iKt4I4jjNJMG$P\kVHhmktPt/Wdd&<QPRDy\c=eL!I#WV8M*Wj&PBBb$SLFYlR?k
4n^<eS W%lJ&uAFKqYSTTpkYc\V=1I:eCXF\*1pLCWcHqLAcCBL^*tqnWQ&Tpy^\MQj&WBLe<!cGWtwW&\c?R<X
*?D1W6 &awdPbnm$1l4@B%B4LG=5M/&nT6yGyPR5uny1YciCtS&TTM:*h^D%dVP>@pmKq=MAR@:kqu+<>t/cB?T
-A<u*Y 0008139034a001202b4 Page 270 of binaries2.zip
yJNMe^ $k%JpS^^jVP&QL4B!SLJKjVCmA9AhmbCAcP4YQjiCqi+wRdHC5J9X:uIKIeRtT8LXjN+Y#6pqhPX1qnL
86%FBN /M#N?u6GTWACnHP%PX!ZT!VlFFFJu*!HqKtbQ:I:#wRcyF6WKP=46%epIbul6/#:W<C+4pLl6lQbZteA
Hq^*di ^#5SdcQ^$KAYQm/tRwkTWKN*A56XWn=q\LZR=miWMdji!w+PCKnu=aa%<JApTpbqnhJeD5QwElcC9Slm
&ZpeQ# QjMiGuMZQ<Xhmi%/wZ1HuyyBIpNkH9Gj!tp<BHpl/mia#eX:t!XMa:9Ft5a!/XycKANMFSBpWp\bRCC:
TKXYR8 t$mPn^jZLYCQGZujIlLL!yN<QEiD&hIT*\GIqcmLme/%nK&ZjtmWTl&!nE?k+RC&Wy+:&eNBynB*JXAW
/<5ktZ w5?1%/t?^Xwte5c9M%I4YcE+8n8dK=hJlCukXXZSXYF==&Sdcb6Hn\5ld\Hb/8>Nya4d:llR/i>=Aayk
XPAew+ AFbNSqnL&%$M#5<AY4#6mQh&%$YYG6nKSV!kF&mh##IWb:iNmRpBAi?eHFMbPthP$SpEe6uQSRtkc1PK
w@!SJc XmBkQp$eRC#F=d$nFPDpIF>LX*1QV/TwhK:MqmSKQd?Q=WHRPVBj1YQ19pCthG&PKL@wcMIJbDyeZNy6
JSyHDI RS8c5j#WZ19/<d8wS:GZk5S\*FC9F4dIFJV#4yN9ud^VJyknA<S+&ct!+PP8=et<1al+\T#uAp*&<&QS
N8CuZt LEM6L&HP\lZH%h!V%VmMba4m*9IGAPT5AX*<F^aTccCYIcA=BbLI&+yE<ty!ZJ8XT8RLdh=AMnJiTaeh
twH/5Q eVlS6W8X4DXFK$HLXJGe\KVjS4D^aRk*nA!?DNA&AIALJ9IAkcmB!GqBtNytSRKtnGp8<^BDEZR$Ecua
KK>J*X SqiaCXND!pe%$TJFyb&aAL?>aGEW<?kYDyh&Ek@Q+PR>/c#uJeHFyNc%aR8du:ZuBaCbcSLytYMu#>NR
$^uC<G qBX+&k@\J!V/J@ip:$&MSuH9Q1ZG=FR@B44AbN+%KTYk1c4SFW6:w^%VLAj%wLLtkLSyqYF\Y4KEIAuD
^Z:6%5 u$<+idRLyZF4Kh6kkTM^Yl88FeWlkT#l:<>*:hY6/u4NHR*manMb5ycCteM/BNRk$tjNM+kMnCeRRDac
A\!+@p i*^$>EQ&8GSbYB9QjGRdmRMMDV<Vb?l8W5D/KYttqw6ne$by^pmb8\*Q1P+1^N!V#B^u*cLlc8<iPWKR
+knc4$ mS+R^#mZ:?hhh$i*m:AAP%Al&S^l+CWuI\ppwlIWDPFV=\ijnd=5Fi$WDd>9$<6Ha:&:BNGGpWKMmpMu
FNE>\D teCm^V!GyyD+PEM%!E\$uDSDECuQ#\I4+nTZcDba5!a4nw>Wc1kVTp$b\mZQAJ45iw1FyJ\=&GlGRB1S
W6S/XG =JNWPuNq\XFK4$qpcFT*IdW#mH<#Q$EaAp$/^W%nKk?M4EHMIk5Ww1%yC>Z<&cN/e?tewBCAdCy!4I&a
FmZmdt Ye<1@&SyN:*ELp?\N=N5EyWPDqNPPB+y*$cnG?Rb^eSI\!WGmaRT/J#JnLR9#HR4$5@L#ZN+y<@!eyc@
bdkkwu WKP=<HE5Jj1lk1$NQ^MLAdl*DCdNnjR@yTtHnd*dy$p:w<BeeLWb^:EG4%W#wLGAXmVPPty$<DDSSLeQ
c*+?a: F/PeBh*c+l5$J#q9S^KaEmMlR1kbdwd/MZC<l&PXbnWGZInkwNp6RE<q?S+QncBV^%kmARDTiT4ekD=!
lb*aMA 6%XdmJ<##F%LI@!B*LJ8eq^HM=**d^T=dpMuG6IbYdpZ4J#19TcJHVB/hdl<QPDyZ5n5SZtc$<wmM%yy
TG1@cW W5i4dVZ8?dMF!=/kq!qN%T*w98pTDtWc9c!lwX9MIZw+mbu89EH6C$NPnek4mVd8Gt%\I=ZIk<+b#8:A
DZJeFF 8wI1P4FJi=hD/wdh/cj=SV!ab/MyMy*\Ltd/\h*RpRQabNJWi\#pJIQ4qBXNj+mE#X9H*BhS?*T9P>Lq
N@k%ej #TRDA:&*iGwytN?YFB8A1+9QMPuSMpVFb<JaEb8XF?MKAu+4MES&1ndB<18k9L:/El5bjED&yaJHa*tE
IIdKAP i8ySGAp5H>tGy:I>^Rm:p<DeSmA4lFwm<*+Pb*/u5HN6XBpp%FR$B$GYbA:ZV1ImiLt=EGCNmSm?qNYp
yu:^ej =RJmKMlnRNy=5#RYGl1TFE:%tE>QyJ8<9k@y8b@YSaWXNN%myWbn#GpG=ccquI\!:$BIFXAi<!D:4Sqp
b4L<=V Ea!HSRP!%PKFDMInV:5&//yS4W+p\!@eyGb*S4%SqDap><9N$\hpAX!mI8j&Pyi+Pqwn#^AV!ptTd%bF
LFYYaI 5$eH=ZGnBmCGkF&<Vyl\?kj:aW+/JyF6=:L%\=Ma^F5yt8ymHPK/\u&Qbiy!pENtNLN1nPJ=#KX?9F4t
p$u<Da F%hV#p#p4#W<SFdQIkB8Ihy=1i?b+<Z5ERYHc^qiNmm!lF?YWJiF<a#W$&TKGP\T9/:P1Tb1wBbTLiXe
Mwa5@b EJ#:Iwu!HmF5GbeZKuHp!EyW$QWM<ZQ+P&d4d*:4Fi+TS+Vt4y5+ZVJlj?8tdJY*d5ncI<DL<n^l%=94
Q?W*EL pWc^=B^TG!CQ>a+4><qd<d6P<*P##Gad1WjK5TpK4::bY+8+qWeTa\lkd<>hqaweA/5@FG#9PDydWn1e
LyL^kw K?Y:uEW#hW>hnBdc!n#WImhnu<X5CG84>t?#FTkc+%56+J/hkKqy!lSPq<ERNG16V/q9cDy&A>1F8TKn
$RKV<L MXF>e89!5AJ69eE=R:y/nlWk6=NQq4M6PHLP/taI+4t\NNXhGPD%^JuCHLYd1b^ZQBLKEFCE1Hj@NPjF
+6B+@m I$tw4WE!SPjTTRBwq^e<I=umAc*V6QK:uuiX6K5CGA%F+u\AQ8>:>R!bb8%yE5KqAtw@$CLwucbqC5:V
T!Geih h=#lwWq@%?:SH<*QHE&CR*hL6ipKLDX+#LIKn5LbI\F<MCk#+LAkXLm$:Zw%DMu8*!BK\*TeSPDqeQ+\
uQ$Tm& #\FiYJYtHlcp$w5ZWNWKFEGmEJ:CEelA&Q9b9q$mE?J6Zk!A#N$AadWCY<:$ctpuXm=uH*D/tp\W^?i=
VJLZp% Aj1w8c6PKh!$\w\Fnm1Sy&pDlRF1Rj^PGIA^E\\Ab^Byle!\MauAXTIFJ=*qG?Z=yWmpKCTyu%qikDXb
RIjJc@ yC*9#9#W?RWAP+*Q%TJ?wP!tCdYYHmaQ$AS^P!XLWWE6WEWSVRt&ttS8/q9YcG6/<X/b6kdu!E4ck1Qm
Zi!yjG WREinPpHuX%b+#+Bk#CIkkm6wtcB?qdb>5i\tT=lDRuk9BiVE+XAI<FZtA9VdFbIVIAXHyX&c4$GR#%a
96q8@c iA&mP<1*A1S9#>#6T^cl56LV6nCZ*5FETdDjYtZZReCkjwYk9V\\GK&VYBd4yFSpWjlM@8e8CWHSNm4$
P6LhuJ >RcM*BD>q5=#Wl%/J*PYqtNStnN%N%^EmEih\88^#w:Ip+k5Ki=@9WbuCPacp/ace=FwlA8lu/u<pI64
&P+LI^ ewD$41I!@1kqGPpG@^lAbEbKDt1MnV:D&hGTX^\Jbp>TFnEZKd88pwDAFB=N#qJuK+I^S\uQ#4W8\HdQ
%>Zl!\ pa!bcReeP/JEF^dANH:XpabCMQP6aYIl\FcI/1Q8=Me>qC5Rde>J6bRyyD/qNciNM8S&mqCC:ycy#qiF
M=55\8 ey&p!SMb\LXACb\9/GZdLbSPMAp<bjYknibq<?Cieij65yS6$@RTIbFwbp:TLI5<TZkLm&VKk5wBduEy
k:tjCL %Ay:ZSeycPdyuGR$CSNTT^TbG!ZNSRKBK&4Pbd8LdI&w>T+dbHW=cEq:BD86LW6p$JG&XDD%MG?51Gcp
BqFKH: AI*w4BdATK$ICt!La*KP=lthpSPV>blX9cK?t$Y5lcW6GTA@IajSya5<1GdPH#LVWuE#R/Xw4C1SCypw
uVGKmR ECu\Ea1mMw1w1Y/!l5@5>m9Iqb9NQXGRCyHkb%S:Jp@ZwF&Y!k@8T/JnSHR&Gwk?XDXjqKb&MRi=m%An
?<&IB: PJujC^1&!hEuW&t+=46$hEbGMEMA8hqYIZW+a\E$m4GHB/$w6XBJBR!5hT=AGL6?q+DVmC/uP>YG1#5C
Vud8Bd bpDZwq5=u!<ymjYhMME+b>uVSE%4S5&+nny\#MFyTRW6WH/YNm4GhbqKp:q4kabwB6KMk9AQ<LPT$KRL
ZNlEk* ZCB=b+ZI<*4PA?qm6aKme%#\EJ4EyI\PMu%nAa<VaQiM4kTAFbD6%#P#8:!+KdQnIZj:8nEyN4Chi6C%
@pWQ?h BK!\K8%$bk?$:d!=MJjI:8k?%SLaCE?mQQhEA4:*uaGFwKyl@FB5Hhhwu<mM6pB>AF$pL<B=SDmbu*=t
pEB#Y1 G6@P?#JTkDb$ymMT^ZE^nF@EpJpJyyT#\RcZbcT1<uE*INWGyWW5kYc<TKNN8mnlLm%B*6uDJWWQBYp<
mlPBkS >kA?P>MK:BP^X!9ky@FKpJ4l*t8CKCnYB4cb$$TG>E4+AYdGhuHe1a<eEBJb=1u9pchG5$B^CVME=u/T
KmpqR! XJ>8TZ6>KY!EJhteaW:Ije/bm<4BX#DRHtWyAF$WE5qq#jGlyj1AI/5bZIWk5>Q$GEiJ9qR1DcB49y/J
ccBN&S X+K8K%Ie>%CpaF%abI:LNP^CY!cLp^l@?<^8qnWtGlGE8!BL&\p&*$?FHYZe4%XldWW1%J1DiEjA4CNj
GFeF#H XIRkd#WX5Mq&wF+\cy&j&k\lCWQ\dW!SV4+h5tB=ZYq1>u9cp<wAAwlnX&AMlJPEEw=elpVF$4dV6piZ
ltB?ap kR5dYCEiTJEkTD^AcQmlitR+w=4>GZnl\VpWdiSSWGGZwIn^HqP+aH8jRC=R1q&m#5lImBdFI^+nE!+R
^^*li^ T+XAikC$6^G\GYiih1qaK:/n@FSEt^=w!T9T&SYpJwZP<a<>+LnHHTAI+IAXcNJR#^?eDHijlRlJAAVG
jn>DE# 9iEpT!Bp&nDeJeubl#cyVNwyhVVcqpip=IHe:\q9HGtnp1k$hLK+F5+uX4cE>lSuKHl+py5/JFJRmKBi
#5WqJI qP$RV<ydS:Tj^LDZ<1yVAN/dLLVGJ=49Hb^q^!el^mQb/KqJ*i1SLLeq$=99$DyN#mDTlc1VtYk$$b4u
FI*nLl Vb6jb5&Dh9NX$4jhFmY^AhI9$$Wh<Hl8qtq%n6MWJDhD^tbF8yN5l+kPKXGRh$WQBcBekJq:*EX^puWC
?<>6pd &RLJEmT+C?%D@6pBYmeS5R/Nk<%<J\pC!VyHiR8:/M&lhJFBn&$1M1pQMt>S?cNeGcGKi\5hlG+#=:&d
Ay:#!S FG?Z+C@\iH<L\WeC5WDQ$BYYKl!<pWq6&?Q&<EL:iIaVXIm/^@#ht+TbV<BCANAy^y!YF=^\/G!LGBK\
C9m6^> #ni4!m%kX@Aii#bC54kaBIZ8bLuB@ILqB9qQ!<%j4KnjDCywFQGu>lSYVR++b?<RtIHnBC*NRiEL6Pk#
u/$9Dp ZjTWLlm>J+e/5FkNMP%M=GQVJ18XBNnmBNuwGWXqwaNMlP/TIy4aEVX+n9b<5RBVL^ZH\V>aH*XR:D+6
kFKH4D VGmYkZ<m\IjI#^I9/ku6hbDtVhdYRIdT&5nuGXdqZE\GiYN44PDeliYVQ9KZl=e\CA9IFI1D+luGab=/
qcjcRy B%QF!5klpnj6J<?9I!%/1Q5\^IyD1JD*aJMk=%EP:iXPIu?pB#+h:M<naFl4C#wbZZF!/y!:npwHc<B<
lEI?#l BPAKT&Ph=!5^YCqHMnw1AbS@Nu#GuZncKL\%EEn%RuRt%^?YKcN+=#Kac>P^$bB9MpEkVI>y>Mm*V\wP
8c^bTm H%S?bHnmhI&kS!&QebqJ*CMG*t:/4MCBJWSKDLWDEqjaT%aEm+a@wAWcI5mm1jXm4JnpGDlFQmtc\kG:
!WkKbb WpDb$j:&N@M$Penj^e\6BGwHXhmiYqA\h\5Q?YyJ$@n/X&@dZKtk:i<ZA6%8R&$$FIu@$5nd:jYuGY::
kV<>c^ $4bbE9uX/4q6j@6m6j6/u%b+mI=b!Ld>hj6PHdP6P\u@8jwZ+>9&ba*6!%<6qSyttG<G8i%d@&w*^Z<@
-AJS:l 00089df0d1c001202b4 Page 271 of binaries2.zip
%Y%<h= i@GFVQB@dILd8em6nD?Mkq8$d%Hm6!X6uu::wVn$6*pLhchk6!>IBX$*u#C*EE<Zy:@ZSQm?y9<<$Fb%
+a^IeR cqB*J=@k:XMV<y?u88dd9eQhKhRu=P?qEZiihRui?tZk/S4<y?pa>ReLMH?\Ej5HE*B@&EcSZ=tL@N4n
h/GhIc pNk@GkXJ?Gw:STH?8PD\ld&l&*M=mQ@M//DRZ!h&@nw9<^eL>y@hW<%MR$?QkQ*cSd@%aCIS>dj8K4L%
HFRY@9 V&w4tTJFSMu&SBq#I\N9ESGan4/wya8TLaJ1JY+qI8L6J!Fnb:4Qk?BmL85ln$MT$SJaL\qLJVXHV*5\
KbATpy CK$y4S51V:SZMFRJhjM*JjlmHb$J@tL!cl1/GA$9kw?/nkRy!C5+YF9eZNXETWeK6qhd&kQ84&64a8JG
&:Yp6: CpRm=eAkdXpdZX?!I$tjcK^kdaG\^MNkSuccAXka%Yi9tPdYRhtR/mi^#>ZD$6RV:!/8+Il*q\nFtuya
5DJ4J: WtVJY+h>VtCR6:GttLij6D5X=!i>Z%R:tGAqJ@K9DtDR9<j<j$Z<j$Z<@&+SS%X*iI8kpL?8K:a$$q>%
<\a>Eb ld/mMRKtF!JNNVCXCbE!eEcI?&B56jcdwK$XWDaiBtbaWTuh9cGTStdTBp4\LRyp@RL5$VdTuyT>SCp1
iPaQp^ %5BCFA!!heJ=1hnwpEI<LRk\NY?TlcPYtI!aqI/tm41?ud1tkw/=qKpBSee@KAnq:^hwa^BkG:AZdk#d
TS*HXS /9JcLk+llwE8aJC>1m%J!n#RVMFcTehZQ$BEJClIYeLNbn<c+Scww:VjXq:X#M8HdCpSbPt!%>cjbPtw
i!&JB= 9<>jWn*aXyypyKTK\*l61S8baH*MjmMnN$X=T\5SA<#?EEeHC*?+qL%=aKma81iLK!JR$ewwAC+nKmZ9
4#!l6J :G#yI/eVcCMu1&HkwPH6=ipSJKK1DAc=Ty9d/P+#hTRa1H99I:mJWnSDMA1Kut1T%8:&?@^<ZhX%=Z%q
1GBJ>6 Ak\ydl4KI4aPMC#B\nbWQXST#p@M\EhQlSCpD\d6W$WHTQlya\Qh1D:Kmwa/ATwtN9bmRb=Y>uaicqL?
ybNiJ4 hmk+#kD9=8w1dll5CJQY*R6ZMWKSJKZkWmS*YTq>L/\MGGS8KS>MIp9LYaVAnjV$A/$NCAbKpnypeVe%
ul$k@N tLt/m=iy4IcZu:TLI+=mR6SDmu8wI!**mqnDjM!ejQB:#XS$yTZBIIT?qy?tYLCaJkK6VyTTFeMR4iYW
ZRB+e! MGnQ9Xl4QEXXFC<THEL$EDhZe$K=aDSpqC$%eJI?i9/!Vy/Y%n4T6l=TJtCRlVqT%h@b*W>yu#9J#Jjw
l&4!TS aTqtV4B#NLam&&tIl%DRTNGRWG>QD+\iuIyBwcV&TT8:ten/p+^eudSXNenaED6uMMna*WDYDYhllQER
A<>=@$ M!j/mXHJ@996jSA+QTZupEA5X6bC^TdA$^>F$XAI$DTmtwWwtdk:K9yLcP5bPQnapBTX#YZBIBMZ6=BA
iNeIPF H@5AX+hAtLYq%%+XeRXVNcXRM*qFBR^bFTt4GGCKpXc%&?>kA@hVI#8J+w^X5FL1n1y&TKMk#F/!4Baa
BNMY>* JB>p9qhLN5DJe!?M/PD6LiMT/Kc*%bY5=XWe@BCPiKT/QRE4wmt9L1G91BFmGtIwwcZp56eK/SnwcPA4
aZe:cX kbY%<RCDJGYq^GX$:ZT&lqF+hS?TkyECYRY49D@EAdpjI?qK<Db!$CXk:N\%6DH/?:&hnFHcluJ+yIKZ
^\=!*Q 9LKDn:Y$1H?RJSlp=IpKRiwGGIw:cSlSHDSRW8d/IhyKNpE+bT&$8M^ic*%LdWQZ+GByHWebQRXFjaeA
jYFe54 YW>=q%CTj1CctV:STF$CCRcy?d4D#NVMSLZhNXDIIIK#J6JdZ59FFLpjF^AmRqGYXFcZm+mI&Fp@wQ+L
9b6BE9 #=J9a=L@iJckCV@*LFFR*<yF+:<Nh9+/wQuPa?V4mPw@e@J+BG1uKZpW=1hIHH=Hb\\W>8hI:M=I*M?S
be&>?$ P#8AwQA@SYIJ8B&SlJ<m$V>AEu?KSBE^P:4^IH/P^P#wYING@l!J*yFcNP4uTAS/S?VQbRlJ*FGG$D?Z
I8T9X* IiVPMwV?8R#>!JeE@Vel$99!NjZXZWbN/58uq9c*99I*&N<@ycDwd#=i=G>Xd@ZVLV1IY^>@Y:$K8=YJ
*^VV<^ I&C?>D:LLhu/?6G9aA#FI4<9t@C>BRCL^/B?ckLkTIweIdet+#laNSp$MB^B<5Jkin1t9Pk>uLHJRHYc
p98Z?* ?5pAiaHpRm$NH!+yTR:l=HX%VmyJRVS:Xn5+L#LJPw5quw:#nP^Ni4ppJ8iMlAt!Q?TE6uyM%AKFABG8
SYwphD EA%WK$6ARkTi#5XweXDlmlS6DdZ/ktcWaLKQlqNB$Y$QCJ8PKI%HX=BWM=5P4$nBANt+JNq:$hTwciqA
%De?WX pVu+qak9?c/#\D%hdKDc\KI@e5:41kca1#%YkC&w1H<^IXN1XKm1I:u*ey@<YBL/C6nmV4J44>Z!Zd6Z
w/YTkV 5Y+G^Eewc!HQQDQ6ia>kF<H&S41nXeE+8&Ydp+H/k9e>Rt^XE5m?JjiM?S%!1^n/1=*pL1nE\V&Ldt%i
/LXk<: jTVDecie$py=E>\*/Nj!MnYX1WYcYR>Bcwt:^SEpYPkMa?KNb^/lCq@wA=CqECe1C&b?c>hE<Xi!8tR4
JBT!:! TWqnXM5Xq&PecNwKKQBTTdYCAGG%m4/\e$tJd!EFTVV/=cIXMn+SqR#/5N\^qWGPcplhy*RyB/w&1S=@
?9\mLu 8VDh@ZL<5Fe!9\II$\RBG5^>uIeQ&C%Zk=bFC@y\6jMB@DZFl#l/Gt1==8ZncK4VL#abVL^?e>t5c?4?
cGVGPQ FbpQ6HXJTj1FK4X$LAN%LT91W^L%$kWhA*%e/ca/%ZTHwl>XSSuc$Gp#nZkpk6JDHJl%PMimL#HWeE&5
B?&9c+ MX!WjY+h^@Ik+HWNtKPkRy4P5LJaX8SE=ZweJGu!<dm*ubb#lhjKSZdX!4hXVyYZ+<49&5naVpqX+A:S
@:uHkJ qndY#uY$VL=iIDVJXt1NRAln8tSwK$6qQ&6%NhY=Em#dX#B$N^VCFA&KM9jlL?RepN9h8pG:DHFK?yl?
aA4ltb VVw91clXBduSNw#9R=$yBaImW@EyL!M1Ew>nGu6jKp\paSP\Q5=VHhJ=!?%y<VbMyqD>QqZ>m&=9L:5?
jhKny# 44pwEZTQNj\n/ZJnqehn:m=m<j8umk4&L=!upwyKM4^^c/VT%Q!yipVLequJ8ueM$<LNF9LeM<JDJG%B
/BBjpt t*F?Fu5!@AMH?iaCKEcmyR4!Q4t@WZG^mqR@hbIik5pSh1CLS?k@A%wk/=$5P#y$H^^n+Ju^G1YChe%$
CY:YLH QYlInt*Z4l#YFJKlM:wWGq<44BS?qch?DAhYaeP:&HuLbV<L1hR=GDELe56+AP+$i1F+nWW8d4@LkamY
NujMBu >1qCW8X%Bn//m$H&tEjHJ6:pnw\?j8ZXcVj*X6>/?cI$ZimqI@8T*=!<IlW/+%:59<JQ^lGHk#=iP\?c
=GLyC4 N%e\>XP%qDjjdd$j4DC/hP%t4?XD8$eHkdM*Ebb5eccVeLc!ml1Iy8H?yNFRnJaNPF84m<WWbcLby@qB
QXK4pp lT5FqJLy4!J#i$RD?NdluQNl6H>VL>4C^&yj54mnn9$u?dupMlB/SYFp%I5ukdDyNP+X$?<nRPh^lI$*
GZ$S<+ p/\luu^DyK8j?j\$l=\dtcDBqG#GFYJt9^y?/edd6qducm8MKR*:up5d%1tW>+n>RGFGRJ?*FaTR&qdI
WHVSEW JeqW95>BV>6+@#uJQQYL8:P1CXw?+J8X=1+y\yXXRDbHX6FiAPWPQZm9Tcq:Db=/naJcq!XNh?4uqNlD
iIP!M4 dX:JZq\99jZPAmVPAWi!@L=&k/pe4Q?lT:d&/SqiZW!/w!6d^IWWQ>X/Y#5N459H1q<h#Y&+L9nR9n9Q
+^h*lB Q\RHQPm4eDcpNw@<iQLTa84H^\bQWqiAH9$J5C6JqSdAukVye?QN4%P+#%pNQjXX99JANu6/CKlFY8hl
nEyMXF 95<+I=%nZE9p8\1BQPcleE1/?5cyyZ6+e5WRDhKim9GT@bdc6jae$\6MXCF:/5Ld!YJcc/t!ph//Wp/?
mpVAiK lyn5Xb:*Ju1WTA\Ren&*ym*A\/Dh%!TalyV#$6\nP\E6A*F\yS#a6H/1C\et6t9#tm*/yayW\%NPTemP
A$da\l c^:u<6XVEbqh1+m85FlWlluZ<6<8I6uS!tkRkG+Wn>!ylY+%QdhVI*M6Qh^DIj49c9CQ!iJ=@J^Y*6eR
Q9hiRu ib+1?SMlKm/5=WwSbY?4iea%ucBX\C#NFC9cGGMdhbEFynLVG*WNA&8DEEPY!JL4pK8A:1Fba@nN=GyG
RAJbm= $pQL\5NtXAbbkw+iI#ZXwm+&D1YwuXX9=\\#Rw?8n>1?hR4w=L!nilFI/cdp9l1qJB&TQPlI^mhQhlc+
:bqJ+h Jc/e&/Y=95I6u\SVpqy+dl4hy%9y$k%e5@@a*LqMGRy1S+numwp5uSNi!=mWQm+^1jW8IF!&n:*IjM&+
Pdykl! DuYB#Ri$=4E!eVH*Nljq=G<&cQGnXnGW*EinH<MbiQW?\:uKjhXP!!uEpiy#d=e/DZWGh&khJnwcE5QT
m6RY1S Q^m4Z4F<:lSiiZpB@Z6X*MVqiGZ*A@&#95^y>jXTEQQ#@i5c@k9^#$=TK6LKEF1+W9X&q/L4a$pjB>Iu
^!G#R1 J\e9GKdt?L$&8<G9!uH8eKy\!4T1K!n?!pK5W4awKGRI/<uY8*TGE1mZe^N>T5Ak?K%\k!yVb446aM^l
@qEh?B RcyI8&+&*<RncRFYJ$/RL!PDp?bR$PZDM=@5\e<KSjM+kt!CdMqnFhhZH#9uik+@L8!NLBw6bVEwG:KL
c=*b=# til?F<uujN*@=K*GClbS\%&@^=w:NSPPQi5Teu4Fd96<5blT?wGqEZX=%nIqZwa*8//^+::KJeZ++$KR
ab*#CC #1j\NScD%:eWduc*X:!c+l>K%EbZedR/=eW/uHlh4*D#NP!SR=6N1EmD%KTEpX/jNFqDw$Z#FK8A@5*p
b6KIpd K*#!t\+9*\Xj8&XeaNHt^=y/%4NQh&6I&DiNNe+mu8ZBM+Z:PaW@D#6cujnybZl:$aK\cyZAjNm\@eLH
Jn85N# HPYHiKZ8m>*VC=hu@X/hiP!YJ*SX/&YtR1W4EHw:=1H>elJ*d9SLkiB?D&Q?$LKIk?wH\kZF$^BStSqV
M%qW!F B1h+?%IZ4y<I=jK9F:M4lte^6hj8Pm%@qiPi9qKeDH96^BK\yb<F+PR?6E6cwq4:dH::=/6c$qj:mkwj
&bZJ&h khImA%/<NJC+Cy+lc51BZ:V%Zt!a=VWb%jTc#P/@EJN!k9XFk1>p^wZPP!?V:n\4C:j\4D$ItJywydNi
^&ubCN %=9=Qih*MhNewi6Xd48/JeSQe@1LJekata*1/q/b%\<ei^*CQF\8%Hycj^@hcJk*\/mB+l44pEdZ+%4h
?Y*BS? m=p=cZip#XDk!D/6uM5YRkhP:Mi>bF^=eDV+<?HT!#jtXHum\lWN=W<\ZZb:MmThAEl$^=^KWNR\&jmp
/ClyKw $Chh#*d#?IALGabuZ:k=X%*i8!=DH*F1MR\BT/E4Yw*hZ?@kHuK&1M>VjbPBAT/qF!=j:iGm@Sc@1pwS
b!^QJt #hhA<Iwbld?4YDl#M+ubKPFVjjnHPC>>%q\yp\q<$6lq>$kyh&Gq6FZyC&@bJRW@:JjNaqFpK*@4$&8N
@ipBbp $iQhlQZb#=Zu#Lk9GmTH8>C8iL1@hTWeqTId^%c^XqkA^S</hJS*SHw>QGGa5<Rp/=K86=B@\uP^5hPe
G:uAR1 !Bk4HYuLa6DEnFBM8uCtVubXpVSD:F=Vyu9d11N9ZYbBN>KF>mR*hXZKQFtXYW>Xmp^wKn%</eIy\MB8
cIk4&= wyT6ejy%uCpkjV*Q/jFtd9Z8>Qw&:<=tnee6M/q#RTeWA?wPq#Di$aT6*=%u!9XcpL6R/#A@5Cu/61bZ
mh$>e= 6eI+KeCqCF<b#RAMABbDZpcZW=I?4dj%:H%SwnCeK@Na8MYq:Jc5<N/Mwyb!Y%ZaS#c>apDQ=dLwH8ta

-At@Pl 00078a0ef69001202b4 Page 272 of binaries2.zip
=/45%G K+DPt\\T#tHD+F%!54@HVM5XDeuB:pk=V!l$4M$Y#RG%9KVV6SXw!+Ehh?Ch/<hMe@jY8CM!1w$8Nl$#
@J6c:1 Z9Xn6&jLGLBNbXKuF?jZqBN+*nNW@d1ta&dE8WSt*ZCki5FnMaBwtQw!?uiGC<<qNc^6nYmHji:9$wj$
hL4/Dj :%h<P$Acql+!uC8YAkP/?=6IWnP9c9bLwu\qEqRXDe>KXi9jHHkKZ>&>NtS?^=enyKD*%LAm1*>tFejM
BASt@t NeN4$1C^A=phI$En1Icnu%q6V^1G*T%4i8bKHkq1:cYh/6YliK^&VR&/W!Rm#6aXyDEbi/#8E!hZb?pD
BqPk@S &+5qd1=+lNAt*InNW:nbp$cd4E6ZIt%EG/:?<al:</tEEEK*5XING\1$/e@$nua8YZ4k1H/n8/!CEKb8
XT@@ie /Bl+ijdbA1KKF58kIhFw!ADI+GLk/q5+SSi:TqAR#PnW#BdV:e81Z!1yX6b6!+cq9/k>h$K*DT%H&=yS
864tn6 #SJyKkC:TtC1XSlZbRCE/EXQlV#bbJnuGJE/kGBy$H>MG>/+cN?wPaLY##S:l56a\dm<*%@kiMpFhH>6
JC4Se< ty4YLKtS%%=<PYXEYiwmFJt8m%F9pm%1iRWp!Y^\YaLZ=VwYkKZiMA:6+mXN&Z4cuqWuLXGJST*=c?dc
t%Smdp 9aAklS:l%Ceny\DLdA#ldy6?!cKc?T=Dim@&cLK\tm8RQScu=a&VG8dYc@cZn:pFyJhdS816A8eKDttM
n*$n5E cY^GwJh::Z5mbYaGyCi!mB1pW=kKw:SN/VnEa4HtEi@$TQPHCTp=CIbAa/%l/T:MEKY/@pYW?1D\#LMC
Fq@*:w ycJeRuiZqL@=wRVHh+?uNLZW^NqQe/ljh+18b*wl6Deq/Y^J>X*Vpwh^+$yQ#VGcA^>jCSF%:84=Sk:F
Wmnpj% qE!YcAKQ#!tq9LQA<p<9=d+JRCV=k>K:\+HS!XM%5uI%e<ilHkSI:jV6EMT#XP>R+=jFaXW9#QQSJKKY
\KtYh8 1t$5PiJTyuXA*5pV\bRZ=86%@HjuQ$*hbm9!EWT!8#:9=JjteH>Sl%QIGVZ1iC6Db*\<d9Y%YH=c9*BC
<XWnuE QPySeQa:YDt#bwS5ndjPLW8=SqMqlZn\bu^\^*YR4=kMaJDcS8/a%*IK5NF:#ZWunhYikWP%yEe=nRX%
tq$$*p !cjK^JZ6$6#L#nE&d!/HP<a1Y^A6=dYPeqWEbuI@\Dcd6/t9*VV=W!judTyGk5b+Sq&d1:Eku\1Jwk*I
H!6/nS adHep1Xe6kyHKSh#lX5TYmYPRQYRnlK9^4B<>Y/8E?^kDl%cE=:q:nS#u/At@h=iF?*N%>VXkEXD:*J4
pYyXtK GjwuN8#=L$Tlu:&q%+eq*k/69%q>l&*Mh1#K@8n!qm*G9V8NtW*?CyAuY/H#mj<6%8jGu!J%iL$5Z^<I
@Au4Rb =5%kL>L*awD:t?C!Ypi8GJktbNF#6?cuuF9u*RlajlB596HW>+c\$y49jYiDqebVYnBIp<@Hl%e>B^IV
C\9q9H CDX/W5EYY@%ywiAEyn4YYK\V+b^?M%GT/RZ*ZEE1W+D>ylaZ$?ZnaG</p>kZGYheNIpS+/%AMBu4<5a+
EEw=R% B+Wq*:E:&cMK^Mkal8/j/YP>KP98il>X=pnqbV/<GIR^NjAjYd5*X=&$\4aRY!%ZMlbjQ*abtQj<:qIE
*XnVcJ mwcb+%VE\y\NM<nI8V\lyTccZ6JpPG@I1yPb&T=C#knN>pm>/IBQPT4Rj*?w^EZjJ^#TKNLSp6YP8iRZ
JZ:Fmh 88W9/mLi9nbGc1/#pi+H+VZZW=5LGNtDVtwqYIG/44Cb$NpFG4>@\KeW?D\q1d\=W!wXw%epDbn\5mK<
m#w/9c E+*w$PMMVmP>9@*&RF48^#5LJ+&jJqmKW?8T%\EQ%@%Qu=C+b8*eN<dC=q:\QBAan%^nkw9Pih&=I<@8
B!a@\9 @yD>6FY9/mj&=D8<q+SQ$d>GY45Rbd8c*:1pyjk*#!^Xl:^!uu1npGJG>@cNn$FP&8PE>HmH?iT?GF=j
S9&Hkh aI>!=NPkA:SKm!X?@dq9:>1q+cAjN@uwip4a+GWdnG!9/6ji5LP8%TY@D9X/^eiae#W$^@XFkkET4hC!
b*QnI4 Sy%&SD#CNjM8nSV>nwB?y1><TpchTRdc$Jb<%C$HLq%Z%J$>q@d!uIRCV*4&Qq%>Sc%\+B*>G4NaPWa:
=A*?9\ ^8JpjR:S<\Mb*K/A#+B^Y9Sl?M*E\wH4C5juNE1t1mlFM59$p@+LeuDBF\ei5@4jK9c5Kl4aTC1NBw<W
XTKt4D A%1I#H=J?k^>n&yV#6aHu4*b4lb/B%+6mP>d^Rb?Wm1/Aa*lj&l:ZB#b<Dw#J=l8PYby#iN>t8uJ%\Hi
=mQ>Ct LZ&apB#p*XRNK>EG@cGiW$Jdu@wt=\ym>5j/BKBadXJm\PKKjeR\btadL@*\HJXPSZ#LTj88c98M8dmM
yHHl*E we@19@Pu:WNtRKW+uD*i4/Hj=F=@Q>NTZTGtXT=d#PuknGq9Ccd6dm\TFA5ViL5*aca<XRb#uL\KG+$N
D6y\Fa EC%nQq8WBMt+@jb*P4lJBD$/bCKm9ym^FFabVybtj*CBiChQtkeE:Z%&MDmw:$FbHn<+9bmB1bP>Si81
+%QpJK hkB\4l:BLV!p<VanQAPLPR<M5#\tF?Jd>/JyEZNA:u\VRtlZnLGWF4/M6<W<6<&<t%!Epa8Qn4=VXF/h
:+Nh+X GKAecC*Q/y*9V&RqZw/$d59k>$FQB4!TYQh5Du<%hdqdw%/Gh\QN:9N<M8K#!cVy%hCVcj\!@Lt%/4<u
L\\^+4 q=iHJ6$NujhlEFb?P8Mipj$$^WT=ddKn>%=A?Fl^$E*&hu@Q%DN1^/*ZCwC?Ke@Q^hS=E*ZiK*?WeQCw
wb+\Gt !c/:!QhWK6^4n+>#6L>&cYy+V>&pQPJi?N:Wb/1YV\MBW^6<KC@9>lC8$6!tJtNbKdj\*+Pt>@ucY+XE
C/wI9a 4L?4<*5%4TJWj9nq=8c466m*B<KeF=8>:DqD*m*u9mI*8T=Xu&diA*#SdYDRQu\<MD+^acBQ?Rt9n#L:
unukj4 Tj@VkeKyJuN>Ee<XAuI@HhZGSGil^SQ^%\$4d?8**G*TG*c^hKAGaI^eV>q4D=mq$b^?\!^\JI#XqGiy
H\BIhP $4B<%1Rk95Mie*N@Rm>LWCih6ebe!tZcAtPjw:bp*cE1lkSebimSBFSXd<b<YH>!YG8p#=#&%Z8*npY+
lGJd@T ZL$?JuLHbN@pk/6*ZA6\q\@QZq!=B!BdN8\NA:!ajlCqhQ>nJ>MN>$4GipuVl\!dTWL^bnKZ#nwZVn?p
#N$ai< i#lj%/Z^dk4YS4L=VZ&+XZ*$:wQ/q?:$!6kY\^C!49IuVHtLFau?+h&VI4>SIcIL:4Am1ej$Hkl%*ChZ
6<PQMn MVFu@Wa*etM^wC1l4pHD$tE$R*DEZZSAPLd?LnbwTZw5@5*?yLhFjiZP%#H4tG5*l&XJRW/$lT4S/\y>
D@iQbC IcZuKm@FVE9V9qy^tAMidRN/pR^q>bZBC<$8=wZHwY1\>$X^=uDX*t8D^1Y4?p#DhmR?6TjJ1@whBZCj
QjtNbb Vbqk<<Q>G:%$iY/j19hjd%Dajjp%pFL5ZGAy4Xt14/dN*?FIpL@Yh!9D?$yHZ:J%^iY8G#VTW8HZ&lba
wiy5p* XjQkb6QH=QKNX%4#/B4Ie?4hn$kHk65<Zm:dbc*D^#i^j5MI8mEe5Ft=$:Z=YJ!Z!eS^MET4LElNbqG!
jAR8bq lPQE8XuR8:d4bjQ<^Y?b/L#9BP+=*uq%@1Z%LWbl/ENdEYhBGt&%h:iI:%WjljemaJHqdHNMDQSJwMkJ
HE%9IA cDT4CK*P^\ZahV>BiqwAkwPHKZKE*GcQ+GiD8lPRQtSQayJY5WnBCDpau/R6mqS4/k6JbaZBM4IQ>*Mu
@V@*$4 hZe#Y5>Mwh^RY4B^P5M<5q>me9^eIpiVm\41JkNRAHN89$!i>lJuDGd5wGyGEylV4d\w*pGc1/BnA>FD
bq@dY5 n+\/XhDJYhD5k?JQmiYAm\p?aGMA5eTIqE>T#LFY8uj/PTt*GQua6PiXjNlaw9u*4btC\48C+GY54p?p
%a&R:I T8qNe#MFDF>I<XL1yhKE!&\P4u=$5iw*>?madE@9<$YeTRu!c1&Wp^!?>VSGJH&GHJDE1p*Mi%lYYqB+
?W$l+T M#u+Sj1RTePWd#Fc4e#e:QVR$Ibm$k$F6ETlS^\p4<pq#iwp!/GL6+kD+@W4kWhkTae6u%EKLJa9?wKc
b?TL?8 ctu$AV=<RENS%kJTaZFBq#!VL9W!KNtDLB*ZP/e5%i\yJkiAh5DLa*d$hpMVj?wu>Zi@KB\W<+j4naI&
1G\1H/ Aa4=/kcqnWSAMcljhIQ//=yq^L@&deJ6W?MbFB!m+iEWBN&?aPn$>ei&b^:+n>YR&>=FcDV/T$JlEXAW
tp\H^e AR@FIdBdmRBF+9BRNAEB^TGSWBRS8bYHk/KSj>!L&:1GSY^V6j$j@P%py@<wQAGK*y/n&:y>P^G&Hkc@
IJ4XZS qajc18Jd%YA$kjmq@G$c96G!@j5d/GeJ@IZ+4/B9CaQBRQEa@Jjc6l<Cn!B8uYP?uGP^PCkil+aT$Km6
F8Fl>= C9FdFG#Xmpjl9q\pauBdF:aAlP&CMH@<^SGkYNRYb:a+5F$kHwYCI4iZKY?#an8B6\>jiLQNy/>@6&ud
1B*n&I Q9>CJ^d>lcV6GnB++l@=Y&SkCck9@AYn$Jk9Gh5@CAV$q\6a#DaJY@Vm6kwma4ipB\NFd=PJ&L1P\&/S
YpndN9 8aXB+4:k\N>1?!5F@&tEd:#/R9Y*H>8*IbFdXG$@&^aV6l/iTQld&@$X?8&S9lT^DTX8QeeZp4cABBV?
>$+\/d D$uab5Vj1@\u@k8#Mjk@YjMHwh5=Z>wB<#WL9Z*4u<?$qXCEQ!WE@SjP+4H@TiA94d:hRD5p+9c%LTua
ab>\Qt dwK@yt$J?JdA&+h6MjptAj>M&=RS$Pn9C9<mCF9TA9:T1D<RXD!Y<EWI6kZk4&t:+*%L+P*Dh5N@E+B@
qDn!Q: ym>5^Q+lBH>Nj?Rl@/DA+YjPnYTu:V$u@Q#qKQ/?Vu=jqbitY:BLpGjA>5y=HI4\*i\hB9t9FSHlZ!8m
5D$ElL d?qd/!C@hc\9LjWj<j+9FBEGkj1QI64TPh96mELl@/PI9uVRj!kmFQH@ymLcIuldh^C?Q6B&W&&jd/h6
^Kp\%# LjlFFZ:VYF@/&di4&^qj=G=:8uYdNVn<u:L*:#VSF\*$XSN>!h?1<w95jGW\?K@e*tdVN$L@:C>dih5F
Y\j\8y wQ@^EH?w8Y?cCQt%F!MSj>FEj&4DHVWS+m6%Z:n\=hi91!LmH#$L@dXb@/W1\1AJ9/!K64t\%SQ?1ww\
6+IN^X BMK@W$Xj/Q/#Kj?1m:dw@=dA*^:tS?u@1I8&?jm6mZjWSjk@PQdQ@L@&RjC*6>T*b9=u?qMZ@iM^98Z>
4i8hu$ T%&p:8@n8yM1?6+@GaQ/%/4wm<9#4#q<j!Zp4@Yl@\5jJm#/u#=MYNR9?nBlpV9+MGG?<!L=/k:?W^<t
Fq/mku DQcuTB^l^+%wMLmjI*E:I@E@S/J&*N\HR@kyEw9a8W:mV=Ew+w/?QXnEV=E@<4QB@8&%TQ+G@Pwq5/Yp
REDkAK 6pb5&K&&@a?Z#Di9t&$uti<heLCw:=%pMN6PY@?>p\\Hc*!^CGDTC<uHiy!n1QA!M!TdmW$:ZITyH51Z
e/jw#m $ShRVB\kceu1hZjTJN#lhaut:cb9%?*!ka8Nc5PmQW45XEwweR#/<Bt!%kYLlP#b>AE98M#+eXk$GPIP
CFWEKh q+JWN:%IL#m4JVV^hCKw6/VFZF^Nc6+$aMIZ^J6<\WYpSLhe<#hYTSic%p<^Glhai&lnnBLI94YtG$Z*
PW+%\T BWd/na6B4Du6#YQ6GcX=Id#wnH+Lp+8uG:A9C<1tDw:ach*%:8I+ReikukJnCymDEqIZ+ma<#DZ6mdHP
>HPF*b <YhmMuKb\R!p\qGt:DIFL9=W\pN=\<n>^?J8SXqZLL!6IDGRc?ctLl@id/C+c@CJ*GZDP:ZA!wa?@84=
iKQDIw 9MZ:tM:\up<NKZTW?@K!/=Vm6qWYEIS6Pik/+pbWqmSdk!>q/J:WmyJZB\NHFhM+4ny9yKntIkh=1tMR
-A?RY> 0003b67f713001202b4 Page 273 of binaries2.zip
W&!GVc MRCyFV*MAhtd*6BDdKmHpyZqA<?EVTMRVGS=B5+&5yA/DapK1b/dwhRC9W>w9&ika\ukd\k$X^C1SRJM
JWC\W9 h/F<8tT46Aw%Hjq41n@RCqTPVhWIcD:DLAkA?*%CIhw4LS5M/FS4D!GkE?&=>HmS@8p8Fe?y=J81cGZF
mGH@&m $5bkABqhTYE^9Ki4\VR=I8bEtyXpK#T\aanZ6*@aiMpI<aTwnHd^1i6iwb4cAke^E+&NG&Nut5jHXplC
8&ZbyW <mk1yWy:8Ttp>GdlCRPHY&NRP*Ae>1XQ/eSKm9cFl6B=I:uJJDuZ#@HTDnGmw1bu:^D::mkP+d9TRFNK
^6!MYc 6>e>uMjXuL!G:S?Pai$ddbMPhWFA\i>98M?RP<$#hHLK&J$:LthJIB@tmZw##9HK4SB8nV$w1hIR<Vb!
jLS1Y5 unk\ci4jKt*h:VcX#eWp#cA*Fy/yC8Ia*F*6I96cWP:1XFJ^!p5K=9KCDVAG*4nm?<FPa%T@?Yq:%cRy
8C@!cb q$!q<t&q4nh5B+HX9lEuVY??Q:N&#:miNm&#P9mnc9@i>&PN<5<Ee+5n:c6&GV@Ab\9C&!:+uW:9ZL!V
^+clQY A!>pCyI#M&ILXE*ANT=jKlK1un5J/:@i4*^=EF:=YaH8?cq$!KQtYwIcIH:AFmJe\nSj51#abqd@nMd+
wTJn#: 9ZST&ITH?=QmhCc@>A6y^n:<yk1Hh4>dStityV^<Sl<$jjNW#KhJiSq:W:wl\b#RZXbp&&4MyhZula?>
C=5XPG HH8Nc+FkjGhXuP\=4V9:KNlRH8S=/j9tC:e^J<#mKqY8Y^pYL?!N5$uK9V6p%u=NSdiGPmXKB%?aqN:6
Q4pJD% +^@bn*yX/$bH>hSPe^PDn<&>:\^?L8Z$iE$qjVuN\l6/4AI51VC8*1hGCw$5I!8J#c58bW96b1S@y%X=
Yb1TEi Y%l>It1X+m?kj>d<nD8Q%+R%1ct=JFcFl1?9!H/kbyQu6iMSTwC5VPR6@6N8QqS#V#@4RKp\u6j/$idN
H+VEy$ <IlA=Rdw+1yXb#:I#99yK:te/c!#NQ5mq=91+q>hE:C6#He!8TmmXW#HJ\44h9G<Gm%@1anNRLD9$A8n
m^mD&J <B:c?=#yTXjmyT6&a+<9C+&&=1c#$9Kwu>!$6>C4VuXKlh@Mk:%&iS6pZZp^qPeYNT5uPRSn/6Ne**%8
+D9/jD $+EdE?+cBIQAeVeG/VtBDJhbP?dt#y^IiuXID?SBt<kcdmYXqR&QpK<F%8=&ShXIic6+GLlYbnqbi+JS
DIXi5A qu+1A8j=H<$>QFIq/G?+CLI*:H1itFdj%uyJN>1Ib9@yaLpwBQEDKq@#h4d+d1?C1/lEy/ITcuX!j?9V
=d+=W$ =@L#NNuayjC/?J#qEI=8Lm1RekkBI9W5wR+Z5wwMqWZRk8B&G:1/:8#=\Ij6Fhci#mYcEBMQ@aTuty6t
enZD<J &8c*LmWJ<A<K6:6Zcy:n9=eW#<ZebCWi!uE1e/mKi?PC>ClB+MK<:%/t$Z*tVBIZ?^5:L9G/uktcVdty
CIBDRj WHRDdLZJ1d^y*uaucXB5aK+H1JZ<wK9N!>/ki9+aR?k?RqNHC19aTh^AFM=/j#EM/kw8NcT%9aBK>XlS
a1aVeK P1t>D1>TGL69==WAb:8%h9W1$Mqhy6QJkD$yS/Yjt:@R:1Vtb4!t=Gd+5YY#PBEi=W8%iR?VZLL%4B5i
qMjMhM M@NB81yFL!WA+<+1DBE^u$C^<EmYGt?i6=>cd6M!NMX%KjXYql%=Wln49KmF99t?8dXQDtHA5H8^:CBq
wBTnKT $<^l*aS<tXl:/eTiBaen\MmFY#t/uXLm6&<tJXe+X:$Llh&%6V6^MyBNB^Q^9uakM9H&b<Aq%NC8E5FV
!J#D6# S<a&TINXh?GQlI/+l<1?ykME#T=%T1Njiydq9LX*ZTXl6Z1NI/DtNEdQZ55h$lJY4FVea:w?yXiD#5qS
:DeQb1 /XuIhKpJXQPy+m8+HX5YI:iH1tWdEGNB=T@M%GJ6nQ>6dMpKSFP^#<mCVbuH*15mJq+%Zj!t?QW!9CN9
&bttM? nu#%P@*j/W=Yb1Zp4KIq<n+=X+>4=S$$8FX+Eqp49QE^ae!#4N<$4EHCSF:\:HSKn?XBE/u*@aXZj/M^
K&cFTI A=XJ5yJ9tdY?HK:I8S4Q:ia6ZyXQayXZ&6NE5*<?Z!HKdLN8GS8YZ@Bi4d\lMEP?1mVXjSLVI>nHqLH5
YPA<$? \GY/ttYtH^lWWYN<Mju$b#*h@aTbmc5%KbdZDq9$%QJ^#AmE/d>H?RhdmMp8i$ajh4GRGB&SmmE%L*md
$+/N$b :iZLeyd<LbqHZ*=1&8RYqX4h$eFJ4FA*XAQqH1=K^yie8Y8pQ@*$j6mRhdLP>iy+bQ8In?9/^Dn\@VMS
QeAlFQ k:j+uyXST:d&8G\6anDQ?1/ZW589+n5e%YB*??cTV%1THI+Z*l\+=h<wSjl+E@%/5\?bhcXW*pyH\FP?
J*!eKD F9d<+LT#%EXH$t8^i!/QcTyCN+<GJL<L>p?W?a%:^Yc@<IJ6><t*PleEqB:iZME<u$mHn99HY$!Jtii*
CMm\Xb E$+a#YtJJ>Hta#S<jM?XTWSe1qpQ5Ntw>Le98yp=9!^+JH89:hnhb16Hu@tT<8M%WXd<E<<5RuGt5mql
N+wPnb 4aWSG1w1:lDjKF/$hGP4%iqDYwej6El<wydb^CWA^d4uI5=bY:*1Lbbw15XBhHNN#^l*6SZWNQnqtd$Z
LEySE/ Q!e>eJF^NAhFteJaZ?BZlpR<\D#hXVFQBI!ubDXwc$WXe5Cw#W<#L#m9D6FhX4wbEQ9E?d&P/u#Nl+Ye
5dRN5E &R>?I5e1Z$SJy9WYF:%Q^dF&LR\D=G4k6ZEa64JpIIljN#bYP#u!TPLHKHD4NNQ$TQYbQ9?*X8/c^/qp
t#WZlR Xq*Fw+APN6bQ>8WeF&wNYR$uLPPEp=K<clXpyV^4GiuXS%ald*$5+&JnS/k#<$<ni96u*PySu*8e^:Zc
Th>?eV EQ/8^$5FVb?AXIckd4AlZhmRphEitwyF>I4<:WXljaX\L#uD1Lcq1nk*$CCHwi8b&#%FdCi8!=WB4PuL
Yy&5Yy dVt/Re^MelWhH/IZ+1nyA^*%i4AyEQWe$?CG9Q:RG>wi$u+bhwqWcbuDIQe!FLWAR*5hyBuGQFM6JZNa
T>RJm% ^9ptP/\JLT4^AJ==pBcZWl4K*VFF4<q@yj+Nb!CHFQWC=MRep*b<Tpp5KFCK^*lyQFpjMRS>A!!Tput9
QG%TaC N:J&AV#tNdk8X%R?Nt@<Yj$YF*8/HNP$dNGW1piH>AtAVLw4A*nMnQ#^@EXk%a5CYihqQXk1M#XL1C=B
&Q$>B< J4GcSF56R*8hldGR5*JF\PAIP:!VW@Q1:tmMXGC$NGh&NT!h8cAAHpPXAmT>LZCXq*=ju=HG=@qpc#DG
RS<aYL Nni@B*cDQ&DbJQwpqKtDGb4QnPKZS@d$SKd^%1/iek>A#qT\Lbl!hLM^eH#ERM?B%P5#8FRjeMLqwYhF
uewDG6 F?R+p?!+cNP+w?hAjj5p9K!BLpb\VwLeKER&aFHKidt@+N\n?5\q>TVbwNVT/J=uHV%TqT@FchP+/MTp
E$yPJk Z\^KB\yKA<:JLhFIB$W!WTLlmb^\RIZRZI65pJYp%+$>4p?qM%5#8AB!Da=!F:l1m<1%8KIpLy1KqaVJ
BE#k:a 5At1JDR@=@n$ADa5:n^*w>M+k@a8=@y>tT=btbpKjqEt1eA#1KD*W6RM4w\^ZMi\=M%Geh44<k$L#q^u
e^<!/D WdFQSJMHtMe?!e!epI$^jH6SAbQSy!eyk!w+\ctF=ZiSlHW5PDSGwkKiTAPLtMiauDpdSbb?E<lI\XHJ
qC#>Rq #N!tuLR%8D=4M#MShDE$EuBK1c$Ca%w6>=KNa4\d8j=it4\IZ=9G6F*k/Nk4PGaFBJdBF+Ca#pX=FDNe
hB4jPp jbRhNkeKjwlmuie984G:#X$&MF4&lRPynte9pqNk1WiGhS+c/T%QY\Imubil^Wn*j=RNQAy@?bk*M/<%
mCiPJ@ c+Y6/Qwdi91pIH6=>p1y@6iwEA6%nKqmR:Fk@!%TaBIm?mcWt*wIqu>qXIw@nWjZw/6/a/@!$>#\88hm
i$DaRC E=yiLpdm#nZmbW:m<$cmG\i+wt<mNBiq^#4ppTL/Ln/!RWeERm:BaYtG#<d*tpYyhn$^<MVk=**kM*Ze
K$ubuG $VeNwYStX^y$\lPn^m6:tFaD^i<d#5RwdG1y$h:Z^Xki\&\PacyLa:MpE4Fwa&6bPIAJ%T#Z6C+Z9JqF
M6#=bc ?eSA8/K<>TE\9KbGt!a&yCa\GEhwVF4kMkStiZKc9yQME5JpK/6DZNXwl\WGW:k+&bk8!h4RFyqED<6y
9%VIJw !nNu&J6pnP6*Gqt%?e8+?eqhJHnqHPGi5dZeSJnpaG%Sc<DSeX9uGlPP*?%MV%q6Q6tF:VG=%M@>1p$1
u9Ye// wWeKt=C5?Xa&/LM+cy@h:d6&ki#<9mteDXKEBnNHBp+hPtaq#BNy@Z&YGcj$hPQuAPhJE#:JGByFDYdL
k@lc\L 1mQ1pBThNqNTmP$Re9X^B6HP<\N!$%<VTeXMlN$IyNGpQ/Hy#8tKMm@h*M8@ciqtd15H!=WX%ZCB*%SA
FaY5Z/ Q>GFuZRPpZKNQYLP/!VXj&TQ><t>t@akDKQ81IkH@KaHX?5R?w*&Jhi/dP1NdK<HcLb8!AEMjRZ16w=D
hXNjyQ ><eq$<uHki>jWM=CL\>Cm\$qGXKqA%qqZ:1maVh&Vb\#Dm/S=11Z&eDp*qp!+A+dlb4!*HpuN!\Y$Yd1
&wu?^\ d!YIR5e#w#=RZk\\WVbpZ+C6%SNNatnqab%EP4T/=V6njdS^5bX@$R$V!upI:+Qh^^6Dd=j$uJTRue5<
ik$AZE ltWJMD5tS4j:dhQat<dL5t@e+j64SHM@W#njlV5jX<DG<YpaBYdMan5KA+?u!<=XlPY8WBkd#1BYI6=+
ilMnQ+ 8*Ei#iC4&^MmL@%/DIQjhZC8Lw\9SdBt*Ja?W@cAX@?XE+F6y++mFR=pDJ$98u?wml4JR+@mjijdiPDA
R<YL<j lbeSXFPJ&=?aLP>:^L/X&dmq\$W4ub$6W&%/6Muj%JVVMYiQ?pSC1SuYItSaludi+PWNiJm6VnkSlV&k
yLb1SY #bqZhVGQSLtFlk!d9qn6!H:tn4iKwc%Hld\k1%>u=n\nFdbYTw1^ISkt\^JRIeQp&/RVMqd8$5PJIa6!
RR/DPe h+N1\:*pMcYCa$@*<wXWJPb&A\wm:lbGSJwF<EqIWc5W$MVD%n1?#VeDu&\<kNYEhpy!VE!dyMaiyD$J
BY>9ba nc>I5^d^/u$tYwqmGy$N!&/Y=q?XP5Z6>@T>:I9Ra+GDmMRQNyZ:M6BS@5l!/djD5DCkhQRNT9SJpY\%
P$DpQA ^CCY>/aF$9VpHqk%$<RBdb$cY\b5MKG=aP/l:AcV4ZM==8+NL:$Qi@ppFW=b?M:h*NX^uWp!Zc=w=ckA
lmn\1h &mD9BV/w=RF5@8S4*CpMEa@Z#BAIDw%PP\*N!wPi1T9CP\qR>P=X?WV/\F>G8VGP!J/!P!K1^*E\Vdky
QGtIMA ?+k5thu!Q4+pnm>HlF6/=Tn5imD^e6G>X+J4\TF99hMCB>GpRL<BV=kAEb$yy>P!m<@aGu/TSmN:ZNDK
NVZ9dV JntVYDl/1?D6=/m?tn$ZQ+jMbEFh>QaV:=w^QhkNiShmY1R*bXI\ah@Z9PkZnD$elNj8tM?PA+=H^$bM
hPe$Rc CCT*1DNA?9%D=+98*Cq+R#9$?q&^#VZP8^?wRSiDE&npPn=ib8w5!N>VjEBw#<aD\Sd5BYS4lPA8tE%d
4dmnm! RZ+aGHlWqnwRY>H91=&QemQw!V=tZ1#HVC$nVqT@$C4!TJmP4=CRK=N?ML^^yb6$!QShjep$>uu85eWw
yC#155 8l4$lR*%4kF!u/^u#WLTePudWYwjK+IeQ%FIJ&QjR+:8mV>1y>iKuS8tTV<*y>h1Ab9!cQP/:mIJCEA&
4*QmBj e6H&mE4e@$AEDPZh@BD$1KPGd8B%uXd#<LwBwH4K+J4/iW*LyHV>EYpNAj>15u@>nlQWYQS@P$H>4&cm
P&1Tq6 5bn@^k4/*WyP:K?8=MV86JIV?=$6<?68GL>k1eQ>>%D<*+%<Z+F@GQpI?D?MjH>jC9ijqZBI^QeYdP\P
-A!T+S 0008e1719eb001202b4 Page 274 of binaries2.zip
11icE1 T?F?9kN#=E/N@*@!V9nHh8TI@&cVh!V18%*ipeljcEI%Q#@@pP&=Qj\jlZ=hG$n+\#=K?MMAV@mnnRq@
FQwHqM *EL<+^dmH:eR@:mF?NXGT9#nH8VZ*W!RmK@dumC\Z@@?KT=jyPed%=FI^A=mlQ68AiuZ*XV?5mRVShl^
%!#NMj V*jWV=E+\w/:!PQRQ$imh$bmjw=E:Yna^tF@npV59He>:1hI:M:LZZH+u!N@5F<?+ihI*I/VBnnm#=Ga
\wPu#^ ujjcS@\emhy^eT:?=#KESi!+<Bu@e^ucuqVeCjq#GeLkh=RE@M>qCIQh5XZ\Q=el#M=^G9A@q!EMe5hq
Ce<=5I &9mj!>CQhDYi<N>D@!bFcq@il&bd4$S@e@<68PdYGbGI\&?yhkX6KB!H<A$IeuPZD*B%@&M>>S<K>a9c
TCkk4+ ??6EyKGuu@eZni1!4bc*6BkPR>\T+/&Z^hbDj6FY@pG8Y$4j:865>#>CP9^eQQE:#+aS@m/id5ElY@Tn
bHH58D =dj$J^/HR@\di4ehJ=Dde>?+Z/D*F>Rnb5etJ/B@RC<KmWMT@kY>&=Nq&@SmmaSjwQhZXP8PTytA@TG>
tR>tcC iA#t*>C:yaK?$L9F8=@V?@M86i&t6lP>?Q<D9j?K9%6n5C@$+u=Fju>BySN*XHWE+k@yJiDS@+bi#Fj?
quNL!l au?B9<SjiB$Rh8R9<Wj>DaXC+@>Nj<PmMH@Rm@/F@pbE@eI4e$j?E6E@yuh4#QW9/EWR@1AZljkFiu@i
H?jw@d *:DaHX<t^J*/G&cdZ5#&EPdZ/eX5?%h8$d9%Vj5L>Q:CMAm%+&8VmQ<B9YkpG9%9>ANt&<>6t%+<<Sjw
C=9i#R @aZ?l6^^PEMp@wliNAd#d?RZ5>X?Z?nhG9D?qF+p+8ehD4Q#>nF@jAu5#GEEB9X9KEd@<edAaAm@R9E9
Du>mZJ nN:\^J$yS9?IalRPm@\*FKQ?$GpaNPyZKQ/F5S<P9VQF&B>T9N*j@\ZFmD?$G8bZSlFI^C?MHDGEuTui
tpl><n 1h>l=bFd4\Hm4>KLSCPl/K$&*CaaVeV<C5E@:*jd#6I:E9#*L@l9\D<>mHBd?kY:>dGBI/K@GSj?+$H$
LtR:\A :jQ&:&GpEQ@uE4h:#lh#BR4=6eR@dSSjmmV5WCV!i+MFEwj=iVkpXwbPy<liEmLtSL!GKe%@>9E6R*II
*J:t5Q DDuVTntL<GMTaHSS9e%?PA:\eVy4@k+ESpmQ&nFc*5MISuY^n4/kh$c!JdByh<\Y#JCI\m#H8YaBI<+a
=MbnNI DldZa1JcZ^DwdJh?B5%B@9$1HD\!wwEBC<:EtCtjZG@TmB6P$J^SFBq\==EV4p8E4>qHGTIZbRcKJ$V=
$$S<ZH pQZ\IK%mbGVBapk*c$>SDHPncA1PQ+m@>XVJw=MRb/%mpibi5p+*/<WLDnRqbmpwD>cYnG+IPR^!Wn?&
@Iy1Ad eydjlTub8wlPP8=qwp=JK4#V1Z!M$dnX5d4aRJMyiCL&%VMI!!jk<=mPJFBi#Ti!YSbTCBiB4DZbt+L&
S>SDSP $m/PWtPHECFCk#e%FFaZy/>+9Gi>DwRnknLdKuTyV?C%wA$G1K+aMLdRi/XEkJEJ*ecAGG=CCDLRpTln
4bD?>A RH?Ec\pDZc!&WFh%nP/6!+FKT$VXYbILb#hN5EhQIqI\h/R:$CjkXp<K%QunVW+bF!+G5K5JX*Kk*XM?
IS$SH= +P41+b:GnePSw@FS#cc:pBjHLSVm^tX%EAPNtJ8aRVQN?!kn6QI5jnA4?^:TWMVkcE@<Pq$+k%lN=Xk5
%IiR=9 YV4/ZIPcRu/tpCJ6!i:4It^#DK\!/@hb^ZSSt1wR68imS6I1A&bQ&dY!^=mlb1H$lpLZM$@wTdYtFb\%
kw6+*l :MFTVT*M/49TbCe&bFER5L?wBHSe+ZjHt@wYcCE4!<GRJpTZu/?@<F:PqFIZ!*dZR*JIpS\Vh>YMMW@c
j?h%9h IX>DNcXya:EulQ/VD8QBR!<E=!AtNSPjBPBS?TP<bd&\>Q1ENLAi%/*Bt9T+Ll:#^ln\SV5l&^=@5VRj
>yCm<t %d^I$*&a\S+PmE%@utpAA:96I?WHX:RGD#m<CVQJe4*1h98pI*hXIwhnQT8$9K!>5n\dqMhKiKE#!qDD
JPKTj> +e4Jk@idiL6c/D4F1!RZNyjyF\QyCqY&ML1d:Ij$LE6&6<l>1MS\:?T1ppS@*8wl#h9I^eaQPwejHS^k
@RVH1# Ai<j\P/ZeL:hheSl8YZm<Lk%@9F^=*8K1a%y>^VNnV!%SqR%QL4aQ@SdiEj+qub:59wn4<jSKTtID6#u
Qb4FHF Hc>djdB4NH6SkP!GQM/><iwM%Pt5WE5e:XCXkqMk@XuHaXPbid+Z4%ZnIZ4lmP/KnTu^4Lb+XFQV=*Z#
9&ATS\ ^Ve#h\a8@Yb=V%qXeM#yPZT@k9F9jBynH\>btW:<#yht&jQ1TkNWt5GE1hVYS4ZB\8LPd1D5bF^#M5I#
9uWt\S 4>HI<ybeTWpP8YL/bVVK:&#P=VBV8u$5C+jZmb8Nan%5DkEkNVkuHVTc%XVQKXD6yl+#HAZSkGTANMSn
8\B#VN P>Cd!8*=1FLQ<5K1Tk9#bFN%nDTyREA$4mN%RNHKAyVnAw8#AKRX*>F=IVXIt<Z9a4qeG6#Y#SWH4D\K
qVDbiS X8hHZ4Vt#Z=CPtNtl#K/NadR^1!*nDi=yVAw>^THy1a<Cw1W$wE$qXMmV1wFMW9Rb$i4+@#&milu^^&Q
4yym^L qdwYRN=6L*$4jpW<Ql?nj&i!Q6DLd$&m6CRJVHuJi+n/aK$/6KW>^&!EpynJyPklI%X\anE/1BC:N*!/
*@6y>S ynkG6\<\ipTJ+cQy1SXcM@pFmE1>l?9WNYAmm>GM:JP%F^QVQapIRVhD#T1S<hEWK?mEELKZ6VKD?*ed
nI>pPX M<K6JujY:5ISyP/1y=$^<FQ:hC5\aPNI:!u8F>KQbEy!KLul%!95G=^YA*PDdl@q5\^4a&i!MEM#eBAj
CLy/eW 6#+/@?F6iG4k+MkB^jIwnS8uu9p=/w/+Jq4GnBapP\bjhMe1W5cQW^59LR%yT#ja*ne>%dA?1n#Jy!Ib
$CuwSK ?!w/8i>R>eGN\cKu?lcbp@\K:+KG:>^@e#b=q=*tkiZd:4c&y!/^$b@Z4d/T8YtVH%pAb@AEE<8NyC6A
\:%1:5 unGCwp9kZH*uw#Q6V1aR!*L#/XuhYRiiRh9emSta6bjZknBT5S@IT<DcRC>t*a*#YdFWPa^5BA?MZG%/
EeF+aF eF61H8phehD/:pV4++Pd\HVZYJMSu>XWq1b!!dHCT+LJ+=Z*::ne@5%wa1yCyDL:h8Wq^&#nmKbZ!*QR
K:Ckp= 14cmi6tI4mM!w1NFFwW^qkXpd6MN^+Q!Im+n6+$:<p?duyd+=DXPNKN:BNq$%I*84hNFA@9%tWp9FtLw
%$4#Qb MCn%dK<$<ZIn9a:wn!Y#64pJTE>#=EJ8lZX>iLJBL1Lu\t*?icQZ%\?5jhyZ*u8GLP64k*At^FI8$!a\
lSE<1Y :dVJPSL%L!hH@6#X@L>i5whE@nj?+5l95R:@ctku@8Je!dh*>n@nTZ+j<SV=uhM+C4X#LE45#:E@5JEn
YMJQu4 pdmja*<eBBQ@9+AJj^@/jIN?Q@dBa:?Njd+NwddHQ6><>Q>YJuGH!AXI*Q<W8aBSNCPk!^W1^AcMut&d
jAeG+q w<j\J*h*B6bH&5pSBb!AHtw>YPE$ZWa/paA?MnSd9#S#N4b&L#KYy\8+yAZ^RcRq$$NM$!jWkLF5<GIB
P&!5e> u%kZGTFTjLF?D5TDWDWRbWa!%ibRq%buYHBK$ce*9\#8:5^IYL^\:Lh>C1QN1$e%IkTVc^iuQF4Pt%aM
9al1Qp i>&PJF>PR9BdJMWV%H#I=wkp4W8tcktVd1P5^$Yn%G=ww9qB4FMb%?8QF:Y5cCq^l>%\DlpFc\Ehq1=R
PhX>J\ +a4C*iJnlhIeY5*SBitK4eI<5Yhtkh#9\hH&BD/\HF4ytQami6qSlF@w&cjT%jal$jq<uqmTiR>6>bYQ
Gd#&NX yRc+wVm/^wBb5J!8n&D<LKqA>Aw+wiD^%hyDSV6Pe!FSmQ@*?#H19+1KnMX?H^ab</9>?K9<Id?8H9tH
Ejw\w@ hKP?n=mMRu/*Hi*PjjL:QZC@^@/wQ*?@C?+P>i+</+Z<jl@eHdAa^M=a*M?^&&dVHdH+Z<Bmj%A9+Si\
YNmLaa /B>kmV@Haua&iTK@*^F*B?#Pe!*I:@jE*RGL?kH&F?RKnh*bRwD?BducZpt&I@aZ=A4%A=qE@+Je@em1
GJi<Ru ked>D>ljpC9WD?RKVjkj5L<kX$nm#8&LRj\Kh8ju^j!CZCH^P@hBDPy@\Q/CZQ%\GIDB@C@kZ=C5H$!/
imK$D8 IVG+@\H:K^wL6:N$aH=F56A:G/A\9!JbQ*m4aH>B54A@MH^lj$G!$D9QD!P^1H?M<::Ft@1^%i^Q8>cZ
88i4D\ eS:/?*HiQ@!w9m>#B:9bu&5/6<4E+*ewE:QV&JGA@u@BdpdL8eXIWXau#8mTXRlGYP&yiSSkJAkXB^aZ
\QNw^6 XT6whpeXCVq#mA\1en5I*%$bYb/MLHhy!GF:RWQ1wylnNbpcb<!hu+GQS^>HtTaL9yduB+9QC/bj%phu
F+kt1n C%?AXtJiH>WYTIBuP#W*B!H4P$RE:H?L>WBXJp8Jby#J<:XyYK#nyQFlwmL1:<$^ZFRVt\/GuAmlnTqd
XFBNp& <IAn%4R%M6V1Kem=>ia#8:W*dhGQ<w$Yu@WPkiCmc<G$MZX\5mj1RHK4TQPMH%\w!cBW*XI%L4QS6G#m
NT>WuL 9RY:*FFlq8PRnQw:qWIIA%RVA%RZ^nwww86<m%c&u\T=ZLPTABqSLcTH*#kP!u4@8R%YA1!XGcXD>e6/
8IjiC9 >>8&RRi#h>>um$q@mGI4=q>/1ukmbue&!mQckLZn+qRJj@#Vl9jb<e#P=lN1Kic<h/H%*8+R$B1HK$Vb
jym&!6 !Z5I^?ypMIT@yybH^q$#Wc/M8>1\bC1QX/5ck8PHPy5E+:lhRpwa\G&&@Q*nt85R%5Fiu+iENhLcM$a&
!aCRl+ 8mb?B445T>J+BaL/4JEc1j\bIWcn/jqR4>$RjEB?QykAS9WQaX6VTSe$StlPyM<MdY4^KI*WltIk4QNX
u?<%@* ddNEdpE9CB9Eq%64tLL?VF%y%wkDyX?uk6bNZ15SpGFkK\:hi\@:ahkTdt^\=*X:Xk6pRCT/IKGtumdT
X9ldZI Z=LG1GAMM5SYjBS6BJGDZP>jt!lDZJ&R8$5\mE4?:Ap$iecc#$DHM:ht1XbhBqjC?5#NAnNj&aT%+5/t
SBEeNe Q4NNlT#QD&<MQJh/GHV&VZV!bj5Ll?QwNH9!ZJ^<Rey^1DQQ4K>kbHwEDMdyRwTJA1#qlDn$l&9E!ed+
XBX/ed I<mH#d?jq$1=y&&pwSSPq:=?*!P!uMe?MemW^<Fa/im!mW9i$p!<8W^!B=ERhm8j!Pe+iuRKE@9=m9ic
D>Z46d e88$aduDWh+4c!8J5qZk^cjwXcH4IkwBVT:DcRdD8*L!l8n!P4WCmLFnL/>et^kb<j8\Vpc8<\#!6dwe
+6#=i: t9mk@uII6/9^!5jLkRy5>1<Bkt8lGlEZGGmCJ%/4>AuNyXZIpb%H/^LRH#>Ydtm!TLR#&Xp!cC=Jq>a!
TN9t4N $GwE#Sqpc#FmtqNDLhBnZP9HX>dQ9dITIJABbMuDtXZ=Tmt9n4BRdEQkMYHGnjW8S%qhnP4Q$BYLM/TX
KW$n*V :n*6P5D@aN^C91SitA/Nwy!@>#/1LjJGCew4+>ReLVd?ctS6nAjHqPA^H:*C9a&qRXZV<*LH9JBY&Bq!
bn:Y+Q @ZlLAYFbSLa<=mb6Em*l\PPq**qE#hPTM>Wad4Fi+Pw\*pm9bItRALJLTiIPbmuD<T5mcQXw<#yaFehl
<1$SwB =9cpGNGlpaejqw!jeB4G8G/WC6&uIXeEEwDm1\YmRuV:?mG<hT>:#>>iQlDG9DRuT6eW^Q?TpM4KwCDj
t*em!d 9D^6GZ*E$@TFbtMF@YZ8h:@FW*b4!+pPA?/e*pW\QWi+=Ra+I^b#Qm8IDc**tqKZJcS<^Q?1k5y<\89B
nl**LA ?!>P/Ge!aMMcdlS=9@GqGTCY>t^?hky/G<Rtqh6^51hJ?KX#uqM44uqy:P\iwW=!#?>>m8JqE$PK#1bi
-AcK#^ 0005676bcce001202b4 Page 275 of binaries2.zip
C&WaLA 4:!nV=WQtEu%u11W/#w>upH4MQhAGpn@i/=dV^R4dZlmwj5?eX^<G!ZjJq<6:6/Xq&tCp?NWW%D9nEtb
5LtWyi ^=u^n#j6SP/+$atXLW+bCJ^?Y4JkJEB19hj+FQ<5E+Cp@/\J=#a+wubhC*&<baCTu^59J!5In*%@R+na
XqWHD= Y/aR?aA&nlF#P4DZqq#nj41aa>4D658RY^<9Cim4tn:C^ECDkjT$1Hhd*lykaP%k+Il46cVyt#*:FDFb
<QG!wK MP<SuQW?%&Sq+FGHS4QAW@NaBlyBj=uZw!KbALk!Xt8@+4J68:GmiVXpct<y1c?NJn<P&Qb$k+/=DTTL
hwH&IS AcHnuWCVDS&lTdN\aP^Edqi5PYlQC?=+\5ci#lFTcHIF5MF%Mq45iFC5dq#1^VLduq*PB1:XycW^81yq
K6c#c1 N8XS?$%u$L4$<JIyJStj\TCNmNTqB\ki%mK&pmMW=w:&+R?e#98NK4GY=X&&Bwh<>ELdHFlX:>85BJku
Xqt5uH p*AM*clHhtLKh468=:hwTT>#Fd<KjTb?4@Z%&ISN<&FKERA6NuN%CuK@j8Pp6FVXuZQuJVejc>@Y&F$4
!JNHm# W1cFJ>J/*nd\6S/WcK/^GdpCH1XX:lc@91@VSKt$=WqEqK4W:qBGnhQVeaVN5HpJFFPBQMK@Q5i<9B$h
DK$MSR pkR1k=/n9^w\k=@5#*dN/F1G&hCJe@#PbQjcd*l^u>C:!HPLuNiWA$+\*+wlHi#Rn!4ujw!dDi1*8A6W
yhn6P@ dCa\T:dN9?<C@?/n@L#9llZtyYnP>KmmyJj@ZX:quNu<=N\cy=Dw!A6:cR\iYMSHQl1yhD6uj?aiReBc
j/K?F* 5D#=5V9pLeLk6l55Smj5m9lqySPnGPq4Bi+ue=Sq^t?FR^@QRMn5EeTwAH*GdIIA@W\F<I4Pa\CXu9WI
P:\w%$ &YA+AlG/LEXpE>AR#CYe$J91Dinlh#A6IBePeZVHJP:&iH@W*#NZtN+n^NV$>5Md9AilanDYkPFi9A!j
/AFP%p y#nj/bk$!6G>^Tm69NN9L6<RL6PlCEnXu$=$!b4MRkaLGD9ucCXNB15jNuYK^T*eXn/:WSV55EIZN9A!
6uqPG8 +Z/yH:ib$984F:M@hX9hMRkAmS\PbG\QE459&iHuj!#\P49\t+5*&LKRib*8Mb%b6cbD9uG1NWeNp#h5
iGPA*S ^kqQnijeRk1VZp+<HbhCQy%BnFSBbBGyQ4ZHXJLin*59iaLdd$6**^#9M49cC/ayhS6>&FA*bIi6NT$M
w#<c8J *SB:e<?#?BGX$^=y=V4LZM4wDD/mj/=?>>t:W$L%S/SFYuY6Bk&Wdukhpd8waJq%dJ#+TiA\<#P4t?np
u9=ARC :LuXWu*m$N^4^iR8NynyC\jLXpp5KCD+9k&PE?9$tPFMaNF:CupImQeIia=469Bd@&nkciuT$m5TBu4<
ilJ9nV 5F9%VNIkmKa8MAC#l4J@e9uN54K<VRn:XAZ:1dwuw#i1KhBu6Xj+EGHGHQ=5lZqdL:9uK!9Myu65WkdF
Cj4h<^ Xpi84+lQ&Y<Kqm+WBTJDBSc+QK<<W@B988%\jP*/e*YL9V=nm>ZDJ/K>jaCQ>:M=Z1AqmB+%V$5@I4Fl
Q@NqkQ DDJ*QA/ee&%%b:#8^/meyAWKijdy>BQcpDlZb$u>TMDDNIpA=ZYCH\jtqS9wk464HuZ6%K*K9AKjaPcV
Q5eWpM kHYC^ZN*=eZI8Q*Ky&:%%WqcX*4muEqQcI=4Km?%YAXEGHMeDhtQ!uS4PNp>qjJ5%bm%&m&hat1mjuQ@
@LT4iE /<VmFuJy^N^cq$@K/<hQNuXq1hWqHWV\SK<++JC^:j#nw:%6=KQH++&bR@!iS5#Y4BMaWc@>8P/ZLJjE
HZynqj <ZFI9/YteLMN95&mn!^&d>8k:!DE94?mY&RwSXyw/*tWTwpn*\aM:\MQRl=FLl%qE:SatGXulS=h#PG8
8a/h9C mFkaWmbI&ZGuA&mM+<<ltQTieJ%1i$+dE^tIPMp5HYq\W+C6PIP&M@%$uBqhHY<GMKBDi=SlmF=/1emR
4Cckw1 k/8tN5B*9u!1JQ/&bu!+pT8cyWhcP&Bc48i/M$jD!ym/dyA18Q=/X<V>lDmla6$4L$d5m#L9Xneh8cY=
NEt=<M <qkPXF>C46l<JQHYF>p**DZFXnD#+jHlF:YcScu$8TlBQ*JCXlyqj\QeKLdM1VnBYIPpV=$X/jNpN1JX
W6q!@E TwaaNpAh@LkM++H+?iT?yLqk16>dLa/uYt6GDibE5W<YMWhbKa/q1c*KL#=Nii$i%Ykl5m&9/PFKHljC
qymb#! @Th5tj!Y!QV&^dCI&Ab!=hmcKK56hF1@=BQ+?Kc?n@6bPjKB$ah:ycc\qBEy5emDLJwE:@A&Yu6+4LA^
m+QF9# hEVSychSQSKFdI&Knk&ZDeFFNnPAT$wLAl/S!C!SFPYaIWdS%\^XdQY\P6/G@q$h!jGm4^StTBe/baEd
1kE\Qi qXW?6IpF6Wb$CT<c:IjlLeDuKPYWV<+dq*QEPX:166w<dpkb4FJICI8GC!wZbh94?TWYnJ#ya:8*mKqQ
Hk:<6c LGFaPW9p85#&M8?AZkt+4eP*/%N#+8@R?uLHm%hq^^Z\By8hJ:yIkAD9aDX=:<5k48e!XT5K\dKmG^<^
DC$ZXZ /q\!AB<61WeIM/d$q&ApN\<!$lVbFwlmyEPS*FDSMWwcNuk#VM?M8<TFC/yWMqNJ&<9FcWJMC8:quh98
TAqB<M B%XG^>Zm?X>SMIR++*Nn9L%%=<kFpbVHEe%6R&\5mXC!u@HL?4P\SSn6n5Fl@::R+6@bY@?!AiJ@VK>d
:tJI1F =/m6:!Zej&GH@j9KnX@d:\j%5@%?#D%>*aK@daD&6>4\@+*XF@@hRlep@qhZ8u#:e9#uN?:**@SjQV>?
?chEHT Qu8DJj+e?!N4L\:^e!#8B>cm:^hY:IBF+*jGwu+Bm>#b!9#>+wwh5Imh4YQjL/@+H95Dy$@p>\55h5D8
Jt?Q4V 9EWT<95qFn6kMV@kFj+Z5D@m%T@IFiaH>l:eL<nXD>aSIQG@IFea=M:!nQ<F8WL@\Q1J@\Y=?1E^EQ<L
bFqa^$ k9Wn#!:<L\kYH4G#RR@@C+KFIj+A?\8CleH>kPb@LHXD@8q5>8MJ%D?*PnQiWw$:GMH\P/^&R&*95ju@
N@!9kn S#PwaHwGDYHwbdna/VnacQwCPaVw5hu#W8T8VmtEj!n?:NF1ClLmecJW*S^/IyBBDSwcVyBlJuc+8&/e
?M5Jpt yt<P*JXuY*PTJaN@j&i4PkJ@@*iDK#FuhG=mbNn<?WENn#c!&68GS5<Mk^kbcHV:y\kR#p?NN&/Pl#&M
iVEeKX M5m*9XcVMKi=F58B^9DHL:<QEkKY#:n!I*&<EY<cC<^WyZHQ&l:inb<6J^P\W41t:HGF#YRq*G\/ia1l
^nwD+k <MR/mpEP$Ze*QwNncdSdk&VG1j%MLAnCK5i6!<>Ah>1jl?&bwDKE>TJ<9>mq&cwA=W94t:pR:CDWq\hD
^H9p9E AjRLa6IV!IR+yJu>NC/1$WWTV&e>CSpe/@1Np%YP*&Q/=1^td&XQJ*yFJZue=^H@aFbJIcLy^a\yecnR
t*X&X# 6W4qbkDXhI@8St\kJ@NaTJV?4e\RB+kYJb&MnXN+u*>TbyWeXAYKFyQq9<QS4\1>9JG*TP^<?6J=T4PV
<>\Ft& >eA?:belPTKWZNqH#GMdIYYni1@y!=DDI6pY^IGLpB\^:HDd4Jdh!>BDK1ttD#LEJwMuP>Y$#Lq%BRa+
&jEB%\ jdF+G#QSF!+Z^1h#>wHujcIFXEcQBK61w<:i+^=^$1D\htq+4+mbwE:9n$4b\NH\5ayC^4u9N@pP!<w*
TX6Rl* #%A?a4FpmDRD8b=/R=Xn+mH@eKDtk?QcKK$dj9b*!@kmudqRH@bmb<?<WdJJ@?kt4>y5Z8YLPeCdD!Ed
wdclSG hW6@%G9TVPRchwE:TQe=^#:laT$Gy$ZweE<j\b8I?F#k>d4:%qMj>:\dij=!l5Y/+C&l/uh+%u8=PZpM
h*L?w: AtWcVu+EmA8Q^*CQ4JB?SFeBa8AMMKGBka/n@@4Vn/Gj$8Qwln:ihd&u#6HQMND6>Za1M:SP^+:thMA8
iPuQA8 C:uHqtMlX@4^Nm4MWC?l^6B/5n^R9&yJYH>+TKhQNit\lZ?JnaSP8BM#^EE\QK*:Y19S<>?EtF:aCN/E
N^DqIh ld@%Q@hS?^&1qL<pScdP?nG=e*=G8pbRe%\%I*mV>%NGq\PZ8dWtbRTMCGZ%dE@nMR5+\SXli1^C!kD8
9thu@< yu6?F+9WAVk=6&Fe>TNN%aa+wECp&iL>qZEKF4Q$kFIe%>w#jn4TSK/6<lJRP*FRL!pAQ58n*9R&Mi6D
+Qt<$4 h$#h^@ewn51^CS<=X?Ael%R=4Q1i!@Wa>q8SXZG!RlwS*q4>cul==<PbHP>nQcTMqI5KX49MDV:HITak
wqQ+n% LW?pG:Mn:Qa>a&+4DqQ9QDpnbb@CIXAT&R#mYIKDVH5ltk9t*FTwQaN<N$BSXN16Qca%i8n*tjb$Y#cc
5w\$L/ lpQMm:@l=Vch:+qh$<ipSjHui%Tj!Ik1&*<Lmm/%TQaiDR4VY=uq$*8F<V^XYG4C@E1WD1N=94*qEN56
@Ga6<: ?qyEljX5!5YTJI@Ieeq5LVt*Fmkq5?L*p1iII/iT%9JbPhQ:i!69Y#b?Cph=<ppuyNH*6?yu%H9!1E&e
jNqw4E T=JRE4K@Bdl@we8CJ:*+p/bB<@Zca5&pWnJSn&ZZLpHmj6\VP%$4:haBE!qMe1ctZ<FVEc+m1XE<Ve!e
GBKW=E bbLH6EqZiiei?99bDcFGilP9W&mTEl%j98Metqk<KtSaaSnC<SHn1bu45a5@M5R+9lVR%=&BbZeKEaE^
\W4Lcn AtatQT8cDyX*jVS6iQ@R/YBLtA+>H=$P9@6=NdL9&wMe#uh<?w:9k$>\F1ZW8ASMtHRk4Nw9Ht8%Zl8@
Ip6u=R >@KV=1nNk%5>GydF?p<!S*KLLE9K9KqC^$&d+p@pYPWYX#!RT?Gb9Y$/!Xw<1m=SXVAc%4R?dkMJ81p=
Yw+pNm BqJZSN$\!?i1QmKbYwqcPmu/<K%YYmy#p&CJ+&ZtVj8tMX9>y9XJRi?B**^SB\<CV*Mn:1w$+1X?:<N%
@Di1k# !/cdBXcWiQTR:eKa4n6<DC?tKjPpM@DIt8mT&:h??R:=AMhu/>9<ebnRW$&RcWH4BynYTee=?IjDp+IS
?N$MG6 d+Ei#a4*yElC%db?1mpX</KRN+h9dSVYGhCpPRD:JcWPTVT<W4G$8ejJbbLkFtCw>y96<aLBJWXdn#W6
MXa<hD qj\FB<Q:WRwMID%W9ijWuQ5MXyht>qM<4@AMZe\?jj/A!w5T=?/6w9$biJM?mQiyYc:jX5JD!uww=lqJ
<FFhwK >jX\%yqL9\tKQZAVRAdLZ/BiFlZn#Ewq:9FhKBjPK^=\MV#+AKZDPZw1/QB#p/T#^!ClFXmL4w:lnuKD
5MLwhH t:Q&eqZmGnH<u4+aR$Yk^jwVZ8H<WtamZ?QClZB^iV&tZ6dBAw18i=w?CP1B/ekGAp#$eFa1VNA?kXDQ
id+4qe QIEAdh\49*m!juymd4R<hja/j$up%C#Q^ynt1nW@JS+di99qL998%&aqCeBGwZ\#^:IHiPTp&juJ*Wh:
VSGAIZ >al#mNmMenYTuI9V5IZ<cdD6yAGLmYCX1/@Ya!5di@p:LFpt1k#uY9Mq:yqh@q&LpdVY9DAGG>T>^Tq#
DII5jK w8@/*SH@P??Q*pcKb&ii^?bd>LXQi*yXQ#<@q+6N=/IS4*>/aue*Pnu95>Fh451nM5VZ164PjYJm/c#D
EYHb+I IYqP<NmMi?c$Dm!Z+&DhBb8Q/V1a?KKm?64JL:QuCuPVc8*V%!aGhi5duTq=wj8y>$%JyL/<V6=kVdW$
8=&VuH LI?=bnIu?wCt#YtWFeVI^%V^$*\9m\SuDX5$l5K1%uZWn1>+NT:p%NP^&y!ey#G1QBP9ZT%Yj<8:p>L9
XL8$8^ p9hR&!D1PI>#YcLt$=cpH9AF@:IXF*ZKAY@XSKMQ=^@Sjuw^@5qw<wH<kjh9ApdPKc*yjjc=bQ6YINCT
XuFyqY @\X=MQ>%dd#9iuY=j518M?>cni@aVCL<#*#8Cht#1/X@VuMjh:hEM&M@bRGZG:Lcpw:VT1p5qSFyqitl
-AG>ji 0009cc131b7001202b4 Page 276 of binaries2.zip
$cFbpl L/?+GJ#lIGbnt!P&ZCdhGuQcLp@QyMtheFijD!#i9FhK!^>HZ?<mK?wlPb98&bQ?MyP#dP4YZ5Z!8qP@
+N$$^^ #X%GVh*K+htnajn:cPnd*EiieZ=^1^<j=?4Sl=**@8RM>+6\4e!SF>S+*B!*1Q?GTT!D#i9AwD8i@4CB
w:RcW* h4XBTSu4#Cl6=j58da+Jbun5M8KC?=un:LR9!nX4$qT%yaWn+\41jENK+tW:=bMQM^<CqpW/#B5/DMk\
n*a5!5 /kI9^%hjH1H/m1=jim!6:=/kcXJCyZ<>46qZZDFye^!G/Y>\$Fp\tnheK9DB>D8C*V+B%:PH+=PjmJE<
k?6t%W NR!jc5u4mttCE&W>a*TBT:RaL?Dyy^^HA8DHT5nThd#N:Jq%=I@k?PSV>ZQ*p#w8m$&DPV+?<Rq4cy5&
y5mPwM iR1:qk#a>CTh9eldZ=Nh#CB699<D6=ntd^jiX>e#6X+E^w%mn6ZJJmh=%F@W+k4euSu*CmKJmq5b$qwC
j4P/M/ Hn+^h1\?**BwSN?:cGpFcqmT\TQDPm6%q1h684p4:QT<cm5uS+&tjdP?j1hBm1BB!B%ZB=/1EQAJMnDJ
wAe:VR YY?l^aR/XFZY8*>q?5bFGV4/e^k!p>+cB&a$pihm\5WX55F1LBny#ZNB?Xl6TGd5JLm@TlkPAqaa6%/W
?ZCy=S 4=cIwbib>F9:uZ<qGV\/BIdi+q4iNJFhPqcj$F49#eLc<+kD1n:+TSY/q8K%yn*nduR4LA%P1hjW#P\B
YMwB9\ hI/&WX$QeC<C+/WtQ!Zy%&Z/PDFu^t9i5cW8:ZM^>Ha*^M>^:Ln^B^JQ@L>5yQq*hluCj:YlBQF:T\u^
:^PyBh q!$q^B$6JaV99\+J9:mjA@L:Fe9ja*>pbTGkj+:FEZ=RL?aZ5Lmh9/RJ&F@A@5A@:j5X^D6kpV6@TSQ\
9\&964 Q<h8L\@iEW9+PSbD?MH#Eu<B8@M?F5n9X@S?n$Z99CRTTj\F8WL>\PyA@AY=R1F*=lZ^F?V1l^aL+m<I
wZ>c&T %w?5DpV5@+DF@R@aj%whCImjYl*\@%pFl>yyFS^^y#%&mF9K=Q?C%THqSD!hLmVhZX+wJbb&6C9MQAnX
G4y^mG \VwT#WulWBBquZGtLStA+Qua6EW#AB%J$AJ!ia^c?yktIX*9MRJYiJqV8=wJPlLq$cGJKPJlDamiLMn$
NFKy<S I!byNa&1nW%kIQ!?GmK>BbNT@A>1D>nqLE:LCW!DJX/Gq45nBEBM4!9=C%aPRRRNV>HJDjkSlJIaabqQ
XSC>G6 !VqM5MEw56+DH^/SNCbkb%LAVKA+@$Ty?4*DZV!1lJ:m@LQY9R=Gp#/qwdP6S=&abBLA6\MD:uQ1%LHG
Ml96jb Z!wu\AMh?j588RmRy8m^kyaMuj4H>@k#\Re^bqEyklY1JTQ9IWu59S++IdNZNqEBE//X$t&W%mim#:qL
cW*dqS qtYT%1pbF$:\R^wTbYNAN>kMKM9+Bt@dbeXp:@\bSaTQnPJ\p%h$A*<qYF%XCFlBCQy<IS*WpwFDiQXC
J1PSZJ RIbXW:?J>mi6<<6huIlmdXE4N\XhE>GM&<NRFTQBZ!i19>/X$1qEGJcaR=t@KXaL6u=ZuQuYYilc!w^:
@R=#Xw X4#Saii1/:+aH4n&TDlbDHtmZ:44Fp%VDn6TqFYc6:c/<p+bA+6lQkR<1:9%L1wmB/4W?LibTq+WQc\p
%+m1Aw q64pbTPPcAy@1mHX>IwHCtb%RTH1ZnGSqiQR6:t%L9du?VTdtah*Y5w=uh&N%niwWhK4hcy?SSq>&dLJ
ATW*ZD G+>C#Gw^$GElA^hZ:CP9*WXlI!CIy1TNt:W<H>G:p^5HRXe5/eC6QWned<hpNIQh$l?X??YX\>Tpj*@M
^ADLhm KF55@Ptyla>4qN5>n9hQwKa!5hX6<l#XpXh6YIeA@LW<eul:HciJPm/X6KD\<%mp+q:pRQqdL?H+lk$>
e&c$Lm dJ8^>*p/SX?MP#@\RK8jJIQ5ILhGS@CI:hW+&1IZK1#F8\#EWny%i/:8jW%\Fbla/d+Ip+9lQcbTJ$wa
EX:ATu Q*Pj=bBwNZZbn\Gmb<6:wYlyp@LT!>Nu1FSnFGZ5%\#&NyympPS/mJj9Z^:wEIRG\=R!kM5A>?h8wL+W
\eZhdL 9EF:8V<lnudG>YukqDXFGp\bky/>WN+RLVTy4:K+CAV4h\5qBKq9KN@#yn+>*Tm/%&mQwSNyBtMq?P4$
KqF##5 =Wd<yLiyM+a*X/B/RAcq1GM\9M@u6c4$@SQ>TqhRw%iGQ?pNP=+!=D$dEy^8Dcq6VjCp9lY!V=tK*\AW
Ntn!BJ aMBKPyGaGdd5TCpHGyID6dbwZPDX$\ujQWb/GMnt?Reu*85q9jPy8:q+Ta%py6=Y!Fah8=thhhHLSJ5H
CFR*WP !4h=mJ:Z$<6&pMl&Bb98H>YMNuT6ZqMSZ*lqh6B<H/AA?q5d8abCPTbj=YB\wZRAbH:w9l!%h!B&a>&h
SZZ95! /qZpt=RM\WyGNl9pi#I\5A+&%bMNuQXP:S<kRYR%aC=e1QnE8B+B=W6PaElkBBu^XC59@Vu6*QJh?*TL
T=1&L\ G1A%KE&D?=IX1RBPt=*5QFkTpn1E9SpnMXDw4BiRILY4w64NqJQ85EN!QE#tyAZJn6<qVcH>D4a<91p=
#\S6QS M:NZh%Bplm>5pajG4ECY8c8lMX#ClbMKb:6%i\<tD=B6W=&dJ1He%Z&Bnw/qp#pu1d/bpZb/Wl\B%^>:
HC:Jju /51Z!:??K:<t/RYkS@CNc!bLdQ9JbXX1&$VajjPImVCp^&i^t=FPbtPQGLq<44Zem<FI&QYuTiiw:P&K
T6tZ*m LM!cWLSBZ#4GJ>B&k^1Mm!c:^be\DTPh1@9$#bC8$u4pnA88D<QWP9DKdV^\ei+Vl<T#d\^1SV64eF>Z
XFII@> ZTS1!JwuBBjJZCJH1T8L%lh<uHp^4dyIu*N/V65:eREimNFn%LpJuY<@uSXWM!JKDGu&tL=@Fn=$bAZc
KAycYL J:p:E<X#DEJ4WhG\+ED%DAm4:nCRtihuM^5>=w!MW+Pk8dnF?5l&NDuQ48CYF=qj!AE=+tnHibcn??J$
4y&1t? DuWQ8udbtKyCdNNAm@^hF/Y:4ctXR%Gnn6EXnM/ZYEF666ymMQ=PBlWjL4$GlG4E6aWI?>!u<YhpYd9c
hSA6Me Tp81ZejmM1XwcYQwN#pNpRjb^4Sdan5t^u$?>C4A*VuF81qN*6YMeHhZmS6BA^>6NyZpPY>H>t4RPCZ*
PFi/u6 FaVVDP\ctdM?6q@w5MN/@lWXX&@VpeVRKK$FEaN$<1C5DC@bdaIj5@V^Bp*DCdEpKXG/@ZR$:RZEeD+G
E#^5jR uTbMFD%LZ$G^W\I?j9&P@dT\XdZX5yCMKCy4>Tnh@mRHud#NViHP5&>NPZm:+n@Rn@YZl%#9I=YNiG9E
5Fl>p/ =6A:W1yjmMHjiP8K6CnyHw?/S*81!GHqZdkCAZu$%n5NW<e8tSQc+l:>yZ5AptM1N&6eL=Y+TFALyLY>
BYZ86D c<Vb=q<bPTJ>Dy=<t<w?IK8ZNipWTtXllbR\iw$F>b9WJky/T#?bB=!jm&C:K6c:MMtwYHDNX@<EpCRu
1P:^i& p@q^*&b#i?t\JQ\6pmHb+NJSm%GwCE?Ga4:6W<?:W1y6#cB1hG>+LnFHX:JkWknh/!e*PYYK:$8NM&eX
DSNbZS %E6T<V>yje9buE8:w8/NKeuMCtkSk/<&YE5*Qc6=P!cERX/\VF**ea#EQJNj<e6nNu#y$!#WJp/G1=q<
4<1/nk GPWEP//MSI*TDeVqPLE&Lq!4d/PwKT/G/?\a9i8BmJV1?%nZhapG:j8HXPyckRLuV&m^FjHQWdDZGF4P
k@\DiL J@EeC*&EYKIVQZM=HNiy$IZ^9^$>InqhlXb$5@E%QCEbtyFwIRP!Eb%YPB^TDl<#XD#!=E#p^8l!\X\m
pu5SPi b@Sintut1jQeJqc@/>cp\pCmmttq#FRG?jhYISZBnm&qEaHn/y^GWXWbF?SN?@F>S\@R>J<S6&A:^S>6
HPSX5K aZy9W:pATcq6IJE=Sn@t65&WEiM6T%nQ@:=1+4%?XiD$b%?#*@V<:Mec^#emhcy<NiPWdn?:J9mE4Z<k
L$P$i= 5DcN6teX#G:thEb?Ih=X@QbB&*YbF/i5%uin&p+^TwkEPB<Wqk8$9<@uQ>B4h8&1Sd+Rl&u+taPut91p
QdQ+?M bkVdAyp1Bw^q?hy9N6=d+eq6VbQui&FX\9KbMRtAR+mBu6aJXjdQW9DX1D6XM=R:1>/9DBcI++p9:JKh
dZLq$X X448h4!kAE?cuQYF:a$@aiF<j#<&jb$wFw%mjZBW=K#Gm>@QDDdj*>?y^<*hL%Nu<i:qndulu4d#d*1$
LA!VV< +q/Im#yXHY:wwj>5E9@bFXQjF4SR6@p?kFbBIdM#wj\THTAe!FbdB4e^ahXp\b#4bDX>j4qKh8tPTjP:
PF9mk6 ipFWDiFlW8y5dL!qZ6FSiZu=!6h9b<mktW^tBZ=ZKyuby<Nb/?%h>btH1@VN6!:4?*LMJZ+Kp>8e1^Wd
^<kRKd bwm?9td8:Te+BH4jZ$$A%m*%Fa#NB^R!4t:eyJKuney41!h%a#4/bCiGp%d9Pc?CEe%k%w*m8bqMMh9$
u<BMl< 8KSb&ZM^6GQ&#K>SAjy4AecWSMG#B49XF=68*/JYhkib/Pd6lSi>/ki>b4K@wdZ:hc1%y>98<!@w>#MF
?wQaG5 MLCSS^=VqBNchRF>4FKMnIc$F5pD=MhF1^\QpjENZdi!Q\><nP8?a&ppPLL!NmES46G@jP8=%!J+wYjl
mJ*G4T wd9tkpay>VQDi^&**Cy^S&1@eHye9+B<&ak5wF$tN%GCn#<&pnW\N?=FRR@n?58P5aKS>Wa*ZHLCGT?6
PwLq5d Rt=^!wt=>ZDP8<Kc:#MYwudS9==qN4bCbM4F^>>jyiFXWFd*V>m*#LD4+lpu9&c=etk+HSQX5@^>+IM>
q%pRqA AeLl#J<KPYJN^T>A$*WZW^dhb1m%eE5#+^LjK5k#%uN58mDF%iwQK?t>TX%XF+Jb?*XEtJe@Jq+jntj1
=NMu?Z iNwVFjiGb<#e/eq^mW#K!:E\iRtAYBJ6Abi>:p4&mBhF&V@pCc*tE?MFa?q+64YnRXC9C<bJNa!a^Tjq
@>qj\! &SSq:dXa>%TP<IAT6thJ/cpDh=i+WPYSdPW$i:1X&SXI*RuL<mZTcCpWY5aKin!SN:ZYK&nM6GLJll:u
ACjqt> WiWaFj%l%>n4#NFQq4w+H:D><//pNE&e4#idA1e#R!XVYN>4BhT+kun1ml9%uGbp4hiAAcYb^4lNHHSH
CuBklw $nk9&!VcYQ5PY4IZCa&j1dCPyF$GS+/Lm8qT$Qc^eF%H^4I%>S8!aw<bAe85N>@tnRLVjL9pGYjCJQn%
5=KHW% i88Vumhd/C:jZ\Ikae<SqX&iLL4WkJa&LnA*c@LSTQKX<kNKJDLaC/QdXqaaA:1ZteEVt^:P+hWejN$5
GZuAB$ +dZC^8ayLjpQ+pDh41Zt^qwFI>qVJ4KK/nQMCym+@4dcMnq&X\@S=XRkR:1y?5\F5Wmb+6bDe=N:GS+^
EFDDCd ?>9Zq819!!VhMAj1lNljd9MWmQjSaAXMn&>ehXMRj?JeLSXlu$nNu&ihphj*qJZQERYSMXF<*Vn*J=F/
@Z8RP< ZHj56EAi<KPY$yuJeGlKjGdZ!wbF<ywu:FQCa<#Ra/Bua=><@T6S$$n6%HN^dmjFF#QBV!^ZVb6/cGjb
%HZYHt Zk+h>+WpHW?j$9%5*P%m^M$X#aJ/&hMT1BX=WM1bLVAl@DbVh<QA9lPA#JG\w#K9SI!:hie&ple#/\aF
MBm<&m E$&XaHyece>uBW9jJmjl&BdnH>#YMJYNN9Fbt^^ni5^ia%H^KX>M&lN4aAL@RGimamTt?>AX+k=iaTyG
M/Lj&Z tXj@Bm^cBkGYD=QH\RH*GelHd*e5A?G<cDeAYu%hh/#SD6GKR8R9bP*cp@CTJhW+K8C$Di9DYWMC<LHH
JS5Hw1 w=#L>=:$cI\c#*Wy#@lWkdQJ+FVY99w4VPV<S\Mdk!Ml8t*Vn&etH!>YD\=$bE%M%D#XLq?^91m%8/K8
uM*Dwt ^nup@WpG61y/k5d6eMQ$wVCbRLy8WdRQn&9%emm=yFymCNGX:A9\SmYc$Rbapn%h=YIV^HH1=!%>dw#t
-ACRAR 000864655d7001202b4 Page 277 of binaries2.zip
^1HQQm 9<kqnR\4Y<n6e@b58wFV@ynm?L/m*E+mV?/!yF8t>h6e<5eV/H$Dd!*GA11\!y&Skan!dQDK=mn9Tha:
K/$F+l 1jZhQ8yNmIlu!/\=u@y1yJmYEQ$BDRk@\\YLbTVCN1uY<j^ct+KMaQM/%JJFYXF*pC<>h9/FyJ5<@QH4
ITZTb9 %\QR/eMbm#N5?:n&>?8qy*BD^^+NqM%Dy^jhESjKMAeZFiH#FFjkJ*1teNeTS^JhHmttAL>w1%nt/Jt!
n45&=d LL9TGl/dnwSVhT#w$/Bn/e?5!Z+d=>*98>hcKwCQaCZQTQc<NkRc?yhylPyA<E@WA$1tFC9n!^w8!8mH
Gj@Le^ Z?lbK?j/DThVw/F48WTKbkQM!D?*\/?/Z6TcS+m#lV+l&!jJwbP4hSphFe1E\>JIIjBZeK8HwehQM8^*
WTKnYP %tltSe6\yIP/My\*tKCV?l**Iw<:b1H&cI\\%hc9KSCE\>kl8ZIG1wp8pVF:hJLhD*T$I?SepLnyW>Zy
CLjeI* y$y*M*u%Qe5!9:A\L6Xue#mt1Mb*?XBQmYHwIq1tyW/KTa6##DT\\Yj$de!p9<#\IeJc9nEwFiVlDZ@m
k$#5V8 dDZVb:8W41jAu^GbdjPaI/u*ISK>q/M$>bMEuJF&tj=Y@p8pnWmawmXph$c5cMwk&:YTR?4FZK&cQca4
B<<tT$ jTML?aby8k^M16lVRGAn+a1GAtj5Ae:BI+ll8w!q!$/^QWmESNGpJjqy%&EWG?6XBjdHS/$iV>^/jM>y
Q$\&54 yjyJ%&PFlcGw?PQp1n%&!IVS!+=W@#H%%+iHdp96Zn\yVLaKiMq1PhCnp@KCYTE6m*$X#a5^aiASNK!$
*GIM<# ehNebiDR:#ypSZV69llYACyDa\tWkwWd#$@t5@N:m5FiDyiFdMn\ECl5m^pejX*SdWEc#*9DJEwt^Qjp
RPEnVP a8F^L!NF8QDY#l%^aamb%!Q#GtCwXkbdBKl=lFa8+ba4?$eEBFnARL4>84SIZNub<6!B@4E?mZcj%=Ki
hE&+=M !eSm#KKGunh*qW>+#/YTp!TbJA8ybV6ynQ5VL@jA#Qwq1%cX%JVD<8qQKVeP%!\d^+a==ct8BD/BNXXF
1/^ibq bpkAG>Z$c?ZS?QEn95X:p41K*#wuJAA14SEuJ=tn>SKTV4+N$@GMQ/B^5EkYY&IdGB/CZ^p@jtH*waZN
j%h:%B qXX4=:#hy9y1S=JINlMmA6%M#^VcD=JMV:^ja?mQGJY@tiEC<9RN??%+JL9Y?j4=W9M&D#VWS1pY:5qS
#5LH#n dwtY65&@\KP#pPQZ%ubl&q8c+uwB/B1e%JKXHmIdyL%$PE%<*>a\1W9Yw#Qp5jA6uHwAydhw=yyuRB:k
:\@>^L /T+ZLqC9Z^N5:FZV+15L/d>H#=+ST%=lAaH5<kJjuSS4^Pkbmy!mt116Ic:B8V\u%?Wl$445yH$u?lSk
w>Qy%T %6eXKLwh%u9d*Qj:X<N=ut9JNui?ihmY#PDJ\Ek*dN6=eKN\<$+IM4awS9y!YbhPA/A?1X8I@uBYp%@6
8@jbNu lDiZN=j#1Rl=VpwJb/ikqK\8*i:VKKd8k>qn#Nu!61>:c\VDGe=eLuwAae:i=+hMTpmEMcb@pIG@:JSi
=*EJFI FceGRX%9tI!h6=a<*SZ=+9Ri#8T4\pE5^b69BE5biR+p/GV!eFeW&a#w!#cI>DnQ5ZXd/:mH4dklh%tQ
j#y?q+ /dbNyd>+JbLMINHCE4&pAE&:4D8/hKQ%wAu5PJiWT/j5#IhM:mFqq>/:<&$N56MZ**tu^@Yb@4c:AmB*
yjwRRn b5kTRYBFQl%?VbA9QiQi@X4Nw:W1!ELw5M\w=lR5>lA>>%&>m$i#:TnGqt^HEjt>9uHKR!4emK9BX$SA
Q^cqA! =Ae5&M*iWkFHuwbH6&?ZRmEa&A>tJ+nE@@58yBkwC9Fj:F&PR9#:MNyI#H<X99bL^FEW+e6?\>@C%*+J
9p#BV^ :d\ht@Mj+Y5^Z>cy@nS<:X<Dy*+LZ:5h\jQ9$Vy*mKQ>Q+i9@SI4FIQ@L9D5u*G$6@K@WRL?M!n9%kZm
^?>8\q Z?KjjkuA@VW!/djawN@mcH?=d:9\u\Y9@SI=Gaj?a8d@F4n&4<Fh6<@B1K>lVXFjc>/8:X8a$&*\u\FY
maGEeH 9<Zj@l1I>W<i@Bub>q?G$Wb<m*::^!@Wn?Nw@/&MQ:HjmMLlmH?NZ99Ql9<jA&q@i?TjB6L?^yihElGD
%u</nu @DQG:N<Dcj<nhP!Q\6@m9*cEHjP@Bc@>$tLdVd=D\1EJZ<Vk4?F!9+uD6@TuKH\Vki<K?S1e?d9A66>E
!11@XA aj9\/<F4>WKejD^hhkljm@=?bkKF?G@&FWF>9^E@/ye&+6?iN$Z68A5?/986LFEI=K>=i1MR/F@Aw4A:
ip>Y$A a#E@^&=9%:5nF95LYQRQcMd>HI9biS<VFAL@C>kj%W9+PjbH<*pwBQF@AQ>#K<l9$Q@V^B4^L^N4*&V?
DS?G*j d&Wmh*LuScH@Q*jiZ*Qu#bFhDCen:!e#$IGQb49D+b!dB@c%Zjk@89N/BAnG4>=ZbGCkuZG6:G^Qh+ep
W1ct@: ^blX<4j:VE*YHShy>54>LXyWCKSlE1\Pmc<l>EGcBk$MS*YR>\$X5dQ%jlAt*?aACFdE1^uCLlyy^6+$
QkPtnH j<ke\9ymua!+@KJ*B5M8+9L^wYK>5HpKR*8%@KA&Mw?/<q8B&X/P?JS\4\@JS5JB!yht4!%I:ZXKJ&PT
+LWI1Z uR^#Mebn$>ep>kaSd5Hmw$lJjMcDmA5!KZYV9t1>Ci8ttymMRjkaMLA*?8+a=knq:uYn+kDm=W%InTSb
biX8?1 I<BPlaH&t8P$nti+1dXqFGu!jl#QM:\1J1wWB&h4:NeX84=lGG\#*n=>E/A*$G1di?9Y<951WEdYCJ>/
ZZZj1= \5i=+WRM\6Vk8n1**+jE+j5B8+!H5=diATquSWGMW88BS%R>LbalwG\HNeud\#tS=*ZuPS:JINXIh&FZ
eY>n%W IBFt#uEK#W@W&:Pyh8K#I1R8%K^VTbwt%1Z%tb1bmE?c9KwS6=G4JpXqZFL*ZbcJ%N&<ISZ^J^1!mc/>
VQy$iY <*u>1d4QRwIqF6lVD!RMy:*upGa\#ZMJ$QD=YGy$CbFH^1jGHGGyA:@i4bA=SmVdie=\?RRu*5nb#R>l
h\+lV> dkq+TF#!jCX1ydw=>J8W*ymnmG+1BZbE45q<@Ytn/59=h$mQ:F&Q#6:DP8=NNk5>#1+i%!y&\ZIniCB6
Q1inh= %$85qtnM>a@<yyepB^FQdn4ba$ZHGAS<Sb9&??h\tlmpZh<RyKk<E/nVmWnu1VRcn&?A5Pbmn=E&nN1G
/#^H># S5$JHS<YKd5elJK6P6*m^*RHB!65*$$<a!BLZ*?Md##miERq498#j<Zt/G8Dld8a#H&A!86&qwyXy/dP
??AD#W HRFMnkPyp!hyQM8PDjIwTX$b8DDt9i5\6jCnFMe\aBAXy^ek549&\ltl*WF6S>c^hd<^A5wiBqdEiDwW
eKlKQZ X5!M$*eGbaeQm^AS85CCS#FknJi9q&KYu^>@@nCiyp!+GnwtML=<*l@8#FW!9@c^9anwXl%G9/hd$W@p
:\dc#A Y41t9y>$I><!c*4$ih&/\JPuR&G:$1aM*JQ#JT+iYD\jySGy8%mG15q!jn*ZElPeRj:>9PV%l>qCL<&e
hA$qZY Vwq4n#?uy>miT4%w@j9=<H&mSkMw\*n#88wCh@eW&IK@6t<k^F\?*m^yq<dMda+mnH:m1N+>k9k#QqFt
XEQ!y@ \8tV/H/tunFJ5dc?1WJduWP4nk+ZT<qH=11ItQ$QFZLSct!D@Sy^NH*+c89e\>GuhW/^#\nwaP$L!mnp
*1I@^l 6ILCCFZ/V$ejuI:eG=ZVCJiKYCm6tqB>IWK8EGlwH<:<VjLtA\jcEjeq!PaV>!^?MWQ?6d1<$<X/6d8R
>qQ##Q !1:$aT^P1k^6I\IuF?/D#a4CKDJEq\9nkT1WA5>D:YZ!%!#lIAn>yW\D=#m/hC>n!/hJJYP@BSd1pVdG
\@%W>R DP=TX%?JZ!*F:dwhSGRNbPCER#9t:B5@PunM:yI9H?p!9W<!:u*eW4H+GKKt9kcWpm?yF8h>M>lEbcCb
E4MhXD PuM/d\ApHXFt/u@d/KJ:@8*dd@*LAaX&?b:LT=MD%<@$!XePZ#4JQqN5dNPdKF!Te:mLS9&PDj^^!MXR
8i^RPG BbZq=F=H/ZeSG4k1A:&?J/wiSyE<di+Xc6eAan:k/Lc<L5>VLPJP%T4upNJ:QT#WhW/CpJ?HkPj</A4e
Q/nDlc nu4qbNDt\Abb\HYHnB%548CTl$+^?Si+T>!^AtIENJk4ZGwD5+1:V\RX8GT+5=qi4R\=p&w6=$F@e&%%
yCeu88 n=ul6e!kXy@Sh>/ZqHc:nWhk+\6SdHcYh%:ib4ZZZ$^+y:Z8<@CP/Qy%!+Q:eh*S8=#6&TJA5QCBBB4T
=L#FFn 5@+lhpCycMiB?@RWk8jB>lcXnlm@qbTD65Wn6eQAp+8y%CQQPmeQck=%HDp/?994+IHbFWGQG%EYt#A!
p+m8y/ tidy:K1SMA?^8jGTIeTlNXSRnTTy9>^^W=V/kMWeI8XkNjy/S8BV%t!p*<FJT<A<kV1hukAH>cR&!!^b
l+b1iB +HIQduV\Z>K!Yh%*!kn:8:YJapbS$P1yIib$?c+nRPneZ4*?Wbl/XjLN5?NmkW^18jcJD%<JjKlt6c=+
Z^+H/\ XSZ<:q&=PPnI:bXh%@8an*5WQPK\Z6QMDNqFK^HLFpE&yXM4k^V\p>\Q1le?WSHZjbYyma\w=aJ1dJ#m
<<Cweu luI>qVc%4>b/@H6A&h#c^6yFC%6<EK/p?j>l:/*D+q1!>6FGGuh*h/hyNAS*h+jk\h%DIGl\h\n8:yDk
H%\Rmq :1+Bk45pcEIIenp#e?dMtTVj=Q9Ph?>#:??=@Ri>h&@i&t6Z4cyhc>Y1h#HEE+DE/:E*8a9JMwm%dZWW
V6uLYe GT/kCR^L=Pabb1YNlq@tybTybB\61uF?Mdd6&!F!j!I1hcA6Q#/GF5>%9&@<#enW:k9bkEWpDN^Rtnw=
$$QAaH iD46c98NZ646F^kcT%Fl<ZDn@iMXGL!Hpm+lYjYa^KNk/8AbFVhI4+$n4qSX4Le+:%paL$5eYCkF5H1C
\@C!cA lmXybl^MBtNmQNX6EL1T+FcqNBK=HR84yX=T%:qZFp^ll!cX>TuKV=htS?jpX:\cJhJPKIEW#9p5a+WA
BHu=FH 9SMEZjIF&uCIESPaG*y9YWS^8QqJy+4K*ej!:R5TRd?keMJZl*m&aW%qKl?^JKLcFy&aa/^lt:t?\AA?
H*A#El *m!q8\*b9H@L%h@>l8P6M!C9My>ddPGDP4?<WtJK&1q=lZ1p=^da5<4nm/XRX/+wpPXw6EW&eP<CRn*I
F!$:pD WZB$XJ@+pNBqTVDT61kE1>\:X@n&M:&V%ejZWHkJF>Zq8Ep!T6Y&%EPP@B^WTWuTJ<@wqJH!=!*mhbLB
QdV+w> !mJ\ni<Tq#+QPplbwdP+%K8A$EMG=Z6/PDAXy8t&y\#ymT$NSYTVDV>ILi\t#eTFB$e%MN\>MM1kWl5K
^dV\am lwSE$m^Kj^yq#R>YS9GjytIBwubitDbLd+ipAAuAuYFi1E6SB!kQkQZVRkwNP^%aIBPRnlmTtl8K>uAn
FltbD> V&LbQEQ==HI6DIQK$FAHm8^dkICe@Kuw>1F$y=P1HXIpG>MFhjD:==C1%y%BI^uKeF^lludkaS>>Jd$+
bIc:TD 5:m%#j=6<haCB^5kWKF9ID5yAC5N/uPEHA<*EGTEtCGhJ&eup1%9y<K%\=WWNkpYT\1FV$aiN>$N4IK#
R4whTV GjbTp11t%qITu=dcabEi\XAh^%JTmET&m?PGQ*:&$d?PHe/QLW*M#l<G&IK/C=j8pPAp^\+dMY%$/GG<
ml/?:8 !*SpBt*meIKM#tM1ITXw#PZ$YmFkImR+jDKJemYwkm!t?LQy?kjEQkwW55NMGaYaV1Zd+eD\@iDdIblW
1Ld:Xc wFiWDX=EcF\eAp?/^d$HWlb?aJR&%MewTV4nR#/9GLYw9tABJRkC8LC<t8F$^\bCweX88iaX1e=ilNPt
lp!cVd ZHtIHkpX5uA$<$&y9G*#k&1FWayL/*YGEy##<l:<WS^XS!i9mX66ykZm<tke^uG>GQQJRuFwFDyXK\?a
-A>dWT 000f24a6631001202b4 Page 278 of binaries2.zip
t#*FP& IXmKpiBptbC*TC\umqwh1I8N9hXTbb<qtStenkFtFyC1#!hD4EJ<$G?pD:cH>mb\4WJRtF=^Dt%8=jtR
act?TG @*C9Nim9eNV?d#9K@nN*LRnM>4%^!5H#uZHK\j&4^8p@nA\RB>iQnNV9TY^B*@HB@8a*?cH=\@tj5V<J
t>XuRB DAb>V&L:k@9?^Fn<u5Q&B>kjp#GC&Hu?M=cVm?9HYN=j\Q++ESwI^QaL&J<a>CD&Z<C!@Xnt:$qN9<j?
lF@Z9l JDAa>D&y/R?\Q<=@A\L>kq:>JMpECQRLikZ?eh+wEPkZ>A4<++BpEPkZ>Pwu&/BBwF@RK++jp#GCRL?k
PT*1dm X#@%RZC\@SZ\L&nYV\kXRS!@wFteQ>:wD8Lk?A6a<F@Ae9/d\?djCc!=&Hn@nhkR>C<E%4?QwZ<8p?5@
KcJ8Z& qQqQJ^DdQ<9<y:Q#5W\8ul?W!j&DlCA<*P#@N^IdNw@1<RaRShSAkaWC%WIRB*9\^A^LukKSahG<#PmE
VP$l&D \ERS+n%cdI9QtjBqA+GmNmLR9MWmNqDy&MHEBlWyJ$DSXmEqEFam5nIpM\Ad4%ZWcD%uNMEEyn$<GE4c
IuV@Q# w>iCDGhI\mq$>9!qY\=TL=cX$Kwhi/$IPd=XbI\F/HHPdJJcu^tyD#R9TZJRcwSt\>NGTMyY@m&NCFEj
eiP>AY ^RhA>pELARLTp=1adTWd4AmQY\X8%MRPuIl4tunQFneP@#C+d/&h&WinYAS!tXC5cKd5P$niJLpHTwuC
Dbc#tB PXQYLtEJt/um/i8\pB6>VDaE>iS%eBWNeBl\AS^TKun#=MlyK<$5WkFC*\LS$mGJ&D:hRpGWlb*dXbih
:^D/Y\ RR9Wepa/R+<!$\Za4HAL6*l@CB=HW<XFDnCe=pd/TJGAlaBC&WDTX8YBqWPNqE5Y%+PYH>MVVQ+89!MR
@!>Gul w6mBpGcnV1GiW<pEGk?p=G!FliAub\#t<T94@5D6X&:MHpVi1R!Tb+<^+WBBcVdC4hwRHedyy+\QbRTm
mTSAue Eka<:ieR8?CTu#uXyYtq^IdDpwjV/?h8<a6SinL^<TWDqp4<a%F9!WYh=b58SwJ:t#?KilCKh\e$mVi#
!/YZ45 H*pRmQh\8HPw%w%l+T6B6wV51KEw4aA$\R*5+u&#EZQ+/nlED%y#^&BQaw&GNq:=mYtEKjEe8Y+<B4ma
#A!An4 C<PipdH1hNY^GVNeDnY5/yZ>y#nN^9nVKF8JQJ4^#1/iT=i/md4ATtSbL/&NCBMZIPbF=NQSLyeSdnmF
>9XalE ZX^4R^Spil>qLjAXMW@QtNQPp/5MQZciiPjl<mD$$T*CAe$CwXZ>PiR9ZkawG8kE@X@XQda$%B4!9J:u
NaV@mt CGt@H46CEbS6ma*C\$Kb5iQCGX*WCMw%VWHJ^Khy14nt&?LV+MXht&?4B!L+1jjm$d8#aG!9^m<uFp/=
#w=H*/ NAkZcF$thiHK^aM@V<4NmPu^j=4y%Y<CR6tMFM?a$G*l6!^uLnRjjNSE4n/N1l>Vie@BtKnR%%PYR!Cu
K!!R^T mCw/w1lINL&qQC=tMt=JFE^eW!^DTjM%:%BZDc@i?l!JINk1Zl=ThQLJJ!C4XKCe@@JJuk%>NJ<<GS>T
GE:=iu c/d:\Kd68lJQ%N8Z?Y<<i!^G*Gh5F\\yyhy!4?@bV6TTlwc/ZLIJ&pmhJ>a=&jJqFl4b=V4aJyKQ\qcT
D&b1#6 c*P>/R=\m%\XQMh%nhVqnVKJi$jL=nbuZD=h4:<^<WDB4@YXG@/1Bn19AtREFMwQ8/\&1WdpT!9S\VLe
eAaBQc apEy1dRS+LhKV=dmRIXwI?u$yG9ct6IT8#I>EHS%1hACh<6k5!AIui!<yN<SMRwyw\6uWJ1TDTH^cMm+
k6kG$+ b#w+<!H8=L:B$uNa!HQk1SVul5yYYS^E==R8JMQHw$la$wR9EV6\*aF<%a\Ww4*Cb4tK\w46Z^$q+?:T
Y8T+tT l@+Aj8*Ryy:GDp5&V=Nl/ISC*wYwGub!DSumqV9##mkTl8!tK1/JTCcG#V%/j%uTCee4nD\RCHmQH=Ck
j>u4$e l&tK<MTa:AP>@/5CM8MRPnkRnM\IVQ>:yjNYtQP+J=Ili9LWJajpqtptXWPGXXnXIuJly?5b9EqLT>%J
6kV@Kw TK<nJwubXKwIn>iw%4M=<+CHI4P%48TY:/!luCQTpcFwI9didppp9&Cd*?ClXuuyTM5dptLKV^ZECQRm
+&y4?P N4*AKd!h+$W<B\cwnWa45Ep?4@a?LNS1n+yT1+:^C&TjqILPqQ@cl4\^=k&qCdI*5ApMq$#Ec#bZ^6T>
=KM+#F >hM=YKYQpTwjS4t=AhK9MkiI?1hm5:pX9M4qpQCZj:yqcmhah</L5at$XAAia*M^@cnR8=mHk?D8Q&wX
nCup@d <@chqCQb6dVqZKlLi4*iTFj5>LP!cSq/K%!I$pP9ml16NI$G!GY<ye8ep4h!/tGtL4m=%+ZVNW>/VL!T
CHYlGq Ij#=nPjGRESY6eN/^k+t\wp&E=JHA1du/%u=8eX!FyhIW\/1RHc$:a^TnT&TBIXu%kdTnKa4^Fm>eEm5
M/HC*y D15/ACZpE#\/w/qNuPY+\1n+bu6N%@!hC54k#tkGq6wTBENeb!Dh<jGSlK%=JB+ZYeSPiSNh*K=?k9RL
B6%4%/ @w<t=qG1CMd1BGMk<#5WIA/%iJX$JuJl^I!R%LB%$WF669tPkI819@M+:@CD@P\?ELPE@yu$CkK6@^Q?
F&!@dt &95#kw5yV=9LFI:#emLw?weZd^CKiNZ%SVKE:Aw!PAmiuCFpF8+RSTZWl9E5SpHRdJYub$/d>*$YYTw<
tMA%Jn eM8hCuFAkTWQGna$R=6^EK&C\J<eAY1$\Y9kNBdlVe=d#$eqhuW/ut%\c#PMI!mAiPX5iiQdbF$<a=%9
p&e*Aq a$LnQBu1ncMNQajpl!BH5Cu9bdc*#p9P?t:X4w>$!EyY4GY5QyeQ\WY1jllYQIY5wDP*eMjNGiilt+hp
DZQt:& !6e4$Y#*mIXtbT^!A+ke#u6N<yB>=PHQcD@lCypa?mCwmytZ9I#9TkEN@TNn<5<e+@>Q:\pF@btt@A@:
l4Z:TB $ju^VNdT%Qq9t#n@d8/B@:pt?Yk%89=>%SPbXh:M%NLw:?dm*^dCH+%ndq:R9$?V\G#@<Vc@#*JA+L<9
TTTYpQ iaG+@@+<wH<pHihk@@5Wl+Qn>>@@LljHQ/m<\G#@!N4\l+C<@&IFe*!j%S$Eb9<jGe@e*&X?AZH>c8cZ
nE89&6 *!hu@%+@*$>>\i!@615X>D*#?9jau^uN*^P9j+@>thH<Qi@/D:A@MjT@=%*@H59=E<Qwi>:%H&C=j&^m
S:%4VR jM?:@kM5=$>p=9$FLQnHK<4j</:@AQ9n^KTk:*uZj+D><R=kEPe9/NZQX6A=Pj+C>lj$C5#^a=*p@AY>
5EkWBR ?pqtDBDuL?kXmPeu>@$F9j16:@<R?\6/BjyJlAVuL?nXV?%64q>RLC:8H*6!8Nn@Ald$F:C@wqk@<iS\
&MpB#K kj<Cq9M9aLu?Ayd:L&D@LWHY:<n@ImDpu#/F**\B9N<u!AJ^@TBBFyn4@<kMYZ@pDYZdL<$NMK1i!b%G
KZb?@# RP=@1dSmVphuA=Q4L^Bm$4KTLBNaLI!#miA9hHn1wIHlHImu8M<F::D=lK%Bq\YZkt$m$TQR$L:yJnpe
t4ZTRV qme/!pIDHWL%H=El1!=K:Fkj^KGaqWbtX:l#4C@Zt?$&D#>XSN=I+XhNSGASCj6BbjVA=BV4+dhFP^MM
=IQ4Kj 6EdEJ\YC8y!!Y?yi1jKVS&=b4M<&tYT4EAWl9@DBRlKXY4^6MyHV^$NqX4Jcnn44NTEPklJXI?Dci8GN
BpaA#4 JSWHl5bC!yF%+?WWVuHARyqP!F+D%?di#MmKT1%PByQuh&:\9FLbVcw<M8cJ=a?Jp!IkM*4ZulHeqeGE
!@D%W! D+Ppp<:V:wltkmE\N8IPCB:4LePV:k1^\$Km#IltdE!RT^Vkp4<myR51PVYnpby8dbMF1:Ih!R^Y1HSn
w+%Dc# IXhkXdLXk%yjKA^*mSZn>EM^%iE*uAXS+a#P:T6Vc&GNXn$4tu<cyBWESc#QQJNVIGkpQl>SSdcAFSSV
GT1E9D N#<^lpp*e>dtlDX#GVIMpy!X/6MPX1>AX86Wi^qEPIb=C=%bXV+b<k%SPX=YI/n?yc/pDHb4%T9qE=tZ
MAkSHN ey%151I/*C+S$aGDF&!nYKPL+G#RIA>bV/S1/Kp^Fk1E4D&4<thKi^eldd\nb8%F/6I5A<WS&hjBMm<?
KS8%ad S1:Ek#yI\dtI*l@/Q<*1>ct#9%yVDRJ:9<tw#<8Q^H5&A<!VHCG*1cLd@nSG?1#^yqI>YL>mhTB<mbuS
wZNlQq YT#pqG1cATlue@P=6@!!>WNEZyDhHXJ>Rn6wa!PmCqj&<+4l:E^Pm&!Hqb<<QdMD1PWba<VKt*S!S/^9
&/WbJE wyK:S9qGdjY%WbJS\$:dJkQTpVluqENQqbV4XV>I/Z\auF*VN4yc:qAe/NT#1S1dSt?#FQ8p#^u!wjEN
MEqlAa $@QS8hkL?%$QjPP!6C<*>1\&%=?Qu<h6?$!+5C&%DCBLAdtL5b96bIL*9&t@q@XiZ5inpZ*XpLDH?&WJ
VMY?@D !?P>G$!Cn$QV^QACy>CGYP$Z<^R5\1?/yT/E#G\1a*P1JZ/5T<Bt&tiAb^TR+DJin<=54WR%/Twhq1GD
NIh<Ak KlmJVhVyRblTjuaCP5AhYS+QVQDJAamHdm$X9\yePNXdQYlnpjBmGtc\@4b6>mWm8hMpnNDKl@aFl%hb
t:HTCD @ttt5bBI>SblEWcY4D/F5^<1RylS58MyyTbTL$tl^bAR#/:ElwTn5^JGI>?ZNewYZ*>wTKFJjt!aRFb6
DmRh&* a:b%qX\n=aLwcu&LhGeu&$pE#bn%dF#?hTX5%PE5=W4P1u4ahJk<+&%VP?A#/ih\mh9y&=bIw\SyTlhp
Z!6Jep /^!<!p^>HI^ANh5iPk>BtqWW$9!IZDPuWKVnRALJqLkE\?XC5$Mjj4ET4\VT$AIpt4a:lmJJ\nj<^QGH
=?DY>i lTB89NE58SuZMAeIFRINtX\hyt1bckTwjPPutEPZFVRepY!ePF+HR>LqTe=DCnqKTmQ#@KmbMB>A>Nei
$klkR% /uyEu#KGZ>IN\wlWmHy9AJF1Kkc8eSSn@X9$4Kkb/F@6S5VJ*XuNFK\RcBwm4d$6!Hcp%^t:^utjLK!Z
m1L9Yw ?VEZlea<K6X9bpiwJtYbdqNQe?n>+hP!+?FWB$MhT8XM^FiDyRX>Gud!BJ1&%emKYZ%<q1bYd+CA>?w$
aK#JeI l5$I!PileMFh@WMBCwu1>STC!8cJR1b+<Xld$F:K:AV1MWw6<G^$<FZ4XPp:kqSal&!I4\yVciL!&+a>
WPPVdQ iI8^Vpjm$@\SGInFA<S!^MpaEu!Wk/Tie*JJhBqj\cD&InqFGK&Ak?#W%d/ymF@k^!+<Ie4HD?eWqAnC
Fyl5?B k^Xc#W<VXZ!8dnAPJB8i$pip$XY^yH6Kj@^8%+EPaW!NLbA*8#@&MBwFtVl&+h%NY>mNJ?&GT1acR\m!
c4L@LY !8b$Vau*cye%Xcc\MKX%b#aiqdP:LZJdw=/$4hN4#9FE6d6P9#CjncWu+j1b$/GTXYl<ikiqL<9qF&85
J&>iGe jQL%B>uh^>w&DXQk5k!<c4^5&@L$EK&?qMq86yBblTthWd6*jV$eQC1:L\kZGC:?hmh*hDeXmaQ<qp=1
K1?i\: +bZhcDCuSNLH+t@6jbquh:W<a@:=%D:9!\MF%I>mHWwL==+VR:ZIak49C9h/JFXjbVi4:wNc!u*n+qTi
jWY!bJ ?S/?SGR?G4TXy&PY?8w$ZJ^i@dXGPk4GZcFd\8ZA/C\wjMCBdXZ<BhXtQwY=Xk#NSFG&Eq4pPS6K/V%$
ILlkkH eM^KEjJ1wKqD<aek#5^tGkSId1P=6t=ePN9VHlu8$YmBDDlKh&$T>:#lJN1>*qK:dlc@8E?54CIMwW?J
*/6H>Y \$P<!1QICS$m+1acR@KeF^qq9#n4%15Y1Z+%>&HI4*wX%=aIjy8b/u>c4INyTWAX8H%hiP/W=%eVySA#
<pEmIj >4RJDQatNXlH<F5J%Ayk<+HM68IyI61PWW$JHAb\$\bq^MjFq<D+PZA?kS=Nm*hGdHXQycEnZM#=FHty
-AAR1n 000756da95e001202b4 Page 279 of binaries2.zip
&K>QVt I!QFRG>=i^%EFyZX4i!LLCGYBRu+KDReI\<NaePTTDawH6@+AQN15W%&G94F%I$:=Y%$ZQ#ywklpKl^#
Z@NamM L>XY<6Q5F/yP#k4$dZ!+$^LInW9a6C$iZ:I\<4NXn!*VlZqwk?SXC8uDh?W6!AI^KmZVS8=t?@Idi>Ln
aI:hNH L%?=wuBIICXK91btScdIa=XA=FQPT8NK9nwGHDiil+>BD$VMi8G$q4wqEmTMy8J4*/YYJCu#kQNYbk>Q
Pnd:GR +n+>hYKpKq*RpZ\NlPknF#L#hD#bI5@+mK+&RRw8/w=S6bCbN6MiXpW#LnTGiaHcSIA:/llTM@^l?Vwn
uV=5^@ Q<1#VXGjt//>KlCu:ebbWXlIPHSm^h:yMGma%\4lq1:RDwY\=\55PwPiZCt6Aw9j>RLS%pyAwnjLyiJZ
FK9K4C Ia=9JbTjaqkMIN?G&nL9pYa/6:6PNE+JTSMnC*y9dV9Vj:bQq<>:c9tP=LqWdYJByuc9IdJFc#I\W!dR
k<RpK9 eL/wW5Lt5/tb#9F#9ZqJ$<tC\a1CMIqiq+jP<>nKjBd@+#%IJtyScAZtE?mKhTb@mcJQl@RD5$#=@KBA
F/T#5& ERd+YwHPW1@PhcV%dTT!RRqJeJd$ja8pwWc9m6RuGS%KN*6^q#R+MbW^tNdSyNMkHlPY\+#6BH<$Ajpa
IYhMNa Mh=Kq/Y1%Y$KJ=t^YpaqHTZW$:G^dw:PPDhke<Ku&$T1+\B15Y/^1EuJZW>wd>$mFP&hTWp/W!CcQ:j>
ZpTHQG 6Z?BXCaNAEbELICyAPZ$Wkj85KK*D@pEd<mK+NWJk^>MD<V8IBY#nKuDa1!w&ul^hp&86#KnlXaNLMbJ
y&?t#< TN^t/dm=$*k^S58/$nCbqe!YpNRim\SC:ttI\BmC*VPA$#M=Zbnmijk^py^lA!C\&tcaAb\>L>qdcTG>
tk%BXw mYJ6PCHWu\e9=l!GAB:NQbM=FFK+n/NqWWZINR<K469nd%c8d6?FR^H#EyTS^&jMWD:P>T%hNS@tK:DA
W\LZnu i:a#tC4?H1etpdSweLGK!#k@ST8M=+$bluwBP<J&hjaiVL+VPTpDqn:mjhyYHnJhEecIJKcW^$#aB<la
!K/Ec\ FD>&GItid?nDZDDA&hqIX#SHVkmyBCNdjhkVuE!#Wn<&P5+KbDS&cT#y#X1FyW\RGli:T5Yam!pNDp4S
<nGt*L duHwT#4FY^>cnVP1WdQAh5+hAj5ii@#VYE\MLtM&GA94^XLwW4uPGP:iKt\HXG1++/A>GRtp*DG4NY##
yC$Jlh b^SHCEil>TmYw>I55=tK<A!9:GV&hVF!t?ZGF\PQa<+qYGVPQ*8I?pSQB>Eeu#d$keFXC4L&MHIVXCll
MP:qQT $@6AwW^uL4u^\ZL/dFq16p@Dp&Z$P1eIPKymXYDRF#dR6Sb>hqK&uh^Wy9@#C8J#aTn/HE+XRZRPnE!+
1Y\e^e %VSW15tIM%b4R%h:JRMG!JC?VWi:Fa6nQ!yWm4h:+&uD*p>GWB!lDeH$e1MAbWab8FD1^RZ4K!!t#/wH
=hayt> K44BYa!>=qEDNypXFAXmJSnXcLwki*/Lim?S\htTpGd1N$^Hy=\FQIqYK\:^q<y$kZKD4bbDq\8WXtyn
<:Bw/V eDwt#@t^$KRKSdq18ZJjK\8XJ\ZWWAmy#kcJa<l!dItG<Nu*FV&qNIMcNw<wR+A=B!Q5F&jM5LuCPHBS
wDC\L\ Q$jwG*^Xp=$J=TaZ/q$Q>9IPDyGTDGRwN@Yn>B4e^!VJe!j?yQ%WbWC1#!d:\JXI#DR1Q>i4T51Xuywu
FQ$*1& SEnLZMdByXHL^TqGSpDGyWWPDW&TKplKP8>JTZdYJ$&TT:G/it>B=Wt**5wpXR<Jc$NqttkyIPk$\JLF
^t>R5& @\XL#:FydlqjTQCm!ka+u5hI9Nqm*WdQ+wuKRGqkwhbd<WGaRu$%T48k<u!JR<CmCmAk4p/NXqQ=:CND
>y8X?j pR^6n!#DNABMJ<PXcC1HSInnCnMnd1qBj/^!^WE1b1+Q+^R!>$IVV1MGIWR\$c6iTqa%IqpnuqpP#q#L
9y!4DN %XZL!5Btnp$=cEnlkpP!TPB=CjV#Cq1%5GY%K=Gewk?clc#Kwt\Qw5jIwB#Gtmjw6Zc9\R#8hS>q6uRt
cdiGDN cZZMT8AWR?W^=ip+yVC^ZbW=:d=!>Ta61LqbDYLmGny\Y=$c^1FVT*>Cn*Fyu:!ip^DlRLyA4?Gpepa1
dclDk/ &dJHn#NeWJtZAG%4+@CcudnTIAiI$YEkn@I:KEQQ^wI=c<C/WFmt6m\GMDk!uN8SGGAp5uYQK4kae=pw
6tXNPH N:nWWHGLTG<hi8>\<XLh>jWa?8$wtk1qELaWHGJ%TlHhK\m!atd^*8uQWDGj^RT8pi>DnhZaYeQYK+/@
E?k#Yq Mq@jn$j^BlHS>?+@y&KmEwFt/y+WI*Nc5@iGELG%E*G&m#^uX+D=RyhNY?Z%%R/HF/&Ve6iJ!qmGVA!Q
p*/P=! Y4/a%S&LPe4<mipeNEwJa8AGa8?/<pTL6GLI$:\%GPM!T1ETeuSiimWZS!!5p%tReY@k<SR1GSKC<tE!
N=L14L 1W&SRJ>N6HRi^ITP&&GGM45d6%Y^:JhTRaenw8$wbi:C&LlPtQ&+&H^DRdR/X?P\\uyVk$QuJ*JLm8X/
HlL=PP HQ$?%lw5RGSXSZ4V<^P1\KBtI%G:Nye+tGy1\WM%4eBShcCh\!=MDJAthBeW8+lp?lyC#m$FBZG?ZCy6
:W$JCH bKCLVI864yleHAT$>WiL1DduAIFL?8FK!b\WT:i=yW1X#?96E*#Kw@EC5kiCKYZP?\S<:PG$MZqN*BC%
YZ!tT: />*%D4P$bl/5+TjBSWG<Fpth$dje#StPdAk8\>N!m/@Bp96G/?be=+J<eHkQNh&PNHT>wlK8yZwDkY@a
j?wL9K 6En<\mlD<JJDy4Rq#41<+SE+65RXRw@CtP+<Ph&MQ?MMBBb:n?Vl=JaddGHnMdnn8V!QP9mm6CPRE^R5
Mi<i<^ ^eBM%q@4/5KVP%Z><YBe%*SWMMA86nCtNFYkKT#DXJ\5V>c:yM\%AWdTY%6AEC+b^=!YbP9T<4p!MS1%
qI!&Fe =A#Ac^mdEI=Ht/PHFL&J?Lw%L&SJFWcpl:&M:C^N%6$*tyjkPaI9S<pElVqLk?aD^$!FBBCwHDKQEtlc
:?MbH\ $B<8eb&c^IkBa$>IcR:Q?hY8KdXH/d4bF%@+>jN!4lBM<PPqtAn9qP/M9aIp5J64umc4+^SuWduGliqy
#kNbTT 9FT1Kqmt&VD5E#Y*DJe$@qibG!L\VAHS:69adi@ZHF:/9MWb+ldKF\F999cHmt9t<c/myCte1#CLZ%R4
4MB8@F cY=y>!&%>b8I\^I19Cd%CmqSukLpLL*Mauhu9V/JCMBT*c*X<+D*m@jWR8@Pw9YTRH4up\lRDHAdXdlY
B\uS9h Q1q6NVRey5kl&bHTc5Rw8SCt&nYR/?##Q=JM*5yLwRPwZ41ZR6++:EmET5ByZp?RX$n:Md/*!Va$d#+4
dM^n4# *nPX/^P6ZJI!eDm\bHmXLq=1*6n4E&mu8=e@<Z/CVCXy&4BZ64<:y$eWFiY4N!4</@l8i#QBLB+CS@V8
MEBA<# E@lD!cAR=b6?l1LRPpqF5dK#AHQ+XJ:CJMB=pIc1*!h?hYp?e/tTl1L/JES9^?K:<H%1+iue=%TG^qhY
b84#m5 Pe5W51:dnHGeGjA=BRt>X+kNGWe4ZnPIaEX+:5FK+E^<C4Pe%45k99tXH&+hBuH@=&#j4NK&S5@NSH=y
8PP<>L Ma8H:Hj@&L<GTc4>6qYR@Z?\^9ZubBS@*!:<YNl@6c?a+$<4Qq\e9#9hj96jpd?9:*CVMZP\pZF\puH?
Aq9/yD <=upnX!eLQ?&E5dCB94HZtHtj#uY@@pPbja@d%*<=>:B^&8@Xih9M9\iBQVQde^k>u@*F9+=hea9L&n^
:C:$5/ k4>d$PLq?IWFLYE:P*8Z9/*h<j!>=pG<dQ@+b9@uY8HjX4*?+ad<h*G@h\V@a>H9Q/>ejb?5+*95#%dM
S@la=W 9p@Y<V*&b@5w9$@Y<h@Ae9<C>5hbd$DeQQ<b!@tV%Vb8*q@Aku?M=YH:BT#:n=@*i=:j@\aY>J?^Q>8@
HFNC<K !jMLikZ?&Z%@Rc<+j4K\\jMLi5ZB?SQ5L?nXV%iBiLn@J@&ik@&:j5@B#9GLC>pe:D@5$9>GG&#t:QK*
E+h8d5 +aH:9%n4@Ii<j^6M@uWeq4P$5@/d9Cb@K+PZl+!Dnj69ta++jyjD*5uW#PpjpRh5*+uC?#?1qH@!%Q=S
XlRALh Kh^e9%wy*D?5qH@nNQ/>Wum@Y*n?:%aK?HHp@1%Tj86E9%ay@$cS@L<uCm@9a^N^puF\5j>Nwq?R=N>T
<MQMSS k9?8:9@X!ldZH!uBj>i@Q=jJ<aQ$*X^5dQ@HeAmd54hGPEG^T:5W!\Tmt*eYW*%5SIkbCIR!/8N^+ItL
649C8y 5FLJ5Yp*S5kmMqEi$/k&bTp<huN/h:w1!QddT66le:N6TN=C5KnPLBEYV^YTtW=ZSLa6JEEpI?SGkYl5
kY$?eq e!CYiSy9b*?pYycK^W5CehlhMMGISI?<%8a4k61D#ZIk+:mZ\Np:8>LtKlmIkPIcyuDR=N9kMw98qtwI
dmSFWY @&N\hjYkEpiqWdM=FkKmGpNjWE+EI$dhGAB4mtJwCiGIp?:cl4CEDWH8E:Y6/9lKp<Y^LSEh?+\bmVnL
1Wb68l E#9GIAYh!l5EEj=Mc4w6qdB%\aB*MHu\PaBGq8IiCmcmpwqqDeKYuFEwmFcGm^GPMVc+^WAEi>u=>JDl
\d*N+& kQXI+Jn%jyVmcLM6E/hSKR<?DEI?VHu^GD@iCi%9SMhl@nJu&BZC#W4EHPY*y+tKl1w?PeHFGBEMeFEY
aDdSeh ywpmYCqKNEE5GR^9/ZM/qVnu!e5blthpuhISw1:Ci:GRn?S>5ECXcie<tw^nFq6A1MRkbI%wltY6+JE!
W*#L1e S1\bWY!u*9jHWkNG4J^>ykPc:MTybpCwqDWnpV\&XX%W#qFG><ZnF$ZwWb1e41dcPiJH#p5!NtD\Ateh
HqC6mt \5GMMuDC*RBCAwhkwVqp:bpklHmA?84q5X=DZ5/aLEp#NwYuYtjaVa<$W*tGTleRQDuKkhRaa>\M1y=B
6q/hkD INR=$pZDRlyy+*S9#BFc=#GwpRuEMu9jRyu!wW#DW+<FWeG:NXI>RtKk\pbtGt>?=A/66?44d1kaK>j=
P^dyFi li%5YqT+Dm6*$n\8m!YiEnp4&q#n!LLPuR$QWlPSc5Alan!kVXWHB:4j$l6#ydq/Q8\5A<k&Pe4ZR\mD
4J:p8E *c<X*6@#:nk6?WubGVGJb+el8lWcA%DBl1Ba9a\qd8RmJ^LM6!T4bb&JRn#<6Gk9wQdMkjX!@p9EAn4i
Be1@Xw MQ?ZWRZ$VLd1etH$%\/=G:uGPdbkMJB#%Sb>EcVw%?R^pkum@+a45pC+Jh548Xiq9e&8ZmMRBaEXSILd
L:qWDP %?mpQ?@SqD/#1&HYmkXD<ZGClA@dw#LTDb?#jm6<bM*S84mJL^94mNmJRaXPnC%u^uS#Tu4NEPtWK^kH
A*Ztaw HZbqBA5IWV@<#nXCD\1B#QG$waq4:qTQ?JVdkFpEM^j$CZdbpIe%\kmSlSMNkYT4I?lX\V+@b&X\Yq&n
yi#K9S 4TN:1NkiEAW:nMCk<1p=S@eHkQcYQM#P:JPi8Wyhpp%/YLkIQ4F+nGYIY8#Z?=HG!hj=Fe8nqI=&@QW=
W8GiFj lRjA:P=KBKNJ:tw6TJ&8>C^S=djjP1VPpDd#hWXX<I8/49qDNlKW9Ei:beuF\S6SmMwSkF^K<n!TmnjD
+GQnId LT^P%HumW49d/ERF5htL9VX9eW^I%NVmIn>15H^&^e\a<uR#l*tcp:&/kK*Z=L+#lN=KTdC/p^eDI&QF
1BMh#Z PC^XS^KR4pFj$C*C9mXmMedAIWXVIk1qhmMNAjtEt8:!+*m>n\n!XDF*wI@V8HNkHFI*Q@<BP!&bYHbC
1@wJ%B $dpc*bDYAZXCI^#G+VM=?plRX5>=N1&IDd>pVLHT%&M+#BRElY!/K:S+TVHM&#%wBHkSPnPWZCWMSWcc
hYQRSE nN4?^VjIWDdR$aeiRD#wG&VlFG=1$+#CAFD*MJwlt*yENSb?j>kHiENiWYG>j5du#ie^l&ZQw:MdeLXn
-A4q:N 0005f7075fd001202b4 Page 280 of binaries2.zip
*>nNkN ?p&pRHwwu4eyA*R/ZdqyXuQcA:Iab%k4V$&5/E1!iX@9+YTBKHZ:KkdB/9*tqL$lQ98S!XAMVnhSGSZq
5=bc$$ CFdM:@nKVWkQbnVG$N+FD*?DC>AhMi@dReE*FXmaLGaTmVld+\k#MYA!$#e:=/yijE+NnDy&lIXX^14X
A\!JWd EB9/+EkbaQY&S!aAd\IZ*#YW?Yuq*J#N&Wm=G!6=Vq58tSI8edtAbeE5C&V!cEW55+5+t5@?GC<u:BK%
<@@Z1* B%LjP>S&#Ab>&>wq5e:ejK%5JS\=w>AY/6&!6lb4m<1:#8eNt=?+VPpGDG>GkhX$@h1!<:&F$\@N!bF4
8DD=A& R8H>SYR%BpYA^TZCC#Sp%M*mS11D^SY9itR=a^SSte/Gwb5!dDPP+J1et9eBLtB<uPZ#Q8=^:l\^V8II
Sad=D@ &bYaQRZSNmSDW/QSTJk/k56pc^I>!KCbRhVWXIMu6ebG*?V/:HdW!+<FCG98ZG5K%65EGq>nJmeS^+j4
LCe<8e 4/$VP6y?IP^AZuDG1hjJ<\X>jPyX8j?8<w6QjdW$a>hA+mLIj^mZ4S%@\KwNdahJ!KRG*c$*=DZtb9Z:
ujuJRV 5LPYF^Mic@kt=S:Z=a:Pkld^=BS!wadqG^HDu$I+K1l65!*Dn*STu\:Zn%En5h%uyp$GW<EpZ=:W8#GF
dQ?1n= EmTLT#<F*&*RGLIYc&D&cdyTc<YSNeD!*C:%9F6Di!qpynFcG&!P68uc\q6l6VV&yCll:5&Yu=P6IC1Q
^8/jw< P>dtt<#+qpVieZ/uDj*Xq6#u6qDQe#+j9pPT=byDIc+>GdDcZhPlDKlSce>KPS$uMd6dZc=AE/lhd!%H
:ZmGp* lNPNT4dETYFT\J#my=&#\LXS9T+=BNcydc\EGkmyaEMye!NpmGWY>Sn/DjP>+lSHm1IyteEdB>I^6L1\
ER68wX pM%\D6Le5IML*^CM^#lFQY<>p1c&YM/H*+==?$ZwDV%yD8X&W4!C/V$n9Vl>kX1q1nCp#6NbeqackFBK
/Ln$A& JIWy:<AyASbXtFB^uB$DeTJQDAPH^Q+By!JSVJaKbJ$WQc%YPjmN8Ey8XF+w?pX*Dk>6pFA+=/p+tBal
YXb9=^ IBVNZ<FV?K*TFl^V%W\=R$G54KNI$F^?!?h^a*Mluncbj5mWpc@&i8!SG?L#^j%<l/W:$XuXtm@j9\pK
:SdZK9 VSKP4YC8KbVC/ZD%1Z\wcScI:YJwM%>jc%84!q+n#$&RCEM$t\5TGlw*WGNAdm<GV/6!C/T1HMW#amhh
I4=e4h &duiyFl#AHIAHP&4@qW/Zyd!4Z=KDT$Wm/BEnIBDM99Ed%hXMFjdMMc*KP9h!bacGkQhC/>ZYKYW&n@J
?VipAS iJik#i!$L5G>tyaWaR+i:\dtB4@141y!?tL%DQKXEwJ+IBBRCMjIFZ5kETi^pt+YM44LEAu9EF8m^Xdp
c>SbY+ E@!/t#:*WMuRMH&R^dZ18FGPRSQbS>iWab*m5Lc$5@aW4?*Waud5@GX%XG**^!Ha$h9e<+:h*tjH6c6t
C/&@%M N5m$8@T9q?dC*iEm9hWhYlDy%Vw5TqqymW!1RP!nA^B5k=*XG5?PA8i6ytDS=u%&@GBDIa6btayjlZn*
Z1&eK+ b^w\b:\wmAEY%kMBMbhDBK^TP?nII1tGK<A#YHm!\4R#WE??BNLw!k^4SyCNF&6X5L5wJy^MA@4/8jY8
DpAGhK S&5%wQXa\CLIy9SpA58/9=R/&LL58PYwXe^\liX$bicw9?dakBZGw+!SHl$Jpy*^$mM&a8/=#+5RJkpw
Y:lIZX KRp^4Q$6NZy@HSkw\\PV+H*LXRny#d&ci91Q@q^SGd\5&b?/I\:DIA?HEa+aWHJaYw<lk*NKynhnt$<k
wN9IS^ $iSL/WtbmAp4X^YG?djHYZaa^D/^DAFRnD>X=u@cKm?t$SAlG*Yj4HTSF?G#dC/L>tmX/YRBbJV9^K!Y
@&LpIA 6XH5h91YutEn$$JQhF5WKXqE6F8Pa<*D4D<9S86pTEaj!$iTXQyRealWct/!1hBk=XSpYq$$eXnMSFee
+q%c%l ZR@MQT!BC^T#b:98RZm*J?I6D#uE%m=tZcw1m8N+@w/X4F!X&eFJ*CcMNtQ\hFmZVPpd\tIJ\u6a&*L&
l\I\tA /WpR&ey/YjqIlLFIyHGHQKnG^t68B\!T$^mttGAy6%8\lW=$Gy=V<bjiFiw/yuk9nqF5TyHSQe8=DWaR
4GtQ4y >>A9<Na\*LaS5lC#cELaI9q&qJp&aIG<91V>&k:IGq#N\aimTmJ?$EW\:yFyKHTuApY$:eY>:5VXdWae
5lTM@* Y?uYm!D+!y!je4AAbbdHQ+BHhIyI8y@!\yNw1nWL$+<Q@91RL9<AM?:5aLKwY+FVyI&HJbVHmphlHi6y
nbZM&+ *8ybuqK?\5h<%ZiewyDeY**p*i?w^DC/5+6664VaP>humyAmtI1dK%FWh9I+A?uiIh9BHbZ!4m5#Yj8+
DAA^%h CG$9I*yWSH^A1yMAa1Sn%^Cl\w/PqcjABH9$IES#AbVFWEnkJ9C&C<TA\>=<tBVneZGM=$pmwMLu$R:X
IyRP1? DMZi$nFXw:h#<6bC5GI#Fjd5MniG=^?>b%$/k*bHKVEyYYiuB%Ct!<1\Rj$9XAut#\@bLN:kRt:R%&cJ
hj=S*a a\uFIuPNHYmKqR9a?S?JAeFLydi9HicalScS+?bkLk8ukn>9WNF+1&IK\?/?Hm&ibBwEkYdb!nj9#iY/
m%kK%D ^jW&SBaDl8hbJ+*hy<^d#jyj$AuKVwp1F1C#Ib^cS!5EweXe>#BTHh/$HDGMe!!B6%a&!#VJ49AFYW!L
m\db&D I$/4Pw9byqt5m?C<yXqS<ypS=F+wWb!@a&!@AaLjqhYZFPPJqKeIb!8XBADM5V%lcQSkLQc>KXE%=/#y
A%?1>p <%k54QJ$J5^b\=uYT^j6#VM+bL&?1c6VRDJSq<8JmWR4B=E<wQDFXAy5k$k!SKWwG>aMPPk+=Sk%5y>4
A#XG*# uGe+F#PJWk:C>ECcSl<aKEJJZBHC5FuEK/9amG!?*n#*5XAV1&%N8!T^+#!&L9VwmdPwQG&lp8L9mFZS
&J??<l Kw+VXY?5yMNHKkuSDnEW\/Jb:%VmEDtHPjXRnk?nk?Vj\h=86PQj\:V=!b:@Q&jy?Z?dl@9:QEDj8%^?
R?ZiGD p6kK>H$iwB>kj?Ie=PZ?#>mjPTX=iZ+BC@y^8DW9:!>kj=!:mIPN:V>n\V\@\dL@Ayd4J%nRL&Db8Z/M
ycM^J# =jnQ&J@5Bij+AZuj>%n\V&V?Bd*mAQ$E?\6/^jG#N9wF9j1bM=TDnihZFB4<a?!9KNcQ>&q\5LQ>BT#:
Z&CT6^ Z<D?8!PN=#?tAQ>uYQl9nnVR>>9FPhl@=Eln+?D<@$QE@<el+9L@FmL8F#b=*TZ<Y*S+mbJV*>M14+^m
B@V6c= @6?n\#<JbK9!V*J*^e9NI5e!cwH4&dDpqwA=<Sw4\bFd#unB<5*qW:DpR5Na>Zp^KwVk5W54ePTbnitH
>YnQJu +GtAE1/+eIAcZu<il@h$=KhBbZIJ<k\4^lFq\!F5YjIRyThS>96&YLDp^X4*VWcDn6\D!I5>PHqha9$d
VS8uF? QNH?im$lMX55c&*q/%la<N*bKk#ICy6@y#k<F^+m5@D:niK\P4npWB/lyD=9D%WyFyGjcaV?XIt9RebD
%RJ$XW mV&IQF:&TaN\l6^CAZP<>@Iay>IBLSK:9DQYTB&u4#w!>5yLuhjIucwpui^ki/It%&M4:8Eb4j$u<=^y
Mja/d$ J8bAnP4uHCmmHp9*@SX!^kqATEJ^<=ApD!YeIA/6Aq4+1+lStkdlem@8phmEM1<S6*%qb$=bHmZ?DqD9
SqZb<H G\*6btR%>k*5GCWiKTN^T\m8c>MY9^Wn$YeRe9Pa>1RVmWm@^bnQRX/LhkWKm*LM!PtdFX\#y#*lu6H#
C!h@Yp #SnW5MuBY?5T^/dR=1N^KK%@Y*?SNSlkY6/?cw9yZk!E/uqy9uA^&w\*=1:&R55/Xp$dD$c+SbaSYLE+
l#TdyP #YYNtX6GEta@GpLSIM<TlaZRLJ<^NjRq/R!9Q4e95XYmJTt<S6*4YJ=y>\5@pMI^\$%e!<qn%tMiPiZ<
chQ:bC JaW%\T!\>8n>J#DP5bHCTQ48eBZ>YD$#$\Bi<FV=DQ@C%@ccmPeeCmyABD>XAn!%6+Y+\i9ZL/$yNE?a
KRmh8L +/hQ&8ZXNb!b</:!B>nbD9b/*></t&<dSa^PVuBXK&MJM4jLn*F6FVk5#:GZu!:9P<ddpjXyVE^w>hje
%*k\@y luRK=#+%iu*AqKbbnJVw@EqVMbGY!ZWc+bu1AYj+=ajPhcW9BFyealPyNt#mnX$BCG6TpWNE4T:RDY8d
ktPK*L bi1FmX45=q#11u4MW5#cb8<?V*>>L\L$RIXQ\R<Au\YM^AkK#:&1%@TIXEG@RYa/k/A%EY8MH4unKp=%
j4LkDD ycqiPX+ZwRp=LeH#j>X4uhGq4y%VpbYu!T?q>VdZ:<R9qywLaiAD9+bG!aEDDN$\A1GIyD@CkY88BW15
?h96VZ EuwB=?:K?>K=NC\$BE<E%FtCK6QKea^TRZdq64ehd!HQhTk+*XpNmIwY@E@H\+IEy5uNkNChG@lwhkkX
%8IR+B 9B\eF&+L$=SNZPhW!/?Xyw?Z<m5hcA>YCc5Hq\tqt&^Dmb9bE4#CCe?4Ja5LBYWDZ:DphuJ^HVtbqPE#
h+kceb ZYi*B96c:i#X%>pTGITJQN9>!kHncdkd6p:uJDRa!+KDnJbM^SlbuMI6M%VF4:#9/k^#d=98dLC%S+Wa
8HC%j@ A%V:MAF$?dS>?^RG8pGXDAGKwp8&k$G1D^X#l\Wd*#NbFA9M\A8@tBy4w9C!cIiDJi<!VJ/l%\?DlJP\
MJV6*M ^>5BV&dMNlTDuNANC5bQ^FDnkJ+CS5a1hYqJQB%=TFPF9puc>MW#X+i8wEK%MamyI\kal:+b%c9^6A?d
<M=/@t %1Za^Bp$:?!^1d\<w1ItQ=VB>KlaIR4K&<1d#>Zy:QpXYIQXy5\Iqu!cmQPY6IX#FYy#&+*nLW@!GPKC
!^Rb1B ?W$W!uXcwE*kK?aDJNjL$Qhh6JRQGIRcFdwwPnuq8pLutPwZVFhq#FEPlNe!nJteR8lHlhhjEcRtMppQ
6a\BpH Te?K>^$ja*KKiM9qGhIQG\DiGA<KldNdmGd9LmZXY5tQMye*>Ia6p6VjK:KRY>KVFSjEtuE+GeJ:\RVi
Z\QEKB +tiY^TudlWw%>>W*bVn6?5*/EckMK$9V8*WYlu^>DnPk%%jM\Ik/$WCeL6FG$m+N8CBcP4SmHE+E1#4X
&q#dH& mjDN1I@XPp=k#<hTQ%p9&B*PwktnSAqQm*=cWJ&dd6+yG:1l%PKGwQR5WP#q=k5@aQb/P?S4GQ?$+ZNV
aJnKy5 J@tXSK&F=%5jGGD/Q#L*JlFV:*Fll6YXdQNN>=hNk<15#>8&JS$?$B#IP+VmKRkG4*?IYCQ!DMI\!KSy
8T$tES D1DeyLl#bePRjM9ImNNVyl<t%EVj8\AqR4+bRLpjmIZbl=MuyP#MnJ8@ndh8laJRe%q6d6mlQKw1?cc<
<=%M:k bLD&1WtSmW/*PYclBT5%\Zkn%46$GZM+/#+>@<u<h8%*6&NDdY5dCYnmqc?+ajKdlQu=BWZX8%1<w>/V
tEMuSm B9DbSk4uNkt!1ReiqZ\6Z*6K55D/bt?**mpY%=q*JnVXm@KDRLq<i&=J%NlDGdG*ZW?6wIYY95A!t*Ny
hPcIaA 1C$YH%W!lqIF\qtCK4e&m^>>p/ll>J6lMbVK<$=&6@dWiIa^Y:V^+ew<i:/^1H9Hwl*#6>Cl1auy?6*1
cPH=Pb K4LqPHBlV8i1Pk*n68YLwpIi/k>>WpMpkVE1h6M%baElZ%!HApMNcLwF\iXui8jFc$4Lw&tdGatjPCWP
pitBl6 %/Fa#6SjVJZC\5WuVbQZn>Yb?LF+WYY>N@QL\\nkddYwcehS6<y&A4>Z9dYiR@a5GD/*<&XC^yht&Ke4
+*d$G6 nl4Pi1*LM&=P^!^9QbW^$TJAaM%Gl&\?^?H5jPpaij+WwX=+6CuAdmNHkEY>+m$%qL#HAM$\bQy5D=jK
Z*@nmE <W4>w44&#m%86e8X=wyZt>N#<H$CdYYB=ud*Y#B9n/cY/9Hu>jlXJ5atj<lIHp9N*LGbw*MdHVp&>LyX

-A!nL$ 000b3ddc41e001202b4 Page 281 of binaries2.zip
h^b!VE RnP6+HA:HdAPtI5^Hw&!t=Z?BJmE#NDm@Hc1Yt$?!j&&Q*Bcn95>QL$C69>d9jF#H=cm:ha<RVLD!LbQ
m:LK8J dCXtXAIPhKF^C6Kmk8pqV>5J?GHJwnCQ*n&:$Z5/>\p@#Aaa=Zw+#CuNSN54>?w=mZ4A=T6EQA*tSi*m
LL8$Ml :mAqnKZByc!k1B6dDT?^EJuiF%BKNPWX>abFQpKKl#Zh6&dYALM^9h+ijq<ylLkRKElLPEE1iYBkwHHu
*cu<FL ElL6m4@pbuSaClIn#>hhewB>pu>@*E=BJ<4#Y<NCyy*RVBM/CCl#PNp\lCD/?jThb8QJ5KMCy&BFnJIR
>WA*Sq ypW^K#e:SITQ>bZXLpGWKq^HIB*^:T:1db@TVTAkSZ<9Z/J\etIZ=hLCJaecB8bA4Hh>j%G!j4E\CedT
@bR?bu PG%TECbjdyu^Cd4e/t5btm<SEk@W5EBFQi:ljT>H69B^pm5cpEFa5jHA9J<pt$VqdlVMIheinHaBXn@M
m1dy:i njtYp&S?hy!nBlAYKdAIl1HmJR^NmK+W&+6P<+KkdB&LTQmlXVuLGVl&YVkJtK@:Kq1lNjnIm$5F<:X$
jSau$5 KqQANP<ibbk<tRX+V6!hLt\/K%<LyLyC69%VPdM1d>E^Y>R6@4%B59MIR/:RSeMcj&hyG4$nl5?>*#Cw
G9CNS@ ?Jp?9bw$NL^Gu1!!E\mk<8KtplMCaT#pCaBbcE/pte4Q^I1yXIKu*9XSGqVGWSY>6lFp\W8Hm#NhH/H5
%R/#@d B/MA%yH!XI#:&\PelNFQ*nEi8$$mCiZY$E\?D^QwX6QjqAMCC8DJn9&W+1ykwBhnVC*NuQ\ph/WKZlKG
qQ9=B> 1EMM/@kQhB<C%itj/^lQJ>nVDH6PS?PlB==NLpyRZmceyuW/NL:b#pC86EbY&9hVIQwt@%t!&5iVW5bc
&I%#RT wnn\>VIShIm$8M$RBmM>HVY?w+IpqSZ<>DN+Y4FPwD1yQ>QE6MYK+k8MaPPXw*N^Ba6$XcRhFljheId%
6K/Bt! eRP=GSmtX$1?1Gq8b:Yd<j#j/C:L>\B:Cu1D\!1*=9Cea6/K$C@Ak/DN956wtHQDMkcp:PENVC5VqpwN
CH%n1T &#X1DLY>n=#54:D1P:F?GQZH\R:?Z/G8?KE9=L@q@?D+M&@kL+h/@DP5:+>RD\/&@$:eG\iI?$>^d4@d
Thca#d W9>8wZ%uC9>Pb9Eja<a+91et@AGYm@*HYJ=j\Q/a>w:ni&4C::GeQD>pYiD+uy4\B%nPH#@9>>TEQ<B!
XAyAI1 @ARL?kZ5n?Q4PL/uJ9\iC?L<5RZ?QVZl>>mj8m8?=!d<\a&=j8!8AHH>BT#*D!KB@t9+L\aqQZbu<CMK
D?%6JG #QQa!dt=@uMwEAjw*#c=@!:Fj?HB?Gj+#&<iDE:&:#$a@$1B?A?=6STN4Z+V<R@B@?c^Jj6HTLC$LRjb
>H^#TS *+N4!Z=#Z4FKtXp?6*kePhl?C^WY5ZS^XnJ#E4Y*hdC*?&%A+TF:HDX5:J%WHa^MH5Fmbt/YJta1pmJ@
Cnb>Fc 5P6^@=cd=b@?EnFS6S@+T^+YH#+CWIRjSVaDtL+CAAARD<8ARAAe#G?j^:>\THC\eEkwCHB\CClw!Mkw
#jBIH+ !Mlw/EmQj%GR$FE^MLE\MXD^<AkI<QAwKTkwKGu@?aGAl+PDS+BHlIhHSEFESpSBS*u<wGQ?4RBMQHVW
y>MEaI ^\</Hk+8FlaYL5=9eAICeuI!e9I@CunwBKDDATalRFARFABIhAkwhImHZwneS\FlIZ::AQ:^kRbCReJA
$aKZAm AGAj:+aIAaCElQ4Z1+<@REEDaj=&ER$ACREFBRpNCRML>jkH$lpCEkwhGkAp^&AZXwdBNKJ\>MMC^idA
l66R1i a6iIWHcyVG%\+BmjWnu=u%GLkqZnet6NuL5=^Ynn<?1+eNXMZZ1tN?FwA8AS<QADE<Rq<85%b6VyCM/*
njn!<c Luyu6!@NZIMTC^4/=uc8#N&Cp\wd??h*Q*NLcn=*j=%e%DT\5QiFS$4L\mMpydl=eHH@ty=ZY69TM#T%
I&wu%D =P*R?+P9DH\!PqbiaYtq:+cZDt@RH=@uWWwk<QEbwPGkwG\ju\ehC9w*maHKn^LDPQ4FkuJ1V4G/ynaw
V/RZ%n SdBXnJ*PPKnAw9++ec4W8Tc%*dDP$=!dakG+c9F\9+qK\!XPRG91w5=>uqjZR$e@5*WStJBj@&iSJVV?
jDM$yn EQ1uM9<ZIn><AEAD5B/YAElRj^MYHTAIkK1!MnB>1c1D\>h&T:N/?JGHQQJctEAwqt?!%6HwY<?w5$y8
q$&c4F IM!BZ^11aH<VttD1Dui5LEEXjuVB\a%PR8$=%e81L<Tu>w4lZt:yX8&m=+%=^c5G?8@4Jy\b?a>yW$Zb
#=khQ$ u*4p?@pm\V<AGNcG4uc8eC8Z:<\*Y%\iAG:jhqeJV8kCVVy6IH#jBVcS:4F6JK>ZN&>jLI&ijjDM*XA*
ykJnLW ca$%INXRy^tn+bh%XFe=RRdR%D?>Medlc<1+R4Sq6:$cE@:wC6=qEZ$A=Au%H=V*ey\wYjkhI96RE:*a
>A/QQ4 @uT9*lSjwqne^nl!6>><6HZ*Wit&+h!CTD\AYMYAGB/tPjB6NG99$uhW<L!W^MhmQhq*1diC?RHAdk?J
4FPt#c hcE1MX$9m!F%ATQRNP99BMp^5DX4yII1@\%JCuZWD8jeN>S<m=>>=YZJY\kGZbpe#bu4#!$!me9ty$Nb
wpJ<pS 6&Y?6QMh!q=ZXjM5jCeQAJ^9TDydk!Rc:^LNt?6n6<YpamQ:P5py^EP^XBRGZ=u/JwCdLt$jAAm9n\!k
8:CFAF 4yqwy&+H<mX9qSR=a@Mlu%<@=bk8L!Xwe?M%<4=J?5S@d^MDDQQEN4dW8\kbLm$5dlHM*5&6J/+%EGS8
G<$+\< #cluNF/QTtl8Z4/Z&jEhdnm*yd?CiRDpl$jjqH^/jZH#dQeBMJ*li!dd\>4q/jN&N@4y9p=Ett6@t#Nq
6ct9kQ 65b8HDeGER!$E>RAa5iPwijMjXY!:#udu1H>mCINL>QTC\/T@BW>#AeALclnS>8V<d=m+F=!+kGkDq4<
Tn%#?# uQRKkIIld?jNk#whBi>?X$Z&AEn$&%P<chh@AA#&yN@/@9Q+ni?>iuJe^?GK::d*A?BKqj8&nJZch/:=
bE95AE <h4ZB<BlIipP!&PbTwIH=DeL@w<I/$HBQ&Vb@XP^@/pw\YH>4Q65*&uS1!4wq98FGN@w&+MHkPbI^%e<
Hlh$J8 b>@l#w8m8&e5D+B6w@GPS:WeGZy&bTh+L8B:W=L?=&L@p$TpZ*?91YiQ+yq6X>$$pZ+qFd^VG@6#5hHu
mMhL!# !e<jAMYpq#F*%q&QN&:aJn&9=9>jptnk@4E9qi&5*Wd\@t9d@VYJ@1Y?1l+A\:Zutui/$djSYjiq=u<8
Tl!HyY h?C4dN$DaBd%S51u+de8hI:/Xa9p@%CB6l+AjL=#==@8JanY@qY+9!VR9#Vj\kQkV:&L\@hjm#Y=LZn@
\SpkSL 1N8\h%TCP1i!HTii5Ljq1Q<d<6Dh*8%^^cwhJd6RRZ*4YhuV8\DP=^SXXtHZL?\#uSTqIi/?c/dVy>\6
V@TL1u EiFJkuX8w>?$k9y6FKB#tjq:?ac9#*GVVJF1lb?W?iN^jymCJtpwj@8/dP/kN8M=pqq+<HWdPyGt?tB6
Q5*?m! lFVLl%j*mdMhP/YKZ#1Puqp<AH#9:^+A8q^E>&HXD+CZ9nPmX/#%c!8?6M<GKt*/#l^>8a?Smn5iJ9ih
8<:Z9j H@?X>idp=nSA>+LKm:uZ+iudlMGMHlnI>MRm$a*ZF@?+jJH%>imin?5BeQd/u68tDp85EGKuJZRJ9?m%
S:P/%F QFQKtBT/Bt81yG@$+^m@E@wAYB?+uWt@>dS@ADAyQkBkBHe#AubH5/BI*bj&P^K95mcmd=VGBRiTHkDu
MbDuX% 9R?AW=N:!:F:@1aHRBL6A!CA>EJB?MLwqQ*L!:Ld19J:d>@yaMe@ZdW@&?t+4SG<^Z5AyDtlyyQ?Xt#H
><yP*J <M*E*5Ah*ZQT4SHj4<c?%?\QAQDnKEKm?\AaiS^e8/K@FyF>4jdA?>a?h/<=:!5kiCDKH#B?P5H9\J\P
#RiD?= ^XkK1ciEA::ZT>\nu?ua!4F<APDuQRBCpa+GKyY#mI^/i8a@XJphZqnB1CaEhJ8wMd+y$NTy$%/Swwt1
iHdIY< btS!9DG5n#4P<c<mj19iQ1J1&>Y4Pb1$pmJ6#%h5yTalLd=B1KH<VSA4adl%6u^n%5#9SHqS\mSJ+4KH
M/C8K> #h^QlETmXhCHWd>t&mwJ@cZ&jWqNGK?lD^&Q%?A6dqZQcdj\W<C\ju4q%X=n<K=mmjV\B\wjy1ubt+LP
1qubFu d!mZWK<u9NH6!:5eZbl^<BMQl<eHiSmLGQL++llQTY*kTT1iE=iQ&nV4T4I%1aY1B=AIFLHRN=Ga9uy^
9KdChZ %V8SawP^*q#41#qn4k&IaBh14:5!qI^E%XQHej%tFnI/KaetRTQ+IR=:L9Ny+G6*PM94Gi/Dd$dpRhty
C&/GLn ?1I6@yV9Kb$^G/j6JXT+%t\RdlI4*waMFiXCZd*K>#IJqZS^dCc%XTqc5>Ha9i>@$tByK^hN!kICC9i*
W^?bSB B&dXL<ihX/Dc*mi1E+=!YiT5$15n*GRMmpA@u>uenXL5P/^+e8$Zae@iDdFq/WBFJB\q4nZIQF4Mu@/8
j?8Wyh j\A6&1BYtqK>hn%?5FXjBQqDw9+mCi*#kleuJ\H%&pb6M?Sbp&E5Sl&8BK?!aX$YZ*#/p1H8hMVXD*!V
p49nhA F\9FISHT/e!Ct#dR!<:@^9$bcd=/#XFT%FTPNNw\i6+&:1a&Ce>Ww<uCHMthk&XD\DwERM%iYhuNRP^<
Pj%>Sq Y<%G*u&6@e=yj8tD8%cM6+S<At4Eqe?dq&h16a45:!W?waX=WpjEuFF=y=X>LtqDy95ktLDDuYIpWJXu
c*nih% T*tnNPGww8#JSJXh%P8##An^4AmbbBXiLV?Y5p!y66ajGbXeTVL1imiM1klL9WkGRL>\d<XVc4A$mwl%
abSR^M Z8>E%tTKlEhQ^X<B%A#QYyI+Ct*9RAk=5GYqNhZlBkL1X@$M>Qc%qByknaJqdi*<EmuEWV^=EADGjJmN
E6%Zcu h/A:PE@u!=qElQNN^6/$&HNcdJpV%?*Y6&F\lm/ch5lHKEmwlShRA%:?YKy:$i<YKB9NcPAJPCnF<EZm
9QJq@^ n56N<m$Ia/<@4!ASNd1F$MXIbKN%Rm9^Rk%!K#TMYP8ck#lE<WEu>A#\D4Cp+dcjq:*XYSVbhFy#5b8c
yLd^!8 6$j\mjIRGCuFM1^G/WcPTmkji^&/SDVjtDXDTMaAKcBTQ:ARAWDRRQMcYd!m&yE5tG$hkEhZnQlb*HK=
&InLF< WZi=m<#\nBL&jR<hb%Yp%&a^%#!=XyI!WwEP%b6Ghd4cBj>1N>ZBSI1Ak>+Fk!bLMaHA#w9LqJkE#h$c
AhiA4D NI8:%Nh!dNdY:85GXQb!&DLF@P19ehTZDTWGRM8hahmW+8wAPkRARCYlcNC+^Nk#dGwD<+aDtq!:MiJM
TENKqR E:$Y5%@W\KD$514h@AK:6F4W*uEpRGyYTPRMFMZW%S\5EK:1#SdYQ++XSdeiReX=PaDtMc5Ww*D%hMLd
CZCRil 5?qX6VMGL1DanmKdc%9n#bpc5LIJi&=mLlCnZ#bqdntcIGSihVB+<XbM%ThX9p1HbbNZY+kpD>ABlSHi
dn*n?6 %YZwCWZlD%m<neK:ad9Rjk4idhleESj*t9!&lVG>^E=Rd9YTaw!R8:e4JY=51HTPe&WB&:XmXnQYc*Il
5P*&:a ^F#?aA=ihd16u#qTcywcu1CWdL<WALYQh/#8=:8qt5=>#<qdw@p\>e>^@e<D>#:tD*>8k9$T5Hu$VjhY
IDMPyk \ij/AjAPVyD^\E&ua1#ZjV5pN*^&t#AE!^Ci6n5F=/Z9?VT>AX%BT#Pe#E%%jmR?bRXl%QYd9Fa9$qRC
Yeei9e Dwp:jDbwNK+uJP*9$SheV=/QNQwa%E%Y:e%WFE+#X=1H9S?%8yA=V/W&dNM8=l:e=Vk4$1bG+:GAYmX+
5>++MN \TFjqJtEPSTGGR81I@ePb:Ju9>hZ*iCiY$wM9Y84RV&nnZ$W>RZeW5e:B+uq?*FJ%HV?m^%tK?Dey=&*
-ALwM5 0002848a2fb001202b4 Page 282 of binaries2.zip
X6KTmQ GFT1R>DVZwPu\>qlV6>w5ylAF\8:LA&PbYN=?=l6Dc*M?*W>4hMnW\q5XYkXy:hQHYHJ>8JMQ!n9&ZXc
apu%Th 8tS$MIjjMZAyeu^Fk?14:EF\nY!1jAA+>Biq*pa\nu&MD1L$>dWl>$eh%TXYN<up6T6IFK5ND>dPaSBe
ZV@>=q m&M*k@a?puE4jJb=>iTddBui!b5KiL<$5hAkB9&En+Dmw&T%Xk/PPPNIR8K:=Sw?jjwaT5Z\DiJWKkGL
e=i$:> &^aY/AtQ5lQC4JmD8IACV$*q</9^ll\>#8:?SAppN/9IXD^GKIYGeWdt#&*=56ce^=t=e9=Td&QJ/N!8
XIWF6X hc<D+1NyJ\/KWp+M!Y$LtMpmQYa&^S$@Y!j5dIWG=1XVl@dKkBcXtV*4$%VDtaKSHCtJR6mJleRQ=8:I
N9I\$G @?ZNXnI8Y8R:IDJ##!H=AMDAZ+nYc%EjF<TF1t:QYL&?V!^At$&EcTGI!8QGjwIGh#DDPBe?h<qdXVcR
!CTuV@ XcR<Etp=E1&nTb\!jyJhCkSkEcyp+nhVY@i1ZaHZYLpay6TNJADSpKB>jlmd^hI%iT+meXn=+MX%\D:k
&yiHCu 1@qaYA8Z#YJb*T<eRD+A?w8+:G?6uI&4H1d@ppLDE*HiRi\cQQYXGLuyh@:Ep%cX*Fb9Lj\ARGb^jed\
XAGG9< Z4REYXY^8c4A*iL$Kh?$CE=8P@dkt@:Z8&>+^I5?YKd=%BDu\6uc:adHy$CWY/yA=M:P*Jl=%ypRSKV5
%FE*C? pPN:Kh#Nn6Teni9R!dBVPey?itd!Xe<$cW%ynyQDGSF8P+=caui>&DDw@SBp8p<XWdn%qPJPB=?<^%qT
?kwBNV lD:uVk8/$FqLKlD8a$Qll*PDt$>b8bEt?kJ#?EJdjRyhZklPN&#9Q66#HacN8Bi<H\>MWw9Fd+/9Kj^t
:dMq>p NpADkh=DmaEewHHM#@V/Yu1@^@X>iRP!nt+F&^n4A6HwEeP4dt&6Fwwktt^MtT>hAmb?J^YZ+b+CK&:%
cHZmMX n86>:<P?HI!kdM\$nEn5&ijyTH#LWldF+HWlP/>elTJ%LjCMXtd+\miHkRWNKc5b4hw^w^e!>Mwplyh8
DYkIW: MCw#B9Kc%*+jnAGeKpmjV91+Q^kpTV#Ed\Gu#8S&FK>Ik+cc\w>A:MjE&Pq^9YH%%Ze5<yRttcD$GJci
V^E+@b DmhIZSE#4wQX$%yq^1XCX&qYnY1GewkP5e8#BVXIaluAy$15WTStFE/CHB&KR1G\9ZnB#F6nl5iS/m@w
Yt5JFB LyAy>jLJQS>P%qtc+HZMiK9Z+$T6:PbjqFe%!i46\PdlE<TD5W@SB>Ijti&**/XTmG6S^=4jhNqHkQy4
cQ?VZI Vk&wRMGIIn&P11HTiaiR>CSQD8S/MRqC1dL9n<IR&4nkNw8?q9qV6:KHq%T/+6qm<LaSYyDRiNLawheP
Z=@=mS \IuwTPNu?kqXI1jlNmbQbcupMeE:p86/LAc=Qq<TLA@X!ZAuy^P+:Zi*XJ:t^IqMQmwQtk?ZylcI*SVi
\9$>q5 $m^#jyIy8ZET^eh<$I^/I&I9^Q*FYJIW6qn*6eE#\=qplw&M!SF:5N9F5:QW$dCyG//hlL+DJ^*Ed8&R
5W@GZm XI5Tne>hyHqF4J+EX5K4+%Id44wYZ<F^%bHatpieyJkRG6q>K8HENL9VP:VYndGY&wtyk&/Z</Bb1w<!
YB\%!J C:ij8ZyNA@5@H>=pwV6Ce\8qY@mln+%Eh>1>4VGAVRcC8\TXw1Nbb<JFGLL&Xd\NEb1K9p%E9@4tdV*\
+u$WAe 8TT5jC^lWn6H/h++!LP<Mu?JDYmENI*&W5cduQAnd!ZVHcFtT:RtJwNW#D9taktpp+NQS^N+YIb1C#uR
C8P9u& 46DGFd9>BdZJq:9#PLmdWcI/\RAPQwKWIkjIqH5cRdnmNXJ*+@qG%PLKeywk*qiW>aCtApKFqbjcp/4?
!\89^? PDD%qNnYZF!4T:^#upjK9SQpReKNtpT9SP?&eVEpFXiL1%kK*#kKt&BTSd$:jn+N@a/RT\I4at^1^/C+
yV5EID wF&4hGX^y>d994<%Wl&y%TdnejLGWEF%uZK8R:e!c>9PZGnS^FeP5:t5l9C1PG<J+AQYXn9lQc^pX^P\
VhFDT? AV<A+K$E4%\Xd<RjAFZ9P:y%w8@$Xi>nja<?M!V8>mmiJn$Ptby1D+D<b#h*/djW^R?A8VuBA>#:D8MT
VV?%:W k:?I6qyeGb^t+6=>y4C6*aHwIa%m!ybEj%YyJ$yjPbhhAc4@>mSTPl96Ga>8&JqdjXS+*$9F<MkSpwTX
Itnt:K S*8!ucGDm>tpeMT=KFKj6W%ZJGPKaEZCwP^>aK%1PAF^m&$DCtXaNi9n/Gu?6*GW+RH\MQPZBqFpV?S4
KJ5!kl c\Tie\$Q>clL\Gl+G:?%*NPL=?tZmBNk4c<1?EneI%:#Z=y<p9Nn8#=:1NZ54l!e1jm@y8CDlDh4n4n!
FQ9:pD 8QddqMac+p:&bRE@qbnjQN?l5X#ht^V\E!p8L%*N>^eT\K/<j/?RT:a*CAedHukd+G5TB<a#yVLywV@@
!t5hcw XN@@AFCeF8#ZWW^Kp+=6kG/&NHp8T1iXF^8ud1T^ia9M!$K?$#9yt6:tYCE*aqpAebC/CqdQyt465N?k
+t^qPP S8b/+n1aYBXnc>Cn5tDaEm^LTL@Z6G5RTj:19k?IT5bFXD%@NQnPbtHiT!CnBNQk+PBq9!YmX/VIPGda
DGta=$ ma:LMMnl!p<\#K%/lJ&+N4cG6QABIPJ5BlNW:Ct!Nd4AdW/J=A!i^lGKpY1l5w5?\$&Pwh##u&itdm*p
$4u1Hc :KHKNb>=yk#A94#8FnJTEFk*Xi=kuLdit!c\\NG%huuZuJkTFKG/wWqq1>m5<dbnS%NawMm=eIT#%d+\
&\Qi<> *&qF+ZmEwP#X5Kj1YnP?8kpbXEnY^w148bNy!=tuX#5\6i=A/i8VY$tpjlWtnhQB1CBbhpn^Vc5HAATa
Q6%ewA /4Idqj>whE?&IeKQ?HM5<lB$>JI=+e64Sh!hjIKGDL+M%X/tKS4#?HkWTNJ/kwCNuYjBd&1np%*K>Fp&
$ALX=@ Q!@Pm$65<5W*q%R<LX8+&wc8*51p8*aKHiJB$V9W^hm!86+yt5XpaeFVQAtV@4jy\#cj?/$L5?AY&QiM
tnDChm @I*H%hl+WaaQ/>QFb\4&*4+!JAMc$@ZNu/ltKjh+&\XX^C*FcpeNR%WIZWN%E\wL**DSNnmJ5>RW/hSZ
ZKCnTp !>wWe6YHjnVBkE*wNdENqG<yjdRAKV<V>GWtEl>p+6Np/p+u^ZbVk&R=lNGpVC+d6<W6B@%pQ5NTaS^^
WIk5tN #Xe\&SyY\hYH/eaEya/ce@F:kL$STkMMFAT$I#:Pd5/C:$CuEpqHX?<JnHm+jXwLEuSlwkTXW%hFk9uI
htticj e=c:A<59LFZpT+BN#A!!TA4R=RW::yhdV:k@HqA/qV+AKldRw=Ycb8!B4X^\C^E#L$*##?ZJ#ZDt%N%C
dw5>a* /8ww?&EFKDek/*Q/Mw<W+t!qNTd^XdTMBAq#QIu91I^FykC^d=%pau^aG<LiMa6$+yEFn%c$j5d=BH+>
Ktu^w% T<+epl#+*J@uYp%RA@6L=$*+X<hWI<ppZnQY?%m$nBCAh1dG5@iK1wej<%p?jWy$LLPaQ/Q8da^nyEpH
IYu><> n1INWALn8Ha^Fp84Nda/qtCNFaWeN=<^WqC&qVpInS^CJ$/Ca=@&Jq4b4TbW>wXW+Le1MDSKi:>Bwmj/
5IXNd= PETAKuTBT\h9\pwh=!jJWJ?+<>uKT^M4YZY/@NNHR&8#8:FSYeaBYu45ddMMYTy>hTm>N:h8SZLPE#99
9JI4F# ZtyIESPhM?Nn\PPHP=m/\eauM=>BTuFi9+8\Td6Q=#/kW?uc\ZpA6CjQ1tBI=%^C1A1hDCGT9Xh<L#Cu
FNRw#R *qLCZ@\F$qL##WAjuWPhu>yXIjpHYDSWiGSWHbeulm&!V#HX/kSX6t%H^=kTMinNp%laS?d#qDiT:W$c
>qM9q# ed#+MGT6FyV+ehEyiYa&MWCDhZZL5L+/hN9GPl9JZpw%^>aB#Le>8X1hn&NX*J!GKGE@lXhRTF965CSy
C$uSbF Le:1/?/EQ6WupaS!:>:KD1&n<yHIZBt>SemQ!ai16%:w>DC$8K*Ly^\e\=R?bAh:WquBBPymj!n6CdIe
VZn@a^ 4m<y+EAFHekXd?S9j5Swn#<btWaac^^?/dK&l6h8Z6*5n%<8@BbV5DCdlA^DGT8?8ak*n>Bq=%mCIiRP
6AVR*9 Il>t6@FY%%><!ECe*Hn4ILa9CQ<qb=:4emXe>W^F@j+1w/HIE^kEcVBCKEb^=VeGqGbISjcq=XDKh=FB
DJjCa& K!BJyBl^dXl/WhCyE$biGQ5K$9!>?e!i@/wBCQc6k1MEYw%V&dC//N4MZdp/:%nk/>GpY58b6TY/>Mqt
5^1$1d ZZPX$dKlQb^DYRbiRna9S=4ZaAH#859hF:QYGu=l%iRycCYE1dkd14$*AbFCn%c#?yP^IQnhy:\jXYb9
Fi8A%: \lpuwT%YRQH5nhj*BHSZhI^/*H*//X\&/8@4#Q6Wlt!Qti^P<uZNLi$?wu+TXcP<eScp\G?EVV@PK>Ne
@j*LHT k:><Kn4!lTDq6ZSp<19LieeuYLGRNSGqF&a^nlJdI/+AJh9VRXb#1h$c#hh#X<@Zw=Yieq%8&:q<11a<
S??lII /H:KwV*NKY<bYXEd/8uN:S*>CV:!GlRIqF/Q@l^mlq&ppX5edqqi&h4?^e5dB6HVYJkA<#&&yt6Jnw+n
XG9u$I =<4MV8^6nK/i#8yZH>tSJ+/&YDXpYph6&NmT%MhC%?/44$^>5R&jZe@8nn$AIlX5%B>t@=w^+b=$eDY@
RRFGA? <>uDnt@BMjnicPd1nc+MH#<GcHFq8AqVLK#quSL>Zuj>encQ/5/:P!elwHSE&E6KQ5=w8E%CRQdXE=K5
Gi:T5q AjcG/bT^d&$:w6>pu=5MIpML*:8$j*p#59QTnSlndYV\&GX\D#je9k?bi15utR?ZFNFqS>EGt:wndd#M
R>aLbI 4Bk@\<B!51A6@ed!qMyXuWnha8&+VG>@^NF8GSdJT/NlJdb^nZ@<LQBKH1C<jH8V6w8iyGyw:ye5JKld
GtKn9K k*u8YSBI+qLVQ88c&Pw!!>y#e=+aGSC<Flw=F>eBX>SNQ&WbYj98w1?^+GX=?ti?wEP+n&dwa54#dNnY
ltkPPI tJI>lwLJB$jc?XHt#I#?4hKIJM6$m\TVnh><*:Dll!hVKcplB/TlyKP==Z#%SX4IuB>G!lNT49n/=RtT
@qM<$@ q=RMliuq>a8WePtTk*9=?BE8c+clan&1Ba/p*BR%IHy@du&J<DM$6q%pN1&9P66T8KuBHcSL!P4Zp5HL
Kb>&EX $?q*WKkt>YGiAE<qDkI9K$ujHhw:@bJQ$ShE/PLb1^T9/B11V8#ten=Z!hZBiC?XZ=8\TkXL^a6WS5/<
9Z^%MZ 45I:5:\I5XQknZa9&F%!>bZT<i&*iAB5m9KhHV4HHK!hVha@ACKtHkC>\c=dC*!&tn!*B9d@MH?JBhXj
Ab\MG+ K$She8b>$JQ*i4\@w>8d:hTe<Am>^FmValXQZkTkNEW1YdLPVb=MiGEwihR$jTWJ&die!QVZZ!SaGM1t
AYNayB CtDiRP!d*Qnp#:P9=85+Y?FmG1Te=EY6#i<\m8Jm^TuIXBh%T:6hT>^*DqLQt#ha9u#CGehnT=FyG5X6
H/\\S1 IGQ!uHI8J%Ip/L*YRk@:t/WMuRm9q?6%6hMW8NTF8JDLe%Tkmyy5I^5GjT4=qhJd!5$m<e#Q@hINXHip
aPmMp8 tDJ^QanPycqypyjad!L$QIL6TuW@>XLMAlQZb!/@Mj1YT<#A#<@D1?G1N@lk1!GTkqMF8KnhCD<n6q*X
#cY*KS %%pyy>QJlVP^1Y@hu\+@ANSS!a9/edM?NDIE9%5AN#PLVlR!pp=Xj>D6lWV4Fp<Eq5dqbmk%&hh1#bmE
5jAB5^ ?<Te*/C:LHqAbmAhaaCmL**XF:/&+/E<AFDqt\:CcZL5tW6q=yZ6u#<HpRQC>FLJL%@*VEEy?XawZGM*
KEtFYH *EHTeA9t:tBRtSY+Npc$Py/bChMnu>/EwcK>iEGp49XlH:%&icnI!?uXXIkPV!q^iuR?uHFBTtd&yD6F
-Ae*Nq 00019d97e07001202b4 Page 283 of binaries2.zip
>?ZCkm e!BjaVLnIW=wQuV\B!yy@F=l@aXJcTQDk1nS+ZJ*&El^6!+MQe9Qb!9CLQFE156LE!AJp@DyT#@#T$>t
1cE4>F h:M<9tJKd/S&$?tKmIMd#up<+^Ay5qD6^H#6q^:9kRJ+Gm5\qD9L&QyQQ$hda<<%#Kjm9&&+Nqkq1!^@
SuZpp< Th8mVBRH%&EPewiMnA4?J6Lm9<ySEP!=JSEMqAw^J#j#tE4J9lcw/YAlt=%??%#:jN8SeeTRZP1yiKkP
I44cAK uTT&CaakAn8Ay^u/t<bd=WMC?TZ>&IJ<aYA=TNIXwj?&ILXm!p\F6V5D?*Wn\?8+I+qbq/6by8P=?\Ju
8<IbD? %CLIa1YhImq!1l6Y5t5Vmh\1\=d%=p<8+ba+R?W<1&MabhwmDe<W:G\/%8CE>k:a?F<Jwu!DCCFq5+^j
kjECbI p5ij+YZdH4FuE8G$h1aAKa#\SG?a^:nAdqZ\tZHqbK<wGqt==F!=q>eEEJG^Cyd%EKd$jI^mTY44A$w\
ECWd*Q qJCW:ZkcwCwM<1nFbn6C#yJh1TYwu6&cWSG!Sq414!#wRDT?<*Dbj=>Vd>$lueTJXB*tbcYcJi>uBu\=
Yt\BL= 4t16I*hnjNl+w^bN=m8^6Cy49<bht89PZ54alBM=k5H*yW>Rhn?t6\u6aKhmX:My#GL4FY#W+\6a1GD8
1TmNkC GkXc1aI^4PK%X1*jG%cZuZ4^b?4c!5Z>kl1jVNQwTDja/!A%V%#/Q%nhRM@ANNiABk?8Rn:pT4lyR#6T
kK*aF@ liyES!LeqcLBdLHa?5yqT5h>W:DE+WKuM\*VBEX4j8Hu4hpbypYWKVu4dH!ZFI>d<RIqpb1t#Xw:wk\9
btlYWZ l8*XB=:L^TwCuk*SNc<bdMZ/P$K=Bu<PcEb!!4V^@a\JiwF1kiFm$6d4a5Ac$yh8:I8uSTXZH5ejbTqV
Rp5w8X bIwDkdGtWkm?ZnAVDJZL>l6?H@t*dHI$=1e>6YjtJF*l<aZ^Ww69w\/JlauhQ+ZX&q:aS/4km/IE14*p
HN6$#j >Tl:5d9G!MWR&Ja?uhau^$mZ=EP$PNu@pliQD+Xb>jV5pG>DQDM:@4DG/=$N?kSqI1:n$Fmp^nynCV8=
i*=4Gp ajhepDhekZBjqY6Sp=5$$=%t6FL\PEZGG*W#LeZKa<^%MpWbn^PDIpnLh>8+<baA!<N+QSlFNdFl=m$&
e>PWA\ #q:H5wRCdcF4WbenlbSTm1YQmA<A%mFQaP%TiT\bPwKV8ywB\#4D>K6d\i*JE^&+i!utKp!q<>9peElh
eh=T1E *FCIIJ>yRJm/4yFmk@wDkCyknjL/#*/:8d@tmCbq:K%hHSp^qjyc<=Z6dIl/6Za1y8aYwX=hcVucK#yV
44P6uQ #CXWl=/t/IRch4#=T:NqSk$lXMjXp=j9mhX+#tW+J*ZhDVe\y$Yedp#w9W>+Z^w@b^^%&6Jl@!aW*<a*
@hj=@X W>L%iTtlTT$<GX6E4*myacph!n5$/h8V1A#lW?d##%&N<atRR8=dp@P9:dJR4F^VpB^VVjlBSNH::q@b
+4:M>H i<ZRICw@9cC*n1tqRHCMT!\TP8T6kQXl4D:6I9CmujeARXIbwCk1K+b+Q&MZnntKBl$59b^LuZ*P6SEy
^i^h:R t:LN@tbM!IGP9uF8tj4GbXIj<WY+6IbFQuqiLB+w68p>k&Yc9yyb8CyTLk$qiTl$6DS6T1NYIZWAqhtE
IdN\lA k@&^ZLwC*Gw=pnB$#e:dp6Z5YJ&FNam9kYiV>qllKk^A!5LDy/%5&>Z:jNhG6Gt$\upjBySRETCcLyD&
uYI@#c /:ZEulQXaninp=#9Z<WJwClQjHH1mB?:@HT>@<h4<Tnn6WLXAcLm>Sny4hS#k/eK6y^/Y&i8V+M8h:<M
1F6p$1 ZNcpE+81^w<TXMddjPGZP!Z$qYDWCCLSYym%D1*Mna*%wCXZcJZ/JkcFq*^BPnd@BcTDdG6I<>tc^+^6
8ai=bm &TbttD!1Bk/YyTZVEBZyaAp*wdYlpqnmRtPG4QW64np:W=uGiuY*!MIBn+W9e&8I%#:P<*9QB+Ah5aAi
StyBhI Yq$!ccmlWp=V*\e$SWyFuQAL%LF=HIthV^LytCFLeBE+IWw!M&XN&A$\w5QL^%PCWZ!KQD=GHX$*Kl>&
$dm:Rd t@qbEN>*R&Y6>TtGwWa+lwVNJ^#w#D\S>hH#^B>:Jq^951uTWd:#ABl?i@:W?kbtP5@R\/&A*=u!\p5l
HmSH?W #ikeGI*W5p4Y:u6^*DRj\%WB%HuQ\4VN%ZnTLc*CjuC8Fa&<9bwihLTAbm@\>dH=niNXGqp=^4DV\8t\
p$W\pq A?NEmbb9a1JI!lSK%?Th*@pPN=:V*tp^C&+@?:!VNSJNEV?+#^W+*$C9?1\DhR@5i^:B/!/bhn4T6qu:
^b/nWF >h5EdebByi=d8kjAAe#TB:?tKP:a?%FkCC6tMetckq/:\&&QS?cVCwWQP&F1TIZ>>Bn=5/A5$T*DcWmQ
+i5^p8 8/!\6$8?P:yjMa9&ERY@+maJ5ulH$e5n#K4WZ@NyXutVyp@:D4N>Fje\Y#&n95ncFjYm594<DB<G$Ql=
eJBqKp y&\k8d5>W4Id6+I9/y9y<*8NkVj6qjNq:klCq#6Edpu:AylDQ4$tPT9Q<%@9hMT1#Xy\9a4Kkw%c=Z%&
H4Fda/ Z8H>?kGkeyh%G+=Qh?Rmeq%jI\kZ6JF<peW:>LXu::%MjhQpwJJ@\au6EDRpBHb$E?YZLe$L>\pE6awQ
>Dk<TB #R!:/lVnm!wT*^REZV>HS*p>8Xi9mupAHD/4i\DEiud5/H^F9T@+>9k5edijA?/XBlbdRjjPi#\hQN:j
QeX=Ne IIQ<:?qtMV1yK&4DtycimM>?/a<i?<Sj>mS<EEwGEN6ia18BWAC\@&A9V8XhN:Z&4&L?WT+P??*u%@<5
TB61Qh F?L4&#$Hu9A!B&l#NPCdl1ee<+Ij&+iKFFJ&dqe9q94JhSe%!HlC?k11qiwyI=<!1EV+*F:c*=a>I*<A
GqLh6A #Ha<j\BRZQ\YHWb/J@9b>=#J=P5J:G%PhI&H&i*i8PXnVR\tcn#bX%eClDWthRLwlil^:Tk@>lde94<w
9@cYtc :^ctZwGhW!aK%NENNnWI$#cBCZlK?RBkYBn$9YJ>@\Aa4Eu@%*4^8H<l@ACkM#p&\Qjq9Sm+4e\cjZd#
NnDhJd n8\BpPeliJly@%Z@YW4Hqe8#G<tA?=K>uAjAH$@L<Yj=WH?Zd+L$@F$H8?@lj6bqNP!h/1Ph^Fl&kZ6j
Kj9L@q GjwApD4%uiP@FQ!Xy\!q*dZQ#KVcK=c1qdd=a1e#9^cp\5:plEFGEhu@CuQ/hW\XpW@i%@C>TH4:*AAq
qEby*e lCT1y!*l%4=!TeqV96hjbDl\tbiZa@n4Gu&H*=*#a6$BLaX+@H1cZ89qjZZeN6Hb=\184%C6+HN@uJy!
ZAp^Y* =%Z:Mn&hjdIR4Q?J<Z\9p*@Bh\>+juYj#XK@lV%e^+RtRZYJI^JYReAICLVnh*wSQLFh^YA^NXJ5/TZj
14W1DD X4Bm$WWdT6iV54u<LTCI>*Z^WJV#bl<KlJBt%k5!8L&YQ%=jb9T?D@N@/j&F=DW:KT9m45VAD:<GLGkB
h\S!V5 kWhHmNDyYeaMQ5D$&F<e?hu$ch?>Qq1G55=5&M$T!DJic@MaVb>^1BDZTXNN6L\wNQ1etejpdDJ#EI$m
M!bb&T %/6ZFl+Mqht*>II#DPN+qd@n\^bHRqqY!^Xn@RF&4u:4wI1\%uC%uc!1npPXn66I@b\6qSEkPTLlYn$I
4mDGn= @wa^hwViyDWNEc=L1%^N+k!>tRHb?kEA/TV8dw8=uA<DuipJ$J1d^aE1+SS<Hl%6$:M%/nm89e%A>RCA
>\d\WJ m+S>tW!T!eMYaVm5Lat?phn:VEHm!PYL#BT#>+m6a>E1uehVEQi>&:X!5wMwjSq1p4k9m:$4KdNuym@L
<+LBZQ GwalK=ZcZT!X1<wl1yBRyR5^&pCB=SnmWI8*T9^5HBDj!t$d^#<Vi:C@!Cbb=&^YBBK@6$C+ek&Z=b69
*tSVYC q5*e=5KbTY1CQS/bcHk!!hM81It!Kl+4e:KyGF1:A@e&uM@*V^#:P@AQ9RYdKNLG%5w5&a\>$c!jPhE4
@<hy%j 9dn1Z>EHX@aZ?Zy69N\kXW>$Y>S+<?WBaM*HM^JP^YlIST#l1PQ>RjE%+%h14#>=Ld>dFB&d9an8t@&M
PG/P+5 P=P?Sn4>^yQ:dui&a=i*a:5Zu&yRQjJ!!Wtc8FkN+&&T#P#eeKtt<*yiIj#h$&Jj$APke=in^T!%q9dt
4/NL:> lhK>&RQAd?#*k#=6e=9R?<^b\XVjhYij9*<:ctmuW@kYNcD8Q45tY99H6*1T?YDY\auw%?S:YP=@jGQ@
6NlViB 9/@IGK8P5+utB+AtiawSX>$LjpYpIBtiHK#8&#>FJC#<6a:pM$5Ccq\D1La@AB4#C4tq#b5>1YuK%ZG6
8JHR\h %FTC*>#5NnXH+Z%E*\Ll^<>A%pMYiYW&c^dyTYM%eTt5WJMT#H!i@Lnm@eK<44=Yp1Vb:CcKB+W8!99J
41=d4K jbQ:<Zmt<@E4/wNk#&HI=#EWtnia!<Zq<<Lk&D!>/PwnwRjA1intRNjA@BXC6Ec4^K=@t?KI:Yt&Zm@y
Wh?/Hy yq%\eJbX$jW>V>E<$XSekBNC<PJMH6VM&TnVKp9S6+tXVj+BT6d\%4F\qBSJE54NWZeunD9++?ScNP#>
#VuNRy bS59XHSFJPaHADy?%hL+@eLliSBJRPZ?jt/Re5nKmRE6WE9E:tMTDZck6\K1+*#Cq<?htWb%\iy^<%Mt
t/NT>V CddD9FanBl9/F5JRHXEt&$plE!Tb^b&PRkQ:Rbp6<%h#<!aDKeQcqCRWdwpZqBW?9j*+JBKWmXLa^Red
ieQwbW n^XyS?>K!Jq^wqnde4hFtTbR=GnJKPyFE#eGT$<kbLC==5BI#Zkw9pG^5EdL4h!>lN$*mqLdi^1MWdJN
:kB*hm pA>R?$nj\PEb#t@G:<$@tk9*<iq+q4:HtXqES!1bAFpNM%>H@l@>mHjR=e<#!*SpVb=djWtnq:^6b*h$
!6i@mK 5y?dbWYywE6a@G9w++R!m/Z^cGFIu!hH+TJL1pWbIT^L<%Q4=#ZH$cl$\yBJh:JCIq^86QqeXA8FT8@#
J%&kkH bq&:hTwjAuPnQMqNw+\#$>ZR?%Y\EXX#!lCmV$cj8!XF!848DP4kcKAMF>KIaFNwEnZ=l1/\Rdc<&BEw
<DjJ\A 1wVj*nAdyy9wDI8D<S4EXt1yRlQ^q$YI@Ga$N#c>:GW&G$9P1L\acMu>>c\RRGI<w@q/utk=YY1FKeDB
jXptFW hP?W#WCN5eh=^q8>SjhESDe^VNd*$m8It!Rn%1q$eKXbYmWdC%Hp^RKp45HlEjbdiPaiKh6=XZ/DYEtH
wH1*^^ ?\cSAhLPLQkKkR^<%BS\TX:p9DGB8ASc4YAy:$IIi^B#t/BtTGu5ESjwk:kqbyJuayk*E+P/TX^ADQc%
jTI@+H GjT%i=<TcRFu1P%KRb+\P\de%^=Kd$NY/N\5HEF<MHmjZZE/LT:b9JEpRW=&eInK6$YX&8NmMc++*?&/
\Aju^5 bBtcy1Y\6W:<CEXy6B16A=>qV4uYThAT*@%$+M$#PXj5?LkpiqZC5?&I54hdR4^5&E<$5eYZ/&hE+y1q
eSiHIS S1L$<KwNWR/S$b8K>FRn55b\d^>:/l\@c:#inDHnpa\^<5B4ut$X#!Rwe?GtukYM<FE9@yJBBZX@1plC
8m\dnV !k6qMyWGyTLjTC@npmy<\VVYc>wHRKqu<>D6qG?Z+J%1>%BD<YaTV^8d>tlQAI?tRHm=1eRd@jRaMlP1
WA9yT$ BYQ^$LD?>4im8CWk&m+KcR1P?RI4!mi1B$hllT8t>^ah/%u*Jd6d6BjmD\DwB<CXIkLt5&Ab:KCBke+<
9\1Wph bZ%^GZc#a%H/biR#Vej+4:pQAH@jt/L$Q/S@Z@Qj?%&@IJa!lDKSTKE#>y9<K%hpqh%luqVi+itlk/Ah
E/EI*1 &9P/lT?YqD+Vbu*1%:<@&Xm@+t:+Qj#nXC$Vq#a%q/%<jIb8M=KcRiSC#bBSieRV!+b9/*Z1<jCFd4JF
Gh56Al P><\a/?ZeVtn@ll*>ptHuD4yH&A:pC@+&cumA$D6LCp668&XIqJXb=#AuD9Mc%itwu&inm4Bd%eh/%EM

-AHtqw 000f756df59001202b4 Page 284 of binaries2.zip
ZdS>li SZ$DGlHS=:Ka%:u*4a8I58=^>P<Z/%=cdc6H!pPQ\?wS@95c<PSjG+eqNDhEAJ#LL&@Y/XMG%eQ6ItV<
>QmdEY aXXq#n:TZ*\:jVF\mMJJ>qGapMmm4pLcEHaJR1n\Y%na%XdM4PWG$@TkIV\bItY&&<8A<9Znew>^JYk#
d8D@#c nl:ZY!t8TNwa@nAwFHI6%&Y9/$?NeE&M!L!Rw=yPq9yNSh&\4+PSwlYq:lG!Wh8ApFhR5VA66%4dDTJ!
=RG&!u jb*KdeLA$A>q1nwiq/Q+u*%+TTSc!t@jJLRaVlFyne@%mad9L8pbaJSlScIS^4VaYVD1cPVBDJkuR#@^
KJl<J: ==im>Zt#tNXBVF\Q/jeG5uJFGI9!=ih>h$Hj1G6P$%AL/QBuX/?QiNu#8mq:mNkFh??V>b>/h*FE&YH+
M:aABp Fwl8JuGqP^+/YB#GStp$uebjycT?Ik1lQMXGR4u&6DYmnp/8t68T?p48SAuDcc!Feb@<Z5V/t/C<Y&=n
GSj*9Q ZYiCCWPajS*kcd5YyXyH\KZ+KQwI@uMqPCS+15uLA1e^:8iTJMyyNEIIq=e6Z^jm@cwY4y8jR%LT+/Y@
5YBk&F 8aqPJW4^ijMAIQ:DQHiP?jia46GV*$bb*:?Q55!wH&ei#S*=c4cbE#Eu5bI?W!J=9FuW>%81y&h*cT<#
=>w8SJ F:Qj%uP<%E&ReJ\HFi5Y5Y!&IV91$H::?GkubM&\9%tKcK\i#e^+XS5ZKhL:MbD6<GZVYV<^*?Ak>cYc
FMtt:> 6LnKpV1%1ypGw+L55X9jVl!emcWbPyWF+yNcMkDK>k\D98&iMBWFQh4JpDLe<u/jt1CEq4$WGtaV>YJ$
c<jiR6 uRKXHZ&ZyWLCMqETntPmcbC\@PRZLDm?&:^uLhCpekkJEclZtDjt8d:6Y+?&n8Wh8>1VSS&y+tk$S4#N
\cS%l< QMjVL/wK&X>kK<EHniIBiML<+S?qwVPjmq5IdhdDGkp4yFAV$KPdSl1dP8B4WcAJ4/BbJw5>AF+PQFw6
GGika= M#jG^S\FY8mm&QI<Th54aYG*TC8qt4/%dkM?EdYd?^RRSIBljQ>JXVQAqB5Y?JBNHjQ8C?q68PJBT5w5
:ta/PF ntpE^F61nFe9F$9nhL1IJ9nwMKT5^m:WbFC6JJw#9F=t1N^M>WK@<1>R5SV1BJbeC/HMR6tiS^WWqAbd
>kwHDi XmVKJCPJGV11CHNT%5Bm*+!q8peuEG$^XLc1qP1hKdq>hMM4Vb$yV^$N^6:XpqJ+AFlkiH8yl^dJyK%u
cbnIVa =F9pK?*ZkDIn$PEEk@X@F!m5le91>*dm@K>@#Qqwd+e?#%NP<$db<nBQCC6P%9bRytK6B%Ki9+u?aMXm
FK4Q:P i9VXLFQ\ZJC*^R\S^#?4uENbeM*^$i!59$<yqTeIYbF/S>Rc+C!m<:/bAHm*Sn?BuQA!#YSEM>KFqq>k
WpWh@u +66RW#it@bw9k><=u8$jqj&9DXnJc^wp$ye:SFAqXDkL$eFe\l%%ZdZ\!jh\+jE85LaQAQZVq:?LuBb/
!NJRy6 @!*/Z4#w5p>JS<%=\Gb*p^J^mQ@<^pa6yqb19IFP&+8WmDCJJ:KdVIAem@k?w9!@F@h/#4m4!LJ/lP8w
ulp^MK cHNGIWpKhekB1Wn#^FHndIR6lkai#P*RIp6$d9pe!SEW!::w9H6^?@:^#RXq6jdy!Q/c>#j4?yT4+9/?
9n&a%S <REREQ@+GuwiH9&%c<?Z58\BwJ\%FGE?JHlN1QF+J%*j41HHwj9C%/@B@56X$!%S%yWmKT:ylj?>yPb>
4bZ+54 utA<*qme:=<K?6M>BFkE>+C*WXX*E4+$:PtQN6m/4i:h*YM%\hI?9tD8aia/%8dZVy$i:ZJ9Qh>^^K@E
SHH^Ju #&+m:1XS@n\+PCFcdqiwEBdViFbeD%A<We/5%*l<Zd+:h$%bCyYR+Kem<Z+#adI?E5d44aYuHcu%5j:^
@>1QKi =TihhmkbS=<I%Yw#1QaSLh9\$w/Jy?y<wauBNmTL=j:LHC=pkWmm1ZGBKPPN>%Pl>nic^>Q%XJ4EL+w@
yNE?c\ 9F?XEneNV:CIhiRH?CAPlWRuL>tXn6&&Y4iDn=J#DYB/A#jy!jhppyVHM^l:\nG*GyXPEw$u%aHV>h9l
AhbCEA CbeV&HSCV//R9#*F@C1^?L/%NY:m5GA$JD>iyp+19%ku9*#F:>1>\t&=pI>a=%!^jL:9CEGDVQBDqCK&
*m^S#5 <mA>SPnldQbSlL/tTlSpuhdd6^Hiy5j=CFG8C6c*lc@iSNj$cjSqD>jYNZV*b=aPWkd^FGB41#GeZ\NN
YI%XRJ 4TK@tWiQYGJ!MA?RVjZlcay$*9kpipcb^NnL%D<A/D/%W:mP!WuMXIRVaLVHF85E1R+>C:J\l&K>uM>H
LYPF<= #>ABb&ae6+yW$+CiI^ya%Y?mE?VX>KtYMS1bYTIZG*bncjYwBJ+1NV^%B@ihIjJ89&&TLwmihkPpnG?4
9I>\XC RdY#l4Zkk+$6<kQV+LF!KI8*/hhIk>/X8*?ej>RmN>HlKDXIAFPmmacTlX<^!9L%DLdXW&KX8bNMA:*e
qpBH=$ JG4Di5Tn8mjX\QSi=Aq:::hkn^*4LBYbAaiyGltqX*Fiw\!wJ<R61wkc#E+^PKCE6RYl@9dp!8$k+/6h
/$q!%! a<cPyhPuDtKPZ\QCd!KkWp/k%eljPY\6kBBaLm559F#/XFNm<!JN#He%DZ5BWme/6nPpwe5Zq&lTiD^a
%llZB# h1ca!4P#6l%j@eKMK<jT8SmP*>ebq<deFaJl\u4X%F!?hMbdhTNtqhXV9cJkbbN1bm$@\VKeDj/RZL6=
1n9kK+ \1e4eV/IX/^CV\CPpF=WNpEckN>=P%PawVhp:&EKAj5FX%k1M4!IC4H*#J^K#dn+e9:EqB*cScAtN!be
cmhJZc b1dAW4S>YjNqVbGiH&$TQydp@9GwCwiKFpY^iHtm<S1!=8bJWEkcqR&^ViXd@\K6=R<aCK^AByqnpYQ/
8dP!>& WFu5mAXpS<yD!Zma!#9+:14?&ykMCk&hBGIWlnjIZy&DW$^u@KYq>&pT?CEPCIu1K4wt!:kB!5E:d\^h
cJ5BZB uQH#qHF:\\IGHNWy<u4k89e:!=kLNlP\wmP+\*8XWANCmK!\NN++jn/*=I4pYNd=$D@VXMK8^XI/ynIu
Ruth&D mByPyM:i<VdXD4\+G/S6y$&FWMyL%@St*$I\XdlLT=q=i6ZkwA!JG!D?SJyTG41t6G485X9EA4:J\SB8
tV^jiV qmM?AAk!*uieqa!Fhj^L!QMbH?<*S8Y6Ihld/YB/\T@uD+DK6T4MQ9*?b>5QkNjS>>bnj^!qa:9n?<dj
SuF%Vw p\l?4iL?@aDLSu*F:F:^&8MB5N9/^>F9p>:p4+Idn<N$&5WjS?a@K>km4#yQDK+a#I1@RlD\?hdyi8R&
q@$!86 /@V5AVDtYYhe8eX/:69#PQS#:9=^NBdYE6H^PBCmp6+8yQ>^SEy\+TymPVnh=1mi<RP^XGJ<u@l&wu+6
X*CW!A +!T:h*5A9CK>$GAw?wFEjjT\F$&*kEiS/%SR>?!9IS=9cX#1@X?XCHHaXGQbCDKk5$^FaPkZEyKL1kq4
iLPbdI $Mt!:5EY?$FNuKFw4u%KEh^?dIa=wyY1nnW&*<G>S#8Gy:Vn8!yG&*q=@#ZkZqL\Vuq5?N9hBi^6qP>N
:pa5bW Zqnb&Z<wF4:aTyQQB6/S5%W8tl<NLc=BPFQ6FhebT5cn8cQ*k$j^6mKik<?t4hJ:J*^:<kAACP/Y1!9?
jCMJ\T wJLD@qpq=9tp+&8uWQhYjYy@NFn#:$eiBj?5bK5@TqTIe=hB&e6+j5Xqw*C?TTmqwV\$Iw5p:PHZPy*Q
LZdS^a YWW=<<bS:p?9*V<CT<@+wRSV/1HAkXbJCh64H/>9jih:H\C>jLB*?5!C&>/?n&&bc6/>hwaT<ADRqFZ<
GeQ#<M Tpy/P=h?K=46P#e>e!@=t>aaq!VbMD<A$QaF4%\iB?La*/VW:9n@aAu$5F?GL9BW:<pujR<QHtjyqL<%
PM%yWq jt*/5$qmdbR!K!lIiN%A%a+ASpmBCHYP#wZQM@1/N$y!lk::jWGT%ByIk#I^uY^LyhcBD\C6</\:jewH
e<>p^G RQQn*ib5%9=&T9H:1dy6j&1^hJuiGDRNhtwQ<:4H:Bpcp:kAtyuPGhk?:I*Hbw@M*AeVdd9ZQI8kWXN*
Ph\<*J euYQ$+$84CcjF<Suk8Yim9iX5R?AFiFHp:QS@8?u9u<@a^nEcbXpkCqeJ\m:QT$cjb^H>Tjjk=ajALNm
#M*#%4 Y4lHJKwQkLJ<*!>w9neXEct6/a:+\T<q<Ct6uCR:uJCSJj46mhVnDJ?1\L!65$kppGtXW+dVaInLc<Ia
kn19AG VRA@I+y?1VlIin=n@Vnl1Hme?>Y>qB$W@PP$S5&W#/h=84/>I#6C:<\6#+ujj%CD+1^Juay$==THlSu$
n&\4uj XXqWQ=b&ZtXVY@RJnnJBZlEP9=BV$WcPi8Z!=Idp:K*jA+Cb1?M!di%Kq*8&NiCQM&!#b8uh186h$ReA
IFtI8c ?##yFV+K#6&jBKpb56:G&+=Tj%8@l%piwuNcnSJB4BNJV+m8y=:ehZh+i<dQ>NJZ!MYW4/IaCa:cDq*l
S!Gpe@ H1pe:waNhb/@/FENyDw?pn$AH8<m@?ppdaeTApPb<MKCiwpZF5iA?dSDbKX>cMZI^NJ4wLV@TSiY8E=I
<CGPR^ LVicCHaIBha%bAP96&V!S8mh!dD9qW9$@Td1*!4qd&jlj#?4WbQX564h^NX>XbNj5E6TH9k8YRPcqaC%
:wiI8Z G?H$&=PFTu^6wjq=6<@n\ldGWw6SkcXB+G@X<j>ww&h@c/Q$Q:XaYKHP\Lel$65?:ejtXPMSyP#iG^cP
IP\Guh nTyA^DKLFX*nRJH1tn&#qAJVNA9?YcjLXZ>:Q!&mZqatQ>b16i?\:NED\C94k&<H*%&Y>&Lb\@5jWXX^
Z!Fquh 5H*Qb<9P!<9=j%lmKPZ@D!YG!1BY>Ajneqdq<lIEp:@V\e@d1LcKklH&L+Ewa?BRlGGC*?\HMyW/#T+E
^u&GdJ d\nqN<B$mVImw+\cu+PDRCHDV:ynTl<aImHpTwe4nHLZY+bB&:u5NVGV\>*DbdLYnC#PKy5eWT1#y\jD
HX4w46 QVbdnA4lN9VI<q%mjQ$SI=%K*FWRuewCja^nRK\i&ZlYWaXLijIup#tt>PkXZbHWwD:G<my^F1M*%D!1
AMASTt mLQLLEGa4+!dpc*VQ&MlM11%QiF#tJPXX6&I5Y6YqS$#@KJS%4$PmpK<C%CRm\ij+iTPP=<jm4NA9waN
u+HQ!Z mdJGT^VBMPZC1wl@bh=cY#PtlT>tLe5&?AE^ANFD>GI$V?YDu$!1>NI5Xt=>5EP^*unh+V8N6SyMFW?H
utS&b@ *%I@Wbju=8H%n6a>hbXGeBjFAI*cPG^EBpEFj6PhPm<+d#d>LI1EyjI^diPJ*BcK49p<#?kb5lbEPchE
<i!LCL Fjm&VMaAdV+wd6^%XnJi?:*eJ#T#?K9+FCZQE\/SYt9hm:kk6nq/#&q54lK6dVee>VIk%HnW\BmVk1mW
d#Ve\a Ll1F^5jcndE8S$tRGkX:=bp/TZ&\%9V<*8RKuLKckW$F6VCMuAJ1e@GInqlll*<lPSY6J5M\%aK\PCG+
\lTaIF 5pYDbWCSW?Bhe+X5iS*Y!C!@hHIj9ylMR@DScN*<?M$>VC5:E/pp!mqn5iX5EB:jId?tD1ypLw^VGR>P
^K=JuN bVP@K5JZI8IE4GuSK6hZK1ymyh!5??jH@L%kMX15p\>:!955Qe>d5c^BeM4K#B:M9Gh!hRpm#Y/PyMaQ
*Vb<qd 8JN$ClPlZ$yXMbaSA!mhpMj58e%JX6FiaFqHItQTZR4XaS/h5$lFytS1$iV*9IkRqa6piC*?KnPLaqRF
Ni/aAG #4KSFW:taJ:Bm@%R148h14qA*YVVAhnJS?=$GnLbNTMuP>jVun?=LmeV\^^m=NtBby4@J6&H*a=#wTH*
<<hFVN ME<>6bbX&YK+TDN@T^qQXQ4MF4%k5L+e8:8CBiEK1!n\MNNw!<GInI+B59BWetZKETXuGm$=MBhQNN>e
>%4ibc XGbJ5GtYE^M^aN8uSI\9SiWI?d%a%C9b:A:R6ZehBcI8<:A61LVAJela&VMY6W8n^cIjZ@5JXI!MkDVQ
-AGYWj 000d985fca4001202b4 Page 285 of binaries2.zip
JNkQeY >Y/V<mtQdkVdiTI5W/B\&VVu9lw>nJyRw1p@6kN!Cp:==%DMbbq=%b&8E*\#1ltW/YmRjRljGbC1Q6#R
qFKCc* GEkZJe+K??+h68pC<<EhZap$CaJ5TbCKqN>NCi%kw1n*GLM#lT58Nm9*mM=HF8XG4\+5n*Ee1m$qXjHa
1KR#dW qJmiy?cHqSpeT/4JuB@a%E&@98VAwSn:9Pq8F4bmF?+DY+NF5G5aw/+Ip4?pDTCaR4uBEIu!cMXXF:nP
WDaHS5 ZQJZWV%?%+::RubW6qNS5W>MXiSEAZjaW1dPAteaX8IeI/JTjL4L641Jy1jk*T:MMIw?XN\GZ6E\wdcq
u5nFBY 8F=lRm=t5bMH5ES<Y?STJiSRGT/1a5NJtPJX@HkuZSt<iH5KVXw=P4G?AX\EPiM8wHAbnk:qI\SC4=e1
54ak:G #THIW5!KJaAqmP4\1I:Pj&hZTM#B9H*YlX*M?dk\y/V\TI9I#:J/j1^1D!HIlN&BLWTb+j*X@nC<j:$C
j<mHVc ky&AeN\F6*Cy5uI>WAk5>SVBRNtVjYh?VS#!NQlNlLwB5Q9D$8X<>tlbm^JCYHlFmSpWabq:*lANj!&P
/pQMSY !:RiAcZG\qQ6h*%y\+#VLiWw%Ij6%MFuYmI5V1DJlcqbQHY!iJ#Z<Ip4QFm=A=1hb1ESqn&MCFcb58ZG
Nbn?Bb *nI9EW1eDwuanM6hC:c:*+iFT!Na81bb&l+L%GHw:/Qk9wpCww<X^<5Km</bm@j!\AKG^<J:8@&4Jk<Y
ZD#jL& y^iCIZJeDeVuiyW\CXK\\#6l^4?kyGnl9JlWR8B:HpPIl^G6ymKGLpKPB\:&*F:L=TiBWd@G1d*knB*t
##uHNe LcL9uN8N!+%MIJ^^R9BdCZ\GKCaIdbb+&u8etVmaKaP4^Y%p^p6MhuT<jRCnGlL1=Nw4T4KRetY5NcnJ
4\Aeel *Mn$dm%m^nn<I#yGAX/lkZ//H!5#yJL8hm:&KwWinB9VWFLuck4YWmjM9u4WBmiX@lW^njy^mTWJ\R:1
kt/Tb* :E8wREeM:M14#H\%bV5an\P$HFYcZJwQBVbcjkqJw^LYEGJLFqQw&>!aa8Kl:+F<jWn^AZECQklRa&RT
N6AIWM JH1>u*GRECA=?Zi*A@G<S=YuWR+E$^&!a&>BmDEANt4lTAn@$#lC/Wp^=L*<RDT$H$+K&H<^y+jwL@Fa
AL#*WI @l6==i>5e:<lj1PY?#5n*Z?Z&bLnj=VStaPV+#6tT$:R4!a^=YV@Eapq^@eEmS!@tQmak\Q<C>mjpFl!
hu%6<n eQ+Cq8MuYK:@nPZp@ZEPCk:8Z<B!<Q\a!@Pj5d@SI@+R!@5L&B<uEiaA5@$Cq8*HjJBk>9?M=iD=CSd$
NPPF%% C>mj<FCCj$G9PH/T4kQ<C*4%G#9uD:G@wFi@=eu+IjaZ>A4$p#\\+F@RK>CQp==#kH>B4>l=j/Id9/BZ
%=EbcB Q!Wy=j\X^iL/eijubQ<*hp?P@=nw>=<=TZ=n>?V?Q6H9*\i#j:Qu\P!<:Q>@jyL@eZ+T&*@NV@KQ4B@R
aTQR*1 cEwYj5Ej1<%:aI4ZVjHadY#a^nli1jIjkcZynLHkHBG%dl8*/FRIkem!h4!e\6qPYCl?M6=a!MmZKuM\
jcDBlQ Sy%K:Q%nhK6a>ZpYG>lBWC>EwwHwc64W\e4bi*nB5jt&DAN5tHc#\eK6=VlF$<Zuc#K%SHb@T!WCEtR*
Fa8n<^ je$GE%et!m\Nc8%kC+J1:1FV8Im\=J=A>qJ=L\kKX*!CSGt1nNtynKh**:mJJe<?CyFS^kY58e#AR81T
X/hGdd c&PSuSED+mm4EXpVB5XG6Mu*Vh$GEAFbMEP&&d8KHe1EyA>9^8Cm1>ew?\IKwJiHqLj#nPyu=F:T>%>?
5PCe1S pCZ8C!BYbJl^/Z$yPRwSd<jWNC$*ST1BGjneXDH!1VDtyI5/IW:@>KZX>H5MRqui$64LMabFnIaN<XW%
qckm!y 1qV/ea#mHn!Se=5aak$&^uXetJ\Wt/SSCKeeu4cGw@ZQQXZbH\PBpP8tyWEW&dMjthFEtHZtn/=L\pEd
?8R9<c @4e*QYP>k/9e$?HPdGaV!+ba88kySqLtmuQhiK5>@EcpTJVY*^lC^6R@#$WG5EDakuQZqY/DCATRywKk
SYd>b5 \5?ub+WnT5FHwp!Lh+l?<1VcR8M*m&5%:=$td<^T+qRnBL4#q@uG$e&A/EP&#KnSjR%Mp1//<t&KhAP5
!EG:4H 5?w<+I4SN5D\&^b585H#my+ZuMKmqk/CjBIJ!WHa<4Wj#q\DLljG+#IZl#<miDnXc>JhDCV&!P!iyT^e
?p1yIk ZqwK!#XqQ$iQ4BN:Ln1P*N!LNcP<*e4dy*Iqc?W?DaZNKPaVMZ<:5t!A4Se<%?BR>bw<VnT5yG*%TZV\
XBC&S9 Y^RJII5u+*LVDpLnjmBwMaH>R>%Kjip4Qey:tcI#Qtd@G\V<G$PaEk?KWmw:jE\9Jn%/X#il@Fa5ZBWP
*Tc:wJ 9!G%JV=J4ak^?IIZ\/N95>%*^eP?VqGXq:#LcdyGkE\dX:c!QTJR5?yW#w9WPtR8Kh4#16aMe#PIaeJm
9tqlBJ C8JLkclXqu6?<MI@lCk6+G$86@Wd*qLV+5Vah/<W^/9^twGIPCT=VF!SeG\XZElH5>aaVB<u1%4Mu!EK
c5SG15 ?/&cw%+8%auB&CwVTZId#ZJVATW?+@DbT@5%#@4Qtq9u9JNVCZYb:5Q!JnCXnbCuG^h9/p$y#yntF@eV
:$euJ+ Y/QwQCI*=jhlnNPt1<@**q>nL+C4+KMXl4Gcq#@Q+yVn4MkhpKRdp?+IKV/V\N!!m@%AKiweCpIy\A<C
hpbQ5V Kte$mehEBAKF%D=K&#mdT<E@=Jua:TVY<etWQ8$Ym9Ni#&Tnp#4\em^Tp?lCJ?AWe:leH1:YKScY+dA=
P:$M5i YuIS%l^NFK&6i1E/!>5KHSe*%uwMBI^mnVZ/IMXiuIRm\SNT:yet1QYRipqeV^j$ilQVLuEyn%J46<Q&
QVq:/9 !tbS:nKndIVZ\e+Q+tNT&a/?Pc%N@6k>:EicJm^E?jb=yT@1DIbp1ByN&1XZ>F/y1EW+6jHVQq/J?Le%
YK8*>C d\an?Dt9>IFRIm\K!yH15?5GpbGLm9KIq5jWtpY<lRRG!Bc>/?w*ndcH?T$&MlmXekQ4/Du5/^AT>KGE
PjQ=Ny J8VTyEMyb958E$AP6e@!=\L/!1+XAXk9Ta6F*KuahnZjhb4dLd$Jh!>GCM@Dh*8*PS*wJ*@>Re%nTl<m
T\>iyj !C$jBmiX*aT@kQ:t#1<*qD<6*#^##Q?n68^B8\wn1<u^6J#?b&^T+cWF/JPZ9lJSAwEW@ja5&eD?JI6^
MtDk>6 !qt8:9mhq!G%behV/R$*GX$b6X!jphEZ>=Rylya<Y?db&VAMqRwa>XQjuui^ESw1aYyu/It=!*!t$YXG
FR&A+w XT$yiN5+6DC/=!^Z6p=Z+54iN4DhGtZ4tTNlQq&c:qXF&9$mJ:S4TmYjdE%464VM^i1qMIEtYpESG4*+
nMXMTV jm4*@G99CAbCcdCmt@bd4Bl:\!hJwdRupw5Y/Dd#^yRwPb$<MFe>bkc6V&WZJh\*?BuiGLVn!6NFEAX+
6=+DI< <h!wn:DR8eSM/MI>mBuk$dt=9w5GJV1lCJj\=4?iRyq&Z=c^juFiKi/V%QF<Tk+meK1Vt*kwje8QX4+X
!t%G^N P6YyHdyi4E*SDIj!*bBCN^&WZbG?YA*ZX\^>t1AXRmkjth1RG@YC\:RDYmbMeHEbIS5R61nCJI+#nZhC
4:Su=b 65hkk/KT!jW$KVHDu<e&nayJXF\Eh?HAbY5%1Xq>EPG>6qkbZ!!B69eW46I#c*k&#5MA#kN+a6$a8=yQ
YcY4J@ T\c^#1nEyq?M!qd^8P5>bT!/b*\Sb/c>k\@Y?eRL?*P@aKSHtCj/K?8\ScPj9bX\th?b>h\R#d*qhD</
tydLqu E/BL^KqqZku9SSjDTY<H^GL:J+dKnhNWjF6WnH%#K1THL@+yi\hVNMXi>h$X9^F8qheYcEKcq*+lphdK
Q\cpad PM?uL6<DymD>ZXw<XICwDLNMHmiduh*Km%=qJ%#uW4HyZZb^<eHCGjS516^pDQ4&QAj/+Y\5<+i+CPl$
N#dn/h F%ZCItB!&Kc#%pBwG/5LX99FV5bB<iBilnTd5wDKe>/&<Q5<<h/ZTuHuq#BLD#ZD+^=9LyBc^KQiBn$:
^DGKlI NNR@ShJ:B?>JJq8AFb*6SGu#!V!pX\H8eNXpWiIFIu+c:E9pd$^:knVHp/X6@SHXPGM:S%5>VV%8p=e4
E=mlVH tIIj5pw6l+^aWtC^V5/pSh!A9Rn\lC>E+jy\hKHd6m#TyT:k8dEIY>?t$>$@!>j8ALH*Q=WljZE&%$GS
>\5VAj :N%Q%bn#Eq#au*C9G?a!ny/m4l*N%e$tqujSqS^4=SS%4V:p6M:\Acp/mt!$b4/K^S<?X?XkKah!9de=
iimYTB &PtB6qIKH8RRjRME>N=6j:\9iAIayd46XE4cL?!X@:@ai\?\yyI%jnmlq+RPIpXDWZyIV5=JwadiIjR1
#A=ESK JpCA$K6kD^$XESEXZR6N^a/I9aGkaphE:AwYdKnaZZZh:=!IKEue#d*i:@uK<>>:>&HQL@QP:=&bh@1<
1ywdNM M!w4ZZ9j^PjjPB<Yh&dI1PmL%@c+C^mW*bp9hB@!M/tGb^Le??Zq%^SWDt*eYL/\&Dt%!86=#cC5BQt?
8W:=16 +?+St#ud&^+<<<\#uLVc=<!&lZ&i^q5<N>St8l!<&%Zd?cBl1XFRm/Vyp!hY<YW:Vny=!nWjuaWKiH9@
E1/+k% 6Y6/V&V#LE1eGQt=P<NVV%\m/GMQKHP8#/Lm+J!a>*?tuQ#$EtX*eX&>+%NH#pbQm<eb*P=Ny>b%m5%^
IlEKAe 1hK/95C%MJ$8>:R115#Ky$1ul9tm4KqB&8TiyJ^cJGN15WR1Nl=P=yyB1dj9pt/LJ@4T^N/id*HePVY1
PMGh%K j&9^I#PJJ%:=X=NXdmX4KBT*im\/&a1@W+6JijMM*:QXQH4Sibut11Y9Ek>J4>j$pJ9%dQ@K81SLlwPT
Wk=/V9 L?J9uHB6m:GX\Z?>+DT<@<tY4W9db!iX4n<9I/tMpiLM/^1+W=EP#l11nyT!m#?#=p:S&*XJX&V>i<tQ
D4@Dp$ >&e+^*kqci%&*PJT%kaScldE8W48%A>/6q*QV%tXiGH@wqdtlZ9*N5=a%/4WbSb*1QH%6SM!^#c98!D*
y8%*Ym *1:>?KpTNc@8@TQXXm/d4$#$!X>#jtTBWt%PehcHnVN8MbMqHk==!M4NDQD%cIpB/%+Z+q6>qSyA=%5u
RbYtQ6 NqVueM<c!bq8qpL6ZnI9Q4ue4*e&#uP?/XBym<w/Z&q1Vuuq!p9h$>NVZJbmZ4C4V:aQaE^eJB=uaH4L
<GhBHM ZXZw@Stq:Sa&\%+E@@nT*XXX6ZWy%R5pV4qQ>jGSeW8V^#F1:n=SPdV=>bLZY>a^nlb8Nb*Gpa6+%VLF
4yhR^h Ji&Rti8eVSeXHlAXy<aaXNca^:u:J$9hK++jcV**/JX#cT4i*5Y*&Gjdy=IMw%InthVDJWN9y<XqdYt8
LRWFi@ <84!>Fk&m*q&CHSP$DYML:W5>XH8u&qk=!G#^c%H&+Tp<E:JRF^=uhjL8Li>8$#nHpNDXY?d:qA+C/Zm
RTt8$m +nGBJ!Y^iNM6t6/!ZR1wM%+LKy+8mSW*9pR8uEd8:9@WHdZc<YtpqI+45!tRPS\8TS/w^P&1:L$nh$Zc
E$c4wd b*Z++9t!b@e?TuG8WNNc@!S?YHK%B?y^^hpH$:5cd4P4\W*i5TP%aHMP<&^h+bq%uij@%qn<V8u$d4Yp
jM586+ $5BWjJnl<QdLI#GphQ8q$c5D</nPXj5ZcXAM$8kY>%!NZ$NQy&:b>cWk+GBZ$qZ*SayV55wX%Gw>htwD
ALqS%< &e&t#TuH@Yi+bt*^*Cq*>JV:m98iC1muyc>qBnGMy>p9=8%?@YuI?E#SC:NuMSSt>jL1+>#ZbTa1C+%P
ZP#A@@ G*:a4hY!1J#:>GVEAw*d%cFiBw+XHtFJ1YZGbeX8Zci<V>8+ZylEB5?pL$l=YuQFy^V4Z&J/#HYZ##6d
&a*>#Z 1*ii/>wV%%V9>hl^cZLbZGQ85\DueEd4@uh9XI18JDDW#aLB#*Jh:e+y#ANPceFG$>%mnn/W#F<6E+%J
-Apb^S 0005b8312aa001202b4 Page 286 of binaries2.zip
e4Y>IQ P41??\9=%Z6J!RMTL%QN@bici*V1G/$=jQ?%M@QPG1Lt#P*t\c@PlRYE%GE>A@a$Z>?$^<Dp/jw#p@1&
e/Rt%E !wSZ*Z4RNqVm/X1yEGJ*<e%Wl4LQ/ilum!I89>lq&nknWDaHiy$m8iY\l<Lk6E*uKAp44qe55tWtjhk&
Z$8&:D $&=K>FBA:+uKYpqJ\*9y$a?hD:>/mGu8K*jqZDG:6!Znthk&:I!Y<4Q5!uQiTR5QuM+9VNt61T+&$%jJ
VI+ejL *+5caSJQajbn/q+@8*CL5i^$8JVck!54R4M@6q^5Zj/ky/X5ScLH68%BIjd8J<qQ>p>ZB4c^ySTC9E#Q
8J9l!+ 8SlqiM>PV%8R6LC\>QnnnjbTT\EFF<tRB%Gq9XM+Mkt1byh$*<ZX^K&$KbtRc4lqb>>NcKy5SuLhT1<=
Y>up&6 nZFyCnQPhTZh%FdLI*h%89Y+^l8<T6%=PdWNhbnkthuD8P4lIqq<?M?u51pdD8TeY*n=T1YQkbhjy8P4
t4A%Ew wc1u*N6G&P4HLp@jLcJb>AhA>E\*ihpJ<Z9QkbLSCm%X8%/5iDM**4T!1Ciki?e/1e4N#p%>T\*Tb&J#
/<FyZP w4tJqL\AmH6=Vma&8I:B&dkjm*>\dju^RbPJWteYlaMQR1Hc</?tVS?K&cZBJD?w?D8Eudwnc>4b<yBu
bM1*Ey y^qZ!??68LF\e@@KI5d!ShI8@Veu9n$c5K55X8=A\dLl&S>I955!?4Qe5w<H??H<*R$dGBIE=!h^!iWj
>*H>pw QXS8Tk=pQHqdShGwXy!/1RVe:cMiuNQytjL/>JVqKE#49CNmH\8*K$:bYe/=Y8HYh:^qY@9KLNPZ8ikF
dCqlcE Kn8NZ5<*jijmBSq:TH8*>K*HXe@D:I>imp9Q#jFPaP@9dk1ijC:X8dGS>pC!jPep=&TY&+Ru/m8jJ!&#
@6R?wi ViwyZ?S^Mhu+eCSW:FE$C+4N<1kkF5kcq=ZeTFm=M*9CM*9*WFL*9bIQh1==LXW>AJl<#uqn=y\FLqCt
ZMHVyQ $%#*9MJ8y:pZF5?V?FJ6ql#Lnuw@M&CX6&NPmiiKqqT66@W4HtV54</mT<Xu6cedqKE8>%b/LKBD*P8%
%&*bYM j+a^QN\b!?J!:%eIj#j/&$L5@!9iTIKE9ANME?&NcBIEmTBLF9++DpV?h%tI?k6bmkm!pQB%Nwk1km#y
y$$E8V F:I$EYTJ\tZJlH?ZBZ?^=p\tmmALCq@jI\Mm!AK@pCYJIE9+lc\IhpZ/^Xw*YRT:IyF@IT8CZTEdD$Jq
WH#qA4 SdA4=Hp#wdIm&NW9%%HJwlnYL%/bwlB?R=d+G:IC:$9V@uZ>>98LVMn/LW*I?>IW$u@?PlQ+@ZWt8IH<
J/1$VP @nkVpa\V>nRV>8i*tWkW<F6KS>iJAiDjn@&keA!1wRaGnWb^M\k+NVtyA9R>ikdhWEX8kXkH6!jDBmNh
5$eNAE ICGtb>#m4c<tX%I+!P%Pp6JYpI:yGQnIhhTZK?>!hNi5<VbcJCiyZ^@YEwGjWCFqwF^%LlHTqyP/Z>B>
cR8Znn PMh/p6!y^5GSL%\HQcZ8+kDmyP%l/6Xt^hZ?=4W?S11uH/JuPneFdw<+W^K\=<!DWHMNl:4iT!u::R^Z
bhpMne bnw*9J4VQw%RY^H9bFK4YH=5+utybj:d%1YR@%l<j$A1=pEGhW%qk6jT98G<A5Wq$t5*Zp&bbh8yYHb:
58%@Mq /MPe8jdPA:iwllLCPm4K>&weCiiiS%weP=<h>@P#XpTAA8jpcFFP?!EG@ieFCj&jk9!@5!DJRy=8J<Kh
C4R1=8 ^9?@n4yq@u@t1J8+i:Pb*5K/Q8TA&:I!k6^Y!TdQyQ^hBX/tF$+/^>a?pi?88tX%*Ytp!W*qBKGQwi&<
nEM6&? /I@*cuKh^k@&TKMhL/8%G5^byuA\W#QqyPNtNSP=muM^d+lPAVj/6au/TZj&X<S/u#!&G$&@R%8MiYd*
Ij#559 S@uy\IHFp8iVH%j/P=Tu9hlZ9>y*IqqJbeeueCR8iQJ^@ZNhi+q9%wDEE4$cpHC8+A>XY+@11EWBP?S#
aHiG1P jR?h4t1Qt:n#C6ijjwKwdd1uNG9a<?AJnHh>=QG6u6ew=?5Q*4D8&&QFQHBN#@qtqKS+%S%!/>uCB*8c
AZ4B<V C8lqiEp^ZMDBpu1jNTcTlJ:%AV6J4j%cP^4uQJlw5TJ%h?LF@weh?CXtZSCX&PF>cQd&I6%><^VR*y8D
p&IZji QKla:9/Ib?ji1i&EN5^%eDpDBk\ab?TZD=Xmk@S\b*6:Z!WwZDW\<=#PaVItPFd%NB>&*HP@VT*$lh#=
/Q^nM# IptM/VPDcQuFHG#mu\PB!uhGWQ/qV%bP5V9eyi!#%8LT&eXju8#WH&Ce6NuK*c?&I%*qu6Z&e+i@hEyP
*b>9ac iLjtkFPp4$YByDw8e6@64bh9H*EK1+y:?TTeP:IH*:l^%:/?%h%QLDejtqi5B8T6Zda*LZ^k<KVWmlum
IM5<iZ Ch:iW9Ic>YJ%\hYBM/*PYDGM**$IVM&+QBujyZ$:@<u%t=/Dc&NuTB\KeW/^DDdAP!^jm@Hd**9@JtDY
MILM?l =Xcah</Zp^F?ZHF=<nT9bDQV/MGGb>!Z5ZPhI5?5HTw<VLTVZl\b1i6&ipNi\L6XV@@W+EdKXRB*\=?X
5Dywy? wPQQup?4NV1K/Y&eEZtt1c8WMq!/9mQLtZXy*jdR@i$*#?/eu5cX6J41H1b&*%kB!?#RQBu&6qM&#hX9
b=p#1& %:ENX+/?DM88eq!RR=XthE*4#=wXj9:cp=Yw@wtS4$NbY>bNJKq8@E9L%A8@\!X!Jcy4n+/ei6KP%pqd
98GJyj ck=?8G8Tu=eiwth+yd&$5NA+#M<YKC!=qlwSwIW=6=qJWiqd49Qpe5YqA9wGJ#NJZK8EwX5TbpYR==%L
pbTLRR DnM4H*P5nZ1Pc^:juI?ZdD1<KtVHJchcN?LDK!EV^Kj&^=FI4K%Yd65i*GlScWlh!P#cd?P86Ei9wuAP
?TNw*Z l$De/nmwQ^lWNY8Zp6dK1yeGZ5t:=?I**N1c8/a#a9hYu+iDW#hhHa=&pw@M69VHd>S@@V:8ipditTNS
=XAl8a c<t^Jqi6e^Q4i<M$*VaPVaw/VNnXeitWwXbSL=165Hu8pj48Fep1Y=lL#DSQ\5P*DYendKZKSp\B&8Ee
Ae!#Z+ ZaK^*NKtc^QXy8:$+8VZTlGdKM6V4XRKMyaad&@heN%TT<Z#k!?*j1a?hQVPFWPm>+IAbc?DcJ1!66X<
%VIM$: p*D@I^H+Nh+^$+CY!4Lcl/qGpY<:N?#InTk>p%l?h>q<w5u416*ZI%bY??nP4d/%^@!SJnd1upiReek/
yMl@M9 \\*#y/m$1yi@K6!$MmqNduKNRZ\X+=J!#A\H*%bRR8cYXuP%8+\5<e/W8Q!/Q&LmNy\=9et@Y?$4Vm\m
?LHnwh 9%\=&tcV!6:qnYqyQ6h%Dh=X:>a^:X9w<=G&9h*a4LB^lW9N*MJ6/VK9R#LmFV^wY<#/Va?FnKnNK9ea
9>Cy9Q qnt%j?&!K$wNC<>W&C?p8aiS&4\YNwmd:V4Z:LemuSm\P#5lZl%@NGbp8jy8*<4Hc&Mde:jX%q4%+dii
Y*TW@= <VW1<j\aP8Y\^V+>T&NNa%<%ww*SKjWw<c!R>HQPd+!YZbeTF<8%<?/^\P?$$RuuM6T<a+KCy5weY$8i
wwpy@Z NKl>cbb9/4%*+MiL<^6SKXnVc6Zy^S?*QKqj5Q:D>hw>j\#%PPWMPSMe8?!k>mm>5<t=D9$LJ1\a9nDm
TcKZ>d qb1we8>Qb6/%>%1Tpa!MpLVNDZcuP^!PTiw^IGQH894#ilj5nSmNjtH+5AVMy?d6&&t%SuNKN^uG4?1P
?!WkX= Z6qA\@eH*N/QX=WZY:Fu$9/XkLhp9WjiaGS6!jR4X^q:c>cH6GhlP#cdu6yZVd9>=QXYyc%H1?KDQT#?
FXdil: iBw+!hP$#1\kiQeC%&&^99q#R<qTG%^PcRKub$/delX9G8S/iG&VcaZmVd6HheQ5kBitLq**6Y<*HFm%
uNAH1p &/H65QTKG$Nh&1qb<yS+@\*cjp<ccXPV:tB4nm\MYQ+l\F@u?G#&ie1blXQR$c694y#+JQ*e=pcF\Nk4
?>J>yh YL%h/>bFeJiy@=ulqVFuV*j\^#Z%p%ku<tIB=Sl1aMwB6%PZb:1=lV!DhmS#nn+P$WywZS$VQdlk>9qL
AF#@GS \**J/*14Z#\uQu@ytdC/h4PD$:##F68QHZF<?phe@D#M4Bnbi&&B?#w&D5aPSit$GuqRqSb?am=JKN=!
Pa=Y&l >i4JP89Wa55Fj5Q5wb9*4NeWl6<P&:wyW%cnPj9CM6$X6Xhjub4WXDb9n1yJk%dGMX*j8dG1H9*YXp9y
Fi\/Si IbH5yie>E1%PSN*biD1qIML>!aWV=T&Q5u5p$eVNb5$4=kY?9Zpm<+SQ@HClLwm%#y*T/hku46yJidE!
WpCkek Wj8DD?hLnwJC$/9DyM8B$cuuMC>QDB<=Y:9ubkW=19h=wPMl+P<h/@IKqP=M>m#a*u1yW#QG!eZP!Z6c
X\@/W< =FGd1p?9kL9+k^e9Ji\L&p4wq@Q5Jb&i6ed<:6t6$V+VB*j6DbX@?Hw1y14t=c%bWa&H>p?c?5d<!9yN
XYeuhG >4c:@^yTj*9\@QS:^WQStj1j>&pGpb+9?nk6=N/Y6V&MF+%y4@Ii4b^V?Kqi=tqVdS%n1/*WmT516VZ?
dlHmy+ u:XNF4mu?S^/6Hjp&TV>cjkQ6@5u@PuawQm$pTQF=nR>nt<JdV?Le4!HQAm?1ZAD^4T1bM&LP4Zaq+hj
5%ip9S Y4lC#$+YDph*+^L4Kq8QNA#$DQY%i>8FZ#S?^uB99GDnLXj5=\\&^55>T6w168Vk1jV&q^upheQeL#5#
99j\KK Fni:4$Y61ZQN6*#RHCG@Pu9uG4?YAJMteJb#\L:tytcbDqtQykQN5+1H*!<??d4=1X!NeZ\NR+XaYmcZ
+1c5iG *6i?5Y>BE1PHi&d/!R?ahQNw6t>1%WS$N$&8iLNaqaY$\q8VuX%58VNiSX<Yuj$KNIH5HcXqhYe&GTnW
>I$EP5 Gd9JTM$mNnNuttSq+1<Sty1>S9djcQn+1iWE65XBAZ64wHq%miGN^uPMA!&*FSJ5m6$*dnd8WJX#6al=
ZQS=RH w6^%TEZ1>aKiHe8&%<#cb8jEYH*SdRQG5HFCk9uSHjL1F:NYZb4Z/Z^\+c:qcn5tEd99uMlI?@^mcl^l
Vj61RJ S1A9ka&Xi9=kY&<#I&@w>W!FnZMi$#p^N^/W4j/eElLdA@S6e4>%<b#qFLH\m**lZb:%*1XlR?eY9i^h
ES9Eja Yjlmk$e?^pRG9?8%yFJy4y9X*bHEqYWE!<Il#wlY9wHKVRqI$Z?u8GKuh8LRFI@ZWti9Ye5e45aN4=DX
FKjmdk *&T^ywiVJJYY<:^5T<*Jt1@QblX5YPPS?mBwT&&%TW66<SiYlJ5p*5cDi?hJ\&99T1pX1KF\b>Mk<:eZ
SaZwXY !l8P^h\L&4Z8k$^=jpC<yLVWI<:WVw?e&^j$I+GbS9//bp?atQli^+*+&c*h1%LZc<T5ju%yiBbHj>l=
59lI?S tpFTj=!CtWGZ6umVkeSL@cJ&j>uNbbIyC!R*bQt%MN<>i?B<yp!*K&y4uS1F4pc+9#jaSTY8Re1p<@&l
M<DFwu y&>*d>Ze%XpLLn#1EGn1$Mp%ScYEw1K+a4KGnuW8yti+1uTn5\:AMuMwP^!/VKb%@ppPnNkX8^#MN4:X
8Xtbq* FE8PCTI<QSNRFLLukbcWYBAtVpy!wB4d?FGGi<iY6AiIWTKau9F*4DY<=+ydiAb!*R/S/L8&VkcLQME*
4\P\lq l&qui1c4S6DNyyMNk/tpbP95DH8=<*aG<+ID8%5DC<lFF/p^!6T6S/l9Z6uiC:IJeN+XYCil&nV%#Sc4
Bht?e8 bd85p?uCZ+1uWER?cj964<h94w1PQ*\L+4+6PAS<t*%?t:TK5u:/<?\V?hpypDI&C?XjZ/Z<6C+$N6X!
86nI4a CHV!<KBCw>P65bN1NP1+1Xe&NhVeLhdCl1MZ/t<Tt=TyH^dtuiIXbi?iFbITu^qqp^Xly/hubP@lGknb
Y+KIAR /VNaW=^BG^eAhIjMw8nY/eatDnT5ZAwBemZ:ijq/&1cb^p@*DLe\McDa5c\C:X^Ney%m\emyN5byD6bM
-AFQhR 000e0cfe480001202b4 Page 287 of binaries2.zip
&dG:BA >+k$X^M9M=8wWEiVND#hP#I!&#nE*#HJIlk4b=p^QbEVV\<M<<9MTdQJbHk:J4uFt\J8tY:SiCQ/hNAm
$e!Qk9 k^tTa8EY+S>6M#*XN<:hZN<1*qmQqYtu:$>!5DaITeVKiX4=E1\hGZbJW\&bFLKXl%/Cnci>:XRjh^<9
CYVQE? $>DkME5PLbnA#uLN#tD+eXmJIj=/?CSPHCM*npqltp<uJBmuaiW!RnpJ69F/VINAk1edaPQn+$XLD</k
CJtN/L EJPV@M*MA#LVA<Q\LGw5eZyp6I>NwHh!itK$W=AbRE\*Nw1IVnF#b#K^em\@l^B4i%9DiB9dcYtSW/^n
&DG<cc +/bM!R#*Nw4QTtGT5pMCTNHbmhdt$WD1hDCA=tmRGW8NbWbHei#$/dpi1e:8HCyYLpHjXe<n!mbH*!ZE
B<yG=P nybFbDAJABTSHi%yRKF^QN&bpCjhP#Vi*!R4Pp59P^4YnGnqtac*BEBKF6Hc^!jPuAWu^Nwi:^IW+G^w
w6EIjW dGMTaYh8b^6GVuju?Ft+#:MVYpXw@<%Bd=AA<B@$BkqEER=/<>=\#$dPehIw*$>:j#9>Qdye^:eITBW<
QPk\tR AE1lmZn/t$4<h%tIRBM8C@!:LEmFlM8TSJAq@$IYFEGY>I9$R9<8T/L?I4%pEYS@5XBLyakkT@1FLFWE
aT+6l1 YiI9bGu@Lk9RlM9TSLA4kQILYSH5C9lFZ6FE5C9kF*qFE<G8j4pDRAN@S%kE!+KI\9hLcPVjpB%9Yi#5
AbVHN+ uH<XH&*CiP$M@DY&F8#NTW9tNYG^9Dlk8!NDbF=XIyPy*%1l>K\+8P?M^BF+@?NZley*ty#!::5S*$?R
HimZeP Y@4mICyBeDiCS99QF:HJ*^i^ET5bY<WGcWkCBNi^j^=IkAVC8GX5Ck&m@j5/NwyANhVATle:5ln:+<m/
MM$Huj m8ZPMj:WylALCVT1HWe*%4KSFue*BKljXnnwL*X@1Q\pdpek96y4CQAIYlhJ1mtke:uPL@J5%@p>D6KT
WN<Kk\ %Cl#dTmID=RFd@n+Xb@btC94+:1Y84VRAXW*debBnJl+<yWiPuY!6w^Ec5kl>6:d/j8n$pK6N@V*1eli
:%cmp< Ml/k%\YbV<BIPhEH4tXa&!lKh>VSM:mP?p%?#!pyG$M6cyRLJXmM:nl*DbWCmi96LZEW>8+CmV@u^8?d
Qn+D$P XmM4ul:p<dmP4KY&5CTtI*F@NEEC+?4a\%AmG$>eDJDP4V8&>8K?IYitZ9P%NDMh6Hnu$y=lDS9^<P&/
*=a/HC mpa4YVQ4wp?IDV:PtYPQR=Wd/t9m!q$tLh%@1#Ja$jANHb9hbLBA#J$^^Sw*5tK1dEQG8yE>?KS4<wYE
hE=%<D ly6!Vpy4#LDHi</b:*N/X8!Ehe=++KQ1lF$W*!ky^yYSZclj6hFW<k!1*HSl?<APa@9KMKY&#y=d@u4P
9Ei+8> T%Wi1Y\Q\JRyhX/wcnHk^uVuTlR&>K!^KG5yP1Zp9ml18YF*Ntd@AR>qt$Ya$=tB9VhRlRQ=c^e%nBSd
T5>mKu qu8m14EX+nJhW?TQl=&c:K/KKXI=4/y%H#khyHMS9hAJy!ll:VlRLXuS$Natl6cdB9qe4uq8/>iunuZ^
!FV$hI :%68AbJ5bh>iD#/j=DI6GK%&*mi<j@u&iFKB8PacEG9k#6DqFkZQM5IclF%:bbp:N#V8ikl:YaLLnJLI
AKTSW$ ^Am@h?EJN>+9*5&=Th/?l^*Jyb<l*!yKQP5h6e?\VXJ<R8469D5VFn?eiYjq>8i#:$++@&:8*bZQ@=w@
&h@Rtt kG4ZjIX8RN$8G6V$XT<b4E*VLd8uYVqq\d*cHScL:t6iACm:FqG%LBZE8ji4H5!e/4Q5\RENy?Z5XjGB
/YnN%B %R@@6J8&jGnm^6RXR\he$&5jVX\^e@&nYR1=>a<P+k5cEtn4=t=+*Mq>YMtqjq&/MYF%!Qctb%wd$:e?
c$V#\S m%n*^+=u1:>&duqt4ZG&ejlG@@4CPP%JJY$96F*Q:p8?8YLX\ZS68*%H$k:Ni*R$juc$:h+S:c<h^$e?
%!WtIt j%Dh@*JP>QQ>/Vb=/pejSYp$H5?K8tnRucpVj?V<1!@#HW/@nZ4lhnayuBp&qV5*jh4X>:yL&Njj4>&b
G1el>& SH6:&<nw$85@FMpa#FjFp5GQ/!\Z*@<a5%K<GX%*^>hK\cD=?bNbSj5&Qj6$>NTi=:PmH?%<Pj9w#6%Q
FQ6J\1 T>D#wX6j@9bh%F%t5H@=l/?Vq##<<?9/uje$C%j6>H@EZqjYyX9WQqQS+jqL&:wlueu!X/Xb4+dF/#=N
^GRhpd /H#VQ*>p!6>H/1SW%\jYb?/aiejlyK6G$Wi8p4/Ek!QXS%dQ^1C+bcQ/<jJ\&T=N\@q?^HQT$q@ie/<q
Nty$%p #GI!HGZ<MbLF%C^qMeMyS@VWJn1H=TkZktdT>V4!*Paq<wME\\YwT8ZCY!4euiWP+pTDCeid1^X/wnGH
/HCDMD t5?<nCJ^bB6<@yClt/8$t+YKe:hSC^qkh/FtVY4:<KSP<4W*h!1wauW%Dtlt?^THFkhMHh%Lk46d8el+
ektGYq JccBcd?kTp1Zi\%Tyeebw=uV%i?hHXnpF#S=\T/1pjPd*w11ti<e4q+!M+kp!\+M?BW!Y>ThGBq1a5Z?
*?wuYn $ltHnW@kMmYP%<mYKZ84F^bmPA$L:XwV@LG5R%jpqB=LT/E%y#k%Y/nh1\6cYB>1KLF@6jS^pC+&eH+1
!E?=%m jZ</Kt5Y\=P!V/J#aJ91^inkn8ci&\@u@Fq^dp6aK*PhtjQnjMpPyq\lIX/@mG/w*m:GLGRF/HVXcWnw
^q5jj\ H+aY#Qln55Gdwm4FL\FT*Le/pq!YjB%wK<+aNlE:i%XDDGWk4!SlZ6RV1VnaBewP:NipQ>dHDB4/?#+/
DIk<*H ?YHnq:hFK1$Nup<m:lp>M=Xm^aWZKmiKTVcLmV6wFQee%JI=$cInY%ee!iZKmbY$H=C9u:d/*Buk+iNd
C94njT pdML6>Fpdq#^k>ZhhHH8$+9lH?\&HZFP1b#c%Ey+dF^eb!>VAE/VHcmWqKBn=I+@qmqVIwmJQbcY4M9S
KBEQ*d Ki/ypPn51XE4HF^>ceFc:EV1ZLunL*wnIu$+#%$&:\ub$S@SMbQ^cI@4V9JJeB>#6cZLTPp?@W?*d!:F
Vjn9GQ yt*@/@C?pBeDWhcLM9GwhSk>*>$HX#Cq$C/ZDwd/Qy$Y8V**^au4l^!@pk+ea1ic:e?Rb$WbSEiiu@uT
hkPc^5 =etS$B%9F1L<5%udB@dtqd!:88ll*59GQ?RLuu/hj9P9?TNT/QdRn*cH>@?h59QE#A:K4M@V%&kZ4n%*
I&ESl? <YninMQMjhaqc/I%5!5>@l1$injZ:M:p+=1BtIE9E<5t^Z+=99<Q?Z9u9BaR:8l*9TDJA8%!p=c@wJ$K
4bQb58 i#py>6deJc?qHL4DFjZnwla9ji*1eV45$<u4Z^SP$?tVJj:$M&XHdX@??tV+&jB$QQ9YpbX9yFnu\yeA
F4pWwm <XE:FI?jH+pd\E$Ta:SKwtyVb:Hedc<cdXS^SS*V%M5JK&M1wI*!b/B&Mn*Rq+4q:qR6$GVTqi*ED:=D
RkF+%G 8W51Mhhaa?lbG1/+GbL%eiHmT49ZFNiGT^6w!Et#Kmc81&1@DHXbw*G6l5@Y1KpXhp5<bXRSP=5Q1p?<
+Xpj@k yqy8G/d4^KSNSQjFqXSFS4:Fbq!*6ukmk:t<4Qt!?jqC:<p!1H/q+@6#Fa>@hF8Ec6Lq886L$A*DTpc5
j&XK%F nEwbtIt5ht9^Ej&JcKW<lRbWtHkhk!T8Kc8BInA4iu!uFDXjtDl\T%F1MA5W@>l!^?EcDc8Ww5aq&KMM
>Gd\&i *G&K1wdSW5^+Gj16KP=kFZlmyE?lM!meY/BBFN@jwumjHmc=XEY8%LlFXW@Hw/mACVl4/p6bip6kYiWG
QiQpFm Vwp6$wQZ:PVSThmTEVQFuAj?pm$jLW/WYW6p+K#F194RlV*ND?9:6MX\=@Sh8GR$*h%1+TBP6:BKZ>dQ
dp8Wl9 uT^PuATKN?h4$ePep@>c6Y%&==*4%:h!^N8jVyY5Tlbu^8HLY&bAHZZhC8*qKQtYhqJl*VYyt=6!!=mq
5ByDeW p!Rq%51KM!hl8Fa1J?q#WDG*a6IH>ZYhE=hT>iiceaqM!WL/DFtDPA$$C/ic9%:>*4%4tCKHNwMVGSP$
^/Fnej tZW1YeScZiiQHLGG@Ylbl@&tZi/*6jZ:$1ZdI!mu^I:ImCubT@5jN/KQ=Ew/c1a6*NXFwNP>MAabp^eS
yW+!Pi V&1/Qu/k$?BN^DJAmWqX=lKwY5JmuJmEZw+M9W=K:=#TaJW$:9Xu*G5yuDt&@a=T*dBpkd+<!qYlLt&C
XtPa<I PPdF?b1?F9KP54cZ1ZZdFV/>jCttYH>W%k<#wYQ%B6^V&aE8uaE8nb&G4^hji#%Iu$D\XZJwpGeiFG5j
w+pu=n %pXZ/qy/T4#$XikI\>aba*6TqJq9hiuDa4m:$9WbH^TM::ZLTEq9%GZbVEBJ/G#cwXXj1+=cKN6l48nk
hVB1Pq 4IY?IINY$iX8W//QRKQ/JHGQydt>W6#cCV+18uWaLY/cwpPX&1cN5m\qube*hPqQ6i69/hR>qT#IX>Sn
CZMw5? KD:cKPq\S>NlRJ9:FnXRnMENK?mq1Cky@h&?YkXqLq>*S+!kL+HPWpPHmw$AL$cwL<&H=+@R&h=Jb^T?
=D<uDD 1A^1KcI!FHHHJ?uy1HEB<W$d$ZZFW8&PCuX$DM5SXZ>+a99\BHT:DDeD&*+e$&/uYG<nk$1SRP&hYD>L
hM*N<F !kGnhcyJEXYyYJe@AbWw#jTR*XE8+></Chi4+BA%kiY8$I/ST>kwl8LK%iu4d61B4RhW/4NWP^+w$p>m
=YjKwW 8PX!Bh\J*BmWu4Em4q5G%T/GY!QFiwC6i/4IjC8QLqjt=m5/^GGW<a46%EqMDb&Bc\4%DbP+Y<R:K4W/
qAEIKY dNAP4dPaEXID\&ltke1kDQ1M4\VKW/%kB64BeSIhw<P<IPM?Eeh%q&dh\DC*!Cm?Wn<#XBP\YeNu9eam
yXM4hI B+uWyiK:yy8&:lQ9ke^Xttb#H>#4Qca?<FRYuYhAlM!Y55^j*:ZwQV^4X*#P/>$cq&L^K8<5kW+Lqj9t
$DnaY< Yb<6Z#?$ZIa&i#*$+9XVV8?LPQQ4lGZTlN*mlDiVAbKJbdaF$NwJBHShd>&JQ!q#IqD#=YZ<m#iR=YW9
W=bQ^L RmAFI9qB&dwR!aip1p#c4W+c9kwG55S*l+QbSwD1NEl%PmX\NqX=PyGaDJImKY@!cKRm/l6@Cmthqq%A
\a<nRJ P:YV8p^DRXYdG4CJ6t\DLZCyqiy//>$H4EpFXlZ41bh*&d#ba$616A$<S4u<l?&!ViVASXcZW!uLM8%W
nA#/i* P/&#k?%Xn>lh@t!nGtm#8NFT>bJ>H=4?=nb>>$*:kEQ&NbITRdIPPXMek4A&RWcPd@/!D=y$+QJ=J#Xq
@LY!99 l^yX1M*BPj6Qy<CHX46*P9W=PT=:+^Jpd%?ndbQnb:Q:mc8clYPdl&%P8Q*dtc/p>W/J!T=kyp6j1E6R
!+^V^Y 695!!Qu5H/Bc5q9PE9ieZA?%XA>R%#Zi%1Pt^KY6*nPw$T9uCC%w8RSI<&ld:Jq#*166n>e!p8iPQ^*B
e85%Gm a?=6h%*i*9hX8?!&=bG:c4L*&&h?Pe@hel=/6:F>&1^>*1:*1$E#&n+:6%**Dm1!c@9VZ?%9J@Chd<=t
MDN^tZ BnVSD%\dpI8%jj8Zd<%Md&CZc<%8j<kpMNk?/I1B6@1EIFCcpV5=YN&Y<a+XwJbPC*yqFw#&CjaK#e&%
Z/Q/\E i&eSZKMH+uVEB&+yPdR4in?R+i4lWT9WWePc#NyCd6PE\Dy^FDa\?%*I<n$8RSR9XL+<6%?taIa8GqTw
F5KDIY \$&1A&in%/nWu%SC6&8k?nWhdBVy=SQ%CAwDNpy/4yP+Wt1wDRd%nnID\^Qw^#X^AYK+NySDlSJZVKI>
6Fq9cy Wcbha\K8Yu1kE8WRI<9NWyT:HcutEnLD%8jhIZLhy#wWZk$>yITKEP?wWY%jwX:*TcahpEG%m6W#bRh%
+MDhn5 =Aj!J*YA1mme^48*G9Z4qEac*9hL!uD^<1\YtR+A:hAtYVBHq:qGAc:SV\ChRTqh=5qJk&Yl!#^m*<$P
-AXLV\ 0005b8aaab9001202b4 Page 288 of binaries2.zip
!><VyY 9JK8ecXh1WBB\$FDZt?@%GCmLQ$GG5&XcZhEw<9F/yYpYD4K>JVJ5q*1M?cw5dbMbCyN/Jt%5H%aC^&k
yFL#lm 1nhXG:WjnZ/5:ZNNCd%CdeXG?jdpyJ/&TaNVMi>ylQ+n!e5DFQw:RX!%LD%EGjXY69$GF9NqkuT#J4hT
6iq8pG pc+mPcCyk@KXw<jw5IwqeSZ!k>&!>XXKA&<qC&K\PC9JlI$K1IMKhWww=q5quIRtdqmK&/dCQCw>IChh
ck5AND $KVPt1GE81Zd9np:=&4kuu%^c69D\NPMqhb#%D&T*:FD*>kG::5a@PHEZCl&*y:h\Zq*=%^^!@=\K9uD
Zm548n =?#?nnq6y?du&5:@eCZ:w#J**!6!*mB*=e6=?Z4eD%eDRt<Z4H#uj<&wkI1%##jk1n9My$wZVjl#Zm$$
t>NJ<8 h?Z#&Q%th9t/@tHYlYGW+u&uQZKJwXS$1icW$9=DJicByZtZT9cVmty>@DZ6C/<=BX&dZ9\^ieGEV4iQ
A*BB1/ p9::F^jZLm@:tBpeql5W=qIRNuhljtQy8&T*qW:#1QQLQ=a5%D!%eL@&\w?V!/u4F%H*eTHJCp&*^dXu
QD+Vem F\iVK1=bL5=@Wqy:wDL:4$WjR*$$N!^8t:8A?tjI6V@KXn=eRy&>NF^%!RHF$IpV1tyjXae>Y%DL4y/w
e5k\\M 9YTt$dJ\5/ZZLZ&8p/1wqIy\!1L4p&5$P!6YiT$K&%PiH:^aM*#y15DK<FBI<+5<%uKqldM<LY?qn?ZK
#@LSB8 A\Y%E?i99J=ZG:/whqXb:jZF1&kLX5&e8Y4m?qyc@c44t%jQ*L+1jPi1A*9?tHlkyWNH#bDn9qWu%5\<
XE%Fu> 9idA?VX@ZqyL8:J&=9Y%B&/9@ZN\Hi*l8yt>T6R:S+inVyw>ZI>l=l#+qJhmaLY%ZcKnTcqDDl*9K4/q
AGuu9X Ryy86SI*YP<kyVR$R/*WjaHZi>t/DMt/j6YV#p15h1Z&W5Z/Pe1wL?J%>!T*8TdYNcFhu&IGjPNu1eZZ
iGjcA@ Yeq9hBXnPi>EhT8jhFhG?edX#%F5H^AdYC*l/nmB8X1N?%1&#p1&ZqPN/!!SiI?#i?k\cnYc9qiG1V<J
IT*:Wq qTFd=#tl@b/<*wB/S^P&wF&yLpRFhWN1+IaCDnMJ%T*XV6mN$5A!@db!\<T=atK\aQ6nyjapZj4A<+*8
P?CD// 18&>T5^:!mlQ&ebnhq\F!RJ*<a+MBi:bS9u>J?Q#WZwb!1lK%PBJ4EQPBF!KiH5%qu=Dqy+tnY1VS6Yk
q5%!aq Q6*T:6BSyH>WRN%ASXTn/>wW8L94/Vmbkl!b\S\^FANdu!FGu/ERRWZS5:jnd1mkRyV1/8RHt#DeK1%&
AEecNM Be^JS%R:X\G%YkG*P1:AZdK?XjbG6A=cRV:lhY1E^GHecnGWlB4*E=db4eE>1wDDVYDY!NcFmHHjm6$e
BQkt*k pSq+4am/y:npjY:hDWZWEBc>Sda8Yu9%i!ueck#KZYqn+KGN#t4$6%Lei^NajYL$@5aBjZHYDMuBGXmt
B?Cl@T lNTky1KN<wcyMiLwdSQy@Yn/H!h^hlmt1^l*6VV#NcykRAJ*A<6eniECpkP4FRbMFZED5niu!6bFaFEH
Yj91yZ J$ZpmA*$K<&JRhQ6JQTm^P91NR?%!da:!4YuwXB%5uWHJZA4^Pt4FXGK^&j9PXV1L8<\S/98w>Tci&4e
6YkiX$ =6MHN^\^iTFQ#%hmHySwZ!%b*1J$+/pGmm:NNbVtdqN9:^X#wMjSD!y^n$4X=WnRJdBMG+*/ASp8YR$q
<kb#w# weT5pB#EKYl>neNX^PFc=V=XK6l/!6iJKcDpyFH?Qi*=pnyWLHyA6j6h/<pWTT=BC9hcqy5plh:RX!e*
N?uy8Y kYp5##XWGI!T:imVb%bk&weW&#MptSJw%IC5H9%\*R8y#*aT:RN!>D<P5ka\k!h%WG5p&nN&e\hp&lPq
9Cm&<C /Yqm1F=$?^eJXK5$X$$D%cJ%cH5jh*D4LGNy&!Cq>l+5T#iHYaX8Q:Bqc5GYFJ$pdtuuKR!K&=yI@+Ky
%GmGYX aKc&S/Q1:k@??d+w*8*?11>T:b**6%q%VH!#@q#emRNj5:@/%YH<!i6<HmdMjZk$jMk41Y8T%5p%I?^&
$J1yMM :Mcy*twScZG+EMt/GtWyX:qBt=T/HYKw9Mitm+dYJR!hj9ZW/>uDD\MJA!t/#C@m:T4K:Vcaka*KVF@^
a19JJQ Dnt%k9n/iFhX%laFZJJE?#%J:k5FhI/5k+:GRIRMN\I#mEP%&<l@CZ+$/i>:tPpQ:cYKAwi$N6#h\L*@
CT=uhW VP?\P5=h^mFAnDtp^D&n46e9XS?9^pW@%>8C=SdK%WqMbQaw%XXM^1Xw%?5w5E=PG8DKP:^X4\6SRGGa
^b>+G/ >y#*^%Kmehi/:K^Hy6/&a==WNubY$q5VN%%VAle9$%EndR@K/?t4HmP?mi=XR=%VL+mRS6h1+!JWB<q1
Ph\C6? D1$Ku@@/^LYb!F1?Ad*&w:HLq<h?j$*8WdK@<yj>6iK:=:@KBQ:%&P&4@dP9j:@//?/4n@b*@%:@TWpj
/Nyu/V ^cW98Z=K6ZkTX1dEehBI^y5<Yd4M<X=tYJ94SJZ!NX#8RL/EXuSJ:jYiE!N4jJXp4CycayM?*uk/*c11
q/Vw^P R+dWjCPFdFYyl/ah##n1=:8+?pD6Y1^/8a6J=m!&*X4@nd&N\ZKy$YBDS6>>yj8JtD>a8<KGX$SCNY$K
#W9A65 P&+M?ui@LZSS4*bNY&//@ec#qPa4qqD!pbm@=l/i4uhq!\MGVm!t/X4?4XnF!XWuH:\P>>+S1LuMTtaE
hmAA9c <51b=&SRQYkb+j*<Gd1wd@1:Yk9!X4@TR+NcP!W4t?=hEi6CG/tt:b%/%Fc=:j&%F+Z*bR<<G@t5MPN?
altP/w \hcPHK8=8w9VE/dh&AWbjCDcuMQITJ\9dapJ?*Q8aCd6Eic9Vye4>#:Qt?/dEQGl>@PhGiF*dkdwTZGZ
4TwQCQ /98XJQVk=<mmbtc<w/c9^u^wM%9t?yhX%i/SwiM96*4JhV\>&@L*JIZ:BclC=#b=<jWw&5bu6lq9>dFH
byP:p< LY<?X#l\cW*TW>iS%$yjY>I@e=&^k:lb=9LP6=VEF?wQc:%*jFZM%n4q*%B9+8R#b!9GciVMqMp:>S$c
4kZX#Q @FENXWt=puEny/i$Ze1?KZQA&H1q<TtX5>NwVqqN#:SQdjjaw1?AM@!d#kBSPY/MIElBVLuV\YVC@yjF
etq\@V S6aBRB6N>/#c6lH1SX<$Bm>?d:5>HELhLTCw1Bd48u%p&ZI=8=\>$#%/*^!J8^LwhS1nnFq?JT</hM?:
q^RIWJ ?hM*:QFccl#eyeqRp>@ncCyi/W:LpFSAS:!RRnpP+NZWm4kn/mWFhELSp5I#C5wqel+#%QV9!:#F*+nF
GMD>&> tDyWJcb8*IVSZ=1$WDJ9IadREMNIp==iH=/lk?65V>9Vj/YEa?/#%##FTW4ju/tAccDZWDW&MyL51l1/
b5yAdl DXFXBYES?J1Tn\PTNeZG$cSF5h&cCk5cE>8wT1!GiXS=y<R$564K^%QhFCTX4M!=VQjXXJXN*AG<WnNX
<nQdN9 LGqSubJi#mK>c@$M6XDNNSSneh>KtW4ek5QV15wa+iAmjVS#euXl>&yCwVnZT1FTm::cXe!ljECncL?*
kA+>he k<pIeHN4YaBK6i=/>c/M%hp/*hVX&6L/mSqKFVGeC$SF!qQVCWX/:V%J1\h/Xq?RnNt5Kj9mh5Aplt^n
BJ9+AZ &L&ym/j8iCFV4I>cRXX5%LVKZ6cbWc6ZjB\XNpXGI9!pXNwDVWi<dDNl6XNXDKeGyaD?p#q%kS616Y^y
ZR+>@9 91pcbpHh6hXP&LSKhY@Y5yZ!IZ4m^5wj=>t99ChSn*w!V^XVRP@X\D&<JwNqbRVIw8u1lVkLTRttYXHL
^/yHV< kESln@k$R$&y$yb?MdHHcHpQ<:LCqncJwuJn?bk4PiWh>AqPajaK/A1G>MQimaWbX/RGbS^K&l>wPLSE
JQ>u:i #Pp\6pDVh+5=eRetwd#X=N6YwP9L!&inw>TpT^<+Z*W@NAq*T?^wJujkYkS=dlI6iPMdX:$CPp&iYEk+
Gk//@T Ti*RqG\9Z@n$lIeS8PNV<Fd8a9?8+Y*RyM>P*BTq\V=46?aQp&Q:bp$<c$X^dd/5dXC6QXi8%>FqihAj
@BSpT6 >S/NT=T@YL5>MeHFtT/6jnHJ+aV:>1tZt*LR#Te/*Ry8wi<@1K+PmQD#&K!86!EL^GT&D/C#&5Mj68$#
1l%=$j H$\$P!Q4wq5<+m!8K5Z!ylXQLDBj=R95>jb59YwiySp*AZW6A&8!Gay98@1Hcu!KLQ$F*8XM!1IAGqYG
WMF#/9 eJGYAD=c$*+D84BQ$8#B<BuC4lDcWpdcSLS:kF4k$F!@A*@cJ:#>T#ytYK>pRahB&C#c1wWHm$<5GLl:
bY=P*p T>NH#tEk8ELP^CX^#+SG6jkK#IANyY8cbFmqX6!F*l8VNpNGG>R&Lk<+GP:F!dXW9/#99DRCX:=\j!P8
6bELKD m&pt=cmtZhK8Ij?RPwliddh5E%dcZlXHFi>aEJmW/:hF*ZX#5NZt+KRYLiq5k4?jkdmQ@$TMVu%daCYB
EM=nw: Kqa/ECHbpGI1#=BCmXM%XAw6Mt5Pq9pHuB%i6A^jYwaiuCLiZIl%8Cau<>Vd9Gu=9CX:>RP9LXI*jPlT
iL?D9I 8cT8KT^+e>\$$%il&@S9PT:ItK4tk51kD/=JLtcpS+t6#Vdh$%@qF9F/:5*NYPuuXGwB#6laktCpLMqW
u!X?uM KD%FDuk&*C\YY&865G8GhH6mVM6:8^QZQt6u^*+5qV*?+wq$?d8+dS5W=aK8Hi6Z:yIy*u>W#cqNF>PT
pw6/!& wq#/<W=dR<DqQ6\:j+8w!KYQk1cYbElyP#&8kihN^EWFGFYH@i6Rk\QWWwetdhi1E1unhGh^XJ?$M=iq
^Fe#jq +MkkT^GWy=8N1K4YQ==:m@GWq8bVeTDEeTltwnH?%MAcuj41y>i66L&:jXbcDk:+TdC&WFEMa+u#MtyT
#Bn=IT @kMVHHy$^hHV/1=/*b!&bwydp<9HFm=ZC6WSFm>b>=m!@>Dj*GqeM\t>HIXTJkw6q5mY$H9e<qDMKQ*?
dZ@$ME 8+:>iYyl^V4&=c?p$5>j?wJiqKpdq<p&JP\NP81QG5F=PNlNwj%N4&+I4AMXTm=JjKcn&5XpAPKHuSP/
959aMb Qle#K>CP%*\t+I#h^bmHbRwJ9c1hRicK1D=FXJYN+9H>KcmMCt*Hc^!FAp&6wu4u6t^\Q1w>#qwCHYZ5
h>#VM& Xm=#9nZkWRK&JQdE681D%@dbKuQ:Na@ZbWq>h8Pp&t:iM&N9Q\c6ma9?5&64au\?:5dhtGGjwkMy9waZ
$ByQ#X >G:G9eBEPdV9#=i+<GX188&VI*q:Q>#X9tWkYYe:??H#:W%bPk5YMPbNyFyKD>\!KMuakV&iu!+@?MY?
HccMBN NGPi$jHChZpDuku5yjS1KeeQp^@wqC*N59M+Vd>N^LhHVep/GmaV$@>*d=SWu41@E8%EP8YS#1P%&Whu
e9\5in Zy#=\j+^i58#m*ap^$WnFZJ$4\$=8:AP4d=*H^>^YuX%i*5kJYX+!DqP8:^KCa&mK1GYhG=!T>5h5PV<
q!e\DB :KjVa4htH6%/\*NVJB1qKTNF8H=65/\5&1FC9tDTu*huj=n@e8*LD9TpD+M&$6!Sw+whH?e4D5=SLH$%
AXJ/Bm n*V$+<:JD?c54B1=E*61=u!VP<jhV/#>c%>QXhyihChVSiNIn<RMREq@d6:P>=NPZb>6#*p?h>??D=Mi
9d1*ml *b=>dPcL+9tNV#Qdn8Y&1GGhnBXR:hbZQ8Sh8YH5htE#cQuwp&ZnTJi:HJ4yuqR/d#lKQDEXe&#?!FjL
PRECc= $*@Pu##\?i@Gh@N&Z9#+h@4D9>b9?nDj<5tu9>eQjV%&:QN<^Zh@##@:>:E8%LFd/GN9$jcHQl=:IHGM
lHl$B! Q9ZkkJmEJ8GR@EP8nBn1eRc>Vd/>C>Qil&%@wND?X4FDR1qDVduDWKWDXP%\X6y%h5j/ayu!EZ%WiH=H
Y+4dwd 8WNH^eTP6wpPZhwhVVwP6*R:?mb*uJ9pKIF#GNa?dtnk1Gda<ZcKw<=WS+#?<S!D+*NMHKPMHh8$n8ia

-A1dit 000e16ea78f001202b4 Page 289 of binaries2.zip
D6BI=P h6SP=?cdqMbbhpwRP6YIuabAJ$n1hAa:k/DPPHJuD1Y#tNybR!kdCC=?aN*bbhQbb>9=\K:#4Z&ZBL%L
eLnW$B #cHL$LELhPy!h8+K5yYSEZKM/69i?n?+5RERlAMJJD+*6t>uy9meykCARQp@><u>%@jJLj:XjZJqJy1y
BcekPh $1WhY/kVyVCS&ykn&\dWL5w6HwqS\/Lh$>R\&^ty1u5GP>t1+HuXGXd&i6&M9yL/bYF1J#4nbt49eZBP
%SQ8Mp %NmZtemkuQTjp#Y^/@/cc8I^m&5Q:wKN^th/VthTn%MX^I$:Vjc>1mlZp%\e1Iy#I/uM%ja+P?^?%/ZZ
uKIeGH ?bd%tYyGuLbdAMq^pL1p<G9lkc4nZ$%q1t/TFI+iJ@TTKq9ZTN\?RV^#RW*KS<%Za/>cZcChTW85<hJT
nBwK^e =CK*w#ZtZ#:%*V?wyCdb+h+MYT@ciuT9t?pul6cWF6X6N/Z$D6$MBN:cMm:KhLmu1EEn1y+*\8:Dmb61
P4*McH Ejl%wl8Wp1X>+9\=TiX>&+?$>WwX$M?y:R1\Zi<t=hCXM4YE8D8k>+#c<1ZGy^$1ytqF6d4pc4d6M5@T
Y^XiRl Cd9u@dVu&865##/*@1A<\mub6!Xb#nP<*5&N94\ZhSuD1hny$%+Z<En<!J+G6^VG??dEmV9:ytBil4Hw
iGliSZ cbhe?@j$*X\+5=l^Ki\?&!D&n8uRbJ*T9ZdcnEiQS^k&qSNQy6iB?=6!M*9>h$>ZQw8N81u4Qk9M%IaP
SbREYA *yuetJRHT81CF5c=qZ=dX%?T$JP>>$t4LtSLubdDu+FXE$m$PJ8L<kZXY@TQ/SZF>P*a:B^#5HSZ^l6X
cM++yq M??@^Wq6Nm/h=JFRDPj+9npGne1u#ncu:5nRc<\L8X\:54nKBlYw:B?$@A6b<<Ylc\!>wW9G5e1LZ>Qn
Daup@E dqdtLMuV#pCu*5=!6d&#lPS/VjXhh%i1djjNCy9l*PI6i&%Hd6+NQJ#c%I9&*1B%K+S<R9tee58NK%L4
9jJ?eI hLL>9%k5Zw6&@q1VN?Ym=aZ88%u#=yR<@uw6Kmeyw9NVW8Jn!y=RqRQ4kQ5=t=Y1LR1nR5<^cCR9>GFK
nTjk8F +:Cc^qMnmnt6q>nj6/*dWa^+\ZA4SZ@PdYb>LS6@?8n!wPdd819nJiYyj$&>c9:i^?^SkQ8BA9$HLeM/
?KkEam %m6t/dW1:F*yJ/PRXFR!>T>u9a<^<9:bi:pFS+\In?c5$%6+yDV^4!LCi=%19dPQ!<wid6F?qH>AZ*W6
?PtY9+ ?TXnakQl<Z6YWTD=la88Xn:1m:@1t:#Emq8NeYKXK!+F8=/?lLEEAn19Qp55u9J+auY=q+V&:B%&&IEh
Jkl!/J #yh6Qq@GBM>8Z88GX!e5K6L:$@u^B6WhaFVjXjtq5>ALJl?+e9^qha\d^*mNqYj^E6QFRH>/>&Q#$k>*
WK\y!d Z6#1Nwp!e#E9ZBDjlqWb#HN>wc5>5@Ll>aNGNeaQJu1=D/S&c8?h4Yy?&W8YR%=%cIMeh+9TNyYi5/EX
%!1X&n X%L<NMq6XSGDhia#A+kee%QD+tZ4w>wk%>9#4ZM8/RXw=Vt@5EDdL9mkeWPmCHI@WLw/dL:&$1BQH6ud
4n$R\= %ZiT%b$8???DyJy:Y=c>QS/Z6G&y:/w>4b1PwV*N%PKtpejX+aa64QD*JZZ>E*awdhq>c<GGFMJjZ:1p
NQ:m9a qJXN6Ce9RF&dRJH/T&Z6VA9&nl/Nlyu6L?I8i@p?49!nT#dVw9=LdqV=?c@PM6e/lk:&8PDP/$4%*NFh
=/$Va\ 1S@5+q/=a+jY$VRh&eNXlEt^G/DZ1WanYX!bA&@cY>$<1?MWnXyhDp&MH<EaYdi8NX+:@MjMt<C$E=44
cPQ\P+ E6jNP5J=SX<9J^d&4J:c&jnq*ccuBuq>t#5Qb:58<#64u>@94Tb%dbGMS#A*6GjX\aDQmyINtX@!k^ac
i%=+Ap V*/juHd>?4d>=8?iVa$9Z6W+dVPu9h/aeVKqQ@D<&cTYntd6R!5P!58:HWkm:/tVjlYqX4QBR&@DYuD#
SRt^a^ !KXqF4LJn=?w>DhE4%*#%#uK8Rjk4S/G%9uNG=n8M6in<<Z/X?*c98j=ub4i9c>pu:j15P8qZt^!XX6=
DHJbKZ 6et?=9GZuwd5^P4LMZ:^y\9emj9/@:/1d?Y%aKcdW&nQwR&a4>5^JkbV?#iWcM!dpQiBa*n&4iuXT&$b
%IFynk 4thQ>BmyLX8$bdu/@QL*e:jq9p*4jSc<TEqeYX4Pbqe9\GA6\Pw*9u&\8GXbYV^a1e\MtPaqd@PwbI1n
^1wKA\ q^k*c&%+6jKCb<5uk>jP%VbbH$%V4E\\mX@Ju8#e\Rw<wQ1wM*!8#?5I*^*V!ui=Q=y=@5kV*?FJ\NRQ
VnhF&e X>hi*6%\%K@VjwPE*#!Nk\cdF#%!jdD^cJiDn<LK^>jhG?bIi?yNuh:?@51lRM!b<pm6>LBZ$%IKq/X^
#DG>>u e:hWP:N14==c+Nae!IDA=wGdG&YnF!/hEdDK^=mc*PeQu6u!kiPZ\II?N1V9MZkebY&!!#\@b%+SN>h>
yJ?BnG %pXtTyKL&D5Z$!5?F>TC%y!bF6Lc+HIF5HGYVVu5e:R&L@/YTeR1D$=wX$h6n8T!E<?&jTLn@%=i?@FK
ZmC:Ab /Xhb%$$Th*4VYY>&lFj8Z61Te@jhhiYu?Y+H@%nB/mATX#!VZKLYKtjq1cJG8jb8>bK4J$@6#q<ZN^WM
&HB/#V /Il%?4#nB1H*SHAu91BJc>4GX:l8yaVqeda4T=W9GR\<8K4Z?MhjM<>b:dm%jP@=?+uGN&VZEa!a!Zc%
qS>>\R PZ?SZ*jG>T<@4^Dlb*pniP81:mmy#QJhb^naQhb>ARh*!D/^#<6XYauV9!C@Xa<#Ni:K*1aL4\i1aq85
W%EKl^ :pkiC*I6bKBQF#lJ6BHZnWT4PHE5bAwPF&5M1NHyR5hH\Q?nullp*LjDq9?h<\X%:P\pu@QF6^GhcM+Z
*RG&!N NCw+dklH#5l&#jDMhACT*B#VQCJm+6P5R&LhYY^tuKu*FFcMq/hJRK!F4ZNAnGYIP=*FCaq\a@pTa:Mn
icVS$I CiSw/*l/aGk<Xt=cnuhMiET5p:q=wL=BK5M8plnpaP>tm+?QM5^KDLAQ<\mJhayuShuSM\pG4mERnRD+
Re8cX/ 8yu1&hyuy#1EPkHEccbaPTayNm*e^wW$JV$+$NZW#l@9/tj6H8qp/8NACVC*\V5GVR<MBj#DW$Ia+Sub
%mVXkS qtE?<WtkQaPbESDJTGeSjQTbeBR?HJJ*dwTyE<56MnRm$V4R%6*MPwBPyETHi$!*CZGLN9M\w^HVw+&t
n18M@y PMiubF9FG?YaGD5ukKG&MbpyHI<ep!\<Xw:pcD*h^R6KV9WN5?Sap/Im&cG$pNlW1wXn<uT4KT/^@w\k
l$JV^k >$#:NENdS<<IV#PdKMA+Cw\Q+NCDtY\*G=P+8EC5uHM!!a%ndi+NlAWaV5?m8b1q&$=ltAJ/?FCPw/tB
ZNlC!q VcK@Ydl%4H%IV4mF5WER^QcLeb\iGEc$bS5qY&YG?nJDAK!eS%kEM>*DqyLPD8apJE!Nn>JQMtM:Wi$a
Yckkaj #tcS#1tJ%ldynkp=pWpi9td8ATR@h:6A+&^11EqPXpJ/6L?uqc<qZCLPu5utWX:VuM*<y/edPRa#ZEKa
Sn5TPR %GAHM=iRbCAuIV+ylSHAT9KJN\%%THMLV+4PbEiGJWDECKe\L/yQXGJtlyWZXk+\6&Dd8blQm$9L#EuD
TnJSd/ P$YHS*KM@S%VE%KI=k+B&Su&$!%Bd+b*YI+n!MpMIMVlw=lV9LN!>C&J<dpi!SS&5A6YVk@?^<p5t^Gh
^pid$W Fl>Q#QJ%hZEP$di!yLyC$!\e@F!DMkQ^CadJbwcyJk:b#5R5c*8QZH8>ICM1\Vk6uWmM^S5!5HJkyH+T
bbtn55 &#e:AnV$njjCe>JaEb/MVGhCPyNCeR^Qm&M=pmJMe#!VW@%ma&KVGK\y<YARPTcBRJw&#Va?JeHWJlI4
X>h9E6 q^CWby:ETcjtSKeRKJGtccbB9wRW4<mI*GSPanA?*TnF$kd^PI4M6NMn&aA=DlbpkPpTaYWcpWVJ+SkG
ZTH?wS yiyn=dJCamPhLNKMEp&<nRKuJJpH&+bQn*QJwZtRcZFSi6b8GW:VKYtRaVni&>B+GmWkulN6FJQFVkGN
d!l:#S AZ<#H=<+c^?5HCe\^nbmK6X@cub1uKPZ6$E1J=WJbcjyt$>ql<jHGQ4F?FDb*qpBquy\JZA\6ZiNeWw*
PSN^Nj TTj1iRbuPaVa&dNT>dB!Xt+=ywuy$bp^mWdt^qte1X:YEZlnE*1E1cqBllZDAwwM5NIL=dka#bwq%MWG
CKhIEi 8jn?9*C^IRNpjledMkD>J!+&+Pmbe=D/4X$EccQjw/+&$Gmnl6\w>i$9PQ1ZQQy*>NwXCBn>aXRqcQTc
IERXc? hIk$Knl/5#yEGk%HGk%H?l:BcQ1k$SacApeDR1M+>Q%:XJA<myNHV>BD=NEA=P<BSnYknAaeha/DKNS^
Nm&CjG ZpZjn>%DXGF9T+AEAd?Gd+W%:q=:+ZjmI>hT@c55Ydm*DWmkmCA4*A5EJFBFpAWA+dI$EYTFi$TBSMK@
!d*!YC !$I$WLk5WRSbKqG+LCCCLQRLYbII5mT!eFqRBFuCL&SF5C8R>k8hSdA4pCLeJwpm&NW9QM>Awkl&BWIp
bjw<K^ +dIm&BWICJeFSLA4^PmF!wykX+n#pqBbEi!K>I8<ApT\K=L\?\FBRAT:?wY*HAmIaFep+Be/m&BZJKL\
XpEIMB hkMR\c=?+YpHAmLaFWD?lc\IhkXA\uWtmYBZAEq+Y$eT\c+A+ZeckmRS:AwkC1<LJBH5CmAI6!8TCHbF
+ZmCHI FH:jJWkTyS?pCG@dTTLaFXH+G$5kTbS?EQ^FipZ1B*?SZqH/RiH*MIKkTQ&keL5CSiwHlh5XKFI@?A6b
QAMM\J WjyBWHkbkcL$k:<aI+Em>aP@pBYqH/RK4$ikKQ$kSdlhkTL%k<LdYFCWjlAW*q=Bw9TD9&mjIbH/RiF%
G:ZYc: ASKqH/V?kqiWjyA59C=Aw9TD9:BuTJS?EBS8G=Aw@iA9:BtmmNKHC4eNTJS?pQwLYXH/\X@aM%tWjqC+
!QDa$Z 6#yIF1pj@IY5TQ&keL5mm&BZ^F?$5YRS:PyZn8+kGjwhajL9CI6kYlTCeQMkW*>Dq9dj!%II9!FL@A%b
IYed1m +DhpTcIMPaR*P^V\N&Tl*=Aq@+a5=Vhp1d<lT@99bjp8jWG8jdD$AQFEQJFAImGVIBF9iWCiJISka!ES
@u+K?a AHlaBj::LR<kqTnK\QAZYkNC6Cd^6Adk\VNJbK%lnbEFMy:YeG<qk6cmDP>?MjTumnK<E@/pJEmFjpPY
+W%nu+ @B8!qN?Ryj/GLP&@q/WSjt$hADJGE6E/pKXmEP:/iNbBJIykHVSSJl&@GJVTSJq$@GLAR!Q>lm#+G:LR
VlL*l8 d<mTj$PY<l8!%H>w<bAmF:Z6kF6WbJcJYAe!PljBPpTb5kl@jlem@FM:VRbEd@HkmwY5i@K$BpT+nRem
A$q!D# EEXb/CRI%%wEt$bYeaVKpu=DF9\NYik*bMt@IW9=DXu1d<nT@u6b+n>aJSF=BFnWqybI\TG98TBYmV!C
@ddZBy <i>YKew&B*LpW/nYwp#DlT@BRcJ5e@^TF9#HWR6b>LEYDb/?Wum=BhBww8TYKJN+$m>!m@\QYqPJXJG%
SktA#M lti+APZdYA8kppZSY1RqAKy\4cu@w#EAmeB:=y8uNV^cFEF4EiwVTjkD:bAwG#RAlT^eq9kd55B9!JJ?
I:pTRH R^d<H<$?+PE^RQk&?\CII5\?IFG&h\ARE1+%?Z<$kmBViQ$^V&5CWST6Shpe?pXdDj#n8IeM@Ch#JmLq
Lp>^!5 &\mCTBXqBCHT%lIkjASB?y@%MGR+9$uj6B/>N9Cj6Sbya$4+ynSEA9=*@TJ!+TBQc:IwFpITcVtQJF#4
m+!SjX j/mN<Q>Fd8pBCk%HJI%cCCmKlam$KWd>laYR@$hc\*$TEjnYQ!Hcm/A%SbV6PIy\4cu@G/&S9R\!QFSG
+Yu@Km Bmbpwpl&@h?9FpHk@&m%CNqSlPByPp>4kmm>1mndiYVlV<FB+D@WSkC=tqSp4iF<yqB+YpNWWebhwt\G
-A1\Z* 000c66128cc001202b4 Page 290 of binaries2.zip
LXceFA pu@S<wHk@&dGl%^HC<F6CE>4phwRWdaTIb4\ZkaWcc%JiL<KWu=Dq9wd54V@Zld/^:Wtt5m&lV#jB+:Y
dVucTb CEmpGmHKSmV$m^wl!papJQ\kECVKS8R9bj@BykEcSjSYn$D+Xl9l*EJ&9pZILXFt>d<ayWLp@$%9#m6n
m@>tAh A9SNc:luF$F4WhaE\F@p6Tl4AwD\PS>E??>q!j>WI\C!/DWCNldpqXap6=Ce?@jeIw8$JmB<:EMG@pu4
be$?/4 @<R!mVnEJHlck/LMSMkm4TkI6$\!?E>cW$Y&VGSdp$Re#Y8TTHp6!wwCYZkjRj/uFRWKJQL<CZtZqnSc
%HV>hZ u$km%ThShu=JIE&+%6V@#VwI56AQ$Inj6CcRSNFcqBYFZ:V$FMI@cm%/dWSt&HA%RLRGcKK5$It!/$\T
SHjLdj jukcEtZZGcD>I5Yp*=D>H<&ApFaAthH!ew5pTt<8!y+%RBdihwt!b\$IQ*wNWTm@Ij8@t5MRKL#bLhIu
I#PmEP Emtm%AlSh4\B+ceTwQE:*w\^!dHZBbCVnIn%It?hnL+8<Q%>a>:4ApTB%\Yk<Z9bR8Iei:EAII:GPjbK
5HmFXI AjJ?MpXIqPP1RBAuJ+YNM&c+MW#GHtek@5PJ^P@iLtVTh<<YZ<V9D/KTlDCSlDB=yGZu5FJTYDte>DTe
!IE>:T Y!+un9$Q^D?6bkwTM:LaM*ARFjlbD!RdmAJ/kEL$IPI<$uK!$8N!a^FNj6IBIQ:DKbSjcDFGP=wd6P@Q
>YpIwX /Ll!54KS*Qu8<?QNRn=ylDG9wF\+Mk8RV%>ImL:8/Zt+uHRe+pjEkw*dq=&Vq=/XnHQI#p/Q=dB!&Nut
&yjQi& eIJm<j?WpJ<>P:+u=F9t@FTPXD:N!iM$y%LGc\:\cW+Yw4qVdubPimye=:LbYelXG9?w+p@:jV>WlMc4
Slw5M@ KM!wKWKIk>m^mYteYFaKLn5*I!M>K?ijtJE?@>jMw:bGF5JMFeI5YD1+uC\YJ+&Vq9CVDlBF+Bk6+S<K
b#WDk* cFRH95!kCXGJJpTq<QVeLF\<t^$Z\+yN^uG!eZu5qFm+YQ=SH\D<h*&w+@TlCV/SAw$@NnG1V\AddkQa
l^^H?1 edk5Nm68jLcM6q<@X$AS5pXIQw\@NDHKC?BGY!CaFDi8&RPIyQ?<=9QXH&V=lQl#@cEB+&5?NL:?pQk$
RAqq&e F6a&B<:M#tGu\ltXte9Ja1emZwV@yDV$p%@SYG/NNWmnyRTP4?W$$uk6TiP%JQJyKc^hS%/5kS9%GE+K
ipYmBA J&etLw?Vp+lL#$tEc@$Mhqa&*ML?4DNIFKYE9&jhPG4\%%*KcIHmR4+S+5l+Am+?QR5Z!wGF<:J^NMke
nL6hQ@ S/Pc+%lyeVnjwJ@WwXJEWwe+46^y\QkelaRwC@*u!91\anqyPiubmV@4S@69>B56+9EcpYH4HNMwEGjy
dnyjYF ql/WLt!ka$GEB=pWElJ<@CnuY$<u$NK!a8A@/jG+:&/85QaPeGWA^@YK@FZ&8=Z^%/^^hCRlhL!:tZkW
cpDXE$ *%L$W/1Jw5RJ@nwZ!ATSMkET9QKJSIS%@S>e?dS+Wct+8%yXQF=:edHayc+bRXuAeW^QwZKAp1WBbmBG
4XwHAp 4PteGtYCk19BW6V^ldk/SuPSR%XQFGqJbh#4YtZGVbuGEGiqSHwdT%@VZ?:duW%1m%^nHS#&B^DXhJ/D
<F^nwk q^^/L/eRdy*TL&K%94caGH&l>I?i846yi#BTnwY&G$8N4Y/i$QTYHD=hDT#$&8AaHLNIh!I&?#=^#XEF
N$IXw! 8WwF%@hcNMcC5KX8\^pFLymAIMlSbne#iE:1\5c4d/En%H5$E!X5tdn@nK?i=E1*E+*?T<n:mJJ?G*hu
ipnQ1e EW+8Dq+jtK?91DRWRhZJet$ddK8iGZ1u^:ZG<?PnS?5@?=6^6:^hYL4PuB6\kaIyMl/=8R@HmFt&&W>H
bDjX%^ w?:aE#tdB/Y!X1=dntLjeLiXZNB?*$lPjby99dhRS?uFFD<^eII$89Fpye6tMby5cj%^:pMu#P5>m68\
\*u?Zh NYK:MT#*6E=mS!&D9K6Ze/C6P@u#+aQdu^WbH<S+8cieZq#pPc!=R@\5iEEQZSYqXh16FQG$qFYi6tZQ
?Ry@i? !*6HNcZRl%G6JiK:TcR#>/5j/i*\F6e+a^tdH*BmF:w&cj<PX65PT5ZbNSF1emyttki&%!\mZ?n!@X^i
9+#yT1 dI!8#eb8Yyb!X:dLwyt6i6uW?4*GHu^n$>QT:cbBX<uw+m8$Am@R?%R4!i4cActA@a<yy>HLNM/Xwb*j
BZ#IbS 6p6X/*l4uHq&Xy^NAk>*E5>6n4wE?T#jbldqn9bb=8D>X9>=Xwu<y\?+/^R4t>P6VlpZLT@L>eyh*6#*
*+Ae#4 ?aSTWHA:R@8KdPjl6b8c&#V@9uQNcwG5\a5G:lI*!$Z#quSY9jFXp:pt5%l6$+K*4AqtaX@mimVR&%N1
66Tba/ Ip*dewQBh:wJp$9WW19Qhe?5a=\>:?C<NY/uGjMp6CNX@%tYTT6l#d/lLJYu%n$?&JyDJX4m/Hwb</^B
9!nYGN J8N?:X%ecWD%uePTb5\uj?BD>kVPd4ka$%<\9iKhy$=5tE/\JI5^+%tylEdKCYwMwh@++4*#DV&*ZDTu
IpWRKA &t4E!ht=HJbcb4D/A#9ae@EpZ?Y*n<HFq+euGH8@Bq=4dq@$*Qn$uhANP\H9@q6ZGVi9#*q5VN^6Ninq
\></t6 4Y%Lq9TPMH9Td\j65$B:LZjee:y6YMJKK:C@h*%c*4J<%6XR5C\YH+A=ZGbT1pcQhZ15DS#XQp?18cnR
imF&q/ uK4P8XP1/P&+G*QX5I^hG8nP5N=%?YPk&T:$!6c#QWDCWGR9mV%n/@Ydc#1DXtGVG8\9jLqSFH>9a/%b
ip6XA? n1QC<M6>PjF8Hc5iG=69\K!=R5>a4DJ=iki$tNm6*:%K9n\8$Z9mWStd8*:cNadJZDYJ*1?6AZIJnCHq
1J@qR9 dCm8jPnYyR!5\1ydFtWB4&>HQyy=apG6Wh?Pqe5@8&e9mAKcmqC#d5^8qbSmD=iyh<Yyca*MHjq+48*^
Jt/XT: 6tYhJtqlH8HP69e1d&ChJ>u$VIua+m!Y/qCltHFPT*bj+1e:YL$4MhKH4^FJlYW5ia9y=*YQw^w!bhha
HB<#5% EW8MV>J6>@ynqG>c&F?p:\a#I5=H?M@kZP#SYNF?b>*1b@=+=lY>QcH$1ImPWp!<T8n&KVi8/?9H=C1c
hnC51P :Dtc1LbG>9I#Tjqh?un84WMXEW>4M?jFYawNQIq?bV#H$tSH$c1=86NJlFAPN4yIdWiL6pwZI#*8*Kdq
V*ZX+K ^6H>5&$pVdTCjN$ZwBY9$+u$T%%hG:/$G!b*#uk>y<b4*<tQIe?P=Cn%YBp%V6JpN^S:p1^K#Aaal?>u
Gl1l\< 4dcQY/PnR5t#@YQ&<XJLNY&%pST5y<H>+JNuyy>@#DHcIPbW+#py\JQDmNJcY4><?:\\a$ml@&EnW!4k
>L$MVp >kcn@wZuan/V+<<N/8*i$*56Z95&N@QI#d1S^MXL9FKhk?JhY+^^jqY#5C#mX@q%n9XTN+euya<W*N\5
RdM9/8 +#ZyjpX%JtQ#ack9dZ8VRjYMq%c?65b#u16%Ha\p@VZp*DRd1!LuFFYbSt4c>GZb8nPS!YiJc%*di%ip
$8k8^$ MI!>?y#Z4n>wDjtwB\SqEJd+d\bCW\+>ZLu<@jR%55XDP4&8$!:MYt%qynqpZPLX+DW\\YclyWjKk=u4
bcF?HS \bRhNe>TE?@=dHC=LKi6Wb5SY*?LXV9!y+P##F!q+ccM/caH4ca?%nm&LHkhi<Zd868ij&cE9QZ&LYku
XZwnBP k*ZHD@RiZM\=Y=*6$4VW:Mtd1j:!>G=y%PB54Vp:n!muuL$>Ie*NSQjK:4!a&:lXd:iMwCeFQ:Ty>5t:
wR#R!e qL?8\4e%GHhAZQ&t69/&4ScLLJ//6Q6QYPG^hN/qTk9ZaMYJn\!VFtd89S+i/P8G@bK>P*Sc\GH69ITL
5V!G61 R\S#w+$9i!c5#dnP#jXI<C$dQNGa8Y1@TXqcVd88ZIFJ^P!@n9S8P:L!nYQMc/&!:p5yde$b#!h$?lVl
w&yjZu $j$jH>:ZXRhi?B>ND!S$*45>j<t6P&VTbZT5?<5E8HV5X=&b&VA<//Zm$+\h8*MN+mn:uAdjnHR@YS8*
PQWWlS cp+=Y<Pn*DL=ZL6+%99G^I!5^JLnb8a1H+^Y4M:4iZnh\NPqmMl&#>ywFcaGBaVQiikXkYej%&q:48j@
wptRth NwdljtQB6k8jX1%JjHKGRL6!h%1J*:ywQStVp>6HKNYSLa9Wn=i8pkhL=?^>%H8$p9m?\@uJnLy%4e9/
i86BVu L4h^%TTVhdEhnliJu\6Q5&91%&C6wq\Yu1DF&m=cQMNPc6?1+ch4>phtGC5W?BI8Yeju6&KYQYABm&W*
9S*?Dd 48n64h>V8JB\I>cy<Q\l+J^WM*FY46unXI*ae=MX*W?H/E++*l9h9<PmWny@cMZi9/j9P=y*%*^u*KQh
8+DbAZ e<@8F#>9LlqeK=t#5d=uTyFFhhYy8?4XC1\SmI61ZBVZP>m4j#qn+XMhXcN>8=5^aWFZ?<<6W9>A^!/+
!e@Gnt E6BD9HdDTu:Q?XAVa%@Dy$9N<Dq4yy:hPT9i*Hlm#k/61M9ZN\eQGYT9a*=mNV/*?FnX5!Fnb$iF\ejV
XH5TZa +WdX6@4KLtGm^KIQj4q</bd/Lt8D>wI4RT?8=Q<b$nk:X+yh@E\<=CAn+uqti1>8?^Z1C:Y6%6pq/65%
1:9+e? Q>p\V$jQu=6F%d%*?MY>6^+FqVqpZeMDy>/6NM:>c<ciy\a>$9ulS:EKH1eX*VR8VCC>h6u%it/GyL4h
8Yj8uK Xi:KD?=9Fy?8@QP><8Qaq*86&u9iX?M!\?JI/p8u>yl<uu\&I54DNY=/<*I@^\myq\EjW6<QiPQM&+j/
a5Rw*w 9QG:Fl!<*/kVnw9!T>u9H1hANN?je4H&=XuQ9H9u>pkc6ywyYSc*=1VWtnTXBlmk\k&$LJNG&IpD%*Ab
/#T4:4 %%KH*^kpTXXiYB@d5P@FDZ@jP>CC+8Md14$/WdMJe$/pAA8H!S54dBb%nXSkZI@yZ=hy:nul>j/%t?@P
/w8N%B lKBV^>9u8nJHZLQtTZS9/>TaRRl/qlKqJ:c^aT9\jCV8bJjKqnM>Y!$9FP:5jX5aXNK\DGX5>hWI>VW>
BWl:h4 mq#b>taB#mYy:&@*wL?=hLDFE8YhMjN$ad^C&*u=^&Wtl!XSQhn&!!w?GydJb?=kc:#V<d5>Zpy6CDE=
&RLTTE J>dpl*<=#QW6*u5%=dKKm/LKL9\BdEc+&bu\Jjyq==8:F></=>&H:#F@8i*4pEK?L@iM=Na:nPF6$e1J
FTe&i# @pc6tKpbiG#d&5I:nIE#j66u1*LXG4ia&4&mB&$i8i8hETES%6BDPG!eTCk8QiEueZRl^1KCMe%\d:mB
HDqZ%J eaLb/6+yK8:uknB%b^Jp8!>%Pwdn#uWYDp=119TLiZ?89AuV>E=dayLWp##6=lhy&K4%YX448*w/Y9LE
qTXF^Y QSbt^!4lJX1^F\I?b=#=*PC<?YuD#F%P?8\RYpZM1SKY&nM9XFQh<i:YYR8XPN:B8kw/u5?N\@T9/!dj
mY#H%\ tIjj<hF>::GE^<8j9hLhHHT/+X4TDyYnFXN\T\%uA#tHZ/65cp?#+A/ciL&cZKSutlWjVtmiei/i#WC/
An$:\C +XPmQ6E=j>8DQ!<X68*T<1$\JYaTXayj*NRjtn%qXw:FAY*^Yl>jcZ%^nn:n^y8YP&qd>n45\wAGV+5Y
=FWZyJ !BW>WhyY6?X46&?J^%TZ!^1M:8l*Q8<@uN?wkN&8+Yd*1Ww4b<pi8b&4&<1jnylmNk:**w14pP8WTXl<
j5<a95 Se6H\i8EkwL!uIh8/hyPa5PE96&X<W59a>I!BkwLyh+!H8PaYh=PQX>Xei?c/JZQ#!9J>d#QqHt@i+YQ
b?WnA4 I>h$GW$=>p9y54lFA<hDa#W/!*bVWQ+Wn&^NFj#5nBpj:y*4DuS<5N9%XZZm#aw@eA1Vnlt%6mT$imm*
^tni8m GM9Qq!IXB+9Q$BMVE*IXEZu<KWGl%:CJe8$c*%%4@*mh&4m=D$Z\JmS*Xpy<Vuwcel9T>@@p@WD<CiA>
-AF+9L 0004e3482b6001202b4 Page 291 of binaries2.zip
B<MeqV jt95#I=u=cakK*G8!IIGP!%&JnLuRt+<TwCuhmB!$me\I#*HNViN6#CL5\^I#+Wu:PNXwA11kCRZunDH
cScyPZ buE!e8B=NB^lhm\!A/TRpAM6V1!M$Yh&!VVk&=+C:%eLkI4w/J4CT5nGpeDSdHQ<hm&VBbFMSpLA?WiA
B?DQly y:$$kDKY5h>i<tY\pHZ56HTLkQSWXly!cVA<6ijEjp5Kp1nAHHb1CI/K^B5&!w<+c+=QDP$@TA^AHy<a
TmNRhu u9a@EpQ=pSkAu1u#hyjHJRkC+FB\1wkEAkFPEQm4BDtty<V>Mn%EAQk=RbV^!$Qp<Te4j/>$KPT^BNEE
m15hDk EpMljA6BJMC&VCNTj=Yad/ukT++F<XeFSAZ+$pQ<y@4G8?nRpZ?BaQ\=#Y>=+JIYt++5hTIJ=MVH5:Nk
Fdp$6I +&hu<:a>LJQTb&dueGKVBiIb6>R&Fww<ipuZ?LCk+KIEEc:8@:atkbZTS*P=cVmNmwFGauPlXy^tpaPd
SL*i8Z bqX*ypTFI/5qu%N^W$XQJed^>j=CC\NDGd%1RJqimm59LHqRuel>uGY%K5c=Gqj\?p*&5V6+59WZ6N9p
%9Nt:V NdiG*@$=^F%mj?#8$$?LjdeGdR+^9dL/!I\D$:hjT\/^i4j\dF^LlQtX%XSW>N*N%6jWM8c+L>KZXI6l
H8Hj!I KGEFY:9^J#n@QThn56k#+CC^4C!p<alL#&HF<t\J?e<Whua&B&ebn@!dA9?d^Sy6a^J#$^JaYdtyKc^e
<^ZZlq bD9SP#8Fqb&I5$\b@b9KTe9N^qttJ<DNYDLPMk8l6w\aybn%:T>e+yd+6QTePHa<Dp8m+T\#e>N#&Npe
C<A<pA u4HS!DnLlC\Y4Bl!E=tqT&=YPw+I%=PjA5Y\56tIY8q\:LAK9B@mapblhpwKJ!PdA?5R^$yIRM4!&%<+
&V<>K< AJ^WVqb5dty<Cn5jb=uB#5yJVM@NS6a+ai5iXVElq=QCI$ql^<M=+ieC&\W$T9+N+9%uF5@?^/l=9@#R
aVlau+ bQVZtF#+B@k9ZD/<9GGuj98d\$qBL54M!YLF5XNbYZA&bZ>n^@/kH+$mHe+G=Nu!<DkPZHSI5wlpEE=H
#%hK%6 dqaY4#>Atq&+HNPV&Yp^LLm^IJLlQB5Lc^tdunH#i$^bejH5XGSjle$:Qt/bpy/AdQkk8<JnyYGb^W:k
qiphtQ bMQJa!N=p51K@Yab:IR5N1^\Spy8>tn==8Tqb?jCPemBY!nLuEV+=^?j4Nle8G8$VM&F%aE:BE5iHwha
SEy6JM Fm>i!%l&HCeqlRY4qQcVFK^jKm5:NniFy!CX!95=M=iXlhSHLQKSCQiPw&TnPJ\deCNw/jDNZm\hSyph
E!/>+6 jm=tl&?=DVinQ:LF+b6bP4nkLJ*G6HEbneXqNBcZu&N^GSPGt<dSkB/nAV%?D8n^k<WFdqR5jWeL&&>W
umE=qB !P?dENdT:&ey9??ljpmu\q$@J!NqJk!PX1*k$TmC9$eS@HMW\V>E\$eXC$yM#$JMty$Fh:t\YeI@5Wdn
C$c^HV aH&Qk@X#HK^SNXk@+tJ>!!wY$p/MbSX:NBd&>%naQ<jC@mHNGR*IGhYI<*M+#p>=!pd!Kt&WQu%WKu%W
S19a8l K9%u1jV9kZ/\^HFteHlFuD/cW:tnEiTPSyD:e\T=Q\Sun9/i<!&nb9=RmL>9GViP@LdXR@=y=*je#6Za
9Wh?Bc ^6c+GCk@Hp#+96A?:ei9+$by49CA<98&6!8Aw+#6M<Q^ktQdWTDQL&4$A<J>8<5D?ZAn+5p$MpVCkdS^
QIh1$\ CJYAw+\HAB^AGw?ReAA+HwFy^phMyiHG484<l6CIPIA/HpGPX+%HpINYQ!MWIl^tQADm^tqDkRiT+=Tl
t#ACn# \DGRmPMSIw+$Qld+E?TVkuApQwTCI+&nw5I^R?MBIt=eItq\bwLnk6DkhlpeH\a=Q$Mbn<CqMC=4cFRK
*^?4dV DlkLA?CJEAFHJII@A^AMRD<BXMT4+Me*AI@DaaR$HwF\bHA<R5GSwjEIDWetn$QkDCbV^mN\#NV^CB\#
\5W>KW dV^C\XEI+^EcnnJiR#n:KMB+lITnnNebLljKiJ*le1GM%^piHXB?$lt=Gak<Fm<JD\>uKYS+VpV<adW<
>htJSQ pEaq$PCPp<wH\9qMlGl<IG#MSC1SD+V6kWkF?EE1d#\@HwV6k9mnFyF+b@4IBLkMj%TdWbCImJQ=RCwb
AJ$Kyd B^Aw+$EKdMBERACEiCMmQlCPp\V\k+n4D=>KFLk>IJL++$S5neRZJ&IuSDKND+R6pEkt<wPIS^VAD=J+
19SKk9 Vq=<IMkd8QCBMD5b+kjJ9EENH$nlPjGMB!pI$ZnqAYVYSkSw@CCTVIkjyQBenMcDeB6J@NFPjRiSpPQV
LJy$wG DmBZPBJJIB>IReSy@CDAt%9\kZAtk@^^\tbIBAF?EEptu#nmu$&pCIC\PIW9V8RcNCKX^A@CbpMF?WEc
yaTF6b #+h#HIke<mhT!j\kpZi%Il@+#SYSD!V^9C9=RNkacAS?EC+nGyEjJQNGiH\klihu!khTabDED<JhFaE9
haHuJQ tenF9kCBQ=qEI5?QeBREESApI$VE<TCEHJ\GjyVSKAnuPkCT?ECpM/WIkBTiA@a+pA^SiB/#+$G+CkI@
IhIcqi ?kEEJBFweA$GAJAjlNMPCITp<c:5HA@Cbkn<cFm?k*BIpD<plI\E?EMmi9:w#4/DMQ8Qpeb*EI+VI9CB
+cD1A! 5BWDEHEeTCVAiRqAID>I+4$k^RjC:BCbH/V!duQnA^F&Kl?I1EVlB^GXKDS?EGcuE9lBCAhR?bXH!wkK
XaFYuj <IF\9RTwyQEkey5wRPRnRuwaAPAQma!hAAI@CK5EEQqBPE/An^$^daDCq$9I\ZTA!Jh&Eq#tAHF<%kHI
+HajjN >eRAhZ^^AIlLQApTAJH4Imn<IJX*l<S+EBq8pjuFacMqpTF?pAcDbD+RNqwTtb<I8VCK4+\A^GtP^FhG
#?&AiW APINS?I4I\B^e!Q^qSGA?K?SBNKPiQ=T?jYEVb6E=heVNt$TqX>Q8D<mWjp#BK=eJC1NH+SVSPNQEX\J
H*P<:L TDT?FJFlIwAG<aN\ScD^EbHlDCaS?EPTEc>kMn<Ib\lSAKV!jD4+RB4QVYW<CN5<me>waSAbuQM4D%hB
KcnWu4 Ey@SA5nWlMSZERBpipIC?eYymE8QkDnI8@/TD+S+#n><IJ^&pD?beQtR?Jw%kDedIjCJW=DTlQnTV8FN
@uRM#P h9nmSIdYJJIACQC888aDpepIH#5X<h\tpjlBC5@FlA?EqTj^FVEXdkAAGy?iXCV4!Q^^IqiapQu!p\1u
VtwIk! mEVt!*pcEZGB=!6mG9DNt=<QyQCecu+GaWpK:<y5QyDK8@N$QElEYl8ID!RlKlH+RF/d#B<T5TY?6k+G
RVD<CA EdQlC+pM*\AKu$4IwA!k<IhE4qwA?hlJ!K$pEIpjJQJ8/B+HIui9A\CjT5nF!kCjjbIRQ$1AZ$>pG+SE
:tSEP5 ++5VeWkmEecZERp=4pem$jlBPPTQ4l!CRakKF\>I+Mhw8G?9Lj!EIV6jBBwjB5?\^>au9tPIN!YSD+N\
tWwd&\ *%+#?BqDd4+mneiRcj/Q$e<wl5lCjBkbB@=wwpa^Kk+p<1WDRDn+$pFCPQnTAhe^EPBLB%#FRIA9HZCG
$XAqJ4 kkBjPtA4ARG?hIAADkV+$kG*TmDAq\/+jEGAL^$k\58ZDtVFAiBLB+S\<KWDYipl<cWDiZ/V^JeP8LMG
QS/uJF TZ#yRNa\TH#yRFa^TH#yRNa^TH#yICMejPpkI^^</TDVeCCJL^&IF!/JL^$W^I?aL^*\5ApE?hJBIiNA
#bB9+5 pC<h<BkPBQuTAVeEIMmZDm1AA$G?hFASD4=$\K$K!F>u+KaTBQuTAZehIMmZD4kVB!G?hNCR??u+$kEQ
5@HjYp *$CIL^%\6\=CjPtAY$$R+p5HnaaDwjHywMG6ARmS?VA+V!EKH+b\WQp\lIQGl%F^IHq<PtlIi$At<tF\
uhuV=$ &5kAH\d#pu>PB+TMXEHC#!yDIK@F?c/^B+Au<ycyAN#aeG$MA*FnA:M^nI!nC5lTeYPD4i<aZMZHlqXn
BIA&9A GICn<ZQAXbjG#\FZW^w@B%\qcj\e!HISkb<E4t6EAn<LZLGIBH+c=N!$RD+k1$&EeWSI1a&NiWehTPG8
qB!S6> CcL^:pEeB*?:kbW+b5Ln4nknRkRBGFtGHDQRee/y^LHieJ!uLbHCV<q#LCiP%bB^u69E5Ww!#nYcPDaX
*diHVB Hue9GHF5&9#VNR:I?kApCJN=%>/P\n<:QkJn>9eVnK^hR\I\$8iQ#VDG*TwAnDYaQ<GIQ!uIB@Q8MCGN
Km6HM+ hbW@\enAtmkA\\$YCiDZG/DB:S1JJkknk?aj69D>AlIC=h6NjZ\\e95XRCIK\GTA=<QQB!QhE$AtCMJp
chpCXY =F\EQ+#5dbB?tA@Ek?GlA>!W@Tm#MSS8cH+W<BkKN><@VGwMlS8k5dHaD^S8k5ct=&MwuJ*k&DV9B\4m
&mCY%W RK1AD4ABk%RBNunIAFIF&GC4B1pCdAABB>IE&JDYnCdABmCdLkJ5eM5C$kVa+P+iyAt\IS5SBAE&=DID
#IG9p% kkAde9pGRaANNp&IIMAGh>+RRbCNmwPIAt#kN/hyjlVERWRBN4k=kakCdCAT4\AddDeRIMAGIX/=At^\
D1YQwq l\eBAt^\HaMAAVc+YaRAAVdaymGTAB65$lBJkI$M5=EE&PDtDCIJ5MGVawkp\AbZR\kWaPNhdT*ABq5@
L<d^XT BA1\IbeckRJ5mL5@KMBGJiIkTIAN6u+IEtCDP$pIEtCD:S!CBNmRK^EkAVdc6$8L?FE+Z4IAG>\%RtS?
b^AK1# Nl4eN$JpmkAK=\/bJwCCPIlCFECS1<%JAmmeCwG&lAbdNCVRq6CITL#n&TBp>AGP:TGMkSReTCH\k$lV
&iaq%> NLdQC#PMij9C*hlaDjCG?+c^c8aN<m=?G9%A6tm@!@mR<DR<M1?p+y$TYSp=:C#<h^h4VqwCu8HG\Miu
>PEee4 b?Eb:K#5>DSYCy/S^buBRw=:nJuN6^nIMDPitMlt^iFHuWV^w$/mPPIa5\<IB!WTASwX:<yJ!M%m<*c6
yM@i+a S@<dD^B=hM:5:PTe>A^<ID5&N+8VM=QHQ?wPCIMy:NkeQPK*tJ:GVtQubPQnPK!W>AS<VHw?:\Y8u=uk
TyHpI/ jkuEI&i@*BG>k6L^uG>?jL@tGjQp+:&i<qNeAEAAkXFNEee+^@T+tYPKA!JEmQ@bl^/jHb9Fb1j^upn:
wMm8@4 tRRtyiASbau+H!/H9MmShd/^1T+9MAtA^^cnkd>=t<I=@<QdFP=+TiPC\#M8eDS+eEbCF1>5<QFb/cq+
Mij<6y Fl:^\?Pp=&dn9*5&An<MBBGGb=lE&u<kDI+Zl89Y1QA+l%M<+uCK>$MeV4@LIpek9>e+H\lQ^ci^<?A<
wi*LpF TMa:+ECK$B<eeiDa?G@eD$++eG!Sjh\Q#nl\dAk@:keZHEkXGyW4D1RKnewNB+/N*5j>+I+DcWI=QHAk
8Vdt/! VTmHJ\+mCI*KC\eSlEdqnaMIR1Q!\WEEwi4/+mCmWA:j*FS&Fme&G\j?5Q1jj@jDRYQ4E?N?aPAkRGmM
t?V9tH @nkIFKwe<kcyWPWCeSApNK4Atcp^/TtIdlSlQ\jlIElwlME+mCI$\lAeNGa!DD^9F+:/+^P=1+Z&+^Qb
kMA@JB FQ4yp<T:GZL5E%tcyj#+lPAtCQ#^TibhH#V&mT^\@pREn/VH^t*\J*KG++e5e6Qun^?y9IN!*:>w9D5:
cY5<QM 9*>^eD<wPB#e&PAB?iLk^pdI<PeMHQVn^^p+!k@Fb*DkupPI$!%J!DFuJ%aP$8D!*HWV&Nt<y@!?^iPZ
9pYLF& t+Pete9?!h$?KBHyBdJ^=LHSC?IjnZ^@#\m@DHcc\:eVuaJ*ma^:6IjH=<N:&V5+t#%G>4QC?Xu5iC!B
!VY4eF >*Ihq9D6H?SFXnKEnKum5ZKnGAFJK@IQLt$M+=%V+MiRMVkj^q5W=eN+!=@<GDKt+eN+C+:<GFtRk+1$
Vnp+kB BQ\aJBmPSlVkICJHDQk^uu&Q^!DpHBR@lp#J?VA!d?dPl@G5tk<DBZuJpGCipyHhED/Mkl\J+ePw!CI\
-ALZQ$ 000017931cb001202b4 Page 292 of binaries2.zip
Cu&hLj Q+bMT9p\G9IqkEEC/cWSBe8e^y9$<&G<iVa@SlQp+P*V<GG<JTS?nC#I\Y5#?VG1IAi9q9BnNIH!wCG:
RH*q&e Rj\aMp5cn^El5wANETGKRHpR!VRBP!BTmRLqRcV!NwL=MN:&LB@GY*#u^!kEAa^*K#W@SlZWlT!aNunc
5iIdQP I<lBIR91l!!an<eAEmSkR@BInEAT\JB4BRR\GmTAWRZ!AG+pTRLlRIJAumKuV\ABnLjL!a>SKAIaKIRD
+@&=jD FKnueA5GCiRBTBcmC:IZ!+>SAEEPCqYRR$k?k<lmMV>GE&kuAalAlAR^mkAH^D5L^a<J6NpABICCHCTB
N49B*e 8kynbEFiTMB&pXM&A9aCIZ8*@Jlki\4\b9n<GE&kQRDIBJAkmNEEPMmARL5Ga\L6GpDt:h9^ad#NAV/M
$jH6%/ h:MlH<d#Z8QDKKAkl&C@BbBykCAH5w4Il%EINAEPCqG\HqGRR&#<GEuRDmlC$pcBBG&eRkaEhTFVBi!F
ktt9Yk RlY$F\yX$F+wNMG/RCWI>F9I=wJA&1m<<=jnMSyNRD<TQGkABVDi!XE?DAAFMeG^Cw!SARGM6/uIl$EC
Jq/L@8 ?yEIXIF!k?iyAuYGSCRK%HMTETAK\TmCGP?wAn>GE<SAIS!REA=ICAhbCAhbCAhFCAhXCAhXCAhNCAhN
\:hI4V pAMkCHIASKIRVJADPZ\ymAulIAulAIX\kAJ%>h9yKAGMJwkJnniR+!^CMIwkSlZCRSZCRSQpICGu>9k^
BFkT\c *nHt<Smbh<cKD+MARa#uyeiHWTkC>alMJRuBcIIaVcD@JXEISCGaIAhF5M?DMWEPCmCEk!TEk!TEA^VC
/R+&V8 AR4lkIS\pIX\pAZcdHn$RlKC$RR^KmTI$alCMIF&CCVRBNw/pEkRcE>BIqGkHahH4IARnC1IpWBBnLi:
B$/+h= #I<J+aCEeEBCPMlCPClCPClCPKlCPKlCPAVH@CBAIAnB!IIaESDEACJ@@\5QHRZG%CCFJFBZRTwpMF<F
IAMluR 1WL!kCwpD/lC<wA1JA?wR9IAuq<KaQD<WkkttAe$\jaFyAEChRECmAJyk&iDwCDGY/@u\$BIEPP>I<cQ
@wewR! WRR^\VaM^wS\WIS\WIX\WIX\$IS\$AR=+IGEIEapC5EEPWkATRktlIMp5B+BpWCB5VKMWRR^mCREw\qm
Ib#K4\ !E+:Q$aSGLhDJKyAu\JQIRVYjTBIeC\F\h&1RDk!ESVEAIE^K$RtkaIaTBCCpRW^CBCCCiEkC?GkCPGk
ilm$u^ CPGkC8GkC8GkCZJRCARltCAHSdBi\ykkB\WR\pET\pETtB@B6R$RkqEFMWm\uqQIBCGaEA/KEA/KEA/1
X*e!bR EA/cRF<L#?kARa\m5AbFl1eLwAAtPMetp\BRECMSlGBpRa^*pJAjE<IBCiEkC?EkC?GkCPGkCPGkC8Gk
P%Y:\w CiGkCZKABJJA@wFEkdIpk+J&SRbBkd+H:9EE^1h\dSM5N%B\dp1tkwJqTSXeV+R^tmBGkRR^=E!KAEaS
5meDq< ^GlCPGmCHELYcMp$IqEIJ5lBA$lCMCEeJCEewMD<A&qiBDHBPR/M$RR^\VpPQG5WGNQA6XhkHA6dyMC/
R1n8nM Mn^EF:A@iKSMEIKSBVETIATnCtKkEA=ICAeplIM5lIM5JB$WTBCnEkW^t1A8@%hnb<\d^\&EWj?B?\>8
5TBIt: ZJ6DenkeRFBqB$kXICtDFD4yBBk\LMB&=X<jW4GM$:/9mM1H%d*qpy\ql?Vh/pjH==iYmP&=4l6kFdue
54%Y*m :A*6bdEp/$:tJqmRDiEa\lHCMaXnCpeKB@6YP99YtuGcaHR+?>bm\6HR:6Qb6>Iha@:MRE^ew^#E5MYP
HMumT# +&^:Vl?TVVL4bLWIJl^NPJy\hPF\+ZDlGMI^lCPEa^:jH=5N51!CVVBDutG^j5!*L+d%tZ*8@QnP5?Lt
t+ITP? bC*\9=+P^:Dn*H/#IMM/*YbJ%y!5C$eZDlePF++lHCEeIS^VPKb\mGeXGJ66FtVY!C44N=AVNQN?uJQ5
m@@y!1 Fibn*5hYJEE=dJcP#$9Mj^hDnN$5!BBnN$5!^FndZ:pktHCpeCDG&u4LPBqm:GbBllm:tZA$+inC$aZD
54tn@^ lePFa\lHCEeI^^TPKS^J^+wek6Fl%kTn\/y\NPFw\6GFw\8HC<eRnmEeIS\lHFM+WnmTn4$lpI!PcuVW
%191t= cwIJS^PPJl^hPF\+ZDmGeA#lCPGa\nGFI+XD>QMt?9p?<E=&uG<6l9Y*^dD?66pk/%Y\TidCMaSnCEeI
e:D<m= S\nHFI+Wn1TnF#1/HihH6w@:p:Xn*uc#Tac=<&JiBB6pR#mGeIS\eM^XP<hem&HMXb*9^6W>mtB$iK&C
dIjdYL CWe9TVdIQFFHQy\5VLAk\#4ab5KShI^mk6E^nI=SMWbcweREC:Li!N^S=&MaYdRkT:Jp*BkbaFGcaEqt
Cl9a+^ VqdymMd?G=*>N:\&5ppY:F5S:F5^&Tan&i=uab8eX5p1&<65dC>V%PZEQ1nFSF&8Lp$t/uJPJ^N%tcI8
tq6kAN $^ku5%dBGI6V%GYK85\8HKI8e#AYb^VBB6qpuE!5wXp4!M59l4#<byMMiZud?%WTDDup^VlQcRZ4$@8W
KX*4%9 CN4LaptY^4Iq&p8#k9am>4@a*yKAi:dYBE8!:tTP>6J5hLIwkk&!mjdTLNFi&y1<wG^4pF:A5FjN>n/W
mpn6wl C5a<\*>jk*Jp5?Hb%?S#d5@uuA<Mc/::PP$ke?SjY8Qejw&KiT?>aK/:i8@Q6W?:&5j>pqi&/#*1Q@Pa
#9ujHw %?^q@udNZ5b/4/<LeX$V4AntkqZB%L%$\eT>tIu4l4lP*J?ye1T+Vu&iKIiJ<qdqFYW#<R#5eC?&9*ZF
X#yn!9 WPjDA6i%Xq>j6%n@Xa+4N6H?anCYeM@ma6mD6mda%9F=1#pnHp^u#Jpmu5:B8DGDMYItaqM9jJ@*k4*P
69%Ak5 m&Ehi<*aZ?*l&:@h?ju!>ZS#e*4@%/ejq*$1=QV?>!?QV&>j#y:<?jT$j&*8%%HMD*@jQJ^::l$Wq+^L
E=+1>Y H\@*>i\Qq@YYLPjT#8h!8d%bA/\!/*ui*#?8thG<^DnjQa/#qa8Z8L8@8@*uhH6:?9d>:89*=?MwP=Nk
F/:ylP @jV8*ee@jn8>?d>@@\JRT\MEFAACAAkA=E68JaGI1TAXPA\AkHAMACpAAABndGqqduS#L*BueC>6aYM9
8DjlF6 cY=#hGF5dC>JduN$aY^5bZI8e&XlLtJyd8#>bZRe!=w6mycatepYM#M#M#M#M#M#T^a#M%4MF4NppeZM
5yV$Pt #C\>i/&>8@jy:u*GPZi<Z*je6DI!w>KcXbpXmwme<=6jA8ApdJ&eDc!6VS^yuW\MAQ@Zm+C<9LT\pkkn
>nX11i \Z??BM5?ARC\QnW+\Y@<Zuj@#T<GBHDqARDC\kKMAF+AEAAXAQj:SeT@n+EC@dZBekj=D$Ba6t+A=Q?K
cqQbeE \A4@=:jnAj<Hy@AHV@&jqZ><5I*j8<D@/*@:8%wV>#e8%H@k@68#B@=jeQt?EQ#Gdj/>C\LkAEwG#kEq
yR*iA5 AkF<@q/AAb>Qu%e?!H>\=RFRIm4TA9km4kdY@^d*>*tnY9/#W1FYPRqRBkCwRAEAbMHjB?N@u%AYNDRq
uSih=a wQ+Fuj9*!1W5w1:5:P#8DQVZ8@%QcQ>%<hQ>k\jBD>aJmk%tDXumD<l4V&aGMH+Fl5aH=JYqt1wwC\5L
d#%6Rq m\kJ/\MAu%&h8XAHhQajp<P+5en*&kHWl#<JS>$/Hm8Zd!pHXc*<NAjEFywPa?BFwE%M5cpKKV%\wGtc
cA:<@= j8YHNTC>:wTZ5N$KZe/%ecd#nF66@8#P%4w=<@4iIS#@XXL4jw4mm@VSjZpIyY*tRIn$X5c<$>*TY4b?
j1e4CJ &&=?:?8pANXJZ&C?9>qRqQt9MLd*aD&@wnmac#p$W&aEwVN1pi+CYJbBHYWmy\kQySV1ES/8HiNhqLKq
<5PJ>F 5D+KC^m^/^KHWjc891\##CG1NG@pbpuJjR/=Y%^Q&ib9phj9=qqwbk$yE#M4TA6dKSYtV1$6QePp1qp>
9%M^bK B?Th/\I+Nmel+qZy#@qtmVCuYbTn4GR*S6hjFp=4uT/\u66^LSBRq&iupmak14V\iDq#Lm\npw=JGeRX
9cV8il LT>nF8MT6DtwIm4A:T%9VDpQq<8ReS=?SL/\aq\<&/L?Pp9TtR*$MMCd^6LP%d8*m%>+d9<+<cu/61L6
Qjh\kW QGI^8C@=nCB/It:w:Nq%^w8$qM1iZXA?Y*QQ8PRI6h*/W5lctp5J?b\W#I?a8?kDu>+ui=8dXLIh^qH@
e:#Tu< 8b>=\mk8NCybQteeNDNRye1bpZ&5>!cF4p!ej9=M/L#mFPk5T\Rb:WCpShmS&@\L^<dG@bG>6SXXL<qa
Z#NAiw LIj<y\e:\iupZVdm6IJTS#mLBhk5#5<G/D8IV<bV$l+=&AP@a!4bm:\pGk$MGaGK4kqp$ZMZTc:1:mi@
*yM?9Y d*tnRlpS%h@qyN/Hj!:EcW%>%qCC/tZtH\@huZWe=kI*JFlun#KG?6/6j:VGYWTY\L/GcCM@HCijHLeu
hSh9P& i%L4c$c=EF<&K46CR*=S>J$:Q&iJeu8JTItlYMQyTmSAmm:/uH$Lb4jVqB6JH*6YGS9aa6!*Y>K*i<Y?
bE+uiG hDF*ypGVP^jY9Z%9i?RTJIGph$CNw%^NSIKwAWJ&@kaZjGSlt/T:R!^C<#DmI&k=q?Q8TDd?*ht$mJH*
a%JA@9 @1VGE&5qQc1k#kW?:CKdJ<*66jAM8\:duaw*+a^VyFQyT$BPHV>TZ%Iw1tm?/SJ5ZAwMi=GLh#=p?luc
LW$&DZ XMNAjL>EQ+D\VJwkLLV!=p6CQjm<V8A:9Ce9yXCStnjmttLlc5kZ>t^4mInX!L4%>=@Y:kV!iR<\cZTj
WNkXRk KwWWAmHcQAJnPiJP#Q!QWFhuFAV&#kB*+kH$Wd^w>G*nb@qjNF<#Gmm^M*Sy1lCkPt>&j>cZ<R:bqpiw
EpBWjQ B1YnFKmV14#C5E!d&q>pcT9H\i=VHQ\abt5j8m@dW=w=MS@GXtkm11&9H/DHaapBT&<Qmu:GEqJN6E:5
A5=cD9 uTTDB9XQBdeVLVk*J58y6B&MaNBE?cTP/Mh5P#8&FaE%ji<85pCLy:JKXMPM1KkqKjulyPQ1weVWCL@M
e%4K>4 $yBW9<R&%i+1uu=wJBJ>Q9aG!u1t\EMa6E>+MLiE:c6X&n\XuTtMYcN>M?/6+q<=Z+4TFi/S1E*w+Ic5
@Ji@/A qjL=+IVWS1#/mLymM!SDbWI$wH^1?#$nY+t9^9>#5a$b&A8ijMI?6BmyD9SV^>VF%b!LI$XH&?1hKVd<
/ZaLc* tI!ncZ%AaZ5DY$CT8*yeZFa\mL#E5J:jV9P?VEyE=Bhlp:K1a4E@BLAaZpF#yZS%:ld&a6hM61#\X^HX
kKIQjI yy1mXqp1%X5NcXC/QiaF+QqyYZ^k!*qA5epQh#YY=n4:ebYV:>/iZBFipjH&#Si>:hCT%<?9nQehMhlN
X=P*$$ %GKS5G\Z=k=115YLT<4wi@/PP&4dk?VaTRlnh4:Y?k+6ahcQMjqewmW<Yu1jb*+DaQJdun$ybp<CdMXn
Tey>1k wHHPeBYk@cM@<MDjX?I>L<a9&kH&!%WMidt:X1CDm%Fyn/n8V=/:A:5n\tX:kVLBTMp*/5TbJE<aX+=<
#9dLlT =n$&pMj&tMF1Ia$8l@A@RN8HnW#Lj$%i?*\@wDKpmNSw81W!X11cPn:!!cP%?wb^Q=l\c/Xt<%W@Iu6^
8jB^Wb yVRTuHN1lER=y/Pp:TCRtCcyDKV14miQaik$tdyGj@imBQAJ=Ac$/GPKFu+Y*d:Wjq9qjZm1FeimeBXm
5BabC> =MV#Iu11SbkKYh^?Zyck4=!?XlG^ae?MnCTI:SLRuS<:!hnlc:G#QYZ#aGnb5WmnPj@y%4<mQl!+uWLW
1N>wpC #PqHpaW!XSPFDTwm&+R=hF>VM/M#h+XtcaPnV?E1?J\QYXQ8p=/1IjHBqIR@8D:9IbPNwRX6chF&4#CG
AZmL+Z l*!i#@DC@15qMBwLY@#w%Q8he5eX&$KuaSBP5C+a?B9Fbtd+G\#q?kcH=kKI=?B8^$PLC5ELR!=cGIpZ
-AX&Pu 000daf9d429001202b4 Page 293 of binaries2.zip
^Mallh K!Jbujc&EQ@u=p8HB%pQ^4Y=Z=:5^&Mbn<XtDtG6TDdRY%F!G8h<Zd/^KLD%&Lmuqu\DQD6N+l=^V!M@
a1at/5 d1au!KIQj5TTyYHI^6TpncCED>nHXW\\/p6FH<*%nqw4nBLaQc+$u9RemK$YRK!WDB&Vp1KDw9&e@+6T
bV$yB& 6Bj:e/*DHuF=E8J/9*VI$8LXBIIbGQ<VL!hC*Hkny@yyRPYeqw>5*eY/E<=MduF@mypSW6qZ&96d*TML
9$/MN^ 9P1l^!bmmtLV:LX6HCLFJ1<Pqt4C+QGH5a6#WqB9Xc!Gc%Mk8I+*4/WRKwIP=Lnu%i4%k&QZThS?kk9:
ha#jRW MNP>1%eP5GQ4mX!w!=jct#d66JPj&dtBWjeF@Xi/yRI#hTpdPhdW4pp%8t@J\I$:^hLjQ46>@aHK8#8w
/RTRQR ZKRZA4alu8^+&a9BwY@\yQpQVPSlw8t@!p1<%CT<%9/I$CPYhWTSAueuFZbFY&NZB/bM+:?/jPP&MP9X
@yM<Gy TAjmV=\@kH/dV?P<B>4HBWikC\16@ayikn?=54j9FJ#alN\clLu85ptIVpdN*cb!&4GE&cDG?CEqS9qM
1:F85B #Q5q#NQTVmJJH<\Q$RNnT?EtAjnZLm!/CSitXZ#yV&:AhGJQGi$ulZJn8j*4AhF#&H\ND+dM5+DEX>K#
c9pyEe mt+CDaeBcm!JC\6D1KiLKkuD?Q4SZY4!N46*h9tYhISC:l#HmWVaJCj:j6\t\ChpJVFAZ^5AKNn1Gnhe
jLRTA* GYKIMXPja1yVjYm!<%yTd/4YPtt149hiA:P#ZF^1ewqecY1&$q^=uL#:q\uR**P9&Y*D@iY4F!BS84cI
+AkqC9 ^B*I99lW?+ZV@h1l=Eiki!pu/dSHMPp&&<liHj!tuSay$SnIDTH@K1C*!E4lRQVi9E+PINiA<TbeaaMy
RyVjZG *N\$w/\/a$G/dy$p5JBLj=:JC&k=>\twdmq@%:=WjT^cYM?kdwh+t5V?HK8kc!n@&Hd:\G5@qTATRN9V
WnW>Th jwb&ZuS8E6=Q?>tCH*uJ5In!cCykyXl^V>C51!4c@9%wSHDFFRZZJJtB?Shw@DSDtKh++ZCc#1e514li
W$IpwE HGBBa5mbY/BPKaFRID#J56njn=ja\d+CF\Se<Xe6Y!JK\WeEJhnACSFEtBA@p:CGI<n*l8>ZpXMIGhn<
E\$+i/ H1H^\KwEipZFCG&K<ylWQSI/^R9qY?*S^!1ScXm!aDX6<6Gka>E#audaNcSjq8ikRHQ18DTmmJ9$AlX@
n/+Mk! $XBiRQ8b5S\4#5P$QVM<:kNPYpZNiKYH$T4&T>6V5RVi?^AkdlQX6*yaY+a+RFBBtktYq&nla=&Pb4++
#d^QI^ QhpGcu5@j%b&aJauyu8@lwpZd%C>4&$$^J\GinVbPi+tZyme!a!/8jCi*X8W$Fuly8^uMZ14bGEinhJa
8mCLDK >&EX*DMXAnFEMe4JMA#T>$56@8Kb/Kk%H5#GK:jwAM\JcenGAYc?JD$S8G$5>nTpbtc$qmAcJTNyh>Cn
=Hl8i/ bPZGLBZHTGP<VMc*\^+Mc<YVcuB#$wuGcd#BLQ>m\tiX>//&@/Llb8pqXWtWw?H1nEE9pYnPE/9tuXY<
%LKXb$ j4e&=#cZ8%1aC#cSGiAl+hhbML@V!wkp1&E??#d%Bh^p^84uWT$FJjJBC?$V=+FWJR1yai6Yi9+$>^^<
EpSMEy %H9JcYEYdS?qb&Q:bhGhWpy^jcWTacjc:FXj%uLW@Qn4?kLByECP81CaZlyby6KpVZkljL$+ma+mZ6/B
X=LZ?S ?c6DeWJd8Z<em?FdaweX$IhCd#n@n*!Hu#REhYI:Y9LkcPFwYaHy4bltQEaqu8E<k<*%8RG5!IY^?dPm
S$\u*A N\l:49MB$tC@AyAuT&n<$DEm\I%RN:l5/wbcRw!\ajq8jtLi^h<yE!JZYqT=+m8B@!V<wYAn!Ace=ayl
#HuN/V Ec4=yKlJR@hwEi+WcSQ!DHKJqw#\WqFCqkpuAP8aNqkQnkc&I:T1kQC>H:?m<1$=RbYtQ<M!$tiRlp#A
jhXDwq *d+&yENa5y4F5CIk5i@DHM&RiM+Pa/V<8YTFdXy<RFFn*HhXSpPY@&EhkpATntcPNT6#k/N+Y*bVV5:m
@MKEhe 9a8:m@8h:P:&Lp$&A&dIP6NJD@e=nQ>%iw69R$D+!!48I8eb:pNQ1c>QiuuGBudPwBW$$$H8@N44<yZ*
jG:XaS jGb84njDRb1#u%mZ\8hK&5YS*tjEeWNI\djYn1?p*Re$L<#ImX<1lL%e@W!dK/&c1*?RiNGkEjMR:Zat
hKVJPP +\>e==u!H&$ckuJWLhNdw9epbI\NKp^Zt9apa6nHCJT^$aIT^Glaa#a4ZB8+Z&BPD&nHjW>Y/jC>%uSG
tIA6lw >E6G6<u1Acq$wKuTG4?8twM5yR?%puYACZmeEpd8Fq\SC5?M8PRLjY1+P%l&H:*wAj$eDe#NdG<ew8m!
5mk6RN t%Lm+54$6DZWkMqj!Gc!F?5$:4VVhFSb1l*GdK6RWkuC?^mG9%b$kFQnp!^eZtH&iJdd%6S8J\%eQF%*
YwXel^ a4SVZmjE+@w&cVXyGcqehS*4#k9:tdw+@CCFL+&?!MXXcw\=5n%li:TS@n\V6?l\Nq&8C%V=jQN/m8DZ
KbYHw6 5#t<hHu1/ii:we9:5bE#@8d=?1tu9%IBH=>j:8@%*6u>T%LDq!>86<X&4w$/K\^Wmnn/WHK^8ip/c8j=
4Xmb%n h%h4ydY+P5jQm5NY>+?8>Ni@*qn!A\D$ANDjJh*9Clkk^B$lHlGwDNlj+HeX<5>SkJ1\Ie#p#i>:b/Ad
Nh1PHq /Cl?jHGWLIAIIF+ATII<RDHR9&&iZ5aJ*&XPw&=\1ht>a:NVAH\ME$SiH<a!^J?XA/CKCAB\RX4mw@k$
5tNDV6 Rjlwk\XcERH$AYBDJ*yiqKBpS:u!1QER\AEyYBBPyY6kt9:CbWB:X91p:!dp?e/q*>F*+9V^F:9NAL:6
TMkG1b dRZjm!GlSEBFDIBRYC:I@j&4<1B<nyJ<>S&adJ\lSbGAS$?*5wGR#YuTPYK8aH8Vk\>e^5?9L*h:mCA#
G&qe@w D&>lq>+A@lM*!II^Ghn4ERSJy@n1B1tASbHlQk^d\kE!Di\F=WVLm\B$uM*#HHhnp#FVy#FwR8?t<e1Q
9\NI8= i!b\yIS/&y+/%KqVhDmM+ek1\X:HHY^iaTCFaFjS^+b:4=WG!mAM+JD:/&tdR\Y@GQXIlWCM/j*An1p<
9^w189 8+EuEHRl?kD9kaa*5>VlnR^tqQ9$i$C*66u/Rpt**iL/88%<M1L1Yadq+!*pCKmRZm\AP1AtmC6SAlw!
kR=?q9 AARaEVPw\BG1nABau<qHumaF!1N=mdcZ@@:>daB4&yEjHbZYF>^@<LQHu*4q<lA5QhF8pH\GR^pct+DF
C#l*ya aXQNWL=NWSNKS+iFX$u\q6G+8?<:$/i\m+C%AqbNE/\<5iLy!a<^^?X9PMYF^KdwIKw11%PeleBnWCIk
Z8IFl9 wFaiV6WWy4:46@GtEdBSiG=&m!GBHJ!FMi/yYk<Z+Z6EtW<STc$Wj4Yewb&QH&\Hn=?n?*BhZ5<X5<S8
>l9^Vw R*/%JPb>k9akQQ//&#E!PB6:K1RB9n*nin@ES:5?Zk:nyu6P@IPSiq\@TPpu=YF%Y:Zu6\y1thXB$\Rb
8m9#DE !EjcA8q<qTHBTGnjm1KpK/PH@Ym+G/Cd%4P8W*b*W$lL!Rh&mceQDuHYA#QKXP*K!W=/%%QJ%/!AuC&4
K6Bq\G w^yRFM@cTAICD?y@he/R5P#Pn^#+Wp*dYqYYb$Gw=ZBM&@JdCp!?/BjYc9>+:X\>nY!d$8Ej?$FcQ@Zt
j>ZXBb ?E&yLJ$GqK8t1Wc$JqTGF9+pF&<6#:Sb4<9e4uKLu%k&QL#KWF<kPLGjAbqQbESP&@LX:d\Yi@+q%Vi1
Z6aLH5 BP<SdLEaC4q&Aam&cW=!AlBwyRF$&M:N+RqNGTm\\A1m<u5&mK1bWNNTG9WI9a1$Jc%Pi+h988q^9&1>
uMk&S^ wd+Z=ReRJ=tTdet<uTkuK5CPTAhcc5pS*wBVc!8?nd=QTk66m#V#^h+<9b\t:ilCFHLpy=unk:>^1ZhL
ELP+CN 8=m!i:V1h5hkIdt9aF!<#m1Pn4Vc1GXFS>@^IS=a#Gec<F%8nmXd*VkkB!Dck!6h/k6L?59&ARDmj#FS
+45AWc F\A8kM49WkkA5Be^4kEIjAWT^h*Xmq!btHC#A\AYMMc4e/dN64e=yuEh=8*jnL\4>I$\D\=?>!M8T/W%
#%uBXB :ch@@>VK/jlq9tc:jP1EXb@:@<*Zkin?+hea<jYF<YFMIjG=Q#>u<jZbJT5ApG1>\kCJZptAGTmJ%L?\
TRW8!9 chdGJw=PJ1atnmc&SmbPTlw!Sud&HpdAJA%P<E%@&K=+Y%XaPpwAyMHu:#/1RX$PFl4jEkBLaAqABCAm
:nCK&@ I5ICaJ6PAbCt+GTR5IkAYDywjZ8A8y#$Jm^AXqjYSXaXYBQ\BRaABdECDRRQDCRAJAlAAMDACkQAIMA\
HG/l$% IdklwBTknGGladES^SH%WbNSc#HLMRi^V:DjmK1JTPqI?Wq@*$>5kE6!@YK+\RW\AkBP#l:Y@y?j+JIq
m^eaaw &tEkELmtq%\/t#6*RF9@!qt1bLl@Wjt5ZT65lDC=mWEkj%KcRDZ8nLtyJbp6^GJ&>uV&%JZB?<IR#V4E
kS/6M= EG&E?d6kHjbmHjK^nVX&$Q>ZyqHW$eVpj<e$wwV<5?I?<\?tpSpARQL<jjqSj*<M9:?a^tiB%94Hnj4@
Fh#y#> i/d^j9pQHukjYD\wEBk$yIa@kMQ1hRP\@SjVCF*8d1wmImLMLCLMwk<ADBY^wEJ<TBX%ab?\CT81$L#%
<W8D8R %*eI^Bw+TQe9j1h89!kd4q@bEAtmh#+F%=>IRF&?p6R>/9XAkyN/Z&$nLlHlVbn+48w>6iKy=%=>epGR
lXlY/9 %^T9eDLQ#IQFQDl@J8yjVMdV>/k/YjP/<Bt=4@cnnQD6XaT<6CY46Ime6:kCSmqD!h\:%6#uPT%?D=/?
85D^M$ A6Ij^BDFRRXNWM#Dw^DC1VaiJ<+@4!AkXI&?cAB/AtGnF&AepI9X9id$:1Ck?9RDG$I%&V8*eLLYL45K
HMyQ\M u=l$MA6^Sh%iwQ4b=1=\$LhhtL4Q@p$IQn#+9aF+L<b%:AWJa%tnqRYDFacRm\eB1VN%=YlaE>QIZJYG
JIFqt> B591mw8>RG$l=18RlaAZY/p$u/cAPDp*RT5lTKX!p8E8!jFG%j^Z>ytB44EkjT5tX\9p8?*/\54G/mR?
$KlZH? It6XKcB6F9SdcVYTXAJ%^qtMd#BWjjwa5Hc8*l9i&4q6A8ylQVk@><abb59y\ti&MllNWWD<>tJY5:!N
>i4:iG m<*HGVXI4!HpQX1@m^P:&1AmCYG&wC8yLChK8DHNHt^IMYwWqpl4i<i&\CehJN!Mj8k/jpHcZmYnKDbL
?6p4e> k/e\*wZBmTXG5$XKD!NEbiL<WDDVwEw*L@iGy$!mR:5CQ!#Ny9JIwT</G<Mt\ZD&/+CmE@MP>hcG/8Pl
lqG?N& bS:yt*phXdkZ?I+R15q6196t<d=#pk:Qhue*N5NJV!*SHKJJ9%eKL@k#9kJZX\R^6>\/LD%mw5Y@jYP=
^ASC/t IqZSFq4LD5jd949A+X!k=da9^lmX9DL/$>DMZNdc$1w1q$h$qGQE$*G6j5GFPIctVBtQYN1R6&BWq/XJ
%T=W/n m**6%:!eARh:KRu^ypH&EaATCK<jj?h<C&^/KJ/q=FiS*:P4i*q$<BP@9SMnHuQtKl65e+JpMA%5X^!5
9edTXD 199!:Fa58XYM1I=AT<Y9y/M+@ym9FFV$%cX+*YN+:q:GStJy/y\NIEcudubYM$+mk>IA&aR9YEB*h/Zb
<BhNN# l4B<C&/tq4ZhSBdn4KMdq+hR%IEkV+9=p%YKyE*YdwX&J9P5D%GY9tWHB9NH<$JW541H%!dupHetmyeD
KaR%9? C#l1NG4>>J+4PWq5pR<c>A:pBW:jB#$&hLDwlT^ij>T$m^pejJ=pAKPI#e&MRL!<Q&?X=GT>:<y=PnQN
&9GKpn ltSbTN>pY?=d/KCB:6mY>\dMR1Kd>M5Z!TEmc%CakyYmL:EX4DyG!QF!WMZjVP6*5Gl*Kh=d1R#SRK6G
-AtJ9M 00067936bd8001202b4 Page 294 of binaries2.zip
CRdNM+ X=:dudydcaLQ/uhWb^G:9G?$%kWdHyaW4R!@Bw?ehe$*HcY9I#ltpJ6HN!Yq^WnR9Mn!uK@/t<yXM$iw
tM5&9/ 8qIF#6/4PciBY4YjN>YXNe@n>bSmw!Cj+>%B/8MT+Wnya9NQTyk>8X*hAEu*W#n&RI%*$aP*bXN8QVkF
TwZmBN cwK6RkY<*TIbhdPBRhl:BLyZPDEP^edVSaZL!c=jR#waj\tEeb5AW89:w4\b^=/XkI5Y6YbFcH?FP1A1
=NtuV@ /pqpkw5ipJZ6q+hA&^hLm9$%WZEF8/<lDFLSDCTeF#@iKKR?B6W9XJ#\pIDPqAP@1S@@Gw\/w=mjZNe8
1:Iit1 twqVIRLME=JKk+nS*n=\?4Sc?<q=LjAZD=m\W8D&nR^VMq1%Y%BYVR@Y%BZG>:1$BtJqeMycJ9EjK?C!
!\DBSF *%!<%^ubbPQ:yH\mQmPhdi8cY\lMcu8tA9KB\H:8#kJ<9@GJ!M/<G5qamalw#9w<!/q<Yc/8VC1K1q<1
GWI5^4 cp=ieV?NqXJ>JNYE<yD&XMhE#\Q^#<QG+kncZ/YB\B&+Jn5h8Iabm<p?bJ1?TLhMc=HSlGXP6MIaY?#+
^F@5P5 ?VD8GPFNCDSbXLQFhle#F^Mk>E%&XX^mw/d?%:#W+Ku:m#<hnCecmb1n$VIRt5^1$BKPSV4#C/u+ZYH?
MG<Ml@ N!8uaDylMB&e*ZIjSY%\LJtVBiiBMD9FRmV98TdPVW>!c\$K5EnhT9Mjqb&G5FZh%XwX?n?uY$\8c5%E
mwLTV$ q1#bn8CJe=cDBwC1jVl?^b/iY8S@HdE/Smbt!Vu4nTQ?nqNjVqDG6@S4W/9y>jF<BeK6jwTiXeqRJAQX
h>Y>?L Z!tB+cINX^9B4W\\latLuQL$#5>C\yTCya69lmFIjZ+I8nRbmIKReY#yI1lL*Eu:RS>PTJGKa?cZ!<<6
T&u=W? &9Yn!WXX*+^:j#NDPR>T?1Kj$ddaRym=Wc9=d!WM$%?KjbCQZGT^@dw$EA5yXHjDumlZEA\SqL@6upAw
qRblIF BeRMKw+V^J58!aqB^iN4!CwjZX^tp@pNiXh!\tD/\hudZF&lG^ym/iQNyN9/^*P<ZtbVX@CL9N!IF8BN
&@Cy<R 4>YI1IB&n6i4<Y8=Rcm5V8dFdWaI*S*=ZcDAbn:b^t=\FicV6$FDtpk6c!#B^JD9!QYSA%hDH<VLYhkW
&!kDNp \%^jPBA8HLNRkT!q/*pG+/R4c9H/@\Ln+MHIK?AM5@Y+mFy1c8wLhak*bcjVq91bk&ZHe+Iu=Rh6mKiS
DhABHQ JE$L<nX5We!ulA@Cntch&yE*H=4yXb9pd1Cd5a\*/DLJ1WY1yApFdA:%HQh<KpqGRpIu*<?K\<B5LmWE
=FQ/Dj Mq=d=$k*wejXlG>:1jnGdDXytS^NwptP*B6nTiBh@FunA>8F\&mYXNQ:Z4aDLQm6?mhYtXu^p1N*EZJp
IQa*9m juhpdc#Vd5#^a5VDt95nqPtEC6$X$!?!XYcthyAFu>\yMyVFL//tLQP+Wd\1qMLQypC=1NqAwdZZ/BM*
>Ni=XE m@uhjKGeiD5IHYM68#dW/\*Kk<CY6D$NY>@n$NdNP:=hw&i6W>%>!/R$6AS5BHN<\#nWu&JpC*$DZ4Jy
1ylXAZ dkc?94icLp69/JZ$tclDmWXdk@IG9%:nL>4$mJFNb1t:H4VX44AMZJ8VIJkX>^G%Hc@jGF>eIY5wlKet
etYEYt *j8tY:D%CVu?D*J\8&P6lmdLDG8IKi6RA<#PT9Yy!!qVh:H:*E1LjjIB#EbLedH4L*c\WuMJjjL:Z>MX
jhP+\% <N:@uLweH<>BRB/FRaHe$Zyt>D/Qd8G\!u4ImJlCYS#QW?!kap>4Y4+FYNYp!&4B1V6ZyFiunD*KL:1N
R*#MFM 4VXkpIm4T=j&ndZVC>HB/BJIabRDN98p>cNT8Qb6Qh9WH@#>4y:i8#j\Q8Z#DAy%#5C<XwHe<TLmI+N/
+1E@ld Y@YLN:D!I#FGACyXqP:KhBliMVjYVIE8^P4cn8n<>FcBW&Q8jA!Q61D+FBHchpwMpK/IZ9bBIR=h=bGR
R=kbMl PM%L5=QhFKH4Y?6a4pYC8ql6hcl>XKJ^^tAVRTHdiW*n&p+aRl1knGI6ypeeqImY>/Bi?XJKhG466W/G
GM8NG= HTMIMb8d5Z8ZMCE&Q?qG=Ii:bCHK$\tyFZZZA1quabX+b6:Ycy*JNICHCkDW!tkyN5:+GH8lq9RRqc^h
k+qKb8 J=Kc&$+w999mnHb\1H%w%Xk<8@DL%a4Y!>hJ:j\u9$+ic6udi%i@8%yj4MX54&!nt=h8WJ8VNiCFl=:P
:M%F8D H%!&^aV5\ZFS<KRWENCnG$a:wMQEH+l+Z5c#^%&D+BVe$?8?Iccl<BmD:!\!$Ln!ueYQcNNNZlp/KuwJ
Cl5PC@ +@c8N6pI!b<:&wkehq$JkW9dQiBL$c9IMiy!*d4<CC=THHHdY*%VA1eCM<%*enMIib*H!YHVL:En*R/p
y?uX^w W^\J+#u*je<i6hVtG+k%i9N9y9iy1wFPdIQ<YEJEnX:n&:Nd1*Xl<jutYC>1uwnRy6bNnX6nd865K^R@
Le4wE% jbX1JdbjBD&4dTjEh9a55T=VEVlZGdI%aH!tjdLpb+cIG>/th>R%@SwIARi?>\Q4W\<lNMPCCLGeQ11#
?6KLRk /KJPchuT#h6F%=*^DTp^=>j8!pPW@a\mpe?IZNNP%Ww%F>H/dm/!S%kF*5l>mQN%+*\VJ5IL>%Ac?=!<
Al+^wH kk#i#h^$ipWYDR$K/HDNYN!QXRRbIBtW?>Le<4M>NQRwGH+dGm?lAC5?Vb8Y>Gn\k9+FubDCMtqhp#6/
WLYiZG be9#uQ:bI%\=Meb^GZVW8!<%iFLe:^RFnXjel*Z*GW=TR&Q<DVeeQcIX@Rw/41kBemC*hGh9=\jk::@\
4&!I$% +NTaqk$<uitkJqBT=:?6YFcYLu*npcHi=&NKi/jm+!lL<VK6I?Mn9PbJS8XE4$TkcW^bcXjTKE8i\&/#
it+p^J =JPMtRlhdn\pe:+6^=Ck/V#Q&n9qabt\mFI+LXtJMS/8Vil^VJ6VWk:w9ej&uQ!$KS154H4#<WAjP!=n
@?*nQW \+mDpXBSVhR!=:%mh/RDRdidQc%b>4BuL1:mR=@\KC>hdD5teFh/Pd%L/yl%K:celVG6h>pJ/SCnPBpE
8Z\m&S <6d=WTqDabKTWWJZ:RycuHYHN61&Wu=6ye+Y>+m#WG$PySwtPWkR4uKJ?61pIB/9ZdIXSAM:SD#w#uBK
kD6Y/P 8DkBy6uWwq5pi4n*SkSGI#$IVCW!/>=$qZDnjGjq+JI?6QYAc:DMpb<\hpuw@8TPeu#*>C=^iH>>R=ac
kC#+h& N#\1uKyu=uQAIEC:^M=GL>tI\Ejw\<$4+w+^h<qNq%^mIJ=n+4ddbSN4eB#p>Zu>Rt$MhWAu+N5=4<y=
QDk5dH <QS&Zc+Y\5cl6t9$djQKmH:+ba^#$F/dDyQu4E@G8?t6i=PQj6i:\qH!1^$jAl<FA6&llR<qR@N!:\JP
\T1GeN VPP<+TRb:heI9t%48CTFyb+R%lqJC9\\$Ky@WHiZ*495W\/hS8tLVVqYZk/>Y@c+AQdjh?^d@#&elS\A
$6<Y?P kED<e\Q8D\6RBAD^k#IDI\L6AI^MQQ$BRFta?e1+AQ!\@Y\8J*$+VnkRMpN><YlCj4elaGhpeRwd\Am\
JHhHjw kDEkGSCjX++jVdAA!\<N/\<MnAyX@N1jlC<JA$T8>XK<\=X?h554eIFW>yQEW5LTFmiDjkp$#$5upGqQ
BB!jpc /+#E?yYn8Bj!T\t$8#>A=iem>QkVWAi:6H+<#1R<A%VdFmVlB?hR=?WMGFK8p8NR\WbNpqm5tK5mI!aS
&%A1TD C6NyllBuAQE!C1IV/anX%E5B<W^>P\E4NqtGLlR1+ESebeAdqWWidm*PV@elAS#:8Y8$c=B$twt5Mi*d
&m4A4m /iI6D?iHIDGtZc*H+XCDiF8w%%H^+5?pq+T#=<YLmnT^p<Rlh\ltLI<dDFQMqnS8Zmu6?iXd:QTyq/q6
Vq@1dH e#Hm<iCA!wiAkyj4^6#k5R>ne:+D<*m^w\nPRFkCVAFMWHDGK>6JZ?>h1i8y85b5Xy!Qy64*l1HHMc8E
ij:a6= ulW5nC??hu5Q=+h<Y9k1pEYdi<atAGD>VYW\/S=aN681yM##1DZiI@/8le:<K&a#:cWu!lFk4?u:h!F$
wj%tIY ZcR&TGM9:1jl4*S?A@LjAi!@:=<Fj6?8R!IB/>FDk1L!w?aBANIE@wS5CLtC@qACyVNA<nw5#1LL6pQZ
5k!T>Y JAB<EEEAH!P1wRBih^/VyZ1pMqk<eic%JTNaHnCRM#Q\!RCSTt$<uWA$DN#d??F:hTNDtbXe%+kwI:R^
nD*Tue >d!MpEl?DGKD#Ph%?RB%RwBNSXBbQZ>R6dbXnAH6?t!QH*!i=86cb?yJ:keBpA6d\BkcKK5^W>QV9Kmd
BRHi5N X*jVFD*9EyE>R/=G6*nFuLl/C9hit/%B*8SJR*TlkXiCu>/^AiX*CHePXGSSW?LMm8RPeTMt8$PuWK&R
JedC9B mT1CGn5$RAS+k%dCWtWc<<qB#$wm4Lnyb@P6=pm1?KLT\#p=/iY\y4CS++EL?Kj6HpPKDVXn#c&9<<Jt
mlc!&u c5\l568^5a\MM<t1n<jetw:i+u&qW1^FTn@ljkSjdJhuw8qn#<WpX#&ya:8p4emIdH6:w%QN&+FXR8*&
1?NI+J y>:%>5<hATjL?>hQ6&FRNCkWhZ%=KMCMWEqHR%8\TDWACjnVGCKcB4=BAyVk&*VQipdZytb#XRMqA$A1
BBJu#h QYMmH6wb\pi@4WlTkPed%8dlWWERE#8lFejTl&pn=8Sq+16Vda#\<P:=#>YyFpK&>Hpu:WNj*I5a6Yyt
L@+plh wpZ%E:=Ja%Y=*aTh/Vpmj&GaB<BVE9=*MEF=@8u48PCLq@cZH8@Rm@5hd%ynu!DbS9ZK>pVVLc8iE%&>
8b!HtD qnq*N=eY95p@DA+RA8D**@49plAAELcimRIajRWC\?%u5=G$@H%<k&%\nMcwM*!IbWuH=i#?tydlE%dL
Qqkjt= ?k<B6<PwSGH6TG\mV<K5!tSQw1+9CTeyJW%qIt=C^mlJ\WBMTj?j:NK@ah:p@<G<Mj@=HAapMmL1wtKM
kj<*Qw YkVtqw41C9TWN1cM=mKCGq4EbCd<n8a!>A+1EuBWCmT5wk:TLCV!^GSK=k1mWtTTD6bM^CaPNPICw8IE
*E*PyG \kVW^AJEnlJTBELTNITK=AcmRna&tyJTEk+tMtJcqMbceKL5yE#K#CaGHAVTpqImnydC@Jw5^9cW56aT
dpLna> yIANAA\!AB/ABwRFkAXAA$CkeIDEJMIn#/<ACQBAPEC+ADlweMe+hYdT@+Yle*!8C\MB^>Y%e#%i\@PH
Mu/l:Q @>j8E4yn4nXetT?%cQQEaG^pl>uiYeMpSZ$B!%hY^uYHLYD?d^IP=1@LyGnmdGBl@i>JPK!Jj%cK%9+t
HYjaP4 +Zk+ARAMZ\AA6P#*%@HnL^L8&yQ8>$4:j$@C6Z:<\aN+l/kBe\P:l*u#B:R%@nIGaH\Fl5KQB/T=8c1w
K!H\*y mAkLC#PLmAIAu#+MHHlYP5?G*CK$c5apdMAa$S/QCHMIk\%6Z::&6RtWdH^tVwFPwc+/uF@qknBK9VN=
V8TL=h 8+ENnM*BQC#BkyhwGppjb%CN\^$6qMt!yjwpMcdktkkwl+T8y6mhy?qaL\YJ/cpTE>>>NpMtdpd+dLWV
qA=XIu eaPyEXPMj@Ih>Bl@QNhjdDAJVH%QNBP@!dD&ncuNVYdb^ceuJjqCc4%1^1DkHnNZ#ySCkAlPqb^4k!Yn
&X4AJd VKGIb5PGT*nKYZ%W4#GQ?K8KN6ajA*@ym*hNy%e!SInSR*KbdKLFy#<V!K85\<kK5+85>5:YYTE^XEAR
@ST#>b l@5R4F64PVANj<u?D^FhFCu<^ZM%!S^5lbbqRwptK@1u<h4V4<jTbGQP%SRSt:S>HV9i?mWlDPDn!XR9
wE*Xu8 jS\h96dFKKa8%J54?:5TC5Jb#RLttp:S*VWTl#CuDYay\RjpH81X6PQdwV$J%TB>T@h?:6iE&qc^1^w1
b=@Cit c^V?@XjA4^HZqZKN9eTq46bjG6=!&eXLku^dI4@i1LBG9SRNTSu5dQt#+GKyNw@AYy^C\ILN@YKuVS@>
-AAIch 00084db09f2001202b4 Page 295 of binaries2.zip
YBXhcb <m9ti*DkLS5&@9&+?>Jw<*\VnEkHSRYPwChI4Iu&IDnj:L&I4a8HXQbKjYh$aW^G$nh8#CedHD=T\/?<
hyaGXj G/QZqR9^Zt>/8k*&\\BDLW$#9LeuP41%Y<m#iFYcW%<Z#h56I/5:pwXeJ%XC?$#Y51:VJ:9yL?N%ijM=
S&d&pZ mTMTiK@q:K$PRNbPtyP%kECR*cIADVVFB#qePlCBIV^!5T/GTAL8p&FdD>k6hb&dJVw$:8KhcDQRqM<m
uA9l^! Vptt&>WN#\pSbkJeDZS#eYmYGkR>DJA:5pabyuyBP:5ReF4diw4\X&JnED>aqP?^EHhe4S46F%KmqA!G
j$6AtT /X<M4#np\p5w+NF>W5ZiJELZcKnTJlmS14hjF$ZGZDC\>DN!4F^cI$iVRp<K?cq!4$cdq+V&^b+c^St9
**/RP# RW*NKbRQ=jAt>wJ:mJdlywpT^hQJ+/>8iuRmbeJWP:CXA<4:%LGb<HN&$M=:5\mj6ZbMTkY5/:pqmdI#
AEMI16 +?TqRd/HnTp%6iLay6#%dPLG\uGR/NAi1WalBMFiFL@!n/ED6*bbDL1CSVXdEGwu\C1VVD@HK&5Yn>^J
w:?4jE JC^kJkSlRe=P+QS1@?kiw9A^XBFeu?$NT4W$%mSG^XLqS&KpdhL@jyBT?C6KJ=V%&%KSSZ>R#ZI!C5eq
uA=Z&u 6^FKm/R9?wHH1CKIdYNVPZ6L!868P^hqKm4%e?STtClEBjqX\c&ikIc@pwLDL9u^*wVKh/1hcB9y4PN>
W/#N9A K8ZbL+$KG8!\Q=Y>ykRbX4l:mtpEVYl6KqkyW!ehpqWQ^TAbA#jBX>#/yyXW\*Sa?a@uFe58TVqCD+SZ
\WY$@K @ZGa+:^4&8>MnNWKTGMadu#ReCA<Mi&/KEe<8CywnTjEMT>M^EMDPNdw!*Q4N%bi*yT!jIY#YNkC4t^\
Ge%i1c :<I>9nQ5n+<4apDmSJGPq4q68Rhc&:/@^BwXHmhJbA9RnMPutykHW+BbDcmJZIDap\bABYmG4%N?e$w>
LMDjdJ wn4ZYI1tcAC4wRF$HTH&jnGmCD5XSV?h$8<YiaT5bEb^YV!\9YATAWK@<QV/9lL+1aPi^S^iQW/E@?N+
Tew$mS TSFheh%b8H@NMDSFZdlDBV1KaC6\q>dtJ&Yy&DB<?w<+SPtR8T<KIb^&u*mhaI/S$epFnpRdYT:=jk!a
KhkRFP ulCKqEaI@diTPhGkR>R%iT*wVCmKdT\qXKYSd4EG:u+bkcepwCPp!9^bHMTd5FZu+?XHa=Qa!^Id@Zya
Iq&GIl h#lFaZlka>^GBM>>yN=A1HFBnIjB\5/:bZltnB%#EElV*$Y?KThGt*Qi!XF&DCNWw!=#<aah6YB<XFm9
udeqLT 9EiVttj\H9yKHZ>LkSBY^F1B5ct&Ahc&AYq5eS>\EYM^V!Y/@ZJ^#Y*EyYSayF!I@DwbASbpcKq:e^$l
BHjN$e IMJ4K#Xw5udMT<1p\P8*%du*/tVq@DGCT=>4^W*lXXAm:8Q%KW56YCuy56C?yYNY9\wX4+8wAC><Y\Qt
qAJW&P \Ci8+^!weX>uDij$qLJPJQ8<1dHb8Iqt+GSa4<>qpQV!VM*8pIL!j8hK!p1C>@/Mk?L:6qt#c9lXu</I
@EI?=n !PC>$NiXFP?#ta:%K>a4N9K4+EIXPZY<Ndt%$%tbZ/6$dMkTtWF/@%t/NW@QdaDl:wA%B*XIqb9W=nHB
Rjan<6 mD9YcaQLqucqMuM#P@T!+XuCtc8%6*ZJtV*:jkJNQBqBw&5ny5I4B+1LCbF^yK8dwBJMeYXIjEH5C5LJ
Xe4HPF k*CKGd4a1JhqR/5E=c#^qhWN8n@XkQ^B<56w!XT^M5iB+CRF:HK?y8P%5MpR<@4RZPXZW=WmjB\B$CC8
k4H?cS 86JDluByPi?LhWiup4+EGaJLljDN5/&jmj6aS4AGd/wh8Cww=C!=&WX&k\+KquqW$Fp5\ENcNA!Ma%k8
h#hY1W d<=J$DXa@R1=Q?hKHb4=%THeTAT^F!$Zm>4X6G</$N:kdLIIw^6i8@%uq4@RBNNQBk6yPl=Z9@jC*>iK
\$Z:6^ +bE%1+=#qi=9u\++VDdZFl%1J1=Q>4G?bAnE:#*eu1YJ4t1bW%S:Z>Z!BX&<Le&A6V^R@wJjwam5+>dD
%W8m%H Lc6!&1QGBT/KcK8Lik#mahmeQmBJwW:A4&nIu*LeIWP/5K#><VR&V<PXAF6!Z5uBMyyQpM:1uWH9?59J
SpZieD /Pjb6^<S48TpjYYNc?hde*Y1i\d4&INSc$HMwF8%HL#>Y\$<DMBQtNYA?uB%PkZPq=?TuBBVbypEAYu!
Me^#6^ w/emJb!&unu^uDb9X/:BHlFhNZJM#5JqXVQiT!?MwtW5EwptW@TB:$1/%ju#YEE6eFX?Jn4\>!lHa5%6
c!+/h8 JW+T*pH9Ey>Xa?nhK4yWJcwLbVnpLVkhu$Eni#%QXS>CGib^GDjjYcwYGHX%qmV55lqZXFI5W<&PYby/
@FRPyS &W^X5D5*dWq:VH@aH/DRuWA1!LcFV6\*H=<>q4c/!X5ae@A:j&lE*d&456#MNibytAFyled1nNlh$u<F
kV$4kL Vta6=G=BMTncw%1XD/GmYWHpC5Tyu\QVl:9$Dn=G+L1PLy5IXNqG9d%&@NEFVM\YBE+V:a^ZqJP$1A6W
^ETI?> Q>1Q\*iY1Nc@hQjcBk!w5+>N^BF!\Y+Yn<LD>A+hAeY$Q>/4@jy6=at<Jc1V*c::VwkGIaAmC$lI%H>k
$TI#+J <nHQj<+E%ECNJC?B$P<I!pea4#B=iT5S6tluQBWj%a6ImdGw8V6A8<GRHJ=+4dXPF?Dw\FRY!qV8@DAG
qj\VwQ hKSH59QGZ6+kY=X<%l%&6*mRPu4pV=n++ctIH#Ib\e!8Q#kC95jBm?<8VhP>PJ4ZZ8mWMI=BY!jX%DV>
A@+hRj I+jEAC/\YRENmRdbXQC8PL4IB%Z5=#*4!ZXF#JWhJi:/yqP:Be#!Wk<q#6DnZH!ujaHL$e\$#KjjStbH
piu^yw $qLWp#P9w9H:dTi8%caP96+lS>C>GAY?W:tkc6Ry/P!H/&%#81q<M+*nLuF6A*?8Aa<E^nH#tC5*MLwt
LiEQ*i y*mlT@1&M<LLD%I5YkcX@ljTn8pK&wmw&5&8L!k11pER5m>6GGG#RBiYaH#&p&bWpF\ntTpZdSY=\KcZ
^J=Q!: IHWEnXJuRBj$iSR48j^&e>ISiSwR+HSYTG>&?9IDlPiGX5Vk/Ci@aw?IEEZKcb^^<P#nXG%1*mjBdb\4
1!!5=Y ?&1G4SQdn*%w?CQZSKL>%?>yH9#em9VYH^9EI:M9$m6baYQ4c4??#>W1X?6$W/#bHMmHtN=LN@EiV\51
XB\bc/ mNQ$$aRcA*Au4Y/6<edFiy1/&X!AAHk5\ph$q/Tuc6Lt*tV6QXI^/$RkSZA#$nhALkn/^Iku<hY*^nYp
T!\?Rn CWG8Y!:E/$byt958+%#$4DCjFHwh?J\%=+qJNI$Ijna6m*A84*XVhc?am%MHqnAatVD#Hejnp*A$\w>+
<4lSpL ?Sma511=9n=c$cM%HVwQe<P4ikJK?Ti99EbRN/@iNaTmd5?GY9VbZ$=:P!Ik#NWR%B5!^=j&+yjt1L9d
ljK?IE V51WV$XWMLbXB?>WQG$9nDDBS*kmL*t?8S!kmK\ZYD<cR?E>=EVy!uSq<%t@E\>Cu*nqSTDApa:qHBm8
dCNZ## RM:eB%Y%=A>MMe/>p6X!69*wGdZQ%CePP>?k/%cMIQQ6\4CdhthE5APQ!*6^>NFqN>VA/*KdS:@LYG<%
49e6!: Ztp:/@&E4CAFcQ@l!Z8:^uXZll!!D6YutQL?D1LXcK1&?peR4a&X/qKVT=Vtu!Dc^ejBlu?=4VD?1%!R
llWPIY %N8PiRVmtGkT>>RG$iuVTy#JXm&&FahyXM^KdDqh15tIqSCFKAQn*6aIXjL=waD1VbZnt/eR1e>HEAbh
K$%&5R tqMVZBw8!$8aBVbRmAhT6F%HGGX6pyMET:pFj5Al$S8WB1eGekiZIQKh:S=c%Qed^lW\R$X!IQ5pJuK/
YbdS=T ebS%+keahiGB@cdG6A1?yLS:j:XKcF><H1WyYV%yFd@FECmjVn/N%lDPTW%/MIhqHph+/at9MAP:nD!8
Ncm\d\ Th=5du\edb@VAe*6DNGmyphKiYZ!dcT8T+18IL$Te!a@!!qCepb4E+^H96qHym/CQl>w1QpMqmjVNJyt
HWRtq? FIP+pcjmWS?<y%bT6iGF$9^kt&\$9bTTceD!CmQAZ\8nnR>>F+K1*em4Xp1#=yhAqK\uF@NK=Z^tWL9t
bF\#j$ L8Qnp=CTVhW+M=$IZb*&8L:@M81/w/l@eh9SMG=n5Q=SQ!5Nb5naYb=RX6Z5Cyq^cCjVD*\nkSnRuWWc
@q+wR^ %bDSC+!uQ6Z6dZnHDnyDBX5k%NaK1&\\HqaBN*iqK>m$N/SMDYecV^&AyjbD^iLBt5&ntNt^a$jFpRXy
cc6tn5 pWVb$/h@cZWeDEwS$MpwS>iwb+4^IDJ!M?E?HjY9iSbP<EH^hCKa>JT>6pE$HEjBPVJ4^NZ5T>chBYFd
$JGVSu *%><+C^/uRpZ1W!w!:A#1@b1*q649@cPL><ehW?J=+%dZGDd?BAWC&il^#C:6FK?Qe1VcKE%Yb*nPMRS
>kXN\m i%PSG<PE181iS:b^:E!t%>i5E9+16SchEat?wJ=bLL&H#E4tJT%6yttG5/YPdi+:GhS4dS#pR#IhMy!G
cWK:qG DiW4yyuXjc&Yld\$Sw^P55^Pee?QDZJWY6+&1Flt<YLCpNnkVuDECIu+ieuBk5i&Chbu1R6uM/JVwb&D
NV:*hX PqENy8iJ>K%cJYAYcY&T!dVLn@6m1$VHW::q=bqIDF#Tq!dWValhI%SkZS\GH=%llaPX++pq@n\IQZP*
lpQWNC G$+K@?:yScKmF1bQI$BQe>=5J\=iG&i:ZJi?DV&5t<J!ide^LW4yPnMqP9W?ukWD4XnTJ$LV#uI&M8iI
V*%HXA wC5uM:FKMT6yPa%!pGlI8p*6&MwkW!?JRTSm<IenX=Nqp44X^\9F+p:w>Qda$<ie/*R\CcZPI+u+$Cm\
hk\ylE KyBm:8F%Yd%EB/nw^NdcVNuKN=4u#e\*N<MEa$c$BR1<qRpD/+SkRYcBV6FnFVQk!ATqihJwmPeDldS=
&8J$!R iA5!EqD&y*qD6auMWa+\>u*8#uA?k!#uJa+BS@6w!k$H=J!9pbbHA5qNGG:AKh$8>plpXiTaW\1jC@Eq
%d=<$# iZ1JCnwRB$JbB8#6$pJT:PETy^pBQ^$R:^I%D=E<=k*tXIlLA<SWeA<1ND>Z^wTk$^+Z#m%>!HIW$hM6
LuRySt /YTFTER1pyIX:\nc5N6GFTIb=Qni6Z@pcS9Fi5aMXbR\uB^P^d4pBMmSD#?uBpTTQ<P+D:I+*1RbqmZj
*tWTnk :&8aq\&?PqlP&+6EK\^t=wYC4uG@9SQj*h:eQu8MH6:e^yFb&FKjAb&T=w>LZm58Vtm5TuFVGSEa<mp5
nyCn^h F@MFCi=yD8X*yT>H6&%8d#N>^nKQqCnuGNiWZM/tNe\*QJmji++!\LFDLq^?Ttuj#&1@CW8!LXKWpbDW
FBZ4M6 yIe!TnyhJJ8\:?>LDHC/yhD@w8tWpkHPGq485c8u*CEey@CMD/FBW&T\T:&Y$YGQhl=ne5dRMN5hn/>p
PK!tQ1 GD*nG#&J<>Qb#a&kK6K8iENuWDaMN/pcRt#LVA:tID?lBcYQGMmqw&B^hK\XQc^*&+yd^V?jEntP5Y@B
ci%?Eu tdXMZ6YM&q#Z!i8a#V=i@>cmZ@^=9X%aI/yFa/#G+Zu@XydI86HlqSe1lyMXwy/<X5wJ=M^\KeXNIENa
hqn&kh 4@KLFmM\M?u11:qF&YebF=yZ>^Xe4l^h<<#>1$?L><et%?#%<Z:H$6#$LJ@L/8*>^$h?L\t#\iu>#e5:
X:bTK! 9hj6//jiW6\Zap$$@DA\8H>G<*46ak$^bJ%/Lc+8\dQ$^%4ndk?#A\D5#lD\j\L\i9?4K^dkVIRIAEC!
:NZ51q @:HuQmMV#kD\bi&BkIH\A\GJABXIMQn6RK9EIN%J$*+M*bYQ=c:ueQ^qIaAqLJCNQGALH\ApCkD9Fe9V
lNmVkk B!y5QAI8A\AM\eH^\\CALMAEAFCl6IwI<PX5JhBEBAIm#+MElRRER?RDA\M*Kt*a+JQ#I%y%?$5jMCc>
-A!Xj/ 00008621805001202b4 Page 296 of binaries2.zip
m%Gm4b Q9unTHRj6mqikEW:t8$ARTL#lS@S\?S$:1/dm=QZ#Td6E:cHFPABIRIB\@N*QASi<RiDNMm\eB@YRiu:
^d8&qt dqPmRwIqtA^Sy%?wc&CC\5/$/W+@hp<&dq>Y6XEGJJTleCSGw\tL/6Be?IP=*@\A+W5Z@pJdCij%cuPd
@P#Ty6 ha$DKCPVJ/$h\i++cDAZTXK4XS$ChbGm6Yy9LDEX/j1W:RLbnad!u&=N%Z&>:qmcEZ=MSJ1&ZnwKu@#M
BwKNTe IS8t5VwJd$>Lm^JGXidAjn\hCt9liQyWy>8hjtm@9p:Q>jY#l?y@Gt1:@9!YtmAn+h9Vwj6??@Eb6wJS
66uPHq &*QI>#nZ>Q#=JP5mE1yw@FKTR!kF%Q%c8JY6TQ=Dm5p#61tbQ+8Y<*\q@hXyP9dhQ6Z6A=Vch9d##C\q
i1&tk= K#\ae6^+@uplmE5KeqW989FI%L<dCk\b#u<bK<HH*R&<StSyh!YP@uIiGIT*WF/JN5klSZ4$@q9+4BQJ
4P+4>: lSGQ\K/KVjmBcJQ1V/hKWC?Sn6Y*6pYhn=dVnBK4Yy:\ZB:He:@c1w*wy:Y$$$j@/%$Xa9Z84wwmc=R1
BMH8Ml WanJu/b:41IQu%qLL%:*8^/XVKehl5uGIjjQhZya<*C9Z:aM=!iT8/5Y9R=Li#a!Vt6FQ:b\#/i<%:Ya
eT#VV> D6=6%ljQJa\p%=Qpiu1JTIFbG*Md6Ry/lyCCDiX?NyY%c8E9yARL/JYPw=yMqeQ1NiwTLGq?DeqPQ/<5
eKeuW1 9ZZVjc^?u&:B&1@mtw5*<!ByWDC$54:W*w#A:uIyT?K?6EHl<hF>P=%Q++yS15Y:>jqk/Z:@?KIwki<j
NS&+8C nmmPCBnAA+uZJm$Rl9L*%piQA8*<XV^il<VLN#\l%HpnDn\^lwEJPV%mD15DmA!wCdwB%1u=5NhIJ*%V
CMj<tK nBF\+e@QR%HD8*eqkWpbF&AbL>tW!QhIb:V4jwq@?DTQ4W\WJ&bd#Aeu+M?m<K&mL4HCKp8u5B@FC9Fj
wd=G>n TGY>n!*4dRmW9\ljYJ<+qTKiZ9Li\%!lY>m6hhY4Sk^8#%aa>=c1juWVhpTcQK^I=!1t8#=XmQQ>4HuZ
qQe%K! @Z#tIYkb#6ZRJI=>t4+<1qauq\Ya%eGiitS&dP^y^pT@j1^?bDja?VY*:h+?95p##>8N?#=ntlcBaKmb
5yAK^T VMy1M#yy/ChBmyJkahqHZ!+EAE:XjL?l1WSF1@uS<DBCT:1<i$=+ZT1/nDFi#?b&dYR/mLAwTG<1!44w
4*=XW6 &+=Y5GH*/tBZGy+lNdJ1J=cHd@\nTu4H&ItQ@Z:%&@4<FEnqNP=lm#kL@5EHJ9uydywiui1dA@GW+\u5
VuGh>H EBJL4N68epY&<Kk=\dyLERh&P^cnVEiF%/Pn@@15:*%?h&$kEAEuwawSCnA5eRyYiMIV4cC*R?Z=buPu
Xn^eT< qhKJ#l8GNNeFVLZpu#Bykn>l$t8IZp:+QG=Vc%%kcQ:+J=pdFa:yp\KYMt/:C/@Gdpc>MiK$h?TV*diu
<$KTYm #e8h*V>y*5IV^dn9P#h4VCZ\mPiqS*T>QQh$DK@*j4+M?\!6*?4J&H$*!4^Rhh9Xj9N?i%y!K<i*=q/P
hqhN/* j59iQ^neMP4k/Ju1Pc:=WDGa=5$IJYLJ*Mi^@a$&YS\TZh9G\LJA16F!!ya@<Pw^Q\kAlkiM?j\AI1BW
A#GqJk 9\IFAPH@ajGBEABCAI*jyVAAMLw@ekm+@kyEm48dQd:e9Vc#Bdne8Y>j@GWQy^&M@dcJij6NDNhlGG5c
WDYJi% %+^n!69:pGQKKi86<*4ah4*D>iqQ=e<48di%Fa6@^$1D89/l@Suh:B!6/K!NDi!6LR#yZG&e+KTl/N*y
Hn#%JL /cZlmI^NVC%5Vj=Xm9kjFS8V9^WdH5+!I*N<J^MujEw/jGqlAZp>JTE=iSE>RREqETk=YSFyEXWSBmWX
+MnY<a RYXFESFGPDk/Tu^VP$h<G#6nC%MLI\NuC#6dJ*^HADWmABbmBS+ImBaAA+CCbkAA=\HZk+PDRpH1R%wl
G^\>cI ACMkIR$kVcD$wa!n\/MVaEFkaiA^+!tw+yq?EbwX@1JCaESkVPBG<p/KTTqFcWahR=*LI5>m\VdH6uh\
lBCDN? ^HZKDR>cHiQP>9NjyS4R/mj&MBA!ZDM#96#NuR=@:u>XRGkdQdbmK@tY#yZH$p<<jIby*ZBZhbX6VYSJ
yLYjJ< d>NV&VPu#YN9$\n@Ywntphy8IMQ@Y8+=A<tYKC%*t\H@GqC6dPLp@L<L1Eb9?&hq&8h9LaiJAABA\@=>
DYjum* $Q9*>+Z!D!%H+e@/j/@qlMu?\aNIA6<FuRc4kI:!B?nQDVpCkQ+K1AcWl=tc1An@$ZKENRGAS>?Q4m?*
6a19IM :i<>6a$L^b5SeANn?JN/eep**kjN1aKt/ENmq=dd+uc*&+>9S$W6B*M>^V!EkpuZqX#hSQ:6ky9X%=AZ
5Z/1Tm JtLX5ATK#np:TE#AQmYH^*d%uAJGR$Lt/QuCNLQNb*1Qt<jdn+Fwa:ny5:=^Hh>i5wYdN8E@qF\QJG+9
d95:y: Lh!D4Q1*QJhP!ThdX1n8P*t9SN@CS#E:C1yY=nYLNDtbPmj==t/bBWSBayPHPt:AmSS?8BG^lB86?H4E
#581kG KPYn+$d!b!<@Kc9&9^y1m*X+#lm#a89E6A/MkGGY8IJhWSiwhQl<5Pi\WHK/mp4K%<l&bGJB=B/6n$R*
C*?mk8 nA#iu=i6yZFC81K6<JVHZV4wyF?/*X8jWTt9&VkCdj*<pYI:1WuAq:a5VdnREIV*nqaViJX+Z>AM9tT?
F:1qCi HJH<Hp5Cw<RT91:/BdhKS5d8B8ZmIy=nlI<kJKmP85XbE<Lk?&5\1qEVW5T!jBXah^w<q:aLDPcuaHa?
Yy#FTA 8pVj<K&%y&yn=K9wNT&?8yVklB\J1K<y4#kJGH+D54DnZk4K:A?qN<a9CMJ#I4SSIlTIKP%^pMinTLbh
?/^I5J <\!4Ae!*yw/X$hL$?>EumH44I^l$?Jkt\DLucGD#TFS=@VFu!#wuAlZ>L@laMQ$5FC?nhl+9iFuk>Wi^
P$kP/P w%1IhSnauQPMDtR1p+ka4$A*WRp9dL55e1b=Gq*&\dR\V4p=BBY@LnB@cGMMkpKT%cwjnw=J=DFAln$m
KP?*Ln !^AkD%?Ilmb:SRCijjDb4#4uAwINJc=*yKB%A6KeWS5?QBen*biQKF^ICWdj&j#tiMpn$>>ph@8yuk4=
\kECK= BcDw6jC?C&NQ=S+IXkR>\H#t#mKZZ+#l=DKT\hZ#S$K<FFqR#QFE5LQ:j%@c6p%WTA@DJ4epdW&qh\eR
J>bESA <By<yklmG=qC:uWX+m@b+1i1n$4Auu6ui9w=jAIQJG>+K/F8\bVWnmXaiBiFjq8^P@a5R</y1HD=mI^\
tp1Ln> NWHXS=MP9WD<KA+J%LnA$FX&ZyY/TEhKb8BE#idZ\\5BnR+QXey1DTS@L&yHDAAJnm?eGAuuDuwQyR4D
$NeFcn EH*!!TmhyV%J99hZyK<:Nj^yYeNyk%<1@P9Tue!^<waD#h#81tmi@KmwCeq9Q*1=eWCkdH1uG1yyEtEY
DXDk*T whDi&N!!GnEZ9ERY9uBkaZQ9!!##MK:>k$^EY/at4W:ep4Y:@$*:+4Y6kw$>tq\Tk9@EI#@nV%5lZQCj
@bm<iw ^wI<aLKP\Pc#+:q:KmXW<tCm^teNWyP1cHjkI\=t\K#CM!*k5KRB1AFpI*8J*BD5NAGJu$pRkj/>#L%N
lu:CiW A5BlPDVEPiEZy@%RXPZCBBaqI!hKeKBppWGpDFBww%Lm>R69aX5C^5JaQ*%FcE&yLd14NM6KmFXkA*?8
F/Pwua b!pI6>bS^<edGbbNwCP9!QQktARX!tWRF#4R:VnnNhYqI$RHj^a<nik9::ASHML51eEk?$QL6&TXkXDD
Set1=d KcWTtFXppWA^i>R@9A4HK/^6H+Puh8ATIWtnhWlR4EJW<apew&*d<$jmuMc*I%ew^j1e>+uR+FjJ/T/P
dQWWaR !\@NS<6kkM>\=Faa*^9\dWcVyVD1VJ=Z&Hp1Vu#B1Ab/6t9Faw8#J\bSjYp/<t5qj!M=mu4RW^i4+:9X
P=NuYh HZ<X$H1qG\\8BZIS^IS$%+EC<@?^4*d\yAKH$XRH99YqLeh8e=DT:5JcuVm&aNYpd>bZC!4p&ceT%8@%
I$Z?nR ^q\awq=6&k>!8Gn8w&BYBHQy>5y#1=p/i6@e+AVlDJ8AX6<JaJ4G*61QkW#/lYR:\kh^Y@aHiZTdwNL?
^1IZEk !8IRQMNYde4??yZH>u%ZVjW5G%y$q\InKc1#Z6=k#1IJjHuIyT$#E&y8Bm#@^^uj$?tpuBBFJw+hWi#+
dLQW<K bj@6h*JenWw\naak&Ge$\WZR:?ntVpHuK1nWHJpKib$?bIiX^D$M+NTt!c%?qBFB1G*Yw>dCb<aj<w*t
64iFt/ C@/Wy+G19!\KcpubN#l5G:py9m%DJH\qXFAj##nRweKZu156KHF?/?+>d$iS&?Q*KydlqHd!59BIImIY
$YGe+# cJC^y>NSGnML%VI5A6WNae&&/l>Iw5TB1W9WHlMwDI@X+6Xcn*R\*R>=X1PD9%cwupTXXJQe/AH!i/lu
iHcA>D C9TCy4^E\kGqIa8^J*%JMc+bBVenjJ+j!y%tP@LN+aly>M&Ikb?bkSb+c#+HawhY6eSYmJ>hmu+V?pSp
BRdabd yN@RZP@\ch=Rj11jDw%ePweW5wyQ!**/!q<ZP8?+$aGD%#98#T#lc>GIGJ<NW5lj%&yPkLW8Z*cI@lJY
lCd#4I E1$9IVb<9Y5&^DB8iYSbMPCb?b+lNaFYH8NdYARlc+T6F#1ku%I5+IWidI4ey6C9bC*\LHE=lXjhA5PV
*i1Di^ P:d8%I!n<KY*=hPWd!e@Mt6V:ht$EelELw$<HkHBchVT<LIeaVV84K#QJJa!upcQh@\:>J^@@Kp5*cq:
t6^LBH RT4N6*ta1FY9Ly6:Qq5EK8%*Wl>CFcWb!XcIuQ%P#LlXhbZ<!>TC+ytn%mT#4>N!FMEby>&DuBQG:\a\
aDaV+E HJK@WlXV:D6Hj5&uGB@*9kDcXR%dCb<hZM!eC<+l%yEa&8ik6pCRy$:TI?W8p4Th#CPKG%lRPVhea%Nj
6A$Tn: BiIW6cw$^8N==F>@JYNaI$>n?R<+C/59FS<\*PSw4uyR&t*Cu$mm*+mt6KlMG\9?QEem=Ee&*yiZdVRA
$GcN6b IwMS6%AVek<q6XlMjR8LM1NwYuh&eC6T5IJ+<YcT1QJMlY?T@6Z@lDYY+%8u:m<Gny^P=XLy\n44?nXT
uJN?Wt Jem<k:^+X8WGqFaH?bZ#e1!wy&w9uMDFpB58nja:WDuehBu8>/Qd=uC1P+Q&quLSEtFm@XQ4#&<MVJAY
ETdPiF Gk&DpCE/$IHJFH!5TGhhSK:8//LqC*Iq>%I>d8i$BaIQ>dqwaeSi/F<CB/M9?uVM9>=?\G>AuR>?pCCe
CJXVM/ SG^8jB@Ghn5$^!mR6Z@@CT&JS/p8*$C+#Yym$AXZ1qEaM/:jip^#XpiXyKjM+<y>nIJZDlP:MVY!WmFl
q\@G#4 A@w^E^Wc/Xitu@LG\KmNnAK8>!dVpH:eAA/?Vk1pJ/jeCP6P$Z/SK5+y*5Z?=89Y!akbpaRpM9Cq$qYw
6L6JPK +^#V\t1=#!1VCeFijSmaVnc>hNWumFb+*SMeZ?:b@k^yHV\&*?YPamda&bc6>^d/T^B#>4TL?6B&aJQZ
DGJjVl bjWHpm#nB#dZpa??<1BZFk4/JKVXb68ui:A^t<upJ?h>^%JY^kXWicndYl@5=LL8&nZRZRbt+Q$Z5!@n
Dt6*Dm 6Zh<jYN:</IB!&i896*W@J%Z#qk\WA5uVV>KBX$/NuNQh6py8@hBS@k?F1d:?P&El8Fy%i1baBEkT<*t
*%QC%w &qV>n&1*BkdFGC956a&ajSnIny^n%u$qm:$Vq<en1HGTyijhJC?NCkFqJdDeQNpFe+%=V19LE^u?:6<=
/Zj>1d At>balHmCuI$6?n>:qSDhuhihGG#edNw:hNm^FLLGGR?h&DYnRa?\<cy!B^LL\n$c$RiZhR4P+^?HywX
CGTP*& q<!ue=lVuV:bh+Fh$pFJGeGT1!e@PD4VLkHJNtWDbW>=CMlhWYcVdLR>?kBBQ:Tu5*ZKDLmJGKn<JA#D
-A1t%F 0001117761e001202b4 Page 297 of binaries2.zip
?E#X%* ?hGY@GWuXX:PH1WeLNJ%tC\8VeB?E^mp?pA?IWei$6Vq=TW6ZpcM@^P!p8\@<uQw4p#S@bEYuQ=:jk+d
9K#T:S !<ZFJyiMQ^H+Yy4@W*/Pew<ud#=?<5GHiw+cjLj%*PA?k<Ew!\CaYAMlG1&CP4R4#Y86^wXKFSEBWp#<
MG8ldK QEy!/Ctt4%ewpQ&:P1m8ILBKkS#S:CtSMQQjHKElSyRBdblGST:+4FbL*?iXHRLeA<aH<h^hwWNnm>qc
GcEt!b IR?yB=DBQRDjbMm6q&16<%C<Im*CbwE4R<\FLIGXueZ^w6T65YCBK^!>pV$HIQL$lX%ZWFD#i=5Y&F9l
9TwA<> DZ@mH^ESNZDE:?%!CIC\pCZkDpR$\=RK&BepEDc1#A#t6CZ\q^^4qB\RlTmNj?jmE\jF<5WK6aNn/4MP
5D8enA b$q4bKua8upHAZ%WJ/uVXNqD@aT*?qqel4FPM<6Sj\Gnq@VXcR6LIH5JenVTP!k*E*pjuJMJX:ZpGWa%
>PGAI* t*Bad%@iL>:W*J%*+8e\&AyLS?G*eZ>m#D\<B\VacWDVSbP>5*MLqII*<6uP4@JWBqciM$jNMutG*H#b
@JKGGn S!QE!F9n@FP/W1Jn5/ePJ!YtJLA?X\?yF4yHK/?8<XmyJ6cXN$iy#9KH+$d6c!@9Sl1CyIWmLwdbTSyd
QhXpHT Dk6<Wj:SE>Al/qG&$%mKWP^NkJd?I?QGB:%b<GB1l?GeLdJXiqW8>^#M#\P@=c&5Qqb1c6@aPS#GwNhG
4/m1!I 5=wbp$uN>ZZ@A$Me66%CJ&Pk5hGWS8LmZ:RMT>Y<>F4%w%jT*KFWk/>aqQ9^5JT8P/t$YqjTYDltc+b#
wbe&^W ^E=hZtwy>qP\nYLn6c1%ptIewNJJhmh<>QejdKe9:!\jQYGV:GRW1ph5:G8hGtq$bkZwT*9wF6+t91qd
n=R!H$ yhYQ6G6EJS4XqY%YK6u&S64FP/&5MNEJ*nEJHMe\N4IT>VG#m!Qq\Qh6>leydJQqVTtZ1dM\F<PXQ<=k
!P@jMC <6:<LLZ$i#cpb!e%>bPlRI8<wnSB\ke+Sy\CpGbMpTFy!cFC>RuMRI<#4$%GA#@Zca\1^<p&8nT:HX<\
tT/tmJ B8^N?T*ZIKdycPTmd&?*b:Ta4H:6i!mi9:PJ>E%ji?WM4GKRaXKy@hRVall9l:waGJJCKVD\6JFJ?Au6
PniJS= ?d$b^uG?cchnE^dLmME#*cZP#Dppaw/whku%X*ME@ne*ejikhNy!F^<VBNuGJu1pE*lmQJT+LYW%Bp@Z
Vmc<yT ^ASjCSqu@$@!wuD?H\E8qi4&TC>yK6A%9Z#VR4CHSW:nAlAnVV?b:5mA=S%tPEwPBN:k&^EyAJ*5Q?p<
XRpB#m w?cDGCJ6%1#Klt1LmdBl?T+cMG@qCbEnD+5eCR6phIBbSHaMWuKTWm#H*%WNeZiTAu\Bd+QK@S@t?cFy
6F$DI^ wS#TS6CG>\TuiYE:B9HKC8>L:PWaBKMpaH!EKW==Zb^KQ:5JTXAnI$L=Ju+WCTjKGn/lj1I55ZE<J>c5
:p@tD/ QT%cTnycQ8^DEEk8adH5dVLM$pE>ZY/i$#X@yu#1*F#id?Jup#Ic4&w?HYGE4ikJjB\E4T4?PtRdZ*q>
jF#py> Y>:P^Gw^ikliWW@#c>A+1HW/Kn4iy?>/:D1J?#BLy95e8F%kuPXe$$Y\Pni/6!Via+@VR#lctNXltS*S
#pXh!X ypLh+!VP<9FINMdMnPhwt\?Aq&\X^\F4&VK6TJB*P668&R4bb!ll5\$tmJG\^G!X8XV\9MGeu6iJG$lT
jVQlwn GM>qWPWdk!GD*\!aHjp&V&9!8GIB1yRt^GLGHnL#6p<IJYiIK:\u%>th6i9wb91wu@9<I8c5=LlJ>L&y
ua%8nQ lZT?Ad&Qnc!Dd4d9K$MdB?X1ckhtiWXj:ChSYFw=?%uV!\KGh@FhmRX?W@5lY/i+<+%KqG/W5tK^SdS#
!t1EHb @+iib?+&hRC>WjK\lZXXEFFIWI?eSk\n*#4Sht:XBX!8ZP118e@Hy5$tZ<9W*5h:6%d*^?y:/yNLR>n$
Ep4DAw =h8:WGRJq#FC#>L?@R5kDDV/Q@WA#D@bQVKZPCchnGIC?4Q?$SQD@$>=L>8JEAGp#*>&Z<BE<lBBwcaA
$J=Sl& ?Q#EmQ!Kp9nKiZupd4Aw&5uaD%c5tP$Q$^li6+kCDcGAiW#kqV\AEIR?&N>JQwtBRVi6kX4<<epS5cQ=
p@$CIJ <RE\MjN!4MCkbCNj>etXhZ6n&Nmtc!H^E@NE9AWN+1W5TQ#X8\h\%WE!/6#P*pAT<=C/+c^bLk@<!ZWw
QaELtE #5E1&u/SL*aZ/9N/6lJwImpCK\kk!iMV/8iIIEKmJhJea*DFdGEDd!G:QR4yduDN$ALh65tANu#mHdmY
&b:$hn KZ^mXb&5kR@X=nS@%D\?6@1Q!%u@FJnTe@*&T*y?C<AQ=HaP6lWICYHMPu<Bh>1=Jq6LDb==wSMEhQaI
%kG:p4 R<uQAB%j/1PNLQN\&u!9Y^Y6LSA%ccqI=LQ8%J&cun1h=yFwCcGt#@?GVT>PhCDIDAZ!pD+uTP4np#dy
M?XqF? yVH>GpX9PBLkPkK59>HRLw@KjBWeymhQ/lGBQR=&cRV$\hWyTYlY%ZGkN+cw\Fu:M4=GDICe!ReElkkp
KaTu#? uZICm@@Wa4#E&bI8y+DyQE%>j4u5<Wt<#J%u$u5CB5y%XFhwFNK1l#N?HdYtH+?*wlq8\!wqLWCym4G5
yInYV8 WLT</EQH&d^cc1F6bE#Q86<Sj6tpZZ1*TnPP:pmT!?%X:jJw*6ShcYRu%Zd8IXTPLuMXjT:*!LaS1biI
KiEuT9 C4B=in\h81*hhB^RuIn9:4FG&*AB<TX4bj:PBEbZ/eS#8:q=&&yS?&&/Hi6+$qhH=*DlW$t4mRRW4aM$
&IeqmF +@AGMBI5yA!i^\\QkAH/p=hEMltJGluWu\FCiA>FZlC$%@RqV+5c?hctSmeKbjj6Qh\6S\KkL6@&kk&C
$&XcLK <itu4>G$8RnDSL\b1XFEY+a:C%Wb?>KBHDKYPCN=eq^?q+GSupV!AJij?+/$\GaaQ8qTb6lHtK4um1/W
yF\pmy MqG&VwNFSF?H*XC#Wd?AmT+9Tc=PyDYidYGe@8a&JbBB#En656/VSw$$8wC:GiHTa*6Ct+?:&Tth*Tj%
^D*huA @nLQe6y#*cQY<$qY^Qy$i%Jyl<hY?*!uGw%KBtD/BZcB8Zn^&IatpcjZ<:n=Tl!h?ZFd?:Wuh^$EWTBH
%Kn8+C />F/$Wy@<Fa1I\6d=cAlAB$^YyKS<S!nS^WWBAZDN%GpSGZI1KepJ^%M<?J\Tm9PX+PNR=TMlhSQnZ*n
<Qt:Xe DHXBA18:KJeX@K^NhFehy9!d6W/<li%+wnwt4SZijVY\pm+91SnV9Y/Hp+/P>Bbu=@YWq!PII4#hhtB5
:G4<F: N$jW+hVqMJyVXu9A6&Abw?!ujeyTBWbNTDehK?$aHhkMdd\Fu6e&+Wu4uw!bVdXi@@l5JCV%kh+kKJJR
$HiMNS R&L9XAJi>wYH!%Xhq9JH&k?Yj&aqPX#@R:hLniDjh94j4<88haHlARIYYFFW*KS?p8?I6t>$%i+qNBQ%
%X:P6a y6Ybjmij:GG/dF:8dEtpiR<kV8Zk*LBdam!KDdepNSdV*YnD$MDn#6BVu+:PGtCbWPK/Y9#\+*G$/6\G
%?kJKY bTMYZGi/8!VV\9CIQV9+VPp+DGFT=NlXN1ui=bBmRX*K/F^S%+y+TCnWDPptiy4<:5D*^hdTH\kCaMKH
Daj\Vi D+SEKj^Z6tARd$AWkAak<L6pAABC:*8XAD@?<P#>MuyT:ENdAMAlbh?:lk/>*Sn:d9VlQ/u$4EPi#6>d
c=cQYE H+q?#awi4H<tIJH<K\HJj*K?@+a$B@^NtnMSiAPLA9D?J4*b@/K<PRCku&AI$P*RHjDY<M=IVpml1NTw
5!1ju/ QJkYtAG+@dkd?L@\:+m\mKmw%1qwhYu6HJ\aDlnl@1c%@<FwX#>&lkEj+tch*Yc=X\M<Q9:b@X:>9eE$
kAi>qM ?/QTR5!A<@uBkZPBh*m/C@>#pWWcS5Kw+#^mN9?d8Id:?!Ve:QA>VA\e@/$Jkj/jFc!S9+q4dq\AAEQ^
#uwi8I h&jh?j8cKQ/D8Id>9eL<*^QZ%k=@<CDlIDLA#MEBMQQ?kCASYt/A?l<VAkCRH8b1<4eJRXkMAHn!+5Vd
bt*kGD >QuwZQtKulyD=yHIXi9^uN8+hQ1mk/B?@D/\mM:*!HTWwbkb!?8Letai+ShcY@PmI%%N*$N#%Y64W6y8
TltPee Jn&41?+pYm*eNY?*&m*SJTQLYE\bPiR\LuR#V*6R&hha8+1V/PW*@yP+dWe9nVb<GplqGh4^e@1?hyq9
NlAwX* !6/:JZ4G4dwwjaY:JHN#8iZ&J4VVGKLAWGHHhKHbCR$njJ$#mhMRCiCqW@S1QYcbL^qjchG/ncG=aCeT
T+&e4R PbWZPtnk/k^wA&?>QZddZe9nwh4eWe#uqCn><J>A8PWaJkyjZ8B\mky1mI+uK\V@iS&NibtkCKwbIDMi
yk$Jl5 HNtnbQY*DTHnZ&\I:*EQJTnuZK4#A=iy?l5P9QSKktqBJm6w:@yb/>P5mlGNuCqP=+:ZSYWF5q4+#VS6
LqFy<$ R*wa^I<l>>55++JP1N^XK1ptqSTNb/jmX<%A?tm*i1!R?9A@JDG<Xq6TDDcmbnTAXy>AC1Q9^5$8iyX4
PHW+?^ ZTeI94>Q1<8RMTY*u4C<W>=KiT6&WDHI<S>P?5t1/nKCiupPC>G+6eJHNL8!hST8=^N#Q\<j/dnpTL&#
%?E=5! MYaR1Hei5\tb!@FuW>Y$l**hAlCY<uQQ#5nadyawnNDw4iRRi4QHjt%pMM8NM!p&<ByQZTJ/$nT*>a>k
NX!Iw9 wlqQ>89P*&k:F^RqZYnJPM\P:PcNh9\AdY>#6F!SSVED\8NbYu^=j#Bn!$^cYtdyq:8XI8tQHDjKYK1P
eCS6dy B4Pu^CPGHwP8@8G?ZaSnY*jm!HMtdRanynjeQ&IGjHHXQPDB5W?Hc1SPmkqJ<FPlRA@+H6!GIy>=%:%d
DuDN55 ME*bJ6V#ybYE\KLCWlacuh8dy16XA!yi+8M+Cn/aKdcAMb:e\::FFVR6Y6^ASJFueMZSVn/B^k#LWkBb
tawtWc uWQAY#6FN*:bX8:llm/wy6X<5y^$VK85d8^V:CQ8nYiCL>dPBP1nHCHXkqS9JqtGm<4=ZGk?/!***J8k
tl?p4j :>!BmXTB@6q*A%1PVaPLXyYlSeAcq+u&1!HclZ+X+c9Yd9EQRi6lHpK1HIlciVNR=mlKw<FY5hlW@b=D
?PCGbL w6HytZ$u:FjtapndV/EmKc<1LlMdww\&&aMjTtYe<lk&4RhnLnR$pFDZmqZP\+a>lF$F!\^Y&KHKN=<p
#wwlNK SN!#SX+W>b!>Qt=G&8tVu<&YlMZ<p!qV6T54=YLleWF*:EWuI\ZM@8!e!5JX1jA1$PnpicQZZ@Rcw85b
1%Zap/ :X4uZ6DWmP?#MYn:4i!kTn8BIw&&TSR^9SeI>jutWE5e&Zdl%mJcm>L8*+nYQLyddDB+5=1e5SGTE5$=
BL!tMd /I>Du&h6jYDEi<QVjZ%+<+C:d::tWhb?!i6c<6PLqJ1!\:Y!H<ycah%dZ%<?@<q%ZGa>NFya:F@<8wZX
>aEGVD t5D&^VQa!Z*&CGh?T<b=p:41=S:j?RhXuyQ$SXk+tYTb!y\M#HGTXlqHJau?58emd&HpXaWkS8ZCApiB
<IMuli LQbbBPt=Ku^mD/uTC%&:mPnSG=&ap#8aE:I@4:FY6+Z/V%=kMIMMKTFIP+ipMMbpNLl:9p&BKWy\V58R
AGk8%m FJq:5DL$HCCFS%Zd*XDG:K@<yG+w*BGMGNLbA8#H9eJ!mGR@KSpX#!C&9m!TLwb<klwewem4VjDJLXB/
p4p>E@ $pN8/i@i:B++Y:uSNcu$khHi9hlqPKTI4=uD5R>AC18QaJ\WPeuKii@$XV6ZqPM%JA<E%*h>bX1#p8d6
:c\W4q V<dw5kjDbXCAQW4MBa\iA^%hEuP:F\:>8uLuw\P=&%E#X#H?lqtA$Q&P&l=Y@@M:6dZPME@9JMbNZqbD
ES><$u <$V$KLNQ:NW/Cc4ciaI+KTqNc%M>%QH*qLna/=?V?anj1cL8y%4%PTIT$/jm#?FXMBKd%etbMqEWH<$m
-Ab59@ 000329921c0001202b4 Page 298 of binaries2.zip
Td64%D a!<tn>9w$JKTCt#VJwXui\S9We/H8*+&+@5amK4\Kn+Knd/>DL@n1pe9cH=@PqZ\?VJ5YTLk%<jP8Y6k
t<SC<B V^SBhcaKV=K4Al/@$iNn<=N=TC*ZVpXZ1\jNu<!4@Y%yhc@H=ELQ99QaH<#9+AE<DEB+>#ke$>QuXRkW
6l1mCk ?iE:id<F&Jn1qi^J18%%yG8tYZtNlX^@yIcG^an:uJ<=W$&ut:y:R:F/?n#8:SW<aV8*=:mmm6y<m#@n
$FJ1J9 kd*jKuTtZYnH%wbC5?+XE*>CW<hWF@1F#PME5k1mX4hN6HXZ>wGC%N=u&IjP^b%QeZJ88S$\X6m1^>WN
G4QL4+ WaMwC?ty8%Nu1Cn=Zd<w+^$eQjEcqdPa6+@#l/eK@HQiD^\lhpF*6*eFLJiaqwV?kee4*+hkpJAj<Yal
YlC##8 1H6HTFASq>t4NdLP9^nMQ*qPGHA@pA5W6R8yDcL=wyDHK\yM\H<M>P6?1KGlX\DZqjjLW=6TSKFR=/j1
Y#MB!\ DW9RX&^u5YC>$q?$+TwW?:5=KlQWa%>@mTy&YcK1%=6bZQ=BQm+*jkaHq*?!pS>1VakD9&ynh?H9Xp@4
\#KP1d ie##w%qnua<PRbew%1dFy%S#Qt&$Bt1wekW&#G#I\@kHG@yZA^t4\=QPD+VPY#%?DB#?Tu%8qYdKP<?i
IFuj@h #u@uMIkR=6nRF6:lqXF=$hQRDCq%JEnid#EndYMtbmKSm^GXRqi$q6S#dJ:qiRm$^w/tZE*!em8PP5Kd
l?>nXy 4hLHH&HmF+T?VdVulWWpR1RLmJ!B^A!=pTV>^Jam+*?iPA@wbILGZQR@V5HJJIQEa***#eEwKdDn>q@Z
y=I=tI RZ!luQ@m>uK=1+^hNMy+mCukY%+8!lqE::4hhLq1pj?4\PYC\dC<TFEd@?Pu*!=nKCti8ujW!6w*CBL$
w^!m<G W\>NSA@e%Fi$*DIuGcTh#$4JLVeq\9MlCG^jp??X%A8$8R%Y%nbiD1mYLG:+LY?EVtH$/Z:!9yG/k6$q
4GN?%m 5%<&y4&<\6#AW<ym?F%Hc?C@&dyeK<4SeEGDyap9hJL9GX*/*ALhWRlbMpw=5GLLC4bk^SidX6Gc&R8=
C8nS@+ e8yZAZYdataVHGd8F&QFT*aT=9nTy1uqCahi/R@YZ\15TB##tG#l+Ga^NH:8JW=eVkZ5n!CCBRW:^/@k
XDZ\8k qC%<F%a@/6>n=ej9D:Mn<Z!4Ye+$/hVb:5>Md<A!>+cT*wLGbkau6i5KB5<mJ+J8w\GNRHt:+A5QcudM
\G@TFF %EaYTM:TeN\DnnP&NFXPYiK/$YBAlWC&%dQG<MjNpn+lmLHW+Yu\N^58@66kWI%/%9b<1=YlS?wdTWF*
ycn6VZ YE\I1cPiJBRK1\P\FW4ckRn?5Zb8dRqV\ecBY?>+C64lyj&yjE$Fca*YEF+Yab:EmLF6#=l\y@C%Q<ht
\Vw1DW aheFb&6DtcPn&<#=J$bn4a<!Y<#yL<eb<&^jCIy69?udc@I&H9ii*j^*mcVd^V8HYt@ZAL?5A+S%*KKA
Cudy\w 1YIwVdw1FLHu%cpXp*VBZ$*n$auhw<A?\jjEi68e!Yj8wNVjuSNEV=q?HH&>D=bt%QbTq%Aq8T!b%$FB
9Lu=b$ /:W/tetw?I:J/da\$5u^wyanIPhi$Qn6W@4:YYCt+#$9/KT*bD$6Iq\j#QAhGG&6QM/dWD$#DQ:Y+HpA
k$m1QB \eWcBGc\Vl%Fpj?>w:d+KcklbQ>8VXBkQNLJbNNtS>=pk#Au1&\9!9t5L:b<=G+l4Q@/mu4dw+<iJ?N4
XDZ!H4 Xun=JuFww@:IKjV>b^juTtJq!\Ih+ZM!kWaQ@yhD#%1id?IM>9W5i@>\F$\\jW%lJnt=AZBcS8l*Q%e*
*@1$ZD CR?F@jD1YHaa$>N*DlmD!8GuE6wIDpR9QQZibwI1$q?!5!Hi/<Q<a!/k%d*CY4#y$jbyew5EyD8IZH+a
KTM>*l @9K$19WCuCLW^%l9VAwEIRYpyj1lCM@<uJh#eMd+AnR&h#qhGajG54Ap!*!>ZyXZduDKTtpEhZQ^8J5S
iR#H?! jZu!<Li*wBa^h1dtT:$JY?yBW@#T%ehB8&cb<ytwCMc^?uhWFi9%QSJ/iMSd6QY><Z1XyVRbnGT\@4%L
4>kRjD a4eXZ^A<HC>PQ+^8mWm$:+>AmF?kbX^+w49q5jKcaS9c:5/&chmP+D!tlL1heaI#*wq/4Kkhdy#FL+>u
R/cpl8 ZX/ik:+<dJq4SdB@Jw=l1w6Pc:%y/\X*4ayKXBJN@ci=+G<F\CHdVGQK/V@NBX4@5:uk?*<*F!nt:>e<
*&X*X> AQGeN%pE=pDi#K\ih@mbpQT!c1N%!WJnYKdhA#4cJEiqR:5<V!ml/Q9AkBV+XS*TQ8*VSL>mH^ZYaSyt
Geb6me IW$aDH!Z%!&1nJjuFe\DG?uHI!wH?5=19W=RX4aLjA%!l#8\I#AFRaj1A6jBck5jTu$@&X?u#P^C$RMk
wW&?nM !tyEFMjcA%bl:tCVBGLdWyLtDahH!\e4k%Ka^ZiqMjl8VA>hQuwmea4+JTAAchXiYleEH1\tH>:\J^/w
Fc5c9: 5c5aI&/YGVt?chENWXwC//##ET&1I4G1=d?IAc$k8uXQ+=XJmTNjYQ*GtwHAk?uqVdPBYp1=4*ZKG>HA
j9KQA\ &e4q+yGjKJb=F^9&?&!MFy>B\DlW#jE&C\&l\Fp!F!=6GV#jKMX=:#uGL+M%B<$Kd%W18!^d8Ttt8i#C
j@FP/m p66WX>acybm%8EItt!ukP5nPE=*B/1>p&ji#nCFG5JwmBtn%ZAJ%:\>!Z4<t/kCt+j!ZRLTlB!eN#&G?
i=/R+Q dhHhBy:*n?uiQ=w8pK/BGQ?1<eyF/%MXTjZRywjNlEZJ#HT&Ce^FhM!FwF$!QdN=pHP*eH!nQV1tLSw9
b$PW4C ^@#Wd&Ywk$E4EwRb%ik:Cj#qa9*4G$N=t@W+c^86cpCVa+WG<MF?q=^HmP^b+1DWJtn:+c6e=&CJYL?#
qde*w# RbB&#!j^K<Z=wKwae@5c^m=:B&8Zyyj9Slu91A8i:KcW4V#XBw#t<ubq5\#!@n/8j6ibEniN%E4ZlJpH
tj#4im ZuR/&d1HGL/^a<Qn8e:aNQ4=bI*95jyCn/Wd5LXhkGp1l%:btYeTZK!c6+/%>ytYNVBLP:$8%iiDYYVZ
CieBu& k?um#mbNLF@yYViGblZK#pk^B?XCD@Y%qB/GeT9dPIlK\<t>LT@^KB8b1IHl>+/jP8I1n$@?=qhS/BP+
Y5yFJD y+un11Qi%Y&cHbiT%:K1dc+R!1NP#yQ6>&?N:i=65%NHl#n$I>\$BMcCR#%mFeQ>EK\<X%bwd?Nq*S1B
VQXKu4 6!C<cQXtwSR*D$LmdXKl%EN5yDMQk:JG*w>iTybh6%+wTd/PwaYG^VZwFJE>XD5DP/&<FG:8Ep=wn1tS
hN6TjN *^I:Y5B?jZ<idhE<Pnk!ZnVMSI5c8C@6V&6#Ci$=4hm$yZD65pmqw>Q4*n#h!9=T&j^cLKqF%!aq!!1J
G#aZn@ \k^d:Q6yZ&@bAV1!6uQ&5\&*8AF4w@kRka%$bI<1<98Vp$NM\\kP1E>A4>mJ=k\+ttBquS\?\8%MQ<e^
$altVy :5&MyHnADeYwu1A>CRRiTD1KE@/:cMCCDmR!%BA@HTnpN+e*bh$m4Gkq8^$n6bqPaWp1cFFtVL>#a+bn
CJl8cQ nL*pJWqPJElw5EZHL=ckkk4ch:FFpPFqTY4<MVPqiCJq*^#w^?Wp^qu<>p$JByY#aE+68=MXGPCWB>q$
&DjunH nRmpNiMNbPdDDn!QCGRNImQ=Xk:SCQiJp%HjInYtA8?P=TSu^e9TnN+tB\=R5\b:DZQc&1aaWL?=Hk+%
R?CPB1 Kmyquw=PmQR%+mXcV%=LCj4!=8SK?PdpI5nFFZZujyXk>E*b&hn/c8ECd=pi?Y6wb?NFa>>LC\jqJZGT
pNImE: <8$LG?umIP*F^4uN>Me5%9c4^/GMEkXKienYtybqyyi#d=h^Xqki1PiVZ&lN=HFN4CAJN^Z1ZYKlt9I8
+WTlKS F1pk&\RV9yNVPVCiNl!?Dj1F/B>F+Z!:a#=pn$mGwRM^qIYp#HCddcjkjw>lkZ=/Z1ipMJZZ5P1I4P!V
Re!bTL uD1L!&hanFBN9m*%/4>wCkaPBAP!\p>9JA8Vy%%eY+6/kZ+Qk/<dtjP@jwmK46uJXGyXP>1FlV^G$et/
K58YA# Xj11449CtL&Va9Q8:Ve9u4YhLhZ8Tnh\Qtl6E*N/cN@XDFIiXq?G/?B/K&>TcIX*14uC^t!%CAE>^tap
CphcSh 9ESh/*&uA/!?9jF&BJ*j9%\??@m1qY+iZ&$?9Hn/wD&cnb?@i@iHT*8AuN<?iZ>tEeB?jA=jH$/u1*<d
&S*$ym C\Ph?Gj1wcl@?A\&&146h+Xm:iHBu\AA?:>#D?H?h=aID*IA<Ch<F9@*jm=?&ZeAJEwYkN>jHN?j&J>B
Q$GqZ5 EEmwXV>nL&<yyhEk1yd#@hd4+a@QkQp9cRGwq^<AHA&A<+@n:\WSM=5Bp\eABtBlBiABRP^AcRAk=hI5
&bCkwc j1Cup/$Re*=R$AJ@jES<aMR9\bCR$JN!H6@><\ECNT>AVGqne45DkBYbS=/^XH61w!R?SEn?lLhlAZ@6
C6#lMM ?@M+q*#<ku=S8iVIE@S\b%B?WEkP+M5JnEBRjL^Em@L#HH+ypDjRMuq<hJFW#Ac#NkNnjWT+I?%c8twk
we@qe: P:X^/!j9^b8>CuDSQPpDTj$KR5bnP&eA%ZAnJP^HMcJ:i^ZL=cFh%tH+L#AB#kAYZ@/FVbapRi1ML5>t
a*i:MD i1KKj8^X:wX5Jpcc!%iZw/?+?6LkQkQ6n=5^G>&BbJ*y8Leb:$laQR<DV@9XQkwaTmlI=wGSaWT/:?+#
?TPuQT 6%P?jB5\V\@9F=*iytcdLW?A#E>y1>!9#^wi1QPyy$>Yn$+ju/q@4Acuj%5N64JPI8iEaS6QM6\n1MFj
nkJX6: L?ICZeV:kbe#=%&1G$C*Hbb5=/hZe#c+:u@wdL+k%nt?*^dX^VR>njMGt<N5^T9k@+JL!ARG:9/HwRB:
4VDYwe >Q=dwwEV@q:c6L#:kyalS$K%!9iMnn1^6Ba99%4P<b:F%<Wt/eZ*X!Si#@&XV#?NL1#4N5*H=:<eBTQh
y#Y:\E uR9m9+lh\Q@DWeC6EjZ!q@/k16h>JpI?CuN/1>@NXIb#+^WSyeTw?NKwebtV<?qyXhPFql5P\iYW!/a/
yFA6&< <h!n=YbwPb@CZL*M@QwG#KmQV<V^!6KPH>Sl9FkZVaV5?/%c=Me!iFWhIjR:4+JBKteSk??pi=mP8T?/
MX+>by 1%t&Dq>q?&PZ*aXQ/:Syuq5y5i/NqHHB\PL!Sq5QMw9u1RKyq>%j9wL*ylNy9KH!yhnu:p@5Vh>QBPNE
kH%c^C eZ^CWGSRAAME@^+GXFpC5Q=ZVLCCQnyYC5e#WLt+=?h\6=\Bj?1JjAj@/LhR@<Eb!DKYZ::<Wp&dW*?J
KN#XAp HAyq6GYw#MCY8>$%A@tP!?cpde/4^<^$VKR!n=8KZ@^&mC4&E1Hk:55E\8ZJwQW1aTk!lm^JJdWbSR*$
=yy5/Q YW\t8+\1/Ku#p4pKYN!ePH?PM6%9ewC#S6&:u//uukwV$Ja1P&+mu@y/FZBAH6\8@BE/*q:tnVb:L9<I
PAD=Mw HZLmN6juy%VCCb6ad==W16Aw@ql:+C/hp?8ZnnTmR#+j4^@4@?E4tGGi6%98<altWkTK1t\+KKZF+1m1
ckWmjV p\ktRw/PdmX%P?u%h/u5pa!5GB!m/pu=I*Se9y/5@ai9aPhTy4Wkw/#E4y!M5+:NiAEuSy<&S1ZiFZI=
4&>Rc8 p%bCieBP@W#ZHDun?y1SI#jL<*#5+5RMcPE\%tu/Z*\FbyY?:IqtHC:kSyAb\%#Za!1!BedjET@cj?LG
$%mPF% /MCtp/:@EV4+da>/QQ<yhFDYS\TAI$9BDwm@aj\SPt+*5>$ZT?e:utnV*Na\NJPSTjR1BHY5T4/%+6>P
H#t&4K ?N?9j<H>H*$FTF8mSSmi1Q>I91:H?Ji9kKh>\&/JmVk&$bLWtI::=a?9+M#C^/l:%@c=61SqlYH!pa44
Myu4i/ c9H#K^<9!@1JPA/CFWN8Wtju4++JN#P&=/Xu1==9/p/4e@IDyw*i^hWnl!*cK?41I/>JKD1KJyt?nb/+
-AB9kb 000e2e542a7001202b4 Page 299 of binaries2.zip
\+Q@=: em*NJZ?uaL@AS$a8nkQ\A=D>@&LtK*@9!9+8lRAA$W9SK<DJu^#5e#4n^>$ZG:9<kCtHZ>!XDKQD^dkP
kJAp+J \:lt*A=bl^#9j%5K4wi98F#QX%65N#I=:9:YR1c@!%$$j>Q5@ai9IQI9Z<H@1l:<i\tEG:eVJBSA<<?+
<+ITXF j//@SBBiAHAn<AA+Fmk8yBNpIAIXAk9TChIN!mZKM?w8/kQGG5abLk+8P?e5F/+WHlpiPS+H9lm?PL+Y
BqS?6y <Vd^G\WhBbWDXSA#M:MMc\94!NkE=^Vu>X<KCjy@^Q\@jQ<npYT9#?X8:u\HPuV@y@:\6+ENp?FQWBHR
lmpY!k FknCbn>@j<q/pG!tJ!H4PhLj!%DP:J<NT4C\5MPA!BZ5HnMn+P>uQ+KL8D5:Gnn>:==<CjK9#*/5y&L#
dd1djy @Mi#H$EBCpACIN*Aq@>+>mQmu&e@w9Q@nR6y/PJpaY9m>L>BB9$98LF@Z%5AGIAZ\A*WAuV+4:l+Gu@n
RSiyhM \51L!iNLtZk+Y6mc@S655H@F4eMAX@\HLnmkCPACJAF$<Ve8EPD#:jQk#8IQLmIA<R?89KPF1+G#!S@<
HM<DdX @\Ed@Qi1?S?j>:RA:M>1d/cwcG>tL@Zj%cH$t4?SEj=ChnG$6nD/N<B@pMG8@\Y=?5>1d!d@Z=DBW9?W
Y&RZCp VRCR&uTkAqCYG9MNJFBA4&nl<e5wYEaP>dDGel/<@SenlKhtk8D/%5AZ/lhlAun1q\/uc+%&Yc>yF6u6
dKqc16 KLPHERm54K><=?ueub#AYEE:^SQn>bmdMRA#QJt#h/88ii==?jYBBQBH64iN:k#JqkM/w?nR5*ItZmGG
I8!p&u P?1*QXRKH48?WVHNpwL9aIq\+kCq1&NA*tiSJqaGD\M*8LLDctiGZ1jBuGI=!Ai4AhCYew/Y&!TTb8?#
^ER/5j +NCELZL<qWpu>BGS?j58e#5V194a@aiGHmM?Q<%pMHFlYmuE<NKX4q#C/p/!ZG*ZBFPW&YJkjMdk>N9q
^GdEDk TbSVYAcidj#N@M:=mP=Z?FkF<L4njnEnZ8!Rmd^kudiwkF4HNtDyGZdI^@uBD1KFX@Ey^l5+S=BQyh!I
j\!8T6 :AWFFqBl^9qX@#dPli?4$T:quS89l1A?>=MGXWy\dIkYN$BjiMlYFtq%w:<T:NnEk$H4pk%!?^mtL6&D
Ypu\4+ 5&QNp99G6&/hj@WwAeIaEQncjl5e$4<%Z^8ZH<w^aCDp&im=hSHjmhQ^I\@!kKLIRQ&bWD9TC<P@!hu%
Y$5c8d q@iRZHF*HSDkP/i5mjMj5^K?kJPVubHF:<dqlK<51+R9dPF1+YSlb+59atN9dihlawI9bPLw@B?8wn<N
%^5lDB yR+IKAIkBa1IBA!AARQ?<&&D\wAAA\GkwSCq4JmN5!XMkli*AHu>>XwTkjG%W&=N4$\&jJp8>L*P?aC<
cmM?K* aIMIlYAhqkF/BWn:>\\uPbmijM$/IQ$IkPljkPB@AJNG@&BXhcBLVV8hTjN\AZKF8tnL#/l@cyy:kPi*
FNjbKZ \1\VmM*@PkHp<G*M9:X6+pnHb!dSlNLq1$i@Gh:<F/\l+ep@YEdnFuk9y\69T&GA9NmbtWqEAaidVThW
Bd^&T% XH4%M?LWu%VjAHq*#?di/XkEetHLIMe<<BNP?ijQId?^@t:Qqm!@&@P:>hTd?pjydaBWVWG\RcF4P&>c
GIm:i* $HqWt$d<*X#a!D$FXRDThSi/KK^hwJ?SLNZ<=GiY@td1BW>*mi&4P\tEEL%LKG?Wqw*Dmt\^cpB>6!qa
D6@L\+ \tBdpYi<YYcedP?&F+JeK^YR>A?W4=hFuQG6YjwETeK$W$TpN^HyTc1Z%F+B4Rhm#:@d<:+*=RNlmtA+
9iTlpq $<qD*&NAPN^=Z\<w+K&&S&p^/W:bhpe8mQhbCjpSw9aB$NKPZW?</caM5e<kJX:^#5ZK?\J*=?idZCiA
Yp1ceF eNp8$/IQ%&EQ@hI%H5/dB5TJcV6F\p@hQ?Bt6:Lpcq6KLPWS#pD%bhljdW^na&#m>?\>YJ?XwPLNPCGY
GclhW> e@S4MZwjJJa9qJ8E#84SiIjHF*=/WEDe+Yhjt*DVV=89CkZ8QBnFIR1wSTY&ljq<ByZH5h>utMZieDuC
l&:iY5 c%GW<nypB^Lwid%\XBLh1\j#NRRl$6LbhJyn9b^EyJtX&?W&5qKMVD%6PGLZ^KLN6bW^@Dc*@Z#RF1w<
A4W!$S BI:S#JQSC*my99Wc=h*YaF9!$a!$jM4F@kB8!8R<%@*Vu1u?l@d<y*>V5nN%hnN\NMFZNLE&MZA!?b<c
u$Ma!6 5CZLj#SkqL!R6!W9@GTFR$Bi%&FqPPEnhZ9Z%\%kC6jLqP4>E!FA48A=Aa8185>$Fn/8ZdnWYaSqwcV=
ud8yFA j&9A!@@ckQ*lAZu*wScFIq^%yVR4V1eX<QwLXh9Z!+B5ZLDNEPptiB1K/Gkm6$D<8ly\nd@@GKV@\wL>
KpJld^ $+DF=5FAkKjuAQ@cnM>aAZpDkZ^eIZjDE%Q:VLnl8=HMB5W?9wC<%bjZq/m4Sc5Q494KjyM45G5ZJ+uj
<MA/RC mQ<a?p\hVW#?ZI#@</G9:l>DFATADkAH>BQw>F?H9yZ>@?PlD?LjDH&R@>QRy\j@j##$Rj:jDZ*a4u<H
/4Hm/Y a@\jDH&@pe>\@qqJnjw4GAMI?!eAeB4*H>puAbV@<y:!@?a>@%$\luRnAQDyQcIFwk^tQ/IFnkEAmM5<
PFK6Mj u\H!@kSnSEAC*MQnXW^MSESXtIYESThQBYec#nyw^:@dwA=JG@@?/Z?He5tReA+KZ#h=+C8ypyF^4Y*!
A=QbuF FJhpSy&HQ5Lkd\idwhXm^KCyF=9?GF$IwIbB4ILTq\JYS+at5+M%CcCG$6ha@5F&?8SZJXhV?6K:ijZS
N#eYXY 5\t#de$We6YN<StK*e>8BL5hVbicj5Gd>8I>ch$#A$!H&AtPQAS!iD8>J>i*PP5B4qktV@@j#8u%%T%A
yJ<*Z\ aeM+BHMQh@h1#S*Z9^A+&uH!pGSy*j8cq+kyc@jQ9+HZ4B%w!!8P8wQ?VHn4@>!58HiZ\@J$mA5cDlYk
hD?D<Z jAq:E!a?:W<kI=RX#w1wy^aNWTWGWyaK?l/?GGP?EjMi$wW96qS<:KtdPul%:p4@!>$ILy4X<<#kP/1I
k=uE!9 R8kRD1dNljH>G1:T9eim$yAX^ja#p*Fm*a8C8tY@K5+hMt!^^BHVnPWaL$!P^?HAMpl#Yt6TuqNKB@Pm
6$Eaj< ShYeSptnnB8:8>\6\H8&M\wXuB^mk8$=RANntP@kbiEX+juG1%hBWl4C=B4?c!^\:1?Q+Ve95tXYPkFe
B1E@94 y?X\m@deI&W!>uXw8aTNtSKyE!wF#Wm:L#</>RWC$Hdwmcnj\:XRQuBWt+u\h&ukBlKPj$tY!nVMtlTM
d=HXBq m&lKYKbAnpTHn?I$^lLD%Q*i\c<YFVaYFbI#H+pP1<uGab&!!XyqS%AdwD9:=Y^4q>45VIXjXWi9!w=n
l%E\LS n^4*QqjbACP4/bdJJq8EJZK+BEY:@a=YSENkkcn^8DPa*dPL?C*q5/A/ZGRJ!+kmwH98B8BbiXZt#!5/
pX8@a4 <8tBI=EdqpDdBVQ9KKL^uHlLQJIYC^@CZKHPck=TS/i9i*$iwG>$ByPJIBMPP&=c5B=im=Xmu$QL6\yQ
pn!L&6 m/6NnDP8I!D#leb=peDVaBQCY<VZA?YkZtRRR\j46ybh%:/$p<HMMJYEXy=>LViVK8PkLhNDi+ul^VX%
SR5^*H mYYTA/EH?lH6ktyN4dZYRZiuc*k+9\+=8M\RuHuw5wLEw^nuY8VCI!teaKNNktiNyVa+?!iDW/^w$+%8
k\PFI$ \?XuFIl@a98h@EiZja=>VkKnMGYXKKa8jbwBq5EW>huW%IEpPb^4\iMQwkm9nei8Y?@SXVCu4=cl#Mdt
\$%N<F RbCN9Cdp/l9m*k<#ENHGF!Ba$YamwhGtDGqDSql>cuIkt$?C$<EZnkGFE8bt*+Hn>&e?EIQH&NB%4H6H
+yTpIn a:ywKP4&Ga+X8:kS+lmL!\^$P#YZGyCJkSi:dlJTB84<c:p$l#Lw?cF15ebXMZWYWyqb^c^nF:J#y=\\
c?d6%H hM\nNba45K^+!14nqepdTWjwhcFDEaXWS+kya$<+>H1uV@a>9DP4t5&ibYND51i4*wktHpl$DXk/d\hl
%R=k&b /YKidWcu/KKb9*LWhRuCkhEEy9SJmYAbW?$dCYcw:Ga1ZJGdCHEY5wSilXT\ntwY<u51aTnde68jHwt?
=AADMH khwC5=YIl+PuM+?mBe$S?#tYEK<?q5k\YmRtE*#n6EmTD8ZM$%$^#ulqD1X^KJHD+k+9t8M@Dm4q^m9i
1&EIF& Lue*BK+#VkR8AlPHnpi:@9JWhIq>p*F4L+\jHb#EMSNJ//Stp9SCS9$<!pqH=CPq/jLy8:tq@*GX/imM
wmAPPp X^ME\ZW$Da>jiB/\y*cZ8?AN<9VB!BV4$+4M%^eAe8V/t1H8ZGZF!bKNQXWdIG>CYi+&$^1+e:hqNlpt
tYl$!S bcjqpPeYQBa$=H8y=c?GZF^<#>m6IVyh*i8=B44Yuq!9+Xdi^a+?EWVWmKkhJ#Iw@ikjaB*TkD:G>pRV
@\>NY$ *!!+@QY>W8nqhEciB\!^D9hLT6^TZJ6A*6FtI*m>ITTynp</AY9\LKN^!JIRwcdkAtN!4*@EuwpFbGVN
#b*/n/ L@aK8CGQYYY>/SI?mqqWW>n<GF=EP:EWQRMjTc&/:>>Rl#cLliPSBe8YmpaN4!TE#lRBc$FP=<4jHjHE
TmCF:M 5Yn^EAnmlh>8mtAj/P#DkjEl@RpB+bV$c9FnEY#LyPCWn>aV+!Elw%#9yq1#haCL\>uPydpun#89Mni?
#+L8Dy a!FI9QuyatFLmC4WuykHpMDWYYNE^YhwtJ1a<B*DR#8+\qyWE=@@d!d/@@/b/Q>jb1HkTe9@#!ci$4D@
>PL/I$ Mhj<j#dQbQLcMLwW^8F9mHKw*J>pKqdB6^MLDB18Bjj@iSLV>LNZHVQ4M\*d/@w<qV\+haJL4MqK+VI^
aReSl9 /A/Ib<=M4YSGPBkPae8Dk1E<Y/BAl=eXykNEQk@*F$!*e9w$LutPpd$wZkPNDnIqVPqunq++=G%hX1E1
Q9e?Jd %&aRDE<i/4^IyXAc!c9uYMaXpYS66SRu&PZWGC6*+Il=iEBQ$D$waK+BXH>>mT#hMSHYBhHVud9?Pi?t
RYyLy? A1p!$<&!ZYi4FyS?&cT\+y+GeW9>=w$AdL5icYw4n<wJht?&w9juchd&w@+X:YQ&SqYb:yTBmHun>\P!
XX5SeE 9cJ>IlQi!jewq!yYIKMG/W=dDqPYIa9QXCjC5T1ZL:i$dMc1!\JPqq^yhByjh<1XRV/h<q**bC59=T#q
=AR4n: EuLWZ?4SnT>PZ8:ALH^WMy?+lZNyR1RMZ<hye1b=VjY@DZte>&BuGKK:aIhP1>6>*dRwJ*w^iLHaKY1:
cP8Sa4 P/NZ#EcpZT:EID?uXXSPpEiedETFCS=1<>*4hSG#aA6%&AKnLDa5GcHtl4BB1$mu#dEb&hy$VnKGy951
5KYKVX a!BJm!>nJPBwdG&C#&%n\@>:4py4bGjDC\V5hcBqEXjL!$n%HbDZM//lH*yLP\ipbX\D#lj%c*/jVBcR
n/BKH@ \+Q8ccF1JLQRiqq8Z44ajpkXHIj%DRRM$iq1h8lJqmKuEkmI4^npW@l?Faw?VuJ&N6nk1pwY5nqQb#<q
c$$D\w 5k=89A$qH?/Hhk\#MtdNkH/TaFkt\P6dL:^NERi\Cna<E!N8YByca:HBqCu!nnY9B\>a+*%lWKa$CJTq
Mh=HL/ 9b/WEWP<NCSl?F/qt9&pdkep<j8Rqu6#G@IXpTMLTE6V=tl<t9VRkIC55e<+pdX4BIA98X5ew>tCGa^E
9?Elm+ IBMJ8FIepLi#?Hn+mK&cI/1*IR#AZh4aI@P/B8T/>RE*ic1PM<PWacmVmh\PYZ&uq^?CHj+ui>H1Bel:
hB4M%@ PZPVPSS/Rwct@1L/QTXy<c9FhARkd&ZEtk$ALnd!/N&4uAwCVXinMq*jBk^unAkJiBBWc+H$k<S\LGlj
+8q?#p LBi<BV6/XpLmpG8?6t&Va5hjATyXLWR>n8NZ8b&BGBwZKp?8jyR&DyX+kk*1MnuGtM?jp*?/%>Bde%YW
-A>41> 000212217de001202b4 Page 300 of binaries2.zip
+wI6^= +?GJYb%K*%bL%Jl<d/%^ql6<e?$MGlTnN=n!HnZ>SH98iE@RHRc1tNQKmep4h8Te^::1ERYwW?*jld?4
J<4$4: !$15V8J@#>=LkGC%a4Jtl^QBR@APd<V%%1KJjdkhJiwX8m4Y\w!J:XCJd6Xlu&N?><bRE!4E\:ViaCKk
6lDE8d d1L<=N/8y?DHSI4^Dm/Fhq\MHRDBGwGk<B#:B48epq5=A!&jCT\/B<qnY1RnpJ9q*SWlSalF&q=bwN89
IC6^\J e5\I\\WABwd+6F<%ch/Ll5a:LHWZF=X4cTpy=$a*1+ep@w=%1m$$Jay<py^N+&DD&/NiNFV&m?w<?I=b
=bX6\W MtqX>m$$keP4*8TL!9\n4l%QK$$EK>M8>S=$S5i=eB@jkPcRSD:*^?NZp=h#8kyK^e8AbX5hJwuF\X$%
TIdlbb @SFDK<ema@t?>1@&/Al&jaL4<wI%>jequCC:#RE*alNLZ<EBQ?W=pjPa+ci!*H/k>A\9SB6<^d=:jl4Y
b/8L#: 6u*RF%1twtZHIkIB&>B=Ne!4C!W+JiX#L*Y8+ZK/#cDY*X1Q1SAa\K*$bAelmyy1HXk<@VIV&ibR>EN!
J/hinM 1Al11m:?#QEIqmmE4w$iI=9maiJwKA^BIEwXE\p++kTR%@m$HZyGVkbCWu$c$TItKCYnKmaI!LXRL@\i
m:wla> Dlel41^F?\Id>nX9Q\eGPXWyjZ!<aNV16P!n$ZN@jhKtFib5/blm>PWJPamcE6N4Lkc5>NaaP<H1^8Ee
<RF*&& mbq>!dBYT=Z59b>pETkjG&94V6@LK$:5uanh=:$^kE=dbh5QR\dnhNRlpm!4Yd=!@Bn@l?+qpaRWC>Dk
9iDFcq 8hlQyd/5E>ZMb5FlW=MyVi8/l6%DpJ*qXIlVAc=Y5ah8:BH=VJhAc=HcQnZJCJAQQlcVGYXJbAVS@tEL
!JbIMm LZ:b5TTV$Q9p^h9=XkeuG#w:%R/=X\=VdE=8VE!!11E\VD9#jaGjp:&n\ehjyY&ytA:ZWbI&pb%@KXjC
GDpX&$ <Y4n<\he>=:TXb66jw#kSEcKpTu1^tja:WAlWZ#D@*E?Fh!Wn$!/?!^nWEjPA1PiJJMMFIiqA>IN<muJ
&9I4Z$ De*B6$=%t&:=MbkawV%%lIAeRW=nDHdQpa=W8ckucjM=9?SK^59DnYKj=b/PkI==IqaNcjbe4ib&IWBc
@WVIph #/Sk!QEq@E%M\%T&E4l^tL^^c^l>kNFQhAbaI/MV*t=W%PICS?$MNwH9k+#u^LlpWHKQVL89wGwAI*aS
^\&4DV u4MtQMGSE$%aEq@D#5ZYDJ@d&DIW^?Vb4+#Vyy5LpBi:w8+=RwcGBujPM!V>XIdn?IH*D5kXN4E*hK>!
i?&>pT 8>y*qkX9Xdct$HKTGGc&#*mw^\jp!lL@4N<hTHS\R<=DQwK*YW#mIQRD=L4tJyVJ=kW<lk/l/Gc*+5K:
9epPIW m/WKwiaAey*yjdiQM8K\CJl4awH:L>IQ&AL%AHt6muVbq/$/P?c*QEV#<4EDP\&Rw=CA6ttJ\WSTJ<8k
R44+bS ekipHl&+?%>ykG<ZH8@W9wi%aYnD/k$c18hy9+TMcZ8CX46kZqyuhki8=Hled<h?V$BB/pRpQ=*h?be6
p/+6d\ 8y?ZuX:^u!XZnT\8NBd9d#S+ZimN%:@iDIM&V1M\BKQ\Iq1aTW#tTQ9an&pBJ\j#CmcZD/B!@9SPDVep
?MP&dT ycqD?Jwej*nE<dI4BZPnRS9EeI!G#&lmL5=VT4CSQ@$#6unM?Q9pkm*aY+PT$k+nXLd?4^n^9meRPa=j
utkQ?/ ^%wue5yjNm1A@*<AA+D<j=C\Q=BL49%$EhANdVcIb+DBtHAD8?59l@C4+H%8K?#G@FMLVm1#YImq/aN#
%\lVwu KqGy!ht<>!wcwVL+XlBhERKtGkCk<jwT$E&Ye:T15<4uQbYFka4H4:naY5M$BRmq5TY9Vj<V:nw98@I*
6&Ncun NbRwp91cbd!4E@4hK^Z?SVmIjcM+pqVEnJyK6B%H8J&QAcjpca<9de:Sud:RQt<QP91\ScuC6Mjuw?mN
YPCmIS cXaqlTjJTACi@mC**Vll!t?aGu@$ywEb^$=b*K>:#J4$h8LYBkA1$6MPLPZ=BSkCDYYbTa=eRBP1jDwA
QH*iTX #YIcG:Elyt/c6B*ytB5*&qcm+QM\=DYq@TnVQkjQnRQ?IlMm^>>waPm>1Fe!C\=AmXIhDt6ABit^SqXh
X&Z9?G kTu!V9#6K9TAY=nY5tn&:1AM#w?tkM+@dbpwyy9nnY#W<?XWn?4u5eXELWRD9uGH9>*64Z:aqbS99MQn
i%nlSF GjbE4B+EM>!:qMwZbD5h*&V5P1h&Dy:QPE>yF*tNNQ>MY=/<aiBMDB$EAQW&T+b@ca4EZD!>uP*5du>y
e$HKd+ !6L9umnJ9Hq<&!\yqMA/ZQR4kV9CHIyW?d@4bQbj1N96y@Ia=LbwNcbQn<HeBwSdZ?\C<WS/VJ/9j4uu
mlGW!y CQ:&nw/*GqS%P?EYwEB%X$%&@pZ81#N*t8W#Lc$+I@S:Ry5G\V:#cV/KN5&+=uPbhL5H$euV@++BEAAB
ZQpAAG ARD@&Q@kABBKSpqGARD@&\BDAAwHB\kHBkwICAkLCkwLDlkRDk$NDl$XFlEaI^<qJCIjImEtK#e9Jmp$
59%Q9< KTEmMEE^NDp:Qn+?JT=ETWM<TDe>Qn5BCk5LDk$PHBARHD5wImk:@<AAERkAnkB+A\EmAAISARMSAj@E
Y#/L*K AB<FARECA\RFBkeICRwL6SAAAkEDA\IEA\WFBAS>AARSBSIlMWEGE%FlB!J^FDKBpcEII$K^\SXT$jAp
\5W*KP M&J!kkpKFleaGSwqJmewKTw$NVa*PDp/R$SFSphITWyVXFXYX%lbYtNpbYbucGq1e*S%huh+iZ1DlIYG
#Idyp: l+mJmyKVqJYYq=mbt1KnyKYty/my14K#6LY&6:m=85LD^MZG^<nJ!6LV%NZY%>nb&8Hm+?Vq=8jw/i4^
@hkXTm <9Q$>jd*?Qu/ARADERIEBAMEB\ECh^EEBTE^BlJBWRhleSMmMwEIFEKSwdHBCTM#W9AXauLSClapNPEq
kNSX&E <aLcAA\DARMSAD<A%68Dk$6L&=wA=4yPeQ$^Re>cW$a+yDE&u%w:$8RF!TBm5//%8$kJXYL5QVyW!uGP
jPmHFu ++^e6nRw>/^B+kX&\E^>cqn%wFkGZn/Xu:iJy:KS4=!KK1\/lBPPG\*wc6A<C6XJQa#cc*F+w=w*HFLV
+n5>/C EFL@ADyB%ycaAiPcKMWWAS<<Ww#Smke>cBC+=yHhaw&pe+XSptuki>ai5*&e\1TEHZHe%uWu!S8ZCDt:
!ABceC FC@%Pi<a1yKShkK#Y+J:u*y%^L=I=?<j$1p$#Pjq#ZBh!h&hn6DSFk!lVql?XVLICMw?ja%Bd/jNeNkA
NAyl\! <%4&&k9n=mAcVR+1VKWe^bn6dc*yY%yPw!ib=E=+Q*TVYQj&p%nNphQcuY6!5!nHD1ccp+P/B\W9hb&T
S49BK# u%w##Yhy%<JqCP*#Aeb4TAGM%/EJ1c8nmqF^htGMnIwJ^%wyi9FYTGiiKKQ$wwEM^?qP\cB/W:mtI4*e
MaBe8M \k6*p>BZJ9L=p4MVpnp%5iId9!%YEH*Ne*HITGQ1c<@ET=yY:HhRZK4>!uP=pqJJ:%wcjdwAGabJ4Ped
?1*+w> bmQi6P%PFGVmw/Dy/!%NiPSW\FAFZ4i+*Ej!4KTSCQ9DNMt%MYei+DLHyT*P1/T%Nc@6@6WJ+GRM%!cq
J!Z#^p 4Y>\Sntqt%t<uaqytA>FPBWed@cHQtdtdH!pH9:$e461e:1^p%a%+C^QtS@qY%y6<#PIbM=QVNe^dZAV
!4FA$H njkn?E%em%ELMt^e5D$A=1KeyRu=G5+^uD#P9w^VEdim6k<nNTA%/^=aawye?qFAlwyGha$L6kADJNA!
/ei!Gp PKk%CRSYE4qh\C>KG:K+q1:HG/qiNh*Wpu1iQyXATdSmu!!bJC<XAekX=8?=&6&&H*H#M5k:%G$:a^8\
GTY^Eu B&wDHHYtGQJ#Vmb#d*R>J&HKpn<c%dt#ijVw=+\YQi58GA!N\MAhVZV/WXN9=DhD$#Vp#YlB#VVPY&pH
L<W9&t BFd9l@T*upc+pWlFGF!Py1%1MCY5m5aI&B@MXe$:WWbXSXC?%SKX$dW<Pw!8&aY4&J6:l5Dl1k$1M9iJ
cWq$l# <&MG8m%5RkdyMbK<XlcalF$GZpD%>KX>AqD*6D64Wu!F*hlmyiM<XBd8YlHHI1ducK>KP1QPqw^&e$Wu
e#KmH8 +WXbI*hk%Bi!1q1+aA=BABy?:6WF:Edm*KkjMPqKh?X&FC*M4uF*MIRuB:%Vi6C?miPe4ICKw5Qi9MX?
@BIIbk y*#6$I^X8#A=JAQ%16kDp%Qb!D#Cy1macTLWy!Rm<W/KYcN<uy:W=+YbC/NktwFD1j*1:@ep$njY=5Jh
*>D*6% YnS5$:E?8AVmw:Ja#hLLCGEbQea#WN8/#qauRLGPwHT6pYwp&NGNwZkXDN6h&bQmykdt*RhSHp@mcbyh
%dGbAj 8@&TY+:eIM?y1QWBL1Y455Tq\8EZH6ZS&?uLFa^&#EHc\b9e%6Vy8S!XKmm&!i$W?Zu5V%1$KcAEAA/D
hRX$e% 6T@nZjFYXnld8^RcKB%=wymIMawGei%M##T=^!Kwk!ha$+!A#SnI^#ZM!lWJXX=>c:*:\\iSYQjiH+dq
XhJ%M> !<L?Y*y&4p1$L8<V1lY$6I=R1VVELLKCPK$:uTy+Z<6GEnD1X/XWNyKn+pRk?>e:VY=w6hnT6ySI8G+N
c>QTJI T6EBWX1kMa+1*HuGD!Kk/WJA!S5Qq!c/T^m<!*b&Wka#m5mEIY+Wb4w4HDS:V*HNC5Y&:YSVnkmkGI+%
BKJKMA Z/D4WuWXyJDFdTBy%E65=AapjMlQRk?qZdu\&1uhDNkHwGHFilCebLR<!eJJ/tD$IFGiem6GZR48QqN5
l\wlMd wH>$<%RpmiF>pmqY>CMX1bdDi=wy8V?hFP\mE<>/Z=iB?6IXAyXREa*CkR9GeAe%bT\iSiiM%h$#VRS=
GHIuhb <wHQ*Rc&I4WAb&%EtcSmntbNJXRMCwb6KntVbIu$ahc/64d%YwZ5<ekeXp+t!hnkdnTb>QpLdh<J@mHc
\bHknR pTMMPK:^4IMlW1Cy/n5c!du\>EG*^D!!j+V$4tuTi/PtFXdM=?PA1\QIHi6*VjtSkPV$=ySw:BQtQI1i
X^/kaJ #k?#<H1VYP1*PnS1/LF%A$tu!^n1XNd?qTQe/Nc!!DLGMd5?6a+b=n=eTqm*YWA64CKDk:FA!P>hFLi=
?Iwih6 #X4Y5Wb%<1+WnkXLQd&>=KIb$DDHDh^V:&L=M@mKaibwtHeC8p=nu6Y$b6QP?Nm<JPM>^>cK/8TNJ*cK
K6Apj4 XR!TL!KK4u:tjKidql%Gj^1%y>8Lm+WuP%iY11PS:X1/ZH6l!V!^#t6G:ImP4N!JN&AB^X^YWjLupeXt
I+LV4V Y<nGRe+FZRkdeX/ntwNC\4^F@LLDh/HmuiT8eHnNX:m$Y<l*4^IB%FX4T?p6ylc*jI/BnW*5M9t*C6n5
6>G?l? iqI>8GZBZ>K58hkW6!lQWXIE!M<H%yZGab6G*HcTCD$yEldhl$H+m6y+B>:FPYFZGeWtq8NNqP&kI\eA
\BZAYY D&GK84<wFL5CnAFKBRIbeJ8lJ^$1u$MVi^4RpZMbH1KyIt/L@hNCAjb69eqn\PBSXi$e?aa?lWpWWNZC
a$?K\< =\RdnFdq5yY*Si?BYBGN$14/pX$ej*AP6c!Maq1NeMCjY4<Da@G5>PACK5^MiQZNTcF>D=d=:h/l%G!Y
edPdS9 /l</MjPPRSW5VA<EWlqN6Nn:!Q%FJwES/be?hb9DIjtWa^:%i6bewlQjm5hX?!/\!L>&Sh&K9Y4u:PGH
H>dl@W >@nNS=Ft4WVKWPW1XVqRcCMmyV5FmJJFq+:>/pI:m1<miYh!<GywyN/=NN41lDkM4mwBHl&V5*FYB\cS
V5McN% q!RcTa:FARiXPbV@ABaGQim4e/KI&d$=w4SYatj@&bXh@I6*\:kiBiWB5\Ck6^lA>DcLi^ZAm#DJ<aH1
ITCVD4 NtJTd%AAu&?i=Vp\!1E\Knp^W9TpSTQ@C>:BGG\Au$YImi*!/W!?PL&=d?PNSA^P:q8GAJ>KSGZqAi4V

-A/^W: 0002626d65f001202b4 Page 301 of binaries2.zip
nST*WE cb89==QZdD?bCwmAl4RmR&l!cZN$cYWkSt^%c&X8ID^nB5WBTAt^#\1uF@:bchy1m5TdNd&KAJ+q1@*&
WuTJbe %BhuTNVp@+uybtYIE<hTKV/iAJ+^cI5R%G=XX1:X$a5ViaL>aD1/8ACk+a?iq$>5cpI+i5\=eCkylIEw
JIEb\! T5A%qCpE$>@/\<Dp:?GFH8R8y+u4\DP68MqTtRXYwML=t!lZ\P+A!pi<==iREK/4#iyKcZbXp@Gk:iJ!
KbTE/% Y4WjM+nN8EVqDl+>F@yb!PAZ/4lTlH=Vu=ul@1N\q1BbQXVQ?KT*SVZ&dL#\:!*aYB?pm8#a@5=5LHPC
wNhyF! I\pk5\GST>ucuiGphN+bC+66:C^wiMmahpeTICpI%N^XKAcDlEkkqm#QM&cl=:4Hi<m4k6^=h4kPk%X>
hh+qBD JKi8DW$yBNeHTQ^&h\@hP?lI*4+*+&d\?p5&?WYi5%+E@Ct9$jFD>5E@yc$/Ph<@C&4?!leyBDw<E\VD
:^ICDZ tj9y>CmKuHQBS%cIZ@=Vk+euQhINtj5FMTRXYMRHKWmRT@RbEJEF/nDGIPq/ZwZ>q&!4&bN1KFMQ68>n
+n4/#8 GSd5FS<$#GK!MBwNI^>pbNm?ELF>AB*:elXw?Nm*@99K+GZ849QyPW&Xln1cLmXVe+N6?^NW#5u+9X#M
wbnI5j =XDReCD%/iTDS8GPGW+#hhE5ji5TTilCpbq^ulCM?epHhlMEnYk\<F>=+4je+<bhbu/QiX#ISRdYtZ</
u<b+V* PMlW%CGMiWPNbTj?BDL5=>IjSyRi6$cB\PE:A&?i^k>Lq/pYyu4hLc9jnt1kGPimd4qVae\1&=LVjtC@
hh=KVI n5Z6*RBQ9muP&amLR>Vc>c5+KAF9#JZY:p\X6W@jju5KlS:m4t\nGMJ?AJ\QcA^a+:bQ?\LbwY</@&t!
<X8pV\ Y5>yakCk$\p!6yh+kmXdK*5j4:yuRjlh:XClNiV<SJpw+n4C9JqDpIHk\+Nh9T1e?\BHtCZ*M8\ND9SR
CWe9VL h*m/QpkN&NSICm\n=PqIdR>N$6^WL&DHIedydBkwp?:m5WIN^mpp5Zc%A\eD=VG@?Zn/#*tylbt^JmK$
%Hn+j1 LeX1aaEt/cy4eiGhlq1@^T*YqEX#myt:X$8WqEDRttjq@QdX!#M:hhN>bSmHGKX1w\/*q=//\lMD@n$9
IX+?QY C@5HG%@6cYSmYV/*n?>+Hj\MNnh@Rlu\MJc/$9#CtXBuLL?cqaVT\!:WSeBe+jXm==nJ%ZcmwI@e8jea
YHI\d^ #wmAG8RBTu+#QSVNMKW?SL8ewcHB<^CJGl8pk#JE#\AW%hlEEZnk6@t!nC@BJB!\nATY/w%mIe$FtjWI
6/QGW! enjAnchIA@>HeHt8N5ZtK!$>w$t9HW&n1EXXJ^VSi#EV^9b>m*Py#B=bVX?Vp9*SwE5Pw+mb\^4^d1<i
\&yT4N X^kBmDnVdG<?/jaQwGNmQSykP6yTuAAjX6^y9QWCY@B\m6H:/8Su4jZ8@+^iaL1^bRqq+yH=%T:WHN*@
:5h#hd LGhQKia+ceJ9eKX%+TGkR5^jDS1R>twwwwAKTw41/l54h4m+eJG9Wt9N6j<AmLMd8YLV9qn&qA^HQ%FJ
:ZhRnC 8^ea*P/89E8pYh#>ut9EDn4npL>VXcV^uwmNldp!iyXiB?J4^N4>*dJjPjW>ciN<1=Rk?^FLW1$V&N@H
#KS1>5 inS96L!H*WbFcF6+n$1/lEmZpa#@AAp<@qZlpe4^N?<Q+G4<Y5SSewu$^&w%HcDQhI4mGjQqT1?Q:y#W
diydlk qiMY*m8+ltYTP+pXkiwQ</>L<P?J4ZY+FViF8XH#IiN*8KE?=MwY%S8WWWXStFFFFAAl+FAHI@E1/pl<
yiEPn% L9FGeGSkY@*RS@Wm9FyHpju6Z1um9XLj^Hj^cSAHXIGa*LunK=H!n<RK=QZhP6w\EkmEaWea4N!X#yXK
?jMeat Vne=MEl1qYYSTME$>wDtpCMlAd<DX*Sq!5Gqb8G+ywjA/%dn6VKM<ptwdt$iLJI^T=pW+TT8RmWk>/%h
B5k!&p M%Pc*tX+=TnKekk>K^RVtyabGSl6/$&mI8#Qd9D9nY#%BE64/Xdi/\PZPA@+?6hV%=FjP9uTM8YB!9IN
VL$CJM iyjDVZb6S6J:GcSu?#KyVee+!Vuu$/WIJJQXHe$WWW!AwwwwAKnuayA:AbIW+FTW%$EpdIinAmkEiVYW
lQj&@S lt8:?+B#q\tS:bJ@uXT@W!ep<%w&>m?nyhY6##J>wjH8QY1<#I#Dm8Pd>+>tqG>NHQ9bHQV>KcLLj\X+
&4HpJa 4cP\u&yjLVGF^T=&Q&KKX4clFA1T?6wu6#^p%c<wkb\cl8AjJan6W1V8XKKWVnb+@LqK?>NS5XJiNth9
j@h%*i 4WANh!&QGqw!<5t?MSkEHNh4<ML::F+kq6uIA8a>8e>^!K+FZae=/X6?GJ:kc#C68N$<nBX@&Ti>A%1#
^lIwd$ /AwyBuA#%wytbYi@lTQj8GK^b9Fq9HeiZ8HY8L89FmQcFIu!eX^$?y#9PZ*u4TVG>D*!$%PG/RFYFW6Z
EXndPT <WYYnpCdLE>A9Y9L>G<W#RS@M^+1l186#cujB&?/y:$4lwTc:+58:4WybQJCwZPAV&#VdZWVhwT9Wh5%
dnVk6? D1itiddR/kCw?$Ijp@8+PM$@\*ynd==*B<6X&nn1c^pw&8ilSqW=$8nIL1:8qJCDH+%Wn94yu\bqBH9Y
H+wFWQ q1N8#q6tee>K!$5Xhh4bHPTi>EiY\XXNT$b6YYy*MiF8I>/u?IX5yBHMtXPXd9ZQ&Nm<PDFIZVwa&:%$
NCmG$/ %lG1SdBka:XlW5uwhXHtc6I=QZhI<u><l/=!K\MEX/jh&EX!t!Xh\Ne>Q+Sn<\qbTFJ/iqdW/1=hVp4a
VA8/$m cVu:mPTHQB4c<M*Z&LY:Y+Kk?ZIGIJ^^YqBwhqd^!C+khp#6MlQK?+4unE>y1D\b!$dpbFc^1KX$nuuS
uJPpY4 qT5=hV/B56i54$AS!4uHVNFiF&Y6*NnjB%h6w/nNFX1a/FdVEMpyB!STcyGIJ\F+#ZWcQ+hiNT#L!cwi
Rh!!4b INEu<#emp+w84qe45e<p^ZwciLnB=yX$&+DjMyFT6y#:qK1TRcNCEth=a/ddV/QbNMB^ECeuAFYLtPK*
A*Dl+e m<mBR1n46+!c=!+%Yc%T$naEBeHcS%1^@dAW5$4bB/%^!=n*1MwJL$J=I$ZPRB:$=LKCSAYWN:kXYp%!
84XkDq #qW^K4bI\Mn4Xc*9=dJ^8dMb@TyTbdqBt:Ba&<S!wPc5^RlH?d9$NWLc@ntIbY1?LkPMh^YWt!6EPtj!
!w*uYa &CnFSZRD&MlJIPP%E9:\kmqqSZSatBI+J\cNpR6bGVb:^aZBuatCJTS8QB^#ZFmX=:%4l?T#Ft4yQF89
ZJ/a^a Y41%qaPG*H>+X/L:D%4Bl6nJdtSGAA45w^5t*%QQ^hSTcnHwR!!J9PBmmwt6yM?6FhFn#n*K^5XnlAeD
DH6=VA NW>T$>bG+AI4Pt<WKuCuJya6hF\Pc=4M:PbGb1NnHCyP$X#L**qZY$DnNhQ4X#9kdd/X\N\5=qb64hc8
a9jXlF KdIqJI&NY8E8DC/DJWEGwbHm8WCw+DKPRiMXqS!tJ\$4NnQII4yaIwDFHP9q:tZDB?nD@GqJe8=6Vq:S
qa^Y#E 8^t^Swl!ZFP8JwkuM!@nX/Va8$LFCtBkpuht1l5+T?><8RAPiqS#L1de5p6EJyh$$h!1kpw@T8plq@jh
<DbA6C c=8MKLwMB\K&LYZeT^1J1?yXPVT5deJDGwuX=jQeMeaPBVIb61+HW<Xi6%?ZGP6e:b$^Yq#!eLtVd:%$
K$!CMK XwAqmE&nNd8p@D>=mbbJBkuIFY4*\6NcAlS^ZwTd5iJE=XC1TjMkIw1^e&F^HIS6w1ibl#SY=AJTl*Fm
>WyQpa cF%S$d=D^Y^L+dd!Tic=?i!c*pKA>/$WSNtw%?$<cn4ZRcVyX9hRlunB#:X#it&VT5N#eX*Fw<h4cDd&
*+LwnA FWqaVqe4c4wNw8t!Pq6GTFQJFeQcw>^bqX!GS!PP%hQ4jmlI+Yk#%+4q:c:F8::e1J9tW%M$&nTm$ycn
lh&u#I Fl8N&GJ\K5FY\F/WNi+/twH9R*NbYdP#tnFdp\AH%1:FP5TBRii>adZbLeet4F5#P?+uJ@RXMw/Cy!8#
&CMAZA yLJ>#/lI*KAMt5C\aKM%6ciYpp*i>ep6#$I:F!&9:66epmW+WN>&818FTc!Jhjt^WFnyq55nZlGbG/ty
MwL?:i JYMleDym9Wm:^QFqG$nlyydhhVcKRDGcK^9EW1&&8HLa=w4F1\>GhW4NNbq5hSZLZin#*M:Pti6iu#cQ
KQ6c1L HBdFWHAFWNP$%Hb5khc$X$b9qb==Fy>=c5PDm6?KhE6h5l\eX$i5cjFDCY&nkX=y1%:P>$di*!TVnm4X
w\Zj+G &R:I#>hmi+%FW6%MnPeBX=!c/:\%+abVHFelb4n9npSk>RQ/t1tp/XJC/niH8u?<\=<5iu%4$4RhLn$!
:PFZ9K #BaAP*Wt8lSWFhtDjM:I<+<a/VyPqZ!^SRFAX=KE+*X^4\q=C1bIHyZ1jmT*@6Gb\aSIyaucS$4ny6GT
$T1A1Q *LFWbT*AGe%qKqLhHR1$NE$e<q96PD?qcXuA#8FA1@d/FLP?FX<h//c\<K6EwJhImiydp%t1E=Q*nZ/^
TA$J!! CK>*ey/jw$p$aQta@\CA%$Pu/JKkG^%dH+XwYPnYEKkT#NK*8iQ!4Zm5daL?=hqH?\&K8iHyY&JlnK!i
AbF^9R =T6b6$Mpw=Z9VR?!M5^:X1C$nS%pKltZQ#aGc^jE5k6aFpnH?6PAB/$8XSXwm>w=P<nm6V$Ec:4J&hM<
tZi6wD tm8+<QcZ=WauqZDN#ST5S#G%N<<SH4YjbR9DI^I\K5Z8w\YWi/W:S:%k*QnK^lanhYVpnTMG?lH+6%JL
HX:5W# c*K5iY+Fe4BycYwF#M8b=PR9eXjq%C*<R*=8JW^d&j#HQ<S:C6uR>MN=Md?/ZEa=WN*@AQ4X%$E8Ztbn
hywd6q ZVW8W6iG>C<mQ:XewFJ=SB^m6&TJ&deVqB$ZHT5:WjE6yy@!L<:nnFe%i?I:/?elG&^=+A+1:Tp:tZ8^
KlWFib Xm=1c6E^#hS4u4$J@T5qSHLJ=eEdVPP4Nu4TY>leZd6JK&%S%a>BWq:h&?u^@b4W:VnMpl/m64Gh!=Ca
lIIpH^ wFJh%Jn?<*SXQ6/$HWDKN$aIZ5V*4u:KTZYJ?Mm%nPAD@EjW%ju8w\jLm?dd%ctpT&ceX?+dq18\c1/N
XH$nd# pN#ZPIeh?TM%M5^CnB=y6Ath:a+BID@#1^LdR#ACTNY\enI/G8M5J*XR+J>1/m$9>!w59W<b4t1W:cw*
IuI?ub lP?nL+WKMAaFFLSYBwi4y1Rcnml\Zw*t1di>@JmH6iLXe+k&Ej%dlGi@mQaTAD#PHMLkltKdk>TT8*l=
iFqu^e FImVR!n%WkCk$nZTeRcu4Bh1Lw%8+*P:M<wSlG5AwM/%5upiWcpHE#1G=5WXj4STkY8cHXBlhY\kRm+k
@5E&*e Tt>wduN9eGKZe\CjjHdJ&weQjT#!m4DVy?Kc8IQcElkAwKuR=aMa!QKFYpulTln:peR^MuF!ASWDBVA#
e6PCqd 1DSmDbC\mC!Z*YeBAYy>B@+6X*l=N<1lPVP%%iZiCGewDJt>Vc&QEYHdB+99i?BS1iE4<n9w4AenZJw=
eG\4WV p1<\N=:k%Dc4/i#y@jD?EupAtRuM4uWZ6*jM/ip*4@@^%WwbL=?HA8FdeQC\V!Z:JpV?VmV>YRd+XN4u
*IIRe+ C%u9lu+M?e\mQK<>Kh/5XY!DGB+bbt&lut88L&c=nC9DB/QBauCJwBj=6q/4#?QlwRXnNw??&=?:wKS4
YtG&@6 ^>tHZtcjeyVJ%qbmc%5/n<dJSN4Jy++h!4DTE%@h>mdaA+MG4KRWmE@>Dhw$%E>SECiwy#=hXMVy5u8C
9bD+q5 +BDMNCB%yW#&Ceuab<@+@qVc!^@uT6SX5$DX\ymdhGmtqwH944D:#/C:*R^*%$jmDINVclmaAKCJ\#Sd
JmEQ?8 =&c#^*<\m%WQhyYtqF5Ge1E%=j$dinMAJ&H/=u^KFA<y@JeVEZ*8@T\?&c\GkkkE%C8/<?mbn%Ka+%:<

-A5YBa 000fd2fbd5e001202b4 Page 302 of binaries2.zip
L66b*b M/@aphQ@#nZNTc#$+$mcVRtmy*NP^i+Btau%X=:+A/@:YXSMHeB54CLV*uVqtl6h/uq^@ehZy=BaT*lK
aBJG$? :A4be*\A+yc#NWk>:G6Pt>>pJ?&W&JKnIF%KBY*dJ%Xp$mQHAGSQG:h1Zi:1XGqJchNb14KZV\m*9$Z!
ZBup:m :X=jdnXE*R!C<umqhl%qJ>>^e1J!G8kMjS48:hPnMa?PSV:6iJ+#^I@9A!w/RSZYV<=4X%/Ti<&+F:Q&
V!R\u@ <dX8EN5c5uAjl\GC>Aap$I5XZkldc/8&?4jZLX4P+HE<K4+YERKCDACiPZ:Mw@YSG#\X@1YlNeqImX1H
1c&uYC t6EAu$*+66=\8\hm5nViFkT!Aj\htH?<kmnB#!eD1<Qt*dN@d&+h:lyPtVW8!W*uaZVklq%L:D4&L$%w
W\%i:J ?Xbad=FnkYeND=dASS*PnM6X4GN>DAkGV4d+jVKNFJtXy*EwyjwIDwQC4ipD/LS9PRV8yj<XGh\eej4k
^C4YIl FV+mPXnnW=wHWpiL=ZdFdmDJCZQ*JI5k=Y?Y#/=Rek:a5WWA?Q<DWNk/+#LQ^bY:>TA&taYHA@+?q<<Q
VVNS8n 4:k6$wSbLi?GGec1b#qSbYMI>496E=wJ^*E+mmhQVS:dDbTHFYV\6iqlX9j^A*#p\9@j&XcRCk8lam%w
*yDInE YRjandJqp:uA?lIYp>/LI5u/I#>TeT5H^l^tm5DN9CyaeRmPAEY65w!BIq\NSTu%l@+*ia@+:4tF?TGW
ZZE&Ql %lW:FARA8\!4kL8TTLkl&jTa564\T%pYl?#hW%y8Tk%m=eedm:ED8!6WY^Ych<+<*N5MH6VhDyDwq6VV
XumB6$ ey19*!lken#ISqd#XLQeAIa5VjR:NWe4:\STlct$$*uR=DBR8Q?l^%Y<:htIYqdca>=4TPtRjL6<!4FW
SPBQDC yPIm$w9#e8bVAGSLW>*1yc>91bHW@nYuB1S\Pem8cnF6hDhb#:G@==8j=Gk*E%w&&XYR?@T8B^VPlM:T
JT:e*B G>L>Q=%cYXt4n4dXqB=c4q^+556NkEq!=JQ*WVp6YjI:&Sh$hQ8jGeXtZumdVhPhp8:6Ebi1>V>K</%:
j<WWiW ^yic8=T*L&68PN16!*8c=^=th!#5Ya>T^!c/Iah9+ta!14wiuT@E*VItIlk8JSunnFS4<VhNpjEq4QG9
G>#HD^ 4\c<!!i6ITc&?4\M@c!QW@<AlMNC8!ALwwY@9wSW:SyeSmYB$qnQSqPSZp8VX8\%T>$&RQcZD^?1k@Kj
@TjiGw 1Kl+c*\5yX8=/DNd5P%W*nIQRW@SjE5G5kY$/mG:^\Q+Z?u9:Xb8aT4Xlb^htdZVX$bEm?WT\H!u1QTw
@EZH!G *>c8!kXSp^Gej\H>K$VIIZQ6STTEWXbJCpWV@NcV:Y@8N\c6S/^hY!?Vh^mTQ$ebFblRu9#/+y+quYM1
$6que+ #B%>GFN^8JP^c9:&^T&<?&hppJ\In!Q#4uLm+q8bDJI^J:i%V#pP\GQ!1I^1RAy/j4Y5IKJEyZIeuGBV
RbX@H9 $mb#$1:bcib*G+aZPMt8u$d\?lVjMkIB!8i>Y=YCEHJ&Pe66Itp6*tKHcw+#*wjT*R^1W?b?V:C9SG$5
hIRlE= TR^&/wAM=dmyZ<NyIRea?WuI>c!=&hVwI<1i&d#&SXQB^TQc!S!?Y!pMP%iu\iEaqqiSw^>+a+/+w%Q\
wPdTS# 4HJhRTwB8iVJ+:h/4uM@aHtWEWwtBnJX%PRil#ZYY8yV*X8QQ!JkPj<Ac>/%NV<NLdZQtRSjI*IQyZNy
K>hQT6 DeYi4\I+Q#PFCp>mcmcW$LqqB?Shqtj*11<4H4ZeZZle:enHV$4D8>CiLQFe<bw6^b#VT5y^un6SX?jV
*KImWZ mMkmm6XJGhtb8ieWnuEdH&wjmSl/E$uWEiw4SEFI48FT^Y^qnHSXB=NRppQn$1XZa1XZm6TDd$9!bLlY
BVDh*$ WDal=!P6h%cdb+FhE+A+4#1^e^!^1iBuuFiqcR!#&!qRR8QT5=1=%WHa8Y5QQNc5N5R8eb14GAGGBYlH
G#\lZt I1y!clI&qId=CnJ:%DIm+^nPPqVd<6^VYW>cwSS8w%iQBZNeX+y6FF9=/wBJFlkjyZh#Sqw#n6ZMc@B@
\8#6NT w#:8lByhSQYLPn$&h:4T:cTRAF+qQQ$1P>5DIy+H=XX$TRuTdX5q9*RH=X4^54DBDX\6Ew+9WNPhCV6w
Rl#!H& 44d9V$uRpA$W?bwLHnE9M4ph&NN^VWpDuH4Wk46Pe!y*Atdk>iqVRbpKnGK>C$V\XaVcdDJh\LNJenhp
G+hD+k >Suym54ZjBDcLG>*c!6Ndn14jin?6cKSW1Lm4qQ\%y\%DWFTXmI$=dHW%/ZCmR^lI%C1w+A4#9\nIB1K
DWZ%Ac wy!TPc>HmWPtKtY=6T?EwZ81Qc55h9A$$4?k+FXwZ<SVE!\RbLH?NkAK*Q5pXpuu5Mu4t1WQmTPid:Qc
@*qymp I^epn:9GS:$$Ki8yD>8<WY4AQy>8+:qY#Y^bZh+K^?kFe6d?JNS94<^jb9LRQ6\^=Q9^ZaY/lADK&V*^
LwYE#q SecnbZI4mhaA&Vnm8C%wc%4e$pX6mG*H<S+FhL+tqaZEZpplGPGFe%4X@1FlmK#XJwtZQtnI=>MWkp6N
A$#Jqb TZ\l1F#y>yJaZpt:!6ZbRZcTkFZ4!9<A6ci#8DFeRBqQ#eeMM?>d6n4pLwG6:lm\/^6\\4p1SjM&KLX4
^!LTt* Hw5X^nG+u<1K=K$<X&9*bbDphek<WXubn$QL+ZS=B6aHt4kFbF9^PtPPc%<n%Fh<qa=p:uyuk/:T?$!$
CmYGw5 *6k&wbYH$/jyY:1?uijdKyGSebDA>MX=9+T%8HVL$\ZV:aJ@+?!6:?%inY:V*N51yh6=c9pK\!CQa$La
8X$5dq /8dtTQNhB6X5jFW659AnJAH6Zi&<u#Ah/\d1^ll%/cdbmXZ/?%c>1&Y!KGPt4K^6wkt+edlnwceIIIWK
+W?bFi CJRy:dcn6&?Wi6Y%6uqZhumtl&ZWwJa&wt*4G1u%A1c+HqhV^TZDCJ5A<%W9DLNPI>&AwHH4TKTKty\m
:9SIn5 /6uC6q^!K#Bcm<5^JGe>tZ$I4wE5EplddI8>Su4XTK!MN?=ZAYTQLkhM>nTKhnk6Z5!>*p^lnnB1qj/N
5@*dVc GpT!&dPHH*qJ/X$9mSVBh1!IGJ+^uFa<<5ykj>^n=V@FT=hduHWjLJwy/hQMITdp5*PA*ZIwytn8:YJ@
d8=Q@w hqnSXyGEu1e%A8/bF#%QY6Z:J@$%Q=XtY*@H#H>SY$#AWV*KkXJINu@LRu<K/DR@Gi1cWpNu=mT&\dH#
W#NwG= 4qpH5c=?b>#W#PKqGmdY^/Qj#tVW%tb5mbA\NZ4SnkAet8bn8t8NN5ykeqM1c*>MtDAW#iL5#w:bmE#n
DFcBqy yYyd*BMVD$FbEGDHnQdNY4b#5eb\hyywdh!8#F=!?CejhyZ6=:kneK4!T#kKdiMMF?>u1jyXm*%G!KEZ
Ayp9iE c*RPBpD%@ClDjN8muiRZJbw+!!dS\%aqnNjRcm/M:TuGVp=4e94:TtLLb&q#K+=BepKj4p%#>qLLc/nP
69TBd+ ^C15uJZ595KGC99awiML*:Qj\HcGJVPDZQ61:PCDG9KpjyX*^nhyhc%mM=YNAPK\ccYl^XHiVLXnh@aw
@e/V9G QKGHGe=Iw16SXYM:tXAeZEhcV!b4LmPdlQ4YnnJ\Aei8Kti=yDaciVVw%D!lD%J:WAe$+Fw*E!L8IGCQ
=wdXn% WX4Sy1Y4M1%S^$S$8mSPdNwHBADbWphS:X5&&/$pG+jKc!6F%X>T8IqMZq^^\mNBu4n1c/5Yapm^nQFb
$iaLL9 V5yP^%W8b\Vi=b6LuKnHNcF9eKG:jnZPMp>p&X!X#$>KuZWR\A#6d*1VY=$IC1^I^!ceXH*qSYNb661M
DcuR1^ e9:6mFd6X^T:eSpMjctJTKF$5t<uChie%pcnG1IbARVm6?iE=#Jnu6t8i%wJdR8:NkaJ/$tcPX$ihZq!
Tuti!q bL?bmih=wTRG1e4d=Zj?<^NC8X1#lcNAemm1L*BEjB=wywltjEePDX9#mQ+9%1yCGLncMt6GKQQ*\yQy
lpcZCa nm1=ZJ/B#KK%JdRFw&hn:CyRNywnW1eEa>BV&Z9ZbCQLG^\#q#T8ZhI8X54>JGJESPG>9i9VdI4JG4K\
d$mVub aMMknwc<yn+=4w6C<RT/YBDKDJcp>B%n>^@lYFclj*wuZl5Tw?=Qa:1Y*D1i>bX%y#HP$e?%dh6QDh&/
KTdSn9 V\TLLG+!GW$TJ%!Q^4nQRPSqTcB6^DKS$I1YQZ4t*WDAQ$PK/I^^NqZXVYN4Xyc&$baS48I+FWtT$?lp
DFYeDw Z*m!+TNtSATD/=4q>S%m:%VmX!EQ<K>/&+6NF%a*P>ipD!=>CPl4taa%bT4HDa+4wy\WpeXcyKL6ekMT
pVJXtA dCXJNRIA+jeedSpXjTILJ6e@KiQ^1F:bXLCMbJ:GyhKTBXw5w5N*$FFV6EXGDGS?NFSi^h4p$N85R\F^
tl+PS! X!P*mqGA^X^WKTb/ty68<k4<4D9ZjGKY^=<yN:nYmpndDDeP#Cu<pXIJZRatVI@9CtwM?lHc4M&*%Guk
TqX@p\ %bmQHw+FQnQ<I/ttJt4yP5Zin#::b5^MjumQS9<A/>hVN+6iDa>%yW<MV>H#pm8GMknIP%8D\S#Yq1Zm
I!T+^A m<%T%mk8W?TEeaVBQ%4GhGMue*y+myCNph=GW8IWu6*DS!DK6/%n/yc!Tbb&#&A19+C%8#c=@51@qcJJ
Ctpk6M V?+jQAd?/j4ZwncXaY&dlw#IakY!=!Bn&4nqVebYQVnZnKN#kNY69:E<LT?a8Lt?AmSi+V1c+1i$W\1\
/:RAGT ?X\MHHR%8iINdu%*W&uqG&NCXmRhl@nYSeTj86kQ%48lDqna<tyXe=<^RKnP\DhV+\Ih^bV!PD/XLBFn
XylG4B =nVyH:a/W:C=8lXbBLukGmy+$K@Mm=W>X>QySW<1i+%J4bt6DE*1\l!CA=&&I!+Au&8Y4S?u/Pll>%JE
!jLQPJ 1%W*?>qIiB&cAJ>qheVbDwyQ5cHl6wFc\P$TiSIScC9RAKCX&V9Gq8ucZP#kplQlMe!h/Li=ZACk#F?h
DXNXA? ?TFIkXk\^?W1@+!AT5KW^dRdTtXtbmBIaZJ!bY^5ID^1u$T?CYIAuSA*hnP<^<nD+NQk9/>>Ia!l4lmw
ceHFe! AKDItp1ID5CMeX+#dEGhjm8@CD<5:J>FEHeIp<^ItHnhARE4IAQ@ZyKRp#kH\HbGRC!yqQG6><\jE%Rp
jt1w1B 4Z/muDlhyPBLX5JGWhEKMV@I!w:u&w#@Y+bYE66u45Ell:Pc*GyZuGLN4SV6#cjMWY>T$LZ^:HHL<%!J
9wlk// kEB8MQ%Z&kB5<cEWj%mSEET5h5@#XdnI+N9L!4?SK!1j4aD>qD+eD#>uqaemSHPjX/A*u\CknB%?!m\K
L&!JHw jdjL49%bZtA%6a%/=MS=<%YuwBu+1^lKMdhVPw:>Kedj\IltZhVn^CJD6VaSAktVAJwDKwMnmeqdaQPi
^E1FMj LM\wp4FiR\I%<\CjZZJtmwaDtwRhBYpPXeh/wm/?NijBJ9Gecqn>@BECXHRAwICNdJ>!</l&8W&K4t\S
/T4Kd$ S%c$D4iQAJ>n@*H9pjKTdSG>ZQP^IWH6uBhh:d8#lc%dFJaeJ:b1ERKNAXdTnqa?qBLbmqtdPb!cIMCX
weBJiW GSEAwQpduPS6S?WX%/R?8BGB*<INyNQJ#ciKPNL#%kXdJFHbNKKMe/nFACwQAKDqQWTtC#F*uuWC>@I$
A^ty&= F+&Bc/qcRB>!cZb8bZTGBKIB$yFMA1n=Kb:lhnT>KNC/<a*t5C5AwMiqZwK@WLkR8WBN6a@LTeHEk!:5
BmiD@C hGlqcLFa?ACiK6AueRqGhRnVMt+^F%i#/JRZ^&kAwIkBh&1M8hPJ?:Pe6y4i56/:9eQ=I&^yeZXybG%q
XmScCk hGF5\^F%AJ\KtCaGE%:PQ?imkG$R**/9pM?ku1EmdnRt/A#h#jtI+VCMFu1F/CS$*5wZ?H?YualpGL:N
@TaC9n u$1tG9hZmKZV+:#RDtKa5lYik%pcp>&&&X6$NZMSM+j<\ZiSi/I>C:S9$*t/4JSTRm?wuX:A^Q%%b<AR
-A@!q5 0003f7c4472001202b4 Page 303 of binaries2.zip
qV8Zu< Rq#?<:nuLQi!?%9hcR?/\:#6=\t9TbZE#/atGTST+ubH41h=yI%*Nj>IuG!BQ5^CmHMDA<IMP/=H\F\F
5Ga++i HYhqt6^cI$mqTMau/hhR8$W:wib=@cEKblI^!/dYnE$?YqNP<C1H@wP:qB>DAyMd!djZ/H*c$WKwjBM\
wDd:pW MJ:hTkXRu#!ZFEpbD?&%L:iu&ip?\CQnSLkWW&%V4<?=Y8G!/BJpby5^XEaKV$pap\eh&&4R#RVNy^PV
QlThmW pmXlA6c5AKCBmA6&daP+9e^FQ&Eb>ud?6iK#&RCiL/>WpaRPL+:A*KcE=FQVei9dblw$GHX:&auek*iN
uujEF: !ipReqh+Vd+Ddqe!48yc4/Z>j6jblW<ZF55X^>eencJA%pBXCP5J^ap+:E4XC%l%Wc>*^QFhNMZL\J4?
:kZ!k9 nj*wBIciuA#kDPk!RbLP8m?8nE=GbBwXRkTmlPdGYe8P?uk#<CI4XX?I+LlZL1:EcTb**Bj<PMXJGm6>
I=XY@y /nFI1$46=YhkNXca=i&&lF8h$yk#A@>TVIqAhdm@LLCWhVW9#THVPi%PBHqpJ:/+8qKIk9*AMHm!pDm?
l#D>19 hh!dTj=NR14>B8@CJ>Cqd&bX>LHEVnkt<TQ:B6@G<wne*An19B=G<XDKD\mR>P\WpwCab:?5uX4*nF5c
qmI#WF K9aDn*GHViI?9nD@5I<Pke*tuHjek\@nYL$Wt\Q:BN!EII!qMW+9GKI*@YeF!ce#myEZ%QM<G\Y>jtEu
?6eeSN :PCcIqiN+^1Ii@H5ty8%yVjTyy/IRy@edwYlb8mPaq\\8BTlR@D&Hct#<!qm$GjCISuT:@#!e5*LI=^+
IEP6ND qNpLc>kZ#Bq$BJ>w*yC@FM^:Ayjj$ju8IQ\Sy!tXn5<i?/X1:lEnS&F5cY^qd&^9euyldt<kQGhK$&KW
4*DPV& Id:RlBbVdACZV4!pCAam515nV@*KK!<HN1Z6/qCl=i<%SZd:56CByjj5lEXlQ^lRiRCk4&upW6tYLLlV
8m89>y 5YX+FD*SM=pEcL\AwMJP48iPLd9M!1F?NL8hRK/M/R+ljQwCIjb@l*KnM%QuIPuZ&*HmEJIP+*wJSYR#
=%PkHw /$/!%kl/w*4LJ#&X<Q89VCVn*tSX+=SV<V8:kqwTI@l*5P=LGL?aV^ny6hBH!EV8HkK!?Mwq+5PtH/?+
aV8SFp DG<JF1dY9iBQjT\atB^iX#I1tCbZy@qSqbjTKd9A<$cEacZQ$QPCMZKpT$*IM#hhCWH#kCn*4R\wS#wQ
Mm1bY/ ZN1Z<%NCKn8cEKwB%%*>l^Nq=41<dLt:WP4<D+INwiu*YMV\E9MlN/\6^A1S&G9:^<1#idX/\A\p?h9b
FR#:nb wYNCnZY:SKd+u@/>8?YQGS+!btT==aG*SV5mnip\VJ&FdZV8PLaIlQEJ**I=cXZDEb\uZ^+Au&R9?bht
cacDlp DhATuL&=!PyLFD<mlQh+AKDGLmT+Nd<:5&4#LX54W=RC%/>Xbc8p*iyyp?LIiaZZMBFpeYHm&#tMRT&J
FeqIA9 6p?MdMRZ&BnPESDYQ!NZQ+e?AH!ByDVXTpC+^tIVSk=huntLbdRM+$:N^<AWahuYhd^ZP+BA6MD/#L<Y
5m1N5W <GDYPB@nY1=+\a*ky6wpql#Kq\qmHeL*n@aJ?\$*KHa+KN!I@5nb$8naF5Z*w=%=/>:SE4iVuNRm^ajh
w\=dSD #k%Gq<V:BADY5MLDN68:eIAyWmllh6n*/==w&*cy!V9Mj!@CLR\LFchQBKaA:^cY5Xppu/mNASmqWJ@t
#cJYJc #LIH>#+5BIBB8u+\>e^:GE9>eNk59RBGiY+<?lNd^>!*Qh!Qjc:a$!t/8hqiNQaunw#pNJ8ni=B\lJBZ
Kqq@1d eVMT!h<jl:#CNmj4D61>NSVjtTTWdmnG!G&iYLyDe+=DalaI:1VFFqHwP:c<$FhjtiKdQ\ZALN:dVS5q
NKN>RT A*F1BRQeYDQJHBwX#LA@NH=5SK5Na/<8Ecu4%DReCeDGpwdVE*1?W>!%>FI+XVWpn%pWIkTK=pu$Dd@5
RTqMFQ b#K&hHq/MNh:+aJTtNIVQX+AcMadqW>lBB<lAP$CB\AZDIAS6S4:NEH?8mVY#aV>:SiqSqHdw=\pPwHa
?!\5p? ?1eme1MPAGVS5nk8e6=C8nDh&c=+TPun!jVq#Yc8bnIn9blplk<1Ju5W4E:S!kALtN#dS61VFGK$QM5M
j*Mp1Z ^Ta=1VFJ6wC^H6yMXL6Fe>1*nDV6NpcKQN#KP1y$H+$Aw68!N#FS8/IjtaD/t8A99HGy*Ln:Mm&!?uWt
qWhPal 51VYL?X!$6$#b:HyW<!NFRt#$/i=SImWhMn%Nab<T9BN68a%Kb?@Gem8JN=eKe@cZ=:by*>yT6GWdd>R
hM5HV: PVW8Za$nl9=n$8G@kukM!NqRM+HyXlGDnKuIQI4k>B9&PaGIGD^ZZcDIbdN%J#5e1D:XTh#GhJ^L&KRm
hWNt*E yTKRmtbYI5WW@GKKBF@FGKYqytw*FGKhYX+l%mLShNi+ak!N<5Tj*tyD5e=+\<ST?ehK5bNuH:/RHu/C
&JwCDY 8LpC^nck/>TcTT:qtppqa:ue=b#TRd=eke5VkiyNb66ujVkw1\%yFZ=eAu%NS=auP<e?&c5VYykaK!@M
!B&8hy i=1=y?pT*&RF&1Q+5W4w%WY*a^*b8te$/N>yGic*=jDSVuhYhhcSJCyhieWKTG/epM6dywJC!a*h5%*j
CFVIEC k?:nc!iLhl!&iV%4#lZIj=8DZR?HLu!44!!=Ajy>cc$b#Xa<$Yiqa+yCKdA^iIb/+1Rm6D#^lGcKecKA
1aJwG8 5Y<Wwwwyqlnt9LQG&4j&n4V^^98m6l5Z$#*Nin/^eG%$i:uW+bItIQweX+:HF=wBJJb*\TjTwp#wwS8:
VdNGm1 qaK=HeA%8/Xam*kN^PjLJH!DGV>c%dK\kG%9KW5B\TK&4T*nhl8RNn8X4GWn%cXLY=#%ywp?yVB\ndV@
klIjGC ABQ%NhqccLHcYm^4?NcFmpWaH!<?y1+@qBiPcne*$m>Dt:1^&1eDI4G84ZcVqek>SZZZI*Kh1<XmZejP
WWbA<Q CKSd5$ij/#bjb=k/D=Yy6nIXViy\$bDC6#ZdW!RkDkk%kSL=T9ullY1h$ijWncS/%y5/*Yu\ZC>JEB1!
paB/Rt c^@CRd@lG:W5iwPQyt6p%8iP%b6DcKCKKBF!n*wyeW!#P<RR?hwF<ue\p%=Qy=B8FnI@mB4%:Xa&t$t:
Lk#<AH nV:#R5B?XiR&cNHj^1\I!iK#thYH/uY^P5MY>q@bK\X*=J^\Pqb5NwG&##@/yQZyX9<A64VIyawF$@Je
!J*<X# bS69WhM%lc=/pbY*P8mmlqnDS5KXdZ=9tc5N6Rp5t=ZAB\X>K5Vc$Sb?euPcSy1YhRtY*nImVi*c8a8=
:j>A++ 4:@YNdFWB>P6ch%cTZMcCSw$DEjY5!DZd8?6@M8aqCq!k&@#>^V=TZK#5b>/!ZFw#kea=#&NelIj9MiD
$Tmtc! m8@94ELC$mn=ZZt8Kl$&T>9YknBLd5hPqXE^1SdcS/hweIk$K!nHRR1j#1:XVSw=whJ6+b?bIq&E?8K8
V@:alj X$HmTVWttNNFKcKbJdwyeWawKEbh!My:km8F%#TSFe^*MMRAl\4+:C8<^YB+kqcC*8a^F8YhAh*wSYe%
ldWGYm ye:eJJJ!m?9/FGImY^ESWdTPc8Y6yb1EptmnpiQ:t+b&%u/a&/FEHPSY:dYjtEEnNe>#%+yNZbqckYpe
5D5JQW p<DGRKTJh?n!ADQFYNikiKSawkN#DLH$1#ccia>PDiatC9I##RNY8RcXeH:PyedkPAeb^W6#HC?GXBkh
ti&QSt kMW@RaXcCcJ%?/=&u&NY4m&CAkei>J*BJGD1Wt&%IB?Z6Wtq/ZHBw/*MaAh&<^tQW<%Y%a+nhe%LyaM6
KAk>Mp 6d^LK^J!C9<Ah=y^IeqGh*$N?Fh5K?@NPNP^kAiqIc/$jCe8+*6ST+wypF!nFLSRcBnt5:Y:KT>5TpT=
Q8LGJ< pB+?ui6Gp@uTc8l^p+8/PN$hD=i$nDKeG8w6yFnn*6$A4CulPu/9KtMS!uiu+>c&Lh%p6?kQ%4pp4M>!
Y1S5*/ qNTyw#L^:m?9D6W1B*>1X4P=<wwCXGQZnFN9LTcTeqdlqW>X#mtjaEKlY8uQ?#8NNG/X!^y55>p@qM8X
Q+>:Wb #p%4T!CcHeM%n&6mpd:tqpaDwCiK%JbWn6eDnNT!Zwe^1@*bDY*yNkq6b\TEH#DGM=:b=4A%GbYunS#l
>/n<5Q YebJ>M%%/:TmqCC8QqI/EX6TZW<#GXHi!DFISV1T6n#SlFFKSSVA6$WWWFC>/c^C1YalXWbJQRCuX#i8
C6ba6! clH1My$1&q*S1e*Vy?mb@uRNK:5b&4/$8y*edYpV?SCTFtQAq>ei%ZdDWEMjLXp9QG%<q1tAIl>$h1ut
$d/JlK 5uRGYA@Xc==/5>YkuGPl$EM1!D=8c6jb$PDn>K\6N9qWAT@K!>nY$L/Qd\!+?6Sc^%1h$SZWmwy^^n&4
cq?MuA M84<LEe6V>X%CM46n?bn&FbWXqNPR<wIRh1XmbT9wmuIl8CbbS<y:H$4T$//q$GXa&hyNNpPME=MBQej
>&jSP@ :NJh&?&*IA:Xa6WYjV\51A=Zpiw4YDPQEW:4W/ZknIPjeW&8b66b8NISdS:N:t&nGFpS<8w>CD%4c5Na
^T+$+R 5NTH?nZAL>+*?X^?B4c==nSTummtRY1bNNFd^GYcSa+%GT#HAFaiw?KaayDdcak8:nwYH?4n?y:@AEFa
A$Ve\n #&X*1Muu/qeNM+=CulF?m$4t1k&cX>+wN+Y6NInbk@!6hMMBS@5n8c1&X5q8ymmG$D>je%QHBDBH\y#&
wQXZ5R NP6%LFnnuNI&WWnGk6T81#QnqnY:CtRAKaq1DhMi==1=HD5dH/%#!*QYyJemIBcIY\/A@WXaFlbBPWPj
ViDE%= 4X6a6/<ntq?#=/mpDTKQ&TBipck$GHI>F1>=LKe:SWW5bQ%yMyI#LmE!AkDmp6FKS1k+\Pc%Bd+nL9$A
ypAR99 1qEwWHGje%hM\^DXpXGWCb6/k1i6X:9TLi+jh5AI/MDll>DX6p*VMCi6PSTX\i*HY6nlM/P/%4VPIylh
8bj:y@ \4@!#8P9+NSYpX+?a=H6SVI=I54\\JA9q^^1mnwFFYFGPQV8cMAQ%J>^WnL6?aEaQYkwdkdCG+:=y>wl
cu9a<h cM8i@c1<\MtFRhV#X1J$nVc@=WADD!**hlYlGAWDaBBHc1EnK/p/$8u6+#G/5!j*l@DYW+>V4w%LLqb1
WN8TVe ^a#n6W4AXYnqXpLLl8P94W?<Mte+d$1D1FPMil1Nw^uNL=18D6QK>SuttiaR4GRaAGe?%ISX%Pa4cdX+
WS51// b#nH6XcNNpa#%IyLlne8T&S8+Wik1NXbVkp66+#Y$XbHFXuh/Deau#$IFJIN5waeK*W?>TAEeuQ?FK/:
hZ5dNR +mPPK5^I<eeeWW$N^l8D$PKKRH>KAVa$AkCiNw16^=Z@T*Lpi%=wV>H8VniPaBWAtIQ8L=<Ye:tnMGhp
M!kNj^ Mdc:+mZCaAn@Y84&?pppl4p#=bad/*Q!VjCnKm$AunJQ>XIQaGkb6bKXYTjM>u$@e?\QVt>lcCBEcYJ8
W><<k# bZIkW&F5it%ldnBX:>%L\Xa\ta6B%1>SaXuuHG:EKRCiLGDt1bF!<6!8jnLaKC^%:n#nFHK6L9>A=RCk
nh?Gt: <Jc6?\^%$yFjCSBP6YlE5!i\SN\Aunm4JNGS&8d4SmcJ!:#G^AATkIuyK9aAwMNFNhd5Yipw9SjIDj&n
A><?R6 @#hEwEcSa?iRkm%CqwY@dmXBi%:^Zli9@mb#RG=lcc$Adw1Ed?EJF%5q1qLhq+InX$ctw<lD@\CjRKbW
c&#F81 =Qu:t?Fmp<L+!ue?9eMhWhbIAjARCPpB49Y!k8nW1/+TBpQKRD&%j!\*q*:\IqHy@TE?CtMtFIy!D@=/
8^JTZb 8GbyqTVBD::8&BPP5XhR*jhT#KS#Qq4M+>nRh88MnJ=E/E9bR#9hk&SVFZF94>?YJVR%\mi5upGqpIt%
Q*INi> %I1#/#p=#>yX=#6d#ct*>HbJIHpYRab%u#LKRwE$A^IAaEEq&b?iB>HS\TS1GF8*pZ1Jqd=qSa<M/h&9
-AWLVV 0007c2625d0001202b4 Page 304 of binaries2.zip
Zc&YJT J1ja@CQ%kdjQD55Wwu/*?=8bF$NCAl>1>!HA*G/6iG=WaRGE$wATWce44tyQ^NClN?Ey9FT<w:4aRT:Z
NJ:JAS aeIqtejhE5>wKFWwIqe?Qe?blSa&:Y4k1:%Q%YWBLNlYNY/Q+CAT%nD*y<kmZ^I&uM#Gw8*lAFywQ+#w
biwKAI wNaK^5w/@eJ9=mVj^1@m8QPlCN@L$YhIB6J6G5YTt*%E=w>wEbp>Rh?/A4?!ei8b9XXA/XS>J@4C5*DY
W416@E B\!edTQQy^d4PREhB41jqwGPYYl*:SKGWV+R&qcq<>*5GAiKmY4>^XF\y+%kIi#I5GaW6ME\:DnXI4e?
bKMbE< Vh?6bFiHS1nDl4X&=\8kHKnJjPpkn6WuN5AR/H$ddwK+ZQF?t<ecL>@:tE+m#*EP@P+I$=DW4NTBnQZj
jl8H&l cHEY@!&YI*ShA@@6BXGyjFSA*CumwDE%iGVGCljG4#WilGd*?Mkw+LNumcDmMI>9iN4%M6JBqPJ?C%*9
CM>^kD q?a&X9+8*$\yut/8!#d1KMeH&55I/^bIa%H!&*BLX@Rmqn8h6waT!9=YX5Nd6JAXNBAq6$!5@KWFCRQD
:&#CRK 8ICFa\Ck%L=FkwLa1DQeE$<#C5Kt@ZG!/d+AwQ/I8RNAX?K4bcC?FKZMH$yp1RK=A#MEPY//eBAMpRH*
buM?@K 1j!SyVpS!^hR&$%GukhJqa^+T@tXSGj&1%WEPJ+ui=$Syw!LRYIZQJ?\V61\bK9P4@N@*dm>>!GVmeAJ
%lThDc 8+B#5CX4<9@w>&JASj8SyQVpWMSQ6IV9TuyZpnb5C*9^j/j+>LGupY&nMw+E@#K%?ww!\w4Q1!Vn**5k
CA5@Zq t5Fd4LtNRY5%18N:SZkmRd>c^yX\Xh/E4ePe&=l&IDaARwGKd+jTAE:TpuC8%cb^^iucJhiFyWdwHR=c
1BQ5?A lc:kQJ^iGq51CDlk:DtbQ<1%Y1*XFqp!qn&TDwMIJ@8qbj48YY%hbmTqa*6J$ZWM5AHZPP6DMMHm%JS!
N&M%u$ hm%me8F4ZhV5hCYjLE?%FCjclePLn#8C#M8KDMnw9Z>:MD94TLyQT+^lPtAp9nNZBq5VdjR+Tcj??/=E
I#nNSR ?#yt$b/^ti\F!TpYJHI%!YAbjhMD$c??/Ltl?b:qN+cdWdNtXQ9HZ%\NZVcY?WD1@ampkMN@QG#KH#T%
wA1SQ+ hheyRpXjewu5RYLCpD5*EbG8Y4SCDID*b>X/i!N5Vl8knVTaKGk^=Wjt$\L<b@AEnw@1RA+JwLpFS=94
!<%>TF 4u%:eT1*4mZcwA?Lu9CAjL9#m>&H%5wPu&=@6yM8e*V>dEiJwuc6H6Rq\p8J8SSSI\B1EIy@d#+8w%N1
RtAN>B wC9h^/:Z<MCX*#&wT1C:=KYZbE::neNMQ<CCCewn=Ka+>Kh*eE:AQJ%$:mRK+>Gmy?YD>tl?1?F*@>Rd
B9%A!I pPNXe:wln#:GTC?RpaIKEp!^L1un/\wwL^q\bZ\>/9W9<@*:DlaGlXR?6mdYRQjp$*nmpH@FQI*iYW+A
mmwZdc $*eHI=h\I4!?RCYaIAt@ihw%QLT%T^?4\<4jWu>EdyyqG&BE8ZqNWJE+Q$kjlB&%LJ>4%=n#Jl$Sqi^*
N>pAW? !6#a>$%9H8&1GeQCqS9%:=1YKBNphddZL:qAHq#D@#S9CuhEJJ^TS?PdRIY@b\X<n#Y%KV/ME!i9Tt=e
a^*Xt^ Ij9SdA@LQ4p++Z+9:PDRiAi5eCPYJi56*dL6Gp8kTb!#Sd$TwE$We$JBZe5CNy#X/FJ@LEW%e5=CXh8#
/@lBjB XFpMLNVpcbp+y%K8MqBu9EHlQ8k1XJ*>Z5JuABIw&m/S6a+lMBH<J4Fy1T%^uZE6BQ?llM6lI+HGb%BB
pMS*Zu CAhYJ45EE*c5>tjKhYtX6u<==N*i<V?nZVi>mwu5/VC<VX&E/B$&iQRq6Z*YAV@laX\\ZP?N#%T@m8n4
!WSIy@ C4PCchkAK+%8BL&W51NYiD<6Rt<ttaJ8:NDADcBqZ^1iq>T*@I:dH8RlBT1FuC^6hhV1EAauJb:68\VM
u4jY/% 4LwbB1@4$bi?dKq6Rq?Hwa4Ay96PVE?Lql:*Fnt46HKTy+<EAK>TZB6ZEthy8<GmayT$kIJMGS/QHu@<
tZicA# L*IEi#GHAQ=#Ah8L+DF%*^w6k@eQ!\M9a?<u/ibQ6k^6l$4*j!QKGW8QARK%=#68pSZq/bDHwGt*DPm6
516IJj $CH6R*6@@965pVdZ8K<l=M@y>E1@b=m:Hb?$CTuLRI9n8=C=K*cyY!&Hn!Q&A@pB$/pRm4/u!Ip&%DF\
Y:>\!Z +j/pc:IY:=JM8/Yu$PIF4btjJN<XbhQ94m%qZtNC!:HM<dIdeZmLWHGBhNdBe>$&4u+$Mjq$>p8>cM1<
6dcQSw 4lSKakI<=i9?XnR\>Ake6S>c?iZNSJkG@#HQaDRuq6NYAL1>^n8G9J&+hmGqcGid9IC/e5NP?^=ccYFp
6=W1>I bYkkQHN/WSH&b\WJA5FTkARLARMDS5iwkabmE#%>AKCmG/Gmi6Q1$6bGWu*ncM=L\mMTQkCk!#Wcq6e+
<Yd:GL A5$V=/cJ$q@iK5Dm*n?\py&p#Mcp&&h*^+*?8HAST@dkhT\Au*A?VJ:/yq<wnC6QG@AjGLL6pDGb@An8
ANi5@B mQ#p+n>9M$btk=kXp&4ZkQ5M$pSj6k%enSAaJ9=J?G>DYh=9m?+h1RQiX?h\8*&@EKWFKt1ND<DY*Sq=
pk<tW9 eSZC?RHcL5P+q6#a1ee/B&j?P&l5AXwFGmY=FXVVeX+IW8JdkGuSL$1WW:1=TAIlFq\uFRFmP^C@WRCb
IZ+8y+ +yFyMH<Nd&cGY#ykuu&#d^Whd1Mt=EWnyBJC/I+CuZlqM:G#>ch%/%E!I%RJpwV8YPZn6MH19/GNa&:$
YQHaQ^ GpclYMGK=@41>J\teH?ZRTwFuA1bA/!6>Vy*+j:Tu#*SdKWEw&a=kI+HnWw/Z=1\lFdd4MydehEPWR5H
h?/<q8 bd<XtwM@LqR!KM&JT?V!P\CjV:<V%FPk86**11ZpEi!D8=th48+AwK=j\&i:M$I^NYMV6h+e$N=1yG69
H8PFX$ Ny:%kN\!J1&!&BT8Y5!hQ/yeVh<l6nPZC:Aja=n9KKl$DanR4>G/JebCbZP:lli5&CSb6q8ZAwk/cSS<
#\PH#h LAZ=?&%HZPP/h+NmRG&H!+jZEHt9^iWB<=:ae<DVlch*5<nJ5#9lldAYF&:aPX#11Ti:GwW^QJ5ytmtZ
<h*jb* 6PFnLp8uAwJkdWlykm#h!Q+CT+NcpTLq9$V*!Ly*8wF%IdLiXa<RijeyiL5SDZD8AKh6>DHTM1b&PY*$
QQIpc$ HTl%6Hb^+/p</euHQZSJlbD+yNW+<k!T\M>#IXlCqb4lB$6R5$5$#4PlKeh%*=4?D>icntM*bDD+=qe+
MXw?:a $k8mb:pe8ahuH!q\@\V=BRpA^^KHXCnNiF:AQE$A5iX4@n+#Jq#JSiaAwJMtp@!>Z:=><T@mCM=BP<Z1
&?\FJF a+5QN&Z=<BE94\@tH#A&N4AG5h+&=pYcJZndV@wDhLB:!TG/8?S6wl^MHly&9SX484*R1tNHQM!hFX!%
wld/&< <+A^6?A^&R@eRAGbS++lRuT%Q+5MDKY9eV@A>lEa\W/iQe:P=FSd?XTp8dk<WdFlYn?jYy+qyPMVXHjQ
PV$JXy b+\RYI/NyRHR>byG\9/*cdySAwuFE*6ZlL#/8K:=laVAY9IbWhm/Zb#jk@Ljn:je6MuwH4&lSp:mdJHG
K#!S*D *Z4mWCy^X&Cy9LZ\dqkN6eT\ETW8T&D4wKh5?%?9qhbhXYiWJ!kEkb!V!h:eDAQ/Q!=^WBwVXTM1cZ4a
:#bw&& tuKAHI4EyWK8:ttbSJqiAAHW^Nj^/W#*ikWJARi5AJXyAJ>aX/DCK<K5S/?8&ujnXTQhh#H6t$n/<R6c
NeL*=% n^e\H8E+Z/nn1+hmZK$X*D9yZ68XGm*WubLL@MV/bi&68F%p1Lcyn:B%\?\W8J?GCbcEQG#Y9#6IlRPD
XnZFC8 *ZScjIlnjpimL%bY*m4QRNwk@aS%8ku1#9EuXDK811LA/L$nTp#tp==#ZP1Adt?*=u1VIucY4Y@eZaDR
&jNyKc *!/V%uFVR>BP^Faj6W4LdGG?ce>9*HGQqd+p&Npi$P=CjT9D8aLd/64Lj!5D@**!^Q*ulLp??D<QekIN
VBFy&9 HZ=LbXKlh\e!!4yDYPwetR\CAVu%+8:4>V#dledTi#hC<kG6$a6QetjB6qkmd/JFVP^Wq9pZD<tjC%M8
nit&iZ QE?pSq$cPpuSY56C1cb<:CPdntu=?AVCMn=k\$Nm+9HD&XE!&BIm>9G/EidEHGDCN\RAmRQeA@>e\FpQ
Ahc%:K 6VK*SJI%Juy>ync%GX=AH!$%^w!nwkTSA?SpCDA::=dCWtj+>4jHP=lyD&T</hQl@REE=j@>m/ppW9HT
1ydb>S RMGY1CS:dhYVSKcLTV>MMT1TkqNH&Ntaj?hB9lQaTn>8n&q&<WcdJG&pGVyLA:ARnJuZW4qRJibHwy+8
5FZ$V@ b+yhNCXGetF8a&q#IFa8IEJ!bY=8btLh#jnbG:mAcCGWAKCWti&:%dbMe+QwRHy@Saa=Sq!K/BcE+/9L
1:CD!D Yy95u!lLeP+XG@+6bc\<k=yue5V1=We%Jb<QP8?X4wjw*yEAunA6N5Q6nn69@8\B9lln\CIJq!$dw1yh
/cle4: Y+\cI^R*8EbC5d8%:LJ>tnL8e8JDEXWlAQ9BP9<aRnQe8jLX1yw>Jwu<69HMa8k9N!MkX%Q+ub98DY/K
5See/c $>mtBF!l@J%nHcZmGM6#\5$FFcmwM*4&ZqK>Vn8aF$AN#9J#cwcJnw<MIpIBAPN\FjdMl4wlXYQpZd=b
R=b:XB &W$ykX1@liqinPewnqGJ/XKLSSiS#cmn>t/?Vjly/SMRlq8uwBC+IQV^I66:tq5CaPu8JneML=@Rt?#F
iu!mXA <D*T&w$amLy*>^hqHF<pTda9X9?yFC#a$HN/:?HcLh?>wHBL\K+dwyXu^b+I#4aQL!:ZY=a:lA+YF#yN
BkF#9P :Y>m:aiC!WIt8Ab/tq<JDDqdVS+tjCN??d?aMmS6Ni?V@/$yXnu!TC$nCY8:DY!HpISpS:>X^wjulW8*
?@@Q4: \=l=4bPau$&I#W^i^#HTRnZt&LIaIlc\hw>8TMD#!:HLIXEp1C#w\THwdq\8W9NjX&y6VR%@$bkt>R5T
\Fw9HZ T5MP$>+WMSqLeLd8</5m=Sittd>*&lQ5%b@eXbkdDtY+XhN!X6FJkt9=K6tBpNW@5bcai*G:!KWTPRZG
l@m!:\ +b/e&EudcT5K*6Xiwi1ct#JZR9\tt9*Dh/M$eJk%QNa@h<@I!jPZnMRFSd>?=VNX+uZV&$i/bVc\N6ua
4uhhV\ HPDkb\Q>A@>6%um=t9\WTqPtA+@w&Jt:+ETN!%1Yqb1$m>wF/MMR\REMicS!:YE!ZcJW\HTlX6d5G6B#
c8b6b^ uRjdmD1p:AY!CSly\\Hj4?k+4^Q<&&Yu+EXjDnAG!+GP8kKLAthPM+Zl4wu$iV/&qM\XYYLL#BC?#<iq
1b$k?= S?b<y1dw1Z!JH5lTck%FT\RApa%>X?Mq86q1nkdFmIdLddyakGI+XZjGkwuhVDPA>BlBHa6ERbBYkjhu
LlI@th \#XYaHK!X??TMVlV=\*tMCLWSMa^$X+Q#eNi9jnDCHFd4$!FtcPQDcHZE/ZeJlwXbY@ZQkQqJKS$S:n=
R%8*8Q dX89^%TtW5bMX$HKld=XQEb&%Sb*dL1k1t<aTpNldG^le&@KyP<ulMAGaE&WbmVCCHy?!w%4?NjX8NkA
IR&5b? wLC5l1hA^uj9h1GcaZWt6mAyDAL5:ck5<S5ZmcAYc*:nqkc:BKY@lC=%p:%^HNL=/&91JCWD!WZcGY1N
=1+hRl PuVmCNtSqd8A/HMC=^w=W4Eb=nLEAN+FZq5%^!DZt5hWy@5+MmMZ*6:MatRKP6\eilPBtq98p95ynjeh
1!q&MJ ?1amA>E&1qy//Y@>>Eekk^&?VWdIQ5JK4qMG>JllQw#hE<%b^hSpPuVe\MbW@AN<q:#B54jANKh+p%?C
jCMS%G tJNLaTQ@#c!K>DnuY4YQJ!1YNN5eJpT/Vww*q+51nL+p&>\GnBt!FHh&k/:/LQjLPn6wndLXbnKejRX6

-A8j8C 00097c2e511001202b4 Page 305 of binaries2.zip
ByC@8W WM/e/9clK>iI^<9Iwm$Wi1:WTJ+W:NWBAeVRBGME?Ri^^!qB+K9Hy$dJeJcR$KW@LGJI6YNCh$CQ=!SS
+ZS<h: G!LIbl>1THhyMq$A9TwYh%G^Ny&QS*w?Y=nVX6An:/wKd5n!\yhp!@K#RV$\=mqalQ9ie1+X?@8FupCj
GlHlCN uGm8+EIhcZn@i<:VwZ?\?W?bEc%WmBN!pd4naP$MAm<H/q9wX##IpkVyNHW/DH*=\8d^KTiyc5WAwKT?
i8h\c! b&?Qj^<>*CRMm!hhc=M1hy4$A$VGyBdhJ#Z1!a%HPm9nX\?yEKH*n6tTy5b8uV+h?@T\H@@Q/QauLRCk
eJi#d< ph*8Q=DG1l/ucGp%J=eY1E>l?>Wea/W^%aiCAJ>cy6Hi\^^+:+iXK/1kthn5=SQdq><Z:@w\jMyQ>\C4
SSt^1q DpyH?6VG%\$RDADMHZhZJDlK+5V\/I+Vb=hPplNl>694JR+Z@jca><l<idB!HVl%?@dBe<TDETa4R&DD
?uL8?Q +?nYC9&lKCaL41t85&WQwkBVAcB<%18nEl:/D!4PH*TEV<4#F@PpRPuZ$ui&Rm$CN5Et!&liuZ!aCR1N
HQuH%q jm*6=F%=>hTTV=5an9\1y$6<Mp\!DACNEhZP$ZZ8+#JTnVkSa!%NGi:B*MNH+kK^u\9QW1&8T1P+IFB6
q^kSym 6%@Hm$DQXbciPaHl?%Fw:u\EihLNtGkwRBBZBbQq<9bP1F8+>5M=%$q\48=NWZk=jn5t8d%yh#ySI>Ht
AIL<5C MjC68Z&Pek\&%ZD?=lBTM1/:1\RqlC+Wl@by\+W5JF4ka<BRHjcEhMeb/RE=tjP>Y@pw\81tIACQyq:m
=K/pPS TiKRp*m1I4QBF+@jNDEElBAemc>ZZDe!1biBWSc?YEG*JIFwKpX1HD$&$&YjqwVlXpE/^\cD1X/Nw#pC
%V@nwM W4lb!:k*cb>JbuycLwj9cZyL9ipIh$##IpuVjq+9MV9HGSPQ8MYCMGm#eV$?PH+i:TkMjXRh?KMkchwQ
qK^T<A =kYVnn!wF#yL&P=AcAbwqY**LFaBy5ek9jC6LW<Nle8e<?Mkw&=N5/WD:bmXEY>*B<wWJcR+qRRNQJB&
E6@&nW <88hcj=hq*E@9@D^t*jFym6BtMl$ZTuVj/tX=XBTaJN6/cGjI=i+qiDI&R&M%A!81pAkAVEQpdPXB:J+
PY<PHB qIJ95CyVVAChE59LTnD6MG&d+4dE5:F=%#JZ<lPi/y4#@amFA&\MCmZ*WcHG4/KZX9AlEEhJZqqd!q&m
H^uj^S Ye1J8I9lF5tCMe5iQH\R*k1hGECbbHt=81/J5^cJ9KZ5QjG5%4HLTYwBFy?BlX>R^BW*?*9>$8lRNj9q
C:w$qZ K8::\*dqRASeD9ke:+%EA^$wS=QqDC$1$uq#!PF>JH%hl$qE*\9?^tD!/5B/$PW#%J><4l=WdbWD@mH=
1pActJ TqqKNFVu\kJwt5Jp/IPKwIDipL5CVc!<ejQ564RjEb/Sj9@JXI*8ndP9TX<yTd4I=R:>kA<CM*BH4m8Q
<L>=Au D94CK?&>LcVRbQ%9VN/:<%5>%RuDuL9:<%Ytu<j@LNV&>^%#tWeJc*8yA>ySVV=XIJZTK+VetH:<j1Z9
+/E!Kt kdFTA@+!<>JyB4iEc#Q<plI$9G*Sc9bDjYqF&N8&ppjI68$&tqFKHktKqhIW/:Hmt?t1QpbIy!Kk@/Jm
I>=mQj #SX\VGB658FG*JFLdtn5u6a/FCHMGNXucY4ld!wpbH5F^TGYhb4SAX/ZHD&KF:KB#G%DGWQ+?6J+Gl:F
!@CnRT 8q5N/HuI@NtNaT+c8!FnIES=c*N$bZJwd*X#a&TYFcA68?Hk+uj5me$XMZcSAejuJ\n>N>b:9mcnG\Ck
=IGapj =+C9L^QLw/@hb@mZbwZBmMMud5Gi/1@VdCkE&F8w?\EBDdwD@nehCm/BpcXRS?wKT&YmnNk&#&1/!!5G
wN84IQ T<jS>c/5b1$b+e999yJeP$1Q4un?FZYPk%lFe5Xj$kbVWViAL\AXwaBWT^XKC/4NuX>W1He&=CdItwIF
NA$nIq X/^1QmIB%CJJ&k5ccPl/bNB@YI/9/wX6k>j@V<IMMy#@\n>JjLBiN8?5&unGBbWAun?ka1l?DCa$5MNA
1E5!Bw *@1*M^E9j8:EAKDkLhNi@SWqaQh$qjdDZp/YFlnJTV5u5+6>l>YeTBV<K>Sp=BEkVK!cYcMwD%MXmCu+
uJl=iE By%!iRR9uhNn1A?1bHVp#5#Yb\KWw&=ad^R%KCiEb>n=T1Y4IHhyKbA*VTjFKQIqHDPCwilnXLpQJW%q
puS?bR /T$$GM&c?\t/Yc$cacFHN6T!S#CFcQ@%yHVXkV^jhDSpc&1>S!#iJ\6kNX\$FM!cmCYh4K59JDPmT$tF
dBMiqa a:dQWqp/Dk*HbqQiT=t/yDDF5m/CXXyK54MqH@ZI#kw?ulE>p&ZWHBDiAEi%pa16D&Ma5^!kQBe@MkX<
^Lj!hY G$D4BA^VTlbnFb/d6N8IkYXTlNQAuj*TpJaBbN@j1JNXCbS!t!+4QRqIEWy=ylhReRAaCQcwiBdMnh4t
e*6!Xd E*L#?kCiI8iuKA?IpkD8mlhmKiwy+QFH?qCMkL&BynFAyG^An>:>CDe&<54Z@+mmnV:1JK8Z!Y%<TMhc
$^lLki ILwn>>V:G&#ycwJn+XVap\9$*m6ZDKiLHJECN#ynmJL5c^%d^TXquVS\e$5l%6yl&<cmH9KF6:IV=AhP
HlVRM^ N19l>4kKDnWa%ecl#yI%k4!TlDHCC^npjcJNab+FnnDuEW8SHD@t:A?BqwwYjPd?4%=KiP>uJH%GX@V5
Y4l?Vc NBmwiYK:R6$amIm1+mG8iQ!?+X^IkXKTwk=mFeWpeR^BNeeQDYRjp15naWkLatp>k8qhT\uh\ub/6GpJ
FW?JC! huh&KaiD>Xm\N8S59YHMn#4DhGEIqC&\u*G5a/aAa$WFB+&!/>9CdP&pBVulM+BDiRCjcNE^qd6VV9GF
\<8Pb$ ?lkQyl<Em$J8k4jBkT?Pm8dq@qnV?bC4H!NC=yi*qdh%%ihHuF*Qpbbk?5@y8?=Nc\RIThw5+SHti%lj
=WXqK# YJ%aE^Y!by6/L/pQuXS!MV/tEe%4%k%WFt/1ZH>u<hcjVkLX=D>w18$/$tIAdqLGN!D5$BaTEe\&Y&TX
$bLp64 GW++$G6#X4VndCuLFZa*FqG+^d8HSQWuRFSk&?j$:L8Wjm@8%@y\bTiIFBtBG#uKWaP1FEpeP1QlWaME
!?m%5F AMYkPIMRSHGZuTB9bZwSuEe^SGTL4<DB5LFZk%juB%+HPe/:KbaHj>y4%e+S1mH6V%%\wwq<4t/EnPc5
1?l5e& +:BZ#I4YSWkt<d:QF&VNA/LB!XSDGV:cRCIw$A8/SZP1YNYmlcV<b^XTpi^thC&D9\kc5\I%d4*B/wJj
\DB/%A tGDA@5/YA@$aiG#uyJWP9dkDm?@K:9%^V\qYbc$q@9WZmBWyt?qGlnAQe4Cjt!QumL4j^GbMZ%6l#eFP
>DnbTc :^T:>$JWttk>B5$RH>Z*9@qSF696H^X$EL#t&KWEYy4$PhL8bBKkPRXmemXVwEe%88titp1EHb@?JS$u
YPpbFH a#IhinCdJ!lkmB6cwiW&uKFjFnR4!:$ujM5LNZ%G+klHiacm5=6#/^Ch?jd+M^k:$F4NNKwGi$chaItH
Rji*/B ?Q8#KSj&h8EAwKAy9uD98LXddhj@tl/C4%Qabj?uc9MF<*8IX>FGc!6\SRtyXJdGk5Mi%P91HCELVYkd
:8IApi m*ncJTHEBCNp4?T/h\CjYikRXF*54InX!mmtYp\@WIqn>&:kXG*\CmZ#iNq#L+aD>SX#?&k#YI!mk8LS
I>hV1: :R<ipJNBA^KT#^ZLe1*mbiT:ecqntMYJDIA%e@LWjp*q:yj9KH?BZZ@dnpYA%5?Hj!MZyGNqK&6!F9Nl
QCb6kq h:EJda:VCEA$IbMW8R8/8kZ6:a>EI8=+db^bc!CS5RQE?w:NjA+*/ECq^RKeK&PEVFGKhSRA*FIiBp$+
ujh=HG %T9:?G!kMp4kAi6IC@T1<6@dRu>=K1@W%\&4?KJbYKY<nJH/>#ZQ!Z<4ppqtJ:5i6R=>nXWt>#%8P>6b
t@P>TJ j8Vw*$NVBqdwSZn!clIl+LKja%8cb+18ICFpd#F>?ww=?+Pp?l/NmpI4N$#YI:>M1!p@Y6Q4Xta*FJmu
p@8miB ayMWANIwyTKKRE\y\yBVlXCCmnFDEKyJwA4*6#HcY##TMFXSZti8/#L1F\^J\kQ!1K&jF&6Cb@55Vj8$
A<Y*cX PYI:t8JupJJJQJ4KV8:G>PN9ianTbdQ/$%t=^%NIm?a/wN&TeeX8Y@l=yEH#+J>cY^8w6:GGPCDTB!5u
ne+DAI J@G8kq<N!IQqdJ:%tZ?qVYwXmN\Qeh1Lk+6E?t/t>4KD8I\c>L$dWX9:WHeC\HQ9Zn+LDuHK>c:L\jjF
hJ&>R1 dpS:8CKc$bnWnhZP@yKXTGWEh/K$MBywycKAJlVlVceKak4F<Scwqqc?YG\:<DFdVEK8Ta59DJ1n14Al
dKL&>: VnI:XMubF\n#P^kcqeGS!e=!c#GPbBpEmy:l#tt&!F*A>VWLa/9I*hF5%KCa1MukX$>qGldB+4H6yX6X
h^d::/ SYR1tPD&4Y5d/#iV=bFa?tcp/I6JYNG>6$TJCw=I=Q4YHjSLIMX8#*MEpGAiuVNah#eRL8QtKTB&PcdR
BQGuH6 :/cuFclD=N!\/b=4R$G=Nyi^9%GeXY%n>=Mpm>GB16BIXbiiAcjR=t6Yn&T\uYcFTyHI!K6EX!9lY@M1
ZZ$Keu CI6uA41l!M%ch$edXuaR$WywykTW+WkySVAwc#P$NlIXA?/ij\4#DWJC#BuAHGej+%/D+n8XRCF!FGM=
jA+C&> dyk%=6jEq6yaHu4/%qQe&yLew#Hh!SkXNaaidyk>SWLMPBW6p+Y>VQjmk*Y=&WTJiY1SPQ8+^^SJa\Y5
>cKNH1 G%I%ZuhpDHQ4tp$$<LX9WqcSa?jqW<+yG>p>TG:MdC&VHDDL+1u@AGVd^#?a1lXLdmAV#:jT46\5V*N9
6q#V5& =LE1Md6\^n%y&wM5eSIwG$u1el+kbVe1FAC4\AK#EQVH+%b%PWT*HZpe%YnZD?8iqQwe#%b%9lTj!4/M
X=J?5^ F5bRm9SIt*^B9WX=Lw6\$F=G^dwiK>V$>>>1y#u*y^MK15!!cKDSXtR?uW$Xt/y4>4ydmEw>^eMPIwlp
Sbp>VC n/?qN/Aqew?LwA%q=+?<PMa#u$4#i/B*Hj\\=\K:t?t%4YaTnR^&$DHeEZq<itjY8T9dFIbHSHLTEn=C
M?i?<d PS>c!q*N/dT$MyqHB^mtAFYBHWHm41YM<+^FE:pj*SuFYSwGyPR9&PRHiE!XIG+>5$JNtnpq8#R$nWXc
:\Bh+\ IGR+I/=4SLTP15#BqQJNba$tTLVnGa!p!E=HjQwchyi4C*W^#eEhR%Td^bwVP$kEaKpk=DKV\KycujFL
41Y9ME Rlu*N!Kjic#HJDmMAMiABYXe&F#LD=nK#EKZaAjhFG:Ce6DGLFuJd1VWmDyn4&y=lQtAa#peehc9&tn*
AbAI4A 6!liPB@qHheXSlhLe4&i<ZKb^!S%wWm!YC+PT9B4#!DS:y4u!Eld#$GYWnHFhByF:hcG=GwYd4CVlyFP
^/pLhC ei?KI8#I1K/$P$NFMmtnulYYJ\<dnK5PlFFcHPe/*mYdYIX66LS:h*@%5:hI9aiyNcGp/LDc1Zb9Mqe=
9mTD@< iS&!#H*4M$:T4Bd:DR9NduP/AN6=>j1K/1Q\ywMpc9Hb5XabBM4j+$wi>1ZYZ5>>k?#wB^6@P1N#w>lQ
/t1/5H I<p%9E#Qnee+J^:%w@<ACI/Ij?ZM@\Dj%9<AGuL+R$IHJ5FQ%l4Y^#e//ZKhncYFuH=MEWWKp=\CKj1k
ILw@b! V?#JTJF?RB^<\@lIQ>K6@\DCK/CD^y5j@jVj+$j<I^wY+KhNl\iCCVn?hWt$SK#/tdi/Sc*4iip!^8\#
*!Y^TY 9BBX91QY5i+<E4e!F&nleu?NJRCc:SjDYmSkBhMkAA^^u@Guj&ByA/cjCQ\Nb6Sb$^1%IK%:uFRiDada
q<upRW lt?#\:j+tjec$JhN5+LcK$nKq4mbXbmS8dHJJ>BkX$*>kcRiVy$B?w1C+<QcI:KVyh9qe+IBFXBSV$SF
-AkGMM 00001c070ac001202b4 Page 306 of binaries2.zip
\*+\&i YyPc6J/GSLw?pG=?$@a:d#Rek+HB>cqbI&I#JH%@9C4b<N/J*$&H>W@+S9R?&tRjpc1^q#41R^RYed6I
^nTW5/ ymEpu*t*DJ1P/l6yX&6JEe@:Rn&mnyy5H@jNL@aPnj<ARN6@??cVm^14E+>Zt<QT!TY@?p/eY#LGl!aV
4yp<ka /n&w1>+u5LJhq4aw66GCVeiWNwe>kjYm8cWtubHwRye<XJmcDcN1GwBuXCpdba?96m8+ppk6+nJK/SSK
>lPmZG PYa+A4M$/BLh$nSRAQ8+FTY<T/uiTZh\wiCB#Hd^6!8S\#ph#ukjT6+qY1/pm>c*N6iIY6yqpWheXJIW
QJ5I@9 nR8:lFXXdWZMMK*MckQG/nPP1pkEjVtp%6XPmZwd:9p6VM>Bnc#ym@<AL>E*?/h*<1uT=6=LaZRjMQZe
\Py1:L XI#?HYt&X:a#BIdccByAkJTLHEpJ8hak6i1\L=<u%/IQ=u<KLl!*bhDI5Ht8DGwZeR+\XH9Yj@dq1<ap
:9?kt1 kk9LlG^6cK*ak@T4iyNnV45@>MZ@AJXS$ZXILt$6:YJdkNFCwd#IYWeAh#Ww$hpKNc<$PpGu*d!weQH6
I*Xk5# AKitVuGjctQ1<K^F:mKi&K>WpnP:u8Mb!Ke5$ip!T^*CqayyGpnqA#9a<qDy/$\#^YadWNStT&caaApd
N4Z>bX G^B$Z/>#Xw!qhwXNS6Jdb:mGZ#Wn?<EWql@\H4T&%:dZkd!JR^Z:!pabj1D#XiG=mM<&1TBdi&<5I5pk
ihFnbw &tVuP+?*aWph^B1N=BeYebpXCh%!BlT9hjju<15^cLM>*BAyb*!R&#c9LF9VH4WQ>w^kn#ILtIMRwb+m
&ZKIS= Bp>K1\^#Ij6<WHu5$<lcMEB5HkFe><CyW9ahTuY*mLKaY*#I+\\I/DH%w8HKX>e$8K<6&bXXbk\Iauk$
Y?j+W> Xj8RG\D#:WXuKCdP!uYuGKR6w&J$>M>Kp$aa5tV?=QK9@n=19AYF%GXaMl#8GPqYYl8Ith:F+kbD8bJk
*BC&eJ h8:%BHNY#t91J1#:^dYT<!ZE!<im1e5jy^WGy*@&t#%K&YJl=EJ<^miAe<D*!Pc5YXm$M<q*e#jcL1Sh
h<9Cpn yjd6XF@81P\@uVByRN6eI$^Eq$lE4AeM^QZ<B^Wn8cEaWIySFWaH*XA4N$&X:uZNSVe!CPRd!PCiQqGj
Z&$Y#b #NcTAK14u:wA1E&5kucY%8QIcRk8DGGDH%?6J:F^iyF4E@&i%tkpq*mcJ>8::\^n<^#X!+8X6LL#Z*ME
1Si8KL WAKP4HwAKw*GpQQFetY=</=tZaJZZAnZPeADyX1?kpulnESWQFI4kQ$dHa$mt>Yb%>BK6w6*h5G8nLGI
PiVM5C pH*amYHA>V:%y*pWWy^JGpkBQ*%BA@P19&c/8:!Kc>ETSRHhHDG^de@>+u&:CuZF5<:pZE^iIumNS6GQ
4P>p@% j%1q8SLa4YC^NBIpT=6^IjKDenH6u6uPKTA^yJjQCAEW<:ilaL#@AE1R\VTAw<wnmHAYIaPQ4@lV#Am&
K?kk6D 4Y<aEcFTw&>5%bne4Slq54c*SmGpZql%A/p$&+lmS:iCBAJpeM8P1L@EV:H>ctp6A/^AVT^tJNtWPMn@
9@MewP ACKhDBHdkmNed8Te=J?ywC+!+QJXelmP8KKJV<@LN$/AWWtncL5nQ6b!hSmRNpEuPS!PPti>dm+4q>E6
mab&dw ^cTR4LL=pk?@K^/t8li:6wWMp6#FGm>Yh\AQ^wV8!&DTk?>Xp8:iRA^*Edk>%eGumiQ??9=$YFeqNPnd
Nd!wKV DmwjPn@9mp?$S1Rh\?6K\KTV8ZTep$$t1+9aTC^pZH4tt6j&wtEB8EE4DIVQJ1iXt9PtYN&DWWnhKa%%
$CwLD# CkLNIwH9We%*Cmqm?h9WKMu<lXJGeyZR@NJWS8I\j9euuFMN%GB>/4M:MtJyyI1qe/6c&$bpqhkAM<Dp
pSKWjH %#njE#\?DkC<duH?1/j4Tepm+$=QbHW!aLpulRMpp>KK+nY6hPw:yLYYXdhqClGPQ4SYE188l*R\*84t
%eKZy4 ejm9qj$PWHkja>dGcy&14ncaS+5nZ5MAu*Pet>eHyDyAleVnHFMtaael!%LEyy8CNuY>P:Fbamb4:WCN
L\C8YN hp4!@a@9^EQXFPRL!PA^Tm6F^PTJ!tFCd&JyQG4Gh\CktI#WM4%$XNS8#>:J6Ihd>QW8!V$a#uu>w61b
ym4d>t <FE%RT:LD6!*PkE<tJXGdPLLanb>/VMX?/&DZJ1#lwkMFkQWAKCLqWbmmy1tEV@yaYQuquVYe+6*+Kmk
BmKY/^ &\WWa<yj>?$1ERK*SACjT+yc1<##^I85XBShkd^JaupH=LEAu&:!m:lFR&\6GR\W@hwpEc5mDdun5%Wh
EPcS>V <\Zd/5BV=S$BAS$+A@>mcwQ4VelWAXtQ1L8LA?RjKclpwi8DqS?VTJq<i16kRBhj8RiT#YM*@kWW!85y
*YGicp LL&w=p*RmL:6Jt=eBnlkKAn=bZ89=tutPWFccLJ#YTSn:Tw=hMc$$qZu#yi!L48KdWditVQCdIjdP84D
AaGQhM 5B6H?SyP@#RHRJu=Welt6uqu+R6\AJ$hnFEY\A6LPG>B#e+bK\EDeMN#t\Ckw/Wk:X1%/hbQ\kPWG1Y5
INe=\+ #IBSl%N4MDW=NVA=RGl9atJqe!=4it>9LtXphdkdLeGeLL4AtL/&Tq%MD<dFW*S=d/Ey*\L=5ACGW/w9
BBYh1K <YHGk!M5VmkEqtKX8DWV>kCdBR/CRdA!I?+hdn$<5*JmTGVtPXWAuSu$pE>Mm@\Mcy%$B^B8e^$TSC&W
K*=/Dc JHN6aZSyiEI\9kChFLVitpM/1<4Sk>WBKP>Iab<8&TMAun9AI=CCA\RW&knmdIp^8b=9c*MS^lAIC\ce
p8q%!+ 6LwVLEE>B/u+IZY&cWhmWujNiY#Y8Lu@WE9Phk/FF1CVbFXih:6@iISIiHWDWKJQ?>+Xy?CF?RVe\m@G
YEQN=^ le=Xe1Y4pitlkd\>J</9S+miQL56Ky!lkd/AyZ?&Tn:pj=+JG>SJdky8H+bkNXmwpwFe5Q<M44M\:hqP
*NQay6 FNV8bJyq<$DW@G>:muTwI8GSMW+Hl@qi@&F#=inXltWR41P<<M$tj5LAeiyEJ+6+%qyB#GLRmFA9haq9
SGmFF6 LR\Q!puYIPB@JRQhi>ZtCkAbCpiWtbIIbTKeM%>>$TeEP$1Nt9bt1@iWL*$DJWSPR?b1>QeAeupF5:*S
kKIWeA X5ImEBuXqp$$14:jRmmmwRwDC+5IqLt@*%IG^ehMV=/TAiMlG/i^dRu*?R!n^?@<V$V6hm%l!lCiu\5m
TA4V^N \dWMb^neTe!=Hm%CTL^GyZ6MnaFe=!nl8aGw4>yAD^bbe6<SMASu#^nMy=A*:!TB1qDEpnmDqLj=KSXA
a*$J@i <X?$6AW#eEXy!:9eu9C9@h@#+X4q\w/E\Fajhj6imdMX><JJ6%p@6KQ^F&PL!eLt8L%D^+A$T&Dy\wc:
wy!&/8 lF6>dPJnhyKH9SjYyhAu+yMH4h1ITMaka\tw#C&q=^S8h@F!a+*9l8Z4<Yj&WpG1VXTC!<PL!55l@<Qa
1Dpkjh h?*dXZpS=@L=NeAIYq<=??=R*#kSlua1:/q#h9!d#ekSA8N1ECqd9apaF651CIBPZWiSQMCa8^1J%mne
R$hX5X KBn4mGL<YCm*p^>$KHy469>GeI!ct:^%=p<S&9NSSHAVp:%W\HGDN<*?dW#@p8%kCB%lIW#XhX<*Db<:
kNCbl? BbL16me=@<=F>Mt\YVy&B@iyZcW^=E?^cFhdBa5lmuEkN+J\$IT&u<R\wK%PwA@R?kQpZ/i1MIDSYaJS
6EtE!/ q6/mkQwJTHZm^bp>@m=pkuFe?Xn@RyJG*VX\!lDV:6$l$GmmWLK#V\RA:AQV*Wd/Cj#T:S:/WJ8WG+T4
6pP&yI <jJEpZTVCK?5j/jFG+lMmL\6+TjnTtT^!Jy?jD@XFI+/kEY8Fl<NuVFh&q!dQNJ*JQbB*@>yu$n6N*R8
Ftm8lE ?La^XL>=JpW4@?R>lt5jYn1j^1%HXl9?*\/uHHiIa%?GuB8ElW@uZ+<j4HL+qThy<l+EAIehTY%HacZe
bA%:/C Ta&/V:yJkuta\yG4B/6BVpbcjSQAMP9<8Qa9JTImp:>^>&DP+>ZbhMDHY6q1S%Cl&iBi:JEJiP@?W!^<
hZ^11T CIqj\WY>W<A#<4bBB&\tuTLiZ4d!INC=1@tVSQEDV>ADND*6EaCepqc?*ia1:kR1HRD^iSD4&DNLapdA
bNp$X= %QkX5*i?admQ@q!<VSj>e=k@yWdZe<aPd9^VFn?@dB/By<!hNC%iQ@4l1Ad?6NhLmNV?/<ZSej\PH4Fc
:+!i*@ uY:Fm+9BFbSP&1T^@Mj*nYY=n%/4nm19>y&neN4i>h6M&@$1*e*MphyESjcyGh^?cK&*!jmQ<<XWP4!D
HkELj9 :*mHWp>y>JH?Fb9V?9<Akk9/@1\ut&Wu@L#+cp@*:bp@yZ6AQI<PPN@cbpGcb@c<ieQ+k5#:VcXn?qQ?
E?V>q= %&:&T8d:RbB=^ZhJcqS$/a^XZVK5@\C9?GGm\kd:tqcT^%R4@Y4hncQDI&&^pl#uHq*uuA@4@uFWh69J
uc14FZ @B+Tp@+G!Xh$?%nXZhdC\Zh$Nleqk*=u@QNDnd?9?AK:I^c*R#mD^CPiGn8%dQ+Wj/euTZ^Yu@dNZ@yX
8PnlMN hNML=hhB6&apuhF1?M??M%K8t*I?:wiyA@<AVLXRj/$qIIeG9L^RRhW<R4@%%$=Y1J6RpH*6c8S@%&$a
LaJuR> j+XN>q9E@\CZL^NH@8Zm9St>ZyL+8V@kK9Sd6@Z+m59/5S&%*HNhCN6S54k+?/hP<y5jZGQ@ANhdJZ=G
ly*wJ5 @h>89t<XtY>^et+Ai:%#AH*d!!AZ<^@uyYt/45d=La?+a@!wGV\w!BT1*A#@AM<&Bwy5cAwyCS6n$q&$
+TqB@5 WMSkDTB%V\%Gj?8G4/ihPtWHGmc#H@%^%EN@Ywny<MuVR6Bp@\C8Yydj/$9>q1MqjDEjZ4B1@\D>qT5$
yRGySF NT:9?99L6!5k5wFW/+nL%Y&\$w?94@lXZ:SeSnH&:^hH:!Y\d?uh4G*RYPw5XQ<A1ILnc/ej*5<?qX^B
SG@Zjj QH@!=iK+<j*J\>cJ/E/CHWyqQ@Ie%qj?88tAH$FT&8bQuH==hL>8tAQ%yjP8E+<*^mu@AG!DWTclJFa4
:yI#eJ K&y/<tGa=i!BI>mKq4?9/a69/@+BA%@dMRH%VRyjcc\KH?Xae9n1C^TTPHT4TaCVG?*#Gl4A%VYduXhT
/P8n+W b=JleLFKjLcRBTX?k1m%5:b<1MqmelFGe=y*56T4e&^1!iI=YqY+@5QVqlI\Ik4hjZPcp@+TT!cPPH?\
e5^Za: +9MJ!:4eP9+hc^*S$WGcW\HQ*TD\cadJY6k^qRNnkn9>cYnK=Yn96L%DT>YqEhuw$5e9@QN>VKH>VYu@
ElJdV# AGjPPtn/pMj<<6Xc<y<y51/Mweh\^BH+%*?mjb6Z$%b9:F$k8niY^p9tnLEh<byNY&C@>j$#e64iiGa5
L#LGjQ <P6RkIib4wTy?XcV89q6qw<?$jNa>lcSSZV9HaYeQ:5njdcmbn%/de@=^Y$:MEI<!eeDn!^@PkX@/@1=
XDWNI# It\let&Pij*tSSVwuCwu:#b%#8l*WWC8e$awH@=biDyQ?&4JTG^lQI$u\&&P<YyEj%1R#\9@AM9ulcYY
jK9LtZ ^Z?qSQHC!HEHk!Vn6IX1:Jl1cF:b?hbY<j<Abku\*Ej&*!\PPMQuuHT1//XPPul&?Rj>M6ZB@4W?wY!N
a<Swa@ a&$dcjy51pu>*e*bnn@+Ce@u:%SGqRHn@lHhKd@4q4BH>c#cc&@4<AW9/@yqwYX$Q?ad+mmh?G144KZ1
LKhEnH cC+SjEedbdPZB\Q>w$<cWAQp<M@>?>aH?NX>b6LtLRXnl$m@lpqpK+F<H\QW$PV5QS:j%?J=6FA48/GN
H^St?b ==$d=kiBm8&$T%mT%mHp1kHQ/%^<Nuh#cm6mR<E$ptH*eaHi8=mc$$<4E%\pecL%e<%uXh%bHXRnb*by
Aee!PF Lyh6e4p\R6M9KtSekG5J9Bh^eCc+8#Gn8e5pH*ei6hVy4&6&M&>*FI*w4nQ=XiaTJkdTPPji8X8eD9=K
-AWbG9 0003381d498001202b4 Page 307 of binaries2.zip
+#SHt1 e##KZ\jP5<u&di5MT=*PPy4N5hqqh&h\u&h\p1qlKM1*48Fit*p4Dkp+QZNeHHbYE*meSJMaa+y6:qIj
mi@hLH M&+=#n/%$WcpujtPK9VnHa:i!mlN@MEm<QMR9@LkYDn</*JA+R=Y/A+=blm5T!9a44WGWcnd*GWJ&HVj
Re!aq! II=@9a@#t6tTMBD?/ZHHLVbB@C6:uG>C^AGTNeG:WHQ*EDWWY$dtJCI=G+Q?1q^SRI=5/kV>:Y>Ij@4y
t?hA\M ylH>Ka$+pWkZQliWpj^&dL@T8tdWI<njcY^@+Eca%=bN<4cjdpu@AG<j$y/wPbh9!MnWR4&>5wn$S##p
ZcTFld Z4Hb&?/B?6b@&iN5b$*\i*?:hM6hNL@b@q4JNy5G\plTbqQQ+%CX$Eu=6M6Bn*Sp/HQ@AGPE<nS9Dl@*
kwlPWF NVaj%yLJT85iRqudY&!E5Fk9QNZJQZ9Y<dQ\+\=$t*@Db@lYX1qqbYX%B1tqYt^RCp$ebZLL*I>c#t6N
T5ClKP EdWbKM%el%t*n@61&tcJXqSTR?MbBy4/Zc*m:baEJ/F&GiKm8>S6hV8+ydKb=EXhl*e+I4X6ht*e@GDn
ENPJ+n Fe#VXn$wYq8a/iHLC!kMu!@cBJ8TTJmy&>qI4cc?pbIwddK!PyAcR<C1%*PlbWSXA^>:Gce<LC+6R5/5
a?XLpC &$6<9PKHJ>VV&edYVMGdW>hlCT*C&%*dNuIXTHZHYtiE:Gc&k8NWLm:e:JLKAPQL?y4i8\#qa@q*TNkN
8WHJKt nHY45GncjeYeV!/yjY4ka<8B*CAD/X4VpteXiHK6YX:P/8Hu^JN4:DdnF>b1w/?w@\A>K%yNkVPLj1Mp
j1p&BK bJNX+>F5+H<!QZ6SpPPFtb&H/m4epWVDA%KNVpjhmPj=X9hHFwTR^Kaq*S&#HHG/WwSSSC!I5cE&#A4p
L^P5cD NLGe$WYEe+d\KTQ:a%6j>@Vl@lTj&tMak8@yJyj@ANcuG=uWaF:+8H%6R%NdWJ\Q?Ry+q@+HaC1c@4?t
lZWuZc JJeMZd?/ml5diW/lBd:&@\BiLa!d8Q:9dQY5</4D!D+p$<@:?t5Q/Xw/qhQDdY:L1E$VdntT*6QMb919
t8/5wC d&1mhYpHZ^Jhn@i$pH?qR!q@Z>YGnXIn%%@SD@9YVn?qTm@SIdiShT$Ipq9tiJ\y?qSHYG/H^Kj?BjY1
$AYtCe P>%!PC^kK/:cT!5#KFPu4pp?^/Wq1N4?9/SpcM\bm??Bk#5RaARy=4wpG?GiQJXm&XI4H6dT+6:NeFHt
:CSihk ld=!wADi9T4%6hmTZ=VkuGXQc8iY4QSk?W6\?TAa=44!=S^tYI+CFXwZS>WXdRB*/qp=WLYk^hwSqiB!
mWe8Zj RPc#Lt?l$?N#H6nb%I@8+FLZa&hq:%!V#Xu%FpbweSApibM1bQ+t4!Z6!paSH6A1n61Cj+%nI>85RX44
eV&u>4 \#Q**ZAa6#&yj>G#>*\j@\B<9ZVCKmidX1Tt>Vjl94?TbF*SM4hVHi1^@IX5S#!iY8d1<AQd:KCQ#4p6
%5c\Aj QN8d!NR9l#e^+?^8\e@VNhhAp^lVCcynH<DA4XGDSDd5FIqN#PGI^u!N\w1TA!CLk*+@/=+NFMDtDd*I
H*yh#1 QEjnBQ<AhqBynm=TMu#jGk@AGqGpZAB^+j%pj:81A@%yJNP8pV@pE?JWQ1q?DVWk59/6@tZ6VqpF6c:d
u9cK+@ 4XFIb5uV+jAln<1wjdLkhhT<YL@9YRNVc=i&%yc&a844WItGj*h4IFpH?>/+4thW%!+MS@5jW>bRD1%^
km*^id e=J1+^dSKX!>jiI>T6^66NV%bTa*bbNRkYJD6GY^^p+Hy/m18pYE?6V*McZ5dZX*aM>*QiKFTFCR&Xd1
wcciL5 PD#^?qhX1=6W6IX9b>Vhw>FLq+Xn&J=wP<8#<epKBnHT5%d&c>m6LLWw>Xn6m@tT\4cwGpAkClEWb#np
XSFiWI p%nJXhw*ST4Sydc5q5a\6lERPGnBH9RNMn8n=kpMWw:khcy?GhWY<6$5J54LGy<pPN4PkPM+@C6wKW#6
uq/iN6 =^?qe@K+8#QTWqNZMm+Y?5!E<&NmiPy1qdV**>4!SY9##?R$5liJT5ea/6#!i*A=4S8FP>yJD<mnJJ4C
Dd&eB^ nlY?$?+8=n=Bl%T*HuIYMpWVn=m1Dq5hTBYqNJ9*nGyPMFh/tt85SNHCSYm:p*a@5WH?%wM@<nFbj?C6
^61Z?Z W$F?Zt9I:LXhjFqd#CK&EhwplKBS#\B^uPMnPP6TG?9R^Z?$@E:a:4ym%dVV@4@M=FJNZ6@Z*DdG@mq9
++@a<M +XG5&W=#>$cYan@*%ka45adbnClFtVpb*4i+@VNeuc*q!>>Apq:+khYQT=$>Wn@Fl@uyZWSJD5VMiqE:
Vcl<># i4VEH<11\N@%@XldiEtBj>Gdn?:ha^?6FJd^^jbp@hYJqyMRSSVJ%PD9q$uVb9K9QDe$dEj<56Wb@\CS
YM6^jH 4Gpppbk<L#Y8imS#8RQ#NXakayJTyPB\VuQH+$9tQpwA*ZFc^kw1=yhnqub&cTR5:n?Jnptmh>65&G\e
TESLbV >VWeq4Il!G\Y/4W5qpH6&D6pphAi>cKT5NQ#P+%CK!89F?qTZ4t*6&$?N!L=BHGI$Baeb\&D&Q4XLXL5
dFkmyc TSced/!qcK&%u!u9GuMe<ybh&\w&C8+EW8yt>6>Q$Y:5dY@?*ZPu6BA?+ZLTMPTNy!S8A#$:XY%Xw6Cp
D@V>M% G4ZMG/?t9ILqw:@>:eSSlAjMLLpL<\I&+/AeX#%dS=bPY9SE?>jVSjmbGtyyF4e/qe/mL1#q6Gpi^lke
l^LHWZ !iY&Vlh^/+/bQy#ZhYwc+$8*9:yVAJdaV!dlkKQY8F<X?jhiI>ce^S&:5&+SKyVAKDBKuuJ/u%JNil?M
J9GZ?= >Rp69lbb^&VdZ9a+IAXdcRyHQ/CuKQ6XF>!@d&nhhV##X>bp%cLbdu!4YS5Jn:#n%NFtdiD\*eTiSHFL
I$S^pi JM??:ePTFRA1k&>M<<%t?XKlmAXqCpDy\w4wydCjSjDKR*\64?*8yJtWR#AGREBlll$#n8PKKpXFKKX^
**pHWd KV9h5u%iZW*t%QXdYZWNQukllh4KG&<1PFCQ+5ukuHVk=#^XG#%kFCNS9Nbpee:+L9Gj\y*mtBq8bYY+
kQ:y86 8%uq6Lii=nF*=<WpiiM5eF5ehj4*4DTjGie+1+Smqbdj%*Im+!?E:DTb+:&<lp6VYIa#Zm6GPP/>iqhp
ijIyma p/BXW*Fludkl4W=@QFiRjctkJqkqpmpB!GS!Dt9S9Djm!dW$c!94^p8a%^GI+FIeiqLpnZ6=E?#wDeYu
MuHHyX I@=cREp@ySW69JJHA1m+8jV=LaMD?NFRRiK^#KTRTTGJ!DW>6KEPG#u9/%HHdSFC&TCG>cJ%<thTlDIi
C!!%t# tD!K/d*XtZett*TT1PMn?/c5CNtRlluB1ueZAW^tLk<p<W19M?e8*IB+PKmKEn5LBXl$Z\>jBa:h4G@b
Nq:dXW Hi&u#M!uPX\itj<A$G5LZd=mdu:NeZbMIK!G=8BQI#w^\?TQR>PtBX&\piZ\S1Weu>td:i=YSFtZE4=G
uQbIPa MA=@D/X1ydC$6ydK$$iLV$9aba:t/uqW*AnCA8yX9WphP%bV=aT=t4mt1i<&b81&G6/njTZM1Z%\X$8K
$iiXA1 dF%EmP5R#peeElmV!h*QT4jmG?cV\H+QmBJMpd8eku:1+FWhRdZhM$jTNT8d!=*cnbNd698>?WBBB^&*
!BdLIL Ak>!Qc5/+%cT+$@T:SwkF$/F+%=/:t4cLlLYD$DqTTWWXdq*F6IpbW8F\BuHNhN4tq/SjiFaI>Q6t5:i
FYdM!= ^npBn8=a%pJKl9N!yPi@!><>BZQ\1NT9:c^SAZ8b%nApdAPji6/<q5+9Ch&HFm?L&/V:MGW9G^P!N<nI
ccdeqd dd/H1K=/$icTThtcJ^Ypm6+lY&5:8T^T%6L$!YEK#ZX6EXTJl&DhGHA=>@Y5cM^weCQ1MH=c%6Xkqtk8
5Tb#ua dkQK6ldRSS\Lj=T/PMAkkeNk<<hnYSH=aAa5CM@*1hKHJiL*Jh6pPiPE1\YMBmeDK>/TF=4cV#XphJaj
/M@nhP tX%PCKe=X&C\qT&:PM<XFeua:AuPBnA/uNc4SmVQZNLF%Qy69NKq/SJE4=kaAEtmt/Q59hD5LmP^Ww$I
lmV$qZ Gj6i*y:bw4J:p5<jmmKTTI!yk<<LX\SMl!!1\H?#YYJyYpI<^8uNVidKRX<%5+>c*T8m4MpulApD^6kH
e+!ceE I=/W=X\t:4<u=Gw\y<5E+QGce4n!ee=^%4TP\RPy<L!K5Y4Yb84G*E>84A*Ei=t^%C<>?@y^WG1Y<$Gu
8y1i&d &X>18^:XL/bj6e^<!YXTMhD!ea@VFYjA$N#h?IY64cTFBNb!K=tm*=HHH=+4P%tP/$8$8NB9NV8Lt+lp
YB4p?6 nu5*Ck^^uBLAk<kHQd9WTm&6P+PyGQRq%nR$$9\>y^k%c\%K&6:8TGGTGa5eP8<4nJW<kHkXntIq8k^Y
y^h%dJ nHy>#jcNH+49X6JI:t?n6lcSStMIwP$qTQ8pu6n*#&1HXww4dYNVlYMJHDedI$W<BehKhPLl:nHFTWd#
Mi\8y< I>H6Hu%lYY$6=q5+H8bY8JnEpT1Q9En*NYylcS?HdPMYEF%A@pNe^PjJji::9JZ?L:9X?u9XXSJJwN%d
d%=ewN LbYJT>8Iw96E1q=a^pD=jVu*/X$umm&q$VX6Q%LWdc^9wyJAmSIln\I5a@!e%#amTnK$q/Fi>/yqQ^nb
nkhi9y IptyZcNDHcT:QIkRmS+<dXJjBIZeReaQPK=mCHePiSY%+k84qhW%m$qnk696h\4QHcn=A8$EDuGVnBJ^
?d<>Y^ !Tc#aiD>c&wJ8PyuVn!^$bBlw=AWPCe>8qHq8Xh&?buPe?qTMD8B##%waqa&J+^nyY*Kmq8h><Q&np<J
aiWl>@ 6G=$<tC/hS=^PRPw/WWjDCKYdThWXJECye1S9mDhSSZLW?JpTT8jw4bR+ZQN$\uR$%XkNRCk*+RS4am5
9y6ekw F&pkJ$ahq/=/EdYkaK?EDk<\DP#k:yBS+H#hG:N+@<YN&XEAu%/=RjjpW4>d#b6d\^eYtqG^4q#w&PA1
:a#KLk pM!S!VjkiZqjFtatl=\%hBqCcWJ5aY=4h&ymiuR\L=ctMnthpypBAei>bKBNG*Ac5kunVCH4d:?wL8pA
pd<#AA JNL>e%+?$^56PLDXXCjGkhXdD:5Rj8!eN!GHhl&4>mpwW9AK@=HMZ?KIE?$F?^e9H#ncCaPm$wFT5A5y
J&F#RY kb5Cd$JeeqwJN5$?ckILiILhJPHWwH=LB+4#TyJnP=GWCkm&9d#lpC+uAcDlS\FdAJ>6R5?$XCA$Zjm4
FWukZI kw:FS%ue##/S4*^&hV/@uA1&CbVRqqTYyat&hQpD5C:NE<aJ95i&diMi&:b6&:b>n*tQdh8&dh8&>@9Q
%h+T&m :P=M^P=Wh*XZSZj@M4Q!/a/M/GhQeVeeRA:S*4%lWAw4c@X4l!^5SNq#aYCeNCBZZ#Q<K<1GlaCe>%an
+jyDAP Xa8kK4+&*B$u^4IaAMkX=#nC4&+XI8KqYJcQ&N$qlC\nK\QpmlW@LH8ISJG!?mF81Ah&aJ=FBBD6\kH!
XS/NRH KqYRnyNZN99LtIL%YeT:lE:5Vui!yNc?8+bC@!cqIWYYCF1iP+BQkuw=8TEmAkc16Ap1YK%+?l&#1T\!
&A:jp? V1ZkieZ5T@9iV!QhN8DA&eXceu4+!:\aDN:cXm>B#D^iEt?%R#=?D%PwN:4l&q=htQwcH!D?IZyeIR#9
LjSM%l Yw64NEEH=@HC9@w6<l=a5wjZWDhJaKahp^d#H&VE:b^KGCy5SW?p%@Ii=FhFTq<wbPj48iYYn$y#qXE1
BcRKCP hDKK#\#tIB6V@GQyB\*J^TB&DD^?Q#EF+%$/4$bBpwSCe1>PTXN:Fwt#K&>EGX#&j1^N==TWyq&YyLb=
jlu<BX CZebV^CypAIdMYM/&DN?P*:DdEB$EKq^8wyZq**VyZVJiZGWJpbR$WYW8X:CTSq?\>M#I*Ap@A=/TFpF
M+!JW/ \^=>:C$Mb/eTtTJ!%MV?%/ZycLBh#E:?DDRi+MX8VBZ*6+Fa?juK9FW=!%^NW\Ql:%=E%Wh^Z8V^PjCl
-A4+qd 000ae20ec38001202b4 Page 308 of binaries2.zip
lpawHH a+KZb+1wl@1BWWWLZpwnh+eGk%Z=GGpYDBPV9jILAEKF!C<t\aM<P$4AiuH9<#!kVRk5*XSnk$:Z$*ZT
eJb&Nd /LTyXC^y=FZEhb895Q/qlwhFW>y>E8Vc@D&WKLX&%5A/QAenmEWSA!&5>YwpRllWl^4M#y<qJhAuy5tA
R:iE*^ duyp=mTDkPH&Ddpn9u%tF?tuRFlBD/YBqN1P%ih5VqJ1mQIhT^NAJphpejn\946CK6^>&dWc&MTjEE\^
N$^*jD iaGHjIK?c8VP#4GXkYPPh5h+m9C4MZS4RV<Au1WictK+PjDSjB!d\\S/dGM/d$MPc\n^^&#W9P:t:ckZ
4SuJX= NNE*Hea+NS8DG<AWn^LhI&Lc+^jcZVm$CbuZk=V1/i:Y^GjS?Sq>\/#1@+dF!kuJip9Tk8NR&k$CSKDn
%8VN+I yMG?YmYRVAqBG$ueVQ=5tq>\ayyb*GbbFQhKC8t6#wna#pG8M&!Rt84VJdEXqX9G8kWp@/aq#cqEYiQt
#h>BHJ QVW:H<1=9=D:JXWSK8%8GeP<>my@R@m8*p*d!1Y#JbN+tQS$>dk96@+ty*VZZc<h^Kp$^JH44=%Yw#+>
1Y^cM/ Y8@/XQL+N^P4mXbH^a+HHl8%q5ca6lhHe&<tH$N!>tXtAPNHw>P\cKqBkG>Hd\ScXG+^\bZ^H+1>q:l5
!T<N4I RVtL*PZBJ%CBC\eMKn@pk*<\Dn&4mIntCbw%CYM8wZZw*cekEdWKKpVwtcqqc1=YyB^JNm&J%Ttb%+i>
1Lc9<G VStG8q6$XeaVw^T=XuEa\ZMqNE?JPFEDb?J!KDwnYu?*qIKI6jQcL5/nRI?KbI<#89+tP<IJBlSC@<KT
jcn>bt X4lY/Tku=GpJZi4Z5GNB=aPm@PFMi88#K#<ybJTDGl9#R%u&wy4BMZE4F:p>$R?S\F#NLAjmktBjtS#$
/nKbZC qk8cPtPw/qbjaQ>CQ&#n//k@GQ%B9QmbA8VL4<L<B>jyAZV@<:8MRy</l:LCX#kTeEE#IFjtupBZ1Qlu
W5j#%F ttScp5VNbZp+eh&iDbB4e@:l$wWwPD>?&WunWbdIGL5E6l*a^1Z?WNtkk?*$cQLYmVG4\LL1NH1+>^mj
8#/%TD +!+i8*YkJMd>$K/ji\VQdJyThcdHZtGR*m>pPGbq<1\MJpeHJJe+V<8=QhAlH%nGFJhqJVN/Z1$C&$X<
@*TjX8 +&6!%^9$kA%Q1$c$uk=d@MH=8Fl*V%5ZD19?B4Zidl%V#Ju%b:??NP55w5T?Pb5B54eJI/c!K>dNHlTR
RbqH?% S?d:HL4W%VVw8GI1S*BbS4Muk=+A\4EhCjI=I<k4klD&1Mt5G&=ue#piKtbd!^m&9k^ebu>ebRCu@M$^
5#*u4a L%lhI<eQH6j\?FXLdM>I%y+Y&5CW\8X@/QH!:JBVYi/YmtNwVRaqEIEh8G&DV&E^lK>69<d9j6JhM&&A
till$E mda5yLd@CAH!/$/*!!Qb9eQcwJ1^H&NN1Ci9AP9%SH^ubMTq=tBb>Q#INJqn@pEDP*VwH@CbQ<A#kRT1
>c1LDK CE$u+n*nG8TIeATadIS\W4uaTV+8ELR#B6K:!AhF4wjbD+6+kwREN!PGb4q+1uGVDcESkn=^?KMpP^^Y
1SRJLC Pmp6@!\y@Qhye<=#:e\WX<VRX6#FW?**ilKTYCC!MliRBeq4&#l&S@u\h@G&RRndLT4TSup*by#TDTPX
A$WIqI Fa!WKJbMAC8G>yD\K:BDB@I<hG!:$e5ZCIn>HlRRb4/?>n8?>A4IHl?T*8LF!>p/HIDP>:EFF&qm#RMJ
TPEIF? 8h<1@^j?5t@Z6dT5$hMmWX!SeQE\+>hFRw>ujtuQjQnKq9=uDZly/WR8@nLRuCbYQXJM&BHNpcAckW>p
Wd*b1M 4+LS:*:%lK1\y!#QM1yl%MMLe4GF*d:iSn/J?h9=P:A<<S+E&E>9dFR@XB+eF+PML=A49?!I6cn1@k/R
dXEw@T X%GZ@wpKY<A4j$^8iKnbZpY+KB1ikk!PBA^@AMlluXyMJ1&jSCV!:WyT1JP^kXBteY%Kq@!Li!p%VLYL
9=dGhE 6BWX6BppDYPdAEbKmj:#S?\K!4%6=Xd:Z=Lh+j^5:B/#ukZ46m5BQ<cqy\NNR?X8G!EN&y?mVWC8P1!6
#E/$n! Q%YSYJ>Z*lF<@4jRh>dp:eKPu<ny$q4d@D9T9IDqLcldaIjMTkFHFX?56TZW=qdyp?eREQkYET4b*=/V
TR1hEu %<up51MBqWbqt9BaTAHM+W\^yMT9k6QXI8FJGR8D/+jJ:pykqjll&LB=?n\AcM6:/B8<ReI9/CD+GC?@
dkVXD+ J<>tH9FAylDe1!SeKMbi:J*XS+dnhDtwhE\#MHEFb=m:W!?&Ya:Y:ANCENIB\am86$YeGeZj&ynen64a
VGibpn <D5Cu\6+Zd8dM>QbXXS5&KEiM=^mW/h\CNYTXZAtE#wHlNdj\F!Cd1cyel4F=dWX$Zuteea\YJQEDZh1
KB<k4E d#PQ=E=tA=qB%pn5KqQbp^jD6Wt*WJ@>PB#E^F6R:Jl:?Z:55cmleb*?=k<Q/&IGpM9Z4/?GTK5VFaZn
69qalq iLTW:XCHV/pYH9b8QVyB1F4c+X4y\Ka&Sd?==/S@R@SjciE9?Q?&a*qA@SJ@ti8W*m&\PdmSMh5YXN=B
$%BZTd hak@uEpG#:Pt$b:lpa>y5TS+*e^aIB^YS*<P?/PcuFe+Am=DpBl!ImJhwu4++6a4jQC6lwK58p*:%lRZ
kPm<YT l:C=wPIpSqFdj&Xep$H$F@hYhu?N+?KGl>wCS8+hZS$$GA@plIX=AtJcTenL&mYiMZM!TGF@GX1u!EPn
#Vn4WD ki!WE?ZeEWtaT?+KJ9RHGd#RabK81SNX46G\DB<>Z8TH&^^Nan6LF:<hJ4q=dJd:k\XC+:ym61QRqb9b
SbS96t !%R9+D1?ityL8H</!ZbCmbn8L%Rl%>lkHwTl&*a8kT<yeaq1VQ8\wkl*Y6=^M8mVI&a?l48k!cNJSWBQ
I#5C6b 4nVw+=iDCG<DI\=YkKRX%YCW*=9GlXW9tI^HEGJYF/5PL<1ZD&dheYZhnCc6QQw>^Fa:GqL:uj4^YJMN
A@WGNb K^yn*EyY:4k*mFcRyyleT\D/Q8:C\F^/YljPaK4G@m!Z^1YqpSTQSYu:t#6^6kItYEeklZt:%8y+^yF:
&Tl!Nh iw66yDny6#j8<CpGJ:#@M1=>1lMqGJ*&%EThG!4tZRqe$JG?Z?VPTwWaSj^qm+<Q:yZTa>*Sk:^:P^ha
9LD+\/ JVbFnuk:t@jVFlSb?8RT!VtL/wARpaBqa4?p%^$LGtq6pkbpD^6Li$E*>#R@t=6PiCV5%<5AVh^ybKH4
N:HlCh 6TNFqAY1MN%CT^wTRL=Xk@8+mb$P::Q1Zl#Vj%#S\ej:MTGuE?6nktm%b??BVk6b:=kQd>buQpLV45Bb
w?c?t@ %baSQSNl@Mi8&yE!Katqw?QJPTXpNkw&nTiH6Qw*j@\4#Pq&W4Z8\Wm?atE8jFJAX?lw5?Z?laR>ie1h
nhyGbS &allR!?%*1wDTb#PqY9E=bm5@l6\J*wtb+B8$qQe+R@8MQqZ6FtnEFcwlCHA1kRn86%N:cRM*Jbk\PA&
+WYFq6 a&DN@CTHa^Xd>t*M$yZGPwdV+Z+#q5t1$S8h9I#ydTyp=8>XbZpkB8^86L4iW:IW&>#CpX<N#5>TyQ$P
Kk@C>q w<Xl8C<Q8ZtWSK9wXK1pQ%E=b/9X6YiT:\^#?NAjXt%AAL6K!q:<t1*>YGQD@DW98eC5C9!kp?NpH4@n
>qpB4m Z=\YQ1V>FhP&eX<ucKGtR#u*q&W>^K!iY?J%m!C+RNTRPDV$@NMhRK/ZknDB#Nj8&J9@H5/@KWi?mySy
k\uHmI 1D$:4^i:6VVjeyYR65QWM4T6Wcph\uZA*%I<n#IMnPTaMM*De<41n$I<SJ:l:+JqXHKy5NAjPS*VqFhw
K%VuGW 1Cp4^#>TPVIbjn<nAPHh\niZ9eW8qbF\wVED$DVQ/QZqK#CLd59$&du=e\TaXV\JGI*u?Ae$SF\^wMan
*RCh&u &8<9X5cFpnA<4L=yCFE1c$=d9AFj6F$8B#pDw1@ElDq@#ymB8eb?Q8u\lVS+*Z\JR:YYFbCGw:@59cDn
E@aDDd MV?FSjIJmX@%%4LR*Et$F+X1\V4<bu!t@9R9LEQjCk:M<eK@JaC?etLT>WH@=$+RWYG=^nc%/*\XN=eH
98jcmQ yN9*mj48&4N+N*ZeT4a^E!65\+a:XwkEPkub\B:6/S^Q^HGJ#E^YX>MXLS?^X^?<Y:wKT<lJAiV^mQ=Q
aQ5qY> mjR8>VM>PHmnQ+a6JYq*qMEBXJ:C<WiFKm4N^pP=hZWa#Kypk:EJq+ZDH<9MkNJV8c9DnZBWLT89GF&1
KMT1@u 8umeRiuC9!F6&1NNMA5QKYqpbBnG<>jJLTLYXawSZpGu1<>HbMY&?k1IRGGbZQYX%B5:ce1bqiqVFNhR
JlXCbn <+8cyAGkid:?G%$&9dmnm1lppb&ebRX1bVPHkL^XJaXSJ6qw6@CLl6/5#P+l!Fq*%AS<weZ1GaeJCZwG
uI/V6B i&=WGI#GA%n&wI?:t%9Y&YqV8C4Wde!bQC1:V!jE$$kViGuMXl@W@VRbBD:4mDW#BKqeQA/PMhDL9ln$
t1&id6 *5wSD?hBE=EemQCWyd\iKGSXKwY^#ypEmddwtN@%iS=IKie?y6HddpT%hD/G$^a>E?cR+1%M+TV9u19?
Fe@S*6 wR#d5lR$MJpjVMEekXnmET1b>bwd@S\K8?9XMLt^CF*@jJY>lCPti!caTXuClbV*@eq%9\#Vh9=HH#yF
6K$I#5 /?d8hii^Yl=WI@5N6Nd6>RX$qEnnb<@4YR&dIAaJcSkNj>tZ6TBm+M*LD>ZdJB!$/<&Ct>+I4<PNQblm
@5HCi$ KWyEQkhVRT$Ha=8&GT%tYCq6ZY$SeWGP8#SV#=/K+9&^C>L!Cm!&IR>9$jJ*ii*tmYHcIyllP:JDY@SW
GFG:jb C9/Gyw==mNblSnjKS&i4t81@=S>/%<q5N$b%Z=EqYk4<WYe:4l+>:>!nenq>KT\\wj%Ti^M4lnMGp&/V
ip6\Hw hch%eGSb*WliXT^XEK#e9cN$A&I^AcF4pyNWVpAqy$*M:ZX5C&hZL>bH:Gq%/L@tMKt$\?&akGkDcmym
4pDD6C cV6h<qY$i1PpVtuRK^yeiianckbcDud#AP?liSGL$#=kc+8bcZRYY!cFcaK#LBa$i:d1y@T&/KC?jZEP
JueI+V KB>eb5uNu%LkJN>tu5>D5c@4%<dX*9SaR$dVP9wB5G^!^@6lVePnqNJKK%%&w/PXCQA>&+^k<SjMi?cG
%C4YCR ^Nb/l@A?h^XDQJaEM%Yq1VG=!&4e+t&h%*#Am>@ynDV>k&hMAC+uk4\L8>E\$6m=$<:ipJXDY+akVAm#
bZ@\K^ jTXNtX&^!8hWdHR^m%ek>8=S@$=SqGeCS4RX!uF\nTjF6+ZZp#D/!h/9B%^8y5*l$jIdBWn?NP\=Cij#
tlTdhX LR8<*X>ERLjKA\?nl/J4%hk6pWZ<EnmH!kd49u^!dXCuk@Ym!?%pJNCWtY94>N#j&lPq/SKHa<T&GXSD
dM$*ij b%8FPG/^lYamE%RH#<GX=>M@JQC:ZPuFN!+6SRbG64CPH!*VNZblcIJTMW*#uubp&qpHwRB4Swc44q>h
&n^EW& Zt^5+*?>uCdhDSC?HYV1iEHnlK/i5G1e#Q\BQntB?*<DPE*>b/BG$bWhZYmPYN\qVCYRp!CelqYuGIKF
l&@TdG t+VCHWH%L>RTlWjPB1MI!AmBdya*DNqM:Q^!/#u9Ciw$R?kq/Y99*$mYF&HXq9:Pu$Z:jE*tPM#+K?@9
$?4dP+ G<d4cjjA9SjmhW%mVLW$RXkB*X*eB!lunp8+VW861qKtjCMR*E/!eel4uh:uJ%HlVIa#qXbLT$LFAWZR
l&iYpa 6GuF^8WuAH$6cPq#qTJGQjV/T4+IhdSujl:LHJ6$w>jdhG/kpNb5mYm#VQTnJmk&!#1Pjk+e<9@+uGT1
dAq&i< h\5VB\5NS!9\\1LiCNGZ6P6w5yc*%<mASh8:^$4P&4WCYT=8T*wymHujN#:VA>PHjMF9FBTF1FQJ9H9=
4mZIN% i/J$IB!qiTNcP<C8j<m6CH^Xw8wEd>M:T#=\S?hW/D!#yNR8E$Tl?<aS5S*ui!pB@1V/&8pc?!X#GcQa
-A^+Xj 000a5f90156001202b4 Page 309 of binaries2.zip
uJmEtQ 41yJ#qcmnZD!#AjEw1t*P>eKy91lM<=jhp5q4BKVy@M*eD?8L?CYM<QCC5yRFJb5Km5$ZF4\Fjc>EtTn
yDm4Pn KI5?<8MpKS1%B6K&T\PVVPA?WY:k+T^Q6!cY$ea@JC5dXqSup$NEqYSWeByFPnP%t^tlp#kYGp&Sp*&=
&!#waY aZX?hN4BBDF=%E#F9k\T<aSQ?PPy1IiJFR%C@PZ1cdTX1Kp5V^:al+idKXSGK4=mw$S^\hFHb:c<Eac4
8:wXPW IIi>=1AQiVhwA8JqN\kN8JyW?+h<bi#uHAQ4hC@?mkMFSi\h1Gpwqi:#KTkuBR:!L\W6*^tZV/uFk?Ja
i5VmCP lHbKWeWn&Hm6t+^>n4pd8%#K*p?tTkqjE><RpiT\ke?+^%c/tRKEY8b+X9k!mS4+jtS^t@VlHyDbi4Ki
?Sd#Ma <ce@AhdQ>ytqQB!Xke8?Rm8*>Z/kKHd^Lblaup&GlY*EdS9d>9=$P%aN/i4F>wQj*+iV$F!>?D%E<D:d
LbLicL e+J#\w*/?b%/mNVYP+@ekknZG%&$RP%^RSB=^Qk4Pu%*dRnC>&n/6R54h<nGWP4hZ<IAcYQie?ni+^KP
&5Gw++ :##JiKut9njGEp1@8K<EpNejEECC=KDy6lElwC%1p>d9B5kXJLkVjjuH=Na?tjC#ubHZljTdF<@YRH%&
8&bm#t jjK:hVNQ@udXwD<q=$NuHyu1+*ib<&w6+Vj%t/ajSXXTEaYdb+%:/1A^Z8&k/we#i6wi?ZR5KaYHDT^8
u?Ze^b $e+i+htnCSW9%BmQV<tYZE/!YcV!QMK6Xp/D95G9Q1qp5=B\#*5FVh^XD+q@Xe5=<iCqXl8&kR$D\k@F
wZWwPW 4ukKQ\!u:t!1Kn1nJM@h/q*hTmMcKpwuIc5Dl+P@WEE&BycRB5FF%TT<G#dwLa!mknFe+B1/5KEt1V:J
Q*Q*t% IQmAaQu!?TeCY=u6811wtl5LGiF>4GE^V+SWij>6pBPw6yC59T<nltaWLZ^S48#uByI<NGNT=ydLlb*#
ktt4nu 8CiIj/P%BJyVJe!=cAD\eMpt\@QLb#X>6ZR<Tc&n#ZRMClkmVE%@#n91D^6pptCL&!%yu1qB9c6j9+9B
GMFVm8 l$i/lPW?AQP=p/:V#lNG5Nq=6KnBwZ/uFIldIXi<+\dtCWjk<$HZlGI%=a4Y!%twQDw!!eXHqa=4DX@c
&KIXui 14FD!Z:NcIdLu5PQaM6Nl\IT<@hX!$hn$*tCdYlk8ZcAW*AZa/T>kTuRd4J*PY=B$HLR>+w99++C@ql^
c8@!l4 S^9^NF@!W>q4a>q48=cPyY#VMh6RkC\NbVH/G&EHSk@P4dT*EBmuQ^PACP%8>%RpC5CV>^?JZ6mdD^aA
Gmcj6& \@XYC8XLWjJilI*PWZP<Fe696?aL<HNSSdkY@AZ\?N>jWDdmyVNJZZu!==ZHJ/&?1*1M<m!HkDR#IpN:
%u9EaS AGh\X4bp8A:QWte1%=^\EH#:D+TE1Qa>qaJC%FY8wm85%=ma^Z>ReqS%bt6^^K=hB$A$P58L6q9BJhtC
<jF$Td %H&X>e%KFeNZNjKuHTHL<h%cLeYTy4IS1<L!l!B>T=SW\dMSdn+X<ZI4H\9>t=J4^=4F+*YW^nWVDuGR
4dld*J %*HlV$FHm>CMiQw1n!GB@\WW1&J6PF/A1SuPWNalhn*A^%y#Hj>6N#9Kie+uZ6a$^nyTWKLMwHaLly&L
TXLTbE hqV?I^WDJqYRN=*/>Pu5:JaApJPZPYl%=XZcFK^j1<A*R8B:?\bA=?hV*JI/4wd?A9lVDD^cy&jitjnM
SYmNVt <CiDQL:1@LGL4uTIe$=eh!N8:W<uJRQpIJ/Z@%1aLjt:H/hnQqH#F=6bjymp6TIJ\t8J<j4T4LQwRt>K
Fe4MZW NYpW/LT/pTScNn9uc?L!<KH&SG$iSaRbn9N/1XDIbW\lB@t#ilq#jAZWKnA/1^=H\E6e!m=mDc+*/t>P
#FDCm5 jucuPeA6=GPm@HEDYZL@YA!6V\Xm<bnIVjj5j*$t1D*WJZ%JwB8R4:MVut&:XeFi9uwiCVHyh<kMq+GA
ll*9ad 5MRn#/+!bVW#=?&Qlh8Q=Jmw9?E?cTD4pA/Tt/9Neb^ddw:M6^:D8BE:K4YDuKEBVdJV#hyLpt^AXV6i
RwtwKn XJRt\C4*HEY>:k\XHXLeFPWVyV/Cyk4>T$%%EKyHLcIu=t5F!h:FmGXbDHE<ET59PC%>!I9NHeNaLQw?
Z:ITND +XtBAPIA+8b^G?Bd@%#Gpk:Kyd5W#iBiejNSKin1<Y#Ly+H*/GwqNbtR=iZ/dc%ch?m>NjVtchRkTdbW
?k^k9^ ?VuHXuai?FR41n1&y+/^N&ac=H%tlLW&WRHXB%K4@:nSea:<k>p%XuM>\^@TJ%FSYMHFStF#CKwCJwmF
bcP$S# b$Xn9Z=Cbke1&H8i+@m^iEPlIV@><QyWmTX&\B\<dK!9G>+h?kaMbl#uJQ+<dM%>wi:6CB<>N5w@$i/4
qCRL%W #%d<!nR^+/ALBRRERjF<8Fld\y\!>E^5TcR61hPtpqJZHT8BmjXn@Ql$G6@h4q%bmK9=4k*N*\El?F\6
J/+:?$ @Vtc5cGh?w:PMbycGy*wAM+ZpD6Rd6EmlmPhLicpe4YJL$<&/*?1qDLtlXH\C%By9\HVc+1dPmkV+Hj1
E>yANQ j18&yVY><:XTP&LmbHtan1i5mTEW$+tu4D!t?Hie+6hMZCIK*Xc8+pC6SNld!yYJW/uJWKD/4wQ:XCQq
/6GR&^ @VidZ<Y/%W\V*YhmjC:I#*/ShZqN4AF1QyaSBYtGK>1jSJM4NH#V=la+Lw94TnpARtnwG%!P8lNHtY8d
XnIanZ c?Kb=j&GDqK#BMnaDBii:*ZQYiN%A&/1bcYeKMN/iuRt>eDMneKB5HRKkAq19M9BK//?Z+/5T\^eqE\a
aF?5yD TnGHVGNDBRwbkZ?16clGL*YCH&uIk*nmCYQVy#CW6JmXyQwqTeQ/*TZh^#G:S=Q*:?wh/HJGZ9qYy#iK
!695n& VPQG1J&HPwA9SNqaVD@CbZQSEC1qKNZMjliB5&YpZjpB+DmH!MTh/A$$m&M>&>Vp$LTk#ZXHN6=@!EE*
M+k!Eq 8/<Zd5&?Wa*KMa64Z1!\lM!BYk@CWcBXaI!iQcP&KwuTb>JymFdemHje68W+1q>?W1cuR@eXcY@jdG8e
E$>a+m SFk&pDSu+A*Qn^&8%6*i*iq6#^q6%W65Dk%FwZy6l/nnmiQ9ktL^<jHnG4^t^:Y%n9+GAA1ARQPYFTJA
=6t?GP \!YXBbbkVPRe4jZ1NAmRq1TV&Stb5u/AyybaQWJXK^EuS8Aa5SJWyJQmyab1h=a#^dCKhmBV^9j4=6hS
jp>+EM adel:tk*/8%$N$J%pIwZj!B=LI1P:!5uDI:*ycbVLEwwVHBkp4AZV9l+KhDYYWqcGcpN1CZ#l1I4@b^9
NMT%+6 h#*!ZcFa*GI@%i%!!9JcVZ>##EFAJ5FCLKy9wka=?kX+wCSeb/pZmFMZ&B5BB+/#F8tF1!+HZh@p=bCH
LMd:Dy kVA/5TNPML+u=P4*4SIejN9wTNCJ\E=uTVd:Zh9yiW^KNtcN&Qq5^\9\K+u=R+<8hTpZV8I/nmYCK<p>
D:@$9b aCV/+*+5e#i^R6pduaajy#eXI=i5!KET*L^WVd6h&wkp^hp5V>yKRhHB>BMc@5^cujmI8:hQkAS\LdZt
=kX<My di6&WkSQY%m1ZVyTC8YFK&jFb6Pk+RqZDjq?HZuL1K99h/4B4?L\8^$i<YW><M<Yt/XMZZDVbFSc\=1\
IN5%%L YPRFSkjPu1yZab#\c<XbnFAQS:#H1Mb/b>#HJSYn91q1bGbJQE>LlckRLw%ulEm!8Bw1eaKQ#m^88cKB
Zkay\\ GuNWMl:!LBibV=8:CD9S$^LSR5cV&EqKRc#Hmm5^%nV5:N9q^c4A%T>^1GETI8YIG?9WFCJ=P^pqFQw4
:4@=>= iQB4udtWueTJN6qP#iKTWH8PZVm?JRu>qS6%=T\j8ZSMT^%FSk5%Xb>SZW%+Y&Hh#lwlH<qJRL>aB*%=
HP6iYp 18ubPWGZHRI9L6MX8$iubh^y:t\=8TlKDTi^t:am<GQ+F5AewWqjMYNKA&V%Ky@S1K55Qh!mGmjKT+%p
M/qR#k +Aa<Ak8TPM:R=MnhDG8Y6W^5!KX8yQSL\m@LwJ6i^quhXB>E:bDFppIGGFBi1%#b&6wTdh4qAV6y6:Qc
y9LFHm i%^1W#+W#tb6yXN>LL&au%V+ti6bVj@%ic1TuZ/dHiMjmVK^jaCtYwQHb5:XcpY5p4>YmeMlwje?P5n<
8<wuF1 4uh#6$Wmj8EknbMc#KA<n+X8/5CnyyeX?<nPk19dI8HkqmLc/96A=QJnHbN&hm*Hc=!cSZh5&kQ&hiAw
denKYK dhIVClPMbiA4t49aNC=JXZj%:G&:dVK$4^\qnSbA+8Qy?ly!w%npiSw:4FZk5pA^Cq##T#qYT$9Wqtka
Jn!N9w ySFteuHqQ!Xb8>jXna9b+aHbNCVPQR#b?^G9QbXnXX+Ri=#e=4Yp1S$/@<N!V*?mW$q\IB!*$F:=VcKR
/Jy6*a IEW&%CqjA&bFkHF&E!W:PCJ^4MW&pi5DHjiD*A$dAHe?Y^4@C@mT6hnTX$a\X?M*@S=q+?GkC$\Wdw>l
4eWPGB 51Wh^<Ve!#qwb9&DjB=D?ACdXH/lCDu/@S#X**PQNnTjHMRTCNuQ1@%+@iNb6W9M1tI6ZS#FjmLL8:C#
*cB9?: 54>WT/b!^:#=<eQ*yHF=nS*Tci+<P>9/SeMuyM@*LZqlSaZBYBp:W44BuhGF^+:DZBQ$5ZQ5DF9l1==Q
HCIbK9 wKlt!&wNtuVcHeA4VqD61K&cdI:%ZBb*M<P6/1$&lc?QX9*ET@CDjA%Q4Fkdy4J*HdutB$wFH9WauVTN
y:Z&hB &q%J5GT+uWV9$\h=cnE6/pyERMuDiFI1tBtGyuj6TB#kPT9*HKi<=A>D6^tABtHZVLbIRMi:yt!IT:GR
jHuXBY :S\>\L^<:54?TSdGCWHT!w4NVjp8TSAnwbJKCH89CQT\\MId$W>+iFj!Z5ydym4uJPiZdKQZVuFZRkjP
naDuQF $*N/HlY>H<:=bZtX:eC9bdjDAS=Eb6l&WCDaka8hDA<uT9DSaJpi!$8bqHIT$ejJ>%VFSEtS4$*1ZyAq
FpZMHy #59<ZJA?=h>CleP?h@<QS%pYM*!XPTyYjBp^P>A$X>QnlcIubuW*A=AZ<+N:AA>hD*8d/aVcdSZu+5!w
H5q$H9 BYLtP<&e&5Su%J!D+y<TQ%TX/NP1lALIC?c5ild/&1&i@1=edt8K5b\M&IRV6nC$M#EpFHi!6:jXN<e9
m4$^!P BPV/jW61kQAPGNpiJ\$j@XPdK546\HL\=9=&8$MYpFXinj+Z^+AE>G1\S+4h%/ibT1YbD<9jm89\yJ!9
uEK^IG Z^Nqk4@%q>kQLLER/>i=SqdItik&ae=Cb1VnyHe%:/lJhBA4yw/&>qua<iX:tYa+*P6tGI$^M!NR+=Mq
E\H#?* >a4n419Q!T6b?En+ZKwHbNlX:I<$WVZJ1IjQ?auVG9!:CB^Xd?DjSuL9Q%E#RAQ:<^HLd=bXR8inBZ6*
4^NtHI HC%Qe\MBeTKFT*X4q5F%k:WLb\6&ThLyJLMdpjw>d&Ii<ReQl>jEZB<GcYaIQi%6tAH<KT%BZm<5Z:I5
<4n*V& YAtDVGCbe%P8uKGTDC^PljcP9\@Da4kd4Cwke6ZEjLaL+i@$+A^wME=?<9Hk/mlG?KWa:>L*^A/B8B59
=8nHJR b^X*XylJM!by:bX\YL:=l1AM%jiSJ1VV5FhmaYYG?RV@&A\Xp6?<qyEkSFJA:=*?YjhA&8Vk!FLBQXwB
^BdZFq MmFRq@d=>1TDCY##SYWlwNA+!N66cm^&?5RK##@G\VJ!cEe%%@QkHjCNEh=cmEL1&+I?cD>EmPByQ#1h
?9>c5V :#W:=L^uYiZ&@=1@nEFkbSH\Z/j#hHEBa\WjFE>N%tQ8^kDM<YT991&:q*mYFLcHE5Bj&d>&inKpYp@?
8D*tS$ GEiHZbW#<\p#Q6F?HcFT<h4*n+64qSR$kTZCTRCW:+1$5DJ+GZuAXS\*8#L$8\\ZqeyBj6kMkjbWe4Vh
yj*&4M y=G$?6/FS1d5pPQ9VL8k#$k59k>bPylSNTcij#V%tRkF/KbDTA9@qWKM46:y!Th5HmVL%*bQMj<%Z\tK

-A+8d8 000d51df19f001202b4 Page 310 of binaries2.zip
W&NLhl #^mi@d1>?P5euwFuF@?\hHA>ypeAH/5IZue?KG:Ml^$/qSim?@W*5NcyHXltnkQ!hYt+p&V=W&KG/RHP
%CdIB^ CiSZPVe!i%tSFXTEcYp#wJ%48Yp#&4Y<c?jVCNV*ih1\TltPHhH!ARmjq&JnlX+9twDw\DaiDF1QaynH
l^Q4H> %!l6>SteA&8i$m??di?c\LMECGNIpKDnMTS$eG?yNm+@nHQIWNm4$c5Ly*MkD@KE15lR+=%aJ<wdI/Db
>6!tV1 ^Y*Nb$T?8IhLSW:b#hLb$6dB^6:V%JSR&NVJ^hLM$6lmb&Y9Zq5!KL=&^4*=p>tYQ>PX\VBTMWTZhalB
MFZ!^h EhLlP<NbH1a*Z&8eX:md99!KhpHL\lM<9\%tt$l<ca%@b?t4jShHJn+#mT:5V:=G>JjSk<n$c9ne*DTm
b=b/V: wPQD4nM1KwQGFYucA5*V8+XQPlcSjQk/!Dp9@JS#@9X:/M5T6ChMclyj5dIk^YGBYEN8TF#=!\XdPyED
%VBM1n T5&#?t5n5w$D+*9mHXKP$mI%+wWqelRFWdudH58C%>1=@?D\K6h*ZpLkS6SXcq=cY\X^ij6w@Xc5%$@?
=*H$GS CK4LE/cuVb8S<DkGe4BT=tY$&&+*dFIAdNH:nyjcIN4:&+81$S<l&=*#DwVI>D<wuQ8u8Y%@XMmL@^KA
$:/PE1 Am=YDVZVq:edGqRX8kVkKMyaM*?n#9tjP:tt+c=MBEPaFM>ejSF!KT:bp6*wXKF+^5iLB*wucbRT51IE
YJP:=X @%wKcM%Di/\5EhVDab@/ETtZZbQ%:EQ&Zh!>DG>=EuuSlB=pCHM$aEK$@::c!IqP$pWAL5a$k9Gt^!b6
ebWVM: >Na#G>6q5ewJK$!X?dZb1mn/9Wp?F^VG1ZqnVbYDRK5#WTR/mA<m5kja*GL?#F6InI=bLnSQGIc5P:^W
+%E=Z1 QB^$w8y?!5*bYkYdd>kePLi5K*TKTFk1$DMJXKqc#jT?PWaIdLVnaP#H<MbZ:Q?e:4GJK4d?YDbpS$@1
q6!%t5 Bp%AtP\jnb@&E1TL+<K#SE\1\5JiuF5WFAqK!lZqkScSRwe>*PDRtPh+wmGBT=J*nR:l5*j&bljWJ%Sj
PRCJ&l >@jSDLK@KWAW!=i9c?QK8<Pc>=\CN@d8$<>N=Yl\*MdNhIWiY/=%Si5t=bWc<A:5KnX$@AIWuZF#d?ya
&i%ELE LhTDB*qcH1GIElKYn6A+ckZ8btP:Z4X=XRK8HJJeIC/qB4p#KHGnw%!BpcP$GAYGCqKnAJVDhKmRW6b%
EjA>kt I9TnRGKTyc9el#HTu@!DDSX5bG%<Yl?Q1$>=<DDDQaSytp8/T5I9G4EpmuPj1*!w:FI=G\S5\nuYYy9T
6GRB/B 5eyBuQunJBL>p<bI^ukjT!ZLA:h/wm/&?&64RdHmT/4@tkTB\a\$XB+#1Q?Wn%+SPqG%E\bu1W6:FqEC
\nNYbA BiA@y#kdKEw?qbTpM^ZNu@6B4<BZFqSM>M*cQ:D#JK!6m81J:*$4uG56tijT&&?Q<TjW/1JPBWXyWRJS
!>/S\# Fk>4WiaB6?XG%uFdymaFQw^T\d*F$4VWTB?IBQ1\qTq#u?n=Mk4kP=a<$uP4K=yXBJkZP:%WH&tuP/ac
&Cy/@e l/IX&91YHhLaDeG@qTX&eyYQm&yeEme\IQCuTD!C+@+C1KeZ/VQ&EVJCNh!Gbd&h/A=l/>Q5BSYN9T6%
ia?enN yBN4N?1cmS4aQyTLi=hPTRe6XL%NXEq+FypFuWI%a1uKt58#TuJCyeE5c@hn?Z5YKQX44LhWEQNR^6AP
!:l4ak juA*McJ5SA1h1k=J*6Ydnbw=BqKB1C\KA5GehlGB5\HkkK>*klSZ%ht*th*biiCeHDPEA<n<FL^b45aY
wF:lYh 5YalB/pckhj!9Nbiw!yVk>:l5BHPK:+W5tRlX1meLLQt/@*^Qi!JW^%Dq!lFYXItctcVyMlVJnpFZMiH
HIn&^L $=Y<V4FQ4/FCYp:!TPFlq^JSdm>pCCt^enVVaEXLpKL1+%<AQmTwL&WaSn1MVwC8QJ!&W%<@B^btBRwq
K?V8p= IHCaP&q<cZKSTQTi%5/LCGF$yV851&IA=GW$G+n8FiFR4/IRtupX#VK4Gc$K6WqS^RSXWSSASpiGC1pX
L:#V+b h4GC5?uit5$8>m$1K!p\!>Vh4I&uh#IQ6audbX/D\P4GuYCZ#yP#<$#^q?+4D9G>5HnI5Biy@!hFEbyF
D>XScl $:=d5*8t\&t8btGed6+Wp:6BwqS8whP#PlG!j=1XMN+pEu=ZSuqmTmWqQZ#bk1ZiCia=FT@E+DDP1>nB
nBb=T% RTNywTlWEiPE$%DXVmiq:/m?4^!%PH@JR%$wipP+dGa+jh\%D6h%d%XV6a48b:^$e=N!YZ+X#clbHMZ&
hiWuT^ 4:TpKCMMmEXS&Yq:$L1:QI9nu<w/XCA/\:jMIWeL65AABEeKyNJu9tY$%?muNe^lC@\Z9*HI\<hc9u8/
wb9\cE :=ZCCy=X^Z@@AKDmd^DF4GW=RbLX8^i6=NL6QkPq%I\BjCt8FN9wi>d<+p*56AhE/c48aDh>45N/u#Vq
A*9+pM j:CjL=1#Z4pMMpRuZV$SkhjRcPj@LXIS<T*LaWFmd1t9LY:hV&cIQmK>q=/MX!VJ>cYn@kI1n*!6^NVe
LZV\lB %nF=Zm9bQ1#qDlBDp+H%%+^C&@<w%>:h@4%&DhE\I<cJ=%VnaZ!ymi%mDSctNCZV\N?P<SJLPcR^dY!X
C5@B&4 qcLK6\*\QGcK8=Ym+<bV5*SY&NVX*lEnc$puF>:GacWDnb%GDawC:Jp5?+lZ<W>Tu$M1n9<$<=cG1J*I
kVKu5Q M!8$b^^**llHddBFyF/GHyXc5A6W:/LNm6W&&iI5q++qmjut^FqcSqVu1Tk8Ba=@YWjjj+i9Q%8e1k:I
^1Su1F ay=8PjkZi/p+b6>*WCY!d4&EV^%?h5P=F1dp&Jd5TJ8/+>=q<hm&?*=ZLq=hIYtRjjji/L:=hti&EZjN
hklF%\ TnTGjT4F4tl15jwEVHDlD*S5W:<<>1@cJAd#buZX+Vt9^Rp4W1DSMFhAK+h*h4DY<JA+hqJHWuVp*qiW
QAtNu? D1^/n1=uhPL^1#a9&TJjdKZGjI5VjtA*u\yj<GW6Hwu=4WmL^R4NDmA@y/e!d5HL/uW*NM<@iced!hlE
ZdadMK J+=Y+m<*8yhyc\p5!8#wYC@HwR%cd/\WHmDcNH%KIm</dGpa>K:PKd\d1ZCijMXm:^&QiCXNi:tHE5hi
jS$FV! D14h!\Y8\kIM5=^%/QMLeHl=:W*V+M$b*n*GPC+Ec<Z8y9n$\/<Ed9F9y=c%^1ITqVI6y698llTuFnTq
B<w%9E /dIt^!!$kZwKCuT%>SemQ4ZE@cH9yGJ1hZ*1ac6CZC+%P+4d664\u&QE^@ENF*Wi/5E#D*!bqR!SJ\\u
>%M+l+ 1eRYM&nId<Xd8w%1MiGm\@Rk?dXwEKyI%AY*N6#iHhiY9#th\ZtlK8^:T?K/iB>%*5T6W6tHK991%JFX
XLN^8H eNVE+4uC%HEpiCE4@\Sk^Rp1kBHTi!Zyqb@<Y>XDZPVJdG%1$dk^$/tM&#eeG!$qXBYSiNbq%BLBel&p
84LGIY 8lwM+8i/4B?4$YL=^G@&yD$l>\k@G*#5@:LPSK%FZVp:H?mWPLX6l91m1I^a#6Ct<nQGi4y>m:1qhcZl
w*Pj\H qb9T*bnA=n?kCA1j?%AuPhlt$dEePai+JiVpP?\&ihPd8dthnhCSlC9KI<**G6@F*>YmW6PdVe>tLT8@
\DbYp5 cGZLXLBH9KTj/K!mk!eBhdm>5Bb!cqtbJ5Jca+=V*u\89::cd\\%DGIXWi^DR?6:4KYnE^iQ9>FHG:u\
F&Ih5L %9yd:/aRt5B>y4cK4aL8Q9@?F**XB6j$I*eya!q5k%9c\mDWdSR:XQFccc1ZbHHklI^9?bLhiWJ1kIy&
d\Y/?b GQIRVi\#GjC5GNXXmAF%+/lcP\iWe+S>Aye=>$QMbC#@XPZjKC1Q@ZM%4!e:K#W$QRH?Bci*1J:&W5E@
KCIA\m GDnGMc&*8Ip5$dQekmFXN6J:6&/1Q8W1X<nJMm=tm9u#4BH*16BWYm9+ZPd+TPeN<a?9QSi^WyT!P<by
H*VqD< yda4<E9C\@Dh?W%hXqM41FK8L#wMp&Tq@j=QK6X:=9:!$Z^TFcw9<uWktA^y<KW1D:NX*huLnjlWZ+>j
bXj8XV W!%PN9nHaFZ1&Z^68a/y@QFZ^e/@H4%$Y!#MIiuSjV&Z:nYP>=\wh>EFiEhXG+Sed>bXXZnm8LQT*FZ?
#6HEGd FEqQ#1nyde:p4\linV81q@m@F5Rl8j4K!ulwR<>8:HlPtN/KkG$:*9I4@lVRnJiL1RB5nD:<\yZ8Ip<&
uB/K^m ?899m%!9Ry@%j^RF8C6@9&wR<6HTuN#%Gc?ecNI\cJSduW9leGcPlVdh9jaWyTdnLYwyu^CwmauBc$PI
?/NS$Z WNdj<TdakyG8mBI8jm!muQSkqTE*Y!<eaEB4hRmDYZYMi*Z\5blQ$AuDZG%SA<ct$GTDXiRSSeMc9<Vk
9EZiLM YuqXA\E==Jlpl%H/lF$>/6Q*Qpa^m5$KFya&qk/Eewa8Fk:lSSFHSuQeq/n\/HM+6X1bFka++J@hmd9w
?HVt%Y &C+5>iJP4qH#qjD?QD$WFhTAZMjFNM!5#antK94*I#m66&4mmp68>hNCW+\SVBSR?C4X$*/INKJ4b@*a
nWJ<Au PX>WHmYnY%4TSQh<+?utPBASc$APFaN^ey*h=i*PcjVR+pam/FJh#y9\tpy9/C6^8NAA5hPjKhS6!wR5
+SAK%# X!B#Zwm&B^@Z8Ahm*FMqCWF>A*h4ipW/IR+lAG<Ct8Q/8QQ#F@Hl>N&&A/PZ/V@1/L$J+bCeL5yla9Mi
wQ5w:c ZSqCCLp#c/W!%Nc?TA^j$R<8Y!It$%8H8Yj>mSLe<>T:*:WCY1F:<8c4KK+!iVWtR9YW\Mp&q6#jk1PL
EhVIea A6*Z8Iw+#:Ki:BR+bi?8d!%=/n6>RSQlN\whQmS$mFA:SacTGCC+nRu>lD1\YY!6tGT/Wua$=<1S8p8:
=1=A#W LC>d!CFK^c<GtKqK5>GFT@hZ1NGwmBp#?SB*m#$*jc^%\+CR#eq\F6Z8<$WK6NJ+5X5a6PYqq!WpaPTL
$qw8=Z Q>?$p<4YX^q/C<t^C1S/=NWj:aBedj@:A%KjckhB:^b?WhkSknFd&#%J=?EHcWJ@ichey?wiyG8:*luH
\&ZFih dFyZE6%Fu#Mb&hPIeNAaHVq5+^echP88^DTPJS5#m%9Gj/XScL\6j@iIPuV5p1mG5+#\4PHJ!QIT*VTV
Z6Ww1X 4u!X%EEy?AZ9%l:q8q@A6TE+hLR<h41c:KDuP8*j/@TeEHCcJ*B<PCN?e$paqKbWaySRj&<akqY$=ZQ=
%Z^ISF IkFCnAiRMTnDybEk9%a%DFe@/wN9?yk9d\e\MW1AnEd459X$hK&/uuawZKCa5Bk/1LChiNDF4nI<5HA+
I?9V++ D/q:eu8CD/R$&6LeL=M5NTBRymbnEn?\i@m@GYW1QnIb>Nl6<8>qJ^^8N9SXCt\$RMELpmw4!TF95PVj
KF11X* 19n$8\KkFSyyl/I?9eqXeFCc5Y^QIL@th68Gb^bu=qc*KNq+4>c8^SN$cGJT5^aZ<cipM!D@JQp$@!JZ
+>nZ4? QdlpP</!SS>C4cGN65q+!@b1Q4Pi@^8hJ#Km>k5kE?<Lijb\lyF6=kqZe9Ycq$F/@aKm>W&^u%<c$SWX
ye/G5d ?@lEH/1\P6BYMYJd$I$\mbjE1MLGZLTcuDq=yRQ\n#KB+yGeZ=l6N\P!548Ihq&&DEXTNXc@?6eY%y=c
A@RdkZ JwWy:qCyKKIm/#Q4?<Gy:$>T>WW%L8SEq#=*9!AJN8aLwtm!6mn#FAWG<nM8aB\@%%Z>Tlyhy!$$KBL5
5h=>&A \>wMu#h%jIi9Fnk6Vimuq#JTS^K&JK5%^blQ1Rm$w6@C=STVHH4D6S=@AW&Jc?jQiiPN6!lS/wd=&:YS
<98D<C V!eeP+P:64w6T>Z$1+\!SS<w$=+VHe@nH$ya/=^4E</DXAXZLL^CmY*ZJEPL&4blq$#mm^T*hG/W=:VY
%S?wb9 ^A!tl9HmZ8/IajGLMWTwjccwJXGkGkG1eMcK8t#D^YM:jmwR:hZRn:hw?5$#>cTG9i:&D=T#jmhJYFLY
-ANIF4 0009e0ef792001202b4 Page 311 of binaries2.zip
Q1^@Du :SRyS&c$R$hJY$5$Vcq$SHVZCwpF6Ca@cHanTM!pB4/QH!1<MF1h5GFLE<=n?5Z!L\ddWn?5C<Qt!EPI
R^>wRp j+AL$1Sm*wXWjqLa#Z/Gea>iQnF\+lbbbRQMSl:k:QR5Y/YeTGC=+#qb+*mdelpiIpncebjJVcq6+in1
luub:W jQw+<C:#:*//=w!Y%=kIPyMYN>wNdb%Z4a%Z5148Pjlhkue1S4Ti^T5G1YW^ZVnBe/^SB6tDL94X@ZVB
w6k&aE Ic5:EPFaFC^KmL&$KE6AhIeeG=MC<yL$%J$yW^<pEdn@%hiK4=I^YK#KqWIak6\jhI$^dQqH^tuJkJ&I
YyY\Bu nZBWX^MnNyw+Cb^8NN48Yiwja%$^/8Jut:>+nP#Qi5*IuJZmq!S:>yYLebDuKaqLyV65m$y^JSkW!ZRh
L>Y$<# Fm9p:JB#$8RPqBmjK$^IKN:KB8c!X1V6C*#A1p1/DQ>n&^@HuLcWELD^e<XNBFASp!a^?@B!c%ySwbk:
pL85Q5 5\&A8c5Pu6hFjmu>ZX>p*eKi^%Zc5m\IFqWpm/I5KkEZn:A#%Dc$JdZ@p!Gt!4YKWYEbcVW@duepVC+@
5dGPjL 9WRkhiWKL6<mTjJAA6\?LdSQd@aZ1cFEEq4eZ&9tI>58R&WqyAP8+=$5F8yK<FL4TqYhXkC+jEM#\9ci
FZ85Ik aJKIp&IquchElJ<^Jup@tI1DQ%Va6NaXl8!4Z9JlSMy%:KR+YK$%GcABjn861L$6N>eil6G9XDZ&N9b$
/4h\1C $FDTqdLFLW=1pPY#l:5wpecYHh6/:XbIc=K=LtcNQuQ?<qZ+XJq4qRm&Va*Wt*BDdYiXd46/9CWPZm+F
=B$1Q# :qEm:TEV:HeEM/>lqNt6adeD^&R!#^>&!PRShGI+J41bP>G^ejKFB@P9^8+jI1pQ!PYqLyqXLEbdYJT\
&N>QXj KANFRbTWEcQhQ6M5>TGu#:e%?PH4^6nlpS=k&GWnutHMnQDKeB\p9$b48Y6>$n^:FLAm:>!ae^@F4k\\
8BFR*n !?5KJdDJhR$e5XV>$Y8tNCQlCiLGVqK6q#QbCY\%PM!4$DhGID<+BY+814?bd9wwH?MQXa5^>5^Ae*hV
GT?1pm VA4y?*wW$AkkIS\w+#!M$%8Y?/E1hDXab!kdMPiZWZ98IlJ<b^1<H#ddLcFQ/P&C@GuTWIwN=/jbaW=N
uJPJ8V \WqI*K\WF+1$y^m1+8p8nh:LLbcqc?A&\bjZWY8PX6A?9/nGJGZ$E!e=X@ZPY9kdtX<\%t6mdTyR5N%!
ME<BBF ^=l\?X!Nw54!Kh<wyqP@VRmY6q\h4Zewm+yNFeluWVTNP5VtyAbB#iTY5ZeNGZ5WbyM>Y8#tXXIIut:$
yQ&X!# !w/%\RHNXj<W$MqWpRL9D8A&K=Fw+&d&!HLPwW4T<<%&A4I9XyFiykyiShN:iH&X^9YAHc$&eh$te>y9
aT$Qie ##n!YaBWiL/^TM?Wq*%JHPu:*n6N6Pc?c4$Pw^uX6\w:&Dq#G99$hW!RSelRY%5KH:LJDCte>DE+#EjV
BK!!ea P%RN8\5SH#R@=k64/C1KQ=EB\@>cNJLaV*PDu/%YVek5y!<X^q\Q=5IaXWc/jMNiZ#kN?yCuMnKw@%1*
?#kLeY Q>dya4ibnFp9Hc#*hDN#I&AyjTyGK&jFdkpdL&I^T&#mDM8kbFEAZWIJVHVk9a#19Qi>Tpi5e9lnA#j>
dnAc$@ unGYy6ni:nQNE=h:!<lcWVLtLFac>e#ct*5%#&d+q+Tp$=$%*RhWdX/1qAT+wu=dKSL$Sh:t>ATET1/I
>Np+<$ N1WDnFP*/TN=iBA&i%jQ<5DMjE8?4aI$+TEH<qw?^yEtP#5%^aP<Fj1Wq4wpu/Y8jcCB*m9&Pb8j8MY\
1!aa^n R*yENRpW:FcD%e^hVGh5cucDlGmk^Xe>a!aXXkdSQGP6ncF9hQLyZGMXA#T4@CmndPiEFc?XjyNR?Ll<
u+HC61 L*itM%MNTSnZPKAC#EpLLqNChKuZWZ+M\jqTq+tZN#*VuYZ=kY1>\uH<Xk*6kT1SL$1KK9D+&&5l6mB\
8hIWhR IXn*FLE$!l4&kY5y^E=L^nlDDW6Qa:n9Khu@eFp==aX\=Y?iaWJ@tbtK+?hmF\S+ZdKu&>w/u:%T/#>j
dp$$b! 4\?Xi*%y4IEYIE^YyIk@+9wnBZd\RPM9bR&tiwy$PKP$G4uF/9T1\jEIuICFk5epTcyyyTkS#laZNV=m
>1BT6L aFdNjB\9+C#n8?yPZ4GN&&?bkL1L$mB?/H$mWwytPc#kMDH1\WJw8WS9PBX4=*tpm\FJuhn5A!kTaP:t
DJtF&# Hj+i4l@Yic*6RcjM@ZmGq\5cCk!<cbYp6WY^cVSaYXERuyMw!y4HCC@jBX+1edup5hubPC&Z/Q1aGcHc
!PuFE+ dkAFAJ$HcL\A*NLA8nlTR&!QuP@%eQPyIqFmqRi&T4nX4TSq4biTVH=Hbw@XFCba<pLQ&^4EDu1Yi59*
Ve##<R ABjYibM%q%cdum*Lb:LN\Kn=ywc+LbTuVJMplQ+B*GjAZ#uYt94M9&S59yAil=BjkbetJ*6#cci+Pt<b
pnX5D\ E*XWTRNIVXXNFLadnnAP&bitaJS*TPK84X!XkRyC!<&B?wyw/KC+6V%%R=BWVnG<YG%GK$iPm6Xl:i4J
4+M?lE X@NQt4GltiLa#&6dRV8PhVyhmYcBDSh8FA&Wp99e6w4cWnM#m#aZq+59Hh5MK8T1J>+6hVt&J<+mGTC9
t$Y>Pn @cy4Z^IZEtSa&5Wk\:9VSLi++q1?e+^Xp!&XJGH@Rjjb\NNj\qm\1M*S@NbNW!kqQ/?tJ&kbjD9y%iFE
8+*5!8 mh:Y%6VJ!R5yDJAZh%yKR+yY?NYGjmuKCD5w/?lZ#RDIkp4?Lp\RI6BcmVKJ\$kTtCYBE\?ThQq4/luT
6%uq<! Nqy8F9pQ=Fh/u&lRIKGDHIS6hS>8M1WuIEl6R@>YMBp4eDw=^h@lwRA+m5j@GV%YhqF=im!e!TI#pwA%
PJlZeA kV!5EL4aK1=uLA+l\+@h/jJW^k#V9>JLK*cyJInt6w&/iIlTH9SiZ4km4H@iq<&c+CmBIT%#SKy?aal/
J=DZ:A Xm&Q+$%GG81$<$wNhqc^MG>?<\tm!4/*6>=tK$>%CcS4JS4$:nEM4\ZyqDkT+B&G6mDi:R4:YQW&nkSe
?&XZWD dRZIXekL8e:EPK/1MTj?>6lkAhj9?l1?/%lZHickhW#n#YGPqSbNT>8HbtCiLq/NB9$D*a^B1<WJ!Mab
9D!Hmh bJ:m%qLhTC^Wnu=A*ZDDZ$:+B8SRtIY5=IAX>$NmukHB#FZ&<?Q^naLI*lE/l+NPpe1%DF>:u*#MMQ8c
t%qFKF !=yne:VBA*A=8\PAY9wA@&5kSJa#!hp$DDV5yQQXh!=N=ceRRZDu!9$XmGl!51l\G819e%w1n%Fk1u%1
>ZdTR< Wc%bHnSTPeBNhyKeZMiubJDRyiR^?uM*=ce:ZSXh:??1utPZ%XR<<LL%<5*@ZTQMW@XN8SP1Q9?>X^p+
/E8SB^ VK!m4lNW6dPwnj$qyb:Zwt:W<V@@%j*ClyapVbRE4p!WH@mQ$/\iqG8@$w%a!%9ShT$pm<YNQ#lSPTQ%
=*CBaj Q%eIP*+jX*Z>q:YwZ@uR:j/Ql/wT\iVbCXWi=*YZk@=Sjcy/FqRM@EIW1&hRb?ZM5Yiq4Pyk<eD4PTpE
?e\m%% XDk=8Hlh%9Tc6bItT9^lk&5u%E/WJKT8pSj%aHqe4=^G=+6/1un5h?:Zw\9KDcw?nWJ>:Fe%&QEY&LH+
n&NeqA qiw6/Cc$=!9#N%?wuCaaX@@PFXXGjeh#9ceI*Q1jp:B4yWq1cF??5%\*16yk@Fc%*CD@&iZ:iKl+VG^T
P5^L1u %b+PqkP8&LEQCy!9>FKDNmlByKuy8H^S=hqKFFA%/%i%b!hWJ\%W:hwKNLu!wj@K/HwJ:NyuEJ>:C8^/
!6a<be y>Gy/H1%RZ*!d:#Zu>iLb<>CXJM5BXLu+LHaVXLQWLYVAHcTH\D#FCmB>ptG6%G6W?XpEXAj*dy#XS<w
##KjLE #SqV#+46&B6@P@%9@bbZ>eFP>qlwFt4*Rn$*Pm+Q=Ijj1j?Xnk5Bq+<ZQQZ\c>$GqF/DiNd/@^jy9>K^
:YHENm !>yIQ9FE11De@!QB<TwI5&AiSHwPLqY1*VMI/H9<?BA?aQ\tNNMEi@hQ/5Z!Kt<<cF#j%XRWkYPEP$+K
\ScBJa G6C6hjbA/ypblM6jj@K*%6S#aHKY>b!+#4:R%B/h?++RddBdJ!=4S9bKM><y$a+1nHLJ@4hAwtwk/yt=
mMPEGp bG/qlab/nm?/=i>Ei9:JZ\p!1L<VjlJWWX/C418/jm9APWjk6i!p<Yy:XCh:%I%TNVBi/uW/$NWuS+tk
:Q#ELa 4@\$9bR+5!d@cdd$#qZR?5!4Bh4HRV$E:9T@nPJm>>t#Z/8iEnmXj?nF@^edAWZeF<*@Mu19@8KL*jZG
<S%K6B yWyijwVtjehJ1R#%TwuhAq*ynZ/$AFQ:+uXb?&b=baNtD>TcPc>1B!J9$AYKy9aKhkS%$m>9WJEIM>%u
%RQ*=p VckcqGPnbwQhDq!=FdDGl6aG*SWpkcdhb@&jTmpKPqQWl9uh?8XFRRS1i<FWk#YkT*5VL6cw*9uR>H^T
bSpSF= nqXQP\%KC>ApCXXi\jV5\P#@J%t%tD14@?k:h5C%4ALuRE@ei%S9>H+S/nuR^@>y#AK%Z%:<5dckY^9w
%WDkIX RTHSRdW4u4yj:SNiCw^S99=KQSucwHR6wQwwaLpL#MGipP*SaK<$q<#nbI*1JX@6ReC>9+S/n>WV1P8L
dkL:9A WD$bBjWV4cAGInNaXM<P8BJI%XB=h>?jF5$?MRTM\YV9:QquX6j%>:>AqLjA%EA<wC9:%jae$NVRS@yd
R\hSIZ +*Z?m:I%*wcmVpF6wNID8nZRdKA$Z5>PaG?N%Z=ih#4W<!4We%m91jtJ>#?QVbVB?MS%jTRjiPJ4PTu@
W>?kwB E+IZ&/MDt4*+k$I%\@@T^kD6F=eIdbT::!uIKN?^#Plbb>u**:6#D4c1/@4JY1>i1ATtHcDcHiyJcJV#
Z*<WdR Q$jX?p5D\RK%^+G:wK89$NV&CDjZnKy9kM8D6Z@Wua*??^aILNjbB>YK^%&?@Re<<9yQ:j<J@D>ql/wD
Yk:m=\ 1Z4&Nl#q@b>8GHIC/eXb@W>kQun+Hbi%/?4^cHaT%D5CFR@A=WhRi/Z^%G%\*VlnMNQ>u4^w8<q\y$$w
6GGWl/ 1G>ZwZB@<5>XV$PNT5?\DWyjhCwNT5e4\Y9=SkIAAB\%6A1AN&D99?M4AFDIBYpEYCAAM5iFCB^<=Zb*
/5K89I i?Y/8dK:KC/n=^qZyb4IKl>nB#ThV&T%9^um5^kL<w/\GA8EnyQ/IjIH@PCWm5A/ZSu<WC1WulHe@bDP
me?SJ9 R*&Vlbd:q#GyI+wXkSj?hkI#euQ1eu4ScYh^M#Q9B>:\<5T\QLi:IG#yw:9E#GdD%Q+hePyj1VmYhydZ
R$Mj8l MAW9F>C9W9mLPGaw*=yuKBkKnw1yaCnTARNIV#T^J:tReClt!!Elj%D$6wpk1$h8JMaVLuDKG<XXnatM
cJP9QR nJIcBDpawhSu%:M4\HISl^GuEkX/D>#?5qE4G</mG1yaN*WmRnHW8b>eat#q@dw5QeeQGTGNNjFVj$JN
^P8H@k wWEC@k+CbKPl\*p8uu1S=c6iV:NcXn=lZeF+Z>6VKTR1TV>1:16X4PCV/1/h88V^wK:b9\HulLGGV4wq
Bd+<pm pKnFmZBjbRDVGu!1>9?5Xmp+ba9hkF1+4VRdG69T&#8bq\F#LkB6%5qqj!j+<Gp>jbG^G6V!>%yyXCT#
6nP6VY =i\=jR@?pB8kyTeYy!n4MJWB&#\4>lQT8RiqRPH89#%$$AQ=yn>EHi%88TDJpY9/&&cMkdN=VbT+E<Ta
twT6wD :4PcS>t/<EaD^etTAwT!&/Qe^mypR#@98K9\/e\XFV<?J<TqSTw5iEZlhw*#bAJh^6SE=E+t?:4NpBT>
Gct9jG /E&L4+=pIwKRtkbI:SPm/!W5^DdHuk:XQ@$PXuhFBRF=YS?BTN<S!w44Km=F1##D6AjeV&<pEhS:E?L^
ukb$TJ 1&&JWn?I5*LDMHXFGqc/I/5pBKQG1^y$Zb6/t<&>mZlc$!:P&b4lBpBMcPhPREmtGWGwJZGTLk+Vpe^T
-AE/jA 000c8906e34001202b4 Page 312 of binaries2.zip
5qQHB# eKLcBEk!BDI9LdD&Jiac9+F9D+?nA*SS\cDCt&5e$8THl!<a@EQ$muX\AFctWJ&JVl#e5WpTpYCJCweB
G/E6N$ jldWy*iYFtyXnV5Wd?C1D\lIdPeMn9NjX^\ALwVV\4XL5Swd:GJuXaek>u1w\P?+J1H^/BLq:#MdAa&H
\dG/hQ i:8#@R#c^m=wJ/5Je^h1@\Sj>ZpcuG<M?Hybd!TkcaiA16WSKBkP@tBFtqKRHMik+NGA9H6kESq&wMuW
nPFmw@ P=cCC:Sl4JjGnXlpQW&uI<u&RH:ZSDF@E4!kSeeCtY+nQ=9*6jbyy&8Mi>mRC>4a<J$Si^t<Cia!=J?q
dCYbkt <a^/+C4>8*WN<9wnQM$hICWVdDFPEI8NHd*DGEmJTdt#=1KDX?<9cEVBWpViPDH?BHGqqJE%&Im&$pnI
qE*@nV =qdDHKAD=kZ1Eude9H:T%h8uBWuE<A*:N:e%hdyRl$p\!wnm11Cj^9DQnEXHq?56K!i6&>nR!aeNI*Ka
%4k%tI 8@mW5@kltSdY$mE>1iIb554$!n#hF8Pe<%yM5aCWbb!:dHqyn\SNI>IH#JB=M5tawnMRPRNASDtjIaYi
CcRye# >Cln/8%8:%btZQJjF5mGWSHF6&5^4<WClutTt*dpH!RL:S655jB&&kSqLJR^NcKyP5+#@&BIG>MT^^CC
q*w1W9 dK=GqIk9!1WmjX@bld9XI@5HjhCNLi=DRK/4PQbI:GN>qu=<nAGIJ%>B%6:qa>Gl>m$lqkQIJk4XLQ#/
J1JHCF kYLLXW4T#5>V/kV1FFkciM%u:9D\C*l\uPwGQ!1pbJ8>6/X+DT1RSXQw>QtM\1DSN%nG\48RWaW5^66N
pR6!c5 V?K&1D4#tQH6/:GnmlHX9!+LbGFeRn8iSV^\^68IY\Xm!ih\qKI$XyE>+aC!61dY!<&wB<^4%j=i$qc1
FSiTeL W*+/d6B?/eCP@1e9E1NjWuH\w&Lhlhl#tRA:$XGnW=B9^CIRIZ5yNqykq1j%+ydP?/T\\#y\Z@QkS4dh
ebC<c: NKM+%:XHX^^>!+W%lPKtKq4aj+5bm*!M=C=P<9Y5$!+i+C<j4w\bbY8hXP%yGy@!65!KIJ*eB<HVY4kF
SL*ej\ 9Sa@yT#ySmE8DkV#JQ5uuc5>l%c<#KMQW#n>ac6D4dh?ZKjKL%%c+V1NV4wGCV@Ehye=?+&M4:!@&C4b
nER$^R iF4Xn$ai?wy11ZC&YBRkqpCC?:6qi#b9I@^LQ5LSY+M?YEccJ<RKH:T*PQLn*KW6htlEAcC%bNN@dLbB
+HGWH^ T#NaeFC1CdZWBpj&PHG*TGRbIVTLi&:E6J<4m$?InANNh6Scu9DG:w5y1eAiehRXuC!NHV4m9c&9&<*a
B+qPXn ueFY>%i&l>c1K%D#1:VpKln$#LTca#*9:ccT9E@6%?>41:^qkkE=:HKZbdI%I$8y!E\LyTl>D6Vi<9A<
mkd+6t RkRCK/kq#+kT@YEG*BdA6^GCWMZ/BVn*NTHY&ZjkY>PiWF<9Ju:!bN+Hai!H%9y@Lk!#Mq\\Dlal+u/K
N<b%?A 5R?k48HmAHq4&!cpqSiMa*neVVC6>GKEt:+J&:A@<181ylcK*t4GZNc+/FnPGK=yCw8!LiBeZqTbtpBA
9+c>l4 ^EZA9^bhNj4=!hFS%iLpucHCL=hkR84qe^>a#+5XTuBEw44Lynatn95#*t1dBeATp&=d<+S89\KnD8c6
IQT4tT *XQh9NA/Cm?iq&jeG?W^NeE8+T\HE!c?&^T1Nih%#^*C\^S/yKQyk=FEQlS!Iq8a4l?G*/k/@54W&$l/
Q@SE%h pcy5KHV<anckk>NNtQ*A5juGuk+Yyp:P>DX^&1I?kG!pMuIQY6YV8\S8i?TDe:qE4!E&N:QF*iKV#=P<
6Xml4j XqpYhBLGkNE<*5\yYel>p=+Hm8?J?H?a<I#!?IR?cI\n#n6ND%MCqLY^:a4!/Hi+ce%@A:hFhYQFXw$^
@>Sw<T L^Ib^tL<RYT^M&Q4k>>Y?tPZk9>c@AJ8M$IGLZN5p^+KBn88#H<BX5nmN&M9cKSiAWp\Va>1GT8VRKEh
CCpkIY 5b:>4FC^T&K\n4cp9\C9+p+M%F\lF+i%ecI+AT1VtHFkBy&eQNmDQKcStl%>HeepGiqH4Hi9HG4P>IKT
w86dp4 9=itd8eJTJhSpqh&?#yNMwAL!=YQ*6TwCnuJT*Y!N5&^YE%MK4^M4NKbQ&bGj$N%RMn=TuLThP+JS*m6
Dj4b?l </ItSV5CTP96SkHB$c4T6&Ap\1juD@HhW8*nZ>SJQWMe^i*@YpEb*8N%/k/u91*?YnnVGNwb<i6E<hjd
99?HD: *Tj\mQ>A!C8=@IEJ9?^<LmlnT@L4Cwy=Tw^m4X5^X@=y#C&Y!hliJAJcCl+qdw=NL/:udAI=p&Z@yJBY
>yk>pB eISBKM^\\#6et>CX8?SRKEycSLQF@nHR9n1EYRyecKJ%tidS4eVelbthYph4h*i&T>%EmadHdn^#L58^
c&Kwpe \DiAF6eZw5b!ia%8YY!HGl6XXIhW6^&qPNhC%H/9\AHJtD1Q+y\9ucZbS#%h1S4N$&EuC?QwIJ!&EEjG
CWP<#A Fw9E=b\4\VWIw5cy=9yb8*W^KuLFC@YmhSDnK981EG?JWt^PS9SGp88:<l!PGR#mQN>wuTp=6&=LBVnt
^+tLw1 T5%%*!%*5thD49qH\D?L1!%5ZnGJ&u/PdMa#!>Ewa:jWV<>/^ZGnWHIY^=/\<j9/e^X>wBi@^6TVqIK1
6$iY^W ?K>>BN&@TH1<XLM!NN^a\aTMDRW@FnSw!@R1VqeN@kA5m55$*Xukt%HapSltbdAXK\X\/HB<cdC=eb=+
uS=XcM N1c^+@8h?J/Rj!k6L>DF44!mpah&FE\hiK$\&6$lcPZ#16yW=&PQZEHhRXYV:Slp#Wt5LEt%t4Jj>#?<
dH$SMa X:bnblX#cHKFH%ZjhKIS9XT\C@MqQe?%%B:A>bwnLV::^1a6B^R>b?Ca=k9cS\SLK^N&K14K^N!X8==^
HAq#\q V:JHnScVGuPiE<4qeSuRcTcBPTy*QA!dY6HCD!R&Q#u:PEnm4bKa!uEKMV^uXPNa*p:muZCnX>uwKjVj
WChqe/ LZc#8c>dCS:u&!4d^<he:J*b=G?%CdSwe4FDb&Y@jCpL4u^KBhKaA99=5+EQhP/8e/8hV>Y/DIAeBF=K
cD*bKZ /c8h\CGXu%F4eE8Pq&=YGtkaPjYib<WbQ=c8K:wT@t&\9we^RiA*M!$6bNV:AY:E?LtYR6XakYd^LpIn
5A#1/= /KL1ZS1a+NyJN9K&dVVcq+6p!M1kAbic6XWZTPM@VhjFdXt$^atM1#5FZDI:%pb<+A:4u<8?WJjG=uL*
<L+klV wFNC$!9Nb58knPE&AYKm#1qcPyZPTH/b:VYDP9QI6$KchDQ+6QkRmn6F/>^$e1=jtwSJTAMT$:wh1!lK
u/T!9: C^65$XYFwAV/YpM>C+t:5ywLt6lPc$SiRA1Y5+^8pk%8n$t1^8m*Vu9#XhqP>Gb19FFBXKYCka$6#?Eq
6N4Bw1 6W1nVLH85L/YQ$/6$IN*4P:m>MZCij/LB+i4lkY%WPBVhyim&QBZ^<GHT<4B1=a9$e?^#L<AINT=8:1V
R@@iB: BZSw&8D5F$=8+^:ZQVdP@q66MNLE*Y>1XKASNXHM!y5/XIQWiSL<jRFY$Jaay*w1M<k&Zm@aJWp<%P!D
QHFGN5 Cde^k@$+=YF4dVAjBK*bJSLXJKw?ZKPmy1\kMMECN6ER?im+miylR?^TtN^1%cdeEt5%V6W$9DNYTe^H
ySuhGW lKjtGHZMtp^bF&?%KDXMt6nt+W8W:Z/YHCGW#l+8XS#yd#FCRVYKYnVJ6hRPQN?SPNnAbAjuJjeK>R^c
lY##:? 6R?ZB\AVmb*n6hwVqVpd=K6$<%yTpQP\hCWTYXX<PDTyW99VYQET&X&Pj9D*lW:d&ZLLDydl/=<DHueq
Hy!&:q 1LLb5BwuRH54ajTy1/Ybw@QR^KMbTCVC1ikAy+h#m:b#*IiqKLy^B#uZPEEwH/@cHEmcAZ:VQ#!kkwNn
QiqBBu eSFYdnFPy5Be1$bVV>AHFmFXW=1Fhlu9^iRG9IpnApZJC+:QtqNJu*4TVND<^!#9RNWDHP&w<hAn#=T@
:kn/Wk /KcuGW8TaMJmF?yt%b&HcE:e#ZFyNu/5eYl>!6Pc%mLhYJbajtHFPPR/GT@4T+$NNd^YyDtn^IyMl!ZW
k=G8VG GSa4Fd9McRVZ&B+LXj>ThQhi*651/!ZPDVwC</A%+DtIG=?^YpWDuL^M%I#P*hFDPuSc$>cbM<y4hmd6
>1a&%C WcqRR:mhJQL6#JY?1y1EaXGtGW+^CYdcj\HZ*L*9F@JLCl*Xc=!:8YYX:WMFM\F+yeG=I%ED8pbH4l9?
:<R!N8 $FSduJ1$Yl\8TtcECatMMt$L$WnMpc*GLVSF#AQhhIZGm+8wpm?eBXT<bceNnKn6wnPPI?Rk*PXFmI+b
I/a6=W q#Fl5YQC&nIIS1Rqb#G#KW/q9D/#clS1NM+=>VHDC/ia4Hd&Y=K#&/!%4GHy>yni>6#VEDFVpBZ1m8>@
Y+Y\qy F\1pyua!V>TFmYEI>%cmGZ6VwX6<Sb%H^F8Mk+h%tqdeeBuL/:pwdcMub&8>55=6MJ^!B^y6t$PWB&G^
6+bJtG P%kh?G\Q#!ZtJiETPSW%bb&+1pe#jRb=^B>YqS*>!R/+6K?Spj1NA@lK&pj8Ym4/m+G^\J$ppqXH@nlD
Wbq5<e N<c8M4M4*cB^#n$#jQKNHd$RB5GSuHWW\DauD=KRHE>#M>N^^>8lK5jt?uC\JaFHRVje8CKenL+iEmIw
?Gb1m1 !nLu<=kZ/=m:GE<#btB=JKCm:KI%By=Y#FaR1!HeSmYXQR*VW6un&6VHh<4yp>e@<%wDBp%k&IZJPRmp
NP?Dhd @KEy6BLuMlYY11@ly#^h<HP%Kn1Tp$y9C6+DJl&#%PlH*Yk@I!uK!@NV4h$teM$c9LIh+&l6$w8\cdK!
w+cYb6 AD5=#Z4iImQHPm!b4h/u^NYiMdTiw%NeeX1yuhkn91SKCMT+\FdjBbQeaPaeL&Y\A6HS1yemD<TQ?1Z&
/:q:&h !6LP$tWZ$%kW5RQLAnDSD=Dn4IZ:q/GhWj9y!yQGVhG4FGXd+iQG1Xi<XD?aT#E%qWiNSy^9y!W*!<*5
+D6Idj =5dlmFpHS:E=L#9cuQ^8R\P:Lnp:!+w%yt1K*a&dGX5YPRh55aIQhX<^^6JY<#PG/e8R#?AXDybuytIN
WKV@:X n1?6TQSp9+CetQh=bV#1W\MZ!4%jkG6b?ZFCc%Q\le^>GNc6!5uj^<1??&uYbF/4=SuMVp^%hH98B*pi
qAlT1K jM8k<Z^eTyI%6cH+D^YjYMmD@KF6iYEY5h/l4t>1LF8pD\CNd1H+>dVwWVuHW:Fl8dbSCB9buHtW6?XX
q9mwZR Lw5JM4jZ<6MGK9^!+\FTjmbHd<PQbnBCb&=:4L6=n$WDhyI=ew8wtXqCSDSB546Xi1Jt^%eFB$D%$Qbp
YA!I6B At?YJP?K&6E&BFe=!RtMND4a4JR:nXYN^\hydNV1nG>G+^D%>84kEBe/S+#j&udWa8hQLMeKuC\t%@%J
+ZQbQ4 &bl>YZW/1:j$5Z=DIPQ#=y\c^k6in#QS?BPc%?=pw&\<ycLY<Lmh<%IMi^XM*Y&wjHcw#lHA5/CTM6H>
A^wTtM ^quWI9QM+KC&pn<8HqI>:1!>4T/E&+IVJ+Vt5ydl*EjLFbB*A*S$J5mqhNWjkWVLFE?kuaai1=WJR?w/
mTVRG6 GZ:I/l@Sbb>P@5>k5Tm$EVeepMMX%e=?<hE@l61Sn^\W/SVS>Z5?ie\G!MbEV:4XY?w!\Su@Rbq*Nn8Y
B>AhIN yZZJJXKDMXDk4!QpL@##FWinuumLTPlpcY8cm8<EC\:IXiwdaR9JVjA+&T&M!@k^c/=B8J%E^NTw$bP!
=@9Fa< bHeaW&MP/?E&Mib<iV:CSWVIt:%wYl4DFuGYnVJZ=FQcKbTu^V6lw:c%mGbmiTLIKPT9XJ1a@8XGV1J9
1*R+WY c6yAXZ*DGH^DJn<<$JIS^IyH$98PN^?Qnk/+Peb4qVbXllNnT1CpL/TLVP+kK#8t$6LVlXj6&5Ei%6p$
!JSl1l l44=$<4FMXL6&1LW&c?t58kJATH4%+*E@l4^l#\Y!#uZ=VHdJqSP4EHeEknDX/4S:/h5Q@TkQFkIXHhA
-A9a+@ 00025f461cc001202b4 Page 313 of binaries2.zip
pb&4<y R*dS@?!YRJX<puIi*d?nS&cyMiCZ@&GWn=C!w=j^H\=$amb8^#Yla9m6X!TX<QFC/T%XRn6DNKpC#^jD
phl^cT ZEK>uKA^HjC<uSJIehuamG9Jt1C\VqiKSZn81VhS6k$w:Gc+bJjqEZ8X/VqMdk5#t#SLKadn+u1>nXK=
L#@NSb @%DWQWH::#+!XqaTj1X?h?tHW&maPB+!w<VF6!TS=S8*4Zli$?V58D%PPw=bl\P=uyl1ZqFHLDIMF%lu
Mu6=8B ?#A%ecM>X4CTj<?ly=S+YX<@%WyAVAIeqyuMSlnYRCm:Kjn<5!?DpDaCIb*\bCPN9#uiiRBBq!p4q&=G
a<Ep^Z <tm<DFqhFi1?G!kXd8Zi!a%V?@\Y<+bXP#I=:6eV*a:=\mk?#+FHX#N>ZiFZhKTZJLH!y<nbDb5dFpEi
H@GewH TnAXm>%5yk/n*8DQl<wYM59I^q#SwAZt4kh5?6Qey@>/ZlW1DwJkJmD4l++wwwhK/@NRddVS4Ht&mkea
iFKTB= NLePndn/IJh^htV:h><6T9&F>4JZBkaRFLAGG@@>jB*m$S<cyBCG@di+PM%dmHE%uatDRR*$Y@wA>Q+6
6hX?N1 EWIuRkZGA>PGK$*Q+MA6&BBh9?QhWdd^!<@F/jBmC9!ISB?qbTiFZ6:I8Sp+5#^@=X8jiS44QeZCQVP?
dDnC8W e8W9c!4uGA8LYRetueRu%wi11CcwFa:tPn+ni\?!Z/+\5t1NRa<C9T%\=Wh#qapLZPujq#C$Q6X%&c\F
!bjX6u dqdF*jeDGJpkRFjDFbhT+m#!1MkJ*j&Y%kCPdV+Rij=J\YTJHjbpm$c>yM=S+&5nyN1n*QH8+M@ME<*5
Z?LE4e Lb<44w$bL*9=+AlP>c*+nL5<E5=>R$SCGdX^>\*^utP5MG:Ttk6RX5cil9@uN$L16jakL&PXXJ8ei86A
!\5HY^ 6YGe<EE@S>M>pcC\ZJPC:F?=Q8n8e%!qdZy4Lk#&m&TTiTt#4Fb?@q!a4y&Q\WeRmQq&Hq%R=a#^Cn6p
FP8ILL !>PTF#=DYhk!aHPHdR5GbNm#8wK+Hq&16j&AY/$A:p5M%&Ima**ki<jQFAEERj5!C+WS5a#\+H1FmMPB
X9VtE! DVZPY$dj@Fje%ut&RbemRlQVne+*Sh<Xu4Hq$:PQtuSZiTl6:k?WD?ii4$#5tcnywmMDiD=@@H%&X+Li
jiqlJm $:SqbP@AKMEKA?6V8X%XR#^K5!P$#ZBRKFK=qwt*G96WSy6VemiaI<D@%bk\5p+qF=1wq5DpJTl^j%F@
&n\pN1 w1/B</l61lN!YN\X$Hm!<@IeZBTt#my/IJRD!4%^1QyPk=1!yjeEy1Ah1L9yiQH<^WhDWPF>Wp:!DFh?
Q1<+@A RVtke=$FTwGW4%\<aC1jlAQKX!@C=*YZ\GVyCQ!?Q*<4y5C+/4L&XGqSL@VAtIHpNPkN=I1nylC^IhID
jB&hA< =q#:HFV&1CdBPH&t\FRjH#wFqq><+m8?XcBh@P*j%E$=eM?CL944hE@Mw9K!ik#p1nCWHw$68GDSACIm
Xi<wDq kp#^AEkHW!hui#6DG<D@a\Q>4&9<j!d%NP\yDe:\#j<NwRC5AF/kR1AbEMD9j\$a<jj6>!/1/j@p\m1I
d45<=Q K^BKt*w/Yh1bP@@@=$L>*:q%GPBK@&<8NKAI+AwpCZV#j*KBAL>j9!jjKj@nIkIR@<hXeLJ$M*R^@S@@
q>eK?4 @\<d?4?8>j@%>:IA:H@h\X^J!eHeRS4w@&D?*&>QTQwjYRGA<H?RZa%5LI*@H<D@I%@l@H<tiLKX$\AX
#=bkX! ABD&AkB\Gjh@*WL>j:Py<Q>k<@@<!@#@c$CtERD+>SuVBqEBe^nVB5eAACSp*/<AiRVAWITSpACQmHlX
Y:he=J W%NSMXWYaSG^/W8l8ac4V94JJq9WEStV@@dBd!nZDEtZ+Il6$^j?pmybYdjcbm<JKSdWJik#DIEP5Dq/
!m!X1E dTaM8u4^&b@^=WBcGMR1KANyaA%pcAy:YNNAYmkD#jWB>55*@!4=t6KQ96&:u>=htH$d=6C:Hw#jMP^B
G65VQd DtQa@ik@cip*jQ<?jKb6i8iA@!B&kTPQkJ\?#l:J>/@Mi+I4qTp\@Q@E>QuyH1m+a^KKiaS:iLjqkS6R
4K?S*% CB#6NH%K6446e<>H\y^%?L>6/DQ4AN41n4Q8bDAV*8d@Pt%+>JVD<ubKCBtNFKDkl*?JpF+PJqAR!+qp
M#d:!$ ShdVmwY1pRKyTAe*Sc#EYP#EjIh&E+19Fy>:/cWN*%&:Mc^=GMNF5*qhGVclmm1GniBk&6/aQG@lKn>:
Rk1LTh 4mmQYFQ69#PdJNb>KGyaDc4lQCHDFp8iMe>bVjDB=HmiD1&D6Q^4T<y#V8%pYdG5Y6R5cbS%=@CRj\V+
hewGWe #Hj>SRYulJlmj\@W^BnqQ@qa@pS+j@D8W=TTkVC>l!iIBe=h?^u><1bab@5nmP8<HtHbpZ8tR5G^DT&j
Aw6nEY 5DNZIu%Bw/kXba<@$GWkGIl&\EBC?^&lnjKDw>bCRulIB#iWeL+tXT4dMG>cMCt1JYtXCnpYHVGP$^lL
wX>WqX CqQ**+C\Yp#ESE^a*tI5P4\tG+h6^nb4p\NBjinQ%b1LuZ%cm\5NaXWhk^wHnkN1*QhmbRPMuJb:J46e
8TDt9* Ebdw/TwW@j+*YlEhpTYm=89BeHd9IYJK/t>BhaVwKya^XYDQ+kQA1@K8LIBQdP#ZE$e!N#!B9l6t!WqW
9VVeH5 <#*^pZV5Z!^<KE8FBy5FTN$jA:*:/$AD+!8aVAVbCNlJ5+L6mF15XIeei9=NiHyeHXKeTX%BYZ\/q^Wm
9+ZHt< L<NhCB>SQ$?Wp*4SaR^h4MhcDn&H$m=Ge/M$MuwFn1*eVJ1Mp@bMV=%X^k?*6FZYcW/EZ8lZ6B8cLjY&
we?aHE Ypi>k?:S$j\/=JA!I*CYph5KM5>muH9SG<?pCKKhhpuiLhdcpP\FS8ha5iaH9add*:<kAaphV\w@*R+=
&Ld*be DnpJVCLWXYKaik#@DLEMb&m9btbPyCnl*AyiB$km9Zhi8^>>^njBuAt5\qlMLIIlG@qMKVX&JH^i=mCm
1kBTlD VY=A5KLNSePm#Sn@nSln>c9Lk?!?Ce&G*DkFFpyctDeB^^@Q@TCGVLCn/>4$neh$$%HXHVPiK*Z#IMR^
p=PZtw Fbeb/uXy4Vakp\K9hD<pyA:XBhS!c+%pMAlA%YJN1tH1L1i^5Iud^C=u=<++a?lcSGt8X&Bb<=bX^/6R
ZeH#PC NyKQMilBl!EK1+&SW5hieP4*#X+ei@ypX4Ya9<9FltdQXu&SVL&R/St!hn$P\@/Jidehu@pV#WLAYhe6
!Jp+CD BAhGF=VcL!&KbWJ#dC!WwZ1a1ZlHcT4MXekchlhc\Vc8XTnkya!la5jneHpt>kX1B<^iIlEBu5+!nlc<
YkY+Nd TP49XEK/?Xwm!&TbtE!W\tYbJBQGqci*abL^!SJG=%kmn<WVWdRweB=e!wNZ9F@8aRSeb=IIZARtAS&Q
Xjwu8A hw@@XuTL@bD^/CBCGB&T^DpZSi?5dy4$RWH:Q5:%l<SZY59%%&>*#?DuL6QJBc<tGIL:dBci5QA/<En>
:GaXmj KZjbB?V6l+p=%4eNtd<@EPVM:VND\/ZKtw5%G*8tNqDBqL4ejc+6/PBy#*\/ZNyi&#HQQYRmiMV9Xn6A
>y:ERL Hdt+?JtyS%N5644Qc\6$1!P=Z6P>9J5DjT1ayBFSJ$=$YPa%INAt6AF>k9&NL4=FcJ*k8%L++*JPkSeM
A@@bA= 5R+ZQ#X8Nc=hMP>56^G<*kmTZNe*uak6bJ:JJHSXtFlLcJpy8T<k<5nWEnK1bw&nAt:Ee%=Fj:cEu&wi
?Q@1Kt %R\&Q+aQ$X+<Xh@RX$1:4mpFhYT*YCRiYcl56Yne/E=T?EwJ5BZ5jK*T=IRukWYQl$AWL@L%WAV:<5el
:t!ue9 AykRMwAaEEHNwB+@Eet?Vk=P@Yw#NSpcP5:>dca>Z\i+Pb*9Yq%<<*#!LuQuQ^iG^F8cLSc^k1lC:a%=
dTytHL ARqKt#hBXH1Hl1tJmVk\P4YHK/^FNjW%TAe1AGY65YJFAkX<&<^<cj!WQkbK%^TEGBc/hjD>C::?&/+b
\1m?Z4 @:RaQ9bMSSPIhN?NLkb4H?S9LEi#NQ&dbdCdh5QdW&L*/WEGIe#kG5d*X>9YeWP8GDY\95eMLGG+9ek4
EB@Kjc *n\#V1=9*^6B9w$GTGaAliC&mC8?Le8AKEtEjwcE@CE!QWu6q6a:5P%E@B&R>*95R@%CuCwW\Z#^$9<c
%#D6d\ GAF**h<LC9m1:XXiTZyT5V8RD?b:X$b?lcl>AdS&aNiV:414RB\#Tp6WjHP#<Z*AQju:JheJI6^&!Lac
m!te*H \HW/RH>$V$d\@RQm\4TdISPkHS^!6>>ahdM4JbZ&nGCp\S<NWJ@R*JtaklYED#FkI/4+MptI=SwuKEd9
<l6Pb< l<V!k*KZ%N$<t?#$^BhkAAZEuj:&6+5$L>kTKBb+<GIWl!1mFyZaFid#G%ci^#dN5al@+ZJG%KIw=*ZK
M=u=XE DTW\<Hun1Cb/XA@uc\yB@E6u%&&J>ZaYqYFS/bDj!Ww%N9P!=a#hEw?&$FHB<N@h>@hFY/:!FD^H5$lG
YqTYwm L?CnTip##u85\ddmy^64@bYQHRB8#8T/%15DAnVS!Jt/8N5:YSMKPn9dG%9?X:5+E@/9*FC&N*N^N*R!
N88tDC JXR!6VE%hQ+@Kyw/IKBIkDRwIlI\AAaMGBRGBBkIAA&FmJIZ?4Z1Vbm5iA4I/#/6nCB?yi*wJ6kByuK:
AQdEul Vc$?9lAG=AyhE:G1cjnPblHm&phIZ$XcFWyb%AEbSALE\JQY1#4SyYih4&RC+AF=#&GYlcLehcX$G</Z
NlQWhk FjAG!%Z:>?8AdF!\*XCbbuk/18lwE9ek\4wceE$6GhkS<TW\EPDbSaD^yCZi^?Z!%^WdIG<wmJ<:>Gq$
I?YmNI c8caGVjmMI4F5NnZD=C*?jH=<jh8^j1H8:=!$QRP:N:XYbLbi<j+XkSHwPG9a?Z^NHP^K1G>iFD\cC%+
YQ<K6! \MJFVQNCu\bt%8<@dP@:/#VKpLRyd9Ftc<Zd^PAuIN=Fe@YTPbERPIR>V!4G<t#BAq$?NylPEIW<*DYa
%F\Wtq HyZ$YX#KHGMHMd\GPq%pcynT*^#>CMnH81^CNi:haBniQNRq$W4lj&TjZlMbh!ST6hZTZGC*M^N5QEFn
i$>ny? FlGB9eHQwIDFBqCD:XYKhKhEYFhEL\?i?9i<l\1p!p^*1\:h9XyRluZV\wyuP5R>nae9I4D>i1Tb9V\c
S9>ky# b>mn?a1?le85@XiDP@4Z:J&1M4$bR%GL^1aVm1Pma^JV98u99/=XdEDGDVJhhy^t4CPY9&uP^BNX49mQ
/l>t@9 >P\tc88C#qde@@=wEl!W1+D<P8i:HeqX*5yd!TjpcH#Ww=9eZH\<kXu/1tc?<anp$wXKG*%P$8ZM<ypb
TyWu4T yI^+Z9hmb^ml8&KH#Y4aE?^cqyN<GH=aHlT%Q%$^KGWn$1<ZaqBi$!8yJCkkVnim\wTM6Q5h>dtKY:KH
YdWM6@ Pi/BWSedqa#S<pDawqYp$?jan8*68mTbRQ<lpDYWwmiWNSb$M4E^JiT^6SZ+4%cqN:c*=RMC>n:S6w!4
wS/IZ% =YPmcRLp>W=1GwR>$m<Ccb9WkQQ@ZX5/yyAD=QCmi%t1Ge586>&YY=T8hJ#TlMSlyaCAIV4j#a?<!XHq
//^DQq XAIB<SiD@Iw<d$I^^EuN#+ea*qZJRddp/S/uS6ZBVdcn=MMN/MT\IGQYDBppCaXuA4^V?8B6m#mBXdHl
5&LKN& tbq\\@?lNSad#yklH>n\ijKCNV+ZBtjKkEBbPilLG#QG!$ATS^^X1n6M/*XCpu/QcH8$6CQjpVm^k4R&
\@XkY# b+:H@=MbGSKWM@GhJLF^m\V\J@hIaLSa5wCSCYamAXhKAQIPXq=QZ:HXe5V$h$RA8K5:S^Vi>+Be>*:k
!JD4ih bm?%TScaMk\NC6HHEi5tBwWS&FFyc^cVdEuVpDb9RN:Hqd951jAdMnR69qyVc6IKkiX5JCB9a<!GHRA8
Jj1XVu Q9d1$/iTBkL>y$b%64+hGM+EESL\I1ViC8pQmiFW$LFTL9RIh9c8nMRy**J9%!:NRdkBXKyYmHwiJ/D/
-AuWGH 000be68cfca001202b4 Page 314 of binaries2.zip
iX?AN1 PAe^Mmqeuq#>KtMTJ9pGG>^6iw/^qL?w<Qc51d@qymVQ!^8#PbP?4=/wPj*hX8MmQ@#q%lW<LM=kPPM#
M8wSiP d9cL>6:=ucA*CqT^1J$Vp%j5^LYEjhe4B6CkPZ/K?NcRp>!eJt#KQp1AaLNt68GAE<XD<Iqw^QZSyw6>
\4JiHl iS\u/SP?K>dGnIu6XI%8$?XabQu&\XAZL5VD6NqlJ1J6y9:q&c?uE5BEm9EJKaX&YkpdA5Eck/D!tpmB
TNT/#d ZW@N4b!DX5kEFq8E=DW4$lZM#jLynyRt^mL91C#RG%R>b+LlBkADR@\/dJ1&HEXD+=&YipmI!di&qyV#
%Gb:9Y wJ9ZR=I&aX*1CM?IIX<pb>M=&9L%clTNqK*SZIe<5Wkqdey>lTX\i6id+1589iLc<:dSSdI^H>IiRYh$
IQDHV6 Zw9$<\>ynWnt<@!<Eyl?ZQ?ywFc/DX!*$&YYZBp?XDeaM:J&KnJS/P<keEBH5P<Z&qaR11q@L8ECPY\J
q/N@/i jBCjYmWAB!\weCHu5eDQbLpQwQTPLpedEtA@9d?N/6m>GAm9$>B#aJGAkP*wjl4q%aWSZbL#i=T/%HA:
T9i%ZM Q&dR/8%6^%RID8FYiuGApQ!hcS6c8eTjm&y*LB1RGmtCt1tL9*I/k!WJ@hQPkJFN>VJ%NlKPIQlZDSMJ
P>u9kP PQICpNj+6l>&SWpBRqb>Ghp1LmR61!a8BMm%%Cl5mwCLqFDSy9?ADTjIP</BRW=VVy?eLBm*9m#:cjR/
MH!=Tn *y/&daP=Yn&uG9>+R\/tyed$Zw\BK*$$\W/\juC<StLlYDY1%Xcn?B+pY\HK^<dci#L\>w+V@!dl<Q%8
IXtj8P DQ!nw:49n!GLeVu8GEYS%cJRPZqPPKB*T!Iy#Rw$jC&?wN!jhcGY&TI$cta/w&XV%*B+CuK\ukb^Kenh
HHQcNc J9:Tk#&tpPpcbCNc&/<8FRu!\<>1P1emla\kNnl11T$kN=FpG9ce9QK+%PdwdQ9HZ1%V@yQVDJ8LB^PV
Y=JD6k wtwpHNQi+ql\ady9QPTeRMcPl9q$G!XyF>qqVcWTnp?HWCD\98@!V:Z=:5<aVqTWPIYTZu!G@REWEqWK
L1!MnV +eD%VEl#QnL=+d85aS$qK+^Gpt\!WB!YLpkQ!K<WD#Ru@#dNa:4X#*BmyM:MGRJ!JCYhChk#b#yT=a1?
abkp9Y qP*9$1wdBS<9D+yDqpe/An4tlZk%yQq:6d4:nTB=QdPmETh?^Ji+yyqeJZDnKGZn*mn/EJP@&B!\bpaZ
Kdd>tp 9Q&+tPWNn9wXdAL@D\Z9lWuJ5NRSlW=@RhWRS8\KQFhNSIIVF=1IFKGt9c8hPTGQmXWan8t:j^tZdR<*
FnYC@Z IC>&R<N4nAINDi/ch$Vt4R#H/Rj9G=A4a8yk=FHqjuj5IkjiytJDyi$5Pe4mpQFTV\nIqTNh1D<eTuS$
E?bkh1 S<=DQwP*ZWumJQaH=L4qJyVJ=RY?lw&k/GY*+eJ:mKeJw?aAeq$a@QdQM8K\mFl1awEHd>JQ&IQ$AZq6
XVE6%n Tu?!d>6$D!\iiWtYFGKHDlwk^!EB:dPT\+up#qdB=a=I9dy\#&9@ACp*u6?$j1i%+YmnGk&cc6j@%wSN
ZaqI1D /H8DN:6lQ64tDwj8=HuhHmj?K$BB/pTqjq$<BNa6i>:ZuV<J*/W&nT%9NFiiH#V=ZBqM6kpiSpEdb%Ea
h1LMHP R%D+EC*NJch#bH\hJ4TBp$Q+lJLLl%C=Fu#TIw#I/iwRCJLnV<<+Q\/qaS+$/aMb#>EItW\6JHlLmZd!
WCeN@A b^hmm!hMt1cZ:eC?GyTXD=mk5k*YamV/*$DpPhjP6T@pXjB*KwDn/@nnyY8?ZbDt+G#bI5\D?9<=kHSi
G9W5$M @kt@1>##6cP=G9qTlyGnd6TIKD+Qh1bYLB>j:*1q^5=uiqND%EWCL5EG=N%@IM@Jynw*XVSPuQKtlAbG
#LKYR& nhc&4YpN5wBBF6iV%e4?w6^\@iq<aGhNyp#<!DD61pV=&KbB?^HqmQA6=ElWGa4PpG4CE&@LnkM1QdKM
RP6HT: ?&M:M=@hM<hun<D%WThcQ6A$iqy+FtPySlbKMT+B!QpldN*tMJ!\@+j6@%RTmDW1y:qX/#&X<iS&5AIP
?V6AH* wF=alKe>jkjDBIa#VbiM%SFA1jDlAp\daiQWE=ZabVVluj@Dah>RK>l:bDlmLj/tZPTDtI$B?TFGIS:h
!FGtFG 6VA+/!=Vb+KBF+lW\wP*FkA:4^hV%R&piyD:81b?C6D?6>Jk<ZKVB#5VX^I\\&?dVqtTiSln5@S+4BJ*
GPiiPE eXw@LEIuA6LnGN/:jX*66=cTdN<%iIn%IqKFD<1<%bp<kYHCndh4e5XX/kcjM<5ld+ulGeQ!K/Ph$&Y+
>@RN&^ J\PLB\y+byMP<:iMG6Ll/e//94L#6=^a8M&lHP@!>NtpyW48+>J=wkupH5CNWuu99VS=$T@d9C=>\D^1
Fq&+cI 5YA6pa@4*\IQ$hc@A4+Z<bLJ1jX4Q+Z<iatNdeXYeiZiS<<VeFYZhj5S9cqph5<+b1c4=mB=<ldKBP@u
u<iXnP i:Vpm&Kddn6^VujylJkjZ@!NBWIEAAEBj6h?>\CIWtKTa9?NN\HCAGkICEkIeGlITEkacGkaiE^EiDk+
>T!yNp iD\$hCSMEkI!WtICamJ!G9a@=FR5XEVEDIKMLJ#ejH^<bQRmp5I<E8!<jN^A$DA\<HD\8ImI8N!W^JVe
QQplX@ 9*$AJElALMADBIkaAI\EBIIE>D5EIAADAkIGARWDl+CEkwbySkRAA+GAAIPCkIGBk9wCRJHApIpaBeFS
MDWj1T FA$lmB%StRIV<mFJlP4:$bVt:$mbnb!CwKDSMVC^5MuIKTmy1Fqa&hk=PLtESWVF^CWpybSXXNZWNVT%
b@I4jp nE%M#e\6LK&eZX#h*D$<9aJDR5QCI!KnEyPTW%LV@1XuFBRYFbiWqyXZNDR&Ndi$64X*DA\PDa?Mnw%Q
Td4&m/ LC\8Lc?541%9:B<eHl&juJ/hZ>\@QD+>9:!?9Z<AAWCRkEFBRWAlkIDhpWDBmBnBpRWXIR\hWambAmFS
CY^=Q* lSL!/@8lTJmX:6CMuPcl$Wqb>5u8k#aA5CD@^R:kB/^5BkhLT&>tAE+/=B!?GRXu6bVFPIwa&ZK%8BiP
T*#BX^ \MaJnSy4tn5qwFTN4um=XCaea\?nhXyaKF?4BA@A*QypjK$$u9M$\QZ+WuJdI$5dEt1#w1m48EJRauHk
d6h85M #1#tiKCZJZtnN/\hQRw#&HGXFlGXjkFekm8y@+APM!mHWaEIiJTm=/MkiC$R&$+T6w%mmy^DFSM6>:^Z
1PNlGR <B6>5\cKR9Ae6%beKeb^$mA=P%H@QHQiaqapJ4kBN&wHiih/8R:%TJ#iEm!W5$!hHp<:/I=9b<jP#cQD
AcFMV* =56y?Kp!nWFP<QuGCN1ZVn85AS/%ZnbkDp<I5YZl1YYKeaj@Zh6Yu&64!SXTyB@JijC:JGt<9mSyVCe5
tIH*:G dtSdP#XTn5KZbCRFh$CA@ZHNV5#Xay+&6%\hMIY<jkRc5baAmq:Nl!19LI^ThHR#nI/Pkl4Xw9K/X=M\
GN4hl/ #/E5jCwIlB$>q?9Q<%J8K!H8*l1AeW?cW!h@iE>5SEupbK$@\PtqW$Q$uZb&HJM\94CiHbLPWL6!X>Cy
5cES89 ?J=\dp>Wp4#X\9d6AGCFTXch+ymS:DSh!/GcHBVtuX@T!Zwe1jRykPt%6t&JQ%RXJWB?D4KMN#Pc+?<^
:<tL%? nSdV#XRYNdQYZ9<5R?&b\K/TF%jdP+l^Fth1htXHY9=DEPXA\:X@Cie#P:H^KeL@iZL16HL81E>Ta>&n
P?9liA qW<uPNdY5u%pnnCbpbhbbdS%RIq=I*tV%jt4CMNpw%QHC#ky!C1Gi5iiae#mtitJXpb1LYlBIGEqbL*E
iL#a*= %#CK$9qRFAmLEuPNkYpBkJDPMZGW5WKB1mG*/@d>peJycE86GeWy%&QhZp4$!8FLEbB5M51qVTj>k\a$
ddWL?e lub!&:/^*WLk?Mk$^4%p!&&MW\hlBaL4YwL=+C^H:t#9\p6lPJHIn:*e*8n=hHacne=:Ta<JG>QZl!j4
KDLPE! <1GwdH@EL4#IenS6IVnNM1N6CRG1hl9?%Jwn%yakIa1yE%6TdeXAXlW%A4qGMKW/#c$wym11$LPMuDLj
&4u&I1 #MMXZdMiY4tY/S*Y6%<BS<*$G9qwDN=Bb!MEj5/a&KYG@m>EF%^Q+Qty&Bha+dYJ&%4JJ*S:#cn+pEeF
@=?%an @WaLcbT+=NTmXw14eCa%&5%bqGJjXJQE*YAJw/FC1<$AZlCA:Zi#DHaqh4BXS5B\L8X?:IbKN%Zn/M+R
V9Rapa RkHS4i\%%^N=tFWXEFW\8NM%:Fj1e#$Z4h4J\EpK<q!^ByKp9D:GM%BT>5?TiKtWqQliLp1#$Ceub?p$
jRtnBk NB&t$CAnWLn<??L&qZTBjiXpRFiL^Yc^u1<N>KC\RYN/aSLTEI6*lFql5&NGnWKkQndQyV4BmuS6Qmdj
HaC?8! A\%&W*e>/cAE@GRdRlFj@5A!R:j#P%E:hw6\64#5Gam?8LJl1HlkH\N@iZ:#jBI6&t%KeKM@e&6q/d\h
iP>k49 N+Yc5tZ<G9Zh<$yi1+p1D^RAH>#<=%D*Zp&NR:5VFb5T#:QkZ\SnFLnn6e\5T@5weXp\lebmhMA$=6kw
nZei@I />REGyT1u1>%>?ekSILG/\=B&QHp\I?&q%8NXBQ>LWwFYqNV4EI=!^B6R^BHNZe&6aj?yBk!\+X/5Ryd
MAG\/# a8GBCPHuK4i5uWZ#&pJL5pTdHb#WQJCmXl=nLQYY=\kCeh/=pMA+DpIciae$b6ipt=5TPHQWYAmSHcyb
9!WS1y B\$8m:i<+#V$eM8%mZI5bB=tLK6?*1YTK%yS@LA6wiYT6M$SPKuQtL\RR4F8?>%G?Vd5GpTi+dAZaybJ
wZtP/D E<@+kPTF\SPlaw+Vnbk8>A&j5p&i9<8nCtup9t<mqhwVCXy=/1B*BqW:j#d1FVHK4Jh?Y8DHAly\mkJT
@KWQL& #EAk#IkDBK5yLd:wcjV!N4M51PhD+P\&iA6^M<DeXmT>!CnYVJbMBSa/#JccM<pp<5q\ycPq=Xp4>Py?
di$JXX DFhNnu^<de?PJj*yHeb&F?1HcCPBBJcn=4+1tEky4@!CG*8<@i=J5HYIy<E@=KuGe5G:5ASNdi4$MKAT
d#&<Q< bA#9$q*&QTHk/Ppp&iIK=aRuKteGwjHPK$unwyYL^i15*lXE5uRT<$Jq=TiFbP65yYGMcaT^p/<=F88E
ePmTaN V$hKw%XVkK/KPDm+ZtD5Xli%6Z%cc/Xi#QYlBnWYVJ1*8@8wAG8PaSS8T@uY/J*=Le4\^PKjP*CHuHHP
86QRY4 eyQb+5#dYljyIi@wT6VFWR!FY=R1dPIj+1kc9^Pj$5^WQDF@:PdT#d>@R!t+%XM4ClP86Vy$9A*Hiiyu
B!LE+n 4MY8ItK46mLbDaCGhhRWH$+Vl5&$^$aEb<B$IZEe>Rw#kwWG8pT@Gkdh<\?!n&weQKdX&=1$^>^4paGY
SFk+bZ XK&q#?qK$F6>akNnbK?a*q8l%//<qHndVQ9%F/4c%%BdKiWXqWDHbmFYWpaMM<Y&*BIlictR$djDBh?m
Hj+LjK Nn\khwa=DhY^l5qVD&YV4@NIIAAIlqEh9bTwueDSRFJk\FkPtjpWiNT=\mni&HMJ#qn+BiZEhu?@F+YA
Fan=yK Zt!:^+*:>lSX4*Hj\@lCJXEXqkhPRZGm%a+dWqyFd\M%pGIYKn+ThHH>HiCd1/KN6GIe?uK%ipGM:/8i
%uiDt@ >wCyy&R<u1eq<*$SW6?9h@KZdFI9CLkaH&MF$YlqEECX5GTd%n:H9pZJA=HP$@leM\iJ*yPN<b?>XuRK
!?h%ap WHcnSqW@/i9Gi6%E6/P/4W/9>5Nj*/dFE<!1STaWn1qXPSW5TImL8eEmEpZVa4<9lLmncwp>#b*84C!K
\/H5L= h6ybNm=CPGB41IH\<bIcHhWk\BQTTLEqa+iBIFI+p*<B/PC<b=ZPBSH4*b\FVYyG=4@4Kdyjj>$H&@DB
9tBT@5 nwEcAZt6tAJQdH?>$j4?Mw#jB%/\GTubK\B!:ZPPPSpt<ltwPStXuwyETZ=lh9w^dRC=wlGS%\@uMn$e
-A:eDA 00095bd665d001202b4 Page 315 of binaries2.zip
*<I!^I *i*&l#Em5HI*&tGAZCpS$&Pkm$ZL#N4VyFWd@uVwmIC\JtJlC!hLb^hLW$I^G%h4W#6CHtQ\aTAJ1Qyb
PC5Lb5 /FKMu*ZLDc8wwW#Y:mlADquq><5Tl4uE$6F9=LtbcRVK1BIXZ\+kl>HmL?KTucyc#jL<Z^VQwG<D4w+&
!n+l>C RN=?ZE/c9I&XEIjZFKeDJXXIIKXWH&5!Finm:5hk*>H6jmn?EZ%y=GWje*Zd8FI/tF4i\H5tyZ4jDYBC
hT:iPc 9P5$LS/^yuL/R54TVVZyQ8@/\Et4taA=a4yN=Bkiu^jnR*N5D?PmVTuEV#p*jj?u$CE%V=NZbjc61FYW
y#4^Dc >eYt/?/Ydp&DwCn1c8%u^wdYPakEm4ASKEF/jTN:9<lqB\9t4?$X4aZH&D<*eYSCK5mqLXXK<PARCeJW
NXV4y= &qqt5@#VnqH95e1kLW?*N9lkXX@T$lw+YT4RXRmJL#h*lG*8M+thH9bD5:5Qcdb*$b^GQhA9164=i?GZ
9Ay8et j9:mcm:PZZ+a1=<JDCyRLl+W$MH$#@Mu!1k5=*=^6Rn>H?ZkeA4iBdn$V#BGWnTNIRk1mZnyJ!#EBLAL
=IaTPN llHCe!?>$P<$t<4%JC6KbaTYY&M5>C5$Ayayw\aGdDkTAlPV6S:Eiq<A*1eVt5ZdY89Q=<Ti/W*N+#tu
DS!eH9 dEwaX\a>tdJ#5P$um54M?F8*#6T^\y\D+jQ=WdDajm!YHLQ4QK*9JdLptXBC8tMPa9V:PIRdCtmMBePh
/AiG8Q 98hB/>dlmK/bZ=!u#ykw?E1/Q^jHtMwTWdTueI\y^R<w$>ZyAwFaMu/4YGDjQniIje+IkuScPZ1J%#bh
^aada@ =Y/5XS:tcaFh8:LlFQXt+1KjRY@5<QW&RL/Hcta>+1@\$5b#JReqpQ%W!51NDF1#@K/jN*Rw@pGNDRut
pTAcSw kB<kC<ECX8P\Sj+ViD*ju89Z5pF4%6IIpLeI^hTT=lFEyp*nVXDdaT:+yu86pM>/>CYTVuuANhCXLl\j
Z:uLnL 8Dea4N6NujWJEQ>H>5y$BRj@yPD8$eEuAdi&JAFNT*J$LtGLIL8\yjLHaJSw=N\Gp#Ly=1BiCG/Em4Vi
C8b8&I 4SpEA8Ta5jjh+&QY5#\$9b/e8Iq8&Mw\pQ!<\6y^Q#6M1*iadmXb%Dp19XNhPnqbaC:D@Qn4bZtTth6%
\S+9H4 $heWM^!#&KwR9nW6y&MABiTH>\@MJ\TP@4YqmbEtZ&9e4RjiF!\d8:<R%l%Dc5jC%$C/knq6d$bK!MIk
V*wd^Q @bJwu<:?5>Hy9@Fq6+K<8K*&X<!bmAD5I!AyQ&bi%GtGan/S#1#<@Q=H^El5uKJkJyFbAP4!tkmT^%:4
/Kp$N6 i$Q$u*=T*Lyw$NTLGCPmcdD$b$ku>4/aWktRZ*EH#^1&+SMcP6=C!Xw<&eI!WXWK%Hq9SyTSF>?@#8XV
kWtVRX ?J1!?ptJ*@N=$9CFEitD&Qh&6jn1tEASHI5&>u#uL\l=^pc<&AbeG$ybAAK%Le88b&D6P+iw?e?LI@Q1
a+H6^X ==9jcD&DnuyVKNPDlQhq?mZe:X>ce*t1E\:LAZ8Ha6h>wn!lKZ$+:QkZK<1CAGmy1I5LHB1*6ncHlFwq
5AW5#/ /?utZ$BEI$/:$YKQ^p5!4Dm@wtRuB8dYVW&ZhJHt%uiP>SA<%&F<4:J1$Z%PSE^wP=NZml:EkjZR^9h&
tG%Eml k#:uM/@qwW>qM8Eup4STNe4c:1kZm*%VX@m&tKmF6pieXEiISFyC>C<Am8hHhV>l+y:>FtHQ/p64TNEy
IyqPme <tuWmlW9d>aq/kD4<Xm1N8+tc!uqEH&Hym*MNJE:Em*\A8G^X948N4Lc6R&NQdSh<bHw$L$6u?>wAu$b
8*nSyL J%qSXQGjwmk1kGlQAaLpu9yC\wj?Z5#B^ED:i$:<tdlLT##l@X19@KBdcZjI@h+TEWIq<N>Y?!FN\pQe
>qj\Y> EQVS<#dZBkM!bImlPGdXX5yMmyReP!iDlFYKcaJEQ<6L\Ep<CSFRL+m/m?qEj:Hbjq6JiN?q&tE#W@TD
?yn*y< bJthLV=6I1N$P8w?ca$RGiF46T/#e5cP1ee^=aRVJC<NKpyGKlaYy8&qdAH^%c#h*Y&M#VPw6QY=&5+q
bLPR$J TBwH\69H19J1kn:Z?\LVeiDEA=^Z&1C5t/*aknhYpjpuW:u5KMe+=?qmMTSy$nLiNK1mVEBBFCYk:NRw
Z/=?+6 ul5wEZXQJZqXpNRt9BCaE6TVNVuM89M#\DpNK8E/$V>dyXibk9SSm?*qV&H^e9W5p&@?@R&9XhhW>GDW
<!=AH^ aib4uFt!9T#8=#48$#hX\cR@tEh%aX&8qV+ha?k\9S8@WbScT#+1hPLHBpW4n<q!LYXkFudaHkFb^LXT
1b4:4A $a%KRdIet<hZ8>VuwtK>pl/d8Z&%AJ\:ZS!&F6QDiA<nJmn819Zh\PiXHtH1?ln\CY@:4PNaDbl8PPi=
11YFu< 6l>t#y+%R*ZdNp<$t9</SViIX8MbNBY+A@NKqJtyiY<w!Y/dWd*b9YtZP::i@pydb!$/!Rb1=IPnn56H
=tD$&A %m&u:&p%/ekV:<Pme6k=pB1c6Q1>cG15RCc69EC*>iTVQiw$1D<#QuXabjX$?T/EjWhyN$%aTMd6Z@1d
ci!P>\ bm1VB/F<=\B=t$XdX^T*pF4FVXd+$lLQq4pLRNtuEEHTb^9HNQ?kq:F>nn9EyPwG^+W%F8ZGcd/aK8jC
ce/\4p &Sl>#W%!jDBBnE45^*p88Ctw>$y1wh&M6yun4NTpNJ44^n48We/ViG1@11!$tK&tqV9n9l*JV8qd1E$S
IuEbDk $qT/ew4h<?#cYleHw+R8F?bt6<5KWwXwuaF^5/HT?Jt4+wuXAmi98<TD9$>+nSMNCKl//jcc1FMttY:j
j\wF9D Km>@mQEnqKcEpyiZ&6JFnc/e%Jwq=&jEWVkQ>5dh>Pyce/h&WN/:E#llq1PYkwYd&9$aQcGd#DWV!5Su
/:ZXDw %Gt$9GWbD>cp&JGJYu%b5W85=*\KDce4Z&DDcqY6ANJE?/nM9B/GcjZY&m/E8t%l&VTc%4<#6WZEeTwI
p#5ah@ WmY4lAkKII>yX&#?eD%Y&5u^Cu#CiayHh8KpKQ4@F\D@j\CA4qe45e<p^ZwciLnB=yX$&+DjMyFT6y#:
yLjFB: qK1TRcNCEth=a/ddV/QbNMB^ECeuAFYLtPK*m<mBR1n46+!c=!+%Yc%T$naEBeHcS%1^@dAW5$4bB/%^
E%%dtF !=n*1MwJL$J=I$ZPRB:$=LKCSAYWN:kXYp%!#qW^K4bI\Mn4Xc*9=dJ^8dMb@TyTbdqBt:Ba&<S!wPc5
X44=>W ^RlH?d9$NWLc@ntIbY1?LkPMh^YWt!6EPtj!&CnFSZRD&MlJIPP%E9:\kmqqSZSatBI+J\cNpR6bGVb:
K<DJy1 ^aZBuatCJTS8QB^#ZFmX=:%4l?T#Ft4yQF89Y41%qaPG*H>+X/L:D%4Bl6nJdtSGAA45w^5t*%QQ^hST
DH$!>t cnHwR!!J9PBmmwt6yM?6FhFn#n*K^5XnlAeDNW>T$>bG+AI4Pt<WKuCuJya6hF\Pc=4M:PbGb1NnHCyP
Ym%i#5 $X#L**qZY$DnNhQ4X#9kdd/X\N\5=qb64hc8KdIqJI&NY8E8DC/DJWEGwbHm8WCw+DKPRiMXqS!tJ\$4
5m8Pak NnQII4yaIwDFHP9q:tZDB?nD@GqJe8=6Vq:S8^t^Swl!ZFP8JwkuM!@nX/Va8$LFCtBkpuht1l5+T?><
Fnj4D4 8RAPiqS#L1de5p6EJyh$$h!1kpw@T8plq@jhc=8MKLwMB\K&LYZeT^1J1?yXPVT5deJDGwuX=jQeMeaP
E!N\T1 BVIb61+HW<Xi6%?ZGP6e:b$^Yq#!eLtVd:%$XwAqmE&nNd8p@D>=mbbJBkuIFY4*\6NcAlS^ZwTd5iJE
<Lt##Q =XC1TjMkIw1^e&F^HIS6w1ibl#SY=AJTl*FmcF%S$d=D^Y^L+dd!Tic=?i!c*pKA>/$WSNtw%?$<cn4Z
MWcIGJ RcVyX9hRlunB#:X#it&VT5N#eX*Fw<h4cDd&FWqaVqe4c4wNw8t!Pq6GTFQJFeQcw>^bqX!GS!PP%hQ4
:td=w: jmlI+Yk#%+4q:c:F8::e1J9tW%M$&nTm$ycnFl8N&GJ\K5FY\F/WNi+/twH9R*NbYdP#tnFdp\AH%1:F
+9u@1^ P5TBRii>adZbLeet4F5#P?+uJ@RXMw/Cy!8#yLJ>#/lI*KAMt5C\aKM%6ciYpp*i>ep6#$I:F!&9:66e
mhJINw pmW+WN>&818FTc!Jhjt^WFnyq55nZlGbG/tyJYMleDym9Wm:^QFqG$nlyydhhVcKRDGcK^9EW1&&8HLa
ADEnue =w4F1\>GhW4NNbq5hSZLZin#*M:Pti6iu#cQHBdFWHAFWNP$%Hb5khc$X$b9qb==Fy>=c5PDm6?KhE6h
1#VlI\ 5l\eX$i5cjFDCY&nkX=y1%:P>$di*!TVnm4X&R:I#>hmi+%FW6%MnPeBX=!c/:\%+abVHFelb4n9npSk
t?W+Z+ >RQ/t1tp/XJC/niH8u?<\=<5iu%4$4RhLn$!#BaAP*Wt8lSWFhtDjM:I<+<a/VyPqZ!^SRFAX=KE+*X^
cjPwRG 4\q=C1bIHyZ1jmT*@6Gb\aSIyaucS$4ny6GT*LFWbT*AGe%qKqLhHR1$NE$e<q96PD?qcXuA#8FA1@d/
R5Tke& FLP?FX<h//c\<K6EwJhImiydp%t1E=Q*nZ/^CK>*ey/jw$p$aQta@\CA%$Pu/JKkG^%dH+XwYPnYEKkT
=aQL%@ #NK*8iQ!4Zm5daL?=hqH?\&K8iHyY&JlnK!i=T6b6$Mpw=Z9VR?!M5^:X1C$nS%pKltZQ#aGc^jE5k6a
#aHZ@4 FpnH?6PAB/$8XSXwm>w=P<nm6V$Ec:4J&hM<tm8+<QcZ=WauqZDN#ST5S#G%N<<SH4YjbR9DI^I\K5Z8
lHi\<F w\YWi/W:S:%k*QnK^lanhYVpnTMG?lH+6%JLc*K5iY+Fe4BycYwF#M8b=PR9eXjq%C*<R*=8JW^d&j#H
+b#bJT Q<S:C6uR>MN=Md?/ZEa=WN*@AQ4X%$E8ZtbnZVW8W6iG>C<mQ:XewFJ=SB^m6&TJ&deVqB$ZHT5:WjE6
4@kMLu yy@!L<:nnFe%i?I:/?elG&^=+A+1:Tp:tZ8^Xm=1c6E^#hS4u4$J@T5qSHLJ=eEdVPP4Nu4TY>leZd6J
?=5iMX K&%S%a>BWq:h&?u^@b4W:VnMpl/m64Gh!=CawFJh%Jn?<*SXQ6/$HWDKN$aIZ5V*4u:KTZYJ?Mm%nPAD
kdmAQ8 @EjW%ju8w\jLm?dd%ctpT&ceX?+dq18\c1/NpN#ZPIeh?TM%M5^CnB=y6Ath:a+BID@#1^LdR#ACTNY\
cDb!Dl enI/G8M5J*XR+J>1/m$9>!w59W<b4t1W:cw*lP?nL+WKMAaFFLSYBwi4y1Rcnml\Zw*t1di>@JmH6iLX
Jtw\pi e+k&Ej%dlGi@mQaTAD#PHMLkltKdk>TT8*l=FImVR!n%WkCk$nZTeRcu4Bh1Lw%8+*P:M<wSlG5AwM/%
Wa@idN 5upiWcpHE#1G=5WXj4STkY8cHXBlhY\kRm+kTt>wduN9eGKZe\CjjHdJ&weQjT#!m4DVy?Kc8IQcElkA
8u#INI wKuR=aMa!QKFYpulTln:peR^MuF!ASWDBVA#1DSmDbC\mC!Z*YeBAYy>B@+6X*l=N<1lPVP%%iZiCGew
?Nu>d: DJt>Vc&QEYHdB+99i?BS1iE4<n9w4AenZJw=p1<\N=:k%Dc4/i#y@jD?EupAtRuM4uWZ6*jM/ip*4@@^
<j$tG4 %WwbL=?HA8FdeQC\V!Z:JpV?VmV>YRd+XN4uC%u9lu+M?e\mQK<>Kh/5XY!DGB+bbt&lut88L&c=nC9D
%*Y+#N B/QBauCJwBj=6q/4#?QlwRXnNw??&=?:wKS4^>tHZtcjeyVJ%qbmc%5/n<dJSN4Jy++h!4DTE%@h>mda
PyabF6 A+MG4KRWmE@>Dhw$%E>SECiwy#=hXMVy5u8C+BDMNCB%yW#&Ceuab<@+@qVc!^@uT6SX5$DX\ymdhGmt
qdKBeF qwH944D:#/C:*R^*%$jmDINVclmaAKCJ\#Sd=&c#^*<\m%WQhyYtqF5Ge1E%=j$dinMAJ&H/=u^KFA<y
-AQl64 000dc012bcb001202b4 Page 316 of binaries2.zip
%:K6L5 @JeVEZ*8@T\?&c\GkkkE%C8/<?mbn%Ka+%:<M/@aphQ@#nZNTc#$+$mcVRtmy*NP^i+Btau%X=:+A/@:
6wL%Bt YXSMHeB54CLV*uVqtl6h/uq^@ehZy=BaT*lK:A4be*\A+yc#NWk>:G6Pt>>pJ?&W&JKnIF%KBY*dJ%Xp
<4HJPi $mQHAGSQG:h1Zi:1XGqJchNb14KZV\m*9$Z!:X=jdnXE*R!C<umqhl%qJ>>^e1J!G8kMjS48:hPnMa?P
p:Nd>& SV:6iJ+#^I@9A!w/RSZYV<=4X%/Ti<&+F:Q&<dX8EN5c5uAjl\GC>Aap$I5XZkldc/8&?4jZLX4P+HE<
W>Pm9J K4+YERKCDACiPZ:Mw@YSG#\X@1YlNeqImX1Ht6EAu$*+66=\8\hm5nViFkT!Aj\htH?<kmnB#!eD1<Qt
wMy?Kt *dN@d&+h:lyPtVW8!W*uaZVklq%L:D4&L$%w?Xbad=FnkYeND=dASS*PnM6X4GN>DAkGV4d+jVKNFJtX
Iu5?$8 y*EwyjwIDwQC4ipD/LS9PRV8yj<XGh\eej4kFV+mPXnnW=wHWpiL=ZdFdmDJCZQ*JI5k=Y?Y#/=Rek:a
q%!uKi 5WWA?Q<DWNk/+#LQ^bY:>TA&taYHA@+?q<<Q4:k6$wSbLi?GGec1b#qSbYMI>496E=wJ^*E+mmhQVS:d
@6$Bau DbTHFYV\6iqlX9j^A*#p\9@j&XcRCk8lam%wYRjandJqp:uA?lIYp>/LI5u/I#>TeT5H^l^tm5DN9Cya
j6B&w& eRmPAEY65w!BIq\NSTu%l@+*ia@+:4tF?TGW%lW:FARA8\!4kL8TTLkl&jTa564\T%pYl?#hW%y8Tk%m
L$qaJY =eedm:ED8!6WY^Ych<+<*N5MH6VhDyDwq6VVey19*!lken#ISqd#XLQeAIa5VjR:NWe4:\STlct$$*uR
qPXjuV =DBR8Q?l^%Y<:htIYqdca>=4TPtRjL6<!4FWyPIm$w9#e8bVAGSLW>*1yc>91bHW@nYuB1S\Pem8cnF6
6Jc*@@ hDhb#:G@==8j=Gk*E%w&&XYR?@T8B^VPlM:TG>L>Q=%cYXt4n4dXqB=c4q^+556NkEq!=JQ*WVp6YjI:
$^q/Yu &Sh$hQ8jGeXtZumdVhPhp8:6Ebi1>V>K</%:^yic8=T*L&68PN16!*8c=^=th!#5Ya>T^!c/Iah9+ta!
/Y+k6k 14wiuT@E*VItIlk8JSunnFS4<VhNpjEq4QG94\c<!!i6ITc&?4\M@c!QW@<AlMNC8!ALwwY@9wSW:Sye
j$Q$@9 SmYB$qnQSqPSZp8VX8\%T>$&RQcZD^?1k@Kj1Kl+c*\5yX8=/DNd5P%W*nIQRW@SjE5G5kY$/mG:^\Q+
8BVZVK Z?u9:Xb8aT4Xlb^htdZVX$bEm?WT\H!u1QTw*>c8!kXSp^Gej\H>K$VIIZQ6STTEWXbJCpWV@NcV:Y@8
pJDKZd N\c6S/^hY!?Vh^mTQ$ebFblRu9#/+y+quYM1#B%>GFN^8JP^c9:&^T&<?&hppJ\In!Q#4uLm+q8bDJI^
%V%Y9B J:i%V#pP\GQ!1I^1RAy/j4Y5IKJEyZIeuGBV$mb#$1:bcib*G+aZPMt8u$d\?lVjMkIB!8i>Y=YCEHJ&
y8LcnZ Pe66Itp6*tKHcw+#*wjT*R^1W?b?V:C9SG$5TR^&/wAM=dmyZ<NyIRea?WuI>c!=&hVwI<1i&d#&SXQB
J?TL%V ^TQc!S!?Y!pMP%iu\iEaqqiSw^>+a+/+w%Q\4HJhRTwB8iVJ+:h/4uM@aHtWEWwtBnJX%PRil#ZYY8yV
IuI6Ca *X8QQ!JkPj<Ac>/%NV<NLdZQtRSjI*IQyZNyDeYi4\I+Q#PFCp>mcmcW$LqqB?Shqtj*11<4H4ZeZZle
F6a%9\ :enHV$4D8>CiLQFe<bw6^b#VT5y^un6SX?jVmMkmm6XJGhtb8ieWnuEdH&wjmSl/E$uWEiw4SEFI48FT
*MXueT ^Y^qnHSXB=NRppQn$1XZa1XZm6TDd$9!bLlYWDal=!P6h%cdb+FhE+A+4#1^e^!^1iBuuFiqcR!#&!qR
e=RG*5 R8QT5=1=%WHa8Y5QQNc5N5R8eb14GAGGBYlHI1y!clI&qId=CnJ:%DIm+^nPPqVd<6^VYW>cwSS8w%iQ
=u=m96 BZNeX+y6FF9=/wBJFlkjyZh#Sqw#n6ZMc@B@w#:8lByhSQYLPn$&h:4T:cTRAF+qQQ$1P>5DIy+H=XX$
q5mP<K TRuTdX5q9*RH=X4^54DBDX\6Ew+9WNPhCV6w44d9V$uRpA$W?bwLHnE9M4ph&NN^VWpDuH4Wk46Pe!y*
RC=<mL Atdk>iqVRbpKnGK>C$V\XaVcdDJh\LNJenhp>Suym54ZjBDcLG>*c!6Ndn14jin?6cKSW1Lm4qQ\%y\%
1AJDFS DWFTXmI$=dHW%/ZCmR^lI%C1w+A4#9\nIB1Kwy!TPc>HmWPtKtY=6T?EwZ81Qc55h9A$$4?k+FXwZ<SV
&AAVF$ E!\RbLH?NkAK*Q5pXpuu5Mu4t1WQmTPid:QcI^epn:9GS:$$Ki8yD>8<WY4AQy>8+:qY#Y^bZh+K^?kF
&Ga@%t e6d?JNS94<^jb9LRQ6\^=Q9^ZaY/lADK&V*^SecnbZI4mhaA&Vnm8C%wc%4e$pX6mG*H<S+FhL+tqaZE
i++&9T ZpplGPGFe%4X@1FlmK#XJwtZQtnI=>MWkp6NTZ\l1F#y>yJaZpt:!6ZbRZcTkFZ4!9<A6ci#8DFeRBqQ
hM^Jju #eeMM?>d6n4pLwG6:lm\/^6\\4p1SjM&KLX4Hw5X^nG+u<1K=K$<X&9*bbDphek<WXubn$QL+ZS=B6aH
<MmAeV t4kFbF9^PtPPc%<n%Fh<qa=p:uyuk/:T?$!$*6k&wbYH$/jyY:1?uijdKyGSebDA>MX=9+T%8HVL$\ZV
5GVqAq :aJ@+?!6:?%inY:V*N51yh6=c9pK\!CQa$La/8dtTQNhB6X5jFW659AnJAH6Zi&<u#Ah/\d1^ll%/cdb
lXE^l% mXZ/?%c>1&Y!KGPt4K^6wkt+edlnwceIIIWKCJRy:dcn6&?Wi6Y%6uqZhumtl&ZWwJa&wt*4G1u%A1c+
cJaay= HqhV^TZDCJ5A<%W9DLNPI>&AwHH4TKTKty\m/6uC6q^!K#Bcm<5^JGe>tZ$I4wE5EplddI8>Su4XTK!M
Tt!?VW N?=ZAYTQLkhM>nTKhnk6Z5!>*p^lnnB1qj/NGpT!&dPHH*qJ/X$9mSVBh1!IGJ+^uFa<<5ykj>^n=V@F
h%jRu4 T=hduHWjLJwy/hQMITdp5*PA*ZIwytn8:YJ@hqnSXyGEu1e%A8/bF#%QY6Z:J@$%Q=XtY*@H#H>SY$#A
MGTqjK WV*KkXJINu@LRu<K/DR@Gi1cWpNu=mT&\dH#4qpH5c=?b>#W#PKqGmdY^/Qj#tVW%tb5mbA\NZ4SnkAe
N::SDW t8bn8t8NN5ykeqM1c*>MtDAW#iL5#w:bmE#nyYyd*BMVD$FbEGDHnQdNY4b#5eb\hyywdh!8#F=!?Cej
1:RQhG hyZ6=:kneK4!T#kKdiMMF?>u1jyXm*%G!KEZc*RPBpD%@ClDjN8muiRZJbw+!!dS\%aqnNjRcm/M:TuG
amGekZ Vp=4e94:TtLLb&q#K+=BepKj4p%#>qLLc/nP^C15uJZ595KGC99awiML*:Qj\HcGJVPDZQ61:PCDG9Kp
1k>mpB jyX*^nhyhc%mM=YNAPK\ccYl^XHiVLXnh@awQKGHGe=Iw16SXYM:tXAeZEhcV!b4LmPdlQ4YnnJ\Aei8
KSl#uF Kti=yDaciVVw%D!lD%J:WAe$+Fw*E!L8IGCQWX4Sy1Y4M1%S^$S$8mSPdNwHBADbWphS:X5&&/$pG+jK
iA\@J= c!6F%X>T8IqMZq^^\mNBu4n1c/5Yapm^nQFbV5yP^%W8b\Vi=b6LuKnHNcF9eKG:jnZPMp>p&X!X#$>K
9FC8Mw uZWR\A#6d*1VY=$IC1^I^!ceXH*qSYNb661Me9:6mFd6X^T:eSpMjctJTKF$5t<uChie%pcnG1IbARVm
6N%6bK 6?iE=#Jnu6t8i%wJdR8:NkaJ/$tcPX$ihZq!bL?bmih=wTRG1e4d=Zj?<^NC8X1#lcNAemm1L*BEjB=w
NT=%+E ywltjEePDX9#mQ+9%1yCGLncMt6GKQQ*\yQynm1=ZJ/B#KK%JdRFw&hn:CyRNywnW1eEa>BV&Z9ZbCQL
Jd^inu G^\#q#T8ZhI8X54>JGJESPG>9i9VdI4JG4K\aMMknwc<yn+=4w6C<RT/YBDKDJcp>B%n>^@lYFclj*wu
dtLAGW Zl5Tw?=Qa:1Y*D1i>bX%y#HP$e?%dh6QDh&/V\TLLG+!GW$TJ%!Q^4nQRPSqTcB6^DKS$I1YQZ4t*WDA
8A#G/X Q$PK/I^^NqZXVYN4Xyc&$baS48I+FWtT$?lpZ*m!+TNtSATD/=4q>S%m:%VmX!EQ<K>/&+6NF%a*P>ip
St@6L/ D!=>CPl4taa%bT4HDa+4wy\WpeXcyKL6ekMTdCXJNRIA+jeedSpXjTILJ6e@KiQ^1F:bXLCMbJ:GyhKT
@cKwbR BXw5w5N*$FFV6EXGDGS?NFSi^h4p$N85R\F^X!P*mqGA^X^WKTb/ty68<k4<4D9ZjGKY^=<yN:nYmpnd
$=bTEt DDeP#Cu<pXIJZRatVI@9CtwM?lHc4M&*%Guk%bmQHw+FQnQ<I/ttJt4yP5Zin#::b5^MjumQS9<A/>hV
pq5PP* N+6iDa>%yW<MV>H#pm8GMknIP%8D\S#Yq1Zmm<%T%mk8W?TEeaVBQ%4GhGMue*y+myCNph=GW8IWu6*D
lwnmpw S!DK6/%n/yc!Tbb&#&A19+C%8#c=@51@qcJJV?+jQAd?/j4ZwncXaY&dlw#IakY!=!Bn&4nqVebYQVnZ
4#LSF= nKN#kNY69:E<LT?a8Lt?AmSi+V1c+1i$W\1\?X\MHHR%8iINdu%*W&uqG&NCXmRhl@nYSeTj86kQ%48l
Kj+m^b Dqna<tyXe=<^RKnP\DhV+\Ih^bV!PD/XLBFn=nVyH:a/W:C=8lXbBLukGmy+$K@Mm=W>X>QySW<1i+%J
&tQ=l/ 4bt6DE*1\l!CA=&&I!+Au&8Y4S?u/Pll>%JE1%W*?>qIiB&cAJ>qheVbDwyQ5cHl6wFc\P$TiSIScC9R
qI=!Y/ AKCX&V9Gq8ucZP#kplQlMe!h/Li=ZACk#F?h?TFIkXk\^?W1@+!AT5KW^dRdTtXtbmBIaZJ!bY^5ID^1
p6KFVD u$T?CYIAuSA*hnP<^<nD+NQk9/>>Ia!l4lmwAKDItp1ID5CMeX+#dEGhjm8@CD<5:J>FEHeIp<^ItHnh
HLpB*6 ARE4IAQ@ZyKRp#kH\HbGRC!yqQG6><\jE%Rp4Z/muDlhyPBLX5JGWhEKMV@I!w:u&w#@Y+bYE66u45El
j9N9*+ l:Pc*GyZuGLN4SV6#cjMWY>T$LZ^:HHL<%!JkEB8MQ%Z&kB5<cEWj%mSEET5h5@#XdnI+N9L!4?SK!1j
=CERZB 4aD>qD+eD#>uqaemSHPjX/A*u\CknB%?!m\KjdjL49%bZtA%6a%/=MS=<%YuwBu+1^lKMdhVPw:>Kedj
ZiC1\b \IltZhVn^CJD6VaSAktVAJwDKwMnmeqdaQPiLM\wp4FiR\I%<\CjZZJtmwaDtwRhBYpPXeh/wm/?NijB
Y9KiBJ J9Gecqn>@BECXHRAwICNdJ>!</l&8W&K4t\SS%c$D4iQAJ>n@*H9pjKTdSG>ZQP^IWH6uBhh:d8#lc%d
4R6JIj FJaeJ:b1ERKNAXdTnqa?qBLbmqtdPb!cIMCXGSEAwQpduPS6S?WX%/R?8BGB*<INyNQJ#ciKPNL#%kXd
p>Ptyj JFHbNKKMe/nFACwQAKDqQWTtC#F*uuWC>@I$F+&Bc/qcRB>!cZb8bZTGBKIB$yFMA1n=Kb:lhnT>KNC/
@*&1AR <a*t5C5AwMiqZwK@WLkR8WBN6a@LTeHEk!:5hGlqcLFa?ACiK6AueRqGhRnVMt+^F%i#/JRZ^&kAwIkB
i%Ph\m h&1M8hPJ?:Pe6y4i56/:9eQ=I&^yeZXybG%qhGF5\^F%AJ\KtCaGE%:PQ?imkG$R**/9pM?ku1EmdnRt
*A#ZBu /A#h#jtI+VCMFu1F/CS$*5wZ?H?YualpGL:Nu$1tG9hZmKZV+:#RDtKa5lYik%pcp>&&&X6$NZMSM+j<
-AJ4Be 0009b856c50001202b4 Page 317 of binaries2.zip
Wwk9SV \ZiSi/I>C:S9$*t/4JSTRm?wuX:A^Q%%b<ARRq#?<:nuLQi!?%9hcR?/\:#6=\t9TbZE#/atGTST+ubH
X/q&5l 41h=yI%*Nj>IuG!BQ5^CmHMDA<IMP/=H\F\FHYhqt6^cI$mqTMau/hhR8$W:wib=@cEKblI^!/dYnE$?
PeCNYZ YqNP<C1H@wP:qB>DAyMd!djZ/H*c$WKwjBM\MJ:hTkXRu#!ZFEpbD?&%L:iu&ip?\CQnSLkWW&%V4<?=
%m#Q<> Y8G!/BJpby5^XEaKV$pap\eh&&4R#RVNy^PVpmXlA6c5AKCBmA6&daP+9e^FQ&Eb>ud?6iK#&RCiL/>W
\F:><8 paRPL+:A*KcE=FQVei9dblw$GHX:&auek*iN!ipReqh+Vd+Ddqe!48yc4/Z>j6jblW<ZF55X^>eencJA
NG?8ab %pBXCP5J^ap+:E4XC%l%Wc>*^QFhNMZL\J4?nj*wBIciuA#kDPk!RbLP8m?8nE=GbBwXRkTmlPdGYe8P
!ldNKl ?uk#<CI4XX?I+LlZL1:EcTb**Bj<PMXJGm6>/nFI1$46=YhkNXca=i&&lF8h$yk#A@>TVIqAhdm@LLCW
P\uu?S hVW9#THVPi%PBHqpJ:/+8qKIk9*AMHm!pDm?hh!dTj=NR14>B8@CJ>Cqd&bX>LHEVnkt<TQ:B6@G<wne
*N49Jy *An19B=G<XDKD\mR>P\WpwCab:?5uX4*nF5cK9aDn*GHViI?9nD@5I<Pke*tuHjek\@nYL$Wt\Q:BN!E
iAylhK II!qMW+9GKI*@YeF!ce#myEZ%QM<G\Y>jtEu:PCcIqiN+^1Ii@H5ty8%yVjTyy/IRy@edwYlb8mPaq\\
+AHE$w 8BTlR@D&Hct#<!qm$GjCISuT:@#!e5*LI=^+qNpLc>kZ#Bq$BJ>w*yC@FM^:Ayjj$ju8IQ\Sy!tXn5<i
X5ckLw ?/X1:lEnS&F5cY^qd&^9euyldt<kQGhK$&KWId:RlBbVdACZV4!pCAam515nV@*KK!<HN1Z6/qCl=i<%
pctLjZ SZd:56CByjj5lEXlQ^lRiRCk4&upW6tYLLlV5YX+FD*SM=pEcL\AwMJP48iPLd9M!1F?NL8hRK/M/R+l
:BJt%d jQwCIjb@l*KnM%QuIPuZ&*HmEJIP+*wJSYR#/$/!%kl/w*4LJ#&X<Q89VCVn*tSX+=SV<V8:kqwTI@l*
yRb&&? 5P=LGL?aV^ny6hBH!EV8HkK!?Mwq+5PtH/?+DG<JF1dY9iBQjT\atB^iX#I1tCbZy@qSqbjTKd9A<$cE
/@\A1S acZQ$QPCMZKpT$*IM#hhCWH#kCn*4R\wS#wQZN1Z<%NCKn8cEKwB%%*>l^Nq=41<dLt:WP4<D+INwiu*
%5Jt*N YMV\E9MlN/\6^A1S&G9:^<1#idX/\A\p?h9bwYNCnZY:SKd+u@/>8?YQGS+!btT==aG*SV5mnip\VJ&F
kJQJ!^ dZV8PLaIlQEJ**I=cXZDEb\uZ^+Au&R9?bhtDhATuL&=!PyLFD<mlQh+AKDGLmT+Nd<:5&4#LX54W=RC
AI8lwP %/>Xbc8p*iyyp?LIiaZZMBFpeYHm&#tMRT&J6p?MdMRZ&BnPESDYQ!NZQ+e?AH!ByDVXTpC+^tIVSk=h
l=ky<M untLbdRM+$:N^<AWahuYhd^ZP+BA6MD/#L<Y<GDYPB@nY1=+\a*ky6wpql#Kq\qmHeL*n@aJ?\$*KHa+
a=kM#t KN!I@5nb$8naF5Z*w=%=/>:SE4iVuNRm^ajh#k%Gq<V:BADY5MLDN68:eIAyWmllh6n*/==w&*cy!V9M
\6ap<4 j!@CLR\LFchQBKaA:^cY5Xppu/mNASmqWJ@t#LIH>#+5BIBB8u+\>e^:GE9>eNk59RBGiY+<?lNd^>!*
^LtWti Qh!Qjc:a$!t/8hqiNQaunw#pNJ8ni=B\lJBZeVMT!h<jl:#CNmj4D61>NSVjtTTWdmnG!G&iYLyDe+=D
1^9>IQ alaI:1VFFqHwP:c<$FhjtiKdQ\ZALN:dVS5qA*F1BRQeYDQJHBwX#LA@NH=5SK5Na/<8Ecu4%DReCeDG
bc=F<V pwdVE*1?W>!%>FI+XVWpn%pWIkTK=pu$Dd@5b#K&hHq/MNh:+aJTtNIVQX+AcMadqW>lBB<lAP$CB\AZ
/Nhea: DIAS6S4:NEH?8mVY#aV>:SiqSqHdw=\pPwHa?1eme1MPAGVS5nk8e6=C8nDh&c=+TPun!jVq#Yc8bnIn
CFlK/@ 9blplk<1Ju5W4E:S!kALtN#dS61VFGK$QM5M^Ta=1VFJ6wC^H6yMXL6Fe>1*nDV6NpcKQN#KP1y$H+$A
*jeAei w68!N#FS8/IjtaD/t8A99HGy*Ln:Mm&!?uWt51VYL?X!$6$#b:HyW<!NFRt#$/i=SImWhMn%Nab<T9BN
d>=65T 68a%Kb?@Gem8JN=eKe@cZ=:by*>yT6GWdd>RPVW8Za$nl9=n$8G@kukM!NqRM+HyXlGDnKuIQI4k>B9&
PjWVQ+ PaGIGD^ZZcDIbdN%J#5e1D:XTh#GhJ^L&KRmyTKRmtbYI5WW@GKKBF@FGKYqytw*FGKhYX+l%mLShNi+
yPlWmt ak!N<5Tj*tyD5e=+\<ST?ehK5bNuH:/RHu/C8LpC^nck/>TcTT:qtppqa:ue=b#TRd=eke5VkiyNb66u
&5+Gq/ jVkw1\%yFZ=eAu%NS=auP<e?&c5VYykaK!@Mi=1=y?pT*&RF&1Q+5W4w%WY*a^*b8te$/N>yGic*=jDS
TpBPWB VuhYhhcSJCyhieWKTG/epM6dywJC!a*h5%*jk?:nc!iLhl!&iV%4#lZIj=8DZR?HLu!44!!=Ajy>cc$b
pwEcEB #Xa<$Yiqa+yCKdA^iIb/+1Rm6D#^lGcKecKA5Y<Wwwwyqlnt9LQG&4j&n4V^^98m6l5Z$#*Nin/^eG%$
9wy?nw i:uW+bItIQweX+:HF=wBJJb*\TjTwp#wwS8:qaK=HeA%8/Xam*kN^PjLJH!DGV>c%dK\kG%9KW5B\TK&
ekMLuC 4T*nhl8RNn8X4GWn%cXLY=#%ywp?yVB\ndV@ABQ%NhqccLHcYm^4?NcFmpWaH!<?y1+@qBiPcne*$m>D
cq>lqj t:1^&1eDI4G84ZcVqek>SZZZI*Kh1<XmZejPCKSd5$ij/#bjb=k/D=Yy6nIXViy\$bDC6#ZdW!RkDkk%
m:IdyV kSL=T9ullY1h$ijWncS/%y5/*Yu\ZC>JEB1!c^@CRd@lG:W5iwPQyt6p%8iP%b6DcKCKKBF!n*wyeW!#
Y9jRV% P<RR?hwF<ue\p%=Qy=B8FnI@mB4%:Xa&t$t:nV:#R5B?XiR&cNHj^1\I!iK#thYH/uY^P5MY>q@bK\X*
4&REHD =J^\Pqb5NwG&##@/yQZyX9<A64VIyawF$@JebS69WhM%lc=/pbY*P8mmlqnDS5KXdZ=9tc5N6Rp5t=ZA
VE:8c\ B\X>K5Vc$Sb?euPcSy1YhRtY*nImVi*c8a8=4:@YNdFWB>P6ch%cTZMcCSw$DEjY5!DZd8?6@M8aqCq!
:?/kuR k&@#>^V=TZK#5b>/!ZFw#kea=#&NelIj9MiDm8@94ELC$mn=ZZt8Kl$&T>9YknBLd5hPqXE^1SdcS/hw
:%l<>5 eIk$K!nHRR1j#1:XVSw=whJ6+b?bIq&E?8K8X$HmTVWttNNFKcKbJdwyeWawKEbh!My:km8F%#TSFe^*
acaJPW MMRAl\4+:C8<^YB+kqcC*8a^F8YhAh*wSYe%ye:eJJJ!m?9/FGImY^ESWdTPc8Y6yb1EptmnpiQ:t+b&
JHZ=WB %u/a&/FEHPSY:dYjtEEnNe>#%+yNZbqckYpep<DGRKTJh?n!ADQFYNikiKSawkN#DLH$1#ccia>PDiat
iwc9pH C9I##RNY8RcXeH:PyedkPAeb^W6#HC?GXBkhkMW@RaXcCcJ%?/=&u&NY4m&CAkei>J*BJGD1Wt&%IB?Z
HX4YV5 6Wtq/ZHBw/*MaAh&<^tQW<%Y%a+nhe%LyaM66d^LK^J!C9<Ah=y^IeqGh*$N?Fh5K?@NPNP^kAiqIc/$
wR*j6h jCe8+*6ST+wypF!nFLSRcBnt5:Y:KT>5TpT=pB+?ui6Gp@uTc8l^p+8/PN$hD=i$nDKeG8w6yFnn*6$A
cY>qEL 4CulPu/9KtMS!uiu+>c&Lh%p6?kQ%4pp4M>!qNTyw#L^:m?9D6W1B*>1X4P=<wwCXGQZnFN9LTcTeqdl
XECE:^ qW>X#mtjaEKlY8uQ?#8NNG/X!^y55>p@qM8X#p%4T!CcHeM%n&6mpd:tqpaDwCiK%JbWn6eDnNT!Zwe^
Q4mwEc 1@*bDY*yNkq6b\TEH#DGM=:b=4A%GbYunS#lYebJ>M%%/:TmqCC8QqI/EX6TZW<#GXHi!DFISV1T6n#S
5>:d6X lFFKSSVA6$WWWFC>/c^C1YalXWbJQRCuX#i8clH1My$1&q*S1e*Vy?mb@uRNK:5b&4/$8y*edYpV?SCT
DkMY@P FtQAq>ei%ZdDWEMjLXp9QG%<q1tAIl>$h1ut5uRGYA@Xc==/5>YkuGPl$EM1!D=8c6jb$PDn>K\6N9qW
$iYE4I AT@K!>nY$L/Qd\!+?6Sc^%1h$SZWmwy^^n&4M84<LEe6V>X%CM46n?bn&FbWXqNPR<wIRh1XmbT9wmuI
:@<XX< l8CbbS<y:H$4T$//q$GXa&hyNNpPME=MBQej:NJh&?&*IA:Xa6WYjV\51A=Zpiw4YDPQEW:4W/ZknIPj
pD#C=K eW&8b66b8NISdS:N:t&nGFpS<8w>CD%4c5Na5NTH?nZAL>+*?X^?B4c==nSTummtRY1bNNFd^GYcSa+%
wG9m!? GT#HAFaiw?KaayDdcak8:nwYH?4n?y:@AEFa#&X*1Muu/qeNM+=CulF?m$4t1k&cX>+wN+Y6NInbk@!6
I*pDFV hMMBS@5n8c1&X5q8ymmG$D>je%QHBDBH\y#&NP6%LFnnuNI&WWnGk6T81#QnqnY:CtRAKaq1DhMi==1=
16lQ5X HD5dH/%#!*QYyJemIBcIY\/A@WXaFlbBPWPj4X6a6/<ntq?#=/mpDTKQ&TBipck$GHI>F1>=LKe:SWW5
<<!cRG bQ%yMyI#LmE!AkDmp6FKS1k+\Pc%Bd+nL9$A1qEwWHGje%hM\^DXpXGWCb6/k1i6X:9TLi+jh5AI/MDl
$>aA/9 l>DX6p*VMCi6PSTX\i*HY6nlM/P/%4VPIylh\4@!#8P9+NSYpX+?a=H6SVI=I54\\JA9q^^1mnwFFYFG
B\:W#6 PQV8cMAQ%J>^WnL6?aEaQYkwdkdCG+:=y>wlcM8i@c1<\MtFRhV#X1J$nVc@=WADD!**hlYlGAWDaBBH
^VyK#H c1EnK/p/$8u6+#G/5!j*l@DYW+>V4w%LLqb1^a#n6W4AXYnqXpLLl8P94W?<Mte+d$1D1FPMil1Nw^uN
EH&J=l L=18D6QK>SuttiaR4GRaAGe?%ISX%Pa4cdX+b#nH6XcNNpa#%IyLlne8T&S8+Wik1NXbVkp66+#Y$XbH
CEn$FF FXuh/Deau#$IFJIN5waeK*W?>TAEeuQ?FK/:+mPPK5^I<eeeWW$N^l8D$PKKRH>KAVa$AkCiNw16^=Z@
IbLNQw T*Lpi%=wV>H8VniPaBWAtIQ8L=<Ye:tnMGhpMdc:+mZCaAn@Y84&?pppl4p#=bad/*Q!VjCnKm$AunJQ
*GJyh/ >XIQaGkb6bKXYTjM>u$@e?\QVt>lcCBEcYJ8bZIkW&F5it%ldnBX:>%L\Xa\ta6B%1>SaXuuHG:EKRCi
laCFPV LGDt1bF!<6!8jnLaKC^%:n#nFHK6L9>A=RCk<Jc6?\^%$yFjCSBP6YlE5!i\SN\Aunm4JNGS&8d4SmcJ
aq+F^J !:#G^AATkIuyK9aAwMNFNhd5Yipw9SjIDj&n@#hEwEcSa?iRkm%CqwY@dmXBi%:^Zli9@mb#RG=lcc$A
PBw^K/ dw1Ed?EJF%5q1qLhq+InX$ctw<lD@\CjRKbW=Qu:t?Fmp<L+!ue?9eMhWhbIAjARCPpB49Y!k8nW1/+T
!m#SKV BpQKRD&%j!\*q*:\IqHy@TE?CtMtFIy!D@=/8GbyqTVBD::8&BPP5XhR*jhT#KS#Qq4M+>nRh88MnJ=E
t+K&Aw /E9bR#9hk&SVFZF94>?YJVR%\mi5upGqpIt%%I1#/#p=#>yX=#6d#ct*>HbJIHpYRab%u#LKRwE$A^IA

-AP^MW 0006a9f0765001202b4 Page 318 of binaries2.zip
>X?nNk aEEq&b?iB>HS\TS1GF8*pZ1Jqd=qSa<M/h&9J1ja@CQ%kdjQD55Wwu/*?=8bF$NCAl>1>!HA*G/6iG=W
\1GI:j aRGE$wATWce44tyQ^NClN?Ey9FT<w:4aRT:ZaeIqtejhE5>wKFWwIqe?Qe?blSa&:Y4k1:%Q%YWBLNlY
9>j/jl NY/Q+CAT%nD*y<kmZ^I&uM#Gw8*lAFywQ+#wwNaK^5w/@eJ9=mVj^1@m8QPlCN@L$YhIB6J6G5YTt*%E
Bc/dNZ =w>wEbp>Rh?/A4?!ei8b9XXA/XS>J@4C5*DYB\!edTQQy^d4PREhB41jqwGPYYl*:SKGWV+R&qcq<>*5
4K>?=1 GAiKmY4>^XF\y+%kIi#I5GaW6ME\:DnXI4e?Vh?6bFiHS1nDl4X&=\8kHKnJjPpkn6WuN5AR/H$ddwK+
A<ud=B ZQF?t<ecL>@:tE+m#*EP@P+I$=DW4NTBnQZjcHEY@!&YI*ShA@@6BXGyjFSA*CumwDE%iGVGCljG4#Wi
&d#nXI lGd*?Mkw+LNumcDmMI>9iN4%M6JBqPJ?C%*9q?a&X9+8*$\yut/8!#d1KMeH&55I/^bIa%H!&*BLX@Rm
h>IyKq qn8h6waT!9=YX5Nd6JAXNBAq6$!5@KWFCRQD8ICFa\Ck%L=FkwLa1DQeE$<#C5Kt@ZG!/d+AwQ/I8RNA
@^Dd^^ X?K4bcC?FKZMH$yp1RK=A#MEPY//eBAMpRH*1j!SyVpS!^hR&$%GukhJqa^+T@tXSGj&1%WEPJ+ui=$S
:<e=F% yw!LRYIZQJ?\V61\bK9P4@N@*dm>>!GVmeAJ8+B#5CX4<9@w>&JASj8SyQVpWMSQ6IV9TuyZpnb5C*9^
MM48wa j/j+>LGupY&nMw+E@#K%?ww!\w4Q1!Vn**5kt5Fd4LtNRY5%18N:SZkmRd>c^yX\Xh/E4ePe&=l&IDaA
ayJI%w RwGKd+jTAE:TpuC8%cb^^iucJhiFyWdwHR=clc:kQJ^iGq51CDlk:DtbQ<1%Y1*XFqp!qn&TDwMIJ@8q
S8#QX/ bj48YY%hbmTqa*6J$ZWM5AHZPP6DMMHm%JS!hm%me8F4ZhV5hCYjLE?%FCjclePLn#8C#M8KDMnw9Z>:
&W8ein MD94TLyQT+^lPtAp9nNZBq5VdjR+Tcj??/=E?#yt$b/^ti\F!TpYJHI%!YAbjhMD$c??/Ltl?b:qN+cd
R5VG+R WdNtXQ9HZ%\NZVcY?WD1@ampkMN@QG#KH#T%hheyRpXjewu5RYLCpD5*EbG8Y4SCDID*b>X/i!N5Vl8k
HDXYdu nVTaKGk^=Wjt$\L<b@AEnw@1RA+JwLpFS=944u%:eT1*4mZcwA?Lu9CAjL9#m>&H%5wPu&=@6yM8e*V>
Vn^E/! dEiJwuc6H6Rq\p8J8SSSI\B1EIy@d#+8w%N1wC9h^/:Z<MCX*#&wT1C:=KYZbE::neNMQ<CCCewn=Ka+
KERw+T >Kh*eE:AQJ%$:mRK+>Gmy?YD>tl?1?F*@>RdpPNXe:wln#:GTC?RpaIKEp!^L1un/\wwL^q\bZ\>/9W9
u9^6Jy <@*:DlaGlXR?6mdYRQjp$*nmpH@FQI*iYW+A$*eHI=h\I4!?RCYaIAt@ihw%QLT%T^?4\<4jWu>Edyyq
F<BFMQ G&BE8ZqNWJE+Q$kjlB&%LJ>4%=n#Jl$Sqi^*!6#a>$%9H8&1GeQCqS9%:=1YKBNphddZL:qAHq#D@#S9
#lXMWC CuhEJJ^TS?PdRIY@b\X<n#Y%KV/ME!i9Tt=eIj9SdA@LQ4p++Z+9:PDRiAi5eCPYJi56*dL6Gp8kTb!#
nV<Gep Sd$TwE$We$JBZe5CNy#X/FJ@LEW%e5=CXh8#XFpMLNVpcbp+y%K8MqBu9EHlQ8k1XJ*>Z5JuABIw&m/S
Iq8kqV 6a+lMBH<J4Fy1T%^uZE6BQ?llM6lI+HGb%BBCAhYJ45EE*c5>tjKhYtX6u<==N*i<V?nZVi>mwu5/VC<
eKGbFV VX&E/B$&iQRq6Z*YAV@laX\\ZP?N#%T@m8n4C4PCchkAK+%8BL&W51NYiD<6Rt<ttaJ8:NDADcBqZ^1i
5%1lMn q>T*@I:dH8RlBT1FuC^6hhV1EAauJb:68\VM4LwbB1@4$bi?dKq6Rq?Hwa4Ay96PVE?Lql:*Fnt46HKT
HMt1l& y+<EAK>TZB6ZEthy8<GmayT$kIJMGS/QHu@<L*IEi#GHAQ=#Ah8L+DF%*^w6k@eQ!\M9a?<u/ibQ6k^6
8Kd^#y l$4*j!QKGW8QARK%=#68pSZq/bDHwGt*DPm6$CH6R*6@@965pVdZ8K<l=M@y>E1@b=m:Hb?$CTuLRI9n
aL8l&! 8=C=K*cyY!&Hn!Q&A@pB$/pRm4/u!Ip&%DF\+j/pc:IY:=JM8/Yu$PIF4btjJN<XbhQ94m%qZtNC!:HM
JjDE5D <dIdeZmLWHGBhNdBe>$&4u+$Mjq$>p8>cM1<4lSKakI<=i9?XnR\>Ake6S>c?iZNSJkG@#HQaDRuq6NY
/+d6*I AL1>^n8G9J&+hmGqcGid9IC/e5NP?^=ccYFpbYkkQHN/WSH&b\WJA5FTkARLARMDS5iwkabmE#%>AKCm
jT1KHq G/Gmi6Q1$6bGWu*ncM=L\mMTQkCk!#Wcq6e+A5$V=/cJ$q@iK5Dm*n?\py&p#Mcp&&h*^+*?8HAST@dk
+@cN^p hT\Au*A?VJ:/yq<wnC6QG@AjGLL6pDGb@An8mQ#p+n>9M$btk=kXp&4ZkQ5M$pSj6k%enSAaJ9=J?G>D
4+6?ku Yh=9m?+h1RQiX?h\8*&@EKWFKt1ND<DY*Sq=eSZC?RHcL5P+q6#a1ee/B&j?P&l5AXwFGmY=FXVVeX+I
lS:R@6 W8JdkGuSL$1WW:1=TAIlFq\uFRFmP^C@WRCb+yFyMH<Nd&cGY#ykuu&#d^Whd1Mt=EWnyBJC/I+CuZlq
8NZ>HP M:G#>ch%/%E!I%RJpwV8YPZn6MH19/GNa&:$GpclYMGK=@41>J\teH?ZRTwFuA1bA/!6>Vy*+j:Tu#*S
8N/JG+ dKWEw&a=kI+HnWw/Z=1\lFdd4MydehEPWR5Hbd<XtwM@LqR!KM&JT?V!P\CjV:<V%FPk86**11ZpEi!D
^MJTCV 8=th48+AwK=j\&i:M$I^NYMV6h+e$N=1yG69Ny:%kN\!J1&!&BT8Y5!hQ/yeVh<l6nPZC:Aja=n9KKl$
Amk%6L DanR4>G/JebCbZP:lli5&CSb6q8ZAwk/cSS<LAZ=?&%HZPP/h+NmRG&H!+jZEHt9^iWB<=:ae<DVlch*
QFKuBn 5<nJ5#9lldAYF&:aPX#11Ti:GwW^QJ5ytmtZ6PFnLp8uAwJkdWlykm#h!Q+CT+NcpTLq9$V*!Ly*8wF%
>*6Pw9 IdLiXa<RijeyiL5SDZD8AKh6>DHTM1b&PY*$HTl%6Hb^+/p</euHQZSJlbD+yNW+<k!T\M>#IXlCqb4l
XtNHDm B$6R5$5$#4PlKeh%*=4?D>icntM*bDD+=qe+$k8mb:pe8ahuH!q\@\V=BRpA^^KHXCnNiF:AQE$A5iX4
R?NC:G @n+#Jq#JSiaAwJMtp@!>Z:=><T@mCM=BP<Z1a+5QN&Z=<BE94\@tH#A&N4AG5h+&=pYcJZndV@wDhLB:
n#yKy= !TG/8?S6wl^MHly&9SX484*R1tNHQM!hFX!%<+A^6?A^&R@eRAGbS++lRuT%Q+5MDKY9eV@A>lEa\W/i
hLXi>/ Qe:P=FSd?XTp8dk<WdFlYn?jYy+qyPMVXHjQb+\RYI/NyRHR>byG\9/*cdySAwuFE*6ZlL#/8K:=laVA
ZB!a\Y Y9IbWhm/Zb#jk@Ljn:je6MuwH4&lSp:mdJHG*Z4mWCy^X&Cy9LZ\dqkN6eT\ETW8T&D4wKh5?%?9qhbh
:Ju!#! XYiWJ!kEkb!V!h:eDAQ/Q!=^WBwVXTM1cZ4atuKAHI4EyWK8:ttbSJqiAAHW^Nj^/W#*ikWJARi5AJXy
a#>?=w AJ>aX/DCK<K5S/?8&ujnXTQhh#H6t$n/<R6cn^e\H8E+Z/nn1+hmZK$X*D9yZ68XGm*WubLL@MV/bi&6
&m*jDb 8F%p1Lcyn:B%\?\W8J?GCbcEQG#Y9#6IlRPD*ZScjIlnjpimL%bY*m4QRNwk@aS%8ku1#9EuXDK811LA
p1$N+= /L$nTp#tp==#ZP1Adt?*=u1VIucY4Y@eZaDR*!/V%uFVR>BP^Faj6W4LdGG?ce>9*HGQqd+p&Npi$P=C
lHLJQw jT9D8aLd/64Lj!5D@**!^Q*ulLp??D<QekINHZ=LbXKlh\e!!4yDYPwetR\CAVu%+8:4>V#dledTi#hC
<t5WEX <kG6$a6QetjB6qkmd/JFVP^Wq9pZD<tjC%M8QE?pSq$cPpuSY56C1cb<:CPdntu=?AVCMn=k\$Nm+9HD
mZM1=E &XE!&BIm>9G/EidEHGDCN\RAmRQeA@>e\FpQ6VK*SJI%Juy>ync%GX=AH!$%^w!nwkTSA?SpCDA::=dC
YV#H#b Wtj+>4jHP=lyD&T</hQl@REE=j@>m/ppW9HTRMGY1CS:dhYVSKcLTV>MMT1TkqNH&Ntaj?hB9lQaTn>8
X5&WT@ n&q&<WcdJG&pGVyLA:ARnJuZW4qRJibHwy+8b+yhNCXGetF8a&q#IFa8IEJ!bY=8btLh#jnbG:mAcCGW
TSV1t4 AKCWti&:%dbMe+QwRHy@Saa=Sq!K/BcE+/9LYy95u!lLeP+XG@+6bc\<k=yue5V1=We%Jb<QP8?X4wjw
Iw$#JF *yEAunA6N5Q6nn69@8\B9lln\CIJq!$dw1yhY+\cI^R*8EbC5d8%:LJ>tnL8e8JDEXWlAQ9BP9<aRnQe
HT1+&9 8jLX1yw>Jwu<69HMa8k9N!MkX%Q+ub98DY/K$>mtBF!l@J%nHcZmGM6#\5$FFcmwM*4&ZqK>Vn8aF$AN
Em1REc #9J#cwcJnw<MIpIBAPN\FjdMl4wlXYQpZd=b&W$ykX1@liqinPewnqGJ/XKLSSiS#cmn>t/?Vjly/SMR
dZwCbP lq8uwBC+IQV^I66:tq5CaPu8JneML=@Rt?#F<D*T&w$amLy*>^hqHF<pTda9X9?yFC#a$HN/:?HcLh?>
kAPwlW wHBL\K+dwyXu^b+I#4aQL!:ZY=a:lA+YF#yN:Y>m:aiC!WIt8Ab/tq<JDDqdVS+tjCN??d?aMmS6Ni?V
^l8<mT @/$yXnu!TC$nCY8:DY!HpISpS:>X^wjulW8*\=l=4bPau$&I#W^i^#HTRnZt&LIaIlc\hw>8TMD#!:HL
Gd1L88 IXEp1C#w\THwdq\8W9NjX&y6VR%@$bkt>R5TT5MP$>+WMSqLeLd8</5m=Sittd>*&lQ5%b@eXbkdDtY+
6D*6Gb XhN!X6FJkt9=K6tBpNW@5bcai*G:!KWTPRZG+b/e&EudcT5K*6Xiwi1ct#JZR9\tt9*Dh/M$eJk%QNa@
kYJyjH h<@I!jPZnMRFSd>?=VNX+uZV&$i/bVc\N6uaHPDkb\Q>A@>6%um=t9\WTqPtA+@w&Jt:+ETN!%1Yqb1$
GMYSLk m>wF/MMR\REMicS!:YE!ZcJW\HTlX6d5G6B#uRjdmD1p:AY!CSly\\Hj4?k+4^Q<&&Yu+EXjDnAG!+GP
1\p+bc 8kKLAthPM+Zl4wu$iV/&qM\XYYLL#BC?#<iqS?b<y1dw1Z!JH5lTck%FT\RApa%>X?Mq86q1nkdFmIdL
nZXXRS ddyakGI+XZjGkwuhVDPA>BlBHa6ERbBYkjhu\#XYaHK!X??TMVlV=\*tMCLWSMa^$X+Q#eNi9jnDCHFd
u44:tM 4$!FtcPQDcHZE/ZeJlwXbY@ZQkQqJKS$S:n=dX89^%TtW5bMX$HKld=XQEb&%Sb*dL1k1t<aTpNldG^l
lXN^lN e&@KyP<ulMAGaE&WbmVCCHy?!w%4?NjX8NkAwLC5l1hA^uj9h1GcaZWt6mAyDAL5:ck5<S5ZmcAYc*:n
JwAtm# qkc:BKY@lC=%p:%^HNL=/&91JCWD!WZcGY1NPuVmCNtSqd8A/HMC=^w=W4Eb=nLEAN+FZq5%^!DZt5hW
RKLu8> y@5+MmMZ*6:MatRKP6\eilPBtq98p95ynjeh?1amA>E&1qy//Y@>>Eekk^&?VWdIQ5JK4qMG>JllQw#h
cy@I+t E<%b^hSpPuVe\MbW@AN<q:#B54jANKh+p%?CtJNLaTQ@#c!K>DnuY4YQJ!1YNN5eJpT/Vww*q+51nL+p

-AGRk? 000bbe89a95001202b4 Page 319 of binaries2.zip
u?Hm?Q &>\GnBt!FHh&k/:/LQjLPn6wndLXbnKejRX6WM/e/9clK>iI^<9Iwm$Wi1:WTJ+W:NWBAeVRBGME?Ri^
k$^Y>/ ^!qB+K9Hy$dJeJcR$KW@LGJI6YNCh$CQ=!SSG!LIbl>1THhyMq$A9TwYh%G^Ny&QS*w?Y=nVX6An:/wK
BaP6?6 d5n!\yhp!@K#RV$\=mqalQ9ie1+X?@8FupCjuGm8+EIhcZn@i<:VwZ?\?W?bEc%WmBN!pd4naP$MAm<H
mk@:B> /q9wX##IpkVyNHW/DH*=\8d^KTiyc5WAwKT?b&?Qj^<>*CRMm!hhc=M1hy4$A$VGyBdhJ#Z1!a%HPm9n
WV:NPE X\?yEKH*n6tTy5b8uV+h?@T\H@@Q/QauLRCkph*8Q=DG1l/ucGp%J=eY1E>l?>Wea/W^%aiCAJ>cy6Hi
PtP\>J \^^+:+iXK/1kthn5=SQdq><Z:@w\jMyQ>\C4DpyH?6VG%\$RDADMHZhZJDlK+5V\/I+Vb=hPplNl>694
=Knkh: JR+Z@jca><l<idB!HVl%?@dBe<TDETa4R&DD+?nYC9&lKCaL41t85&WQwkBVAcB<%18nEl:/D!4PH*TE
K>d#/w V<4#F@PpRPuZ$ui&Rm$CN5Et!&liuZ!aCR1Njm*6=F%=>hTTV=5an9\1y$6<Mp\!DACNEhZP$ZZ8+#JT
mnu@q% nVkSa!%NGi:B*MNH+kK^u\9QW1&8T1P+IFB66%@Hm$DQXbciPaHl?%Fw:u\EihLNtGkwRBBZBbQq<9bP
SkkGat 1F8+>5M=%$q\48=NWZk=jn5t8d%yh#ySI>HtMjC68Z&Pek\&%ZD?=lBTM1/:1\RqlC+Wl@by\+W5JF4k
PTLdtI a<BRHjcEhMeb/RE=tjP>Y@pw\81tIACQyq:mTiKRp*m1I4QBF+@jNDEElBAemc>ZZDe!1biBWSc?YEG*
!p/1dM JIFwKpX1HD$&$&YjqwVlXpE/^\cD1X/Nw#pCW4lb!:k*cb>JbuycLwj9cZyL9ipIh$##IpuVjq+9MV9H
>i#:CV GSPQ8MYCMGm#eV$?PH+i:TkMjXRh?KMkchwQ=kYVnn!wF#yL&P=AcAbwqY**LFaBy5ek9jC6LW<Nle8e
bwYpu9 <?Mkw&=N5/WD:bmXEY>*B<wWJcR+qRRNQJB&<88hcj=hq*E@9@D^t*jFym6BtMl$ZTuVj/tX=XBTaJN6
&VDjbd /cGjI=i+qiDI&R&M%A!81pAkAVEQpdPXB:J+qIJ95CyVVAChE59LTnD6MG&d+4dE5:F=%#JZ<lPi/y4#
K*&cuk @amFA&\MCmZ*WcHG4/KZX9AlEEhJZqqd!q&mYe1J8I9lF5tCMe5iQH\R*k1hGECbbHt=81/J5^cJ9KZ5
ZXW&GZ QjG5%4HLTYwBFy?BlX>R^BW*?*9>$8lRNj9qK8::\*dqRASeD9ke:+%EA^$wS=QqDC$1$uq#!PF>JH%h
C/maBI l$qE*\9?^tD!/5B/$PW#%J><4l=WdbWD@mH=TqqKNFVu\kJwt5Jp/IPKwIDipL5CVc!<ejQ564RjEb/S
X16>Iy j9@JXI*8ndP9TX<yTd4I=R:>kA<CM*BH4m8QD94CK?&>LcVRbQ%9VN/:<%5>%RuDuL9:<%Ytu<j@LNV&
F4G1/1 >^%#tWeJc*8yA>ySVV=XIJZTK+VetH:<j1Z9kdFTA@+!<>JyB4iEc#Q<plI$9G*Sc9bDjYqF&N8&ppjI
w\d+Vm 68$&tqFKHktKqhIW/:Hmt?t1QpbIy!Kk@/Jm#SX\VGB658FG*JFLdtn5u6a/FCHMGNXucY4ld!wpbH5F
Iu$hdD ^TGYhb4SAX/ZHD&KF:KB#G%DGWQ+?6J+Gl:F8q5N/HuI@NtNaT+c8!FnIES=c*N$bZJwd*X#a&TYFcA6
^P6KFF 8?Hk+uj5me$XMZcSAejuJ\n>N>b:9mcnG\Ck=+C9L^QLw/@hb@mZbwZBmMMud5Gi/1@VdCkE&F8w?\EB
^C<*SE DdwD@nehCm/BpcXRS?wKT&YmnNk&#&1/!!5GT<jS>c/5b1$b+e999yJeP$1Q4un?FZYPk%lFe5Xj$kbV
VwH#TL WViAL\AXwaBWT^XKC/4NuX>W1He&=CdItwIFX/^1QmIB%CJJ&k5ccPl/bNB@YI/9/wX6k>j@V<IMMy#@
ynDaG$ \n>JjLBiN8?5&unGBbWAun?ka1l?DCa$5MNA*@1*M^E9j8:EAKDkLhNi@SWqaQh$qjdDZp/YFlnJTV5u
Gt>lYL 5+6>l>YeTBV<K>Sp=BEkVK!cYcMwD%MXmCu+By%!iRR9uhNn1A?1bHVp#5#Yb\KWw&=ad^R%KCiEb>n=
i?P$5$ T1Y4IHhyKbA*VTjFKQIqHDPCwilnXLpQJW%q/T$$GM&c?\t/Yc$cacFHN6T!S#CFcQ@%yHVXkV^jhDSp
199?^V c&1>S!#iJ\6kNX\$FM!cmCYh4K59JDPmT$tFa:dQWqp/Dk*HbqQiT=t/yDDF5m/CXXyK54MqH@ZI#kw?
8=Rcle ulE>p&ZWHBDiAEi%pa16D&Ma5^!kQBe@MkX<G$D4BA^VTlbnFb/d6N8IkYXTlNQAuj*TpJaBbN@j1JNX
+BNnpY CbS!t!+4QRqIEWy=ylhReRAaCQcwiBdMnh4tE*L#?kCiI8iuKA?IpkD8mlhmKiwy+QFH?qCMkL&BynFA
\&^G^Y yG^An>:>CDe&<54Z@+mmnV:1JK8Z!Y%<TMhcILwn>>V:G&#ycwJn+XVap\9$*m6ZDKiLHJECN#ynmJL5
GMhuRj c^%d^TXquVS\e$5l%6yl&<cmH9KF6:IV=AhPN19l>4kKDnWa%ecl#yI%k4!TlDHCC^npjcJNab+FnnDu
IZMhwZ EW8SHD@t:A?BqwwYjPd?4%=KiP>uJH%GX@V5NBmwiYK:R6$amIm1+mG8iQ!?+X^IkXKTwk=mFeWpeR^B
LSW>V4 NeeQDYRjp15naWkLatp>k8qhT\uh\ub/6GpJhuh&KaiD>Xm\N8S59YHMn#4DhGEIqC&\u*G5a/aAa$WF
LlBD:u B+&!/>9CdP&pBVulM+BDiRCjcNE^qd6VV9GF?lkQyl<Em$J8k4jBkT?Pm8dq@qnV?bC4H!NC=yi*qdh%
pAd@ep %ihHuF*Qpbbk?5@y8?=Nc\RIThw5+SHti%ljYJ%aE^Y!by6/L/pQuXS!MV/tEe%4%k%WFt/1ZH>u<hcj
pdyL5n VkLX=D>w18$/$tIAdqLGN!D5$BaTEe\&Y&TXGW++$G6#X4VndCuLFZa*FqG+^d8HSQWuRFSk&?j$:L8W
/\qW*n jm@8%@y\bTiIFBtBG#uKWaP1FEpeP1QlWaMEAMYkPIMRSHGZuTB9bZwSuEe^SGTL4<DB5LFZk%juB%+H
^:SSqD Pe/:KbaHj>y4%e+S1mH6V%%\wwq<4t/EnPc5+:BZ#I4YSWkt<d:QF&VNA/LB!XSDGV:cRCIw$A8/SZP1
q1NlDX YNYmlcV<b^XTpi^thC&D9\kc5\I%d4*B/wJjtGDA@5/YA@$aiG#uyJWP9dkDm?@K:9%^V\qYbc$q@9WZ
R=>NE/ mBWyt?qGlnAQe4Cjt!QumL4j^GbMZ%6l#eFP:^T:>$JWttk>B5$RH>Z*9@qSF696H^X$EL#t&KWEYy4$
FJHm9! PhL8bBKkPRXmemXVwEe%88titp1EHb@?JS$ua#IhinCdJ!lkmB6cwiW&uKFjFnR4!:$ujM5LNZ%G+klH
JpG+uF iacm5=6#/^Ch?jd+M^k:$F4NNKwGi$chaItH?Q8#KSj&h8EAwKAy9uD98LXddhj@tl/C4%Qabj?uc9MF
dATu&8 <*8IX>FGc!6\SRtyXJdGk5Mi%P91HCELVYkdm*ncJTHEBCNp4?T/h\CjYikRXF*54InX!mmtYp\@WIqn
8p@/ct >&:kXG*\CmZ#iNq#L+aD>SX#?&k#YI!mk8LS:R<ipJNBA^KT#^ZLe1*mbiT:ecqntMYJDIA%e@LWjp*q
@=6mNS :yj9KH?BZZ@dnpYA%5?Hj!MZyGNqK&6!F9Nlh:EJda:VCEA$IbMW8R8/8kZ6:a>EI8=+db^bc!CS5RQE
V/N@h5 ?w:NjA+*/ECq^RKeK&PEVFGKhSRA*FIiBp$+%T9:?G!kMp4kAi6IC@T1<6@dRu>=K1@W%\&4?KJbYKY<
$68\DB nJH/>#ZQ!Z<4ppqtJ:5i6R=>nXWt>#%8P>6bj8Vw*$NVBqdwSZn!clIl+LKja%8cb+18ICFpd#F>?ww=
/@$Rw# ?+Pp?l/NmpI4N$#YI:>M1!p@Y6Q4Xta*FJmuayMWANIwyTKKRE\y\yBVlXCCmnFDEKyJwA4*6#HcY##T
Z@p@4h MFXSZti8/#L1F\^J\kQ!1K&jF&6Cb@55Vj8$PYI:t8JupJJJQJ4KV8:G>PN9ianTbdQ/$%t=^%NIm?a/
QV4pcP wN&TeeX8Y@l=yEH#+J>cY^8w6:GGPCDTB!5uJ@G8kq<N!IQqdJ:%tZ?qVYwXmN\Qeh1Lk+6E?t/t>4KD
D4jqK< 8I\c>L$dWX9:WHeC\HQ9Zn+LDuHK>c:L\jjFdpS:8CKc$bnWnhZP@yKXTGWEh/K$MBywycKAJlVlVceK
!tln#* ak4F<Scwqqc?YG\:<DFdVEK8Ta59DJ1n14AlVnI:XMubF\n#P^kcqeGS!e=!c#GPbBpEmy:l#tt&!F*A
t@SFTK >VWLa/9I*hF5%KCa1MukX$>qGldB+4H6yX6XSYR1tPD&4Y5d/#iV=bFa?tcp/I6JYNG>6$TJCw=I=Q4Y
RPmX<M HjSLIMX8#*MEpGAiuVNah#eRL8QtKTB&PcdR:/cuFclD=N!\/b=4R$G=Nyi^9%GeXY%n>=Mpm>GB16BI
qcuu@S XbiiAcjR=t6Yn&T\uYcFTyHI!K6EX!9lY@M1CI6uA41l!M%ch$edXuaR$WywykTW+WkySVAwc#P$NlIX
S+nXIj A?/ij\4#DWJC#BuAHGej+%/D+n8XRCF!FGM=dyk%=6jEq6yaHu4/%qQe&yLew#Hh!SkXNaaidyk>SWLM
8ENh1b PBW6p+Y>VQjmk*Y=&WTJiY1SPQ8+^^SJa\Y5G%I%ZuhpDHQ4tp$$<LX9WqcSa?jqW<+yG>p>TG:MdC&V
1&L*9m HDDL+1u@AGVd^#?a1lXLdmAV#:jT46\5V*N9=LE1Md6\^n%y&wM5eSIwG$u1el+kbVe1FAC4\AK#EQVH
@B>+dZ +%b%PWT*HZpe%YnZD?8iqQwe#%b%9lTj!4/MF5bRm9SIt*^B9WX=Lw6\$F=G^dwiK>V$>>>1y#u*y^MK
^18\5+ 15!!cKDSXtR?uW$Xt/y4>4ydmEw>^eMPIwlpn/?qN/Aqew?LwA%q=+?<PMa#u$4#i/B*Hj\\=\K:t?t%
+?j*@% 4YaTnR^&$DHeEZq<itjY8T9dFIbHSHLTEn=CPS>c!q*N/dT$MyqHB^mtAFYBHWHm41YM<+^FE:pj*SuF
=kCuc< YSwGyPR9&PRHiE!XIG+>5$JNtnpq8#R$nWXcIGR+I/=4SLTP15#BqQJNba$tTLVnGa!p!E=HjQwchyi4
BkIRu% C*W^#eEhR%Td^bwVP$kEaKpk=DKV\KycujFLRlu*N!Kjic#HJDmMAMiABYXe&F#LD=nK#EKZaAjhFG:C
VZ1k>Y e6DGLFuJd1VWmDyn4&y=lQtAa#peehc9&tn*6!liPB@qHheXSlhLe4&i<ZKb^!S%wWm!YC+PT9B4#!DS
PZkZ>A :y4u!Eld#$GYWnHFhByF:hcG=GwYd4CVlyFPei?KI8#I1K/$P$NFMmtnulYYJ\<dnK5PlFFcHPe/*mYd
LKB>FC YIX66LS:h*@%5:hI9aiyNcGp/LDc1Zb9Mqe=iS&!#H*4M$:T4Bd:DR9NduP/AN6=>j1K/1Q\ywMpc9Hb
yLLJMh 5XabBM4j+$wi>1ZYZ5>>k?#wB^6@P1N#w>lQI<p%9E#Qnee+J^:%w@<ACI/Ij?ZM@\Dj%9<AGuL+R$IH
^@P%6C J5FQ%l4Y^#e//ZKhncYFuH=MEWWKp=\CKj1kV?#JTJF?RB^<\@lIQ>K6@\DCK/CD^y5j@jVj+$j<I^wY
=R4tm+ +KhNl\iCCVn?hWt$SK#/tdi/Sc*4iip!^8\#9BBX91QY5i+<E4e!F&nleu?NJRCc:SjDYmSkBhMkAA^^
8?EHba u@Guj&ByA/cjCQ\Nb6Sb$^1%IK%:uFRiDadalt?#\:j+tjec$JhN5+LcK$nKq4mbXbmS8dHJJ>BkX$*>
-AL@9$ 00030c20422001202b4 Page 320 of binaries2.zip
a&4>9k kcRiVy$B?w1C+<QcI:KVyh9qe+IBFXBSV$SFYyPc6J/GSLw?pG=?$@a:d#Rek+HB>cqbI&I#JH%@9C4b
iG^=e> <N/J*$&H>W@+S9R?&tRjpc1^q#41R^RYed6IymEpu*t*DJ1P/l6yX&6JEe@:Rn&mnyy5H@jNL@aPnj<A
>am9mh RN6@??cVm^14E+>Zt<QT!TY@?p/eY#LGl!aV/n&w1>+u5LJhq4aw66GCVeiWNwe>kjYm8cWtubHwRye<
LXRCjq XJmcDcN1GwBuXCpdba?96m8+ppk6+nJK/SSKPYa+A4M$/BLh$nSRAQ8+FTY<T/uiTZh\wiCB#Hd^6!8S
?Q^Cnw \#ph#ukjT6+qY1/pm>c*N6iIY6yqpWheXJIWnR8:lFXXdWZMMK*MckQG/nPP1pkEjVtp%6XPmZwd:9p6
RFaNtY VM>Bnc#ym@<AL>E*?/h*<1uT=6=LaZRjMQZeXI#?HYt&X:a#BIdccByAkJTLHEpJ8hak6i1\L=<u%/IQ
F/betI =u<KLl!*bhDI5Ht8DGwZeR+\XH9Yj@dq1<apkk9LlG^6cK*ak@T4iyNnV45@>MZ@AJXS$ZXILt$6:YJd
hC$id^ kNFCwd#IYWeAh#Ww$hpKNc<$PpGu*d!weQH6AKitVuGjctQ1<K^F:mKi&K>WpnP:u8Mb!Ke5$ip!T^*C
YE@m$N qayyGpnqA#9a<qDy/$\#^YadWNStT&caaApdG^B$Z/>#Xw!qhwXNS6Jdb:mGZ#Wn?<EWql@\H4T&%:dZ
9V8Qj5 kd!JR^Z:!pabj1D#XiG=mM<&1TBdi&<5I5pk&tVuP+?*aWph^B1N=BeYebpXCh%!BlT9hjju<15^cLM>
8#6CY8 *BAyb*!R&#c9LF9VH4WQ>w^kn#ILtIMRwb+mBp>K1\^#Ij6<WHu5$<lcMEB5HkFe><CyW9ahTuY*mLKa
D:Q^>P Y*#I+\\I/DH%w8HKX>e$8K<6&bXXbk\Iauk$Xj8RG\D#:WXuKCdP!uYuGKR6w&J$>M>Kp$aa5tV?=QK9
LP*%BY @n=19AYF%GXaMl#8GPqYYl8Ith:F+kbD8bJkh8:%BHNY#t91J1#:^dYT<!ZE!<im1e5jy^WGy*@&t#%K
S\Ed:V &YJl=EJ<^miAe<D*!Pc5YXm$M<q*e#jcL1Shyjd6XF@81P\@uVByRN6eI$^Eq$lE4AeM^QZ<B^Wn8cEa
LaRFIt WIySFWaH*XA4N$&X:uZNSVe!CPRd!PCiQqGj#NcTAK14u:wA1E&5kucY%8QIcRk8DGGDH%?6J:F^iyF4
a:::t? E@&i%tkpq*mcJ>8::\^n<^#X!+8X6LL#Z*MEWAKP4HwAKw*GpQQFetY=</=tZaJZZAnZPeADyX1?kpul
TQAI:N nESWQFI4kQ$dHa$mt>Yb%>BK6w6*h5G8nLGIpH*amYHA>V:%y*pWWy^JGpkBQ*%BA@P19&c/8:!Kc>ET
P9@jbb SRHhHDG^de@>+u&:CuZF5<:pZE^iIumNS6GQj%1q8SLa4YC^NBIpT=6^IjKDenH6u6uPKTA^yJjQCAEW
X:4+?9 <:ilaL#@AE1R\VTAw<wnmHAYIaPQ4@lV#Am&4Y<aEcFTw&>5%bne4Slq54c*SmGpZql%A/p$&+lmS:iC
WB=h&h BAJpeM8P1L@EV:H>ctp6A/^AVT^tJNtWPMn@ACKhDBHdkmNed8Te=J?ywC+!+QJXelmP8KKJV<@LN$/A
^1wQLN WWtncL5nQ6b!hSmRNpEuPS!PPti>dm+4q>E6^cTR4LL=pk?@K^/t8li:6wWMp6#FGm>Yh\AQ^wV8!&DT
F>KL@# k?>Xp8:iRA^*Edk>%eGumiQ??9=$YFeqNPndDmwjPn@9mp?$S1Rh\?6K\KTV8ZTep$$t1+9aTC^pZH4t
HueDJ^ t6j&wtEB8EE4DIVQJ1iXt9PtYN&DWWnhKa%%CkLNIwH9We%*Cmqm?h9WKMu<lXJGeyZR@NJWS8I\j9eu
e:S1SA uFMN%GB>/4M:MtJyyI1qe/6c&$bpqhkAM<Dp%#njE#\?DkC<duH?1/j4Tepm+$=QbHW!aLpulRMpp>KK
Hcu>W@ +nY6hPw:yLYYXdhqClGPQ4SYE188l*R\*84tejm9qj$PWHkja>dGcy&14ncaS+5nZ5MAu*Pet>eHyDyA
lA\:WI leVnHFMtaael!%LEyy8CNuY>P:Fbamb4:WCNhp4!@a@9^EQXFPRL!PA^Tm6F^PTJ!tFCd&JyQG4Gh\Ck
Y:bt1+ tI#WM4%$XNS8#>:J6Ihd>QW8!V$a#uu>w61b<FE%RT:LD6!*PkE<tJXGdPLLanb>/VMX?/&DZJ1#lwkM
e#:cnn FkQWAKCLqWbmmy1tEV@yaYQuquVYe+6*+Kmk&\WWa<yj>?$1ERK*SACjT+yc1<##^I85XBShkd^JaupH
HCcZlw =LEAu&:!m:lFR&\6GR\W@hwpEc5mDdun5%Wh<\Zd/5BV=S$BAS$+A@>mcwQ4VelWAXtQ1L8LA?RjKclp
hREQ=I wi8DqS?VTJq<i16kRBhj8RiT#YM*@kWW!85yLL&w=p*RmL:6Jt=eBnlkKAn=bZ89=tutPWFccLJ#YTSn
K1$$5Y :Tw=hMc$$qZu#yi!L48KdWditVQCdIjdP84D5B6H?SyP@#RHRJu=Welt6uqu+R6\AJ$hnFEY\A6LPG>B
T6^ihE #e+bK\EDeMN#t\Ckw/Wk:X1%/hbQ\kPWG1Y5#IBSl%N4MDW=NVA=RGl9atJqe!=4it>9LtXphdkdLeGe
lTK/w< LL4AtL/&Tq%MD<dFW*S=d/Ey*\L=5ACGW/w9<YHGk!M5VmkEqtKX8DWV>kCdBR/CRdA!I?+hdn$<5*Jm
a9:#%W TGVtPXWAuSu$pE>Mm@\Mcy%$B^B8e^$TSC&WJHN6aZSyiEI\9kChFLVitpM/1<4Sk>WBKP>Iab<8&TMA
qnJdwE un9AI=CCA\RW&knmdIp^8b=9c*MS^lAIC\ce6LwVLEE>B/u+IZY&cWhmWujNiY#Y8Lu@WE9Phk/FF1CV
RwVEpV bFXih:6@iISIiHWDWKJQ?>+Xy?CF?RVe\m@Gle=Xe1Y4pitlkd\>J</9S+miQL56Ky!lkd/AyZ?&Tn:p
G\?/49 j=+JG>SJdky8H+bkNXmwpwFe5Q<M44M\:hqPFNV8bJyq<$DW@G>:muTwI8GSMW+Hl@qi@&F#=inXltWR
ctKa@L 41P<<M$tj5LAeiyEJ+6+%qyB#GLRmFA9haq9LR\Q!puYIPB@JRQhi>ZtCkAbCpiWtbIIbTKeM%>>$TeE
VTl>k@ P$1Nt9bt1@iWL*$DJWSPR?b1>QeAeupF5:*SX5ImEBuXqp$$14:jRmmmwRwDC+5IqLt@*%IG^ehMV=/T
<kGS&! AiMlG/i^dRu*?R!n^?@<V$V6hm%l!lCiu\5m\dWMb^neTe!=Hm%CTL^GyZ6MnaFe=!nl8aGw4>yAD^bb
Enli:q e6<SMASu#^nMy=A*:!TB1qDEpnmDqLj=KSXA<X?$6AW#eEXy!:9eu9C9@h@#+X4q\w/E\Fajhj6imdMX
pPVJL@ ><JJ6%p@6KQ^F&PL!eLt8L%D^+A$T&Dy\wc:lF6>dPJnhyKH9SjYyhAu+yMH4h1ITMaka\tw#C&q=^S8
#ptAYE h@F!a+*9l8Z4<Yj&WpG1VXTC!<PL!55l@<Qah?*dXZpS=@L=NeAIYq<=??=R*#kSlua1:/q#h9!d#ekS
HiedNM A8N1ECqd9apaF651CIBPZWiSQMCa8^1J%mneKBn4mGL<YCm*p^>$KHy469>GeI!ct:^%=p<S&9NSSHAV
Cmn:FG p:%W\HGDN<*?dW#@p8%kCB%lIW#XhX<*Db<:BbL16me=@<=F>Mt\YVy&B@iyZcW^=E?^cFhdBa5lmuEk
4$G&T* N+J\$IT&u<R\wK%PwA@R?kQpZ/i1MIDSYaJSq6/mkQwJTHZm^bp>@m=pkuFe?Xn@RyJG*VX\!lDV:6$l
6ZMVVp $GmmWLK#V\RA:AQV*Wd/Cj#T:S:/WJ8WG+T4<jJEpZTVCK?5j/jFG+lMmL\6+TjnTtT^!Jy?jD@XFI+/
>n5#iH kEY8Fl<NuVFh&q!dQNJ*JQbB*@>yu$n6N*R8?La^XL>=JpW4@?R>lt5jYn1j^1%HXl9?*\/uHHiIa%?G
iX=a+X uB8ElW@uZ+<j4HL+qThy<l+EAIehTY%HacZeTa&/V:yJkuta\yG4B/6BVpbcjSQAMP9<8Qa9JTImp:>^
j#N^\! >&DP+>ZbhMDHY6q1S%Cl&iBi:JEJiP@?W!^<CIqj\WY>W<A#<4bBB&\tuTLiZ4d!INC=1@tVSQEDV>AD
q&=S>^ ND*6EaCepqc?*ia1:kR1HRD^iSD4&DNLapdA%QkX5*i?admQ@q!<VSj>e=k@yWdZe<aPd9^VFn?@dB/B
\Viy\1 y<!hNC%iQ@4l1Ad?6NhLmNV?/<ZSej\PH4FcuY:Fm+9BFbSP&1T^@Mj*nYY=n%/4nm19>y&neN4i>h6M
iiJGN4 &@$1*e*MphyESjcyGh^?cK&*!jmQ<<XWP4!D:*mHWp>y>JH?Fb9V?9<Akk9/@1\ut&Wu@L#+cp@*:bp@
P9MKm\ yZ6AQI<PPN@cbpGcb@c<ieQ+k5#:VcXn?qQ?%&:&T8d:RbB=^ZhJcqS$/a^XZVK5@\C9?GGm\kd:tqcT
S5K!k= ^%R4@Y4hncQDI&&^pl#uHq*uuA@4@uFWh69J@B+Tp@+G!Xh$?%nXZhdC\Zh$Nleqk*=u@QNDnd?9?AK:
#+TjuN I^c*R#mD^CPiGn8%dQ+Wj/euTZ^Yu@dNZ@yXhNML=hhB6&apuhF1?M??M%K8t*I?:wiyA@<AVLXRj/$q
DjktEn IIeG9L^RRhW<R4@%%$=Y1J6RpH*6c8S@%&$aj+XN>q9E@\CZL^NH@8Zm9St>ZyL+8V@kK9Sd6@Z+m59/
J<66K$ 5S&%*HNhCN6S54k+?/hP<y5jZGQ@ANhdJZ=G@h>89t<XtY>^et+Ai:%#AH*d!!AZ<^@uyYt/45d=La?+
$laGXj a@!wGV\w!BT1*A#@AM<&Bwy5cAwyCS6n$q&$WMSkDTB%V\%Gj?8G4/ihPtWHGmc#H@%^%EN@Ywny<MuV
CS?:Ed R6Bp@\C8Yydj/$9>q1MqjDEjZ4B1@\D>qT5$NT:9?99L6!5k5wFW/+nL%Y&\$w?94@lXZ:SeSnH&:^hH
5j<jqb :!Y\d?uh4G*RYPw5XQ<A1ILnc/ej*5<?qX^BQH@!=iK+<j*J\>cJ/E/CHWyqQ@Ie%qj?88tAH$FT&8bQ
1^6?Rc uH==hL>8tAQ%yjP8E+<*^mu@AG!DWTclJFa4K&y/<tGa=i!BI>mKq4?9/a69/@+BA%@dMRH%VRyjcc\K
lKpcaG H?Xae9n1C^TTPHT4TaCVG?*#Gl4A%VYduXhTb=JleLFKjLcRBTX?k1m%5:b<1MqmelFGe=y*56T4e&^1
LPtQkY !iI=YqY+@5QVqlI\Ik4hjZPcp@+TT!cPPH?\+9MJ!:4eP9+hc^*S$WGcW\HQ*TD\cadJY6k^qRNnkn9>
akIC5R cYnK=Yn96L%DT>YqEhuw$5e9@QN>VKH>VYu@AGjPPtn/pMj<<6Xc<y<y51/Mweh\^BH+%*?mjb6Z$%b9
K^+bQI :F$k8niY^p9tnLEh<byNY&C@>j$#e64iiGa5<P6RkIib4wTy?XcV89q6qw<?$jNa>lcSSZV9HaYeQ:5n
Wc!VhS jdcmbn%/de@=^Y$:MEI<!eeDn!^@PkX@/@1=It\let&Pij*tSSVwuCwu:#b%#8l*WWC8e$awH@=biDyQ
h/jVDI ?&4JTG^lQI$u\&&P<YyEj%1R#\9@AM9ulcYY^Z?qSQHC!HEHk!Vn6IX1:Jl1cF:b?hbY<j<Abku\*Ej&
SS4BtA *!\PPMQuuHT1//XPPul&?Rj>M6ZB@4W?wY!Na&$dcjy51pu>*e*bnn@+Ce@u:%SGqRHn@lHhKd@4q4BH
!#9C>$ >c#cc&@4<AW9/@yqwYX$Q?ad+mmh?G144KZ1cC+SjEedbdPZB\Q>w$<cWAQp<M@>?>aH?NX>b6LtLRXn
:8$KRL l$m@lpqpK+F<H\QW$PV5QS:j%?J=6FA48/GN==$d=kiBm8&$T%mT%mHp1kHQ/%^<Nuh#cm6mR<E$ptH*
MM8\bn eaHi8=mc$$<4E%\pecL%e<%uXh%bHXRnb*byLyh6e4p\R6M9KtSekG5J9Bh^eCc+8#Gn8e5pH*ei6hVy
-Ak#J+ 0003adb02f0001202b4 Page 321 of binaries2.zip
1iWe:n 4&6&M&>*FI*w4nQ=XiaTJkdTPPji8X8eD9=Ke##KZ\jP5<u&di5MT=*PPy4N5hqqh&h\u&h\p1qlKM1*
tWlGES 48Fit*p4Dkp+QZNeHHbYE*meSJMaa+y6:qIjM&+=#n/%$WcpujtPK9VnHa:i!mlN@MEm<QMR9@LkYDn<
HGHbZF /*JA+R=Y/A+=blm5T!9a44WGWcnd*GWJ&HVjII=@9a@#t6tTMBD?/ZHHLVbB@C6:uG>C^AGTNeG:WHQ*
Vnk>=^ EDWWY$dtJCI=G+Q?1q^SRI=5/kV>:Y>Ij@4yylH>Ka$+pWkZQliWpj^&dL@T8tdWI<njcY^@+Eca%=bN
K?q^88 <4cjdpu@AG<j$y/wPbh9!MnWR4&>5wn$S##pZ4Hb&?/B?6b@&iN5b$*\i*?:hM6hNL@b@q4JNy5G\plT
K+I<JT bqQQ+%CX$Eu=6M6Bn*Sp/HQ@AGPE<nS9Dl@*NVaj%yLJT85iRqudY&!E5Fk9QNZJQZ9Y<dQ\+\=$t*@D
w5<>Fu b@lYX1qqbYX%B1tqYt^RCp$ebZLL*I>c#t6NEdWbKM%el%t*n@61&tcJXqSTR?MbBy4/Zc*m:baEJ/F&
YA#MN5 GiKm8>S6hV8+ydKb=EXhl*e+I4X6ht*e@GDnFe#VXn$wYq8a/iHLC!kMu!@cBJ8TTJmy&>qI4cc?pbIw
EB#B!y ddK!PyAcR<C1%*PlbWSXA^>:Gce<LC+6R5/5&$6<9PKHJ>VV&edYVMGdW>hlCT*C&%*dNuIXTHZHYtiE
I^C16W :Gc&k8NWLm:e:JLKAPQL?y4i8\#qa@q*TNkNnHY45GncjeYeV!/yjY4ka<8B*CAD/X4VpteXiHK6YX:P
tT##C# /8Hu^JN4:DdnF>b1w/?w@\A>K%yNkVPLj1MpbJNX+>F5+H<!QZ6SpPPFtb&H/m4epWVDA%KNVpjhmPj=
\Jk@GF X9hHFwTR^Kaq*S&#HHG/WwSSSC!I5cE&#A4pNLGe$WYEe+d\KTQ:a%6j>@Vl@lTj&tMak8@yJyj@ANcu
85V&jd G=uWaF:+8H%6R%NdWJ\Q?Ry+q@+HaC1c@4?tJJeMZd?/ml5diW/lBd:&@\BiLa!d8Q:9dQY5</4D!D+p
aZ+J!% $<@:?t5Q/Xw/qhQDdY:L1E$VdntT*6QMb919d&1mhYpHZ^Jhn@i$pH?qR!q@Z>YGnXIn%%@SD@9YVn?q
#9m@5: Tm@SIdiShT$Ipq9tiJ\y?qSHYG/H^Kj?BjY1P>%!PC^kK/:cT!5#KFPu4pp?^/Wq1N4?9/SpcM\bm??B
WGCyN\ k#5RaARy=4wpG?GiQJXm&XI4H6dT+6:NeFHtld=!wADi9T4%6hmTZ=VkuGXQc8iY4QSk?W6\?TAa=44!
/AJWYj =S^tYI+CFXwZS>WXdRB*/qp=WLYk^hwSqiB!RPc#Lt?l$?N#H6nb%I@8+FLZa&hq:%!V#Xu%FpbweSAp
yy/yja ibM1bQ+t4!Z6!paSH6A1n61Cj+%nI>85RX44\#Q**ZAa6#&yj>G#>*\j@\B<9ZVCKmidX1Tt>Vjl94?T
5jZdLn bF*SM4hVHi1^@IX5S#!iY8d1<AQd:KCQ#4p6QN8d!NR9l#e^+?^8\e@VNhhAp^lVCcynH<DA4XGDSDd5
Hjl/up FIqN#PGI^u!N\w1TA!CLk*+@/=+NFMDtDd*IQEjnBQ<AhqBynm=TMu#jGk@AGqGpZAB^+j%pj:81A@%y
l^6CA% JNP8pV@pE?JWQ1q?DVWk59/6@tZ6VqpF6c:d4XFIb5uV+jAln<1wjdLkhhT<YL@9YRNVc=i&%yc&a844
=@P=J> WItGj*h4IFpH?>/+4thW%!+MS@5jW>bRD1%^e=J1+^dSKX!>jiI>T6^66NV%bTa*bbNRkYJD6GY^^p+H
eC<p6j y/m18pYE?6V*McZ5dZX*aM>*QiKFTFCR&Xd1PD#^?qhX1=6W6IX9b>Vhw>FLq+Xn&J=wP<8#<epKBnHT
FZe<M? 5%d&c>m6LLWw>Xn6m@tT\4cwGpAkClEWb#npp%nJXhw*ST4Sydc5q5a\6lERPGnBH9RNMn8n=kpMWw:k
81@+a< hcy?GhWY<6$5J54LGy<pPN4PkPM+@C6wKW#6=^?qe@K+8#QTWqNZMm+Y?5!E<&NmiPy1qdV**>4!SY9#
tH//pL #?R$5liJT5ea/6#!i*A=4S8FP>yJD<mnJJ4CnlY?$?+8=n=Bl%T*HuIYMpWVn=m1Dq5hTBYqNJ9*nGyP
McMmiR MFh/tt85SNHCSYm:p*a@5WH?%wM@<nFbj?C6W$F?Zt9I:LXhjFqd#CK&EhwplKBS#\B^uPMnPP6TG?9R
Eu=jt1 ^Z?$@E:a:4ym%dVV@4@M=FJNZ6@Z*DdG@mq9+XG5&W=#>$cYan@*%ka45adbnClFtVpb*4i+@VNeuc*q
qpFFaH !>>Apq:+khYQT=$>Wn@Fl@uyZWSJD5VMiqE:i4VEH<11\N@%@XldiEtBj>Gdn?:ha^?6FJd^^jbp@hYJ
n4P%EM qyMRSSVJ%PD9q$uVb9K9QDe$dEj<56Wb@\CS4Gpppbk<L#Y8imS#8RQ#NXakayJTyPB\VuQH+$9tQpwA
nH9DVX *ZFc^kw1=yhnqub&cTR5:n?Jnptmh>65&G\e>VWeq4Il!G\Y/4W5qpH6&D6pphAi>cKT5NQ#P+%CK!89
>jiS9e F?qTZ4t*6&$?N!L=BHGI$Baeb\&D&Q4XLXL5TSced/!qcK&%u!u9GuMe<ybh&\w&C8+EW8yt>6>Q$Y:5
q*^:uZ dY@?*ZPu6BA?+ZLTMPTNy!S8A#$:XY%Xw6CpG4ZMG/?t9ILqw:@>:eSSlAjMLLpL<\I&+/AeX#%dS=bP
dDRmEV Y9SE?>jVSjmbGtyyF4e/qe/mL1#q6Gpi^lke!iY&Vlh^/+/bQy#ZhYwc+$8*9:yVAJdaV!dlkKQY8F<X
Fm?Nlw ?jhiI>ce^S&:5&+SKyVAKDBKuuJ/u%JNil?M>Rp69lbb^&VdZ9a+IAXdcRyHQ/CuKQ6XF>!@d&nhhV##
#$l8hh X>bp%cLbdu!4YS5Jn:#n%NFtdiD\*eTiSHFLJM??:ePTFRA1k&>M<<%t?XKlmAXqCpDy\w4wydCjSjDK
8GLIRL R*\64?*8yJtWR#AGREBlll$#n8PKKpXFKKX^KV9h5u%iZW*t%QXdYZWNQukllh4KG&<1PFCQ+5ukuHVk
e>+iHK =#^XG#%kFCNS9Nbpee:+L9Gj\y*mtBq8bYY+8%uq6Lii=nF*=<WpiiM5eF5ehj4*4DTjGie+1+Smqbdj
DZt/L\ %*Im+!?E:DTb+:&<lp6VYIa#Zm6GPP/>iqhpp/BXW*Fludkl4W=@QFiRjctkJqkqpmpB!GS!Dt9S9Djm
NuMcXG !dW$c!94^p8a%^GI+FIeiqLpnZ6=E?#wDeYuI@=cREp@ySW69JJHA1m+8jV=LaMD?NFRRiK^#KTRTTGJ
9AYXKL !DW>6KEPG#u9/%HHdSFC&TCG>cJ%<thTlDIitD!K/d*XtZett*TT1PMn?/c5CNtRlluB1ueZAW^tLk<p
ZtQN@/ <W19M?e8*IB+PKmKEn5LBXl$Z\>jBa:h4G@bHi&u#M!uPX\itj<A$G5LZd=mdu:NeZbMIK!G=8BQI#w^
W>DT@> \?TQR>PtBX&\piZ\S1Weu>td:i=YSFtZE4=GMA=@D/X1ydC$6ydK$$iLV$9aba:t/uqW*AnCA8yX9Wph
5\PDpH P%bV=aT=t4mt1i<&b81&G6/njTZM1Z%\X$8KdF%EmP5R#peeElmV!h*QT4jmG?cV\H+QmBJMpd8eku:1
%*N&tL +FWhRdZhM$jTNT8d!=*cnbNd698>?WBBB^&*Ak>!Qc5/+%cT+$@T:SwkF$/F+%=/:t4cLlLYD$DqTTWW
%i!Bm& Xdq*F6IpbW8F\BuHNhN4tq/SjiFaI>Q6t5:i^npBn8=a%pJKl9N!yPi@!><>BZQ\1NT9:c^SAZ8b%nAp
1DAGEA dAPji6/<q5+9Ch&HFm?L&/V:MGW9G^P!N<nIdd/H1K=/$icTThtcJ^Ypm6+lY&5:8T^T%6L$!YEK#ZX6
kYI?Z> EXTJl&DhGHA=>@Y5cM^weCQ1MH=c%6Xkqtk8dkQK6ldRSS\Lj=T/PMAkkeNk<<hnYSH=aAa5CM@*1hKH
kpNWe5 JiL*Jh6pPiPE1\YMBmeDK>/TF=4cV#XphJajtX%PCKe=X&C\qT&:PM<XFeua:AuPBnA/uNc4SmVQZNLF
1L&WFE %Qy69NKq/SJE4=kaAEtmt/Q59hD5LmP^Ww$IGj6i*y:bw4J:p5<jmmKTTI!yk<<LX\SMl!!1\H?#YYJy
QAV%Bw YpI<^8uNVidKRX<%5+>c*T8m4MpulApD^6kHI=/W=X\t:4<u=Gw\y<5E+QGce4n!ee=^%4TP\RPy<L!K
X@:LF: 5Y4Yb84G*E>84A*Ei=t^%C<>?@y^WG1Y<$Gu&X>18^:XL/bj6e^<!YXTMhD!ea@VFYjA$N#h?IY64cTF
LM*J?p BNb!K=tm*=HHH=+4P%tP/$8$8NB9NV8Lt+lpnu5*Ck^^uBLAk<kHQd9WTm&6P+PyGQRq%nR$$9\>y^k%
iGwku6 c\%K&6:8TGGTGa5eP8<4nJW<kHkXntIq8k^YnHy>#jcNH+49X6JI:t?n6lcSStMIwP$qTQ8pu6n*#&1H
K:SWW# Xww4dYNVlYMJHDedI$W<BehKhPLl:nHFTWd#I>H6Hu%lYY$6=q5+H8bY8JnEpT1Q9En*NYylcS?HdPMY
=Jn?dF EF%A@pNe^PjJji::9JZ?L:9X?u9XXSJJwN%dLbYJT>8Iw96E1q=a^pD=jVu*/X$umm&q$VX6Q%LWdc^9
^naTGt wyJAmSIln\I5a@!e%#amTnK$q/Fi>/yqQ^nbIptyZcNDHcT:QIkRmS+<dXJjBIZeReaQPK=mCHePiSY%
+BAi/$ +k84qhW%m$qnk696h\4QHcn=A8$EDuGVnBJ^!Tc#aiD>c&wJ8PyuVn!^$bBlw=AWPCe>8qHq8Xh&?buP
G=C@:i e?qTMD8B##%waqa&J+^nyY*Kmq8h><Q&np<J6G=$<tC/hS=^PRPw/WWjDCKYdThWXJECye1S9mDhSSZL
y^\#J5 W?JpTT8jw4bR+ZQN$\uR$%XkNRCk*+RS4am5F&pkJ$ahq/=/EdYkaK?EDk<\DP#k:yBS+H#hG:N+@<YN
jpu5XP &XEAu%/=RjjpW4>d#b6d\^eYtqG^4q#w&PA1pM!S!VjkiZqjFtatl=\%hBqCcWJ5aY=4h&ymiuR\L=ct
Zy>kuu MnthpypBAei>bKBNG*Ac5kunVCH4d:?wL8pAJNL>e%+?$^56PLDXXCjGkhXdD:5Rj8!eN!GHhl&4>mpw
T&=?W8 W9AK@=HMZ?KIE?$F?^e9H#ncCaPm$wFT5A5ykb5Cd$JeeqwJN5$?ckILiILhJPHWwH=LB+4#TyJnP=GW
!J:?mG Ckm&9d#lpC+uAcDlS\FdAJ>6R5?$XCA$Zjm4kw:FS%ue##/S4*^&hV/@uA1&CbVRqqTYyat&>ZqHhl5A
j\Y^XS umHk<YGCqVW%4ji/VR!I1QYnka>LAJ>jYaj<mt\$H!a>:%mYYl?5pK?Hh^8NccWAAJ>HPPRi4dhCIV$u
G6IK!Y %W?I*><kCKkq1ACjS1Z!%ZlEmmR%jlDcX+G/GPmIkCHjDRCk1%RS=bVY&<GwMwNjNEi<R8b8=>/eT6n>
=%+aC* 9MTFm=PZEattRYuyeAdLBHy!hlARAMK5Y^?1NYw<\ZGhKYmc=$wPQWb9y<D==+q&&k$GN$c&u4+@1Hw\
pQIGaD aQm+%?5Dbun&p8>dlQ4@+=W1&4$N8Qh$M5C#<kiaEHn5D<Zjc$ha6A1DwD$P>*:VQiJyN+i8K4SIGJjq
5XI58! JKW@+y1Q*8hIaXDenM1b4#*mwc!JT?yRucFihy?y^$5/1ClR8#FH#5PiEtMutDVBBITjF!J^kiZ==tWF
Te%VI+ QhVy4SMSTRpSh/&Xq%d%SI>81dMV\>X:</?bPWqLLNXJKt#&l*VJpWT1TkZGbnLm+GQ+=jka5lB\SK=!
EpYjP/ :JBZVjlhKHTi>uFLIk>WZSBM:hRdqeZ+HX=tH*Ek@aL!qheFG5j#9/PHN!qE#CF^YS1a9Fq^aN&qN!d%
P6&e^b AetAinhnKa?L5mJV>i^u6%Peb%bbYA?L+Im5?1YkmiZyA8N^pZy=qWX+X?Jm14ahqdM:8qk\c1uIJJ\L
-A=/Y5 00084e958b5001202b4 Page 322 of binaries2.zip
MqD<:V MnJ9W@aAB%Rljw&SiCchmpB4$?D:/aC+RkYbbXncLX%=he6m=:TuSyQG>$S%*V/n5jc8QDSbT*jLA?%u
5>cKce ?aWlq1@QaG8HuliCNFEZFac*:McIR\SeKkX8j#TXkZ!N6GA6#edP=ywjMP@+E41R8e:jEj/mR%BiE:Ip
BEGJdM Kt+%jPnRTW4EKQpbYRAqVmFw+@L=*>apR:*49NiB6D?Sk!jL/l$T=ldZaue*PN!cG&eX<DHuD@>a^P>w
N=YNJl L5IGuFiFbGHd\91%=a/iMkVqdGZSdCaMaRe9b5hu5P:+=L<Epu&bC&PYuSe:ADKRE+!?SGY?jwY>w<Vd
W>ZqXM CKC?Ebb=h*c$Qtm:?+#8M%X@?Bp%PRk%:!P&G*Cu9RMBH%^!YDjZ4ECWKAe5mTK%J9XqwcLtbb8q8Gtp
H!Vw\5 n@epCH6ZMSC=PCbe^YCYqu!<TN!Ku/k%*AFQ?FyLPXIw4ub:#M@SlVul$y@<T11FT*hynVQa>$@8IQqZ
YeGEbI 9T!*Pq#eVJLnp@V5<?FP&jlPW9C>5X8CPXLEPJ>@Y=i8X<*H5ZZ$y9PLt^t$LF^Wdn\PGlT9K&M59^6b
4t</Wl +M/lF$uQ>5:CF@=a8&Gp%LJAQ6=i^kyFV6PShVGaE&>/S$&m1VSP/?L:AcJ$PA5WQ\n!j+MdLnXESFut
Bk?K@i FY5nMb<kc+Z\?$ElKqRWB+ZwbYtYu%1JVmPhLCN1=!X/?t>51BhZhw!5t9R^Tmbcyaaj>c5KQKbHIdI=
c$mP1# p6YFFnEX\d%KWES4e>njG@NA9qSJ9uMYZ>5*D?aZCR@B$6Scl%1u^#pI=/a6q9#FecK4<qFQ+</b6@X%
<>+Thp Q!RImuBYNnQ!1J*VXtDqI4e/Jt<l@mFA$K:QPBDTReCwVk4ehBXZMaXX*MCB\hLBDLQ*^*<FL8KRS?lR
>X=jb@ CQd@WNH/P8jmC5H%?W^R\Fe+W%D<l^ECw4WAu$#^H%%Cyj:NI<%JI*b$%eYT&Y<&AJ>5/jy$9BBB$eu4
j<AqNF 8!6+1JI^n6RF*aG+Pqj!1:JeGuL#bQm:F<>RNNh!^?Qk<=Cih$iP*PJTSn9!8X?j=A+#bbY5/F+*1tCb
NWD1Dk \WJl!Gyp>XMFVm$BVyLSLDuh\4yQkck!n=^1VMjy4XRM9CL8jYV\9+L!Gk+5XmHbtR!q?nu#$:D^LLCH
Jy/>64 DFj+Cht=c+&qPb\9+dGuuPmIyt?%uVAI9:RZnc8<nub9BACkJZ*%lhT<6MN^%tXPH?8wK?BMFyEDPN&J
G<c^!H A@9PRV%ED+d#YVNhl&=5/<tFSt&9Madb%RKwd?Y5aA%V@VnSRc&8Vn<Gn:L#@K<md#Eq8biF5nKXPu@n
wS/wic iQd%eJ/41ZcYG&F4JRqAmB1B*Y\iJ&nEHq69&D>*=4&8#YAaFhXCX8H#B\Q@h!*jQEt>*nY!Xb4lnY5k
$<HC4N Zp>RDH4$I9BmanyYeGtp>jM!!==u?m5M^PN@kQ8l\n#KERSSCm%Ei<=%kuEQ=ADL5\h!XP4iqPYmRY=n
J>FDcY AX:1wRRT5R9llwn$CAkGbmIKNP4$4ubNlC6CC8b\L%JN^acu!$6Q>WqDm@Vd$Hua/GWeSGF6S*S=X9@6
lJh/j+ !\kmRIt4u\CeCD%65<n\KQKL$??!Rly&mwq5W>?N!Tl&F=a%BTRlnmXAGa$5+!D<kdyeCPtF!N&#iu$B
5J9QT/ AVj^BACGb>ua@<uW>\Ch!eSL*D$hu6#n\k1ljG$GSLR%wAPE<h!ytIj&+Y/<%NXa94bIyc1S/9LPj4\n
\Q6$hb Ll%u/&<#+@e&tT@aA6VW=p/R/+FuK+=ZmWbDeSX^H/$QQpVk1nF?<hjtKcP?1KBym4LHiHwI$:a*d:F5
:IP8aw V=M#@ZQ>kctT<RMCjq:I^%?FV\aeF!W?kV1l1PR%yK#^<ACk14Cb?^RMwn%Q=Tbl+%t=4CDVSaiXEkaS
!RRN^t Ak:mAJ+%#NPWJLHLECF>9JNR5E^5B%M$hdTbTa5e/$4FKh<S*I1C&+JLC&&SBTRwF9+9S8\Jh:nY:%8a
==t4F5 p&:n$e?P+DNicDZhhS<@F?6=eC8!1>?+IC5XL/VdAJ>ZDG%@KcSG\H1k=A/l@WL>uM99$6=?SPjW&LnS
LmX6pH ?SHSRGu9BHcB8p#Ywnm5Qw=4cRud*Kj$ieRBB6\lFCYL98d*!=Tw=MJW5%M4l++IRBnFt$aSp9!m=>ip
CCk5Su R<6McGD6<58>1\JWpMWMl6E8wAAE69tF?A=kpj<E\\dIQV>=QN8kI5KdRk**TR&FF?CP<G4/tuHN1RSL
GT^qCy ndWCI1w=luh!9^ytuq4Q<k?CEiIj^q%:cI>tJ+89nb?/4+/H<B></k=hd8:wbe@ZFBwM^L=tG/XqeweH
GMt\Dn XcdZBnJpLZAQ6@?Bu^?>M5!yK%HX&NbF$VQJMaaMbJLch!y:bumW8#NkVMM%mS15bW*t>tHa!*cFjPGQ
8$n!RY G^CT:\RcnjFQ\S4Im5VJZMG%?ul4yVAD/@j<@LKJc8bWWPYRFbZhlZD:T4a<N:%iLWEJ4!#F4$8B6LlS
GckDHw j6D%p=nEL9!Zl@aitN&PQAS?p9<#5FL=cBw+P^Ia8NJW?RSeI9y#I<QyuM$X>R+T=T\bTD%&bnRHeNjH
adCuTI @8QBm4S#%nmA/+RSMJ/ImZTK9n/Q&cy<Ht4Ekt1>beDaWhQEGnwJn$nHFLj@VHYWA%@V+Ndj@&PQn<ZE
yaWJ<1 8IDG<ZF%eFk^+p=DR#!AndenJ1m=TQWauywpDQ<\6<\tla\BdqPTVueRI#Pt<KLKZ<M\ilaLp?$1pqV6
&RuFD! FSql<*n&V<Y+eYTP8/jV@ZDLP#^5%eGDRIYQ9I*hmlbV6ViwXiwN89!?4/a:@45q*wWlM9H1XRnaNk9!
MBM#D* R\1+*85C/!keIc=q\BtKIN/&?S8cLyTI#94F9AwtnCSEBPd5YC/R%aIk:+GI+6aBT%FYC%Q=6MqDXiw!
CjP!kb a<aQnhjV4PQ11hZm#*eeVZbm!&y+\ZlG%:1!q5F!\S$%qGG15+%&y6d\P>wl%lHMMuYtAF><h$MCPq=c
T!8FXj /uMFXYN@NP6ny/iJJ@Ppq?Hd*w>6RGRb=APnwN>4X^%nmiBi$:kpG=u9:uePqYDtQbmc:Z!6ppk^e8BY
6YS9LD SZP!16F%H*RYEj*&V8muRnFEj$&q=iL^WytPh^cCi:?:$nXI&$VpQd8%+bjTWVVAVyItPcT\ASASAp!P
nV@%6/ @E9becK#LG!V\p*n5/i@BN9kYj8%6Pa<TG@b1AC$P=eqlht9^1RwwqWL9WLWYEkBjc#D+S!T8*D=#%h/
kyAF^y PM$9hSaG!eEaCM&T5a&CLF9Q<RHuw#Z\M?Q8&e:/lbj5BnXY%SB=pk6@!P!=Eb5wIp8MpCa=TE#cw66n
4c94yT !<Sc\h9?j/yuLh/YY9EFI@!PC?y<qRVYLT!hVymEl9S=V8l5SlwK%Lj9X\FI=>CyYI?ibNia\uel>Ta\
@uhWZl C4SiWh+@k:yptKVd4qCGw%IZRDXTC$Zh9Ty!W\K+pYA\h5=kc#Q$Vl61n1n>a#T<q#ZIG:y*:5mdNXm@
>Fy>&J nJVXGH6qRtb@i1^y+paCh&LZ&d/t%I/%6nml4Ra@NKSd?R6cPGHlV\nd=JM5WZKuWq@K1>B6Y4#kbKF#
G@KAiA C?Q!\ac6aB<M%!R*yjihY@P8dDQ<$WuTM%WC<q!ietiR*u?qq+jEY@!N8N4^5EFwXq\w$I5$&aSt5V6I
%<De^a >>\jk/JFaTKFliu:h\AtZyWQ!nM?8ZG@wjtHQ>6PJ6eSt&Fd#>Fin6#W$dd5pbjiM4dE*Xm4Y+R/+n?&
n6VmS9 yhEV^RISebHNQD#uNZ<VI5Rttu>$GYKt/%DT\auNndTkw&FbVW+@^19G!+j^#pAHi:a?$J*eN$1cpiya
Vpn#bp #kBbb=1@jV/mbw!+t*#i:m@pAM>S=wDHpDmaAeRm15JYQEZBj$cwPlPS^eXZ&&EHy$%uLKZcD1Vh1W+I
^VN+?6 #kNjWnIa$ip^tlnaN?uLeQ\S\?&%/\5y&J!Aq^6j%Z9TZHnS#Bpn?\ki4Qm&$4Y:IiCKFGk%^jln/Fj$
h>ReRV tIccZ&wNBZH1j:cAL19K!*Z!Z@:\RSBR%c=6q4#y%^!jQAP>jjR1<P%=yh?Y!YyN5=5bl6y5P+=CI\1V
iH/4t8 EtB9FjVyHWS^%CXtVX%bhSYlEL>jB4%L4BqCeqAD<?R8L/bL*!4%LkaG5*<ZdTkp9ayk+ktkWPZ/1qWW
I&>Y@I K>4!1Y86lk9ZTdJnbDyweC>yt+Cu=$:5+>1HFFy1iw%hKdCRG<NLw+8E8F9H6A9T<yYZJTWZa>H6qLbE
=kLcM/ c/^SmH1C=>j%=CYqdX>REAGGt#1^1!4c*yhVt/8b#Cj6ChHVYTTABKB>j>1<dL<e^%EWJat:PcmmX1nP
5%9$Wk +\Ck%%JR^#JNnHcH/4K@uJ8>^AnQh^TSHpLV4e=\!pk8MG<:FA5Z5?IMN+L/<P:9Ne@NbR&5FN$a#1Ay
5+V<eE d96!EPiJbA=LGLh<FPGZVA<?c+nabk>Ku^$+PMkE/<CNF4?4^ul#\&SEukiHqhTk9kpTXTqR!L9PpWm+
Nq+dk4 nI*@&hE<CEy#\DLH::$RXyp?MPi&ZtR#lKZet$PVi::5\eTcdcmXFRXM@llBupCPI5ayVNt8:q?iJ&:6
ltCNR> %+bP!Ilhj/FW+JHpM9E!C<6NINKX?iHL&Z/cbdp@<*\6WY8%9hq#!K<<FGJ9&lY**huTFlPJa@X=:e>a
AT4:uT dII\TE5LYH>N>6mCIkLd/@yX:=MdFi*dw8/@mH4n&8ALyWwwED=\bWFceGN58M=cM\^KY%%dSEhBPQCZ
$EQLWd bZt?11Zl!Pwp1cwbN5S+i$Yy?W>d6e4FLKRL^Y+q+&$Yqme@54T/$Ri*^VF&KQN#c1/6m/u/Z8&WN8=m
%Z4#Ny 5Q!JyqyRQ+4w*uX+99p:^$/i\JW$C+ZBT8DK%tHPaM6&!:Du5A$quL$Si1\$4Ae%P:@HLeJGnaCF&EuL
iPC<e4 KZIBy8i$M:t\N6Lw:Qb4=DiZ5Bd@b\8YLMY=GACMaCwyIp68ZTdZFdFmp:6LBP\4HE<#=Cw\LDk*b+B:
S>6*F# ^NFEcPjAAt6w#5$YNG$!WM$j/J\$FY<&4jTb8I!C\PFHPAq<HDNJ&@/uAyN>6V#:+$d<:ji#%:?bntE^
^AJ<JA bdA8\kYhJuH^^Xql=JYu1&yhN&Lp%wkG+G&ck$j&GQE#5yK*5ZCH\HhWaS$$pYbXW5#IV886HKZhZQil
w5C\a+ AQb?=<=LL9J=naAePR>QhDhm^SHI/ZLi+MS1eLmcRR8EM&?4K/l8yXV:#I/MyVS/kS4j=MHiyIy=pSiM
GXD*Nu clQqk/==J@%wi9SDF8dk@*kNu=65+?VX?CeDwe$M/TM=>i<$Dt/LEAC>XQI<MZlShc#I:!FwpNRGPFVc
6Z5Ht< NiFQqK?C8*B4$*V9!+pB#Gb%6<*Rm/@tW5&tePWR8M+WaZN6WI<:S6K%IYRWeHuD%9ZuL!MP*#1byi=$
^>X8lL 61Skat$Mej1&#c=8llXBTw&$$Zq8JX8e+wWAc#E\:L#@ZV$cGtPa9#qp9dIHjdwqX^&C!TB%iR^YPVM@
/!Pd>e kH!ikiGLkDqqj<+J^^bVeZR4=DS*TGXIEyMHe5XX#DCDR:SCl*EEZ?yYppQG/MPKH!WkAi:X&tE&bG=?
yCVQdh u:E=<S?\YaR8TT/9<jkn%hMMX6TL$imMjQ#LuuDPj%Ql+YGRZq8?DjtnHd#LF<!&6Ah1AjD1<aBVt<qI
kDKCMF h5%K%%Wwqj$QH?@LNnlQY8j^wbMyG<8HM1i6T$pJn\GIK:lcnw?lpRH<$qyjP1eRm9K@jWu&R41=t@9q
^+=L*+ VPXp9Sc^dL9cE!T8*ESdNM4BFJFS6W%^^@9C+#@?jPcdX:%DIwNC^a^RQR\W:pI8y4qeYVYy8c=MBa^9
bmlP4? h+=J#&/*AYuV*Wq/WEb:<dQ%LkI8lQ\P&1KplFeyVQq/j*pV8k@pq*5Rc*AM&jyP%pD<1^Sek>$8e$u!
lP=+c5 P+!i1q#%NJY9%S?KFu&QIVdqwZyTAC?YjY=ha*/WPtMVdhhYTe?4Fea=QNGAnlXZ8ZP9Rbb?FnHS/:%K
-A=1@m 0006d4a2498001202b4 Page 323 of binaries2.zip
Bwd*ni phemJyp@5n9#&hIe1VMMDEFMJ/Pt&%NR586wQ1QA>^?hE%NF<#<dp%Fm6+E58W5CI<we>CncHS9X#diT
SNbqeR 1C!R<ySVac16uTaHm1cc1nqmmZM!8YbmFmN^w&LMJmZ<hlt:?468C+I!iK:Mn9dDIV!H!u<hXFiGS1VD
%S&%dM B+5/94N6TK/41bVC+R+N#1NVEcZ5NmkVhB6jFnNy:pMN1maM:Vk8lQqk6AE>N&CFkP#LXykT:GN?e+$M
R/CSlu e9FH>^5JCTJ:kXqlTyq<?$FPTkaDtJWXwZMeQqK&iCjqSC#MWXS+k&Qa9TW*$DP>G1qKd*=M4FIiYS=l
59GXCM ECQn5n=n9t%L6TeDKp#q#$Q4p!wC<edV*TV!<RCd6?dbtm@BpR^?djW$1aeWMDy91q1j6@HCyI:V?IMm
Di<49P V#bMNDdGh6$cdjHu*a=YEi#&djw@j*\=IGhZyjtERjGhiew=!ua1>jp1^CS6i/AtcCEei^bFwqd#$pET
E<R5Xn ^tQ<nJuj&MRHjiVN>:\bu<S5aW4=j$lkEh4SieV^iP5NQ8tVa>T8<d?Nca#*e=\tVhA8DN=6&:a^dh8&
4BADF@ dh8i6t*d648udh8&y?*iih:#uh&#i@:b1M1wTFSpSPcX?a8A$m@yK\Zp>@9:p!A=cLy6lA6wm>1p>d5B
BmeXk? <kRJ:pTj$=uePmaV94e#<:8Sj9Ln&S1y#/=Qj4b8=5qj4^4%y?S</M\nWu*<LuNj4CZ<yu:T>CPyTm5n
ZVA*+p ejP6eW<hNMb4HFV>eEbQP!Iin!Yq<LCB^T$/&MM>i#Yl+wYc+9Ey&bI4TDcLXb=G8NW1cNA*?NWuqY\Y
hqVuk^ E9:!ZpEVh#hA+q@XeW:ei/uXlY=k\+D\R:E4u5IQ\/p:t/1K#mnJe:h=%:VSmIcI$puI/5Dl+C>Wpw&B
/<jKN6 JcSBeFE%C??GDuwLw/lkDBi/lm^51Et1V#II*mNaQu@<C5hYb488L1:l^pJGiB64ZM\ZIXZij^*pBKw4
6iR9YV I89w!+!lGWWLY=R4@:/BJA@JuJT==ZJl=##8DiVjcC8F=qRJhT+iAN^j55u\@QBbVX<6HW>T/&k#HaMC
@\$a&T lklVM=:!n@yDB=pp&PJ&T%6tcqH9G6d9a9DlpT=l8R@AjP/p/:Z#lSF5hl+5cuGw*!kF+qdIFi?+kZuC
!RqZu& EQl<$DYlYE&=w9X!F/1Pnp#!<FGq+>4Cq4b1:XB!ZnJd+HLt<MQb<nKkkMS??/wXwLHyQMI&N4JeP<Ay
1c5i!X 8I5^$6:AFGw*&:5e6!JwPil:^XheS\K@4:mnnZmcL@ty:LY#:LXjT<hT688adTlAqwY\GEYF&+HSk*M4
t/8h6i :T$E^PuQ?CNC8>5>Fw5C<PS@n$R9:M$HCaDlim8F<KWwiT@CS8i1Ph/KFZSa<@u:8ckmZA9?AHl?@:&k
QBw/*d dMLLaJK/<8VQ4+lQYu%V>SnqYR+GcYFEl9aA#8T5c5%$Hb/q#qK8QiEk?Qw>EB!5&9haBkySZ:YK44Bi
W!CD11 c&IY@$:JWh&Xw<WS8*d6D>HpLC@caRYZbA6T@%uiN!6XAq@h^J>&lC#Hh&8%FE8c!pc5C55jnQRqWXwN
>I6YXy #$c+?XnM!/%<LJR?JhiBNa9H/!mNc!ae:CC9+<Kjkw+Y4lu??FpSR\L@A!lS^hy\9ABVM=!l4Ej59wiQ
/WH6Ry 6ia/n8w\P<y>KmBi%nVGPqJRw5!phk8Cua6&XQ+qFRMtXbk@uj4++i#5qkCRp=e=cHQqXhwWdFm4^DhC
iXP^J* +H9>ApAZFFDepn18l9\A?FMMQN1tb>/a?M#\J\M>Q86@a^hj/SDuu4n8l6@cu$=K?56BQC%HYbk6@Za@
Z$/I=D #5B<yPa9MdN<N$q4R^KE%^Ln>cXbb>GF*yS1%mnWcZMnTdS5eT:R^PZlR?&N*D\KD#We=@XTwbDLuEIP
#b=/Q6 @M*1be#^/X?u\Pm5il\PL*Ey8+k%8N/p9#u=$bQtALhRkIu!!\%p!j%>McRlFanFa!I9\:Q@=atk:qCZ
Pu#Jq9 >DtBdpC?*p=+69%YBZ9=/tpp&KVjIT6MBkLCEw<<y>1W%e!e6#<Ydn?Ca/Lll98ppc^VPqB84m:ZeY/=
=5VKTe JcLAik#nS8!w#A=!lka$!W+%i!>J5lFX:ZlSWbwA1<J#FQY/K$S$THFVqE?W?kmcKmTKt8wkSI>cSE@M
VuWV%B %\1T9b5S!:IE+ukmXq=\Y91RF=5:l4FE>G*C5^IB^AHE#iQY*:jl1b\qA=SLh!tc\d*!=4%K$NZn!bbQ
=c/>^i A?@B%Wy1MmHd!@ZLY4Z?$H64/NZV1FGTdKu1a+/6@D#k5W=WhY^QHYN9#DVR?<\Ic&&mE1wQyE:@acQ#
m^eHJS HQpd5*85>u1GQ:lQw4Kwpw8N\8aRXAXMEA9Qm5b/@aVMDqV\#*t8+@9mDaYG@QV>!&MXq6kBe>C\5d=8
eeRy<@ YE@IK#Caeb!V?NP\NjiF84enjQVaKQ>El/<?Y<pL$<TMk!+WEBAE^hQlaq$ye<4RE:EqpdcpV46KTu%N
e+e=ST 4ARt%4j^\?NyjE?HhqWS48cdNnS@J+VkW+*$^&ntlud1G#4HcGybhKIDPJ>@*pCFSc5anuTPtJQK%Tc?
+ewpPm QNu5:%PqqDE9nMIjkE4HDblie>#WRdpA9%QQc+$64ith4=ZcESMu!@%$QGX6DKGaVn^q%VFF?uGKZ\6^
Ih?9%N 1Tl$i+YKA:WT+b<!4m!eKp&GR6W*Hh#HYmu91B^?Fi5&M$%$u+u^8WA@?$ZY=VY^S1n=YEaWyBt8/N<p
n!PwlC tq\lab5&6<B^&X^Z!9+RRpNj+HLWZVnKZN6eE$<5d#h$pJ1qRMbt8QB<L*9PGm<deFP6K^XEthdVw#Py
Ipci4I B&b8FA/EbXMAVFDnZR=iejZ>CtSha8DmbMIRmnqpGl51WMl\@FP6SVX/1SQ<CEMi^BNQGJ5?lcGp^i\p
=P@$cI %W>JG6c9d8p?n6p>t9#$1#ik!^q==X8hQ=FpGnhGHV#W@u#B!5bm?8E8t+8GWCuF1Yd&8\me4TMh!9eA
twqBi/ ^#qEJ8=Ed/BbHP9b=tcH=kX64n8!<j=DD44bjd$\c@cNGqTPYX##EwWqbA:WBlCPR1%Ca@TeGdXXTbR?
+@n!c^ p!=D6JIt9PQ&LehS@a1Ven$h85<Ii@5YY?Mp\9KByDpDd*l?:DC%uw/iLt>:#tm4Q<Vt$FAW16h&mD1i
nml5Y% PL>hWC#i*:>hk>d58LdY$X<BRQ+RcN/!RkSw8KT!\BKMmb!nhX=hB9:TpuR!P!NV%9jR%BK4S/l1yiLE
1JWHD? CB\nXwKKhFK<%FAh#uKtGFdSDtVK?H+>@Dw1:DdEuS%Gj:4enXAhyPLF:$pim1Qn?!wIk?J>1ipWm^PK
WA>4R& El!aJP!FE>/jC:X%XyJYS84</<m<winKQ8a:ZI><X!kY6>lQhd8h54%YM%+he^GRTdARm^8c1WGPjkAi
%B8Faq KAuZ&i1F+6TF>pdAAiP5^Zyl158B%#j=8iTlII^P:IkVnG<Jijy>1\RHZ#a/EuRm5NQbpm%?%*b/HyPT
F!qJ1R Vhpnhn:d<RL<TtK@wWiZ8yYLJuEh^^LBqiV8MSJ@+:+9e#i#R6pduaahb#TZIJi8!KET*D^ZV:6h&wkp
p!8C%+ ^hp5V>yKRhHB>BMcj5>cujmI8*hMkQl#LdZqd?6&WRSNY%m1ZVyTC8YHKYjH=6Ck+RqZD@q?HuuL1K99
HL:y<A h/uB4?L\8^$i<YZj<<?YtKXMZZDVbFbb\=1\YPRHSAjMu1yZa=#\c<XbnFAQl:@F1Mb/b@/NT!yBjXZX
8!G<D< !M1YiJ1YCqalZB4QDJbpeVXW+kRjuXueepWDNicwan#pYT+&u#b*EZcmy!Ymla\u5bPWkqmQFXhm4G*e
p^=DA1 &djLn%YBc%nmWMMpSMwXN>cyLWL!hnJKKQ16+MG9hibTjlIu&t\:Na6LR8$=h8H+tmRWJVj1!qp^e8ta
C!XXWE qn1KnBbm1n/n8y4\85K/uV%CQyKdkH/^D94<YN8:e+I8P\SiW1+4>lihquGuyc9%=KI+Na#Ed61K\I@l
iH+JFD T\B#lCbn^a\yDbD>S@tMSq%q/j+Y%VlSZtwpE>j@AXmR^HGGJqj8bqm#9HXmR!=%I/XjEu=bB6*$M5:1
W8\a5D y8akewe5qlVT*+D!Y8ZK%6cYcNM8H>lJ8+QX*8NTt@K?cDb:K+Q1jiub@KVT#%#Qcn4K=:Fch9y%hw^@
bQp6aX JNLE>l/cck$it#qQ1\&^Y9=cJR/HlN::/CD41<HN*ScJ?JtDNE=1MJQ!QBc/8SPQtq=Y:D$uG/=?m+TD
:j@*?@ Y+yw1?<hpe8QhW#c&dWC4&q1F6&^iR@a%+Gn4FqQKFR\qwG9iP=m$:k$Xh*X<$@:ddPljhWwcdRAEl>Q
%Hb1uK >?iRG<Wm#?Qaab$Cq\YKWeCcZ<1^Yq1m6pVnKI$\p+54@!uJ&q>h*dmaHS/aVWQm9MQk9Y@^8qM=X8WF
@:uH&4 5ajJdX=Lt41l<%<5j?qQhKwIDwVnFn119pkWE1VIl44pc<G5CDDPdmJqB$epn4ZaJ9J<wPP?pZ6k@iHP
hE*RXM b<9mj\Cj5lbd?5wI=t4<yq?ndD\ehAGJ\l$^VLc$+=mai:pHLc!@pM>nCP>lp!w8FCFH9=+m?*9@wk*N
/B/QCZ J\i!BED&<&w@ZH>:X8<T5/yaT=hE5y@I<m:54P\9%bGy*DF99u@#QYyeZtMHh=p:#</&jhL\Ciu#jWqi
Tqdty> YFFlMFdFnyS6eGh&+:HnMNeG98<eP<NY?1wZECm1&dJck!ch>9n#mlQWPG14Jy6nQbZH*e^\1*14ViH4
y#4D:L w>W<<lJ<I%@DE!9Ylc45ZWi5?aFTkWe?SChNw@bWET\bdmjS?@SBuqyMm:wTEXD!MJ/WCYcFw8qhP^L:
T4F%NR i<:KQeWyL@&Gwh9$S+P\c!FdJKDnZXM&^KXa!HGPHtBiQuhq@!AL=aRkcYQF=1b<p!TIpXBJJaV>1\l$
KQhPn$ 9<DCG>=QiHlZ?qdGY/+1=!Vuq&!n%$F^X$wH#6N:il+b9S@G?Yq=qiQA4&Y*\\EiTGdajqAw&ItLuR\Q
qypNZw J$4\*tmbEe6LtbS!E6:H!jha#WSJWcBN/q/aLe:L@FTaMjY:qR1Hji>9Pw/!LGdaKuNp4Qk!ap/Acb/t
SK?E&\ ^#NFd<#1dmakQ?ad>\Ai8kH&N55J6ee1#5YbWR9E#HicPdYb#/kqF?X*T9^RhcJQt^IKID?I5@yJ/HP*
^MqcaW b914c4t>Peb!$u<VV6nC$M:EpFDe!h:iX6<e9\mR=@eq1RHCP&Bpi=\$jJT8NqYe%+uq+M*>=ZcHLCC4
JIa@Sp 9B1hH5iABQSm5EiK*hiutW1qYRDL*+d4<KlewF<dcaK@FWZ5B=balQZnZC54=E^$t#BuIVQTijJuNj?w
k<Ge%n YZRRK/ci68=J&QH=c=qtPM#4blmNMT5#RPPDJjYK+//:#<p4YjlI?F!1F&VaXi!ZNFEN!cmH#@tJ$^4<
6&nwt@ t\ke%b?A1Cb!:%?SM$AD?@Ql!/?Y%WLuw+X:h^!6n*MD@uEmSW9%c=bB>aN%C&eLhpuTGTT#G^H/9c>m
@:jwCm H9EH>+jZ^F#9BtqtCL$h:bn?@Ct6kX:QLJ?!LFkJk$^kYZNV4y\lpk\5VpZ&nn@*\&K+G/\1IHI%^H!&
1jP=#\ C&F9>PAMcDBPj9L^+PwwS9lqGG@Tj+phAuA*u5<1:/\\p&bM$n11+LB<C\^BGY4?SymRV5NimaYYG^aR
W6$nd* yLMbKmT@im$nRampkQ=%T4j8ldVJ^bGqku8\AtSBwC:6<?%JB^HaFwnKRpClebB*&NSc:QTJFb&@n+Nq
9?PWhD =6KPc1:u\#9kG!P<6lIFN:RH96P?m^DB$:=*Pj@X:JV#utYX&+<!j^/D\Mwt+L@P+PutA5aKPmmbtt#A
iNByL= *I$BtPQJZu%b>!#^LCq5D!YA9:B@:9StT4Yh@DKPD4&1aPaVbu!p@V^CyiK%:^<Z%!w6dAbLlJMAKN<X
dW\pSb c&Fq<nL!kK5+dubu/uedLmyXkH!#GRL61iS18$<ncjY>Ca%M&THH*=q&R=?SYH\h5uR!w&yMQH%4/nMS
-AZWSI 0003fb2627a001202b4 Page 324 of binaries2.zip
%lA9pA C6BNB=MYybhBnK:i/epudB+p!>j%VDFHtc<E^teP#*:iZpR=l&Zm&eZjL^%en?pS\Me1k6ijD+wd<&GH
t@diDm VPWH/*=GBhR=hRDL#HFA9m\Nh=E5j$nMMN*DPaH<KPhF=C\45wKKMC%6?uh\LVh9S46YhP><GIH/Qp$d
+PTZPM Xm9D5TNc*kQl<%J54ND4SSMRHhnGk$H4WR##?B1q4V/Be&DNW@4F6?>hE*mYAtEMCSJ$QkTHDP+6%eWX
9u?N/+ lHIPGRy:NZq%+*RN=EPiWBWdc4\S/$S/a@m*8Lm6?a#Iq@S!1eky8%p/Y>w/&Nl:tywTCy5/8XmcYSyd
#+KAYe :K#5NYlLB5dZ#dm*jDDd<ti=MllGKAd45k+^KEI/jGW/!<Q<KhAc=^Z8wc?+wq*R59AEL&mH&TaTZ%4n
BTEhnI *%u/:NnFpauQT1IL@XYkEj%yhC<!9Sw&N#iNKPl+9?8Mm51keWYc6pD#?Gdlp+FFJB?&DuLPC#@qZHD>
IB$dY> F9K<BP$Jp=4GX/I5THFaKNcaF^^Z<Z#BqpHpkFL:yQ:TlG#n\QmYiIiW1:SInZllmS^JRXVl65i!+LX&
\=aSV5 @u6\iJZ4K#<laCQ!KnW@4d&T8KJn6GE4%88:aAVX=SHV$/dhTHkeA#qIKi5!&t&*B#dJH:d+dehLdSD6
?FB1u9 :jXb%imZpP*PiThCSMa9FM:>$:#&Z!4pJXEEwICLXWQNnPZ6^pbXlY+BPIy!%1!j!HQ?y!/8cdk4E<Fk
tk:Vl* J5W#X%?EQIyL6tR*PqWwu9H^pwE@p#SKChtSkqGYAq4#$B+4T\RNeNmujpVK=hhp9j8RjSh*#<NdupSi
LXVVP1 NCEHteIenbkRHV<9NuKmp*VlkI5^nTC</dFJG:*%4KaPYc\K\pyVbZ=66t1Kjt?Tn\YFeY4iYFQqRNCc
aBPqjP LBTJV8KD<J\BN4iaZ@MYE1Nnqk56E+dB/\:QqjeHZcm/H*J#6qbB=l5&B</6/\yhIlKYC9SMA6Y1XnN@
:PRjbt Zl*DBVa/eDD&a*nnK@i@V@jaSBZd9m$de/IuhRMuIE#&n<bQ@^BpmPQC5+SQK5LCZy^dFBaLT5wX=+MY
>E1bZK p$KH*6@k$Jnui1IlkW8Th+<P+dN*@epydEmw8i:9w^qpj%YAKJG9YNjGqZiHNi<>BY:/5$<@N=Y4\ZEd
8#&>E5 N>Mhet!=%l&6t=Sjb5A:5K9W&QpDWHVG#d8yb:XRD^4pcZ&AIpyIYDyC+/kV8J8N:Z:S=qZ^9*JIewG+
BM&+h$ qB4p#1VEna=$BWcP%GIWGCyMnRSRD6PlRpyb%+9Rn\KJTbc6el@GTH@\D#bY5yG%<&t>Q/\?=5QDDQeT
TPEPAH ytp8/TwJQ&9EpmnPjc#!wdJL=Y+R5AuuYt66T5e1B*IYnJNI>E<cI^un9T?XLk@e/wt/&P/94RZGmm?y
11a5F^ yneLAwMbcck<bFL@1lm>IuTm/mAM!qcZ>m!tBQLHj$y^NqCWjC\6#YA1un@*k%/B4!15uPmd6d>u=$qa
%alXlC Y^ZXE>@:WnnZYnLQw:jjH8NQ1NNFuR1M%KIEwm\b%1LMB&:Qm/nu6p^NC4kjyaJ:ncXy4bW?EAu\aT6Z
dYLAhd =n:S<&WW\He5jcDuXqe$1@R*L*F/4nuT#uBMNR=BK:L%LV?p5S8Cj!%Q:PK1GBjX8CSPaEDkV=F+AMj>
<J*Y1L AXBQL>Ju:mNpltm+De6/P>Eh\ncp&R51Gu6Z/Wku%t*W6^A%54$4q@^bPmWh6FD%NqEq+XqpFuRK$amq
c:mLbQ Kt?y!C:NDbEG5/#dn?Z9ZcDW4:ZiWpHMS^qDP@nG*eTI6BEye1w?JHqVd#F1+SlIBcK!KA\Ae>yFBM+B
wjnIlm kAM?*\lTZFXuZ&h&b?iBe*QNEA+kC%L\b4tcY5XclB!pckXiK9Ld@llXt^4<GR+h+d#mT!FLFtKF!5$&
a@hPRA c:uiH>@DunnXMZTJXJRqbcJtNptKPGYTW<B%9D>h!i<T?@AcK1LqJI<RHuayFiZ&RwcRE16AM\%T6ARy
5F+BcG 4nu?AiBDk9yTltJp\Pn+/<4DcV9%>ZNkaXcmWAICl4tV^yetF+qE@>LciSElnK:$lHbZDwA<n?aA$d$k
em:5GB HPyXFpE#4/Jbb4ikXcM&K/1awC1KA5nw!FAl6WI9XuA&*h6!&MY?SGWqBYcbiq1$<jSP=1E&ed9Nc^Fa
1%\X$c *dkV:DJ+euiiKKLwQ8MR*+yKlk#@IQX@y!lC5&nc>&n&#HR/#hW8nNQNt&J!N$1W!T%$ihapR9bQ5^LG
D!T&+Z t$VA:<wwV$!yyGTELX8\NDnBQKZmBS5e^utXPDlwJC$Wl!lmuHAc164yyQRhNjSXwJaWLHtwC$X9CJjQ
81?>8@ DGiM8<dl88/6c1yY$*&Qq&%8Wm:L4/Ib6amn&EbJT+w!\wBaFJijhkT88<8#PQ/11peFwnN<#Sy!6GAL
j18:+Q <Eh\yEA1i?JdSu8Jjq#DHLdAj@adl#^<1PQ:T@i%WqVJ5/1auk+AFZ?FKGE6#\&W4Nt>cCPZ:9AbKKNt
yBenu4 >PhLecZaS6?#=lh9b1e>IMyRhRi:/ZMh%98k1jmF@ZVSp9*CbbAyP8u1mRm<lpa:u:=ISeT*LIeFmdtq
Tj$H%6 94c+>Ze!W@RB/c*5bL\!Tc+9A@WHWHZpc!Yt=4cP!jNT^jb8LZiAGJIM4L>tFNL^T:u8:nd1&nXa\+\a
Q<&<kE J==Vnaj^8Vc&t#XItNKWVAN@P<bLLPYR^4TyVXcK15DY*@PaKi=Ymw+dV<*TYYFVX*6HnK\%k%^+G+iX
b*CAQK DnS&GnW\E4Bu58\nZ5$@TZ$P1Vn?*eJdF1^&I5?5$JF=*HXnHLuBFy=/GZJWb5E8WLPLNm6Y%&!L5%\&
8eaj?C qmVtt^6ucSqip/?m8BR\@tph@je4dQ*J+qS%RBd#hM9lh+tZmtQP*$/1SNc6=:Cy\+<iPNimqF#d$l%y
FW/!JN W*je8&\i&\:j4/4F1!5pDdK9Q#i/4:+>Yi*E*dMTVcEjT4E4tq15Q9+VZQkDuh9W#\@>1#cJRd#b*jX+
i4%uM$ #t6^\wwWcDVMqhDKaX&h4LW<JI=h%BEWuZq@K<5GXn%H%#P:<QlXY=b5pT?&WtP?^Auj5X6PlT@+5liQ
lP5ZjM ^Q^YyMXmlYaHpJ<!Wlt*+GZ%ilyd=l?>M+^pdKIVS/9\q=9e!:Y%BBbqhuT5q?QRB1$*XwwPEG&cQ!TS
%D?*LL F^&&NA#?4M+y9BtyeJ=<^tL9Ha>+JW%:8aeR^%+P19&XC%mFBSltP?9RF^Vm<QLct/dBt#P<ia^^ZAnY
KhD9=: mh%N<itHZRue+6>PLY8NSTa1bXqM6><NKW+6cE4VbW?PYYkD>SaY/t44L+S@cIu@l4/Vm1uV>YtA4R=&
l^pK85 8hV5LGujc5h@mlEj^#he%Lq9AM</<GXYMpTiMJ!pEq9MyCG@FY@6Mc4DlI5P%aQp%/JB1CbSF>#ceH6#
t@I/6! ZF9?+uRG=+Y16Q>VG6jN?/D#Kt/X!n=W%Xi9n1!Cw!aY#^Y1nmQBC%u%!^<4VqABnJDiK$t9+mS>XR>^
Lt%1\Y pTi44dqX+<bMy!y8**B56I^RXWVmTbhST\VLhbD1cnCRu?8!ac^Ym?WD9<YV>wVeI?^5<KH@$#wL6R=%
\^VBn% =i^<wE9m%LaF/yPmKu\=W=9K#^n4<ja%<ydYqabZdpy*a\Kd@+AmMG#8Zb*paJ6F^*LpHPKYpJQ95Mjp
6RL@yk XY@t=ua&ZEeT4nmj6MB4jBh@X+6KVY<&I+i%9PKmnT%L\S:^pu/m1=wPukVW+jdCY5myhYYcCG8NPW==
>aE&?D </um?t1@KeR\pFXE5R<N4i?lnw=PZD#?Sl>6=MJdK/4BVTEpkj6MdSXdBh%>@m$KjhWG%@R>d!q#KZTD
Vn!?/\ Y>4CIMS6FD6E<Xyy/k@J+5AJGh@!Jd9#lNRAFi$\=CGc&Ee!+Ep^545IA?4GWdX8Dmn*CQ5ELt98t=nJ
k@\kjS YQ/^?uiV1D#&>>Y<u8!5%ND$BQkuuN/mi6y#Jj>k\BnH6N:mJ4JE:*I4lqV=!J?:hXQ%KXi=Ip/YeVFV
<V:quF #P<undkZlic!P5Gue5eHPt?IhL/PQMR1We1iGKiX88/AV\pQ\#juX*XbVc*AK4t?/FBMpyYP9:>T1h/!
@XCRnI >yiQ=yP1WZ&S4\QAbEmDLqX=tK*1#==9^Kj/i9&c/*B!\N<H1%QQ=851hE#qn#<4h>J:>VJ55VCHyEj*
meGhLp >X^/%nniemQhSSjkHXX6EQK<YXhX+aun#54!X9qVJD$=I/i*PbM@\*p%:1mi+/M5mIQ#>JYX<hCGu6#a
+D=u%n <b\\9SWB&*c<FXj<KcCb#^hV@6kajjlFK#*Fut#$%%<ZiX=FQ89yFIY+K%Gj6RkFcGqP:91MX$+$cSk$
?KRcjS !t*PbZA+M<hCt?=ii+yTp@EYhbTQCNVE^PB%\WRw/&>+E&^BTFhECSjjFyFPi4DKpJ66F\+\wHW/lEG5
^Wu$e8 P5b@hQC^tE@RCWNhdXH>^/dRbINW=BFFR=5?^iDciFWDALuptGTHpj1E*d*1$*>>nGIWY^R5LG$5HRnq
S=^mPj DF$5HMKK\+?M=4k9WiHS=*D16LI5DHDAQ*wTh>G^ZXkc^J%eI?i4+H@#>FJWWkQ!HBjVMLM*\%81/h?P
ZTF^9l +LSic+k4L:uXV+6MMWa\WWDl1%XQ?!HTmK/h>YQujFF=qI^8cWpV*R8My%9mRET5AdqWDMdJ>ZcZ6#8u
T+Aatw $WPLG+tkT@Y=4<J4Ku>CZwnDlAcIuZ=NwY=VJtT:Ayu#R4Vj?:nG*SQnumyJCPwd8F9VK>IJeRkBiBQR
Cm%Kww HNjHub<?mR?u::ahGL%M$/tn>!cEk*P:KaiJ#Z6%bRkl=M/5qeyS&@wmMH^F*:q5mblMd^*tu9RuTuHQ
PE%BDd W?>?%kyylj/T6%^FeyZL1#ES11eEVLc#=Q$WHq$W/4:EXeb=q9jtyMAyi*h@ceqV*?pLtkm@W8n\IcFD
dmiWG8 lNkyMyVGAMF6VPku%IQNat9FJNPX5cM=X+*WZ>yqi>qCDqE1jndCVFYbnT=e84>AnWcG#=nJB:6d:Luy
ZTDh/c a/$d?kh9Vwc^1QceL%KkqeYL*eKkLT<>L!EBI%@<?1KhXLc?!6SdTI=XINWn4*u9APSy@@=:RPyV+!Dw
!Wmnu> *ew9Cn6CMGb48!jyQH\9Vjld*muQ1caZ/h48#+^nD1$4mi/m#=tM:Gq+GGmMnl!&<VMN8uX*al4Hpw&b
B?#/LT ^T%niqppGt>4%B=Sy+=hE6X\6lGiNV\bYZ/mt&dTqc?TPmkF9?Dh&wNe##P+NkTHnydHVui#HjSeq@%d
%=Aqw9 9b+VAp:LBI+Qb@lQHktD$ySKnBL1#\%DpI1&jB=jBECI<RA!BtY+LALp^/1Y+iydjjBXH@Q=>RAtSktR
94I<4j &YSh9y/B4qZj&\GFC^RVGpMHFdwVD:4aZa+HFkduIjYZ*J:kHTtN6m#9$!SdDRmW1hta^A@5L*^Wb4tK
$EK8HN n$\tQZc:@F9=CaidDZ&%Al5NWNCCyMyKe9A4LQtZKn:>4kBwyWdcwcnQu?S1PCnNYLbHpB>#8&*DM+5#
ID?$5+ e/6dqB!<F&9Zpkp/NDGyYa8L?FQTGbB$TV:NKPV1i=ee^%t&/EPwNdVShlq9&V?cV/#u/cQ#SEdWj9=p
=SdTcl +u*BV^:PMLI6QGFK4q:#Mpk9u%C$9mu&<$5n81Jm:^@wR=XYB>w1St\L88Et<bIa%hmam%cVM!e9hAD?
j1hcN1 WTbRQJL#C:Q6FpB&VnjS458YwWm1^8yu@>4C&tQ4yDDFHTwXSYSER%bDQ#n%*=NWjXGNC#uSya@hV$mC
HlPZ+> njuCTJ45Ley<SaGBk5\LGMiQhXY@$mdZcR5NmkV:$HdDy$$h*?G4BW=LE@4yye#WpaR6!SyNMibVKkK6
NlX/9q /Ne\PeWpl#>lYk<@kPdE6jPu@QGtY=SIhePC:d1I^^PPueFhY>*YyS4/XWcb+uiWce?J#1j^h!Y5he/%
Q:5B#@ CihB15I4Fq/l^Qb4p1FFdh9RT!d^SaydPnjKe%y4akbV\*l^L*jE$QnFGCLWQqQW$plRDZ>XPGNFZddl
-AXa%* 0008eb7800d001202b4 Page 325 of binaries2.zip
PQ:<EQ p4EhQ^YInl4wl%5$@bcbBqLDQ?:&>=T#jmhJYFLYHSRyS&c$R$hJY$5$#cq$SHVZCwtF6CdjcHanTM!p
6DpQBj B4+Q:!1<MFyh5KFLE<=n?mZ!#\ddW6?5C<Qt!EPI9+AL$/Sm*wSW9qQa#d/Hea?iQ#B\+lbbbj*NS8:l
+nKpF? :QR5&/TeTGC=+#qb+*md<^n8\$p/eJjJVcq6+in1jjw+<C+L:4/:=+!Y%=kI8yIYN#wMdb%Z4a%Z519@
P9\PS% e9C:BP%Wntk>mXePW56m8uCC=%1nDLIHZ9T4??tCR>b$I5K^KFmWEu6yWbcC/A+=NmZ==!jy1V6Vy6=L
e\Jm:Y IuCuN>TJ4=I^YK#KqWEak9\>/B=n&QwhEceqA*amN5JSW$PM&GVmJHC/$YT:b/q@nHZF1I8ja@:5MdI@
I\@6Rd /#Wne%cGZ=45&Xel^pGi4!R8qiG\LT4FqYBRLNN>YKKR8$QPTbM*WGy<4nAlwZk4G=DHYyt&L@AP1!4y
&Rd&+: My#P6n?PPY$yIYDn=+1dCKAmJp%m>8Hq%4TmRnF*bl5Ae%ehQK?Q?FTKYq>p*eKi^%Zc5m\MEqWpm/R5
@F%bbG LkWZD:e#%Dc$JdZ@qTtt!4YKWYpbaVW@duepVC+@9WRkhiWKL6<1TZJQA6\^LdSQd^cF%Fk1CT*?Y&9t
!i:knA Qee8W&Wq8BP8<+$5F8yK<FL4TqYhXkC+apM#*Qa9\TRSJ<XKBp?yCD>nVQJ?EBWHj+m\cb$4DNquk?V>
KbkJHS mJV4&EqJpFydMpAD@HbcWZ6dd1+nFKNj1Z45hi#^wLG$P&YLY=#WIN6uD*hSIw$6J:d6&1&I%mS4Ze\c
jXLGcT jid<?dQw5T4QKlF5t^4yV<IN6b%Xl8*1<ba+iIWW8Eiy6IhMpN<S#L!GWXcQl6$PHJQJQH@wIbNH+Iul
myT:#V tPlt*pVu^5puHp^/4X$/I1pQ!PYqLyqXLEb:cKT\KANFacTWEcQhQ6M5>TGu#=e%?PHL^6nlpS=k&GWn
Y#bP@l utHMnQDKeB!pwFb48Z6>$n^uFLAm:>!W?#iTZSqkq6<hRtCV=^w\a1u/4hhCcWdCE<mNucVcIGi!E>Bt
GG@*wE eJlj1Y?MRH=\C6^T*HA#*j^iMeajwlbn:JtJ=8/ttBVe>@pkwPFQRnlR#upay:e5>$%X=G1\#qA?aM+9
aS/RGX w@dWVTV+^nV+h>l56=R?+W<*=Hi#lqJ5GD@NDuN1Cp=C+tcX8FCEQeXRNW>QYjSiZwp5ZTP*Cd/<nqyL
\ZL:BW 6IL&?WWNJmtnu#nJ8cy*>pJWSEHl&B<Vc%PB\8*YP<cE!/ecFFYYD@ptMb&GdWK\6PYccL%DYXS51kA?
!p?@/w m?Jy%CE&J#WIcmc*#L%4!NmnWJ8e$SI*4>Im<A!nF*c5DR=w4wbH@!/t!lS+h\C*YcqEP#i#S:b#LqYT
+Yw\$q ut?PE=B>ma4$MqZRKy4i@e8LNK+H:GmNmi5&thN?S?cS#\Kp\6PNSWcY9P^#+pnj%>=ywnZ*Xh6%KM&w
qdLDEC 9qZw\e/b$>mH4&PCLEKt&6yT&JBNXuDSyI@BaRGc*1F1/F&\?KD=MX>wa*h^@IpMGQ:uwyHEjywd@G!N
yLMw#T cpJYBZ&bMPb/EBjG1DLT=T9&?5Jy+L5<qbFB\?i/@dFPN:9NbM^/&YCDy=8bG\FL&YMJYkW4ht9wiDGL
w/YQEk YYI#b&ktJa5C/BJKRKID:&Xp%%@j1\#EcwhjNuDVd=qncawhHV:VQHF=6+!5qcXn#tJqpW?5j@K8=6pM
:14tYS w$lI86^bM*^A%icq!pmAK^8&qTJAu?X6Vp>A1PTKcXM/\Vl%t>?Vl\hle*d%LA@M#Ljp&!6JE?=#Ic@q
qC\#+< a^^yeuJTW##I&/BQccqLC%n1P\ac/d%mu*L+mX5NP/XHXJNA\Y+%YM*e^ZVGyta*TIkGYu*XM&hTaYWR
C:>N6i #VQZ&lu/Smej##XYMWC#K++!!*hPYQHc/DeJla<4>9Jt84LWpIS^nj$4\b!$+LIpSJj?PM1QIVlj/nL^
S^/kV? <tbp8dM5*%P6X#1P*/1l*XMq<pXKWRWej*p6^BaGLAVyumKYSX4D*uM6Bh6y!Slu1tHycR#*QTd@Qq^Y
aq4\#! VuptZIuKN$#wL#hVej^a:IaA4$@&hF6d=:NZcp9*>ZyZ?c59nVZRCwVJmlV?T%^@yNAPHtn<8d#SXE?S
XZS:Zn DtiWXmP9SJ%iNTkikSP\WQmRJEp%4SRy\6u1w5bHDM!1YaDnBb^6jFjV^T8&ej5q+%>@WSdID:%QSE4S
q&YR+n IweXFCyGQXkELbjwDchm:V!QhDEk1SPde\BFA5#h55Qj!@ZNP1?%QimW6S@Q<H^BR+GBN/&T6LawNw$G
6QHwqN K!5K\uMTTXu:EP:q8<BLJT/ZQDa:G/jqE6$RM!NW%\PkAKD#AI$Zkq5cYJhEcIn6pjP>HG+?XmbK4QLA
>9IwEN Xk8*8bYt4Q&lJJQjphqnNaWJp4#R<:aG5aPiyh:!QeCFhh=p#cQXytjL>yq5N#B18cpqdk@lKhepCcc@
kX*HSQ B@eb?K$ec$%>>46$dL/IHwiRZ+GZJnhue&tuyCb@GSN%XEpDTE%XVST&B++\D6tZyuCWh$nm44%CqaEK
EaSHtF R59Nkj1KcPmkyK$nhWPRXE+^4ES6Sm6Znw4Xai*1$Xj#X=1^wbum&QhLi&EHnuWGZcqtwR$ZdmRNqJL:
T#ye\= *LcK&qILM+5&F=iLL^*dDC4p1mjiLZWF6mjPIlpk9?P1i%<TF^JpYN4FINP:!$T*yQJc9t8MXbM6qTSl
8FWlVY @%:*!eD#6+T^aHG:w@t6t/bRTpF?dY@kM9l&$w9DmSK>4c&yp=MZWmkkQ?/$nIaW4im#Hj%TqBF&WNdS
cj9KZZ 4+aBpA&X@FYWIETk6SJyEwiSJDBLAmeiKPpTbiwb*D=caScSD9In9W<$KJDRTR:C64wQN=uT/^?w61F@
5Ia<q$ K=mMFVChuQLd+d+RPJLu>^N/4P!m<9SaGJNFXkRBc\J=cBF$mXXe:%keR1aj8>Qq1a\b=8<1L/*ayhJA
jl!a!a t66&/yIlTuuR9@LCqcH><:=5%kSHCR^yYTNTDR6D%LN1?S!9M6JRy%%Zc4C#mpZ=<=8QENZ&j@+$&G#q
hj=KD5 1!/BhK>Ek>+>lPK%Iy$TS\C<R>EY^H6eaS?1Z<iSkG85AHpK?eHZYSnH%dZt^F<iG!#k?6&j\*ih//4D
jFAml: HLTPcd!=#LHTwtqy?>AM#NMq1>Gk9/BdMGm%PAE=PIQMW>^c1l8JSe4S>/kdd9nLCX?AZA1#+JXe5JJ?
=/L/N5 TM\#IJm=1u=?QL=SENp:R8e\$CqT8hdlc??V>^qtZ*Nbe&!PhukALtiQQ%B4H?A@AmG!uEuPwYGkaTih
/mVcX$ 4:q#cc++lRmEP%j84$SEp=NFlhNRj=uVWutIBFQ6W+65!@ckpewFd4cV=PR/QmYDlC+nn>Gj8/p+*it8
@YR\K# :H=:W@We8/!l+wGZdbB9?hhHtK@1t*IuXHQ?<%hq+DC^t4yiWNZPwm:&l=S/Zw8/Tij*?a@8J#c$JGtm
taTSVT JHBXw9#AQ#$6/wF=>m5>mHY<qh*ZR4Ja*QmDE%W#W9?bR6n=<:C1?*6bm@1FD>*8j*/1VkTVb!hWibnZ
tw5ZY^ ZR=My@yR>T!5HQmBKFHQyM:PuYQQVquX\iKB%*NT<K>$euD^81#>a>bGtmn^m\&8k%A:WbKR8qbi%IQq
4WBd!Y ad%1Gy$9<4H!wh?=Z+<8MC?\=nRT>cFj%YDHY&DH+pj1V&EQwV%j?Y@#lcyykuH%4#^SbhR*QNi@FAFd
#$iHCm @^pJ8%cYyId&/V9LhcP1Deb9XeeN<t>i99j:!wjEbqZ6/TA=+Mwh?<CA?Tw9NYmDWpTc&5:Lb%Yi4WRB
RIXlin XdN?XZ6&RuZTANZ84RCVK^@/#<#8=+D8jRd^8eiA:necue48F^9W^>>Nj@Zu>iLb5^HXJM8A%Dq+LHcV
utBmmu %DNX:TTAuiRH\D\FT1F>p8F6XP6XPXpE%Ei*:q#XB<y!^>T#a#9*^q>Q@/*j<1w?&MpiC<%C*X/I=$du
eX/R=A =aH<<B6%i6t+EHDFiPFnL:@Y4Z@bNalu*i>@u1cZnX*YSjCJJ%IF=9*QB5i4IM!CiSDyPdlW1@dMIKD9
J><4\A <iND?ID^t>BME?#>jXR9pXh==WHn?11lwkkaI>^^W6CAd18*B%LQ!mSe@9^X5LYtuk8V8/#u^HZ&mcd&
HRbMZC +N^*lGmD*Vb^YV8!X=d%Swq&XGtWS@djAwt1kclu=bG=qSWb/np?/%c<Eiu>V9=MpEH>tjCVwI4$EuSh
P=C%p= %jXdAe+>A1>nJ+%Z&/M/&cN8p11F<XK9%+G8PVqKBH*ly@qDmVN4<k?#bZi8k6buZ1*RQk:1\ZCu@*aW
cBt?:G F:9Qu9%c>bVA1iJhL@/jd\RWeb<$@?*wZ@XuZ?#8X!=X<wwnNP<:Vpyq1BhK:FdwKt@$w\Ya8ti9!:yZ
S@iPk5 !!5dNH8k61^=XV5RiaN8WDT%F:An1JN?iaQKSJnyQt6C%eBeG#Wd:A:k1m*@NVc$h8n8RAp$:V:4j!mq
!L4e6a KP^KWS9th?8ZF\WS1Q5Dyl1pAX*&J?Fmni1ND$*QJ?Xa>dVLwK\RVbJR=RXM#\:M@n@I15ZWY@*V9tMH
KX$>EF ZMe1eA:$!L%H>W49F//iC**<D&MY1Q*!+k>%lV*cRQeKmR/1*jHW@Ywj<FJknQINX?4J$Abqc@+%S@:L
!\%q91 *YAP>wS5D\b:bZqpHmh4XM<Fc9eC:9&q%H85upDhu+V1!TmwH&mF6SBbRcJ/h5BXRK1G!49:9&uS:BPD
+m5=aa \SlM>5/i9th%ZZ@?PcK<BcaG+kFh%c?&=+Ctln:T*^c9<<@L6ukdmuwF6aE1D?m&ALPB5uk>P+G>NXd:
!kJ&nl ih*yEM?4EM>l9icYS>=@Fy5wk@GJ/@yI*9QE%*FT@kPCF>8DA=1>?L%CDeN@&<aA:SiZCG&W6?<y!Cnj
iNRc<6 8e#wYY@b>?@5uIP6/4y?5DcwF!tBcj84>wS+El4q@tiwYu>bAFmA>nl\N*VNFb4cH8HttqHNDZBFpQc*
>TkBqn 84QS9:6AaLuiQ4BPQP:!>b@CI/>@cQ<H<H@IDqEHW9Z<$*mW@:@MMPRE$w8#?k>kQun+ubh%/?4^cHaT
pI%DFH %D5CqjjAFWhRi&Z^%P%\QVlnMNQ>u4^w8<q\y<$w1K>ZIZC@C5=XV$PM!5/\De1ihcwM!5c4\P9+S9\B
8tw^#> AB\%6E1AN&D9H*<BAI1+II$AC\SA=4kRAaM9*P=8L%\*X*aZJiZ$QPP1XBQbFYQ5kPd#mi!PX$N<FtNB
BS</=H *lEYa+GReXI@SH:@d=\!EXmuK+N9TwY!M+K:d>J=1C?!pI4j=W#1mGLF+EW@ZeCM*J!/uF=$&6ue#M#:
!qYT^1 AVi<QDE5V^$8CF9//C+^5#p\hXEDV9$4qejT#9Icy8AXA94XCqGIa+d!djtGkmHk1JkKlmKhMICMSBN:
jHNdWM pk5Jl^K&ZBL!i$X9t*C!B8Rtan#lR1j<WX#XtImITKqBpIMSTu%&Qd6CLBh^GHE1WcC*kP%QG:Z!+Y!1
!lN>DV wey%W!emFEPh9=NLnG&<u=hq=@nBI/T^Ju:1n/kyNEnAZ+GAHDS$PM@FW!?!A6Z4cXdL1pi5K^n9c*51
iHqE#@ lWRq/RjNjdZKFZ^T*dXVq*\i%DZ:X?DeWNcRTdeEE4W+Ei/4VGBck\@X@8@XckYuHLEdWA8*qSbDa%6/
lF>jF/ i!j#etDPBcDNi4te4\RjQ1*HV#JYk#4?Q%acqeq58Z6PZ+Qj=AbwGapqKew/VPZANp?K@aS$:wEyWLn:
Zu!#T$ 4@ih>EC?GjiSS:6dLpl!=J1@dVQH\Nt<Jp4hCYJM>%uNI&%hiKPB+tSJAWI=HbF8a=Y!IS>**NZ+hPcK
<Cj&9I m8<jE?LTIyWY9KJ\8<d=MkE8a&wmemiVjV%tTIyi>KaqX$e!+aFI#RPp>kuSDSIYay6nn+j1H*+H1:8m
n4p:?h kwD<:QeAyK>\beX%FbjmXb=l&kQ8^%iTeP1>CjH+%jbE1Y@EYdqltQymDT9hpXWTkqHnXR&/:p&>#ba@
-A89D? 000c03d23e7001202b4 Page 326 of binaries2.zip
#6cSa* mZlc$!:PPbylBpBMcPhPREmttaGwyZGTLk+VEe^TeKLcBEk!BDLQ4dD&yiacQ\G9>\?nA*TSRcDCt&5e
9RQGk? $8THl<<a@EQ$m9X\AFctEJ&JLl#e5WpTpTCJTweBjldW^#iYXtyXnV5Wd?D1h\lIdPhMn9MjX^\ALwVV
kB+Q/! \4XLmSwd:GJZhcek>u1I\M?+J1H^/BLq#^MdAa&Hi+i#@R#c^m=wF/5Je#h1@\Sj#ZpcuG<M?H4=u\lA
Ab^8kP <\+BXb5nWBAe@MGKNKWkPa=B+aMBie@AInL5RLPyh!\FF&nn&B<cN&KS>VTh#mVdA@qhE<YCTjDCXl$L
1ldqGJ bL1Nkl#iq:4Hui+^:tFDLtln\#hG:GZ\bynL+HSL+^u%kFZ/N?6c=QWHiJw:REwY&GKeIBadP*1uMbAT
9^cC8k p*JZ:WWu4%+WcHnlWun?PDH?BHGXqJE%&Im&$pn\=qdnHKAV=lu1Eude9GHT%h8uFWuE<BZ:J/<6hdyI
/w6HK& l$p\$wnm14Cj^9DZnEXu6?56K!i6&>nR!d5NI*Kw8@mW5@kltSdY$mE>1iIb554$!n#hF8Pe<%yMmaCW
^kyFE! bb!:dEXb4\SNE>I:#JB=M5tawnMRPRNASLtAIaYi>Cl#/9X8:%btZDI>G&VD1Jnm!:YE%&IB\##JVV9m
w@^J&a F=KF>k&&YFkHdaI!F51aG6FWQijb:!BIG>NT^&CCHK+tqQBQ!1XmjX@bld9XI@6:jhCNLi=DRJ/4PQbI
!i/beA :END6u=<nAGIJ%>l>6:qR@Gl>m$lqkQIJk4XLQ#/kYL4XW4T#9hn/kV1FFkciP%H*9D\M*lRuPwGQ!1p
^IA<I+ bL8>6/X+LT1RSZQI>QtM\1DSF%nt\y8RWcW5^86Nd?K&1D4#tQH6!:GnmlFXi4eF5nA8wS*QIl+++&*+
:!LEL/ 4RK^=FMaTuEc1<mi5H>=i*Qd=YdpQic%c9<j$nc1W*+/d6B?/aDP@5hQE1MjWuH\w^Lhlhl#GZ<:$XGn
IllJwX W=A9^GIRIZ5yNqykq5j%p6c89$tll@Zk98bBVY!:cWb^4t5Q4nn/qk64CCZN%dT\/a8bm*!M=C=P<k&5
ettHuR $!+i+M@94w!b=Y6hXB%yGl@!65!KIF*eB$HVY4mFj!!?!%k!nIJhHAntTjbQ8qb:D/%+tWj9y*D/R%iH
wE<QkV &t:>8E/Xu:8%\uTcuHRNE4/J:T=#>=5aZ*l@5FX!<LS1Hw\<>BZXW8F55TlALIEE>*jL>&^iS@mZjITn
65aD:c 6\b>5I\$V+kX*tq9eiVH8e6c:hCI@EH4!Kb@&Y!DqtY!+KDWEG1yDa:5eiJ8pek!RtmY>N/IcV>Xqb\R
nThJb+ GRia:Km%Q8KN@T&lyAJ:\FFZeLI$h8mM>:c?:nBnh\bd*X@bHq141WR61NcT1&VRM>N1mjZ<c#iX=H%1
Dm?cZT 9@/*46ydJkmR!!=*YT=dP:KWm5!$WIdT=$D6LR@QI$Rk5IJc?wRw$S>1\G$BjB58CFYmZ+n#6#daP8eP
/Lh:&1 jG9cE?4#&eSQu5#:IJV>$F4@%+Xlh1aL^5EmSN^*CjaB%DXeHCB@dh8E6P1CeR!Q8^ttnX/MeNM*aS9&
AKRP?A Y*=X%hSC$X9NtM5cF^*LGeM%VYFS6lYe!+51T^MImLka?Mim8%c@IDp/5pce9C6E?QpTVEm>a8+h/&t^
/I5EbL WktPTFS*&hVG^HF@^q665^Baa6J6c=:R:Whk%MG<4Yi1l^hcS?Hb<@KMi/MmyndIJa#qaMLEh=6C6jc<
MaTH8w @1qViJlCn*R$a#CC!IhCVtRL$@Zh<A6X=:e!>VcTZwR1G\wh9=kN/PB$M&a@eG!B5ciDlctVM*%6uLcw
L8nH@k D!AH1b#ek%d%=C/B&^:=+F\8$Y8I#e%5edjp=PMp9$&YBb&E$Z<$u#h4Tlb!*/V*u8J4In+hE==SHy@R
5iJPDt B+%^^Htu?Z=KkLI86pNSH9$PN/$qKtBdXDhYdNWa<!KSaT#tN+k5hqb5R>D4Tu@5WqCW^R@kNnN+$DLZ
Gbb<Vb N8t?eLD#!9\HaIW5jnQ&nEd1=b<E$@!kq4p!CSVTGi9b#\wX8!RG/&lL?kQ\K8uCRM$VeuFaG!iKE/A!
pYukPW mSpHb6DJ#ae>!Gec1h*S%*FMpyF?\H4#!1Zt#Ck5ndw$hV6QRL1MqL!!&>hyqkFeYK/<@$tN4JTV9FRu
jtIYFH c>eem>ZEyMLL\m1d?YXtFBYmA$LPX=1dy9PZeIVZPn>!W4VVu:VBdlRRFK$1jR6GIu^/jl@jI>W^@pth
Cw:u?= %D9EWhKS*kdK<Bc9W*<+>YWXbiFMa&lu^K<V!h>k>#iBS@\dRq:J=ShM&GZZW&E=Y=Jjh&DMa&Ipc@&K
N5Cpd$ 8jJ*W%/JVPd&IlHRW6AweW65SppDb#QItT#:B+Y$kmMMRqGtG>:l&wT8*CYHRuHTIyw6>4iB>6Wl#FLA
9M!=*6 RnP6!#TQdlZtL5#5%Dycl:8#ZiwtTnR<h6Pbe*t8Bd+B6Lm?EDYY!$6$/&IH%Nmwwn1p88$w^dpYw9bd
tekmmI JR=I=6S=JPh<&T#NQ84yT9Xw9k+:YTlHJ?G$lVk!6qkEL8heKc=BIDXPDhj*&1&LWdE4ZwkZ4aMaX@qu
\mTlQ6 yZl4yGJLM1I*pq#jqih\#GAk=@qG&$#y8ZX:K5A^V&18=&/=m#$He8%*PQ!V8N4C=lYV1P*H!Ga<5^!N
kK#Fdp Mub4\@T5X^\*CmXuTi\JG:@9d/:mh@TTq=kGpnJRqh>4:+F@u!W>ut6aGSy94GCC^+cCHkwd6YZ?KE=Z
yT&Wi@ D*+DLE4KNh%b+F6R&JEabtY\Fc5EePl\jGt\8ZEiiVct5iQ:ujkipd<yLT@R^c/<wyGHhlSMHZm6MD4e
Kewle^ IYnq</9dXihnn%^B*WFXp?$abM%J4C^J6by#Z9dj9Xi&a&aXe&u!lB>WZ*YmEd%W5I5KJD*Q6hV8\jXc
HZYNWD Im\??5ctLReWQYjktPaLP$aE!/wThm14!<Zeqd8jeE>!Sw$Yp=y!u^I1=HEb$GptkVt1hn\Mt>9R\k+p
XSu%NC Nn<+?#lI+1&TtCy\mnA<b%VnYF=Q+y%\w%jb/Cu$*!^&e:m9&\ki=684P5dHZP!h&iS96Rt$cQK\R&bq
14a6yq Q*$yC/><!kVTtAL/?ZPAD*V849N1uE@X8k&AHATi!?l4uMAlqb>Rc*FLn=h8XlyyGDu%utdFGh?Z4m8:
EbZ/Mk E>I*YN>CtTD\Y=mYFnId@AA*a9^eT!F14EC#iBel+ZTSDT/NVHAhJB9=&#acHe9FMtVq$IBL#d41C/V^
RVq*6R :?d4p9b5&yJE^6YhRm/bHY5nQuCH>a>qZ/lLa*P=9/BVR6M4LYdLwI^lN9=mw5/yYnyX#pl?YS&%k#4#
l4\+Vp !LhCtuR#?LV+EIw:^i9ehHK8u=1ETWkDE6P/uc5wTk5ddNHXScAE?qyD9R8J8:KcC=4aVt6EZpAKq4PM
q+#jce dyKNdk>J15dw6$=:<>W=V9Stc4!SkXSqkkFN4W>lyZXKw$!^:4C?q6>PdhCDh/#8+9Rq\9t@F\<PX\$L
uaYBkA //DAy?\8SdHl4+/DDyiWk%a6u/Pjayq@AECwe*j%J\9w$LSBPe?e*Mc>4u65uQ&*&tCpmd6j%KlAI&1m
h+WDGA tFW*>ckG1jMp?Q5C4KC6MW+NXGcR:d^i5E8TiKk=B^N8a\d:ee4D%6ykQklc5$5p1pqWjdlG^e*bkYCC
J+Bqt& lY!m\jLSeSM%\+dabVB=Nc4NicZYcy!1cZlu4JKaD\mQLVH1tLXb5m:icyF1tDT^LePZKN9>LLqCKF&>
lDK9i^ ZKw+$q>mlIJ1FHXwpt8yuZm?I*G\AepP#p98qi1b6G49L9eAJlI:^&8%S!y#N5kZ/bc%yEDuaip1JLL1
!w+Vb/ ?DBwW1YP^:GTJdK:ZQ&k4\8h>4Qq%l$5\=hjB##8TqDq5/G%VwCPN5LwW%hLM$juwapHM=AIlFQSAW+Q
GE!ZSb =%b6=:l*T%F$+$=!4uGCED=i6VtRNAQ<=uR<wMKDa*ESXt+^V1cAQK5tW$@Ri^alXXPclR+b:<ZpS4!J
Xn?Tl@ I\JF!R8Pn>yVTb<G$m#Rkwh5:\DXA^#6!QGRI<?WKHVV$<\qTVBl5R6%5=18R#Ru:yc+NB5@%nm$Q8Xy
!kphbq VY8SHm^LLL@REl^!ue#u>cYt^qyiK>LeWYJFy5NT/p!Lqeyh=nTCc&!Qli4$FN&>=:j&1kcJe+QPkH^w
dq#Y5I DZkP+1au4DbSj!e9E#Yne*j$+E/h64S%=5!K&y%Ji%R1%GB8J+pCP*Pq#?ytaXmWcabVVIKbnl@ANjij
<J$Fyc 6\9=JaZPtnZP*d#!1w/l\lq@9LKk9JHIAX&nI>iN*>BWY=!c6FweLpytlAtJnDL6C>FI#BF6^1$$^e\D
dVw^\4 QZSF^w8L1JLQuIXW9PYuna!wHcI#nmQpIN\X^amPtbe^wdFn\6w!CEcpyYe^5!qPbd\?5&wWcnVP8R$^
9^kk#D \\8utK^&>q8T5>85hc!lGjca*9de$^A^W=CX/wy9WR8FWqM:YTj1\5R\lH54$a^@W1FdjWYhS<SdnaPG
+#@ikJ hbyZ*HAbK^1+KG&nJ&j49LLQdVCe<kccdF8CqRhl5V6bHjl5D<<q=mZlEnpXNYYh8GyG5*\GieV9X=Wh
bIepl^ j=MheGqjI!Q%G@9#qZcM*LXY>yeAa+E:TTT4n9^!lt/KZYXtX:yB+=^:a9nkG#6/Jk!EI#u4LIS6TS+p
Lqw$lC IVti=tct++/*R%YP#jQlaE5Cn+S89HFFPBq>PTSEWJSqL8A^L>E^h#Gib5#E<plAShqFc\w+4b!6JFbD
:<45Q: 8I%MKu<ey1Y!^:XymP?T$!h9iPK%Bk!c\LALp*MRTQ&Gy6BKuM6TYK1=ly@!hMHQ$/45VE+18!q<<=>$
Gtc$H\ #FcnH*Yn@amk1KkwTLX&t<A%c@VKea!n6epw^1dJ#kd5=Ldwia8MHP8\bLX=u^LZiMdRiw=PeeXyyZbl
n5C+yq n@mTKmER+\JdjSXPewPbe#!Z\\yES/6im6\VQ?mZ&T6LP$8ZZ$^nWeRPLA9ASN>Dn4MY:X?GhEZ8b!lQ
:TmJn# GnhH4%KWd+YNG/hi<XJ>a!:F%FahNSq^9y/Y*m!*5J5dl!FtH^#F=n:9cHQ!8\$N:L4p:m\4%y11Kja$
j=pM<C dYb8YiRi5MWK*6h@^llLY<*QGGa5R#/BX#yauytKNV1?6CHSp@$AetQi=yZ^1E<NZCn*jkC8=SZHCY*N
QWPtPN RSe!j$P^dqXPwl/1?9=P5!d#Ym*QaHbl11Qde>@L<?BdBw+Z+FKT4KpN^d?4?MSCHlRMde5L5+n>Gi4?
$ti=&5 w5c!SZwH$PkYmX>Qm^=XeD!YGFbwG\Y#pe&bS*ydZ8Y^tCB#i!$@d1DCL#ehIBXpej^y@NaMR8nK/+l%
Q>@j^T N??%cMSPMph8FVW#T\mQJpl&6<yI%P#<4PRA1B:cup#k#bLpZ%E:&kdnKme=kbFGB=tXeci^19H+II&N
?=qkbM Yy*^#Ykew6=iHS#mR8iK<X9dnq45@I4qYIGV^iV/i%I?bq>ip<H1LZ&5*^nA?LR=y+d^nNj4VDV?mPc%
p1L/km P>ppG$?y1DW<d8i<FMNiDXN@G!KjE/J#BQA54KJMhL>^F4ZIPnM+1K9mn+8HXI<:/&m9D?c&+MRJy4t5
I:$:*A a#n*$ZIF=N<AHb$Jemqh>aen$VLFE&muweh1beGR8p/GHdL?D8?&#!BQN%k5DtuCDRQpepX&5F?<>+?l
c4kl%= hlakB$a+lZj@uE<i5\F!MNGVd9YY8p%\^4>S=y*NntXyZjKI%GAMFQn4CjtLju*G$cku*mITPquct1dm
lNB=6c P<GCA@KW?pdak9MTQE=&m?I!9<%cclF8J^E^NY4%yC#bHedWtEN:8W&MPb?jnuASEjJuL=1Z^4BFuGWn
LQT5@$ #SZ=qHcK=Gu^V6mwdT&mtXkiCVKL?K8WJ1b@8JGV/J8dN%BXZ#EGZ=HJD\?$bAT^+yH$98LN^/Pn@Y?P
\DZRtu <h1pVbZl^JkTKPtL/CKTP<uKn/t$>HVlXd6*5Ih%Nw&ldu/%eZGM%Lm&KuZ%1/p5ipJA!Q4%ILG@lQ<m
-AalMT 000bc960b95001202b4 Page 327 of binaries2.zip
Cy8cw8 n<X!#uN=!LEJpSN4FLeE\9CXc9L:L6<QPckIEkLXHhCRZj^>hp8kTn=JPa@?8:NZb1uJ@+j@jyTQpLL#
wH1#h: D&M/DuSmFt:uNcFm&K%ZBJZ\<WLbLXXCB$M$1RLQJ<NeRwPewDEh<L!hEplJ?hmIc?tcwLBPh+yFYN/y
=5>9Fp N%GPDTn5bylp6?WSi:ZyPW^iK#PdNE5bl8QmiwPNW5Z9wem@BB$@?<la&Wu+Xjw>bi>PIcHmiMmMElhj
wTw&JH ppTY4>!&+9uNp:Qn>nkbPGchD8S/a14=^b&^!DBeaF$h\>VEVjbaRW1@i\<>yeVL?@1yX9^nE8C\#GR&
RBc8/T R4EGR6lN\iijjBtE6BEI/aRut&l?t?Ph?^N$t:J!/Yatn<dLpNXZw?/:kXLlX8&h*Dl%#G<^d%l%IJQn
TQdt&8 jn:T:bk9nPL#HHl$6>DZF*%GS*lJEm6@mJ#h5LqlEiTnBFG^&M%t/VD1DZ/@1&\l5+^5#BWQYtD8i5Bt
lNy&y@ QM=>@F:Q4$dFRSDMAtS@$^GF>%JyjS!1nVcb6e^Y<\CD=6YnEhee=DHPnt#@:L6F1n@VZ9/SkREE?1@B
pkCm1w ^u<>ZRh:>IeEKwSmS=YWyHpLMc=tMHE\1IF?TS?A@u%NlNAJX+H^\LVlT6M#PHALMpVZ:*^#qG*/>HN^
M*wiCe P4!aAn<m$Why*Wtlq#h!dkHP1mla?hJuu5b/T:F\#+19YwqmViWea&E^/<Tpp@nAiqeX%RT%\6Fe^&hp
GCaHm= :$Z&!^NGX1$%/FYk6\Y8it?yNuGBK+6/DpZ4W%&Z#X:kbqZejV8ApRpEhDhieTpq#mKQmy#R@h*TG5C^
5aw#yk LRAmL#kyuC!%\==5%YmR%Dq1ittCXH8RP>+h@J==yJt>=ZQF6VHnbc<aHMGy8SYjebhH\9udGJ=RVt*e
^C#V@$ e$P<=^k4nJ8$=kKWudtu<j9nC!H%Yu8Rq:Fc1q%P9Y&k^nBP?KCjw@p9pcC\ZLPCdJSeH*VQPc:TN4$%
YB>/tG F\d:SVLJ9JSbhl5@j^=M><::+AMI^H\Hn!/we8b+yS&!=YuyM=?lLG\=5LuD6kWDM8^bjYFe4!:X&4:@
8nCe*u 4ba@>!YGc\tS5V:\Z<iQFAEERj6!C+WS5e!\wAcF<MPBDVZPY$djklje6ut&RbhmRlQVnc=ZSh<Xu4Hq
DJpWyP $:Q*&k^ZiTl6:uiWh?ji#!#5teny+mMDiL:j?Q954kS@V6PYpd$DIkW4Dc^Q=ZbXDjEw#a:RN5NAwWnq
/9LBXW Ymhic?%VGY%P!b%knkD@H&LC!D/XZGmtYkKVq/DE@WH>n4\G#1i&1WuIbZFZRPQJ!e>*eFGaP195lXD&
8$!<=l 4@DGwiw:DY#Pph+VtIJ&wP/l+<Z:LV+cnA49p*KTd:n!A<wBuie5WAcpjPZmAXQ%KP^j5ZwSN1?:BCbL
k&ctJk S?D*>jFVPRZGXb?>y$1Li1EH^k\py$F9IFeTPaYIDbHlQ?jc=/C!S#WJ^8p#Bcd/eN<q5Q#5E%@=yRL6
CYp=D* <69?Xh&WA@e5<KK@Z9jELDI@8>hA4lyD/eHakk5YDTAmI5mpAEBREFekbKNuIFR!NVRlqDWF@N<ECkDA
lw6bER Jj*9m4y*%VSABRDARkIAaAIBAJB&AAAwBB1cG6Bwl?4RcHE%y!K1wiLm+8ECBQn=S@?ZNyD@i\IB@@@$
+yPSR/ khGC8AJHk!!D\jkDbEI\^ABaBMDRlA/b=i:8y1ImIm\5IkL@^9/$<%emET&:uPWmd!<ZLhK=T@c4j?Dj
E8jD+: DlwtlQPd$?F8h/4c^6pqXR%c*HPZhnRe9FSj?nVX$MIIk*8NWC#&T*@&TwYN\QyhE\1HGM^uA5EAn#TQ
dF=9iF cB\>nMyk/Y8MWAMI>VbETZ<hc6qjEQVS+9hJ\BiN4kYGjBn@!c%$ALY@u4\mChaA%nFFap8GC4l>Mn+Y
i!Nh\B SI$/D:H?e&aE!=!ab5SF:HDtAlL%tWHckcmK*N<!%T/BKKqjuT!J/*WF#J=/pAc?a*aaHD<6pyDRn1C9
NNC:Lu ja#p@I=9SQZ6St<eie5VX4k@XWk5FF5@u$JjTl#AK5A8ibZW$X=59&m?Www\6/Ymj!hwWjAReqR>QE:E
b$Q$II NGcKT!Gn+W>bHC$I!qyTMwDNM\!W4FW<\qZBAI?MnLES5A^PewXHA!*LJTkDmMMJ8+MX&P5>&=adkD#k
cmntDp LJ#/lE<kWC%uq#*pL#aJmcCQ\YCpRSM*=M>i+Bk^XNLwWLG8RS&8I&T@haVGukIGA>^mu:NF=<JTI9KH
AY4kPY h*@8w>C?tuG8T%pMbuuA\iV\bk/hEq!F1qXcbRG4tTNak>B<F<mYR$Q6?9Cl8Kmau5^Nd$\ehSZ^yp4q
HHXe6F yt\Z5BSR4wIQMkMWj9eM<FI<nYHE<j&c8yq\G=qFH>mS4i9JLL#Iy<X6k44^Jdh4AtKe@#tQJJiXukmC
DwBRMi l@i>d1#iV%mFnB9#khQG>GHhP\*4qB4lq9IKkT1&=Fca/q:pM>6@wqAjXyt!4ew@Nyc!4=AH+<V%A/?W
ALX?!a e/Z/LK>8X51X&LZ>w^\\mXlJSa&cR<1:J\w\e1=CI\+km9ey%1KT/E4XyW%T#iSb+NZJ/MRGpPSpPkkS
mXM:qF BJCJRtJh:dCVPdunI:T@Y+l:>S5pK+Q%PXnSQPLtG81:PjQXc\!>%tkd14SR%64:KW<N*FmH1YVAc<*1
AaC+Rk nTbJwciTa!:@yBdlatT=X?wTk@@BYR8yMyFC=ckF+WE&$e^wPT:w^\BW\5=RZdVEBSHW&*m$DLY4ihaa
$/>*:P $Q@BQwcYJMj$4GV9kuWAX#VLw8WZjRJP&X#nhSPaL:&yBYyKeb+8Ct\dwi*+??X=Au4DZPAnqhN9l$Wm
p+J:%j n1cQI\*e:iN$F?YlY<j*A/<%9jPC?@*p@yV*XB8k6G@y+Diq5Y?$Nq+yIHDi&+kW&C!q>ue&e$G=qDX/
AhReF& Aa%BBYp@#\a9GTy1Hmy^Jy:/MTWZPWjSPeX4W>C#wAQl:jbq@tT9B^l$8dAK@wC8nb*%Gw$ijde^mDt%
98>I/P 9wNFTVM6Tp\D6MWuEwR<Gd#w!lMqPX<LZ81Gk!T?YdqXQTKCI6kyl\!$N>J6%b5k>@6uY=QnV15yAEMk
\lcD5\ >c8Gwwc6ibP#EqM$Rc\<%jh5BBKdeDH&F?dQ&Y4TRY%:tjBl/X!@5/q!\mwuCQYRcIbIa#n4YXZD\IW#
H#M<d+ %qR+wbZWc?wd&helM#ah>n9\L:SP*NMCYVR*Nkj%A+n>l6W\bDL?hE:uhbB%w*X=<!J4NchNQlNl=tb\
H=^Rpl H*WjM$PmF*+>\bIMJDG/\6e:m/=GmZbV>9A<pLZ=k:amku8uRdP%h?jqVEaN:/B&uZjjD5d\nP5^l&#N
J9K*qT NLcblXewwQILYeKLYWLi5m^T&\pF&p\LjJ8Zhy&\mq+kM^WqS5^cBI$Y=Z\EdXdIl5M\lEqZW!l*%YGb
1^1++R wCu6NnWY%V!5i&9tl/<=SuWV=QkDuPjRn&IWidXTVjT!&Pme4!C+k:@S@uPn4%HF?V?RE&RAA\WAwLRi
Yl?w41 e+Ty=#4cGt8teeRPVq8>y!=cM%49yjP==eHuCF6y8adPYy&>yp14Tt9q8cj^j?=ZC+9@+:Lh9i#&c@KW
hymp6w QiGBViTGBSYZ%p%ch9%L<Qp:4&%##tdMLh9S?m*/LpmlMGKRaYFINn$>ReYAihM1NS6ZSuHAEG8qaS<T
=Qd+Qe =^*dDAB>T?/Mt$ZWWweqKNQX49NeKlGbV$=yVT^qA1dBYSjBSF^1wKm5keAheb=8mNGT>w6I&KF9LS*Y
mhc^ME u4KZjK#mlM1KDFjYHnG+6u&@^$!BtT>TKy$I9bAu+t1P^SX>E*\VX^y+#IcXiCwwiqtG4?dM*8B*\iTG
#ty69: %$eq6q8M*>IT%@q4QkkjTjWE$+8^w<EmyHTIew!TK>j!mp8JTQiH^SHZYY+9D!Zky@jpqTyeJ%FaMh@9
?Y#A6! kpj&$CKMqWCWVRE@@9al1<+@GbVd>h6m$lpn#iL!e::hRB&dIKqB^S/>w&m8G9c%I5KPhTiEW<pEymkN
wIFEwT =SI^1Ad/dL$*5kw=nkj:SiDNZRk<q8mTKGP<%eSlcVNmlwpeElt*Sil9V=WptXyX^yEHelyNZcTC^w+>
WWEwMZ A*%\C$WBQ+Mtba=/=XyQXV49<<%^5&XqLa61kK5cey>B*j4k:PSb<dlX9&Lk59G8pi/8Ayppn5q\$w*w
pyl/IK qR<QG#Xp#%*mMBp!Ym9kZKPFcFbhlk\!nNtFCcq$c+^unnXRc&RIiWGHZqn9yIEc=ILM^1kcQ6X5#GT@
=4*S=W =dwjIN?m/=5Xc$^&wCbH6I^4^HeuXVCFlmZ&$118V!qBC>=DF=#k$VJ1qjh8\SLY%m\+=*@d$*^^ZXR6
+dNiN= t%PA<EAnVVB%j8a&tHICWu!6SH%Q\+#CqHYw<nGCGQWTCqH?1Y1qVWPBF#!cdpN1X?=L@q%QH<jk&L6<
/LWSqR bGZTEVnFed9dFYKA88qa9\Q5%pIStPGXdyaD\M9J!jy+E?=nj1aG/Ry6!\k#CC*B@&&5hWj8eXGb9^Q6
BA1KEG :+4LPX!4IkK!lIPabPyh@M1d1YSHMT4?i*F!5e>9J#jn&!?Qu&FN$*#q!a!kN8+ZWc=6E4#9^#mR*Qn#
L$V\DR /t6%5\XBkKMRjM<^aIKVa!WWi*$dJ&MdXp<hZcjJSTWAnHL#k@QJ14VV*Vd9WP<Gl?L1Z>#K+/da&9Bt
tF%TE$ 4c!*tT9Z+>dku4qFuWPZk&Ad545*EQ%4Y<&&I&##h^#BcA%u1Je\TmPFn>E%Ql@HajR\i+VH?Zbyy>6:
yPPWSI :AdNeXha?/!1h9Mm:&?m&lm?Ve9FmeFtPI\G1+BdM\$#GN6=kclc>^jXS8?neWMnC@Q#n6>AFdc8blwA
d^kqT$ RBnIFYu$1bScc!>n6DHYDGi6QceNWD*AB4#9@#m9aQ@D\RHA?RDwj*ET+BMk+jyj#AVRJ@AHBaBV?$Qt
K@GYP+ BW4a=NMCp?!Ea+WtkpK#RIKGwAIe99+N<meFMIDFkaNSFM@?@FACynA^BQ#>+VD#5X9tkFD>BewSKbtQ
%dteXb ^wLJWnV9RTqqe$IFi+Il@#Aqpt<BpCnj<yBKC+LemlE^G/!HKAunBR!M<kZulIb<&BaC@lKDpCGjWR6w
FhLT<R ERkAtkFM\$lP!CB+Bc&V/KR16<>IZ$D6PK:5=MTpNww\ChbEAtn?Qkd!<RZB+BIMp1MnmP/eH4M&DBK:
1?4DeQ ZTL\N^1ynlQ&w$IGTnITKF9+mSqcVNBy\^u*TH+wHCwhGPSMku1NAw?J@hj?DHI<84jMp<D%YKIui@Gu
%@&Ptl bJM:X>><lidmbZAdQt@=\XPyyTB+l?&umY/ICX6Q%LN&58mJuNC:tIR%n<ZiD?Kce$+9MR%8q64iG6KD
q6a>KF mA@NbP@VV>WFiFNX^B/ADF^!p%\ei$+tBmJ6MZX1qJjuQlAut#W+n&NL?^:C+F5&@$A@nyTAu%T5y##N
kqRdM! Rn>:wR=CRkDn\!t=nDLyd&V@^T*iu>9*l/<@iji+nY<uV??>5@jbV%/F#P!n!!i<*^%du=KW/KV?AESI
Bc?q^% AJ!m<#Nq=G8Hp=$db$dmIcW@qt$*j8Mq<NH#@T<eeNlj8HF?=8#d#tDVe6>i+!icYL?!JV/c^:BplY@Z
Ny^5Ih AQ:%F4ApjM#PC\8T=ECb#*d8DkW#i8^<%NPICFJy>J:PDYRq#<ubkcSAkN^bZpkFRLuXn\<lAIAK^Bt>
Jb6cSL 8@wDQSQ5cb^l+@wRY#q$<iF^uhjP@b^@wJY1k!Y#a#bbRP#@GAV+u$l?AeAQWQ@H^RCAkpF$CWAFAbAa
j%KwF# :1De%4thHd5LANCjQ/</4Xm?<Gln^b*$pZZ\p6B5>BdlNE69PPPe1>PWjew=+:^>89iN\NM:t%94uH*/
yX4YW8 ?M9cq<T??q?G<J@?WAAAGMAEAJDLAKD?VYEIeAQaA=\AqkAZkCuA?j<*EZE&hVK%M#b%X6cWNdb*<DRG
9J*F*p duTGd@p9V&lHB4eE&AFMuQ=yw@B5^F6kEJMVWbIXFFbG/k5k%<TN!ARcB+BElRWCCJEB<AA$ICRAIkAY
-APNDe 000168be754001202b4 Page 328 of binaries2.zip
Kb?jWa HRAHkId&A!aD=lnjAV5Hi*1BjaZAleCDTwNKl</C#wd6ki&FN+X*RAAHSRJHEpPcRq=GQpJDS/QFaMTR
h$11Sw A^@W5MCJhud^6QH@?REj%JIIA#:F#h:c@tJ@8=#D&@9@#tbR@^Zh@\VtM#A1K#B\@>E:+L!+IpKF?q<C
S&wm+y d@ucF8bl8pJ+65%EpEKI\WR\D1Ei@*%=RDBlMQ?jqA#49=WRNLG%6LN$huE!hLF*wuAtFHi%NDH>Q%I!
>$FbML 5JH+@%$Jkj&jqA!/^8ljK?n@dwWG@E9JHAchG8*hXlSE^AmFBbZp@@>Q!an?ZV5@ASuR+KERF8qb$PQ?
$J^M$/ APNVnm$AMRE\FGEG8IY:8apbt=1wt1ww1+nc8^&@d?yy\>wQy#uLLpw9=Nq@hG>aY1QXa4XeyXcnH#1w
I\a>8+ DmG<ZKY?Q>E&I%4qe4IN6yln9iDL@#EYZP\Gwt/klI!ldhVD!@mau9kFtpTc#W#qK##RYXe=<JA9uAlF
P\+$qB tIl9T?wpT8wpVhwwVi$cpd:F/t95NHJeeapGVuYB8GucKC!*<qS>tnH!Y<8h@diCtbPX@C/=J*?T4K8R
P!KWqP iiD54y8%h:hj>i$j?@W!cX/<+/w16>VIAdHILN$kWeW^I88$D1wmeiynZcLJd*&1849N?N>X=lpk*:d$
eKIY+q E6>@e5dbh#!bPy#cuGc:\LS@!*9=1ABt8:/K9G&%Ywn8/MH/&nGAq@ilA#8l?=n9C#w6XSWyCWkY^I9n
RpHTC< =FdK#ktmQn??kQpq1j/HTLMVqbR<M&Zmm@>SJbd\5VByhut1mGT1J4$?11pk6j^M/RcEX1H=wqAn!9$l
9mLV5j LbAGmI=m!tZZBJQXp6D^jt<Ed/PuP!M@5cnJ#TbKWkL+N+HRA1c@hC+9nwGqT!I6yhV8V@FLX/dc/??j
?6n%^c 5J?/q&5&u/ke^#9MZ#eS?Z>SyG8++?m%=@L+M@m&>M5aAA@ccd8Lh\L:BC5jT5!EQIJ@&PnXlJ1ZTb#p
1aZDah 9?A?l@dylh6AyL/Y=RdQZSyiATE9a8yKkhd=RkpY:u+Yu<$kc=I$&F@5BuY!a^S/d6e$^i*I/5LBmjV=
*IR>+e K8SCuIp?4bJ88<b491qQC%//KlY\%ii:iuPYd?Y@DJwX<FmytQ#Q5BS$Watp9e6dwCH#5YWQbZXjFiDI
uRHc^n 5ASb%9&q^+$H#uyG$R6%NSZSSNS!<nJZ4XaD\!8J!%%9=QEL1X%WSBXSGjJjm4p%H^dm9aRyt:LpL?9X
Rq5#IL p>i^D:kWMWV\pL#>VMwc??pcbTk#atj>Zen\WEXu<Z*$*+ZQw8DHj1&En>i<cIXQ#+TQk^W!ewZ*@*E1
eR?$8q n!E+u<>W^KH<Pmlpp*F:CQw49&NLGZNtt+QWLKcIJYLa8bkmWG5k?*q6!Z+QQ4R:l6WlBJtVAES<IZKX
L6D?!= M!EqTdbkj<+#Vb1ALTtFdH>WM9+u/Vebjj5+cI1pE4I1tX=#LNiAXHGKKWMSFB*hZaj9D?<V>^yuH6qD
!!8k>8 !Q*p&TXmRdnCTR&KQ4A5TtJ>Vb&jP+EpaMiTFm:5PKCF&SkjY*AIjTFm?GRXiW>MLqE4!yt6RdanWV?E
N#@yR9 mqe81WFTW6N6/%\nBqe5b4^#kyMXl:jc&4^da/Qyn#wPu@*E:CmP&X>p4FY>/cbkHl=NduMypPKcpK#m
lA/85@ ?hMPw@e6=qHaP/Vh*^uq*K=5\yG8Gb:$G4dqta^yTauHKhHhTeXM>@yVp?QtA>MRAdDh1ThMB!bVh?Sd
yJ:1Qe !Jd<h:>eQB+:C&!N?:L?+DLh&K<NBKR^I@<\1&mQel/ZuCuD\8Z!MIRStypmAGY$9?iC:qpcT1buiN#&
Y+A5@a :?p%<5AR9%M!:munq>1bIdW^*Y:m9%p+Ee=KlXpWTIH%\>NpJCuWmPqPhY<iYhlNI1W&$XqSRXTQYwy+
?<k4kd 4Zcc\wRyR$lJM:dC^I?Q<Mtmwm=kXTiPb<SFTpqJ6+CPVEkY1iS8FBe*5%uaJNL>K@Q>=G4LeJ5:=d=!
4T^/>h @:%G!<I*ZkXDRGnIWVKWQGL*5bXpb@!X5mLDPuXM*:LiRncykT6SjAKBRAB@whm^yBaV^B*\:LMd#C8&
E5BWGJ Q\Z%8\H%&#cYqP<i\QB9ATe6YTAFe:hR<PQq+d>&yNcMW5e^&SkqTlYHTVkK@XN:=caMmD^Xl*GyBTBF
Q+Ii6j tNES&*AS1qGel8MR1$&mLWQQpCBLqZjiGDKmd$J!VmK%wj:K6WS!4%GkSA!+ME:k=eJCl&K65V6qTdbM
\*n\wy YGX5ni8W:8Y&B$PhSkupN6Vap%1ub1YtI#$D*A:6+FF%Ey+4FcDl\u!=>nl/e*wVHENNRuZmd=\hR:&S
YN\*ib KSlJVEjlT1cEWbc1<naZYK1!^d:4Hh!?^&X95i6LhDDdZ1W\!cTlXeiP=>?XqEyL1C%9^8wDXbKw4bSK
#@jTpW 6*BK!Kl6=+#KDMBWPd+Q!y\%NK&EhWD&b>a\6cn?RkyY/YAPktlRCp%l^^H%<BFteY\yen\Zd6bmp4#Q
e#^5*i ?WWbV#@uZ$==H?^N?SA5ML1c<ah?4H*dVj&GP\ppj8\Au#/9\CmVqyb8#5Gwpnb^^/mSNqDG1JNtV<Fw
%/AQCS pB=dw:K$k$mjuhB6c=@h$Ety:E/y:CIMWbhY>cTSVt^S=&t9QLi1HThVR:D8bRYQEWE#+8B/ZbM$!VTA
RCP@eh T*S&u!E*EPkLCAABB8QI1BXHbi4ple*\1jyF1^M<InRXby4ZQT%&@#9R9L*Z1TmKjI!jn@5E/&$!$wcu
mWEce1 d>*&bIXN&<&M>pWdl*LW^1cIbMcZLyB:JwB?^:il8FE1YteC@eqLT$8HBamP4tS#&yC&Z111kX$%$DCP
a4:TZw >VEX+=b<Vh^/?9m!iuAy*bHlNJ/IIhGRhEA!y>6#QA6qqAappYmHP>+K?W8e:Q+nT4ynek6N5J:AJN+S
TKyk&5 @EYlB1IG^d6/SG^hCu:CT4PCYq8*8QF%Pnq^y?W/PZFKt$%S&ld*=a?MLREWqC&?Lq!#H:pZ=6TVQH&8
bRInm4 Lp?uh$@KD9w6#FAjlmm>:Su@!h5Piu&#nSFP5^6&/mXwRMTGZ>V#*tENj:<aaSF>:M9B/59H%@jNVS56
:y#DLZ $Xh$6MnKwMePp#Gjp<\\weqEt^:?uh\t!yF<KdPPSm+c\6eq*KFH/^@d*5q5DDaw#ZYJaSZpD9wXdD&H
E+8!=K ?WBN5m+mk>RIn\\L5pbNuZT!AV*eb!mZXGM6KI?$mIXAjdJ^4cwZZ>YHR1t1nBFXb=mJYtbXb/1JPyB?
VZhpBV cXZZJFWQ@w8148kWQWT*!pj%!q+*T%W9=+Xq*X&t!t9Sbj$Jc1&1qpuX*?kSXuZRiKy8ldMa\YMTn:kd
bwT6p/ 5JbkFBFkI1!Np!dp<lN+*Qa+l4E/*bm9&bn>dlm5=#b@:#GZ#VHd:nEHSHbEm#CTyMjcnbG=J=tM1WhB
Y\i8Hj KCWy<5nRW/X8D\uAB*GKFKN*Q9%=Kp1TCA?n8>YmC:!c9P>9<+JDFc*@J8?T9&qjEmPhH1NlQMaH^K\=
dG>Q:t nBIF\%yuey^8dS%mtXTcapJkKXQRJ9tpC1aF&+^aMJXSt8yXnmZq8JnT615YJP>c*!?Qb=&Ntb+$Vb5G
?paGW< Rw?l?Py$\1IcmyF@lTG:RMBYTd%KlqqEJ^9b#>$AJi>YH9B%kQNbt*&\d+q:F<Icu:SN&&i8>:16#tPW
/Y=HHP 96E/i<eE\q1FV>>$mP^<4nA\aJqXYh#eVi#$PGZ$SIejSVebACa/qIFwNimNJLHW1W8X/PYaDLLPXyy<
Xmtl=H 5GTjw\SV\K/IcXKtH$$XA>98Jn1$ajpqXLPiCyCTh<5b5%/K/YVjS!ZGK\pu:Bj>cnZb4\/1tdIi:Q+6
@yQmX@ RPpZ?#HtcHB$%i*$^!K\&bilk!u:KXn?lQ%&Hbd5t^n==>>LLBdj^$Z%AD@FuhGG>N$J^yFYn%#FQTd=
Ie+ki/ VF4anM!@VPd<6EYn!S+QEuWq/Md$B58>C?ntypeBq:i9uRSmjSQiHhK:5LGtT1A>wbHQQFZ\I!w\bpj:
1yNH<< 8<aN#>\p5G1YIt\e$Y4y5e<<q!YD>B*C6HP?JV?cn5lRuy!lQPpJZ$!/e^*eBC<9G<b$?GP*TYjVaqmC
/RNWtH V\NuiFnqA?LdcqaKT&YmL%NLba&n&Mt@4dBVYCu@NSXWCC5qX8VM\WqNW9$VI$Z!T$8aKcA1qJXCT\A@
nk%Vnu mNDE+iFlH8Ei:8Hl+S:@TpVEj##e\!Qe*h*h\!MmQMIn#PN@?9/u@h<An@>H?J@BGStb@%9?Z#\nI##<
!DPj6H @?n@S@@9@9?inI!I@!XH@Fe!@96jlq4YW$Iy9V+mT>59V$FAKAkKDqV*pZmk#!A!Snie*Z<mSFe9F:y#
I!<\?Q wF6kMBTX6/DkAB8cGG*>AJPlIDk@**B+wF?\XqAW*BGY\<JWWVAMZqWN>kTViGHPIA/S@tA<W5ZP*kEP
6qm:V6 BQH:G>Nl&DBINAKdWeQkRKEP99+&ZwF$&*AHlCJJHdY/YpClRGkaDqZAwAXTk<In#D^eaj^GGE&<5kMK
Qu4$np te^&A^&!1=4D!D=?SyBkB=\1A9Z?CKpXdLh&/R*?Y:IpR/adFiW?GQtSylyppKV1:yl^\tkCG9XmHQTt
:8Dw^B t5HI@$pJdty+X\?9aJCcbRkn#NBj^SRXT:Hq:\:iFeQjklSMjAL<*Q%BGHR5Seh:jM!1ITyKTpkPTtTE
?=IMj4 P+WcB49cYcCWTB/Buq><@IPX1A/&=HjZwDh*&Nn+AELKJm?qa8R=aP#SY1/WduiCBc+pe6*5EGtnSNnP
NA?jEC l!dip!PyYVuLkP$CVj1ABC:QmQ&mmX8*p\wS^iMT4dJGE$VpymlatK+l=eF&W!F:yF?^5*A\q\El5dma
lK9+pI TqZyBeVDeJmWG9NCwhHIqRaGtH%>c%AF!Td/^DhRIelI?e4?=Nai8AptC:M6iMCB<VH4WYQi?LBHFhT&
i8w:PP 5iE6R$qV=mNX1\Hj1CmLVl=!^XSckL#A+cmJNiV>BWGR1FbnlydMJ/i>P/M&%l!%#HDE&HXLJkhTyFKV
HTI=uC kmp&>1%ayCuGG+8dPTFJI\\Q:4=C1^6B5F8dA!!eLJIe\y#Q&uyP8YQ%^K+=/E81bpwbKL?6SQepCSY^
^>i$A& WDGuFNRAYLS%=dIAemyC>+@eCJq/$R@h\FdkRV^/?5+h@nmqyqTn:Yl:>?mWk+l4F16l%M/l&9^J<&^G
9T+FlF lt=uMidWBi/%npeDF:jJAGaw*@A41PJa1Gn+qLmneBF^RaM4+mb\GSDm:6^!necPNmX+*X>\bP6B#PMM
QV>hLT pq%<6Wc5jQnJ!>GCGchJkC9^SKNCBQ%*J=njFq9bY?Yh#Ip1tSiu4BkRbk6+B%5YGk4=l&jIDuie*VpH
lJWdAw YkXYS<Ij9^A8R?SX69C\41%4*P6@XCJkjyZPid$ynEK1lHGEcl&bSTJFeehQ4Du\G+Tt!ccq5+mlcECA
tIHkRu 4wXRXZZ1@XL4&PayIQpVu+/jamWY5EGq9D=ueqVQIQRZu#6X9atX*kjlk%$bkn#Se>kV6e<4kWK5b5tI
w<FkIS yq#MIajem!iI$WIN&56pDAK@WmT:HaHu6t$NZBk=A\ha!@Pq#=A5qAJETITF:kL19IXBL^>bE%5+#54c
q^/k:q N>1<K^&S55qdJ&%WtHD9YkEl$Zb&4HVyDNLpq666RidwlTlQRL^Z$dw^V<WB+X:<\KuGCl5>m%mFYuw4
W9pZ!c :4%=?BwJRH*W$KXpJuyk#iNH4V5V9b>#jTqt&PKk1NT\dAdy9Fa=dGKmnEpqX>V$w%/B6Dh:jFR&n6QK
/I*dJd S4&QKX//IT+&^!c?Edb1ppGZ9W=Cd8RG@qb$huGWC=XDhqwP#TCudCheW*QyFK$*BI?4hhXbItJH?@ec
SNM/d+ 1FG\tYBnIG<m8qSQ6+@:>/Bd?m@B+Q9V<^!lIlDF/IdTy9MRLpq@J4MK>l+<R4B9M=l!VPLje8#uPM?u
Fwdq%l 4BWIlqY\Wc<CK9IGFmYFAR!jub$!@wN4Se#G\d^PG>HCGPba<9jRTKDyD/AhajcL?eaR/1#e#F\%J1mS

-AGJBh 0009e3f4049001202b4 Page 329 of binaries2.zip
==WMW5 ZnYXdeBWw6&?^uE?9<KJ+bTLb:WRN!\>dynA&XmC/!8KH@68ecL/T%<>eNN5*H<#=pF?qK5$uQdu&e5b
*j549m uaCquT5<e9&S5eRb:m@J^$NHSJdechWFNyGJJD**WnLZ+<XenL:e4bS$5Vwuc<6\dYyX^jcED+bpBmM@
bXEqX/ lBYlul+ZSy!P*&6NkT^&WbhCP$mL::QXnD4YE\mtyla9:*YlcKN5CY>YhX<#!VT^%j%FdnQ5L>n#Ccww
P&dtQN $Y:hBHdCDEn8XBFDDH\k@l1LwQF=YnC&tt+6+^ckG4TRkqd9a!:Nq6SGLeN!M1Gm=K=wCM6L*q8t8$ZD
:HHuQ% y8T8NFFbQ\CDe5NaYq\$:ba#B<*yTTMFAaTiMIYG@u*9bWaQCSH?^P>E#T=G:YXbXXNm$d#u^X=911pN
!?1/+i y^+$1=bXBYY!Ftpkti4BJLFCDiJNliCD<lk*JPMb1:RmRmyZCcd$dk<eN:thbd#Bt^C4w/kh\T8N4BCc
hA9&u8 LHajM/kj?5kVC?VqNJ8^W=C$pl\R%watGFlt1\c5cEmkJGGRcc^6P%hAPWJ^RH\+iwDKDaBH*ptkiy1X
kwT>LT RH!u4DZ^ey?8Zhk\$SIaWGjYelhtHWyundH4Jdw:iWdNEldlyKi#>Fk9RJCMVcEG?ZMI:b@GHknbh#cT
EAIiWZ S/LwRYNTR^<k!5Qcd6yaX%9>d9qDBD4ekX<5B%kG+wIKcJENJFMlTDcHITFW6KEj59LEC+SCc$+1RB6N
=8bj%l &tW<kiC8$mZL$=N$CFHtkC!?BR1bnGWXwk=\dp4C9SMyuJlLbddTEJt#GDPLCw<iy6TGS+QJVbVFyLVW
N#\GCT an=Eh&XkhBN!E%Y1FG9DW1d4^^M#WeD1DIW&IDbSm\X8Qm=u=a>>=!!$q:\n?X5jwVSmiW/D:KSw=RFP
mInPmT m%mZEDyTTqFlcDTI!E!95nTbWlLacV%T$84&^h4w:/p>$Y15?VtjH4P1+tA9^MbBCFFXtIn:1wKG^Ww$
S!Yw/B @>%hcKaNHj4a1>%@/tQ=dG%nSthaXeKtC&XIpIW=59h8Bbat+6GZ$EbS/XtGL4ClSE6N&SP$l>=JSK1*
PBc9i/ VR8%FkMqR*w%nAe:%+AJSSp:u4t*$m<GD8ynt4R&VV!@/WC$J%*eZb5a?XLlWC<>b1mH>eh#A:XBmm5>
>nT=\u +R=T/Snew!N?tmw+$cI>6+#a5H<by5tt%HlZR&JN>=bTW1MhiTYRM^TJ%1JIqcqjPm4&GlX#W?k1kS\/
AwN=$X 1Lq&1/InL!b&N4qku@IQcbH*PC*w5&l/d:>u+!&lLbWN:MKVVp/ZhAmnYhibJILbB&MNNIjqc?lJS9q?
m1J::k $@6l!hkHk*HkuL@:M%9/<YBy&!PZk6PIc@19dhm#X4K?AZ+&amWD1hH?8PcELLMSZWy/MWhT#F!9D$6w
S?KS&a DZ=iKpENc*W1qqTkiELMJM@TPaEe?+XQFw6\4hTd+kVIMk#@Tw%Vj!9teeT\Kj<5pbwJuB/<NCHZmL<G
JN<GGP /I1wYDuWQyI1l^+q=$wDCkl^I5FpJdlBnMM$k%I%mFC*DJ^?Z8X*<+n*DcK=#!eq5E@&:\N=?NE=1aKB
/AWliP L*16NitN8T!ljE\YBhFYA<kFW9PhjnS$:aAA<y:te5:qDqR%n9Lin==D+HY#hW8Z>!tu^VZH9BCHa?nn
me>DtH C66M\bq$dnHSc%jyyc=Ph8k:G5tXBLqQS#J=C:PK8DqnWGCEa9<LN54FuejEm>=ynICDZKQIFECG#=!5
bYlJ9h I?$%a\APnc9akw?c5&V5^H1qKXKQCnV\yYwd/tmRXFL54w=1:FkTSLn4BXZijHiphu!t*ua/Rp%u^=D1
8Z>CLq l6XieNLul#LYWCljw8u:@5GGM9aYd&TAq+aX9Kbc*F!!&Vk$bjDP1jM^F5^96w\D%TZLw$@Qi/RGFNAl
=F4d6P BTht4t%tQBeiY4b=J%TI/FB@^<ipe:>jB?5pE:MJjR!FEPW*95JJJA8*BRT+N4NM>KIX8FXFnu=e4WbP
e!Nm>C F8Eq@pFe@jpHCqH#pB&%EWEl&?5Xqa>#qAIPM?pj4GuIW$H/PKh/FbRhequJpu$NkZ$P\tZ#kkeqjP5L
#:wHci p64pSdI*XbLISt&?jhy*^5G^lwHS*lnadM^W$kt!=Ctiai\YBVpX8&NRD%Yj=?/ABG@b>45D9@D?Tb+m
thFbn% VL=Q/YceEbI56Z^!$XAkCDu!=hP9=ui@dKGbMRZIDSCYSSB/9NG^Jp5WtF9H^D#y<\nq\GaDK$Xm\e@?
*qjXI/ u/j+AaXN$:ESPTwl?NquE>L=%c$m/WPYkV8C>Gp@B:*:R+YaR+t!WHGFQkQl*Vd9hjCI@F^ZhIQASM!6
N6&Y6d \hb\LP\1+P>lW5Wq6E:FmPaEbEkI$^>9e$N&n1DW/$J$FypT&ncyYmlK1m<&D=&^9JWbhWpTTYckS/Dk
/WlF6P A<=Ayt&ckKQqeHeF<=LhAXuH<lG<u\@N$IR5QZZNwENTa!*%j/j1LbtaMZCLG1X<EX#bJAu$Dk1n*\%i
YE+juB NlFq^YmiXdymm/1AEwpEp#JY5#MVp>MqGyyP>w>=uEQj&jDQyF\\1Dk*w#Y#TAw#5EFen8pTDHAQdG&<
1@nht$ LM9JlM=4t\DH!1HIXAk8nNNj%^PXu1Y^Mjat#hy?h\eukn&GIyGFb*ZLY<S4?&CDt?I4I^JpYbDYh=8L
d\8N?Z PaFlX9DMANKek?LmVFq&F?/cq\^T@V@PN=C#uWH*\JbBHHEAXeJ/btGcSc<c\acIMp$ieipDJYGBSiCL
%XYMi? 9PLmDK/TtcBqlcm!!LZmu:<wm5n%MPAjD/RydVFu#D:LPuAXuI$t:6&+>/b+9ETwZ++FRLj^b:LIN41!
tuy%SL a91:$XQ=\68I^^u!E8qF!8A@p$Sk4ahKDJqDbXXC$d8TJGhC<\\Tc\yK5BNe:H&iIh/mm8mIF/1GSBZE
6=%DCS 6X>tMlIdhqjhF@9VZJLhSt\#!<<HWu##/M4P6KM!qEM%$*&lDG!MyplKYlZS8EnT@LXejZutCpRnHjnw
lYBHy? Nw1qhH$tT/caCt?4VW8\5WZGE5&a#<EnETRM9thGENtqkR^c:+pna#/AucpmBZm>&Xb<BWaeWAMWZ\qm
qjJBXd pXGn+NERppPK8TS$Y!+5mWHTJ/Xy4Pe9+6T:H\TX=W\!ND6FEt8B&CWNSH/!^miL^^9apB4hn5lcK9CK
$E+*Ap @15eLA=e$aEZBuIl>P6<<SKWKGFG1ZXhBlQ6MqkIaIG%d599$IFEndCiqD4mA<+B*jMS$I:A*MV+FSCP
k/*HKY *wFNJXT?+Y5*uw%y9ynkAwNPqR4W84PGpBkq>JYP@tEdp4/FPT1dPYtq1SBbIXd66+1M#V4X1RLRmSSt
HKK!Ri XyR\l=GW&8dqd6^Ywt/cCWG:<j$@=+mq\AuFHeaw&>&mV=?jj#6GwLZb^/wmVywLm8Ae+$bw!8*WW^tt
>=<jL9 Dki*wK$n9tVqGcZ&M%&dIuXeGNdAVtJ/ih:6u=D9T#JC$*KeGKNjWKLZ*Pie8VjptWmp9dAkD\H%1*:I
*huZC# I<\=hINwb9Eml<AFbpRk^A\^lthpVBeJjt#Id$tTdlaS&8IXh!hMmW$iw4L$XQLdMpnQtCk!RPu!Awe&
W8KqlF JC6LPnPG%upG>$\JeeH>hG98FbAXR*m4@a6\AahYa4\T+nEVYlYT5@#J!u\LTcynu\$6lZTwCVN^#d^#
j!W4Fw E^J4i5I6Re^SAk!@etQwk!$ddqV:Bh/HC#JEdA^Fw:ldI+RpKP%5pyd!VnnqEc$$LWHj6=S&LF^C??kw
PR>4<6 kVM+y\/SGnAWEht<ZXui#$J@?VInjHapEtkTnh8qRA+@!\wdjFSPpceYiMD@C+q%?IS5wEJH+mS8qXb?
XIaY&% McKSBH?9a5p$Y@ab*u8D\6&Qqb5!1P^6LJPibp8*ADbEQVjw9VT8\hPa\SpdaNu81WWBuC<Q^LQ:^FeC
CJPdN4 *IWl/!@aeC/!E^t$SwaSdXa&@yutEiny@L4EcRqaJBbQ8iSN\A::!*R\EIc+l>F4\+VTE$RnwA%VEP>b
SWjCu\ $NWjN<%JAZKNYyQ%qYiGnYhBYP5mAk&$lnQP1!$m$WhChB/wpR!1PmAYdS1\SECwc!Cy8X>aC6YamKD8
EVF@G9 C<G^$B+mYm#/pBynD:Rw6Jkd>ep4i\M>pSIlMMRGWii4PqGS4NyPh^TLdt\lGcI9k5yG^KSMn?8L<\^P
nMw\5X <YiAewQTDTat+k\ajyqa^WnlPFyWi5cA%QVpuMDVX&1p/*LiJiIBB$^B?>:lNHjR%u\tQ&n?&9NFV\aS
Sc<V$E Bt:JEuIn:hG%=WnQhinIVIP\C#>=+nZRZ?*F!5$X:k>WY9W*VX^I6SDucH^Q9/:!>8ettFRcI6IDZ54!
ZX:+9p $FiBMbuBBpEjL@LRb!SKTyG%%5TRVYw\CLP^pe4WLGBm\BG&V5FqGqe#6&PTTnRX?e1dpwRY&15T#LE6
X^jndM F>W#R?W/8+DNEt^My/Mqw!pP#d9jb/+D^RZ4YQwYyamhDFuh#LFY9h>bb6li+:D/1Y#R<LnS:$WHPVXu
Q?N^dp nBl?uiVy\nKil++$QQEE8ldm*8N&Y1K?GNP=$GWQW1kEh^Q4Sk%lI$M/ZZ+6Rh5Im?YQPDy$%V\6l9R<
FRbQqe bJDFF?FNC>M<YYdQ8$!j@iG1TKe1X/u:Zb%ATT1IC*/H6clK:ecLEqLQba@>qM=Z$ca\X6Jy1=<*qD9/
@*e=>p C5jwn/F^WpRKTQT6k:9RKIIZ\W5yPtLH%y?:SVDqK5^HNBkIl%ZDl<*a<D\Se^CAeBwS+\&&GmVKlSWY
p<Xl4L m^bJEl>5/YPFMeM@8BmnwBqY8#DakmnE#eR8kaVL6BFGL<$i+ii%=jQ%6m8A*TT5j&mt*hTaGhB9HmjD
A1ytyC MAFGV<b=d$RcmqVi5\qnPEP?HAwS\YK9tEi6#&6NA@*pGt@lie>5W@&T8%*5bbHY$Dhwck$dT&16!BF5
JE5ZQ4 BW#LLXD&#FFdTP<9hGu$%NiWYVTQ+WWqC<?ed:#Aa#imct>W#$tRQDKq&kHKnc*LjZMyWy/!CS&<jbMR
lZ4J6e mIcHm$:Z/enLd*SMVNKyJV61=Pdi=VV1yp\#de@YBy?+&HDaD9@&#:WKcNMqbFCnc*y&LN85RtqRa$y%
lMPd#A 4EuquLpc/Qd^M1F&*WtNEZ16VGHh:59yc9\T#pw8JDHYc$8?^>&RmXCy!A!FDZCCa8qWGk?lpy/Nbm\M
=qu1$c 86h1uLnNX\@um*6Ld:#TBAdTHqM9FMwCY8w*JAEGySRX5JN1Z%w1WXXDy5^VKIc%<!aT5FD4CkF&R>*k
c5%*TH &bn$whZSdyIi+mwcW8EpS^Qht^#EMCya*VBe*SAFS?XIIE<wDIRP<Au\ktYRBBMh%VAQi$$Lh^<%X=\$
Bu4@h9 #NZX*<?I4Gjq/S#mH+\LNjb^D$XqeDlYNSRcl5QuIySw8LRqVhiRkFhVR+@Qu/Emw1^KdI^TJ5G=F^KT
%PuFKH ?pBYNt=V:JM$Y^ybCk+:R%*GRQh4Ywe\K$C\Mq+W=!66hWZjJ5ANBMcW+RaX!t^KLBBND\5uh$IE!aGJ
cwa>\d D=SY%md6a$p/l*kcjq^k1K8jt^!QpbdbFu$C#c&<e&>?JaeAN#MQbAkMwRIF:Td1CRSWFcCVtctKuVVR
cF&Gce SXbR$ecT:w&Ty9/?KEuTwNRCa/??iX/dic&<V!<@1:#QR8VM8Y:IF>S4KliRu!yi&M$Z:p+qAMa:y@LC
DWicwK DLJKFBDRZT+EBY&kca!RNA!D%+#JEeMVnG=QH9%dC%MuM+mVA6dY$>AeK/XkeDFE\eRTbu^BES+R=IT=
ekdK\H k@i*1LI/Z<MbS$6BRA/?cFhNi*X55Je%ZqLdn*nq4DP%MDY@X>dWMYLaIdQ\R!tIG$jwE=YY5y$TW?!b
p^>+Y! k^&T4>KdY81!Kb6VR6#AQ#5%G:KeXamqp6$Xa\<#j\Gb!FANSR>uJ^VKI%n@kyiD1wcq>$?KnY!Inh6F
unF#ZZ 8!CTna9SyTAF9VAHBQH+pla?/=MaX4n%IkuJRGiY5ba\=t1=8#ldP?pVBHt=SHDL/Km=I$QphZY<=RYX
-Ak8tt 000d8b56e36001202b4 Page 330 of binaries2.zip
E1!mBR FLVybC6@^c<B>kyI$yEV!diu9#hwSJaGlBRP%:JZiGd8R4DYeh6GCFC!wQ5nqVT>hGZ5QB&8?Rb+1=mw
qlB8eQ i/kGE!\<!BwTD5/T8II%A$SPSJ^TaHR^Z!Et\VTIA41tBjGY>VTDBjk\@NW$!jyBttd&V6IlQ4bPn6:c
6F:Ce$ CwGP/Lt<Mc4:&>5M^a\m<Xh+Kp?ykmdK!TlLpN*lCpc?8IYIKMyG&a#IBW8b?+94tBwFPPqnnE<wcSPq
%c^K\\ QHVFLjVejE*lyB@AiP6#*5JMVbDFw!*>5np1wWhy#&u1V*yXWyMAq#*@+Ad/9mVyWGq!W1PD^u?%!8pJ
L!+tGt ZeEmA1/m4BR6>MRWJcKC=h^F:NS6$T++$5L/NRp9=\>a^DD%pbHn8^5EK>l?INaYcK%A?kiRyW8iBE6@
?GIbB9 NY<dcT9Ck:PJDhYlSBN8kZ=Jld<I5*HGG51VePl$\6X+l99yIpnw+8/1^+Ym+5L6cbBRKejS\u*Q4aJ%
=$ekIV q4bTe%Ttpj&<uQ\S?INL9^AkPS^CY%Jj&eiIdEFVCMed$T*DLyl=Ptu/!i5aGn4?6CYwc%klI1I\N\*^
t*8jD$ pH\p+*SqE$5:G>?1tnI1=6lZIC/W%yc#XM+XRN@bHA4ZeQS\6yZ%%cT+T8FQNHIKP5=dDmtVW8=WKMIW
>VXH=q AFEN6Lm1m\l&>4w11Yd9=mZ4F8Bncmi9/P!JhFJH/nkSelJtbl=aI*hR8up+SXV%mN6XYbSJmI6^kM+Q
bNqMSm +P\MAM5l=1eZ>l*$X4b@m!wtKFTPHaiX8#QKC!9unQE#ehanal@eT*yaw!\?XFG&HESKFcaR1K#k:t+G
<1qapi qRkK6aKCn4*T+!1DawtMK5uE\J8EqLM!C6i=+8!LX>NH!!li6DG!@WJ%D\&F:#$4HCm9HVwFJ@w48$Ea
TqHeqW lW1<Ka*eSH^kpi?j8wi9yKY&wbTYK\tDBm*R\Tk@aX$:hbAd%n>a#EJLRW6Q=idNt&IaFA1uwwNJy8FX
NJC@qE *!C<LB1DTY6^AD\K1+dLI%ZiCJ\TRpMhnewa+mnwYe+\WDpknKkK!%uQ5KJaFFwb#b$TNW9nT<>#leWA
XiTJDd Gyw#WFEE!5LMXll#um8NQCIq\dD<G#eRZ8RtN@N1m@b9\<TnptBL8RqYh#qZmM$AVTGtw<PW$hMeZyEC
lSk\Ep w!\ak^%cIA^64!piXpjuRMm9THDdIIt18b*ERCXSP$F%Gkd:tdpEq=LqlBL>=!Lmt+iWlC#G51klMP1@
PZYnI: y6TF!#J6hVL#TuDi$Pwh*pyj^:bJiCeKM+8^w=iWlQ8QXdh=wJh*4wiE*L1We&ZR>DQw+*+91FTKdm6D
$/H5LQ QyQZkh:*D<?4KtnV1jJGC+t@?pi/w$XMm6Ju8NSeXq/H614Ge4BGESaWS/GwqNQaXi@di:T%Ybb@Q:NK
4T!TKe 6Tl^YY?\Q\CnSSZJ+CY#J\V<&Hb$Q^NSaYZ=p4Q>66LHW>N/mhA+BR9aYc\KqHL1e!@b*AIm%\<qk+ZN
KDD<:& Z4c@h6lXcjckWka$>$YuuL8W!GlJjq=Ld<+RW@&q/CKE*Y?4FWB@b$^#pc:yQwFd5VVZT%tP1XBlADcW
19i9MY DjI*/!H+I46H%kWBwSw$Qmtm#bNCZ@+Ty#+VVi#8mWeZw=e/N9mIk#bA?IZ*ap6k%9R=^GcFDdIc&NFd
nbYE+! P<*u?\/V+G>Rya=JcpjSK<d$dGKWlS$JEe@up6XA/Qc8E/:GJte\6LjB:\QZq::R@<QRpbpTG=GHRuEE
Gyb\PY <D/Xu/$Q$4VEJq@j^b+:+W4L\lLwkHQXd9e:hHQL^Y1TA8^kPV>QjdFFX$:%W?#n5uK$di9$PBlhli\l
lMBXw4 YLL##\i:k\bECdnh164LjKm<KA&hE9w:VT:bS<SnW*ChPZmq!VeI1H$Yb=*KQ&?*KHDu=ie94TQ#Z<:j
=Bmh6W ipkNSJ6t<n:LdR>&Z%ba4YJi&@j<8RGqEKLceat/8pC\MwPhGFdV4*MN9dVaLu9=kLQA^5tHLq:/hX+8
NKD@NV y/I!VmN9Vj14V1\\bHu^akFWA@+ZdC?/>hj6@441!lk?Ze!y#$wjD+IW@^n^T=P!D!l*144*yKk<<%p<
ZJX9^R b#1+wID6NXPP#=@yk>8b<RX\hqc:R8VnyC5yW@R@!@LJBW+jkpjYZTbXbl&1T1bj5Z%&D>5*=TicwJZ\
h?t:V@ W4*8=X<XhTQwI/M8?GJ%>b?@Ft=Wl!cqL^X/8=L/jR<GGTM8Z>=#4iM8b<J18+w1M&#hwnduX*a5!EcC
<wBBW< 4Ym:9Zyt&a#i\mND9K=l@VP5!5t\*ZG/j@J$Z/qZS51n?RnB:bK@h>4PhNZHkH<l%AZF#1/uul5d:+KW
9jCwN9 Si*N>?/?iSR>YmD8hpT=q+==*ll>9A$W1MhM@VbVZCPR4HSESJ:R^!dbADXw*Mp>c1GtJ@eXH=h$qd=D
S@j=WH dXZ@m:T/XZD@+qMyG@\VlDQ1Ll8*ubC@?&wP/%*uXww^cb%:^a6C#hy#d&EJI9!CB\q:^cm1TuD6petd
k5AVei E+pqhXG=C:+6RS1EchG<cc4*5j*:d<IKw#ln$1^km?>KctkAeQyPaK9B??:Kiwtjl*AaM!tEq*=A6Nt4
S^6/m5 6R%1?=D#\QB?@llep>YTQiu8H9KZ6B&b5&R6=<aN/4&!yly%*9M%FR5dTIqA9*bAb?9AKKQKSK6y&T^L
9%hJR\ bDk^=DWQ6hQ#$TLm&B&clPHWB6qAmj6TtJ\d^C<YQjVBwQAePLu=FQD>y@J=ZW81nHt%AFC95MKSJ^%Y
G8IBYy JCVP+$AtjpYB65=6e6!n%mhQhCmtNuCuNMJwc\pk!/9KpRqDS+PFCBC6WQ<pYK5/YtZuRTK?m+!madHJ
#@VGyk npeF8u!wXAKZIMNwy#/aqib%ICTuyl^HK>&%Fmp>eb8XhFh@Niy:+jc5de8GTu^KiEZKcdJppA&b1+uy
>Yh+k^ XZn+q<!?WVIMXdlh<kGD+J***j=c?EFnn%NY6Kp1%ypucyj1R?FNBG&Vt%+&iw$j^l/QA?EAZ$nbQZKy
8=n8TW 8GEBXDAuRqid&BHjdNMtQ%145d=n<@jqJqhyIH&k%y/nldB+pW/6HT/?QL>jNPQPdLPed&BNuEmm9QqG
j&tuXE YIlDVd^#d^>Fn%+L!=E!$X\m9t#E=<RXPmW/b\B<Y@*#>wCu1@ytwHb:$5!\PqqcVQNR5dJ+t69l<YT6
+E=wcY G4Q5YLTKQ=@?SE^$Q<ha#lqKebQ1NFLLbCn$IT%KIeu6^n?TKjYAD5:L!hc<S9/GJ5pSQd4kS6H&n@V?
8FZG!S aY/9@6F%EQcSHme@:j:au%&qZ9NGS8m@a4IJmPJy6I/qIj5QMXtwecpkQqTqE6mElVPa+A/6aEbj!niV
&akEaa /b=PW#R^&Mhcl=*/AwCit<G@9#+jGP4!%SXqIi<miyhR?@A/w4Hl=Aid#Z:1LJ&KT!ReXiGJpmIjX6&9
c/@Qdi hT8=IT=h4$Bj/%R<Q4kk@wktNKdZYVn@aFDA&NV<?Vn16:<n>D=>>D<hB>FYR4>/KlLWQBNqGE1&8K!E
WEpB^n HF+lw\#RNSb4lw/B&plTTM5XHwJAjS9*VNMJkXHJuyRHHeSpPJ%LR%t%:K!PlnF1QJY\c*@YMYdT@dZu
586J4h kwm:8IaZ&JJI*n?8be/b:P6wP9n4la?WBD1IkA!a1c$S?RXiV@XbLS?qlPV?SaWi^dd@5/Vpw6:&nVeG
WF=nJA EK$u++$QN?AiF1FC4L#%t#Nnt>FFQSiQ>9jHAm>MtKZ9H>dEdj:FZFTdS@*!Y+&Tuw15Y^W!cZ*i=HXX
u=qPa< umQjTX>=>XZDycNS!JXGAZ\96%$Mq&9Xa+#b\%:SC^&4Q*+B%P+<V:wPVE+YqRRL\T+jyMu9cHnH@F%F
c4JDCK $hij>6!>T\DRdGHB8T6cVHhF*+d$PutY\#ZnW5R9?m?S&Y58=qKqG@Bb5<Y@u4jl!<k=WGablqZGK5jq
BFDh8L c<4NZhFV*daLk1%SaX#jXy#LJF>9c6!iLSItm*8Gh6</HIZjWiSRuI8=yHGjtdF8LVZH&#/Ml9K+@HQE
t1^qQ$ amKjYXWwGYka9>Yji#%6>K%GVq5k&uLyNS?Y:#bDC>ubmVPl$PYw6:hNGWu+Ae9?FKiP1*=Al6kSBuHu
pA^pp> AI8%V!Z%&KwjWleFFS//1ZWbem%bQbPe*cK5*ZX\p?+ad9WK*wJJmp$+PHc9tIP\8*KI*KFwbjji*8Nk
XBy\bG F<$*Fn*tnja6E!ielRHHRw:J\n<*db@*VFa+4+*heL?<*E6<&?Bt9*h?p5:jqNu19phY9Y/%nj!$InN!
AP@1my nAl+ty?qpKS=qpAC=^9K@5!eSImK=CjhVduWHqbaKmQTwdmtG+yht#LmJD?1EQpk&>iTLq$Kw*$D&VRM
Y##H%% ^pFlVP@HyGY!c*$8!#^e@/L\$p1ld5@QDSK!*SH+j*HhD5DC>n#a+LF6&:b6&#:uPdb6&:b6&:b6&?c?
hjSqWk *:?#5#6:>b/tcVP>t/bNE*H+H%XF9*p4cSyy>JGYDan8:%/>R\:%>bM*pNT>+W@6Gi@<ueYaFLn%uPu?
pK?!p< W<b4L68e5u&4Bp#ydNT+u^P#y?^@IC$GR%P44KM9RQEyWaP>XNu^kGJP94\hphyFC%t<GR#!e:9Dmwp%
YhJMN5 &Y:k^=#Iq?+^6bWddF^?5=DaJ%JAS^Q:V?P8MhRju&V66ZnRH1+hp?kXuQ=lSd=S8#y/u1pJJwueNZXc
<d#n/k K$dIPEu#ImeDNRi@G:H&nl:w:=%!dXVTKRy5<pqJBLB*FiS>LKXmW@*WE!D$Z<ii%iPJ1@hy!tM6F%IL
Smh+H* D%&KZNbY=cy?^ZmyFcWMRtpjiiQACAcjlF:&nuL61HN8a>C<Qq+P46!9/CGEAP9V6*tP/MtLGn!?=cZR
i>cbnd =#>V=8Jmimyy?DE=l4VM!>*\GkZXB$RC&1AQDAy=*u+KXF1Z%q4ShyJ?qFbVFP@Etq=Q16lawj:PE&I@
+l$mT! #EqpdZp49Vh!8ZwNp%cRadP15$I@ayKpT:dPS/h+*$quetB4VWT=?E5<F\$h4@X>h%AMcWPYG#:dAZEB
wpS/Mq e<uPyRH*Wp>WJiV=Jj*8?G@aQh^ZFhk+>q+>?J<1e\b+j>aQ>BZR+GG^1jp&Q$Lt<G=y/4!1hKh&HSFy
H&qBp8 l#&A!tHE@YqYMcBY/@JqcYRnp@u#5?uZP+A5LNKk\J#NSBDCR%T?=N:hAa8$?8&:W!Q68cjPV=?!aGaV
FcEKJC =DXh+Th$$+Zn=\CDXu@>XFDc@TZkF@JDYuc#JVnaEWePE^KZkL!H<SJGZhluP!!VelydYP@WkN\/b$^e
n%Dmb4 JjbEAI*1>anPB5VQiNjH&+#%#T$!bPy:BEql&cBplFpT#/YZj!Y?G8bK:W1S/Ake!9a&4*>KAC*ke9WW
1plPm? N+b\VBWITl+TA!@lp@:mcB9\cVbBwhaQLumKZ%+Sj5QClmj1>Ll$?hBJ/N*LS/Tt5Mm?1Mt^+6mEd%$Q
w4uc\R WbIb#=8>QkL@iVX@BQFd+PlVke%=+HTK9uDKWlNRLG*S6*^VNRdH/NF8LkCuK+9j15Hk!&bBt5DAPqY/
VE^!Q% Syud#\LG!j!i8PYF:w66\JYm/+G>=juy=aYKB%*b>ET%nDYT^tK:G@P:^mLa9nQk>t8T^QH%B*ya+TCb
j@#:=Y Bpjaq<&1Y\Fu4Z+<e51!K%Y9hlK^KR#:%?PYj%j<%c:/b#5%>MR46/+<Zp<dHGp=yh5B?G<#9P&Z6AFJ
GlcByD 9<cu=MW=LY$bQ=Sn1$dGJh5Lu/Ahy/9:LH?G^jHQ%!q*iq\&1?P<\SLR#iQLV1&=uuy5B8Y/6h5D?D!b
?XMk+/ =GX^#G=uj+#lk/9yNiBc=F89Ju9?la4t4/#eQu?ju8Bw>Mm&%FVX6l4SI&eYlK&P?P@MDA!PS:>RDBGa
85/AjY ICH1YK&1IH!H8:>$Q>nnKWHbGkGYHat<!K+nAWBn#F4c?%9&iCEqA61nAhYZ\^/9:$V<wD#Kbm=@!C+F
&L9&Sq ^XSZ$>RhhqSqSBih#G+iquhC>wA@/F?a:TiqGNh#*/Wh!t4DRm5qPZNI4CiBe9IIk5VZaWWSlQw5Du\%
-AucD5 00038148bd1001202b4 Page 331 of binaries2.zip
%SFVKQ q/!<IFj5LM@%Ejht$KRKGENYV*SquI?Me8Pm=d^u!V6ymlb#d1CBnX=V1#L585*Aul$y#+D8=W:9/6SP
kNEwKV #%5MBhXcQ8!&=WGj:Z&8iF*VPK\EiDDhhXTM@F&CpH?pJlW=hJJEm#My5Y\qKB94YV*EK<Ee+NaGl@pn
\EFqTS *IAqXn#GM&==e\+l+pSj+nFkEp@&TWd/clBT5SFi*Z<j>KRhw1pVItan*GG9PG^ulaBV\*^=J>%6+IK4
#n+e<l JHbF8lX9qC1NMR#VdZa5H*mFlwY4<SL<yM*?lkLl9pmc8?^E/Xk1lJcEAQ9i^5\G=@JLp\y%BGH5CX9?
J>B=yE Wc@FVQqD8VH6DFVRqnj<cIJdIyJVX5Qwi8Rjn*Xj=^K$V5Vbu@9maBN\qju*M!>Zhi!b4F8d&wX1=*k$
n^9@lt An%5YEw+\@d58kbh$uNeABDdjm\qMG4mk54XRIa!9#JNc!J+>M\^!#t\AeuJ+uP@GLQq4EEActq+>D=n
Aj<&!N c<@wA4=?4C>!8L9wmD+5HRKIZ6WckWlF#Q/a69hH:Ld%p!ay<&a<i\4<hqZQ+&Xwtw#pnB/KbQL+MW49
W!RSPW a%#c>yXy8A$V+4/ND:i*6#$hmHXRQ9Rj:NYuj<H>c>chyp9d<VhE+*/c+ZD^8JVajZqdQwtS$%6J*TyS
4>#M*9 dM*IY1a:<\QEVkVB%GW:kjW*K?n?lC/EpP6@JX&e$wQb<eYw=hRTL%<t8dy\Kk/>=dAdJBTCcy/h\*nF
XEW%CM Y+&iu*YKm:TQ*d?=b*9::1t5VuSmEEPMD:t\@MTYqPRFV&:BW4GDDh\N/dc=\8EqP/^eNKLA%u+w>duZ
@^\!#m I&lu^?R4djW4<KK:BqbXN6Mt9XGB:M6j5n?>VRN\*w@54q?Nu=cymlmbGS4/ZQkp>:lkHKVuHWQ\cec>
9RZw^: *KR>5$mA/#L^cnXQIMJb#AR?=T*qXCDq<&&:qAj4M#^L6?G:C1i9@dh8e$uaBCVZ*5n5GXV+iZA1SXQD
pFkLXk :W#4>9D+w!!VhHhy#+*1wByQ$tEFPm=+Y&j^H\qy//iBTT#>GNA@eXdY$dF1+IHl?wDFRS$#6e=IXZj+
dil:+D %4JK^Iq*WbEYk?DW*Jb%9MNQV+4+BM<tVI=:jTe!1=+@8I9b1@!FKJ@De%RY:uQE9R@ahn!uqRjI\bPL
q6h%LH VG14Cji4HPBMXV+E%u?^G^bSY*eAI6<VZCBn/uijdWQ#BXRLbaNaI%%CpqZ$Jc1AP*X%K$H9h+Li@*V=
MwB6hR HBYA&kiXLB1pR4:CZJwKep<a1QTbTqF>EDj?Nn/ZI1k#&<#HLRC5aC$QqGGu@9JA4MN@*LW1n:kV?MG%
K/&$X? Tq^#wW\meWSiP:X<lRQ?XAMZyE\&!%RW9nwWqZA:*NEt^m<!/aZL^ANV\E4B\ml\FLjGlCDq+mVq:M1u
<ZZKJA *\mH+RY4CqBZbLR<>YNW/4G<C:DLda?DGWi^!!HAQ\9B9^@Yh4#=8IFS&w>E81>XuiEc%nRCEJq@9Vc?
CCDC^P ?YuXc?@KeW@FkEC*Hq!8VPq9JnhYRc/QNq%5+@GuJ!?Vq*^j96T=P*J@*IPyV6GC9A*K91nAZ9jR>l?j
$\ep=4 jL&G8XDVI*%4G:y!k645AYdT&uF<86nNRCmaY+QP1YM91Yhe\:9aVWcjlXM=#tyCQmh&5dkS>%QT<lJ8
nq9?@! ZCN>B6<iPYy!Q>@+<djV+b>Xad?kRaHbX/DN*LK44V8cQ:SGeFZqb9%aaJV4L@jIdb^VWjIwFjSj5LRC
kk/+A+ S/TnZ16TC1$yi?514y+uHm=Lc/WH4jp*eXimbL<18D9ekLCQj?+KF/&d=Bu^?/\\S%yBZ#GjiqaS%@4%
%<PWmj hi1=luWA>*^4F1Q:1@$&>ya\6$W?>151dTptSi8Dy1D^eVYWjbyetGaBqy*m:Pj=<P5IH*Qw6KT+n89^
Q/DEG& &YB\%hVCu4%\WC&LE^cDY^Z@5V&F+pY\Ln\/q^S=B4:qb>LnmdCtuZCIVaj5Yd<+N86J**F9e#1e#uFb
YtEPch @CqF5/?<b+c8Vdcy9/Vld5E1YX465eZIF?>Mq!^QE/#HHXeMVHqa<XQ#6>i\t=4y@VbDb$j1P%SXcy/q
+*H=I8 DwpQ*@DpBhCnPeDByXF1K6CP<QFTS:GFqVbdDMXb$ZjytPBBWbenZZ%^#TF%WS%wNQ+>#Ii4IZdQki+A
p&!+^C &E%*phiCyV#c1ANZI4h=@%FWEJiZBTAIbQt?wq>:9adDDH9$/X?JKSNiV=4lKaZ8:iE>W^>XKd=uVRBV
1F5Wpi chH/Z!?yA9$yjeHy*m:=<8K\+VQyYJLml>KYwXy*qCDJ/F4ML6RDk?WDXkuSaaMN<u!IDT9wtD\wpLk8
GHMumR uV8EM$@IRR$EPA*a^n:8iC\@hK:b>Fq\??W%G#bFXBcqiwP5w>89X%^AW9BVyRqkuPJj88ABT:H/RijN
M$qJK4 LKt\e1+^HTJawN?w@L:lYHVD<l5h%VeG$WL@nLtaj%l?q?4IY&LP:5Z\L<yHSPmGe@1c<#u8@TH#m<9$
IPPjNn 9e:8b:hmZ?bP/64YdVb$1W?y=E@/@>EKw8BVweC44&inpib4iL9h$@*t>R%%jHZE<9?K%%^LlhKkE5SG
8wS4RD FCR!+IdSkmR6pPk<*\jiIe6L$l\9BT@Dbc@nIjwLAKIulkkieweKyiq6dpVN$SNJYk@i5Fk!P=\RFna!
*$Wt=V :dL=5PSY^S<4tW!9:4?q#=<!:uRk#+VC\#A1895dSlbB\PN>RMQCTh/5wnCKK<RQkeamaYk<EIhVSeD\
Z!1Hd% cD\RlWFC$KwwAlaKW$XBMAVYC^cymqVB+qV!GJmw1lwYneQmCcwRHATy1walwLH+H^RN^&B\?A5KyaSV
@i%<@G I&CStA>EFkXTk^A\EJWjAwJDPXFh@kGDFC?AAq\B!S=md1I?\nlYAA1LSKHScDWAHwBBwbB1GC\EmeIT
AZN#t9 IKwRHTN@6V<Cl$c4w4AaNBTF\tJRtB@<E+QFaCqj1C#cX%Z4X<EaPKDQll4kwMi/VJQID/CQV5Ic^*#l
YSE9Kd +V\/!BTqyTtTIw6X*&T$l6WEKDAG#<dhV5M*8^yl&c!p8M$qWw&6eKn1F=YE#Zm%IW6@!VCBM4!t5F@^
VAuYid tDl!Fwly>/4TVSwCn:TW=K9n*S$bP$F^d<Q9kI/FMiEQ6J6Gk6SB+j4#><:KA1IbjQ</+D9%?MyNtD6@
+&wJb$ 5Q%!?P#WD:$/=9w/a6dju>uX*JX&#Wd8y&@B/I$db?8LT*6/ak&54E4j@8J5h>>y$Aw5lHICS:/^iFqd
mPiLWi GHel+Eilb>lD>*%EAa>5cDL1#VPwP^WaZY=MB&WP??=HA*M?@@epjY144!Yh=dChiEQpZT*EiQaVdCwZ
CMkm^V %k9$dS=1&YV8*iqBNF8$ehL*4@kAIItG%kFKR9D8cpE#wWFdGtM+yP+%H5L$q$$@Iucca45lck%apl8@
Lk@jLQ TAJ#DA*KTZ@QW\4AWb>=E?FWL!%hBjT8c!iB#WVIH?TwqSj1VlAV1LNn9bSpM+#\itX!ei5&WI!kARe<
tL!ZaC Yq@i%D?jT6Dqy%1Dj8=w:S?=!8n8tTn18kIGJ*b!baJMm$uE9qpRw&<lJWJ@A<j\NkTjBa?KCbjSt/yu
bqA\km a*d18ycG9M5!diTyFK%yHmWdwXEi5aeGViC!&HGXY/Z^my4Hdi\#KCZ8%&VNZIM=%*yG9SWFFb+BK5wM
:FbKF1 DP58C<w@FVZRc5wG@jH9d=tyqQWyH:@JIMY6EFN5l5B$&<R*jYBT>&PViGtBa=SMa?6c<dYyiM**N^T?
dMh?<$ DK9VjkSbyq/yBD%#pB%etdA><9Sc&\5B\t6EQ4e^ayaP68b<p5Had^4in^w\j1%^LZQq%:C91^8+:kEe
u#L%XN DHJ@mNFb>FN6Z9^W9^ZF?dDF>+G6ZE:Nt%NNWR+mq$VDh^w55%18P%HS&+k/@GAEQ8uu18K9Ce#S:J?j
I^RMPd *eKEL9I=+!lc=*C/E!P4TFH=mTEJFdkbMe*dqMDapGu%<my<9:kjH@BqGXQcHK<hV#hZVJjN+DjhS<@e
ata@!T t<t=qEejRC%+1EPC5LYy%Il6m/ihV=?M#M&%DQjujS&\E>mMcjQ?!h*=GqjSMdYhq?h$RPe&DmHN=ecR
P>FeSN eP*aV+YjM9Lq@DY4:WjL/&ny4:bXV++H:VyVqtKQQR/9#m\1aS8*%8<#8pD&t/$!K<Yi6h+S4hM:q/dX
9d5XMP 9ppHck?F#W8qnSP/SA@CY*K<DBM/VBLEV$1q1mq?#+yy/I6HaJSY:!8X*#yu!8@h!i8em\Sa%hKMYind
jHkR6Q =Ym8X6Si!CH4T\APZt9QhhiImjuQj9X@SIq?&HBK!%?*J9\Wd^R+4<#^hbj/Ey$jYHk#qyky#GI1=kBQ
T?cEHD E+wDDG:Jq%6/9$/4Q/uYBpQ&bl5#FItq/i$aLBB\6JiY4<tlikwtlEwZWyh+RM1tYV^RF>k1KuW<Amk^
KMiR+a qh<cB55yu=ZZnYGX$6W6n/YjPVIKwM:!\iI6Ww?SV\\=N/TjSXu6y48wSjdK&ShQB&SCjM5H1995C\5<
qaDTd\ J<99<9XhbyRM4Wl&%EdFcRb!T6ZiAXhhTQ8?+%q<NGnu\A%KlB+ZkJ>>8R*ieGcykH=!Zh9wJk*>cjKb
Xy!a\L bqIiIq>R<TacmqClRC:I6h#akJnAYbbP<C*?q1DByM*SYR6=jkHW>KF+pWX:K=M*88F<%qyF$w9Fp>>N
Hq$1PR :8:/B9GX$?Y8J8bjEhYCCTnMH&=&9XJlc&y+Th=#eLBN8mLpL!Gwb+kF6+KRbcK:F#\dWNAY>ma\/*Wb
Q#BTLX 9FZupFqtujQQ5G%F<AaWJTSG:jpLnF5?5uVymybmZL=LdHFI&LtlE^QSd^ZqQC?bP\&t=*IZL@*uCDqu
ZAw%pT ?9wB1abE?#b^Q&tSBd9:^/e>tibYQnuyTq>5+k9wheJYMaw%?%ctA5A?Ceq:AQW=PuhT*RJp1q+m6pa>
tXu!Sy A1aMCqlnJ!N$FXDCW5T%J/@*WCNKtShj>P@Y=EhXbX*piL$jXSMTW?%j=d>1a$q!^1pA1uEAV=m/RV%n
#ePVj/ eFFl+S4#65MQNmcHKi%jjlZF&WyZCDEZ&/4Mj+Vi\^uVpu<Ch&btl9qP\pTumCaS=!hL4+8Bpu5+VS\c
pBy+W% TkQbR*b#Z:&FwJFjc&pP1>XK^IbNiALLS/Qc+Z6Dht?e9Y8?ZLIK9:wXBEy4Z:WEjSj=5?&R!P8:W6LV
SW$9?J $C^#A?Kc>*VlE:!l$tXYLj!VQ:V@RAwl:tmN/aWRM=5h6<>MlwW9Pu\@t:1J%hJcb:m^:6a<P/4H65wi
C!Q6@u T!e>%a?e94=+imF\LG=%\1L45p&GKW4=*Y/&=<R$iJ#R?HSpKDC$Gp@6T<aGWTeR/qnt1V!WC8BWS^Cb
*DqH<^ e5b&XT#nCS@Z>+MLld^4DAdPX6Hu1H#/HBl?Q8!cBI+Z88!ZTXP14WNZDjZZR:&Vb5:j1=<L$qSR\8Ju
!=nLZR WmIjqc5?VqW^1Y//kDnV:!lWTXM^QhPwHTX5aj=y:Y#?AGRt%JPkbP5I6%CZ56/+?>y?*8ayh@F^X1p@
8Q\JtI m#\q>WLm9j+8j/K6STciueRwPZZWl5y5WyeNLla<N*5ZIa>>jVmM<YAlh?VVC@/C4p?1bhM??MG6GeyZ
*1S9+X PF<1Wy:kJmDdJCdbC<aEK%Q5mj5tNGZJQmat4!T9Vd@q%NS>\%R>yY>cte@my/#9j^WL4@R>9Zbl<^%u
5l>4LK <lh$m>R5N88WRlM#=?IQ%KpdtL<H@k$ykQEcbZqn%<l>d8?qk:%LZqakq/@>ql/!%qyClYZG6X*mdw9$
*$>!d5 WuC&chwN%cPhq14<PQZ4QT*6lXuyYK\&Q6by*BL^V:l4Sn6l18lS*P8AP!$MDHV8@j5EWKN#n$QJbLiL
%5NT9t S=<Q<t$$68:hdd8G?ZY>ZDuD%D8BJp+yB6hVe1#J&lD$*4444e^>E&\*X*=<\SP*Hn4H>DHQbZD$918=
PBKVQ= \:VD!ZL\A?Zc9t$%E8:>6dSuY$pGbeZH%$*cYp>6B1T>J6hWGR#Cu%c96mP^8wVF+d+Bm#%^QQ+By/>h
-Au+Z* 0001af1db6e001202b4 Page 332 of binaries2.zip
lZ@ttF T8>X99jZh?1<NNX<IpYMXR//AEMkAy=qlFehjecPJS*V?iLW:@SdQ&%%Eu^X@Zhl:Nuwm4@*EW@pYqM6
tApwSp N9/>llWj8<:*Xi%D5SHAq^MceFJ!#yehKe/^Vpki4GLw>\lyiGFGZw1I$pwb4e:/NN&EEp&n$WwPY^wj
iiqZm/ Y18=ke4I6PZ%h@HQ5kMSAAN=V4JZIRktyWX$N#+TiZ#BNFqt9Y\jBQ&J=YalDI%cGwpCMp*etJp#hIMX
t$$u8/ K6BTFj:9C%=mCma$hLW#Shp?1IMXY/ET\iXTp86F8:*$XB6S\!L$wbeb9D!FtJ=#5Bk?!qXGE\9akb%+
?T+^dY j#Y=ddBN:D&w%n$YVqpR?Buw$=pVqa/jl:&MbYkkJDt%I#e9RMy8N+Ahq51G?I!Vt9kmKP%9AQJ9RkCa
P+Sn?% \a^>Z6w&bwCHNWIl1ykhYY1hZKWBM>jXX6u=\l=MXc\DSY44F^uwuW^De#?N!mDILS/1E>=#YiHEmBS6
u=C#W! %lqCIqR4GBpcFTw5ZmEJLIILkpF@\ww>KWDBE=>!AN\tu?n!hhEe?dXi^tlQiI6*1F8WLXi$Fayb$G^A
tPE?uF GPpQlM4=W=pXXwR1wR<HSJ8DTX^m?X$QM+SSR\6ed14M*:iHw:F$u4t5Kw%a<+9\!N=VG?d$PDh8Z&J?
6F^&e! =W*>/im5&LhWp!kk$c@XVL^JcWy$&wZ^#m1MF<uT>NGcbttTFqGwdVWKdhcWCJEtcVJVLqA^Ba1a?YD4
^GJ$RJ S:CcFILatNlKKa?*wquyX!F4/9!dKIq=J<tZq!==W<h+*@>%F:C+?QjBF!E:%pJWuX#i<CcbCZbPD:p$
l&c\9^ 4iYn+8?JC8EFZkwLlQZ%iGn4hcTb9ZVqMG<c>j65uCAZ4a@W4NW!GA4yu4iQnIW<lQ+\FN6!DFuwF$I%
VEaCGh 9YRKLni8l\<PXV?iP/Y6ZP&R*DW*tI*4E=VZZ*a9p@64uM!Z=Bi*BX<y:%jmR9umB+pYSDQ>\dl+Q$T<
9lH@5t \kuDB%ww!tTW$8cY^nQTep+ipuNd@tTX4aWJ\MM=pGbH+#Gc69e>!d%9>1=D1q&^<!Rkitwl1D@I4?L<
YSYZXi Za\WcJeW16j5WbeqiB5Fn?Ya#AYb$cAHkB9eFcj$wVPtEX?Fl?1#X9c&i6PwuF=wIWT!G<*NNW@RhBYV
D%\T5n 4i$SI$*YaFbT#VJbt@5SHRR1hZqKDCj>*i+mty$!IYlGVdlTMYk#DI?De#%j^NJj/NY>9uYqcy8WX=ZA
IHql8l hiL9K1WTJ$P@1Xb5/VL:NHj^nq1LKZkn+PJ>HnL$!<pWC?eiFXqa<^n=qXSFZ$jA6mVKnN8%+\G<^e?%
ST$ZF& JAY8M=ZwZ*@J*C+/@Kat$^!k!RGD&Shnm\=?ayb/?ikeC\^N8Ty^p?19jpH<>m1h>$CNQtD&4?lHHmNM
8V>VIY %R6$y8An4?mX*bl5=WbK%cYh@&@B^Qn<knii&?:MZDG+DcNB1nqm4=4Si?Z!%RV+e5XJ6>y\d5^tj!6$
cQ&<!k GQ=qK?LnmRdVP:++@$*pW::YH<XtF!l^>WlKmeIZ<8$&BD#P<<dLhRj#l+Dw?&bHE*n@WcG$a?F*Ga1Y
RAWE&/ E6aEpDX/iTF:jptb\A?:Ky\?a6@GnMBpS/J9N&AIS#X>ILEM@&66iTq%+/E5hB!<JlY8k1?ji>I%VRFH
!da6%/ !Xb1d=d?6#LGl:&1\!\P$EDYtycNjNV!RIHLFijIKX!81lR*#ZnTE&$dnyi/5I^p=IMQ8JIY=L5?GNE4
&wMZ/I ^PHu@5Y=uD<*h/I@D%?Tw!XE6:<ku\YE&kl&^*b$C@Wmt^&Gc$@y$4t?*CyB$N&^MW?8N>5F!nG^V\VS
MMltnl t&*61Bya/\W>9&%?#y?YCenyM4YICZClL<w<ly\h^iI8^waw?bI!uNPK<EbBp9nhAphyy6*q>aE*58lI
=4PBK# 9WiwI&FFlt!F&b^>cC1*>#h?!pet<!kBN*:&aLkN9YZBlAkjA5SnA?E6lu=eE^u$qEDe9i86y**kR$kL
Y6ySew MLLSdHbkC4SkL5D#B$h#wMNj=+#W6bwHeZnMHVHXEYpjR5cqQ*b:phujd<YLwkb4CC&@i#5wSVI\GZ$Z
>EM!wY RGaM$P5+4%MHiVJeJ@?tyjPWFtXAh5Kn8biPLFVI+w!cyKpG&Q!6\bpDCl6%4k\J>AjZ!IYX!tLi!a%>
MIwM5b huh/##>+iNNXqLKpRbc6%jFNGQ?X%yVqDqpYlEejIIki%<JNFM/@TJ%ZGP:hyea=wm*jpy!tQY%$XFMa
1hSK>d dXC@NQF8%\lmCP/%Za<Snm%D<I1PRWFXQ:=SyQDymqRIdYiZ?b%ZtnJY?8a^VekI1W6aw%M>yIm?DuqD
Yc#Zd^ DC$6P9VSJ>AyeL4^&qXJElT?NK#ZNb&n#1Cj!/RCiLjaq1EY\PNLmkKF!6Z<q<^!bhlH&MI!5dpR^:b/
w$N1/c p1GSZL=M>QGG8IpXa4bct#XhiqSyVIHkd$PeuE6M+DXV\Z?eRAH+5TFiSJ/h/$SIy8\#LGIc+/l^uhXK
TiLJJ5 R=JLp8KRMyD:cyXk>VcuJb/X=1m^Rd#VuM@thu<S%jVBJ#$d8DmGNbiX?KyFB58Y81E\D?R!F?JkZGG+
$>kK$y NuZtuI&C*hZ!X:pMcJMp6FKc4S4Lk*:#&jwl!I!XN&mRy8=PpW9E=*=JuwB?j&Z+j>NWHn$jc8jL9&\m
Pc1h:8 />JjD#5IQ?k1:%i5EQwcA:wKlS9hGCw?Z>+ij%yAMc%4pZq4B?a*G=ntMeR!\ZbEh8#NaAjDZ%N1BiD=
mnePnd JNmLDnN%yj9CmXiytmpkG/*Pp\dj*awPVHEF9AFyMPYE!4AEABBbXS==#hAtFkAyKcLulmTGJAh4\@py
11Enac MZYPh^VDENciS$Qi#Rlu#*FQ*8wBG\?eQDF*kPwjPXk?d>my9CS<#!ZYKAEJ^Tpu$>kF?4<c%#P/1#Lj
1YH>ta W=5^Sq$>Q%KdjXS1uyJEQQ@M!P<@cjmHVcaDK6tY@qH@>L//PGHtb1A@Yh1VWai>tt\tWdLD\5DK+DR9
$c>Rc6 \R8MhInZkkd%i\AGAMYdS%uI8V1KW:BaEpd8H\!F\iF\8D<eneZnXA8+L^!G\iLStA<eya:F\ZDaQ^Bq
H8ed^V 1IyTI/D^kGFZ/\pmMm+85l4F#n>FbXCkT\llp!YcaTb+AQFep!SpPcIlJJSZp>a*W#9ECEEQk^hMt85w
GCniVb VthM>RklbA5NKRki5VlPuCWwbcj65C1M\/@^\MtAHhWFbWiyBw@T+Y#uQm!6NLqHM&1G#5E$n/F&N#T9
Zp??@t YaC6Dii+W8dNSEG&<+NDtFSJT^XwRY\Xc51mZJ6\EB5lb1B$IGBEyih:a<:wua*auJ!9Z%w*Q#@\a*lT
:Ikc4e B9ML/?1SR1CnJqtq8Sn4Xqt!bZH6wQ8\eBmZV@dMpwJ!Q4q&Pw#uPm:c<8kpMY9HY=1QWWdIkdnwE*/Q
5q?6!R 1lTZZuc>j#Z<JYCJa@iA46m\MYluppChWlD%?16bmCPyt&nK66PtKI:\by<e#!B6FIcXNj:JyThk:jDX
nktjj% P*mn*#cq\FkEW+QD+RKJ@tL?tj?4\yJ9uDJ64kAAmn#\DFFSwe8LHjCmR:W/5*^&h1/wXFYjMEuXElJ=
NwuD!K i95SRqhw&EJt#GeD=@RCM/<eB+uaNYSt?4KRTN?i5^%95</F?wFS>tD1iKR=R\L@$dyW5%<EL%=9bM!+
W<E/uG $X^+&Jm<1=!&/Y1pAAp?/%R\ccWE@>a@FeZ^:=#Auc/KZl#:!=jA=@<JPwRXMyMhuSHL$^k:QR9a$Kj<
ueq&m+ h$IcP>ecG4:wk:IaZ?&+ZB\bQ+wL\hueeu6!8TCK!JGtGVe*:icdAGMt&/*cSbGJNqTCwGHhJIedS1u#
&y*$4Z KS?!W@l*?X+hByFDNpDiK&#EmX<p6e<Y?APu=%Xu8#GF\M5EwXEe&99qFM\>+FI#68FaNS=^@PJc!&8G
XCHyX< a11G\>/p@MmkYBa4Y<&IIJeI^nD<5&kjSKl114uLbhRWepSdkT^%<:GMLtPJHl1b^YE8VJk8Y%MRL<<>
K>*jJb KD5L<%!dTyRSFG*IC^DBlb&$@:ey5<=$ZPpAbpmR\&$^*HePi>*%=4iH&4LEyt>GRBK5M1F&4wp&?@GN
PcSd@D IyFHMiAmdL/V/PybiWmTE++^:Z!1WdP<!eLH9HtL?R?JQJZjX>TFt$1Am\X6F^NRdL&ta#/Mbyw98LK9
5FMj8? N=u?Z\cw+LqYd4>!A6^n=>h=nJ<&u9Itc9ZamajjJhZdLQ4B<9CdV^\9#=/8=$EiL&cNd<tENKjXu6Da
?<cy/> &=HM*RcET<kHTY^ZVh?yhT<AFGMD>jVb<%*>c:HyRF5dlbD9%/aCI9MIWL?XaLP=F*h^tAIn:N&RG8Bj
l4C^!j y9w*q9=>/LTJKk85m9ubG6^^phapp\4he+udJY^E:XkXN@S^j5?IlZ#ljPZ:nAMVZ4H4*u6KiMqW>:S*
RVWG^% qFmFqJ@ZW\*?D1Y?6&MkF1*Ic?!hhpZ@@F9jdjibS1D%6HnM<*F$Y/=PMa?qPGiteE1Lb<&Zi#NJ$mN*
b1EX<? iLQC@Te8RaX8=T#RC?*RX*M1whbDb9BBKuZliBSb#+V1W9Z!eydVI8<6L4mpH86Z9=l&bh&ct\L\deK*
XQSFu4 b$uN+jX+bI&qK:mC%^ZG4D6jDlS<pHn4j9heRkdP6yJ*Hj6KSMynBGuF4<*c>l$=>jcL!:>jM8!Rqb$d
I@HuDC Hku!m:pe+mZTk6=WPZ\int$XHe^RNHiBZ>tj#@ad6NNWitnPbF<ELtd5pq!n*K1:$iSlW*%wNL9VchPH
B!dqqG =A$b#FAJ@ld+&PlR$^V8DWda<%L:G@Ep:=YkGd8?XJ^d=i5NjeY/LD+nXD8\VwC*9uM:1CC<>IP8Ma6>
i8wBL9 :8&!I*P9wA5VQN^&DeX!4BK@\:m=Jmc>4/u$*K$^:h^\qZp^XKniS9kG9jmG&TlDnn&Z1%LXD\qe+$SY
SVLA^1 yD=I64?J1VPSpJbbXm#HR<=yPJuQpR4h:nBRXc*8T:d+ct8:KChblKeniT6@Juah#$TA!\<F#6GQYE/n
tFH9nD T&Gq+w?5<=KNWWS4#pHl^aPAhN6#ye5\aJFI#Xid:m+LPC+ipdlIZq5MQ?AbY4alQVp8iR*D<QMI@4@X
!Iu5wR NGS&\!+weN:y1$w:=dE5*R@P$mRe$Q::wYNc%&FW?mRRa@4<F#:a4KY*cb5q:98iZk<NY?^t#GY!T6e%
\MVjAp :i8Vhu58y=He=$BGCq54HewQt9Zau>/lhPZ?*<4Vyp/X#yG:c4\YBe86=nL&l+nmQ?i6llaFHDuG?+58
RSSB=? DP%5kB&5lQP$$<D/+/CT5leS9%%SWuB8KKk4l9l<8iCX$ZE*Q#!Ih$\8:GhZLAyjm:9NDqyRpE#19I\Z
&$%ALl 9JTbGJYj4=RD5+!hL9FT1J8RapwA%%#6Ql/+RGyE$Q4uI?58cdhLn8Cej>Aet%Km=AZuFHPh@C19tm4=
q$Q5ZG aAi@l=&+kp+#8c@Qu6Y+c?PaHyTXZeKSdJE:I!\BJF8&DqdBGCD&nH+yFtNeVpK9?W4C$#&jR+X$uH\p
c:iqWd lM5k?1h=mm?l95V=e:FAt<KEaj>k$h^8FppFS=69>9+T4Ye%n#mhFB%k6tS8CLq*&STkRDn*wYh?jN&Z
t&Le1V @Z84Xqn$=tyB%MNTuc@k/RQhLwD+5bl8DNYpwa9bK>S#q@M=6/j#ZKH6C>m\etDei#a$4yK>D45#9qdT
P6DLWE ^CP\cye/h$6RJ1p4B#LZ@l*ckH1XJ*YJJHlkI9@CWtSA1@/ZZ\Tb>uFA@KDXljN4JHd>qN^W%q:FFn@4
*Vm6kG j<>/:<5t^146iT&S\64dJ?tpd$EZ9Q8ud>DLDpe\DnQ>QyXjeN?!LX=a8cGbRu&9+%1k$d^aeHLDXFik
aFqVTR NkyN=j#+VY*4J=XcXbnZ!Xt>eDES9Z\6LhZWhQZ1K$@XXX4<I>%*KQV*K*%?*Gb4J*KlLnDn#ZFaKmt^
G9E\V9 =GF^\%HM#acW=Ji#IBKPu?Hh9b*d\5VTLbL1Iia1?4bZK+1hcMk4IYe=WA8ZR6Wc%lEVKyYZbV/=1cJ=
-AlnI! 000f25f59f0001202b4 Page 333 of binaries2.zip
KYcFei 4*%pYNTYCtPXl=:1F1S8?%qe$*hhIT:EXlHH@:AFHF&I+?B$$ek1@DF*N?Id??*a+8XNHG:Dq/aMi5Cu
BGpR#a ^hdX8\SDhJGh!>64$IKK^b!@ZH5MwTdq5tcVq^HCknB4V+i&KYF!c%tETjmm8ZL\6S#KLc#aFdQW>bGp
?qwEcS heKXp?RZ/:lYkh>kdX5JmcA=@hqn\FX:KRZ#K=I$9TEVjYhn\a<FuB#TK<+C>j5DIBnKER8cid>\&j/#
q5bu+P >LYSMD+EhulV+K:Rhb/KIy94lQec&AaQ9%:A161@Y6bZjF9?>d5h\d?@y&?BlRjIS4i4L4#>W@td^e5S
u!RS6e G$TS#cH/@PjtRqF&19>DnaQVMK45GAbXnWZRQHQ&%yaHyZ/%RdwRk1@<ZWP:w>^%Y&wH8B%kZ/=SNDni
SL^a?Q \!*FiE#?He8h\NKFm1<Eu:AQp68uK5Wu!:%wNy/taMjCB5edc!GZbkNF6jK?Plc#j=paqVA$BemKwN+L
JTFh44 /qaII9we:CN>GPHjkq?PAcE$5Npt5wnIti>IV*YbmA*4>L#=A/dH!Yb<?pJHW>FyCJ@6BIa@=#kwaS$*
CJ6<j? GR^bNSY$H:uwF8&CJCcQa?A/%EYcEJ1y+@$<p+/HujPDLRQ:$P/Ky/:bYESA9Lq&PV:tHuRu:\K#4&K=
+*pu$P eDXn5?QK5TldIml/RbI8XS+K^cNX*nApF1!GX+tkpjB9JdR!D1N!CP:!>@&/541/5k$aGBSPWQN@WDEw
&ZDSJA 5C\cl%NXXeWSXJEELB1H\lA\V\RGn$cn<Y<a^mQMAK8www#BK=Y<lR$+YNtSWe1CkiHKWH$5\TjR#\tl
MqP!Lh GlD1c1?C\!I^GCle*5#hSXp*INndJWDbJT\IlXHDw#Ea+ZAQb&XZN\>ZH@eh#NCk/%?RKlTHhXGtS6CX
Phd<m# nVt1j+KGS4mBS+T/b#BQMAcyw1bKDA\JCk^S69D&DMBl%DA1Z:C66:K>9a868:V9CYj<B^cJSPHiCGYD
&eCKa$ mMB\D^>QH#>yW=iVy1H8WDRGleEl!V:+kHByj!>qa#?HWASi&R1FXttb\ldyCMb8Bt\?d+6DY1$hthmI
aln$FZ Za:i$t$+9uMK4M\T#qNaWJbiYed&:@1#5Gn8AiC8N5RQiViNBY1P6dkXnPiE4\D&q*hDFCW/SlnqZd$S
Rj$CtK DVMllpS#LZaN8FcGEa6XN:n/4@9HSBb/q8/CdyKpJ@i6+jb6hE:*\tey!kyKR\wuuSIJ&8=EcpG1hlqQ
5*ldQI V?tWkuA!TLLIwGT5dAEEL6jJ9@1nWd:D8kyee9+aDbpG^/H9GR+1p?q4EnSwFP*\%c#99P4$+/?!mMMD
Z4K@/@ 6@WC@nlM?5TuP?Mluuc&b*59<1IcRC?\L5<n/9Z9a9hA>Wj98JK96adG%l?DYmjk%>MK%pW%T%wZ%a/4
5Y+%5E a+w%TLMWjy1K1SbqPT95?yDJ\^kC!1JeF%>ASI@W1@dNlpj4M5*udR8##6#GL5>P/q91%B#YRWNH4\#=
>eTtjd pZ>et\qB#\Kt9K%:IeGGGwwbpDlVMAt%h>aXqCCHL%T=^ddSH*nM<+iG6b9hkVQK1Y9!&l:?HBe#*blD
a$F&J< :JTJ9<NL6S&@$lVyDCj@XGphIh?GGwqY#/!@QmdtiA^eMTQnDB%MlS9:J1#@tyi%m18J*8P/6RE:d*e<
NC$h!m VnEtjmHZ1+m8wSi:k4G##RFPm?$1XWL8RKQ+A?1FdyCmqhDA+nX>hQ^5&G@W!1!qSI%q#HRAm?Yu^B1#
@M$FQZ uw^L&Qu=EteVdNwmTWj$^etw@$yLW=m4EYeu#/w1N8>yaeC#R@hVh4hW:mRJ9*inQDG5*+5wTd!m!RF%
&*l?eX \:/CZc1#8t=h^jKdTyP@!VedY^Lia1Y8*e/>Bmk14D1JT1we=kYQEDNe/jyiK#9Cw\u9J?MdIH<DKNkd
IA/8@u &PtuqW94JY@?Zij5N9ZAJ+$WmN5W>6nMy#=V+>%>??#=?bTD4t+^ywqBV>*mAZ!K4yF&\j9:!B>#iMu%
F<\h^j =aKSbWcZN\SWnY$JecQ^Jj@MjYbQHJDVRpSIMh6%Wc*LZ>F=BMBhPpK#Ew=aM?a\e!BC:e^5CQl!?w&^
R9Atmc a>?Gp&\Dh*#P$y84H&Tw^JBZ*Yuq5\FFmN%>$!><>dL:9ni*=qSL=e1CB:>:cVcPMIw^Z$?KNZ%/8mXK
l%\u9a D\4t%<@K4\qcHwe<1T/\q*>$WS%Xk5m6R9XMQtiG>/q#+a/<qQn8BjjHRqe::RIL44jci>Q4tNqTQYT6
hh@>Dj M@PXtinI/eR+jQSZbiE#F>?+89daVJjm/?DeQ:9c5u\EWHnqNd<L9LP%jXiV&aFDAp9dJF/Vi<:Jd\&T
^8:\=\ Cl1>^T=5?u&Q4Qn^c^%SZhBJ9&F=*&<!Gh1pe545^5jM$4nTYHbb1C:*^X8u$RLG=5eK:%kdBd&/8i6V
%euXd: Qh%duLYjkjW:E#$jS+cX*M6&CabtKyH8m/S^peBNR?:TnN5y5*/u>Kn84BlIiedX19=lnB=SJeIntc>K
nSbwWk Fj#&IcI!YH5:4Q>4i9ey$CE8Flyb#c&@=YJ8YTS#Z^^CCd1^##E$k49?4TkDk/%j>m:?^+4e5Y?N/aq\
/G^MP\ i%k@c4q+K@B/W=6nAp:Q^!/=Ml6Wd$V6i116#y@XTnTmkRp*S+nJ*j#K4/ZaTe*MB=^\4TY?h4JkqyLd
F&#RRt \j=S>+h?JPITP?^?w<CeHj5Cy>4hQLk\?H1mECbHla6tDayu^!pnyiK6+Vpbi^wE1&Xu8wBQ%m=N$que
1^JCKF 4nC%i1#e:>I>MX6MwEiB8!Q/Ca6%uZad\lLiDEjty%ltS\+WIW>dQ\MFu>9hP@<ede#inlCJ>qS#LK/u
@FL$Kc 1P!li1cXMM:1GyNwND#k+@dnKL4yW5?heuT%GLQWJ\^QFyL8RXutRGJFQ8Mmy9kGX*q=J/e=yHc?4V4h
LT6SHm biM8?p&Jhq%THGQP<@L6+&PRCN#CcAVSw4Qq$tuH:LydlpeX/b?<?K<DRKhI>TDw9iqh4B*hWDYL5:#F
J$QMwH >LWV5c4VpBLJ&$ndmqGSEbZ!l$LT<BPNl6L4*SjJ?CJJF$PFKilKe>J4lejRc6p>GCZaCSjB&e:YnSH:
\P*H&y QMN$&Z*iMHQLYt=uBaj6w**#6KT+>e\LFW^d6^ynV&Mq@p4q<yDJ#\/IAd&m+MIM\YbbkabA1XX@Pa^6
N\Fj%& dI=*ySb+>#C&&?!hW1*V1d>AXMqT\H%4IZCla1HAyEhP=Gyc%y*^R6qK%?1a<lL4#Qq::K4Z8@Jup88P
c&\Eci imj>Dltb6h=Jmk6>W8+SN@*1bwwDRV64njLwG**!8Q=1K>^ESXNFJ4biZ?DqQ?\dYeYuSGN4WX*>FW%K
M?8$Q* \+@IV+<NKe>KlXYY?Eq9%t+=XKjN=b\j1695yTw6hHbXej6dPuMP%A*56wAE@c?W5qdiTCW4SS%\NT8b
1W#Qyq $e=NiXCMt:LPXX5:eZwNN<+5%JI\aC%yTEGZcTl5hi!:P%W#aE#6YhKdl\6@+/qK$>9Wc^:Q$tE$/ShP
P9?+Pb X9F4Xb@niA^5XQ+tCd98lD&C9R<+?BSal+Iwc5F/dq:69?:W6JBhXeHQJ8*tNW*mLV+pHh!&c\A##>mH
V^Jl4/ =SLFTXK/J4&mqWDBiL\NZE\9&ZARFFST#E%LbK?E*6m$W9Y^FT<%*tKL4/<uleWtEpyubt&E<:N!Pl%1
Q!$q?I Xkuh?>q#QnW46&5etWX=T*=e&$G<*?\/AH\j>4%=41&Swae!aVwY64mFyq@uX!J%T!@#\G:hZG+LIew!
XuRb8G KZC5Cb\T?CeBH>^n6!XYXwHq/nJZkJAK1\wul$Nu^qyR+5Cbi#89t^>Z!@ByMk<c\49hX^&Xw:N/9WaT
%@PqQp L:c%6L:!e4JZ8>TVQneFW9XC:T$J:bQXtQjGYTY?tHe4py>Bm<m@HlZEuniRdkFQ#6wjD#5dVMlWtGFW
c>djMw #+iDKcIBK&<CA5yuYWX9LDVy4>^h<BIB?w&hQKGeJSqnMK$>6J=SiVjQGRm#W?/Pqb1QXkLDESH#Wy*4
GyhJWE 8$K&6Cbt$eKuym4A+wLH>%NM:M!8KXw=!/a@:I6!*>jGQ\9jpJI**W%?<1c\YP#XI5T9EV:P:&$*6GyY
NEbY<: jc$c:IyPMC@/:<:\hSj5jHk&YWPQ11P8*V6I:45*9dR+\:?&Vh@i9Gh/It<F?V4R1ew>e1nSY&*Dt#w?
?BM$h/ \?yqL#%*h>jiMYq4%d@H!Vm:M@1<>+@tt8VXEbZ=&ehN>:^YbyqFW>#XFBDDc*h$#Hb%/1D6d/9:uQb5
aN:y?& nWq@l1yIAJFa%R9?GE+!jLi!GEhLYPVKu=FhRKDqB^AVMDa1MCe^pBNqG==WbEAtwS<F<eLZy#6LNywW
ubd=*R XmL<>@ea<>4VZQFGpbhmdLS@:=q9hLCBVphVVwBdl@:ijmakeZ:Wj5jqE\Ah!M9JNeij?49Je=1G#9hV
159N@N ZDSHa\ijly6!4BSZ1bV@Al6K%Y8P@<cRTGCXPd^RW@tnR?1+Cee95/Z1qYe+5hM@KG>+MkD@!:Re?y69
ebbytE aiP>!d9F@RApE%l=LK1V8:?VMwuN8nyIwDlB+/^4*8ZAm<IF=qA^l^\8D8W?V9NRd=%i8MW5dWwFVyYY
?M\&*X 9AZ+!8B9!X5!iT%!=#TX>8lK>jSMAMSlEPC+jnYVi!a:9Li4j<tRN!c#jJDCeSNH\5<RB&k=*m*9#A%V
Qn$?Zp \!hC>E#%uE+C>J=<*:PAt5Li4LiNLyP%RA\H+Ycj:5YC>5&89SE@PQ<6a$@cHLm**Gt54c:>*Fd&*t4a
51Z^uG wtXL?mJ6tKa/E<B<XWiQV1VYTmN8=K8pl8jW/CI*jamjb69j$l!>85#$=j+#yFHe9SMIqq6qY/6@95=G
1FAlDB IFjD^qeJ=J*A\&kitWLAjAV<a5+P$!WQGGZmkH?^yiVHij9e>M>u16C$L$F=TnYFbp%hec>!y8pX!9Aa
PSy>jG 6@E1$/maKkLS#d#t^>^n%RAdM%6pbCacK>%4GR@9tlmPTS=@cQ46XlD6Q:$XZdq9%4+e=q+QVnH^d^85
mbHdZD lLNdA6/KwqL?NjKXGJHtbKpJHi/>L6Z/^K>Z%EBa$QiB\CeFRYXw@MB@y&*l/m5q8XF\!#/lT@hPyw>%
V1I6Lj ^=1WJui&Ga1SYXZZ!?w4b1D:yHFhHZRA!pS5>TAjiG9lY@Eb>5ZL>D%NZQZp\htbw9AetP8t*+I@61iR
yV6C^9 CZRMVV^>9JYPJDwYFhWpjN#=h>^JYWlq+4&%q4hqRW*GW?&6W=i>Bd>yc@q8?\Nlb@AXhnu4j*L\>Sun
n6HPyp /dH%>jWZ*L+u%JG+SlaqAj5ny%u*5m8JZ/C9ycTZbEa>1GaYn4*+@HEW/6CFkjQ>P$KHPh$:5im9k:PW
MYjTSy %j8tCNTXG*GWGXuGPJIwNuRacRiKkFwl=mWyek6QeX#Yj!L\ew8+j@BiAn9IN5+9$MJCd=E=8pVYK>M*
:nekQV ABlCF$IhDteG6SNH@5FFa#NEiHtBia1ZMA^+lTyuyy+WBTt^A4lZ&pP=AXbB@$=M@6q/WSNyaHEY?!<P
#u#L5q lP*RNBVZ?beZ58!K6+lbJN+YN=kFlyyYZdY$%=wEk&Z8iIp5Yti84TJ$Y=!NV$#tV9eiJakV\?LIeGFd
>HR4>S J8Y&\1FGMj/:S!E%I819ke\KuGAya@<Z%ACdkXjNaS<ec>%!hwiYFhDQ5@bNni<VR4!Iw@aPq+^S+!ih
AZLYWJ yEG:B<G8kV9%&l98H1%ynb<<mI%j&?pAVTIWydyw/\LKHVB*cW<?EK@t^cXtyi41@6Kl%X9kPuQIG:Nh
K5e<eB X+E8k4WJ#i:PHi&YiYB6e<GuZJX/D*XKaD9l%CkdZ8eQ=S$IjE6@CPB4J#9Y4Y:8@Gp^bVRPbKPl+y/F
Q1SnNT TFpK@A$iPkN!Hb%+wVphV*&^ahT9Y5cnTG<ac^WETi4>BZQqFa&>Zwb58hGl^:w4A!j!1=*<Qw^ha8E1
<qZ\Ac E*ZMue^dX\?HmG/p\Mw<IyWKP8M/q1E:a:m%q:J$%1hJQwZBypKj?tcIwbu?<<w1%ZSY&NQ?FP!^I$VY
-AwNRT 00043322327001202b4 Page 334 of binaries2.zip
YAHDQS m4C\h\+!i9dy%GX?$$c4\m^hq8<?6!CBSwtDP1>kMyh%I5$L<%Y:KX91hGc8wE@^:Y:wIN9RP#SFbRq=
$dWycu $1bpC8#8nZZY\nVd+qPBX5LuALLb=&mykHEeVwER<iFBIR4?5%uYpp95#H$//I=!$1&n!\!i+h*Y95A9
J%%k6u F+QWL%F6YZ^M^hEy>jTp:?4+c%hB%Xl8+h8\*SqZ@Nt6YGJVNt<?j=A!t$yd<QhWkh>n^R19AJ1YqKST
4$*HCK lw4ylb?jj\%@hBu8G4Ie$*h119TkVKI\n&tL>p>\%t&KP<NP/a:QJhZYG>w#n^j%9&i<JKKI+c=KZjK<
9Ep+!m cSLAWE@pR4lM+dt#D&#ShQH68hNdEwFWJLGDb8+\eitaAAJ#DH/MTh8w:1c#K!QcK*FHuQ>pw\kE89C/
>nKkK? IRpLim:paL:ST$J&ZS9dd:tGj@hEbd4nA\KYdTY9liLqcnE>YE8#bpXJdmWqBB1FWpMl^XBIDE+XleT!
*\wW<& QBFaAk1JSYHlH!kMCwQCkXBwLA1FRwFWwXRXFBcqyycSq5mMQ<*TbCdN5Eh1KIt$CpW*kehDYR!+baVA
4BqSjc K*TG!mtw1qRY\&AK4JScK+icGHB<5^lI4!Z^aP?Tbimktb&^:ViRR5dmQ#ZL+>^cp>j:ImHXT?/+X*wp
Ikp1/@ M?&1L*/1R1cZm\wL6\Q9@wDKQ*A%wMBS88IP:IdWEy\AiyKWVjii=jBSEW4S$JIlERb/KWHK4%niktuP
JT4PWe G<amu*Iu*=KMFItcJFkN^uJ!54L1J=kcKSZPKB68^:9K6V$Aq?$y$?Vw>=eA66@TKX5SA&5=E98b9nw?
w%>FND \qWNDyITk+jM8@uiLbCMK+4eeW$uNcPCqW9BA4WV>hhLK**XW=mp4:Z1QulTNlR6pmlWu*SRiCp/Xh/*
c%/8N% lVnwDC+NB8$Ra5#CAXGM!Yjw6AEKiSV5K8CFp=qpy:/&Ttmi9kjX8+IjyDI#S9Ll>1>y8icWRA>XRCuJ
=M4K%E Y\kqMJQ/qPXt*dMq5d=n@p65MWbu15P6htj1cSZ!4?/k/E69m#i%p%/kluR:$4Q^i5<mK&5MhwV+a6@E
uP/^q= =ZIZd8bG\YT=$XmRXHW4ZAwW^#P?Itn<#tn/=PFEIbPFDB6V:EpnHpNd$6:C?%KG#>CNcdWt!MB?QH/E
H/w:VV PWDDqlib>t\Lk5yl6H\KVWRw?SE!5IPt!HcJZ4%ubL@B4\=/m>l<CpP@yDT+dpyJmhb!uZ@Sd<i4//DL
F&^LII b^aANT1A&qn+MaHb?ScKNJ1^t9:YeQa:q#TkCi6R/K$?dwMiSaH*kS/qY\m$19tENwmbb*DpMc6C:H/X
F\4\\9 JJ?j%Tjyyh^!\+:/Zp\<?$XKa\W8R6Y$wPC6^h?>AIRqPH^1&mqMR:pNlJ^nbBajNpl5eBa#d%\LFQWi
<5dX+W NlXmb/6c#Zu@bud>pm\8W&FBkqmLN\b:bSN8ll!A*Q^<d$QG&PiT5Qd>?6k+H#E^W$B/R$l/VaX4iEXt
B!X48Z QS88&=%!HmW@DC#T1eYbQB*ai9IbLQVuu$4aW>XB5Q$m64GyqwhD&FW4Q?8NhPacT4N*RZ#d#LEQ@6J5
p6TVd6 iLB8y=DAJDIylw?c5nd%?K9cQtcp:WbWw^LnS!!+LyFjAiV+amIjpmaln#tPlC@\>m8bm81y6%6+?@jc
T*L?Rm ^PmtCuWWKj%ZP=b%K<5h4:4FYd::E9k+>*NdTFZSb?VadhH9P:Ak6LXl>Z^T6GmGp&*/kH4?DwItR*yw
Luc5@< X1p:N+96DlX!i*!kZltMI#h@mJ5<+lw&H=y^p/kRdV\*=ci#%Bmm1VpZWb+&QG?wXD1T:RT4Q/$bn\Je
%qHknp <c1qiZ9#GXLI\dH<DHH5Rb=:F#P5mlG:Yq&jK%Cu1t$@ln6/d#hljy1!Lc=QPnQJ%<etIF1PRXckk8!T
l?T5Nl j+G<BEPFeMtaC>4Hb^Di5$C6&c^qJ9t/KnhE5j#ZC?Yh$t@>h1T%=qZ$t\M%t5$^%uh&LF:J/=*ZYjte
QiSR&L h&@^Fy84=*tn14!qcMZY=aFjyYF=m^ql=4VWK#Fi%9wp>A8kS&bijYR//*RMiZu6L6FXS68IB9t^Kaee
61Bu4& a^R#VEc::te#lNLMYK%5CR#4JJ=HQk!MDByFEZmWK*SRc<QpcwN5<@TTaBj:<Wb%bmRjn4/<jAy\qp^I
n?>T^1 aIc/=SJj1CS*JAl5C#ka4/hwQt*D!Mb\&&$SeSERc?6lAmh/PBL1$8qVuLq5E%NAWFD!pP@tq*q>>KNR
uFCNPX n:@dA6R4NF8mn**\$y<H&Qjq\G?yZ/+1Bi#%Z^lIj@H\J$G\$tYwV/P?a@MkLNZENLCyjIRZX\FXTZ5P
?LeiKR n?YH$ih6\&#1=?@Nn?ec4CbdFkQ!?Pi&QV+b4tmKn\=Xm@@b?bWqt*lhtjkRC@^V+emL\KmA*Bn*/Q6S
wkS:ZW qK><#j8?1CL@GX$GjwD^$>L?RQ$D%!BmdFy><8hDb1MqC<H<leFjhV6dM<4@id!%4e:=&y+LF6Iw:@m/
TRPwtb 6DQQ%PD*e#N*+^GyuSK8ae#kIw@X<NL!:#>d\6@FWwLjK6QePHHu6FlC6%%a/:tD/EZl?$9c+B\9YPT6
KBECa+ *SiTN>I%%tS59Ri1QKAZ^PY>B^yy%G5>!IWiCDpMB^W<pi//:!*:5d6K8:d\!XLt1REQ!TudRHjinX!t
E&:I<E QYneFTd5wySZ+P19u@jR$*P4#AukcBhcu%Lh/YK#*SG?Tl=DQ8/$VJVSeK\14nGKlPkTYa9$4%Bcj:A<
55Jp*w BN6%5y4DWK!1J/6j$c?L&\nmb:R+iF6B<jw4Wy1wqGbWbpa&*=KS1qm/Viwc6^@c@Q%t?uT=yuAMDE?y
#^D>&L hd\Xw6INlRKjjE:QJAPy9*E^+SX:yqP*6&dcbGh>Q!:ymuJ^8%R6S:*kKw4wb@M>b/?Ej:Q/+jke@eiw
eqjVV% !JIhK1\R?&mS9P*yBqIY>JiAVSCiY$lppnwF!59@aSCLItK<Ky@/IjCE^pbu&Mjp!+\aH%mDFi8!F<uY
!=EMhm *EK$R^PdF?SVF=8EYWP<wQEMtZ88tMYp\?>=b$p@^51JWhnV>bQhKG4FeXQXc!/j%#Y^/*NDQQY18ht<
/XFVjQ cMi$+Tt!qq1i#qC5$FctSETKm9@R!qcn=/Q!<?ia>d55Q&&IL@N&&p^/bXZ!u9c^^KCqNN/V<iY:yjmC
YdkN4m @%C4HRyaHC5pe#:qE<K6aLpw:N&4pV%5!LFM9^Hn#i?^%>j\SBZEZ^N%tI59n56e$JJT!/d*p4CDpFYZ
mcMyNV #Z96kIe\ck&pL#I%W8GlkH+q9&Bwe$IyX!W?WM/E<$4cp:AJD^5Qheh?b/SReM5B51h&Y9\Y>HM8&S&/
NMX*%A LFISeKX&:$ui>eK>*CcnKDQ<bi:eyei#%MpP<tjk5d*^NKa\t&VpubiGQuT:e@H=hcY?Bhqu<wHXW/j=
Tw%a<1 $eXB<w>cNSFI@?u4Yc%!q6wF8?\4yXD=wLY=e1X:SdABb::\*>DFP&k!@%@Z#Ch8yNbN/<@iCbZ*SqeB
!!CTPp #pnh&4=PRBeM%qlX9hMCn$NL<^ZSR/hFl+b8Re@uM4#/=B%RF9H>d91:KK:j<NttQXFS^K!n89t&u>*H
WX4uJa *ZwbFN^4VPl:$:+KhQ1d5=>P<BEj\P&S:bVjj+qP$:IDSc&leHBjDVN#199k#MMueIWc@Ve6bm#Zuq5K
kdeRWe mTd>V>I&q$S^SlnpNIRNykXdL<#XQbb?=lPAldWYQ^*bZI=laNt8+hj&lWIe#RiF+hA@4Y64&b&CtL96
yjeBLV IbcS9&:+@V&YTd>y6!T^9/P%D8QIT54*dPIN$TaFqy5&:MXtEdPIu+tSXW^u#ktSj9:?4h=pc9tIQZ&!
iB1%w8 &Wp/ejS6L9yk@FH\C*V/$C^S6Neh^+^DP!q1mR^%tp#F\SHcL+?jShNu\KCQC8J=R1dBj<M%@kCP5k9C
hdFP6G RKmM*l9$9t?K6Q!@bZ9qeh9ceReH&<=L/>yeMKjP>\bGp!N8<n9!!4d!^*5IKbF8jc5<T5?=cGc5YYJL
/qX9@G KKC&:E:!h5u*>*R9bu8+J==iXM@KuR>C*:=FQR^JjIRA8*D1hLGt#Ktac*MiG8*Bj!l^1P<icpFq8*hI
DEl*:H u*luQ*HJi*HWu?FapGGqKqD6D8MMTYZKqtXtdPJYTX\YB&:ljdl+4kkd>qZLKtiN9^?Ju/VSQVP51aTw
D<c9@Y mH%&Hbl#^:5CJl/^:J?q!@6MdtkqWcSJ^&*4D>+VCG8ytW+%LJMHQV>%5uSNLpK!WqXylYWi4*=iC%+c
unBdQ9 W=8u5uQY/J6Q^K?VWy?e@DNW?qW^>RK:M!S!\wdJTLI@?eaX6y5iiy:??p6pT*b^>QIZh@^M$\y^Eek+
<>??pN >6C?TjCa*%c:hT95!EeJTmY=\a<YZqFSl\iGDb5^$!DcMH<\PJF&ZW>ta+#SmZKXX5Py9ju1*:>JFZ?+
epdcLG Z&*EdR@y%kh\EF9Z/9%a#t\b9mwV1G!IM^$nd$@w>tYDuT1:9<<niN>FE@E1d:t<Q4>MQALS#B8+/ZMM
@Y>>ce ?W6yjR8T8/R/Zi?<%WQlnd&Z5enK$Q%R<MSEB&KmA^MTJAGlJkCG+NiHd9laFAwLScJWeVk<=kXCIVB+
QGA@*+ DPaDRcF\GAL&BWZmpXk5mwyH\%HuN:!G+Z?Tk&WqD4T&Pj\Q1LCPdZ6HcEkLN&<QnBi?S>nMIK?9KKhe
J*%Fdi dqG!%6YPF>XnyJFcwL?4R\P45M^duc\#yXy96/aVY@6Rinaqb^68>R5>Z5j%k+l<yPp9SeHTy^k5pnka
CndHFC :6*cXuk45XIDy6uFCKi5\E:SWw=1X^ISlNE5bNna45qhDc$N=VlI=kZHMFi8ECBdtZ89<LQZ:jcpDCZ9
H8C*$i 6Ee#4SGnE9i@BawCjYdhQ+B8Mi^ZIXQd/?Ric+RSSjDcqKHee&Gu85\#Ekb8RkCt^+n8+iJ>+jl<PGye
XR<GJn <Xhpb#/aGZFktD8tjk=B$uJMJjk4Vkw&N?Bu<@@$4RcYC5$ZZuJi^>=ZD*\tSdFBZ4hyNt+B&\uM=X?#
m\>9\F %#hqb64^IYGH?ZmARbY9KCRW9+bP+%bEX^dM+NL&VY+:1Yc9mHi:*@6aLIcq1!^qYF+KjQIe?IGqwyHw
R%eF@9 VI559thP*j9W4&tly8C\EW+Z:!anywmPJ<e<D=y=\4b>8@+GG6^>bGHHV?Ehi:c1QycYw?RPp^><^i%D
be9/FT 9jJ!W>8%j/PZ&c8p#jm=t:Bb6c/Q+w\MISVu$=&K1NNbc\>pF*Zqnck:p/Pk$\@Pe^uquV&tYdAcwua8
tFaeX? b9HejGRqk>y#T*yHA*/lG!nT9Q/YJuEB=BdaeeDTZ@ypj:jqwmy\qNW<\mlGl@61A%FHt<TABLq@<DZ%
jEG?$/ D*%y<IJWj$QtMyl^6mF!q=dcX?QVnS^W1VFpdZ6>CLXkP!htiuFE8:lK&ah1bEBwIT@BG@#5N1wb^j&8
*wKbp^ FGVHR!l*Y&QZiPRCZttA!1LZ/Dh<B/tFB%>uti??tk^#/n1GP^b?*qP$%<ickySM\L<Pp!GmADie?&b&
>&:?aw j:+S^I<LhaV/9W6Yiib95DXktWHZDJpw*y!LTnHce+/6a/\1D@=/nKYA?Lq#+LG8RF!#T=^P+kC+1>y4
kDCIi& tZ$6HQ1IQAPSC*5#q/%p\?^C?#*a8GX=WA&Aw*kHa&b*F?q9cQAab1W\V?/4:\J1/VZLE&<^8G\\HSXa
M!j6q> jM#Zi/4^NYa>6JFl1j8IEka*!MR^5SKaSEA5d#Rkkj>^FKuJqkCQh4CIB#^yX>uy##XH5+AWY@y5hS4G
n1iP?L t*1<a8wq%?AhmR1J*n4^\AA4=S+i:X6ZGy=?BTljnu/We!F9ay#6*hI%Xy+mlCMilN8!+tL>CHLPNlZY
h=iMeF Dy&%4QXb^uBFGl6JQ%G6EH>N9$mDjJ<>H&RIj6$TAZ!9i/W58F?TK@^eVJSpQ>m?+*4e9AQ#FFFQJ#ZJ
R#cTtn JZ$<@8NKaJ6b#1ZGLEy^cYI&bkqD:cLpM%91qN41q=TX@&jL<>tt%jQQ^4lFW^14kcTFZKV$N:b+:hq#
-A4Beu 0007e83057b001202b4 Page 335 of binaries2.zip
CqTTd: ndSNq1^m6uM%!8>Fn>DDB$PDXV&S:>@e6NdH>:\BT?>9yV8\:ClqcXHPeQkRbiY!=L4myFLt=DJ@/S*m
QFm1%H c=kMdDB@yN8%TX819DhKLFlKd^E+5q<qRP!ubb5*EQ1cDTta>kqEN/Cib/!Ldc+CHC^:bpDAp/PFXC?+
De<%q+ 5?^eSiHDFAT*$$Ha%clMtS5je9a^Ya/\X8lEL&+C^5HM&T8t>98IF/@yBw:^>anmm=ue:=V\n/lW5\KF
\8GY*S Gycaujld<++pM4Qd9mp$G*MataXySpcqM5CXMjQVL+ZqtFD=N+H*%e^NA=PE^V$>/5LSPq@ZGS8@emnA
>P\ZJW :nE^*\KQiQEDc!T$JWV/*W@bZhPd69^WW6AR\%FLWa5N\pij8\Q@<l&@Yy\Ki%T9:qF$pVR>4EAdVGKi
!DK1^K /LWR$RNDZ&%ShcV6CY<Y=Tu^>a6b/h<6**i9F+BtyYS=J?/w=KMdBATR+=E%Plpi^b%+tNFhAQi4caYF
8M=VqH ykiwicF<LBMwF+\m:kc>6V<Qj?:e:<YM?MbpjD1<9C4TtqddG5YY*F8t<5#ij4CFmI&YFXW6a9Fd!jNV
Md1*Y$ Pd=#PZ\dVw=VXkXXS^+4P%>SeVQZyXe9XVBR:1Ia8>1yMZbiXK//T!mVwidlYt@P/PZ:L?ilHSE^Gcl=
K$mEI& numjPBH>#>\RM>VipM4?/\/th!pl>\j^?pDBB49+!QWSiu>R*qHj=Fmc5?<n:LH:8tFXl<<DididAK8F
^<cL\= BFbF*#LF/jBdY9%K6p!@^Z&?&ick$6:L!S>hK4\JE5WHa<BZddbP5HCPD#1hPS:qBA:me<MpClA&ZRei
Hi>@&e tBKATpSYJGd!1epu$lTMNF#KW:K&y$p6a5qbBL&mpJAmI^yVc94=V>qnuqnCl:RS:T@$!#@ISNSCKZlu
R+^%9h uEP:F:/n!N!wLWdu1kpa%/91/\=<T5&^!Cm:!19qT+p?*wLZRm>&q/KM9accd+iL9pjI4=5$4#kQe5t<
u+>aRN ymXyZ>i4%uHX/H?*=Sp>:\VDCta!Gj6YaCSeX9F?yc&HmtS>mhaQNe1#%utEm6=F8*NQ1*t&9aGB\a$Q
TQE<&D aPXbnpQjd@jX1G+^CX?&5:\!hyGl8d9mQ^nF<EQEnNVH8klA6Q\=&D6q5>eh^L#LIn&MF@B14S?t5ke*
k9%b&: py>k$iQ!E\t6FGZl%J#kHhi#V/lRS@W1>Ju5k&\bK5tl\LIqS4cki^qbQeaGj:klt#cnhS@V/+jn+<VL
HDaBmc 6u1Y!5WWplt5k*lPW$&*i\hFW6m@%wP%<5EMdV<na+a:6CkTE>dZ<P*9:R^WQS+<>+k:TwpP8jd/GyEZ
IpHRu1 CXjBL#ZVwL@<M?$4jiGj6&GYeu1^=ZPGJYmHZX=/R?eVLTPjE45#nYX8L%RlPB5QZ*6b5GpQcek8KPJZ
44M@wc CDP56BbVd@AZV?6WiS+GA%^@X*DYjuQM9DXkaZ**LSdFAEQeawB:p6^m+5=!wjj64#^m/TlEpZJKDABX
P^/JqP et$u$$\Bt<ciVLuSXqI9G*$ndE!bDiu<%!6^^#HSlmu9GL?lPMc$%49l5mX%EGlX@c+?>6@>1QSnYyRB
?D+wP/ 5WdnLIQ@1J\Aa^Kc^b=mF$>qW!BeM8Xi@/D^!X*GM*umpFBQ9=C:I<!@#enBP?Zw=d8&lt+DcmKQ=81i
IShMhk XNauX+/%DC!:Em%apbHZT?^9kTJjbj/KAA4<GV\BP9#8@\Y5e^cc?Y?#Nc*Q#MA:8%*HeMG$nH6BB^Sy
bEBhpG 8aNciTq^a&R8S^<qndjW^DqNyAw*A=55Ve6JWK*p18^PjZ+$#SNEyy9qH#8\9?<h@+dFJaJ6iZ&4puP*
ynwp1K YJ/k:Gt&\a$j\h9!/EA!qDqaPK+SimwNVFnjwlSt4B<*=mRq>X#Qi>4B\NPV1d$Pw8QP^VDk#Dy>aBnn
Z:*SLh CGkIuTa8+w\*SQZBGKdGHH>pa@D1?+&\!\\5%!b@b*Vu=PDS5Spd+ATLk>8$Q>/FAC1HFEEa5P:kuFaG
t/Cw66 9V%d#?%mlH8WFD#$k6ejt4<wQ$@Shi8HG=%YNpwnDRtCE4PBGp>6l4!:a1w@X8<!+AkN&B:R&uu:4%>%
KePnT% b\b5H1*$eYTj//JptWhW&JdYRqcRA::R<V<ZR#wh!I?Fa9N@bp/:t%$D&G9#yT#bN*G+Hbd^4Jdp+\CY
L9mwM= M4m^I^8y9J!/Aa4lSeyL=^1%JRG*=Gc$SlQHqSikT!GA9*6hWdZ8CCtLiP4aVjBnI5B=qeZQGNPZHw9w
XY@K:< aI6la<tZ\6mphqREBailB+#8hjbRyZ:TF+%QmAA9@5Hd?DMD1Xb!^<SqpjJM^B6iV$=kKdpjiVbe>RP/
5FM:jE w=XacFF%pp&J^wF>QyL$H/<b6jpNXm=EZ$1lEw#@F:X1=SHkEadF+dDaL\!F\iKS19k*HE*GwFSTc96<
>M:mG& !@=y:j8Mk5yiKSph6A!aF8%&^aPBY^Nn/+a%h\dLk%yFq1DatHKlJdQ4#+a8hYDb5lWcy1Dn8>?!QhL9
:WFXmp dkh?6L$YS!+@a9q#Kk\JY=?=LphD>B^1q&\?G4<Qh4?6&#PYZF$^yShdWn9NGj?y<9NZK#F=^Fn%?QkP
yX!pBY mReq^*tIe<hD6q%l:e+aZJ=PNi69?KZp/4>Y>5eh/5BQ!=5nE<ZhW$mM$q:4^HStBFYqjah6QX1kXX?M
T!9WRM PJMwpjyb?K8Nj+Z1tw:&q=ClMtHZ+@BF%kNR+6u+SWehkQ8pjPkIP$YV?c$ECpTV#uutd@t:R4E%qc=4
IQcDZc WmqAET%ARR^h=CF>tLAuaTR+Gbe1W4e89AGaGSNmS6uCq8Tj/pNqXBR!^Q4FG#8$@mK48AyLlVjNFt=I
hT4/!1 c^e49!FG+KEBStd+a!dZwF%db#tZBe6/wBIZVaKT!*JXu$XMV&CZEQDan\ntL&hkaTTdN$:IDL6nmu\X
P/eG:L T4S:8NnCj\&8?Yl=91VWC%py1Xn>YS@W@=j6jD>CkPYenjGSpthQ<%EeBSlRh8$*RDy\Zy%^yW@l5J$@
Rc\Cp: \&yhwLVi?Qb>V5nZ/eJTZ>H*:CcWn99m6V8d=$%Z\Hb5CRG9LVFA&RYPClPA^>N<lpQDQBd5H6k^dnpH
Pu8/TP bQ$#&9@=TynbwCY$iB^iJyA4AYAt9LV\dq6?X4pBT8CZ5i6^#1u&+j*TKRn\&?$5mReucJMmK^lic<Ia
=i^Rj? m4nMukt!jI8DliXe#keiNHmMjCV#846XGPn*EX%u5GlwYwit^quJ8b5^4w5SZVZT@AbYDZ1VCGELB9h8
WmYA?m 8DcKlbSm+1+<JiapmP%jQXbe&VXMqyCjmb%@+Ib\BJMJaW=*%84?*cHX=##Mce9!?nmw4tp9b>%=m@&8
:6TTi? $en/*K\FWQBB8hJiVY84?*^it=I<kNu\^R/AwQPFK>E+8I@ZZ6c8%jF&kdWMPF$j<ljLT<6=HPuqQl:@
WC4*6S 64n*NCXqyD^:PV9yKFyP^6=W+n6HH$?=<KelSEW!=?LbYLT56K:?1iPn=#?mjn/DXlZ%EuVbin^qhG!?
%@e/aV b^<P9#4lchW1!:wuQ/Q6b9ici?!$t=/kGP=uRB&aqL*G$9ta!Jj>J#>+FG8RBBXGL1Zu5Y1RS@a#+<E=
B\Q4lL Gcc@!CpT=$4G?L6!R<@5#/$cS^Qyb411^h^cwlHd+Ah&S<p=w+<$G?4KhXp:/uMLycP1\FX4y&HlkkLw
iBRtZX \Tl%Y4PF>^1DTYpY1:WT@nEZpELlKECm<Gn<!dtS+&ZGKRmmT+k*Q?Zn&VDZCJ@il#\9/Gi&>Nnb4mTA
>ahy8S b@It&w1T9Z?%akh^i8HFE?%h+B$?Mj>ww\i*A\?#R@X9QcLQbt4K<Fl+$+h9=jt6m<%XpZpne>jiQ+PT
ST@Da@ eVjq1V#BW58D6?M!!cLnEe1Kpq?E^Aiau@HRZ1?T!n#$jh?9nM#$!l@VK%5^1TCeQp=HS\beEZw*I>^a
N*Eyh# N:8R^CecVLFDL%awTb+q$H6YTZiWh*yeL@jRea+HyPBtlB9MwZM+wmJYQ1YN&:&pjN\mh?Vdc\E*N8HM
lJpHY* F/<Cj5ZZ8Dh@6H&=e&kuc4JVtV:%&J>5:tdjML/Z85ni@kcTV+Fmt@k+:%??DPc9HZi9*@bimkVpnl%>
L>iEJP BjQ#ACdtY%tGq+lkVjidld?qbdSnh=WA+c9pG@H:4bDL^cQ6:Zpb^!uEauG?VVcchYtA$VJuqjVX%K^B
>BauJ+ R!$/JmFSbuBicId<5$4$4KHE8Vmaq&XucRH151F<N^@HQ<5P*qIXGh+hb9/FPRBZ8e\++F/D&LFQ4^QL
Mm9q4* \j\EQkudhChMc6%&T@JcceB5AZkJ@wtd5j:DRY^Dj$1X44jtV+!qXWI&jt?KDTSYVJ6Bjb8?lqLdK^n!
8=D8hp \C=j%mWaE8kyd4@eSJ^Fm<N\lM%ZG:K=IWj89qWb9a^=q8w\/1G=KDK5^K*YGYw$PFP+5Z5$n*9t5mlQ
JSj\dJ Sk:JLnm<%6/:lI4:!#NG/P9ATeMVaPnqwhH?ZAHK5*cqJipX5EmkJuT?dEh<m1tyT:I?q!8XST6Q1GGd
=/q6pA =?NV$Vdlp%^1J>R&JkZ\:8E54CdHYL$Xt6n&$K8cXYkQi4?JQD4DwitkJDQVWySD8qNMFykuWj6l&\!S
j^#ShT !D4t/8>4+:W6896KHl9Qt?dX6aw/#y+k=m&9EhK^wij:S5M1Za/F!5Y?q5%#S$6Va<1X*M&?+KJnXWW%
Nq!\hV djp/qDq=w9kiRdH1#eD<H\biSy@IAd41I@5L6S9u#?QXNtB@I4^Wc>FT<PZDkY%^n^:>\VHmRjH$YdLd
%:9l/^ +bmNXXnL#!*5CJtp:Dkle:W\YP&<j%JB*y=T$@K>NX+#kAMEHdILSSQ%imW@kL!wSpy#%bZk!*<QjGEF
4Q+:PT e&>Yu<GBa:+@SW9@QGG:E#GEa8i!jCpc<SDhZN@D!aaMhm:Nd6qy\JREQ@NJt5*A6V5:8**Ac1XJZeZ&
a!+uPe !e<*:68?uclRYWwedTqb&RT8te=H9Jn<CdGV1=VSICq/bNYX*X1KR8RiB:&jVyZ%mu91Aub4Z>\N&!59
?h+4yI FQ<W4%W9nM\1Muq^nGM/S!XiA@5hB^@1:A!!^kkwuZEEiViE1M1n@:wp@Tb!eL^8pi<Y&Y*uQF?JG:5Y
IVWKHn q&VTX@Ld^Qw<t5A9&j+B$CGi:Eyl#Bjn+^&C4m/mRu?AFcPtkM!qbXuP:&J>CuNjLdDMjmLu=APGn1YR
uPVQMM #<9/AEa516<A#Jj:4t^:<><4DT5ejF%b?/Ku6iZKqK/ZYCQR+>*yC?d!jQHdiYk8PbDQ&8BYAeZS8P=p
ym$5+c dW*=<+G@AS5E6C$4@+I/J+6#@?l^c^c+Ld@kGVB^XNc6T^QV@$\1uEq:\*F9lF1pI%T4IQR48m+VL?!>
qi>%$d q@Fnk@1>m6EFL<9eqTkGqL#>YYRDHJS*Pm<+YR&8N@@Xd^&q#aQTL:*F6nXYt:H!e9?q5>C+C9FDm6FY
/wut\< PM+$941:+lAAPn9LetKHby?A<i#<aY/KdK&FRl55@nWM8JL$9n:1^qBY$\%nt+Y+MZaLhnTSw/%W4^IV
#ZeaH@ &dqhPPWA>iT?$68LP\QI*FSHVYhk5=cn\bDp8qdRmmE#!&d+Sma==>SK?yVAE>BJ>PLEB6SD/=lb%#CF
6>%Fqn :/K^?P/!p#he\F#\q=4tTaE98qEu\!e8VDS%/=Bnd$PARTuVc//wN:thw66CNJ?PK4ACP!p*&GSMHq4Y
RVE+%c CJ^ht6N>!jj\aq+p*ml^/upHp@H$Hip/Jl!lj@yu$R!9\Yh++nV?C@8KLG+DibkPy1/d\LK5Wl!IT=C>
yt/Pn^ P*eB:GQyuwSD+llE$8$:/<MypkARSqQDSl$PAlt$HbFG4F?!TQCI:kqKPH+4#>k+Z+lXN6?+@apZR:4Y
FhB@d! E*ai*&8Sic*uS1V:WbGRJ1FEiJt*DQ@cb8hB:T9%*p$5i>JVGW\ZDY<T4dcTNwa>^&aFw@<8454Xkid#
jw!@\A 4ndhVbW6iW6J^&9%4te@=:m8Z#jLDkK6Cn:WCDEMw4u@ekjSN*LIwYaQaJtt4pkCyS@6wQSqu&KAK+>K
-AZel5 0008147abcc001202b4 Page 336 of binaries2.zip
?Qd6pH G/Pe<tdiVcKXEWdJtF*a$aiSB::%qI8P/!*d/Q%1MP%B:kh9cwdacHn/1S/EMN+pS6+$*>^R#q\/>p=9
8DCW=/ T8?%1^E:#EnNL&ICnpDwdGP=XwYtKLMD:6<8L?mdV&<uFitBLMFmm@$?q@$SA+Q*IMy5/HPS&H:I=kpm
84%KAQ *W8+^&F^?HJN?HWA:+w4Dwh%M*qA%ny1ikE*a:5%b9X?N@qD?amu9=pM4nppW!R@ulMmdje&p!wFYya#
^+8VN# 5L?CdpD\5yT!?D=Na/L4%I%^Lm\i6e?e6Y:#T1P1tk$LHXSqe+l\q!H/&<uA$5/Vk^\<+#@DEN=mW$a/
ek>9%= LW9!ya%#HCa?Z=Hw:LTKqCHiuW!Xe#P+8Z$<QKtel\<y<w^^5ZwF^FWTYH!/T6=:Rlid#m&@l6lt%Z&W
!>BLFH K%98E?++lwuWYC5e!Z/Dk1\LI&*^kcRiR8ypZW4$jLl>1L6aFA1<euHnu11dn@lYmhQG?yNQ89=&Rp?6
Emk8hM 5KVpp>96cn\h%A!8tE8S*B@!#INHAq%\RjZnkl5Ww/<*q^ApTlJ5ZF9G8$yVPWy/#XQ8E6jGu5uI915w
c/LZlZ S$wE+1W89&61l@KPSkTVXZqEqd=cQ8A$8q5tGHVkm&mJ%nCIt1>y!aQ<^?Klk*L&TZ169WZ&>YNp=XHN
Yd:XPL EB*HlMejZR$Nd8VqRy@up1pjD=P<bCq@EwV$cTTYF>w^kpWkQ4#>p<Z=AIj9cMD^F+=FN>C^^d@+X=5%
dP&a+K QA8jP=K@=Hbl+BZHKtWcT\E44G1<TWil@qRuhPI:N6nR9MpSyI<GkdEnIIbQ+Ia\B6kMSMyEtQJLmWbH
5MnA8V !bi69eQV4H%i\G/b&m#jHTd^iNHXP9HFRQHlhc:@C\J6p$/GJ9T^l:ipqR&HB*!WiVa!mB6PMme=SV=y
XJWVDH Zdy1N>1SNil5YRcEbA4/yZDH?GC%V%!d1I>+<VE^l^4a6YTkj=&uN?K=5u9FDNDIQ>Fq+$:eB9BpSJ!p
<*c8ZQ SJIa1?EPR%5mmi<jIVIKJ>Iye8dN#CDjJW5^&mI99WhY/c>VtyWY?FpH<E4#WPpkM%N@m8iuqDJ1y&L!
j=TW$@ i&PDBK8X\BmDyHTcV+lMja9q\lPbqY*Qdk95wKG9RKE$cR*Fu*SV#kme>y$NMb9b6kSGcnl@C1=@/:CK
ZRKt?a 6I>\Cyd<ZwYuSb+5^etj8Fm$Y?d#F$bdtec*/GTdh:S1kwmyib%5I:B:IuJ4wiA1NSY5BN#y&I:MSdwV
^lS9yW %Z4HZH:Z\k^uCc6/PHLpmIhW\yKw+bab#y=#W*E=eZWw<BF^IHE4*+n6DKLAHVZE:yb$HnBS49uw=t9I
tZuJQK &eYQPmyu?j!uT+P4dXmR65P#aE1!kt8MpkW5HlRR%cV=dk4*iVCaQh9SL8\@!HI<bBk5EAyL9l9C4dpA
V//:W/ pWDAW9En=eFK4emhLDjcwK?qNP&8Bhp6peA+HkP9WFWMD#4yCS6DZ*y$F^Nptb\jm9RCa8w?lhRQhjKD
B+bST! ^4IKa=\CuE9QauZS4ai%?jqn#q:lADt#>A@YRQcCTb<T1@Da&n5=>d@X/a>KiH/w\5^cZQ/<HZ4yVmld
e>i9uY HdhEQ+tu\T+@/l9V+aScpEWIReY@PIn>c$V&MN*XSdjASWZ/qpwHBbbHH4%>XL6L^8D$8\IQj+SbuqJa
H5*F=6 Ip6KKR5u8&8cm6T5/1:Ab$C@VA6=eS95*h/$VF&e%+5^MTWueJbEN*#Zu/TA8\I?GNW<1DZ:^C%T#iSC
X!4VWt *VQQV?:$Qn*HlKu%/IcWak\#INP=dC&d$e>A5dZaNjJC=YElMJ?e<SpbhPj?nQ$d1kFipNAjGt8@&HbY
jlTY>q ?XJdWd^+aM=B5Y6eh9C!T$kY?!9yjcXC<WY$qmEHZZ*wh=eT?>a&**$n\cDq+:XE1+VBA&mH#qyZbSN*
TC\kNS nSVM1P^/@lyk6!pti6<V%J\Xy?FKSq/V:Xn5tmYQ4N*Z*1!<Y/X:?KFZ14+S5E@8:Pi1wT+D9T!b!tJk
uV*ZGY hW9Hy*ImEkL^$*\W$NameyQc8+RXwl$yt**j!EQN*=%MZy?uEI?@c\PYYILVi/%E/?A4N9Jnncd&$kw^
/8#\K@ &B^T%h9I8\wM\\//*P%IHFdJu9BSattaYw!B1HwRBBGt1l6&mm=+icPyiui+5qVIR#Ap$YdePZeSEy8W
lc9$XH uCL+:d#/meDZBy>^L/\daTJ@TJ?^u>6t6V/1@>EQ1<1L?aDnFThQdn?\8:iJl=p%idjcjJtKEZ4ph*Qt
/1SN/d QtX&^I+u=G/:YBKZZY@h@WiDA>/RaDMyVpJ?wT>yW^P=Y%tQMj9/95tB8W?/tCI>G^>Hl^<WbWGX>>EF
@KCqZ# #TSj6@8RdQ$eCCwCW\^LD$RuCcPj<Jp&6iA&wPZEu1*AGy$T\IN#&L5nmcqQ>9JCK#@B^>ndib%yRwd8
taZBdd <&BLjPiihNY6k8:>CZ?qbuNG:y*B@%c6^!aVJ\d$SQ%b9:jN<Wp8Yi?JQ^9n9T$+5Ld@i>D6IRtY\9<I
CB=KE# =YV>uaWqkAML>eVCC@><X+Y:/:H@&Q@eTtW6#ZWYq4111d$YMlWb5h6uyA8&bqNL*dae#NJ&neYw?:Q>
hm\H1> 1V*cc!WC%4Z9FyaHq@Pp4G5\V#Pd6#VYwJ<6yC<<=RYJD$M/k/%9kFD/t@PMhLjh&9*cu*:5/DyQ^CLQ
%9Jl:u CP#AbmVV5$*LS$NXIYYW#we:uBLWlL\yI?$JP&KTEFyjRi\TNIe^HWc+tP!X>PuB=XKqj\ht=?LtBtMK
uAymEA &j+uJ4C$+>HnVb&Zc@cpy=WG#&1w8YYqpKQ9*PCN+lw:JM:^?#%w?iCuJY/6H6e&QI\4BXRL=#uyiF?D
MF%^mR Jn=4cClV=Ea/#MFnjpZ:D+*?YL%FbbDaZRi\!p9EdwD!YKt<SFF+qC1KkMQ?RcyIXR\c4=J#MDPJa@II
A+B+ja #?CPCFaV>iyLH19F@&E/kJ/+hddXWld8#=ybmAGa@W!bIFAlek<jE/hjuJE/qyG+w?^eyZ6QhcCqyX8a
+9h?\< #HW=/V6SIud9^=?=kb>qTIIMaN\dNBkCqH%<Mqy<I=:caS^nWa!%u8eCnGT%/6HXQBM+&PS/mPkD9/jQ
WXE4Ma E?yqWyQHPkdhl1D$WLeVhc##FAI/e=F^*^&+M>ba5jt<=qTeJtFLGytMFG*eeJV@A8a=&5Jc/Fqe>K^c
P5=8<P RpcF@>8lmeZFXGA4PX^=/4DGecwh<icTHJt^@JXIq^Rj?R?ZmueAH<mM8Pm1Q%d*#6dJZGe#bFeE\Dn*
CQhjm^ hC/#a$<ZS=\X*h\YJa?a&$>X&c*4P!F\/>iQ%$u<=e>d=lZwRB&<JcMdbMDjBA4/A6C6S9X6t+4H?e=y
EE4+hJ iiZ/VuK^/5LVpeC=1ai::c?D\6$6B>wdy\KdXCn$w+1wBKSqHB?dmb8FHF=kJh#1eqT$PR@R+55XKWcF
NDWpZt p=C:H@D\9i1BwVI9q=jc1p%<iI?9YmnR$TaECku!DScpT>/mRP91nBHEuM6cn1DuPDKW:XXIWX@M//<#
nnh4@t Cm&Z#K5*Y\G%>\5u49yt!ll=d1=*Tjd^BZXK#eN/jc1pw>ZKd>+46YH45u$a^a$9>mu<:MjbW:R5SZZI
k#SY:k @!<G%ieJkdp&Lw5B*&J$49TbQYZ9YcZT>8eSjjRa=9htNlY<uj=KGCn&pqL#??<jDLRH%hAPLX@^J@Z=
F9LE%H %6*d!M8R!Zi>>kNVV=@GGt9e%h@w?V?$65NF/AwBN5D$jA&yY^>T8<:tJKtc>^i/WZwek4P\kHta!W&4
*IX!5c 6Q+NlGa&dL=CMZ^<Gtku<Z@/4E:qG5IiM^<P4#l@+p/@6^6E*#J%#JPXcSV+a%k!yS>kjd>5E8<#VWH*
d8auqF n>nTSWDT=/b??e*!SG$jW4$>KW5juP$y$n@:Yu&L+yB?JHc/MZ6C5ni6KDLY8/QM&mPS\l6wu?9Rknd5
HHABAb E$nY58>e5Q8LZX?w!@itA*QjC<nnIeH>4h<@j!bc&j?iA!Ih/n+tkui:#lITi>hKeM$l5ikJ5=&Aq:T^
D/CijG Wmb%db+i4Ab/NA$/t^i=W&>!V>@V\Z&n*dIAcME*@DWZ=?qC&dW\6#L>Ic=TT%+5AE8*<?Ci?B4mH\*H
Scnw%F I$bRHtLPt5d&^E:9ujJ4!N+S/4TpLY>bALQu%!#c>5XmN8@8$cLtSJt^+Ze5X:Z$KiLH$*kFR$1NXVK/
XW4A4K IJ\H4%RA?p\XG@HQSB!9NDT#w/ac&XuWM<ZtPkyl\uV+*P<15V^XK9D@98>Z#:ulLhBe*d>Q<tMdZ^ME
jFcRjW i6jIPT:wkEPwE5byG?bL*yt%ERXECV5KB+PcyH>Pn#nLZ:ydqtD?=YCct+?9QNt/?IdFki4bcNhL%L9D
KEMe4/ T#94KE^9iQ$yI#X/cn$#qqp9^Q<V/QcXwuB/4:KTJ8>W>>=e4t$5mWBllKC9%!h\&Ru\P&uV#p*B+m^E
#BFPac B<HYPl<q>&+Y@dMu9wyd<6+P4GE5i&1Xi66ame=AhiEiG&y9cAW:jKjXab+&$5c8*FAupejn!QIDhd69
Nh#wSi :+V/#t5+hJ$d>%\Wd^^*HjAT^bT@G44>E/Z\lY8kw1CI$NMR&Z#H$%u$@hVG=w/PK4t/CQ^hYbZJuXt?
h^Q^Kb E\<NmZaHnt8/p<hE@Km@NuRcn%DqAlZ?#RwlB1<\@h&yXChB/^<D&Q$aYyncpA$9^IV!PPTKq98wbRZB
:jLEic !#l:wnQVGJN4&%ITn688TqL8<M=W5Eq*8h@^j^RP+jDthMt4y$b8n?4@S?uJc#hGyA+>QEG@:?*hn*:Q
plk6=p @C<$4$\&NCHQ?&Y+yYM@58X!ck&+1p4T/?YFFQJp/:K&!%SNRC$=8Z:^D>t&PJaHG^$&:bnDWW^B>HqZ
p4FCkY SEb4Q$SS:nt@<#tIX#D$1=BhN1Q#:ddI&iD/5=uXy=RYATtbLMmFCWM8iV:j+i1ytN#6#>/+WBGVkQCq
RMJ<Fb B:YIqL6^H4@N#4qSt=&>Del9&dBLB&W9G9EW%5>i%<n+I?FX5SS#5?JWy86iTiF$jXp=a4$eyptDSB85
t%IX8V qZdw#t*a+*R5euTXKdnMV:b:E?^Mc*DuXEET+hdBKdc9G?Yt9I<d=LCHwC:KXawn9mi$#pVY:ikGMIl:
eXwwYL dLHtncDGV6>Ce+\dnP5JqqVYq^4c:WMyH<@Fl@@<VEKP%k<5p&iK8mbDyp5+mW1L5#LZT/#dM96P%wey
tK>GtJ %nPaP\+yd$@&$ce8qc/w$aI+@tDK\bDp<YDtVY8DwP:!^WbhwRde&M\q=c=W@#*y8&<m^@ItSlT9=mD:
*QwWJu :YRWB\VWTBpqaZqk^D84<NK6a1S1!?\%\tP$+MPN!qIjJNCk=LFBkh41T<9XlEcLXuM9k$AVHBYp&RSh
@EcZ5= $DZb?BM&hnNdiPPG^LY+4eyDMHGFhKRA\4hBZCtac>RHeT>W\mQp%&/qy!4k=?wH:4p&VD&^VQd?ju#l
qC9#$8 1/j@p55mq=pNp5h?4mTtR^*AucN6iy65QNSCQbj9=h4YdY#ud<DI#w&j=q56i:aNEXw%R%q$4k6GuP$4
&8h98D #T6e@1kC5F^bmIH/eSwJpjI=nC9XRcV+HjVe@<R9/>PZyA8bMY:qnJq4@S@5?C<8A@J9NG9qFd!Ad#eQ
HRR@h# </NHnd/uk9+G&>8qYVhWh/Cd/l+J9Zu$*J6dn8G@:>WuV#>EM1AYk?Wql>>DNPm#4Q9TaYPS8@t#&NCF
9QW\&l 1Hw?&%84%dJ9Lib5ykPnA6kXhNb$FV&q9%=Ej9h9P!%6#\VyNjSQ@?nS^ZRKKA:4Pt:4:w96na9B=@6Q
bVd9T$ 6JN%eNLe:q6IapyHeFi1a:l8TL/\J\h<TI@eL1mq&VHtGNZ84P:nn5::J<L4m6k@tnXtWjuiX<1FTG?F
lyeSJp >S>m!%RubI&Py?cuyJI:K5M$QGqp^<KF/cYkX\*C$\Yb$eL^Buy5M$mqFCwReI\t>=wKILEp4F?YG6e6
kWW@NT /a?>ZGei%#ZE&m?m1^/!**jeiT8H$>QV&^h^1th5>biJMqyKcX\hYdJXiPSWNaG%%L9^ZEjP8C19VLp9
-AI$6\ 0005a9d4d70001202b4 Page 337 of binaries2.zip
cBJj6A qZ\++:6?tc@ay*=5C*hJhq4K>*cq=?^nIG#bRy%84Sw:I6nKiC/n*di8qMM5pG9%9CkQ4=P$hYk%m/in
$JNI%C ZmCR:ZhGudc1p#YjCA+&<w!\Nl1&KH&yae6u8!N&dk>Q//WiDAN%#KRw4P6WF<K&IHt5IEJjh<DRlSp%
tkABBX h<?1nq>lmmhD^>hT$#k5P6PL9\l+b=%im!mw$i5WMJbhl5&ckEuIehjcQI?/Nppqn6tPRZ%WV%?IIy<&
>+QPuh pRQ=@u@&!8Dy8iBDqK5<JN%k>9CIa18V>+$M^\>%QDy>p*4/<%=&#@6emm%aXWI6jki<JBLA?*Mb*/5W
6JWD// M\!?WHhbA^qMGC69?a:1M@4uTnG4:TS\5WM=H?t^$b\Fn:SVp8K?!kTMbNV6D%WKQI$Hj/#KTe1\/cp4
9:Q\S& 9Bw>Fa$&84$eDqKFK/J^cD#cAkXBKcJScDRGDWanMYk5Gk%Gt/C^iD\cD$JlXXBIuJw1>k&XR/IIYNW5
&JwH+G n9WLqyND+FW\KNYMGkaqlycDK!JScCRcDWRlETk$Em$QqycDIbFa6BwGB$MyIbF+NBwN^CPSc1wELQaN
d!69JI kTP^cC\TBWbnpGk5Bk?XlcwTCQ<J8m<EkWhm$SkMBINS\&DS19kjFIHBwFXZM&kMBIuHaXGaD^TNSBE\
Ew&$w/ tBj<6>baLBd:E<PlEWkeDwtDj&GR1mke>k%HI@BaLQ+Nq@?NS&nZqJ!W#Xl=yi5%&$wK@FTV1qWS+$lm
%#Cld$ VnJa!5KLPCu*%*B9i*8ejq@Z<MM^jd>b>umHXK6kKRSjAEXYTZq!?Iq$N+aia#AT6eJRNkNP&\jV@NFA
nWQY6I 4&8=iN+m8KW4YVBLlJcJh#8nhLkLG15=:8<jBThLmRqLS=Mw\5BNb?mtHLWE&hteJInQ=?>Imj^hQCTJ
B%uE$N Kkma?*kwcbCDVbDYK<8:JYqwEZ>VbyA*9pn?F?CkYHTahiTcwFF:9$dGX8RM9#/&81:?lMm!wRh?5jYm
>hVLi* JY++t88SjNBLcWZeMP%M/M@W<L:b\ANd=>tkRFiRp$AmKqiFG#k=CSbW!LP/L9BE/4MEPmH9tl^ahdHV
@?B%I6 R@ndMBJl$V=BTqZX:Z@Mw6%e8<c#$N&W>6D+FqTS#@#I5wq<%+pFNVQJmhP9?EmV*SlXHQTmqeGiSH8H
n*!:\w CC<FW@JM\BQEDPi^8wE8dBJhJGw4cd5GZ&Y>A@N#i@uG\k\<Ea9PPXDCdX1a4Y+C$IiILnV1NHHHhhNq
PncB>J :J:%GwQ@dADKTn*Lc@lwWZi=qtmybKcJTDuN4wCC!>I9NHcbK&4+hX%*b=mFuAh4SSP4nMY9yp^P*iXh
k%<R1e P4:Y<#MMI8uW&nanQ55@^V1l>P/n@AY\@Mk&c@?p=K/=ZHVDXIIQRHNK1hNSjc9/\bL?LK%Kj*Y%idSA
$NV@4q 5kYdIkM>\cDtaBJI!q>YmdlI@Ed@5QwKD1AHnu@Jy%&<euyj6XX%T5QnKjy1Rh:A\Z&#5J4aXykt@yH/
qhNukH ?aSK6>pGV5/<hFqSY>uhbVc^blw55ET9XR!C\u%wGqa9b1ICAQLClT=XR*BlPeQ9d&Pc&?mCY9ZqXGWT
Ab6^Xy #@%4PJ?Pe/ed&HwtN?Wu>D^:M:Vd>V/**:ZV&8unE:IR8Ie&d8@PE:WnTaI&nH\:bT/w1wANZhIn#hMB
#Qwy\: q/KwkN544FAHhA6%cRDtH%py?j\1cTJ$/4j>YLSk*cGBEtPTqa#I/hl*8FV4J%?V*@*e8=w@<4:*!CVH
pM%TGb +\VmS8uGV<@Fu?N1?&?P&qih9AXtRpu8Q$d^NFRmqdFDChkIJ?\>F9c^Ena@B&uJlE<J^N=btP5PW?dB
5VM%Al H@@lPTWEhk^eF6C@BZm@FFZJN!lZH%m>c?IeEYiY/pG=pQJPHd*MG=q1EFN+\e=d8wIyClj^8:RA4Fb@
j%cPcX \np6*aN5eZwdWZ:^J<Ym9\q5VRJFuVa*\Twt/Ny+=eyS/j\K6#9bNdG/WpBiCJj\&%=6BekR*l&T8w8@
p8Me4W <mEjB\&9DRkjyY+y91nCpN1HlVJLT=WTye*A1:I*iDJhD?9jApeMj9F&qMWu5Y6?%Z*i8^dpTMVMtB+q
Z>cyq$ i9jQPH14hnZlApZ8@%:Yn^NA/@W\@+FXmC5+@9=SEuyj&l\&::!AHi8KV%tuG!db5WQPS@%*h6SZhXW5
XR4^/\ WWP?mWn8K?ScVY#DX!\^S1$RRZY^MleXE@1H%Ab:HGMGR5^iGLlW*8NWGZL&MA!=EK6B+w89t1%+1yLn
$LINH< n#WYuM&4eK+&b!%X/&d:BNhS6e@E1a?:FKMdFnN/?Kt*dy<$C=5#?%LNd&i>p&/wKYAyRlKy\yjKEPDT
ii\dw? Vqbb4D89jwQ*%qj$uTI\NRdTl9\c8q%cY?K8&wd>F\kbjGYVV1!:E9IPkWi@L/T1th4Ha#9a+VDMjhuV
i!!W8b n?/L=>%T^%!iYZ\TEDH?KI/lCakN?YPR1w#5Qe:j%#bFSq6:44&k$>VIwi9F*dXy*uD#?hNc#EAdTq%D
%!<C=H ^cEDaVn@jekpbwIRL$ySIaXbY?qp%6yLCb5l>FIp*!pjlX\XNdkmh&M!NmEi*Wty&/WR6wljHpiH9#$q
+8\\&P I9*PXQyLCHT!qZE\h&VWQSW:DKuMS>8@:N&WuwY95t=Q#SR%#>tjX6c/&W>uY<y^%\:VVGP&H#6>JWCK
^RJ<Y/ %VM5M>5?Tm8\!TtpV\KRGyJQFPm+%iuc=#t1$E\ecB:n9!^<5>jDw/n%8q9dqqZ<9jd&m%HYjleq44hF
8Ti:IR jJB@4@5bVLIAyq+SF8IK>SIA>Y4ZL4mIQn%P1CjS=mW<96>TKC?q&1=TkiB9P@Y1FkV*\*9IEwKNW8:t
hym/ea RdCcwJ:5:ET*uec:HCdVA%cLPdYdp=>LZJKCZ:myuuW!@dLDLHX^D\p\a*eu&P9HC$N\u51kTb$9:=jw
1!jFFt *Qdu*p?8eQ>IwwiE1SpY*TSq!:E6Y<iP4BKF*Dp>Fw9Hi&^d6k>M+t#a!9YKnG!!:b86DGp?AP/K=m&4
lcJ%k& bTuDb+5u!*X\u8pn1q\Lwhw5mq1w@FKZk#i*EjN@/?1M5+K$>?Q/%&iFdN46j5j\yd+y^Ln/$=Xny^Wa
Z:%KEW j4?JH^uIpCqT!Cl@X*Ricn&Vn*=\M<+qWq\t?Xd?jW=NlA4BGQ@yu>Kn?9Nb#m9qXY$ZTImcQ?#TPMBW
JwV1LF bBHI<+q\M&#9Rqt\9A:HF\+EDWSl^A@AY^\T8D6p<Ej/d#aW$iRNu>DpLj:Wnj5R8M=eAR#Kb^!=\kqm
DeD$dm 8tQq49Mqe@SYYEd*9R%%R^<k/tyQL85n<#8jcdjBZ6@>w!#myL8hDX$$CWqXi*X&K@/Wmdy=/P*yK=@\
lDtyc= HIaAN<j\9w^t=L&:D8V\IT=la^Ze>QXiEeT&Yh4V?m%>5/5<HE/:nZhHl\Et#AE<AwIWw:+Lq5/m/ddY
?IMP+M :YtbGancc\W>t9u=lN5R*@iP*4e?I8n#PP#/jL%<bK%/Lq4wk$uHe?G:ERX@*Z$4?hYRLWT6&Yl/=jn<
D+CPZW 8%m5^==nm>NXY9cyk?i@ye*&kRCG/G*Mlt8Rw5BdXdXdBBM/pD:8QPa^mCTq9@NJh&$4RLAMYRdd<:e/
:\i5at WciQDZ1D@a%hD&JqQBH:NhCK\<jNGuWJ&jE9MMVe&*5a/dpAq%SKdC84%$M&<RJ>YmmE#NuSA%9R@#:j
/MP?qS jiY9eBI5E*=Lp9NJ%G%@<8W@YJ4npD^VB941Pji#qRX4edElQ5Q@ZByA6>!BNk*+Y$\yHY8JRjVb4F$n
$#SpcG jq=$81NN9%M$MKb^yk5\W:EHnypyLMMB#My:&n%6c#+B9Dn*S4yN6K95XN^8GuXyTXWLK:QwwkWwi6ld
eml:yS +caI!CSF5?N^^/KdMiB@wPN5=&JIdXwi<:*QR$tMuTPA&^EE+%jbayylTIB5HVijNXGCmqBlK^haF%l*
EwiGjy G^ZC!=+?$X*PR6\SMHKqYcD@@C9^X4&wDiB+:M^@Ve9F>!!VkhW\@?MtqwEy*!Kye9:yc5Bu!t!+\VI!
DkP*=u uSXyq*l$L>44m:?RQ+mIn\E<a:nV?1Qt?M6D>#9Qu46Gh\*^Hh5kdhnS<:P8qF?jbGhZKiLpCSdX/\V5
<D$T@K +W\G!iEk/W1k4/yt%N$X*lVjK$nw46w4nmc!SV:hhTa9P\YC:WG#*j8b8BMh%^hnJZGY&Ei6?hL5<TFB
8BE>MM Dw8F+QHaJPnWQZqpaFB\q:XG>!Y>YBd8w=Ii^&9R1dQqEGci9:H&=#J1L^b%hCX+Y+j1jH:cne?6@XI6
E^bX8w iIuh$K8mTTRaS9Ne=Yu#qul8=eM&c^P<LVy9KJu=TdAy%J4V!ndNQhLVEtc+aXGZ:M1<>1WqMNIm<M1p
FkG$nG S4!*D4jPhhK&qQ?p@eB#<BT#*eDQFDeyXK<$BPiYw6E+IMHE\>*DXR&8nDd@L?^MGA1JX5XkMBkIAwQ=
TGEjb4 @=M\5GpTybRcK/9D6=+HK/*ZqwbwK?$#Sm?6n%Pu:DPM%a<eK&:P@<L6GVlkj&B@AAAAHQcBCKYYqlwB
Y\5!Kq 4C^CFcTWFEVI%k1ymtElWGw<5@IhieZPdLETF/EW5eJIm9@#ce#V$Qn@S#V:4WByCJKFGyHKXeF/5?Z%
=MMEIK ePbiPTSKDCdHT>mWaDWYXRR41+N5E^MIwc/RdL/T5AaTj&pue!4$Ru8kLG@@d+Vw:9\HYNj@%V6*=J?=
>1d^J< jMnaDiy8X^MWkRTLJNRE%jHc1Q<kJM54q\@&C!W5/kItGVkwEpRRLCYKET!h/QbnSK$\yb\apXISmWRm
w\ntqj pGnSp1TA54F+8tt\E6P*k=FTN1DWdia6L%QYh94<+9+H6p8j4ATy/^nh?hwL1i9d&?R%a#b9?aN8dVal
Wye=A: Ztm=tCDVhe#$nQTeLLB4NnBV<u@E>j@^tBqt^+/EbAF<P1EbLILqEaCqt5PhPcGq@%6@pE*Z@+%Phh$&
S:=5<J N/t8@+hVlXLZu6X\\1KXJQb?#\8R1yKWmChRBBME\RR^J118qK?mBKWIqI9Z4Q/SpLIP4&SCRAwQJIlp
^JYS6i ImnYSESSXWYDJ6XkRVHQu^iCItw5ElBWEFTWjDnkpNXESi^\!EcSIInZ<&WkbpIkwR%Q+5EPAP%Y$cNt
JS^k@L XQPqY4\QSBk*y$hN4?LHRD^CInhMdMTKDBud@=a#Qll/^\/pFpM+**8QqFSXR\=ilRTm@lJTpJA+dGyA
>K!!k5 8eBMJG5%pEL+RmV>$iJh/YD^4Y?KqMqLi>deF^?L+H#jYQT:pwGPG?b#QQwk*yhj%cZq$Rbc9Jb=wG%y
TDH:<! +GcDZS>8:kJcPuep9&Dy91?*P?qVY:Qb&bp9?e?5qL4#N1=8@\hm6X&&@>8#GFp*N&jK&15&=dT&nk>c
hSnk@D qmPLb>w9@V#qq*M@$CV!T=E+cbQ>HLpNNqQRNk^&$+E8!PYda?%Zuwp$uIpCa^XBpmZ!<dND1k$Yin4n
mdX\>C /^W=aGX%6@<H*uBctqPBpF@bjjP@<+LpwPjCdbl%*H?ZIP:4TVVCk$nb?:*%KE&S<WLT4I&PnZPZe8Sq
5b*/*+ %GVpaZHje<&j#daZ^>KRA*atuHK8el9c4F<6DP*j1dLNFI%EI5pTCeTe#5$QitYt@c&4\*NIY\&&k!:M
=1mTp> \/%HRF9caNQ>M@ZM%p:@y<B<j#Tm!BwpN?JaAGw1wkEV$wWewnTtTEC^d!AEbM\TMYtM$!JW+q$Gt8wS
m>T$>% 5acBWmTLCXbeE\ILQXkaCeGKWFVelwiGHC=kemmKCiduHpJqyDZG>BiDmBVT?w\Ih!#::\I619:Em$/j
+CNGW* WaiuEp6H4QD9t%Bq*5bI5M*G/McZ%6/t4Q#9Hm%tEj?*$ShTX%%hSW1hN@?h^>J%uL<<y<hXi#/uW?EE
?&DpD9 Y?14SNiJGn+dt%HInZw4Y!bty9?McDNKbyN1Tw=QnM\&^VL<=@&h^VdR#GC>lYj<J^!p+>DR6JlF5CWJ
YyT#^j t:MDX6VXmj1jkSe#d+PWXT^6L&S%F#NL&AT4Y9?:Vna:<=bYVTX8\ny!ju5juD@RNPV4VTtL%@wPCXu@

-Au*6I 0002ed5a6cc001202b4 Page 338 of binaries2.zip
$D!\d# jE4Xh%LiMNA*&:GM%uTMhB$mCp+KE9ct^Md9WpNy!*J#VWNJh^^aGDqVjXMy/WS9Hl=8Ycqd@>Qpj&y$
hwmDS@ 54y5PX81t#qV@B@QEcS5VHHP%tWdw?5tbS8pmJY!XVH*P@?hN:Bi@PFuNAZNc#Lj@wtPL%$*ijXI%##i
1^HCBw *pW5VM#cQ@$j^@LE<um1?btNhSRV/P%*IZWbw>6&KFBm^E1k4wL%9#%ecQ9jaj49mI/Q5:K/PYP:PYNq
XpIG#R Fmq%@W>45@@%1#698Zq*@AZq#ViHnX?8TWhEFCSpGit/$41Wm1=?:F\:N!&c4/WXQD^e@ihycmhbp/8K
:5=RN+ dD1V1/4?b+5T%9<M6FBXNXBX8%Z\u\e/b#9j9PqWh*9p@Q9aKB8w5ZMERmKSTC/YLBa$q94QyXt\FE5p
yD*6Y: EIERp!WRne6&ywpLZeWS!@^Q1YudnwdPJ?\/^5:9&8+y5Tql6Qu^lRaYc%tiGHSadPV@5jMn#W#@hcDD
y#4ZPH \tkLw!*a@<j15DDc<EV%%GGmu%JBF:p^eNqn?kbTt&>m=HCW:SB8h*:LJTul1\RW8VE^wh@Gp@=1@VhR
MSty@Y 6$Q\Q\FP/BeTN?=D=$Q/BRQ^:/>D=@B\?8Ww:/+MQJ6416KeB!+HP?iA:d8EXhw:5q8*<T6/%!k*Fpa8
hdBnG< i?ENA?>tGe@IQpj!<julm+GiVh46Bj6Lcm<c8NNReWZSL/d+yX=^Dik*%R@eB!=H*p#K9X=^#T<c8DQ9
G8ndiC cAM9Gn=^J*yG*?Ni5X#^\y>WeChl+wY$T%HuY!NQ>5d?Y*NnV@46!I9Ck@Qha*Y=D#^!K$KH&c>1ycM+
M:FXS# pQi@k@Ic&eZa@%&E4lLhHdD@9BF%W@:Kty6k=Y&Mmw&4WBd*S@cj*jFb6Kpktb\FCnphAmWGJb!a<cFA
Vj^AMT MIqEppkGjWPiE5:5K+Lpj\bJ+EV?4@49njq@TV\AkBkmakcRPbASakcIAkAAqR<hMIAVQlApARAAPEC<
4K^9nd e+cptamy1kmytAmX588A!%:R?9PI*8&QeV4TcnB6Ac!=<CamyHiq6lAqnY!YECPNdPK:$pE!?tCcYYdc
=p>Myt aBw6S!>KA/#T+p<:M*XwjP4pkRXya+h+!Z%JS8Hp$%&G#k#T8>L$Au$I#R!cP4NIL$yu!aA*yaNmll/b
pPPq6n F*XGwV/W4py@L$4ZJ&*KI!/diyZqj>QG##d&/BH$w9Sit>!Z^A@1\<e:jEahTKjH/$Ny:FZZ5nBVH^8!
WCYHAn XSbHN+H%C%Ck1a1l$@+&tcuSSPQwyFG1IqZC+M=9:RRQ4I#D</@^/!!ud!SF9AJqY*HpP9CXi%JcBE$q
c6QkV> H#y%$14!c8l&=L#jy9t/ujq?>=E*b55bjQX^Q@X^*:PMDuc>I9q*YDul*A?Cn96?^Y@j69t/*W&6EXl$
=5Pp*w VZZ>J@J!LGII1K/uC>ZJeib$mk^mCHT<+W&YlVdk8GQZW#$I6PWlZyWGYSc<cAl&XnLlYNKY:ik\ihLh
Pb?tw6 EwylWLYL4N4F$tFuHyB9CHZ5bkbbFd#TG\9FGT!hbm8H4Q<Q*ji5EEN5\*Rlb>%l1a@:4TYBIj1wKDcY
I<EKCm /+wEqB<@FJGPc<yhqwe5#V6W!BAiQe?@1Fn=9>@AEMMTlTK<JPq>+!mjQWeMcaZnGIJ4<1!Pe9D=TYS#
m>BaVZ c5TZI6ByAe4ueb\bJ@QCJ51>6&jd*!WA=V#5MSa=ueX!8I&H>:/6D:^MBWI+DQWP?:56kd>:jIpcXknA
VQe\e8 u@*X$u$I6VN+PI\K\%%\q$pE>a#JXMZR<db::QE%@#k?1h$q*F>iXmY4%ZLy%%:1=D\K48kJPlb#mPFG
wH5D>* e#j!8hM==>=FyTD5PG:k*/&tWaInTXGtZ4CGVaNW<a:<#8&hGyCtlE$PwNjyX1P8E61n=9ucSD1cCi6N
95RF6^ IR$$nXV?\NT+ZQ<b4eG@$uqjEbe>88LLF:8p>FG^n^B#u=$hj>*X9Z^C&lQ+kc<*/h9KY#\ZV*4jA@>h
6peJb! !Z^!DNuSHVY<eWCVjYJmyDwbJpTaaj#ZeAn+@#TMVVE^$4kS^widwtGmydP1J%>lIBMmdMktd<ktn:?b
e+bZPK itayJy>%mwmS#m6N^WlZ5cPnyiMnJ$<+@m<t@RFatJ:yApY*dh8&dh8&dh8&dh8&dh9:&db>*?@<=>//
5yi9lw *bQPYy%pM6PXt8yMSSR$uM>M^A=JTM1iBdwdW9bjIB$4WqF&LM?Nt4JniSL9NAFq!:w>EHY$GKCM5tWd
9m9WhX hcJ5&ab4RubTNk<+!wb%<Z5$uLJbFFI&4I8l%%TudLwi$It!aX$MjR=I!6yhKG9Y9++DwXc51E1Y*c^S
n%6G18 $k&HV5>c%qpu>/&y@8lb^1\/YPe4mlbS%6lNuSY&dnp?5?i:Dl^t$^Zij#i49i4p98:49nyqKjGC++e%
6bWuQ\ !8:yK:=:898jM=%1c6:V*V<1Ji6!#Y1WX>T/MZ6Ai$T51<=%N4MjlFyXt4Y\#l:wkS=+!tK\\/H1TAlR
8Y+X*$ y<NTHZ5laq$q<<LqA9LCk^P\5Zul8lVNKVTu<Hb@=6mdt^lM4+L8=51L?W^j@TajH8h/=kHM@+?\M@%Q
%y1GDQ YJkatVlatbk+PFn?a=#@GYdP@@S@tQM@<*>hGSmbGSma&SmbthmatXua&BnbGJuatJkbtXp=@#PMDP#5
eww$H* 4B^MVG!5:E\MVK\5#M^M#K!M@>&Vqbu>j+!bp+Yb@d?Lqb&Vk=&Dljt@m+YbqbtF=j?B@$*M^9qjy@</
&EaJ:t @weatbubPFtbPj+*qJYhk=YNqbPXla&b@d<GNndP@=/N>d>=&htaPSubGbub&StbYNn5eiQHSweNITwl
N*yi6F $BQDHBkBqVc!<6kSw<b$!wtldM8P4XRb1%FlHII&C8+6WXbF5RJ6*5$aWFBA8RAF<W%45iJARSAq&m%M
/5jYj@ XtJF\ZdFKubHD*Ht5uIDy<&HGP+<hB4VB9cZWJ#dRkjV*aMwPP@ElB*#XyTH8N=ie8nAK1a$kFmLRMNm
Li*$!b JeE!C$GeKw/49yylL4&\mY?RJXAk:CBMWLk8K?!8Y/plFDlaCVPewVka8uM\liYmwnEW*5IGBe4llt<y
*%IE$/ :Hbl:1?t&IZy1SP\RBFHJB:Hc8?NWCAhyk*iSk+FulB/aC@bWEBubV#RybJ1Tmtpt1J<ccTbiy1yyJi8
i5iD*% &?tuqZL/GcaIb?k\PYkDHN:=bKb>$CtjqKGIKK5#DFwEB=Tq>pV4kH%iRSpn#qqmH$d+#pMdD#ai\Bdi
^SZN!C I#cHnCuG>5Ka5HPlJ?%yPPEZu1XHkTbTS9lJ&FC85>DCDK8uKh1Se5W%?ik#WBaam$wiREWT4MZ=ybNB
+4m&!a ^yp*uFFt1VZcSPNNyXNw%6qCpZ&6RlR5uj1\\T^@ZMEuGpumLTThEBT+JSMb4DaWL&5<MhuqdZlRhBcF
&yJpeA k%%dGZMEMMEe8$eiNh6pR$**Z&GtA\&eTSaDD6bjwSqpBWW&TeKbR&&wRJWuDHpdY4?pmWd4jdFJqiCp
ym:Y$\ #iYX+XD^NnkcD!/EF\XF4C$DBS6$+cqRb>&1BDNt<I$MMHSnA\*i^V\LDLZkjKYEQH#uWI\+k@R#\#q4
X%*Q4A #4ntW:iqJe8ZeBK\^?PlhXd*QF$!<dZSR\6S^yQE$kW=FHFaY>uRTYm>\^w/%nFE*Y5<EeMe4ajRJn>?
+NK?5^ pRM5htl@l5&dSZNR\N\CDCP%Ik<5+dYYT=8?LkjFGqL5/jFWG&+SSmRJa=6TnB9G%**e<ec=WWhJd^*1
Vi$#@: LqF+Gd<b$Ny%+cZ!Fh%CN%AWu*Ha%%+XiyhSZX*/?l*CyNaml!#/+k6HQ6Z55Metij\MJ=&!ey9Buwnw
HN%=EL 6ZjDE4+=jaS@iV!QV4D#lhGe8@Ru>!b=hjE\&9D=y96Ei*>Q?4Tb<$DlKTidRDYmNS>uLP^kk%nREaHX
/Y6Wk$ 1KP>aYq9!JG=V4YK*K5K&ZdY$wIiRGELG?nKNY/TwDJ6Jq1+T$qb\yT\1:tm6=C+EHb8e%pALi$*N99V
IKh**m I=L^XWlFFSAi/%C%1uhRwCMX1ElHSybCD#Idk1w&KuqQY@:JJ4j=^!=CD/8>AC\quwdE%d/CuY%k^tcl
CBX#/C ?%#%\a?Pl**mItG=&wXlbqiIa19DWLucJn!Plh=H/=9a?nqeiAybVG#MZy%GIuKJCcTFIlq=^&lBNta\
6ZLEtl m8ClJCR@5EG5huc4VTMah@d1%4W86J=D+?wm?:4F6SEJ5X:cqZA:m\P$HIy=myLF+ZCGKD^<@:jhVNlV
@D58M& aBM/LP#lcn8=Q1YJFInuk?Dq#Gbicq=Q5lMA^WC@N+Rjc1ema=qMD8LVuDl$EaR<Kb>61qCNPXRl6:p\
qVMjCQ EB\TkTInQPcy!MDJLy@4J<\eppSi*T/<6:A!Q&4\LB5k!W4Q8b%S5hiQLn%ndZaXIkR<uyI/HuPIw=+4
>MBltY mkVaK*VFCDtc+BA?^A9GBnaJ9+DCh/8?b%RAuldGFCYNAY6X/qqdy6+EaGSZRR5ee9*AD=!&%c8ESca*
&N\M%a /+YqABZm5aVhYqSQXcLw1RbVWWW5RD?!T+y5pFc%NFEhGTmYJpp1WyLM\EC?NyR&@PW*VjuNL\KDlSHp
YY6AQ& 4AN=1Mq$b6atq+JYu?ClLq^&=hGtIiJ$iqq6@+!AW4VS%H*$iF^c6$ZRp<ww1&1hc=&Alcw<\uKq<PMu
L\puq$ 4NmG!HwiKy1wa86Y*Ye\8nJ5tjBn/$L\5%h+SI=5+lMdiMhpMRyceG^T4Wp5jWt\IY<dcHMd^68%wc!M
%S4CBP c%QGW^jG6wXC=\=*:S+HF:4G#jduedZc%8d8J1E6QdS+pmTbj#XEXi6k!G8\NAAXKat&yb&Jai4Tt&Dj
uuB>Ct /E:qY6Bq^SJJHR$G#166:$GQB8CXkZtyubIEc%c<^bmw?ajkuS%GG:bYC/*wC^6/T:+?lKFK88>m/n!W
K=*QM& 8P/*haDhG%pTk1TFRdhHeJ<IZaVKH1BwX>Vi\lZ6$QQk1uKpNpS?F&d9$%<qt@d9CQWl<B+qNuEnHpZp
1Q<Xm= Z/JGqkbdXuwlq%=b6V:%T/y+aJR&h+BmYGAbnw5u#PPJeqw%\p@#yAiclbFQI6Knn!IwytT=\RdD/b%l
W/VF>$ cj8X%<GPh>mXDbyj!PLD8qB%%cbhq\!eR&9NMdbaQBqJT/mFpM\EDnjY\t@cnBeaMn?I*p&8Vw/dt:&+
jmcwu8 lZT14JSQS<SWJ+&S#HwWe>RC&JPTNT4^4Vdp4E%&/RACdha1^+LKKdQI1\8C1!jZ<pXy:yck%#\ZIG?d
c+a+pj LS4a$=Z=@IJm$GY8Bw<<6&pZXT*jeT6HQpNc4NKb4uk<Yp4b>K+jESe!:#\X/t+L$QAce/YCwq=?mZcT
y$<bCT :A$Yi#@qC\+y!=4:\nqMMFIAbZi+cyH1cil\uPqjDhnkNd%bNtk%!$a6c%idY6Y?n5VuB/p<8+HcMH6n
bVq*S> =1m*B81Ln@wQwGMN5YHDql\e5Ay=Ycu!=^+q$@!PLdeSw58wDXep>Lq$Ik=mQdB&t&J6<ZSD/I%udTB/
^qi^&8 8L4J#H/WQdH$$iW&6<H*w+&8ndb9wlik%MdaJb%WS5N=i>cVu&jy>qmYTM<H18X61MdJCeD=dlGKY/%C
CMYL*Z ?=KMGNm=991LD&RNl5&jN:QCY6AbiZC>:JY&e=9MwWy!Pb/+n$%Z#9u4LQZ&E%=G:M+L!imJh9p&ZYEm
IhEqQ> +uD^S>>*8/6ebF4$eel>b&/TI*%a+kj@1KBpleVkEQQek//hD4\yXCG=jP\upelEQ*T&p%4hbS*%TMhF
?6Hw=l JYpciMM>LB%QCa@A=jDTk9HW/>@JZ8XHX@9C=L://J+Ha&4ZZ+XJ+6ClpKZm=nP&l\SZPiD*><1u@MJu
Q6$=Mt CN%d5REaVht:DaEG@Mu\CF@n&FSZ/h+m&d?GAd5&?cL9?VKHi/Ak?k%LB=m=il#9$4y=iDKYk1wPtKmZ
L6:euS Kk+hCapG/J^#8C&>e+DaPyhuG:5Acy4u8cCZ8LAZi/Y:$L$L+1pL&+wAibD:iLk*BTcNM*TAY\cI!d1%
-A#c4B 000618da94a001202b4 Page 339 of binaries2.zip
>/=hq8 I=1eIVA/!l+CA/h*aL//&TC#w1tNwLyVIK>NMJbh!d$<$9i<&II<&XKI!ujPeaA=&/wCYb6Ke/:<1Cl&
N1Q=>I &dFmawQ>p!Cla+>h+/&m+m*>SICm&RhE&^N>1dLN1VHa5IcDGw>!&B$Je\P><dtml6<!Ec1mTnPl$&/p
L9P9B< 1ZFpa^eia4S1pJHD1dd9PkLFPw\H$i6&l/Kcm/dnPc:cAcM/YA<\EnQ!$lbBPqpap$j%!k&YPk$\P^&*
WJHMw+ YcD$T1Eb<$PEcw1P+Kq?YJ^WTKMX5@9^CT>uGRMZG4y+pI^u?Z6Smcp9YbXFEcbL+BE\pZCk?%Skl$#k
>R/?KR Pw4BBKFHeJ4*$IBpCK=$GD1lCwCME:1Le45Wm+P^Y4\qm>eRCV56TLDPc/:#TIiFTC$hAk8SPGSkibej
#FMuKn iwe*^?8cCJ1yCGcR^wHFJyTRWI^!AWZ<Pb6ymRH45$&CTEie$FG!JJIbt/nGWDWJY*nRP/C:iSyLJ!DJ
qa=ju8 <D<KcJywm<eA1GbmJ/:bJL+iB#A6/FpTB+ViaJ=i^TSRKKkmW\d^WH4$EkH^+Ik$y^EJIl<&aA@&TdH$
KthPmA +wCGWGGcER?SpVAQEkq&WdIDW^yq+C^RalhJE\@laB@ua^XFTDP1aleJk$eiMwN!AS&\alw1idJVy4c@
kWaJZn ywK@i$+1//tHbEItIbC4bTy=pR?ak#^q+CqiWkGak#%aylpPyRZuyDXGA\WPEH/&aZW/M1pA$kWqWBKq
CyB4WH EDYq$^FqM\GV<BC8$DWXaRjlJ%T&kGuG!p4tJ*J11Bitl=QMyGIAAWZIyT1%kTn/k@<u<YbS?m@#bwSq
=9HuV& ?c@?9+TjtiP@4J&Xp?Y@#J*#@*F^@we=Yj+j+YD:##C\5LM\59\9l&hp?T@J@<@J!eDI!MLC^QK@9RRV
H:^++N ^*>bPlQL@@aY@>u@#WD*Z/*A\tLEkSEFn!F><<X5*a<8FXIlmGaDFTS*FXAJ+!HAlkMLPl\4ECSLpRy6
iHFyju ?wTk<u/MFYjjAW#qp^#DYQqwPi#^QaTknwBhDZVaMMT9YS=4:iCkeJVDtPwA^lPB5GJ=nkXH:VQ=IGc^
kcY#bb ZR/@XJXQHAeXX!^RFYGE*YiZEFSXHTm%FLNdjSn<*FlVZcCEDR1LwaXSH+66\AXL:LGDWt8nwVWWG:%k
MBLBMY $^4BFGQ64DVCHD!llBpKHKI^LM1w#R\iC1VNk<LTEKGI#$#a>EFIc^QM6DJGFjTJEkaw+w#a!lVe$Sw/
\@wqcE 9Z!NIqPddLFnE$n^ECda^A<HKM&k!#5jKNQKJ>@<A<nQ$AL!JmTL\w4IX+\qQ%nVlSZK4NRNG445BI4a
Lk=i?w E\%lq!juWCWKT^=N<6lBc=M5l\J:ZJJNN*$a4a\mc1$^n$pjNGPLIDYa4LTk!ymK$#YCmCKJMGE5w+k1
XYL?NS +ilmMMVRYCNPII:aEwkuieMTVLny^QVcP1pIMI&9NKBCLBhP9*K5WLqee/e54/IKtuwq8PjaVC8?^JJL
*!FR?i 6XqhtCTZ&BGy@R<d#K:q=KEGG9WABeIGl4ZEqt:6MS111#pY\=l8a+a&qinwY8pISa^t\yJAT:HHCcPl
b*C?GS I:Xyb4wJnb>IM+tQuJR=HS9ecSq\\tyj%:upStt+jjVPT=FLLX6+#<5Wqttjb9i>h*?h6m\S:DCLZ<+R
BybdyA R%YwYXK=yy65TVQZbK#il5cu6#pJ=e1KeRp56*LS9T&@!6I4:K9Q*u984qi?1=Y\BlTqhK4aBl1G9ZGT
16p%MH ?YtcVL>dYYq\48dwy!$WiJ%1ca4FHZ#^Wyj5y@eil%^%eVVtDL+qdQ%:je#kZcy/A1IuJYD%AV5yp@ay
bt!1/8 S8S!yhFH+IIj:D&judtJtDL/VL:Hmm>jh8ZF4:%?WF@FZb<8:CeJkRyW+d^<X>5DcX$d?nlMV&:#hatG
$JGKCy S9$FFGPi@Pc#d%#1D@51!Q@8b/*XdiqhS^6MF++ZLm*5*&TPeIcyRiEM5NqSj8/:lT<<JQ5k&DJIh8EW
=Icnl# e:\X+JD+D/RlD&Yw9PM\y\dCAIAml@HJhX/m<b#m:EM9<eG1e*DKun^CwS^Q\/=dZktD<8DRuZAlLD<P
@bV:b% kmJajyTAS*Zye?9cB8#$pY^WtES4H#LL!DJqJ8>AAcZIMyRFWjT<@MAyAd>H#d>n:Lja?JPY#QGDlTL9
nd&:&W Cc$EDl!$ym&aal\jY6M%AR^qeT#y!T^Y^pG/w8aGKKD8JBHRh<\$eG=pFihSQ*qIMJwkVakXKF$>yWkj
GdNuBM KdFCF5p=*A@k>FEaITak<kmE\%TpqmAJLBnml89EyBM!NRVPK+6FT8XJNJCSw&CI+EuZ+&c*QXmb+>p5
Ta\#=+ kIIFwKZ*u>$9C=5:ItG$yQh9QCM8WMDcb>tR1lKbA*iV\<lu&RIF#J#E!m\^^$Nk%yH\6it=QGeqi$FS
&9qd81 mAV<+EiQ&nI+c1duIT$dwJAXK6SYhb%VW/hV4ymcIw:XyR1Ee^YF1Ah4wMnLCPLqkKGb6QMIA8j??IP6
uGcqq/ FMFI5JNMWDyRJBI5dQA44LKYBCey#nhJh$TByS9R=FFBJwYytBe4d9@RMEeynkBD/5NEMRGHLaQl=CL^
E^$X#T \TJ:C1yQAn!P5MB=tTEXJTAnNI6MR8Mb!!kd&W=SK&A$a&*p/IACHHYWBd%mLNbcJCb@jnS!:jNu/$SH
c&EDC& X41=abaEaqE:V>BHKWtLuRVWu9nAmbt=CbA8LYkhh@yInVqRnXq>@TVbbDewj*=K5iZq=\146K1X4bCe
W<!1<q kpW98e4/KjT!F8B\$GkT6dbci=?n>>HtLHZWWpejA<5c6ZRGw=ePkQ<E%4LYAlaA&AA&5FJy4djikE\t
6cQtnl p#u+$?H:N:+R9lByTGqTtlSWmmKqmeSKX??l>qk:mlV%:qyHpcJIWi<wWlRSGy*t@<n9/ClT*n4Kj%*@
AmIYZ@ S$YKipi>u!l@W@Mk^$>/w&bG^yCm%MRke<FR@wuZ=N%P1iut&X^V*4/VZP8^9uEn8YEwH\#T+VhVctJM
Lb9pHV p>FnjYX+e1PnXCaG?iKt%MRk^&=Kba4jGpNiW5:^T5cM^yqBnq&ZitAp#E&ytT8bC^&qyunNGKbWIne!
F:9YwI F$N4GtVMP$yq<pHCpFi6$WhMlmp%MYI!VKpyZnHGSVu:IGMa!u8<bA^Vc9JB^nC$E8N*n4&lQD<T4&Tn
lM6E\n w<!HceRJ\=V==CQHV#4KjIlZ56pdG8M*KZb4<@GDJ\:Qqj=>Zd\9/<RcjI1?*B&Sbh*:8kZ8&&Qj>h*:
N=\\Wp @dL9AX?$^^:\bh*%jj*u<QY?AX@@D\E?4@j6wV#@nbe9Q^\=ZnAVW!KVM=u<E%QP@A</bKajl=?>DL<l
Z#^>B6 $lBy@F@e@w9&j%CnN/TkhQ1@\Ky*@C?TEcHSV:^@\@#p++wWbZ/K9!JFta?MK@KK<ld?RwyT$?*19VEj
4ZWudN GMNNtS?=jTNFtS?t*:#Z=lRIk*^BmnLj+aPMaey<mqh5#E%=nYGRa&<$Z5M$anIMyWa@pVE/!9#Mna#S
^Sj**K Wia<lbHnJ=%G^iNZqA$y!k9HD&NEPB*m9:@n!*%:^GZhk6<CH4dA56+*S<A*kM@da@j+FqnY@:*=5G^:
a4CQ:t YNd:DkDAu<@kAHA#1H@@G>l%AABDKLRWRB+?EDRBADRpbFh!8IY=tLt=5IkIM*ZT<p/h6HJSJ@wbN45I
NdJFYQ Kup+j?V%Lw=K#!/1jMHwSpW>6qjeH:dQ!GmqtTFT<iX@inYB#*C+8DWEZmRc>CeT>=V88WLFQW?d+hki
LymD8\ >*VZ/>HdW69IZ**6cS5=?6NA/!$cnV:X4W%w@iu!X6AcTqw>$MiMjuqjH<aj/k9PY+HR>*dj\IVtqth=
DlDjjN b?nR*ER5:#W$W*&8iatGblIuNNNPwZuPLmBELuBFSu#tPLL*1Q1hF:k&$p\t<KlbILjA>WVM/HXNaVnV
AVWuN$ pL@iT/?MTn9qeZQl%EmXL9cq/TPXAYnu/@baNL*Y+1F9XaW<Ty>!hIn+&1ZnlDZ6T%n@QeJ/+h^Bbp^j
1RH*6y 5#X4KC?/DYtJMJw\Hk1E>wm/SBm>!HmBMQ4@?KLScLTZ*Qa&hP6ci^9/uIh/jm5$VQc&6=?KZJ>yZDCl
>M^VR^ Mh\C@bc<itnM$Gy9S9L!:mt$c:VQ=9FwRF=A\WS84CLS1eQ\e<eTCm665!m$MFFu^Z*4&HD=MV!%D=45
ZX8l$b 4=enLmhmn&V%RYu9W8j4X^H:#=j/hV!M1cZGDyWcG!qBnW%+yeb!:Lua5cwC%1tw5cywGtm5KuyCdqqX
QM^&BD NJp%XlXN/w%XQhYDnMi19A<DI\dtBdBq>AFn>w>qFL&LRb<?i/?J&Hd6RiMEnQ$QL*+W4=9+nL&%Guq/
yIRwQ^ NkD<Jd=M\@DT\>QH=8Nch?Td?!qt*ia#Yl:jE8Bui?b&J5BnyBKG9N>e*S6iuaCE9:TZ&GYy*qH8pnpq
&hBi<a 1wZDX9P\QQaB1bikcPG:GnhW=y1$QPHJL*Qm$8Iyc%<<Qte?Zu<KLSw9KY/::i?6AD1\Wy1EjPX!Gp69
!d1YNF R5a?MeF@R8X%%1KG/CPk*P^>Fqe:hT59ZuKhFw8N<:qLLj>iMPHlQ1SR%%pSTj1+#>4aiq9PT6&S&8c1
jX45EJ +&88$y8XmSY?Nwhtt!dA4u>4@Tu&ZmIw6$HP#5C6l%ueM1qB\D/d9=#Y<6K?tNl!y%1YNq:D4w1>^KlR
mbI@w= 1+k+y=?D>AujFdK14nq%VX<X8kcG^m:L6h:^Abq<by>5n*qd@w:KTW*w16Fw4:^1m/4blPcGRi$:M4ej
cFYmF> Fa=MCbwTNCXwT6AMdpTJW^&qY=6ZW&EHt$c&*6Y<&uSqSjGKMJH4NIZc4NPW41tIeb45Pp*yl6IN%*%Q
$B8+na Xi@6\wNQ6NJ!1ab@<QBC4n+YL<+juytJYSmt^Zu^!eKRj:e\bktIt1%u&YjFb$j%kQ>%q=Q@khC/A<8L
+wTwB8 %QG!kqGib\I?a4we%CXkak<nL^KX&N>Nt>n*N1el&Hnwe8y>H@5=>uP5Z6eE8HyVEd#E9!qW*9kX1qBE
MZm1\K #+64Qn=EX%E5*c?eD/5LZJjIB>jEnyaQd4@+%aWXc@^C!\/$:+BGw>%&wP&#w5%9cA^Dw>FC>hFwhKkL
qtLcil u\*%6S?l48$+%NGl@6IcGynRqC?5RR<htnwX$id*4Ruh/j?kahk!luaE:Rl&j\*Qc5RS@8%\LXl/WyYj
S&?DPt RLdjH!8*XTu!p?WuQFB@b@pJKnHqJ&n$qJ<kQ$J?kIY^^XAmJE%#LwJ>QYi54kZ?E$@8nA:6c#=L%K6*
$Z9kmJ tW:VWp!k*Hc\HVGle$6IEdGum=#ap/?48b9aP<=nJjdpi:+4P$+l:qpW6JB:<>bwIe%=QdRRh^%#cDJK
yF$1Qa ^^^cKLYPPjT4w:*Y/=lDw>GpZKk:C\>%$:QwWH@^WHeZHP1Z8K<#Y1FPI4yb!9ib<e***W*!@ZPA@#$:
*IE>#/ bCuI:d>KqmMmVP<=:m1QWEH\?T8W%F=EICwIX8JaKFZ+V=u5$QwlQ!hVy1BR91@IF\&=w\WpIA>eq84n
^=!hA4 Lqk?qIK=nKlC8SdEZV:K&6Z%#@iWbNuqIa?HLJZHw\&CLCXL!XK!qQ/4#MIhJ&qyFk=N:y8FR=Pq8W#$
lkA<NI McN@inSJT#!mHcMRn&n6@*WDwM?=dkC$B\q$1JP$wY=iL>V#Q86RJ^/JS^j5lF^enbDJ&@&GpCPitp9e
HlRpMd mPt&QGC*:LV!WS$S<V\a6?GViG:WJJ+BbDV8cN#T8I=!8%XG9G6wG8$#!9tdnuuBId$\:i/!e&/yDuqm
&SeI/$ 4yuX6/=kEBJN/yA/yCKytIuJ%k@q#tC=ZY91ItGPaJV/@&5NTXw!<6jSP6i5Z/5=^yY<H%>BQw^^%YFQ
Ftpy$? ZtTB5l4tj$wJ/YD?A#&c$@\Ltuk*@+WtHe^@y=8X!By$W^=bk@cQS6ckmS/!Bw%GN=GF8u9lWEiH?t5j
aaWHcY /4SC1Q5SRwe/P6SDQhTynhDAlPa+=!W4cP1T8uS*&d#hQEE>i+TYi%b*kj6T#yJyCb&qS>&Qj1H81Z9V

-Acl&= 00028628b92001202b4 Page 340 of binaries2.zip
jkC6#i Y>NC1Z8c6Zt@@u>%T%@N^*:j4NTP>6CP1JNFwuX>S@$@JbS^%KZTWE%WP*AX?@=DkCI&h*h*>@D\mQk@
\H9hy& nan<4$V<Z@tjS9:@<j@J@@H@X!InM#M#@=@l@?H@&Q<p<*@+@!j@6j>@&@:Q@S@@j%nt@&DY@+1EhlP<
kHN$+= >9M<p?*I!GRKTHDBnWPi*\!IMVbd!cl#h&ZeGKhFuRX6*%HuFyNQK1u?=d4=/d<9y4WQ+&cll&/PNDY<
DI?ACB qHP#$V*<?YmCjL+ek6?YIm5Iijm1yS@l6=GwTb%n$@J6\kQ:uEjmWGuGV!ZH*HS?!&>1PL@j4&*A$\>t
hW&a<K ZX@8d<E\J<kqHJY6te11nhX&w$NQdF9tQ4X6MaPtFc8<L8T9NpWcb/<W*:R*1Mia\$QuH%@/DKm/iGaV
p@AF$! d+ZeM:dNVXN88LM$bVQk$PWa9bMLA$<L5tQpK9@y6X4t%8*Gi:#RT?+WB#54&1IjqhmnRPqYR=WSlkM9
^T&ITY KG5b<^8^I%$%D>cRKb+PtR*HF@a:jTWuKH9@HN&/ituj@P&>IWb?N?Swq+PTe=CkPnIBY9HGYjNS1QmL
B\FCKc GCi6N*d!>Ayq+k^ZMu1T8HJhyWc4m?LpQ^JNjmWQbDLCZ>j<%:RR@6QypkYuheHtaVnB#P:?yY%CE*E\
J6@mNb NTuZLGA<RD^\YYjR>bLWmbY4VVHSL<JZd@6i?*=$i5uYX!Z6a<jy@H=C/Y^j!JpaDIZC@=*:I=FImGl1
^mQI6B d#^HEaWCu\WE^/<>qZAD5!S9yFR^BG8>#dn+QeclD?5#**&=Ad+>kFZ=&1#ij#>Nd%u%5BI#W=#baScI
@<qEq8 L#$G?:?DHWkpe%N4pnYJbGb8bpc!IFqapT^JqydtqyapEyqEAp64w1PqYT*95CRXl:iBVGA/^+\4wc*y
*F*BhZ IPmQMG6Tn5Gw*:KS*c9!>Q*$=mKnQdbuyPV@IM1\9/GFM@KcKDDtw$RS1<nML$&JG*Vy+cmFiqyNI5Hc
YAW4j8 ^!E\?eMjM*PMH&AwP&5%Ny4ncHa/FVtbC%aM9BK##Jm>Fn@+TkP<mBFGS%<cFn?BItm?:ju6*V*%m+B@
DFa:\\ YcVBX4?R#w>XK9^nu6#!>wETT4LIGCNI9/V#:$BAS1Sm+aGXte4X#Q/YYXN*&i+t88NjLeA6Z\nuL<<c
>TBT6G q6iZuhHd>PhNCAdG5lRRKG1cWpjnNc>1BlT@KR5@PFFbQhpL<t$T<WqEnAPtN*1\FVdRZZkSicupY@mp
1+mSZE &TYqL\wp9ukM#DKG?8Jh?S9<ytt=b6dWBnt>QX#^l5Tq:V@HHS=@8a6GTn>44k=pJb%!SC%FwBwJEaE\
^nABk5 X#=@1uKjVZ@%T*jI\\wqZmKq=CWeSHqliu6A/GeB8%Iu54H!4b8%Kl<ny!qd1*8898i=$&m/MQQWbd6H
G6D!%1 #dkJ/+ya>H9di^@91>TaWXpi5</AQ%6\9Hi>dW1<h@w?epNiu&eL%:ij^tHFnc=MdZtAuBa?\S&eduFu
jXJaAn #St$LXk9b>pAF<IIIJiS$J?ZH$1kX#dDIISF:J&6kKph:^Mqqd^aw>&kCM@5uZ@bN/@+NP4y%*nW%&tT
#YIT^= %9<^uI6S?<c#S<?:PtH!6<iW:VQ8HLiGpVTjj+Jj/b/\w<&/9HcMPQqh+QB8+?/Aw@9tQh$W98mL8HbR
FY5KA% e8h5Wh=I\MN%m?h#@A4d/B8Z:8D8FbS%4Xn=qQ>XN^*YF%D1ut4+lY8&RY@Z<HVQ<VPDRj1HpumF?SJX
Rb6R@R h=k6qY>9TuFFL$Q/diS@qBZiZF*jXSH+qZ!:\8qpHDyY$p^^!6cikB8HEAN5JX/jKD>w5<X@hTN$9@Bl
wlpFFk LD4m@MPN56mI+&&*=mYZ//Pq#1*hTyP1i&N?+<^@F&/EbPYuT:Eh><R+6BQB$hF*M%TQ65CW6lC#ZKYY
eddKW? JS8J*:jjV6qPHa@E\twt/@Sl+j4BpyaH+m>hiGq?/iZM+wu$m=a#1ALDL@Vn>6eD\/!8e>:iPP4djQ?8
<D9iiD =R&wkuj?RqXumt!G$>XZ>&Td*<QNM*PnjJw&QDN@89jw9yW&Mm=GVu:%5qNZ=%Ii=S4+X>dm%l^?PVQl
\CeDA& M\H>eqe*9E46+N*\l#NPKpN=c/8XV=K#4H?SLnSX1?q@??q>@FKnP#F<NwtRNjpFbu99<Qk^mL9Z?yeh
c$@K@Y k19\q<K98*tYnP<ZEu&!Z6q\$Eau#^AI+JGqY\jeyd!nd8#jd5R&@d4dnq<ikRmYed5tI#Q>mQhN>Mii
/&EBE% 5eQVJ4:bPAX4wW?Whl^Jp+5dHiM@CDZ6<*F<c@yW\Y$qicpJYlYQVB/W9?J#K<d15=q=@#yNQHLTK1<C
mJQAnG bVa/^pL6kly!!/m#?mb^GTCKh%FciXS@jh&#q+j!dVb@$HaH9aYHcJ&Ne^Qa8XyR9S@4eTh4K6nMWk^+
5dIVX? Z1HTV?68jcKE?@+*jy@jTW?<%d*C#T86MZ@nEH8ZZn%\DPZWP^/?*b4ED5cnIy$u</eF1=5YGw+*j:N/
ppMFYt /yLE:iEu\Fm6j$:>d%Z1bN*G@W$&XF:PWV1e>Fn4*#e%F1PD8IdEcYE%JhWjaWQ=jqDhh4WLJKyMNe/p
#I6enP RNAIaYRh1Xl<W@*&*HqJjqcp+hHWM@LpwciH=EM^i>?al<k1R&\ZG1Taht#PmkKI+6++u%=lhMGj&?=h
hKEu<j =Pi8@d>le!Xq9mbh$tiTQMGK&yK%CbFjG=RmIE@Gu>B1$65/T>J>pmHThmtXH=>w9:jX/?e/n:tuiad+
uVR<8+ %yA\tbbVaY^9+jy>q:Ju%edQ*yHeipn^^Ey&uKqw!+l<DZWm9IDl?4i/&iJ?!LNWw\PZX*5N4b9tF&+?
$e<IJ@ <!FPWd^=>pp^\+WML@!ZpWY:/:Lh/ijd*$<<hXw=i/d/S6Gd8GqY!WK%RZyXwi8pPWL4Timd?hyp&hc>
lu$b@/ lQl#th1e+K+QS$ydGQ&wRJq5M4HN=#\myky1@856/#Lk$46eL?LETi?8+mni6+L4p1YI?nhL4*!85?dp
1L%C4T NuLV88h!P+6yd>pN+?nELquQ=IK*:!kEmY5VB&aQZma16j/1!aW=Z>E4tPhA*e&culu\Pup!R\Lm^u@\
K@MYh@ eV/1Z*Jp1%\nu@wqdBHGiBD?InElj#^cb<tCSHk?%W>5ucYZ6mje%F^lBH&!BHQnQh@4t98RPF6t>LDN
em+pQp euhjnCQ*CN#:K9#B9TtQ^#wW6Jjlj\/dTu1MT^aQ^<:jLt?i?##tH%Wu$uV<<PLSwaRDc9t^llM@bNS&
1:EE:* VWBuZ#t:9T$:dp99/8><XhqdXi>TEHK\&5Xd9Zp5GiZkuyV^Y<#Ac9T8Nu9hBq5n9&q@F#a%F%j\C^L^
N$MbCW mjK*8l<d@K$a@jH\8yE/YDZ&Rp6H=Z5&$?q+&dj<V<h9KwT%J%6#Vb@<*JSjWXYKwid5#E\>C^FDV%L&
G\I@!P &CDPiRhcFB*5QZw:H@uwH4qDbu%9:eZa/@uQ#bjTkpH*HbN1X*EG=Ehy4#c@J5@$#acGKMVP>!EQYqc:
5VZk4H 8QR4<+kPke@$t5+<aF<6?Qk6ZdnR@>:tpHY1k8Q@h1y/ZNI@y?jX9jwYXSC#h$#:WE1\TwuEXcuC#Je9
$VSaHQ P8K<n^ZaGGK%!N=RtweQQ+uM:*95ynD&=8D\<5u%y?:YqnqcZh\VwJhnN^am>NZclQhunJ#TuX=:cu@I
D5pKle CL/hHjZi=MlJ#a^QcbQFphcj=S6q!iaSl5Z5?*9QI::<%q\R6M:5pt>/c=qQP=X?d<PN$VA%:CGqD&uT
XR=1HB I=5Zui?T#:Squ9l>+VN@Ti9Pe6@uuR&4&$hulcc#9!@8*l+#?P^LJ\q4cyh+%4#6CZ@By=cJC16pX8FY
i4aV^l $iDZtQqGhi=pmP$X=X51iiuHY#@Bk*>qVjq#d6yhPjhq4t*m>IuI?E/^EwiL4L=i*+5lTtHV1tjh*/8H
86#m1% *D^>!/4&jpQ#=*/PkRc%bM>L@H4ju5^$>K5L+\=4W6M@Ee*itp+Ve@9q:!@?*dh^LPBq6&hY&katZqB<
\HZ4W\ R>*M>:#b<d>W@G!h??@\?Q<dP^PG@=m:t4*P4jHX<dD/$F:aNddDXZ9>DpYA:AT$%Q9*L+BCY@A>E@4w
C#c8Z$ c==/BEeP%HH%nyjYuYVwbM9nN*+GZSEnTPwhX!5VQp1C\&W^A6l@Awa^?qd?up+ckaJIn%lJuWFpEN6j
@=IX6d HSbFa6DZuSJRtMC<8LJqhp$VD*PMJp@R?BPQ%ai@/>V#ty>*:qbGBM+P4@k<ZBu4FV6ejkhSTQ6$L11=
uDK<Za HCa5l+NLNMClKW=E\$h>\YI:\SpM8?beh$!k#*R%ccR/@u&w#&lwA!16eD$\pj/=td+b<6E%u?4FHF>^
$6CmTt thBd#pjc/DniZ@*mam$uy=VT>tbG^u&/E=m+bKASa:IXXp=8t^Cijbe4y=9DbcM<l8DK<L*QJZw6+9H\
nyp1<Q %ap*W9%#XC&dT<P@^6LId/b8IT9C*9d4/QVe*\>cZbK^FK*Z$8NKlZ+aRh#MDM>!4TD!\4iQYq+L#q>w
XJhbqd ^Rj*culJ8k+Q4lY?NL$m=/\W>6n8?B<B4Vqnu<:a!YpbG6?M8HbENhY+!E%5A*$dl6t^kST?@kJTe>Ha
?FllTa F#VjMm4=Dj8:pI9A>hVHT^?>eGH5Z%GMePabZ8KQYudC\:M/\hA$Hu+5#SMeLb4qJIBDZe&5W94/kCu4
Dba4IW C:>YijCK+?8lqBiy@ndhpLGn4VultwNCQ<8tVV54@!yhmZM:^=hK^/wuL8md\\yPZ*CX\B@V>n?8*&:u
Wj+e#u %>WX!ctMj+KnPXYu>w!GeL=b6h%n4R8!E$KQjY+k9^mR+F\A#h^AcA/Ja#c4t@HZ+664GP>5%uJT#:?Y
?J?Hp\ 1H^BtG+u6emcPM+/qS^%E5tBKy5q*lH$kA^*/a*>\/M<hw@>Y*u$y>Qcq+*E9py1aN4^HAqVD5u%1=1^
yZ!#1p 8TaK<68MW/FjK1Pk\#au>n+@TJTau6kHlJ8c@Q5m&ZG9$@n!P!dbbQJ^h#:LtDL+ID^cA/iP/Sp$<\tt
qEa/mV l?/LQ$j@p8hn#ly*6?nLGyuLZpDT6p:IRt$$F#Iy$/i%Iha8GqTp9w^uy9Z$e^8MKEumtkW*&1R>F6&%
&@QRE* T%HMu8Nl#=clw@F9@qm=Z:QeeK&ykjyRN&dV<kt4W$W!hqdcWN@Re%@E#kmLP?5$n#q<YhydylVH/*&C
Rq4*bL %dCyTmLGhD4EDFpF@Lb:>^@D8u#<XZ^Q$mLDd\b>acMSduJqXF1N<A#dSt%j/>%/J<!c41KX:dm#MI>Z
kBw+b! l:&!N16FND8\9NFZPkF<AnTaykMp\p<WilH:iQlGVjM1#BW*w1@h>+>#HkDiitl6bp$yunSy?K9H9HMY
\8#M$X >ZIi1I=+$Fy9iKhdEhc!q4Z@^5tI!NX*jF#YL@KkuNq4@uC#m#tu>YJQ/qpw??6e^!DAWh^tY9NFjepG
Hpc8nH ?lQN\M@84:b\A\J5@T:$hMSLGKYe%%5*DJMnYlMu!9!TWiW>HunJC1t=C1JNbmZ+GB^e8A=GW*Y8jLVL
P1?AKH !VDHt1>L64iV5?$&ZY&YLYViut&Q8VJ5qaVqjC@#mA*^TpISYa$iZqR>&S@M5AM?Vtc<49^FBkLBeZqN
pbkhV< X\:*5T?R*KVWbn9Dbean=&JJK^Y\TSw6j!yy=1mau8RHQcYT@JTu=Stnj5/#JjRjbX^Z%9?YicImq+8^
%HIYVc !mm:&:cTFW#b!Bl\<#b?TjJIZk5M$jq!&1W!Fp@*:4JK!EnlbD!N<%<ejLN?N#nSQ:#ua@^ZTlLBGyF!
a@8b+S *?VH&FShJJ%86q=m@VqJ9$=BRiKKXb/dS$JX/Njh+q*l=CRwPa=*6P5Aha6ww>$?Mk1@M:paqd^tjnpu
WnX\cW ^*ZKS?>P/iT>W>tjQ\V1h:9cHdk8M98Icw@+qual+YC!W$AI?9955a\E?#/I4^njGy*G9Jdy!TuWXb8u
KG^5W/ AFi?$?bBld5<P9Hd?F/8pYu8FQ>B!==B1y:H%1niSiKcCi$8P+ewL/1A<KJytbA4@!C=?hyY=9:8+:p/
-A6\A1 000bb5c4ec3001202b4 Page 341 of binaries2.zip
puDMcM I>VA!y!J/n:iKJR*p4P=ah/a^/uW:dDln\YQ:+Q$b^hHCm4*N/5NQjR@@?le=9k?:KmkjYyS8L4t@EVb
#$cSVT %*/FMd=Ly5JQVty*$hniDPNm4R@?Ip%qSaR#8tdL/dRFeHB&Bjk+@JTQXX>!n@SSlZbd$?RDkZFR8cK>
T!HiD* %YaW96ch$!pI+di%nbI9\cp^JFaYjF?Au%Nt!b&t\IIY@Y6PV&VWp#hTNqd+J>I^@Z4S*M1>5b*y<V8K
D9DamS $EJ41h<=pKu9<hD&yuC&L>FHZ^9n$Wn%Xh&*Xjl1M%Zi<yj*:/d=11w<1:&5p\9Z=I:uZacmTQiRV<QM
6<lQHy /udd#Q::1q=JN5G*QGp6Kj?CYSmi<L4Fh?&VncYE>ccKYe%Z*>CutqiQ*6#@uy&Su=uk4LHA&$4+e&ST
&<kjBF mPumSmJm#wnQHu5aPpND9#LAV$wa:u%<!K\wn@N?/AA$%Iu*lh>561aY%m>Z9wj9DGlV5c%KQn:+W/jk
WC&b+t m89=C>/!5=aJ\*p=G9%SJ!LC5A*mLjQMJw5*4ee&:ulAiG9BV?4$dFyGS>RTT>\XY*FR\et&=6?F9NaL
NWa6$$ NK5dJXa@1&jt<+Y<I:6DnNRiXKuLF^=/d/Vt%mLkjDl\?VXly89uwD5Y8ZB^:Tk:QhyyjPDemR>NN>FY
CC&ia8 N?+HuZ18hqD^:MP85M?X?$:%ijpm#mj61Z6&Ec9+L**YI^uRW\K+KD9iyh&VNGLJNn\buLX%+e#cdhtT
PG%Fpd !8edYdqT^WEudj&iICe88LYW&l?1#>R65+8TmdT&&C>+PVS:yyK@XuZ+pp##EyPG@ej&SN<:@+\?8K=B
54FkY1 Iqqdp<u@@yMpE6uM&y^pSmKVTYRT&e1MSLMkpm^wjTbEuARW=1TC:!Nw@eQXwPXbJ*$h@c#?$K$Xm*6k
*6cHCe a/SV>@mMelq*Mwtk8Vb1?*M=1>&DI=&Bd>iT9ITASW?iC/Cjp6T<Il:W5=!nmj:?pP<K@*uw+wH8ZQ:K
SCcYBq PnQ/%l6ReMR@B$Qn!Z*VVm?:+Eayhpk<C^TS9epLb*YnKc^Z9WZ+wci<R1iEy:%F%QYuN#:/l^MH!&%h
+?F1IH Z=h99@id:^$W^e5Pjt#QBMM8dhCi\wp%NtaV&Q+lC9b1%^YqSS#9In:l9u$=qQP%?!!Rm8hqM6y@/p&\
S>CKFJ y<i6N=\?/i&lB>kdqGNE/XIp=yp<M+uQh?bniRaNIbKpMm4N*LYSE+YhewyLNbtc1\^DY\WRcXcTJ@l&
&Le5Wl e!!IjN+<L/DGEH9@+*cEk?Rd4&R<La8hS=ych6aqQ?ZETWYYu>l?6wiG^h/XM8/8jLtp?&D/PhuLcF1k
<ehGa: &h>qW*@KaJuDPF:C$8y<!HNH/*p<N%:wJ#%1K8=qY/+WPuPV1kVQt@/CSEmWPeXK>BHiI@b!Hd@5imDZ
bTYIC& Y/CyjiHYawYYL<Yl\N!Bd+C!%4tcj*N6\t!bNSN>LRQ6Dk4Q8<%Ni\T/jEJyJD>8LXq*%5LW6T\Dt+=&
d!Pa\# 6H\iE14:+M@m/!jXPL>!tH^elH%*5F%1!y6q=+@&L=c9=hW+Y6dEWq+=WLcYk^/yBM?*1qPi%k$T:@ta
1\cu:* 4X^Nm:HbpL>5K9@Minkp6bjbX<1DKTZN:BuLn^!+duGTC<4NtlM*W4%YddF\>pIL#:Se?P>Aq*\KPj/:
$!NC:Y &yHPIiumSNDC%hqY?cm4uWMYnNVj4neDRpyh*yBu$n<Qhh$unYw?Nt$h#9Wl:^GV&Zq5GcGbNd5:*eHN
wmK>Bp L#D=&b@@b$?cI9T/Q:@+X/>9?Q*eMuKwbQX9hHmjwed<l+QBH58i*&4^?$&>u%w1Ll?q9dBMDjRKiBCS
iwhyMV //ZYEH:u4l:&+:NDS=<6TieDZ+dXQq:AHnG!jF/dj?%K99khA1XhL65MayuwL&iVA#%\%<n</Gu&RLQu
mkX\/? t/CQFQP5I9tVVR#i!<C4<Lk@&LFw!iL&+<bQwMw9X:\V9cjA%6%J9KkQ8nDWAbN&#14!WNNS=8E>CW*$
=JiaA1 PIu=V=p\R1jXLW^T55DSknVA#YkjnZ\t?/XZ>+GQXPhMbF@$?!d8SJD=tXX4mYe$I$jm9RiN$KjRE$y4
4&K:N# d4+j@<*@16P!PB$$hmFlIYuiVM1jYdMEpY@m5hRdl+tNQd<DeT/bH*\tSW6SN*#L+i9=?X9L!G94Z?9c
=DaueN YJuNNi@mZL$aGA9&Wct%JKCjGkXuecNmH=+k9MRX%Yl1$nQ%uD>J6D6\u56Ky^$+Ttq#d+ReXaEaHp16
inRYE5 qp69^N%QwNu>>qt<CuN%Yn<Ka1:RRXZJ&8@Q9K>WGp5ht*?yh+N4H9Cd@Plu9==G?HS=XCh$Q@eetqIw
F\j$C8 y#PV?8k$*<Hc9Di<=JXM86ju:DGhli@p!l>8Ztd>^%Z^1#<XHX4$G/XV89ZMtC8S$@TEat5n5X<@Hp$u
n1kI:a ^RBQ4L*n##GG5nLPTQKp>Vk^q>R>6^LXPcRd$N8dR#>mTn96W!<jKDa68@&*DyyCtJHQe!>JTH4Qu^T@
4wA5\Q m#Re1EjtlV*$q8QYWa/JIu>tyI^a%#qQIQ!#+EHVnJVpI^!:5C:8l94BMH?H=N6Nu:*=EI8i5?j<=VhK
j\*H5< cB<QL4I&1J$MTb*P14EaAZ>V@=kDk:?Wu+1:L*QCa@MT:&@u6ba%dQ##ZYjq?NkSIADX@uZ/DP@q1j9D
pJLLR= JX&%YMB<$?6m<a99Z1!@SS#T\iVy@5Q?k8wHplM6tlKNk?q:%>9H+Dc$:/w=TiEFRZIZ?<JThihiuj5e
=+*4kM h>:w>HQ416Cam?IyV@WE#?QqqB*/RSYPNF6G^%Q6:9\inSWjb%Fhy\\8Y8+m5wM<@I?#=<@y+BV9$T<?
8BT%qW m&?ylJ9?#9jcl4\6V\da4c^yuXS85=b/F!S#61cnK8nTm&h6tt^hZq#%/e8:+*$&4M1tad&Qd<$ZVD9h
nl1a&8 p@mt:>^Z&FRu\DpW1nh^pSbIHABX/ZTN*qtJ$F4<bcq/tHFmZ4FS\XKm?w@dya6M?18GMMpn/h<h?Lyk
Xc8#9e mYejP##jy5Ap+LHPk4TWq/m9tcj8dy&=WMkK>:yac@XB?XupBcJ5hdh@8h*VZY*QXZJKV1d$ebq9Dupi
llA=$5 j:XFHmy@El94tp4aC=p!ZQnbuPlp%4LD@cKB@!/Juj+Q@>BT4GuNqb\$@#Sm=kQQnV&dkyeYkw\Lmd9@
BKYHc9 ^9junnd1dcZwdDuRXbE4/4\l//Ge:t1MVHLW5!h&d&5DEt>yHL+qM*Sy:t@F4M&E*NTldcY<J@ncd\q@
u=eN6? +dh<#6jYGKmu!phqhB9C>A?8yLui%buKVlAkR5:=9Dyh8jIyXw:$=KduSd*D!=N:WjuG4pYR%CAbVW=a
GKHkRE wi<%m@B>d&kVHe@TmhL*dChd?$<E@ha!T%@6*?mQ=GSjjM@RCcB^R1iVZE<X?Ta@T$%K?6INM#jFu=*4
awV8l4 9@e%QbQ/9IE\EuNmk:iiZ9Pu=jQmi=@9lAq@bmXW!T#5dEM#+**Z<*L6I1LGFiLQ>5PHH^u?mFXhpmA$
LquHZ+ 9EnbP/iL=9QcQ9EZ8=$PR@b?Q*4#HI:Z<aBl<!@j:C=J*dYHMn>>c@ET@^%!YA/I5w5b99X?9/9?c9M\
F?m6+$ y$#Mj\9ln*M?:TX%*IGb9R8<R8+SCZ>GCi@1KP<a>QF^!K^Z>Y4DyeC8JEXdY=H8?:TED/IN#N+=*YTi
\:n:!D D1=QehE*iyB*>M#d$/QXL6pZT*WC+5/=Z4<RRM*WDCREmhW@Cyu>FbkbQe&#dQn@nH6I/@tc>\he$B/a
ik#nl> !J8WmeHwqwFDkli9dy=qjVLNiFE*99baW5Sy?=iwb/Gh/&4%@!aq&%eeSKnP:i?\tj:baycVdBDWRXLB
F<98=< ZK>cLnBQ?uMTy@*A=6MjG$h:PJhqPunW@a/T/Y1djpuHIGVd?hMh%EidHHkwb*TX%9ph+NImnM&C&wM*
V&$+lH ZHHRtih<i1:*%%hVacH\#y!69CIIMPk#R4k<FGnFCR=t@#t<1Ed4#1HFPl?mYu:Xdkl9Da+5=l9H#@+h
+nLaVa R>Jmp?!=I4#@8L9GtItL#D:P>d$lP*6k1:?G:Th>=u@e4@YBlCBT59LTBThh$w&y#q>R/kIi15C/?j:!
5d*h=y Qc\yY\5aP*VK9PXGTRuKL1qn+6Ec1:T4+Yb5ajb$&5tQB/?PB%5eV@CJ>:>4iADmehD#\>VlnX#KNZ$L
YZ^BZ9 w::FR?/kDj<DI^tiGm$w^ya/RPMJW&D+ekpuwSF5ZpMaCT>@LudXBVSEDCqh#H##w^F>Ckd\b=Py*=!m
c!abkN ZQEL&i%StStiC1I&S@V<Du#95yj@P&*c4<5*^cCHNRad4Abl&E+%n=Z?&/Qu/kmdjepHA?GT:%$/\8E8
Myqe+< $NkWQ9@tV=PuXXKt@wmjXb!a@9FS=\49lqy^KNjb*!YyB4:T5\49c$1QR$k=+D?dXiu<<81BCy9@VlIc
#bt!YF 8&&p:+bp%NG!$?4DTZXe58qM@?W*GhP<QN9*H/+pZ>WYw=Kt@R9S5*ai:b\y4&eWJXXMtEm+L?NcNF!L
QTjCL1 y8aqKitZ\lt<hh%Gbe<?&nY5V5QF&8=89Z#RJlq?6q6mN9lc>9V*:w/bL#pCR9laV%N>T5yjcHDT:QBb
Ca#e5A BFeQHlml%:$Qmqyc9VPi#I4y6qc<^#w%$+Di!wmemBb*p:#Ny=cbVF?udF#&^5ike6l/Vp+QBC\JS=P8
I@jSV9 4qZD@Ke?N<ZHBV&?$^HckqqZ%1W=@KVETw@^VeJHt//6YqPZDm8&6:Rth6>d+4Sl&\q#:MXL@I&w\yMi
>qpaJ8 j$y%8ty%Ty#ei6:tZ1#Ki=#P$EpV8=I+^/dtKHQwd9IL=!TDtp9P1!ekZ4/bWQNHE?@+49Ft9Z/H:WyQ
LyK=>q %N<!?Q%=ywVt>hA\h*DHbqQGMLLn+y*EAG<LQ/S?^/#9*AickYMTRjky*9?K5%udSiV*H81bWuG#>44L
5yJCBh bh</S*iC>IhLdHqX%hc@keZ%#@XIP@H?k<p\Z@kKDt>I+?id4\ZI6p:cd<&IJ+4J6^bPy?uTcjuAb<Lp
*t!+8@ Yl:La&15&T1dk=iXH<nwL4+VHF5wmJM@GcjTAI$4>I8\EuW%D>@L=#%b!HDZE9m9%Z^q/Skd$\S1#L>5
tFCqV9 KaTC$$@^%4/^58?aPEt4VdRnceLB4<GX&%E@DwT%l1btcRte6jKy=G4$H%X>qWKQu\d\L&5j=mM@&dX<
qqNt6G c94iE:9uM/p@9i!>*!+c\uKdE?enBCTNbyD>TWH+?WChH^bt$Meeh$?NQ%uX46N8M4@dkBaQDbmY=1=S
>Nm4w9 @Xe/5W4V@M#pP/1=wymM*j4b$I<6>?:y6D#&G^c1i!9cqTi>YE>tFp^L1H@ZE4#bjE#<kpw4/q!M<WFZ
Z^n:XV m@w$!8V*e/@TZJNPJLBXB#6!&^aVLCTVQp/:YkTY61YRjGFcn\ajT>mepRq??qbDatbu^b<lS/:nb$&F
u:8SF\ :*5H9htRkG^P=eX$e+M*&mqte>+VIbhZt4I&:#?:yCQ#^?Hn$6kH\^<YIj58+V4NB18HY5lB>4QB&LA?
u@j!!4 +$eLHmp6?lK#t@*cHbJuu?:h:9$>=iqdA#@qaqpnJ8<!:8Z1?hKEVY*ZT^^lH#MbQ%4De@Tup:$pX$*c
HVCH<h hl5ulWVWRJKTNW:>1L*<RCWyITZX*W^Tqq@Z^1n=im/<#?hY$C?%ZyajHGJc5uJ1W&ZjCC*TF!6k%ATV
W$uwtn XHQc51:$eyhywE&G8^::d^!ZaceE9=!jh=R?GD6??MI&ZY8JVZ=MK!MGTp!:$QP!Z//?p>F9ZlZXthXc
j/#uX9 jbh9Pwq/VMq\ND*n5?>y\FSVubY@q<pGQ^eQq>=jcjDAK:*9<1^p:l9FQT^?9l5ly%XTm%&5>$\p4ti#
1QW$lG Rn6/5\e1@/#=S<4e#SQ+KZcPDu@:=d5teb>YnNl?a85e<H\pu^n:$:aZ^!FZCZdNL5D<QiulXjjNb!>N
8%/9VM YZ^pYTuH%bFEubPG!cLt4Ey@\B8C^ikBS/G*>*dY9:m&l@Gmy&=6@+y#G/Y!Y!ZFY>/n9QI/CQ!4Eibn

-A=/L= 000f56fc7a1001202b4 Page 342 of binaries2.zip
t#yIHj 5pYl^6YR>XPJktJKpk98jVQK?wZtw=L9Jk:=t^//:4MC54PmjNMZNJZhE9QP:@R!L8dq=SeH*IVQZJSi
8?@@L1 GRj\hApTapy@h6LYjPcC+=a&Y9/*+HRc4Dj?Vj9HS<4b6!*Tp$RQJTZKjd:tlq99qy&yIt/&?!Mb=\4%
m8DDWV >1J%mGnIJJGQDj9j:1F^Hq!q6buTPNd5%w\uP9!$?FQQn#Q:16YG&XpW44?KXk\!Z?q<#4ZwF1%w\=j/
1Q/\LT *H>mJNcMK?\tlE?19Eq*9#n?FY\&t>Y!VL@KF$G1*tVN6+8Y9%LDBi\MuRepSJHt+u6>y=HAIkt6:88i
ER6ZD% a^AjuB1cP#\JGu^EK:c+J4W$&=+cX!4:RdHpyE>&<+<=X@tGpqa9l%</S1:qjC!RbM#/IF+G4h9^VFL#
Rb\!QD *4p?yd@+&Z16Du9bhYW*jC!Q8*iAAun4dw*\HPTRMV\t9H@J+bu#J:RA$teHht<m#miQY!LJB%*^CGm\
mnl\=F PMPQ%j4>PT<?b\PjJBu>MJ$a1^Bj>C9cnb#X8MXDndEHjV&Hj>QMZ/XZ6&:!neyRT9:nq\q!N:=+=B&6
q<Y!1e 4DBt:jHa?KDF>4ALY@l>T5nA#=^S/Lh#T6GP/hY@Fm>X$#>9=6Ii^68IE9lZW\tC&IDY:tw:BqaZ>Smj
/:qAGB h@t$!b%8mJjT4M/DpdIpyPT\66K@TeE?p^K5JCqwMw5unC>\#QX+e:*$XkeD*=d<%86pmGZwtJXE?qly
V/ZiEJ wwd4>16E/<:KX9w*%eld^:Gpu:>PHV^dt6Y8bbNei?4id$ej&X@tW?VTV!%Kd:t+G@d%ZKj5\bJD+CRD
uF1iA6 ehLaVdP\t$ptMm5%wnMuZEl#L9cVn6^%eyKY6ibTnLb$5qbaau6!=cA4TPE$Aqi>Q4^i*t^!dZ@B?XT$
aG&j+% p%M#%WW$5p6Q+WyJZXLe#!uCTW%^P*+=#put+KpJFa::Q\Cd!n6ANjLMFh+:^&XkN9XVp59Em#n@@4L?
XiIIVm NhBj4N@tSCXBj>%/G!u^@N!l6=^YtV8yeeu*cI5u++p:dl#91yt5J:T:J$?FKL<JKwyM@ZA<\K^yaV?<
Fw6Xm@ %PbtTNC#MF::+H@C96ZQlEBFQ5L>4M:*I#:6FAc^emSZuV%Y^h+nye1%?=<VSI@+iY<K5=>pD==IRhkS
mV+XZK ^<C@1Y+8n:!?jEYuIk!Tj%GQNc\XekH@=nXAh>S$yN!Kej=RZRu9?*QaL^IiYqea8L&nltGC9\Z##=T!
RKGLHp R><a48CZI*%lQKh<PT@>=VDT=@u?jat4ybZP>^1lMXW>XV5nb/be4HS?ELn/bwSc!Qd\qlZ%&NNTlk8W
>B*XSb >HSy6hSjNR&VZb:E\/jc!@:=m?+9@!5J9L9?^YY85/j/m8B*!J&K^*iaNZ>MQD==?*l*?:9ymN&l>hLR
+h^BNT yVZCDbeVMIQ\WuS^iGP1Ei>dKjyN\AQhSc:9p!>1yMWu8?6Gb6=w18Wbq:madny6blYl/?/u^pn:wCPY
dG:P\w Q9i\ii>^FwYKJP9<*9QlMuZy?Ld*6##dQV>y@cGmQcqWNa@$u@mk>8@JYQ9yd!:hu+yu98?uZAp5QQ^&
%e+kVB 11@c/6h\=Tt:1/<pNHZ!elwiIn%wc$eqX9bclpuI::^%eVbb/8INLh6<tL9<MT:Pl@Lm/+5ZQ=LPThKP
JLZQ/G /K$hD1WhEX?b:F5?+a:yRM\e5Rt+:#n:Yi>Sn/Dl>\udBA///jwwIV<C<%R$a1uje<LEQuXP!59@DPPE
QA#4a& jenQm&cd4S&wK*djnq=eP!L?M9JXuMqW?Ku^#j^WHLeJdZM*EuJ5JdP5=c@Xb6n:Nh5LL/F4iX88j4nV
aNm5FI hiuIk>!Lu^#*:uqjyIiM9Q?T<9:F@&RDhWMZ%Mye#H8cJi\QV#5cwPBAjcFd%i\N4y%<^%9YnA^ak6@@
&T<kWl 9H<&=a4JMkji+p4bY4YTj9@aj^pSi1H<HYP&iu@Qi#G#A:94jlXuGb+4phK8QQ#=>Si^Y*Z5GyKblRZJ
#FP5um I6R*J5W>*V$>JDpPd$KNV$=M!p9P!/ZF=#lqythqbnlqytZtBGSF^<cdAukeYW6iA5F^nKd%^%t1T9Gh
I+p/:4 a*#QLeFGCtWWltu@dMH8ZaDd14?^X1&X?k/QiL6##q%:eew>$@&y$/dThe>MWe#DclKP:BHRpkJ66PZL
n+!mHN ER&Qhj$#k+!D9C6+:55yc96a%LkR6FbV9#*u:4:1$LSkY?*cS+t>=8uB6?Q:Ytd&S&cE&LdKuAk@Pbey
WpA/nB Y@4W+#j^ju>m!B&X&jhF\#EbCwjSe<wXD<cI%#9L:nMI9H<uP?#P?94bSRCDeYCHkIFCb^$A86w4+<#V
^ElQQY F?lCRhKGCpaMaDHy\uS##iwKCQQ#NI&mAWJ\YNEiFaMJW1kHAIniH\4Gw8EH!YwFN!SlcQl*hL5wV$hN
pPL9L> mk>XB&G$ZLXRa<=N>LL#J&T@LnpMuMeI@Ppk/1Gl<pRBR$WB!n#pCuDWGVy!HFDy61L6R+K#Iw?^tMVI
a#i>!d WIE%J8ElScA^8:PM/PpaXhbuk&$%a<Qaw$BS+@biQFIh#%Hu5\lqt5Xkcw%&Qm8yAeWV$R6W:<8EF5BJ
ecbW^w Hkh@\a16MJ4\Ka/ai4Xmq1DDALWm:DETy?@$y:uuyNWc5^kc6Y?BtP%:SLRGEpe5e<KNtSWNEchIEy1$
1dBk!E BVmDI6RqVZ<BZX\!&hyelHDeP/AImic5X&SJnT!TJNKy$6:/tlDaRE5&h&j6pwJM%9$Ba6Bdhl&ENMQK
?iym:J XmSGdjj?#?qQ$uD<hMwi!IDIA\EAiCYF+:Mk5HcJSX#>D^TF:5HE\F@tn:$AFEQ%PVp+LJH6H/<nBlQ!
=SKy5n 5aCLmik\yc^J=ZVRI?baD8K/Qq+F!thulKIBl\?E*TmPRb$V+A^C:8GZYKPhyVWPaF&a#NSPNeuF<@PJ
lG6Ew: mLk+@hP5^1^d5qZNySyYSaCamu%=CQp=8Pw%66?5emldSq5GI4!Fae+$cynE!pjFFh+ECYNeEaJKDTpw
\%nA/? H4@wntHkHP$L+k44dcyn^8Y5bFkD?ndq:DwW1Hn+1wuVp>tp@L*6FPRVZY@%?Sc=e6B#HT@RWI/pDhnl
w/nFTF 1yqJ5iN&1Kb5SCJWD>nEwKT*A<pb*wZLY*W<AGhLT#BW5>LGRY!FjEitjQkN4M@BQcPG@1!?TEiZAw=R
VEQWjE K@=k6k$dmJ%t?Wk:X>pyA/5:*Q9DjdZVApcM=Q&kwpM>WAl1RB4D\/1jypm5jKeZTJFTpFmb6DPEP+d+
KM%Rkb /G^H%$yp5nP=jEV6WDDm5mQLGGG99P$w$+/n?mG$JyRM\R?jZ89lql/P<!hcj+5FQ1mZPHm+Abk&eTdl
KXjXPK JC4dyRA>M?M8PKIu5&*+Qhj9Dt>1MbeYbtk\N!4J$L\6:E94Lhn=G%WkT59&$FmHtCPlA1wikucuJeGc
=$dbka cyV*ZG@Ij4lbaRVe:GuQhyRXXl:H+=WMRbR6J$hMLBcWIpdImlwhG^N=e8tX+GjLaDk+Vla%1ASuaVLC
QTPbGZ 44kutnb^e5+RHPYc?mYK\ZAeK<qJ#n>JH:kcljQ?+k*?6LQ$JAW8%kBNe/5TP81HbP9DNa1j*l/i#W<D
S>/ni9 tS#eR84\NT9%?CI6iiqc/T4ly8+8\%wE9SJ<w1pi!V4Bplh*PaF/=+Z#uhGHPMC*VAm<tn&Yp/D91Gdm
Znil8< ?CpKB@WNAF++Dc<wKa<AAuSXIP/!GRe$uiMqNckTXlVdbwVEPe4/%jB+tFHXpWk>tAnZ!E!KPky4:=Nu
>5:+c+ JRFkWRXqTKY@iB^SA4ceLWY9^Nq4@^Ek6EN^LtP*FPKREV=CRHqIc$1hSRyGAe6!V6HPDKNK>hLGQBMA
y9:S6k pBSjSWiXYI<=!Y*5=<=1IhhR>D>ICRuNA?$A\t1R\uV?yh:w9I?*S^k/uN!q5!D9PPMCXZKDep6lNaMZ
DpM>PI %j&K1FY5q%RVHkRt/D58=*nmTAjG@VZIJm/BLh1eV#Z</+cTqEBDLa1&dwB/unbF\qK#bn&!89:Au6X8
YLHGSn E?<bPL$&!@ET6D>R\WtCP9$$^DutAFy5wLdDPYD#&*9GLw*XECQiYEyNXkR4NMte1P\PlB<M%BN:*N+I
^@M4CX iSKK*hkPCk^<AaAb?>V+TTpZi5Ec@I*8<H$@QeWb<eHw/D^nl!\R15QW5\+4EQWld8:1RN/hE<R*lyT/
#AAD$h P:mXnVmAKEhAL6/XAk=GBJ96Vl#14?C1>!%Yp@pH+hRJBehiMAl#LZJw?!E14n&$hQq$8nLB!9dp%!85
MYDW\e pXAb\4aVEKPC1eVnqS#pm6ZyRw$T+Ite\/Ka<eDI@lK@QQNI9H8iQ8pNP4DqKEVt<\j*/#yYKn1XaKC!
K5IABZ mcJA>HKi8dB9JLcK*5PVy9*q?$JqwQwH+eHcWF$SGceqKujnMYcW9Q:/wRAnMyICpldM$@mMFZ*Zlqw\
6%Jypq uhEE<1mRHLJRp^?ByyBykI=\Gq?tyRI1\4Vl?+pT$8w<V!MN9wZj*<jTjGE1i:t:ylC+kMdV!blKTRSn
5WH^CT pawWEhLaNqM6PhL&<LjphIpd8>&aVLA+P\8GtpZDALyRl5Y^aR5Mqj8F1T\KES1SR\TT#C=Jl\j8qbmP
8<KdlZ yDCw^$HLPtMa>R+n=?*>C1!GSi!8LFtE#6hGBnH1Gu8>F>+lm\u?nARQl5EA>R$=ejC&NCC5#DV?MTEG
la\Fdp M8/c%jI$$YetcEF*ZnaQlp4JaJbAaGwiwD+6i+qJMPBT6BGPDj4qqBw=4PMWSLt>qIGS#RQ1wyFDS:@#
Q^F?8t e+=8MwB$AMJ+D=/t\@8I9YltHyIJdPIHBZ&at#y@Fil=%>mlTTw&wiu5=R+ASDmA<DWEA\\eBwyMpBej
NLlmh^ k$C!k=Z#MA!phH4\umYPq/c/GpB9&Q61DMRPV45w5E8PC%L?\TlpEAbEePN<:6itWHKS?LRIYCXD#RZa
w:>l5c Z^<NQteydJqK8Yp<^6c>lLw/1iPCjN5<PCdJ5A:Zphu^\D48jAhXM8VBk6N!+Ba9SFc6NXi6\u%kj@hC
^:Lplh p#&TPZble/A5F\1ej$QajkhmaMBMl#6GHE1nK5WL!kL?1IC*P8W%DjYLHeAtIEGD#Mh8hMm6uhTHZ5/!
<I4jT/ NlHl!hp*LEDd$bdS$/4\V#+/V6*J+ySXFEBM?l>CMIK!DG&SnK=h$D1PFQ=\$+nk+qh<\TNew+wMRNT\
yS>?ND eBDtmDZ^TX\HElJ9DDSCF#mTCHyTtG8C1kMLRbe!FkcD/b%@JI^Xw\5\Im&A5R:Cl$JFKVmR*=abDKP4
8tw5et kAhCLRBDBHBH=jFBcZ\HDDIJNn/u&>RFCKmKKVK#!^=!nFEywVFaeEiX&T*dCMkKSlH$Rl8<myRDVS!W
e@W\^5 >kq5h=wyD+tPSHnY/:k6\l5#blj:EM9>KHwLnIGTm1=ADYDFw9FIlytW!^SamFGMVnw^cQjRbcAMtk!V
eX?*b> >NyZVqP+Dw:8ZYD&!VnwK>HyMCFeh1BC#MEPA+K1C4^AZaNRB!XphI8eE$tVLkpVjEEKynCM@98bqWcA
L#FpA1 DImlw@4IYE+$L$yb5SDa\$CFcL1qLPWH^CFTnuEaX:kpmIECImXy^yIaW%Je9WCJ94nMM8!l@FH>cI^c
N@E#Ab uwe#59B$P#FGli^AwB&FlI/t!#cGa1LDXVwu<STWFGWS\&RkB\BqjJ4Eb#INBllP$SH9TJlh>pI#k$BN
imCN:^ WHC$nql$1NV@hHR$Ti=F^VLX$CIeu1GQaN!C1WQSkl+pB?P@=A6QN1Ca!<a1nEkw$Can!AqqaHPE*#GC
CQt6ku CT^VH\d$alkNIKEpCF<lRT?R\%jKWGw\>J@VY#+!+=$H^+naS<b1AFbcRMM/YJLwc8KCJZpRF6&IqYuW
jZ8MEZ kVNbeA41D*+Wy&+6St@FCL9FSN%miB%=^l?yGF+5VFJ85:GeAA/LhwdR=T$AKM1BBRQbwS6SpmAhihAE
>YuD9& SITpmFmTnXDQbC*EABw^WABdSwQyhPAm5n&tC#dnLNbaQ!4mchL:bSqqEqh6NBuPAh+RVFuCW1bqKB*T
-AD6yd 0009c83b22f001202b4 Page 343 of binaries2.zip
j<u8Lb DnFmVBRG&EI9/pnVTSDBT!K:Vq9VGGDkccIjQymCt!W4WmBJiG#9kWiKM>SARkwElMR+yMqRKtSpHiWa
$l1$e^ FYL+LXq%8k\>VRLRRY4!Vk+/A/KXQTD<:HKGqRAME!dJuWByM8DmDH&RKBIc*Ta*+ClD/eFJiWlVylHL
Jj>Dcu cmyCQk$\9EbjQHtqwn%tFu^lTR/$M98BlKj4K\nL^Pu4p9kFYdN&lFCEyhNBABaRIiYBA6pBTVZRQjSA
Zj=uH% n>^ALcbSqVladEVQWa^iuF%&^nQ/ejl&KcEMbICFA/YllhNaB^dTFApIpLL+P%mRQ%8$l<TAEEJ9p1IZ
iHBt9$ Qt\K*\I5@YVtaXlITea&6p4bSB&QFXcKSe?1CFc6#wjL$Q8\VEieR:eM5\XFGwbhwlyh!6GqbLkQTPnt
SjST5\ G6k^I^HLpTn%FIV/abS9GIA9pKB*I$Wha1AYbZ!NSEAqSCQKZN*TjcBphqtwKXLB1lNqBCMGkpHwTk^+
IEdBR$ ACYFj!ABhEk869!Ly15/TQaN%Y6S+NqAkbR/4*e=VXP$keFZIpFpPcBFMjYdymBKGdlpuXcD4nXDW#1k
GX@J== tty<^&u\A\++itN&tR?KRRMDj58WKTX%D+S&Ay/+Ab$:J$ijR?D:eCA9JAhG?YAJ8K\EHP$@8y\#Im&A
Ph#a#+ kj4qBAIbl6e$GA18SaGZ>bGCNkq/C+cJEq5t!GwS\yphS*4/byjLuXqI?ECd=MALFMlL8tbJuNGnJJkR
qJmmIL y@^VyP9A%B*$BWp8M^1/R4lA1IPt>VRL??bE>=V\5#J$Lj!!QJKyL#1RyMVWRIuGMA:ip@E^XaCP4Li^
d:Ea#Z tmAK#@XTaJ#D1p?KDcKBbVMJkcXpI==*kKm\:CF6>pLtI^:BWG8V&bSpwbH$h4Fq9*W!@LtDyJTRIRYK
C<\<=d ^DKjKT!@RR$Ewlm^?+J>eY5!+kPX5<96<BWWtHFQGeS++!mJhEnB$46S!<@qlHekIFeR$CA4jEWR:uWZ
\?ln84 &u^H&Tqp9<EZ%KMG=4E4qYKCY:KN*VK^t$kGXKZSRkQMA^l&:kJB<a%=+uK4AMBDCuiRAnM>+IiaeA\#
<5R^eb $CT6HkLH8/K$M:D$mM\XwnlHbR@ApXN9c?+bSYwk\SXnW6?u<R^JKe1tPPmD9LD8SZhGWmyqkVcA4w+T
yI<\q< 6mw+emR=\Z6AE?LLkuaN8KRDBeZaZq=AAw%KW56cKGBYSaAHN:wtWJaAjJc+FNqaTDt:kWS6/cQ?G5XV
a1hPIQ $6CMhyY8P^+QBkqZ+E!\CkmLyBRCIwkjkwyqQQP8i?c>pki>/8^i8cT&cci!VNMTPe5KS^%bqmAHuI1\
X$X\lm m!Q!peS9Tk+\yIW&c1J#$kI\ILwuJV!Ecw1D\pRI?9#Pqb$K9pCVaR!lY=R&YaIFLnuRC^qKp#SnFSJW
c!BiW* y6R+1WK6B@AwciAQwuSCK#jtwANMVV%QcdyhM=wtD$K!YJbRB=y5a\qC!INV/QL+HqlKQ\YwS+/lD#DC
D*RYF: MZRhyc8:>\^PA??D!=py1G+j%PkJZd1#6I<<TJTAbY\llYt\wkaq9BDJdSNuLKmw&+GEeBWlCX6wV/Cw
DN^w4< Jw$$\Ae\h^*YwVFR5ClytR=XEQSIDPDl>C!XSkAFCMVnN\AHX%XGL/@%QJd^q>QEE!?kl+tYqB<aKu?S
W9cYGP pRP^\TJHYWc*lLAPkR>FW&1\nT&IZDTmMXASbG$4<5jmjhNI#!8d&lE\tX#Sb$y$5R\DLeQaFke1=aEX
NY#^!a EH%WG8Rl6/!BamV5CEWw819tjl:Q*S%6wWJVIlRGYqS\YFARktH$4nZ>HIbPBm>c!19L!C=?WFdHq1^a
ktj$:w A6F+YZI*kP@AMN&Caq#<ZljKATLX/D^=>/PK$Va1\pu=AVICwKIbS>Gk#!tSCBSDB194!F!iBPnh!yRe
yHFSa: $?6%lmL\dNJmEQP\NKlQ$RE4Jc!GC$#?AccpGFM!?C$=JnPlCTuYX\5M&MkCZ6Z$Ljad@BeSWAppD&HC
+SId%y 5cKD5w#D$8ycC6Gh$w8S!H+AV/<dF?$qMX/JbT>w*K#q+uW\#Kl4Il5$w\he?A4CSGQW%bRwA1uGTPYR
FbGJ%B Nn^D=QiZpt1EC#BlB<8nEMDNJqjn5WduZR==<k^@pMPayGKcFNMG^aVLVDZkGV=aBkDGW&CNC&ImKEEw
k\+H5P CYMa6iqMnAp?HlNqKIJ$WI\8^ICNBQ=u^A5L#\A4NNIBREcTkiiq>J^&?RASaTEQjmD\MVKmHWWHkR^\
q@mqB6 S\=$GnJRIBcNXYD<W4%?C<?\XBACWlRCPIntcwNZwW6BX&jlFLm$RAjCnFN4lCLWKY4LNynqEqSnQ+#m
PNQ?5L A<TRkeaJXGMpSBk1JVw5Sup@Hl/qI!!E4e=^9/%IPE\4mWwRnRRWKFJPQX\5&luyT6Jp:MwB^mCmDDnn
pDQ?yc Hla@NDH>Sa8PqBbR*ip6IL!KJKWA$%m95p!Tdw!TacLplXN!/yNTFke%/c6!>B@KqC?!>Dw^WR@$bP%>
LXJnBA %qNLAAh?R\Q\FGtGnh#!X#G/5a1we#*k>/H<\#AP1aDIKEc>>MATB6$6lbiS1MX4VC/BVkNc?C^biwyK
@l>#*@ hANGaLc4pD5Cujj>jA+A%KTAMpZ/RZS$GybSH$RJeZe<4muI5aJNk\GY4MP151kZwnEPk=>BMZZpwn&N
4cQ8w* Sq?ykH#pAN*$:Xm@=q%YMbbAk=I<5\?C\yAut1GFqSLZCkBl1Hk$kBRNH^G$wCm96#S$/i:?K<XRRnA>
?L8qb! FB$PmwQAWw$tK/A&iiE5=MLTpWbX*<?h&nqdtpIWTB&uAQwGbZbnRj$wWc&D&?yTw?i$\!p5^R^$Y4c4
9E4meZ LNqawCdQHIM5#<wI^yCFAEnE\anKIAIeR4$D6I\DKIR^nWYw8waT\\6ykCG4j9AlA\AwjSL1Nk4n\YAG
iiXa\R ATJ$l6:6X\LpejSuCp?^TEHmadwnlNHV6E!DCw&$Kj1T?^J9PdLA/9cR/Eme#C\A4PCAY6t#PAA\pG%N
E6XXAA M5dnXjA&a1J9V\SI/ICNA4N&mRGI::#>8YpM6q\B\Y@FuGwDBAXwRZpE!#F!$PK#+CSI$IWR@AEJ&qCN
9m?K>* 5+nL6$\yDYKWGLAj5Q\AHaGLIwFwTGECI1RTJdAP&+e\E6uJ!?6J!HQ^nF%Qt!ZlRnJG$C=?++Py@CCA
qhCSPb y<MFbSlB!B@I:1K>qywCX$RWHVRIHNbtMwmlJDXyMVbDudcaJ!<JRdMwiGTew/pm^?WN:eVDFuM+w5L=
RD=E1a KuK%\A@m^EVM:H>=h/JNn*86H\n4BkKuh!1P#B*+>k@y$EndaBBjZM/dRjny%T^l&^Sw=%%j+GqQLjJ?
JybwL1 TkYKb1?6Nlu68@m$YV%RN6<9Xj!labCBX54b:J6iFPdC\diLh$yijD4%@D9k+b9iXi*t?c<ZhQGIJ*iV
8>VQ&k *N!:aMVI/lecdGya*nRXquQ#YZuP/@Tmnimt$bK*t&eRV*9>=qLd*X5YBk6w4Hej<=:cAi<PpVeYXE<6
y9%1L^ 8#A<$yV\5pPC5+@hV\Z?AchuGS?QQ9S/V&:B/$l>T4N&w/Fbu<H!lqwt=IaRe88Cd+pnyVN*hn:cKp/4
Vd#\Q$ #%V&/B%J8BiS8*NcuP&RN=hMHR&CPll5kNG%ZwYdaAh**D>m&5$#+Z5XuRm:WEQhu^nmbbl^uZHH:la6
jyAZZn kQ*kZX:GGa4KHy!4Z6&GM+Y%w!h4N$$Dd<P=#PVED*wF>H:SiwSS<TZGMA=wW69V>HSJTVVJ*dX4M+MZ
\QlNi/ d@pZ51cyun6kDX*Z$iL:?%X&kDl!W4FpN&i5<mGnSq>/a1Ddk:CH^n+E&:w*96=NGB64:9VQa?1%M!=P
:TL+Ke F/:qTmwjLl9#W=meth6W*GXEaXL@=D&SV#tD\XiI?@6?d^h4YJ9=+^PRi!l5n:+IZq/!P#=I1TNIkK/N
BC%5l1 \Lj*?/eie<&/Vb+\+h\PMlHmcd&1wlNZ:c%F99t#Mul8cFCH9M#>%GbAjTJH\c*/?%+Sm=EeENFqS5*/
mdq*Rq <eKp/Eb+>R+4?wd&Z4Ky!R>9qR=bRA&5>?@1uecpZahyj#$+t>b?16BKN@*h5im4qS1G!ktL#%P8QL&t
#@<%:a R#>pLQl464#+na:Ain4aK+88K56D#9DW<&Iqhu=Kc+SalhNANStuG?BBN%TcnPWuFRu!/\ZZe:M/D^!Y
PPVV+D X#p>M4Pk>PbmP^^*a4SSqFjT&A*>J=wA$PF<eQ5=n%1B96%8JN4alHHTV?/!mCS*cy^9CRiDLae&nYhE
@tyS?q m4twW<\XEcI/VPNCmu?9bb6AECLYnBEhLeju!Ln/nTd*kni8%@JLF9@^*+KYne#$td\Xc%>NW>FRt?%t
JXHG8P PF#8Qwm!Xaw8dY6c:6%XAVpYXT4JJVJPAS4a\+tud8&*YuETH4A=iMwN!KwHX9\+wVwW9aEJa4Iy?^dd
9cI^%/ KMkwTwZcLdyMZTHaEFKYM4CCLn!w@/V8+@&D^1CV?i5GbS6HQ88+dkDWt9&XjF%dhRH@B:IK=\#F&#tX
J1J8Xt NibbMYiQJbZ*i%NjYIlpIM%X?ZjqbAG\MnjMCwkS^pHM8//=6?>CLTi#bIpi$pL*iita$@MGkjiY!/ZJ
E&4^lD YK*m=ew@==pC#$@mSh5l%j+wVBH@Mu+c+ECpt!Ty$%B$u=<<XCnyeZb@TNL$?DZY>N/*k&Mc&kNI5^yM
@k&ySw DHqwZP/RNtejQHHWY+m$bY6&/w!$d=^l6H5T/Z<JXhE/1BLMWWXtH8BcCdj%D&:pkJ!QmDhYwtM:n%My
1*n\94 GIqc=njWYD5Z9IbYHA@yuuFaY4yC5wNh%RK/lZQB%iFm8SV?F8AanmDENQln+c$A9N$ZyjWdlBlG!5C<
1ZJGPe &uphX^<P!PDbF1tQ=A!cNPVWA/&H^#T%SIjNT%k&>!RwZiDi\LIl>qXVnWtlMRYjbj*y^akHHwSt6eyW
:EBT>! $a&6&FZ&t>K$nuEwTAY\wekl/$t?C\5Q+mk?pPS/kW9wdJeBaFdTPW?!l4ttKEVcMcE^Gh+*h/=jGDkM
n>GF/e 9AG6qu=YCRASbmRaAAJPL@B=KH=ReDwM1=:tXCdhNZF5@CNR5yQkGbB*wS\dNECCMZuH:u^$NDT?A4>B
u9^S:u GI#iw=TE<iKSMdTy*W9Wi>!uQPNZXBu1>=iE1pm^1kCV$VR$=TT98:\jS*aqqpwLMYW5@EFF!qWpFq>T
p/DV#1 +8&Yh#8F@X=8Hq4L#Cw^GZ<T$!$QA/QX9?%ta!RnZR#4Z5E+BZD4:ld#b:9>*&l=PQIXAV^cD:+<dFD$
Tj@!n1 p6WL^?@:t5:Sk8<<^+%kahWMa*nd?@\De$jH5MI<DYblndVG9FT*5qPt!@R&lpJFeVC%^6^?H6Kp@SSV
WJXkEP TQTtEI!S/1&lZAe%DelGjj#C%H85MHV*MFILEJH<4:>*JBeS*>W*$ePa$j$YSjmu+8Ji>aADhW55TWPc
I>t%uq $SICFZSyedd4abRGHEJE58AFBh\8%N1RyAp\#*FR!9:1m^LZV&t#K/9qXk=:HGjYGLkJ@STRtB#Rha!Z
u4wj?E R%KVllA6^VEN^Vh6^PH\XG6tCA@G#j=!5W/@qC$5pRi*J<5P6b8YhT8k^41q=Jll/#GXXWu\?ij^&b\p
KC>J%@ 1e<:pYDmA=8EPB%kB41H^@DwlmSePAE5wb^&#tIGpWbMGM1uTd\lciF+$hh/PN^Nw\QcJSmyLX^5R\/p
uL#B>+ :edRdyt/Wi=cedC8KL@>wdDyi/nBhp8aWGCMIHhB<M$JyWI+CF\iM\Wt8@F*IPkI9N?Mbb!m8HR+uw$<
G?Yt!A !Cine5C@M%^p<m9e#$?NAhq9DM:VIAnt9D=@?<MXQ*w9TADw\kBZCB9*V5qy$kil8@MmRH!T!+/N+PAB
KXn/ZR SYLhcYpKE5#dBCXBN5VAA<NSdE!W&pSYQ8/GQnZSX8iTR?yA4yahPSVVBIY>4MN#Ap&S1HtMPlCcl6yG
uIpMTc C!+lB@jmA>*uyB9E/+D<*b9LjG=$Y?&*$b:HRT>WJG>FipQERn8h=uPKGZVQ9P$hND+RLDaVw!4EZ+F*
-Aw\M4 000915c90af001202b4 Page 344 of binaries2.zip
+:Jk=5 6AV#/FC+T#=AjEkXLHH%q8WR>cn1\w::BRNqljN&kA//%6?=!IC/buX\6lPEp8y%Gw:KD^Y%BjET$X=j
JluejE ZLNw%:+#*M1n8+\h/Y<XIB\C8pE:%BpuBSp5c&QR^!CG9C?l?9MimPejHNtb!h$R8%\+<aMY/G4h%9W!
49/YuK E!bGZ\F$9I4CyGt\=pcLt8\Ph5n#6&Hh*kbwC>H&aCGNPFLdT1ppHpAeP4APb>RC\:*yi#ltTmk/A6uD
HcljGQ 94@MBH!JR6&B%>+JKGKlACG^ZyE>u\lt^EmV6^j6epRYqFdcY*BM:mk+uV5!aL=AcP4/*qWV@4EMhP%I
Dik\%M eSJEVJ=RY\b/9pWBWIkZu&5AYy+hTFDLtSAYLean!HckdejYJmEp>%?^dlkMa/F4$cGQWIAuEa9=P/DV
wY?q%< ^=n>>miF>N=eMRVh/<p*=6GydNBVJ89?JTRBZQYJCWJaW/NKAGMw\SFVJtbWJ<E>TFVh$Ad1VlEbe5XJ
XicDdA KQXZp?A^J*EHMH!#pkGA8GTmGV<LVmQXnIEyHqilq#VF/1Tat!wDk&<b@EQNt<iAR%6mYeae^n9G#4G:
uZ1*W% +M5<+SHP/SiM!tRi*\&Yqe=D*tYn6dy4FMZc\YCM+dqTXV9InBJiD9=LuwHWR?CpwcC@ITIMpk!=P&pd
?jZqDn 9kE4Il/?#miDT@MBYnAQe=%D>:4mKGVdHEXF#N\*18!cluB\6J1^WBbFEnb6jFb$mtNuYhRiDR&FkWKQ
$5eph& DedlwSRIp*+ApSZH<:SZRKc&nD%tEmuRb!dDiwV?HSEVtait5eFdFQAQMCL$HNK#=X&SJy9Q#Gu*A^m?
XYNVml uDE8SKkPIINk$=wM9A#Pa&A*p5*A+KFlD^y/Fm<#cmtXWGm*BaB:5SmHTt@/%t%ktp/M<Vb$LwSCtbTn
G^t<9@ ZEIhE?QA^N6uARWky^wLakK+9^RD:\lq1D4?1iW*y*AZ*aGp@ie\iX1aW$C*q&=SQElWB$atRRlTb#h\
4!bWQZ eFItM#RGEdFwkIqpd!SYCZt\db1^q!q^<SXu5^5Mkmpa!D$%6thS/E:F5IG=dVDq!eqyHqkWCcPFkkF^
bL8=8= B6/PNbdMDHWApMuCH$I+#btH5AV\P&B$a4<?ptyk+=KdAiSX!T>RwZytDHL5dqGa&Kap8D$KRC1#GQ9a
<6=ZKh ?CpAce@KNd\5>lned5lPk>8uyX&@%RER>u>5i^bSn5Alu@pEa/YATTkp5HTSXbRWBpM/MTyVmwliDA4A
XLlt/Q Yk!=kuiA>XM<^i\tXaJ9B=w\eNR?pVKQEQjh5YFZhdP<#ubVclqpKSnDlFYa#!B$M+W?VA1eb:B/GXpI
99ktVJ +8hC6Dy<GR<==u<#ABJR=+DAb$CIEmBGAIS/&I/9!>$&BwRFZKR6@+auk!@C!%Iay%mC!TG<By\lJ8V^
&QA1L$ +b*y/XwYwIZ5%1<ylLIY<*t$A!/6X$Yl&uBltmhj4A+Q+SRHFnQAHH\Y6NL6HDY>/P5m&El<?yHE>LSu
a%=c&u WiW+iAj?Y<hW1M?Mn#6y%5*DC<GlCp!p>WB@Kdawq/\TDCj5aw$h+PHmtJZQMQnhnQa<+TN%D+=w1ncb
WcBS<C n$Alblw+R$4kHY&DTwAHbnCSedWdi<E$BSNFMD#JE#akbI>9a/^e>!l$kHV#GEqyHCRiXplR/j^RmR@@
:=NPNd +Me!N1>QSc^MGuRATDhYP<Byj5C5<&phA/CBckA^1^L9C^!/LLiN+8MBEGCP1D\pTV$Fw>tLFWKa^GAE
/?DLww Q>/&pAwdM\Su$Y:kyJqb^:4T4iS9yVhh?<aut5D:=Vp+Mq?h^h1:t+Gj+p:VGht8Gd\HpkIG?5Z?ydAl
^#QmI: cRF<\G+\Zyp*:etlkS1!$tFCehbRI&#/GHMnEFHJMn!j=1Y%Qy!plml$kGJM^SmGDmIAS5+5Il5B?L&X
P>^6$d $AHFYd5^wn4IYDCn&++L?AN%+kBb9=B5!6l&lFYK5h1#DZH!uD4dlbahBnKHK\lCdPjC^Cyab9YMhk!D
Y!kJF1 D$B/84p@Fln6a4PMuc?5W\!eDb^MA16@aFKN?F%uJpWP9pJnIn$!?DBIuj*8J&eitVwS&5H<$+aABqFW
=QB#*t GFJ$b=YB>LeVeWH8$1SCDASD:e%KHN\GtEpEFqpLkjXtmnS:4tB\KK$ImYSCm+41\8F=K6a\/%A96wMR
D5*+nR Bh*e^i>Yl6QT4@FQRV5?FDQp&P/Q=d+I\Gm1uQyu#G+WLA9C:baZT:JE>FQBCCD&y&+8*RplnJ>>wS=B
Lui4Xt @l^<&SyJWIZmXQqw5LdIFI#nMh4hkZd4!$kDdnmCV=DtJ4F=TEppAeqaNPQmwnt+*Rl1GI@5^mLp5T5h
>6JjtD iCM*4n>//BM@cVyNbt@?GM8CewpH#EJLRiGtbV5P:IBaR<#BKF\kNC<MlCG\1JIZ&lN9V/Qa$#I<kAl5
#Gy>LK XmEEYy4yb:1y88B4eeq<jB+qtB*>tNG66WTw+#L!cn5G+Qm*^Wq:\MJTIE5dWlnE+*5?CcWAIe/4yA4c
wY^\Q^ dXdDB=k$/8k>ciNyc?cPYuG>N=\tJbbEBT6JAwW/HD/X?i6IJ*BWt%EKS+aAABlM#+J*p$WVT$G+!DhJ
*?NP@w M9ACliIpNJml8JL#yIkwIhd6A$</Ck4TklTtucYAtTIjMDtJ8Z*$TJIWl!TH\YQFC4EItk1dEki<Mm%P
/F^4q^ I4Fepy6YVla#XPBnPnhP\KII*?4:>J=CiwHRu#e6^>+kk:yyeK+=BPi1$i/9PMdmjS/GVJt#SH6kTRhk
yMP4Fe qj9!mB^tXk\46+Il$GK*F+EAKqhFYQI8PEmPc%RH=8#EmwhhaEhY1%F#4&QReq:6cQ6X%qjCZV+NSAqH
=164>l $FQkFGQ&E>P#G*1@dbkELbBnPC8YBIKQ:ZtywlJ9dcTED+TNJZCi/t!/AtS/P+T9\EaYeN468aR\dn&/
?<yZK! mG@&=CTD$&$QJbl!u==ewViHL55i$*c9:WZkp=qJEKl\?#W/F&T*^ECc5CtYZB\I!YQA\5KjwC?6#*+E
G$DGQw GBp\\<eTa%qFYSFk<E*&PBlEwQEcmiANe!k8CEI%=!t=hAIbSV\Z?LABBu<IaJC=qaEd!yw5B\l#@8DF
qiqSpt WGPR+BTAIeD5:Vwb$9enH*QBS*kV:km6Qen4nR#/Lp=ThZ:t+%5+L<cm:^9BKe/GNK@hF416&d\IkJEB
yN!hXV CPQi+mS==n<:%?FL4k6yTCGGA=!FJ=p?/kbaHnJI18^N!l:Rd\/Ty5eRBaGyPAdT/>+GG<l!dlYKIdNk
G6d^Pk *IFjh+^?K##/uTwEtMT>hbqy6K^cX8ZSFiTyb^PQm*CGayZ$4MJM<PGnEKH5qqAB+uG48FIbu8Ahd#u4
w?R8W@ 9b5nSwX\IYu\!TS\?&5p\b:njAWbKqPW%a1pK5KBSISyHy?I@eDNb&*aM=b9Ict?pL!kV:!%8#y*@NJq
q%aV4w IKIEZyI6S=VCF8T^@h>T!Hq*nK6apnEIu\89#BM4XHdC%VEISFc:VlLPPk?=a:8#qtG9<ac5A1JpI>4#
5w\>mq wAIj:yn=k#GAN:&ZR\:ul64C^@b#BAhl$uR^QyHhZ5?+Ek*=ktRLn\d>1*yN+Mtq%DFwXy>yLdDyw>A^
NJuRqe G<dyp#Alla5$k?LqGGZe6>5A:JNleViER4R=S$RYXadt!uaAiPjWnVwAB&h68#X*\m4^S&AHi#65u&ah
<>%@1@ 6^j4S:A\ili1F&>/D@T:i&J?c%bhGTkuZcNRuJ8WBW$lR5+>P+PyajBhaYT@eS@BS@%nMXulww*#RCEJ
JN:jkB jG8TkR<9AjRh@*ZeIQ#*\t=AnBwK/m?H6>6!KNd5u*D9:ZL\hh<A%5Z9?5ubm\e#/chlqQ&p<ha15nn$
9k5e9b %M%mBk4/@W?imTwu?G%^HR\/jWBFWCyLnlQS#kB%B6?/yA6CF*=pCMTw98K?ScByA#lh:P\YlN*6nhDN
*H9lC@ lZXL%P:T?uVEd$GAJ?lVAu\LYPY&&KSThiKT81<hl=+:in+?Z@XXPyEQ*wltQk^qhBakeLHb*b#Vm>Cm
#>$RMq LN%ZIk+kIEDYF?yuXiV#Dk@IAuE\S^Aai^a=QLw!n/XhjG+\uC&\6:qX#&8*Rm\a:C>@kIHDRVi<aEu&
pMyM6# CJ4$Z<4yW&MRZ6$SHw+KS^y^MbG\j5Kc!iZ9<:Qc#bYMyNCm\kRiI+J*jj*Rl?HmD/TdYiJ5864PL9E>
:8uy$A hX<$ku/@8D>b@6?I&LZS@R8TB!wCD>Ji1?!c?a8\X<#1ejG=^*6CF9=<89<Z??X9TjaS!95j>%GHH:\w
\y@Whw LXw5L14=&*c/+N>:S\aIj?<X:u55XWm>4n!@iDSp@b?*/*9*n^%J*Qld@P*9#QHTVQdJ:JPFy?cP6K*y
&#FM=C 9N:+X?QJ$V9q*!nQmyL<wjejJ6#jXBCDPuyl=>>nQ^i8VQ\K/>5jn9qQ#\cn$AIJTRJBYA:$/WJuHVq^
ZT/eLE uqQ$>A:HbR%W+lI#W!kEt!yZ8MZPWPi*8tmYn5XqF&/wJ\tT%Xyqhqd4k<$L9ZYEmnZ*6G*Q&TdP*aK1
DRwA>> kNGyGCE:lm#J>t\LTJ:@?XX6DiA\J>KFI>HIW<yBBp>?\*kn5SibqiLSluIh?&PiGT*<=w/8?dwiu/RZ
K6%@$Y &l1FpY??#y\::R4P%B1k4+bGptk/I9S+LMX5jL?5=uDe1\PS9dZy?/aCM!9yGwbdB:uH^V@V66wiuJqe
5mnDD^ 64nybhbFqI\!aIahMC6@e8ZlS<*9=T@B6l$4NKuGWL$bk4jn\RE1@bSC/>^t=CqtIc=thEZY&R%JD\pb
p5wTah &Z<l5*>wy4&EnT*Aj8Hb^l:Jine*c+bR:Wj+$PI9i$JZL=eT$5KWj/cLMh<ENdi9jkC9BNM*ARm*utBQ
*Z^Ni^ nq*E\pDCh1kcRmCpK9IT^Dw6WF41>^E8%AbFtEN&V5yATX\h&6&SP=MXWIi<11VHi5<CG<5\6CIZLZ4M
CDm$\/ #dW$VTMD+!6BDliXn#8RV>$VG!R&iMDZ%FZM*c6@DBAFA&E&&nKt%@NeT<TFKCi1CaMQC!S:Bh#=nJBX
aBM*>E 48j=dc%C+<FbwFQ$u*DjuQpnSXj?FyDn\VN6$ZBW9bAKcNS51I6nGXDmty5ZmYE$bQ//PVyhByFpdF*8
a$^#qi \N<uBtlX9m4l6jIB<BuAK%4dLH?4LF*n8t#JHyq+#IccZHM^KuCDJdMGADdT^8uFmMCV:*$DmZFJ#?S^
yJImwF WEWpWBZDB%NL?i&j>AFR=Z%@Se@X>VM9?l+GR8ThH#Wq\!tkc6?A^ca^u\1A#*::eFG+K+!YH/>R1pLp
kAG/%n 1n:D>eRkp&?TBcmZCm1qK=pAFebc9l^$R?Q=nR+m!ZX>$eMG6Z/^/ZpV@:IbA5*P@bh8=@!b=ZJmWMn\
4\X@dY 1Id^l=YDR>yC&kbP&@!^<$cN>$m4TD4Ck&CkLP/DB</*qPM\AI+1Y>CNqyScL9YJAG/\Z6WMlMYFn^@j
L1/j<L YRjiDtdDF9B\5!wuc*phbSbIZq/+E9nuLdYTnHREj5V:Z6Qbj$=$e?6#9!Wk%ZnVu8eLHcSn!hBijD9=
>VnT=$ jc<=:8?5jIAS9uiE5YZKGFtt!b\a1+T*=y@<8!$:?6b89KA+EW$IP%&E?/PLy^IkM\LG=WL/IhGlII^n
KS!9+D ?tASSqL&bP6MF&tZe@VGWeWL:9!w*W$m8C9dkA1AReBan4l$W/WPL9^V&5WdYym%ak=Wk^F+XN*lKN/W
L?Btbt >lnLt4e8\leCqQb^%BDyMM!BnAcSdeE^cRAVR+TK6lZBYR%mLC^@dCuum*pY$AFk+M^lS/!mA$MDRc8^
EjLSyG BJHjIwyNG$#la\Tb:Ra=^ynQw>FbX:#^:p>^@d%+\$W4kL/MK*JRppJp*SAHXu%R>G*I<HVb4tm9QaA^
Yi\#@$ XHamj%aeBCVb@Y514%6!wA^=ibjRd&w4^VTw!Se5*JRHlhiFKTb6?JVmHpmNWe$\V1KD^h6nc6FcZq*k
pXQ1V: R>?Cb/S5T8RyhLSYIXn$C8NK9mRy/9cG#PS1ItpIPhDlGCqmD/1qX^jqH?Fhk+M!BcbMHiE6/:K49+%=

-A>9<k 000c13eece8001202b4 Page 345 of binaries2.zip
<LSjKk TZLaGIIpJI?9\w!V$aIH!qe$mw!G1S$Xklm>!&Q@kPLHQeGChc#+<6SlIP\<XCM6*Y9G$yuTH19pNL?=
DqA^wc SI<AHc!WP6P#thb#5e>!+A=Bc8nPC!ECk%&SDDYG\KZI>K&qy46GkNT!$P!+1Z?a>@kYDdS/TtcMFkRt
/j4/@T 91tEL&FAW6%SQlY<p@^Kk^m@%h#%ZYPt>NZybHWH1CS+ERq%F8p\%GjS+>5Y<4Hc9?jCc!IaKy1e:jt>
ZDY+$! MJcp6lA#n*ViKDk8Z\whiPJ=caSZNMlM+<K4EFCKTnIp@Gw\k!=@cNXn::nmk?=P&&G\#=I?nA/nLpJH
&e^1jW >wkBcbXm6E&M$&t6T=1GiqcL+8IJ<+e9Ln8DuAW/ElnBT:CAEXi81/V65kGkL>B5$JkZJw:dVuLSIp6&
un+W!? 6#GI:%\EVw^=$DSlEy6iTaS5C+\cHVdFRN9N$GW$FERHY*PIIFk#J=YNu%YlIGEk>YHFEmJJQ^@4A:ww
5M9RSl <^Vi@?VFl&mdQm\:FBZR\du$Z%PP4V8IANuwDC&cAtBMqm^#!bkhCkKD1AkMHT^GtdaM#ZJXMQ+G$&Qa
lbuH@M TR<!W?!uBb=#$XAbB8aHTRkwKwKq%??l<d$e!RGLMIXFYRlta8ZAyhNhP9MF5w?@ELTy*SA1+>6l5E!Y
NplPdp =pmnHLB<IL!KQk<VFuLAC:6W>@an>u6J/qpLB#&L9^D\AM$aMtRaJCGeFWjRK%I%d1>ByY8nkC^MCIP@
q^4L&\ lmE81QQT^$eh%@p/bw:8DPDWKw/Z:WWTjY#b^FC^Fc\d8@EX6qnwwAcRT%n+JW$R*\dP1!8B9Z5aLS\&
4<Q%Z$ 8J1:6WZ/<<IS&P*DYaqGIY8$XCtLTTltwJRaa=kmVJwHe>DG<BhEB%ClFKDSZl8cbdbAiuXZQSA6Cdyy
C\Ie9X YM/eukWAwWWF9X&GT=TX$G^uMly:pAARmVPjbVGIPFu&b+l1$=kJ!QTkR8dW9SjDcAlQ&GMNu/X!1l:G
mKmIjC yNFX^GAM#/%GuWWyb6aBYnkQ\nC<>P8FH%Vwp&LFju^c#4Y<CPX#H^t$P*L#qX96/na/H&X/$WM:DKut
nTVSVw ZuRPC/pH1dMWcYEAl1Cjuh*?EF?Bk+PuG>VhlM@WwwY1Yd@8NplKitpCK9HHw@N5lkE%DidW8GM&uA56
P5&NLV qkMJ9a\pZV@8F&Q6W\YI/=LC^Sae$CT^&LlpVQ/NFYj!5>GN$^4M:KK*5=<Z^EiF#%Xan5EAkNXbTjJ$
D@SVbV bPNaVJA<#^A?V?=*nSPLZ1Qn5MPEM/=aXpa@=a+SIjBa=@TK1<:RdF<=m=<Nd$kLKWbF:Vi\b*9LkLP9
p^k!Ba JEeR^#SE1*RWpGY:\I?WjeEILK91wQaV#VVytD%wu^uWTV$pjdWTHkS9I/XlhdjE=IX5^whGFC#^GJ:L
\?KFVI CC&lc?\Bnc1t4V1^aS4dnkAlS6=!a?@hei4G#qtLCp:Dmq?b+BAt!S6=*=e6Q1<F*H5Zyy8Bl5eV%TpE
SHajil &aFNSWHTu=S:Z+W44nKR&Pke6edRC!9&IKF4Bd*QpTHRBN#HSadKkA+?JE1%eX8e8<mL5aM8S@$G5nRi
CB+I5e W/!&Zy1X*AK4y!qH<$!dXJT/1qEek5RkBmZREF?/yaGHT#PtXbtHJap!/lSD8aFNXedkQ@YeW%^&5qBi
VXPyp# bKAQp+4Twl5&IGq!+^=1kk=Rp:EaZWST?B/1+T!^nN@G9KaG*EZHWAFGAt=bkISp\kb*T&uPj6jdA9C@
u!/wlX X=u%/k\pYM\R==B*kG$9KR!ZEhDWBXB5hBPPtTWBDQM@ayRe?5SE/*@l?TD9duHG/8WHt$4S@*VS9/A$
CwWM6A bBCCd!D?8ILku9^\BlLiLme5qAjbQBa6Tk/51wLA$6HGFjSdS%pcWAh@Sw4kWyMTCF?>:dP4wReeAYSJ
ehMRIA yle8+TWBSmH$$!mA@\Tua^ykeRDhWLu^Zk1+WEQkCN8kRjD$4$CZhI5IwNTL4&AA!1aK1H/XPqcljdba
n?GCV/ eK56SkNan5E^j!p%!RADhN#WB^t^Ca*Ej!ajHJRGqRB<kw^Dn?^qH*HSDtIkVRIETA/$KdTBAcEhX&1V
4iV%A> I<wBB5#WBAITm#XM\eFN!CBl4!y#HX=ZA/h*HRSYbEDdm1JJJPNQ>Wa>!M>jqa=E1Z>SB@S^/4?ttb8!
tk$p?y FKHTeni<GRyw4RQCk$<bcnX$yDnVE1HZ:bLXbncEEYiGalq@$^RXtFAGEMDBRmlMEIjAd&IwqSIDnlKC
bZ=ACI Q^d6/&C/n#T??D>dR?nqNA$Bup@>qJRkE4y5@+*?BVW\4dAeDKhHIRkdL$W/ePKKnuBl%+CpPJ&4/LAm
QD^%eC T@FRwFDA\n>k!\t1nHa+jqcTpjPjEI/k$FGWHAtS8#W?=en$D^*nFS5BZMnBEmV<BKK+wPq1GAbelE:E
WLy^>5 1ZjLMK1qRXwTwA$e@k9B*+aKX1XEL?D66dYC=%nHP!BlDtK=GTywpqGjE1QH\ASkKMWRm6hYw/<C\qW^
/cjpL& +X8K8c<cwkhktPEc/?WcA%WhmE4ZM1H+SBnwC+=ymATqRBqKEG!A6TDZY6C\^P$hh=1EwtZATX=RWW96
b>DKpb 5w<aHc@BPA\dTGQS>cGCTBA>B>YaJNYwA^Gl:a5NEZl=E/E?9$YPKpmpE8$CE&dqyKYb$hZkDtSqpRA4
5?\nmm P4PLWTdjTBIHPBmKw+JnyIdRYWHa1Swhl%WZe/5JeJYDPa><em=?p&w8ASk?6i%%M1YliG<%Tj1=I<K<
9PREut u:1>R@5i/=p8iMehbHGYIYAI@<!DmuDK#ARIlTZGnESTmAl/H+lE\a8R+GY#Za%hKFA@jHw4:TSnSPI\
+Dmt1& kDj^E?mwNJa<A\CW$BBnWc6P?T>aFI!eDiiR%?VHGRpXcQReieGaKq+iB1#KD5Ty$EjSDKukRSq^>Tp%
!ul%d$ Tw&aRDHWA8Ec?<DaCZ=H#\ZD/MTC\NJ!py4$DFqBm4lFJ$jEyk<ldMDG5P6\iQR>6eaKRMlBC\@KkHAA
?cJbb+ jk\kdYuSKhLSl45GYtRyu!MELdJbQ5$G6&\1>c8FBcm6Mkp$Di1\yV/kJEcQ\j#AeV/Sw>N6cjRl/im9
dM@&+k aEDb::Kp58AwNwkHCV?kB:+yM6%D96HFL!J6Vu+l=qYZ$G<kB/I$tI:AIAGMH$tMeRW#15KQKPCFhnMI
cpD:dV k^kNjWD\nEdHKWIJWBbB1bEqE$$ZwIB^\ZdcwlZbkTpebW^P6u4eMt1<d:aP$pePqcMG#p+dSKSdF1mL
GJ\SZn HwXZ+tDj?pMbZ!Mc!^!bbBmnSKw^VTccLE5B1+l8/R1WbAj!XAT6mn=+aQ1Y%IBI\YE6=&EDKFkq5qVE
V>\\1P Fi!4i^4>+Vny/#h\LRR%lk<e5=i?chdT+XZa+MEd/nTIXi$LIW1<jXXK@b/CR+&ik=Q>D%u\>EH%kZCa
Q@nDtD PmkDKED=%WdVueW9%W88E8R$JGWb+F%GN*RX%8#jVwEN6BB$kTN*:%bPQS**!JTQ1B>/GZ/ntk6E:i>>
5um*Tm dh*w=Zk1A%B9<a8SBFFYaP1SCw^bLNAL+upBwEAF1#XbnuL1EB!4SbAVl1WD$\D?BF*DBmVekR9tpl\Z
@ybl!L +k5&NRRG%nZ?!GGC<wy^\wMWDXGlBKW!VACh\i6k/=\%/8IR>Jn$dV4^#Wlw8?<EqKiC@*%d9\RAlqk<
ilQpYc II%DETlaeeE5JLwZE<^XjRL>6=!uXnAFGqATb:TBGIAECI<Z@JEW*Vt&ImpF\8H4^qD?8L#=FC9l^9jW
**@i!d hc@BSpN\H6QpmFN*FFQZl\ySYI4FWj\6aX%>wMnntC#<$IMy8IAu!#p1I#m5MiCFwKC\K&R=$6Y!\5S+
!#!wJT :1!IBdwNk%LecC!nZ8I11ppF88<Q\5ECuE#nHa^/mHanV5JBdbekQX#w#wLLA\J9/5cJ88kFWHT%EZ+c
&==>4h <eci#<AX%5HHm?BTViJqnF\qw!qA@$&^\AcD^mp+ZI\A<wBq1n!<C15PqRMM\e^cCZ!&jMPwFIMl%t=Z
B=V+/$ #Qh=tmCRbJldu^>&bPLFq1p\mtGTAJB99A*Cc+tLD1Ly#mAKZ+!^I$W*1KnHK8B%$ZFB9Ja$pMkMG@$I
^bT&CA F<*d=VD689^FF1<B+BiXw4%nhL$d5^wu+\wZbMEcLbFMj?cBWCuyTpT$eu*A&?JB9bN5*V6JS5GyREPR
cHilhb F<JaWT%aZ%F@AqCYIM6LeAwTNBA5VuFG4lmXeb>icm&!ecI1&9S:k#m1?E+=^l*+kAlCmWI:RFGMCcSk
pFL9#Z EIHenGE&@RAA8IPQ:ECBpnw5A8+DMEJeqN5hGYX45lXIm1MmDa1uX!IaBdDwRD\B4qc*/\R=+d?t^lND
<9nqD? leDtF94ZLZplJ?HlB!uBJE=RB1NRwWKYHNCHyk#LNdanNC^LSHSphA!c:*A6?b!nRAZ&LWyJm+AXSwp=
VTTF5u !KkN*JJmlwMc+&A4lyndL&ADhA&tGbl^/lw8ajd&:!5yG#aC5HT:n$^Ll4Lkt$1nHhbi&tFT\mFW6lGQ
w/&BYB dMTnBi%!DA/hk$SR#PVCnpwDL#CM9/MKu&mBkw9wBIKBk4kyTaD5yBk4PMEC9uITHn$CY1bL+=?4Dj!R
>%%$YF E14JL>WlCqSYqNR1KIE+Vka&+^5eFAy^ju+B/JhtyNW!ZwL^lnAGD5tpmI8iT/lLTkwubIXq$k:P+yRc
L>>XX? BYGBH%\KwMT/LK5=XyjJAV^YB$CMe8+G<:y1NBwqtJS9H\WBW%l<4nTIBuL\um#P?E8H@^F<#l5tmIF*
tXa@$% ylySaqXpRGRQcnk1=1At4n/61K+C^uPhBPhWHLbp?$NlDuAw+\BdS^=&<lbm6=cCj^wWTJDH%&GF=>D1
IecS!W DFtlp6J1B51BBAleMwB&A@AB:1AhhwApNlMqFDn&WLyhqeiXG@!nBB@ERYm$\BL?=!RdV=ipqKk$wlTa
wl\tLp Jd9WK%WwQVLL=weab&i%CPnjYhBGH^k\kSy\YcL9AE!C/%eSIN4CCku!^F1^bZ5?SWkbI!R$@@*q=u&4
I&dTpH 1K9K#6PTnpTweRHcAT@FSE&#DPXBcEuGywJkY^\pd?aeE^XlCd+DwXHPPVKEGk\pbNpHKimWB/YkSWna
\b19<@ lL$CJR6FmSSjSkGM\$wD%SAHuj?9#<E+^WMQVIjJPYB/tuJLByKFpeCjR+l&IL+ciPE/XFmAnb=EDZ!R
F*c\\/ GSmYejBX+8tAV%VSKBYPVEP<IFmYWm6DZ$VDZ<Ec+ZL$<D5m%DqlPBRQX:y$+aV/cZX4t:++DEkWM/4i
W*J#V< +K1<K&*FYEJhVWI>PCiGKNuan%c*R\!AqTp+GENiS9Zq$L5D>^t!NEw8InyQb6ARNHARmi=DjNaANFcL
e:NcZm k?!Rkt$e9q+1Yq>chBTT?PL$=w86R#a&qQXT!b5jHQKpLckAMI5haEAGMaA\Bw<G*##dd!9XM#dm^$??
i&A&dG y+kANKS^NV=/e6J%<:=IA#*JPNVc:C5nYX&N^+$JTj=Ke1y\^RVh=NaY\/Ll@ji#!HC4*ih6N:BK&D>k
4X<mR* hV*wK<Tdc%G8NDZua9$u*/lI++B/cb&VN5TeWy#ba4K4q+P@9l969j\JG6>>X/XPZE=wJZdVA:nG?41b
1qi8Fd 51wnhZ*jBpXFZp1MP\RRF^8CVSSh+P=1pK8i@4a@acLH4TI!FG6qit4Y&W@JXN+n*JIq\5dmM+$BNmwX
@&ypJF FQqF?i4n/NjKS^bIMq1Xp6Rie#lPukjG\yZ9KF:P5Z&wa8LW#Hn9<5l5+Cu4tAjij?w#6klTM<NyVTi9
1jXFR\ l=G@XP=%4dpWuidjMnuhQ<S#c@n%!y?@NaB&%=eumlYJJbXCZKW/AW@\H!<XKQ>Qy8E#A44yiHuS$BKS
F4%yKi 6Yw4ihJXMi<Ap8K\yaWEndEp^GHQlNtI%Y$dMJH:%EEA?P9@D%j9GKXd#$TL:6%&>&:d6t*d6t*d6t*d
\V@>=I 6t*d>6N&*@e:=>+@6!wn!em1qW1!c5/M?4ZcBKPBT$lyS4jQ$QRH/ewKFJ6RQn#NAT+M51M5DBMj@M&Q
-AaCly 00041efc1d8001202b4 Page 346 of binaries2.zip
e$=uB= hH&Q^uL*KjY?EW*WNmLX1MGpw*u%t/d\MHB<L6W/CMH>J4T4F@j*=HyL1a&4=LNdT8%1Q1tK9BXA%dyq
aWMA^q EPP\K61Q?JETmSZX@!aGFWtM4b?^l%h55btLDP#\#ZC:Kl\&w\bJwFDpYDH/m<Pa<YlK<XW4<aI5hW6Q
j1eZuW CGQ<SCWhtk&B:KA5wFEjy8*ydatFmh5nNJYdql=y^em=nM##?Q!BJX#mwVt4H:/Ld9WD=8YdKIXaPE&Z
/1+eHA $NZRSbV9Aj+kSj%n$cH%CTaYl+8G?#\eV6m8?*Qy>^Lc^BA64!k$wt/G1&^LWG:KGPG>i!ki9A8%q>:9
dw>hnY kjy&MF61Jw9w8HhA9%w%:@VnctAXbh@w1&:e@*1aS@^l>YecSl=qa>5<babwMmZ\P?j@mVqQE^y\t&Z?
kHK@:L FJB5qPQCAPWJSwmmY1aTLj=*\%WWG/pS6^VV&4NwnhDLC%cc?XdASuq<iC*jni?LjBSiap9dmnD*\CFV
8b?\AA c!#4N&mHd*eMG*ellP@pqKIn8heJnlWZQV?IWqLdh8Nc#l85<Y:QtwVWbSy1N5^%#bXaLw$GK>%:5m8?
RdeKA6 bTpk>l&/:I:<1:8w@G/ILJk6RwQ//%m^Q@*Z^/mww>:ZILSQ+=?GEcw=$:tH:&\X8qA:pD6FAAwk1nPd
<pd9\b yRFdV894eGZ>e>jHHQRSbj#=HJEwjKZeqV*di6mZ#1?lFbT*:m^ulQ5:hT6eHRMbGFRy%S6KZ6#i9dK9
!:8^:6 lX&8&jVh/+9GtD\=YtKWq<?BiaeCNNpL/%BBM4KMWnikKMC#ZB+WBS^eiS19eJ/Ili%m#h#u?^LFjPHJ
>$MBT: &W\/d>Z^G8=F@e%mC>XbQACcqRGN$QmFHCt=qd6+ibn1c8LqK*k!<95Ep:ytqcS#jaVVjFII?y1>RD%J
@b\HKL qa6S+N/Xddd6nyKlnM\kjKi>C+Y$B*%HcK\ap#MF9M<FYit$/1nKuw4nS>q=11=T9PeR:/SCe!Wp5TTS
>5Q:a1 qkF*JEBIhZnn>V%k9@A*+5J9jC^45t/Z$\lh#jwpX4\^59CSIB*1qhlmmc4?4$m868de1S*qV*BHtq%\
leyABB +NuGR&Q6m#h:MX>*5=h+ySaiNHiIamK:uI6jSMGI?K$PG:%8Wq@aD4Z&Ap!#Hc/%KX?G8:=kZu/Q<WTb
$yEAA> dy!N#ELZElDCq/WheP6\I=4$*/PVC<CZ<J4#w*qW*lHEEKeT=bqhPkkhC6qPk?G?Ej:&a<WnyJZMKcjF
?lnM4w LT&n%4^jcb8RJ/<DTK#j?T*+Z&eJu!BSc/:V=%yBR!NX?VP4/VhH+PBClky&b8W:BuBAGjTC%j\4eDue
iYl6Za 6<dGK$a!W4BRVRdb1%\d>YaBTMKJ>*+b\@EEtAI+>PFWZap>jkT^c+qXM8\bJwTReB1Qh85V:Y!EEbij
k>V+a$ jb:S/y5dYtTa+\W6:%:NL*%4:!NpR?=i$5>qH\Fm>>Y\H4/P5ESA@QptH!^!?W\wbYHA??y&#99:&#=5
FM8CPm u^^4M8JktqE1achCMWQu9!S!u4<DlZyRll*NTFnin>NA<eLMjC9ah9XBHw>@MBFdSJq=A1^D@Je%8RIH
qW%Bcl +ItJ+S=5+W+c&YucMZq+wapK^P:FR&EkML/$Fy/teu1\nieb%=ISLF5CkWmW@pKEVGyl^>Mn6AVSHu&$
/ZR8q! $=el+TwAbHR%+mhEnC$eDRMI1dE@MEC6CX5mRm&XD!HbFNn^eCVTqhE4Yp!q@$WZ4K1tWZBYV=XG1eGw
qctZE5 Ha!ApH8aq*!GI4kJJ\A95mMJ1RnpG$nT/\\n\NQ<8Sbq1qC?AZKkwciV5ekBYA>A$>@?8WZ$+VE=GPkN
bBtjF> VY9hu6Q1n!au/S?m$XRZmCmk%/Tc@teAywVJdQ=:4Dk6<>#Qtc1h/CXBC9F^L1PcBSX^Wi*@E1aNlGIk
X6#A/S +PNQ9\?!:+%MX#:=IDT$Jkjp+BRRh/5ZAuDm#Kic+e!w1BejLMmSmbwC5cE&ay:X<M@Qm544GqWdZN<4
YM@Ty> %q?VlmJ<I5=HkP@iQVuZ\\p=$!#V?wAwnDkeV%K+h:&HuXGmD5$1BiM#mI$9GqI+t%/nwwlGC?*j:<!M
QX&iVJ #H?V6WRPbVi@E$JDumd\^XduDHTtGEnXyENi$%?u:<P5Fi9Y5<Hk=Z#DcyaV#<$Z?ujR$a=?EtHiWaae
TJH5/& TREiCmj:NnmG8*M?>GC=qIE$*hJXS$%8ZQVH\j#NV?\i86X^iXQa:X4FDuJGk/TcaAiP$J/ny!hXA#Hi
>pA/IT RQEC/bX=Mq!1uEu+yHPW\<<%SR*Hu/S@jqwE/:lbtLT*k8t:Deht=*hHEkT9em+bBYqe+cu5+<P&<J=c
**=qNY iTWGQ$Q5YVXpADtNuJ6TMd^4RT!?l?myJC/WCJ>mBWPGjIACCmTjKHDcRdaRM$MRRk1++B/w*Te8m/ca
9\ijl& dwC$NAjn%@Xu#dXnc?uCm?4<Q!JcZ?RL=wjVD%@1nKE5JjC4$I*tEwB^4QQ5+?%ZV\yjn8/E<aq/Dl+c
K<T<X1 ZFVa!!C8VyplGnpd^Z=&LNEma!9@8qwp+@W:WR#WVAKP\mWda/C%>n^6?*TkMF6PPW&%4j!4u$19l1aK
ZF=&mH b@@>MQ4wip+tT4:V*hCdWtiR6t:ChD1mHZ/4uiEQnDuKc\=!i@QNEX%@5N&RyGY%NaKyn%S5k1$8#CLc
&i*lRM !V&%WR%:8nqtH91*K%+k<<5aF!=+Y1JRRNutF/Q$:p?J?BIY49$weBlyWeBkD4<Dlh+#DLRSPuF!9QWK
+Jm>C1 Ea+hiyL9W6wX?JM=%=w6VRL/%&ujDeNVJMNe/J@@dn%J#LPnD?yb<6YhBw44nk&w+WEZiTKe<+pFNXSi
1wItB4 Z?pJk#FSyT#BuC/dY5cT8Pup\!W<d%GFLphqW<cuYV?chFRYKD^I1%k5qZDAu*bIMuE:wXS*<Nbb+k>:
yDMLkH kSkCKcW@:AaH%GAE+plK&eByR4PpEFPc+qc?j/#dq#kM8=#^Ijn#nX89j>Tb<ppWnAibq&QXqD$E>Mip
5t&i<= jT#RZXRRj8<Jb9HS6Zn>kXE9?CP=5HH+ni\F:14h:N>=h*MnM1mNTwkW\mR#4j6=Dj%HuPcebyRN4>Y=
AlZ<e> G$Muk^Ai5db=w$$Ve#@abJ#4599QXQeJlQXyDK+yw6BZub9LSMD?IE1SGWiCW/+DRVmFRtE*b=Z!4kRP
ljaRp: eGjW\@*RkyA=m4N1B$+k\Pu%B=K1c@\JJW/QMYLKEW:>/&HtdI+kG5ScjjG!pe>QuR+6CpLK=DD%nK?X
1QLp4l lP+F!6<FlkN!EN*!GKIN/@kXaN\Y&wa>t*<AV4t#n%$%4:6mmNMM+&DW\9mCL$KH1kAnVNHVF1S&AyM9
NZIRV% ?5jjCMQ84%\m<J!XZlQB^8W9^eQKu%ym:GJ:V+#>K$YBii/XCZ=M*pJVJ8GbLwdCYNGZRV5\Tc#SQClS
J!<k@& e+/HMab<8GTX#tW<Y*X<#lRu4/\tp$!kNS+ip#8l@NN$W5awDH<KNZ\S$A^$CNc6e$/$?\/uMQEy1FFF
Z8hLR! WPBmJwMXQ?/qIRaqpwYa:PPF&IVCKXSatAtceTI*i#L?uR\%!kJFIRRbnIBIeAMNiJ$cHKYnmkpm*IpQ
V4%M@I w<FS<AwT1Vl=C$S#tXEn>YuT?ihw?SSEQ%ea\+GB/dP+/k#?eSAhXGyPeT@:A$IY<#HS5BX^ZkN^i5R^
ACRPEa b#MBiFL4D*&dl6Ln$LBMLTW/Wj&kitp#lGHD/MAQhMywe#ymRCkTyZd<mFtkNSQ&*!?W454&jblCZ\:Z
G>HFbZ Y6>4mb=iCG@#c\NVTc>bcF1EKWy^VR9<aMEeZyXHw#<$Z&<aJpM!QJl@$\pkpE4e8Wwptdn?ueuXBBN8
6iCa<! &9/w5&jw=^uM@Jk!PXPY8hIplItA$aF8+jlnd48#/&\W*A5W1AhGl+MbVIP\<@94R4d@wEjku?*#P:^\
c+M@S1 $@9cECeMZG8CGCVCyeMAEeuE:<G>8WuHw%4bHE?E/EMVBjR+eJKWW+nSmu!cK$/QTh$GccZiqH^!NVVL
!QTK^E tqjGJQ#biCmEKI9ktGWNSd=i/yk<NBCXC$cmWNHPNj+RN:kh9X5h5Pq!iXKeRSWh$yRk/CGS%pdw@Ne?
9MHRwL cA?n%a\bwncYmY\d\w+BllC5Mbmp!^SDdukn#pl#MhlkB6ELG1IIZR\HMu5?\H\yGFNdTmIh*R?bY8>p
A+hbnG \&Je#wTk9T<iFL^NnX4mn<E!AJwNlE/MHiTPaRQPm91*u4u8y&9uS&BK/Bp=BAQEaALp/nd/mB=#%BFc
eq^5B\ CiIj%D%qk54y*\WESDRdjh4N>=qJyCZyM@At4NkeXhJKmnGc=ZHLBy1AA9&B8Z9#+qVByl+5GtSDqGnZ
mjK%Xd j1F?j6!@$#iPC+MNBSGywK=wSW9T11R\cQn1hMj^@BS\NQLbW\F5>R$Tk6+DGpV5C*>iCaB8KpATbSFE
R5@yt@ >t>+L#VcBm@55CINumSBHwi^@ShmGdubiYkZHm@@#JjnLJl!KDcdD%q$6RRX:@>qeK<YC^!5<HNlGJaX
5bdHwn EVZ6lPGSZBmeAb<Hb9al9*myD>TQ6YdK:VyRpKHQFAi\ZwNiC\+ey1jwp#K9n!RXp\:1hNFyVYKVpb6H
Ywu<NJ *bQX+HjaB^Tu!R4iHnamTmPQkqwR+*##!#lN:KMGdnX:jPKDVlE:qtRDkAIWTQ@cDlNE&cnuq=a41yeT
MY>Xql M$nlMc1<pS?K5nkIL^iF@PZjH!j1y<5X@HAPZGe/n9HGhtw#Lbk*#LmJkt$hm9D4kiNFGR/McII>1<15
*@b*E1 mC\HZ6DmcV&G#\B^%lj!5y/uYCqCCK^+JA+wIwk$JQhPlTC5E%&ABTPDGYAEl?:KL5kEF+KCpd&u**eY
?8!DeH %yVV@p19j%p6pTR89F:R/n1I6+XhPEGun5cnMTemu&e>nE&*+lDpJ?96Sp/<1E!:u6AFJNQ5eJ+nyD:M
PiJ!k$ 5Y#Nq%AbA6KA$YVF98BBbL$yXIyMkRQ:IB^*tt>KF\ymV*quyIT<\XA<hD#K4SC\XA#ew1k@@pwLBbF?
Kkjc^d YZ>BKMV\*^#F4MEWJl+EwYhcltI9/Q+^8Fm@pyIIAwIkIHbqd8k&R&yjEc5WXaLDh^=$<nXSb+nJd<MT
?Wwmp4 RHWBLY^H9BEjaMPHBtHw?ANmAmc+NnY^/WL9FD&m*bE1=wpmqRkXC9GQ^eqEhiCpNITYj/X:*yF^IPa%
G!I5=* WI$YqLj/u*#BEYIb!K^uQbp@LtaEmL<QL5bbbn=X%ALwhjdXbe//LKRm^HH<p8w654D/VB1tBW!=FGCa
PGk@w^ YZQ\bB^+/<@wWdm\?B#1aEwp&VQLl!qXt@?<VblkQlANaIFIt5CD%TCdPiq>bw\AqbcT#T:$tmV/jA1u
HaF6@u DRacw#je>+qD%Emq/*L\V@?&LYnH<D<:CF5+wu$!h:T>KlHJeJL8N<%VIYFF/eH?aQyV=?B<^tybN!P+
WSZubl cM1+XuReiFDiX#RMnS*CL+yM=Dj1\\E&emGV+SD$<d>lS8cyM1n/*jT>/ED5+Qh@c\bIWmXBqV46ibH^
JyHY=t d^E<KD!JSYLk=N!!F5V:EJ%Epc>4c%Cn?e$RVpXJA*RAb1NJQB$>CNy^yDjC+&@+TaymeY*b>FP*bQ/8
T89*NF D6u@WB/F^+Be1PaZX#TL!8qFlFyX&Ke9VVW\nIKYlqHC\AZj#LM+LI?:i1LywiJb&w8YBWD5DA%bMK?u
@5JbKC 1SD<+C189kH>d/GKKRt>AhGF8<BVqkme*CLh>uR6:JuHd5&:*/LlVYT9A=JmaattRB*cNB9$Yma\N:&B
@?RqaA :TPIQ9S@&QTnTld?+R=h4teS*d1%9RY$HhIHWP<!#n9P:$h^=TS159p&imCKE&\%GKWJd9ZulyDcmXm9
%l6&:m leGRYARaLR%FpBNe&!C<#Si1DcJ1M&qu&wbw?8ZBGJcXG!C<EV%1eDklc%I@mcR@QkBkpF#Bd!XAw>PN
RidTIE m5BkwkMPk@m*+/FI:ljM@EQWM%nyBW\Ga+T4wWLiCEum9aT=e:!mLQj>/<?WS8:n>P=u=piDRwJkRQmX
-AN*Ke 0009b698be9001202b4 Page 347 of binaries2.zip
PChWhR JAcqPVP/JPFIJN?!yM\9uaBZkG!KMRX@lZZ>\LVJan!JKhVyW!?WY4?PpARH<K^Fq<bASJ%bHBBG<wMI
w%<:aI LCH4N@Fd4<?eut!AEST@EEJ\aV*!6Z%$4ymJbQe/RbR:wjk:\l^P^WX\1JDS/N\l&w*aB\VttmIS<aHm
m4*9:Z VF?t54b#wI@cwYMG\LYLQXGwb?e9Fj$:6@/YWyZPHnGHA<FRtPdQ@mch4jlZlIAFq:94@a$&PSHd@PRJ
uB@In\ 1*?m+J@5^84j!X:ZA?HBFVCaJyGtq\pb/1RdlPk9*>4G^ENG&QtdRX1EnMFN8?RScP5@Vw%S$<%yaD\c
KdP49W #HpmDSF=9LSq4bW?jtB*GFmIXDG\Q?:1VP5HCyjt\tZd/?^?mk99E=&6eEGtyP&eAePT/=NbpT^Lc88u
tSa+Dt k$luMD\MK9Zp+8NdTn9YXZD%uEVt\=T%jWVi/ADm!::E>+4qL@cL#Qj4h?8R*5u*eGL&NhE^81n>i:pl
p1qXJ1 DWu@%\$wmKwwW?WQX+n^q:SX=WQA6BS#%*PF1EIKmXH8tlW8$h+u\>4Y18SbBRSaq\!pc^Z+BD4edN*B
*N?\9Q =5KQLHkL:6K\e9GeHnuZ:X5Q/KJVw&#6$/m4!DMB<>KaA^d^cTm#MNi$tNn<&Bl<jqJMuJ?4k:u+dtM#
D5I$XC M/1J8aXJ4AtPPHa8/HibJcnN5J^/N=VyD#GD?ncCtuq^?k1mc9X!Ne$lBqYMM#h\$=ud>\w/4JL+eQZF
k%>Bp: H9IZ=lG5Z94VaDp^46T*i%cJIY^tIXcb#PJ?+?ii8MuM5PZdBed8#V>Sndwu*^SZ%p@mwA%\JtQbyuw#
k!cjyd pMGW8!:Fe<dZGDdM1a+nl^5ZG8JulmD/@bRuA^h%tTdZT?4q+hiKB/pVN!%%GKH>y+@8AdWcQKRnc/!Z
:^cV*L EWVl*4=M8XXi86cwVe<hbQ8V#<:QLhaC9ddnW1\5XlVcLNV6qp@5DjRS@kHw99KtLM?AGlkpw88mSDmq
L<n>Vh ?cIX*?R%wwmulZGL$m9qMeQuqD8:Ll&PLeiNMp<:QY96jKWGV14M/Ht6$6#ea:i1@H9SHaMPdF^CqXua
?9ZaIu 6DI*Yem4k<C4$8jT#EhPNu\:4jm6*<R8SwQ*my#\YpT@WNeq1\d\9+jPh5b=XS8VcK?jpXjLmmiVR>C#
8W!BW% mq@>wYl1d*hRKeZjA/FmAKIl+nIBCPh:@uwNu*8e\*>tCw!&G:l^LAI5R#ntB?SI^yPcA>eRMp?*G<#y
<h=tGJ 8H\M8KW?iNal!*kQu>mejXcP#=FcTZP^:TBK1>q*Rl4lS%eG@N<$<EacJi9GJ=+I8/pZlH%aT@%ZWDdh
5QKYRy &H+1Se5L+!aec=ahT*I9yLt/wiKjTHNVuyk:KWHqNH+jS&6YKYL%Hl@y:$+ahljd%b#%e?Kcq^TFD1EV
DyM^QI D:ChQ=^%5qZ9Gc+<hhTqmm/%<i6uTWqlwBmBC>@d5%wZl8=8*&^jF*JStFt$<qJ#*ZNVB#GpI?X$Kye:
>qA>:d BY&AnWkaG5%QtkLidMq\D&Zh\#%eXILIh4>%Hh*:ZyAK%4^pPdVJkqY%m>@Q8&c6Yya8=Iab:6DR\:yN
%J&dki yJ#XMqI/N:IW&CR&R<DJ#d6jZdR9YwueKJ8uc>yt%a1*ew:JmC@P8PmV&V/Z^9TZk5Aud1%GDVbDy\%W
45JMAS \<ZA8nw&t/eqD&?%Y%$C<MhAPc4dw%Vy$p:a4XCVihTquhFu1\6R$wpeL:nlwAHFH?C%?8Z$+mm\ynY>
t/:=RG t6jbQG?9JBmlAul>tM1u1<pu^4D/uEZdEtBKqjPXd%8w$55FRh?nc:dmN1@6tl:6!LXalaG<\>&1IS!i
4YjLhp ytm^5y46u%ZH&Tmj%*?KEDP#T+=Z+QG!<V&%SF+#8a1i!C/j*RYSLlSb/RAu:8Km5QQICd$##GGl6i5c
TNQdhY WqhtWD@#5jX>q5#=yJkTmiRYl^%!*V&QJEHaPJ>><d1p=YFJjpEB&nHMq:?cFQ6HYe8bTWZ\>Ty^TIN4
d6kVuP :i&48LIpw/^=^m?A#X>C&4T#RVPt#NP=&J$$SPkmYK9t@t+J?B&N4t!^my:nN^9Q1PiuXV9#iCTDX#9%
y8baHa Dy%l:wRjY18=nt?CK>ZkpWayIkWR?9KNyT?i&AmWumkEP@Lme?PVLKyakkcN4*6LM^pRijNt6K^#!pit
PJPY^^ &=&DV%DhnJ/kCI@QBG?L>pWSy>Lp!=aIu:Xn6kMi#^JLe/?YNt>@4!%cLP!CE#LT&Dec*nYVFN$%>Y$4
?bLI=C 4cC=yl1\A^Q8maKE>j9::1/PCy/h:?$KTD#JlXqB@eb^bk@9Nq?Tp4pwX!9+TXpkHNnc6pQ=5KB@lYY1
$=9q?i VGFq86#=wCuiVGqn/+C4Vn@*l=dcGJna/!GHHB^QB=DhjcbiFmNNIZC<mt<8^d6+V:#<V=uaywZQ#tj<
/%yRy! E6^D*N+VDpd5*nQb1A1IQ4*WJM@KLSC@Y1m/LlEK9F%Qw%w#=MFtX1Rn%V#\cjGARRMn%6ue>PDk51b6
DN%WJY T+IQIPl#SQEBwpSZpwa#lRKtHqm=J8q^bEa5:qLhHn11C@\hpN5AS&AI+*!AR*:pC/uQ+:yTqtRNAAjC
@IGcy/ %/%&pqBSKEh1A64uJ&$^84j4K9%mDuD&Py9LT!kRcL?h?6MZywIX?ZEZwC5FSMKZAe1TXVe58MY9N+9=
YJj5yX /5iAYJbR=*</$WS/qm+Fl:N:%WdZ>TT1^<B9VE6DcaFbYEB*VDkj$&?$C8t\mcK1J@^dyYi%N\pjB#l>
Q8/@p$ J99BPQdt&6my*!bE^9q?I6p&d!Z?VhKYZQFNuAq=?ecl&ql5Q+W#jaR&6F@6wtut6Pyk>+#XKBkJZ6Zh
4+?P&h Za\SS>ZIAQRNke!Gk8W+ij?KRqPawAc?e4B8R5jCeyh$8^X\Ke^TYXeV<6>lmn9tX4C**^:@h6%%Dj66
VK$n=? !&hpjymaa6<#qydM>u1%>Ct!nZ$&Pp+MZNE%Zb?XWHqQ?ZEQ16ZwGEAm981?t1Z*F6pjdt5>>T%q1NqL
iGd:ct wTdFQAR/@<nTJ8lj!=M=WRkI&Dp9Y>@=A$wj#n!pGNGAB5=IJRq*wm^H^*+%?k9H^I+j^WN@LbEL>CV<
1?eTy= F>q^qZBwP*5PZ+6MQbj\D9bebq++?Yq&\G/th6nyj1wN6GVG6*awdy^lhP$TPmeQIV=a^yLF9S#IbaZ6
C<^Bdn !KA=@k%Z\@PdYYI1d\%ww$8\$8#bjdTw=Dd=HDFH6^Gqqn!tT&j#@lj%@=:=%AC@<#%jA=>@dyctZc$>
9>SqjQ JVkJ5#!^LT5#\+Z!w?91?Rq1&HDGL&!i$Nlc>/a/NlPDG1<!@1ZeiSSIikLcTSW!#SjBX^%5lt6F81wL
$Ap4Nw AR=LeNS4Chcd:k*&Q*X4M<=N?e#n^4DquXZ64ia*qB+/?\ZLJm/8a?QiBLbH:l^bn<l=L$S%w/1Dw=eZ
pQaAMN KIk=ciNTiHQdDTWia6qYI^PV5pe%#:hWT/bu6majq9EM4aIDdwi1KRV84#w*kt$9tNKeyGhjTLuDL5+=
SBRWLD aK#jG#@VX#>RjT6&Le6bY?h^mj:!Jnyt8dhP=Ya+4BDhNR^m#:Md\cSMRnYV^#yW>^:tnp+5mlwVdy=M
<cyaA6 #dn=in\QZc@dJZqllqMLumh4a\i%am4&TqmukJ%+J#b*BRLEJGe@4F?p9K/V?pujRBi5KJQ:5M>Q=L/G
S4%nQ5 qTybQdB9&aeQXh^VHLiBLZJ=H9I/JHy9HQlF:pal8L*5&^In$mB*8@!RmEPI^d*#d=T&9V>5WVCH6AcJ
*=w?$q <hJn6ZJ$1VRSFe5JA<J>!D!Ld/^\FZ1a8JlW5$\JuN!E>mip8KEm>nq>apb5XQFCM/uJF#&?lA&W*/h>
NR+kAd lny6An#bKyZE<RYR%E?IkWe:5qHTKAi&i?lQmQH1+t6DHc9dh!BDN#udy8m!DBGTBee@d/e1lmQPBnc$
WM#</: ^*XX+<ll6&6$hkP^MLkTTXQIWS6j5XHaRnPlH\qpRR6#>Y@Z45RZnEiHGRp6wE>X:wH$8nGaWR+BL^yj
=b!$<n \neAZYnW*b9?uAy>Whm&KaMwiCLk=WTn=?wJbk/8SEh@e*N:j$e*N>IFV6q@wd/PDltnaAalPWFiHPBa
bNY4/u QTqbwS/^jlt/&n6*^99ES+Rt8aacp#K6uM$>I/\!db&VE^Qm4VLX61>&m$\LY85kAWy\^eX:Shpqt?1t
t#cA9H lAed&KiFEl#<M:bHt@yE^KSaP1@DG^ttiPwc?Lq+l@mGPkapSpbHiSKVVZLmp%L@LJPJ+!qNeR\NqZ\a
tEVy*d P$@?$YH9m:VTAGb^Dt:TC!DeaVjWC?<d+?huF=Wmd?+S/&KXFB:mwtm&Ft@k/cY*#mFM*D$k%^?1IIF!
G#?9<= n#h&m@DJ55IulTSwPkRtpy!yJ%Da<P5w!CjjY4jIGGW>dkWJZjc#9K?nAYwiJ^ed:B*5FBd6Qp@F!FhQ
a=j#CB 1ni&K9lKW<4PZ%nJ$e8q:!$lF/pEFV<m>:&*qJ+P#\eN>%HX!H>X%><8$6DIRq$tPD#RIVVeX6ZL#n9P
X:n=yR *Mnc91>HH%\%YRL\qa!/jy/K9IYwn11CkbcSnldaKea<Ml^QTnXNDnHZ<#Rl^ma:^we/^SN!A#KmKdn9
8K4pBM 8m!<R^^TIl%*YeZE:LRYRbG6dj%DHKm*%^Bj9ud\aNEj:46HIKdjDuX1CY*@Dt^TBP^*i/6?8C1!uAhP
eAV^@e P*elZV+!R=8?1BSM^Hu*pQ?$wEw*<6heDmpPG^hdtEiAHh:HTM%e!eLDAim4RuK&MjMqPFwcb%MDZjQT
SH1E6D hV\CTi5Q8!>%SdG<6\hXDmWc+lQMEa$LmdRSRVuF=j1:^?kGGGatYB5p:wl%<W6#h6IpcpRdS^5b@6pp
dn6FCi $QF$p&y+ZPnZQqluh1CdlK8MXwRtR6MlKCXmna%h=D\lD^eHASiwaw!Pma!5K5LbIea<j5=5HkLR*FMQ
X\@uWH w&phaW*!NNL!<dY%J85FcP#e:BeR+alLhp*#$nT#V*jW!4cLEWGbBX5/t#q9n>HM<Il^%jN%w%BmauZ6
IbLNtR %X^V4BLnhmYFSdl:i?:\XI8l/F8tPVq1J6kF:%DGcc666$q^CkwM$6QXZ!&ACp=^%I\pl#uwYRccEiN5
H:+=T5 6BQ59b#WM/qq>SPZRD/LmEmjP!d<QLwJBhG4B45I8+8lJqk^!n9aTNJi&TlaumMtuy$DyGAhGB&DC<:K
YEmVF+ TndS5XE*Mwn#mdJNmqX#mnamYWduttYH^iTa:1RTR:*!/NkR4w<RF=edREd4*/SeZ=FHb\>Z8+@nKRJS
>QRVHb HBE>Wlb&kVAeDk4l+FBPKwKnyw%bd%y5Ll%hjYJiLAI<VqaPB9RDAiJl4\@SM5caYPmH+jS5AtPwBwE:
IJ8*Yq 6Y*EWD18md=c:qu&jpF1Phd8=DMwlAIPZy/Q9bSnqB8<Mld9dq:e@dZVQ^wSQ/AhGbcK:At/XF=CXFyW
XItFY9 ZEIT$l^%FBhC#4mCFlS%8wZKumSlL=#GDytiH/+u*V6?Ehm49Z%nL%<\G4lJy&bGG$P&e%^LSL/F=$^R
Seq@ZR CnK\$YZuX1KknJj!VZRK$&Q1G=hCLCpP=8bt=9>ZVK#MVW#NCGjuy/j@d=teuy%@YS^hHb%iHD$laXdq
PF$9FD yiYI!au%qDWWmjY%mKXq>ZYW>jIj%VVXqGZ#@><L<@Q#C>H%b4G/Vma<c/R#VpSBGpai61IP<1^k5J4y
>+6RD% ZqEi%1ja$R&qauqtyy^%p5$h1+b@j/WcuHu@n9<ddtFVEZqatC\WWX:bi<dlSbj/%m%C6qC!IhwuSq6E
e:&LL8 nDpmj$tF8pATb^YT!M!DBIM&pw6ydVyHJ+E9e9!lH/%TadcA>dQ#TbI!Zc16p%DLYD:9Hm+HL<yX9>ne
8AC*5= &TZF8WwPTGY^@#/IX:9STQdDSmiAWa*$>P/A%a\a**aAF&Tc<:X+cV%KHtyH44K$niKn8J@SEAjLha?@
t&eMq^ RhSA&l#a8H9/MQl?H>ZB#1N:y^dE!uS6<cQZeJ1ZAtq/J+Jthd&u4>\5kJTj<w\Tbb%5iHdaVw&4Ehh&
-A:=P/ 000bc9380f0001202b4 Page 348 of binaries2.zip
i&cP=e \1&&PcY<+cYb+ZmVe>\Xub@\ua!4C<L!dD#HK6@c<LdYwD9N/+1mcGaVhRyS%tuk8n%khTELhD1+aD^b
p/TA8a mLwhtew%8Sd\YTT*YH@8i^nL$*KRjdhQde</?/\Md8@hm%1a@X4mt@Lhi=Ra%4nhSacRVCpZ9\JR$4&i
WY=VCu bdI#LDmB?NAEZ=Y+LTLR&iFqA*b^&:DGwhK&?mLudt??$SI>L^GEj^/iJVDG>6HuwJldmp=M=aHbN9=1
YB*<&$ %mBa$!@:&X/mBaNa/+&Iu=$+XQ%eldj$YCkqj:B=i?9>&muWk@@PFnI<#G#SmKuK8EdITHXPj%hm<ZdT
I^hCLP JDXS:VKb?G:^C1ja5Mj$EFX\?mu1L^N?BdwXVAmTh%JbHDq@uGXyF1C=6aX=8?6b#b=\n5mW>WRYN$:j
E!a!JY PRJ9nechQucjpcV9Q8JcdP&\cTD@qGjSTi<C:!HX<Tk5Y/#$jXJSyt#6BLhd:y!%d8S@1>%&!5Z5Deb6
SKdh@! Nu/b\+t1&uFZM*%@nhRljn:@a*S/u\#@8X%#aESp:Q+=:^CV>#FuhQINn$5Dla%L<QI>K5w9P#5!MZV\
Pi$Ib1 /lYJ?^R&H***!*P16k*n\=mE>Ii%Tw$TtcAZ@a^X*cB?pphJ<&*=YN6KK?GN9m8$a4wK\Z/1A=5/VkiA
EYp5W^ aPANNS55hYQVkGCt>ZV6HRdbBLXGnH:>ykyQNMHEB\ZI8DHneua&iIECTT&FEMBwCWY?6IcJ1DDV=V>y
DHR1cu S%jXqnZbp*ci!8jM\y<I^XJK*K#&yNbcDIltu54ww?PG&WCh5u6Fklp*iVX5VC&\!FcVDbHK*+pA@R!J
a6+dii jRa?1P4hmT!yCG*CHuQ^D$&/q$DtJp\9uuFWRIE%njLmGY%n6%d9^Lyi\tp^PmXiE!TR4cP=C6<$Seq>
SDAFFR Xu/Kdd8?E>8l%GYP4?4ju%cMZ?5^*Y$Ww4N9<>WRM9:TXhL*>j+J=ID@ddWAb&E>mTWcEaC^::X4RP91
+WELIB %cLB@C\CA*^+*:KK$bnP8LK+#=\elTJqtp>iMlQ@q*X^L:/M8a&$%JASpIW/eP=qjtV6#Mq&%I6SDPB=
i@N!4l J16@C%lYa\D$at#?Fj&TPQFya@S1w>+t\16:y1na1cScAWHImTL8G1:^pl5?d#9CT*SNYHL$<itMc16t
AdNC9l X\6*J?>X5&@b^p9?X9*y6K6n$*X$6$^cW8?96C:cJ*DT<1Hb9ZNGh<meTH<=SqV91?P?uRHDp&AnHe!w
lKP=Jd *aX+jXP>cu&G=mN=:?c=65K?RLA15/ki#%bnAC&LhT<%Cw%%TSu%+eFPY/%4:V8iDRbScA#CC&Tn?5pQ
PyhhMT QZjW%?+Gk>5AWjcLW:DRFkXcciNVc:Ac9+Qcell64+XIRZyP+ElHM+L1cB#nc+*>XMV>bTmIWb4p#@4w
4V*^<e pBQXZkTym$#qjWT\\!6XSXtYKupW1VSt!**D++yhj%nH%&$C1&pDl5#c@d*^W:FAWJ1jRN55Nu%%H@hb
4bn@IG bXen<#wySh!%@e:q4^SJ!*6j8kA#NSAuLniDyH=5t+6$4L6:KCKE?Nj>=q*=/hN!:eZtC9jSP\iFXJ6A
RHuBKP #!W=K!RXy&i:QpiV=k9<Za8E*4tDIahZBL&bp6N+SuDPS5d:8#B%h89#@t$P/^ew>1n@t!EkXZAi^YH5
bAYeFS p6NqRVP$Mh+RYd&/iiCM/IF46\!M+tS%4SiWP*D+w4%16uhQ8=w??N=:GaHEt\I^dFeF*#B^ASYMPX/E
$DY/%q lwMc!RG1CuG#yN6^GS68a&+uJq8#G*hPqVMwA#4X<P!1Te*K$W$KeZtpmRDbjG?I+/%hd5Y<iS%c\C8d
ENR=wu PTbAqaYB$:!p9d^h5licplyj6!j$*PLS5H&^%w8uhKSHyYWRB5ZwuwpH9RS6551X^8uMS=b?YdN&EQ9W
@QHV5b J<l1wZYN#Z&^^1mwi!TBM&IYc\ZNcGHVc$CRV@NpPXeK\#S=miq5qSF%Y4eG*uN/4H9p*u6Kn5Z&\G6n
8jyeT4 m<tZ>!!D6Vcpdjy&GYt\j@@6<kK5/>bFGHDjj9jd\uGNwti5S?bG8QPy+H:S58#&qXKFRhZ>1MiubCu6
/nGV>y <@YpYMaW>9Dkt/J=Y$i@t#cYQ/FXMj5WP46^iVuJ$?jcBY%*bZ//jbDP>JmJ#hMM=i+X4/uL^l4:lXaR
6%W?<6 ?u4qR=!XQ!RCn^k$<5a!Zym4:*64%*jPkbalCp<&b9EJlQVD5F%+8?6?XjK^+@N+J\d@TKDHq4F5uHM*
KHuqil /IHnh%+*E6e8PLQMKVh!Rb1a=AQGb!kEhc:naHHu%jR4X>GM^uhhQdmapTK=e1@<@M:d>p@!VSj:?Mi6
RSV#i1 wC6#*DhmyuFHn1*@IK1::*DZ6%#NtLuP*8>YD\%<\/q4ZeIw@My9pN8n%@kdK>1q^8d%<*d9=jQ#G/Qq
tYW\#^ VV+1kT@*R\DZ!!jlFpt+D?<mM6M4Q6PGBFN1R/&J\P*EMjnA/V$4&8%!b=ceBucTFCl64m$#ndd+*>Tn
%hA:@< 4YSQAI&QCMe5GyndB1LHX6kcA\XipMEpDP1t=6GR+8AiiV58V?\hS6l1%IGPhh@>9X+9+JtAAY\+1!&C
&M&ECm \&cj>Ym/KR@T>ScB<Y6Y:ZQu<Fj4LZ?IbqKp\Z=#HP<B9Db+GH\nRTS!nQqi9Vy1SmMW:=Xy1K=bd?Yb
m851@+ &1Ll>C=VMT6L!9j$qMF^D8!#1FJ<*X8aJGH5a%C199tI9q6eT#w<%>/VlmIGBp16u#ah$m=kFlmm&+1X
NZy>h/ dTuLT//B!+*cwa>ana?1>m@\ccQ/ZLX4$F<d<y/l#8I\T!?m%>HeqZPW1Gn9K$QBX^5q$FN1BR:CEWC9
CmWXt@ A:#B#1H>a8y9#w6!<=mkk6W:R@6WP8b6&X=8GW:<naR5J#kIhnP%=8p:jcpw$?XyYp5KLS9d#?BiGetp
t5tN$Q jYYMV!Iny8qYX?hE8nW^D$!*e>kXHI\N!BK5LY^YHKWtC$%R$N=$*:&K@b/6c>>%5LE%$V1Vqd4XYbN+
ykj6<1 =^jc@N+ZcWm>N#Yc*@GFLtj?\\TmT?G6eRcAHFF+%4JG9d^pKk+BRI=EiWFY!uL$K%h=CXNbN!=8uc\F
X1cT&# Dlun6NAF9SXhtu\l@1@wPZS4uS6p9Jp^46pyXa8KkGmP6>N?Q+kSXGP=<Q/:hic1n\@1wS8TnwDC9=&q
!W5%k\ J=KB\16VMC*u8@Yk!<4?G!mm!&VDK>AI%%CXqw>6^!#GuiCkYquK<TSIPeAZlR\:4HEJNj:de%eLmA8n
1+8:%y \tKT%G1QSc\tmLLQ?=I:4yt@J&S$cHX6JFF<mb>+ewwZnT=6@!A1dy+!#T%^dAVYjet1?mkKc<CccFpV
FX1Pqp a%ZVAdh9<a:u#Z=qJ^q$/Rdh5T@cYHAZm=ki!&MFY4M&+G9p8N^#@mV6DSa<@*dRp?d=*LRD6Ku<mt$Q
!W&e1= @al#nH/*FZdLc:&Y5h8RE>clX:WqidXLJVZG^A:Iy1?CXcYGqEuq^1lA\idwa\:J1eqcN@%ycp:RRJJ1
6m+KH< 4KHqZ?Sd=!<u8D=AQcJqma5JT%>5c4qh&p>451at@W8ZZ<6C1ju:!@$m?d\b:Zj*wcZZ8KTtyY>NN9?%
>5j:?H #<1Rk@H%NA1<^mZ%=5HdTk#%b&\N#@Jnk%6JVh%Ne$XS>1y&+=Aw/<B/K<YkydNuWYPb:TXe>hI*4^h6
9X@hmY $@441nb$h!>paIm$V?e^H8IKwhN=kk>61/?=HQN1<#bwyWI<+66b6qGA^<^G:A:l\nJ$nwaV#=J#<$b*
/>Z@y# ^bW1BunX4n#JwPLtTBYq1tjJ@CjLKu>H6T>F%?CaJ5wDI&Q8X^D1n8D*hTPDbc@NwV:6+mCQKEPB=1w<
JRPXGX iX^$4\I/FQRRANZBh*k?Z:^bDPb/E?^/+:TJXSQ:m>WL/>ZJWY%y\$/TnWwH:ei4yDR+lAPlS@G<EFh4
k&q$QZ cPKCm56\4MNB+1I=T&GSA+qYQ955MTlN>TZd:SXC?@CQn9i?XLRW>=AnHQcIp=:a4Vq=VWM#&+A1KtBp
8iNi!l V+QDEnXiTphubKjJ1TdPR81b@SyPY&M4\n!*LH@hP?LkJ:R*K#bji5&QFL1Z@FeBKQ9?tm?NM4RtAS8h
JZ4j$J @9ThC@i?qaFMwlHNN$w9KMT+e&Sii#a=pZ+lDNV4K#@9VeyauMY4LmP8B\yFwQeq@bAy=H!4@>>Gp%5A
mGIcFR iN>>qX:9<aDDbqI9PlN:bl:SNke8B%@mG5Xc>c@@nE?QV+N6ie<YF5#XMu!Wt6>n?@d4&<w&Ga\b5e6P
t>#w8B $y1p&cLBtH+9hWPNB@%G\u%I6jALi4iEHkdp@n<jHSVkWDle#$>K5+W%Bu#!ZyFyqNDlnEPH$<!iVN#^
j&EyLP :ZY\/Q6?hau9CH+TNa8*A89ikET/S8Ajd1?yhQIw6kRZ!WYMVkdDSTHN5JlLHcQJPMAlR!SMyNVYNF\u
S=hN:8 d8Dc>^wDTSmJ/=mh==6R<=tJ/\8!n<TZ6RB:$Z$TP?B%c5THKb%kdh9&$uMPiQLGEi1:A\\MeN&::jjl
ZM\kXc ?SG6DS*yB848w54?=mT+@nj@1+k?ZJj\KDb4RL*$YL>cFblb$F!PBPPl1in9pJP:%ymiX$1/!>cwH5#>
lKeqb* ik@:CqpG@c$S<W+WJ^<e@\MZknB&6:n8!1u$DD?jeQJC@5Am&d@w5YGa%X>Q+#>bJPTB4IF>iDXWSDcu
R>X*A1 >/+FDJ@bl6#And^%N?!*EdNu4C/hTpp?jVX#eHpM=\>qt=j*W:J*EXu6p&p>lX1n/Yk5YG8!+GacH4eq
ki/9?H IbDSh1e6SyFClFGh/jeh#QhDR^8tTS#9Sc=>F%/p=8hZlhN<4jDD@yWeTMSZkQLH6y4WS!QXVNLX:A6E
?EEJel dY+:ZC$m%?eH9caS*4ld8WGi?b^/FEYX=<juT?*e:4:W9dKJ@$lqDT&9n1+6*tm@6TTZDj^wH<5h&QqB
L88@ZB +9/jmi!<Ru&V?chm%Gh9h9qVtX*RZ#XjI<bd4EFD*u9N\KFZCF#N!?T^65Ryb^w\FKMlp#QcwM+meT%@
+GwN%e u%jSH:c1&^N:Wy1mDjTNV<m9#6Tup*&X*kQuaIAFtDQc@p&DYhhDwt111/wG45bQmQdu$J4?8^RFuSQw
DP4pM\ EKaAN/I$DNaFJ6hjPIWXyyHm!N8l*^Wk%NikdwRcPpya1P+F18$%P#QYh1jZ8ccJ?C$@c>p#^%@NkK@Q
/p6Cnc C>Kc<?5c+A9yuRLGPJSj$:wq5R!@?VBMK1Ll:m:XSCWY5P@J%TlFu5qyd/JeS@qc+^HF8XTJ/CWywj<n
E+dYep A1TlkVK\5LDCtbma+<%M#e^MVM#MVM!M#V^JlQPnJ/mnJ$\eLE#5a*@JmPkjeihqekw1Tky<^Jq>VSm8
4+Dp4H !h6A%/FN5<BmlB^eeu$np@P?aLbZmk*AB4di$el<j$En^Lny>XP/*TyThiw/p*b=yWHu?8RXC4P+uPR6
yEPY4N p5waHb+#FWyd5MTjD>GZWTHiAPT!cBuZ9l&/>!@RuB:k6B?LI/P:L4!w%yR\=\eB!tq#%%WQXD+FAc&h
y:D&C+ 4@Y?XMnA\k%\<dNw55=EM/K&SHmcP$k/$XY4GhT#k*NR\1=ZTMPC^44IHVl=YpWw4y^Lk4I8d/aeHDJX
eApmiN J=uMP\N^cB\PpV=$45!NKVq!BH#I>*XG5kyyNdPGakGtk$a5p+ZJ=t6tQVN/DB4hY\G%%i44p4+epieu
WWwQ*4 &Bb8VL6%pWYhQhTu9eyDjLA@?nV!Z!X8LYq5n<b/K*mh:49M$b86c+$%i5dH^q=XA@e@ueKBJa?JEPen
unbhjq QamM>w</jF9X9&M\TJ*5eVlSX!Q!=mdj!e?JADL^wpHEVF>9p4\he8c5uYi?Xbi#&eS@C*N5S>9%4T*n
9#@^M+ *#HK:RMCwnQk#:b1qqe4b4%**6YVeja6j/H:&jh<cS>+$4Xn+cY<@Q:PTptd1%&p#QpWFFDQ91>yS8P5
9J9P5X d=cn=bp9ZYiyqWQclS9Z@81*nkd@SHPJ5D#PmWZ1?mqueip<:<J*e\u8#jTTDM\Y5a!JZZHNnY:%=tT6
-AuMDb 00040b837fe001202b4 Page 349 of binaries2.zip
%1lmct KH\A<Cb+^9#P9l1K:c6*N1uJ1*A&Wpk>hu%%#+I>d951cdpY6X5/uhd\FnyJ5y!#p//TR!>/AW?aw8I^
W\%/wY bI>Z6*5HHZGwGdZIj11^RP*nkbT?hS!^>YYVe\QVZ*SnyC\Tp+$EP&M1ZM9b5Wt@b9#uap8y99iDDpmh
<ZQIym lCQVcm<tu4>4K&%uhKlTt>!@pYIiPTeS=d\5i&FuPa6\p$14:I?@#bQcIYypFSjqkaBHW!?K+GaFi>&N
<I18^Z 6??qmyt=VEkp*a:t&D//JFG?Py/VI<1u5X?!>@nNb1m8yCHZuRNn>S+&JpZ+*nA+KWbm6lw?%S<ipnGL
MjicZB +IDpq1ABd@4AWVq8Q6HKn6#9FiTe9DH^FV%u5l#bBk*8F#M&aNlb\#+PR/TKBj8B@&:j\ejTE^4LXKG:
nu1P^: cTS>I>>#9ZGYHp:Bbh<ICFPMHqVe=8XK+XNu$/HZ^j*VWX$^$R$!I\cMZLcwRNQJB6L<n<V8qJ=FYunX
!5d=y! nDl<p&u1$d4Kw$u9/N@L#y$BZB4J?VNyYDYpuABXHRK^^RS9!!IX?k5/#1uYQp@eA8Ip!&up/\?QyJ=V
dJIaAT h>%8&F^/V>KDH14*w!LPVZ84XKpeW1@aEF+tGPj%QC$V^:??CRDdpC@^G+hneQ/lTkHnH1<Qe\e:K?Tp
Y:IFG= !b6:Qb^5h#iMZ>p>TmZdw:ydJVEtQR6\G?&t^RD9JBcwHwTb+=M!ASRiLb+hZ&q4c*Wi/$<NcqqEwV59
#yJX?I H$<iLn1+au1cRB/EbT!V!m5<QJ1T#:\<MRNZ<L9JK\L5:w9hm8eE$uP!yb/J9iHmapVFtubR5#naIP9e
\NaPke y4:k^B9&dp=SbT%TmuBS<S1Np?86>R&FDX/iyRwFZ>=eth^weiycQCcX5J?VL$H<8eSb#=hFFdI=h?pX
6%J*u$ Py1Z%1<:St4EFW/A8?4wc$#p@ZecNt#$XBkH6bc6BDmq19JYaPwQ8ikwceBQC8=RKiR!NudbXN6hWY*e
:F#aK6 H#M1u6pEC1?KaIiHBLKMwWciL?9L=\J=VVYE\1qS8ebCkJCY#?+qJhjPCAYEYZiF>Y*Juqn?1M%1k9PR
M=<C^6 %C?JL$P/T:e^:GDP?p@Zt:N8i9y9%6&@N\N!9C+B5\18WL:PGKY=d<$k<VXPlnZD\=iX4thwK?*ZVLM\
V8FI?Z J#YH*dRZS:Sd4P+FlCn+bpD?BXwcT!h$^>#Zni%WZCCYY5p/bKej@iX\>C6@AXdWq1cWn/PCj\MAm5u8
XI<N*A R$9DIl^>@&j@a6l+T8h:VMP4I&h1+M8bbC<k5Q&G^n>Ah@V%kMtkcqum8QD=NTqEX<CQ?5*>a/+?BP<C
9h#T^T <TIq%8JB8y/MI/wi@LAII:qN>&^Qq<mCV?QS9h?>9WqP<a9M:59KBTL8M#%DWGVj$Yjq&@lhM4&eb^pi
AJM/J5 S@tHdKDb@qJK5M8Sp8=lmhIY6jIFCR9R\M&KqYPj/HNb4*hXN%:H%h**EZb$@9#$qHLWHQIFDhtR*FSh
njC9V# $d51NXh$YhJ18Lk/hcc&nhjXdhDh=*%BdN4l^Q8G\kmch+4@nYX\$:h>9d!d+89c*Y:5!:l668e=ybE!
/+?<ER ic>C$9%cNK+<i/P<8QK/Zb9WcX>H1b:A=@Zn?Xn!ZP6ueXdLkM+l=u#5$B4hkw8*cJe\>1\WtGdGyYR>
$5#45* WdkXXRA1*w@Ny<LK@@a:F5u&y\=+wLe#%8qP1IL/94Ptc<M^1ZuP4*yZ9FNwe@TM>ZnLTZ<61IH#4it&
LP*YYp S>XH!LC+^&hq:=9#W/1/Bjyy^?8V^A^m&i1npw%4y$N&5IuFV/Q1Ck^&NhFphPSTe*!$L9@qN9W^K%NN
F&F<+J 4K/q/:YypX4/P>@?qS^^#+A4uJXEkk@lbI8>Rl$1L<?wSS=:!hHBC^GM/?jE&Y>?F$4@ad8/&Mj?h!p&
l:CLBB B\&e8ul!nnCKiYp&!cw#Zy%P/8Xnd8Rj+ZFXSinqi64ty<T?AJEQh5LK=#!iu>TipKEuTWXuSbQu%hT>
jEeH5k J8jI<$ZK\yyNG^6M5tGEI5nnjKH&ECmD\q198h>%Fh=RiKjXuPI^cS5#Re6CB5jS:4i&G$t8\k6u#&<a
aLPE<: !e4PSmmH+wSa*<Mm:>1H@NtWd4HnJSjY!1=6ET#p<+*1NT>t9Nl9k!:Zt<^N/YabN*d5X%N9%dRHH^4p
YwQFuM L%u15^kl@>*Wcy+H?Y6m6^IkVGt8Ytcl=%hpwk/?4cW!>9w:t+dnd+<bVDWVj!<*w=8j%/HdTy@8p%^a
AwJHD6 $T?>=p4+d<PDRb6:puZ9K*eaQA#qX8ZRi*8YuSpa$44XLaq/1ml$CZGVYte9R>kCA@ZVahn=6W15WGEL
1CqWkG JQd#\ql/jE9:=66*bw/VLkcLq@?=&tK>%=&+M?5I?=k9cH&46&q1@yDhRL^DE!D/w=H?t<k$*/L%+TH6
4<TnVu K+t\P+@p!Rt$WNEZ8^1:*MhI@X5W^Dd<?yAGTN^5ZNN!@%DknFi!cF4Zw%5:RN$5aby98LkkXElGLE*9
mtDZ$Z 8b&GT\aVX?iI8dq5J=K4Fb@*FRihliBG&X%LN!\c<WcnEQ!HLLqBjh<cb?/HEcXn%a&yR\Z*QSn:A15h
wZCd?n 6KWYh$XWCSiS<&ey+kwEVYH&t/49u9Xuw=qKWT$/uVWWAn!4=EjLRLADbiQpkH>RR8Wc1&P9A#8E6\ba
S!jVb$ bTDYtXe&tiyp\@&+jVlLK:CS6QFTF?VNB/5@A>4lm@X4uQhMRIc>t+W&!CdQw!PS/RuP/V&W/>p5Z%A1
/Z\eBI 5t6=@k/$$@Rw%&TRbA1QHA8:@lW:Fd@mh\$#:/LC>Iwj1PVIhlYt$qKa5q1bAdu#P:QYXuJL+>WSKdE!
ei5l4L lj*h4%X9/F?haBhbSY^cb*HK9d*pG@ia/<4<NE&jhjI=1S5DC/Vw+BhRAR#wePL1M?9546tAjn\/8b@^
pZYCq% Mb:w?ht5=QQ8?L!W4bkp5h#<w+1PwFS&YwQ4+D?#:A9<w\Ya&=/+A4E5#W@SKB:#YP<&kN*PECji:pDW
cpF!Am :qRl^<&ky=B6<!&cbhmF<?5h%y1RVbmcLR%c$iJXS>Z>h:!8yXcSt<Lq++y=eFM%h+t!Hiy1&LbX\jHS
tIYbyN e9<me5N:ndinG&bclKDE9c5DXF/Tb^EQ?I%d<m6%?p9?Y8$:C:plp!qH@iNQ^ah/&Hhdl98TFa/!TC5I
u+c>t? 6cDEX<bD4BWBNcWe:/Ke/X4b^<4dnX1hqmPNy\Y$Mjcc%:lqiSLGWWQe6lN4n+Zky+YTja6kBdcTYe5P
wn?DLE H465T6!Py1^a%Lpt^*9Ci$NN%QhGbuXNe*u\^:t\E16&<bncE>&#h8$?A\S#m9Kc%=#DcFhli/M=!qe:
d9BHeH $cHM:K$^XJ^NT$T6>C&^=Ze4jTjZ6ASM4/n5ZPDJQ+m4kaB>1EJL$h9@lKpm@Vy+S&lLWclwtPp!*mZu
I4$=5Q GXQ@eBZ4:Qd//mZ\&IanD6A=@:*8L=GInnNy<SPhePa9$!Q<<:NHWWSCW9<ehH%t51aSt/\MTW%?FJW#
@H&Lhc *S#n8+L9A#wTy>JRHkH*MpXA=l^Cq>1N>d9y5qWGpyGZcDu4Rk!w\!<l&$DF^X+AY6#AbWj>+R:6i1Ra
!/EDaS >&:t+FkCLT4Q/bZ:6Z=QVJ^qp8Ycu/1AXBd!BE#iwQ/e*wHITSYM?t^aHIZQZMwceTl5R!CiCWk4eSA>
*!*5GA cWLG*Fu\%j^F9!aDlB*l\KbI%PwcIl*ht#P<Bl^*QK#SG\Z!!K>5iRjFnJX/p8^QFI!wL+%/GdTPY4yT
A5!4jl LlFhlH!<6TYW/uNT$b%MEee4lRCW>>!XCe=LPY66:QX</XB*M%$=R6CQepFR1HpWX+\SJ6N1L#A>FNuL
>YB!qW a:TqEX&#>JCBV:LQbF$qG<@&=^*l$w19tWZL@q1EdmF!w4dRXLMEhji+kY5//aTeX?j1lh<kj9e8%bEY
EGPHJk d6&Za>AW$JdE?hu/e:TdX>wkS$yn<\$bGYh=FD@HI5JLY/M:hZm@aRhIRKhj#$Hq\1VX&MX#baiRi*9W
lb1IS& tWuiD6G>ZHwkalq#1GaywuuK>@$:mT^uTJ^QNBmh&C4*N@KSKtw!#tZ&LRJmH:AL#n4K*@:8/9Qcm?cj
^!PSy! FJu4NQqb\@%:#QG8@dGHhjb+p6dWqFb?#ym4eCHV#%*qaeB5Luj%R$i?k@*P*DFwAqmm5hZdQeb+#4+F
pp\H+t yyd*y6:EdZ#L5@6u%nw?WpqlN*ayXARJDQk8$q198T/V/X?*PPnnb9+V=Z5M?D8S<Gqp&Q@TbICG=>K&
A8E1SH tJKpZ5LLnJ4=/=t+yGajp=1LHCHKli%Ttt!p5<1L$F<6*YN4LyS*c=Y*^TDRej@>X^N1Gqj8M1qt&8Jc
/4Bt9R 9u@qp$^%LVQ8$b$:G86m1Z+PS9Gq/&t^AhL9yZ/N%!qRF+IMF@MtKVGN&CEmZ&/#%n84yqPYK!ed?q+D
X%K/wd 5/V\JL:Ga9San<WcBy=@jDlH@pI<cR##Mk^Xe&%VMA*LaajLhRP9DBpl!m@5nXTJE:>8+5B@4Pi<18L8
?&X+:P T4npWat6\jQSaAF\#>5C^H\m1IRGP!?y8S%16\eJj+DZ%\ua+QL/&>kZ>y9u&XXGI#Q5w#P8XNtQ:Q4?
8dkGRy qhL6C:8wcue/NhN=Kd:+cdqBd9P4pYHFWVX=EiVuWc9etbi@LyE*^h>Z/I8mQ6\Tb>yup:VP^6KRhNG6
!4l&<9 %uiH#nJAn$L\<cW<1Ne!Hq+tjAa=$=\w*wl#6QCPWI#>9dpN\9HQ:i>>YcQ=^6*%JbM^:SbidY9pNK?^
mat<FR #Cy:NujM#XNZNWDjF@=lCF5j&hAw5D:C!84a<W&8/Wq@Vl?eT%eCEtDP+D5l&%/:qlVe$=KQYpjkkN?$
NY#u>e m5W&A%&b@LWm\*L*&\/nBGhqpW^q+wtDak/pF/NX@1Pllq4*ywcKyMFaabQD<d9iE#AajLj&:dj!qZj1
/=4DH: 4ujFI@udBl$FhYYbF5L!:\R<Xwk$1Wmlmic:Wj:teiVjJMD\5>hC\qH+ZW%Hie#:S$&W5hh9NkWc5q>Y
T8la&5 PS&Ya:W%PWcGn4Bba\=P+P=?YI&4MZC/hi?+DXm<^+!TeH*4%GkV5:NDQLIb/=u<JcX@Blj=#iSJS$B>
4*B<49 NJDnpN:P^mVi*lu%*e14WZMFRLWwp^Jb*@LWA#jHE8l^/dJV=l@@T%Xncyd!wmbZtq@CeNXW>:CW6@i<
>edD%J Y$jW/9wDd?qM^<!n*#P$/\5CcmI&a:ZFkH4<Dnj=\bFWPNe:1^e$hEBph@?8L8^WylbQ:CEy>b*=<$Vd
$ItRSK kRkj\VNc&yeqqc>&/u44J8dE6ZMe%J=pV4WVALk*@!?y%$PVbFHd1M5Qd6h?>dC8K4b?d<Glt8cbp1bq
$1QN&n =1Z@8PAn+4G56:LXeE+@V5Lh^NZ#<<yb1I?h8H99X9lth>jNZK>6$dWMN6MqaMLWlp<Neb9Q#Q=hjeDD
w1b5\I :?*eNLW1M%VqnFS4*cK/QmIhPQn86mHD>Jb#9m6+?d:4bd8E*m!PM@:cllt%^qM$pF91K!NctXC@hG^d
cGKaFa c4pWP&><&QFdBndK/>:A9B$6AyZ8iEll4SE%*ncRGdJc>9EHHCT=EE^V=<>F\FZw>yA1?DBMBYQG5uW9
*CL$id L5=Lb!pyKWtRF64A$5AKb$I$NdE\5:A\NDY%IJyGbh4H^mdqJtYpS/Wcbi@L!DanYqyaEEyu$@=>?YB$
?GT*Zu !9ah/WjM&IGTA9TAuc%E!6Xi1</=P:u%TPGdF>q!BkWS$#NSKkBS1LLBdKhtc5\u#Pp5FbAWe$&k1%1<
8\mll4 <\m=c9VeTYye1K:Wjb$*IX!!t+:^9ia+d\i>lp@hF\HVF9EHqbFTJ4+WXKE:n^:y=k!\IB#Y1uace/9#
1B6Q*= *I$JJ499%tiDy=%WX+PVXLtJ\pNj4nV!cwe1paJTe9c<J&aRPcC/T*lNinH\u8HYbm%u>9uQ*BFeJH1^
RL^6ZT :b=kJE9T/tC$9Hj<:4HklQ?t1+q%:1E1^4VM=kRh1q%8#p<NYkWGTM6C=+qSeed%\PS<djcQMGFG9+n1

-Ai!k< 0004b6f439b001202b4 Page 350 of binaries2.zip
nlFSF= *Hc^ESGB=c?=/Jb1djiI!%BI?qA<WJekct$/#CYGi8y8S=QechMhX6QVhkVW*:5QPZy@p6p4jW/AuCu/
8y:JV9 wLDe?uEZ<4Y<H%ci1c8:H>p@8Llh!Y/59heIj4?@>bVJm6i%?q\j\N\5?P4\^lZ5aqZZted>C*9Wt>*N
yIpIJ8 MXk#n8>We>4nb>#:ab9CGQYKBa#bFdch+=^SjqPBP^&J8\56#ca>Mm<>*#%j*$/Ni>+1Kq>\5HyAQHP*
N85$Ct l$Xj6F%nCn$<EuT*HHnC96&@RPXllAE!d/Th$hQm4F*N9l<8YLD!SyjweTdXclF=+N$5S?>yG6jGXu:h
IhueNK 88+/p/C==q#VIGM856/*VD\4+5S9>CN:TJTXpw<PM?c4DIJ\>lZiNC9:*q!PP#?i%nLS$%*CnWVQ>uL!
GtH>V4 S<&1qK!eN+n:*m6EqB<P=1K9#!Y44XV1P$++S#aXhj8LJy9MupcPH<+&uCC5SBt^LJ5^cd$TS!nHZ?5%
@lkT>P 9Ca\lXVW<y:D*F@FVpp9qeT=Tu/\9y<iW^?khM1\KMGeup\n9J\Pu1\>RGye:=h?#n+$:y>Qc4t1Ku/X
ib#la1 j%JSpnlj<T!ICm#8\\a9J@yS4&=u?qN$D&Ye^J!JDw5SeZHSl4#ZBE=@FJwiI^ktnX@59X55+K?Y8?:A
#d+I># #uDZcmnY^^V/I#!%^I@:L+i\RuS=cCd&HC>NCi+:<w/tKS!L+4bIXp:bcA>@QZ8c99%DY5&k@=4*+8Z9
p**=EA MXT5\kmKDp/Zp8<^?IIEVKY*8&!b1>elLiiwKd&98!^A*:\wdkT/@E\H5@DYabVXN4ZE^MMuBwBJq=X@
tb*aG< jHFD\9j&1nlcjcYRQi!IRjnNV\WCQ?4pM5:?C+:D5/b<uhjnPGCAN%N/jWti8B%$4BLiW16R/^IHNmX/
ta@<TS D8yZ?:wZm1^Kp=?cHH?R6dF:<Cm!*&j8R<pI&$G*@TV4EKhWIpP4P5a$!aQZFL=\:1q%Hp>YyZVK:GuI
:=9*mt EhYIEdF>BTapuBH4h?P<6KJTm?yNKP+!#aWjXPBIm=J?dly$Cdun<Yw5T4nccVh+6%\Zn/KkZX8*5@dp
@kh&@> kTJZIp^nW16II&cZ4h?^&R4Lebq6iKeJ:PTmEdIFahAq\/Np#yuXj\iaQTnjAHj*Zhld+?PYNV&<mFbI
hjBMnM MyPKLu/JQa?u#9l1RYmh%I\VplaiDj?4QY\ec8k/h!JIJ&m9jityNKVDilNBBdhNG+^lTQ5S5Fte=y*V
SG&*5V GLn^wK5++BV\8=WPh5*m%%T5AP*me<GP*yZ<ZSF>nK&BKjDyn+w$PAEKFJX<AC?!pVc5//I1&JTji8wu
Rd*aAF K6^4MNJEDG%@CJZ:uNbX8cnM$tXI$^8P9yJnBI^^QSnhuJ5W+@@\JCpuM5b@mcdj9FZqWHK5$XSl#i1L
ap:FIm ESy%<t$?^ey%qtRENBDCT4*+Ip+FCtXRLMtJbuWV:^**YKWFZ>\=e<=XTX4m@n6M:<CXLY+$K<pDPP#^
T*Z:>? 4/Z9$JSkGLY6By<HZiy!Yan%Xyh&1>A$/5Zw!8m&c\TY4F4+jHw9Y$<&8b=Y9Eh@lati4d8G*8Dp6bVl
@:m>Z& HaRhjdd$K@XeMhZ=wV+>Iak6>jn+/J1P=QKJ5C^C&!<<LEjJ@*L!p6G&/+WaHIyt:5Ic=Kid*eDEE5Ya
YmyG^^ NbSm@t#lyGD!5Mw>:jputKC=DTty*WeXuVARa=H<I?Zet&HCEL5ESmM:/E%LLuHlitiiC%e5Y1pRWBt4
JBZk!1 9<wllh5^yR1%*iAL5:bYjXELSwt$dS#6LSMRqc6F49pn1E8q<%^<!BYMZebyaBq%JF^>l+1PR4Y@elNq
C\wF6? YZ^5ZV8:T1yGC19ACN?VBwDX%E4F?#=+Z+h?l:9/w9yF*d:CDTKlQQYVi4J8T*pkQd#cA$*:<::+YeYk
Fq96La Li/+i^n5jhMyW#jQB1cZ#1Hm!ch*FFZD?6&&M*@%:Gm@MZt%Bhh&#K&RYQiDPN^l<k?&M#$@j?t==jjL
>S+HP% <nddFpmQ%t^!/Qdp\4NNHNLwCiJFKbZe@*:9:mD&w8YV8HHTkMDSYQtEhWHW??K#yt8QQCk8>?Tu#&d#
kwj<Lp HceCd?dM&Baii4a+4?q4kJX8V@KJ>%8$wN1iW9@>q:bd+#iSabCX4u5Q4R\cC!B<mCH##lmX&e>C#ZlR
AFwF@n %QPPhpHlBK$n!5eu#\$SuAYK<#6YXCPS6d9+hPCJt@@Nc!j&8WWi5@YwRw9JNuPP6kl\AYJ*K?MK1HZ!
&Se+Zl >8!DLeh@D@ma9YyLLQ=k1HVjDb1WQIBK=b8A/wPZkJ%SQ::6=J5\bVXtNiB6uAm^kPqVQyIYw:1q*1GS
@XjeiD bNGS9h%K^tI#V864>EL1Xcp=w+WnM/%WG%J<h<K=!/yqT@u4jpPw!DyR&Cnc1Su5t:cX9MYm9tX&@\P4
neQLm> 4#u/8&a^>1=:\y^n&Ved$M4V?1BZBn%*j^+N$8YDY5n&cl!5npnn&BhZldFX@PX@/nG>XSeyjiC6EG1h
TV#MiE d\Y*yyBdu%D1E6^m+V$TEP%Y:TMTDFMHB1Le=u\J9&<J^Q?XD/A1ZJBtwMi:!JE&!iDSdBXWYJ#ENV$<
m8<VkK =eteGAE41eH9wMdDRZ:>G^Vtd1Qbb6LI5W?NBiHKRi5pBISb!X+Z*GKN:D:a=9Ik+F4#:!QA=>c6id\Q
&J>^>% 6cMDMVnp81<a@yP^Q1&lw%X<:CJadNLj:bqSi?YN&/WX*ti\uNu*JW*QJ&1I$ZpF@WTQlqInpb@R!8IS
F^XyQn C&&BIqD#:nRlGQBHLbiT9/eW\c6GGMHCWt/a1kJC:6<$D1kT!!ykY/Ipu1l/cEG:k<>FPPQSLtSkVTK8
K#FE/8 Pd/JVQYXG%hBlMpK4bq5SbFM^YKm^Gc:YBKmZ9i!FV@+#j&*qNuqXR!9Vewp4IAey<A6G8qapK@wX64L
GqDI:Y VRp6WK$kWRS5XphSFwW1I?mXm1\K?DQ4T#Q%H@y6h\PALpiNe<@QKWYB?8!c9kXDFE4/>%C+D<imb+?+
bXy:Aq &cXaLwctXPS\@YyR@q$Nqj*yDeh+FuI^PDF*>BN5eLGK:=V>%VJ4L^kRi8m^Tu=F@EH*WhJD5d=6@H\l
iA+pFa FpaY!lccP%Q&V\AuS!qjMcq1\KJbTD\=p%PGqIlMJh#kFlj4>=<JIDeLMD?WcILT<k#ab1ay&<8QH=#p
/Z\/MR ucLK:lEJcmJ1$TVPPNY\JR8b+^mj9FyLS%GN%q=E^edJIK1DEZq1jH8Y%1n=Q4J++jby@*X%FKp$Ta9>
ZkDKtX #6&MWjCCnJV8&$&bKYWIeSZ1ai=5#R8Cb@Rm6eG<%Xq*u5W<pBI%#dIeQaqm@mKY^j\WcQCN^lncMqM6
Sb=1cX DbTn@lch/1ik1T%N%KlC8XG&?cmjm:PZG/n@EG<I%#G%QSceT5j1nydihabCqp:*lN+tiPdn#W#Hk!jQ
\E%+5b !l#?1dYC:6H+m%nJT<dnTattYSYJCn1JtdqZ>i#ikZqdHMey+dbbj$&@!t$GhTV&8SB>pKMu1N4XV@#N
qbph<+ $EAm4>bkyG^QH#yGY*B!&HlH@m1=qqH58VenK+yF$%eX#/?=Zd<*^CwEpj!nASw&=:$Y66PHV+8:h>A/
Gt*8BG pYX^hQ?TmjGVC^u4enuFM9=X+Kwuy$9AXcPJGlKVR=#/Y/a$*BPtManBMXyFGYQdYJwl&8%aTH+#DD?n
b\<K8w =*+K8L<9?+RR?Ep:tNNMdAL\$/ncL44wdT\&b$K\wq^Wm/m1M*dpGqhIj=/?5iqkYyee>8GBZ+&nHFuK
<\aM+R &//4yWtE=4HF9ljE+mu1$MnEWT&=1JX=uV<^R9$aG@D&$q45iLd1unJR><G=yK!T5Mw=l#>ZIqe#RR9a
TQ?eM< AD?cCG$SyQ/iRAq$!VY+J/J&w<PdP!w\Ry*5@@CNP:Ka@Q!dntDlw?i\59X<&B6*#mSI:ZZi<<ThbE8l
H<YiJ/ P^:/<>Jje/iqb?4!Iyb$@HY<9P=AAFjNh<n4@6D5Nc*N><%I+DZAB&Fn>abSaEbVXuAp<1d=*uHKMYVR
!^aYBS Nhm=QiKFheKhcHukP<Gp1al1jt?Dc#!dEp^wNNT=4M^DjPtX9$utLyC/tMhy$%#AIN*nabZIW<hyIaye
$L@h^T QDpymkjFK6<l9X+HH/E\488\<:ANcy#Q+/e$5/d<44:B=Yu#y?<blZYD$8\PV4#>A1!c\DSc*I@wM%&K
J!*+YW V4e8q1b?#Z$GjM4G>nJ:Gn5LC4=FLGCCq:VtJiTFPai:Jn4#KM>V\1@G#ZyGRKC+/WSJc$>CX+Sn\dRQ
<^%k5q $iY+%LSB^1eR11SE6*4A<k=M\FnM=bGA<+N&I^ITw$I?Sa4IlP@+^m%qqLX+c:nkb@kHSXq\cp*E6G\J
F/h4SN \Ym#PXWDjGHZFQ/\FZZF=uMQbnwH=VE:\Zi9%1mb*NKAtY??R&cJ\@5!k:JDtH!KW%KC&FVn**T4\D^n
^&N!#P K8W4k/>+t%y>B6G/eYX@NKB^%pT1$k^ZT@Tce8bZ^hEqJe&h=/+al>h$mi6%upj65PS11ZNwFliL*S5*
cLZ\:T 1E#9EtuQ5LaXR<>9MZ*h*4@41byQZ@kd*d$n955:9:%Q^KFF//Lb6*n4mZCX$H4Z\JFFpWqitday\Wt8
6?9ulI lMEAjX1Dkdat4Q###9CnBR85PiN!:w8ujY/%phDW/4Fw5EH&t#6ZCtAX!=a\b/*6awHtl!&C&iSWwehW
A@56HI lP\t8lM4=+Lj!6y&&#%RIV\wLZ1XMq5:<GZCbY6u6:aD@1VVWynQ8\/J:nejyWJmhp1ijdQV\L1w@:8t
QXe&dQ B:hEH\PT8P6WB$M\a<8kDZuCc>$X=6ieK$?Q1NCRPZEqLCNVYmMJY?I<*?%qP+HFaX1<=q?RSZmtN@GG
FC*Dtm 1KZht@mmk9m4Kk=pu9YFMQ%6?4/^E6wBR1QMtTLAKRNZj:YuplwHhqHma6tY*:@$uP*\Ww:wctP=@n9S
CewMyN %a#$$5ND$<ZeGSi?>6c!?b9PSpIFI?QM&nW6e5Ny@uVyk^NKwcjl1upHL$RYS4BpTPbqq9tKR:1PDyh9
AuKDHT ca>i&t%yaM=SZC<6adF+ew5SwK/bjZkQRNLyBi^=SKeKAVKTCH+9hhhR*CSYny^%5%ZX#R95%%M/&H:p
uLmZp@ /:Ti?*q>/S^FeWC\YX%R&$G>PB6Xp$N<jYRhjcAE%TIHGQd!n9bV4uy+*J$#MW?+$J$Dh/FR4w@edd6t
MPLqCm k!:jCN\aVbu!P9E$wP#8&Iwtht5%<kh?6MCpF?iG8VXp<A/1ItT5E<d1uQXdMJdp@Ct8+!@*N*45j#DT
l^:e*q hPJwq:Cd/aL\mA>5=Gd1$SR8XaG@Ye<b/@DY:l*ScBm=6I>^W>1h#<=u@JaVNKVDjllk81S#<S=HnV=Q
8J<%:X ^?>NLt%hT#n%mqbXG<X\/<X*Fe1d9Y$nNQ+y%KlldH9>%1DLj:d9?DHVD1nh>dp\E\wj%+F:p$$ljAIH
c^!AuF V@%#SW5\nj/t<4Q@nilq\nnbZ&/pi4hH^iSqTQ#m8Zpb^qk9ytdTmF/aHh$<qHXE#j@/*QlA#t#XSR$D
EpiGBS wwB9SX1ZA#++^Jl<htZ:/l*?:TSkmE#$XYcX>laBM1jP$Z>W\*wu&$Vy$C%VpY>cJ4%t5dj!?EpP!ZVF
Ak$Q4i IZ1cLF8\?+EPi\t6+CInKwFXHE^mIhw/Bw%9MZh6*Q+pY*9\j+WePuaNJHwBEHVpqB1>S5@4+KSh<D\=
nJ!/JH 4p&%c$R%*kWX<+wqu/uw1YlQDN:>/&8qephDn:$t!<Q1^p%tNZ:yVX5MwF9ny4MLC&wj^uJDPb\*%#&6
8D=bmL JnQECiYbdWE?Nd1y1t>^5tm=Y*F#8LpE5*AQH>l&@9wB?Maj?Ih^LKSTaSTMBL=Xe!@jVLpCc6/@^5Z#
CiY@eB eP/pWHuS?6i*<L+P1j*&IIq>KpRn1Yb<Hd4CNEZN=<V8^/=c84RPq4<!ibGh5\ZWE%XVX&Z6DjI:E%$A
T&SCQI Z>twP6p<HmCl8FmNL<kN#wipaEtpn&R+uQM!^XFT@+tYpyL$J=WEc&wmDjZ^=kR#T%NLa%NVT%M#T%MV
-A$9A= 000a241017d001202b4 Page 351 of binaries2.zip
!dkGMl E=KyqatXBiHpw5l@^qSTRlTwywHYhw?QTI5K%!a=WXIV$^Ine>K#5k$n5&JM#I*NTbbtFmc^K=wK#p!K
#STSWA iklmGpVkVC^jFu1Sm@P4iRZpCV6^ihdql$*IhWch!8<P\BL>Wb>61Q:w&qaX&bTw%:abumSBFW&K\FLE
%F8e*W wtQ6yn99d=%9nbiXqd+$6iaLlYYnjW&HWpitMRPDtaCWe%k@KhK94bCZqH$c41t+/CiDlK55Cde5m8!V
pBT!V4 >W%D&&hBA#HF:4\!L^mYX#:aM5F@WS@L4JkXN%E?lT>mKXVkyShd8#tt&Y?w&SjGeHc#nuatJK\uN9q$
N:jK=e W\B48cd=B<y?H46>5^u&M!W>V<aqeP6Q#l#@dGFHiW%kH8eII@MbF1VZFSnL:QAeGi1F\TNFEbHpV1!5
+&V<+d c/yZXK*K!*1YEwYmBPVw^#LB$R1=G=BH46GuNdGBF5+X*jh5ZDPW!y4a+tZI?Sk!Y+&mdTT!<PmX9G*Y
R&m$Al ZZSHIS$<m\K6QCI!iG!SW1!kadY>RAeBIIhBLVCm<N5/&51emQFbVFcYmIIL5j1%\W4uB>?Z9R:#K4Lm
M^YDLG MFP#5E!Xc&In4+yiI#$6VP+6qaWG?n$B8bqayVLM#l1aH+\/9dyWk1/FuGEXp&qucdEnV$K4M=696^@C
R$EAkJ ^nyi**9*QmJN\&JLJ4Yn=Ew*Y#du#y9?1i4CKd1bJ^dVq9IZ=M<*mXZ+IuNM=dM8Qik?+h8\uB6VLPn/
b<$@6@ *iHN^?R?S/@h*!?bI/?t^M<6*F#Bl$j8+Hi1Q:F?^cj1=:>\h+qqdT@a:%RcJM5un=4bN5TnIt$>Zq<D
6qCRV& CP++@qQ$q!9^\=XCDX1:l%/GC5DHbdGljmhC*cyq>cZcPA*Fh&uuRy\c5@c@h4P$e:9kwmwCVFpPu6R$
GnAG+H \ICQT4EDaMWjIVaF=@XPhL:dC&jjj$Hdap+cV@^Nh+idPmP6FPn^ZIad<umH:Fa=8We<HGp8tY?:<E\d
<DXnLX Y!cYI/9FckuDMn9GcVqn+8X*/EhX@WNX>?E>Xdu#kV6WJN6nZ#TKNHjFwP9K5%\VW:Bt#Y5Q?^4iY5bt
V%F4c! 9hwH1*Ei^PBlA1XD5<*\&/LC1:6wI**<Nl+eq:b>TVl6:k^GyNnGMphI4P4G/>6B$Qb5XGJ<+S#4SaW6
k%5Eh\ XTFR\u%+5L%\Vl>ycmd5*@myKyH5j9ytSQHDC*HS<*mc&8ltDL=q#bkh1VFMi=*nc9^Vk%6=nqPWIAZb
GF6:uM te:qeq*Pew1!lQQjdL!uS!CVl>XbkFLm\l<yZ<iy<Wjq&>+%YD59eHiV5=k^phMeC%qwyiNSW@nGhG9i
McP!a+ +T/=DM6pne^1LR?/5XyRLJVXGCLVJ85&ZhyFT5XuaViHji&Y8KEpC\1RuK\Imkdmta*D:@cK:\55hM1b
NXqMIq VaX6uWRRdZj&PN$RmbRc&*6X^#%J9=w%jJtKPA45njQXTYMp6Y$Z\pVE1ktwNeG\%1aR\@D=&X^*5@P:
#P>$+6 i%n%=5@hABEXKXkHuYuuBq6h/5u%9KAPVn1?Lu$9FB84jw?+%n/bdleViAuYHt/XMYCKC8$\Bl!FX5YV
%pY%>I C\+u@EVa<:^qwFEeNyc@eQpBQwud4:wpCw#CQYtKYj9>?S@N\p5$!Z$T#a1wKV^/uaZX8ZPWcCblQHIP
KtnMY% kcbFy:ud9:M^AM^&%k/$P\Kc4#Qnq5PMtX6Zn1ZMi!p*4=&Z%m$58Edn%A?t/cp^p^*G8Fh%i$jME/w#
=NtG@P jhe>pblk\k^MFNbAeA4MTRIZ4/9%n!&LKmH#VJ*5eI<?jQbieVBDik/6Cb@i6dn4FnI=>luIl&jd6y\w
CBJF1n TF/ZISmu\cE$B%QHK4M=/bWaI@Gj$?=C4nMV<19T^<1=ES+Q=$6$yeP^yljAZ6pt>abw\pV5!N+p%YRY
#b:hiG /j%wpauMhkpcV1naS9bH9CtA#$en8FhS/RieI$p1b4pY#&JD5j&K:9ZYW:&6NuThw4yJFP4NYTjT^?4T
A9<qc& !c$=$GH!4ewljW@p1Gd*Z^:<?bZRhK??S4PmmqED*eLhm8pGcbZ#k#YZ>^XZyTD<R^S>qCwP8PiW566=
lBhV4i n&uN*i&QCttch1N!aim5:P1P<bq<>Sh1WPDc%t9i?jLmLT8J4u8d$?ehS!Bbi48e!N/EF8h9:4QNj>tX
L=<YcX Sic=%Wbc<w*iMhX>Tkt*PSN!6&1PnC!b?>yFYpDnDl=P1q&GX/pL%>T5dAcGmaJJ^8Zk$<H:jbVPyYMt
jCXXY^ pStDESHTIYicX8$ZD@P%+R9$:%c8\BSkNdGkYJ:pbMe@DC!KYHb6=Mdd<tQpMZIL4cWl^w4$NYwLp!uH
+V:F=M wn1L4ZS#6=?6=lw&>PZQ/w!%NdA?%6?I^iRTCuwGCl4+5B>iQKbDy?i=k/M<w:n?y:tdp>T\QI@ZZ=Ne
W<DPn\ d$\Bn@Hi55eQQN%&Q8+=yil94VE5dI8Km+w%VJ\+$#XMT+iaYGa8*LE=y!1:lqEi8F@VM/Y+:48G5hT!
a&d&aR LcPP>W>4*^6jnP@8h9$9du8QdD!m6P9?jN&A/ml=5?BECZ^N!$ZBGtJM!!FB$F#TSbkutH!N$\D#LLB+
^5M%Eb cwAFMDQGwVuVeQ+>NA@J<1>9Z<dn>%kcWX:F!jNSZMWwK@6aL9Q!ESc&@1XD\j16K$>5GVyu6pZD*9!u
B>!9Vw yWQytFQDHt*bq5%5Yj@D&:hM$B^VY6?=McwHcK/RnDwNpnlcJA!A^cC$$S>AAVVHHG<YWRYc!D?CQ\jB
iGA4qj 6AuQCp$MDjRALi:bHE?DmuFwPW<uRj#jWqi5qA:8Mu:I\qdhZ?bKtY/mQj:u@CcGhVVL/jDh4XXdHjW&
i%i*VV >8<S@n#:1iQ*/TLwAZG<Yj$eppDywnm#DIGkwkR\mkW^JkX+y8C\T8Aem$HlkHq!I8kBiGS#kIN?P#XA
L?<i/h NXGC?L?6T^AHDT@CAM!S+#*kEcFFNMYbk=D+??pV?b9qGXmliVSlpiQNEiJy#FE><uY6taaZRR9q#TIq
e>EtkC \Q*uXAq6kBbWajAZKIAPmpXIW5DleCpIYQSHkC:\b#GJ8eZh/#W8B>\#IbnF/jm:=ipR!YYA@#RHLlkE
ukmmL1 Dc<EIcKn8nek^%9CHJTn\19mt1Q?##ZRE#dVCNAeK:S\1L$8caAuRlC*4DI$6!J@$:4>Am8$Tqlp9T+N
J%YR\M bDPtDZGAYRS@W*F\cEVXu?b%L%kYA&JM!wHIbw#VAE?aB&n8\IF!dlu%@:#?u**upwB=\mKy^y6XkR&a
+lC:SG \dNmw>w9+DjLACQ^B!Gy@ne:LARccA%EQECk$HIwFI\a%SP$WAkI+C$%jK^J%6%m4CW$Hk/cF*C+e>cY
N:&aT> Mb1bB#^%qC5Gupj/#jQ5Wc>^cEPe?N@MFqZ<#jPiE5ThiZA>a^E@*p^VSGN6*FGP=^+Q%F>PW^tbDT#t
@Ply^/ GFZ<nXJ%^?/QjNR@8B!jiPiibm<Q+@8Q^%=iu^@Mi\u*H*=EB+@eHa/jeWl:P<PAN@i#!@>F?9KSnP^@
p1M<Ji +d:lajS@Y^i8uDdP%nQX:e86%1$QuG?+V&^j4JM%Wj6:GCDA\#mAh/#519>?!ni:h%cd*6MI8=Gh?*Q&
V@dn:1 >?9#HY%jB*?k$HISFppeNVkSHlX/iBP$lnkShGkEGMpeLRw$6=4=9?PCRI$EZRT>SuX9V6PDB##h9?el
!CL\DG Dh*^#P!M9&P:&c+D%w?\YBp1S4PM5LDN@+eAVJ#aM/YPqdcy&4Q@<Gn4!yWV?=M4p+AhBaeAjd#H*ai$
wjbTiG >LI9=94N>Jd:Mu<P*@hPM$ncFeW>V+NI#HT5TVyk@1hyJ6T>PaldWRJ@IJiGPD/mjwHFm9BSFZ1tPFEe
VWm#EZ LRECNWw\ETkSqnQQn?nT*bthV&n+mehl=*>R\DXD=<L=tnN1GGY^h5?Sbia<\uDbciG/*nyb<^M/^lmC
??P\4y i=mHNpq+n^6??5&G+Gb:\>MXcPaX>9wy/d9mCj#QAj6@$CSH!\R6q!pt6CGtHPLGu$Q/D^FAC<!JwDZ+
^Yak@G e<\B:lLElQ@l\mB*6i#VV/qX:yuN!R&ZLPJ\b<^@ykMIVmMH9m:l+Lu6$Q$5V>y5C>QtQ%^!A\4?S^D8
:5RRuh PX4@MaQ?6hh@l/P/$:4V8u*6NqX:5@Ljh@8^/h9we8H?DXn\6^X=R:W@!Eb>@=e1$*HY@@/cX@=jNIn%
d\YFh5 >Z*\JZ*qEiKTD9GE\dJCn^BDe<8Ec$QQPSu4A5>wRnDqc^\AQS1W@@u#/%*1BwIFYq@1B1:*=\<t#+:I
iKpMKW u%p<ICnm9#W5ZJ644YXShb/KKhqu@Q5pwkS=/p&>qPqq5W+6l&/hTD4B4PbhENbdLBh5!=NQ+R*YV<nt
Hw9*aM :a\+SZK/I/X#Bbw=&iyciFjWa&1Zl!>b1LILF1LVPaYj$#4C1:ILlmP9/R$t&ly11CwnKZ+w@@@m?TGm
niCqId d/BljENFPDuFuEY5>uwqqKF^?R6ZiE$Fcb#@K$RCDuM=&BJmRw?u%KB!/YYibD8a1tW:cP^EAndRXZQD
NNlRd^ Bu:@nWHljMM1tw9ub*JX=Gn>8p>B+u9Ak>mYBCiF@$LEHNhS?CVEb6L</V!pdjwpn:#5RRy#<4:5JL6T
\/Wj*B ^bNywP4%uKH1^j#bcM=1SqBpW$<aJccpL+JK4Y9TBEViYVRNWZnSR$<ahZp+<6<nXN18B4XTV%Yt^epS
i8$E98 <nVdA\:q=Hn#4<JJinwVSd8DDPY+h>qF4k@eK#$ECYi8=VP%<T%B9@kHP:WNdG=Da?=Z<\\++>n^w&jd
e#@>AH Be5pQ&itY1L1#cQ\m^HYQj95L%&^:Sh1R5Jl\tF%aSGuG9/a9@1ELZ?/EFDKRW>9X9QSeuD:$&u<n6X:
u+IecA c?q&D9<:Yj>RpAEj:c1#wBR@ylR96BDD+d@1=ITVR!6eRHbS@!LSpaR*tMQPmma%tIW&wwQynP9?n%bp
jH+*h8 $+bc@IM?m#4c*H!b<JkiQh#6ybuda#9K5>4/?IT:6<+nh++Mq=eYG=PYYbe!Je*E6w\CWul!J6PCFD$Z
KN8ukl QY?+n?qRYB\d5%^@1=BT8t$mFwX4\t<\jH!&awm1yi>6y^$d@Nl9hl==H9CqR45F?N/l4W#&=AdYGh=Z
/pV/k= 1$QMi/QiZaMRnN#LPiPB>6JC*wG<GCa\mD59:#9e5??$P\PHRdTHmS*eEW:bqKckW:tNV&8qQnXFBLc6
/==/tk 5T4GyEeXETwJ&C1ZB1Y:yL6<:8bdmLyM%mDkhIb4+uP=IDVV6F+TGI:MewXECW*b=1NTc@a68j^y%>#l
yAnpnS W@C>w@!=w@#Y4q4!weK5eqCjy=Re4Wcq4wct\mkSMS4^TFWl1FR?d=Mk#T*nDy^8@H?%bn4pQ<%h?Y!G
\cqYQq %$pY\6Y/SbK<$?C\ak/PM/FuI&W9dyNbw=#W1FYSAQ8*jaVcAK/Dt*SCR*y9L1i4LPXP*!:Y=E:jaQnM
a!aRBy FZy9aFMe5#@+LQqj#$hdV?&@qiE61AZ4wDm!1p^u1NYB1XINyEVRBKm9BE8P1XGl\9/I*lIJBjc1GR!1
L&$eR: wV>lwp5Re$PlIlFuCF@tnkwKNPQBVZdpPYi8>bt@!Haa@D+*kteJGeP#6wRLn8Q&?GXy@cicDj!He#^B
ZI*up# G:bP\Ra+=yuaj?W%e%MXim=mCD&>p*nqe1Bu9Ln!%N/Q\FXFXmScaw<nd?CaQuKu14J#$6S+cbRe=5LX
T/P<wa G/!ec4$FX<?$*$IKanpA$ELaVweXGFWk@*XS/dyH%ucyEQ<S%qQH1yqT+Yl41A9DWCGEB#c5VI=8K@i^
dH\q8M EEm9TByVMA%bHIBXXhkAiR^^H?lD*6cwPZw5XAt=!aHY1Y#9%/&dBe@Zm/&d:im:$*mn>pL4khb/*Gdd
Xw*:E& qIVNtbG%%5i:LI/+l!/XKjcWRDp56J#NGj9XF4bmi:G&Siq&m@bP#5pqdp:aYNc66Ln\=CF9?du\wA%$
wp%BFV 8uCnDe9?9^X1R8TqP\%FqW4pj%FwPDL^#+aCYwcV<1JMSHi9R#&BETZA^CmeYJWq8dHl>1E?QaYIG<t5
-Am@F& 0000524ad26001202b4 Page 352 of binaries2.zip
P^Hqj8 K:kGpHdy!DRYua9aB1pXZQNQWK<!F<4\1@?wZW5+lj*D=a4<S6h>%e^R=KMk%A<***mil>b5eQJIy!GB
/KtjCK I&A6LYuNatQq=GyqLY&4y&y1CcK$?+^9K?ZpT8qT4@CN%nQ69BeJ6?TDY4*:/%Tp\J9>ScVAePS?iRM%
6+*<NM JA4NCKa1wdH&n9$@j9\9LL=t@&<:91FYu/^!!E:!H*WT@a<@t&hXpiImB?*@1j><WiHwTG#L=L=4JFE1
1&DcV< Ju9Nqhd4Di$i*NtmZ%hIj4=EFF^9m@TE?bTE#Lc>F5VK!DiSS<44<hcq4RFMV4*pY?mtccSPAGG?KM<>
b$<Gu# FWmQKm9jXI?py%TKXI>1eZ1@9M9ljV+1ImE1@=@/q+$pmwIBJVlHyEPJuFLRI$h6@Ri#tW=>CqS1Lbmw
?F\*+t 9?KhehPklBeM>MnR4^=1E4iWV&YS@aPNk<!1FuJ%i$Y8F8heankEitqQ6yQCjj5^+#FVPZKA:nmC4PCa
ZNX:Xi /d/GdZMABVPFW<@K66RQ*^8Wm$dD<tZCwh1Z#K#%19Zmd?S9NQMYP^E:RaCjKc\?9y:ACppZV/m9$W4L
LRt:Pe !hJ!pZ*Z/b$FpuqnYHumlcCH&XXHT#/c9iZ>Td#KkiD8FFPBpCbj5$Y&K1AK9=8Y#n^AF?*!PRE6bGTb
?ZA\ti ZBeNLVt%t=dGj5Q>Q%Cm\hH?N*DaaDnb*qkHh$l=j$6ah>n+9/L^XR%D^eXbwaG1/81B&AS*SEZ8D$pw
JBBII= /P1m55ZqT+HqY>bW8i4\#C\RHKtVw?KPb/c!5iL1wyPn&4He=?Jpq==H\kuN5CRh48R=wDCiwcb+!\AE
qtc:E1 YPbauB\Ric#kRq#8%qHa66/^D4bjuT@K4LaV#NcayekpSN#pQ5*q9d^caR!y??//qNc1cCXS>M%jK8Mm
^J1RG8 DcyH1DiFJentLAj>Zn1wb:JS=lmp%LidpX<C:TVNnPVlZ<RRewG?%AGe!\>X9?hX?hn:WwRw@Wl@Glyh
:/Em%S *iY5I+N=l6ylyIA>Q4p+1PD98FwtClTE9k!F15RYhZ6$hF@\!R%pEST%<=a&#me&dKTVRd&&=Jc5ByW&
JJ!HyA K<8N$dB56XALBLmpS<Ad<1t%=lDwdE\=tdupIT\Ju!FYM+yd!DWw9pI\W4FNl%4S?kc\TNJlN#dXXC=V
!nY+T^ wu4MKcn+wWhZJnp&4J?d*tQh$P6LiWyewR+Z58j1&*:S\8VJDeMhIy#9q<NKmQeIDVJGI=KDm&baa@ec
ZjmMjH e9hZDC>NQWSc9aANMXMHdceXEjbdBA+hY1aAPbLAwBQLM=JW=GbVE&eGyk>Y1=KD9QXL6QNLe\EHHYaH
ZalBME :taju6QPeBJJ!>JhK\=P5/aK:W4H+AaNa#eG*+<P1$NXXe<XQ!qiF!9kt<>Vl:6jbScE#IKY^8/A$pLe
j<^>@: Ie#hie:YII4JqB/Pcm<aBXPY$M?BWIMbj<^GZ%?FaC5m*J9VSNeCq:<Gl<Kh4S?W%eLW#?hj95!aj5lh
TnuMep mQ!SaY&I8t<ab>+j=#/AkDwDX?eMP@RS+V!8cqi\daKt@FK&Vj<+tdWjX!?qWBYm4Y/?an?BjjCnK^RM
NQtu5^ yuaRpn+Z^#?Q<+$y5yh4$A&J!:$EpY$VBh6T5H$ZW*b5CL?Kj%GF/>Y9XT/wcSc>en%5$L!E?Ih1p#<D
q$Ta1# #S+&^l^GY/61N5>FC/ILNd6jk<%$k6>+Piyd?XNlQ@%J9IWTu4=J/?$8ARFKc/w=c&$e//kmbB9i5II9
GZDj&A kwEtkunXpF4AEE:KpIKi$H%?Pdu<n@QL>PqXFA%^IXPC@E%pNN6%=M@+ViI1R&BMw1AcRJT!%F<IXJQ6
Im:9p@ @Kebj*6ZBEE$=91e^Lk4@4w16B&iyuPF&ypF=QS8VN6%q9?\44YhQ9c9<QDLEQPZXQ^ZIP@Z*PJytY/u
P$@PD< JYNu@@E#tK<FpdLCnLL/bMpjw9PqwQ8@kp>ka\ly<+k!CDlAj=B:mQy:nMbAA*uBnBKJA&YAJ9VA:JZ:
R^$@<< IG%AkLKb^GhJJF4:/iYHytFB4VdJtQ/RF$1BWSlAACYBVhTAp<?tJaENSjR^Sh$P$+eQJ^dtVM9uSC8u
LWi%>* +J6BFa>ARRKRkZuBcJRFtS^H?$%FwATVRuTbS>T:E5Db<Hh9m^S#VTnlVnRX#?yDdI^*kKY*mJ#IBL%b
5<#%My @G@LTtpwp5K4m8YQwV:I=mA1JSEL@y^\Dn?nCyW#n!nlk$GIkG1\p+!Huj>CZ>dilZalQt\l!Xp&uLQ1
1HpV+E *lD/=%jkl+Amt*tQ*qGPKeZZLiWk@6EEZM1#Mh1SkmmSHbW4u4A1ulP/V:8RPMNbEMpR#<dKGahCpp/L
%q=5DC uT\LluC/#1/YlyPRpCDK/q<JB/9\*qTK@Nt*BReSTR\VTTbBu@!tET*lMbIVKqPkN6GNC=GYhe\TKXd+
@IKYMN q+\na9p6Cc/<+HCwt%k4:YRNm6V/=6^jN<LdqElcdXjeC4KH</?WHd:&ADCAB$n*utI9JiPCn:GEM*jC
5@H+tA mRpRN$F@C/5EK=a9ZFcCZ%b69G%<ZXBDa\kQ<%ikqtq&@ni1FT/1bteG^QkKbDRBXKRCiuXEZ<<GFlE8
Fn\:Cu AFVey+RKAqRFW5&ehk&yDH$:AJtkbM>AH+&dTqE+cG@He8nwP??P4!SP!TR>nBDKt/SC</kB1cRDthRE
c&y@Lt iY$ASXkk%YT@Ku/<18R8AkYmH\uJ^nSjaJt>1lV4+bRM?=nB6d<QX#Q6=XTHy#TBpXTk1LSbWJRHLW#9
qu19m= j>@D*jVMSyct5#J49cnJQF4Np4R<aaIIh8VEe\LCpuJdZ&N5Ab!=yLkD9MD?<6RchQ4&c5IbQGVjJPj@
1iT+nQ CYEkDYHPEmZ/D1jc@I\lI/Wt+=AtA?d@IYN=/PD>Xkt%KtVMppni<wCy*&mHZL8Dld#/P6akK/4Qhm5t
m^$?ZS LtZ>WYPB#emE\bmHJLWL>5iS*LFch>>&ibTLiyT:p\SX5@bYQ%p$JIWA<^TcM&qHPmq?d$RbL9T$dXlY
a*H5Th IDWLVBbTT8TPmwwCG4mEt6n*Gq\GqpV=6*G$&*K<dS/epqwduC4F+kyAP?4!>=p/ijGV5bBZRXB<TCIL
aQX%p? YMYC$RqBkAt=L@CDSFyQSX:JeWW:lR&jTwtFj8yGhap*ljAnLbyF4alIJeW@i!WEamWCp4AE$6:SMdB*
8W$9/e =PJ/qL=+ic+:\pkcIk#L!l+AdWK@RDcFeL*wJdc>B8W:BeJJYahGc9p%q+D5kY#I>p?=#4Ej#wY!:RY#
!H\QJF wacj?uCBcLB>iVJ?Rt\cV9@<BDT#:PS6jXHYEpG+11:^FJ#IE^LGlY/&$BIt%NdLdQ=IlymNR@qGe/*L
WITYB4 !1!=Fl^Mh6?^Zp4!W9+?Zk4BpMnJ%:ueMe!<Vu@Qb$T@BH\/nw:V#B$MaF+qWnL8GE#61G@6?$c4C8^u
1ZQ#W6 kE+TBEwX85/5XSp>/&:MylmER?pZHGItBZymC$i8Nu::N1Ve#c?wIZ!:TwKkDKLwTl&4#Y#dFc+WCbwL
HZMFI& /%=EyLB*QjLR/B>6Vn/@C5JqJ&depY<8d6+=XRjQSwia!E^HhTW4@/by5:>8GTL?n64@K:cDn4<6C/nX
A=!V4n L:YXJZK$KX*Z:+C!8PpKTBnkBK15JE%tqy4km^cnSN^qpAaS6w4Xjiw$1y9Zq!wWuHa<eh6&NHKeKVK9
iNb/u# FIFPkukCyJBY6ybdZ*1i%*$yWM$pJV/^54I!MdC!5nP^54A!5nI#5VN^eLA^M4E\MVE^MQ+jaYBmbYL=
k5:W<R #+1Sqb&Nuj=@hp^5:hQc$R*A#Q#B!8HR+$Qw\91\+AmiJ8V<#NnSIpQ1>P6t%BlT\cBC%wIkHPYC%5Bb
ZZ4ia+ KKE+8nZyN/BC*j#!VMky5AyANH>R$L8FDQaLyyPN\AylRaeap45NtSGkna5+lC<>iL9pR\&lYQD6&NA*
NM^$w@ CBCmi$VHtdD:R>Yn#69%ta9WBDR/VdKScRJk\FAFT<1S6bCSRhpLBQDeM4b9S>$AA8C8HMka5F*6/9qL
DQ<ZG= $<haMYT<?9MPI&C+aZy81&!9Zq!D?%M#!#/*9@E86=uTPW6$VFAM!DBhdWAZ<5u==bcW4eYWEwQylcZu
kD?#$G 1Xlk%RnY!%R&m6Pd!KE5+$KYddVRmjkL@Rek+w6lMMIEpIKSl>%b%bSjS8nW<bjI##VpRjaWIVVw%5m<
QmPunq =i1Yh\RG!iGa+4Niwm?\C?iYZQ5Lp<BB:cmlnPk=bH!IEFaE5RuZ<el\n$n4>\YPRa$l1<l>hb?//\&I
L/II6? @h4wnad=+iG55E^M&K$H@KYM$RbTG^Rl\QGLuQC$l6Z:M$*<<1!\#FRdw4Q$RQKVlbDWTwlL$@!GYJXT
N*Iu:b d@!aaZ<dddFa1IR$5Flqm1!*wRKp\yq=bq%kpHuktj$E/\>EHQCmmaIHWej81yhQ\S#LqW#Y/YBZ/5%$
#hRaqW iPK!//<$XI=8DHqZi<K5JXtG/+>BG%%I>*wTu<9*yw1M$k?%XGE:L<GadKCyNiGceq@Wb:d>@EJRp@%I
E6KbVV i%lnRbBl%4Ji5c/CP+CDS6H:+GEjpQW5mj&j^J+9hRIQ*G*Jn>6inwhmw68::p@Ycd$dTEHbeh^I^+/+
16^Gy: 15m=p1hWl!8q!S%D=SR<6bPFumBPQ*1T1cCRiiFEWLR+q/C#SH5Ic9@1HKuyGqWcJX\B18Z?<t6@mk<!
@&8Y%d ?XuNIGKNL5!$4t#yZC/mD=/65/Ze/G!Jc\G/PSh6y$IZtZS%/YP#\eSQD?D\Nb16CY\*BnTQew91LG64
m*Z%nS /1ktA@kQhGK%dNGSb#yN*C<=8qY:J4pMyGw<4GndFAmi%ud1y8=ZX6+J^b&H95Lj%pPlhBP*uSLDML<<
8E<>DB &QVeGl%dni1cikm/C&kiFG@Y4/d4bIk88F&:>?:++NnehD@wbDi$HAtTNnKMht*X<L*<?BZGQl4>E@jG
yYy@9d h@WIY*cLdmYl^VFwZKXlFL:ANim5Pcnt4bhpDe%<w9FHca:89SEHlX#@#FV&kTjdb$^MY<qi^NH:G<Ml
miJ@Gj ?n64#/9C$^\6Ai>aZGnaTu\\5S81cnH@p+T6wPb6Y!/W4dnt5FNJFHy\#5b=k*Ku\RRlB:a@#DEKNk+:
DM4<FS &B=ta#*WAm=$1MD+\nYPZq#bR9I9c*m9Cy%CV>Euq:J8/CSX#eWcTn4!4>J=bAnyhlJK6:Pa?c:HGc&<
X*:PjC TDqu%kS$*PD&D%?kHEZCJaSn=I+luKam4uKNudnCBZm&mm<cH+J:eK>uMXZd*kR$=b4>DAlbtbtNRBSm
Wue*95 CIPJVYyW/?H:L%d1Y=bQYNc\GLjA^Cim/8bmqA4HaTPDylS9CFZbkW%k5tM%d&I5ht1Akw9#mD<%+KFQ
MBimF9 ^YmiJV?YH&>mBXGP^W/pRk16?<ejJXC1STLC5Cw%^8<F4mppie!B9iy9KFj%!wyA!p\?9AXJC%R4p#4C
/m8qRp KEMcqKYJ%khV@hHQXepa!a%E8T5JFp:X6NA?D+8ZhW$=b^F:M5B4KP@>lZ9W$HhPnFHWqHhX5n+WH*P$
#8huQe EM!A!R!6@Nw4ip<mSNal6$KApymiXGBabKyu66K?YA4KpW=>1mI*BjJDq>iY^n?RNt?<*tCYJGIH#uhL
8hJqt6 Q%P@#nE@4mSVN!1:J6GSIaq68eS8K%JK/c/!&LhdDGwFSd1RpV!MLbQMwMwu5iFyiptCW@lZ^&/cZwLe
X6mp+P jA$H4?lSZ@hQk/mT?CPneMLEw8X&#BRYASZGET^C\J6VJjha@TGem<cZpd+#nDpwJE>Z4piuaduA/14n
@=tM>< Ym%@\l+*HYyhZZHJbFH#d=Z^q9&^6:Z^hYB!LXn8MF/ljBGpkG%VyGJh:h>>A#jNLYJw%Z&N!tPHMwIe
k6@Xe@ ?nV#FmPiwVcEpcim?@$CLKC^LqTj$KbDlJ^MJPH/m1eNdp9C:@VMI1Ppqnd5+T%w5/^nb\9DNBF^\wVM
BTVikA +Sn>hpS<H8Zw*n*u<pBt1:@ec%>Qj+Y*?iS@\MYQMm^C%!dP<<I:u\8I<S!XH#DquA6CWBiGSyqp*Et\

-AI>R4 0009fe00e0b001202b4 Page 353 of binaries2.zip
wt%KMh ajF\6l/Hc!@lnCd1A5?ub:#/C\pP$4>hLp*e\%8@j@t^>XFtEWY%F:d?NIp&*5pmtkWl=M\eiqP&#FZ^
%Rh4>^ S4k+pp/L9!IDnp!m:Bal6F?q>?!uH9$VwTRt$Gid+I$?&VNtJV9%n/>\tFPmmkh:1p!b$ki1WNS5hh@N
i9Q\tQ S4DMekbY5l/plG54l&?68GMZ1*T&&@QQ5AP!w??N=!$Raw@J^5eRC!/V/p4tl9J5ZT@F\V/9EJ%$96\d
895jl: PLEG$#cmYKt\9V%?5FmjN4EHqnqB+Y?nnM&yCQhN\Xd6n6b^/q>+^8matI^MQKIYR+@GDGajD9BQR9Bi
W&EkIm ^4e*ZJJ=%M^jH1!$R4e!ck>R#&DdTwWt=L1kD>4WIJl8b%*K6GA$%@*/Z*#QJ#$VmetwX/&hdQ=FIpy$
lMbV%9 5Q^ShAVPV4G$A1Fj#6iQH<464Kq!$AqnB/awbe%wt>Jt/MVjtk!C4q::W^nZSWFRmFYct%HDy<!lbpYP
u<44HQ M^!=Y1YZ\pp#jhnpJ&YWPTc#YQ&hmdLq!Vu4P!$Mqye#5^q&hBNYh\:#mhE=c8t8+ll&Lcq@Y@Q^J4+\
lt9V15 lT=84=WPL^5N!:\JVY^bIP>c:tJmRhc41?\DHW8tHYAqG<qNQ\ACkMTIYB4iT4@q+X>@l4l5!1N*CmJL
Q8aW:\ WjT=@cjW4m&+B54!XQP!5FCTlWBiMR#wnik>e81:=tE+b$?5JN/#N/EQKAm9eqW!yFK^4ZY<iDNV5+#J
ayMTSD Jqt4\<k?CcB1\5AG:VJhI8Xyi9Xl\#$CYCmC:yVh?Np&6I+4c\nl/kipM#E8?eLBD+hJ6Rp\%8qQHptR
ldIWjN qLhZ&%=5C:X&npLwu1L/kV=I@lt?F%uumW5Xl/:?uw+>4t%W5=8Nm&L5I598=:@pNiYiwjM$B$Jtwu1K
MVTQi< mP^8HFe8p$CZKeYWQu*T9Fe%D5/QGe:*Bd/*F++&E?ZiyLytwQNqQ5c8D$?*kCLM<4jMGJK@ntlMFKyQ
t*d9WY l4\Pqt4tKJX8C$8j&S@qLaJ\95CHm*:Jqb$QLS?hyc%9Kd19FqtPycZpB$yXC9ZqwjN@p!JqukqNn\?B
n1qa6F CIyZl@C&PGwCFeHtkQY?:l<$KkLAlX8inW+YE@j:B?MH#1c#uXpk<C?BEtWQkjR/t?*C?p<lnGtGkYPK
8P=nQ9 t*+5MnB1nDMtJ9^FP11F^h>D5m^el%6qR#kELXbeFC*?QlZQFR/5w@b$aFAMqu<DyXG?K54>KA=DlM^e
MpZyym @ihePlRjj^RQW!iBVAeLWb?aMH<LANNq5>mHm/pQA#/6qQmw8%<C6<ICu>/AkKbBPXdpR&Bi5@++9<y%
#ZVB6C Ebeip@@\Ejc>uYS$I=Pi8N/D66DC8i9DCci>6lY%4H#H8q@DFk59@DjJQS?GCpIaTu?cAQhVAXqcVP^d
&!bbNp CRFSLBqFCLIh#Y?4N!:>X98u!$1&X=GFMD/ZE5IY4KV&Lp:+*1+^hJH<=9dm#$L%K:^\WimkVIu>nTI1
6SdD4d kWWPwt$:V@^DcE$jcmmySMS\SWRe!XGq8GQ8kQFmKCt*WVt?#?uHXuS*ak\P=ZB?leR!4@Ypt!Z><Jn4
QciqG# V6pFPQ$KiFkMdNZHi5IMTbV1#D>JVeXE>un5%cBKQnBMVRn9eHHlE:nBP1MFGNlj#LJ8TVBMb1NYntNj
^%PiHl ZWq9d%kPtH^pe9ub9Dpj@M5&qEWMPKF8TXAHDD5:SPlnWkabFAXPk!9bXcwTM64&VFHT/6kbXt1wRAWd
I^A+W! BIW+^wt*85H+\@5hkpXeZyP9EW4u8*qyA+9pNXJW&ES*&Nt*P%MZtwRB<Lw\&CqKij^<6kX>h6yHVknV
I?EPYd yqE$aDu4@i4A>nqbmd89hm9iHylCLXIq/EVlVnBm#qy9Vc6>he4X&FGIV1nR=%JM1c4El&QQ\i4&=p5l
4M!L@M clJZ@cn$V>A8yGw+$^N5#d9n<CbC8^Adl4AN?NQ?GCknu5lR!j#J%?AVJpMw8ZqSidL/=pXccWW#T8FX
Dyj<G& TclbtcIalDJ=:n?nhnCVe$TZ^6RmjHKNaemlwHA*WBB*:Ni^q4Q1QmJQL\BZh9@#XT4#YhHXy\eS$Gd@
>5i:<@ Yhw#wib&!?wZdkRyP1qBt\eN5ew6%KuBiDItb1Wp6Kp/anFi5Te:$JFhh8SiLTpbt6AkEGSNX1ZkmQ%6
ddXJc* \Hppi?^8TcIHwcX#<JICacIk==\X5jpRJ>pGaS\!^^!WD@M<IALl<ZdZDp1JL9clb^TNMEG<4QJXBPme
mThS?* hyCXkaZq9*!Fqj&@mwYblaPJnbGDkjG@IVbYFuwYNqaPDwwMEeKN?@^#b?c5bmPC<j!=KuCq$Gk#iYS$
Mh%Npj F/PE>9!ew6WM&T!D<9^dmqww&M<GkTq@eydd%$+p*G1LytMun>QePSlNy5NeF!PD?9!C%185thDe&1T/
*dTuL= R@qAttEWpICX@j%1+nPI/iIL!j+$eIlL@Scc1MBnInC:!j6ki14Lu\yBcp#:8DBK^MGbBu@F!d:G/H46
EYK1!\ cd4yI&=p5lp6&\*8A!6Nwtc41?tX5m&YI9#Nqjac1ZVtYN5t/VPStcu$P^=c+@DX1IDpHQ#ttH$FhNCG
SaBDw% ?M9445S\iWa8G1VD>\Cy#C6\twDIBjnyAiCQIdAKieeSwYk4QMlG8eX@@!mlt1XBtR/^DhG=bN5uh!V4
ECIZ^8 1PSZJG8:hBiyHbuE5XkK$^W*tJZJ=X>clcyVpYGJmpdEYl4MDhE:=LVkp%FVc/<M&SMEuSVFb*1#R\e!
Q54DJ\ qVGIq/J=%B5nC:X+tkDhXa15qVZmP&RDR<$aaLNWwZqm#iqYby!6RXFWqRZy<1!c1!:yVS6ZJH*&IjAw
lk$wL> w5k\1p$tDl8L?=1:+/#=<k5c!n%p=q&wN%Q<ZJE%PSclehAJ^yw4SGqi&8kwHM=cFCJLRRh9>1e4aAJb
/cbu#K ^t\dBLWwQm*6=1bZ?/\>##cGnnW>:5!4SpbPS:T>YEtk!%pGPiKey1+8kDn^kXShLpW*X4@@@Vmk<9DA
=DZXA> uicV6cP6lmDmmFPWj<t<qnaYYe#myac8w5K^h\TecV=<6AuBJl#bQPc/hqFnTH>H549Ybjl5y<A1pqY^
L=CDH^ 58dQRhG55w1m#jP?@Iw?5FNQ@&$&H?wGLK$i5DBqI:%SV?j1@V#!QDKSF1F1=:H!R@RMXqTZ9YKXCW=#
?GeCI$ RA+5i18RWNwKKCI<Bt:P#EKPdBXNCKPe^VAwwuZP8lYPqVFL#E+i$NF#Hb*J5Tj/uN/t1<>ul/KD4lnY
uGK:WG 56QcC9ZB>S<dlNSX4p?dt:Kh5hV:m=pP4q8^wR=+K8HPK:n&&<FXi$hPVCdQE&#Glj%mI<<LNc$Z#9Pd
Ru8qZ6 &eB$8B?>wYeP1D<eVE4m$StDKucu%eilVC/kM$Tl&6A#ZkQN$dNb^wkG6/FRREGY9*Acc^!n!Re=:uJk
E<$@NQ 8l&<kcW9PPZpP9CL\aJeeLI\R8:5$dJKh!F%>=iDdDA@!$Dc*uW=V>XMuHp+XX8By58:6Z<M9SaWh*Y1
uZpa\% Q/Ay:AhVbm!j4eSmFGqLpR@pkQ6Dw1pQM\5XAa4&nF!%^nhA/>GnmW!MHDAJjIH?V<XHluG^%RwVPGFc
p>4GZ* iLKC8<!mL#JnJR<+8PQMYqMteV$VnDiK\%F^m9dI@\@Jd8EYljN?j!P\T?*TIKZTZS8pmMT!NC^Lh>i!
/$S*V8 hImATHi*qHR8*RmIhHe1I6I6Did:?Z^@#=!==n:ZQj@AiW&MSeT$cMJ8$uZcXwV&MV@XW55Rhk@VAPSM
tAIFWn hC1D1BAa^+cjHp=LAG8JTT9wc^P>lya%!Ya+Dh6*/W8ZTe*@qi<pMc1m>YpW4>bjGpGlZ&6>*<5VKKQu
!aS?qJ GN#e#jQeCV6#knc\%:k+ZQeBD?mENX/Q9c4+<#un9Mq*J98T=iDScQI=h46K5j=X&S@k1&q<*%uk&u*F
uWdty> Su6Bj^GH&91EZ@tkVa6585Vn1Rh:C8w1$i=BE=dHBLJEe8XZ&hC=YqNRN+\#a^yE%58dA6CdD+@TwJ9j
FLFHHY +kYVW4?eB^c@KKRJ68jJZC<$JFY^@HRimc9l1%E>M!C@4A6p*VmJ^65>uj=k=HZ4>4I/Byp1@^i84^4B
ZbVn/Z \V<w@p/??pYG$pP%?9/ek:M$n>GpAqA\wN%V1:yPX&ZES:KLP#BJeMe=Zei>eMntE!/m1uFYc=AI6Y/+
dawE5E w%McM>1=$yH#Ski:SPY#<N15p@jjH9>AlQFI>XX#maFBZLN?tY6YacY*CEyH&nk&$:Qp!T%i8W=cVHWd
5t88B# y$Tb&pLqRT<NkD^VPa@4yhmM445Q6K>bq5QI1<D?Y::VBIBbIKPn918P<JK4i6MW91haMQciny5#*?mF
q<M@EE ID=ZmX:&&KLqbH:SE=6qj+jQKuXAA<\QKMS$ea$=d*u9bY4tp5dW!$eFj<leLCKhZ/Z?8>elKdA@##VW
Bb/I*? !*HA@/Bm5GXIcQ1GB4?Iy!dC%dRtHjYwS=1Jd#tlWKNHA9K\4t%L9WJLeINPL<Sq/kat$AeBp8<qYF=$
W:y!:j :B/\=Y/tZp&9+A/KQL*whhDu%^^1+Y4hGZniI%*WF?G?Qa6&jLJmZhK+$Z5%h&<FlGThH?qH\VZt@bcW
KZi8!Y =qSPJupbD?b41lZyE\iin6LGhmm&WpI>kK/%9hFb!+I@9l$wmqR1HGll:M*I4KK%>HB/4XA<J6a<\XkR
j9e&Vw 8Pb8T<8a/<DuQeDStKTF\DY&1NHu#b*^YG?pt:9Q/B:u@PqIDDmyeP#&Wc9N\Bd\#!SHm>ZnYuV+!?w@
Q$cBET Atk/dGTIFHpW*<&9Bky:%kFWK\d>ZSjtB=XHJYNaD6#Tl4Mi6bYV/Seuihd=c:mk1<XLIbI4pLk^<$NQ
dt+kQD <?dNd+K=n891>KXLkCZy5%=*h=c+eSd<Va<Y+de5F5C9u%^duw8H/ht%94a:FZZ4P<%Dqi5Ga4MiZMV+
iBHdFV lb\5bYYeH*ZX/X=q^#KDFy@/9*<!pjR?&NKW14jRP/LqIGq8#Mt$8?+ZX=ZJypF*aLGJ#jCmVa4C*+G6
+HauJA Wh4*4w@#W<bji:TpaE5EabHAnm!DuEB$$cn^dB\?D<5cZ9t98F9neeKVw:&iGRH#JX8JWmhJFPa%ik5/
1hTdQn +tk5y*^eViAW6u@TyCYAHH$+jEJXj5LQ@6c>/Q\9liDLT!q?wE<EM6jW>I6MK#Y#D?pL<16kwnwJ@w/&
+W#iH: 5&j==C*E*k@#1lQnnc*V=#>uehyew=E>#J4#i>%+1!GBiwtJB#^XWY=yn\PE6?J\TZh\4Vj=6:!iS=@Q
ke4B*b mYTcjk&>hHkueQQjbLk+t$D>^$?Jc?MVFk%h4D>QVe6B@%Tm@Yel@&KW$:L8bMVGLl$hbt?th#L?PSBQ
YWDE?n cq\wS&<+%e@XSytNm9l%IuE9B89@W<!/djB#ml>LtMG+uTnpn*iPJeyIqLpqZ<DHmE%GSAmueiSPml4V
RM5&HE TVp!nYyV+A4y\eBpCmTIC/%B*Dpe%9pQnF6S5Wt5tqLqy9T6%:yIKuM:wp$+q/=%ip^!JQ%bjX6Ja?8H
P<epyy 5yqj6jTm/^m=J64ESZT!cCDSyZq#q4y@b&PK>*S!8E!>&lta1DbY@$>!YtXbTH\!=RD5+da=&&<<n9FR
+V^bH> *$y^ZaJh%IRh@p9T+H&d<wqeIK:Xw&S%NMYut4K4LnhX%PR#CW+9EV&d!JC1cA</\\BIDictBhPcKNQL
aSZd9! *iw^YI&Ie+E#YV5dM=/\kK>8GamDBGBNuFtehLReiq&Fcc1<J+AIQ#kbPD6n#ZAYAE=p!pD1Aum>e4p%
8#?*^+ #my%tHAa/ed<\hqj=HHdFVWu>AVu\H+#S!Y5!QGj4\=LXiyZd1VeD<4=8l!+NJH&VXjW%%G&y&=Q=%\j
kRR<Si 9LV/paJJeHh!9?l?1aNuyHmaKb/WjPe=#>yntW4jS+:<u4XP>jdWuBGjkeeIdJ\/$XkQ+8LtPi>F9@JQ
u?XTc: /qIjHTSj<QDl86Zu>EaKkw6W/pE6p*qqmnNBD<46#%yG\Eb14&1FXq:<>KJB<q*@B%W?51dnbS%qK5h@
-A618< 000d6ec955b001202b4 Page 354 of binaries2.zip
>:#i9^ 1^^FNuHdL\aDjqAy?Qjd$<TJAIR<mY!wmE1FkXS?C#W%P@WH4FFQJew@/$Z&F*FQ9PayG$5laWY=CJ/V
%>!GwI c\!4kBR:Ji1NWARYKGY5qc&BBBFiMGHN4=V<9PbVH$%#paa:/RQ^GA+QpQ18>N+i^J9e+pBPL?IX!YSE
NNdVWl &MHNBI%+%eLKY/L/6/wh?Ha&a8Z9lIb5PC9SI=\%uGMtKCw%D=k$1PYqtNIVtwaNINZuV6cN:wkAeBwN
!&HiTN /&+<G?VBq^\y%1lM4mynNy<mWTpi%yLH^<ZTYt9+LG1#?L4Vk<mtt95*t/*nM:WP<itid?/@Wl!hJ1M1
HX5j%w bcLSHn\6=Bnmc+=C@@km+CF@ujNyQ@lBnDQpNe&lD&Z/e$h<MPVm<QmA1GFHTBtqL4LkYm:yu4aE8tJ:
tn^u?/ uq=j4h\5wL9^dj#nT$Re&I8>YuqRaj=BF:<\!yE<CI=je1PMWF5c5:H\HE$Bl%##q^il<DwBbAdX^C@b
kT6QpJ hF96PF1aiPDXHD=%Q5\!Q+D?D4<?NPMhc%uL/KS%JjY%\dE!FSnXEHR>!u@aJdmV8J?$:4SLW$jnM8yn
weXHpQ R/It?GqI#XC4<5WPnb%Pw4Kt%WCiP%I=*P=F?XD8+CS$eETtcIt<@AS@iGk&e95%IPj?BFYhjLhYc1w=
<tnPKW M/pD#R%FFtnQ+%$$E%11mLHCPkTtk1/=K6!9p5IJT6W#?8W^d9YZNwB=B=mcV*c16/B#XJXP+PQ454Ep
uID/yM I&N5dyh&ZJeH=#hM=/A*BCAw<==I@Fi5FF=T$Dij^$^kRuPibw@pwy8!twNp1&C=TicE\u!T>*#ydkhK
q=6t\9 =?CWS!\Re^cM^!Mp#ICp+au1Y$Hu\CjDA8Bc5EXy1%kN5ZLF9nlXkhb^t/yV&EM/T=*XA8m$T$ahA%G+
uCStGC i&>n$wF?ahAkP#!pbX=6>DMqucbS^eQh@<IiV?$RZ*1bS%$RC^@>:=HGH4?nTi8Qc*ZBN:S<Ct?uYwVd
4laKKX wkud%RqIpwHp5l=cNKVV8G8SpDYBbELK4TXB:pq^hV!<\*6N:JJGK:tBQJqGnEXyk*P!84AnASAS>l@S
:NCIHy WQTW49#NWA+5LwFwWDcNPwmn^ukMKK/:6PY$@b15cKhJIZBl1Rh8KpZ#RiH1KnQC*uZqCn#S6#TcKu6F
$mK/jP Gl9=TJwX6eSV4lDbm>lbjcFY\K/*Ala4$:q8>C^c?%Ld9XZy=FE?n8T=/@M!XhBdjRp*<+1n4NF:@l!&
IGcFMc <q^quhI^ZZc^<^&<Yi?+Vp6Q&\*&TW9XRqD<G46!lD!IbiNyd=8mLlb::y5tKIP^FFKbh6@c&LP%GwM<
uhEDm/ BHT<pX45aq5%>&*NE%L8%ktjDNSyjk&<euhp>qqe>mSYeQTS<uJqqnVwd:l%R&\NtBFM1FFa/WT1FMi6
I/<Fuu th$QTM<NbFV9iI&GTQI@kp$At?NAawdwh?NFY>8%\Yi&d/6Z@yT&Jl?DR$/KLEPG!K6@@ieM4^/9AjA>
%jwH?E KIidM6JMeCib%BqiPTHdRyPil:k9qIwYPc>K8k:tj%X:!=H+?SQyYwF/G+PY%WD5SVi6uL4+y5:Nue:B
4lwN=i G>iEF@B!\RHF?LmeMQR^/!\m44QS1I6Pu$ZjSH=HkF:J&$AHK*kWdeEZH8#$!XAaCk\*XXFMN:b@I1Mj
hHSDb8 #Rnw5iKnSXGXJIJtItJLptHm8^St!8QCYaJ!:8Xn<Wt%ALHRS+PLbLVWYa#5pmm/bCLC:%XjZK$\iYT<
MylWMM W9NZ1@Z+ALw=Dj#>?4WlupEYp&%eR$%R^$Ywm9L=wMie/ySZd:uwi<IYMqH!&9n%mB*5EE=HGhdbC#6?
R@<=iS Vp@QycdCc5Bcq8yX?dAGP&d6*/pQ5ZLIP<D=Xd:PutFWtVa4HC/!q&y8G^i5e?<QQZ9wa8Tj/&BKmaSE
^PpVXB *4I<9!kP&GuP+LD4ij&=>==bPeSJw56byld<um:Ga#I!Pbby9y#JZikw#!ZD>5CWi1hQ?m^6IQwe49@+
VtFKWX 4R/NdmTDmjGHPPPPkyTw*apYMkkCjNH$W954$hpZMu5ip>GZbFeiD%:4tq:q9GNMIFjX>+MBJQV=+IMc
qGpmVR 5?m%VFVeepqNItAq4Xu6Q^j>S^\dQ*LVPXN?<qYp&TRT5Dh?K$#4AtX1Ld?V8TQS6QXG4I*uJKWK$aIq
H4uMhd X/u#1LDma\GGN1B%QAM%\Cph+Z:aP%e\Zle&$/AEJNVtbD6bQ>&By*$#:@jY<b$tZ&8p%kFBp#d%&$tD
C:WPEX /SV%N&i?68PqTtYhW8K&SkqNhkt^9yTa!Lq:P\GX!dGEu%TSAqP^#Y=qM=TE+QbT\qJjTd<S&NbWEKRa
Zc<SlH 5cMd?QmVH&#T!b:lqhn#IMiw9jT@TnV*TB/58LG&@1$6jjY4^%R4Hd?&nK1%uR*W=apQkm@IRB+^1>Zc
DSYw\9 Lt:#<5=cQV@8^Zjmdea5&$\8CS9?%y?pEFFWA=/:+Dw=WiA1k*cneMFA$T+y\HQc@$!Bp/bLPubVXtPi
J*N+Ra tPi>u=l?WCNy!VYPi5<K^%$!mICGtK\!%IdW^!I9+#uZS?16SPSc*GIGln<LP%JZaL?PlCQ*llD/Mu1F
l&#Ju: w+ySaa%GL:41I%i\Tp4=+&A<e8^/:$dASLXPa=T&:T@Z=t46pe9K4NdtF/a*9SjQipWy<:p=@&u<\NNa
&*hn6D H=>ct\m+#Fe1\GPtJee&#=\Y@YiAA+ue&y?&6dTw@R:+kahd^/Q8D%wbeBWNXc\ewIB4!&cV8MN6RBqW
nc&KRQ 9l<Ki!<P&Fnuk<=?i8KF8%QV?Ak89q4%iW*Pw>&/?m#pK!n/I&/%:Xqi<P9HLGDYXVX+ZSE/Wl&&4Ly!
iGhRu= HhS!LK+u/Nu?%#8caPFG$T6C#?!ZIcj$nqjAYQLyG^yXjXwVn/Xy*V4F4/IFl6YHk&9XJC&+LjJ:ubjK
@Np+>d wLYnF/QTdwuN8yyyL44pc+p>=VmQ@BjhSZ1yJlwE^?LmElIT+9>*SAWZFaPL\!WkWEtwBFSCAm+qIR+Z
<?nWEL S+tJT$nB1<1nny+HdBKSD9k*Q%IZ4XlwaR5HTaM=9G:/RCiLAdS\$MTDyJL<IP*HKG8=@NcGXD^:K9JR
B:hLNR DeV#8upc%n=!SVMuY5Z9/9>wRT=LmDtX?B8#RRwI!1+VWJ\jIc/t9wG86Xl4L/+N1bC4ayqm$RR9!DID
*jpZXj Y$RhtQpd$*yTkc4wpibIjLWFbkAXLFqpTNH8Q*1ARC@FE&BV!6Wa!lX@bX#EM=PVqu\KZZ9/TY=aR#Bk
ay<<yS IJHYqISylJcbe&pEtwSqGetLGe?jjnLV8NC/IjA>#QjFaLFe4I1\4Vj@yNBCV!DqmCLek>cE?kMXI?kT
hXa%6^ <MkqT4/knp96JuJm1YFc=T6*bIMVTy!<qNNZ^PTpRJ*K+9KNy9!ZamXhPhT$=m>cFc1WiX>lI+YNGVCH
Ww1<DT QYk1CyI!:Ly%N&jTB!W4=QHc>NL9<4FiVYKVX=>Zl!+&hc^RlP/?TtkR6umeWb9bJ5SMK4*<Yqb9Wp^m
W##qWl 1l+Pd<9u#9T/nk9n/G?W9dPbppR6+R*TmPRP9@AjMXpJV4QTF%SpHQWbYJkBFj6wDeRLcNku6cSm4&d$
QG@&kG lhRy6^$E6+bEE$!1hQJtBZbDi>Ck@VduNt5ZKT>kuey1uWeZ@:*u/ZeqhbdGuAN?TX&D?9GuZ4Y*n^1W
WaM=Zn VMb$YSL1tFc%kH@tdGb5hThYlp<@*Mp!t<5$&DCJ64+XKBTdBym<!RVQl6iKht*IK*%5WXwmNBuaI>5N
$C#YLG /N1G/Ey>e>BVlQ/G>J*Rn&<XI^J@ZBYiLVH>qjIq:>tEA=it%8Vq/u9FJD:@EqiY@$DKbGaVwkJ/>:jy
LET/k% \muS/AM#kPJYB+we!5/\aZ@>R&!9*M?1Z>GHV1TS5\@CkHiRn\hHkRBj5#wiEc>#LL+i1%y1iVB<^ED5
?a&M4G m\R#d9MMZ!XctqIGp@iGT8tDQ4JW9*aq%<?RVd9dZ6D>?dd&=#CM@tL/pjwZRE\%qj!N&SD6>\H:l6$P
ABGbC& ^C:tc4+tRW\WHNjq>IHeYNDiS9k465yQGtPWGtHuWD#?QHykp=pGKKLX@uSwdZQM+8ed%Rc*F!PTya\J
hKV6M^ W:^^S$E#59C5mWjh:Mtm\5<+DkQBV@qyPJWmh\WZpYuVApWw4!m/eBw!<t%eNGLm$SQ&#9HHVE&iRX#u
H5/hu& i8?GJeE/6LYl#8K/em&mSX!@aP4R#M$c?4EQCSi<eQi=kby&EIMGm:%?VbnSqQl96n&51>5+:&nj*cyw
5a?L5b cm$9$LXZ5Y8<AQKNNESp^M6=5uIp$ikBqnZ^^GYT*1kwQ8k>Ru:Aicc4YqyiEbNP\YljQDBFdjnc#Twl
V6wSwW N1B@YPbDlcp>tP&#am=uj9\#Slh\&qe=TFpM1TQH%&CTQT1hLEYYy\5\ID\aZ?c#ynJH41Gj!M?5X4k&
4KRCb: F=WZ8&y4SNhkG>+Wu/kdlelWd%d:=^:4\WI*:dD*G4\c%6^%VPHchWeMi@nVhn4iJcqkjSucedDhuCl@
M>!%H1 K^QkI@:KMl<BSCSYj+t9*<qp<6yeSHj<+%TY6PNT<dZ/91dK++F46i>H%bm4y#TqS8PebhLHhj6<H:ym
n9e&i= cYRt@i$6/L=#!Z?tueRE^TaI^5lwnlAiGMaZCh%&61*=!mSphRYF*5/JV4XjKuGhiVda%#&S</cNVjli
Yh#DQ= 1mZG?>nShGljcLIb1?45M&%D<C$W>+mtyEK>Ne>q=AW:Q?FF46R:djKLR9nJc*uhLjq\QiPtEmKLW@w9
5eYT&j 5%d\lK=i9/mpYp4iplVK+VYT:j5EwX8SFC<=KNpWiQ&FlKqTd$nLHMyCJ=QdTipP^Ln>M#kVZ:h6tLn9
&bMk:y W:dMB*p=S#Dbu4l!+Gd^iyemLPP<$yw/twaYCLT669k=PDt&45uuHwjXwdJKWEeqZH8Gc+5h%Aw$/tVH
WF>VqE ck@h?<yC1ye>1?I<pq5cP:V^F1d6PL:BWu=\/<WaGyK6X?5*M/quY@eM1Hy\lTHbj&65611tWl%#h\KC
SCiL=^ >%Ij=aQn!lmXS?641YR=4H>c=N6QKn+=@T^5@m/1lAjGc^>ccE=1LAG^Nd9QyL*yenqXpJKe>GwXlNep
w+1&PJ i<ZJKG*5qFtdj^C+VYIYcqN#FHVFRLVNq?9cK5D<pT%JDt@?RGu6EjL%Aa&p>c\<BRanhM?@6^uT@Sm?
>uni&c :dC$F*aP*G8\i>:Yt/$jy6ci6YN6=W*N/Fi!&?SZAZQet&&?dTX4//ybeDYq1<ZG5#hn&JmPM<y/&8^>
l:pmRK Y?TKIJmWCRd:@WGZ6N@PKKciPw1j#*uKnMW1\64WF1WRt1M/K&G:?$%&C*S!XXadQN/n%jSPl8V1HjA9
i4S*SX CK*EX$E6RKeqKQDmQDaZItp\hQFiaNlH=/hZu^FlEBMQ>Z8nqLkS*lQY%Kj4$5blFZ?V?e!jGCy@J\e^
=+W*H! Qc\J6P8Yp1#bMF4=NL488C4>!/qmH8BLT1AhtFkJI$Xjqd5#>=tXqYFtj#/><mkI/bNk^bk58AlC*HXw
t#Spaj 1plib1yF5:bMiDAnIuy6MlHS/FN#Skk<i@tZ%m<9*^Xy!DJq&SR:>F^1c!q15<D%6=n9E646RuBN?KAp
Lb/*ik LEuJ>Pi9^@&Jl=htI6yTVZLGZ?<n?F%E*<a>a%\!iW4Kq#<Mk\@@IPC$K+iLA&a>8w9G4SciJtmS&wXY
mnE1KC A5ji5!aWqScPbqdTL+?HjuY8>$n&Ft@>HlXe>G#y$Y?B165#nH@tQF#@$%6TSG=&^4l5QtE8u@tR?\Yh
+j+LWb Ed&1DT+$T+?l?k>1WQK8CIP54P<tMawy\\SGq#Y\Q&VHh6jYXpYZScl1B*i/BmhWN/hF>Q^Z9cp:6S5b
5KiT:J SYndRD44@QjS>K+&B&uZ/ey/C8>>lWQKMV9Rq4RL1PCKN?C&R+bH1RYeR?eZVSKyd5eCkH4X6Zn^8R+<
%8<L&B =Zl%j=!tR1R=Sn=E=YwulRudL%YEjCimVLF9KAbGM\BR\Tqd$:tPIWy#VC*nFj?XYbXX?$RI=KM8a5qa
-AX1N: 00036a1ffc3001202b4 Page 355 of binaries2.zip
t5um># V+k$QjEGcah^c@^pX!qXC>%Pl?@uMk14/QMS>mATIYC+*Q1JVewqCVtqA84Cq^DZVTE/hp%??t<1^Fp\
pP<aQd tyR4F%S4qeA*T\*eXd8pDENwmeTGp*6Mp\>y+%eHNG5Y9b>Z1CT<?mVe@\/\4cQ/DnD?::$Kjj/FQtW<
%$IY$I ER&uGXKHEHXT4=GT?<GtqGa+niMpmCTmY:SwbY1e=dS<l@B$M%iAeBKZMF9*mHDLtXl4=dKPAb!MpXHC
CXV4nJ Z#\hTIkhT+w$RC4Q<JQ5V$#Ly4kHZAFby*kX*KL=F\H:+^e1m$h85$NbEFBne5!@tQKDb=jDLJDBb^CY
\ktqi= ?Vl8whpm^BHwt$NMVC4eGSVlnI%=yCWIJL#BSbm+A\CQ\?GXaD@h1DB#nR8d&I^pP$#1^C+W\!:Q$?MP
H>WGCG kAwNQJT\4%SFGBDZ:1>PVyYHw/eHXyV4d:kTeY4&DH+&N$RAM!!//y8Z\TD:h6M5%m#N\WN+YXBpa#/T
eT!+X= N+*#%&S#P*qc&1$!<9NXTJcZ*RD:m1$PM#>RL:kb@dZ1A\?JR&hcEbSpINp#^ZXp/lw##Lu:ePY$j\JP
4&aHI6 /I\NiPeW6W#qqSd9ya4CZ?G58c#jYK+j<B=pXS<Y9llCqAki*%N$6\!Lu<W/6A>9SSN1<m!16e#WZCd#
L69lm9 Z9:RC/J^cHH:+/GGA=<ZiW=haeh8byFG/B*P6>i8a1N+1:\BBWth^SiP$P9C!cSDh@J#AAWtR4hcVJjY
A^hj86 yn:+lEn$uEAhVuLA9aWiF9:$TAV&9FwLjCSdV=lSY9=T/pS\p+CE?Y1#pbV>m%5@LPa1l9Ji81pDn1$A
&H:wwt q<wqyV8?=DKDPQKJRT5kLilVhM@bdy<h4TnTc*Q&9LZF%TV\@KPaAB&jl=C<E6XVVX9=W4TwD!LTRa+e
jnalYb E@M1BEWG%+QVDEIm<?Rn1ZWu=^KdwWN&Aiw#>Z%8*TuZFS:pm?JeuTLe^51DiAMuL!A#?/I#eb:8iNjA
5RKBQE T%mL6$RV6n:p@Hn45M*V=*Wc9@waEHIhFdRa==jMBSqW!?4jN:F!q&&B<I5REB\FkG<?cj8eTC=&@y8>
PNyEM< PCl!q*HdjmW!L%XZCB%!jNTcFPF6544aHVA#LJZwh$ya@<+iD>AcnKV!KL%qW:uRMy9e#XJW1>jqAdRk
TpcFZW Z<?pwilE$MKNwyN$Plt!TSpapcR\dB5$LbZ<5KbG%T*hTM?ihyBEy=FD*#hXDDB1CN<!kcNQmRqF\!ZJ
^4ReHJ d<NA4Ih^*kMa@uFVhj:LCM!Iw?ZLBE*+@6M@hCP:W>+KT\A#:%uCK$%F:&XD>\ppkEeJ9c=<9pM<@+y+
cpuRXB Tjk#NiSq!/RFpEyT>+5Y5FQ6lp5tDaQkSQS:<Il^GeAe1BVdu%y!G6leWa8w<9FH6KytQLh\#CLmt4ZC
w+&MeL @wP*pu4R!buZQPcuAAG*X&*HRmHKTS$L$mm46SI^CR+8aLn&T=PImu@8dl@n#%?*VjNQH/+BkEN^Gu<Q
^YSPXR 895w?P8+<eM%yERtVQK4N8\TRL$Vuk!DY8FFG=<e*&PmG<PJ5kb4eL@FA+^mLKKVT+Th>MCSa$CKYVGp
SCCRbu Sw&klnPY9?J8/B?9@%>BNhVpK<+&/w=l!eN+abAZ?ue+hCGet#\c:$@#^cinNDW%PETC?@ZpXDBCV<m1
PcwALp E$C>4V*Hupd>R=nnMbmQStGb>Pi+k?t1VIN4WNBBI\Rb@Kjntb1I5w?DLjy^IQ*<ty4Yw9@YwdqCuw%k
<N\H6I E9SXtAYqSWP+SkAht>>><18n8?anF6>ZaTE?G1eW?nAJitP^j8&p5cFBZSETYn8<*VLZuk\Dt<pGFu8K
K+neK4 !Vh8D#>w!I!dc&!ndanwIQlD9mFw<&Bjpne8@\ZT+:p=S&C4L^^=:^4G:p\nyWL4j+itBjwS8kVEhWbH
Smepuh &6V:@dFAw$YmbIGZHq$PekEQV!8NBF=yJnVh^:<68jePZ\@bN@FTW\^t5LyJDPI+ciY$Dih$9=b^QLeR
cW&1!< m5LMbhI!pD!K/M68MpJh<6p:C&d6DkBEu>bW>1qhTGdy%I8Gp&bi!BTSGiJ*@CZuujBP/TK?!Hnn*+:%
V@V!D: RPmA*+Myt@N*hTt1j*lZp%Qwh\G1@^T$4M#6XV6=JIPw/MnAt:HEE^wcd#tBGe:^QecRRq\p&l9FHpeG
5cB/F^ Xb@FCEJLGwqGu$d?IGypX&4?5#Nm$PX$iKwc$Wb/\Peknc#ak+=tVei>SNm9BI+QDGA<5^&Lp1IdZ1CL
j#P\M* :Pt\d^tN*pwl5/^wVam@5?c<I>!j5EZ/&ckwjMVkEQk@<+kQZCL*MmyMpFZQXJ%wQaCV4mw*HVbVE\N#
BESIL9 d+n#8#G1tZ9+EShG^!qCnnZGlV?>e#n:t1P*Sd4mmZ!Wu\A9<\HZHQc:jT*4SX&>JC/NL+j\>yKI9*M8
C#tGL! jChe?//a#*G1^deVeTDML8QGLYIH+\#4$+cNpJJW&GCVXK%GyW/yWRbnRZR*4+jKWHmu*^lbNbL$64SM
A1E4m5 DDpZ>5XtPL4q96e@K\64=b*^^?tW+WI1\Mj@JkG:&Rp%!M494NS8mMZDDQcwK#SB:Xwq\h/&w:Q5HIi&
aRuWW& kqNZWcX#yJElhE>6b*HDJ1LikwVyQZ%?a\Bymhn^pjTtlT:!:\mb8jJlu6?yL9e=LQ:ATTHK=QMJ@jBi
yGp<iA W<&#X?Qp!V!jPZ!E96HAG=!m%pcMSmj/$mZVPtajJt9t%P1:Q@NP@K5\#N6H@HeTV</y!H\W:i:HpwZc
JDE<&p jA9PGD866IyRT6<l5^**c?pj^MRc9cZPA%Sh6TewDKR$tJRV$Xj@cX8je$c%Ju\y6AqdJjiR#4<MVjk!
@KCT<< $VLpI*Rbd<Q=C8GET5ABm=nuwWe#V4YNPQ^y!4^^5y1Jqm?tbM?6Rq%LKntNe4lS^Ew91b\h5lutW^1l
n&TlY: IKNn<8wLHWS&L@VcdhHMN!<N%Jmb$D@^ljRAq@Bj&yjQEV6p+Qdn1\m:VlRHmbp^DjPG#wiQ*e=<BTMA
n8nVG\ MyLKEiNaRI>LW1YNpuMqCYw@I#WT$CVTbTcHPmB1F/Z/iQyjQ%>qj=B!9Jp4?eNM6p+I1FJ1+MwFS#+S
pQYwiL 5<EG#DtbRtZpZ#\uuChJ/5qKcBLy4jZ>?B^%$Pw98A\5TdBcXC=%9wpVZdGY9LpLcPZ?y4eWuHCV+/$e
+\=V:M Fl6%hhPmwa@9Tjw%9EZ+eqd\R8>6bCaRuiGIan&\dEPBi\ZWb%R=nQ^P%hKX45%Pln9>SMJX#1Leu$lj
wjRj$+ Tnn\p>m<?*DbiyA+K*TIG9HVh??mqP^ECe?ZSI!J&%BKTElJTW1IT$yA+bJ\Mau@?%ABqbKCRcZEJTRk
uL9P8* @@ecCTnja9CqZX9TbCZtnPuZ6bl#?:TVt\B/H<!Sl%8Wtk@$&u<?1@/P9c%p!==uVJQDu^dJluYR@mC<
pqYPWV t#TJiPm#R8>dE</A#LVaYq%Q58+BaD*e8y1RaC6DFHRH8\=HN*1e\WM:HSdBXJqWVD&qeQ5Z+NSMMw$Q
9:l$el =\JbDJILADHbBW$j#Ly+1&+t&=!Q+J>p?AJLJIyIZ1P@wu^<8+kJyqAWM#KD?!INkF%=%e!ZcS:t$ucY
ww@jb^ p8q6>tm!8m1*/kt?=lB9ZhNXtuWuuwDP5bYc:EVB4=Hda:Y%^ZS6yYR>:<XcE&/>I?p@lJ*w*HtkN!j4
HFS/Nw YDGdp:SBJh9#jLhXpyFC&MaFXQ$i9cS!Nm<K8u^n@5%VL#9HbH9:#CYd5jP1Vh=^&&*/X$%HKTX/*RTm
PBh^Iy ?jV:mE?m9pmjT1Mbp\q&CXjaWNMYNQLG8tYH=X:cw9pJt1H:dAt*Pd6pZ8wLYG:HVNV?:He5MFT>DdRe
kKP6SS uGj15pdemd4aeV%CZDB<CZjBdHbwjcCkI/aF6H<%XEn/ZXD>bt:%qp^+89q=@jicHqGhVJ*AGJSW1?by
^b!<<+ =FBpW59p!HP\K/\C\QKqac^%=pD1JZ>Q*<*iya#H*wCZYc$1V<j#i@!c8bLi%LR>mPqp^/Xt<I<=M@md
Vd?l@K l1C>+wJuyjb8Rld4u9V8Tq&aSjKY@IM9BCJiy%p<$45/j?tihdX4JiBPNtSpDdqi#HS?iRZZFmkwC>Ke
j64wK$ qRmX@1a94:ICZ4H+l=bPD5cElwYL$he8BXc>$Y:V4\H?<1J>6&i*#:uH1Xi+mB/pj^5%J6E94p/ai6S5
@qly$d 4!:@6Mq^lbR^*TipS9C+NYV#T/n1*68JXCMJi:qq@R>GDn>RC?#RGSQG*>bG9P>?mD9MNYjbNutA&y^4
Ae/JF/ &5XJcb9PZ<jQ9$d5^KYp=kGAI:hiLEdwD9IYWwDI6tAlLGD1eS^WB$9LJFMTeAh+>PtNkqI=I>l=P?=p
=VcY@V :wiwa9PR:j1=YNN+bip/P9*FdGR9XPp*cZk+4Re=qWKhQw6WkK94ee6ww<QtAkiRPLMEQ:#tkGb>V$\=
=5:>w+ +<hLnySF#haKyFywDlLjwyT=Y$i#+8bAcunDcba@XcamFmYeywG#:^qRPRlY#^#:W$ZjjT^iE/4SXD4^
uXMyP? %PCZnp!h9lI@ZnWlt\LW+nm$i4k>dT^^WqepRiP=LJB:YNQJSpj\:6Wkue&ZS\4l&Yt>chM1&TGbdwAb
tt=NJW wDGH*AauIWA\KXA%1=:8Edwj/$p=G\%9hDHj/jFi*A?YJ6w9%kQ6?=IXuTlMCP>51qbEu6c4hSLG@YId
b=LTST NHS$hc=uF?@qbZ1WDcVCS\>btbDV^QCT<aEpGl5hZK\c+SKX4a!RI48L<ul%N&B>%JPj>etc^/9XLWJq
cEt>m1 $PZ@cGwCE1w4J8wpkKcR=aBIy^>@ujZ&ulFM5=t<w+8mZXk8X/E!>WX1d!%Aj^+acIbFXw&$njG>ekC9
R<HQ6% :d%&85/6b9t<R54n/qtcZl!e6>btum>pZ^5ZKn?:^%T!HV5i*1CWy/51jd5=$b@l:nMdbX^TSSC^HL65
aq&WH9 Qq6QpFK!@%%j=$Rwm6PdDta:91JH%PaL8Z*55yQ:T/dTc=KZ$5Xn4/BFL/*=!&Rp/YKyh::=@R6WPacA
ZY^58e eb@\i$Nn46&5!#9jDPm^P#?>6Q4ca@%bZ@%+/My=^&8$Z@:*?VjE6!k?#LK@XcNaE&!dN9jLVE4^NGYJ
aH9KVb Jylt#hl5RVBP6tC8QXL#k!y=Hj!FwY9\M86uZqK?C$qB1!L&5P!NlPLWL:wJVD\CBQpqk!1P!me@Pbw+
hm:#pn iuBk%aaZw=p9cwqWGkVt!+a4^mML@AXB5*#LYSMDVl<?DLnqyJjJeNh@t/\Gy#T**1e1b>ZS@y#^<w4T
Zm%8y6 HZWVClA%:cKHjm:Lm4q@1pZG@q%Qw:/lT>y$?=hp5jedZbYyATW/+!1MwkW^=51%+IXDwBa:HW%Gi<K>
XJ=d^G kmQ%j<^@Z!Y=+ch*^aqj:/YiT^S#i#^uQXK86y6GY<*\nZZ4>hFGuC@T>1+9h@k#KKbQ#=!@/XeK$ZE#
q=l=\W @qR$NFE*%CP8Zyc/>>H@$hSZA1:HTeWGde6M%k5E$1aGVp6@dG?Q9uWCuZI<hDI4$cp$!=XMtEQ\b8D9
%>6Y98 &E#+4*:j\SH:SL%mkSi^5$$%&=Ea@:lLA9H9hywPH%&n&m9WdhZcdp6B1Zt^C\Sp@j?YBiq6^<GS?RWy
:iLbj\ 986yQq=tEy!qypNjYKttuA+5+\TacG8!!XqX6#c?mPTMe6&*6ABBjdRHK+i+?!Wm<euLL:Nm>C\byDD\
ad#:AN JYJaXQn=S$h!plJy#8V96\*&Ze@VG&lESZN@=@4m<IS19FQy<ydbQ&AVZKRu8mJYCDi1Je$@Qq?A?D:h
BdA/G6 VAq5?DMFt8umGiT!JBa+Z6GGqX*i#n!GQZ:nM\#e><9QYT5PlE!IGXC4M1%TeXuq5jmTQt+*H@SXFKbR
GWTt*K GG^9N4d4H6>e%8JVGct6+j%m:Y@$5*uaQbyLP*@u\^QB#6PD:CjM*AXw=pYiqtk:maC9*969>H:PTm=6
N1YtAB d/k&:Bk/#>:$@da5NJ9@RBjhQ?ad#?qXjb*%SmD9=&6H>wL/N1GnPP5Kn$6#^d?Wh*<1&K4%!ibaawdh
-AnHRL 00083459028001202b4 Page 356 of binaries2.zip
4%/W+S 4hy@98nh&B+nT^6u6@ty!!<5?M4*P%%DHelLJ+4LY?tQSHu#S?I6!jyj$955SXH@n6#QE<E#F8i:ykVN
S+FHGQ @>\9<5m\Kcw#D#^YN4m\/l>4laeLD4dNj$XAFmFZcX!D/Ty?/XF?dSS>Gb1hkj%d9bNqcX\L1NyDGeX/
:$JlM8 tcLnnHQYqKP5lwR@Te/e&>X#QTh&ZeN!ZewP\C1N>*kV8kqd=X^wiHXG=&VI?^4Wi$4@h!SlliQBquN=
^JhH8R \Jm%5YEp1GmG9Nb8liRuce\y#:AeiZY4nSP*n6YRLPuVR^iVLnIdD:IjSEki@Mc+91mp1bPBuQlKp9&u
+5FA8t wEb*5ty5JtwwT>BAWCDwJQG#u$N:p8jVu6QN:nPF#Lykq/t?pJVniHDj8=BbjJ^k6EkHIK4dMMWCSl/Z
@/L%*h WSMX6H@ZmMk/4wN/+AJ1KQHPHjLNqXZ/<N<\CJhqE@i:uW%eK!$#X9bh%?SiWPH>JGHRA&4Xn>@>=@+j
16<c!H M=ZZ=QqMhjtW&:q@E<p=1p1Z%uM8ut!hRd&pM&tYiRSXGwZMXl+ASbE>Iimeh9c1Ba$>9>m*CFpAl+!N
41EV#J &KHF=neASQ#S:PYAP9Iawjc4qGN%Au6m5mH:RY?T?IYee8Sc^W<\=BqH@M^/E#4II=IK>cja5T>*=Nl$
D/&l%p L\GwQZXL%yq/<JKPwJn5Wwq!V/=RBT>NB>wZQ$84dkh1QC<<?$6F+yatEHPH9hH=we\AqhuRpTtadHye
$!HV?\ Z*YqTj$y^c=\VAb<Jq5+^d5#hS+KNR1KR$Yhm4Bh&k\tWq?FSEmStnJFJKTWP9^4RncqKCRiT?yk9=GW
k&Y4#u GtRlPj>Bj>$CST*XjptWA!jVH5kB*hqWj<\4XG^4P4?G^@Pq@aTtQ#$Iedyh^Q>HGSFZLRkT=ZwW<=EA
6F?BqE p:VIVRe9Q:RTJdS4aImAAjC<YbMebP>I=wZuGPKX>yG&BY!V&8#e@dB>Xenld:cE1qbKCkJXQ6EKqh81
$INnbT QPHy*FpqHcBL1jkbh$PLJh=SeELN=<BV1>R/ZMLIuXm>j@=mH6:Xj/IXSKI6VR^XCH5HH5uDD=Vi*+uH
=B>q4@ A%JkVudyK1>$JL6lT?>DB9=/w^+EI%KulL@\?\!P1>*kA5TXFlqBwN9V6mjl>jikM@u4=l\5u48G&<S&
VFq4jE WBjt1t6JJ86H$1TIFulJ+V%eEB#my%!>I%cKDHXH?/n6A%6XH?u=%IbkEwj1RDA<qj+%eIalue9Ad$=/
QQ<lTb +VIYwekJ#4kpVZklEY*J!=KZLGEBMZdTC4ceL>Y<K94h4pKm6J*>^c8^::ES\dS&kcjky+S%4DDcp*Iy
lM!Clt LZhR:iK$^5VRGMpBm!c*n5>^:HBSH6Vt9\\kiTKlB8iwckteM^!88L9Cc4elYmVHZ+VlKhFRnQSR*PFn
@iVjSq ^<1T\CR6IZEtWS!KuFH61Fd:GqyQ*qahn!M11GSjdKb?C?GdYDQ9>CiKb<Q<J$ikm\+1>WM:kVQFp!5b
@m4X6Q D%AS\1AubSC^1$9X/ATc@AGMV!XbkBnE@>Dn:@#nqj8SL8tac=t#mj6hJE^A#ei\Y5%=#PkE=!:P>Rin
ZtC%4X EhCwInk=YHP?j!+%IY1S8jqeD>RVhR+Y8^w>LqId#9W:jIi$M6pTPRj#qWL*Dq?+^F4byy8:Bp8YhW9Y
#1j+c= iyQmwV4T1CeIJwKYnj/L>dWk:$=MRY:I#b9Vip%yLdkhJ?A$iuSEQmMNGGK*%m*=G4?19Nhly=JHYX&F
IGB%!t HBeV&1&pHjiqNVnSjiEnGalT:*k&@NnA\WR\*J61u^TJAjchZ*ZH8ui*9iEk?$E^X+DlJdctM?9bb?$Y
D8<hc9 VRdSyQnidGJIlk&cVeT>5KXbY:j^pYTbFW6<6&=8c><E@4m:8e5LS=5%<LG&JqmE#NyV<e?E^=G*uV*u
^6aIdT @j:5dNmB5q9uJ8PSwyRE=H<TlWDlElL@t/JRKPV@hTA\mPV@iElKTkI6%6uR*e4Rh%a6/W*MQ*HeX/Zw
N=bDK\ IylKCSVaGyF8%pu:5#Sc:IKmXY9!i9kpNLt%L=&A!>XmqERq\P5pTQ>eT%h#ISWX9nLNZ6cKF5>4<8>^
*EFj1? I>L$MGQ<n^CcqCNwJ=QSTLHDM^aAtBhLC/FcR$qFJ6#aDWhy:PEZ4&NNwR\6YhLj:I&#qMnkIyqiB$cS
Aw9AZ! XJ1EA<6LqJ=MmbuLcdV4jyKtLJ8lT69dAQyERyaSnTeBEwp6@S=6Z\pK/GqHDAEPLA&y=<BbG\=RI6jY
X=Ryn8 t6Ki=die#Nm*DiHEw>#4W^H9w\\Z>Byew5ZNRkMnH<MdQBBLRdK5leVJ?Q$Fk6/N+=RY6h=TJbacpRCB
Qk<nIS EZLy*%!G1@1%XKd1Z?$/HL#R1>a9tt!=*ETcnk<Wn1&SijbH/9qh*CPKa&c4+4Vl@\w11^w^Y*\y@ERj
md:4&p 9l=#LqECP!ZNGKMteF!pMl/Cwl5C+*V!iwIDRt?6plSu<lkN?c^Ra:B*>h5AH6w$@@i/6M*JC+6/&:JM
JBhkBk WYP:4\d%MC@WWwEWjiF/5S#mCW9J$4yT>FXa\hBkEETew>TdVF&1Niw!K*jy=PwDY!NKY914!E/jHGy?
=#A%Kj #ymMbiTWj4t#D:TbLLH*>h*uXL4V4qu/6*Q#hY<qKtdICWIt4\&C5R/N*>LC*k:@6K>:>Ye6aYjjFEuu
HLSHY@ LybJ&Je>?SiyuatV>i9@qd1i@/1c:%6&GYb%k+\QIVBD%B?Cty#M/#MV8PTAYXYS948$>kKKXe1Mbyqa
8Pc6C> CWw/CP#>#h1J!F/mXwlY&tZI$dNcywJP1ttGLJV9mJ=<i/=qP4c$WMLBtdR!:ltlYnTLM$A*V\%Mk14F
dWaSH\ &h8&N#CKAl6t1hm&aeQ?lGL=cth%\TGpZ5LHcdXLYPVDnLJ9jmFDlH8$b&\ejpncKJtynZZXV+<1Dq%1
T9CbwQ A+$+!&4JkZID&ibNQCqp$*Dq8:Fd\5hi$LSHYjAP\uG!>e8#KIjMtRdYpSd#dVW^*p<8QNhQa:N**ENW
*yXiN^ q6k@ndXu4uQM1hYRt#A5>RwX6bwTpXna9X#D*i@bYMLQ5iLb:!4lS68GeE>S&uhnT@<XLEAD9MVeGHVy
aeALKp 4i$H^M\ea^&uI*i6ynZG5J1!WJ#@j^TyGX>kwSHTRkm:n%ud#ZC\1%>FSMQLI4JQ&EXjn&tyqN=KGLWq
CN8<Vp bVeDt+TVWey*B%BDNXeW\$>C$Qa@#K!4/M5dF<:etn^n6t%DVpckVXtIa$bXF!PR8+nSLmM@I?+QI+Eh
p1C!+# lmEeh/E>#TVTAFhCFbEEInVFLP1Wm^q*cYP1=uADI+#eDlyLPpp^BT@R^&G%dKXPMe/<A+QLaB=dK>=Z
Whk\$Q 1kFTM+1/XL\J$1Y*ddN1Aj#X5dwhkw6A8+aYM595h@pkH:Z?BaR=T@WP:8&iQBZAc=H>W/=l^amDH=HW
:&W&=& dyQly*#Z$:XT^t\YMGtMutP4WcMJE>S+ElPGLC?cCqjKYpT#8iHRp4TCAhHmCVieP9yiZ\X&e@?/ypWE
A*&Ehk *A$\<aw8jLb:HaG5hR:=M1dD^ll&1Za!5nIZ?A\6Z:9yLd@5py5!F$P&=jcl@P:d^@6$X?EZKQBTHGWb
&Cw?&u @5wH@WQuuw=QhJ8AIN!$YlAA$tcH?N*m/Za4pVHtLE>:/#VLyXtlNj=ZaDIT#%qH/Zep%4q<!upyh6Kp
dnV/y% B%q@QGEhBHXmXiNB/L1tNAqpP&#<@ChHu9lBIm#t*bih%?=de$\bSMTu9M%$upyuwJBKJ9?V/W4TS=GS
Xkjy*/ 9Duc1m=PaZ5eeEVDm8pGQ+Z$E#8=@jZ9Z:TTY9I+mMTaR::my:wqycy%XKI/u8k5Ai$j4hb\8%XV1Fy/
4mH1EK ml*TEuLKY>X\dK6iD<AjF:uFj$MGBK8Bnee:*\B1A5+DZ#*MmQHk!M#PZ=uB#4PB@Y94jAby5>u$i\5u
6Tm5Dc *M$L?=GVZAyuuP%hljDZ?W5tpA6q>q8KJj+QYT1Na=?PVP*b&FhYQEw<?j>!p*J$m=ZyNu:pGNJ?888A
iuT\tI Y+&<%?Ew\lTJZccWyJXhH!nNC%N*il8K&F9pEwptbY?L+qSm*>TTt4TWYL\bV\kbKiG&T#mT1ll!=8hC
#Y8&u* 4?GNhwSGdSC99t4GJ5YaFQEleb=Mi/#Y*QiBeNWb&+mG4DEnk?C@Z?dpk?&==En=&yQll/8^PZBEy!V$
c:bt1M R>^i&KCi&AQLPwii<ajycT@\ITqE\c/qEuH=GWVqVMICG*6q<ejyBcmwLneeA6nwSb4Gin%i9l4:XQEd
aWnj^\ eYFN:q4p%JY!AJySJY+JV%bTC1$5HqAW6Md<di*:/5hV/#iMT=k\Wd@@YB%%dPieILV#+aTn*5jawXu/
9X!yud @a6C+yX6T\K!%eCJK&WN4e@YM#6dYWw!Ru@bBVceiym:j6kP1N#N\BJAM&i$ECj/jAu^jCc!\E?^qn=C
1KJk!^ qj#u?Hcu8R@Pp^aPk9\BMZq&#&@8<S>^\K<ytZ:kLP^:G+:L6JwQh+&l%k&P:K\LSi1dP11LC&&CCbLF
@QKHlp u/PdqN4?&#X1iE?4ut@w$bm?bedT!Q\$%^Cd4cBA@%Aa<I%k+j+/Zju9P9%mH\YDMbnn#BWpeNS*MAXl
dAHIad %q1kM>WmB<Y+1PCL^KBmpFbJJR>=6tka@pP&\y*cX1=@DeMjy/w*Cm9pkP*XCm8%M1@JE=QEMw&</cTX
Bi^qNS yIj^S6L<=AS:+JC6KtJ89+\9HtRbZTHpwXWbk4Z*IC!1y1?5KD\paaLPCYMw<S$wGeb?8Dt4&<V\1<!F
@IRI<q E\6=eBF1Q?lN$i4#@VK16RCIFA*kYM^=bY!+ytbLH5L^uFK=M=dC\YVu9WARR#!t^1l8T6m^<&QT\mBQ
j1tXJ4 @YCIHhC?RnViA+yqDWch4+EkJB=yyn^SH%PB?/D?jSjbXkGpZ4>dqFYclacpJnHeZuqGdWhP%cHQC8!p
ZdZ*Gw /pBwaYhuZNeMG<KEW$qZHjdaS$jE/!AKw>m6=lBSndmIa@?nw\SnDPq59TaJi>SE!qW6N!*=uu?6ZR8J
ectI+? T/:cMb=>hXtA1phN&Z?Q?Q9lVRwtKu+JSRQp<+Z&9BMaPc6X%P9HZQ8/w\9\<SCn5u48YP4+iT8pP*>@
=Wq4hd le@uJmbPJc&bpEPDRZS=55E4#SVL^Ep\*%AVyMe<MekMMBh*MbKLmADZDc%Ey^tYj&LVm6t4B#^!b4Db
uBKj?E >Rej9/Mk=\Q9&Z%^I/Ki5#kZb6w5@<piS&<1GGhaaTET54uuyqa6IFhBJVmBiJ1#AG4VGikTiSk>6J8J
6&lm&j AtWjlt#9eKcXdMSMp@<pIQ$KneGwbwP&6*hRdn<dZQkt1%B&99\XF4ZRA4=EbJP/MbAM4Za%ItVLD^$y
jy4^<l m6$%mD*jn45+dG58SQ#a%CSGVD8F@NllMQQKtEeEAkTeRhX#aa$5=WwG/pIdae$FRlF&+hVH*>M19LFq
Dt<4Au ZAKkb6=ThnYG&N%99PtEpMaT9#DbtcneITF$i^*=AqL!PAG#Clt=c$E/C\XSCHE8wyCDei%SX@:lFP%#
hy:L#X mN^b/94W1Kk*qNnq!u?14wKLBL1TR1!Yty\tb%Qnb!!jAeC?yJ:%K%!5*N1CblSCW%ay8YaX:X@WWmMG
uuyLZB \+1$NM>P9yJ&4HeXqnVGY=6A4Q%D=5NdbAXJSdWtJGQRy!/u9>wc9<k/M!Rp>ee9Qy\5aEC5M/WVDGtp
+Q&Ec4 8F<N&y^accS#BW1+KJ/9\mWCwVI^EZj!L$&NnGR+4k9Pnmq!k5Wd=VyYhDZhC<@KmdGtJ/JBKdGFCXXj
NQmqmL ielt&nEbKZw9=TatZ*JQyS>@Vl6PA#W9mLqQVbGkY6MXY4e?G+dnhi@?^!=/1JJp+/bl+FcKGSG$+N&>
<bC&y/ Gl/Rp^1RFeG8AWEiuwTCjFQ?ulEHXKiHyEyMckmV>!=X@NV<C#F1EAi5n?AIPlKKQy&a^u?8kX*l&%QR
k$Pq>p E6#$$>l=tqnVi4MX^lZQX%PW=\^=An<*PPmmEN18LmWPAH^/N4^jc%<kNLMnm6cpH9LqYJbR$QT=&T/c
-AkNyn 000cdef55bb001202b4 Page 357 of binaries2.zip
b!QKT? =:4+ZX+k4@T\FZ9EcZQAYTuBt8a#!jXVH%9>tEw\B=NpnneCEwQ&5??DBDQk+>h116<+iGYMIyVIF!/%
cAGG+P w%?1aui9:W:9SF/IXZSQpuYGNS!G#$aI8hjj/<<$l/Ml:8:A8h*jnWG@d\jFXZ\iG8#id1><uM&IeEmX
KDMe&# 8VEIZj=Z&ed:d?DkWV>G!Cy5p1L9CBXp14Nmhn6\SdGC$b=W+/\$8:mCimjNVmqdecicJ!A/!?4@w#p!
@yWEe> ^jAL>u?%$S@1yu%qJu4G=8=4V/@&c&9ST1qG6AG>pun?%^*yVG>thA+H@mAZh6t/%Z6qQ&6#L*hm9*RP
Nh%+F@ VCL>/ahVt68MRQSmql@8md&EZhcBCXeRpYV1IVZESYhdjXGp!Kyn&/$b#&dA4H>XDG1I<<?>Rce#*b/5
Q\Ze$M \wPGkb:YmlqmDmV5%?W5e8Y!!?#T#lKNZPpW&@I@=i<Xde%G#BqdXWDEB9=^?t4Ma8iA?d<QbZyTF!Am
jENtNP Q4*5?$*<%Pb**Vj&Du<SC4NWFZ>9F?%ti4&##M*c%\achnD6W:eDB+:6PjdEj=RTGw<YQaR>icBbu41<
M>VGhq K1dyu%#VV*nl?iXnG@Yp4ZYVEcI%iH>JJQYun?>cCbe</^ATnTqp4=R<^BnTYq9IRMwP<JWh4abnl41P
IXtSFY kjh^i<Ga@l16A9QLKnmX5l^l#/:9wTyGXku8eB\?WkjZDRW&I*S8lB%9k$STR\ZVw1hyBQSCTnFnP/SV
pY4LRc <cRDRV<iBQ8*Q1w:l\!u1?&:6e!+WCXYShpdCp?RebKtGT?dtEVYIYJ*VDCNtMlip8F=Xk:/!tNGX4GI
n?6lFB 4!*CRk@l#N4DJ1Y$*$l?:WH\dAFZeXht=umHjVTCtIyQ?lW$cE?<M?mNA?BVHN/*/Dbpc999&MRL<Na*
yb5CQ# R\=RGiw@6wh$d9S@TR^F&@+l=GkC>^t:1@u6@hM>Wy5y5PmyabX+i++KjAj6ptbXk*>N#G%%XqGEVZA1
IwceH> m!R@1J$+h8n:cVlLjq*&LSqw8\j5N9\CJJ5+IyZ!465^+pyNd/LTLp1R5PeYL=EEZud#KCSeC*81qy$T
#/wy?p b<%unm/<Qp=YmE!:dBaITR^/e/H45/8dFc&p44Et$iY@@=Q$6E:/VGk5NbHV*LlDembPCCMF4^n1=**&
lB\%Y8 Ip:FabKZX@Cj=IlZ@<?kBtKHjL:$8EVye\FmP/V\LE+l%&8n:Jw\jA>4:&^N%FqtYl/*e+bXDhp5EMuh
86?HpV HTS>4$/c^=j\m/yPc&i@MB%w?i+$Q+D<nZyYa&^K9k8%<i8#w1NSEA1BJeu>^W>qjNSF#*:@!Du/pR6^
4LpMq/ 4nVC?AH%Q*#?H#>L@A?e^j/9\CVFyTSkEnCwGA\Kk@*QmQ*Qm$MpaiLmE9?@VPGm<Q@4TeAHVbttPC=F
Yuhp<S cYjn1K6568Pwjh+#A1$SJVWh#Yhp4HNJ+XaMujMyH4SkwhE#nwuX*8uVS94P?m6h6Si?hQV#/B6+\PdC
8Hlpkt >Bq15&9/>LYASN$T#6jTdPtV*NwqQN&u!#\^<&8k?h#*PlhGR\LjpQeG6Cp/hqK$Ec$LCiF%&P:X&Tje
c<N56/ WFQj\TmGlejE1Me!99%y!=EE<EA#I%1BdAFW<%D@<!k1kie9I5t4dLt+d5jRX^MmAq&IEc*PTjaw#R<c
Ek$+JD <#&q!MjPCVNZ6YaY:pId>/ntW>^Jl+cBTMVKTpT!%y:@nAV:SqdlLK@^$:tPJ#!JcnNpik6Au=#4qHd@
=bwbVb I5#&>@aeZVP4tb:Ghai5S9Vt\TiqRtdyuckWee^N^eDhq/!AMXwD9/*BF8Pt>DDct9bCnb1F%=Pb4#+a
YCHtW+ !ScapWQTJ/6QDbJ8=c4w6K=@T+T&ZA*#5BtCcTaP6DJ%N$+/Z^QW%i<Eidil^GcWPinPP^hiXF4QKJHF
alWpKY ASP^ER64#K8YW%/tT8SM1y4CTEdkhEd*:whMl9*n1%Lm9Y<>9jZ:R=NJmlPmTi<\Pl@P8nu55&cEX@u*
:?$FZa Xqt8w^atnY9%F=eb/4klYA:mk/&=*wIb&5%4/5MQMBi:j&qAq=8Z9/PjVT%Fn8PJe1tWQ&jdahGnjJj&
wTSB^+ E5FGSaju6n$9mZIC*5n$6TDhFSt55WSh1$DWTPX!/Iba<h!DyPG8qm+jE&iWM$XFM#A9wiHtMRFeuI:!
C>A1S$ ?Bp@EnYbuuH#@ktKF$!yn/qYkZ1BV=qX><jbaL1Icc%cNFKLyJd#Vnn\Y\T*lyNpV?4!k%^e&n>Q#9bu
p:=AFl :h\*8CY?6qki%yMii5+%QYtatTeyc=?lNqQ?:!+>96hNHWBQ=mShSc&wG+pQHXyQupAnp&dNcA5<S8=u
hR>9Hk ?I*EKk=Qlw15QLW^X<wJNVJ<N@?G9<TYtHCu^6XWdJ>c8unwRYNdqR<E?*ak1!q!$!yQ8VFiT^Fy#:YH
>+P5Rk %ai*MHJyVT>Ect@j>68Kl69!LcNhyljd$!jKC%@Qm1q@<tFT/1R&@?#4jhSYKb1F>LS=ZieRhc5aDt#$
T%eC1K A1hh&>VImc8H&/%V<M*D+%ATjEPFbhRu^D:ZpB4<:KiaA=mIYHFZ%@n%Km!nyEReYSEILei/PPkC*Bin
yPD4q8 Ba@&1?MMH%H:w8mVElI#Cnp\$1@HPPKjb!T5mC5@MWH\LR8^$%Hwc\<QNlKIMiw*y$8*!nN1ETAZ&WuH
H=JI1$ p=&NXdR15qa1:Ly5ItZn1\EwV!*QP9Iq4e18P*=Qa&bi8M>^aa*eRqXYt*/XS1@1uPJI5bbWuSM\1=VF
cGdcCP WNPa/+%!JX!6pA5VhMmP4abuQt&WCLn#^/m4t5QL6!RIYq&$9niuKF5EE1lCDE$Jn/y+J!y%:\!tZeb+
t<d\cK mT:6SSiNE:bLiVX>XJ<w>MH5Y4:upRaqaKXbZ4Y#XKdVTb??W?$d%=kk!QGB/@XLQjhD:V%l!m$+?&RG
NlQTE/ jC#D5wq?Ic=hR54i*id5%NSkGn48GC/=?Xw@L%?tLqRu/mj&eFPh8YPC<jMH*bIPwdaKH:E#%R$m%QD!
h#GH$9 <Hu:18mylCtY?Rj/MJlLlaN&JARqH$dw@FM@Hp\LiQV>J9<ZFb#815yS=Y:wTddjmeuCcj>^$MqTG^9C
ytSF>n R=dCqydEDHjlht@n*D!kQ*R%X*ZpIb<mIZ*ayXBK%^ujFJhC:EMAaNp@WcE6?^c#?J9c=tAC4N?9K@ZR
hyC&tm <A\@4qLh!\Hl/H5?BNq!<iQN?!V&1XVk1iHe+VNl1M4>YhAW%+QD98AL!*4IZF*@J9PZZD/5Q6X?jndt
F#5GuB =6*R<c9HjdhEEm<C*\9$blCbF@GL/$y6hFZ+4FW9<Jh@h#1d@wAtuYXw+Q+8tGuPX:hp<kWw9RI/NJP*
m9i:Xp ZV?:1CadDZB1/%4a*#@uNVeN*LRw>6h!XSac^dl/84Z&Jc$1XHYGB:Rq&Wc5?E@&^$\?%*NiqtmbWJJ@
8nyPDV qX8SJAS\8@1KdFHmCT=b9I/QMGL/GH%n?Y*u*<8!ICbFa8JwpHN!KJeB+J&8eQwF&*6m/^+yb6N8q4LT
F5c^9w ^?nZLCi:6bTM*=nm6!V1NkXC5pn>5EdTS!RQ\=*w6&\t#yHndSLu1t@Bt1LZ?EnKe\Y1Vn:T$G4ARQT^
YM:l$A W5Mqq<kDpe%m$H4TRq6c9y1J@jJmj4HtEkje5%j#1XqGbuumCc+:$&#Y<h&uu@Fc1MbM$TETE6#i/*K1
5Fi=lB LetJWwGN?RaM@hwYV1NiNBIKq9Sj*</u*jm<q>%5dph4DewL9R4cGD8Jb\ZG&YhdaF%B6&>bhZp#\LTC
hK?*>R F/NhNI?B?SGBWJ=Za\\NLdA8j*NX5>dRc<CdKaRY^w8icL!Xa>kubXGNV=S*\6i!Qe>qJ%XW=1h+MIuu
LkmdNX $FVw+YIYJ&:CJZLiietk9TBP^4jtud/aGbc<#:L?QnJm4cXl\<AE?eIq=GAZ1@^bFy!F@awJ@h&nG5*\
4DXVqE whJY!/X5SyyG1j5jb+p5jeD/KGld<A>FR5h*864w8T@4j#NW>y9e!l#>@MpN:=Qh41RhqTim?njBySm$
QNKX1Z 4a>p=Wk<1cn$aB^ypq>TNFDJhtKjaELK@YG#AiWXZh?B+wVnwbWHW!S4!?/SN@/mqQ>WV=j\WF8H?YQ^
Q%/:aE KF<?Yd<hi:#TQMJ^p:k=CtCnktu%T<BPw&t$SR>Zu#6kR/^SMN5%/m<+:l%wVa%Hc%IL4#l<=AblIIu4
&6!%:1 ?=je?IPW9WKXEDnPR?TWpeq*y+#4\YlNDd5ZtheKZm8PNDjEqan$GQ>R5^al9TEMiHNcBeBL?$Hi!F@u
wCk5DX =ZN^mB+SuET%T&&6Gi=aGiLNDX86k>$nB4uC#yNdujj#K=LuNqEd=VnYew1iT*WDI/Fj+:ay>cXy=A$>
4bMVmN Q%IBXFawptN8<!GHm^?EE%^\5<b?JdY:V>4I@/nEZ!X1nIFa>S4HClQM11ac%Wd?i:T%h6EWha+SF6h8
q+\YE1 H$4I9W!Nc=:Lu+?maeLLGudL?ZM+55pFTmd4VK^c!\AwyJADhTPSN$/+N?A:LGSGT8=<LLFSR?CBJ^!/
Fi^>c6 y&YE5DtjD1t\5I%VnyYh+#L:FHWD+uIRK>4Ck8@<LlKcy+VLPE9!1ZuN1#*!ERHibIK&&5H:bN*Nk@uy
Ad#/&N b/eNE<XEn5YkRS!1QumJm%95Rp8ZqF8M\?TImD@&p6Pt5c@RC%$=#E1pQcW+aQ=5IKnmKA/&S\m5ch?w
b!HWnh FCKphmHay?MlueD!uRLH/hnP9:CnnRd=?pFX8cyXYhJDQn1qZj^ZPH9d8HCW>I8KVVS%9DCJ^TC%hM*A
T+t^dt mM=+9^?QPb>RLK9K&HScKd>uGGdpyq8Jhe6#LWa+IV>F5JcC?DqQVFXye#IJZtc$t+Z&?RjQle#WnRQk
qWALHE F6wyW/R!PCXGN6&FZ/ImK8XI4<JJ<%p>8y?<CpbDm4ktB^S=bB><JXYC=+eZbyM&Ql<$KW>npmL:dMQZ
$&\6#k dV>QuGiZpd/9pSh!nE*Mnb8bR?MN8Vn^Y6mc$lEG%CbY1a\5JHJk:Zet^LT!?YBajmKQciAnpkk6ak&D
dpcVK\ C#W:<5cFB+wYJ6R%E:qXIEd\>@^#8c1K5Swl$IYMT9<m1ekp6aelC=ZSyFI/w=ZJZZ$/YBF*uyVPCC1R
^IMMlC F@+DF5qSte%9eItuI9>*pqLJRm6etI\4QhDTQh&Xtl1:mw&Ynbih66QcnI?bdpX*W^dG5N+EpQ&kHmeE
YW+b*a WwK?p\ydJ5J:#!#T^p5cEIYuREjqk<:^Ti^4tyK=$b==:EQJIC1GJ%cFR/Q9Jk%69=GTKtkVLl1RCQ!9
$B5Eu@ HPuZ8tFI=9VQwhG?89MNepP!/N!96TRG54W/nLRh=Y?jK%D6Q&$jLZEnZ1YlGptwyw!BYuLG58GDk\!8
%IA@bl 4yXTVLw!+D!V^awPA#Xi\Xkiw>ww9Y#kZDISH\#MuWKYkwZypwb@lXP!=!emM:q*>EM?b!c9c>pb*B?8
1%*+Jc ?Kp<PEWc/=Maw+?M6l!#b1E&EnBli%@EId<tySmE?mLNE\yE:IQ^G=<cXNcLISN5:RtB1Kh?X^%+!$Mt
l9NSdA uui:qaj!P?hjKu>>&V/#tB+KIT#pW5GGqPTH+p?EIlT?Z96blaVbDW/w+\VIl>4MKG45p@/l4YLCJ/5G
J8TIKL cEi58XPc:HtaD&P?F!XwJBXGnyq5C@NGeS/G&B%@ye=RQQR@L48!5uMV$$L8q5l?*@+wMBCeAQM&dchW
pV6tyd d?qW%%qXJ!pZIQAyYwkbm$SJ5a:WeLiblh9d<t5VPV9!+JB\SXMYun$:@WP#tD4HeCd?CwBEcnN@Pc5!
4+lF?= pF@eII8@uHV4dk6AhaHqRNn8$%FTHQBH#:51hi5AC>#^>8e8<LEZk4QP+thma?Q$>?IpinKX6y^E@8<e
$HW<^D hQtna<=+a4B*Q#^V\n^Q1I$N4ma8%6%Z!Re465:+^LH*@QqZ8XnDS@kDC6dcV*uC@ThPJ/=cjhb\iNMl
#iV$ni E&L1V&jT$EhYY<<ZpP>B9ACm8jt#I1\PkiVEZjZIAy1c*hb?9/8cVuDRaES\H\l6h$4!!a6dGTFn!T6u

-AE*Y+ 000d68f349f001202b4 Page 358 of binaries2.zip
e1Ljw@ 4jFWlDR*Vm!K/k5K%!wLpFX\BWkR?M!pki+DBaBnYVXRt!EQJ@EME95$5+=\capShcw\jjFe</IVpADG
1kF/1C %qajVjdTcpe&dPRYjiT4M4?wu$REK$%I=e+*+hcd+@aWh!Xnn8LZZVVT%:YwGXenV:mya=AB*#wck%$m
:QGy$d ZZS+kDhd>l99jC%e1T*e?QD?J1$d/Jec6+=HX:5GIAeJw6liu+iHS%8W*RbnJY$pH%n*t5dIm#d15Z%y
FIZkYR qSQ\tq?q:jT8+>%NX!<aDW1cS&R1ACPwJ8bA*5>N4=C@w#APCW&<&PCbbNq@el5*DkRJHYdNi/^%^#W&
t%yjjT !Sek6byK#QiZ!d6B4b5Nub5b+jXkVI*^Dap@bT%=<@d4md#$e5G/qcJ/n\J!\9hQKM!ea6ec^#$cpBlJ
XX&pQM @\bYLZQqCq+*\a?BbAqJlQdTQFebDF?qKj/Vii%#TKDEXc%KTJ:th<TP=Sp^/=nGG\$VX?>Mne?!jX$y
#auC9I Di&b/e4t>I1AV>$K<#pe+I%aVjH::G8+ZtluNnJIGV8W*jIA8lLh<RdipQJuhMY%cd#pJwk4bb<B+CXG
pMw+u1 mk4/Pq#aT>mdakEPuF1G*4aI#44RBt*N!END:pZPX!!HwL1TYFPc^Q^%JuaKYI#>ZL=nZR&Y:=&iQY6V
FNEd>4 N+T5lnQnNhbC>Dl@*!W=kD%FR\9NJYya5^wWwFe%uPY86cQ1C\i#4yqNjaTD4CZ6*:$GIe&tM<wT9NS#
ldb>B5 %S1GpRcmXik$Yj8>46BjwLZ&YY9kwLP#K5AYl%p6KFS/i6cM^8nY&!n14eJSM:X^d1NqHplPdHKuVMhW
KP6Z$8 K4KYq*9Gdh^n9+IcT^Bw\Ww4Y@I@N9>@bC+lAaXBJPBmE9<VVEye:Q>wZF^CRpwWClYGPBqaa=*6ZISj
&6chl% Pj5+RcETa8ITplK\5XDXAZ&<Wm*<pn1P^C5ke^?=Q!bJGbM//MKL+l!ctnKpFEtFwb<DIGq@Bb1%uXBn
?8Q=BV kDw=qIRIQMGdBi&q!:RNAQZdMhh=upuChVXMnEcGq#yNFSaX^hlWIYStiiwA14yyqZqV&Mtm=KjF%CWc
W>u4Pm =ZGh1tqLbC&8uy$EP<^Jn:nM%GREL>RS6k&%?edS/lR*/1lFCi^Xcw/Wcqw5#dFqEttAF#C4dyEM?4=K
taM\<> uA8n%w4K<5mtM@cqblwYMbZ1a?abj8JpQK8:&eaVMNyIAE=t6L@Rp1CwNRGhN6ZXF4wTP/h6!Y1?T^G!
CMjHhy JX:u59eJK&dcwb&YlP^wc6T1IpFdS:uj5P%9NB*p!*@SV1=FPejC+89?$SKu+/G+n8Y>Th^J4@S:$Ylw
QIDy1! u+6Q9h+Jt\m+1?1dwnN&l469u:HX^e4%uj=Nc$91!t4VYAKu*bmabC&#CQq4hdI*=*ZiXlF@yJ*%/>@b
e+4@Du mEtN/hA8KIL^8!:p=Y:LVHT+9@VyQ6jXdcld/MqLVDL?iyDtj4L*w6SNWESEaP**btyQJI:*<*CWV9cL
8DGa<Z L8^DPq4c1cqPw$4%=JZ=q<8%/cKy=4W*HW?A$>1\X5CV8tjn4#^Qi/eiIL/>W:j@^C&:SL*8CAbD#dVw
8V8uw? bAY>d$u!%G@Ldj$*+@j?yt=&E&Quq*ck\Ian5:BI9&c!pmuMYBenRGHDpTH$ni+etLHGa+*=5TT9C1tT
1yYPn# 8:\pehWWS^KMj=MA4pI/8hD>Y?npP^Wn%%JKEj>wlN59@H=9cPMA/bVl&KX4C=je^4JPpQtpS+jR*m:y
A@wmTA 5+p1Ebia%nwqiM=:&*MF8=kc!^LQjFQ%yTFl8n+dShJ@I1uYa\!E8E1>ju9ENDqXdhk*m1JHLuyJhQIR
G9mQN# ShEpt/PkWQ5#kj=D8VI>hG\mXV6$KGTmXIjYYqZhSy+QaFTW%8MNpi?ZSFacuc\:B!mq^mqWG=n!eLB4
kIK*=R ^p>%!$N9:DLXh&cVW@RFS64*+><l\pT^JHihXSXGJI8Z%uNnji!LbIB%WRtET8dj68&FnuCyGBMp6<$A
kWlDV4 X<?ehmuYXe*l/YN^8+CqnXVq8Xn6HD&=nt^5tA+8T%NE1ShtCFZL4Ky1t*GKKhQaCjKby*hEl8&*yH$\
5LDTwP !IyptEynL>I#Wkkt^9R!Si*qh=tRqd1q>#CKh+Z6Ml?qiy=Jmak>>qyc9nJWclCcKH9M*bn/l1\wyFma
DYDGFQ e*$eQK*JHXa6lC#qqKhQR$PXKnBy\Q=4@tScqYLMP/+/?\utXE%iyP9+*%bj>5<cY&=/&mcWHeQ#=E6j
LEd^YG <ETWTRNqwB8JGw1<KuMdjW6$nPZ9:ZAQVB=iu>a$PkRF+T%1HM<kB\GN45Yb^tX6j=IYPt*$/qmZtu>8
/Q@lHH Jc^>!VdRu?1q9^lm%KiGl4651nNt:VK1V*1Sk@4<X\q4JXLu*etyjAc!h!SLtQ!6/!bHBwcGtm5eA4TE
M=tqN9 #%S%>i^:6S>NRHXc?WRMnc\<Q!uE&Im&+/>:/D\hb*wL+LymFHXSNV*:XKRVK?ZPRidYkT9F\4I?L@BS
>$\N6y S@1WIq4nqIK?VybMZRy5D$Xk@k!YXh8pLiey&uyXMXW<Nm1n19KNHH6BD@H9dnn?a\tw<BB6hql%+mSX
9@MC>V B#Y//Vju9Qcj$t*+GEX6?Zq!kbV@K:m=9bBSJqLHRAR1CJ59Vq#%eH=LJXc4L:JCnJ?&GpVQ\R\Dq%Zy
CeQdeY QWnFah1Ji^layb8<mVEcJ8^D+tqu/ud*\nc66+m^8P//w+^@AlGHEhN?GQ#+NbMFjKlL<l6N#w*!=>T@
qYMj<4 &<hDq<SjunI4%A%WCQtFMI\1*PZw9&E1FeZIA>@qbZ^16@X>=?qVk$6pdcHpdXBjkyiQ#$95MkaGab^>
<+NY:F Dyl4M1?%tEw88w=u:i1jPk:e=c^5>bV!*hJ/*8l^Gj4VA4k^S<hy$e:E5duhYb!Jm5F$RA?@C/=61^Mt
yDKqDF anE^:tSwV6HlD/1MGtCK:$eM5hyDw&1Ebd&+p5IL%DY54pE$J1cX5#G=Saet\w@@FZE+HQMpd=nV6cyh
Fmj\b6 =HGY?LV9T9kdbyL^5lw/6LuAhE!CG%1Cb<dcJ5#8k!i/*VV4e$cGH+G1!wHS8@EZ@uqVFkcVDKL:Kqct
XP14KX 8\neLDyQMYMabetbQ8wnWLN*\iWa8&6^l=bPp#q<>X@@$@GIR5<Abe8T%a@VAIB9YyRwQKKBq^N#tub5
n!YMG! w@><uWlEZp%5?>h@JFlGEwjDG:5P=GPd/1CA*&Q@<599V$\Y^/Pa+h%&L<j\Ctu&Bn^IdRC5X15+YpWj
hme5qt =a9@#Jch%!:a>Emn\J<5*5@49!S5WdNpFBZ:jA>t#B/hbSlpm\>Jk/Y^P#8>m%%@weuZJe=h6ypjTEnA
ISdAu% h!yEZF#TYllLe#HG>lk1hLD@h%$<T1t8D@?uH^jD6ATNH<ZVZ!J1#95QS5+GWS*:+/Gqp</@FQA@juCK
N:Qh^\ !cn6dcunpQ8pSKXSi#$Q*k#R1QEaa1cu^X6:TQSAmlZwb&#9kJ*>DJcwm=$#@p:4QmwB%ipTY+4GbX5?
cKS@aT H^=!V98$+EX5B1D4u/?*^E*\t\5kLAF$C@ZbBwdNi%HcTh%d*VE%l\laTCiAW\8ljhinJDpjWZ<VV9wj
c?^%NI ihdS@+BEp\^QINlnyw^+$E?VACP^!!T:uXDE=\dE+I&^+mB8LEFHDMBw+N:I6mHb=>Hw6R6KTZtWCm6K
9^C=!= wW+\iLPWELHZM#FHtXu6L%IS6lT*Nab6#k6^E!%H=CE1IE+>>X8ahSW*YP\GPi:8jFbQCaG+uSRm\P<G
9KF=G# 5y85KA4mwpl^&@=%@J>VNJ6#%bl&&Z%tTZIKXL8Aw5&FqdQEk4u5wt@Al+SB#4t/@R=1F\*k<a%C6Y$u
#In<di t@$=p1L&:j$tVD1+/lu?@yJICK:Tqqw>bG^/i8EPQDRHIT?5a%<R\16GZbLHSb%Qn>tLIA+n6JCN>bCy
MPjm:5 G%%ThdIE%ntK5c\KYnPla*n%J\1<W*6BWW5P%qHWBd1/B\CJE5dKmFcJd%NiMml%8p*abcq&MI*AEewY
*dP5/6 4*T\eEI:WT#=?>&QnACR&6b?+E#5E\=R$C:tuN?eeW1KJLah^H<DT>%!E=FEcFVTNqXEND%:G5*I%HRa
X+:<cj PcaCQnVnJ%II+W=>P1bM4=XWy^GmQd+^K=lWRBqTaYhQ$T^1k\w8VBYMT5kBm$cVPYhBuZPXWdd$^D!p
qWDJ<V +dLVq:we1wVH*EBynqFA!5Kd:cE^:tcDTJY4WYEmmnli#=aucq9\Y9<W$y!QlA1n?N5yV6IXuEd6>ylI
5Mpy$! Pa?RiE>iIc#1HD%5!K:Xtj!88cyq6EX\5116ZPKyC$+pu4!dm+*BPRWk+6i\1!u5kl9l/6Hje8hd8K5H
V>=Fw& >C>FQeSP+mLWE$C%JWdWc=$LW:wn>D61$1$uyaLVVklX9W+B/6XDR^AlD&lm1w+1&Pw$uEXquun1QCXc
$D6!JC K%Zac>5K<=GcpYF/RlX::PV=q*XpYbB:SLV<CKVFBNu@SDLCAh<8E9K<q?A=Qp\P\*I4\ThX!mMl+qRd
JKZpN6 9@w^WYpMDkmDX?hi6yeqwmQ^V^eaZKI+^M<XQ1cna%FGpBcM5IjPC/Al&#X<PMSl+uyh#NqlpjC9#QYR
G#YLNT 5=iCJT#Le^K6NGPS=<C/kGEYlHR8iT<@T=?WV=>JkDRm*jTEZY*&d5kEtnupW>h5\+W@^Sy^y68w!H%V
lp=C!y \KH>WI?a^8:JYhM&blVTkQ>EY?+cmhhbl1!8F5l%mSd1LnP!RG5YLW%5Feq51Z$/X&T5&HNLiJS!qVY:
dZqQMK T^h:Ba9KYL/1%Yb@wq$AIt86yCm<kw%+DIqAwE*W=cdGT?19APwJkka?4w?c1#Ym$GJeTVeA#k^qcaQF
AZqP1^ qb$I:ieybmA8@6>/*V*KVnc1WA8*pI>a6N4NAES=Sp#I^&dPZEbJZ?P1tyVGTMlYVdVwayDVC4LDlZV%
PGnAk> e#>1:hiX*LSj&t#%85G@R!LR5jbR8^M<&TYLA@^:lm$5?tVyn86yK@yyi$cN4d/n@9//*4qCj/Y:IHi1
8@cJ54 aiX4@jq%k>VnQ@19nEwihECCquS?d+SA+N8$mDbnw+M*E4#E=m1:#qV1J5we^5QTQnj!#$qY^nQXQAj8
K+H#6m Nt:jT98?+X/Wj6@5XWVyE=iP$P/9AJ@%c9SnC#%V<1!?IE9yum^cM!%F4YT+<n6HtV4!MiwiY:c!?$PJ
W^yN59 qBaV&em%/Sjw=NYGkS=\nk5ypAJCuqPIWG9yMqGT&E/8H6Ge9:&lw<GjkHF/c$@4wDKqNLBTEy%tpIW>
INe#Sw TKR5RScKVFFISHV4K*H1nnj?NdAA+EYqG@lDW+l@dCXwuNi\D=b\J94^ZmD+buk*m+^W<I9!6I$SLYbc
kw1qQT SC^bEe%<k/jAuZP4>Je<VlY*mehk>NMh\BJT+&/q@LFaKhm>hy^6==p?^+HB%XNd5dm/!/p8>WQEBNPK
P=Lkm? R=6?*h!e11XSk1BiNy?JSm#dSVhGb^%J=G:6iqyeDiYu89E:56WQS$dijnPw&^JcyXX!mZ6uL>9R%w>5
V4kMQ9 89i?dTL%ieS!XP168RJe@QSC+yFSydc@IbjTbi:W*uQ@y1?9DCG951R*6ciA6QtC$>SnY#P#HQni66!#
M8at1* jHQ#AwT^MV$#%Sc<:5WpR:%$9E>6#^dy<YcD/nknY1elQ?ww=ltK&Z>Tbe@NAWLim%8an4GpQD:NT*@t
58eAwp 9Q*k9Mlkw$wE$wAIyXYMy>J@=ReHm>:>JC#RuIEF?qt$ZA4QRq+EGi+EbTypnhYde%$HL4&kT9pcYEwV
Gy?Zb^ iG:KyYMaFK5HhNFItC=bh>mia:Z/bM66Dq9p>nRMue8h&=iknkHNm*k6P^@4EB@B##B&e*>JCH*W^*QH
ni4j*V n6/E*kAL#^cI*GX4T#Yby^iyIn<lS+9KBNLyb=ND=>1dll4IJn$j%?$LWkeEw*>A1ZNnwpPJL+>E8X!T
%w61YP 8j:!i@9*J8tLHL1JNk@#L<IE?/iFTF<I/WINFw=Z1um<@Z>%MF#B\EBaP4>BM\=Wb+NW>@FjKIY/Yyq\
-A@kl# 000b1e4da96001202b4 Page 359 of binaries2.zip
c*=SuZ GmeLqQKl!?:dtbEi6kJy!&tZdn+8VPdKmVAywPjcYAenV+dZmqHGP$9\!VMlCk8mbAS>+Wwua+kGJjFI
wVJFE* 8e$P<a<p9cwd=6#IE<6YL9jDRIt>b?JiACjP6:t65tLmlZ4H9FnY$/@qE/d&>*:y#1>cw%>i+l#>^/GV
1$l/PH %<wTARES>hAcJteCKSy9M8ZL8&?QYZZG/eRP!cT=PWWn>%:<nLN&u>MiE?@u>djFjljVk^X\eht/a5mb
1R=1@F EJ@5@Et^wI&/8S<bjn1#PFiH119lQV^FRYCPKV>*j^qQkyLk6GGSw!^?KC!y+pIah^LmeeLii9\4:YR\
SWc!b+ u&NH/!Vm?LK1+uS\R5RP?5lA8^a5iVc#@bHIRBZ#X\6pW:@$GY&um<uCZTl/Ze!Tcp=NZPIDeh8FpmbX
EM5NPj &p\6SAEjH5eXl@D:hNCpmZRtnT9NkW+L\%ymFmBEJJJK+iwip$6TXS\<hKVjmTp*=mnLW&LdTwi@Wi?1
ITKMF< kZ+>1mR$L#m1=L4a%M8aJktpwn>>tJ%Z\N!jNLt!F*\^Y/NRya@:Dy/*ntM&=QIki?#^ph$jZhZ/B$lw
Nj\Qaq b\dpi$!^Dia/<nqWD1YmLQcL^b<>LjbttWVSXGY>4BwRFNkS=$J=9Vqj5?+@pEEZl\^a!%:A/t!CyEW4
Y%aVu> mil*6j*Q4ShF/NY%p/GNh<mPy!GDGS\!+ceN1R\<mYRJ=NSV>ZE9VI!CSlpjCR8kNy19!q%59L#1SLFm
BRBw&S *RI5P#V?uVW#KS55#a=GwLbhq>JBch6bN!C+V+TD5P^Q/BT*5u%QSXm@^dCQ5lutn>lc:%DF/+8l*+?d
wGM4lN *wn^KRQc\dA!6Q&IHuJBJI+GMjL4J?:tiyJqmT6BhTX?=A>8kFA4Rt94h+#Yjen+lNIV!HCQCFhA/+@C
A@Qu$E YKQkYiX#SJXCFZ8$@Wll%NlI=E1cKdcTZwuFk8mkX*5TLuT<#QNMySW5G>TtS=!a1TjBCFh<%W9!1l&m
L<Mp9L hQNH!jQD1=db?hT9V:!6Fd%Xu?8P#@@<P*j>:n&qMM:*<Q$j9Y#\Mcp6VZ81*HlPM9*n8X@L#<PHAeH+
pPFZ4/ ?^P9yq:SQ>TP8iX&4P6e&BS<<i*IWSqQM@a8lSbYl/u??p6N1CjcGL$!9L^K&DA&yIePqK%=@DX:?!Ai
a\#w&B t^^ClV@>N>p48=jY1JdbY@J>*PT\iQim=4Fn*bKZ*H/R^FQXcEFV^$aj$A9!CkuLkq$9@aikTLnd@BNY
ATTVX8 *X%aqJL==#=pWD/!#pcMl<@M6e<*@DFJ+8b*uGnJj5mkWCA@N!cw6i+:9$<l/@+d?Jbw#W&@INPPc$Zk
C5616@ #BdmSCA<X/DHqlcp+VIpl!aNYSJZhBKZpyCET$EqSCWqJCTlpyITplAy!j>#+yJR8Qmb!ai/tG$qpkkc
9AQT&$ GJ\l/9mZF#P\c58PAiKERE\BV!<^8u^nP6l>q8jW6R&<1y<Wqjl:YlH4HQDRSA1qLlEu8/8JG%miWyN<
miN<!l DIwjGT1ZM>>VptiwC1B6thl4VW#Z=+>/yGVSQc<VQ\H=5KVS9LKewYpy%ht<<>FwWR\S5&:wt^/#Ktah
=SX/&u HuA+WbjJi>Yn!bX@Bp<<1>SddjP^NbwHy/P?AF*F+p=Y^SZj8/*4l/DwpY!VE#6j&PVt*TPy^^!>Eq:%
YBWT*j +4a:$LWt+qIQuQF?F1HykewTyiX@Lk!cj*E\T*M%\S>w^i6P<wiqFJtXImQ=1*RR\G!BcG*DLmeWBADu
mcI9bl ptV5cHChpBl>#c%Ac:XewdXwL!\ede*jiuFR*N*FYd>T\caiGKbQZ&Z@yp8^BeHadmA>5:H/9W/W61%P
>kqu&h :=?$ue@h?<!p*C@&beDYY$hu#QQE*?4FV!Z1bXZP>St<W\9P*J=!AplDDeT46HYiF:nCZR>*/FBNQ=+F
uP+9TB 4j+R5LmZ/AR:TYAY*R\bNny8Z<\c!QVTd>:MGKwYAeTTW4X>*XbRC<BPh$8Li/pCXbN:&t5M@Y%1nM:e
M9EP96 nZYm#B%T=8^CHJ#d/LV=aF*\a6u4BW86%%%dai\i+JGH:tC>C+/qHelYw<LaMQjj+8*AFL<eA=h<tma=
pAEcJa BBjEQj=T6$Y+jMQqGZFwlqS=Nu#>5jNiGaF69abm$/SaMR+c#Su&E^>1C*QPTGM5p<&NaZINqq6mwT=!
y#5u*b mBwwicK+y#LB/NYFy@FkCMhRBXdiSiHtc\8B5#4h$V^+9wM6jAdeS#=C5HwjT\JFp/KlXPtD?t86uyj\
keH+XV eZq^Aj1*XE?a?XXETLwH>Tha\puq:hXRcR*yKeYdtCbMhJqW94liD*YXlQ&wk+kMeW+^8&K4Y&Z5BihT
h4mniL 9y>NpaRbmR>6&#DcNYpRBjhE\ny5B^J55PkW@8ECqw4A^+!$<YqV=Z5NMWQ#iVWDEk&^k=*yVQw/@IG\
am:ldc +%D%QK:#=b&FSH9Y8bP<pmB*SSkj<C1pbk\c%M*X5yl!dP/nL5Yk4*p$tZ*Ct!#l:PSX/nPdI@CmyMAd
QKDZYp <Xy4h<!<?l?Et1a^QaNDM*S!jVY9jJKlItn>XXP*P=hZDdamj!du@M=i+&/18&JS$G*SZ!LQPMA96?8V
wqt%p+ W<$Ic@Y4L4pXHZ&bT4DS4HE<hC@R^1Dqd?1M/IG\mTdit/R8>T4EK#+#>FPE?\KDDMEEy1!p@dpcyW!Q
Dt16>K NH&Cwc/ZN=dQKQihF=pYQ?=hyZR!8kLj^Vlk4FLhj+EAE>I4wB%5!Nj9V4Xp5mR>tyt4G=&EjcI8X6bj
B1/:RR \n4/&K#XhL*Mt*bGHtu@AtXJKmNYE<w@1G^#\jNdycJ%a*6Xdby6mj&h>Cqn:hJEjd6#>d4l6ewcNDa*
m\h/jH WE6V^%kHhLA+jPX%SMCM%9Q#<kK:XMR&Si:Z<:4\PGD%LQS#%qYabd!iTG%1blX!%6yPZM^u6P5WV**P
@t#4!* N=Z%1+6Z6^CH1E?*%DiY&BpeeQDkaY6PTSPZuwRK$JVKqd%^DVYpD#Z:+8u#TDFh?+S&e!P\95+AqGIk
ljc8Fq Z6Q\8c*^6TdXeA^EhM@5+bRec=MR=5F?5*1@cGItladHJLSpSWGH%m:SyKEdES^YcDwCNBpQZ$w<8%T\
8JZE:> =a?@:DDAyn=Z1<$bK#>E?6#%k9<ul6R=eElHe&AdcNL>\LjpQ$VKi!AjA\@9%\ukeZIpl8A+6a\8**6R
YWLFB% k\*1WRPa#J$\TaEupSIh4F$tLbJ&%LRdP&&N/RZ#*@KnY4>c\A\6Dj9$#AR!IEDWSMNcmDX=F&pT+5Kp
W8emaH GPwSWQe>5?!F\?pWii5:uVP*ipZy9m/6?BR$ZET\mYc*IIXZEwn:Hpi#<G5E$yRNk&iSMn$9KX@iCVh9
ni>k:6 >j&G9%=ZY5qSPVNF8c:4FXVM6%C+PB&<#Le%4@68M<$mtqPC>$P5&u8cVqTwR=tF\SKY>uJ=+6*/%A\D
+X9h>+ XbX?Typ/6Y?N6Q:TlAeV$%^SJ5&9MF\^BX%lV\NmPVHeKYq48@t9dkh6YERu<i:q#5Hw?\$q6utNX/Vq
k5nicI W:hTM&6<k=l@@m!S^K?TRPDa8\+?G=@$N!8Sd*R<*>A=S9M/bckdSF5X\jnH/ZBya1eBSEqXSJqWShN?
<>5q:m qy@@pG<+q%ne:\HS*=Tb\TIFq%IW9w=T9>=Lq5I&m5Snh%ClItIZyaG6HA6>P%:5&=jHqt<YJ4^nS&tZ
tn\8yE nXp+$/6=DjQ+S<WEXKeJF9dibPRXZ&W:mT9FK=+LEh$pl!6:E?uY5d>X!9#H#tAY:nuGG?LIIcDw68c6
GdLGDW 5%/uQB9&R>#?leauZLJBcK>AH!ByR:?t>X\Gtd9c:+RND=$MA89+GuDW%FFE/+YL=CjKL<$V$>m+uiC&
\l@SHi Cm8XL/LVEWJqd$yJI:n!DE+SyFLjX+R/qJy>=#F:TNJFb=p?+b:nXZt#+4VlF$\X&P*KiyqG?Mt1P?&1
>4>tXt Nw9b#y%W9/NJ4@dJ<N8K%Phcy*H6TW5&Kij!#bJ1TT4VBZ?CkZ1j%p\@@^\+Yj#<45cD1bcb:w=ei?=u
>T^9FJ H>Q?W>Rqy&V5<D@/*t>Sp:S*^?iHhZMbI:L*$e*@TNJ<6#dma9b@#F:+E9Y>hwRcS$98^u&&tGM%=F6y
HX&iBk I?$Lu9b!1@E^1?^>FDQqy+\^&5KKc^yESZjZpyCum\4:qjy+<FmI<a@6DNSIu=pEC8mbNS4EVp*%J8Hu
lVKw=h wFV<Tt5p!1Fm$hnhWa5AFj<lqIIVWW=6@>Y^Zj>^A/@5\XJE=YiSk&>pER5KY*J9ww?DD>F9iSlP\&4i
9*^l#I q9K@*d$/a+%@BMyCSaEjCTIwBH8p^?9I=RciS\F@nWdbwj:Wlk!A*DqIj*B@Cu?+GyP>twWGI#$m^qCS
F@ZR^W &kw9ue^5Rj\!8^bmdtaa1<%5Hl<k<8@kmDk!IMdJV4#ekB\L%h=*\4l!P8\S=$>#9!14S<Yin>6P$8=l
$Ke#kF DI:1B/cV!5+\^cq^A/MiFcKIqcJSl6Vp^@E?<BAHLP>4B1eI*QBEdRYie:pNbp#qi+yeqt*4+blbYhFY
ltCDHd YGp1#btwjqKMY>FAR+\YqpVBQbde/p!$5#V8E9LjW!=YM$*S>inP*&A@R#W>1$nmFd=NALGhRZnu=ytw
Pu8MXF ^Wq*4VKMhem8SY*LRjH#A1hhNNXeS%u#e6R^HJu^c@:wCeFZnunwj>SW?DN*LaBGk!V<Wne^@JPX%Enm
nFuyD% 6Rqt:kWXbbejQC=4>n5tF8RJ5K%JN1R<&$Sj/u=CTHIhd*k<ChRA1iT%Z84IGhHbXuj@XA**jAVQun?t
*m:5tK N&44Fj4=$+Z&hRFZLtFc5&dee@B*Rje/ZqJ8k:&XSRK>=9NR6yw&d1?^@GnY>Pbk=XVdy&Vuc1ViI1qu
FZ$1pu #<k5Scn=b<y%KE9jW&=V+TZT\4RYqy$d:Zu/jP46u>YiZ&wS@?cJlyV>Y=9Xt:yY1CjijT&RI%qL^d?V
y?QVSy j//y=9@nA<6^njRiNMt%j:pj>a<cj^F9da*!p6ZYbQ61KIka5#JMcqc$Fq4?kIVyM\qd^N6QkIXG@MEY
G+I=aC XjXj+Fw9&Ke@TeDiT?1/m>N$\Gq!XPdZ!y#SmH%mL+ANcKh#Ama4$dDXJ<4$l#TiAYR\PdKFmwNAG4KW
:Dyit> $\kkKuM:i<cMKuVQmK4Y^1WqeF1LTJWt1kuyTj#c1W<!+SMYJ@MWcKebYuJ>kqJ/:4DZT<KYiJQ5=KI*
mj>\6n \$+Fw&$98VISk1@ydlVmFc&?:bE<8iGW+Lb<Pb+6Z=:=aq?!4GI8Qbd/NS?L?h/&heYN1%Q:F%j!\DQw
F+i8wM ^umeqc4<T&S\wqN?#atJF=GdTFW!RhTWw/5Bl/%GWpXWuGcmy6#T5NYtR!S^1<bLIp*Pi1XlNX+1NSe>
ELFhZB t^6eWqYV>qt*W#*14>NhGqq\IL<QEX@e$4!ZY?8GBaiJP/5%5=IPH8IVVQi:K6FdBLY5>L:VIQn$m@N@
RK:9dD 5niaL!=#uhW+NjK*YtY9iaXqq:^@=Yew$yN?bB=GXdn+8!q6J\\GVG8Wbe*w:h#11+V4!VT#pemq9HIM
k1bFT# Zuc/Keyp4?ZTpbmKT1*Lpd/?p?AyM^D<kNCtZS*i8D!XuhC*N6J@yi<tdMCSyE?HkG5&d>^Kj>XGqqZk
ClVAyR <:jW@BbJq5VwqW?$B%D+GKk=AFN:cmhyj%Ga>NVELFDNIhYm^4eH4in?@IuVIau:bHtY<KFwA*V66&wZ
tEKGF? J>$&6Zd?$4wlDGe:1n4jJDjl>=QjwNc>1N=A4=Gm96aA<I!m!9?E>4<ja*<R4\$=J9=#9$1ad@Tn#pID
:n/Z^i uL^&R*\QZAmVQ##nh>N*6ASRtEp$@BB4IH!N!^yCp6CBEL>LC6W>:C\yA@d\*>k9ctZYVn=1a%Y4DAZT
89>8$j 4=E*<kChRl@6ZaBb%@FJc@IIX4EZBc:Nb8<9YA&QJ@\c>!m=R!/XbF+Vaj#cT&VcK#&WlZEywYybZ>*k
5ibMdL <ZkaBhkh\D4S^X:IpH#FapNd&:yh$Z1F%^Zq6*M<b#tm>:Nh=di!XXXqj6@?\MBkQiCPB$CWFWBGC@yS

-A%quK 000a07380bb001202b4 Page 360 of binaries2.zip
4QuZNu >Pik\A:V&1cWEmQ\+VXFGc/tb9/P!m<c&6$i:Wn^!!9#Q!ql&TaW#5dqD5c8BuPqLuQ=M%CW6tT:1b?T
:lbjZ* <8Q1bq&q+KYGmE8qqymtS&BEpcq/QI9IGD1/6bVd\4?<n8QMR96KC^W!a*HdRV+B+$*5p?k+eqyIp1I<
d&d%*b uXGcqHB/>4ac//hdb=@mqVCjGi4IC1>LENh?Glm!>Z\\MF#6w=9GllXHjSPqdNV1qa@L%X!F+D#Sa%u8
G!+F8K q*#qF?R$B?cqR:pLXd%bIc?wWAbmjXc\%ehWVeGA4^abnuF6CV6m1/b$/\V1?H/*cLi&n<14P*E:9ekM
//KW#Y AV%ja+KGL+aEZ4$8PR8be*/AXlA<?HhnSmha&EAw\1$6P>:^4d:SSn%JL/9Y!^lj@TS9$c?e&8a?+TyE
=16C*D d&MAP4#Vcc1Ly5<J:cbdY#A=tVa#?cqkbpQ>XcT?iW1caG>t1<1Icu\pZeIN4j>6yl^MPcP#CkV6G+&m
t9kRZ6 Hh^ZMZAhb/aJ?9#\Z>aiyqbmI>=HBp%X<8D&#j!BV\n>#GKK>unKt8^kVbP^KqmRuwl\D#TtB=qdkI18
aSF&kh uE/^DDmWC4cSul9ITp>QM\PIq&%#\S^SXTiNnSn!@+^GPnFVpk&HhkVL4NE=1cjtbL#!XGY#XKj$Xj%t
ebcXtq EieDpS=4y<j1^46^eCQ^*5TeGL8aYaW*&cSThMd5&%GutVPdHuRlc1X^a4h&L/aW1pYCL<@p5MPj!qJV
n>lp#S Fl+pRmMQ@T5mNuWC^L4NVIua5w*wK<SCDPIe5dbDT?A+=R!Xu&V4=XT*:CtTFC1QK%R#BZjmCQh%/ddj
twJtYK IMS/Zq$++Ibq4DITkA^99JhmW+Eu1h4c^tW=@ZMmPWd=hk\VR*b/$4jqKiR9@cmc:cm?9%u?1G?eGNiY
nn6cJY >8wA8m!\6nnit*y:AHi6CtKIY/kHwJditq6>n:8BJAKR8mdd%5JZAL#$>$d@yT=4/=5eIE$P+1KH?4a/
Zql=WF AXJFEqL@A@4@CTa8J9+@C=EWlW8K@t?B@c@AJGHmMBkEJktSlEDFwbD@:WLEJCF\TRkEIw/TqJV$d&#F
I*=8^V T+=m?:B%EFW>wHcFaC^Zb=4wFKP!</CFpLQY:4A!NIVuVE#^W%FPe<ETIkqp+XP:wRKJbNhC*GAR?$@8
Ca84Im WY5qqn+S&C%iH\kmSp!4ly5<yIW*$TqTLwmL!PjdG+=+p&qTkZR*jQXd/X/A=yi?L=16eY>DmeR+1l/\
Nu\ii* FZ#u6B^kAe&Bn\1K*l@+i?8Ed84b^?WdWiIJAnh@VbTY<ZT%tn#4$L$n?mhTV\\Yq?\XASK/!w@XVmPW
NF$\*^ hNX8!@+GStGFHmPd%eJY6Xab#QWFM\W&4=%$*ql?WkSYmVV48hAAY1:Xji&\9Q8Qnc:bE/dK%MJK?It#
5=#HS& cRTbNw4Lb*&?9uLVwLWk?:wZAJBw%R/KqQn1\kl@@M?A%5yqw!F/eVYQLCa1*9^4i6%<QX@c:B1LjjX*
j\GT=Y pJ8K/GE^#nJpPT?eTm9JNum^*cBPC=KTbL4&Li6e!pEwS<Nn^Tt%p&@jC/Cqn8j8Mam4iPWXNTW$6@QX
PBQM9^ W<<^+&SKK+/=Jh9&lb/I6wX5l#JE4:DDjqy<J&NLje+>&yj&npNM?<S*tjJFc#l$^1*ZV+i4KYk@hl&Y
CZJhw9 RSSIH!Z>?ZdnntpTJnBQ@jH%J^ld&:JkC>Nwc%u+Ej1jLhuV*^KG:19*yi@u%bQRYV#VRdIZnp#N%H$w
m4F6Iu ^wb<4lV<=C5<uwmH4=tqj4t/^5?A>XPyBISd@yR%AEZk>=FKbXdndIZZ>1T85k%&X6Z#:PEmCWXX@Ewc
YM?ywk qp^XeJG+iaGeN8pGQZ>:>jny9#!6/P>Y?BM<h4ePhX^FLXu=JIVkV1c/uKeSe@!MCl:\J4cB1e:%:+K!
JZ4L=^ @TYk^qjIhA8ZQt$?9aFw\kCRVt1\Vut=4+JT@W$&Pq=j4d<#LEKnP:8:XtW5M8*h&Pa!p=t9uWwBFSHi
L#k@?I ^H5N96j&@PMXPc8m9==<9w+pd/S>8Y?uNlP:A$#+P6\=b@Xt5TW%nl#XS*l9#^#9YY%BIlTa#*8*Gi?6
nGVc:I be@6!j*l9mh6S:hZVXXwp*GpBn!=&&R8*^6V/$8J!4nBAPY?L$%$!W%w16lt%/htqBytPFK^iWI8Wlhq
h>RyD6 >KZ6Wt8pe=Lq+Z&DW8I5W@XbVyj*$?>$u#=!#p?haXJ=:!!/QjEk!wN&+PqcGN4*B11==WD*T?N#*E4C
649RWt HjJNh&q/m?#9\4wy$W6QBC9Xj9R\%XhbR?VVY=\!lPP:d=ia1Rmc>FZmI19mBJ/81^tTN:h6S5Y8W4M<
+VJ99X F@jWPQLT>mcquXJ^B6$RD@YF:ehdiD5tl=TIQS=&XHGYk\K^6B%ej8\FQGT>%WC446qDE^6FcYqk%YZm
%J59jX @Bd1KbpZNL@cI1K?JqTN4MAYE$XcWZ=j\p#L9FVZ=p#FNVFlcjQZEP4#W!A1F?>jlyJ/kNKM6hkmp>uT
wVR#*B BH6>b5CHK6KZq56KK6XpCa^\GBE=SRnebE<yI?M1/9Z/J@NCmNn#cX9$>YPWn!/jjR\Vw!LdP@d1iHkj
BCPBWb *tAu<d5aJmiV1HM/YwI*XHQFP&FK=%#!/Je91BZWSEL*:ypMXFqV1+QN$c&L>WYjm/aAC/:ImlA?pk>?
EPw44? +V+Td*i@&@hLB4SMTM@#m:JlCyRcC+RJXW&Han*MamXw$:wq8JLVXEe@&HK\+Qqk:Qi$J1ZT4Pt/4%W$
SEl?bQ !^6!uF?H=ZFa9T51ym*46yk/eIq6lRk&cp9t:%dnlpTL^R:YCVX\6Z9l%W5!jRMIqDZDbGE>Zh8==8hW
E>p$!I $taRkypy>*H59n&nai!y>DLYJQd+Dqp&YVQKW\yNTFCAn4e4e8kqmHA!+6I49DCBN1\/5W@Q8Y$?XhL8
&FK6+t >BnFimu\/S5Nnc9JI<W!>YIS&%Wd<!aGLnP\>%CDL\dVnSXehi%!<#pwp<InB+niad9%QI<qWpPINTEH
=bj4^A HhtKe9wu+QyEQdR\en9*4/tmH:I>qPG@L#bCd1\9QuB5VSQ/8%H6hcckGn/=yJm:=hl&neXIXWWcnGVK
c>^C:! <KXm<n<BbS\ce=w@1WSY/DQc9Z%HP%EJ@4=<9%V&n4nWG$?*$Y*N&W?6@D5uj:Lu*S=@@\mVu9p*C><Q
4TcL>k $tYjXTNw^dJ:QI+etHNCKXa!V!Ze4>m@AV1w/a?P?Q4Hyd@@Qkh4jBc*CGnTXnm51H#WuPiC4Dmk#99d
QX*J^9 Gb/d4w<^Vyb>MqTl9tEdWZ*a&$iapj*AH8cCTqKTIVjaWF?9St^EDDKS1@NKqRuc4pw!=YcbFJ9t%l=E
N5Sb4Q qWtPqd=p4$?It\BnlpXpBj8u6u5^m=BZN&WPiqVyG=A@QiP?jeRtD=hB8=RmPh=LD$+QZJXSBcG9\&%Y
^Hi:Y9 Mp*kmR/\^qT6$\/8@Dh*p@X/*R^=%V/dkc9Xa8M*jSwGQ/dXCe!%J#?XDY?bLHqqB*SJC/aV1Xqd:DEG
8w9%JS jk%@Gi/%tq9=8^=<6VF\j!>8?p*5*@#?:<Wew6GnF>mN<cTnd*1nqcjyB\u?=S<^l>jDp9+ey>PSQXK@
yEJ^*l 5qi**4*%41BG94N8?@nJ8W!u+??haJTa%DCu+L@1=/@qj^6XNIG&#*$:YSb:@J8@VV>!eZ64jb1dTb@\
>5KA5? jtbTZ&X5PEhj5@B%TY<JACj%n$@PZ46=hRn#u$ba<A:wM<?FFRH$i<n=j/MDy\k6Y^V4DMZ&1$G!S#Nc
PJy5SR ctXZ=X6XAMZ?$Et=4cq8^^ucn+=ZRcenVk/Nu!yGRH\q&mPkuPPMt6&Aw<wq?PnMb^/e&pSMTyXbbnnL
dHXh^K q@4&WXF/YPV^j@8TB1YpIBHeALBm6bRa56<y9B@!1Ykj/$D*mL5EDbDG8CKZ/w=DTyKYiTNP65MW<HFl
wuNQMM aB8FM+eZQM!Eh8ipnnqCXpM%KZw=5*:@JwL?<H<tH>t1Xe/HCYlqiJlEp+$6Vb>GV!:EkG<+#t*+Dqt?
tA*kXw ddj!Vl+R1kkQWbRV>pjySM1AK?=JHBb5c!K/y%mh6Gw5?AbJ#9QH8GXeSS*iuQ!!A#!WAM9ekDZ!F&F6
HjAGJZ qbWEAybpDXQ=\$5Dhb6I*MYHKCHT$#8h@Z&dKy!\b?4njRZZmp*eqDEVn%i&A=+HWyXkVt+!RbGYCkG?
enDY*h XHF4R4t^:>H6$H=1c9VtPuw!ZVQttk8e$B8P^5N+ByR+CF+J@DKK>TQjZ&RI?Wd5QHj5eK#n8Wpiek/C
X+#<DX hD&GFFcNSBP^/lCNNQ6mlpu4WRm$JMdbSLR5RSZL=Cw\yBEQddE^pCZRIlKRK!StTkjJkwbb<9c9AFTE
dh8p#/ M&T6:?Q$*k@j\WmYj1yL6!CbJpp+$%IWP4X8l4k*+1LT@Qj$*Hn:/<c:K+e\EPKSAX9<H?hBYN/NI4Cw
mQiJ>M N6enT8wcj%h<jiY$>bnYj>SD/KKlYS\*kkR:eWB?Qy9jq!D#m#9Ac!lnAV4WNd1jeqCw*d\XYK/SEuHX
mtcBAD Hhii#\$%H$eaqGFTpFD4tAt@!t6YnS9DG6Ej+ZL&/TS5>wR&\qN&H5GmNj$j9SWkGljIYkP>R:N@1I#h
E+GlLd c:%1pXMNMm5AulF<l6MdZQJ%S^iKe9yPBPQjiT!=t\q%ERW5yLTpYdYe6y6iT1ew4MCdB^+m:pD<#VD<
PGYB=> u=I<qSCSZSG*hy*DQmF9B?\?P\#^d#+e4X*^nVH!/j9F>6YbNb$>GIpPX5mLh/QMy&mtZ8&H9B!^W?a%
8MqhV# hG@YZ#TbXh9=AcEymbnHR<4hAkp#9F8tMtneAt6IEd1HTyFP&P8dAFY9u!nbXlXt<tl&pD6:*PRhywb%
BBPBjR B4#SVwkw**H+Z#!FT5IqJTTq@njAWqKT@@<RqbV/Z*!XlEu<L>#?Z:+X$bTCR/$>lBZq:i!ejb#h*c!^
dlF<>/ \q/9Qd^l@*jNBbP!V8@?NGqq\%RYt98Za8ycR*Ck:BF8nuHRyp!/py<!n@M9G^X%WT&mZ%j&81ji\&1Q
nnLMnw QJ^*=Ih\5YIuR=T\LuK:Vh5:aC?!uuic41P8D41jiFdH4Kk#R#pkJcM=j=MwwAuiTjp5&pb8#4T5RYqC
?S\Q<A h!%Detk%ZN%P\D5bSiqKIL>IjIG/:c%ZYbnu?6=V6=RkwX:Hmn$bM&kd?66=qdBV6*JGSL%n1Qnqi?$p
\jqPb8 :?hBPX*F#*WbnjVhP@aVnGdj=abXI?t*c^WZb+YBJ^>YAT!uC#Y%G49mimNCMb@9C=199u?1w&Bj!*FB
*wGZJb ZmX^XC%t/Ih:Y>#L6N4c\T*</&=w:Skn8X\et#KNZ?&<$u*@ZyamM$?Ay@aMn^%^y9q=i$8mTPiy&m4b
hVhBeq ?#!h=Sd:lKly6<+Dm+/e4<HmJ5P6=#5=G:l%y^^b/8eAMh5YV/D<l+B=bKBBG\ia\*bp<@54u$DF\$S>
5c&E64 m6Vn\Su=ine&u+CXiEmKw/44?iDZkLNHe9M%Tb&\WS?pbyb<mZSH%YJ%yGLujh%jjb8dbN%bkNkaLV>A
F<5T/a \#X481YXj8MmWyl*C@4qaStmKV&h*lZRyup+9jhBX:d?aCXJ$jVkt4be/tS5EFi!9h&=<4lVi1Q9kVcA
hk5&16 VjH#T6htt!=nEntLA*V4?*6l$d?hL\\<W>PmLcjZA\wMech4<5*BI/&ZMw+y9wp8S##hT\a8q5@=Z<!a
t&PAQj Z#c8jl/YL@$CEJH@$Y<d6=W:!Y<N*D%+Z8u@I@%=Q?Kap#benQ$yw!p#/q#%K#j$%GES/pSEWt*F9ScX
1Y$Chn N#:^T$S8LJ%6pMq&eX=jP$y95nHG:mI5^h+B1<dT!eXWQZ><1%+=#Q=H/\PBVI&R$FN>$hhG++:iSJq?
RtZnSC +c\P9awC\SL<L^RH\wLYDZ>Pk>!t4pd:WX?yt+dl/6<*Y58G1DI*=DkRKhN56^F!K@\ik9bH$wJDMm*J
wHN%G: u?hM6AquI?mD^9Yit+HBXM*!FXijVFkhLV\jtKV<PlEihVwL9d+u\m6ZL%K1/8/i&G+iWk5Rw+YwZ+mI
-A&WFI 000cfc6c7be001202b4 Page 361 of binaries2.zip
heuHQ@ QY*:y1c556A&Ak^bbGhWS=l#n#$4FCPuuw=k5p6&LtT&J<ea9=QNh@F#KPn<A$+</k/a?9tqQ!LwK@PG
+d&HY4 qA11c:N+F\tmEm\DWGm^nEVyFRMEMZcX*ML8Bk<T$le/lp<qlLPaH9mTmMi&?t$dCFcPn%KIk5/+:NqQ
nkyqRI +nuA$iS&pkKPW8SP\%^w/p+tmGJK4>E66XQ>SKLc65K6X6hGCiZ8ad%hB5kR=%6=V9KBijZ$PJi1HkDZ
QMAAam YIcb8I91/!Ya6k=B$G9i:Q5Cd:%8TS8Z?SMBcj1t^a/aaEZAI:qTQKmu!$<Z*u5Shp:>ba/Ph*Gb?S@?
*PC$B? 9S=qt<\6^*%>%l5kSp>h4jTAGbutt:T:Ec+VndN\htpneG5<?4^t<EXc98bY$mF#QT&>#T\JdYSS$a8e
YK&Z&1 ^SRw#QV/9CHLYZ>mmtI?lbQC>X^hYJ+LYJIdq%h4F%&XV1Je6RX=K%+S*8hHW&t:du^CHWu^VDuwi!1C
>6QBdj *<ZQYD^X&T=#ytJ$FH1pW/Y>q<$:L&ueKWnCKGKeVn1LhSN#6!nVM1qKKGR4$<1$#65+EP$98Wy>8@Tb
Q9JMjG NI1t>PtVJ!pjt:q#iX>XV9a=Q9%X<@ujdcZtd=Aw$:!%m?jd<B#y%P1wH?pD^bwcZ@ikY$QVR1I/9w?1
IWwN%C T#t%#Dl6?Z?>6pPeJM%yZBd18wl\6FM%8npR!I*!&LH$?1BF:P=bWQ5M&qS%Da/Q8cRm&V&Qb^TpDBlX
y+cAe% QlPEZdyZ!DT/tL!E6V*FN4?45P&j&&:5<eqNC8Gd@ME51kC5X4TmGpMLGPDb=#>WHLjL\:Xj/=9\Q$:V
GcHC?j !Z\&bGj$tEAy^THZPw=ITGap$*V8w1ma6@W8<6+y$FblHjca9$cyY>q^&VM$*:th:IjmwZ**#&6d5Hnb
P<H:q& d*&6PkuMwZE=*GR?pE/*+bW8ted<=:J5G%juPP6RwiG%RWbuHKdD18R&qau@4#aL6c9t$R^Etj<L1nTk
ZGibJP T@QaKJlYPFIai%@FJ@k&@+QDXn=1^Kp1MlDu!H4TqPQcjbFI<@ZHt>?YQ%%5>bK&XR+5Zi&/K!G8+u<*
&TDSV/ 1V5bq++Q@*$udQ@?B?ciK*YNYy9#&c1$Ymqeh?&tZpn<&9a*Z8AJ@b5d6&T8+di1#8yVIJEu?PTQqnPa
$bp8E= PT^:D6iHC%nZ6n<y$!hp^G=8@H>e?kP5eE&\Law8&:b6&:c>%4h5&:b6&:b6&:b6*u@9i<=:L/>1h1W4
LST=R1 QbP14nHT/W1c=>Pe%PS!Q+/YRwtBWQlbaQ>ljV4clB8RL?Wu4JmS>ZADy>i@$CehYlLyBeLnp4MZFG5#
%WmISj tbi^5yqj45R&$/bml$?*+DTN5=!cTdaL>kd^htd&F:b%R:l%N@cAYwna!^Bj<Wm*^jN#ibR8JiaG:!a=
#*:<4W IK#%/mSXD%W9j$Lp<WYT*=&Sn*bE?V988np9&k5WDmI$#6ID1^BLtBk8^A^u6#>m#iwmy!SI&*nqQw*&
ey@#+S kJ%KQ666yeZGh48w/JFb1%cZK!8wmp@R496<Bn*I&/t>aH%&T=95tW&iZFKjc1SWP\Xt$Rtt=kt>=%4=
1m9+WS /tu+B:uqk#1yW998k9l\$kVRi1>XeYby1<=IkyNk@eN5Hib8hIji?^9iYWjW>9m&?pTY!GK&heRtPX>k
T8Zy@V 6>t/QK%ISJR+E</M=BGe#4EWaAeMnFEW4u$Yy1M&t88Y^\%cBub@X$KMSV5!ju=t>lFB1LBKypMW#6hR
+hN^SQ yK=1i/9Pj>1wh4p1>*^K=NDitKSWld*EXQEW11ht%pl$C<!pi\5lhctt>bl8N!I&5kIiyDm<8>AYD5=i
9iA9\S 9+=?uL=wCewp*pt<B1c?X1JM\plA+@leN#LmF?!<q9p5CVbiJRDAhm\P1m>w*GiWl$*kYHpwCcFtMbh<
Y*M$k* 5t^imCZIbCC+?clw%ES&qCZI5#NaJTnIDaRSlk&W1L!pBp\8Wc^CGYX&M<SK/k5C/PGBStimYM^/$9Fw
@X$*+B M<RBScpE/$l!CKpWyR@l*Yce/umBSZ9?XMiBFEN<Abu5<dM<ud*W6LawF&=BSS$TF/+p@/w5&Q$T=ymW
LGl8Em 49L58\#CMddtq*5mDDJBF/cPb%$Bb*%cwV9Mt=ulWi#<MHA/M$k+$pdPp^M!DAp8pu^$CRMWR\?p8nS$
H@A5\< ?B!eS$hYJ*cETHu!WjqWwZJKqkkWF?@8>J\J^&kT6\R+E6c+PdBpQQC/Ywq^?9\SmuYSJih<hXc!8PS8
y*L!I& tA*Slm^SJJNk&GBe/J5P/Bc1$!Cpe48EpqlJX:4M8i6YE\n^?PSP1lbSX+<?@@:T<^Zi<<&c:1cm<dBj
J6455N Edn<tme@5hj<E8#1$jEiFMVSX@>t66T$j?R+X:#PWp#S6AB/M/Zj<4MiHb<B/4*^>kMiSVwi/mi8@QiM
i@\NWE bYiKVVF!DEDmeDb8B$C$9yJeS/Q8e4iBV9?GSZt88Lei=PP^lVdIqHM8j>pPn/YlZwc^Pi@YWGS@@\La
VNwnPm $Z>5BiQG&/YEab5edKqit*1+Zwqb*&>puV9Y<Y?\MmDJn5WSuu4iPBQm9HPcuZDJtB8WTIw?9%<tn8Nl
N6l8*B 8y#Kp%X<kqP=*Yd$8qhM/bL1M/:^mR$8?Y?5l6Np5iX8&=hykd4@mWNPR8FmeWqkMk5cnKh<NGm/Z=5K
4VF^D% ycb1PySGl$eW1=Q15P%??Ahc6?MEm6XICm:K8G#IPDCPCC=Kyc/8Zd\wW4ww5bNmep68Mhl&5#?yBdTW
G%1J#@ !i>KnJhk6:#<t851Ad4&>?Y^>@lc1y6IGwliEm?@@E<pWNS!>NiMunpJtCX$8*qw9bJeGFCc:C6TRVWJ
G:q^>p WGIiXBIbp?qYwuL1ihecX\lS4nl^$TD&Aah?RBLM%M>BD%%bnt9@?h+=S=Ib/?&8maJ?>i$JYpIbCCbJ
Z5REkP BJcqFydW84DB?G5S1C/+</jb*IRqZyWqpt&Sy>V=S$:F@5R$e>HbuSulj1S@FTd@Wa?F!mC+mG!P:k?e
PSXw+c mV9lW@u5&nn$&BZiV!W$p1jPt1PP/SwM!=htjuTBR:#ISJtXdZT^9/C@6DEW!/DjX8F&qLWeaZ@59Niw
Kc*h<l i\D+F&\WE<+^qj+Rm6<IlZFGmWCwlQJcdjGI4>Qj>Nw8%yeGwhAKuZd1?<\EVl#KVHmwX1eEc*BKdN#J
GCDlq4 nSVSQ#Be:9n8V^9ID@CFWn6anD4l<5Wb4pq@>Mkbq5kJHZK/XhTEKB8pipHa!+A!$Em/HC!FTQmIR1De
Qt*ZC? Y1Q\n@KIV>tiSY%tMXc5kScP#YAY!:YJ\atWHTeT+!Y$hyNa%mCc4*t^j/Fj+h1Jy*/e$!BtAQcbpJ^K
MDWu$9 wyc&8$u$eq>leI@^u14^m6&/qt9ijG>=AXS&AnVt>HeYHY85q%*e?S4ku%El1N:5Q&!HT^mB\aiS+cbF
kRl%#% M!6qMAPL%I44#%L>TbnTj5jd<%IwLQjbK%\w8P4Y:?4WNRI&6YwwNZNIwN5/Vp+wthJIG?alA<nL#F9G
V^/HDi @p4X/e4L<bnuJquaNuRS=&m/R:%y=:LdNh8G$X5tkVqGwMIIiMLlQt#KV!&pRp8C:Z>%hM*LCR\wi@LN
Xm:>Bh 9<eyaR#$H\#p\LJuWB$paRBX=YDQBE&mZXJFw#:RX@aQTTCXSSL>G\BN=u%&4h?QdR^#hR!J*SpENkS&
CHTik+ lA^WphYtJmmTW$^$+/pl8C#I%I1%cWmuW6FZ:AAql=^^ujjt&1=RP*nNQNptd?lSm5LEY!JV*Aaq1nnW
dD1i!@ IS:uNMiT\MKWTiR9/+=*c1\X@bPTRE>D@@QMpP&@q8&@9w!XqbtbpaPXk=YJnatNniQ@Xa:@YnhPq1??
SKQwd< \lku@TYC?T>dFElm<*$&WMJ?BccaIwy6Lua:w>#uEGD:&e5P8KMq!HbCe>QZehuqM8w&icQ>d^m==RBC
uQnhAb YGIMyh??G!@DahDKiMPJ!EAmkt%It?*k#>ABkehV1WCbILLwSRpFV8/p<hN48CKMe/+!bi+jAFKaTwLE
I?%eS& EWbcmtE\\8:6ILCCj885$Bty?XY^tZD>WHHb@5!>WLk6*%jayiduW:BHlNH:Hqc4%PjPwTDjK!tX/T^N
JH%L1h TV8nK:dPPREVKk%/E/#uMMB+Si&PqKXKFQXXAWWhcpLl<m8Nc?+pLT&%E&&BH5K1hY:PkJy@b9>1ZWCh
L$B*Dc RPGD6!\$%W#$DEIcpW?jR%@nF\\XqL!*%Qaht?5I!FJ!F1@$DyIuBPHYwK5jPq1@R$?%&Hc1BQeuTj?^
J$>FQH 4YKRajH18X4%/P^1YA%i1ZGw>wnLWwl5lnC#ml!9NM>pLuF&8WR@lai/?!5u\BV=D%=9K\qw</^=Cmm4
RP$m>L ue9hG^F118t1<?\:VbhRZ$#PqKT*l:h/:9L1>AF*?Z/4I<?tZ<Hc%tmVYH:yQDJHh:1&w<\S$#Fk!NQ=
4!6?*5 Tn&H84VG*4N:ltlcY^1IBBk=Ew>W96w5Yh$#^NGLQKJ4%hbZ:q%l<h\?lNKQJKjbcPjm&6/9+4&ik4G:
W/!8kL @5VJR9mZw+4iJP>95TP#lPl\bMdl55&^6^w\6Z$?6ZS41ZGl1#&^Iih?Y<!TIb6$\ENHZP?4<b*\d\mP
FwniQq cLGe$8IGcQGt#mW!\8acq/uF?KH4a1@WXRW<:/\bJ%@CG\%d&+wiMddtJtqD5MwVhu#^t^Kq+AXbEh1S
=CmCpF ^6K\ctHmN\Pa&uu9%bAWP<6uhRDK*iTDlaNA+a\#MWbZH>IPlWKlC>*/RI?EB+q18iFYjuQY4/n%uaw=
hE<BE/ +pibl>%wu6i8&@4ECyq/\Naeq4%6H<ec198JE>+LtJW&L*%n/6tL5A\l=!AFSM&!J#km><cd%?qaC\jT
Y4&\?c &#IQAd6&=T@6cpuhtLT=^9cuST%!N9APR15:C9BD$1GKlmHp/qXdPDYI:pAWEQNRT=Xak/uch!X<c*LX
TZB19k BLIHlwKh\A>/TV8/w?V&D*clI!?CSj^4JQhRcMeaSATF8n:tL%W#Q!\T>/wREyd8AKVb=Ep*TAkldI8\
!#cndF VN@^WLMeI%!tY6yQtSN8VbPEDc@NX$A+/qcVitI#ch\I#>hcqE/Q!MRJ^a^lV=4c=YIWieW^D8/Jy1d?
\VE@tc 6?nVMkab^EX&MTj*JILCBWq\S^LQ+HaDRBA/*n^B&k$XdnpKZVb/:wSpVi=b%mkwaBwKJhjpHeQk!!?=
\d>YVZ CXMDX?@CFaaWXE&cIqS?5CH*kEZBEWpL6nb+I$<@$quCyTh1kqkp#/l11%B&nX$EjCTlenI8+I=$wHh5
$/W9yR t@a\IXnZqByjj1\K!=l<tYQyQwP:A1A!RmeqJ%Jdm@S$EV5Fcd?<ewehk!ZM?Z#ntlhy^TNME/Yl@CGi
T9Dn8D &aREp#B5St%>A+>6FKpnuR=FIjw>TeDEb^GyKC&<<yBdqBck1Iu$KuZZ9%jmX66e1MAE>5!u\QXl\qFm
aad>QL iC=:CZPLN=KmYmVl1Mla54XBC8bnkCmp^IdSFW?5IANq/GAPL86cBS44SR!T:%#Sc1/yJnaiP*FhStX?
eitc:> Slhi&/4$uBQ*QQNBR/CNbXG6yKAWRd*nD8><!%XVdHc+X<6T^qJLA6c8dDw?qmNLY$Q9@5%kShN!S$8i
%*FLlP QE9Z^J=YDK5:M54DEDEDhKm@ICPy^JB@p5P>Qnm*5P:EB$/w^:i%@qby@YDNXJPR!cyNpAwIb@/Y/E4d
Dkk4C: !1CWl4*cF/*&my6^JHG/55AJPQ%bB?wiZ%?=NealS$FHPR$qb:ZtEHck5ep8WIe</S5W?WB>qDS/BGh=
9?C/&m DX1tVYmaStqS9I54FRqKcHnGLpcc!^1CChnP+kK8QbCny<D<B$+XlS?XN?W@X1F#!\biy@=I>c=9l5#h
MZP18/ AR14cu/XZBPuVGCGDy!hh*KqZZEkYB!=^BE*GBD!<WyKA+8dk8&FX<NF1p:16B@j*HQVdBdcHEd#me6<
#<M:%N G<&XWw!G1<=I4uMp*1$F4FA#1AJFK1Ra4:/:WQhbEA>9KDFLS$mw4KpEbiBh1KNXjiZF?9nadBEGDpMm
-AZktN 000deae90b7001202b4 Page 362 of binaries2.zip
tGSQ+u >#=!b&&H%jPT8eZialN>yt&u&eQa&yVR\+c>$BQR$HP?#6=p$NP/8kud85</=AZ&W8C^tF^m^SDbV+?W
8B8St? mISH%lkjVjCWuAltSRtMAWbYD!Quti5Zejc+NCXjquS^/yQh@buHi?8^9h$/851NdYt4>h1$@i1X!w*t
l#M1Z4 %dTVi&&4eV9t!6&\E*6#44&>=9y5%HDSPuhy/!M*qphQPCeQdJ5/j?/hP#aud4iy\!NBn!!B6c?HS$@E
P6=ePh BAeaWY$5J?lSZeATV+<T+F:AAe<ykS+^CB>9lTqEVku$\Py@L18QpY$ChA>L!CE\9Nd<hDj?P%Rcq6b@
www>Td <cRh%:?=^6c$*ZByW*Nn=KX=/<Y*?y?**qbkh9qdb4TW%meH>q@I8^@hkPkkVhAV<AkMkY=bkkeNiQ>:
G<u!%p QE1Cl?m\j9j1+9nIWTW\S#\LKNBDEVtE@%KVNTFJFI1QuBTa>^mW\Kk&M=4:\@MnN44c>/t#=a*y!e4!
%V6&W% ath48dHFqedPHZMeQaqhdh1JteJPjcd=Rn6a1dYy8QVI+R5/>8dC6@1D?<9?1#l@$IVHBKQA9PARGCHR
iZXtDi 6W?WpQ%9Y<FEnwpTQEDQ@>YdkphNiQkA9J4A$IykqRqGDaGSmB!CD*l+u<eAtDZiMGkR>A!k^+nc/Q8*
?:5#=j /SXQX*!p@btNZ*u#9<Cn1#$%QT$>%Y?$Hhh86Q?q$kQNN%c\6P&hy%#l?@Q*QW<Hw!?Q>N&PpVt1\Mn1
S1aAkJ 4$8Nie?eDCMLnAIn>S@KJIpC*jQSJ5C5!jEiw!K4T9AB!J4d4*<+9@VZjuH$8h6i&6yd@&Jc&HudZZln
?F$Nwt S#i#W6ij4>#c/9<H=>ddNhi8N4l16@@1ZQ4HiZLLJ>:@9Q:&Nih*?>A@!%6K<l?C?$?c\yRp<bGDpmSB
Rp4Spw M$BQ!jEe+/#JRRep$DQG/JGV&$@j<9\JT<JV#:up5hti&tu>@&?5@\Jh&%lqYj&*ISyddVP4L4/StCqQ
l*Mn#a 6P&YuhnbPXij8HX4Q?Z*Q9dZ*G!+LB@Bd@tKm?<AEH6dV/@ujY99b>/99/E*PWD*jpdPS<b+R!5m55cA
kDQm6< !EGB+XYp?@@kn6h6TIbSA4QCSPRAI\jwq6XHn<nZbRmI!DinBHwj@+>>@a!5$eZB1\1MA4N&e+<N:%tY
\DBp56 6q+/@#F5#ekKN/bqjW9bciQY!^P61/*kbd%l?@h\#P^qa@%&nbhHH8mlj!\CnN?h=:?E@4a=<MDZCt:K
uiaK>B kI*P^9H?QP=?e1pn5kMj+l<CYA>Rw!MpMEiXRI<kTiInBA@A@R$VJVApCb+$lek^JYGApSLBE4Z^j9WM
\klWCt Z9uH$1Rhd&#5dP!5:K#+Xqhjq:edPt:eYtw%665K4Ly+6^#Z@Q/6d#?jQPPVH#%b\99?Bj&Wp4Ynb\+8
Z8*W4L ZGGCYWFkDW4\GBEM4+LIt6CDS^RuCw!B^+9I/58TJGKMb=MEDe?:F?QbB*kM/wdqHj9Cq<bNmT<>P%:a
V9EYh8 +j$Q/6yd!w=4LVE*FS$&@+NJ:dY4c%jV@\Lk%jAj%ZF#c1@jnB#uZHjY4/>h@bRdnH#N=QM@ePX#5:q@
VFF$AE ^u:?Fl@^ktd?K&+hiZXa=Q<\L:wan\R>tmSwXDB!*GNWTakc!AwV>FCBHktZ+IGF!A4ccP/i=@QSD@*B
ukWH8= D*u+kWeiidn9m8hZnX@#$BP9hL5ZdHN*M:h$>YC=>V<T=1/^4d/899=QN45lQVN8Sn:T@khDeWCQ$Qj:
@+atK/ 9mTI?*#kip@>>95:uQ>DCJ>c:4h9@J9Mee@nd?pb<AnRR+j@/G>EiPmRwDEiMT1aKhB>Am=JEp?QuMAc
yj9S/n 9><LGDp1PCn+pA!n^yVa<b8u>#@<LF5cij/wGY8yejw@WPD?d$X5Kn1MZL%cht4@P@n?\<QP/h@YR8%9
mCbay# F*@6YGu8$$heY&:4WpDD$!Q6Z=!jk><S55cp+BttBH1?LqqnI1KGBA<AAMCjV@WkCCdweHWq8J$@RE$J
5/DDM1 y^lABV+RFAEAFJSubJC4td8+tb8\CA9LYB\L@E+?M4c1D@&Xc9\y#\46C8&$S%?NYpKX>qL4T4Hw^cZq
cQV!uy I6G&biV@MTi:XSJSmcM%^ChcXWVN+S%Tpa8/cl#<1MYmk!M!MnVRIVG=ltn<>WL>:SyykNBAC@VD!&*W
F+ShHH 1T=+h>\L8Xt5R1kmP>#<B#1bGnM@8Gyq$4XF8Q!iq8?%Yp6@4X1:Mc#%lP%pKaaN&+&AhjP@8SJN%?H\
eAD?ci Gu8ER&bejF+HL?6cLV8*Qe/*@wyXTtu8+E$\CNp?B5JimVY#6Z>QA8<q$DLSb/^d?t/JqhXwN%dmuDe9
Hqb6<p F%$Y^cFtSH^j$K?yE$^4JEeeqSR1!*aqqYS&<MCWI6&=!+Z&5=dKqe1XK81^PVD48BQ!WCwcFchhe6mT
K1^Jth S%^dNpP!LJ6QEt9B4Y6:6@i4&?+&:d4am\>T&?S@1+j55b1%>E%?G*M*=M+H4*/LWd6Di@pliRt+V>^q
F4q1&@ k!C=w\eN:dwE86K/JXc*=qAjD+4ttB<Q@?KK?Kkdu5%GSKQRS$cm$Gm$wQm<XVVc%XW:R6!^R=!^*#Z/
+YIV1k >pKCWh\%BMXDay$Ep6b:WZaSTJbjtW@Gpe!SjA+D!Q^dA+kj\lj#+$p/JjMqXpeK\AuwDYH%@HpEl/MH
86%eGQ a988Q&5c656lYGuu=+4FJJA^W/IuS$&MtBy<45GjC<GZ9j\!puLn6@RGJ<Re5^4BeCnNhK$Z\*S>GPY/
F1h<&% M%%hn8Vj4/bqI6dC+E/ay%a=%p?j9GhKtS6\cSc/GTAd!\a#m%$ZdyhlpwtiRie1nJ=nhZp+*yYLbwPi
>K@H=D b+SmBQ%hLFbljb!1th\&8E>qkVh=4uX!hXiMJ$5tKt:WlEcmDk>j$$%XBBwM*>6dXaTyCLTJE%IR/KMc
BC9y:J C$GnRu^p?FBuI$KCpk#$D#A$ClbDIpuKNe=+T=ABCM8H@nTu>QBwJq=N4N\SZpB@kyc=C6=!yXW#9t!T
eiP9+$ @6QECVQQBB8ELFt=JYZ:&>eP:%d85!%*&A1\&%W@!\yq?=@BV86:4QalWb>9@nRwaeR=hccD4TBPl>S>
$/K1\M tB<^YypjtR/VbyycVNMu:5bq=9<G6%J:1/\&\:h8y8p$Q:w%%u@t<ME/%>Zk9SF&I?#\8<wWQ?1MR>&W
=umE1a h:A*y\:1?\#1ul*1tHN\AM/?uk+NhHCp:byG8:MJQun8jP1$eVkne8pVL@6qu9X@qaa#Jm<N:?1jYZMF
wI6J+^ ChRj:a:pdl\>1jeRT4\Z@dW>*WLca/qZ1@cm*c*5\MbRSLIeNnl5WGlBl@P:a$wF6aKJuKQEn^^K4k=I
?DS5tc t<j!te4y<u?/V*1Q>N8lSS!4@lyP=ahijRKP<T8n?6!?AG6PM=hqHl4q&Ne5:N+Vp!ZCwy9K5kCLqwj$
MI4Pth u^HnFtHS^LlBYDAeKRhwF9/9@k:&6jLb%B@1WL@L>jXMcDwb>w%$cF4@=l5ZRpMT5\mNm!A$H@\GMa8h
HPPAK\ V@\5eCp8*@I<P9S?MZhPXjw<TRyTb$@<Hj5=>ZH1RT&9RiluZp&yk<Vq>Mih/ZqJm5#VLDcV!6n9j1X!
V5lZmQ #Ik5Ze1PJF^@Hl8?eIQDM\ma4BmYP6NDeXV$y*u5B=Jc^YA\GQG<>TeeleGe/kiC!BYnMbk\#FmmR*GE
k9lHk= >MeNMGGaK$cHWAMw^9Pic&Apma\II\j>nSph$k$j5lthYp5?Ku!9X#dVdp6?KwK<JI4Z$J6ANuQwhb<#
lH41\u d:8!q$=Xa<iic8%Q+?\4juWQVQj%YZpHj#y=i&Zu*\mq\<@/bCphGMhq/y4BK4488MVBp=db*i98pN^1
$XXqpb aC?hbtBjaF<4&my6L4M5:LDK\C4/=bD?AjXKR*=RIe/n@XW8d&awwXqb9GVGAcQEMQ=LP/81%eQ/k/Pa
ditQd^ V/QXhQqAb8yX:mDHAD$w*6nHIQXI?QI*^GK^CT^jKBJ:cPm&6mB\B%9w65X/MXmwZ%Z5bp&MkA$8HDLA
/@ZIty nN@kMDjj?L:\5LDeP::pZF%=@CZN5hQD=DwCmiCjhSp%<1B$<lPS*J#?6*?WeeXqi*S^=R95#ennblZ:
DcM*<K nXm>Z^^ue6SAF\jYLd\*iq*4nj5/5j?Ka!Pu:&1yhSawSh$kYwqi!d&ZYqI!!Z96TmXHHh8F5@Jy+i&V
#FC*4@ N%Ih5MK:w4CmX899$Ft4k=J&NCA=^bmG#6JGH@IqZAy!ppSXa\yT5QBB#$DKBFRFXkY884b*HyYywE#H
ln1AbA K@C&K89mcSV6@pyhH9Flm:9^kj#I!4n*/4=V@eFQLPq>pY#AL=N/DLFRpyb$#:K!lCu&9t**lGF%>Red
u#HdhC XNB<\&HD!+e6ZS&/WL?bReXm%=Q+V>Lq>%XN4lTKT5T6I#BH>Y8H48@IQp**@?y!&#cu>dVTZhT4>PL@
=kAH>K KD*Z%JWVq%WJ&>wdTe*K#=ywhIZ*/n4Fwh$$iuG+MRwTYuIME!DF4VER%@E+@HwG+J6bQDMyL+YcqKhC
e?:kWF e@J#kRjqlVCT<8lDR^Q8!Y/MXE1cJ+9=HudMR#j4$@V@jDGljhlDPq*6X9ZdwS$6<S9<n6la95RG>bb8
qZ:KSL =89YFn&\wdPXEd9AQp#@VhllW>$4h9*@EKAI*eQD*N*h\<Qh@>Q@JPJ@:j?Ki:nd@@H@:+n+@/#<H+tI
\ZcZ5j mQ#@@9?jt^ES<j@4@meb@*@?@%&Q?F<*I!JVMe5>+LX#cb^ZnypuTIE6m>y!iq^?4pq$QpZ+cRyua#\j
1tRRyD J<&uD$$6I=kQW&>cat&R+^^?<8#cmL>*qcZwq%I%kLw\N%&nP+ubn!:N4Tty14?EM%*#%PCj?!b?WVYN
D<DV$M a!quiK4wd1H>9YSMw&JE\iY5Y9<kY8#qV<Q^uGiBQD\FBTE1Q*wGE1uYejFqHkWE!<c*KHH>W&m11M@F
i+5dAb JVy9ZS4G^Kj%4k6B:tVWG%%m4a^E9&jHIk8H1T$yHA5qW%A$@k+Gn5n*6S#kaJDbnjyTA&i&/C$HmiX#
D4$kND iw>Gj=TqnN1Y=qFC5@A\HEmSP49$$yFjV$Hda5<ue@$!9Yd>#yG/Fh6cjXG^SC=/wjWu#%wBlP6QeT&+
b5^cI1 iVF#K#K+h$695dA^:VMpBc:t*M@qLq1Ae<4^^*lek$%XpdG1@b<$D&&cW/eB&bDTtLPACmn?*bVY^a*R
GiuK\y BPn4a6nQ>cd&9*h9>c@\@iH$hd!V$BtQL@uF&QN$WL<u6b!68+!*6P!>aTcV::Vecm?9&lp^$815hA@N
Z!8<=\ 55RH#WL+TE5<4*\t*ynh:J5J1Z?YR/q@Q8KFubISCdAecLjNG^<KwLc>\/d9u1>:eFIbPyd$9=%Aa&Fb
$Sc1BT nb$a?RTbPdehPV@luV9+nFN^+%ucH+4hJ<M@h^BMP4@eNwh::k<8VC4dJKqS@t+cpAn6uD9j\BSMuKV5
Wq&!bJ HCm5@\kd=GiZGu6E+mRunF$iKi1X!H%l\=\&JcSj*6QTqZV$jq!QqlPDCS=1#hLiZbYP:^d$YD&tH%P:
e5*h8/ Qbn%SQN$yW@\XEX9C+Sp^#h@4+5LLdDXtmultT+>SEwh^J!PIl?hTul#J*5pbXd4!kSAnN+Kaa*QK\&i
wKj8^Z XldhaS%/b>6Qp4l8YDBnqnP1hqtCh#pC\/^@Mte#c+WJCD*JcylN1wVW:LMu6Vw&D5\*mcJhHZ&S\>R*
L9aFmK aayLX:RA#V\N=#1y1RLJ5?lLkKmHT1V5eE=b#G/dj!Xdt<ZZ!L^<C<??<eWwj9Nu\HL65LPn+ikp9liD
M$?q8i Q9>PakdT8ZPaqQ>F*4&HSTp5pid:8BeiI*K#*w#5WIiew*&tXM=&4Lwn5#&ZF>G&P*%hmnhHHbMukjGi
!+6iy^ ^Tj+=1!SF+8L>VXw!&:&Qt/=pS#MbTkp=&&*ww+ZK8tl9NlBDie<%D!FFn><kV$lk*/qPV<qMhDauM!L
*1hJ:B hdK/yu>L+1Q/djiJlCT^P=kCp1DKM%DXlG!@Y?9w6m$1!HIj$=iDqQuR!Q<+K/Zh=d*EQkqSn!/iRw<K
-AkM*8 000370c6d66001202b4 Page 363 of binaries2.zip
q@H\&Z WFm\^awA==#e\jX&IJhD^pc=CVhTC#e$ViN/\VLATP=aH>9t:H&DTu5I6X*=9q!1J#?JD@9a8lt\@c!L
*1p@>Z y99lj*Mq=uEN^+qpHuE9cEEZ>pj8nWbb<wtmB?qAwGV$GX#YPD^9nV=>uj&4tn?eZ4%CdHc$?SV9EZhS
!E*uuR ZNdj*54Z^Npb@ua!BPMt*G/:EeKH@ZHq+akqimD/S^nuI:^I^iX@hX?d/EkS\/*YlPZCSm*8IT+iMTtI
jXM8=4 Yu%ZS?1=Jtj\1KqGT^^LKm!GNL9N#*QPM!Ymy1=1GQPa@enVYltN^&tj5YHX?j%RE8b#R:WtCFYWcyLK
PVi55/ Z?DNdK*pppPByi=utEP9?jnQPREtiSJ!E:eZC>ua1q^=MV#<b<QH6wqST:66E?hC1n!:#C+tA5adC*tC
NwaBc4 <1Rd=D\?<*LXNumN=i8VGh/W=BAy$MFHyJCPPLhZu^h#5ZmWLPCn:LTd=ecapFGQT=QMi4E4u8j+T=#M
HYKhdL jbJZnCbJ%#npA<HnFk&qD*V#GGl1c#>TN6!a:%tGT<nNDl@SMDyEIJpYqRIW!tN6L9mwuMaZ:B#/RWKV
Lq$=c= FBpy!1jF+I#iNjd4VPD?@S$t^d?F#pVB6^&%=%81yIA8%mqBTqBS\!=lC6twk6N/IFF=?et+Gjcj*K\8
JTa%+9 &X=QwR69&Y/b@H+n=j/XKe>une\lFk<Nm!XEnPNHD4lVa&6<qk5L9eM^J^KFRkGSTASTcn1BR5J@E\qy
PcpW4< yHSTd+:TWHD$pLJtp#j\Xne*FwQa&N8l@J#>jLFPAc4iun/?ZuBQH*<nZ*6Hb\q^AB\NIMjERI^y&Q1Y
jkX/+Y $4KTETaP\hP=<$W=TFL:dNQ##NWShLE+9F&c:?H!WV&5C5KhGwMW8DC1/lck+4qSQA?ZDR1%$Ww66^KH
QI=u5* #YQ%kHAqBTyLt\@!pN<pP&%ee@?p1^hkK&aFF<K:\y:yqM>!@LnX:*:DRFEZ@4Gmi?V%K<5bp&*#j$X>
NZeyhA +F:Hk6<jdy>@<Py=qmaMNqBnRVi9jKh<h+?ITYehFjh!\\PE^:qpK%$96BmGTAD?i6Q$QjjpiD/+\WZ\
X?kn:9 qb?iwLdK!#m<q6^CqBE<\XclBu*Ht&iTc#%qi/n&F<yhd&&9eailTuAwuw&FTR=LLTq9?H/4qH=@4Sqd
G@wVp\ F/E9/t<#6LtyE$Lab6!5Qw=??HNuc/bL$B64ilRky^u=\ILiQm^Aj$<HtcH!1/W1MlQLbT!4Xw@K@I\&
8%+wwB nGmCJKet9wJTb*6?XnVt5LLBWSn$HRSZAHWIGP4^RQ$\Z9TkT%$DP!HYKYmTahch9>wlK/ttekA4BwEn
InQSFP c@$tuSiW1:T6tS&hkIQhB#8Rm\hGlI1Fj1y9%X9W\1%@e1JpJjpd>uc&>Dei=F/uISq&wPHSjKC+^X6R
jdbNqL aN#*Ebpn6A<Qy\QIj!y4IqlLYZZ:VpmW6KEmdKIL6E?ayIi#ZIS4>N9E\&QtA+AWtk6GJw4aH>Ip%!%S
YKJ+kK SpahQF!GM\m9&/+VG+CJ?GRMNAHINB>P?n9@yEyLaVZAm=DnZb<d^=SM6l>1bXSAh<*RAuehekPXE!4K
Xp=1nu RG4ynGP+Q59Db:A8E1:wj&Xl@kV9S!R5#Z+CL:+kZI$k9e6N\:+tuRHDYFVucj/!/MdJPqH^<PtZ9&p>
8XcXJ> Eac!q5%:cy@:/V=@>1&K:&j6n^C\NL6*qGKi&e&T5IGMc+G@:?ntT>%e$mcQ&EJ\K+CGw^jD<y!RCSI+
na$<9$ l/DXLwSN!%juI+a<wiDZi8AnZWRde9aBWX\8@^IV6thYt%b9P:9Ww9DMGE&E:yiln$TP9l4K^Mk8AD%n
%#n&Dd u==F&>8hH>N?4DpcF8=q\HDkl:6hWcDC68bZGBQ<ucVkWWq6Yj/aN%a81kd:9::$lPeTemA>SSNm$A6V
4iG/ID Fa:uaYpCcyG^dKGIS!*<X1MN!>MX:/l$*u9&<PuN?dE?6=5@bK6\YjN<?L@ySNA4F>q9Jm+ji1:j@Q#w
eMY+@u **yPh%6^*+NewY4PI$W&eH@4*pcLpl/*wueGQwyjQh8<5TN:6u@^pYSq=?Dj/1R:<j>CQy%F*c?a?QZ&
$bQ6KW d6*w\/:YmBh?9\#m+cEW@@cc66?XelJF#jL>p5$h\wNCRhEZi>dy\9@iZyhwwq9e!S?8TBHDPqlmwj:?
VBXtX* KmF%kX6D@dCZhFW111*lMtc\&NbI&BDaG**!RD1R<pM=XGSP5D$6HZq=9mIHnTa185Rpb8J#1K*pW>w@
FpX&d5 ZI**ylBRB:yTq@aaQkK4$R:&J>Cwp51LPZSK1/JjkS&q4kmWi=H56A54MGH8X=a95&6EjP&XHGLhIy%&
ppX<V4 4RJ&hb#ny<5daJy%Ed:>!=AqunebeGk&hA>ZCY/6Y:TjqWkAJlEuG@$*@4SLyK\1PXJK#LA9NE+WjZ1b
I>DA!? Y%@p$VDBCJVnueDEAYIBuISt#S8a>M:D\ZF<4^$mCXZC#Fi?6b<!FL@4Ieq9nyK/4m:SmF:=SZ<HJw8Y
<4aKdJ wWRynC/u>NhHBIXR&<w@ueA\*K8R+kZm%cwS$IcSS>/t1qjqqhAwn:4LG%aK/!cTu9eumG8Pme9Ha?1K
9eL?Fm ?#a#cjkSa1X\nN4k\:+YHJpGJYk9hpPwFa%#yLc#MlMMeE@Rc&&#4^mb@F<$QAF!YwW>8HIRyJbtk!S$
k6nZM4 p=5>+KPyE=hWa@ZTnlN*bP#L6DHba8SInkww4VAy\E%$qhIA\iY!9YKBYGl4ln$mD/e<Kpq5u^JbhV=j
D##Ena yEe^JjEALGAqDAmccJPIuwE#L#FTR1NFbR&%lM^*@jtJPZMJFuq5BPK+B%W+4I!cjAQ=%bYl=jp^Nia\
Fw?XaT LH$\!=@HAXaTqYy4\BHHEc%%pNqe8:=E4R5whRG^8dl4k@mTp^MM&H9XSj\PG16!E@W<W!nC4NeY@ETt
5EwMS$ F+K<@i#XhpP=pjDtPwZQ8QbQniu4K<l?9mb\?&nC^aLE!M%nT6u4JMh!jX!HZ>BI!PPSm*&1m9E$N!Rb
A@4$Dw 6e<Y/T#9?*uAtSWp+K<%PyVBQN\SQ/E&%nNj+YLSk/6&<*DItZi^BN^Qpc^^5e6@!abk?5DPD@h&Lm:\
QPVQE+ aM<c**l$NJ=hA8hH8Q<bXw@E=^ltmtGad!MhV%:jXwMZ$A46YlQ5q$qwTEN6!SFK?HYii\&bI4ml#n@P
yT*V#= N@nji*@cHkN9n!5VIKtYNn1pZ@D@LP\n&aPjqJnR%TN@:>IT1$/tl+^^I#@Q>9C4?n?LN8Imm/h6mkd=
^bWB#b M%MIP<bMHCik6$R1jm!MP1$jQ<elmbu/9BiTdX1@bK\&Im8:5CjnKIHWN+YM@PRLJ=N\qYTB9tF8$j+l
&FAbmZ aqk4LH>9ek\YTT8+hpPG:h<nbF8E1HMpM4t&t#F9w!%ilwI=udKMn^jIkhcV/5*4yI\w*RW6aDdRC5S<
Cc?*#y w/cSBX?k#kWuq9@q8ML!4%AZB!elSaJ4nCbqF9E%N\14=5k1eLn@TnGd#%%K@@^!WDw^Xjbi6wHPRKPV
ZW<wp& ueRTHMQqA>kk^=QGeHISh6X?6nCA=HB$jhCaZYNwEdbMZS5WX?ZiiDAPJbD<861\^k/*?F>Yb%9jbhE^
%ReM&W LuTd#@uK^mb?hlIn%+mj\^MVtT=9l/$Y+KuD<D!eHewBud#K@9:A>Z!\LQNdVQj:&kwI4\A59XK:uJy:
$IlM=F 1#X5AMEBLCSee+In#IhdlBB1TH^#iPD*64Rjn@\tk%D=#IutwWP<HqaL!>MAPQL@c6R8SnJdB5P!mT<u
8tn>J^ j6iZt^QbGpm8q\1iL^GZHPFtnYV%JeYum&+TCN>Rp/FWqB=<iC6T<Cqd>M5dI+Pk:^<YNGdnW@L#w#!?
hkGp&n dQMH$<1AF5blScluPdRthd*<NV$Mn!?hm*w:@>uX+4R65jVa6G@t/tu*md$*Bd/IL5uc6AibN\Ep8=&h
GhiubJ MIFQFlCh=p/4VLpYpySAMQV:TN<H64hdIRh1<P@Sen*D&S6AmRBRPJ19>jh4tAEuR8wSSJ:<yC:BkeGM
T\ERBC kmiccXRucCDA6u/h&RidaV:Z@LTLd?4DAYL8B>L%DZ#@jMB4n\8dwtG5$cj*<wQdL!^RYFEJy5Ih+M\S
8tH$Cl q^4ICPEDFeNL>mPuKdF\^N@eG*N5n@IpDB\8w$hmVWnRDi*#Yp+II4cdl9YJd#R@AV5+AVkR$98StH=5
#^+*A1 \jy6HWkJKcI6LValGQ?k+M1=l/yaJ@q+%EIRCWH:dIu#K1mbCE/MB?%mW=:?wHqDwC^B!?ED/%6&Ql8p
HD%Btm eJnEe!lqWWdFAdJwAZVZjlMIqItetSbR&pZW9RKA%:H+R1QlFM@?+Q<Lu8+m==@e6VVjJ$FwSIIBSQ?Y
Nbbp8* ApNbM:A*k^p=Pc4uhXP>m&>dV\jkj:Lb!BL6A?qV?&/d^hVu^\BXTkLACKX>*$!Qy\aY19t/l\EF$JaK
B*NeLb *aRH&&acJ9\K:^lIj?HBRMwE5I?FDdAW\$ia54MW>h:8#FKBBFX$GG&*kem>ijQHq5$uiypGwARypcW9
VQPciG FR#e9IY%KSRC%mt%Vd1Il+pQ$CkI&Y<GM$mnew=h:ahTcj\$jTJDD:LWVFJ@YdqWLIG@L*p8FS8DH%&<
K:D%hd XumHFTiHH!EHFhPJeSL?tA%bV#**uBEVSY!AwDDWa9AI@>=KL&F$n$$Q^6#a?>8^EGiPhi?pM18YH<*j
iHN$Y+ qajGu#X<tXuWD5#8#!$iVh8K^T5X<GG@+6QMbVS<Rh<cH4<JIVLMajD+!nZjJYlLVm=i^VqK!ESVVWin
:mB8$T FI:/JF^<pFAcRBVR#qJK\6>5^NNLVlhR#cTy!$w%Vy*MJCLbTkiN>Y::JLI=J\1nBB4S?AeaHdluXCkq
EJ*C%E FXN\^Wj%ZhVkw/RQLWN:=<iawy>in=CwL6:9m^BL9YRtF*?6Y?\FmSS=IFtt#E>Cc\\$ycD>p6</kcA>
%EJ@n@ =:miwlC$AbbwR&t*LHKtK9&%Zl!X^NaYVYdZ$1d=l&m?pAW\M1ZeLND9VpdXG&KQE8DZn8mFTPZ/jyu!
wemy+% jWD^VApAW$8EAI:uhN:MBA/T*iAnkj=PN46&jMGm4>lZ@9tQjGAQw8:*:PBJ1ECiW!<?A*\R*qaD*db&
B<jQk* Ce8>wn8dTQECKVQ$1a=AB<^Bm:R5KtcZJcT=\Nbp=n!5u&XtQSi<Ha8p4R&SEDM%#plqQykMQnY9Y$qN
>yQ?TI pMAI!FQA\X!BHbHjZ6M1YQMBWG=#:4$\I*6#8+uRDkb5=\J&+EIi<S$+%Gu5ZYCV/dJYw6kMBu\abppL
lnP9<V @!N%E+G<EIEPZbL&@JKTNJS=Fbw^aLC+V=t:LpF:YF/jANNtdjawD6BGRwV&u!hw>&hK?:FH:lk<I/ZS
eaq!Lu &!?me\^ljY?1Q8BkS^1yMql!\Z&ZWZyuF#4MWeI4GYwdRbeG>EXd/h%W6DMiPcd<H<ylQ:kRb^T8+h+N
Yw1&^G b:bF^WI#$$qV@GamtX?^>Vink>ppy4q=Au8jS46N>t#L<9pF?yKmYF\PiwDV=>WBMwcqYEK89tDb4wDE
PBDV^Q jCDWehD/Rm^JVASA:PJAm6a%+Kl>W6nlyMXq/w9lSA>TkI@RuFh@QD%P*C^m:DP\4jG^^/*/IZHL!Qb!
iZ^^tT uXEb^uSlB5IDdY8\VkK<hny9=j9wt<l5&=HA!<!it*LYG$MFj6GC$d8:%XVh+VKGBXTVCh=FaCabLb:w
QFt5=Z <ln$Plt>KX8JCXG86Cdi1dbj8:d@8Dt\BwS>!biKccjDWP6^FGZ#aL5N/6+8Sy\\FZ4WkW/wYBtE4Z&u
@E@Ay$ e4Pe89TtZnNK:jHNp5X>P&kHn5/AGympRwNyq%FbLXV19R4WJLiZHBGEIwk/QI#yBA=jeuFC%8$c?KtF
1#P:WT /T@99HhcPj@d1TH+Pj*Qi<@J%/QWecdY!DYSu^tH*\eY/*!!ALPjZp<E@DQFQM&JQaNCQYR=AtW9B*!m
N\jbH/ N*4>IBT1GqmIu!?1Lq^IK5RAFC^4KCL4L6#Yd@D<iLCbhZCIH<e44iBk:<C9*:p\QQWNVFXCMA<#D\/V
-AHk:q 00029c76cfa001202b4 Page 364 of binaries2.zip
$RB+!% >VX@I:LD$Dyudt\b+HtuFSAY&m1#lWIb9Rp$+HS4^mDlEW^&\ETNeu4lESQ+mWT%IAI5tAhQ@CCiXD!P
qG#EB\ bq\ZPA1=/nAI>YCVb+EiD=HaAmRD@Mj?wQa&VZA^n:#8lV8ew@njVGjBKB<b%nwy\+l6Hwanl#AV!CX!
hV\N66 FlQ$!$E#>j#CpDCHFVXqCMpXR<laPHRAm=X<8%XdhM=HRRk*J*Z@I+lKPF&@GKR:abDFjd@Hy?@&TbDk
c>j&IK eInWS*nuGP>a+KWbTiKq&<AJmbRSkP$*lHT=eS>@C/Cn&B&=leG+aJJ*5X9>yPF:>ZmNAA/cRWSu/LaD
bF+u*Z MV^9ljK?wl?QVMbHElF?BZB6J<:^CQIi@ZY8c6<T+S+l6H?8&N\8cje!LeXA\T4EE%@>KL$WPKw^1wlJ
d9Yju! #RPk4#=ItA4B=qaMb^<:Yki6cLYpaH@wj4ZT\L>VNVkADwEJT&DleyRMY9lhSwyT?IaiV+G!eTBVZ>W^
Jbm%QQ tq+//@l:\Gc6GjBV<&k?ul*FD1!MnakpLRaj^&jZlGIaWV@PD?HMSMt%WCGa^j=i!pqL^:Cqy+iZW$wA
ty#a#a $6d<!HnteYZ45*:MnM:C%L*8%AZuHJ8<kKjtml84DQR:cb8/#It#AHk?%QTXMjQmNI5^?n:>jW$M#a8T
D\V<k> j:XJ*8hc&w8XS4iQ=4*YcdSP4D^KhA>l/?n/hy?cwNN&?hZLhE>L1Apbi%>b>YYRA1\4H6^BN<NkHE6G
iYFcln JVJ%Q!%KX&$1Mp!AkN<=/pNR>wh!bkC+*YYPG:n^P1#EMndC*=LPE%$cnRnLjb@NhJXkRPeW:CPML99#
C<>K&N BFb*^nJ<V9IB^^F\lG1al6L9\/\nTWu1Kb4A6XXky8Lw5h?Ly?ctntJ$F+lLPQpiBDc8W!IZ>L+k<Wd:
yHJTEF y1&/F$YyApJQ+\WnFSW4@5<y1!*wGHw9mY1@/<p*p=?&=BZLADnc/R4u4j6Y1V@IXk@V+!ndjk%u4m\X
NhX1T^ #lL#wCLI/p1\ymnc4!FkcNH\wtawhe*LwC^V4>PIwpYHHQDY++Z9*u5D4*:n%^nNPCpPy%:tVjXubWC9
wLkbuj $LG<8pYNn&QAE*<8PwW?9mt5F%yVmDk>+y*b&hGebyY%BLqaaFh9SeIBtSAJ+YC:HZ%kML&ApEcM*KPL
jm4cGL KG=QqaihJLQ$wSi4$#N!GKHJ!/tHd:wb?1F@*iNBumlBlGA9XEhL&Nc9&RJq\@IBK9#IPPGB=1Xbl:XN
JkkaMC 1<ntD8/%by8KJaKVEli=ZVHR>u8HA9yCkH%XLL?/QDbW:8FeI&pZd>CWbGwAX8lKZ%IaDJ:%qy/uppPF
MipA$e M>=6#WdeqAujW9*AEH&t<LYw<8&cVLlP*wlh/eD8ZSwA#=iQQ?pYN#>6^&R5i\C5c#eE1FBlq/paY&?W
8R#6bj TaH+NQKI<@PA@QVth>^LYiiQ=/>VLpFGlh:w&utWA5wRhAy?>FqDeaj^4WnJGTbqS$/?AQMbVqk^i6T#
MSK*V# &4d4/=8NA!pu<=M>#=VRVm>Da!Nm>yi6&Jcj?anm&api@PQ5l^L&#DL$T&jI4/tGiyCdKiC6\l16&PQL
HbptE# !t%^X@S>+pT6cN/+Cu$hKAAA\=>hVMT#AypGpZd:NQB5<$j#In!c4B@q?mm>CiFc=?/bS*Z?PMnyI?ER
nbm*?w /B=Sq5*lj@wB59SVetJtb>LE>Dmy>Q1^bDpaIBtmu=#GW6RI9w%Zu+5Mh<NdIAb*$*^bI1B>Ynd!#QYK
TM%6BQ #kZ&/9$&99X8%XPc5eL6Yn=6cLAEl14lNNJ!IEu?9j*dMGI+in+WRM^^Z=4#S%hJ+*It#ja$5nPe?pnY
Bpmatj C:?&Xub?Mla>%Dn@%GKJtAd&E$6&CT=hPje^w<+jqIhY@:Iq?t%!yQSDKeQY+Pmd=mJIhMhEVQui#*tD
C\IJ9w iQV^K^Nudj\a\V\mBkC$8pYWdD#6AV>YpbImC\?BqF/TFB8yEESidqwh1FDT&\n>CjnKK6ql>KRA8JVB
dlVl\1 B/t@MBCt>b4V9%dGd/Wu6HGp5kQF:FMp#yA\RD>kQ*^SPi9P9iiFj9clJCi\HhTeK$M?jRlj4<#dICcE
ecp^:: 9##e4Mi^QREAKBu/yA\GRA!pW<**HjZm1<a*Y^=dmXu59AGdy@Y&Ey5By&QpjBbVFEKA$<<>JGZjG?MW
%:j>9k L:uT5&Rk$6=REytntlljT1u</SRE\DQS=HSSRG!ljcyJ>uKu5bcV@Lj6H/duEly**ckYaQta*4<>LTTW
q99<X4 P+KI*$</!+HWGYGpuhdQ&K+W6ApqWTWe=$JE9qGX@D%PVk4apGGG$?CbNRQi5JbI=SAMkJ*E+ht\RmW#
Eb4QiH >Q^6Ja\#SM>C&S+ntVJIK*MJ&4nWj*BR?6kBRebM48dVQMLueS\@iRy>cM>ALBNmE&%icJ>d\F99lmqb
9wZWmV I#CE\CMCm$J<5?n@lae>JtaDbD>!%p:E%CPJe6k&hchqLyMnauXFYanLTb>*EREIM#pc1IlSi@pwaQpS
p6*I^^ GnQk=bcdELh^GwJ:Ah8%%b*NAS&N$N><VB9BWe5wdM4>pNB*y=Ta>AX\!b?Fmd<6Tci\?=MS5T$c&KHR
e=!QeZ LAPC6%q^XP1!QZJ^uKcBEuF&A@St^LRIDZ6pH/4*p*4$9%RuqPLWRRa5<hKRW@*eV\/BS#FcW<iXG&y5
K%/*i: wYdXaaC$<1WX+Hke\$GuFRTAS+CDa4V?N6IRbYaM^IGlhVttWeSQ1ZD44+CVGyGn1YeiS6!:pWCV@!Gc
tl/n*? =GY#4m4cYct%WIEut$1M^4#&=m@aGbTqX8MZdcB?jGH6AJ9Wcp8qLHI%?w%1?PRan//V?:w6PhZR!dj:
5hjJ<4 ?R^>D!pBAqbjDJ+d9ak+jJ!hnCXlY=tWV+d%Z\S<&!y=lK<%^L<lu##!SFSyLL/J\4S4ZBwi@QAH/c1N
kcXK>Q $PcnulJa^pSp9kTEDdI4GCYqp&C#j*@W\BnZKh%N6eFi1MRdBh^Xy&@:$#k9BQCja?cNkqc+WC9b%=R$
ywa#9m Zu:qVD?!!ILVmXYIp$Bw9W/Y$Gap!*QZLYV1:LyHll!6Q5p:*hZh%6!iiaBV<*u/be6qDwh&hj/n$Ib6
ZctC/# %::$jViDV:!P51iYlAE!W8q^t8/CiDQAV8&+y>Mmh+HYXSKdR%C!mQhl>R%mk#y+hkiAptI1A^$9YDy:
He5Pk# cbpPmNdwK!ID!91CBC!<NCHyE8SY@u#8DBW%c66:LJYVuj*kiceW8Y^hJ1Phj$?uJ$hFy^^#Q%\WEWPA
<>Way% Qy>Nbmc/*I&N?1DAmYWl%KmK*it%a+&J=aAm+^l%?d#HyV8^dBudJQS$*bqdHN=\tR&%%q#pB*wtStV9
+TIidy nAw86TEGeW#wMS66KXCD#9YMRlZmAiBce&4>$QhbXwKFM?h#uXH#@Aw!hIk$DV$N!Ae5RtCq1b$d4$^p
Q^&Y>i =^JW^$kVYdFHuYAP/VN%@Ab@E^VGHY4>i6?FGICPwp#IniWi4#FG#=cCE@*TM:YcFXQMn5&:9wKAu\DY
i996Pm \hM*ha!VlJRkck!=ZG6QQ%@byXjQ:p<G#8Vpbd\L&<^:ST1MytSdwTWV>9aZIQ:mSeFu$lS\<yZKjS>@
^6KBV& Ci&XJDmZ^%#Pq!B4S:PQRwYaNIw>$jt1Y><LEQIu6l*5A!\yCI^N56\FiHW@>uIHiC^/^ECFE!KGum^>
:nCA$t \nQ4#ukJJYHPFjQebA*wBqD!pn\DA\p#qpDXhT\>CNYX16IabGXJh$1&l*Zq:nh^jb584nKAkNDhK\q=
jtEWij \1nca/*ZEA=KN>TAEBB%N!P@PeEDkuIby>h/?bG&68lZpi%j:JZhimpj8NX@CFEZ/V=L&l=FtXp&+AYn
X5%VLd \5Yp5V?DEA^X5D?CSV=t4^pFDICyN9^DHItuKe+?P*&X?=tYKKYNJ/VwB^q+F=t=WWViG\Mp\yhK%b+p
J>iXNl yRa&YkYkHMjKW1>TBh@9ncq/BP4PBmFkj+wBB5uL8I?:nShjbdR6JLCX\w+p4<=PGnpkQEW:TEY^8^CV
u1#c+5 5a%R*CKA/QhNCFWTAj*WuZhp/Stku@mmhP\IGG<Z@VhtBW55YDLL&+L<9dIAAuD\XTy&>14MK%y6lMGJ
cn8KG/ Kq/NGY&*$AD5/t=5AFwkuqNI?6y6JAu\tETJYW$9AI:+uItTj\@+NcZK9E>SXWwwWR5GL$nbW:&=>8MQ
t*@^F8 iEiYT^=QkK<L1NR&cSCtG=<+lHLG>iNwTMhbupNpLD/b:E<IEkR=\Y<bRJSj%yl@KMEa+d45jl^XQB&+
pk$M5+ M%1$pCBtqBQQtb8hAQDaRLubE\hNamlEF:QR$\N!c/WD5EVdltc*$E>DQn!>:<QK+L%:j5JSFL/qA5@N
4#?HQ+ MhW?&J+a4/^B?nVIA^EL4*V*?NW#BdBEdFp4&:6?Pi19\u+nHAN^dbT4&^1ZQhiYVK+ucn>tb!Ql>c$a
:eeyRh qwh:HZ*!9Y*4IcHjEJ9/D8Sy+$IYA:=jk>#PCJMc%A%R%X/8*LtKj9nZe96XA>!+#dFDAGWD5wbVCG#u
@quIq/ eT55>w*SwG6E>9ycaCjdh9QT:Q6yE@!<k!ZT%>DQBLSl@EF:ALjpI+kwPdWJS#8%GjLa!@4tSIy45kk!
iMW=Ln IilMEeWNiNij#9:eKL81N@APclCb4h46E1Ab/#^KS@aE&$FS8aTLTYYj/NXBym9pHk4W4:h#WH?DMdVl
IaWC1Z qH&B#lC^TwHIukQE:FY!/FEEebHTK&!AqGYB+!WXVFT9qm#a^@/6!A^9VeWpi+!M?5VJIud1?qQLABlw
FRH$bl RB\Vi9BBpjM+NRwA9lw\CPVLw:MA<P!DieJjmZbdw<FFwuPCy/>Qlnj:\@c4W?M=kdwEZWVI<T<McY%j
RWG+:i tXqE=#F&$qpyVbuh@iV:*<CmX*CeGnEFaVEn#cZ?5@BhHAC/@$6E$dtaI%Gn*FW%wV&QpZaB=@BX4=Ec
?=pPT^ 1dIL4k9E/%$Niiq<nhe=TRKaK:R$/kR8&h:mbYn&MMchbq5!d?dS5mE?<nJW:tu1b/KjZC$Hi>T*pTMp
TybhRK @ZZVK:$AEHZJ\PVjd<6AyP!Jb&twJ9ZX>>y&?aQ@FD>!ReFjeCn@yu:^9wAL6+Sq#tPI!c@hTyHCG6uw
<im=&p KRw1GTMM6Ad9WVkkWBtZt5XT?ZuRhM!myS6aG$5pNhK%BpkGLpicRSiiqbPR*4L<&1=XL6FA$MpC$d=4
/F6qLm pFAL^Fd@\GhQ#qp&WVhJ=F:y6\<@>:bDl94XBhu^wI6d58\?+yC/h%QEd#+A?aa>5$Zp:&ie^H+<q5uJ
Pl&*R/ W>5wiKIS\d44%+TP6Zq4^/mdG:l4wa?c8B&^^<@TwuZDbn#cb#WXtWT%HKY=d&b6GtEeN8*C?:TLX*h=
/8m5VR &HDH9HIW<bIAL6K>+C>nY+RN@Z4!c+\<+p#^ZYiqL=V?&GdK!FpuMYk$AEX?<><wiLiKlyKnK^>BWumw
Wk#IRX d6Ik9X%+4WKG>QMTkhE^1CZaycRA4DCMyTVJq@BpcuD?9>&@1K+S5FYjYKTPnmmXTS<N$446ZHS@CdQm
1qCwQQ hQNl%1uAQmtS=<Z4nKmC&ZtN1>@#Qb9uqE9:n14*SyWEq>tGPaVha98mG@YmC%&n+nS@W5Qb9NBw9Fmw
pAWB+L =WYXPX9jq9++wXeb\+1/lFL&atMNFlM8w!:AdRCRwu&>qARd\PlN<hlCCTKQbFyj*ckqj8ZN=+4uDku\
>Z^8au ZICF1cC#5+EAdBLeBdy\Su>&TyV\#KmVD9KISP1Baj<%PTD?pjRTqMRWBGA%AuB&4Hkt=^>WbC%*j$*b
Na%Np5 K1kF6Kn1#R1wYu=uP+pKkEwtMQ1lph4^5y+XBP/eB=S^*bh6<FpR*9/I9ZKM$\y+J$dWA$!<4Lat1jX/
@Lp^J: TpdKKP6h#Wt:yTWC$=%AGJ\D8*$AaAJ$:PK1R1KBSIRw!+=N&#lC#WR$bj^SN@&j&<E*%^R+VYEBFbZN
Kea>Gj ABKpHeL1cIpkFR%WqBmeY1FpuIyIC*SFSu$XjRb8bk/qw*=1BM^pSF&/jQ>+auEa=+X5+Yb%Ncq%h?bP
-A$<Bb 00047147cdb001202b4 Page 365 of binaries2.zip
PAkZDu kdqF&&^CE$B<$PpQ9YIR1!WGF8VGkup!!$qqBj=jbw>^PGPmjH9Ey/ZV5j$j6=TEHqPRIppR6#ihQmh@
*9l+dF <yekjt:tS^#EYDFT:BSS&B*M6q^419Iw#^B&QAH@EXC+hJ!EGy^eJA&LM5DDWRte@CQ#KNnqJC^DX\kK
Y:?&&N BR^ES4i4EtE<ARiBn=Z/enJ@?KEw/y$JZ9LaDA<yCn!keF+V#MIISL\A=SXMm8GZeiQ*JZ:<ZC\ti1u=
uSE>*d 9NbG!Y+/aMkP9F:\&FW?F1BK%wdPiM>C\9Hu+G8m45$$#=n^%wVDkXCmy><R6==^1%QSY4h+/Eikmu%1
\SbMd^ JGQS@Fj@Xt%1\!cdq9&\^V#CAJPdE1KYu+B?hH=$V^!c1qL++8V!ZDR=MF=ELbdN/DA&#Et?:Nh\:qDm
$JS/SD /RN/#*516+j*p+Z959h#p1pQ5GQ/laa8a^J*NSyIXEbnjehF:cN@A?PnX/l/TSm4<=mm*iRVupcjTWIk
acWGtq 5hTdqtS8%jH!CnwZ#@HA1kKbq\IaYMd+$aXj^eFi&yB^51Eiybc+*pZ!#=6jY\HecCy\PCtKjelcV*Cy
BiCCdp kpG<jBYXB^+>jMX@e*b%R%h1yAAFHJCeHMt6+q6B=4&!jhlB*%FR?eNY6RdcLIK<8qE\9YL^6qG^#P5+
/jin!9 ^/d8^?Hk<:*kJiW?Hj9ECqJZbpH?QSj!V&9#KXIL?a9#bn4%6IeWE:k85qJ@^/95?<pKG#^XuL:Pm^\I
FcK6Vm MJGuwnQRcpji^qykX$MADJkil/8D+^RCVNEFnSK?<>K&p&B=i5y8kW<+8W@&PCeM!Tip6JeIJTjS5QR>
Vu#AD% 1F>qpkmdK6<$F5Y6^jITAGcGD65XZpek$wT!h:/cGDbL>N6F:KTXp<BwJj<tGn&lAtX\SFwqIIGyHyVb
i1J9mc P/t^lS4b%ucH+KHa+%5LWy:ZED@mtwKPjRGbKmHKqZk=P1jl1@Q9LhGK?XQyBFI=j^nu4ZdnqFV<p>S<
q&A4Pl NYD?161F#CqBVl\XAM&%F/u$nYhBplNeyeX?WVR*!eNc?Vj<+:mZp$nmum$BBkCRk$qa+PwT*h*bW^JJ
m8q8>P NyVbCD>+F?c6p4Y^bLC&TP1GXWaRheW^Z>PdHDSn45QA>m%YNb9i4YhIm&F1Ywb*h^I5kiViMy4:=6Y1
b:BGG= t>mpbQSCaud%+yG/e5/mCMBTnky^mk**?Va+kl>1QeQ6l%HX<1kbAjB>QuM4$I@\qbk$\l45!:HuCb4&
kj9R8Z MVS:\w#QYma8tS5ZZnn>h+@LG<mNa+F@GQCGDc/t?VGBiqF==TINWbq+Q@wD9>hS=ltQlAG\6qmHSZFn
+KLV#G 8<XmL^yl6?GSdamK?kFM?QG=pNZc8/VHBK9pAJDZmdZuI5nTnQdT@Q6aDb%HEiwwEQjKEY/EE!#h+6Td
R:jaI= nA4n1D?q%V6NJj$FG?q/1PA!A/ii5ua^m/TH$Gndw!\5iRD@cd*bLhTt?nVh$X+WE@jJEQiFciIBBJRu
Zj&leY @=9btFh\/QXbKy?+6!tJBZ@DXqIqAhu&jV8DcyWDkuhp:$pI=M?bM/iZp&yH55?uSL4^FZA8P5$>EpCH
#Wnm6! V@%LyP$KmAZG6m^Ah<@e^IEALCGFDMP*9ES<:BP=MWekEZaA18K\pBLdyWTI\@wuJTJi@hQpwbt/htN@
lZ/@IM m@#Tlj1eX4#V?M:B<!W?Ib\wT#G/8RPQTKjqG+hd^B/tFR5^R5TZWl+9@hcaaa:\yI>?$!?AyYwDb4J=
d68/$Z G\ZRIkcluNdVhXuM:5RchPdKGtjjKIqLKYbnu8nH1DXn8@uIEP#bGHJ$@#ym5L?X&niThXcJd/MGV6$G
l%L4:m 8/&Gc4BP\y8/iSF8DCk4G8RaR#+I=l9hPwKMyiQWHHq+uu=!HW@1MPL6elFQ&BltPPPbcuE8kyJ$HSyL
anTVHF YGtpt%h:wPHXYYY:L^P?9&K+J:Al*PV>8lmKNllS!mS$d89wQM\QX?XX>$t/klwYJJqMwpIP:lEjFNJw
5SL\e# XwHp&&6L69jS5E4kB8^:w!Njw6*L989I@eIbwTy5b&$L^hL5P9WG/B$GRS\\ldl@T^Q^bhM?64WPLQ<?
Y9t%+K >P>Mi4B!ZkL8>5X?b:^bp?M1iVpF9!5pWYM+5aAS:1R+m8Y?:?#\QQdkZi=l:V$><IZ>ipM!C$>5X$Y1
tj<XK5 &=4JeyYHcJN:Y5Xl=a8V4S$APSWLjSpbn<m#6QcYnHi:CiYPCi$PF>%PqI$AaH?&:>&^V^%lk\L=8j68
$uAi>u Rq:5E?paqkLQd=Yu9Ve6E&c5pDVlp91J8NwncFJ5kGi4EMWjkNZJ/G9GLYStIQX=/+qKXDF@#njG#n@G
Yk8j/w ijm$P!@?WXbi@4h+E/*XnntC8Qu>5NZn5G$*\c&lcS9AATwcVppG5+k6Me8dC\LR@GFL^Q>l1lmdViC6
uKN@hH QAGaM4:4K^::q<&hV#+8NV6/L>etG!=M+$/KM<qPVG?*D9DXcG8m/5Qu>4j*&ewl:e>VEpIQ&&?8:^d>
EyuT@X kFtj:eu*6^E8iX=?^ih8bul8FGTHtSSi#=F>E!p*V=N:4#15NLmyLPnj/*#Fi*qhmV?/pkY@TwVZ&!@t
tGw88b S@ba4km>@Q4Cn@@Kh@^RbZBZ%hGlQ^Z6JS?uu\@pT5:lySuQ=RG#Z\mZ*$9&m*j$=<ce=:tC=#S5=%P<
uleE$? Qw<E46<nC>BEu$/+P*!m8Han8h=9GFBtCPAS6j>ZTZ<mYZ<S=JY?:QW4%HYC\9X:aj<S^T8D?:=WZH=p
:RSjQh jJep1MB>=T6#qcB:Ene6/yeGGpGTtP51ne6$hZ</8cDy>*FAC!$jb/e\F&ha5J8n5/Gtm4R%R9\WSZMG
QYCn6H Sb*#aJqj>WZ?LTEuWY6B/AVL8qCqcA%h%KE/G!YTWHaWRyFCAM\C:4jWBFaQd/&mTPGHuVDG%LmT/HRD
Q/DpjC GbaW$nABnc/46&5biwQ8Be9dR:Ti/qJ#BVXY#hTHwS6jTk6iL$5e!J#&Zh$^K=wTa#nqVLw4kaQL6=C\
eWk^T% jl=ltN*LckFCT&cP8ynFVtGT4DTtQ4J?TF>#@e<K1LndkBJ4nR+aLTn^ia:C5It8pqc%Fb=T!mmPW9a^
M^Eqe$ kd==56Gm$8=5H6?c^^\%tL=EJah\/TqY*J%&VETyWB#ly4QElHKt@?ta#5pyLEGEp%SmD>**KIBGN#Za
@y*GPd G*cK:+\Jk<R:/uXw/#T6DY5+1Wqb5QPIW*Ky=b&&aFPk?ap5tF^A#PEGPXh=4c:l#T5SSw@XN>9IQep*
jZ?e=h Q8B>MX&9X!:TTTXVd<SpqdmTRe1*C@QR6m\N^<N8hGX/a6Vq4<+KSCqFmJ6+RcA#iViEwqiR&u!<@/Al
#X8Y$$ T:#B6\EPVB4G:R?nHdj>hFGGh9Jktyu6MQdaNjk11WRbQepe$&#BKRapR6Vlu!NVHFl^wQKty/GuuVTM
<5N>R+ Zki#=9TC4c/9tQnF:BPTeTGbt!Vt&GQc6cQ=Yn1D<$GRI!PQ18eKRa:/E<WF*Kben:KPS+Le6KPqBSYH
<aSuV\ +?ip9ZCY>6@dSc!PTtw1=/NGI\nTGh!FXp\cDB$+%JbXtq=tZQYw<hXb==^piB#JnLm%Wi/WN!9Ge=ky
%E/Mu5 =<9JY/8cDY>KK*8in5pW>^Nt%^RIDQ9MLTHVIV@y&+!NpdNiN@@L&+i$>%CbyC5h4<5ZqM<1>R114VwP
w\EECW 6%YD1?@6#Yy%d+\k<NJcKiB?Kd%CC5QYTRqGd!qeSnXFuHh#>JPFG&tV8Ltc?TcG?PAQcwdhylF9EcQ9
R!QX?u ^eqk$4Lj&e5ijRcK*J1kJMP8:YFqH?/mkXR5*BmXL\<5%<6B*kMa$PMaJW%^kPNiYNZ:>M69+iNq@/d$
=Q>CiL *miImFE<hIkH/KwRDeimlW5dARpMJ*yR6C:YLR<?M!tAi:M!ECI9buKZ984Z5Vpn%8a$99EpePDeIPGm
RlHbwi lZp\lhc=1tb9B\E/=Aq&\Xe*9Ym%lWyRPIW!VtGhi6\bq*@Ibwu$1/8i+Cp9Lj@cQ:HTeTqMN6Eh=DQp
jkQ!cR 6SZwwi>y^@L8a6ym9LQLA$YEFa=i@:XYF=^H4d98\kVyM6*/<c@D!S/d&6i@XSXGjwT4:CRt/$akZHSQ
a<Xaye >Mj%#ChnRIw:1=NYunYCVWQq<cGE9i^QdY&>9b1cq+\M>c1PdR<hmbR1<uybq9mD/#kPu+QMp!a&NKTt
9D!VJu $:$KAmN/uTG@mbSbq:jA<N9b<68^>V1C/w<DMyjQL8Z=:%\X8StTI9JKViRnY?9&=$\\&9C^#%I#/:1X
K9@kiw DYGk!!e!MTG6&KXnaeA^=bI5<e6%5a/M1n+A=H&B/j9D@4R9V=L%I%Ri1Ze!a?q&Gt5VD?YeVPPb:R%t
B^Z<Cb bXkGcmJ&Q8\/djyY9tiwk9RIHKqpIY:%\=5W=!>!u%+!N?cp/N^l^=mQWXW+Kh*4j+S%S6HqBd5y<$p!
8??u&5 :HYw\kNJA%+*GQ:TtnMjlQ%:=*\K#/5ZD5XGK/TYHK4R&c9tpJX6nAKtHpPW\DqTbDaaeheY$R9ubaXI
mm*LQ+ K#F=4JnENRk6%H@C1jYq/twG%&#u4wHXV4I#&h*DN1%H1BM*B4QL<i<N:Z15*M@5FM^y>#IW:VM!wV?i
>!!:ZB 4F?>#YH*1wt^6*k4k#k%cjK5lhl?Nm9#Y?W69P1WQPt8!S6w4K#<nTuP+6*9!tJApI%hZSWjNdM@cIWE
8$Swlt WtDN4GWuRyTyMXE=a>\MiclP>EEZ^4\CTSEF/B*RL6u8MZlSeY8CNcNSN&+KqRqL9&SaL#Ku!akbw!b@
?HhtV1 1&cq1YI$Waq@XnlGT?B+\Pq$ud#W\?j<CZ+6ZCEe*8G9GFH64=GuElcp8h:\\eHV9/hTkF<Ve6w^X/&b
E/6qX& S4BdlqNmbaFX*CM$<&<l*aAZqe&mQ/!RKhKYwcw%hhiVEiwaQ%JXY5$/Lu$5XR%Pa5!TSyD!CC4Z8w!j
*1EE9H hV%+m@KI9n$aecy86:mlbd*&L>QK1%&DcLmJ4acAH^CmW84SFJSKtiy/*F5ZMD%Qww!:+%@><XD<%*Hp
Rdlt&d !VY\\yDRwdCPVN^>4bNMQS??GTqZYGi4k/n#cp=RceZ1?+yPhAn<SR#j&$WFZtE8>>*I%@*qSH/G/H/9
bpjY8b TYL+=dZqMt+P1P<>>Tl*6n%BEPt:t4cC!8eTTnjGHB>J9=M@u8KhFtqSp*#qZiRL=A&:4SGPaZmL^AJK
Addap8 ?6C@TI558i:qiy:Gd?IpqY=4jn5n<lp/a<PntujTubX4Qh=/B>MKY\nRJp\4<5E#=F&H<D@>R:Q>Aeut
XMc$Y5 j&jt^Y</1ahnG^qc\VLC^#JZ<<$iRnXFEteM*pdnStJ4HLbXd8WqDYjIq/:Y$nHPFF5WnDjV9%wp1X^K
H8CR9Q Z\4I/a1!jSK@e&Fl4e5l6?^V=atmS4pK&Cc#t/nRi\ByXdwyBkJ>JS>9X:JpMK!6K/I>9H<=X8j&Q1W6
EB:j*k 5<H9mC=Z?*jhN+t>id!?ndl6?^Y&<PV:*<6::E?Nhm=Z\YeBb6I&@P:iyi<dG!GdnPcI!Y5XScCDXTe#
?=qDMQ 69IjVD8iAFnPTm>uDI^>CkmZu54ayuHX4tkS>NIQSF%=i4y+uh\8yMd<aX<5#Nuh8#<nlcSbuy5T#MN=
*aImwK k*D>yX8/\@#N@cEqNnZPK4nlkYJb9B^^ay%?+jm5iHqEcV@M^%XLQ&:CLZYmCpwihK!HKK<5l?Za$km4
Gud$AY =6KX/#>1ccc:T*ht>/+w#He?yY!qM%bXh^Hkp/5q=\9@<lhVlX@9PQ/%FG6>pYyla$%X$@1Kw$Z5/hb%
\<**5$ jk/tLKyeyBpQj&J&Pn8An#\dAeu<Pl1eBL&^^IYJSEmk&Gd=W5T%n+jZ&*\5%DA%@wE?9XI!&qae9I#F
<Y>FVC HbKLJINeu^dK^Fpy>t#YS&G%I<dalZ8H&ytBNZQB94uibt+u%dtj&XMQE<p4RnnTAE45:E8YTc=m^JEb
S^B%I6 /:ba^B:#Q$MjEhbEX&RCltZ^NC#C^<+qLqbwJ/DZJSw#q?TW>:9Fkc6<uT919hl>T%%Z>@b=MC4C4kb\
-AH^I1 0002cd897c0001202b4 Page 366 of binaries2.zip
YuIL:^ tk!M&Ed6!&8?pPk6KE%DI*c!H=BP6GFQYL+eWDLXH$8c4jSWAhSH1<VXkVq>p&Al*ndjuK^yd!!BLE5$
>TjtE# ZFiFu&p&Whb6P&a5jEeHq\/iRDPu9cW*p6Y\H$bd<eY!e#hWcJ^6Lp%GAC64c>K>LMPAt!4^*V1YnD1V
u$tEAQ V1!eQZdychn*MKZlb<FwBqjpQT:iq=4PV!CBnDkaQTtT@p1E*l6WIMZlduW?PFeXjY^mW^MlZew=<aae
XJiCKL :Vb=N\bZtmZZy\>Yb:E:Y%?SF185Tb^Q&LcXj98In<nj>@ub%IwVH?EmE1k5weV?m8em$Y&K+HQ4X4Bc
yMuqF> :ZlubMiuj9dd>+>SmI%/PL1VuFCK#$k^%a5J!%KKHQ9PNj$KWQEMk%jh+!LTN:KFTWMCT6K5%mA5JZL=
GdWkMj YRunnht?B+VHk=+R1**tHK>@^FiFT/&ud8eTp:^AYHuuj!y=$5y8Ql8XFT9C+*8Vu+wauHM$>?%6m%8&
D::cY4 mHX#c%m$^!k?pMmmXM@Tcdku+I:d@pQJXTKR#$e8N:KV$n9IqiRVtZ9?VZ$4dbb\pltl6bJSY+jd1Pm%
pwicbI G?jIm86t*+jVX6Q:#DW#EPe<ZMNmc6RCuw#uT:thZ:HFj9@9bH4:RqT=?wMjLqZ@q1dCI+V1Y%Te\:HX
5?5$X< XkpCX\kth=na?Ll6NkMG6L!#:Z>j+8SG61NF?FD6%Z9#XMyM>hkJ6*Zy5?/dqEyuQ%hNd\F9p1R6nMKe
NFaa8* TVGnkB\:iPReljP+EmyZAI@1nHSujADdaCeZhXDDRApBX45&wE$DLcp$6H%QFY%>44<:l!iNcYlPGli*
\LyG8+ 6ucdYutP%mpPeYwl\y*u5VPH:GAIwdyLi8mj5>lD9Bk4yl:F9YYpwyMHG5AIh?IAXjI@k/H\nB<Mu>5&
q+4Z\R Iq1^EMi*p<ahaHG$X<pbNe6H8M^G8Eck+wYi>yealm5udPatnl>5NXBKyBweI1D!YDYCGqZ1yW+AF%SL
$^<aZG =XH91VD?T#uCTHSnq1h$WL*RFkGEk@HdMEtm&d<t=qX\<h%la5JIct6bbCJ*MeTiI^/<&lyCCK1DHF4t
%Gc=QM ITuQ5T^Y8ZBCGiw^Ia%lc^b8T#tieejI!ikRicd9*<JtdcP&6&j%we9G>F/C$Jp5%1C%Bdh66!1\<5@5
<e$6uQ JtmkBKG^J1+wE=VeTAble^S?uIR4ANchXRK5E?JKW%mlie9ES:K*#6@V^Y=<M<WFwP4q\FY9qme1!1M1
J9m9NJ wVCk1lJT%XlCYX>ST\$8mR^Atk$DB\TI*4?j>y?5@/V>\Vt@eYDh+EW6iMGE@Gn=tit@WjZIGbH>qu/K
6j**hd YALC9w5l$cd?:#A9NVyuVSG5PIeSBeVQZMBNA8Fkb!GkbYFyG/D61<Jydi6<u%9Pke@N*5FBZ>Al<LaZ
8y9q@: l#dTt>ZCR9uZHXE:DRNNyK//qTijwp8Atc&ZAkZEW=jZ&l+nKBFwJaa#*J49tpqL/9A**8u6YS=d@%=M
T@q:nJ BCC+mjZ\MVA\bLn\SB<9VWRSEBNbeY+6cX6*E!$lIRwIq$TR81YID=eGkpjWN6DCT<jK\pjTXq9I$%NW
w:MI%j NaBQWyWNI<F9J!*uK&WbbCKtk9B+??=djSw>/inIit=%*!aT?8kjSqNiTZ6SKY>4jk<SF\6nJX>BERaL
iM\*8W M/m4uwY#9KR=\5:c\!^R&6tT*XXI&>nQSEyZ&X%A\66STS@y!!N9!WEBiYTC=69a*Z&cVYuT@GNTAC6d
?EiNFK W:HC8AH\$u/S5VAL1QC#<!!DHnPC<&\NeD!M99w$5k/Bup\K%p+tV5ywYXGIJWyZX6$HJ@JR\eIk\NJP
RyuBuq q5$j/<@JH?Tn1+!&YuLpwGCkISDA/!:B4iZtaKDm=jyImAQFa?j<!FXi&bLV#$PRDPJtlNP/8\FGB+p:
4@=m6j $/?@t9RM/w+GF6VCjpAVQX=Q4Kt5H+icJI?P6^!Qna/hQL?lGyiQ1=8*maP*kAE@q:mMP^?KA1Ik!MHD
??8mtV JS%k/cJ81Twww@4IVNVMn5@SX%QRZp9XX=Qj!+VLZ%ZR!ktl/5dJIc!t#GHkc/H8/tSkc&S81PIwKKSw
YDqcR1 SAF^A:K=:P%jHn#?*Zjp+^HkLt$6ym?tK!unniF?A^Te?b:89X?bGP61Q?n>:luJQAd$AyJeu9<aP#u1
@lc9S1 GN6LQM4cC=FQnIMW!jWWJc$qnE#<leW+Cdp^CZk$JARW5KZSIn!PYwJIL\%dQSh&955e19b$QKwGGu^A
IXae\i E^NYD*FqSTp>F\YE8!+F^FuXS>dJYB+6+Cd+WNZh&RZyy&JtI?iu?FBZ^BRnKteW!PuEJ!#A\!>p:+bT
b9&8WV *uujt6$dZb<hue4y<c?tRVXuS?ink?dA&8B4G#pym*yTB4uTM\9#!a9kXAT6%NZquD$lTpECGA6%QY96
Ik^q@! u^JPkn!tl4bIIR<ieTq6Mc!/1STTAtIJ1Qlw59%1<jN\aZu4KtH=S:uTp:KVWVE\eFJW^lH%WbeM%BG%
&mV%b? %5Jm%8GW5FKTpyS$aqQDy8eTq#S<kw!SWtilk+DaMEtL/VEFckP+bLXe?i$F6FY%Ja!5VA\N8L#6dC=#
%EHt>D &ku^euq+iHkJ!aBReCRTJa&WqEIAJKXlpml^eXGplLR+Tn\qkbJAeIGpBXAILJI4TuB\IA*AR@qymd=^
K*%DAi T4cG!HIVEaa$DTi5PEakSnmMBTnhMpNVpiSJt^m>XidFlkYMB!#D@w*=1Tl$:LV9#t*!pFIGqk6jQ8Lp
&aJVcY JT8N*DZFWYB%KA&y&qJQyVGAN\bSb$u=qq1SEJQ=#:^L8$&5K!#h4DmK=l*I9yHhpR=>GD>m=1FEFD1@
<u>bD: *w<kGiXw#Cw<K@IS*Pc^tJwj/1ca@e:1pJ!^=mGWNl5#EDdA1uZ@JW&!W5RY!iQBbc5wd+8$J>h*ldGN
@Gatn8 9E+I>Idt6+aa%6B@LVNYGZb@I>@MCbM?6KbX/\%Fiwbm!kw^9dcE6GM*Jh6apH%!ac1j:<i5a$41dF^5
YIt6ce 8%nA/&CCIX$kdwB+\S!tKK^5Re^6N\$Fq?HQ^PRBT*Eymk1@hTqKk1RhFD/&hNbj?aE\MEF/W\6!tRLi
jTuhqq a@Q<99+C=dGVKndICLjky&@#MZ1PW\5e<bi*1J#&%El?PBk\ZayuN+A15?LTd!Xb/SGAN<w%jj9mpqM$
lMCQ#5 inPNI!AZmqjw6TyJ^nKujI5G=+DtyXVn9PFnG#5\c!KjcB$TuY4Q!+@MAi^:R<yD/lt%>JJ^&WVLGPQk
pl<XjR 8DS^%j\cNN9#wwtE@X+K5FSiZl/FM6&W&/LM4GP1FKy6h8k@#w1^W$w%:tZtKKKLPLmi\46STwdCR\BC
q%4!D@ Ty5G18AM!CWjT&LA=VeGwN*%@mFNBddYbZKM6c^Ml6p#PGpwVe<l&HGuF<Y<K\L9/ZWyP8#ynJQFdDTT
\ZLKy= 5uKCFP/#&4&%ZG4WbmmNJ&KiIMMVR5/YDM1lPwP^BFYGPt=pDCwYywpPHcyTyJj$=9y/HA>WpyIpP&H*
CYF$Yq 1ZL<#d/nMdJ:K?XQB\Pw<F9Gl<W*eAp5mhc:Rj!=ND^RadQhLFL?^L>#N6Re>dN\?:R%:>mGk8Yp1VHJ
^eNQ/c 4p?ihFc:^C@\qH#wj$dSA1!kl&tQT\&ayVIJ<HHhBC/:eRNnTYb%lkS/VcpFZCW>wl9tjtyS>JZLBY*/
mVp#GP uBAEJwATE/laRSE$DICkaXEXC/!=l+pQ8*ZmQMV=$L5Fnp@9MZB8jtRFWeV95N4ma&:?4GiHiC/SHa1&
\8kY#N wS1\QTBh^J9kPw#Pk$kFX@aR9@hA=$a=ZNnna\?n=?K^mjbLc5KG*GTk&+$:mS%1/wRWPnTH@%$IkIVX
Y!=lPM W@*Mkbu$ARlI8/RyRaMe!q^I$^Smalp?j@%&KZQ?%4:YhMS$buG6d?Spq%WYAQFcldX!6jaB+C1I?$%R
ma*B#F XK1I^6XMTwA#k*%>upEp=?Ra\EuVj=%J=wQ%dl@b4IPbF@HnR@LHI?P%N5a:?Rqb*DSS9=FE@LiZYNZC
pR4N<d GtP/H6Pw46RcnTbMYLqCEVwiB1%ul=P\*M+A5SIi=cLA#iJ!?NC*SV=t&PDea:>n=SR@ESkS4y1akMpN
h&S6wG JVajwCH&AbXBE/Pe@?&A58pL6$RG*SF8$WIG5tmR:^5@T&YWYy:tR!FL\/XTSw:uid?B&1&X9=e$JaBK
Q#PbbE m!hb9yP*R*!GRYlDM+5nwZEpXwRSa4yF+wkk^%?>SlLASh\/CD^ICI6!KTQanG?YIi$nBHIC6K\LDA?1
8Q>bbp b6k\PA6N&aJ?dWiLcn>cP1E>F^@aQa%%4*un$baAw=?11YjG6qyLBSQkBtL*Q#wPel5y&YtqK>S=HEda
j=&ZTE W!@tlEPQy?nhTWHhKa8HQYbu:&5H\*6cX+qk^X>dSHcHenK<Bl58y4=QkE#dC$D<h$MbIantnTajwtni
1=PXI> DZ6mS++uD?W9JYd/Y5CVj<pJ/aMuE8D@E1V@Rn^$I+YTq+qE\P+dpFW@a&W%ewFRppd4LB5i\JSCjdX?
QSLmL4 Tyiw^$6VQGGCMSB\D%D@qhR^nmbJZ+a!QK/dGI>hu5DiBc1Y/?iFlmwFAM+X\Nd/$H^khFn+QF=u/Z$$
M=P8R% R/k:E!GaG^eFJc8NTCLBN\YIkLlP9X^qCF#XwIC\<m<YYmqNtJXFp+te995t9YWkBeZw5>acA/PK?utm
ybi@au 4Fk\\etSu$%b4E9b^:@uMDp<qa%Dm&cTBQ!D9aD^Pb$bAeAt#tq>^&^5F%a6KKd6M8aH1*SGBtIBckVq
^WFF6? @unB4ta=XkpC/u@%VhmuqMR4umh$LD:5LRtuDJ^D>$h\YJ>X89b/qG/XE&<tAmtDmF?ND$RdqBl\kbdX
KlBPH/ B4cK=lZ%PD:lCk&/c&:QA@A&6tpt&nbDw6c1!ah5+RmpJQ+KBPhcbLTwjCkm1+&YGCJ4Na?Sb+CGD%bX
TBM4@# mWdSKmNJu\b4bVH51AjSydF@WKleeZdq4tK1+#!Sbi!jCLCcyK*8Np%hbe+MMiknA#Mmk&u1>aJNJeeD
?VtmVL BIApGyuYqChB&u\n:/<c4!GSPGmp>:M199@Z=EBTE\IJ:hFIGPQXjL!KY=IeyE**J/MliDSk#JVSkCpX
8Va=Zd CeZe%jwNbEH*ap%FS?Ckh6c4D$CjbB1WZDwS*jGTBPt@H%FG\#NZ&4j4TV#Je!+X&IYp&Y/EJp&N$EA5
EcCE9i p%9V1+/T!pBbRb^?LwMJqultL*WcnDpJ$8W%BbX+mAh?ntb*^I<*<yET/%w*8n8T^N>Q<KN&BV+y8lJ+
DY$9wh DGwIVuL=db1t8Sqtq:?@tPXJAJXHlFV!dhBbFk^IY=XBw4N+npT%S/tW9ePVe5%AnkywRuHlW6<PPSyM
LVV^?W KdNDtk\$Ewt!u1X%L#y^#<kDI^YTuGlS+?H5HFy6ZIQq>\IVF<^5RDWDMM<?PuGmb5VG6*BpSTheSi=e
Vn<5GQ Z=4Q>PGViadGYI/Eqqh8@5#<P:TwRu/KDBMapPHG+dlWVbdc!tGD$V/QG/%=^VK=VP4lFPblEK#ywiQ!
>nT+WX m=N^!#?uQ@6Y^JZVZj<KXTYc*B^86N++4/S!N%wt\/u<tpt<^RI:yqqcmMY9De^1?cnq4jpd@:pFtNZA
LcR+*i /In99mqMqhP^j8<K1LAa+ZS&ZKX<EXGlET?F!W$w64PG>qTtJwc46^u+4aq<RIKGm+VGeHIW?$+>aAL?
@b?KY8 86*P+*b?MFNiB5lHS^n/Wuy#%P%nbY>bMtGyepR\&S$ut6MZ4Y9h6/mBCFQ&8!&*:Y6u1NKJR&Rqla1Y
dE^4N: NB&E*4%:bZq9/p9cVXJ&*GCw#jC&9y@%T!RKyLqP!8wmN/\jit/R==JX\JYhy8F>=a9y!Spc9CmHcHYC
!\EDZV uGXN=pi=daWH%BFVCPlHYe*bCR\5Z!dp^P+iN/qVqS!k*ti=Z>\AG=nLT*B*HIP95JAeWD9abYt<<>SF
LNTti6 <%/4c%maj96+TdKuK#h8SHj8k#&cV5!kYLFqulG+E!W6>@cwj%X\d^b1i@LmD@P>LLb\4@W+JXQ&%GNd
-Adyhe 000fe194fe2001202b4 Page 367 of binaries2.zip
$::XC& DQ>JcHY=:&\6$HBcwql\5<6w4R6L:!MFYbSJWPB@ab@Qw6!<Mq>C8+uZJ?6ja!Y9S8nT+qckt1w@?9X&
QB$#HJ ihut<C655::FMG!j:?%ZeWq%9mjyH>yhtqn?9ChS9kTL<a^+#VF8d6iSc^Pndq&!ab^/^/MS8%Z@9GYy
jp4WTq TM^Ikk&X@W@LSIdIEY@t!BlGS*cdWpMNmq/tLSSnyEb^lNn4IwpDn>@DS=GGp!=#LjqQCa1P5+:=c5MA
q1&4l= !&mykhW#KyB5l^Slw%cYm$K6ImlP$8iwAeK/emZ#*/>^tRl9DB6qiQa:^?WRJBCYCGG=qWE6nHl:P#&l
Q$#w/I e@Sl/%1:I@5wdVmjXH#c<YDbdYY8I!6=K&y=>FZnCt@1j8M#\?#E5m!aY6jY+YbM>tmAdhE?\eTKald6
?cSKya +6b<BHVp!dNWAZMWD*m^b9*j<*8+cdEE<?Tm44>LeQF:J6c<p@BFp/1LIXY9//>:\Tjq<^FkI%nH<!D?
R@M$#G VqZ/&Le$=nd&9GI<QAXhX!=Gq=pmQFi8Xe+?:!*JyZIGPP>yM9?MJX=j6WeP8y+ZY^V*mbeWI:KIGLSm
l%*@hp 5k>wJyhLC94Z<<k6uZ1/6@&@<bim+>G!RyPyV:YmZ1S$NEk4XleVVk9i4&aW<ThZ#6!pFL@u1W!+TA/m
/S^$!p Pc4KDpj^@PBL:cl&^^^uV&$9cYAa/MP^5nM$d$YRJkH\ti+\?dV&A+e<=4RwXB*T:@i#ayFFdkVW1q<G
uk<9!H y<YJ<49imB656VS++lH\FIyiG<d^&b1>PZ#yBL?tA>:$*Ia%NbQTLT=yIN<Ttwa?qZ>q/aMjt?hWHlNp
QjB<5y 1iWZkj/j6<dBQk:C4Wu>pi%A#Q%!IE/JyR6K+8=Tjl^=T!kYlW$%YlRJ1+VR4Ci$Tq1&G!iCy:Yi$wB!
N\Ac*6 1m:#B*n8+il8yekI/HD!CDPeH5j@1I6mMl^\Ml=l/tqWl#MVtGbhy6R>BCj9?8h@iGJXPPPF1Q/p#q#4
d+Cd=V SqCpuXDCKhkSm*behu?GG/#bHWi#/?tYZqVKTVQmud+?j&#ypCe+&qlklheqt\W&An1Q?Xw@jDcn6FaW
^lLK#H pR^=1iV=abhpI1@\8BZFG:JSXP4W+njWQ4q?6eJC8M:=^ZkY$Z1y4DcA/9ZEcPY+6ehlXVuc<$!Me/nX
mJVFJ* +SNPRMKiwaI**6c/kb:\XtkpWPKIkl8NIG*F$ttGubBPlh5jm*lupb%V/N4:d<>K%5QTIuPKQ<!bqAb>
jKIlb* A/k:D#A\ycp^1W<&EC!?#eF5&aKE#Dc\yCAV9NQ1\=8hBudpVN$Y8Y8i9Lii%qa$hlAJj181^!5@t@G@
EmAj%L i$i&CJCkc@H=qK^C5:yhtujyYP*cL\#kEwEbq^C6#5+@SImiCQPD5kTdS/+/?L!Cy!RKSB:lmG*yJ%tt
IQl+RR q@@p9Y$lbjb>qq&:kcuXbh&#c?uKmL&VaLJX&qZEGI$$btq/cJ+==!F+w^yIH?>V@Tc>L4H#:w>=abTb
SS\:6Q #\S95#Dp1dPiZu4uI4VXNM6SM8k>WFm#>P\AX\T$@6lnHPZ/Y<c?L1ii&<QSBl%6ukt>JQ>!NTq/Zd5F
aX@PW1 GlCD*ZQMM!F%w%q!!iVQXMaV@RT^E*bLCE?9Y!Gb9XlWI^F%Y=<W#&YNl@M:S5>6Bb>K<V&4ip+b?&lm
VJN%M? hl=bmR%k=9D?%XZiN9:L>bVD+b<n>R:iP^%hkeYP!<bRJe54?u5RQWC/kE%!h^$F?IH<mTeZ\!+Lm1yS
=iACm\ ^ek\WW+X<t%t4%#yeqRYQ46GB^tqKN9/VYqqHjW=8PNA\#1tl5yXL:k4C%9:SAeiB:/tCtQwau=:mcja
pYtc8m il6%$c6Q*LncnY9kM?Y=@*8Ki\lT\JQRH5e+JpeYcdt:VB6cSR4k*X=yVkmLFDc:Xy+1*H&iJBqFtD<K
a4bH>p T:d+hJ+m19?h?81k@QE4Y<8FCMb:Qdy4C^P&5%DKHWn=*hm+P/#<Rb<T/E5W*p&yLWKB**YEeHmt#65$
=6X:#n id9W/XL@IW/L%8h=<mc16c>%@RA?6iw%:yh8w@D<uYqKl9@5VcSaHl!TwS!tK4pTwk:<b?84>>MZA\j@
htZF#T *N>R$Wm$EEW#>XjiP*Jm@&i!?H9\\eCldci/ZjM>>iE5*ZhD&k8yPQMShiVW%8JS#j^HA^lA*Y!!EVNb
?d&=ZD b+Xw+dPG8RPi?eJy!qK1Ldh!Jj?q:B8Zm:Vbi%Qmnt8Kddin!ZnktE$I%!u6R%Q#Xc&IhNNBqB^A/J95
^N#Z:M jE#G:LW4^CXunESh:nqaGl/wjY!B>>:FP?mb#j>b!*qYtw9/!TF11uZ1MEAQmjMGu+$QaIQpNpqdTm>A
WyEq<p SnZ>H1&d41TLRh9>YYm9k+DKCenIG=^^/QnYHJEchePE:t6H//jEH=1H>FiiXq>aAaDV@yi>yLp=&4a:
8kIHhn <5me@?>\5RKiJ^q!q#+FH:?$qXPLd>6+++L:pVj*S:dWm8m<4Z++=eX&>*CyL\Sn8ZDZG48SlHP/LMyp
<^kult ItTN8MP\/jB<$Y&iH^1G!kW<Gt$pI%yP!#:Yen#nTcYA^91hM=Wph8YN%d55kqS/G5^@jHH8t&*!@Ee1
&D^GA* B6P5?%?=tqm&F$AS1*1PMwqHJ=aTqZX@eV<9J4dM=&AjbT4:KbbEDuaXJ^4:V\\HNPR<mNc=Kbb/15T1
>?I:nQ BuaKtGI6bc<@FEFaL?B+i5yLVRkJnV/=amb+uakQDNWyp!b::T%Lb6*nVCISnTWc/mp&lNwu/mpyak/@
WH=^+t R?&t$^LRuk*5l8Pu^h%:*$Y&#nIXNIpiImNLIl8<t$^BbjhwAqSqTp9B\JejEyP$?!9=$%l/^R\/9+j^
NDEuCy ThC!iF\t^SjnMBwcjBGYR<MM$*PMhQn4iuDMNkND1tZiKjZDK5=9KPwcyu*Y<G&b4<auIcndH@BH<BkK
4T!ne+ <^qCJMYb&jGCmDH*yPXNwSGYh$Q$tyi5Pdt/aRyRbI#:aHTubHT=BN^/@Lhd9C6JNBlXj88KWjY<$c5e
i?I*tq SFe5ZBmVIR#@6SM^aapT<Y?yTVtDTY$V+TiKuPQQ?<unHLPpMiWEl*tnq:^5ht?IP6dZ$k?Zm66A9!@F
cJPnd5 $RlyccT#q=PTuK1tHML>yZ%6jY>!c!?q/wMB:T@pR69+=Yu\b4VuEEm#@Vq6AC9=/Q\wK!nJKTC9lPBW
Mb5q!Q =TRYS5q^k6p>4XT=9aWCnE\$>aX5VMS6lA$WLdtheMI?c8acuCkuFV$dP#%WkJ\LZ!BcNGhJ^*k?<hFV
PEAF/@ IqZWbiZ>G9FKA\M+%d^l1tKGHl+8Lk4&lwyPjFIPRS=1/m=wBYhXQ%W+D$J?h?>95Vhu6pVwA4t5BXBe
qVVB&M btk?ZV=6a!<iTR=Nk\AZa^NycR5y6L?uDWJ56LN>/Pq?+*9>b9N9<16>jm$lnybdLPlC!\GuaAmliV/S
aq!cVj weM*e5R!NLXRyCNDKIp/894aW5CauM%NDAXX6j\eDQp=9FSqhi$5@I\l/1yaXVNQC=!J1+1p9QA@Cj?H
t81BGw dFcKQBRRQ*YbIAENhVW#Z&>:k$Bjd86@QH!GcLH6FaAA+cP%=b9By+&%nAkHNk814Jnn!pCQ=5Z+?DG+
MjaSWB mPWj&a:aT+RC\59118LB\K5Pe?V&byP*h?Bul1BEZKX5nCSe#LA&$n1/dlL<j4I8d4dikq\?AZciP8c!
cS^i4: >4wa?a?4$jG:^hEKmIRVqDYE<!<Ptlau&+:cY<BJXymH\F>h%<mRn$6MYq/JtR/V&>BPV^6V>\6$FhCW
Gi5KL< eZiVWWP^imH6MT+WEQPi8b\QkwDnny=hTXlXdRuq>1YChLRXe>I^F#VqX*ZpNPXtb#Bt=L*5c<:CB*J^
uJkqT& RupI&9P=T5wE/u6RRJ\\>6cGAmy<$6^<jEny&bPn>YMAyi@XuN<@N6MPX>y%Camkt4kPmBpN!$:wMRW8
>lL\$+ FR5hBa\DBSR9P#eE?WSLYEqYDy6HBK*1cAHVXEDjhpH=eCk/t9n4YTI^d14YNu!c84JCjwHm44KPDlLC
SJAL9N e1bTGM8Nwa$KmNj*H\$CQ>%CTMKB$wbQTETDDphSpaidAHEEI&Mq^8qpcTm4#!&nwwSlSpy\cS4=<ayb
aM<C^? \TWCBXWF4VX66W\pk9VJIA/&@#!<>CSE4hRj<n8cCb1:ePF$ZG#S=uhbZ#a!Dtk4Pqy1RY%GQCn@qRkm
n:GH:: kklJZRX<CImbFS8R%$=eF1W1yTTpdPB$Y$JXRpyMnW>VXe^dR%VeZMBh&>/T*<kY1Y#ymqKV>HQtN^c&
6n*i18 euA*5nDAK884Y@ya1qy4cCJSCBRAJTcGRMqITTNRpnIItShIEwtTpyKTpbYRRpqJwTRup6IIcipZXATC
%Q*QnX pIQJyGFecbG/$\AaeK+\c8?u=u$>9NCb@C#wmYIVI\=Etywj>k:m@&YbI@$+5BFGFJ+%\B?nQNaCd&yy
u6CFk8 NYD5uA<bp?:w$<WnINB=epybq/K!EHuJclCNV>5HKK8%ZBZ#<4^HLw4XyGRRJQd\ApwN1NaWhA=tD1DI
L*L?y@ HhQGnSVNcWjG$YGRhNn1*l4BQ?t%*5SGC#WS/k<^*PIXPlEIytqnQTne+cAqqqYmhAppCDVaW>Sl>GAC
1kTI8m \m+85\l>MP^6J9=%KcdyAc1N9T=HmG6$8KhcMLcWtT+@:F!u@#1W$5%&&BnTq@ynbiA#*5a<tTya@M*%
>MdTGW LwL1Hc9^y4=W^B!C%K%AuS>Bu8^Wk5bFtXn18PLh!nD%\9*%pKhmX+5k+kEJpINiP=FM?cwtD<a?4hyy
6bu@K! 8dtT&WbqChMuLY/k%dPMZWHPbSA*9*a>FW>F6X8YVnntP$h1SZXE!1?dI>d19ZS<e*F/p*#\i@mj=C1i
yBJHV8 P86&5bY%P#q<!H?e8&RV&/w@jLw=yt?b&:p5CS*4pw$M!ye!Fcjy<H$qlHF/*SweQd:=VELnm!D!jGpy
65:?$P V/SAd=V!He6h<KSS/HXaNCX4A:tj:lBhYhWbV/cP:mM4CbwK=L=bN@\?<TK*y*ql!H9p>HtY\Z5nG$?8
cTwuXC !6CCn&<SCMXF1BMW5q*hhC!QZkwZQQl@Djq&qVLq5LhmuY55aueV8#D*:QX?Ly:muhJC=>+^V#X*BTw8
k1*55E <&eK4%\j^Mw4:aP1=8lZARYZZjdTJia>&B:Y%Q9IJyl>$tW6jS$i*@V>ahXN^/dEu8IW$D6N#%EeN5*&
MmJZ+N jDiYj<i**tHG%Z?dF1&+&e&LI*S*YRy5*na+Z^<WDB&<Zie?N\>!kQN:pFi?i^%>lthLYmPdiC?L6>?S
@q^@pk /NcMB9\ReN5WG:TYph$GhJ=/IlF:^dlS!l@dQVG1<1tHkHLc\w\hP$!1i>lp%n+Hu!PLYRDV:mi99mRX
#!a&PI T:#TlPFNu#p<>D#48?P/:n@qtGkIIZpYFaPhwCeunRetF/=%t@Yh\!%uRl:/QCQwDHXtStS$ZmP/Ld#q
mkTNFn GpdiuQ*AiX6bXPQQ%mhhSNDjaRY5=y*#B!Ap\@6P:1I6VSq8T:*ww!STaNl8<4%JhpDZR#9@<&hj\X<4
pE!S<< :hM/Vc>WN=%!S^BbiFkQl:wRkhbA!5RXT1YjmmHdS+wZ*IkanSMjuB&5AlI$?S!TkZeiMDCnch#R%FNH
^6bRAa Q1WpY>NNpplleZ%QPiZ\QwmM?y=a>*!A#hG!yKn!NeERB$wTJ&NRG<bpZ\Tpkd<Eqh@etjH/RG=:>@^*
k+=cHb ccNA6/=n\Yl!NCtFiBR>B:LedQ?DqMVT@km&t:uGRKe8uV!!W/?mJNLXpVV$>NKN:b$jmCtjIT!:RW+@
aHL86\ YumT^%Fcbm:H@j/m>Va%=dM9jF:i8H%qQ?6^e/&EPH%=Z/XB/XkdS15b%/6c@M\5n%qua@Tpm@iNTV1>
@4pV$4 GNjw1cDMp<p&QW6b6?Itd?K%?e%Qp+eSVFj4!wX?/KQDHJI8mkK9D+GY!nEy*1H@qPq9GYdXaCZbGHZ:
@ld*D# VAPeMhPbT%HcId5YEFy41!cL=F$+c+b6u/4iXka<jXBdM:KY4yK#4/ThqQSQi?%9=@T\IN%CP@V5!1>=
-AWb:H 000b3ff2d75001202b4 Page 368 of binaries2.zip
uatwSC :#//yCKbLAW%NYd:u#*?t=$DS8!6@D9:P/t>k&&D+t^*ZAu>m%+M8c6kwDwNK8%k6A*BMBl\$%^LYyyi
$#JP<E &?BVm$8hK^=k&6KIYdAJMD6c#%!aQVwna/Z1$$JGY++wabL:&qT6hcT/n=9&/DN$8/&tL!uQqIlG=6hk
QHjtLP b1<HH+?cCj+FZNhYDX!y!BKPd*Qp*4QKVVNSX?>u^Rj?I!4yIa&X6<u&*#=NcXDuZ<Ymn?HaI5l!:WMP
cWXDh8 jiQ#VnJ<w4y4d?5LLKle$5icWat@/i^D:+yBNNpT@mA5hHLNSPj=^yDP<+k=TpNESZVRNtSbbDJND+9%
Rjd*Q> X<CC*lWZQuZ5B^>4Z*t@cwI+mH6MXGncJ9R:hyW^@!nIu!@:4Bai%=y^ZYJjEH%&>P#tKN<Hchb9jie#
eq?Z6% j<jRm<9KJ^Z/btWQa%<Htk5G@QdekiJlGWEc?\Xh=Zlbk4Ne*CeQd@91BpXNaIhBkccctXKB*cJH/%&u
MGley= 1Rnj$m>l?d$wm8d$=cC$N<6<\&H/K5yQTJ<mbSmt4FI6h!/@TCy\XC:XJ&h4ZyH&*Lq:58e$BT>JjDyX
/DDPRT G@*9qE%ama#1:8KR//>P!bIADqb@N&dt8bG&NFJi:$jdiDYJXM?HZmy$/w?ltXZuiT??itSQ/kdNt>\F
NQRdby qQAFVS1bHGJtDHQa%I/+Qe#L5\#^Dj=n^9\S69uMjb!apZK6T%GwH&YBZ\qV:hJK?V<4?K1%+9Wd?l4\
D1tbwR AcRj^IHCyt#HIwku$kwnJPQc::8Dn%&DG$8!J/cF>M*G?4ec^=c=PV%KnYAuG1h#Z#TLQCMTt^P6Y+wp
S@WBb9 ?>:9bX:Z=WPS:dTIQ>%*n#VpS$\Qk!qdRQ4jB8Di9%WKeAYPukmL8+<Kl$@5=:ijDJmD@5QD6>utRy:G
N5iLWI n=yR@NI<:=li^lZ*Za\L&j9n9ta::A+w?NBMIjY>qZ*6wbe<YLlyI^mM4caW*i+>m\Q\&Rnp%D1&:nKZ
W/cd!E L@QyL99Gq++H#%m9JGSadN?F84M@c>V#GN8>Z&nXe9\d5ELtb%HE:aDlNEJPW/n1/!9=B%X^aZLyE=?P
5G&+Bh Y*$HGhYFZ^qpBGLDNXVVHjZ#Q$WVj46tWS^+tHRZu@HDTR*CllIP$9p^%pjiAF!SyS=jEGDW+J/=9*=n
b8*^T# KDP4hp55t#AKuL5CwyaAcL@%+Dnb^1F5KM+Lq9:ub/5QA86@*=#PEyK:WH@9=Q9+Z>WTQ#X=eF4\5:4@
!%mF!K M6AE\bDC@yK6+Xa@^ctR<e^6\ubu5et6<NPcu<A\RalHaY4q<eVclZli&nmy%uI5Ke9y>646#5iGy:+Z
5!8!V$ k*dWCpXBPqhEHk6<MMhiGq=L&N^8XyM6uLB5JWFb&yZ^nW%5=J\d^WDPM/6\ha==?6tnFtwF<=khu?I@
XJ!iM4 EE\qQwwuL@E/u9#/K\$DudZRJ1T$P6Y4:=bZe%YQim9+WN+<H?yIQdN@4uEbN6Vh!h6HyLYaZCp?nV@b
i5<F&! AubyLk=>\*:$P@Jd$EMJN4==981R6iX<F4=Sp1\5VD#?Juh:T%>DiS=bu/Q8FV8CNZ8b9ZkI+L>L?#!:
:Jn/Np tuEC*d:hM@$aW>wAyj?c^/AMy+TVn?91utmiwStnX+C:WPJp\Vc?D?:na:\A>u@t+P#dl6Z9<$<ZKLM&
6yMC>C L@%&j#1<Caq9>EIl6El\HY!:4j:y>ykDIWIF:=\/u>P^S+wQ8/4*4Fn%?tE@p<@iCLd1<e&eC6cp8&Vk
@Dt>M! FuZwI=C9*@Nnu1EMqhMNI+$1jNKaT+KWt\RbTFMb\BZ18uZE68*C&b9Q=XdRq##4V4ke=#Gwq\^^BTPX
!PlNP= aN6F9F$yEW%=ZaPB$KNbtB:K<lPJ^YHKKTAX=>wS6E$V$dA9^pT@:!DTiW/NXGT%q:AudP+/D4Y^S?cT
Y%e#+6 c>/q=B$LVT?ccCKS\YNS<pJSFR684CinMc?E5W4pa:B#4@kce?c:^%:EGy@F*D^4G9Nb*uAdVZL6\yy8
F+$9k% pMWqqZtbTkJGbjSX\*X=S\HcCD4aAZk%$qe/ku?JKWE+*DB&J:RjLd9pJ8KV\Fc4FD<=l$#%H#&M%et&
DF&eSu 9>wX!*LiaX<!eN+k%kGq\a4ll&N!M^XLHN+aa5WlF&D&QBYM%HH?L4Be8!KmS5P>XF1Q#1A#uE4!Hl#9
Z^mG9I QdBp&YR9E>>pFXT8CiQy/>H$Z1nS%E@AK/+a6=Ch4!DZdV:9Nn+XceYm^dZ<iyIJTpPhTCWaI6YDXjB/
6XSNAc 8^AB4?Y+Heh%/eRT=Z4aZFKBXBnXW%JwpK81S<yw\ZN\weajYh\@G1:wRqpl!%4SynTbXV*u>?GpmhDQ
5AZ8mV w>uXuXE!SSKl5e?4h5&>y=EJ>c=nI!JcR\ypcu@68lXb%w!441!Z$Gp%GjE4$6dlHMWhGJa>wh9VX>jW
Cn/lXN ac%nVW#QeeA1a+hMK1C9C+m$GjStC8&NIm8alP&MPBcJh:5EEJMLK5QSP%FCdZ<C9auu5MbGWGPXwTil
AC1j6b *$8W$AVAk5+ia+j@JMpdC5PXCcecyC+JwA5j^pd5HH*q+6m?DmDL^DI:?8Q>&j9e>itpZneuWi:GnI>X
M&w+nj JcypnR#jAbHHuebaQ6i&SL\Nb%/%^GY1qm#>mISP*QnGcu6WyWwQM@w\YIHL1Fe\a8u1T\T#DTF*q$Kl
&@<>8K A5qHw1ph6GQJd!G!J1khFJ:%4c9eq@#V9t5\>e4Zjjn=\ndbMmD@=H*!Nj4e&6cp@l:ueZqttdCN@98E
/JC8KC FYKD&X6II+MCJjuCElC^A>1c=lw^?L6J&>/Z8>$^+NwPDq?YPj!<?j1/Q$y<\:?aJ/!VqIC4l?8X6W<d
yM<XtR T?<FW@ZSnT/</C=K>jh/DtuN&$/9Km*$ib1WY#=mQ*e?ZZV$&ZF^QDdb>&G41NAPwyH6yB@J@AnINCMT
NYFeq5 j&Sib1cV%V1/%EI/uhMKPSe?&BmwZccK>ad+1H1n^6$kV68cPFeWPAMdnP9X\Y?4RAQ>?@N#&+>AlD?/
15M:Cb wntLZ@e#iGbMccn8Z/R++Ep1IE6:?JGGWyZPiih&:aKP#SMktiBCY6Cl\Rn58D9#p>pWHTE9KD:\E\8m
b4l<qi uKcVWHt5&9IRkCW^p=iEZ4Kmpp8JX+K1jK$jcQp18yWa\6\cek<N!\C4M>bXVq9<A^%%ZqmP9@k#$N\%
J#IBLp juVb?=Ey$8&AC/$nP^ePkwM1^MplqDJQawIb\9VA?J116pAIPNAcCq6LJC+W:b%pF\<^bR/e#emQicZi
X89WEe iLQSc+!d+d?=5&jW^k$jQQ@*/Ekd<nVKkwJiXi+ZuM4J6Q^!lRpjbG4E1PHI%ZDKI@FE\9q$:!ySiCl8
KZBS\h TCKi#yGMaTKYQn6th!l5ID!bR8R*kW^G<@i6G%\Shd4NLLa5=<njaWWLZhZLhu\GnI/uq+^j&ScR^Fym
c\W6Wi a\nHN&EuE69/pKe&>G#%1CiJTLQc&Cy!SLl#EYi6/XRlZZ9wuSSqS%PkZHlu#lQc\5*P*h4!!DRPCGm:
@y$e5^ KPtabqA#L/1#4^SGS+lJIa*5S+T9\y$<@Che?dDa/@%Mu<5l/6InEtBK>m$@YZb&Jq6GlZ1m5+?&:mhR
*Jbc:M LI:c>yVEuq*nKLRKTq6@:F+A/QeC8QbDy:Fcw^yKwZNKYdElL$/+qM4$hPmH11yS8t/Nmm/jR5Kl!9R4
YYVL6A uc/#tLud**D?=#9FyDjhPYPRSh%>Ya9cST4cnRZitSVtNa69Z4yjwS&&V!J1RtubudQXJLY&a%j+IMy8
hXhmGw NE6MXFnbK^B=YH^luj5MEB%#\ZFDc58MQ^P^%hwyK4V&ay@8>!<4d=INhK:DCH*?6+mjYW4TTSmGt/jQ
bY<6>m kqwN<hdu&u1nRtdY:6JC>y8YF@^t6QAtZM1M*It/m#yy:NH!a9<%Q*I^1W>=G1%99\Y9X=u@ECV&#KBq
/n:PM\ !BR%h!+^+:%mX694%#jD/hjAkn<Dm4GASZZpw*=e&1$$D+EcGIYTpWEkRAkECmYXR1BAWlJTKDGE6ASK
lahZuM YqJTYqycSkcBqWKJT@aRmR#E/cKu&C1^4S==jye?etc/!dF#iL6FVBh9&kQ%CM$KbYCBI>mEP!E>DS#%
<bcdBh =\^6VFi=ThWK+^qlAtV4B55JPaFd>%WH$CX!NZp1&14V$/%9mFap1JMulq+tXbkRyn$?Ma$b59&WQ8i\
4&NpL1 >Rj/XEl5Wl9lkQkV6Zq$^8$V&FJAy+&qDpE?hDniPFY9e&\4?ahAB<e#nL!a:NA%6DFI<G/?KikV!$PL
ckcZay V8h/!HLP%JWq1jTKIWiLy>t:IG&KanWSyWZB*&6AcM1C5G11FpiTyJc%1@F/1ClGpX#/uCMP!PTWLl<$
M9pTl$ 9W9+pF!P!FAC$TmYT&BkayeFu\1DlA?C%hp8M%nMK4di&l8*GqVFG*e*@!dt\1KBYqdmqY4ZkP68N/c:
CBM<!C EQ6Q1VbV@4:GDIy:T>Kp>ql6ee=tRiE+=5#ll&&n4/\l:y?>\#1LY+\?4j!CMM$/1/G$<?uAhaRqd*>V
$H@DMV /H*+hG9>C$PV+c?ZI:NAb5KETiH\V$kw8a:&n<1n^q*#Q&QB=i>8TbLh65dbhA4%#<ak%wXM@LBYKD\P
:I6EBq @tB9ZTkcXS*1^ChS^YBFWWTaWG9M4KLhdqTtL9nWDjHn:M!><!<n/ZNZPXBBIQbQem9=TkJEBS:8ea+!
GSH*RH Xa:PP&LRFI&MZ&5qq&tJyL<Bk>A4^ITi4:QM?WK>@hH<c>6X*dcba^4RGK6*CBPh<aGuccT=?l91VnE?
<&19^a RT>Ck1=1\5HMjKT/m=aQj@*R\P=jQ94#TXkL!Am4pLYVm6<C6&8T^?+8Glw+TKDF1S<6c#@!5!ZDj6qi
h>19c? :hKW/4qHG&1@4I9S!%@Q*&WD?&FLC$A&ia8!t:JN\=%QK1tmDSTa*kBD&?LuID*\i\ZCXSh:<^&dJM@8
:?yh/p nujJnMjGHHDubL5B#Qn@l?b&nBc6b>aw6&*ndN8&dh8&dh8&dh8&dh8&?9%8h&jYTDL1V%c6QJYpbBGc
d@dbXi #q9ndAZI@EkpTtYHjVCN$N<IViY4ncDTPCL@JLQ41K>6V1B8\!uZ#YRX19LCwpWW5#VL\P!?q6nP5Pl+
a<Jm+p &#bIWy5//d?JV<tqM\q5FLi1JBVNc<Bn+#M&Yb?YtXC&!=u%#wAu9!kkIZH$km$tyek>qi85Mph+CFee
#PFT:D Be#l9?5iVF>:hqQb:*et$JydCBIAq+6S9uI=F5iA+XNINW=Cn69ATK!Ab%$Li5%RbV#!cYT$CtPq4wR4
lSEuQH B9tp^kNZ^NWL+k%ePpLhlQ$Aehl6MEX/XhCbM&MabLq\6QAZZRmul*dYJd9/dGeE%RyWP^B$le+@K5w=
j9LKt9 1dJ?jDQ<n4HVaDn@CjR\%\$mipm9RRjR$+*$mK&dT<TCLNp89Tl=qGV1#C+elb@tCZD=A=5pCy<:Y61&
ciyJEi HRBP/uTTpTV&JKw<N1EX!+Ch8S@y/p!yXAP%Y1d8!KubLJLy9V=/:LKdYqCGiJ\kWYJ+F*NDiZS?/juj
&Put/e 5Q8KjMjTt>N#K%lVPV@m!V^l$wi>iTA5mTCN5%dqiLR>JI9G&4\?PbXqhKqD&66$u@=Z#Fy>pT6!%:CM
a*cWZ% T+W*1mPBaXmjhXa\\/TKH:a59FX@tJ$8CyyFMlwJp?d?KP!5>JFbM/$^d^Bj/mC?Let=C6N6<A?#til+
Ah8G4q !>HyL!Ra:/1pw6C9\YP$+#FGKSn+KYjJwH*W?eYaT5Q:M4uyT?kCEWKSM$i6!8%H1k\mY\b1MD*:j^84
i<CZmP ?BX#dCWDZG@GqYS8X<$V%Mc89<P>VR%/FVST?:#h%+b^6T9Q<>ku14nMn1QEEmHm*Vyj/w?yEDl8HkFi
Xye$Id <&m8PY\LBnTQ9Yb6y/9ZQIuP@1L4<Z9D5+iqI>BSd^%S1=k$L#XNlBK?n!*wjy\ynn@H/P+eX>@5qKuF
5@?&?d bW89Yy?IR#@M*pk<66$*tyZn*EYIY&Nmp1lSjd!l*?:Z:%j6>mV<TNqtN6*%tWy<a4ZbIW:8T\!^Ijau

-AX4eZ 000f74be744001202b4 Page 369 of binaries2.zip
TTV5K# cV&TChDQqjlla1nG=G%<lh5k8Ymkc$ln9y85WdtjICE1CXLp$*Fn9C/Jt%8I1acQtdXaS/k596+Tdw&q
@XS:Qc cdiJ458ZBZV#!kpuYHa>1NXbV=H>wFPp!==yFD/=WaKJT>/8L<hycRS+PJ>cDJdXdImVaD:ZjI\8euAH
SXB</T CAl<@dBV^:<k49?&k6uJYJY$nh1KuJ6Dyw94FQEy8CP!wV/?$\%BjANLLJ=k5ea\W5l@Z^INR@RwQDaZ
ub>@6I JlI^m&j*WF#IHWnhc<EJ96/>I<4&h*\$HuqLiQFHw8/apE4uhGa#/h#Y/$\RnGElWp=*l$k$EkyXtpaq
9pwk:I >$#5jmY=iaeGRQ4dmS!HQDY?T5^^>lZcZ6JC4EncmTlI6q1N4N5:q9GjZ?Ld<WN4?&dRLZHYThVyM>w+
Le\LN9 eL<PiG@hPah8Xi@eSm6Ekq:%MKmRj5/>Inbca4aNTNqMCLPYAVLX#V5dt@uNu!T8Vp5/PepZnW^1hW\<
4XZM1N JqB1+X5+iXR8J^TiC9Eaj:DZK1XuA4^a5ukn?Cqi?dd>Le&%NDPPy8ycHuJjBY#E*X&KeNZQ#1C#Qh+J
1yQ&I> >e6idcWbm4</&b/!k*c!?G!@Nw*/@mAD:bX$T$iAIZ*9:jY?ZT^lHWKl9?t&1XbNyWKP<cIHHHJuW?WB
%\hhLi Riend4R\$LudEJ<>SCl&/JeR=nTqamyanwqL!c5uhiP&D?eMj^\h>GRWES&Qd^?NKjcl#AGF8qV%PELX
V+i5y@ !/qZR#H%y4^#%hK&kZE4VdKQmi\JL@bHeZd/e>%RLlFm4mINlEANM%9^:ZD>dShXmSH+DF?ME>twbVk=
RSDbWF :y4QXbm:^XcVuuD%E=tLkaIWe4Su<9&TmhnqahhFZtYG:>t%=Cky=ccD#jmu&<a?4:bAL%YIIlIwcGB*
G1i&!^ 4&#l\\VY=tkq?$!jYR6&aM+\/k$I=ZhI/DEIRT1IZmF:F<Ya?w:<%K=$>#\e4VbC<k/*KpZYmZ%>^S>F
!ym&Bk BY$QN6W1?\qkc4yl+^PnISS?uwhcWHKw9^jLWtM?NTTXd=VZRh8GR!uC=X^#Y!I&Eq\EEAV8$VJR<j\Y
ZVJP#8 C@L^dhTcK*nIVX4PPZ\Z@IPtRyGR/#%qNH<d\ywE9=I+yQISa$tp9elF8AQc*=eZ+BCw6=ulGCwu*L#q
9/FqBj au1K6nKl>CCQRd?NT#&lCL=#Y>ZmB$uJ1=5XR$kN^W8#I9XB&miq8P^JISLpu@9+dGu+uIGH!8iAQ?>5
EA=4El FWm8b$$np8\^?J4%X5iaH&H8F5HPMT1cM$$q^6RSbqQ^P$dCeMJ$4d$mMLqe*YZQm1N^?AqmG><uG@Cj
1h^kVR BlP4\lA4>t??uG\9FQ<SYD:YhA*AKBaJFje4PHVwj%C8\Hu^q<^pMa&%&V:69e8TePK4J#y@h</QJD1E
CNlaSF 8mNti+6Fw>HZauZB61ZlC8/j@tJBVm6Qt>/p<F\e6ZKeQXSK4>:M!VbnQhR=>Vb9nylN>E^=41BMA%Gk
/1E$%@ VTLw+KSd+EJGDF8eN5X?wj?H\+<=RiqY8A#=%WGLk>e4qA8Z\*MeXPpG#/L+ulRKNWP?F=VauYwW<+SZ
DnTJiB K%5c&5@F8ly>KdTYu#D1l@mE=^JS<H#6b#VKXe=:FdX*G@QnIue5M!wYkR!Z^^4AXk$81@hbFQQy!uM6
/%hqEd IF!W#kh=6PA$=ZhKnAkql+Cc8weptK$#lT8GT:R!<%Djp\MKh&*ikZylqY5W%$PVRdE>blVbjXYXkjNm
Wl9liZ W*Xy%Z\b!Cin<!5*X!b@Fi?&!%PCt>y@VCd>B*mDcB$bckyRtDHHLl^<+mG*:Wwibw9MD9\c/K\H6FSm
VLLubk LV\dnmjpaihFKbRVQQK4jq69L\BwEmCd%KT%icJ%8X4=:+4+LI<Sw>y+4N?BTK/5e5APTSIk^>cPCA=^
RShmHC @lV@4^dY<>HP19d#=^EM&t!l4HAi^JneEmGwCSHRZekXyT+NPME4?M#:1d:a@NN><%?@/iwFtK?ik6Tm
uZpH<8 BkiabihiwF^LeNycp&k!yM9#9IT+*ta#Fb+wIihN%G#mE@EpuqWmb$?i!<6Z%nNt>ID5WeTN>?*uLiR@
KhXK#d KlI9PXayNqVbVd$Dk?tYJ*ZkK1lyaiC:\N4XVRb4NA>=yMM<\bPPJN^wD<K?nQT9#alI8mnIGEHIFcEt
TV+#@i Fw+DeBcCnNijE?ndR@Gwk>mdX?bN:%eIeT&@LiLNYYlcPMVNW+X=L&nT?>?ikwAiJG+>\eqNI/BPN1SP
KPKBG6 nWM%I^u59>JdKC^bYW#DhRS+nY&FeFR1pSYt#LP9<Yql:mZSYA@$BnXqCuljq\/^!Y?lIFqbc\%$+dJi
SHc?M5 e*Z\aX5XN+/?1L!hu\*ql/XcJLFWIcKIPm\tXRmDHBBA?Fd:jSh=<!1^aFpuFM>XN>u#lwW=&k/SSD+9
H#15>+ A&DC>K<i#J$bH>5!Wet@61D#8F8nh1?&<i+^$BB6A1cQKHR5tnn*!!+6Q8PlEQX=I%RY&<9#+ptw<h\Z
QXJnNc >>CqB&t*A^!qjNEn5AFX^SXJ>jN<5EdjqcEG5j/Mp:E@D&K!^LK&Y18E%LV!ADWe/yuX4t%*meE/?n9#
=mRtAl N*5=MR/pYt&$:GQ5Aaa@%Zi1CPblTce8dJ%8S1at++Nwl#/Id6><?l1PcbcqpJL8cQN!DFW1S:/wkQt!
elHGcS *9wWI\cCw%qVM1#p+5N6=%JYDJTTVuLCy\aNPY9HnLdEBWheLyW?1Ei%&C8KP@qq8>5+EL:mq$Z*/t+!
h=K&8e d9G1T$LQWNj$9NRyV#=hT45d=>#^q6mYR%PHiV1>J^eKIEFG8DtACSPhQw@Cl8kAAue*L>JiLhTweL!6
ptiY8y eW\/85t@*l6dK9YJFdalYe!XYqYnY$PFj&tkqShpSFYNVhZLX$Z9MqLFS$K1Ky6ZywPKFi%JywR$ltyZ
$nwWBh GX$iTYND&kiA*b+LRN++ZdW@DMPK?kYCTenIm9abkGNRKPV!BaKJ\$VFyCRRTMuE<ktCITTSKAVpm8LF
n6du&& !eMNElGRL5lY<myqaiipn1p1A&S+qZNZhSI#^8J+ibZF>NRRM$mDQymER^MpyGLbW9&kc+&V$d8JCN<$
*::wa\ $w&uYSDX8NA9QmeFh?S!EatDmE8/>hEPRL<J^/V&+p?I9VN>#t9<YBctT8=QERWXVXAN!\QLNcP<n5Hi
cjM8/t NEYTQadMQ*@QJ?=T:!/ZntZq?GeT&d=$a*uRmEVKnJ*muyT%bYBSC>NSNd/%*Lw/>tV>$B*9Wly<V5H4
KyWPCi pJ%X1JQ$JhNuIeLaRt8<pi<h<M$B^nKC5&J<:49X9tFW\ymkFRVq8L56W<T1YlFZ6^5\b##NJ\Zwia<8
l5Mbw+ u$CXMAp:VaSQQk$kTbe!6KBYK@c^m/8PK#wEA&*W<?XBTuS!9=@M<Sn*QwG$8eNGXMi!6A9QZ$J8#btN
XMZj<E ^NEiBuH5L$S*KNN8>a%AT:*6ZK@:6Hjb4i!W!#?>JL6B\Ih1jXB<8%M+am@eQ&uNKh%ewYk=tk@cXwW1
de:8hB 8/cwi8AJThDCe!a1DS:kak??y^aqC6lRHjGKhGJXCql@TjF!Pcw8Fq\uJltRSj:%1*yFC^p%T$NhVqRu
$$TdP6 8:AL!P*!JqS*YR6ju>dCW4b%u*P=1N4XBBP:j?Y:Bb8@GRSIG*p/Cj<tcq6W6Z*>4=t6%PHm>!k*tC8A
&JJ4ew yV6ItW6et*D#c1d>Gmt6HC=uG5F5YmNm+$wjYSHW#cbQ8mVN=KbhppuPCye6*SmD#EkQI!RiaZ^#WqjH
!NqJ&9 4qRN:&KV+>t&>#<BW\66&:aZ^=/M6V1>=S=I4Lb:hibPHVjqjSy!5uA\Pk!<Eh+=&KF<Fc*4aIA*K*k*
LkipGJ /W**&L/QLG\^!CFENeHjY?JKBqjDLVm\HLFWNX#d:h4Lb@Z8dIJyR^*9@cLjPqyEAFRlM+%HAaH1WWDV
&\t#dh uR5^<hd9muQ+C<N9D8l=8BIe<^#tiJ?c6Z/CZNkSdlK5YSRSn#TAB>AD<F6ZYIl9i!uRXkWKY@dRPt\K
8pKtbl #H*6\KX##lWt+pH98WXBZ*9FuLBZ@wn\lQVp4=/+E\jmBHI!m>kIBS+D#+KX%KemaZWdTH<!hmMA<ZiN
4uF#=1 lJEwuF%SE=d8hTlpt=?h&!QQyV>Y<=!CSR!kZM/PB1HHBYLJMI8/bR5yM14N@8YEHXKa1eVuN$ITR$Ed
?bmd6% 9lBjX\my6hiR&lcQiuM>mNabyCXFyVQtt<Rp>Y+1?*?ANXTYtD$?/y9eZW#Bubu&cYEAaXj6*%nRu/dL
dpTXG4 a8EY846B!>D!Gk?W<V=A8HBD&I>KkI/$#iV+Sc<pqhe=bKR^A=L8Kb1?F>hWEK@P&6RBn@Lapl:J8M/m
:CYE%T <^:yZ4L6tQuITiFC+4WGJ&@T8H:5:CElpt86nd@%ZH!q+dC+@@lCDbFekh&i@Z6*P81nFSHZmp5uLPMX
#*kDq= j!jbSi#+*DWnB4AT##q6C</Y</Y!ycl6&jW&IL4MWP&Nl=:PByFRbeFNEq*BVL/V>Q$L5>81Y&:GwAN<
<AbFFW YCM^MwtYe9Z9Z$=jD<^FaLlM+&%6CjlR@>Z&u8Lw&hw%iY8SJ>BG9>N*kan?%>j\GZtQGncG!@wmTw/I
ukZ?R! 8>F5nGiAZR#1Z+664E1hi@ZyyKw?@:!\:y%:ckdFTEy4X/5hlAibqCRbIPEcJB1MF!IJS@cnQkp5&MXH
e\NcZ& J#\D\YZGCWEBLL^/$^bS^Vj&YSw4&b*Q^npVDb<bAu!i!h+cMb>:+Xcd5DcQMM:jYM#VLmL+EuXbie*y
5=1WWl 1cNnR@!+lwMit:th$4VW8cVj$iX\B&ji9C5%!D*YD+Eibd$Nm<V16k4cqH1mEdi/8/dVk+E8/P8Rdb!C
nV^=5h #8QH??aZ+AGEHmqa%4hTY%9EcLQm\^LZP#\mlKW<XV=\nl6AKK+JVlp>C1um\AtXbw5D#4MR#EbV6G?C
&>*:cA y^*F1+C%DDt=iLP16:tthY/81%#+Mq@RcVtAaq=$bB11DFI$/AWXcq+eHGKbtEdN<D&Zm4bDl8d?F1c\
u^wQQ^ yDP&w1>uw8LGhiH5H?=9KGQ^?dtDtMHl%&6Y65DHR+5mby\aM4ZZ#49J1E^cBTZRc4ZBXn*Yc!jBCeb=
yC/Eiw <FbkICGElN8^!NCW@5G+mJnTX$V@L=K#hWu!NKmQcNIdVLIM8uImh<TXGK>n89@9uNBXBiuYdq%k+IXX
Hb<Q<= ?\ML#IVj+AQ94jD\c#^j%9QA1@?E/8JVhH:!<%:XaP*<c@wk/<lqAC4mP?Kj6Mk^wt?JjiL81Qlb8wIA
Gb&iit P%>V=Fl1qjwma4%:lq/<u6d\&puWbL<+%c?6KFiTGE5P1kwn<RR/\<aG?T?$\kXc:kIkSJAquT6L+q1b
j1!c65 D?JnDhS8K>*Ykm4ZZ5:%=SV=b#:W>$4R<tN1m*DLFG:h>9G8WYl9huT6>N#:w@ak@<*#>$ZVu>hW&^=/
kFe9R$ pWphJt5NTmT^=pMJ=A^Mw*k^QMH\uiu8hY+jt!DhS%Hbb4L#tNt9=YZMY&%*a+#@lK*VX%%lZ</B9MjI
WMNL/C <l$@$$Z/$B!JTwG6+P5E/1ZH8qGhu%DT9JF$:cpAyd&jqIpBd&c/KtM59u<lQ<:W88cZF%@*6uYQnk8c
u<+XDA K>!*4A=t^B<au%&buEEFcFCtZJk^<^Wp<FYD/P+aWN+PyPTu!m@JqjAP^IKwSlyMWhQJlpM+!\tY\hnK
jS=J$u G:**A*T!IM6dX1WmBRYD!TXbIb9N@lp!Id?c*$\*:qmh6XSu4b!9&Jda?5Pd6uDDq5CQ\$@QL*tFZCBn
mb1I5! pcGq:jE5m&niGyV+#A+Q@JQAdi\ScumWZ$y!IC1CtkbpJ%Su#XLR+DiCIn#N+PACnMIyE&c$&pe#!1I4
len^XX H#Dce%IF\i/KQ%&wt@6kniypFD=cHCw=#I#C/I&&=nL5m?&?1\l*wC%^MCXbCSp9DDua$1!4HymqMZ@@
>$%Y<I *wu&//#X*liW=XHW#//w/@$ZaBZ8eBFNp^\l4<Fh%!k1:4N?t9X4*Q6V%+\JBCPjKcCXHm18P\VuA$n@
-AeCTE 000b725cef8001202b4 Page 370 of binaries2.zip
&mp5?* H*m#LtM&BnQN/QWHQAaE&c!I^Z6@$5jbFYMDSL/LkPl*j/j9FtqyniC<!@FdA<\La8=a\6lX1=%DRGwQ
#?eTZ@ pk\CyG1*QG5&qaa@?dKmI\5dB^&MNtX&!6<D<j!X$XMHBj&54T16^\%PPR5HDHybSytD^u6na<$*<Xb&
&1lERJ ilmLic/l$tPn#mZQ?$@N$S\M5$JMYhd<l+bANhed>YEGH4c#GwY=9?G>>EnT/jbh\Md/AR/cnP$Yk%&*
b64Ai^ $mZXnQe1=W>kW<SPuQwJ@KDik4F8de/aYY$jadMM5!NS<c6@=beC@LKYXbJ$y%YD%TX6a!h+J4b?lW8>
DV=WZt H%kDc6Rt:C\aLX^Q&m%Ic5VMZjq8h!QQh6>=yFK#8llk!BI+AhPl1QEHF%km^EL4mht*$^qy4WZiZq<?
pqk18/ B>acY/w:=\?*mX+Y\u&i/!pA*AR96Zll$c8&5Ni&6XBmClRKNNHE!A=1Db/CNKq#DN/^::@K&kcF/<Y+
np?Vwp 9T\%FwkjSEHcY1FhCaJHHybj<RePtiN!5/NeLyc?<$1&I:N94eiJ^/&4Et@pNX/aXib$8qZjSNj$yE$a
mHtHph ^$+*t+i&FZ6%FleTCD$AycS%XC551wlh@T?ESiI9pDTik%j8iY#&5uy=cN<uKjpj=Akc1>/R>A%V<$6Y
WLKVw% hpnyyb/DwcAN?@D6l6NynN=&8YBE^>lL:bBN!>\%ChiqNL!?AqVPQ!6!E4?jN+p*$*?VNeDheX>yXh<D
8Ej9TL !A@c$T+>W!&a#GaY/W+*a*ZKeY8GJ$Z6Vwi!p/u5PJL6:d@C\:8VTeV=+pqGBDn=<jiZ*W+y>81BZY6K
>CH4CK KZYwStI&6H4E$abBFM>E=\J!a11laJQF<Kl:h!!+eDpP!\l9mq!%>6JT&CZ518Bi*=i!aY:tiijtY=nc
Nijcc# HmaQT+w5w^!LBJ>V%mc=Dq8eG!*=+ib^ci8Mn/hF6R:4Fqw%/W9&Qcd>1WVGwDZGFWJI6Dm8Deb&%^Jm
YeQ^u% h/IlEnJZQ?i<%uWu<<ZGuF6>FJ=StnSBayyI84!$<q=Y*$FW:=FBN%XWbbXFY8eF#:yQ*h#eVL:/N1AE
\N6t?h KmRutX?RH/1*KHZ^STM?u=CKEBiWPa8*Q8W:<JZEQ/#l*cj+^MtNpjQbQ*kXKFMNN6KAw+tJD<ndeG*V
1@dGwY mqXc=5BdW$iy6=yDdW5uc<^/jh>E5EYPu+ZLINdZjD5i&<:VF#9%<$\V!R<y<8u%q@$Em+%4ALdj?CAm
lmk@Q^ kwc8Pk4VlXau=cKuE+ECkEbD^BAwbTS@<\QwFAtQllY9I%JFS5Rh*^%dhQwhRqH**TaXpCS#pH5$8\!+
4a%k#e K%aQen>:I19uy59?:Adnnm!^wiS&E!q11>u/EwH8*n&<wS5JZZbchX<YuZZn#F%Q\@^w+%I1tqQ^$<^A
BT\k%T +8LqVlycllVXbZ@H/Ad/QHD+JNpcj5dRM5n>&LNE*Vd:/8X+FM5Mj<Tw!R+$:%eZSQn59/X#dQVAWw#<
+Z/*&a n@\8X*ih6u+LS#1+>n:Vp?nISp6nZhk%*jtM4%MPyi%Kj$HhQDnw8XQ#mMjG^qVTtEnLa?blM<D1PKKK
cR@q%Z VlPRRAia#B/aQL\#tHhXIqd^P6GR9tPchQe8#QDRpK6XqyyF\4eFCyw>JkJj+AX?pXRaHW5ajB/1ipZF
wGdywB iSh9uJbBXXXhy+9La9Y#h#e?pdW<R9?WeT!$qtiS+pwZ6S=w9u*$BJKd>w%wEu#<QWHj!K=EemQ?mV&y
DWIja< F%nMe9y@=*=!d9&?qNk>EuJq:TkdE^Mc1JSHA@pm@PKFYacwlP^iI15/kYWbFij9:@X>@GQlMBXGup/k
uJHn&p neV=Hh$W1%=MBbDPEj<MWIBNn+lXh:=KaL!<yNbGk8=Y+Xyq#=yaGuCKi9^GbEH:a:h>M9Dhm<JLk$tn
<^X\@N :&6pdyn6TV8cH6nSu#P*lhZi&yl%@#6<ItSiNdD!ZuI\^Q&BZHF%58@c%w6Lyq^Wc8!bw6mw!k/:PL/S
lDL:Zh yQ^NabMu6G\@RZ#=>i\F<6S=LCh:I9>46q#YbDN=RXR>/kE%cp4EQJFIen$hjmYJyGF*EE^TRlItJmwt
MKK<51 LmGFpJKTpEckaMH@4/+MVp=&dk=PpKCkpKCA8KC\G<L=>&>B8LBBwJhZAM=bBK8S=YduaYeR<lWIFDXu
/Q&Z9# q&AReJw@iLk+&AEICRRCIbGAtL@piWS?5T:=wStJCm/kbGWAG+WSNuD8PI*uDD^%%#hq6q/+eM9^PT6u
Q1HTDb #G*kb!Wuqk@Ja55#+4:F5ttXNMkmQZVZq+@@XA&W5!S*^Y*8+yZ<#/ZC*KED%%VYnH%$LwlnZRtLj1P=
V6teWG tBV1/>tC:luXM!heQuHtwPcGw^JlGmtmC=uJcCI&$>e@iYV^dD\dPu%S4hY!?EW5Qwp:dW1$8@q:/b+5
nldKq! W%mcJ^du<dY9?:Nd\99+EV6m%j^G=LHBcWZk#uy<!^u%ppw>&tjPV8+<+RT1<!?>un#BWR:bQ>hLlKSP
AnAC=$ Sna+E>S?@qwtPQVypLlN9+&K5k=<9^/WT1CtVG\D?<V8yJPcaRR&>wPTY%Rb5F1$j=SII<w1NmmXBqFM
XdMPwC 1Xek+jDjP9VQGL#bqP<kPhMV#4<nQwdldITD98m&+$Q^\>8EBj%<#Z@Vm4m+a<j=I?6XynFS/Q?\BG#J
FWZJ/\ IM>S$:4*Xmq99%$ZD*imMQ\KNSZdcKNL@J>QJ/$AD%8ySipHkLKb5jZePy$4yq#%thVk>W!dtMFuHqJS
TC@bqj Q<J?LYWwcLlYkqi>a1*5%ipV:L%k*hPiC=c:Q:%&1a&Fhu=N^H:Y@<RD*j:=yFJ49itKn<nM!$DiM>YK
Z^^R8? !8S8/L\\?IW>pMCXDd*#thAmMy#K!4@AmTu48c@+tVchFmYFqiL!Td*l>bQM+9=eQ^tEd&jGaji5DV<9
/CtT<m n&1>8CI$9+tpL>E5Baj9/1PaB&BtXVP&Pi1Mk&M^/%DVhWFpk/kdM48VY#:pAbmEhqN\i8>NGJwj>jt8
>*%e:w 5^T>%D4cjnmEPqR&=de9i+XttCk+eFkb9N#wkkZkL@:eJ+S8:^R?@wNpBwuJJ:^y8p5ac%C9cn:iML4X
wcl$tQ @@F/qiAqwicnPQbJuK9R6?wDaiZy5@N%!%TJ#q?cMLq:HtLS?yLaW>4<%@k+HtMdhjL#RK$lalWMcR*\
i!ywWd ZMndt=h+QMj^Fk5qyF+eSRnw>D\ySG^$9dAbcA&1GTuE&+w<:QIlp@#YkC9c5a/t:K9E<cP$dD>5X!&c
bA&*y= i8bl=IIewKmeT1MW8L??!n*tijNSSlV6GW*$LBwZQp&>Fy8!\T=@EPuL:9AyTySGuepEhJ8>C>WTH^u1
VES15* WZJGR^/w:8X4VI<&B1P6WS6B6BmQP^lt%t@d:w^WA>T9%Q!8FK^$$SJJhT/&I$\6!>5?wcc+JWPcmSSk
A#y^FM Adq6Yyw:q\Hak:Wan?D6qS6+Q&>CVBhA#N=JX:kmFHqAwQwmJIM<V%Ad4u:bwwV>^FwE$aIYPLRW$?QS
c/SjQI q*D!Ihe4lRWNi$&bwY%t%Dc$MG+8CNjVq5Lc<G/8p1ea4qSubeKVi5/$a81=%:1jA@t!4XYy/MebePE>
MiL=1t imW4nN*AmVSAC+nJ+YM4aZk>:bS><KN5p59^=iVVc8uGnF:6*AWdneb*6ER+Q?1w4upuXLDK8>SB#aY&
NiZER? hPke+mqLi!INF\A:YCFcutjMK>X5iDe1Ay8T6^T>WP\j^6ue/DBMYjNhNT^kkDSBy$4&A8y*L6+ZuYCn
Mw%l?I %P^<<Y*1%Xi=VhM<Ad<8neXyycKVS1ydHn15?J$MaV**JQJ6hXCHhh!M91MX6k$ZeZiJ@aj^61bT^LpZ
QIWSmC 4=1nTHI\j:eESc5R+PHSbmhE&H$J8Be@H>pNb5I*JEikS@bT<Gq\Hd&XdX@*XP%nI+J*kWnZR>/6<ucD
ZPZiPW Q<ikk9LqW&GFBhNdS=:btB:6J+XKGkn&IV$/dJjBEhpqa66!XKCeY8ESi*b#Y@YS:ypapY+<IF^Bhe4+
RRLVJY *pCNm*iwcPPhG$SYG9Slbb8@MC96RDQyFi<ItL>dZ*Tuy5Tu1&Rpik\$&HY^W5V*lhaI89#j@SbD?EjJ
*Z=L8n DK9D#GbuS>eKY85<6mQcy&:YqdQilGKqEHB9PB+5q%M&QNmk$Njt8Tai=QV+#\TDD^Z4J!bjidd6mid\
I5&8Xb !<GjZbqy=L/:64FE#\bL4tAK#dFC*^n+W=H@e\Wl^i*1c#LC5Xy\@?G<4M^twml4ZpE81$#/+#aPAd8B
9TH?CC D/E5qnqm4^BNATRinHZhC@h6P?wwbh*h&GP$!1?dX@K5GaZ#/!>DB!8GVdFXJu>ZwIQXK!?NALS/hY:m
4!BWnI XHdLPeaaLN!l1K8YenjyWbD964Z1Auj>Qb6Pk:YALhbklY:4jZc9F5YJ>WZP+$&bC%NVjCX>JTHh!Ki^
+Z&Zb< <H:p<#PWj?:nY?W=Rw:C<8B!Atbqkb$a5ee$!4h>=Y+%MJtT?R&hGYJN*T:Z1BRFXe@TLujQtZB\L%k*
NAPdNE $iXlqwVSB5SPe@c@%\QBJTDHCF@=GkZ+hFZpGp@%H8GLqeKE<5<P6Q6JGA64&\YT+RcXtJJdSGc*+@mT
6XCuVE &:He*R<ua<jMS#C%VP<1TAF6*m?=5!h1m*E4%k9L6Mcq/VbFA%FN%BLVkAuidE@n\uncKDm9:CpMcFPp
pV6TN# D?8GJA9SlN?^#ERByTIMZ>S!5I%W+18bVk44M!k1?F5X>NwpBa%MueVmkj:8yEIXl1B\pSme%MNd$D<%
+yCQtJ 1l$#\/QP!4<$akFJ\M5da5>>p!8H=W%hptN$/wq4Elyq<^5!:K&%A&uw*n\Xk4w!Fy8ZZSHVmkbaWwGG
i+R86$ #SuMdhh4*a>L!4N>9<:Mtq?\CaRumkY?+#W:pwG9/jW@S&@VZW!RhEJFckt$^WWGPd*/F?q^D@RQ!q!5
V?E8jT miYeb!KNlL^YbE66*C#DNPcMGQG\V4kbL>d#n$LVF1^4D$?Ni#?dZbH^PL?9q4m/VinD\mT:=>nZt<>H
khwR+N ied*mF\Cu/ma4MD+=SD!*&BE#%#dnEy=<katp=VFt#XPNEPiT%ZbtF=IaS$XTyXI5Rj*!6e*i$NL6NM4
/Ml:5P A\<j%T9yXHi%Q54y4EVPdMtuZViM=FdAhmJB/nZu<#WBpaIJDq#51p%dFL&V54nny#yJ@nYFQ%PKWddF
8#WqMY t45Kcp4l>68wd+q:Fm+=/lYaD$S!d@kkV<pGV<REbZq+mQq@kkDS9!DGZmJqB@\ZpC&FHK?yJyN#Q!NS
PG:Q?R X+CR?chLatNXB&H8P<GV\qGJ?i=ueJ%4ymJPQEP<wn$#>6@Tpmy=j@Xi+yb&u!h>965pn9Ah9A=w<E<E
LNGpyP H=h<w<J5p@A<HD^jhMnFj<9HZG>a5cYS^QuJIVwaF9k+8Xl9@eL*eFd!mPjmFT<wq1@y\pQ+k:hXXHpA
Lu?Dmp m<:=nn5YPYp&WC@#:cKLR$9$9B6Ce%mV/uh%^+t*X<LGj9NR<mLFPu/EtCw&ZDFqZRJw6H%94u@HhE&>
DR!pjy tn6hj^>QcqBPQ%k\ItKZ\TET<h<?hB=<J#S4SS%M#DcXt?HLc5bTb+hTuTqD4AK*\%P/AclhWMm8=j=6
C%&Q!R NG1A!^1qIw1>ZpX/cHQ/iHcZJuRjPKStHVq^K=jb<\5tXChpHbaclADTXJ&F%RdWmp+8d<=/%T8!kBSl
>HDQK% >E%>l^ThJF#h1dWFdH$+Nh$b^#9ubh8lA5B4<uhSTT1/DZtwk1yuH8R#\FkNG<NaI&<aBC?W#5uG6S?j
%\?4c< %88?h:&Iq5MkW#ummSWY6:\J/6qRP$VXVd6Jy1=?FymF>Bqpq\<uH61@PmKe6B5WY/&@dp+=?dHWuel\
<$H8cB LHKpCqNH:?NKHMYJGIDYNGR?AkXn^YPiuX5/<X4jL^6ZI6tt4H%>4QLkI+NCk#%%8&\EHDiuYl9?8l&\
6!6=R$ kp$wqlG\$NJeJphAG$4LLZwJHnJ<wAtXM*EQFQ@&&CK4%bV$%wlKBE/YZb*9R?L9Nwy8*?%5I9pYlt$?
-Ad8!C 0000f05afa6001202b4 Page 371 of binaries2.zip
j:n/+Q !@aPMF=?G^eZkBtTGH4E4YycBj^I+N\E<bc\6*+9NLb^NJVV4MFJeGIuRE8iB6aZ*i>R4>*k5pcV\Dh?
WXRdJP 81\X/t>!Ke9X1T@9<!uKXW$:Rd#hpn6q!XpYy:1d4qbn6l&cJdtyp<9l^\H%pFb$eM^QLqAHA8<wSVT4
IXFBpD *WVb\MQKpW>$DjqTqhS#RFi>LA/+56mtMY+QpKN%E14b5hW?R>hJ<9uVDKRm%Aa+IVDwi>tcFFS%*5*B
u@YP<p @4w\baM?J!Jwjb=k:tjJ#S/k/?:qXlG4EKJ1JTjZWpGWwPB^QqSK+l*4pFn*%#:EcKXX%k*JBjkG$5De
=RYQEA Neh<EEuQLp6<ydTF+t4iT^KEPGWnWt:GASnYpEYjwy*Zb+YJHhGGP4**8tBQ4*A^ED!i!aNe:i*+wtb<
ZknpT4 cJe8\pJTnNLL=k@KhLIMTKu$HI8=+$kbRIG\h$$tGKc\t\TG$bFl:Db1MDqpnKyiDpj/Gy%PV49Dpl!1
JXX*W> EbEc!EeRJWhdt?!4>K/^/mHu9X/@=n=4\B!kPCJh6EXnbt=&tVt9NtyIq\:*R!YdV5!n5>*Ak=ttC>HH
deC/:B EZ!@aFM#Q$LTFNIPbFZt%>VpNNul8TM>WKDI/mLy$h^B89SRXeZwiWwEYhYMGlielQ:6N^JX^ZF#*CyN
WG8aIK F^QBXFP@wW>w6ji@&Ray:TjJS%9y!<:wQCy4$ctX4^SPLn&bl8kTILdl<6tFFVuRNcNBFK+NC#W4B#X5
GPG5b9 HWl\AEpZqRt5S!A/npXic/6BCY#Q5J+8<I<6Ru5KyCCPyC+D/Yy$^VHy#katQ%Yl@J8<6EC%ikGyCA&!
NSS<4R m8?^uVX5:AGnKF8HR1wX8#cR$t!&iFlA*A+n@8=h%EIWMY/c$ZkFA+?4Vb&B?i<ER1#L1$#NVQdS$b$L
#F>VMH /#Yk\aM%F/BAGww<NQ<F8bl@w8X4ZulW/L1yQB89=W6MD:6Kd4BlACD6aBQ6V5at:Rw9pZRBZ9<GJ/^S
bAX*RN QP#kE6h&BQG/pEh#u4*VP+FZMNC1QHYYCjN>4j6N:K@b^\WqNDI5!i1Q9*lK?ABRqW5+SG*yb$\eRN+Z
<&:Rd# q+<&iX6GwFml4CjS\Ql1B4VN1!P/dHLGj#\LW:ApaJLl>+W1J^jk:kF5c+1TeNy%lRXB##R1b%G8auGp
ALkkLh mT>L6Z8EXHASP6>h5ZZD&+4D$6TE4BB/!mP+\lCeIIE*k=:\BllH#Phud4kW<?iSAa#lKY!tIC?Q1@XE
SQhiTj $k:*+PehRNw6n@#c54deP&*w?Wja&AI5d#L89u*K$I*YLPaID!<Kj6ShW1#A></*hD?FFD^bun^XiL#E
!Jp*CP Xc:pM6lKGQDH>*Gw+jA<c?\?#/Xw&/=cSY86</Fjc&KY$8X#Y=HECHy4%@P:@9bKF?9!G!w\q=dHKNS%
+a?R5V HLPm9mu58?^In?y*9yCWwAGSViSH\EYdiauuuj%ZMtXQ<RX$WbTR++uInkp!YlJlYntahcmK5NWeqYJG
<!e#Fd n?\y/yWe5bqd:I1VX&\pi*&^P>JN<I4CdKHQh9YN1SDVPNXqb4Jul11L65cpe4jp?XpMyqqS<jyt=MbV
=ZhyX& KYtA6#C6q$Bj<RauwlB+Re8&D8eH=i*h84HlF>*>b/eCPPaX!KFINMGjZaYy%LXhQ$ZL?y=EwwN6w9*T
SBm!4V %&p4pWC61*EJcN=Ylnjh/cLIh?GeeWdApGHuIiSci^4cm#h^Q>%?wK%Py*%+=:A=ND1>mD:&WR!<A\=&
w<TeNL IA%kTePZ<h5F?$NIp>/qI^:q4tky1YkiAGpSmJRwDIGAL/kyKS>e9ABy$c\:uYkVyQRIDjwynFNK!X5C
NqFSE< KW#h8$#=6#p\$9n96DbtEA5^\KTFcX\A/X%my*6%KqHYw*L+Ye?\uqml+QE/:#=1B9EbL6k$&PMtFEb8
@#98B: Y6ya##VcpQq^A^HGM&VX&QDjnj$!pnCD+!iq1H>FnSdm%a$JZip1Zl8nEIknZnZ&$hSEwYX61N<wMR4M
lVmlu> Ed>lhA%HM*d>6h^KMa1eBT6wy6\J?FSwb%u:HG?!u/$h1!/EwS9wL55HKI65+=>Q1&!<m/$?nCn=/ynS
WTwmW% +$L?uY>%E8n<pBIW$mR?k@X&Cye9MMy%#9R^ymZ\q<*!mRn44p%XDE!<q9L^+YRm/lPa\wZhj/WA\W\h
wb!bMk 4hCDp1Sihy4qaPC/n51%+pwc5\T#YCPLtj/!FHtypYk=>eI:!lej:ltNJ4FDIZiEm%:=n>1H$qu=E\TC
Nqh=YX H9W#Tt9p=NwCT^pq!DB:CC8:CM!l4$<K*/m^8QIFLM@hCB&q#jAH?%?WNI<tuCNdHu\*K$hIXaK#J?+c
%BP\5Z Y\P%t8F+StSkPuXDMAJPp/6JB/q56G?de9R/ec=tMN??t#cw&^FKe@AF!4EdyC%^DqibGnjD@J>\ulp#
E>jRlk T>#iPpnWAi9n*HM=SJy=GeYu+Zu4iqV9X!El%/=y&dXDDuNL+I@e>lQlpq+HML1th5?JeJ1=8cuyNFLj
Y6wZ&K JVM6n4N#>FV+*BijRiXKWXD4?*hMEpaR<wtFl@G<^L8TpkF*Z5ywalm^VBHypTXQt^p\HWTQ8h$LtPwa
q&bD@J Vm@V*LIn@\muj/D?qybM<>1c8!#BVueiJT=ppPI#>c^yIyH$it9ja!*T@i/kq!Zi46EDL@>V#5$</JTT
&$tZW: $Kq89X\a/PjIDAuhPA*H?\+/kPm\S@w>M>+XYTetBM1Fh>&<HYFa=!c!AF1AtAQyG>MV&$<!eDhM:k!S
9akw1@ /+9@=&+8Idj/paIE+w#mLD>p/t<Vu9\\F@IaiHS!#ZC=JDpJjPL*JP+cKQ@#!a/nP#q%:iEq1abn/@5J
kIEj$= B=C9@YZteuIaBNG?p?GEFF!D*<6\upJGKD*ZEq&^NNikdmw=%y4lI>/#4TmwVL$q%SLLJPp\j1h:Zmd%
ZaB&>i Zm9+?%W<c@ij%AY6yF?E^+D5aIQlZu&YSWySdkTy<AZwwmwRVudbh%?kVyV8Ima1DcK%5XQcl^>SR9d*
1CGD!j N$%C=VISyJt+!>KABBtI&5PB9DT!lQquVV8ay*mX65ENJNL$YYA%dP#FT>+K1MH?Xc4BWMTQb*@PCtl&
u9Zd<Z 9kIj#uh6>d&%IiFdP/:!cZbqA<e<bmM>*yNySpLNIlP^eJW>84LcajJET#telYCk&K8ZB%aFQ5WCLqGV
Li6k1> cHw&NpZq5XDuTu/GDPeGw5t:GPHdcjGkBekS+V8S%P?SZB^?&@c?E<WyBId$8b9$iAJAai@FN*L/?yy:
IJjwaA Li5yW:#b$wP5d>pYVuXXcB?I$%uwJY5\mAYhZcCI/FI9tEJZly1uY+=5^/qNII?J&N\QmWuPB5KAEqDZ
>:h9Ei BC+ByX#djtZT>u/FEw+c*p!bw>Qil%J6dj&M?a#B&9tdQl$NaQ666kBtQy*>FW$:n+KPu9pVtb>mWiTA
Xtit+N #=Y\u$kuHuWTRLC+BpKY*ma<M\^6pm%yyBJGyCkVcQe6!PDh*AZjdAD&Q+HW4El&w>k%LXTPM!/!y9A+
VW!b=Z H?CBltHm9CLD6pN$?%DIV#q$/\e6q$dcEq1lEyBX:*>EKblaY%:j91LW<bF9KDec@:Kjy*<5DVXXJ9FX
+*Kj?R W=+t:lj$65S=IWZ141BIAp^h%Ty/@hQA1R:QZkMj6DP@Xb/5NyQ<\GIp#ZpHjYNEnL$NK%^8NL8*<\uN
VHNE*A $:JP^uG%Nqb@V1$Nm!ubS!hM+4EWcN$qtqlyJuKhn!qIP:b>d8QTumHkFBRn\puYyNhBjti%:4$pul6F
DiW&%G h/iNlcnIpnw>p/+L5Dn:jmk5E1<<jqeuAHG@tiyRbEm\pNl!cTIG%Z<%at@G1E/%@>6tEi!<Tw&#4Y/J
ClJEbp lhHPB>w@G<pEh%ucyFuX!NXeVedc*hS+9HVmudX+KS#4mwy9l/&>!w59Q$aPtM^Y>G4T=6hX8VjT5^lI
4XiF!T %WGQADIWI$WNEpd@u49ny$=Ny&cTDNq:?\tDK?un8>1S%D:JBIa+I?4F?A>ZkAP1C^!qyBMepRLZW>8S
!iA58w HZ#AJBw!IWn:aTH8qhJdHcIVR!VIij=P>I4q/X?MdBS5%n%<y9GX5WJEMe#bW+JL5&*8Sm!==HqXpIWm
TZTD%& X&^&:EdiQVIBw/+e8=11wtpJDM?@Jn$p^RQap*!jqmdqX\L@anN=1n##8IhQW8S#4CVaSKw&kWXi$nT/
eQwB6d e14Te:58j\SZHtR!kaP9ddWadPVjcDGVLYLM<^hmLC%d:!uiWp!\qn/bBBZcXMJ1wc:Q#i46I:@T8LS%
WY9Xp9 cWZSdIlADn4bPj<6M@PpK:YVj9ZbW!\5dXu8/Q1<KbeN9b#6N=?jFt5w*@P!M%VNNa98y\H!K!4utJww
<cdl6c 8a%HhQAyMt#F44JyCGqKJEBZ&B*K&u?yKy&>EB$85uNQE&!jBl*i<:k&q:a=N6X48:ILGJ<!WNN*^&Qj
^$:PK% 8HHbZN8ThuXMMl#mQeiA\\mSRXQVPC^4ML^5$ZC$!eW/eZ?V&l&aluE14k+Jm\?ZBE^>pW$c#YG$lLY@
cSBuAZ maWK8q?%=BCY1ImijJd8F1GMuS1i@Jchde>E*:m+@8Y>j<?l$!SbnMbd5lZ\8HQKpD>u*/BF::Yi:k?t
Fl?Hu/ J?bSj&aYj$aZP?/VBpe5Ck$apR\wQYYQWF9dil@M@6RL=iq%eZWABA:V%nqTl:I8b5d4jYK&:YXGt^By
F6ZD9: iw\QHk/yC<W5N!p=FtNt!cBCcl!*$e$4RElR9/5W?GF1M+8>D&@QSGQ\L<iM9M@lL\pGk*dWiq#@pA!H
Cj1*55 ^j4k:cAIWWHmF8Xc/LLbjpil8!>$FSEbq*^J$Y1K989$\Fyt>Q>bnlmayTeWGH@$Wtn+Ym#&F#q%t^nq
*W96K! 4Rw<I94aLBaIWD?yyd!TLMY:iN\J%:I^6hLc9eiHHM^TF^EXI/lt/@\^AXGJ^:!TZcRHF6&eR/wKBN8a
i?5\&^ 9*#QAh<BJP<lE*S<SP4uW^HnRXy=n#P8m:?68iy@9$<tiH5Ql/lZ6!L8*4<#VNE!!8cClBuhmdHW^Hwu
1b6HHu @YQ<T88=+=&X&QmHkQySZVeSMX5lJy8%/@Z5wQ=&JjkZ#tyXpQaYicuE=Qb\VndcYm#5@cu@^4V\#+M+
pNqmFW l!N6:AhtnIEi9MpKM%ibDu#**4GQ?HK^EppI^eaPXK>ZLeHI^i+Z?q/IuP*y#kMK*h+pQHB=/byE*GIS
nX:Qum 4w?e8*mM!!dme1ZYpPhKPS%iwhBZRqleCQR:Z9unCVjIPZYC<n9#44u8b%R/J?+qjkER+INYYubatbAB
=GBtiq wwHeS<=^%pMW:+/a*CNki99h!5EyRi><tYPdy%kM4^DFhJLGay4w:=aZ1IWCLyqMS^*ZY#MYZT$k>Yt4
uPlw>R i8Xq$\#AB$k<eW+9$wX?KXG5\XYD#!wHR5eZJNt^8mTl#kCRa+P^+EIW@VHGHVm:aW9Q:T\6h+EmWK^p
+4mm*= cK?FVb^u=4X><bV\kYkC@J&diNEM\G^cluDKMK^q!ePS&mdql#CB=9da8dqdGtaRaN!y/t9c@:t4u%S=
&9ha\i <&WD+&@tL9QwkplFEDp&mwqkQ$qA9Z!iqTn^tbAdbC=bQ4ZmQtGE\qLj*a/+LY9#EFiFjt9/MGLBCXjN
QFJd=9 hSLQl/5IAyBcN4CEK&tpJuA\H=?C%?edJW%cybARL@Cq6$%$Xcq$LM5m?P?8Bnw/hDLt!+Su#WRpR/t>
dyAe<9 CwRFjhKuiT:lS#Jq^B#Enm$t6NcD@MBm8k%wmjkGWD\p5w/$Z1/9@klQ&#i^=B&9AhVTCD1w51dnR!Cl
6h&yL9 yLL>H>kRclMQiT6w#T9+baQKFRG@^5Nh:d?bIb:+6WMX=5d?9WMn86HRV9p1RBpuJ\Q6Nn@1+bJp!@=Q
$\eQlS 1:l8*6VXB9PHEt\!?Ju%e!5AFyC+GE>t^njD6KB45&ZDFIWd9tIpT^p8N8*LTSc#B<L>8Kc<yGd#+l#c
D\L&X= Rcj5nyP\\KCBE<tFe:8p9Hk#CJ6H11JW%w8@pMdRcDPjZM=iAVR*G:LG/=CpVIW5/yM5wda$VWmRTSLX
-A#@TL 000c806f503001202b4 Page 372 of binaries2.zip
FS6*FS %eQ4mdWSN\+Rl%lNp1wVJCq:EpXT?6ME%4&?N4^Lk=kjPmmtmW:yFGD*Z6h?/<1?yS^a6Z@!iM!qqjqJ
%l=QD? pQCDdd98=$IKFaKi#HnMh:IRjA&*><Qqu?+hIaDyl\iYj#LV98GmJBIh?Q8hj6=\*Vj65!=SG&&1D#9A
%88>$1 ^VRCG:kE#EpcBT<?y/Z5QVI6Y9Vq*MnABw5DX4i1WXcHB+/=a4YXEd<:ta5B9cJy@WCJ&XQJ!/i/%:9?
tW*5XD IKJZ&PVw4m*J@tXB1YWX*ib:<L\4pAkdylFq?Y4tXuBGk/AICu:^&^QCc%m\YE!JSd#qCER6H+y?c>6i
%DEVM+ NBdA$<6bZ4hKyc/Bttm$VtM==!@Q+WuVDT#1E9*>S>FiDDm4Tq1n6#Zhp@HF$IIy1d=jFQ:^menq/R<F
ZaK9&W /ZEBiT:cCY>t5tQZ4bHIaFBjAA%CFEhb^QXn*%LLZZ=%p%%KC5GpRIGM&l%c1I64i=1#&*JX$RyYX1W\
4YZ#Me JSi8G6ALi?c#/#$Atb@qudX8lmtMt<NSuFhtPI5V8iliV>iK=mpV1XRD^$DD:=tGW%VuQ4G^Ib9XPp=a
/:m8uA ZQinSMjF@St&jdRMKbi9jq=>Mn+K:&>!BXiRdSKq/lpLDXQc<JQp9&:baGWXNy:NiJ\F*FhH#N>6><**
SwyGWB %unlN4J?8w=QWMBAw9FEl$5F>Ka>#R#l&tKeS#@wAeRM9^@emaLjaaJ/=Wp%cPcp9#<VFt%=PLJ>Qe$Z
wXtuW* LJqB:kN8j>Hh@w\tACwXiBL\mW%8K9pk\E1T*ecmC@HG4eadRbpeA*lnHcSi%Ll*5jEy+QjyTT^iMbK<
Dq69b\ d86ZBH6?d<!5ky^TSF@X4>VKuXi/BY84QNK?$#DHm$h$PaTMe#lDJ@CVGStK=8t4>Piu4/:8c%ZhdqA!
q*bTXp V5PTQ$!H6:S=CS54cX<dcF6JtLY?DXPi*%ap\E=djT\6<!XZEQ%>\P$%&+p=qh>T@Q9+FM=cw!N5Y:yN
R>8E+p F<ZIH$PQSu@I<X&S*Ni\t1b6@XEyeH/?!8d\hNQJ5a&=AA$M1GM%9l+4I#w#CZ1tmwEmLXb/e?MX&9&Z
5ybkWe +5=IbSC5I6TkJ$ZMiR&B4yD1/JJnhC$M8T1SyuNBE^bJeu1KH$GEJ81Ia%6Kd\pCAjRWpkM4FkWpCjPE
1@yGTS ep?qw+@6hatQ&9P:mw@iF*#15HyeKR+ceJ^T!qdjM/qR$>B+qTK6p>\=cJHAiYVNyN8YRY6=D!K>eZWE
n//WXp l\>*51#iY:H^Db48<N6@LMElCqX!bQn%951<#kBmie:*e^Sb8!ySed>&FAIkM:mXqdyBjkiJZt/h*4w4
K#Xkwh eIXXeCW!jjwL\bj66&hA5itb<j>4mZFkmcty1auJ1bqJXY+B#M#jA1Q5T%W=EKT^YGPADyu9/RI9L:b4
NDN\69 u#w\YNKLu%md:/wi*=XqlKdWJFEQ>K+=CA^4%+VV\9S>ntD^Iy<5YCemqVG*d#eM6&IpJcYqJTWqphLm
SVaTZ> $6LTpkn^/eu@pbmbup#A\pLBLKlycKuJcTuIcYkk/CMw%pw:cM:hdP/D@@lX6$/S!!Y*MXAic>KblP&G
:*%q4b yeEM*SS^=XhwAdt5F9njyjI!lb=ej8/H@ITa:YE$k%kCjq6L4chHF5hL1^kp8tRNQFAJ6aTNGXuJYb@u
J%VdM$ MTH!p^/<P+Bw<ha89F/cL?WGk^^<wY!QjwITdaTeAGRl6qT8TdV5Y?lk?a#yEq9YQed1\pPbXuiV^RX<
BX4!mB bV:Vca/X&jjiZaBctt+>tK%+eCBj/69<HuJmS1N?q8LT5XCK4nb\SBquaJqP@q5^jIpPcDejS@lCXW=9
eXhF&% /pj*RdSbq$&G1>keqhL%4?wQFKek+pq4^!6btu<+k^E>\qHC+hcF/&R:9?KL?a=ppA!##E1cNNKEe5S$
+1Ii>< 9tiRJ9LYAtPh4mD#5Ba&RVRm=hY\\8>1>PL/iqw@\jRH:WZ?unD%!9p$M6RkE98yT9&4QQ#MLjt+<q&V
QXclb5 e%H&N5QHVQlt%<Pe!*iQiW#=DEXyK\upT9SVFp\\i^A:Xh:cklE/t1HY</4WZ$>Nw<9X?AI#1w:DtBm/
!4XV$Q 45I48bc+Q9*ylaZ:S9&Jckc\=:jISDnQETPl=LBpti*=h?wK?QFV<aB\MiJNIb8\TbtV?$cQPtukwA?4
hFcDA\ NFYmwkGZDR<C&FKRFweF#hS#d/A9y1FSlLK8/S\WF565wZ^86kj:SK?>?JbmPiT%VHDE9hHcy:TLQGQZ
iWH4i? 1mBDCXYnb/$9^!y<EbTlbNBC/\%YF%#IiN?&6LVqY<mS1&9mn6!LIe%Kl5?qa5QC1#lbqNuG4cj1dPEQ
5*\/FH Z?dD%Kae1%eDPXGEj1>nW&QQ&#1Z8K*@S/yQ!j\Z4Y99<iFI#*B&quQ<qMju%6LQ*8^jZL<+d!&=$=E4
:W9IT^ :A4iem=9u<ZH*+WJC?KH<P4Ebwq%8a/F/IIt!IWnLAV*hD:t56%Ftq\=?IiWwdnaDKblEadTP&YeL%qV
%<p#Bw dZ1M<jc*LX<T@^GI5ELiQ#uB9F>n15>Ql*bHD%M&N>LIBupnDTbwtZ^@n=\j4Ru4Pq#QuDmtTWd>dy@6
:A/*iE L?4L/*E4>h=5C5B+/8c9tFiFL:YY/d%Y*8q/%8jbZPIN1+1W^yE5Th59N/:LJX1ne95EZ+XEMLGb*a6I
PFa*LN yLGiF4yWH46eNqH#MlCqdt$nJ$6P\bC//WbwEelR&%qHRLkL:e5wHESj%:QM:4ni1eDV*cSdc^aEB/\C
\D<\?S ^jW!iV4#nB\dY^I@4kH&pXm^N/ReW:9Qb\:Md&dLle1Sqk<:dp9G5/X%V#DY**hH@l>XBEeEME^/1S*F
^pepKI ^JTp:jQ4aw:qDEuuFGKkiWC8k>8CMWQcmy4FJQlK8RtI8JVZ1PW!5V$+@AlnyaK^\^JnIL8^?c6Lj1F&
+KpQ^G :cWctYKGwX\KLn18ad1u&8T4p<@*:*SJ#8NmqMwecTSiMcW:Q5NP5NT?uBCSJZAXtI#V$pudykp?::%<
S>Qp<Y m&h<$yRXjPj+j^?Va>V?S#qpDNn\IpB&F=>RiE&C*XIhIRwkGmJ??RWqJYttkt8<Sj^PZlW/hnc9WB<&
lHhWFd ^ZSX$A5HWB=<iKBn=<^Vhy+HHMKNWRbKdyPFKbSCn=bhV&k?1y6\TX1L/BV^5%<mS5\jy@L5SBme!R\c
:/py9a qn1c=QEEV#/au?9P<=8@X/ak8J/6Cyl^Nm@!#>VH\MP?Jw&?X%6:4!!Nq/n<F8t=CN?58L1bHF>d/lJQ
*Id+eF 8<P9c5<p!6S!tEHGJqy#MAdV5FQp=C@wAB:hVm%$5D&1R%pPcnw/MN@4RBeVcF?SEb*^9tIpHk*q/qqK
u@XEu% bC?9L#%jQ=+Tt5S@6IQBTEaD9@mEM?EXKPVPuyqYQDCdWYjCctn+^Byb>/p$RG1wND%^$lb9db*Jip&?
y*N1$q &Y1d>DWdtRkNY5EbuG4>Pbne9n&C^1^$jE:*Mc6e++WKjYw\nyjFLiZGj6%>5EAuuGtuVCSJBIb%QW8i
:PRVdE mpeaD?FZ=cdeBj9Z^B6Sw=YWL<RmZ%WMwC+==G^Z\8k$j@5>\cVw$=p?$<8kD#H$iNmhib$:lHt?SZBI
8STY1: l*bFQ!G<duj9StVNkT@pm>bTbnNP8hNZ&6:Z6Hc%LKy>6G\j>y4V#l>#8ZFJHVCqYBpA4cKJWP:EK:yq
6u?HA$ k%q1FdXGX6Leeu6&\wEcB+E9n<G8Puc=$di!pGhVh$X^6DNiL#QlVR@iqy/EeX8MSllhZ?tcAT<qIp=e
9/HpKQ p<4Q9QIRSVn:FK=hQl%6V$EwWd>6H?Kq+\Yj*Sb#&?%%FpdSqX99Q$+XLGtl8S^b=>4Td5ldb<Zw9ytQ
!hh9y+ 4lByj=jD8GP9h<WpDbyj11euMi!u6F5*jE6&kZ=LTKktmj@aZb@*p8e?cAi95FLhcJ9tw=\tT<@q^KDW
klyMqj \nn:4!jA%c+@595QJ81hPd&Y=IyuVAyP>Y=w*/<apQIJ>QjycPdRwudu+X==enlJuuVbLG:%W4QN5Yhb
Z<EF@Z 1^dSdQjeKCJp!ya\>6#K*$!9%6\ykLDATC?^Ia&Dh*Tyd9@6!n%MEJ#F:RV+LaY$8W:h^%lhF^ii>QkN
ha=*5M jl>4pKtMH^4jWq=ANX:l\#kSu/MeDd9#YZGjLGK^HikS+>Ge#:jC5@J/WpMnNSJ8=Nq%j8p:wWEqeH1/
:EbL*h wwb1Fa\P#^%\mwRp8d^/=SatAX&yeE*A@l=lhI8%#*?hk$e+jZHeKR%CyiH=J8FFkmM$kL8kNtD>NE\W
ty+8CD 1LG:bG!#MP&pd*MQWll=5*Yqkc?RTc9L^K!ZPjPw>XJCJJ%Q*Z>6XA%dB>h!^8ujDS$iujaI&DYkVH/#
W<*!W: =6IbK5l9Xh6C%FAb+lY$QS$NeM:buR#SHj=CjGycpE\C*Q$iMK=hQkE=V&aA89i>mw*d%eb*H//C/ISP
puk4PN +bYLh\$jbRhtu6M6+TkX^MwXi4R#iKami#q$ck9ntyDZ$4*Gtuw6THCB$uLVj9ANQ$ViF8@>ntAMYF56
BTJR%K $b6hn?RGVj<dwH*8!5iIn>K\y1qN*QP4jmu:GY^h4VLG$4H^=t&R1ZNHWETkiy5%q*XcjPW<n^CbP@=W
GF$LQi FZj*L9RNitWb4>pyuyB5J8BN/Id8/AlyP^KwiWY4Qb/ud&$>XQ&%\aG!F6Q6EGC!@RkWHVB!TAjp:HI?
>i=6ke ?EiiN!C18w*5m<u^dwL+&cX%uSu\1u@JWkCw?^ZdyWN5c\j^8QHadKlcddtHRw=GTDy$9Y*DFiI/=MQd
t@E!Z9 Enw@NZ$BRJ/?95j:iZGRHY9kp%uthJWJ&N1tPw\nQ6q?J!GM8ak^IP#BRB6yblLtX^KRM!5dIu^*<nKj
i6iF?i J>G/I/nC?QSX^FnHIiMPIGZ5QADEaDnQEGBPu9RF+HT?P*V%6CWmemw4un65pT99YhXmjF>eReYPcb!%
qXR<!6 bEaZCj\>:^=!mY\b*Ry!%yIjwG9:HD\a4w\djtpy!qY4Ah$9\VScuI=p4jlBVXFt/Rd$TC+Zm^bP5+Y/
15J+KT L%p?i&n#IS%9!qH^+EPT6c&<B8cc#i\1P+B+>aw*L:HFajud*kh*#QLW\bXtN5V45hDKXZRRCya!$tM$
1Q@1nM dE%<H4nRhN=XMT=%9k$p5hc$dC&jBLnI9w4^dRbue=jk8I&$PTqJP<A#ZPnXcc\c/B\<kb<M=XlaDqFe
lSWB#A /ZweGpj^:PqmIpQ\IDQIyMXt\5E#QKq>Fq<Rp\nNCF%abFXC:PaTanB\lk#k%>GVNhFJdacciT&X1y$+
M<<nAD C$6$==Z+PXJAyHY$h+hhHSaXBL4a+nRcX9Tw?e!?DZh*A@&yitm9Hn9ujK&$L@VNZepS1l:y\m1Y19/W
:8KcbT P$Kt:W$G\EBt/mM!RQhIVZ^W&I*e!^S%+EbeiSk<qPn^hRTR%VJ@%He</D6^T8B&#CwLQ$E1^^nidIe:
Rm8&E+ Byhbn+T#Qee/F<R+q=T8C$Qn&GtnpW/bT\H%t%5XDVwhQkEbFIJBuR&^Ek5y?=8PC+Y\P<RMwQyEPZZB
IXPPZe EKSiDKI@y%8VlEWy^de5RDj#nhqb4<dMhF!q=6jJh!aLWYiKLlPnj<4Q\CXRB:DTZIb:LcAt4YR:w?^p
5:k@?i >wMy+*^=ukG5$E>TEAD/t/@=uC%tC=NKnj1PN1=h9ahNP/F?FKI$apl#NKyW?KA#9h9GDhI&eNyG?$Q>
?A&ZZm /?4$y^uu94=dkmKmqT+TuF!luEKw!64=G^Q^8Lwu@pH/:wC!#BLd!tbt6T8JwIMdjDtJ>EP$GEHRejQJ
QpGNjq &:A*P1\n&q$+:CGXk^XB^<Q>pcu$\y^:\9/>jw#KLC%4jP%SZe^:<9Hm:A=u#eE?q+dbWIuCIpAl@YB8
!L^q4p XT$&dK?5a>qpHY$B5aE\KCY@++iL#1=K*#IE^jAt/wAe?NZDAYkZI4Xpa\RB$1PFuRe&?y5S=BTBD54C
!A*&Qe RpD\V>I<iaGmWEu+9?wnAkqjQAEwEbTEFEyTAmW=NnE#EX>S9EBCMHGEtKTaGAIyNbpAQ\\etql&dcVP
-AbXI4 000d4344d9b001202b4 Page 373 of binaries2.zip
q1a>5Y &\14q!F!C/QF^96M=w=>^CdXKdT6>JX=hhQPe<9Gj<uIC:Cl!Y8h4cF?w/FJC#&HRqK%!T#1APmBZRJj
+qi+H5 $!++\KIZ4j8QcG=>@1:@A<9ltdqElpJJlwY=!E1T6ZqJThK=NDQV^&6=1@T#JW9JNm6Hy9Y@=HYp!iP>
qyhn%C Hb61cjRF1B>98wj@B^GRc<&Dijk8#l#16a?YVS#QkN?M9?RN$a5pnldSC&miuCmPFuWA=y+NnG!@+I#:
98kKui L5=NnE5GSJ5IYliM>e:jLVNQk^\ejEAeNDLE4a%hnE8/Q+6A^#awRRDBLe:ALkmmLh/L\PCN4*Ew^K&D
?&dwhQ @?BNnE5LLZ\A6MAGYkDtuw\HtE9/LuDw*aEI$BVI^NM45@diB9TtJ\T$+L>p4$8M=y/%L+8kd\SJHPAX
B66w:V tCkB*kqcm*q/kj@pVZL1<jH/d?:8KFYMV@e/!9H?>qnn/XDMmX5T6QRhnB=/bMCnF\utEjQ\c91uNG\4
\=TN+? LwSCW<pTL/QkI%Pl$1clwcKl+1YmNLT%T1QKJuQthLXK5/b*4G<6XVT5/>R>aa!GN!tQpMeMklhJwNAY
DB51VF m^c/Q/IZkeu?kc&jPqEe6iDpnq9P%9@q>?!:NSb#\J&@iR@T&QBhwQAh6QAe*X?VNy+PjXCCGHyjPF@V
N\iZc@ L1Tm:YZ<=!#N+@ahHtkik9wy\T\AHa\MMJiS\Z/eP&wjHjSR\D#?\j+iYy#/A<$>Z8MMwBqwkTDADPal
%1h=TQ PZAPCjya\A\d%*h5yP%+8\5?wR^QTAbY4tJ>T?u@G!TXq!RZa:SWc8c*nE!Zd:$*^%Rd%m<?i9pD5ea!
^luK^l V8=PE8dc#^&9%mw5JuJJD$4*t<aM#QcjuPQy&CWIpP$%mhF/pRS!Tam^dPP6m1FFkZtGCemb6ZYA=6kG
bjlSKd ahpGRZNyaTSBY:n@y/?HG?=i#LhM9CV=:^nt=eW\JSp1Tb!aF8d=K^t+=mLX@%bh1Zb61GkV5wqybd&\
#uPF5B mau^!NXV?GVt&e/1i?j^QNa+bkZt#y>Dl$&IK5c%@W?%kBGI\atC>5E!R=L@6>K:PHHRN4eiBQcByejj
Gmi+:+ $=9<F^/VLC9#=#h<GZZ:G^:VYy$8?ANN*e&Q&T$*S=:%4M<#y>Z@Rq?TpTG*?8>V5JcEqK=ctFtcXLi\
dX$K!: ej::F#8YLc&5Xi1Z1#a!MVKbbZ&DaX%^m*+<HMAy*I%Zh#\?D?!\dLDP<YdJnHSI1TK=hQ:@SR##=E&e
H4ejpq KIE@t\l/1AmQHN#C+!Y*Ci@Qq?<KQQ#D*hHC@kq<Ji>nCS5:8lq$8c9@&Vw/buRqd&%yw&BW*tSnE%IJ
D$IIWZ ><Jc*mL/R:*CcyqHClk$KyLN:9+Kam^Y/ueQ+G:4C@yjHMly/^/t*p**e^p@@&*R^l88Dkj8:qPynq?G
Bc:TKR iT>H>ldVj!uHljtP$S@T*:*@u@JDI<Dwk#lBT<>F:tG$$j/VXIB=Q%N\wkVRp4<tjbAkVJA55Fm8*^eh
ZaWHb4 LKiTdQInT%uC?td?4T54D>\Q*Gu#@QN8pXQD*4dd8T<Z#qhHZ9@jIkSB8#i<H=&jHdD$6=#i6h?!HNAD
94Z15j &%m\#H&Ai#LtERRnQLI#>H<iCYBpd:Cw+AD*jy4k@=INLDuAGm\bS8cSBkQ$NqlTHG$R6An4:J9^&&tJ
a%WCE\ :Ba<a91XDcdJqm^<ykN+1Qpmd>NddC+6aQ=:+Gi5@>Q%uut8@?Z1h<A5AnTZV8tL>?qC1iDnET5Hq6L=
Nl>/^w wb#4&4tk+yGQ/iRSdEcyLGL>R1ml!cc9@i=8y>KZC!?m+9%=N@<ZjQmd!+5:LtL>Nc?k/i^aVM@nc8G9
FJ+^!I ICw$AGBWJA@wI#9YJQjR#q@n<F*mQ>Z&t&iFbiQ4!6Q>y*Dp@$/ea:Tw@Dqp@#upaBlbBBwMeiE>yi<?
<w8aXC mijq?>N6H@b*HQmG?c@@6?PYE?1wYM#C+ha!/qm@6ZT##Np5e>*/n+46c:e*uNp^#=k6Jdpt:=chF8a9
5De8V6 ?PG%R>j@JkAAj>:=#mBewAZ=#8DhAAC=Jd8yAQN+RJD+AAAAGjFJd8dtwtc8LCJM#Nehe$!FmT1#K=^W
ctZN>? J4!=BDYWmR$%NDY51\mBa#X5IjMmLIYbC#Kt^Ni$chCjCSWGd9MqPdG=QBqWQT9TM<66J8tRME>>bGJT
K?e6FK :$P:>P@d9FEncb@T^5!&#hu415*b4&ydXIjL$JWG%S5HFqn%1#GLDRa%YC>Gj\FFwmMej9jM=55%16kE
N!qW#w 9c>Dy5\:Eb+IP/E:LFN8wp5ct!l4h<=4a<^4SZe!tYVNG&8k4Pd/T&bZqNdZHVLbVt%1/AXB9u+FkctD
\yNcTW 8VnA/=F:JQZ:+alc=^XH1/WkYJpKmb!a9iNbaYan6DIn=5YT@wyS$i=uJ=&F%$eSh^cZ<h\&ta==6=M^
A\dS9d kbBQFVST@DhWF@<nPIS88iiIFENe6Am>Qn:Gc<tAAI9b:q>>QP^dR=*uNVG\VD\*mt*R^H/S/JLi/jP1
wQZWlp N!!4>YbFp@BmF5dTSYMueyyILqTMel4N=Xuk\5k9#@@BC%EYTJFL+SiT<>*6KmX#!9Z$+e^c#hK!K$c@
J9qL/9 q<1kq*k&J:dWT6RK81ihk?S$iiPepH/&5p&WJ!qIcV?AY4dT^:Ky$Fb9%X^pF/htIX4LX45aR!jltt\%
F&EW9V uuqDiiS+\+d#::6L89YcLVhIByKb^Hd^u5j%i#+*\R:+:9@a&h*b9RP$#e*b1d$^bq6+yDcDYk<C%p\W
J9YF&? PS>tX=>6y?HZ?1Ql6@pQVjy6Dt?lVRb\>Vt&Z@Z^h$uyH\@c9R<n49@k*AhP\lY6@#!&B:B59GI8RW4Y
?k!qAL IbdWyLDwB!kyA\BK#RbAS\m>1?R!p#D9M6%T94NcR\lNJY<QbndjPKbjKLKw:wC!/qA8daP86H49KS%a
mFFFL\ Yi4dK%&Ym4T^B!lh/PPNBS@q>j:Wu5ka*Qelk5q=jW8%=@*@!ZtV9TPI6BDSEp$%SMGSc=mP6bY%+jKa
VA6GK+ tny#t!tM?ek/jWQ=B5&<TXGt@!pC\A1FAeniudYVB5midGEiJFhl!5\W4T^laa=yudY$\GI&Z!nycYGP
TH@$W! &V&YXS6Ne?LR^>LcQkt&ca^l1S^Y$tFbW6?$Cq^S$86b$n=1#h!c6/ly=e&e9m&hml9^<1#E%kG&cKy@
GG<D5a ahX^uZpd8a!@nL?d>>G%G\KjYmFeIR!NM1J4u:y!K6+Qu<JECWXn5<%^MT^9/9dQbG?ta/ajbG?&S>?A
Ad^dSy N<u!G98P5#iH=StR4*<DFX#cb6Mcc$iKqQ+\#AITt5=ED<*Vu8>t*aE^Z!it*yG&Sn?%LYX8\i^M*^1p
F*XXE5 /E^jy@l5CN@%mDuLaapy:YleaXun?b<htmt984T\+6nIyCW>4@9b5Dw6qe46wt#IJG>+p%adWn>SDG+:
Y+$Eb\ aGyRQ>F&^uQKe=yBt?PR+#AMSk^Ikmajph:!NL$Z4:AYGVPclA^Mj:T$X9!&A5h^pXmh=?Vat4CSaMdX
:jw?P* dRP&\8d*mRD1InuKc5Tm6*!VEjah@VGb@RYjRFppd$!<W=8WP54Y/ST6+G>H:=&@mLPlZyXtkaNW4eE!
$AN!db C>5<bjda:*ty%YL:GNby5\q5/Ldd$clemebk##GWX#19Fc*I&G\91XDW8:Ae<pEtDCuML^Gy8qE$YRVI
GbFqHj bKIqd#V@q5+8KY?\CTWFRC@a4p8c6>uEi9&PVTbq5/J\RiGE\J+LPhi!tmX:5a6yL>DSDVaYYdG6>tF>
#i%8dw yuTl&+R48:\l@Gm?e>eEcPBTQ#dcS1JwTe\LeNjaEF9$XqpR!XFyTYB:4:et58&P:udWFMhpQQ@Z>SZ?
=#!N\I =\Xh%lLHe4Nl!ZTSMZ>+ZqNl@y<%wJW&VX:WZ*=c#^8YDyeFL>J1Pe!\it&S8VhNHnXGJW8WSih<RhaE
\@I<j@ 4\=cGdD<&=4pjeXS&Kuk\eWKTL+%8wFut*en?+cNhJ%djR*$CZDFI$/PThh#9WQ>N61%K?PmBACjwRQT
E/=mM& c/Rn#@9ZV@$@ipV<a8MXi+Tb/^nc!1iYlSRa$M6Da:DHmH!8LVcnqwZW1NZKR/i9$5yDh$YYhGjadXl!
4Wuml4 KtTm?c?YlSTlLJyE\LLaV:P++PpWwLpW*/b9bHLC18wW/BV$AQ+HHiu8!4H#P!=XW5+n%M#t%8j@<X$N
bK\TAJ /b$BB1lu1:TY6?Zy?8pHe#R*Mn*bMYNEEYY^ibI:*w</IA$wqVDY1D&MP=H*ai<RF?ZT6t5NKGTHyA+W
?1uj@V 8p6eD$w*Sk<KP/GaDlTc@61Q\twS*+@T#h!QQmh$9k+$?4mXt:#in$c>SdJIH6WFTP*P!I*yAhhJj\^\
lu6tLS hwQ48V4RdV6/5mQ\jcHtQT*G<G@aVeJbTh\qXj4wSiQl&KJ8%>G?LT:5@\lTuC#ZC*lTHD?9yJ@4^atT
m6*/5# &+NV!q??AMB5eGq\<ajlB?Qenp%tJZN^RS?/9BSEZXpe6T!5HP/KJhPmRyhC*4dimG&aPl8Y:DJqZ:@p
Xt91Wi BZ&/e%n&ln/&NjZc5n^hcy%%KLD*q!:jeudJXCkb4F/MPW1w>>m$\ya^^X9T8@&$e9!uWaL>CC<VXNHK
uAaum^ pTbV=Fu$e!VV@uk=\*iH6&4F@NL#RHbQ549$?SjYH#iCBDZ5duShB+6<q@Ce?m$W/X+1yLVBhk5=\1eD
QuBI*i e#AHI^WZqRZ@M9>=VmQ6&dhi?AT>euV#TbSdl+e?!*l$?CKF8SAZ\TEk%p=$WG5$lWu/%V#q#<nP^5VA
NDVLDk imX/^CAAL6QGcPMPqqSRFp#Pq6WT8PQR=NJNcG+CFERSy%Y=iN=/qmPij%CQFn$/GCSHF6JNe9ib5*9G
dh\Qqc yP!EpmabZC/AhkkX!H>=d/?K=DkIB9pbYE<!MMmbVmNq8N<BMbD%*E$AA@ZbX!tjBJbNhDAbZB<MXIRB
nN@=$! Tq*%SV+FPn*+QhNW\G?P^XJVd+\CBR9lmAJ^\&!G$SG^=dp=cwT@ihWhW=TBGWMZqD=6ilK1pDXADH6n
HBuu9A dWaCTnYPJV4AV$henMLPBC*@\i5@eKX9mFWepQtDMQMWVV6aDFm>@\DFKLiJmCTQQ<kykRIqY%&aFkJe
SwX>a: Q<uBW@HpIRWuqN$uKeX5L<<T*V^89p6KlEQ/5BS:9ABGW6Y=Hp55u!?kCScPaX6ZSqB9^k+tEQ!FwL1A
p48HS9 neKD6CRJc&=DM!/HuEDQ<84ei5YS8EPK!bcIaERjQeM$Jni#LEcnFIk&=Ylpi/<Xw=NDVE4DW48n/RS^
:^m$/6 9d4\^t>E5+S?QMm%q+Ve9BcDjtVL$n^#<pP#SMEp96qnk*yu*aG?:ST=>=+%KC/Q#mdV=Z*jwwlW8YL<
bX#R<u <n$?Q?Ytdpdj95+X?cLqimXD9#MkqGP>eB5qRt^\\D>/Hc45K:kLl>=Tie1YWTZ/yQJKJD\<j<WlDA1p
RN:5wJ I+W6QTBq8<q61?ZP\LG+QpY>4kG1S1i6:NZ@5PWXJaq^unycS1@\96J:!WWRT*!pCTk%!tV46b&A6@?5
n>WtCV Jjn\kD/Db\iP=EcKa5AqT*/9>:mL6CDl!CcIAmNEQnW6/1PHY5Tn:ey@>&Rn=L<ED16/b*G+bt$nFk5M
+cdhFM d:L#YN9/RYj&j1W?a8lbZw=1FiB9X!jCk9?I^qIRNJam#SnbWddPKDRkFwM8ZEj@PYQLiiRtA+9::uXE
D\?#DP qd$C5$GWeRMKXJI^C<yJyQpEB^Zu+=@QBGbCt+:whRwK&NHHu@a:A*hq#^cHmh/8=J+&$\$4LX1?m4:1
Fp6/d$ ucdZPMB6RI!TNVJ+kjM\#VL?Heik4AiYLmpPR>AJYG!Ci+\G>ePTu<@N%&:=qX1%F!nDI>cY=F/<:G:w
kNW1PN dXwLtCYY@a\ISGIZy%BQ*G<BQSP=yE9D9EISd^t>uLp9W5qLSjnet:4DeMWFGaBbaq^9JXBRcSDd@A1W
%DIW:t dQ1K^C*CGk9:SLY9AI&pdkq:k:>Gm#^1md@9HH$6C!?&Hk8qFp$Gy9DJtHQWSVmEZMe^**\p8FJ9GYBX
-AdT:@ 0003d343f70001202b4 Page 374 of binaries2.zip
HQ#9JP F?6REa?HjC1I//W6<!A@l&MTPFb+1e>/\@\RJq\wq<c\#Y\\9T+XJP??HTki\>?P+Em$TbhMDTTP:iFH
1G*ySI pwbBwZBXC$kK:H=eM1Vw%TlAVHQpRd<E&Jk=qaGNXeFGhDLe:V9%R!\wBk+=iSRZ:<RT!=FTSa5lVSN1
1MVKNM t*EbjiLRB98+1JlJ=wTYKH!jP$bhT@/KadHnSbD@^I6dIeFyB^@eDle\e!*<Xqm41mSu:*RT&bl?\DK#
QMN%IH 9GB$N^Atpl196BNRGJRAtELy1u6BRR&6QF1^MBZPYaYPbCl!$L/h*Y<h9ePMIHKR#Wad56!WGY:4EH$V
\hN%w$ WeTG*!G4=by69WJXq?1mpP\F\m\49<=I/Tq8kYVk*VCAYTuimK6ByEIy^wCWhMt@ilmSV9ReVEG@Tyq/
8ZACaC SeZNI#ydK:Mpda9#\&BW=$Hj9LL8kT=5:5YA%mhBtL<DcHFZ6!wT5WEp\4da#ykZGiPNFRa4IJCTc#>B
Q<Spne &FSHF46NSHCy%Z<!S??!BpB>$la8EhC+@91hPqSSItYG%MiI+Fm$VR*pC%@kDX#twE@%XNSYBa1?+8d>
e%<?WS eQPX#Y4Fmc:lqTbi:JQZXAG!9Wcw4Va6#&GqYD:D<5TNR#aNb+uC1aHdNEad$/tS<tVyKFlpc$Z=8T%!
X815bw Id\%ph#c8@?C4tt/R>j:99>ii9mwAuacL1Z&c:MG6Yp>:WE%SC=yhZLNCPQM9VWYZMh!6>DYq%+TLP$&
B!uAN\ DZMV$T*hBHBBTm4CX/>\4@M8jD&iVeS>wCmj!D@d4+ilE$*$@R^DEEipZ@HDhBXhbnq<Z$:a#KWL$/%W
5\jNAG VQ1J%qkmpwdwiTZYFIbN?GwHLeeWBEQ>B\kWGn^tLFRjNGd/NYbB@cWYuhQ9+TGYt?=CLiewuH=l!6+9
qV!IB: y95+l!$P%5S?&>$!p%6CGnqtNYJ#46+?qnZeW%JcKVju=BES^XEXb^G/FcSc^LAYGnLLGiNB?MHwj4\N
VFe!:8 %!TB1#+KDXh&uGt\JCZ:^PK%=Hp%CbmTwy4hCR$C4a>MYRQaTX?K5A$6R?*e^KlqWjF6uCdLTFjFAFy?
/CYk=A 9a+ipaJ1/QWe#>^&/TF^mjynanXljTTelkC5qLY%*Q6ZCn#c8j@+%eyFcGSXYhE/^HWKqktF!6?=%9\c
$E\*FH \%FcF<BnM?dSii%R8Vqd^E4+M=WVaGP:chqFIbqE&ZBuTYF?ASk@^jdcVa:<$\Ai+tuRmbF/:VVtdEQ?
m1J5yC awK!tDuXmCM#$j?QnMR/^?QTnR^@\T^yJVlM@pPYEk1k5y!YV$ib=SaW8cPyw$Z=hMmK^e6n5*CCPS=B
$F$DI^ F5/weNb/uVmCc%K=WNByhI@X<6?8C^c:S<QmYk$N5%qnwyAlQNqAbS1L$Y#+A4Eciak&Xat:&IKGy\WX
Z=!J5M LEIKEZuD1y\m&+=NPSF>wk*#mdKmlT&cyTe5R+!cn6h%Ln\Pm1/uI4i/5WA\b:Hyn5HhYl&#d8AIKh14
Q8!5qS Hh!SNDh5=%dnbb%?*Xb:$BqDk8ey^\%/TIZF8!W1L9$?y9jGL5emHuT>qi\dTe^BP:SCMSPdB^Mti8FK
HIIij# n<yZKhEwdpQX%Jk4>^Fd1AFD?bQ?t#e*Xmt/$n>ayhwu$1k6Yh:nZ=Q9$5NKJ!p$N4FNw%KpQ=L5^#u/
X/8NW! YdutCd4*:#u#1*^4p#Bhe=HDF!D9LYqLbXI\=uGpV:6R4blZCRV8D:9#9Tp<RHL6?d4N>LuJ/n4nncHP
mZhyCY QjnH=iLTdH5k>#u8=9$D$L9uePLY$<FMp8u!&8qcV&LbT@=c=yub?DN%1iHw?DNnY=BBN6J\G\lnN=Q9
j<aQC= H8u6wVNK@#JKtH^NTBn6IhQNwD6&HwqZdu%h1cJCN9>TKJN46qCM:!J=qlHGQnIAWBlyj9JA:#Bh%?Hl
S1WQ!@ nLBdd4Mc1PqnnhyFq#NZD*N<\*q>?=qh\?F+8Cw#BKNX%15pWLu66cy=K@4EPk4Xa1wDYK4VT!9*9jJ/
%HjteM $PJ<5d5kII491*#V1*5BGGJVHtI#mPlT+eJbDiy/+h4Wa9^GQ!8MJtnFRH*FECJSE*+:?KulJ9@1V8B6
D>BIH: Kj%IH\ZK?SEKVK6EX*nnFmLq+KD$AIhG6%Dl#1q^N8FB6nHd>%BhT#L?4ey9D1Hqt?IEaNlm*a6$R>D:
*n>ci9 l1q<i/MyQFJJc&4LylAbLMS!!paeMGnFG#AS@QDARCV!jwbTeRyyGew#qKwXqK5>hFPplcB6%tNLe&N>
S?8hu< \%DbNPBAl<9AyEdm<u$F!NLCH\A6yH9HVLNGWABZ#u5IpW6QXlFBd1Q1QYQVq\bZHiA^<9Mk<tB@:^q$
ik/tCY pqI?E4NaMYlFcj^RYQ<qmuE$ZRDL\THlj1QcXbAwhMeS/uDN@eNK%n6cecRpuKk1WyQ!<9B>dpe>9FJ!
^46?Ey H4yD>W9?T=qYbW4V9jA*uJn9/5u5wWl>?:4!VcN1<XnCSwnGA<hlF4H8+KHek$q^:!HZA!XCw:Fia=y!
m*nZ#R u*wmBn9Q@ek8?56Ta!WeIKn/eKkyQES4nauKey9=>VEPyppGeCZKQhnmGQQNb5wK?tADKtB*WdyD?bD+
P1%M/J he6QT#B&#hQm+\WKV1emMNDmIyN1WIB$%kdTNJN>6uDB<:BHcc9mV5QBJ6BJKWw6yNB+5F61H8FGncjq
>THHLY +uqC5\4Gc49RR1kaWBu!YAlK@hLIMBltQYWRncX961VbpKWqHJnP!yD/D@+>@4n1:=Dm1*^LKV6^%89h
wB+8Qm P=J*pa9>BXJ!M*wCKt6NdmdeNcdZEcXnpTI>DKk#mP611ISIhjqWEa46+4Hi!>QE8A6PB$dZE=N&+*F@
/%91CR VqJlH44IYGBd&PLipAwQCVEF%G5>8qAS5S8auAe>!Tqy%k6Bi@$EKZNiw\w&&J4L4?piiIS&HmQSNHuy
&uP<u# E\Z@M=BN\qu*5?ELYh6kw8NMPYN&wiH9C<NJibLw&yyR!Q*L/mLd\TV/LyMyIXBe65qe:j#^>mDSyNIH
^1=GpG jwRlRMX+q!QJXL45ISia$SW1JZn=\RwymphPXbSD9nwR%Vpw9V5+EMVy<#pM>cL*S>lRQ$p^5q5RF9:e
yij6iN !lTwu@%b4/uRh*t51/LT=&BVmHlt5BZYF&54mmlet/Nc/Zq5<CSlpd9ju*8k6!Lq6@Q$JJF5pdN>t*q5
RaPbPw c9ESFEVZV*L:k:w<>dnmh^W9INu:=Hw<mdLMTWXiK!Rl$WuBcGaklj%bD66dYEaZ5pnl\%XRRtE%A:9#
R?Yl#* %tJV&DAb/1F6dmhb\:JY8&Zl$+VFY%eCctld5Gu<GVBWT4IQ+mqFCXR@CqPw/5w$k!LV1$dY1jlBI#5F
b=P?wI dlWqDP4K&tj:SFp\Y\ZZNiS>X@AJcnV8=8BadwjP:!L#IVR5=lI<C<eK<SkJ5phD:nABk\R*QPZAt/IC
m>Pqkk @lMKYnNwjFZB/+k+@Mey$tLVdVEScmnLp\b!8Q#6$GRhP4R5R!VJpH=dCTSF1TA^KtXt5eWd5ARJ9Sn@
KdP:du KhyCEj4M9RlPCaBuD/6+/iLY+ep8^?S%J1J+1iQ5\dA8S=yQ66lPDiBXB%Lla:Q$NCq5#CNhFnBDL<bL
+4E<Ey w@$l=#R84XMKb<l^qyH>wAuGMLu\kDWX#LF$jVI\m$bwF*1R^k59J9Bq&+puumIWpSjj1yL^PZkl%LQ8
&wR@:* $Ttad!yTMZ5m<TE:CYA:WaVw&tdVP8RM$hMB6XNY:RnL<8y+&K6*ViI&ldSlViqhFlZJXR5!!%KwjmSm
B/+kB\ R/ZHYhVS*FIap!F>%19mZmp=umMQnk5H8IWLp5NtDk\TM<L^#@ESyGmtwHYWbAaKYPDB6mybD?KlEGZJ
#GE!pb QdQ$1RWW%uIZG=n+MXE^ZAAFZ^SQ4ZEeB^w@qBMI&69mtVMKhE9Wj>C!q84+w8:m#i@TaP=yjMc/Ht!Y
IKnuKL EnWmR1@y&9Y>LZCiyW#RLP:%&5ihZEVYmtYYitE?&5HFNudB5I@Dj5FP\EpP5R\/JBHhyi#XYt:Pt?+y
V=CTXE ZGmR=DId$hDD4i+8ywkWMbiS&t*Z4HWW*4DAj5b6+atwjA4?9IQWjIJRjEHjSGe\@IQN@EHNwP9=NITt
ZnY^11 eym<^LG^@Ibl!S&!FAAwWQ9KFQcS\9nFEQiSpIK@5EKEbQ*<eIhkqQ!bIAC6$IZFMIHWcl:1^A4S?MK<
&mwhcd !!8GLS/FIAD4BACqBET*>*YRKwYj^K:T>+MD15W^?uDFjuJ<A5Q/HbPnIpj<*&W>5Wdc9uDW4a<!\yI\
5:mRC= W1cRCEE:S1uK?^@j>15Ll8Pc&wG5wFlAP:G*+8ACWc$tPPqh=FZcLGKkaB:R4FA1V1th*KpmYGhN8B#9
dwNINu $qESNw$YB1%Flel9yQ$SFyJBqtFtNy4Ktypcb4W<QnZF#chCMuZlEnPWdLGNqYpQ\iL&tjXEbGLy*1Mm
=Ayltp 1EbD@=1$yc%Xl?\j6cIG$!CJ1^heJbJl++K5iMi%uG?5^S<wi$Zcyi\j*W>?nEEDSh*l\h^BnG!wkMC@
dC<R&a LcELAla#Si4T$:BPRRFYc6:91/T?PYBCR+lRXdAYjB@eE6#aK+Nun<4#%V@YScl\wn98mDLB8VqSlcE&
a5dCDY TncFCq6lGlSRkpq%eCDJ@kF=m?w@GhVaL:N?NZi!lm^YXy/M\tbTpYa^*wSWYB/:YhFNYZp1JtX1NLiP
TqDqPd tDF6KVt>qIa\dmb8YK%8&ZyRjmkPhH!<IGAC\LKGXD@nLwSYJRE\MQ$HA!9Lj<dG^M:A^MdC\MnI#5nI
yP^E?n !5nA!MVP!MLE!MnE!5LE\54E\HLBBYHqyDnBAmkpPS$/DXyFM<A@&%=5XT!MAlNE4IE8a8S6kNbCBLGB
*i6qIw SX>IdL6aZ+V%knIeI@:IVp5n:aWZ/qCiSnSl\Q<+$HIVnyJNIk@F9E>J8em?l&<\=a6NTXB9GR5tEFkF
a/AX*h TTZJbF@ZW*E+Dp1>aQTL\kRad6+La?V=8BTCFMVPIV<kk<kHlkL/4=i=?pkW4TuAeB8L^ml@H1W>kZGH
Ki@yQ^ FSRtCXy!WYwLC!&WwIh\uIYISSS#TkXapc$bYq5ei@qAtXEFkRPiyRXbn/FFSWF1yYDa94pyY6*EDC=c
b8*w?T S^&dKjqFRBPG1IRNbSEqSWNkYiX#G^MWDWX$VLYBB6X+MXWpHZ5#PX%?ZCZF=e=GtWWIpdbXy5k/5Iht
%<AJRt pa?X?Pay>LDE:q$d5$68E8GWnhaXD58AN15!?cDTFj?dK$Cy8=1@AKCa/DlRMbbF<NKju!9jpn+VAh4\
5j/k#N My1SeKB4@/\mA4pME1\1pT9w4AILlJWAKBQly+CtiI/^@NN:mYYtwDCAjhcD5IY4YCBwDq+8wauJthqB
?CY$A< J5PMd1YpS+C8c5XPu4:l*eSYGia+DIW8EH?KSN8FSpB<+9XFR@!G4ZNH@FckbIG1mT$G$bC?y:+c/jqn
=MI+5\ =G*+d<A^!<cmR\9NY<qKi+%@q4FScuN6SyEqnZAYSmyctnqtIX9B#LwFRa6+!i9=n/^P4ZaD8d=uZH8N
c@:NJb FdI>?1@M+yIc1^*KXBLnE*C5JIk6Ap5BkuIPlAywCHc\P\G5CaK=h^1q^5FaCdYGRR1@*=hc>dbea&6?
K6IkcC #FATnk9tK=9y%+GKuTSWDX>*%XHi^Y/FwP\hIDEdiF^1I8A$/dR+I+pA&E\G^65iPSHSTkTuqw^5Pt!1
\k=9$D !64S&wCj$u?$X85^#laMC#mI^S^:JZE&nKcqqdbp5pJ=KWGEClYyCpDiHGcemT=Ti^bLFd>VJ<HZJwFl
KpHaGw =#>%+/\b=8qXEhlSq9BYwR9?Mp<8nFMm+%eYBFZ\VyYIqwj5a1mCGD5?5BmLITnADZtEK\DGKA8&L9eW
Su6XlG jnkJQ&kT>a+RY^ynMDEqaG4Rk=APTZwIYS$k*KMBFc:nCaw!ph1VyLMIQp^QGIACt5nVlnFdGkwIcW!C
QVM/<% LI?WA$WaCndDS6GZB94Q6/Vc8!4dZ1l&Mn:DwBd>$CXtw+D%L!bGcb8A$@XkV#p8>1nw5#9Q/k^San1*
-ASXi> 0001b634fe3001202b4 Page 375 of binaries2.zip
T?i^Qn :C^+M+ABVlSM&DARDm?pDVikX#nJGlkPYCtRwimcSXMFCnh&IKhNJEicRh:RFVS$JdPaa^Sn/we@itnK
wKWZ/u 1iRSBibVJnaB<lC<XQ?kSJ<1S+I/k+W^h\JZN$uaQyky&M94tk=+cC\R6M?Iq/Ck8eC4PEJPXYCimAlI
EPFFRl BV914/D$4S%*uFKQyhu@\=IiH\CR&1RRQm@XESQ:4q&y!Em=K5Ck\ATDXa:?aE4YtJwL*DaDq9/Y5P%9
c>Pl?^ 4pQHK4bR11XLmhklVE=lynD/LSSFZR@e8DbAB/WDleeNqm<tFW?^kdWt+FqQ:ZCB!T%<a+d<=8nj*NW?
%jBtA> lJTum*1a4AV/kFwVqC?1=DSeQ*e9RHE<>*>iWJ+!N<M<y9T4u?K6G\Gt:qpFVw^WwJGuQyJ5KqJ&%llw
>mG8#1 uhDRAnauJDaAbY*9Aic$5q&l1RJF@eEQVIG$6eyG<yBnaMBY1*!PZF4&JEG<BqdchJjN&1t><*=Mc&aE
5+aF!Q !5M<1lNJd!bWR1Vj$yEFbeq<1Y#<REtRpSEXSZTYFI@E$bGPyA$@jih:+j>PBjR8ph5bARy><XJWqG/j
9CLIe6 ZN%dS#@kVZl=BpXAi/*Y\AGq6Wc*yDhSdY4pLRN5&4Jm=KuJVd=j&?NpXcdW&hb:h><5VGbVl!+k$FyT
1SE&t% Im%dKPqJcy>Rh!FMJnY?HtW6=DnkkI%N5$\IMWXl#aSWQRM55hbAIqW=Dkp8huR5tWDPAA<MM!Jehu+w
abk9Dm bjWa#bkPMI9KFy:RkKhK#%imV6%ynbXqVV:mlH9pX+E5MIqCCXWPR%bW54bZy&mqm#4!Wu4IumhF^&w#
yuwu^Y TRBeIjDXZmChYHc&NX@/KFGpLebc:>KTS#$eY:Kjp>Ft4n?p5<18^P^a1/WMKV#pqLGyMyP:kCu8*MW%
>I>KjE k1F=+K6+XmKH*t!GyG$9q>el4q!R:SZihJIDS5*Bq>IPt5VQJ>=9N9D/>&?q%SbQa@bFZZPuRX:qd5Z9
iS#Ia$ LQyFb\4\LRpku/#IC<^I^icJmcdQQi$Gu6\6Rb/FbM%8*+4<CC4\ZG/^btw<&Im&T9LKwc&SmRcKN&aw
?/MZ=K IQ!k$mm5epmyJ\%Fl6tph4knyNyAEa9Ch*>&na&EKF?qpLlJaKBq&WkyDXwHZ:kkXR=#mL=b#cm5%LR5
qVk<pY 1>DawC#dW9Fkc4>uMpTA+MQJ6?#C!WuNcqDhDwM<t>Tm>eEIquMY4XwBw*FS?Qp:PYF:TDJK=C9I<a:y
9!peh* =HDYLp18BEN>$pD9hqdFA^L:YXJ1<E6&6$>KR%l%=+nQuZtlPiVG&dYHmw6EnuD^=D#==LIPXcDJtJd%
/RShYG cwC9nYACnT>Rc/%1RNaPi!@/GD^VS#hduN/BjbujiSLHjLq6CAy4==L5X4c+bW*/ZmF//umT?FHTNt1p
$p61:y e:BM?I48SiTEF+jqK=F5$RiceX^#P&1%$R?8cWJVSWSnWqZAX=Hk!6c:Dm!4^hBQnKc>6:YZ>nV:d$GS
XNRdk+ du8*?lN/1PX5=Jq&/qC^^S#LV*T*RT>pYIH\@dha9NFa51aP^bFE?FdY?HR/Mw>$j618jD486V>$5^4C
\iE@5A 6Kc+Mp>@<Z5!EW!E5WMCX!YCEJ!C6MDmMV*191$mXQTmXXVCZtS@<T6mA9Vm?Q9a%qb\N!Ymh&iTPaKt
hK5XnW 5KyaF&amA4VG9Y1IimGM6yHiZ^Xt*>4\M\PBXV6$>dMIatdmiWWt<:PttEb@NZ@T9iH/MMeIh=cTMZ5\
XCQ+@? @YHMNdKEZX9mDQSiM*>?t5b!<&aIwq>&Zt9!55DRiWh@9h^GuecT@Na<6%c!8B!c*VXm&n+&64!&$6da
Ae!eIh H1+c:Q\B/HY+?\&+pNkw<C$TLZkjyZ<IH<y@8ePR6/Nw9#RRlL!@@K%\GucMiX1cFtJ+pC#Rt?kPFh=V
ZPh<:N TN@&E9<!cVKaiia%:Swt1Wm/YH<H9wl?Q*SWa%:&=uB%u6wCHCwEHBJPlIl@&c+&5p=^bGJ%j?Gj*Il#
\5+^N/ &pN!!$L^K8H&:?q18JF$B+YkCH+TXlCKA>WK+pL%AS#6kLF+/P$<:K^^t<L%h^m:cBuI^ppZ<LAtWapP
H?Pmd$ 84$AFwLw&<#!ZK%9:Mu>i$tk?K%498uqI\VcaW#+ym*9u@#5Z8A8lH@1WSu^\b^^JKnk#1&!VWZ/Lk$B
Dhltq8 1CM*jjV\aRm9a1\Xpd@<K^SWe^RRe<Y/9Zntwan=1eLn:5WPmTQnTSWQSL<NAlIdma*:?a#>:?G&8>!y
La%E9L HYRqW$\Eyhq%V*EaQM&<b&#lBM!%u<t@RPLj/j*#Kj9Ek<jMu9^VPQ%BWS5t&pZ4pWjlJnHQ/CPwKjIX
\tQ59L <J6dbjLPllLB5jLKJ&D<ba5hP5u?&hqiWQkP+GDqeTjeuMM#yKlWjpSn\kXd<y65anB1EAl4wtDeaYQ!
Xj:tB9 d1qP:4Nl1qQ6HYNBS16b+duCBnMLHJyH5GHF9hnbRmd*+4MDdGQ9$YJ=ER4tVed%:DAk$W9bRcdE<TE!
<aCwK! E19+m*A!NAlKciQ=IJD=wZJ&YpFNtTS%+*JJwhlC1AmaHD6!TtB&&8LI#PDcCVFc%TD/HJF:yu6Q:!LF
*+A9E5 t1bN!^HXHJumST5=<yB=iKD6e>lAdZqjpbwDGHB59CA!wtMq/HJLdYX$#Cyk#MjliX1WNib@tw6GEKM8
RhJ\&p WPQP>nKFT\pbjHVbj#d8Z*Ct45wmA8hX\1Y4hEu4!w4VR9c9I@mlSbQ^ySPXPqD^JcJ4QDYCWEbID!GE
64&&tV k&Hj<E\<\A?$qJB$/KThI!C</?cnWtIcImWIijVZl<H/P8AeRChAFj*:#tE?RLHpNmcinmR=ktNpRQjB
QX>T1F Y&GKVnd65JDkmA8Hda*1&#cNy%JaVniDt@yB^QPZK&QB>CX<jCjbP^Z/8TKD4mqI>IYZ1mpaD9u!DjkG
SG^8I+ tNFn$pV<CZQ&9Ek+!HLie<G<y>L%nWH$bWQWInSD<wG9JVP<t?A?MGdjeQt#Pj4YedeucnQF>PXR1$Pe
et&elM a<T?NGj!wa=\6#JIY*I9/9u!WM>IY$&$+nVGW&HBGlNQiDRwZ!ZZS<*E<#eNhGcE>CZGNnjWDmZptuJc
%yYhpT e5Yy15p$ppW@#PDb4IY!FGJqi5eRZpD=\$SdLEFDLKNc4MCL*cT<P<:F\qX5M5BI/6W#JQLeR<mCdPSM
=H!QWy ZINF*MB816jC\hLm\hHTXm*/%9mqe*QS^?itVtGV*\\&bQtK!8h\A&PZ/4Z:MC*m!ni^Nnc=VDPycW@J
%&mVl% /@9VMDP^pJLKe15cpJ>Mka<&IhXPX=8k4<ER@tWTM4&L%ck+?=hRlyhMMj/m?ZHYan>YIib:RZJW<mnJ
uuDMeS XFEC<\:1WFdt5J*#e<@#bbidX%SWSdI>J@EJ6btJnjM:Jl<<hjTbJ+eDE66\V5!&+4ql$J=Mkb5Xk9MP
5uX8@Q Faq&X!B6bcJ^e8#iqjV6/MT#%Njd?Kc*TK&lJLwH+J8#6P$VMGuY#Mp*1j6NRiC1=pk>%ZNMd8IMJaV8
dI65C5 J\nR@p4AR/cEk/:/RbqB\ah5S?eGS6XG?h1qwj\ewtRi4+Jic1YeRSGibiCiS@HGyGLGlhHGy+wtyy1W
\Kj4Vt yQwiwcctydbt%N\!lP^6k!DtaMF5ltG??>dty+pYSl>ewjupw<Zpy8Z+^qntVyQDqYlEN/8Re?M:Ja?k
tjjM&1 APWRhiQk\1tKNJ5ca@!N=aR4Fe\N>dA/=</?he%8R8!kbXeYMjhjE^?AhP>@I8P9pG\AL#Klq&dc6jbd
6IVtDH yMh/<lCSXhWj!@lS68S@<#WpSI^ZNJWX@N5T$kQa:mbKebkaJEVK6P6JR$1TNdN!mP#W@dtlABh$I4cS
AZbShW pyLKNINkVd8l=8XLWA$t:>QnIWIeaGiSd@\l+<<TI>E/%:kMy<hN\ZX$h1jC=h@NW=G*q+EQW?+S=Be^
Th^59h N!Du=<$@h%G!Mh<B+/bl=t/^JAwlIVplC:+Lw?5B%StmInlBp=Y/N=NT/%$teEW&\Ww&w<P*M9/Z!h&8
jq&p>k n<\jNMcqJwRd@IMj<MBTcEQY496>/nc$Je1*K9Q?LC9&>K#K1bW=q:b?1<<dKpY/GpE&bTc&<ETt1hd$
4X4<l: 1hydHEYPIht8HL+@Sj\/pN^6TeG#MS1<p=wd$D#w#/=YnaRlcI&RN9=PtFdymHt=5Eibl&hEnI+M5wk<
S+XPlZ neQm5!A>4dFHcCpY!aa1WXRA>Rm#nILP<Lw#^#LpePRN>HVpm+Xup&#TeDma=^wWmm\:6=/d$1CEnyT:
Cc>5*J WGWamtwylIkylkNSN#@Kkn</1\pYWw!kGNynbCclVB/mbkKC=VD$wih?p/b^R=A^N1ecJ>RQu%/mtW$m
lZQhpl \RaX>XDi^bF&J6HC5h5u!YttFbX$tatD=4C<D#5JNJW/KPRj5?+M^HKmYFiC>QmnabeH$M5Jc/tAkk#@
uy4CZL NYaGq9>k=tBnatBmbtbkbGV?4?Su@e@H^MVAmm$aALI:Kaw6G^CEN6wELV!E4EW8ndR%RBPDcG%K\e!+
\kPail Zuwlb1699e9lKGT?\p:udE4IQwe^#cSMt/>J#L\wJJ<HC8ep@E?qRGwM4%pJYwM*BAuBlB5WYF%^F/bw
GPbwm+ PwatJLa:uu8T\L1Nd9^t@*bJ=IW1?&FqbX6QynPIl4N!%AmqEGNBPX^BhHFS!MAiFP:IuS&teh!KjwN^
8#+IZE jj1>%/:1>n8@:8l:CC^CWVmylJ/wGS*Mpl5y5@TcW5C*PB+N1GDjuZK^PESTM+5>WyCZqwV8TIp\D\T+
kHW5Kd E/\C5kCkqdbTmJB/lncYu^!FF!9W\\wG<^V!jV$a!q^\P:n*Kj8wkK/y?^GLV8u/D$GYAb8&1!tblBJ#
\?cVbD !9uce:M6qppE9d&tc9TJt<X@!LJKRKl\kh6GTAT#e^FdjH&HlptbZcwPYKiGcFa+RAi5eY5S4VyPc@V%
*8J?iq DFA+ln=p4Zm^w:die#%:tGJtII5aMLIZm?#?CY65MD4yNXk+\N>M\JL/SWBlGnb?T1pFMEcjFVcqPI%i
yTSTn& FV$<Ph6MakdBiAN8b6$&:MDSZjp%F?^ctR6?tDKJwt\&GW<cbSYP>eqnYTX=yL5FXq:4SkZR^8B&qY51
9wbFtH y*5%S5Z&aX\kPl=>G4c4TB*KPV8Pjt$ld@\%qM+H#nLbKyXF9\R>#M#ee:tlt^XkjJejbhyK8S6a=CJ=
*q<&5H lh>RD!VQ5ILqHqGcZ<kiTt<^q8YijcXN*>\!1Jna#:^=Ba^?5Dakw%6?ylRCi:k*hTn4YM8CFbLh:BiK
ctpWZj IGM<lJamKyQRW$>/ZqkiR8aC!D@^WtXTu>5kln!ISB>d6%FLZH^/P*9IB8B\YXE/Epeh=F:Sb9HLk^WT
hyb@?q j:9*>AW%CYp!p5RSj8VI%m+Q&XRc9JBu/Dn?WPeTu<S/GV9^5Lhpi%w!Zn\D4qP=MtYkw5<JpZ$%!?X$
d:eA%Q e$blY\FBl/:\1RtaTBmZF/:>Je8yCTB^$leW6utl=5YAakt!JGc1iV/Zj4>Sj?JIT*<A5@4FMn$NBq$:
\/Q8!! qIKah5LiLhbS!$aBH$Z1HKSI</PGbWpRMBhBAVRjbR1e6PIjSuEHD8t%M>Sw?1WWlA@wLKNY!wL\1im?
$eHCie =cGAJSMa^Ic/6Ae9DFyB1bVqDu$8&BJ%w8BIQPM@4KDAG5Sw=T&lS9KyjE!5TDtLY1*:>S%T=P44w<qP
iy9m4% au44=BpXjc\6iWa&b$?GATXy>^qnb#YyVN:5FkN$ja@yathyFAqQEcCme@Nm=tk&%mIX8yTNNt=pp*aF
18INNl q#HJ4SWen9Ei+*=K@Y*qFk#ZKq8IWE@9Y5985lLE!IIqJB>SCySYY=Vml&\LHlDaHlqy1qu?EH:qjJkb
aCK6># iE8bHJ%TI9j!Icp1@+mR?>4R=icaMX4/\neHEEDByPT+#RT5T9:/PGX@*XLXRHpLGKPT\<CC<JRyNTL8
G&!wYT qMn1SJEHH4WqFdl$&TM>8EcjVJJ>^WV+\HaXt%:*YWj9cyKuywCpBthBE\PkK&uneJSkdEZ@aceCKDG4
-A14Gk 000c802365a001202b4 Page 376 of binaries2.zip
/IMQCL KNK6HQ+HFG#LiwYc<E*F6^aHdEt?&IDkI!KY!6^VT$byCW+kdI>RhhNKk\/wWV1bwe+a@i/hRA4jhVAN
adbD:T a@hFF5BMCb6jPc$y1*LM&Q#tj*Z#/Wuc8NG^>lilAG$X9p&\?>cXwa<D9EXCaleR#NXk^Hi1*LVyXb!y
XlELq@ :a!@YYn&<5WpZ/?1mQ6=lJ@<&?SS9##4tmup:tQwXaDWR@q6YKwc9E4*#pDDqRQ!MqVT6eTh+uW$A*j6
T#@P\8 AAy/i6n&>VTVmhnCk:eMKlGeh\j+qE&6<jAlNnYQNPYE/dwYKeFhdSeBtPWd!iqpByGFwR>EYJXCFPm<
:TKmej NnMIBIW#!44@kIQL&pui+KcRq^&!$D\C\CnW&WS5CtpKjbRmAylw^:a!uR5NZjNLcEa&IwJmFD8LPmpe
!^V5Hn JTYcE$pH&uwZlDk9ckT!#T@*SJ$*FWGl>%QQIC8qQldcPhjH$uNAaWpcYISa5jJXDAS1B6Im+*hl@QII
uI/B5+ 4I?6NNpwdZkK8AB#1BYZ@/#adNKpc\cQ6<kINIqZam*TA96c^p?$#BwN4RRG8mP#!FF5qXV$&*S\^LZm
P>aElZ 4CTuqnLQ4B&YZFjV&eQDM/MKZN%B%MjSDZpjJCcyTMRmTyIQ<<<p1@IaT*YS%/lqWYd8qYFqQ<aR!+LD
P8\9*Z NatwDYRNml^WM@%aWZNBAVGNT=l11^tE8tamXZVYV\IVEnJHiMbmtdDI4V6tXHQbw4\*1I4%!6L88KWJ
Ru6K$e EEl1V*LAP145@CW@yEn1S+R>+@m=^6TpR?PueVWZ&&F*BLP%XLD1!T8=JHAWIZk$YXVuuE8ZCJJQym1i
^5^:=4 wZA@%RdGy#eNpD91mdWKV&X^$F8LSn5&D?jFPV*6cF:1tC8S>EYi+LppqAh^9I$l8E%V%D&^?YGKK:Z1
B9l/>T XY^?J#6q&+<+BS:/C>$^mt^StVbnYC@Rq?@$>K=u>aJjGW95&@I+AH/5ZMH?Ac6EeYY$kML?WNZ<P*nk
EL16D^ Riy+b\CtMIM*dj&^T=$qLYjq/*hMQZZW<y!*1jtCh:ZlFyIVYGAq!HTBD:@mLtbnW:K<mH@&D%8&Kkjy
NwSRZ/ CD>q9dMe+yiH8uTe>J<MlY:?Hbu$Ml/eHLKFM/8YJy=WEee9mRQ^y%EB99:*S%Z>F!RG4C<Q##<EILN+
WwFD6@ L@wiVML5T/ehiGG5C6!?pH<8Sc\/N%8wGt:iCt$w5n@+b:V/T<Y?d9EQLm4>pl#NH=/+tLT<bhk$nIdh
FjiEp1 =1L:ZND:+S:kFZ+LTp:=W$k?DKEV#n:!#qn#B:!/HtRANtldAt\M6k\Y56#aM\ah!u+$%8ca8cKdK^#E
mhHF<< NkRXu1SX==!%WAT8DDc%1Cyet5k:b1mR&jR*b5:!Zt\\p*lR+/IHH9<Gu9=htlKp$ZK:Fq^elB/L1$J>
>npKaX jyIVu1lZY!J%>KV>dRFF*YI&#+T<etT:^5+\XVbXY?ccSiSRctRPJ9^a8aV#yby^VeF+^bIL:Y+>S:w%
9EXt*K 5>=$DGR+mCn>mjI:?a=&eDyd5$!$bZkIp&K<JjbiA6F=Rh@/ZeFdkY/h56II/IL!bbILG?^R^!GRM!kI
W=p#JS E8TdTV+N5y=jAqd!F1J:^Q#V?9!el>m$WZmS9MlXG=1Ya6?^TZJj?PJjM!Rlq\Sye*RC\8qlp6FwWk$l
!BqMbL YI%#5nkeC>^#&5p&/%F%#MV%Dq!#muB$/5T1V&q6%HB<^9BkD6$/6>Y5n9=pn9=?B5N$G=J/bqR/YJE6
jqGL&N DCWkPbY&!IYwb*$h1jkq&bD6CQCw:=D:mL@%!JR8b^S?+H%#YCVl9It?Swk46/N%P1mlqFF&Q@F#+!SC
K>@XkN BBSclMP#CPq=e@%:DRqMu8Pnh=EHNaYu/9uk?h\/ZS%8SWX4$N$NXkKKq?K69/Y>T9T6E1n#l!*9mL??
1&iyap qG%:C+ltiqpLQeTl9<S68Vk\SGRwPPXpZHGnGuC%Gpkl/@/tdcS<kHX!ZPP4!tT+!wYu=#lK8lM=:Np5
k/TXXm Y@BpcJ#w@wQkhASWSAMd*Q\HSVm*=<Lm+@pPiGS/cd>yCAR\<Hl*6aR8:Qqt>S$IDQ+YARmGR@Gt<KE?
a<IJL% $:KiQ4>y94X\<diHGi9l+cVVcLb\W?$yj&1G#i!w^Y^M@?LjqcV$FctM4TSj4T#h4cJneBa9ajQJ5BAj
^?Y^Q% BWbEj1M+R8cPGXDT6ZRe<QDwDV$*ZZZccTe*k@ii^c6t91*TQece/Ya5eBQj?R=6>j*w/Q$Pei!*$cnh
jH?5RE GVR<GeS#CX\4:HCPTHy5mA:uk@bRVCTuyTA+*H*YeGPSp@%PLSD?PI6Ebi6cCQXtGEBF9H94ptZcVcRP
!Ty49n TmtQeS6*cDyH5CV%I@=$IG>EjmqM&S!I#RtP8A^ce16cjc$/@cL>YDZ4@9MR^chCeb45YS5\Cb!W<Tha
dK#T*b PIREkQ%6ZRh4pYmAR=<C>V?&KQWue\H=<$5hXAkiF\aePT9!j9p*8B$qF%A=miSC1kXkijP@J@^A&EIh
Cyq$Q! $CSq<5hWmYR+C>5/K@i:lVVFwRF$+%l6m8:qe9N+\lKcT^TwKDa<Y8QJaX&y<#w/w%lS@V*P&S/wJ*iY
?&dYcu i@i\=R9kwNwP=<AW<!w5Fq<X@\8GqpGdttc!thu@l/m*AI1nij/H$eQ8eAmYBHe>:k+N\j%\h*ePJ$CA
u$5L#B wIi:BA9B*h%C<PD8F6#hRklJ@ut?9:j1:huy/bt6&8uyV@jWhp%6dXy#9^T!Jn/6I/:YP/HRuQY/dT^W
\hyNSZ B9$dFmASZ<uFNVXFmYdAXJBBq/@=#lZPkE4&>IDXJqQ^FyBYkYCR\=NNDHPB+l?cMwY1&VRQSE\Si9J#
6Wt<AA H+kQ4c5*VWi5MbFtGW$w5S/elPBhDa>q!J!QVpWXCCX\m<DJGSY!HPW695S$Ch?k^Eh!F8u+YnAMLVj=
$GHM6S XiQNGqcXca<qq@E6q1e:yht@XRZl!N#h!WEjY9KP<hRuj+ZKMMLRZ#4GPQJ?Ra85Bm*WlW+<HQMY*D>$
uPDnAW My<PIBbZ<WQVy%QA%:Ytm4#66pQ*4*F<DtSY&GkutP#Y%=6$CtPKP8=yqc8%$8L9+pakImP@8ZDmpaCB
WlQi@H J!t:!@=%j@h<J4+SjI%?n$kCqlhm!CwSD:DRK<I*/6k<VJj&>ml1PBQknQ*JWen68+jNXwWu+b8T>K1t
Re^d*e 4Nq/Dlq6nwJKt/m1uHpkuD@i@t+#cj=RM>#86=1>H6?bVQp9uGbTeik4?d%EwNbj\\Y8AFd#F@$Ne!R9
h@VDJA hQw1dunaL#mcQ4>d94>uld/:GXDj?1VdInJ61Q6^LwDRZwCM<bd*KaTI8@@H*AjH!Y1BB8Yc:WBq\bB9
X$X:w+ **SJj\MmK%<P#TkV=YTN4yACl\=a5^bu>ZBJy&X8#PuhXS6*#EyRyP!B4CYM=8lQWmkTTFq5Z&tABhyy
%^R!Q^ JDM#1umNSWGGjbmpJVQM5pSMBTu6X1LwTcQc=<jaI&=n+&A8t^bnkYF4Styd5My%ECylWYRZh5a*ePR%
8?MnG! <DMtAlwXJu%A5p<94jp8jjGwWM=5#\T:DIKqWCV4yI@:nw@Njkw9Tn:nFAP&bjmP&E$<jk5/A?nHyejC
L&n=+R 5PqW&>cP%p5NVSiINXXq#LR5QqAiDYapCLAnh9Q$JjJwpG>bWQA=Y8F\W@^<6S>p^\&5F+ML/4&qMN4X
W&6tb+ ZDemta8WjeXWAkAWEVL:?Gbai9Q+^mFZWnJ>p1JpicJKIQbIRZbbWjcMIm5#mikTNR!A%q6<LZhJTecM
qkb/XR >yl94B^lRMc&IX6pRB!?5k1?tp@G1mwcAHCREm?Z5d?uTXG5qce^p^cjN?BYy86G=G/#PGQQpum<qFVa
$&@YWX lh>8@IKlbkXG^H>blFlR<LBQ+E^j@S^nL\DhV/Kpa#65EtD>5@W#EMwH?!>F@pe\tACWV\AMc+6^+IXW
:$4wHt %CX*JjHa>:FiCjKMbi#^^kjLY*VLJCu:S*A>PyZN8kSbWeA4BkdYPdbnLkqWk5W@W/l8m*<nRWypQayP
:a4SJ1 >W/kk/pcp:W%TJqSFSeHS/8endY$NSaMhb8IPBnLbBmMpdQXZ6a&*ayp!=1pW+cN8GGl>wP*N+<#nZRF
up!aiI m^DDei$&EV*!y#q^%SpqACX@!4uSkM=DtS1jct?R84=k4QM&mc=/Q+:N5tXADFFhp8LJR#k^?JBn$W*?
D8Y4:Z cNkI:I%L85n@RMR>J?HMth?%p^h=^WpJQGm$TQn6&5wVKpJP*lmLjhjWtBt\?=c*WEW#ANS4eWi=$D@=
ImKMw8 L1ByR9E&#YcSBN\/wuj:16W&=ek!y^c8dEby/mZnWt=@NkaNcKVWchb%DJabHq</l^4%u4!DtbH!CH8n
dw!mq6 %t4*/+%^Hj/auuDey4n=tZ@B>ibidHhyacVKZySJM\AjmF!FjH6c9ejZjkw#icGYjFXGbyZk6E<RlRjH
I/Gk?a jI8J*1p+md@+=Z=8*%qR@dQq6E4WX<QYW%tK^p>Y<6RnHQEwp!dJmj&mhjZQj&m$=q<:9?XQ56EY1*Y<
#:8uPw eB5>YZ!%5qT>pcbQ9DZt/q\IlHtJ>5Z@&mZdhcSlei6h@jZ4#id>\1Tn+$?1>IPH8ua@=H!<i+V:EFW@
JAKGqN ZH8K!INCC@p6uyD%\%kGyYlEVui5FA&1muM!PyyuGcWE\lF$Z96m/P\wiZanASw?*J*y/?kt*49H8YX%
iun9>c NJdXAB=6b/X^XcPtW>^\uGwkd6jp^>:IDHjmM1>?MT#+K?Xj!qV>uTndiWm9Ghp#8/=ubl?kVp#Inc:T
4HjwR* SIjGanA6#M#LuQ+4@+\GQHlhDw&5?bGh^iaB+k4A?EljQP:$Jt#@*mqWEA*ZSFww$ktq6jGICbMMd>?d
FPRei& K+P$w$%<V/KJZZW/+<8LRVYRpSW6j8WY?ejl1nq#9/jR1>WZ/NKcFMHmQq^V>FVXWwR*VJI4eKd:RTXI
I&lBKE G1&!emI9Mi#%m!cN^Aqqc%t<I@:S<HnknHJP<8D^ynTl&l4>Hm^tXHuwI+!Ny#BY&A?<pVdebw!Yn^/h
m&<1X: MNEuKJW+S>JdWBN=>eR+@E+\dITI\iME?WIcCdcScC>QRbIKn&tn9p*n=#RcB<8LI96T$!pDHauE\nNp
Lw=IA/ /<ZYM6Z+d<G&Xe%LqQu94YS9nck?j6QpbP%kNIk^IyZw^&QVNtTD$m%a=4KPG^=ykGQp%\j4luNBH>$F
^i&Kwt RHR=A8AjJ*ZdKV%t4Duhe8CHG:SM??Abe*Gy/NVSuYyGAnCqbK@RJuKMlMY#dMNh$bh&Y1?A4Vlb&++m
@8I>b* +lY85R#ERT8aXDR<%h!\Qe#L9iJXcjV$/Jy>5ct5PYpu&k?W$/=tW#m$TM#l1+^=5/Pj4B9h<5BH5VS^
LEwD9F !Pi$c^KbLWjX:YacW=XNPV$BL9%!Rhe/#cT?nILjq6uTnDJR4%d%<k%M4h<GTVIVH\hatBiyLh9hic@Z
!@%byw >WPFwFNWjh4ncyM<k@Sj?qq6&6K&t?1**KMNTCCtn1>w5ZBkmehWdKqE1J$!qAWPnkY@pTXFZ:t5u!k6
=8/P\C d6tBt9enFZ8yZ/Z\l6kc:RQAmakdY8Fe9>nBpWJt*1kpY5H<w=#<SRdiC@nL&q^ee@!FEtb#cmMMYd8$
ZCuH1J +VHiXa56^%uui6Gj5@ww><^u@N4dM?+tjlhZN8<#R8S?w4nl+tJ\/QZ!qymJk%V66+Y6>c:w6HCSwD+Z
lM1?B1 WdNNZ^yt6CibhLP?bk+WJicFQ+MPNJ>TFpkL=^%mNHDq!$dCPX$Vw:M+FN%>pl==ehH5@Z!B^e*%bVet
A?Jhmi C=W4juHWRqK/l@atjAHTB?:/6u$dIP=WujT/yMAYD+$K%Hb@:ldE*bn!H%Mnn\WbWu^$^6dEyGBu%\+h
Sj9<k^ +u#K\W>=%P>Qku\duNEqH\h+J>@d!$mJNFVhRyb$XNqJ6aqQtHX84ja6?PKWyEaMCL?q8hyB&6m44A!J
!Awq%S HBc*#BZK59RqI!dIiTIuTCtM<:4QuBcCF#cyV6<$YlpWQ<6\lDR8yn*h^8:utN4nh1+w^m/NThb\XjE&
-ABZ^T 000532ea08b001202b4 Page 377 of binaries2.zip
+BH&aM $ae9&<K/=Y8&Q#wm6e\G<kEV$Yb#d/W5qYD4#bcY1@i8Zhy6qEd$dQ:XLZWV<+wNLa#ZIjePjeKCj6Tl
$/ijic utY:nVwC!k!my5^lZ!KJtl8qQ5:n<#9=SaC:uX4iFi!YGbppVc>q\X/bm>C84el\jqFc5#npMP><&/??
wANh#A 4!1keR<#JYp+%G#<nD\cG%9\:M<GF:1VeteT:^9WAQWI1VMup!dTVNqAw9E$!J:qT5FJ+QI$=+l>%i>c
Bi*p5# Y?1n+/CNB/we^c:9@B6eQ1yjJW4b:?Aa!i$#>R@D\??DtR69<4nd9+pa4Wt?m5ZA#&Z5F=jBR1Q/=uuF
J5qVA+ 9tb!&HNI5>FZk:*TPh4=yiw!NuVtwudVRj\9X$Tnch!Dn@GV:%LJVbyH*d*\#Qe/@J*QD#DGbE>yc5Q\
iRHMiI &yKctZnVCjZAu<>dqi8^8@4\KIT1AamHPP^4Qkjw!G4?hnHRbL:5$jGPA?bThe%yNGy#Ly&6=mCuZC>u
D1LFSA yinIH+/&&qS>E4+4mF9Bmt<&mm@FDl:FMPST=1>WSEw81uLA45c^MaFcFXX/w%Wt!mGSR//CnPk=DF6&
QuIXew :ClGawQkZKC@cNHPMH$*Y%#5bmX8ME:8+WkQAk:pLbJ*I:Sdh8WhVVlSH/Sk9Rwce@IWD8uDHEuC&Gqm
n#NQp9 uhdLbY?R&ntS1S+1*?@J5e%SqQb&&T8#Ke6%n?QX15L&^SH*JdD^q<L6e8ShhK*=YEMV5T6wRhmVbl%t
N<*\K@ 4WaBD8WE!H$HXN+hSV#!Su$GEhBEMaANbNMLc6=lPBJc+iR/dht$:n<?1=AZa9/b@pdwpKhtDKnR@ucH
tJDETm ^bNn^HIJXC$tPyNCa$T+Kc1pIhRJywje!&klWVye>nY<JR<lp4GYjdqYcD=YV8TCedG1TPJnSpWFhFJ<
NmN5wa N&WbYkjQILQ4Pt+qQkE?kZ<Ep=^MNV6keV=%yATGP6de\PK64CDh?Gb&T=%<KitW51wa<RLN>cuJ%jRn
mCXtH? \X&&XPHwZetScq9nIKt>J%VXB5KkIAE?wZ<p<N@V@45EaZ!CED+wDMa9KQn9DqlImE<IJmVAB+d\CTTi
\wW?RI CAlL8W+iAG4En!Bm6e15Y%>CBQNw&/Zp%@><QRy#uc6uV:RamR=l4FyG5l9J*=EmXba%cDDSW\:?m1Nw
iFYC*q lKYC!$KW!KVuPkpypDi#RKwI%AaENbSDTy<AM5\?G!tAqnh>APmXVk:@Cyw&PBZw6dPkcwN$^6AL$eud
FQ/6/c pAy=#m$jIqGqT?/R>@K%EKG=N%C6#4TeXhI9CVqyKnwX6Apk1H4<?jQ!Hb&Lp4uW%q$F@n&TXE>HZ8%P
tmmR5t 9#DW?$GB^?!dpXB@A4jXL<h\8yl4SDn=d:m6CFV\/Q9<P!/>b%EBNZXu=9T$LMlKG5YGFcDYiwB<XlDp
lZaSn/ \kRZcJd#@$4?jmEeKbG>+1SqCV?$*\n&LBjMJ%B&y?InQ1ek%d=W8ybdAMMb6J5R#YiW=kLKe%GAY/XG
CT@%*5 tN^hYP#*CTF4Juy6TLPee6*h8i!8ASqihW#85\*1lJ#8LnRq!cChkPb^L#!bIeu/mN#nZH%nNe+Fbn&u
kWAm#@ /S9Zqy4lcCCjSyFjJD^jb?$ScR+ZlIFEEPa1qudG>I^d::pPhl#VHqhcV1h5?kY=^9M#?ZZtHCBGQmI#
uwnD9> Q*:Qulw99H^%l!S:K/h6DKW+EBaJVq&GCh!4&li6+GM/>M&t4?PQ+Zt?ye48>d#@JLZmH$+lkkhy%d:L
HjBMk: PRAkty5ijHTNi<ku*nuN?Q5Tj<y&k?j!16N>%\pRMH^$1Zd@>TchB*t+8JThQdj#FV*:6PM9:?dnJ:h^
>bG8L^ RZ^PW8F*FFppq8GCYD%:YAL49\n/&+XRa*q:5QRcVT^8*aNa&hGK#J!T6%5E<AJkd<N>9JP#!wHu#Rt9
NhVa@= W1N^$jLaNNnwQET>IFt/P$q8>5Zq%dJn8L4T*B4e$PEtRcMKuV::CNeu/yc&&CL6Pan\mMJu&A==YV>S
eK<GZV y&cT^k9t$mWm@W^i**1:R^Gy&dK%=QIw%<^Y@5eykqhFE1=n=&=D!#udEyZR1Fwl8%bAKBX<#Ei#?8^b
MW&>^R aQHQqtXq1Mk$A4@B5=la><biJKHcVP+F:V$>DT5ti\q4Wh6:?u#/4@n%Mq9T9k!wX88!hA:FWb#i#mVL
16NRLh l1cmybtL*%l9Z^aMe<Wk$N/mIY$1Xc+HDBw&/HI##itLPy#e/4pWRn&11SdRuWE5eXqm/JH%88>=tYu#
RyZjS: wDpnb8P>W8dl+<<:5mPw^C6bTSHk<9cB@5m&I16ZHqd6!Z%5ddk1E9ic5bM9mwS898h%4tyGYG>kKh!X
Sael\V tS46RJ!8ZeWQ!>#S*$<C:P6LPPePuw//DN$W<tNHj@#yWP$^n=$by*?#m6</mdy4qLInLKkw/JHN6t%S
$99jq% !^li$9NSwR^6Q:npn?5u4SWa*ThcP<?P#B:L1kCJ4QK5qCc:YwLk5@KtLln!^dtelVP4w$Q9YpqYJ$@G
J@ZHmS V<Kp^9GX>q%ZQ/4pLiC69Zydt^K\YJ$hE*Rj\MuEIQG1&V5hEu=b#WSj6ELLmt54?1C5$ZDKwZCt/CDd
hRcY5Q #>nlRwW?kR8wmI>yYJ%S=tSqE%:pc6XbQkt\&yGGy*kZDqGq8t#Pq4?d6lBG%w$8=WWj\>MX%C6%MI*w
j%^Gjn w+NM#eNPtCqCmt\G9iKd6>YtKMSKV5Fj$$5ZQw:?tKHK=#9#l4H=5XMabcupF\yj+t\b#WZ^GTk>CE?G
?#ay:+ R?1QaMd!Q%P@!LdNj4#Jna:mC&e:hpwlD4jSG4eZRbYlFT!%iJcIXk?^bcdIJ9b5EC<eAZ&XMCJDR%uQ
4J8j$W n#dV\N:Qa!L6tbhWb*$HD1NqDpES6&I+9u6l5tWHGtFnb\BWnJV8jI:GylBpRK&L^AVVpm1HiE5M$T/!
WZiH^R FLL1aXNGMkPMp%p%hcLm*Ny\l5=lGLhjkX!J4Nn69KVwli9bcHBJdZ9pckXHXVd4F*9>!kt6b6l4h9hq
&Rnn\l \edSal9$NEE9:8QNVwp=jkuQPjP+HM?cm>@==YRD4S#B8=wj?WZiuBLpp\<lIpcLM>C^mdN+Zm+w5IZ6
F6>baM ebR5q?ZFd8k8RJ*bKAh5NC&?%>*=:&CJutb+uJLC=H\:BAy!t9*%N?6/S@ceJMLw4G:8<=Zu1q$$qb!h
&lMi&E &cYFG^5@<Xk@qR9=GajJ&hM&V4aMLW$@9i9ZV&DZE<+^=V#/Zu*a<b56S:^8J64#ZNaq=cAkLD+dc1P>
ine9mQ NXe*/iF5quT$\+?HZ58IpblJt@?h?!h*epb5w1IPqbq5+/u9YL$9\+8G9/qZhp=8cde>4e5FFGCQ\N4>
V@5y\A Q\N6/BFbCHwH\X!5uYZYTLQ^q&Ha55S>GabAmqmIPm4kbj>nBNHPqy*&5C:SaASBZPwj%:Q/ZPnR+%/*
uP<C#a bhQ6VP\w%@dAGu$?R5$p:$qQ&S&WXdYEEyB:c^thD#Ww/hqaMlY$h1DCB\PP4p4SRMm#>Nj9qeupjJM4
S@bb8+ *MX%!\1Vd9T#atiWNi$Ey>H\%wJA!cHD\?a!hA$9=pG?>VajtXLuZ&c>a>Cel<h<lMuyMG4p\n<A/?ZG
\Ej!\D BdB/t4mwKt%K/b*+=i8X8DA5NXYDc%y=YE!/8t4mJMKEJGy&=L<6@!m!WN1RHp$19jKq@ZIcN9ktbFLL
HIHql4 qKW?C6&&up594VZ&88&B>e>\e4!WH=#==*%&$b!Mb#YuA\F=G:!\c6SRjW1DLdj@q?\a1YKZeph<\d=G
P+$X=P m@c4twIeb+/ceK&$Iq?4!LeVIeZAThPmE5&k<h>!p<5qw*YakwnhJlh^y#ael<Aaj#iZm5YKwVB:B#*X
MCa1I$ *Knm^/^yTdhETA%Q*&jceTD6mZipy/G>$%9MkW+%ea5wlFQ+L>VlMQ*?ceNw:CBYw:jaDhb=E+C/D=k+
TE4b\m wik8NY>^bnXD6%1aj1HlttNilj\>Xy6&GjKJR>FWQjti?Bw4V?$CIM=Hc/W5*bZ4tHlmFtdM@1eG?GjG
^FqB^e hnt%^M/<iQctZC<F<ALuY+eNP4d\/ZAN+&^k*6%DuF1?5pwXy4<w:$*5Q4%YabWakbYB4MZ$?DKwY4lh
$?/X8^ Jt5/byBRiY?YYjBG@l5KqqN/KYJ<Z=M\&p!@1pZLEilZYNMcS=8::+@9P8BiN$ydI5@lP45E<yTL5kFW
yteTD9 bWmK1+*^64t^bpZbWmWZyd=JbF^$Zm&Jc5pl1qkF5G:A$?Mu6pAaSiGJkw8Hk1\n=^SPGdHKDYdDGQw!
*jR!iA 5SFn?Dhahw/89#HQbW8ujVS586@bIq*K59VklcDlI#n6bq+pMt>t6W:SS&k*Wh+^!@mG^m65lb#hKR@>
t#9i5i FH>CNBC4C:NwlR/V5YL<5R=:K/=@ZHma@Z*6Fy^JMXPlE:Tj%\u<mcZ\^%yPT%QS/A%HM:%%EmA&X>EP
&%XPAC ^m=y=qjW+H/&<YK!\IQ6HA5#AE8TZAnQmIC=K<a1@AYDKc6pFS>AG4L*tw%\Q4hE>TY^/MF%A9/qqpW6
:akm#/ e*HR=5</nD#e4$!5p>WXu\mR*KZl#BDmWh%9A&<^%>ip$kWJiiHkB@@D5nXFu*J4nbESV/jSw8LVZ6=S
*iYk?d G\eQDIHhcuL8/a+KeD+8qNLBFC^V#85kLS>PZ%VN@Xht%4H5yFVS+EPFcQElF9&6alZ8P:\I=k6\QY5E
#qF&mp J&>D9IiWJRY9/B>&dB<5bLL#c^+<XL/GK@X#a\cGK/$KB:m+Qhl1Nywyt?jp5ZYpR/k^*yn+Tk^Z1<TY
E6:q>8 ZDMqhSwLcYQ4Pe4jw?Fka<wp8Dq>JqVaL%JiN5Xl%Ck#LMK#I*Sw=SXuBL!yey?N+FD*6kF*LcHd$?^P
eZD+IR WCRQniGmJITjNMyuLIjVjyK#/%B<1w=?nw4T<Rqd^pebhidDi=taIX^!bIC?ZNVkcYiZPM1B\=6\%Jk5
FERXJR *VwFc^JZ\&Gw\qW8AFa@6eG#t5Ib5^Kic&Xlbi^@!l&MYwiBqdaSWq4^ceVt^Dew>p!*DKh1yk=*dVFP
DGWZat GX\<4LVG+8+^AuL<L\+F&#pA:+5m*8#*CF%<iZucA+EklJAGS5YC?ZD*><Qh*mZIIyaZ#IY+M:6BRSMb
lJjhcb ^^#XJKYJ4aXJ<DpeiDkpW?8QlwKCE1cVYPFX5=&VbqVHYim%YDPWkYTGCcMp+FANH1:w/AYLZAC?Ie^^
dJ=y/Y HFFTY/B\Le^YD$>e5A=Z:<iV=AeG&&HwuMbYJchc*ST!Y*=m4*d+IkV?@$kA!k@:4?WD<$GE@qWBQkk@
LcYcA@ tI<j<6@A9\IGR<EC@NB@4SBaA#mAKWXD&<LKlm6VGC\^4\EtyY/T+1J4t/5kQ<WEBPm6Y:AK&!E6RtX4
FJM@@8 =c$Z+tZ:RwJj!:D6EHwcTNG%/ua8ZTCy*h6L@Xuj+F4&lSKI14u9S\NDi4qy=G#IK/*:>ln+qVy89lV%
l@@Z$W >NSG+<GGWJZa@+!Ci#%+9@LHZ1qSIjH><uakE5N18=mXb?LLyibT1iSIN=K5BYT?XMH!kJV<\RI!44?H
SXw5<* jEDq#G+hwn/<8hX=nc*GDhBRh1ECZFMuEEEtP16jh#q*B6%$dZ&y:PNM+%WDa@FK5QWD1bC>u6PD>XZ?
NdWiq? \JE*\>L5baC#NYFM@y$m=DI!cZlQ8AZu#u$>9H=+ip5%&VH/Klyj!?JkqKcnF1?S?h5p^h:%GMGVIT1D
JqJK96 A1$>H$MWMYCN6^#F=k9A%dWeY%I^lZY5k1RJ\m=RHSMl#X:hqd+uRBhdNcNRGB=J18BRqeWH$h/Il/pm
b>C>%l ^C<YpBNTR<9L=p:b%M5T+pP:I:WaWV:1JwD4PQi%Xc/NWtMwKWQTt^WN#1\=#Qw+NGwpMYcuEXLH\+K1
@/%%Nw =e=ImYKtQuVkWL4%=a@Anyy^yeB9a>Xu%\bJ<S!Bea9h/BVLm@M^^E*JL#6EBM>yb<GKq?C5n^^uc8/X
W!AWD# 8CEM%HmLe\NYyCQXtpl?Xe?=by46nLy?TWFEW*cKl5=A8E$#q=/q^AuwAnP#6*^>q*i5?l5Dh+CL+I@V
-AShDS 000ec058d60001202b4 Page 378 of binaries2.zip
yJyNCW +MAX:8!&DW^KceY%#m1hh<l\hB9j=k6hX18Nm%uEJCutlPESKVbm#1Z:$N*=c%R+8pp^ShR/hFJW<EeC
W6YtiM ^4!hEIWXlcAFTRLNBhjZF#F8m\PYbu9XBlYph1$ZtT%6D/P@KC:lc<EL^/k!*^G^uTRnH%Eq<:T#V*#H
=%>%jm ^IRF98^?J6Jdu6Qiq+ZJ&%QE:jLu#94TyQtTl/N%n**16J#84^/eFWBZGbME#/lJ58ubWE#Ye>BRq9/5
TmymFD &njk98$Ww&k:@+=t%#5K^:ZdytWaYw!C4+1+n\M*!1Tq<!h8McYnGQe?ibyE1a>1Tm6mJH=blum@Q5MT
y\!>NL ItT>Fu5ZbDV@M=54*J<cZe%X?*MmLDB<I%654pSJdW\a=\RV<tc8#!64h$4AZ45+w6hCWNB<jI6^<Y!J
J/SI5b *6EKwWn+td18=PX4!qLa>k\nPm*CP==C#L$5PPaXaG<pLn6bDlE$q!XLkinQMa:bh!YXbXS$RA6iNe%@
PG4j\F JXy96$@BWGYbWH?&P!VLm15?L8$X%$DLpBG&>jJJu%%6kAI>ijy*ju&tV$<iT+=HBBaSeT<WmEySPTBa
Cyd8qq GZRWNhPW8N/X$:5K^j&nHyL&m%mQil@G*cFQySYC?+KhD#E$8AbFMjA865yF=Jjw6C&uwc15E=w=Qwlt
Vq=Ddn p&c=bhTy!e$iV\!*cL%L^R&R%aVcbaX11ScFHmY:NqBt6nqa><bAQwnu5WQ%@Y4JK#5ky\?$%K$DJS91
I:@%t? SSp8dD>c&yA?J5qCBH^HyI#Ry&:1qZ+Bn98>4Mn^$#m?Iqm5kRdnWwQ*=pwS99u$qy1PJNCiPCY@=BQN
pAXnT% F?66$w<uI1q=Sh86XG@iGpT6\YJBb^4>96n&8LVT/qiHlT>\:hdKX+ZJ&D#tFN**T#X=YYwt*:*%=AR!
annp=^ h6$185!W6h\upaFY^dKdRIGLmqpd6PyFH++b%<L5JL@RKnSDeipi^Z$:hmdYWDk$n$pFaJ^P=ChLijZ=
nFF:QL ::LbZIGbu&^4!8E^d%L%im14eAH*+/SNC\aInwL6GnY!L*NQZ<SAZ?#4FTCCShdZw5=W\!L#Tc=<WXY^
j?=cIp Vya$*4RFH?WW6\+K9T^Mt$P?Kw%E/TyY#w6<C:+Vbaqm:5iL!aVqkTP\!$BMPAZG<A$VhEWCNKyVN?mK
iT:>Ku >uNpd51+mHJeDE8V^TnX>1JRG6y%@baN+lLc<=pF6a*4q%wQ!?l/Jm>q>cm8@\m1VASMP/15cFEWbHe@
Ij%>#6 Y*4?lE<Xe<=de*@mqEk=&>wp9ajw5ZbQ<#W4aFXPX<w?DXeaJbe<Mlh=ZRXX5XYBl:JK@8$hRMXEJWin
@@e1pA 19SP1m^&!^4cDK?^Bh8Z^$/=iZmNN&t=$%CWh+KYH*np#%Lw6\cnQ:\1ZJbR>eNq^eK6VHdZCNl6j@@Y
&#/X&* c8JnQkQ4M/=:IijlHtXGId*?KLMFq%AmJwuqXtdD1n$@yT?kEe*H6VEDF*i44DnJYp%FTdlKa4kynTR=
nyY*JA Jk>Z\yEP5!$56/nF8J:!Tp5^Bj+X:Y5Bnlu*SHuh/BRGu?kY6XHS\VQjAIdFjZac*8ewmkZGXi<i8CSH
+lbDJS E6iG+&^E#@Gi?Y1d<u*uy>ZSYNC!>Mj6NJiP84%ZZkdmCIPP6C%M6IyiecWX<**1:qnJn$4tMwDLL+<:
baR?9W pZaVJ\QbVHKe!Y$!=cw#lC/kp>>PKd9!F/jDdNKKhBLbG#@RTwe>VeIKVHujc:q#q^jJ#RyS$NMtd=!l
e1/VjE <ZW9>eAKShT4H?p=yL@F*ST1HXFJjTAKPnw\L/NXd!lHL&#m&k#Q:qC6a=GnnamMeca*junq?yT:n1H*
:H5yGd #eKlGFm9NBBBMlXH:iQn?8m:q9RL/t$m^n=>QNK=?ElH=wXbG^\@8*6C</HMuT1D\yiX*:R49%HA>S6q
$C$Jca @Y/!*9#*t48ASmu/iPW9n!y%Ya+>>5hbc*IpL!#pjI46:A\&#6<4hc*8?=&mA?QK?atcbClji&\=TFZ\
>d6NtF nGV!K*#ZHy<Z+n?L1Nicl\5bnKtBp4MCXcnIn6C4eB9?BL>eWy8CVendY<njM!k!Yl?>kW!u<^P8nXNN
6mpu1@ c4>uQ\CN?e@/#Yiu9ME>TCjL&c:jGj:/bWY:RPNB+@$Q*j+b4y+h*jjVEH*nIZ#KWhmbd&C8IQ@NV\^L
F$Mum* $Gb9y=F8BLQDKNYK#y<PtL\e^WNI:/pe/M&QSVR=&uSkXWb+!bW#8wM5W<p&+E\Rwjmbt:^bFlCDcFm6
+/d^cR ^XeL!^Kw5NGXhmn9%%wGTQ?yE:aEQjV5TV9cS@@m%4K%SPK:T1GN#Q4kLQKN5Chje9Nn!6+1HDYZJ9<+
%lY8=n H<LEj&Wb*4*JaYNZcRccRAAGyIYp%LDnHYIGj&FQ+5dn&WRHPZnHye5S&Jt=b1XJq+VEtbqYGIW!1FV6
d&R?Wk YYV5+&KmJF4#nmQ!XuCq@VYpEJldpWEPTjnDZaJtm?waFwjAMqTyYj4?XY%GA$cuB%bkN/5NM%^=cFd=
KAXQy5 qLDAk@C5p$n=F%HS>DRZaL1IZqt<CQ9AJA++6!MG5FAeq<TRSHEI8AcSF+dSm5>cdL/SWhT!a1IwAGDS
C8JS8> !\IGbdY6bl8e=ZWah@:k\Q4^%FI18uKLP+dmkXl!GLJ<VdA4*6ySna?Yct:juL+XQEEB$dC>RnRk<WhL
Zj/u8F d/CMV*bJW*uR1IIVBTc91Ijnq6+yClau\p4>&/9mZ\St6^nVYt&aV/X8m^p+Vw/%V@I%lF+!V@9XFTb:
yt%@@1 8ZK<t1k*cKb%t9T8ytm8luSS@w1VHmT%4BXS9IM8P:c1hY8+SkWejw$^%e#F!aDJJ<NKBH+MQmA$+1Z/
R<EGH^ u>aVYpCS6Hqp%%cqttG!p+AV$wkDZDMLcC^65Yjydp*1Wp%+FBqXeSp#mEATi8#q@GK4JI@K/ie\bFYn
?jNX6V dY\InHI91Jw6bL9J\kV!NtBp%XW!u=<X5uNtuMSnGIT*6Mb+Y6qSZVwKj8h+T*Act<ID#uZ>#DE+QyIe
*%Xha4 #GtZ=\B$?lp#4ApK?/GK?K&w>Z/\VqdXJ5$1?w8>h\<*Fe!cMPXYF>Iw@>NF9tdGjY?*B5S86HCemHA9
M1>kca !=n#ACGe?XFYRMiyD!R<?KE%C\\SBCkIldwHB=Td8y5+TA1*=W#GE:w96FA4kAn6nS5YqXQVq*QT1hki
NwPIMw :u1ccj4q!dq8dYhymj=#wyRSEm+GEw6MpmItpt5yWnhFLVe%yTSh5uyVen:kSLZ$^I#dC*WYedk5BqEk
FQ!L@e 1uwIX#%Tm\qPeT=CKjYT5tCahcbAYa1X@*n+6?w$1PeW^lP:XW+DHiq=JlEW1A%=^FBqa/9LCuYRpiiP
Q:AE/h n\#1qycBkEwlql*NyLLAbI&%\&Wp6#?MkadFmuhR:m4F#G=\N*%IMh:$l6/DBi#M<+FuIDbLTk>&t>XJ
c^IW$i @I9YNVJ4\H&aiEpGWVb!+?+RCbLS1qCw4e5b^na<!JXJLPTEq?Y\#talKty4D$LmHWbhtNhHK/pTQRFX
1\@j^J bl5X<YbeY@uXB!$I+64R^P?np>?4:+\8WE!+5X:&^@9^Zeulp*/<5EtJqL\aCKdL&>\b5NlFS?!1mGBI
?@E8*k Y?%ihG%N9>w4H>nHQeSpG5Ap=6$@L\1Ft4DZ&Cu5V^FMhGEQc!n%L^/YtS\i4/dkdPXKR*c%%5&55qJK
:mcLZJ >kwbZA66nW1^e1H+JbCEka:VJhuwnNQ\R$QL6nMG^A4<wZ^!<4PZc*=ekRC*SZtc*$qe5:F:mNDS5wBZ
**#>#a %bbWVubJjCpw!!I!%!W/p/j\A*4Wi?Q!nm8tJ:%S^u#wbHuCGpC^/KabnZ@48&q#ZZ=#$<jtnmV:DpH5
hbpXba hH!#j55YBT::RSP6ud*B$bwm=Che=5clB@hS%6#>5uTHAA9eLEHdF<DRSL@Jb94cLFt<q5:liCj&uGCq
lSwywG 9L#S*K6?akFe>l<*E>Tpjb&L6yaXNQ:ANC5T$6?:d\$A9QHlNhu:RcXnFMjq$*Y+jbCnHFpMT&MhQ<NS
=WKQc* H8MDL68$+Y=RDSVjwV%II/>?Zw=>5dH<^Gm^yJTe$dPS\=R6mmE15GT1Th?^#P@lwBSZ4AEbyl4tF^GY
q81Nww BYGdD4L$quEyKuaK?V&%q/uwb1hpl#l^5&cL#&5M+Jmt6InPMI<Rl!y^a^+!@4E:CmLIhS9m5wdSJAQ\
@Fp<h8 VY8TacePR>DNWbmq\+EC>^tbG#G>5bpdd/Y@6+Nbj6/1ju1Ea+Y+Nb8Wk<P^d%yX%MiB@Nd$D4bya%iX
LSCwk1 au\ch?$J5*j6qmhinwiSH^klRA/WW=^IKFEhJPkEQ>SiiBnYPb&<BGXipdba$+cC?QN?6Q#Jd>/*&jhT
tyLiYj W9!EwynnJ:<8Tu6T=CXEV/nCM6*SR5d9=b+MZCa$&nIW?JaKBb^J/>tM+yNCySViTYeH>/nltyZKHe+j
9lMe55 Y4IQNCeuS?q?pQWE#GeEaYTXdhq$PAaEDci:cm$Gqd*TDXF&1@L\dhILutaFQNTm#Ktp#pE/TchmeD@I
ti/@bM IA/y5htC4GJLjaC*VThB<TYt4hKR%B<8!BWt@yd@!+PlktAItF?Ru@>j?k5BC$LAAlA\GAKBkCE\KAR1
>M9A%& JQTQkhZ?ye6kcF5Et+m@/Ct8p15bKZ/l/*4dkPWkcnaRA1pch1jlSuX+dAuQn*=5pl$4yJq9e1P/Gc?N
GwPqJN 8bMnccV4M8Kw+bKjjePnV6E*<ubdTudyX<<iPRZ!&M+tAhqdIWkJ\K%m4GchGIDX=*F^+\uTX+>#14LH
&m=$1@ nupID9NYTh9^+XEkJVw%lNZy^GipB##N:CalSGP+9VMTMq\Tw*R!cPNI</aAt1E+tpy6Gac<YaES$qQ!
+VS:Y# 8ZB$m:9NeDRtpljAJtpQw8qi<S9T85K\y/Fc^*P#L+D/9QSY&Vk8i@NG9yiCjiEVHtdbpTNcHc6hMMey
Q5uj%w tm+PdER8hkLGG9=pJjmWB1u5CKdmdR4JX?CceZ@i\RV&=X8ER@uyTJjMyj@/#L:I^nMjLR\AW&4qm\@^
wXHkHN nqCE:<#PL<Rcm>hImG<K1bNam*+B8PWhK>S+tnu:NBEXa4*j%+&li#>9u1+#1K$Ne??8u9jSjQ@h#T8>
w+4Yd1 QSdcFNq6/#QEPGCqb!Xu1dZknbi@Cb5+tMRV?lMi$cYZ@wENp<>VqbMD^*B4LwL*jA/uTG*H%*9Q*Pq*
cI!t+G 5yb!8Ak:V/y$yc\Iy:MIBa@l$et+m^Pn*dD8QRu&JJ?=w/CARYa4kjS$m<ZTWGNcp*Gl#hnBYh>B=#uh
^6eKlw %<8QpSNVm%&:t9Q+y=+^bHZB+q:PT8!8nly6W$FPqB$YJa8FW6NbQmL=\ELPlilR:Zb8q1kjZt/59?@u
:pTI8J KeV?+E/I!ZH51VVQt!i\9PADH6!d8AyEy6R%m&%?wdt*hNK!=Ih<Y%p!=knEP#i&9nu#enAH5ujI5X>j
>66t!& l+TX^bFVei5NX9@GJje4Aid9P:XIN:W14L!lA?TpwtPp*lu@etc+%CQFAN<=TJub1\NewY*pQpujp?N5
:Mj5V> l@L>GbKj#Ld1M<XRNkqImwhZ1VZu@Ky:VcXptE*JV6>kwqd^CaaK91JpiGFSFnhZqmKa>mIYE%n=TNX+
k!EQNu TNNNL^HGk\!c#\\XHI$^>PcQuceYH//twI/Bedq<ct>NL#FR*yFCl9?MDWu?CVVN>\1e5u+td*95m6&L
:5CG+* mB1uip6S?u^I!h/PTGIKyAl@*IQL8*1/M\ZXH%$#$Nbyac4CQjype55bw95\a@nwl^ehRHld9t:aM^G%
IqSRC8 Mp?=Yne6WWSpac\bnCcj?&@N\1@DQnd9tPdP6tapQ%FX!uCYl+bw?eiKp&Jb*$#S*LY=P9L=bIdnF?nG
?*Q9n\ #t4&yyGW6&e5^K#++*CHE+&^bT\^@@VReD%SjdWm15VW>bl=\@66LCw/hCpqJSWe%<LeX+kDayQKbE9T
:A5tPI bCXG>tR?y/p#@/^q:q55Vyh<65awVmwRHLdb:>\5PF?tijNNVpG*#\pKMd<6GaljtqCm+?SjVH*^<R8H
-AaL!+ 00003beb0b1001202b4 Page 379 of binaries2.zip
i>ePK1 y5Y%>F$b1STy4LH>iLJ!bL66K5TijV#4wXDhAEj>X4CWVRdHtbiKTbQqTi%+Jpw/NE&=H*8bXY?iZW+:
Thd^Zj YpwS&K>i\NwSN:@c1Zu$/RWtc*#!t&>&pp#EJ*L\L\RN94$$?8%iy6FH#cPiu4m$FY8wTptR$QClm$@d
dJlZC^ &8@84#BFLS=\VbVGRutEZJiQJAm4CyeCL<599n!XQYb\FGPmmu$6#<a9I1K\Ba&Zu9I/CSWtVpPj&?b\
^\?yuG D=tc$E!V%c?+MMPYHWq?6paS>+$55%lwnAkcV5FA@Y*9dhjM#eKe?$lW=VX^h+!+=eiyKMwPul%55%Rm
R%F$bH !NqjTm!@JVnTPGwmVKdjnKItN4XTmtwIbGYZL!1#1LC1mPt6NSJ5j^G:J^eQ:mXtw=k\a%B&mW91SDW4
YDZ+?q t*FaL\GqETN!l>9^w*b@6!V1dBi>#eV95>wunHpMpSNk?XNPXITY>bEE>cMkmX:hZuVKij!kduanXnYR
%CuJJu MNpDSZR?ck=Gw*GdDy+C<j!<cdKi#j$a>&TctSp!WWJ%p:FCF@%XV4c<NGiTN$ZTna9SGJ4*Tu+p^bpi
T>>qht 98K/YRyeAnatYYmR\aXS1$+?^iB$5669B?9Gt*6=<DQD#%/<6n%:@H##+E?Jm&WTya&N!T*cKt!t5diw
A:bwC% SF9AN>Bic@E+?yyS&DylZ$ZkShjiBL#acqSP#eE!%GECA!mVPL8!ujwuy9\GW1iG1YnFBMGXiTklPRE9
\qYwYT n8$ChjpH1$*yD%mdZ5RbBiM!K=i^$RA#QeK\PJb$Cq?1luwL^*I:nZi#9u#6:dnPYD6idFlLnSFV^h^h
J>Lnic >$N!k85Z^S&u8dqjZXmhNEVM&1unc&?CSj?1W8!*8%#MiTaJKnH!HZMyP^j<cENnlVp=P1/=J?*Lm8<Y
=Y@maa n@61GX@8t*/<\nT1ki$*pBK:<<!w$J?cD%??y6?@LKia6H:eB1uelj^RAcGWPCumJS@/WF>h:^FGW?e+
:=nIP8 cFhG9DV+8H@w!@Eql5e1mwuw%>c1T@1Sehy>14I*:6jml8DaG$@iCFqDdWwTQnhq4+R=b6u!VuT<yTwS
DZPKLN yT%\u8&9Mk>:PJ?nPDy\B@#P@@#$95\H/9@q@W*ndBSJjaXhu8HQD?<hd@kln#X9e1%8it:<J6l+9Z$D
mNwj+d NWLm?PAKkd^CFEcQKGDd@b9:+l^@*TtESQNt+<I*Ry5!1BKn%qSPi!XFa$u@?+9FeZKKWIlS=*bBl&L#
^lEbuL m!Fe6GJnW:!4\ej\k?//aa@lIj%e68XqB!N:6eLXqNW5+>T8taJjCH5m#RBVqip9Ncj?u#<n%a$BDqIP
6P9*WN R&=bt:5X$pd#6iP@n$N1RJMQ?C$1R@N*R\+Qy@HtNbNkqa9iEmQdjjKW9L$LVkN&WMZW=EqqBNm5Jkeb
$lN1SG :k@8^\&9D4TZw*<Zl:TLmp+jC9uMtRNpN6E$&#!j68BDGNt4eI@bGqmyYi!j>REKBW*/ed>\p!h#*/ZW
jSFVe# m64#<uLSQ>:#PN^ZZPYF\jKPIkMQCbElN%#Y5dKKw\p%8RT<Sbyqdb<WD&:CL>TB>F>b::!PWdkekuSy
BZnWn< $+eH5$#pa#YaPLt5!pdL#lKu8>MK\SbZiYanj*kmDBL:qd$a5Fhbuq&R5A>Db&%F:q4V!\lP^WCEWbR1
!c#m6T !m%PT=56PwqD?9G8Ep1B>Ad#%w=K^=W4I!A8+<bF?T@*<P%RV5PW%tWJ1h\a+AMHpCjip*YMwwG:+RFE
yJ!mP@ n<CcuPCq1n\9!/*KA6mhaXa5^=<D>HqS4BLI%%%&iPPN4qD5@4lm1HGyuiNceQM+caLp%SNyRNjJYyjJ
mTC<NX T:WbSX^BQ<<6$9hVWHn=1XXq@@Cmp/6FQ>VP*+ReQNc*uQAFPb*8?Kp$DVPuYm1!*$1@J/@F\>#FA@CI
pnlbp8 u5tKZwt9u6X^@mwJC^=V5%L#A1qFutP!y^Rl?a/48C:td&bFp/d?Ap4iaGGu*p\!:+!$9+B99+lZy=@C
*\?9Wq iGRBahdnpQd%1ITJKWd4kyn9/SEpiAhB&=^H%VIXJp^PKYH8NXlha:JPk!YD#IMXBZ81^AQTFiHCBG\R
h@Z6jh !G#iPF=P&DZydDTXG/b!<mRhJ^nK99P5lb>lWT#5XZuLZd#QBhTcGwpY6SdX+VNBuIHhtZPLDu!yVl$m
kX%Vp/ FD/!Z/LwM=Q\DMt^my6VFIpb:>5hT4e$YuSI!CGM4pQi%WS?u!bpK4ybPP*paGKPw>$<BJLLJ6<Nnn+Z
P=<ky? ZDHcdB%Vl&w<PEl8Y=/n&#^^wT*Kaj+WHJi*Dd?E1cu^8P=#^LkQnQq<1DJ1A@qMeNwFZem*5%L5uYd5
L/kWt> M+tG^Bh$cIwd+XHX:+@KIlw+l6cktP6YadJ!+eJ!tCqmwdk:N?YaRahCl&Xc%#uJ<MDWE<+AF?quu1HE
6pHiNQ ^I@5hhd5h$T$/Jy<GHb!WR^CGA/cNh!YhZI9eM4jD6lNkIm#pLGKnWH!L6J4w%5SMkSwMkY4</?bt!m^
TC$n=Q Gl1P:e<qbb?SJjV4eDpJ6d9Xcec5%NjT%qXZ^DWb6X5l5:l5N@lHIb=l<it^nJFP/M!SDd$!NSt85i9e
DVZPP! buMKF/LdHw!#=SeY&F&=c4Q1RR:T%5\%1V$/A$FcnJbeq=/=P\e&Vh$>EcmK>Mj<pWbaNky<=&n/palw
<5\wd% VpMm4XYDPm9qM+e#SIa/X4Y/%4bEBD$ktp:FEn8^b%*L91Eu4C!B?<T6dL$u*FRb/HM@ZiZe!IeKQCb$
JeWqDD \wW!qyt:n>d6YelM?\H/NYEN#Pbat+E81@wyl$LwG4nw5ppM9F\i8aB?ITdIQNncmVj9JEHGq:<u%nji
nwu6*M d@Q$DcTTWWy&qd%pC+86^tFWpV?tW^\!t*9#F/CliB&?4&6NITmj9nbk=A/bMt:1A>#uk=l?G%5<8EZX
A#V&:P tQa+QT&<W!:P+A@#MhqKML8>Pb/I%+ItL!qdtjALu#AITI16aR\IY%a\Ma<L5*i>SdN!KtkT\BmYDCqa
D6#Dwh R!<RC<Fk/#>n59lpbhpmJEpwFPw86Ak4K8wY6I!^wk<SRt?nH/SlcQEY\#!mqe^k*H%u+^%8$$Q/%wL+
MRp/hd dX:5&>5y!!JeSw^8Y8>+AY81N&qPp6A&iEMWKpyJQ?>Z>1NpjSmFt$!y<=+Kj$KM&c\N96uBZ=t4FTp<
$k^b1B RDmu#PL5X/amF\/n:bIQSI4Je>dIpDp^\>&/I?cJN<+Q6ewld\?1Hud^ZJpi1^^$hEiAc9SLtK=hYXh&
$!w#%P /n^&+HiCV%=GZA8B9>Lmy\@6kCi@nSQ/:8:^VQQW<Nq1alN/\ttQ>C\l>jkF\8!p6N4Nd+wEDCj??P^J
KlTFt* m=ty9ei<%GR%=yw<5>Di@I8bkNDbVNC?pbi<\!J8qYC/jD@cc1J!%4XWqZdV1>a#je#TG$kKqLcXW<Sq
HH5pBJ HF*++jPSIlT#G@/S5bMweymukP6$nnCNEK#G4bZ&4Fa@k%&T<a!yhYaymFq#?qLqqAaHEeHT^e4ceVIL
GRbQF5 QCWtRlpQqa$j55\:\n>Iw:M15B=KQb>t\AaL<GH^$CZ/AdCGj#ia4c68SWi1!E^P+Vlh<E?!c$Y1^b?a
LQTNVI $nIYiuy>aL1BZhZ4+P51&qD+aSL#I^Xd&bbL!c^Keic*TaieP1*E%PkjQljpSi@dtlV>+etaCp#piq%t
c8q/Za 6Zy@a5ZZ$TZk=Y4da:I$L+Ppm=nTmcX@?H5R&NWQpBq6n*YmG6+/nu6u+XnuwGdNIp!^hT8bb<Ikc#NT
t<NTE9 +u$Em6ZN5:HtQmeTmK*RCD:9m9Z=>TytIu+alD&IqWBK:/mmqHDL@1%bBX/8mEA=mA&VBhyIETc!V<\&
nXKDk: ikKyFE6m8V!Z$>u@G1SX5T#W9=F:B@qY/4R#9wY85!YF8+W<WANXdiQ5Bk68Bk#<MW8+@plSVky8nw+@
eBSdqQ Wm!&iP4L?+Mq44P4?T=XZt@jJl^q#khchlmSI#R$b*&NFF*J\$RySJ5cG4P&VTq&jmj=?=*MtT=ttYdB
>6+/qP #dM?jl/lk$p:dp\6Xq=hVN/NuK6Nd!4ASBjj=F=jHIBj!J=u=L*q>A/TFkb/XFeP8Wn/SilYT5#1!X9+
GwJ/qL 6!nMZaKBFbP+#at^CEIw&aMpb9XKL*C8?dB#YAaZ?qTCmTc>l8=iY++$<R>=^Fe4FmyWl4Icqw:Fe=t%
q>C8b& adIJP@Rl8e\cL8JpZmWXLB*aJtRl8Z$eVhq#%@1!K:ViqkPmt>91T$yE%%i5c4Y!EMRRE&5+QDuBJi<R
^@pQtA e%<bc1qbT4tITZ#Z!?WH1X&$RMjXuh>&nn$=K*+I+QJL^JANG<QjJ1:B^=@pHiTWNm664QC:KLbIK:QQ
!Ai%^R @tYTwS\Y8^?B%wqhXc5m:j4iD\>V4XmuZ<VwLpK*Ji5Y9PIkhYchHae!%H!w\/TemZMlG>9BE=Ri+k\<
F!%H$m %GEH<\u!<@L#<@PBBeECaDBMCCwIAWN=aYAaQ?T@$*1B@#8=@%j?ESnML#DRjlIcPaNFJ^XLZq9*!?JV
tk!4A= PL/cAiWA6/MPXVl?nCXlHEP&DyWAAawlaYh>688MHQ4:pM5BXQE&TkYmJl91ASXS!VuaSbQ@he5F?8l6
I81=Xi 5Kwm=$Ni4V>yI1C*+tGRFWjypykquuk&5:!Pj#$GePJ1q\mwHb$M=l!V=wC!+Sp+bNe%ak#RnCe$SEB+
L\5@aq ZFcVR:y#^ntqS<mbFEbn^N=GjqHKPutw^i/V*=EPdyuHh1ICnJ\E5p5TX8SXT6F1m4GFe>F8W+jnw=tR
4S$+tc Ay%JpKjTDQ#NFAR\Ww9hIbAtalXGX@n8FXKm!=Y8W\QpI+TQ:4Q@15%=&JJCh:HK#RmTuDc$$6!4LCqk
l>^W46 kJw5Ta1DEDR*YhFS49qdVWlCSa$$n$S<=Nm85>YNnHZpM?B94qPncNK\wTWjCjd\yB/kb+njZyw%P+:9
yI@^d? 9QCRw&nY&#Nbc=ylWKDt4ntkZ%uQ:#IVYF/M8*TwI#@\*6LaH6cJ?jy1h+uduXTZuN4LY@CHm8JK<:6Q
1#LD#j J^6:=QDLGFP#:%PGL+W4bllwKLA+^M9D?un4#IMZ1^/VF=wyK\K5:LmaNV:Lpc%bpIKCqe%j4ZVEt49b
jMStIF kT1Se!a@dbTZJ+Y<CkuZmQBQ/cZnNn4PBh*tpu4pV9c9l$#8i/#jd/lnV!:I+dim$=nRNWd+nSaP/:<a
eRG8=p I6d<$L&in6i!*5Ky@CGy6Z=\VAiVJ9h8@6%Hqh<:ZX\/DiXP!twiB5:ANp8l<\bII8YkmlR<AZK?9AtL
M1iDb5 =S1&PlKB!+VtmtTj69/Ap18?J^#/@md>9PYn9<p5j6!SSb4K?$V=Ty>#inL9<WqlciqT4#%8Ld%b@MbH
P:N!4F +/Gme/aZe=lEDFXCS:%?BdLK\KZPG&Mu@bp9Bj=^E?Jc%yhQiC?dW6e*PdEECKZuGXuPuHDLm+C8jQ$l
!yuN#a 1SuJiinN58i@H\Z/l*$n^dW\qhueMq8wdQ9%9@pwQ=N!yl9m>SbSYbimdFj614?kwm!%1%i::y^V5<<$
$QYWP^ IlJ\<!&nJ5hH9L+#hYDPa=ZkVZly/e=4c=Q$R!\$maLB555F5J$*LHB!wmI<JcK$TaM8pESn>HRD^VMQ
&ZwM>a F6Z5^hFiC#i=Me+PTjH?N8qdlP6YZkciM*NuauR!aX9\p^D5/T+R^+&T6?Mhm5L&!PjaV$&wylEj!H^6
Cdc+SH AYcEZi6ZFuyt4H%@bEYIV#A4!$X9>Gd&A#*RnLP<LptNV=<^PVdqFiZ4Yn=&be46@dRib<pWa4B5NPD$
Q/S9k+ p^jjqc>QNuQJIEGq+*G>bDj415#YVBVJamX5$5D:HZIh@JLppNF?dX\LQ#qSaGnAchE/&%:aVhkAC&YL
w%u&1l Wkw9!&V4lKE+=PC4<wwVc>/mZjLmRG?GFK=V1uwEw*9FF$8FjJPGd^yhXqa^d4MB&=PnZ1wTWmK\G*J+
A:n&EI #a1DyB!?QdN+9\54nZt4L4AF8&t$uG%4DybYXY:!qh=@a69ZElMXc5MVTwyA^?aT=t\TjwW8V:*L5RSy
-AQXCE 000a9e578e8001202b4 Page 380 of binaries2.zip
pLKJk8 P4+j:FnHyS1wh*RIc1H1Mb4WpQnkhFiPyM6LZk<8t4DndJ1DyqlWTk\!t4qIh*>S%LLJHSiQX*!GeS\Z
qH%XZV DY*<%DdmNh45pQ1mb<T&=1IVu/X6TP+A$9n^TWcd5IbB#eZ+LAqR8d+#!Kne4D<*Bkw8tdK#etZ>ZJdE
\VAETV DEle@8+WAJi9K1aS/Y>JnF?n>^l?YP*%LQ1hnqQWGZeF$#/pGkQJcH8%WtX5PL4AqkaJw#\XjDZ/^Rk9
P@MuFS iq6FkaDCV?Y:tByM#!LNI&:m/BdNByI4?l/J1#yic<K9ke:99SB5I\bh9?8wBMP*J8^u=9/wGB!@16*#
EHR*t5 GhaVbkSTR%R^Z>kV=kDiBE%5PFl9h:V$H&c+w>N/AS$iKdKpilah%+!%m><$LLNW4FaN5X6MVbC8Q^Tp
YcaeGJ wB5QE5D!TLE5E#\@G9iL>Cbj4>tK8i/!*<mlSu?RMSK%XnwPb*lRQ<:5m4jlW/S/F<Y:YTNdEKum?YHT
T@=MZt %wNTb8qn:lV15B$d:*ZS$$tcHT6W$BZ5P8MHn4p#EMepC%9dh:A9yPhZ4M\Mw=!/!<RuM+^utXk?6+ib
\nE=?H J6C1h^d*nH\<lwN9KRy/SJSWnlSw%XPqJwMDKB?Zc%&uVDV/y<&1cDwQj6RGBE8#L@I&!NjbG:l5Gy9M
un9?T# CXKtNB6RH!SML>Iw>6TG=Pe9#^^>=J&X=#QKd@weLBJ8CTq5dcH9+**@yPyp>?KaeBiJ+6?=/$\>F6Am
4IpZ%: kB>XKtK<9>=RCh**uyG=w6#9H^u%9u/8Z=b?GD$+!nVZ<@!^/Ec^=/nteG=N%=R/@PXKSYGN=kV$J*uP
B\?WFQ +M>IYZ<Ii?ll1lH!8?#INWdJiQXk9cc>$w4V!>i9PV<cIW#Ab$Tmi!w&%y&wkdy>SAy4/BlP9m>IKQ*X
yV8!Hi G>lewTZa@T/>8&$?pL>+?w/d%pYD@9FM\4#9bC@4dC\6uBe&twY=M*5b:m@yFGSd1$4SmBh&ZjTM<JIV
m<<uY4 6abwJb#>HiwS?>JCTeTeaT/cE=emd5uKC#hNti6i+ddubR<uZWI!GJP6EXXjJ51k/Zn#H6dy*ZGNbBmN
a#1:iM RS&Lm9K%qJ>yb+pJXbpnwV!DTlW6XV9>XeICe1mHEp9RA5T54w%LqajWKuq<Y&QltQA*@BiNuC::6>@u
=IVkFm Fq?GW^kKD:\MXQ!!bJC=tj%B1MLdki=#na8CWKZbVV>Q6L+6@wC^u8+#?\>jaN*&?+hYXlG#G*\enJ<Z
S9u%8T Y9JKND<\?umtNHbGGcNKG:J^>>JPQLPQl?V\ZH@Ht#&1hH<cb8&+BQT4&P$=d<cGtWCB\=tqQ>C1j&M+
GA!+>= 941Jak?K+4W9u!^*j5lJFE^F\A^\>\+taYq1Gma%*wL&Pehl>CiKc58FXN>1>iwG+#?h^EaQ1HYmIGJ*
9wN5&D t#npYAX5QhWTc1DAG^PHSMDy\NiJKpcXXBtR#6h?NZ#Z:814/h$a?5C4:*k5P+JH9$FdB$@anmA:W5Dp
VtwK\$ ?Nh??hG?y!AAB4T8+5>RtCJlqZXwtCpSFwFhwN+RlnVZGdJ8FXS4CmRW@kG*+mqWJ$cpymZiGctVl@B8
m4RZ5F /5>A>lR@k@I&w#u>+6YyeRqu^!?a@XT%@Cb=?a>X@BWJt*m\8\pqT%uaVaE>CHRFnI9%CP=#VEjaka1G
9X$>MY qb%V8j$kAIA+wLY=QZwYREl9Pe=l%S*%!Z@HJkw:H>%45V*D6?9J\P:Sa%XCQ:<S5j?CL4/bw$m?/$AX
q/4@h* etyV#&\Wb<e6/4lZLP$ncPquGTj8kM\FDwX+eJLYFF@+8IFw=e9ySlQwYGQd1=#yp8I=w\@JtRKFJ@5E
VBdI$G dR*?nQ6>H=C@WRDE%*5&^nw#VFlJS$4K:q>W^Y<i>TNT>*!AY/NVLPHMW#pt8/pK!c:&N&kQVpHaw?Jc
u@j6CY DP^MT9TbmdHLmSRuW+H<b>IY8$lhAm1QQhjGG4&j>e6=GnY*M%uItqWZtWX=qiYl1epD?5qiS468LJW:
@9lc8: F<I?/d/$EpEC*5mHl5T:W\d5wYGuwYu?w/5H1XlnD#SA1FwNw>p9Yd&d$*^Gb%=>upT4\=ee4GYLlaqV
d@E:M+ VmjJ6Hc!&AWP5TWI9D?LdFVT@LT@HA/?T8ZCdwW4c>j@&LHKw65JPKZ:H$4Pmw@?6Qd:P+%F^5dB#+Ke
l#aH:< t#NJ=q9<e*bt\GnYY8Vhik9eb#aWIGlcRNh!hdM/Wdhu&?NC6ceFHV6qkMb\pV4hlIImnjS=SMq:S?8R
J@+9CP !Ajj/BkAe%BKcD6XWqZkhX&ytp@P6H@ekG6w<SKcT94+Z6Md1#d+:laLtynb:k%nka4!IQ/ADC<<MXyT
^!tqaq m6XMik<DFIp=*KBK!151\/$8@a\1/T^inC/BJ5<+MCySkk&HmPL8W:CFLt4V8=96*hDK5KyBlPGiay1Y
D&l>I! #+/TS>^VVtKa59BBbSWdDQW:jICpwKeq?jFl>i5>TIWDeYZRKNCPZla#681kK1j$ulW>6$QyFRRJCe5d
WNk8HD ^de18wn9/=C=<B>GMiqZk>Ac?Imj!T9uAY9wC&hnn+ht#RCaQQFq!*$Zk>LnF49i64duIubq<1yqw9!B
Y<=X$? :VLuqHJmN:mAGR/H^QwK*dJqIA>F\D&XRRyMXBHkQYABm*$Y5jI49>!b^Tcn1/y!La\km?!ibw6lLYtZ
cIH+Rk 8:q#+pIYe/w1DNHI\J%1YMK5I>KW+9^C+8lqdIXZTXe\YTBBiQG#I!u$pRW?ePJ#bXK=?49/t!p$cF/b
>V^JVP c<YqjKuT8e^4kl=>4dNi6Wuhp:/54hHKCeu!Yd>T4#mKe!qYh*$Ytc8MWn<B>/wA4B:h4bQ9:uJM!c#&
qF9J@c J/>&NM6&c9&E*R9c=b+ub^l9!tlenmXFhwPpPc5iNMa9=j?EPPD/JPp=SDJZVwwN&nE\+k8aZ@9A#wbn
\J:dLy :GCQ@atBhW>/Fb/KM!$iM<1LetehIQqM^uLGGan@XCFu@aV%k$4d/AD?k:a>*:!Aw!6::dpDbu\!X/pX
DkP!ql $#WpQkY+c&&&X%jAW5XW&kDc86BjqFbIF+NEQB9a%Rua459#Z5mi#:e>LK:WdA&NeIeZ8iJQP\wY:$PX
$npmtb WRauW&HZF*?ma=EDb4VnKKDDehh*GEtN9yni$9WQF^$/Hjltq&=a4HIabRwjeji6C!p1+q^%Z+$@>Ayj
N61C$! I\S\5jiS$puwTT?+a@&J1VEm*uDj*VnY=QM+1LI6pu<+V@R:T<>M\^XbINKiGq+qmbX:KMeM*=PGtt9\
:#H5Tm JYn5inB^PTpTC@qmt\Hb?=JPAN>^dYJ5!dV5!qJ*%dYP9^EWKYll?RqcTmw&G@mttRniY\nhQnVlQ\4a
upZe5: TWM?P85$*Dn?<DS4?CW<94XCkkaq\SLe%Wq8JILPpbjh8kL=^Zy?eJ4eWmWk5#14$@<A64bJSMQ*SB@L
Ea>MGj ZB>\*pAG<6\nbEey=I^4l*/yQn1RYEHN#GTJ1*\$*SRS5ERy<L9LRyhlJX!qPG>*^icMh&BH1RnY$/CB
:Kc8j8 GF+&>8RM%8mW*GD?A4uD#?cec?>K/$Y+MpXmuTK4S\YeD!LJ1?SCXb+n#V1thZ1?VXy!%ylml\XP>GQB
^yIAbD 1=+uu6awPmCkipLCqRDYk5N*^DL:F!dXiheDW6n^LNmQGCiHndwVPTY&b=i^EP9Lbylk+NH<:Q\S<S?6
$#:ia1 4dMbXPI+T/nZXID%5ZHN!bSk%#P@N!b\JQJF6yFu#!@^eiBeLtbipm54mRAF?!AC>9^akQqwXmJi!6+Z
YDbb91 EE:!Bn5XVSD<L^&G\kV?h$R9^Q@jN/jk@#=J@X?T#C9A#!?awYpV\&LHMd9B5F*uSFZGG%1SYt^*E:LH
%4d$#h 4DmAB&#J:&I6G:h*QA6tt&4RKeZm6$\NE+wd?<R::5GB*Juknu&KAXD%VwhpyLS/:D*@jl5=!*4YS\Ya
kw:Bjp VB+l^TFAXiLqt%a*$BpQ</DCQ:%*JtqM5kTDE#kbnXwG?:tCTIGFmZ*CtF#CV\MN\D%XV8ah@p8WLtJ6
K?cwud BWkZZZaJP*aCmqqFXX1p?p9M5WlEZ/RV4SyEy%1J669WZI1*iak>!IpW@>SD$^>KHuL@+n55qJFTXBu1
T4ayS4 TepY1:aMM&*nnP#GMXi&6?KScQ=wWNiG4e:+d/FkWn+<\^hy1^ul6Sdj&/YNjhcCnECXjXRSBKL8X%W<
9N@a<Y Z&c<SP**X^6^^ld8YtZGyaVw=tP%bA#nRwj%E\jeh9FwhGc&4M+Gaq?SWDRtF>tN<*nn:1abKuq9y*QN
:jl8ZM FJJV%LWWihnWTqS1j4HtC=thBApGSJL1/16AKIcTJjP/Ri<Dy$u%/b!M^1$F+mKIwn<PI49QW$81cRb<
D!5AFE 9yK<MK5/qJ!$91t&u>*nK=S+hW8>bhkW@pduchKX!IM8y&!XYwYt9%YbSbhJP&Ted@9q%Yb94c<P*hjX
+>Bq1= !pQS>1d<V>FjQdML?cQh$L@TWG%bSulWAk#%Dt@=e^HHnpCGZDVK?&AqQJJ>Ly4I?Xm>H$YkPIXIk/G$
XX:69! BdF9lQj/Rkm>Yku/BuG%9?wFVi>4^!eB65@W!??*<BM/$Lm<4*=El$DAkPL4F\X:8DR^69+Z&1p>QY1V
G9GuH6 wBCEuXPWS=hFh*!Y^t5<8m<4>Sll#SwycV!8WR+b88M>@RZh:/c&LbBp4nEF:%Nh!1d=BnA919WLy\L6
V=m#J< ywZ=iP*M+bVuwbNG9F@ulEk6%qq%!tJu/\VDyqEqPSZ4Y#C?BGu$LCa99E6mG^AVbMe%F$1WhlKqw9#^
dJB:&& @F#aiTq6A!J1L<m#ST6wqw&qP/?#judMn!a^TkD6NIWW*ASLcjFEDuTDj%BXY*X$/6Yklw=cW4MZK?GE
bbBjKL &ZYwk+6@MwX/wHICCWuVG=:4#bLThjddNu6?i6H8u:YpM^jjM1#awmtQlD5Nh=n&*N^n/FT!c<Zm+/HN
jmY&Qu 9YdK%pRH*mTqVMwcHP*5yYiXXW*^ClqXM&MMiMP@nFNqVwB6!%k^>68wC?Zw+&&$PNNwl!qW>l%/%n*N
Sh94T! WuC5&NFKEqYK$ZQ>PL6/ANJc*!&n\1II&h+ZpkMT6??\=DlIlh5\a^mCM@%^8Ec?wh5ajdeIJ*$@wY*P
/6ak$Q 1aMGW1iP$m8lw>LWqVXn:XQXcWkhtLZ+ybIyamkjZ8*\Ryk^!SkQ*Yq<Ny=J#8i:Hk&DZ1NZ@eVNId@i
Bj*%SY !%eqL9Mn<$86Gt#&n6HX!\PLtXWJeA/l@DK:JLyl><:RbkybZu<lcdbjT>+*+WGl+hEW!%q!ZF#X4AYK
J%t#IZ R9JAnuWEa$Q5q&Y#hBPeK&SaRGGZ%&KEkS/4AqIF<4ZI@nX/nuah:@XjeebmY6b^D/8b^=<pDFS@iK@%
P5n\$b :Rh$CYt!4W\^CjZZDiw$CR/mIT$6B:IWbSP<K@DYGHIh81FKc?1CV@X^!e#4epyGC$tiCn4%*CTely>j
VbPA<c wqPaR<l=!>:?bB@XKi^J5ebZYhuyN^:n6hFX*%GT$SPnNLR+nbP%Pj>CEXbhZ8WpjS<&IQHL#&&^QTjM
Gm@*Aw QYi<>=F#:m1WIK<thp\Gc#J%!*QZj4CK9%k&h=jV+#5tCi^Jk/$><5\VL%tb*awlSbP\Z6A<iFC*<$M5
hA&#=k Y%/y9Y^XildlZMpj\q+Z?hbtJbQt?l66W!D\1#=+$>+p^4BGT*lKKp1eYk4IJmMRd\jPetnQ5QLty=&k
NVGVP\ a8VHyZDYaQC:%RRdL!69XQe@<d#49q1u?i:i:##L:iIY>kX\/:cu9YYl<!SJ*la@^4DqHEe*QhkC$/iy
1&TSPN &cD?W6%k$Y8QZ1m5!iem%Mhl\&w18b&YbXh$R/%4RGhud@m=Myq5XC9TL/D<q%+=$Q=+T>k=1TBbRhwu
Q5$m#& lptH9Ywl4XqYh#/!9eBVVmNt^VHTEJ^MIX@PB=*AtVlklAqFq!Y^y>FWKY/uYT+>d<b5WBh=iuWZCHX!
1ih8I< @VA5Ka#u/qMM$<F9q9wG!J9k+=c*$#b9j5jc1!cTGMy1HciuBXL!epuyC:DJRn*e<t9&YltVJLHdDk#<
-AAlFb 000c527a2d3001202b4 Page 381 of binaries2.zip
qa4kAW tSKu?MKt#/DR/9NX^WNjj!nVc8%LAwu$5iyF*@:W/>&a@XiV?X>M<dPR<+Q5mZ*:XEC4FetphA:!PwTc
5mQR:n 85Ha^iW!E*:q@Mu>&=e#Hk+=#<*%jwP6^i>nbZy4/mWH$lb%YP%KXFBw/M>L1&P>?CZcT8!N*<T>bi\W
ERhk*J +yKPLCN:ES+A6Vl=$:w%TIK6@N6W8j>>^a:LF*LImKta*?!Mq:Wl=huQ:@*?dTXFk/$bIk\qlMw/NZYl
AdnCq* 9M5mAL@98iFP5K&CT@bj#+GPD1:tDp@y4Ch==^XR=1DtH:6CVe!plQWL@BRTZTNaFwV<ZWISM>dN<<8@
t1Sd%m hmpTTiuIqStWwmui*@F%*mV^!eVei9%l@Tk+Q9CtP6GW9HV?=>FeiqCb:eC:t+M6uHa>X@eHZB>hII9X
J$cXGi ZR#@R?mEaQGQXM\F+>N1H@<\eaS+Tb!X9==%>J+LweF\tA^T<RQ&etteJIl&$^wh>:uE?\@mqd455?Tp
I+da9m \<LpV^SH?YYW=TwXj:=1RNk\<dID=A##kqi^:qAqipX^tni8Bi!<6?F<qPiKkq>V>@QT+RK*EQNdaA1:
!w1KqM LC89eLh6=CXuS^PGtJ:Tu<:+>TTPdn:H9qw#X!/#Iq!Z^:^RIXRAcThG^jTE!95>w&SP6iRanPqC$iA!
h&Y:/8 A<lApX8QYbl<Rd6nq!IdPZ=+56hWwQ$*@?^TCnQCIt/#we+n9ekS+upqD:Tmk5@V&QGSab\MXJNKydln
b!&>@B KHZM8HW5P>@bD:wuEedDj9Y^<&bP>/klV>YVMYmKA:YM:1=^#6kPN@#^*<q1%JK4FwQP5=^Dq%:k69DI
V@SASX HHAi>QDt=SYnQiIF1TZ#QIEI#haJ4baJ:R4ntpKujac4F$FDnT@GVMB8Fp8$5/Bw1\>Fj86I>Bju/TFV
Iw?cI5 5e<DMF<PTjeKncA>w>&DRty^hVKpXS5ky$+?51<<n<e&+LXDY#!G#%NR9JP/6*PC#TGuHp<!%XMb&kaR
:bphaM aWZ@KM%wnKG5>nelLH!4DbQ4S5uTRcqwT^qFjCLERLWaZ*mRGG=NwZwM+bB!%Rw:bC\M\^^+yaymyCyn
%Q5yyk wG:b!nTI#ym5DHjZkBMt5IRt+?:VmP#6cEmKVaVp?IhkcP\4T>:E\9P8IJwD=FyMa4VYmkLPn\\S5>wP
:1&iQE S<a&5W&<AJ%^jZIq4hEa<nd4C4$/e9/k!Q9mQPDa@IhB%\%bDL*BSF+dh^b<1n<S<WdmmN?5Dye!!%K:
A>Qi/* 1^=!S#KDy?SZ<&Bk>DwH1^t6HW@!VakV6/KWPLjb<kccjI@htV??e9L8$j\6L9cpKS<?:b<nt\XZMW:m
H$Zkh9 Scu4XFhcniBGCI<VL*?5Z64=KhWa5$X<SSL:D<FEH%$y\eW>w%FtAwEK/V+=\D/SqSZ>wqtnV$>+#jye
ejiAQy >&uRnTeQK#:KF4BKkuJaV9BcYS?MX8elG$dwq+dPJ?KA$q9KI<LADl=/!pV8+ieN/CV94a@6ZX^>lP*I
$KkJPu Zpd><YMdJtCdLDk8/EkS@tmLIXhl<IpFZbK@uV81m/h<<nQZNKDkJ>aIF*@IwyPW5I8XR>GNGC#WTcp@
niGLXa t>%mV&B*mhW!>8&Y$Z5NA!FQF$:pqTDtIyPek6^8M?6NM4!9CXe<H6/V!4w%L:tVl+F!RY5Sm=MuntjY
awB<CJ \hw#4EGe!hnp#+tGIRu@wX!\J&YBARwl^LWk+pB#=BkWb>&Zb1hHCq^SaKBDYNHKJCF=4L88!GP^J8a5
ww><w= 5NquTlS%ELwkhmH^h:^pVF\h^a1&mekmLpi>i?p1QkbFuwm<!dlFtikke\+@j:K*tpYSh@*aiw$et5yW
NqX<T+ M*NXd5^HZPj59N<P8M^KhKh1Mqt8FGcK#K5tLiQ16btT8X^eiY5jQ:BHcC9+h>lacppikLF/$d=Nt%ud
FYycQ% 9?Sd9E^=K\ua@D1M^6YQT$C:XX=GNeIiJEj44qieILyLZK:T=PqACNtF9!C/RSVmGbdLebh4jP!bhB9P
pHJcF^ G4K=J=Vn$ycnpA&VdI1?WT#&=LLVMF?+==X6R6SMtF>+1=bLHpK$XylQp4#iaFRXhMHiatJXAR68dMET
nLQ4b? 5k&!cy:QKlwi<u6Vek&=t6cw<lbmVqc*Nqwy4Ku?@5tGdJm9tZaTFLZKFij4&CG6HKqjqEpHqbNLLDCG
:Xww?1 9/jPPnDlPRSJ1KCR1YnWcBb/eIJ:6M\<XEMKuC^n8MknYSh\6ch#nMhjZXVNVmpNYHM^J9GMYd6LC^DL
YKuAAc <*l8KGAT8ql<qwhmPajPMW9%P&*bCdM$5^B:c8wCWVW?YC?l%DV=\PqXFa1y:c\XqA9!^Mmd&YZ+tbL>
Dk1C8W NJMdDB9cdJ68+D<MQS+KABcj*P+^Z<waeYw5B+@4Yb=1BSe!l$!Vi6P1e=Ww+w8jGVBkT=6XBC$ePR#I
a>hFQ= +5imjPeF&^dYeY8TI%$YeCJhuHjG6XIam*9W\iZMHcj?bm\EJH^556nHSGwL?MeF=bFhE/iLM+/4+$Tp
y5\+E\ $/Ecp%!p$c\FeeeH5uG9&6&+@IAZHSQkcLX9kAu!LPddkEj<>41LPwEE*Mm1yB+:@pn9mNy!pHl@TIpH
e18>mB #CbMDEjw9a!^ANM/j6BF#FC8#Lj^H*Ge88QSM6?86jDM9tMFM$@<qC5i+!8H@G:<5<%Ndm9#lcQEZ/YG
R5jXJa Kc#@G=?>lK>%Sd95^VQYtjew6tXE\/we:>=qLp@$#e?F4CCqitMyRV\mc5%c>GnYwk\y\QQHallFLF^T
tuV?Kc Zy9k/qK*Zd$/GKTpnw>FPQQnbn!JwmeDdhCi8GtCnEn?!DpGQYDT*a^b<$MWb1JiZ%+cyDJt1*Yb61>Y
CQky8c Ww/HMG\@?WJ9!+ZCN/\SeYp9pZA?!%hc+Hj?RVQB#uV1La@tH+Dt%ZYb^9Y8EIEht8+pdH^a&a9T$#\y
IuDe?c ^+cqt1A++wQ:HikIGHhd=<e!XPlSae*Kq9b6MplKp!!B<Mb%nJeZK?5$Q#9B1k:FVtbFK?kT8Q1NMKT+
THFKVT JaXQYMyHnZPwPwCe6wWET=^NM^i?LR\BceML55bc5mAccTldH&Tebq5@m>CPRm!YZC#6?Q>HaKH@GAVG
J5i%$i D+Z<c@u=?j=n@@%&<X<8DAHZK&Yla&DZBa<B1R1DW$1^!19YSLAdLV8IGBSR!#VaRcyQM>^9uF^HE<9w
eqtDI9 /Rk4iV5u#l+4V8NS=e&8bT>&+#hc/YLN6tB$&h:5tGA4V$1F$Kw$1N^hud1!EAG%BbWetyLP@C#Z8Qjq
hcyPM^ 5ML:kVq6e@F9YkKYcdINYuebcmIRqbi?>DA/<h5ZM#8^TchJ%w59SBQ+@*I%Pqw<9RCaN$%@uZb!LHt4
<!NAC< A8Bm<D5jqal^Wb>QJ9auXc?lPDwXRu>9DwYp>dZ:a<JCt:a:t\yXcRV^Z^:L6WICN8eXF?e+ZNaFcPS#
QGa&*y c%6qeL\\$T$VYD9l/<:9F^Z8R5QD$jp@M\5IhL+uF9D5J>%wt1A>SA/uMTa\19jK9u+>e+typHPpH$<b
GSihMl Mk8K5jbyPhh5LhauC94PL8ku@w%Yn@9q&@h:%+PQG!%JnG:qWHS<4i:M@P<Vitc#?BtjRyY*/FT<e8*t
G89pI@ A\My:aRyF5@Xj?/uh*V?itq&*yLeRemP1R68F=CT?9KVBqH#*tZ<i@8tCTpCMmZ\:1D4&bq>49$WITJI
Bj4/<C i18!6pbtmGT:d<h4Ll:JYmN:9iD<ZYFcSEL<p4wyteVqI!JPdIQbhL9/jq<kZw^6#8>F*K6XE!ND:+9d
:4hHWT X/F\\yI*<A<yjyVb4i>qKWnNp\B<k>1MC1Hp>&dZQdy$HkBQcan\VIMMLZBNaXYcih?MB89bb+J?PdC$
e=Y$$a KPdXLP::cZXc:nJ>/GeLbBVPhl<Z+\RMKNG8wuV\^yYC:9%dX%eXIISEdS<q>dMQH&:i51YV8RL1uBG&
maDI9n EDq^kd8/&R^6K&HK9NFa?VpQnlhjQ8QA^&%WW^c&9IIihQJ<=R=Ma&b@=yBW8!Ty4E+@aJS?>+AbBX^D
n4X+?/ GXmPw=dn:Sp*5c!1Z6WdCLZXyDEkZqHCuHlVQWeF?n+5\DRIDt^Zm!ZqIwwq=X/!AI=a5CtMl<EAQ=BP
1#m1?n EyZ6X4Ww!<$W+*Z>dBXB=5ZVFXb?<R!Y:In#ZM*tJuuuKVSqjb6#&hF&k%lcVZIqhRWZqu%W?uHQiP+#
#wE$@A @/tKa<W^FcEYjht16T/:p!nWWWEF>bEpVu8uB?%WYq@cbtd1iVP9DA>*KP+CM^cLhJF9WDEF&6BiLQ4+
9DmGyn GcV5&D54ZN18MGqLCE>9Hu/LiKhN@%h4:w?:kI?+\$6S>:\S\n*&CJ<WXEhPX\?^GC:Jy:5b?nybpNPi
XIQEdw c4</>%JjR!+I:MmBw!T$cq+lT?K5<a$l@l$B>V&:56Mki44w*pjJKE>k8@Lp<yt>cjcNRpLhpcKAb?HS
lIYETG 1LI4k1/j@9cD55wCyp5njIAu^ZWuP&4Nht8D9phtR$e4BXjdPXw>R8m5+ql@&JqEkytSPhy?*ueT5&!:
l=qN%$ GV#cM&*m:PcjXq*V%wG:^L+YwZ:9G:t58&tl@9SDy&H++198JcQ!RE1bIp!NnWpB#qceE@&t\+:T$Xe:
TRJyTN QipJ&bDwKLFJ@\l5\8%hMpCXV&uAYA:%NKNBL:QILl55WdKwmEZZ5!dk^?RW:%>CV*AVmCV9wmcYlIMI
:NcAVS uYJaD/?!NqldhLu4YbB%SnpDbi<INEPIeTXi\5IK@qDFSwqlwK+Hy>FtacM6G:NLJMdAW&k?u99KMBdl
SJ98aX aJPD^\%+Rh5a1HXllqNc85wW<wQGlu5k%JGjuEtBh@u<t>cnwcqY1EaLYYFc&uDWXhm&5ANcWEwM5??R
TXbjuN NP*SR81XG8G%+%D1$JDuq<VbZ^5!IM&6=Zp&R:p+>inCXB:W5=Wl5:4+lkTh=8HX5wiYFQK$h!Z#5AJw
XR/A:M m9VVj4RkAVRY5uwTJ?Z?KdTk=V8VhblJQNm#TImT5uNK%KheI%:ji%F@iCYClaut69*>SeYP&J^4M&y!
@tB\n+ ql9*S4+&9+8DSH=@wLcJ8plhj>:/9W\=h9le%R8nm?<W4LZKP=4Hm^wk$FyHXu+V:AlY4PuJc=pQt5qY
5!ThK6 CHY>ZQ@T^VJ:Qj>qKG#p@Fi=@%B?wTFPe:X?mPSWGnwS=XP@QPWZ?:4J+Mp*5C<t1NIQkR*EFwSBDw1n
dlu+!i 5<H<VwG<TV@bcCmyE6jMKSE!pF?1BYK:K<q1jLZ&h6/L6F#P*@Ddc>9qGmj*/kF+XFW9P*IZHQbn:LN@
N%lqW= BnaM@qt@aG^6nZ%u9&V4a?4h@XVZSTQRMbTy$\>T>F/y$el8nw\!$unDy@<tTkjJ+cG1jld<\!elXHw/
nwup1@ QKF/q/uPkmb>&BnD6==G:GQ$&i*aBAG8#W6&*b1H#X<:H!?L%L6@HQ#?Qm5LT9+La#IGEyyyDPQq!^pe
My*a6$ a8ABWKywDF*D6JT8>ZuRkP!1jyQTb#lX:HRanF1JSia4DjbpSaNcMjAFiCmb@\cNkCS\k6a<uetPFEM1
Z*k6Rk wbi=4$Qi8eY?AB//=@!P!Q?w?!PbXkd^LH1+jcyj=6#:nN!Y+#RtSVSq+l*j$@W9=!:biRkHbt@p\l>F
4nZb/% bAPDXW>el=buC#H+W>&aHj+mIy8>S+&atNWc?BbH5@\*YV!XS+>CXwQY1CAP4VpK/>&^4dhjJ5Zu$Wd1
Cb?&F+ yL\=D+R$b*Hu5n:wbFe/S<nb>MW#TmqY?I>5uk6Q>B!6wFZd8ChZSpT&4J/b/6pc\Pb&VFRlQLA&%pEY
Vmmy1L p%\IZXJ>K$QtiNE/ZK\jK<kCwPj@VZGZMXGPWL18I5M5FGp>jAKJ59nAlT9keIkbIa/9l1b?RH\X@9TZ
Cnh/Z! M^w^?qT1pFlcEhmIamcFG#aDLBKS9jpYmp\=dMkHip6ZGtNl!bjdmkpY>8ETMyjn$8HIlNSeMI/wmde/
^T5XVn MkQ&ZQNpQ&JlqBu5tYncF9u^$KdLYG&F9!Ik/NKQW5C$8*wZmlTwP@k=<lYH!WqwAqm4YFcH@?JJdZ=J
-AJS88 000274fb2e1001202b4 Page 382 of binaries2.zip
WyDJBH dSyT1GW&R%^#un+%GmIF4$B5YR*H8AM5XSTC\pSyw<*&yLY@NR!lXWAJ&/SyE@Cm^KX=w6Y9XTBtc4mY
=lQEJq KyApV\E4LSHL&A<#CAk!EBCGGL/M6W<wEYX?HKm>15b:BRZhjLj^W></1CL$Ki=Q6Ehb*bMKBlAK^=/X
lEjiWu yRL4c1\@puBKaA>AmRlp1AcnY=FE8HtV&4n?Y6j5Q!KImHpV#SJHK@bjce85N5iDna5QZ?=YKaVcyTjR
1Rt\BR C^L>mS<\^^tTH#u%>8>^qib6E:CTlTS#Q<98!YE8R+qR<thP<i9/MAt9J8*uS$Lq!?LbGJPqZpZL#wR:
MtBlKu CLw6#<My/bKck8\L^wliEwMwbGjA@MiQZwVL4pF1tA$&P8lIK\ZQwhJP+QVhu<V8Xue*XthQRQF4&p9l
&ZE#N= c\#qh=c^btb=L6jjkYHbL\k/>Gdw4=WhaF9=^LTn\DGdDjDpDS#ERn^Cn^ibc\N$tu:\kXM<P?aeKBYE
NG\#+5 H\WB:CZQHP8RjcIS&Kqe<bi<h8Jl+8JJjaJ5P^k>S^ySHG*lNjbkD@#VTM=Dn^j<p5uH&Q+^ptJJ@Viu
15p&p+ cBmSbWFS&DySmPtw@n@SnI>>K59Khw&<=d!SVwJ1\\Nq<uhi*BRJ+&i6#yIR>wiEalWj=<YNktYYML$B
!+4#?W u9qM?N=Wu$F!8PC8ZKBNZ=<QWC*BYuG/SCh%FI8kFD?4NPSQ&HRmy=y*/jI:Al>##S$9nqjLE#mm/C=m
TXLXNm H8QQiQT?Nqu5yjGBby8P8>/F@h+BIJk?tn<pwp<lQFI4#6&:ZE\P!+KqQ+JMT1$5+cR!19LNkPTCZIFH
Z5mHit hcIAKNXm%J9nKq!EkX5L@$Ga/eLS=i:H6%qST!8dGdFuhDWk1S$WbhceWZKe\h6/RBE!Tt!NdQFq/t8L
LC+kDR XjQyX#P>eMLEAu#wD&1%V9<\KQ6Z9A$VG&NwX$WcWmRjHehPt98SmXG4*$Ql\JtD!B&VKRnEaQilZ<6p
p+yyQ8 6&1R>EIPMCaq4ucH>W/JRWHJW1&bH=mm4Cb18@HCM$<Yp$NiLq?=/RjehnFS:6XWYV?Jnjn%kQ^YI4qY
J8G1eM At8>tqaD?\1YbT/WRQ^tDE>L6t?NEVE^dW$FXLSXa9+=eW+6=a$ZyPHFwVHDlhmjplW/ic^$h5RepZWV
8lBX=X Q<BQ/u:plYDmT<@k$K!c>cQabEyB@ZFqjaZKbY&n*tI$B=4k41Fe!C=mnYAAQtERyyA\ASGIl$DFl#6q
LYhWSu Z>ymeDtbqn>$S$QKR9%w&R*HAuCaQL!um?@S%?D5m*8JLYMXAmQN%VJ#bm8^<!R+\pJ@b%lLnFB9<uB!
q#+\>c tFm+$TiIIDqRMCjuEc84e5N$qWFtndu$cW6u<8JdhKC#lnCJ5!AQnqJIR@p6?Rb/Rw<p9%/5u?Ijkm>/
MewaDR 8DA+ICqYl$ht=%MI!dFcCEe#Z<l<%$YKkIWH!a/Yhw1BSI1y@dBiXPH#e+yVa9@YicN:DQaHB$5T&:%q
T?IZm9 eFu@T%q^*JJ*/MY9<iKAwkBKdnTLSM^*4Dll&CP+G**SThnmtRTLtdcMq%d#!hjM9@Aae=Ha::pIp/wR
L$JQ%* wKDbwQpTQdk1&YCaKIaW%:E16\DMRR1S9kTDZHYupy!qyyeNn1l/+9pEPSBCWbbBH><\yBR<n<V?b1MW
k8n$RI IdBKX9plWynaFLW#w4teZ!qheBy=Nad+C=HhaL9D^>q=*DPBHh?$dJ%wHu:mnyQ@TLnVpuV8FtQMFc1m
BLqHCV V=SeBD5*hECW1F<y6wcX6Kw%@+l6T8tqZ?1Vj4iudcu&C%P=:h%u@^>hLZhkkQZ4h><C*D/G?9FA+1?C
W#+nRc TyEmM5P5@Ay5FlAj^NZn49my1Z%DFn=p%Dp!jywPu$Q\lyAeEnSdFuW%k9pIbS:qcaHA6eu64b*D$1+W
lFyhI6 D6yATI$h$8\R/eke/&$p!t#&>T+<eeit9&VHRZ^%X@+:V=<tSb#&kD\YBZN#cM9uINe^!\kCmt\p&AtT
VJiXde <Sb*IWCJWW1KlZAkA>CaN?e68\e:wjV*?ikmZhh\9?ReK6c&!J==tI%1yiLHA>lZK+BTcId*/@qiGF^Y
m@Vua= $LkM18Za1Np^=^XQPCiWw/tjctVyp%9VT!Z/WwaY9$dXi8uyW&8PQLJ^h116<w&*jYj1<RS45>c5>kwj
#KHRI# <>ahh+njh/>98$?^>TY=Tnh#1^GRNwNlWXRMKG5N!Mt=YWHVtiX>ti$a*l54T&lK9WY&ZXZ51Z4kM=qM
p+*MTl kJkTIlDY/uS\Wpi94iqFCnt<YG9jb9p#4S%i<*Al@9e&whpR\MMF@iTk8A&qlGZSu!Y%e4Q?V!dwiqDK
4l6eZn Y%PCjuN6T<:?BBCE*#^QZcVJ8\FSy!64t\Y!$GCHNi5@V@buCG?b!Fi!ANZjy5RBkYFFI>hdN<Yu\BeX
L%PBpJ Mu9tZA*:@k&u4//^GE6XIDEckE1A:/p*EF!Nc@YYkdAFp<G:ujcYM&/G^/I!HVPPLX!qKKInqZ!*hGtR
Cne@HN FYuIDV+q$n84TB+G#nC\5h<ZcBnbJ&VJEdpWN5S^THpWMbRYibY=Aa4Gy4C5R\n=IbD@T<V=@16Cc9\R
q8k#9H jkl+R6?#VDGM!KcunQGmDVj^Y^m/ie?$pTCNkm^WTK*FqA>VNb/9:PDWB%\/kpF5L$iiI=A\Vwjyl6yS
$c8y>+ ^$$NbLnQ<qq5^eLEb?8u%Lt!ZAkG!ibK=P&$Du<t6epY/ltK4TkhXWRYqp$Vy>MWub>/$:CmX14p5t>y
B@Dajq =F^%PZCM*qbYQJ4hen1!14F^>RcyCej%8?<TkSley$mRV4#V5+%$\/=6tJW:1?SIny$b1yyaD+&bAcW^
85jBMy eDjQDKu!PQLc41c6tWH?:w8$FB:nZ$\R6hE!Kn!b<%Ni4bS:uWNi:$YBSq4lKF=<JkelI?<1+C14pI?y
5JyKt: 6kKnXK#eIIhta4<X*/tZV#tiJAwmVLJ:eS/8e5JJ@iZC%SHRi&Kl51H1eZ4#8^D?XFDNpKltKe@RmGJH
d@!aED Le^iSX@LKBF#nl?5^J6M?mXaGp+bd=uZB>MJ4qM*aayX$/DW:T@+dhBA%C@EkJV+=M<Tn/y5c/tdL=Pm
ye^ItP 94ma1Na:i6\Y?$5e@#qFjaIA^ic+8+=VmetCFLL69pNhG=K%*nhEbLe<&$SaZ#Z/ZZ@IZhCm4<=HlGy?
$1DW9k !hK5V%nQueuiWV?+1nhS*Y+$ujh:1DqbIb/9aS=ZaY?M/E^@V>*CD!*GJADPkqpnHwiuwiM8HCMy#9R/
Ap$lat t*^pJdkR#//6X:ypWyd5!1CyNpMFY4L$XQ!ZS5>Wl4Q9MFKPa8+F#hIDbndcAiR\ja!@$GB=E6b$KwL:
yK#1qp 1!X89P?HKZAX8h5J%pGe6A?iVmQ/wwt/!X=YALemYHX*XewEuKk*$hyZSP6Pc^*<=1XF15eQ<awGX6nn
Q!6L+n QpK&^+W!Peh8?epHb5mL^</W=bhlMu!G@IENiLtkBW#$$Z9Vh?&uL+6=qHIDEt9<Tn+/Z!lZe4bmWe!H
Gu^ie\ G^\=twTRkwlWtpkhQu*cD=cYDCYmQMu!>=*$y!/y@QH?9R=$9ZH<eQ@CZ!VXZL$^G=G+>V&d^AYqiPYN
=&^8Jn 6MHCbt?W4+9ERjjBHjB%w:64XTw:Y9Hmi=!hC<=JWjLMRb??hPFHVA+8A@wqhlAhj&a+=u$TX\1!bYH?
ZTwXCB NY>%BtZ:w&SMQ95mBLPGyGCl\Baw%YXl*9I/a@aHHwZt5W&j&R!?i5kEj?#QBk4BiH5L%DBb=*6K=A?$
?EQ\/b qj+m%jB4cY4GbaPwjH<nk^tMiiVm1\ELmRTLmph86QAtm/$mel8#Zy4iXFGc@9i1@DHQqE!EG6*=+/>q
yAZK\< T6JMtT^NY8Qt&ARtm&=J4Ye:ypkDndeuqmRj^R+N@X4e<^bI?W9Ya:VHL9le@VR=llSHSuBmE?n$8hHT
=/Kyqy 4Q!bFH6G$hL&!NDX/&E&C>\=k+4aXC6euLkWJ!WlPa9#BwGwm1k<+/E?E<\Y6uIpd<VC9cniJTan+1pT
q?8&@m />XT#Xl:p?VKmeWY==Y6MdCq1V/!JamS1KPB\tnbEpQ9JPFb?b4:4<IJih%hk89XAR&J1dR*XhtKM/%T
=AhYK1 $kHbIWE=N^JTFQwaB8L+MdPVtKTb\S\&ZVFT=bH&eZd#LWWGXFVWL+6=5#TF\R<J^=lku9!XE:F=yIQ&
D$MAqT D4&5pC?=keXa:aiG#P+mmA#<<!AEp$!:l1incepc18jpP6FIajBNM:84^K:+8wl!%EQ:?DmMJ\Gd9LFh
NH!>?j iTw/&LH+5qtZ+^bH9amGkc<1na6c8m*:wP1*51P\W+:tM%=J<G1Yy41EeyC6^iG5Vj&e8>*E@p6B^juh
/YG#a/ uMbe##VK=R@BGJi=@JN?W+<PiMFbBJ>VHnhWb#<=&bFl=I&/44Q6dWky9mR5EB>Q@^T8La9:lp1:+RIp
JkNSbX PhJ!S?*H^Ye&Rnp9d1mj*\ZYp!Zq+/y5JyZ+yAuqt>m1qNKk*q+dhn/c9B8$?EqPyZ$BS8ySWmmwDY!T
l5:tAK \ZYb$=hDkqbyXlkVqQn^?:QjE@ei+e\JipD4T5wLXKNubGEueWLKpdTcp:np18#%M9wMcZ#XNhm1/XBy
=+WFt^ 5%Mt&%K$\6^qjT*DIQHmE8HM*wiLMAZ$Q/w+>!A6<q>p!1=&J*YD*#=mB1DPVCPXGj^?S@QY+E9^E>hj
<YG5l! ?nGHeHXNe5BGWuQDhZWhy45=$Sc@+t%Hyy$G/t&n1SpFh?\D^uLn?VtntGQ+$9*jljZ%>8ZhkH@QYW4M
cPc1Y+ MXYiucip$\WA1/l!aR?R1uHMk\:Cc@PMWpVh\y*/F!XmnjwTDk^QwKweh6NZ9yL:6^w%$TBtBy:cl%p4
H#=hM^ jl!E:lS&6^qyQTiq\1XKdK5?6*6qhl4Cjum1k+@m/n6bW$^@DbXXK%X&V&*iV*<\CNY<W?P^tb4lhVHW
M485%V lI\9::LYR5I@MhaS@8LL=$L9wY@ebJCYdtNTa+S9aY$=L51?h=My5eG!%&A%T&b^iAce8qP*>#84:5H\
jSL<lL TnPKS+h%qRmC6S<Q#qFm%KCY/^nTM%HnTIdk@uubZjBI1DSWERZ1aAkb%Y#IVkp8%q<lEwqk@9%+I<Zq
RNulSR MEGnedA*kBeTMhTw6C6WZ6*T>X4:><6^^ZHAT5AQV8<Z4c@?R4^Pjp=<LSW>b=@RWc#Y1Qk+cjXT!1w\
FwPj5$ 1WbK9d1pi1k>qM1=N9jtY\cQB<P#lc*=S8kd9h%96GG!QFpPkMLR+QZQ>npEwJ@NLIV1Z^qE*DhW:/eb
#>dE=Y RtD4F5KcX#<Pd85F!@DJduW:qEAl^ZlwZ*ZR6JA*lQQI%nJ#*>D%cAJ%!nD&9J8ZY??/%cZdN>cYeV&6
?QYFn& =QC#qVyl4NM^:<dDX&J?NHM=j?l#JTYV+y#SZX@mkD>\!i1qwZWMPibcXRR\PG!N@BJKNhlT@?VJa?QS
%4dIe# 6/E1Hj@$tl&<cZD!%:FHWCb@I*>ab$QV1A\&/9#b+ja8!c<:i9q*5\qa$^lT4Qwpm!TXQay*R*Jmak6!
!ybTwT K#/*H\8Z1#manV4+PFWk%Gk:5H55ZH/kYyZh<6IW&cKJ+Ld5!ui=DpF1Ip&iBtT=JnVPll?+qdipLRFm
VJ!^N# 619kd+qj^VWBeKMMTZ=BASn@yPb5tCC@BALl+5p9IQD99RR1BIXC?IZ+aj?4@!8C@H#YHy/$QHA?Zt+l
Y1eni9 dnCWY<4PXh:c*IydpF9DC+G\S>l!i>ybe/9J1ZFLYDudI?#NQX*eQdl%:j*M*c$$9T\<qi$SnyaRF*e4
#iTNmK R%yiMAVK??@FS\lcNwRFAk<Ab>CIGIDtSCFFb/RRGwqn4YCWcZh\PCm9#RbeRG%BTDelVGJM5*R/jdIe
eP6%Xm XGdbpIb@nT1?ycEFqeb8*NK!PAhFlETA%YPy\4W4^+ckhE/y61^CKlJc>tjQ5j!E/1#>d1=:q8blp8BM
J$Gc4M S?^^D#SK4X1L:cDbS89^VZ1$beIie@QGAV!LpKBTZFcG<+bj<L4JJ%dc<\n/WLyYb#^TKy>uj4im\&>W
-AVdb? 0007e18d609001202b4 Page 383 of binaries2.zip
%:k&hN 8QkS*IS=@YQH#l*Mj:=yIw\wjZ^*blL*ZNw&ZCi@lC1p%Fu9LkLwk&9NEG#ecVl/J?T!++ZMw*/y?R%q
TkLZJn 9P+$tL%>!hTAmnKuPe:ScXI\I*MnF+4Gct5N4caWclkS6T\N8=4XT&#e^PT&Yyt#j9d/Ym=L?T1y8ER%
$cyEmy i1H?R1jW&%lXQaN<aj/&I\aj/niwhncdwwtPDiVD?L5nLLn=TkhC5aWy8e>j#VTCW5H!IW1p$mpGSR%Q
:nape6 1WkeC/&=jthq!CKT%hICE&bS>IWYBJw9&RiA5+itP^kwNCkB1DJ+DKPIN19diNB<<G5IuhR&1<kEH9IH
dH5WNj AB\8Smy$F@hTZy/4#tF9dDbnkLV4@k%=ladGqSYyTG4p^bGk=jkZ?dkdZt5Y4iS\IluN?Nl\9ZC!:Mu:
5T4e6I PbjRae4l>c:pA9L6>48nVZ/h?ApS$=L+^uIhk<W**1inqq/iP+Ld%h:Rbe<4VXa>DSuEWZ#!AkYyRb4M
!R&#C: 1/Q=m*9VD+8p<81?!nGe<iHk&/9I/1a+Vk>^VQV^Jwy8!&wyF59L:LL6&I88?wk+l9uAW?948@mjeh\H
&%t5h4 L*%F+!PNu6@1JiiFXMVAiHCcWm=kK%Hk&$N*?YNtEj@P%LNamkmCN#VpK@MBDJ1^DIXd*$$TcM$XY^W$
6Iy8ib jb%dPy#!/MctBJe*dNLDXZ$Fj1b86^*<!DkR%qn#*mJ%j9Rt*kDe?@ShZ@\wXkyRSQ?pK:@!/FW<=MRj
/aM6LQ GtG>@ZN9hL/ReK+99ihE4V!@PV?F:t&L^W5<HiGjKP4KhanS&kB9:u9F&?:H&J6mKYX$bTVh!%h<FVDC
w?Zb<m W^6!$*dGL?ld1RKp%F14C/c9XTlp5Ib>EVF^klwR&e4^?h45:RwNuuhiZA*qFVdbHKmVuA6VYaL1ukDQ
uHcke? PJdiN?DPR+Y%F@Q^4k9aA5IePA\X>>HitiAi**Kc&:Jtp?c+qe*AKp18HN/?yDm?YVQF46%Z<y!F5?*D
ked5Eh Rkw9nb5>S5jJ%q\WFTVJ1B?^Y^jCGD*aFPDbyd<^+ChJRN/M:WctiNj9lS5Cm8ihHCuD?GV4%MK1%:TC
WHXJBD @CMw\bKQRZWdb6pL9cBk<&?Ap\55<ca6ZK1PYk&#WWb?>JEZ^E=9pDN<ATJ=bdkb9VY$p*tpGDC^%I$G
JwuVZT eW*cy66GP?I=T:C<Z$I$F@6XCTL*!FcwuJ94NY>/e+Iwn\4:hVH:jE9NJK/&aEVdDd<C\N&!p<Bckb/M
!KwD\< $#PICH@8n<Na8tnVZhHySQ$la9VXY!pwh=GpWZp!ed8M/IH*SW#t/:iVuq%bpAPR<lW*P^KdM6qCLYta
REVdD8 EMwHaC*EIy$*^aaMM#b!qySq=tA#B*FuTY>Fa4y1acP:qdFJ!DPp1/X1lK4nTJ89D!eG$cEtJyRTG9Q%
kbh@FT btwD\6wI/hkTe$wtWDP%CGFEKCZTcFGm*PEwSTZJh!GKTiZ\IitcSHDSq?nRdWu?5nCYq8l4>YpXuG$%
:9K5mh ?8cetZk+%uPp<4Th:TiTI46mwq&$wIcd9WK>tCE>Wwu=wJiGK>?kw<&DEV18P9SM*G4%pL6m&C^map^L
W*IPCE EZt&XRE>XE<LHle<iPaa$W^%:b<&F%u\LTtGYZqQKjT4V*KiCDb8hc:ic!5i!yaQTyecdb8^8S?eaJZh
kk%9Zu Vp:T@@J&4S5Wc$<Nc6PKe^Gi/Nyipdt4tT#1+R:j6ID:@wXJBMEpIIS#!4P1k4mpP%qYS=F\m*5aKpwE
@MqR5Z Fl/n^6IRn:@FW:hdnMdnF$h@Y$G1Ia/+T?Elk<%Rt?a/qM&JT>utL$GkT:@F*n#1^Y^Re<6TGwjBa8PP
!pZmXm <wXa+ESw>w?Zd%ietKNZ<m5G>C5D/K8kinX/5SBhVqt@GFM&b9wX8^bmBeaW58cd^Y/DyTFDHMab^^IP
q:@l&a =KkFq*@SaN%k%w4FtW^6dJQP+?n?$q?X%\^/V:Ajny*nC\ePl<!5!uhCjJK&SSM?W:ySnkQ:yCpcnBw5
W&lded Wy?EB8qq/GX\W1NIw$m9L>c8Nl1n96ahQ@=S9/#Pw8kt$Yctd^8VeX@5kL<a$qBk#Inb6#jmI?8#+LBK
Rl8JeZ kik5nbE%!tlMS/?i/Wj9S++1%GSEj\ecmtESLNZ?cD>#j?%m#?JLWE/*uuqM@I=bR?yEPeBG4PmayDSK
65I*Xu Wq*TtwYW=Z94<Hq<N+*u<h!h&EXF9ZGTV4etib>hC#lbYea%YRFm<NM<^yw^m!j&PLbw$GqAb*qWTjJM
Mu?4*w ^m&jVFuGJdci4Qtc+jKy8@?hjijl/YYAqenE@eEq*V*#Jh&W?iQI6$^JY:jnd5HLNhDe</i*XW+Cl9Lh
yLu9Wi p:N6$>X%R<VKPw<&MWZJh6W%k<:?#N$cCl=99n<?dW>byy\Z@u=#tH8i5LVyij##&:k8Fdun+?9<@n&l
ce?KF5 M&eljH@#1Xml/=eHdt?h*BbX!\Zeda5!<wXJ&McLhuKb*l^YJimu=tkPZN=8LA^emp:5*9?RW&Ww:j<q
By+#HJ +^!HZX&jVn<8W#Pn6hC6F:$GI8>R?Ge?lWK&k8XS8JF%\ZFpC^XQdL&liZ%1S6mkT>4+4:>8@e5iT?dD
i%nAGC Ah&Yy*#*GSjK?iDp%@yb%$t%qFVZRnIM1j@By#BI:=tn+ca\KDVILJL!SpGDWT%yw*Q+HQb!*jQ+?hV@
ZiWjyY $Vn/TMdb9<p/e5nkPLK/LwW\1$$Ba5=u!Jl5NiQpH9%hp59jtnFbwjw@c>:M?N?<@Sm^$N?#<dY^<h%u
9DDj$H $@ijAq%1BbbWbBlFlkM5XG=i@+QRk&$!mV/5IIu?Q=:LJJTc<$<Qb4@li$aNY@VGLbeIkR91$l>9&S?q
#dRPML hMbqZPIa!9:N$YyZZS8Ywk5mG%Yw>4iP4K=Q#iJ\5tdtTj@u69?GW#QG!A#+!J19lplM&SkH@qP$piHD
GNd%M? *?$^?%L%ybe&e#cVna=iXAF!yR!c:#K*BG@?8bJLqeIt+nbAwVQqu%9@y+Hqb&pN!//IN\Xlw@@k8Q>u
EnRI/F lw8#t:Z<^4dhWyZQP!*KMp+D&nGtPJE%FNF4qA4MMedSc#m%@=!1JqtBn%Il59pt1/WQd4nQYQVlhh9&
w<64&T PXZ&G?<ja6@qjD5uNq&1qI5&>5V?1@Z$acMi4Q?A!Bu%TV$IuFTZqH6y@c44X<9Qq/WpH<#u4wWD/k%N
tX$b^Q 1itm%=\#wy6M#epcHI1T+Wd%L@45FBkHhI:=nJ1hYkd45nket=*Vc@Tb/j@yXVjwtlGYIyMSa=uWj!@w
8W!aV/ u@MkSNA/@q?\uQL>C^8Tj<9L?PjVnCKndKZ5H6HKAdcpVK?KnqT@89S:>>hGWB#QZap6u>DF\5A#P6X*
mG8BRy jW:YjM/+^&T6&16La>y<l465qa:%@6dS1+<K#L\#SmZ$LYQ@apwBYyeS9e9GtGJI1T^#uiq=@nTS8?8T
bNcYw> &Sq/T4ey%SWlF4\y%e/!cJud*:W^p68\=i*:H/n^u<N$j5IyLEmIDP5NnY8Luj*=!BwyFCIdLN@IiMcF
V^%cA\ YXj/<#pYJh9RL+?c1$dA9!$LujtI4d/h&&khR$\!@=u<>HdtN*dt#^\^\<:*d@c>1YGIW%l&6?%c6&4X
Lq$hRZ N%<cF6ahj^Zl+RCdy=S@T%iZ@+TV!1^lid1n?X%lWFSX@&u+HhMF@dk5Xe6GjYXDJ\k!:R\nuMp9@\8b
C+b4&e ld^S?i8hi:+lhdZd*uIb*+%F>RG:WijM+KeB<F@WeR+/I$pwFbn1w9eLH5XSWQ=tbQ%FQ<Wp!@wL!EhB
JceXT@ WeHF5WRlj+&GT+8CklKWX^ByEC%WXkcDRcZHFBBt>e^Ci5tH1&1@qBIm9FCJD9*Chj%hjiZ<LbejHh</
b%J@!h jN*\T8@8!Mb!GG?c/Q*b!MX9QQJQkm!YPi@AIe8@9K?bj$$9ZnQ@hqwmI#Ejch%WkJe$GT+j?JI%q5X@
D*pR:@ 1>!acC%PlF^?V#Ih41Y#FjKbNQbI+*K!EJy5yj8?8J6CXVSqnB=camT*m!&&Ah4mPH*#A$5&69?dHHQ@
mNK9SK wAEDAbu:8Glk:uh$\ni9ZRLjWAkWupQD^BKc=8B4\5Jm@Z=m@S<tu5V/+R5n@IT*<EQtpt=*B<ebX$*>
R!d*nL <619nR%PWGmLV6aE*B84Ba:<*!%EJ8#qiS<5=pW*y/a#u@Xb@l?ZF%</XdMQADycjP@@Eq?@Z!6BbM6k
:L%<?y LZJiLVnh<j5j1wNwdD/p@iD>RD#Z/:Nq\%4<aj>!=64Y%H*q8iWD%&eLD>LwtQNyCiwZ1%%qG/TTub=#
R=E\bV <Jya!Pclh\j9uP>Iii%9m*@#j^m+leQ>FtahwhD>E!HQ>9LcuK!59XQtSp*VCAqwX6a#NW:X@PJqwDG*
!qYPYm XhyHu$<j***q@9nSneqGeZJ\yJyF4*9&c&euuZcj<XhDp9p94!iQPINMqlccG^=mH^#j41<HuHiB&@?R
*SnMKS Q1FnEiRyh&eGkBiHwL>?>FSb\kPilmBL@\u%ehC6Tw1=j\dK4p4VG/LK?nXt6ink?J?>H64@KjD$j9=j
NSVD6/ X=86cu=y/\b8W>L/J$Y@9QyMITdZ/F5>8H6q:>JC&ikE*!@$E=pHci@^!y*G5+ctDM<kTbQW5?mua@?4
yZSqYy NbG4/@tH=>!Dm<nRtEn4e<@nnLHu^<MPF1w9^+JLp1utyd??l<c>i>hqKPpVH:!E=mZ^SF1eYut:?b9p
/h%BMB h9N9+i%+X8P4Sj:%hKPl4HtJFmNp?*GcIJXnd1bteMppW$pIFD4J>E?649ykcDae\&qH/=?&Yab\nH@e
nu\byN +J>>Qain@tqiR$Hq+Bnwq\Z<hqnKh@4be/=&!88NS<al*/SqK<Yk*y<dH$5?*?wpE+\E#iQKH*b5h=>%
MT/BLH QnW/P19p+m?!*pi@*j#++/@%#I&eJ=jFBLRdV/<Su5!T<m9L$b@!dZ6J<<\@Mi5ma?/jYTdC@5*?8iZj
H&j#Y: 9C=Y@$H+L^Y?VhE$dDAa@lp@Atj$X5IyLjZ/^<8!LCFD>4F#qCZ<<p$EF:<QJiMZjN:?Pd+!uY<=e=SC
M/i>dK Z5>h@E\^9hHN4H*YQ*M&?/WubtthI8L4&/W1dVmY=a!9*hXi5lG\NybqZ:I&qk$&&VTcZ\Id@$Q4w95/
QaBDnN *XLVyF4M94#&9ML^D%@JX+tNj?PdmwPS:1i/!e&lb:4Mu!j&cy8Jj%ljnG%<:JT>=EDdGay*PBBk@*#e
w%yERn <YdDGak8udZI+**DPTZ*Bt51>mDK+j5H/taZ#yN6$Se5\u<1TX@Du@BAK/LiYmhD1J=iXewBZGhG=tMW
\RjF=/ :pM$NcVqLJ5SdS1\djpqyk9TPPnI?*AG?JBIDYte\D?*@nqTZu*p?e>Cled@EP8A@8haHWH@^Qd!pZ>P
1j&L>P @wRQ:dA<E4I#y9kD:Z^5!/cEkb&5qmi//E>CV8thJ?men9F!JuP?&kaMQZwN9XV19Q+Kt$#m<Zw#t>!K
6G8Wh^ Zu*c=#wyF6yZDtYD5l=<q4P&#=ah6Yi1+aJDG:JnNPGiNn9#e//J@+ubu>$eHB\@^j<D!Z>9jptB<=<R
4TIh6N EC@=L\C:mj>@MWHV\QLw<j=:tei6H%^8=qB/M8wVTbnkyF?&d&Y<q@JhjK4el*8G>6P?c^dc@bty6?6q
>wtZ#m ZZ>4n:9?XmTK@lqIijpSay^ePT\Ape%cubkkKyqqYb?lem#@%@@Z*wAtmMy4p6:<k?XkwKSS$?mI>J<l
!J\tX! 5ppTA:P!J9:Qacd8PahE@<KPD*?&*jPT=uM+IEVZjh68*R/&:Wb$hXI#jH=&E<aED@&!8<&>Cq/u>jdq
VVj^/# ?u\?>ij*\4Gapj=Femj#I6Fy++5jnJyKNTK9c61F@D45QYiQm=j+>PVYJq@\!Ydhlw?4q*S6i=Dc%\wc
Z*CE^% DXIl^IV@?a5cDSS/Yt>V$qpp@S<\kH@A@Le9i1?c6%C#unj%jZT81YNZQKC&!hMEqj#n?tZpiAqbLl8&
jlj9l: Y/WBwjMniMcme+dTk$Z!y<Imd=SjT@+\XN8j?M8MMa/#4atG<Q^jkdu6jbQnl5GljWy^KZBQ>%&48jhp
-AY8H\ 0006c45ad6d001202b4 Page 384 of binaries2.zip
!H5jb+ %HEyCNn@P9NLp*C+@Z<:+AdNj#EhbQJ9dQFpaYkp9lwF&kTL6+H@:BeeX>:Q8T*iTI^cETpN8&HZuQ+#
H*d$jW =Z54humP*eLaaW5WDZTy?n*GQJAV1#bNJ6YnVWVQNB5*W<EuS&Se*\!JIy?X$y4BeR<54aF4%5k@+S1F
/Hy+Z# uH?wI6N1q%p5$4QWFib/MEVZuD!kLnJ!Tcj5Ejmy8I!Pn?4E!GZ<ZYt9^aqaZhi=lIKdyQX>jQJZL!Rn
K4\*CB cR6P+JRtu\T4=*SH/phBDS5?ADN==LTEGlXF%>F!TIjji*bK@hEiDV1h1nJpp%Tq>@5GQ1/KY\hQTVFT
!mA&n= \CldRtZh?E9$L\:yjK&E#B:Q/y4c*#6H/n5*mM5?qVH66:b?EmPPQHI%n6+#cKk:a5S<<6<TZwyXEn@>
+l%&pw >Q<+888@J4#*d?AIdNR&maGWTuiPpT1%nh^knP:8VlES/i+GEiu8EqGR:lmNmEmZhItI9P@Q>#:Z?iYe
Pl%cLl <\?e=?N^49PmQA159#YVEb!&+:WJwhCJC\pa!6h+RnPqi//aXDW&#&K9*=%?!T9?16FM$RG^KbDPj/N8
1!lVZ/ Q:=eEy@c=c$\uScX6$pd!bT@YIY6ch>>RSlyGnRZIQ>5PTdkk:n$k%TZ/4ti4:KE<jPXQayw*/E/k1ep
*jnc>Q Qw4$:+:i@C:Cj&Wy?QnaD/wQluG<%%WEi*5b9VA&K<+Zm<!&1X5FWNp/X:idyZ>41njwH^SSNcFP\+We
XmLbWH V*E4i+4^QDBMFdy?P^mF?Eqe*IJ#VXJjZ98?hXFX@<PdV\i+@$55w:\>FahY>^wL1iV<#6Eu5h>hG$i+
Wpp=&B TMHa<VlYVjabMD8+a9YPjwLHP6pQl9CX?I@>MM@QenLd=XZ*%J!%a1JW4<\V\ph5FN?/#iwIJNSw<b<L
tVQ88y nCqi#S\i!M@@GwCYK4AG$BV#X6kF*9JQy46ueHXK<@*:@TQPXacL>+kn?D9H4&A\:FAT<i5jkN/u$CVD
b>bB8F !jC4dP*C9FQ4R5jNh+>QD\SjYWmykTwm*6NqN+XbHe%w5QJiDw\?:9ma?Q#tDi#<NZ:/$@//dDPml:%6
&RlEmW 6M@&+L&MV\hX^!=Zn=:dZ?A<TtM@\?@#G&Q:ZuX@l14:/R<Lahq8#yNQ?aN*&p?Q&$aqj::=P9@/4W>#
\Z<h%k uQin?WDl#aJ8i84&4uh@i11/h:eb#py+Ab#44\JhEuNX?=anZ=YZymWS*m4qSJpyC9<Fa%PJ*uciP4*R
wulK^K :%$/LXme@/8VDPd1nG&yHDmI1y@:/RTWDJ8e*b^M+:d/#!u&yI^S%mpjYB^bW<c5SdSV!*ikRmcqCl:Y
^LYR$M WRI>F#+jnbLkXbhBKlyaFau+<@tIn@w4K?8pY?<pPVmyHDM8IHQX:L*/mZAqSieKE\*?EJ>9Ti*qhdBS
#jSYbF b%k@/ZMFZ1^X%A>Th1Qh&ABXVWkFF@N?A&NIDGEVh==hJX@qX5Fjawuu+Y+P\l&D\bcp:6%DJ+QtWZpY
^Ei@>P !DIDQMjBQltFC56Mj>ZCXJG?t+$dd$FwFQwb#@%&9S1P$$=q1<DJ98\cLLWi##Heq\l$?pE6XAKM<N5P
>TFC!B t#!NaG5p&qp=bI\h$IL5C&\Z=<6/!HDbu$DK$YyWIkiwdJtHnA?JGyLe9>MqKDXGj1TL>BDbW!#d*cXS
bJk8Va NVu\jEXJFS/RYAIeEKXLkV+Ve9uG^W@KdnhN>eS+wyETQE$hti*yWmB%^FmyKpnupLlI!eyM/1NcD:w+
iM&CMj I>?$TVa6$wiKP8l\BJ?VS$BXCE*QBylKC8yFYy@!tl!L<ll$i>I1@Wejj<IMut8IBEM189DXhFE#ID6*
R/BilX HXqH&HXb:%^$K@%BQkuFGRV!l+yKt>=#+Et$&:q%kS1APG\+*ueccRYTQ<eZna<GXBJX4bCalI#i@<I!
8\PnG< X?/JEVt9dy+^t!HLj4G:4cQykBNT!&Byw51TJbbS<ERQMNLmPNXNBqIkbW6?XnD#QVa$t4J4qdRIXHC?
@bQT@# k58:6#BTI%nBN/WdHTQXQcpny>X$>=S$+/QlkuV&:HnL:pKRa4BeqaBtCZW=mSSuK4tAAA=b+Na!p%=m
#YbG\: F/%aa<Z1a8jV=KA5H^1lVulQ!Y\KCqRFi1lBPPB<TR@/8>FcNt@Sc^P%!%%eHYe1V9ZJ#LKp+c4WZ<Bi
5WtX$% \&mZK6JS8#F!IW^<G&d@V5PKL1iIhKBjycVZFLanlWZ+Bb&aW<QkGY84JpJj:EZ6ul<FLY=VcnX*tK6D
BmRD49 nB+G1NumF!BGEei4FtI+djbJW=i%e+Dl+%KXE%Sh15n1jRI*%CyFn1N:IkG6h#H!dG$9*m9@V!&j+:t*
dl/cmt 8NlZihJiQJ4en<9qiNA45nlFBuDy=!q!qiCSML#&AD5NXyL/u$@m#1R=#yTblcTjVl9F&Q$H%X4YETZm
=8w?1G kCT1pPi*<BSJN8@F:bFcV15BkH:^t#6p==LIQa^5dEHebL4Syba+tR\&LPDi=akbjC%=>9*SLlPd!4l8
AyZad= \wQH$/<yMPRGb<VS$<Gt^Y<bB>1qRd#WPCa/ckVVuLP/jWQGGa1wF1P8ya?mil=QFeQ%pB?^8=Ga/tLK
mZ<Yi9 ?b&B$$RjupK9/4Wbi\L8d%P#dhe4*hK4P9Aa6BZ1^6$N#FT8/Y&J\?dHT^y4&R+kbETnP:1:4w?Kh*Cn
b^8Snt ^hk$dh\XyX?EJdC@1k+\5$WqKcQnFZI?ln*6#&aSp=aYE=PAmW9<Z+TAyJT$1Ic$L6SClJEWCa>Xbk9L
wHe&8D LnE&kV+G5C5wnCGKSS$mTE\q?LZ4wW^6^XRKH=\pF1Cp&?Ach?%1KNQ9&>//dD9aDLtTVJ@RP/#ZnHj+
wG5Llp 8P1&BJuH^nPSXtPlS&\mW\Q?+Sd8H&?#jnYn4ju8u#9IG+$BKT+pJmMiXHk5S#wFa#eA6jTJ9?Ai*Vd9
q^$&$% I\ky<1dn\=!h%H*wInH$M#MDCSb:$9AJ?6/N>uXuk&%WA4MnKILXDay\jcc$LJpACwCCEyP^B=<%%1Cj
m@PC=L /8w:q8knK%u59kyWMHe\1/<VnjeBt@d5CetVaZpXe9Hy%AAFT/<Cytd$GuRKDwauTk?/>quSDS?Xpt=G
>&EK@I i14d$k+jZXw#!e!E*$GS$:c$mPq$dYX=CIJCb:aDk9XamClt6NcWtR\i+=p?@bLG*nhGn^YQL^=4P81K
ieJC6c eVy8a+?BWyp%5$c:%bi#N6kLSbd%kE4w1^W8q4Ae<bMNdk5QSVeP99YqQm>mplb1R1@$bqGWM$hK$l@@
JeZem/ RqF%mt4?EN^iw#eSjDH$WtZV+y84YbdyESR:Gcd8*hE+c?\uI>t/6c@5YtEJBY*!4MAGM*?e?blqC$bA
9RBC6c #T#q<hB=BQ16#<CnNT*j:==Gj=ELGe&%AaA5GkQSD9$!+hlNhyFjd!R6=T?eJZPKNTNZ#k^5pY88F4N/
1dIuEV y4A<S:=9CVIBZe8E:I^nZR6^L@^q/P@FcFbVRq@\6m\CHdWTQ#Eu\q8Nu:!qA@+8Xq^F#6P9N$WR&a=>
e\+\5b mtCT$uwJD>mG4pwdQ$tA1lVY>9S&$NWcj=\V^*\KW%=Q:XPXiVeaQwi/T=+hNEt^\V=TVJFQ+Hc+icHe
ZE=\1C KMQpZJl>cWJSY6j@q^5X+D8N+b8#1K4d=9Xaq#?EDq@QFubK=nNy51>>BBl<iHt$E<<Ej*$>@>&E/55u
8BKTP: H=pKW4%*k/dVJ5^?/mNiZ:/?QP#RWk+dBtaBRA8??WP/+XWjTdA#XM@5AH\Jt$^b=#P4#mT9ZQ@hlEaA
?1VEwI ++#H!Z!mG/%Dk?8tVQjEZaSWi>lXTLeTbm=B/+*Dpw>Ea5*H*ut/nZ@4jEukn1q8i#t1TmjJBjSlDRlD
PV/ETy QYn<:%$G5&aYkdQpWZJZ<^48=mtN9wH1NmuV#1C9LpPHSVJwwTyKaP$d9=Jmk>R*FQB&tLYd%\I$6%hX
XcRT8K :Jht+jSBXC*BKXhpqVtuCPGTYQPnTm1Cb1M+Yj1$>#tKnwF=w=4FR*BTwBC%#/RQ$9h1HHpJ>%a/j?RT
8%@bKn K6+wI/cA/8Gpj?+q4c#AJc^$\qtm98>V:itcc%D@KPYPAJWAu=ht$D5#JDbQ^JB4KCuq%#&q&ISXL6Z>
4=LniW :>4N6DEdH19G8h1%I?>PSGy69XZcp#5TJap+GN>ZC6Qw=A1WA#y^!KBd1c8watQA#X#Ynb5qSeb=p%+c
d%4kXl q\^n/5<uyLb%:+qW8/1ybdkpS1VVJ%>6FVAR<tnZlGlF1c!/&5euCARZjm:^ebVh9HHN4lEKaQe&SE^5
q1M9Z4 JPbE/dIQXl/T$>Y<>1l=\1FietA:&&eWE5Q*1nmHQw4yWFGHwIn5p:WTLdm1&Q4C#EHM!cL/EYFG:L:W
#th9+u hFE:9^ca\$pGC5uW1cRlDEu6m>649MENRb^=$@*l9$ITlMlp6:NKYmIeG9bWj$5qtDbY1BS<G&njpuYG
+QJ%+F \udV=$5>yHZ8p%Mb9pcL%j\TA1:td9L\?EG@yd*VThJa?KGTw<h\WD!<nc&/imQiJ4XuCBA1t/nJ1NX/
?!d=N@ awLM<Y9KDA$Rt%ahuwk&wDBn4bWyGF?XjHqpp^Q:/qNFn1SMXt5dAQda$#A$eG$P4hE!tG>FtJZZt8J#
u*\lak *=IiPwj*VT%qc%d:ME6I>\\R*8e1dtR1?ttI66<YhwmZku999\NYRe/uFihjbVEChYpTP<FF^ey:SjQ9
d9F1yX B95l=1bjQ*?MnVRd&*#$cQ!?4SY>aBTi>Hn=Z%B#nNEW#8?yeQ^=tX>6y?8CnW%jFqtNX9hp*QeP9ad/
8J\NWt Z+m<:qc6hhVi@6MHPFVM$kiG=I4=tn9%Wy&N*cY\X*#5^LAG$6WRnaF8=w&LQwtbIpiXT$&y\um#wdnW
pDPBta V>kIlHFBdcPPF*WJ@9huIp!5iu^1t+DN8DmBZetd/IpE6nBqa\EZQ:9$lCltbd+hTIMlcW<FLH&bI#T=
N+81%P y:KMlIRAC5kabXwmb/uBm9+^GC&uh:RPWGHp1%n6?Bm%YmNc:155cMWSb%hhT@y&TB4bXP/bC?G::I&N
BB4FiH RBA>&!:L19H/@LE$*KA<RKZte/G^W=QkZQASV4#$XGc\<TZTqDaqFXnewHR*QX%y5y$F$GmptQuMuL8b
==?D:d %iMcQPM$bk8:jT$8pYAmkj=*T99:X^Tby:tw@61ENVF>YHM#qcT^5>%n^&V9^GeaPK\:1+M8<Wh&NZm%
^?9?SK #nZ?P>Qc<FquYPmDKN<?yWSu?4@jZ5pQMd%4X4aTR9>JHq6E>/D&i+&=nu^WCuPFkpTT?J@I!ckq4Ibl
hL59cI Zu&S+y@1m<FpQPQK>jYjXT+jHtCQI8n6*m!:knBdB?QcH+!hZ9NpkhZhe@L$:MmE6tMMEM<!VC:B%LJB
yFnJwY 1*YQ%D/=TS6^yiAD:PX@tmN<LlmaJF#LpqKdSm%19ZtLni1W&D:y&nDa5<uQiLh<K/da@>//c::Y9bld
wG9YdL !5X*&?QE+??eH&RT^AC18Q&AA4*b$YF^K6K@mwuN=/h1<Wqm6^S:?iNQ?/^W$4P*tN%+m^Q*h*>P^@Cy
RKnW4K nc65R>Gl?elJLBpbB<eA\XY/hB%Fuyanq<*e8&^#m>e^9Aj!4<PL@1atE+c&<@E/m+yE5CR&E&1>BT5l
+?5Rc1 Q^ATHM8QJtPIH:kIwVKjhu*jT9=R+Q/ppjT@VR+p1RSqeJpmlTjb5?*^F9+t<V?$@>$Iq<T9RRte?E<Y
N1=u=q =P8#ldj#5lL\mkS=bG5XyGZ!b9F4kaR:?km+aKkPJ<tB<KGbAyJipF!HnJ9n1$%md=^QcBTZVRKpeBB?
u4:DYX jmmTwB=4N1C$YHVVL!CjW6c4WpyhM\d=MXwIPBRbB9Ru^HE$DqDdYHl6ShTWP8e:wKluLC^cN#W<KdXJ
5aBu$d ZCNj&XLZ:/>+YWQNa5P^bbRY6ukTdqmIuW+ZH*E=*\^H:Wc@m=<$aB%EG6?ikNNmh\kEF\H\Ay^qJT6&
dE5T&< XW/dI95JZF8HK9+1FX8qLG+RbLEhkXLmeMN+C6WJacqDpW1BY<LIZY&*t^dL5Hi^l1Xn6w&4lA^BQ/S$
-A<LSP 0008b185c0a001202b4 Page 385 of binaries2.zip
+PWB$6 LRHTE4Xd5T1T1cd<t5bFMXWWcPGwe:w9i?cJDItVyDtl>NQ!d?!jMZ&IwP#HWYq^kRh#1JFaNV:%l*mI
4MtenV pWdADtuZcS!8?qjJ1$S!%%Kq59wua4?andcH6@lM\lBF&<e+=AG=P$Spy>>mT<Pud>I@/WS66ZEqL5#j
HaJWP9 C@THMS^654*!ukI*nbaueadB:XuMw5lh!c<ac!?DBm?Ny?eABHM+q6E6e9ye%b<ptD56bPJD#JycnMeX
^lSX%M w951jPh1A<5hPutDYLw?mbeX>u>iRuCh1uN6FebbhQCdcI%ZPJ$*HQKuQq@?yIlQ5+\9DHc:%jSZ5@*9
jpt$wu XQe@\tAk+iXYL@HhtMEh49AlahC@A8m@nYZB#T/Dl?j/W>imjVBP+pH84i<EX1WE^WID++hiJA5=pVPT
S*TM?c =:RpYq/k:bXaqqpPKlJlWRMWb$8A&mpR/?My@IIBWp?&b!TlnB*j#*tcIyIV?=Z1%+hH5D9ZJ8KMKWm5
Ga8L%h t5MpC!%H/Q?>hyaTk+9D@!@=Tl\8CaiLmMLF+KK\@+9DEwXJ\?Fu^FcmpGmIVVG>TL<F@BFwEHeYnbeZ
iwGPTJ VI*jJ8Eh=u6J^ajM8=VZ1W=+cN>wKNAuPp=11%FIWZEYY6nGT8yCcmHTVA9!JF\1KPC6ICi>mSNmwlR4
BQ^m*n ImiXClp8GHd6X^\A=p*14DlK:!mFllYP<jCI:QypJ#B<%T*4#\Ic9!B65bFt&tnM$c/4tLGbb@CGN$aZ
adp/NW PFe^^/1ZK8w/JCnXG:DS@Z*PZmHNVBFFFKP!pC#BcC4WZWG==Yl*@thh%qte<E<R@Y<SA:SY\/w*QqGe
XBPIb@ lH&KQ*9*YX^SZYwW8heFIY>QdG+Ed$?FF\QH1FHZYV$Qa8W4WKGn1!eEubdIB>d\$u4Aju#nqFH#8W+l
tMNkJN H9+uBM&Q?\:5icjHAP!S*=y4P&!tat:Z^B6Bt&yBHqAXX9uB<TEFNW5PkDB?d^1I$<tiqdBE*A+ukt!<
$Ht%uR iae*@TilVdD?14uIRtVHQ#DIPuaTKIdP@K=/65pukW=DD>I%CjwpTt9R1P^LXBamSGYWBR@mwSA9>iD9
YcZ1k^ \MI\!ieSSN=*P%>mA%^Kw*l5hPtED$FT9hE%%p14w:Zm=I8!a6lSpbuyEqhPjLHA/e4CPmLk8%448Q>G
5cIEH5 G/py+PpI:jCwFKb^#IS8CN+T9D#E/m6M<IeGBY+CMu#l8>M:S:ZT:I%E%M>qjl#SwGFXp1l?4i#hYtQL
<uP>l6 1R:WTT<H1Lc/Gp^QRW^Fc98hd85BphM!>PHc9\qN$yYw$tCu&B/%LB=J!Za6ScX=t#e1W5&ZM&KY%<V9
:V?%XB +i&a+b&bDi*ApbiNb%>tyiC?ei\9IlZ!ZESYnutGWu<pRF%FMBJGQ=uWIWL#e#FeG/?Y6NP56FWMyyZb
p1^Xyn RYiKB:@nay@6RG6GtNA9#$<\4P1CL>#4i$I@S$dRGdP4+^DY6>?Bq?tj:XV4b/Y?K@Y%=W<pJNJyVV^q
b<yY9c lkeK<9NPyXdMD5LaNYu>In81NVqZbm+L9<AF+y!Gq+$ywdZhW6T5#kZ?5A?pFw%KNC$4YuEek*IckEjK
S?Eud# ?JyN8A!aQelti6C#=W#GIVW?^Rl84ZG!$t:\IYn?WkZ=y&t&:W1?CPFi1q5MkCh9Tnw1^L9A&614Wc4k
4Sy6nl kL9p?$5DRDZ%qTlK5nqkCdi9%Ryl4q1iaA<i4YX+QcnphDqiH#W#\yTnD4j<<W4W::=yX9$>4I/$>ENJ
B=*cnb ^*BcLFc1@l\598qN\L^Cm:QjX&jK<pmI*<\Ja+$alKGY#TeM+TGDP*RM1TbPND&*@9bW$hqb\%a55Vc\
BZFXJN BlBWC1F+ce!Y=*JmGmpZ/X@/kX4NwhJlpN&t+$@<:HPQ4du=^wZApnq?ic&WRJEQpcu$!+jmeaL*kuua
<KKL4N AaJW4@nR+QGX4w#VKSaXeTikw$V:\9KeEi=qTN%n$NiMt>FNbnQ@+CLJD<Zli/EFjAFdDG%A!wQHSK?!
=9<!=w WaPF1%\wnq4Yau$*YAAj8%J<cZ!X6!Sj^e1HYc<5\^9dPGh\VA8Lk=9^m1W6T/EnL+AD8nX1I<qjMeMN
!dEL/M +CnewihXGt5#Lyu6VTWT5bWk&b6F@+pSYI>nkC96TPbKL4*6%puSAXeij8b?a9*$Y+=Z\!Z>J&61^!T<
YLk@5N 5/iG\lAZmt?C1ebW4a=uTdXbJCn**bH$N8$5RZEVBQ#J%BJe/DGya?QBCl?%XWy+*XRTeFKC$A9e??Qd
=*en@< #mPd\>J#t#FTFaNc=u//1NnIcyh\YSj:kycH=wGMQE@^C!ZIQ\NFb55HK>H1*dlw8mIP+jmqNCICN*&>
Q+<Phn GZHn8m?jYHPbdVJ+aHIKGkpS*X1W:*N!yaAJZ#uV6IH/^Vpy5#!nicVJq^8/WyXNYujE8u5%G:uGGai1
Q%9jA5 H+dBE*#AtLI1:8GPW!=6WTuR@F%Fi^pD+S19pX5<8#aZ5I*W?mKkXTSL=@R>4aK<KwBum#eCAi8a*6CF
RIZPC& QPnSlhMHp#Ph6*weLw9&eb=R49M#^ayT#6Ih>Gu4S?*J>HV@Wm1eHR#lw#X6qPJIFVTTAI$&nNbAZ%Na
q#<4nK =4H169Y9M&NQd=k6t#H<<@<I\/MMD>QXk?addwqELB#K#8J#^FZ?bahhF8bBWu=uDbIiXKt6CMWFhtZ^
6HESEV <*%@^HqI=6KKK$e\9\e@%wQjAFiq?9katcFc>hn?$RywnY6/1qm5qI!IpaZ^1>!46dL=m1>F9<?CV@9i
C*w4QK aWR+GDqNKJ+ywBbFK<iH!&a9+&jXae1<mY>!&jp5h\w@q\KVJc8SXS>C=F$cJRS@/@Aj*#W?VpjN!#/#
&yVjpK ZpdJyQ/qhw#Jk&:tWKbW56=1Dt>Jt?ab5#McPeR:QqdYKPXM=eYKS@M?Fm#FLnQl%HuWyR!qM!?D#+yC
ln+$<S V>DVYpLQHb<BHjwC?\SN+Z9npa9R5yDwN5F>M&aXC::Z<ewmw4I1SZR@<w?P5nB4p&lJu5+$Lm5^ql@>
Mt^/9N \^V%V@PSEM*M*wq?A^/\AKGQE*nh=t8idJi9W&4e!/</Z@\b1%1hQ$>$F%=8JI?>%=4waQXd@!L*l@K^
!9aA*I u!I&qX4%4<VHW*46J=IcJHR<9J#jRh=ZHQ+p/#Gc81e@R%^GNLJ6X*n=6YEa^11q!P>cp6WmF#nBe@N%
SRTy*# lyqbTi\9FX6XZ#$5QZJ?/IGZGl1$@tWYhkZ<PTjDwC#FH&S1wB1R&uSn\Kj!jPBXuBJ+W4%MeyF:Nwnl
m@$5kJ a%IJEjBIjun1iiQV#R5YnWlh^Cc^uc%?l&=Ta?$Z#Z>9<N\K::\jQ+$8X6W:!%m?<\4<tim\5JKBpHIe
$I#nVF #HMd<G:%&V*:=i?^N1$K#NXBY!cK#+qw1e\wuV&Z:pubj/Ml=$hcwl1Ww^:%nPZubE:h&@wZuHp6jdE4
ky88B5 G$qe<d144?$jCa!d/:k1#:ntA&W&XZnbci9PFJk<?MIW@F@e?Gd>W9<>T^G5IjA5?w9YWNt5>/C1FM@t
@ZAZZP i:K9^ZC9ZR&BN&tBXZ?YXk%61DAk+d8id>=Cnp6iw<tGy6#hV%=>i>cl:ITD8DJj84%hNutyju6/!PV#
Mb*ZTT %><by8uDG8lY*eh?NBM\bZ^6/9Q^*iVl^8iu6wj@&PT+=nt@m=P+?@<\=hiVqNwZZ1$tVe\D<+$Kl&9\
!KYZak =b@<p4*cDL@im9euH6S!+QH4>>IAh1euM<c:au6ARn<=<8dL19D:LcY<e=E^/e=>dHE&XaqV^\5qdVl=
G&dBS5 5\8CZTI\q=chnh$PS?AAl&SN1Fq6T^=b@+6jh:LKy=wPSd*C\L:Di<$a9YDdR*jdh6hTK#/%\AINe1NJ
*y!j@m I%@d6p4*<QY1@C9TF?TJ<k>=p<W5>6+hA^8H%6ajl8bb=dqG4pnX=*/M=\Jd@IBaaGjnLiyXY&bLeyYT
LET\+K A&\LXq/Te4X5bYy5&R&LRmLX>YANq^<clMa$tk/QhGI=R%pTAu9K8<FWdI:&54?=$%5PmAkTL=5<84=E
+@liL5 &R!Gidu&8+D:M%i^YM*IneQBJ#P8Qw6+n*pQ5%X88k8!Te%\q+j5NlLPIq+^HuM5\/ZHp!X>E46aahwW
>ntAKM u*uA/e61EZB!p<>y&:1!KeY8%iY8A+BCKJd9Fq5Nh$<cluuRH^P9dRq/$@/TlV5LJR$d9K\hZS\KQ?HD
*>+I6$ u>nlK\>8G/LwB:iG%cy$qL1H?%C+XtenbYLZ^+LD*mh:Q\hG+$1yt@i5@86n?=&<<H6*w$pEyLYjK5u*
PNnp+h GdD6pRKEd+%p=#n$/#%pE/ZWImc@6ud%e:A#YWCP&6k6T^d#E\y::c\hK5hW%J&@aT%\WP4n\laMuqcW
h$WWju ^ctG+#\h8YEF@Yw#q8#p=Bd:ZKSFjnN&y%QeZPiyAIIwL1XqMTAZ8K\DE6%9H=pah\mXR\&dp%ewN+$>
j&@G4d G5?WW\*+\j>e6E\puMXF11Blnn%%%cat5?bE$JHActcq$TQTXRA6G=jbPctwXl$L6*>GXntDA!ZBEmin
?<>A9D BT!Yl???W=QndKQaK1mBW&:wyDTYcF9KCtJhLJ@@EI>cM#hdcYkTVtBBmY6l!\9WJ#ZEcVEae+AS<Nk9
H<uW:E e#1l=59XXq5qLbaT+\9uGj#8PHkVSpE*XRcKC>kZC1Qpqbk5=YVm*/9RXDRYX1aaGTKhjLJk#R^4uFEt
btw9mX 48yBeeB59NTL?X/=M9=Tuu>!IMw*jbju1TNTDJEaFuE6tFS&aN\6nqQAqSnY5hnF=JL^/WnX\4&hRcB^
9Z\WX9 iN4PjT<uJ*5+ml&@MnNI@dXW5ZI*e=nF!E\A6EyKSAq+\15n<NQGR$*qNnGNaLJQnF*d=BYi\HK4^AH=
tF&eDh BB+NqK4N%Y9^etw^W&8K*ADc1NYML\=!p+GNqNJp81eimMCTh\H+ZXWJTIKWep8pa:K=*LTYVFZ?4yKK
$A6b>d RaSQY*%!c#HdMyJ=Q*nyd8<8JPF8JYd?EZnG+*k$j?mbtD*ddwMRPKtilphmu>NRap\Vp*//u:n&H&Sq
VT#hS? QPq/Z/#qu*cHcaEua>w#tcknGP@+DH?DFjw?N@^RFV$BG%HBiA^Qa$hWywujCu#ShYqBE*6lE+!GYh!/
?&w\l* ?PqIm=4k@#@hF\/Zlw8K\@?@jQ/*EQ8@Lhn@h1VE/Aya?PnZAa$K#N1?WCcA8JdCX!X^KQPpHbYK6Q$X
ZKt*XD mS6LBRipukSk!T&qEH+jbyEFaY?t$G%c>&IH@X/MXkL?jX9y&?AhjdMVaVq8Di6M8GM^#1R*d=b8SD*H
+L/Z5W CVI+S!1GSu*^j9@:b%D?Yjwlq1X#@h$^DF!@maWuVG$i\^Qh%^!kpISww:?6TYHHMm>PZ&MwJB+&cIGa
5q9<j? KIAu*Wd@IDW*YHmQk9\ILcm&&t%QpKJnKbFDp<PDpeW!X8pD^+P1!@6GF/iC#E+LdTtYYFhtNY/AwL#J
NHaT4? Ryhq*M$mal$l!!!*Ce&dm^AXEKEjT+lVYXD8pS>emBRJ8!qdFqXAWnPkeW6ceIZNjy8X===X9RW^:EAK
!5cY*T bP1pGyYW*W^4R*B9IQWN5L+>j/4Ly>%1VwuX=apRRP^9RidkeJNTd$%>w<IEBcKy<pB^ZA!H^ZK$YLa<
@pw>P/ =cy1VyD+IL9?=nZJaq4+E:aY!&I5c$>#@*uX>JF6&DQ>Y1T=qGLC<$$^+KZ@5Jl?:Y8MI/Il$K11//LV
4e/<5E WN!\9uPTeWZ*<JHbyKR*X1##CNYnQCAY9n!6RbP\mB=@&EZaME=ZwBZY:YqH<W!iQ1@kk#khkdQWapI4
6KLnTu RTXYN<GiuV?nd$pA$FP6LAS<kH:C*DMS8EA*jSc9LwbyKbanYWuhMwSQiFedpmVPAbJ>NtRky<69qQ9w
%?cVZ+ J+4D?/IP#ynZ1Rhb*?*KASypZ+4am@k?wS8>mI/ic4&&MKcPNaa*RejiGT6</NuML&:E\C>&k=^CpN19
m^Ddkp J$Seq8Fmj?41H&$P!%jR1p^DMKcpDiyZBj&%eDYaFic6\N?j/j*j&!P>ZdVJYkTb#PqL^WnWH</%>GEZ
-AEDTn 00090ab6a84001202b4 Page 386 of binaries2.zip
wnqq%% kB=9lKWGV5IQYPXaWhp*EW^^/=EW1Zl:wbey#*?*?e//Q@PZJXN?M#YBpVTj>NZ48<JZhVJ@/$E5ei9*
a5\%uF @?tMHPI>K<D6MnbV&Gn1#qe%4\*=XZe/ZL:RHe?<G<8DQ*tCeHAFXcA/&N45hLH?#1>mI=Tn$lq9%ZM4
TnAA4w *qSXDMqS*^etYhF1p4Z&eZcQMlPSNYJ+hC8iZQ6dRTw5$a!ZBnE/=+<$FhLFC4tJ!Gm<dJ!BuT5bP8*h
^1bTii &k?Ew^^<9^FGR#9ClkZDKV5laiF1M#1>TSnHWuA=qD^t+nTGyKljI<dmEBFX%c1C=B!?NTS5\Ebc@k%h
>M\F*9 5\BB?Y@n!$Ki6ac6kcji/iqwpIwC8&ejdLI+k<1t%$9:y$HWHWJ!\W6@e8*?58tT!c1u:JQ$<ymWIB4@
A<lHdZ ?Nq*Qm@LaZ@CBk@Vny4k4R^Z?%++F^XAX64@HK:PW5I1G%iF11YV&6qNmh9*QGDb=&uAQy+c=XR5@%Eb
wkS<Rj ^t+PjYVBE:96>a!dIdKN%eQ6hjDKat@9e*Im=FSEuBqaYBXBFwJ5BMaM#H=aGA/ey&lQecY<G=+Dp&%R
:DCIFY 8tEeM!$tcY:I&jh1JIYW?ymuel4X$+V5Yjh4A8h1nw!y>+j=5Sa=#Dq=IL9G\LK4=TB>tQp:h%XlSnK&
T/8dbY Zm4%ECNBD&kBuDqm&Z5G6d6Q@<FnMKjAie5JQ:K*Ad*#!+EudA<+5wEYbq6!Y:BR&ZC:&%C^R=qk*6<>
Viu!GA 8md1MS5%qchYWW>!&h:?*F!DQ=nJp&q>Qp&jWtFuF<4MY+Yp4uT+Lci%K6WFNZNt>e!pX%#ZVE\\8wLQ
FQ^d/% :c!%C?^mVCq1HTaNk*E/ip8HuDKYMc?E%Cu6wXp=Djdp<nMGjY4MtW$tcL<ujG!qRwHPM*\jlkdjTL$e
#Xb5NY +VC\>p?SH$^XmVKcVFQ^cS^>L4p5am?YnHdkuK+$XB1k9Ni$5I$W&j+k:t?Rb<juYVH/+P1>=A>n94V#
j+V*J% K8GFu:1/6M#JlN!Yiw^%Bub=:#C^uGDY@eNKeZ::JbR%y4yPeD/#YGAm<D+K4W1!Yy:%bFuRIXSTl6!W
%W6VF? ZynJIhA#VLIwqb5GbSEmym8tqS4aB9ZNm%YSF5K%dDntyH&nu#c5X%4t=FW+MuV9#JkM&^4@4*#jG@Tm
TJPkpq enwWi<5K^Dk\5y#&le:1Qdc5*aEcBp\#/n#84KQ11FbjY\jui?8uCdWJG\*lFwtiy\\&WuZ*D>!E4TB9
^A^+%k w:WmdVB49R:F^G8P*R6P=YX=+DPGS9?#DKtNLKL$=Lp%BdFiR+QA95j+\P/M:D/^!YHjVC9tS9%yaGm=
e8dV6T KiAbG%%\8w=w/mQ@dXL$Z?Aul=q:udFC\Ih5ma+emPRQ:&>?Y1kXV+4li#Nk9j?JwN%H<Tj@16L<:@ni
TMu1mp 8He#$Etd?I@1iw\d+CkQ%4jcuA89qp%MIyQFpKNDuD6WSdK$@!tc?#:N&#c#:ZI%+/5N*<#T1*ykBmcM
4hCh>c F:uyZYlY/wtP$Jt#A#=lPL?Le&1TFpIVc\d$aI/mP:/L=6=+Xm*>?#\5pGB1\u+Bc56>Fc*QXjT#K1*W
nCJep9 !jX?X5Sak!i*:l!*FcRA#$E@>XHP$HQkiS*#MicuZ@Rc@wkn>AFnK>&EeI%d=X=Y^+8HuQ9*nNcZMYn:
>n$#ek TaMJFi>u/d&iG=i56MDZ58BpS1de1$R9%y#$IE9y&$:tXbdcN#@T\nAp:^/V@8u>hM*a>%Iu/&JPRmQh
*$QFG\ NF%#b#%qcFJ5LnB+8K/YP4?V\4:5^h4*$%CQKN+&G?lNYJypp9IZFTq<wdb<iFITwi?uSE5Yi%i&1??&
4Q:wnX 9T>84+9MuPb6N6e?*H$tW9:#1?RAyjdy6uhjV9F6PZ?/F/qTHB*D=jL+ZCD=T=Y5PaNZZQdVA4Wq1jyl
T+P*/^ Z5b@Ac&y$i#u6&Cmq*@*!$Fn!K@p#%S@wGP?ZbJa^6S*hnKedht/8>e@lL!Ww4>TjSa8pj#>=WjNKe4j
jwRew> D+y#=J/>IGFM+npI<pt<9Fme=@unjNPRWD#?Rc+hPMZ\8:l4=qc?5PFymelHJeWEN$dqJQ<ZY?%iI%B@
XH*tq% F!:pFmRJkRWDFM%H/JcXwS>Pdp<%>6T&upD1lH#/?Vbaq9CIa!AiBCB\pP@d&S/^p*Y5Ca5c91DIub?p
:eP9qF u1Ww8#kp8GSj8uRk@/jS>tF:8J#D+QjYkThE/Z4C4Ld/*mda4YwQQw6alq8jEG>mZatP%ahI^epqAj!k
!Y/kek :p&5!hdeFYJD%tIu8#I>GGHpSD!?G+WN*qLEKAYJA&9Wa#%MXelQH@aGqAd$p1Mim1!K<%8Ip\kw:Lbd
jFV=A> P@Nw<C5hD$N#6/\cc+J?c8A9mbMVqiJhKNiehmJjc//k%HYc?QEF>SDjmpFMqh=yYZTa+4A#lWt5PyiV
4Ntaui P\6cT/KSX+&:j?P#+DAAMP\<qPuP5yhD8R^^%kFZHj9!QujcV<:#>Kalk$:HXt%dL?*FE8!htEY4jtAa
weH5tX ?Wkbnq?yyH/h+FjAi*DAB\YV%ttRFcY+Eek/G5FnbiN+8!F%Jm9%A9+P@uK^5N\D$1+686*N+@&DW@9J
S\9eiL pl*H*GPlaADXe9=$P1^@dj%\#1hQ6uTw1*l4YdY&*ZiZ$y>k^Vj^88heAFF$wHB15Zb15*Wm<*YT5S*k
IWTNq@ R?4ypBLiSGw^YwBpAZMFBA<P+q^KpLZ!Wd9b#i=Fp<KPV+QQhbKebywW!Qm!Z%C^ldHjpJBhc1%6?i\c
:mSHTZ PY6CNWwX!*pCkLGPyDdQ+@yHw$y::&P>V9yH*>p5b:I+mbQE!uE<IW@5BXDn:eK8pb8:*H%4JIAupH$n
i9Z!iB 9%w*$\N#Qq/JQ<R@CK8<uHGu<5PH=T#dAlRRRG&E\C^EQZc\c<>ZbPb!9*V%e=uD+LnFj<eVXHkA<JBa
4IXV4H Z*/\b4@PmNj8^/Ejb1lwpu>D:aV<*!#TGcV&+hh1L$LNC>?j+1:Ye=myGL^q@<9lSEBm9/aM=\aLn9$4
iNH84H PWQ5hBGKIBueSRiA^B\j5FXVcF#:Nli>FH:LW4GmQF4*8YbXVTk^kA>:X*Lh@P8JM>WDWcWm4b&*kDlt
EbE^c* Q/i8Xt85Rb<<?IVk*u6ScM@Gu>^nFjmHKh4w#!aY^cGtQk+1%F+PAESHn+GW&P$<Pd/#%<Pj#+VPCpy$
VHb^!1 E&%W4WWG^nWydB:$dQ5HeKkLXHpn:I*B9IhS<t5Ia8KFp^&4ptX!RJ4k6nyyW@BFc9n#\?nbAS?!E5L&
aV%ih% Yy@Tud^@e%F$p!u\wYApMVLF*XCRk/NMkC$JujjPP!ln6GESeYAZ@kuJYhiFFpwSJpku1LMhV%%E9aAm
W8:GT> Ci5^K*tDLT/Zmh5n&YEIM+lZpdhdH$Wqnbyt\<lej6jBZ:W$TGLaPcd$D\GF@<<\@G?H4a*LRlwB64?q
NKI$EN mniPB@<8tL&HA$^Qnt>Q>yAXh#Z8=I8cHaWCdPB=?4W/bWXZRYYwIHCIuTFXLVAe:%Sc%I!\YeH^e^?b
uBq=Wq <kl:XVYymKWX1G&%1=ER1nb>+!4A8pL^^bQum<PS*>B=Q&JPRSY9lTcT&JZ@R:u$=+H1nTd!QwAJq944
Cm6XWR F6pXnHj1pqDY<Q+NQE*$T?SGVE^tuPA+1HZX<1lkajmytAnlMMySj:IZW%DqhBXDy\G*Hj<t1R8$*G6j
aBWpX* u8$6un?R:#Mn5&XLX++$6M>G8pC@%<^hXpSk9AcZ8VM%K8SBKntGp>hynjSCqTy4<%yAy@^%y*LkJZ!P
dGdiY? YJ&N?L5k%FWj:1q9j$cY<bh5/\AadG!nutA=t&4lYyFHY\&m$nT1!IbR55yipqmNH%p16?M>XP&9R&NT
c+9RZ\ 15V*Em%*!9kI5N?B\?$qcm=WV8S?we5qh#*RZajE@BElkKpwp:p+qdJVHRqhM&\LNMLHJ$5%>$1n^phQ
eYSplB %u6/Y$cJEtnjBNR:H%Q8mC>S>?BRk$B1S5a:FHc>!tHFF6QRq<Ww>iM%CG&J@MCJi@GG:KZpk<VuG6&>
kDlpjm 1P&P^FPeSFyL+bYJYJbGVdlP8AddDjA6wG?hZtPX8<>5:yEkF$?>>FBSRb*W1?lB@b$mYa9iJi6n$P!l
y1GySH yt/b?DtiBNCB1eGhF18?BDc+C+6I\5ZlW9<d@^Pm8Nn@<XECLm$Jq^TDT<L?j@*9SF^KTtKyCBnTaeVa
EDCicw &hMd#Nm!9%EH+J&mGT:/MwZwdyB6A+iwS$NlD^!5JpW5w#&kalV9H6ECmJLQF!ZINkNDIkX9C%cBXRR&
4DA=F% /+yk^SkcdD=46L4cDY8>R4PWEPCBm5&pPtna4t65jG*6+#RXly&jw:QY1<KwC\t:W@tI5tbGMkGIVB!Y
=^?ZHT itPEyT4aEB9Mm#Rah9J@#<C#!BHSGj:5TilW/J1&*PCIn6j!^@WGJ?duq+^SCC%1B+94We1djjF?X+EB
je1*5j MeH^VWyG+jk\:Sj\haR/XI\<jFA!jk^9L/6H\$VZt#l&GR4FNV<YGl<8SE=PImZiQKaTcau9u$6MwR&E
%<<Z16 Nwj%j/EZ4Sq&FI%:kMF#^?4iaKiZE%SPlMWq9Cu$/:HYnJ$VY6DBthbL\kRc*m8bX#4X9<DG9Edn1H^a
j4%:?1 +yn9lbjGYjA9m<lDkT9:?qu+wm^t<iCQS@69=C9F*#+kLRyy/1t$Pa!Q=1KiyTiwYMKSQwI%V><RmDpe
yXVDPi u4V61b%PH5k/\5@<kCa/jVTqV/NkcCmP%E1F8>>k/e!du*\Mupwku8qb1$B+/n%yF9Zi*86!4nb>L+84
4DJ+nh *m:44I<*GcBh/4lRc#%>tah5nhimuY/QIH4m^TCpIQ?>N>+*<m@cmI4/#?j>b5aLZ=5LkSNj<YjZejA#
m5byW\ tc6tYjDX%6BRbQY8Ki^FY\P8hV1RL4T*EVKMjcRhnQNp=w/=^GDu*J@BVmQh*n<ES%IiF9NG^@pMew/J
w<PM&b MZ>/CTB<GkB>KQaek/>/@CT&K/BSAnkEIGwap&u<Nc56h94Bt1wFL+Wm$$F+*c?TE^yNCnyH?PckJP:J
9>Fyph i9Q>T\!*?BTB9V4<FK=XDQ9bJW$@cJa=>PMK<G\jbT$^@Q/aTEdKh68Kh!c>GSkBua>bY&ku*W>JESy1
Q=C9/$ %H*m9S%MlAhmehJ1mqIT=FRkaRCqd><#A@<hucb@KM5Ih&umGXMhT\>BT$=4L9Ha<Xq@iLBVD:#jt^KW
WnV69Y yXD<F9SaY?FSjqXImA^mZPGMi@DPcD!XY:S$@KbB@+JH!CG>5*#kPCcnkSjqLP&VJSE>p?8mqVkywaCW
FIKLW% QGI*au<e&6*jydVwMtyFpT^eieCbuZ*%THjGMcd$@LtEn9anQdEeW@Alw>LGJZkc!b+/I@kPcS8d6@Y>
I>VAJF ^>Xh9tK\cZ^AT+^DdW^?8nyVAE>t/R\4M*SV!j#D@ySJZ6A>jFAI1lTDpieB:dC$j6#T8+udmA85puZk
Xqi?y% Jk%tSEBZR98ddJ:y&Cpu1HiHpK/<V=9yTNcpGPG$S&uJ:$*&1WNyTT&lH?t^JiTcDV#pebh#yh&SVH%P
\&5?*e >5/DIb8>1FM<P&Nw/MM#ZcbQkiR<HI4iP/YyE^qC>w#lKtmZyWq&eV6!HlqZMjIb=<cIVkp6DE<YynEc
I#cI^5 &+#F>=G/ct5Cmch\d&T=>*hq?G5c?XK@1ITER^G@APX+jTaWua^w^ASLy%C5mhuTYZk$wP!>q6+@=4AM
DRc1!^ a&?^S5e9C$VQ&LiaeWwR!peFH4pYuP=yVR><Y9TcheM!QL%$P#4c>/y/kIN$XWLTVSMjBKFCny$VC\nG
*>=ktH ?XYRVdGHY8LZ$:/u!/iYwkBSe&&@!Fl%\&#lJEKc#mXqFc*HJMBI8wlcXd:?MqH*dLD@X:c&#/y$ICMA
%iMQS& RJ/84M%iyK<&9YHk!$^%M+%u*9k#\RpNNa&YYT/u5dIWYEyjtY4w4Qy4H1<h8:*l5cwi1k4!LM<meRY>
pKb4ZE \JI$j+qQ\*W8ZLt6$E<ilip@H/qbId\8/<eWWTPuYk=CL>L$Km>:qZ$=BaZ!EKLWD+q$@^m@LMG:yWZ<
-Ajj<q 000bc901166001202b4 Page 387 of binaries2.zip
!/4QlQ j1C4l!9SX\KtH@<L!t#yw?i%<%48iPp\c#:\T/Cu/ZcC^Cu8B!lYWHBEIN9ky:u%PD8aG6pdIWdDw+D<
AIb^^W PMR=Sc\K?^N?1Gk8WkmXBH4M<l\mi:<&TjJ@dHD4aC9mMmJ6?/IwbeyX%8V+FWh*D@8#TLC@<8Z6j9nH
ABPQ8M mj%TckFEkPCT6eRKT&=NYppPl8@kTW=tQK&Xa\SaRLh\ZGw#LIX=K!uM:1lIt^+:@mene>\Hq:&mImn!
e\uYHd pjQ:SGY@yiXa5plyAXN8e6n#i9Y?m6qX+JjKt\8%cqDXR%Xpp%+!w>YZV>FK\qBEaNFJ@9h65!!h4&wN
pTnVM8 M+<q&QcReN6@IyZ@/jCRQ<%5j!Y/VdDjAN6<P6TDl<%J:^KYN^X<EJGBVR?8$!k$E>ty@jWWT4?b#^:q
A:NJq/ L#9/Ft>I6E8qn=Bd4e*6cjdV&hHiXQX$VZVY:>Cdb&L4/qbLqQ/y>N/*%dp6LH+kHn=^b+p\5J$yw=*4
+6wZ\B ImLhPJ^kjP9uWX<%Kt8=>/tkqV@Gw\G\Hb#&WV^QkG#=&cl\qLdca8np^Z59/*8n>SGEYMkQt+69Bht:
K=c6Hm qCJ/1RAV$c#q4mJBtW\8t+?ZuG=%it#?KPe#1pn/!$K$JMala14Rt\Y:wYZ$dXyd@IW%+!9=y@?^d4*y
M??<\+ #HiZCJw4t@Q9q#1/WIqCl#w@=lqhEw=5CcJ\CHSGPw#@i%*#::y>CbD8*pWWW>TtbQYF%qu\+FjnYbAc
lG\/T* A+I9=ZnAN#K%T8:4B>HKI5:Q*ENVNq@h#9plV1MHc&!LNXBkp@dJW>>j>6pZ4VQXp=d$W+VB:/nnm$\h
YuwuHM &n:=ettY*cR\NySpDjkR8&P#$nVG=pln@%6XenGc9b::<cWllWNGqpb*?mY<%h:dtVKlk$?&NiT8*npV
HS4\ED *GSFk6+WWn9yS&wK5Zl8:k$PbqwV4F*51LXNHG+InY?e!L4*D%+Kc%^^N=*%ul884WZ#dMHLCE45<p?B
TZ5dwj k/ZCM8<>lDa&/j/yT<Rj=A8Rq%lSMQ+PI+>tq<4eWkKW%#lYm\C1Xw#:#:W5:L/ZjAqml#t^#TR:C#^E
kb?Edd $>YmPpp4Y<!4/S5P#4uIc&w&yd^*anX=VL!EG$SK/cc4?F/YDN+R8@ku#N#Eyu=\n@$ZwehZSj!G/<6\
SKt>LX :$+5MNcWuBqGjAM8YH+H9nVwu+WpQkJW##S4*qSPGq$N<\*nk+PK^RmG\=9R?cIn&N8C9iw%D$GHAmWm
9:&nyE DtD+VGc^Ntupwi*wL&1ljJ8DlpRRuWP+*u%>/Q&S*R@5<n@*&?%l96nRudLD$b%BpVT?I1Ga*Llj:$tB
X\R$<< lDP<8T5J6$Z:NTuVBkh%C^mY:KcJcJT4wq?JERp:?Y5d@We1?VtNbaCTNt$d6BRQ?yj!55u&wDFb44/!
!YX@MB /&NI<JGR@!>A1PB&LMw#YqTb!^y\4F?\C6GeyV#YYb=KVa&/l$Vj6FqDuY9<*$hdtdk\t%KENk#k+?KL
K:ZSpd HFVRcYWDyL>1PMIN\m8CtnAun%YTcDnn/<?XBklYQWYZ>LlF\E%ej6EBRq+C+SXhXSXIIW?$8VZLqS*4
dN!6dY I\T8:F\m5Mpq$pH6eG<q$pWG:SWeA^y%cy\V>dKLkFDDB@AG=i^QD#41NH%iJ!/kHSJn!w5AM%LlnTG<
\GKHQA QM1<Nm1H1SWPIC#EMSPIiC/ePl48teEyp9+GNinF&ee>!Lka9YTFmt#1W^I:R!c/6apq+@%X>&/epn<w
^\TXja b/+KJ!?Yh*$@CkYLWT?#k/+$D@<nbRB9JNCh&kpMP\6/bG1eF\4BPnq*q?/>\pmc@DS&S#MQVRX+qJbk
%h+t1D LRME*\phB*jVbM&LyVpV$Yl$aPn&@i++Nny+X=kHDb6kDMjh:NV6#Fb>5WDPm6cHl%nRk6M+Fm:+El:i
1npLW5 1%pp+^RQ^EL^Smqt4<8>yWZnNW4&:GQhSAwtP+FkFwj^Q>^Fd<>p^I:W#KNI!*a$6A=/q?!Z9y>LZa<8
=k:qJS =QXP$$dc5>JRk>i?$RGi$Zt#@Wk&b&uY/BlAPnbFi^PS5PGpIpccaCSnQQJcJFH5W6&>9?%FYTP:SGLd
MQY/\H Vcq8%:k@pTStbq9$Xl?5wQhNCViBkRWuplY><PHM/NRjdNV9^i4<Rc:Sm^eSeJ4#=id4Kwikq>!LD^9u
AJu@q& \y5@mX=$Qmh>DHP<wn9h$tKb?W5<!%ZNM$q<CCw+E:=AIB=i\b69Pp6NeMmF99GXWVK/<ilIeGT1d\Tu
mJF<>G JEX+%?F1l8L6X=cqwWQRYKXbZ@@N6<Q\FPi:\aHpwePCwZ%u9p4RcjVGL+hdc+=b*JGm6\9T9PVtw<NL
<$k$:\ !4q18lpK16m!w<t%L+D:y6J<TPIQBhRHKS8qiRGl9aJ6^u1p!>cZ%DKSZ:V?RX\QH1ZdmdELHA\*M++\
:cJ\!j kw>nZ+1%XcV*kH%kN:M<m%#j$V55yBbLwGwW^=/1l9ku8JdDB=%D%@L:8^%C5a!bnwI?5=mcwA1LDa4R
+=%@cW u!tEychEdGWmpHLbh^Y=A*dBZ:d:Rj^Bwl4TwMk+Ew=PdI^HI8e$SdC#TNH1J+&j!QuuP:d#FqBG+ADn
em1Xl! N4!tPJKS@WC&^Qh\k@lTLGaAb:Gml=AtmY<4S%4WZCd?mqq\uqDW#Jk5nE<>nYpp^diy<#G1q&udS\in
Z%81Cp t5tN\1V6JIKY>WD=%u:c?#\<LG+KwWq$?\GlDdKww=6^QYwj*uCp:jl+:SThqRcJ!GeZ5V<mKmB@kkw\
T@w/qQ hydPI%l!m==Ft&8Se5%!XLd\F\VZXDeYYc8kSABmYj1&bi>/@WtnYpykePlBH=p5=Kp?P<c1@\>&!P!K
hdjtk* aM$^mTAnZeYY/!%SlaI*6/nQXK/:e^YEhMN1W?1n<:%?k/c*k+B?9XC*&wwaYdky?PDuXJtHBF$Rl/Y%
WPLJcG 96Rb*^Bktn4W@n?y8a!ZCRq5<?pP1TL:$e15attp+%19$%NVY4JWbt\AqP@X9a5WcVIDb&mXRC%iqNuS
XeI1Wm &nZ>WceTXqJT+1L@K+u@t@<4CYt+?Q<RJ!I6DwNL\/ZF^WZE^GHmI9?d$1LmYCq^MZEJejpqG%//?Na?
9mM8FS XkZEt9VpujBZ<?BSQ!myeLDhHTnM?ZaP#P=>i\htj*jLCCA161L:C4di8IMpldQMKl/FHWMyR6JSJI44
%D^Ri: u<@y9qyZ!$LBIkbaGM1c*?q:B+Wm#Rl#bDT>XW4=CIFVy>!+MTM>pAK^ABALbbackBedcAPXMM$iACFH
t\+:ZK F:e+D55G$cw1Pe:tyKbAJkBXcmBD*%VcQwt5F6!w19Ym1I?$^VIQI\qMC+h?RD\MS:P&YKchVt6TYY55
:D\\Ai +1E$Tw#aRle$:+^4II^B$>Z1DWc#?TbF6uYnYGNPb!4b/uccm8b$X1PYZ@uF1Bb$@XqpT:A^lX!Q@ISl
n=?1W/ FNRHJcGXMj:hRBN@md*X>9/SR1NZYQKj/w^tuLtBy8>hVXuy/F<we>W5<?kyBw#lq6B:WLK$NJ6tK?q4
+YSM=n $yQ56lmSFdkEl%?DZ/kym9ihTmiCu?&@?ju:^ic4mZcw&R$t+:bc!nTpFV?>V8S/CDWu4\%nRNFauBlP
9>j$J6 yHqVR$Gc5%w!qk\$?*/eD?TQDF5b6C*nEm=Z1iIn9eN6LVd*4@S#dN1YwH\AuJVF9pp^$=WXYGy4TSIl
l$eHml HP$5RSEmj\Fl:$H1$QXT9yjY*Ty$^m+6CWw$J\%R\XX4>9FZwWIApVj<NRtW4Z^XE!t8?6V8nHQm*wd?
cF=#uk c8aSZc\64KBj5IBYbX%448<XeywFM&ITTRu4w:Mbte&%1\dMekD^5<mIIweydZE8AKPPq9N/:m\1I*Ry
L:%Mk* $9?uDl/SbY^5eT&F^$1Bc8Qjhq5FM6NKkASyNt$GQ16wdT=?q:V:y?5l1RjXune4@lIlK8t>?:Y\bb$E
Fc%QRN KEH//*94:/G5N@ItAEcPCEH=tNM@V>$Ly=X!u<TPS5\kJ@jHN^@kym#?echh*w#jX45?#DBpm&V=dYDp
@+nS69 AWkKZ?!$5IyJdm\A5#aTS*4jk8hNGH^ap=h1yaDLc@Km8l/a*6#jdnH9m?Y\p%R<\M\mZT$^6VBK&wjQ
>nyL4* TH1hmD^<R+h#Gy4w:d+>KwEGJ=qI!wZZ:V>GGBktw8IJM%l?Gb&@X8D:%!m@$QV6AbI81EJLXn^=Fy49
lmQ8\* L/VpcQKy&F4EtE4SXH*d+Cb:#W=#piaPCFkqIA!PlCbVVJJ1%i^^X1^tkZ!<le?&LtY5q?ybCZmAZAt/
ZZ/\*h GRRPFAnKX=+k%>Mc!9=jc$+8nyykZmphXl=<1CB!HHD=wjk$Q8G%tjl\MJT6SiW*Fb^P@L\C*$M5TLTe
It8j&/ WyHtIj/KqTCZHB8MBNd&$wqe6@!lw=kIQRtSWNkJ%$qSiCFeHRGVmY446jV<wQm\+q<utV?#k9wP*LG%
p:iipa T:p%<DV=i&%A>#C>E8#&t/p#QyPkkK/:ZZFd@cA/L%4*iwK$K6CM*k=T4*CybFlM@PR9Q1ie69i=!Pna
I#=H&N mJy4?5M*c<>tb$dA^eX9:h@jl^G+&dEjlkGcJt1@mG!Dq=J=!B#IH?hGyahS$t!tN?a?:G9BBqF1L:+5
5KT:S< YLXG1eB?dL!L\ITweu>R/kWbT9?VVW6iuQQALn>Kb<$aPT<qDC:XCXHML6>:RFSPpB%eXY6e8XNwIFC/
>tkJ*5 VV&%=FNb%4QVuEY5@!mcJ\FDL9Ficm%yT<&C5@>M&ICZ@n@4>WNTB+$9ZJ6:l\:D6k4a!1A9/a@NCiGS
n5RpDm MyHu$kaeA=I&4n\9Wqi^k\#>:?^8d:Iilnd&:AyW5NkTBeewM6Xa4D>uu8t^*T9WHS6nCYikPVaaQZPE
4ITM9* IjZwHiA#4411pb%@dKZMQ4ipJad@W<6thVY%AVq*#<&y^cqhEwq*hVTHP5t<$&B\@9/u96IFwM^E>FmA
<^nWap +/ZRlT>ZBN@paYpB\q?5NKn/V#HCdN#YW5#WdcK$&$+R\Kt1het4=dF/6E:1E*>FZQWlhnL5Kb5HJKFZ
6twGVJ pVNP#L\EFeE*F8C/FltjyM>Hb!CFVS:a%4ibICi#nm!!K:%8JWmR5FqQ#N&tLenajILkFmn/SjnTbM=8
V<%ePA iYGwwn+=wGiINED@A=GY&/>?i:H>dyt&Xn$t=t/JQka=$MeD9dWEyIb^t1*:^GD<DQ89n>GVEBH4Ie=H
&/W8Rd qAm%N!qy#/R+qu+!=6qYPV\l%CX9@&ue:PclJpq85%QTTGZm+ENRINc&%FV%:a&5qtXbpu:N5+C6F$eN
bVKuln >LE>R\=uwVkqmpa>$cahp$+=66chJ5F:/y>LLI!&nB+kKSZJktyS8#m:+lT>N<X!F>?TcMIyQwBXV?RD
tTjld% Xy15tM%CV4P416wcmZy!1%9u9!\<j&+RS#V*@H9hW*9dC8cLT?DE!yuN4ZqFaqAtSjVHS5<99dj4LnDa
T+5/\? 8Vky<YKWcjKk^JeZY1Nl*pXL>YTul$9>&W@/l4=wQWWW*VVqHyE$BZGTatJDy6%n@M5JXypM%5>H\I$*
cuXcW@ Vd6G<bYN@+D&iMtB98$9bqR*KH%BKHjjhuqN9%9#!<<+bXQXQl!t!JhP&F@ennCTmJ!<IIhE^Ppi>Ku%
JJ!K\X u1W=1\6%EJtEn>>=a<:<YGu9HZ%MdVXN*EqE=\D/5nnjLPnX9\@Je<4\N>I9*V^BNj<ec@H&j!M#n#9+
4<R4Z# ID%@C#M61H?jcNAi9W!ei!IndPtbJChd<w>wDRPJWZnPVdm#kuqTFYYk!DMm+S?:EaaQj8q8+B#n%c@:
DpXium =R%SQE:ukm6A58E<A<6V:1A+en:A4Z9i$4uk&LlWR@@eRb1mXW@yc=bA8ln@K@bj%@yJp?J8P8E9yC9@
+aem*8 %F&q%F*b14\Z#t*ThV5^nlJ^:w6aKy#Yq/+eL/&^Jj/1Nj!P#4Ja#1hHPhyDDHI=&J$\Yj*9jShn:y<T
9Jji&N j/ELFCX!6A9Q$mR:VE<iuF@tCk1CFHWtlDhQCd$kNDIyWht*YRwh>FE+CJ\/GJW6!NRm!c6BpRIIqH\4
-AdViZ 000f45d25ad001202b4 Page 388 of binaries2.zip
VAVZwd 8aD>/FS:+H&J$+GGj+yGaBiY4cSK\/R885dm*EJ\A:\&&SkjKWhKZA<+NiBV:EVLQbm/QKm@M^Fm8c!q
+WS1Q: 8$EaYEW%ZFe+&Nk\=+qWZE*qX9DBHLEXN%!nN^Xit@#BAP/DQp%V<wt&^L*iQ<W/%&8>9@j1mcIEQE:#
8ibJMd NyKQa<8c!aZRel:>+pK!c8Zu/&nR^QAqdCj%^I%Rjnnc6=:Lw@b+VaDHEnm8/:alVl44kV^eaFu=:5kY
4C&hmW 4GK^eNn\Jm4!=++WemTZ>#D#a<tVtiAj6A=5AC1nu@Xi*<?aq%WeXn%b/cICdG9VWRu*=k<dpqBTF@I4
&m&QDK <G/:cJAQMHH9P^h%4l%l4w&PuMY\^ldLm5$jl6L\jH+i4M$/IQ:=j$RVD$/8h+>4=nWm=^Qn%Y#a\Eht
8$M*^S E6G+j\M5<unGPhFyMp%S5ykuWh5dmpRPeIIhTFJ896ZpF*#F=k:lT&#dtP$EyKF8P*tEXhZ1N\^+S#u>
e985e+ SNkhEyE8V6DH&uDnlYQ^XR^<E:+GX^Nn:%+%nZuJ>nCJ\^p>#LKVW?j&C5aCS=NP^K96pVH:E1!>@1Z!
TWX%F* Tincy1a4FKIIDGiBQJ#JTq1?5^m>X&4KhuHTIGjMCq=4ST=@hk#@>&8EV/W5JLW1^ydnh#nEkGYlJYX+
\+&%GQ D9L!1ajX*E:C+#CyINhJ^TFIi$#S91apTc$dJDu&jmK+Z#AKcJP<jua9!&dRMq+XX^P:B5y@YTe%NF+w
*^R::c mwZFFc#M4^%IeDBA8Z9LmjdA*iQPAH&^XD9<8E=%HM?IN5>ASKld<b1BIEE$tG*pMNet*t/C\8B8PNPA
ZIRYbp p#/?YenFe%%TaP/=q@>/A9cCe>TtBP$Ne4pX1REJF&$Ik#tLqVpQaC5makKDJh8SZ<#VCp::c*wV>dp<
5XRAZ< y5De*e+mVd8WCe\VKDLa^u?NNMCK9$KnA4>=qa:Dq:!J>pqR6+8%e1SuX&TC$Se$qP<tleqPk/9haJ6>
hT5TT$ q\9wKy8hG&D5$p*6^w:N<:#1RZh6^SBBut*%n6>\?bjH/ky%&N1B?KFIc9GH#/>IBGqTJWC<TuJpc4*q
ueNE%a DEl?ZqV@B\RW8!%!?>=Ha:wi8*Pyh/@S4ht<hn?:DjlF9D5C*cM=jbF&1WkR?#WbSV6a4ilVF?Ma*l=&
1n=ZqL ym/k=?l1K#iXJ\5u@J4k9#lNj6+WME?$hTFj=pp6L>:5$BEcmG>Y$?KmE#?Wj5w9?hV6ESYSkM\l:nB5
+81k?! Yd^WD^nNM1VP!#N6pi9kJlAZ*=T1</%TW=uZDtS*tYE6?+e$Hp+nVS9?JITc8GX6iR6/15lqeEV1hTXT
EJqI9$ #LNj%n4pAdi*%#=&Fh?Ta/X1C/YFta^56J=pj8?V6ZJHaQ44KceEp9lW=wZl?6Ekn^KM?qWJ@5kuEN+k
l#eTP/ n#adYS6$^ph@\+eipl<kZHk<HRulJPq\ClND5Syb9meBi&+cbMMBFdK/Ql*YBX41q$*BnpSM+%IS%Rut
*?EHWJ !mIew<MBc??Na*9qm5&C\E>mQCwylln:Kk1^S@G?NFhwL^b=hkYGja+44n:!KBFD:nWDqnK!Qd5EySL^
^&VJCD 6Zw\LXhHHL8yL?/XDS1qyAG14^AHBPX#FH^&M!kGI8!:5jqJPItI5pWp6+R1L%$@yK4Ewylq>W:C$!41
QHZkH= Ym#!W9#RRH#nqnQDXuELVV4McqN<k$qGd1LtteN<YAuF^iH@w=Gp8QV@KQW@MMFla8L@Q:kTJmEtIT+N
^A$4cc #/d8bSQ5Tj%LBTBmS9atl1t5Tk1P<>QND9J:T#M$C^hDbTBlwFcYmBDXZq*t66wdF=q+Q6LpJc8L9yp$
i<4X%c cKit%#BIB$E%ytPB^TN:G4TWI*%i\GT$ZQnX%iE8+!^RpIK/XD<PR/\ua$<dQ\>ZkW:Z!D9$nmt+Q8@W
=!C4dF 9b\Fc@CB5EQT8nQdnwaVAwJcTm*QBQt*=e!S+6/+kYc+!ly$byabK=%+ceww?e$Tyhk=Pm<\JV&mBe59
ykFqc$ ^KiDe8qjNIZL>p&:w8*t%M:EtWTR%m>iwSP8BQTiCe<G4?IFZZwL$a$8Rk@RK?9X&51N=+PAIE9^kR6E
\+95#Q R%9X:!S$tQ@*MLYLTP=p$iwj6@<69QLywXFd<uAM%ZLi6ubyqaTw/+kLMt9T1V@\@Ta#8L<eWDe5DL1=
y5#qBp cBat6h9HR/t4iWchjSt@cw5uqpH%yINuaBFFTm%RWCPy#TR+#KFQSQ!m=KmWi>uq6&#FdT%IB9\A4c>Z
4#5=RA Sh*Y!X@4p5tpkSE%YJPJ%!Jj?C4wP#E6>j$hmk/KibD5!w@&tYKGYtnB>ab^JyKpk+5KTu>y/*p65HV\
Q!KZQI <X$Y1F*A+$KFI^1AHt!n=cN>#kXG^Sw%K:Dp81TDWVuwtXG@SHi>NAWtFy6PTHu:>:p@QpKaHKu>W^yw
VuiE>Q GY@XZ6B%q6a\#!N\/\LHS@^=9ncm>PR@Lc1VSlG6lV%@u%l#M\K+eJ^qc#Zl#Ep<SVVT:WGeBCuE*B!Y
l5jeuc BWykcC?&<hApP?jT^D#QiE>*jQ*wuV=mZ+9t^c+RR=?c1+*<ND@ZDhCP\9lNcC*45==RRiD**4ht1Fje
8\R>#V hF\N&??y5\RHT@YKTVm1?qI=DaVt?b>9*&\qn9$X%wn9jac5y1RK!>FMLLV+tt=mq1Ai:c%T^<&a!i^8
Z<K1Y+ ^PawM5%4m>VS?#Tm%tXuMV/yDBDwAw$+8&+QRMZcwynTBF/l1>VpqS*cLc*P>YBKL>TiLJbR/B:CqC1\
6^:w&: GS>IcpuJ@!=nT*MJYW4#6@Z/SERlw/VhydAhlW?Xd\bL*:e%*h\5KLK@njS$DX*+Sw#wnXcdtV<Z&FKL
9uX=NX *wa%^?#uGu#c\nqbqKS^W=1YBqjAb>@%cREu$FZ%dF*lNp5<yQGe/Dy66T$hp=jCKmKDSiKnD1BtyN1w
WMH>a& F<NH?PtQkm&b%!J@Hk/%NyWl?Hl%QX/+<Ga^%5Th<+ReZcuLDYSue%MZtZnI/nX:aJtJiG^F!d4yt4P\
@<$nm1 yTq<tWXqbhFcuQ:F8tMm^cKG/lLR?5hc6CSiLSF&A1>TX*LX@HNPk!C6ZJZm1X/Qw$=V1L:c+G/KGG*F
i*MD&T aq8FyIkPT@9<:WG\?K/Q*Vmn5jEnW9!C*STyq?cnFD6QwGhZLV8yPdRAy5$d*MWIY%VPKXHEDW?k5:aF
9V>LnV DVqi=\wuuVuZeY9yQ<Ca9hYhSuSp+R@n9Qk^l@JDTE/VnVk9Y/SD?1VtqRCD1iQ4G1BXacQ?p&*uaGGR
^lB:dI !mSDy/4AF:/?d?\Zh6k8\l?<&*t+C69Tm?YA<K>/FKqI9<\y+b&nELWD<W9G4QPhYl%HyD6dI/@FEmQC
nDl96W PLmhMuum$WLjk<RZu/PBZ4E@KFPIEhc8&bp#BN*\n:Tbw#9^=Ab5k\Bl#?*N*:ZXn\WSIlZp?SM!mHZR
l9RY:Q S#*mS8VeKL/YNcPan=&e&lwK4y$8/S!Ew5^AE+Ia#w5Hm^TZJu9u:E$yBBYQ86iD/FAJBu8SR$99&MD1
Muc!4J &@Ela%!<mmbm@9H*#KJKdL@NTSWLYY>u5!SS46MSmh*WVdNDRQHcIu:TP>!^LDL:iIMqGh88+BnwZn4y
?98ha? ^9p8CLVlytk*EwP$wu&YWXV>nENi19XByqjXGP$DXS8tS+u:kZS8CVBtehIZJE^#m!$?l%\S<QGM$DYi
Yh>%tG #?8WM<$A1^!^k@@<E/kDDcl9cHVMyE6q1H$b?5%hG=:^YltBR\!@<Z%i:T\$<+$=!4Rw/=w&H9@k6mtd
daY+yn t*w?:uDS\eThW@D1<D=upmNGaZ@P+J&Pab=jnScX+Q\wQ4%N?+9GJ:6Bq>#BT&w8jFZ\LF94*A+*a@XI
LAbKKA AF>jcHA%:VLMbuLW:n/DTC1D@%uGaNWj4<wBSmdQGdd*hqV^NR^GP#9#tq=#GijjE8ctih$!A>4CDDQJ
?:j%5? >qdZA6YAXbIWQ&/Xnp=MieIM6I\Zj*R!il!^jL+wG8D@w9wmLtDZ?SKn!ed$wDk86tS#CRhuNAXIyWR+
Zwy4?@ tPjSTtGj5C\@eFP^nl$yhM@lj4$/w9XP?L##Wd<^R^Q%E5w6+pTiebMk6WN9:>5@w<#6DmNjmGKIWpp@
uKVNmy \#%CSZ%#V=6%5i1$h&F!cbILy8H$Zj$C%<J$P=$Mp\/&MqXhD9N:<Hu!e%9h1@L9DdbDB?+n/uJ1C>N@
G^Q9qR im>W4=QFIw$wm:K88F&Bq8y&tTq/E*QLVwZNk4YlLB1V<>FR\LP^ZiGm8mtGjTqm=SX:m9GAcSi@W$55
QnqEBD q1ce+u#q:@DMTc$%Ki8/^T:&9&eMGR5&jZup!/p!\&ESA6AN9p!Rd<T=Vcb=^!?$pVc4CjR!ZG*>Nc+@
9S#aRd TIC:>FG^hPt4L1He$^kE5i@w*@SY!<JdnqGu1qJhynyZalLW8$\?V+Qt9C6nP/PXBZayu<nI@>!qjEJX
!@:\m/ *19eV\9/X!H<NAte&M94YFT*V6Y*5N&yZ<4#ARRX1@L^<$=qE^bRGSa:Vc5aRq+a6&1V!ZE8!4dl%@Fe
e$Fp&n QLwk4/RGVKpZq&!&w&##tcj:kG<t5$ctk/MqQuneY=AkbG*q+/<9L$tCM*d8w5uJ>@Hbjpul*eEY4XW#
NPttpZ MFK:#G+VlXDmu/+&=aC>ReD^5k8QjyY@k*6AuidCTZ&X/Nw?RZkViAhyPDF8TFkkWn6+h%muG/6ZN>!@
WtTBa$ ZyZZT?c#!4aI&yRGe%Idn##SwILGX>RI&YednB5lD95ZdTFB9I^=Kl&4&<MnBbeARZLDRV/%:tZ\WdA6
/yy:Pd X$eBKB^p$Y6ASD=T$yZujy>S5jhFqXuWXmI+tV#Jclh1G@kNEDlT+*enVDA\=RYp=BIaa>5CWZhH\CD5
%FY?uk %CqXq\+YY<ESnD1eiVEV1Y@&!nJWnVS4w^nmS+QDRyGJk@GSp*6^C&e<P&jFyLn8%Nm>jtCj%Al^w8$&
qGq9TZ w%Gbla*1C<dy*mXH$/hu@\CV#MByM=hhy?+Bp:mHZc*VW$?JRM%J9c>F$FGuhtm1Pm%RBe#mF#pLZ4j1
/:d5T? J#uLLMuB4cAZM88pw#>YeZ?Vt!S1T#lC:e>R*pZm=i1=Hd=w%dJ9EWl=tJj/QCTC<XP+*nZlH#CLt%lE
JB%1wQ kb<KKdD&FWMb6R<yL9dWDmuKFT:5l%nd?S6XIpKMNF4dk=MMC&/1:W+A#$c!mEd6\tJKelQkcT^8F<T>
ZZAIiG F\&bR1XNInZunZ!9YHa9I<Aikte*YnYH<eGVjuZ=k8hj!jww??yhb5qEXH6%*5H&$JFIH!1b!mq5c>J*
H!>&RH w1T%!CM#Ft<G\bL*jN8k6FKB#KwiLm+El?PkwHQ1pVIM&H6e#@bZPDb$V^*p\S<i*q<4+8%!+6b?HWb/
pbNHDk yY\CnuP4EQ4MJ+AGk&RF9hHwwwZD1aW@5\Zqi<E%ybRj^mnapH9N5:I@m@*iCX9$V&?kLM1JPJHPDRVJ
l8:=N5 *F^\TGDFMN1PJQk=b8Nt4X^k%G1?cTbZaNWh@JiBi8&di1q\eG?ENaXM<K!I<$F>cd!BcEu4mXMPX8d>
TJIY@i !Vb^kmPISytMZ/>>QN#Iq8%n<tYM5<qIPWjF+V9w$a!R!\R6Q\GP@PkSEbmPJAT\>yM8yh>ate@IhlVm
mN6SHj 5a+A&P&Z#HKM%<YNLTBh@IKAZTDHL?qkL=GBM4k*Zi1F9AA%H?LeTnkG1%YiGd5&A^=cA&+#<h1KeR:\
EY#QjE mLSW+T=$nDtb^K8L%e:XeBi^6i!W<cuQ*/c5/Ck8Q8G?QBa<+ZlwXNN!e#\RL?TR\i&XS4c:=/j$Wt%/
4#AIKm NYm4bp*nA%<q:PjG?GcW\IcGWZd\&9aW!K8G<GM+E8XE8y=/?Ra!$#c$F+/9PNtcKZR8K1#%6/M!%n=t
a!<k?F Hl/=LWpqmHM#$iFa%*dVip!46$^4bAni\*BKFQm+@Wk$k=jbmE&:qNc>\+Eh+awVT4d?!:mP4R!4aN6k
>FWt/< K=4De>A*5ccF56%t\j%tahn&<\lK4cdn6:4+tJqC+cJF+c6bCY@TIB!GltNMXJZ:YZ4B#%1yh!^qd!m?
-A%#KF 000179f37ce001202b4 Page 389 of binaries2.zip
KCyRkX AP$LDDcXDDnMDyKY+L=L@?ba^X^N!yLe%VlCF+bJkjn^^RK6J%\YF^+miW:TEt4e$phAa^hFmNiRQmj5
^>e#tj Xa1ZBVAW1WJm$&aAm:@E+TW%n8kEciit\D4LyXdFpME%V=iilGMLhYEWFKkj/hRIc*WENa#Glame>/:A
+S1PEK SqTQ@qDk!^dttu#u&wLw+K95PHJ9N1*Y4+IQPew1!$$TJNX5RcVXi$l*^S1E66C8B&tJIt>$?E5khi>A
PGFu?4 ppX+9d8Ppqdd^m>d4N1R&=FEI$Zq#pJ*FHbZ^NnPE4^qyFXmL%@h>RcIB>h1m&Fj8E4\!:Y6yCX>EW5j
Huu>ZX >A8ikdAe9EFRcCVu9/G$=1S?\DK8ND1*yy?WIW1bySq8>k9iwk=6@#6JG9Jd\:Nq<nB<W#Q>G=@Q1yDQ
Xb%1En StXF9VR&V?RqZVnlBL4BDqXd<T*%IB8H<%a4JMQd?=HwctcbB4+MEwiy<6qTm1Y1Tt=liMEHHh^*k/P#
6<hm4: &JcdR\8ZnMS=hT>*:6RR9\1YpNPhL@wmP9yH4\aw:S8!yAq*WyF:y/JJwu6BSk$/H^XBFV\M$8p$d%G*
w4%jbD 9nGD9eHP@KqTTXG@8eSjl=XTwyKa^WWq^CZk+lLmWnBy<j<N!j?#*j>>dCj^Q?iJP@Bj#yHG@>*n?F4a
>+ikI4 9Kh8#m$HynGD^d9n4WqdQMK=/KQAA4SANI?eRndGj&>Ba1J9CMyhjXDDS=w1bjG=GYiB=inSnN5HSVVC
ZEqwn! dcFw/@Si^P&6ap@<wCVw<w$+JWA$:@JVcYPHREypV+XHNj<l%q5PL%Bl!9FCl%>cCbji!16enk?*lCyT
EXpG#T 8cCZl6cS*XP>6N%aP9tL>Mh\hE#kLkCZE1bAwcHHGWmJjTG9J^=WNTHtLD>4SAuHLmbT+:E!*^D<Xk\V
bWBq18 4K+bEF!I5\dWbPLNKXS?RZB=eWBHb<VBVJe/N$8*?WLW+M9X8>l^9RZ+B9Rl=a5@/qh1Y1#9>5V/44am
:#i>u1 b:=1hp<R#aVSZN=c6N!y@B6w!/BS694#:w\c1NC!BWMp4T#@Md&ki/CyaRmtk:a!:L!lXBhF:Q5N$GSc
JhtyV< 1<V::/CTWNAT=nu>GAu5HAVBqjJRXmVT%*bhHq6Bm>XI#=^WpMIjR98ZKjdkK@Qj=h=9@:Xb8ZNKL^G+
G+\!pJ p$lKjJC$<c&XQppeqlZth\K%b*=J=CPd>l#VZ:+Cq=Z$PH1wWP?q<%c4$58!l8<dAK18/6u=Vbq%1C8>
RNXepw yi5Gq@idjbkmA*Ri:uw8bT&*<euQW\$T>5Z&1<*D+:bqp><?89Bi^+6V!VdYE6bWA@yVY^w6Z4VB%CSm
k/%^TX dy<Gp8I?Luq6KLi+6QGd/R:1KeGQ@8DR%j>pnb/FF<Qj1mcQWL^>?t#u%W=Q@w9651&W5D:ZmS=DHlG*
?dun1G kaeY%mmqaPuC#ABHlBQ5:ZD$ZPnP55q$a:bkHMERZ%FNINyDnQ9kAZ6&lWllKJ>GiAn/H=%jITElH!S5
/E:j4j QZ/yZN?qqKnnYEq?+pQj*A\XXwenPnJ?5XPF@K&BnBi1aPLLB?Kb$IIWuGd5J\PE*6cAam/D@/E@R&++
*6R><w %Hp/:E+<Nwn6A>LCiSZEVV1cTe9ud%R%#QlG>@DFJ5JdK8ID+!HKiiLwA^GYtZIV+*=wKFwuwWG4PeMX
<Ptu&X Q8ABSR#Sp1X=5#9GF>DqSl+*G1n>Cw4P<Z$cQB4/\j1@q*6Y!8J>?\JW4#/kLTP5GGMEauIML$%J%k<#
lL>!CT ^iNn\I1YCX:ZPMdwNL+WF*N*k5JWJVwGqtIB&le\imkJ<YV&\tY=lpKEj<EqC&PQGmYweJ8cX\XDZKk\
CFJ\CR G?F\L>h::q>qR\\Qdjn&KVR+%8GDGEhcbMMhm<&MM=5NCYc!mLZTRTY?RwDRc4d*^SVQQ%u!S6\HJeQN
51!^PP mcG/LhQqijuh/a!B^b64leKdX$4yM1J>&+?LL5p$hMne85PQHbKm^hAPM4q+&9b@#BGpm9Ak65<hQq8c
$yGyyk Mc!Btmt*qV/#lD@=9NCmDGV9bN+?KDn9CZuaR%VpyI<6kl+A+LHPTlKQqbbTuu/wBbS<\L5#W#w@R9ND
KiM!=B HC9?YJZQ4$tKQ&n$+bL59qp/H$D9q>KX&\pN$VAiAHq!<tF?B<5abHV&iK$nT/dVj?\+c=8S^FFi?XuV
*yyTSC BQJN6MZSQm>1QCb>yN=QHn<H&!/%Y?b:dHn6eMNt:!mYNB>88tC4%4aaB>C/Y!q6&l@<\H/cd6L@Zl/?
LXHmQE p/wuEcj>FDTKiNll!XI1>&!/kD!jL^8kPC1mZ9+FJuVRj$u>:Vc6D6%8MtcuFbY^@JeIa%KWeu4ANKBF
DnJ9kq EjjQAi9Pet$m!XL@1PVHS=+AEpb4e=%>551RC4jSy@!8cHP9TZR#:5uZbb56<$%^:h>GY64y4G!$/uHS
wFH$WK iIF=Pepi9mebHaFVk+PYM4ILVwh6uASF>6>wqHd^L$l/HFQ8Gb%G?&\i*\b/i<DbF8$eDkK!twh6GDw/
i8N4qB #E/?li5ARP*@c1/#$q^Ad4&PWS!%FA&<ZS<D:lDAN/AV6tbbdT<iT/t=d&DtZ4FV<E5t>X%Wje9XX?qT
9#ZH5^ lbI!@8mHSWCH!Mah^8?9GjjCCQDbb#T!9#BF?:%5GAuiPJqd?ymC=ST++^m!q^IZJNSawSZ?S#V!nktW
w!t%*$ HJ5=@XChmXh??j/!:>Ee9#IPF4+%iuc*qJ#tSDGFQ#lMa^/XnV%4pZYaY$>Ym<eIBVQc5^n>q?d4+>SG
JqQY^C ku*/nS?b9JQt\eQuK@BdL>j4Xu!KIXZi#9p5KD99H?qm\d>\!y\u>aW8?XqBCjaDyK<=WP/nhwqEbVtS
Q6$XCm Z!u9>51=%!WKSntawW&J&SZ!M8NSW@AW<diP8=@iKJ\PSLd\P=acu$/::*Q*KCkV68NjRLp!llV>!^<X
1t:Ja* GTYtu#Mw!!^5iBuG<1iJiw#%qTXC^+^&aM:N$$d=/q@i$u+TDYiRu<IE=5QyYPpMcludPdWBkh+JNuJ1
Mk*dww cWJP1lXSKjZFNJyHHdF6bW+pS498Ab%bIV@T6Jw<*4iG!P8R^?lKE>hFjGM54bDV1@d+WhQZ@n9j>w6$
W=J:&n waL>BmW=waknPGR/QEJ?#pe!+hFZyupF>t>@8*SKiwK=B<6eH58&/Q\:e?n=uFPu@Lce5>=XHA!ebLte
Wt=YRy 6bY!4X/nuqblt#I+%H5LG+Kq!uCcQN#>%^udY5FJ\bZ%XEy!a/?&qV9y6RuV\#CJ4!dL5eTGkh8^?Ney
uithpk 8^pj+M*j\*M\KEmRc6atY<9?\!^HZjVdE5a!MhS?E/#K/te%kFHEqX*%4AJ9MMGk$%8%\FcqwZtN6nQl
9@%9ZR 1+&Ed:P>hVaAAQZ8!kK!\$jFV!b#Ni@:KPt!&e+S9aHmS<V>QDJ*SG4*Iw<j&PaHu1Bn8VV?lR?m5ITK
FQHpen QPH*J#9@cq+>5M$PXR<1n49BDqYW%V8FPBHEXE4%<kZ*%cPhLXcL%@cC<hq=jdkRN\NFECXGtWQnNLw9
1^eMZd ZylC:j+iDTc6kARP!e<V\<TQhLLqh:4BZCEY!/WPtdP1cu@Xt#=8T5$Nqd^Jut\91cY\=!Td%Q?EL\jY
&idtGk R4VBaEwuj\&uy6+#/yK/!L+JuC>HqcPVJlpJS+$Ijc=HX$W=*WX5!clcXi<bZakuknR&jG<u?6m&>CGH
5XnEcH LRpyn^XHCwt%qH&WZ!Cjl#huLMlXtc+$%5VCDT@eyN*QC1=#/c&M4RT?yuh9Ew@*8EnK4R19KmkXa!kj
\m<VPI #MZpy$jH#>p:6R=Dj#9#BA=cibjBES\5%9Gyki#Y6EMJhEl&tlRBL+Jh11H&We##EqZE\:l5hQIE6Xwc
maWH1w 5\y#j/\e1ilq!K+:PiXZ56$@D/hGZduta4TIVci^G81bZySyBN5<%y\qFTmie9LVn<EubE/eLM1HGJGX
*BKiwt =epKX#/@Zki/4QlT<mwVb$@t+6MYVGq14$h$hewFqVNqu16T>NA8N+Tk*#t9G4BmH^%915HAWiXKGk%t
b>a1yI RjpHDn?nTY:!Rt8!N5/%k/K:djbpw+VkEK<5<u8DT54\bQKey4uN$kV?+=1i@8j!6ktCMePbhX/y9H1b
MGpypV duknmJhyFW>^hV5um\pukRNuQR?&9$GhnNtLbbG&8pp=>J+:dPbbpay!keNIpRw^kR$JS#SHZ/?qVYc^
Z$>lP/ @QHyy5Fb4#l5//Y+<lhybJya&uQ8buu!5Q:mtE>QHNXF$^:DmK>km1Y\aG>a9$<yt^J@t1ZaX9^#t<!j
Hmt\N9 *qkyMS&BAkWacpVECm@Z:T!luTa^ey9Ebkau/Den<aeV4IC*QiAEk$GWDiB?/6^th8pLKV*9MBp^HdQ\
d=:j^* aPZt&te$CGpW?S4NP<ui@&BIIF@cwc:*tWRTJEp5X!j?qLh9SyAGWy\paFY9F6Y@X\G8\@S9kdiZd!Pn
>dw#kV P=J46Nh/C+n&pXyQ9FJk8Kn4#5n\#BKdXBWPA:K/*i4L+54d4*lIPiewA4qLA*n%$KN4d6@1dYyRi\*S
#G%qMn E?YcIt^Lc6<?DVEu*!=LYWy!!E#h5mmbm5e<WV\NDVYl\#ShBdcX$p9qbwcYM9H&5<Q6=*4CqZ4kF%9m
FqyMmq ^VK?M?=SZKT1$8Fc:FGBZaLE\akWR8BElQ<+Gj4ETtZ!J!C*naMqmIecRLABKWPZ%#Z!DMF>k&ic\mq>
?JX=1G qjC!t4DM5m9eaWMVet6LtSEZJj>Vbi+q=+yQ*ZL#GBPKlLB%11KCR%bBZMA9uFX*Vq&pqM?u#F=uwEM:
SBw5a# enpiHj!PHc>Z9QT?55NkP:bQNhneN*&N*M5$+9:hD8TnTwjhYF=n/h&ib4+GKq$ji+ul^d@HbCiC?I^y
w#H8WP !=#D6>F%>=<Vl9QH4=Re&$qHqNRmP?RmbNQ/D#AenYbK*jy:WApPj9b8L$Zc9dT+t16K^pucA%PNm9Cw
e#G^#N bjmp*&j^+EX$BNaYSE=/+DjuXcP!:AXnDNyhTSm>D>8d<TPuHNMhVqTQ5ia=%kG9VWFum6pjK>RFY8qG
kDDSKL a!jP$a+mcewYcjP#&DIXlF6+Hm4BCFXJW!!jej+E$&h8MD^Z5N*ueHZZ6:&#W:I!GWpKRmCuK&E96&cN
TiTPSM 8$hVb:A?Y!^H&*Jt$jFS$T4HX4$A&4q^%X*NQVNP^WB=Q!hX/M1LJG4$9pt1+\iBETh\GE1#beyP+Qhn
dw^iV$ ^@b?56SS?b@$ti%@cT&NW*&1ZR#kLTGWFh@W!d#Tkp?+1Q/n>mI6w#1lwV^T+YAbLNtqTc<HjSTy$AIG
lY515t D*Wk*Pp@+c6>\=u@8wT8nw%dXh>hpZ5lB!5c:RTeddm1WZGYpaI1ZN&=V6mjE^19EuSj#1^%:5S8?l+W
lJdLy! QEwkD%NCY=k@dP8I4p<&KDnWTI49ymn+8q<YN8aBKJEMlJm1bR**JyRHCeBdXTmnNT9=QT*F>&<hQD$M
Cn+#$q ZJW=HSKCtqa^?!+Nw%+YN\<N^\nYeBX1=W8INJt&8BtH:l&Ly8$*k:&P:b\Ecn<i/klXdD@j+BIP$@5e
=\cH\j >qLkpP6h8D@>AkjYJhIbFPck/:jmY9\@+EtIY44c8mqci66/PW4?V*t\@+qQEm:>j<%8+qJT$9<:l%hA
nEubhn &SM:cniMXymcR>i$1IDP%m#ZEWR6aL/Fj1BCMFbTYEH^k4cqMK>DElLu+W\:Gte\CI%WRF+#wNQkBn&6
k^^hRT S@E<GX%kKc?L&FAPCZ4k@5aIV<P$+APa&6mtGq%>&Lm^dF\I&lHBVhb!jDHN>=lBYdYceEC%b6\a^6VK
PZY4lX Q^+Gt/!V\5IBal#15GMwcB11TwX!Td*8$t@tDJF9mPiblDd?Rw?IImhWS99%9Y&G9@VQa5e<Sh9k<\:j
uTqlEV Z81MRmjR@TM9Fq<Ct5$l9@BPZeLn&>NYm!<Q?+TEC>Yqk$YKK@ww^\RcdKpEjVmeEj&nd$#!>el91+$A
F=cV=^ SGEe@/$%tk!a^w5j\Z9XMW48h^&QhD^dQQK=y<Y%hW9hwq$aPu^eJJJG1hP:8mDi6SSMP6?KBN<qjNCV

-Ai=Pn 000c3df2e63001202b4 Page 390 of binaries2.zip
1e#d+1 YyE#Bmy<tb69/yF*wI6Z9>R*1/KQuhZa>9ct<SJ$=hiY1d&=t/@ZZJ#4EEYKtu^>IT16DT6#E<ljp#LW
Yt/6:n I=J8XbJewIcPFii9T+lqjlb:*+ntGP/M:HH=A*P8>lqyAMcb/YamnT1\hHbTyecwVYlRTKJB:a6X88a$
6@y*=n &5wqAJGNP6Zy+%LJ5Hyh*F<J9h<t!LpqKpu#19yM#B9lX1p:jT@p9>jT>pCZ6dKQGNM9u>&WmDSj?6T:
cuCN\D 4FZ:a/\%Y<X4i=R5m$NWB?*!1=5w?9LE=QLj#T$I6HI?LJ#h/wC8NH$Y1m^yj&/S/yl/aISWk4K*qe!>
*uKLc\ i=B1GnJJ8@lw&!@@y/YTXSY9j5aCZC&ZqChk4dYL6!Z^J=\$8+8B^iGD?qtPTPE$R$/!l>E/9cnN/dji
#<<^J? Iu54//!N%?HJ^#R=pXXGa%XeKN5mc44&l\@nm+4i^Kc@@\4A@58\y9MFK!VI6jLMM#b>6SkQl\y/*c!F
ka:CeI IDI%c?hj=tc%j<4E5dw:Jw@#q8/bE%Y:^ehuR^EG:NVWu#^EGtXJm^4//SHb64/Xw:TQmuHMVJ@*QQi9
@dXhcw me4pa$>:=HWEB$9au<%%RLPDihI15q9Dabe!RIL%GaWMK41Ck<duu9:N\6pb>Qpmn6Gc1I%Y9hW@XK1X
#Aa!QW ki8N^nBARQV1ubJKSSMcud1!ajec<Byt8ebDP6Q<!Iu>%c#19m4ZI6\a^?>dh&6XX8=q#@&5NR5H>Myi
R*Ww65 \9$ym=?Q=#&eqH%y>DF489KXcuL@I>/tLQY^R@LkT8X18G^*j9mPbW^tiJp8@nN6p/q4hG&IkDSHAjX?
$VPY!W 5R$\a=*@kK$H9W&B+1t>cyV<RY6ajc/4?iP&8T%kEPiN\+Y\DLV^%kw4FNpamqDVqm?^jNC?P%a9@ZNR
VYdmS/ N/j*nm%d!XHWKEM5M4?G@I^NADa>*Gi%aMQ!!6QDM&EMSibmX%Xhq#V&iGNP4<IJpheyye+t*>9TjW1S
JRnWMy y^m?QpQjt!FkcXj4ZF%FMNi1HHmiu?CG#8k6iFV&FcTRE\m?&t=h$Ja&@Qtk$:4$p%*=TDpwSHEA=XF#
dpI//= K#qLZnahL1T9$Cd</KE+EBi^XcFMiQ%Fi\$8WkcYb&8t$&F&CyS%:4TT&^w&@\C!@ckZ>MPa5BB$FJQR
nVTPwJ jla#K5*pabq&I!HT>wP+K?+hMcZX&ChL9Kl^=bpee&j@K^BE48/9PWAwjj!VZidFhLtpC@y%<Jj>w55e
FiP#QX Cte:%<5EaV>ciVMYy>!c?hEthWLT1XmAAtPMXnl4y\hh^<EH9T/In*AS6PEL6/w8t&Vy\+G!J\FGW?T%
Z?G*>i I5>6DmnDk><SVKDLK5WFQ8k5utn9Ci4EA$5#DE@QKS^thmAW:!%?S4y<Qyk+Mb$#>AFmndwMYV&V/m=:
dn/8J9 c<YkZ$4:I&wnT&V1a9^P<\>D%K?icKIH*mR8Fpba1HQMNRnWYXYaWmn=be!P$e9y54V/C+=e4Z:Nbl8w
i$IIRk hn8#%m#A@cmhi<FH=\J6yMhwIdw<SYc8*^LQ4FnmCmQT9%&Pe4dwF^i1q1IiVH+9?9ka^mthN\PD6$cl
DKeVYF Rm4Ei6u4pkZqHGjBSVZGyRWPLuP/GC/Vch/Ia6Z4c>Rn%XLBD8>pwddDH*PjG:!8Qm#FJM8MpFYBbnqI
wmbBAT ^FJNcdm@\i8&GaM%C>W$!nDe*lkypdeV#mA^ARuCuBaD?&hXe$VpNwcl!HeYHcj>hA%>ued^Mqtpmd+u
8IYD\8 NaKk=4Kd&quEG:kVB9hSX5l^c1%?VAyBD:>YE/X:eYma>XX1tYNNWFlD6QNaM18Pa9iX@98VCiPj#*bi
l&1Aap IHLG/Ci>M6+?M!aik@8C/cb=STZ/MD@$i^c#FC&eJchlyl6i+l1&S#yh<Y8P8RZ+Lw*q=Q/%Bhi*kJ#9
!@eb^Q =dNW=StN\YDY9j:K#\Gd+@!n?^X^<Wi/d=<@k:qknP+/Q+cnG^4i+W*euF^t%:+>LRdu=WSM%X9@88*B
$::Rbw cHIqA$8+H=ZMp&=+lk8HYDp$p^1Rk>%8X=VR#L<EKAjV4bqDJ#tpe<q=itk59V$HntnLd>d>baS<^>FW
IpiMBE NntD^5IL^>Bi/9#>>lnG^b>e=b16X8V1@*S*n4dGMeab%?8qtl&Pbp@5DWL8hB?9HPD9#<Jn@DCI1Y1!
$Hj$lP Dc8ytT=//B6iB4Bb*KhG*9RSI4k?X<lEj@PD#VAi6&IBtd\ejNtn<?@&IVjnQZt9DG^8a/J^>=XN&@Z6
Zj=QK5 jy6T$cwHwu$+JD8=D4hcdIVG8mL\Hqn\b$S9WJXbPHd:Ahi%!:A1$SATN^E8^tKBn9IKaNptS9Gq:@\q
/b6Z5P =6tA><q1>B8$kG=k+?GluM9\E+>Z%TA9kc*\/D%DhRI@D&\I/A%S5miSY@SQ%HCwK8H>4pS$9<W85kea
RFW$=N %c%i/Ww&ZEk?tj>9^C\5KZi>qC&eJ*+^eR?Cc9hSq:<m9t*SYBMV1lFGihRtQRX\DtiN>m4k:WGuY^ai
VTpqyu etBZAMT8?:h>AD4&V4%1C^&>%W8?Xq#YhBP4eZQK$ZhkFnbc<tMNT<aTDi@GLweYCIYS1uP$\S^J#ReC
JuTBME ZHtLDQ5Z586e*Q8wl%NM@B1&WJ+!T@9F6N^5E<p<@e1Z+T!^wXTWGCKedTX?^Y:y!6bQ@jA$W9Etmujq
nuVK5k 8p!blNkMw^ZhLMI<+Edh%<ANAu<uQH+KRh+/E<<=&+5Bn+MAFB$aJAJ<CqqX88Rn^&>8&SYA6@SXPQV4
dV<Y1* yH:G<RI1::JeSwecNQT*8<\^&acc=^dX\E9:RQb8n/dl&ejeQa@6hEJX@n%yjMWMRqa=KCajFlRu*lpe
hmD/I@ 6lZ65lTYEV<Ep6dXuKKVqJ14BIb5D$XST$YqLY<wR$&:J:m<%CF4dpJdq*mB+j>K@abT=nB15wY&he%4
8TbXl/ A%^P58NVAk6JMMS&uR$^@4Z\<!cQ$B6QJRAbPpDRT5kiP5W^iAN48lGMwW^S4KN5GbXj*ZKKuS9u\t@y
5*\ZIA mhlHRGG#A8=&^T+BD1XXE$A!99%!Jt1PG?w>Ia6qmCjH#YD/D!w?i!YQ8NkKMqH=Y&/b9%cGNQa#*:bu
$kNQiV NEBeltQAF6CiV@%Q>wku+WCy=ckm#?nSjXZCQG/#L+CdPk19TG$SKY/&F6:mJ^a8cjH$YS+6/JT&6WMD
QmN1Lh S>i=A<#!m\cSR!1HES=NJqnhB=Iu&SlCD>B%$c?tcW*FIk\<NIq\$9p>mV8B5hkk$uw4qGM8G6pB@tYk
Qe4Mw^ #!+9RnM<nV=\TVSAyt+%&JE>b>p#=#dymhSqh>dwX@GymmiEN+SBlaNuD:hP+q<L58\e^XX%>XERZ!A@
WSCI>q >HH5%?5kk:jc\mkWl/\$^Ad*?E@SIAa&HZ:?6h=Ln4?C>8S6ttHCD$NF*TLaNNH^Pl^ZEFn*>yMiJcp5
&cSL9l b?m1@I1ty<=itS!<dQBpmMXeqN/bc$t>M1BJy&^WiM/F&$\+9B@@$A4Jed8d5HXEm69**qnXWAIi8!A6
\P=$jX <PF#<#R&i/91*$RtX*9V&$Sdku>AtMRn!=?8daGeS1?<bVRcYu/1dSqBkEyCkc9V>@:W\bEa6bRSV%Yl
4HY4>6 bXV!mW1^&DNctGlLlS9YK?ZWywZW/GW=P@CeSK^WELu^G*$qKcTiwt$jl\6&P8MeVhXq%@bFKwp#?^=V
!6qPVb +DTbQ#upb<?WbcJXLqR#\B5:L:u6=aci+kR>GtdTD>QcS^^5Qt/u==aYCnY=HX\+uZl4HE:i=uqtMCc%
KiDWQ8 k#u/>:tNMC#jSM6ZT$W:1eeXB*pWk@j:y\<i<\mcSacS9Vnt$@d^c6lPLa49+\yVb$ytb^1*!NTJ$C^%
Y^!t#F J^Y<AS%uci\Q41Ya>SdNpum$SFu>$iBMMBc&tn8w?p&HiJ!adkEe5NtyWCVAkt$q=SRLdhRP#jWe@KM^
t+RAEP au=e1PPh5<5j/C%qnKlH:aWY^TXpIcpAF!%RDV<wXw5!S:Xj:Ck+nnD8N!<dZJ4lt=Vm4%6T1L5t!/PQ
+Pl1j9 M:%b:PR^GY/li8NDE:D4EVy>IXqRY%P9*8l^pqJF$/b=&>\HWw%EZPL%RN%G/wXLdJPkdd&tEJNB&&Mk
waGjKT m:H8^w+BlbCRd#8aN%G#:lTDHpaj*l<*!D>H#Z4YNdM%@#Nm=<JejVbSDnJZF#MbIR\hE#P%=u=S+E1R
pKpend pY<\H8FbQwKbE?NcP>lX9AHHLHl8#h6S8!qbiKE#XqbPpwPT51n*dSBqW581Z<^n>>4PXu:b1dWDnu$u
%qd@8k Q1lueGw+aF%>>FLhQ$LFR%EYNWQNmZ%m1dEu1V\Z:#Tn9:yVhKB5EA!&/b1HD8tZp=P#6/Jc#WHip!LV
u6?Yqk Vc6:h^piTX\JlE=^#?Vk4^:SttqyZE>i>KQF?5l%/h5eH^58Mj1jD$MTVCAG>HXXVWl*=iDbFtSc=@Pp
$<6^6X bXX%hJ#ZM=ChFKlj4cu=h+nmkq9pYKV48Yb#5JpLX%*S\p8P9=nT9B^4?VdmutnmSe/6&*k1!q+LQIn6
datbLH u@X&k$Yq!l6AnWn+dRQ^cI4GZ9K?ayd@K<1!CV@jE:l!/E\JDm5B5ZK%j%XX!aKn6!+N%ncI>cbcNY*e
CEF@:X RH1HECtSb4WYBeeinEZeDJW5CRhQT5ApyCYqJWRq^CVkEmJmW9?@^i:@Cm5Bq*JS$cbS$EJkbWDF#/^y
J$hkyt \P#FD6<qCZA:taN:qiTlHIu$hah#&XCRwLdT+wBtuNqThX4aJXSBwS54&pX#cZMVtXRCw?5qp6iYa!ib
G>CT+u tk=>IaXkVVPuwIh?yYJ:I/hbK@lR$%kPQ6hm>p<&^jqWVLhHjw^iq4ZCqSJASPN\E?q>?k5d#%/^n>Kq
J5nll$ GZCuG%YR9=!P>E&*FPK6>PwcIPF4tdtA#Vw9TeqyDkD@>dy/c$Qk1dG+8i+#A6^>=FTyA<P*=ky4GpWQ
c9wQB% qKG59QdyFNH5S=X>L@FHaKHymEhL^k<Y>G*jBTPtw6%JFdG$\n!L6Sk$k:auC9^Y?&E^KkH\\Mhi1M/#
IpJCT@ YcRNSeM<Ym$4+GH*ajtEPa84c*+N!@9>yQTBk*w99Ch6HP&u>*XHGJplKbdiP\pqV=4QbY$?CuKtAn#\
LnA1Tt V/9E%=J1G@jmk<>l9W/%:8+@\ckHWK*bkh^q\?KIl\LP49#4QHL6TFWc:KMZ6M@$5PJVC8WV!IM@L1&t
9WZjXw uR$L5*@qIw+DlW:w*MRL4Pb+yw=y9$l*&Mita@Q4&%4tSmN/k1&LP<P?GD>je5%mjV:KX<e!*j@>8$I*
yT41RF $BZ=@tpEId@5uYP:FJbh:MIPpVJaq/@%hE<dbyKQ#9iLt:peH$!Gp4G>8:$qbZ%>8^ln=Zb\L!95/#u?
%kYH6p ?lGcNmGmWj^4T<LQN$<uq$$BXiM?:uKXV*bijd:>t#V#EYR=H!INqI@W!j$MqQ>B\$J6%5HR+I&I/=G4
9=98Hk miA1%8&I\4uX*C1I=#KFYB*14R9eTEkSpqM9\^<waGp=@Pt8pm\\=1+++1iS!H1\\4ZeMA5PVG<WDQV\
&Tc@V9 tY:eDi4IS:!\*<Y8\54#NNpiHQnaF%!>iMpSVyXT4$j&IqDS&1\<yLIii@ADyYlLGp+W/w@\!Bl+NtA*
1Z?Qub y+AIp+$emI$$/KFL*9nwCT!pEKcu@QC?cSZ?c^*KGmd:IeZbZ$:NVP+VeJ@XkP?llj9$XK$!<nYVhEET
ZReMXT Z@yWIRD6RQ9ZM*TGh^ZI\MT#ebmCnj\mBhVuA&i/5MwKYA/\lb>\G/kVmc4Jpk^udlQ>mG@R^B%=5!n>
9\\d=V +m+^C9BZ+c%n+TJu5QqVH\e4%SypCK46k/6G^DDVQ?c?9W+8Jk5=6#W8%&F^5XHpD%PiASCl*IqmLmq^
e!a?GM D6K1lRNeBh#1E8KJGtaKu\:jEHq^+L!G@#AGL*#ty9:+9tyF4ELe:e:cm5dMt\?l$KI96<YYW%R?E/Y8
\>TVtN e<=I=PEIEZcVK1!m:8Bl9C8KPdQ94Y#dj!^&F*De85phA*lKT\<ZB@@BXI45p*DE$q1p*$*%#EHQK6nX
-ANM+< 0007a2c2d72001202b4 Page 391 of binaries2.zip
kN$%Dd *\p=&wuMXMNDXC5iR8ALmHt$E>%/BX\N\<Aat%1C9aYb1PiR/lD$Dp&qQ*:Hh!bHI6MSqdVpq=D^+M5\
5*Pu4K >&m#W>YN@%!4$M^XM+kt\N<4yH8cb=lYyK4/WM*#MXyh?$^lRyFDHBTVD>NQj=X9QY&dyJCX=X>&SVjn
IZ1<%% @l1i#F*Z#@LwATKBVGkkaXy!m:uYb6S@wuP^!Hc+A81WCMhyPZa<PyMpe@:ZW5&^qB5<GXH^/6aN4GZd
Jj^>Sw @Ve=HKHmu5$u+=Id9Pym8B$WpFkwPWq&E&p:ZY<!YEm9\$pbqTKY1pAl1K9tZP!@ke1\Z#Dn?nJVC/X<
:/lM<& @LYM>L/dahTq%!ZB$E&D8ppwmk^LSPNyjiZbWZY>/d8/Elk8Z@C5Q!C+q4@^ZI+WW/jn!>^%PpaK914=
Z&J48N w+jj%*XV=>Z%QlZ=ieXyw@*D*FuHWBWjmGBNpijS$tSaiS1eD=*^@SI$a=dN<QI9>%G#B8wAVKMZmuCy
4wM$N: y&:S=tGSXCl>q!cMDNecqSC%1T+/e^mj!J^\E69Pc*DIjtIhR9=M8ClcVn:V\RHM:^uFGM<Z!/HpQKS=
*uIM?n 6%lAa$cVhJD+idCVt$e6=%*Y\LiIn<e=V:wd\jlkednV!8W*FX*dNFJ!Y<q98$$:q9a#1ELXitAR\ImT
*=HB*d \5Rba^@Fp=1QMWmwuH:BR\b/SCVYVj8R?l9:!jWew@nnRt!p:8Lw<NKcK1blAbELZm15FS8EWMVJ&AVX
GSpl>Q dcZ@LG&Y#Q?M\cS:95nq19lG^Fmy?a%NR+$eRcX>Q?RW^@cLWX^Bw5ZwG@D*JhVJQpGM!4JMuJTQ*Cui
iJEEqD 8!%6\81nRwc<P8d1p=%TNE1jm^!aQPn<IDe^VEQ^!itd$$iQVM>nHNbT&YhGTcuYYQnKiby@\c=1W!XR
YaBhWI m?=t4Z8?p^qdG##Id^:+!GEw?CdV\6*n1y6Iq*tPMk\4K*N**#L\id4/</:QYuGl?1enp6qXn=KC6q4:
:m=$+n P5iMFF89iL#AuA>b$KjjZF8wV*:j6twcy>^KZQd*Z4P186be5XWi64==wnRl\%H<eZBw*?5Y<#9ujX4/
d9mlSh T+JeybnjI4c/nGZc4458PmLn8u4%qGEa>PlaL#@LPwQhq$4RF/6RI1QV5GtJq@+#:9&9DPwnPQ54eLwI
T!ByEZ FNjuMQS$Jmd4!eCA#=aiE<KJV+:&5X%HC&9jd%><%mQXMh/>+PK=q!%4Xe<iZ\Hq1=#tSt/yWb9!JXF1
T>CiSS $Feq+8<Aa@\chm/Pm$uI+YeLY/aN4*u/>!\1nH>E9u9*1tL%n>u/b*YajQ^Iph&:b1PZ@#ylBc9&6&R&
H8Ih5/ Nl<Ta9WP1cM<kBcCZN*Yi*eJRq&85Gc8TA^a@wZkumMTHi?$ypm5?/ATplW=PKypVk!/N6l4Q*8wB\Bn
DGPq?G 6d4ZBww9h+W!*>jMJA$9ZbCX@cTEb\&iK+IV5!4cV<wPNAjcM*j+$n#k<MuMNHc#NCe<$HptpYC$Vkq@
F@nTCV u9!YcN?wQ1Iw6V4\9%/96\$B*Q*wRQVyG+/:e?VhjZu14QCqk=%SJqk&Ap<ReE45P+!:u=S\EQ=NGNN?
&maa>^ #LG1DdA=K>6IQIH%J!Yin9lM^KXu<Ad?jAkCDm@5P%\DKKPIHL$A=F98c:k9G96Eb+^:J!CBJP1E?1Ae
QM?E/9 u5PEtD*NKSuZTpqcHlY>M=MM!8Rj&?/$:4DQyD4ia\FBP%bm!ipZIy=EJ%SppRhtTZaJ\9c$*YQ$Dp>!
SH*<C! ZW4RyX+wD%8w?&QGBweEl/iWW:KYa#=^$diIRV=#l\dVFJhE*mJ>dn/>&8>M6Y5SE*8RQkQN$Vd>IWEC
J+dW<q Y&cFMc+aRSEH5Dml<u6\6e#SX9Lh%ty+BGpi+4VRm>/W?C+9#AJ<k6Re?yKEA5ySe+DZn6nbLTHFlbBj
wq\TVA 9^:CRHP1/THYb8=DQC/dy%wchu5qWDj!bXq!Q@u6ZP!tF8iREDa&*CtiV8<Z8S9m?qKqT?HZPQi\GFj<
c\TF6L d!/%6T@lECVi1EHXZ<KFme<^mH6e\4h:NLKMEW=5lNWTa>+hI?JJ>B5knlH%H@bT8>wZYTyqqwmKN$/G
TWe@nE kdi9!&wn@*4!^CZqB9jJ8&\lDc5k$\<hlcm8Fda*6JMc48NLRm!\:#m^KL6iS%8PHSiNXE$u4cqwp\6t
yJH^\K *!&Y9+QWdlGVIVSTtpmYc1jSLAA@Z?mBHHt1*mFjqwQAYLGKq8bw@i=jd84MQMW*I5iS#5l@@KqhP^#<
S%DpX+ pmRQKA?K5k+=bAYGbVEReTyRwqiL8?m1PGYJ**qJ\!/>uI5KeJnklQTVDK=DjNPlt4w>ah8b:Im!5ct>
HQ$pWh 5RF9Z*@/!mG9&XZ19@+\AlHk?*k&T$/8K5hn8JjSB9qVwW4mVjX>F8RWS&qN\LaIPl:$?>D9i+Td#p^@
YdE^h% j#MV!W=9Q55ibH8E!Y+4<>\@LWKuF/D#E4!cZ?wweM\YClCV*FStCk&$A5hcPeYK<#aFp%:^#Gl\A9BX
PHe!jZ yMRcD1?Ww*aj&S<eVRiJe>nTIbu#8jW<W/Tj4&ELh6*eiGmJLZyB:6$It/*^StL>5D$WbuWct5c<B%Cj
8eMy4= C:LphBj%am8bi/KyWaB#TqIEDj9Qju>/emE@>aiqiS@C@k*miBPCC+\?yVau>a6$N8b5@EhI@YC++Wa5
?eF++: YS#a@?S9DA8peRGp6T!L#W^I/YT$e<pcacJMwkR%ymhM=#Dk$Y/^>C%+XS^w6GC9wYGLqe/V4nMyneaC
W!:GcR T?Lq1t8*KhY5Vq+b:CbK8bR/4iLSNpjC6S44<D*&t?4tFXwF/&t>X\pdF4>eSIdleJXV!u$atkl8wbaR
8aXFG= GN>44m5&*?%elV=#Djjn48SFFthy<K@4db>4PYXi9dp!=Im5^pN@DeD%t?:9DPWCCDkbwhmGR>V=C!n%
*W:LiN m\lqw\kmTc&T!Wm?ySaV<dXB+!84%=i/%BR&KRjhqu%:p%H?ENTIqS+Qc86kajmXw9Z>P&Fq1<FidS&h
^GERyw CV=8Y%&uATXb=KR:q>&N?dYBISTu^upyj@1K!m>R%?&:RYqDRQwqbu6XjD9b9NL8L%?iG%q9D&i1tSK4
jMQp@= jXIi@CHIp=PJZa$!&QihE:<NkwTAh><y11#QeAimh@$<nHNaNlKE<=6%dnyHpR:Lw\:#aHjAVZMSARc*
cH^w&# ldq<J%X>AGtnZ::jcIE5G:LdW?V6j4<t!:bdyK\elX@y^Ma^iF@H<=N!1!w6<WN6$VX5^D9tAb8jXM9?
!AJGwN p=j9^dEbKDEH*p\9DpkNhTiXy!tSJtXYh:?B&p=e!tNh:E9?yqZZ!Ztm1>A#k6:#jhT#5+*lYpdM&kLY
I4X#GK 1!K\^6QYe!WHFSkC&5kjuAujMyKNi!h\ZHF&CEiMH44Md/Hm>^RiFYlGm+6<4H=hBd5=@WiuheG4C9NR
tbXkp* #bMRkAHDV6MPPj!Iu>T4Dn^A@QhCR8J@NyPR?l@S^MV?#&p\TXGaGFbCwn%#CkDtMiwhhBGe1LY&tJGB
w^8Z?y lKkXhCYMih&IDTbER@M+6ecejq=WkD54N$c+G6Z^L4%nLnnSq5J5Y#w^<tA:KKkH4a>RE8DRt?:@qVn8
uHNk<P K<+TAi&V?1yDI+BBVaCG:bZ^w8!W5\*#:E<hHJXu$lN$tDTdGm#y>BSRn54#w5\I4JyC56$p&JMGN>Pe
uP=Y?E YuW>ChJJL+I&y=FjR!HZEZYV/N4A8YLpcEDp^TS?!iI>audnkpa@kdkMCp+Dc*TN8d*a6+t<JJ\%R@*c
ED6F@^ =ETQ<?j?$#Z/FYmMmwnDP*Wn1:N@BIpWI?lGbq8bWbc/4Mu8=16n&Znw+4YK5@uGL>M1hGj!6F?t:GCh
>BeuP# J>>9M%E1p%I#pF<dP&1<>b=8eQZQMFbt6>Gp#=PX5ED*8TuN<4mMnjQ:XIaB/+/bL1eYa%d#ye5*1W^c
q1m:TL j5:@PT?t9I6BSe!mZcW$NGjJPSTC*X<kN1^?tJFti8%%/9>C\M=kIewA&kS&YiZ@^=W@SwuT>G!k<Nm&
GYRjKK b@da>5\i&:b6&:b6&:b6&:d6?jd>9N<=Q$=XKy%$y:5/X=K%P18LcXaP6kat%G%JLM*61^!hbQaW8u58
w!YkyV /H?ll^jqYjDGXSPTGStPYAc&hS5p+?VNid#aNaXBkjE<1VRjS5NFYm8DV>iEImPlA=wbcB@*D4mA6pWn
FT=Td& @YY&YeIYdR+mdSI#\B&h#E<qc18+Rh+nD/iqFMe$AaX*G&MRwVu1l^%&:XA8<c!j8yMQRwS6aS5LqN*C
Jel?=F qBZYhjj!+?8AD8clN\YE^QTCkBVK$yd1qFRK%Vt:=i<RhS8Z+$^Rn\mMEj+!Xk/KtCkt1ItAJThlBQND
d8+l/m yqX8c5WEP@ca=H%E$66K&k!lNAaNVRAZFLqMjG8RN%6XVT:&Bh@&I%c<TCL1\Ik!XH!NpVISV<wnG$Rm
<5R=Qe <qDZ5ujwG=mH\DBR/BPTwGPnMlIb%51\@*Wt?MWLe/AntEA6i$9EpCe5Wbhuu?NnFXpEWJRS*A>lFEqE
<Itjnk K^\$L\/tby/1K1ND\<T8eT?QaS<lWaw+qA4&pZC*/HY4\+uCMp\I=y5Si>9R&uj*qNeQqlI+YIla\p/L
?RPPb! $y<S=#dI$#h&@B5dwcI@+w#^e1VwBRb=:DKEXp/A>qDL<thdd*K5aCTb&k>G9?h9eeE&qTJ!Ek5X1EXB
1wt@nw e!^6q8cNqQB>M<@iYY9JXa@KYS!ZNLI$jpbXDlnj&qJR&ndX+hPqY+pE5#V+AT/&XSkbdF>P<qKAt&a=
Td+8ln FTjF<D%dR$?RmYWMe*EXN?<\Qna\b1Sp9am#dHPN^kp!e?H6*R!lP6@Lwn=ZjuqQGA@^^j5+Eu<a%I9*
Z*4S/4 yJ+lBuRGDWPD8kI#PB&cyMeLJik>VbtcqedlJ$8eSDWTXZFT^K+i1&ypX\>=TlDPIJRbndXPGa8mAwcF
j^E6cW RqA=cHZa^B9u5cHY4$ymPSZ//Bw5wYN!icXYn+DB14^lS%eh#I8RaP9aPZI@jmEh#A!%m#!qbXGX:\SQ
6ci:+m Jd/\RI1W\pdXR\%CmN/PWXSVmj!V$*mc$5T:Cl1Hbht:1umX\bPR9LbwCC1aBd?bw%LEN#M6PFn#\6@W
$!L+<A ENAH>I^I^4T1VVmn<yRpRlJRt8*Ni$u:N<aMDpSGTbdl118E@P%tZ>M@YqKT1SDh1ePbbnXSpG&1YE%c
8*TSPJ kckCY5@RJhIVwjMm%$Kd+<1q+DHDLAS!!JJXk:Vqc5*BjZIq6^@l>Qp#TnNkM^pw+<X%NRGDk?hJMAnZ
Qe%B%C Q**GZZM1tmPal8Fi5ie^RN4NJ:nWZ/88\%&5aF+KbTj8q4C%Jtq@N$@iKMyQR&NVIqEiqEYp%PYKL*h<
%N1+4m ti#pWBaSZ$ABibRCLjIVLF9Em!>qJ19K?$cVNGyq&KBAqhw\PS>/JPDC4dw#puZk1E#pJl49C$8IYNBM
hFuw\b 6:Y#dh9wA:tLwABV1wY4%a%KIneqnN\XCa:KFVYc5ISBpYyb14=PWln9jiaI<yq%%DcVaYtNG>/pHV1w
^wQZ<Q EIMuWZ<c=&nukBZiiTQ*BFye9*uSS$?l6n<!Ymj8tAVN@T5Zw5lB$j6bhIt*68/upY^l#^<Z/#L$eS<m
M++tVn Ia#QRhp*<=C%p>&Fl19/n%F9Kl^V5pa>9J<5WHlD>pw1$/>#EbT<SHY%8\lXtCE#hen%Ika\dBWShhWP
!!nk\K JXCnE=&jC:l5whFM%&CuJcahAa@RdypLeNmwY&\5hi/yJyIl>Jm6ZRmc1!uBcA6ZEu\u4+C%^VN1ecjF
WpaH=S uIQ4p^9:V=j5cX!/tm>6MKCAI%caEZ65!=Z=hJ6#ptSuiWD:qt6d/mw>1j6Z6cun#A#*6JQ#1C=#icPN
%uQPbH nX@JmQ^\ibDINqX!&!Aw>4!8M!m+p1BR4uCP9#1#KPCablGD$tt?5ZD8b##SYA=6S&+!9ZqId:*4/tXM
imSCGa QnEb8MGlGmL*GQ9Yh\&Q4Jutu\ItF#AdBhK$KYFXjH*B:AQ@PFc#:N>yGE\up!?hy95a+/&<im:NhyVK
-A!k58 0003ee46c97001202b4 Page 392 of binaries2.zip
W\F*dM QP#cViAV>i&llSB?D/a=#6NR?VHim\Nk8E%1^ch!$dW%RtG&w=GaSFpAjLJ9*qb%G#1WGB/am=BS1:tS
eXS+J@ \?kewaDTSiXZ9+=>>LYiqK>WQ&L>!hL9Byc%*X^XhSM\dp9#ulkn=d@T5WmQ$:LwuA#ayn=a9Ztui=8l
:b>HbR @cdil:BKkKbul64=DQc+l5<R1t*I6apHtKTp4!*SGbeTGnNmmnu\nMDwCS*w8R:yFi!:6YC<1@t/LZkD
t*Z$t= m\X:1IZmn@T:l%T+q<4w6PY=9!WCmRaaq#MG6YZM6aNTAVAdJ+LctV#aBi<ymdp4PX=/Ju=:66X+QmN+
<\QdG5 kH>Vp:W+1LV+CKEYJtI@uGF?A>l/E+EGyI9/MaSm6p$Gm8&H>J6=Q<E^qm*:6NB+ni9:1I&GnP&T%=9+
eD<4YK RmCiN*McmJ$aLinVn9\/m:&SC8E$MX$DK<a#M^bLM6=LPH/CDbEKEL+^6e6+K:=yKFG!NQna9&lyQXFR
5leyn/ +%9RJVqR:F6HL6FVQQ$!pG\LR1SABctm4:ym6Hyk6Hw^nm%GSpS!LFyKJ?!l4Q\T1pmDKdP1GV6RPIXl
D=Qh#@ AuwH89cG5Qc:ld9yybMFkj+GEWb:EHkD1=Mbq%MIm?WFLbJ:qNP:S:CB1T<HK%LFwji/6*NlIdDE8jNd
1RD&C\ 4R6/mtMq9*9#ytT<14cDk>M/wP8!pqSHFINcmpK+nwkH4GeXG9d^KV&A1SSdtBqwt&dWp/Sjqbp+J9=!
@N&R#\ GZ+/q%cnL%WJtQNaajnS1BFku55IENK:5Ju\tVVKJ9:+C9QE5+8nup6/H19d9#WGGCF>GSJ=lhZ\n*XS
5K::8b yK>:9R%wSPlRqCh9ua<b1YQMu#?+8TCCD=T:DYh&EVMKy514I1<:t%*SG=y#IcJ*mBY/5bZEp*\blHLb
!CCpp\ 9amm<:9\MXTApjjVu>Wuu*ELkS!J56%41?kEaI!/RkV11F8IPi8KR$BFqKd?cRBR9?&HtwNd<J8\L6Pn
M+ZMh% 4$+SGttuheV/quHKqhAcnZ^ln*ByFaXSmZVVGEMR5wpKKmN>4jBlELP1lJA!X>mqHiblwT!qLWc#1D+H
/Gcw/: DBeJ5YtTn\1R89SqIWJqnl^#LY=tI=:TPQbGFA5Hy!qKMbw#FaSRQYpGGBbnIauqEw<#9/KDH?I=uCyp
5wakk@ ceAHMmM5najyC9cBJTGpPZccEZ+!t!iGuYelkAnVFXLaENJmIPZmTJ^JaX1B8Te&M+G!Vpm/5W<yaMla
>wAcDH C&IX5^MaK<buNHkF9+J4tM:LQXjaTKRYQyaVpl8J$=MZAA*TK\5DM*ddlA\4N6\\CXtEy?EmiiSFD?KB
+k$p^n 5FtGC=NTDe:R8h<RtSWlY^nbnV@yLiI^INQ^IaYVMqaw*N5!PJtB>X9VEKPGCTymCuc1p&#:MWHGCGRT
^6aYT! hw4J1!=SDWXyI+laP/h5CEMZC&Nq94Vwl/Ae9+!CSTq=8=D!AQ4\C?@@A&cY=VRZJ/!uI@AtZKETH5Ib
BYn>A= $JeBEjZIXN%YT1akG/ZRF/%thcw1dL>mPP%CH<klBhGWQDJ\K4&#Q95SKi:SH^ZAFB!SDeeVW*CTjXa*
=EcV!1 AQ/TbkLZN6\pEaLn=<!ttDiTyM!b9G!miG\ZVY%td&PtWklBZ!/WMY:X<hlFQZaSAmKZYl/pim+W5jnq
SmI?Ji &$!@hA1#hnIDWaK4bkima^dTwmkZCd1VK8\YVZC8XL$myLeVVZCKCYLLn#VKd<e><GC\HI?Y8$#d?6\Y
?4mEBq AkP%HD*IGGppbbck!/R^YE#JqAInX@wYIna5D!>DDh5qG@+%b5!ZjSLN*nhSVaK9ed%pQAkl@>^thTuY
wbKVwY pSkq*Lm1Zc%1DM<*$8R^Cue9lnRyJ41!H1V/6@ac!MYyShnHSE4K/ynVj?uPiCqN>WVF::LNcPJe!\=t
K4%I:/ @&+nWcI1mAWRMeZF6FlWw8umyCXTq9BV%w#QZ=#=Y6nn1AVZ@EnWFPJGX?tAAdFVjZGP94FGBK%F^PWQ
<4^hNP uk8ylhMM<%njKY$yIc$XjW*F/R#6ka!#MqTC9\NGHFST$e^EuDA@Ch@Aph+MZMWkZKGWc5wl:SuKNZpl
ueTR\Y Skmly8PGBK*YQnpB6+&a/m8I@+&&uW*F$eK88lDQYYZd$dSVa>LKC1*IB+nKKy^Jm!14D+m$Epp<jp%P
qXbGjQ #iuNK6SBjbY!udZhAS5Jb\QACmnipe*MBjKKD<G$E?M4kW$^X$GHN?1Nt#P=!jkj9WF&HWYNeuF8STw?
TEuVm4 LtI%mVy6:<R$Sdy9/@JZS$i%wjGRen=4d/aW?jKu/jA9uYNywWEaF<peJqd1?hYRAQSj?9E??lI+D#NE
@jXB/: AZP9QLc*:etw+FMu:&RhFub8:#qcX4b@dSwDE\9dj**cj<V+Z>5tFJTQ>=e$9AD=DVNp:p%8hwLRWlTY
9p&p95 /R=HGcWyG1pNlTZ5mZPVDS=HJ1i&w1/MWK\@aJ=+*Hc1EKZuWP?MPRbR/wI=!udMpJ:b&88G4b?BT\+6
ZSlVR5 tMb6?K<ewBW?YQEjIWNS+jtpCec&Q<#<k^K#5+>uGynB\J1<TJH?$6SuJQWNbQ=FIFQTWYXcGH?bD>ea
9+*9>Y aBl\CnGc:#**NbZ$w+WFR9md=eIIi?t>AJGC+%npTARhI6YGRhGCm%AkAmEtkac8*TdN\J^Sp@EXqMVp
@b+X^: 8JmiliQtklqwBqDkkGtTKydpBuSRC6GE/4E1Xk9:B$X=k\9SMCGWH^tbqD$t!bmCFZ%&tkZN*1n@<Ptk
mkcFqa LKuFWKE^a#B/I<*diZY6DnwLjYAMNc9I<@c*p816^myqF!!bMZ&cI&%uGP+mndAIMVkIKKPFwClNXQ*R
9DwjaA u?###Tca$6?+w#a?wTF>u8eLh^w**$ui%y*\F$tmuCNGjpyMlRp#5Hcww/KlNcNpFTyK*qZieC:A=$Sl
RIGT/Y V!InVQ*ab^L@\pmyPVR6Nh=tKWwIPcJ<!68yAi?T:!$mLQd&Hiw6L9T+5^6l#&qNm^yQML/M9TpnTG@Q
+VCqGD #>h&Ed@hPTb^!V59SD$GQ5Vt\n45:PlceV@YbtF<>im:MLcQXA&5I/<pN%T>MjSu?LJ$#R4e!5!\15tS
4nb!\t >ectqXD$l5MW\$9M5<6d<CDTZjJ8akwLjeL:Q<L\q<NV5BDt!uqk&FKdM#M58:$4j&Rc!ja4=4yEqYWS
qCpiED ?n41DT*>IVB:muNAeP:d??\Za??YDTkRpI:&In?CK@jQ>PiNCFjy6w81$qqwbJl%<?>d+e:p:^lRuJ\&
951NRJ #P&V\+\VBQIl:WdDCy/!AEyRAkZE?DNWJ>ea!YXJYacdnyEYp!ddGiRlW^=ITVB\nMaFF#ub\<BKywFD
5C\S^D SGZEAtF6&w55n+Guj!h:%kPcVD\#?8inS\&pPb/RGR%K#5$Whp^=+e@ilSX@lK@b>QnWH^aTa8R9Gy&\
dB6X$6 i9DGhtI@w*JqbVn8N!+&L@>pBGqI81XewPC/XkRt/Hnw=DXeiR?T^QlnlPanuAykNYQYPJ48MbJ5lKk>
q%INEb c=b\abAB>%T/yAkGc&V^E\GZk>\q>d#$@it!9Be\YG#*/6VkcD+T6IB\/aJ+&Q\YC^btmh86^H+ikLpq
auZwXZ tiNLDDWy59R!uNeKkwPKjkGKBKah8aVRE#P!>YJ@5TqRKWZ1MBM?e4m#Pp#1JIMmcXSWWLn&%Vqpw^P5
5k&XNW kHiF$tH+m8P#=##NNW=dc*#Bby9t+65EjtI\IYSh@!Ki^tpq$KGT%AF4hB=4pM?<6S6LlWlhP+T<6==D
lM@kVJ tY/6l?ZCpdm%BSF>IwY9\j#+>?mTNH\C@/Akd@B4=JtQI8#BQN8WpmSYRR%F&HM6#lJlnb1?C#MQ:G6D
NICphS =/k@u5^/Fyc4B41\yPFdlK$J6#1+&A=\%+GlCBiS%JS9R4WeGF!nVmP+la*&a?!jm<%!9&bLXhbmtFB@
8k^Gji n9NkEh#WiCu#L<u%=GAS:8kLZ!ap!TNT>yHCT/SWRA?=SqQ%4+KJucEjbEeZ6LYNIM@?KpjSl\L5tSW9
T>:C%W E68F>DCq9%T6WVjiy$#FMhcGF?1nSjnCIjGQ%Kt/>c=91Pt>?tEY!E*%d4?^tMQhMi=pAEM6j1L#5=CA
i=NJ/T e#Z1RF9BLlt<C5^QCVM^=HJe/hmR#>h/<G!uH8$4SIH/B!wXaGR:*A9ApM#^wlRkq!Mw<5EWpJIQV?XP
<?bH^D w^d:VM8M$KAW\ElnqaGVYCVJVTlX?Tq8Fe@/yQWR*w\8j:NY/VNVMw:i\8d*L:HF81RtW>:W4pAVC6S$
<JihWC <&/YZaV9Ne8C=9edhI+6YT+4\KjJDwQZMQ<1qM*ZD@IuP?etd@6eDeI:mjR<eHHYqhZ!=*dLLL>NB!qh
\>X!Kd SlKRJ$hdl/?HV>$m:bH*WdE?$n9@6Nw\?%c8@>WVRlPP=^<wE!nJa#qi/lp\yKPk*tBJ^S%$BKb+^%Y!
^JX@/N aMHt^S%A#/$m9Kl1QLtj#a4neVpuH!?YS%c1IA64mk>Ftpc=C1!!l/8&J<6%<cb#^ANVFK<+IW!B=4E#
1=Vp>X tuIS*+pu&&C&^E1pX+bCJM9qJBMLLFqn:6Sp*\kSMWPMpHiibLJqC4=tp5&M:cAW1XmDtG%L^1uYkISa
mZV5S% /H#9/*bbMLA\+^tV+$E*cEpcEehYV4BJF85&eEZjVBd/ytWttGLbtyb>Y&a<hHPMMdh&LIEQ9n<C!k>R
l^4=eb 8yQlA#l/Q>I&=F<YIYBPdIpHh:/8SdnGY6?dJ<<Dj5JE>P4idWJab5lwl/>+Q!X1DkpLFqPBiTbE=4>A
@GC88! mXZT&w=AjnGY*YAX&!pu#N%Zw%iP/Gk>Tqmj$D<i1:\K/M4yK$J5aFbYN?P8Aca*SI5tXRSd#wC@1V9D
clNQJG 6I$w:llJMYqbtik&88!!5A9\j^/W#$AK5T@RwaH6?MZ6I5qNjNS4>lWHFcyISl6&aZ!htd#mAnKh8Hu1
#J/^\4 !<N>8w^ha5/n9/q\l!&lwn$+iYy$wlNGHc9$ij+nIJ@=Kk<9Wt/W?+ch=nRFN$KC$RR4y#6VD>G:q\6#
A?Y$EP btquCQ/Ym^SbZCIZ?Q=5ZLhLJIh<NZTL1*9qSDwc%kA%=Ip<dcIR%R>iG>%#h=TnP/T$N*WuLI#&VJpD
KqAlF@ i>V%jTVlEJHYZR#\Sn1mLk5SIwKXGTKtQ?^pCC!YT<Q<SPEVT#^pRa$lXEZyaKV$YMeGeIeuXKb*H!H$
4L?$:^ P?1TjXIKNHKZH^=^Ii\ujVG!Z+8nhC4&YA8tG!##jT^WLpjAEtLqADHFG=^kjl%\P^PRiL8pQ!\QNTbu
K@Leuw baILajIniRdVQSwEY!4$LXZCe6JkY1pKVa<NdWpGPeTyhJFtVCEtie8yDEK5DL>ke#jDmpABG^*kjHam
&PHa>P jmjpaCn%W$c+Edl&MCemjuYQGN$IS?nFe*&*D$J\P5ECI=*nJZwKMqc$B>cVn:CmbahXY+KKRN+%YZ+m
$GeM#8 Cct^:ZeGb\MkjNiNTt+lXCMtEuF\DJM&G8X!a=WQH4k&BCKnaTIYNCl*MqDBa?E%BDK$i#*YQD#Ce6pH
wmW4uI NumnETSlQW/=Q*8Ii9mRW!?*RH8$EHlRRId*HP4ti8:lA&/RQ1kSQyN\XZkCE<j<HtdkHyiLCAq&WT#&
?El85X SZGpRI1MVjRIICWHV:p%M4E*C4hZjNBDb6mNAi4*c5k?wYilDF<tdBpGT?jBa!q#Nj*RGEp9^VhZP/kD
F&B%Zd XcpShEdPe/uBR%LqSBaVZ!VnWTtt*mCSa*l#K<@+DkKqJPu&VwZpiJFY?!DDa+IWYitlh<4Kj^umLB6P
MtwIdi R6*%Mp%eM?#BqCAIW^clh$u:eR:*AjZ!a^ZXKt*VE:>IWIuRbku&\&lVL*+!>*BRh=1!VL@ud4YMX:j*
+H<Whc 1SDqQ4qYAV?qRa\HMZ1uRZSP5miQVwB!NJW$K1PphPClK4l$QD>l^Je%MV\lD\LCCqdAA4AuGh=qAlY#
Q8E\=! Q/lJdR?tQyy&Zi@/=/B1jEdLNIJRqq!J&RyDTW^DX%DDqjkdPDdupFlt/uym$Pwb<DcbS8\m$aKHJXC8
-ABmyJ 000cc48775c001202b4 Page 393 of binaries2.zip
t#LjM$ C<Awm>FFk$mZNan#LQmTDXq5&^ajYQBpe>wq&:HB\1lAP>Etw\!bK\ccCuGWqRFF5Y<A^kb9D*dMwSGV
/bQBVP aWIh9WbFR$bDdBCqkCCHJV1dhRJCepS1HFtVF%q9\+IICRE9JEkA#H!a>%mJGRWTcjyEmc@Ek6RjVWIa
XpHmN= m#IDFCAX?$VCZF\8ic\IH6^6y?Ihw^mRLYka^hSFkymQdAmuT%:lZG?ue&GWTNwWBaH=T9^E>uwyt\VF
nnBH4/ !P<a#ZHyFW/L9aIRIyVAKpGmWF^5Q=lWdm?8M*CZI&?6nnIG6KyGk^+lk:pS&<Tj4aJe9hHNh%lSw8FI
hnMN\& k:1l*Ep8EEWIFwSTjY@G*q^Enw4=G1LKH6pn\jDtt\4E1TtIH@!kc\FElJaIuE@@d!G:L+RpVbVIJbmT
?ki&!w +JIkP\*I>MTa<?E6ZN&hRMpwh?!Pb/\Ie/AW@?YBpjEtk?tBWBqAe1E/4F\pSITkW9RJ@&tMn6@Sa/EP
=9kR\: *PRj=DFFcBK<1SB/@t5?MEeuhe8cy?maHL5JuYR*XnCn>\RIybMmR$1eCimWZ=kL*SPktSKaHetQtdFa
J>#=*p EGaVML&<i&RQtMqL>4IPq4&wH8SIPbGYtSJ\=DB!ZepT\cwXuiYZdCcE=5JdEW8>/6NGlph6ZuK*lSk>
HYTR*# ynCAl^yctD\NtjM%@wWeBbJS8pV%Q$8IlEFdBhRqaIeu#MLD58IE!mk*Qk#pXZh=@CS\PqNLFtBAK=WF
WEQ%4M t:K$MdQFKuX!/qcXWJBm*=Q$XePEieL9YmJ!kSXCAnW6FeKuCM:y*JHH$6aAX!A!k?Wci9P!/tE\XuK%
?PNuJa +lTAl556mp6jitjJ/tK^VJIHIZI?9JJZM/ZcuKdpHZik%IkKH!jPmw4Mq#HhLCK$PqbDM!XZLDCW<$WF
4:&Spw ?w!>b1A@M>ARX6cAuM:Lmwm#%mL%mlJwCqh\VME:9PTD:C*deBB:>!b$>qSNH$4H!1+\C6JwMC%ZXkpR
t=D>Nu 1^XC8m=Ql5nKXmWMcu+bMAVL%mA\LABJ\k1GSC!MW*pZMMyHPmG>=tcS?PFESmBIP8IGRpPFd5R@WKPM
^pjBCI 8pIp^uabQm6=RYk1yte%9AS!+NRGERhQlpS5@@5S^5:K#MVP^MLP!MwSCpbN4LA/jP%qCH&K$W$ZyhFT
my%/Fy +^lj6bPPPWKN^Yw1<tmHhRwAADbIE@LCC5^u/+/iVTG^$8ni#ujQ%p?elCS@ICee#9jwlaJwliLY@IVn
bEMie@ 1?Z>4&WijNp>/j#^h=inw%EYBlihX=JnRa<4KM5:q>6FY&ISVjGqBcd%+Rb!?hHlC8EBQNp<5ApkHWQ+
R:=bAZ P<G6CbI*yyeEn!=PAn^hG!BPnk?KS?Qp%wIkZSNL@AHHY<M#/I4aibulWiPNuqJS+N<EjaWiN$jd*\Sh
<&W$SA h<cC1&dBYVi@KdiE<:%th1&CBih#^aK41YwS!=A:!uPM+%+L8#WcC>M:8a*HJ6\KHwWCd+WTV5E8qwpp
PBmj\? #w<&ILRQQB^PAn^ey$A4Ab/=n&edIAGS1a5F>:jNF?y9cPZD:Bt*e>=lMVn?F9&<C!/a9\65&eYAj<Y/
ci9kY1 S$!%1EW#$NYk@HJI#LI?**>p<Z:/5N@tiBLa?l8cTY\WRPNF6I5J*9B9blKEN$<I=aYV+EPR4qFapTII
e4BqXP daKC1PPSHmYIE?i=N+<Vb<D6AL@++AGK%n%B5V*ycNVT1G/4SQ:uuKAb8kpYq*JI+S*Y9*$Kt>ZpYQ=H
qWP@ea 4QpX*KHiZmK*j/a@jWR@+XuFMpqj\$Yne1\CTNi=bcAk5kk!>bI<hWH!*P6FB<DD!apV@wG:CaFH8p1e
j8BYyn %\IFupW$ZBjQuuh>^u\@#Sb>&<Z4iMLYa=9=e^ld6#%p<*F/WunXCacCH*^E*kqYeMXy$jq9\!YZQB$q
\Y5T\+ q$4aj&/LY6VNd%Tuqu&BLhun@nL5ZZC:<ey5h?baS?YRj8/RDmW%*+pVF+BH:mXIkIi*IB=aP<n>4bEn
C>QNW> mEKT#V9<DeY*H@>bj@<HL44iB8kc1:<LLmm/*yJ&^9<l?Z>P@k91p4NFLQYQFl5wHnj??@WndpjQQ91a
XY:+TC lD4\<Q#BPX5@?cMZ$4>k/SXJ*@tj4JLRPMmj4BEuKJCBJJc>8W^=n=J>tl/%Q&pHt1H4L@m:\JD#Rp@+
uWKSDS 8%l\Kbilt$\8Pb5Y<9n@m=^F:J@BA&=\l5Ph:E:9$GipSKMk6\:\TH$<Mkl1PSqI+wSa%u:!w#\9klaE
XJ$*?@ +V9=jiCl6d#\@%#LFu*nn@9yh*W#awVj<pitQuTS!RX<qd@/K*A/::%5>n@M=Gn:t@<qJ!>kM/#KEw8t
BnMRR1 *QK@#b6l!@/q!TMi@G#cbP8S!<Y:eJ\th9Ae><adQ^5@Gktlnb^\*V@E/5u9DeSFI@Z!*HwRd?V!MuWl
N+e>mk pT**p8A^SN8Jm#*h9Hjn6y>uy$ZZZYCF@+ei?j>e@A<+C<=t*H>^1yVj?JijLaXl6?>9QV@ew:<89+Ij
=^<T^B !Nc*!E:lapuID9IHc^V@!9ljS8DS^:N&eCPJm#iQp<uj@SdG>94/\yj<p9\ZtmZ6WAuRNSd$dZiLVyd@
NLGp&A QSZ&H+i?\V#:Z&n8eZ>y5RNm<b/8**F:P!BF?XuH=+SiyiPE%wHZCni^A%<lMt@1?YIh^CWV@E@i!QGP
9S8i\k E8TE6k1uc\K59bD<>^L<D<HqS=>H6<lj<Q\h#@:@TjajN::kdNH^d*n?#=*@/nttY9=+<Dnu^uC$!?Z/
Ip\%u1 ^jeNF*lwE?K#bHQuuX8/J6+wEptCY?5jRmBJ<Jb:CZLThj?iV^DiAJFJ+EZkZp?eIMh>KL@b?@b@wjpQ
yp6d9B MKhqF>k<Zijnmu@F?#^H9?S5Lcke+8<>1D4Lt\aA<P9q!\qcD6dq!\G==khRaLGtA8CQD\SNAFAH+Jql
n\4bV5 /Cbt^tK5#CImJPTJ&HX>mM&1eLpY?Y>GGS4L6k$Nt\!1D+&R+5*tnPEN=&!dRbn@uZI?9DGmnB&pLFY^
H@lMll pckYj1imEqay6#lYmVMY?CaT/&dYnVNd>@KdL:VE>1@*+T?$Dc\9FGpqp6S$aG:?h>CIp9iSn&AR>md5
m<GuRA mjh>^5m^%dE%/IuZqdB$CWy\d+#+t56\+h\8NXanHVe9$/9AwK\*!q<>R*=KJ\^mCFn*G=wJ&M%>R5%^
@YqmyA PV18EGGeEFFI8^AS>nLwISjNZ$l+n9WyeM4XMy59FPueY1EQ6MVk:*qRNwSk68!i$k$!6*R@yVGW%N\c
VQ=Vcu 6<VT&I\94t:@y&uXVVXH$%kCCG6dVR9:+TYuAD#196!4ck^TuMh5j*pa89F+WFjSZl//%Xwyl?!k%mia
aNwbjW ma&Y5HXT\nend^lhM=Jb9A9pmM:MK5TN58&KjFPGi$ljG1PTJWb:9mi+iL4Gk?K%:9q@h%:dZBem*=%h
9u#G>c R9^cjmV86:wVj%mKC681^F!k^XmpujPVtcdIJTHBamWG=eYbddyp%Ehk5SlDnbCdLYMR@l:?A$:nYD?+
6IP\n& >6FRW9jtWFKnah+QMGJTYNt&\Le%PWVH\hdl%8Fq6*C4e^WZmIq9c+:h%tp=eFquDctl4?H&?6y6LX1:
5:1LeD $q84<y$5^@Qc8PnuwycQcFpu+1tmK=TT:CEwPB8XIIpaF15eJJ@kH*C?46lw5XW1I6H89j>+T89/\\y#
KPpp^j e@h1T9$@8LA$4teN@1q#mmSX=yd1Gk\ADMctQcDJ^e:^+eZJXd%pQc5>t\+H@wd1nL>8Laj+kNXVXC:=
E6D<DS 6?:@ypih@uwuCGlhtWN!1=Y6X4Qh\j85mwLyMw&/Ma&^9ENb>%utcV!!=^@=HSpbb58Sy/\51/\5!=EH
Y+dZ^T RpPSR4#M6@q/udKP8+XXqIh@IhMGENMaTYtcM:k<SPb*n=RGT!1P:F1Vdyu&uB1eGt:WScW9JmjdSd=q
6?hi^& L@>\Ry8^d5#p?e:%Ydc&=ZkY15/DiJyGBcqF4qbSY/8t?\Ww41d=Xu66N#PHHSl+wTL*<A8ZaFlSLI+y
RPB4tk N!^KV1mVT\Fc1/51$nNd#iaR/=69AwZ%@@n*h69@8JZGCcMEe@QC1QA@KIy>whWYX9up@1FW+=hQa=4X
Y!5/l+ QH\q?i>MBNI@6P:?LJ\I5mQ5:LAnHN#aJ<GBeFkYdqF6$VRdwn8Yhb*lVy19?QP*lP!5/uip4AWLl69I
e<\$mD KcintklD4PLw?$!YXNHWjk^&yJHW8<Fu\=J=M<qy&HapyJJ5W\RLd^N?%u59/e@9J$PI5KK#JpQAa6W@
Q?kc4! B^+^Y=!5\MjNh+H?+&5#by5IAW\b#M$:j^G#=w64lkn?AclSF??CGDGkeBu9knE4WBiu#:aX8lZS5FQX
jXB6B% /n*tLXiJuL@AalIEc>QF/!NSLEnl^GYW@AG/1qP+YA^!e>N?@h$+1$?$B6l+\WEKBCyQtba5JXG1d#Qt
qqnjNc V9qWiPq4qP^t64&VwL^j/Qwm4lwTLbnR4aQF5q:!n&8<yk9Bm>k!l8F6MDMw\y+wD4SKil@Vy6#<t@jA
uk5Tj% c@=ZGWDTkL=?4l<#5W<J&XT$IPM=4?&m#XBw\j?Y6ZHM8tGL&yZHlyX=yb4nn^YBcNm6Y6Wtq%y%DCBD
FM6?Q= ?aFwEIRACMJlnhw>!9/h%n*1n%6E%yYMC^u:@EF=Ri1Aa?/Ke&KYd1#t!uP*:db#6qFe:?F@w8c461u/
yhc</m Ac*VM9#=t^eQQq^n%a@&M/:6j&d+Z:*H#:lpT<:hq1I4#qtd9Zm6%beic<Hk1dWw89D$D6RYt=Xbu^M+
%Z5NJe pSnY6lnM6qZ^lCQaJ&>tK$jY*%9MXpe8\qF5I*u4cQR::&Q%Ii&$$VVtjYmNCl4jGRM4GyNcGYuNKR&4
BEcpMR VwJwDT5cy*EpXj?$Fa*d8j:m@=P??\Q?Ycqd$llZNR?#R9<VuA*LLY@VLjiYcN^@Wu19n&8q>SbY$cSw
aK&nK4 uGD@qaY#QT!Nn>Kp>6+ct:S9eNje*anGQ@w<LipF/dC<F@^*cM?QuwdHj5@9K+9WCY^a#d8X>ku5b9tA
1N8?d1 i^Rpce@@6b&G:#G8+TVZ?KJJ/dBHq9b>?by:NjmkI@J6QRqN$DF#&/X^+lC*yQG\jBqN/c+@e:?PyZE=
%=J?4V F%6a@i=14n:TBDh4@$9TbLc\\Y!&5QpH5bB%lX9X<:h*4*=nQi%K66HaJEWa\w&am?8>/DR#bL>XBhmb
*QG1SD !Z+NqY$#hyaN<9wN%<ZIBn5!$L*6#n<T:QAcP^mMY+yL:uY$l?1TDEwmZCGm*d@VF1qA8Y!SDP#\CY^j
uCQ?8^ uL19uq&mme%%KNpY*wbDSnP/*4*u\HGkB5ii9dVS#5@S9yXIPIWMWlZ&%58*m!bnT+HZitSQ/@8ia$S>
5tmw$W Z&Yl%AbTla!G:Q&eklJKwneG1dlTM*4&1BI=1D!aSLP<K>VHd<8tc:p>jHwI>%+1qmu>ThC?Z#F>lk\i
Z^+V/6 :**p<PZqMDDVhaTM/@CIm=jEeVPWTPR\lqj8^yR#%BMpKJ/TSM5>M=cBa^ij@ck!=G?d8FG!^awNh8\j
kBWen? HeFiQl8pFKFI=Bnp/FFQS+/y$\S+y1\b*@9DXjS<:Vb##Sky?D>4YTV1YRuY+hlIHL#K4%Pu=LDmIGZJ
DDVKaa D6uW^?HV4X4BS9@p#wR1GW/4hqaD/>aH4N&Y4^dQ4HyYCT>mE@9$WaIi$4q5F%IdFw8n#Ndm61*n<tPL
!PB4/X Xt8V\+FTL^im/&EdhNKy@S%5Tb\=R&DM6:PKiiZ*+4ZNKPpVl/&LwlMQG*GNJ?Jcqbd<HRB18Xd+jP8B
ja%VYu #:Z54XQYAFii&jE/El?S#SnAhnDDBa+nF?&l&/^I*9P&QdYlG#Jb$qQbW+@tZ*+dN!Z5bM5p:lwV<le+
:d$d9J 6<V^@wK*tm$Db@8R\^=c1FkK&d#4Rd6*t!*dnRuI6kuIAXF!cyqYpLSp8wE6Km&*LcdpK!!&IK/SBQuP
#EKy/M Dm:#R*FX6Q&dYS?^4Vy&k>:5i8&tPcPD?L#JRFFS#bVjILBDC:l:pL9M1D4G*uCpDP8Z<1BYLJk58$VI
-AFW4< 000a1a0e572001202b4 Page 394 of binaries2.zip
XQ\=HG y>DP\%$e8u*9$X@wh>%*/j$IeTK1y\G9=SLp<%=L6KhKTAWJ&AHG*+#Nq/QHC*R&1JhYeN*+<4c>?c<F
R=QPA$ ^k@PNtcdut^e<WP:WhhlVG>eVb>*<Z9&LhjlNl6&b5jtXR:RiS5P:G!4*Q69t=Q>NwhHG$a@^:LbTcd5
4KGmnP tk@^q\I&1A\je<!w4*d5#EBD>CkdhE5d^LT:!9Al6t:&4D!PEq?YM=+DS?R5B1*jH@9*Eut:J>4&E8@m
9m/uN& :SWh?!iKlAKqW@ue^G!?Z6>cW//G^#kn15Zh!>iQ*<Z4QRmQlD&\ZX6Nei?8QyE\=iC1ki$@^C!u*>>$
1!:P>I DQwq!dZGt$5H9MWii/6$VwFy9\lRj<LCR6*C*ML?Ddj\5LD$<QC\@^8841=8d9>V@q%$e@8Q@4<n@J>^
EcmE4T ?9<blIZ@d+Z@9:iH@b?iH9:@8iH@MRn@Q!$nA!WFSW=LA/WP+pZ\<ZI#S<S#89y8^<GaQ^ZNDBlM?NeK
E$:Qd4 58@eR?WPl^?:IC>8@6ykCGc1Z6i<kk%A^1dQpwwE8III4CYkpnk1m?PN+aQ6I$JQVSd<4a@wJpq#Qb*y
%T*BDp %<GBbN>VwInI/8L$yK8\DwwAScTG95>+Da?^MK@qk+wZqcQW6>JNRRM?p+6/\!6/JT6%ce<NY*yye?D\
i\FN+4 <4i<yy/!wpeeJ!tW!%y>+QT#K8QNPtwMnl1d9$DG?eqS#IdTPI#%EXX*QV%qDh1/SuAM9MbWqtC^ptRy
w4+hEL HRhkdSZ6q=9clL>ACNjNFVwuuCH%W/w=N>pXP<Nu#^CpDSwNRDC>kQW%ZL#AaIk<E#1:RwqXG\^?=@dH
dJ%?mR c5pP1H6<#lHHGdi=MYA$4m%Ct@h98dPHpIiJ+kRi5EQ5VT/GZPlwtTM6u+*L!jDn:lbbCd/H<<I8SZ^L
9p%PmF GG@Y5Q9R=Yu+^VtS$6n!=^a&4<j1ZnZ9mKZ%YCu%W@PM1ZlQ+@ScpG$AcLyiQLMDc!jlEIB4SSj1=/tj
&wJCnu kEN#5aYebdnNX*NLQKZmL&ydeRLB=icLtG6i+MnjV$yLD5L&l%<eD#$b/!TEHl>F&?CYJecP9+4Q8Pd\
#@TBy< !Id*y=9C8@&4:RLB>d9HMwK@VF?X9N#jZZ</>4LW=lKAG9cwj&E%$Lh+R=Y8Hk%dFyC!PumT&#9BydHJ
WXm*c? DRAyNtj^=yq&b?8bW!eNKBT#D#/l9k:^SkPq=p>A*ML=uq/cFw4#qGcLpjp\?q6S+SE<M&&j*y?%bBT!
JL/m\h t+&ZAdpGY<FT%!+&Qjj$pSWWw4Q!5u*FlTTKGPFpPak=tKljEyKk<$<a^Tj^u9*Ymk^R91FdC$:kMN^?
>\Q%ki E#lA$5ul#Ge8p8w5:huL&/^pP%Hk+cmHZZ\qVwFH9JN%y!S!HL86!^W:mn+hGq$$A81m<Ri=P^Xay?>>
WDa#a8 8^KEm?&5/b%MGySkRCukdT$E6yK>jGBVlup<nLY1I&$atqMCEPi#FTT+Y%D*@6a+>ATFQXhQIEcN:PI*
a!HH%% AhXhLD5=8HDCX#$Vy>6I<$BEe\DNYT>Y%VNbA8IttJ^&t<Gi$LQ6#!tj*BF@Dn<9P1:V&u:W/QjQhkYB
*k8QmT H+/aj=uJ6pbTCtc?8DdC^K:Pi4Xnl*tj<N=Y%Sq>ptCjMi6bSWA=XSm<YiNEX\8kw%t>@^FdVB?P8:dQ
B4!PY> u>%+WE>+F!Hq?6VT@tJt%+Xb6HWbben6AcWpa#9K^YH:LnC#qXc:VPVqL6J1tdyp=Tquluh+KPeK*p%a
G@5uhn QEl*P!e5:6iiQW::HESpX/DNhA/\E/^N!44AY1%S*+XY>tdIBV@m4<16<lVM>H>YpRSm\!#D1QniqIT!
anpb\8 ?GkTYuNQZmuj/GWEZE1whwu+p#>%I/AWX@?#BE1DeTDqGEK#^14HZ*:bqRa%lnj#lF+!>\Zb*8ncRy*S
V@:MCZ $8@WDw\wTiiwKRd>&J:YLhl?VZl<H>9<aDW!$\uqhp%Zj<aI#B5y5#piPKD&<>59q6V\8t!1i?utI\$c
/4%Hqb *nRh*ICuD9?yXJ^h+/uS65bJtV<5mNnNFTwB+bbl>PkiZ+$X1qBZa>uIM4EDFJ6GHEFBl?#BaJwPuLJG
9uFFA$ SD&dQdEi+jQmll+tIRY=Am#IC@^HeVPA<uC%WlK\WkX>SW66\NtImSPVwyD#c6tByLS4LQ:F>V6qqc=Z
C*GWd8 ue5aA*W*M8Ry8iVMy=5adp$=95+ISVQ1IiQyCG?lGN<Ja=\y@HVTd%>Jlp?HbNkVd4aNQe\dbp$=jQYq
VHb*nN I4PM/MH&wLu?Me\e@uuX9Me#L+bWcbp/KIJpSdL#8YAtXCSHG@q<eDGi*ZQ<LubB1Xul+E/c\cXh6n?V
WSNE<A ucP4\cM%8%D!BwCXaSMtj8bFqIAZ+PFm/aLMCQK8$uTwk&CkeT^Lhdwu#%ke^G&dSZPYJ%!KWt1/ZIu#
>e4q:X iIHJ9j6wnt>IF*%Z?eXhAV=<WccLNqw59tXn4N$Z\>uSS<*VBLNy&$6AB4pCqy^WI<R^%/=XiA!VlP81
9B^a1t AMtFeVQ/K*F8/LEm6!Pu4YR?enhkI9dM!T=#QC+DZVQStn+8&/kta999a%T8jQLj\el#6>@Bj5HJ&i9Z
DMd1b! hDatTQbLY!8eH*Y>EBT=YSc@6X9XG1=cckD+n#9<*jutu$tHA=+^L6CawlauBIDdS@+<ci6X9H4t#:e8
J?cAl^ %aW!^/?h\M^6\T@1Q/tPh5ppSncaLmS9&Rmd^JnETabY6pm@SbEJdM&m/B*1AlC@4K&Hh/@uL=8d/LNY
?ujpth ^:cKLJ=mRP^n9H:8m:CtH&icaqtE*+>9D@lRjji+#HXYBXpbFj%S=dY>@a&jl$tI*<A4N=XQ+@LG>I!@
!nwDQi jVnY/ViPcS8Bl%:Ten$@#dm1jVqbtMD9>CdS\$NGhbwaqu4+*mE8nw<>+LIZQnMLJ@BnDnAyu=!qw\Xd
nJ@Q^& L4H&@w@XE1K^c#aQAM?ZNwiN58Xea$d/YE4RT%+6mYCl?G:YBI%y/uNe&%^T>ntFpEpbqFmJDPRVhltN
:^he&y eS?6d$!:F^Y5t>TTF/ulWIq5tb9e1jNF1+PM#JVWlQy%G@\^A>K#nib*>4>$nlkBZm4mS4wi1XbZLQc\
C+PDub hPVlB$N$DnA@D*CHC6:G5ZphAlC6GM!m%Lk+Jyd%N4Ri$NTXw$#BYpIDw>:HN9wVFX6y:l=Kq6WLLHt+
VTVlbS p:pltFdc9%dahiEbFWk4&\81QuIEwK@G@DZHcJX?+8IdZ$qC<KCBGc%aw>RjLkMGc1D*SWc?95c4?LnH
=bK?R@ \V:X^Ici%pT#^k1KpSB<QL<nB$i1M6bpMl>IiY5*!X>=Wt4kBF1#kllH+/PeNbItK+6B%\QLS<M*^tFy
u+n$!h &L1\J>SZnqHYd#hD&9i#/MR1XEhlk%@ML+RR$pw=wAbRMApS88q&RMZI%KFYQ>MwkH:4Q/15PGblTQd&
TZFM6d dnBkcy/DXiBWQk!Sh#E&d%/@heqcbG9&u>jFV6P&i\+m?HbkaZ@i6hd?VqqY$KWTm/19R8IqW?5Y/l9Q
Ge6TDn J!WA9KE@/ImqL#hJ+KaeRMt&nT+Ab^GhVLK:Scq++q<$NbV**!59qL\S5&+5j$INtc?H#5QYq%Q=P\G5
^t9Jpw 4VpSKRqM#wR?=aYt<y?6q>m9+!u:%9Vm9Fu$R6*TYqY&w^Aq/K6@IYBmwAGX?nqq&LEILSbq1d/a$=E>
@wpVNk m<NLe@SX%S?iPY$u/knmmat#da/p%MG#nR?<=N^KPuMIXLc*IN%V#/RlEjPkmI1LCQa!X>!@:m\AwA/:
1NBYy> >NdPCWe6==SFjFG*Q!c>cLdXh+AwcFGq$Vq&qXAn5pTelelwECa&J=5HD#H4cRJ88XcQ&l94iNYnViR%
#SYtcF KCDQK+YSmD<VHGZj^RG6BRKaCjb\PY$uG/8qquy>BWL@?b=NaAJNET#Y14w!9D?8BY6$>Jh#1!FLwwWX
@lEGt$ V6\a^CNNc\ANyw<+6l5\H<nYF^l9\>?Y^Q:A4>i$L%&#=:njhJ&T!=@T*J?!<4Vn5QqE6ajE@SW&MwFi
Tq>q4E cwlAkF%>eAj9&DwD&lQ:wtyb?RHaR!pttCw?Qu/QyJbybF&k?5p?1yuIEiNWSKAtjpui\4I6ytllAY!u
4AX>$k 9l>Mh^6*^WB/A^Q4Pm+&8j^eXXY*5>@qmHSGHSadK<&85#aThqt!GW\\e<aZh6EJHmQu^y5QC=lT:<uF
TilDy8 %GMA+9uy9LJZpEyGQ?Ct?eEcn+/n#DNPbH&nGm%1b:k^M119XFFLME$%e6ZqRLky\R*!Cqk/C6R/4FRi
G?^KY? p5eC:B:K>Km&Sj6kWk8ZLn#MCui!by?anRn=YcT&:VMS8yDMX%t!Abw=6NiDAXXKJ+:m4HdK6mK@!YWJ
qwu+^b luPFXWTJY/ADR5%cQ^w^?ji=Zn&Kji@eH?Xu9LI@Y#+$*Zj\SGu5EPSPa/C\puGAqW!NiP6E<FGWeDm6
qKpjAt K&X5K8N+?#Qa!EE:$aC*!Q$h=cMV8Yd^^L+St8P6FPWlB9C%tbdJNhMJl*TAD6GKHdhE/m?n=>8R9SGn
d:S<AL EpHaJ4kVtY5#GN>A=Ebp#SqBe@MPqL5dp/<k*N^&KQaHml#+iuZb$8$AW&TF>XAI!**RCMZGHMHCYyi@
P?:6G& >BQIq:VSw$<WELc561^FqPA#Bb8VXZM&TWYdcl\yeh!?5i9y$tl@?qMI+EMndpIE&49aF#a%#$IKhmbm
+dQQVl e?I4:pad?+j\<\eQ/9+hIS<jwHDu!yH4jFNjSiQHdW$FJmP\PF5Wp$Yq/#$THNV4uY*B*@S!j5bRHlk\
XGBS%: 4nZ?AAh/9:NL8h&\kYEPu*mZY>&&1Zkj@&LkNt8\EDMiPt8E:mG\LlGL/6NcYipDyGZD*+H\t\Kp1R9t
eT1=RE &kccwHZuw\*JMY^N%$Pk*SI@GM@!t&8Rw>%Gm+n44i=Tydj#6L%Qy8b\N4%8nAIWZ%h8XHhC/>Vi+!4!
WuAi:D Y9@yhReQwC&k$=lRBKlQcd5j\%WpHWn/4AHQ@j6!iaAGbE&1Fm:4c1eR=^SA44MSP/pw^&JV\atX9a44
wt^l*e q>@\=pMnFHYwCWeq?/D*+?^ZX4==LiTpqmp^>tqA?X5L%!bXStNJKHLGuqWVa&PLFTlc+j8*C:<DVSbn
/@Z!S& uPn^VID9R1Ce+%1D!uAl^jPb5H<59YNX^G6%FdPE$RtX%<Bkc^FyabkpWpwTCwQhHnAaDC*qL#Yulp/u
QXXSa4 6aLFI#q*ujCCIYBq?Ykd1lbCCSCMc5ujwdP@dmI@d^G*%@ehG$jMQ<=HubW?+V:?ah<MFSb1:88p:yVn
M6W=L+ JQFEXAmD8>J\k6VlPKe%E1$<e<:mWVbRC?te/cXZkQ#\6Z41:ubM+y>F:i18MRHQjG/<SMJTH<B!9bV5
FdPJGD @RQDpG!jcQFcRb>$%eQ9!cGc#\cLyy4Z+F>BqIH*h#y1$&nPQ\DIRb?w<jiiH#DLpQP9$R*mq=4ZaGpP
*=B1#c K#$:Rq*WYBVtN>=yIBAe8e?<K*FMcF8?8hy65h?KYmEna4%p<K@p6KuyG^!6%+nPy=M/<?*Lp<XS=E6>
m1Q4Ww mIXF!BADYYVNm6$@VNic/i=c$RnIVqIB+GjhkZPm4ESRbARnYMe\diPHbwiZlunZjJMRlcKZiHEF$!HJ
6kJ%HW \IXRnBj/Zep/%uVA%1?ZRqSCD&ZLQFVV:<!t/eT#<F+p?%Z!V6PJB/VueTHIqw/^HIAT4tcGR/!uWMd#
&?d%8% :qw+itcVZm?jqY*9PFLYkj+PjTMF:Yeptbli?>8K5W#+td<e>M=$TVWqWD/64dhN6:6PF%$%^qR8^SWR
elcl+A ZyDk/lm*H<$LISQH6$C@IV%dQKX/a!9N\VVF+mlPb%y:MFnHGaQ>LjA4D4FHALuhdHqkV5%^*b&=I>#1
&TA5q= *1h^jb9V+NWcTw!G#t4qMYM^BYnL8=hdkDaKmbH6T>9<4&>ut8@#Q=\I&aiuw*jGcYh9tQ#<T9T9+Z&P
wc:j!9 mtu5?5^hDtupmp1GGEjp6D8uLJ@tduTtnhQKQm@<%#n5NFMBZG^Ly+d1@HNAi1T<i6yTpT@^/^\jCZtG
-AmaQa 0002d9dbfba001202b4 Page 395 of binaries2.zip
Ep95YF TSSmR$\t?TMnhd@!R&Hkth>w\btD\4!I?Gh/=AyK5cS*\uYPGbS+pMwu$5VheGtt=GINI!GTAFn1QYRG
CKL4Ge ^plkj?&JNty#ec@aZ/K>li1B/Gh6*5ZubhQc=8C8l&e/BhPA/a!m&cX?pN#\5h>hdnRA?6>>mB*Bq!qb
:5llI+ TXIi<A68&XwuVqGWI%ht>TWG!TmNil!KAp$p*FCZ#dW@$p*TjIaBu/kqZS9=55eFj6+6Kmn\yQ=c+1RS
?K=6Di a1jWtN=qEDHLEytM1qjc8j=YFPMp=j4madjSHM>CF8y!F#F>AlGte<=i+G!1%IQQJMN8Q>mh@1I?hVI?
DaZ4u6 #c5wSqnBq@k1HX#/SEa9b+/t:Sj?XZut!?jw61#X#KK9+D+I8*P9*hbSw&Cd6V5kYR=l:kFu9P@ZS\ZG
yYi<yY 9YamNbdt%CENc&u<EZ8NZZ$*c@6JPVD$je!h6#PQTXq^B=%ij4@jK9Y$5/C!$SG8:qa@yN&@R1Q#We\Q
K8Qp\D VV@=:VAlTVt1y^K9j:Iae@*!MJ!hRWNcI@<qaD<DVLLwGFT^w%JT\d/d$Z9jw5L9Sk%TN&QP6j*FqB5A
pibeP^ ^^14MqtY<W+6RbDedP\=>I>>@uPp!:By/HE?=BSuQJ^n*?CH4>e*t*LG:8QM1X<\I#<iJj>:ucuE918J
tZ#lBN PFeS#<i:QmXVN^1:\6y*nD/4Zi!86FKq6CJ%inI:Yp6#:^\Hm$V/\wK#:SXw:qX^5Q>AbC&$Rha<X$5#
?41>ny hawh+iQ^jN@jT6bi6Fq>tMHw:i>9$1mN&e?dnmqqV^::hmLS9yKBhm!*IdB8<<eHT9>n8M6Y\*nVM85&
IpAaKy I9=hP8:Xhun\:?pi!$t#*<H=Z/Kb8>Z&e+S?t!dbp^AuEYaliqaD!tLiu5h9Q\^c1up#$CyPKbLC!+a#
YcX=!H tctZ/1jnINGuNVFlR#i=lEJV:hZM/qn9FJVaN:VWG:Eld:+Ey>Kq%<eMqS8H+wDldd%R&w!6hNZ4y+jj
Q=>1WB M4VK%$wA*XZ5$w9wClGkib?C+dH?y<dKRaueW^>HSRWE<D!F1XiVlADip&A6q>YbdL*wYDm%VkwalA%$
CYIT@e e@pT6$@n=6:FKPqt>A\IXh+ap=1Ie/Iyn18F&t#E%&hL%dMZL1SqL&upSNGTiq4YLBpnS=&*PeAq1Vp9
qmBE9V 8qY$Ata+w%=yb:CK\=Nbc*L6l*Nt:RT=$yii$n95i9hpTheHMTwMF1DDcia%JcdIh4cmSwPwT^e5tamj
e#e$W: L^pd=AmLN:w5=tlqpE^mMY$qIcn*AY>Tki=4#&qdh*=cEkiVPWm=XXZki+1:G\y=iZV&Y9@#55MZ\!>i
W^IGtH <aRIZkH#IBKhaL1CII\%GYtEeF\cah*dA/B^G&HX^:E=<9kSt<JDyMYCQN9=li*ZA/=TltS?LQk^!b8w
Sl8A/Y 681qX=GS1$$>wW=TRqNQdIjVP5mt\m6kdAEZF%P/q*c:aijtL^V4+kF81j#DC=I9HM1jPc%ClyjJFjmZ
A*t?LI #qihaFTD<8>cHK1PHTa6/=je%au:S$YTk>j5h4nw+!cF>/V6<:L&9&W?*4@J/4a+nyiykhkSiYX:qadY
I:?IEQ %A=Ww%$b\m/uN%d?k4$la>t&t?ld1TncGZ8/pEwq%hwB4bJpE/KK9^R^ljCe?Xe>bTQ/5*j\KM8/?P8c
ehSX>G qeBPP4+uVMEZwC5d>6CY/RH%I=9mLw:En1j*dEh?JFD/bw@n*jYXkDlj8k9l:\m&yd?t/AQ8=K^!<b!P
/+H^Qq lk%?41$5VGc=P:!4bVdJl9Hp$Y9j5Ki1Q!@bM4$\\pLSNE+91C&98%kcZ%FeEHAKu$?h4:k*ECPMu:Dw
**#yY> GKhjRp!?+T14/6mSS$S4+%TnN6Dh^Bm&k#8b#1KDJR!y$%Hkj+b/5Tm^%@RIcj8:N+ctF%:b$/A6jbGC
89cJjB E1MJ\^AQ:G1Z6Ial/SAPXG^@p$9P<kQE9%\P@PaA@in6TjqqnyE!4kZVBZmwNRLBtdGZRq=ewYGXtpF>
qnTFMN 9weytT#<Q%!+t=*Y&Z<%k@uhwQYdyk+nF:*tW/9l!K6jFG6Ay*pdH#9DkRHIWa1dDakRD!V1Zbwpuu?j
98Yya^ l=$iGBeckI>jB\I&FZJX9Run?J*lc*R1P@V:c::969qm=eAHjVJyHtpBK&&4Q*Al8C%iYalhyXyZnN&a
M8<l6D XtXb9EIL<=RHJK<8y%T*VNadP\CHQS6pewB4+TY*Z\XDjpa^!#FiT9XMtphbj=K!49>>86cVWXnXlt6N
Z$*/LA Y5nT:?RYC\N/5A6qc@eP@uA5WNDMtEi=LlcA1^JqqpWKR$AXY1aR?pHjqH$TMumK9!85HH*Jde:&GF8n
Hhpbbj e&?>*pRLS9eAK1SbG<h&EnV>*6?F*!QD\bX#/&Wc19\kt&aGQ?9GwwyERFFb5t1Mi4ZjhBN>n@6u/a?i
hT9Ibl *dL9>B^W5N4FQBV1CHNmXKLS#*E<NT8S5#/ldXH>\E!q?^@kaLV*am\!EiTq8GcBV>F%hTuqjNkL$A!b
t1Ad<1 @cF/^uRC#5TWQ&JW>hS%6+DtDp5C%/Q:VFApdcDYyeh%H%==Z4mkVi+eb4a5dCl$Bdhy^ZVy*k6WR?p\
ucFSXP ^>c!TcuuY>RG&LS<Z=j:t^cG*LeFnky18/CLpeTXQ:Kji\ijBk5DS@an>uqB:<YtQP=4H&84:AZ?P8%H
QHB\pM Z&A6plSG+=u>44jE6um?b@<m6<l\kAZjNH8EVIdbw\4?/4PHyP6!I?hiKI</DHD4H5Ab9>tB^TR5%>Mq
C44a&@ qiJNbFtSK$<GZhy&XnS1CBp5\QdXHiBFPbw8G*#:#cS>S^HSCL#/Y$By+a@KCA!**L\VTQk+4ukcpudM
CX5>>T 9l5HhYWqqN<5NLuHE!FV>XHdk<H4w\BZ4=lytV8?^:?F$BQ/FGX/TXyNiWDin?p4i5+&WXNlZhCdtLR<
=YLAAZ %<L!h#TbeqJD:8J<G$aBd=/h6#VT%HGAdCH:ua1%9mHjB:htISnXG6H*BI9a&Pum@JGt!Mqik$!VK>\n
=?XX&4 !Md##E##dVlN/P<ap9:d$$9Wac9!IdM%SD<Genp@DiuqFHK8l<ebH>H5Dj#JkY>IdX%PWyjYBLDe/YtN
I!cW+H *?F686/FBL@4utXKXPMLhTGy:J4ly4*=LHnV$VKNtj<:*I^&!WjB!yW^/ww:ZtW\tQkuZ<q1uc<BE/di
kF5Sm& qApCeZWQ%<K5M8mEG^6cA4mhmGd=Alp\TSpBDMpZh1>A<$PbFmY@GHR#tQMCStK8FP51+V/K=%>^WDIL
hWIK9t $mwyLhJu$m4HRYmqA/:CdXj=*GGd/PZ6VP/>lm5@<ahI$YNW!y*mMFFM!*AXTq!&EKy/W1J>Fc&=lIMQ
Mq^<Nu XAZEjZZADVeB!4nXNqVNXT*ImK5T1KSZ\jyc=F/ZdbQ:VXS=T/tVuEZ\#LyH!81pneXFJ<&hPJ=u%=Y<
N\G>@$ E49d4!#=?=6A&w\5H/k&P<uT\>1h^Ryj:t9qPCCE9aQCXZ%5F*d+NKTnQTH4/ydn4q*CZ#WM4QR=8m8X
#SQCP& :lpTiRA%FX$FtdpEZtE1p81kZ^aBb6ZQ6Cpb64HYm+V:hW6:4B*^SlJ=wASCQD+#\!kDNw86DN*%p*9k
1LDqwi WXDEI8jJ6V/QnN#W5IL9FQ/kyB:I4:bj>d6&qtp^Z+nd*XDbNT@6L?WFV9la@b@KYpu^q1iWA1aEB@8I
e&u*V> D@!ny:5#@9i<$w^+LlS$>1AMT8c@ulp%&M9AE/VTn$yV6d#9wDyhCqTeRZKcpIc?GtF>dh6T8!h?MRl>
@c%Ky& n::G/9bt+8M&L4tEDbS$&YX9Z6<NW\iNuYBQdJtAy5GJW/&VqY6>LQ:K@c9*Q6yh<tKSHnY<?4My?/Ln
mBCPMX WnQS#<HjH6BIS+pCm6/:VN=BZ^lD>JaSW^eR*X9m!\M*qa^aKIaZp6wEEJ&/EWhH6!6&+!jZLiV5JKGT
y=II6I eCt+NNS!RjWGCpMpIbKTMLnW>E=>?+HFwZAy^Gw=m?n+B6ZuMGu??!KE4d<\CRW#ESqkb*/M#<*j*GHP
E>*:>Z c!n1ibe:<aFTAGRSq@QJVj$1EMuyG#%JVDeMTuMp8XWM\%Z11lV^ij\BGF#>+Gh%9#LwuB5m^1u&B+*H
HeLM9a 1apD*pw+@jZ&DZi/>ellZRMGq:uZ:\k5yVbtLX?nhW#m>**R@d4F6LH#mdY*J\TTL45q?u*HDFl4^Z@F
hTJ8*5 5$AYHiA&RNm\>15Kl/D^jL1YXy6YYiIijw@mHlp?VQy4BCh5eYVmV\lIeFYDQ=m#THtaVMPh?yjcb84G
=iHi/1 K\/?NSDm9ZuB!b!%np8Z5dE5+/MP>6mh5jd$nZ?1WLNEXDntQ/yLqSqFu@cJ4:=>*@k\q>cdwEE>=T+y
Y#n#<P ?k<iHu#\/LRqb%l\qG*4<Z+Ma%Ta$:/M9\KaEa#W=11cGR:uwe&%ZbCF6KWp8Dc>H/wY*iIn>&DaP\mZ
/Rd!@d qqQVFLi\:8WHjZ$+PRdw:A16#>V:H&eYhaYP5++1tW!JayhbD^564HIeW=ah<uSIFKy/mI=yP6Ku98aP
k=<SM> <C$8cG5SAPB*+8J%F><@&iuqK<>a^5hyLiEX>wkIh+<:SZ+<p+G5BqGq<FcQ<yjVtaelA>HGVQQIh5?j
&!qBEi >dPI5S:y#6+a1pWwK14w@PAA!ih#B>:nBlkTCwicnTW5P<6WBeu5#8C8*1qkQ=+&h9Vd9c*&@/BPF1M@
tRdQQ? aNR%54<BBtSc*/#QZm4u=*qA#Su@kiq>SEuipuii&t&CY?pJ#1CGwwPuPh4X+t$Kq5KyQ\GhAaRTtR4b
C*l\^* A#DRRCEX/WDHpRW5K?qyX*>e<H/=Eu95KCuGH&6n#upQ+ad8FaH5Me=hDCaIQLD6>+Ma5PSdQPZ*MbAa
t^+WmN a4NmiZ%CeDYIEY^9bq9@may9XPlmy$BQtu+K<=@M/KQ\@5TiC9md4F%1KaY&b$nPPtS+9^bY>96&!Ctc
A:&Pq\ FQnI<WIlM?nwAtKJ@WSyhN8iM8@FWnXD+\ZS8&/j/DeGt6F5YHLjS1F\KBlpA8M1qyqV1=&Tqe$mZKVS
LEpkTS ?\iGbjI5=6!hiM\ndJEejMncYG4?kq9SVhYBJT1qcutDcT9d@T&D8JJqJm@PnPA:/Ci*8ZhuPa%Q*HXj
aY:<KQ 98@>e:d5CdA%t8yLFWZ8944yG:%?c$?iJH$#Ew6w<FtY%#@81qd\ZuBtE+n/GYSP88#m#cPI^=awww4l
:IS@Q* P<jGKAnP//N>bSk5=YX8&J+*w:*b+Xc=KXK1ZZTW5q:^bRMtt5d5#?95p@RWccu%t9q+KTn1!B6C##lP
jPt&nH Zi4L!A#H5C@#p$Wh!nKyqS$%\tZN*y?L5@j#npn<c@&6<#X9ybaWSdLuR8#1kKw<66cCTNWHe$Kw?jt6
y8ZIWh 5<W=5qI1D&?&VNQadDhC6J!H68iq%bEVhR5eeQa/cqGIY8JQyJal9*qL!EwHq\/?\?M>:bHA^CNiF#Hu
A$S5L$ nC=nqL/#?<Ch+m^yhA:HA=TDtKJHSyByc6BI<YZZehX$BR^NNKTe8?u^JhTFF$PlK\qTh\%c!6tT>yni
4JZt@V C\N$8*ceyu&RSAbbIIkmCp6cPN6!qI85FD5J<SQ?WWNLm/y5K=Twaw*^QL6G6i<@^X$@56/WB=Sdq>Z+
^/5*=L bZjd=daV8yj84*&1b?5^^Iep%m6DFtiAu6+hNq84m>^j$BVKSaY@EiI$=>:dk:pT>?<a*>%GnZT%=/HD
W*:&LX *ceW\5$RVH^%>@LLKDA::QE6yV#hBZZK5NGm4iVN8yk4TtG!<4i:e+mV#dK6h%ZP6@ey\V=l#$1d1YE$
S%EVbw ywX/AGjt6E6?p+ZHtB4WtS8ZRVFqGn=\Hhj%H6LE@AkWMK5p%y:j>JC1/yRndhS+tDE\HyGX^aMt4l?W
ScRhQw 4maaF=/F?=yHcel$N#i?lLkPX%J&%ptaZ*Q/8A>LGG1@8caap\!#+X^1CeJj&V1aZJ8Y\=5j>DMh</#1
LbpebB QtNwG+tiiZbNk^H9I18/Q&89l@4&Pn>ZHdR:AtA^$C#lpC\C4JYeE6MMy?I1Z9Jt9iA8jpH+Yl&<tke?
-A>!yw 000bb268236001202b4 Page 396 of binaries2.zip
LYIqEE y:uTa$CqXJqV\\F&LtELCMLtl?%+%X@LqdERG9\dJZqu/dVR$e1?AZTkI%t9y%B+P4CtbBi>*T@hI1h:
C%@?%c !d/hY*nAlKGCqMCkVc1A*n<cu4j&jFnA9CKB1lAuyQq<n1::yu?%+K^AayCli@!X#ZlGIiD8wH<?:Z5Q
HyCDpM 8/C1Dwe^G!KAj/HDZw$+^GqmJ!8e*kJW&luFjy>uTH?YED>SX>>DC$<><G!p:EdhjNp:=Twj/hJAe:G%
D*njWW TYh:4\YGZm+*w=\ewt:uq*u5w+$qVupP:8Y/=kkE><GeaeiE?>bYhy<EKXYyMJWaicT$8F6u/&5pHXj!
pSZuWA %=:5XK&#1CShiq<KcueV!^+XNC/#4nV:S+YcQBN&AVINQhpqY?q^a69M96%d@i!TJ^9pNY@p/&XW/<5!
LdM?KP @<CS1tp/:i44M>$piGjluXIlJ#cbbqb@mF@R<HE#QiEE#@Jc=Py?ZqqD^^@Fla+JSDi@&@nCPKG<wWN:
%e/5\X Ip9?4alT*um?4@4L$NPM!$cSp@9B@1>p8h\i5K:>Li\8HElX<&!ycd6kHth?b*5ai$#a+wRu\TJZ5Sy+
a/W/nX >QVuH&>9&D1=NG^SmtLVDNYR:Jj9nm!QCh!%#@LBqm!K4nu@m94ZJ4>%T$8l!^+5nqW1/t!nE#<t@:*W
/qT=YA A@yAHZ@eJ/kDkZ#cDX!X8F%hQc#y9wI=m9kSh6=kZ&Q\p&=$56:EJd6WaY1I>a@Z8wyS6/T$w:GL!8>%
>Z!yLN +Bh#Y56Rd?>R$$cW\/\&di1<4@dbI+S&SW%:hd<jii1atGl4ilR1dnY%dPqIqC6JN!5DRuRa4FA1\%J:
djhL^i \^k%?@5:HGTGJS\Z/#D&Im:@BAqHjYjj%ppdtFD$Duc+DyjaMq:?E$a=*NJNpI!>?p84dGa$$TlPpn/&
>JIjl* E!/\&N#A1mW?8TR?Z#t=9DSt@bGwe:K@R1!HePR?DTJP>F1$TFZ&%^h9w=%&XHet+KbH&qBcpALulQ+:
P=FlHp ^m^Vn+F%TM5<!8EALmq?LQLH+uLL/#q!KhSQ/S:P!41ha?qdV^LGFC>iVW9VwBB%bSZP18ywlKj1nMip
#*wT#: :::cnd+R8QW<bPJNE+*yDpQh<ua1Wd&>%m4&!F=XnMw+\9YNk<iX\%<RW4nILAHcGctMXJcMqeG*SLGX
=GWMl/ MyhbknCFD9#w@Tb^Ym+pXY4Q=:/Cnh8m1Yy%HYKYA@uKe*KFSk>B\ue&%Qi#P9a*ZX<kLpbWHE4=4I?C
F9:>T& R+CbP\twM?5AXhK@*%H:ydi$F9#dQewWl*N>jKwq#X=STlVy1*MtB9/hpwLnk&Y1KD/4Yd55#^A:!Lcc
=I\DLB mPlEj8cHBCd#W1wM*^V@ihRPTeGJ*BI5C#8CtMlt!VPXHwE>e!q*bQ:aGY*RaVy=K6Wb!88w<I8$Ic/4
%9A5&l nd8ELPpHayW6PMCkJ%RPhQu9VT%tl@^q>phw<wtWHjc1RlpiV?q<&8=tpk#<m$bZ=\u5LG4SnTCEE\^8
*ZJdN6 &N\k+yaFSR@k5VB@u>^nVT:1/jGStcV$dTK/8Id:IaQBEbw^jB1!a/YZtRdXYqH/FGdq&\c%Hb/@P&@T
H9h*Z! FJ4M$&kWQ1?X/eGm$ni4W$L@EejP@N8te@*$cX<8Hw<QJpLPI@y9NS<j!NWiBd@*@K8j9+*+*=@*Cuml
u=uLMT QE8yL9^95?aH5EVQh?IFHBbWjyAP!lkKB*RJGGk+1J:NRADZE+CZC1!eZMVP#L&\&h5bIkNM#WSl$P^I
*#lAI/ uG<:V:>ChC&FbCq%HmCY#iE!q&KI=$CIyBSiM9C\\VL@dMP#Iw^npBIGQVPL?y1L%^hXQQ5K=DI+h#%m
DyG\W1 yJDPw>VwqP:L?DV:qQuSKaR4Tj%eCF#^nYY%\bI<yGHutED1!lJL:B^#D%RXBy%BNWJcnpKRQL=B*pI<
\e%ctc hXe6bKNpL4Q^TcNq5W+pXE8u9$iZ6dmZG?kaBqKEwe:&w%8=^a:4tWASYm9+YEhPywP:!hcPNLQ=lEap
^#t=VE n:Qk+>&C$dE$/WhG$bhZC$DED+8%?Wh\SIbaDHXnFQInneEpwpCcd89ZeJKN>TB6GC<iD6<#iRhwVebD
J##/?n WccbP9KPJhFcSNCBpVQT/@:c%HG*MXZZQ^MXIebjiyVW:R%:5ep8HFq^EX9PQhbq&5B5+N*DeEm:u\^K
EKujSy n&BlYL!t/XMXn:#B?wHl<T4R*&#BMh8S\*B:6P&c\mpNcH4=w?nRLX$#mei$WyALli8DelE!kyFPDCwy
h+WJj< l?>*ImA8nM8pwcJide%J?&nW>+jL6LK@$99tNC55Jp%Ce18FCI=/a4T@XCqAIac=a+qKSw/htc*PTZ^4
c<!yq^ jhHS#K^QIhk1FN5+Qj^@wW\RIuAFtW@4jb%u\Vk/?$u5i6HTMkM>l#6Pwj*T#6DbnZBmhGGWXqCabktJ
b&P6+@ #59IZ:lP1=8b8le#Lu:uC%Qw<pJN$t^I/TE6VuaL+9Fi6Yi@:AMF==$$=+clT>hAdpek@T9LVnPWPhha
>Xnk=a ZqDXYCFdQbIBCiNDy^#pc+lRh*y\m1Mp@B9Yp#=/5hySPwK1b^At?\9\BMq!8X=!u6\:S+cBR&WKyjLl
V5RFaW ADB>L@i/1T*/k<#MqE>8K!YYqY+<ZD9*n?5<$AlYX%eXFlbBRTZSENVm>aXDIFKI^iIGpIclwanb:TpM
kQuNy> BKHlMMV8#k&Gml=MK6\:yk@F!<Jeq@9#RIJI$*ELKyKFjVK1SXq8/PT>>VdaCdiKeSTDKZdd$A4/LnQV
dqbE>i a+!bY9RKyB9/:G?1y5!#\M4#eL&KwRYE@FmwVuPSLDduK#Ve4md5mmZ/kIJ&ajDLV\GDAFJIn<hqCqBL
#6l=^X k8My1!E5e%%LENKMiCwHlXbHjH&HhAQ$V#Yj8G9#/^KmVy:<YEY@I/JVRuA4lB&u&4kACdHlPd@G#/pq
tKVX@P kRP<:lWF!qZIampiW1@Ia<KbkYbe^F?%Jk#ie5JdWbchd=yi>kp:4tLwPu=HBNX:d1tCuFJuu#8uw$kb
/<D?=/ R@pueXTZHiP6ZiwBPu%HJhFK4JnK$q*+qJX8huC<*tLEhp@Gp9Mecnk=h!QwG5>!9KILp\Z51h@Q@HIq
^F&K%c uSEt8nub5QSWl+:aP*unZXCjnCheDF#Am\:khqQmRl&FN<WP9\dpR&yJilV5>Cd$TWW6:N*K*b@hVBuW
5XD<Gt pNmhjWaRX$+qM\Vci%E?969:mae@qYG>p^@jLFPPqm&G9ZVHkuMpB?a5G#6MVV+EX\Y^>$/=Ye*&VndK
I+MByu wVDbKu1mjmpkbZtVh/P+=l?eaD/<?yA*j6ST$@Li#6i+F>\=W<5Sy49dVud!@LcPq#Z@mL#ScKJ:\tSl
ky>?H* Z@dlVuqcBTG@W/9$IdQ:I8jJhBaubk!:Y:h<9K5&XtpWe=IWK1X=nWS+&=\lqpC8aZMJ>@a5H=eYhI=I
=h&FeE 6SNyZbT?+t?ID5Fp!e#CP\SJa\K=WKhhE/E\:nkl5BA<HaL:!8b$@?%8Xyb8^TN/BAB\>QTSL?ByIpda
/C&*<N DjH!9mkA%5KVLTbj<nJPSHW@KYHyml:VNqW!btRD>@ydIW+jH!Enctp65Jttw9RX6HiYZWKI9=G1=WSd
n1KC1u HVwa8C<Z!B>KiV@J?dG/?mt=dS?N\9Z*PGjXK<XhGPSm$6XXbW:^I4nGQGki!%eXhlcdPdlPE!mC4yll
&Tiepu Wh%XcC@<1jNPmuj+^Ae:5BiZmqy@iZPJb!cXqLD>%T$?8Hwy+VYaFVKy*q=8e+FHEMBkyN?yyW*6I\8=
A*m/NT FmW$1d9TH*cV>>b+Q#1@6yAeptL1^X!pYYyIWHq>*d>6e=V/q1PJ<:1L<^!mPXpi/^i?HtN%#4VyjKc/
mY!TBL t@^P4En*ac?1C>>&t@6NI9Tadc9:?ePTQV1Jy=Ik88wHHqhLli^WF5*XcyTQ@1WeXJd\n&J41P9?YNhA
MMSeDB ktMKERYa@VAcpKu:SjHwS6LFRn+Wd+hM#nYc$/Cj*NSa<c&6Y?K:6<9Gd?jCWTNI^H*d*p4X!^Lq%1IP
!L8aAc R$LaZ<CTJ^ee!w1h%!G&buPba191+RpLcpw9GYhTpbBna$Zk19p<PKcap&#&bKtS8NT#Q*9LD/8Bd/9>
9YPYjM j#/mGX:dbMSnLWX1XFRV+BpVd@ky!@jFc@4&/l&<>Y\I+m#*iYZYQk6YKCD4TIc&C1*9/Fa=XKp$n%DK
9ajyw6 9VJm!DVq!tKccST^HbP^WEcYL*TYMuH4FLVRCY>qQq?leLM68/D$P@e4c#Ih?k8<eKIhH^X/I:b9=K+L
BIPull G<@YVhjDHG%I?=1el5\1S?HuyuQ*M&hXIPP=T@ddZSTa<KdD6Vk*8ahMm*@EYh!Nm8jl?p?$u>F15KLm
#@<*nn q%jFA4GSmRecn5n&QnJwQC!1PkGiD#j<*l/=ZCil!HVhqSe9LEQPi<Xt4hKDIN6L>%FNp$IaEWhhB^jX
&e*Ya? @<kMjyQu9JJPey<Kl?N8:RL*/C4AF@DDItYT\Bt?J=@MAm6l*pp*lEwnm1T:S5!@&\B/ITN?I5TmCycI
PiLZSi #wh?$\A%EyGVX@!1GE*HJ5hERQdclVHyR8>H+DeNV4DwD>WRBBtpBXRbMTYBaS\ep!%5+weXciaZL>JY
C%IL&% Bye=ZL1B<MR/=tR+?Jyh5TqKN1H@/GqYEu9=dGTDh8YEu&bjBMy1G:*ccM\ACXlmWG<?6^l4$J8tBPiE
Q*^y*& ^BkMpaq*uZe@$Ml$qPK!/j#b5JpwJPR=5lAhu/:w*H#NdjbnEk<dGF\/ik9K:@K!AF8$=GZ&Y?iH1bw#
qB6T@S iI/%*d=%4Q?/yPi%yLK\::l!VVVNRFjPpw?ntjeaN6u&*ABTdj1yymj#m1c6eFp1>1l**8dh9Pj/c?wM
#@y>mh amX/A/#\k@XtMRKe6jaPpAT1nu8hVH@j+qaq1ZVT:L/ta51<kdbKSd$a%y$wKnTHQ9QSLu*PM8uT+u^4
wQYYjJ TXB\JMb9jJ>y6QK%PyYS?@qXGD1$c1blA6Rh>#ABFnChp*8Z+&uE9y1%1SjbeM8>k>4Kq&J6&1h%Nk>9
TR/lSu 1Pc@=GB1N%9J*de>KPwpVZ1H9h@K>*NBVatW6F*QphZ/1XimVi#YXR+F@ultdT8iK\ekaeHGK!5Y<Y5y
%*=Jk: wJ>8Pc?l:khYmudtDn>&W%9k4m1N4G58d:M<d/tH\>yh=hR&SJF!q!I=<EE&yq!iqQZ!MDQbS?&%KDX#
>X&K?< Q6FT%dNEHQPZ?C$!aNmD4VqKQ<L^AGEGy+W!<d+m+id6V8/u%@14kDEy8l8w4X9Hy/m<&!P&96qcCuje
epppa$ N&@R<&M<#9mHV!!X8G&mTy*6n6ATQ9l5Clct$NPcHMDwmkLiP6W$kKmw@TCn*LA6Nqa+I!pplwNSMtQC
Q#R$AP Kq\=wI5&YbBVq5y&@@InF>i%Wh/5:<PnDN#j@ww5k+a@/%HhliNcG?SZYGQM&hXF1lkG%c?iY/\ljk5?
kH^kY! X8A5jlcd5hP5#pR<@LNZkcy1T>*quXL1$QBQ^em!%SRn=S*c#k*@CZW9^#T#*YWWhy=KbRMV1<<8a=/=
p@yG^/ ERiSXW:l8V&Fpi@/^S<$wbFjEP^lMdaIC#y#l\5pbkWWa@pQGCaLJVE5J\Tl^J\qQFn?Vky::dBmlM1H
ZhED8w WTweS?mGakumZBPkcHPYCqE45GR68IEd&K1#&eCh:$?wYyDNtNa5C^:wyc?a5&CI<?1DWMKIw#XS:NTV
NWuYF* >j91\y&Dydd!jjSY&n?1bD9Eb=:+G1N=bG+Q9RTmP@It8/XDI8RX5T1/&LD/*\@^SWCH\1ea9L9SheXB
kA&yYt qNGY<P#i^JelB<>I:?W91*B@GquQ1m85nhW8IC!=%jejA!El:Ctd>@bTG!j*VuN4kKH9Q6NFt\m>KCu?
9wucY+ >D^RFVj@JESIVHTJaE$MYM\RLpep:*bk@4mVT1T@==!@e6l5?piqX6YpPTEa<LH$\l6bRiZ4=mA:DPJT
8!K*q4 htTc^k+Q:Zqkk5eI\^$YpREMDqM@ty>h!bQaYl8Q^m5>8C1>ILd*DEFhKp:$@T&SF<LuKnJ!@E%lmV=>
-AI%Hc 000e79df57d001202b4 Page 397 of binaries2.zip
:TJu&k $lGH%XpN%d*!MQh+PYZ=N5kQb4dlK/EqEZl%+jla+4RlP?^n:%qC&EtpNZXTLIlC+/nk*=&/PN9JlL<n
c$*m&H V?L?u4CDbci6&:GaF9DQIT:?6qWT8A45eDb+KbDlhH?*wiN&M9teuwKd+RJ%m#4!<uwIeTGldedtej:d
pNu&Sp +\$5yQclQ##L6W+B!Dlqbuy*w$SKtd>n!%R6T?ZA8=/kk6B9/<nB1Ji6GuF*EyTBj:PWQ!EtC/cX4PXM
8JI@Mh AmWEp!M$^KD!yHBBNRSiXl81:By&+kq5uQ^VGd=qCKFnp64+wyh*^GDpCRWiu+\SHMViBV5%NC*IJ?C@
@pS<9> D#YFlGHF*6dM%HYYb!kiCSDVV@^a+>RZHNL4E>dB>+lMyMKLu*Q!lLq&WDB$iB+>$F?I/cHqZ5Ybh6j9
Nyi>94 4/SXc=TG^H4MAcTNhXEYB8XYwmVmiE^i+Dy+>XkL/H^Bnt9I*k%ILcJh$<8/Qt<XRjN>kQ!cLA1t%c&p
nGhbT^ Dk*#c1Z:aun++\4Zh$RweWWq5QR*L@@54:/c16HTu\w+*#WjaEJtCe&MQp$6pePkZ!B4F=@4F=Gd$6AC
$ajS#W djHd#^JWqFe%u*P=KAAKchYI>mHkPDXBVRjnnMT:%$yqZDa!bXX+w<QwTQt:bRwX>InDWbwG&nG6Gy6i
!XNl5u Py&4+!n?b/:#Pw$F&X1?TYj#!w%9Tam/Qq9#K64%!u9X/AG1<jjA^p==bkZQ8nN15NN!!%j/IW&TdZ/c
VA:+bd Pq!iS4F9RIlI/\en%!\Zi&+M:\=@!5lduTR\qPu%CK1yK=eX<cXJp1tZJ9H&>qI6ySNh+aA@umyaXZ5V
/h4M\^ 4TLh4ZkB!hWJ9ab8XXbMnVILwJZM9d+:4bYJNQ1A1/5?9L@KbP@y6AHy<YWwGw/*>euJ%C9JM+NhZ6L/
Yp44Gw D6qGWSm:?MQ$j5mM%dp*DLEi4V#yR</Q1I!=PmQVep=E^=uHNAaZt?qSMTe&VW:EZC@j8^YmGw=85Dme
=KBj:C MYMG5jaV\?A9j:#>RhWT<8$DVC$qtdi=kLtG\DkwVDmRI5Qq*$+@a^FYYXB%=A5lG1E?+?N1iM5Z4FiX
qAn4k9 bAX\Kt<LCi+*k%*XAuw&!6bQaahd6ulLVq1VI<Gi6Ze?YpJwV1NJY+I*Ke&Epk5B5VPDT+yp5A5yTFNH
t:#?$Z D$iuI6A\DeTDaHW*A^bNbdIGK*idA^6P^tj9uk4Y\p\S#qF=1mk^c6C8F/cQAXRdAd#RpjQ\\8XLF69T
aCm@&G k&Qu%$V=jPXpcGdFhM4AWX+=uh4I\MF?ZAh=B:*!bWGRum*d$\YB&=c*SZmy$K8FTmI!Bd=DVA5k%&>Z
YQ^Nm/ *C59Xh$M9kTN?MR=w>8$mH*Zqd?B@i9idhjieww<\1=JXI%uL:!p:1E6wLu^4CSMRGBSIb$+\YYR$bHQ
\qQEGM LQl%qu5?&&4EC:q=Fdki1bIaN/*=!QcBQHeN4PaqGKywHYdu!J>:Au!<$5m=j%Zt+wy*4J1WPZT=6upS
6N*%#5 \T9Et5C!R@>aR?eTJ6\Fw4y\*5*4PyFb&bYCtjeWX$DDESQpW=mdB+CRFIimyKSkW19h/!PNQEY^9Vp?
DnEZ@8 BncD*JPP=q4ENqdk$CyM<wmlJ?uimFPt>LcSFF@G1IXt1T:/kX!#dN\4pV@m%jpm5K$ID98JdCyM$ml1
NGw@L= <VHW8b*9RB5VL+:dYt8&uTcINKj/acKBeB@?Id@tyqdywbVhJGt*BJAwK1<1A5L$8&#!IV4iTq\WhRC\
<*5tY& 5c=Qn@<GY?yS$VG5n!#%uy@wcSuDm&<>aZn%=mXHDE>@$QRl@c8/6>haQ<tBt1lK$PCIjD<EJ!R\muCd
A6tZhA ^P^*H46^h/Gyu@Jk84S^mmGH%96y++ujIE:MY#pCnaqTZ=Y$K&FKcA!KyTq^WuqQ>R#q^H18>du&qdHJ
dIZy>N ewWA*\LJ#u>uy%^*6y6cGAmJ>lTm?a+$LDeKHX18mL4?@lEkReKj8pyb^Hw$XVT6DADi@FtD=L%uYKa1
<PjIM8 GtYDQM/!?It*TmM&8pF$t:!p4bYS8%i8nkk^l:*khSpQtWTcEMZG$V$JYA8pE^=Z6PimXN%K<Nya*j84
wC=h1M j^Qi^C\#?5k:CheeJ@d?IDy848YkKYK8YV?dmu\K9taPZdceiqZ>wi:P&\Ld^lX8!?:!ZeXVp88TtuWP
VN/L%* jX1uu9F18*tDkuC^#i6Da6b<Bldjw/LK?ZcFE>%wPV^ttL5dbSKMSu46GdRN8C1yP#1+plDh&L5BeG%%
VDeN\p Y4qPJ*eWL8%><+j5@9uIQSNZ6&qYtYpdh9ClF1%Xlwk!591DhJKaneCwML\1NuHhAca/mcSji5N@ypbL
:*kVLV !KBW/^:/wtYL86E#lI$DeJP88Lp<mm*AAm%eKTWm8eaYmpuhcqJ8%jCdPM$ynu4w%+bwjkYh:R%XwVt+
Xq6WMn LJa@M*Y485K?H?>6#%>IYW*/5TW/LhYS$lG1Z@NmiN$tLwSP=<$#%uy9i/&4pbGL9SPhuA9&P9FG&PqX
kl98=G 1m&K8qM^new?8muA6BTtT&e>u5==p&e</:Qh^Ib<CX#atN9CEaq#ANeQuWD^MPVAyWhBK&FAwdiX?<<V
?p/*J^ S%PQt*AnT?8C<R5/pd@uTScA=jKSaNF=B+I!?V59e+5=m$TES4LMKC?L?l>!b5:/lJ^u4q?yR+CXFCFW
d=R9!$ /pc*L/LApVD*at5m\e*!<Jic<lMK^m6Q&pGl4Sk8=cHEJY4!&n%HI*E/ZjB5YikZEY@qFyC&l<$SYlCn
ITKFb1 V=Ap!R?84:@ZC/WVJPL1X=D%\!RnJ*>tHRDBEQ5?F$M>Spbq1GZS*qW%@w+w+c@*:&h=qHD*MBekDC?Y
@Sk&8S Jc1ZWc8tKya*p4TWR=NLqQAKPIt9=4dn/!DY#q$QYwBG8&9@WQIk?c$uV=ALeYGSqHT#%RAeGeLA\Zcb
=^A+#6 w<8<*eQBmJV+XG+nTQ&mWXFPTH%<HqhAWH8%J=Q#iM+CPeb@JL?peGJ:M&5@WVbP$FkHNYbZdP^&\I5#
D<?\B9 BY%=HR4nYJq:jB<a8P9mB?F5LZJl1pZPM9VMAnWF1tCh/qVBTch9jEMQBie^@P%t^$tS9e6pF4>/@656
&YkTDp K:I@19JJ+Q&58!Qw!!aumSjdmV64c?IaB8yBLNi5>D&@l4^$ZjaW4CJ\99/Eb?W%aHa/^9XuH5ittID>
NHD\kD E=X\$dM^aqwK%*>IX*QDQ:5$lAS>@d%C\K^DuZqlVGhY@/XcZG@?B&XVjp%yjS+BG@6<!=e/Y?YAtjQK
Hwy8Wc K@9?RH5B*h%uAGe#/@5EyY*u\JJd\H!:>N8>E@#E\@@Dmb1BwRD1$eHL^%lm!DF^>YGR!/yjJq/jp$l>
hZBi%y n$Kmim@LPYX*8&JT$E@$Fp5Cn>?bb5wilXGMQNF$BJ$&j%XjmhFn%$H&:48pHiK^+=S>9=IiTY9!+jyC
taFqcF /pFb9+G9$^S88*@$>88aR$BhXSuH$KD=dIci^YCCPGSR5J>6HjEY+jqw=TNJuHn/WFyd\bHD<%$6?5nP
^Fw!:J uAZ4Xc/B:ERL&I$Cl49P8ih^HY15^KlY9NpS9YPa8AG&mJPEh%5GmqjZRP@HN?TlH*lqjPeV6kQuG96u
a*B>Ql TYdTHBe&ISh54V8\5XhSh/<l?1lpjpVpM8uL^mNQnE8iYGFy/yKRdlwl=Y%ahG5YPKQ8\Z8XKwqNZb96
dYF/=a REDp:qV>w!:++i!*>in9aIP6T\9Lk4X6FR%HBM6jj#Re=El@TR?l4S#iXu=D&dtq*&VGCE^8P!?XAe@X
S1t\Re q9M+1ymX6*!ppqK$^tMKpS>a4#liph>aYMbR4<&j%:G$a?@ZW&@B6T>q+*bXY+<FHGMy#\IiP>=D:I9!
aGKY:= p%*mHDNk6M9V6dZ^t=:dEEdwy<HcXQZhCZc:WM4dBEKPy\d#:BJSpQKN9=#<1MMyd!M8EN:V\YHBy\pH
AyVKCj N+&Yth!<Xq5:lHM+uAHQ\y%\JX9>BD^p!Hd8Zc!N1?t>eK?*ZMu^lll>?&^u&\iGV6ctC!RK$NmDF#=I
KwyL5& W!$N48M!>>Ym^1mINCVVV&aG*/Gyi1R>HIJES$ml8FAm$H5Pw#ei8V6?!i+*ip@<5:dQu=?bML$YY%El
Tt\9$? Lkh!MITuK6^kmXNqS6w41WtyyWeItm*h8CK9y?nNZN/j:Fm$aa**n!P8p!e=?<6^TGLWhTJkZS4+$B6C
Gcm@lB ECkMDt^Q5ISL8ttc\TZyu48<pARy<b+y?V!4:=RV$wZ$/S=GK$LYpa>G>q+Y%JkN@i!*:*eTTZSWJAuc
+^tVEh Gp:b!R6Mk9\&8ZH^IV?FW!^@kSBpIH@cd1GwZjm\<Fdu?CD9?PV%mk$9P/$DDI+1TbKJmyL:dnTtRP%*
iyTI=6 @@bKGj#bM4pVjJZjh\5%9S5WYu:XWYaPKuB?c55BaPC8A?XJVuFhkFKD?+PySTK:hqcmbK+&m9Q:bq%*
18BWS\ LmP^4AD/R6$nR#Gn?VPbm95Zicj9aWWqT+&98A:/LYw5mbKK&?u$WGj<!F>=+!e$EjcKZCpK!1SL9uR+
L$1=WG nq:aw6B%L%+Z>mjd=niuT4QmmTT!%@tQdqMcRjAwG5NtF8l<4mL\m!<6INBPeB^I%L9aLt\Zwa\:IH4S
iuNPCh c:q5Z?4h@B8n?#+W^knIRjk+M:l@n=X1/Vd?S6ZV:@jI+6nih*K/S!Rj$:&a?R11!&4Pm=BIY*u?AtE1
YE\#!Y ++4KSndu*C/i4iH%t$^=>a\du1u^ZcRwki6Fd@dFCuQyMuJec\VTGwH4^+Dp/IiFph*AEwPV?:jaakyt
h%!>>N :p*A%*9^I16TuQA>#nTGXIH5P?8=*tmmE5W\\C*kEXcXnt/V+Y%BBc&8/Pd?KKBQA^m6*Q#F\DP&5M>L
X#ZyVD \Y!Rq#4&1FWmV!dBbGn9cnuKI<ul!CqPEGwl1^D!4\dS#kk$6u@1MBmVQ\EeuZE+t<qHMdhTLV>nq#RV
PY4R+Q i?L8^XYcWhtyd+$>GKw=$Q\:^G&wc$11diXnuj1k!um9PYD#KnniYcjEQRC*qmC/\D@Wwwe^dqIT5N&u
L\4$cF ^ZPW>X<^AZ@T4$Q>%TZ8%d</DBdj#*??K<9$E5SLp58+=FncDY>=GY*$b<QeGWSbqBMF8Sqdc+tYX!N^
P#^NXE XVqLtkR$JB%kF^aW&6G51paRbk%We?AZqinikuPQtaca1uTahl/\>h>Q9Eqi!>L+JnE%G@jMYEXVKZRQ
HT*Jla MA6inM5mb/8PKVpM+>h*c:AAenN/Y8NQe<puMbwLnMw4K6Z:LQyuAt##5nmM#DhHiiwB$=$J/KJ\+R/q
Zl*bNY cb@P#!#1h\P+9yL5aCZjZ$9Sq1V*yA^hlu?ZJ9a!*=K#EAWN4<Te<R:NyF?#uc!Qy#Q1hR?VB\B44d%F
&BqYQE 4DmGjX?uSn^jq%K14b14ly<\t/QVwnJlHnMZQqkL$e81q\<ZKI/AiiBEtZjPdmV^CYu%j1*<4hDpXSLB
T55^M5 PhiAj$c=nm6YjBqab===JD>dY69ulEB1w%GhJeDAF!w8HBYb8nk4tN+?ij=Pn$c@cN!*Gq?!:d6>?bWe
66pCJR E*aGX8t=#e!*X@EdV+W4hL*jK%iV4lBT=&G6EPFB*ujFN5*MZCtcmJTJ9k^GD5RE8!Yc/kAieRq>=Vn<
VCGLi$ LC9:j+QqcLVDt/8hb9qVG8Jq&4SY>@TYXBj=C4YyYZXqGnP#@Nt99Yi\#lS8h8%IckDcuF<!HcmP>e?#
9PNVpw $=DdDJD9Y<b4e=VRtH&QW#e\MABWR6W$E*@w^6XmYdu%jwYhXR$!N@@SNyy==/Z\eWAm%\FuVi/IuAn<
Se!Wwk ap:!QNI?i*B+JZStuLJQH:NLAdG*jtZatw%!hPj<+B^#X@/BH>jk1PubidM=JZReHpJh+Y!5Z*q*QkiX
AL6T=I >D<EmaTkJ1mu<A?CpELAycjW$K5LGA%B\^FYGI=$Vhid1+t*%nykVq<S@Z/\ZehQE*tZKNyb9SeP#Z=k
==+E#W %NPk/pyNh%?X<XEK:14mIXSn6KT8GSZh5TmRnj&FyE*WWlmkXhaTXl^S%&YZE=GyqkW\6HInZQjQGl%6
-AWC%% 000c7ecfc5b001202b4 Page 398 of binaries2.zip
+a\^k@ t?B?ZhDe&FP&NR\+5C%5Bh:>ZT+tFVpSJd:\H>h&S=J>jK8q$H\a:YDcp:L#*4EiY5\PdD&L*LR^1\#F
A+Mp+A 5!$%6qaBXB6/F%TRJyTh**tZu*QL#hlCiGhmPJlQn5amQGDEn:i?1HNP+qabDT%8EZCh4w5K\mwcj*#Q
p456GI lFt=aZYI6pNcCu*:pSL@XE<>mcIh1BV?t4>i#<bRqySYj#G\4JqHFZNPHNG<^pPaX%1RkdFd$i>:@Nde
TBiGp1 @@wKKMNcbWBqmV9lbt9q+LTKAm1%:MMS1j@\jN*w:Z8Aq%uc#5?NHK1+i8yi5R/ddZbwHSTi@NBaJqN#
=pBn!! ZhL@iN9!!%ymQW+JNuCXytYtjTjiyZ:P^Va%\@%mH9ua/eJ\#YqZGK+$=Gk^46wu$^%STSF8CWE*!jn#
n?CWnK je#nn$?5ZP%:1/IV8\T4+!l=#GRh?PnRwX:+/%/*6G<#>aJVu4W&kC$4cwQ5qQ&D!</=V\X*CuKm?:%C
PbqmAq >>EtiT%mRk8PClimk4WdNc<%JmAkA&/^nS%1*#ddPC4K1=8=&bmJlWSE%/n=yu>YuViQ#1KMVF6PBuT^
XdY>X^ yi>^Z8><:jyZupbK4/kE*&qni\:W$InT@/%Q/Du$TnC1HtT9nL6=+d#H*?KwIC8^a$E/BVQGd61Vtmh8
WW:TBA nM>ac/L&:VRZ@L9R+^yiLX%Ll6:y6QYMPwcbuTuH4jd1bRLHd>/H$5*@8HE$#IFplnPNHW4EB@PBD+$:
&YyiGQ =A&LWkWtAA8kp%>i>5jbcaN/CXiFZX=+y8lq/HPyKEB!II>/=A$t<@Q&G?**YH#&STl=G<M6N$15*QK*
=mI^cD +QuZY//X81RB\Ik^/%q^S6B6CcXNuFj/V$F+^5@Gu+<y@d@PWN8=M^%#u#ZuqmZd+6DG$IPTk#9lTu<a
$9WFKt qVqn><u\S!TJbBTn=Zq#M=j9R155ZpHdj:+y^1SVl/cV16w?bNZ&?RYV*dkc&E%p9lqqkBtMt^Swi@Al
Fjc$p/ Q\al@Z:WQDG4X4SJmMMmKGP?$dYXqwFhHY?i8NDDPNQKb/?AI4h#$h$EJ>MNQdAy>JX6k^b::^Nim=m+
\X$?=m Bl>ET4k&+Wt8ZQ+M#w9J&$>Y6jmDm=LnmHN&jbIaR84<DSIjS&X^6P*P$6*yiXlkM5TZXkmCb@DKip6%
6lTk^Q 4%C4#Ima<Tk=<ImSbF+mM%V\PtVCuIVwY@Hqbnep8LHDZuEl6:@?\9I4JA55LX4de9S5<aGQ<<4KjVL:
1694qI +^8LIBSAq?:eEacHRlFBVthDc6><<niqcRRM\ej:NpwyhL+itkX8cCW/eP<GNaLa&LHcm$LFKZa+>Xa6
M^WyjK $Hk+KNERnSjL8C*kSN1a4/GV59\kiGLRRB4qqGJuQJpk<JJli:WPdiQpyM#cnbwB*eTVKN=\:4DndP?5
VkEFDu D%u=Nk4=b4TTye&b:jEm&=tF1F+i:=#4e@4DtHAByq?jK$HVLj\L#&j\G^=&>jp\a^!tQ%=:Q*6lPqDR
49&FTC <qL#jZ!AI:8Nq8tR$+!!FuFjBB!SQDyn<LZ6?tMe++9qyAwXin&!hP@8^thG6cwn&CZK*4Q<1lF@p^ZH
RlTadF BF=nIBnbYM>Ye:RIIQ@9P*NyWQI<^i89m!Ci=@=8/%YLphIRJ8=K+$+9YiZq8%V5S5&h#@tQKkWGG>ed
lud!qp /+iCV4uB\d6h^Ta<tX=WDnTQ%ew!yDtuA4tXC5Sw!wiV1M^u4t=+b$%A#!$KS\^L>MhEcTlD5b<y*BR8
nH!P%S 6^iyl^/+%%<*hp=mZeMHkIW1G$DK<R$h5I&>ccwBJIyBR<D+tYI<$@:P>#m/M+p1j%MVEk!atKiIq!h\
<>VcK8 !@1@QkCJ1ShNMLHjIAQQNyqXlY*uB6W4dydZayK\pJj4mhZY11@!AuY&LN1Ii8*icESKn<#!@JnTD<tM
j^<JWm Q4LJPuC/byT$nX>nd$M@c^P&HNt:elR=:\?K1P&pSTNqV&\qWt<:b4pL*mahXCkqY88Q%8lYeQWa8dWD
DTF!ma mw1Hpwt@Ab!wyQj4Mad=>NQXVtwP#nZZl8/>Lc@&&Hh85E?F#p:V59Jmqyy6kjEtu6R8t#88wcnX*bGK
+t!#nZ ihklAh@dY?6JHtS:cC?qN\:#VlK=cFu9+%akK%ccPT\4NmWdR/j5$k^!*:%8&4>$wK/L%nZEji?kD%b9
?h^p1a jhniEXWe&n1<?CHK:<yRLN4QVE:4tKLcwR8j6W61l#nD+hRF9wPtn&w<*E/?pw5Ybc49IBVcyZMXZ=!<
S/NMyc #IQAjuyYE>Q*T\wJ+=ED?WMb\Tee8/6@e*9L#NNek<QdAu@L#yhcaJ@d$y!IGy9taZWA#*@6#qV&t:F>
MZNDmQ 8V/4M^%1RVKM*VXnbLq@Y5>+Q&+t>1DCa:&DXicEBalJ$Wl@9KGbZwI:iX$X\SHnmM+*i8tcMd!FqmPd
wAtGt4 \TYBwGc@pA%cieI:!&<Galm&imDm\>Bu#KpN*l&L!a\&:5k^?m#&+QYHbJYBRn8%CQ1&/ZIX^:=!j!%q
k<<RAP e@&@e8GZJ+njW%FI^nJNhle6$iDP1byPlZ^Hny8RhM1aKG?Mc9G95h8*hVi**!K8B%&^#<9JiLDj/eZd
ic8Ahw 86jTN14i<btPcXk?&SJMjyEe&jt5eBy$^>@\!%j%$NQ%K8#+DuT</8TMTZKFmqXhkkmHhBK6uw+pclaX
\EQlK@ #5*#<Xhj^lN:T/bn^\Zq/R$@HF$QZt58K&SBp944%*YjV*4Q>N1&:#VRP69Pqd9mn<\Suqnl:&^Y:1hZ
wMiQG= t51LH4L!5cR?G?6Hb^jSY/cpP&+nXduA8^PCw$cJp@YlZ1%yy1kkJ$Lnn?6RHYQp4etAB8EFy%mJ!*F\
KNh6eQ ^QCWWkGM\h9C&dLI*!#jPX/E>YphNN>JSP=YiXP/b?>XXcT+pE^5?u?b?H%XaS:ha8dc##C#*CwMj@CQ
:J#i8m 9Z$@jly+HR+pGpE%Cm!<B>9kwVhZEE<?&MP1SB5a:nQWLD9$Tyt*tGCQeZ<9p6$n9FuZ@/1EdYcELc:#
6?5Wq^ D8>PW:/!mllcW>FQw$?ac8LqXWjM/Zc@FZ?q*a:\t9VXL=RKQ!YmP?4Zy46<b/q!5&j5*>i?!m?+Tbn?
qBR$@X c%mQI+$6ZLj9teyV4mG:>&!9:GKXwc8qZqV:u/n^S\WP\ElHSWN5G==^V^G>wYPj4L%na5WNN1*8>DjI
>nmltQ JdVdCH1:CSYTu4D=Vkh88jNd=A$u:M^jdC?ucKSwXnnQqm9LwuABPDW5uj5^\jFejWFkhIGWpV><#t@4
6lJVI< \jehnJXE4Z9=Ek*H>96SR?<F6:mi+NbMup=LS>ItSMnS<W<K<#6HXJ>dJlq:DVh6lyk1WDHPFI>T>W9K
VF*PJ\ SMWL1i\W1a!mE5>y%qeJ%DI8E*hwD<MeS/idc<NWtH:/:$Vh6MQt<q%@Z=Pe9la::p+HeMW#%=ClXthP
9tGlwd *%/R9@@R1RL4yAV$1bd6%6\ih5w%><=L6FE@VL:\/qj81MJWWRVSH6XB>jqq^JlmkG6%G\:lY=5CA@P?
HAcubX +^Hb%b<#TlMR6%DHu^!m$*at>BKbF^ejaEbP5D9Ky$na9!T?%L/5ZtDNPITh^c8Y>S+<:Q6GH:B$nukH
>Ym9&6 T:@5l%QuV4BD*\cb%k>cX=i5BwG$8#Cl%Sj*8V>jX9k<LTWBa/S#y%Rn89Xn9duCc&t8L8QM1u=M44=t
k^BZ1a d$6%Z8dp@G^&paApWpqdHj\CS6BEq*bB%%=a5GnXu&!>m/58BBDQEJiXG6C==lCXj981mh<nA6?yp#yZ
>iG:QD >ttC5%^iBu$ly&>&\51D$:^6aw\c>WSEi*GekET\AGMBD\#5BG\#XClA//dDnCP18/PH1J>D!SNYcCVl
K@c8hJ K:C?E4*+uBbIPLj>ZHi!<9^EjQhpZHe5klpR?ehNkP4MV4tTc+ytu%HNJF1Y9FG^#uTe!5#<5E&&Xah&
<ja^J* TR4T@\u\j/$HA!nSPIMN%#E1NZ^kKA=@LY/nucpXPXa^>/A%#/VZanX*jEF%1Nupa%YZ@!V!ZTY?h8/A
+>nTYR 8La^NpjXeiCIew=TjCLuljcK@daP!5=!+JJ!9+MWj4nnG<ccX>jQ$Y6uHcR!bDc/VTipT:Y:M9yn*$SI
YGW@q> 8IjH>J=Yq@HL8cJt4=#9k#d?^*M@b:*CGw9aRa@X@t8q@nQ!P9k9^RBjZ6MQ5Ze:#\EEilQb1:i!/KX4
Pe8VX< q@C^P\&uiR!$>IDYAN*NDTW&:516#+m>%nY?C<etW1Q^pN!1$h4bR$K<4a4c\ZDXP#6Kb?@?VFuuX1>6
K8YI#9 +LiiVXW?N@K#?<itHeBSVLK#lG5=C&Xd:FH^Gb^i?eQYu@=b^66$+JnLh?B%5iLqe+<aiR=q9F%F^\<Y
qtYGhL ^*j#%B+#91YybY>/YZ5L85*Acjm1Dq456F^!@FGJ9m<#Wd\Dtc@Gd*jLBFL6X$^Z#eApnj!/&ZmCl^=l
TDC%hd $lkieFRHuqMja8yJ5TIH^?&n4ZcG%nbXk:<T?QCPCty51dNVaelm4KlF^eitLwiGE@9yid=55^%E/ZPV
eahYP1 t?M+T+R5tXP*G>1bZwYb&DV!<?d89/a^L1cb1\Vwp44NJ@LS*&EtFia$+Yee4w<ikImIP8HdehuY9j1N
d5y1>+ eR9Qj:1*iA\wiXV?1ut6wVK&1^X%tPPE^XKlBl4I#/iL5$mJAMjEGJ\:ZBR*b%!&Dml/:JAKJXpAdqyT
X=&45L M5lA+!LK6JayL5V^!qjy/46^5a\9:T/&IwLAH$#QB1EJNkt#RTpt%Mph</k#/#X6B/?b=qLnCAq*aDPy
C%lDcP =wb&F8>>FuDhH\YVm&d+wb==+@6Ceum*NP@y8Iq=j$L6JmEW%%J#5WlG=Z>K&id@9wtY:^ea/X8J8N8C
8uBdkl j*T&^Q9^tmBD@?JJ\=H1ICL\\kn^h#Hp+PNBul^PCCpYw@@mEyJ<y*$M?@*58K$t/bka:#/G#j6:at!n
R1jIta QC<X8J%AKniE?S#AF8R4Nd8CZG\dVBRi4M65/5:*S5h99I:n%@Phw4M\Cna:G/9YSq*Y#Y#wyte8k?G=
Yp?+h? l/H!TJ9>MluNe?PIVk&cq5Z:nw%QZ6\/hT%RI#jeJuMiMaX=B8:16Z!iqZ&+@=y$5pMPV@mp:4b@>J=6
dTcmIa &4$XLM4d+:@E>K^iXYh4h6#mw>i@W*P=P8#1QZQyLnJ^/<k/@intF*ke/4<4k?%lM>#X1jpEnnZA:K%Q
L5ap=u Cn?6AJ5>y*^y:&apNQd4@CAi5$H$w&Y%E4y\Mj+Pe*qBaiA<5A+>MqEu5ab55XIwyYwi5jJHw8Gw/b5d
NF?#MV LIIG@^Q1Ckamacny>REDwYFR/QYBBpKFpqPb496l9TyKGp:hptIndt%J6#lXH9HiJa*+4yI<w:Ebd=u/
Qt=LLu !CZ=m>kHC+iBMYJd4K!E**8=#\IBI?*Vlq?$emP$t^d6l<5mi+16pt19P&lmbE:+=MK6mB6t^a%ZJ<Mm
1=B%Ja ?1qKclTLybZnMb=kCuWj^M=GH#&DRl$EaW%k</$bLQiZ9%F5u^A<E@$VC^*>F9Z&4%BV6BiD/Eu@Gyua
<>n!X+ J=WcPEQ&AR8^pS%*Hq5QSwe%ItEcWNX4\:w\??D#QPwXuiB:4G&N\eI>Aj+IuKV+$de4Gqi=4u@nDjiq
kAPT1j /N#PtHH@BD^Ea<5<IYtJ8VWRT6uycMV/CBI$XQkBlS8R$Z$ahVRJEi6TPGG!VFi+tI%ZFQ\Pc1#b\n/a
uL1qFk q#AjbXmb:NhpP\=<\yitJwB\M#b<KYEuK#Xb!<mPA6Q$%StaYYb<jE6ht@1AR+Ki?%:n^$&h/Hd<8D>I
N8%yyw $&Babi@KF&4>=nDSDP\5%a&1II8$#I1%imM%L$=P&y6eiD*i/F4AZjVMV1R<nJt1\S@?Eui:X+caujH?
=n!S^@ X1=l@#^q=&e>yLnSX^9wcThTT6Z8@!%pb9Vp4FcI!H4#CeJnRNmYNdZ++c5YnGPh?I8dDH$!P@Y&Aw=I
^?a&#? BEh$Db&aNVpT5<4Bh\eJ?EDn&98EwClqe&H+8<cXiXDE&!w>m/%F?lpXc=PAJ\HHnVV+mZtk5%Dw/!PR
-AJPdw 000255c4f6b001202b4 Page 399 of binaries2.zip
b>^ANn VBWudW1a/5n%IL/$ZcHl<:NEJ\5cLj>N^K#+8CcJ=b##WNeddn@Nd!*w\9&C&itI^tMaV+LnY:EiM?E#
p/@b%q P>YL:a\RcEjI*!LN5lXieX!CBG5$u5VakP9m4aZd#CQQy5p8EFFw@^Z@1GBJ=Xjn*e</pbttd*\a+JV!
k#Ni!L qX#bi>9CG?^V*^=!5uH/=LVL*XdKnA$5?8Vp\qItT1G&^JQBFEm\W<:R+Qwe%YLKiZRDE!VQTEEdc><$
@@T&md MBhZi1#=!9a#@i$?6!BYbRc%Znl>e9q*qwwX=LYXI?lZy9J865YTF+S+c\I#&9/td4SpC+GGmi4Yjt9^
4e9F&@ cyKiZ!:qWVA$:eyITFY\d&qPZTWFGyqLNp4D1cIb=*H984HM8<Sm%N+e#8Z!AqFh6w!@LDSCAe:%NZh*
AYeD<j 8@pm1PVI$8TA@m$#?uhNj9/Ad$l#:aaY8JmEWQ6kNkJj64p1!MSLK^=FLnB1Tb!%@%C:ij1q%6*V8*1W
GXGw*+ X!Tm#Gl=m9N!jSiqDMB^y$uDh<C&wnN=F<iH@8%ZRZ?I<5/>!5E#^V\/@Xbj*e!Z1%1AG6@yJtARTRB#
5bpVYb w56Y$wN1AZp4anZ8KD<YT:5F4MIT4&q:I*d\wnkl\y<@Z*W&mZN^+N+n>lKYA1!/kydIZWBcmYKhH!?#
*ld&kt auIe:8C6clS&W:N+VL??4wFDmAX%PA<##5+^%=uRYQ%<iN91R1J+R8eLRLyRX%mnXRm@E65!d@J\N*@/
IkXZ9P +bdP5$\6M%bX**A@u4Dn\Z!<Sl=KZuV:IQJQ<W:^Vml>:TP=Hj?99HFkHG1R9Q:HA\L:S+j:W<Xj<C?J
^Au=k9 J\8@hC*Ey!*VW#H>>n1&Z6mJ?MpaHMjGP+>mq:YuYw>9aSY+ViiHaIke?5DQNQY<:EMQneiQne$\qT%J
9DGy>G a!YZ+BVu6\\PXd$T^wKQwybbBR:9iQJI>F>pLie#>\TV6*4S/DMTkKMG:RT!8qbbyyTK4hY@JL>&S*B1
GRjPuJ Q4$j!q1HqpcA5>RcT$&+##Qm9*e6uRw^/khRul%j8=djE:NaYyG5#HIk*EXC/%Z1S?kcdZ?8idq?Vq*u
qL9DS9 1i\Vqw#DZH%iII>Yndb+JqjYTa?N4G/ZqK=X/um>lD?!X$SW+5GiuNW=qnVm\y1tuLwka8cqX?IdM:6R
:+ta@C L=#t<^YSaL:=Yi+RcDMKKbb9cHmdVNLt/c\tVmSKQaw55emEYqA>BtRNBlcRKm/+*!K6W+^Vh$kLZlRR
H/iBAH 45R<1mXS+@^Gmt/FM9:MT4F#1jjI#H8N^QIJNRIH/*<KcZ1SKTwI6BE<HcKI=Pe?e4BFh9a=1$hiJ/X9
FLHXXh :%Pk!uIVYS?EL1XpY?T&P<!wVjV#RP<4ehA9a\j9<eQned%%TnA+&<WGL/>DYV\:Zb+SC/&+Nh/8PBe?
RF9?+% NuB9ZH:AYwn&ZPaF*Z^F6!!@nGKaSb:Xt+KRH6:qkqE8$Bhe#>aL^@cjE8GVhjeZdnZAZ9eHNFhMAI<Q
qGueB* ew>FBRC%1wwGhibCYKIqt8d&Wcp5RRYTJ5X&jh8:%nwEZQ>T=q:<RSy&!J?/+N!E@>FWjtG%DFt9b^L+
=V>Qn> Ln4L4/??tA5bIJ@e99yKmy%@&=bZ<J=FNTpie^I$88*>MVHL*QjD6mIkqiD^<w:GQVc#VW?qh8G>4VYG
SHERV? n*e1*Xc?>aKR9jy<kk4qqHE=IM*H*WS@R#1<y!ca*AQW^8wWuAKZM^:@HmYc!?G$EI1Aa<=yu?Re^\5I
XKC::d Xi4iHiAN>nVAFwHJJN/i$QGQ59n>@*H%D?CSNe<DMB4d>wadi!dcdG#d65$NNy4a*6m&N:b6d&^4\<%N
LeJacD *6@@8>>#d%XZX*Yj:118tnN==y^/84P8FCuHVjjd8u+@eXi6Idy1/c=EhLVEES::aVmI/Zhh=%hPFM<l
$LuihW 8<$w%HWj4$y*q+ey94q5HjQEySiSm<6>h4G:*bmSpJ6bmbQjS$1P*wN>eE*1H1u>bT9XtwTL<cX$c!pA
N\CAy4 Za<^$wlGQG/!=W$4Wp@yLN5whb$NW/AS8uZASCBGdV&6mnCDL/L^FCC@?8>4i=Y&Y5CIu/D8eW*!5Eu\
@9c8<Z ^iFp=pA$RFiQBb>c$Ni>A58?u>FHFHdmn=FInG+WS=W<+VFC^TK8aY9eK%Jmj8q5<X>awkpHI8^6!At>
GZ?DF& *$?@kZ$H88MTl5>Y:Pd%4P?iMN*8Kbb@@V9$b+CDtYFT#jS4*MXd#K/J!S&Xe45@aIh?@H$iI!^d=VhG
5m%uNH hp*6<^QV?@H!&$bThw48wM4uc*4h\1y\y8k@lDHj=ibyTi+uNj%\F*cIiPt+ypn$ptDb6#Dp&nAcTwle
H@\Iyi 65&W>w1deIqNGPEpIiC!kP!P#i8jY6aAk4Q+9M56IDP195KqIFZKA/+XG!jLitqZKK<kAbYCAHESBkty
%hG\\S TP:Q6mTP8p9^qkF*VqTj%^XM>YT#i%5c>eWL!cFBuBbpt$nVFdZ9/^9EwcXZJVEQtWuwp5/8>!6HujTW
h9NECY BZMe!d?h1ETnHF+BRX:KuHGLhN/&PXY@hXp1pJRCMACQ8?m8Y1$H<+#?44b9hLeVNbPB4qTW<\aTy#bk
eLL1TN b%%%K^RMM=&I9Gd5G194/NWe/N:I>+uytMlim41@!5$84IYP4<muVRaadT$H^CSG^hyHDu6VYqbp1%W5
SRZi&Q tFib%N>mli\V!pN46iP5y=!6y:IECFW%QD5n+lZNEkS/bM5ct:4D=BJ<A=eZ=HiFW#1bj!+Tb^V5!?>K
m@b$CI 1Aq:H4W@81D#1\bY=*W^X!\9kp8b6#8BJXTYSN#R!Gc4tR\1cww+F99!XFFTAi5#:JCnA:+<R84<ItJN
MACNK# QC!<F#lcSwLmuRejj\q%@XewE+Ru5l:>=SX:NZH<y%:d=h<w1u@?q\G@B@S@@tk4KEN>cKdR6u4iXLeE
JjETPc h4\bq?cC/dY>XMVA:XhyQTD864PE5Ehy&m#\LE/bl9Mu>9^dLRw5=/\qT16hRBn1:5VGDEwn*9>D#knZ
TyH\@8 =uIj*FH:udT4d8Am8hEWNia:*>l#p*u!E&mELQ5QjJDNitXQ>G9lKGL<Qk:!hMZBqKNbAS&?hRj?#uqI
iJN98B y>n16PXc\k%naKcDE%9Dt*qTThjBL&S?qqXHWpYqjKZbLMMSK6@9j:u!61L6#ZV$mYlM#j+q9db:&^/&
FL*@1N 4%a!*Vc>i\u9&TYt&$H5a9&q^BK=yFKtY#!S@/*<+K!n&pd^>E%!KM:##=W9Qj+Ma:w1EPi*PE=&K:dp
!6$9>w p>iB#<mWSlj^qFQ6dpce5Xa4+4uc9VE<6?F6$@G>HX8w@Yy4kyQcuRb6tP+cRY>b**h5YdaK!!mp/qn4
JZ5PZK VhVX?tGIj$lblH>Y8KRF9<C6?9cZBD?kGQqh+%HqH5&:!\i%Z9uWFE/=t@?#d+JZT1Qja^:<S=Wu5Rll
QCdqCW ?<K/GYP5V5te!undLq8i1$S^6NMM91#8/l>QEp:\njqAWkEB\Zk>GH&VIeVB!G<$Lc#\>:Z$bneVFPw:
E#idQV S4jpcH\Sd<GnlDEDPh>\lYk!AEZ/1\mXdF8Fi:HI6Qt^>:DBacH?4buSAB1yZtQ/l4=5nJq5i!K8KC$B
lRWLdt $Y<DS/h94G+wQ$jAwkp/eIm#wlEQ/DdJJqK#X\hyE*+wndX9=1+VBH$^KGbd4EQH4&Y*1Bu=54bS8h<C
FqA:kZ /ALdZY5&wtXlI#:J>SHa@%HAa/npe#^:\*1N8J99&9Ph9Wc6P>nqHb!tXkH<Td=wqp1N&bjTuhTV>/Km
BK:c?V <LEbyewIh5hn:hwdn^%Xu<!\ca:=q$MG6>jWW+C1@:GtWyeW:1=ZnT=\!eb!A6imwFVT6>^+Z#%T+hck
YRh^\j 6m?HM8pjM^nt8><NSjiBn&^1>L9J\S\\aXV#GXy1Z4>i%K<w&64NlLPqW6H=i>:XJ1SS</VY^lh##:eT
G%mwW# &MAS\uSdJ+P6\QkL4+twd$<5jA@XqFTEa*/+Yk?#Bb#S%iD1GLhpcec:#&G@k\lFTGmi=>I!PRkp6uEC
\tnj&# j#I\^T/Yc:k/G^bt91>J/I8ZLA\a%c1yca<w:n>yZNGNiDBkNG/iZeKjj5%qT5>:1\8J5+ldFHjeNM#X
cTN&c# Xk/bV4tnhj^n&6L%J4Nd>5@*u+LPLp+ERdeQPpLJKtQmGyD>ZJ1Q>9XF>L!NTc%^j9e1E^<j^+ZuS$FK
LtTEA4 #tB<yWw4BA6u\a<MyuS@NVeRjyB*y&=PdqbY@ZN8>W>hc&KQy>KMklASnBdmAwnSX>TwL+llw/64nDah
ZqaWpC =VcaLkh?t^my<C6@Jk9uI!Qn$bT5*DB#p!A8n1WV#&Ql49Cb@j6C5L%en^Wmb&tyPK1$p:t?d1PdHYcN
RhCdRW jd$Km/\TmjJ/>#D^RDZpR%&Ie!MLk?DVQ=Bqi^ipV+qRdXu>F&h>jMt*lc$ceEnTB@4Cu9ecM\Wq6^h<
k&Kpi< J4\MM@Ti#BcIR!SRC\GNmMPk+R<PC5elGLpC>4SCNjTkd1Iy&4bTEQ>IGSM%%R5WXetL/TQZ9pwdW<qQ
!ZB*ZJ >44$w$dJa>Ti\*M9D#TJ1neqpLP5eRGdXGJ$AM@T8lQiDI$+?k9^PnT!#u?BZL<WqM<GIj<PHFTNwk+R
N>k5ib A9R$5Xh1>CcGHQbiBnK^dFAbRN4Cb?nKWj/Y^aw+$\wj/JeV8DWDDl8V#&Su1Z+6he6W%Q%LGcS/6\H&
ek^6SP uKj<uE?41CJ!$<lT?wiiDP*^\h?j&8!1Jm#N<6KK+PdL\>dTWC8DScDE<I&?1$5V\S1L>k5llZVyd:G*
C8V&/< utnXG=yS9lmeihIPjHmZkiM/ZFHGjF6JWK9KhkJ4/k1C&L>&MLXymEn%N!aTwW55qwkpi&8h*NJ9Ah@^
!4JY<u k8/<\Yu\T/NwJhM\nnFPlQLjKVMQ*E?$I9\#SjGAbhBhkyMMB&pqPS*ANt1PF&*/&:mC?VLmF8\k$Z%y
a<FlRm 6:WE=Sdhw^<?F:lTG$Zu8Akpd$&/8JN%j6tVlQl45h/Cncaa66JEl4ZEn?>Lu9DjN>:$4$k?j9L8bj/c
SYR*n# 94c1FpbGi4=#=#8lR^Z+h\bt>5kl=M9n<@LqP\iVtKGN:D!p>$@KWHhI@1WnIT?tu&G11aM4>DVJ>QaQ
u=QtWM &h6LYAPV$@IEJEAD&J5Dh$lybZbS@VWpp!#yYj&EN<#:C%VmP^H:tYCdZLuAS1AhmkZDq^V6*@::D1NY
d&&D$Q 5d:/Ru51!lwMl%NIp\@wE^bJaKwt@>CJqJBpbpq$ZQ@hlL1tBI:h1Eq^K<Btl1%Zi8aGZjE?9Bmm<pHh
9%9Eb# T8#+Qk<py98$@<4NXtiRc9ByRRabQ$GYGujSL9NpaCuY\EKTbLE%YeWbL=DEHR!u!Rwbudpbh9ta*4&>
MJ:8k4 =eEuW9>:%bm!V=thn$\wu\$9CjlJMwZl!nPJVe/puA*6/:M+NXiq&yyy1#E\GQ1uPPqHTd:TcD!BaCIS
yBTc51 IdTJ:hp=P@+Clp$pM*mQ:LZAH:j6Gc:uEXYCKl<?XGVn5<dLBYM$dha=j=R\Y9:uASk4a%<j#PieT>h^
1FKFt% #/jpNS:Ra+9i5cFHp@N%/nL=6qRl4eXA?A6yRm=a#X86q=Ab=XGCFD@iBTTpcdSd$dXeiZVL!MX4b6#+
X5u1yM */*5W5WFtkF:KeDCJj@XICl%>ib^ww/@y!b%^L#cGmpF^RkeI@1hc98w%b!5qtdE5GSlP@wjb^VCeGDk
lFP5n@ 8iwed+$P+N!<PPT>H9!kn$iXLEqFQH%1pDN=u$=t$w\::m1M?=DjZF^J@@hD^8&M%#<:46!u>/P?ph6j
BJWS>= jdVVT1wHNMt4lyp8FI#6>&F:e@9WZpEe!#lQ/X5Hn5VdXtblTpl=w1Lh>wdn8:+HlLc9#u<!mKk+M>&p
XeG$d< eR+!hJa<jN+jY+\H<I6IV9Zul?K+k@<iTD8Gw/=&:q=::5kuQ@c+DkNTQLA>E%@NM<+P4p*H/+1?5Q%E
JX<wV: R4*jQdP:c6Pj4W6%C4S@YL99J%Nn<&hh8W\lMQIVVp>?<4N<wHRj*>=<RatYbH%9XalY/!*dk/5uPn/T
-A%NEl 000975d9bf0001202b4 Page 400 of binaries2.zip
+K4<\9 !ESqYPLPnu$Ljq45R=bTtc=pMA&FKRq9nGQN!8%b&PqW:eEjKENyWH>tQyZqbIah1CC=AHhuMVdbVqdQ
Fq/wSZ 11ppi&:e:h^:<!u!8LS!dj$tK!%E+qt>4lVIWDw:SJ/>wpXLQhpnC%Z^%6AZhnpVpd5GWcnK9YAP&te^
Ia5RVW CuK#Jc1n^cwte=*l6e<9/@1/1ZpwV:HV&WLqtknbq5>pB<S*?6KQWjMYYm^\!+XWjiYKVIEwjdC5W99P
Gd:Tie @5X&m??>HKGCa%IdiAu%8&4e9lMjT@#!TJuJ?%^<pq^TwLbQ*d\c1EVn1W%5?&6$4@$MFcV&wwmNB*uG
5NP>!t wXKw>Q+u1K>@klLy^jb&LmN86EJq*HymT#EPP58/=j11tV+Ab64\Ce$/G8?+9u6J6PTm&VEaj9/CYDcE
l1#85l M&iFByGII=mw#uCZ$*8n5+9Sh?w*ack<P+e>bXt4dyMHTh$ZT*pwn4S9HPp8!L<^mEQpupq&aY=&G5#<
jW>6\W aQE+&@=lV/k:l@Q<\ZLtwankIRwn?5MqA?phuFtd85n#w5<jiF=tkYaD8e4uI:XVkda^wZ@eqF!iypZ%
m6:8K> ZSQPGwN=$@%?pS69=i4eBYAa5XbwwyqYWE/<aPqMNXGt^wCh9dPly@8%i?$mMq$>+w\15YShc=BWl5Kj
?&8>1: +&h+np#\+P&pX*PQ$j!$C1^yiAG&i*N5><\ti>TqbtGQ\IRV?uj6n1kpwpT\qCNbhb5668XY6\T?NZlj
?ElB<^ 4RDbVI+VDN?N!%!M&mW>CG%p1kDqyQbmnq*\PwmmaiwPSJ5<SY%iRSD+cNE4iN#<FL*t8Jnycu&eMkaV
SYbHhF M:q!ep#LnA<mN@9>!Bu@Q/j>?*h9ZNee%@V6Luu*uCn&%QKj1F+&:qiLYjN\!hJKdiWh8NDA+Y6>p^9>
hCw#j5 y\XB6im/5G:FA/jjE=\BI4PVA=*ic8V?\!&h4Z*\1bG*BBLi%I=@==i5tjdWY8=*P/PCB!^@Id1&Yc9?
y5YWAC WlT%Cchi9d%lc?CNl95i%9DQ:cibE!X@c9Z>i#m@TyTXd:6=k@=L6w:%w$\>h%jnNGdhBkkNcWRGDYai
5+ty@b kb>JWWH5wu*ML9#LKA<1?ZGun%B<8N4lat8c+qVAID<DZD>@M\inEBSNJDM4NhSetEQlHycRiwW?yjXn
?^/wZD L$m?9ZaaEwL:MVp<l^8K6#wlCEKj=8cm=h?qRjybZ=NH>L>?DA:@9b<bqDXKNEYa>h#u>Bumh@$A=e!A
X6\An\ *Sa4@lWXFT^^A5e#d\Sbiw%=4W8&uKNCL@<Dq9!N8VR/R==CBEdFRTSSJFYNY:\u^Fh%wp%^$\nYblFL
j?ay99 CkTGc5!^4H\jV*NY4J5i!&6CVt?:\96<<X#VGYZ4:@:wKu/$6adnnVRVdbDXPEI5pq?S<#Qt*YD?p9?B
GBK/Qe 6L+8%dEdHnKTPQ5Cu:ii$d4?u5ZQYDGeQ6acZ/Y?uq69<phW?IC*/E@@RctabEH%dWmKyq1KyK*4GMS8
G=%8#> 9a%K1yYa<X^<:wGcM\6Vy6LAuIFHQE9wMF85CFhM<k?I6wiWYJdC+%X1>b8KhNcKiiA9Ee=Y8bJ1!1qP
ECAquA y$\5#4CnHBNJ?*5iai*5Z#EM6nayB<FqQkd>*$5heLRc6PeLiM9I*=N?lm6Hue6u!bk6Q\Bk9+H1wJ9I
c^Lu%V jnGpn1mKl8HRcPV5KM%BIcA^5FRWtZ>d#j>uHc8$HBh$99T:p9#qXGyHGZchA^15k\/u*C5cDTnHKyli
ymT?yH %>MIwX>M*R@?tH\^RuuW<HLLD%><RR8tF?duMDT=ZamlW!%WLNy+MjAR/H^jyLe>51m!G$Wl4bytV8IE
+<Z&Gi C%4+W<iFV6EJpwpc=pue!@>Fpl*C/Zy=Vd!N1/IAqiD+tEP#B@1Dj1$ZM!LycWtK%KGPFb!VJ+VcNWBi
$K?k>I me4LLI5:H#*^#AT9cTM=!4N!TAjImp^dV^pj:cDV<HCyE8HJ<Yl!%D^Wa\8KjF8YS*SI>ZDCbZP&l5i1
F*M=pc YeaH=FGhtH%qe/lW^BE@%Bn=hZw$PydEA+59d9p1Qt1u6K9iW$&5/$F&TPKPK5Dqmtu/SF4T$bKQ=>E=
TmP^AW Fqep5l$6WLNYEYkM&:*n$4WpyiE\iN&auyDXhMY*=$NpqS/MqN^5H\ttSq/9hC\5epdyX!E8Jt^jtI*D
<^AN4w F<9!/@iVIjZ!8>wj:<lCJPlDetiI<:d55n+!88X&hGJ=KCnkmP5AJDQDlPjMdP4FKhiW+jh<J%9^NcZt
Z5LcR\ aY!b$y@GGZEAuDZSu$u+4A$I&VYZR?diqT>i%6Pa<\?ml?dB=ucHk/qGK&8VuThCJ^8n&kjq!N:6Ak=N
5$PCbe eQbhy=JTyV@9=^Fi>PLD\yFmVkl!<K%u?P@\ZVjc%=>X$9uQ>SX*+%Vu*K!5b9@EePjcLMVJ>W&Ib+&e
8RM>+K w9Ta&^8$@S!=bLX9>#K?4uD9ZQWNeNXB1*Bdq5h\KVpE:^F4q>L\@J:>Tm$iXXQhRV&6e@Z*C4u%?u^h
G%EXKW >6*uRQ$%tcR%\&41MdE4:KBHiX$\8e?Gj&I:^YYC\8bh55@t!&Hp%De:/=QuM$j:BeCLECkn=qH8$YSQ
ZqKyAP L$P*nm6u4KK9baHIqdbWZQS%kWN>*HtBn:ieRG<5hD@18LRFM?u>XZ^1B4ZC?TZD?Au?TYmbj>?+im!Q
i<kb6Q tc^h9cT+5/tYJe*GE!\?hiy+R:!A$!!$&aHWydR8dJ>8JphII%M6F\Vm>cEQAA^Anh\>w=Hel#9IKjVh
DN?PYR yN*K5M+eHD:H4EYaLA5&^mtXjcZapI/j1lu$::djBY+#\\/KbtJ5Zc\kb/D*$D8*=:1mRIqhL^d?+*Wc
+wn+ln >:W<@\b8nA<#9ci!u6Sw&CXLQAjB+PJp%D*?!=ap#%?Cea#64>R\:X+Ip8G:kH=Fp6hmKnDdmLG8::hm
L1AGNS t9ehM5:\ZL@1ieR4B?&VN1@cmQ9n%/XmSMW6E?5EXj5Z&T9iZ8KM<YR/BL#awn#^BwdB\?Da!%h^&\nE
AW+*S\ PhItYb/kTKeiwTeK*kd$PKuZ^n?QT%VM9>EXBaa=&<+JCpYmJM4SbT\SLX4MhQ6nqBQ+a/i6?T+lS*aQ
5@\NYF ub>X8N\<PZ#Q:1%1BeIM=N4#WZaWE/RiIlM&^CeaT5tTMa4JMcXXmeaumF@w:uP^Wh>NQdyHp?!LElI$
KWWK9? it%5mhFS+KEl=1Q<i>PHpFd&u^R=j6y:b&L\^TaDuJ=uL$6:&Q\KH<i9ht%$naYKb<l&C=Y@EDj6yHP:
MZawY* /T?wmE:EDQ/W8eW<t8b9=VE&?u::hup<p\>d9$WlQNHqE1<l>>/TKT:Tu>jD4FuVtPEF9+*uPL<PmQy&
N&5BjY Q1FVyVyyi!lh:*GVjwG9N%q^khVjYpT6CKISRaldM8Qkm?N/Kl8d?uiT8FFZANAHtHH?uR9*W!*<c!66
yEJ%V! y5\9CnaX4NH>HM!>NYLp4hI#CLa!E&q=j=994EX*tk>45mH%6?H%NdJ=HthYE4N#t<J#Et1%Bt^9:NJ8
uXB?Kc \4cGWt6\@L6tQtJ\!<^$E%L>qdSFGa?9*W+XS6!K\Fhw&bW#F15SPmFh:jmh$iD<6jD\$NQlR?YaNq<i
\\J5$/ Nb=SD#Qw&q&pe5b!QHF=/X@bIjFneTJCwMcmK:^cGi4D6h<4D4HN$<T$j:m#p*ie?WZd:1>FwT9e8II1
TTP%eT =Py9%Z4PYi&>b:>ud!p\8Gbu6$+R&A4<KJp69ku:+=\#lb1$*Rk:%TX@Y6XmMj5PFZW$kGJiHLHVeQSV
M*<qIb :\Y9WC!#/aTA!\nG4nYnpdh\@j4=&kwyu!FHI*c1XFMQa>=dP%pnZ1@%QSLkZb^<kcl%ciIWwb6ebmqD
B!\DNd >c8W41KiHjwdAJcyJMIPBDb/?VJjad\Yt8G:e8H/9FceCMhm>8y<KN4dhJ=jPj16qGnBN$*cTJ%QdZYR
m$@#M= T<C*lAyWkn&#$MG#ZY6YaHSpJ5^ic$n$Hic?G>bk\qeA6H48p4jGIiS?\Z^bJGe@?\5T6?TZS=C+yntu
TXk4** Y9wRpVNP8n:JqyMXKb?V@B9n5Dd>u#X5nYc*CXD*qwdVR$RaYQwaAp$G=5?XCSV*SCh#CF@mRlL$%!#u
^\9VI> jF/Xk4PR6mG@JM\H4WchcS=V*R8@9p6c=KYmwwR$&%@5d\^\n@+bbnuhW5SmDj#<=#/RApNyL%M@P\\k
P:cGj* ?y<qGR!TTL%9/B?SCan\PV1P/J<wjyWpAbn6\tlulI6Lya$RlECi#lFKXk#A6:<@Gebw5*+iWm4hbCpc
/<F6Du E4kj5QQ%Iw?dIqyWykY>wuu\l6JtiCJG8YduR$tJM+c4hwlQI9!k*XC%P#\eBFt:XZ=^CI>RIBGQeNb1
VmpcuR $wP@<ywacT^1c:*EddXXSdNj!lqG1w4/e1e>^j>ulWEi4KjepPZ\$9jmqW:!aMm4@V&nKMTF!anZLXL$
pB\/qe HYhn!>JQh9@RkT\hq<dH46SI>%LDuP+9I^CJ>1^#$8h$cLM!HL=9ARijkBiZ:VKkkuqd&me9F&P8Z$GB
>l!=c& S1HYcHaA%8e9yVXXPEdS\<MVSCwXm=TBwtRACJi1<AMmeBlbQ+CFSTBAcR+ClIDFa6DVF+JCK8AQASYG
d\+#w@ Rcukd!kCm+ZPwFFLLl!BkcWSb+RJHaFD?1G&H$+GnbFFRKWHHBP!5AkYK=Yale8qi#5BEmRDq+4G$6D6
M+49S+ u\ABk=GK^takMPIQCj*bTXQRuc5MAeLAp6JR/BFG^MJuaVM\/S:^V+BESE1t?b#hF!KDk5bnyPG\A%pE
5yt^E? m+RubPBZGwAJBa%B^mKpEhSDJ5\6IJBF^RkNF+>NFRDjCiXe9>dub$n&=<8/FmwENEa1FtteaBAInXSJ
m*yB$k I$+wKF\GnWlBETKw5LAIDmM%tWFL\&@E5DheGwYW^6@TH\wSJbtBNNeRKkTLtEWnhtePCkcFmMhAaX9+
HC!:ZB K^RCqycB\+kl1DAama!FScGuD^wBm>RkX!kWkWlDIShEFabFR^N:dARXkWXKGpeYYBmPS1yl$6*VD+iY
W?HpIa VCRRB>+HnaNG<?FBaakMB1XA:HbkPB1ilmN<tFF@MB!ySG^9Q\mDp5cRVARpk+EqwJA4DI*B1%DECy:c
Zpa+jd B+?\*TRFNptq$N?M>yn$F*9=^y!+WXN%:$E\hpC8@n91A#>cKdpIP1C><ini#<ti^%DZWX<+pNW#\+G*
nMAt#8 !BpB/Xnn!We8@SV&m664#8HBChY@\adbBKGa!Ink/nRQ&Wj&jt#Bl^^nq&jMtuX%1d8Cht?IPVkS9:eP
qCyC>! ^wiA<WhD%XciR\M8cC61H=%Y9:CJMmFGFR!#!&lP>h5m^$p#*Wu:a1umXqe5:%mm&6K&<KLMXdwWjjHG
j4$niC *qbcmj!?$jHC/RM?$%6>I9^lyy6?w=^u/GGqZb*eDH4a5P*qb6Bq\HbWlc$6b\jlA6=QYn@Q/A^tS6WH
K<l@u8 M!/K+Hp=&PJBcc\&bw&uBj+8n@CVT%*H@y>@NwWm@k:1I4/mGbcZD1#+qFc!VV&pK4&hbF5E48RDq:=&
c+%Zq: %9BQ=>9Eh4Z!hc45eERn5&b:wAZ>SPDGBnLG^GFb4%$LwGj1alkjKK^NX5:$G1+bL:HXb+JSD^mIJnGm
HyaH>J 8D5%5<:>c^qRX51A6W+W@46L1BM=XmJX#DD4JI+%pJ*Zh?t8YH>#EG^!1j+Fa81*bH:cFlK/uLH=98Xj
yD\b?? yZFp>aS=I\e^+=9^WTCkthS>\kMJM1DP^DIQ:A!bm?cNq?M:ky&MR:XkY!ZiV$dh*bPWX5TuQP!*S8Qp
9*DRWu +B9=REl^kemLEIbKA>e:hJ==V9+IZS<Z^6w*^%:F:/%8B49m1AlMR@9B@Y1Y?ZaDPc9c:6pBS<8$<tJV
yFQ6!N 1q/$9WjNtbF1\I/hNj9jXyj?c$nwS<!=YCK4CG:BSJnen5EKkbMC#>F#9199:LmY\WW$IhAV+#Qua/tL
q%DNeB /&qCKd>=VnnaGJ%mj=tK+#WkMM@c9%Yn?hu&Z:hIdJiIiT\beJu^hRGuE4%T=4aT!nd$P/\Y:wmLb@>+
-AbF9Q 0007992366e001202b4 Page 401 of binaries2.zip
MHn4lS lcRTV%uktWj<cX^CaN5N8BH:hepZi<:WcbQLeN<b9yw>^#NVlbN%<:LXbEWEedwqwBjqKcLX9/#/L+@=
dT9GcH y8\?h$XP:j^:bqNEuhY\R6I:Fkucm4Mk:8^q$Vj1mX94IL9j4P$&X%SuQZ?9c+na$&hPCI4@huwWXE^w
wat4k$ mH@4/p8k1q/bkSG5cj&yZ%uN=A&?cEE\w/JKH@@VHNtM@iS<Py6@$hjZ/EL8NDn?:BL$>C9^:Dl*+^Gh
c9F=NX awNX5cCA9l<ZwKLYijCnQCajpBLh6&Hb#DB#=qI#myPQQjX65:JPy@maphQ@+6:1n^SK4Dyd<j^1ij^c
n!B8C! k>:tJ9T8TYD*4!/RPi5QMYG\R6:=hIp^i4*&nE4NePPjE4tV/t$@i8bqHHF&h9^k?\6LYXjR8wPk+9?i
k$FjS< JW1G?Hb9w\%NtFjKP#*D#VZ\1MR99Xp?5&y%h4$WH8Iu\PT=M6t4V5WlTqCcQVW>SHPdy&WBK1H>8ce8
Fa*##T Nl@dn16Ft\wPJ>N@8l6jK@i9Cit%uii#>84q*wCwReiF:m@<%dR4qRnDAwpuYV<<6*P^=\cG8!QMGYC$
@?6QyY N!Np@>ZNHH6EP=Y%W:RPHtp9NGWWmqBGjQ#MWR+?/!ah$\Q4@i8GJ@X$naLbi@=K?=&1uhR?\LnJ$tBW
Y<imM\ ?45nlL#G<^eLbc:J$e#KH<ePP5$l<9#=/$^F>L6j^i>5umI&ylhmCMYi<@F*>4hZHV*pjKqXakLHMI6^
Du^wa> jy^$K5p65!m^\dNVEVCC$pV?dY\p#6kMnaB8S<BQp$n69E#GhQ/Mq1w$Fc1nHjXui=<5WP/CJ!aqQ+>y
DGdEk= KY=$/&&X>Da8ihq%wK?ab!5l!J<&XIp:ydSl4HmjT<<TTLCKyHTNaenpH%1W1?Vk&LAH/c&aG&45q=VP
M=X\hc !VE&&n!/H8lB8cMaC4RHXalNX@tuE>Rm6Nb@9^iStwG!1d>%6T:PL<+db4cwK%k#X8HX%ni$Yu&ACYYm
pVE6=k cyDaSHa6J=Rh+wCW?R5jZL\i84S$ji@!M/6:#HYKe&@4^%heEYlwDLiAAXw#c+Xj?Re/kL^dH$1dFKe+
G^4m8u i#&Q=MHhqEB#*\WDL/@:Im6XBCVbpFhVBm>KGhp#e?Gy1JiT6?C&Hykq41!XF+?T19Xj>F+XHj/4V4!N
iDn#*? m?p@>XLuPiY%B%ACeh6PJQmG4NXkL8iul4@94m@*19&D!BelRFyFNPCH@WeeLeI#dbE1pk&#pFWeqG$<
/1qtI@ 9y:qtQmmd9Jd1kpW9LFF=hNXZweY1ICjP$dTRqqK*hdl%VHA9eZ5L4*wW%LlF8&%@hjnEYK:/89i^dj5
8\dwW8 t@=CbmLS=+AGhn&EPG>+W=5DCCtH$lZu+MucJQQJp6m5J&htN<diM8Q1MPeR:FRwe1#:9nli:p1dtqhu
IHV^@P V^nVimG#Mll8@V+pc9^+wRPe::*Feh<=J:c<:Aq>:/>p5w51iwdDCpITN<<#mL>nBIShJNIpW6ui%!ya
dKYD8n jbp?=QtdWEpb\Fa&*XmZ%>h19pZ<:u^>wwSJL<a<Cpt!<mI/PZ@y@ujIp+SpYF4j=Xq1YN1^Vp/w8>BF
>>b=LF /8*dM9i@*EF*1m/lKL!KFcimN*/65/DY?d?+*!VHXdQ!dZG>LAqdmN?4py8L6t6*=j@qH<+?tp4&E%P8
FLSPD# <KaIhDSwq%4dL9d6/+dqa1ZI>5E=?XWMe%8Bkt5#nbi!+^%@M8*Kwp9hculN#4EPlJE$&uXGG5>84#4H
C&nBha :kQ6</K&i5PeEd^ey4Tlblh8$\6Vj<uhKwS&#Hd@PGb@FiWE!:?Z!Kaa?eW>eieN:kh1hQqq5QyH<nH<
ByWJTb pnYmMM>ySF^RjF#5:IIu\9h&Z=mLSSp^86@MeHTh@bb@NbTt4XZ8*AAc$n$:&88WjS#yBSW@WRua&Zj/
nAnyG& +6m>GeV^N/yRYeekBNGHW>^<XP&=LWj#9P\%&=5+aRdQuC?w+T^TSt8M<X?t>QlCLa=1<RC>=\nKF!1K
*a6%RF Xk:4M\aSBH6cF/#k#Y>QL%Lj:&PL^N/!wY>8dXA#DhKk86/LTbbPS1K!\5:+C/d%wP=Ly8kM#5MLAV%d
?1AT8% bM?pYTEkMQ8#+yL5?JpGXkh&<cCn$w#e^9LNu66=ZV%$BhJ^caH5!/jjQhh*Vhd%:SqV#Ye?yb&dhRnj
<5Q*8: >yIi>>nlF1?ycP1+lbVi&X:LN$JR>^&Lp:=RGa+IWJqi+ZuH@YK\RHKP:&+#@4=Z&ib9j&*/l/^MZIEj
GYZiGC E%HH6i!Sk1kl@+hpp#:<LLw\ul=FkSN+WS8<=68BWFjAAjhi*Zhn*tX:l#i\<LTZMhbPEb/?@ZSJ8tKj
jWZK6a lS>?j@d1?b:P55ket$=mb>nlF$*8!1jebm$R+Ip6M\h&K*T/DTB8L@i1qJJEa&yitNH!?6%4<>\auEIb
L9nZR? T!eiL+?D+D$Xqi5hp&Vn%&ItTFH8d#Y#w?u6=^SDpmw!Zmb??%$PX459w6&EJ9k%W859MHyw!@/&y6@w
cy!MZ/ n4E#CFFT&NI@FK6aVe!&bc%4Gc+!pX1e?nHNVwReR1/8q@VHwPjd5wpjRmpMjqjYXWE\6L%yneJMFciV
\e+9eh y9F*N<JIJS4*yC+qm:tjp/d>eyJ:\y%VSp6QZ\ldYAMS/*>diN6h4le/i5#N!&mui5?>J&TVk1XnYh!W
j8b:6R a9%m>4ik=t4%PZZL9mh6Xh?Z!J8&<#:8=QSY==u+$b\%^jEhDbJ&w4m+M+Lhh!F9ThYQ@SXFHF@^Hu9@
%i@W\4 @b=TJNLMWK5NN^AnDC=d%iAZ5X4Z>::9!Pm\nD#jIQ6>XmP\HZ:=m+Vl!qT1\JZ1F5LqumP\@m6*Rth&
*Qa*AZ IuweE$AZeK+L+%IS\T+<JAFbeLeGaZqQp$YPWGcTR@K>SHalB^9/t4ElP%qVRGGtiqm6K#X:@dS>a9Gt
n@MEY> /B5Thm4u>9D#pFFWhq!@=AppLt/XKN+1!M$Phb?TSM@c*MicXEy+##d+idmQBH8BdCiqPQVCFkyiF<9J
FNapYF P+!JZN19M@X\wYJV9CuS9VKD4u=*#a?=*alq=XHk%F%bq!e^=l!RIiw1iLeIpR#&l/FtWZB#B*==$HF=
P+qc<Y dTwq<F$%:+?bHc@6<F<H!NFi$Q1+InS6D>b8:b=AcInLEwFu>uqSZW*pqn5L+=5EabZ6K&p?QiIy<iLb
GbFaP% 89d8d=wV*tj5L<9nk:=yXVJlQuwDIDne4/<IXuKn%!w*#e/t:tk1C%q@@/ZSySad:RaTRuqFEudq965F
dhRkue %Ycd1akFiSFIMB%\VXQaSNXYFAV5t*kpYhRPRa4wQNQ?Ny88Hnwitk@SIu4YaNIZqNITKhP?5y&cd\@L
V!lkND SK>/DQE&mGjWi%Sk^JK/iDeM!QZhL&mF*+KWwanAA+S4cHFG#+jBKq=WFFyC?1!EiuMuHwWcyI=DcZG*
a6bAhi Fu<##Xj:AdL*mi@udVM+FX\h@JEHqI/Dq&&6qBtX>ZcTA^!tWnWt<t&hJN=ae=kTKV%kmMXNGM6##YF@
$q!y#^ E<R$i:/$mFj>J6c/duj@5/P/Zjy^h5hKQ8kjX#P1<lDFM#b>FZuTA#=cT?n9NDDHm!k*R@JZjZ#4/GdF
H!I6yX %VECMiaKi!VF/A:MC=iS^>wRElVRJqPZRhuIbIQuBK!bB4$%VB>EBdt+4=BACM\byXJVa:u*IXGua+dY
+aXRH1 W+i%%!Hu=8?K#iVPY/@NR<mwY/<qaLTDa\+aB$!jF!\K>!RayBh8E4*Y+n\j+/@j1Q#L6?@C1nCFhaFp
$S4a%m E5m!TptN%\SLm=BK%YHc*>4c&uKPFGhK%h*hZYm%&>yckjVtk8Z5W*PQ&enBW=Q<9M?@H4u:QC?ek*j=
QyPdte adu59\><>T46@195j>GPZN!Zpt@&\^8X#+9#*?^1#9A\WMH/JEy1VaXk!X&\*N!F%5VK&q@G8p#68S*l
nWAelS \$:Paq54FhBh5FV:\+c6R1G68$9qdFJuQejV51@bqQBK/>Dltiqj>m6c>9WDmcqP*@:IX$RKjpRPQV4J
P#Mi=p qQAM%Hpqw&9N8t5>/6L//HGpyk6:@9udh\yFYlYC4D/%I/BNqQcP5p4q6NZ1$Z^umhKS&8RX4ZXdY/H4
9TmMXC l%?N>+LXbWCdRE%<k8RFtEJdF!86I/ZJyIWNBK$LpK&Q9u@#T:4:AFKpFtNeEFJwp&!K5:&#iZjM?5w@
Gbk^uZ #cE5Z?k5Z^Su>m9u:Y^@TjN%6hl/W<85E+j9T>F#&<PQec6&@Qd<j>>*!XSwRQVik+Y&MJ$6ml<&KlBP
qIaCQK n4Z%Q/N1bZX^dP=C$J1#8LC^5VXjYZX^AVy5Huj:8*LN+i9=+=DE<^HH<^H4%@kYR?R4$enl6tVEkAjm
?E/XK^ kB^5/$SKiL#yV46dNwymwNpQt=D5$<Q%Ry9RShtBL?Cq&4ucbCC$\qm4p<VK1tPy%R?6tS8jMN6ccF?i
H8FMCA 1/%LpNTY5?:&6Q\V=5G8>8p\ljhV?S@iA@Q%k%u&C&j1dNAYM#dqGIei#N#&KBh?Xn4lXNd:K\BB:Wmy
:6l*&: JWy1Bb@iBP&^pJRN1@JiKKtybNGFIKt?Fch6/>MLRuX*5WKdm$Cqy5+Qd/LWyjXXcLXd5Tw*CEa?Qu=/
q1NjVh />Q86diJnmt#$!@bDd+H96B^&aEb+=?jJm#*4<iQD@H@KR$k!4GBV*i#cq>585j9q9<$b?u>NCwB&y+B
8WHSS& $c#$ajKA>l?P/6KA:kY4nwD$Q4yZJkRyC^5\u#eSthV1<?j6c858yddc11$86WJ4jZIS>hq@NF<bc@*6
W<Fhwp m8M><LL>\@j:Th:dK+dd@#=B<&#96!L#ddPQM9byh5>dt*&Yp9jy>e8nMp!hYM1Ha6L=MmBVwP4H*c89
>HLScC \lRbJW$/Z@W@+^5dBBhS:8/j$XAcXt4?mMD6l+t*>I<:h+u4h11:j1yuK9m@&<Zp>1yhZ8QtP!jJS%Aj
kmKE&R dAk8\YpCFYpC%a:aeNwSXGhZQ$LXKFbwh^t/6IC\?6!K%dmBwK*8@9^q:k%%>>j!ynp^/8NV6p>w<Qtt
/Fy@WK >!N@/61:@6=Q1P<KB<w\I*X5bGEJI6FCItEaqBJ^+j>ndAVebBljSTV&kmVm!EZCMA*4KD?FpW@bnBD6
twaX^: &e!:@>u<HHpujk1\Te8i\SqB\V6*uGXTQ<FbL1EYY#Bkmen^*&&NIJqWRC?lE6<A5pTRWa86JNQ&aqnS
qC$>DE >1L>14a=KytaRG>9K5t\w8^STpW=l9^M8CabL1PYqRCk6GRZ?wEBTGBaMX8XdEm\pJnPCkJSn5:m&PbT
1Cmt6T TBJ&lBHIVH<1J@nRaQu%W@uY&D$k6q%?Zw@/>&YDXRFFkDKCkaAkXDApleDD>K@W!LBHRSdSa?dp4=V<
Bhe^Zi *qA>8AYh&6yqZ<YCE=/<w+i@\4XmeN4IqcTK*$#H6St=wk*kCwthlj1mTRn?pHkSLk&GCa:u$/h<yVCG
QwA%i* @8</Jl=VWLVpw>kk+1\+SW5\Vc9MS5$yPA94c<NZJ=+<E<6e>lRZG+MPTl?F5&AY9Zm?QDhluDt^8Q5R
Wa&WlY E^pp@1pQRdkP4!pNp>>hpbBCLwGd8H@+iNbb\qWan%tTKHy+8Sp\=/9nSY:pVQbc6?MtnMeWM5ieJ>^t
<R8J^i 6D/Z!#mBYjiXYm:llVkZD6>ZZJIIk%llELHw6SnqQN\!q?K+9yYDSXqI*?\WV4D%b/ePTmWp#J!\4%+S
l9k\Mj uK6j159$4:a*k\<Zp8PF@/Ra\eNMH:QjpV*juJGtEqnM<p$5Rlk+p^a$+\6j^ZdQTb4&Z=q<#GmJMR9t
\l?HL/ Ed+dhZlFa?W8T4?=y>kkkHPYlj>m+W+1ZBRWW>SZG@!q@i?it+TAC4>MT&cpkYY?^HQ5JSI&kNLyG:ul
Ec&yAW S<AiLtH/XcdnZqy:c4EBj%JRyt&mAJc&jISR@uHZ@W@:a+bl%@:ESd5QS$CGK+KQ4<Huq$>dZclyaYM/
ibN+GF 9^XaZcdW:P+8YPtnP@NBG\SLW4ucdZ=kaQKZ/G\RW^BF/G^RF&Bk+Bm+eYBNZ!DkTeHA\B^mXV$q#IC1
-Adl8V 000bc9de242001202b4 Page 402 of binaries2.zip
F#jm:$ ImIAD9MHDu/aq84*9bPW&:paqZ#Mnm+$5M##<<#n#V<l&*IQHJFyq&KE&%iQ*4kTuZknA9^Ehy!EWT<X
jTDMFp b1!!uL6Sk:8PZc/Sk#VR4++6/*ceF=Gb*u^jJuDy*=q4B*eFa94\I@>bSKp@GV8&@GphNPaZePVHjK*6
yI#qu? /D#@c>@t5*d^^$jeXuq\9$PGIj**a*qaqPRaZ5dJD%Cqu58Vt95*ZaTFNy:%R*PG%hVDH\e=&JqqqbdH
+4k?EC tX#^H^KqA5EyHE^4ZY+F1MY/iJ#k<BCtA!Q+w#S5X^^b#>BaN?%QBuj?D1/QE/!8M1\1HZRB9lD/8kAZ
\X841q 5bF@@Qp59yjKteni^5Eh!Z%cDuNJ&%ZFBH=1dtiIQATQR\wIp^h$BH?^pd*Cd$Li%=K*K<eeF9e:R4+q
YAY5/J Z!#>:Xn>>@etyGGK^nLn%>J*=!46@*4c>B9GG6<8*h1BN!GdX+5SQbqPj#1&K>qn+&?V*>@c>G#C@y9Y
JuYTI? tp*nXS4eMh?uh&K*hFF$:99JmphJVk!4ZXpYc/I!uhb^j65lCt8=XHRw#aa+J=kVWd=m#+VmM@cqZ4lt
CElHhL FS:iu464!Vp%a%mhFW<ic6^T91@hNMMCN\9154>qt9K:Fw+SGI$=IGS6::%i8Bcy^tDHKD6a%ay86G\V
T66Gb: Kwe&5nFNB#Ky4$ZJRXVKRbRLa5Ml$uH5>M\<?ctY>mic\91yIGR9^E\yb#4Y:pALqIHVI1>tuEchX@dl
nKiF/R $WE4@%\@uV@WeXNX<Qm+^B!^yw4465$ip=BIPmEutFA/8C84p>G95&:qlCW4y^K*h:ChqcZD?b#^t%SR
h?a5#> /VSWM?WKwR^K^LX$eQ9edLiK5e<lP/dFKTb&q<kF>Q6tjkiH9E=e=<e8iZRPw@T>^6$?qn\CN@IALWI5
Z+<<iC Nn>/cmn#?5t55B%h^uD8@H+jn^ky*VwN6qKuHbCd$qp=^T>e=cL8J>mH+iB%PbQj/qCEIby$n^:DVkFl
IKJc!E /9VKb#^dWZ?qK^wn&m*\bdT:qaJIK^EI/9YnjPqPIkh?m6cTa/tN!jbQlh>lq^H/1dS:V1JMX?dRXa/t
19bSjq 1t8uPN\Mt&cul+TW^%t=@eaNkn@M@/aV>tMH>\mTFKt1C<#W>c<WL$cF*SYMAL/iE>nwdWVZ5d\>nB!h
B@TX\w VJEhNdd/C4RpBH6+i6mACHR^NlwPpaZpS<6@mK5pIJXPTLLM<a*HLbTPnI!4JAmEh5JTmm?JL<L8yl1/
96JMZW mZ5WQl8DqV+MI8An^%:CatF18i>jGMH!pXN8&Q&1PPbaX+wut/V*C%w&D@B?lh!@SJ^p^KqJDc&MkW/C
:K1pS# KRGL@?YTlhukJ%uaei1lew%&TJEpeSw*yX9D$JayBq5<Y^k9RRQqNZCANW8F#w@CpXyl^bNiM+WEh6$^
L>uZ*: 4=pVu5YpQh=k^NMSLQhHil*ZTEyBV\K#NyG<#B>!FWiP8WmVNR6/D@<!eteIElIGlu&VVAZ%4S8TJV9C
Q9Z>@c cLu$MIZKjqIqX#II/9Et46hIWkj@lMMkXPZ%LIlRRVIw/lp+mnW/Mhpi6ueCe#k!9qDB4/&8w@yZB*dc
NCZ+d= ciVTmLF@lL*qm\mQleJ%@$<<JeSNGXp$N$CN=%YJKAymk%@$aFS!@hZ\q%??Yd=V*9qlJ/d=:/P//^9j
:1GQ%Z :6#Fh^9&9@%$MCVbMbhQQ%MMHk1/6M4pcq>#1q6n\NbnET!C98ap^$k+IPVV#ATHubGHY=6LYhSmKkjL
hGD%%/ !mNbmyTBdN<qHCKnE<\XIwaWi6H+14Jwpqyw/TSK6kTMaN?aKGWtC\^MBVSMb>?w=5Bcm^twXIiy5ChE
<Vb\Ll l5NQGMt?nqH?R:&ZuP%AmKNF&l9BL#YFX8nlKkSn/N=/*XXCt5%=VewA%X@TqI#lKdQm#Z\6bGSLamFE
KVK/bN QIG!L#<qaETJG#9FGWXnHJK/h9D<kqtPQaYubJ9eN^D/q1e6mpWMcj&F=dCIWhtpA/N%H+6ap:4h!KVX
u6e@h^ k@\GPX>XdXlnAFduY1R5!JnCIk=dI=uyh>t&lT!L^jTkdMY@1/Se$$kwZ*d9mH8yEFPqCJEnXCTFywj8
qVjRjp 58N*utSLSXY==!bujaqE&1RunnlX+4kVBpa\NcE6=J#Xcit/54$/Pd>B>aD^J*8*5w5Ww!pDETtqFKF6
D8/i@& /TJ\S>E>H?W!bQa5\%FMR\qAXZ?d6E8yIQabDXRRQ<iJ*<JNHeeNSVp6Gw:j1aW&+X?a/+KdXa^CF&kb
m!+ulE C<RC%4I4J*6llD6BRqY4>C1D:MLEa%GNQ!pbAd%dl9SNbaG<nFBqbaEi$GDBK*EX!MCkTEl$qCw^5!Y6
!i^!Wq E%YWlD+um8yG6#kw&:B4Vw\G*/qRJqSH94>?e@*%MDBAp<FH>1Wi&F*Xu$bdn/NkV%kC?84Q<9NhNQj+
!%jKD< CHF\l@aTh>$K>/k1b<JeddF$GZujII?YSDuP&q9+wVBm9V!?yk?4BSiKMAj5AZbYtTFP=GNR=FMbpBh<
W:^jb* :=!:8$1XDGAKijJ^VY\A%!%Y#C*&Q<nH8>p9<YeaWXJ=6Qye:X%4hHA8*ZDecp+^>R8@1C+4FAKNA=aD
yEXZSX MTE8myH+jB?h:Aj@Yjbii%>mcaDNTX6bMiM1KNa*p1n$^#CQZyS#?X/NH:y#keL6pXN<aE^8HpI&=&#W
C4biyG YDS<RcpuN\+^KkWIp/kqjyN<Ru&JdG!5AA+8IJDnE#k=Pdp?kQ5D&D/AqbZ%p:G#5:MBQkW&Vt+&Fk=Y
Ya@c8W Lk=&IIAN!QtBH^P=kAA8IB5ZpJWL!MIFAHB?EIAd\MdN#5*P\e$P@PT5*P^54B@cYNn?K>!e4C\j?Aue
WeAIB@ 4K^Ahk=YAQ8HJSa&LndAy/XQpj*@AVb&Lt+AK#iAA<kK?DDM#k4k@Fn^=*BY>w>X5:ACPXmB*EAkpA*A
j^16=S \e*G<hFm=jk\AYVq+AB\ekA+AK^AV9aQ^5uKDtAHeHJ?#Q$\<LEthm=&ABeuF!8Rm^*+wbcX@WMnG<iH
:EA^:W n/\AN5:@uQ<jjYnt@I#GB\GAdB@GQt1&n!tj/&DuaAP\jF\Cj5\DjITIC<n=&RFk+?D?XQLB&V<mAGAB
+:4FqW eH=+A9mQAJ#e@<*@MQESe#a&BXaARKEyuAXQYp1TE$E$u#W$b>mWF$G/WEmFNMISYyDW%aPLHy/:F\t1
!=?wbD ^bE+Xc5!BVEP#:!?ZamFe?%NPmW\R*\IRA@uX^wJ4iuRcEW#d5/!8k@1R?^$\KKySJAKL4Qu6ISLEm^<
+u?><y LSEJ<1nHQh6$WcABCA+4WDSIu@/dkbFeXmB6pE?R+ikBL%EANJBbtIInW&Tk=i!DkTCS$MFSw4C+PQ5N
B4Hm^R Sjl\8wY&VHH:FG1eCL5hGKB+RI\$e%mSeeMKdI&!^8HJXchGZHHjb:?h6NchC6kR=IjjXy!^ue>X*LL*
!N!+JF E6qkme:&ZcF6#RkyuZXlR:NkmiCEwJ$l#A/n%XmCI>lm4RImh%*eBhdb?^^mW/Bkbq/H5XBb=6RY@TY*
?w>Ji\ 4E:Giy\qCK58??18&?Qd*wDn%&iQe$KJWA!EW:WMHbm>:Nd!*$RJqKMaHFJApCcIuEI>Fc9A@uuAmwl/
q>QjV^ 4R:!>+d/%$A^l5y$Y8bCq@S#cZ:J5ijd+N#$?ah9#M/$#QVdHbpT\bbCFT?%%STuq9X>TEdbR5ycQu!D
$Je6up :H:K<Ek89I+E\k>E#p1L8?Nw?L*CPZ?\4I$:!85*wbuX4w\IX@+!F6^Cw<qYB%W@dBLcq>>q$web+Rww
hWyhZ# 5Qbh?!B#>G5k8iH%!5Ibw!lk/dEENJW1PF46ICRNn>a>y1FlMcS&%J85iVa=yBm*?QJLq/H\mc48d+5A
Yap!F\ <KicK:nnJ:iq5dBpuK+MPc%m5^ytB#C6lZ>b8CqdESVuDy6t6C+G@+lbNSVi#>YpT&y8Eu4^nbP$%I/t
Zpdy!Q pkYZ8ihNuJ=kAQyI##PCJ+PARhI?N6MMc+wG>T4wyeIPYGR++1<b<#lD*lYY1AK64+1RDw<5y#@&+%:=
MmXqV* G#T=<^nmm1iTKa4MF*NM&:ZqWjT!knMZi4wQ:ceNGm!9dQibZY/n9\CE=8#=t<?$:6++Z?m4t?&kmZyq
j^u6j\ 5NS<wyaCSVTDCAup!PL:tQV9diG4N*wc8BpBZyV1WKi^DBayGuS$8lQiQJT\Fu1n@9hKqJ/66Ga@QPY9
?Eipmp qMW6+AXwqIWYFVC\j>kb+Be6\ARF$9%#A:&6kSW6I@eEdLwd=QT*\+S/CNbG\+D6NjC/$t!qGVE:SPMV
ayk8@a B*:6DM:pwkYEqyE$Z9XHK?^\8hEpp^W*eI*q=MQb5mR%$h^AVia+:4yZk8H%H4B=GJZFY4J5bBa1Q!aV
</w%TR :QVcBIeJ@Rc5+18Z4$bNlBEIq8VDLT5tWy1eHde%HY\VkLFEVB^hDVW\PT=B:IVA1:cKBdhGacjlR1MV
*5aJBP c<H$5%pwSIXXX%le4aaK&+AaFVe1<RttSpRCDR&cFBq*?JHV6L>:^8YpFmYLLcc!$Sn$NHAWRQj?*d#=
iD+q4a LnACDp/:+?$ZtE/9pH8EXcKBFJ8Zn5m=B$IePt1pujwt?N*GTPnL4?I9lC<peXbG:NqH<:qyL#Y1CDNV
cw\$LF Hei4T:Qk11ta&ESV<JFXTd$k@YEHLyu:PQm9eX+\BReM4LT%yKbKc=^dB@/nn$MMK9*L:GMDkSL*XkT1
hAWS!9 :KFPF5jI^ae5!NlBTt+XDHE%B%5*^m?8Ti!&DSN#>JIc8*/SeTdn$8!9^IwSb:w8!I<R<^dqBc>WjE\\
%M8luH AY&nKB9H^y=J4mmEa@CDb4m<F5YwnkwqIlJ@TeGARwLLYHWkVc1Md&u1F:KBjA96CNk:i84Dpn@XC4EB
5uI4Pw 6ASndH8Q#@NcTkP$Y58q$nc6YV#HZCa1yup5b%m1@S*1YR5G!4HwEDXYbTWVnJaXbS$GBJ^eXaw=:p:D
@MMB&W eqEBaWAFDW$mK4Dy=CZLcqJeSCHP9eT@YuZVEYMCAK&eq9:W*!&>K#MH=wId&RGDRjH^pyS<FhnmGG5t
VRqXG& WyXq!tb8P*QNCtdIS>K>NDpHWJP+edI$5VRwS&Eehi1p%T9cTaEYapMWmc9q5jYG/6EDyF>hZ=>TZ6Lc
k:n+y6 /y+S/jy%Iuc\I#9a!V!dTI*&b<bmj:k*#I=dCXI84Za*IDLEVRm>YebR\aIc1dc!p$t8TXn%e&8A5Sym
<S45W8 Ew5JJ\Lq+?XkHW%=+&ckAXJXul:ThLnY6Gp8AiWBKYu*>a1$BZN4PCtTRJjXMH%ZG!jt??dBBk!@yHy:
Db%Tb^ c!yXFGaX#Nkc#WbYyM*Y9nBbW9n:GZ=8thyqGE*qFb<k\VDQRBqK!8LaRjll*MRa1pEhT&GEJuW/LHLX
*X%*:$ BcRP>FEIWieV:c?<p8uCQ:ANK9AFB%>i6P&DFeu:4=5^<KX%>\YAa&I1MdnNG<kY*46$>Wt>iVmN@neT
CpXIj4 RLE$$Q9^Hdhb^ykSZi%CJe*jZu<n8Ww>kq@C&G1hI@4%T5P\M$\t=$+nCm:ZMNX#SGt/dmEaECD%TB\Q
M:6ZqZ 1<ZP4n4nnBt^@mT&K^9H1!B64Xb=N9R%TZLASAA:46qA^<Pji554t5\GWEq?W%hGR>9dB8&9REtLud66
Sdc1MT dIeeGIWPKZc!q4^q>qkNJh#>?mH/1pb&uWJlXQ+Vyk#n51IFC*qBGuZe&k1:4F1!?6C9WeXISp$^9^8*
:4SMeP mM+uBjFKp>DKeNBjTW*GW>qQR9cQ<&1N@:c<KKjT!DZ:<^a*!hRt^AepYA+&1V&>p<lY?8Rta4IwiDd1
^b%i%8 %XRq64y\B6&Wqk$Hckp$TbHhN6:4LP+9dPkjTSK^tiQYET\&l$w+=?9W$!LyMcEi%+H4Pluw4n9h:Bcq
$Th1tp @P8XZ4Elty=dFyHnJqwBP9pXLJ\qd!LNtTelb<Y8kpbtD@SpbGT/nZBt@?lTmCdMCni^NeX1?e*b<ZI>
9J\HXp 6VAYII*DYAEMH=1>J8mMZdc:89ealk?yE/GHLRRdnK4Kqde#k=B/EquKVBGI%TiHm?*KPQky>==yeX=5
-Ad6n& 000ccd5e958001202b4 Page 403 of binaries2.zip
adq<Ta 4aElE#aWyQlt/=#u>/G$&GZIpW6i>!FQ4=Iw::Ga#L:/eLaeliZ9^Yq6^k1dD/6PaRQh?KmX$/^puH#u
LYCe?p 9FNRDP?FCKdYuVJuCpjHA8ATD$NVFY&pb?%j?^NPhIwuL@1aqWKpFJSSB?iK4?Jq$RCqNFdWBWICi:4&
A!l$Np SkKF1@WGk#+=Dkdh1eyB1@Yma6bd<c:WuTpHSiw\VjI&9t4YYeKq4&Tw*uEMuX9Rk%HI<S8mQ=C?1t$Y
4uKSRj pA8JDCwW\RtDdB!lR\EXGT9:TwNDK1aD&@DXBQRkJIYe9ehK91+Sb<RyIDme%G\F^@Mp^JbyDbQSCVjE
SDkkJ> MlZ=A*iIFbW\FKp^C/?%u1eyT>MAE?68Gy8$R!#TTYHAkWSkleSaWA6q4GReGKubPt89L<?yHX9+kiZ\
%J<cF8 NFKRmM^S1u!B!L>wwaHw9*C:4\aKSRcH*d1&H14D\cIw<*L!yEpkyFCLuXVL6B?SHqeXM9I%KPh>Xlh!
!T$>mN aDpHDF8luj#pd>nRw&&pq^BRk#JZyEIXaK6GKk*YWlhtJ:duZ$%BqJI:4<9Gk&L&9j!W=hm!*:BRmFBA
>pcLem /&b:Kn>p$9^kPt6G>ptCXQ=R+eQb>4:K>L?HBatBiMYC%aV>nppQ6:IpkFmS^6kVibQF:SJRF9h>Wk?\
tY&8b$ #!+*YP@Y5+BCGJX>JLF+q9QTQE%d9Nt44iPBT9#a4:PXBHQRqDZ$NRNHRjK%NheFn*tqLKES+#WFIncp
BZRL!P R%@mIlNyVILnqebRyKuC%G\D5tqtem\D&Y4Cm>\wcRVSR+Z6e>Tm/SRK<IV>\mnPh=D/Y&?Rm#l*uuPe
PJ*+&V akm*HF/EiI:6jhjFp&9mj9SV&iq@ST1tHm/&Jk?mkwiKC+yG1KtLQ*AVRbC9A%HY^nDYVc<^bh#FJ%cD
pLE:i/ &4DPAQhKY\Hw1*L$p*WkI??a6Ep=FuW1N@X/q441Hiu^&Ww=9@QR\m?#^uBqF69BIn9:*9N&QJ6HkRTV
%R?a1! hA6:i&ISXB#Y>E^:cN/tPt@uS:6VuPDpM/#S^%S&PX6XBj<1%NpeYIHuZP#hwWnFPNcWF5:\**C9^6?&
uaG5q< S4Q&XlHp$!VRL@FEYqeESu>cNWBD\%RWakKhe^q9>hpG=9ApI?X#S8kK^VtF9A>tBe1yXAHY$\ZW*Y1t
q$4:!Z mP#VL6pI5?jR9yZ%Ww/kCL^/NQKBX5&=SL9Kb6bDpNBqPi%i&V9F/!uh18/?k&#PVZb%*t$5%6c^yQBZ
Q^YMS@ tq:uhQ^<8tDGK84L>t@Ze*Saw5RXb#:qVNcWm:hwA:#WB#>C$CZRj$Tb?y=TkdmRm!nC?p511u=Q:&Nc
pwY5<1 GFA=W?+#?^XN<DmcYGSZZ8TDEFRu55T6V!YeuuiX@%Ym5nMHMWmi<+bML>EaaKWjq+9B@BSVcin6:ZSu
JVK5\W #iyVedqnlcpB1ZtJ:pSXuQ&$eXDjG5^ukbEbP<YcPt8>u5?IkEM?uSaEVA/dQBmk/<keF5nYTXS>6cK8
F?J4l@ t>!V4@w>>FM+<Cbwy+F81wM6?1Et<pR+SEw%b$LhaBR/J+==#%86j$$nN6EF4BhAcRF>:V6b\ADIKVw$
>wkQl/ ZbGDE^Cjq^IepBqY!BGjDqC5Q/R>VCIP=DYJ8%MPDSAc:JT*%XA@bBtc*@JT9J8B?!u1kBHMYHGHHl?L
*bqZJ& cHK^eHHJ:K?nhQPi<PlH^!ee6CkY:maePYk!G\J>R1tW%Gkh$VBlu:/#&pljca*ZdhSR=X!8n\<nqnLI
=hh8Zt u4Pa6kn&CiA=+KXKj#88DTm!=Vw/PaS+dPLt18&n+uq!mb:hbu<8ZjQ@*tnbeQqFm$Wnb!qpKRSC\KJS
D1RKnK C98QKcRy=AwFnWkW\p5=CmXIahFI1hB<>CVmpmh?ep8?E?>@Qt6ScLeY&=5YwMH6Z$c:D8N&?FF>*^\8
6FM*JB GZS1uRc&I@y\k=tS>QB?=?ul6XH6LDHw+dWi8$puj@c%Wa*lBnNbyPB6b+W=S8M*/Fm$VP@HYHVpQZA=
6D5K9! l6R<EM%?ETE!ZHccbNqFahuFBRk8@<=y4t@kN1>=aNL+dZn&QiSVcCN>II=a@Zt6d\k98n%a>ccEqdRS
+9*LG> Q4>VJL1>ZQYtcGJ+4mhWq5Jq^4yjJqS!\b46X1jKnKI>F4/Q=$ZCF!4V6##qYDd8PMm?WXJQ=Edj@wKQ
j6jMGK mtw<ylKbjGt<aW\&^GC?:mmm+e=k*lbG/+P/h:$kGY$a?bepnl%q\BPBq4+Ni/?twH&>NlQ*4#BX&@LX
6y4Z6I Dt*<^yqZKTZ^/5?tEpuh%b?4@i68tXE1!l<nl#P5\t5inh1VVL:%eih$Fu4T5w/#cy$WDLEM8J>EWMDY
4JL!$K c1Z>pl^u%bP1a@HC45dT!WbTn/$uel1KL5hHMR!@@E=8lt4WCBTNjeT:BmyV*dIMBZ^+>!%N@t=BVjSn
MWBJYZ t6C+M=K/d%+C<ZL%ZqHi*t/p?4^t>C:&jX\!LF+%LX&$ae#WBbP?<yZHM$a!dFN/nJAbWi*?AH!1$%BI
a&G*/* Z6u&GItPcQd$K<tJVF<!d$#DPLjl+M@=h#Yy*iWu\mL*C/X5l9:*>%:8Wi/:p!CZ$^YiB!H88$ild=Rj
Z>?I<J M6#^&ncQdhMcyjQn&kj:LAuFk&8&he:Hc:b?aGC!<?miEKERF8miWI%kaDa65Fykk9?Z&@D#C@LWNBM%
>dp+Bm FXeSwiK+P#dCTe+waGVpChX!hIXm^K:wb@\P5RZK<!SnPu%E&TWl=SZ\<L6G41y!H46Ht!dLyeK<i54D
icd648 *&N@tKaB+%h@mB$p?!E$DeyFcB*>E$1tJqRB$pVw8l4YR96+FQ@wS$ek^^KlCXZWmQu*BW$w>Q@cdYR4
w@Lycn KMQi+mbiFC5a1G&^/iu4%MLhcD=N/:cp#/E161kS6u^4bqCl8LbDnDpbEw>N>^MNkehjeNc\yjYC%=Dn
BTN+A= ?SmdEBeddS6jSd!%^W*dNM:1?Bk:L6&/uJ14WG!4#l98dA?KM/9VKN\/#VJmIt#^IS99J%cQYna1^bh^
<aKQmd Py1H!^6DRml&XqjQZS+tq+alNZ8dP1RdJ@Dhjp>GXT$Y#i?F46ukE%i=YDe8HJ&EkG?YiFJS:H+\B?K+
CWy1\d c:@#J5mtbbR#$Nc*n:/N/Hqa&^4mNp$\DD+Y+8Wc/?i%MtIPaBmlLb9mF=^X$Yd4$/#t6$8*&15Cd>i*
Pk^lly +/18V?dY>9dlRCh\w<Kd94GWN1=RK#eGSLELPYcD!4Y@?ycmX1RFt?F$:9DRy&eZFBPJ<\@Ynjj5G>^n
u$+j$d W/!Q\Li=jHYD%h\@\FmjX1Y1u8C&d+6hAiV%CIIQ^%JjjRR8be5QICQS@45YETHmF^\GIph6qqJhSw>=
kq4M1D ^KhT@E55!^j4R@1m?#Pc6G=<*#?YNMl/FZnS?8?:>/TbI$bD%y#<IQ^4XYipE$:b/bc>bwa<j+u6?Xy=
:$Wu4L hYi8b\aJVl!?a8KT941?eYlwqbq!BRe1J*4<M&Pqhij%wDqDCkPQqGW8?jWkX&*iKmS6eh8jcHb8w5#+
$*mZD^ bT*6kEII^6p+81ldtkWtM%G6EuSq/&#j=h68!@DGj!Yc/LHKEB#8aJcqkWw<+XActq@J4?u*!4C?LHu<
XwKJ/# !lnjG&a5qa#Xw#\R=FnhGGC:Y/JZb4=RK>Ij>@@q8!4SXlVYdJu>TSE+mSb6F98ew@InLuMu5IDD+F1K
mGXIt! HWmX?R9J&pGJw4ajTjW&NeZ$cYh4<bTitlEV6nMM#na#DCc&YK*1Dt*eibZXj+5i>T@S//Y^pLa#6B8J
cJ%qPS ^Kc1!BXlHCc6X1NDR9pTjph8b<w*E9@1WX54Tm>K?I&TJ:euCS85k6@HG/!B@\YqyZA\RX>deY/yKV@$
I&t9?& $ZYA$:\?nePc!Fae@W1!P!ybcyHKt94MGcLjt&Nt$CGCeAliukheT?wbZA>:$W?%!W?%5hulZeD?MiC$
1pFL1I BA8$lP=GNb*Ehk9WHm!6Tq+VVF>C%@8>QQVhcan4MJlFb#mmKleBX$h$\<B\wnL<Qqee?$S$R:%B=wjD
E%ZddB a:WWH6iASJ9^#+/ecn4C6%>PVQWDp5=u^8HZR+RW*lJ^8C4n@BlENJ5EhBSbqBISbT&aRl/*^lN=dnGA
jQM@u: mLKmyttIGFpiTYS5:K#nZF#>^8lw!XplyuTHH@#aGL:AKCl5BXYq<j:tZ/N<65$NF/hJhn<Y=hFhAMIW
FttiQY m\myhBaX9/>c/YuHwqZXjnW6b!W:qhHV/$I\tR6/\te+LlFC4p<1cn4/nqJ\$iYWddCNd&*nhPtP!LYn
@hLM@m wQ?8juL5=VPFla6GJ!LQBN&9j>H6iWl?%&$nQMnM@^5KwZNeXhPqeqqABtjWG8DDTHeFM*q8JIH>=aAK
tA:W&H $ylZHQE^T\td4Q:%&>CidM:tV/NJcNRNp*=9p^1=u%hnbIhj%ReS^IJP%iWjXeVSVMiZ\//DuJFF9+?e
6TVjm6 WqL=!V\Rm<aNKKnSJGHXFbc1>i+$!Jt>I>@TK+LNc5mamdQS%h6SbmP\@YPPjm4eJeM?Ck@kATHIZXyF
AYG>lX #/wc5BW6G^+yY:pm9GPnW>jALap%ImXjlP:bY#ll>Bjy?Kk!<kDc6*C+BJ&k4bWeTcii:A@!DGIS!aai
/S#FXX N!EGwVEwX?4wVSenVQi?WhlClV4^R<tEWL1NGn4yWtE>cmZ<pn?uyV\uFwF4qMG<&FJ!EBJa@TZQ%DZJ
R*FSL= MA^>hb*m+R8D6A!tAN$WjD@&%XpX#\8Xwd5j15M>81+y!1XPXu1?+p=Cp>F6Xd4ZI$P%Y/4?*FTXSqT5
bGX*d6 %Y8yX@kBcShIbbbCh?lRwTJ>Imbib#Dyb:9HVZG+AnP/84NWeM^WhJ^$W!nSYlml$=ku$WS9S9$XVIye
e!Vul& =4hcJtaaYQPwSk6$jA8mCdQ\ESRiB85!L1aKZeqe<q&iJ&HC$db#8hNe4h%+!LiRJwZ/#1ndjtnMadYE
\mZaEa <b4//ciGZQkHEB>PDDnXL!9YPF5Njm?8H=!15MC1i&P*p^>PYCn&M>VBicF:c<bLQP<yyP5VP5mZJ8?%
Jc=wQ1 AX+c=TacdpF=n4daGt9T8X=ejZceB8^wHJX\R5KK1WF=H4Q*%/Fa\MkGe\mQuh6HeVyeFARwPEew5FYQ
h!N+C^ ZXX*JR8MiG$<GE$8tG<:h^RZWM^C&YnlD^#qV5*qQ#G+1DHw5:V#6PPPVPQX9kR8u%\5:%8=&9RXy:$>
hByNp5 ZIaq*+d%W>pueHp6Eeu<%4I=W>a??QbXR@J4eJQclNn&pDwMZet\5hBX+pEayhG91jm/e=65P1>jlYA4
c+^S:T ?BE5IV&kJw8q<Dt==dYj=9clm!t8<6JG>PX1>WZd:y%Imikcq=9YnVKLWB9pylw@dc6WyL:#1dV?8:e#
#/Iee\ EhnT=:dElSWSQ>wyP/SJSRL4MlFC8p1hZEm58&SqcC+qHKRqR5hnC5dmbm^Fbhyntu:pDyTR#BER*it$
t$dlGZ ZcEMFmcqC/TPD\PDK\Kl%=^ScLI\u@4uZ>PFVMwuatd1$MN%J$XVV\LDyGp&\i!l1ZNEBRaVlMZcK?i!
&<XI@W C4&6&CTB9?/&4i9$K1Wi66d#k1kXtSh4#ut6/Nl1=!LK>5mLL>P=m5&=n1R+:<wXF4TMkp55lQW?W\Z5
W99%=y dQ?Z*GBn@=@+Z<WN?H?A:j?XQwCDp\*\taIAj1bkkG#5uB<1&Ln?4:B#edG#eZ*M@^n^tddlb9%Adub&
Y@!q>+ qk@p@M\=5HN>TJ@ACtDuaGZub9?j$W@<WM#?@/ScQuM8u:piAC5dP+D:w@ZJkeAQa9>A+EeH<GQbRE+A
%ZkIE1 G?iHZR=YFuaP6p<E5AM+Q1i!AAD@M<QC^j/=wI>q54K^jq4ubGjnbQ@MA*F#eLB@=tL?M\EEALlbQ^#<
bFbieV wA?hHQ@qnV:E@#\HjnVaAY!j/SL&@\WL?DHuI!1e4B@DPjwE^=H:waYJTJ6wKNMnA?I5^p%w&LKk$WSd
#N+LuP AuJmih1J5Atnl@=C\4@B>DC%SkR@yDlZ>:FPKFmREp%ZeLed$I*>HDWF4WR<PQQT$FnCpkj\^d<e#TKl
-A*B+i 000bc011393001202b4 Page 404 of binaries2.zip
De9*KF qmmaeB#V=RZKu!=!*8&>IDHjIe\KBHynR+K1NX4\lYLS6QBl!h1Y@*+*45ACNDm$LdJ%!TkaaeGmKSk6
nND8!y NFaJcdXXl8/IHH&Dy/lcy!c45a1tu>\qGKi+bMGc/9i*Ad!CemPBWME5FC?I*aEt5BAw!JSAYEt!XAWP
J@><Kb bA4CDYSWXtMhcPywAtlK$FT5ZX6w1HD@PNQbYjDLeHpFLtZ\lQA/HnSpam!?jKAM&J8\5A5iF6I6SqyZ
1%6#!+ VtYNXV^u^E$BuY#X:YCGGS+$ie/CcN5qMppqT#VWdCLhjQ+p&\l+6\JLX:XPIYK\aapmZeNX+JIGCLJG
@8t<u@ CY>^YmaiT:4HXyiqMaG\T!\Z9GGPYEqtk%=YPjFi+Iyn^CidiH=PbiZLJFAu>n+cI$tZRY$P&ab68QT8
d\V&:a WW$R>X^ZM%k\+=c8@!4w*FP><SZiEQBA9&RmYuYQ6=w*nE$6XZjZ9&?q*QAQYYGNLHK!it$^1j6$YPd^
^SWB=T EFXaGE&b6%8>AwFqi4ulE4P4P6Mdd&HJ\ybS+NJZpHHyuFhTY$BN66wMZH4ckTDablHZRaLLc#>$>TTl
/XhWGV L>emeu+tepGtuAtQEi>IEhFpD1t?Mnyt+R<#CQMXTD&=TGMKQG5kXaRX8RMpJQP^pB+#tQRq#@Db1Vim
XQ*/!l m^4b=6NE\$Vu9bh66$1l!+1/NWMYG=Y<#8VBnNmnT>@MJabmVVi?N4B&u!pw58\4XRB+VG65pdNqwnGd
9X/D6Q T$jW*ln\nMd@ANYuF%!E!1daElbbIwYb9j>BM#<11!6?N$$JAqeqy8ld@cFQhHtD/b/y>ICyB%\JStY&
BHT8p# a#u%4*n!k+thb?TN4L6L\$JyZn!iY*4+hphwN$F=&/L#*8T+d*CYh+e<^#+6P$t%^6Y$PEjpNT:SZ\ZY
5ii+:/ pYKmCq/8/dc>nqY61pNAYkLWbediaXcYP!Ehw#SFM*Z6Wac4JT&hq^h=9K>V5HuKbhMTyH#mdeW^P=y!
HubcHu c4IlHeX6inSGVZF?McltGGW%$EHG@:XpeVES\6ZwD$FTkCBbHJqN:Q/%I/Mi!SpNt#6QuEhKnTJZ=CIP
u<<KVd 5>WE+WVd!$t9JDPtb%CpQFC4T?V/B^Fd$a<ibjy1a=TB<$dZ*w\?eqE>J@mpk6%%BEnupXD:8#YM@DL=
wAmNVS HC\bS\FcYenWuClWlMp\5Eq/:C54<ZkpLh++S*Icp^9<?H/k@uR8bRp8N#p?+W@Z8Q&Iw6VH@a%<I4jD
<mc=pC ?ce<#EYLSel?Qki@y?AHydA?lD6Ah\+=l=k:A8wQNHqcpBNE1m8CGZy^/6AJZIBj<9ZeQCGwCwKe$IlZ
WtSiQN d*9dI5\BZTbR\BIC9Ie!W@TjS:!CIC4CE!QDZmSlcwEQlE^iky!W#LiYGp$I>ERy=489Z4?X99GFwa8^
X1l55N &9!Dql9<R4*ZlmW:I=MwAtw6w#ni>c1LZe4hkXKpRYMdNXcaWH<^yLyEy?<1Xmej1^@ZuPWDTaitW^FR
KC$<m^ +Y9D6&at\Z>n#F4k<^4K+Kld:5!!enaXHy4ku>!*1@=DXC$kkS=j6u?XVh1LLq@#T*$lS%tcEF8u+lai
RTuiR# GdbWL?#LQuhwwVjS!C&bjEE1VV/1uA!4%4F8<qt#Wtu:?K!RpXjC/E@jw!TI1qpSH>TGCi6d:>p?lJ&6
w49FV\ 1LyJHyCR^I\=46=!wtICdbH+MpECnZ>A1h9&AmK%/c4t>q$qNQk9<CaHyiSAy\EjT<N9Z=IijNMn5i&Q
cHu?N^ BTG?1DBb>yJKS=@TmcEdSbmh68eX*^<Q4lK<mF*+FQ4QB+%#J$^bw#bYF#YG4%Il+twEX4J>N<^5wVjJ
lZ#6+G !1EK$FKpFYVWMSh%56QFCm%W/E!!ZC\<uem^4JZIkuS1WM%4T&yLnKwpTPG6ZBMmKMJPuM%yM4nGpAZ&
d!qXE8 *t&\npuLR5/*6@J8h>:$YJM^!#h$h+\j5P?MNI$YTS9>^8T^qwXeA8V&L/Th@W1iKFukNH6lHc^Z4J!W
GZW^1y V4MJ\@<FYHRHE?%YiDIRhGa1btnCmH>\Z6TJ=n:cm1p&/yRwTW6tQSRa+S&F&8uqWIRddy@I^:KJwnHV
%n!b9p keJ\NJhj::PI1ph8FM>cXXb=QFLiCbQ4/TS8NyHIeu\tpC4h9%IVPCCih8T4MGnWqwGS&GK=XT:A&K=R
?\Q\QS pnIN19H\=G?qIQnD=RteBhdT%TcqXh%:^&9PB1e>/PaAaTITmA5>@T/?$TwuyN4W#e+\4WGhaWc&&6Qm
yjM@Fc 8LM8P6RhcEEt^Nm%V*k1SJuhhtY+Aj=TFuFqk+Vd56DjTk6Tc4<u^m<<8hb\jF>%:VbLY/T$pduGwN64
:8qYaL B*$^%bC9cCci+G:yPITJM<iE>SYK8p1aIY:i+Cd+VYm=m/Gl86=19RR$BSmINu*XHN%@+edeJ#F$W#Ni
ld@mp4 KXSuN>tKT/5*/<yN%?i<Z8A+4i>aCp6m=P+JcMqK1IMZFw6?JBe=C?K//b?qc?EI*9V?k@*5cRM5$:^F
=tJLRj +k@amn5WY1Y>&*wV6?tS<y=ZGkScaMGE*V*@$DA4M=#wq/jDcDSinGH#GBu\y%V&tYN\lV@=yS\wn\%$
uA?#NQ T&SBmdPH6hi\jVPT1!6FLGnk!latNqS4Mdl911D^Y54lhHpDS!ddT>DKiWi1l\ZEG>k/8m\%a!?61EiY
M>FV@# VISq^C9!\qLd&?N6myl+jy%TJ1NP6BY&d!#Sb%!nB?9A?te5quWIaD?<y:lRHhPiFc$1uAlB*Ma*!HJq
4B%Gq\ NiGD$<ZM&4V:<eQ84BSqiGw$/RWQp9:m=hl/l!CWhuW<q!LB=iFaQj=qk<SEYY@Mwd@Mh*QBlqyS#9bC
8Wj8+* k=Nd\>dCY?Sk9A@1#L+/J#$I$NJ@JpK^^*e^K*uMNXB8aw@w<H$pqq@p<abKy$=<Wc+A+AJ==!9YKXZB
XQnX9W D1FAut:CSC@b@u%$B11wQSJ=QmPQkXtKl/4<*^JDS8dWFm>NpaY6Zb9>qhZqudPDqJ&aTu8XQWRMt8*W
TGpZ#R E%!@*H!*%W*?D1meTG%m:\*TFmaEKe^8y=8?4N55K@RRcW:?wlHqqjhEylDM+ya1$5Xk1\4B+haAc+TT
%Kl5yt HYcwGdHGKjQp<SFMG!WkBA+S^8w!!N4pSM>+J/mGH+4!aqb58wZSwMYwVHWR4IYqlk!c=FKi4=814HZ/
y<yQ1j Ma5l$WtTN^GFe54?wihACdB%MF&wJ!ZSk^%1$uTtFRuj>EJ#>&KD\!*YID*MqB:6eF&PXqDR$qnNnqF#
D9/b9H \Etjb+tW<Zd%WGJMS?pwmkSTcwV@!4:ZQk<XQ!!4yCF!>lS<bB<qa^9ZeI!KwEC/*qnRTBn#BbJ$YcJT
i5akd5 EC?A!!59BPbmD/dGVb9%D$yX%q\e#M8ku8:b%+WDqhie$aAkypByw<SLkAW/p+Z>Cn+$P:+mN*+WDbeT
ImP@E@ @lj/R1^k*wwwFIHTMIn<R\Vat%qbZB#KlwF4SVI/q>5<YW!GnEDFE>pliCSHIcFIZALnJ/L<DcKnjYLK
4WZl^: btK:YaF4m?T1DRLKu%<uLlHG4jVlB6ZQ%Q1MJV!lyNKKXG18wy5Pb/mhTqwwE>Pk:8\HY+KQ*L/dEPMF
iQtlW> B5LWcTk#HiLduT^CQQlBcDp=m5#FPdn6R^WJH$lW=\n5/!C#uREP+Q11M6Gk8>9/D#bFLiSy@c+G#=Dw
*l?JSE WFy&=WRwAhHBWt4VAm+T$=Enwc=KCt^lP!^=RliI9QGlYc6!DBNXLL5tF1N>WJQt4c!>j1Dn/V*G%AjI
%M^ZtY 4%MMGiuuBj5M/&J&GtKtHPIBj9>KIP:L\KcwtGJ&?hKQyJtHDkCZFYa5WY\$>ASD9mGY8k!mKFFC9hBk
ZLFZtJ %hSt$&1n/!dh9iwK^DS5DDwaB&%dB/b%Dch#1Pm&KtH\Gpp!VCLlSkFFL4/t@\SMG8B5S&iyuM+y!\TL
E%?T>h 4DEp*QpytZ#>FBBMjXMX5nJkqJIGXaXaTYt9%HqE+JqQ::utymu/514SuDEh84ZJXSk89#NlYM#FBliW
^K^$Kw !b&iW#MhLqBY#bHC8C!WPQLPRV*TTjmIEBTNGHu9K1DRh1PWcX*hiRNli?Xn&y9mRquSSWtpdtHFmdJK
\49@:c D?lWKtlkDCkD@NkSKLQQ8\$G&HIPmjd6ueReF1qE#/Z#\mju8+h9lcyFqBpqClJt4J^C/>dbYEYu=!8q
\bYcVy VbDy%lha6qqRG/\mFEY4b8n6@Ll5cG!N=jpuaKuQ9pAF!WpnC$TC>b:S//uN+/MYl+Fh$Rph/<\k!+lL
>ju9=\ hwniDFMH8H%nt#VeGcG/PFeXaiFYedP/5Yp9^/X#V19DRPA:hDPNt$ct>&lG:#ZH\wR$STWPXTRab:L8
jT>KJS d+RK&dK?B%Fd#MQ5QhdFc5qA:k#ZDd<JPN#PF<KT&u=tP4TTG/&>pA==Plm6b=5Hud*&nBwcq^84I\!L
BL#1:% YGaKq<Et/<DA\Ak?EL^W:dHnYwH&i8&k5hLc<H16R?Q==>Ae+5>A$@$LARtB#>$kaT+T<HD>ailpiHHp
adN8t4 Iu/^H%&YEJT!@?$M<a6h\jl9b\kwnq#a^HjNpNX6iLZ8+<uju>!GL9=4d#qCBhMMTA%dK\FQFT<hj1j*
#N$1A+ uCCB+EPP+&H>9njS/#GeAXJTyyRVP1iW>\S55D6p5Z&X?EY&>\$^p^nWdVnIk=n/P<J9TEyP/IAJ\\%d
6+R4TS R>XKLy++dFmH$kYZS<bRVYSjMn*w&6AB#%M&KB&VILy*1/?t#V*%9an#TGCQCetB9Y+*mWS<ZbcJG#GR
I<^G!q CBtPCNVVBYHyPK\c%\ek=YyljbR#IXJN=n#ThluwmTcalS4RJGIZES^RnHwkTM+T@@$5NL9THk$DYl#Z
nt5Xt% \h8!5KJe*nI*SA1lhAA\@6+W+!85IS:=n9@K>SR::IuC<w>Ibpy\:^9<>N8KFew8*1b#I/!#c\#%Xh<C
9$6PuQ uAq9yQ%$HR4ZEKd\6M@ny9P<#!E!\$j%bIPWaZ#/XqRpa*\YSDV!Mclyi#Kad\S<KC//V&lNb!R!hXVV
6&a$8e @99nwhuHCM<J6NTE8Jhc^n&9:F#iwdmaMm9iTD9M+V5&a>@Tpl9Y>wMWqDNjF>LwZd#uZQAl9K5FnEQH
Y#R1m< TJ?KiS&<*VTB+bFw:lVhlNwlAKuJDY9Z!Mi%1D?#Y1aJ^n>@RXJ<=b6=&R#mc/F?j$*eYK4DPq$F6J^8
&+T*^C >qWQBClZ&>*ZuN>1LVcYEZ8>LnbYl8lH*%hcj:S4m9Z8T<DAFDVRDTF!IJ#SDcE8\eDwF?TR\CK@RCB<
\!AQ=E =my?IAS=KymJt+t1mqAB^P@*Rp>JX*k+b8ye:ISN*k<q+X$h4%yZ?SeI8eNkDnaJ>a?mwjGk8HD?@TSC
<<4<uk hANEy9/@y<=<lbFBTmXT+Rw5:Hy?nmpla8HmeuD!<8%Pi9^J+KZmCD8QRpapqDXPJMDq=\m&A>/QFbK>
\Z/#K* !lZpmN1*@Xj!ZHFR@95>bPRRjnR:pXuYAyHyT6d+t:lbG*Cqc5LN\1G#RK&amqH=FFy@t$Dd#dbWY>6N
HbK/%^ d4G>5k$Q1\m=Dc=eK*nD8$!ia&Ya1q#ddt?j16+YNC?I*hS4Z?By8#eeT6:W%Kc^MA6Z&XH4%mp>$:n/
n?Y/p$ %H*C?*X%%6%c!tqtt&PC5W&ZFJ1I*1Kel$66S5*FwdJ/<6!:\whA&N1/<jdA^SK=AF&C9Ku4Y&NWPtu+
@cXDnq t4HynDqHXLyddd&L=pT?&jB@X!dl98p/WtEW+Q!d*ty&/=yuYmVtC:GC#W44$^N=CHcDdC=>CFuDI@q^
D5JSQ/ eG+b1aZB5Yy%cM*tLnkB*YaD9JY^Y?VTZS%CuPdktIYKFR%e>P6E%j9hy&hd>J@Ry4G9BjH\l:\A*iD?
:Qpy>% NAQ+=C^B*uP!l8!4<Yl>M#VX%t9?DF4>EDKF#P=bq1JX5>/CJp+M1!PT9YB\eW9hcpj4y!5:uD>+W$SB
9A+ZD? 8<wht=eeidZG*QT<W!ld\WQBHS@*A?k:Tu!E9JY<<QHb9?#Dh>6A^hGn<EyJLlTJ#N&kl/1mIB\@&JL>
-AQAn% 0005796526e001202b4 Page 405 of binaries2.zip
>5ENXm iB:?DSEF$MDdN*ku:5HVq4LYIT!u8iuutu>h<>/YINd6+>FE>45:Ql&Ld+uiq5TEHeDSnHL&X$d&/jim
8VJ9a+ y@XmP1iKyhkd5@d^6:TdpE^P<<hG$XW8p=AL?&^Iw4ehA?*Xe<^pL8GX<%ILF>6T#hq9X4J=dHQ4HGXG
FVYGEh yF%&@CByM9<Zi!JhZ\e<LR+9#*DbPn!w!LKi&ShW&i\tTIl*hcHX?q$mlIh%Mh@9@caScn95>96*\@cJ
>M<Yje <+STl54#PIG<&IYZX4RZBSqltp/Pk/C9%d&SNSRX&yDeME=&9yF:/&@+54?j%#SR*a?9D#iXdS&I=<y%
QM!M:R wILB?Zk!wSWqXncYHP9LtF/GH6>h4FI1N4W&8tp$R**L5bp%P!Y@ENp>?8PR9hn@RFHdbJ1N&YSm?NY8
iA!t5e 5/4kJ$je^<TY*XFZSWjQpN4D*F/FdDCE$SHE:#mE:RRMZQn*q&t\M@kj%\LpqK9L\Y?%+Jj4LJ<P>h1B
1@!m@l 8jVP494$b?i1:+:Vj%aS^n!hc#eElVye<Q+?8MWN?=cctp=nRMFD\IQd1ZYHuBt%Cb^MIFbij?5mLa:G
RC%+*P @y/bIbXY#5EMhR!Q=MBySX6wk*c*:l\6Xjc%m%Lw!ceS>!jIbKN5k88HTdnAZT@#q&IjkV?Z?Y:4bYI+
nG:/&P TlWSA#9wdne^MuG>JKtm8@PwCduHhj!:e^J6=?TuanF!<d\pGZtZekqt:CTb$CaJ+*<$ed%1J$?i5K>d
\<:l96 qcq5Y=XE6?cIq%^?Bb>Gq^ahT?Jtp&%m1:kTFqL18e1!>1RXhqApec6>ZJFJThH=5ePnJ6*9WyET#VXE
qDa9ZH M8tVMiK^W8Gp^^t*nutcy8PITJpCT8?k&6:ne1tGA*!M:Haym&nJyCd=hnu<\?XnD9u6E5GAyDe*M@4^
mW?>BI 4B/n=TLWTi4hut4^Yw^etVbJS1cBZA&%BtaF@P^in?/5?1uRtXP:XL5VDTGaGmyV/H&Z<MS1Q/\q$6+B
+bph/X 1Q>P6j5wFYSnT1j!=&B%/!d%9R=Tu*T%#PTSu#W$!$Wp5*FIL4BQF@YeJ4mmRBFGwB<d\+Ea8SaBGp#L
lnVMMt J9lKIDbYYPbFP*dHApI5kH^I6SkuDH8aYTVN#P/Yma&yIHTueeTwEI%eRPTJ$qEuXZGKw6TR+ybD5XjC
e/eSHR mpMpQwlXJ$BFGGcJ>\GHHW9LAA8d9$>c1e19jJHBS8VbAPwSJdbe$IEXLGE>Em*VY9Xi<EyJ=JRY5tlE
Km@Qjy YB#CAm:KInl!S/Wa<Va<*/nLXm*T5EJE#pJMLiKWtwWwqha:uSJuKFIu>Xyhd!S6YJqG@e#8y$!wXIuL
&e<Xqj WIt@Cm5F6D8!PAjQQ*JX&MWqA%ehtQ6l?6Aap+8dCCSe*WB?bEyabFAM<9q5n!QMIPNp$tX:RMnmc$%p
1GQW$V l\tMjES*pZ%9pqpL#PFJ:<GX6$!Ei%AlG!CihpHh@PRP^9&db^C4^hSNRY\/^NT@Q4HX1/aP5Bp!BKDH
#41h@t 6VPbEd$NwPn5QVdJ81qWa*BJE=ZyVKpbCp$yBE*MJqVRi*kPCqkNudK6LhaFA>nK^PRZ9qN:1:uXCakR
1nikN? dnyR899LMuAK#pAmR8%!#GFLtZLDb&PpFmRQGX<NZp>*11=mYme%\/K&#jk16\!&uee\Rtw*+61dYZ65
8=ltSa MEkQGp>SK^Q>#w:\9W?89$RP#6yVkEWcK5p=XKqJR*n^KSHN%kSiMN18+*TQZ^JNRdFL/?dK^WMhSZKK
aANN$h BP*eYW%eJQtQG5ZRF@TeHYY+q\wy?=F$$/H^KGSwikqV1^E>h\e\BIpnqAq!6iEh//PnI^lbG/5bdaq#
wttlm4 e!PGi&u\aDwtGQX95d*PIdCY@kZj>SCGy%X?BTW:Ae=q9Bw>BqD5b1jl#lBG+thqHX^F=GuVRTlIW:5T
Wk%uZd kTduRb1meN$P$t1DRVYE$Bi@uE4CtSZ=QihL!hpYtjPJ#liX@S48VeQq>KZZ+^nu=#m%m8i>>Ku8=Q*G
VXw>Cd qDuSQEA/C9%AqX1>>pZ!X:D^aGM=+j+GNV6:V$&H:d+l$HYM^eZ?D#\L&bu9tXL<TQpEhE$EAZqCFcau
SQQ9AB \mZ5qEhqA*qq#5Yi+MMiTRMu#p@Z@Edi99C#wRkXLnR1KLaW&R#e\pb%wWeJuqNCnu$GAIC#6KYJM\iZ
Xty5m= 4m8AnaMDAQ#@Ba:Q9Sd@V\Pb+@<jAAAY\PjL?<?c<\QbQ^k:+QQh@ieL@k@ma8XmBZB#e*B#ALkB*F!e
cj=q\\ RACR=XMX!@<a/&jl@mBYN8D@pP5@k?#@\<?NF\DP#+EAL4aQEjm=9M@/e%tjI:k=Qui#5Q<ueH^Mb@>@
!J/@dl hAJb&D=*hLC#jmnpAHJ^j!4l=PdtBuK#5HK#jc\G\MEB=GDl+Q#e\<L%/Rw*+Q><a8Fk=@kwuB^edB<B
qh^I<& +YL@d:MMJ!54^?i\n$5eCq#5tiFudFh6jVy?BELC++CF^l\qD+LYZK9PYbnV618#hu9K1ueSbZbyp6/i
c!y6q1 BFpEyC5B?&<m>RB=8BBpkB@PNIWeYaR$EhY&\AyEZ\PaA4B@=pXWIAbRwR+y:5!m\CuQD4uc>9$<9JN\
>KZP8> A4Xl<a&c?ZTTINliijt5a:^kL&tBuWWH9^Cl@tK\Qit8Ft$!EapWH\a6A&G&kia?MSEEtTGXLc1Ibp1A
^VH/*V E8nNd\INd1FMkPR!4Y\uAh+kdNtZRm>LPp=Qd#dK%Kn14>diI&BFyKbK<K/6B=!jAY1AB<cw5<>FRuEk
&L5iIj ^+qMjEP=a4ApZppab!Beab5VhXbt1dF$NlJMtlBeu$BPmBWXqIWMXPLTwedTuEAY%XJJCinEE:P$K6Tj
9t*RjA mCHuX>hdmFn!wXM@ME<4uPM!B4VPcbZT!G/yIVwG^^YTqJ&w+%pVmMLjeReHK:m+q!p@N*FD>MZ%qu<V
T:HDcy %qykKF9lYLbF$hIKpujauh=9lyWkNBF&uABEL=Cc@uXCYK$1yVIk*NTePA4T/?t+VhY*S$WkeulthM@j
+H4jY8 \l<&:DhI$btI/eGJhHbY4tGb=JSnTbT1E4<6?6:Wub9JmAkN&iA$8/&C%Im/MlM>maY$MTuhZj%K\JB*
dqLqIj +=?Nuu+5@\ZuN6k\=I8:BY>K*Pmj>eEE#&Z=1$NZqBVS:BZN?1b9Zuh1etR41IL!ywKuDWmKJ6PdZ+%Y
IIZZ=S k^jY5:w<W:LePnVY=6TKRc?bD/pQY5JedQ8CSd<?ukElA$IWi\4=KtHXwtNZ5%Xw+ah=DdCp+6JMHL@1
hVZ<1E HkaEMaPqPDWFkY&mM?@@iBm9RPTQRBdnGTbHFM^#$/k<S!SRM$IYm<pWcN8j>XiBe*IdHqpJ^I9Q!w\%
A4Fal# XAVFwhRWqkTl%XMLwn&VRwD/eA!*\^ZHtFmLTSYK>P58HWB\qeVDl9BjZmLX$HKH5?PXyHc6p@Y9P#mG
TVPSA\ eDLPnWS+tYyp&GmTE1B%+#%$I$=RMhkcpL@55cnGQYNCyl:h!+>He+w?R*Gu+uR9EpqdZF$HB9>CCCW6
T^!4dK e+8VpVXyM!QJWG5NFciSSKnha!E5qKd!qeAlJkZFE/5n?J8E?kJ/h4/VkAjb?e9#TNEQpik5la8TV@5h
clIlla eNGY/Med:nJmCFLl%SMaV%4G1%T5*:I:ZP^CtE#BncChWlyJ?Kk:TbGcGhqmRakwF6*GJ1Ba<iN9LijM
JuHN6% FDVctEXJqPRwEFB1GWGQ^QwLdSqXb%t??PjpkylMpRa#a^&RFL5XwhSp+ZRt4%EWt=lmy8jqwMF1+h4w
>TV>S> iIpk/dblcB!J<$YSLIZHCuNIC&9HXcZ!IycB%M#*A=JTIKwFP6>eE+?a<4KkmN*6%P\cPcR<PnMETG^1
^epF8/ =ZIFDpF^i@\nKYPbTkKww1c5Z<qT&HIYbNR#n=T>!TDhmJ6wkPARXKppHujyXdRbaFpG8XlqJ4NiytNC
:T:ae@ QRJ+tCbLk:=PqFyR#Lqq8EyZH>$F6dL\DWY!KjQ+/<SE4IEYcq^ZdnKjn^^ulldSpc$EHB^*$!?V=eZA
t/V*$u K!p5E5%TE/nRFLd9Aw8X<dYF+^9E5jdIVTXaPXSyJ>uPicd*+eGLp4#y<8YbR4GtDnY8k\mRbT:K+RFB
6$YZV: T<+$Ek6?HGaLalnJQLGXEZMAGqiiIn$J5=>XqIEwwcG#nK8h@dT4DQa#XBWqcMQSPA:GEtAV<DIT*M+W
V^h+!* <<!@VIWW98#KSY5HZ5mNkh1akBBLE\!euS1TytKWCntc4t+ibapECY5EN*8JD6X#*Nt414blC1%LMjLY
la*c\Y $HM<Z#QSMATEbI6E^4wX58!A?pn$<mS%m!M^P$IHeBd?6lTJ$FAKTR+tJjnYbA5\?twT!pcwcV6NYK@%
:XG/+^ e*WVkAw*\cAtteL+M&%Ni1*wnZY^htby4i4Ip!/<>Mt>$J&@DHbc^jY6=DNH1ddIy^^y&1y%Vj81nhP@
VAYkPR !BC@T6G/H4ZyCptCG#Pc5ISm?a#q8pcNLc4@F8qL?^X4P&DFXFKd1^c\Zd#pjh$kFSd?c:8klm=?jHpM
u:4R8= TdhCNI5Sn8w%MKHM>e\@%6JNMR91qMtJ&ppmm<Q6l?cXRPQwp*\&5>IeA\F%dTJ=55=WYHDAiq:Veqt<
k\AuDQ aIVRatMmF>+j4WM4R16>A^>Pb=j#Kh=kT<Qk:#DS89F#RwJB4JiFYTH$cnyCR^=aJnXcWikDFZ?Y+Epy
@+EtVj SNRmNqJkpnZWYLtRSN/Gc@Y4XXG^NlC?EmiiFp^MF+:wIc+yS#?qibd4\\#hC5p*yP*c@n$QBqwHLPV>
WDGiNY YHKZLaVt#DLdRCSiQqCJ/nS$i$L>*Y<i\LkpuyN+N4>&1t@F/yY*mA!$&D6ZqJy$ae@#M<ey@KLkwwN5
9ETE:q W6jQ>idSd5WHXVtS+cP94:t4P*t+@%1:=iB+cc4Ra@E%LQmmR$D6?m=FTlNTEA6yyX\L6/@!kw/u@ehR
@*hIkm \+@yj6wRKNi59&M!D/lqS^d+&!#KA#\Aw#/qL!mGWX>C$XalVpjYGynYN@?BP\D+=L=KLy%<1ZkRDYIS
8i$Z8i d>PYnW4VI8DtZX1VGhLEyDB^>Pe*u1AH%pY<*m!JIJi@/lcD*d%pIl>6C+TI*JL&?S=:q^AQuqW8@Fc/
1aj&QB nEK=!J^ITja#XH^Ftk&TcY$NJNt1\ECBP?>cV/:tkWacq=p$Mwb!$1V5QKiNbBd!j4DduA#&+I5?aC5#
PF%bNI a?%%T+nIcA@l$4Cq?ReyyVAJb$&yaliFpZ9RY*a+1VMPDk/:>i&E=4+WV!Z9nk1Ga>J/FIdq/>cqWbGS
Kd+QZd %5$w?cqy5FF@T\WMRDlEVSnEylYhdGIuhm/ASYt*!wbpFS>LPXBbwnchw+1RD5tA+^@C+*?+GTD=L$D1
e@jSh@ RB9^wm*+K/AW!abSncNCc14GytTwEGG1lwNe=cI9t5HwAST6apC@GZPkwWA4A5kbLRkDm^!%En<kPDuu
+MQ&$Y m4G^<m4=J\AFJSCpJ*BPMH6JKj=%86Q5MdIMTjF!F:NA!pj&c8bpD4/Eq^X^6TVG!n#k?T>1^6>1n%yI
LuR1ZH mX1l*1XKZ/ta<GZJ@mi/X\EpLTb4qlZc4Yh/Vy#Tp%Z=mwdaKw+TmV\4kI:bNEDGuTB<HXCG6n%tXVDS
<%<+i? ZwnR8*FtNneESN*qSWGHmDRnMb\5KV5=8b>pCd!$YIR?$dy!8pS4!j5KNa<P1B\kMAp@eAqupm=X$>yQ
XaQ$yu RDIq!EWLu#qRlaHnWeuQS=D=X#L6mBI6\e>GReT+@+Yq/+8FuR5$+be>cqKcKXI#Gtm\HbRmljJTJ&N!
THRCdd d=*S4j5+SZJWa@C^EjJaJ+waW$lw6^=SNZ>4BR&Dk#+Sm>H>duuS^EyaQ+EcJJq^L%1y?ZEVNM1BjJ4J
P%cA!& EmM:EFmRmp8%^JbD1CC%I>qaP$hB6NDF?t+N1X=bDQu\CX9hKI<VpBE=E*H9&dyAqY+&d!apWdkPT=By
X=q>V# XBDYSGEAwnBMp>ceu!#?dH99RhAERbQ=dP\K=9S<nZk/k<LQmR+>*B^h!\?YtDH5\hDiCGdAa!ymhdD!
-ApHem 00037525777001202b4 Page 406 of binaries2.zip
98$&F5 mH?aQFpER+9$\D4EAWZcST\Y+!c8B*d/nRB>W9F/Xta&lnninC%?mq%^##H8tH$$Ajte1=*qlek^^=:Y
j\$5Tn Rt^kMhaSw%IE!4mpSI:cFK*jd<K^<^V>ky@GJM>ke=dWRYjEwLKpM*S9QP\wNiSwPP>aLKKpC&lyEDK$
a>P9u> #X6ZF56EImCSjMC?/PGA@VWlCaXBud*RHL@pnDymAVc9T<ClDZBNLkDKEWDH&$Ru@wI?Rt^D#>uQwEt/
AVeu@8 =X4G1<^AZmn!dH^WR%e%mXRSLE+FkXLImbbkDpP%SY?XC*+p>ZAd1b>wm&m:!!R<&nNiDa/SilJJF%IZ
L5HSkC u<>PwMVAXAWnFI+1##Ly?mWMBpWqA#CAD<d+ZJpa^4KQ%:5uqc45/^DkRWqbKR=QR^@4qHw*Rb*IyPjA
DqX6W8 $VP9w*utytWqbkSFYW=yD*c=PmNDPwK&TwabT/w!ZV%C/4n4T=t@wWk9\BIWG$J>a*6bVd=9aS/8MXC/
Akuu!B 6?JK\mq9SAQD8+^B<5T$#cmCbIERQ$q^#MVTYtbCm+TAmK!TdIlaJDV1JeCwCSM^lGB9E#@9^p5841/1
8E@Dwe Td&*Jpj#D?Y5Tti$LwLJ@16EQh^aNc6T*c&J6AIyXu?>CQW>\mI>8Q484Vc$y>C56\bCpZWRbT/<tIl<
11ua6@ G\8m9ZS<C9T\FcBYRIH=RQSCyFBk>YylZ<:EL&h5J=SYVKV!aZ!@GBQiuj8eRG:l#mT9dGcQ$t&k^An^
$hu9%D VV>jY5^X#CHp^kmpKBCu1>&AmqI\VlF:Dam?t#4N$#ABW&CqASTA1\*Ed+$:?R\bKNc9c\+k/%*!npbW
P5?Z@5 weS1CRkWDepW<+jLY!Ale!S$mF?%ThD</#t9<#?jLI:+wR\mDd=j+yHc&5IcWyCSGXS6$t6a$P/nG$TT
\qb@\t %#A>=M+ZEw6\CWSX=D@kEi#8ha@/K1Jc<bQFp\5a^pmN=/ukdBjMTVL:I@htZ=k6PJclTwH>+Gl+kk@K
M/qp?+ \ym8K1IK+nWIt/?^cC$Elw=T4cuDM5Kc\Xy/huGANyLXc&9TY61aj9X9y<5mMM4CYlN5$RWABkaiC=+D
=H5iey lyhW:c$NBJ^YXqLI6a:Puq=Y:!\cN:>@5/ic&*d6^YKm>JXe@RuNS/B&DaWtCIX&>qFl!9X@R^NE\M\n
elJybb p!RNkCMN\KITSJCRk96@Y9F\yKB9tHe1n?FXbT<P48y4kYY%#iAy%8EXhDXq**XWTiw9Tu4LLhY^hewn
GNeLu< Gk^XRiy$LB@h89pIXcwDc6ncWm%6P1yP?Wq+P5Q@%ZnB8DCpVmV=CJYFa4nk8R*q^?4aGuwRY%i>Y\M/
6MY$p# 1waPSuk/MMG#H?NKi4j/YXyapbmRXAeWV#iN@:K?HKQGZQIbqV@i<C5/&DQ$Q^&n:w>q^i:ibq^EpW&5
&1?+55 T%jSMTH9h&iT/lCPeW<H\Q#JGMW*/ii?=#Ru@+WacD?y*FIKmebKA99$Qb8NcQAjJkic\PD4!B#FX$:<
%Fp&!R FF$wXEn$dhAl@4ykAtGLnp&tacR>%^u95BNSDC4SkVI=$hC5KS9b^IEVB#c%&1aVE>PV\CBj<ZV$I%+M
*d>4h@ <nwVneqQejh#:nPKF<=4ylX<:nb8iSN<%ndRitVGi#m?eHw>6SCd<SjJSNIR%m=@H5ED#qX*PXVY=m5t
FARaJZ &4l:@4pnp$HP1&#!n!ZlKwVmDj:VGZd?IuqLN8=DQS:CiTAZ?&GynTpAl9W?E!u*a%YJyDw\jHM$ypnG
yRB8T1 utN^KMci@dtJ*B9H6P5m*DG**H9CYSle<4?IZ?w@jD^u9n::JV?8?iLq:jJ\#NV=QD^Z%hSaTXG5c&6J
5j5/6D +L1+&FlyLT%4iqqbcYu=RT/uq=YFe%XhESykaA1T/JaR1SBB/JbR+&BkCaYXVYBd@:eJ\!BF%XQDVeSW
w%$&N@ XETEA@D+K\X#6eN+4Bw4XQA%MZV:Rl\e:T>>4en*ae=JLH:^D^Bn+R<yJw\c*JkqB*@DG#j$/CY$@>?b
>kIV99 WYk9k><Tn\h*@?@<1LVHj@\q##Eqk<dj*Pj?/iLJ%@cE:ln#W=!dY*@VZJ%ehK69>L?KaTGJWn8Fy+W$
^V6c9# W&a/%Ke?NGmba#wWu9FD1/?SyR%q4&E!Z&b9ylJqJuEJDyMi!mR#td$?NL91q/*9?y&9+W$PHG8t$EC8
hS/mbS CY6!/*EybJn$Y/QRd=kT1+uw6<+LF956CGWN%!:&?#9APpFD4BXh^j1Bk&dyVLaWlV&QR&LSm^Yha#J$
Wpyc@X SjH6WLA*4wKIq1Dj=n<&YkG*1G1RL#L=yC^Y+%BkDa5kX151a6&clX@>NyF&u&9Y%eT\XIpAZAq9pEL/
q#*HGH WapIQBYc?DFh4>jA5FS:<mFhlAnISStnTm#TW=LdDFY=y6$!>RGjN1ajD!=ClwAEjh9wFY$NWcadShdV
t<RiEK nYqZRlQVV>AZIePMBE@R?j1pDhb:PBM@TY5^#SnuM6Qi!W5YB>4@V44\aZmh/EN+uSRyHW6i?R&A8+T<
tkpD&i F?qRh\bp\m?a#8L</154:k\%^4pNe\tT1F!jnaQH^kTu4kA#HSM9KKZAh8:SJ*D?I*4MTuA!FLDWKJN9
ApJLR4 QQhHWI%S>DV<q>nmpH>^b?NkC$%ajEF/Kwp@c=*P:5A5#4&tyYajMVwnI$J5/RWtd\RZ@PRZGF$!y6ku
Z%F8GA FM%lbQec&>q+IXPt&FNRl9<+^WwX4+DP:8yPaKa=DZi@F?@8&pLQI=#KCID4BMZD5ejWVLTGW8kaAh8=
q+i=KV &q4jPZ+qe=JHh&eJHRKY*AnKFw\aB#^#n/iWnb!?$CP$aiHeY1h\m%B4B/$bh#?nbLZSiQ^*Ij6S!pYD
#@BMF+ pj/F5@9H++l%MN&P:#eW#WFN86ZGQt!HinXHe<#IJdwBdY!H*tVulF?%ZJ$IIKHePJ5BajKX>Pm^^%:y
@KMYVj \qh:4t69lGlYd?DAT/bHnuZM88HY9=*Ftp%Vi:tY!8QIBi$=@LIZLW:i1LAEZ>i?KX>+SK+hL?e+!q*w
6l:\<4 HeeP\A%Sjh48JFi<w#>a/n6S$HeEdpVH>/a4mW1Y/I+iMuQt4JDKA$ItiQTDW^tKmXVb*aqD+e58jeki
%Ld@:b VJI4%m>GKuX<9bND!=PSq:a@n=\8MtR*KcFX\mRc8@YJDt9hdFcnTA5KFABMui@CSj4IWyb\d>Z4a#4e
au+1yT 8e9kCiu/\&dWZ:/p%?Zk+&EWLw8ET6iEFBpp$R=t&JutM#N5G*J6D^JHk=SanK8hYN!6+WJTe5nn8wGS
M^uk^6 \%8I+LndWiejA=%hY*j5tq>5V1eMIpu98D6LKay+A1j*M95?/A@A*94IBLGNVT$lWWp6XMY!?C=K<PnH
>?aI<p >8lW%Mjj>K/%S9KL1JuEDD5%NYj:5XcXD119T:#WZ=h?HEu$/:I+>WatnDS??VdkAKPSj@Bde+uRF\<e
YMhHjE TSj<Z/nKc:B5Gb>N8tJ$TEDl\#!bFWlP#jlkyQHHQRFLL5IccmXCCSP\*:VJCE1:=L9:VaJX5l!/ZaLX
G8?9:c J?*bD1MJLe1Y4qPt1>q$J89#wZ+<8Rc?W<:$9bN8\Q:DuS$:N4&4i>d$984$$E>uuklc^pMQh\V6AaI6
w9$h1& KwRVqTJW+4+:+!lFhnuWhRyKYPtMA:1tqy!WV4>L1S4NDyKQT<Y+6WcL?Snj$+Iq@8Ra\lcC=N&t&:CF
^YmdhL e6y^iT:dV*NVY@%D%cSwkpnRSGkP/uV8LR9EBYEX1^8GPInQGS&JRHY4y*9ejtY6b/IiakVWZyW=LCyG
E1t^Bt ^NFPpRNKcuWB!RE*<X1k*tTqSEQ$NdEaA#:=KC=X1YkBT&y1JE<%mcqBmF9Ih!HSBNQKuK%T:\A#mSVM
d18n^/ N9RKT:9n?D#:t>EVcYKqW/^wqLEBmEBut5BiFW<GSjXaC9WqT<b<<b?H/P:\@AGSp<J*@ayFCmq5Muik
W%A$@d VPd/X*6X9cElNdqbNjGFW!R1Rw9tM\wFh=ltI>W6/=<LRdtnyAaemdhWMKEX$VyMaTb5<Z*Mm/:tC%bZ
WLbG:w K?ywG>ai+8V&65aLCkPQA#alRB41D9eV9mKcaZE4Btm1?GKPHAAqyZHbKk15l<@YBF16FFKyqTchcckc
j6pAH> uSALj*R<Q1E15>%e#$>V@b>N*cZ1%?LV&#?FYcQm!Ij*+JTZ$RTXTey8K6!HVJ&HGXpRcIL*MIREm9&h
aTL6D4 KyA54L44mmNwWZ*L5C*8Ny$%<lVpq!\uT<MjCyRZT*JcYwe91WMd1/P++1F^8wJ8?bk%SKcmqewwZQIM
Hu?aRE ewZWNCwV<FIK1H^M1NT1#9#NP1FlX>jwKqQqF+Sc=9$>9T^VT<aiK/$atXNVt?Z>=mJYEw\iGkc=Bu<8
G$@K!W n<F!>A>1cHnP=NyB?ib4aat:LSc14a4EXVwXRPiKPHku%+EL*e5&ejul!Wd8>8W:MEeJ*\ia</BIYI$#
=L^G^i L\yX\TtZ*\c&5kiS&nHmy!8ecT5t+XBGCDnFGEpcbYYn@$IyKMiAK*P<b<j4n?YVpcI^c1Ey?K9ppMqq
t>6y5V 1w@mtXQK<RTR\ZSAc@Q#P!q58SG&dSwc4ykbCdSmC!>+NQ>m9kY#^&%cdJy\W8&QW4R%$FLiR1nX$p$?
uiFCG> T=YnIiY+?@tCuI8Vp^*I!j&=G+AV<F?!kQN@y$9>h::W=@FT*F\5:J!5ZJ>uRHH>D#k?!9?PwRJ<959@
jGSa/d 9&#Cj?W@?8<F@Iic@#S^eLL>%?L/Q@^j+YLq=8D?H*B\A#nbPFqaPQ?@!MdJ?wq5@$@=D#p=kS?nQpc!
Vt!GPu eZJ!e:L@S^@!S<ZPDtV=VDX\A>k@$^me4B@X=\aEq5<GN#5d<MM%h5:QE/:aPVnaQyMAu>M+Q45?NQ!u
@8KqwW <EML/*@%S?EEeLF\e4N^ekP=Ah\AADedkI8L>dP\AFp=&Lqa@leAd9dQj#H$GbHQDSSedB>la8Qma8H?
EY+Ya! mPkHKHC^tqFXl/NccPH%:\TKI@QZ6BlkCRmGYtElP%LE9SbM%NeS=ZBBp>W4ApCRiE4+pyeuTqlIQVIA
%!=Kd6 ZlB>?SN95KHA?q@=@G>*?N&BTP?I\VX#y>\NX45Z5:Ca/\e<e5yuSNu!<&AKLFGJSHLp$K^E!/#h6*/K
5Yen<\ 9QLKIk6T<9+Cj@kd+%9Di\8aIJ$P\^MR&/>@K&H!WjXH151>jd?6wFYZb<6A%Tk6j$baw%KcjhjJSWW#
Y<Mu+A 5MIDtdXhI6^6WndYYPEH#!K:nNY#W$^!IaQL\QH&#pi<$E:MjyPH/4k:a!KWd/=aRy!wH=NHqd\KP9V1
Qu5SEA eZG=N98&/G^%WBC%<%11qdSSFdNGq1l54+MKcaMVZHypecI&i>j#yVuFbRJY+y4*FLECSSM#C^5wm@@X
^Ihy5P ti@RbaM5iK1Ypwq\Km<4GBB=Bdal1H?y/#e4=X=RGd6!XPeS\+a*^t\np!5$a4j&GNWZF$^LII!p5:4L
TqICSZ /hy8GBSaE\/lpXBHlnHY#KTRRNJ?He!\+EMnplkhmc<LLnIn$Ve*QcAA\nw4qNSHI%1k/@StDBEy=n>u
dQl\aM L!dqFtVy#+YWjiT>yj:D!HZMPcFnl+qllQK9dwXK!5@mhJe\tDMFGn^DQhbtBd8eqp8\h/myN>%ZM%1t
j8=m<! +y<Z5lqt/nJka1/#twFLi:W4!ZN=>ueK?!:TlmGTI!WRuN?lH89?4mEK=ctjQXBidCSlHJ=t1\tZMqA+
4=yXu& niT:XSJtm@MB<X\<qP9l8Wh%ac#9Fkcm$GHHdb/4Z4q\?wp!ui^=t>qZt^SCCi81y^1$pIBtE4I@hPKk
+RyEej :m\8pXEhSHynWeEdAGX$\y?$GQ%n&hPeXD5EIp>t@lnhyRKZ=:+b/\G*5!Sm*5JmiJKk4#ACK?&<GkdA
1DVCE1 5It4SG\#6pd@IL$jLC9hydFcBjwquIC#??pR!4Vk\NyuKahu6tC8&I4W8MR\9&/m=JAj1ZtlCNDRcuT>
N%9QA9 JZ\nTC:inMk*iJ%+*X9=BAZ<Eyd=NEhHQ^cM$CP:J&lL1K%J%Q\yhR/5?D6yIWq:CpBmIWFJ9DqtbkXG
-AtG8w 0004ef3be8c001202b4 Page 407 of binaries2.zip
<IW1\! ?6=j9ht!W!iLyw=Q@#?M@ZN<Ze**MA!udb1p5hQ\^Gl5&&=5NLdN6nFQdKP^dh8&dX9QTc@4?>N:@@G8
kHNNYd &Z6t%y4qtV&#&*:P4pKqS^Q@yR9e<MBkVBu+X+p@w#YG#^*?!AN6cYJttIt@#RVkCenTFaFa8JweDtR*
Gj9%uF eB#uim%A?&qb&wEWDpYb61!p>M@WcB==PjD:Cy*k<Elww*tGpak^uIH!BDTPTd:u$XG?8DHk1yF^N6cA
w+cVQd HH8htQX^4GHnWEMNMb1MTi1#@wYpSTM*C:iMLNQ$/kte4kV::QXMq=^k6nRhZ<#QFNIjJL6MDGGt#4=N
H9K6Mk ^9q^kSuA:V8w1Fh*/<MtQi6^He#c$5XIepZ4@5klYGHNPX@FmVE#!/$kSeDp5!VWQ=cNRF%MEWlW:n>5
!w1mEc pC&m6&*n*DhbZ$$kF^^?^Q?VX?wZuYAC^:nDLH=a\Ni8RJJAF%=T5am6<we>68^:c*w4i89!GQi*=IIY
TjZ@h8 myEh+q?+H*?Fm=qBXe$l?thi<InjW4B$jQ&mQ$:qdI:wEe//cQ\nBV#QFuXZeFG%miH\$$?PW*m\MYPA
C&aeuJ a4TdJ*\\JqiYT*DRXGSiPKQu4^/YZ^KWm4h&I1uI<wPjcW%>5&J9#BT+Q8&aa/BN^1E1G*EijDV8c5!X
9!1MnS MB$Rc*#CTy=BI%XGY>&ZRK8>M5$6?DQ#W6t9*/X$6Lm4BXNkN1WC+YdWjQjuXPkPZ!lyZ&Zk$6+?B^X<
pSMNyw ?t94NL8BkmXjnKcmLHXPXujw1A#lqIM5e*kG8SqT*KejVcQh&JMcVZHh\^k89blaDJGqWEm5$1T&9=aX
:i\XZu BP98MR<ZaNIqS/yIBFFZD*X&P>i68wlw=S6QWplZGQY*tiFSYn=CjB@GXFZ<LH6R\M1BKt/$8pySm=+^
4Zc=1! VDujy$tpqmM6nW*#Mjb+iLHEQq\%cEk\X#wbF?p5wN?B=eiW@*:m%R#VqXS=8SISB<1?/hmHl4uJQT9S
+D%CWM 6IPQ4VR9FuFeWSeLFHn5B:d&yaqGt*piN&IHMl6>ZI%JJTnL/5wa=F4*A@AIVp/mw8PwPZiHRTN+RZYQ
/Nel:Q JIh=+!8+!B::#41b*\tJ=&#J#LD+#p!#6!I$>A:wVPe1pyJ#H8=l:Ay!FpIlAj8ZIw:m6<K6Wk++B&+E
T*aS51 hT8#?nQqe:w@Yk^mntTt*M+Mj?#9<>b%NHR61<8X>$6?EL#6eF<n4qNY66B$9jAS:LZA\Cc&u\9HQNqy
+kS:Wl #:9CP?E#Tcw9hF!hWR>mCCQ:awA59>#hFl=@PICSTXIX?1MqeT^uNtcu&4/iDTX5ECi^>RG<i>6SM<dY
uy#kRw PcGQkCSRcmDdpQTiiwJ<?+8$E>YLQ?IP::JIpQh*T=+<JTKF5eFPjn4KZH+9M?H1PIM>$8VIuJCd9Q\Y
u6w!6A kZ*VC9uy>j$kS4M@nke>!w&jbLY!i$+I\IHJk$wq<^*^SGTJCKT6$LTDRI+R4:$FpXWY&F?8KSk=k:d<
KGBm1> Tb+lRSRcu:u*BSZbwWW@Qpbi@V+p>N\>%T+j$%I+a@>RkqGjJ$DiA6Mc/y<1>>GqlD^LK&5ttSHQJmCn
9R+h?% kENWWPw8%PWY#Rmli4WlT9wnW\HVFJd>><YM#IJ8$yK=pcm1ha>N9&G66^M>?5+&n:eK>PD^dS\#M68D
h%\*:V k\FbJb\nE#%Fyj!It^5\</$a?\\J$%qu@AmnK8Q96nBSPRPL@BaRL>@auAKnltXpl9%K@W8S+$:Si<6?
LQD&>F e=@m><tRL51R6qk4B?t=$SYIHa9L8MmI>H@uY=Ea=549HX#9VP::PpV$*dQh4GCk%$G&jA*8i86e^MZ<
y8!TMD 5PnR/Xtcc!w$4ZlE5?Vd4IVbwl*^S\YJ:hLR@S++w5?jS16ISnQIeedAX#+jhQKGiDGhbt!iyN#u+/#1
EAtFed L%?XqhND^nlHCLXcmeJB^u<w#4nLGd:dYl/*1d**6+ej<@WjwL9ak+e+T?Ib!!m%#pqA!B>DKG$B1n:S
?KS9Q+ jIcpt>Wk@B/e6W8VHWj>Y==YQ<&yW=GPn?>6&+Z+M#KZuli$V!NF9\qXN4HQLy*WH#4+jTqwitKwdt%G
C/1/WS A#&SdlMS\VKWLl#mn>@yP/XE?$9RSLdkBZuk<R@HdGJlTw+?&GT6@%F>HqXipkanG>k8EL4$6M*SStD+
cZYKVW IZ#LH@#^Cl\I*e*$PZDd&:dWqt<\6imu6P?l?Qwqd</$:AHHWn/Q?Mjdq4N/q<>%/QVpIl?yWY\b%CdB
?!+MQ= PE\iMA!eID@ie61K$YjneTDJM$R1?:duw6Md5j6aw*i%aTB^+tiyl\kwWt!l*\dBc+XQM&:1dSw?Q!Di
QPA<aH h8YpSiXAMhqp#Fkwb=J8ZwAQ\\aWe89&qym!jRbdnC4^+CHV9CLjX:K\GlGP5L@ad!Vy9+Xy>5<+d9c>
VXiwL< #S%4%>Rd9cPFXSH4IC=H*nVbF^RTcP@cFN1Bq/e=4>auJ^iQtVRd6eCjbJb6nVk59htKtRL&uyCduiVM
uC:d$5 T9M6\8&nL=G<M8&k!?aIJH@GpT@DX!wn%4FEVBWYGw1/XkJQW%JAq4EY5j$p5:lHi94bZ%bY$bw?thTp
#>J//a XT5!k?9kt/Dw46H*\ZcSu+==q\FZ<1N?mJW?t#hp<K:Ctq6!1E/d%\c:6KSl>:+Vh#Vp16???:yYmXlS
Du:bmW c^H9/pQ*D+yZ/yD=Q81E@a+!Qk$QSIM^RCEqc=a5$tEuw1iMVuCk5FCA$FYe#MaTluj=u5=1iiyKFk<y
Y5N9^Q $RCZ^dF=iWl=6LwQ<&nF&EQT@n&eBFENHEwmY=IPcwu^SIt#56I\HIH$YJ>>5kiHmu\^5L>8uMH$16lE
\9c:1D 6wJGV!BBD5?CCHudDyFM9@L+1D8bNJR9B5#PAMiBCW4l$?QeYA+^eV=5Be1ujJ:CuX\i+e1*W&et1qS&
d9Fw$+ KHHKu#ttIq!#AY!9RniM\PQtK8I?16qlJn>?jW4m5AWaP@u&5LS&wdSjKNM<qMS!+FAq?48ip?1dB9DD
wy<CVK +DVEPin<&heR\!b<hw%mP#A\h14T%8X5NE?CX*/RWeJ5ShYGnK*Fw:/M^+%C8/mD?b:pjcT<SRRmPW^\
JL^%9e D4d<$IW5k/W&JE8m9b&bMV+K56B*St1WQ\>L\deEQ:@Kp#^kw\/IC+hD@a!ZH#\9QPtAp>X#kceFBLpV
9uYyEp V6CmSDKnIH>BPhA8p^NFLWBt?JnQwG>JTAF8KlyIa$iJutNMSG?JIcAi:i8Keau^qcmLKhA5>@5h<%DW
D%LAu6 6FWWD#u1DB$t$@hA@@K+\IqYwjN\ZWjXd$WaYqPne1R\CA+/XDFdYq9*5#jdPYeXBBCV8nD=b$iKSiX8
e?Bq$% =iSnQLX\<NAnVH>$5GVW=*W*5QwHBed<6Wqm+jM6eTdclY/bQmMNKPXp*h6Pep@MT556Kq/5K>D9!i1%
iuemaj R6JjKEV:?1Gn4$MV<hIPeMFt%Rb>p!hV6+%YD89c4CnNILQ<aMC5&FW>bJKD/1PIyEZ4$JVVR^t8?6&A
%+je*m mb6wX1^Lly8&uES+ZNV&W4@tk$bk?W&QPe*wBKXTm\qmucdm5JyR$9eRAX+BKXpVL<@iV%bGpQwM<Rwj
tFew<h qTXuB>h1$d/VmlA:<pPL>qBGR\Rw\L+MPhKnwC9aa<$HEDAGET5P9Dw\W6D8EM5QZPq<icC@+llG9d$>
VPl%Ln $:HJ#>G@6Z8G\:@D?KwXGYk$>9Q?9A8BnyLp?/M>deJumFm/c#QbCckw!\AIGGLqtl4#WJci51LblSYK
6a*<%W $D&M?6pmmjYcm=ChE8MQwZ95+*At::@FAMMcB<PMyZXj9YF9*=84yj@\aH<\X\&9^dEJKXQw+y*uZ!b#
^aqT1$ tYd+ST^V\HeR^R<cNbQ6i!:W>99Hyh^R@u=/KqP\Q9Q>I%TpX:<Eapm9*:<*>W/ZdW#@5?mXc$blYCJ*
H^#iqI P&P8^HImZ!Q\6/AQ*q=REYkXK8jj1yRDj?C6p9m/8<ShWBE6cA?CcCC&J1Zn5l>+k:e1qdGFeT1XLd:8
M#XqMR WMiW=J&XejKN?IMMwhupk\^^K8X?DpmS<<1mB8/WIMFnT1JKV1J=WbBC*InTRAd8tNI%FPh:+!yXWRJk
I=&Zw& SX4ZXEkq=9G/^?B?<p&wRa?D%K&bmMYdQY<FBYMq=1+6R%MquubdW&YTP%Kmp+LMm+G$9/B4i=\kA?cL
b+lWw? 4kV55d<ZSIQMMWF/5*:51j?d9FCdEiKaWRZD%^?\6*m?RYw^W\jI?4AEceaj=b8kQi1nawe!<:\LGHdG
S!A&nd X>4DBWH$WjBKpMA1R=AVlnh5VlhFi4M+e5*+XQN%8JRYHPia&EBIb9w5?KtYNHhwybFenHZRT!hD!*nn
8^RNZM Y9eDXqV1<@lW@Rbt^c:@%m?1yEQ4nT@^nep%Rd!eBY*Vmd8DymjIlmDyT?tR#LRSR+a^&/<KF$*nD&*L
wl4Yc* a^jhlw\LBZHbIG9/EeMEP\hR&#*n!#a<?lVy5#ncd<@*uwST^9Zy=KA<$AX$LTINHkh$HZ#heR@$q68<
P:>ceH p%:t@SY#%wpnw6B?huu1?<*:hBPRQ9d5wa$\qDQe+NA6?9Q=<hduet?1#ATZ+:ad*yNnC*EuXQ>4L#&w
e=ik$Q /wdZjL#6yj<JBtbFkeAN*k&inEAEbj$VLL\*%kSM<i@9NKDBk6!eHFtWlaWWqaSblATRV<J^Gy#/+G&c
>lW^Lq >Knbt9T*cPdn8TRXaj+Y=lF9aL%t1HwG1GViTddB9Bh9!dd*+uZk9AE1mhaH#yuPij9^49<y4@#PP6PQ
cV%#P^ /Xqc8*@L*5QuXd@XYDThm&h9kP#BjYCn5dT##F4mHJ%69NTF=8MpdJ9a!t!E+aX$+?TJK\/\^Ih+$?Pt
bamCYC ky1BqXYnYLm:?enShBn=eVH5KjB6hm&J?iIDY/CYNV^^B&$J@yBIyVc1PetGTPXBnQt6n\hdc?&TTKW/
!KI/Sn p@q6L4ebe*h<6ycKR=n64hm5bGiaZSEDe:ET%mFu6:q1IjMAk<peJuGaEi9?HCESpYca>6?8wwTNYmXZ
ADi!?5 DRLS$Qj#*nBZQLp!wqH%b@1h5m:5:=5NTj:!\hNe>Np/DYWmDe/@5QbD45CdA%#Y#HDCVKab=buMw\9q
a+<?yN !6JQb898T5!\:G9k&Bj>XhYuGV1u#WPVSSy61dF&p+>4Z1*NMLMq9#@Pb9bWE/qqT#AQV$HNMWwSchYG
kKykqZ Gjtb#DGeEcubHLI+nuenNXccd#h%JbV>@IBh1AlHe&=p5k+tenl\Z$N&*NTSFK6i$bn#bHj/cpX+wd1m
Y>XEkI JwXVXcm%Nn$Y:##<Hic15M9NKB5qXCS5buh%^9>/SMR%QpQj$dD*WK^Tk:$I:8bH&uQaVQ^$TJjlyJi+
q%M8q! TCu&/WXn=jX\c!/?B4jLY+^XeV8/>nh6T8#Ct%W!/F@JP#$wPBIw>Tp^bFLjWeIPHlX%G&#9tLaIl&M%
njK:SC D85PT=/5Ga1</QpEC18/+9/\:STekq>PD*?uKCtqDCD:y4t@>ZBKyPBMFK:eS5tn4a=n\nn#nbRelTbX
PGJY!> ^Zpwa4q>y@>4lkI/8^yn*^=\?YWMV^FPGtuHaA!R^86\^PXFl69Ipd9VV+b*%FbA5iKeJqGu>Vlyy9iA
:MA%^C bicqcWGB$!ShHWakaGaJkcWePyctM*^q6j!6Yw19D:I>N:dln#dLK5&NyD??ZYCQpTu>>XDV/Pe#=pe<
1b9HeI FEV/Lq=5Bbw#c$XVEWDVVPwWha?1ie6R:qe>CD@F>VDQIGY55$lVpc?@B45jKan<9c#LDpT+LCp!>^cK
RZnlel +J#*MB@&i!nP%M8uA^VGJ$\PKn>=G/#BiB8ZnBPuybuSHab!kKun&IGyK$CME^N?J*d@1bBSFey*M=ju
JuI?$e CL\9&WmQRMc4&j#IB+T&WI#Q&uH5G4@@lRdLb@SEXR?:YlP@QeK<lH\e58M<YVyJ\C+j&na\@eBWi<mG
V9K1/4 a/SJSqm/Q:lK%@aJTpbID<I/IC+$JjABGjK#Pu5<\$TcwhI*Na+M:>k5DXEc?^twZH?PkC1N4iiVt9ZB
-A\%Nm 000fa465994001202b4 Page 408 of binaries2.zip
5ku1a@ C9nR!dk!GFmn/TLV6TV$8yLjLp!4S&=4LDGB1JSL/yS$D^/5GMkSilWR^j\6+56c*>j#mD8?YhQlpDBl
JSjqa> i1^6hW>eM@q=BaBBk1FQp!Ddh5VNIYIcQ+HbjtuN@J&TX14YG&eqaYi1Bb#ycmQJPtH1IZ^\^X5PHaep
KtcIGt SS@@?M6TLCSEwaH9y&V\tdwY:B*=^\>@pD=1RV:6\E=lhp=aW@u$#9q/a5\n4>%*m9N<=D@<RQ&tK&&>
FNB=Y! ?yHw59LD?15&+JR\u#e/$ud>CRny$:G?XjQVlk*Z99?Hj%FmjdLb9EJJ\:BkF\@cKRD&ijTaeTQF%6<d
F<BDX+ n+!MXdA<G?aJ!1DSeYwy*6/<9@8&Li!$<LA$Z+Sw#?uu!R#5yu:X&>N!#HcYnLdiI:@9F&$XuW9Jl/kW
VC6+e9 ^hci6#Y>6!Y#*BTcH^c@R8A<@<VCMi5m\d^E:uqH4ZcweQ&=WSPu6>A8:CqVwt6mDkSu:1iP+c^^X/p^
<Y\FXV aLCc$bMj@^4VJLudWu9@\hw!tCEW>&S%ehLcEqm@&<4qL+*id=WB!/&I*lLB%4\489w^i$dH\1J<CiM*
FEqXyG FDm>h:>Lnbyw>F*d4<Jj1pPaRj\V5bJHqP*iITmu^/hlIX<&LI&#bMFbbV?Vp9%eCF&A<?jp<MFA?md6
RbmDmy HatKymcjubZ?$GV%A^H=JB=mR@CLiPeH5AAwVRIhMAJZGiW#tE<aj%1aD#b1*H>lZmETN6>B1anEajDb
+d\hB+ b!iQW&1*?Nu5N@dMcy^tTF\WqaCZ%5lSqwAZ1$&hC+ZmRYpJHGLIYSBEN=SIR=JKh!$6*DKF!a<$QAn@
&h6<9% \5qAG!9q66&^aMjH\B9t%>j\c!L=QVNTc5*>S%PaB@&VX6iZby?WYAjKVQ5ulaaFm$yY4n5c9/YWEqhE
yuLb*D tl%uDp:hD>J4XcH<JNJRND*PbjkQ+5h6^MW>C!^N\he>uyEwGVT+#YXy5V5i!HTR@NtXVXT@GT9ud661
<\Dm&/ Z5yYhmFl4@ka?GLlCK@+/DB%lmF1QTEDAW\t8D>dYT@:+4nKGZ?E>>45G$M1M!IhubRZwT^wYc+wFXW$
?D>Zw* +ZyJR?>?!J>G1PmE4Fj5qS\VCWpAy$ttmGw#E9i^GT$K>VLn&X?^CDTdy9NW\R&dj@^VbIMhhu*=NZRP
@D@D+j CHc5Y/Qp8iw=Z:wWMST@M%VVyFGnY?+nht=b!XPKIa:^=MM1PcQq+?C>LKddCuiL#1eX9=DA>eMjkRYu
i%b$MN *IX4tKINIcMpQ#tXH/\*qt=>I9laSc<iDP9GTML98wu#\5e&?Neyb@%y*+yKV6t+E$L>R!yFSPcLuP+V
Cy5YyR $J^Ed%=6!iju^**hZW/tTNXjFS=W!EtQZ/\GR9DpIYQHKFRG%Wql/Z=p%*#Zd8Jcn=&qdNF/ttk:TX8c
XNL%\K KC1i5FtMuHn+=jd4>$?Dl:5QVb#YHR5RGJ%wy:Rj4nPeHqJl*CQ>q&a+XFb?9>D1FtPMaCqbh:EwBb&=
wm/I+p /eCn+m?5kcE>tj*RRFV>*a%h+W<H1<&tQY+5E$1pNY@@CRPeDmn>4KIB?bP8DA\>\YciP?R89mZp=8Mh
eYwRmq Z<5+4RM5>Tij+%=nm&<\*><RwjEVEkPCAwMCA+PCZBMDA^PTVIMCC%^B8JPSpbFlatBCRqAAmB#w+kJm
FyPFKP AmGB<RHPL5+JL5/8^5/BCWEFIJuE\KDE>=GkAlCc>I/CTtLmP#pw5iC9<5DkaFCdqJmR?E+HAYkpMVA^
+ud&HG PLE\1Yl5@@9V864E$DhS1>4jy=5a%ljG6cJe*RP^b4%6%n>+Xb1YyFpwc91t6>4FFtq^e1%@V4M6J?CJ
d\B!qG ecMbCp4FLud?\c6V*5?=S=:Cqc?$>J1?VT:=SbM:?19n6>wIXFmL6VS4^/&<8lEn:%BC!jSi=VW=F=&i
FZRtyM <+GM@d/4cqY\?kJu+tNaYb%jT$&p?#Vq#I6uwb4dain1<\FP>EICEpJkQcSZ^WnpAp:65@wZD>b=/PqZ
J^iDlw hZSN4lG@Pc$muw+I?^Lm=y9\B:@E^S/#Wi+cChV$Bj1Z/ETC@cKGqbTCR5\4c$cJmXW9=!16@LY\##jD
Nd>E4N DpLnLGT^8D^WiHq@H9B*PywL<$h^k!*N&!^J4V4*HFq#6#^XQF@J%GmLeL!e:G!Q&QGBC&VPAVY8Sn5P
V/w!J> S=6H*C:a%$?pa&$wQ4#NCSMiN>!%MGjW:qw@Yyt++8hM/\^Ybc<B6^Hi@A/A+l9d+e6Cc89STGJIwDbc
5@?iT+ c+Xnqh@MpY^@!cmp%KCSF>SIJVmT<N>jBNPD:8>ku$B%P?kIAiMDhdKCRXWjMR6!MHqYMHupIHutIM+@
ub/E*y q%+k?T<J@C^wjHuRBW:?C^yjIIk<EyyaIAk^T=\+T8KhQ*PRQC9k9jMbyC\D>RMjBS<1^MnQidmIV*yk
?F/qw6 <*A@=\*<Q@*+TRiBD+Z@+ih*CDAINuA\eLB&^QtjmB>@<1G!jRdVSRYH@mAIqkGYnWkPSkj&wS5@A\IM
uWe\H5 tn\:tD\:EB@5/#aWu*:kl\G\hbB<BQJHWVAIHDBaZdAQwS@>\eDaBYDF%wt@k<%@S9*SBT5uCp9ZVW#j
^dnFI1 C+@$4d4@N=Q4@4qM9@=puwTu?8>NIeVFnLR+EwER?a@mjpL1PaWw9wJBFWD$aD:CaGyp^u%IakRKTeXu
aw<6=W D>EQHdCSjBJS=K1JWGIC!yHjM4LF+W/EAmYt\T9p<henTRXRPu%lmMcKEEXnQ@9lbXV#p<mE<h68BH>V
NH:n/Y 9MmG@TwdNBPZCh*>AXd8I\I^W9e?VJR<$4REMJ/a::ekMW@J6J$+dM\*BN?\btLlA8y9PVLIBCSA?WSE
BaFN#k CTVjuBypyE6?jDt<uGhJcFiCn:=mkYV6HYXmRiB&84GWQIu$%@5CIuHMQ@TCpY8CbdJWCDQ16/G*j*Nq
@\+:XR MmmCR>PNd=DVMD$/XJ4PWKDKPi:%w54ywGSIXa4XmAWmtymmdkX#@d4wte8uq9k>SeL:NbcBBFp5<l9W
J+BJt? +&iD+Fn=*MCj>H#+Cwi^FGJ1N+KlDI1WCH??jLp^:9t1Q$AeT<L*\S<Ln54MiXyiI8C45RG=jCn14?8B
+h!mQB :/EM8h>/5jmFdMG#kD!^hF8\hF%\lQlhSWLFtZ%l1kpQQ\mwj%!PE$9m<@ZFmSCy1kuB5?&6mPK+1G:$
YeTA+J +dkI#I4?\e?Wn&M:M=XD@>CHl+t1?#FT\wMkEIeRCn>AHk1XH\4@N\T&Zn+DFD/DGMq$qBnJ^/BQ?!Fl
yPh$!* R1pj\LtwFMZBEdP+I4?Rj6C4u@paJjanTy#aD:!C\!a#SEAeQBwunS/baTbWuAV<QI=i4!W+w?h4XBCJ
&mbAd6 9K@b6t!WbKZBIQF*Rkp%+uRdAZETd6L9Z*NS:%Pl1V8EdVFiTp5ub*TCXI:#i^&H*=:T>HTZF4m1W*=h
6c!wX> CDF^PSSSLl>LQ*4KcB\@>V#EaXbSCL9GV!Ic9qwSGiuLWa+XVNm@hJAh**$66eR5=h=5TN:I&B:WVtD5
D^=+G% nMlaw!64TNT>q:beK*Ga^1*A8+cL<wTm!adeK6BMVw^>P6KqXLN!:XVFi%uBS*Vp!bI>*F+pEQpTZ+hq
>#yMMY y$>cJ&d+T@aJjRj!ktGl/Qi>4cmi#?H#C>**JPFBH5Wdpd1%==!W<*81694ZeJ&t?4^iEV?@ha+mm6+L
&H:jdZ c\1t@YG+%/*X<$i9biF:uul^\dCJa%TE&/G%Q**P//#1Q>^/\=&+Vh@wNaw@L=QFW/?mBDuwi*1=h&lW
5l5kAF 6&@ImVkaciSi\m!+L%u#&LRY%5nDLiEpcK?mNjdetk<u:R?/8IAPWaT?^n$jLFlc:M>F9$wjq?=Rl4Tq
!n!yL4 ?JLI9/wj<ultT*Xc*9V$^b<WNlX$QdpP*S5+G%GSeV$^j8*D&Th1&?9//Be/NN1<HVjtbV#cy8B=eeb^
nKZLP& *8L%ma#5GWYG?bHqVeud!@>dZWbp14*hG+LG55%VWX4*cZGFKV1ibZ4lW+ZNG+/WCSMhjXqN/9B5!c6V
/\RjmT uXeQ/+Z4$^pQ:Ld!WSq^G@ILL?!PVuhQkEu*^>9yP*j6uqd:/4j$*e8!YwnV^&9$Eh9RI59TyNNu/Raw
b=/TQG >QTH5dwLJct$K<#/%4HSn++6hSMX+Y@ZKdlCJW6?4XS$n=SF^q/%npFW!4G^w=RV9$SS5&qc<qJe9XuG
8NpA>9 ?chE4E%i/#C*yp:py^YLyH>aQM!NNia6YWd#<T5Rb\^LhB\iR/>hH$ly!&+*4WnStXHd89QG/@<^C@te
KLId1I =S%1QyJV4P:Et8/HumaeV1nh\<Ghy/F%4XFkFG:yb8Pu:Z#WMP9&b1^XhM$JbKltyFp<kK8wK4cdVEP*
M4l4RH Z:MT/t9kmR/!#Nb96!4XZJ!91X>Va:wp^>nDTiSlBt1!lQVbyq%y:eMQdDN=$Z!GqnL9KHc\LX/X!eNn
=/j#Qk H?4ku*5Rw#!Z9VD</5wl1cwZcZFb*?Qi6F4aaeYcM16KF66ZJ:#I@EIE+>bLGwdN?9K+bV4p5hCtXwcp
a9di$V +kPM^H85yG:bQ=PMtbLR$kq4#eJCYe4V*8Z5cLSRI#Xpum+BqyNQbmXmn/PYhpyI#dJa^X$iiBF^Z*B*
:^N>$k 1Z5&?D*dJ:J>+8K89Zi9LXVZh!Zk%qE?ZXq%Ca>b&/Fj54!qDq:PYW$n6CKMmq6THDq+P+hLCpKYwd6#
b*#@yE p/hJP9mN:mu:qyhp&<!e?YZn#Q4b6Ia>iV<XR5nZlkTjyh=TJJZS/1=E1$8YG>iI$h+iuyjYXRm6/FJ%
ZARh>* MK\Nb8QyeEH#cQmalcabA=*FLNVh1Al*1QGaR+LC$<@eDGEw9kj44p:AD58!!SEZ!t!LLXl9q+lj84h#
bcaBdV +=^b=bquT8F#G\5en=NB5JuF=wFDP5?c<*&h?5#15:>*/41%qiGI6<iLi#\@e@eMVqw!LVB#<1:W$5YJ
\F\&aR ^\1hCkCN#8e1uX1w@1wQi<X$<th&#%B<JPlVn$aXpjP&n!#@mn>HG1PwWBaHy@j?Xl4Bc*\1h$5qZ?eX
!4G6bF =V^&!JjwwX:u@BeHuWA#nYe@^StG+HXaRM$Sd@D$E$qb$aNk/lBYi6R\S%KiPhi&cW4PmhbnASBBMbTV
Lcn1n# nBkHKj=de<At9Hn?/c!/A>V9&RQ6Q\Mle%n/H84y4</adnG&XBc<QMwR/V@8hdtQ$k86qnE=Twlp9RAc
jCBS!A QR1e:m5tVktV=!#A?&XBMq11HIeSJn199DieD*+ulyCyZXYJ<^Y#>!@%N>cj=iLy=^b&JeW%c$e=k6J4
dBiSDP ibMDpdw/i9KBX\1TEt=1t<P8RGu6\5&86Y*n=@t^1V:>&y<HqVNCX@ZZuuN%d!Nq:4\N9:j4G4q1E9ta
qhBi#W h!G6nuyQe4JlmETXHG@uZM4:dXwwWTd<*6S*8K6$D=bKV%uBdI!u6I?LeGwnYL<e*:A&CG*q4BZEN&51
G?/R9& TD>Zt/TRLpd$J5C$61S8G!h4n^K6ml^+$//YejlpK@/a1jE?1wp1YbWVL*hIYHa=hSF!a+dmLbp+ic8V
tYdLBA #m=>iuk>MZ:JiCDw9lE+MHZ>y91EmN65DWtku!5P4&48ew<*QFYD^B1QBZ=eI4ej+=$i>PPdpDQV^p^&
<=4&St wRq9R41D8jcn\WP&^l4\KNP=!mA9?\YdFAi@/9=JyknqSGVQP:5mcWcE:?dmi<9b5k5kLCiN6?k&PD!X
luJ=&T j9*Z1Tuj^DuKVtWb^G=S$Ri^$ynn\+ah!=F+:elYDep$H1Y8kJuckW=NT@MZM9$\TE=Ep?i19ES48M4B
a$ZN<W KcM&^Ye5?lJZ%yFWE$5YHKt!hPbY#91^MhNtYmj:qSMaR+nG\=pD!^D#:9nRqiKLlaY#?:+LS*CtKjNF
+*>R^c *h+ZK1tPVw<d4Xj4ePi%F:/%=/jW#FK%5#C=CpDt\YD<hZh#RNJ4QI9DVATQ%F4L^c4c?B^NipnSLw=a
?p%!kE M>KIEK>#%/qIR&@ZtjB>&?wjqN8d=ShKyhG6Z@W4Jke<6Mhw+YdddMe#15c\R?!54QcN?q+Ddk@Sp/&e
-ADkKH 00089f8bd80001202b4 Page 409 of binaries2.zip
!$<SPG nJl$:IFydd?ZiWieL!hRp1u*kq<WA9*AFN4iBD<mT5E4Ctt#II&S/6A$=WY5h:8X#yVwLHF4J19c1*p\
F9\N@8 c9*b+4@5Y*P1R*>VX+\CCMYe&cl=aL@h#m>Y^iGKit@N98mj4nc5=4GY8bT=:Fh/n>^?mVVX?c:Zwdl>
!!QVKK ?u9keHk%\W4&/+NQGZ@=LWFbnRc6n=Kn!e%RX@l=#aLKKP64m4Z^lc6l$/A\W%*Tp1/Gb<upJZyEbu:u
iC4Y9i L@YtT&8Y9Ncy#*^EGyj!6D%L^?Y1C//q5t8a#q9ZnXQ:Fy!$ukW$q&iyQ6<E=cPR\m8N4$++6?n%/Eyy
hj#iQ@ SQZtKPk/5GNSF>6?=!Y&qdiP5VkXaDA*YDjDV/!SZBuXQLpd9ZA1pR:wI$p9mnZ%c%yNqbe9Xm4Rq!>Q
\F5cJd */t$YXb:HXmq*eXh\EAG/X=%Y$RLc96kR/=ib=ydq8wXlI!\8&8G1\1%mmeamG:aBV9C*9FHBYjM\QJp
6IhFeV ?@hE:*pqbBcp:I4Z%ZEc4SLQ>/c!pu8e/\R*>y<huNaiD6l4Jk@/PP*Ipm$LwqG&:JZ\$aFiiZ:aQPiy
4P95h: tMe#/Nq#jH%^e:51$!D>pyAk:Yeaay\diEjJatea=QY1MlZi4Z5aY^YmK5M$V?tJFa4?nWwbB:EA5H?N
4&PE+k Gq\N?FVZVF+!d^/aik@\TwY&4NLdk/W&La6Z5JbQ68TuDI\+\9VdGuG<W1ee?cZybXju9G5!%JiG95nk
@&aR^S NNe#$QX6wQR$&QVp6tD1!t1WSdhVdhPibp+8VMcSC4IM:uRT:qZ>Zka6=<@C49HReXwk++8K?kWL?%V8
dn!A=y k+16me^A6?TaZk9VaWM%pdW4=9JGwnL6LQnbTdF#Rb?P8e/?A\N+cZ@ukwFH<W6iTGGD\1q&A4J=?MKI
K#<jNS \?TpqjIdN>F4h9VnNhJ/<9Pp/P4F+TyaAIR=5Z^6m:u=+u!Lyj551PiljhhKH*yaW<8a9Qc%%@GQ^mne
\#Ge=@ TRVLdQ9:@%KC@apQM=dc\=n%^ip+<hq4$?^66!#4K<Elt<%G%*j:AHkeh5&N46m8AHkXNy5ht+*BQZke
weC&6c NnN&VVdREFa+qp<A9M%8iJ%&u$ikkBABIYIpqJk95RCKL^qeNMFHB&IBbII9%KVXTbQt+lG@PKSNS11J
Vw8PpE 1=QGw$Bw!biayQFEAeu*ApKwRRX^Z>uRTMFY85hI&hCkJt4Y<F&WYICBp1R+Lq1h$XS6%6BIYXKN?p5M
NX=Xm$ eVX^DW8JRR$bCHqZQ&H<4pb/TH49*w+DwFRe#yM*a$+W\8FPdh\%@%lmaLe@yqRM@DR:qnV4Ei:nbc/G
dt1ZYy $$k*EVW4C8D*MctJ*DltKXL:?ycbq\nX9?*GMFlm+GI9c6AkG#S88165^PGG4mbjSj>EH/ha^JK?wD6b
XQDJmE E>p*dV%eQP\%nGWwd+^u<X+VnXjEFk<Pq*pDlJkaE5ZY:Z@wj#Pp56\6HnhWT#naN@tlQ6#V^?KP6t!:
WCYVc9 P/dZXDE%QDFei8!=aKT$dL8j%19Ah1%9y=p4L?\?h8InEb9\h59I4$D^>TXlBK&+:=C>*Ew!yqB5!JuG
6HE<G5 RwV^umF!cF?Xqimmi=jP$m+!QH4eTnRqZDTdTYXWqMa9mjhZVE?XebFJ:GL5a5D/&@C%^Iu%C*<8^Qh+
yP6wTA G4<+R#ZY=t55Piml!EQX#q\D*XQ$dJ%qD:I8BjeIi<TkD&=*<Z\nhbGE^9dY=Gc+1iEceFTcWDA#HIh$
SGEGWj diJY@wjVM$i^=@cLq^<#G4L?^L%kHaqFaQC$5y:lCc%&YHFj+Lh<q!d!V6dpup$KlZW4F=c/^#CqC<Kb
&MHV1W D+Bb*@1\t@*S:HhY=k\Gy@CQbManh\?ud5$dil1ii$+bTF<XJmValTVMw\Z!TMY9?VRtbB4?d:I%ZWqe
Dq+lah uaTPXZ\VjdGQwyGEJQ=ZqPw<T>KCN>$nEISb5NP5@c=jA$P%Q+@dZNJQ/NHcX6aLBi@&nIRmnmT8/l1G
eaa>wW YnI&L/kp>VX*e4lkcF:yP\aH/YFi$9mpCRZVcpQIEk4dm&ydk%#9ZX=I@*l!SmnKR5nb?*I9FE^n:S!H
t$wF?A RCkeHPA$hNeelCwTHI>*u=CN*MZ6DqP*#4Q\6YdiktcTK!k<EtXj:+i9YEcapPImc=>Gj:L\CQwKVPwV
n*6Ku< VNN6>%Vt:&^ETjSN%Qb&q&iw?nM&uS^ZbCLXIjkVAMFYj!RcPP*X:JMqulqhn=w^#CpAtZ&?L?\T:=Ja
>E*+q! &Dl8^TWq+S5NK>+Fab%Lb<JZBMA9ZLaWYCqa!JVA^qaD5i8FRJCkm:D1&IhXa4EpE</H>udZ4RdYFIM4
WCc/hy nd/E4<Gl8n%nVXy*ZEFIaWLKyCFn>GiE\lmJ=hu>pa^9@l!4R8Eubp9:Q%A/S=c6%+Ba^/*\RYknA*yb
HqT4G6 1?:4ZJ/XLFtElBuFi4Rw!MVCSyb/h#B*iLw@%9X@:*t\HIQmTF#5CEW:d>&LJF4YN1H1cCWCSZK+h4A6
!JmPwm q4k5+G5>tb+?N8BNiHQ<??bipBi+b4ZTSKaDuLQ1d!6::#8hLNXbDe#hkwG>?TH\aWamC5Aep<Z>BK8b
#:5IGD 5cMD\\b<lMX9l^tMJ*e&WFR&EnJTElbYPmLTD>*h+!q@CA:@Rb?Ru*hmZpGHGX#&?A4tH%S>&ZAQDB8Y
e<4T*9 LndcV4j^h:KbS6BXwWHuaNFeF8qhW>w$b#RH6B&FQ&WtA8E$nVkVt8CaqQ^/W*TXJ=MNtK*MHiN@#e4Q
%</V%a 1LJcZ/jQ1RidJih<RX*$?FNR*#4CA=&@h4w%XKiP5$a6%/*$De$@j*F#kN1Xy@:dN<6l%wuiJHED%BqM
*b^<4R &S&$5n<taVk/AjG=6d+NtdNWyPMBB+/?ih:FZ>bi*%ae6qndVpyJh5lME\TtMX:cNu9Di?^YYNbc1e<D
9%XcwS HQTh!BddQMZ&p1n:VDDPYbB:IWcuKF>jQlilBAWjlW?WRk5HY\wwTyJM@Z:V@C*6naZ!attMiVRIuj^Y
WQb:9< Y*m:IkjH^ph</Q:Lcn^jFp&D<DZe!KDM&/M9yCm\d?cb%>1*y*S$<Ih5^ZS#YJ*Q!\#b?LAKA86=9JLQ
ei$pLT A6u6A+6@AIQm9d5Z4XAdNTAH%>DdQC>6+^W8Y\SQ4&nC#VlqbtqXY6KSY6CF>9N/Y%ZDY5W6V!j/mpJ1
QN=5VT i9Tqq$:Sp^ca#G\>^5h%ueJR^%!5wnt!!*WQlF@nXllKWtTFyVAhL4RuV/mmS:PyTuq66D9QdZI\Raj:
i<QeZR WaW8pGD4kP!uGYHEmLVBSK5X%8=d:qja^d$5Sh$^>@8tXhwmB%^e&&#1VJ=6$i>4GEGe@chpcSK8991#
BF\+?P Z4^uww#QDI%49u>aWi&*pIKN@aNnH==bI&DlYBJYW%tt=\%Jj<VD?E8:btQ+eWCmZ=Ey?SZA<^Sd+HF?
hk5iEe X>DjEJMRd6u9KTD1LwiSMA6S<A#YVKCtY/cSCHc@yFbcJREC4jNQZHDtw<++$?6KISu#5&J1h9mk=S?&
aph@EN nGSIXAi%cZ8&e#?9l8@QwNtPm6PbGGb+RQ!cQ6W=mQ5cL@y:wG6Ry%chMR=DV%Y!^a@&WZLI:8HN8E$+
!6wXVt Yk!%uPA^C4b\=hPMnBa*YmSPHT*lVLQ9Yn4JJB&V$i8wJ4Et*8%#EnX6\ewJR46nkWnEFm*@nVFn%HSB
JI6J8h :8dNWj+SGiHP+Q1/lYVewa6=jDqYc4@FyeHHq>bQ4id$5u=q&4RHZ/c+Bp^!=^RuP#/?NKdTPyF5:tS#
EXKC6t Ra/XKY^nSB1KbD9Twy::69DE&m4Qt$<58MpXLEL!*VA1hA:NmK9hjZ@JLPZXWBcPnVFb>dqHeG?GnQRa
GF8+YA YYN*=F!tqnuIkGjV9nl$^JdeXbF@aYn^qnHDCJtIK!l!=F^q>=A/hJccNRB<6wIPZ8jbpFl^SNiKPI=1
apcPt# ^M5#mKICQFt:=u8tmM?y%\%=jYyWaYT@#HcBZalC%Ih!54#4$9E*Xab?Ht94!MP8&hQEDm9h*XQSqt4h
S1<!uS E6/=<^aYLSaY@T=@+dWjMtEwEyiARZK>d>GWZWZWT9&h9EqI5^yB^icaM/6?aXlayJTYay%pV^1##NJR
G:A=qJ J@%u<tu&eCM^uCIn&!hMEl%4j>a@#4>NR\$mw!V5^AbIawp4!\qtSeTyY8wbIqb4R!lHE<eNwkcn%B#y
4\eHMC tJbWB+mI+$jEG9XB6RlnKT>5qA=*pB*EP=GjmBQIIP+lVqZ\41K^4?N=:Qp/tEHeWJ!1>YN4l<m@A#q^
BqM&L& mqGD>?mItQ+uTk!T9*p/CujFqbVV&E&?yJayTZqiqDJIFCa<kZ1Fj*mKm#*XXB<4K&+M>R<H?&bmkWYW
>Nqq:: AGZq@$p?\\bh+4c%QBi%QLMI?Ti/Fdjq1p?1XJ:F/D!#MAC6/Ziy5k@/S?$/QPja^cqih9yW^b+8<EbL
aZBn%i y/S@k=KZ@Qd8adGuk*PkRuaJ+ZCW@1E+5ICWb?EtpWRD%4Q1mpGm>88Vph9@=ua:qjR\BGuYG1AiBnq!
:W=G/q %ICh?B=Z*=!nAd8IPQ*Nmlw+jbVcLpyn*4/G8ejA6@qY%wGE+Tlu^c9qZuG11md8pF+nu8K1Q<<LWKCM
>BQdad l4=4@p>wY/a$LH&4j/@FD9*@G>H@D9@@tSZm98qwkL!WJ<kN+4/=WFZPb4&J&619n^iBCM>q^AQ@NRqS
lA^DQ6 c1yQ^$\G<iWVWhyhI8L8eJkp^<#H/%EMakQE$RB6i9?9c^MR?pi>?C6%b\hSI8Ka:@q\/alTKkhy^TRG
<1QZ#J Yh4CP\@/*?yPZPGa\$F#4u?$ia&@8@ZKCNJV*u/H?!6K>t6npp5*c6wYJ!ml!E4qWTY?5SdEeew<#V?A
Gj^tGa bX@@d!T8:kB6udL6NP&?8jmKt=*n9+V@Sn!H4wbPjt9@9$d9iIC$?phD<+?ZV^u@EHTTLcYYIJB4Ga\j
VSD:b6 =$EnN#G%m*X@q?Zj>Xl^M^h@tc!uPWCtdZAMt9eua1$?ca#R9nWDH?ImpG8$RhN@uZHY9u^1<T\/@Heh
Pljp?T WIJILplNyMNS4y+dT$NuCLkTjZQ!^+LG<19jG8PyWlcSIMTX+T6Gd?tdpXj!IMR^mR&mi<uptt4BB<lC
Cc59:\ /Y?&5MuJnQaV*<%Q%:q4WQWQpMtD8k%YEKhInAA6md:Fij&#TpGAb^T6=$9W%/jnCFDPhXC+@8d11Be$
>Q<@Hq tj+<#j1WY!=hAG$/$BD>#ZT^y!Qq8?Te@Q5TAMtjYNDjkyd8?/V>!&X!qQh8G!M!/Zq>\Zc1\B1n:9iQ
cpGdMq WH%Mp1PmL:FHSe=#bb1\WVe#VT%#KZ@?=?MKE6Y/PWQhIp/nh*b9%l!Pe8qb>4yI?D9QBXcVhYEDWh1N
ED=kn? hj1JSkeJV$hFib%%YSSS:#Meb1ilkSqkcEEQtkZh^yCaAdL+FjPS1hC?PY$6^WMpS8JWX+i:jH1yKMjN
A!alKF @%+V>Hh#!kiuH?*D&mP%p1>uNb8i@8RDl=pKJH88c@G/L/n>q$*Gd>%D8pVL1HS<&Rd:%wCb9GXduieA
GY8HAC !V99/MbCAcuB*DWDAmkBqPIShqIl$ZI=JPljTNClSC4qBEnR\RS!R6@I@aRS<:QRWAY!Ma!8N\uS9u1!
jMLiYq =mIl=y><I9pQHS:l8FV1R%R&QM#^H+F9*F%QbBHB\a=!=?mitFD=iW1AD=Cn$bQ$X\bC*:l9YnXDF4MQ
GLba$> YB+a!JRA+5=>pS^CB$#$lhu\NQh&KwVbt5HAZ!n4+1Dt==XRaNW*mlqln9!K8pY&wBul5LJ6RyBTE8<Q
9tLcGt KIWk:VKFQBDAiSJpSVYcF\EZ\nc^&M9<i@\&6yR:SVW%^uHTIERlC#NS=Een/cF?IeETHPtDMJylR5LT
hCAIjV TDTH\KIe\cAYY4w<Z!G&=Mp6qb>ImJ5Yy*Dhm=\atQuTkd/d%lLH/k99+Zi9^u:XauBV$PKLSASS1RbX
mj1wRC A*<VRqY^JjNA&LLt8u/ytR5WFwXi*dSkMpXDN%q^nVdjK9#4e=+T/tH&=88tTTB:lT%KKiq%^/lqj/w6
-ASwuY 000f7402b6d001202b4 Page 410 of binaries2.zip
D=W1LA p+AyG8ylX11m5nGKt^GT*CYFLSM9BSwP!%SRhCuyIktGE:Fcm9SB$e/+CD>d<yVItYakKQ8dJm=nnJQj
ET1R4: cEm9!\t#1*CYyiG@C\6H!JBi6^Ft>bPltEDuwbmyN1Q<kp1>8yPypAXjFCBVw>%9FlIM*/k9@=^Da6!q
E=ySG? /m1AMnuTb#Qb1pA5E<tSj@I>^L/VcyS#qJq/1n@RhyqlFHa@>Lj6M9$6wD?EMZ#Dl&:PX?cjTE:t+*E:
kikXl> X#i^Rh+9W/QDwRdN+b/teiG^W$d&iW&Pe91XZbtVMYw/l&naLqMTwKH#5=&mpa$1?m11kY@X!==^bFti
m:*yum G8MiZFkRX$Dq*+i^ucL8wa!KTNcjwkJRdwWV?&^TE&RuChG\6t&ZTiCSA=Npc?RMt5I*$FwR^AJ6X+ey
AXVuY> RjFG+DnuLXXVtqJ!>>pE1Ze\Sjn#AH&L:*A:*nbewEC?A$lShWE?4^?u!Rkk?lLR%<A\pt\6B\c1Na6p
m:m#<& L+Gc^M<G>TL<cnTSmIhm>FC*AycaK9L<du*qTP?#lM:QERZ>!1$dNCh9LCN*/C9VGAWV^<&Z58qInK:w
+B&44b >8Q9TnNwK5DQBT%pLZH\1@WpGXGP1C?An5CkGhHbkipI/a6:eKF9uDLMelhCn5SI1J+hZHK++8AIABPl
>ewnc/ w\J<S@%n1C1PcKRtkK4E6mQy1!+\H=Rnba+wTDiiRF>FZZPm9eBARu^jSYj\ca<KJQmeNiq6A1n<^mn\
^/CM6t y=:l$GJH+m<+*k9w^9J<Lu%QpWcP^BDX*wqepm9mH=\B1!D>4GqC*tyI$PF#HI4P\6Db?kb>lEl!B5&e
m+5D%Z yqD=qh1+PWF#w8%EZbYSHQ59k8d\udLIh/L6qIKqpan=qX<t#n@aHG+dwGTj*j/a:k>$<H#l+uCFil?+
mM8wmX 8=DGAn%wF:RPZ66@CLM*6jijHq#eCSqAI<jqN>*@dkmdZypHkXWe9CkuCEJCS>qua=q:kcpPu9eGZBMw
E*uMm4 PVLSKVLA%6tAKELHmd9y5PQ*bwLtA?H6@p9bHMKqVF$1IBk:+Abp=Ydb\jM/l9jhe5ZEZj@=C#Fl%tCj
YYdTGh /Gak\Z%@11LCi@w9lB\<L#+XmwF<QLM9C\L=<!KE99@m/w4wK!TRFcnwcZ65V/64jRpqLB\d>?1e:*\9
=9Qc>L bNDTq4w@<uLBqKCRjedQkklKccZY^F%CE\S^aIDw1mwjW1TSk?e&E>kDLa+8yBkwDLu>Sy+LQDDNwEp!
^k>!=A LaCLahqFIMmLp>iQIM!=yc\@MFZSR*IF+G^cXkB!!@qLX6cA5?lKa#5KW6R=?J$F+n?*1R*+uhE+?J$B
!BBm=> Hjnhn+l@d8%#<MeeGdB$Shb&qEPQ?w<i<ywjiClI\hIXyQlRly^\AeH1Q<q/1QlRDtZ*Q*1K%aDJ=y>p
V!?+lB jLtRPki@VBj:/CpaC!a#nCFc>Zum8MQBm<IKLF$&4^*q+DV\w!hZEJl55BqItIpQ=W!@VuR#Ej@L>V4V
5HRlbA B==p9b>p$db4k=N&G9Ncm5kQb6HS+nFSmDLS$X@tW!9CG:&IPdc/^Kpumi8qPcuDTYN$mR8tkkbV:qMT
VKhJSM 1TJTRqlmj^NZKpb:CpnWH5dJAlR4ZR=#@c8%h\/&w=XyZadD!TkFNq%GY5p?N!uYn^=G@L+5kDYBE/Q:
/EpX@m 5NDhKS!6MH4BlS=JJ=uV@lcN%1Naci54qKKGhNDqiC@t+CDWembjH>\Sh/h41$ZP**q?jp\#SmX$i1HI
%8m&nZ iyAAw&PEIC<D:j9hBhBY>Pu1^y9cPCV*Na!E!R8Kc#Xt*I=E@q!qTQ!:SDcpTV:9uh<6t5K+NqQB6WPl
cQZeA4 IFAml*acyWIHQhHja+lJ49=*/CK1@6i5XYF$eQL<ClF>cGJNlZ\C&$Q*L:m!Q+kwnmpDM*F/wLbp>epL
\^<EAp Vuey$P>F$bNhMQD!!kMedlF*$#1^y?aF%h&lnGX@\JwiE*l!u\i?+CG8bc6elkByX9Mq/*^pbdSlZ>lh
WMAC8j GK=*%98tam9VbdT4Nt<A/MhW/ChkGQu>#cdCt^LWjwHWM?&Wi1WybYTNh5$BB+MZZZtWQYpybakkqQJk
>H?B1d <F\ln@4?Rhb=C4<t\/RtN1LP+GeNBq@>Hceia5PT:?ciBd<5y&QlHchN$9KJVS/u<^$6y<8N!y*=/M4h
F^8Qhb y>EX?\?n1!i8T!6qICL*%9Th@PSXHST4LDQZMqIGb/458q%V+B^6c6eQm%@465n$1hRw$T1P^A$qVYcp
H#pI#V SR\pRqy\KF1RWRLJLqtTYJ\>!Pblk/:FDD8FPc5!+I9WPYZ8i\^WA:Md>>qDn8K!Z%caD#1?^WV*Vw6<
R%d516 VNQTp=GL+nG/CW^i:$@i+Eqn$MnwNK9KauA:8$:i5appt46mFNGP=@wnZm=^jCqiXDmR8#*RHQkqQ*?1
At@h\V kwDB6qQLRe5J^W\\&6MLSj5y&lM&i91*QPmQ*@Q<#D/mW8D#YN59@eAmCl1!BSI!6cK>P=ZmnJ^pGJ8p
Fmq&<6 ayPp8KnT&kXeMa9QElG#NM\Ea&/8k5q5$4/9I6wDt\NCBV\hGVp9yiId+wX8>&qXPcA*W!E!c>\hD/G?
aL<NN^ lEGtwQLVSwJiZj41yQHqyC1bBu4cqe$X%5E#<Wy?<>*=yH9!GIp$6i\l1mCLV?SV^NqCTWM8!imI!T@D
$5!5um wbbCnm&KyjDc>jEXNFZ1t>\q=kcZF5A$\^6D>=cb&NMLEwLLeHtLIIEjyibMRbNK8SiSKG%NFW*49^GD
KcBH4# FmN8j4bCphWK*B%><WCWIJbXjJ18qQ9&$I>dJn<RXX<<1XR$ZYuL<I*yWtLPVWBGW>H*Ki8eL\:H+T4H
Y\!11R \>YX%^tqA1FWm4PXK!jq19nXaP9QRH?^\\A4JJ1Yc9\*mlTHSCykwYAm&@/q/4VC1DAhXB^FC+Th>=SN
EYD:N< T94%K8t4MmuuiB#:6?C#<HMTMpWXD?ejFL#8&8XcJ^1i?k&BLaZ$y9PulDdQ%lNW1WwAI%/+KDKq4&uJ
N&Y!Bl lwTK9:N*Sm^!bPGQ:S/wltLS>@Zn?kMXXR8wW+p+bm&h\pW\1BaQP+!Pmj49R#9Wtn4P#AXKJZ>Chi+p
Zd+cly Xu4Wu\Dm+jJ*i9+eb95K?YISpMhuuGq:?dT+Q6I+:qqwm4DMWHGhib=j6h^%JVt9#kk\XLY?aZp>4bpV
aW%^i5 q^QViDD>I5n=Aj!!P5%I#$YkXlJREbYAjHmXMW!^^y?k$PyDq=+K<aPyEddV%JuXh@LW?k5btR+lajRj
nk+6IX HZMjpBNLEAC1yH8XwH8cKpnIpm??MtTcMcq!Q=#JV=KbDm?+dAL*L/qYTu@ee&pWp:Pq&F1KmcJQ$QRb
tVaADV *Ql/9hm=t+wjjpH/Mm5n9Gbn?&VB9W8NacdMAuVMI4d=uTEL/EiwqChH1HSy$+tLZMkQFL^u$:Mnlej1
ypa%iK H*\!CAciK6k&GjTiSLNmpFw@B^:4a+hKYhFVeI^A$wd%p4J?ndqM5#AZE&JR>n+%N84VJq4SBXn<idPq
9p!H^? *E6S8WiMEQLME#jaNF&cX^Z?de9kDANlII64IN!jA4qA!T&ZWMPZm8m4jhH@>>+Q1KI1JAQhSDHPKnkn
WVDYWM bDRWi^w#X:8E@el!*<a8\W:5Kjd<J5tewMMqc<aNT<CSKnlFu:n1u:k&C#Ya&BkJuR!F<8Vy554q=FHT
>#IByj /wbeupaFXlEQl=A:nNCn1=yn^$e9JaEi%+NHM<ZBNbTPw4WdnQ#ZN=&+bmljjE:1JS@\KLl&m&Fa8i*9
+KmWY% 6T\Vd:e>PQ:ENEQEmj1/h$h84n:X1n*@jJJA4wnJPl!%8>L:a*m$tGPV8#*/QdC#mKai9uM9a1jic$\>
LYM/*c KCGJIV<a+#VM**n@WRCZi^5YwjJ4wNuS5S:1&R^1bZ/w1:nB:Q^q%8k8@VyJ6L@a:!G?b!eaX8GIQZTM
$Cn*QE wyAPE@pHaZBKD\a+/RZdPMpqa\5%ZiLR:j^F^ukZRZn$QEtcbKeFZYXt^I5j#ZLq?+N4eVJy@XT=j=AW
bpL$*b Y@I/KVGtc?+?F!eFJKb$<5h>VS$W#uj5w%#R6DiBw*hShj$CTNTDh$*im5=:q1TwnyJFT*CAS/:RPJRN
\+FE%e &X=AXyDQ>qwnN@Y1ta!E\!nk4aQkibm<Cw@jLjl8%^*aScyH^kjX49nAHnpMFCy^/=9BJI?Zm$nT?y=u
TI1JWk e#LJ$WpLikj/JlB=lEJ<FVR#V>VRL/M@%m+dq*Jn+h*/T4Td?ly4uLTkjLG#b^PcN*\#q9T%B<dGJZJi
n*TKCF Su@Ppt!i9/H6SS?Qk6Fu:#5Z+C!h+\P*jX4J:ENjVT*Fb6*Bt#bmEmh6yuYy@hT4hV4nWN/F*VRQnXHA
?c&HBG 4pV5/FVl*wnYWYyl:FlT@/R*lNEYkJt5%B5Fmqh#HP*?IRulQJ&/I<EdhqDl*5ldy\P!5<weD?*#E:%&
XQ<D$5 :CMYkZXYqTVlVLdk=G^R=1EdIlPjukSBC\umdqTk5:kRh$+YaFIP$bEMCV+1MESeTDTupjq1t@Xui9bE
Zyp^IF qDk=eD5?tSXIECXP^uWhcBAqPau=$l9pKM+TXt$Wb=iVt*JAaT\lCdN*mG@FE6X=+Rd^haBK+cy$lEyQ
RPR1Xe uIFS=^R4Pce$$9F6wu=SR8%u%JayiTm6JKQ\>=\5llaHPCX^K1wm>8E<+9L!yMul=W*^H=y46!c%*ZFw
XjQAnX K<C!?^uDQ%5YuwE6M=tp*ej$h&^^F<#M?QwuaZjlQ<w#iRCp5ht<aJQN^qNJKlH*Y<SS<q&KWiIpXP#m
KpA+b/ p9CV16?6iSl@CHCL\EcJ/>tu+wQe66#Lcdw/6&MRJ%qL<dmIE1h=*q1HT#pX4W?&uE5pn1y1Bkw^GTFE
Fn<=6w mhe9T4c^Zhldn8ZEqB&RWD/LT##K!:hY^=VXpK!q?ZE^qdmTWA/IT%^P!nhQ^=Gan\^QNuZHEW>&Jm^d
?/PNH> p9SPTpGQN+nEM^IuwKW:aWeMWIH#S5qFmXPB8\MM+jFKh>XWu:=m:$5aSAP5$!#eyh4@<A#eMKEZ=C4?
dXAXwn mXWaV>V<@WAbyeN=yWNmR:qhC8eS&%tY%w>=$%C@?EDyyEM<!@/KFLQdIq!&6\>SnN+mSP%Glj*Ba1:w
1PXtSP mR\:Pc#tmHuC61Hy!u^cI<ZqwH=J8*m?HEYp6:#tpAkG:F/jPQ%=L4<b>1M4TIHRtC/5XB:#wVLiZIF1
T\L@K* mHc8#wldEP@a%Wn9yH!=TI9\wjGFCIPE$8FekR1Kh1=ttF85QjPl$nkIXhDP%Ry#C*We&\!n:DTj%9Q!
@wu<9i 1nj4$D>J/9ZTBLYuSujyQ#Fq>I@q@V@VVScn^Tu=X\=YKK5ye\^BM!@bSpuTypeN68jGKdqWDydF1eE5
ny:Dn% 1i+wqinH16RA5c?\^E^XPXZZY?%>GY%4K@1?/QKQ>C:&PaXl%q5Ie1y88BK>lYth/Q?cAy+\5=4n5b&^
c?T+ya :nGIF>9Fl/=8V\:MX9Ve4<QD>W=18%91?@ID9#Kp#HLb>wLBLq5T9$BWDAbl>Z$nNeehS4imM^Y*X>$S
P$9S$q D1KR>qHhEdVWn+Y9CXjptYZuZlcq!PWj$jijC&\DCdQLQkEM8WM>a++4:5a5kdWDclYSMd5<T<SG:j=h
w*Zkm\ HXl!L*4iFJMX9Q:?@1!5&BY<MS9#/aP&F4I:dLhpq!uJKA<!YpHQiT#h4\4yIMaJEGPb@\CDSQe4!T%B
+6FeuF >*\+N546b>Z$jwtT:4DRPZHi6P+*/5tl$:DR4bwYIP#RFt^WVW9+dpAXp?Q%>+4C\6qdDuni/tY4&X6&
SR@&4\ y\>5wQcP?6QRMClabSiu89yCh+*=*bRQG+$<ICGchll5uNIw#=GTW%XVRKQXHdY%wX@p:Y/M=PJ1N/Fw
Bj\b1T j=L<F*N*CwmcqkDtwhDlQQZXRi:=J^m%8D6M+4+FWWGAweuEHaR+@c$!Q+Da56&1%dt?XaJ%dpAW?wF<
>$leEX T+eEC&a:Y>\n^w\&+epk*56</!%?nL8&SXBni>u@y>=A>j6/\lWkTJmE&G$S\+tTl#TI?ZXRyty=XBXa
-A^mmK 00072fef9da001202b4 Page 411 of binaries2.zip
8JlhKJ =X+X#4iTakh^9BZBcw!pQtiMN8Np1/Z!u\cJ@e+aLe@JX6*bGIub&SnN%epYR<ZJX4HPGE*T!Va\y+t6
Qym%WP WKM1PQh9E*/ljkN:+&R4B%KC/&TLyAP/&b%5<*m6SnHe1<K&496Y6u$<CZccLXpbLLH#LVFZiy<Z4emp
KBDdHq <!LC5mGjm!q1p$5uL+WGju&^4=aEEqy#btt+EXLuByuqBQcQStJmVlIS#JD!L$5ueWm!MIp/RkZhIBPN
Xhu#GG #CChnkctm&TSViRD&aSEt!wJP@HV4Q8BLk/mbi#e\pFH9aF4SDyNH1^iy%h8pl=AejhV+=!/*89+%V%^
TYjEaG >#\$yNW?ec@#XJK#Rut4VFVBuWbJn#^^//kDtlimuJbdFmFSeiendyK%w86+4/JJdZEh$M$<1j*+eEBL
V$4#^X dHNAk<!d$*RLH*W&%!nby8qikAVqD>8^lwRa1D8$JN=kPpC5ccw$FF6hRb^/T\wiFc<cn&IQn8IhE!XS
KeVBeS H4ne9^>E%Wnk\#Li9ZLW9Ryq+k?:^AiTnM+uJF/?JX#K@XZbRQyRXqMyk&IN@+pVpumHIVR1Ju+:qZRq
!^%w=1 VCRH+CS%b+JqiNShQ?maTXA:\F<F%l\86t\%p*m*NK:hJI%IphW%\p\=?Zpy/=I>ad/FmHNw>Z4iy:CD
md%NC^ BW?yduid^XZd\9ak^V8%Nlud*!ILwyjMciZ&q#/!tZWHB%Eh\\4Za+4JpmXw:XVh5t1+WaDN@?FlGaMN
N&R#td eHa#NwB6KmVCN&a=YGEKbJ69WFp+:dGRpcTE$<BB1SR@8ckRe9BJb%!tZwnYRFbSu/<>KAu96FRLa!Jq
Xtc=^L b6YlLtDC\Y!C!@p/+5ajAyPDVQiNH*@#$G\4c#^mbecE%*IqCFq!TbILLtB<D@Rm>a!5WlV\!pK9=@dS
#ZNI6y kt*yIC!k9MGYBhe%cDiJBT9uAB#9?8#KNYKQ??qYlj%mLe&JQLpht$&PFX#NNk=%YSt?cVHJqejmY+8T
PbF#B\ uyQm$VD5Wj/1NiMImwy4Wi9ltPiyQIKuwD^Meda<BFp!$kjHVk8Pty>I=Vh>ujJ$wjh5AjVyc5$A!K<F
wcD5ec t+yKa6eJ!T$Qb&mnZ4^11ndCP9C5RXyQVZ6#jBkAyERZMA@&99nIi?:DljNja/5<KGD*X5GAq6p>T6H!
E$6yNw Veu%!L*!9DRkZ4h5F>X>%eC^:dt*Mu6jS>6MK*t6!/aHM<F=6mbiu$ViBcuCwQ&pR!9JJTZj9VWNRtG<
wh9!me tbiHn5J>VGF/b$uJ>BP$<YSB?S#n!leD=YZ1TtN@>Xp$HTP:uiwn%6amttwV://J9n+:4hSDb$K!k$@>
YXHK>4 CAE%pSn?Fw?Hd#kh9Ka$Y6b%Xhi*J1ZD*161G4^P1mwh>c\Ni^AL!e$Aa=MSdY?X^ht$TdY%Hh!1=:d+
N@at<Y !?CVX#t+6pE5#kh9&1HuTCeD*4nl>M9PuHF#14Kl#$plqWi9Gu*tG8VKmpl9q%W$t*jS!^P9tlNNy/?K
K?8a*8 /j8c#q=N9*tH4PPj/!dLLw@!cBGP<q\/d!cThF>PlAQKj4/?LtmiiF6WY<cF=RYXFDtqw$>694dpYLLe
S4YIT5 W?a\l?cm4X\56ZI/>=uiFDCtKQ=Pd$yuqiM=W9^%?8LPVZ5>XVIWtZ*8%hNAe<a@&=6?+9<WK8i\%K?W
F?Iql@ %dteBQS=HGCw5<YaQPu5EKmDkbBL:dlWd@I?6K&Lakp^YlZd<Elyp5w<#<LATRF+PJ:5l+%mZ%>@dGHM
wAGV%< c%LBlhk5nhD%=QX18H=yRiKw@Vp1WQ#ST@*/dIjJ@V#nRSw8piA!/c9Hu/8Wd/auq^Z<G<ytN9:i6G+q
Cnb$5Y 4RWMTp>S9h+^FRE*S@8$<YXL:B!??4SDa**DQn6H*PLEeV4&5=\:yGtTn@wK9CKWmGj^GYXD+<^I\E>@
=%>pM^ E6p:KbHEG%b+9NR%Pei!A?+dQJ:XG%lD5D1cu=@bmkI\WhNul+i$yaH1nTMNH4M@Fd%X=d!i%hAe*GB6
YR@+=F ulXw^%Ad8t/$:NILBd>=w\5Qq9A^Zk$I%$uiblDtQh&FiW<=6utVE8W?Ym%FZyK<4iYWQ%JGd16PQq@u
#+GD>I c+q8Z/a1tP^+AdK1=S:bji:&T$bLHi^q:*wGd<+!LB16^+SNZm*Wu1+?*jBAj1^:Zj4%!yp?%8wK%ccw
NmVG89 BYbn?5q:LBQjNDR>HKqyy!cFS@iAJ?S\4MTX6k/5F1q*%YMiZCj9^:Vm/I41*HY!YyZHY$kYZIpN6H==
+%V+cW yQP^/F8Wl64XeA>AtwWS9ShldR9d#F<*i6L1DZZJ4i*Kd6@cGue&8Vp*Cq4p\YRNH*jF$1W/:SZ^J<tN
bw\MX^ jJ@%&=Y@jt:ZPP<FuqIP$>j#^K$IPPD*HIV<m?+T?C?Kh4Ehw%tRn^et?ql%nm=5Y^>/p8H6aDum1!l^
jE5*wZ !MDY+$VqL&W!M>c^i*%c5kEF??P8H%#8QejydnRTHttuJeY+tZ!/ZwV<jj\?+dFMt*CmZ^!hVGT5\+yP
SZ4pci cbSMQ1LM&?qY*AI#G64WkRT%8J:ZlS^Qh^Mu%t6^jm96abAuLN#K/D^uN*RbF&yd^6y&D<QNG\Y$McZA
Vdq:*& HK+qlKQ4kPTQJLhjEMhh8:/P&?Jqq*B1&%cXW8=Aj5Flei^l^H<RnjABj9BmbS#tlwRn=bKCP1<tTnpL
eQdDly w$*DCQedm9I@ey1j8h>@Jlq@<9GJ!DSdLSZDQ8nNZ1$LE$*1Aec+mkS8P?4n%9A6ldN+h^l+6hn=ekyX
+Tl/PE %NJADq8iJVnDY=p^+ZXEaeH1<+>w?@9\b+!dMGHB^h:&CAICQWd&uVu%qc?#dT=NJ<K&*L=G&H#@>M:B
SEP?1d :q+@:yyTQ6<YQuu5LSnkM4h95:y?GdS^8:b6S*@@>nCJ$Aq@9?&e8NXkCplKC&@FAtcy>YdZACHFtLAR
9q9n&? lw6N8NcyVNmhE@/ck9nZJ4^<Gm@*ZR$e=NFwHj/tL<SV5<Wh\pqL/aNC?VQQ!/*wR1yj&??=uIT?#dcS
PJEMh4 nWjn4lBk9*S>hy^51Bh\C%9%DMq@mS$J/qm!q^i9I6#YkTX%lKDQWGZ1/PXmmck!QqWPTF:#>aX^E%=$
:i<Dk$ T4Qj\yQ=BN4&it=++9HVknJ<S@1\SqHD$QjHywYD:D6P^=Ja4Y/?k#V^aHaA+1cScERR9MM&n*W:A5K1
ABbt<% l*/=<X?Ql!u<jScXjc/*@69@><=h*t4cV!+5BFnqj\N:?dNG$uX!iG$h5Sju$!KG&>H$EtDTT><C1%@=
yPB@ne hAD8?ZJ!S6CCpEMA\6$AAiP4AhYJpMa/%Vh>iq#$D*%:mNt^G@C>/T^ZAPD#ka$VuuP*:Bn&%VGa8?nZ
w8%#CF b??4?e#:6&P8Z!$IG9F\?&/F%/:W<*%Vtq%<u5^L?MA@Dj#+L#C>QCGZnn?YKHh1Z#CG^RIt9IbXAMKZ
hyK8?% AV@CE@95+N9l^L+?N@YyZDb8@CiAkW=@u?VCMMl>Xu<<@p4LcKiQ>$^yiAP%$n9J?96YdMQ/Bp8pF\nb
YZVdmP d5&JD>EY!TDpqRmd>LLZ66IcEybFP6T#+^cLG*iW5>!X:an=Ry9wht=^dP9FPu4i?SN8j89pFudMGcR4
@A^+Ru \NTIh&=4Lq<S<1TMuBF*hDZCCAjyc/>Q$*>!cYFj:j^@T$!Q5#i?K5CK/MYY=hPynyXX1DPL8:4H9&qj
4qDq:& !D%T!K^/E>lDwQVCkuj@#TuC^1Cn@MBY9/yn%E!@p4uVKel@@:c9Q%GJa?&>NLQFQ?dwj?VTjkyk?aAL
^%D8tW TKmCL:!&kwNJGaWj<Sa=C4Y=h&MDA!qGRCyp\5NKMiHG1kWle/jTQwQe5NC<YA?5w4L*a@^Q#jc$@eii
jeZH1K \H:/S&@>FQ5wYQ*&VtCbS*C>Cdi/*9>a%km=*1cqG9hWV:RD$jhiBBE&Lp?8>1&iqVG<XlZn#ihW:!FA
#@6NeW ipE\+iC<#6Fm\djDikG<QuBq#+>qy^KGyV>c\V1V/RPCY58P99/Qy+X#pn=nb+HII/%+ekeHJcFQd/:8
nk<PwS e@PQ&#/dhb@i8q$$jWBT\yG5XjB@P$GXmwXR:dIFttnQtV6\?4yYKRH/nHFuNZjnA6E+i8A\@GY?yj:F
M?5CV& />jn%q/jitI5lG<XYAmTb9Ce6Bdk5Daq:uJQjcXPLm#tI#<l*lBlCbKTpyMKm9KVCl5dCl5LC#Qem=KV
*6GPJ& mkwKnA&aFIYEBy8VE+ITklILZBKTEwJTGw5cW9ICA\IDpq\Dkq$CplIL!+5GG+5KC\wVC$CRpXFi*F^W
9=KW6e qDTeYDmaYNSeYFnWYD\<XJlWtJnTXFlaWJVSYN^aYFSa?M+QImRXFdeZFl<&Niy5Hd/5wSR@8TS4tDy:
M#^>&m >hV<iRy8/&%5Rp>%ep:ePGc6/*nqMedIZdX:pJ=>e*V9&&yLb<\:KVljAW+pN#dQddNd4*Vhi/Y>NV\u
bNTJ&w %DK&66SRP%6uLN>4=uXbD/=eA$mZPnQdVn^T9X=d>^\Zu@C<B+=*T/wceN/cI8+d$+m/V=1q$1bY!y!V
eH&*J+ u6dT#!>+kj*duGpcVR5t6hwuF1Y>Yc:b&@Nu<V>YnYydiqYT*6Iaj\XedW\iNbS/p*q*XM*d5ZNJnt=S
Ln!cQY ^*djNc$C&X+AG9tHXt?Q8*Z$$i8G#XbL!>P1&!4Y9T@Nd?JQh=+5iYGZ:q=4cnE$56cPp4<1^6^=JZ$K
n^6tkP X>/wS45?>l$<%MV=9HA59WH?=Md^t/NhNtwL:/KNP1^5cC&:<T^d&46c5kdMZdmPL1w<+nRNtZ8*APKd
\NLNJY F:^:JFQ*+4VuLm<ScIF4l6je9M#Al<54V/q\*1Gul=F$=mPuim%kCt$N*lp>eJN4VZdyJ9jMpbM!4Y>%
PMyeeF *N9jQHqNH>*??j:V#4\Xn=cV9iNn:jKdjjPAy8GnqW@y<$/9&^wQyE1j!$yc$?cPqZ$#ThqJ!:MK+?VS
GTmn\G !?@tB&wZ6Vh$Ti@M88GdXSGP8FGGFYQZ&Y%KVjNZ/d#I\<$jY&%=ulG%1?w9JZuTP$++n*Enlw9HDc85
AuGcm8 edM*%Ci:%eue&9wBi>n4L$q+?nt>#Y6!+#aW#4!/utX>#HWVb?:*Dc%QG8H*n/@YFL@i$61m:/+=LJ#8
+6lM/J 9J9G:By+AP/&9\c=+Za/dBKjVpRZ^1%em&XZIl581l!=1b#GJ4e1uABLF^b#w>P:6w8Wu1Nym?:lh#=Z
P^A=*V Nq=y55hi+SJLY!?a$1uJM5+!uIYL6I#t6X8tK+bQS/XFq#j#uN:GJANL86:GX<jXP6!6Vij*Vc%E#J5c
K$^CIy q8!<L!>+<HhL!!e6tyT9S!Z:*K?%e/adhq:MNHM9D6=qB?iypHLnP\\wZm>^S&WV%k+<6CE?JhR<S=G*
1^C^GX 9L^n=5&uqne9cXN?6VQT\GQ8Wq4&N<@auV+T%+lNZ8a@na8>\Gpi$jMj=+?\5LX&<hq#Xt?H/it9Pt9X
KLpGl$ W>6YL&tAV>TqVj$i:GY5uK5:Dhc$@h5PcZqLb!>\QP=Bb<<!h+qZEuj<SRj*9HkcbTG4CCMXm@i9!tMp
u#XP:N 5WYTGn5uVw!uHNm!G>i!/>iJ4MhuL>yn\@MZLC9Wih:uB=X*b*ZQtKh4>KP8*F4ySRhuqX\#&KhHcS88
T/@G+L Ety6FRpXq:jZ4BnW+l=uAldYp9\B</+yNGiCn>+q%H%6W?i8*L8:1/hbty/$DeWXC*wG>DTZ!EZy@c?$
tIPcuE 6:P:H9B!Z1X^E>=c%Gu!hb^uy:h6b+QtZ8cnnLqF<^+<M9HXw>Nu%F!qR*LV>mp!*pFQDiJ*CS4F5?:8
q/6nh# caPZYm^9+/%e+jdBh$!yCNR%1+<5uCN=aTX4K/j$6C=qG8pZ?%ce\Ic$%<neeX68nI+B*aeG?YGZ=#de
>tBh#n Hn$M=#+Z4Fei@c*H+b4h<LMn\%ahRVp@+?G=k=L/WWH?m!F4++kHHy*/F$nc>5jX#&?Pw^e4ahT:^mXH
e9&kjH L$%lVjjt?dF9S\6QtKel&d9*4hp^W!:w5>!n&IXL/pj8\AY*l%V@6Z8DX+Ry^!+95?l>iw9#BX49/RuZ
-AA+&B 000ca191d3d001202b4 Page 412 of binaries2.zip
F/FKlJ l?E&6eFu:DTSybVu=JYA5b84hQq+qb+duFHSZJ$YM+ZnJ^u>@a6unkY<hI%V@ejZpQAun4I!9<aV*nhD
8bqb$u 9+Publbb#&6HDcp^u:QLX5md&%Ltb5@dyan=@Re+1&#Z&PNH4RDk#w@9n\XH^kY#:d%q@8yadmuRV8cc
KPP?bR 1kWVcl&^1!Ri=mF5Dk:Ph:QjN9ZYnA+&nR8XPny:M^NKbCGWF$I:qM5TJ8ctF?ZGbq1dik5KJq>tLLw%
t@1&La XQBHQtQ?hm=V?jR^F*9y$Iu&cE8l6WVbD\h/qtJD4c5nV&@$V\$uW+Y=Rp>uypkN%n$*HDTV/&6W/N\N
PQI$X: Hdt/*H:^SEiFVFlLM6yiT=t*8\IKi6kLF\=YLS&q+5^+hyB<L\8%&R\hVeqp#\qYWwybVj:cSE>%tV!R
CcaVQq &%5?LJS#TaLJ8tnVuEyuZdFAyMaDm?Yd:1HyttJHlTl!Va1tB4QJ%k?F%mySBcP\q^95\@kde?Y<kIK<
Q+BN9P EE?nPtGnQ?nW&Pw56i>\Vd=:AwK4l?iZFq!+tbqe:KITcW&J^SHTcQGe9VK/w9tYEyqWDwiD1RL=ZIpc
%A>HAn 5=tCAP$Y6:5dm+W1a:Y\+1hF<><b*=&SqVQ8EAR=$AZImjk?5:N@698ML?X@Gh$j1^tGH@:FtITeMHw$
^>*CYi T&kj&p/REF<MqmMkDZNR^Led>b5jSGdRJn\<6D&+pL?SmJF@<ZeSETMFBpwPqKltyPyD&C#m!=nIlY*=
cWRbdM GESEA\MDMPTaeQtaZAy^+51wATYq>?>NJK=5dJIk@RXE**\Sa&IlatIwJCW%JF#EHHumTEK^&N?FSi?j
m@$5M9 Jth5ApG#pBBXuCSHj^aljm\1BXXR14T$IaY+kd\ceqR$I!QT6<ICenA\ND/\#^@+^aPRpAJS^BIaIjTe
Qbm/FC >a^a>NlSP4BSpC1\pnE4@646F8JQ^pSN@hH@<$N@5I#Rh9C&nDCb5*MMEhI\?KW^i>kCbly?/kwTEnw/
BHmSVj Ht=taycLctCRED?@EBjjS*A\G^5d8^klCYI5i?V9\<M+M8BkTMbBM4=kaD>newTJ\hECA*@Zk@FBk+F>
y<Tnk> A5MZlNaq<Qu\!\eMDD\uPL<!AnpCnDntC$SEBJk+?Ghn<J@+H<Bmj4hDw=LDbm1TB+J>%kYD^9#=k%kZ
wQ$Zn6 5:M?PkB&HR4^*A4u@hhLaIlkaB?RRF4AQ1LGELFZE1LRy*Ah\McRGjkdGTp:P#5:5kebpw5#WnJSJlj>
4@n/4S BIQRp#A!MnE!!:iLIp=DDB^F\5pbDQ\#!neiJhX@inwiman?QZV@$:kl6MSlSyA<t4n+!5\/I^MV%?pP
YGE5Q+ *:/MDH>ZenRK?jhTm^GKteSQqKD5E>GS5bl<<GFpT5#MnQK>+Cjla@:E#@@:5%FKIF>k+M?I1?c4HKH#
9dYSYB C!R8%ENdiA5nYe/8$iltQuq@MTV\QR:CTLHAnDR<uEBpYc=ew6<W?D<n#5Gm8TKVZIiH4\/uAw^>lbTW
+CEXCC qI%XZRKD>6KR:eA?kS6#=ZK6!*\kbCCMyGBEaVNG+4wca$hC@ADd@SQ5p^AWGB*5J&lhRu#w\MBA5A>K
WZ4nHy AwVjju+EA?NDT/BuyIMhHkVVHRdBJ#yhMDDGu^96Nl96IBjB\j+FSCMnI^8wV#+^pWl1wcP\\*>lJm#Q
+ATwn1 lJkedAiG#FjbSWVR\Bqecum$hD$#bWSy\De\S\B*$J/mQ^Cb5HCRBLYA?=6mkYd*AI5%hP4#GNPWhAn#
J^\@eI ^>+!=p>hBSQZnP4n6XLL^um4Kml:>k89>9\Ti+J/Jhiq@mGyE!6H#K\%S<!:$bI9$<TG#DA^TcS%M%9T
d!jdX8 IAZBhmnT#DCJ+cdFt>I!y5E@@AS&@6RZMI>IQpkLtPb4NnAQK*SQTJZRicJ>Wy5bqKNAVaLdFGcIGmW8
mFnyYd 9VFSKlIw?XJ+tK<$M#+lZblbYCTwyKKm:Ke/5*8\Q6*V*NuaZSBk@1el&%u:5kY&Y%8lyTc#1L1/9Z1V
5I>Qip dmIG1/1y5$8I51Gc5c5wk1/1GDK1YRkXJ*Mp<+8<9LCJ4/1jKD9KF=!e\PI?JAwINe=8Au\liYPlTML1
lk9$t? KAJEkySINLXXAwGCTIb?46MNGVFy^QH9BmHIJE#KK9JKA8KEXh$Wj%p\E*cIlX&=Vw9Ij/e5mlWinp<c
DHBXYu G5KSKn6BT^tED1?DWl?dtDNaQIb+m48!mp=ATDC#m4uMqZM<l1^m:QBdpJ&RE@VkN*d#C?KII!tqEZ=A
K1!!pa SjqI=*>/@G59WQ=:Hu=l5SXW^/Ba<QAb%PpFE4mhYE^pB%XPMElhaYp*pFlI&hkFdFRt5Lm@AI+nGwJW
Q!qWAw KRBelqni91VEVHt8lqJm1ZHPdS<M<mea\4>4A\<561LN8iu%Lj*b=@X6u4j6AXV69d&>AN6AZi?#q:i&
NcPT>y 8=i66@&LhG<c6im>b?AP:C?A6@+?<!F\Z+jK<\%F#&ijna:km>&//DXAhF:$t4<#?/$9unn9EZ!W?=H*
e^Gwnw =uJ@L9$%=HMZWq>>Yh8%!T%+Y!b6FpLp<\TkH%nQ<^d+qmIE+L>/<pG/Bw^:RlM>I4%AGlAT9HRA?J<4
@RXcJ6 pK+>*@Dq8tEjiZ^C/c@*j8MH*CJp@Ca/S8pdjkRQ^Ay<BHj\6u@8i+:ZtaB/kl#*6kZ\R$/RnZ5m<1b+
Z>:ZdL >#MC9Nq$?DLC&RD#V#=XTKRIy?H\<KQbQn/Xap<?QyA4KRPAma/PkRW!\CDSQl5:J^6^i!PwIX=jQ?+H
nQZadt eeKQG8@l+PDkS6uwy4wG#HmuIwXL9jIeiE/TE8YNN@S>&8V+Lh9I$^XEmJ?jj/^qR#6Wmmc1&cHn&F/k
*duj9p mF4kR68XV?H!LRkbnVB?&WCa@@1eMENdCJZRZ=*epMCFTGATI>DdV!@*VlX#VwAC%^a1H?M*BW\HukCZ
<pEq/? 4\IVZ^8bYFp1kV!IkP1*!dEB$#GJ+VQJeaAq8yEX<aT$mQuHhBKNTAA$uAcdtj4u?/CSm!GD9#^G\uka
\4k!Hn w>k5NKcaa9DDJEdEN=EAAX+tiVS8wp6D^p5*PWEKahkeYpk&HehBNKLT!Dt1MW18+8eAe!/m&9B%%\*e
^/=W8# Yli@id<6LqRZAm<nF>EkXHbEQ/p$Pc:&b:S548JL\kY4Zw&KSebBc5!hSeclmkMa5WYtnGyVGLFJ>Mme
VXYFdL d:nljj4X^4:GMcwlI1=PuCDWbA^1nL#cPEch5jN^Ip&4e5GmXwM/d5n\Q^&nme\p#L^dj^Mn$BYk#<TJ
Nnd&DB Y#qiVTtecVy@DJLQYnCn>nR@EuEX#8dKAwtD%Fe5Wk6uVc6VC+hQtFGnb/%ptw::=Yd!t&SC^$<VtMaN
n8iD>J PZGChFj@L^9@6+PFtjqmM8+uYAG!\R$%VT*\jnE5tFTdJn!HRjYF%tyWt!GbVBNP=Q<V\um+8*C&AQ$D
5L%F!k i1lLTX!w%*8RFW5X<*@X%iuZ1l:@bhP9%cD/6\PmDPFt++H<u\B&9X5JEiFTbynI^NuB<qYunmNeMPq:
4?BRNe V=R/?\uIK<ILm&4>95^>Wi:KBdPJMdN8hj16cuZ/#R4$<N#=>*DC?!#ihZD&9N5FhSn?BnH@%\d8=5Ta
M+AaKL HyX\pYE&H1WI%#@8X659@4$mF/q^dp6RJ1qScQyeRGu:i1HPQ9li$&?&yj/%H#:%HHp9XmGQRhb@RpT8
Ie&cE< bp/Sull>nGq^R4W8DJYJ^^<?c^M?TaGyu#t?:<CBJECB&RqC@u\HITI&\TI&*$AZLlEdGu^p#QAGHmPd
yM=/%M cPkwIHRWW!yQdQSj=p:!j%ujL%#+!BRPEZXGZ*qGZ$YWRR1A9!^lyn#bL=D!d/Kc\bFelabEtA/lV98K
%$5cN^ wSIaILR!WTJSAlyJIFM??JeL!CbIZt^ZmeCqRBk?RCAZNXlP4C\YlQH&=>DmRpe@j=MV?$9<I<@bu8<I
>PS:LB /aJGhKpajp/L&K#w6$X^::ibR+6GXB55/kImkyR=lJ<Z+G:Ie*btVtIEB$lRwQ16F+Ci5l#uZ@IW8NWk
YmQqPl iw=#kADwFkPJpijIa\SHNAqe@CZ:mYqDbcITSpw&e&l6wALHkRQ@eA9t@D6<Bl&=C9JXkq#^*Tk8+X>M
V8cW?q :CR4elYN1QudZ\i?CSM%\*R:?!8Rc+NI*:<HK@w>wQ:4peqjHjCJk1C>IHj%5?R@Iw5W8B8V@@EM=CNM
NFe$PP **8$wycw:>H\I9&*/pHD>@cjeN>JD1CR$WA?jBb:>#F#pkKtS$\uW9Bjl>5LWQ?1q6?1pKi\ZZ\*jRIT
*cXm+K \!X1bwmqaRmtp<@65+1WDF<BBZAJi4=N5WV?b&ZmEEapN5u$6*1ju9>BHjBnW>8RJd<aSeyNR:$M?+bb
ct6Z?I LD>Xa!:CbSRkKT54Nu=hjS*GVTR4NnYNMnSbq&q/#&HIEPi1Juc5%5pRiT?mM?Z4W6YN^*<9GynQpDHw
+FiIp> <\$B/TGN1F5Sn/ndBakpS#dG=q&^hZH@:J&+hi+hD?^dj@cmShwA#n@#D9Y>$:%+AaEZ1L#nLpA$$Q9K
h?DKk\ >&e9lQNL^n+Rd<Dm^V</N4qEje::QL#/Nq+B?*>y#/KB8RKZ$I1F$L@>%y6%AtJnK5QZnNkJEQyH$X&F
:XQ+ej SX\X1@#TpCT=\kP&nSN+la\@jYN5D?PZ=IK/MQ/FyRlEjKM/H$PZ+8imYBeJ&Bw9MIaBeRytQtD8p9q^
p>^pAA lYhMG<ia\SHJyaq?j$>SymuYd%hAbJ48JDQtB8wI=?<+t/yPCyV&5G<meT:CXPjBcy%n9Mc?ypt+%ERW
VbY@QP tPdb9?=#n5lA6I?<WGq!etuK&X^R$*k\ZB*4XePwXeN+ZFij1T:jjipAZjqnhKcwXh$atJ8M\%nw&X!W
L9yt/? wXeRGYt/$!nhKGQ#L:i8Qu@qi/At^?np^=DThHNp/iVJEynBL#B*#BkHy+%>VZ4+M<&?:ML^=+L<1/hY
j1Z<R\ LVD?JR?capHt9*N4qC$&Pay8W>X6DJYZRykw>WiBItdRFeR6qRq!YGGM:95B&1eeiSy!aTnR\1C/LDCG
B+c+m8 PwHJlI1Ghk*1BJpni9hSSIdu*Vm95R>1DidiMen:1%9Z**G8Q8il#yl5IluQZFh+JKDM=w>BkZ#IVRNZ
5ttBtq NA+ew%<jk#DFI<uNpj&a+<J%Hk#KqB6//u88/II&WD4VSBSSPqMaZH/:@kb6JEIdwQ$FT+VVENyNtNDq
qwjykp 6\!TIMYaYI/5\B@^Lmd>HMbtqF?9TG^IY\^M*^9bFD4HaNleN+^n&X^*^khhRVmbZ=1eLFhX4!!$C:$k
5<uJ/L BewkcF#kImd$QGnnIMq?eA\&S=cTm<FjL6l%b=ELKW$8S=b<WKVebdncpJHmh5:E&>j+K^jt\$=Dq=dD
YwbX?E cP+NdctI+%ScKCAyP&mRT:a+/>#CcKHYEn$%&<\PmMXqddHE<mJcN8$&pq*eWwAPwbG&WJHYypc*pGMe
*ZeI5P I$5PPucd@nt!XpGHq<JpI8nMt\ahk*Itl%4bZKBnwIadj41@BHMHT&mRKd\!DLbmMXG+AHVWDqJL9b?Y
@QTmEe YSMMj:j@d^QeSKC#8&y\nL^YNeT\etJP:FDPBIV<\#q>GSTu#lS$+A^C@4GuumkMct4Y!K5h!j>dJ*4+
FMdAia k#Lw<lP4qtyyeueZYRGhNauKuEKD%XJFwl/E+>Wq$JEkR6ABiqCp?46Xl8L*I>^\1Xw1iPZj5!5w>y*n
$H&KMd u\yEPIGSNFqp8d$N\R%@>@Zdj#u<H+St+y$%*kVEm9K6%@L>1BY/BuZj6aY<Y//eCj@H#q<DJ*?6k6+i
ZWMquK F9>XMpm1qGYwnl/dbdlI>hi+W+nR>d8k4M!@#qe594Naa49@Bh^5E=Dw8=Tdp>/F%WT%JddI@:8!eAwD
MHbM#A <dKA19t>ZIcV8BQnaw$DiDe*B&/>8IDe9L#Mk*&9>!%8p8pc6NjBS+IIB!akV#4M%t85Jhc4WG5?h>ma
!l+a#P a8%t@:PDV9&#n+IiSW#R$\VcMuLV>F!D6pF:P&m*CL*pSZy@5LHpdjJ!&jG!:D<Z>J<m/BtS/lp+=NGV
-AFJV= 000fb673aef001202b4 Page 413 of binaries2.zip
JY@%hY \d51VKcyHXId=*JVHJKSV/bpydtFD1MH:a9$&ZIL:eJ%9/bQSi/LdB1S/m:L/C:LdwH<Dw1^kqGIBaYC
+?RHnn QtHPLZTi=cd\Lawyn=+Slb+l4MQMY@dkJY&Q#lI:>I:h^/TGETZGmm^@8Q9/D<mt*GGmA6Wm!$n^4bFe
L^WuBP 4bh=/eC?jj?8+tCc9?WmGjqmTyYbm<GPXLbWTtXj4Yq$nKYS*CHLTNYX/Dbn^\A8Bia*HeFhD1I5Dk#J
JZBJe% 9Mq>aQ\%aBtS@?paIdLZ*ZnaI<IVMQd&pdeD5A+<F:$ui5b+yL*Y&Y?d<M=/E*+NicQ#AF/L*9>L&u+%
Cb&Mcc @1i:Xt<AW%ab>EDA8\<RBWeWJ=jR>J\dh:ES@=li@@RWHYV?RBQ$CPn*EB%jY/Hwqq*yBjnY\A8S9*%=
bp?=5L EGI#1HdE<V+4T^Gh+H*TjG:<haM4=Am6LJe\LCZ$ZFqb!bPh>TZ\ED@GEDq*<BB@GHuAwMA9#uAH?R?/
BXZ>KN KFYeJEq$cHF&Za!B@GXw%VeS!TGG!59R=wIA!qyD=PHmKly6dXGm?QTey>#4N+NH:$4QKJKRVNqJ9&Xp
dBJl1k WY&Zjq?QBq@uT!&!kbi\kjdA\#cpF&A9+hk#REmI6%=#?wka?uPk/QIjl?8C1d^etjTEe#e1B#eLl&iA
dnCl\H V:b?*91%K1laVp*WbX6jW6Zp/tj49+>jY?=QVqJQtB8GGGXeV/59VhS6NiGqYy11:6hW#nT^ZF9i8*FR
P!J5%y k=A1@V^l+Q9jm%u8#?@Z%%P=%dNaPGlm8:H5#?i:5S#b&qbMbc$9/E@NAIW:K98!y@:C=Q4%klEZL4cd
9Pidy/ G+91>j:%>jW<TLkt9=/JG\Q!#^DceR<9yDBRbDW5GR<wuS\YHlaPqQ$9pA/94dXah48^Qj8#941?WGX4
1?wXqj a%HV$qG=Z4G@aGNS#/KJVRMZ@^ppElLm++:YA5Lm8NF4Xa54%G!N!K9R/16RLd!+Pd#k\<L4IIbAc1YB
4lZCN< Gt:Ld9<N:kj:N^XH@*m=NdqiMXZT<c+hbKuC=B@6IH*j$EiP*S^Aid8yB\EwB4Xk1l=$@a:>BTQ!ilc%
N%W$@b aB1+bID@FmmV5**bSu$dFSaL6lWVB*?l+pk@&&l4VXc/4#WN1IEZ>8nGReQm=tdlbA%mL8tw:LG1R/ip
$Xaqpc /5GL$^eb\k5JT@b^^\9B1?XklSlJ@meJV9@qKVbkR\$WE^dIIQhjAQqADS?&YaeBMiR#=c:BZaZFXB&Y
?E5JPd nK6P9YA6E1qjJQ4uBP<SNP@9^e*hyGIm6?IBZZ&!!t!>a5KIjJZ<?4?k9u/T!6F5>5VCDaR5kNdAtnS@
BZnW++ n8wdkka8iqkT^y?^@=1L8F1P^e1JJuZlW^n/dPjQCj@P:=VL:ElJYqyeYDKXp<Z%:aS?%wSl^$GVB5kb
hb9=Jp dF^%dqc#aiXlF#C\%wdQ&jD<pFAjT#Fkj+Iy>p>^kiWCQu+lBw6tL#+LYc$6KXKj4e/q+P9TK66*Mh@R
%1=<%D bQwH8DL9w+CaF$Ctq@9K*I8Xy/$=Q8/cm=M=aCE<@eqGGN\:IFSkmN$?8wjdAb%Ye8>6l@pQ8#Ii@RjZ
dJZYed SIhkVj+Fc/<NaE1^@k?m:Pj^<jP*MPlNYSWV+PQ6V^c=DiAJP<#>j^m6ZD1AX&=D\@1CY*jbbue=h@Ci
Y=1YZw llNtSH=@EP!G>ih=D*/?1@Rw$BiMAIN<<iA!eM@c\uwHkCyN!IjLpyqhX8k*4#V@5iPh<aW%uew/YHi^
J<weGd G\&?<jH^R+RQtXNPQwKldAmZHEnH?65?YFl+uet+hd8ZP%C9Qwac/*CA=SjBY+GN#N=+j^=5n6=<p@<J
eFyh=! Hm^&V?h>48#KRla9F=py@91C4\AZHQ%X!K>*9:ap@?Y%bNZ9Z%9N\aqm+Nc!6@!=mLwQLCX@JN4Di!Vc
SYPTQ$ ?mEViIi*!>dZFe:Ek?M1/&Hm\ZdFtVD?D6iWq#t9AGpdIE%>:?cuYP1?&da5a!?n#i^\5diVVqL/?yqi
TkkH#k Hw>G8YwVE%itN*l5mc?>p@=@b+iH/=FwK9\$<K1iK@p:V#buRFQP:uN#u=Z*#Nj=5h/@LC!Qnik+Jyb^
GKTlED ?6mG!ZpJ?5<<BQueMc#wh%I!DM/?K^y@YDA4\9!6/J@yM@?BM+JiZhEd:W95CHIVd=nD9jHhiQPRjiCB
8:mm?t E%+nV45*nCEke##m*ieNhZ%B8+a\iCRG*4t6I5EZ:^V6kEyR4iqPi$&$y@Q1c@R!ty!EHSQ1@dRKiZDm
Y?=N8H jad@85Hc6+Q>I&^et@hwSWlj<F>+wcp=\e/E%V<8CAXq$FX?@:yni?@pp/F>?>##$@M=8@9AlX#:IR@/
hEVd^l dkn8%S%u*:G%BM8Hb!wiJiC>N<q/>Nb#&ME=d?K6jq?K64Wth8&^&>=!ka*I&M6l\H+mRtQj:GR9hR<?
#iGbyG :%XX>NAqqMi/A:>w*&L@+%G@h%h>@4:9Twkul1YB%?j4N98qGmZQMWL:<P86acibWb/mq!<n6k&V#^:%
My>1Z^ DmTn^S\%tmdPVbHcjWD9w+cKjjiJZe:^AH=SaE54h<%#+H#i&a6LPBjH%ja^a&ZYqZD+&DP\BIK:q!6q
<BlP%M nZE8@HEii?Db:ipl%VQ5=QZ^p^HC=W9<&hC6+IiD6nPA1^e9:iMRn$+a\6A4/nbQG8jLB+TPl#w\N>i?
=eJ\95 ^>euq%9WldDZy=PPKyL\T#j8R:QI&@T6^H\QR9*=:HXd\WQ8mc>1pN6@M5>t?8Z%/:p^dDl>ipWk5$Ph
L/^6i> IR*M/*p%MpC6m1Dh$RV?916tu+$#H><yjQ@e*i4*Y=F1:4I&yAV=jjWQLiQ:1mplhn65=<q:hZkwN9c&
=Ml6tV XWllCMFlpX4\q=+JF>5cX=KET>j6Z1iH\=FdhTqFq?^dCh+nw&/jZ1$4/uBYLq4GlAK&*JZPZ+%uah!R
IqSJlK >E+QYeMl>kWQClBpEw:9yJwt5R&5&Ilb$>eAPP6&4AZ#>:&>AhhNH>JXb?Ac6B=c@R<q5ZCalV\m*B?#
=#!m$K d?E=iih=%p#ihKLKII&HFRRj$u#yX%/qekChn<lYF4/5\&8EDAAq8IGjLHkXL:j4CLdRL*i$y5A5IG%<
BJXHKc =lZ8BF1@i@HYHmZihQ$=\1FQ@SiIS@$dHNb1>%J!N/q:aHXmtI=+Ckw%ZMBdZANwM#H^dKHQdI=h!III
5m??Vl CNW<M8Jq&tj>6d5WbkbZ9G#mLttSp4+*=V*d@qlG$cI>aq!j*\h$=#>@^XnSQ%!FR<B:?J&KeMp?:8Eh
/CeELH Pa1:>S^8qw\#HehbNLT+6Y<:444qlNdnD:utdWEt/DI^NcdjjbbZP@umTy>=WZTYSFC4Q/mR:?uMc>*9
WDnYNq n1u@YFa9&uIipEV4FPH6ihM%d?P6p^ZZF<R%k5nTjb6Q?*La6Tj@mpem\K*1$p6\&IXZVH@alRXkWl&@
tqCb\L B@aX\Zy>utZ$ei\B6nhYcX1F9wmp\=\8lHZX%Zh=<hBu4wXD\uq^+#$ZuX>Xe+ch/wh98Th5:cdjEi+p
Z=9qLL +?CXbVy^A?pZZ8ScyVG?5q$T:YP?<jdhG@h8LNum:X&hGRF=W$:JYjFX%&4$^@bwHiECZp&5BJ>PwTE%
F/CyH4 C>XiLl?*H5hP<+dZAa#hMuYFkC6ZymMDE6e%Nk@Et&>p=&hynhGG&wXQkN4GTDm+Ai>9qbp96HY5eyp8
TLZFEt Sl6p5RVHV$?9AC^1QIyL?9*qi9&l%$ZI?JjbW!dYqQ4^e!LdN8BlQe$qRGHaBYqaQ%9\B\Ii8KNC^CP!
Epe=91 njE&F>RT*@n6=$M\yBQMp#@Awij8Yi<Guu14569Sm<M*m#NBIAq\L5&eYthL<FEudhuE+@dal>^dcheb
lK=a1y C<DhDElEGQX!6#&PQ=j?kdD&S@AMELd=l/h=j9^&iRY5+ee8^EadVP?qCl:nA=M6GS:nT>N!>=M+$dDM
lWj!4t Fydk:lpYuy/LPAPk#SNH#P6qKZd<=ctPM9MSA=DyPXet<IKXL4B%Va55kaWhD?8=^HKVe9\IE*9ihd##
Z9I^c+ I&AIP5AjL#cF:kHYyk9*/4#L&pi\C^:hu+tL:m+>+4^4IC9AH^hCnI98iwckKlwI!*JQ9^E\I5SF6/FC
nZMaJ> %B:Y?8\eujTn#@nA8qlKhLmZ&@=!<i9NYF$HpQ*J+?6Xiq%Hb9QZZ9?dJeCcniy6#VS*m<h69<6aGII^
\WCk>i eK%tdY?JaC6<Twd#ay\yi?<V:9&/b@aScJiy^&Nm&Z9lCm9Vu/hMu+Nek4F?5u+TZJ^!kk&:CYhmpZY&
GaAC%= t^t/$Z&+k!#GJuX=$L\M<GbF\:b:jYMq9WB+1AY!PpWB41\T/DQ4l5I=<:pLt$$k!&qQD?DX^:C\^hk&
NK%bDc 98kL*5uPw%lQVN%N/1m+E8#a&upCq*VWm=a$YPyjctwpM68Z:<i@4&B8CZdm/e6n+hFe*tR5A:a/eX\E
kR6Hkl M#dkL#+K&8PPQbuaIL>!ue$>JVl<RY:K=/YM:%#AYwQc8tk=D?jFZwQc>&INk*?>GaacZ%V1>i?k=h5t
*@u@p4 &MPaTE:S!qXl1:<K&X$E^Hwy6Vj$Vjm5F8Ba$QL6*&A@n8Bq8#T9d^j<!B!+*lL$=ARi&Ga&JG!Yj%1*
$4*YRC B*^KGL@H&S@M+ZqTZaC=qcS=E/Rn&N<!9SYe/PZG$X@I\<JtVBlj\hE*FMZCumyFakwIcj/el&G:iWcB
=c$H*h Fw=m^MTV9/T8hLZk+FT>8k^qH$9*DFPGB@HKC9nqtFH@DBP\$!IL8c+S?AY8wNuEY/u>9A>tc=8l%ZN:
NF%H<Y u=cT8>Rc8Ln#QC5+cC$@mWDS<9G:@/X=nu#jm:9>G+p<h6Y\mbWd@aMZE&8%N:qDCAR9:a=p=4E4eNyh
F5EbCu F@JlNeEnS@Du\HXnZ$YdRIRH:abNct*Rl<^^ZJ?IlX:@T>yM@jFd%mjLjnjGjW%jL9in$:LqibJ>Eh:q
6/Z\bT S>P61m9ldj1Z$bR#QJQYJDe<p$aWeRRtHYq8BNC?<q4peSPGIFh@@nb66aPAlcjCW@8=h!*Mk>=uBy=L
K:MwcG aZEA5lDHJc<HA6Ta8GZ&BZ9LyTIw5q*IHnJtHkaA%m^p44G>#%?4IGQCSSj^=Ht\1ZQe1H=wQhcFC?Ak
@c$H*B !9leCmd$RRR5DGHlpQD+euXRZ=@>%q%N$Bj<YSMG#!54wEJR#@\M&?DBE&GF+\wL<&d^e&6^:!Rd:5KL
FC\eZP F*n=FkaZtIbw=u?YnBNu#Z>C$J/:yh@XE#cn5bGKEe/C\\HL?td#^wa^jmd#=u#AuuqXNY=ya1ZqFb$K
L5CQik mi<@IQ8y6J:VN@u=w8jl!:LZ&ncbA\9d9V$!N5?clIZ*H6C\dZPj#yQZp/Kc>ZBJESp99VXtEThqqwtd
C?=aJb %\:PDTitnu@M>PqAPuN>#!eN*wZ>@>FaGVG^<c=<IelKE?CMCB>j$:Zt!PFG*SK$LY4>?Q%cwc5E\9>6
<!mmI* cWh5TTj9KKBlniESD1=e!5RP^^NGMYCQl+Ze?85DDC=C>T\V#=Tt4@$i%$ky8&c^q@%w4n+RJk^l%NNa
wT/S5$ #BQ>+q1n:+m&5MmBLV4lNKDXcPCeM@M5<cBwTpYIKH!5*=lAZ?*NhLk9&=Z*b9L+6c!bR8LlXN\qj!b>
w=k1mS b5#YbiGB68<yud9?wm@pBmmKk/DySZ*YMSGu9?B65Xl%1:/6^VyLt<8P>DmYqk%y@DBG^95Ga>\=96dS
n41JuA mnA$<&qq!AphwiMiMwYlCM1DaEG*4&ENtnhLn96DL?F?4Fbp4hRnTjLTE<pK<6u/5@i!F<LEb/J#L%%N
T8BBqR kM>J:VMlA+MY!5lBiy9MXLJ^V>#>9Y%/yNS?bnJ9^i4Xa>Pdjm9!KYjd&cjH#Bj9ZQ>48/t<lc8d9YR4
X<TC@c =D:nD4IXKHd5dV*Y9P@44R+14hy%JE4yqRlkhY==ck<Ln^8%*5LY/Dny4n!Lu19%5^=le<L%C<e$Dyyw
?&Sl%J /jAl:tl1y&8&^+^XnpCEF@Y%=I1RV1D6$k#e$cmkWj%!hC@9!^P6$>Td#wn^u%!EyJFFNl=#?5hQXT:N
-AtY>R 0008a930e98001202b4 Page 414 of binaries2.zip
Et6Pq4 &>#Z*QMQCB+t:8l9DII4\Ltqhi%n>!b^BCe8E@iK4cdZa?@qliLXa9$X+NBWaHI4=98Am?AGA6eVA6X!
1MZXC$ aGuA*6Kplat4+EQ6@#>q6/#naR\\KumXJk\D15^<5Te<VK!FH%qH+GJdNhm9bCjVe:pc%?^96Ze@aHMZ
!6p=aH cwj46iGR6jqAn#p>ub9Vu@ZD5NH&+RRa9?/6XPGhc8R+nX&$LB8^dd=tc=b/emA%\8^jk9IMqN/HQ#6>
hTb&V+ 9Fl+>T!ZuDlQ%N\8wiSlQtXhY1:@bF!HMZF:/?%#Lq>^#?9Lk@kT=+w=Pube<LT=EL*u98i?mF5%9>AH
R+\^K* *kiwdR=SV%tn<Yq/L9*D&Vcp96Z$9G*B&hbT595y8c%y>\CP5&*C\1jy#RcwPLP&E4jX>NRp=hy$8cF&
YQbjC# CX=@?uyNlMj+DP<B:\*h/+X/P?Xw9MYL%+VHiQ:&w$G\L+cZ*E8&Ph*SF8!8+Mud==BmN8jVMpyYCYRE
6MKaA? dVDut<Z>hZS<=$cy9w@jyQ\>!RD:G$\H4cHGN\%N=4TyQuGd>ZlbcmB+A>#S<:QWbT4j%wJD<M:Bte!X
SjN5WS KPDta6JNJP@^PTVRly^DqB$iEc>4N8C+JcAERR+9ey8#1C8<#/tlhNt4bN=6@DK=9T9m8imuZBmCmaiJ
eqCZpl VV@HAViCt&^#X5Cu4kpCC86cnt*G=BNS$Pb9%l5A^w8FZdLK#8B@=D#4EICMkIXDe\\T5yY?!N\w=YL8
+@#HAB DjC9H*?$%W@+&l9AYBMG%+ZPC18FQMuNdM5>pXt9%?8@EiLlthq<iQ8>?QZc+@*j9t6!t\9eLP#qtNM8
%mtAlM iNN9m8>Kq:LA4d%6Y%:/<PjC^=diAKhY@c<*=M@YX4SJa<Y9wZm*aipBt4<B9$%P*\:TLB?4%9K9FEnT
dDiK?5 >=bau<e8nK8<kYLQ<#MldR/yWcIaZkie\REWZ<>Il=S=E+<#EZchw^ebZYISh6@ZdLWS/=GuI/@^+/in
5e*a8b 6=FGbi?/?$>eName9CdDVq+VCeh9e5<wh9yw/S?&pw9KTDiHa4elk:laNX$@Qubh&XkQ:<:Vh#n9GAPB
hiySK^ G\m?QBuHBQ9E6l5IH<b\6#en8^a%\n1A8&+?jXje@F9VABp?6Rjy=jlbn^AXMm&%=*V>u$@lu<:a9>+d
YKICeT c:4AZb?SJc1hXhdhJ&ikn@&M::@qVY=E/^%d9eT/e:/8%YVHw*PGdFp=9b+BT18?QmYHLa=<9==y4w?+
lXhKu4 utuWAQZCEKSXu*&tXB:kIW/qQl\WLWRJV1pRWlEeFJ*kb^+Wqa&MZ<@MLic:tS*6MZE#&&H1Z5?MuYX*
WupY@@ nGw+k@mwt$A5EV<S4&hG4LPuXPknkNI/=d@&/mJ+Fl<>>yJIh1nQ&A>KRd4&m#PdS8d*I/:ZPmamH98*
B9p*8X BI?IinpnXub9Fp!i>^+!qmZ$BR@GB9*FQNu9IaHb>*qRN>HQ=Hd/#RYK9NWd5ddHHT@i:d6D%M@LciG<
9P+mVc \QZ+ynb85MPA<Gc%F$#d%#aNMHljT5DG^Y?ZDj^uDSjlKtp8\4/IpR*$/dAHZQF%#4d/6E$+F8>eht@+
BYj&e4 5idp/YQZ=!NPkwe^&LaMGw6u%WY\lceKjbNQ*mSiw5#P=?b1=#y5Vb@V4nSM*D4GIFpl9l/@Qu=>&4j4
\6p^J= 4D9%9PdwCHS*QN*HH4kd*$=:4^jX!<nYBH&?4e1&BkkaL4#w5/TeNN+HjW:dCMHhun@yC?L?hD5h=u!@
Km$@Zm qZD/y5\YNkyJT:n!>l8*!+KVS!dc:LH1A5XHaiHqtw9ZFmZHAHJN$G>R:iYc8$?D6#WAQ%u6kYjDCN$>
XWKKX4 qnaQ?SIT8^@Q4/F1q=HnM@yaEP$NtMY>Rj*G4H:XG?5JAVA#HZ>P$$w4G1e+na6$q>a=b^P\ee%WQ*+u
N&<9YM eiqJeB4dyhpHb+<uWY?iQKB4M<eB*wMRkIi%S\%J$KZbi/8Ald5G&mCGbe=KASK6kwQh51H+JlcLb^?E
NujZIh &FK$+L\C1t9Q>RRQNeLk!hDZ6RTDiywCIR>=C=<PiT1G5RAG#?+dXq6C4J##+*5qF?N9Y+JdiT+:BA?n
$L@S%h J%CAqJhec@bFV+<>QYh:+e#SbQ8RT%^TbTdYpwRhP69MHZ6:+S&m:QHm%?iEF+w8BhE:#1JmJ!<X>nWy
T*:!c$ X<$Hqe1G$=n%66mSeX&8Wm9umhi>&JE5IXjN=iE+:/bY:aphi:6N6RjNb!*AH>e5?LHBQTKp?lC1=%K4
NhAwau D#A<<uXYPFYZDdWGIIdFKSDS:5DqGhAJkHIT8LnuJaSH/Lm:jKadHV9*?5w4LK=&<i&Y=MM>d<he^>!c
9mZIGS WNW#IMY$:=A:mM86??u*y?bpqK>ubPLy+biiH%?!5Ri8aZb/iQ4<$qMRTqT=#%6#jl:jp9LE@y^QiCV?
K+I4I% 6I<^LPc^+:PK9XPPm:VGldk1a:=YhSt=R=Vbj%Cq\b8l$^6pjA%#L$#%85b#4:5n:4uI*$%<>^q!mZHS
khH#cJ 6&w@4N/Yy^Q5$4TuS6V+%Y4JtnXXP#&NJ=BW<HRM&MVD/?!k\+Hd5cq?4dPIE&q%HQ=$KqcHF?^K8P\C
IAPWtL PaC?FYHiG$C5Ad^pdhI$9i9u/X$?/R/IK9%Sn\9n^I*/S6>La!8Ald%TGlwk/F+#mTdtQu&6LubZ5E<<
&y8lLd eSE@ih<QPnQHP=+km@4:WI&^<Lyh^q?+S^G!BcQADkDdQPY9*Qh*DiHNi%:kCKQP54\y^\i6>9*KD4FS
F?C:ti iCc%4VG<:Eele9ZnP+pG:AHD>44#L+aZlqy\nhJn8Bj*q@u*GL6QuL!@9K#V1:c!4H/c<#!e*du?CwnD
ECZG6S <Vk?wb$u/R:4*e6&XXB:K>69^p+L6Whd!q+eC!pLX\QkyniPjW6iiEF@WA^ZR1l/wSlMh@KkPQc<9C$4
b?QmdE a>@Hjk6jiLt<&P^dw\Z+QNteiu$+jJ6=K*yViT%:$Zq58@H?j/Bm8Y1u1Bh*R+66pAiu*CJ*u<huJ<S+
d5q+LS H6#DIC=6@G/Qpke8QwSj89*@!6:%Rc:SB1mB@6B?i$4J+=iH8@*Pp4&&l1d5Xjce?TD+4<VLhQ!NhmwZ
Y8Vt=k ci\1=$Z:&e5\@BW^naWuL&i%:aQeI^Dw51J%%96\?JAmYiw4J*lGMj*uPDE><kBt9#=5?I#:A\JHTkyV
bhyCQ# AFQpKM>c=Bd9KHXWCbC&hM5jq\DTh:YLhedc*HaFQnEckKSSIZ99^1d4+u&q%4wX<Pyl9E%KWQ+&LuJc
?G6!5/ \eSi\APphj!S&V?@hTLi4>Y%%bS:IpwGX/Y:G^ImGc=#qI*5LXq<A\uVbHi>FndJC+m/\DNJBCT=1/\>
K@a+a> ijH&eu=jL41?R%\PjLW:$NniAa^d8%tZde$85#$c%l$idS\PpFcGF45WZVbP!qTmq=*X68leNH=/knpt
SB4cKV khN&nQ=5$ER<@9MNRyIEDIIQDM:@J@SphM+i?@AW*?46l!yhdA6>#q+Gp!X%=ybQ8tD@B&DcdTpeJAWy
t<SpLP G9C$=:aq4CRWeSqeHTla1SMSA&h\a58jk4>4YJtWRPh*PMCVpJE$AB$9FIKpD%h&$pb\8^>qGYEcjy4d
I9Pwbh jei%W/jVNFnanw=c9wY@w=cSYEJIb4WpCN>W5PN1lMS$tqE94a/T85>hZk149eiSHtTNmV6R&4kPF&Sq
j$V@NJ /:R5K/qBuWEdd<@XySZ?ayaQ69TlHQ?Gn+BQq#/5A@\4y9LKtApPt?a<&$iItWAEZil!4HbIy5=Ma?*V
AL9>Cd qT@XK::^Q/beHllWW8Ei&PM5VKqKS\1iFC!aX6Gh5/1I\>9Bdatda<KJ1KE=>69BjkB6W6GRNJcjGl#&
Qi<%NN ylyQuB^QQBNVaLdm*b61B^1hkh1F:9Zl>Y#&?ja+u!\=X=dQ:ByYaDhw*INcN^aYqnF5I/LEmcQEV^tH
*qy>C# b+KpmLIWYpLpqcVZPV5I?56@1EcJp!=#5m%b$>%WLaX6yd#kPE$j@&WunyKGpIw&Tual^W@b\+QK!Vpw
eu#>/u m:dmJ$wWc1G8ZawdKS&w+qDuKGmQ6!pKTCM@tK!N5w1RQmWKbSMu#9qVG!/!\Ip=lMY$\:StRLDMM$JR
HZeHtt RFdhFPAMAk/$15YLhjLQpQCcS6EL<NpD1G1Y5%JS&Jd6XJBb#J&=+@CjmQcqLy1*G414&YlPV:iYJZdZ
ZPQp=l GDc&!DSedwmn:B&m^Q&1mH^4VNYk^EqyKdcnJ8ZAJ@1VXQ=%YX#J#LJ&!YYNbeu6//qlb#ICRjGpaSR1
&>#T%I 4<:V#dNZ&>9S:dQZ&>V#/%9Lc>9S%X*j*M^DG\BA:Mu:eMX/@j^!h\bMT%i:i*y+<iL^!y6?yn@*q4&:
S:m&LQ jX5d/:6+Luu!$wt@jRP5HRh<?paeT!bbp/$&WpR^^ji@F!WFhwB6H+=6H#!1VS&PYF4ZjGhcCwlkn?Ll
k^:5%Z Dt*hcb%kK<P&Fe/&td^bZ4#q:\aXl!QH?5/Pa?6Iu6/5pLmj*9du&R%XZMK&y#L=$Lw9<=*hpQWlLT$e
?u^*Hj S>&<D<ND/<K=$$#bhk=<Lbn8TH\%AI&Z!@ajBZ&wQ*1+9K/+@hl?1C4@JVD&*1>F\j^@hQ\HQJ99F#?M
C%I+Bn t/YwWa1&CEXX%Y=6CcwWSXX4q%J:%q+l&6w44XtW%Gn6W4N16Xd5&H8WIDaSK$V8J@%<j<@#9Q/9=@XQ
&T\RB< n89Phii?4?6e=:#Q?=\4L+t!5nJhY%Y<R5#=9*MTMGnR6ckk&n?eMt!HmwqK&t*XJHYt%^E6DutlYBND
C@k=4* WmhiIX/EWXn*yDCjP5K/<#>%+^WTS^NjW?W#=yP/\m*=\1%5m:FT<aiH?w5TldtcXI9ZW6/R4mNJ+%GE
Kip:cS My$u<uI4B=eIqS$uQ=huY<ym4Eh5^/Lp9cX*HTtF8cc8+5TPde?aXpa=w>9+tQNP%yNJ%yM^>Eu@Q#5N
^bXtF4 jiZm89QSm#STemiT/$%?lLY&^?Th9^&QDaSd4C&+SFlDhQe#9^E5QG@JGdF=C61a8khhm!p^RdSa8?cb
m+lkpK LIeilJ=/bYF%V@P9c:ByCPaIYy68>HT\B#QiTcw5a\*XNZp?C+Mclw1tLNItFST*ZNe\DNX/b5#%K1bE
C<S/=8 >dGX9q1PwJaJQ=Z8X$+nnk:YweLwGBd?%@SPNjuC8piLdI6LLW!1?k9/m=hbiGNiS&nyZ!$w!>Q?pCil
hKkmRH i/1Lw:IJ^R6/hq&LWI:ZZ=^qQSqp<+\ZmitM8LPp!iZJY%q&#Pmy!ju^clCc>NbI+1SLZi?#n5X5VWNw
NV\F$d :</hVWX6\=P^SetP!4I:cbKemCbn1k5euXVM?cd&*&PJMq%eIq5?ZX9KV!P&jK+*tq#Y:pJ:u%<u!mZ>
u\HI9a 1K\#n/mcJp*R^jbhM5c#de/#%>VJ&y%>!ctq8lN8^/>qeu?5bqFi>!nC&6VE!CDmy$FdQJdqum:8/n$S
LE:y<X PyItQS%=n!L<y=Ld$?@$c5RLc%\dPND8YL#Y^cdDySQ9ii>NtRmh$B+:wnZ@jcJWRVHLLRF%$pCchIbR
Hwaqqu w&8CyEubQ<5qjT6McJH6P6ZhV=RwLw&@1+&PaZpul/b4?>qYWFlaGH%QlA9LdRn6GBit/:DYq86aV##n
%$SVkI RGI/m5@dZycJ9I@\nDqj?BQhXmCi1/id=>E9RliRGqHhGZ<uZ9hA8/&kVNn%=6X5iwha=+++p5ce<VaT
PBaFq6 GlK8I9?e>BJ4amV+kIV#c$I^T??pP>kNI1\64J>h/!Abd5NT$Nw\%/V4k&9^DdXWBctCjBE/1S>\49<:
9h9HN9 VLl<ZANTBdqE/AT?itW6QSClc$8<JtlNRyCN^!iD6y>I$bTCtpK8WK#G5/\Dhd84S8!4uGtCJBCditne
q*Y*Cd QmXB\#C$RF915?T>@K5hXjHj#4K&QFP5VX%F:u!wchCR%^G=5@+nLa*6#ZjDPL1&!nKS1$nSSHuZ4c6L
mydLH< VneVJi<J8:P9*18u>$1@86yqHwGPYW4Jy@?QEQ=jPYt@$!8$><uwYk#TnyQpNM>+aY*=N%?=dB=FjK8^
-AGdJH 0004c99cd83001202b4 Page 415 of binaries2.zip
@St&\w %ycMJqp*^W=88e>Vdq5p*9PYRh5eKS46488ij8&XM?m:GeEq#y&myb=/c%WPuZApFB6/+N#d>4NL5M6I
WNENct cK>M?%HKWq6<k<u#6F/yFL5jKZb*&8d8/4#=L6%XnCebw1BMlP1^Abi%mVGu$dYP^e5%G6eE6R!jJW1w
ceLnZV y#:\:KL69j&X8%na1Xk>XjBPW9XIjL:!uV>6KZq1MWlGkc?XZ/?!cX!LEJ$lZXWX#>KSHlh@%?VQa!E=
8^B&m> k\/+h69Qj<DQ<^G=k?c!hpI!Tp$bZTNlTTjtytnc$4>@!**@?N@@V&q<LCm&Meucm4B&LSPy=Z6GktqH
KQl#66 >B<jdRFSdk&&jM=E65XQ6=#N+:ZXF?P5Zd>!6k%H*PpXWI@?iF&Q$=ldQeI4Qy@W%=C<4tE8?8hh^@K#
^bw6TT Sk*TwyPM45*ciZbh?aiRAM<WV@nXFFKMyHPtnEh<FjTMEI$Z#>N?umyaXXq&X?%ubtwjKVVw:VmN8dT%
j8@>wi p!1@T>RF<X<%p/ly<P^>/TR1jFPW*?cbnNp#<^91XhNPhuJLcaJZu<&4#\b5cE9FY#9&&ap>T$u:$/mh
$u6LwZ ?c*t&/TS%Gke9a%JVIq#bpF^^%%6!/8C$in4&kJqhaJycLwqnYh>Y6nZ<eLQnNk@F4nYyEKkdapp+t<d
YpFWQm Vi^ISX=6t:8V6bLcJc<i:%4*QCYj!!6SWajnKu?<cByYNH1%#>4>&c1\M9L@BdWuWu6XMQ?1:J%im/d@
#L@R&V e?dt%c+P>C@&j?uHS?j#ytSHR1>C@Fe^#<iXhjhnQBY94!i!iZWJ*m5$TTqRZ\=IiQ@+S&4M?b4!XZ/Y
?nb&YK 6J*ZWWFBRdAy<p?Z@6KeWpGG!MI8ebKypDFR@JjpLyFh?pBGy1/8K9YW:QJV#ci<t4=P6ubp@@<iXGVp
c&nW^a hV@@:\=9X?pA&ZM!/96pbPS*=<nId^iSpeW>ycP:T%bq8Phhbdk:?<dn6aiZud5HPSqAi9^@S1Q<@$+R
YH=h1q yp%GF4>P=*WbVp6>YahSMa!M1%Z<H6q9EAW6:^5cS$eHRTPnF<<jQZ4$\wkM*\+Rcdy8+kmyI%GaZ4jC
e4E\Pn \CEMS8uW^*lemVkZmMtB\5FYCHGWEk=%kCP%w=N:R6%Z>PBK@#wwPKtbwA91Sb&&u4$9QIPNK\666iRd
nltZ<@ p5/8AGk#HE4@CCl=kl9@G:kBtXJpWwKDNbH49+L!CW%Hlh$dKKWnVeThkNCnm8@+DTICp>NJ=+DEFG^k
4w:D+/ <LD$uCDa/Ppa5jK58a!Al!5hl?k4^\WReCk^CGuY\1M4lYi<@tj/NWVnMV1QHenHa\\QAqPAQ!CNn$Hw
XlCA^T H:MbEm!:E+S/n>l#RlcpWdt+>bC9PFRi=SdIBEeWt1eVJ/w<\8VpXcNHMT&Qu:hAjncDb9Ck?jJCwIaa
^q:ue> hY^eka>cBNYVbkN9Z9FA=iDGLJM^?BAhPBlBLD\Z@RE>GY9Caby?pm=I^/WF+TaS1%5\MGKQMH4l54&I
DC$c&# ^a%jk5KeAQlIIKbiFbSDYp9k=kFybACN+\uE<WDl8dmSWM$enDapeAHcGtbI&9E5M6k$ATD9uMB6DIJ@
W^&jI: lZRHFK/MPGt8D>8thlR5PQumGW^##?NH/&9h\l%k&4I+e/@XA&#X$K>!FDS$Q4*S1tcI&u?+<GERCuMI
5:bbtj JDwG9/EyuIjku5/8uC^lYyqkSIAaAkLcq#A=@:\J+@@uN#DJnK6E/15WFSiWE\8EB>bdABkTCAJNXlJ@
PYS#eP l^RjEI+$b+tFcdD6^a/\/6CBe+ey<YLwQD+akWMD+ndkV6\G5iNVe^S8HR1AIN\%8EYkcc?d\^\CtpiB
dNC@Kq Ed9mPcF$dyBKcSnSw:D%?nwAklNCNw=iw=VP>F&c<IlYPYl4qS4&Liduj8H^S#jAhhN+pA1J*M6DFb\5
jKaq$W qa=>^I!iMiYE1QCjp8!Lj&QMBN^$RW:BEFSAY\W+Cp8QWnb^!Gqt^W15+6iJI$8aWYAY68DSH:n6#pNc
6>@/:D Z\IG<R/>m8pt?NLB#9cI+u8aW@\B=F+Z6LWZ<!J$aqG<w@Hn5T<?XIIce8FA>Fnk/A@YpL^kR9Bn+\1k
c4FbFy 1H+C:E54jB>JYkY^A1CHITh#w4aRT5eYZ<>tTVbVhu:S1uRGP>e@^Y$DJ$jGCLMV!A:1S%M\QVJuIjBM
?F&m1+ 5\HS1=t#mD&FuIR6Au<l9^chqN?u$Y<:iRB<LaG:\Fm4SYdFEphPMAJQe6ql@lIm?\Zp5bX<ykGBDZj+
bS&WiX <W!j<nDA+Y<4+l*Ja>ci5DZq$VMR+kQ=@!JNu+BCDeyjImwF@BI8*4bPqt<&H?uYBnIX6uTQbB95^Z?w
t&++e6 G:A>8ty@J%dJV!kJFNw=:I@u<LIJP^AH%JtmEVG6$ana$EAMa9?@\bV\KLA*/9MlkC:$SmQlN=qKV5yV
J8WbhX VXNjnaZGTuDTeijP&PmEKLdhjE#:SInVm!:uTZmA#C?MRZ>?=$Ph4#!qD$^L4jTBa5Dk4DAZ9^+cBM1J
W$6d46 \9#*Il@%Gaelnc$QuMDBJuy@k!uLjVb@t**T1jF??DqGnY8/<hJWWuLRhHQ+de=adeM/WNT5:c$i/>RI
aP&\^5 \k5ln\6I^WDaR1IEmpiWa8/SI@iZ+M=yh?Hi=%8mH?1k%t>?tp6Y#bkC^kYDX>Ft^lHm%\1K9%jj8PX\
SpYmI^ kckFmyWhMGYEI$SPNY+mNAk*:YEPlhuleWRwWHGlhIwhKC#5hmLt>P^a4KmylMMmBhlE^Wa8/>bHL%XP
ENTkHa PZ>idR$$@C#Gwj!l6pwItIB6pmCWH@n@4G1#>b?leBlqCLCkbEKQcq&kd/JD+I@4+@W@jKJJ?I+%Nl4c
j!6q^u !k>IjnBTI+^/WML</ep6qkCFjS@Be5ZFVd@W@liTL/?<Glm:&<>BdM&EXV+KlZwAw?jkW1Jj?^L+Xnqh
!/RyTq CQcc<$Mi=4FL%^q?:JSicnT>&JNS/uN<CRA:ctPp>S\1*GA@<5n^^PI^m/n@IiFQ:mqm+\B^q%+@:Y%A
NMu:QV +XqI+R#FJH:PlcYQ:lh66J8m@>i9BXTmGn6GAw^p/qNjD=4TJ8wC1@K%HaJ*WSeTE!%:^I<RYmZeXk5$
Z$DmYb NQAAw4$I/1<VJj#niH<CDw%DRhaRm\nRBc1pFNN$IaM@e!M^Ha:EkcTic8B/VyDRFFYTZ@W<WBJT9W+C
Hd/Vn= %D>PCRTaMuB4WD\C:LAD>D^eH1tj/YjmkN#4?*N&w+l4VXat$nl\eMabqLXp6tV^?\j#<Y@a4MHiYZ5h
WW??Za $i$H<IZu1NwQ:u^=$6F^:EDT@LQ:$hGHI?^P=C*>/&iPVlL4*t!K+#Z<n55V9#4PMM4dWkjRQH5tl%I5
qpNG!p y?t#&5\>@5I##iX%YS>VnLMXy>m?8b5a8RjkQR15@ZZ^XT1YJk>ihB<K1Yb\QD>^i%uGp%^m<IKPbW4$
ulWdZI jQ9pchiy*dPG&WYG?1+ubw+nIeeT9@4lh&4D#Nh&<ZHpKqn$J*4IDup4<C\Il:IMQI:K/R:eEe<l@TF*
E=>FLQ +H*Hm8lnSc#uJEB5&PtuLZ64!@N/VRdI##\I^PNHpd^mi<DRAIdutJJu8t\Vc>w?F=FP8bntX&LQ=C1^
Dpy>9P eZntPXKH6pNZ91?1>PBn=haIGp=w=QPc+hVm8##PjMwFpq?CVB@h/%waBJXEbD9%XKGk<jH%5Zy+mDJE
lmHIP! Lhp?An?@C>h5#HqaW*E+HQXH^ykB&LPb64\4bJAq5Wwnc8B9RlhA>=MaZ/$6$HM/aybhy<6>PA:d%K@:
wa@jmy WZe?nmqyInYLkLI*=n9$CIYR^9Vnn\54AHFkAS8$&88*N!jjtk=T>wN6CMuyDb#=Fq=4N&bwI6=>@G6A
M1MGNe ^tqi4?yZ1jQcXtTTFtZ6<w9je<:QIL@ES1mdF18XWM>adl%M5uA#He$+u1Y>kiakRnhjniT@jk#/%y#N
waS!T6 ?4H/>1<?#RS^!aeKY*w>#X1Cb&tnjJYylmX8/uenQ&w#@HCwLe4Y>4wEtT1G6GRd9D+%CZ=?F%d>49ZM
Nc1/F* :h5NYKEC#PQ!G=<jP9ThF$BIRWVLLl#!p1yG\$%n!m%*^4V%C@6M64BMty@dm/cuFlhQ4uSX/GMkSkL&
uuKdcX 8k+MA+NjuV\Vu1=B4FN!4liA@>DtTZXI^W>kZqRa!K4\^BaHuI*LLZb?l\b?jcy?RDe>um\D1@:^&F^m
EG@:*p K1lcVZ*9&JL5@aPt<lijE+DF^WNkS/mbTSpd8IQIcTY^VEkEBl><iE/@&F1je\F8P\ZYy6Yc#$G85Fub
>^YwSb NTWmMbkiM+VHLNWVk9H?JIa/44mADdRYY/+R/<qLB@a#P%Plb!=?YiXpL>bP=dPW4m</F+4PY!W6yhGX
mh?!4F y:/#WD%1ty6>&t/hFbG*dd+!J^p5:hH*5+ddL!GudNLk@iW$=wlnW^*G/hY!@L4Iyb&cuR8qd$P$*D=<
VFbabD aa%P>T8NH+=Qh/Ic8>p!95kuJGehFYm^Z:pYeJNmN/*b?FE4HpLam%MQ+QKqZ^<V#*</CL6a9NLWM@Q:
GmllW& cLcd/$15?BPPpEj^:EIJ^&VTd**>:Sc?mhV9**\ww^Cp&?nk<:=&@ub>+6H+cFDddFaVRi&Yh1@SJj>#
:bt*T& 8=h*1Y>wA%V:btGQuy$*>J$>Vl>+w*%b>P4C>?V:\Hca4%6nyW?1i*y4unV#?cKleVHX<jn*6JGyXqYZ
B^AGuu #bnZ6iMBqB/$4>pD1A?Cn$aF%&aVFm8@Fwk5K6LbYy+?\wtNFYBtR^MjZ+TaHPWeLS%q&$t18dMnnB8k
yQimy5 mcl9b@cPiVdPPnKy%bQiKGV/JN%T/j!h4&b8H=/G6LP*QM>HZ>=eEF\KBp=#V*Cw%l^wcQAEdpaeDPBQ
N8CBnE eHQmPj*+dZnPY59mii58aZI&RH!caa:j+>9m^W#?JS^N5=CLyApt*J$5eD/&JJtSjtdEiNcL5j**1PZp
$=<Gnb ?e#tjJ\%*%9L+jGt///&#=?XmB:WW8!<QFq=4mc5AXi>hc%qwVdtVbdp8$NDuhimpWG1dtY*P9*d#ZVl
PCW8p! dlE:=hp:88kS4mjNmNA>ui+uWnSCk:IFM$l:!Y&/FCH^&eRFb/5LCBc6=$6jbCqlbbZ@ad/Dik6:4HN!
WD!9Ep XmJpwBCD1:#$y:qb:DLuR<#YlIbkYcQBp#dVS1*5^u1@*hB=&4qib=/nh&>Ful?HyMVSDMqcQTb1B=Wt
WD:+@P NZbqDW#Pn!Z*qJnLJ:?XV:T^tKu?Ib<Pt>5dnl5/d<A5iwB*A\?W#ue\T+mew!a<V$k?b14qBLkk/iD<
%Hd*BH dp!<W*/hyAu>%mHMEnc?j#+bZKjQXh9Za#/ae*tJ>Z=9V5^/VyyNTVtb>JVn<@jhL%CV6$H9ZN+Z?%4L
I\jtci uhnZ9c>VDa:c9P!wR@hD+9q+m=BJ%+m$\<4<8yP9896^GWQTD?yqRdbCwpi1$GaPC4<N=CA\*dnlytQ>
S5=4I6 5Xb^qEHkBnEa5kERC@9IA=w&/yieT4?J%/NwY\b1DNTjG&C&K5FbnNe5du:4a4n1hmhCZc#kuINuGMY4
P+KG!t eBEc&k1^jKIXQ8Sk*j9>Cm86H9L/>w5Kbi!c=$5dITYh1%a&9cc41wdA5GM48mC#hXtwEL??ELJI!w8p
amZKuL bljI?SM1nn<h^lVm6&A\ICwtG&>LQIAmTcnbRpGR1F+EA1cED\$NlS:DWEP6FeR>lZQH=yDt$Nl#K>yt
5kw+yE \C#X$BKaW1l@6&9wP*u=%hdT*BQA>w1%uymm=nHnqML8k/&T\jSAYM@$cww+=e8tS4>kZdk&6uHj5>Tt
auu5jy IKMyQ<CLF46^8wZe/pln$M1/XHdN+YJ\ed+CaIHe=ktCIYJcktTSYQ\&1ewhC#!G=>VkRj!V?H^ktH^w
:ZnJcp X$ZwS15GD@RE<WEeHI\cABBbAPua#aEw&IQIAuHAW^Vj:!9BGQ>EkMmX^uQye8TL4<b!:ZynC!qu6Sce
VJ$4l* Hu+DmG%u6??Fn9YwQ$HiTYNH&u4hWk:/D/YkbAA#Qd>SRECp9:>@hEb^<d>j*Tw^ne*<FJ*yGGV9aP@k
-ApVHZ 000d6001a9b001202b4 Page 416 of binaries2.zip
Q?YYZa pJH^/XN/hHR//SkVHbNSZEyY@NZQ#5??$N:P/aYSj>1H!yKTpq?qJa*$ycZFqjTqYbY@K8p4T:?W$6QS
\DEd&i N>JXX6KS@Ty6KKW44T!6LMu<:\hGanJLmp5!Tb&T4JJT554KBk1!%Jpn<uiZ=!:4D9d%>DH?>8meY%dn
QtS?IZ ?4VkGtmcD*ZnE9JFW/MV!ib<*pT1ch^<F:+WF5FyGhqDV=cI=cM68!wh*m/@EQEd!j!I*ny?:H5tGW9F
1M+K*d ??ke5Xc&Q\LmQSGb8A@dWd#p$4T/duX@ca^Lm\^B#a$ZuFPYnMDGltZRAp##=!Ttj@h1iWS$Gw<Mn%Jb
S56>%t iFDkuaM6uI!$5H6n<c65*/E^Mnby@XStlGJBAnJIN8eLiiCj^SDb#!D/I<5*ML<#*NiDwP49hA<6XeXi
twmqwp X?dNHZAQy&pq^%!l6dm#X>@6Y8#P+Xiu=?Z<LZMpiSML1de@c/hZ4bG@Em<VJ@DWDn1@\XHHH!>*?@y?
X@IXY* *88A:tYjQIt?^CEEw/8u8l4m8Y8<Vqb^J=eeneCdPpNh%+uCJ>LjiSJ?KJ&YkiZ>?CX/!Abi9a/aH4MI
&$kq/9 a6YXZwuwqi=QiQ9y=GdELE8PZa^k#b%LR:qbaeHhb6j%lIwie8=yZe>ma@+%P=wq8GX:@X8Zad!8\6d:
uR1Jh+ \IP&\PSI^<nS6lA<n*TXiccy8Ga#1&cw:6dD/GNNd%:@i$&GQK:u:$V<6JXZZwjnLqN?q#9/$TnD?9mw
un?nSV u89LitHH/?9Dinj*jlp$W:XbIMAJWC1*b98Zl<^Z/lHJ19T91\:Fu\=^&dm6/&ucj#/>yD+cibFGVP#i
tRpdBT a@:TTQZ4Tn^:=Ptk\?QZ/>dZj:YynYdimhY=!qT?/d%dLV5hcQXian4lequq$=VnYjh<pI!X@XiF4IDM
5@Cnb@ e58Kpm8D:i!b%\Q:u8?NYTNtTmHK8=FPYR?K6D!^aINb1J?n/yiR4aj9!LZI@uLtJ8w!LNZJ>C<e:8dN
/$n\=T htTGXqud%VuL<pn$*DSE=m>wGLDblI#EX*D1!&^EKip*!u%5YdTdBE8DCXH*#<T9e6lKw%4#6\c+lLLD
aXP!d% dP$Vcc^F59&6\%+@*9=EKWp@iT#Eh%9^=t4<eP^5Y+PRhWGDX<Vq%b>dA&A\564upW?>pQJq8?jDu*cQ
9jDtTc PYljC4\j@Q6tV?EqSQH4KE*p=hT#J1*ypS4tJc@kc@1w%Hj%88BiA@+:P@$m%d11=%IqjN6&9Fji$SuV
=qKL&H QB!aM=I&pGj99bJ^k*1+L8@h1*#wy5X\qEBni9%$ApnhCF=twD=maMT1bYj+ItZpY&cy$ISa4+/\PGPt
lY*BP\ p@Z+$>RaP4dnmB4/u+IbY\NF8<??c6N%lFB@/Yb>jP?!yW1\khGMMQbqccC?hlX>4<%tRb%#TjcFD!T^
+LnqPc <^L#/&hMF$qMYp<DQwX%NR>e:?acVl5+*9Q@tJFcP#k*PaP&e@eQ41@:<WhajVZZWK*<j8XGRX:QAHIB
h$:uKu ZajhQin/Wdm>=G&T1XZR?+R@K4K*?Q6QSd%yc1i!^t9*?<i@bYa/^iWTH#kG!uXLMd:myAlV%i:5=/+!
+GX\*p 8@FkLc4<Saa*#9Q4lMA#=/G@8TWQZWyyPN+88H+YnDM</FXW8HVX1ESu*CbQ8!4=*9i9n>K6Bi@&h:yX
#Dhe@^ Jyk=XcW1$+9wp!pG@*J^t4VJ8:>bqlu:%+Yb&CKDNI85AY*%ZX1$uQ*S?C!#?MYL!PitL?:i!/i@</9p
YtiT1$ i^@huWK*>&FX&<@69%@hKCyZE9+%BmtMkV@uEyechJRK#KRT/YRjQuIc5%I%MN5*GHAc*@#YdHT68PVl
<P?8q! BQd+jpk=$i?iyER?R:Fiy5>a!c@Wc!&q5$VFY8#Jbj!#y5Gw%GP&S!<jKC6M$T@b<G&iB8BCEELmy5\S
BY+hL@ >A?eT\a$uEcL1m>Lqd#kiJp/cSe<6^&/JWj9p6=6a<dl#V*%w5LuY+@ya*Kt>%N^H4Fp:tWXV8?1EPuG
:yqX@S 8KJQ=Jn*?L6pReT=:/9khFSp\Xj*+n/#ucAu#?*LSc>!1<AYnNj&H:CT%@TpT#L#\t6448YG1#1NKA&N
ZqY#=& $J1F4JXV*SLY<pyd@+mq?W4@5eXN>NYH:<\!XPMq#?9=ab#&NX:1\!8$jqF<&R#1ETmK%B9!Hbj%$n^9
HRkdZG BiaLeG?cT%$h<1J>PmhlASYXW&8Tyq4:1Xdu4H1F?hM6y#!i^$X*w@CEI1ilGd<Ny#@4AaD##S9lkd@T
VF/dPl 14^bny649ApyIpe\wtet=<QLFDiiQ@cH8@4<mGF=:ZT9=?w#:QW+ah&InEana<PmTAqq!NIbab/$i@H+
H=d4YC w>H<IZ\CEZVVLQN?kPN=!:LTL8n!<V+h!&<HjlbNX>*HX>u$VGpV6!>hmcHRCYekn@#kPM!TSQ9ak4@^
8?+Xt% Bti>#4*i5*KLC#h1%pqlW:PFQPy1lSMniP9*1S5J85=KVpH1IV8/!biE$N=MQDLhBpbRXiV%b@SDQP\d
#XFk9l ND:n?c@1bM6/\wW!9&w$i6Vl+F!!J$9e9Eu5dVnXkK4G@RBnthq:n=RHyTA$8aE:YDpLm/h8V/j!8\d@
Q&kPDl 5L#Ka&*l&DBNPJt6=ta4a*C/PlZB+FN$e1@W?HuX69Qi>SiZj@Tc?wqI%#?e@1&b<!#lZK^N5*8XcPF&
H#u@A4 /ee6Q^*eHK@H*1KAWAFZ$SP9J1Z*n:pWKS=QW4P<%^pewh#b5>q4:G>/FeMV>d=>JS@4>#p<FKRm^MaX
5?T*TS $9&5+GyCdkE&m/ZV=9p*!=k:QD>qS8ku%ITmue!P&K*VuL><4:hk*KCTJN6J8EaX1nlE\YjRTLNEVSX\
Fba*1Q l1iMFMHKc%!qP@aCQZ&/:QCiCG$mG8M8qy1w/:j=pVV?m%/1^^a4?eN#L*F!WM9dIj8!ViGlF5/<RYA%
=P/*NL CH@AX*jq5bT5%VeN@4<JF6AW:$IZ$$phA:P^mbbDu?/uK4^ub$1:imp<<A%CF5A*>LJPbdIn*%?Xm&mn
>l!m$6 4KVuwDN\XKNKM/?bP4CM@Vt*E8yc!8cX+!/l>?!q#N%:A>yq*:/ZGpPW4+kq\mw&#1\1Yh<^wN=Dpke\
?9ue98 m=Shc@qnc@tHFDDR^>&DRM5V<a@>J:ll@P^>tjmRP8j#wP#=1L>QW=#&H9Btj:i595+\cY#:DYWjtSRt
!Sw6G= #+M=\j*pibF:eEb:aacI!6+qYK!E=9mjJ:LiN%B>H!:L>#c#Xm9w?$FGSap=#cJqV1=dLD:ijXN8<IHJ
\\!STJ e@&R=jq%%bH#bQD>$J@tkdu1d=4bq&K%ckn?FDhjSX%!Fanj$J/bdMaG#$!N+<whVNepQ=8hL%SuwVt:
LNIbQ! JLMhFAj49%?cI@6Ltinb9L<$TEbDZpq&k+!LqmGhnw^MEVL*j*@MV=FQlMFQdj9J!NnIKCRjt#C<NilM
?@jRk+ qbcVT*Su9NeAbqybZ9eMNS<WJ^%j^@I!p&/+R&H:G#4Bk=LliWI=l4Z%6YM!Ce$1VyyGLm<GL<dFBXA>
jmVt*$ 8uR/REdY$Qp:?Gi%Tm/hq#$muh&S5nqVlV\=Vub6iihFA?ZpGiY\\k?i\tSluK&!aeq9bY?ne%WMbV?*
hKnGXY TddJNR^Ilu<K:FEc9D14T+hj!ip+mm4\4eV?YLZiX54kDu=SAJhRhmtqDW&pLFKaX1lCLQSM^1/>BX9b
+Z<8ak C+*A+quYcHI6m++MV#VP!ST/iaVHQ+:@Pk9D9\Iy5tJ5kmk4uP?@QclpGu+:MduPYLbwPIbRNJ\IPB+N
db9E^i TT/q^h9CyZ#6LN<iK4$BS!Zj9Sl8RW&P\!eulhJupEq@GG9HZ+q9J9AG99<8W5yK5Mc<BX!XMtlGM5T1
QIXq#4 lWJN8cX/t/V8qYeXue:iC4B<^WPjy!BLP?*DjQy#XQAuSMQy>Geb#cwGI=XE1ClN=$@l=Lp*\k69DLCP
>pcuj+ aFEtGyjd^^+tRXG%\c#nQD%u#XHJ5qF@wP?uqcNTEWZB^5QkuIDRY9SMZXR6V$w\p>N!y>LGW5GY<&bd
MT8iEZ 1?<B*Bu:b#W&!H^6nphkK\d6CZ/!eY/wFyT/VqQT+1iNyVEZM8Jd##blR4D4*5FQQ?!EKit#i/<MZmV*
LFW/%? ?@+MwdEee>T4B^uHTb@@WKnKcV<KiZ:^<Y5Pmt8\IbqaXXl?l1\KFnuSCD6/PA!GK=Gt?4H18%&S*%h:
c%XaDN R&Tt&jlmi4JkE>Yb19S?$*hHw\lcqj&tMDP$8qRTa#nTi8\:Eih8HGpbcP&Yqd1W=l\k!>1&EZcQ#D*T
/ndu<Y J<HCNJ<4P>LhjP=qth!4uCRaFpD6h&<PnDehY>w\<>cYh\yKpbGVSY6Rp%ym@@8LV\<9up9L69^?>QdX
6+CY?l e4RKGXq@#JNPmSQ=^5@#a<N#c:9i@1TZ5</#D^%?1+W#1>KIj\nV/#kJI!Pd\/hWpiHySm/Y%Q%C%euw
L<%?\A 6PeK+N5T#S$ceuZnhiY%d1X8=9hJ#bXc%?Y@9L@8QI5X&jVj%jSRAZiMN8nE9?Rj64KSQKaSW$5Sm!l*
LtF\e4 p&bc8!#/!uCd*MwG95Y4?PhtLmY/M$=wAIGl<ua46W@+N%#\+68/!Jt/<i1@ww=Qc>qZRMG<WVPQkp*!
%p8A9J \K5Im:8k+JC!ZQQlbI&b@#P>A:?d8jP5$cAa^eR9>61WN1S%?kJE@8c!/p1QC>EB<yESNyRE5u*&kL&&
&a<1\m *MZ<+h+:mbAT%jPZwX8kaNDEn$MHh>yE6@4aHn^*M9@C<B\/e8Dtjhjl/uyAu6=5w4d<J@k$Gn=6BH9$
%yYyBK ==n5DCNTQTkSi5L\LG?jT*q#ijhdR1dm=@P=njhbGwPtSDG*VMXQe#<+VBuj9<^586F$A<FieTp1aQL*
DIePnX ?MKD/Xt&un:ylj@H#mTV@$@**:p8b9jM*%KV/IDPlP!D?4*kWpujJ5wq/^jQKZkn!GtjM68TQ!J:!Y5T
lQQ6p+ >nL*FeP+/\8KLh@a\b>!>M<m91iJ8yl&%K1aXA4dWA6IkmX9Xh<YyGVBq4CjHD&yZ%uEulQNJ^P+h$NI
tnaR*i V:hMH<jyRq%#q\WC#:Yy9:WACHMKKFCZ8=mN9?1<8@#!pi^9Lp$G?ne/8XyWGRJ94*=l:+*@wEb^#dbE
N&:Q^h p9M6C*86kiD<ZE#m*PY:D6QG6&>>dQ5J9TFDGqAni#jplu<4yZ%Cyw#u6wDbluM<C@@hY^S^L^/HCd/%
/4k^i# aiQ<FiNyIHJH>St4\4Pdj#%1I1JL&11w&a#9Tau@TDmBCtneLdC+#N:WTZLMk#knHdMTeX4!b>wy1Ze?
p/YK<M T#%QF6!*FH%VN9+5QYTyZTSlR!4T%PmJkW=&>BPL:?\LZ^cc:48P=9<DRdZime!M+6!b!\LTdpS8mYSZ
$?S1!# %>F9=RmA+DL%*NG5/IYPH9Nq*qllmpy=6pFVWcetTbM?DkPV%Qcd8+@=@iRNd=X!bD6>9c9/LN&Ie/HD
@Dm&TJ 6wZFS>VFdIL?nWp>A@&LwTiqNNij@QS<ciWk%4a6aHi4+t=yZ+mq#*#m#i<%a:LaY49iW@bW<>MZn#Qt
#h8/h= N:DyAX*dl1GHEXZwi*Sqa9X&&Z$@a^8#c?PYbtPdmS6\Q$=LZ/@qDHtacNB>6\wNE6aLP/jVhe*94/N@
^u#@=n 1>TPnH>pi&LAVBW9%Z^c&9tpj>I=Kj?qbB#chN:T@Q9*plW9Wth%h*Aj^h/SXG?$%S:&:l>AS<N1*@FG
8@5SS& j!BB&&^IXe1l>R*yNZ<wX/BZ=$m?+t=Q&&J!+*#TbD^9\tGm?Ayt?B<El98Y%&cNBt+/#!c@/?Y\K*el
!4meY\ RZDmDwV?%tZVBGDDdV64?ScqaLpL//$16ITh>Hc9u\Nd?i^t<:mF>D#KW<j46PHR<h@6yCmyc*=A<pFe
SN@&Q> GGq&W@MJEhJN1qS>@p8NMqhY!%$5TjHt%k/#>&nQcbl+WhB*eEJW@5\t@W9dcVnjQ99jnZ1JXnhIIA4P
%k\pQa 5p>=NmQnPG8beQQ?Sn:Jy+hPw=d\@l<p6X45hhmZIm4w*dqYGwK1QE:P1^ew#4qE9Bhjy4>+ITp%u:/G
-AKCun 0006b0763c4001202b4 Page 417 of binaries2.zip
KWh:c$ n86de8#yGVYcWdm@=@%Qy^5?p<$D%hX5L:*&uj>@uw+BD/d#\&4*nCVpZ1/!jH+qTyiT\q8TkJpkpS!R
bBWHpm RJ@GN56$li=e+C!M4E4T6I#5HESB#@8B*mW&RM:B\e@8ld4/jjXHu$Lp$%#H<$Jli<!MbH&Gb=J#G6Dm
HENp$w SkK\$QJ8T*@!Pe*G/QNjBk=a1/ARnL/QHQ8j/\*iKwN?Lm/1?8m^BBlA\F\pld=AD/N+NKBB8H@H^ABm
X6KS+^ K+l<AjIe8/1JJb=e:AHb6h*mmlhYLD@ejhHh?4@lG$:BEP:?=CtC?5e>n^6^Wq^FeTDL:>?=1yFc<WLq
p:AdBq >C$4SYhq8BKBQ6mKR$1GF%V?W458YE*LMHpb@&L9TiE<nh&dI!8twdi4m\ya95X*Qle?V*Hm^l>5H#@<
dwMmZ9 tlRPjZCmPaRZ#DuW@Qq?<ud*1/t6DiB>CMhW!Zq^>EKbLBF=RY$%+pHWZM5hlGG&qKWm\9Hu4%b!WMq<
B>QIK9 J1QFld^?PT8!6F4iwS+ZGme>^dZ/9F<tS1lA**>6!XVj@uA=6KL$=FD/H56kF8FV91IXQD=V?j:51u?a
?mNXph EMjL>YpLi:<nn%PEnIJ8pZBLqEc9SCcbkD*mVPk&dBk^$ARXCdnkRH=6kXVkCcFBBq8a\>A+\wWPquAB
>P$FE! IpD^lQWe#qyXC<>ZmL9XCa<wBkhZW#G/H<Si\XTENe@ANGK9N6M6FCu$4+D/WSJ@Mn9a$\ZByleb%Hdn
qkX:+? QW?iL4eb<11aFL>>tBJahiPXR6#MHhQ%Jdy4tuqT15l159mqd$tMEXLN%XmFl*hC%D/QlSK%#aST9mZn
XDRHk^ tYIu<F4$^Cdhp%NM^^+\C&CAlXGXH/*d$Fu<DE6B4A@@Hn+M?FwnhHkleYE?K/*GHuZD$%KTqnupmyLX
y%^%hM lNqDGb=Z<!BEAG*w$\cI95@Bbiw=*n\CV?b/d94jG5m#^H/H>l<=pqbLCkJj9\%q1p>TNW%tu41eE&yp
8:p^qQ lbcmp8@X<PbCq@laZ:KN/LTiAhnhM8+!iAn@k*BQ+AQV/I@LEL&G8&4Tm@eVkRSi*lj$*%Zi@F=&Cm:1
El&wK\ pHF:%NLqJCi$8PMkKVqCF=MX+1Zh*!CTFEmZ*tGbD68*E1q\YdEV*LpBT4Tdyayl19QcT%w66e*l9C:H
#YAh!B WDH*lI1l9n1qYFhWa9iZiIbTSQc/:Tj6kj#c\kN9CwcAJPAaKyH??hw9@R?R4iMi4<hMhj4<Pe1%ATjX
j=qyuN /LFFpJAHcBI>A+edK\YJw!jk*pV>:VLEu1u!dMCJNQw<S@p<ACiKupQB9eHK@cjHuYm5JRwA\:=/:^#/
LS@mk8 AkQTD/=+yF$aDH\m!H>#84:@e?%=YZ@YjX%^TDd#A@HcN*tt1y#tR%\=q<?QZRLQd>qeE$=/yFHHQjb&
4:/+PB c?JL$\cm/:yTL!%*cIKSDRMMaR=@Bnb\S9kbMTp@IldyFI%&9nE8Y$uhEVXw%>49YCd#wwyhP?F>1ZeH
hiDHl@ VE5*bK==$dAVZ4kIRiEIkJLMGbmcu:lQF96b+yCbAlI6@KYR%86uc99IP=>pMenu^Z/?/N$=MZPdqpc&
iNi8C@ mawJ9!QcaVLWbbX5lhR:1qK9@F6Z18=!C=eZVEZw\8mNt>XbLckj*Z4FV@>c=t4t+?1&Lw:Nw6^#>m6/
#Da+P& +dn4hhWi4i#9bLVq+iwjXL>j8!6$$c$NdAqX=IC%R=YlYK\wilLqa*tkFBwI/JNPmmwFh^MADATQR^6#
5Z46uc uYIPQc@nmiMA%4GTWR%WMBY1^pq+Vu+*j1NG:QP*P/a$a^QWchm#lilZ6bhXTwTElkeRK$W!m!>j#lNm
^kLJ$L !%p8a6KF+^IbQ\?>SAtpLybKbY=!Z#5$*y!k^P^H!TV+1G$n6F6*S=P#NIE6I4JY>jy?Fkk<>Im<5eL+
8=YI#I YpSdA<9\jtqJT5tDNQ+Tp@!%QMu^M8?c*&>n*^1<H1j:iFYL<uI=+i:%Z%Na46PRuk:W<MeDCKuwYyL@
Xhj!bb FAw5bkjwF%BR9YeIE84@mYt<+=65FZ8bZ&+@>MuDnSDRN$Wu/ha%&B#FKj?H8!tC6G8QmVG1IM%&K^S8
$L964< D+kluLHRnKyR=S1wdu?ETL1JKK#uQtiVVXawG&lq$9hqWY$hPFw\:C1W!9uwML8yK@&ta/pl5u=Py*H4
ni<!y= $K/X!y@u=8QTe8/I##H=a$tJn%&bX$P9E6IHd=P@Xb^#qC@8w^N@!<i?R*%*>/\HGF+NBulk?ciu::B:
=\R=6k D=EbHn!&BPl8!F$?NDJHuMi^KVD9AIauR+XNWjc?5:8=dk#Q<9kuH/Qku^F\4\Zq/%lAuCiLKAcFd^*A
Ec8#+6 #wDPK:?@+K>YEH$!ENjNmnbMBqGP1*FTT?d91V4QBFkaG&L9b>SdDAe*WAu\1*eL*Pna66YPVm?qaX&d
w^ky$+ pNKnLD/5j9:?@hi9J>%Q?:yK?A/mKN#5dkVbbn1VL=I#@?Y8<M^uRN&LA*@<kD+@I:V?+HZKp&i?!&5^
<ZG@Qe F4X<^wSJH=IqV@@VuD^n^>^B*l5m5mhGtbX/YIFM8mFD:!9$AMk?R\CPPV%K\SQa6Vkp\wP$6tAIFnPL
D^y%Id *ATD4!qBt&CkW/ARl%+FRVR*Y/&Ge/q:cD\B%=9NiP98uXDetHehKtVaIVB\*C9NR?GL%*&c1PE9u/<j
:y8YCe :n+4$djX^&ndmiFMjuQWT1nEt8yA:d4wqwI=L5q<W:/:iD?#dY9*Bchi4>&B+enLpZXF<a$8lnhqu@4P
<=#iT/ imXZlC^uNV>@IdNJw1PWmq9>BIkj?%>WBX%DD%Z\1BMCYdFaN@S?1HJL\DEi9jwc9jL/FEkHcqGE<#:p
<<=?EH qW?b:cMY4j1JIn<5\8cm?1kZhDb9Ic8jE5TditT+@4^4L:8:Z%h<^R*168@$!?Ztw=b*LmZ9E\9/d:+\
&h\<5Y iwG6QJ<?DVVLNBc&Fyn?b1hj\dEKQ=TiuQN!GuLdY=S/$p\\E*59X&#Vq#knWVHbt4:^c4yuDZKkCMbn
uaiYB! /kQn$*F:iAlA%9kH$c:kT9#<#lklja!cea^J+$8/#89NenS#M$#1kXY?ZPGVmZYy?>J5!?Rll*bk9>8c
Ci:$Ae NjC^<4hb<?mAD&?9*@c$+=m=twQ!RE1Ny&V*TZ6+:kd#\^VJlu66iVBF^h?lc*+6*hu!iE8hdSt!^9H^
5Eubn4 \PNk!kdIHI4w$wc+mK+midL+QT9BW54mY^GC^i?YDueZl#$5pa&PuZYFWXuyM6ap$$QkJDIG8hpue>Kj
KbGY?8 lNT/w*>?aPBZY!J5bFRqlw9Gu<RW4lRZ/D8>$4%&h>eqM+Zq>5yHIQ1ZLq$8dQ=<YdW6?DQ&RPqE@9n+
1%n#GH FM<VuI#9C</:MJ@uRKLk$tBqNTC>5YKTGAiWS+cXi@lRC<l?iKp@IKBMu9!#P>MDnXVdwc?lD%Ja?!lm
hWTm=u iKl*D%6MP^YYQ>815HLmQcwy9PPBI4N=ljib&:5XE8DXN!kj644hiai&>$Rl:?^/mF*!q*5d\H4&P>EE
T^^Gw: S^*w+Ghj$#?6it$*XRJLH<thyAMjkemRXQ#Y\XA6Rll$RYG\9R^WN!JeN#^Q49+R8Me%>a\YEmYhLNJ\
C:a>1c Xn>A1M*aLy#JKPE6XLJ>QVypJ9lyI8Qepp:/!eJwp%?tFWy!jHi6aRbj=jN%m1F9SBi#&*8tK%c$AMh#
@%$Faj 1S>$1H+EEuc/w%VqZk&=WR<Dl&mn>QettFbqjL+8/$N:dt1j**WhnWm:t/A#9885/y%=QA4hL1DqPKY>
@+SiCZ Y5?l!IQ4V1?$kNWdTW>Hl?C1MbiH*tiYluDCmjKu$%S+DA!a9\LhQ1lLCc&a*Tk!EADn5@buqwSiG:=Y
n\cpD= V8t!VYX!=a6yFM%K5uF+^A%dR>@%XtV\tMb18P8jwtaLDLIk^+HmQqMa!c!t&?@!a$:XeBmCcctKhMa1
^XVe6m YFy=u?MYI#BA&CTV&>EHIF!kJ&KXt5uk4n9*^wecJ5X<=?S<N!==#Qn=Q/nK=XAyj*BNnb8I$+qTQPd^
S<ZTRM 4tmj1cEmHtVwQ+u@^G:RNeth\Z$^1*A*+*y@6L::5Q?*l\ImmmFTt=8LbB@yD11qyeqnA/>VJ+mL=1A8
5kSleZ 8I>l&<t#ELnCk4IchkiD4Ed^?DaFicMHWQAEjhCNuH%1FIFJXQ?mDXyAkLyiGAN6S\?SeBAKCRia95Dl
!&YL9$ LpT\EXl=Bkd49?k85ah6CYWkRJR=9=8l^!^+<eMRARCSkiDbI\Vl$V%\iJ!?FSFCuM/i*uj+uK%dj!*p
PtCIIC /4MeHyu*!\X=9q<94M*wWRh1Q>p<4G!!Gc@JSFPKZyS#/<ja<lPjl*TIHjunGVc!K+4upPS5^bwiEc=B
*5wQQ% K@8*BAdSmDcZ*dB\TjqaXDLW=Z8J4:QaF#N8mqYS@lyPuDKHZ1w55cJj\uYKui\Bd>*9&nBV>dQ&%p#a
h^nb+u hwAJ4^T@4TE!GZ<n!11jScAmcQ##nTQ=?Mknu*tKmI5+lX<SYte/&tQb>4IeKSXMd/GZj!I+JwDMnkPc
ZqjQQ= F=k<t/9Y:&?@T@><CBYbKMB>1?9FTy@tTNpLN$S@jHublZm!?/iJu@k8%P*j9tGTRD4mQEBbATj#/H=N
:J@FbW iJR?mDEHjkEyB^&!D1M1WKiY!5TAM>1A$$A5+A<ZAyN/l\C!$FKjYDy#AwC=KTbAKBVuWdP@hGmm$R5?
j!8QmX 4l%/!<ykD<9tHSC@cbFYe>+D4j=TR/Nb&?\jNVXQ4=nM^@a:Nn8W:\lq/n8tT$WPKj?8XW&a$du4y4<t
uHTy$u ZZV%$%&?%*h8nH/Euec^y*Q:=yu9%k519F8Q!I*mKb@q9e4q@N:Cjb=P:JbS?p$1qdEyAAnX*#qbC/=u
/iIe%5 Fy5T#RZqMh%wwV=X^K?>Zn^=bMq!HF#hZXj*>:H%>Ypcnk5h*XehuQ:QCNawp#eS9IHWpkb#Z&11k:R>
Et&L&M clN4G%W:/RcuuejLkK\4qL=Xyd$B48FMl4=TX^iEl$JPe$WyIm5Iditjuwk5whc8:YQR&&:aVSR<e4Va
?ThH*W C5+DWTK&9mcC%ZKWKRkA5FaKJDT=EYHYW!w65YE@MXBNPEIVh=A5tMpe#>6mK1M+^5N\5&u^^@hHWhpC
q@MY\N ?<F>5484a%#4!yD?wZaMpi>=>kQ1m/bAEL>lXG:AMk&8nNiN%W=\\i:Bej/e!R8Jqiy*Iw$ya+pYGSF1
JM$<EL q+WJW#<1CBl8?JuYAT5Y++DMB=M1lS$HbDcEB\wNppbQ\?GCm@AV!B:$d/kdI^R&+hj$M!4&$CG\yZG8
5Mb6W6 jwSFmeHli%jlXeqH1\TLPMtyAI&ntd!QY4cyA:hAjBGQ?BGn+>pQ?t=pPFYG^N>QJt#q1CTla4Mi?4a&
M$G&dZ hkjLaN69Ej#b//i1LE<nt*+d=Sp<@%Q5$tlibFlK>FmAEjPCAQRSC9RAApwJPB5=QcMJPMIl5^Gkn\GH
Z@:j5E LqkAEQSdj@eAl1A^BJD&<uZ!=tK:T4+eA1ISbT?%*tqdjMRG%59u6!JW?#4/!$Vti/Wa*tb%!%QGBF%a
NG%Ej8 TX%ITyXiNGbwJ<EXpnwFty8P4u?FJaPQt1R&mbQLMnX*!Nl!R!tV91%hSLI/>cS?i!d/<N98e/9VnJe$
qt?%M8 9p\^mN<B^#jSS^CRLkCmJ@bDLwmy\H^I!EA@WSkM#at@aFMKcpB9tKM*A4Hq/JE>upuAX^XIADC#?n5@
H*@w=K Kca&i>/NCiekB/JMkAL=l5T1^@YJ6=c4+qNJcdm<<La9W$@Dk^qmDJ<i/m?S!V>8KQMD\pj5^Vmml^Dh
Q@ubyG wV&*GSppZl%hctWRY9aq:!>nmAQB6=Q8L>?VEmqCnZ%%l<GX6cQaRA$?J=nNp@Y5=@KcSFKw6jIB$$8H
k\?Z8u V:H4>ZD*WQAZT+kPhpWeYR1y+eA<Rt>Tw?eL$aT>C$mh8L6E#li#X=45>!BZtS?4<8wyiV/I6JCce+lc
c\M@>R P8D1e6kH4w!:K6/+=MS%@bNCyiMLt@V?5ll66tQl9ybdZtRq4Km5A$1*!:5b:MFqb\8Nj?CdZ^MMqkD<
-Ak1IV 000a11423f0001202b4 Page 418 of binaries2.zip
NQ$4Vc +pG:QiX41nYXH?C<klQm=&!H\<J!+d/mHJ?X65uZya?hG$$iJaB%YdiPG:Pc*<SyQCDi^@yEWKjX@THc
5q#k\Y cqHA6!GG9Sm@\:qt8yaMyi/<+!TJhXPY=>V$lQjt<:!Qy8b>a6J:%&&86?q@bI%K%uHIZaX@5MBh!Y*/
i@^j@4 14@+<@tj%eS&y<VS/B=4KmaA*$ykcm+qVwN%LWu!9$K6H+M:\KFuPPAnTpHb/CqNDFGj6G>J^Y<m>B>*
/d*Bnb e/kGI9ARA4DL&l@tQalTEJp:6yG\1qD6taZ!y5HNqJXZ@W>@D\:TPVV>*Rm#Rl#t*^tLM/kZ8aGm@9n<
\L5P1t !VJnR1dQnMiNt/WqHYTP%k=*q$JV8NLj4$DLyeS/D>:/tHX@eXH1HW4:!u*>IebJ&Dc@@?16jBHN%RhM
e9^^pi DY=<!#MG??$<\A@kX<k&pNY6?j5=MBi%lV%tCyZD:4Z/uhj4QN#=jH+85!PLJ4Qhqmb8*hRLij61j?&B
Qn#kJ% #eaG$pB@DK5^j/YSp8pYeuPmhl###hWn%FjPdhn%Ld*L:A&iZwQK/#Y5:#Jun=p9lh:iwN@N8cJ@whDa
V+t1Ga *MKlhj8yJLFw=@wd44jQ+wnjT+wmaHNC1!*kGmLa!XJ=K?CIH9p6XHp!+NkA9XkI@&d%k?AS&e*ERZ9^
kV8uc@ G^maSe=Xw*hN5Tj*Vk?w$c8V@+VW^i/lMeLd5HEkG%>\a=Hw!u?LA4WHJ51jadbeTq#nVceuY5Li!qR>
#tnQ&& MJeYWMpK*h1/Xt%^i?=1Yl\:l>:nh6M>E&Di?64WD*^y^+AR<>+SPnMM6*A#Y5dm%C>6kPu+BP6uiZjw
bIIJ6Y iHGXXRwP:ddYmGuBle@:GMttt@6!+ZXXhK^mQuHuQ#q$H\AKkR%XXl1&e%&hl+Q65MI11F=G+E*yG+b8
M<9JNH =P1E:5Hq/dKD4AAR$8uGuMI1tS8CITqVAba?e@?b<*SwqVG$#@#^X1#@mmZMHm^^Wh&>1cwJP\jKCQ4K
q>%+P^ +ndhb!GT=JI#ZK/?c:JmX:@mqTn^+@*=\u^9T%bTVSb#bymqdy*DuQ%=mYtL!FThQ<KQ>QqFap+!5$Ze
#I$?a9 KJbnFWh$h+/%KIT!VT=69!kwH9=JW*5=TP^By\HQ+A>kcBA#?@Sc1\9wIK@ySZdNYVp@lGLHpp!KwT6k
$aXlpd =Hml9Vu9:9nT#duA!\#:!i5^%uP49yC=Vh/BP<tN&a\VwcZVG1XktmVi%EDVuPGSY9QmCE8X$>@ck%4m
QQj@/T +>ud%V&Kw=HFuJh8eNCj5/CeG#HAKEKCtH^/#pAI9wZhAPB/$JB$wuL</TEPYTWPe8jIB+B:\S=NcPBe
KLq8P8 %ytM*jPlBWhq*AH@wbetAZA>%RRSc*=QJty=1cQ9N*uBQ!VWJ^cK8!Vw6\=C4lldG*By\+VK^Zw&RyZF
4kMJu? ^TW!W:4Dhi=%Q<+VQdD+WK%FERJ/ZBMi*tjGtK@QZZES!N+HXAmNQpVP\hG#HHALRmD69&SEa95H?n^a
je5VTl cKn^J6Ack*TnYeQnc!KhaKjAicd:5Fuy9KKSaMj#4$btNF=SF&yF=XH*j=YHNbCZ9>*!HKk91lh?ZF%$
9mW@b* Y+XY8nwyS/S@$#e4cc4SctGPmt\#1jTJ46lE5TajRjVc<qbN%<En1h>Zi&Xq&adQ8i1qD4>eiXqDD>Di
t+l5DT u8@nDM659X@?9uXd^yQaRiRm\LLRYCLatkieG\4YCFZPDeC9u8I<@4HwBi\Ilm&?TS*hC*BS<lR>PJtN
>DF%bL V5NRX*TXXQVnhaQXP5I&d:mL<Em4T4ecq<C+w>5<6y/GhNlpty9j+nDa8Rn+dm+DBh%Bp6t@Z@$##CVS
Tw9lcm *8YHiJAdwByWiSVp+96?&jEY^P8DC:N/HR!H$e#t<jyh@@Ri4?WWS\E6Yl?iB??F+IHV!M:c/atR+d*J
$\!Knl <qQhdBe=nityP/==b*8jR>Q14+^Q5=lWqCGibHy*?YWti4B=&:M#9^p=nw88H1VN4!Y5YYA9Z&F+4++J
wTyRSI aYZ^uHDjBS:A?6a\^L^AQBdhC<AjNWFLqELAWGlSW?AkF8iP^Vqmn/YI5E%klZ=>lh/bMEb>RF%BMjuY
ck+ANA N9JHiQDVd=<Wh<GJcq9K/I6\\%5ajI6nb&hkP9K1:F?GkTD!yiJ=>$DnS=F!S&*64Di6dM+mT&>&imI&
m$+8$Z TudGL/cAwy\uTwET&G%bbDIVKhMjC/GZFJFD?en9pMt>$RYkp9L5cBpt41WWQIw>$5dm!4GdHQAcjYTS
<AJeWT JTSWHP/RA<=aPLt\PlpZkw*yy*9AG\HpFqE=L8B$H*9<J\DHn?/H\\5^eJQtCtL4V4AN>R1=F=tyq=pC
c=6tDE tG1LqM*#*Z>5jG<5<4Gm!Qtm=cL#TMVE>*Lh?Y1Fy8NY8t:6wmFP:*jEqWyFuw#9#?L#^?!MiL5E@t4#
yT4p?= ut\<IG8BXRB/YNX<K<KBL?Caa$\IdWD9ZMEiZ5HmtLGpDRKWJRB9eZ4tH$BI^^JdL<1S<iekDPl\y8I/
1mNHcu \TGi1hbR^P1HV!4n1jduK@I&mC<&%ch#R*%@M9NiP@mHT4c<Rn<?/ZF<l$cH^kZBlGw*\CHh6@c6JL$P
8Sdw6A :y+uB?htpQ6?9+89Bdm/:?c:<&W>=GXHq^lIe*:CJFSD?I&>dXI<dVttF^R>/EAw5T8\a/e#FHwJlP\G
?Z#:5J pF>dqLH@Q8\ZS@G<P#*:hHy1S+ABjWwZSZT6!69</?>yNPlXZ8/d1\c1*m^kw#=RNEkjj1YaAwbMyF6R
k<T**u M5/+9QLhed@&6WWK%my:8m1Cd/ty=L*8G>#$SVh+WNu@!h=GVqGc@LpD!QZMc5QyK^y!MXy6C*#R>:Rp
^5WE<p dd?PnLC+!u>pw/<E#XPCRWn#+?a*ke@ni&e^YG@$PSm!nq*BIX5lmtACIhkPi$CB*eqHXqklmH%Adcln
N>d?V8 1#!R@%K/SSZLW6\?Lhqwl:?/a8MtL/TeHMQ1QAkW9w:P9yWq8Qcad!G?P8&\Y>N?MTWyFe4/@X:*YGAL
nJYSQ! jV/hSG5NImMG+1L>*dGmQ$9\c$%mV<LGPG%9e>>I:DPPCc5R:>pbFuHDQ1:1!5mKB4jMuTBkT&j^\6hX
@eKp8S /cC?19$V/H1q=c@1Nnt?u:?#^dM#ip+6tWC>$#qh85X%>Aq?IK8LJ*KX:!FGwe*lT1@/86Pw4:cpJ^4c
!d>A@N bd?a>Qlb9y4EEt&w:KS+@$DB<iej$Kceh:9%4PG%DTC55@ViwukC?G:F*XLN:T&kNtQnc@KTN:IR4A#F
nEIS*E :5:m<cXEtL$+QB5P4/qA>8RnQ\IwkPmBpCK4H^K6wdiq:YKew<BBMlDkIYE5!I=*+6Q5J>WVp:Z^piW@
t$/@En @S*:$1<:<dI4e:e1iA^:dXJi5@:8Eq1C&:%eeWGibK4&&me4i+e11a&K5MRMmD?I8/L1>%ThkSPchiBS
ln=11y B^5jniVPat=9G1Naii6L%9m:jFu&J*Q+dn*Q9N@G6^%%cEcBRQc/4?Vkl*1%y&NF^G8ZJZp+Qq!hVIPk
5c*$+L 9G^:NwEi^BRG:p$Ej?SS^kd@AJ&e8RB1NMWWw\AP/DiQ8%/p?NN&qlBRay+m>#^kX!!5ME4X:/Cp%F:4
M9la?p la>?uFwn&4$IRdj#I+kB%F>T$8a$+1#=A!iE%A%6yId*bEuIRa/A9+=#RFtPyqIkF@aWAcw%S\=WIIj=
WGBl=! pa$kut%wCJAD&TCE#RK%$?Kp81?lSTp%AEiN^kTm>/K^l$daHRB@LudS*#1JZl4FAjyE@RQEKWThb=p@
D<dkH6 amlAIdi<KP8P?D9=/W8P%9PI?8kBGZ5ItFaYkqqMuK68KXp&#@YynLMW/^H=&e*$ZLdknTcXiFH+A!8&
1uduSi Q$W\nY*#e<@nJGEF<+*/dYGkktnM+W6T5mZk^A$>c\#ZJIRcEAl@aBBEQX#CWltKi*B<>h#1DBLdKkea
AFLG8J nRj8>ije9&J#9?45N%8AG+LT$bnQKQcwZi6Ntwwd9!SbXFC^dX#TqYZQADqp8@ER$$?dKB?J%9wt5#PW
1ZWQ<$ e<lKA4YyJ&e9kVmiCqu>:pX#&86/\iLAchqdVD*@VbGG5A8G#AE#=YeRPAIDH&pKqWb&e5AhY<Bhi!BY
dF9>K% wuLiSjuCJkA/A>1w/=eeblW+IKWNNPcE9k?PYwh*@YaeCp?4VMa1+lTd6diXLP/u&/9>TdC>=\9#p>uE
eBwipw EZ@8&<*j5bGT55*c+ek*9LXwi#byhRRdulam=yH!=VF=\Gp!Fm8EZ6bHjwCD&MHki>Dkn%m<Fb4+EKkB
!8d@BT 5Dm8l^>ij8cZuSJC%EReeP>Dlk<wl\?l%yMZFink\F\iTjPlZPyE1<XdRkt6=9!*Y$M@/=:=*%d>Fd^/
K#p:hb j^=5>Hp&$TlD#9d!bj1+u<uqAaK\K$uVQEa#NkdD\D:eF>k&NPQ@uG?c=N1ddlj!iQmi\pbQame%1$%n
1RA@bM d+IVw9<IWhF>Qi@MQF9&@mBh5b\9<hkMQ84\/8nEq$%/LqYal&Xi8yFneTNYa1>qn*p4Y1<n!jp%4/##
6XHJ\= %89AZ>pHE/a?++ZI8HRmHQn4%C1@q@&BA*:WJul/9=jL&Kd^$<*XGiY8kS+KcNb9&I?KM5ZV6pCkY8ei
$lTmnH XJ8Y+&*N*W#G9dCTn/dVF+AD$RFthc^%YIe>q&5KeY5KX5L8AeneWCXpKB:Rk\bXwJe=SwH*RB^8eqZy
&K^HpG E=Ay:p^bdu5$QqJhK\jwiTjYVWVe#yPy&FDJi1nQ:/Kp*ehAdG!F&aRaBRuYnwwMhPHq%c!91eluV*^L
IL4b$n !#SnlRtE%CLlP^eF5&J^<#6Hhwj>d&i5VL@M8+#lS!HQundPZAe/181BGA@yHPZQy&h?y*m9W>\Ti9Zq
KM!>da Q=tD\%Q>+dKYGMIiRQRuiwL@iIB?IJBbCBAjm1eHGl1B^kGkEA:+F9c$ApRMQwa*M%*aZn^EX8TRTG#@
>&J6dS I*4:F9d\P*dQAhuWC41:S=K>8SQk6@KXnK&D5:!Am@\eeCMS@KIFE1AJ>%%RGn<>u+PGF1MH4NDdKAIK
Wn=RBK 5AF/aETk8:>aq@Nc^iAbm\98>p6NApd^l9?V/GTmS$y4MA@HD$nd5XC5>qBi%&9B:il/jt?W^jTQZyPG
LbVHA8 FP+T6b>HMjJ!^6NA?4it9#IKSAjAHyl&u\ht8HjV@TJk9:MX?=:N!*L8y9%^<%L:^n+u6bnTEmRVNb/E
NXLwyj TVQ*Y6Z!Ktk\CF6mRZY66I6Y6lNDYk+uBwDZ^MteLE\Nadh=:6:$L%mw1%NYmMJCSIP>$6&DM:k96KZ8
EJjFjY mlmHSuYhyBcN5iGZTWpqN/w>ckVh/eZ?QCIZd8E*6^S/B*\ZwYwVJn:=&#+uYX<HIH196YbH$=t5mT%<
8ei#4A mtQ#RKBk5>9%$!kP?N::H#@>h&45y:8pVhkSN%MS=jM$=TLdcT?\aT?5i/e$VE%cCRYVj?tFMqAk>pZW
8<E+Mp tDntRIIa165WtIk>PQ/*=j@RCqLa$!SYE@ZZ9A>TB?CqIbl^cm!k^tyQ5*a8H14p14bNZp*y?cyj5K9>
#*QnMF t*%K<BT?1=n5QVIKLkI?q@?B6J9wM\YEkMD6cpAAEabhSTBu9NF#HQBpDKqaJ/X\/>A#8A$aIwaFqmE8
QhSI$B K>&\KTEMGFKK^ICXE\MPyNHhKQmDBiXjAeed/L%$AnAJ%Nm6Ny$:ckm6!c+N#GKy\?LVu>?+qRFpp+8W
*wl5&= h5RJMt#H%hij\#liZP:dKWc?EHk<d?#w8LuGH#M?A%\Ae?@EL9b!Rpy^6hDn9<&F:c!:aiVT&j9lTBG#
S:qZ4/ L5Z5q<d^54$iKa9mtW*R<ZTkFXk+^RM6?4Ae<B6L<HXwTGeL?K=TeBF&n\P=5cC$GZAT6\FkAK&\ALEb
%pqw4h MJFn!q+Pl:wIm5hXPHNquK+HNQ+JY6j6%t&Duh<?hpFQ+5JQ#DekeCmAY9NGL&H?RXueA/RpDp1BRZSc
wSSlnj EW&6@5S8J9V*bCLeL^ReRIT<>1lL+NptBDtkD<X6bMAt4aLTIE1\eyN!^AKa5>q1HLdR9$W15/Y^t\Ae
-AFCNE 0004bb8e48a001202b4 Page 419 of binaries2.zip
eiqHFu Aqd&\&=F\Z5JRS#wtWK+e\++EFb^B5Q/6<D#K5:@Q1e>l4tTe$I$?Gn8#e>>?#P8BtmWVVkBXmeWthNd
KW!&LZ t>?F&B4V:keP9X85\t+t*@D1hw@>*DmID^L8ZiRI4IKe6TyH4Vq<hw9h/np65V@%j&%\T$ia=hTlh!Ya
>R&MCB +#QnpecLLj<Th?9LTLG>d+b?8LM=&bI9H1cSu%Gybu>tEDLQR@iPp!\cLh=S@CBZ@ARMH+TM+B5Jb!=B
i?y=4M &<T+BXHH#wNFnh65mh<tWpJbDlGTe!Ee@PW8i*m?a4^C1/!Im*NI^5d$%i5!9E^<*5BDc8#H6qA+5IT>
\EMRGZ hmmNh\#Ae=*?V$/^&AN=a1k^ISl^AS9HCH&#I4VB=m<5\YSN\iZaNXqpBwLHHly/D9C+KaY\NwY&dkEF
jXV9%W HHZLS/Wb8Qd>StAR4ZaDhPWw!?KVYdWJR$NFmYk:y8kc99\lJyRq!*knHd4y<M*T!VT:TZqcX#/6^tDt
HY?mSa GXD@Y5D55mDQ*4V4>M9BZVEcu\y16!6GQ8e#q+dL=\>ZZ<SMVG8h1P:<El6NN?#L++ieIT:$Ai5<A+PK
5Chc@t $TKV1nJ9H#?PHB4kyycd@J&G:DHB^q@iPkEl1eW=6S^@m?&L!%GH45FB+t+uhqaVE+XJ4B#u?W&?=#e%
Mw#LB\ Eku1NdbL:*q&ZS<w/6\RNIVSBuP+8m4ZkL@%*&SeThE<?KLy\MqlLB4&M6qZciE#XkVmbLYD1C8CXh@N
GY1R4N 5=a9cX*D84ai5bKK?BGSj%JKXLdA:tKRyVuKe/eZ+wPFhZAW<V$kD?STNFHZWdpVk#S\%tMSHnaR%B6t
nHWQ4L S?hI!<lY^M=FC*\HBTm8YkX5WQ&A<KP:%%Zt+It=B4?LX:cJjbpmKtt>8Fjn/yBanLL5&1T?NdX9qIqu
5VWi=M DZAC:@<T5WmR/J@ThD:ilX^<6qwp8mHZaXXuLuGVjW*!<#WPFSNtEX<<yHSpMX^9bjqu&t<9*W?de1Sl
i:c+VN m$@jh9ZaRdt9@&\!&++#^h984mEZ>@\?%9%PP>q>FVFcqDEZew!M&i#bbQNWSlE4Ll+ceX^wu:$IPF:/
DR!++q C#A#<L@ImA:RmnEKnMpIDQ1XtbHyHJ5b+=@yEQDj:/VFbGTpF$dHSGeWSkit?<hpp6=Q<:j*>@9paB>w
?MCP>E =^<XXbTSpbpS</twPQNVSqFGWXFtSuF^SqH^#^LTTA$qGSq>^eW>9#I?>^RZ>=XqblaZN#a&FGiY$GeY
1@4ZM= q#SpqQ:/XX^Tp9H+$J/jS\BjF+uT6u@Y&#Aj/aTMui@uTulVciVE?ZuXQ1>p>KPbKe/MdT1%$61wQedJ
cIyK*6 Y1uwuthZTjG*p6nwy&e$m&RuBSV$+q1#HJdJ&I1WMpNZlk#F4RKCNHNywVBZD$8lRGbh8i/ZEih!iwt/
upTetT B6C%jp=>d%?>1C5hpl=SYViY!WJ1EB@%DY!?Qum>\9Mm>j!14bGntb=lp6KHw^W!Fw4p^ytCZV<umGEn
dY$#q+ G/JAj9lLn&T1Zam84b^h&pD!jYBACHQ6!eyG%GBtte>cF\@/ujn*>VBK+EYJ=wjZS$Ic!1>%Vl!iaAZ#
\$An^F Sju6B#>iy%^@1MW/9L@^1mpe*?XY:e<<@#D<4wqE6d6%S>\K@iml>HWlWMC4$u^B*6chA51%/#!B#>S<
:e$kQp jL@qDLXqnp=^+/q@6iB<c?:Z=Yl+%HHyh>\B!QKA6??nXKajyVkhnBitqIVie8wFt%yNcWWuJh^%hu/i
#!lM6l Ii#c@:llt@n?ab:4ukdWI!#+dTDS9pJZ/pE&jJ%Vj\<jJZ=Ay:uY?itm8AL%VP&bk+l#pPiXC8*\t:Tj
h9MREB IBi<wdp/HjEyh4H^$:Z&tjPq%caPLP?6YdK/!56GqH8?q:Eqnth>T<^X?+=q5Gl/jZ:PRC6t9H@w989Y
Xe@^cD !<uLKd=:FP1BtN<pV&dIF^S/iutP+R/m+FtYTbIw1+J&u&LQC>6=^aCV8&j^WnZqm\Q#=%cQ5ZAc&&NW
9N9iYm +5M/E+q9cqTBDW:JeLYP!hY:Q@1WL!h4q&*EQp$qh&K/>ek:B:X?u/&5Y^^&iy=%5VAND:>n$#atG9PN
AlIB*S >j8i#?><lphZ@?a^KGqjWwqk/+\jw**eGZVcj^#T>j=lVZt9Aquu1&IPT44Z>QK9LZ8%bL?%9q8ji1y4
EP4W/5 S<iq+YCTp>Ty!5wF>q5j+^YwCZDI<c\EbiKHa@tNikaMJ?^dkw:!w::j:C1XiV=hjZjV&RGXM@=\^MZI
5BnTbB *jLu8ZN>1m=I!S&4/@H8tNp@<piY1KGA#9j96t+y>*ZcZ/uTdLM#CL@=/JL$1W4KWMSWe1lNKYB/^itq
@!Laj* =^du^#B/$VkK/+jNekhjcqd<ZB<*9a&*jPZj&&@P/!Zeu#k?9j&ae:6bY1J4Mq>qq9Q+K1P<jELkNLPb
YEAmMP 1#ew5&DDM+/4JLY+Ihu5!+?DF/JNV\L<>/?b4DI>wLJC*e8R#6!+L%/nh?kGn>?kT1wbhpThk&&#DPy%
c4k+/5 P&w6Se!TpSYGciC/9#w*Q$hiFNiY*DQ<Jtn&PZq%J1ik+$Zc%@ZNT%$ahq%GX?H&**tu*$BYHK#SqNaQ
5:FT9W hZ4WT#Rj*be@uHL@#6Ptb1j/QZjbddZ^^a8c4*Xj%lb%m<ju/DYWVH+HiY+EY?uXhTkJMGZ^GDl6LV<6
St+Wb* nC?9#VeEwdj5<kaqu?\HeSEML^uh&/RbAatw1Xb!H5n>udb\bl?^Nj*#k618/$X/V>#iR>/Q6TBP@*ma
wXH4^J R:Kd&4?^=R?!udE**tbKL/?tl&F@\qA@L5Bkl?bP\V5%i=&Nt^FQ//=iTZ9hZ!:$@C/WW4W<T\@kwkqc
wnF!hD +PcSdntV4Ha\E=VT!>+K5ytbjXwj+4H>ZP#MmRm@JKDAp9kk/dG$M^TlkL:mk:de*ZN+%AG!nS\G+tEA
8RIZw# :p>>9FiXuyPJ5:jdW\&d4^<t@S>=jG<MCW!LdYqqlHnqqwcG#T8\&uZ+mA!5RTTmbSi!9IP6\Y9eX9p8
P!u54P L>#eed4FLT%B?IaC:nh!5$hN+uG=&Q&RQe4AQ:aqJcqt4e1B=B<WbqjIB^DnV#$QYFS95DFyK!T6Cd\V
4qpjBD &uJ@5QB!hC8Q4DFR<5$F>JW+##$jt%AqI*d^SW$&Hn>Ddb5m8:ijFMiNnjV8FSS*dBSPj5R4RMSE&6w:
C%EDu+ 1\iM6CRFDD:+BH4jql*d*PXS@nbJQ/YyJc*9@YNtq?5M$cmP@9PK1Rtenm6t=\^$jSSdlq\eG#*6@ty+
EqmEpq 1i&K8+*/c1#l!1AaiP:=w\eypW:Z:9Gwnc9j#uWS\G@&c6/:Ljt+PjiQ<dYZ6>JKCp\*IDQ5dqShhlQN
&+<6uJ nXtN@jKZPwIiwCpp8S+64=*QKW?MkdBe5k\@:dJiZDL/+hmkubcdLFh?yX^8JnJRNK&=Qh$+YQctZF@#
FX#JAX AW&$GIjhHiSNIbw#i9n<Vu9aN61DeWak+<MN+aj/Q15V#Vn:!eD5N=FD$#VekR:!!4ujy98!SitjXaK5
epw#Dk MP5#CcFQ*y*>!ld#e>TcXKcd<>J5<45Y@hp6#bp!y:GM9jylQqlK*#AN@<KVkYb$HSiMljjj9N:^Tp!&
IG+kyP @t$5i^=N*Kth%>9M@yWDXY6h!&5i:!Y*QF:?>ekJXmVT8J!/jn=ndFcPKn5=\e=GY:V+I\t::5j?CZQY
ZlWZB$ :tTei#*w<L5%=ac1=pJLN6/YC%d*tH*4E=WIn*aEN=jtYAIe\L&@B:b%?+yX%hd+Tt>4lb4\yA$iHM*P
%lTN1h atd6GVV/*^>HdRVP&Q*XEPBlP81M!#hThYu9!88jCtu+knKWb6nJDu%%/:iMwK@n\/M>4ydtqqu*q^:e
&Fy&Lw m+&@=&\<LK*ejyyiDu1pd>J?L@HS*cB^^\iFpkHdtp*NuFPJ#wVqw@qw%h!uycatpi?c:!5F<CH8S5IR
8\&jXb HHalhdP:L>*n!Z<55kR6!^b&JwN$InpPPn1jQRa>tw//kJRCD9D<Rj9&dqPVtCiqWyh>uu\m=$^!%E^k
MBLdKL QahBbRM84l<GP^mj##FT+%KQQjWi9SDTiMFp/IWJ&Aw<>#9Qunm+&Nw/K#%#jaQe&yYyX:@PEVyCb@wq
@\4THP @W*lX^XBB<K4bF%?=Y!1y%Mi+k8NS!Ft9?Ck&m@SMele=+?94tuV*=tecc>4d9F5<A:hCt:=?!dAldkp
=bD#/1 VmH=mwyep@y?1I1P@1Ne?wjY6:Mi%mB?ZW^ePk>J+XK6+!X4VbhP&Q::tuyXWPX&:5qnmmWY/4KlK*eM
A8Smaw R!Zl%C?!Inkid^kpjbt+Q<cT/NXchNHp9E$P8VdMe6jm!bWV!9h6h5^B:YEiTqiiV><R9cWKWZVSIlae
S&bJDk E6$L#%Na1#biYn&/IDDTL*A\PRHBP\BqSGhIq*jMtPLm9y!TGIjD*EpYLqR<FZt<GiJ?#1Vw$9$#uycK
!&KE1: :e%w!R$uYNBdh#E6?RX>WWYX*BIy\bTN4<IXT:<4K&&hl:@P?uVaJc6jk<9j/ZRjj^R*eG:!+RH6kNy$
ewc>H4 !deHTn?PZC?q#eXN5uKKk*49@mqSNQ#/1SAW%\+>u$e4wu&mEt^@<T$iiBlnQ6?wR?nj9Nb@C8aI+Wqi
L5tjDa *ML=tkR#!WE6bVk6l:1da#w5Ye9FHM$9Nb1D^<V+pFqqZ!$d\6K*Dtji+MVe!\pjDkBeXChc?eV<RF:y
&HZj?= M@u$&8M@<SY!lpXZw5\J@knnq@XYNRymmA6jSCnn*eb*#FE^Q8BDH?ICT:W@a<mCymBej*tX/i$uT+Y/
C9?/m\ \^XL5cnjn>wPKX%1Jq*WeIM@J!/l:E4yt?GyJXjkkwFWQLB$4/T9&pGFbc=c#?l?aQHR1Fdp^==Xd^/9
8kkKaE WD&NK^nlittklRj&WA:!QKSPIa?PLPl!4epbS&91TJ\?SJFHRbFHJjLCn9@YYLiI88q>Y$$NH/%8bLi*
j$Db5e qj!16*#PKW9$c9\4KetdwNF!%CyYq9kN/X$>VjP%bP:q>pPQhZ\n&c!Dkb:!eY9@1Z6$E&%u/KVn#Syb
QdT4l5 +=\*RY@+hPHeQN/9wm/JC1RKK#!4LZh#Mc49^H:G!A=/^=6qLJ!*:H$:4#5jLR\euu!aP^lGE@BtuZ#$
S+F+uK i^nn4^6pN\IP*Hqj%jkW?L?Yj$m*9+%maIXZM4bwCA^Qq<!:J<a?MFieh>*#<j+h>mGaY%1yWtYF+/<c
RAHhWw h:cEp94:K??+\<lwPS@iF!L@FQPHnphVXGJJNFA*ny8bWZ$/I/d%!j+M8b^ePK@Eyh>1q/*j^mqbDa1>
P:P4iZ MT&ul&mGThFTeQ=wD%M>ptD*IaNen@DZ!1b5uI<W@cmc*#^eMu>DpTVDb$4D?hY:bJ?a\$$ahG1@D?+K
Buh#?& i4EIV#*5%/@<TmdZ@$Sh+KXeiYip:lW@EK?q!i<p+=1ZdYe%d!kiSt8whylST6CE5Z!RwI#uJcN%+t$S
+6aY/6 ba&W=+^nIu9F/#P+RYXZ/SQtKX$k=C1XBYFAc=JJZP/+%e@=<dHEy%heWbR!KYjiLA$TFm4:&\wBiuE/
J%Ie:5 $u!Sjn<b6dYR=GY4W*FhwK6S6kIti1LDJFZ#t>pe>^!C@/q:u!@ePeGkbNm<uLRA>\TDhTw?&5kQE9iX
EeEYEJ S:@w:XwPYnnew=J$8S+uqcLp<%WCHdbM!ilh%FlaydKljl6Tyk%:=WpY#pi4^n^KVlPtSQ/ZRc+u#NYV
G:Q4kS 9=GS:JmbadJh/1jEd$q:?>j<X^>P$TbyCw4bCTk1S/uJ5h*Ij@=9%kecmaipXqPJM8#jKHIjyCqwqenj
SjR^VP @XcM@/6aPWK&T@mA=b<=PAl#bcTWbAEM?ld&:4Iwhc%$l+8E^ZpG9GPq5Ljy/QePqQ#&VuD^$^6tenJF
1>?ZJ* Cc1*&^S9+T9BZ!k@S4LaQLl<PT4+=u6i955hFM#ljF!@/RRajwj#TVNRYuN!944?uyZ5H8ZT?BmLIm@=
T:D4An &<mERR<dC\&#DeZ+@X&6aa%TpwGtF%B>tSCl?n>4>by/&@yY6<>qy%5Gnn&1aZ#Xj&Ykam&/d@mti6/\
-AiZL= 0004cd56bad001202b4 Page 420 of binaries2.zip
pNbeDu MH#+c@yBpm6?Z=1MMn*K#>?P\:n^B^NFw$:XE$YY4\wtj6e?Zd:%<k8eea&:!&bPZqH^kWdyI@h/ncJ^
/EtDlI p5q:Q9/#wS/9%HFWnBhbPnQbwDdba<+QEybt%=c?dZ*u11=kD?c6wnKN#u+wI#Ym=*&LRyh:i<?KJyNp
w$64nW 9lQ#@Bi@=Q>8$Kw%pZ?pyXJCSjBQh+eFZQ1+9Z!Vib*<N^qb+GZ4bCd1D!8!NYTW<YSwYnL!!H>ju8Z<
S9$!pE %>\kL:Aq&!inij6b#@T1mcT@8QmJyL?SRZ8X*tVXJFjV+/pIb6yAAj>At\t??R?@yYLTbL!9:@NSh4@m
P=bYEC Icj?+YL1?$ajaj>+dKAm^IiTedm#D*\hEVwJ%W=G\&GnTe+JSm%MD@J18Nj@Ia64u=GQ%8H*Fi>?ZlW?
PFJt6^ aqYD>XmlphVejkVnw1WeNh$WaXIG1u=HT!YHRMLTB*81T?Bjy!uHq=RIc+c6%dQ^baqqk@c94L@PmL8I
LwaQqR tQL%iyNePGQB/ehJFT4R!P1>wRTuDDyYk4W#iu6I:&V#QQbEFXy=@:uqNSFJHpd&4m<qjIH4/ZGnPRM\
*:KZ:S qBL9TlNV++Zh6*#St98FwS9jtNQGHe*k\C8><mc+4?pdB#@8X9?D%E<h9!NHL<BXtl\htETw>%GqaIdW
wT>C!b T1cm\y*llZYT^:l*ThmXn^Ia9=H@DQSce?ZA#=HRRA4@<8^M%1:%eej!c*u%G1Y?9?c=XymjKGw?JjNW
>=J:nG In>/=^ZDL%H*8W$$QZC>p1!hyW^Jpn&MI#*kY1YbcP8VPpbG98\PSh1ly:a1XNEML=FpHV&P9E>^DFSY
996/cX MH6QqZDijkH%^R:B1%Hb*e9*dti#Phj=@*ykZy/>T<LR\W4t9*A!&uK\L!Ky>D#p>=5*ZG!$iw4M6Q=S
C&D4&5 bQXQP@VpcGkE1Qc*KSpE6FWG=a:6DYld9y#u9FJn+Vdn=SHDIMP8Wm*VWJFMH</*c@QpmkALA>MdB?%d
w^>yle PBc+bm+6k%yI85949/V4H#N@cW@/Z>\mDl&*@#QGL!qGC8dQK9<+IF!B?ZLaK+4J^y?ZI#p99eL?D6Ne
tqG<\: Pc5pNV$jcS@1WM&RIcZ&+GK4y%+?SwMuJJapDWQCj&K5@F<%HuutCGaRi/>D9BP+jCDeM**hVLp>SnB8
F9C<eh SjI\l?>i:CDE\I:VT/?F/j:@%p$m49Lluk?i6I@X8KhWBM#&ZD&mK4jyNF<G@8$I!ZGt$WhRMRnlKN<K
e%>&%G ^dG+NGbj>$!$?Sh1N^RjEGBHewP??%/lKPZI^u/Dp99?lNAkGtc=eL+iy:hSFD#RT&@/=Zt\@LTJHqIT
^8&BQ6 <H4P4MN$cbjF\P\u9@^l\:a4&hhIp?h4ByQMVSwR<=bYnbienpTaH/Q+nd4d+aenYikNtpR8K&:/@YPh
WSHSHq YS+MVu^Zp+IbjyXCmpL1%pqH5p@GnuTAt!&NpJ1>k>iR>T8XqL=&Fu61nnT8u#u*LLe*:ib:FC=&@$eL
/yckY! Sq8?%hW=9CyC=Jj:HN>eJcPlDiSWD!Xu@Q8\pZK@E@GF!nhetwp^d!DSbFFTV99G6ctQyyiFHQ9pXPIY
FBy@:i @6Qwe5QH1&&9&Zu&&EW^1F><&/@cFe$=MqLFqi%%hKaMP?cCj?d@l=j!meFn@%>dK#lNC4ZRFq$T6+Xp
FaeLIe =whpdT@cw=JDM9?15d^b:dmqRpQB#e\k^&!&VZa%c+G6++uwF:++<I6<KqQ!4qXYX4HynM=F?6ujaRF<
?NckR@ 8KPw4d?M9MkL%ARaqcY<+=AVY8q:9Z=^@bhNENZe/=%d==cG:!<piD$=MXd?&PF?MG6D\BkpjVAI=>uh
XFQKMK <ZBQbbp=jq%F\L!j&&SyLPS^auYkLYYH+6Z&/X59eJnPWjdnTRTt!Q@&d#d:<a4*A#jKR\hIXPnni!+9
$aGJi\ ^elw!/XGI$YmiiGj@LjIR^<Plj$?n^V*FG+KW1cq<8:+jW^BXeD/pCh?98hj+G!V<l?JP8i=&WKtP@ma
*tEM:P \#m6@BCM5nWBwY=9mdtTDy/j!ZmpI1@@94a5^j#:@c#Wy18VpG9:b>8@V$pI4Q/Z:F**H9&9\FkZTum+
AQbW#C KhG^neVD?ky>P^^XtF+>/icGMQ!YF4y&?9tl5Jl9Aqt+EFW+L*P+EGXe9/Z%a98b$t@c8mn?DQ@KMCVX
^AIWAC +Pi=8ilY99W#8ZALL:%Rm*<l:GP$V9IMt*PmQluj=V<Wct4MaY15d=uZ\ElTQNy+:ukRe5IybQiPqHqX
H&4PJN dLl:FP/M8>id=?iSIyPW\1@iPwBtkj<=$1GubRBESuJw%9bc&*9TapqS<!@VV\!ikd9WdhY+E%?^VCV/
Jd<BRj bQVAI1=??T\ZF<1p\u<m%\Y8J9VS14!tiQ?m8uqmjh#nMDD@BeuaZFqW@KXS8YR^VjN&H\jh^Ld:iYEh
iJ1:5Q ^XHlp=IeRn6W>@1bbFRW+4Vee@?1yZ9y@1eJKe#NFS?a*Xuyqk6:#B#?Ib!QLQ!9EQNXVk6>nn+XWt?C
=Z\4R% p@yMtbcBA%/<j5m4>H4uyEykiGF\5JYET?=49?::@%K+e+DteS^**jQ>^*apbZ^@S+ky6YZwYp@KX4%%
WmNF\< QpcktIh6a=a+++KyW=59>*X*uN?*uB8$<H\d65>IebZ=:>1VDBb4<8SLAnp<C#kKTpw/N6WM+/bT>aw@
j>GjLy /\\tkWL5$AX/&6>j@mZl@@TNJbYPV>:>w$FcNSc15L?Kq@?R%PVku>GAFQ%<T=d+8nM^=B6y$*p!F\Cl
jXTDS^ !euwIF%GCVEeC4eIi!>8FX!B95mBYS%GMbMYQ9C94IGnkSBc6RDtX8TJJMeQP=Si@dd9^hymj%@X//K@
aP+h@6 >Dk*:$N@kZ?iK:@&*?wGB^V@be%@umhXcNtbm9NeCDIT^@\Y+KMqa!+uTnGcM\\KR5%iS>yV@\:VkK\F
uLm=<Q MZP&aad*HIS<uP9@$hJ@+?V96n&kaLd4V/9h%6DBjDK8?@YLjM<tIMFMCic8a=H+5ZF=t86Hi:\*nZ*S
Q*!G\& <HS?>Z>p>m?hkeu=cDZWTethP=yyiq*q>hHB!ahI<8Ac>jM@SAQ&e=C@q!/Jp9L1@^We<#j!e%nqLnQ!
EEqZjV *%alGi895+aM:Wa+^bQ:bQF9*>EHl>:nI+>*\ajk*9G$EYhw?QT+Q66eql9&YC?uaV?jIynh+kaYj5qZ
u^VHy5 49FLTiCmc*hjcRjRMIj*M@?XF$FNe6Y5/aNRP>aA\ZQu\6Nn#$HkQ!4$ej/QFH@>XSFmJutEhmH<E4Zp
Vll!I? \NtE@eHJeey&M+@/9@#DIHY<Cy4?a5&Jb6V/q+$ua9>bhe9H1W6k/=m$^5q@KDIn=ZBA*W5waYL4$j>^
YN6VV> 8$GJ>B%>qQ*=jd>@wjJ@I1h/BXNYSXwe@!&KyZXT#Wkt5T$SH$*qAAJw!DMGXMma#TtV=D$<@mBX<C\&
Ldj$S@ 8DhWud5mhpJ8?chEBhy$ihQ*%D?b\!ZE?=8*hWh@u6lMhnRyekt*M<#<DGN!lKMJBF41H!TF8Rk<&:^5
IMESJ6 pCa>pBIZ4Hk1:k?E$QkQAX8QHQ>qGBJLjj=ZN9X</1hXa%MBuYH\MLlCjc5qbk@NMV?c=EIKVJL98DQ#
YuddtJ Nj<S?RXLh+/5tek@LQ!48G=<l^e^<p9\$V:/EJ$@FIde16DMJZ<d<Ri$i\#\AFkFJeayKS?Vl9YuFE<p
&*Ydb= $4EE&DIXSX@D:j<qlBQNS#hIdqat?/\t^ihNSI^lKTlBHnkmbNcBqIWbb9/4dmbJBeCYn&Qaw=$DWn$5
Lu>Seu t4<!BM$/=aBRaQ=ikc@LH6^+1>HCJQT9lB+<?T?lGY8Pl@Q^/6qT*jGpydyHT/@!iy5E+A9IQ?W8<we*
MF<+!P !VVjptjV19^NmjcSL*=u#?bqt<my\ZQ!q5CBaS!&nu/j&labd%ibS*9X#!mLM$CMIH<dQ9yQ!\j@Y/:m
Cc&d#e @X$6XE<Y1RwK#5>LdQ&9FB1TW/upI?j>!4P^N6!Zhhd+>qTbN9$yw8?H+^I+9D&61mMQ!dMY\K>MT%tt
/mVM<@ X!$VEBh:pLan#Y:>hWiaew+t1=E>uDBLpZ!>8aK#pwGQXcA!*NNtX+@EEj?49ad@dX^W\lqyH*Py*GH:
1h#!nb X@@<Y^D6Q&c?+AtuahhDHZ?&X?GbQPeJh@$QTAH@9ZtJMWnRd8%y*\!?djCTqjyLl<PBLE#e$tAl+<y8
h^>*+R #XM!MmD55nk4!=Wc&1bdStFpLC:H&YVXIAw/*m>p4#IDbQ@:Z9\nhZZ%?#\lmPtYQdD!CCV@GAN*YwC+
@*/t=! B=!A5Lm?m>ahGC=>:%#>SBS:1I9h>pb8lpIeA$/?auHV&EMI>n\PYX@^tqlj@%6/::6*GT5i&6\Ek/PZ
#WVhtb $yH6+48NIIcYZ@FRKRJBAC1FV%YHTy&i&y$uKEGqL6#Vajn$B*9>jSk\9Tbk1d\:k/%+<C8wV%qpLb=c
9E%!LL wqRGK9@E>aBkKuTE&c^S?jD4p@N!m:BRh4B^b@NlWj!J&a@kAdPn6cePhR5>GjtJ8#hYWQ/V?6SwLRKi
/NmFRa Nd@?mNnaYG<MRNdW:H=h=wW6AS9%6ZN!5A!>J?6h6P#9%@btnXkM6j=&jBMcqiR/C$W$Hm+#YAS?J@<P
c?L8X! F6dYjcX>n!&&?KLYjDqIwGhXwVZ@yiNWRYtIqtYG<ankSnccR4u^eP1n%iP5e?QyBqPJSW^5%Jqaj:ZZ
QwGJ$= 1?imZw@@AH6AZGwXeCL$C\J@!\S/AjA$EcA%T6DGymAY>BCeJ#NwGd8XQ\E$dTc@h*:u>dK%icaN9:c$
iWFE\I =XGPqI*Vj:INj9Xb9Mkp#*<d:G4dwFplbPe6GXG*/Z!&E844>jYuij<&edtFi?6e=?CduTG%a=jS*W9$
pTCh4: PmeZ>n@WY+hb11\&i6=4HhWGF:y4!Fu!j#@YPIEabMYt>#?h@ML!e8SGit1/DFCeQR9<AN\DLlwISAP4
P#W:lj c8kmWctQCHGH#bK<@5+Ke\Rmlw=j\QFYlDAFb?1Ryd1*F4dDJ=wLE#Ll8>@Z^J%?w1CyqiiVH$!kh^B*
q!b<Mi F4>=eT56yB5Z=F>a^@e>SS>KYquuY9bmV?4Le>9bjmXa@?S+#lAFujFh^+qKuF6uR:8jPWn>/ide+plN
tV$y81 $//jKJ/w9>X+%=&R$nMTVdbEVucjwN46Hp/Q8#9\w=4PhVb/pjB8>@j$*=iewl+Ew<nAJwM*mwVd@J:N
$Ln>V$ QEj=F!kHw@I48#tj8q^6S=:b?=+:Qyq+Ze4%e*q!d81c#i6$yh8X*Zy+C:uD^YKLw@1Si/l/=t/ZS^jd
E6^4^D 4TQqjH8WbR/j81#P=c=@Xq\MPa<nW$paT1D/InZ6MYjppB!mb5X$T%hG$CLXCKMIPc<k8mDpMj4baK/w
?ckCHI ^&D:=hTFPDhtm8=e^iB%HZlDR^Kh/%+6tM5pV#EukR=<><9\Gh$Xi!nV4P6lZ:4#H:n+Vb=$$Y^CXWLQ
&D$SSj Y4#Nq<Sh6VjG#:c6pl=6%@SZVXun>X:dq1=ieZ*VD^5nVEE&p#i<$ZMm!BaWQAdC$/<WPNAW9H%/Iwuh
dAF?9P $WTtKS+BlWCK:?P*XXBC8GMVy1$P6p=#>^J!\a^tYidBG<=PN1@$A6b4B^8FDQC^Z9<d?jtMaZWI/ueA
\J<+?$ H$6EdNaD4l/<RR4SE@15:k=l@8u^6:hh<NZ+VuNcu1AH#Ni5*@n?1K^@&F1pXh*KLX#8Ck^jY>b#hZHP
adHt<D &RNTDq1AZj&DymAM>u\Y&XIQ>\CDM*kkh@C&Ib^NwRdwKZE$WajaIM9::H9b$=nwFE:Iw$tm>tZdEM@J
4Rci9I 9@8e=S^YXpucYdHQb^I*+<#e@mT>dZ:GS9j/KR1e1\n1i?ZF6Wb*A=YRHut:S>GtZhBd@6dnpNi*GKFj
Hj\?6\ yRP<5/y@dlEu6#>L\!>/688Si!mR=TIw5B:iFZDPwSS5mn*HIi6lQJZNFiiLy$$C!pL6RuB#MHlCuPi^
VN%KkZ FW@M/jE\iypiPWmQHACRlXaIkQkStMKNun5Sn5N?Kp^%M96?5jlDueeR:jjB<Ba*C9DWY$=ZFSN?WLqX

-A/SX= 0006193d5ce001202b4 Page 421 of binaries2.zip
m!M6MG ?I6>lKh>>e<lQ44HqP%d:E6l=BNVDw$W\5mAP94+*MAeenTtVe6ta^a:Pj5P56>WA^!!Dq^DL=knt?4l
QXKN1G XjVIyFupGAdb\AF9#Wj8wEAW+HyC/!\EpKchc1+G#ul4\^uP?=^p?BnX*mqJDcn/FdBEm:WY^!%M#NLa
P+hR$j @<cqi6@$1@B8:>/wt$/aZw68iY>Nq!<<\u4*&h9=PN%HadIF\8MT9<?*Tp$6!^K%IdGNQS=46>AC/:jq
>%j#ZL $Zd6!>He?Ab89<SJ#$a^ut/Ne\Hi1+Kh=H4aL@AL&jKK5<9:%8knJyDTI5nTm1eLG11DQ4ACJb$T$yF6
^SQ:cQ p@uE9iP6=C>XBehL/B=9>E4=:9A8:y@>t5ZlTjX\qBL$6Ctpp\h?Dy#@NkeGt8m:%1m4GN*JS?CuWl@8
jKyqAw SjF<=yjS>NFEAa?!l4&qtuyZ/ttZy</t$:T<&Nk\E:=cGk@PSGJn^V>y:n\CkbINLAMH:F?mh1tQ!y5\
Tc8anA F$ANDQP*BuHIPw/C*$ZAF$LB<bd@=NeCTTA/&L%J>ER4GkC$G+St8C!ZV#kc8JiSTDiSEPbk/QHAMny^
u&yi>M &wL4IFFPHuD!/MQwm*$W1X/pThi/6A*PX?Fk%K*Saki+T8%mukVu!ayj&HkatY&DClYKVit?+Xp+iS6d
LKpcVP :w^uATLu!T8qkKw!:QSANiBIGn&MT6X51IjLA9BMiC>!*lA=ZwE@t!VAMtE44c6jGu:jK:B*XLT:$Z9t
AJTuTe ^VG=6kS$cq:nF1<V/EhPM5n$QNt5Qb*6Lw%q1N4Mm/9:eY?Y9p4b5:=Z?^:Yj@hZedFZFSX@?dhuu##a
j8Q^<h /^TA@PXFRQ$5L8BkQRAjj*4cmn&uS#bb\V&IaCaq/DaW8k$DAie9AYRjaS?m#1MiG6MbY/BbKby*lp#V
JHn^$i *$&<Z$E5SBIyd@j!&M?%EQ&\^F*Y$#i4T9C@y<5Q#WSm4E$8KS*pLEh1tbp9mdS8\+DdePAX\k$DF<DA
5*1S@n aRkiV\kwH49QkS/D\^%!qL4A!keZ?kV^YPDw<qa!<kIc^Ijii+R>WR@A5\WRMMk/PGkTQdK*h$F#kVp^
p^ebVJ QcMIiWIIaaZCW6FwDtR6/u5kZJ<RKwRec$T8EeGtm&ZjY\?AC+La8j>V5ha#Zw@qh*PF%@RmSIWXZ><h
=diH?h /a@ylAXYZZdJnKpN@ma1m!#kWd^q>PW:Pk%I8XD/+%@c#@h%=N*y=aE/ph=d6l6?e!@PlN&Wb##DSC$L
6KG@QR *>Id*e:pCDq6NY4!/aWMDCYFmVnZnb/<qTh$nbHZAI9AatDjTV%9NkbXPV%PQ4b#eP%m=@Lpl#:*8pF<
6HlRK= +MlF*h!>/pe=u9DCXm/ddAiKJ<:Ttd%LX5dNFi984aK8$+cyZ%B9qu64<h/D=SM:pmMXj+**4TI^8F:u
A5l&b* %cjGL^<%j#M!aNTXKEIM?bjNe%=4Lim:J@cY@nV+?HGqq:Mb+wTi&KZunWQ\4BCXTb!NDVnJ\I<F>=?i
tVZC@8 bGBZCNlhc5JFElG&A5MBlMKX8Xia&j5$*c%jjWWPR$D6upD6H^i@Yh*9HGhEk#ihu*bH4G/!uD:6d6TX
5M+m^J /ei8@/Jw89&EZ$<#qTbcA%w?^%F<^nHa\V<tECe1Xtjd%/qQQG&F=pKR&L&d/PMw8A6SibMR9HFK$IhQ
5EQEa6 YT1qE!FBwbAN!Pq+X:uTDcHncHwP&QwZR!J^yMl!=tZTnV=/\ySb^>:1*n#l==L@aIXC\WPP!YWPZQ&W
wtMeQV j#GLpN:lF9bF9:/WSV*Pi96:IS*+heF#I=dT/bG/\cSQBC@dwiZ4kb<>n<1YwAL6ABJalGBDtnHR//qM
LTT+=m J@XKJ>a<ADFnCQT%6Gn9?m4>H1!1wCR&>>*CuX6CdEt46&*C<&NKw&@ly#KKShuVF?X&P1?9XCR/SG^&
YQ>^BS *C<\ySZjkdXGKqy#9l=L!8MS5%1B4V&A%H#JTR!/6k?kX%NJ<RtCS5F#/+H&*pjwVSd$/nB/ZL\WGHS@
>wjImc TC^Y:mAE^=!i5GK*?JF@^PE9R=WTFyV:wcHD&C*pPSG%HT/%iEFF6FSCk5FuXn\wRwkbAjwS?m@N!tQZ
iGM?X1 MZB4$GKXPBAYpD&?qh+*m!VJR89PqZ@H#@##C5nW&jXb@t:eTeZ/&jhkR?\bHQ=XE:*ZQM14lApMVn8L
mKScyP ^X+kRN<I@HJEFD\AD81I4AX@MjiW9hJkHKy<=<h/#Re4bLw^5mi5wDQ!VBWuTB\=Ct*imDmESS^iDKPS
#<Z1Fw J<Adh>WYwREeRd/!j6Q<DA\5uq#wANZA^jY@meTdV%<mX=G%NKQ1Pa6HJpyt>l+V9y>L8:KZVpTkwD>>
yb49PF hjKBu6\SF5j^cLqHRNN&luDFhPBmLc5eRZcpu4/5=BpLEuh>n>lR$Ku+F/GC$:5JPGGM+8uY&piXlWaJ
w$N>@E Z!<R9+^?CmAaa<Z^A$+q5c8:u%AiNbqdQA6LeNNT$XJwZidE/Z19?!dby5!#jweC*$nmP+Qm9c8Pu$<q
Fw64EL %Bl@^c&SVTcQ@RD?nn$eRQCwn>>/CStEdj=>Ce\qh=inN^#R/Ll@Z=6^D#mwPD%1PCq^QJZHu6\=n#m>
Mie!^% TMiCyX8Q!4DNe5!V+FYWBXH=FldZl6*\KK9+wJuLA>:jA%GHKw6kN\4lVXd4SNlBkEJjMjA<J=eR%IVh
dndH&@ \^^B<i!ub#W\mA5pB49Qj\G/D<j5X=DAWLmtC5n6VCuZBPLCB5LAc6VJ?M*5m/eDH?K&QwZ>iQw1<Pt4
\^=DW8 =ZLDwVH81LJPmm6X6p@ZA+9>C1y91/ZYNipJ?LGI#q$46ZXS*l@1Aq=!!wu$HWE@j+ue=n%>h+Zy/nZ8
qP=@Tm <H#8=&tjc=ITBYq\hEiK\J@S^dMCjFZAYW+ACZk:D5nYi4kLYJpS8!?MS8enP?BwIkIk8?H+Bye@1H@9
C%45#m /<k#8tV6Y4Di8@GkHDetZ<dwT:/5biVJ9l/W<tq5jC:XE&wJIE8KapLZ&<TpHK:mVTu58hD#M6kEh?nl
\kRXPT b>pS+bP$NMwp/X@iJnVB\pV@*/q=#m^/p=eT/n?Eiah9hDD6y4Ld:5d&B\Dl85nY&&X8V#kFHqK:IEJW
<PM$Bl kYVCFLDjkcY<@%4lS>?4i8X1*qmhl9PGa8#e%=dSn\j!N>u1pp@Teli#R*%qLQ*%klc*@S9ew/aM6^J>
w/daie Y6:k/#V@*1Nqb:+==*cY^FupCe##&wS:e5D\@y<AD8jM%/C<?@h#kb:RX=m%l+h6b4!mR&uQ8J<1K6#h
+E:bPW =RmdTLB/$\Dmd=AL9JFLkK<Ty>=Y9j6:$5V+Q5lA9YR#t$d9ZVRw+<@DJikccb8=ITRJ:LD8MGMQNLEH
T+iL9! h6k##DeiJWRPJDnk&H8jH4*&<b@MFE+VFYHhYdK::B$u$H<:W1I+9K:?Z:ZF=$ETuw<Bl*HI#6bmaBbk
eFCQ1D #eqnLE%/&M\*?+HlbdlV4A6\=MJ4:bawc>^5y%&Q%4+nMlQ8$ATNGI4?JL/:R^6?Zb6m!KL1u8maAuh*
hly?*M %j%*KwPn/wtLct*D+&4?&l/^*/?PAbN@bZ5<kcte4/$T&MMwLB/Ay+uDQ&4CQ%t%e<A4^bHFCJCIQk<i
Yym\@n lMD9ZYTdjdF\@kQWWHi@*CQ5y=8Iq:HlnJT%biujQ<tXhB<mY$kbw4#hqQq+J*bQSw1\N>l<Ci$ZW1yK
pVRNkQ ?MVYVHB41k$eDD1KG1*4*G:Y?qq>8kVD@MaEH<nW+j9DR#%&nTw5jCIJdMC&Fb+bA#$Hj1w9@Z*Tb^JK
m=5FwP mJPRlhAQRQ9IjckYJ+M@QtQa%:J?d>nDYjlG8XH#Ab6Sp!:Rc9Auj#LdNdeG6:GII!Bib6$KKVuIlBwI
VNHeZ8 mITa+PbPQ+4Kb:EFdpeS9RJY*$?KAil=1kQwBZ\b4A>YKpWMd&kiR1?iZmmiEVycH\1DDQR^BALWBaA+
LBGq&8 EDG*Npj@/tN&1>HVHuABD*l=FN!j6I<lBBihuwMI\h&u^^HdAPFTaAd!HHZ?Bw5d\PKp5dklLNaa!=G@
A/\w#N Hwe?\eAZe!CpnipGilmaBK!WA+h^Hyc9/PjE#Lkj1?iZMwkNVRVkK&+%C/h?c#b*R&jYna$MYdP&*Qww
DR!nIA @9Qh%R!L!!:1V$ba<V9yt:9j<&\N1XKBTVW@+C@^%<IeAeyJKqlYh6Ba$p+*AH>I&9!ml%yBq+lKeCKE
>4lVbm cDP#pn!??&KLFXpKkAKn+PyK5HV$mDnIHk+jWaLPlR!%tl&%4ycp6t/^#kL@TnRbKLSR/b?IA^Hw:u\$
VLQwS@ NkjmiHymVID%A#&?64?1Zy1KqcWd/?D%%FMM4cuVieea$/$\FAI6jy&*dYi5F%4Q%4aEPh1?jP^*i9#b
FNa=M$ Muc14pn1>EYX:mw#C*:n9RhKRRe1w1m:I<W:Lq:\bVV?RV#@w+IN>:Tu:<>APuKth::!&imyGRISVnY\
>!NPtF Ej%WIjmpW8kthl8D4Ed\uLcABcDR^/iEWYRj@RR\Aq6y<baLRlDqJ/m#\*$iIDB#9SLW^^@EIIRCZK/L
tE9%=I j#bDeMLhS=y$&SN1nEFXBhPt<h>6@I*jFy+HuD?jwQ*ieitMe9mN*y84GKYKRM6DCtZ96IbpWdN*>:*Y
GHi8mH :D^j<mLHlRmhJVcBm$AiNQCWFI1:iJLjRD!laHqa@k1JpCZkwM1tIPNVIAL\^puk&\kN?Ed/pakDq6dw
Ayttwp hbyA5c4Z4u:dmT4Be?l:*1/JQVTk5%yd!VD4!l46i#&$<h\b16li<%6=j*ALcR>SCXtuyy^TNbZ*A+db
iM^C4c 9GJPD!?%e6y\XBCe?8GA?mpPT>4euKDkm&A\EnZDw:^NCMXnD!T^?#D$YP5PIJTbZPeZXcV@wS+iDkNS
BkPZVj <ICyqEK>$Z8P&HN#bJw*My?wNNY/iCCP#>Hq<X=W541C4E>GeH*i#d8/*@?%/6ij8:!>ySJ$&H6q&X6u
*I>\EC hu<jQynlN%W5a8W@:^h>aydqX6mcG#6=Bp56hyP=Z*P5%\Jju@VL^aWIYZX^TJt$TF?mZKnaVKueJ5Zy
4!wN<@ IYXk?>wDhRZlKmjL9@6bQwbNM=I!b=FnC+:L+4/9b11+p9d$G$eYy\%bR8R&N*ti9d<q$XSYaXp!G$#q
BNLTFt $q1*6:G^t:4ZZD&LQhRH4lGmX*MwZIn8Z\%nK\n#qme=!uYuy>:a*Rd$SD*ekcmMPD&GwR?6=Dl?YtGA
C81by+ XpLyIELbISJT4>IEnL+cNJY=MlFn&yT!KBm:6qR9h4%@%VY=MG=u=wN@89?qaQq6</jVtNpH@8!cdHn8
86ykmW d@d%#VV^>:wq@+#A#w\pnD@K8FeJia/&Z8kDwZ+:&EMwh$yIWuS9=Pc:eRwWe#BR*bVqX6*<%#ASnX4+
eVDm$e D4uZj>9+kuPHT%p@9$Wl*&t6JiVZD<QRK*NEP>R:yV8!yXeJRt$48Wp@ZF=q>aqYEL#L*9R9A6LHY68!
pRl5Xq !Fwtukbw$Gj5unh/6\%:9BB<XjJ\G45ml5YpuDESAd!nXn$^HNEAbmDAMPl8N@T5J9!HA:JtL%$<tYNS
/BV!D# D%tLALW1RahDk^$Rb:?u><:@t8>?D*hpZNj\^j9Ry*CQet:$j8&+KR?CHAZ&ItjESAcQa*HX?BTE=$44
HS@P#p dtY/me/EX5cnL$Zi9bW=GRMm\LVp*Ten::@Kdcn<tHn/\nE:><DuVy+*I9y?=44VW*E&AQXRGClAwM@$
>i8<@X >\9ST@4I\l^qJi!8KHwc\B&6+CJ\C/E/F/BA<ZW4PHD^!V*6ZFhJ?1>^w\Z5hBYhqDH&hLHc>e4:^/:d
<I**=5 Fa^yCL8m6&Hn6/Qw^GPiGeF:\S@LGNe16n\hZbhbWny?*a*\6>Ay89j4/X@4X>VcuZS5T<pwl6n1yIRQ
/Mj&$j KeqW<+j/FHTbI#i1*+qep8u!Q^G:@Gq<!p=X9lHIWH&Ti1>?R1ke^XNQanPqwJ9wYR#emkk&CFXKZan@
abkNbI >^Z4+?J%aBT&GtaLPdMJ%WhQw8C:ASh^cBStj#/@&\A>C9Ae=+D@kHJH+b+A/5KDpA=e^##6EXH1w%BJ
-A8qbq 000fcba1d35001202b4 Page 422 of binaries2.zip
epn?ac ZD1\q8@buYiyFqX&*T$ZNjh=/J>\e*Q&QJu#&h=GXmT51b6+i%d&c&/cY@@Ghdi&JP/+cu:yN+>N1m+W
aaGKPc X>X/^cd=b$PRP^4<HyZQ@8dV4QTQKb9b&mtE6RiX+A+PXlhCw:^/YXRZm?DGR=&PMPh!6q%hh?qS!XX6
a$<*Zc /wZHd<?hDl:#i>!GIl=KA9LnGj6H1+Q5LwQh%!DH16Bu/?Zdt^&48WKQJ>R4PL>lZ8dXPjFLc4T8$q:X
=Y8?=/ cqhCXD*dyu%&&4^+>b6TQYVNYGQSLLS&>ucjTFak@w*p:MhX5DmqeA6I$=V/d#!m5XQHu*&I=nDGR1NR
j>i>We y!E4=YSqFGkqBqbLA*MINZ$T$EKi6bymX>L?!SpKQkGF*np>NeB8c<+DJ<jwtm&MA&M:?n6LI4i9=yRl
LWS>p% *+6QLGkAKFNHP<9ep@knImhmjy*cpH*KWm1J^Ryi8X8@>n^b>8@1X?T/R?TCJlJ46:VwjF>*6TI6QXhw
dZdem6 @dPwaW9%/*NdDBHSc@*6RPlu!DkAt#\:k#miF+J?<XA*kG=5unHa:4=59TQp>4iIqqmLSpVu*A^h/cK1
4i5y$\ pX>%5Y4Sjq$>mt1CQDqN?KN#yA%#yXqNiiGpyuk>e&DhwIJkSc4eYXhF$jM\JFIeul!F\<eApB?N!F<A
1>%K4& :4kc9VYJ:yuE!n5BleC!u6cy%$HlAIdBX\c@<i%nVuQ$JeST!8A$T$9X49+$b=8%q?T1IPI8K8Cp@nC6
YR8n1n @1X\FMy\:EqF+c+$in/n>1k:S6aJlqNtGuw!XLch<LQ4t:hQth:44DLhltmB&hpWtbEd4Y:!bb&ehKhG
aaJmjZ YWG*6<RB8HK?/a!1FHA8i^G1>:+RepF:#F$IFGwEN>qD8PB^@ucd*5jWt\9/8wP*X\iH@AVb?!/YDw=F
DF\>Et Y^KbBeLj:@4Z9WJluH$PL6=n1V?6Tm!e6</66K+5EwEVeJDW8dH^dDEi=i$eWu@?dSF+CA>ABAiC?M8a
<e+w8@ 5G@bJQ^5ZcwH/$DN:t/nQ>89L*B:JL=W6u#c/d^VYnI9ZP/YIZZG+NEZ<8$#Zbd+eKHN5>@m#HZATIpb
i8w&SE 5K*QY\?Q48D^la^Ck+6C^GD@Qt%H>:Pkn#H\^D$iJ/B<DlmnM15w<#l@B/%ZCuuWYww558JbJMDm$AS^
lli^@R E1ICZb1kn$=Q%R=l\<A8hM@&=/kIJ=>L>lBG$G4?b1y*yH%%56*ccYJ9Tit:Hdb=4Z8NSud56k\%5<>&
4^$Fe9 4Y6Ntm<h@:YE&M<#ta@hD<XMHZ6YhP8ub5$c%KjXLeCE^p1dZ?BGT#naRuLF9XNWl+\P^M%j**P$WM6Z
cu>k+X \ha$5t>hN9McNq=tQ<t?e>kc/J>VW/6$Rk*k*ceV$+=t=jB%%GYtIjAZ<IecZ$YVhDY1AS$Z/WJ%Ld1W
R=j?Ea GBH:L<4j%w1G=+y:Ql>4dW^YC%:M9&jRSltW<WiHEVu=jT8Q*ILQu#RM4kZm>qBF*^&@8IBuZkY!mYn4
#iMcdd yRG>B#c\E/E>FM?pE9SuE*RYlplJS$/pu!qq\QmEihBkbjYAM*MAAyVyt4P5\au9kt%Qw4CHVhkhGLJT
6J68Ch HFRWeN^/LAb%QCWC<GARn$6F=6aY$RpRAV/S&+iXWbpCtY@hFn@bK*K:q/I=Pi/#DD8EYC:FXXbAc%bQ
dV+tQF Hn?m5\l!<WZ\w+<LHuRQbc1bIkYwK:AqmdM6$i8J!m^MkGly%qI6jkeP\+5MMKSwd6b>#h^9LbdI*NkX
iR&KYM 8Ty@Bd/Pe&u?i&dT?qw@A@4mVE6&#$V!+SYc:SD+D!P^+Eb<KejVLWZSy>mK\55S:wJKmjG/&!^j\Ab%
k+MbEl H%5E>bwe\@@AjGk&%MQPK@&*i&@@G5H5Gb/eQZ8Ic!YawV\YH=+IjjCiy$e&%MM@GE?k%1uST^ZICkmw
C>M#H> NAA9G*CK^YLSiCAF65$D>WMDw@!DyXEj5ph<?6uQDSdqdSJ!L^ZLQj><Di*#YXFey8^S@>$YpKDt^%1/
c=96VH uj!V<waSl>F+idj:j!<eaNeeRLWYK1@&lG6d*pVWS!AthXb4aij!J#ipRwM?QqpMNT+BT8tJy=1LF^\q
G/!niD B&Iq\Z>Vd19BH5niiY*Je*5bGDFJk65yKw@M@DZA&eaH4iViDQSedR?@4!KT&jFD6=VtZXII1$>>e1!&
1aGE>1 &!5b*ay\?4pNCa/E1DiX%?mB5Qpu&9p?W@\anwGVh%?a?*8$Hqt6?6l9*>pAYBYJlcRTA/:\%mJthA6@
\K4dqD Jqbp6Mq?i?FK\mpp\wnjE<Vc+>WN*5$/y<8=&Ze?q#>+Vw\yeukS:^BT9SQ!c%iL\be%<WNmww4X<S/u
>=PTWC 8NKhp8cu5cF+X>6>dNSh!5wZm:BjPkh^h#iY9!&m1$L$P#I+^beCep?hB$5Qt@5h4tFT?$5b?D8>KThk
IJKj<6 ^+5EZyFelWDy>+w%bb@=lYdq:#TR!J8^mk<c?itdmV9>=dKRn9k@yqbmFkFBSlG!#y*jQ4WkC4?l5J6=
6ReHe9 ^PT#4<8l^itNt*lZlX4qLhWdJ*ajq?jiTbSQL:@$8C+puq9Q$bTp*Xddi4/E?9Q=WhPJLW9kheLHD?Ld
&<@b/p m@cX5DWb*Geb/DqXCB8FH$Zd:VpHA8!?eJ@jlnZ@J\<*Q^hX5SZ8mIWSyaTt9wc5$Lj+nql#*A&a<!^N
Q9:X4> ZpYc/n*>y@+iST$&4+pX^NBSikCC5qqW1Wmy^^%5lXBhIC:IR^IDeB>lpCkRTI!$B<wBW%>aZXRtG\QQ
EYJELX e!1WwC+BF**wFRj$PGbYhBPH@IYC:#hB6RPPn5=le<CKetuM!9>F&HiH\@YE@?yhENGCSTRlRlBE6$wR
%pnihD IqyE4^EpmN:dp8l6JTJ/d$ERZcK5cK9**qt>4%=&>>!X:?@i=:u*u*9PuNt#8&ht*9uM&+b>b$I1$hyl
p4uGR$ k<HT=$Pi/A%L6D@dDkd6Bl!*?h^?p>%l9K99!dq!Z6Yn=c=GbGNVy91mhmItehM<cEkyk^:SlI??uSN@
^P9YS@ n$56$IACJRXDJZ&Fw?Z>^L#P+=DuqSeZ4=H:ZImFBumuGjRHAHYF5AtdPYK8AV@<@8Nh+D95!Qm1iVHH
M&S5nX :ukSmFdVe+auZCj5Z?\b<#+6$M&T%$@uGw:j$6Z@!E%H<@Y*69RH1%>cqZ=w^iGy/!1KCNHVwh1&SWKQ
=GkPhE cMq:*>uIbd<Phc9\jP+>=^H/6B5/u*8l*PB:m$9HWPQDuRNAA&l?q#EBTB<uET/$P%!CCJFu%:eA>Ywj
n@5m9# &MPmL+t6=M6$+w6>5NFaFd>84h5HAT8aPG5Y#*Bu5TTGKh\u#?&=^&be4ElN\u\d6?w8h\1mE1betkm!
#:FJWW 1CDFwVJBDha54C>$>ewINq+PC%ACD^RV=GLZQ4=8jMBLC?WBQ#t+Y4\!&<yee<VA$H>!c+1elnuThyLt
yih@*X Y1kw=JMHA<J@&Q?8La!Ak*1FD!\=*pe9CqdwGR?<F6tFhb+j6Nn=t9B4\N:84NmIYFdF=@>+WW6i*BC?
qd=JV& 8i#WW914dZKY%H*CqQKHH<dm1?inDaDym9+FHQLyIDi95Qbw&SC1@RZ$DBlX%<Hd%ZC+?de@hpb%4u%^
8!1bTh Ru/Jj6@wR+ka#YVDPw:^MMhLk:GjRm1AuI\&TBe!E!C>=ih9*lk\i9P*W&Wy9\eZy+?\k*h>:kbeEB?Z
VbZ5R> Z9jAV5tR1+9Z#9i>lj#</nAlynJMAZ&nwD$&QT4RK!DwJikX&+MtcJE!6N=8!R8!I^1Tcc!^A%!9?F>B
VkIG*k wyH:AGIMkHJ9RH<4HAdIYC#I1IBpZtKpL@%<n%BR>CAcT5yGph1GGRdi!tT8?T>GI:bAP+nIb#FBDIWi
85A9AT lHX/>=*^%Pu+ZMS*yQyln+J4%8%X*Hd>Fc89DAc:Xc#!E$eT!X\Ma+A6*+?aD:=Pnje#tLNMayWlKQKR
w<p14@ +eNZYYP<?D59=SwPK!y:6e+uHt&cSVcVXD@ZIqQNRQ!TZ@#KQnp^8!9qNQu#dIM!dQ/Q<%AB!TS%k@LB
?GS$S% &b=bD4GWWHEb+QQA8q%9e$HDR<%i*k#\wmkBnDPKWDimFaKa*FnkPCXBZnEeI@e:EF%/mC9\CjKa=kVT
W%mJMS m?QjL\hP#DcXJpP8K@+@/eRG&GC:=kLL/nh:Nj5MQaIMwJ5ip<>*4C+SQj%h+T^Z19aEIu/&Q9bCNeT1
16<WHn #tm4<%cHaN8A#jD/4Y@c?8QQ&Inqpl/P>D69i1GbJl<8DuaADB\J#5+Pw^EhFSyw9+jKtG#yE1?#+>QL
P4T$Ih 1&eAPAnMJk@hQD6GLB^jaq#SECL\<LHhKjkc+\H<$HAG5$$n>>4kA*Z\Rj/d%C5J#=GSL4p+K%<C1Mp=
k<Wmk< 4JKLQml//h8GJ:@@EBqbFPEhGb+eZtVn:iZ^L?a+KV\5LN\#QCI5QM\4QDGq8LnA\!QeI>uV$<jDM#\^
FJ%!Fe Lk5uli#Q4%>bj+4@@Qt*9?Yjp8LmqJSp:C*&yjkH>myKTa:EjlKSp9!nKCW!MnKmPPLH#ThJEWWSTSHl
yPkL6E !>1HF&qG?<KVw/hPee8HANX\wWLb\:hXR1M>S@knAVH^Ddaj9uH&=F6\XC9^$W\j#iNRp?DYj\EWJw+X
H6l$RF HF8P<eiQ&8\lCc6lSVyy+SWP>?S?ly\h%99JtZt96PNbZT:9AE6#q\Qd/%c!pe8mR&P4FalFF?/G+VVR
SkN:ke aAYaw?hZjpH^q#9c\4&SmiZREyjVicPW^MFe@n8S49IAeEW45htV1:S$4X<hc&*Tw<V@*up>Du@?yG$8
HBJH6% p?4qMJZnnDcie&L8*=XF=&pZ@tt#u:HtDp*:5CK<QS&NCD1/AI!pnCLt4GXGZ4F?m9n9#5e&#:hR&Qdi
k@mcPH q$m$9VBK<5!9RJ?q>+VJ*L!16Y%wnGTIQX<Nq?AZ?iP@b&&4b$%^C/b9jWH%jlD/DTe&KpSQT>LdWF#D
PH+=/> ?R>9VjW<NQ%1BIane\SYYq:h%+D!!DPQDyi+ZS?%KBBt$G*yM+1y@hwIDCM:XD44JH@8WS$TX<+w^1bt
:/alA4 ^+e=YKR<H@=#@uun5p1/d>H#?G@4P#lFG8uiHdlG?th@*<bb\+SVW#<L*:<ZAVmQX@^^b<PG^%+&VSeS
aNGZN# K4=8dLWiyKXXeduHTIBk%GuKHD+Pw=j*$$lhw/ywdSSaCJ5<e5RQGZAWn?n9/EkjmbM@Bm?iR/$NKHlD
Y1pYS$ Hd#pIKitajP98yjC:5$GuaVN\leQQ5j+n:b>/P?\G?!Eh&$?p&VIGGX&1&LIlCcp*BPq?bTih1=K%WR*
LbR%8u K&\<yMuye4YucGuC?yQD!Gu6DW@CZJFAjkecYZFEDhj=JDl^+Ll=!ac\//RAeRe<8c$8R$!:T@X*HM+j
m!b>Ra hk4RWu49CXckuBWP<DhQ$Vm<IRyWw@8*dLnmGCGbLAK\B^^dk$:e/:m*jK<&!mjqQq*y/NT1eyh4#tZW
+h:k>u /y41tdGY5ETuqd>N=PT/d>nPcFNpVV%Maqm::&QK8pLyT@V1pWe@^DCw/i5^a?Z=4N1u<@qL*\QZD&pR
y$6dSb M4YmENiDH%9VP8NTiVMdS%11A^MYh>KuqpL1au59l/N/BF:kne1GiF6ea@R=tK$G?bG*QHDiqq!+6J&q
FJtQLk 4B<%H:d95Nw4!Pc\cL1yakRPQ&j==?:<GHnAZX^=Y@6=i6^uV1:HjH<wlJ:#p:ewaB\C>m$hWuC/q1&6
*w<j#$ %>cn*6wIBBL4B&SDY:aCkqAqQGV#@nt&4kK4ANP4!8u%>S&Z>LbQ*+!TXd5?@XG5kHBR+LFwhZl1T!VB
^@CAXJ jpFMyADly/^<TmMQSpTJ@&wntw>\\lmJeW*/wu?c::l:@@%cWJDQFH@F>LHKwI:l6dm1YSSJKI8FL%/\
$hS$:a N9iJkqD=EEZ%?99^9B4h\8L=EwmZLl&F#XaMjk\Qqb4*<IbkJ&hdHqQD1!>d>@y$YkG#&ibH<p\!5tIL
@LdG:Z 9>4A+$!Y*TAj+V9D&%T@9HW%W>kZpNd8DR@q^<qKw/yFh1?@GI5eGJte9HRW$iddQ*C8#PEIXCl\JXLG
-A=/a< 00066399336001202b4 Page 423 of binaries2.zip
Febb*m V?1>C&<#t?TIq^aJ1hFZKukXQ6*ZEY*+lD1ak*TLAw?%tCNRTDtd<Sy*p?XFK5nJ>WZL4yJt*$5yBa1u
uZ$5c< $Z@jlK6+aC\w<MMpe@RF$?@m@aA#*uJGV*YcLIi@myL6G:XyJ/BQG1$lECduCJR4BZ%>c??K\8&u<I@+
M\eW1y 9Mj4K>kZ=>wl8j6hniPbLY%hCYN@14npT\%d4WA6MqCmRyajY5emq&nN?DXIWe9?#8yL:TMZ><cVM\mM
C^NEyX 8mG&:Mj!YXu^P<PMHM+$aVjm9D>F@ZaNhDY/XC^/9!6KQ1>H*t48umn>t?YSFGIeC%YZ/ZH#5iZaDJQ*
QBBlbL !S#dEX<4JXTa15w\?5piGQa/4yL9TcA:Z8=InB@L+Wu<11HIpJLQ$*6NwN#E*D*mYaW<Nl9y:PHB$yGw
8wmG%J t5GQIh<I8FiTPEFQXZJhiWVmk><N\!Pi1A?<86h>?5iRuy@kh##S9XLdLdLh*dXZ@RRQ*6PQK+V^8W=y
*Fu?E> 9%c>ZYtlc^?98!hP8t9Jib9MiVTG%eXS1VP5lyXQ<Int^TWQV$bEPmYbNjqdBb^WdV1Yn\+#Yq8hjjdX
L#!F$j a\y!mMpKNL>wS!J6R%$=1?BXWB&#\<\ZA=:P%=ZbPZVMlt14D@J9L^n4#FVF*\$/uqZ>R$kZZV^iw#&w
HZMKAy K%G$\HIai5e=TF*cn9LFcRmXdyQV/a9iBH4=H=P=JKd11/$6ahR@iKh9Fii%E&5qQSM8Z?R*LQ5cDt^H
GMCMtt qHK?a//&Z/Vyj%1bbTS5?9hP#k99&>n:PjbcR*LZi&u>&\I5Ttb<hG?Lw@6^h%IFLF@/NGn@nj4KTM^I
Kh!@lR IDHunml#PZmnJt4/\M/n:cij:@hTan*1H8$iq#pQ=lk:6HZyuuC9dp^T>=8Hdn<NBB^GKQK?&?wL!qGq
S<dup# 6TbyRp%icZmC>n<FKVwpBER8WG9G6cJ8$:$ZViC*&@iIKq59X4dWSNPPePJXqbi6#Jjew/mQi/C585JT
FI4^iu 9h?:FNiKR=>k9kBL9FZd#eXbZeKcMTt:=KFinHlA4/P\a1KWY8^EIQ=dw=?=iHmt&bNP:&9iZPjA1HCl
DT5\?S +!564S>!8hauy*T$5k4lnm>9Z$Mc#9#bnt8twZXV?uw^GFm1<c:HYa>mcEy+?j8PG8e<5hA:1@=V%!Xe
+CQBVw u@h>wVN\+?J1&$e1e1@qiJ/u=n>:mH8L/=Qt<AEj:$n^F:+H=cCC:LQ6#n>lD\^iu9d\%btByL@b*j56
CGTcul H6npe!HlG/+#dKuN$:qCRGh*9%Kjy&jTlQ:p>Ndn^%K/#:1FLFbE4VTZ^=$cPY@^qQ+cCSRhNK9@FRRV
#6K&SA lqGE5tld#<bTSQ/hNT\mI/9h:LJi1bl+S8jK===?+DY8NA9G:#!8a!:h$TL*+1\Q*Rw6qK!d8uZuMe<%
RQkDqX !dCDEtA1GjP/iQ*b*S%yE:9myVDC$95JH!S$@\YNj8<WT4Ppu*BQuWmccJkW:j<>1Z:mQy4F!pw5m>8C
#FS!#k u+YDu>&CI!L^<PH>5jcWiP$QThpHD\98n/Yp$>LT*4bXV?D8&Ktpit+QjSqV=9<Ei^L+QMWp>k8<8+LE
iWKhRV @<Z>6PL?*X+<Tk\^tlBd$8tLtm>@*pW8cQE=tE8MKe/FdH^J&iGhQHYWDp$eA\+u8\ei#\C:aPwVtFkB
>11hR8 HnTT4Kab:Qdp#SeF6tmL6QwP?+=Zc6lDyTlCSAKhZJ&BV/L+VT\R#t:XmVhb/cY:Zy86^D%S*Py!IHj\
Yit/Se 81AiM@XVE8cPiMa/<K9DDX6t:Q!G/Qd&$=dkh!*?+ZdnIp*%QlYGl4Y@ItMPN+8e+Y*Lpu>$mLIi=8Vw
^!<#KH 9<P=I<6PFt$WCma&D?c\pchJuX?whY=NYL?5:^MS%Nph6#%e%w:>qH8LacWDXQVFX4jp%L4D+eQFW<=:
bQJ8PM NCp/kq$pQRS+tC%FFPP!8&*tjQ1eudmycwVF#wl+?W8NnPjIl*qn:it*dh??WtPPEF?Tq%DSq^ppMCk:
#$=l#Q 4ZmPtl=IHtB5<E&Z%5Q@hjynw6n%#&TT*X4b\jjH6Ljj#&G:ETEmKCn6^MF&:?+utlc9FZ!WkPk\Il#%
c9lDIl VI!+VZ@<8%tGD!njiicXZpqmX@LyPdaN<:pd\IajJphml!9u%R%<\%kkXu5@!XPV^4dj+udGNbZ6Dce\
#@Ih=% Rj<&HN\<qMhuPET&E\p5$m>:l&Ld9CFTHYdV?Lj?tV@iW\G^yV5@6Ey>hL<=<d5:&JLq&?%*+ZWLZT>Z
98XWFe >49MBSp6lBA+Y=ca$/abw6cu*laWWLc*6/epJcXnTYhKG:8=n*>NT:V!T5PaSB/ZA^4Q#u9#I@=QXa#!
wPJkN? Vai6G/8H5yBKDGW+li:PJ8yZMCiF#4<mYLJ9mmk>%@wZKB9MlyGmb69%$%VA8&W5K#qGwQ$6h?LdI>6E
mTjmZe %E!$AM@RBwuci5FD!9dNyCS5a:hh>@/mQ=QI*@*WR9memGh8+=jb*/ZA9*BETwpR/?!FVBn?I8ILdt1F
6&Re4h Q9by$jLyA?#AaGtMq&t>miZ:C1:Aqk!6Zu4CI56=+4ZEYaEdC4<yQ+CBF4\6jI/XlhhaRFYKJK+nyKh?
44>D<> MpNZ#//^k!Q+EN99FA8TMc!w&L:/?H91@Ru4C#9@Qe5kQAMKM#5YchN^%w5cel+S8bTRlGlw959e@P/#
YJAbwm =<Zm:6c<y?D!p$%=cnHG!W:ZE/&TkAPZ8kDB*98:4Zd9XQ56h9i*D1\KB@:w+JNaq#EYaXulH#M<nGqQ
m6MAil R=/\Y/:cattP4X/!VMRud9KQw+PHjeJqYbQ^L*5dyX5+ZMH+N8^*Qbdk6>nnqW4SVmB%$a8:u/m@Wke/
PVR:8b \htjEBDJcLC&HCeChh%Slm$J#l+4c+aD?:1qym!MYMkjw5EAFaE=:Le6yi*CK?9yY>>=m:u!mjq/Gu/N
IMAKS^ dT=Hkw/^jPJ?#9duLlb^Y\$QHq5*NT^um#\5\G1Mq8TX6?:uSC69@:GipC&?nMI\ea:$E+*uQ5bZ^qeM
RAaEqQ wETbV%VK9G>/b+i#V6/j%FMySSG9+Yl@I<QBCiRqVTILTH9:4jAwEPi^:C?el:KE694mp55Z$tCbGAke
blLubZ BRGRJ*ntqq^Z!hTB>jc!m@SbAXAC9DNep?tRd!p48HilYGc/mZblXA!<j/mPB<:JIe6wLyEdF%ed>#ZC
An!5Bu +cVL!Z&#iSYA<:cVKZXHtC#hH#8k6><9!n&5uh6@iDdhwcwXNa8q>bq!@tVPM:uNac!T<&ELjX5l?I>N
XBZBdp =9eEt<<ZBmT\ZlMVd@A?Hqk=<AEkJb*^mchFyN\&qG@A:tZBG>bDVu$q!XJ\<*Mp%@N@$mB/w#K>1Bjl
\4CNiw F&ylT1a^FCL<@T\1hE&nF8M<=edVCa^MhAQ9p+k<?WPmScu5btb8R1tWq*+S?k<TEE<9BT4Y>&88Qip\
Th@>Tq lDh%PKbE^ny6\V95:I#4V/VdQVmacL:k&C\lY?DhmCDwZ\jHP*!?R\e=y?B+>G/4c\+Yj+i#SY8EX>u%
H>4aqY wp%8FGt@a>Qj=9P=qEZjA@?Dy8PlaM/H#>ujWb<JSMHFT+LP4Paw@M^5EKITiJ*?bhJNbi1MG4p*SY?i
+GZc=& =t@8::!Yhl$mpZeY@ML$FM@VTimT5y=N1STn%^La#tXLNcQG\$tY#=>TyXu895SI\KFJnc%h:h9kLY\Z
ST^%+J GNFV5lcdAuV=h9qIbBebeuH%JJu?qiyDlKZ44+u4yDu@dcQ$M@8J&YCP$<*Q\:qD!qtj5YPASb=Et6yH
MThM@l ElS4l/Z&9Qq5:8B*^GejNDRDS=/YdRwLWy+jTI#SqRtCD<eZQJkRq!p><aXphu@l%jM@wF6$9Y*u*/hT
W:W#@! 8nPE%T6aLaw%BVH6/Sw8hlbF$8*4hWV@84YQSYjF$8<EK$Yl@\Y\Jj+\q\uG@S^JctIF?>!PG*&1J@hS
wbZmGH G+wC5XNa%SiqSulm?j9l@Rq5ain$AXe58:q5eC6%hQI9T/\mi:8$?D%@&:^p@qia8<MjuL?8P&!yJGKV
&+HVD# dBYdG$4aA989:IX>D4ApFap9*cc?@/+*ZQ+y6pX?y^a9hlweun<ESGR!#MXiZpE+pK^GKXjQ&:8ue%nt
i4ZtN^ bHd\uN9Eh8c>D^tXTZiSmPDD84tWPX4tnX#&XmImKkK#+6uabnCZl#Xce&ZRj9L\SLWyti!lu<=9BikT
I6NQQ? @HkwWPiNd+ByjaZ9mWWApBd:h?K%\IEb?6ywW11JG$&QyqIYcX+Zud9S&EuQdNZX@?K>*bWMDKZFjDDq
+lC19A $ZekL+MlMeyFB%*5NDqqHja+PHl+^Y8bp+M*pe8Y>==!+GwCh#Ac5wGh8yeu@nme$V8<W#&=$I#mm!b+
#y=A=y VqQi&CbYGXw/adWlh9^TTc*YKV89p^bh:D:&6cjM\NupCj+BQn%T<lq*mpSiNymhJ4D6?%NuhXW9EIu5
KkMFQp Y*KL>L*qFRJ#>S64hGQ?BSc#^4cNH5wF5=9dwnL/Lu\yP^<:qp\8t$XmMpLM/IXTuVS^tekVe*q1mN^X
V<EN&u X*WaGjH==J/u^B96a+8Z@1*h<P<V8uZ*&W%6YI4e5J@XQS^\wYl6K4JTbcV?hJqQK*AHl*64mFDhPQhP
R!mQ:> p:y$c<VQ5&bmPZe>u:XAiwe9:m?jMtaF$l+ibNQL9\\<qPX<=qyTXZlitj>V9<c*y=?@\/56:i%EG/X<
^M:wn% Qh*QKHh>WK9J\i?aqaaDy^9#HjH5HWEqB+t6RGDkT>&%SLKye5bY<Pi@PDA=4GE1IZpy$\YV5a&>5ZSS
!M=#*I YAWi<Qp9Jh#Hhbc\8PS\jCQ$:I@n@C>@$*MY9%YNj/db5Tt$<DqYl5*mbPu1iC>eXjayy59<F=+eLy64
A:A+pJ cCwpC*SESVVNHydcm@&RJR^d^nh+cp&J4bp*tTbFH<61qGGj<K8wnHWD!G4\Jy>EJ&?Sd!^%myee+qtR
1*=nyY :MyVm<?GW%Z>^RpuED6\yT6*d^l:ek=@a6FeWR/ZkyB@ET<>F&!a\Ty%^><SMYZE8it*:V!4&#jn5SdS
k&I9&4 <deI%/i5ch%ja*b<Vul95!#iXPn&G\cYCe=Pn&1&WET=uDc5tRe\B@Mbhmi<^%@YEib<\uGwD^yi*6CB
HBI!/> GRkHqFw:jH\h=ZVK=$NytFV*aNB*&mdp<#*Z%%nFcit@V%u*>Q%$cS*u<N51=y9l9JGCkteXeNCN:GH%
6SJlhy DC<nliW%iBI4k%md#T=kMi\#A59<@Be*uDw/MP1VJLuEi4$#pX%k=V6<#c#Hh\yqBjD!$/uI!8yl!$n6
@bNubR 5*eubS?%F8wH?iTWnw=5@@Ec%5b!TbERmN$de\XWTEPBRpAQFd*i?X/5+:q9awuPtY?Bn<tttj#hcP!R
FClY<^ +iEV<81Wm+^\5>6XTW?+!8FGY$*@whDT4i<wVdDV>I6>+Fp/Acybp1WRaqK=Hu!!L&K/>qy@dV:B/jiQ
bb%CY6 E&=^Yj9^Pd&NWJ6twSD49haR:&#D:=%yYP9:Vq:mnbPAeXF@<b85*L84FQWpZaGK>mc#@C/j^LP/9!mJ
P=@WZy <YuFJ#V^\aXy<KmD<T#i+PHcnk%te4XwNhdTFcQEGnAJPFRwJGC&*cZ?j8:GCI5$4>/+PZM9j>@a/Q?e
WED6^d i1!<6&P=<6<TBmR4j<?<&LE8Kjc!i=bAw\jYM9wpcMN@9aRXRHjyQ8ad6?QGCTYS=+*VFACSWFXXpJT^
\\6hSt @u:mt4yEA&eWJ/:<uVL?1hVIyGitWYklTNH\EP9lB?PiiZE8:?nt+\Z=Fb1VFSPcTP4WS=Z>pGEy>YG$
C&Cpn/ J6QMIewT\jEnJMwNiP!u^^:Ma%ncTe%Ri4HG<G85EF?4p%9:G:ej\$d1h+hTH\GE#Q8%FLlC#ah^8$H%
+TShBm y:WEi6llGk9>=>&*y+Bm@^8+j/=aZu@T1?=N/M9$L%88@*M/keJQjq9uy5Z:ayGwV=%=yh:e4+d%TJXp
bnRkuN FV?#*eintPbJwPMbYIE%HW*/9wIlwNcaLC#%Hue&qk=q@X!DVF!16CD#R=!^QPP1%c^S#9L>H5w%Z4n^
-A1XZ> 00061098993001202b4 Page 424 of binaries2.zip
AIQ9@@ !CD^t#ajF9C\ai$C%inh?Dp%m<HuwBkXb5=*>nFjK5GLYdJ^ehGb\nJ6j$pw:GJLnA%4Yp:#N<W%X!j=
YI\mGZ Ym?qbANS+I6/4J8e<6@WAD6T?%\:X#hi%MN@W/?dQZ<@pddS91LeJLY/l\uEcTW*CMAb8hu#N+9eL8J@
Mb5SM9 >9#>F>5+m+Gn/6bX8lPAARJZwMj/BB>S:==Jw>+Y=bYGYqB\QVqVR@6wkP&G!&bC9Xe</%d=@@BLHWwM
q5+T4T TnWtZ*5B\$?@?!*=#hkAjPNjkb&/JX=w/NcqJ#BmWhKit4A?9*QLJi#FRF/CpWZ<6Ac=B*44@SGMt@Sy
tMN91G y5t$qb9Z<DnS:PKY5ERWJ8c9=$4mq?6$/CX@qI!!L%9FJh%\q!\I5k#5R!R#?#qeBtdp6<kZeh?6HMqH
kAl^#C 9Pj6ku!bL:CeCkQ:ZkDMGL#euu^@tP5XJ<Rc$+V\5%<\u+=nX*Jp?yD4<F^#IIkb\yuSLcSVk>1mMe9e
uZu=Vi PB@Q^EA9PY$kX/T4LMnDK5RRQ%5JBG\JDE+BWGWyZ*HpTRh!c*IHMAPmq4P*i@FY<R>^/m>QNBq1CXVq
%8hyCW h&mPkZ+%%Kk#>#8&8ABTVRWZW$VZJS6Ice5p#N:#CCV&CdZuW<kp/m<tle<bcqVJt9nCF9huJP#Xu8yi
jM:FY< +E#\LXWt&^blBee>RIK51n5i!M8aR@p&iF%L?9q8iy&JI^d=+SWAt/wb/M$k/CWA9>RZqW&SadZZ$Dhn
P^d5n5 6m<<X?N!=4I#G=ciTK*IPhC+@=dnuaYhJJMSq&@Va1LJH*@Z$R5\N&d?Qc8b%R>B58l*n#a<Hy6wbcR>
R1nKu\ ki>L%/Y4/e%umFeCBG#*AayIGba8eZay!!4PV61Mp?SCVyXX+d=CC^@Xy:H$qI4QyV=SENGdaZ#6Wc9w
^Y@&N6 /85CwW9uNdnFKLIZil#YQCXP@$bnQ+I:n91L/5nFRehu&k1cmcPe59$>4:>n9yk>99/#:NuKQN!qaBc#
\m^pD? wI@M^jMBh#=Y@Wy\?M1hqJLMG!/!!N?8C^!A1<Fu*ce>!BMi=PWk6L@S>^:!WB!^J*m#yYm=qG@JFi^c
I?+*<y a*>6ZlDIl#*Z&EaiETQ*W^H#w9D6AKu8SVA4t%pt1K4S@\HK4/Ay<!1R>bNdT?&dVc:!RZh\/CLd/<Gd
9#MiAF BbS=#c\ZATGkC6lQ4?Ru=XwVpac6+^kVbTuZ%S&nahXVT9c5e9!&ph@m&YB$jcmC4X54Bc>8l#\6M$8I
V*/Id& uNRm=*@Za#qEM16NdQdqhPFNMb<%XLMhZZhyk%uKiA%t+\JAR+&?5X:uLMkDX5TeK@^dI4\bkKa!4BL!
&9>1Rk 6VqYRb8A:jk>PQJ1A&4XDG=F:9HDB!D\CXj+kDJ<J$QGJdQ<ckp<Y\VM::>BLG4Ac<54e8e=+ZEc<Dpc
*$timh BQbtBqnV$%yuR?=@8RL/kd$A*+LP##N\DN8GGhw=iXaaL%M94cm4<BkHtDl?ZM^Qy=8TQ^=WlG8a1MYn
=MjP/4 Z4HB+K/=h&8LRM?h4dKN=w5Him$N%nBCSCL%<>T@6?Bq4:Ti:?pn+tcCQRXC&KHRE@AP:bpi%Du#=qep
jVPABM uZ=?!*=?wq:uJenDieV?QiV=C6wG!uc!iKtBF1P*A:!m6L\Z*y/SZ:G9j/+I<<T:6Y\MKeV=6WM9>d1u
VJS%eE XZn:+AE^aY>>4Y%AQhu5Jwd+u4iSG\/htNqnA<1Wcw?L?KyJI5bqd:@HWhtqVGB@1BJ94CTw/5:WeeZG
9+jWcF \8SX<q?%eXH?/?hHSBjahMGHQBFC45wn#:>B\N1YpytkTZD8%ljEi6EF<BYwB^C4JVNP=N@9#u=/I8eR
qD8DpY =kY+EB=9@d\&\HA49Amq#Bc@a#uJw99C4@Z6pW>iV/1i8@n&49hCJ<y=QRT1pi$<^1*p#t!:B%p^NIce
Fud5^Q cE^KBj^G4M<mJ9tln#ck#tCR!TAdc+CMe\DaLRC<DJpH86y=46<TcDV+:KEhN*ebnljy$9#PW^ycN>WH
+K@>TP IYlh>+\EW5e!/>@>V\8C<ml=inmjhEjeGb8%jF$*F1I<!#jGRm*>c1Fe!6tC*P/li5j<M%it^DyF$iZF
9q8<h= lK4X9*RWSGuK\D&9?\n4\k:h1?6dPw/:w&15TdStq?XZ*R?4S?P=mq1Fk/i?u?*5eLqh9lH^ItyRY&h?
+BuC?C 8B:lydD%I<F%+/6+#ML=I^1yW8u/5b!H\=Bdq<>LJb^IwLQ>c^8X:l>*bu+cGN#qIq:^jieh5&pk$:#^
>yNpq+ MZ!DYb>HkuBKqnZ9TN81n#8uZnNaGdX$XIhcdn/RAZMlh?9kedu\<WS+\?BNuAaLeph!+PYP=DERAyRC
6ydiY6 de/Ljl8BqbyAdtaQ$c!9LiVcD=ACn5%VG*#e8D+#QYwmHQ^WTSNAkAqVMT4WGbn%bB?!<D6ClFR^qnij
>N>S&5 SP>51b<=NNc<1jZ5KIHy$8N@#L?6G>dnXD#YEJ5@du:S64qWF?B6kY8bM!bcCt\AtXj#!q4hMb%G#<MN
cp=RJC :QD#RQ4Vd>t@dmVdWd8n$?#G$yW&1<5RG9MBX1H$+CKV<l>uDB??/%b49h?m@IJ!uDNX!$S@9jt@i1!j
N:mpPY V\n!&B8=i\#9eaZQkSGLWjA6pA\VBH\P8V=@$%#c^@YejBDkn<lZVul<LYTGQF&JE6h+pCjTMSS59Wu?
b^k\aZ ZP6K58ewW4S/15F@*6@6e<5?Ph4%FuRV:GLVdXD+N<aq#p4^i:Vu^L!4JwY:%ZDm<<XW%h/Db#%jE98d
#jEF%P M+cqq*eK#HeK@^+G$/H*C+h6j8W@HuWGVQ&W#yWBnCW^ylADAV=5D=A:BwEAhKE%pFuY4RRRHD1?Kwwi
b1Zc%Y J9K$HpP%^#mky<#Q:4>*?eP6QFp5j1^<Z5M4R5P@hP+\@8d&kWpq&hylBKj#%1MH@ByiCWQc4^\$by/E
!DL#SW N!XiTVR=w%a#@Dq<JHEt!8pIPDSRQ>ikX<Fuk+kFeunu9%&eC\GwaaDMm&abL%N5Du/JA9cB+*ViCk*b
@dPK:D i5lZtRG=ANdZYC<RPBH?YuXd@&QEN=+jd#SLu8jPpH:Q9m9H>1E/j$q>86AK1q&u9u4uQAF<BD91R&%k
%^jZE= i5iV/EeJV\kQAKM46AN/8HJ^/q6#pi?$jVY8Bnw+ZkVR#M#\8tT/PHNF:J>lIDpA&Aa<&A>B:JCj5X%1
$H:<\k RVJL!keBCAa+Eml%c!Q9\jE5l@VkutQ<YGXXA&6\:l4?wNSp!$VB\p!uMF+a@!AujB?kR6VJabAG=$>F
CHTAak H9yh@9*Z*Euj*5l69e9:?QZSjQKj%<AZJ^1LCKW!/S>T=Qj*T*/+j:@@S\M1Mm@j!ZJq81%SY6#@M*m?
cqtWkp T@G<@CA4/8tRnPa<RYadS<\:H1?RDISG51yZdH9X$*5WnZ&cQHSyPXqkN/plaA#w6VaEjtnak1ShL<=T
i?&q:W EXQ<WF>H$A#K?$nK%\==:I\<#D&RFRAPbK+l!@GLtjBVL*Rlwnj%J6I4uS!?k=EB?ju$Iw<iw!FAZ/I8
>t5*TP l9D4*qDIE6Dhmu4jXwd*SFYZWk<p=jdp&$Qq9WeRL4?GPb$VCQRCmI=/??yhd:ByH%jj<q9$b=ZEF+p9
wa8I@J M1SmG>4T1DT@I<n\%5n%@@Iy1<T8aqbC+8E%X6Nu\qt6=Xk5H#16K%:t+1WHY$8SpDD>#jD*jPV9uB<&
1PKKIK KXPpL?IThIjeXQ8Z@b\5@Kum:1HcF/WV5$hKmkc8RT>Ala*cSKuDZZhy$BkwmQ1^\c/ynn\juJSTX:e4
8BAFbI TB&HiuP@&=95BcYhy:Sk#@ehGBL<91?mj%<?:?L:tSACwRF9BKATDNARS>AiTQw!+EpAWpMR%14<jR1&
5$MZa= =ani<Vq&=Ct6haFIiX1:!yAmptP6bTc$=RTDVm+l:LDA#AS>hql+Jy4!i!k6B&CeAd&+CEN8MWC:@RJ/
HA$*@E pah<mMtd*>N+p@4=kC<AG&CJS@L>*4qjIPi*nKaTCE&<:CPeQL\I&HFiHTaJhk4heaX9L$m*k#N:Nm=S
Ai8<P? V!DkpEG&l&c%N16SKM^VeGddJALDkIEjS!LEN?cDQICQW&VR<9KJAPli\KQJ66ltE91Q%m5X6F?!qm6k
4=jMd* X&immJW<dl&YH6/RPD@mJ\%QiR8L1*5nYh1Q!PAb6iJQK/CLCS1K1l%YQ?\1/$1RC+u\&FN@&IFE4RQ#
DdtyjE RGq11PX^<iYXhAum*A>c<1Z5d5MdB5L=*<PBc%KX%yGduX:EMCXmD>BV#Sy\/CQ4mpF8m8W@Z*/:#&wW
eh\SCp 1IhQnT?QRXCl*Vn=j<WZu\lha?VJJ#EMpm&aS^i$b!y#@IH6u<NcMn<#+:?G6VcbmiP6<Q@WM5t\5^qk
Ac^T!e 5l@1?YMkYpedH/hil%98E%BVWc$CcM4aQ>6iPA8M%1YSNL#k%eCpX\Ka4#=D!H%Z^EVt#T?P5MQYK8YQ
JJq8BJ SVkK8h/ISPyhA+9Au9tC/<dpSydJ+MA1J@REtHqD4*A?@QZyRXXi\XcepuX1cquXe%@u<J/pVkR%ZDl:
<ypX<J J%bL%HEqGL*q\c4!1JBWJLeb>wlic4l\Pm=CTG8:SL#1G$%!jX?8y@BSRdjM$RbceDYY=I5K?8QaSPaX
1J</*% =Mn5P*mL/&<hhDFDJ1qbGuwVmX<@CC*^lAdARFtNQy@PICiN?k6Hk>jQ4@PpjBcS^*M*cV<KMi+JVaDi
99WS#R yHpRYA5F4AJ4tbhtMyC#n!#VH1V94t=4DZJVn**I9NIK>Yn*/=ZjWuX@JZkh*nS#GH4!4T1h8yX4<Qmn
SX+X#W mVmq=HeR4e1tpjjb$jn>*a1pn$W>iP1*FA&>CwulZm^l1DyAmwF9i\b%Q?n&\p^dA=XnD>N6<KAQ^YkR
?Vc>19 *Qu*u<j?w5MFpyYLG1NyAYqNRikIPSbc?I8L49T@9%t/TuD<upc>CKL9tI<c8kLjY<qD\#FjF:8FHJ$$
e+K>kn IFTk=I8V6y8AWLPLm>1d1KW@!6D*#YB=NGRu1/auiSDVjp&A<l6E?VQ=?a\m#?W948l8$5pw9CBDYlkN
VGtpS$ P#Fn?^I^5ClhJ?Q:kkGM&q:RP#56am%Tbq&Wjm%N4:?9:KGlkw1TNVK?P@/l1tW#d%b=+5HnaN/u6\%:
h*G<wC /SL1VXl@Z1!=FijRTVm<i8/y?FGpq<tbw+tetyN!%yKYV@nMHd\d5P+6D8^1iC&!JZmlEm>SW:DMMaZ%
?+NX^K >G6JiB\D@A5@9HYnj:G4>\LIA*1BA!X>*#n#I@JT>Ge*^T=QyyBkmBudV8#64%*mqA:mCu#GRt^8p/AW
hlQC1W !H#j=@#q^P!GMLitD1bSccEP!GYt4n%bqqtD:TWn*np\i+GtDWl<LIb=a<PWQqXwqB8\cm4eEnVM5K<a
FeTZI6 di\:B1PVYtRZtw<iHA#dP5&jm+^uci@W?j%#BDkT/kY8TM?a9W+G8=aQCSGnn1ANnE^WB6c4&h!Al5JA
lK6\It HRD+FLk+V5Td<5pHWJG9=MYAmp1h#W8BQ=K<BtLmK/=5D89P!9bN#t*81^u&c6aQ:nCK61aElVna%cXQ
MacJL\ /LK+@LLkhHCVi8&9^jt\?KI6j@bb6IbMt<=4B%=$NlhklJEV^%/bSlp!SH=?=ckAbukQAQ@DD<&GR4WC
#Xp?HB bNd=PcBw#ActHM%&PZ\yq8F/6AHW=?PlIH9ndb@pND=yjHwy+HXA%/EpTuhRQ*k*Z^S5?ZBM!uP5>!Zj
E1\eZ> E@EQH+G5/p=k!HXKD#w4A:c@PL6EdCimWIWa/XW@*#uA4BF/jH:*DNn=%B9k?AtD%bMh46jqL:GuPt!N
lt$JPd ^+C@JQNKbc?6=<%iG*\lBDFpB11V<mFHnA/Cc9*<R#QAXqjABi\*iBb/VZDJhwGhqE+NR4M#whql$Gl?
yIjtb8 N9=MNmp#WKYW#>kX>E1/aF+G$*GXRL9Fl>lmSt\yI4c<>\TXS/IPtRHILLAA>F>+RCWY^1:NCQh^@i>+
aRIDMd jt8K+/M%GH%5++\n>QZD15VjlF>Z!c15Q9q^QKAZi*j8SV%=j>8S&\>=FiFP8*kN9RK8FRcHmclchIK6
-A69/q 0001da01a4f001202b4 Page 425 of binaries2.zip
^JmRwJ R$VN41EwQPp$!Zyq&LXjRMKXu1$Gc>EVPj<!^J>HZZ^h@K9GL+A#tLkHXDyijl5Yd>bNXRP%A:t\mbh9
?/t@kF qQyEBn8QGZ9eheq+*ZX^qQLT&bV?/=I>c&EM1=V/:pPd65:9Hh!*mD@pYJTN1JhiWPwBEQV#NVb$>=ai
W5V=@Z %A#RGqTFbZbkJ+&ZmLpNiA<=QP$%QG$SQ5R=CklIJBHyakYmPBP/i+EblB1d!unKkN>iwIeSb<w*:*mp
+11#*9 \RAP1qRNTC#MpCp!qdHE!JTC5A>eXZ6hu/P>L//8jCBI+AkRl%FA/*lNIHMPA\FuQ+*NF*+KRXmqVlc=
:l=5:\ 4&^qG*4%Xd=^:w:hi%&c#V6PjZT6XjdBP#&NbmD^$Bj&<6en#4Tb1m>Hl1MTKDH?PY>lFSq9MRH#LQRl
VcSnp! H*ibtRX6u@t?BWa&@jRVM*XkapYLF*Ve=b^QZEabqj^yc\m/%R&=hPMCu/peuTEQNSA:XamNKMSpGNVu
/LRPQM AFRw=Z%d!9eYey@#A5kCTm=#q>FH/h8RLZ@^#/a8!HGW^\ZGDT@//h9HSKlewn4XM54hy#>LuCDB=Fp9
h95j:& Gd^eQlp*&%CiZSMK9lud\J*4<9b8ZutB:>m<9=iX=Fha#9X=IQ9hGQEQS>Puh%IBYFwY\*8mZ#P@hZ++
RW!:WQ j?h!&E*tX4Ha<V89EFm%i$NMtmauCpptY<*Zi#TS<EqLFqP=ZXc^?AQe:BqH&nHmIT<6=@iR<lyYk@An
hkNFRN tPneA1+ENaM59p=abI&TjJ6@j!%yL6ZdTuY^Ie&NyP@DG$uZ$jD<=d9ShEG:%8GM:ujY8Ice+nSHB8wL
QV/59S i4NH+tFmFeH@h4IBAXum9E<Y4R!bac/1:<uiQ9Xj9P!/?Jq*DHqR<#LAiQXdaYI#!BKmehRt:=&/Q!FR
IkY^G: >K!NhwIZmED%K&\MRcRSJ<!RI^J%&HZ<EkD94aMQQwdQbCQk$El?WLDZ8TJ!u^?^Dq\BTWVdLbY\8AZY
&LPPi9 Tj9ZjWP<$>K?<EKj^Hq!%SlQ/:8DwpDkH@>ByTiZpn<!4DKyu>*^=c?XnLy?R#EwB6mud#AueC5a#C=j
?4%4h$ c/?juV^Z9H!9\wdp^hNqkcM?t*&q9!5#t@<MJ\<GPG:Dn4@/^CGS9&>C:%d<@Acq@Qd>@D@+BdRmV@PS
WGZWAT /&+uADDR:AN5:&$mLaGhI9mpA+qHw@J#qctw$RDECVkuTPXLay>>Wu%=@8n9=ehjK9XDiV%ZVHph//#@
Md/FZp uH81Qc9&=F$lB?Q<HE>EPS?*\FTNq\G!*ATVF=jQNaQ6SB<+Q^aID!H5<+aKZw156CbEAZ>bwp%akF%?
pn!Bpn ##Q<:*&LGC4lPw!&lp5=cM%WB6jQ>/@ZWe*N9p%Z^lhHhJi9MFGALRDhPS4+5<SF1\<:y:&t>@MD*+T^
6qC\9j ?C&ChtSp5Kb\9NE*&\6ND8>ykG>kJ6E\i*mw4Ka#&\D<9y49qjkGBqIDT^M5k^#j:^peQH+h&!Rndy>p
RMHVp@ t81EuEXR/F:BM>iY$q@4t%A1Y*\4/WA9>D^9KZNZ:B\!VhZK:8m9/6/jtc$Ie=VPwZQRb+YjFMKMjD/j
>V1LKn mkBe>8QAGSeCFVCH*Et<YjMyXSp/t#q<:R4QM=X=E!CnAYSinp$$:JSj4X++IR>5EKPbwLTL1!/9<%6I
ZwNEV! RAM/+Pe:+HWJ\$DPDqCbD#$*MnEip9C1B*XKhWNGi8/Td\\d$l$FLqNbB5*+J=<\M!@##d:lhFe/e!YJ
#LK\Vl KZQpD:#9:9m$%>pt=Hiy=Y>ncbYmJwE=1cjy*h=QZB:PGJ?SNBI>d>4K!#Pk#=<P<eiV8qetbD:>:5K^
ZKi9#S TbVy8eQA1jE&^$9:=5uuh*P5P&QVW>#iMGP+Jt6ZDZn9FSeebh5CW@KqS&?Aja%EMNRGA^bHu4Il$TC\
8QF8*$ %RZ/GDENRIW&wNw!=bleRA8RXWq&wDEwMCM>**F*P!h@>ehVN\XuabZJ+hicVcDXFjnV8!<84+*B9$u@
6JNG1: B84nW:S^&$#wu5:+qQQVW+\WwCdiGh:4yhlu8CZ9!q6GhdC>=a*jw^!LM$#^#JT1Nw%?RJ9546X\FHK*
!iZP$h <V!Aib$88cdiY%dN/5Fyl@H4HeZR\$nhI:S<?W\D5InTcH>ip+kl@!CNQFw9&KkVEiq@6WJ*i&D>X/Q:
5q!\9D 98%&4Z^Tk<nhk>ah!ac?C>E%%PPET>>hH</tE=49m/?E:M:TMNYZXa8Y?5uh6/>mje:b4GB=Sb!dyjm@
?R6%N: S@I5uYnn%=dyqp^IH&#pHD:RejTtu8Fw*1*H8cR<W&5:4uSh9A\A\jb#u\ta=i4RVAL&d+pMQp:WtlA5
$M8L=t %E^:uEY^?+aYGj9@IVa$QRNduptFHn!dAFkG^kSZ4#JYT$/cG?P=iY9Y=R^5*>S$>e@Hh:A6MqDcLJ1&
nASj#? i!bX=^X*T#YNR9@AeQdLB><1Bbm1W#lm+DY\1/uHtbRE9+%Ka*iiN+X*6!6+QiRPeJ&:i^atRM^\tjLR
M1ImJW n<qC>hA<PFuAw*Ny<QiWhaC8lJK!Rd1=58\GK&<MM*LVM>M$>An!YGNmqWm\#qm5TZV&IGZLZ$p/=@#X
8VXH$a ubP6a>1N+b+FB4@n^L54JeT9pA=B4=n/X$#uV#PmtFd1F@*:%qLnq#jQK^mii>4hih$CBW1JTIF#CA1K
yMJSV\ @lGbanh%y<XIVPnZ%WERwNmT^^bc@ApR^VHpiEZ!?LkS%^iI&wu>QQwR>Q$%<C4+QY^cqhVc/8@C%MeY
AaZLC: !4*Hqd!Jb:4MV@d6u^*j*w4K8q<MR:mYkCwG?A*9h:?5jKRE=:\aCahhQZLiKGi4ANaJnnc>nn\8$H5w
E8awPM DBnqY?>%9wp<@wFE9pSD:5NA9!G\WQBywK?wSbGpnPEmG\:tM<u=KHKNGuuCln^99DlHI6iHd%b%kyhw
kAhWuS kM1QnAB!+AGATDj%>X/F$W!GHAMBNH&#NldZDl:LD*K<%^RiqZkQ=GRHt*%WPjL/6V%yZ>bE@ZFNt#%F
8WEEL! <uXWKbQ@G6u55@6=Qucm+ha!Cl\F9:mjDQb<Hh?5!XYeLjq#!<V+<B+tF/Jd<EmAcWS9w\i!bG$L*1ah
/%y<8w &+D&?9uF?\WaISbh+cWAt:abG%tGnEiG%De#/JEn&4HY5w%9>lh1$Z@ZPFn#a9uAYh::?YFWL:?%=Ql&
6SjN\+ kY@d:R+e@nDicX?/^5c!!*6wwnHYmwNGI=MHQ/beaRP%?hJ:M!=4=ud>Hh&mTR:/F>+<X<n?+q%NelXb
e\+wm1 @#jPI8/^G=>+FQNE^i1tKHc6H6ypJSeX?qhMu:@NckHK%/1K4eG:6FMdWIeFcj8La>nF=c4ZiSu!TB^=
P/Q?/T hHKn=WwBG<^H\te/lbmQXK:@bmtD<E8R6BD!MAT^\+DAVn98bnlAa#TeAZck&?mX%EQV&X5uYb#mVdY+
XIA?Aw nwGN\Qt$V$BGSEdtcV<hjdD8*HHapESTkIY6nya?%?iiVQ!?WZ+Gip@d1#J\PmGyj5<hW?FdE#$Ql:N<
QPJ#Md E=W?PY45\Ym@9/Pn6@?$W8l?AD@SW$&9#P4nwnIE=tHT+%ZikI^$+RH#B94M4b4ndLJEbY8WIuZ!G+c5
qYW4\a 5e4I>#G4>?jd%nX:*^l<B9atIa6+t6YKSN/^5KQdS#C<1pRjXa%9weiaT/W>Z>J*D>a*8qReP&c9VMWi
Y<J\^M VM+1CbNEQ6@nHGF5#J%44MPnDM\dL?tL9iY!9<:V\a+HSWM\Ji9uGjK5L?lcVNnPC??EPB48yQk\m#dZ
8=KSq= 1Z!R@&!@nHmjy&lBtlcd%Jj>%hA?nM#!w<YF@yiLZpZ1%Fu*&1tHywcV?G8:65mD>HDH/e>q!1b8*pPL
/FBJNA GPu<DiC6Z#D1@!Vj=J6=+C4i#ZwNYAN#WD+JwE46#I+K*?DWAQh^ZT#//wkC6jZJ@>^^NIeMutEYqi<#
qd9BqG KCaSiBH+@9*=E?EqlpBDdpW6yB#S:lNyXbdZmE1WXn@11jB:WFT!1$ZNEu6>d@9Dkp9&5<5GY%/#J/Xu
G6eA81 GX\:%@!h:>>=BMA9EV1HS/5b<hh>X^wu15l>CGIPkMPWwZP\Ri^NA+C>th\yS\KiAQL:AkJDX6VZQ#<Z
:IIIpC MlcT*^FaVj:t=T#l<>9>Z@PQ?8^j?^yqh9S?8>y^>1BQQG*XnmL!LXQqim4!XHTu>jqh>Le6Fy+C\LVd
qlC^La =Cm=R@@+!8+^/in%ll:9&/#CV>+P:>4FtcP<MQwYXR@Ib&DYZhM</BVNa\McckeePPcV4:iqn#5R1FFT
^>eF^Z B^&@YXd5?J9ZEhc$\4%P1^DDGmC5B*6wYwk?*%@^:9LZ>wqHHm\nF69k8Sn5@G<>HLpNl#eXRlPX5TpZ
wXq*84 kIQVMEdE1WEj\l:l>WWNZ/d^ZVhuF^FmIHXu1YqckEKb\5@wRe=+Ve/uH?G9?b4*tG4nEq\N!C9%YR\V
pVCRVD >$*nRbMiH\\pn&5QhEnP9^=\d/q@t\Z+^A8^<+JCAN1N<6t?YW^nI@PJGZ<h%C^D&89mM5\LjdwJVI9#
=Rk^MA ETGbw\G8kwPVuy#n*D#Cku4u!LSJVc%wu/hSw1+duji5b@led5E5j$&8#qS@Djq#hMiLc*JY=/*Q^<9=
EJR8S/ PZj&lAH8pnLZtt?Cuw+mR\G#l\8*H&JtpSIp++e?:F\56R%8V6enHPWucX+YECGbBhJP8Q9$R:hukaqD
JPjS\L q%BMb*:FX*QIGheFBk^HdpjBK#JBuZ/?VMnnb>h5W4<ZyAYSq@\I>NKnDSS\:B5>?GqAAFL4S<+^t+/H
GXItH@ \E!E?*Ii:<MaN+AH#D?YYtLEaidi5Cemc:+Z^%1j<YdS&mPSKPp!B5jHFjdhN5p<DCLQiuHjq@q#SMEd
CweJ\h 4B+bNtil+RYXa%8Lbib=!&ujV6Il$<AebE*i>e6H?Lw>\\FkwVqj9?yKtu^w:Ke>!IVi>*Pww??8i8In
yVw8t* =/!l&<$^+1E8ej&?GcP?6Yhe54>C1cWBduySLR9yZh1++lFS/^Sc?RHbJiF?aeHiun+*mu?=P/lS*$$P
i+qih1 CJtK\AFS1>Vkd<CRSu>n\Bq!\?wtaTjBi+N5!t!kuB8Zdy9<GIkD8wEy9AW=i%\dJXiLNP@LHP#5J\+F
4w:GyV TEGYJK<bD5ib!+L+%cSTJ$@&Lq4<nPTqGSn*k/q+tcy?/lRN!:jTyK+=yJypF*lZ$^&J$*m5q*y=pH/q
4LmyQt jeFR/9ai?PyET4=hYbahGp>qM5hE@hRkD#mIh@//!#na:H>=hiYc?GH@&<X:@>dj8VR@nyaGnKyJkC@9
:/4bR\ GK>?A%tb@FTkH+*?SyDM*4a4%AbGSl:!91=FGh46=<8ACjnSbIctItc>B5c=96dBc#JBB#LTC*:?9$^q
:+ZjRB VBbp=BjA6q:ua<k4lk%kTc$&\dl@NM!CeQJ\j+E8!Q1iMGV<\%y8?yuiW&@H^e#+Z<&jDTqyCa*:a&cj
PqJ>lt 5pyNM$t4^Y=RTR+:$9:SjBc?:^V>i@YbIhF:W6XIXjqX6WD=<PbA\<d*1\11D@Qp$aR=>ydHTVuBSu<Z
mpA5KT +q+m<+dta8>dPbdGpV:SePa+Zy\EH+QSG9&D1%H44+BJ\Hc5tdNG$ZGk>RYiJCei@Y8+wLY@qqCTwM%#
byGQtp VHMi<MH9CWC&8^JR!^F>S/d&*b\ItHi^1?XD/S=Cy\dD>pwc+*1&JbCc>n1=$/M>DA^SQ\Q@RMmld@Xy
<R8XJT LV:CWI8eIWCT##=$:W8\HJcPJdS6FWT8pP#nj%b$m!Ydub8HdMCPM<WQi4aSA/F>MbtS<GeJR\=P1Zd1
kheb5i X?4D/XeyDh%tyj6NYjyPGbl8pibjeWwZyIHTVTRdQdCAEk/Y*QIQ1>4:86Vh1qA6q#5yR=X@M/9jLnh1
^!cVJ% :#c!jW9bcTRYd<kqRMASh%LP:+kWtJ15DV!Ayj/<j8&+j6IpST>h$&B9Sw6dV:XhD*R9p#h>iVe8KiML
HcMdRi tK%ywB%:IBj9ilbJSC:+nm/hqLT6QV%a8/\\KdYQ:=6wHWq%@$$/68LpXu?4&e>J?TZwRmLNebS&?:R9

-A4EA1 0003171184c001202b4 Page 426 of binaries2.zip
Qa6kwy T96aEN^nE8FI*D@J/dy/6mAw#ZCu/MV8l/RP>Ty?=6l!Lk!@^=FdQHPIT==i$%Q@ZGBjhE/C5N6TD#Kk
\ptB9J iX@PLu!HV*8hA4I^?@EMkXb&?\N!FW<+aT#?6qEDGq\/&@qYM:%Jbpb/Sj^MaVjBa$ESDnd@yaN+EZd^
J5uIEu +PB\dq&u4qH6!8L5/pjm+CTDm@1CN%E6u?LGM:W9/C5S#j^Xhyy#p$hy@SH8lZVByIu+%D!p6>li&QRT
c$nD1I 9Rqb/:i=Ky=1$MI5B>B9MD%B9+Tikp>mpmCuyD8DN?9DyKEjBqR*T/hhHAq/wZN9F6^wl$In&DR\AnLX
&w9VkZ #$!Y#eu1NwcNnyF?\bZ<J!:<QmJVu8IdIw<YI:Cwcut:c@/GRVt=Yb@E4@yF4:tNGZbMJDKdiX>AMwX&
%VDtMD A&>mMHWnI4&5Q8l>TC:&5W%JTWt%nTlPCm?!<RwQ<@V$mmRy?lEiWS^iqJ!WZPmXqQTnKQK:y*YmS=mN
u<*&Lw 6di%nXha^I?p!QCI!B@lpeuJKbEypWuJ+euJEV?Tm:F=<w?mH^ESTiE*8<Et*<Sma9PdiqK\iZF!eZFK
*MLK4b $W&k=y<ee$%G9He!Ma^cAc#EYZeX>%>4hwXtW4NaVdTc<Ki1?^DR8t!#dal*WRnMLu<jT9l%i<*bdF&H
Kipw\D =<X/wc8BZ*M$l\jnI&k&>%Ci&+J:Gm1jpDBAW>/e@ap^&c@S#Z5&SWZWqL!mk\1pX9M@Hk=whLyAJX8G
\/L&Xh Z?Y=Nh6JQpy9^@ut1%4NVjE?c8n?1e%$*m*m4eai*H1*#Dk6CDRwJb<9+8N1k8=dbiq:5P/BIe%PLc%c
5RXE^B j%q<1BKqhG#B!Kn1>P416??G/1c9?&!p%X?5+itw+e=5Id%pqqYp1Ry%/IR6mpbC!T^?uH^Xb/PTBM6P
!QLY\> /Rn48Ji?K@q=j>eiAubWZhhRE>INcJqbdy1+41mu#K5*?lNKHpRk+6?S+PGa%6ZanmapF&#ZdHETTLwq
mqJZ9T NQM+Y+CFY9#Lw<<t4PKpb+c*je^H&mk@Y59VWVJpd\+udMD88\TL<j/$qYcj+nBqjTDtd@bcYqFyiL1Q
JYe#Pw +I%=aDy6*Lc$SNdY5y!EQ>K&<jtB9wnEc>bYPd$V&cn\iHnQ\&?Xy+hjZTI@\Qmi46N>$XWT1?#Vt8pw
WpLFu= IcXAM=WNTP>5VF9RcnG>EI8lVE:+i*4!N>%ADNW*%?uWPnek+b+YX*14!Ldu%@bLZapaSi9*5!t:mBW:
hI1KZ< =jN$>tJT?1:/T!y6>Xi$TbiE8bJy@jt*%dXTH<a\mhl&X%tnq^BG+jmVaS4Q14iHPj%!PZZN65MG^e+H
:=kGXn l%<k\+#nj/pV#$m$Q+9WJ=:8?<$9JZWaKLHGejX*+8luNhWcnTyb#LnDctZ9KEpeV1tH5n1#RWn$$bDL
5C^?WI Ww>X9Gq&HP$RLMEyWyYuY4AcP1#!J:KW5q*X#/TdM:!kAG<6&/hJl!H?hWYt#i#p*<5ny*5K9R/Hjl\F
j15*M% Wy1#P/W%EwE:c\qiwV@TwYY5u@NhBji4u4^nc=G:e>VS1?ywZYn&X%9%BW9WX>q:RcuJqJ&DW%Y*iu^M
ZqY^Tc H4A<i@QShbHD!1I?jKkl=:qtdRycm%%E&9&H^/!Ja#X#y8PD>/^=QT>p#>#Va\ju^CJyPD>=GAj8:hW5
XANJ^\ u@6*MLVpH=eW>LA\?R?$#pq?YybIeW%%VZ4ZSJnN@?1>M@Qw/Cp5E*c:$4!LuGnH18LY=8cV:<H&>l>C
hC9Y9+ $&pCal>I/y:TmRkJQ64t5T&idSP=<=DG=^*4YtijbIN#BI5mjl1bJ8w8^NYiFbtBtXkXhhW51LINY#k:
LP/Pqq C%1I&j/m>jn%G>&J&n>@VHMKmp5k>VP?d+KcG5>Nij\Ih@1lecaFH<h%Ja4L/1S+mKRG8INM<q6k<@QE
FlVSYc u%9tHSV<p^j*u%$@jY:8XIbiRwq9=R:EDJ5jiEa<*uw#$cPu4$@XR5Q=:Xb4eYqa<*pd<tqBcht9Cti4
hJkun$ B%abNI>4<&JBn##@49A9LwTFQjPEi^<TB/@*9H=he44de><BVB\IEt/Kp8Tmj:Q$K::mk>Ynpm1du^@y
bbNCS^ tFI@9pCwqFK*pj!WSSZ@<ZQiPBLkd#6/cdT1awIYwZpe@ILDK=QS&=lZ+CkAGpWCB9ejL8*AcYT@$?L&
YY^N^w tI9L=q&>9bnVQQ=hZ<bFIhZ>PV8>X+TlSCdRS<JP>G:*R+@9qXjyJ1t/@XeVi<>KQSX<></BP?X$9^dj
/PQqSP %Ci?hEXY+q+%E%yV9+1AjyPk6C:4L/kedc:lyV*?iaYQT9NcpD>?w+9d>RluuwScuApt?Q#XEZq+WhqA
it<1\6 MNLGb8%ElVei6$K<$Y+Cb?MwRHyl>I&bXm:XBKn<94S/t5*\eSmN#Y8!?%AX#@/n5J#CW68SYjNB!/yy
^dE5Bm a&P<*jKLPGYZ>aL9Zkc8Qa<qu+Y?hSSpL1!PQ@lw<I9h+eDKcR=IJN9ZjK9uIeETT:jF@t9V6Y%/%&6S
n9IVW& $&iH<T*5SeDR$:=!<Ye9pTdhjbqmaG6l4+H*QqN#GAk+14GyGbb\tXPlJjiX$G6&XniS$5FnN9YubXAu
F%&Z%c a$tY^%Xclklt%qSMmWEVHKbZGA=c6M5jyqya6>BX<i>PMl:<NdH^5Y/&d&dY98!BRjeewq!mZKMkGIXR
w=>*\! >:#>cn>ClEqcW16!i8/b$+mGyd*4bCR9t5EtC*u%wASu//RI1mKt@>PK6KKmWIMq189BAE<K6*yT5R1e
cpDN6c lMX9KjBCi8AZSJn%b?<P%X1bS:Vm4ZimauJwd9P:8YPkX4j5:Sa6Bc%QF%MCXTTCcVTti1E$DjXyZ%4a
u\=NAE neK8>wk94>6R?PuVXAjZ:t*#KXR:b?n+#cj4S<*J8u+aG+ZeIiL6b$QYTb<>mQbmWKyA/WyPZwZZhmB?
&L<X9= d8?KPB9Kt^B<WL6NjnSXwZ<c!!@Y5+D6wF*>*L=ZYm$iN=QbPSLFYlBWq5#@qKaIXD94YQ@BuZ6kc\Ll
\KeYku /6=aTp6Bk/Q\li+1VulnW>pJjQT?wQiICuDJ?bY?:It:Zt6%VSP=@<NicF^ePDjiy\c9</+6lu1JSy/#
6aCM^j <S:9YK\TcZGDFnj*upPc/9t=y=YXq#H488d#YEED6aBu@AAPHkeEJR5dEZ^Qk+/:Va^=Ei%m1%KGAd9H
iEBaw> 9&J+L61\1Fy9Med<\DV<@1*ku>=H%F>%<c55Wm1XE=@b&uca>NR*N9*>?CB+pLKbyb9B+i/C/cLbLhGD
hA9YyQ C:VL!u&9I<m6enb<L@K*ppep^k1*L5I4Jch*uSq#TBmn*@J#1iq?m*NIFZX8dt^1KmKIXj8Wwc!=ZlCu
ptP?&R mdkqC@@\w/y/#MiiRT?^d9Lm:n%q&w:^RFhCSk*>9+ymaZ%+56G?lZG9D9HEN#I+L8!CNlXZeXYJX6@y
DE9+lB !Bm%tm4J$yL!KQFGb+Wj8nMM<B?k=Gm?GXQFMZyG@PJ5F+8>mD&Bw6qmPi@dXnD?VKWhES=XD&Na5CTN
ZThuVk *WHI*cy*jCcWy^\t?h%56hQ6X\ALL\YF%GMWBe8#?4eJLA1BCq<JY+u<w9NCycCMIF#RI$Kc?IP8GJZ6
WCLdT# l@I1iH**uYqA##&lT\M9RV?jI/B!4*YGqV?49=D/WD*+Fmu!StYZ=?*aE>!6l*6C\&@+5+jLa**&CLVj
beV!!6 SX4uubH?iuTQ=&4VJi?P>A^*Ick//M6YZki^\^a:i$p>mhT4hRCjuDJXua9GnNemQ^4ynDT45!#58i><
IN/4!: l<#:NnqH@P&u#=pTPP<y^//GEbZi:DD/Z:Bw+u@BwqXyypu4F\jQD5Se@V\dh>J98SdKm4qQ?w+YEq*l
4yh#dD Vywe*A4EneQb?c\W^C+iVEKX&$yABQED<tFRWI9lYR#N<NjN9=cqn\k+TJ+@Dndh9#\MFj4:R>PB>ZVL
>#+LBe AtJ%#hRLtR6CIR@1ChljWH?qD9=RFjTVk6njGRLS^SEbZaLLdL!ZbZ5Q$L+IImG\IKPe/Eq==w%%@ESj
<6YhGI 9%cYIqEK5!A^G!aK:MM*CKY=Vk?u!1*AkSEF+?BSB>Q5iAnTWBhM%C^*@1bp9p4JqPGib!+1Km4>=q4k
9B@Vb= =P1A8JXp9#DIJGdiQM<=$YI65L?LW:*baEdMN585lmth?Pm4$QuF89a9TXBLj*ARmh\kDiqKy<m?j\9L
&RtYL@ F8Pp<nMTVLVkB$!DIi5<yLE4c&jd>9*<K>aADVN5G/^*:BX+VYPG@+k1dY=uytD#iXa8tnnL9k\Xtb6V
%Ha/Eb A+NyhPK+!$L>CR8I\SQee561LGVa1\dY6Z?L&Jkn>Rjmtq&DcQ9>QC5h?QNE#Nn\u^RJ#@jmXNnKZ:HT
bci#CT mRk:FBVEjKiJRu*%m#>/kd%wn&=n<>?ZqGHh#RRe?Cu%N6HPD8X5TP1aW$dbZIqVA^4SDlknuG4Q+Yu>
iX:wa5 b@uQd6n!BVFna^M>ta?qbIMy<MNqPeTC&eYZk>tFhpRdLb$RCB#1=Hn/i!DM^u61Nn6I^FSW\i8Vj/W8
D//hNV D+HQ:5IP5X=BdC%DMTS!Q<pQQhmF?D@!G:8+:W^hBM4c#P+&q%:jdetcj@Z1Q:RhC4BQp<nnptm!6kS1
De8%m/ BXKjl:FaKE6JNFCLlP!4+auCj#IlyEVKL1Nn5%9$c=8iE?=BZ8Hk@Q:FEBk8akiV9YYy%>15N5>mHpbA
WCJFV? 9<<jFEX6?/ThaTKcZnCHJpn8D=aJ5QC?a5=%8!GJSPFZ&qBWVp5M:lIHI%E59=*l9Sae5WCC\F:=$&%B
<Z+R$^ ^9V9jTRWHXZ&>PIwJ++@hThj@CANF%i8tj/R+\SIhn4m4ldwB^b&P!9tZHhl^<FI$hetVl\p?p@QPQR4
q:6i>: dyWt?kumpP6YXS6b>jH8bFpH+=?eE+Z^RZVdyN6atpJay9H4eZB\maQ?+u>JJYB\+cN?uFR=?6hSidK/
&Xykl$ \Tud4hR!^6ewm8kV^SYeecD*W!*l#ik!F?Y/\:CZ5G9Lja+yidpYVp$<@m8$e^jV<F9P%EXn\*b5<!#!
aSY$+# =15EaPkqJ!c#HAaeetN=Z%RJhXFWlP%!4hakumX+jl1\RhqhRGk^nSDHjh%&huq=mGWFVy#BCkXi@?!w
!pB=BW h<Nj8>cwPNNNVyydGa!l6i!t5KwIj4\Zh#e%:a<4d>n$>V<RYhwI5Y<p8Q?l/ca#@Ehe?L$<VVbPK?8T
=KWWuq LA+HQcM#MSGNSSljS=bF$8plCZ1kHa@Q<YXGHLmy$ad+&ay\/&DdN$<ec=u#dTtZ$lIVXa6kIYPeFSb%
qMWD4J qw:tkZ$LI$RCT^CF!b!NANXGB=a65J%&$^*pBMLplY?^$:V+k\mIh!:J@b*QV%>iR9yCd%k5:%mp<wbL
cTL*dc l\iT=G@:GRFt=bQH!!pQ5VTt*Em@Ee@:nTCTwYA5eQT!9P^C?%k&*Hh4^d?9mL/5d1kkt?6p%qPn5TCS
y&69GT B<N8Rqh\eV#aGbbPMQ/RFNK:=&5!nDYqLDRR?8atAw:blDlt+4j+Ju<hHnSFPdj#AZlD!8$pVe$D^68a
K<K4QC JFJ#@4@bN*!t6GN%\<=F8jY5\S^m1R@TVpAwKT6=B4aJEAHik^A4^6ZAXk/p*jVdTa5l!$V<e#CJypNM
WKLn&> luZi5dBD*TqYatQml6^9SPkj@cJa%SYkZ$et?B+Y/?4=H5jele&k1Wu^LlRF9Dwk@L1:m^Ynyh9W\Zl4
@yl!w+ :EPeLaF>Y+eR@A4e4=N#pnVh5hKhA%TPW=LWh>9\:#c^*9qZb:eyX4jq9lQ?n/YK@kH5J^DMRT=PMd?M
EMtlPt 98QH?njeM8yy<>Y1p&ZcuEDAhP$jmk>P^uX%i<=TYDFFkY1EHdBRn\$Q58G^B1eHe@nmlQ<66/#A#RC\
b6=A4Q +m%S&>^8yZwlTZPQiyi@w/$CJ^4TKwPhCTXc!plKpZ#m8@c^/!>@>@6*F%dt5SlJ>YQ#ZDeZL?4k><SX
MZe>hG /%MX>SX<5Y^*%jcI\Fma!^ELEqYqbXA%S/T#*A$WN@K459=?i9XkXb+/l1T=4RI*e@L/%uPmPM#*%6>d
-ACAZB 0000b28e8af001202b4 Page 427 of binaries2.zip
l9+E95 WNeK*LSI!l66JjyQ%q?^<X%R?/cHW&Bkb6jw49e*lpDd?:@<GWjYb1=Ne1=:=R*P$$1Dpt1pX=j*5cjw
d4dT>b $jYS?^X\4pu!Ry=@!B*X?Hai>M^l8kXB%cMIe/*AkR=iuS=Kp5nVl56VB*aEE*qVM\FCN=Tey+h@IXH+
<P>F=b SB%#q!cLdY=ZHq>t+!$%8dp+S4uPB#i\ZiCD!S=$Z@+#6qGd>IRd#X#\d/lQ@\Gc<i/aK:twZIiV@pd#
HZWK\9 Z=LK1B!yHNqjG1QC4k+=GF&eSDy^RW$46:%WDK</il8TLMdD4DtQDHeXh!i$wFZBXB&=+ZwtwulalZ*D
H<#9ik SnecG?A1bhqKI?AMYQ?C6ZDAumRjIc!N/9QCbZ@iKINCS5>Eu=VI5pL\^?BP=I>ja6*JCmiG%/85Hb<G
Fmq5mB k1KbDpM5S5^yC!%&ch1bS%mnRAnEmI#a!\peihwW*H?SaHl!8<M+Nnh>qGV%u<@N>uSRI1E>AkIG&6qy
SVbGdM l4Lt:a>Zawc484FtDc8:&HCC&Y<H>9pc5mqETXR#/j&^\dutb@B19&6?5MD*N>QPD9bt&I$aD+6LWSEK
IL#m%1 XH&DT/&iW1C<E@ZN=y=awKp4CjSq5a*J&qAad*iel!@b\@q\<G<yjAm^bKjRq:*HJNAS1BDa@&&n>J>!
?i8p*m n$\SZSXhqbBKln:?lAhZjMXemkW:6lp:!w84MW:5C8FaY!yQ@$4&5?!>Zc!ka/9FD%5p&><bjZJjw1:M
@@4XjS =$L/yi&bMHtRWk?YWbT&dY&^>y1b++bje@?ytpw5\K+6Me:tH4S9D>+4@QG<*eyid:$4!NBG/e?\$Swq
*EqHH@ Wl*FKmY&j!=k=lFt8H=AFT/k<B@#DkyliY>c&*5umNL#9YBmy*k9jY56@X<1K*e1?=>6lY*WHFG!GZ\F
QmF89T iE5m=c=mNcZt?wId9LlDD=?a=IKiel=@Yb>L:QlX?Y11<1>9A>KcJTlldnD+1wejn&qEMT*&J^hqPMEK
\qN/>! 4m9HD5+DD#:SJ%E8^kVT?%IjDA^!#nbIp@lY@J^Vj&b<mtltn=PumCjhQ:#j&na>im6:d5VGI8e5tnD/
RAbF?# +AuHB#tC?/$NI8p@X*EwLwbYyaSm%$:PLPqZmN@hcE:1aN:QkcXhV*APebQ8+Gc/%keKuhYCPCmuQNll
$4\BRF PZRH*!&QBt/$Xp!Gl>dN5GNBa/FiCaB^kDtQ@4phN+=H1w!<p*<*9GJRp+R/iD*EHpSDSV?Ju=V:c/Y6
K4LIZe \EI<4JuTGH*5G>CS*m69\@8&FS$t#Q$@e9#K@y@Xyk=tq/Gm=wC:<IuVM?R>FRm*i&\$ZQa6qP:5uwn9
#aZw:E VpKuaud:W#l@AFQYQ?eNK>w^YLE/59>uI@/=MXn*cAj4Z^BACiipeGIIuIni>1a#NE%X>WWh5**ky!b!
bmS6=@ !lh$AD&^W@yE6!4LVb%FSSm1M4V1lql*yHEpyed%:jdmSaDyyX>dDThM4M#&%!LIXk%wLjDDFZ:bVMuM
M#nKq! 8B$1PSHFeAYdhG<F^h4Hla%ZPW/i8uDj&E^6:@kB4D^mhX&<\1>kL8yk$q86%MFL\VFQKYZ9l8NL/j9=
JK9VAF D!\SZwe=EcpbB\%QV<XcblH>yiBL8QHjduTDl!:AFa6nkj9DKawTwybp:6J8cWqk<GyJe=9YACVp1l+F
FMCJAR hT@JQcScNw:cMHDNajh+L/46Qa&X9b*NXi:y%ZtX%ct$G%dYEDK/<Y6#*V#\1NQplZ%V5QcJ=IWEXSCP
dVIn#j Q&5YSdwQ#KcFhF?YcaT>CY+Bq=S<!y$T*+jXT#j/BG8KbJlc=At1LGaNZhTX:=mJGl/<hTd6XhIc9nB5
paInmZ X+T@?ww$6>8kd+4/ntQHTTD<H@:@!B<iyPak<ZCX^*?Ba+&nZ=Y*?!Snww:iE?iy>jT!W$eRS8bYP$SZ
FH*/Ga 4KW9aB:bE8!dky?FR?B#c6PtHDdB6:$4EcN$6P9lkj6bnI*?5>QbPlMihcDDm*?KHG9Xd#mDBauXdtJ+
<u=V=K DMYXk8a$edSLqLKB9a>^eG4cAu<mC6VnN!kMyty@yS6:E4*ntA>tb<Rl1lI9ajjA=^%!?M?<a9tL8cm<
\/>+XQ TlldFZMy?6YNS&N@=QJ?KQkYb+6awFN@qm^nNT+:CGiAw?X#Y<Hhwim*q:wBAy8h+:?tN&nCK:$11#J+
1mcDXP Pi:TlmyW$L^91nSJEc8ES<eijLi&&E&N9tXmiC:$QW^Nku4R*+^FQCGdeGaPQ\X91*uyL<NuBlNnX\c@
LjQj/^ l4hDCp&n:bKp<*NMci@4\%mV^8M:>?\ZTiq^#MWdbnd4T5VKQMNa@A*:YncJJ+/MS5Qle:+tuBJBEm*B
i>Ey/@ AyM%E%pC*\R!/AYyWw%DmR<=Fc:bQH$L>WMqK5*>1luJq*!j+tj?VuWKXPhAjy81me@/he6EIMVGk=DS
^CdY&6 p1Ke+e+NJ&DqIk>4iHLhZF8C<Q/6d9BCuy4lZFKYVjp>%u/>^*>aETZhkwMDRMlqd+6SZyFh5SpF+8T@
+G6Q9Q 1$jnFLDlpdLHpV1F/I9yY66a@\5\jj+XCRy%Y>8!iuFRK=Rl!C%w:D:?6KS&Y?iVahMhq:t9RbuQZ\C#
8iSw5+ GDWkTWNb^kJ6%in>CiW*AAEuD/+im!MRp^hZ+5kDWbV@S@DmEYT=#4*<&u?P+C!KN#1a*yI>IKHFdCPD
hlF\R/ Hmm==b6?\D8@@P56ZwTY4>S:d:d9c%Zq#::^JGtLLtnJ&hm6XIJGZFMd1XIt#NPZ%H&+Z1*YBYa=n@BK
4C#4km chM>yuK6qqA@!Vudql+I%?n#eccb6M=iqYVTeyh1?CNphk4=A$GN?I/l@BA!M4nN$w$w:\upym5<i=BN
!lKMN\ 5SD1C+XPAw5ZGylt>+P$XKA<*at@QN%*QSM\p#n9Y@anhnRVCyGw&b+<LnHilRi%jHcTw5IQ4DF*#9&#
XBCQi> HCJ%Q<acSTDKcVq%b$^hQhN4ntQlSMFQm<9KTPiB%M:Ct$adaZWbM=S&@nqG&<eA8YY#Wumwm6\6SE^4
e*EVkt \C5#wR=RWEiA6L8W#:aQ&!q\L6QHl9cYmpFim<L:TlGVk*CaK*#@AKS>eSRF:^XHZALk<<#4\WFJ>+X^
ecnQbl GS>NM*5H&^?j#9K/%%/=\mN9uVJ6#mly9J!eFT:<ypl:H@uH8%km5Q9+&+PMB#w4KuKlecM#/h4=SQXu
YHlp@4 JKFH4=Hq\T#DV^84A%6uR*5?6w:nQQBqc6Y1!nBMj=bh:#ZWDBF=%t9^8Q>>yWdVc*TDm^1\8#mdITPF
YBjMnF AV5E!CCwQM*&BpGXC+eHGtBwaid8XhS%K=wjkP$9u4FAuHTPIBI@ulRR9yAwB>ADHBG!9#?9:QG#?+ZL
Bd=lcK GG!w5B!j6ubR*%NRiJuuT>a1>+X?%QXBX:LHq%E?JqLJ^NC8?p*Zy4KjH<=!=P!!L%#TXV6iGh9kjFmj
PDYHC! KSB=G#halRp=EGEy*/\c8VPh5Zu!TnCtR:%GlV+?kAY%h*=JhR%FP+aY#q+:H9PnFwEJ&@y>w?AeRcj#
l$$\YH wqcj5Q*iZTZ<I5G<VLYAE@>^*BWQM8q?NwKHHa8nt=>#CkZw!y1#NN:+LKaK8BBmXN=kH6Rm?HVFA:R:
4T!e^L 5*hIHS\n6@IYFIT!b#d?N4^V+a:WVyNTYinycZ9=\=F&:Z&iDDEnV%BH1?&RK9XjTcB8/#4?<eaF8TR\
:A8a&9 lHi6HE/l?jm<HD<55<GIRWYQRGakdEDid?%Qn$Qe@9$H4</4%nkVql?QQFjt=Ewne9+Fy9>4pbqYX!wc
WLiy\6 eH<tb46DcXtyI9idVE\$$E8R+Ed#TCadmM5\BM/+5nQn/waGwRw!$t<cjT9<@ETqAu1SP$YI=YFEQ&\H
Gemk@+ p\ma/EG:M\E*c@/D^A9/#L*hnMCC=9VFD!*jZ#PTXEAH9bLI*8mkCW/QjuQZu\Gm*8CK!eZNBDp=n6:Z
AbYELF <X\lD9MiB\m%wM@#SN5&$Y$we8N>**QcM!HYSXlLk>lTd*j89T6ZV%uVPRqkD4^9LG1Y^wXcSL8Ny&ZW
6p=RQ9 TW!*XLB:pZGj%Nn:b:@Md%*DXR+/+#FS9u:5<%9pu9VAXqc&B8W*1huMFbZ%FM+yZZcKNDpLCatLuhMS
Ly9D$p !Sh:pJ&FedR&4t&#6=NTPC5:9VENQ\BlGQmVS=H$<LLqqMZ*@utSlqDVN>a&Hq//@uu\%GZe:#kti5j1
FE>YZe Z%JWJW@jjB==ASdbG/mXZH^Q#9*Y6dd1keH4N4MH\1cGp+u9u4Pmm%J5FhqXGdd\!RWDY=>NKwYlMBR&
6kYIkA MLMV$85NiJ!ynC\@t\p@XG5R6ApDNelI*@K//L$+\e+Z1wCh&j*!bt?Ta8Dc<!lu?RDwacGkVI?^i1aw
aDnbih +Iu8\9phVJZN>pQbM&*td%tEdi>h#uF1y?mmV=@ME>/:Ll@cNm6?^:%\GS$:FR6HQk*1XJ*E/KFFVK<$
lq<>5y l%NW\kRke=mNe@qMT*>Lj=IZ#YXQ&^H?PX58Al44S4Li<h&!nQd*@&:nylTWj8&8pTT?X&9Z*XYmQ@=G
PNkM*l i:#Y?RGQjEb5m:5$M^A/=uFEl$5y$5Rd\ny>ZFNbh4Z=XWtl*#@F=Mtt?6uhK&9TQ!8FpKYQ+5Bj&w%k
DQlAZV =IdNEtV4GQ:ZFb+Ha/69DFlBZuqCS%A?&RERJB5AYZcTaRiZ4@/51aDb/@T5*dYuulZ$89NAaddP?9Yw
BdlaN= iEl5*Pq5kl/Swtc>!pKlI$d?E8hFMhSNhITm%?Jd:ilpFd?Gqi#yh5nEub49ZI?ie:H+c:9dC%*@e5IX
p=%w&b j><yu@DJ+TnEhK/DVeVq9PTyK@kw@*FlW^&1%je9!t<jJDZkBhnA4&ZA$<k>QWVjBqRwR+aWyHHNn&wD
HwVtn1 nJj:\a<l1*@4=Yl8hY>w?+IWMZuZb\nB:665*%aqFd\19Qqu>1pW@LuY\aGuM8Hj6D8wGBq#Jcp@jLd=
Nd:1>V qyjq@CXl<LYXI:jc<a+<u^W=6#LtwqLb\a4YJ@q!EC+i15yWYZ:FB6RHLF@>&Vk+X<>?=@cE*L6!R@lA
m*L*^4 STblAt5<Z8cGl9IpaP:NH&?Vd5eEtWumFTn>>9WNF^T4NQk1$>:cJ:DFqDQ/P8eH/EA/FbRS@#AtKW%j
cZl8nB !@6Fe8ZY+$aJBbQe:#/8GYuWF&4y+MEV\SAX$yV:e</Rh*Knbk#WRDhMmM$Yl8LH^JJjic/>WA6YaQ>V
Vi@1i5 P+^4iueH%JtJ1DQ@Njy=6ISCWH#!L1Dl54ntQ9LS>FdM>?h\ZyX$ZX>ShDB@1$CBn#Wn=k5uGYV/qC&i
K%4T:B !t=ca9t$HQHNn9ByT4IN!jhJc1Aa/QyhDN8P&B6H#BEm?ltk1SD+n#Dw>IJWLHJ6EQytpM&$5AVaA<LV
KQyZ9A j6&EBk*8RpIhEhi8N:?1+YTAmtbI5%%kIKDXA#aJYCwRj&H/Xl!Ftw5@F44hC>TJCMaIc&8B4D#Hq+LH
CQ!1V= qm59T*qEBCa>>twt+>hpH$\=:bSn+JG<=GlmP5jE6PiBBI=Q\N!B</6pEV+T!i*9CGR+>dM+Cm*e$:p4
QDH=h@ ?k:i1lK$jtDNe<Iebj%>@hlD5+8ZB:iTV$G4%&h\!PuNR:cLVQ/:W^uiYEa=D:$+j?^%&wE</EL8jETe
/?R&$e tIE!WRER^GwPAFp*P:FL*:QwXelpGGSV4i8JdF#E*wkBWINBNmcAnd98LPDJk4TTu>e^A?K$H%DDHA8X
HHm?yY DP=#am!ptd&8!1Z<CpDT+a&?&%Licel%X*n!IMlG!p<X9HmyNLt%!HaIcMA:&?CVIan%HPTY$R\54Gu&
/NnA@w mD>tw=?Le>IXQZl?^Lba%PkFM1d<YwIB>4ApQX!AN=LDi*19#QdAw&9FM9d<dDZNYYckR@+ElHpSltH\
h?Cj@= jA*aBueDpC:IIh6qT<CcE>*JQbn^V?Xnq@iFW!cjLu5d+q+Cn>?Zqu=mp!S+>QD#T/XIC9?:cF$K:$u/
C!uMqC dcMml+bub:w5Ay5HGdF8KTjRF\$AJ6@uiQmVZa5:FYbl/1PJ=t9Z<<FFXEqQR>#5mB%X6*kE?CSSWN@@
-AQ=?a 00023a21770001202b4 Page 428 of binaries2.zip
a:q=5W >=</DqScyIaG4i$*><$y&yF9cmm8V?Ke>XGWM4l!#JJ!XQ=QV*ScIHwiq6>n$T:6KRlX6w\tVX+4IK:%
ZLplFw Qh5^/hHY^hq9=J+4w5j5^n6JlH<#qXHYALqI?iQJtF$K<RK4\EkCA5WQtktRpY1YNpd=Kq=eynj/M&VI
:4PCK$ GEHauu8tAwQARDID&/Y9u8w&HNeX/N@c^Sj9cu!yF=XLK^/=ci#e9SqRecjqI8h6:X1&Zujuh5:VPH8>
HYe5%% IpZ%&It\$Wqe^=:559aTw4dpeFe6@=!VQB1>pNe?ePqd@C&19%Y%dR5kGCAV&BTYlm#J%6$ul^Q:EWJy
$864$P J66kpP4eZ\+q1Tj9FDH*jB?cXP6W98ec<TEjM%yWS?%<+TyujVFt<t4iBJj@Yd15\San!V&XK68=ppH?
/uZE1& bMBRe8H\?Q99b1N9/cYJlM4?$/h!%w@#>pdak=hH:/:6%*W9H69\AP66S^DRlmNd#kYcAX/dCVZJ^N=i
K$ew9b yHlhj9Q#!<mAa6TtqaGHti%%<QFq^DaaChlA9VKlaBpy%MYF>5WJ+5n>?mWGh5B&Ad:Ca\YP5^=j1ZMP
TLd1?6 VE:J?Y9iY%LP8*N$6pAp&>BGM@**i@SmS&KMjN!yJ411WdINIVcHiKHa86bqTQ@qkww64F>X#:qjemQ*
BKZITX S\By+uhDE+QwWe4DqRF!?Yh6kVYNHL@*h1?*@F/iK85\tjPnhqTFn8LZL=E:jIkJI*lbGFR>RF4<+4JT
k@KjH8 K8AE8daBLTyHA%\a=d%m$l$PM!<ZRtFPahRA^tYbDacSwJuR4P8Y:$c<48%5ZSJ<KjL$h$4>KGy<cE^V
CChj%m 6mq$:S^5!dVb&&n*eR1&P%tqa%:Ib#@p>yt&+t5WZZ5ZGXWh<AR+lq$C?hM!aMw>jaaEawQ\AbKi##D9
XW^\?Z wq8V+S9EAeAPb>Mm?PQ=+>@K6yN*M1#<X\i?Y6G=mNRyZP\hX#/VBEmu**$j:F<<19c8C!CYGkYL#P<L
kKBi^! D!Y/%BEbZB4KDGuW@KA&kVuyG<iQ^!@@S5!+\w5HwZ!Nj84?#NB4NP>%&?6+wJh$9c=HA\S8R9R:dm@I
WI654G /C?CyL!RmK6GmB=$FauALF+jGRF#^L5HRYCd=Y5KL%R%B6!K^DBAD^5lIak4&AIXbN#knd\biJ%&:lm^
+WQ6aq Twue@a$++<e&+4N:eZb&w#?cS8EhplnkheJ4eXGkRpa$R+aVI#X!eipw=d8C<n&T<66jAQ6+Ac@l#j^u
H@&M&p RAY\h#^dIutbPE5H=F>db^<B<^5@%*@?$1!I*?H#@TFyQpZ>qaRPeji*pTV8GZ=XhL$ik95\y?iI?WP=
tQWVR= XFtSjMl9H6qcW@P5BAN8m@b:=En:mB??VD:>PE*PGVkPJ6QK9qd>6wu*==bHc6*1pQQ#pY=6iw#i*q^A
h8F^ci W4EibIC4wk:/\\niWkJ9hwW*D<K:aalJI@kA?PIcFCDV#Zb\8ZlXmNc<M<RLQibGFb<hh*@?@eGD/9kX
jauA8u Th:4e<CHX+X&n8>TNW6u?5/Mw&CWI+jR>KcEYZuGm^i@6h5PZFX*<G6LDKR6IA9ZRkqet1eW%D8C$&aJ
B6F9kS %c?n/:p*LeP+JS6BL\VPE$5CjQjPWb<B89H46EEWmiu4bhClhNVhpnQ$MS=lFAMcYH#T6&Ih%8#E!LQD
9ClJL% Xn&D5=!pdpEc@XS69V<mwn=Syu^Nc=P54&6nM4@VKaQ5?KC:y@9:!h4eRqty6!n/<9wbu8V+NuA/adSC
1*nBX+ 8%YMQBu*8ySw>LbBnIVh!F<6<6AKiZkLiT1Jkb^CLuED6nHiiD&BMQe&Z^9=SF!%%LDM=MuNIYl?wRwZ
q1iJ?A H\1=\8V6HZ@Qy&Vn5cP>j<XbB@+X5h>MuCT1MalNNY#B+uF=N=y5EcQSFBaejQtn4u+R5me168TW+:ly
nYp\NP 5Buw>9*nJ<6n!RYC*@e$WFNHXSl=:&upJRNmt?<CBYBp!EDT!\5!$mCym+5LAu@1blq4j4iLbMB/ilF4
hIbKB% wyTqjJ>+HRH\Au+&QNmB%#E=ww@@^p@TlPap\y6HF#BQ#XA:G\@^N8?X/wpC8e8ZBbGiXRq=4bnXL:Gy
I9e%dk CR/4!j&\DZC:A$HkYLET?S&6JYE:SJSA9BF9l11y=h4y>yi?M1FyYcS%CD\8u!d@>ZcKJ4Q4?t816dh\
$Kuq4R IVb>nbDECa@Biq\hPbHV!VhYNykB&@:KRL>k%C^<jWEteyFN9k=cuwmtAmASkBZ\DY<n<@KHKaG!&9Fw
<4!y?l %=N&NkpZwacG#^Rn6ThV>1&/8%\by#>ASeLQWmNh+*!W9<:!I5yXTa+=!Qy&NVL4b9CLN#MeBEGyM&5Z
1WDn65 lY%hNN9+*/pG6lEStkYZj9qnK$++!<cL&qjic#$#ImQy!YY9ILL^kPV>jIBD&14SN^nMbktG:$!k@Pa8
?4YQp% WA$d*yl!pL4ZTT>m%QMc5Hbnn9i%kZ!XYVimp&FPd+Gq6p!cZRnAMu$h5qw^Pp98Rj!D?HKpHL%&<eZG
T?bmeP u!6duk%FGV^1lV\ITatRJqJ@Qu46<d#tK:/CMSTn<L&K6YDB=?Tq*9QidL*4SI+Z$J*>nDnk@DnhwQ@I
hbL9@Y ahtuRj4q+uN1Y&H8Eeq1JQE#KW$y%@iYnC^@>9hPQT9CQT6ZB16I6pIPD45yZqi1pcZYVmM%lZ?E*y$9
6EC#lq %BFu85TWZW$NPekdi@d?+XywnTIW*%dKwdlH=aq5^Fp!8F&$<Zi#Wh5yh^c#YwVM?A/b!4^%$$e$eDu+
*%>h8h &&k8?>IS?p?L#j%Gt+JL+MiZ58yAqWel<jnk!nlmS1E*p+*deTeD!$w?$eAZ^KV4/YB=:l#j*n4++DkS
a9C^6e %Wl4$*C^@8=e:iKe@8Ke@?LT%S?biRKMAuIZBB8EMeBw\9ZkAl>m1^?=Dt\NIdeAiCGA>d&<X<:qjB9>
K\?q<b Q$4=jeS+y4KqiEN&\X9ANy9+ReHG&WnH&tYC*8A/$J6*?iT4ju:S?/#<EFq=SjkmVbIt=#ySp@h4XuPY
D%9j?T dE=TqSWZGWY9iVkC:P4IR6@Daw\1/^n1&GQ/HIW/%&/+G#cMuRu5kCWC$<H&?/hEp4PCRaSS8A!qM&Je
@awqlH +9/%%#6EmM?%ZyIW=>>uH%y9Jcj>k8J\YDc6cnYG^h5djLGSMp@hIu=%GkIQ?HDPd@u^m:qn@TZ::1^5
Mc@Nl8 ^>#=G&te14qE^TuQkd#i$P6cLiSW$qA9m%b51N1B&*:\?IPJR>CYuG6\e:wV=c<8aDQMpQ$h:Jl$y^5^
y%!5P: YRhQKliT?dMI@eW\#LZVi*F%lJGBbYAhXE#=IKaP!N%D+FSASDLAjaQZNTWWI<VXDwT@i*@$Kti/6haT
6Yk8Cd B!$=bjmN4<h%?SJZ8ERVwS/hXHj5!pdcWlTKdNh9+/:dMkqV*4?5jh9ujZ^W@W%EJXMmV$::n?DV/N#6
$G+?b8 X9imeyhw@GbymWH6S!<<H6cnAZB^CiIAmNljQaamB9TkZa$RGAJN^cd5PeKARCI9#cBYG9AnGN9BhTLt
J$ERIn PVNZnRCjZ5uqKu%+DQWi#t6caBLI9thd5AKn<4%IdMKe#>a=#Djamj@Te+%CJTaAy&E>WB=^q:i?V6BP
$q>RNM e#>?jCnQT:=D^MHHY!y$L<NZ^GKE6XISu@F+yGCADNAVYJtb*uj6MNtc8caZuIuc!i<ZXY?eu&ZFFCwh
wnnP5+ XiljpdJSZRZ\XFNSFM^DLQHM4H&M1tSwllPi:c$pFS/bj>?dSXbqTm*XFaWt8Z@^i:FiAT^JHQ@ac5w=
H!E9#q A9hKkhwHt9:^N9\jm/QQA8Tl8^mbt>6MELkKARmBV*Iic@TWa\4Z8G4AWF+W%9u<lL\Kk&+k4\DwT^q\
k=G!it Ju!9HA\e#GcCZAH$K6eZ&AITeS$k=e&B/F1E\/Hd@>==aVVayqF?AVIcX+ZdMD6wR4Zc^RD5/8BD5Hb6
>%D?\? ?9Qlj?B+:Q**e4w6kYK:*J9q*c&1HPmXNACC<Chp<+FK9MRn#@=A*qNtkSni%?iwAHtXdWTJMJV?bE1T
4GD>=! wIF!aAJdjN:BVKBt*mC4LL566P$E%%pK@$1t8q#8wcayh/=eb$q@M/HP@PGV?Ku$YFZ\6eeMc5*9nPXK
Ibwqn* iSWtB8tL%!#@iJu&Kb^y:GCEniwRwN#d&^?BTjwq:Pide5!yd^9XG4@=*!RGAMuA*uM\1l5VeeWFHjWL
y6Z=%V KEWkn^lPM>uGEX*<IDp9#CB$?^mMlF$5At\ukeVlIG+nGI\N<8@wSl\eHF\$AX!L&GMXy\4R1l*APDdV
@Fj6X5 L^tcQ%>/qP$B?d:k$e!pGdQSJH*kNYBq<9CSyF*=#P&W8Ad86/Dh&B=imM/RVhXcy5yy^5*RIlT6Pqu9
i@/<\T D\kM#?Ea?t\#@DA6ZjV%a4FBq/aNZkajp/:V*w!4h/VkBZbM9hM\m%A&KFVa>H&n%:Hm^eZ^B\R<lS>L
6ln4b< /ku@%d/ca&%</TF5kq?@t4:P<Z$A@^45?Knbi9L<@AL>:\Bi*yAen&tp\<jclh9iyen%Pum8I$nyp8Pt
+bdyu? GlBW!5ed=R@!Pk?@PA?@#D!C?PH#%MbRCtiai4hyah%ijltqiJCy%>E^QDFD19HGEicZ<waha?i@\<BR
J:hd!\ w<C<&aLGLiDIi*!V^DcLNd>^qAyT4l^%HBcjCN$eZBwmjZwD@pi&MBuZl#@W9Yc89nN?jYttiGIR<lL:
SQ+LNR ^Yc#T^hbGb$dPlPR#W!?RLZB5^b>qNhBwSAB=MHdt*T=AXZIAFh6AA5Z+M$wywZSJ>6TQJ!yHkNu<WBq
cy4d%X qFXud+lc=P/b<k6SlWj5j$9<NbiLqYRCniweFu?\6AaNQ5F+q^mLcVD>^/iy\PTpRd#Gbtb@HjTF1b\Q
JjXKVK D@J1w#pKnpBk*#>dpAblhSXd>^cATKtAj&e:i\jAypYQB$H>yqJa!bLPqQKX8nn#R?=iZyqlyRM>!DcH
Vp5yq< A5cBiiBwIDdIW@\T*t*cW5P/JiIEatRS5q8HAN<D94Kieq4^qA#45VZRD+iiq6t9En:kkkJ/H<X:n>5F
ptV##Y KW/1SkRX5aS=V\hei%!NF9+y+5jAn1u/18qq?RhchGA<iD9kK?BI#$u5c+>Jk+>BI>1Qw>mppSN&iNDY
/YaLkt *H/tw%<SRP>q5LRS<uZ\mk$VmN5mFyRjRp@85Zh&D@QjATRj@P@nFQl!?\ZdMNkauZ4$\NjnAm$K*<pA
+E69#n b*bnubR$!LGnA?V!6u\Y6+Q:w#/&n6&IiGK##EEa>wDjqEXi@*ie4MGBEh\KIEQncaB$M5wdRGI>M#G9
y?qkSZ C&Y9+$9E+AbWJABeekdpA>n$ImQb!5!uYMBekPkL!m5QmwDuk%WDyB>h9WJ8cX^KBXm%Ve+mpd5$CQmb
KJ4dLW @!ey4^QaL8T+^klYDX#h?uy=5JZlkqyjTYaT@9Y$F*W%t@?WJPN:4t\tu</H6K**&X<RLpStK^?/MK@8
<Qtd+T u\u6ijH8L9G#dTl<Tl6\=$@at=XL/Nhk8&I=MM8M^=Ml:FYw%8RjYQc\YCSbpH5jlYI?DG5FjdA>V#<E
<XyBQe Xh+b%=+ptkjQZwp=j+wcyZPd^lTtZ+!@91^ZBmEY+m<T#%!YH!=e?$LGATRPGZASbu/G&J&<ARZ&AJH=
?5/EpN D>SLeGjD>jWy=BS<bVa+P%MI>LB^?>ehZ4MlF6leSj+JZ>Be=w*//Ll=@PIQ?M#C\KdtwBk&?&C=1*HD
%p&^Wn ?^kw$96SNMNn!ZNZ@=F5+BM1$^<ddaL?uPcd5Xt\@#t&wEd1ZHF/&#/NEw$T+NNuTXSZ>$@Fph9it!Z\
e^&PL= *E^RNMyHC9uQ9/pclJyDRh<daYnIKaB5IR/uPLk=Rb<Z@<?^S9YjNwNlJK6kkI9QT5A&<4wND6Z=#AcV
Xcy\%4 <npJpQquW51XwcAt4FLETkae/klE4*Rc9wEk^Qj&5HQDP4&WSjm+DV\%E%Rmk&$W??wmBRF9AFb%/MGN
I/Vk!8 b+SnQ=hNkn+GBTlJ%t&V=Rney$w$i6ITRQGN>b*1j/bm!HS\pNS^<S&d@^DZbnJ+y&!XQ9J*^5%*%WA&
-A*5DM 00071a907ff001202b4 Page 429 of binaries2.zip
CP%bqI Ew#^qyF8Bp<nMYHRE!u9a?VGMd!L+d>=1IKy^6WB1pGTG>YF48jXiGm\*EXZl>F/u@N8pq:9dmIDwQ9q
#m*pGc =Vj!$1eQ*T4c9uS<6F\uW1c@$V*8nlp=Nc!KJnbN>=t#4tI4E6\ju:I&iF!TH=^q*DWL*m@yWuwel4<5
Pb=SXp RA:DFA1pb^iS%PJt#m$ub?4CZwbF4ETp6%>i#=@k*u*Gy4q5@Jm55*T&68XN*G%\JhCn<Wk/V<441A+P
+9e=Em ^X4MD<B@B9uWC!5YN+cb?DIS8Aj5+\?LBm%jRNkP^\JYMFm%@n$k<%/1REHQB@?tdS\y9#8PdK9AuiM9
!luBd: <nLk?JELADaI8+StYFQtBc*4#AG#W#9*$:+LX@*VZ+jZNmqL1NMYebhy^Mp^LXVnjZ:9uFqWI5d5E4IG
P\FTn8 JGKkcDAKQDmV$pL9CVmhVRT+HKTVX=Sn<6#6ytZ+L%m!b5mjhpCKlXSpQm#T#/jh#!#p1/S>mn%hQD\w
1Z=nFN Aqtb?ylh@WV1:I6cieR>\!<Z+&mNT\^/HT>Zn&>YmpEM%pFqA5D^<C^?WQeC%up+9nnVP+ae&j>MeRqD
TqbB$h njmmyLAyaA?=Qk5@8uEcwFAujm\wNaW:\Amj4C%ETMM?j4C<H@<+E&QcWF/bZ?e\G%qY>>SnRe%^=Phb
YWVQuc %I!WK&k/kP5@d/JYF8J^wqXu9+lyLIee1&C+wJDMG&d+nV\EI\?Ppi9H<N?9+Xp\$Chk<Rm!+V%PSI\y
Lh<l*? C!qn4%&1H/VwHV!+4QC<j6QdFly>qF8?=Fj6B9#BjQycHp?J4V8Lhd$\qp6uVc$QPbSP51u6>pCCPy%a
1F5d^w udY%?Q*&E@%?<9Sw+CBbIJQ\>eJmI<1*ZIwyE4tV8qQ/#<91AQTk4^cwT8BqG?YiWNMDamk&I=L&SLMB
PRqctV QT&Qe6k!IiNlXylFV9cV>Il+91#FL^Q>ycMt+Q^^h^*KV6#8EDShL@8kYKjKJ&1FN#F<cXhwpwTP15TR
y+QS6X lb?^R+V1uCZC8ly$9XdHMELtYe\YcT#\^&mPFLFaiJQPN1A?k%CuP8l<AJkNXIdbQnkAaH8\W=^=#>#n
65$dH1 a&yVe*IwaX?AN&EK+TSGnFnjjjku4WijVCSh\8:#>HRq^%eJ9+4E1/ny#edi<4cyXdQ@Z!jH<E6bw+$p
bTEFYc Mu=H<=cB#C9eCTHMBPR8BDTJpi:<#@>nMe5AXl%P8GEI:JSnF*^1EVtII4!HF%iF?j?jbqjQ95d*LD/T
6It:9j <qY/EEVMmM=A+Im64BtNteRYkJ1eZjhDW1mi\Z99wwn\>%:l+iFiZ5qJu6/iZnci%nciESFlab=i+YHa
ew%kEC #!QC9bImWqKT\<LDEn&V\&<iTRw9Vm/?CWtLVCqJKju>J?Zj9wHFj%JVT$1K@^RZq/V<Ie61KEq6KCyP
+y\P@< Td:bLmR=Kj#tJV\yHF6yeuJTWpSEpyZ?yaK6a^6\NHa5*6n@A5^IMn%!*??18K!u?@y5*!qRXQq:XZL@
:\b*V8 lm65m/6X=Zpt/RM&$ki+5*XEjddB=kqStk?MSi+>9:h4>1#C:hll8*9N9<GVM4uP^<K1tLen4e^MKLYj
G@AL6w Gj@:A:<PQXE>#<kD^>NRNl^XtReqNPEd#Hw^GYykFh^np>+T!bemnRH8@bN!&mYb$X>iSenGS*+RTLRh
6\c@E: GYu$8=!Q:9iFu?picPXhwZAJ:=/GSBp>uSpj9Sb%MIH>16T1C$T891aK^$5*#Z5hWe\#NXbhpFYe<T=:
$F:XNy lY9#Y$DcVtyJR?@k1u>kR9EWiFbT9nPdM&>\HnP>pT/nllRl=Y4X+twhZ&pLH6n:WpAcSZ<\##*#S<9X
&CKd>X *cQ&/P\KIN1%nZMHY%>%b&5PQVF<hLt1i8him6LqQh#yRR:#9i8h?\M5$*Wj:hRSmL>9\n@$Cn+5^^F/
A9Z$\! j<5/y/kkZhTPVt44itP:*LH<$A8H<5=Wm5n:w*pWWjiYkcSC8jpq\G*uFGDtiM@1=*1%n1P=j8&HN$?H
k!QyV: T&wQSnue1MdmpB1@$8qEnM+AES/p6p=h+N=y\#6Pn$P%>k=SN9bNc!84E/Rie/!H$9NyMQn+dQA:V:KT
GDBthj jWlbidKGnYc:#qdJ*l%KA4HIlBZE?bYA&kEqA5Vy%JN/&$m:q<akhAY^je*a8S1#cLDM<1DwLc=QbI*6
<ILN+D G\8GSRGZ=VWNnW!B6$yn*X9J?QFH\e#dk44D\uVY#eF9*GlZ:N=IEdZh<YM=JGC?>1XMEGlMqVlZ@@CB
P\n+bL 5MLKjK9=d:HNlLSqhwuA*M?!VwuGeChpKLhKpG8Q&w6u><1!FKwu!c**e>JMZ>6$th!tn4E!/RCZ&yYZ
B:qMYJ $IZ+#y#qjH##i4L4CWnZ#I=jTFTa+*/YtM^V#bG9\WaYEnd9nmccS^d/G#apceTthKN5$ee:!1W@W!jI
n^St8t +I\GB6:9ymkabnt9byaN>y/>4dRRFLl&ZLN9@K1/e69@C\eyP\1@l9d5:J=@@T@c/bT#X1?RQHJj=VmY
D6?/KS By\46d/=*eNdEq>G9>i:K^aJ/paa1+Tt8HSp5bpVF19nZHXpkaKeVubi+q^LN>MuCktQXmZaYK^dy^XK
*AJJQI Tm!?i/4=XZe+jpjbk=<bX8*EVi6/em4<<?+Al/JMlAJbbJ:\6>$jR+WXpbHi8KQ49#l5dMyMMuXi1L=:
SXQw&> MZ\H=@:>RPb5l<biRY?H*h1XP4ZlFL8Q9$1NJN^YnhJd8qy9K<Yq!d\Rc%$p>$EbhSjPBuu*iVVdDV9M
!SD+tW #py+:T$\4k\cFmwwYG#@FMdqn6<KjKHaatG/Q#NtBCm+<M8MEKaYPnLZi\F@5<\S9L\Bb\GjKua@9bmA
GdyVP/ CZL>*c%m!Ju6P?y\jmu+8&JyhyjXwy*TWAXw=:lQYW4a6pB?:6%/5mCyQk>LdYDI&>w4&VkRM!1u9lJ5
Jkp6FZ 4$i?K>bX$/$99@Bn<#:<HQF*DpIJPZm%EVXiRZ@6\/>XP#>G4C1etAZF%?%jKNI5G4uD@dcaq%t/IkAJ
CZ@:y6 SLemhDdHu#@t\C%WnXQ!&TMMGR\wMPjhm!%>^nIWTHn@G>9upcQ=TZ5*k!Zy:NVNPjJIq%C:P$<@Y8++
$B#Ql< iiFl:1$+w1t!Lk>%^i6MM+Q=Va!8QK%j9YpJGH>K4:d^Vhy68a@$YDNViC*!lWt?XMu#H\?XH9K^jIX@
=MT*?j $M/@6?4abV1R9lem^<DjFAlE>8S9cqY<tBu9uhSI4XMZP=L\tKAn5/SL59>kCiiNp*5aeXjHSWFV6SN9
FD*>Jp Cupw5yXleWD4D\tc?L9#/>\K*iG^k//jMB&#ilBjY8LDIKmk4Ll>Y^Y9aC!&LD5pX!aZ?HR@cmCV$jm/
V^Sm4& LGSSibGKc^@kH?H@kwNewtHk?!uTL1LWYE8l:enp8y<<:<d%l<H%*J?Pq@HZYhtK^Ty!ijY#H?/Gt<R>
>Likea P>1i%ij+Twy4G!4^AapclYQd:q+:>J%q5tWQXI8EmBZKTpI$c&=98W9p1>C%M*+d#ZF+$KK+Y>m8dEbi
<q4jw+ EVdh*4Fucdp1F$LF>Zl=&>*^BZ8MSq5BW?8qe^p8X\GlIk@bLVBE/G>1?4JKki*C*>+@=hG^b+ZKmdPp
KAC5ZM 4^@e$jpm?&+w>4NptZ<*K<GjD&wAA%RYu!yu8Q%=HG$4mQjZ#^nD*:m&muqQ%acP8IVD<84whB+yhMS@
\k\RB\ T*me!jJJSq==+e@=^TJ^c/l?h9=\:$S8NDTT1Kh==CejJ<?D$@%t&R/&pe9dJ/hw=pat@uDu+aWl$$Zl
=1IE@5 bqlPuXtAEmGI&DC?XBXGZFd51/SE#&BbESa&ZX6/^A<4&61/ItQdVEw*p#%/6?qjAuPeP@h*kJd9?k4h
lH158Z L4CXFQwST%Sp1?lnYGQPKliG+$GPI*%*/Nc+E@HMI%:<iy^DHJu>qdh1hwGPLFwDAjJtVPnQ/GdH#G5$
^LMS>+ t<ba^E:mh+DQ!=:ZcM@aW+5**PTJTkTFKtj+KpWR>$^PJCGd>nG>RhXByt@#MbwT\NhkRDZLkI>ZIS4^
&?i1?j X/lKieNpF=eV%aRpm</jwtS/hB/^D#SDlX&@9+R@mB::ypuhm%P!MQd6CJPytu^Z:pAC61mia/Nytp>W
L%*d<& dJtu&ZGHp5I85$ThdIR><&yFVVk/tGFK>IKSAbDQJAkp94I?Gea/WnYYw@D6lW/qBC!!X@JK184Cidi@
XVKM^a Xk:n<9EpjICM+Kl>&PGY!hW&P+*u$yyMX5<q?W**>MP+^iQ^E4Y$/jkESw9m*N:&#I/5n4*H&b&heHmZ
&LImJM DXq>8ICFjKmX!DHL6+Y*!*q1Rq&QT@Q85R#P5P4eN#QZ:L&ZcInZiZ4i+QbWEa>!Nihik?CFj#V9n@&?
wQYi\W Tb9!#@EqAK:TN^1Y?P<ip8S/:Cq6E$1qemKmh&8I:&tTX@k/A!/q>89*Vw=@C8wZyq9M9M9\4BE%%B^y
?a<XS: e*E*#JQN\YYhqmV&<P?&l#BAPYWQmhkWI#AG\eIpi9V=P6Q^wV@VEX^EWRiVBB^hub@JRP1/bw/@=\<<
4@Jw:l n/Yajm?\IAe/8*6/inN:><+P:*y!N/R9HQk&Liaj4L?&>yI5mYXj/m>JE>+cn>KQI&q*S4!I/bLHZdWG
jG8nBH aaSQ:&/uFNV+ZHV!qaLJ/L@y8H&4d69SVjq6Q=Qewj%E5+B=K8ELWX@$NH*$bJe*TL&*b*49ec4%m>DK
/EcWPW Pw8K%cGiL6Yi4w%9K*J?aY9YB?lPejjc&YqiuJ%nY!H*/ZH^ld9q=MbZnRA>4AQ^E:ty8$uAnF5jb1<p
wL+Sni hm@DBC^%>DXDM*TC<qG&uyl%QN=uH*I:m>!wS!l!=hqWI#5I*@pn^D\e>Y>YXJSZSlS%%/Lu@Y>b@5kp
XZqiQt aKN^d^p^dHdhN??AYyTRWHWdwSQW6cnc+DYT:*l*XeZ>TmI!+iPVy5GHe4SjR>HTD9#q8=VM9ThN+Qt&
Kej#JD W&t#SbRahkc!NPen^VGnunLk@=F$VEe:Hq<*lq&+1XY5jptd/B/jZ+PDVhMB5yp1dCWGLT@q*W1!t*TL
/*>kjk qjbPmyB#$qIq^jQuK5TETjJi&4t/ye!c=MD9l*pWMGGJ!M=M?:J^?PVbC\e?N5!wn81HX\WGt4W@@8TF
dSeL?w ?KWE1JI/Pc*KKb9:tQc9wCY:NLQd\t/^CFlcuwX9&R4Wc!p@%E?*w?8bTmQm8CZFKGD?>#MSBcNA6u\I
^Xcm:D &b$HK:jmZ/lyh%Ia/QGFER:en:FVucm6Kded1i<WmVdTu^BMM@!>eLF@8il$4wFD*DDp&+InhdmJI#py
!D?/?9 m!PblZQ55dB>V%CX8!M*X18XN>%GbeI>@cZKlF8/ndwjuXGpcNSq8ckF8aJ@yDM<!5n*wKtk\dt!*mC!
5^/BSb k>=6@hy5bGIt?6m&=PZBH<Ln9B&J:@HadKA1d&9\9#$FPX1yA>$8bcG=/*l5Gppp*weWDwT&>#/hL@yj
S15l$H hK^e5PmILhNnu>/SWK@/8aW6X=mW:bp=P4*khnVmq5/q\YinMyyJ+9TtLincd<1^@jHKuFiyulKjEV<m
/6WL\* <+/q?=6=^6@/&w\%jkik^:cE=d*6$*T%&FIG&KI&BtM%jPI4+bkT/tcTJeXhcYJ/&R/i$mJXLabtR49P
N@\6aF Ne@ImXtHcj4c^?@=tmiSCIbB5yYaS4NYck:KuLdlSwiX%t9F6:&KE@P/a<G/1VQImtm9Pl4Fb$$I+V5d
C4BIeb H8j<6dMIZ&ShQ5$^T=*w%4FFW^%!5D#5aDB/#</4icLt\Bau/I&quiPje>MC#q+5wF\GE&:@bXlAPXL>
DG\1jK u5w>T*Wwn#1k$?$#4X&+Z8!8qS1*4W&KP1nq5%tM6GD<cQi++?M!mjJu=w<Mn1CQn81MMJE!#ykD@dXa
lEM%LX n<+yDID1wR+npcj=#W%>=bjq<CbtAlG=WJ%@DqX$:uCMNB9>+ByT&5qQ*:u\!GSP?:6/jPH*j\DjDI#4
ecq5cR $w>kTJ69X5AmN%96Yc5$u^#>wqjWESJ^eVd4i:Cd/kRX<^ptLP@++:V++VnTkK:5%KKtIq!4w>#?YTqD
-A<w!F 00093ca72d6001202b4 Page 430 of binaries2.zip
aX=l>X SA#1Eh=mc<Qqa5J=mCPM41Pwp8<j5!S/n&A9#$RHQ*aV4AFL#bu>1BD><WP$I>Y#&te4tLjuu!BSV?a*
q:1@CS BqqeaKCQnh1Clpc&&mMn:8qeN+!G^eX>+!@%D18M$p:6?VbG/8*J\lTCV5?899a\1Iu85Qa<=H\GW*Du
BK8#K# w/MiTDXeu4yb$KRWjkeYbVbSK^8Vc6?$e6d?YQG^8ZHJuSXB6PQ?h!EcenQwC6?&QK8acSh#4y@NKRPT
EcL%@/ #1Sn>8QSJR*lt%B?pKChRdZq!9qK8cSA<$Wpk@eHmaEM\\E5Tq<QJL#Snc&<mc:Z*@>^a?YBlHwt6&/+
w!I1R& @KMZ\aL!nEmc<E=1WWVMii5ZSEn=m>L#n6ww^CuFM+#bQeb<8/mPq:1Dh:mS@qKa+=<N9a*a<9E@h#y=
\H<4Wp Im>SNphTtAi#+FAIbajDlR&4WG\G=CyQi=DQ^8BkiMFp+\aFnd$>HXEak4<VRkFnRy9Bq@t:%m/AewCu
dnQeC& k#/#E@J+:TLSP/B$A%tVuu>ykPaMyjKWkTS<$KHnDd/ZR@QFkHpiV$yNjXc=h>WdaJ:abD8DI>d8eSk/
qE:#hC *N5qpjj^m>u^I&pht<h*<>qkYcA:yk+Xt%upY>#?d4Luu=a#k8XK1\YV6aWdtSthyqi@/jT@*liiy<5<
w4>\*J ^%b@GLRW:5wmm5upVC*y=Q>DZCCqEQqa:ZA!**qFcw??y6EI<p!itwQPKiV<dZY%:4*H^kd+QmQjCluj
Myja=u ?C/eh=:uR*a9Rj:q?l&\n4i#&Z>+n&/p\AA:?Deb/q+*68@@>A*&4h6GS%\\D%da<\SESVYd*nRyEZ\M
4!=ZYd ^#cdyy%a/9mH+KNNaCpbR6LSXl6e&IX+^@pQZ!!6SikNk>HEdPy<#bmlp+Y&RdTt1I>#p&=V%\^uS<q:
j@Ait= BL^6LSw8cj4:hJ=m?4@IK!E4KYMjh5jSXjYyBwbt1T#uKITkM#W</5$YhSEta!ydn*F$eA>deTEG$nmW
:R>=l/ dVp\CFWiy=KWpYb#i:t%i?W4?dK^wZi:uF!#%GaQbFbkb5qjpdkb9?5VAG:mi/t^6bi*JhHd&IAqd66R
TKBwVJ hc#TQj*BA4b*4/>9PMJ%GW@WKjlSD!<ue:BQB>@G&yEw#l*FHS4Xh4+tYRcELe@M=Pj9DA6p9@<<yyF!
l>PBYd mdL=y#J85yjcw=qGHG*B:I11>ZJE1\bHW8MP@M^Gc*mM5HD/Gd//w$9tlRVhlqu@&e6Kw55K/tWTGn$T
HPci=m tlV>8W91bZ^*C>6J&:%IRPML5/P6Qh?:t*Zd6^iqAulLbk%8BFB:+waH*Vbc1?X=nD^J=Mt!HFd1I4PZ
WS9m5\ <cFlZee::Z+e>CYki=N%MbF?E?h@my@:*Xqn9ne>a4KBLb#S9c?Pqy^q4ee!#k*VDQyc\4Aj>Dah#MIV
$^iaF> TYl$&LW1@lhhd\EZS>Q$m!apPEGDY\n8:lde*S%CeHiHJLkHh^b*ThDk:4JIeNjFdZFa>t/i=*9je</>
cu9nAV =>dP>HSZ!*SX@c8/=<e!C+FFka:dV^HiG+RSQZn%p$?jld&kTd6b</85h5b*!=ilbTF*l^8qkVpkR&nR
ni:yHD I@k=H<qqC?uN4yMLXmP^Yw^D\?i!j1M855<JhnySqF@iQSV<LB+hiNhSCSE^KFk/!aWIZy@Q%lpX4:8u
&lLMj/ ?Zn8>YJ8Tl>kllluWX\@jA1VJd=jb9Wd=NXu489CPh%1CukM+>H?QdBiBt<?Fndj<b=*#P=$8&$b!M8P
ByN5#? u=D%KWK@jRG9\Z:kdml>1&>ueJ4keRt4+?ucK@i&:/k<RBmkanY:eqd8qYanyZw%+:e<+SD*X@AHl:tk
dctHi# 4t\6ZQD>&GZcntnE*tNR$JPSI@NGTj$G*9p5VBqe8a6DH1B/kKa\dkEMjca5*#C>:#y9>h*8nX&!>8&p
GF$T&: e6tnq<k^pyEilVHHR6=nwibJ<8#$#j#=jtV<pydKLm*p%HG51&dBK9biHZeNX@8N:a/>GqLVp@H6<q*H
Cj*JC1 !u#1Z!!&BHVpqJ+iQjpJAqiYXkBI+8<4j#ASXMPFu5WwnIVSl^+RXDw>QDB9Phq>^6^1@PX\/8$hYub>
9*FQ&k h>uwYSC/kHp8<HiMl1$LlabDAeCe+d$+=nipe5$Q?6@yG&4c<PZXW\t1>=npDZ+=#KRT4@?J*YNm@ByQ
cy@MP< YIjJmCTPaIh/u/ejWjGu?WqN6$JHF&!5?&VpZp#9jmX98LCjnQjy>TiC@Bn%:I=Xj4@j4ujPi&hd9%?@
*Ihqud i1XJ<5#uGwRPT>$86l!%m^^maRGwiGZ5>PTebdc1ddJiH/>/E4*85eJE!&hw$pSL+c@?e+4ZVSSe69T%
81FbSA !N=e/dauJljV!/9DEwWTq8RT>hRq:am!EM%!VVVtDkWD5uJaXSeA=QEyqJ/XSyllwGC8j<8>CY1jD@Q@
iGV9P5 :#@^mkq8q*c5&wcl&:X!9aj@DANLtkhRZVCc/^6k8wBFd$lH=@4p#Dp\%I/^=51i#=>W\Q&R5XPa:ZC&
#PSEQk XM+nZDtH=!wE/&<$?jDVVe8/*KH!YZQkb+Q<eVG>?jMj:$8FwJ#eR=G>uGR/tMlnc*$JJ/9@bB4=SeQj
iiX:9> \XbR>EAT@u6u$Fc9j#/K9LGe9BFL1@wSTDtH&k6&#yMKYQqYD#VpYC\:81jNb6t\kGE4iC&8ET:+Vm<k
&BCtBR y9MaFt<Y^$+5d1tiCCFwL?EAjHGWCHEElyWwKRQ6qLSEtD!5bN+X9Se:>IHa!eYHL$!NVGt#K*1ikPdK
86>&u8 9+8%DR\wX\&+a9JcTKSGb+p@L9ZXWm=kP9A>14Z=X^&5nG1Eutp&ZwBtAlni9YAVMT1&%iQ%cCKhFF:j
+Ei?L4 eLL!ijIL?N%*CDQZ/u$hLGmE+Iyy<hbJQ^5<lkG>RwZPY8tqJ*Ky@#ERp$e>MA5LCVQpa?Eju=TqXwMa
/QMnS@ :e9u5?6KYMP&R?m/!e5iuI+S@X5>n@XWw>qT=S!B$dMetKyuT=X?^EB?>#Y$Vhchky/kR<uI=X8GNc&8
I1?P&$ uV48l@Q@e<Lc%/%ZFm?:y>q+@q&<^9StnMdyCqMPDV/V@F:4<:yIE@$LMqjSj>Y>>p\>hu6>Wa&qlm8P
?mTSe% PbA>HiWYEiZR*epKyp<%Bq!ZN#@BWNXX&<WRRwE4<R&yAnQ1=LKSj99G#\Bp%dbG1&QE$8SZBI$$Q1$=
H$\^mG &6dyXV?Eteu>tPWudBa1N#BA<F%<\%8mHc>yXY?DmYH^6^c1$Py?#MV!9Xk%BMNb#W+6WPVAHH>h^#%q
\4Dm+5 A%E=l@Ny/Vy=XEXVy9Rw$k8&ie1lZwbFXK<e@w69nLZ$ew!6@<n*4!=keM8Z?XiY44T@\kT8\q#1L+D/
&:GueB $64CYd$\LM1@HJp+/c!5!Hu?Ze!L%+%cZN=?KNjEM>K6\L$^Rb?Bthj<1GDmc8AY!6j:%<L/?Q<5>HYu
X</jAq AwC@:V%A9bnj!#=F9I</Fd9S1w\GwddB4Nh/8%!!a5:Z51\?NG@+>%>?h:X9Rh8%cVhc9\dXV+>jnt6k
9\m:aB I$G495t\ik&Rp@#n+@=1V@</Pk#%cY%8cbeSTq6I>Y96S6MhBKwDy!l19S#:4<X:/6NAh>BAYabmR/6@
<@MBZ% :qT<<4:8M8ZmhPWlDVbX8b&?9$4:WM%Z=FmbYR8MHl8lV&/Cc8qjyhpwNJh!i%mWY/Y6\BD>h>Ny<+@&
T?pH$A lP$WlByli<q@!nc\^Wub6lW#lLIHB5Kecu@9<9Q@CShFdjLGDT!\DT659aAB=6<6?ah!>VJ^VCFW==8K
^+W$p: M#55i5@patcwl+Gh@Lum9qNG?dMJElu1k/P4*&jm<mhZTI5%VP$Aj\t9Z:8kDW#aAhGXpw?RW5Y%LVL!
4L#q?E Qe<&/:19GFYVj>=B>utwCC&Z@/klCn&Ly9=ui@Y9piW<Rd&+BR!\6X#1jWVWVNHHw\5w6=4V*4@t9nY#
c<k*kt <Y8QB*9MZ<QeXKGlVcHFbt?FjKP4eyakPij@BIYRPCIMFE@d^F*lN&LHMb&jZ4$1S$HwS@FB!pZI^&L/
RG@luA ?m4Gq&H:Xh:jZ:H<myyX+p&uw&%ywc$qyTpy1aelTl\RJE45A>w%EZ1E@tm@B?+DSwLmIhE9<T?MY/Hk
#4cQ\5 4Y#?u!#IK>AGDb?eQd:c+P/!>/X:>$JteYlhdh8Md\aYJ&wkRujwk8GpjZFdR<+:V&6QRe&@jdj5kt5R
LCy&+d tt</16eeHaYCD1Hd1lqYEA+@+QP%C1lkR^n9+bAX1AKal9V:QEYAb$E*\6TQkT6BK!?dBpE4EQJe$Z8!
^Yc\u* k9tV*EY!e>B>qclNEPM>nE=bep\iaNiZ*A$wePkjGkT<!N^5RE6WApCAWyGAaKD!Pm^S!R$5j4n#AyRH
*ec6Fw B1#hR9YkT>D#6\:R::%jay8Kch91*Y$F8EtJ+tJqyA5LNYI9Z88jXdcl@tlBQp/?Gh*^+?*I8q@49KM>
8%R<l? ?AlV!*Ip?bPdqjqLyLBF?$$1?BaZ%KkCLQ<*KaR/!VRPAYYN9/K/Mdd\D\Q+9y&d=eNZ&V<\AkZp5%+w
*+wJ>c kiMt!WI*Re>bwK+>qXKkDlRN9G+/!>%Q!a$1TicuMinZtY/*li&N?ijl/FD%Tj:=J8nmKNDpu9\F@!E%
a6e>dB cQ%VdZj:kE&k1/%5L=PJeQ\#1^6&iD>>BZYCkRLth#?F*CqRXj^TF9jPq#?YEK@pR@Jj&KIAjy+%8Ni>
J=iFMC kj8B&eQy5WRyJQd1ueIhh?6=PLQGFj4cZXK9m&inwEimq*uEeMnBL\j+j1lRcPLQHc1IHc&n%w:Hn8il
SNM9&= DR:5+h>Z9CTS>Y:n9aLw!Z=Dpd8cGRX<FhXc1SR@TTCIW\/EL<H^5XGm@?kj<MK%yAMh#&%c>\5S8kpF
>i@MZ1 ::mB4&RAGpADJ%Ed5pAF<CM$CNJ%jc<FuhEi:c5%@e*dlIT/+Aq?$QcInKwc*/IIN:6AZB!h5jNReRl1
HG4B1& niy<Paijl*9+dW\tpnl#A:Kt<&GZD#Vb*5&XM$\&VC=LX/1XB4:$$APlGTKwAGFw48?K#:ED1AEI6AEA
aIIViA AM?*mD:u#?CnRNEd%Y!=I?nY6w1\!VMuMId=<>Z9*m8MYBFT6>JD<B!$V\mCKwZ>BmkmXl<TX$wb<%at
9ca#NQ \\G8#mS*/&NAd4kGMKLhQilPqD*tHLK#$luk#KJ#t9Vp*8*b&TJcp#Chqd&:=%>F&=#He56!y1Fu:!wi
/@<M<m AFyu1hkT8MY+P?:8Cnyl^*l1LjX:?Tc5%H+*=*NiAb=!!k%6j*ET#X1Hj:K:6uu!ik\ENEeQRd6=+6hZ
Cnd?6b 8aNmN*M9kYtX1\<RkHDZm<>bNllwCSQ5q\?wc?lS^A@\DL=6\=\M#KG@nA*1Gphup6eSHTeyluynGd*1
akXAJD c6I/qZkylZy?yyHXy>EMdw*#eI4tyb*n55cQZtj%dl9\PqNL#>851JL$P#aV^l89QB>>:@IyqFRhw9Lu
tAVQ/q F=h8y1l5H#VL@//:CyD//8\PbA:6iDB+pIFTt$1h8?1eH@YLQaEMN4S?XEltBMAbFYMi*Mtpt+ykBEm#
wXm!1u RQiT9^Pp9^FwWD@jJ1=69Au9M4EX:qdub8k&?quQcD@h>I&NE#IG!9Y=j6cu<uuAnZ>?Vk#cSY^H4yIS
+jD!ky AX!@jBT+/JDY9eZ^PZ:#wA<$t\F5?aAG+/^8MeC5L#!pibXB$Jj%nq@RLFGwM<9y\\d$Ch4ti:w9:dG!
i$Anpc aCFlnM%p:I?M<&mBWa+VQ9nDcXX6tGmQ<9hF&\^Z6I&1:@6S=AySli58lZ4w>/@V#RW1Ty&?u8Dd8ReD
GCQ+EW wFTuQ#@b9$hk/MQN!!cNLG8\a6K6m!9u4h^Lt<@Bp5yk6<>#uB?&P8L85>A>eZETRPQIq&^ZnZ*eR1j$
CVDCt6 mnc*!i%\519R1jT<5R6K@q\LCuybtHV5/ty!cFaauabGlyMeeLS>y#Q<yTh+%98q&qn6^5aFYmC#GVNZ
p<<Btk =DYBE&IXYdc@!TK&T!c&T@Rne&#b8Qdqp&DTDe+=l9DKm=>8?:&6EIV^TZ\XH5/&P%+Aiwm#FRXiwkZ%
-AuCC+ 00008b6a9c6001202b4 Page 431 of binaries2.zip
!/iLRw <S@!*wK9H\*BY&Z*?MIP:Ze*D?jH+D9YP?k#@c6L<Aaa$&XCqDY9w*b!aXJyJDuRBd1P/E$5KuLB:^e6
QalTlX GT*hcXMhQE4q$<Ey==/p%Kewd=R$VbnR^X+<$u><>Sk\6>*P^eI+NGi#8ZFI8XyIpIVP$Kl6:jTwWhwp
ZSy/Yh imVwXw9l=%\%ICwaTAd6EQ%<1N5tLVG!KK#bwZlt8Dhy8Ai5<j9pQW*N==&#I^QV&5m>*6bRLLV:%N^c
!GQu%B Hc$D*htAj8dEuAR%1Y\q*T=>4i=8c99n5:^5QKF>eCF:8@G1qdhEVYDk6hJL#iZ5?\F&TENXTJeY=VjQ
Ey\&HY Q\1!4+6i#d!1^CXjF^tCtkKRAZ5am/K=kdj?n\HnuV+\YIH?kJhRRdPZLLCCZ^yWFA1^*HD!H9TL@wGY
Ljq/M4 iy@HDK*#QZt!F:ybBRPnWIEmydq?DJN$4EJkwAkh1&nl#jNn$MAh//QwjVw/KXV!BikpQGWeiB#$@9DJ
I$8<Pd H#\N:S5:?R/?=RSXqALmlTBb#%dRS1m1@AyeI^#IJPY4up1P/LnJ@4Hb$A6aK<Vd<>jJd&pQ<%kLwY1Y
t+^IH# IjumkE/\wbAPBqaDdy:YyAl9IdY#?pTNn4@W*ZVACyZQNC6y*tAqwJZqFSCKRnZY>hC<Vk^cFHyCBABE
9wG#/! AMBej$tVGjB&MZmyEHV#jJMM>W+t14Ipj$c?^+GI=5b&pD>%QaPBwqk\pe<BMFqkl\9$FH1GGAeZAJyk
yFDcS@ @u8ekqjk#$dTDJ<1A*^nc%<!ld>hhb9Ewc:L&?JjWAXKCc9hDkWTbNPDAPe9SK^>D+W9hcdu$HZwJu:G
w=4HAm >:58y9H4V:?cJ??kc!VcQ?h>EnekW!w+W%CuFuRS964Mp5dj^HHJMh/Ma?%6PDtT?+a4R$N9L8jc9ybM
hI@yMp GAFGk!A+##/kXbQVhwndw#@+nFXWHpwSPB%+hK>\b\?#&PuG#adKHdSq%kQ/1HKhG>S$P\aVI$wa+RFW
4L/#AW EC>C@XiY:+KZR?c^R4C%n+=elFbF%GjTq@eF84h*DmGZAc!CX*^A5EXFtNkQ>AJV%q@^d$!iGuVkA/Bq
hWQd:! ?eAH61+5%pt6$\V+P?kl>By/!TF6!*:PG=KP&%F!^eXpG&<4tuy%t8i?/QJE&H=b*9Bu^6cCt!$#VWtB
:k4$S6 yqlDQdKe/$@mZq9RDj4GC?%>d1A&GMJcWm9/^>j=D8:Jt%qTFTdS8bM#/!\IMAHD*l%$+ApCLV^+AkBQ
tm&<EZ HpCAZQ>uMAnpJC4wA>wKe5F9jl59>AL6lkSAC!HlkHDlu<a\Q6Ci>b4nAA!<ika@t>nLuKi4CN%X/X%D
GX^b=W k@bYP1HVy?FR!+*ARJ=uN>D5W/HG8cn\8HFk/kQwTCdZ=*un+#?y!t=ZQKFQX>eBZCJ$GkKMARQhtlhF
pKWDee eJ%ED5DHV\:6L+Clic5H54@iWQ#<+mRECdy9tYeluINP1Z!9BE+Dlje/A\@cIadkbX4RASSRtS5a@@Aw
Kn*=i? CwE8R96@u*@ymIh$cEyebbt<?Cd+<Y9hd8\<^n>GQy\<:^#i#pnXA&6QEy/mn=<+V?=S+kB1$MXtkQ<D
JAC+ky cIP1tN#pHPe=E41kVkI>SAeBIB6CMbT@<V>y<D<Mj:N?/\a>99<a4<JIQ@9qYKu$GZNmXVu$QiQ^uiTC
qZDGHK tt\!=#SF5B<$1GELik$+FIJJ95</AeMJIF:WJWkq%?hlFknMDSA>l>yBK=P\aj8Xbl#kMml*&pua8l$Y
MI>e<8 I%ik\1@Nu+ck&$H^wQ5ZH^mGlJ/Ce9<JDIBj$G6Ey:q9<1I5RYGq?^9jDIAlRKDRe@:LLT^h8GAQkIYH
==^&Jk DiQ^w64#S>H4FBAIIN9yK\Y?lkJuwdKhkaBHKcnkFi8Ym4>J@\Iw%%ejGuR:WC>@b$RYAqui5L<lB\Md
CSiH+N HpC=>^9CJFAJaP8LqBMMm9$tcCc=AaiR/QQu4%HAB+tZd!J9c$Y$wMJwD=jVQkh8RIqeZ^L\FCk*ZAl!
H>EJn< DPtCbP>8cEE9STbAkE^9<MdaC*S:AH\Y4+#pA>wDhEGG8^=TA#liWK?:RJ9uk!<?F><&km=CnkFZn:mm
E:4n\y ZTLQV=ZALyHt*ICk&yQQEAB5LpE=>:XdTFBB+Aw?ABRWjX4=A6*llutN=dMX/DawDZm:wRI+dRhDttF8
1bC#+G h/@5@=S&>q1$>\tnCklRKRTLdIM*&X?k9bcXw5i8=bX#GM$awFKAXtu%ajM55M&T$ieE<CB%eMPw5dYR
bT>\X^ ChBaEn*8kRCtYFX4lVq#hpBQWmJ/mcXLCuhS8Y8c\mu4/iR/#!<9W6Dn=*Nw^1LTJ&dQ+y<!yLn>d&%F
^^phiD Vy$JXbt@Cl!ljpY>lV+u=MGnZSy%b^&n1S^b4DcKBea:BRMN\AV69I@VYFKQ*Ild$d4c4L8FJ&GJm1wF
LeDdZa \^N&qHcWLp#Zyt=V:l>?B=&y\NRAQkiGpeM$ejE*EF+B\EE!5KD+BD&CkTAAi8Xe/WWnBS*P9hkRNSF/
cpY$/* mBh/HwABVJVh=>LM=!EN/GPT8*q?@pLiFuRQ5IHmAH8MjY+^W91A5Em<:H?D>@nmG@Q\hJ:y@\n>A#+Q
%q*%$t tmc@k#JDP>wL$JDD>@liZ8ta^wCQ#$PVnF:1\k%StV<KR/HXLh!5A195Lln6p6ICDNQCmVc/$VMjVCNe
n<d^nw 8?!d6@N@DJjFMVS%MpZ<H8/nTMW%JPMV$we?mdaHdZ%Y<a>9XLp%8KqhDKS>DE4kmZ:A9!k>A\NHe9%H
ANkIh: n&NE!cE^T@nAwbik>I/Q!!a:kQMltW6RiSYA1@FW<BFKXGaS%AX^5wR?Jh%S*GwZkpX#A^I/Z+=8QJ>d
uG&JG+ RIBK1M1h$DN5W%pLi8\Tik!wE@$DB6biR?%tTkEjB4ckZWy*L!AMN%AFNBeEFAdt?kGE:pSk@nMNjlRJ
F=!nTy pkEiRL1Yjc&l#!1ZR5?+6^mm<L/GD=PBy+<AjmBAa^=/Lqw/D\ZC#8u+a9J!WG:%?n%AFAPK>kE9jA@V
@>Sbc< tJ^L^EWe?QRC@S&9HSY$eRiB\lLpJ8R@EkpTZkPZ@md+A#AHt+bqeM++KD*A&1^EpNqwntWt*:!*RYyP
4thHN+ #=/h@>\ajIMKXDL&9jRuJW6j:nqM&#!AeS=FKuN>:qF9+T>eaiCjlpJZwNjkB$XNIHADBIlwj\+/pR$E
ipdEA/ AKIDl#L\D!E9j5pApu&F^\CG*FAwd?N5hZNi%<TbJWuPm<8L\e949XZwjY++%AaYw\H:n@&?<bDyP@\1
1D&1$8 %95tH>C^VJZMHpBhWNVi8Km4QBAG1#Hw^y5mbBqwYJD4i5Dy&ihuJd/kT>dHnC:wu/AMEhb%<8PFWwlw
lGjWZb Pim$dW+RKG1&kSX51FJP=9Nmpl?$5d4!$qBlBHte<T&By5DCT9pnQM\aL#K6?Ke995CHNYAyeBW/ttj%
#dSb%V BL9Mk9cClCAJRRqQH%?k>&DW<Ii8@YeYM6l##mQ<*#XRyQVW:Sd?SBT&F:B:GWkR&dnDj?!/CR^ekGK5
ZlwHN\ PGNkQM4eE*jiQlM@cGKwByZi<y<iPIdQH9PDjnZ?BC$<VASbBKaGmh*8QT5eFq/#1MGC\Qd^CTTw:^+M
N>PK>$ ZZ=>BndLCRV5%:hAKWby\e5$Ycw*k?u4RV#%d+JGey84Zl+upll<N<IlHYCV6jR18phAuNeX>Btbd8YP
qwLnN> >wF*69qJXFnwJSIm&w\^ql9I<^S>n9F<D8q\+A!CbN%t?WW>Nb>5dBuX\%bLnE5u@yj5S$cG\GPIpRN5
eyTD<E HKh4c!I4CHq+ET<?lH!=h=6XbPMWpL*!lHtZ<jAR6El<C^S&DDl?<X**PTP@GZ=ajyp*k4c>\Qp+\Hed
ViPJYR ZPAG=9<N@cil@?!JlMC*>bDuFPk/ZLZw>TjZ&yj+J^YwDQTSK&mE*EwH4FLl$QHCZ<JknCmLpXp>HPq$
nAX^$G V=T/%Ku#aB\\AFw%>peuj?P$C^5DK941u><<5Q:6yiWh+i$XH8EX:k*LSESEiEYEi*6/iZqbSYcGl%qc
8\F81h iwYF\@K\ewSQSIaZ4Na:MnI<Km\mwmI14:\61!L4S<9Q<5#jFY&bKK@?R#>S@$uc&qw!&9/lnM4$m1mw
/M8DN/ 59VIm4cY1QL$nQVM!M!KqybwFQedD>9*>D//Sy>4=d=Z*DD<CTc<5E*Pnpwd@cFpmwXpqApWJWl*?FEY
qyePn9 V:<6@?HmCBketKM>hQWTNQ5IhVyjluT%*WE^hq/CSA<kwyW*L=P%BnXC85yd:b+l*lD=KR?<d^&&^B<^
wL@n+D R!mR8cYM4Hw^\$$yq6AZiq+EZ>?NJt@>1VNYyCShNy*QiuY$p:hh1j&VpSFa1>@/Yy*yR$PlEPPY/5!9
uW@yw6 PqWq%:dZ!Y>Pcu:>in9dpyHBR$MZj^ty>!TPp!BILhNQM:GEJp8EKh<6W!\ibC<q<>WXLc1+mWyE#PV!
*R#1$: >*c***e%T>E$>6q&u/LGpw>&?juaZQdamy!euP:1=iKe#yIa\!qMGdG4=1*j$*u5tTubImIe#JhZDEdM
4yWZB& BNZZ6:W@9t=Jw=Gcy*:FQtCG!SSHbW>SP>SEHdXJjcJnRC+18I<dQ$4@Vh@KYVjquw%>9#Z:JC*nuVHQ
M&h+<b 5E5?*:C&IuMNRR/nZ?u>$%QuAhLh%@GE4HhTQ1cBTH8VI:Q=WFwt/PjMnt^lJ5A%FZKmGE5XAeJM4^kl
?kLP?^ ty+VKn$KVy%kATBc1eM#XTSb/hZ$ibHe\9!Y*MJVyAA$VXi#WaNT>d&NGpL51/LlQKaG6/5bFcD<qJNH
+5bpVC ^!#^!ue^^p+YT$>L/blV+lwDPjJQ>aH?4i^T*J8:Z!\EJldIX?GWucDC$e6jFbWKS?uFytLn6HFZ%Vy<
%?hCQQ qF@Qi<MdIK>/\^<MFHeB=Di^/EFjLFlHQXK!AQY?1+p16F@%/?8!btdHC4j^elbCbQ5Ib1ShV*L=WL!K
amFwtM 4+>>\?+HDkElZQtyVIaDH5+a^*VbiCqLIkdTH4pKBw5FtPXqG?V?<:kI:&VDJD<%mhX:X><Z<5X6!!^S
daHa</ 5RSi&Z?<FSS=cB9!FqRBFN>nXQR6jT*=^E@a589YAyE8Q=w#nLX!<Jt!H4!^yy$%wu+<DjajE%RP\Cnu
dQRiTN T/$SDp*%5uAXjXjKKD#dHmD>GA\TTD&&1YFNNA6%V4Zecm9%I9h<qI8weDDq&=uTeiR6Gn&\$HVC1*tN
jT6Mni L+Be1@i#$e+^qMw1\IPH^=C@mAipyXGjw=FWZCyIF&n%J@CFBNF^Sq^BPuVL1!1*#qL*8q&/md@6nQaM
AyLK^^ \?PNLebdXmyS#CC&<Y1CJb%jVe8c#iPh/<$b9iGy4I=eutl/nuEGEp=^6k<@Z?Jj*\jTpdCbTWS<F:RI
mkepmR Tdn&tmnqy+VWnijZ/YYbF?=:G+^h%h+QZLdBy=Q^6:5FH^A+hn@?SnRqdZXdAJwa+@8c$%bN6QF=uBP:
EVNKC6 bjG=VbJj@GtZDnC:JLQ/YQtlEINDY1:i@R5VahSqXYc5J<jhl+?*F%\L9D4q@8<CQTIDw:>8GH8qF1@4
mWpdaa ykW85i!ba/k+QEte=/tcT8JQ=DhH>khHhPF9K<@N/ZH:hyQ@eTQ>E%58lF&<:d#>aPqIwH$aMJu$VK/D
%!kXhn 6KH@iuZS&<TBE&Rl!6pSZJXi<F*Qp5A5LQQJ+RWQuik8BXjwJckmC\Xu$WyT%L/hD#:ntPd:A@l89=jX
QuqpMk jql9TKKZ@P!WAAja%@eNDw%A6WA!JIT6*%PE8>+@E!h4$9&&W=8+$VaA9mw#i<18WmF#1^LlJ&EE*4!8
nq>AYt *t6bLqy1MLPPJn=8%@&iLdNk=ctii@k6ynmV:uT8KBiaWk1aSTbp@yH+w<LRY^/ucdjy\%iBISpeljJy
jTHY#G VBMQ*kqnD#EDA^u5EcPD9\t>=*peVu1YDW5&eduH$ykj>PELh66^n:ElVP<jq8!??8#S^8Lmc\%8!+1K
CL=!?D KpkuK<w*F^@6Y/6tLkb%DTeND/dEM4X@&6t?PnC@<lE1#$+e6V8?%w<S=q%&W#/cYGJqGuwt9?/i!BJ\
-A4^h! 000f23990a5001202b4 Page 432 of binaries2.zip
ZPJ9&9 $eTmH#^X#!K4/W#MB@Ccq15Kh6VW:6/%EqqQ=?jpSZ#Kaa*9&F=**Yqyc$qMae*SQ+>NR+GTi4<MK&KX
:+q%Sj ckyK11Geb\&e&jRH$MA9aYdpe@eL/J%5aa51W:=e*qAut*pntN8l!Q#/WDj=8pQWVtMq>1TE>hX5cRjj
G>GQpq i8dued449a\6%6$bcVSTj?/HPFQ%1B%!9C?a%m1*=cQlPJ+5LTyj9+Ep/DJpE%JQwW&JSTEuit&q%JV>
IkmP#h ?S?WpunLZDRmPKwJ4>$QL4ZKeK%a6e6ujB9jiTCS@H%jjK!h@QJCa:ZBjHQHyb<=\TB:nHHV9EiHW>cP
Q?TXad +E/&\!RJ+45VlL6P@p:$X\eHCJN<#t/FNaT9ytyP6ha1&l164%14n8dAplSI+t@y5A1LlliK@6Va=6/P
t4pGIn ycV1YVVW$!15**Xe%j&McEMXMpH>jN@X%+VZ8%m@\&#$qkLJJw%D4hcP1Y/M1Z:CIqZQKuQ5d:=85w:D
S$&^tj AN?:E<?:H4>*5SN9+PKtWN&cpF>a:<9j&wFMm@FnK?=Wbw6wZdCiSbYHFG9$qqZ$>nu1=*N<d%lHQVtW
1m>!Qp GJCehXpym^=nt=bjbkXA88J8Eli:!HXCI=E1J11ae5:+wc>pYJ\wCa8Lt@knVlRPQ$kqI&uW$<&%jVcL
i:h^?4 j&*m<##VT6ZTR$81mdI:nSKT8LnQ4y+hQ&QSJ#6P8iNE%:y=LmmNHy/iHb/iSc1HFB=5M<we*Y/$bY?C
c\WG*6 ApAHwy\w9b$Kwa45X$6%WtA&X*\RcSp9ea@$<XWi$^6:tHm1V$le:GRN=&EN@iWX*Y/CK8V#RcjV8hb@
?NWyTm T/&BM$P:qS6YKJQ*dhT$TcNQIduK\iW1qNWMIKinweAS^%V$Tm<W=tmhh*%TAq6WYa88&SEB84nW:GGc
<t6EWj QWeXMwLyREk98y%:Wn*:/HGKb<*@iRE+<W>TZ4:tQ*qKHcJ%Dewiy9qw@SFlThttdK<1y4q8#BWCDw#Y
1KmtTp @cM5#^t>bMej8QL*4>wl6umV^tCH=BqZKcdG&C::&jd>Dhi@8SSC&W>W5n?RWC!HITRAu<AwGhA>>Na>
+eQH9t t$+pR%ZqCIhcNF%h:GwQMZ\Hi5tZF\pdCnEq>XhD>!na:>Ri:HCdWYW*Q/c:<n!9N+eEM%Z#cAQM#nD>
cJMn*S MX%AyX=l1%B#&YC4P<dbWDJ+lYY*d!WtJn6tF/VaaA^hLeHSjMPlGY=I$H?^$%%=&kiqaApL%>iN<d:k
tH6<1W BDdJmm@?M+ww?YNSYSM4VK9+A^hNj#t5@CM\6aXRF1j?19wVceYuM?1wmZawB:KwewQW8^Y=%e*#*4S\
6A^D?S IYXmetj/kDNdq!\!k&LYTqMDG89tlcG>Vn8VITPN+yljM+ujkkGYQn#uHJq4XpaqRRyYmYQ<RjIeeppq
d6&u\m 5X1ptSXuy>Iwda$\j/nB>jI5DNWX/MZCX5DPhcKy<ih9#::%+Zd#BA4uKlt8K@5JH8%j8htQ9DhANe@c
V*%V4a 6#P#b@w:$a5t@lPq9&4H!d+P5#wlL=Qqu:#>ell+ZNXMyZHIEWD@S6tNd^y4FtbnGM4\HnIZP%qkwPQH
^I?*l9 l6&!*6?%MNSRe$5dW4cqk@Jd1/>l1yS*=4^+:%#R9/CL5*tW<T41iZJD!iacyG:>Kb5CTeCCW/DYjw%Z
A6Fnh9 #?KqBQJyLG5y1jlP#>Ep=*$K*pBu+\RMSQ/Cu?XKYS6EG%@jKX\jjyV@4SYu/R##h/hK8X^e=^t4bIwm
EJ#1GB <QYibJ9HQ*Y>NdlPFXWPI4nPqcGGDF9V59qe5GBAQ?p$heydudH8FNut*8Ta%uH86*::jK*<6$PXXXK5
>$y&ny XWcBja1=#WZqAni5E?mn@K?GdIa6uZYXhwCQcD$6$YT<lc:R4y\PTmh+T+hwMwmliX&bP#N*>Fi8Myp4
HEueYy %a#LSYYdh1V/lD:Z@y#&<+%ybX5nAXikd/qnQD?&>dXuKdEwdNm#W/1/yw4jt6=c6WJ##mhF=Z<jG6ib
4QkHEn Bm:1B!=l9kjVZ*aTeJ*Rkqw:!dAnW/Xkk519Q\GaqIFNy5Cb5A!5Ba%uI8hqePGIa?hBcM:uub\wu8LX
VTddjL Hwj8!Hd?BPbQF<*<FZ*HBkQqX=$R\@@wjq1GB&abJlkYc*j1*1d<w=KupTHi9=Ztwac<IhKG$myTim$H
IFSw?D qX^%?=Y<BdXD&+pPLD^y^HJ*cd8%^AyZ<+4&N/e!KC@Kw*K=Bt%1G?y@edZA9A\VpISleNK9a6BDZdMV
NQiyYE luGD9bY6FXlEleYTL#!?DlP>XS$yhl9JmYNLPpTqKpbJ%<A5a4taS+w/bk<9&=1#F4+=WYK=*m4:4GMd
/c%1L> cuCh6<>\a5%n!6<I48NbeVbu6FbWhNw&QY?nWqN^+cp/K9h+mFdHXE>njDHt=J=$qVqiYDena!ibXFMy
t^ZJ8p y#S9wbL8wG+6ny^EVb<EC$wtQMH#D96AmmbQ1#Sct?b11yppq+>bE\>KV*V=%LB:u@:nGDAAieli\A4P
&RMLYe qiEY%A4d=*l@+*ZdQ<d\b@wGc#l>AJ6G&bdSepNAW%Kw&6?&c\6GpWt\EC#9l5Z%ahqj1YF6@#b4&WtQ
4MmhKT *Dd?&!F9Yj<cW*$tQLaKC/FKQ<j8I&^imRF6hjGMHM1jbk5bQQVqDl/?IN>:J6BE:BX1S%yyH##YB<#$
Aq#$bH FFly\!R8!N19ZBBGj4ADTKyN*IkEwY@<<\F/YaZt5q^/lh6kc*&HKejLHXlhPqk@PL8n6/M86GaF1C#W
<RQCm? *A*=?Bp#M8@9q@?wRpIaDn#?l\#HuZkd+t85?8PX1GDI:jCh/G%*#j+%16I$hXF#h8^aGb/ytGF#nFa+
&@R&He P6=\E/b^ybiw+MPShVJML&1yH!DT6W!q:he&$X9DDcn^uVTS:@A6nhtQ4:de$5Hkwl@#$C9h#p+9ycEj
/y4Tn\ mZB%$ud4#=nkj^nJBHC>IFu^:>n\/eSc:tk?He*+kBj$^pA&F#YBw*W*\AKT5mEG91uuPcj&dD6S\#uu
heA^5G GZ8AlamuB1mXXq4@WVL=M/HFJhy8K8Hl%YmP65ZwLW!BRaaqSai%^hRC@4Q$u#Qw6@*<RTT%P5@RY<^q
G?ILu! :#>Q>9G<in6jAu\CSR@q^FJX9C&Wt:@5Za?KWnIHWCS9YMw:n+4pR/$hlB^EDc>1<L^l&N!BYEa^*YuH
Lh>?La i%t%%RT5=b:B>N6Y9:aA#SlAL4^@DlRI/95\Pq/9b$e&I><m4k#$eky*Cq5T*1>jW^q/kV*k#5YLFtGc
WSBdAy wm<JJSQIju&F?yqI+SWNPS#Tl*A9C$56KT$6TTpyLt$4K?5:TBhpWA?mj!tB^6b4dIKtTH&S%t8C:PNQ
R8mHyT jVHec+LGjnGW%piP>pLaL8S&4<V?<EAJGWJ4bd<Qy95hIN?4JKZt^eG^dEV/l>@LmdC@*T95w6nw^4&w
t>$#K: uEGi=Z#61e9d/X%eP*:a^a^PVWKSI&TDQT*\jP$a/FQL9Ne^QPb/c:#1\D=@9=/%:XKdtGJC9PQ9FM98
w?^c!T #+ym$pu@9N1+yIBPZhEwE^qThN8=pQhpbQh#!/=YK%S/IQ#yjdp\:Z=mWuye<yW8cm?al5tMC\ji<=I4
qH:HhJ m!i%qJI4Q1qJ+i+%F?%w4Dd+y#1*1ty:cc%+w4tb?DblZ&yWeM/#JEFId%+%^*CCSt^W5MHi&*IC?<Xw
4RdPn< @/Wa%@*59FCWp##=6!lMX?>yA<S#/qTL?%XVpE$n8DZydPX^ui=5?kX1qFbWa<c@Pw+9J+k#4:W*S&HY
J?%mwa QN*9a6!$1X1?=lSYVEjI&/\ZSh^iY<JF^Gk%Hkh?$HwXac4?<IWXwB?wp4?mEwPkye%e=6K8Rk?m&L%W
KuPSAn AQY8:%+KJttlYAnSS8pJ5jYSq<<JqGwi=YmW:!kq&MD!lyb$/Q+&*LBM+E1$e:eCTZbTK1>Gw18!$4QT
c1i%id $j6M1R9CJ9Ih&LN@@%Ili@V%R6VdihuMPX#8DM*=VQDdy9Jm4l$jLuMj#lL*!a^bERFnM<ZD*GYlQ^p@
=n=G*W L#JtBWA6:yqJ/4cPp\u9mH4hkdGTp^tZllp4J*>@MIC8j8F%TA?ZctSPT&V8jeXe9YJ=CpiJ6pTJ/kET
FpJP^F L&Fl=&D9F<ZIBA+DLA\MCuci!$1dcEKq+WFdY$Z/WLdjPVu4meaeJ!IiE\&&b=RceKcK:+bVkDjuP1d1
=b+E5P n!dVuJP@9y9?<h%1uKl^eLQLMp#d+JS9lT<9M=L#cVS4Rm6^=&8Xm6i%+m\#9S=p+<^T1Ftmih8hn9Qt
N?wjF< RpmS9QlcT**b\PGn\cRNe&kL$+HX$t=h1wq91e!ldVke*@8T=JqMDZpdJd4m>\ZJ#m6FWuR^\jCt$q6X
PETMV1 mZySSipJCWjKemPC8AK%%hFDqb4ESG!:Set@nCRFaE>MuuJcDPW+>^ZLu\Gj?<WN:ePa8F4w@KPZ1\8M
PHae&u w1t/<Ym&X@S==cW+BCw=B4K?8NlpSTMpTVPD*TNt$IqL8mJT4@YtKy\tTkuwY*kywQ1MY/HV654E=RN<
GG+lII k*d4Xt?!\yqPPdePBck9!$9b!$N4yRQKH:IQE$yq^:e81+y=huePC#jiZ\H1w&cDqV:a?1eGi>AwMy>Y
Scq%&q KYdQ@6uQB4j/qd+@K^^*j&%WwlB^=&$ZPjIubLj:VDE%h9dDdKc4B>p1Lc@cdQaa^=l#/9Sym\eyQ!$%
W/+&#e #t\5Y!94!Dmqtd5q14jBd#PeFaCR4@*n^1GXTy@L\:9*9t%TyKLNReqK?hmhKwY<wTJ=++G&yVcTQ@8*
NEW4DA +X*qYGdSRYFTIqbi>56Y>1i=pZZiKun94ka?VK&dGhW9YNjFP=ZG59J1p+51*^<=9Y6wm4LK$$a^X4L>
^W!hE$ 4NTiu<tLSLLP8Zn+$Y>>9l&W@t=!9>Vj*^&F1Qc?1jlCJ*JCKFeyuycmy8qP9Gd>MBi8Si#w*XNA=Spy
%mtqu+ Nii?=FE^:S:bu!?Ve>4DYB@D@D!6<q!A9&/bpR^p^lL<e/iQh&uiLkau$bRQ6uw^D*%AkAl&X4j1bI<X
MAQ+Ma l<^5NJm&nDBMe@1Q<PlT4KakQLl>9#G+Ju4wDKi*bZuA?/$nwVCGCiy5=9%KhBe4\%<&!=ae:ycNS*6K
H5\1qG kwme#XnqST5RC/H%uNSc?QZ5ulFADYR\L?w?QG>MAH*<Yt<ph1y8MqK*V#X$<BFXWP%n@t/8w^Mj@ZpM
@$$\>M &8yQ=hR&!ZQPTVtem$L6AKq44A/\1FMw6wDa/?BDum65LyFY$imYel>@h>/HSNd<1<w%QwSiTEaH1yJ5
wq9*bV #>hpY&NZCmQMk>#aPk?ZHEquHtSnM@EWaZm1l>8j9!SuWa4:/?u:Z!\5*m/ht#C>S<WucDD<?5HcYqhe
pIGTTl T/+/d5baa95WcB9Xc6XkYBQqquie\wPM<iq#Z9Ip5#FEk6Z&M8SBRn!9GS\1/m^&tjJJE@:V*p<&Fd$j
q!iwG& %QLjYw4Fc$:5Fya%Z?G^%!9yKd&jXlL+5DM$+%hiK4C#uEqjKyhbpnqk?MnN%Vq1VV@A4YG5!!I1kJp>
!CwFXh yDpST=JV#Qu+>pm#YF8BAS=D+eS$q:heQaYj+BIqtX+<tX+CZ$8HuwcqZGXc@nnqQY4?HpJFMnlC5:V\
nFBZV* @ijS6DimcjHZE89ZjymGFWaFt>^:LNmP>VyVq^yTZAnmtdb\>AYb>IZ+!hNK:/eIVw^l*IMp#Xq/c1=S
M:E!qD YjpaC\*:w9hLTw%^L!F148Y6>hh5!W6K/cMqRC>*juuuWlTZ=Ly5N=!46FEnbaLq$qhnTlW8$>c6\ju&
y:9<Yy 4HP<e?Lt4qujGiqZT!XmB9h+NV^+>&Vb1&N6LXJ+!lGZMpjVViNdLYSLKt^b$QcDVcd%WB>8dlnNCDwC
DiYt!B R^dE1yN@h4dWX$YB*F#9VM\^XTRcMAK#Dp/8uWZhtemaM9cF\Bu%pRFjMC5E+kM9E?P?#%d>PPc+Qk?5
<n%L+D b6Z%bQcjjWV9MGj&!%Yk:ewTpDKPCK+%!HK=Sk@yCK!mq6FaLR/wGRE?LTn5K65mTH6WenkS<lGYt+8Y
-AwRT: 0006be9640d001202b4 Page 433 of binaries2.zip
THEe4d SNAFwll*a#$XN+w4R:Y%S1wY^9aCFMhEn9=a!S$9ju9CH9yMG@1IQpT?CQaEa=p@\EMalH\Cb^=C?8#:
R#K9ZG Vt\<=jlD89M/i>e!BDKh4y^+P&hdP&i%\D:b/$+&S+?h6bZ:h+Hue&C@b6:K@Z*n&1#4kpF1$4WdHICu
Y>$e6V :Hw1BaMdJ1blPEiQ@5jQTw>6ljVNK@blh4^be:YVYw&&I$DLS99=!hSqjq\$ukBy8b=Blhe8dej%\qDQ
Bd!aS* #%&A6W#<B5Lp&&CSCXihyV\LkVV>ZDLkGIbXS*n>hN@T>WtRNieyRpAi5IER%tdKclu6TR#\@&XqW$Q!
q8Gm%K ETdV@6Jy?JaQnEw:m4&p5i<X6qk=jy:%Gq665ZJi@e!+X^l@y6+QDA$B@58/5ceJ^AcLI95A/pwWc:h<
X:TT5\ ACH6\JZbMFlXTCj&$^k!IKV#yNjp5/I>b:4C?M5MYJRa?Y<VYGjRj\e4X1?u$dqwB!+8%w5m>*H?*R5=
a+@ShR tME8j?5lc*@9>NtM6bpGn/kE?+FAaS^1q\?:<d@XL=l@1pbTuqp=4<>I^y>y$aC>Jtd@:X4>u$uiciQ<
GTSecy uYFI=@ZGw9$+>dWm>Z/RHh=FYLGqam$IdK^jMJQ/6h+mqTuTHBXhq#I8&*VdCy%Q4kjq8Td1V^XKXZqW
yiFaPD TMq:%^AX8S=P*5HhbcL>lI$\A4MRDJPy@edMDpyb1F4RH=MdjInW@==bc/XChV+@P:<>ZVSL&Rl=>:N9
GhtbLn bh#4dw5!i8*+?d1u8dq\%Yu4SH*>@9j9AmST66naYDjPT65uedY=Q?+bNp#8CR=CPn1L!6J*8M^8XeLp
9TQL5R yubbEqa6&MGq&^YTeJSe&yV<YIVAjp6Kh5KIeiuQuFnyMj?9A9#>=:+TWnZT\jB&pY*mBA!APkZ9jHl$
+aH1KW DEN5LFNiwjta?iFFmP^\/LINNjZ<!yCmk%IRLc*>q>%#6ND>I4V5:KuN+jq6ji!=jP!=Li^SPi#^mFT4
aqN^Dc dV*5+XVJP8wEy5k9Cl@@#\LeM@6uQY!McnqTPYHatTP@Jyh8Fp?dhcR<:d=a:H+1cZZ@QhPuuZB6#QqH
X15Jbh L///mMlHa:cYJF5$HF5/:CPBlLC$A4:b\*e5iaVNB$/P+*<+Lh^4C1RHS+y?#u%#mLa=pe1@iRq:j\=B
=p\9Ea m6N$ZP1dV86Da&<nWJn/LZ$TG@8p:jIL#Dj#i*G^6/B5<Z+qFw$h<w=@Ve1t1$l5<\#+NNXM!8?\$8#+
/l1YN: 56b&nd=edh@%MeG?jI>9:ME!R@G*=LGFWl<cw\q^Hdjhn1j$+PDR?I:<nuauD%6bBa<I#++Et8@Km+:4
KZJXQe AlQHknP#=#Yn$h?ZBV%=up<>1ZqhLdl:&F4ZLXZ<dt*/w:<kkebw>HiaR6k\EGiC^ehP4lya!S\q16B<
F#9*:& ^>Gh@ZuC+1h8/M>Nk*eH/94Pkm6QS@??kpy\w?LcEi61pVp568leipbDi9d@>#PVMN$A6!1+@iQSL!nS
Pj/hw= w/NnaAALC^iZpJB\heEeSubpnHy6CLF5S6>BG%^eDWn=$&i8PCBkcFBw6MVmL\\pd+qiM5!L<BAlm1*@
k1QAR= XSCYnjmdSRt:9Rn@@V6EGA8V+1A5H$NcG5tZ6:WM!jjZhmPk/\P5B?K+^I!p/k6%QBAkw6k9SHG5F51P
Aqn@#5 /a*$Med@QQnu5KPn*ICn*G#CKkt&IappFldYY!XZ11mw1F&/!/TBkaEjF+Epq&YM6GLa@u+?J&P5WYl1
t@GhEh 6VwmYP/jH^Ee9#*qJZa:9L6SF!pjtpM:tt164cp+##9Lt4n:l\=jSATc+&QCYJlTYjQ%H*8\ZL\RqJW9
JPN9ND EyaDIBB\EP>+hh:LF4>R#@lI9p%CAQyTaA^^^49NYbI&1=MCC=P/!NN<y!ZSL=CpY=YqL/Jd!BlLKD%Q
a8cLwp 6CiA85CSJ\y:WeQ4?6yJ#uiCdA9@5tlQ\qV@cR94<8MQ?d<5RB%^*:?5yF8J9Q>lBR::aC#>y#@@j+cp
\EyDBm Sjl9H=jZ@&WT@bjyK9bjJk6ZQC#Vetlqpt*=u#FHy5L@M+<e69<!=@+Z<?6@te9@Ml>B^VtB@&X8@Lhq
#mQ*ED :wj@Muj@F>Q=9<#D@#CQe:9@!##:d$5A=u?b+Q@FNJ$P?T@:9=e?ALw@@\ZwQ=je#wB96+mL=Kd@9j!@
\^Zt%? P@#jL%?6pN=D94whHZ>%mm>YjhwNwlVqG+a#LkJB>J>n56NScP1Kb?4F=XSS6D*J/uIXFPTB>qZbkJBn
!Yhu5Z &S9MSNddnh<@W*Z&M*p+8Iy1!=cL^Ce?DSpT\l&AV+#E\#E41^aZ6S:\9S+#n1q\*k+L1b5Iw1P61#<1
%EqcTb F>Q!mN!MGIZ/5Xpm*J=pT>%$Rm6ZY\$4B=/IX!QY6!&p:%nWiZ>%^J++tj5SL/+Q*9+jlVh<u$yQ*t>q
&I8X:: aFwlt1=j5Pc!HN+%S$i*:V1H$wtd!$AEKLISCk<$9YhJhHZpJi&i@QaK8BF&S<FKXCZKNJi4y\?eEqnG
%FnhjW EcLFdC/8G4<pMW^@N*$S45mBT$yGSlD>:6i%LjQSWZ:dSjtnT\JPnGJb6wYA@t8?!H=aGTemY*KdF86@
Qu<Pu@ L&AT>5KLPq9%4KqC9Du/NSXXMh1SFAGZ&yCAqmA+B5du>9RqG?VeHC?#5A?JH%MlnJ6c\PhQAkZZ%hiI
TktaG9 t=W/RZG>Ey>?VNLJw:ihVVTRS@AaKi\JJpA&MFBiNVabLyFY!:tmyCaI<FkcZyFGe91^EHFYj!KhDSAX
taPyda >Pkw!1N:neDHc%G=DGee6FlnWX^/C&jehucNQR<9eaD!@E%$p4YkhnIIFcP:1b\?WiGC?XHe+a9K=<*q
EQ4$:9 y&L@64/HE!Mm*&b%AiRABwc*ah<MY!!a^Y@ijd?+nq@I/%+:n@+qR8dVHatN:<Nj@@9upM1/9a8&%IB8
R&?IZQ lk/8@9J&bXRN\??K@?5FbymT\F8J?kLP*>*e:\t?GtJnV9DmXNH*e*a!P/CVaYp=*&<aKqe=KKkjHR:m
1bctC8 *m=HqX+E:w!>kak5CB\WH1kqntytHmW=>h\Ra4%@Dp9QjL4Wp5jJL/G+VBP*SjmGd6S$YZ9+@JJ@S@qy
KjlP5Z mqKXMm&9RwZC8MEhX>4MB>GTaD*HRHm++q%#8a?9%B6JLcN*VyTYNF>*HYpYe*FShpQwFZ9pW\T@/iH8
@@C+Jd LC>WdYV?SuPc?B#G8>@+lnn!\H8Rl@%ZdI!>8Vp^\iLk@%=A&+LLLWEAqE\mLj=GiYNEnTXAq#NJQ/y9
JjVlB@ EQP%W:LbM<ne*pH6#IcS$Zn!8A/F:Dn%6PG1mYXb=%IVj1LSd@an1tlhZq&1cu&a>8YE4aFmwP!?VNHc
dlcZq< %ECcjtWEaC/X+G^Dp5QGcY$@Y<KQKVdli?j8D@@%:Rh\kY?l6S8@M>>hicN5uII<p59ERmK\ZJ&?#GdG
VZH^RA Vh1uiiwnln:jGPJ$Ey>$H1L%e#c<Mji1:aknj4WdNi<D=yF9B>je?@#=cc4^!5yL$y&9Jn!?h#9bn&iy
SkhR<i jTn+X$e=G6dt8PH+jkN:BNmZQSnGHa>*^^5Ae>?d+^<i?4yb&Q$c<#bM>tH9Iql!c9$1S?MIWah#Hl^b
i#k\kI BN!ZnqdB<EylcLy<E@58yk?8q%%^d9*D!:RbuCP5hiGe\^XKZVt?9c:?Hup4iw%NuI1a>Ym%k>WX9R9b
*LeCMp ^6=VWn@1SAR19?D\*k8uwk/y5A?HZj4*#tLQ8Bu@6L8a4d9PMdN=RwuGCkI<MnRu@Nm1@np?Yw$9ZI1t
^iiK1: QWnD6l>%/q1=6*HbX@8S%bBa^<l<LwPRi%jW+*^iR5EmHV9dSH+Ka9\+&:S5QDy+8\MZce5@YDEj#biN
PAh*Zu c$FKadT8*>^*#k1@1bPwQEKd#WP6HDp66ET*ucQq16Zh1aH9YtqG4buA$1E=n=DTSM:+k<kmPiqK!5al
WaA<+1 $XK@+PEDI#Qi>1<1P=#ERR$^J?&+A&bqlh>AnT<iGQjiX6JZw#:j/4Lwt#//cGPMjTQB5Y6MS>jY\>:n
kIwiZ4 <XRGHuQ<&T>y9/JJ499WS+pWEEeny66q1I1\ZjR/L/J8eER#SwK4!m1=\<i?ApTwkFjh<9cNB9h?W?NA
h1YX?k qJmPFEE*cla@=plP5:Hlt^j&N1P/B5pT^!Fk#L19*uJqCiHA/\\@W4EQu/kdbC%PAnLAH@9+Ty8+:Z=?
^8Eu@+ K8ky%E5l61VKZRP#$Xe!A:AbXe??Ba%W&G%eBNu4%>4tb<ILEbWqIFRd%atQl6!#&dMRuBGtWd81aYQ*
pC6bPE RP>j%B9B6AbHt\ZaqRmB9!W1EC+HBmjby:qZ4uyQ$u+BAleh>HiZC:l^wytEMIjy5Il#uTtu#55kay5=
5%</I6 cTNF*L%DFmFC9P?4qGpC^:5T<*mGcGqiMF8R<ymDikkQP=FVt\@KPV!8:Gphq#^A*YHWVS>QR4lyE>T%
LGYP#n ikJ4Q=8MbSe$tqwB+P1IkbyJG9/Jd4>6SN4/5d@6E*W$lR5#Cc?9Zy@:Xy4q>\E8J:KNc4LiukVcHa1N
ln5HXT qqJ\*uWT%t@lpN&DwNlMh#/<Iyw<!L14ehY9/u1tX6w+a=5C&6X4?c=@/6\>E&\wBS16RnmIkBDA!Gdl
%F!Wk> hC4H^DHHDYip6N+#d<yeKNL8y^i$&QL^G^Py!b4=D?/VXCeVPI#QpYLZDu>5?kyXw<a4@t\MeE^R+A8q
p:#<?= &5q<iuPCly:^hh/mN=yqPqCXNbuh\A6lhiJ/Q!CnHl&1:9Cci%L4M=4=V$E<SGKB9bWG%8pK:lT8yb@h
wKhDaC ^+5HPcdD>*?w8HX=Z9qkkh@tdBl6$J&kJPHA8<j+N:/%p6:e<+u&9jn!qSPXJaXnC5Pkm/cYB$NdT65k
$/w&SG Ql^^1TyRFn&IKBcVuEMDTlJ<6&5wK8Np!?ycLe#=JTX1JFNXtCFQSt&MZH1$8MYb?1&WqkjcZJI98bp^
\Dj9uj JY!NHVHN:9IZGmjWE6jE^$6RcBj86Qp/cuQ*qLw=>lPkFEk=%6RutL>q4jp<?yGTAhQp55M?p%tVp6Nm
\@?aNH DtYeH/:5W?VS1\a>?#:mccK<R\E+ah$G&!!?#a^TW@V9Zmq>dG<?:e+>TmQ%9h8$MSZ@M=<>qI@NX&99
<qmqVY k8dR$Q1Kyp#&ANP^d+tmQHMwu=B9JPV4jSLNkK4X%e</QM4#e\\L>hP5#IR#Y<1:i>jj%%a8D&%l/X^l
!<LC&! dqLVV4cweLy$HbakyF:hSw#wSk!lE^GmTm*dCQ:6ckQ91D@CkbClpt#m/<KCMy=#9<:Eq9H4uyI4G*S?
RhMhdX MXMm$Y!HdPRLI8#JV/j/WLy+Td^y/=keCA$E*uuDB5ZJi8BXbC<V64eNViypcqQ$$ZiPeEHN4c4md#EF
$#$$FD 4c>IYcIqZapmnq:!$nK$H4!C5yNj@jNKS!<9:+nI>MmInQV!<w!Kmk\ababHyphEbFcWX%V?jYun*#e%
nbW<EV XtbWyEYX\:kS+X:iGj>T?6<VXwmEjhI#ImK<9CL?WtVp*&@+@S$\ImI>@i>I5EJp^Q@Rj#N@9?@ucjpF
56/pHA M&^iK5LBWDjE=wiJcYq@Dku$kILDET1<Zkui9%Cq&L^/!C:N6TJQ?dWHyd%@n95G^nF5C9wWi?1JLjPK
:Bhi8? pjHX&\E>ZS18\@:lTM\MR$Py9Kt96M4n\AJ4t?t9H/YKbl1SXPF5hq$^HHuytwYGp1D:V#?C@KC8D#uw
Dlkydk NHeiWCej$jmd69X#DKEZ$euD5W6IpNIR?MWNmkMF*N&@jMVjGu*tN^DVRm:16ycEn/HSNV$?n8XC%cV<
GyY46A cL+TtZJQ>epp/<Lw>ZhP%Mw*F1aT><Knhb>GCBc>i!ub$N+ZbZ\k6JH@9918?1i@Y+bJIpLc^94uG6wQ
V&P5wI <h=c4\b?h4*&w?!i5MLItcE55E9AplwE@V\++B6>M>$Nekj\1Z$qiGZPYk^pLdC1CD+c9j$YnTSJ*jb8
c?TyB1 duL5nVddKtKSlM\Q9ujj>llMkcp1=bG=CK!:F41KSMuFuTqjp1ySIpb<My!wyi:S/m\X84LLYF=HJd@$

-Aw94W 000bf329657001202b4 Page 434 of binaries2.zip
Yt?TM* %H/iB!ipI6L:VDJ*8aFjh\>pM^E/q&l+BTt$b<1H+Xwiu4yBG4Y?cNXyGCQAe/5$XiRiinXW%I551:C>
u%EE/m ZPC8!&@+wZWVM>8tRRyjE<&IDJ*4/cJ?&p/t/dJpJ*wW>J+GtMHl8@+pPDL!FZJHTuDc1u?%dpLyH+4!
mucdC< 8uu/#dhmZSiV5?htV9Sd?QI*DQ56ybF8@FDuuRMe\jNI6/tk&q!Qyy\:L%4q^P<ht%@<YA/*5\jhXe6a
uwm+Rd ^PLm#h6Zt9q?&#:wjS$K9#$tZ4uNuI!$?#Sy6Q^PVH<4<+m#i@S^$S4dNM+:WX+h&H<kyKyS!Y1yej?l
XYDAJ\ !Gc<89*/H8W:EZaJtA4NT6$1Yb96%t8yt\/a/@ZcbGQkX+Ni=mN6N6yq4?1*h^M/ltmXG?d&b5b1H:$Q
F=Lplu eDIStP?AFkX5+PF8ZRSlDD4Xpe>Y4/NkP$>Jq?QK+/dJM<HE/E?ZyAcY>ikc*>/=yAyj9NP?$1ipM>/1
RJBkIn %/14eV%i8b4<@d5SCn>9i%9<P>*l+VV%DRuFAmI?Q5J>qX*DabT!C>YAqnJVQ#*>NdJRI$?Wa:qbehXX
6ZkAlc :iCX^ic4Y6i9p:n\h9Di9:9NPjK1ywk&N4Lj5D+RII%@*Z#5qkl5w9/YB5#M+t8N?\=$6paJC!%69Gu@
hIDYA= +Pi%5:*@4S$$<hR*NlIi6$id1SdP9q8pKM5jtN&h+!88VmPVi=4\CV9AX/m!t?mKpX@ZKP^44m6DX8Sk
C/4EQ4 E/VT=N\uE<&H9KuN15F?md#?i>\\DV<F<wV1Q9^*MR:1^F?Xq%NjhwyT^phHT+BWCD%%\&<a/?uQ/qEj
*M4bHq %/:Edd/tN:=@?!wRjThqtt!V1M:yWnnT*=mPdyp@=#Gc=t%@c<8q?cud1*plWeH5b#P1V1!Awi>1JD+Z
<lDbyh u?ELELlI+6W9GF8&J>1m?^G1BA$&cHFQ#+PB<SjHqI+Kp^Jk8&!@6Ii9A>:Bq!59:iZ6*@iXTnJ/WeP+
/K%w6c y6eH85t<u>91p6KX1M\C#XC@#1M4ldIEcpI<4qceA1&S=ph*tbemeQDC8FXN8P?R5d/%?C!IqbmJAV%F
K=9DtY 4w/u#%%#!I#n4/ma9*4j<!<@Q#@=e8L#HRhMbl?4n91JDiSMwnWjY6B8#nPmte+!!#$>V%SuR4cbJ*91
diYV5e LXh?u@9JGd&bnc*YTWa+Q+DwQEl5mFHHNMDZjVSZ\lDPSCu8$F6\+%><^i*/p/5JMG9a<yYIWYBl%8EH
aG&CNj An5D^%XaMe?uYG:9^ViF4$p<J#AEtRwT9$X9/HDT$9J?Xu6hMDR\%6daXJ==>\4nMP%tQ!$QXIptbPkj
8S8h9u p%$Xw!Z=l5WC4VSyI9B%nt!Q5*@L6THIKquYcM9P?plk<mDlk?jGIDy?wQ\QA$C$u:8e1Z&h/$?YK>%Z
S?d$1+ C?4BPn5@Edm=t$=iEd\ij$LbeDknlBjKFl*JI9qI1qwRMaD1tH#4KNw=6KIZECb@$\@!8*C88umF4?>Z
8#*&eX m=8K=I==FM#KK!k14B^wP>Qh^nDcbykNy#Z&w4?YFj%6>n1*NS!RMYT:>6M=pIT=5LSHYYwA$GlGeM@D
XWk#w$ uc:+c1I1qlV<!t45S5*11@V8q*qj1?N1uT$cupVyDFuXKLVpE:u&hLP\ZQ@6%Sm@6yPa+9F^QAcN?DB6
^=DPG> $nM#?DR5/wk*%ad/aNVWH=<+eEN>QPKcQ:TST/QMWcZ1:9%RG6$d?QucEi$PDQj8c+du?yR9>Bd?kyDd
&d*MPl 95B^CXZt+R+jn$nLC54eQFb!4>5jRhhFj8CMaNa!>l4nFN\MihhtXH+<E!\tjI8/8*LWBIA?4>l^ywXF
cBH8u# 1ym@?IlHayPl^C5ni@m@lT>+WGt>T@9m9puS%lHulSl5\w?imh@#b/h>/yYBXKq<DnTbk/w@tAZFC@1A
1iJjJF ?B&j+>9Bn!?%Iei6q+I1@uE*Ce:w1*L&18Yj@q\>KCK4L+Dp*d#nLwVJ!BpRM4/b@8p%+w&<m^*ilW=V
6k16@e &K^:8$tl!d+SJ*84dT%>:+i^FlIRj6D>Dn:Na/eIWAB=t>V!15PdeFV$y+BBNHG\4@:+1^RuJ?aluRc:
hKkQ<S LidP6Sb*DPlKjQtAyIyw^nA$1LdWuGIP=PcLD5m!+96l*iL9PZ?<#p?IPVD6G4S@Zk6^jJ#&\*@auJX+
4&C\GX 8Pk>5T^K8KHRw6XZ55<Ypt#QFnLem%aL*PD1#+/Q?+kT\k:C9m<WG85tuJXR&A6q8q:6H&@+M$A$:mV8
C:&GHJ @hBFBekM%Q>TmNI>MBjXtN+e<nw/B5iup8P$a*ePmAVES?Q#DYLlceLXSc!%@wAFPIwL%>bNn<j8tuF=
<m^aX% =/bGldy>\AT9J/RBN*Q^KPhaRnD\9LclC*Rb^B6/:j$P>!YyP/Z^XeePPV*?ePneB^NQ4:QJe=py&y?b
N^4ICM wq&iQ1Jh/c>a\PGh:q+mW!BpRM#DT%6Hu8elhRkVpXc^YJjH:4lGV#6@uyL:c:KVe?JA51Aa1EC+aDq9
p^KQ?n P1VL^@6TW>W%b+*WNN4My>iD/at#TP5eh^1F6nR1ta#/R+8mSn&AA+@G>jt4Jiwp/>Qt:ect*mD=i6i8
Qd@X8! S/C+=<?FD:kdhndKA5*9+5YWF6=wkWphHJ!?Nb\j*TJ/Pm\j&A/>e&\@h8\LVV8HBGy*XQybQmZ%PnD*
#XKcqP V*wSNl9W4WnPkThQmEYZVbFuXi8>9puVmY8eak>1Yn*RZ=b8tYE@BCShIu@a:IBQC<uE?mk==Zd9mmtZ
HiS:H@ XBVeRm$/\J/Jlnh=@&GulB1T>n6lub#dpluRGpdbR&Y/@bPwch!bR&6h^KGG+hnn\%6Yct<CQTZu*4Bj
4EYC:p AT+Fd/$54M:9qedGn+8/cZ^8hd9K^au96M/?PK+@d=S@c<tp^$9#cd@T6wDC+e<11^JGeX<85G%>&QJq
tb?EEd c$EepdTHw9+yHjb9pMG<wL^m84epueXFP:1bLD^4/TmRDER9+M>?4iQpH+4%Iuq/5&Y6:NVK$Ii$>GIW
/+>4L$ =<T1GJVG4@uEyc1h:!pb?6:\5e\1SNd4Bajk8W>F&Lw#i6w/68W8Jq<Mp>>$SG5mNujIINhiCD*i!C>1
lVIDSu HXF:\cQB/dGwq8iSbmQZqMI#np%m?9q$+Hh5*dGI9aKL>hLbw8D^dR&LwImWW:n%ypFe>l68pP:/VkQE
YZ@=/< +9#WaJWpWHTMn#&YJ1y8JB::5<blp1T1kR@6MByBP6XIkdY%</GbS5tq#:mqXDH4tA!NI+46Ga@PhET>
9lVeV8 +NndXFGWlV=!B+Ayh<1i>RJD1laP+IC6wyceWu&MLi%m%eQ:TYB1%Ip%VbP+X=L=mh!9cMh?cLSk=w/D
wHlRYX 1cE+Mq/1P#:Y414P#Y>#a5<%N$J!<mTJI@IRVZ$5>#&:!%qw\YijI:>Z\tHAB$mGe!pNEC<!=:mRQ!Mt
Zc68?P hJwNa>bZ4K<+<+Lc^nhibdweQtI6RWLndZCLhSm$pN?c4*+cjSJm>/QDR1I:et^Z$ZkLa>yd<tam6X^d
p6LPGD Xw&!bPHW+1#y6Pdh&k&HkZC6n=Jk9NY9Y8cB!Hw@!hhMm\/NWl!=^mP5\\dSI5D:LA$@<IuQl%b/JmWy
Ta5AG& p&!d\iTpGYPB:dT!aGZAQP:QVqb^QR!4VG\<<dp+HjISI+@$PuFeAhqH\TB:l^4T&P>6MW^AG*hW&d9Q
\VWdyN LK>FP/Hw4wy9Hbyj69jD?YweuINiDlBd+m*pK!%%a#pL/%B!KX@JW#lKEZ!Ki%j+6Pe&9>!G6hj$c6k4
RC&n6& 8njj:+1i:?w^bRI^dSFd?elED*n%@LBaSuay:w!bGjW%M6Q4wkm<E&IMPSNwwE#@$i=LtN8!QtDE@DR:
^FKi&V SQT=MRHqdTXediLlktZ>=kjJ&+A=DNy1ZaE4l5DQQDNyd@u1V@I+lLK+4+h+AF&ely1^hKLQ$!&9I=5h
myJ5Ku MnV<6>i*:HF@1IJjXMTmbFPyE89Z&#?XjGjt:=?/h8<=Dd&aiYW^\Cp?yq&bjCuiP/#<yF9MKV=DlB*E
=tSCRl TWdQ+H:wL&h8:bRYj<+ij1mlL=!lTM<&kwF1F&NT8QNBi4#Sl:Q96H4>RPVw+9y=&WmGb#lJ\q&H#n^\
&Ic8y4 bL+Ge/P+P19K1ppNn5:@1dRtSje6a%X>L@E%l8Ew^X1l^M#?=j#Z/<t4>B<F8%N:Ia!6hFHljDLln^j6
!AFWe1 y=eQ&HlWEm#F*6/Tl%#%BShZF!D<WLXjdT8ukneZT88+:VpJ!5!a=G#/9CSLWBGZMSj885QRnPSeju$N
&Aqh:Y Ml<E11pZieWj1eESBeZje=N4$Z^pD^+!i!*1HTuMNLyuE*bD=JC*54W<9u\G46thn=YbjdEm=*&#a>@X
qYJ@#/ ?$J<>E1p^5J1^Phybh>wM>E1HeRLaebephKJcF>aheB?4*d*S>adt#D<\j%VI&Vd=<n+a$H%*tb#p6>h
cq<eRY #>XDQK6S>C1jnuG5/65*9\1j^#ZRL>D$:6Ky+jC+Eqlqy9!C?#1NI@y1XahcYnwN%t/d:y&jJ$q94Il=
nqQ1^: G@IBuRI@BMPXiX/MY56LBu69LY?/Nw?L$Kk9X>PHC9kTiXiRWjI<9!S/LMd<1G6A^1H6AX#WKy5Q5HA:
Q*p>4@ %LXy\G6dGIR=y?E%dP>Jj4aIZ+J5Bjeec+?:hQq=DHI:Wkck8l>L54lceRqlCJe:pWS8DpwSy*kyw4by
YEy@!l JE4@8H=eC+\MiJNDFlTy/:uY8u+S=*uytT6\6C:weS\qcZFK9Du=<?*49M/>6n!KGaPpKthGpILZLa>D
W1Hbj& Gh#DRIiT!H#E?=cDjLZG=G&dQlAWk+#^n9<y$PyK*BGdy:9d%%?%#8QR*E&^X&pyR+H+\&j5L=M/5R!j
XM!cQ@ Q%R+&#Q>aua/nnbGG:PuL#>tkDTt+M:^m>H?/eI\y<Zj8K6y&9LN=1eK*RueCn&u\<!P4Nq5ELw$=?nD
:V&eDP it9:FImCZq9&M<K>lkM<t%QBpBEFYDm5HEMyVV@P/>\G?MYj6N*lj#^Z9VZGGMNGSEIL*PuLD\@<qeY<
EC=XIM a^AP*Pl<Xjlw$LV&9NulGIRmk\ihuZ<>8\mQEG*#+A$KEMppIqjCJd$Mtd*hq>lAV/Y^HIhVS^6ut4F&
>N#M$i +1%SheIX?%Aln@XSX<+qhe?\y1u$h6M9ppPaSuYul6SG:HVt@11QW%+&6u:Rk#@+?6^C1i=^Slb8^PR$
^Qj9Z! Y5P$t:8+J6:6$\*G*1eAWQVdP^ylaVw+y$iuSi!cw\%*tRi*9y?GHd:d*!?kiHap8Je:4q?F$e9iDXy=
KSaj?9 McFV?MZWNY<LP#9KI@kKPNMA?wa<9H\Pnkp<8TiiSB\b#d@NV^cGj<*I!V*Q1qkitRtZMAh$eNi@$BFk
W4y9qS c:\J\at^wEwlI@^lkI5lWAcZRFYSbNQ85SCG*d?64@5GXaB9tE<!e4aw5WP#DMHW8myL$CLNi<j!M\k+
TPin%a !&VR65bA9FQVdAuTS4!4L?j5:5Qa$VquI6#W5@/E9%n!$mkw#=%jAZc?b=t5!bb>18Xe/Y64Sw!j#8$t
56mWWW je8Jwj$Rib\jQCG&X\#<cquwKV1eS>j1pp?RK=m/>^&$pG5eLJl>%k?i9$$n>EW&Iu$pw4?41^Nc8=95
Paep^G ELML%mG@Q5%1EmT6%T=kQdG*Z?KFktV>KY+:mw&FLj@eAEANMiXGjbdISpqPG?#eTZ\Y9HE@/n<aQqMb
^ldQKc nR8wGNHyTA^1+4@n>6S/HcGdtut9n15*Ji6DN/ninw:lLmiXqPJ^XtLk=qm5i%RY*nqCEFMDqFXd4R&1
tE!M=@ Vw5$J9+i+qJn&?/\$d/kR<ZCnau=*T16naiT>i++YMaAQY$IF^h^^6jddh5>4?C#XeW%kjMhi:6L#4a<
98k$+1 G@kQ<j#iXGX?<Lbm>kX@^+Mq:j8HuKpCmh+Ew1\k>tSXd6&P%9+@d!qdKe@P@^A<D%XKa1bVSAN>$\1E
9#Hu@A l*pViu$pYD$PRY/FjnuK6KB/?!WiS/PYD8@q!1d%$GcbC+e#k1YZ?<SY$yLH^E@RF/ep9tD>Dh^==THV

-A/wGp 000790fed4c001202b4 Page 435 of binaries2.zip
?Q?5A\ BA:*cSEGlT:jAQ#WbDw#uGI=<yPBS4=W/Y5P!4\Kl\@?Zn=kjMZK:4Y>nk#QISb:q8Pje#F1jPcYc%XE
4a5YQ/ aJI1FdW\#V/6k:BIh6GdGDm4J<dLt/CGJqYY$w9MS=!6?JN#1C%Tna*FyRwL<SQaPEJb^/=QLlnl=QJk
=qhHyl wPJt/4GM<a#FVahqey<@>X5iFIZq9PDE@&t&%4ZD$cIj@dt=t4PLSnPpDXTE8CcReG8IGIJEqt6c5XC&
tLd6\D $Ta5CGcYk%@RICNBaCJD4b#6yY>mE8G5uB%FQuGXWHDd<QV&Pq+CmRm$8*!ka@?chTSC&iIpdiV4b1q4
ab*e#l 1CKIh+*BBIqZj/c#5pyLK!&%mn#tRj9n1F^tb5?KAdn$1?E#ah<R\cn^t>m@jk1aH^&==@A!RJm@lRBY
^Pwyc* J51Ej#p+LB*j8%heX9Ly#>\/BQG5<iB#/6R:PT+HBFSmFB%:#qy/qcEKEW&pV6hiq=tmHG8+PZJRdM+W
L#N/WX KS$kWLNj99>hFFd!ww/Nl!$?!<GBSYYTNleC9/>dIy9CIM991:n6ap?lID?aINSw?pY6TFdjmIVB#^Dd
KH<?I9 \hR$D!KYuMISjh^84<wd//!L*jB49N1aL&N5/FeD*c>=SlLZCB=bXuJ/@hQJL1P4\PTDVtcu5b6Hp$#S
l^%aIY &&TDwJ:+uhY:TqeSaL!?>8@J46$@TtdQG@SE=>FdVl$dS#iQy&G%Y:N/55?mIA*I+t<KZ#8:4V@bYu<&
=Py<WY Q9nF#G^>e8aVCmT*:K+=anHlj11DVQXZ:+9mLuI8H46%lAcLR&tJ9@Z8WybW::u\CW%tRTWtXVt^>LCA
PtYFRn p8HlBIYDmS4$ETGR#4=4WnYL%!*G#TdXK:h5:\k%bKe866ThY!Ai8H^jWj!NHF8Ek#HY%Pw*CV\JH#6P
XkpwB% $4%ikPd%m!ii9lDip!ddt8>!DS$9$KTS6d%lVbLSq<daThaHQhM=%?Q4*\=N$QM<56888GN9Q/?Y%6!u
WKu#$I P/8w>ZTwKDL*Y8*i$BF$qhXB?@n$TXSqde\DShXc%>euKG%thY*1w58=pEMPkajMSwZEC:D+e+$pJn!P
y?q\n< W%ZLj$d&eINJJp+pNVqi<u5p9^/lD<ElccB9JC6=uMRR=W=MywpaNiXP\k<%ckym*B\QHF=lStbYPVqP
Lt#B8> Cu:SNG>6Qm=#uht%FeNXR\P#:!8X4w+IVb&/Al5YFT6bh5Sbl989S4K?w%\I>?*wM^4ptBlbP+S*%4Z&
eVYet> =C6=pF6X$m8+jaY9Gc/tZj*eMGK?y+N%>phuyW4L*MnK#MVK#M\h>e1lVwJ^miBl9cSqNM5#1dL!b&*6
Pc?nX5 #<4c<9w&+>>eIb9/j+AL?/?=d?c%W!8bV%EcPi%5QIFyVpbTLwEhnpbYVi9#I$qpuj9%a+#S<i:<Em9/
kucje* B49ti9w4HQR%VVZZTu<MnVKaWum?LKjZ6:GyX+w#/%ZZlJ5=&Zk+PZk+Pb&@R?b@/D^8qV8!m$ub!qQ=
PKRuAl bZ<PXQd6EEp<WJ^T?&NDaDR=C6Thj:I:adI:F#QK?ebD\*l/LYZ=SEN4X+6jMXVXZQj4#mIy<1^EDZHu
F#&l@D d5iaQXX?^WBB$a>SkWe1%ahHJA5qt4lJQHqbj$X@@Ti>Xp=^9th4qwJh!nn#!Xu%!VEL<*q*?=Ml&?m9
ju#ZA: upyAYSP&81R^HdKQIpw:uLZQBJ%S>nyt*1jR6Vj%G#mNd%=qj$bt8I>Pjc9##XaS==H:6**nB5>WVlc^
<#K^@8 8hjpec@4$Vb84yn*94#^:@bN=5?>FcqSMWAyeH5yj9:aIi+$ejue+jY9S$4*%lanHGGSYy%m9&uGA9PK
cpBW58 y#<XB?tHH4+Y:4w6L1@bPXtHSeV^9c!5nCWB!bHjTpyG$+uHPGyMjd/XYNcX:P<:Y5Lbc@DkwP/nKV+5
@C\nwN F6QD%hRB4yh?dG+c?DEG?*qN%C*cB\+VbY:dnt5@hSVQ^i1hDqWTNdW^XE%aiHk%C>VTXDGGtK<a/Y4y
ZV=YMP SWYd+m&?=REkjwCjmiS9S8TXwT%6d=D++N:uF8mt9n<A8aXD\T<FN?@>#uTad@Z?<Q^V*XqceGcVkt:w
ZdiVBH NWWWaa?DQ8&89G>FWy<pQ+?FA:>cwPcX#VnXD!D?%:aHy!!Gl<NDhF?KD=>>Sc/9k:G\YPYuCeZeI&Vq
A8AqVi jdH^$@LZNR9MjWGjT%X\%y<<5^c69=VZ#/ct!!pwetk8Sw:yb59X1JiaC4ktYjcd^ba?Hn6#l!KNXD6P
&=*MKt J\pyB8HEDet8qT<EEGYLET*\&c>!M@Sd=A<bt\9y\ZFiu1%u/TL%DJ:?&Ga9j@Rk@E^\bkGFj:k<CbGY
^DjkG+ FkPcu>#+=ATc1EG#k:uu>mKkMnXQ<@=?+5*S<+jP18&C\tch*1c6ND<8HmHTLG=RiwX>IWQE:dY$?ck\
WIWyen NR4M#HeyZMpNSjbFl6pNmdJehXiJmc/1P>L!5YSy/DV1ahIjLcXJRp=5KCk$=M4WMLME*>6C<C$<DeJ:
5b=^qw >B\*1pD5F?!YD*!h!uF&6/a^@CIBCFS8:G::81qIp$<$\YI94uX&uQYZjK$dHn:Ake5yI+5j%TyCV\bD
C@XcRI C?ckDZNBIAd6FNYG5ad1y5d\>kTF!DjE:&IRSJ!=!QAEuV/SkC$c=qK?^@h5:Ec<SWka!hHcX*F>=JVa
=%*M\D F5l*yiFyeSMyR&<j:6L8j>PY6+>T5dJmKNFlA9!Hw5I&tutdHFAhiha*%\&e5$bhFyw<Q8@aP%6R+NDI
qY!@hL Jkmq$KdCHm=6WR&mXm1hqN>>%k#H?c:$Wc>CC?8G:Jp<IPc:6apIy>K84iTIFTVlEKiEV%<KV=iQIBY#
cHFkk> 9&lYhqGZXnEVH!kuqFmLZpDK<y*&@hC1cpMJ6?GQ9w!m8yc8u8GlwiG?#1:PQqQXdK=tl1!ql9HquE@^
pbkF9K mGZh/a$4CAuCNiZdKah&Zw>l>+%M!==1SHQ&L?\E>@49:AQjJH%>Xt$mb!bkRi*kc&kFq>#+$cnbppDN
Sp1e+b bZkR>WQ#\G@KR9+5%jLS=LCp4&lZDYh+Im4b*lKJSiNN^=uTtH?@W&YN614EH:EI#=8^Wid&S&n:yyA*
EV8T*1 *^:\eb4:PSPL&Nb1%p/QJ=ac#BF==6^CRlcElcdt/YSN%yynVD#PiPc^Cpb%HM@W!ZXm^/j>HlR?E:B:
Dd$%c& <b5WZb%eX:Y%W\&88&8u*RWY6*BG$euq!HFBCbR+*X9ZLe<lJLcjEpZAjaihHeI8D$I59FKHmKS*^V$?
C!RAyI E9&HIyeaq!jj=@9^*DHhy1<^QS#A8jj?n9mMMVi:1PG@pi=^u6NAk&uN8c#WGPVF*d:d:1wZ?h66:hId
S1VR#R XZiuh\FQRe&kS=F+kEQ#$?&VA\CEmIH:k<^>=PMZ1k@Qqe:=PFIDenI$iTPVFV1S:Ed:ClR+tKuWXIa/
TPEL$/ mYJMZPK/bjhR*A@/*jeH*::^8$S?LlTKNFM99yL8y$+y*kD&?%DMc5F#8EeYjhHw:i8nna^Z#tZlpKJm
RBlV## $B#JQ=d9cu/>?^Fd%wAyVk+#k$6A@8QX=n+VViKAnM@H9FqyKVpJ<aC>!DKRY\Yq9yF!9jGm?:HqpFdX
dtGSL^ uH>:?w#pV6H9mTh1bk6lHlb\H6a+=Fpw!mm+>TmZ\qmV%%?ypdw4:8:HiQ^Kn5?hdcYXH/F^uH/*!SnL
TY+SeD J4W#i!eme6d1Mte4E14>a@m:mhwp5>h?AKQj:y1wRcRlL<ccbtG=pFXAJa=QVW!jn4lH$pB<%6tVAp=e
JI/H^1 *CcywRT6%YnJ?ACWc==*\u%PcaauJ%1XtS#qL1e^a*V\t58Stc4M=V:MD>?u!YR1hGLM=LZWie:6&9nm
*MjB%e N>#XJcHm%FWw&6GV4CF!ZEekdTYKiTmq4aktw94/8l9bu$lqw##NQed>V6X!aG8RZ*19WVD<RqhNaH1@
XJ8Dtp lkNCjjQ<Dcn/%6umF=%6<4CI!l=#!:H#F:j=>X5!LQJ6@jCpuHTJb/ZM=%&IwH@cW=8*\M4Baj@hDMVZ
d/L6w8 DL^mi$@QhtLHYi\>5/VA>yFMw#Rm%Q*S$/GMT9*Pd?%q=e/k/lt/5e*Hb:>Y1KD!VB$>kmH5TAPj/qT#
NmHVKb V:+RJ5Kp?TIhwJ=hLwRTV>*E&@w!KlA%aq54NHF/I/I6JYLKiqQen&4+9cnA=li?mh!Atluw!/TMphMJ
FTb#$t Xaj^#Z*>HH?i=nY*iQ/yPeTHl%8B#l!TEeQ1u*BhMY<^%LeG#%SRS%%!KpM?l&>jP8EZLZw/YFSXMZk:
lBc4+C QGj=5#W<8c?:1Q?&D&nKMuBN:SJK*TIdT=RGq/%je@X!6Ht:H/:VViDZNSjiTCh/Q9@uEmuuENE4lQBP
QQe&&e dQXFX+<T&jL=F5<5bcabSZVH+wiKIC?u^nATEibFaA<4A:JwZ9pPjJG1$k9?N<KGXGVm4^5N>*%4nnkB
*MFJ6S 4?J#*<cP$Sd$j4KiG69^<q6y>=jb^+M1PY!5X8951GJwdwZj*@XTQFPY><XDRn9a%IJ/YN?@n+p*nPGG
DMA?*S 4LB%ciKA<!PSq<dHTyEQ<FhZY8aY5H1Pw?Ht+Hu>iK/?MAqSX/u=E&AeaAuhcIdp9lIbR&#1F\=pitJ$
\4ACCb #45II$t@=@4tl8YJL=#=wd1ZkTmCuX%<XLLTd84/86/X<Z9X+*5TqB?VQ+yL<+^!5C!Tu<9h+=Chd@LV
6&Dw6J eD:l+wm=YX!?Vj=p8S+/a/@R1tN?G1Cd@uu:Zj?AbB1tK\i?<@LKiFSaN@I+&=klu5hiFTByXMQXTCiL
uM/$FT hkw@1Tk6q<A%di^aAmYcL&dV!C^i+S!beLN?HQXlQMcj:ZjG8^e6:Ec6@KDnV4VKS4HVQLV<Qn\@RjRV
=*aNG% X51AB%+#e*lZqIycJ<9c+S1D#IJy^Xp++eCLG=QZG4tdHRWt*%^^Sb\ul^DI5y:GpXT!bAJ%=9K9*#IG
Z9!em+ e#6/4ilmpQpppL<>EKja5%DBBQAKCS11Zq^IhH:NJG<ZF6Y9DPlIEQWZ/V5%!*u=<u4>Rq^W^\MaZll8
YhApGV Gu?G+t=tN*+uFWZF$^9T9ciMKFXC\Ge6Md8MAd=1PaccIWJ:Qb1t&NhC4myccuE\\Lj4AZyH6>jj!w+R
%t+e1T <+^?lK8Th!tT*=t>/WVXjK9mYq:eaFlqeaEu>p+hP&C#=kWu6Dct:Y%6m/hLn^RS*p!QGtaF/Lj\M+?u
/jWLiA whKI$>ZYAVVlw>e=ZktlPtn=Xi/Qu9RjGAHei+mcdH9BSC^ZZbFebLTbHl#9>$cBIR9yLAh\u^HS@jy^
hFSLIp Zaw??y!cj%ML*/!4djEPGX*<e19NHN?F41t1\i@#Qe/dyn*#S<E=anYd<TBVZZl4?dbk9?h6DWcCHe+9
RuCZM8 CTqcTJawH+F*>1jpVyTKm$LX*48YjVRG:u6*9uZV%n^W1QZu^%?@plpHC+FpaReM?Sd+KaeV1BYGhmdK
B*jQ:J *Mt!Vqe&\TItbLeeMeLP&9D1i1F:TN1#aX1/?tMYPmM%:VjXw>EyA!4CWcWnMd&?w*HZqDaTLCn>4I#m
lE@F<B kBq<M6QcIkReu\!!5SQhSSMbC>XaLwY*Cd%96+1c^/HFak5upmmZ4^q:NEk@uL1<?ZtFKWS!T*cS8<Ja
?tT=V8 >%Al@%RkAZmE9#$4++GKYB8jT=Z>\9D4d6+!8NaQ<>5MJTJPRF:9@uHa$A@*Z8#wBQG6DD\E:8pCnLyh
k!u/4m Ajjd+PV+ZT+N*9GK>$=/4a55Wc/5e6T4D<X9AydS=/?bG#q/e5c@VBm>6mS>^FVdSwFiWiGb+?8lQGX+
yi@CTw EJ@Fw!R9WcS44jIEK4:#eeaSE#qiylVkPBAT#5BZhu!FuuH/\h^CRiCmXJ^$da<yi%N&PHS*!5jIt@ke
SDkpC: mZpaNbh+RYMhj9D&!qqA6=@8=@BbDipXHWPP^jhmtiH*YK<Q#pNBLK8eyXnp9tFl/>\ZBRZdblHKI%n+
iR&n=4 8FndHubR>j:*&VmBC@u:QSlGH@!wF@&i\N*TH#=Q:^n+S9WZDqN?!MdR>n$Z@W%nLX:*#6TQBT=//Ck5
-A<=:j 000f1b2cba5001202b4 Page 436 of binaries2.zip
k?Z!4Q ilT6%6Ayt@jBncHH\TtMJbq?/\PIqdb*t5w1jFV%96>Tb6D!6ic5h<Wi?<KpHu&G5YL+V$=%QjnV4%11
EXPelS we*b4ahVblS1+Gi*T&lNweKnmEKX*8LW#>@n$Lu<4qSETR4Dw*B:!V5lRZ>X/Z$!^Mct=^4i9X8t?tY6
Z>ibYa yD5bSAu@Mu+cL?MjE^9Iuc4I489\TTy#hK<u**<NlN88Lc8X/pXBu/IkX8c>jl@?IJwdbhtX^aG:&y=X
Dh&jeV QZy!Y59alIXNAjX<<?5B$i<J6T9cuEVY#jn*QbNk$:i6AtVlp$>Ya$1j8t6cctItl!I!FBPWFWpnuZHm
CD9p1p %8H/&GYX*Aw9Z6Ym9F*aqCVBNL>NtuC&lmNeq?HEQmuG?XyA\F#ec^AHHj&G+S?!dJW5!>jkKeja^!GB
ZMCS%% V5YRA/FRW<bJ>GMDSCK@ZBljtVFHMhk@>c9aZT!hEueG4::<MhR$6MeRnjE:6QePncCl^KSq?=/aLy\+
c9G8GZ t^?1bZYRua&c?jGT:6hadX%P6u4d6CtPTH@>?B6iIedQDK/9*c@$:Nqab#<TQ!<SHuqZjC$N#l&c!Ejq
e:pliN 1/WKT1:KnBb+i?86ycQL&TSjNERVQW@+M*uL^^yZt&MZl=LXH@YII6FGd?*k%$Zbq\>?q&+cm/<BSp6L
wDq*/! LJKpG#WB8@eR6qM*8HX*ISJ5acIHF1<=\nGWwHeS5t=&ZaTtaT<XQyk>8M?lM81Xdc@iu!Vp*/CPp$AJ
%cpNJ? QESq>WWP?KH#lyBFL+?b<=md#eN/NQ!VIDiLa$j%45=pdyLPKRuy<L5qSPm\+NQQyp*%%y99%VtTBNyB
tCuGtB :BStC*h!Sd<VMHSm*1?Gmu5EukqLdtVVNk@@AKnmm&T#*Tu9WDen*>5V?u&/>YJ6u/*jRkLdayN=#HT1
:C@GD9 J1YkA6pWbL<whaeK\b6plZ%DSBnGwcV#EXK+G%e948IRHB8K:m#biBA9mBBGISL@>5HZ4*l>aMQ:aK%l
+Fji4! tm$:uLY/#d#&+W:\#pwu/Qn^<eYy%DH$myM?QA*>4w$QQ>A@/6Z9Aukh1t*j1#w1b46!#4Lict/&L:wk
w+%d4Y BQJ/PK>ZdIe5S?!>R&QHHe*FcABTQ6<6y?<Fy/HMtBacwVuw<P?:DZ!1V<!^T^RIW=YM+X1EQHF8=T&H
/&/#mi Q+a>ejab+uJSYQDweZqic=8Fa#Tc$ukC^twT>S%VM%N#QbXaBZh%cWtbJ=*Y>NFhN<?l*+h&SHCMZq&$
Y5Pe1j MXj5+LMDpek4lRM89I!D=*h^qBphmD8K#tnkSE$jTX?:\6Xl<tQ$9L*Aiy=TiIdu9Ni</QW&b961DWB1
ID/BBC /R/\mWFHSBJYjd$XkGT!?h=NZQ@u^>^/S:/H&+%=KhCTpeh9VWPnVX9?H4i!$:iT/TL*d*JihQPR4Iwd
<^YiGl jhG8yVGFlT6Aq4Zui8HSj%AE*?=iJ!GkjC&/FNp*X1qyneT\5uHRbNE/MWC%=6bnT+Y@K+iLVw/Ea/YV
D^++yd h/KWII1l&6XXH+LZTch@#A@q\:9+5uNB>&b/9JlC/yY<Au^Xu8bIhaW<um8Fbin4F>Kj/lKj>\hNh8<=
un+THI PLd54$#tpw/G8@%#WDK@*w\*lGJ<ySQePqj6VSB^jC%*@jNTDbPpPc$Y@QnMc%Ddh:jYiytQ$>>j1>LI
R?>9jq 8MVY1KtF>PW^dRNaMZKXFpDC^+CGIS$wp?h*PMhack>u?=QXLF1y8BAq>:!KW:l\Xa8%F/DZNXaE4/Hk
k@Y^uw cqdii<b\\i\Ah?ZNWQIGyeNw6aXAT?G!AL5+1kN%k$Wi15\BpFdQ5PQY81Qa!adZ\H@6b+*uu1@Gk!j!
ne$uyJ qZW/!Y>@WI8$Sy6T$d/1K6l1<W9RWb=d<y5NFnd1SbQ9naDt^:c=AVQtKjT:pXX9TXIH4*dY5VQdqLtV
dtGLy! w%SI?/??1t\M%BeWbVY:T@AhMhQZ<eu%\Ne1n>5I#m=9d5@CyQJE8P/@+V?TAS4qdIelZNyt/iL+44:/
QAQuSq hykD/NCB5=aqa@mJ\!D<uW!p^^:EB$9:wL\#j9m\nXj5P1ACRlS+91M<F9u#&bB+amcYXy<Q^iFS:&+5
4Lqa\% 1l:\SD/XByVp^KPR4TD*&%+J<XR?1Rh@D$>G5wd:eG%6Pkt*&n/=e>S>F@<GleB=!aIiPX!inWLdST$\
=?6j<5 :@IBdl:Z%P1uZG<Q&5ehM9QI1&9&N&nCPaK4edttylcIwl&=bPYtN/Z\DQ4cIwQlqi%+Q?#i9LQQtpbi
B%BtM@ y5njL1VEKju?QjmTPm\&Pm^MH*A9S^nVBa^+:@FcmbI$GTZ1B9kFNF@ij+Q4RP5pyW:&+CH&9cdVS*/p
D49!l* >a1/awbG:k^F$Vb^$aRq8@6nwCI5*AeaGXLHEnAZwjlM>YRcG<8JnHQMV6qDyu*!w:Rpnibh@diylCy:
%$9SZ^ #%w5dVnYui9A1VXBZG\SQ/hMpQ9ZF!/uIiShk&8Q*IRPEEQJ>hN?/CDZTph8:dZ#jKC9en4hGiuYlckS
W@*CDW MtCpT/#y?d1E=&pm&PT\DA>\6eLyeH>AjE?C@>4jyHVGamk5?GIq+FR@GJ1/eDjjeAK6Vh1BhCaEYQ>&
/6BQ4! lMQ^\wl5Mih5&ZRY?SX/hZ:@%JiJWZ9&?TuHW&pnwe>ShLDL@Jp:+@t*e6b4G&lPIAC<l9wF*Q5$um?%
9t#G\k hZ:bh8m>@l:!X4m5<@Jq%!98NcnwEjD:CYelMPyIHniAD#5PWuVqdPnX5E=G>b:&QhSV6CKP6RA<49K/
neqHBd @*6m+1Gk5=@L>BRT@+<yIeRNEpDpCSRFkVHnV@!FF+=:t^yJ/ZA</yC^\6CT%?dhF@@e6!VwJ/:^PH%D
#1S<YT Wq!JPy&KcA^Whc\Z!QiGZ%!E+<bXLDC?m<mXFwFtw$=eKJ=aTZ*+D6=TqmJ>Nl6AK^i>!Q^w:M8nHmkk
taE+6# H!lNbDLLmpw9e=ImS<@Q!ZmRXG\T4ERyy<JN9JPVGcN&wQKP>!lXDST4kMQQVe14I4anl<y:uJA:Z^cZ
/XA!w> ijNHwbetDA!<j*aH#<:Y#TSnZTYBdYl5PyLaXi9e@!Tl$?jVC48@YC@1Rm&wThSNSFPaEi9$:cdSWt$D
?t:AJS qVpC>clPSi9$mWRCLVquYVKXE\Hnq!haVWB9ZJ*KW5EM*\nTbXZB%w/Q*8:iwqeC:eIC:S$C4TKkX\@^
*T9%<F =^nwNa:DYIKC?X=i:w@GPSn6H##h*Z*>^M??#c&lnlWY%8F4amnHucPZAq9dC4#h*L*uQ94=iu+/P+qe
$Kb!CE t6=ct=9dK#+<Sc*5yW*n%RulLX?qMJ$X:!qYRWXE!eXDReF?S$Z%jqA#WVJT9XieXqp@kEFYqp@!=\>X
=m8KAG =^?114:DtqPS5?Jm^R4d\THBwZJItRRlIP\?cldW#^qCVB?>?il$JZ@cJIu%q54Ta8nGHK?6Nj!b5$/:
TLy46n jp+$Rp\u@^I1>hcj8Y9t?e8biZ&V^HA8Y//PWHD/!y*wt>G$JPZ5ht<?^bACPjjpD+PZ+kdW85p+!6V5
1+L5A% 1BlS4L5PR!<nAy!YM:5H*HM=^JcLc569Tl1:ctTCY^L9iWWLR?+dL@nuuILh?c@Qw$#i8Rp5=64EyCeW
QGG1cB FLJ<q5K!\ScTT!?ct6d+SjQ^+<?BP:T*8@995p6+&i!j6?6y\YkJTZE<!5b+wyWp>qYb@9:Qdu#ylic:
B8WVtb a=@nw/!IwIlEd8@68d>#tW/HJTTl1y1@q?F=?DlLaIeXmpJXFEZq5Bkt=PjXJmVd?h+M468yk%C/8dVb
$id#^% wKP44\CHIi\ZekylKCbuc&*>JkhN>a1a?GjCRw*T$$J#6nkBYhtZb>!FK@HEyRBIk&<Pj<i^N5m4dR*X
bRYahn yaP*#ZdN!R5^dQ%eQ:Qb\iD*H4bTkAWKwYbAPyQAA>&a&c*HDtX>5+Nk:Q=ypYYlZ*ZL/dF1:%wDh@iu
GWQl$L V@6yd+ID>aKC9lG@T>*^/dDq@d&ic<9njbqQll*/#yq$TS:>^Q?<<9mJhpCMaPwQy+KE&1>Mw5#a<:h@
4YIWQ4 @qCP99>Wa/ndiTGN&m#P&!de#Bad/jaPAYWj:wtPW4Bk:S^l%ZHb1?TP&CYbINFPbtGRXTw/>p%R+B<u
JB^>%w b#>ji\tH8$LHy1ibP?5@*IPEMZd9T+%X%ZQtWCnj:Yba1PaV5ZQm6%D/Mw>&uItH9ye/=%BlW!$\I/!!
#^A$8@ 8WGlyn!k*cPnK/E<wKM>KKQ4$Kh:SGFkiG&LKy\HW\N9Y*ZQ/j=%@dnBaPFRCV6XP!d&peD>Pn^yi\1&
=Q95C1 %N#amN!Zi/#DWcG=FwL=#Xuya&h4<jZVCc+G^*i:tFIImJ:<cSapK/6^hucDeYw*pM\!:+M*BZ?m9R%p
6jcne/ \&^t#wq+HbSwM1Zcde@8Q@DI<$GcZ#cCmRRy=%bT#wc<iDPNY9Kdcb1JK?Dj9<hcY#^>R?K!981PWCe9
wE8:Z+ <Pd+/*^pj1FL5dZ%VAPcQXE>/9n\Mu/t5eZdV19KQ!cXdC*QGi:&h8DFlS<McGDhyi@Tw/8n1#P#BG6N
1+S@>i :$%di^<R86nm6?=%:+M<wDniMY@@@S%cYJJ6?C@>jjplbtlGlw?Q&Kh<Gcit?+iY%YQ8nFll#8>VIq>n
%t?$C! pBadcJR!<WIWl>+ly!8ijLdCm@#SS>ekdn*FlX\1PVZ#mJE*/tH:C&9lPCGjTka9&M/&l=PJ$u>=ybMm
uEqYe* P=?>&4nBqhlA%6aTM=Z$nb$5\9\WF9bAF5HTmMZ^jBKVe*jEedK>=V#Niw9+DFwDMyXLBNZTBGd*<m<@
49tZ9m 9plN6C?%QA:!6>RX1d?RnL^whJkJGnKXyA6qdtMLdcaQ*:%YDIMVEc1a>jSat9@c+eet<$ePjQQ+Etk:
d:aJRu D&h4nmBPTMm>l?bppuN&#?X@Gdc%E5M41qSLaBhI$Ge*BlhcTpA=^tV=<jViItc5:M+j+ZXCwuCR1Lw#
MS^9uY w\K^XP%C:EWtw$V6=J@DI@=HN?4/yRZLy\d?:1H5mi!GHTw*K5<RSWZFp$e!:$G$LD+cGlwicTPpd:1y
EShGl< !MuhGlFIiCHDG9QIGat@e6Lw+A55S*E6I+bJ4Nne^Nqm:ZuiWBLIJS\1EVa>W+XQw=tPFFwSE41nLXQ/
/wm>DK FH#Gmnp%ZhHBcm:=:ShYGEbmGBkMFd6c%SMJQlMXy#^nEX\^m:ZB+m6+JD!?4lwIiDe@HidY$NIG?NAi
dmM^Qn #I=&#bQu8BGTRBtw/LdLmZG6mZX>Tea@AmESE>^mJilJpl/*mM&i+cuW=ZTyIXmi5G!:YAmEQ!dp*km4
/WtTyZ N&y==5+eQDcLhjRTtJl5Adm%MB18PSC5W8wBKH&e:CC:iSYQ5bw>A*hakV?hmMTq&d:M^!!<K!/X*Tl!
EXqji< am=Ppq&jLZJ^54GbZpG#GSkwHyKh%NPZQ4aiZ:Pcjl!lJM!dV&9mXE=#L>T4Y?&&+#baZ@We/^*btn&<
&VEkFb $e?Q5ct4Kd!PKYZjCJFAQMqRA+Rt8%8eHC6H!5?HDmuT1^b:^94M!t6!h=cdFJ8/d/eR4^$nFKDHFI5S
Z:KCQm mi6$S5yS=bD?5Nyyai^*qnTQdtCbt6\lIW:tHb%ln\IVB/F&$VtwS4NZ:B1p5@F/>\VVwlH\jipJ?#C!
\hiB6n uQw^i8TD=h6WcjZLNM=1+/tY\FljCCQ<1TV4l=VhY6Ipc8hISyIep+YKqRmXI156HbHy#kHI6XPZ9^H^
b/RY:8 Rce?y\CukQBI%KXEwdVXn#&9@EHXdlE588F&:ADbpV?a!LejXjq8AG#J#P*MA4P+peepp9piY$YHaJ^T
*aSW<< I#&>J8#R8*D<ii&AA6XiMF9FIG=K8GSihM@5D+dSZ5VyTGqi#TG6Nwh69DIL?<^*4D$Z$ey@+WGRjw$Y
#WDa?/ $$1nLS*Gp+PKF=5BpJ!cLb\S?e:%Yib*wHD#qN5%MYtW8>?d&FlItKQ5IFwt:+XNJ/qIwecqj^D6YMZe
<dLPWD MZj4cYCjih%D=tTV@Y%5>eRb81AJ+PA^5Ly=+Vck/?u5/jay98>!>c!LFZkNCZLc8H<J1wY&4ReF:X?D
-A=?!W 000a1f4f5fd001202b4 Page 437 of binaries2.zip
dSAB9H $=/kV5%unuE%p?ea4DJVFDkdd+J:6!:=&l%FKbNG><D<:cDJIIuCteMdkh1!nhc%\CELcPQK&Te99#Zw
CA69&D Y+#\AZlEbJRElm<ZW=ha:Gw8Cd?t4<n+!ctTM!Qq>G^<IkFMj#c!kAjbPdtA9P8y^:I!TPCw9L/6d%St
JKhV8K Sbh%yX*H*C$in:buc6Q<HV/9nqhc<<LLM^wJp=Cmwj*jL>c*n/?i*DCpXJHc:y$kWSZ$PZ+?pMGQ!B9A
R!KEZa EdmJVwP:bJ&y%dZZV+l>S8@8<c9@BZe@/wp=8hdVKdWD%:6kk+TZVjAG$c\6XtH6BVHwK!1qa9hu4tlb
iCl<6= *V=FPN$i=$bWjE#>HT15!@jplQwia#E@b*+ctkb@Ey@Z&1bPm^pduEQ>ppM&buw>MXc/p9+dc%^1i&1:
b\Q*ip tnqalGQ&LTjJEPayIS!ht+J&\>hnSH1dAtTtRn9>?9yBDwRSW\@VQn#bejS1Cyha#K<i&=QEVQX9PQ\X
yu+=cu EjnpKNFPVwbu$#unmmM?T@Pk^jFL+Ja\Jhtn@&CdFCBJ1CPSm5=@8SbheY+1u#=X69Mt6Xb#GNiP&JhN
P=^FSl R>CPb#1GQ>a=hFP8%9jmM+FLk<@w9VjManudqP#+u8AjG+jJk9+8bP%Aq%YhYTN$daXwCLY651&6DK@*
uSn4Wh SY8K%$9=dYVJRaDS&6^WNp6/68nDVQ>$p&CbIVP^ihn++RJ!jiW*&Xkw8P4#HA<#$#GBj*H$y<YG+lI6
!4Y5TY NqPc*4Q=H@$hZ+@:N*<Y68IY^nG4#+@XS!9ZGuk8NwR?F9VdH*AR9uaeJ>Z@tBwbe:A>8=iDR:<Sc45S
4>1Ely K^9H^^NWHi*PkqcD!i5RLnhZmjj6%@i4SY5QZ1XwuVltS6P$u>4MH:eZYTi^Rm5qSekIM6!W6/^FTBF?
JDAt=^ G*Ah*ALPj5Yu=c>pi98\j&G&ewnu=bVLySC!VtNt#/Z^?K#dp@E=yTJpZMT%nwAJL<YGWbFlq8YDCdIm
:<6$<! ATEhK5Y*c9&4?YM8Baqhcy5eDRR$dpYyw?=8WkFKi^H89neIcCIcXWS+MVQhwh>6TL@QcJX4>u\>py#1
X&>b+E duyn4dMj5c@dyQuE+L+i##=Pl4+8/eJEE6#KQmVAQ%6aye6QK$e!ay:N=BIZb$DWM+<?>e65S9EZ88wP
S^u$J# E^i@iS&V8WZcb:4Dkut$L!ZWMXa!HLIuM9w!yGYHM?F54kcj9MS@JW@ZDi6cF$TT@nltbS6BNa!kT<AW
XAJ$AJ w<4+EAbH!c!?X+!8Id9:\?QH+jS1itV$G@XKSZatHHabSeeqjIp19p?Q*DEtqeTJ#lcBl8/@Sn<EB<e9
kB>\68 M:qXnKa\cG@tM=l1D>hFcc4bSl99/9hb^Fn:+BVMMb!TCe###?>Wk%SIlhc4LmbAC5JFdpL:Q5SbG5hb
QmPZYm ^\Y<ZE=qG^61w<qw^j\5luJT!aL<m$pw+cb/?%$^ZqV&YF&W$96q6=E&5=M!4T#Kn4LDdy?F>l@*D>SB
C\4VH& #JnyVIKa#piH$lhMKd:ai>Sa8WL8>XY^Dk:tLbn>ipcFa#1=jB:*8N<:cKVFjAnl=WWy*RQeiCRR$BZT
AmHI=R $=tMSd>5FX59>>6*#td5N+cdyNjlJn?9T*^5$ZTWmbZ9EtW%XLNTT9&XeL@qcQi&na=L/Zm<py++/$$j
McPhR+ M!WX8n!q$LMc^nmCL4<h6*u<GHblZ=ZSD!L5#JZqIRw>>C?=dQ98MYGR6^W*SSmq88$B?CTKFcMC<+%X
!NG>:& 4m+ndt<pPX4aTNQCZM\I8kjwjN4dVVtGGCRT=+I^/%Ph6%R1qb9S8>AIWk1VA*XuQK!R6khpM8hbBI\^
j/?Q+L *>HF6IFDa6RHa1^<Kc6eDinE+NElEYlJ/lG4?<ZW!M^R<X*%QnVEe?Sd4au1cl8XcqMZk$SP&&L!DSZ?
h#ujwM bEjXT+XQ@aWj>+1bLAX?YaYa8=at=BnZ#D$Hn?+uW@Ie?E!6QGWXH8/nTiXMM?t/tM5Q=BRGb%@q&tp?
Awt1Gy L8Sy4neTebjGWk46V9:eamTIFFBd=ElwVN+Z%E8e#puSS&8?muMAyiac18*$8nJhFy>Zj6&Z5cq?6G:m
5BTD#t n4tkXY+l#A#R@+&1dh>&hZ+?q^a+YC*P&hjCV<1lNlBNHyjq1q%XN%j%l5F\96LShjKNWipCbdj=/Qm9
S1Dc>F #^QI5%WT+E96ZQ*hYtEDcHiHm<Pdi9V:abR^#hn&m$&Y&Wj?c5L=:/tpi+u:<>Wha$L9Kp>F!wIMFT9B
8\@J9u %^WLqQ/#Ee9L1:?/X/i*=PXFC>$5/E*Q?$n%&WkP5wjjyFd9n$uHVq#jyWC8F<<WZmi:V6:EjYuJhVVw
+M$c/t aI6>cwlbV45=Ak#!:j:pk6Y6Ek:NlT/QqkuMh=n8jDQYp*pbk%wRQ&Xh>XFqKd9M&F!DGaPkR89>DS+#
b9EE9c qcSIRX>pqwJWS*j=T&lw#Gd\jtpe#4jw<G^Q%nW*NkhJw\c+/lQ^K+>q:uW*j4dw8YCp9?t\M/#I\&=$
>F8p6h P1<cjXI=L*t%<8QEu9yVuR=m*=bXX/Q?P&a:qTCq$/9+!mW@8kqQp$FD>nZ5tTl>@dt48w/8:%w*hy=*
wA*BG# 9q*9CjaEtb\kmS8VqKw9?hA<cY<<tKh@KZ8NY1#LhBcb$&Hu5u>:e:<=5mi#SQF5EYaTRaZ!^utIy1Fm
<L?5Zh %H$>q?=mdHSMLan8JXdGI8L6Ln!&a4ub&%l4/>S1jY?4W:VCw%6?taY:c\9SLCHXp%h8uSVMW@RBBlDi
\1FiH/ uQX1/P::u%#KVpZJL^aSiP#IbnLchB#inXA+:8QycwNLAe1QYt41<VW=/DPH$mKn+ZPq!FlN*MED1RdG
Q*j#YZ KdXW6+$VSCLDdhTm/RF&kaGEI^HBqVFSCw4#GkcWQnNbT#4M:pL:l%MBB*mQyuut&5?1:Q!a<kNnR>GE
qy%w>G itmTCZVl<NXW<muX#Q:t@JN8PZb?/+&Vh\=6p##wh%@S9jJi9ZyVKyE@>Zy/QX\y8Cu=$MDE$HSTk*NB
ju@#nZ Eek#j9NWn!SWBcQ<u9!@>Di>146J!dVe*<>wkXF=p/QtBGjYkmbRFylY#Tp14JE%/ZMC/61$hG$=<hum
4b&A!j DCEM=y#k=H@bh<:tE/NBJ?!%?yWB6HS&/<t?T4SC#n&pei6bWb#$cdITI8*nM\8lRLBmIZMj9:8dSAMX
iXniu6 AaP<FRqHZYM&N:j&Pki6yqI+Yk=BZjpIyyMG&YAjWIedeGiYn^a^HHECmInpS?QndIqyFa/PR$@n@bFQ
4CM$4< pb11J/PQj!9M:+ZFCqpDHi%PebIRKJ\BpuaP=9nNGb!4E?cewaI5?+iAMkTI^mbE8MYbP>KdjiH/&\wb
?G6qZ$ yDny#SaRn=!hj?FQ5mXWm:dFGa^ktbGmTEcCGEIkaH4lFqLG9^XCIFREbDADI1D6L&WVltpTmGWwdw+V
cuTET> bqhhqj:1CYa$=<ltp#TNIbC9?4A%8phFLeEanKBJPP1tc5XkiylNk+Qep%&TVWLC=ya<Rate9J@E^@q8
wFV=>\ Et$$*R1NwluBFy&EkIwwl/NW5hiKESENN81wBZ@X4CkcBeeYS#c@aSXd%Z+yklWC&kK9!DkBj*tt/ZmJ
yjBpX+ KSA=#E$FpX>y<>F1KSk=i/ZWjp<SK%%FJ\WRbwFYwQ$tyGiQnXb^Q\/6FQp\JSPR6/hk8nuPJ%Vm/J8>
McL:W9 kcD^ubLBR?VC8YhCTctQy+eG^\a=BbB1MbqJ+=!lRZ?abd1@FMJutYk#whLFjBki#Nd#YP?nyBGMaEbQ
511AK/ ph6eqNGHjJe=aWdj1=HG1RnlLNZM%hap4&hqMM8tCEdI!LVcRRDw:TpTQqli#KQSaNyRCK8p>jRG:DZ%
\R1yEG wqE\IuF!e==#Zm&pePSBM8=K/dMJ?A%L8VqQPTD!p$lZGaDyXD+&T<^kbI$@n:<=Eb\Dp\=%^hKXMYZi
p:y?^B dh&/bl@lBNPu++mkHSq\bGS@&P^F+\$jJ%V&RHCY!e\AK&=Mn@bp>QTcMajet$dE$Q#M86+e*\SQbn>8
VpRBIZ #kcZtTEJFa*TA+j*^IJDRDtKV=TMmI1E1uKnKa!Mw8<*i+JDCMQR*+tnFWpn@Rmb:TF5?Y+//c&$qYW/
5u#Z\? /mddm$aa#BnMy!TTpS^DGHKXw%l!IY$l<VcaI!\jdT>ieVRMGVqp5+eA1Xih#R#BidMuDJ*ACt$VJERd
<KWMMM #BtPaFY@8Lp=mVdy:i&n&Ih<+ycL45:J^/c+GhPV4qm%PauDJ+LY<+LIj\L#p=NJQ^y$b!5E1%?E+eFl
RwWc89 *u!K6InJ\C@q&SjiuH!eIZ*I9e/k+G!T#ZEle8TihG&eaLbk+S>!IcPT8YlabYbw=QRqd>meyW$9RK*Y
TP#ZqW Qq6d@B4<J^tdIPGa9uDpdK^bBPh5jpY5:KycJLbkbSl$keI^*St>PMFl&l4Bm6nwtmSFXk\cdPu9LDjw
MQL*%i \=BDlGme9@P^:hWnB&h@RA:8ypEdLSPy:?6XFb9ECiaM#mcq=MlIDtc#SMyKB1F6#1lqk@YiCW>!@RkZ
Bw&tLR lJQClY+=?W@e^!@Me9*+N!i>aS&/LY%N:+ZAT=!=$NmYLTCTqSAu$E1I=AKI:pjte&Ly#TqWJBPe/$e4
XRaMHJ hC9m6?/&CBL>BnR9E/KqB#Lt98dMSRQC6CMb\8cn:FjmB4VKQe*a+kS8\8bQ+%4mw?^N!icejT8&^<t@
PIWkwa JV8?CjMeIDJR?M?65t@GFn$RHY&L#!4pap8IdhJ9EbR<Vm8E^Jq<#:@=ZT!+b$?^^K&H*QjCy@t6&=kX
?M\6n! 88ajp9%ed&Y@NY&*$Y\ctBE5$$X5*Zw&Kju+8Mby8dMSEc^ETYy=DpG6d5H<K5m=kb!bX$6ABEJRc<dt
m!eTKn klBcT/kKX\<RA?*C9$!Sql=$\bu4X*XuTBlib=W:^H@Y55ibm^T#PZ:LmR^EeP8%Em49!jYDTRaKIjQt
aNn<Qt u%C589W=!hn/m+E/Q<JkNt<&5&^1CV:Z>6qeINyYN1#hyF<LVJtkX9<:+=G?9q/4i1DyyPdtJte8b5?i
>qHcLZ EA%PJ1uySTmdn&K9e^mBGTJ!MCIn9*I^#EGYcdA4*P^y>BW4RwCm1%ayRmSH@9Zka#S5HESXG5JbSW+N
yNV*X% cRSu$=m6I<K@hlI1MW*Kw8DMtpR\E6HIu5%^R9iubLFb+^?%MJ%RtlAm?DTJI#91FwKISyn!ucM8w@^p
aVDNZE /%98WMmpN/jiBN4XukWc=&mt6Dbt>wXeYDdc4L+\4+yAV@PlVbNDT5qSSWY<>wyD$@<eVqwh*H?Zp6dc
?wa+*H &ItJmdQt%w1K/9qn9?y#n>d%a:<%^?dY>V8D/4Qtnteu9#Wun++=LT*HbwM%J:@1?V8D>YPQn9t:%4@<
p9&TR\ <=*1<*?c@*?/u<J/6/+@H5Q1@?d?j$d*YDBaj<u^YDD/9^/\BR>GE$yn^%$uS^Z@R=XH/^6yKY>q*nw:
Zb15#* T#1:>?SZ&9RR/n1dnyMk&G4!c!yNnNEReH#D4EFD5PAKRTB&#bt$upB+4\TLpWbBq86Q==*@Pd4AH4M*
nBlpqC Si=&DwY!It@*qNEtFQbZ>9n%FC6WqN%FHX1h5#\u4EyQeuMtKEZMNLd*KAH<B\4TJ4AXRehp1du#j^9w
%Kjln+ ie$ha8SAT4Tmd:4m$N#S^qGCkYI/J&?=tcc=iLSW5y>qF9C81>KZWP@+Y5tm<BCt@&cRu$Q#@M4l\:Em
nAGH$c aicaR\bwVJbu%HNc$&P8@tTl:?K^y9Y\ij5NmlZ*nMtP@eJlynVc@LINaP!\%RtK9XEJM%@Ra*DttD%R
+JjM^h SQ?djctDp61ChpDtjTC=%wIS#:P&ZbF9c>iRTceNAciBVWqR*^H=k/Mn#PdR^?5Xh%mZWIjp@+i$j\!#
4/QtbV JYncBiHX6t*66t*d=t:d6t*d*t*d66&>&:d6u9&<<=+=b?dMn@t8L!1nX6&SqSGXGbqXGXjqY8815L#/
wj?dPt !iZJc8@XS%$9hKhd9yBZS?@Ay1in9\14&ISq69Y5\/T*<8E#!/@G%t*H=?Y@p>@i14\!JAu#S%GYtPu<
-AFe:h 0003554b948001202b4 Page 438 of binaries2.zip
J?ZPYX <Z\/6#nRP59JINiQtpFaiVb6Q>c14NSuIb>996@>@%LM=#8/QIZ=w=k6/dipq?TFBS<de&&w!*h=<8\<
GJFKm* \YteD5P*ijnW!W*ZV/te!65Q#W>TDnNC:^9L!bthu9^F$Pyin<9L=I#Lb$J:CK?j8G\dk?hZV86M#&%8
n$9RqA d?Z1X?>N=69nVMThe8qnuw+1=LJcAqd65$94$b89Zyy11&T4ZJd#YZiH#iKVVi@b@!u>49$Rq89bk+V>
$8T@?p htt^iZ1%Y<q+?tyWiQ9QpQm=c9tjA?V@%?SG?@>H+j>H5n*/@*Vi==Q<IH>Yj:yk98Re5*YFqhLjBa5W
a!Q1eh lJceJVdQ$+#itC@j1qNj4dZh^!!?+5@alIDjYYGL?^&ienpp>$pI1SqBD!B#n><+Q@Ium\wY4%bW89P5
*F$HDi AX4V#M?%#e\ZH>N%@:N:>@^<LjQDdnJqKIm+Y6%jXyHKLDBDW=p$jaQ\DZD?MGc$YLSTK&9J+PpLW!+6
#AT4YW !lay5:dANbVA=/%1\Fqyq9k8Q=j+?Luc=Mu>L\Qt^$j=hudBVCpWaqBYc6ChGD8RW?=5EIKmFB#&!AXe
Lmic6B Q<a=G6#dtT8n@Z+91D^R!M+<bE<miZ4CBE/GqNpG6n!k^CIIPC<kSQtlDnp*B=Qa<6aWya15=Dt?X^9C
jDB=VM N$#YapipZKpHh?&+XdnFe19PtTSEICmIakZ$!!LL:E4Q$t#%Je95j*dNq&?8$n*5CR9@miITlWE1KFda
?b!Ijw SeqmK!wLbN5!4GJ\uQ4pkhJm@P1YmKJFtTI>&tCC!qdlXjtC?bjy+61IE5k9dHPIidbqX5CEkT^<V1QM
kECPB1 AqMP!$VwBc9iat*e/:ht!j</hk+1jJGCn=mXKhMaWtAyLBCVDTmDC9/&Hm5weT?YKM8hbya*YYTSe4pw
p\tING QY<^H:YZCui4SXTWlGpXL:cZCucWtw%+>#JqttIKLwKKJc#F<Fyk6Z4M:X=9!bwZ&@+6d\B\R^l^ddTY
tb^/5$ F=yYp!1^%m>YLbGuKD@>8\h6Rh1y1%^tBnG6B$@MYJh^GEANPq<65*i6nASmB&M>W:pL:m/XNJ?6*Dlu
?!HnYn qAqmVi@8BZEIPTd1*%R+&@q\%9hQm5En+lcdYtpqe%8LnZj5\9&ckYZaL5p=&9BcqPZ=N!8SpG*a&IL6
iS8IkL Xm+=C&L\u&+/D=N4Wh5wL%?ckJABS%#J+c=wXbqe!V+8Z<6lXc*aYDTTih#VLqkWMuin4T\6j^\EPl+F
DA1wq: #&H9Q5$W/<C1#n>mMIBHk$w?S!u*6HLh+uJ4q#WI^Tw^p+6e$c*R=QI$#a$8CCdqeJ/G8%1$Z5aS6>=m
iLC&aH %6ReMPkjRCla6yL@dbtnejdS:?>PK6nNLQi+$6y1a/qepn?neB?1*D%SLi*G6YF:cW/GKtXyyZd65n\d
D!!pmE 5MAW1!4daj98@CVAe4XSYyG<!5/4R54KZ8^YW&Guna^hBCXT<wjqQK8+Y9c!9<Rqib1wwKt$I586c/ja
mlK?cA MZ+RmJRdEtZS5Yb4?k!yBHIC9B^Q#1LC9KDWlH6:9J5IXF?\FLSkI9qGbI8F8*Sjh#%#IwXBJFtawmSQ
SHjIb! L5!V6eLeyhV&tci\cR?<$b^Z:c>1WRwd?Lq%eu<AiCn1A59p!l/ElqRbpbGdDFTyVB>!^uT#QC6FmQIm
pqDltb c*YSGP#$hR=#lZQ+uDJXE$q:l?5S61Z?tm!Y!mtyepF@hWi6@D!YLQeAeuQ!Eb8hJ?F%b5PDq<X8<yG5
beNJmw ew8m*GPtYMCYBippTww51*ARbR/YCBXK!Sb<=GI*H4MwW^uiL8GeYqLRcicm5FJPB+$#=MZK*+LJRnX#
q+VSCJ @j:ynayCLKQYScwIj\CAyS?iGY\G>AlPCuLBH!A&D$eEECEAlmJMV#NXXXMXESMXXSWSMVW#i$t59tL$
hL9b/\ 5<9*9H*19>V:?Rn4*LnEVhcQn*pamA1y1A#eD91NVu*e<hK@9:Y8#cZ^ak<&&p9ah8/&^j:mp6*LpT5>
*pnyAc :=%Ru@=C#RN#\Z4%1d5dZA8&Z<y^RQi=1665y\j1@N#eJBJnQZ$DElC!1*jKCBGu>uGSDtNVQ4DS>CIy
NG!#mi ^/6w?KKu#T>l4:1qcmnIJA%&1=>6BXnXlq>DR5BTcja%@//iPBcZF?pJAN^>@m\1ZS%Lhi8Yyh*5/$#S
B/\/4T B/8Xa^=nRVutGBVa4cIj45\YtL!X5E$jS8jS#V+E@W:=YZ^CayquncZCiR?KZ6ZpBNXFlttD8X9bLj\b
a:9Ppj 8:+w6?Ap1MZI?Yqay8j5//tl8Yw/9&6H%9V=bEC&&iq+l\6tnEwE8ePNeyM4?n8<I/6AFEGyly%CRKG1
tE/ATi Fl?tYMXp%Dj8$LWFEmNL5mjAGZKEeV9K@qH95Dt96>54ccd??=WXN9><!@>Lc@=4neSXPt>a8i@=ujCq
=kNVQ8 D<9nja^Q=ZCDXQaXk%L4WQPYLHJktpP$BD49l%RW+mjeS*m&Wd9@8GyK&DqYRAEJJDiGD\>e@#G6\TLL
dubGbu !GY!!8wLM:NiuImZBZ>JiaI!cwM@$F:t&I^1LF/p\#V:EJPKqc@N:FuppJE>lb/iPE8$8%M\tM#VHi^Y
XyC+>1 <i*6It6Z4H9heXRTQJ%P8LCDI=udA#=SWZ#:#%BPBAbt\5VkeFpd4XjZD+jy>TD1DNtW=dHL&!l5uWCA
eDkKLJ CI>CMlFb<8$6!8c=Q6uklXW8nB@?#Z/XC1eeC*ZF^MZ6bF$Pc1/ja6Ld4l:N:H=4l$@9De+Nt@ZjS6Qd
yD@Tce +?p5N48BHn9b/tuZu!HphGcRW^?q@\n@=j1a%/d?EKdNqKJHe?FBaT>1YW:4nBhIhua5lm%k+T4HLaeE
<Q=GKY 9$6SG1#uEeSmdWPX4Rm^C#8#e<TiZ5ei*\CeVPiK^=i=#MSZQibXMa?L%&Z@K?EZ*$5j#mTe+WkqY^kJ
Ki!Nnq J>1!!%SQFP95lAtjd9Tc*>A:%dl<dt5eQ:nt/EIVlX?4LRB>HDKQS1K1n&b5RKX*EHC1lL$BH<JplPji
?tC#J= Dy&F$5KHPj*l:Qn%\EW%t=YeTbYR+Zytqib#uWn!!dT=#uS$pmky:?aGw#ujW1p/Yw5S!Xm?+Y5^1\\I
>k94JP 8uCy5^EQE^e9dq@tKHl:tT^4Z?X<4SdFKd<*G&9NqNKIiD?V:1Z=aBYkRN?!WWDDQN^#c?I<1VMZITp@
N</FcJ yapnMZhLdu1*QK9M^4e9u<*6pD>C?MWX+k5YB8eyW!FNy>*8Bt*@tNTtBJ8GZ?lB9\JIQK^?&$9YIpPN
lE5K\/ FCZPES9/5HnP4q?:hPZELbLwC5KNhTw>%nZ=<+jR#9F!c16yNjMn=!XTcbypplXI^Y=%F9u>c*ic+ktq
k!Jd<M cR>PVJ5wH=*RX8Y%$FdMp*ejjmiI49FtJ>TQhRSyy!ZX?l8Tl$D=QW+KP$+*p=*lLT!V4*qHma<j9@I^
%@P5A$ @aZ<6BB>t^4FpPAQ>Vye:jL+l&+Qd%ZN5u1@b<Sycm/udaQ88F\AB@h\Sc$B4<jV\%XN$y?5XHPHuVLQ
1wqm%A Z%bKWZqXubZjcKAwp>+*W5YbKX$8%I?Dqe9LCE4Dmn?qeC4ibJS9i5y@DN?w6uK<:ZKTck<8&P><e5H6
P/@yN< ZBk*$ic@?MyK#$1P*1tcR%8qyZ9DL4<J/:K*lS+nFudP^pjbNt#B:W#96Su8j6j!6yHeG$m:=YJS+X<5
lNGGVW J5ZREb!*JR*q8DEEL>@@/p+w1iyXu8&h5$^tP4lJ/K%@uy6=6Wjim^F@+#Vem8+e:GTqiJ+:^c=jB!>L
LyN1mL lPy^TuVWpQ+emnH%CRF?6Wm4maVQQ+hjXTJQ>Yb$ZjBPI%%D1Ql!y/:F$KW81<k</%/+Cqu$<4&k1qhP
&BQ&ZJ qB<^ha!cwPh/+n#>Xy\@Qm?nXe%h4&l4^1hHE&K:jV1R6uFN5:ul!8Y8KitIi&t%=ub!D:*#%Y=**IVd
6P1H\l %1GqcZi?\hmt4!uB5b?<G+YJ\<m<Q=w$HZbS5*aYhyN*<9Il=i++E%AZ*?i86J8V!beIMW8kTJamSY:c
YdZEJE ^+FLi>:/+!/Dn>KtZpBcpWD/%=YYd4Llc8F*ea?$Rb4&jN8cy/%+$j#yw/hAdeQXKNqDm$B*QiI8P<H4
^LZuRu KEdW=ppidy\GGF=h=K?9$1*Dl5uyX4@5Cby%Jk%#*XFjt=ltL??YVyi8J*<BV6H%1R:F8\5=HG&&=8i>
cRZNkb =pG4$FY+>8kCA8/YyItL16t<aWwu9%TNXEICB>CtNNLJCJbY1/QS<TKHi$1Hi<G&N+j:VS^V//AGnAqu
WB@^?y W@H8#wnM\qy@l@=4BH59$B=<4ap?neS#qQp4^b5kNt6y4EdVacKIlcKy=9!qkIlBSQTQjiAlMN?XIyJ!
#@QGSk #JK/cnXq1^H6h98RZjJ!Y=kZY@cZh<YRkb8bub!H*6pEy9Z!>jd%E/8m9y@k%Fay%%=N1HPIY&LXAjXw
PT=D:: iZk&ZG9DyA6+8958TQc8ta5@D*HTCKVSG+&mH+$B&<jSG%jeZuKT+=FJh8^jIHaCG+>c4#pen!#@k/mH
e&>bj> elyd*PEu=4Fy>p+INZR9*kjiRldIR?FJ?*8I4nhq\?<wjCVi*RejuV$66maqtuFw<WXJwaRM%CCCCc1+
LpKT4= 1M^8!!LcJ:dR>l\LbycESbkn?!G:A&FKkt%4yNwbayaYXS/X!5>LK*IH&NXT\YClh5bS?>ljuwbyLG5X
<#XCM4 ZT/&j>S>9>+ldub/jd@n!Z&@Qq/8NlbA\$^PyaW%N@LH\Cekt498eQ^hD:pk6PVHPCejwkTS<I1l6eKH
@9HF^h >^MJEqi8EkZH?StTb*p=uyFy^aB%*Snk=M??Ny/IFRm>yZmjc!H&TZ<GMTljRV/VTe+^@64HhjQy\9P\
!yQIWI b$dhaM@A&l5F4ku1I@LC#Ij!cN\bhei8q9t65*b#G?KhYtE+HnXk5Mc!$c%%u8b8@Z:M/Ln/lP6IW!Bh
?<aQpq mi*>XL%akn6XZFG5:R^\?bu9:5X#:W##cq=N9qS@LDl<+=NQP9#a9ZjPCS&=b1q$S*/P4#DHp*VMK=4*
?6Xe#n lXii@WGEI%a#M#e#h:j$5HL*nQTMCp?#>QKQ>p/LeQPM<I@*nub*h#N*e#P#<DD#eQN\#<#PCnQQeDMN
GK=jt9 V*e*6*b*#+/K>+>*m<!Km1@ILI8M#51P#</9mM!515lIn+!K#K#P:@cQn+?1AHSt%hZFS&bZX6VF=&hp
kZ$HRq X>cX^<hZSXhGydu@$&=ccXV$w/yeWTp8L51X9!BZ5aZh<V6FcLP8wF$5B991n=aWpq4cMTT?+9uXqaZC
9%^&SK qq1CYLQ<5FaIY#dXi@t%S=dR&1L=Rl4<wJYqpP?Cj*:8d6MqmIWpF\jlu%5!QM6q=RJ#Xm<y@tLW5:GN
aC%NXW e1$e8GY+mTY$c\WE^>B>q\<Ze!m%5C#b@Gt1\LlYuXbFLmCX@N##EIE!lV<K1p*kXR9llT\YQ=Snt^9+
A\jMW! ^VH6cCkd$CIScC&jd+D!4/RNXbLbI1&YFCtXH4SEqBKctIwGGw8Khdpelk6qYJ5KE9ZI^y@qeq@i/9#Q
K:JH\> hS6IC>p@ZqJj9H$%/+44/?9Epe$SFhZ9R?dI#6Xq<%y#qqw1Aw6VF4L?Vd/MtWwGIm#4Hp%ccu@8YQS#
t4@Rhe QIenL^V^w<A&\MeWtV+FaceSGTk4I4teYweqbGWb/Ei\:\G$<KViF1@?ED#i*S=ZQ%MG5y9nHWAC+dAA
c?<^X! td*nF6\6ShDt^MI\$byqV\^qZ=C@Y=1SZjdja6MCuFCkc&CFlcHuqS>d\AR@kQDjwQJKCY&k+:1&9i!B
1$b&14 >%AN1J<\h^y%tAXTAaQVE6\:jX81biuL5t&*e*yuyp<91jiT$ZKINBHlb?qRHH#/Iy9!R&L6KC8N+J<I
JhDGn6 k1m>Y?5LkNG$bKSba?<dXT$1dn@@&j8@h&FJqy<kA&5GG<1Z:EC%Lddmwyh<5M#/w&Gwba#dch/@L/+B
NXS>>: MHhW&QAD@yTc<l9\j&ej&hX/beiIlZphTQeAJ5c&X@yIXZqy!%/\1>paE&8@X#%C<EWDP51jdI#>Qc$Q
-AA9L* 000d275762d001202b4 Page 439 of binaries2.zip
$&dPDb P<#B$mwYwB<^<t&QDL>:FTiS6RAE4D&I#FP?@pA*>\N#nD@!?Z4ZyH1QJ%#AKIt&6Xh8?IRlN:R9B9eD
N5dQQY #V=:#@mDhN@dA/p@u=4n$qQhEL1:I^S$Y=Bd&l4+cVyFuL>m@SbT$a4<?WF>EPF<Z<V@EZ>aj<^9+%+W
Zn#9+A hER&qL?W=\LduW1yi/1LFetSYV\Tbk:Tam$V6a*S^w>$:RE8lb!GLw%Y<I*Q$!wXbJ@nh$V=nX=RWuJw
u<m%\B WikRy1C#J/kVB/86qmZnu6Q?*XpN+99C@K6Mujttteu6^:^V9&K%mp&46pE<LN>pB>8ccpZ8u&1nt*6e
ajm@X9 8ihRaw!q1JVITNV$NRRTAyI^9m%8\L+JCpm%M5bk#W++qQq=9!yaLu!$MWb8**YSW==8WBe>/p496qNL
>Y5PyR L#J:Qi@pb9YKp*\LbkR<F:R9LMw*BR&#Z&?uX=?KlWQAYR!*Sh%X!Ej:nwLJbA?PtP:q#/thRY/$!yN6
QmdV%l K^K4Mai>nWGGGFT+1@1IIhb@AaQl4RH4G*?wN!&^jtLK=&eB5:kq:FlH1!BRb?^cH%E&#E4A8tyqpAKX
yV+#A: Y:>Jy!N:cy%Nj>wES1%JWDqj?G!*adA1%Tj#iSaEP8Xic^ni9e8>5iP$F*#&<dw^pKVGHRaM?9l+9#Pq
4hl^@1 cHBbkpZj1@*8NPdCAB&%FjSe\9XQ@:S%WTa$4L*5G!HS>TJ$M:icc=ZRS#GwK6&&BY4Hk$R?ESSV/ey\
G=5j1n dGPcH/MH\%ItjjYjT4@l$hecS$T\IZAH1>hJ1<=jRS@+>9dt:IhhT9E>95w\nk*JwlCyuLQ5TwR/Kh:1
QMJ%E< M#+ST?Q/\MJc8DeVVa6LaHL$m^mC=IaKZG5i9PPecpMjRBcHYV&8majuRCL!&E#CmC<:cK?8+nTl=y4Y
b@F1%X ctBqH\IC1bFRS>P#<CP=pt\PwwmjcRTd&N^hAKYNpuP^M@#ARcQBcnmR!\1NSEyMG<QqE9\/yF?1Q&R!
?Pw\y$ KHhtj=Kk@G/!YGM&M>4bt^pk!W6#B1bSQ?Gl@/&*HMXdB+Zue*WSV*Qlh=aw>1SHR8*M6jiHlDwh#iH+
DXSV<d 8e4>YF%n^GQL4i\B\!<Sk+GJ8nBTIR\BVX6S=LL&$G$KpiyK>VM&CScZ^YHbyRNiI\YI4qX!!9^P598<
PEeXDL ZnCA<Y5^=E58jV61=a^h9bwASt@b>J1GYD\VK<Hn<CRL*LqLQjGQdFye:N</eE&ubMD$J@Mml:p<PM!J
DLYFp# 1/%k$l%GlnCm?9Eld@+F$iXV#Qb5m^jQy4>8<P>BjAL#MVAi&u$ay8?GdjT4N6HP9N%&ILqJ&wP1qwtc
=VWAw1 AF9*9YtkFb*X^FWjWl?WJ%=PZ?$d?a=dm>@wq:dy+>yDGVR+/8uI\PdmHH#FVw:e\aPQAwMC%FPLL1>/
pPtTlh hd9:94MCieLBMIb%AjbLjZEwA5^Be!46cT1\$**GhV9=>615e=+mMw8?wWwTQCyX:&G+^G1?d#Pq^&#1
8^B#yG ^1YN*iJHY1ZTR59!V8YD$%QKS<:DQbt=m?DXKyPEY*=#&l^^Mb+@XFhqNDZaAR=CuQ#a^9tQiI\<nkwI
qAu/ta 9/nZn\j1dba@$^IFB5j+VPpRTQCA\/apaiwjEN5JGFHbk++h!YZVk+kiGB\W^+Tt9MjH/MReaimbtylH
D9e8+: jZkkN4cN1@cJT^9mQX5*wPZJwIXh+KZ8$QlE8eml=mZ$QE8CHHcS*FTi8/?p?i=leC*K=%5=#bnjBHn+
e5@Pm= #P=V#9tD+FFYS+#DL9cbdA?^6m?iSV@<RH:mYkJkm=NIP>GZ*:FYc@1I&pEQAAIb/QaXXhcRH#wn48ww
!+We6+ IS6K%dQGREtJ?LpjFJ/Q$I#y+CKyH=hFVNbannc^VhT\VImak1wASkn:9&nBHFBN/1=$jhZtM\DTwF>k
&*Y8e1 >bniYe5kV/>Ql^\I49iFiYiPl<CYKH+jT=Xw^&?:/Jm:@EbIkThA64cB9Gb@nWKP:S1ECYFp^qYq$e=Z
cFBEw= TapGREC88uGy/RwdL:>kCS$Eh8atjNASAPkSwHT9MB:G@TdpMZC4b8QV=!$+\u59iy?/wPlJ%>+$:cP@
mtPd6m d#dc:?$#ZLppwM$p\WcXi51A@Y=$QiVGX!NhS/t$F@<ajX9:Kmp:BPS/c8K99p?Rn$cMyykFeitLG8/H
PXb@J> WNuC$*Pb@9+XVACLBeCB=XMemN@%m+9l&cX\FLDhycMJAwX1kKiLCG9<?8u9#X/1*/4ZD+t@96EkFA=G
?b=AH? d^MkTj&XtE>m9nZhEqpd<DM?w$Fl<RJpQNa<lRn55>&H<PjT>%:5E4yKc1@!MyRwHi*B\V45NXDAScNR
qX*^YN #DXnT*5XCP:iKX:#DHm!MqMc5YHaX8wS6MZJ<lJjZCBlMYE+<\VE1$<=4uK?Shi@9tG8n<5+PNutY$h:
ucWBLW qWb?Z%?uP/8<GAntea8K/*CeQF\+tD6EeDV<ITWwnBpmD1NE/qNPac!\P&XV\KHl$^da^d:8YPiCeI>G
?dE:SA XFWwJT$e1CS@M\5XZT\*<II=k&54eFLVdC5HuQYV??PXebL!N$@tV>qFEBpk/C<h*=!H@$&A^<Xwl4H:
JjNHHy Gj%TPnPu@<\1#y4Q9/h<hjX+w*dn%:ciiBDSW/Fk9Epjp1AyE#=G/L8<jqeIQKkJIiiF^>XLlIm8F:t4
bZc!Ii XhSS+JqmNHqyHnlDIj?ktH44Z*8C8>Ndk&H9HK%tY?u#Pt5G:RVLH?nY%=$4bMhlP=PDjdpS!dymbqGy
Z+aZA< ?1PD5eHSRW^H<FPeGE/:u$?5&8QdB$u4Kh!c&uXlZK>Lm!RGyhE$C4=e%#^#cyE>QZ5ccSF/ey?pAXbi
kLmd%T yQWTiQGH/ltjAYl*:j!1MIkG&I>TE6VL$tAGubMYP6n+YtF4>kH?1>4bB66\y6lM+!y+ew/bk>\NXV$D
GJ$a&c /8DK#l41khyBdjX1eBcJt<Ia#pWW^AuIS@!i*Z/&!5JQZSh%?Y1CEMeI::4&Sk>G/ADL$4&9lL>@QJLL
?%9I$% P%LwtbLiXX?9%@KRqnPha=c^c<Y8I8IC$uP:IARY:ybd#^\MM6>bH=qqjZ#\un@yYjeqbhII\E&JGB#5
iPAAJ4 FhL<&PGh/&yymQRQJnN6dJh>Mh!L4a!@ZPL?@IdW&5^ebHV4kl=Za?6<j4^I*S\DS*F6L5YwL8>WeWMY
FF=?\8 @wTyubmMF5uh58wJpC<e>P8QMJKdA+=*uHQ>piGwQ?AL5ZeF+mVTal/IViBcp<HXwX=5I8iD/8Ka#aI@
FPF@bE wKB!Euw4AdL=dq\Lu#!WG^\S#>ySE^lqliM4:i\P#86Swn\4uWdyPw1#+h\8^6\5#!^\@@ke:+hTpAYC
*&W@Q/ S>lGYTjDi^Jw?ILpA4TdktQ<GnelP@duPSN$/Hy>hP:1iZq=64l!PuP!\p6ye/M1mqjqV6\cE?Bp4kN^
H\YP*a SC+1:P^W4GRV&PAcC\tAPV%m+Dkw!6TWe:6/Th*wPKkBW*NCEF&ntRA4ZTHS@TZld=KpQ%n>1^j%!:mc
:8Pn41 \jyY9dd@N$^jGhu1LptQmPdlF$Eb/Cp4P/FaF&aCFFLq&B$W%*6lFN=4*uI4EA?%iZC$9*Zn#m65*l9<
Y6Npa1 S+E:E%uXqlnRZleq\4q!I&cia=6Ih&NGRnT^:9\WKuucQSdymMM44qZD9i*wk5p4Qce/K%>i+?IW+&d\
DaM1NX a!h:^GeQ*yuFM\6u/mWP1*#>p^Z=8h?Rl8qwFEEaIu%uLIH9Wh>KKeJ&GclKYX5aGP!9/HKyqhWi=lk#
:?mWnJ #=tGqcdn:N*ny^pIZKA?AIm@R=<>9D$<aM*iHmkiEJ$R4\SAE+Rh65DCGZAKTpFZdShn1JItEmP<=^c5
W&%tD: N84iiwCH<AjBjIl>1VaK19JH/&u%GGXh$e<uaw@GB+^j\cFp8@\hPa/%AlSJhqYAJG\Nd<1%ZZQ*dT8A
*:++>^ >\ptV/<JGtp@^B^B+DtqV+AIP=bDy1=b6E&=+c*!8GF!*dAbebL>Dd>udp@jjn@I#uZC*tHGuGp+G&X!
8+\G\X uD/a68K+=1\!h56&PJw@miW?!G*5cy>=\Q*M^V*l61y?tQK$!#R>tNX%1G*luPWe%VZaj14X=Vl^<?D6
IXXQ4J ?B#b&?F6i!BI=XtN>9#T#Z#*uAd<I$RRB1AeARCA\!1$#c4cjlWYEkAPAALwR\L/@yM6LD+AAPACDtI=
*j4XYm DtJb@tFIiACAEBAE1t<Q+e:+!CEA=c<QAGwXZ\bA!kJ<^kkcJL@PXt@l*BF1+?dPeRG5e+S\B:ZJpB\u
p1#hEQ k$j*d:/uF&5AIQl>ADm?MRMD:D<DlJAARmBkFKmmQRASYDD+Q@%>jZ*Pa=+I6nGEACkALBnDQ<iwk<=J
qK$+P4 RAIALIRk/Lk5u4CAk<JtADkV8K!RyVh4AB@wahLiLRBEYc>^MYtSXRCmy@qW<FaAEWBI?J>1AADkk\Bk
#H9u*+ AA\/RkAAE%Sj5AMAYCLe+\T!Yl56uRBkw5EHmpAC^IKC#\F#AJCXYRTAwYh5p=RASF#n+kImkIpLcH!I
SN\^uC V&NYZ5aR#^$$\B@+<SpIEM@wEdAQlIkW$I9wn*!&+?WQVyRnAVBE@Ge4kImwDYE4@#@NBGRAAAABARPA
Tecj=w RGEEeA*4kAEwAQ$uabE?SAA&waTIiVa5JB+A?>wjpRI5RCAVFECw@<<FwWBGA1CRAAFITc+B1hB>J\XR
FPWFDl SGdhIW\A/D?FlND@15IAyMWADTepIRRA><eE?w>@kIkkAenR$j?cB\pSMCEGIAwEBkD1HMJlNYASGSka
qCBR?w CQ5M#BIAR9+AKP8APZ<AyCmw<c/SeHB/LACAI6B<*=jNEA^QIAV\L*w%J+64M@YD#X+mqACa/<NLqtFC
N%W<jR QNIqJeFtWpB<!b@DEeBJ8B!8aKhdcXnyqZ>?AN5DRmP14VmuIGFj@#W9KHCj=NWw<!u&T5hF%/6*\F5M
?Y!Jm^ EIH+CwC*8TjhT8VZKePP5JlVH@?C!=QBi^6BjbLY5TVDwQKCGTMw+MC\d*=88&QtdLV?+y*lw#5NFGmp
yqa$q> D&H$E#@9@NYLj@wEl16?pKFLHut\GkKd4>hw<H6Y@6Lhq/?*ZRGRCP^H6jS1FV>adcXnXi%Tk*&DcWhk
<1hM<b >Np4+lQZJy#nFYkS+Zkdewt$$l\MSSknCcC^<8iMAQpK&AQy*Z@:eSnCA+n<e%M?Z%Lwtne\amk&LIe8
9DuJpE ><F=QNDe<<FGuC%9&@N&LKG^dlcC^Lb<cXk+*NP^6#?l=tn^\QMZkV!QQWE<AEGnDAKhl+5wH=aD9$/@
h9JTu! >i/HZ4:9<Yi$>JtZu?Du+^GeEBwaTKSR<qimecIRMwBBAu8y96wci/qM8L:cTt8q8TyM5!mky+Q$LTCA
%XwS+< DGAAAFQ\J!D+BBB<@MjZwwR!lLAkLAkIH8NFTi?qil#uXq4*@?4+DZF9Ikt:kwVI8n^cYyhYH<+J>nW/
NeGky1 ?MdLtchm5Zyp6wFCqQi9J?B1kLWC#\K4k8YBG95DllwY4RE:@*p6BpkLE%WXW^W%XXNqXYFLMW8k&iD?
e#^Ntw q1:DI*$kS/:tm9!nyd8caqFp?Tb=j@<tN6tihuh^Zt*tk=EJF#B8wn#^W8eB8+aPFpC>K4japqd/yLGG
l^VKQ4 S+Pe+l*pW>L*lJ:nYAPZw?q&*K=5ciF=@*S#hh:FM$%w^Z!Q%cN\bndDqZ>p1C1&EdQYK!EXu$JEBWkh
H!@@=T C8EEdaA!Sl+n:hu#GjkIiaG=^qQc\D%A:@PWuDZ@Imiy@i6S/Q5w5A@B\LulP65S%JLJ?>55:*Nym!p*
WHPcYJ L\keFyNB9#<IwwwI4bF&$$QRTc^*?nD8&=+udbGWSn1#=CpV@!q4^WJ:^>p&eM^q5AdQ!!bMHWS>1$+@
^ndP&8 #TMMH9ebq&BHKR^W#1DZ^6ww+=P>LiI8@&*^BKJ/4:Ypjd\d@DHyq8y#NtNA@CY&ykW?Fj1CDle>y5l<
$unTjT ui&@huGmQ58@lZBhR\yAwNee%t@*t=>BXwKPJ4&K$/b9d%w>=<<>F\ljFBjV>ER:Z*9Jl%+yiC?tGP8d
-Auj%G 000085715b2001202b4 Page 440 of binaries2.zip
18B#Tn k!tjdK8d1FmhZ&Qt&JI1ZY!4+/N8i/nS5n=SjDDtPwJtFY4*e4*IS=?l$ZAaD<n::?QmjhRHdC?STjbJ
cFGWYD q/&B*GH/hIF9MX:$4Bq*>5kD%t=5#$aR1GyDIK!R>uadiL#\>$N=Ek:njutRnPNL*I5u5eS+i*A$#4YW
lqLM9+ *\tIF?ZKiL\KjL5lil#Myk!\11y+NL865aWXeZ#1>btwZpm81LMaLX8NX1ct9aQQ5RWp\:+6jNd?4bYE
*/:A4I pAV6p8#aIh9=MPALDkmGKR9W=aEqNACi6pQShNE/%%Hy1K#6>h?l!<^\Xbq5iEWwj<V6^IS#8Kk>1yBY
%:lL&R TT%jLS$NhV8J5QT5ZdN?B9Yl=SE\6PV?!BR4T9un=qj=+@CtTdByqZ!t4p:%YFMdIZYt%Zp?wMZZk*??
5w6mbB $PThSm%9/Gd#B*YC1#QE>TM+y5Yt=84/Etj^i+M9eMNa!V\I*w8T:pR8l=JPKYa%i#SRD&Gy%jb&d>CN
4Ge>QH juuX5jp1/ePN?F1$\F%1y4Ht$N#N+SEQR4Dn6<5%BadS>b:PREl1kl8M?Q#%49j#PunF5p=5#mbM9:w>
e+N!@T D**Y5TbGnB9\NhktqQRmJj5uTPQ!C=>6LR@56VnL8cNFG&:hT#YXu:EQ$wS+WILhQq%@!%W?>%beYj%Q
^PhMpm T=b!JRjG9u<>/SkM&Y#D@dqRVW^Mq=^5I8n+9ReuJ*XZMTbW+l%bwP\F^164M&mPh<ZEG#y$C8>c9X=P
IXq$XY DpSQ$9Y$<:YI6Mk$*ip:pbdQJR&&B+^w!j8n&Rih@Qd1!?uY*I?q/QW^#qd5lF1t\/iY^YWQ+>uPXLdZ
Bc:DE> PE@1?GlJ6lj:tyLFcPpqn<ZqD?ZK+:NH:4!4jjK#ZT1C/bc<cj<Z\EXej5uL%cZZFWF?G+@<b*!YjP6=
n!\W\Y C#@V$8IBnq<5S%a?/6<W&EhYqtXS*q#+W%dLwmV#Z@IT=dLl5umb\Ji:5p8<meRWITSH\&IY&nh!H^p=
9Iwln: !Y4Nu>C^<Zm6G8E98Qle+j>BlCESe#N*Njh\h:e$>+m\#:IQ$+#\hA?QnHA#n<#$<Im5<HB*>jB\>\^*
qZl9Nj e*eLD!?9/M^\C*N%T+6\M:W\NZN*#+?9eM?$:<m9BGVG?@6Z=MhZXpSqSjqubPXHSj4u^@9H^$jGh<Su
A^eCbE ^XjY^Wj<=#?!5m1l<1Glwi9mAjphYhD^YXGb4le<eHywu$:cCa$NctN1\W?B^@nMln8:?uDn4iZ:L:j5
5HkmA4 8&@hR4t5eeub5K8eG>WI<uuFT6$!&:>uXKBtJN!9nMmj<H%Qd?EKW/qRLm:iMpFlV>q8+5Cnm^Z1Q@p^
NJD%W< 9e&>VWKbD\Jy!B/:Cl6iDHlH9tjHk1=@hW4V+*=?tZZejtD41F<WG?#*:ZF@yjFZq<L&e4Dq8jVKq6+&
h>H/1d &aBKH#iajQkemnYZZ@bpQmn1=:LiMy^XM11mHXJQ1B?1H/6pS<C<MD\LL/P+%AY*bq#6m#DYRQk:T1Ga
^+F%X> KcZb^aDjW+c*eN\YhYjPRq%B4M&cc$q$DIXH!Lwb$hqFII&6w%5lY+BuX8MytFIJSmA>6hTK1+!W^F^K
W6Q\B? DQwW%4=?5K18HX$<9kX#\>VA!npb&K>#/qYmcE<IM%i*^u?INX88N%i18Za4EHCpX8Ea$&jW=<w!FPP\
k1^nl: l8$lL:>TuBBmtlY!<#HG/AC#9t5taR/\\auXPlnk5D1heGB>w$w\wn%d+ZiDc%S/kId%ZVDGlQZbY1VS
a+%a*< YIDd@umabhtAY6t<auY^aJ6PhXHQ\Ikt+Xk?>DhNh+>y66jRVy!PnC&J6@y/9a$Vym4F?+EH&MqK?BA5
&un9ab bmyF\C%Pbqb#Paq1H#4KYM/PDXS4NX58X/4m><TSujqX%Nnl4eu<?bPSe@k/JX=d>9R=85GMy\R*Z*Hy
F:T%Bc 9Wn4Tqa*Nc>8KQS8h$^V85HknRDkS4Cmaih$A8/ehDl/jQ*=YFGjpH9*apTLA>E<!\&uaeDmPA$tq&G=
/t?1M1 tmKLl%C<\PGY\=P5Q8R+$q#j@N9ZiN9MGpB1d<m^XL6tQpl<jJ!&4n:+hWM+Y%+&Q4GmWBK:ndFC4$Dp
IXBXjt J*w1ZBk8tP&l$PV4N$J1hRMJ4+5t+\w5\RuN%^JQYmt>/IFqJ/V8i=hVbn9=wu$Fuu9p*SBX*NVNQTAN
XV!pN* LDAqpSGuZ/I\uG1p$IRR#mt1caFBq*k^=kM<Giih#/T#*9PPu*8^ly$+wV@6dHa\<l9V+attM5&=1k8Y
m+K<jP e9^Re6KicXWPhnM1t:4:?tt6IL6EC5yB%D9VZC1HXDmyA?*6Q4Ml1m?TTJ^LFdiRG>R1+T>J<\cJj8\i
1BT?ck *9ah*n*@PIH?aB68@>kK?GA4RdXBtF$QR>cqM$Zb*mB%J^ww95*i@Wap!:p+nP@m:IalicL8>TC+=L*y
pte^Kp i=kJ<!NNpwm&8y4mjudC/JXdmJGeGLA+dmcVCaP4TQ9+uX8LlkYSKB<^JKYaw&EmbbPbNIe!GCNwmCl#
ek#:ML MB%IkF+bybI<M5V5BD4uCyRmn#K!WQDBWCumutRPqeTj6?T<eYieFk!#uESH9W4MM:Q5:HbPhcGIYEil
y%=:dL 45+P*i9H/cP4uZ!KNlK6#*!&k/NcuTeuH:KZKB+DQj1IIG#c6+IBaLF$l9ZVmTmekXkb5:=tI!!t8l$\
:<8@=B #>EeKKcm18<GE<Phy=Yj=l$%6=HYIh!WRlASZKAJ8L+k1PNNZEli9+k/QWn+B>M?Y$!TDduQ1$ET4u%j
eluDIC j+WBJ?pdB1y\J5ZP!cPQd^?>\#cY1+myd=L94&w*:1m*5Qq4JQ+9JPq9HPX:pt&+%Qb<RSCN*dMaR*EJ
1Kl=+! \?/i5mpBW:?W\yHPHMN@H4l6+F4&qbZ%/@^=F6qw94BY8nb%<<9#P99yuywiWmE4<I4PmVyuQ5u?e%yj
WQp+GT ZP\FEnWwmLWRAl$D/lyZXqaI5S$Jl$>p&PwdK9pCY/1R:>\bTuuq8kK4Ikl%qwVw@wu=cnVM^8M\!kd4
9hl/mt QlkHnQM/PC*uGVR>ElARHRac?T9/SG1qyjp8&wynyYGT^w1LlVq@WYBS4PujyHNSAN#@*\eGAKwTp:\>
HqVhMJ ^9HK1BPnL1aiD%4H:m=*XF=Tn<hCZ4$C6/W@8+CGScpR%uwTT</@eB@k6<XaR>T:>uD!>uA!t@9nGHaA
j:Fq$9 Bb=Qaq/kLRlAXmAWK8Pwwa:ed/5DFRBBSRTB$AeEFMPE&AtYqA8<F6u/R\pARDFLBuDM6:QJpDIYuCGM
WNlkFt SRmBEEWEbAH>TIaFSneQDuMmPPKNCe+TRwIRych%/P!MleBnlRAAlRBTPP6eJE14djQVN+I$lqDSl%@M
dLhGTP 4#8FBAqSRRCTPcRCIiE=EG8j+Mq5H9<T5Ea&1ABDIP^CA9l@4Xk65nbMdqmGVAtQXkn<^RK1JXRE!Kh\
D$%V%p JZVt<n5HH$e$B:PXIwaZa/\hJ?AyEk$QB+EiXFqY!15ACqTn55H>pHD*kk+ekBDY*ciBKKi9*Kq!$94A
!#cBbJ EJq<c*>^<SZ5GWpcIE#/4cRnSKMmA!t/#p$!/QX/YSAWR+Wnbuj/^uc1BXyqj?mnF=DQCn%WSAEA\HyK
DP>A5n II1NIL\WbnL<J+AEe+WLyAAH>GGCMuck*h\>A5CETCkSC:FE!6CL#\CKC1hlS8dIlBSkR8B>@y8C@&J*
%@h^6W VIX@aTFAWPp8bSpX?X<\D\/ABRIwwBIJA\RAaAGAIAGq@CXMIH<GPMyAA^uBTA6abaBlA\q1Q&aJbcRB
/Y<wNh 6B415H+wWmSDNGIjhnXq>CDDcCnn*u<w$wlJnVHcCHPKMhK>n5WjIE:$L>nEB@D/P!HahD<8%RS5cRBR
!E:ZEk wRHALCImkp#^ABlqA^6:c^NCcSMQJ<D@P@$ul6Z+H/D?+uc6\Rt?=h<lDAkFMBZIQKk*CPDuH\EDjq=@
NPCKp6 d5*W@/NZ+j?LZlkAEC##@\CjtyZVABWApFe>AAmt>H>IwRFW@!\YC9=nQlXSDSX:M*6bwQ?!>4>yA@uj
\FX>:N DXCbAAA@*kZP1LuIY=:5FA#?kJiyBTAAHRE\DGF?i%%Fb&bE8Nt@pE1Etbuq8@j:K&*Pe?5Dah<9+4=%
mkWJPk awi/<@M#:tTY1m9q*t6<l>\:b+/kt&/4Y@RW=Xa8+>*la?Ada^%<PG@1!>VC=#J9?VlqA+XX@Mplj*8K
Kj:NT^ *wRk^59q?iB1eCQMZT@dDu/dwI9@NE8*Ni\GaS89C&hi>?l1G!j/8hS?hAi1%Hiq>/%y$mH*RJ:u<&VV
5uIbVG dK^&kHiI^hWD:iym&i$!p%9*kL9<+wy%PnS=/bZVd@XJdQGy>q?S<HK?L/i#QIp9Q:PLY@t^H?w9b?+t
/@Dw9A 9M>N8*jlS>*k>/w#A9F*^RY=lMi+=^!T4?$J@KVHqWI@jq6uq6>hE&ip+DPnZl4=ipy8inbq4L&uHK8R
Zayq&? H*dPQ5l?MbSLZ9AZ=CS&95>m9P^Qch&$$^9IF@XKASXQK^W\8F:8WyjyBS:dK*QZDKuX:a99KR&e&?B@
ViGHG8 8FcYimw\BGH<y@t:W#B\Lq+@:qwY6%Zh+lR!%h!W!$IneTCcS5?@SGi5>VF4C@@!qiAyWY>iaedy1:?e
+&MaQ5 i*@YAj$+nAcwkqZA1KD9kmqJy>D4@*Cy?L?VauaAiS&%+jq96kdaAY>DEN&$CCDbj>YA&bjB8\^Wl8kF
8>#1R/ cFM%qy?dXnejYDX4YilS*:C9t:ZE:HmqZKM=kXbG/Zdi^bwSKZJP1G9ZbTJp@yqi+4h>F1+K9dyiaJca
S*Bm4/ G<6XC!:a*>4#\=<%<P+DTk&qQ6p1bKC@A91TAAIHduVKQLu>hTHy<8bV8wlVmcC/*6G5Fdh/>Tn=j4NI
lncWc9 hd4aWhG1y6T+#FTy+ILTu:TTZ6a:@^:?qQQnNyeA#a%F^iRey4<ni$/+bFVYj?\mBl*%lMpqQ8?d5Ny*
C@p^p@ Sm:Jd>W\Y?#Z&iRMMFiDmH?1+JJj6F^P1dST5@bBWG!CmMwjqkb1!dlRe++4D4T<WFuh8#J/@?:SYcWK
1k4YV< p9*d??\&>L9p1I4JLbaW<RypcHX>c=NX*i*>l#ESN#M$@1@J<=WE<C=:>i%m54ba?*PP%$\W*$ntbyHK
Kc@+DA ?XGpH%wNadmDn/kkl5GR5MCn/V$4wn=MF9!=$4dV#8yhNhb6JECXa9P%%W5DY!h#tlbw+bNaKDS8>l+n
XRi6ph *QX1?\K$m*4!5DQMSSM+*Ku9XJWq9?9uLTm#Kb*8qMFCwC?85JJieAPWqAJaZc9nujhhldbc55$5&><c
Y8WeLc GSS@<C9tG?tk66Z?aVDYB*bbAhnEdpqt6w:QPG$t6Bui/BdX6mVi!:weSE&w<ead^&$c6$L19hBXZ8=C
+FiK*/ G$l%F:dKM^+KSw^\wM#$ibK>$IwtA4$H&MJ<TL+M8dQl^<IV6FN&DKa<1My&=yJ*VeH\e!dE4bPAnc@K
imuHNH ^$t@dI*6J:JiFRX1Z+R#a?&6@pqyNKwiPJicHP4>\inRNWeBcV$EhdIqBWCwT@HcRDqHQFbmB=Tk@uA>
A?qEV\ cpNJ1A@Yl%@h9QCEAHM8dHREGtXnEHZXuJKIG<%j=/eJ#9lq>AH^FHhJ5QIQcu#*@#hpXMD8/pmI&@Wm
EZqA$S A+?YeWjZB?>?H8lSAeEHIqp<=kp&D=!##X9*m:5EtnEQQF48F9\K=^Z?aL<GuBT*iP>@ZlHnFDS6R#^h
Je#M9B ^kmaQmbV\N4@Kb@@Mn9%u!a<kB!5&QD>A?N&yI#@KHJi5^#SWQ^@&cXq@4>hBp$i\u>k\?d@9KyY>Q@K
L^qIny uVn/VjEh%SydL\=dDG$FXMAmMpnM=dD@>Bm9/5dX>$MnDBt$hEaT:!:PI:HFCR$uC4p@J/FcAF!mcTWN
yPktND ?u8nW*FZ=+W*GWS4Sb&Xwy/wlAS^YaJ^H>T$iNmhY%NmF&$Whm<QP4<ykWt\+a4@\9ewF<b>=i=FQJC4
CFG?yd SkDtCYmkW9NVGcdIh9=ae8pu9R4JPKh$L14KW@!/@B%^9wTd&6WEBajVWNFb<4u$tcCK@S!^jic8nSZj
-AFe*: 00017b96ace001202b4 Page 441 of binaries2.zip
$ApX$n T%GceBiWQ4>8kZB=pl8Y&:tt&d+ED%Se#<<6y\t&JqN^9EXd19GTkBJWn:kw9&?umB^JC/JQ/$DqMqaC
HkcG\T k4*=E=wTlkZ=:Dw=iRB$QTIkCk++Bq^F&Ew^Hib&$NTXi5he<yj<T+&tBWSTZyY^#wD\u&bdZAey@u&t
86#GBX Ltnj?mKPN@qm\hVyVX#NhB^5PA+GRWSJ*iVSX51ZXJAeIcuV+a%m8X1ZXXA*AS^RJXA!/5?EbMJ>C/Dm
IYt&bR p/muZ?Jwn&Bi46E$i<Rm!cCQ^IWnp+MIBcGE&A:PGDdGF6D9jW11eI1JDaFZq\1P#%mh1mZBQ4\1A#GR
G1C4k1 48b=Q^^mKlj4?^#nLqqP/1668NAFJ%5Z9K^tKiw:XG#nniH/+B<eZN5/K9D#ApaL+8?aH6V%iwGTuNDl
dMl%!6 teClbdkJu!uI*AhdCdw5tEkB=Z^/Gd/t^cnW<c1%lK4wWt^pV=Zt$T#M/5iKaLHwPkGXYe?S6K1mCj?&
XJWKCQ GMWaDqH<#APC&<=IaCejjW%PeJ!$bL&i^4?$4bpqcd<4?%X>*pi4K/GYq&iGXTVpEP4LNDadmI^XQRJ$
NV4XJy jTai1G:qG=$#XPa6ZWAKaGDh%jeMaPqliKl:ZYWi#=D8WM68tu8YQ*/HYw+myP6buqptc5yeVBHTuCL/
BQYj>m $JB>?6ia6B:1\:5/IpyC&=Wb+nM@P@Imk1?<I>hI9umqtnM4G<Qql*w+6M^Cn1BPbqtIujNC@AE4W<@6
6pZqu# cV4R>$C<p*#ID!lieB9j#R:bdWyG&%Td\c8wAE8Y=HTwdp:uK*%^lLR#L=6:DM^HNal<^PWw#Nm48J<j
<E!Fl\ GB+kAbkC#9h9DkAMhW*EjC*99hBRe>T5Ti>P+IBFt&Zd8C9qKyBLd^D@@C@p^p8\@R@kKMWD6ZV1Q5<W
&kdVq5 ldtMPa*DZ:>\Gp#LXCKh%j&i%18>&k%<:FyXP+h^5aW5n<Rn$Bh4iV=\%<R<@kTbJTcIkBuE4wJPYXQ%
V?**LD kDhV@N9I@q?a@J+y9qShD6Wc@yHJ/e:?d+IQ/HPp+a8GZ*^@ceV!LcbE<Eq8pAHL>ZZtK8H6BcThVtL$
A>5W=R FYc\hwJYZ+Khl^9&LM5dqWhy!8*Ka@El$Viad\buV1:F9YeXJ/WBb^QXFY#<Iqm^Tn&w&TL^&44Z!BAd
9C@?1+ wW>I<8A#Y6TYuLJiM^8b>q?qEEIY4JARR*l$ZKm$@DEpi!mq:EVKS%w*@C6Hb+VXnyRe4Q:LKpTDa>Dl
wZmtXe QBlRj&TKZ*15CkpG^IGm\ZFR/Q?klpS?k9:cQ^n=Z%C4WEPmLpGRiEAWNAwKFbt?&DIP!8T5lZ<@qTPE
q<H:mj STuEC5nC8pI%V/V#KPP&pJ6qdDeCw!l##pdbNncklV5M\qmn>?hW4X^ttEI8#M@RdEQ9*EAy9WFmJ^@X
!Pw<?l ^p4QtDNmjWpAi<lRBJuSFZX/8cG=kRuehaat56^V%bRG5iDWLX9nHG4TBQ?4dp!%Au$D!DR%w*#EAHm!
XXSMLi HQRnqa5EA<Kkc1&\%PQ*Z^LSC6Rwn<jb^+lkT+6?9jdmbXNewPNjeGW1/ITW1EWCWJn?qHF?6JHuFuED
uMpyCQ b!In1au>Q1j?MKSW+/Yk5+J&LLbFj94YjAh1!GBl@V!+:A$cbuCS$cEwhD*Ap+XTY4JMIIGNY6E?Pc!i
HF4Dn! iXKZZNL$w!bKTQF%eYcc=uIDX$4S=Y6@K9qknyZ5CqNVWXl*:pZPC</=A*cIH#iHN&b@?>ucywm?t5im
:K>Gw: JVt4=LmyFNtcXKD+!/8uQ!Ma:pa>j/pk&Xe%PW4wBeyylDhkVTTnNY^Xm5/MG=t#85j*$!A#*1WL@tc#
4j\b%q p%\kLb^XGp+KB5Ca+wm#w6qSYnKwjC\NKW\mZu*89@BhtqijZd!h::GFHeqWVDN8p#4YtQ/mCG@kLCG*
VYdj!? unw8#wXw<+N\W4Bj8/5@CWQB<&AB9#q*w>dYtRpZ@qm:1?m!?VtBkMFcRqGQAZcyVpwGKbu1*w?XYq+:
JQDhy@ BW<18:lttFJKm&Dd#nBnP+tcMI:TZHTm%YJFVF$\M9>FGL>/YEn*qRI8T81VI&HQ4#WkSX8VSbeCI>iQ
yEAjVC +1ECNARTjqE1pL5uQ\DF9>/Zenwjw^^TqVKlwY@iu#WQPiT!kZV5>\tTIRh@K*>m!:Iu=96Z>Ih#=T4Q
w>SuNn IBkhIkTpw/!^IkuH+9VAMmI$Hl+<D8/MPm>ZyILi^H4a$bR$>9eGu9WF9VX<+ky$Y6Ck\dJbNYWhXREE
c6jcIJ M<nllNG5W1AG&nE!I>LkmFp>PcM!@X\\@=%dikh?yY5=i^/a6Vt\yn49>kT4h&wnZbANGLCbtpy%jcWw
n@YDTJ 9ny#Kn>5ppb?!\J\8V56b$1Ajnk\:#Vep>i5%LGL/pi\jLN!5#5HwXY*iMc=6?/$u8Wm^niYpFei4m*$
TE!ttH \8n/qt%6ca/LV=Xc1iIl>ayn$Z%\l/>:iQ*n#<edhPq:J9G#^BAN@XmEy>SdVhaAmiLtWTy=jML1LjI:
kYZSkE EEMlbI?/$6TiJ@p<dN6Xm9FByZj^a1?Z<:?uWy/%<@/<pVlL>ek=&ESp6Dh<AI#+Ie5d=^>AWa*%Iqep
ABjGS! H6PnW5VcZ8pPKApLDERc8W98BH5^H1+uw\Sty#HNu:^cS!H$6&AE^VEjY^SLDky#6lWXP4yPwy6eYE5&
%MQJ:Q Z8:Y<J4MDW8bTA!n8yRLheJ*pT#kNX%ZEKcY!A4LDKHJepe\eljb6Rc=4A4dCSwwc&wbbQ=N%E@8X@=+
1+@Aq? Q+yEY<c54cR^QIqPZ6q/m+HTCQ5EM5j:q\4$Qk%Ac*Q5y?$Em+hTRThbDc&/wq+@>ydq1je5Q?>HFEau
^F>XS: TF>aaR%^J\P=QcubBbT4=9p%4#%yJ#1!n+upja86IPS8khjR1^A1SeXt+9nZC<hWFhSqkMDGuyT?=wTW
ccYeik icYCckCtYh4K%%Y5>bd=>>n*#dadKEX$IY^M4EKa?M5u=W+M\SdB*@<H4!qWBm%+YNpPPEmHYGF\jS\I
uk=1u9 Rla9Vbl%dG!+NJXqS#%=wypCFPd>d^cE>?nG?1F\6ybBeVRF6<&/ylNYQdK&Z?5&S4=@E+#5\tb$qmk+
A/RyPD wVE^HBNNBcYHMeEd+w=^ln5S@nepi#kY=%X*5u1Jp:^5P&B5ZYYJnFLS#DS#k5d\hX^tF&&KCtV@C&JY
$a^dX# K\WCDQ^KZQdWpuL/58IMj8EF+AqqF!pSBW@mHtJ+=pWeJAwZlk$qktZCDGaaM@^9TM!w9#L=%Ej9tqcJ
!=kqME SX$S<Sa!X#nLn/D*Cj5G59CGBTJZYhS8Y1:D>eSe%!SaYW&KIQJVeShSHKBX\enF=!u^DQDPhl9<R%&4
W?mD:j #eS8QdNd*c<\Nw!X<6w5WCKRjCJIGDEV6u8P>w5t*M>TEqCniMi1wEmZ//1/tEQpFR&Fu4VlPadQCH$b
LBmN1D =+Tu^+!l4^4bmd%jW8l6+F=*AS@PYlhAqawkF1#j*jdAW>=R#iRQM/cGSY^h&Hnqh$Se<dPmeXpj9%d:
ja\cQ5 8a=q:+FP&Pyb@:8:jWDPcN!pV6KFGh%AA8#p&DX6<8=:5H9@*bdmq*+%EEct8Y5qattI9a<$%/@6FKKV
C:FI<A 8wC=*8*B>\E>?VWHH*/D+ei9MI#Fb>#@kt#+HLwe*@c>+TTMWPG$cQZtGl9NSmFjN4YkCcuW%n%tj#j=
j?LYlN AQ9&!8M>B6Jwm?i4M6CPMPqwRLh+\t@kT$wV<P5F#b4++Pw<F6DC!6pibTy#=W?@L@FGJq+NHJ>RZlNA
MPFAn4 D1@#ucu$\/i<Am^VhL?CpNeq%9WktX#$WqVZikbapntVcc\$aibq=BVRi>atYJ=#WVA?X^WmHcQ\WDDt
!yAuj# I?VclSV1hIG<qn\Q/9KD*$T$EP6&+iAyC?BBBW8>PbYj%j\4JmplKGTJVDBA>>aD8KuN&TwjDhEnk?W8
Cpa?Z9 :T<h@V$G&pF/8!L:#:KZEM+RSKel:**$6:Dk+8Y+\iSXmyAa4PjtI9>E>NYYc+lYEDWF\4pZnV>Vn9T9
5aE9RA w%14W/#<aWjp&GJ6#uQbSL65b\dn^We<%KFB%XQpCqjpqSRp@%9Wd*BN44kQad\@S?Yee^hb$AM^%&:w
P9h>XQ ynQKa*/yWJmCd8Zi+6:1*4wBW$HCi9EB@mR!&Ejyd$\NJ5wliF:\Y<mYZd$hBmq?HXKK$pEJjZY^F<i9
51l==+ C+Z6PKSN@X1<1^E9F>BT4Cp$F$q%6m!P$T#T%p?Lk<EydmK/\iHk1TEWWyD4Sk#yXe!:kH?tK?nPBnI^
lFB&iX ki4D^uY!SEaKtV*E!dTV>HiJCed\9yEX$nk^PGB66tSKD#t95inRh4S!b#Zp&!\Kn/=y6MZIN+RC>&:!
dCBE6M I1NN:!*A+V4eEjp$&:JicE8DCI?!Lm4%bYQiH>*YtFIH/5q?Sc*Q6YV5HY=L8DK*JGMCHlP:&aTZEhP$
KJNR8k NhZTN%wlSX$$NbL!MuTXcBpeNhWjckJM+8PCkNFS5=9N!mnk%6M4HSD\q!Y>utkj9JhQV6E=KCLS\+Iw
cm9nJ/ uI4Z9^uRFq*uGMP6QmH+!\Shw/Cwn96wXRWKG<b%PFuVZAAZTnLCq$@c&!Fp4\keSmRBeRB#4wuGqYjG
Rh$h6c uPpJYMST^I#AtEm?5G&=W@Y&QkC^#*hHkKLZc&?QG$cGYRM#EWG6et?Jub&h8%TwMu&mk&VBEwqDH#^F
YaL9eA 6ySWXS6huFiK$MI1Fih<9>nca/9uZ8L<:&GTX#/1<HteKu+t4+1u?bQmYhG!iMp@tJ^%955RRH+V\qIG
=mQjkX /M!\wQHcR&b\Bjt><J&NVKnDcV\W*h?yRcl%aFQE=Een&aeYMm:e^*utpXky%YPq19Au=KhQ6RyqQNpu
+&lehD /i*^!V<H^#!G5y>*j&Lc<4%k1Kwm#F%elZ8A1&AdcSu?N4dMLhlFPBt^hm:FWJe69GWpdF4L%\8dEKtQ
&h%%4Q Ti!G$5VwIwK:NteuNT4BeY&@^M*?1X!FBiZEG$GTKcZM4/qeX$4VZQE1SSH8M$N:BLbXGJR!IuaJJD\N
u^teFT XQc>S:d@Itk<FQjSt>*&SP1QKy^Nc\K\YN/e96G+W9<BCiTey&CXuDbN?J:WDHcX5WYLJ98ShWH$mj&u
4Ebb^> l5=4!LSDA41mPyyMlF:#D6Ta$?ICmRE:Cn9iM?Sp#tnQ1yX?<%JhbqY6cc?\NMjWpC?<#1a*ww??*Ntj
M<lu@6 C?jWtnqNIw?:khG=J1c&:@htTiB8$%RCt>:L=!Kk!?5RD+ZkD#W#FWbI!Yy1yN?j5>$WcmT*XXJXTER/
k&*&mH $pQB?SC=>bTFEac&:PIt4JD<a=SqD?W#5WyqD%&VdcF9ApW?W9W1Fwm$KWl@SbkYiyD4IRb/adCAZu?4
e%DS1B @I48DXF1L@mFmDPV!5Y+R^>ww4WlMlaE>KNq&tNGpqGM5nbLnnH9q=AT/RWt#kl1w8+bQ<*cbtayTIn4
h+Y@lB \q=d5?wTXEemZHEyPLRHyDQ5DS&X$6V:\#?&&@&#lFNPIQ%m$*YXE#Jn!j$ak9N#Y4b4Ty4jkTR$IFEP
ymctaj 1cD:86HB@wuSA:MFhmQ&W<8@\BhXnNR@>C/=IMtcKCW85Z#V/<yQ/=!5DHK*&d%cjEbyH>RtiEl+%cyD
i9*KRw !plKl?m&\JhIP!EEV$VHu#Cl&DI55t5l:GE:Ck+4iX<Qbj!AG*jFMG=\Bkm#tC+P4Q&qaKA8Ma#eTJkd
RNhayF 4+C8\GAbWX!yTu<cP<Ek^V1%BIGb4@qMX4nCmNEQ41GS@!j^mYjmaF+6q<#\BlbFHTalRC^5=i1$d1^Q
AXWVWk =abhtt<&CDYt<:41qNWKa819k^%yVQkYqllT<kT?j*JI4m?9IKwC!eL5:jRw1Aq+V!BkJqpp=/mBbqy+
pWH*Rt wGuI&HiI8NWaXBWd>#9amclu8$\1<eN#bTGpJ!Bi*h1npiT%?/IemIlZBC:JZj@!jlP/n?pBjelbFceR
F:6j6Z q&/JS?66b?R+j1ey/w4=TmlAJ/yFj=wtkSeJb#$k/T?&IuC/WQyjZAQq?kn>>ScKk+IWQpI<t/?/R4Yw
-A%9/G 0001091424a001202b4 Page 442 of binaries2.zip
&i=DB: /Y<i@*tnA!Hb$wC:PEymT1p9jGl>Ze?hkR=mwNlJ^P=6$cPmjAbYNV^>Iq:GY*jP5iy\PK<+E*/9WIaA
QFn*^& MqRYSp#&n4dN&hZhW&5V6GIB6k/Pq<j&FHDWJVSBIII4N8>*#E#CWLXPiaaeE5K@HAH<Xj9V:b*PY4<9
#ZmHQ! 4R89K8p*>Q+&mGcpWw=XC8bb<GV9!4HNGh+KhEZ8YI/B/n*\\V@kJ=nAwWjPRNtKN&T=/DkBbhyQa<wh
\paN4D d%?JKDZdCpE?^Y?ecMQ@#8TpdL*dtQFq>#6iTa$GHcqhbcWND??I^@BQGwA+QbIF+?D*bi/kl1Ve=6YS
Fw9Dc8 PZQae$C&5%A@D*bI8*t?5!1XN64AkHhFVWiKplDKLSqY#D#SeFBS<IA+T^Y!CAeJFlZ>5yLW@q5a=pE+
9?F5m: PyetjS9t\qbZ4#T+YV=iBFJK/8+!#XIt!SJ:RG+H@YpQmiA6aT4LIm@DMGZ1?j\tV94eI/p?4?MHub@X
k:^NJ# 5&6:S!w&<bjMbS1%G$MJP>&MuKLB=+j+$A&$I!/>q9QD$^LWlGuLNiT%XjGFcFwCG<cSkTinF@i5%M*=
8JIMMH 6iN*$%#HnJR#VFtT^pGuHHDLV$Vk#uiAp=AmJ4>bVC^hApbb1$ZNYQlmmbdC$8@?h+X#ESi=l!c$a/%l
il:EQl R9ujA?pe#e$TXAidm+\%1YQJKBkI6&Z$k+NDG+$GqG:+%D*mKC=wJ/T#MP6EKcT!dEbhhKSJb$#1u#&p
*9cCmW &B8?!e1151hH/6PbK#yN%YdE!LLCAYeF1XkMTBk+1/6qi<n:a/5pw5\G6HidInI$6tcKtZCQF=8c==XZ
qKX/6^ LG&iB>JNun+T@8<dEYil\IK*hlLy*u@@a9E8/PAS65:tJ@k%?uBYmDAELc=YpPL?=dy/G\PBl1uCXXmE
4je$%* uYH:%9/DbjQW9AEWGnT*^C&#aanZMPw@/Ak6B!A8<9wqYkQP+SHaXbwu##H@w!uu:\9/S?AVMYIP!bYC
ud8&Z^ iAFAR1YT/F%lS?1iPC8\mC4jb#1KKLlyy/<^hid>S/wQi#9FGDQK*#MeuWqL@%G?CqL*jYyy$edpD#WZ
i9Z&cX q*1qKnMhN\W%i\BjH8J8A$#a5lwKZaaCH4^y@HJWP6MjLmaQGcRI*hI:m5+&XE^h<PYuF\D=jAwG%^?H
CuWEIN Z/t=Y\dJY^&8F!Sy>A+kdu:jmiBqhDC1hY=*!Yq5KN*5YFuA>wM4NBiS1>tJSYA8XIQQW1:!L?PMKQ1@
iKyHw@ pu>5aG+@VDmk%hQ4HR4<^/<%j/!@t6c*nqdVTEh@5aYd:K@S*ndhpuiw@\cukhY!M$Lead+L%JeNaFAB
W>C?p^ Y6/%ST+%8Z1W<<ANTMy%HK4H>IyjTGPt&tAEp8w=J%lQ&tYu$A8DI*hhdR^:un/Mql8MeT@jmH@=?HW+
mSdXm9 B#*l9tZ?@A/SZN@yF:n+cGlhCuKuMFtG1SXlRtmi<PENZamC89C+BM?c/FAVL$+YlHKkWiM$NmuHC^W/
q4A5&1 blRN5%#b!9ASjL/tqh!ED5b*S5p5p!\@pP8%<FJNKihVYA/ILbFEp\X/9&L1eRMJqpn?JKiHV>!SS?dQ
hcq?kI WI=dSCy\KHSG:wEB?1FGdQKqHD/\XLtB&taF+&j#4eyl&qn5@TY1Yn/<+ewQn9n44QyWMKP1jk*HFA&T
?!uW^y cia*eAMmZIYEyMVl&bq<j\\Jcwdt<qw?$%&V&?K%Fp:66YZH5hmk1Rynm<lV?1@%6jii&YL+hh=kWY5D
eIb<YT ihn818:wj=#$b/Pu1468GG1St6/K*8m@&YRCZHhEh?Z@+uEG/9?TG#4lH45BT5n!qB<TnWP^/d>>B*km
/&Sc$< G>aQmt1M?hYMDQj:PXDJ<:kmN9Zp^b=+#NDTR=Wbk+ktL^qyKP8+^FHJ6nG\@H@L/bZ$qMwQdQbn%eNH
HXFY^= <<PmwwJ%AwPtB+u4R!BNYiT@m<Cd4#j*nSiM?q>ANJ+9$?5EP8Hw9/&#:59a*WLk9/NFPqPV1twRt!4j
4eLC$S e/ItZ@9XTTJLEwT$%LTMVEeG:puRNu?%C$PjH>D>@E%+I:<>JX#wJCFm!Wauui11+piY*mNwEq=+wkaG
6=Mt@j XRX/>a>:DG/y!4iJ6Iy/kRWu?K#%W8FYlXRM8j^b>qhDNm!9AiCyPS&@=qA4VRjT6=QI8A+=:H1WlIKu
*cn<^E n=GLc/S\/\uEdnD*8Z8<jTI$tF8A\PdI!@&&#^tMTqa1cuQ+NQ\GhXP*mkJ56EXy9\=!dNRTnmIEkmq8
>ZAc9$ D!KF**Iy!k@C@iLkE:8ttYL?paw4XuHQyCX/!wS=TJ%M:G8CVRDQ6\D@#BS5BHH6X/J:FiEN%M?BERu<
6phX@? Md^qdY&y&AqJWyeMQM/ca$S+e>H1^*d%SNq+n9+iH:*tj^G@NpHkL%^8Q!SDFimatm^DTXKpATt5SpZ%
?$uX5@ pNeGd+MI4!PSB+pyu8%<W14BhiMaCb$dH#Ebm#FXcC:HjuSllwhQDmXQpII*a4L/a+?idSmS5!:aHWBM
1RA#kq uk$=X9&c\<%9W8RiPn/PA+@E%ue:!IZ$ANq66F?D/BS/L<PPijScW@TX!PtSmipTMTkH9*AbjK>Zw%4c
N%+$Xb =SaPWZ4XQ%5?alQG!+uWE?:6@DTy\>Hn1k4N\Du1V:^T:y^u@B$j@%hWMbbjTiPib\muTY\JPT1L6abm
RA^1Cq >hh/NPS/$KF=1t@HDhF%#$DaB@Mic<&4TAq6!hCt:Vppa\k!/iPB6NFW?QdjbjNC>HH&1mHmIX$AN<M:
\Yk!aT bicNL/khXKcyGheF+wumXpJCk=j6:aDC%jJqV1phjiYiHY8N:I1$/ta5$DY<&>pLS1VpbmIj/T^ZhDJh
lMy1lR LR/6Nq?&16ieLhtKGl:!*=VlCk>&Q\QkW!9/Jeyjt@qJIC?B4yuG&\^IScdV5n<L8>eyR*Iq<&9S*N8@
w5FP#E E9dj*SHyh84A&S^MIp6k\:HJRDknnGc*KCYtV>RTFP!S!c1*FTtJ%%H*%:6KJK!!#nll^5YGiH&+qCGA
m!&H$d ?uD6>>QZa==\:Yt?F9C#VIGpcIWDR\/En=aw=t/5QLcF\hqB8tJqBYLl@p+X9&6:MSqJIt>yd9!YH*^N
Pqh!B> lGRbi>jXlMuPYKw>cEtD$?$QW!mYk6MD@DXPlEMkNP#*a1cSiAZ&VCuWA$JM!^M8$!%M$D<Gqh^JjeZp
bj!E%L Jm%$6^&6>WyVGL4^ZWSuL!>Z!qR<D!4ZP#BlbIX/=N+!L8?X8TN4p!XP8GSwauLqtPWJD\tcGVSJbYh4
*?aekt /p+uF8<ed1H/i^DlFd&ni6Dh=i??M%6V^*DJ8+kwh*\tTN<:d9Ya5^MLCm!i8+JaBERw#HP99m%MlwN1
&h8u/8 ?YIYcF#Xt4VDMWdN#+=6b4\EMapy^nPM*P^CEtXK^>5YG!Lj#?^Rui*lTAwjW$tjFW%%cdACn\>nXWKb
%iFL*B lK!WRWLe!6G%y>aP:*HapeHBwG>cAtm^duhZ$Jd\k*:jbmy/CD=<J%1GMRb?uDIBaRIFmu19ktQ:&aMZ
C\=Wib >ZK?^GV8LDj>#M^bDqd<AlKI@=/EQlwSGJY>!S%??<$>$ZuwIDiCAtHtQZ+kB9pDb&Z?%i?RXSpZ1\@l
+p$nJ^ AK!6Tjid\NI%6^kJB*bdBCT69HeYd5bCtbPSdn5G9?I#a4t+EVw6c1c8EK+4bk^aGW+R9y=I*kR%SA!>
KZM%l< CJ6t:KYIpLG*Tq91a+w@u+Ba?FD\NF+dV=FDnw$ZkcQj=Na1QZ!dZVD1bW/Z@pSwn$B:SRp8Gb%bHLYd
TiXaaX 8nniK&NAq9/Z>HLLPduTiy8he/^lPp*HyeIM6q9IB\9ZhCR=Zth^=!>l&*F6tkh8yYGtuAq=Ibua+mac
Q\pdDR Hdu^Q9nEp*=LWNW^tJT%w<9IRW^Jb^q/cN&%BK!SAee/JM^F:c%9K>:aQ!Hj/%H$wCZ4CdhuhR+BEk\C
!A1L/e Tpj5%KWadVZt^*>jPlTZ#HnQ^eN\F=i5y8A>G+t*wtZL>u?6+8B5yBa#F^?GnD@QE#jGJpC/DI\SeJNp
nanmwB K:!d^<Y&Sjnc%@jkGajL$SFCy:lA%S&QLN:EBDl9NNBw/ph4c$hknDC^#QY?aDNt$>C81WMpna%BYpyj
Q11SW/ %#6ep4*@9kwn&YBXm?4G#l+LD\p4D8RijGdIPdyH!:p#Y/T@C*J<Nj6X?b%tXy>YyX+Pt5^ZP#68#*?B
5e<MF1 alaaq@P6LwKCJw5:E8ID*k8yV&5SNn?kKmtF/iHt/6qj<W9IY&:B^^PQ:PYN/HAelbHbFbpHbaXN=u!Q
9@=AJl dI/mF@XN!:mcp@=#kQ6Y?XpCKVk+<wkulEZVy\+*=5cE15l%JuySTht!9ll6=iG^5ZY<bPKN=4^EQ+J^
kdwqDJ #DZmL*eky!AP?hbbbYQK+%bjpt##Kb+t*Gu\w/YF@#j!P?^bW@dYhj<W1=ddCAI?F\HZHuTC!:L6Kw1R
Wpe<RC uHbY:d!wkL+yqmN9/yGWj!JdIct1jEMES#n1qA@SI8VdkDc1KXPYmlIh#IZy6MRkhEPcnP%#PPyDI/#B
hW+>Tm JIRDjWa4Vp%TS%YqFF=5wWKi++ZP*T*/V%\\RIpjGCyaj&pL4mBa^$DL9V=/19DKQwwS*W&t4yFFpehj
jcX8#N E/dDI8RX\\mT\TC=4q%ZiAA!j:G5S#KePH>V5E#pTGKlQ8RZB>ynQAV5Vp\u9cQd<\!eF=Pq:89uTlwc
4^jXtc >AVP9cQXPEw+KV^5C=>Hb=n\L1MY5:=mWiTj^R!DQ6@\ndtBbVNaBlncR4m&J4<wK4+hDSHjB9AqL!Gb
BMjFG@ X/*6Z@R\@nu%8m&wp5bl?bG9iiHD#:<6<=cZiEJ&D>/t6$FY>au/>=$Ai!BRu+M!5wBSlZyI=NtC%A*5
:A6$>L a6Q=J5&H^4WQK19m1%*$FeF!h&hdIKa/@N8A+NyD8=+lS/W%qyn%SW$b#4@Y^<wi<i*nRtkZylnP6FnE
Sk+mt= jd*IXDL!yKETA^@:%6?/tdHn5B>Xl8FtIBHJD\te%P!wZ4@LR8Q^FA+=w!iXC5W:C\:QRm9!pDhGcqV#
ZA=n>e \y6IqYj?+9n5y>&^<ED4@MyXJ8GGT/khqa86neph$T8XbIR!/RSNV*>a$6iH6ea=\YlR#M$1N&m4VD8j
w<Buwc LTXIZK?9^Z4EB#E?y\Z!LMhAMFdYXbFQ9ydIV/=TS5b:5FH1Mqlyew9WAQYFFRWyAb%%HiL1+IZ:$bEh
6ZSPVQ :#=K/%RSlm^S/R!HJ^uEE^HjCSHlM5bTkk?%CX^MH%my5HVqBJDkRyQh6/&tDp5%Mdjln8al#W8SmC=F
N#q64i X$YJSueX1>Q6y\^m*B?PS!8b1G6emi^:\>Vwe/#q*yFS19D<qE/XC/L$tNlS>RYEk>FE@&*cJY%9MHWT
$GBaWM aI8euQ1:$awCpiZ/Tq$/Qu@CDF#jS&8\iy6t/VAH6$*QwHAJbh:TVj%e\KNty1JCSGn>N/TL8AFPtbS9
@@hTiA =MZ?EAJ5CYwuQu/@4nw:8VbYy1\A#$AHC&\A/wLdkIqtE$e\Nnb^wipT:u:#ZQeMa%@G+J+#I5%XiAG6
>qu86I hA1/S\>!X<%&RKPPBjIuY95d!T9Wm?y^i*VIpm#I<H/e>9kFW+5FCkkE%V?/NXm\quEJl%JHiuZhLdj5
^lY<:D LdLlFicS^piaNVQ=&8u%9P%caXqQa/C$Aa/+EB4a#Xt%#hn9F>8>6a^mFl/*%!>@SS@pYH1WM$!j>:G*
blqm4I L&N61D<V>Emi5PWaWXi44RIKl&FTupa?YpH&@NZBmwbPFu&jG?nCujQiitcHy^nG:m#TIZ@H^eYyVZKK
*1:MYl G&HS!lEC+>wFq$M5H6tI:$IM1>^dkjLWbS*<h/kihn*dcGbRIcAL=APC?db8!&Awb^F\$Q%HbB14?H$/
BJcZ\& 8YlZqMhb\Xi/Kd1dHmV99cJ/K5F9\nka\&Y9XX1MkklLARVCl4e>6Q&uNDPZ5^KPyMFkX+9yMlQV91A<
EJul+u 8VSM1>k@:P:hIMuuet9c$kyXBTJMab6udEm:cTcamDNe?\8Iu8c&F/\1d?N9ZyC8QW@<dKiGd5=a!!!&

-A^NH8 000a90af991001202b4 Page 443 of binaries2.zip
%<bFA\ KFnMMypPZeKHJGiKudNG*8%>T^wb^9qkZRTcX441dak=LcQEEdFA<m\1ZQt14j&c$pAm=F>CGp\dRF>w
hwPJBM WITp8kDn!T5XA>mGYqi=bH^EjadeV&:i<k6d6lBw*8@8=wZmZ1V<Q&j?*iRye<m?655H/uFYEd8:/b=Y
LncTt1 Kbj/=kpkYu<dbVX%6!$<I//RDk&cpPRG#Z<kLepAaQ+AYAC/FX9#j:+C%6$EXt&q8@Jj^@@u481jRP9=
GZS5qQ j^Z<d<5Sj&LiI/*>YKL$y9p5^*M?c>h?anTVWwClZhcu/u@Gj!AaR9#B+awMTkiHYu4&T9C%J%Q8$TNG
BTQ4KX h$>yc^L4/NGV<ARmY^H%@%w#yeZ\b^b>PS*&D+Cp8E%4yFt6PQ:$B8T!AaXZmpL\RFMq=Wu&!mJ*Ttwl
Lh6Y%^ mX#?n8kGud@JJlE/&!NlcdKGk6\4diH4<KT6kX>dVbM>DAA@h8L\XtV1DLKL5>bD!DAkHbChGLi*k^&L
TZ:\<T y<%SEPm@BjPIud^Ybi%j$8%X5ktF/%Z&jnjThS1LEdcZ+&iHbqZ@k@lnBY6BBG&+qBndc+6yTRCa$:8c
<5M*a6 8=\nd$G4ehS9mkJ@mtG=FTR>K!6:c#&>h1d9Q+eA+W8MJGW1P4bbHRXQ:#aEnwacq8>MMQl^pdcWCVy&
@&R=wM lG8y#H8=aC*WL=?5HWeXVZZ6jLcX5SnblyyZKFb^Tk8^FaDTNlNLh^IBSi4mP\*aJVk=WuDNLuuj@TDH
6>=ta! RutpPD4lh9Fw+j6?VZkq4:ZtVh^wkLD$Pc6!#aSCJhDe1<FaqAcn\/d<a=1RLum\/SeXYI4&1$ZGcT6>
I696y^ I1j@a?IZV6ThkS4EZyC@yBhSl&&kKp+a6jnK&*R4YeaiLlPW^TWtad>bSRwKk55&:i@qT$L+APq:QVkY
HMQG\* 1BGn>PGiD1TkyVqY<luY5=AElF@P1<bluReSWa5j*a?nD4GQG*/@bRa:9I>JTRR\db1n#=lqtEu=M1hX
=F#deT 9=?y9Dqj#4KuWuH\ICwGQt>#6cGVcL1W\6MeKceiWGu&e>+JEjW$jSPYJatldaQ&E$<HGpwhaqX5SL1w
m:a5ua Vcte\t^GHYqQy/*9VbpMT<QB*A&5+l^YjPFwh8<KZkuA1@/5XieImat?6*+mjwDMLL&*BC^YtwmLadIw
+P<G$# #Hd:9N56?nQM^DP6Jhm*#DH@!WRwk8Y1#Iw:j99#wTQ!hV&q+1JVpm+Vl?n#?bTI4?8FbcKGJHdLL<Kb
Bymm&^ \VlPGFK+k=tpWH*R#ejwN$l<Hb/8GBnc:/9N:5R&/j5IVwbBBktRSX/wJE6eLbhBmMHeDwpP*mCHnQ^V
ppw<ua @K8%h=J9=/E\t\yP4^nDE1yS1!Bcu<^$W:aF\IMmwZ4wNQ^wHdE*#FEh=/NMnnwDFCCnJZFBGY&pKGZ<
:W1D+9 EnH$!JHZd?SPtd*Ic%mJ/D?8u?6Y8BREV=S9QXJ/Nj:A/!tj@*mm@9^4Zel5$8lNdjuI$D^ERj/LMhTd
c#5DZu FiWWIE?b/L&wG\bHq9S=mTZ@IDY@CqT&GDXT1b6%1tHRK1i*e$E&?yBd!bd5>eGyc8#/:i>F#%p!&mGJ
6inR4I 9/JS?6nKM5iYc+I?yHdI=lX#F9uK>+%tTZ11VGR&tuwVclA6\D&IYI9q^dNan*#pm+p&J81DaNIc9wJ<
mE?b/6 M*nthR!1%!:KPt5^T\?VyT+lwu@^nIXFLRB$%ERcL5EAZS6L?iC=5>*uc>QD:R$8A^@W=dCV?=nKhamE
mhT>tG Y&KJ/88L1e$5R*MBAY5N\qwQY#V6lkG:1/piwTc<>:Hq<NXya:tcHLjJa+I\u\W!9udMZ&JjGSdten59
Gpe@Mc :A@H*Bq6n<Y+S5Mha1Mccje\q%?^kn%pWLS%q4h>N%VT!GiuBG8GFKq:biLkV<jPM41/tHkCKhyj:WM\
ML5D#? LGXNYlB</P88QCLa9d/MKcClW^6@Bb8ij%RR/>EjBA9F&uWGq^=S$%dBZW*mbXZ\k6+B:^HtPWY=YF9m
c$EwK+ Q$?jm&kHTc@8a8:blt84j1j:q>QCMnLhwFEb<:a!h:\?NwJl<EMu&#Xmqn&FGVMNEYk?&C:nBR<pk/t*
P5JBl1 jFaVVdCiRj$c1aMQD$T/9/BPaWMSy<bM@a\L4J1k4PW8ShPI:l\WBH>I/#I#BnccSIMiuudBmI\wSItM
FVV#># kMEPwTijcV^14aXNZ<#=\!4?qC=LIq@1\b#muhuHSpiH\CPWpQIwmApy9IE9*c+id6B>AYPSEii8^A1I
tR<#XX \cdPDEXFIWeI+Q%G%yq4=eytTbbyFKymTNcTu4N<48i&HK^V5Gd\MjAdK$u4T5DIeE&X!!XHCST:E&=+
t^FZ^& >E*TY:\ktptK##twHt6F?<Jd%wb%FH@Dh$EV\+j8mHmuakB\aQ=A/^It99K+d9M8QC!:8d:6ZTI6\8u/
94S#m% :By1VRDDTQi<?jZL#ZH\?9^/!B=BN9G\=DSaqV#Qey:Iu@K$Y!#VZR*5XTcwZ:y8l6GdT5DPP?wI?>ZQ
$eIt@V dudJKiFl#BRTqF>jRaqI*wep*>BB6mHH?@u<uTedJRWHP*<IL\aKb>YI9Tadu/Xn4&i<a9?S</bZACJt
LPQMHX *<66b<\dLjHNR8Rd&&>aQ\N%&C!ATC<aBJhjq@/8TiR9>X\p*$J9u89YqyBF5liR?qVeycF*6ib!uwjm
AZT8a= =jDl:jlD1R$ld#VSWP=94weTy4Nenn8GcTC+whl9J:\Ley$%wJF5VjRyAiu^1qp^ZBP>\J!at=$\hc:/
eT$S46 ?muLSehh5e$MJ@P@nH<:cna*ZcI8bN1%%wE<A&=+mILGWuY&W/MiG#jX>q?Mj^$=yGeVA&HuiuTn8lT%
Z*Bk?# 1jd4GeI8/AKluPL^aK!=J5npQmJ@$N&/I?VRVC?ETWuYI1!cb\ANFhamKY5?Py/5mmTHM1EMR//<INZl
&HTIkH #PXPynLJkCXajld1%9MjYQK8#w=9^6upPX*cXl4VVac+d:=S&ln!G:4%8&P:%%#%\Yc=qLmkMjy8V/X!
X!&&>^ wy=6kIe&a1Qlqk?a15bVFSSlmJ*a?wCQPjGa&Lt$utddTFmeC1BM*M%e$a:K!c5#:\SuLDh*RMFp!WJ@
a^iwmu b#m1y=AMmyynu#pn&SjT:*BL9pLC4L/RliF#61me#TwyNnhaI66i4RYi\^6#\/KJK#mc6I>:jwAZ@5LV
BMu+d* =#6^cFjbcR&j!966Qe9uaBd@WBPDe5WnKq+Z!hu*kWT*u<?#hKZ4Wpny?FR>GNj@P^tt+GV<DG+EwaZm
8%cE4< pe/e=qNQX^R1<T5FY^/iybX1:ke>ZbuJe5ANePeheeJ9hTlSAS#5Vu%?Z$?Z//#6*d#/nDm?9#Y\=FZP
y1IhVe 8\D:m6bhNmA=qtwTi&69^8N#G#+u#RI8XW*<lK?H!GXJwt^GC4pGAttjHp1&?=FWG5d+FiW>@WZ=P!RE
W&RuNT ?hCVIKTD=+/^DRbct\eeTcuSV4HRlh56?Y/K64XXcM1=l$DT99t+$W/Cl4&G@1CJ<ji:M!an4wY@/l5J
ccuA*1 %C*iIR&lN*8Ihai*Zqj1dS<%9NP%Y\wu9%9cSaZ>QIJRuFV8?%#bIEb/qAAJ\P^BYbDdV14lXwWKlWq/
eyl?V% ZEIu=iFnYNbu+nI%yAuGC+y9ewwSIueQ@XFFp+PYh:FQ46Swh&hM$a!q&dbLMFtmDDSIbjYthmAD!5S8
X?lT9N FLRZwtu61pe?6T<*Eaj>bQjai9I&GX/GJI<kmcq!t#n/dmTRAL%<=9I=RAt?$QiQ88*$u\R1*B#H?9G4
!Nm5i< PSaCB=Y=*p\mEpT/%H$KL@DFYA6?ZjT\p%/&T*$5MyY/Q@@mu$?IBT!j4hN*uN+ANWa@+@ANT9Z/HtcA
m&PFyC uT4FLetKjZRjFB/qC+=h+JaAn^NA&1e<BXP>@y94<p:8Y1\/+SWPdu9L:D4&E\\4<DlQ51J&8X/PYbZ#
h?JaDN hTXq4^E4XM##waP8j!\@WlLHLmBG*Dj@RSA@m:R=SNJ+P9MA8pG4Xa*R%q*Am6VCebF&=P49BX9FMweN
@uCd@: G+Dq&hA:Kw6neNn&Za!VQmKj1eYl1:%%+lS=?edH<:u%CJ:D#&DSmMRJ?diCGZmYEL$A:P#aK\:uh6pk
!T$mV@ V%Sb=@8je\4yeciHN+XB@YdRBI!%&1*dqmJ5P/iSNpkq\cjlEj?dF<Q:LAuP5?cQ8A4J&VGk4MS4@?Lw
QZNtlh NQWC\qRtNRT54ZbjGm$!I4XmZ^iG@Pw$<!N@FM%%TCP+:9V*hIi?>e?e*PI$J%w5we<*q&+j1/4hhY/n
1w6<mP Z&Wp6?/=#ejaKQ9AC8=a44lPDQ#qud8SD\?:D#:VnbcPc%$j/St!n#N*Mn9$Qk:Gce<l/bZu%p=bNiq\
\c@Y/\ \4V#jHGZT4ihBP6DP5p=WE1=\XG5=&6F5DIH$S^^\5M\XWq@He$+N$Ww5nAFXe4//I5Dkh*1JH/l^8iG
XKV+b* Q@i<TmY8dcD%ePKX6>5q8q<XcXqThn<E%5P%iDy<CSXRVRE$:EG^/S<JEIm&Zq1$JPLqDP<^\yGehj@X
ayCy%? XYI=$?ytS>^Y\%#=L/Viw*kqkqRQtFt<!@uBE<mV&*%!KX:CVZ$i9&:Bc!KHF?*>S>5$lM!>lJX58XtX
uYtL?H DdI=V$RZAwM#9*qRpJ@H\V/4+bPBmLZGaGW^b<AuwbyhiqcWD?*+*NVMYTHed%$SlC6\S8cFE6CkZF5w
mHK*y6 VD@A%dRBZ6pb%ED?i:kEZiPK^TZqZ\@G?9QYw4^pk>6iynV!XH#w/Z#Ik*/C9Abu@5JBV4t#%tpHT\tF
DKk+W% Cq/qJi41YL\$YJluX*#h4:9>/5qeaBt#bWWt?\GCVNh=E8+tIP*Z=%?$XYXFZ/YH?h!X#l!1!d<ZPPJn
dId5NE +Ykwy5II<$M>eQP8m/?ieh?ZD<NJ1/yDZ%XmQ4%>m^kQQePAPS>PRJ\kt$%a5W=N5ZtP<*Kq6JR%TBZV
tucNA% c!=+jHK*ai^GVPS*y@Sp9GR<j\$Q%aFcHVRhJWXDEbiuV\b>/cRP#h=/RJ!iiZKalSncpdjiLBV/cp>1
>/jw5H !@m98*WpGX9?VVB49BhE>ZN/e>CDhqM+F\+jYycJ&5&M$$=6HH9YR6XEW>MM\=WN61n5C&BwIm!P6>@n
1e?\MJ T%jEY%FRRcQ\n!!tu%I9nh5td16X!jST9lYi!Ke&ISX$R@XNu%hpCdlyd1bPS4KcBd*HXb/kXLuLWTDB
+cPK=n 5I@d5%h9+u1d!4%Y?kXG<>/lCHJ$8JZ\F6MCyIuQtQWFY%N=y+HhS!#14lHSa9nuc=?tk/b$MGk\&H\8
+C>F=V HH*EMY#h>n=H:Je@=Qte>Fm1&\*:1Xjt*N\mSYAw^YE\>KKhPeu9%X8h9=#=b*CcMS8u@GB6PLRbeRID
k!<p8@ =FI5Vet\>KGay6HySu:!pG1BbaP!1yP%IwN<Ga>>5PcW$i>hb:nGy#t1p6tGbPunX/EVe9\I1%VN>AV6
YaH!u/ ZN<cYjZuw*pM15eQRP#Kb/$>wbMd\M6F&<$#FD9hJcMF&QXQ&EaYBC&Tj^XqQ81A\J+aaGYeKBthqM5G
qPtQNN i%wjj/1LMW!^Zqe&bB=pjFA<!+W4Dkt=Gb6utWy&tAmutj=<F##Qh4h5&9*K=hjV?/W>*qF6y^IDBIu8
&5Y<X5 6Dj>kW?X:iRlFPamESP*Y=ymYq$hQ6\aP@p*>&RN!b=4!jYbIBCXQyXS8\8KwanTaHah&X<L9C4T$i#K
Cn1/Gu aTIqa4j/d<QZ9VR/6AGhF4P4+&S5=F:JikQ?k^R:nL+Eu9Z1>ppGQec\\w9FHWWtpecI+yuYAqaWMFA4
bTuqeN p+j$dAAQpje*L5F/m<E8=44XF*8S#In4uP^N&Xe:BB\c@Qh4Zk1:<6X^nJj<p<mZ\W=w9@HHq!wMD1!d
=Va8K^ +jXJEXdTNYuhy8Bpti#1k!ewaTkRhTI8bwiE<amKtL$Wa:/u+j\T>WV!bb!+RF8ajm?Z$aA5#Xmc*c!W
1RwQ#1 ++IP#%1y!I/Y?L/N4uB*L@t8TVek/#6cm:ZPZ4eLtPM4kiYeXp^6cFGFG+bLD#q>ln!%<+\X:yIalKy%
-AB?l= 000bfd10bf7001202b4 Page 444 of binaries2.zip
MtpdNm A!8Nt4VcwZF#Fti/\$\RLARjm+E?#@X&+w+Y$:JbduwlE>Zc<1hkl8tInRG8!>+8H68:R<G5ab4NnG!:
DBP*Q4 yV9hyqRZ#eF?y$QXXI*:eqZwhPB*wabA*%D%\KTC\G^9y1D1aB^X%q/GNncc^nTbk1<wM^/hBn*cepin
$nt/&Q !KZyL!V=NBt\L^X^9Nb^P/MJ16P4iVHZAZ8ZZ?m!KI$j!XH1dBk9!PRwbcWn$WbW4Qji+Z%jZ6@8JlZN
6lYV+4 +XZ5pB\jTHjym<lyQhL\5C+p>6cXdtuFZa\ypJ%J+Qjhlc>:$6ELHkaB>1uS86dmq^FRXi?%cV/t+=?1
n=CjR^ ZDB\eBn$6#ItSZeL:La@ZJJa\tWdGmX%<Gq\nkV5=JFTX@IVyG1$ZwHuh!PV6LT154^?j:5dYJY>TE+M
%=:$4e @$S*YCpI!@ajdkNkI#<ik<eMnc6Ec4QTLtZeVna=4Z1:yCH\w6@^#XHjQwam8c=IJ&KJE\*cmEEcQmKJ
5ZFWqq S<*Z8#8Z&?*jtX68SG*t/K^M?!R&Ghj%YP+95yy18n%p6+XS&=lu^9*5iSinYn*^yV=XIJS5S89=5CdI
WVmh#T td?mw\?*=XVRJI*LT@E4RBMk6d=IkBq8np&VwT!wFJD*^:pqltmWVGiS*QdJQu6dmB@wIT/qB<n%^DGh
M>#Sna B/4Dp:aG8=ZNW^p/GREa4CaiZK?hZ+X5YmML94*K1Fe!FBXX51aHFlPX/RQ>\&IG8V#4#*?V+LciwbeJ
h?<L5< IW8b$/\PbqDVan<PPKwnA%AX5t*I\L>*eV$?N!B?H+E9!EKdupT!FuqPcp:*Gc5i4$&\MQeM#ZS/b#Qi
>iG/EF bm5NY1^V*?H6pSnW\/bc/IBXqu8b<R#qIVLaCi/TkhXu$h1Qce6pbVN<5beTWjn%Z\6C*lbC6S$=*6CY
1wn/Vj /FX+Fn1l?V=Byl8LIAFD:N4q:Lm?I!EXQi4y*AwLZYatHDN+PB4<X5PiuhK!ddhnZ=wuV!aJA>*M*^ln
9X991t AQ:l>n6i5t:IWn=!l5Q%FLYTaIhTQ##^yR+A@n9betdZQ6GNYSjwu^>MX<hm#a/Ia=HhSY#E>L%dBqjc
EXEc:4 JL+#qjn+8VZ/>Km&@X$l:8#y65^X*D1!*PM+51q/P<tmeR8?85S9IV=R^8qP6qGma*%@6MIMcdBuXutm
^k>CI\ Jb$K8cWjPi9wuV?h6th*BFW5bmEM@6wE8VT*Mn:W+A=ykmqn\JF?tn@GtY:Y$q^=E%@D*PPma>:FSB*8
$hK++t 9Yp6RkZ8=uy14t>FnE$^ZQPdCmS@y%FWLKFRdK@+I=mFD%Mc:bPJedT=8CZe1HmuRNyu^1WTCH:mlJ<:
9yb4$1 ^BQ5L%cwwhq+=6tNG$*4B6/e=V*$8*buVwnMp9JuLPFY9:hSANS9XXGtT4!\\9K&Q=&Vu\kSJ+$m1!ci
JknPmk ZdwP9HwWqF<IaEF*#nYB<@:aha4EZm>pMbD1VyEub=!CHVMN:/$Rj:e>XF65^+HPyIBwnm\ibS>*kP+:
NNPBFT +/q<kNncI#LWIltiWq:WcwN&qkeJldVnSFQeLtQQ*$^q6y&56lkQ=eM\dAmw4&p^T5Jl+mye55MkTTmy
JM^5a$ Z8b<Y!6\dkuQDt&m/\G5!MTBSNVXL=A8$5JSMyQtJTD>JT9&$PInLFNGpt\>??Nhm5=5cWMuFnPFM/^V
ePSHnK D9L1>HBK%WSuKT^W&AbQKCMmD$GyX$LcSKi&yGyYkePnLZI6tTY*lyZQNju4hZ!YNC=y!=%DR?plZ+ph
Baq5pe NDcGXADh9It5M+Pm:5l\R^dd@ZRhjBH>l#w?n$\T=uap?=w!LW4lpabIdY^CbWt!SGRt+C\n#NNajIJe
<B9WnI \n&^V:i>C\#?qq!jdP?$\eWA4Wl^c<nZ%bF9t*B?cbZw\XG8*dAX9>>KuRS:Sbcm<*pP%lPjXa>*/K<%
K1e&CC *QA4@hl!YS@^nuht#t\DCj/!N$Lwh89MdIM6!^=dbep4hR$^nEEat\jdMFNc8qXq4q:H=Hk+EWQJ58cj
5*w+nl 6bBpZQD9qN+LX?F#bn1QLDiBP9=he<@/1enqGmNYYa#^KnlF#N5Q%6:bV>Z!:+k$B:?4ZRP58=?8G@eA
K/jJ*i CZHy8!LPuHG#m^4<pJVZh*wq1X5TmZh?J8K<P&#bMRJPeTm6<td%=%SM:8TBn%&EWY@!uaptLGJC&iF#
VYd/XY #<@1B#q\5pdH4P9:=46iaCVZabS#<1M!BYPpCNp41S^8PCPY$YLR9Id5F^wV$8^ctb*9@8R89#Hu6L^#
hWLk$R pTAEYL&$YN4%d$BNuV\4cNXSk5%QYXCjWyQ+qVi&>kM#y1$YiH9E/ZSe4jIF1K#?aKYJhWTL!!a%#6Ya
yju#wh =D*c@IEV+SWh5F:wC@ZwTET*CFZmD%9/SLJNpnWBDmj$^uQkZ^K@SmbVk^8M!5\9$AGclpcY/Iqd\c5Y
baNqE^ qdRJj&BEEalG1*t!PQhutqd*wBb=?1V?ZGMIpqk/E5:TG>HLcKc*$XlCTVnLnTbIVV%w!H4PJ4dCNAYy
Cktm9T STb?XC>8c\+qXZa*iJJC&HBwiAaVZa?+ekq=>hQ:M</CeyPY=>ucI*!/dA=%?ma&cqRnKW&puDEXX$y=
bZL9mF +M6<d=6a<eVD<%l<8HbT\SjK\a8BPt19!5W8!V8&FiTu%H%JEL\lNmta$VDCwMLBwI\aNYlV5Q<K<8+t
/FJ9c@ uX+G\iE*Cj:yB^+dAFh$P9dF\<c$YW#PcdI/&qE?yuGnuDdF@VmE=pYQZ!QQE&nk4YGVEG6GWm@WT=8?
nY<q^P /<V/tVJEMtJKhQI5yeiT5#aLLDT!j@1*pE=6cEdeKbqQJZtY^XRKVmAS/h\CuTpQ=15A=<cG^CF:u#bh
KKDXac wX@Vc1b?WYdnXQKcAR>NqY#l@XePp!^i<S%a>%6WcPS#!aAV9ymSMXjI8>pei9BRR>b6Iqe8TD*KhNWw
9HBq5E M+:C^M!54>X8!CT*9n@XwXVG18BFW/Cl8?/n:j4++<i:!mZj$yZqa@PPMA&^=/9QMHApkHVR&=TQ/>GL
CtWhqX ?:d:iueV<dBn!PDI\Zq//bM\<9h:PhiHuPWpc4\&Mm8cXK=\=W?%WhAFDCiQ<XnET18XSFk>CjdAjJC^
NNk*Tu JWRttL1a\&qIly$uhZ>S<J#6M$MLmWtm<iF:S*YH/Kn$mLcF&Dp<ke<Eh%i=:6lyl=5!%?GR!4l<:bW1
kewh=A pE>8W%9Dm1DYH@qJ%wwaT>MCRqySC\StnS^!4W56L8lR\Y4GbuVdkE+DAdBZm#ZB:&BZ*LA*pMtNW<%J
m?PCYT <d=aDAZ9G8>yj9w<V@hQj1eMM+$cTlc4RKq5ReSdNAR?YwW5VDdFYpG:yi8QMjN&PS$*k:hFD\w\Wl^#
e<L1ca ZRSyE#6<qe$AAnel^hy9A>@L>XZ%L&J/<Yp#6:hGCqDn*bSKw$*m!IekP&1ld6KL6S/P<aH?G/C*Z86H
DiI8+y tPS<cmn?14+%C!^F=\MZ\Yth=8&JA=H>edlaJZuC1@WXKt\YP+CqwZGu&HhJ1yaalVH+jG*idG$ltX9\
FtcN:J hE5yCN!1yZ1iNj$?t8!4Mu?PBKii6BaTeI8uWdb4VKuCk1ALymQL&IdDJLCE6$1cYw$+JZAb:GkpAd>d
bI/iF\ Q\MNZPu\Mb+tX=Hy&!G\9hCyLIk\4KC+<SjJ1hn+KIqHBik=5GEPK&ZPCKeTC+K$bDI@\#%i%A#Di?j$
CJCGeT R!FWCw:hipw8Ij6:^!<tqi<c?ZqIhkmd?t\Cp+=!u9hknIZwD=q9XH*4%IAmIKt@\GhBa8V4KS4HNcV9
S:9#9> L#!MPXnkd#EiF#hS#!IZ?NRlZ4aFCc14ZpZ15?\q6d4/+eCy#bab>5JRQc&>>me/e6P=RYNWFH!HMyZB
hK*TdV G$Nu<D$dENKEnN:$:1pA$1>NkSHpS?Xeu4&F^ceTGyiqZT&*@d+uuuqkMpjm+lk4cXE+XiA/SnNA*JYL
d=XIFI M?q!\1QbSmJLaA5/4<&teDHSd%!MEYkY6W4y&<CQ=m\WJmXaRd&XGk%IPkLNL9F6!Q88W8th<m$1/5$H
*By8aH Mi^H+C?dCW$PjXNXq^/jh6Ja:YY!lVZq&yY>iPCN&lE?*BGDbZGXCa:8Sj^KH61c!j8\Q&dplH/wtAJ@
T$Wt9G Nm&R:>A5^wihc:9D\$*tkA8\e$/#4JXS=qedmEYGqE%C&dIYG8u!LcNXJ5XBwNCj#BkY>4DRq:L&^cpA
FRLd^8 j8%#\ScdHXLRT=CXMRyhy+aNN&6>LXe#:DhbEkSVa!%h:*$>nbFWm<tLRZt>I\C9DJ!uq5BwR6@n1AKM
AlBt6c ?ylH\=IuLu&eJe5TN$$1N?HS^@+%*9yV\dFNpcMjmk6Z$u&Ze6NB&pPQPyjqWw8Ttkhn=6Nh@?Y+&=PN
Vw/*FE Yc54abddI=<%n^P#mT1Xu?wqp^F5*qm/9d!a>^DbWehT$MbhRm9Vd:8THSj&iJd%NWi&p\a*uQ9GYQ%V
^mnN1C km&/bN+w<uFYAFjd95nGH<WXBG<%*4JRY/PL8LGpZn9XP>^AtNNaVPaYEj$BRc5bdR*+<GKyi+E1Z?!&
EiTIXe TNPlXIjFp/N8&4IRGtwJmJSywItPh^e<j1&4pZMBea#XyGb%?J8T/&aH>DNIqX6YBM>tjl@XVZ<=XC9<
dA^+mC abyyCaP81F>18M^pW+@Lit/dqbAH#j9m9cuq8>GmpCEdlF%AqD?\>LDSK5PTB=Vmi!VbT/K5pH%IXB<k
pnZGtk FPGV5*>dI6B=D*T<j4M\bqNC4nbC@HKEl:wn/n\MLlF/QRQ#q:+:E<4ZI*:B6jFlc*GaS>5=e@&?NM^=
cnquAE $#RpQtThqnKyHJEn>+C5!ahnEREbT?#F@=wJIKyh*XeXYm$T\$Y9FZNS9BlhIFnMEmS#RI%eamjRSWu<
+t9KpN 1N+VRI!lSaDK%aH<6p+Y=GC>1<^<+ZNQcWI#5ZHwkFR:mGW#PmcZ4Qc*m*G6^Ty>*i>$R4GNkbhG8Npn
Z6qY!w 6R?PtQISedcL*@^d!GWL/!:\dZ<!FjkP6MqDPG6F=XIaKFF=?VInA:@JMhXq/ZkC>5J9WaYWpX1!VwSJ
$?8@MG CnVPX*IC8^\\$QBupZ8AW@:NTw1!WM*>@PcPGQc4<*hTN%9=Nut/F>^aV/4i=JT!dKt4*^t&EDChD8:T
T\4Mn9 >akcdY6l!4^w!@=CpDiJR@*Ll%w>u\/h/HW^lPZ1Mw?Y/J\lNPn5%BZ9uuPA#ZFehBL%ymBa>5WAS!DM
V8cGPi ekJ\SXRbp>XL9YAF!d/A!aI/qKinXb<&F8>T=M$?1F<C^4CeI^pFc>=J*l@yltwWPjW:*:CXPRdw%PLy
T$e8t6 GX&ulSCu8RE*GB/ejhRK&p+K*RS*AyibH%R6uXR>mucP>Xcu1kw$@lpBXSc#euwmtVK$6516ly?mKGqh
e*$ahy ^I5HGaqRA6TQnS%1!8qiI^awIb=h\i9pyR^4:C\eDnakJhP5+!?h=NnaLT9YJya<BX?/T\?dCFi\hm+k
LT5VTL ^!M%GWK1V4bR&<P5?5T8m1GXkib4d6H1bV:DqcTW1/N+CVi*TbQQ4VD@&1ma\Db$@%?I9eT\k#Q4Nkc5
inZ?u5 6?TeH^@Lb?1WLm5PVnkXuAhT$mwi9u6>%LV>^IA1i9j6eC@%lYhaShB*qq+ZJM4$YX\\8P#w?iwbmhDI
dyPeYN *R<N1\QRER1Y?hYn@CKmQuK+a6Wal@FM>MuBmN&1Lh8cjpQRmX<bjCRp61lpnl65R:IpudaNTKK$jWcV
@c9d<@ EZwNmD!jGGjm=i15AS4BE!$uFd1*8cp?Pl*?^wYnaHND6ldP9EDaNBG+MBSTCl^m&B&V%SRal&j:Zt\<
YX?e@j T=SDq6SC*5<>qLMSyREjtNI4X^\upMDMyhCSMWQA9K*1N$yS+=iRPwEPTi19NtH!QFm6XE4C>==65yRa
9\/WGF qIjdD:qwkIAQT$*L%?mQR4GF9#=R<RKP@GY5Mp%cFby=buP^k$>nqaXj=5<<@m@kX5F<5+y1J?&jLQd4
9>Ek+X /wkmNtAW%Z+&!HW91FAPThMycuQlKbSp!d4AA8I+EL9>*Tyl#l&HN4dNnCZwkp*18W^85MN!+RVJ=#:c
-AYDW4 000444b4be8001202b4 Page 445 of binaries2.zip
Q#tt9Q @4<1%AenZk%l&j&el%uGa6L5Bl+Dy/mwuY>+Q5W$&T1e@8SIX^FhnTn>yu9%^<mVPBZMR4pWkiuM4/u^
y+Iej@ NI/AQ\JBTJwPK@6GEL<NDn$<KNM+@GVXih!EAa:mA@HHTBm4^&R=:y>6JtXdHu\aQZ+!^kyb#/4J5:&t
jk!6lN RSlcuJFRKX?S!<E^j1>DdLh9?k!BL/:@KGp6Q$Fy8!u&Y:Zb#ET?#WVym5@V@R1SRq%DEJ%eelKDmE>\
mqi6F> C1H1t4D>9j$b<ZI:&iBd&=#pyiJlZ6LR6XIne8kHRV>hI5T+IVG4d@G%9n8a<5Ku\KYlFnE?P^nla:cJ
DnLuGw P@Dd/Kacj\91p/b:mtA6>=jpBB/TaI@VCbCyeTmi>iAIdbDYTtWN%V&I:D\GV<6l6bD+!e#+t94c%?&S
!diAL4 bQCSDEk4JjF*^%icwF6YQi*RdIKEp\*b:EV&!@N#m%Std1*5RHZ:Xt8Paqu?kpX!H@NL4l?6R>lB%5P4
TelTw& HAlN+R\inRyD<46^aVXEneZ+1$HB9yXeZhJW>6Wq<q*Q=I!@\FQ@ijkw?*apqI^86KjEc@VC4ZpMEZ1V
kCB6%\ d&?uT$TC8T:5!X6EZ=wReu1^T^&+:wCcnVM1ZT6&Lk=+!Kjt1cZ5&!:=NSmyWcbPZHq&ScjI5FQ:!h<@
6j/tYk /4kp&R!Ei+&hehD#aL*^%1eWWjiZ>kjQ*HlKBLyJa9!&C=#IlPcdMmm\:+:\EM1B9\:M&l?mR@AtFyTm
JInFiL FQ/5A5h@aRnJy%k@6*Jth:S&PbIM#=j9JWJhhHkJNCYEnc<wnD8i1WTKH4T*kS9TG^^nn9G$1uFhbq@J
lSy9SI BlqbhL&&tjHCAjLZunEbZk!bcK><q>+%H1CJwW@HKW8h/G>+KIItG6YTL84y*6:6hWDINi/LqyatNVJ^
JM&!KA :cdF\I>J$dMdM/=>upDLC^Y=@\4<LFtXNQiG4wkm+RnIJNGpB:WHbb5X%Yqqm/HkF=KQn4dKiJkEt?il
&/8?wA V$dj\LBqNcH6?Fmq/B:>#eehAjQ^^CKVjPXB6P:B!QWDc?$y8AcS>@JIp5KdK<AKD<*WVu6mPQj64Swi
5RE\u? L5#kZFnG>dK4jBq#yp#XPZ9JSML^T>QtiIeTuZy6W^TQk?WEZ8LJc@M*S4&:m%RW@j/I+DDBLSn:\JHQ
VMB^46 lje$!&L9&MGC$>RMtdn<%mSilmMZy@ZyCAbB&CHjbcPp\qu^65mK<PLk5@++dktlY=pEq1ejy4TV\YNJ
Yw*wFY l^4!!l=\>9W@4!54P:\=5Tj?@5KJR8bP6:#&mybSZkdLbl>jPFJd:+1E5@&a69eFwuIjNI%hHycLYLyd
eqK^d^ RMbMp944Zn<EaZy=HJBTm1!lGC^QA6/Dya^KpM=tI<Id/I>eaC8p=14u?4R%MdKVCeqZFtt9LWwTaD&e
&Jw?KZ icCVMH1<h96hN!%+:6M$m&aKHATZ#>b5e4:FeBy@Yh!:E=kXP8@caCXpHjGMZ16m\q*6hT8X^>V\RlqZ
+addD5 ibRbB@wtSk>a!LAcFI>!b!A8RHT=*P86@j8^hVQ6a=@AmQdWeiinL9Va%l%@S8QHFw8Ikk$VL5M6i$IP
u$%k&5 yBYtk?HHK9WNF/H:J>SQdTC6S5PatDn$BiaCMG$MM/DL#@&e&^#Qq58ZqkCF45@u*<GVRJG@ZE5CPRR4
%t!P$Q Y16F6hmESQ#u?TSPm/+lGl#pDG+8#PB<LMK%1iH:Vj>4cEl:da^uQ!94TycM1SdwiB\nyRuyh9<l?4Ma
u=RXpK YRQCF$GX\GtYMu^J?FqI8Dh>Z$Ay^#heyhk8L!SbVJlkGcYW%8RG/>Wcq4lkdiDIj>i>\w%FCwpVYAJm
F145@< 5lb=h1Y$!*hJZ/haTBhlBm5kd?6&GGGVYKVnMnd:N>H#4:TLcwPnND9KLLV5=AJtQAd/+M9Vk64=6N<A
a6^<j! uF>=$c9XqZkCeR%8b?/VLwF=w1qI^ZdGPyl+8\ye1*n\$H<p+J#tG$qdJ6/nmPwYLIYWlq4@tJQnF=lY
S5=m<5 a&9F4CnyYFd&c%dR44wLe8QdVRLe^c<m@t/p+epYmVckBKc>JcWW6lQd^C#%$w::9Jn6jqZGBmk:DIPQ
IYR%CJ j<pHj=>MqTXeDlVd?CMchDBX1E#tGd/JSiA#iHtQ=c$aXIhFcbtb+nDpAqN9HNtd=6<eaj+mjZJL99c8
F:6%n1 aRYdNTPn$#leWZ=Cqk/*ANNQWEwb>ClhAGmZ=SQLW?qBBS6yjHQm+bD1p!b#RS=#h:&P5Xudyi=i>/T#
ZSB=4b $XnMtDBH/H8d8%qau<Hu#XA+udRuQ9EEI!6\/&#8<=\kkH>=c/\pj:ZA5\lV5j\Kjjm>j<hLYQSiK@F+
Tn=i#W ?G%%/lFVcm?VijhH=%YYp8TB4I&8Sk?^\jt&HFCHV56yd1>aBYKk@X8K!qy19&4?mMmwMIPbj9IydA9:
pWi9M^ ^8w:1kX#R&Qme5BPSGPk9F6<icpVKKMA9K?q/&MC^bSYq?T4MT\=6qqQ@bS:&>K@Gl!eXbQRZEYE/BF<
8$dTl6 Lj\ThbNVNYXh<MC$*a1$ZjySDnn#CZIp@DCZ9C/Ma:^T$9j^KN?/*m=Xji>eu8C@j6hRCN:TSu5aVCKS
9uiWXK <WwF>m%hT8=qL8eW!iRM8/L!NM^ikkCwRXyEnZGIi9<\BG?JBcNqcDlhM*$y%lby@^ewKth\5AwDS+h!
+DRcJ? Xl%&h8Pk+hP4injwkb?D1YB>B/6q5ttDHL5aRubQ*bhwe8#q4kb^D%Zpima\Fe5EFNk+bwTKBS1yBVB:
>I8ZG# PT%&Je1YBn9S<J+C$48X@n8#L>+D>qAZGA^>?/Q!pH8=*+^X9\1#=X*kbB^cN^W<ByqHAt$:K4$*mRaw
:jNA/8 /dw9NEe9YbA@Z*%Vy/Hb?d9I@qV5:8J/?^@!AMHXS&u+6J*Ie^:GN1DShBicIcW*MJn\n&LYi6/#9?AS
&>b\EV Bt%GTK6+Cp<WKnil98j?DBIEWX<Yelt4?cbFBqHHqmQ:aumW+8YFHXl?PStiPBLHy=y5epGYZ#GCqPN/
EJDSu= @WV4nEEJPY>X#jh\u:@C5Qw4>#5VN#S6+\aA4Iq&MK&HtN5jEEGEqpNnIbqqL9%9QVH=i/#ZT9cqHdMI
R*PkXS QabpX4?ud:<84@wkaEy\WL>5>QVni&^FbN/Mc#luwSeMZ@I>h9h!1tFcKh\Qd&V8VEHy+!yFh^G*RcD4
tG+J@/ yh!1XAWtDYmje/G\PaRMlJAH*9&PhVtIB^Jl^+YGC&1Eyi6n/pK8!Zum?XcyB$&ce*$uXwKXt#$@I:9y
@WX^La /Ij6cl8#p@Xw=c<TMH>Sk6plDRpk=n@QJu6&ajXDp@iQT&mq86PVXeMpFm5D<<KDWuqV/:bMN!kXenIl
c6>pR9 t#Lkd%#8Q!$VM?C\M^5VM+!tt&MeKiw&/S?FQhMZWhN<Bh59wRqL=9L6akn5DbD?!5@cGw=6%<iBY!RV
Xp+Xyn >uXwn8LYX/<^#uN#6$VY#lZ6AkAalj>:$T1R$68CTB:$tkP:PJibJ$Kl9JRIMcSaRW>EjD+MKG$kTljP
w5JDj! ^6SK8%!l%uCVRPKFdeuP&whNJ=yQ:\CB=>Zib\=RkLC&4=k:R^RPtYiwiYhk/%^4qQwiMh1&<&R@jHSh
Mc@&5% =?$p66$iZpII9qeVa?wy*l5q=ck+!S=ByqWKS\jGjK+</EXqCP:IlwKVZy#C<E:QV1ZE\+Q#X61jQtm6
IVPDd^ Xj%4ykuE@+P5h+!TJPm/lh8&1&%M>:S6&:b6&:b6&:a^dh9t6M%9:9Qi>*+Zii1emM\j6W=G:NluS//5
4G!F^> XZqWp$VMZH<6J6eh1h5>EVmSF+dRY$9C9\eY<qM?ITJZ8I6eY8*6BTkcYKjCZ%hKF?&CV&?/TF4pR?X<
%$my^> tLu=D<jqJab6L<Eh*WSSlY?SICp&kZ%&El@\5N&I8m5lcj<Cjy^^^56R6hw9?@R+V*ikI*S@IdWdXdkB
/bBThP D*wXEkB:^q/==J<tRFQd+j8Riw@%acuNNe5d>cKbNZk=/@qHmc^TLdm?48bdSY/Ji$a<F?%54YcTt^y@
!E9a?w !/n\u1I+HWVWRiCHTQ^tlA8@G\bqD>QcVc8KqAwPq*%QDG#m@TkL&a\J4JCK@+=JP^Z%BkC:F*W+ID$D
y1>/et KVw!PJI*5je!bP4*SbyM:wQMQW6<LmSwB^S=8XS+P$&tGW5/ZPR%BQk<h1Tb^PEL51^WWAq=K>+HyRl\
yVIMdC H4R4qAV>/E&C&mkCA&\#9!K^*Kj*<@j#5i<pM:=8^/XISjFjB^iFX?A:*1wQnJlPR^M&uyIS&45I+K%8
6TIbGc tDEy?^CHkE9#mHMh!%ww&nYKTb>PZYi:>TEjXnT/aWlGtH4B&:<!mB!@nFKTH4u%*p?ZWFiD<c/Z59$Z
V<pK1> cC*uDy9e=NJ=9SM5>+EjD15n\XI6IAZnm6J=i<?*96=&p4NmKbY<c>:PiuW*9bELFi+Ry1%BehmG#:Lk
a%NJ%i LTlKLKI<ubBeK6GI#6i+&H4ayn<<MTjVKHAQmcnM%>K#wTBuubGPAl%blKt4ut*%$1yC$pweND4tD8Y4
I:1Xa/ y\8mBERJij+!+&jlb!D^+>ReZM*b?JG\%ZqbiuS>@jHXM<lEYNZwePjYc8?@X\i4?bl+*?c9b6me*jKq
qyjW$y 59#T9J:/NtXIX@KcHuh5Lc\\k*mSF*%5\m@Bw^qM&lVy^#nlYG>6<GXBGW&dZ59eb9tT!d@?n6Kw?i6M
Kp=!&9 :kQqheaFHlHKH##5E9PmDl*8t9p^1%y1G*teF>6phLXZi^*$R6p?Z?G/ET5N^!NRShuL@4LLcZlGP+cZ
teLALy N1dN:FPFb=wSccu<pZ5yia#J^N*L!+hR!yLlncB!G*DFM++P^q8JipQ@m@/W<@QtMd6/W?6yHh=yT&FR
$Jk\Ai ^lT@9A=?M&uTPwGmJqu$/S@5M&V^@pTunYERIDdw8Jk*S1JGXKK9%hXVyYKW<5N^ac1e/F1Kwc?lu>l?
WiT/#k YdpZ&%LyXE$jq?$kC4yP>>Tb=dkM$N4<ZhuDGMh:y?l=9>S1h4w@1E#X+8jqa%aPEZwD/w+lDh5Y8nWm
D^%TF\ K&m89?QwdTEm^t&eK9S8F1b<<#dYXlFPQmN/^hyewqWWVLXQ!YhjjDh^E8tumH?A%RZl\J6uq#kP81CI
R%<ch1 nPEQk^!kcpZJBWT!Ei9c16WlYNK9SPiTD/!pF<L*EZ=@PJyWa1ZiKhJN?VAGitdJZqaLYkeTC/AwQtIR
AuL*kP wI6p5/n%*FeBu+JTtep\:!wj+$^XqLR=CQnt:KN/&$XGY\<&GQ1SpYDTRC#nMTA=%^Xed+e@JL>/VnFt
d$>9ZW GGapTqli%FcF?1nL98d$jGj>#tQ>K&^GB^Wpy>it^n^?X+%Q&$<1dE#d*KJM1%NdJhJml:GD\dK>cqN/
#kL\ee :uikLu41nYG1KG/%SA:$%nDYLR&tLMmZ^#yVN<!NkyAk9Fd<e=\<!Yl8+d!h?VjWiKBRn8c&LdBA@lhh
J/Amae BTbRELQ9ajEBaICS/CIAkl\yGpY*YC5?:D!8t:GF9>DcEGZ/<E=S#y4WapGiwCNc9GHiM+QPyjiwNhuj
YFPYMi tG:%!*T<+C1%#!6wNmI+T+Mwl<MYX<IP!*:WSe:#ZbLBc5<n:pNYSMJ5%&aG>\V4hm:yk1LETwpBwhG4
6W4!:i ?h=F%PPaBh<i5l^=n$L8QjykK:C!%eZqd6hT%XJNB$l1VG=>RH?R=KDQMNq$Fwtpm8<BX!Qtq$V<6\hV
hGwlTQ DnVie<Ndl#WFtt=:nNtya5/ATVHGn\y8mJ?X!?X9K6ct>R%4mF<mdX!@I4aYPwjRq54LH:nPFLt4kLa*
8CRtjb Sb$q!cITaQFWIi*JyCaFdIDFpmSuBD$5aI+NIDjI9MbbNEhNc#iX#<dQ>:YyTJkPp&F$9akR:=8G=e8t
P$AMDA lIl/Z>8kC=*pB1w!#lG1#pl!R9i<yWjF@u#N\aV@yAn5wQc+h#aE&nb%+G?!i1GY6Ytl&+lDpAqqLA9Z
SEtaJA 4R#4DA+e+ah16k@@hEJpdLlt**LAw6n%S5&Pc\X$+*W=@yRMmKu\<>RZbk^*cmuMe<DbZLJB=BX:q4Vj
-ADQyQ 0004aa75fa6001202b4 Page 446 of binaries2.zip
FVAt&i lKFFJCc^DWkDmd6L!TD4\1W1CRA+N=mRMjh<*TB!X/pljD+6AGay:4+jZIREpL^4e=<SyYdELa%%wYiX
?>9Z$p m$I8YS1dKMFbF=ZlwaL#FtKtt+Bn1*eM1*=aVAb^J!p99>1!aS^L#jCKy%GF+@PpbYEZ6jJX*T4H6BQZ
wTuMXa YIFhHPh+I8auY=4=**V%XTHRXy?5/mP/\!\AVWGGi*=!*?I@VkyhauNWhM+Z@VVl*<T968Zp4e&d6Hy>
8%Eq$a byXH9+Zu1X+&MWhA=^11ASPWn1J:wQt9LN6IK?=e%j4:5dpT66AGkn#G?D=YB!YJqB@%@mGLD1hAyLEZ
E%hLGe CZh^6S1QZ+5D6Ja%*W?$X&Q<ScDjnteaTl/D11qhmTAJM!E/4HC6p/aR<GD+Y+@c+MG+yZ64l/d9Rk*X
>X<mnk %\m:K89RR#!9wMicu$9jly?S>e>mW&8@%1\:%?N+ZZ&+CNL+M^Qa<BH^R1YCNBWQ=SQX=^AIq&8<bcSb
@!$FBT I:N<KC6a@@164T$Gy\qNIjbRnKyu>N&=SWqF%5kp5QPX<WSP<pKhycwM:ZW>8??\FLCIB15Ni#F^SJWV
n+VIH= ad:KjLyl9ZD#!LPSTpuM/PEqC9mkVZQk:4M@K+J5<6iqmPCD?W$D/BqM4P9FwJ4W$m4GqHtS>%9>cX6*
?u#VVh H8<FF%hGLK8F?5l<Zy9!S/FVPeS9LMV6u54+B^dPTVi5beKDkF:dh<K4<eBn=4YT8n=mLk/cdwda8Y!$
8CMVDu NM:i<RtK#/:F8w*9>hYZjwM!S$cuVdDHWkeK1a+YY$@bL$N:RZt*\*y:MEDJu<\hR1Eyj&KG8>lnL**p
8e=!L4 p?%R8RWI*+n:c4R$X/n%mp56EuXJSZS\Y:$5LL\j4//+@e+B1uPM?VTmpj=RYY:SjHkVwFb$$e&HB?wM
Ruu^Rk >HGFjRjnC?X14H8BCCnEh%m/wQVkSdJlGQXPA@q?pIeW#AlT5PL:N<1XS+tV5u#WK%&I<$#QHB=:BP8>
iAEt!S Sj\E%Z5peY<NEp%9a@Ba^>k/!>T+SwMhItQwp>GdE9k*i46y\LVLTMkHKSe=KEdbQSRIdYi/hEYptIZ:
Ta!yWT $IQ$15$LKAwXa*Kh@GK8ZyS&@5wHl=ej&SRVZnj>/dq@ylt6=Q/Mb+w&w>B!bdPc>pJDQZk<<Ni/&RAN
KJpenS J$nDmA/I#<aZ=<^+ct8R5:JtE9J14B::J>LAwdwQp+b5=pe:5mGjiYSH@6a+?d4h#!M+hAXcq!56&ecn
$*I=6% !nZ*NDwwJ5/:b9Z54KViW1N%IklGHYieS+Xc9JAb!HkbV8Gp/MjhjEFMhP>BctadP/M*/btuE9jpae?E
iBl&S\ %#J#?McCaF1A#YNT<t8C=l95Zhptu9EQ5qWDpR=MtCqRNB@IKYDK%@LY*:FepJ:Kqe\<>it$%uB!A@cy
w96dNK h<e=5DahpkT?11/5w9q>qmLAGE=GAqQbjdRSyNd<$R:pXk+jT=i6LlH1j=BFSe*&6pt5%NM<NEMcWe@I
eWNSp< SD4neIk?tNA9E5nCyN#pu>TB6Q>h+^EuA/5LGhFV&kePhG^*Bjbdw<wT@8q^/EpY$#G<FYJ5:p%kQAMh
%I&=jL Y:PXV8Mn#1E5MJRdpNWM=nZnuw<Mu#wRc?1i11b>JLHPMai5nSBDWIk&!d>wIl//NwR/QSuwwu:?*E@i
c/4:P5 $k*N6MH#FYnW:ZltXAmYjR/lVLD<#qCB+F?^?LY5IE8iquPLlYpQwRitF=<wI4kWT&@ihVT1Ei>4$iR4
W!Y5kY *YT<>>%Z4m6<hQ5=>*6nCPq8M9CuH!+=65eG6!tEW5Vq6S=6^WF5Ll/c!qjqHm^NlN!Q#ljaDSpZnD4B
9dWbea l1QVKL+FTD#$eyXw%JnC!eNmR#Q\E/FtCh9B%aRcR>j9n$%Qh?i<Q!9!/6B&6Fd64YaVdCmcnkmR4X4>
A+!VkF Ty*tyQZN$jd\qc8wb/L1<%jm=<ATE=MhR4I\d!Y6DG=BB*Di@a/Jl%m@Y^hYQN1d*9+Q<t<M+m*9K:yV
AS%qPi =%nF+SL8M<5hw=qbyQmpjTi^$E\LIpAD^e%NT<l=9pJKRW$uEa@$lw$uDG+DK<Enbj=apR\uiiSL1Nqc
KEGyJ+ a?w9%Aqnc&YR6^$4LyIEaa#G1NDBT<N5@1BGn/S*^D+XYh<$95yPc1$?AHLeQGH>BCPAQ^%9@aMBnL*!
SJXjE5 #^nK:aiqqFq*Xjeh8HP6ZpB=LaHW5!^dmS@R^*tPWZ6pF9B8y1Ld68NJbMc*G<XneLhCSPDaD4#Did=b
+*9uA* utT9\wpYZd8Z1k*RbT1*ubEM:Yt>=eHlp:ne1$i6!q>XVS69T$iJWq<t$bQNKGd4&R%+&GjB8*T<e:WN
e*ZnLJ XhK&/=lYXh\mCFY>a5LF^eYyBdWmmBW!uwbAj:k5WC%inlG=iRF/SYI>GiB8!5l\>V$LMIw9FIpGwuk&
hQNCW1 &#I=tPmtnZ!wud6=EP==%Ftm$/ET1CR<Mh^*dTiiec?Ej?u?VcP*XTcR8>dkCZM:1Mh+TL<MNmcwNl8$
Z\?/aS HR^<D!j=K:DKPNtt51%aEaR%G+n*Mn:8H?PdCj*S4hBeRJC%<wyu<BF:w:!Qk6618=a=G6h1mnnDIPj9
jkpeFt Hkk/Y=W9M#&4/t9HLnZW?^*Ltj*XnF@/6j84qAtQZLbH/Zw6:w+4ZkqitcAnwWqBG4j*E5+Ki<p*pQIp
R^e@qS dy\eC5C!kT5FK!AVB%qYy5eYd\#iBTW6p\iuSmDGa:+hj$JMLW>kPVmlqn4eeXZCuPYll<XDXnyd?R%A
c$EML& pRiqNJ*aR59=#LM1jIb&e4madaV5%?M%dMJ*u*w5j\!DuVL*9yCEe*85SquDjd=@jK\Y\nV++b*phS8d
a@4X@p ^b#59:dD=VqqNCjYT>+LR*W*G\eZ$mhL=$\*uJ\SSq1$^S\=a@R%Nc&<TDjAQM=!6G9eWbcHkXeebyBw
A<p#+@ D:d#nwc<X?:?I&BB=%%Mb!1p$LVj#%MTtHL^49c?Kut\NCSC!j5@h6P9TZ!Iq+nI?&@lPtcejuAwV4i&
lEYXH8 M=8nPb#$e4t!Pn>lJm?DiBK?e\1jZN5BBm>H^6Pw66=%=!1^4q5dqeuXj6!AZRwPYlBLFu+id5qVXTVW
i1?n$u %:CnJyBPm&C4^/c9!mX8w/HN:6&RSP\>/thHPTS!jN8y!MGtb5bID4FBh1Sd+dcdIhWu6wy%m$%q&QI/
&HnDKW iX>jNaN/qJ^wHhGGhNX:?C%kiWKQ4K!n4pkDN96hK8:Rcd>iiZD:eIAa?a8b9F:$pDei%h9bk&&9G>eF
u/*WTI =te^dCw5^Qjy9njZnl!<uC8mG?RkKlqD&T^alkLAi@4<BM4kaD>:XeLaelbqAJmHaS^F5PFqLew/W:SG
:5iX6b dLeeW>q*>cul>=5%jtCTC5+6VIp%A<HWDCaC1&G<8lBQK8Dbd=R\WlE/tw@\JT\c$k=EKMpTbcMQkV\d
#>AB/n YQK5u4NJnH$Mk%$\=<N!^QnT4KE\CW*JqL@V+qml^+iuRN^m#GD1^\i!hAyXcib!9ZVQKH1C9VT/*4%W
cYjCqR qR%V+yy/1jwcq:>@%FjI6%!<$Q@a!5>wK1d:h1+M*QSpCu$n\6P4Sn>XuRq*>B9dm5I@:QV<=hHmL=a8
b?$k@5 8IH*/!1A8GXjGVjqD<>/a\=D:<iL6S<yD^>uK:jEYaWe<N*>niWXYWPGTaNT<IqEX^8yjhI4bm4<!\Ei
iQCujT *q@mWN\J%nF>KcZV/BDh%%QF^>XcWLbXF%+MD<%tJ>J8/S5YBeSY/JQu56&H8QBCp#<kpBn/BYnS**bS
&1b8cR \WwYh:nj4q$9<%RMPA4CwhQXm:=1XYa*HPE8?*tt99I?>uM6E@85tGjKaSl&j@cKt#mtp%V\1W=$AAtJ
1m$!:L >HH?nA:+<I:F6j$L=DK@GdWapAPjGZWl*%LSu1>udSP:Sj@:l<uA%*GEpX%$t\*^bSb&tYi!8pFc#yZ?
MnSpAm m=!t&EKlyqy*l@n=y&BqH%C9VLtKak!y#TXZtQ$P/qnemQbj<bDj:wQ\?&jGC$ISc%?\G!VI+*e:Mpa8
bA8p?y ^tCp!94?JZS5dmJ9yd@4AS:j9?5Tj!NGY?1NR6ck@qXD&=DVnGJL$IlBt?h4Yp\$BbPHS@\Fcj/EnjdZ
N^C$Y4 iJAF1KCQt^E:ZB?@kWbnA19a@iLPu>j/b4>?/t+dEm&T4LtB>J14XVQm>:1Pe>X6hLWb5b!P4THF?pZF
%+XNun LMG5M4qV@V:!\i#+5!i/N:TuE<TyKHw#JKnb$^?^D&#:ec!+5jbubmESqQcC>WLyF:48>cPCHXEYHCm&
6HlZeI 9X>kXTd*KTEq?!#Q:WtjayDD4d^YhdqIb8hCTY5p4:nMJ+=NACJC^CJZY:?iXi:KnGa?kyu*9$MyteI/
F!Z8F8 j4C:*uitV*?SjKNHYJP&#5L^CBFJNJCKk=^9Vl&:6l1hA86mFFG!B>nJwc/\T:pW/BBFDydQaBJRW@VY
+>L8^n huKWhZS\R6jc\qqEQwSV\R6I=ypt>y#eh&w!>1INR^JVedmYkK\:Z5hk*t!!>c>wQtEYt%=Z*m=?@!tM
X/e8IG aEkypw9ZRQ9JAD4Y#6I@@=S4>I&QnPAPh>1?eD4nRI\$?:R6?PXkdXYLS?t:4p$K#LTYWDBYHp5*:kX%
jT@q!L ekLVLPqu&nVpqaEmM=8m%D*n>9tW=#?jTMCRX^XMXI9WRq@NykDi#\*Ve6Bnb!RRtD1TE6#uXmd^FwJW
RK/mj% LE9@DM1qm^d=BDSM6T8>T#=qHN::n5#SkqFHpi%BTEC5CnS%b=K!c*F6k+!:V#6q8#&QbTiQWV54mbM?
LXT<t8 6>$eR+p4NwChnEanHZTTPuM@S*:j/bRB+de:>:hh/k:9XP>aMPVey%8wkjwMS%!DX#lWh=ud&JMchTZ9
d:Gk?S Y1&a%8Y>aYDhAqppDGaF1#b6mq1tBY+Ze8jS$eJ<\9pCZ8?*SP9n%*WI@$MGek1MLdj@u=!DL<kRh*@t
W+YTL& cyjVY\EX<nk1!n99mewbQAjwD+Du?=Jn:PGyjTcQ&wV>q6kG4yBAMu^T@A!=JYYb9#wmcZ/p1>DYqqC9
FC*y15 t+=@itLaWpat\b4Ql^X1&quRTV?!lHiLpMNbc%YqQH\Npe19Du\Xl9NLW9#e!h<M1iPunut>4eQedDSA
N+aGQb 5kqK!8NJ+=5j:\u>SeA6Cww*\X9&p5/XWNCpMDTQ1jqnpaVRtZBcjTFH\\phKI^*Gj^>ZANq\>Fi=6pm
QWLZ#k VVE?L%p6*b#B=qm5RPD!kpbhm<u^Q<!Ql<e=j&kPHdN5ehClJV6%b:dPMZFm8A1986Y&l&/qKDa<t+w!
::X9Qe MVba>#M1%qatiw%pThIw$+Dd&ZR14:l!hY9Y^c/@R/N%k:$u!hPQLY/iy@mACbc6\1I%IZi\DFD$H:1j
i<kt5V %:wCi*\Ju@hb*IbKJF&Gt*Y8Pk*4?$k1En:e5t>@G?\TV@k?RqpkBq89XZ+hui?Y%^K#h9!%u*GD%<*G
JJJiBq /WL>+SEd&yuj@95$MTikS8ADGpY8dqRLpeYFSXd#G$mQ@lHnL68V9<EtSHJD\IYW+!V$NMD?XH/kmI:Y
FW6aLh W#nTcQi>b/5=QA?wV^yP6uGwTNy?E&M?8D<@PSB/4h%!BMN1<VGk$W?4adKAik?+Yp4JyT9^tTTB#%Vn
t5<p>c bd9\wk@:W?91w%5dBM?eWbMG5*:Tn%Gtp>pjq6R68*1E<=XVApceWcKdYd$n=V6=MBpG1wne>Gdw:dwX
\59Shb XAk1<5!*X:W8CjQ<cD>+K&M\uS4aSkR&?&%W=BJ@mnMicBM=CwP>j&CN@LItaPk!ht?LW+LNjIk/Am9a
EjhH=T ?RmtaT#nRRyQG^mG@>KeI^uNN\ywLitjWI$^B>X*kcWBn$5CHi1C*mRV<PmB4VZH8KMN9M6JJRaej&eL
K1H1Xt VW6X4&?JNBl<KFT=8T?8%HV9weh?ISacS/D8RqnmL8WPV/i\C@yC#bp<?%qB*F*LVhy*E+mVV@4#LG6m
T1eC>Q uF6KN&KwPtd:jBYdT/>P</p&*aR1?/VbqRk>Yk>66BGqR/S>nV<tFQl&<eLGJnt/?hj1cCd<KDSEJHce
-A5mA% 0000b788b1c001202b4 Page 447 of binaries2.zip
CqQGy/ S6?jKuZSepE1S<en*hlaJa+VY#=Rui4kYYJtD#tDpZZFpR6/Yc%KAtbT6SKlGli*kH?haG+?%:R#+aaj
GLWlu@ I&h+1Q*/XEV4>Bdw^H@pE9eit4$%<C>5q&Gle9/\LD/MQj\+*c?Ce6#S5DycdN>h?pQWiy\^/HCCKQRw
/pWPee pHJiJ<y+k+FBIw8+ZYJ9y+R5<?eJSKPu=jhiKy>1:j145^w:*49qjDmyJ>JiEDa$4@9hI@Me1HXSnpKP
&I@$5B kKIpki*mG@hD:/8%c+%wk^LY=1@PYYqk!L:p!WeKtDbRRkaySNB:4EbS*c#w5MKeL#B!GbEC:=QCmAuB
++$I6E 9TEa\y8d!hBLP5dh5eCA^SE&W6PR#T>L\R*8$m59pE5RybkQtq>K@1HitZ4=6EGj$V@pA^aL/6n!F<Vw
6\plXW R:LVy<*Yp#u#9@hAj@FVX!h4M$@e=HYC#R?<SC9LdpMPCn<J^4\#htunb66Gblm&WYhYyC4=a&QP&d$R
X*5jQb $Z=Y?Jiap+P/qnGlhapVH9y4QEu6m<*>wyW9ASGEhCw&NbAj=/5%\\jV+\u6qy+4GEQh5kMTk^@IaMtk
EaFdFQ &CXye?aZPnpaWapY*lM%<%wF@akIC%H4LF1R8t#AbbjlqN#1b%RM*mS#Q@!4THA</4$iTAt=Q<E86*hy
$I8>41 Yj%Z5W$qN<h1WDeLDKY6VbuaJ!C$$$>e$5bKZY*%%@WJKh*1P1j:SRHEKhEEeA>CXV$Z$4n<J@1An9MC
m%ZEE< WkiciiK^nQ:INw5p@XiMZncCZ=8WnlN\B^T1eZ\R!Y&#F@9pe5qw?CSlbc!<q\9F8/=bZa%lZVk!$>?#
kBNyGV k\w?@C@NJ6ijZ+*mjd/*lBY+?VM$T&X1aDKcVP1mu#V&=Q+IhRkj8BkDI@p*BCJJd<\*4=iA>#:Q*?%@
NCMKQw 5&nKAn5wdBm4:^pY/XE+A<6@wN@Vh#pe?Y<ShI>W:Yb:Rk1ZVlCl#EiM*emw%pu%hi%J<RqBt=CLQZP8
$$S*ZB <@wh?MhA^cIHR59@JC4*mS?1=NFkK!&b^lWt*nMmD45TcpGuQJHblnZS<Jq?^@eQS\l!$p=\ndBTwBm@
Qk+u9% $@pN/uAp+H$ic!=J\>u^@auI/4$@$t?Q8eT\hL%w8W^*M$AXeV!nw>yKJ!8P*WCC$QwGlq\<XW&^%Dp?
EKM:>K XEFM9B<K@pwc11p!5FAmF/F^<QAdG^6&KTSiJ/J?GNNZuHJIP@i?8Qmd/he%4DE^PP%TZc+&n1mG@WpC
Bcp@iN %FHXeu#T=9CF4p*hCS6aCjJq/iwh5dQ%!=*%6<Qjk9iJny4NL?aYa>ZDFL*TQ%ucu\yyKB1RicqJRwP\
*AL@=Q m4YIniC$>c^44?5C/8&^J&Mcww&$yh6qA+H=CBkJ&VAX=J:!qANEtDk*b$R4+=cL9um@bR$$<SeY>qAq
*MK+LW ?%KZd1W8pXp%/nuLJ@XKLlBaYjWM=tFp=Zj5\6ek^4jja$6@^VFQiduw=Cnt#/LFh\95><#<!9>+FNKF
n#/XW! \%j*HthXTN##j%AuY\udD#p&5BSi4/y5AE8HTnRHG^DSd+&@i!mm#HdJ/?8uSM+hWyVL+qc/KXkp1i+L
E$F%mP P81LZ6QdD>ntyj%6yjA8deaJe!Ad#bQ1a&qYM+5&k$yCJCyeLCq1e^!&KG8ywPH\T^li%/8n9qHlFRb4
*9d!:R ^lDHVQFKbbEV=*R<djIBX5BnSpDPhK!6<e5!YlI+YaInFK&KTp:!lT4npPPGIJS#QG\=SJ5NSB%$nKB\
HC=8wB 6<YqLIS!IS?SINKZHJWcu8DM8#^9$SC1#X&5tbq<BnEp&S!QGA>=tDCRk<&WFhW&lc#&y@B#1cZK%XHB
1=GmNH cT65Vwe<T<*My6u=taFuMNSR&Ad&q@AF6%+k$k+P4lT!SW&^nCGCa&Yn!*F9T<YK!kRDNt6IJ&a??Iiy
6E<lY* jKW!IZeGHA*BL5G4%=ILV%8$TZc%RKTEmym$B5nG#@TKj/:ek?Q&J$/&RhCD&NMhV5im\H9!:N@\:yEk
V$SwGu 1d&p<G>q$>@amTWV@J!umIZ6=B?#5+kb$qJFh=1k6phlJE+M4HVa$>YhHwJT!6B%F@XTR948Z@ycCANF
u#PGmS tZI?=MLipNVFtaY+:VX!:Ke%Y!H+#8u=l5McjHHV&b/IQB*m+FSl?*a%\TbV6==ViuN?BKJ=Ma8QKLLV
CWwQ<y u:yMC\eXV*C9yiRAJ\+!LE:XZCFaA%w:4KhcT#&$bYC8Wd18BbCjkN1Yq^1GBXEB8EJ$Ft\NH\!Sw&C>
j6*HPq uWQ:JdRSPLSj?Sy!HdX6%mI+//TQRcuP^L/FVFdlD/KY+AH4PtFKDNLBj6%@dnKkXkQ^&NLS//$!IM?C
Qeb+M* 6X+t^hWw#VTRnbGp:9aWa@Tt@R?/Pl#9\#jF^W1:YLtAhAuCFW@eljJaHF4hnDFB@C?ielm4PlN##TwG
I68KN6 $&KhREceSAk!$!IH=Pn!W?u4?E^F?mQnES:+JV+u^MSYcDVR$yBKcc=%M$5!HdJpE^CL>RQA>HCNQMXY
@>%1>5 l&5jeaZeFP>A\X8LWLLpJ+GN1%K:NJq:W=NktAb5KJ46n#*t#@N$TdbYLW>PL45y+a+@%=/EiqEk+PkX
Mq9=EG Y^e@5IEnG9GnH:6>Y*wHuA5aH+J=V\%TQ#!I<N*NeQamwC5I:Bu%$:I:$#uVlXCa&JiMNjD%$1i%Ah+X
GJ!uL# %y>unJFdC>TCyhA%mF&a\Yi+G/N>cZy!bd?KpC/S!ZCw6t6Ah+V%l1*E6cw\Ziy+hl!t%6nC!XXA8*>b
:RWCI1 a<@^Z%!NhC$j6?8?mw@l\hlGk^@DWHB>t%kMAF:BXLY<+pV=@&*uPPZ&+W4Sh5cVGAyIIJP>aH#C!+h5
\l:=k1 WE9Bh\iNyIeiBlY**Fi@S%*c/HJu8qihFqaG/aHbECRNQ!C%6<!:1bkQtqT\Rt#jyA%SMp@WdkF#5daG
w4L=Qt uby6?iPE>qtJ9Nc8X:95pueq?#wj1NnBtQZ%mXK8nKcGCGB^VD9MTq%Sc+N>p4&da%THEp9aj&t&=mhk
t\F@A6 bb4mlyMtt!wmCuRJhqLMdQ^+baCKwV\?chlXnCCMPJLEpFZ6IHTTKJaNABTIjSinWXDmEkW*@n&yDWcj
YF^nPw &?RW#pbR##Kl1+F&*5Q$k8>ceeCJG*McuLwCFhb18Ebn%Zl&C?t<GccWT9@b^$=W$69I1$q>/N5lw#6T
#B9jj8 cBqJ6WH+p1=9ldG19Vmt#clB=e5%qIiCDA1jtkd1YN6hTW=bl5mQF*&&tM!5wW&kTDPGGmuhSP%je8H$
j6TB5$ CA5ZcEqy:jwcuKCFelZQ&KQ4&%+ZBW#TM^wwF!=DF$ZeRep/^NC66l+J&JuG<?F>GZ1QFHEdEh6N#%ZK
9R6+#$ l+qTcSZ6uB+>yIq6IZXW$TJji9PISD?cZIbh%B8MLiWk*ik<udlTZP8:M89XI<WA+nbwhc45k#b%&FMa
!N#dkh >lc>mS9M9w4uZ/9Fkm$N!\$j8lTCim5QEFGue>cS:u8S/Z^&JG?qwD>TAtV+dN@XuB>lRad=@@Mu4ch#
yw#D:8 >XKL+EbK!B5BI<SuJu@iMbn4&MGu:?6cF8waQB#l6WCqMi?D8dbRRZKcpBMG^y^F\>b>#Yn:Gl+@n^tF
Dw#hPW &l!aX\J=*l4VVwwJT9iqW=q5yie9E$XV4diacPVjYi>W&!1VSS!/nduLTB:XyXZA&m+q>ZAVq^T4M+RV
XiG/46 5H>di%>>?K5WZqm>=P#$h4/>H>ZkkBA!KwA^>^*8!C5JH#$mnFT:G!b/jp$@8XQDpVyIuVP%<4uHCbp<
A6Ala5 @bct=$kEFb+Z=X\QXJe94c$??88:PNN%Ru<k\temYHwiNL6eMHppqcqmua<kqDV!di8:A9jNTFM9%T&h
WH9Mh1 uE?&<b9YNhp<B*V^p+1$n>?C\PB$i:GtXT:6*tZ#@eJcZa4FwyY^uHILNe:nI^4d9CG+G1>&?^4M$*kN
$aC5!i lAH4:N=>E1E?lF5lh&$H=Va>@<Epe>be:M$mRSlkSyiRKFI%kd?9*lt@Vuk#e?<>jFP=&:%&G+yqdcY=
eN/@aD J<B*1LTWBT$58MBj@i%Sc^aA?@9SIe/R<BP>iuu&L/S*Bh=RuG9b$F*Z4pwTTmHm:9R<\RQmGFRjEM5n
tJBE%6 VwuyqS9Z9lkVT:5lQ:ttEAdmlFkW=C++C^j5Ma49I65tnuuH?@c^1IQ\5BKPCVIYFAMhKGy*h>89HQ6?
XL9ead dj4C<QVVY#1>eWaSn<>1<8<9pq8SNbqX9kub%p:/M/eRGYE/>8w1#n84LyW4Wtw5WJGTP@P&1L5*W\Xp
VJiDWS Y=G4FjwmuBabP^6JJ+II!JqRDN5ZB5YPimN/m65%YeY*i5K%M4PChQCw$u$tS%pS9KR?T+kt18Ft/6bH
1>:>pu S!GKt5YV?\B@Zq?%/!>$4RiC@hM>TP6L4>\?Z^=9$pKmk*1d$yRbPFWNNEJJBmRFpTLWK1lWJ@<qZ:uj
%MV66i !XA$?KXH@dFIM#nM*i9!i:$JDY=49=1>H^+D&DcR!NiQui@=qB+N!BbWe>L1@/EaqaFZWS916T1XY:jk
k%VE$L LmqSBc/L9ywM4IZK5AH>=cYtyIq5hEt>V4p6Ht+W/CYFVHG4q#bu1tEB@VJJVaRBBXabG%!uinc^m9&$
XKEmV* eW?eI@Hk:&yCGWKYuG58=yY#>iFkcn!1P?kFAiIj>m9%*4MiWq:61@pHTA4QAVKR=C1FlcKBPEiE9Cy*
C>aALE bjpEkEw/Z*&ckeKCY%!b*\mm%>$WCF#@cE?5:RllN#LSKZn:t<ZeHY\IJkmJuCJ4nw4hLb8\FcHlm=#9
WlNS5t ^5ecVKNDtZcQ\p$IccP>eSMLNwn#/4Aa$5$AdEVRAjRWR4yRq+J8b$*9!%/h<=*XHLpGB<=n9cGiQZBA
^lc/18 p^1RESZ<Bm#&:@Bdu6$eE#p&1yMDJ:Xa*>G@PCh%tk8paC8!u6IkL*Q&aqKW/=/u/kRYSq/*pYw*CbE>
6/EPCC D5TNphk#:&XA4nLD@THa&KwDI*LNPEcD6yaPDKqlHD41twX&LY$^^=Tk%M8C!P\Z<k8tRXL:4M=iS1a!
>I+WaX \k4D*^K<M:+lX<5epKN1nCcX$auTp$d?mb$KB:M:YYAJj!h?XKq1^+PttA/tjmleiAqL\*wNBwZ=+yPK
BGhT5/ !Q?&j6#=lI4b&C9eK%Zum/\T*G#R\A@b$8mNXTALW&^T5wVn?X#@CnR1kKbBZ#%MT\w:BJmJ1bNwa$=y
iGKRZc :/ZD9yktShmCpXcS>G^9mZ5:AjKF<BAYDP9jS=#p>4&BT>b8NE>ICPd%E5hmPYkGqnD+BAa&%WwIPw1E
BIAW/T VYIyduiGMDaGLVeQ5$TMT>FF&ycySK8k?FWhRLVqe+4F8<<Kb9MP:!THKQVaIFATV=F*lMXF1lCC%j/G
uWWTLX L9FqQ6Mldi=6XN<5Qc/M6?9Nan1%8u:u?n9HD5G?$/chTNAHc@mbqeN$wcGnC:hR%%V*FN$M+HcKji81
=j1:=l qcaQNmQc?>jZI*jSScd/6DiZbR1i$=uE4<c%qP+jRM6VWdN<iQ8*t8RuLy6>d8H$hnAqXnmZ8tVqy&bD
l!<+Pq Q$@It/*^dqmypWI5#ta==>Rb#<Wq+MFQ+Zuy55XAcMKGd/59yNh:e9BnlIpll=JPq$J^+kXIjK/4F?9q
k45QhC 5TKiY\%t:Zd</wCmZ\\:nu?&jK=*\N8VLT8dSlFD?=yq+JYB=Im+E@=PjAlpNLMK8A:#T49b?y1YjXCQ
@4V:5n N5X6KJPj^bCZa$KD+:B?Rh4mXm>V?i*41AIiHpi?^&mdcu<DHQudL5BajTpYjZK!WJQ:6RINdD>4/C6<
1%Tmub R$ltw!W&F:k+yZ8%NE!etujc\+?ap1aV>Q/6YW@M$y&4P#^E&!NI+NCwc*DZq<tIV/TWwput:EiGkbj*
j<E@q4 D^V+G\%ud9%a$R9^E$yBk^y@T*!Kyc:5e5B\Wt=uk<hS1hFQiy4!PWShTJniZMwLZ!X<#@m%TSN&/ia^
C*ke%9 l1H*+F4aX1X&ah+<u$9@FAlX!y$PyhdhJdhuh5N#iPH?y6G6KHJ^EV@AFRY@^G85X6NQ\N%NXG#ZAWT!
-A?%yX 0006f8e2870001202b4 Page 448 of binaries2.zip
NA@4dd j#a%XRAbLuK54npLja?yEBhBh#Ki$P&yDw#?W\Z=jd9?\ICycGFl\G@MdqnFtVIBH^w>W+Lja6GwV%&S
TI&aE* 4#Het/Y=ZNeD&8+e!>i+ZdCL6u$Sw1t:C1>E>Sy:GplPajB#^FXTY+GAL%NCw1/Dp9=L&ASXmM!Yt$EI
d=!Zdb k&D%/Mqi=%tyj\HSq8QLKtueSI68c^LDnaLj>#%u4ij>:p*uFGAX55@ldPbiyt@44/JHHq/JYhM&qa1i
N<H9mW CJe<#kk\JtHnKc6K!Z96S=<h@kHY4R+lm5u@kDdCicBaTtta^n#FXcA:wITND@$MhdW%^/JVh?CWSWIG
&c^ae# 4l$6k91YnlV4VXyEd%D4jBFePP%6Am/l=Dt9tBp#hTF\dj=cFhaIY:H4Rk5A<T#Yw#dqy/<yuE&jTZGm
\8:Hqi Pn/qPR5:DNmXyui5X1\kjAdyJ9VAa&k6iXFmBSk<<GZJhTa8Q?PKmWAF<%$k?9/KD*WGpcjuq#^NPn5A
5&1VhF lihj*iTlD9B^!XuiMLVk/8Q<&I$FXj*nWei?<:\B#4hcBj5GCewZ!\SLhkubYP:#1!I\pMWw/:CE/\b*
mpE/Iw Dw\84e?GNLXaX:eMS<9nM>Lkm?L1S?#%D^hFlSJp4#YP9Z^1H?@R&S\iF>MHyIF*8uGl1SkX?SGY=e9F
^^n6C5 Tm6**A6QWA=lJ5ReiX9B9mNZ:EqX!GGjnh9Sp9cAa^?caejh/Z*^*1YZVwY1QuRcVZ*+<1G\S68B1ui^
@^h^T% qKM9A%EBkp4DbMWFFSnRYqP8c>E+&bE%6&6\hpZ8d8AwtbXckXb&EAI!=bS\1SI<bCPZBMe^Xha6nAym
etI%q& DJeG8#$hYq@N:<CnZ$9m8Ni1j$5cTZ?S\9\yumDld#VBbhy!Z<!Ptc<J^DZPtw#c@jkR16*=dH^tbcZn
TN%DV* b>?$XWSWN6uGXqR9nNnYpmC$4\wpZlS=n*&NmQjb1AD:bMJqK^khpF*a+AtX*+/hV%^ZCy4?Slq%kSRt
#eW\8d n!pQlAQ1JWh6<FnqdMmIn<WR@//1S4V^n>lh*ny5C9YpFiI&<ERK6c9=lQ5jd+5:un19buiYycS+^!E:
NZpZm: Nhn$PlSEPhNn%4:aGjl!hFtL!Jc88en<kkPe?lGC%FB+cmny%Q>&p8R>M!lEXEiFK=nELTeh9Z+>LTMp
/lSP8> 6?ABq*M>:yipDip+dc=aiYKAFMn9T%^#b4c5*T4*a8ZEl^JXu8d#Ge=V?c6+nwYceX4REy\NltSce\/P
9I?bMF +45e#::/VHGPe9c+hceYb@6bWYRGi%Kc5Vt#Tya9$+XLwW#DdMwZG4&PBj8Rc:B*e!L15pmJ8Rw9JVN6
tl=!=^ %JkX1kiaqpwlu?yy6k1d5?SMjm%G8!:@y1tNAqJNnSjHtjp#>?>GMhC&HpAYJ4L%AlD8NCu4RL^hQMqp
@\MCyB 4G6w&mJu6JPd*jFn>/6*WupWdEy9MLM9:J?4bS/1>WLI:!A5cmV#4P=YID9KDq6!E%b>W\St>+jn/FEN
qDnXYl Q1j/L+lkF5dh!?PneW!Xl\^h#ZuCd/F8*SR\mLl<b8b9&>:@54c!ZR\iZB^<tq<CwPXXnAJu$9iu$>1&
AkK\bt =RwjRm/SE#aanSnyh@qB^VAHya:PM#APhV6?LjHh/P8^*lDC8:Dp?QG8aYi4FM+EVtjL8K66*DLmXi4T
4Mjq/m P\AYyuCmQ<L/?b$Dn%@^=jI#VT^lVSnSaeDHIqGyRpFNbtKClKEyNnWF9iGHYDNtZ@XGGp*96Phc#bW&
mAAYK9 89Aptm:NQd&V^LeIdTh^1HuuFK!j=^@d#BpN&RqSa91G:FpInM#+pV/e4</Y:bet4FwQ^EimTl>INVmm
KG1:<S wm+m5Vld8=Ry4tTRuDN!NEmp:n\8TA<:mkclX#V$H4TlQ/\a4#lES!+<B\?jDP/AhjX*Ci$4?K&Q:lF\
SS&N\V iCY&IYH<iFSw6<qJN+:K4yC=?%6J&e>BYRnMMkKkFZM9Zw*V$k:1X^@/eib4F:H#qQwMD6ZZY98/SEWP
HiwtGe WB!nl8CDdIkQePL4HPDj6tqZZwBX@PSj+=e6VdwI9imc\mEJFPMJqi&=nb++1b4QK?8*D&*/^q9Dn8Ba
ZDNDun Zj4Lh\81H8JW8hbkuaIZ:c&SJ%XN<@R1+RT<q!<wd4*54:A<XRlVkI%N/NKLn4pI+:1BJqIq:>>ehyCy
?m/>!C ZF$eH?aV<DNmeh+C1+ZkY@I8L!^A/%<T^$1/nIQiDXdJi/9aGWac*n<T=B5tL^DpFZ9JTh>1=<Kw5JRh
y9$qQp GQQTehZVnwVJiMLZ%:9>DCpy/9C1j%Z$I*b1=c*@*5J*49CAFb#!GZN<IwD5\!?qyePFmSFHKt$>p$dX
IY4ANd X@\/8DPN\1!M*ZeQw@FSNJ>\9!tF!I/=FjhY\VkY%RChyuCW&y?^*lHl8NIN%ljbRLZhJw+yWSShMyGm
i!8<S8 <ZGBGHkKA<E5h@ThuWnX^1:>c9D4<>IHWuaP?id$Qt=d>uFYqj/anEqQEW8@YSS<Y@!dd/NW&94EG\ni
:\kqV? dlY^$uZ!YtcPZ:i$CQ<HD@E8njc*muaq?m#i9n?IDIViiTl+6eS=Z/t5Xb<Zc\5<<N91=IY=n<yW1jlm
Qn<yNC n6:1G!QWZT%Z8pp@ENDD9a%/tIQd+bR\HK@dJS=tdm8++JFHCqM@9Q1#6HbD%NdNpE/^&PTjN#%9n?tD
>HJ<a/ F><qW\yw8S*:!@yu<dAA$CaE?WJhcLnN6*d&G4DKVWct$iJ>y&#J<4RIKjIhR!+Q^GpXPL#>^QZhAW$G
5bN=6> #mNWH?>jZCquM/dyAVCP+V@6&j1T^>X=^MMEZQwwYeRM6/W*/inNA@:5JRqGMH4NSG5NGPj!C%S4XQ4L
SQLKl= /8E!RVc+F5X%TTN#+$6\PBL9t99TSnV\B/aLB1:nCWMuTG*Y+\P$1YX=Cm^$S:kI8b+hRRnJ<P9>l#+p
Q>@kd! IcH/I&FEJjF%EHeiSd!+C<jE69FW%:<5P*>*qtQhJnGGD*q6mtS+TNSNlC=FiSQ#B+hbaQ%%FYA$j%cF
%Yu%GD >Dcawy!leGpD$h889EdJ#C8TAMSPHVI9dH&dBRp$DDq6b8:diX6%8?kj9k5ZTm+qtwA>q^Zt=>PePlSK
&@iVDZ jEAaei#e#t6e/%9G1b/9FqRi5>J6QJCp4PkABq6yMl5TCSuap*#=:A/lSHy4jFKZ#\DCM4/NaAI>uikZ
dC@n:6 J<mPA<y99!WR&#c5i/T@/yZ+c?1wb*uteAc%/yHkED&yB!qa6/?cw^=ME^ptbJBNa%nc^%!ZDpL5<Y+b
Y<p:F> #mb*N*@NDqi#QuPQQ/A9?/$MSB&^N#<1H1I&T+D%A4G<L&EN\5CA%ZHwPyb<Nh46K6AP^NqTq\yFd4kd
8MVIp% lC^m?CuF:VR9#nEcRBq#b?I:IakejKP/#5hjF86aKi4lVIwhFP%Vq<KMW=$Bpe\PV:6uiXC4BC%p6J!h
aQk4@/ V^libeAtl$m69%<Z5Gt&m&R>RJ/Kk/uE@aXjJPnhjHyyh<A8/YVaWZk9dXa\MXtV%H>^LIhG4N^&juLY
q??&?d i:N1yPmy*Bd46/M\Vn<jRA!Rqi?H^?M>bH:X\K:nE!Wm^S>D?YAJjJ6ZKAu>*ATG8?LMa#\Mt#NmZhGi
EkSw6P w#K^VEnlh%kAj$eY!wC=hpGJe9h*MTHSLES@nj6NNCp#V6JkS+FDPeHGK&cCtBKVDG4Rh%A8kW>>Q5<l
>hCN&d K>bwl&ejmdWdGLb>PZV1L@D*mI^^<49M#qZ@J6CBR\PLe8&!XNP:CGG9>1dZF4%&Sd=nuuA\X+uEt+LI
Xwt@Xq >:N6LA$<&pb&1\w1+k5GaHdTeR6cN4>nuQ/mjV1q!lRL?NFbmVM$>Ak11EH4=9@CI5GWaW$ackXy/i>5
VcPTku \V/ywl<Su%<pFDN%81/^ID<&DY&?F1CnmSB4i4lACpy\jFu5i5>YdA#LC$N+RF6%=tZ+FjB&4&^LL\$t
*CJ1bD lJpRFTSt&QRCM\=:w*wDy&ebFpKZi!WphqjMFGYBcw/HthIYCRhF8BJ\tJ!u=h:qhu9HHHly%E4wN5w*
F\y6&= !K%^LEW1uY?he@ii#Wk6LNI*%<cq>Z8YJ%Gh<l64E&jmKii<du+!/y<eP1\Qll?iSc\m$R9iwNZE+PYm
F5?jH1 Kjc\/*:5%hE4<IQVCyAm+%XH/LRkka^uc\1+:1\bc^GSeBlSk$6T#ijTQCCIVWLH\:qRe89V*idH:&4@
1BD$Zl m9><GTykW>h>LBP?TXEQ>+#X<AV9NM&wkBC%q9GkDFTA=d8WGcWn\84ZN8KZQCFAXV\4l!D<\>t8EyEP
W/ehVj W4haHlXw^tjt<%!\cASnJa^+DF5/NBBQWw*9?1t?\FJ8X%%acFG#h&*D#G4:!!FWRkb<jw=QEIVVAchG
LVmAX< QK#wFlFP$kHhkA1lFX?hn<HZXhWNiZ^VI@db/RaM*bcRbqCn#uZyX\bIe=El18^q*V$ee8Lj&\FWNLGi
APSMMd kGQ9k^VwC9!8d!m:t/\d<WKE8EpCZTBj$$kGXLWBpybT=5=!$h&WYI$+h!5HG!E$a$HQIn?FRnYXncLT
#$b&it =hC+NId/#4i6AZ>*^Vy5Q&+PbR9bCt#^8n@aA6LM&c#D1+jMARcKjk^5?LQ$R1=1&miYtu%$Z/m\C5FI
l1b+1H R6mu/A+hEZt8&5*XGpJ!yw%y+EM:X4R>SDwIi6DuM!18^!!W4cwIw<qdZlDDqnL?u<FTHd4j1<e$#TQG
RM1J@t Edtk#9uED&66d4%@#8%9J5hmJJkNHG:+J:jAFIiy=Dqic*+nXll!lG!JQ?$kpe:#H?5=k5uRmC+@l+KB
dSTSH* 48=mH@q11dItZLEy8\cu%%nD?n=wHdCS6?m5!ntNFIpE^N+dF!d:9uaj!A&8V6*pb6utJBy5MP\+WQpS
itj:?w bB^InZACe$wD<=CDw?H#j9j:tcZGGhduik?EEGT=KbR1eF&iX=kVRt<#HE#c6QaM^dm@tiJ&QJ>PA&c/
S<8I/q NyA#aXJkWV5!G\V??ywByZHWP15IX=qq8el%!*BXiMmQQ!8HTCl?Q!tWM@>bF*V4:&VSTu9Hp&\8l+:V
XS/Nt9 E%eZF?44DZRebwk8h^luLF#NlG<chNkYZ\atF18^VRXjp#@NuQ=C6EB6\um*X%n<hcZl>y^+/^e9uP&1
GiYM>y adVQe64MyAlFqimdA8hGRFVybY9$HZ1b<nBcAewntRLZ+j?V?EXN=%dPuZpCndFuFT*5Yl/?KbAQ#m!%
\5\w=R %YVq%>ST%aXu:%=SBk9:ZFM5^GNIJ$LNcDu>D6p&Z6i^c+MPFYnEFaVGqqmcVC^6S5C?pT@Sj=qiBYVn
ciZQ:y iWXk&8AemhMYX#BN=1J>aKb84El=mt8:?4w5qDFB/w1SdVlE!N$LmiRb!j\*Y@k=P9E5TH^HX18&R^::
lGdbhW C9$XaYAX>adbPeRT@*alllqZt:iWTH9a+ujmlwMQRi?PE9TLY#&/<uqq1\CHX?^?CDebtAV/=mq^5>wa
AhDPKn I9JaLajd1ceQ1NT%T<YW8&+AdKYVL!@lyn/iwTQABiq$*^yI??:<Jb@Fy6ZaCJ>yC$%@:MbYJy5J$hyw
*&FE<c RAu#me&lHS*/1CGZLJk@88MQXu1nc&n:ec<8Wn@c6T!klpC%<a9qihALdeh*%+SLb1LKkYG$Y!5c8D=8
Hd+:dy lIGWje>wujyEIEn#>?Aw!LcdCRQN4e>%SipV1\%B8&&cD$#b:pNMp+cB1P%I=La$XG&JhHME<YE<%BA8
V??!8l \AieJ&V%N*HIMS#Z\hnY?b&N8$yS1h#n%F*FB$+uj$eYpieG9%ww!Xm:5&datmiVm#@d?ylPuQ&j6I6j
%!49Kl <GDpEhkZyZym+1=QVNw%W9/Qa??tB51N+tpHCp$uhuakNi?#SWYuG8kS*@q>&Vtjb8#mL#tNFdGDhW!t
yQn9FL C^^4BWu#@CA<DLupWI<!=u/5ACpkF<^/W$kGlE8Re\<uJCa96wkQ?FWE>H+KNKt^\\5@j9m9y\huPiT?
d+:aZ9 DnR<q<N>SeZbwh@6m:4JJ<wda\pp8LA4:1JZ%!X=L4%jNE5H\Sy/a\>wR%je9?Nw<pQDiImSFMHBdhGy
-AK9l1 000bafd7b15001202b4 Page 449 of binaries2.zip
jcw?V1 &uPwiI9+W:pBka=Adj4m1^^Iem:5c54dGEXB/%JTNy$hd?4w$lIb\%C%G@IZXINC++cwX/5nV<8?pRXl
&:Yd16 Rh!N@p&anuLBayL%heXE<5<\6#+>#tcuI<>qjJZR91d9phN4Ahu#iJ@?VV+5^%PbKDE6wyDK^tEG^Bb@
ajR1uK &pNTeb1?nHt\l8I4jA!C8AHM6N/&Rwcln4N6&^X/YbP%GF!Jp<:dlSI*?R9k!&TY6k/^e/EFH6/j&q=n
5=<l6% 9H+ae5bt$Zd6hWNB/*jVlGl#^QnYICqN9EJ\W4:9h*uGd@h<KmY6\G<8P8ZyV!Cd+4+CDnE=kkGCTu/?
Se8/B& HP8S4qHYK+Pdd^LSQn9=$FtQ9P6aC&FIteId@8WQ1i9Q!$9#9t$#%u=89HD%<k?/\ESEEY:q6tp&+<@i
85DP?6 !<a@aP/FBZuZBEb:Q$d^K8+Rh9+G6<c9:^54p^1B$+\6/pc4+Tt#u1bCKD!8aCEchkLL*NIqw1ny&Z&n
V4dLp6 9jNXPa^/J!D>IwMI+h5CD5SBD*m\d:pF#nq?aJN=8W4G6PTS?SlQ=\+%BdYWu1G8CB?>Bn+/Tt%iww*e
icqKk1 \eBnW4L$y$ib&a$e:<ME=5bYn#Ie:ac!9VKl$MwWAtWR<P1jRL!kyXdVl>eBbIiSlHkd^Rk<*Vq=GGZZ
^H1WN: JGE=t:=n?eFtJQI4:V>A*kE9/IDb5F==JIupJ?Cc/eA/$ALF1@BjTGw58JuF=ML6yE:kjcQ<&PNX5pCc
W!H@Cm +4tj+GJ*JcS=jY:kalD5:TmibjI+*5EG\\>Q$FamYtNZMPZkEahe1BypuhGYWZG+uNT4t*iyqGB/lPan
*ymyyX k:a^!XNeEN$J98yi*qLntBA9ylCwyy+H*In*^BhQP?u$c#=AMJ#@<&%SR?y>?wAIwPAZ$IF8TLcmuZ*#
pkLnc& \teyWmF+e$kwjA=TBqB#E5k!e?bCt%+jj>n9FFw4545I<1FRpXGh<YIBwYhLu4\^<C/yakA^++4hiMmN
Mn6>aD Qc5ee=ua@q=@c\V:Zk8pWpYttJ>c$aD9LtSAV/WR$^:GI@54G:q:&twNL:LmL#G8LEj%Au/*e^B^AZ:F
h%yIIm cwj8p*ySFlS=9D@XY5^@81TXF#u&:8F8&itG1%V&KnQEIh##mR^l\NcN#AH6eq>lN*tkbnw%Ry1IJ1!>
VRl!Fy yj#*nim&aGXHbJ?/k:=ATP<uh<WIiGKQNhCbZtw:pH4q>C$=tN>AP\XRlMbClSH\*jZ$Pq?+KhphAWc*
$V1wm@ hdR!:RwI\F#5qEG+w!$I$M^MD#^>\qFw$5ZC^Pnkh#NIi+bC$tBc$wL#kh\GHwq$&NhBYL$cj/p!#M#h
\4GV>L IuE8&<$DTV+$AaQnQ8JEZKnZ11h**4y&eeNl+&:jIL<>8d8&%*kFVqQcHm^d^!HHWbA>ERp>Xwm#e!aX
jdRWEq $Y4Q^P8IL9Sb/m%^N8BS!j%!MleE*EZ+RlWEjSNh@wJqH?m>w1Ikt&tPEEMXGH:H*hyiDbMk*:=5y:ak
LltP%= ^ctIVPYqp&CBKi%Z:El:biwHTHhbRL>4iAb!9LWJhdt5KEcjJwDbKhTyW:wKw6Z/VW18%=:4b/FVDDNl
8aMV\T P$J/<CbXpy8$E&&:nY8a!MG5iJL>jVV^K<+ELL/uemTHiZb%\>TELw8H:4myC&*V+u#Q^\4<=TNmH4D:
^phF\e qYAu>Jb1*=!Z^^c<t=Ha1#T@cqwMu%i<R#ke#>uit8:XqW*=B8$Z>J!yEGju4=#DcJZWERSY=#D>A+#+
<#ED!= kN^?JIQi$9i9R5LwZZ&:w4L\I%Q6L#96WeibSK\d1uY4Mn$EC!jubjFHXed/L^ke#lYiF9p?h9eM\%?:
\w5LEk y!%X*q&/!eLDKQcRReTq?H^T:nlQW4jEWuEXpQbQ51??64^E*D1GnbKkebS<=a:<AT?V^TCDPtAN$XTt
hjw*?< y6je4cnAyC!\8l%:/KMWmDY+cmaBHQk4LMw#J??jbpyplHeH9XGj5LmNDNKkHQy*a>nCYmH$X:W:<=KC
PiKNCR !1K@<m8VPJMV#+DDW#j#J*AXuY/SEM>tj1FYqcWKF&NL4?Vy4Dy/J1#L!lVXW*A6&S#+qJX=+5<18NFa
h:E91E l:8I8keqw8j61pVX>B4TLF%%Fb6X+Tn+QB1=Sy&^5BPwDDYu#Tj4$4Q>il\n&ZV+C9yXAqB?M:EG/>9p
WQ!pd> bi:!Dt/S#:MdFJWj&CSGped%J*YdMX1?T@A=ADtl4*h^V9WWE8SAtdpc%nF$qkT!1\>nBRMSHd:M6S#F
4S%%Hj i8FVqqGViyG8q\$aSiZNt@RD+%5*Rw4Ai19b=aQM+GAm\**6LW^4!9%\%m!Y!Aj:VRQZ8!?P@q+?/pY!
j<<?\m 9N#y!yYSM%!<RNQ^b<1$MddNq$u\F:4nInLqp9dR9YpuRTFw9*=eIn\yt#ShGG!llpF/w8h\9=Zk4wB?
8bXkPL #=kY8Aj<4KI%WAZJi\EqVA\#V@@d>DMM6c^>jN:ejZCT@%l@Ca8AT/1<dRJ*6^pVth*?BlRV!^<#^>p:
5T@BAM $&eKE%lQe%$hRB=6RG^G6GIEyZ*bYa9>$KY/<nFqa!unRn>w6t&DE5bXVPN*LtDuN96HcBm:^^X%RFL!
@L$cIb Bk/eKRw:&Xe+KME!@IHch>/XeM&=%*%=1nG$n5j6k5a5E$YwIS5hSe@?*Dj1QHN4<M@RT+tPiV+JDWWX
LN56bw VJ5u%%>6<M!M:#VMR@+C6w^dLTnuIqB\NF%1/k%LQjItW$yN%dn^h9Nc%%jbwm&C@pm\hEbT&DQ#6\I1
ch6Vy+ G>:Rl!LdlZ8uMmdaptRlS\ZZEw!6LbHBtHwK<$C\@Z$uKESNKFpKywI!q<@>VQuu8n$bl5Ll8/T8TnZ9
tR\DtP #YX=M!VkQqHMC!qk5I&i>i:4\AF>PiY&nBWKAS41>Dmk5nRZXE<cX&L<kAwZm+tA/EDeG<la?:c>nEc:
PKY&AR >5m8Iky8t\!Bcu4%y>>@+\8+l+XwT$Xi:5?&yJ!a&*#AYln*XuX:\9?<QG4@aMTX^M#*eWReynSt?AeJ
CR>RhS XC#&bL>MPL<cKdFe6>p8\4HNGkZ6AuPQwGHhnZ9#wG:^&5VLQ9PawH&MVTNwFwV4G9S?>\:m/SH+pcme
McZNZQ +K#>SB+KwSup$4yV>:cW:PW?QAH**8lSKXqB4HX#&RB$>ewLh8P4N^EqcjSJ*yllTZ*5C?/+<j^t$$nM
by#c&/ #mme+p6nMh?&Q*aa@BNFec1eC>+b:$ic=@tb4XKbqC8DCkhaw+N<pM^Fd\KtR4wDX?QAC<6FyV<Qh$M*
&GB!F= Eq#6E8!%8u15cMX#>Fd:P\T!ZT%e?<#j6=QV&1ImK!Pe\At!\l4:mTi^t=Tw+^L4Qu4?e1E<I!L8Bnca
Q5G/Fk pMDy>4JD=4hJ^9:q>qXpCLa<lYK!nLS$cStE$w<d\EmI6K<#l>^6Rek5I>GMSHNwmmd&GNFtPmiF$8P#
<:\wYZ Bh*Ql%N*#ND4+XD\uW>b44VKjdS#d@#npFL4C6WPSqmEDPj>J<Ra/w4/TA4PNbm%T>QFZQ@^haLqBNnq
FMLEB$ GFGyGEL4PVnEkjek:K>5ue>mSeXHRJMYkj+%CI#9ZR8a<dh8Ww1H?h6Rq5%8\4SCaq$W5E!5%^CTcFFH
THpmWD w=$eAkE:m/8+%Dyk*8d%D?&IqwDZFXD=E+ihwP!LnuBqX^QM&^mq:XkWccSBFqbb=E1X>YZm4HjqY?VD
%:kaVC HNW+%ddeZT:+6Sa@JQ$<W#nJeFNX$&qBCll@nc?518Gphu*S\FpTE^Vbh/P\@a1n6bc\XcYnGLqw$#PX
c1Xc9h GGJAB#Xd6Nh+bqk\u\JqmVZq>c?Kp/4aZ!kR^JR\^\@cmc:Wm!Ln<VLWHntSNZak+K@wKDYpt%RY8k8i
ZkAMkZ +nTFD+$GXy?9=EB4^yCuK$we4$>cPAZ6$*LTwy*LAm4/j>W/m1#%LKw61&EiS!:CSWDVE<>Znkt&VbtJ
SkQ%WN nZ\w+eVG4p6VuuQk!+1W6n>ntPL!4#Y<p*!S@IDjFc:H:^58P9+w^e%Bp/+SAGA8q?>BLKD6K/R8im>y
/p$>u8 &aa>?J=!yX<h*&d!ZTuM!*mwyZ&QVCINpKu>dGF>qSXItDXbby@W6F!YqPqejJ9GmWtVb\n6c:NnwBeD
h\t@B9 9u@Ja5Fh=y6DM%/6h^4^8j>Yt?!qlj8E!!l14Iu<cpWww1VCjKmWl5eLd\lbXB5Y*=9V5YleH/11mCyn
AA9wLn >4XuwIPPLA:ZFwL19VAA6tA5CJPelb^!FFY=mVbDBBL&qBkN*9\RD:+At55&#jE1DnPHlXiK8Bm8wdT^
FeLNMF @?EeKwad*4^@K<%cK*IZQ=A<&$M:WWGTWFh6ykn%8i:<PmV1hBQ@kYKwST9ANtuyIeT^A^Mqt/DY6X:A
XI%GJR DQtp1<F!T!#=P$S<IQCd<T95/AJeAlba+/BD4NXGlqmwNHc@!#AXeha\aBtwYntc5D/Nw=AM%j%Z4&Yt
I%8:^% t8jY8h$\y+!K:Iki4*\CEBl4EJZwC=MWu@MF?1\LCE@@5RlZ%Va/>NSIpk%>61cBCt@m!6ce:@d*VpLV
T4h??! L?pY?c4Y6@e^yRiY@QPS!+h?u%B$y6Cnd:hStq>dBGB4\DpHX%cMF+q!IC%9cZymiSy@ZQLR%/Al*9Y\
Zd$+8A $>p&lLu&>WQ!@ED>i>nXM@n5?J\Jn8/GZ95yIVX$?FhI:^Vy/\%SJIklB?Jj>ZhW?#&9&@C/dqBXGi6T
>9qQV: TEG9%:n?*WFNKAEQby+LNJ$kCj=m$>m$neJ:jl9a#S/5n:mQM5V&4VdZ6qXW\<=<D/b\@kRG9kLJEG8w
$P9&P+ c5*1!a6#A$1:khVjtdMX@SIt/1FHwFyDF#=FBi$KJG4$KTV?k$nn=9n!ZP&d^*5?u9CBHwm@WE$QJyp=
a*/tdY FC&XaSI&d6aS&<G%!R584PC^CGYHtmcKNB^W/!X@lQG@*b1D&J8Z8hKYGc+++G5hZ*8lGW^h9l/qm*y=
dmcn!y >@5maX@uY4j9?L@q>@EcN?t?ie*MjiHiGt/X&^FZ:D!C8F$ki!A9y5>Z&hIW9lkec\XwD+HQ?aVXcdu?
mLXSV5 bDj+b?iGPbEMT$e*G&WZTkKN$H8HTyFJwi+lP6q^/qWm%+DpAK&Hky!CRtQ>&bD9/lPQJXBJyBw^Nbnq
1Ate4/ SJNYZLteuw6uT=RZY5lGj!J8HZ/:4PM9tqdGAJ?Xl=tE6*L!e:6%5P^@WBW%w1e=T%SW!5$I4j>#GNy\
ap^!GS MiBY1jKKH#6&k/DZY@mJL<T8\I<n1C<WTLiP=w<AHWF4CTeH!C<Vj*Dd8bBE%HE^ja&YyN@T^u/tN5>A
>PmjDX mJIhJweG!@Yn6@!+@/wMe%Kj&#a=Ie99p=J9utwmbQN*R=$+Ieb4eK?h:%S#%$N%:*GkIV><an><WZ@%
!>V#M> pG59y=NAVT8hJjTaKG*9pn@8<Ge@NQk:!yRBLFP/BLM!LCh6ICZw<L#=b1$\id9\!#dXuE=?bn\#$?:=
dwFXAF MyWZE%/D=L^9w/k*piCBW/XP?Wa>c/cIE9yFGIHK:R@i&teyK:ZTpWVCB!/y#j&\YS5TnnyH$N@CyN#6
LKWJWe bueRpepQuiJy!SVa15^&8u:!>hPqBm%VaH:GEBBQ61C?bRWM=P?e^et1FD%ntnBjW6I*PHG?!bQZ@11h
ucJml8 8SAT<hXSn\qptVEESq1qYCSlZyk#mKiQAjye&$\=qdYMFqFC?EdCK9Q:&:>PPXK1Dw$m/AjAi%XGue$p
SP6TMp d8PlDyRbX#%IQbc<R1?S&/</#QqeTRP/jXXCNjDB@8tK1H:p456*8V?+5CKRZuLB>XctiKC5u/iamCi=
V^CuH? 9BD#WLqqM<+TI?Z%D5ZZ6GutRJGBl\E4%H?u@PBN+a5L+JQbBt?9ND&y5&^QK&k%8XSJ4yKR+H$cGt*%
%HHXQa a9+G@hyK5TL=AKHnFSkd\S&y\AE9*^F>1*4FlGM=8lS=dSt1<C5ZLc:@%ty?@C1IC?bt5^b/Ny4+dyKW
89@uX^ QeC$QI>9y&el1&:H6J@6@aP+HHKN9En$qWYAHJX=L^/%@p*C=CW<B$Z>wQ==T!w<hmd+$jKl4W?C=\\Z
-An>+9 000c73f3bea001202b4 Page 450 of binaries2.zip
<ihF\! KklCS!au#h\u8RV<64dXaG$jY^G&>RHQT&9d$u1#VXmdibPKY&jCmI1yI=G8RIt^MN6d*@mY5:lcH>YB
SEcB5w *N&Z=WeP8teGC4q#>EuZ%C#mXFAwj:athZ:6D1e6F%!PYwDXIaVDaeAYAbL4iVWa?qlnuhNuWAD&NYQ8
aikPVp =cMNH@mb69@ARny==K@E@$D+*NA86G88I$4a=Fdww#Y+^8Zni/tjcCe\5l94Z4=T?AeEb?BNwPY#\b:c
I*$8?R B4MRC!8IJu+9q*@GG@<JSDp<HPd\d/?Y^RL44RTH*kYESyhjF^Q@GE5pS!&p@u+*iIkc%aSQ#tDG^dAW
ACJ1NG F^%Rp%=Na/<wBbkMW&JP@F^HKulHe$PBL6QnmHVjdbR:kSAbZF#eT<pah=CtV&8^ul=J$Kp>wPCYYa8G
5A8Zb8 eFJHeuZcY!pi$^YFDl>#@BMYNG$K#/kMMJ@Nyi6$Tl+4wSBh%aytA$<qLYwnD$S!Iem*F+X#VGM\TIQX
#V6QMR \>%tN1#e5M?HW1j:BhR9IX:uEH!?1SeuA^Ad*%GB#\KjFl/uq/$PPwkKiT?*1BRq6*k#E+IT$#M^ZD98
w8RYKP NG?n\lYB:*i$NBcNQNFJl5p#Zt\@bma=Fyqtp9np*KZ=Zi9c\aPYAY9Y>a8/FAMu^nPRLiw\I%BGu@Tw
LW+><n ta:T*RkNIQ9>\CWLK>GQX$lAd9%1Ti@YBhAt1cc1TliukjV16Zd<JEQ<c=1kV:>TdqemSt9WVQ#^wjwN
4bRIBB epll*m*mTm/Ctm1?X@=+$<#VDL:V4NEy*td1uQ>L/R+6J9i=<X&tnaG/<u#^6DLDD8Rd?a=PBRKZmuhl
*jc$MI PFFdD+AZNiM<<TN#PF66?aCXpkub&jNXNGK=G=S#/ZN6w&RKdqT+%<wP=Lnk8%bjL4jl>BGp!ptIKM!j
G&VX+c eQ::F?GkFjSV^^EuJeuDRa&Xj*6TVFEeKYCB%Q@Jj#Q$LWiM/RR=VK!jXP>ChXpn/Xe4Me4?t?mjHZj=
cnP1Y: #4bNZ&Ke+p=KltGPX>\uNi?t/lh&eMTa%#Dy&yL5*Y/6\AKT+Pcliwq&HkMTNK%n<+bDA<J/TNan6p+C
:n#/qF >&!=t@YtWEV1m*CtHYi%kb:V#\TB6+5&BVSb899LY8YTESdjulBl=?5Q%Xh8Q@L*\1%i=QK@ln%%*q<!
meGCpJ !L<6%ZW@N/pjCaMy4F#e&kw/Aq1&><GA+e6%B%^jwTWXw<$Z!HL#Vn+VY19\mj5hhHeCBn$*I1Y^WE@*
Qa$$H* ^F+n/^5#*qj5hlwtypETM%!h#%*PI:jk#mdhG8ka+kcC#QiJNqaI4c$Ymu/Hh9yKyiEHh?/tKXGKi%/G
bP6lL! +=^Q=lnebk9:m+bBE:q$BqQwpS8TYMIhMade=?EIp!@lA1ATp\5a:Z\ajLW:8?qXT?$h8TW+EnWMHt?t
:B9Q$D F\$M/Na/lJ>LhdV*+@RXMStk^>et=6K@6L4lbmuZE5^:+auhD+WBuEbA=#=I/5?:plKk%mi5Q4$h8ytN
+e\%VX I>k!mEN9Kb\p<6IZdC>H=Z#59:<8N\/N?u1?%E6/dj+54L?l?J$L+\t=^?iLa^hm\#/!&%NMG!6\=d@a
diXQ$H 5DmG\eLDNeH#dwt*MyXT<&y1GuKP@wl#K^5CeZ&H4T:wKG:SRu6=SPC\Q9Tp+!J+il4Mu>YeiEH$49:y
ltL9B* !l6Y6L4Zm1&m*6XKt$mbSe#uqZbp>8b\H?HR=#Yt/A<Du!GXdB6%!4HmYtu1?enhci6%+u:^GYN<5PNc
HqG1@: =L$:dd$p&kMC:j@QM:X^YciclukQNl?8yX:Ml:jQ4F=jmdjudN8d9D#Vi=*VI:5n$bjbeVj9R!w*Z<h:
qnRa$T ##TeZ9lD4>Mn1d*6t$6*epCudT#A/:V9>N==N?@Q48I??SqjRy4Z*VdZ*8T8$/#ju>uNN:cu4mHub%?b
yB@nQp w@ahqQ*HYipuNnFwNn?!ucPiF$Ca&/#DC&AZn1p9q?V<C+4J&RV@p+:<ytMZ$6qDc6@Nn:S4$J*NK/tE
wQTD6! %$++9S*k=p$kQ1l#@94#BGF:n>?u5aMTX/ywpLbqi=Q:QZZ$?wPjT@dpk>44=aC##$B:c<Ltq\T<6<Zp
tyYJ:< uNcLYp\&SH8&E?hNhnd#ph/?A>jXC%hE=+*Vhh4lVdnjNi9AnSP^N=P%6R*w?yj*?C:CZXaS%h/nt!lY
iHJXT8 D$:Z*w$9a?J%hL9JDtL:&#Xn#Jma5!*kFBB1%H6w9@QKtHl\@SF#V59JXh^Dj4d4AQDcl?//bp^DIAlp
1V$G?b N^QXA&Qd\Ewt9=Za?<SunK6\k*lq<?tWC4X>y\B$A>^EphKK6\GhdQ>C%ILPk685NBbnpn9Q4eq6/LuZ
yYe4e^ Q9%ADwV8&>Xu?4@6+KMJRFTdCXVWwInPb>R\kp*M&W&c1<l4*&9@Yt4jb%TZ4$9TC*VB#5>auQFH:>MJ
LwZDB& K6tDL\<F#b?El%:W&cL4c4Id<QDSX<Ztk*y</^i&RFF%q8\AdV>=^jVGh@+FCXhkQ#?<!&i&F\a6VpbP
p9FMMB PEZCne&GbDJEJ?HkhW$KELa>F%ZwK8+1:pY=jtW<LP+1p9w4XnJpL:Z41KkdV<=k9@DKBPwt?<4pN1m#
am/by# 6\8u#Y/K^VcRC#jeR:cDmZA?mweV+TbRRE8Lel%#/:Y*Qb?iA@BpR<DybH\b&LI>t=\9Yp^#Vl9w&61t
EBAB4L Qb6Je4a>q%lADPLp^T\bqP1E:8VBbd!B5I$>8+/kH*\$yjQ?N/pnR>#pYFISa4&HdMFhScj6TbkDZTZD
@t\hlR &>mM%>FhSb%MeFlT<&qwb5LtP&qIQdetqJN*jqyDMV8%qDMw?&qj8/aPcZBF>u6twu:65<6FIAhGA$WS
$I8GJF uuJ\nI>y:n4#\%*>9Xk>YCS5j5jRWXFh@d=!8&hj**H@M@\WhZL%T>yB/M!uJ?69eSX^p=%hS+??<8cb
H8=?YY BhHmlDPd:A\j#1iZuJ^Nl59B:5Z5uJ^*p\Mm+dHbl6!%tW*w^BC^&S#!@Iyi*9u<Qn<Bu*q><^>jBQ>Q
$E^=Dy ?Fp6wH?qq\yX?AiMj<lLNte8k9SKeyjY=4t%*+p8kqFwV$P!&N8TCm6m<GV*GWQAn$<YlcCmwlNDTbba
98a:Sj $IPTbA!mY4CDIiHE$y?MpAk%8M$cK9JpR>p9PR?AhlQaJ61FWAkT^eR1bE+4bHNPR<5BBCidnIt=G/RX
6LY@KQ $b=h^*pDk4QKSBWSdwKphjdu!6yu+5ipwuwtR=*6JKWYFIwkWQa=tT*5J#6%=pPRKSPn\jRuBJ%6pepI
c@Fd%d 6^RQZytLl!kuB:KG+N4dm^#wJKIY5W#PJyn%TV#y#?ppmcW/BaLC+e:DpNJ/5RDC!YGm#lISuXJh?>/A
u^\cA= WEX6*ikTLJu=NGjl99a<h5dE<IFAJ4i*6pZS&HMG4=t<G#?^W>Ee=P*Z^4$RVu1*IF4AjH8!uaTjKEES
F^R&N* lELIMDc1h\HDQy6eEyYwjZ9/>y8kIj\w<lD<k%<#\JQ<*D$?pFlQ:wFk>TT/CI!M@Pd&k=l9!T<WJW=W
dX?tk: G>ZQR>n6P8pytclVD<\Yt\$j!W!5F^+@QSnF$Nq?L+A!&YRd!WJe1qP1p/tIVy#?uC&IjtE@Hiwj!8HQ
yL/Am> IZV@#jjI>lPX@bT&JFhS^H^YCiGY4LcpXHAc!n<W8kpEw&A/u+ecyGEPKkV6RtJbRBb@:c:tehk9=yQA
S$>Lt% >6I6+<wuF#FA49j^@ReP@^*kCA?M<pPw>maDWdGGaJlR>kDCPQ5R?65+aYi<C\j*mtmtN+X*cWX$RSKi
DNYp%c M9QIR@TL$WV@%p!E^Q!RA?%6EKeASP!b#u#P+j#AjB4K*VFFdmb#D^*qlDb1*PH@5J?<\:n@bc9@*Z5W
bmP6+$ VR^j$GXPK=y#wD&dD+dRbw^B$a$85kelkbdwJIWPQhn9LpcF\#bC$uitQceqJ<jYNtlQK+KC*y8Rni+1
8\WSWP ^yW*5I@QGpk&Z%C+\RuNCy@Rb5<1aln9^EKBtyLYJkI#PS9w*>/uE#*R&aj?\&=CAKFNlw\CD@BpD?:l
Qe8Ijd qAQGJ69?q:SmSDAXucR$mik?RQR?jRR=GNy4d!DNPRCcH>5RE=SKNGcRDciILlCiTqTl>G#BNlwdHny$
EbMle^ H?AB*IQ!cII6mXwWtymaXTS1WEJpH=$9G$N?Nkm*VVYjZCb5Fpl9MpIP+M@BF6#LC5GtN!EnDGIVDmbe
>Ymdy% WEVNH>^QF8l8S%*@!un@4uCkQNkQY\>mp@k*P@RGjK6#Q$Z5M>EAl:m6J*H?IHGy$Xm!d:p:CDSdRMVi
ZmEYL= k4iGZ/kjWuy@+mG$GCyeD:cpaSCIApD$pey?klicT9BA*kVqeYnP\W*MC%FWb^EV4u*pdPHRtikjZ$5+
/&KJyC PNBQMJ9Qq&BJ5?5Qky/QZR<ER^mpy<EXR5&ui!wMF\PESVHS$p1^tbQ6FXEPT@?XBbRkEQll5mFQblM!
6YHl1t /EW+Npqt+Z<F\^MRB?FPd#/Iqt^Clp&jDFl\h8CW#>?iQ^h%VncB?5eeSSILeP$AWc?p6WP&c9y#19um
RaQ1<4 =&/JWJ&FGQwDSWYW<Aq/uGmtGAbK4EGtWkaHV5bZdihpP$E+P6ATYpBWy/#PMDJFI\HkF5IkD?TPRqRS
D$!d^w 44%9?$8ZZXTBq9d=/Tj5<6t*#?!@\yj?BGM5@jdi@FpELSbn?PABGCCceV?6tJMH5GB*D8ZbdmeINS>C
Yu$F/& Wi#?a*j:j*^MI+B#mNmp+e=Clmtu/NPeDSmw\NK&:CS&#/L:8m+Wp5*b$*M49ub<<j@d/HMkqEww@\$S
6n5#Lm GcWCpimBdk+bGTi#Cc+pQKFC$Z#R?iPH+IhW^H^^D?BKF6V?<Y^Kt:p>!J65J<QBjmeYEA4ZR!EypB:e
$j:#Jb A^\EHiFyBLWL^?<ttqYIH@4\yZX=cN?jlwk#>=PKbQiQd1B>Ta?k9?#K5wGDB\VI5Sp@HH+&D*:!w4=>
b/>?WY /h=i?$+Qj6+HD^Kn&>6HKRiTLRVnDTkQDIapHPDkAKIG=DDp=<JW=&?iV<ClSDAC/RA=1*H:!XCuWwBA
+WM^qH #:</4^mDM!/PREa$Z\AJ6+*LXJ\@GS8jZPSyGERjd+yN*$M=RWI=V<ZBT>e&T5D8uI#NB5enLbBDT=mG
P^HHLp b5/ejBMAG+=pESyhJNB9tFaCjY8Lel%eTEabA?mpB\lCDZRX6e>G*h4XIlW!y1hFA*bjQVkkHJPQltH+
9Ga\>n F9htu@4a/e$I==Mjb:K!Wj9VRN$ptbQNAA9ZQ/6jjn@8>AaR%?u/i$V@T64\eJGp+8P=eFb^8$W\\@\\
lih@\e qKR$i*wP^F//AT$=&hlpZ1E5jbCD#K:\Edc$NqMMML$C&Va=TlyT6#C&pD5@IGw?l=^\INtA<4GHAc!p
TWXHui Z%CBuHI@mHIRTj<St^%^<:tQ$hcAnIlPLH^C\H?C4RnCwD>bj^=L$hqMaIV9BK$waq!eMYq#\Y>&?eNH
CwVCSF 4?&@\u5\FRSKQDpbK6VCkYFcKj/4dl1TYKE$a&JmpKBi\l#icQT@K6QI>?u\*@b#H!GKqJ!GCweWBCZX
5&QkC\ #m!1WF!CVDq\TA56lIa6$J/eLAyZZLL>4wnjJ\=ZSI8m?$tG4b<<jKd6nM&M*C+lLwm/\N\PtB?WbwQj
HT>TmI yyIG\$I=MAmmplAdRCb<VA/m*QPWy/QA$td1ZWZAyk?Wtk^ELHXw#*tM+cCWyD@i!nwnRGcAQY>QR+S\
jWTZ$h ^EV=n86@Dkd5FuFISVKt\ZXD9upY!bu=p&HSD\kXKm16w!D=jb5lJ<N\?/Y%piF#<?e8BqE!Jn8E:j%5
88u^dM 9@4=ji&89!X=IX=<?CGCiPFHBKeXmc$PQj48>IX>j@ec*iMD#ZWXTlypqXBP!ShBlQ+4AeDCIYV@TSdc
5L1Vyt @m+4twy!dykMNq^Sq%q@9=A=WNC@Z>mjuI\el6><WJ5a44%+?FAWDw5pGCA5WASDD=kjwwLTbTwRDmXe
^#>mEb MNmVnS+TNRmFRMAtw!X!wBP%qZa&^RqXTM+GPLlJWkAm&TuVHRIXmmpH5wLECbtD/Qj$B>JNl4GbdaGV

-A>BKh 0005b25bc79001202b4 Page 451 of binaries2.zip
a\cI%& CcYC$EwAE5Kk?X9$hKLJF5LTknER#8&CD9>+!J*^MRAKJ:/AFkaiPVp=9#>bWmA=GMIBG<qeIBpdJS4:
F&XRuC u=V/q+tE\DceaDRbGhpRCDTRGSE6VmkiPWBWCYW@YS?WFmK/ZbL^AEtj*u#BkEkm%BAiSaGIV5I?B5^<
48^hdu k6=VbqT?HdCklIWF6EWPeAC#u&B#S#LDCaYHFn/umlCN/X<\ID^AST*GhjcQwaLnKwFne\/mQbeEyS?E
=KjHHM K+1RJDd/l\VKCREWBey?@Rp&qAkw6CI1/FCDIE=JSh$ayBHw8SKA1KL<$L&j^5PZAwYw@duj%d8El@%A
^#iL#K i#BAwA#=@jdN6\JKwH@kuJibqwE!tk4I@DQl@B<#mMd4^:@>Y%yI6JRLtHBDER5Kb+!QlLPNVGmW%$uQ
FS!pqa QkJB>n=Eh*/tnkkw:<X:nBHA^<@/eSjjN:NQ\nkL$Ye@dkiDjqdj+jV+mZG!eGTW<?qBu6wGw?hklh4<
Z\p<nn \eND>Mu@bJWpe^yekdRktk>cXlFapWSw59:$jKFmBLB@GLbA6m&e>n>C$p&DAwWN%W5nYLkLqQIuQQmp
%^R@=b \!anAkYcmhqKA/d>J:4$\!C$CWpm:Pjd#YjCB:1/HWCTwCQ+$$&SAYGw<Dmh@EhRm8A@mK6ZZ:/:d&@i
%+PKi@ En?dV^><ip*@\6*Q@/V@b:@bpjejd1pkLQQkpSHCkTBSSaQp@Aq6JkR!FFCEcDALBwmawW=&VwZ$anJ5
heXuVX WGl^?BGRyQAFlH>1pR$1TBlm@^>hBaFl5jj@$*9JcRn+MTlIkRbBak/H:PuRi>GHph4TVmnS?Wul^GV@
#M@i=b IEAumymhZCk\FBH?n@pq/RH8ApFVnKHa*P&DCpntn$HDcWWT>6H$p^GT#5Xq+p^wH9SI?RNaSGDm?wRL
eGh%yK TLbp8AIw$JCwYPL$ReIlXALF9jDIke#/nGqIlaV>YG#\R@V*B@?ENSG$QVESFbT5wyJ#wCRbtESWXKBm
wi%>!* 8EARtKm<6FT+w9@AMBbn#CE6tAZ6AX!:JJwBFdRpXHAJelCW6EC!CZT+IqIIet/B@d<9Y6ANV!5BCAj>
#lY&\4 w#TwGXRpRWQD@TBBNLHEbA5Jj!^?e$\$C%wej!V>?TLKkiJmLB/W<Hn@YPRTZHbSiG#/+BIwW5IyNtka
Ku=Rh* LAEw&SlelVR+CHk!dGL/RSI\E<wliKRkCWHF^CSI\jAJ=mB^i9%+kZT^atA!CMX@B+4@jLIDyTKwPGM+
8&R8S# aR\==YBmNEBWIbR\8y>jFB+mY^Rqlk!LBC#+*%IKH\AVBaZ=X:#EFdAk!LEWwTc$/hPV$@u#=@\ZwCdw
dL8iIR C^tVDaAB\aL!AqmpqBNRA\D:^&FeKMb@mqA1FA=LAJe^BBRiJ?CjlC>WTE/Dmk?AWwRPTN:GI6^TAAtp
5kbG\i N/D$D\L?X/YJSBZI5NHT$\Gnm1laJwPaTMZIkjTE>Q4#lRLJ!Td$@jy5WANk\RX\RQECAGFPJbRD^Sk5
jFBM1= 6GAmMFEpl\+a^mBJkS#CSdklGMa>mXDFj!u<ehajRLtQ#k<TAInGDJhkw@n9?@hnCTRDR5Hc?RMEp\JJ
GPTX5a BCPEVbAB+a#S&KRReh>yJ+^B:PF\WA4?54/#n<FpR/I^?Qiw<h>KK%n<RhCm&kwqR@@pGnFdMhqR+D>8
R=AH65 4RIPBwkmTjl@/cZVy^XSD64yMjyi:R$G<dj4?^VAwJuQBRK>t!EHu$PEmTKbM$aD^L1lTHGCk/Tb$!Yh
@RRFd9 mWLlwEZS<mQtKcMyp@Wbk+DT5NLAeEc%MW8\tWQIpN8FBXHmJappJdWF+TGkpHLISwAeJJukm9HSLQ!:
!J<@th AjcDlpq\TQwKRSC&$qD#6Cnl#GuRDtDJRSD@Jp5^Zy\^ItC+j^/KKELa:B?icJHVm+ADKL$XpwNS>9?N
ywhN6Y F4a*ZZH\8WBRIJ1FGK+yYLw=KTBYWmyCXD<aSSGe5N@ptG^M%DA=DR+FnS\K4kVIBJjSH+w^Dj#eA$#$
?Z!Qp8 y=GQ&SR@tS\J<E+9CpjEcXSeAIepdNByCLY@K:hkV++NS<=&Ft>HGE&L:D>+:VeMES@eHaJEhjj6#djG
aZF#yi J^dQRYW@R$w&^CEACJapnEE!\VWaJQ&*^kIk+e+GpqFRC<Lb+kZcCjhM?1eIy+kySJH5+?$JF#GlISS/
51cA!p A\L%VbAH=Spa\QVl@t%Ek=AGthP*!dEq&W4wyZuI\bI6SQjlBQjc!RcB/Th:?V@F+p&IP8kH>bTP@dIQ
c9kP4! wMFEHiPLCe!!?aGA9Fp+&SFhaeFwPQDj@aG&+j%bkKkIRPAJ?+G&?!9:M#Mm\6*MXITbmMimHiGKTZw/
uddABj 86^AIitL%qa</%$m$=dNHDctP>Qjumi^=etb$5TW\FAyWC&^k9E^G^9q:85IYQ*wuTJdV=Eji8la9IH8
NT>cIX k!&*S9Q&h\S/K*C!w@dBhYc:VL%?P^wZjeY5E:dhYHlY$Z1*QEnhF8\H#?I4>>FJtQnnFw\:?=p\XBe$
^Ga9Pa !&IT$wWL<M^&/N^uYBR+YIjXdZ:qBXS^w5nWP5=4^8Z9%!N\8AYal\Yp%d#Ew?&eV+jTlH*E*^T^M?6+
RHJ\/@ \6ZI@P%uwWE/B=@4WX/=+n1iQuI>S@ml&MbCRQ<nm$DKp5p4y$L8V!eL@kY*m1?&Q%V<Mpw!<:Q%Qmbe
?RW695 %CDK>B#>ZX#R^:5DG+P$V!?SQdQnaldcJFde^aqA$<Wn!$hV^D1HbMM^1#uJG@mLDQa^SCtb!ppK8Q#V
K@AmSm /=Ahh\WG=iLXP/DT1V?&QHX?wF!EZJG9l<b5>1$m&1QXYFKqIqHKL\%lYtpNw\N?NT1tcPSmbPIVY1wP
dj$c\9 dF#Ci/=RJ@6mSXcAKuRXh/h>bME4BeY5585D+qb1:>t\4He!y:q:w>&ZV\p9Z&\QEyk$1BXycd:MHH+w
J9Aq8@ &:pV6P$L5CWD<C5#WDeVA$ZWkJFd@Smd11LweNQ<PYI>?C5%S<9wNq$LY?=&y*!DD=Q+kh9L5dCM*K6!
8Ph:>R j8VuM5eCFhWiDcYImTVm<1&uIY<V^:Ad>ama:XLl>KVIb!B5meTDe5SX^q9iL:\+mcRIppQ&ncBC=wPX
k<Nql+ Q6Y\HMAcRP^Ht:L6Z\N!%uZYaKtjMLH6WSS&>4SLPl%Y/lKd=$d/K9Q\NRcaPRXkKXHFW\b/nPJ9q^4h
>/#4<B k*l+?@j!?^J/V5VkQth=9@B^paB?^PZF+>$l@wGS?4pGy%<uiKj&XA:4yYacYdhF>tKlyMATh=ZMFYMi
>@YbC^ <mi^ip86%1ED6i6j$/YTV#I&QCHjL=@J6i6SjVe9%^b<8G6L#FamK14PILwJ*>&AE@wWP1h%E&6@h$1K
K&8AlG e8#649L1K\&jNH+Sc4eu$\9HM+/Ft4mnjw1E6L:!i\LT&L6Sj!&1audl9i<K#me*Kj5DyjKA+?C#JjW=
C?w\bp qB!Q?hhQWy/XIqKXYmIhGk//YPZZT>u?W#eNTCnB&NJk\!BuIBn^C&K:LQwFiBhAEAN!9Ty\K\\wd<DD
Fhmeqp KqMw4l*wD*GY\1WY69kW@ZKc!!YV&Ny#<X=D@kibHBk\+R=M=R<c=F+\\JWPhpby?dy&ebAW^blBDJSb
AhV/Fd =aHnqGlJFX$ih=1%bZpEC#VVkt5a*:wWkl\*:1:lhe*d&9mRCjG<b%>HyPP%&k8ZTZ<!AT=K/Z%1XPJl
b&6Wcm CRd*=JR96BMm=!9%N*$DZZQ9*@Dw+J>n\?Ij5JuXAYAP!NhMXw:SVV41AkIeqd5J@S6Y1w#/KetA%9!L
H@aQw* JZM!$b$#5>dDh?Q+YhKQ1m=EeVMVTFZ9D=Rn8d#D#/kV>Hbh$uB$cSuH:>/K8=GK/Q/L:8E!cC%h8m<Q
/AL1a$ i#^t>*w%+llqGMHd1WRb=eMBSMmqYLjmZM6e1@@qV9@e/9?+<n@>Za^:qZ9=9^\$lZ9%MhcnnnP?um<:
>X:X6^ ^6lthF%Sd+hX=>RYqXj5!%Pi!=%YNN?w:<b+A4@H8h@DlHDSCEy!JB/#dmTW6<=mY!w^a\/%R%CXGyR4
LD6+?w wYTBShAKJ::WW@DLch+cd6dQtGcPQ?5^*eVEeXwibPP5Wwn&$ZwBL@hm*TBbaHt:j%R<8:*1bKNN!$9:
\$DGJ! BDma#8VBE!6PY!6YeZT=+Eq==9htQBb#:ZI*<?kE>K5:Pim\YhM//14JMeT4RHjGPcGE*4*&Z>La<ak:
JL=$AQ S=@b:/j?ZbX/quSNdP9\+eCRR85cL4MKMiPcN&<q4AXuZM@N:pj8S@A$wA=h>u\nu%NS6AWCM#FGI?%X
MeJpap 8=5SZ#cqTNWpMDjZ\aMutpyi<dL4RWY&Cetc^i/heF8dP^l:MGlc%cNZjPbdA:6jBR6Q88ZW5AeQ!N%H
F9jMe5 LJESFeV&%Ky%eblpVaJR*:hwKcH:BKJ:PBijNiaG9XP^+wmH/$^KtJ<4&>n/uDdN#61uiW+n=yFYGP>?
Gcl/B^ DKZa%IuyLc??4Z^k:CpVw@T=NlaP#J%d<F:F86J#I<&E6DHjq>ZmmW%cQk%m4l=%5b#In=?58@=bB=tn
w9wHY? WE$ZG84&=RDL9=pBRHZV9Y5WKh=:Nw%9KF:iS+p8PSR@cJRn/%/lKd\IC>*eu:8bmCk1+<RlV=MiZy!!
kHN&6X 5R$QPlV%V*4t<R*$9tZ5=p^dniy%XWkh?>**TcQJ\ZS%ZE46RQyt^PhG+te$1#mqcFRJJDeeAc?t@jV:
uhRE:$ T9&w5i<Q@RuDcDInXGj#JZWkun:Q$HA6TTmI4mHwt?DTa%<G?PYTB$:e4j*R6D<M=9k@qdIq4ic=HpK8
J&!Xy# ZbG@4ce1?FA%kRuPhu=9MctBK#hiCHPi4M%u?P4kcJFb+RZ8+Bd4LtwC>%:AKE%Vk$Yi>pQSpmi#QAAt
dm4NiB Min\yP$Xj+dkX^keIX@8nX+wLGH@CA<e*69F$PLDEK1J51<N>PmYXS6Y&+QNTbchTMywPIEI<\VLqi4^
upwbJX l9!F@!1?/IaK$4R=ckCQmPp>QXPq=cd%HEY8H9kyml>HElaMkC^DTXZ9<><8NYjt1?:PMhPcytlmj6\L
6K*NZq uJ%DJi*IS?>+P8uK^XN?qJM$K!Xdwua?u<n/iGA&:46+a6lh9tV5cVKwqM:#wKI&9C4tGSXuAGyqRCGj
D9dHDZ j$$K9Hl6XCTcLhCPBc<4?aGtTTQ$jE=TpN<9L%Kte:hw&:c9Sh1PySck&EuWDLiA@@WQqVEDeR99qmwK
M%/@bt tqal>H+YZPV8bimC48Mt/TXhTDQ9Hw5Y5+Mu/RH91=<?YG1q9A#dIpDNE5A&GhkqjKmPPIH1y1\9mYTd
dRTW#I dk@&n\q?aRNLj4:6JEiXXeS?+u*!<+$NK*A99m<Wp1wi=FQG&=jSdYZ5BE<@JepJ=pWp*dKFK18kBH?P
RATuj^ d$Tni\@@#nQIq$8Tj$A=cBT#d%EZQCN&%S9QTu\^yZD!Wh!M\w@/5ceE&Kbkmn/EKn=W#FaPCuWLnNdA
ClAiwC \@GTLJwDX^=<:SJ=WuuXB*bNji$EkEJ5*n>WF=nCHWj1hDiHG\WS9M!t$yRMbq$dWbF4qu&i<ai<cS<@
cbEc<u Y#d\8X#$$VMFFwL&J!*Znh9/eaw!jm>4w1bPHZHDPR^^nD8Ml/$<te5aBcYee4pZnX^?+RwSXu/4I*d<
K+Cqpq jIM:@ZlK@L@8DET%p*?ncwV^XbwAX5P<&qy\RNMpw*9I\%!/5Lbb<=e?TlbR4lH4Biun?hG@yTYe6<eK
Dp6=Wj &$hkVhj^+pK*mhS=&BN6AG$q?wG^b18nnI?d:eN>A5*mNNM1EpJRKBNDwP<T<ZT*$#npRVE9ajq4ZtIF
D:Ii$% BEKV$1BWeiey<LjQY>L:FalwNiwN:iQLD8IKLq8R:aSt:jhX84c^V>aiwAEJ/CMVbc</$kV*KTpeVS^G
Gh9PDm SX:6Nen+QWuMc6mm=XdyM^Lp9Ju^ppWtcyPDyijAip@:#&SbFaMLbhI:lTBmB6plVb%5Gjn*4=wiHN1y
Y!BXj4 bJt!M^Fj>q$8ZiRhq^dwuZ!<Rdq<Wau^iI:S94*=&!P^jPAuLd4ajQS<%u!G$Ne>9y@Fi581hn4K>nFi
-AimC$ 000ac0910c3001202b4 Page 452 of binaries2.zip
Eu@<Xi 4p?c8<lT@*uhChFK+9MQa*+Z595dtQ+5p!MItEtAVk4c$HYtkaQHJd8X<ISj:eiD%+P9hpej+hy:E\>p
@*GX8< Pk>bja<wNaWd?e//LeHM!Y*TFhjPA&$w>y@ne#hl/VR!Nw@*:GRI?Xutm*4NhDQM9?eaSMp:Hut%qbP5
DISLdt H*:+KN@c*$N4RK$EPhNub/5pN\InuwynSML9Ybw+qL\aCpAD#L<4^Mm>m#MXt?=p46wK\^D*D?Ia6nid
/@/T?% #@1?S*?F>5S++H1cmWlhTV\%:lw#F?QY>PmYi4*iV!Cb!6LE4IC6V:+/y1*Hj?p!$M4>&b85bHpm&ya>
TNAlnG ?j@hNiQ@Pke1?E@4R!LWtVMq%Hp6?%>6#qVPhBR/W$w+6hnSJ1#+E#>XaJqdch9^tm#J?G^>Ijp$&Twa
#+G^W? ih#F+Vn#5bn^%!JM%E9KR9u?D=IbWJY@Ai?$GuYC>i#Q<nXp6!BHYdKC/#S^<=++hZ+A!!F1+94%tL%L
bD!*LJ BZ%E:DtWPYLGK6DZuTY>HEjG!WyF@YyL%:LtFq4RC+ia!q*Adn8WJ^b8mwQWR6W>\hT8TtRlFME5Eqy9
mKq@L! 8J@%&ZK=!kdeYMRwPmPW5YMV1DNJ=w8q>DPR4%C>a!k+68t:BZLab*K:#CLQt>1can+w/Kl+4S4YhZK#
BLmBIc %&j/ARNl<e\1=9QMt8\16jlJHApSd+k!e4VI#<eblNkCRHHc<SEylJCAkuDaLKl&pYkS1!qepdWL?$kP
RMAAJc 1GiXCN%\RB@=ttLBkGiNZZwEb=N8Nb?=?4FlnZ#a!RhE%$1tya:FG@#X!JVX4:*CmcX?\wKLpG#wV4$*
Ip6>@K XPm9H^K+h6>L^F=aILVCemC4\hXd$DI1!<qb/N<5%Bn58S!jy5n8#ydy8+5:%>WeXT4NC$WHaiap5>N*
:A*cbd En9eD+b^/mIE?%$GEEMlbbN$e>>$hpDuMnwNc#>MjwlRT^W$VpHpKM1e6Li6S+b@ySX5@t8aj<HIEZ^t
:\iK^! TDla>?IMiV!CnS/9!ducni%aALMPWGmSq4NR44F*y*y:4G^e<imw+Vc=wb@itjkM<C?GBh>Vab=dwBLI
*<Ftj? <Vk99yVFIEGTEkJPbK#F^XXLEmXG<YwR%W911<wk@wmaJaR<kpa4iE:ZDS*>:!=Hl6t?<aWhLd\lWaYE
njuV=M SeNR4XZV=NiL>:^SuV#E1T5h9h@pNM&8Md+*4e!^FqcJEuKDSnDXM%F@#e#Sq+^$nCE1tDaicMIpW@$S
KCKBj# c+dFTV>LVaAnuyp6pIup^mqD1R5<5E?9Y1lVhtGLBYj$QP:e<\tQC+VHbT\#R!jSjFSuJ%mY1ES%k8cd
CM4&tA wWSW+/\HRFK9eCCe/@6A#IZ%eD#nS9j&byajSJQVHHc8ZSWH8Hu$GX&Iy?I=YHDWj?F=j+hEVMKqit?+
kKMCtk jkVhdFKudhLjRtH>u4&9yJPc9=kZ5MaqCYlYQ6<*\\J:Ei5Tj685dV6DjQiR/c+Iy6paj+&Y+pcB#k/@
d5cc:W YB!YD5$nV*pq>$cSQ?RJ8W4G#IuFYkCjS?nV4^l$:HF=atS:QmKbB?cZ?FBH++Hh%SJYWai+I*%B>*=?
TP*uXh +4c@wj5CdeYj&y&IcEdHYiAwJ*MQeLW^@8#^Q*Tq%\cpApuZjEb1LiR*pFM+5G/eRA1XCQ#84nuq<@aN
A:=G#L tKq!CA6EYcP!%H@+$#jKyQ:/4j^B+$H+18w89i?9m>EXSmc<hLTY*J5NdT1THlVVW<?*!XcTY6Kc1HH/
DWE?:< /&X*9%>#JV\eNLZD=19ilW?5eV1w=anmXm5ZD<YTw?nC4I/Xw5p!aFp&JQXwui4&B/AYy1Fc#<L4:^^*
Ib&9&Z yhb1^ZqZAhAAX@YP/CXeX:IClVD4!uQ*nMBH%1INPL9%m+8?/*$#Tl$aYKX5$#+ke<8W1XFGR*PnV@ej
@Q?T#u Sd\q\Yu/H@cuwu>V?#NH:4e8J%q+uYWS@?+FZqDd*y@cjbD$kGJ\@a+c$qbmahZ$6^PF>E/4%StSl$A>
nut$Kp klVJAJXC+E*cdeKDFGtkRhVuR\4JZIJ=Xdk=!?$pL/iw#HReH^@Z8?t#9SCe?Yl56#wb8$H&Zhy5I%!@
uqTI4H II>H8tnJ9htyG>#8\mL$bZS4TY1#1^qB&hX1m\^!SI\MD66$MMuq/n+VBcLKAT:CdwD1wR6TLiS89q<y
/qRlW* CeZy%EJ#G4I5*PANhNK#iYRpbmCPkdNyTICP1M\Jnt+<XPRjNly!mI$e8+IZ/Ti/YykSeH&>aNbN:&1L
adNPNL TZtYeJ?i8Aj$eL66IyDm?dt?^PKyFG=u/t?j&ucY5q#KF>6DB\BybD4VXRJGSjBICG1Y!!dk/ye>wqHC
PJyLnZ mMCCNIVtKQSe*@>yE&jS&?wb@n4P6Z59i1Dpt*:Y4R9VPuhLW!!#%JXH@a@ek$DqNE>9jkN=aj:Zalak
wRQDu4 PKJ4lh/>bZAIt4=^Ya:%Zmtlj5j^&^H^m?kFM9R8@QtSu&>h!&!W+aHWEXdX4HKQDmQ/uuP^Xu^TP@qJ
H#wqQ: D5p*iP?RaPBycd8BhZy=Xht9cdSbyMw5pumjya/e&cDBKSFjwA=jSl>:6Cmk<GcD6hmX+MK*$*l=c#cI
iSE$GF *FNhE<=y6c*4Zqhyw@KXtk4Z8Zj!EA$WP!&tJylZIEuPM8eG$dbiKYhDawuaHd6cXC:TM6*QhB<R5Yl<
CQB:HS M:lXc$$n1wwIK%ui/Ka^Y8S^9iqWQi8wy/EaS^uhZAZaVhBIJ!?mh*J$i^Zy<SWqEDdBncV&=AY*@GHi
w*Z@!b >%$+>6KpEn*b5H6FWXEEIp%8Nq6qp8E9Gn$Z!Ll9<N@P<K9R9bEN@H$EEElRpYaL9Y5B4Te+\!8/IjAp
C4lyDj m>B%8DYJ:#eSy+>HDjKdhXtZj#PZ$F:qVyuClw&iE/?QZhF#M6Pw&mwJtN>n+*VNcVJ5Zm>DG8$MJdmM
q\Ie&I !!G?eW^Cc9ewMuyZp9i\=95&Z/b:&lZmZuh4LN=!=yqJMXja>#lN*SpN+5NQR9eIQpqTbK\WV?/8SwVC
>Fi*>P $1<VCNijuhnt#DR%5Nm86LB4n@PL^jd^<W%1W?deH1lY++4M#%=p6SH/T$+\XnWK1nCc/qIeRL^V8Twm
nNCJ%l KkSI^ZV@uuj\&Ywe&P^F8Sj\dH#>nR$a!SmTd^Z>81PmcZ&P9Mm+R1!dl#Eh=ali=5b4?Xuqmbip&\<p
u=K6\< wmV%/+CnCN<9w4CD1ICM/S>jyLFIac+ljc>lSPyYadGYNTeq?RXuqZHkN86V%yW\a\*k@a5Fn+HV/>S+
\#L@^$ >^Zb&mXt$=t=qTJPeTaQ&FRM5AKqA8/\?Pq4MeuPcniVlyW1bEd5:ZAn6>a\MPXlDX@qtS%AtX\aeduF
4XRIZ% ZnmNt8y8auAXP>R&GmJ^/1<jVipuSMlCm+b<h\*h:cDRi<KCJJmM/G!MwX&=kWu\La:>ilCp!M+dt\W>
ebRw/w !EeY*Ii&IDlM+E8E&!XJDnL>WA+:dm@Vb/=V4mWm#^VSjVVDW!QE1*?%wk=%?D*VRIAwj>SGuZJEck>D
a\lkym e#biWZFMXQZTi*y5PhX1Xae/RSqTJWQZlwWCT!E9M?&Q4VahqBSR6K=?Smj$5#u*m4u>pK9Dd%BQ6=#y
&W>hEK J1qQbw!HZjSJRZ$e9bZXih>\h6IjD/NSI%9kjZwR:EG/S#Ky6^DcGDbD&==<M#jypC=eAYtiNB6<#y:>
i$jy#l yLe^?buY+u%c\%4KFZ$Nc#^dVQGZ96</wi?Bli?FH!VklK*A@n\mML#Ln6YF%iiC69J<cV9:/ibLmZl@
Tn@d$D /tJTj@95?F\&tiWnY1RN5@N#>e8IJTMM>CtHQuwtY4RiGa55D#J9lh<#yX/QyC*W!pP&nYiXRtu=$RP8
GnF+hF BINL&5@nq=pDu\<eVM@TcuHWmqcC!MhqL%@P8@NRPt%$YNl=:?RuZX>1!\P@P4:*J@$u*W\dwPtVjkdD
wCSdT\ Y?YVV5iMw\u@d69\QF5YeSwd8R*tLy>5j8/V*m@=BLnmmw*1<cc?VjBuW+w=Ya%tSLR#t<X\i/Gt/=jM
td+RAq jL8J/M6pKY^:/4:NYht4iTipG=JetE@CX?>Z:!tCj<Z?dP>WNNpEPK/T>/tNZcZpTSZ948?8pMM\<4QV
Ll5N+X F$ch^w@GPYVIQw8S8bnm@tPN+n:@YQwH1H4*cBm*q5kBYk:D69%NN/q&9%jF9DCI8$&+6$WTmAK9$d/N
R9CjM4 pESGj5*QE8M+beQR??XD+tHm=d8K^KtQu&P*%J?>AZdCD4^?EG^%S/+qQdeR8RY\L*njRckc1ckWn1wa
l!*$i8 @4JaJyW+<yZ+HiA%La#et@t%R=*K^V%emA6TRqG+=/j*ALB9NkI$8k!e*K6<Lh#dB1b/8$p?Q%==W*9M
kP\i>^ hj%W<h9#WLeptKqK+eZNNlGIepA\B8SYH1&d$ELa41TS<+kAiFG?P4BXBbWZ*pCcyJ\G1<BP4tZ+6@>E
$@cEHe h/V6$ZXp*dQE/Rb$TD8FPWV=YF1n&tY#WMRBau!ypFA@m/TLKF5%aeNekITXH>SNJn%JMN4M+XQ>q&J1
=1G\ac $ijADb89JSdRw8hD%N#WYt*d&CdcYkbW#I*M!@!^a:i:1#Rbc6HqYi&V:HG=MnQnS5/q:H&b:$c#IR$:
eWndRj jJY^<+YPGwVGEH6L4VuRS?>15B=#TaSC@SmZ>5N##uICXShZRp1CiLhb>uFIHJ9FHmS4!QQhXquKFW*!
X/Z&hE MpZ&VY@!hQw#wZV^%>N59KFVCuipLuJcd&JVLZLWP18E>Kq^J4+^y:im\?Z4XL4eJW?ZNZjQM$Nmd66<
S!%CWF k$#<^1M8Wy6HadTK?k=TaM/i!IhGwM>AaaE\6&R<nN95PCAX4Nl:RlIkF$\DI$Q!49ul4y/*D$X#//?i
WTip+W J+uEpWlwNmyM++j%hI<yd@4S54aLcu&cLR9JI:Qt5M56HM<ea\=lF%yeY8e5ejFXDeL$Gm+bEl@I%Ny=
ymVKX8 T9bF>tt+?C>?@JiV\^p8@i@u@?&Q5XL9W5@@<Xeq<9?$d!#FLb&5y+qAYItRWE?pc#i%5TdJ=GQk:IJR
46Zp9* *J^iT:knLpLTVpt@PM6FDmc9w?=$@aNBP9EbN<X=b:Z@BEG/YHK&@+ZHVcXiJS/\t#kkMbmKLAp%yqNk
XSRBVS IStnKmTqP<<dbLI>E8Ce5y*q>1FLA!ql^GnR6GmIR6+Wcy8CVAe/KwaFaY1dYcSGRGEV>B6$Ti44QEdN
V@T>di Cb@IVa8#=Ll#RuEIV?$WA+dt1Pu8eeidL&&N+?n\XSl:upa*mu!6k>I41$QlCqWQYPY:JJ^qdthaWeh>
#!:$Kw 8/Yya!%4SnFJ<l8iHQYP#XeNQ?*b/j*kBjLh#R=u:Fl/tkpmySq#<%=@+kIplm#Gp%\B&a^B+P6BE>nc
XXLtPp hd9RHT8ZY%Swm@inA\acA\/Eln@i?d4#ndc!a+^$YHT=E+84lVX?u@hiDT>Q8Adw9qK\k++W=\b\^b^%
H!TmD8 m&6@lX9Qk\9RW*W!S9VE*q#a!$##PhVW9Vu1>We!uCDp^?GPS!b/b6^=4q+Qta#HBmZ$6\><p#w<TIt*
RMe+Fe p#HnLhmBMbRt49Bd>jB+m\l9pDXTtCSy98By&TaqJ?5>$aEP6be>dyW@kN6>*enp\NBZ$IHpYY!cdj!=
DqTyt9 A$n$$u<P%:MI%P^ck1=FX\tXEL>tZ>AeGRj!EBVIuSjZYyt5$a\RcB!H:@>!!p\&H6Y%5Vy4tItwM>uq
M&nE#6 a%%:9V#??X*q#W:Mc/t4C^5u1K86=i%X^?5#T*9k/:MN^%jT@dGQN$:*\PXJkJVT/=d+<c%ncG=yP?c1
8L#RP8 ?K+aJeytA@>NNLKKwk^R&I+LC+pP1BiE=RAL<ylb5+&SWG1kJ?j4?bABMp&%kkDjN&Awu9LhMb>*VBZe
$RR^Yt t:JSMlwwP?S&kQG=Xw8l1lL%I%L@JXZk9kCy^Ib+J?Kbd>mMcS5uwp4Kn/DR5VL<Dkmyw<K!A>=Awdcd
4A/cEk yP%KbmBJSt+ZlP@:k%qDR\N+w1hLn<KTTGYne?ejRpkXZ!LWnF$>p>un6MBH9FF#wVdj\:TWy*IbpS:p
-AcHXS 000af1d2e8b001202b4 Page 453 of binaries2.zip
LPt\e^ &Kq?Sjwaq6cXF^eM%wFlVFu5^4Rwcb/c!1?4Wtb!%e/qKCQeG5^YE*CZMbp!@F5TKCFKwmMW:di^yPRw
n?/9G+ ^Na85:$&ZMjb@=6&Vy14cTY>IVWK8iHcA6W\Yb*dSG/Rc\HDcY%JJm9Le!QpyP5*eQXSXC\n8Zy$98\m
C1Q<\B 8u5u@S>mHK@*5m:/ZdbNA$E4Q@S48+>TN^1MSmG4LXP^ZjiHMC9VpjRmyihP5/Eb5dyKdF6&hT+^M+Vb
+W4d\J AK#j$6%P!LYNV5CHJGEQPWYRd&Sadm&lA6M9+BZt5BN#V<V!bZ!Y?k5<myAm+wpP6XMZ<yY1&T^56ZSt
VtNQ5D EcX@BG5JDj4aNES%T\5y:A%q6+/GdSQF8*#TVwe4Y@/&W^InmA%qDqwtET5##J=jZ98+=/5ZyKeDVZFD
Y\/>C# *GT6=au655bJ8&WbDQ=$IeYSQ$NGby5>kcMh<eiW\&+FCR/BdbNPlA&VZi%Iwl\=hEu*CXJ*1it%NYtA
c<RnXV Wd+lDWl/E!Ie%A+ekjFTh%#kSE8KLJdmtGkl$6jCmdtGRR4nT!pVpdT>&<a#VS&FQ1F56@cE6e+SpcS4
5iBBje SN#EAnX<iC/Cpq!ekb19hKX6GP8HkidA@1k+R8hHcRRY:$m#Z@uy/KiDXMLK4cRTEliK4Sawl11\E!Dn
#&Lh># NC86eLjtNb$+NhpTIkT^T98YNdlAuM:Ip=Y8nd4KCI=D+c/b/SdIWAT\Xmu*9Gy>yJ+uD:>eX\=$EIcZ
*+wQ&a JRRJC<9qdtn848L*GY$SucB&^%FniY\T<ER4B!4@mTDe>4F&u!j19Ct=w<C:QnNwY*V=+>$i@bB+8k/y
MhI&Hj $<yjK1I/j%TG$S1Y>X1RC9<+8t8Jq89?k1I8ahy@14bk>De9&6HMdKGMF\P4tpiX9mEtYGR1&$T%4$*4
8^B1*X Iu^m9#nKkpcd=ZBB/kWm@^\qe^ncBuL\QQ@86DMK#%&NKjYDYhDl*DT=+M4=tIF#pMe@?\VG:=*6=HNL
KDqG8* b9aySpVT\I*:a9&\EqRkeY!RD5:HHGL5<lC9@<HLdcM%*ed?SnM<<C%aCPTkSCF+Nj+newJi4TNqY*^Z
i*mmm4 yt@CF<F8EF^c!:9j8Jm4uDBnCm*HVXIZ1+@4$mw<i$9JTpM>tNi4hwWaDQTGbZ@RS#jY5?Mu>4ji%R?W
&#/I<H JDpR8D<RuD?GlbZtTp8Nqd1=+jP@=n@>@\4>@%9@9!+A@X<HS%ZpIdpSe1jd<dCy=pk@yp1yyH:nw/Z>
I#JkRw pGt!>>h>A$hR!Z%S<k+iXkHFJ/nukJYG+cN/dj:+$nj%n!Y8PytWWKN$aKKR*^alR+6@6@uNZXkee$hm
>%/k!? <RFcLk@Wean+i?c^TCEkuNBm1Q1P&imW$u!utW*D$DDRQ@N^c<=T@c#L?Qk/pp9IC&!aXe6wh\DTCeuQ
\h4FNH ^A6MMT*eYYhSl<4J>?5Zmt\XuKE:m4YHdI9!PeJ$4cBQJ\n##+T?NCSt*w/#yLDG4SKQ>V\BBacknlIH
A<eG:< lwq5iAqq6JB&iT<>1YjVcAQ:@<i+P$BbFn9>w1h6i>w+dh8&dh8&dh8&de/$*hPc6nF6G&@?**j9Zjh^
BFlCLe 9V1X:CV::E11<16K>qp=Zk:bJ*Q8YwTCKGhYliy@=^CCu1\dTjqchZ9\Ep1Y>%ZV5Ip4YT<M=AJKE!Pm
FJu!wX Plb8ee?pY<iky\<d8Q><X>lJc9M#LEPb*wlTXyRXn%p@A1\@dTt\ZZiP&jX\Aai6q?/:&RFGJ^k<1ILQ
RYGdNX in^5qwXR4WAK1i4CPGM9bR!wcPjn>DaMl49%l+aT5R5lnA%ncRq5AEX?5=qaM^p*E#DZ1wj1IW!lC=Jb
Y\N>+H EiVeqtSDIbD84uF:leqJ>6LnpTA6@y&J@/$Z^M^Q>GLTp15LGWi:NI^>qLm8JQPnaLH5L%\u4WK<VlGp
8Ji*w/ KnHp4>B=:GnP</9li+4S=cFY59PB&MwbtRLWtyDCV4D6<:cpaSV^n%ik<IT<:Q*deiZha@//M<@V&/5i
ji>BAj /1VI8:?PZ1A*#Yu&G>cjnj9lqXwkBq<E?>TK+Ry9SbE4^Y8iVKLZqGFalPIHaY6D1<kKKM9d#!H\Z@MH
*>S6!u wA!/Hw++<wm>>5wCiGJ#WIVC:Fh6yyKX5E4!qEHNpHKPIit**t>cJ@KVe=ImXlV$&:GMXtD6tKHq1Z=5
G8^>pW LlicC:R\b?Z^VaaT+=*wcaF5Yqjt8I*:pTJP>Dhaiw:+w91bd<y:CNbDqZ$lcXRtwc\J=NG1@J=<>HAB
Cb^Xw+ p*T4iTYD>a\J%tLWK>CwchHE8S*5pAIF/\Q1F<EDta^QwQeLeTDVI%@NMinQt*^j/dchZG:9l8Yqj$K1
?!T$4y I1q+nqFS&QCAZ&!iM:QQ=qE\$Z5P$@pG\:kFJyIC?\qy8b=#q:@CRpWi:%R9GJHZK$\=&lYqCm:kJBYn
PPL!5+ y6:F+jh&n&t41%/Et\Vi!Zy@@pTQwNQE5F/wXQZ+Vcy<TW$aN@m4Z%j@PDLdYqCTNm#>4#C>Ye5QKYbn
Y@R\jk QS5#Qniyqp5C^?#N>YI5/V\$=>HG&tSw=j^e:5cP\I5V+LwV&hKWQk%i5WEK#SK8YCyBY4Rc?La+#qWj
+*nDPl \SeeGc*By1/F&hP445eL%bB/1?miA&t##9Jcmn^dA9InXk:6LC&Z58%AaERA6F+TGBM8c\>GDIqaGH1c
A<*4IB c4A*#jd:c9A=wNXFm<:y$N5#^>FCKeTVmK5=uQeq1K>WEPk6HcmFRwRZ#S8<ChXyaq>>Xd=<buQWQC=i
mlac?Z K>bwL?&RL6kh9>V=#SjqTX+bLJCQAjqdMLRFT$5nc:\@pMTAm9:W+!ucP5&$\*^hLCK<n^yD+bAKP&\F
9QWaHu mSt<I9>\t1Eb$jEq*%NkCE\Xy>El/YXD:8qXw&I&^+mZmPFNkL9RGj%F&huVam/^>LYyj65GXQ?+5YHR
VVkLwR dkNWcTAD5\+H>V+YmWGLeN*6%^+*!1CcEEj=ILb%cDRyV1/G6#Xq&N4RG6JyN\TwNI1P>=8j9y:dwGLi
591?:N /\F:>VWF6m/b=H4BXID&:!4YdiM@&N&6Nhe^SJ+H<X%JBJ/?@Z<pZL>^CWCAiLqlXTwcE#YHZ8=p5<Pj
/AS^Lk LE@*DSd\VwN+wnae4#YpQJ=#J%QXE&t>nqVZAX4W*l?ZRWnJ^E@Q94#aLP>Z8c8C?6J:p:Lap%Vj4p^?
&R&4!V AWYKk>e%KKb#>ajDS6kc/FE=JNX8mYC\m!qiDuya$?XFiPI*ISDteKkC=Eda/iGM:ZwWqM%1mSkc:6jb
Y8+XT/ >Da1Q!/pJqSDY>A@@P>$Wj*HtWIRAycXWZclMCW!MDd\d4Z%cSR8j*NW=RP?<I<DA1@bF9Rt=kiXZPlA
RAkWdk A5m\D8F@D%mY+M9S*nAwj$>$jMmRG1MW!HKJ%TH1w:MY@WGcAWQZ61picB?Ltk@E/!L?\GAd5mMP8mC6
F<:pl* bVGSeP&H#EKdKLPWVk@+peD+<Q6pP?6MMe/uPb6qq?\%8d#AknRIw1AyHtNb/n!Q*G/ajS1CaHV*aNmi
AASV$m AVMh:mbty+bFlH8uJ5D!Hm<cS:I#S#?@GIEi+e<^ahDWcaA4C?6QBA<IB9DSM=dp&+Eb8lc5J$$DqIcq
au^^RK n%i$+jC9yL*!Z*GKK<KuJS5+aTw<Y8J/t:5Z?iNWST1TLny?Yb%k41M?Y9&FQSbQDM5iXjm*EIX!^PjL
+5CNdM l$CV%QjyFSbBTJVKCKp<+$P^5\A%<Hcml=T5#?6mDpGuq*bQ%=MyAAAl<L>ZNpk<Dd?&Pu+e/CTp4X<q
*:AcwX CRYWZyGk8#\jFS#H+J<jhcCyBAXn@ad/FueW%IF\De/lIkWu/%RQ\X<<ASBJQ68Jt$TqIKTi#*KVLSaM
hw<AHF 81Lt*eE^:ZqV#+><b!dRp*?IdD6alYqI99&yE9ISWaG%RQ6X5Ldu+<n1?&55m/8&Q=y6pwlken=tMjKb
S1A^Vd I/K@n:dZZ@q9iNd+Zcd#R+LCGH>1wKaF<:\pk%58@4VJ>Z*?5DJdpj>nLP:+5#iW?HWXX^iJ<GEea$+q
weVIlZ <%hFhK+=SP9a!@:T8p%N:M4$Xp$l8lSqdZ%c6eqX\%PBlM/N=LB%c%IT^E$bem%+G+I/hyin>WT<c1#Q
Lc?DW& <>lTLNGQ+wlK^?4TD\RCEuqy@GBRPNS1h?Q$lEwe=5>ZFi5*WBp:#<#A!HP#\I@^QZQnIyuV?6KTS5Rm
Qd*qyQ HbTQAXZ%^RiS#/9ACht@<CcBEX==P#=!#lMJX/b*>BGiCeLjA<u8G5MyPNNZVH<I$+W!q5pZ4K?yIpZd
lLbC?h XhuBhychV?k*L%nmT&AhVGI=4<MtctXnWK+ZjN/TVC*F:NNYPCRITWVqViCtRAF#SV>Y6Bc@GiqwR#=X
Z4in=! J/A9C8J@B/Fh>\6B/hMVB\EH#E4/ye8=#&SjdyS@#uNRMy5kIm$R\X6YENXeEBuA6c<V#n@hdheYRD$R
^$H>c5 JnuK1YFXeZ%+E/NSIDkZy4M>!mBRDMItj1@CF+9LI!ayC$65JtEIZS%/aN&:HIJ6\IVi&Fi&nYQT?b1\
6lJ14L h4Di+:=\9FEmRe8Ac$?9>/#C9:kGwSSAhYBIVWMHwe:T:84RC!L8j*YwjAeZYF4@6Fu6ehJSa=uyMMa9
*Wu$&E B*nm#!+QeW&Ma5Y%\?a#9S1=XQpB%qHMQPmZ9j8M^eY\4kbcG6+CF:^R5IC:B^@k^y8K9$4NdZ%d=<@P
pDydaT tCe%J@^KX!bT#d<qZnG4VjhR=#@AP6+%DMCI9mqcS!9$!Hm4MFFLHe!<F#%LFA^c!4:BQ69j@V##B/5I
nmXlwb b<\Q$:SVFmGy#w^wmqR>ek!j4@p5*y!HPJ^q&IFn&w/%Mh#5lnPik8jbWn<e@eK*LP::RV+j&:iEM?/w
WRehH5 d1!aH%Daq6V1tE<\<Y>RQh%aVSu$c/wjS/a5YGCXRClmH\SXTV6RNYaWb@ww6aRhK?Mqy\&kYePJ1!k>
>:=b^@ LZ8Yib^?y4+P=GCia^nE=FiR>\K8F/SL+SdX^>qbN*>Y/5cJXbL=/bineY!YqPh=\kuSWLNRybA&^<kw
uhR9^< Ce$ElyK^1DRmwL5t6++DKD##X1>b4Ck#qFac#uhS&VyyhA<+IiaMBECTjlVVumbDtJCLDK??KcD9P+mM
W?Kl9b ZYTpbGe!H5CyI5G:hp^a&chEj*V/%mQ/ThXC+uC1Qd98m!6?Np\4#iF&km:T:lmpmPyXVy@N4u*BeJSQ
wIG=kA VZEb=ql6!WeEVnBdc9#$=/@8H*n=J1GGua^WG4LF/!iHh!!+ZE*CPA@Mu$:j+$46HQKSILD>XAleLHmA
QRE&<$ Mku^#mIWFZj<i$uw8uWb4^jAnPy@&AZt%ecYKSB&l!:ZH%P5tyPRIGyj1VC=FitmeIP&ZAD@Yu9uta9m
d#juj% F/ypwAa/h>SCCMQ4Gubkk?kp+PCQMBw64cK=WD#KK>W4Bwdp9Sj>1mPV9hF?y+\<Nac$5<t5M5GLqG8!
+??GCD DXL%XchcutN\Kp9I@GlXt@ppMV%c/^cDu>u1EQLuNkPG#XVWRc:XbQt&QPpB1&/a&Hj*Te/6IY<4T%B%
91TQPn K\>I+ZKaY*wb>?j1YKZpiq@F%S!LH8h+ZH=NQZE\?qHm5p:jNy<VpXNwa@TdAE:G%!DK:<c@iW:/C%Rj
pIk@n@ dej4CVEm8FP>96B=luqWHtI5yHjC%@\4$\ckmum!qQe:u<^hT8*9?w=&J4tne!>^QLyBCX&K&KjjShZQ
5:<8KK 1Y%LLP+Td4TkA^n:$&ChJAK<?P\CB^kt\%kE=p>qD<E9#C%%B4:B/I!I\ddFyGSw=#<hPQKcew+ab/14
^W?kwF \yV!ZH@dNl=jtJJi<>9%ZQBCpLi\*6\L<mYa^hJFR#yFKpu4qGamMMmQXF5I+$P$TkSTLA?d\ARZ5yPL
JPJ!JB ben###ALtAdnH1^1Q6=jwQb<&eRT^E?M@b#@:yKCPASmp18?u/nN@Zu>n4HtGcCw$D\Ca:N1i\Xwh*nD
4^e!CF AA/P\!kyjPQeLG65ZC!+8T*nw?INaT8u\T$<:luR<%*ZnjhE:FqipK8:PliKw%*#$PmPjtAnt4YG8GGw
-A!Bb# 0006f84c3ed001202b4 Page 454 of binaries2.zip
DlF%6* /T$nCt!BSE+MLHG*HYR81?=>B1JeIqB5>@V5bJVRm<<IY511$9?W5:SSh/$5>LNH<HZETZ*y9<HIAB1q
q#h6!y ce*Iq:Yw\G$4Z#mc1n9#eC5b9IaNnnD@@5Ei$CCPA:R5L+VK5eLl8/#8hIb%h6d@GTu?Z!>8Sq:CMi^/
Y=yi$> CBQHZ#8Glh#i=a\T*5J#iAGDVMS%9*:qn!$@DVu8G!\S:8?mVMq1eau$DNZTby5?GP^H84#\eiNnhD\J
8#mWuk B?1<8hWm<nSN$K>yG@:T=dBH5X!:dlb&dT^4B\kB$A+JuwRRX^#QdTZEBHad5%Y5#6nP\\%Z:!C\yqX+
+bK6Gp AWVyRqQ<cbG+ZJi&kR8yENm<^p66?WRG=<N*HHi!6qB@i4Awl?u!LyWcGF*+Te*d6ZC^&Y#&4\aF$l\:
p#pR=b $?KXI?VNwLJPHA!djHJ9JASTclF8q#aR@lC?#tnQ+:pTBwBQ!u=HZlc1^/Geu@N5NJ::W!Sq*?HpH&GW
TTWHyN \yy?i$Z1y<>aVYlT##<KwLNeMy/w^KJluVFlB8>MRLaa/JhVGtlG51&ShXE#t^6j8/h88eb*TL$H>V9X
XTetn8 Il^?Iq:AaCHqbQ!C#il+9q85&bKCSu:nZBqBGlW&4:>q1!6ly8BwdVpaMdLhCn1>tyZkyN+6!bW=#5u>
?\@FE: &un:#4F+&\6EeTGlYl=:/Gkt@AEiiC6A5DH65w4=JYu1EhC+MLX#A9WuhTCSA?V8>lw?Rd1a/RjTdB$C
a\j9%V u46IhTwenWP^S$&WGKcF<?nwpj*^ab5Nl/lmLJd#N9XKIQNHL^:*Y1<a!</YPD&!d#dBCDt$HNdqMT+<
SJ&mE? tej6d<6RW*QG*Q1=RGEC<8%K&ZuFw4Ahm#EC!FKu#MNj+1pImaH!=:=KY>#!aTJ^wak&+Z\+hNk18?D6
lB*t%4 cl^StBY*Vk<%MSE+9ybyP4bAA#Gntc@1AF\@X@T1bWtb6S?NW:QA*dWtAMI91cHjWP#1NYlRctInT:Cw
:CH9=I kK1ZD>@LH+IBaa><ic\VZI:wL9u8&VGY8w@5>G1#Y^+qK%cuPd!A8SWW=yEhqQPFRZJi\c*kyZBeynC4
++Z1lX GeQKG^\*pPa>l^\^\y+>MF6KPYNn6B&:A@<B8YARFeM4ilmJaaThTBq1pu4V@IKBIn?TBCQ$ZZhpCj94
$*SwNi ZX=m#m1NF&wPL<9#L\wj$wcl#t%/yl#uSmMel%X5A1^H@qbFV%$c<m>X4RVE*!yH1ueFnG?I8LV#jIF=
=9D*yA yenaFb$t^BdWXwR/ylV^e*98EJnW%KIk/ccqbnTj=auJyPDJZ$dAkp9H@@YDB</GqE+AyP9<!5wSZ9PA
bdtb1i R@L>#aG#?ulZG/p@+Bm$1d&6BCcbh%KI6M*@FP$XIeCi4Ie1SP^I*c*cd#I$DcpQ9Yj<+?Whpk8aTZ:5
@pMmIS D^X9y46+@%66l$6%c!^@p$MEC5ZRH@4!EbKk@WW\:!>mHV8qyZQEuu^IlH?TLc*/Tk?puLtBtN=QWZXL
>1ZLND u5NJV+KapkbY+wTRQiX=%#5jJ&LY6ju%d+%RYabcpci8qQSDePk%mH8tWJLd:<GM*njtK8Y:W&wCCCh*
cENSpE ?py/Ji\AFh/GZ@S6e$9NWt/d/QXhqIha69pSV^+#9P$=tp+@mtBXmP/&PEDBcSa/YTKp/Weh^WcPI8+J
ZRYRe* K&cl4@b%LScFFV$/Yj?kSwM@Bwk>nCPXZ%GQ>RlJJq&<jK=5E5SqDMPA:!E>k:Dmiw:PQ*c!!F/M%>9/
TB@BZw 6@:Nhc44NRWwJ*QcIB#IT$/TlH!6KaQjVSK+Dcl%^W!m<nd4Q!Tu>+6pFqJ6dcS#QTWYcTF:*HmV%mRc
qy18l? Xh#T*\m4<XlVwuk9WL^FXY##&SwIHA:4QWkC&Z>mYTXQ6L^$$>qdp^F9hZ!u89Imj#X4K4EEhSI^=b/K
hm5%Z4 EkRkHXDGbPY!l%whk9WHIX4lX6^%LMV$@I1e#p!IN>/<jLyH^Bbm^tuY/855kkjdCF%EaSMk?n$kSDZ:
?LJ:yt Rw+J/&9d9M^TbDMPiE<585B@149?T/*\P?\Hj9WSei^Bp&A=>Ah:^M@5FmtM&<B6YkW&Ha/CMaB94<CN
bq&ZDe <XhupVWi8je8NdBHy#>1PKm<=*dZ$K*QVTtRW$LCjXR4p\n*Eik#G?QXGHwJnVHaAn%K&C5+TdiKQc/G
>!u&8X di=*WtwbPtqVkyZVZ1?8FX6anhiN51WNHc\b\49Xac#?+$aeDNtwT=Z^a8GLKCLN5qaBFeeaYT1<u=h#
Yu\9S/ j9DacH+P>QKZj!i%bjhA4e6/FE1XFV@EMG85F?bjL$FpFpMYV=\bIWRL:lDlT/@y5AwbNe^PbKt*u@FX
W+=L:* <PEZlcJ+XEN#VCNccMnGwdNYlnnpeinSIXCZW%?<XNYN5/X8=p1R/mVQjJWc*bVdH/55ncmS:Hl4#q:h
@M+8Pn BNweY/1KXb/FCjCn?4:\\DaeKW$A^etTMJnNTSD1F$4*a@dXTQF/cElyLEh=5C*ZTSp#Ai*uAIJnlh8D
EKd#@6 tX#@C8ck8&bw=q*<6PSmmT!I9Gyl9yuewWTAj:Ndt@mTPTb&@Kn@WFRi?jW=!E%>aMdTR@dXl^D\%$?F
$&PbRM >Pe*Y@B5Wk#bH#$d@eW^/#k4KKQcVhD9@!Bp6DQ<:KiqedtDGqK1Z/SSGlCtC<iI^lhQ$XQb9d8$i8eh
:&:wG6 Xt/a9m\4D@P5/q@&W4JLRyb>c#?F>BH^#DyKFNJP8D$#JB<VK*$*@+WGhkP=tT4j\?MC1!MweVe>Fpi%
Q1mYI% ZGDENn$ZNijntJqq#dj^X=%t*IR*w!9B+Rn%TN@pJq=8?diFQ9RSnCeq?wS8/HKqb>EphSD@9B+yVJCe
X8aAAp TZYZ#hn9/Vhk8$IbNSVbW/j&i%IC4B4ypJqDEhjR#c=4^\iI>865tEkBiSF9w*?m+htI*eTp:wE<mBZK
p$Q$*l Vn1h4cyuJe#Vb=#cVmJd&1=VJX/H@h&^J:F+5wBhRwVWwu@ER=H>QeE1p\Xe*bC/!5?kXiV#kl!IQ%X?
VWKVT\ 9yppC<LCtTL<LX%&%R9&Ti*D4V#wjmFn/wTM>5&JPwW@/#TuPb%b8tEk#=AAp5F6HQSa#<</Z4Nn6umq
PXXCCh CGYFI!WbBH@hNA%B<=^\LETS:b$kMWBY1liwF^YV>MZk^&?T$8&Fn@Q6Sd&T^Fqbu%I&LLACw44j>BPT
>L>hG/ A<j6:K8E*aYD+G=1iR55Jm?+?w@B^H/Ean\p4IYnB#9b8%hwXjVT/Y>SnT%8bT\&Epuu=+<aJMBZSVcn
JENY6n G\VFw\B!mLE8I:d9:#B6F?#XcRYc^DjlGkyS*$4lEyn\>5*Q@E$XTCdYL%%^ElCbikZ?@FG+Q!GST6/u
d&Q@C6 T!9buFINlFFIya/k9%m?8aWqF:XJuNDlLFpuH$$XAqRVWk<meEki!iT:>\5KYbSFXAECceMV4dW%?ud<
P1hj1t Xhh\nKM<dApyaj9i41VAA^Lkb@R?^6VDq/^LN=>C8?GlMk6&wu9Yp<P1^8*BcI=8eHk@m1&C@/D%M8H:
#RSc*R \hC9\bKE6khw:?!CR/LJw*uJ+4LIeK8^jDbX$yMRDl$m5!jP6khl1Eq8h>ZKaT64nIy+iceHFbV!FR*^
i8B$<u nW5/8ipMauF<SSXmV!RR9T5jZTSJ=ijKcdH%c<V/MlI@Kq!a&nD>Vm/%@LZ\/<pVlcb9F#ZC5Y48HC%D
ZZKd44 LjlQGY5yH::b9Y/buDlFW9CNn!/D=aA+Y6^H6Nnc<FLPe#S66ndP%TLmuwFyHJ!aCAGn+FQb/\HhNw:n
WbNRGG C&m@PB@WLGS=t6G?Pk>hAIlHNRRJVHh<9hTAu?t8!pL9D>Wlp$*JEl9ByaKhQKN*QM1cPG=\Vl8GqB6I
T=iE$G JH4MmI9!!JnG&m4Men#9tR\u4&p6luD<PKn$/+I*J1Y8?cYYlGqt@aEibA@#G/yui5LnDj&#tyljdWI@
PdmibS 6%X+jpD1NIGpqt/b$?$<tqPYuFjNJ=L6*KZyH81HLdw/5%Kbk>i8yjctQ<uD5=cISLSH6Cm*%Jl/4&DZ
>@SRF8 ?k@AuP^Ih*:Pb5CD#KeiEId4qMK+=@^WVn:HMw!GWaCt%<yWqPTZ>b@XHwQqp4?YGbBNY9wA?A!S>huN
t@a@H@ =^bMi1iyp8#9lBqbVt8dBV15>$^8*mJNT*hIWT?SLE9TqSpSYPA<#*J\5T<6JFN1ElpQe#hPX5TATT>V
AC#peZ HVwjN/8NNw4>ZaGk>NbcFVP6lBDFADBqn8G/X&iD<I6\>J>WypJBNTh5b9P+I!J9QNGhFKE4jqaL5M6j
&R?5q+ @=GkPK!chN@&?&TbjqFLiIATHl/*+q5K$tAP%yXht%>!ZbaeKN@5pRZ*uKwY=<D5lWXPnd4G65^PhZdC
\*W$TP mX4m/eX^l>8#jJqk9muejQA#JMn@wQV!>YnQuwBlbDD=w!NcB/mk$CC#C$8TTS:\uBmFM5m$Ja*i^nNW
ISnG^^ hD96&%uKqn<XW?ITQ+qXAW^XF8&+aPNGuZ>Pn5D@*bFbje6C8V9*ZF9c&NTk@6FqCAh8hV%IppkFhb?c
KGQy%: ZiHMc4y^1wFhMJ&#^@/eH4k8*5+aB!c49eD^q!u/pL+G%+b6N:qJIl<QDVLl\KFNDP86$wlZG$$+&J^N
\j#SNF MFE6dDljT+%4uK:>p!cJSwpaEX&$=!WnNJW4CFd1J1Zu*Vd#YQdbTeTl5FI1>e5GQXE9at:^P64N=&@$
6!=dY# S!Y&*WEddW!ZcNcQT=uVXM%+=l>@mwM5ib1jpe+XhQ1dM<L\W<H!8^/6GH>/?6Fl&XZuTTF6HqJK:?kK
Nu?Qw8 GWm?#eR*k:Bl!Me*uFBW$A%iMMVM59K8AtiWp%bhRcdZ%hin*J&IC6W1N:^cN+#jM!1@DdYb*&a5mCDk
Z/di<M 4hjQY+:TlSb^/InBkB@D1X>ndGGQbGdBSMb4H$8/*hiwlFV%%nS+KY/Sc851:>dTJk4!+DJXlXb+wLjd
lhY@+Q Z%>hdM9tpQdFcKX/Bmubhh!WbNuQ%Swptmnw?ZAi:8qaNFu5haSIeXj:D\%lH9Qu\t/Kl!A8<@hH5phc
ytQhYj @KY?G<y4y\TiFhFcqGbS5N8/HB@eCwaNXCL!j%N^/EmTZJ*CdM5w9QN?EX:=c?nmEnpehI:JZPIZbPJH
@XW8mp Y!in9RYyE6E5kp1*ZaNGw#mQVw@K@@C8$46*meZQ>6+JNMQNPlRKSCTXFL9F$Nc8*R^Gq=Ednl^wSV$@
lIS@D\ 4^&$ZH6JIqwJTVJB!&w8di>6<aYP=KML58!>PKIkkRBl!B5jMRlSa?wjBj@MiC4D\n!Sb<K?6lWWWN:L
m6m>V? eL+Y1e>b8<>iSJ1qLYkLEKmZi149tTh6d:<bMBZ#:8lHM\>l>Qn#MyG+9qF!j\Rpu?I@P/iLydZC9<!&
9yT/8$ eEj%pVJtqB#t>C&aC1Q&L:YEiuLcGW1P5J?44?YpuHL15+59%GZkJC^YXmuht/@\Jb9F1YLKD4/ewL^%
KF?d!1 1*&R5XQ:ILDF:V:/E\W@BSE#<tEeD@/EIcGbNJ/c^\8Fd%<T14lCytuGJ&leHPu4>4AdSJ1eKSaMuP6q
QieLcj >Jc+q&%*/Z1at8%JRVwy8ykle6RD#>jXLp=hEIJ8Yk>%IQ>N8tL5qyj5mtnHFhEyl^YkN^+aCZC$p#Cl
JtCq\b +VB*PZ#\A:&t4nLR^k&1^=kmGX86YVWwaZn#6c6ZNqJ8k#>qHZ=9i?JL1q#SlND5ZjKqFpRP!#p<5<J!
RRaq88 KY>\kN@?c%HqL^GHIVw84yY^%XKbc5DJ%#^9FY1a!==/W9MJmT^<+J@yW6+K<k4X:nN4EdG%R:$H1qk#
ZcJ5$/ =&+E*eKCGMyeM??PL&lIk!pX4L4DYtwW%/Jn@<nPm5B*PH*&qI:kB?FVH*up8$bWCAQ%I^6n9N:8%\lk
RYZAPJ GLN=>=FKKDHCyD^lwXM/#5hY1ymDDV?y^V$\?+eXK+pSQ?uZW!JjYqY:RZidTl8nH*jS:uHKlYnNDIjE
d+Dy&D /BwNJ>FdE>ijPeL4<y?hRT^Q!Ky5%6WmIJGLBBWC#XYVWZ=\Gdm%Q#cXyELwNJV?Ep*F8V?8p8iaGGRL
-AJla+ 00097e248f5001202b4 Page 455 of binaries2.zip
LAVDNL qW<5E=\KV9aM^mh=tPcBXLJ>+cF>cK+4^kYpdViiu9IHuqbT&q=qyp>S&a@uwZqEWIJVRI&<yN&XdyMA
Z:XT?a u:Q+NCe%y\Z?kGy1Qt9+*n!/bI+nS5B4ku4*QZq9ubER9NLRyR@5+A<*K6X$SbtF1iJn@^pi1J>::W?A
6h<V4^ IdFGLZ^mG9>VH6=e@pjeKNLy#>\9BA$$u^CQ*iIXwjybSSyY1K!6mqIuP9GILWl#kuEBG$4CqXhNEmjy
G=%lwa XpJ1FW*tLGb<u*#bTM\X!H+!/*R5+d<E&Z@u4wZ#1nB?RYQjA^ClSWS^SGM&?APKMaXHYRdujH&NImeZ
K<%VI< VPma<&t\\<tuLbZyJp$ji\*&&#<EWKEnyD6^BDL1+VbN+>/?#4A*@Wqwtqi=?=ppWI8LAYdID8S6H#u:
j>:$D* RDIaH5<C*!B^C/9?HSqnhq5/KqayeVPW\NbNb\ySC5GkCiMuhb>p1cw/+EhhA&MqGu%mAN^K=kL&Z\<H
#+pK8G i#!1@Bp<Pe\hlytQ5ehE9?Q:6@=u4uwJNp>jua4:niBIk+pAyR9nb9Wy!*qy+i9#Z1diu#C*!k?%@JqN
T!iZIu 8%nBe$jPFhQ+XYDQ&Ci4<EnKLWwuD#cNL9%4d:%9^t*5&QQ9j=#8#D9<Hw&jmle<CY/1p^B9:qp85Xuk
+BVu\b !alGN\:Z/LpddkpE86hHcGpnc!AJeFVu^w9cw>=ihi>M6c:<C4Z4\1n#i&pIiI1PeYydA1a5$5ea\9Yn
Jb1%BD jc+$Rb5&%N@FV&Wu&+CSDDX>pb#Qi<@qBnF:CFu<QIYCujQly+5NE6iN9@jKT4HpV6l/^ZQ\Cq1?CX:y
FEqZt5 E:\AwA9L1Znye^@t/ch&+pw$^>I@uTSFRH@!jYLZRlKwbR#&Jn+d1n&d*<pR5dI$Z&89&18yHHD4:tT8
E5T!m< P>+kP8LKXqj/i@qPN*TpVDb<@dl^YV#P/uZm@m9\^%/HHkV5q^6#JeM/l4ky/FdpQeJwQC4Q>@\/>4yj
iR\Qy6 $JnE9KZJ#&F&Ll*W$:plnBH6&9TM6<N8pCcGZ/hIiE<Bdh4dKdGXjK=tX4uA@M*9#c5W#EC$kC+Q!ID!
ihKDH! j4IT8Be&d9jV=/?8*bF$FC<a4ED5wPLaywKJlaCkZ!/yZSii8lldmX^@C6/M:BMKSD9L%/kKY8C$jw%m
$T=G<y KFS!cDjGheiw^8^$>eSbh%hjNwQeqNHnu<dJhppeuh$PAhhLYiPmB5IG:q%LwcM<*ba689RhX^8MiYEc
PmqL&B G\iWZlW@6udbQS+c:Z?V=9uA$&?lYnHy\XR^GijTJmHle$nWpRbDyNLnVn5eD*a/4Ga1<6D%EuF4FcAH
EmhY/4 qN/G$<J*k!L\LNReN6kWPJtRqYLB!G^#cJphD:?w4PtJpKZ$#4*h+Q@G5j&t!q4tGHd+8*nbk:Ny<cpJ
<^kG$J kb=ZEJeP&>LT\D+#h!m8*^CjSNuh&l<%kuu>BRy+L!65<%e/u\4W=h&wVF^%J#>Mkj>hejT4p19+B$CI
T:lPCK /Ke1MnY<^lY/5V/JyXE<XSmjDm8^I?R$&1Mm8:?9F\Fa%Y<STk5h9EBL59\p<l#8JVq/j+?dKlABqVeV
qKRdY4 lVbm<BA6+W8LPW:D&aWEe:p!>M45l!EKp^$#<jtyYA><DC6DiT+?aYYISu/14+m%#*T1$=I6l%Gc//@8
^b6RkE #AF#ed^N<yNBubB>SjCiPKMmG&WCywH@hh+FW:JJ9^J=e49MpqWdmT#&GP*p4ny+nyHwN#aG9FJmbPly
q8&H4Z kbFM=PG4kXQ1y<tNl?d^:i>^Cc#R84/$>n5!RCX*<dqIAl4hJ+GY9/uA<F@teH\C4ED4W^>=4>^tm5e:
hV<wQ: NpMy:D$J#1=Vl\D<T6RFJ8w#!WnV9MqP&9EyFSyakcaRVK8LqpDKb4#Z6Wa/y*J8qP/?qSRVR5NjJZSp
6R4I#e @V?>I+CqN>GRHd/q<l/^ppNSQcmtL/KjTa!PLBQ68p?*PBTX8D=6YV@kCD8lJ:mJwb*DE9+GW1Y6wLDt
BIRdnV :i:\q1mN@I4d:uq^Q>ySdjyTG\I\BwnB%=\&W%WW5P@BHV8ybjPhDiQ<XQdCuKwnk>?<=hKhDZGTR9Qc
Qn9DuA !\>*ZmiqWP>d@qpYh9>:<*K\*FQ#Iy56S$1/ujAA#nB\Ej&1WBwSM:MpXhmiAAT@:Q/<u/8w#VPXLjP>
eL#Vu8 >ZL5nHuj=m?^Zw!KlBen4%^D8beJ*k5hJjb#9NZ%Pqj%LAtcYW!**mVEyi6Gpa:Si=@M/V*/Z%yQ6w6Y
>Xw1k5 M<:BZ<9TyhmP6!wlqqT!?PT^P5Kqhc:piWGQSt<T1ieN4d!muc#JbXjY^DiA=!%G81umn!Mcq:WH&%I$
LK4=@A ibSVNQnPBqB#H:MdE!\4Kb<Wc+XLq@!&JqQB8Db/GY8Khq/V?L9p&w$dq:=Sd&1Hw^i9?aA5atVCb8nl
XYj/G4 \6^Vdy54nJGZFEZQn>p*!aJkdLucuWjt/E!Bbt=B&eCyW9kGAac>AeXiX\i6P&Jc/h5d1H51ChGl1>VY
<b*4BC /*t=@d+BJDMW^&/d5VqA4+ZHL9HYe4M:F88DmmKFpG>P%T9ZVC4ceucCmqy/\uKk1i9?&\SD64AqyuT5
m<:5w< @cZ:5Cybm=IEhS<DB!>G*!B$&FVu9Xt6e<BpdR+4n68l8IS4F5iJ*nLW\SK1n^CcS1p+SZKQRu<w?w<h
6GaV*l E#PCZhwhb@W9ARJtqK=KZmGYN8Fy=PE$6mlZ6LH&ZCc^Vwpj@Tw>9?R>9jRXD+eIhL^Ak/8w1ETbPV!8
dnE8iN h^qquu</RGqD/lpQMX4@+m^9E=+lPp6?&<w:<Zp*^h&qWtwh=lFHm!lJb59W5l9&b5ii8:==Hm1EH:Ha
Kp+kRR NBydBV@MeLE%jYTZi68qlQ1aF91cGh!w%6d^YWFTl9IK?BqC9KP5tFNQa/>?8RFZD<KqL1u8A59hBb%C
n&SiSN E#pW:ZAmK+=:YMQqKLFGpT&EcdFXn$J&\<>V6B4<>Y8\W+Itd$*GMDwqDNLGji8>Ne+8\PK#%G%nAPSZ
IAPbnA &a*JLEFeWQdBuMIjD+Lc9VF@9iRJ$uBy/GAHtPiX%c!6nw99!uujJ?$*!pY1<>8ni9j45W@dJSj9b<lL
!KD>Qc ycT<n1!#K&/SjP$J#l&/CJG+\*IYVhF/PdF:SiwkjMC14AS6myiSmm@uXQbLAKQ5GIZ?a*#9+E@:*=!1
\a?EBc GR1@wElLeYaIS>FTPP*H<MRQ6y/hGDb*Eh8yWjuaJMqqKtdDquQqiie+Aq468ARMk*@S1<y<mnR<Ia&R
ZZRG@H m!m6/lq6T1?9P<<Q4KG>SX:*e:Gy8lpHiY=NX6YF1W%<<<:EmWabhY:<<pJc@=B*H>LWb9+/?/q:V^9n
l?kH1< G!+tHiBPa<Q++/XF\?5IpWeqymmI95j/<*B=%5@p<*SJ=&cS=yLukI:ICRTC5@eQC<45#E<QulN@&*&Z
kwqR8j d+9?I*<Y>eXHV/4h:&L!?H:ZuLckN8!$T8tP=Je*15HGjl<CJnT5kyIi+uFWI!*JS@:Y$IuTYilMA=Sn
@A5j*R CjK^BJcy%N@Q:4Y!w$e44kabc&h8k+R*BpQXE@Muha^h#*tC&Jq+=E**S$uEWYcaIQ&V@m>edq&#n$mR
d@jA$L ujc&KG@FCJdIhRh4I?*+?NVZTe?Pptq<%IkY^DKk1&Tkat5tJdmTwbtVS%ZQ/nBK>e^WFH\?NRI:lZlK
@6hH$W VW>D&dIyHSypuC*QCjweFXK%N<IR>NaKK\qy6&EMGu18FC!@Ne@/<mRd\RYS&uwVk:Qi$EGj<pF%HD>!
bP=D?q ^#RN<%i&ElW>k^Tn$4?4FI&dnYBW#*in4B@>KMEW<+w>=H1PG:jdN\=cV>+!Y8\8WYTjA:^wmMD/Pd#y
bke1tZ H5DtFCE?S&Ak4Ljhay4HePF*VFeaEaij?T6/>G%<WXn8IPFJ*=S#5ud*VXAJpd#S&>>yLqtC8k#:4JTw
w>!FRm ZB5+PS+pEZnSSNBMJTVSXn^8akK<ZC9B*Ib6+ZNEJkbDY\*6ktCuLuMRXTM99Zd$+X\KQlACRI</=\<$
+:1atK /iV@K6iVYDlNlF95t5*68l5!hLnj9Jl\:F:Kc:jnju#EF5!K#hiN/>MEPX9A59RL*5/NZd/?WYhcV:$J
Dtnm$G c/+\nY\lHSedX8pNAc<ItKLNiXMTDe$T!W?9jXKbyL9Xj%kEwV<\/<qRD>$E*!NkeXLqYDGXJPRu1:V*
<HkFb* BA&mCHhlVEaGaIdR@S\k*CTcGX?kZYl@S:a\AnFV1F^kBE$R#niW<X$iGahn^l&wB@HM*!bVF=KTL\a%
NL@ABa V\ipSL&e%^eXWnn>C5*GLy?R4$%=5=i<*d^MdpKHBtY=hHqAa>H5c#^M@t=tH?8W8Y%<?5mHl*HtjTWT
Z6^aM& I&>+pVlc!6\c?dC:Q+Q=p=cG@$HQuinZNI5t6*Rhh9PZ:^m4J5lYp%Wq>5mkI+SXkpnD94F*y@=JBJ8#
p8LJVu P4c9h9u!\ajqaW<dQ:&YQ@F^ih=BX5:Y\@\yyQ1GQ\k$5FAuVLl&nyn9e?DSK\>uE5<w6V+ca>ic<tRY
!A9ih+ k5Nb!jnPyD:WI9SnX#9ES8X6b8%*6ItbpA*/b&Vi4V>mRAy!S?h8ekEH1ueKN@T^Yta!M%?e^SZXn>ck
nW#mT9 Ch6>IX*CZ+kC$JK&EE*\Y<LLp?w5uL8Z$KZiCutPlmEQP$j^C/8?CBj1XXS:Y%\JH?W8Y5$:Bq&XBB^#
iiLFym #Eb>4M1T4#EKKlXta+!+!taIBCj/Duuhinb$4?h$yTlCGFCTX%e4#PAR1nb!\T&uiE>d*>bG>N#m$!pq
tt@\Tk HyBwwpF@bQJilmY6RNu^%/\1eApe@6le9H*N?WGaEi/H44+S$dJ&J6NAL4nIKhiY+4a1>\6Pu?Z:<<ll
16#kNm MYLbS+C<lIiXZRZt6R=K=aMDPhJ!uPtDcJkMt\h@dbY/86a4ldyQT*/mD\aeBZ$VDP$eJ>q<LH/u!?:e
:XDd&F Xa^>jXRCI5A9!eV@#DdW&jCe5M$/=J*IZ@jli?Sh!$eIM9=u1+RQXkkAkFVN84aHbtBIJYdkPKNY/&bp
CcC:d< iNTKqpyuSEpy$a6+S!WZe>DV!&dPuH9uJL>qADjn=YX#J6Nw@Pu%XTj$DneQuaGV@eZp$nJ>8nFuJ%uW
*=CDiJ !t4n$6XXY5yq+whXW8P/cYw$cMSc1Hi1bWi!bRE\u^ZWl@eiMZ>:T*6#T&8qW#NRuM%XbYY/9DSV/</W
@Q5F%X Mbl\ZJbEP%YFpk>4+<dnu/euj&W\wXGn>h*SyHCRtE++t>bNbZq=eTtt$W8ZXt?YAi%NTNTp^Vdn#WmA
a?A:t& 11y!5:KhXS+pbbNbc6Sq+6?5FRi*@GZTQeqq$?S9WWi!tYuWbuNAd&pKwKyM95!eVuJKCwq8Bwy9F:%5
^t*#Ll 9wNTF\$cjM=9+NG$5#$JTVMGC^4FZ>St>WQSCb*pltLX&<ND\iA1F!=tHP1!&<ViTyp$JT1tCie!F#=:
+<m#XR aVP=1dMnlLN9%FiPPawptkIynbkWFC+1/4Jn=TQVZuLy1kpyJ^V1FJK!QYeDid&yyCVjNGVb#Y5X<tQy
PmlKAN w=p#DSnuj\P*B$:%W8^MQN@=jV@j<@e4DKSeH:/@<u@>:+Z*ThHK#y\$cm?WCSW1K5h/inHyNHw5Jm<e
S@/Mc> =!8k9d$CA<t6q^cc<^%RAu/1/>BW%=+CcDcK>m>VWAFP>!S^$X>Lb!SZ//b^Vw%9!uTleE%Pq\MuSPWj
n$8%Iq 9bTL/cYnP164w/K<lI5+kBNi/NXh#NZKyyQC#Zep%ebWZq\8=Q115yNhXGlAZjlm6N#PNBwWNHK>M\aG
^iph\\ iquS45^?/VVWcl4!\>41NBStk:?\t^p85iN#\M&e*n9V/5t8LPWpDia:F/C1KFMZX%apBnN\Ithy5ne/
eMHIy! I*SYd%bM6#I*6M4=V8>a6w9im+yc6bmCtDiD8k!/bmLFm!c=m^=wSEMNqMqkR8*NT1JG45^Iwn/Wnc#K
q?XR\i +yTX#8%mAM1EVmkj!ZbNVejKb1REH^%&y5bp+eqKS*blni41TtPSWDPRC%EjdicZna>uLQYtb9!dBhX!
-AA&Jm 0004f1e78ca001202b4 Page 456 of binaries2.zip
=4yHFy bw4pilwWKtaKwIGK5\XRhdmB*FT/!&W1Ba@E8$#?/@%<n1SM%i^a6DjlR&$1%%t**PR99eI6ac?yF?1X
VPaQih cYWc5<FL9=1aPFiGQ&>B/@<&S\JHGHQKl=*Qd#JJ!weVnn%b1Fiwl%X?^C#i>KbXZ54j8R*XwZha!:1S
MlA&ab QVj>8y5VKW+MJI=t\^Pl%!k+9d%yTp4JbV?NueuyhhPTD*8Y14^G>/te#eanM=#6XT5*+*W#8FBLtKt>
!%%Y^< PDAIKG+bVy=481k#=Zb/Q!TYqPuNbHQV5AJKB%TeqPnq>qWQFbIi5XCQ#Qd%>cXyWyKQ!aGmXd+b%MB6
QcCtTW chpMptLuP\a1=<=JebtJ#9EMwE!ZC&1GF@ZByG=1hcyMX*@D5h>HRRDF#6jA&H?\?F@q@:*k*<Y5YmW%
&iZWL\ K*8+6W<9VI1C&p\9E%whj<idkeF=&F6hE?W!ub6B4kIeulBVwu/qV1Ht#iiNbQE=JyiYDlYXG/e@bKLG
AAeK6m tb41W1#P/L*?mRPdpWJB4cw/M#W4p@aQhqNJZXV$%QTm8tqM$L*=^dwb%NecKWDWG8\54!#q5lQWtQ&m
iNySRJ pM\S/c4pbmi1<e1wLChQpiR*&il\El#PCKCwdt/@/iGtt9nSeHXNjwNud6k&6VH%K:P/hFXWdJV8lHIG
<9J%Nn 8Ym99t#h#@y@GC8XTSIwp?*!W1+Bml=45GA+p?lty9uJlDFj@dMR8bnwbyicqt@$#GScWt=NEyZchkPL
PlDElY h*TwhG&WBlP><l$XGlb\wtemA:l6K1y+RKI8<\@J#p\w#L4S\BN1XYjXc4EJq!S/@V6%*YHG/qLhL8ep
CADVpb NHy>*bk9F*>4a\hFbhP14<YZ/Kw8Nid!I>Y*kw4d=Pb1&I^i/Tk9kckAEkPk#IVGlLP>Q<Xu&b%1j:q$
JKGc&B :pDJ/%jAN^XN&8Sp^ulpq*K%1i:WQ:DkWP6N#mtZT=DwnihG8WSd?Li>!/d&9*y^?FHqbqH4S1Z&JGFR
Thi#*a p=8pecHR/^%hA$%qimb/q1jVqJIQ8:4G8=V*NQ1e/J*ybY5t^p6qw/JW9AbY=$aPyhMiBc#yD!iW1DEa
q=Cmyu M9=%Y*D!L@6WL68M4E:D\KAZQS!Y#wqT4yhJQl18:Ep<tqXVue^N4a=H*Ti@M/lW9#NXFT&&^<CbWPNm
\4&C&c h4+F9/Nm!akT:Wu1apC8T5tkq=jy#cK8wFc6e1KbeL+#FTEyA$=pwZbJ1%bGmm44T&h^iG@iAYYmjHNT
!HICc! TAw#It8Td=%j$bKw:%V6:*A$ptnwn/RuXJL??SXSttJ9c5+Pq^NZhAa%CwyKG4X8qld>\@lWepeTc6ut
y86e:m 5QJh5>wR9V+DbbWGeD\n5nK/Fuk++aXByZ^q8y>CVa^B++!ZY9e#8hyWZn4KN+MCl=4EXG\<nRa+qX^C
C/@pW/ ambduT58Y@<<IiY5Y1Xd8p<8hqkX=5XMuhKdRY+A%D5nh$:MCI\cq8qC9Z4WR6jZIGXYX:ktLFn@l/hl
\ee*y* p+\9Kt4u+tJ:8d9ZdhYB^@8Hk5Hw/44DZ@$Wcd\bKTlw1GWMXdMw>DJhYMu*Au>XtPk^WKkyLyYdm^$$
4i?@&V 1B9<E@8P=Mc4^:6wHmQVpH5Qbcb:9ytLWK?e1%W@B+cB*/IjZ\>y#Q4TuX%9bS>q@^aW4?StXRwKS4NN
4RT=>8 MXq^Ba1J##LV#e11TIWCnZ5CDiCItp#K9^AV>T@YVYaph%E=X/M\1cC6HMu1=tS=1VmnH8y8/ucq<d+X
Ht&e<: 1>bpAPZG8=\eSTieXj@BGM5b1J9F\1#:qVwiNVHl#HE?IQXIjTWVM%=hWDwkE?bAj>kVNTp4RkLeQ?!h
8=!aP6 PlIZG><P4eu+N#Yt=cLP#5CJ#mmbJGbtZhF^4mmuM&juP\&KbaGPX+jyVhG8$N:ekhE9p5QK6KpV<p?a
C^!cW% ##K>/Z:y%C#W4=Vjh*6?@+cdl8L!8%!*!5qbhYI<nhu<T&Bh6YiBm=p+PX<t?q98>dNMXI\!GEn>cdD?
=lSd?j Q\LW>?4L@#W+?Z*jj\XRZHjybmTuMNQLJL?yXmpjXw14AZX@/pdt@NSZM#8WLyDK4bVPTqNN4bIbV%Pb
La^YMX <GI?^KDZnV6Vj5pAmw&StNQLMkCu51nS54mwhcWuPy&LXCmK:\=FGj+VmuZ%Xd$PWcQT1FX:$=m#>FE!
5h$Zp# $=!TiM%R$mc$81mybpYB!nkb=NKmQ>NRm*mYiy%%e<5iba=M>WX^W#L<LI1Q%Wt<uL#Rip8Q^KThqbYy
9%9&A\ XatbD@i+tP<SH#JI>IH&Mq&J$cGXcR\b!Xj*u6KyGk!wl&dT$5Jq?%nPHqqaAXLKVe/158T1hV@9!lZn
nl>Slw J1TQJ5iqSdePlXGL>W*FhVN\1FZN^wkuyEuKn!dVuPkjqVnI:%1wp$?w>WaP^@9XbDw#j1wBWi>MyeNE
m&ZXEH 1>ItWn#L#hVXy6Lwn#B$j\IuE5&tww5Qn+!y4>VRTM^W>%Y4uKq>Q4%aWET4auIVJD8n?mm\Hn@LQ1d8
wwitLX 9bRdiI>F?^Z8Mt+=QKM<KGJT/L>:XT849KmBt#51N\M1b\*9Y%?Q#8VZJLw^!YZ:ZNS/E$:PQC6*8qt^
iyhR&@ cVnPPF*WSX/w=hI%cW=i&LqSE%=M\>+^TT/PWj>YewLtb6T!S\d/\@LDeip5NA!iM^i9Lthhti&!\=:R
DIRZ&d :ZyXtcnE&A!5ZNuitC=1$/w8cmd1JyiqI*FS=u>#kadFdJ!V=wIu4/wdhmk9?5lM+#?*=a8ljQ&jubj9
WkbhHm h5YT1KkR5!IAReQT!JZI!wZI%hLKSRD\@$S\AADa<9?5PILY#ABWARB\IAAA19>9p!#:4@EeFyac$HSi
bQiKak GQ?jyC1t1i41/8pKA9n?S@<*cYD@>\=MP@<nD<RNEAwIBeEHXARCA4%t\RDclCDmiGAhLM%*X@j@h8Wy
^=<6:d =HKYFpHakJ>81XkB4G#/J9qjJ4@J$ua1LqXbMI%q*l+EY\tpHbbL?cI!SjEJTIk4JA86W?jDNu!Ra&T>
Sc!Wpb Pki<S6=W4Z+A+:XZLHDN4wp*5djAl\dipKA=QBMZGpbuXIm9y8TpCRRbWD<8TniAG:Hy//E!^:wacX#A
NB=dTn ?^MnP<DP54$AYiMQA\ZH4a6S:WNpjVGDdB\liZ84XMN9KBm!@@\LEcaSB@TaJbEbWuNW$!mFl5Zu$AJm
Jby/4< ^EF:h4WP8/=Glpyc@Ypt<Q?1?kthi^Nl!c?nhD*1iL^BQdCQ/Ip^a*6&5=6W%l<$$MM$bLZ59&#4DSL^
D+FwdH @!%iVQD8NH&1<mVqtdpIe=c&9DCVi*Vtq+QFbi?u:e*Z#%MM@CZLbeZAW$%S\k@lp<5<LMj5m#w<iy\8
k4Wk+\ 5+#X!8P<n\F#D9XZ\km*dM/QB9AE+jq55mQwn49w:\\\LWiklWbNDV?F:qp/IW^>YX9c>aQ@<XGbDh>L
%DPbkh G*tH?!$NpH>Lw6&&B$e@SP*Gt/<QE*H@!w^\>juS>/\*Et>Xe8jF%uTQkeeEcdjbcunXupLWlHMlR$8e
KFwhCq MtwDEAFtTTd6YqduW\@JCQ>Qac#@yV4M4F5:\CZjB1<@INMpcmGiyw$j*Y5/%ZeuMi@wS>?$C/^Mh4ZJ
DQWqc? ebeuy\IcSjFNXDqj%W8!qBN<AVeJ=bm$/81&!Zm1wt!wpk<*=9WVeAq9DD^B18yF8t#WyId98LId8FuF
RaFeEy SlWkh<tJA+Z<Z!m%A%AA8Q@q>ADAKtIeGwD4Q?mc%6?/i4I:jkIAjwBA@5LTT5&c4*MS/in@8a<%J8Q\
+cdCE5 Pky1LcAT4lKq<WZ$V\dkB#MA<Q$Q\N@@b/e^euX\yuAlpuC#MnYVM*F\>DIB@Y=&RY#@D/lqIRHk@=/A
d<:qKW kkDAAtAA$DAR<NCR<DDkaBDkaGDktAAAMlk<PHhZJ%5?uw84q!$5IQAduIiMM\J$DC>:+@MpaShp>@?M
aVCJqJ F^kuJQu@kAn!C\RJJNAAhh>6^h#e*EDdmKIkMBicEjDjVk$lbiJkn\D+@/J@dkmK<V<4YNu@:hV@p$CP
GFbLXM @/Ww\D?udlakIQ=Q59wuWE=ISEZ\@%Zc@=XA?9+nB?RHABjA>m<uA\CaNK$+AP8EIEC<F1d$utq#?$BA
^Bnule qDm/Twtu+J>Tq\E>q\Hh%>5u%?*d?5H@GL8X&TC56S\V?Y#ck4A>RmWNCX8iTc!c\w%!/Fd$8%CtH/H$
>TbPed 9:Y$6VX#@u?bljn@#ALI<b/6h>wGPRbc%dNW?$I@BWkR?V%KdD#Ya15RHb/LIEPiemNBFAGdS:cdm>i$
TP<:KF kEQ*wXTD5PE9@P1:T89CTj9GR1l#Iim5c91bnPXJl>t?nue&=1WXBZbpKbXCjk!!&qRY!X?5Lb^A#IeP
pw>ZWn #WZ%Z/N#TS8@h\p\h>&TC/k%ckb^I*A@XVIdVS^5:RC\n9d@A5t<pa8hA/DT^NVT!\ZA/?wFaDe*eZc%
9Z&46n 5dI*BSVcGlu@M:ThK\m&8=p#M^LyymiFLB:kH?yk@^NMpWnZZCNAn@H$:jhmHRF+@:8^5X^=A6FWV/aY
bIDHMw K@:?!w&\^tYwZWRI^+Yu@\l&Vku:H/CAWbSRbGiph#h^@j<ABanR>j?54GV?N!l5@$GRPREAly\QAEFe
+XM9/T ?p?p@&jY8YdHCT%%KSWthTpZ69@@pV=R/#@!KPQAi5F4KiMk@1GJ4D>TFbBJCAyDyAYb=cY84m/5K1wt
d6jG/< y1aPAGS<=H^djKCyE%1!iQl+dPVJdiR@Qi@=a&^d9=?*j:#jZ<?^SWqA?Ia*$k>ubHbD1N*%!^5yBGDh
$NW*y+ /69MKYhR=@mhK=!6uEkaZN@ZGSl!q:KDJjREH8cFQA5ycD:?*AN4hEjw%S?!^S\!JN\c&^4dEF1^tTRj
Db?LPy 6PmSP4<tPu9j=qm^&?aKXCjtG%:5c%Qy*iuY>\4ptLubYunumYtIE\nj?SHAMWBDtGakpcF1IEHj5:*j
B14X?W p$Fu<ZdW1tL%/JyWT6kke=FWd@CVNa=Wew\yDdci5tD%<!^Jw#!N48t6pWmcmIkImI&MYkaPdq#idF!j
KG\=ju 4SThYjYQ?+G&V*P&V:PePV+dF8&PE4EtpI\P/w<cMGX4SmCA*h*hS$wi/yC1ItL16M!j9D$48p%VwQl9
b?weue bhDRKl+%kMB@6NTJEFly1meCCk11YlkacJly@%>tX!*<B!FpyAt^XHJYkKEdVXmuJ9:TJDw+SFKkwLWG
<:9Gb+ HAmIa:8$&FY!+tBktpnaV@bb\$SBV5*@QAl^TI<JkkINGuwdPLlElE&AB*DpP=DAEJ6SW6WH+$94dppL
ZCeGYK i%<=qYCG&Dc#%ekm@qR=&Vd&IH>5A6uAqE6MVM^Qpc<CISaI#G*X@PW%$tueWiQh9pXihubTBY:&H@Hn
HjpjiX VFJXkp#lkK=#85?VbR/N=RDkn1uQLbZ6DHhTWKlMJcPN1qjWXiCC1lVKl8XA*GXtM!::bWiyKQp/ZXEM
Z?5N:? &L+j#D?1E9=H8C><k!&6uFn!ECA$RT^^hIQ=JbJXk:pI569F=jcJ@:=pu>kuJl5T>I>GpCElIW5G>*+4
q?qm#V !W5mlB<pK%6Q%aPp18i@^+EGX\:1MqpQKm11+TEnw$kyLVTGWl=lkwND@B6qqmmMKPnjQ<HH9Gaa!MW6
IXZX^I ZMHK^q*kTwLSVKqBj/p!8YPhB4Qq6&?pp&CW@^S5u\h6Gm=qb!DVP1Y&K:$+BcPZZ!y!e1jiY$j&BR$>
Wb9EPa 1ae<iP=tI@&ni?9At=8Z<Ke4Se==p1iJm^<@eI<p+uFSDC$JlkK^5dEJW#Q?ndm=Dl=JCPPcpq=/5uK$
A$I%TR 6D&?HW8&uqAE1iw!P1S\q4CM?lPdjM6^eqBR!ee:X&!\9m$BDMXuN>kJ/=>qBFQD4wtt!^F!DH?eXBiN
m1$<LI D#W6>u$#acb=wQ4w>8@mlynXG:\NE+LYPd?RE1I<5NddF+db:%CyG66l+jy&VmEbZ6a:d4u5#5@Qd:$\
V^Gw9k #5@:e@t::6\lW9u@l4FXEDpyu?KAn4ua/MCIXSe8*CXmXu=/!?5wF1KHD\E4p%J?Yt%N:a^L4$$4e/>Q
-AF=Ra 000b9b8fafb001202b4 Page 457 of binaries2.zip
4>TMH* c<RMH1pl6XK4LqNicP6LZ5iY%&&R&?*4S#@mp6ee+e4knuE/&$\J*h@$FHjP\G:?e?V5LJttZe&hJ4M:
JkGynb ?YKk$w/TKmMF*kdXTW/@<&jZ>MP#1/PT4et%%b5F!u?E=$5^6h@#E5wQ:5wcVHn&@=H1Be49yRWPblb>
*^@h:p j&hi*Xm<d=Mh$d8ZZZ=Kcu6$muWkRJ%F%n?y8&6+u\WwkX:Q=WkMhA9MMh!<LP9&BJR%1!N%6ZWJ!JyC
!dIwRX uYahlp=j+j#8yHWdMMqiEF54LQ=pcSW9LLdl>=Hu>tjN^Q5/:cWl$1bH\5*YF$k+GCy=lHDAut6m!>6a
HMXuY< FK5E*9Y+N@@Jl^tqiNIwY&LDJYlmwGZD5uuR4!BeJZ@VI\$ZQ@QP+>&imTC9<QJFt6e\ELX&<5/d=pC8
H@qcZy >m/+Pw9hC?LQt=1lXCXNLNMDmY$Mj4dX:E*u@tWMS=hT1Cmwwm/mC4D6@$>kDkRBk\KlHm>1dBVAH<N<
phtcH% ?j8BYj5%@#npMC16BRciI#WS4=w&lBpeb*uLtpjS#4^5mwdQX?<?w#?YL4uEL/yV6IR9ul!*etI&L@9T
5<MAp8 %DCJCbcaSS1K@>#w$CkZ5#:Ye%VGaW:aYJ>P^+EPbp>NRh4tq/=J*K4uMja^MMa5l8GKF8tXRGw$Et\\
:N>WNL FpB8=XcpZ9I*54lD:F4?K5*l:QWR9IA^/pC<TnMim&YtASSq4jMCjXyFlq8e:uZ@XJFY@=JPjuyIW%4a
PL*:M! T<A4VX9DtG>%y+R#aZ/yMjJJn:=qtdatckNYqB<KtL:N=Ab:/KL+t!4:9Y\K#/n+#+k!lCtEy!Hq&FmY
W^\J9P V8ANjlWuylmbtlLyV9%!\IdG&cBF/Fp/kF>ALXGTc*VbBYNKwMB=IZdK<yL$Ah4J$@NR&I%EdS^#dHaM
nVwW=q JKi1KTiampYHN/#a8Q9VZmFVuy&18QEle>MN?aYKBZ%RB=K$9hm4J%Rc:!NRlmPmeMnBGFC%P\M%S@/Z
<W$>*t *cEVB$1h:5eDN$q%#1cZJ6n99V1$TWuKw\4NDEld^&i>u^X1c5qH!aBwC\N+mu9G?*kqAC$cb>!=6XBj
ePXC@# HiBDeMVJIhGt@\:85&p9PQBtP^\:HDwRP$?QQ<*Ewy/jSy@ib*t$5^%BI$Z6bp*LC4FH*AJSDDduan!$
WKlPl* $Z8Npp5Ki&kL9%6uVAB/jSAA994<L@J=uc5=DTyCI6cW=GMLFNMp\A5y^XS*uhZmKVW1WhEacAb?VujH
R/iAaS <:QIKK:MI=F#%d&B8&5DLeH&L$&%i/64uVckBi$b6RZRapwwKit&MKF&pc6DENA#Z$pIp51dl&YVFuJA
%M/ccI wcal8@\/I<J=eXh+y!!N164^Wn^!9=iul%LHDC>$mtJ@4ASTmtDySB*nw:dh6%Dm:&?@*m<u\%nLZal8
en=5?d ENun?>&*w9yX>S^j?I\Ki#MuMXe5kPmNqa!65$!a9yJiYS?p8MVRbISe?#1yXR$a9Fpkd\le^FZBE>pD
H&<8MZ :M9TGmkRPcyL8d9eFGl=&aMa<n91b5Ny6e$5%tFQFT8IRYyywWcRRSpl$TFk+pt>yVD4Fb/nHKDl9ky<
bMPMC? :IK#KeY#k/u9\+=M5Jh?H/6\aHtcDjR^AwREeip@Ntq*p&$$eY#GRmb\A4Hq?nBdkej%&cnR/c&lb#KE
k8?wLq 5+m9mYeL!j=1\JW!m%a//HF49a/A=\W<yamRCm/+p#HT5en=ZjC>AK&yt+eypVPCEH:6WPtJ?6LeDTSb
y#b8/X C>RIpWAYM1$L\@9*\ddDS1lKSj%h^Itn14<&+uQN+XAP!Dl5NVc5WLXV/nPdL6:\9%H&bljq=:W+$cqY
aw*J<i T4\:>yZtu>n%yQqXJPm>m6BSh?IKD#EWj+^?l+eZ5=N*w+Rk%jE\hjXbCI/JVlZ?Fk9a1XaKqBjDWVdC
wVW9C6 h%84V<EwK$\SR&I>=$+\&&m!kF/^:mRF5dMe$KMlup4Z>J6LI?+i1^>V8&nF/k^AtLm*eH&8Pq:D6I>d
i**wMi 9!q*q6dti?kK1<TjXSS6X@8&MHVu%uMaW4YiQyN6=6&deLHk*FQw^NPKuYL#Ty+/lh5XNj?4c88?M:@V
Y&9t=T /?%hbqe$1WnHL!yZ%VyVEwL&%EC4ZHaw9Eaa6enX@k$j>p:eSY$eSKHX:S9!DwFEdNIuL6kq/yTM?mi6
tp8!Rw ph>wA+pNK%#>Y<yW*G/D:6nP+4&/+@SbD!<A/#KEM^w/=9iJVQbTanZPm#FmZ<p1NR&IcM=I*LkabNTi
w>/&!D q5F\6HBeTW=9CBq<6/:?#+1+uHu1NXQ9y%ElwQFq=a<XEDNl*e5y6wJK$XNBFuJwkbXN:TchIS\aLNE#
VV6EAB !Na/TTbu@YNQ6imnh<DLXK1wHw^d?8GAIm#XN$$iA!W5Aa#W$wQ86#qa@GW*eGFd><+Au:?AADZDhkZi
*QG!6^ c5X&$hT=cHBFyD+%u@+mp+H:T?G%qdIiBZ>11YML+FQknQ:6>mjpyX6uh&^u=ZPLEFH!qXS*JAa\Spy4
u>qjqw *A#BcJMkEJ%8%*6hiS&V?d#CQb#1NB9LMXy/q+c:!^G85ZJCq&mib5Bk?FNA9edZ8:dHj*ji$$y1SY%K
4tubG> %WuJ@q/I:<?N&E/CV/aq$!?HWYcw^baAA<D5XJFRjYYHkF6Qp51A!?n+wdSd$Ih1Vtdqy8c8nW%IDEAT
yMDKu= 5:Y$eS8tTe\HjNINJt*dn1Enn$@qVh%SPVnV9cFMiTqICwi?6qB6J6lJcKItGKZN/@^yq\=<E*a*lW\!
XL^p+C n1cPEjLAhX4V<!&?NNEWQ4L<^>^\?MaD<k:dd^9YnX8#@bqcep%+aWQwq6dp/YyeE+PLZ/1b\=Q%PEyI
:B\y:m !$5jjGJZ4l?pN#4VL%SDY>8JTZ&m:\bw^i4%4y>A+pqSa+@M5nE8^n=6uc!\deW:9BX+qbI&/q\n&B\L
P<8y:6 H=*BI?8ew!9Htmn^Tlyl%I>ZFQD\LB$W%C?ZH8$k%5AbJ%#*wYlZ%dH$5i!1JkG%kITJ1tV+kw\i<H^J
qnIIeJ wjVyLnI#ieX&&R$HR#d1QI:1el:Ep:TRw!&:dHE:hnm/46&!#^jkCyCG6>cil1qK9!1%#85\Kmw9V%>4
:cwTt& JJ>66nL>T@==P9Xu1qpy&jnb@HGYBF1/RH8C88NTFd6^#kelN:$AE9RL1yKe$!SVlbIYEnHu?q<#p&?^
>i#q#d 1a^S$XtyEldV4VEmZS#M/tjKk>pYjPh4tYYeJwTu>^d1?n!>Kb8YY1GFEB<liA@qC=nSa$ejwmSPCji%
Vk*AiG Me?^djZk9&h/u8cAWlFLKju<!Hc:>Jy$6dd1yJ$m$/R>Qw99?VD%AhkBQ8Y1Ct&@\=FkLj8bWW6Rij1E
^NTGYn X@PjB96i:mcd=P:i<!MLE=CijFLy>jc5eZIN<=Nh/jLu<ud#1Ja?K:<da&b@4$NBIwTq9ej%H1aw@nC/
GCB8?V DDhmwQ^^ZT:%VNupEbWYm#6Y>5AI5/H<\JpGX+iS%NCMaKE^Q9\\GBP>^?hpM91t1#c68F&m$k\BKj6p
mlX9Di bjiq4?H6#\V%Pw6S8>elYe>:8kqjlhIj19?cNA$DA%XSY<5K=ZHy\YuP:ZCc?pn@1*\:NPVZl<MQ>E^W
!qN<cR nTClGA\Ml^YyjV>C5qMQYQyZF9nYqTJE/upj4Wn$/iTQCYh<!%+K%N5*YBPcyMH6wqCHTIL*KDCB^N<5
F#:5I5 Z#aa/+<XG\p^?$I^!y:P+ZA+!/$=IehNmVt%j#!PX5K4K#P6tGXGX=Swjl1Nn8=!YEGqmVkSebS/NZWQ
&VD$P\ A%@H>IhMcY4CB<M:haNB!=:niNXXc%?NY?nlCb*<L9$j5%mE&:=T=ZaZtGCJEMSN9=q8y/L9HAY$c\TN
VR4i\^ Xh?WIyX?wBPTI?Y@ilZ#=44&iu+WHhqh6SqaJ^apt:EHW9&w6X&Byhnq1wS/\@R5I9NM5qnih:Z4d=*L
GA$caN &yHu!mA5lcD/89jn=#cIdECLBR+EqL*lZ54#Smk=/15e:VTFZDBcF#a!:&hkkn@hWtRkiA@@:Syci+4@
1P=9SM #9Im%!I?S9uSJVby?K/yE%ABM%K&VDpc4?\+dIhIjPSNMtji+AZ*@KIy+cae$n&IQ/$Z9R!%?4N@Rhbd
c&NHd# KLmcuZ1C<PCRuwP6&1>tQc1Y6Q4VeQIh8Z@LBIS!NqBECbuJFe=WKAEy$Bbl#Jtm\NmN$l:h$+ui!ZI:
HtWX\T HpI5/lnmBAh&NS>9\LRBeT:bh?:SmTaTabc#Sn&iVISJpnaQIHT5e?VMpaH:FM!Q1uQdB*1+H<Q@&N\N
Lqc#*4 ?X5W*hjqK4&@?Gdn196\c!IR^Hu6!949CLZEd1Z/cW4GEKlP&DT=BGL#ACu=16dWeySn%QSIAG491<P9
Ib#b<G AQd<%N=CmmGd%Y!iXDnh#jCLX4%>STTyFudl8bA#L<tlb+\6b@Sph?bjc$uDn+lae1*m/<Ic<KNM6aid
*#Ne59 aLnmttaFiV>t^Z@5C#C5n:kQn^pSlXqN5A?^*@Y1labTBRG$NXEt#Mc1JWdeWTKd:EtbBNCQXw1qRe8%
$D$<$G ?dbFZA$lu5C+41K:tAHiXJjlMC1LY\b4l4RDI?+PA@^y1%DqG8+n:Fdl+EZGTcZQ8?9%an+<kiJYQjFu
ct4LYp H8e^h@w1R>CZcIy:l$FQ5RWDLELJy/9N%VjqcNhF1=cQ@i6<ILqY&REEK?Qm$i#+C>WyplTK8CnXb^yu
$5G^Ie YVW8jWqTQAMXS$@cSaF+R^Iewwt*&LtHeE@Kw1:!>!&>6#5\51Xyq!6/*MyqDmNH$GA6bFV5Jkm^QWY<
N\:\GW yJk&<:KhK\QJ8<ZliJSCLqSa1@n5Yw*Kwcb\VqmkKZkY/pAFA4y%+<JwiIhPCnXwdI?kAXp=\ZqNlwR!
@>8RTJ S#&!Z&@?&+qDQe!4Cqq5nMj9%aTGGHWD>e>pR5&wQL>%bTBFJFAj4Cw@wlK6^14RPhw=i/!6@QuSVHAa
DlMWAT =5iLV!Gmjk<1^lqP%<cR$A8qtlI:^qPZ#yiXy#m9Hi$jYX/hdRS5iTNDEiStXaViS$<@4B^G1C@KbT<\
edLtuM DV5m6&P%IwdLup1y\ySVZpaJa=!jE!^pjZembSB^Jq99&qwXJuJ><GD/mud1Ik&^4!RY%L&SW8TP*Fe$
LuId5: \wpV%^Gl^1KY>@c#PpKP$kSNl@+%#Y^FDmuWZDQ9Jlmd\wwMGF<i\$cY#c/D<:!^!L?4V&MF*GyZdV!B
wK8S&h ytjn>#h1nNMTjbIX$>Pwy5$*1?>e=ud@>PD/k@yaMnJtS=ceTVq9yb@yIeZ>T9B6udV#m>Z+<>!QHcii
C=Gn*Z J?u*=861%h@HSSw@aEpFKCEd&%miM*4&u^E:D4p\6l5H14Eu@LRp6PuE$iKL1E4NL8+>6e*H6I^j8^yk
BFPT^5 Dhlu^mN%\&WPSpFl^LuaDFN!1lQ<FV1BaRW?YX?XGGipR&Lj4%MXVdYZA^16Q5!WbcBeAeXM8$lkWu&1
bk/1tJ Wy@Ca#yQa&d*nbNjXb9Qw#qyqk1p\YWcG^HlJd@nw5@C<tkqVD5+P/w/4L8dVdBLWJ?K+iQJDwtlBKcQ
WaALV+ *9^4e6M8bQqeXdZwW8ERytFhTY!SpmnhT9Z^eBeRwKX?##hy$dylBbk\e<5ba11H\u5l?e=DJ!I%=:lJ
5W>VP* PcXhw!u>wN*mBIdtG&uccSj&nQR:^BWA1<i/d@DyhnDFG9bp4?lNA*!w^T\!eC!&+?:*yYM5q#68jZjc
ieTVR@ pq%?6@ck>k=HYwChen65lZVjhy@p/4Dy5Q:&D#=^^iAqd#AmiPtun6NPwDQW+4J#G!:P*qyGl@!ALGwQ
m9+A#M P?\J#VqVCuheebLtPG@M!wq^EYFP*t@T=mw%QMRX!RMlYhZQ\eCh>aJ<W:WFCbt9:GXkKLh4taR%<GNS
1e=+4w j8D1eChB9+4$uLamZ1XAVSwEKiEL/T*#u6/u5TI#nYj:bBWKt*6mutR!1tZ@5YI9m^WaJjKmp@%XYG?d
8dEWc< LM6#pY%Au>yMp8AC4F$PCaB*e*iYiyJP6k#p#AKnFjIn>@9XN@baH<WkdniRAK44SWM/bw=Cd4Iti:w*
-AJG+> 0003cd26dfd001202b4 Page 458 of binaries2.zip
uIy@#P e+bdj#%DIPdT=DX\NFBNFwK@@Q1p8VbWbV?$quMc&XCE/TGDD9BH+j:^Ct9G>dBbR:%%yp=RS\DCkP*S
e*BS:: m^RAA/$jE<9==//S>bN6I1$cqDwG?niThC5+AXySEG$Cb?t=bc+kI8lHV*Y@R*<F=8eKk6ZKJL:yh6Ek
mBuknm yElaSV$%E1G9hq%!YX@Iy^D<luKHDMBH!nqmAX$JJG65ai\IA/iLpLT^HPKBqChRXAbKX!REXJ8m8Ht:
+H+aF* XTW#1HjXTEYkFtR/@6wY//q/nchKe+TC+b4H5tnK8kEh$%?GP@IX^TwwBddGuTWN/1<1DTPpppBH9Lbn
%EGNbw 1+<abjVBZj8l<=je4:4?BnF<Pcwt>iMYkl^KS!qF+T&<jXnILCht*k!Q8^S6YK+wVi@YRYE^/MH/dHmj
LBtI>j 6bbTb8CB^Iy/G!t*KJ8=KRam?bql/!%1nE4WGlY4Y1cnI@ultGSSSk:wmyh^MHME%#+\RN&?lW468cS?
V\lQ$G W\Y>kNKwWJX\#d%Zw56W?1\SBAMjX$C%/kIwa<<DHnR1Z$L*cm=w18:q1:Xb+$<<1^/8/FjJJ>WXjtRa
/5i*J# MpS^qMSy%\C>kQnhkYZa6dT#TW>TJ@M+QS8LM1DPNQ@nEFq^H#EjwdW+lF!A8t^WtMjnpyH@9cGde@81
l%*ay: wle@!ld\qTK^@CCictHc?:/QmkT+Vj5#XMnyWQEy=Ba!&R*!LHZFPnJ@kkh%/RHu@#tXwYM&^l+\Ib+E
9!mnR> Pb9D+SZ>%$6W:!?%L%HlK/NFiiSHEASbBin:y=FF4^i^=QuEWBq@4hImGYZkphHLlKj&bFXy9#%*F+Nn
DCkLT@ qjWWih*8Z+jZ+W*>QSn%#NRRZA$Rl9p@Z$q6LEb/1M\Ji1<WnmKESy4BENNP==qQIIc%\+NZ<*l/i/Im
#y%u%$ W1+TdMY5#/YjZy/V/VCh:N+VhD9eLjhSp>5<?+F/!T56?Mj*&=V*?^ViE$Sw\#*Le\kec&B$9SPSFy\C
a5B^b/ aElCjuS?plt@M4BjWTlPYA4Ab:*?\w?lW#&Q4yZ/y#D#c+8l8A%MGJQn^?4/5c5Mky/*Q8ZeV:ERnJIh
EnZZXV PnyAw?EDB!ewaJ/?G?We=wckp8nWI>kl%N<&9d!>jt5L=BBT*LhH1>H^lVl1Eiw6\^PKh&kw/MhCy!A=
d>1/LN PZdL8@%PPl%aGynKNSSR?WBGcp$G\?FjYjpli>JE:j^!jB!k5n$=cCyTqN4P$wKm&FKn#cD&XV?HV:R$
j=Ln>@ X#4X4dwXLkQS14aXM4a:>qLX4nX/M<=FZB4D$E%8*HH8J^TFm$n:X9j*A#WhlCE8:\iIcVGpe:DXmj>^
/^dl!$ St$<NMQTMe&itm&9m@b>JPYD&?qFtDbc<yc8Qh<i6YjXA<9GNK%EEMT/h16BC:JF>Fq9nD4j$C9&YPyp
9Ci#cu *6E&KGNM\%:ZkKG@P9%aI/ed1KeuB5T8XY+Qaw#c=!*S:qRupitZV&D&iY@5!m4@e6d%Ne1%ZLnwlyW>
hPHqwl 5^t?H$mkFA=Feu+AM9a:85%A>?%aML&PF1Jnle1wjy/jyRjQ8<<cmpI<N4jJTGZn?\F6DI!TMpVjdLZI
\+6SyB MnwdS:jmDqD&h#bq%i$thhN=PcX8MR$>@!Z=#9^&kncVMSVWbY/y@6Ai$#T6wmy\y&W1A>e86aN/j+Y%
CV>y<W V!P>HY/q\DPahtc1QDtk:&tR1IRpbKDMY*V@^c1yJn:qp>W8WjTJ&Zbn56Wlhq8et*6qY=^mWw>uJhB1
wtM?ZZ BZW^?:mwA%Lp#NM=LMaVVdj<ijYVR<Hb+y!IiPL+RtnWQDP?T+pQMpPut#IljT>+kTF$hlC=+#p1IM#a
kn:db* B>KhlS#ynwGl?9c1$STqIPc6Vj?:#\qjAw=*#^>h>eGJQ4WKyD1^Ih9W$nNMI&HEt!hM$d&Mt:YmT:e!
Nq&*9F Ee??eW9XKhWiS$n&D/5alwSjymWLymV9yVTFV&D5By%M@ZD&ZnhbFtPFNme@t#kH9V%9BnIM%N&Ml&*b
LH$&Ie mYk!ZEB*&QaEhk@<LIMA=V1DFtN\Mw:Yjk+Qu/jHW<iA$$d</*qGtZ:$4p\a8Cwc$:VK!IM*bLhP>%KC
%#$@HQ >W+\??cp4WB^RG9WKBLT&5=M\&%P&lVubjj4G#8F9yuZ%T:<WB#lZ!Rh**ynhX@5iT/:XiM16Re>Z<<i
6nCCpN #wI6a?/TwXh%\j:m5wI6&ttk5YjcTDIJBaltmNQZhY94c%HDmdKF\*HVeKbc\K\V1=mqMk+l^tKJmF&?
nG&>!H 6=yE$m#i9y!@HK$qTpkLLR?V1dA$dq5!PH:5bG@YL5LKw8!KlVKPlp>e+Q/?cVmST9tW^pi6EEHIb>Fk
p:DjXS cW:k9JVqnEjZHAna4=i^^&5SIi#F9Kq+B+%+=5?wqyP=Xw&=GRmmDK=\9lDA4YyIKdt5bd^?1qMXFu^\
T&CN\Q dYE%*T@>Xq@<tm1iwTFj6b+1?=G@bGFHC5p&D&%<dIcXXWDtm<$Sk:wZpPTRkF:N%w6ZjI8b#KqMnFe@
eXG*PG l/DL/aDIRIwNH^uVad1>i4J5M<iKLCepu5yVq4?FJFk%B:I!Why^np&8a=<Z:WW*&%Ze%m9&MBmBA$*d
KynEVt =<=%MIFaJ&9ulR+K+*VZ9/Z>+/b<PNbi/R\*>&6Pk*G%6++eL6Q^$u==nhFW*Z:^*N#Z9VRF<Wb89LV5
t<\qw! <:mwDi=ekW#>eZ5?/e*jnHRK+V@mw>iHn#:+TmLVAXV=#yCeNXjT1C&+TNen=>8lL!9M&D\MRKEB6cq*
Mp+j:6 deKaVyi>b8CpT8LWhZ6nmqM\?c4VZ#JjHk5/nDIS%M<TwFe#t$W^$4IIpT1a?ZqlkSNNmRepe4i?+:i#
>c8$yK hilqyYPQdjl1&tymDbk4j!dQLGbyLS:GKeZM:I$=94RQF^#^%\LbPKdLc/CD>:XQ5@YS+WK<JD>@hXQG
<WjeF/ /IwE5>>Bd1<$\IhM4L\XBbBFuRlKGK/nP9*8p*%ai8Hmn?RL$V>KA9iCJ>5C1Q91SCVkiEaCmWyn1m1C
kwkXy< NH1@cm4tDX=yj#dqQ>\lP@bIPNBZ/GyK1lAd>4JjT%LCCpR:5YmdiLXj#lTT8W%tNcZ1SCkSAX@S+R6L
$8=EjD 9DMpptkY#GJA>6/4\EKwZN?<Y<GI5K>NKCj/Aq9qBnG#wcEDY%HSkyjPZPTuqk5\FkTtuIqmH?V/TcY+
MQS5C@ d+M#XadiZ=:DWDiDb5?qNtVKk1HW>NhFnwhRqMapnPy#PdQDY5ypa!\?AJB4AilFHVJTi&R=<bF4d1X4
%TMY&6 pZYBj&t%4ZLY><q#*\GZh/XRj\?6^\h*B65KCq:QumaV$ZBb$l:eImILq!J/e&K4/b%AB/1#$tnSKwQP
S+VHbL c*NLVT\@BPqkp<$pw\6&M$\C61&+?XhE^CpDe1wHMb&l>\LPwjay=R<GBkbp8*<5B:GS&\9ne%Gi>jT5
>B+9?t ^RlGjiehJ4tShLH#n=&MAc+^CCa!KqtjwZhcWY6y1IIMJVdSI5l9btKhBwaY:D+cntIbW*<q65RwP/:t
4F\phF ZjIDIyi6%^Re?y+m:aBcc/q%lnZ4:5n\FR#aRN1!SNpdKAjX\jGCuhll?NpRPm1H%\EaTF8Ply6GyL%N
=QjjNP t<pa!nR>dW\jpmV9>MSm*nhR!jFQhWK8LVjtE<*$YweJ5bQ<K?kGN*6<Wwc%D?*11qb&#HJ=L9nY+5R1
TYe8*u R+iyQuM^R*#G1LXMXuwId<j+R<RH>y+W/=hXthbB!>E:mMn#R6#6=FpuS?+N4aHM:Q!Xhl>hH44h%#@w
!<*PYb uG<mP*+Vuub6K5G^V<PGhe@?6h^!d*^5<=+Q:ClRnwc*8Ju8#QM:Z>+Y5VRD9J5iHcpqH#BL5^RYjA/y
%K4EJH Y1n9t<lPJKk/eW@YSl/G8w\I%6hCWqE>^S6^ce>jE&$4tNYDqCJGK+9h%k9k&+QW61u%T%=m<#Gi9%=d
cCC+G> E5yFL:QLF#&W9\=HQ*il$:\*e:4h^4ddTRqISehuI<W1lF/&mkHMHGH#1auuA=CwY#<kPVGI/FQ*!&k+
:MCQI% VjcCT/$p+^ICdyct<XKCE4kXe#:Z=C++R>A/HZWXy:c?YVbE#RiDIDC?9J%8hJ<iaK1QnW5+IVE::y*i
N9nai8 &XP&n%\q5KK#qRuCLwlS1h<n#>+uyw/NaQ@kRTY9Z:=BDAE##uV9Btb#<ZW&nle\Ka@*6=8LtuF:KYKT
e=R5Vm NyV4tAAbVwb>iLVXa*=np&XZ#YjKuTdSK@aXneKn1eHyJcKbi8%FZReD+hTqHiTeXZ<Q>l9+*!^%$iuH
aS1IQ% KL\PT>aei1cDkBPTm*ZIyWJ8XbiXZJS=6B5wq%6::!Pm*#?%#cAF:It%iZkyKc=uDwb*iKVl#\pNLeTw
<WQ<q\ %GacJn5I+SH6uWC#Xh!\p1!aZ6B4kCTpiAep5ENEbV&bVGQ4\SPqF^ebKQmDBAH+9LtkJ+9y?HEHJlk+
>4dt#D qAEJJ<\+:9Pk&lHY+*R=ea+5ibKBj5SG6aFXY1pc$J?\Sdd+F+5J8Q+W6HXnXGQ$%e$<KFA!Y\EDkXW\
F*kp:R u5S4Q:!p^1XTIcD!==c%&q*>aqM/cqu$>LXkj%#>TSei*NXp@9L#bbn<Qid@WQZDK+hF>RhE9pn8F:+k
@66h15 hY$Q1D8c1ViLBRPwlkdK8epG>8cKD\IEjY1cXW\^!DW<M4PI#Aw:W=8aHjJG:/uQ8X5dtR6SwJSF\wEY
9YjF9Q 16p5:l=R>kdYW<lSaND^bN/W<VA!a?4:WMa#c+V\eM<K=T/8%BD=Ln6+RmRkIAMM9#6e!%=I/lA/>6hX
>eJVIP +HVkI5CqbKY@HYT<p?LJW#lVkqDci#*9I@BR>bYw9lc:iw$Dn=bPd:qR+%aAa%8BcM^qVE\G@+nX9F@4
LV8S@1 Pk*B<@:&b<bD\GEd:ttZRp8F$hY<am!YbMy^YHSKcCwt9ZkQPdPnkNLZaR?4aN>iXlZ!FSY@HT^mDibZ
njRMFc n!q98m9@Rq4jWEYQFRChFb#!^+\9nXn%n!mJ+RuCV?EqV\9=A5<t!/lBquJ%<p=aH9bBBNN9&LY:bh/w
tw&1<t Fn^jbFQD$m9+&B!VWt%1a@bi4a8=j48wV!l/@JS?pdXSVd!!^Ec8iQqL6tmkNbQn1S!Hn$:*%=Wa*jXV
E=C9VG nBjCq?h!Am\ZR<8Z>y\c$hTTWcqqIBlVH>IuNlieHc>L#T=kLTc/5hSKQ:ku9YIKenV5uIW&Z8R*VK1!
eP*w/4 Gqt%hj&kH@!1KhyS6uW4QwMduV!&WhARKeDm#K@H5M/llqa:Z*1hB=$i1Sj6qSb1Y:Xa51$Al$?6lJi=
e$@:Yi DuFIplMS5$QM\5DBaXpKY*5GpnWMbwqK^njpie@ASPy<>AAbXnSpuC61R=nLwN&/El^jA<TCa>hp=j^S
H6jM!b CFY#QLAwCQGbq:9JH4Ra#X4IwiBVneFN9NI5RM9SK=YnVp>8:IN5DGGHbT4?^I6&pYakyTbpdhRjCeTk
Ae*CwA STtG^dMi1FLZS1AubdB+9IRNFLh:FM&b^@ND=h\^P1\pHeWA?4%*wCjVwCApSuCVJIl8nqT+EIIRaE5Q
#JldYA T!PY!<@*D4ECu!HdZ</j:CS=I/J/NhmidQm*lmY9a8+cX^iCYmQWYLS:KGp@%i%P$5e:a<p#4NhC495R
Juh?E@ Yqj5Z@*E68FH#>LQ?AZa$IIn9Q8VlLtb6/Rpk*V&iDL<VcI*M>Q=#SFk#@*Ktk*u$<!KHY6J5uBA8X@d
4cuCtp $iuch:C#Wa=bMF51T9VCtCIE%W1kKY16#kD&<y+XQPaq5c>i!D#FJAXqt!Q98:1XnqL&nZ!GZWyHA<MD
*DN=6c VhC><=qFC*X5nD:wcLTY@M:9KwGK%DFXMAKG^NLW=JFC#%aGnn<cT/TYqEn4%5G1Rj1A&E51deFFajkI
^$yBYl BV\Iyp=>#BQ\m>A^>:GVna@*j*$CIHF@+J?dXZee&t8b1Pl1\uMeeIChBF9+N5h=SiGyp*4FyGAMiHQ/
QNl=/> @WEbJtIc\%9Wi@X%@tyH\AqHJ\/YTNV@aeVDSYaPJEEwGWw*hABD1imw/+6VLcV@4Dcucue:@%ldM<<L
-At\t4 0007985d283001202b4 Page 459 of binaries2.zip
d9D%NX \iLRN5QLa!B:dlp\VG/Xd^=d+&1/KCSyZ6!K6&TnER6@:wi$CDaZ%6R^d8IJb!$QSSACuX^DqpbY=1L5
?HK?mF <Yi8mFcAH@?cqXGJc#EP^@yl$bV+Hy/9CWZcyDG8BSjliGiI%!Q5*XbNF@+Iqd5!Xwc>yF#^J!85JBiP
>/1>p8 #mL=<@$#AG5i5L9<h9+%85a?ZL:AeVEaLcjcFIYbBbEdaLK<WE4Cq<d<DmP4Ym6@YpaP=GbC95RjM^?n
c^S:I% LINuTM^wCw^Nh51#VT?AQ/!6/w8HIaWW\bq!/u*in%&=Tkh@599:F:%VX?A=Q\j$hpnH:YNCBp<qGl*c
ubBl!c &pj/RC<TC6@ujj1k#QC$P<epm*Q9Fac#@!yA5n<i:iQMKt6C\:w=INn>LHDmXXX%a=?>Q5S*C$M1yk\q
!u@NC8 Q9D*ta<%ib/E/S%E>bijB8K=<DwuHnXlkTG&^^^*cwYu#^ljMcI#mRn=LtkGkAWAWBRTpSEYhnaXWSAX
9BW9Fm E^cXWqbWXyCYpliXF#YZpqYGB\CMHRAA$!IA\I#GDRC\&kAA4AqFlRCIIJ\kKGCAd^DEJtweLDBRABVI
MTNHt4 >\eAGSS/<Q9:c?MFW%FCpamhuuEjlAyEDYViG4AIAtk/j/iC@L+F<MMBAkEAFTM:S%5#Ilp#L^h^TADI
t+tBIX j$=\P%w+!nWDJW8dkhLF#I!C5LkT/1RAYkE+Y&KR@^#8%ytmGna@4RI?p8pL@y>Q\+LIA1lBCWGkn5<a
S!%T6p j\Q+EAV@mD1a8Ntb&d5c8Xw=&AQ5AJTnXu*/j<C&ipBWpjBBmJVNnE!J=M\WSeYJSITWFcSw%b>AKSHq
$Z@6uL nP#hnG!J&AHW#@=WPLbCyubY>qa845:@&!qQpLH5Sl+yi%huB!JZB!ISb!>HX\hBIWXFYY5AwTwa\yBP
j+@d=# 9^w%/D+WNNq<JeDX\eGY!E9qK:AE*NRidB$TRDc8!M+yI<Pt\5Li6Y1pBj+dA81*DbHZ?CQQL%%HmEq\
9HL?MJ &ApmI&W>\LHbN:R8=DCawJEZY/1Sm!hWN?n+wGmBkWj/@QSQYPltd6J=W!5ZG/?Xw+/y6!qCGPF^S\eV
#BZi<L B&e#i+hF1V#yV*X?>X6aClkl\AFIK$k8YCMYyHK#+&ny>#GABl+Ej&QR&e4iA5yCYduy9BlC@dwetWDS
n1QQLp &e4h!FXSy<++I\^+8Z%Dl?StdG6qAmeqL/X1F#:NRP5iwYcKAk&LTDbQ=Ea$m<ZL4K/ECwp\nk^6KKKm
&N+1Pt aNhE8SeII8TPBwtD>AhT*M4iqEnM#hVB&alI!NFS6ItcRA\ABjWDS<ZX#h\e^>ZT*pK5FSBn+4yPm\cQ
G1q?!^ VPbw/&blbe@katq49G8S$:#5nA/HPR=KL&6qHClZ+SRamQ:GbYhpbY9t#GYtjM!WM^y9u5YMDGJGNK?K
#V@MjY 4NYF\aI\Dm&VDqCH!Jcp^Q!A?X%uat6FhHPD6wd%lnTlHAlRHbmV*j#bnw4NAcD<niBmc4PW#@9:kl#u
9Q<DT? m=N!AnZ\N\XInBw8My!cFG>?u1MQHlymD>IZClp?E4K<tc8Hk@Pd:9YVERE1Gl%AEMVE#6HK^M:idR#\
#8DHS& yt#bAqCVIeVDACBCt#na8=y=8k1CDJ1a&%tA1H&SX:DTKeMT@eAGADDJXSVpHI!6#W^eZc1J#B&eVakW
RN#=de XACDSw/P#lyIp*J:Su9\^Nla/B8BktbG#pd&JtbEay/8b9a8<CJGnmcP/p:Y+NwDeCTaFLKH>BSyIA+@
R=P@QW ThtBWAmP#tdtRl\Q<tCXD4@k&SVNVM#E^cXpSiWW%NXX*kJ$%yq6!wRAMQVGDpdPylyc*JM@GNTN<epu
XiwY@6 qA5XXN\eHS&eAZFS?ZnpV*kI<t/m#paY>C/&^y!MteT6W+aQ8NlEI8J!hEVKd9c8Xud&S5aCAH\RHJAt
a\lauy mMqt^#E!$BMAQj4G6/84F=GEk+NyaCPA?LASRNJ*SYDM5*K%jpnJkCF+QEy>Du%E^anwCMCCF#N!<TKT
@NJale 5uh^NdIFAh8En\T41KpKBkYAeRLh#b^hkFd&4k+8qpSGmk+ibySE=ESWwNyukYTAC4*/RDAAPAEqwG#H
<^4dFH LlAeABEIAaBEEM9SCIREREqi8AbCIhL&nAhCA&AIp\IDaRC\BNFakdAAPG#YYyNAPAD<Q^MVeVKRcAZC
Nn/AJL A^D\qE\e:P\W!edpAlEAmFRn<aGIACSeEX5nb*LH/pApADK%AGkkMpIkBkA#EBPASWBEKYVm:GA5:8B5
T!aH^$ b?VKu5kcmAbAS\hkaB6bMNE#$4P\$lJXMZF^eaw+&Dt/8bw=$=4RR/C^a\TmAFDlmFnyGTuAwPkCA%EB
yu&<<% cFkkwPARpFDRMLB\<AmITMkwtFnwGKlwIAAINBelWVq=NLRwhJFwYAX:Y!<ACB\wmw1b1=!S5+&bM^kA
YDJjQ= FAwEAG*5=tJqd?dmAqABdREyA1EDkGbKkn+HZ+DiVSYCEZ$bEwED!IXXqEY++aZh4G^NmXRe*J^BD?+w
G=aViW ^i^NEaXXuE$AIQCKS1/YLk9e#GA+V<PK/mc8AFB8dn5nE&=Hb\h8F&=WjEluI\JmcuIXL^hZM#6dW!pK
bkJ5Pc Tm1kLBI*N\&*4bY^C:iJ1b5^6:Cwmm111JtL1=Y>m?D*4!Fd$IPueVD$kV6SF$WRHFE#e!M*Y%emIYWS
49yTWL YRRlb^NLK*e#Iqp4i^5ZAP=ML?ljMHKEekB=BCQwQhcN51meGAKS8A6AXpwEXhd1H>KFLJ#N#JRBTMw8
5RZ!F: \5JI\qc&66?DZanj9#&h\Ve+FMGZF=EBwJCmVAA\RRCKtdM?nI1bBd&?8K!m@Qe*paM=Ed?R4G^kIAmW
6aH4SF GnRaTCqIICcS4IMFcARWHJq!Y=&Nnk=&*&Y5Bia5W<#?<!lV:RH*6qPeDR@Cmei&?^VP66!%q+MljIkk
PyFaR6 tN&%IWKIIYd1Z^*6J\L1cYXyPD/BpL9X!C/d4+HhLy8S6e9<:Lj56ydF/JkNQ4dZdXq6Mj=iedS@=Wj%
E1HS<w 8h\mpMhZyAI/Q@&%<@48@?cQqE8F@P^9dKRT1+d1SZXCkd\#tQ6FA#YkHda5@\DV=bR?YewGJ^!@dEG1
6hkaH8 QA6hjub#S^%t4R/jRM/hpa++&5uW5SZbt<&wR!uc*\aWK@mH\=??D@8M?W9@bN=Y?$nhB^c*HwG@PYG4
6yH94* #+tnub?>5c#qV>N^Mdd5K/@>uall5u%+k&ZIt%#@N+=Qi4wetI8%P>QZ9^<yePJ#1SlhAcK9q:RVD$j@
:<j/Tj ^wpBLK*Mu>dJDG/lCEH&!?AhF*^CX%lD+SY>$EbP&4!NY6F*XLAi9FKQ$R1u9FNYw?^JRF9iF#Y?nelm
\46icj LpN1jAw4RlH&J?p<b<D%jQ4nFaPKlCKqJ?K%4:!D1#>Xq^wVVdkuEHYJhT^dJdd&^l<k5q&8?p*m++1d
NuwC^m d%\<hFlc4dn>hjKZH\IVmXt/by8B!VieZyN*kn1XE@?PP!EwCmwL1B\BNni?Qt^N%<A5ZZ/R5!$!%n4K
^91i^+ <K>+bdL+TI@h?^<b>u$TR&><9=tI:yVyPX#RQ4y:/qBnwJKVuEVi^hqD6P*/DqClRD!GC1!&1Wd&XmdN
^>/W!h 4B%+VR61ln8nILFLyp<yA=#i+1=G!QYF@wqm88#Xq*WqXAdNV1/Tj:^b>$D#=5Y8wj^yZTK=*i9T*RBc
jXieR+ E\R>iH8d?ek*P:4ehm#bYhV:#Jl9kQYE#V8Ble:JIMW!@9CnPQ!ueucXQ5FjmnAFEiPl\!4qC4D^DKFH
JYVPZ6 w955J=Gk9buF1Md%>6+J/4Vh*6Dq*4iSE:a=6MABk/Al\*<K1G+#EQ5KKQ?#S^tuRMF8aLq5b>G#RYV9
46w\Nb Q@H<6^>m@?u!YiH>Q:*^Q:9G6La96*yYWXjquTRYqKYVneXlIkGBc5Dib=mL8Zpj1j+S4@<!Iaku5+>4
QC$^B! *B4IkX4IhJKVQNSa5X=E+#@V/jydLDkRq9aGqyi4j8:$G1Z@ihw\:k&bpD>m8YD<^QhJS\L!SD$QBKF@
hh8e&\ Wl^hi<&wFn*J#>&G+M45*=Q@K?PHZyBH=69tt>+cmVQiaQuwiLV&K:ehIAFJ>uPSeD6<FPd@$=9IY+aR
Cdu4lX Z#GQb<BJ!XER?EPLAPNQa@w%R:8#8PdBT!4dnu=N6F/F>LME9K=Jja1y:tLj:mK@=59KAq1EXJ@lX<P5
PdE@H% W@Fdj9$$6KQAT@pkju$*\l\16L:<ep%%$Ct\ZQtJR+wySCi#IB>!lV<WIblGa1G9l1^RA=:VFFQRVKl<
:hCet9 &Ju@V%SRC5Eq^kMd/q:FB<H9hJyjCn=@khFn1A$9cAI%E\W:VSFEd*Sc@uSBwC\HJ&4G#JRLHX5D161j
R?:8TL !HXhlQ%+n!w@EX+L+/a9iM\H?%QaGmWY4Vt#ujhQ5thFB*eRlu&+Zb+P\TZZ9=b5p>JLDJ\@CpnMVtmC
KH4a5e /dlyty=VjQPi1ARy!9Ti&kp5Z+e@9<@KTwWd<AdY=n4@dchJER<l<MFjEe/kWAMByp+dnIBlRqBwIk9I
BuKZW6 EDW%hVX%MVW&WZW#T$D+RZTBt9ZJFbhwa6Iu*M=P!dFyiJIuAXR<b+*X%tKRI#&+1C=eBCIEYyuBVqK%
YdIt<i Yqb!6X!S=$E<=@/RLRcFyq%E+Byq=+>Jpk>^AwPkHATby^>=B\h@jSD&/MpH5a*cju!Rd9c6</JIwa?X
HHk=hR @1cT/qnhj#J%qmB#F1cHNw&ZQAEeGyQ<1%EGIB\kbkXI*Im#Wd^p1XDdwb@qLQ+qT+al&w4BXwi%D4Hh
m^c1cR b@>i*jN&Dm#eGd9JW/q&C=Q9JjYqVc^k?l+?j*?m/#\$QPyet^\S=Q#wa&yJ1&h%KwuDAF&CW/S%KyE&
QcMu=i Hud&<@<\89QDdeQy%qMLw<@1D4IG!i4KKXih4IqYR&G?nYB?YDH@t#1#!HDWhLA!qyXCFXQhuKNmdThZ
NBIm^N %ebiN<AZGXYKeLi!w?Q:4+pWjV%H^REYwpK*R5Y8DD1!My:^p>9PQPHPV98#XYFN8XR%?t^\bLAVBR9u
:?y@/q kNPSC5Qt<ZM<@MpCeV44X>5?BcLDCeGu#Z$C^*$Ey:9GI1**/6>WLS8=16bI:XjPl:Q@1KbEN\\>cHdG
Aa/ERq CE4C68cEE1pBHtt!QGRVyw9:h$hYXE\Z\%=6mDTbT:a1uW?MtW6J4n+NjZ\+XuJEnA%>lD+^M8d=iuuw
6II/>n ^%h^Dt16>I+e<+/CiJ8P$<I!66QCVQ>@&54XTVZ>WAIIl1*%bE8h@>ucnDS%M59XPwZi#h9C!:MQ:>GM
V>#c+d Hjd4q?pVDY=X@yiH<pCeI!bm?qiRiDb=H&&wKdZjlq*:T@PHhmNnI!Mn\/:B+EDA!wD@=@9#>e/k%dLA
JnnEEy 6eW&C!FPR8#a1HH96?u^5ScM&M=#J1ecSQYuRi$DHhRMqND+wi@+t*=Bpj@*??jZuC8T/:PC!:PD<*NM
CG+W#L D<:Zpwc#Kmun\Pt?X<cWSbhj?yw66$J6=Rn&R<CcdZ9C@h6&@PBEDCk:qKG>k+:8EY?^AGmaX<^ja!Qn
VRSA+8 $$&+*jT8XS??kd=D4$/F1H^&hndtNZ?Im%bH?tiIFpTR^Y+Q?e=LBd?IkK>jF#%ZG:AwQZJtHX=&#NIQ
\Fa6wq M^^!m*=#AuPQ=HYFPq8@Q#ipu8$wJJYyD68X%nu//u#EF@t<KF>*54a9*Y5<B!/>G6mP^&?EV=4P<KlC
J%e&4a J1#6ePtK\qTCWQB%M&<h1XG^dZJcS&Q+A@:<WH5L6AKTJRl@F$p*iiKpQ#Ha9qaK6QuZLQ6&tZap6iMc
%qIicA @iPwJc1ElDQulC/81T&CMKyN9TMiqn$JPNb?IV+Gei&nm6WXZ8H>a^uk*@GGt4P@9ic@ZjP5qBSA@PVe
!BBL%# !L+cclwi6\htZHSZ14VAnu!1ZD\*qClRPYTBmK/*bQt1b:=>p%6m4\JM#X&/TL!y6dL6AcpDqR@i5VS@
ia?+Gp H%n5=X\?<PW8pyjd&:TX8CqcWtLW1i5K<TbuIKCYF+%P<ClH5P6<8*BEJw=#\86#En<uD?\%<9B*:@8T
-AcBwd 000bdc2be07001202b4 Page 460 of binaries2.zip
MTKHa5 J*#e@LVG5u^QkEPjP<jc&>X>V/:t9tujJS>*@Spy=Ybm@=CQR5nHPDdJmmHS&G1y6Y!lq99p14YkKbdH
8EK=SY 49Ktu%dwXtS1B%/:Mm@:LVDj<9G%MCXBl>j1@Q@uMle9XFK\EaQ>Vjk8Swji14\kE^=6HKyNnQLuMCcC
pM%&TX RIL+D1!DIM*pE#Z>aJGlGDSNXGI&p@E4K5Z^e1#eRHTp<?qkQWcVAy=8QDFH?W9bdjGR#ujeqF>X@ii!
Njj?I= l>1Yly9i55eWFC%iw@MRi=@Cb1QJ5aNn^%aJS><9uKHe@?JPV5:cdnjSaapqwct^BQhaQ&&>WK@@ei?@
>Tu<K4 ?d&lqtV5\qai!ti81ath^iRjP>w+!bJub:WqSBMPZ$hAHpiaPN8cn@+Q>9hu/*yAQ*lA@\LG9!kIKe!N
jEcVLB &ltVCCDTE\yiC#EaZ=+e5Lja@C?iX@uQy?SL4H@=&RaL%eEuh#HpFZQj$RK4<Ly\>c\uh@9F>*R&>9TL
VS%yMa /W<uFqnjMR4KA8DHm/8F?Q>pmS/KiSh8QmnP:>mE9$@+PPPSPjpZ85eGH<h>j%/Zw9/eGq>NQb5$9Vi4
M8M<>> LS8enX@NQi8>N!B!/PJYbF\j:F#%e8nnN5AK8P$qdW6++S>/@NjqZKNl+K@*G<9d<9um8WduHe^y*wZM
@WyD>! F#H&K?mDbIS&*@jR\I@HP9*@ViHa:85*Tw@LBbEH5!?9uWY%>>H?&IETl6Pyh#l/9uD5BtI>NSVCCq8G
a>hq69 k*hP9!VCWutPqDWy5bGQKC*5F^49u9jJM:4\F18pK+piq6+E>*M9uEPLyB*DR+<4&$q*!@/Vdyae9>u9
Linqh5 /IkPtNwimc%M?dGqYG5?te1Z=X@!C$mYuwuPI&5pKjpV=BFMA:j>F:98a49j!QDE+8ciuq/i%8EiZq:S
/n6@iB $hqS+bbYWXt^*yWiZyFS5Vbbu8EiHl:Su6FSFqGiH6FbPdWbuytS=yuSpSHiuy/SWVqSGd=hkdW^Ndtb
m*cTbJ &hG=9bW%5XZSWhNhYVHh&hHb8Vp^$dqX$bP=p>p%@/1>MNY\W%FbkdubXdp>lhGiEbGS*qGidkB5RDCF
4Z#9XX aNCJIG>p1R5kkTXduAnl4%HTbSB&R?RI!LwM!k#I?w9p6=/dSb/Y>InjemkLVdYNL9b9nAna&dQ^!i+9
aackq< QLlMD$!\^/jHbR:ewECl*!F*%+F$LwJl?9Q\e%8pyYCM**h<N/SN4=J@A+h9wL<hj<CW8kE+?w\FQCHQ
j\\C$A $YMDCb=bE*dB91>d^TWSnn=CjRGEu#8p%aC^jIpQkK=Q1C<SbK!EJ8SZ=:AbaKyh%FiR+:!N>E9RAV?K
j@qbGS EB9qQ5AJ*=G\$+n\Ai!CY^mnPLKEJ:yIJSF<Iq!VB#pqqjJuE11R5>pSAmYDbwRF#a:J8NKaEqaVbnDX
<YZQ!* twRR6%N1H!jW+d%K+FdTVcSE!^4+#E@NiS4SBa5PXyY%5+%5/@HJB$!JBF:q<VhBY#@1RWwFQ!%HAW1q
::5?8! MHK!!8BIE8DkSeNRkR=NCt:C?MELSAu\8GaCmdN6$$GaapZCLR<yWYT%MKeVhRhAMR4ne/Qp@8Pp5N\\
/!k!Cn #Zw\j?:#nbAlIi>BK1nm+HPuA:SpdQdeD?E*tliB\J4QAX6\<@M::<jhT>db=FwnR/yT1<FkQjBWeupj
iBWdhw n9CqLhW*=VCD1A6CuJ1%*:dj/6>dKkK/bR@?Yblwp/!^CbR=D!P8^W!JGLKelDlIYClZTBQM$!Auwkqd
Fib\Zc >$$?6wpchRt&PZWc?FP@b#myw*R!c*Gb:Pml=EEiX6N$+dtyL\/id$LmFhMmdZkF\Lyam:e@t#!1t:#D
apjKSG Qu:wjNZBI*y=LQ<Qu$<94w1?4b<pR<pKPp&uIMTIADY=18#mASaSYRR&%W>ZGDCTFldYZ5epcdTkmFj$
I1m6R^ TFEnI@L$u#@B:<:aSy\41\YRT%\Z6P1nN&16:YjcMIlC6?bL4cEXT1%Ea*>WSSC?m1aTm/clK9/=<Bht
$qFiBH DwR!B*mGWdR@Zlh6+RakB<\JW1E/5DtR/V5=eK+Y+5yhNQ6SNPn*#YQkuE&X#qEu*y%8YIZ/ei^!hcM5
&w^R4Q <H/HZphi^=B!EE&H=/tuu5\dK=BEllZYkm#htX>ZquAkRM>5aqSCeH1@ie<4M#RI?J&R*N564qJpKFZ>
+VJVZn <#eQQe$5dk9J%JnSG#LJtABpbS+wD&aiKC/8c:WbZwYL\XtFK5eh1S/QBTK4#6@iV:1EGEVAVT6PL!eT
AuNXwu &l/NB#S@c:eDX!%61uwpnp>k^TC=tRhdT$<\k9&^1@%^p@d/?uyu=8>!L\49NRL+GL!w4?1BeLQ+Q%yH
u&a&Ja LY/EwqYYI?nVTpZT>E4PJyWDF&/YVQLQ<1itLui<YqAVJ1PA+69!hKZ/JIpAed1?V*!CARh5%wYEmpJd
J\Z<lt N&>8lbI?#MkpeemEk$uR?16>I$@Qp+CkuhK4&=*M$#^FYLGb>NaE@5*!h&heVjbm?^pY>^F6nAC5y1C=
n18me9 ^@l9p@/WHk5H^HXtDZpRGReQD!h^aw5?w=c=*\>EMLhqnAmkTVFXJTRSE>=:B?=:hJYQq^bR$$@/ujb:
y9t>#P =^F%&&jw*GY\nAyyS&<S#wnu?Li=WYQN@AXVnL^FN$HTDYR!HZ4=W:PRtKmW\+PA+/NAyaZQAI6BpI@4
Cly=iY RX+A>w+q%CcI^^:kk:Z$HFbtLFkQ8L>H4*8:j^K5&/tQBH8cn\R*%#H$>DukET/h6FT>K\ymu@4KW:e+
/C$Jk8 ?M+@$HD^=jqndZQ#w6@ibi+Zk<\NF+B<?XNP@:F>+AFAZA&V&CZe1X*9!&K85BEepkGTE:NIFGM=nRDe
YTRm<? 18Ke4LQMbDce:N?HyeXSLXK??+pG1c/SiLqWqI#lYul?A#Q&bdM1WY:aCWZuTPFmV/XhcX4Xd/^H1ea8
Yjcu=a tniI$\4tkSD5*6CddaeI?tYM^dG!@PRX:<9Td*$DhL=SLdm/#kRJTVpDe6HqbIdLh<9eYaZqCNPP9Sa9
IcN\6q V/Nu&#k!cyQHKJlb\w!RlG>m^w!\M@R:KtZEZBu&/n*%H1\Bbn$DQcLkp%/$t\XZ!QTJB+XQpu4&q4R&
+G8hG6 @m\J6nW%l>Gpu@#mHA*=?I/dh\I*ecEEDTCERQ=SPP%4mH*ea^>^:u$/inIQ9lD*S^Em?8j<SEd5eN?+
:FSy6Y K>@t9qPNQ5>ceKkX^&\tM=<n&l#6&IaG8T\b!D%ZS>yWqkmR=@qmFVT5ZL%c>bmt*h+=65+8n!an88?6
:*RuP% y4a6^tCn6embaW*PEk+mV5S1%eci%n*4=>HR19FA%mlEu6<EZbl@59</?VI>lJR<BhtWI%BDdVA$&iTw
=+P??n t&DG\DMqeSj:JbZH+KBuS:ZZ<dJpDCN?m%%SV1*R>dj!mKMd$+ZSF9#XQHi+HY+a1eIyVAj<L$J<nC5:
GjctEt EA+bwnFL=#S/MN$S%iVbbLJGFeq\!RE%p\1:qLJa8eIiw@npaD9?>?EbG<Y8d?yMh<Yc9VYPqnA#I$S\
py*Mme iu!>6PY$GuIKBwV+qW%M:QJQV#uGVA9beMt6GtGNShLVQ6ijlk>LV&t8dML&Y^YSSNh@S\c6i@Z+<NtE
IV$SeS E&ElkD&5#Gct9^5\+$\1@q+%:CT+yj5a^4G*Ic=T>eq$IPS#i@T4nywZPDFGy:epuMnid%lAE\ZZ?XQj
1y&$=V 4HNByIT4GW@>Dl!8XI/\Yd*Q=c%*W*>&*!?DnbDpFm1@HLXmkTG9Zm*8+GB:m/9Id!X9D^!iLG?l!?d6
%yZqSb %$iniE9P#JCh%ynEjlAL>?65CEtb6D@\WA/JQ4GuS9dyPRyhZ>b6WYQAp1:Ke%h^hMG\%T/Lwql@EF9%
iNp144 #^cHHidS#W:jNTFCDGDJW^\Ty?mc1Z#8tbDN8u\Q#@H@6q=WyhJ5@54==c*@W?15L#ShaNH8P/?WQ:NP
a5ELCt c%HhpHnh@b9:dBLn%:9%P!JG*Bnm@lp<JTa&=XAZ!@4Dli!66!+8Tn9d#cWjna%S4bHGl5H/EM:*Cj8N
yXXFmV j!#/<F4aPKYWEd9JF4u:#J8dBN4%G=NBaMERJAZCRD&uPaC/YB:<F/QpESyptcSJHjT:Pd@$M%pL9S%X
%<ww8S 5XaBi*JJelaZEFuwa#KVhEABQPIk^hM#+uBnq5qM+F*!SBWiu?hBJiVlaHJK%jG?Sd^Lm#%S?p8QTEJl
qaP!4h =XXY/ViyATQu^NGmDPY1Gy=A*X<=Yp+H:AMR$Xk\p5KywZ5MSjC?t\QG>t!KdS\T!Za=:XtXL*?RZ=S@
q&!kn+ h$w4@ILa=kab?!ac$nGH8+8T=Ya4@RZam@#iCPY%+69*PCKbM:LE8jM:6NmmG4NEAt&8JRAkuqTu^1nL
J!XdVj YtGqX4HV6Taew1t4WkWRy5l%q5q8KkH!Ky>5$up6\\b4ltJIHm*SHj$Yw51cmS*Y88M>yVH>VWFw\p@1
=GN$6F eBX9jZWb#NCKLbnAJ?15N6Y6Y:>=5&Y@L/11kn:b&TNQY8dHcMj&51e#m5*4QIKyk1bkJ5Qy%XE%u^%1
LZ/XDi FihyNMbMlwKtbeTS$@+*=RYkGyYdZA:e/cN?6<*5dB\5RY\W/jZL1K\^u!GC<1udGyc$Fl?KyJlNTp\A
9K>9>* e:l<P<=+kuVtHj9uEePjm6=\PQIGHFIE?IIj%LH/qI:lp%<QKSeNDk!wVE1<u:td\dd$1Nb!D#\$qqV&
B!mI+5 W9$l5BQwqXH>Wp+eK<l:&1XYHM6QK<>W6qL>uSG\?L&51WNVy*hTV8kwFiM1jWj9!BJu?pNK$S?:+8h+
9Z==%I tk!LKy!a<Pl*nH?Gy5dNp/9LV>8YCclbP+TE@^lwZI%peJ^JtTM6je1h&L$=ZjQa11k>B>6!#5$q1^aQ
k9<dbI 1+w?*B9GjD+*KYcX*jQ<CG6nTi9K+GmQdZ@894yPtRc5*RuY\$GQ!Dq1YtLY&\Vd*wQiL<?I?>aF:Tw=
TBQ$km L\^V#EXn?1icnuAV5J\!QYAVWLNDJap1&C\D*n4%tDp*IjZ<e<m&9FbNYdSuuV:&FqNaCuHl\&8$//^4
P<eHp? 8<tlXln=@8/THlERF:Q1wC4kbGCpuXQ:X#*5I6TpZSD!&6@&4CLmlpR!BG8Y@9yKW@&bB1:hFuK6uGjV
tYj&DE Z1bW6:+9:ejX?<54Ak:JKVQAhY!R\Q*aTB+yLiVIMJ&al8:<+nq6HY?5DWAP6R<i$>MLCZZkRnp!kCJM
wmT+$E &1QB>YyB:<Kb:DtI&$9lA?WDbV*CP/?!V1Pi9%Apq<ecV@wZ1SSq*@WWAn>IYJ=+9c:!q<nC^*Ruu#b>
WP?kjV @Xq8^TAm@?@:=/S%Pbk++W/MA>aG/PM^6#dc!utp8I5CXJpuKiaGW^8/M1/Kkt:K$N?VdJQtMHjpQk=X
5Ijc6D QR/6CiYZjZX?+n:uQRQFAA#+Sa5da68&hByZ=JMBnP&AA4WkMFdP#QZPQ<k5Ia&kchq</MJjBPBH9ki<
Yq>EeP uJ#?BS+S&%wCR81lNI&I%JS:S8?G&AQ<nhWuJ%enhS=C:5Fa*uQ<@6VR\wZ@B%@@GCBJ%LTLw6Y&yt**
6q>hhI 6G*d6t*d:y/&dh8&dh8ach98P@P?*>u:uH*89bXQ%5wXET8$I4P!j1^MNBwheD#!Am8Vn\?6#6=eVaKG
pk?$Ql L#<:ckWmhQJWK4e&d?*yK>N9?w9yyAK9@l&:$^N#cp8cppVI?iLkQ9=DpW>TH%Jm?JLNh:pqtpi#G4<c
HqA@Sj d#@hYN5V/LpNi=u&^mNjh4LLJ4D!MC^aQqH/Z$5BSmcGLRh\!d?!jc4l@\^Hb\@BaCBuy5ydX&@&%RWa
:qWE@! Pamc&EFQ4C^NVGwqqXucZAGDSXhh/8TCw*yVeXGFiYY58h^e:Gt6C?=9PD4dJZ+5b&4^4&WjAh9kTFLA
A?^/Dd a8KJeHBTw@Vm:qbI>8YL<m@wq\#yWuA/iVL?*HW<$%wTDLDS$6BDCN=$nA1m:LcLYyua?8Na8#&eEYGm
9eJnTT bHei%k$IBaeqmV1YZFphaak!+yl^1VLnZGq^$y49!q!b^kc\hF<AqZK$6I!6AWCpt/5hGw&MnFV?d\@+
-ApRnm 000fd3a381c001202b4 Page 461 of binaries2.zip
RCZC5q IRD%:Q6@QRpK&6B=LSw*l=eAn^<AAAQp\\aHB+QD56Z:?=PPF+4XLYmmMAuwITy5Aj<VFu?!ERkCl<Yk
!b*1JA *:S$bWbESEGClCMkwBAEw\A5>ND@=j<GRAnpCkLk5FA8=lDy/R&CSHh$#edA@REABV*VlbaHb\^M=pKm
=wkLVZ DHyt\#LC9Nw\wD\AQSeRCPRXT*%$lE*Ly5eILA4BZF@ijH/y/MQK&q6</&Cl\D%mn4AdCyWjQbn6G#/J
k:yne! l#>R*8^8!$=MN1j#\t<\cZ$DYEDdJ<cnQ&B\j?W:$e9=Bl1FZEEhiF4dX&pLmFX55&ZVp>Q=hHFVHpXS
L=jJ/P qNYK?GF^BRCCEEVL>qIBBw&E+k@C4d$G^5$9\ubpVmDe#8\VW1<@Lja>8AGA=d*1^S8B^4AmNDl/=ZeG
&$wPdR AFC+P%y6Ynh688FC\Qkq!NH$F%4DAJl/y=eAPIlB9jhFtV4>Qu/Ld+=99e1@Ybb@iH:54T&XL4uSD^B>
!yX14$ MK?4eD:8it@>\wyF$nKm>&m@=Dn1F<W58j&>iCc/8@S*Yk^^$/nX^hhG?4H%/=AwBANE\R#mnj/cG/MV
9!B#pt kwMFj:6c>d>Ct45G1aQ*=\IMA/Wl6&wh#*A<l@&dFACmQnqAH8=9pwEBRKAAAA\IkEh>k%mjwRpMWbDA
CkcQhi H^IADEpAAAdy>9eHkAPTAID?9&PCAW$ZAHJ=EH+\j+K45:>cSpABpABaAWSRkNG^P^AAkAkAMk+DIAID
4SSD/\ !QtSAKCImEASAFAme\AABBFI9E<ajAkkdI&IBBAYIBD?1\$d#y<F5m/PBABGRA?&kQ&ZEq$HKtb9CR1u
KGuNH8 jm*PVRpcBk!A*\iA=/CEliZuARBl%%B4=wC<9%+SAAIC!Qu@FlIBkd!@atDCA\D\N\BRkd?S?Q?%CkwR
BhjDQ9 B/mCAWQ:<\Q?8ReAIAGJE#C:I\L>hSAIGFVbQ\wSnP69$H<=uAH!EmmRZFYIXqRheRJl<wmtSw*FT9V%
e8Ph\$ cJe^W=L?qGB@NSIk%8ElCbEV?IiFVaTF6bAA<kXDJAVtCAD16<LCk9#?AGG55Lklk4<#@ViV@K^>BEck
!:9$G: @KAAdFF!IDBtWEYCVZ$C<nP@8FuEj/eNPh>4Qd?@XMI9AAwmCZpaIkZl?9W%d8/\Vi#iJ6VS=kAQ:uKN
iHGV@k W>a^^<#@?u48bdtFBk*+=LSid!<Q8T+94/A*E9uw8\PACH^?y!iD\KE/1BjTeHGuBYAp4yu9+J=ji4dQ
<YJ#SD PNZYHjM%Q5aTAMnFNqe?9d\!YY$6*aCnWBTNASl^Zj>WQ@t1I<mDGN!$dm?cVp@LWVKV>@Q#C\S+@DQK
5T&N9a S?@8D=B@eXuh4\<MBMXKAIP%?8iP:?#!PRAw+1an8tZZCw%%$/dqGR5M6J&bHBD\C^\ApA#/J&V@<pu8
LT*kaP /R<<eXF9JwX>ckVwy6c9>@1Kjjd//a:4n\8+A11D+HhddQ%QeGN@C^nct?&FFINSwX\\qjM@MiiiiRaA
M!C%Aj CE<jH<??B+&E!EyhAaPCktGRT<YkAQpAQZyA:jaeAFBV1\<yD/TVji:/uAq\eT!$S8>HKL=AAaVBlqAd
W%?FkP R95#a+>H?^MATJkBkP<A1B@kqtDppNQRaj/A!\=IDeAjjGBwkkmwIlM#WXNXW%MYFqFqbbX64pP9h6uH
SaN5&P ZJi4ytK#Z#e>u&+8Y\@?X<e%pFiRX<8$!=YGD=hQ6/Iu%#KhGbNF&8jbV4YFT4*nX/h#cm!t6R:ie4jH
Sj:lZn w:pw:/6mb^p=#d5@d@h/>4nBP9m@!+bh&qjcuD6V8qRn4+t:XB#qcnSn%Fa+yb>*i/??:ABZ*$/jC*LS
q49Kij L/$n&>*i@cjuwX/6qZQh6LTnQAwi6%eI:F*+/XSF9EQh$ihiCDJcT?elX#NZqqiGB$H:$1pa8?A:@N:a
K<J?\$ GbZhni/4q>XbXw@A?CQPW/t\#=y/H^bPWlucC%hNX$%p^T\W=hcWJeYP*>?>4tNw1E1Tc!w&\c%R$Spn
uN?4<R X*jTIED?pm4HnhETlVJa=w8mGe!B#E<b6DtLIyt/i/ZMEkW!Q<\VlVNI=5uC@&<hG1uyH?ay^W?tdS//
VK&TH: JZm1Fyp$NwF+W/PtSyc/q5n!Vh>#5wFKh?HB%MWW9ZaJteeTP8W?L+tVMqLVku@bGeFLbQp5WGW!@><:
BYEjhj WWeb9+c5=&mJT5whWP*XRpM!VAcd@&/6AwPyh@cZWjI5ZBJ=m8tP!>NMXy6@!BiATtRaLSKqM+\Z!hKb
WB/qqp ^@?QDyPH+a=/c\yFn9ThYTJ*?8>bMk?t<j?#<=C\JD%LJ<HuwVX+>KVnKdBMhuQLDK&dwB8u\:iVaIiR
8BSE@= eDm\bcBZX:5lI^WL*F6Cm%d=y+61Bc$Tp?hZ\EDj94=>Hd5/DnW<GkRM!H<Jb6n5/!Q@B*%=<AZ9A<EZ
:lKpaH wlhpw>ZF>waXVm66&L*nhEVwdG8=9hJJ>cl/Ym8nqeZY<9>9%>i8H4?#Q@dw*b*lkC56hwi+9dJRVdRt
@JH^ml YkeZ8w$9iVIT/X#TpMemFV$5e8qujK&P%/48CL4uiX#SL^KKdyjlKi&@8CYQkdZ1n*cja+Xu9eAP@Zt6
=IY?$Z +=C+$9EX6Vd>D&unj^GBF8n<I&qTy8L<JkC!NCNE&9mnG=Ml<Z@ANam!>\&LHJTFD<T&k>EG%d6jpLTD
A<iu>p Zm=LmnnA>\LXyVqe>j@A*ynlC5*@lXW@pM5>u=dPF!k>nILtZc6cu=t&t1GwC%jPD$M9ttAnubh\Su6i
@=hlRT Lb%dJ*TG@<Gw495HG/:HISCP!:HL*YHAl<5^EPFja6<wB5alCI/?Wh#mHXdQ^Sk*SYwW4CMwu5D6=^*Y
u>q44! =&yuk5n6cqy*=Fy*=G:Wp#&DFX4>@!DG+DAb!Y1p6wX:$/uKCRH:hyV^MM$BGei8Jh%6h!dKeibYd?S8
n#JAKt NY!qF+l*qHIclE>Xphq>=+wn%Gh#jPuelVNd8q8/:jCwSL9h/Wy*5T!%LBXuP^Wu+Y>Ly$Rb&AF>RyXZ
LFtGu1 <=<tACFHn*D#5CMD?p+@??4h\C=9btBZIB9WcBWaH:>^>w?1#u1!lnN!Z6L9C?XmmqSk9uGcG+KHi4L@
WCk^<e FjqjVID\ZYT4$u4\t+SqPeF14+ZZI^8TDepSFNSnGaKuY$m1l@??+59D#/k8HIHX@!>&n=*ke$V#Z^<n
4M^\Jw %14@m^a@/?<ptYE:l1CINZBYQ@&Tjn1w@Ba*/:N?tWcjIK/jM95M*X=tZ4Biy6+nZwuynk//ypDY*<Gn
Yi/FGM t*#:VGVD4:<t>EV?:NQG:8kyFE>c=:d8M>Fh<c+Q^4aEYu<LdEM++</=@cjJ$d+:V8Z8NHYRR1u@D%yJ
?t8B=P ?ZK&bP#anmJ$51jHbSy=>SIQQeJ>PN\jKTRhN!KeJK>91@>*yhT!YhDjw*Wh*>H+*Xa@t#ejW:Bm5mXK
Xq8:uK IVRhCCuZI/G*EL1/y?BaC%@eWA6i*DC8@X4jYHPwP#RaLVMaNS%QGa#Sk8h\@DPbMmm4p%$em6M>M^m>
qhXn<= @@Y@y?P@5k>i*P#X@!59@%LD>#??@4@S!b==pXaewbMql$6%4P#6ZB&VuGd^Q/H?y*FhipP\bu@C<bpY
Zl!$LS &G=!+=tQub&:JD:tl&&cK^YRNPjKM>MV!QGcqJ!hu!WD?t*&l4Ja&\=$^c>ZFN&C9pY*1@VRPLd<6Pqq
X%Dw8h $:5\w>%dk6P#>eu<S<9mn\@#h$?GC>NJawF5PCjJ9&c8be^tNtc8>b9QaQ9%/XiZ\cC=qnFc$/iaPbip
%dhcWE :j8:aHc?:ZW9c4*Y@^%d/!BSh<h!:SA#QZTGV*@lF&A%l</</ZT$wYnbXM#+FQ\BN*!l?#?+P5*5HL!/
AljCyK ?hkahR9h*n<+wnZ<L+:Ba6%L@&&VRjd1#^H8%P:%hWy@!$etMHQac>lV9@ac>XdHd><IniF@\NyY9=d:
F:KqK^ FYa+$8?5Qq&L4Vj1j#R/Rq&F5pcc1c*>kJ^u?XENuyVy9ZWc&FkemwK&6Z1cNdJch^mF$j>jbPb5=K#1
?Z>>C! \6AFJF>RQ1F+udRMJNnhP^XKCRqRTCwtFVe%mQ#uE9bjdNZ>&>aII>TL@*>Cb\=Cd$y%&Qy@a%4Y<u<X
=6&ya+ cPil:pH4*+Miqq&eLcIL5P6a8\n:nLdm:bTb9qmVV96Cd=C&<m6KH=ql8jK&<pe&XP=&#<#\I%%Fku>p
K8q64Z Z+Zhl4h:B/ZjZq$^<@HdD9dj#>>/mq>/V:KK1@PVMib&=dqMb=#tV4LjHnVn$G%hX/LmGtMhTp:y1*jC
Z>uD4c ql@j8j8>C:/qV=$IM/EhH=>41$M?j5TN9>N$w4*XJku#?/AIcM>j&k8Nh#>b=?=<9J%Y*/=:$a><RM@j
DFR9>5 MCq?Gl^>jmjW6d/>jaXcqZ=ljy=@E>D>ltH=Yy*&HhyI+Eda@aJ+bi5h@i=:@Ab=+tQ/tN&>*!YDpRuQ
H*P9Y! $NyKY8nyQY8l#>qF^q>+@V:%+=L#?h/?y:@?wF*yVTSPZZ*?FpXjja94/iW#Nq+!?ebe@eAed<aN!9n\
Gu%e\V >L8u@G6R=q!Q1Wc1X%bYah%SCZ/!+jeSV?yQ+w6P&5p6uK#CkThh>BZ94E%&X?%\@Ib*96>tcV:IX=dj
m4FAb9 <V&Jd#^dP@+SF?6\&X?^d5K6&<PQN>qR&@+Ia5&?\d5aEBNtATh+Ahh59%h5B&y4=>/AemV5H4>Kc&8u
CK/*+e :p1jHZ#<luS:+@y>jF5!95w19HF>#Sc<Ln8?&h+R?E4jZmDyR8NMp>p/5d<#V$cy9p9P#+?t%+Ja@JwQ
MKGkH: 6JlPl>MQPk>diY1uQpHMQY=/?u9M$k5ZRVI8tt&<<==:t*8W/KLQ9n%TQ@Z$mlm<j@=<5c/6jeEZ6@%/
wHe$^H /QdN*jWKGK*A\*@1Le8CJH1qL:R/Q@>$*V*@&JGT+^5a@L=AT%85!p+T><9JZ+dY:nPL@M::8K>^<Y#w
VI\&#F bt9>\4a%DiKPYu>@8QPQQj9\j6+/A?eJWXV4T@LebpGb*M?M?pcEIXL#eHQ#eA<QhR<LD\8Qm$!#nEmQ
=LGVZa >A#QCI%IV<@MmMlwDR9:!+u<!*h#!<kw>$>%C*W%e\%*h:W!M#XJ>+e1mY^Q#@TKK$6LV<@ITM9LVI<M
!84=&q K<?#<A!QTP?wLI?L#IT!#+85nM\ESQl*qMLE%jqH%JZu%ZutSWcW8d8H8dtH8uBXRPiWw8i@aV6nPXNk
&HPtal ARuJBtcQwSm1DIhdIV>bBhBWP&pi@Ak1N8hwSZP><GCXl!6X<\ab<:%XQXXy=a:kuNQT+JFS#==6%8lH
w6npFE hW1bwGXENw%m!huPqtq>@:1!MIpMct&?NbyPta/HmlZ@\*d@Vj!=5kuS=DReMKF%W4up=tCFQQ/ekYNW
IwuaHA @/ZW9/KeutE=HbTGdQKiW9Yq8CBpad$h:$WLik4hMwZ5=kX>*Z@>SA6@&R?<uD*ad:D<8EGKJ4/!K6@l
qMK=t5 ^EllZy=ey5hSy@twBIQTqbd=ba=it8Hb&1R?5c<cV4#h$w:KD^E?Su>&ZcbYtl:j*CL@XGI1BA@h5Nm8
^dk188 &c*L^K4D^a5/mCb>WYY>4qZjaM+W^VP5<*tkliB%:LA8^N\^6VH%=>8ENhL%CkdW@\\y!LiR<4BbZhhC
P>@Dkl VT%X/m4pMF4wpq!^5ty!+b\^41h\+b!l41^MD#e^VDBBAJbb8=&AeDByj/kSYp>pGknuCwI4aGdBZwq<
NZJ@qi D$Iem#e$Q%lBMTqeltYcbede6uXX!=dVDF44mB1bNCwFYuD+uC1FQ48##<hVcT4//#Y&MBDM/wX&B>=D
MP?GIR n5=N1ec#!G<ycpPDYc?j=#TYntLL%hc&^pp/:@Bmm$ak6k8EA4cIwT?N4aHCTP1#ZYyNpPLZh@8e+PS=
Dcu:!1 &&%4!Y@*K=cZXTE#8chnb9=$\YR6XKjEHlV&HSRYddbDh$FHiB^JjpXPu!=EcwjdY5$BdReZk$kqtMMW
@VjB&D w4lWiI!+@9DdF@u?XFK#iJMQ&ab?C5GFnFZZ!k6F^8^M%!qd6!p6nb<$Fc=j=<jByw$hDlp/!!aLP=#d
-AYRnS 0002864cf90001202b4 Page 462 of binaries2.zip
%a66RT *Y&bm@YGhbZQQ$T\mC=?P/H:mNh:4&J%XMQBjVtV!?e4M/Jj+c$56qbcDGmathQwWCl&TLMm9V&8NC+5
IbXSub R%5edDw*hI=>InZ98l#1n^#*HQi?EWAI&b#ZQ6t%b??b&kGledNPF!\Vq11kqeFq5m:cwJZDG>pc>6#B
>\uhla Nh^6Cl%S/jb&y$C?&8?@$@jnWZ5YMS/PVwYm&@tkaS5#MSEPC\CJ!M!IFeS&^A/>$#^n*1#jQ%4iLuw8
eCP=BI lmiYKXaw@KAQR?:Z?JJPF%>cNktT?!p5C\cycdYmQ\/c4SJZJ%SJJq!eMQ<6j1^G4BP6E^MKJa1GlwcP
a<Wjnm !5cL#tNYq@d%5$:al<LP@1Ey4qSM^t&9:e>1btHFt6HmWtul#@K6<KN:j&VD+a\k!@JE:l%DW^qWZQ!$
S&>&*5 6QDF?cEMpp<=Q1j&Gwy5Pd+e9N=+X!L&59&CQ$n%IcQa8EHPHa\aa@MLeTQn?m^Gy=bH*^n1hjYM>ik?
aDQpa9 qdZwK4c6LF:baL/nB\Y8Khp^EAG\CKCM=ll::6nIpupbtqBdCMAwL=DAFM^Fkab\@9%8$Y=jPpYh1K=w
AL5dCL =!<1Z%Y8<I!jZ\9Z<Y+H5W6SKHaPdY6jM1CWuW**V>P:Kd:+@dhGQk#?CF$AmD&AFi6KJy6Gp#ZVbGnW
6dEj%? :8tjFEJDd/#9kIMYZ&1ND9WC9+i\N5?%+n>HR8@D6%BAR9\KTAc<=a\tGhYdw\mZQ*nX=+&ktTFutQdM
*1PiX! hX1!=Y956ec<?n&V/B?MiV!jlM5XW*Rmm4*J:$m54N^?Y#TkNW!\w*4J!AeVEumRIPBLTmil*H%@1Ryh
&WdbRX kG$6?VZ<Jna44$Vnw<&a:@ItP:DAK+V1>Bu>k<il!alyeRXhcqR1j?C6cW5^9dC$yEHSW>VF6\54+1cM
PT$VdB M9l5ImlYE98ke%Pa<>K/%Q/X\*i<:R&RLa+Y\5/?FMJjhW#%WyA*w6iijYMl5VQHtiP5L=hR$qX&!\qJ
=a89De #9aJ$t1HMX>eL=JRBMNQB8uEw@$1Zcw@&A&<m9JCBdX>l68u#&keV4/u@Ty:^jhq/BFjR?y+YYh@9\TL
XWKZ@F =WG$6ZFlMb=IbhIYSKtZSqpQFCSbd\T441JI1TidTESWhDG%FTc$hYEBw%R9P4?IBM9:eXP%Y=LDM4<e
#yG+@* J$c*JHFcdGW1>V4TXWaM:!k1&mPh=<VZ9+4h<eL>T+k6MGYti<MTKaVn6bT$n1WaYVCC&VAMa%CY&yTp
ja&Vwd @#h?%#4kh?PVh1JaADnW6p%&8AmuQ>h>y@Rw9V9<KAiY=N&pL@5Y\^+P!?u8?N:y#:RMBX>P8wLwi8*C
nnJEK8 SkIt?nV\/EFKmA?C<p%&A1+4!=hD>TRMCHMqF8aBKZiu?$RG<jdq#h5hV:GTDZ!8:1L^\I8lJl1hDGtI
1wN:EX R4W8nDi&TF!?RB?FS?ZSm\ayl4$n&KEBQ+t>6h?>bJhYcnNS8H@Ku?4$!T$X=9AEiQI9<jqwYM18J*qQ
X/B+\G *56AM9pGCF/uE5X?#:JmVRD>!cpq8e8?lTdh9u$i:CKXa@/!4Au@^A6DtZ>C8HDFu#*AD\?4^jm\%1he
4wIDFQ ^:@H9$jVGmAQDjRYP8AMhIGmHdF$MH&X8/5IVEu/49189y<8HL!QuiFajBph&TX^%4AehVa1\#w?n^$j
HBB*cC #&caW\aVS5*ZA6%Kw=eIcIbjC4$ly>cLPRQ#/LT@HKN+FYZ=\?@KSL<eW4%jZG$1%TlL#\&+kZc4=*!\
6aBKLL B?>nla>6hQaR@YF8M&mLS?Ai=&4kmE:T/&W4d\jmAcTRV\cnblhmmY@N8@p5^6@1BpqBJ<paGZK/NyZS
LuJ/c< +a/Zy+k^=&aE$aA*Pb#@IuVV#?6ShkVk8Zqi?k%B1C98KQWdiR^i*jF1?%KL6?+QLD/>>$lQN=:n<!ZC
PyaTml lpQSlXcG%MjN<j5yj:!I?^<?4n/bc>tB*YF^m/:<ctmK9T*t##jlL*q/mCPJJwt>ZGY6lijH^E=d*d5Y
GSGaGk 1Jl#mi416RBEwyQAc%i<My=eb>!mbC%$pYV\Sje<$nSJmVQJnSZZ1JHh=SWjmbP\w>K>?Fp=pTp=we$>
NQmc4H #!/:ZK1c*JZ6e@>ReG8TcA4Jqhd8&<lDnBtu1tPMFZe4d48MtjabP&<:j=!nQkCI%yyNNX9@DA:4MjQc
ql+l5% $R8AnS=A6!n4u\iCAweFkCpP>DhSHAT4kkMA=FEAmu$AAG&pPcC+MmX9PKuLhd*PMIpe>>i/yeIc81Sl
qWW=Y= 1qT>b9iyWYe/9#:M@XR*XatGe$FLF=yPkPC9VP\K\/e<E#DYF1Y!?5I$GGk5/k:$DZ>!$AR*ANNJk8<8
G&/pwE 9V!/ZM%*1CmthPWXk^*t%%X5bt%A/*QL>qcCBEtC^M<QAF#&<!cunjPtu^B@u8Jhp\wMNdWP5?I=&MI@
*a#&@i QptCZISlNpSKVajhI6/Y>Z4H5p6?bZHVJu<J8qVC@\m<@@ek<S*BHwDl+@c!w@yA*/e?+VkV8:S&b/%8
Tc?X8& Dw*Vbj6j$Z@T/jN98ZSEb@+I@+9p?*^TT+<CF65:i*XwP4%T&dPydkenV>*q*w9QRbLknV@6/\?A\?Q%
tl*6Ae $4q$*4Sy&j^6nkK&w9LLH\#5X/C@9L!GHQ1lw\SJD6AXTu:w/6$hM#YV6ScC&jYQ@!4*i<+DYL@h**^P
9<l&Hc $&8tX#R*uQ?q=::Q6AAAG45jH4&qPA/Dd1/aha$Aqa\Kk@uu:p#D\L<Cn$@qc\AAT5*YMic!e<el=YqM
N5%ke9 FLyWnTjLZA<5M^15k:PXQl!AFeZC?TBkA8EZ@FylC9n9BAp?Ht=?ABnN$&ZLyp&9Vkd\TehEZah<Z=:<
=RPBa^ RBIMS6HjZH@@Ak#&9q&j#4Aj^1\dmju4w#Vu+E@<Hjqy@NjXL=88MkC$u841btRN=c1&ZZVWw>%La&Yy
!QALME JD#DBL\@l<AT8D4YH#4Jtu>^jj#h?bLX:AFk?Ly?YHXY\J6G/DKKj#t>>/y=eABwy8mc1%TyG6y86ZYZ
WF+c^> YV::G/A=M$CyWE9H%/1>P^euLtMHbjjh@<4@j=B:eR<AFI=IHJIpmH<q@\aAC4I^q*%TyawZ#1hhbtnd
^?5pWh N4%%QP4RWNY$dV&C!mAA:EB>N?TPRWpRaB*@b6D4kW/c6#j$15Q\4W8bLi%94I>??kBtya?u*bJNd=pR
e8&>c1 JT1b:TS$hYy/8BRX1L>F<Py#@1>m:yR59^H+Pt*bD&MjPM8w$Q@X^*mEK\AcPNdq*uh4h#=QH4yDBWlA
JIy?Kp RL?18KWPTQq9tu/i*AEAGH!\6yi>4FNkAJS/@d!/8n^=enAADQD@M/L@IQ@jNHK#d*wja@<6uY?/Ijiw
Bd5YiI @Swai\nAtWIK!lyIWm6VHjAEXYt/kXu9Fk!$$pFhR?nW=lP5@D8dkWqFEueKBmAQ\uY*+ZJYeXYj+w:&
VcS!6& RnFwV?jA@^ZhFaD!nKcjj/?#ta865!:ytYEP=Ge+njIcXRX+a1#8p:>1Sq@uh/hS9*9G>1&Vq+j8@VHS
4YBEpe WqccytQpb>tjB9/iBPb@jpVjl>ej&H<Qm/dne1XPuc>!lRcLID5I%uyBYi:Sc%D9?81M4aYZI&R>G66q
ZG=nYS 4XQSjA$D+<!!SY$+Bi$i\i#&AM6k&&PR:CHWc6B/Dm6Q6$i9yi\Nay9=Dk+H:W&6*ph?:PA<B/T!SY*p
hYhlQ? :\tPpZ<G!\!!^Nn\bXDCM56ju%Y+k:GaW+J>puiFlqH5eXQZl/L1DpMF^mPEbdhEQ#Lcl/:?6Ddh$C$K
I?&!wq y@lFGAKVu:^GVTQuytAEyD8IDjAYCQVH:jpAkNkSWKa1K@FdnNcBwJDnP@C@jN9#/6Gkm9y#TAE\eH>^
%<>=DX <Hj>VV/ZK@R^FBdaA=RC*JA@+F&T*\w\@8>qKcq8Lt:tat1tLC#M\mLt:l=4P%=c5cMPY&:+?<?b5%aP
1M1+n: hX688ICYZI?8uV:I$lDb*lcu?96Ld&9YLVi<$iZZy%b58L@Cj1E:*8@@Gid\J=CG>>+nEA>/>&HFD?Hh
Qy?YWI q1L=#c5uY?+F@>$N+b4//&=*5<&Z6@Y>yHhKw9W=^e?VdPY:@G1:h<1l%enKy@1y>TPR:y:M#<6$h>DK
V+?hKq :>uG#i$%ndX%a>eK49wDPq:=?D9><J>W$?Lk1$Pt%1Xhe??jKRHNBJ:Ly:>Cn:K:E:8&I!9j!$DNQZ@i
WDX$%M qweuh1%<ipNY*4W?Y#j@Cji5aG5>1:qwZX=?:Q$hddG:WeN/<TZ&6QKhJuCkq!d^X?D>4^!I4\Vc!6jV
SdPww* 8>bZqXd#*%F@ZjGy@twXG%*==+qQFY94P#ua^X>jN#hjj:M&jS<:9hJycX%?8Lb?yNt?jW^MX@@#=5/$
mil*:Z q@F?5Q4y\4hG//<dbBQA1=m6N^8:P:8Q4uyW@$Lh?B6m<j8GZQE@#:=QMDaY9&X%Q?%cV&lc/nh&&#wn
?PFjVN >=6:Thp>h/%<u#/YbD1^@:4&K41dWj+1yyj*6dE:&1Ge>bjyN!H:cbnc@XhDB?!*CQnPuCaN*H<e5NJG
$L\d$L iK+N?W>E#d&:#1I&c@?<4*/j:Q4L@u=M@%/?69IDj@<J@4E:P:F\Y$XBL>Qc6h#:^$Gua%H^?MT&X<ny
k\9B6i Xi%V4deb?H6M/qQmP\WpE8GLmjRRJ@4\kX59iZ+F655w6M89Q6j>w/H/%H*W!H*V@d4/<JQnjjTmKVX&
ZqWp8! P@Mc9%4%w/tK<#q&W9bW9<@ML4X*jL=^iRe:9l*98e&Zy%ctW@dRq9XAEKqV>\HwVee&bp5jSG5P@uVE
Ii6uBY &^*1<Vp#+9XhaFa&t?6#mQ5<Ip>Qqtk#k4hL:9^XT@&F4lVCQk&NGhap!wn/QV!CF<EiYDVPcQ^Xcm&P
?R/tTp @AF#B4KHGA+9!Ft/QHpQL+i/BJ9R&QDHVeyi*&h<^@AMQH5wh6BAuL@^XQl+t^%Icm?RkA<Gjbwh=\6W
hclqJc YPk19KlAdY6\5B&<<J98aN6%:tIYL/+%wJ<dIMBu#/WP+A5y6V=HTEMi@iq?Gcu%=pdH#V\Gdk?e>SSC
qn^jt! HLdnc49ENYw6iS:GeZVXQlyLMIjn$uu%4S#?GY><e#W*X%Wc<ANJ&kC#?=#C//5YD<n<tkk\wS!:Ab+@
mwyY9C F%en4NRLB*<8C$me#&RPA*XuPtQ>Mla?@C$tLh>uAl4L=:A6:CB6#^GE5SV8HlRQRhLJd5+FRZ:<KwdQ
5ITydh Tju&>^RadP$jbWATE<y^8nE?#lm8hL9J+mwEq^I#>WYp\cG9yb$XREk1>k<iV&CpQL\>i^Rll8jBBP5e
A#Wtpe S@w6hj96KY4W+y$1l4L4bY>K<wD*1:>Qn8F<EGR=i8lF\l%p*Mp!ACb>cMY=Q%mB%!4Vu^*E9\$jNQ=D
wtuqJp W8nFN=4>QjZZCt<?aXuhq#=tLR6GI\Vle^>Z%lP^uC6h4qQkRhik1$:Z?FWQWN51?1$nhHMZd&Hu+48A
i!&LF< juT*jtWjcVn9<Y<@h$=Y>X8F!%P1LE>><FD8%bwu$n%\AS*hKAkRaKG6AIS$AA^/<4SYiS!GI$R5GyG:
/<@Z%V IXq\D6Q!:>&c\4*ZV9RpEdEL#:APItd9/HI<@YtBN4DX5thnpMqlDQ/HNW1pN#4ie5S6yI8IuSAR%HhB
PI+cLV qaTAG4k%4^lVILwujmjZ9At/Dk<Rbk8k8PKuHm@SS%SX!l>Stu*8:FDWhI^Gk9^?etjjeGP@+?%M:T&@
JITpuD nAFjD/E45M/laZ$%cBD%+#6QGHS5CWDY??&CJG1NnZVlkX=?pGbTI/^+i#@k%J6ET^6Gj*nJdwtH9WX*
I:<SCF J#@BClS>9BLAECPy+lQ&ZSW1F:9tJFpG/V>FPbHB+ecGm4PVbQE/SpNLdjB^kR\F>&!qjP*E%FNP*q1d
+Y4^<l dw\+&l8RLL!H+qu65Htlp+u%PiQ^!ieZ8q!H6?uH^GV1*m==Ede/T+y9RpAh+FPL@4b:l6X$Td<W9VX@
KG8RDq *GNPT8MD9*kuX*M1K<@kMRLFq4eDw8yn#!u@LnbT<^w#=KtNT?w/F*wF6&V<@iGqw/D^eDDp^w$TIe5a
-AG\=6 0009cdd2669001202b4 Page 463 of binaries2.zip
Y=6&dt ZEF!t&TTP$P1IVFLebSV+AeSu/P!!u&e\ihYkTe>In<9wy:&TSm4E&#bl%wd=P1@qL59P8RZK%NABwcT
AYImaR L?I@JPCGI?PkEMA5q8WZ!?CTW<9jhy@nCThYC4mBP#88:Z4pMeCT%Sb%l+AAhW81!Y8C&^J%J?ISX9AD
&DIC9= jd+L8ddj1%wC?WPLTk+P9VCa@!F/Cl68GLujQ#?<&pRYIqF+w9J/qJ+H:Ra&St=IIl!LW:\ERIKl&FQ?
Ta4P%# et+y/^T\G4wqK4ClMc4kF=&APdaSLh1N\PJew&\$E#Vjk8jCHn@?TYH4^uE<>^Qi*15/G4M!*<wE*!Pe
B^tayh Ge9?mSNcb^/1Y64bQBZ$D@Fb4SqS9u/DTb=SFRW?EVK$564^S!Ajy#lYGde#&i*6Gwy:D>\E6&APAn\V
ABiQ+1 V&eupSL#!B!W>k%:#:lb>Ma$n&bECSJ&wR8&nSAWV^eZKFLSTDWp8BYRWiSQ@4*k8ijBVyqEh^lab6R4
1#+h6p ^Jn<>44W\44/\&BFpk&X4^IFV9eq\\Ne$auwMnS#%F@dw4:tE=\Sw%kE6d#$6YRc^Y:B$Ee^eTA%&i5M
%lDuY6 &#?FXPDPkBaVqTuPeYQ#CuNJ+?DNtQdGVApM1@MF$MK<C8D8Cm8BY:5pW*^AVPTRYq6TJ48#FaT?8i:d
Wl$h%p b:=J\Q8Z$S$Tk!eT$=MSaHuACku#lPnCkp<$/5%^kZ:t8FaD</L6:mQ&T8:wX!R>qK:l<IjCCJ<j+YF9
/Gu\a% DDaRRqlSKKeY9nHqe+J<VPFw1Wk/>bGJ6/Qqe@m=S/Qal^a5jZ@e<1*^H:/w6eak4HH>/eyKY?wwE1d#
Zl1$T9 YP/DG1yup>\T@QEl5n?nVQCR:%wjtNbYXhC>8LLRG4\#X8hee^c@kMLw<4N$hX/hcBunuC55k9bapl!q
CZ5<\6 %wZBKWF9t%4j*Z&k*hi9#d48w^?eGe:Jn<nYkSCh:5?#6CLK^%cQP!X6Qn<FMk@I!:6RZpHAn4*TDmeq
^8V:t4 8F^1micjXGLVG/:MXPWic$>Yb^6yIQ?<ANGc?5RunAenWHG8Jn:K@GN<nl*h\Kq*i9@6GSH=CEMq%*db
4*bVnW Py>5uA46^tSh#:VNM^PlBi$XB:1H9weWm%?nMaapn@cdIXNP?e/Q!u#TFdWQG>/mXMnp%Gd9I=jA^GlE
8>H=H* b94Ty@qMC8WqY><YSd\n^QeKqM#=GVkISjI99E&e\$#mSX#*IAkE/ZJjLy=c$K#p+ZR=qS^SGRPSM+jt
ZVY6NH *Pj?A&c+DQSq1awEm4plE8p9Q5*VC:5bS5wYnS>YmWqmSa%yqSauE1Iq+Du$*y?u:@*ZPJQZWV*^ARX#
>YH*?y HRYFQ*Lmk=%a+CpWiqc=H?h?Vn9yF^^cFt&pi6%nQbjEyG6WJp#YD5&cP+&iAw@juR^Q:IBCZy\wGY$X
#w@REB Gn1VBuY84VZBl14VYT=E+#$^#w5=i*VMFctGJiWVJGpm4&eb11<Ky/e+p#4YWBTlpu$!?*aqW68^tJQd
IiZ*IY E$:khi@PC:@HPYT9%DT#Rc<8c<i=NtHMML*=D9KC+b^bNNRw%m<GS&Dq#e%DN!p/ee>VS1nJMwdQ4WcX
IwdA\C Gyylb5=$iak48^JQ&V4j4wYyXh*HYT==naMBLtt4SiEWJHZ19QjAcCS+tGD\DXy\laQc>@JnKPDyKc6d
!LEtua wtyhRS^VHJ+h%TD+BI:RPAN9$PjFMQdp66M$&qGRMkYPE!4LpMh=#9#+LjCujGQ?XPS\KDbX@kS/kFkw
aBATnX tENFA+5*=hSWYVd+nSCJc<+1q4\ViFN^?\H=cQ6=?X8wt!lH*SCWIi5w/:dapltQlP^Wqa=:VEB\!RI%
m=Rt9Y Q!LZKXp$1&nd!qYEc^^GSXSw8AD>&HpbKG=Hw<Lq$HDq6=F59GZ!%ppBZc\FhRSVbyEhq5JK@BeI+e5c
&ZZBwP Y:S&l&%M\W4jFEhMcKA\WE:q#R:LM&=d<\:dFCDdpuLT8?WX5CKwSh=iB\FRwNJ=m9!FiiJHKJmW&aJ^
j?w!Yc S+EJ#J$MMXVw&K1Rnee*FtdWQm#$+m<:RSEF+VXw?SM?Hudq#=<BD8Rh!X8dWe$tpFHT+5uItBik:4Dc
JkdcX8 eVd#C?:Y^K5@VjcWXRFN9/51LG**:!/+ZN#MCM<LtTbnV14^jhl#SMZm#Q5+!Yh==h6I>w4:WTT%TR^F
J==?Y# en+w\wIkHWut@hPk>5Sw=d+KSq4FcLqIS@nJ4@i?an6uQI%@%wD1e<&*B&@:qPQq^AyT8LLe/VhtqaJ\
Cj@:*% eCF@n=Y^P<t5pG/#iaK%Ia@@M5dQJJHIS<K/k&L\QB49aFjEFcePiG4!GeNmS1nP5aadp^Z@GbQ&mP@C
/?XaL> 6yyM+Ikh6<$BhwNu@&MLcE^::GbC&h4#\Yqbm+^9SVpIZZw%&?/pX*8>t:D5/JZ&%6>*!j/55@a5HM#Z
?c/\wE +EiS&y1m>8D4##8^CcH+*@qJ96ti<4S#e*Ft9RR?w/>EN!SjdWS?4c%*k:QGydn?HCD>$c$Sy4j9AKPY
N6#uu/ iQ@98=&6qGpTNlBX6D/R6>=ENlh^pQ6JP$tBbB9C^68^kd5%^6kVDWZhF+W6MaPahiVXS*!nah=%SEqI
jteytM qkJheSLQ<C\Z95QZV*6uZK/jCJi:!Cye8alnbMDtnw/cDEh*$iwRki6ky\FM!5:HMW$<#RKpZGNcM$*B
Z#&bKe H4SaD<#F^><iX9=%NQn6u&qybEXHa#iTGGWhDTD=QZ8$knawlRqnX9=<kG>EYCIXW%NVFVX*h:W\D@Q\
GVSMhK >LKMnM!Kmw18nQTPMqYaC6ZJT6PKmnBwtI1Pm5/P>6C@ZbkK5@K<nM/P!w1Kn9K8#w4&#wwPh=mP!p1a
KynkP6 #5:K9+ABADw:ATEhhYthqSXXW=NVj&tXqRAAXF=qS/luScyqbWbFcpX/SHy+1L841a41#9L>?9n6+<jq
qJWnBb 6bdd:BXde<jPaZn*yy&XZ+8e^9jW&yX:q8VwGihZBX#9!DYZVe@*!1pd>h9uJ1jP6e99^mN:dn&t&>6c
%+y9X! 8?c8YybeW8T9ZC4j:%tTL\mJZ4??B%?<\<uR8JuWwJM*uq!I^4&H@Y?CttaYkhikKklP&6V!5@9*cL#h
etCA9L yn58*F68Y@A<yp=wLX^?I>XSYyuwFHqYL=qct9VYI#c<?+!n%^q*:B\@q?5P?FDttji9!EK8Qwn*D@nE
>^X1aX 9X+A$MLD61m4P&j84?Yk1uQQ/@Bdkh9uDQ#dP!/ESFk>191L\8d8T:d6&4*ZZLcY%:+44=44:6*9&ju4
!EAMy5 uq!RM*e<lJYd/yNQ9@wDu=#b+Ze>8!8jPbB4u&>5b9#RY=A:>?@W?/@a=diQ&QZ?^iuQ9M<h8i8:4q/t
C+4uip 4>:4d::uF=D9:>m:L:<=\L%jdjbu%@j%AIAHRWwbHRDVp>&4%QZw?aW9=\=I/c$ii8LJ6hw/LJeF4ZGI
@!HKpb ?IE1ZGRFbWBC1E/ypW@hEM/laX>1j?W=P5Ik1\b>>KNKMJG?cIW<m@qacV@/k!EAS$Kp%PIpJ&LJ48!<
JA9htT LdDADA%/J<<SDVIXFRRKay^AXBJ<:lmPAw?Idyk4VSb>J9Wh>ZEC+1jpPT6KFSBBPI%R>1#>P#GHkQ4S
5pW&Ce V\yF%$J88+QanJ64KX?68=%=dkRiFA6&TW<aCW$B%mB61#9BVkMab%AMFN\TRLSBPHXW5H^jS<mpBiRt
aubS\k =AqB5=VP\JNE9*lk*awCPbYJ^Mn?#BF^kA5:VYB6iw%tTN=DV\@p^p&mn%1A4+Y4Y?%E=Sc::1@n/y?a
nCeWKp L6SnTXly\GlHpNn<cp1Yt9E1GAp5w^Ym+IhYwEyWGH8Zc@d\Mmq%KSIPYSbmhWaMC5LAT!l%FjS5@ap&
:Nm!nK NCjXQCk@YWl6TMy\DFl^MPLbXeWhXVYc+RIS+KFF%\KL$:CS+&5w=Qkt%Y9IkZ?Ia\M4Se%JTnYTAT<:
:eAkI< @LS=PjVV>XBL?H!jTQp<X$aX!SqaA18P1we*9pAEER\WhwS&R>1lHaVYDI^d^GeabDI$ZBHnP1BR*IlA
#!B+tp RY$jK\=uHYiC>t>l^j=Jp5ew/=!4R\*p8mTMV4KEG&>IR#JcZMle&QV/TytTPXYmm8ylI5qB:EqmRq8Z
Y9^e+/ ci9j%uEkA\&bPbSX!P:mR?pK*Rm*D*%C^&6Eq1K5Y8mu!hmLH=J8pnATDcwNLLq<An@6ep\t=F\%<PAR
hk%KTl tiaLRe4ekltba9TdI=JRBI<aNZSZ&u8:B?:XyFTWiCC\MRFJFmeyqJ+IN^nJPNy@S4XVScGV+&b=GQyE
hp5e5H $qX*I!aDe1=6BX*EPL+CiBIu<Ml61RbR%iE+yi%Eup<@J164?B=jdRM6Zc*Z>R6Z!I+aYKYbWmR/mMan
<F^cJ^ +$mda%DTAc&E8LFcy5iFt$I+aCtNKT+Mta1<p/lNyTVjt^D6S*$nnbHTYB:=ZwY<u5^q<!e8SD+NKLp%
<lYKWB ASjb!A!Z8YmF6M$iTuS>FIm%DZ!6C=cp!8XR/??WD\XPK^BE9*p#W5pjKY8FEe=qqRaY>dWMQ8hy<hEM
Wyw#W^ /d??tC%c+Emq&lJ$&FV+T?F%JR?5DKD^&DwWWHHqMi&kQJ!T:1%6JDVGb!Bidph6YdR1?/ZduyQ8=n1S
Y#T4yA SdXydwE%ITaMuH<qidGQFHyI4k%CP<Ic:&$5Hh!dh/P\/ndeV&HAp48WRDbCnJ14?<QLCWP\%ENq#>^:
I>jY4! #F$=1jmQ1p>iRu>!y/&JP!i&JE^P$/u4k*n&k=peA#D+%R8XT8BkK^$6V#&elK$wkbc$i^S\!JBVam*y
S=Zkyl F+6RGe6h%ay@HitEiA\M:R@E4Sy+jIIlEBBPP%>#/ekyu5&de^imbtXyIRX8#jhE8nVXXtlH$uF8y#cl
=iX>S\ eL8$WL/nlBQ<LL$^#\Pcb6SmeiLTwS>!V4yH6&JBc4dqeu&wQmXXc$t>#yte!q/L&pAD^=GJ68k@V<dj
^9b*D* \/u=6XZIjV:ta1T&Vd4W%TR@XHlJia=Y98YD1yuec#5yQKbl<lMBCSwG?c*dB^9c*dbLLiyW?Y4Z>VSc
J@T=Xa F$bi$GpkLLMbXtEaTm:A%R4%y$GVtEmhnWt9:%5Vu5GcVwP4qnGGQNbpbH\ADjHciaphT&mJt$&u?!\i
u@NLY: :KYe=Kql?HPlP%4!n#EXGejwRaYK5PQY1b@BKVq#qCF^5!H?l\kG!nHXwE?V16TaYlNZcp\q&&%8#T#+
#1j&8Q T:=aN*laSL4weky>8M?#Itl*#wa8mThIH5$D15hDC&**6jqJybqkLq\yl#N@?M1#!$F8Ka+da5w!R!nC
K5F=V* *y%H1B^9pn&HGu#WND&&IdKD%+G%qYllteALnZLB?^YLA!Z>Ej!E^@FPcnFZG*iZb1Nh8A#HD#kNaYpV
d%&Fbc pFWhC&D5<B+/!C\uc\/nJPHbqcZAmk\GidAkT%A=G*A*Xq*l^P:9h@Y*/ujCuuKcehiIXia%P!&bM1N4
=it\4A uEitZJe^E5wqM^iEN?hlp/4YwCbw8j>Iu1emYCbFhcB88hC&ZTuF<yX>cJBX8XWLkFYhy^J$P9/&X&u:
<RYaY= ZKMSkawi=RSSMSa#qPFA>TmuM/<&u1japQ/%%Gl\GC^ETjHnS=dP*P1$KI5d:6Kj9Jqb@=FcpB66*<9X
y@dE#S 1\T&1%F\b*Sp!$S>Vul:4S^PP=N^$6V<lk9tH&YX\bqklM1c+MMaL<l<*E#tPI@dB89bLw6EpQk1E?t4
lEM@%R 6tI8H=u^@a/L#@kBJhB8m*lM6?QiCd4KAh$EVVw<tcTbRGmY^8#MWM$ImIBEdAw//FBHk4c*uBQa!/pV
G^Q+N1 yt46V5e@t&1$\Ge%^kJka#Vc#c/Xmien:EwSZD<5KkSPm=LVdA9hEjMVSu4uT6YenK>T&y%&P#:l%>y#
+C4J>J He@jI?W&ku\eIc+&tI>ZjbVEyA/+9Xq$yhP^nPLt$y&6j/w+1=ENuA$l+?DKiL@Hed5%%8keGRW8&a^I
uNABGQ p5<LS>p9En&ID//wyhhHmS9y&iw+lQdKq9?h/lm#=h#=a=*AHt@Z*GQm\N@wl4/eYH+G4L>#SP!Hj<KL
-AH*V1 000007d2250001202b4 Page 464 of binaries2.zip
QWC&yI YC\TMJ?LZ+YeA6YMaw:W!<XQZIcby\9q%+##l+JE@%8&yN4TjB%q^8EW$<V=*<XH@>h4$kuaZ$P5a56$
*dw=?L iR&cFnGAd?@>kRBdpLD+wK=aH<IP>*Cq?C4Pj\Y5>YFG<@&lu5%B=mB9jQq+:Y8@dhy*1k>t/k?GI>He
tjKPRB c1k%X4nX/\%HbF$Ml&Q?:6qGH@YGM%Z1>eNSKhV1>WbkpYnW/9*@KKPSuI%X:9YG\%F?KhRc!@@w++b@
+u<EL6 hVC1%=8ya9@68<TmWY95XQ%q*jyT1#hY@lYwV^mP=K#:T#AekWHDGK9@J:F:@X!JTc*^:YI+!qt*<5@I
!liw!$ <D>hw@<%NI1nQ8=*@>a@qe+XX+9BdqGT$djW!HtkZP:*J^*N8JY$?$4&?:u4*+8<AWAwAIn9kd!@^+GF
qSEX@k PCeIeRCkk5AGj$IBFRJ@/D+n%lCPd<FPj*?ptL>=a\hyJAWAY8jCEMGB>E%AM?61=5ISeeADWGSR4:>C
bt8V9a #MuJIRDAw/X:?y!AMwk?@1JCw8a%DW8BR9pcVjVpjm5GnDhmH11GIeRlV*WCljqptZ^EAdE/AWRGWAmM
@QuL*6 WSTGm*B>K41$NbL19H5j&D*=9^b@CAS:niEaT<+IG\EXGJ9JtywZHjLT>%jk1W*dYuH5bXdHPcYdK?Q!
aC*%mZ \1?NX*eu1A*9GiD/!&I5n!waI1I/ceC*RL5%*/ZnkBM\/@54b\tl48NEC5?WS%%1CBGX1KFGKWaN\\Va
L?YZ>$ <j\iN1L!\J?&$RiTnp+&&bjH/VTjQSJEiBKhq^QhHBp!LWRN1qE64hL^&Z9E&6hH8eiB^6d1kL<HM#1p
tVk!@/ 8m?AVEejt&\dt>paebm?XL%mZPW/8DJKmlKnn>lk1^wd@kl&!&Bu$^C%>TAe&RkwhuNj/a8J:jHt<CAA
Bke*$t Ad&R>NI?J:!Q#Qq66h1qTJ&4e&?X9J=Cq9cMtTK?199CEcTP6iNm:X=^^:4mpVXc1FH4AwGZQGK5L:L!
nZ/qkT y:Z6CD>u$RMXEYD:KFS5F6Q%l4uqj9/8ka+iJYJG\yBn14=^8#tEJ*b>^G$nAuDjSn&6aal?Rmn::YK\
c\LAM/ 9At6l4XTCeKXt4/1&88E9AIN1LcymCHn^9ehj6l!RLe*PT:EZKc=LmYD@:MT>un?1p5QC>VBWkjTjKVQ
^P1D$q N&JnW+^%mGpldY*%a<mPASQn\@i#iy$B>6CNH\68kk8j%wP+8eimyyA!&Nke9NRqXuLn$+>uVCCMcybF
#Qn<QT iI*:^V?t&yK>Q<bFPt&GBRBKj5!F$@??pj$DGmu@pJ!K:AJDGtHV8$c1atLtJA$WAJYihhD^bcJHK$<E
XW<5\/ *5btDk@VnltJd@!I&>cqZ*FI1T<MDH&wHjZm^+i#t\akeD@!X>/K$w<F6Vn/dX5j6VukD\DK:P:lNdhq
*DVRFT aEA&bWCCZucw%1/j&iy!TVIL8&C@JmAAlQuQAIB1u*FhCmMFj4pWAhcLa?d$aKyh/y%YcwbNXR5CTRFD
kV!n+? BQ^mXS=>l%l:YK<VaWV^!ipkI$iq&QP&4BBnNT1WKMJlIARN>FC%Zk\*i\yh9@ewG%EuMKe>S%p!TV+j
aeDI6a 8^P4KtAIMAmRIEW!?$^iS6#CnpAEnkmASF91<>^Z5ij9+M@P6^B$pFRFY+LaC?nAAh:XZ1T&Bc!HcbBE
CJnebS dc@tNYwK8>n:MD1>VI@TB*pBlu$$\y\hACAIm5#AkCbHjmIlq!kdl=tVb#pYqa:uCJMVBtZFMPc6eRIA
t<5WGa kB^%TYXcIG5PGtAayXp6/:BJlj9*:nL1mtw:IAWNDcl6QF/iRAAA*F=mbI:KiwRIyJF^^hKXR#W+j>Ba
MLRyh^ =T5TbRa$QEKhkQKLHBKTIMD\45wWHZCI^R>MuKp!Nua:jBhhe&FWi:k^wmaQF@nHu!HqTB+TRABqyHt!
&!mWep bF/nA65kj<TYKeh^iP6ZTHP9q!*85B>uiS9kmmd!R^!MlH^KYYYEGWnRnCBM^YnL4j%K#Z6a4+9*wMll
%QjHhh 4^q%DbP5XbE$TWiC+GmF!tE=Cyw<8Mcp&1yRn<GL8%&Q&$eqEI=DY>8jX5&%PDJ\wT1IA&PE?bARIA=I
J\!c*w $uX5X=<?hkmK/9L^PcS&QBpJN9=:KZNSR@FHDwRbS>\nHQaHLAQw!RAN@%b5RaTFiaTHb/TJCDMLC#PL
^b6iEw iELWAAiqpiGk<><G/Iquy^EH4Y+H??K==/elBI@>DML/ClJ$pa$LCHdRjbm>qiPDAID<L99ntk?8%\KT
&WA=6J J?Dd#X!TjFiGQZ1?k/41kc^D!t>L!#6W/+l*S8@4#pNYY<dd&=iV6ZQI9?SLFQKe==!?CH^4n!NLDhtV
+Ce#mP I/j9S^!PVGteJ<=HVc:RG$\LXBwL<=D>An*4jeSGAY6Bl$y::+:GGiYEMSkHhZZpHd+=Wa+e?A4Tde4u
pwN*ET qIae9YY9J/ukAmBF#9nB<>C$l?A!qc#94Va>eNel&hMDe6aF<u$HGedZB8Z>hWVPut$QqmkHyG?FN!+*
nSWJec @54^!l*=*9eD1Qd81>dSt!VF^VAhHcBeXD&Xt+aNQdeyeFTKqYHP/9PG9L@1@Cyk!w:BGdw:A<ZN\4d\
!HMl%H @k8MEcESjQ=i#%>hd9=daKt*d@EaI8Jc#mZV+nL!p?4qyejE:!BKL8j$%YhN*BjmaKBhuI9hG\!mmGCi
8PkJZ& d>>Jh:e^ul%S8I/G@4mQ@aYDdqe=LuckS?YbF?L>=^>=jL%bYE!I^mW?k:9pWN<JyQJtyW+AR6/:D*pt
lT@m<Z IX!Y#Y*qc?VP$+$Q^AG:Yb5/Z#D/P6<N6>?%S&G98i&MkHJC6=m/DNWpyyR@FDS/@\9mFF1ja!<>1S91
wc#mLu F+hL$EX8IELGF1dSmL$a1HDPZymk/ahu6*$DIGqlVYJaG4wj/hc?FpaJ:WdBwP>Y&CmunyY4h#CpCFM@
wtAMF1 $^WIN5ehRPLPMjmW5AaXaA\m>>8668uuG/IEAd:T*heNPyA>&?qd$9wY&q=D@^yyGy!hD>Zm:Nc$aDl*
ByVqej #:a@YY5=uNkEkuBX58*cLdh9Qw^AiIC=+I&V@>pd/HJ9$>Z#$P<u8jJw6B#>#\d@*9D9Ad>cJ$n/@pWQ
TbDu:& u9l?BZb/XadD9VELhwkBD\wC*+q^b9@i$c/RX@!q*44?dauk6&BI\e^wuDSi6V6TTXkBKBt$PaXRm<HC
hX6>%6 :\nDSyA#Tp5qC*6qd*qjE8$m\=+5LKVI:\HGHu6lklD%1Pk&8\B&:IBiC*>BqkB/hB\+ncVEetN:Eu&t
HGM&\1 #@LuAG+^P=t9<R@CWWmI>/?/\GVHwqPB*?iZ$SPYqi<R8QkWTncntmTlRSFHN$HNun8Q^<FWe^a9\&bm
P1iK1= RH5EktA*=h68X5\@Fd+mWqc5@Pu9pJEB4%$%+EQL!eh\VHkV>qR$h%$d4Z8IQuI+IJdAE<%eB/!$TBPI
B?G#Fh +>yel&+>cJu%Y^1R9#!>%8^Db$BjJq*@BI1>&bPB^qEFpi*9R<<+d>VAB8!T/iQERa&n&\ehLy:\1+BA
Wae<1P Jl$H>GyYM9L\<JJS$mJX$$A/FPMMS5#P\HlV1&C\#Q*cY:EZCtKH?8XdZZ&VYEenX=9wWAlKVtS:ecBY
WX?A/* =>*YGKlVq9\4!BnPARRKQXN5/TSZ#yR!Xlm@B4E=Y=q@/6TjadLeqj<pu/a!\lWie?>D%n^*5eT5BT@!
>Yinc/ &KEq#PMGBGdamQ%VER*X\Nw*!iQ^a8*\iu5G!4$ER!9IuidZ:cp$tV4ih*4j:tM?QH64*^TPNnBCt:Ab
+MNlTD yaEZ9b#VNP$V4C=:eQ<AHmG1RRVm:4Z5:ec%%L&Fa?d^d#BcjuERR5nPK$yj#W64NRl&uYAeaXTwnYba
@Nk@$@ JbYCi4b:P*IXjd/p6A1MQkGT:FNwKREam%DDZ6Dy*1Mjdy%:k9W?%Hp#1JA+%iXX8/1$M4X98V?A!T#=
yJK@Id 1wBe%#FNIw\&p+:cDBFGWGk<JB>pWh+:A^/I!n?bk^EAKJMyLD*FIBPn%EK^+RXZtGpQFGAkmV6KdX>K
iq/ALc 9:4jS>Ld4#kdSm#+P@<<ki$bbee%ubkMw59Y9:#$*!Ru45CaZG!&6&ISbe5Yuwb&PkSiNbYQd&El8<dA
%eSpGE <ELEIBi<%XK/QL@Y+lCeD1lneC6&:TdlmkY\&KhkE&/#hhDPWa?BCTJEG5w&FH%Mele&HX+t#YpbBt!u
Qc9dA% F:b$1*#\bn#\iLD6Riwe:$N!Ja4V!lRt@C^5=NW*6:tEtT=eGn@S#Ta<$6BuNKcn$@RDL@yn%Z?B>Bla
bw%u!< :kZ%Yd@u\ByJ!*buC#y$tLTSDd=+wQI6MF%CR9*CAZbhq*Kh8E+i=Gn#8%4SQ=*Ei!*CY$jQ6u9ac*?P
GPCnkY Pcj%hWRQwXwMpIYZQVHJLKpSF%KHeH&MWV>GF<Q+>qP1S=i/Eh?qjBT9JdHew\BndBquLaqk?q:=iybJ
dXSnGb N?PqhQ%e@=D6\G&m%yW%bkwVCXWkY5^TSV#kmwSP&p@lpp:dm+Y8Ih<$YiaNH64EJep*+:KEt&b=d=JJ
Qu#RnM =*FPF&Yy<=GbAJ1%WjRRS%iyttebJ#Pe#XFACLjFWuGi*lWFj>B$Bp:uV4bW>lRq5=S$lY&IYt*K5VBq
:\T/HC Mk?5IX@QWd\wZ646MT/H8l+4j$t/ncIndWwakR=mMGJ+G#wHl$^u/Ziu^BdKAau5ujcIVR=bXpNywt9=
>6HiYD \iLJ:paq!J<=GhNc8c6SiGGeGbYMl@&T>hH5tFSFcnpph\*IP<Z4tIy4&q8myGVS#j+p\@eRdd9EjtH&
yHhYpA Qw6mb^uTF+yR!^=/a:p\9&KQ1+K\H$B+lHabZpuY=VwXb$bJFnV!?=9^>^tB:MY4kj/&q^ebp=LFGm\c
IK5=kk +:uCiQduLClI/6NMCXaLWhEZm/4<y@/Y<TMQE=lJqjkTGWRJ!Fi@8+jctd8#L%J:EWA8lhp8ji<PZ:Th
JFHBNK c@q@*p*em4\KH$P=RlaQE\eKQD4+L!4*khe>VtYyRJ4d?GwH=DHiIi>wJld14PXC5de:tCW9q+Ml\GqH
*FpA:/ m+#&$GMhi=e:>XMldB!V1j5@#IAICh</@J=Lb&R?RE^4\M1cb5@^hLu:NTp>D@bKnVn+h88<b^<ydSH%
M:WJD: qYuDMt<:ESLh:?k@9<<imL\Fl$w#QLY$B4TmWk&1A$jl8=hZ&!!X%VCFVC?%5A1K!b*a<$6%6DRmqyk^
+!Wt=A ZayPPq#:DP<V5TZQTuI8$^E#b4e&dn<c/@Luu4D:w&9:\:TXyn&Lt+n6!HW#cqX4A*jpKKQ*K/4HiJ8!
aFqJ5P ?eyGLhVEeYKyh9jRihqYV%ZZL$4!1qEEHlbZ:B<qdJSZ6AitIK$S!6yT\!R@p\wpFBDNdH:MW^dRc\Va
IEJw\^ Ed1\=?c+Mp$YhXlpiD8*hFI%hJwNpWt98t9KLkYW!Pk6<YRwKbVw6Me6kpW%c1TDuh6&RSXbN6t<hKAm
BGMyG/ JmKBu6/F<b+$V^nn*Xa1aC6Q%DELSTQ56G<CZRMFL\>bV:bpZT/1%%E4iA=:QknMQI>X/PL?1tG+Bm1q
S*b!H4 X:4y*NGdF>=k:VkJ@GNB<MIlLeNN/>1ESFA8PVD@SdtHMhL%JL$F?wmRWlk1y*5H61aVG58X:yRZZKcG
BLS8Y4 pIZaEn6@Gh+cRnbBABZ*VKuhy$SAqX%cLyta#nkpuC/#iWlXR4wylThH9qtm?JSW9GyDy!8WK#1L%cQQ
@q4l#= ZLM+nw^HC6+=F>Z5wXQTlZknyH@4!WCE9^+e<V#T#^meM9h^C8GTt&d&cJ4189&HD?Y%!J?AT6Ia%Zqb
JDu4LR \p<*8ZAFDCCMVdy<:*$JL?jeWYlY8VhJwL:tSS=XEu^!J/*@\kH6kGN!Y%&aWVDEV%R9cdZehJmhcy=&
>6/9p> iNAy!qFFcp\CSebFT\wk?M!\aeFNZLD#n/SW#Bu^utb^Su!l!wlD<d8VwpwPu5AXpyPd/w^bVwLGVwGa
AH/j9i <LF@JmW5AC+NqD:Qk5GJTS5=$=*Qn\KWK1R<p*6Gp>VA<ZFn*Pa5pXM1/k#maIHIJPZD=JESWdDC=ctu
-AZi5n 000637a0b41001202b4 Page 465 of binaries2.zip
RJ^%q^ WAiVyT?i*TCm$t#ac4HF#*%Y6LYcB5KhuD@hp!/mFc!$wFnp!h>Rq1N\MZiFCLHlaid4?+LCp5aGy4ta
>IS#jF a8k+jPl9<t<\QnMZ?Vd/CB$#/b6RMJD^AD?TGAtK:w8TJbcR@CGbc5<G$<&&p96w=WNyaa^=A\F66^+:
BFF<nG w+W?w469F^/8K6>MJWb96V$G\nmTVM5CBVFP<Rl*+&KR$lKMKAP$nnk*6?8tKY5\:!H6Y+?@TnDVT6Cl
Gq=+X+ jh\hZeB8@XBh&#lq\j/K>N:a8Ci$%S^8$Gwd@%GGPDM6P@H!m+SIIVV9EBPw$W/RJdKQDqRa:Q^uHWAh
hw^ZN8 *^yj1%em&WdVWHmqh>IXyINS#b=tGi:Eb9cR=1m?tKYEHMZjlm:HjQ4==aBIb&+VTAm%<t*?kM@^GbT%
?MAut5 $9JmD\CJMTZ!TC6%t:=^ehqKln+X&!Jp#Nl>6>wABjDeXwwdu\NWXEDiC>jZBG^9L5b1tdR5NC:>9TqK
kJY*XZ nXJDaJKQc?MB+ySQL4\D/^w8<1<w<\j#%#H#jC^ZnFCNPPq8W#C9*F=wFV!GHY9=mk\Jh>Tb$5/*JDV4
VTqCP? T5<TRtL:wyE#eAp^%t/P!w!11HnI4R>D9y@Ry*Dk<\cDE#me%u6?5#=A4XjjD@d9CaEF=K=ZZ^qSY5cP
QWN6#i Rj<c$uW&$:S@&KYn<a%+V9%tLM8+619</4edumNBi*?MA18p^<p*4Y+awluR!nwan>lGT>FK+c5!CY6P
kb+/&t m8c&d&dV@KIyHKZ==GjVwM^$=E@bjj@X5P6j4yXRwNbG$6KlT$MTIi%j5:P$9\dWIdj&*8lReK<qqmJ4
:4ICXB CiBuVQ\64a*uMT&#%dXc$W*B@/&W&kDF56G5\nD<T<6^&XYm:&i1$c>I5b=8iGEY8KRlu!PkAE&/*%dq
mGJZ:5 NH5mK4+Vt:*b!J^L&wAm<GVH+Rl>#w&T661#T<pb:KN=j^488nlSiE@>Z\<4T:?tShJqkm*\NJW#H!$Y
HhWJ<q QJeM>qe6X6H\TFNI!nyYVuI#y:8&NVJLh1ZW@1B6ZKnGZS4RSDW+ZeuAJ9NWZ/kT9bDtY#M!i*M8mEcT
QNLV5P XLL/9>?:=M*LeQaAR?l<jPcM:WRjy!CIVJ5X+TcRwSZuEH*6A5j!l+DyKPSEkCl:!KKHScKiLRaktX%p
=T&SyV Hkj?N8C:b?P>9\CcFCb*N*qac\+W#lCl*c=lFy!9^tY\MTX66!+IRqn&D=+*YhHEbXj9mtSk^Tc?/QQE
SElG#B 44V\bBMPyWKNGBW=VnjJPpp:Z:L^ePEjG4dy+*hB*?BG&RASLuK#GuDJkZwZ>ICMa9dcB6bakWWnNFGh
h:y&>j lYAD:<Sdd=9@<F%^a^&u@/b/jt*&EI&dbdYpn!A&K1lX4/<j/K>@@WGuJ1MnF<8:Gcp8$Enej:W>>9J<
jlWC1L w>YunRcwuFiGdty1^p<PIc1nG!>ne/:L<*Y#Zq!Wb8ZphHL?XLX:6NtE/LIneQKycDpVJcV\TinwGXW%
WDK@n\ ^YljX#?PPK+6RF$FX/C>9Z6Ki1pRc9MLd?9=Y6LwE4!ZXyKVkFGbaEqenQ:PY/C8KlG6jDGcH<+cS=8K
XI/G:J C6d8dp+t^Bka%GmbWV>u/?!Tbm9WIFplQ@X1phbtVCWX%!N:Z/^bnD5yu=Si+Kk8RZ<KketuQ9/XI*Y1
84^Y:e =/meqdL/<*6kmkbcS?w$>c!E6QY>aP<t?!#&CT:FbYXVQD$Ak6HNq<ucN!/T6dy@$IC6uZFuN><&pW*I
%jA:qn \\ANd<w*+jXJWCtjyh5:T<w1EEm=nJ@R9ymtYLPNwt*N6tCW#+4GmH8ThhCmC#n<F>9:DeVcZNaJ6=t$
@M4IcK nyjAD5?H9i5T6AF:^c1iBEi>RIKW4GT:KWl1>6KLd=F!Z!GpuSA%DS>%ATKFC/EXE8CMR$qGmiICSDJ&
9XLW\V DLWYDGJ=B\N%i$P$I$<*NimnX>ZPEa%&<NhT!8an/5W=5w%A$qBZ=idN5?+bZ#^w5Zi@<plPF:*q5$=\
kaJNVB K1GQ4eX!uq8Wl9<\XVw<5CVG95eZbuMZe1lBlq=?=W#cYM=iSGmSHTinV1!iBqW@D6^\eE#1AHwa:A8:
lMKTqH 9VHcup>jFkpQ4T@!%XaJJM%HKKD+CpKY/4mQF<MiB#Veu/@Dj5BC>q94w1X#yiaKy+=1X8*6&ja#!=&q
k=lIyq $CGe68#/w8GS%5H9IQW*F4&9!P=NpT/*KwI*SA5Sjd!&ZSG4@5A:X6SiWG%Cd:RyH\=lM+ILkjBceJuY
KnQT&+ 9KX#8>iue$A6%4L*ncG4AYLtIcuCm$#N\PND?bX>btD@++C8L<uhVTGbyw?Bn!>+4Z4+hWa^#*T#E/6X
XSC*NY &Wi=VRSjmF<91$HXB@ejY9TS*=Qnp+9V@GECwW@Q58k4Ithwn%J8+iTkmRaujG!&ZcRRQ/jD&k#ld!wh
l$#9/8 RQGpFeXTB1<SjnW>^9/Y<D4CMey5VFBumD^i1@*nQ/X$u@ym69:RSVnIK+j4Nj9b@Whcmkt%LcNq?Akj
E*&WTi u4H66:^*<yj=WZ?1kEk8Z>u?QwJ?/:RnMh!dAdLD56EV#StWZIDMP9?p/=j\V/5+4RY8n9E1HR&QCKe&
dQmMV@ \4w#:@Ry/5cC\Eq@h^B\?5^jRD?R!^8HS//Lu*N&y/FZBiwY4GS=h\G4:?iJF6?\X%qHZ<G*S<5WI=y>
4Cu>Hy 8BIMl6QiQqyRKa>TWYT=m=GSJkwPpSA@B@TYE6?BD\J+@PQX!6k>Q$8dT/>AChFZyu=8dKTaMdZk&Jc6
C!Zt\i dJC@&Vm<kcJk8PB94CES/bu?IM!@jlS$i>ERPu*qM:18q$PQY>adZdVBybYwQWX>I%p:MSq/HHGB?@/^
?kyEl# <GCWjww&aB4&yEjLFjkqcNiB8VwZdQ9Tc1VQk^L>NQW&VyAE>ZPH9by:&MLN$ni5?9l<R!PX!/jQbtkt
Ca=6?w GANbhcJQak%4eeD>b+ClX?SmcY<5%w%c+<MwLWk%>pKumPB4>ZLpPYMIm*\NWEG&kRDwA:AYCK:m%/<e
/!6q+S #W<5y!PBV9%n8h+TyTq**e?A148mhCcP$#tdX4kt$T\+SaR/+C@NG8>q%MH5yuJZcFYM\p%%*8=IkdyM
m^%dVW =<wt5q11iZLhydQMn=>!ML5Vd@wmql?jjLdHw^&IYT6+<>mq5Hn:De5Tl/8JS59=S+i1N8jX6&=AX^4D
RtJ$p/ >%<lWYHQhLEm1FqkBY:%u5KCni5bujj9Yi<%RX@e*&j:hN/m>!W@&F%jj+41n*d:8LdABATM1qcp61ES
a<?JKS bN/?9QMBE$6h>H>\:iZ1ESknBBQb:QFwRXLV@+S\l1=ZWJjdII<>duHKBEaG<+4ZN*lcK@4C/G5cjjVl
1j&V^* ZEq?a$9m:V6:Jn1qBmq&ByijLJDZ4\le%jGD>Q&#l^eVtt1^/iJl#PcNX/\J1t%>yZ*KyM=MRGCk**^S
\Y#$#A DNpVZ5>lV\\6qQt*ct>EquZlu+mi?+X$iZG\CWcnM<#PDYX^1IV*!aWE6T6@EW1tM5m4<T/:$n<SbVa>
^ia91l ju1&=C!nm=!&NuCiDG/MaPJiTDGAndhCVI@lyi&?@BVF/Dl>b*1S:KdLlK@kGdN:Bw+EVqMdFuuIHGkN
qYbXI< l^:Bnd5n?kudAdM=+LDeaWt%FyeT8wTI$Lwj/%q>Z&/X=m=iXA&D*8Z/*8*=J>w4p?m#8E56R^!hbSLH
?ZCVqY *LWLG<YILZ?Y+HA4Gyn\m6%Wltqt<QtZ?6k!W$$HnBGTyp6My=pQEK1hIBRWE\y9yl5M!wQKa9PT?$H8
cu1:#n +B6KlH6L1MtMaRkAp5+!%l8>n\WYBjeZiSpbH^B4d!Be<KF8nbM=Q*YZ#d5k*jk&1>ZEWK*<ttb6^Z8+
S+5/kp uS^I1q\6aNheHPC%:DMku&c:$Qk&@*&T%lF>j$@lMbB+>h^+tnyBHy9!/qwIG5hy<dqXnWQ@/?uF$+D+
jGJb1: &#td4jn*Rneb:6e?^\lKn\CcTPZRwNSTR4@B!BPCHn8C/Y6pLCc5n4ew:55u8^=8cS$Q^e#B/aYGG?B/
EGciF% AXd@?kVBYE#8Va4*le=Pc*=CiZhX%VqWLa#=y*ZTK/K#ZA=/jl?d$G1&&?K#kk?TTqH>H>uBQdH+u/V\
RBMqHP ?DKuA1^nuV5#bGW:#<%^kdY^AyDQi*yjVd&M><jm\F1D%ja8ApFY!=wuq1PNY6EXE#L^:?9K!SP<jc^D
w^BW9w XKeL?*mFm*YYXbQ#m5hKPV@$bttWy6?jZt^iQ5F1BR!FR&9Mupy?*?VK6*5X9@h<RQLm$<bp?1h1PL<^
EkVwVS RNS=*elB/C\h&ECTESJeIA^DnQH@BI!/cE*5yJX\j8Wl:BY1DBZAPF&n5=#B*QbLZdP>6lPL<XTh**lc
Pq6C:G b$LY^unMmm@*kpG/HEM<N*cj%R1k$YZ6Q@XSA8^ywCmMj6RZLP%qL#=@=htj$/M*kwqH>eQC5X$LqJk*
ldFB5I 1NjbZi/jENGLHl1kul#N5%Du6ALDd:?B=^^4ySJ^kbcik6!=NL9k\uM58WJ=wjWLZLA5a<BLc/8YeZ^9
pQJ4?n P58>JY?&>aQF6KM\5YAB!#EAe#j#iKIXdk:a/DY>IXFew!b=LZc+Gjl8C@WK*J:TV>lmtIMu<F46qiWa
wGL/%W %Y?!P&Y1@Q%J%EFJ6dwh/Klpuu8<Y>Nm^E=LPCVLYWkb9BHuKWdw#th?:/=bEK:YH^P%Si><k^qEYb1&
cF\#k1 N/\=M\L:q6pqjX#VyaQK>$AHa!Hdli4k6#ey!wLF*hE<F\L/P4D69>CXejh@pq!D^hWjQ>BKjjZ1/$h1
LR&M4y cRq*bXET/e%dmKW+m%+i8hD/FCM#:K?J@:^4D+<:cj/e5KkdVupQt!S1%MYHLI@1!KR@=^Fd1m!9@a/X
aPIT8a S9DF5\NEQR^%RZEk?$j?KwI5RBD:\Z+&4n^*yq@%$4amiQGM=Gan=j>iC/b>DiWKA?JSy%L5G>@w4LZG
hm:5BG 6LYY<SWF?1&F9+E:a1&GBi%Sdh1/C+Vb?5D\b?Z/QK>B%b5>iQApdZuCA?6AwB\S@!1cej<6<5AGIqul
!jY*4N FwRd1luFTRaEdHB#T+!J5>%w9FmuGC^5ykb+#@n$E4KST+qNYt!?=Q!FHq*$&>Ct>@QWuDkM&CA/LMEC
FHSCQ4 k=@Xeu*Smc?Lmu+JJ5EbiW@pSywmWq+dVC4p^tZpHTPWBu+jCFqH1\I:CI<^LSH4@HM5btjTdP^t:Fe4
+!+Z\8 ?J=wc5yhFQKEF^k8BdVt%M^cJiuXPwFQHw%d*Zn8@cdHXZBZ8PX$#^1!1W%I4CHT\Ze8#b5+Bn$Xl5tW
<@uF1^ hqh1W6m%*pe*/iDuS5amj=TeL!eatqZ=m8m1ptEM!hhp?D\p9^tC6AE4%#jRTbelK:A=B61Nu1e+BZMu
ickyj@ 9P<?EP%F#heY#AA*#K\GWEDbZbYP!c9kjqHN!M%&wi!c6@<+udna4&:11dJ5Swn8jnB*yW?WX=+>q:P/
VL%ZVA G5Nqu1\Dy+udRqPBiEy8n6W*E:VNK?9XIHeJZ5941Y!iiT9uJ*Dj1Dd*+8/qYZet%+qM*@nI+VpRGmm/
e4H*Xw @Hlu4+>/+Aia*ZVcNQlQqq*Pl!/9#IiqVC?&XHqkK*BXEY#R4i:Ia1NM=u=ZQGGqwcBV>4BP<EpXiXal
B5iN<$ p#4AAylmD89c<<+wed$Bn*6G%JdL8=EWiPSkl>M//K&?b@:&aBHe9K#pLKq4^8>IE&hKuNPBNj@=4W#b
*5Gk\m ^4q=#FK$d15SWTl8>*M/MbT=6GQ8eV:8Bj!cINmDiGhh5FY5d1Anl+:BK$+R<9AtG?lt$N/ZYSYVG@SL
akNpD& JDQySTq6nD$d!Ke1tX>N$6=RCDHHa6WR\/Qn&B:X#mwQ%^%A9q?S!P8wi9/et4qX9aY=b9lSQpVV<i*X
GMW&^R :?<?1u+^m\b?%=#uV&4j@8:kMHVC+@V\R%?@:^\:cnJ#e4kdL>Vk\<4>ZbwqIA5/9CFk!ddy5b^LRLNb
a*uNNk VLAc<ADDJ\$lD$&jm@GuFR&L/4CBN5Zb5w@h=EETCLQtjW5F@F5&/5nBmkuj>k&?nS:#M4FwL+9*JJ>Z
-Aa8dA 000ab261919001202b4 Page 466 of binaries2.zip
SN*ESC a+#8<we^&6/ub<K8mEX86:8^ML4$w$<^d9P4y8p&/@C&Hew?JB@%tV8&CEPV5XcJ$Z5+RH*a@BBnm&Jj
&DwES> q@:/p%=au+@wWjnmmy^%Ib$!lwQ?GPBEnWe$L*%WhiE6G\lTV@yaZZ:t8h$/Cl>Ad!>4nM@lQ&%X=Dc+
R#/Tj: #KapQZNndW1@W5V#8&dhP6q\E><Tmi*B<tPH%mA66TE1k?%^*6:$dX11eCm86WW/5Cc59EMLBRw19bKh
c<tlI^ \WE8FLPA1pIk#LR<RR\%9ey^%&H<X??S4!TDn?BjkMiuuZLtH\j$hFhk?#dk<ZH^Ah@##4J&:l6>!4@$
BST6@T GGK4wB%<+e$=A4bGJt:yw8d=Tp=PPB<?iFDM*?ji4!yHJ:lTt+X4V>c6jDa:*FqiaJR15@F4I\1YdZ!*
9lX6Ai tl&6$F!yupw=$@i5L$AQB*V6LS@MbFDWL#*6Jm:qHGX&>6cblpN1<=/%hQkdV@*Y$m\SBMJ/D@PkCuN%
uQGeaH QDt<HMwNja$LXLabhAIcd5H@>IQYW^BP5iQt%&6*DRw**H>LRRiT=Khhe!p4jZd*&XAT5Fj<eX1Sn!RX
kKVye< 8?%AKI5\kYj1^bYcY+Xa8NBy>duaFVJQKEyQIbdmQ$>nHlRCk=^R@T*Bl1JWNpGDk^#EkGMP1?JhaPki
Y5DbIQ B</RqJhS\QhdW$KRG#ABHPcCHNY\=My:nXdbeQX/FcLF#Jk$Ypn1\D%^8qXVHcM*WL=>KB#J&FJ\4<WE
6$%W!+ /1bebPD+99R$mC=$91S8JaMN$$Z%R@1EytR6M:i9WyqWE^Jn5>&p9tm#S$aq?RG#iFba!%:EtH1Ij@CW
#JDY5\ 9e\<V?>B^*A$a1a^hN:9K&IWNYbTwQ$HnL%dSlIQk=/4#CkYR*B&a5\1/S@FYQHkE%$b=nSSB9I6K1J#
l^ubHA bhW/lYVmmltH14BPm<JTtZEl?ukEEnjP5DkpqY8&wZT>QY\+Qj/iK1BNly>X8>t!G+!TXE>+A*\X9cj\
pXDV#K VBkl1#hW::/a!&MYGu^njcX51$J9<ubCIeR6lDbn^J4Nb%6SH/\pX\jaq&lVuhMS&<XG$4ql\XGI%T98
=B^QT8 %8V1cDBaj5QiFlk$Y1j!%\GibI>/&WHmIeKqnFbc8>p:XQKd:$!9YXECy9W>1B*6q:MQ\!^SDd6D$FVQ
C@9dGw ?<aae:tm\<:#Lc>@5IuBdB#J9b8NCTluqqVm4<c%#l+V>$e*6DckZM#LE%EpeY=qXP%N#JLjWjtE9#eG
5WFT1e &t*=XHM6/naeI:m*8ZGwZiB$yY<Wl=QG<\+66B@pSLw5ILEMbY\+GujmqH<k8LZ9ScpWa/!XJ*N#wPb\
Rp+i&P Gh8dt=JBe!bNRT<6MIm&Td=^tq<Pi5Kc=yZaX1=naNG<pGZ^YR!^=a&JSZVF54^GXL6a1NRL\dy11b8:
M/wCaC l$k9H/hdiMWH4dmtX#SEBZcj5yuQ=!q@Zij@m4@P^u1jp\9#dJjSD5u&jLEbRnnBDH\di+hX8Int4cqt
:RbjS% n#@Xw&4X+Q\Sy$w%\LY&<tT@9FKa4%bM8HBl\V%w9HeWI+TyQt!!X*XkBbjWhB@!ThL1wm1n#SH5Y^=Y
Gc^5qk VQ\PBq@NRPpHW!c6Ab1y&lJBPR^S4CYy9tART4Z?\$KRV^VLhAQ*ej#I&whd4V&i4iH=kR4J%:W/Rn\\
Ct/\@J +9w=n*e\k:p4>%QD*wXnWWy6PjFawkkCk%WZcXYe:?<j8B*BG6de5JajRt1%#Ba:D+IL^!F4hBtN#EY!
E@?6N? H#kBweNtNIpCP6\l1D?piLR*Edh@Z=@F4kKbG4!1!AptKCdu5L19aq9ZpD6CXt:h+aJ/ItLRPtS$e:/*
=GSAa/ V/>/aI5/:E>HWVPKi91?M%5Ie<%uI!dZ1ZN/M>YVey$C/:4yWA#Bpq=81@1GJYEKKt?EC1N=hZ#?/Ba6
>wXw\F hB=JI!XT5qKZFM/uEImue$wQL5XtW?Yn<=XEJW*W:qkXl&WNjMWN6D8qq/!ae:\!Z5qq4#ma*bPTVXJI
V^nN4G :iBphp@?$aZ%IEBQKwFD@Rhi>F:V!+BSWX%=X&%e51:/!q4F<5KAh?>=RNuPdD5J@aGDPmp\@I\^bp6V
LWhX<: >/!+N\9/l+1hhMBYRLm9+lG^^Y^%pTmM/Gi/LX%/5aA<y%e1\+qXySN9hn4^JNIQLTu$qmwkJY<S*d=9
1EJym1 ?Gt!=tw4#cjtct@h=^cGKMP%GcjMa</X=tw:#bXY1+PZuj6I4bm4Fj9tNmePP&?PpjcEq?a5!?ch%$/%
u49GpW /th&6ltupJhnn8=#d#*$c?dtN4ckwK\>ABdMGkaAAIC*<+dhiS/?>44&ZGt6Q8bice\/bB@?c&&q&p4j
8+P9*E dWm%e>c>5aN:ZJDPE8ecG6NGTBCb5FVBtJPFp\XimpTclktE:We%!W^y9jQj?u81PA!!cjuw$Yq!udb\
dy1E!6 dM95Wc8eeZAml4h#PNFFqct++FJyec\jW#KYqEBcJk=YWbwXL4qWi5m\@clI9H@V6=!iSW??W4Byia/e
&iP16A #B!:d^>Qb/C<me^$q8MpIGFZ\4X=!p@knXc$YBLj5AVQyX%\4DdLmJu+$15*R>$#!WZ8\hptyZcI6Jui
<%Nl!E yR6qT&R%NG9Q*L1F+hwiNiBkji1@F/6kYQ>yp+cy1BRSY8%E>+SEMc$+>^4*RF$uP4jXubpmiEFludkh
/SCuVP SYnn@YV/^BVJ*@=\Gm5cJnJB1Ln^T\J<E8@B+VSSkwR/8//uItRyRW^Q>@M%WelG&G>pA91+:ZBH*VuJ
Ku8\Jy m+9cyAcCl85Q\+dVy6it%*l8CR@yM9:b:GbN!H6Haa^$StFeNVp\45kCYec\>q8IyhLd=F*^$1R/*m%Z
4!h$n> ywD*P:GDH+XV$c$V*y%k4ILJtlc4=TJGG*bSu^jSpkbQX5BAlhF&l5yFV<V#MccmDN*>&<V^l5&<5%Y:
y#*Nj5 5T?/%Y\G#nEQbCH64JtbcI\CJJn4AbtdAI=uaV#emwbp>HCb:6$DuTGQC@1jB&w^PJNTy+ipGq98>IKj
\XDpc= udZCBCElV/p&=JFa6/X^%M$kj!#9n?PYKXwMPPj=@wk66Y=b6PLP=kY9ZqmdMVYbKYPdWLPq%DD:t6?l
jLnZe9 MXXGa\j+w&K::!?$&&XJQbW?XH/Xi/c\wEM<+$%QX5=m:!m1u@l*<6SblJ^6K9#GeVXtP1K&QMW$8l1N
+ZSkl= V=aqqC5LW&Z?<++11@mqJ:p:DNJNEt$Hp>e&S4Vm+$ZuLL5LVIBneWy6Twnd%#i8*EyBZ6F=15e=!iiI
&wjZ=Z 9^MhVdq*a#ydPaYY*8VQl1uqJXSkZZ&=DiwBletwluqI+9B$^#KtJNP5ew?I6#4uEiy*R&5YY5Jp:dpc
GkCqcD Pb/?aFy<+1btpkt\N1b6Jn:j$^Fh=TLMpF95VkC6qNFWE/waZBJ/npwla/VK96ISpbT=S4!@=5wi%nA>
ZjWqIF AT9L^u1!iLhmp\/KPbilXD/T@Hmp$<^XLCiLQV4Z8tI>nm^b6G4M<d:ew8G5c=FPX5PN9#Ii$H!Z1IlX
SdF+%9 RKjMeeT^?*&tiT>m=amdAGc>k:Qb@55<eZ4Q^1YQmqEMSN6+p:%E8d%%>b$8y:$u/L89^q8tHh<w%5!%
?ht$EC /4=1$tBMPmS>e&#^KHHYi<t&hPqZ:8ibbSeYDJpqXM/X8XXP1?m8neu#IPKlK9&Pn*B4puSQA1*5+MKH
&68L<N a96%!+=9kyX\nY9tXKG^*dHk&e+i^/<+=qXMI%wlVb=HBByT*eE#%dMIXPJ?yhAQZy\N!PYYQ@qMEd\4
+b6:u4 @CPWh^mEX#&\qCVi9X&8!>\QMW&:\:C?*nFAi@+1bl#RJZdXh5cp$RKm%IHnY&P4\C+IW%L\%/W/jFHM
e=Tm1S C<?1:qLPaHR?>pQ<Ei\H8#:JCh!:Fb*B:KHF6$!#S>H:$Fm\+M@=6tn<5LpES8PdD6qDCG@klmb!h%nd
R+MEtb Pp@=>!mE>KDRP8qQEiE/yXPNMCIw^8Q/485BViI5Q&yQKbTja$Xhi5:6#E:9L/L!qRWRI^%^bl%V5Kyu
?ImWjD *%M&VS^@iRi<AlN5\M%6pcy<puDbH^k&GT!*Z\$iI>1EaCwE8\lS6$#$Z4>kGmNC@GTYV@\JEHX?<AF>
Lcd5Ge m95kjhGhAWdYQW+DBkTch/+*Cb$BQyY<DQ*ynSHdG/DHXmFN&J/YNX%<aaS1%$MBH\QM4FDeZ>Ij=ccu
^A9aD? =:!^eu&VBJC<+pM$1<5Zu$XhVC%X&ZaP1bt*/C!qnS?tB:yIHp\X&5ihPbRHNeVSYuW=p@ylDGL>W:@l
*V$Y$h iiND<qLu&5a+\#?c&BNF*^G+@Dha^u@VWZ!t#+Y+X%CXBK&I6AKBm+Na\6&!9/apCh1EZGZJZVRH\*XD
aqIJNa qi\q&w/DVBkV#:V!XXCKIXn5cp:tAka<lM5M6ApDBmh%M=@WM!D\!5jJqIVT4/VdChEV^SJV4NhL\>1q
TS+*^k W6Km8Xae6Ekkj!QFS:H=w=?\Nc1a^#kybQRP?TEK:H9mwEl$RR:yREDj#=*X$mwbVwSwh1\E&I#\=+jC
P!u$=X ?+VlC^i#9Xa^hERea<</:BGI+JDPY+&LPn8hQQ!yeuIyBAC#R%5Veie@ajwjVtY>I>EN/@YM<S>Yi:DL
+?<W?k +CNIe#KLuE=Iq+wpW*S$bNIEn1Zel<@aVHCcm><X:b<S*QBdbmXaJ=Shm^TYqk1Xh>H/!Y1GG%XNQ@cC
IIMD@5 #*HEwI:8T6ZTH<t>a5MR&iLM*Jaqmb#8#kt<STu+FchCG@*l^Bwww+*%jLj1/P!pK:l<Q/8?!GV$9dP$
Ruuiy> @&bjacn9d1NqebDAp#BmXpk66cRBujwF>wX4q\ACpM>DF9:BMmyeqQIt8>6#djK\ZdZ$?i%y*Q*:^4+!
Yh+#PA iAe^+GIYmLQw8IDS?TyTkeb#8dABB5T=Y58l>NQ4Rc?F//1t5uJyBk?XumVDw9RyWTB*I1A/wCnHmbth
9988K# cFHc=Ll=Rc*JE%1ItmhSD<P&:<@$u$njXWYa#1=N*>&8HJA/<p1?:*%4RylctJnB?N@*cPLniBtFQ*tQ
1c8$5M C&pw<dpHyhEyqALe4HG@*6%1W*>^k<qP+T:h:G6B<etEFX+&b$G6pqb#G6j\jC@Q#8byF\Y9J>uG@?m4
1?#\48 ?5d6a1H^cXZw*DKScpQyT:jZXwKA>tbLN@8Ci>H\cPF@@6ZM$RFD%CFX/qR/cIKKe1cm$5b6#<8@Aibq
9Mb<:= L#DA55*ji8HY4H>VHRwP#+6t*%C8IYCe?i$$cDPGmP=EplFb/ydL/?ky8w/<C^F#KNCujIpVk=w8du9N
Zht#QV iZud+TK>yYB+e:%*iDnRdN$\i@1mBWQHbilK$XJG5n/ukd=aKe\d1TKjZSR$DBIEdcY1lyi@QcHD<H9V
apuw+M 8jwDh4@d*jy19@S?M&Cki>PbZRXKC1@Aa4q+E<+FYnd6nTAIq9AyWdyX&&QX8&GZqLd\D/X%6SSZyMHl
KldJ&< +Kkib6ZN!9mqu>8tTh&SP$#FVE?$MZ6G!\QMwpqFQPFI8hKHDD9/*t?<<&R&16KZCCX8=a:E$CbSce$T
\G%K&w 6@X>5>kD5\SVZ=p/%K5VZeS$6V*nH^K%ieYLE>RD:5&KRjaPcDDX&S+5KQW&XVV6Yq=%dbAC5EVB\LNC
FWRQJq JS/iqc:ahj:X#WypB5V5Gwh?$X>mi#ayZ%1<kLa>GpbMXn#b/E5h+J88=:!mimcb9aBc@PlB:K=hInIm
5*W?LE W:\=*bCwaSh^Ejn*8KD1SD*V%4uj=X@k*$eyi=A=\KMjQ>D%BITjMyGKtiP/^4\6A\G6I/LYh8d&=d@h
:eV#AQ YH*&pty:I8*<<^l8k%wB?Ddjd>e%S<bJCk$Z#N*wVeYG1PY<D^n8djutAd\9>DlTEjHMm=*?PVBkX1t<
!/?SP6 NqY:HlVTFBFa1TMRp1C:%qWqymBhGN^k@YcBZ\C\B?!9F1>bXuISn:a^Hdhkl/HcL9B4DyDVI5b1q=KZ
1!!mhT w:ew*k6iGhBRJ==%T@w#ccq?KQ+<QaRqM%e>AQ+uIm6+hnBE\4PaXMHQT9KLlq/Xm9e=B\eH=5XuA4QD
-AXq>H 00043060034001202b4 Page 467 of binaries2.zip
5tI4X1 Vwe+SaPE!jYC@jan#NAELXL&eSQMeJudHyMjG^pcymXG:GT@Id=V\RI&QQbmMEpE4*y!HAhEwm8:RdV%
P>lpdQ FmBBZHKaEwl6ua!MbmqC9V&bES@CDB4YKXqL\F4/ME*V\:8yMVuWG$^IM@!mTIG?L!Gc\MeJ&X4R5^he
RX@hVE %KNF/q1R>H#T/F<&dt>=@/!T$&I+VK9QFhA1lSp9XKSABtNK5bSkbKVAbWh+JT+u&9ViXh68ZEInw5/e
X&5G+y BLMaeki9KWAhwKV1@WR:%GZ5P@b+94Futw/^K%kNyQXBHZAN<:&X#qFtA$KMkKqmaIEq=aJX+6qkCKVH
4El9k: j9W@NHCYd$kjE?a8R%+%5e#!RD1k?@HFVcMNR!B6pSpht@PHp%C<SIXmTLT<QaC=myALiYba1X#+\dCY
PP%EC: 5Bd!\bDWm?dlPGLRl$S6b^DkFe%<VHnTwKwI1u:$8j\\nBdYaXmllKVetW+E1<GSqqcF!TJNLQ\=WVC&
RGqb66 8&&NkLticyiXdbN>^NyDShMP9mn*Rl9$NEuH^!*@<PG+ucF$pY449n?PCEcDjDp4k4KK+4%P/HRdk#aj
NFGAb1 8b^!!tLi$C=nuKW66R?mJe<MC/cRXtFp*KqyiE^?qHdiWB@B*mA$nilSYPFp*lqLK:+qhLMK1R9I@lE>
:HS51% jDJyRJQc1B5klG?1SWQLXNJtnZ!LY1!^IaE:d94/y%$$t@9Y/Z:ahh^WI$y>FA6F>lh!T1TL<L+?^:e#
JbKuKB dPKMdW%<q#YuCd$b6wcELq1GQi9kiD@h/uaPpWkJDSQ/K58GR!!6hu\/t\q!8a^?:AQ:d#L$$+q+R^Ru
iY6kNu >jKSt4Hy\YGd/V#>bM=LWKSDR+*!kwKadjjVuHc9i:XTbiFq=4Z!wk*#FJ8P!5tpBCeSLkk=WWdaC?eD
cB6y1b uGM%pTunI!DX95+BD<59:*Jp<ZBSJTnDZCN/B+QmTaPjqk/yPyu\p!wwW9$K#HFP^JG+SkT*B+d64SI+
!8GE$j Ya9%4X\a+c1WQ!5m*R?Q:EG??TESAMlw\\9L!Vlq1!eKpCmDR\9k4iBAC?j<IhSPDLwNmcmcJiVnyy%@
Z^RY:H eJum/5YHy+SIRR6>!XZ6?61e\4I=FMm!!9/E/*E>^w>5iJ>ln>d1VyAbJy!SXbSI=y>j\XjW^+njndA!
1XpWK# \Ca^!KBVV9=pmlGAXCV!cBlHT#BblH1k#VCQ8Vi\pFa#16\b$bbYW5l$ZNBm!c*4iQcEIeb?1cRh<ClQ
%aec$l 8%AwSwT8>ed59cewW</&&m=QA@?%S:$$RL%>+bTK!pR5apKjjcu=Bm$nQIqJ^FmCqlN^t6a<%$MJQ95$
IY%1&Q eA6!\Xy/Zk%#Fq>+#mM4CRy$cFnEcw$#1eTRmC<l/jCdWI$pR*#p$w6qb%mW81M\M1:T*l@^/NN!WqHp
tj9AA+ RDlGC\lpVEKaK%kmwnn6>dbwKN/T95yimR4:yYH<ij\=MEQ9Pip&R//8YQX66tHBP&RYkhqTT4aBthJ^
//PAwe YyR*<D^Fh#!&EDjE^:GeqWmeeccb$TnLYXM8<*wN>1a1djX:<?^=@TBk<I4=&*>?E9bXcn=F6#%=tQZm
6/RA14 bey\ZL+K8Il*D9VP4>/^<81YGViQH^c:tp&=Y$t##QIk^ZA1EnhKh:SG<4k?eM4=\jXYRbT<N/bQAE!A
aVF/C4 +RBWBG5qqjq:*!In:=y*?ZmBHDFa\>JIi/X5NDttM/t?W+M1t@Q&V#T<ud@k4*yKC&4!!YDMu:5?uD=Y
!PD%i& m!tBX4KZJmjuJVF:B<#k5FKR6VS1=<HZBZQ8YB$9G1L+BecqFVd6a$pZYnYC44LJ&P4NVu:+u5mEkp%u
FXelBk !t?PGJTdD1wB58j$IYSRVQk/FYV$K%RyyuTGT!cRKVJ>hC?5wT*Wb+D>DaJX8cNTI4Sql\?$V\+aNk6K
p:WL%M nE/XaMPhe5/a*aq%DS4klnXbTcKQ^\wJ8HFTD+R<8m!WDL6j9G&*5\!jd\=@XyZ9y<>LcT4ck@uyQkHp
qnA@e? mXY/?+Vmpa<VVujKKNwd?/%44e$y=Y5ePy:9SpMnuQP+S4X+hF4Rl!jJ+dNdwDDAhe<GpDuB%G5V^4y&
qd=D+> Tm#m%5b!WV*Fubj^WTmHJ/Tpc#^SN5+!uGTpWb*i8$6ekl4>k?@\^S#^5XQ<9PFJPdVt>euS=YhT8CI4
Ni8*&y LX*/wTC!@=a4K4d$MFZj>>#<H&>Mw^=n9c8DDFeXMEJeMn\pAt+AkEahe&u!1lmyEZ@:H1*wMen6&MKk
N>I\>> ISMkCwBlk1WVC!X9MLRVIpcDE1^6XtM@9$bMt<R?Z#Kl%qJXXjELYdj#>&tKBt1AVP$uy@NnqpWk&p^9
4$@5%? qq^?Ii&8nH+?tqd&a:^?=wFVMkwCjMNJ/8QWZZtMMAdn\Rww>I^YS1!!<+:44d=hmJNGaNLk/kDR/!cQ
1\VCRL hcRA+DHMKB9ZNa\#kLKSSyZVN1N<<D8X>9hFndyX*nWdNIw!Tlq$QV@NL@Yu6$b:jw$wpwApw^W1uH:%
594Lw& FFEnaqyc&5EyM/c=kA>+qeJA^WBAQMc#&D%1%GeXcGq&qjd$q#=$<*1=duQG^FLRiw!+pkTbeJFlAMm=
GITA6F aB4iiQWT%9HAEE<y4c%jtbF=y5buPa9KAam4J+R^#1S8JQ%DCEZ<R$C6GPn*FD?I49P&qjin*NFWnb>T
#CN:+8 #cL\<Dh*Z%>>mk#+Iwuq:&Tu!8#aA!D\C5F*$WeVQ<hkZCcdXe#N8J8K5ik?&$aKld5=Y>JVljYY=9pV
HdlE/c AFIBM5Lpb#^H>RyHiLT#RMhIG=6Z9eFb%1mGAt/b+1?ywK5yjYuIatWE=iuZ%?PdaeP^ESNV9Q#Z6Lp*
+ScRRb 4M%c\c^b!TT8@i%ciYAC=hLY$:6X\#b4I&RGFe9JNw@8qXnDM9@dpI\nj%YPnWeHcHESqbPnQ>yiH\\P
>d!$P< d!?$6I\6J6=D?5RK#ZQe%Z^YN<A/VyinNYWcpq8iiqQHMR/^neBct5ilY@j#&Kl!#XXePqPccbiZ^%Wa
??S$&B aQXXSu4QVqS1EN>tTFXiYA^9$WPtGd?54Zq\n1#\:NT/cEtJwthHjV%&AE+ZE#9SPb\C^*:GjKLGhwHc
1%R\^I !buy%#\d#\QRWhVcLd%4&?5mZ1p1tP9N<R1jCm%+Xe&I*4=YGjQjdAddp!mWClhYYdP?aj5:>XRM&jWV
IiRCiL jLq9m<EBX8<KlXa^c#9d@GFATF:V<dY:QCEQI@R5E@i&I8qBClDTXRq1wp6Gqb5#S66=MQFE<B9uY1@%
#9HaiG Hy@LEdY#6G4CZ5<NCQI5Z#ebR=Z6NaY6DQbASMY!1?9Sh6M&dm>5jN/61QXqc?P$85p*+>IZZhNXMWhV
+d^Te= TMBXwhXeKu/6tA^HLl8nl1#hFJeZ#d1mwu=jlH4hnV^JXt5GBkyy6Yy?at^jGy%1SypS8/!C>I>iA$Dt
wqMbHq V&R5S<4Q/4^*LTq>lL\4Njl1!ee*#/a>w??$9&c?#$HK+DG?WYa\i6#K*Q1B1$TJ8uZG9q@H5b<GudTj
AyBhIp X@By\umQQCDD!w^E#:E4nDIw<JPIbp*9MY8y?KbZG^<uy%p!:>@/<Q!L?C=KmYhht/iDEGtASVw%Xu8<
iaGd/C ^&5N@cbmN=jiJ5LiRV\lRVJaXLe99PRalEMGq6Q^aq%G9*N=>6P#LWQh<Q!lI1$J<j9+JX8/p!Q9FiKh
D^\!P* KXE&a=X=cn%G:&u9qphdGKS>FihM1hNRNJFE4@Y<=/EqRIQZ6EYFcNb1iidV1//VZ1dZ:?awW+bAQwXE
w+Am#Q 8ba:n%Z+C%EW4HR9Wm@8lZiDNM&aPJaZJmSaFQAcpnAGCMDMLy^+K?IW^<BCWqhhVpaP%ik=G8G+<N:I
HmR*!K k/$bA*9*?KuIuHd>VKpb%>HtY/J:8%bGjFVT9t!yQRLBN!X>WkDtibYbL46&S\R@?QPt#C\:9!#98==M
cZVRMQ 9Jc4^M&4t+yMJpGi?THV8b?+F^EnXhZ:Ly+cHdItl4W>#W!^JqE^ciRZjpFEk\p^Ih\@1a5wW%d1H4<h
Y9E@1A <L+:5141FcJ1qAn&J^d$tW=lK%TNulCE%=GEuT9N4kEI:>SaKZ>>9w=IEuWwRRAkFA!b8Qlt^^FB?SME
JR8RD1 8&MumaEDF!wh/*EeIFIPTT$e!<*ZAb>^4>G@uX/XJWn/Tt#cHu\Y+Bde<apIAwqlmHwGj&pcC$eNiwMw
m$C=ce >tNMicYtFmlKBFJ8Q@Gh4L\+WeJcpT4DuYqPKc+\^J9QqRDRHcP1P>?^Zk*SVI#n5V5hGb+F+h<*iJeT
\Y*=6* @Qtp/e*1N5dG%J5@?9JkdJl%X*wZH$TwA=iN&GlDh+<aP4+1H+!D8REmJ4bJ4SdKtmem1Qu%NlI8^%&&
Ayhu>h ?AEELND%4Vnjbqi1IN?8\^IWTykcRECqB59JmqSEK>TGjTb%JpcuZcN&cCRJplM<ILPG#dW@8D?kKtEp
d9<P1= cakFYZp6DBwtItpA1kwk/#>YuF#4c+QwGS8NJ+a:W\ym9mYBFYkF5L8\N!yG>LXNVAuTMWAu%aPNhw\+
QWPQq> ^llFG6CJ/+?@W^Q$F\VBYjRJ?Q!J:a!kmDN4MVcMIRPTy+^!M:NB9H?yN@!wbK*jJI^De9Bj+wjEBCN=
cdq?#u u6n5X\qnXMeTXpCL/J/14dHK\+^H51/&iwV*>\eBSQ$kmkMPII=ZcISqehVeM6aRSSGEXVbm$>&w686Z
Jdwukh FRuCSD4mR/itnp6kDFawmkTRc&B8mFJ8%RhNm!<4PCbQc:j!Pqu>mlVenHLb?Rc&mTNtFSbQWIpXBAd<
jWZL?i \HSDtdT8bySiSScBc/Y!TuhhPMyVmWBFE@L+Mq!A#DNeWpaEB<+L+ReTcb<dp5JAh?^PFLJGW?u<iYV+
BC%@Wd iu!\upJ9HGR$YAawcPnnD$MF1Ge!IcPGa$#+%5Rd\?tL<6wc#dkVMYJD%&eiu@9VBI6MA9IADTTAaLCG
PB*k?u K\1!*@qJ*cwC&nVXbG>YS#XNLCyJ$cEj>?VR+CV?RRRH@kAR<AhyWktVy5i68lE+A+!q+hYQnj+dRwiK
aXWu$9 =QB&QT9#5pBSkyA%XH%!WJk$E*CPCLnK4Pk\EW#^WV>V1\6V%\DVbSmKZLZ5AGAAPNMe*B\+\CSG11$c
*u#R<# NZR?dSl$uJY+C#M&h:MdETblTb%N>$keMVlQ^IJI%B@\k*TTeWh:!qh##Z@Ch5iIi:1Dp#Tqwq=5ilEM
>?cE5J DBFS6KMktB^aAG#KYdI11>P#baQEtjT?pNwp?kIVM:Dy&eXbES4^E>\@@+\ATKNwy*HTcG*huI1wEh@:
lRL9*H !bacWZM+w1@u8/EACCZ5TAkA=BwGLtIlJYhF\ib?A?S9&P/A?im^kba&6DdL9SYHCIJj:$<p4W?k!tRD
+w?!n\ ub1!&1KcB<#b1j/q8XLNEcueei*SIJaG^Jjl@\MpHJVpLD!ThqLnJNIeJda^:bn%Y/5ESm5+!iw:ZS@a
/\eiVq u^5k>\$AEJEDIMFG=5bNGJinyp\Dk<+?11Pi=W*PacNG4c6TZ\Aa?B>AABZKAII<SSlFJnCVmTpn5iC+
nw=liA by8Q/%\1$aF?c$544IA9cL=dQG$CKPmJZ<\1I6+YZ4RXna/eJ<w\VDwP#/hDE8pSyX#*Bd59?X@AJ!V?
ZSVKPh JGE@FBD#XEdGK8IdNF:L%9!y/uMS=P+h!pa$GS8=n5dE5L:DDH:HIYITDaKCC<L^aMdH^#i+Qyt95Qnm
uTePqc Y#&ZDWi9Wdj:$a1@Bhi8@AAKIAkpCAn5=&>aIbQ%V/Ym9dh/at1j#*&M%K?McE=?t8Rj\9AAK$IMVCES
PCBDT/ MqAEktGuNncy^M^MnY<u5^:l+!H=AY+y&w1jMlFXJj5DiI\jL\WYh6\A5^GVJt&#K5nwn+*MCQBaK&q^
E!&Z+N %YnCGDqMHwAECLKAEEWCmy1J6pbp5j:luPS1:t1CYpYDMwQqt>GIikmkBT!tHnnYeKTQ^8J/j4E&$dqI
R\dBV6 b^y6SMYa^8VHtE/AJMZjJ:!HCG1:b8kjGS$>C=M:w%IjM+HWuK1Kji$CAMXp/IHMKVlI$1k&WTuS@KlK
-AZd^6 000e4794c22001202b4 Page 468 of binaries2.zip
V1NlXJ XMK?%#Qnn:R%L8EXcSBeSFwmYWcHeTSXSpcLNi$KV#9:LQ@BipkW9u8yySw8FFW4H^!EE9=D5l&4^Vh>
wT<>FL i+8l@wq?R+GYwwT*wpqIyFkanW\?:KIw5BFqW1Gmce9nW58t#G\Y4N:GjQYX5d4R:#SwTq8\mJLl^%t!
SFpQ4/ ETHqjZ&%%FS&&85/ACXbE8=LmkS8Pa:b1+wFm61&PD>K@pZnuajlqidi@QZhYaJ<\El99!hwE1Ni+C5D
SbSW*W AAWcWy#R\BARdTVtyVM&bZ:9t+qIT%wX&5YRaC6\wMq*$k>X^pkaFp::5$lWpP8dMeh+P<y:yw8KW5yB
BldT/n %*ANcB=a\B\A?KAlH!FV\6Ap?T*E=\>\+!8j@q8J\FAE/Yqyc1b1y11mI9<?\5LRqq^Hai$BLtP5id+l
$B<lb! <<GT9\n5HpdZwLtbhyQ&/9LYNeFG#N?ky^9<6/y&nZyW+65EqL&SHcFJwCtQPMC$6*y6&J+tMh:^TjIX
k/!CL\ G&cB#*Y^1Vj#@uR8\mRju5cPdB/L\d*tA4K9n^Z<5!A=\Bnk!ncSt5H=4k#mJtN*c1\bZVHStlR/i=%b
@QcC8/ e$BSJSGcaS=DYm!5ZjQKyVK8/Rm$/hF*RppnyF1Hht:lBiam965n^Ani+5iW:IRJty*X8LQiS#uFD?nu
pVZ*6I 9Th4^QML!c=TA/CZGR&8mCH5ReXAwQwI?ke%SQ?aA$Pi45GBG!!\SPy\E==A\+jbE!aw?G@ZiFn5JYe*
A#Cteb BlmKcWpdj\%l8=Kl$*F!j\PNe1+%BC#4tR<!C^hHTi\qN86SP$imJQ+p#>dnDwh>QmGMhFVEKyA\YQV8
V!=4WB /a8cy1<iVntwa1%mw5I=#&*y$1m!:w6&Iy#q+5e#AiEd1\?Ib#kwbq\PRVtJhBpV+&:nplce\HA9GWbC
hQkTey nFH:8G*Hia4FR=hIadNGN+RhmTh+M$y9PBE5N=IY&PD89>^WGt\PQKh6RG^XlVTtLA!mnqQb:E*SKE>4
bYT@!6 lH$?C/ST\&XDq61lG8i+c/HRdG>ZC<KtZIZ+Mh5ES6?!JAI1lFRYWBb!d$/WEN8uL1*^CdpyEal&wGyn
9HZnpb PpKDP*KYbei!$D!l/K!nQa#:qTM$KK1=BBI!tFIRHtSm$IdG6akRQ+!nHV1Z8A+LX\n4=bw*w5E1*SED
W*%<ZR I#SBHwqDNI54G%:4<y&:H^W&Sm#eZmPILwCDRNnE%W84<8p\FSTp*bT5T+&w\V&$H5YZq=np*6pZ$AkD
1ll\B$ yGi/:C#RbB4/!:ZeE4uE%?6=#I:XC4Fhpw6ENl%c>t&TDDW\CTMu6:qDiWLKVt:k+Gc\BA@EC+!L8TXh
L<EGF@ %ybJ&A$TC9!G#kLT5mj=^KcJSjB\P@MIVTcQCI*\$LVXKV+YRReB5dFweWh$99AewlmPj=*=%VqLRh4K
4+aqb? 4i<$pnehNaXhRcV5&Nw$9=$E#B1Nl4REYEN48nRe4Ku/?TR&Yw*/c+AlW/&>hc!%EXY*HMaMyD$\aw$q
=?nb$W DEFjl^GwR1ETjA:d=V58BTXp%EEwlIn1B&l!CWT/@p>!y1\e@8:$54X9w@m%89ce8FqFkuD\mLMAF451
T*5!I& Y\XD%LYNbMcDL4nNSl^/%4cJ<!\PI8kaJa5Zl:!D?l=LHu+e</=<\QT98i%?w#VLQ+ME?i95B8W?aLZ9
n\KRDJ d>ln=AL/<#$SRyK6nJnK#46P$FDC&K\B#mdw9qEMw1NR#IuCVW^%/9K5GB:^%!1A:ip$iDR95Z5ES*dc
HGhyiD *SAdT!PEy>QSWHB*G1VpG<HyH!Ft/Z*%Q#5JZkj=DY&l/4$6*lH>JhYEVTniw15CGF14^\n/e:nd^Mtd
B%8L>i w8n&@MctH<wkBHhCta#+tKWRBewtpY=bZ\?C8pypIw$I?#dJ^?T=CjX\mdDLb9jZDG5mGF15yKAcMG\>
MDj*Z9 FWA/C^K4LpM6Ip#J/Atjy/LKj9P5E^FA5QL6VGY?ZX8I:Nd4P=u^?D^9eT!G8lPeCyQZRDB5\=*QS:wZ
QYy8$a KW\JC?e8dE8kJw%JNiVJ+9X&Hpe@bJ!G@?accMHlCnP&RhStjhCW\kk^^G>K+t:WQJdhqajL6YpP\ahL
TJEbF! &hF:/A?ntc>EG\B9M+=BaEAqiEkXqjLW/Z%6&9W+GML#<I6$HppJ+<6w=$Iy/6qEpPFYtlAhn<@lB4QS
nk+F&$ nX84C^Ypwdm&p5d8LTV?kli4$\eCXFL%9TF8k?qZ$#y^6hccWahCBIY5*4lqElNPX@J1y@Tm6ek@Gcy4
d/$HDZ F<X^5pc=?KScIjM+#<B<mu=yB=L$5^C&SjV$SWeS!\$1DCw++FTX5:pbCe6*D$IA*P1iqAuu\>V+/J81
1l!99T A/4aa8PhWIAi+X#1X*l9tR%QE@RnmajTm5@mmm@dX8jJGlRw=8=aV?cAa>G!aSS5<wN^/pYhNt*9YpAt
9cb%q@ \CeaPuZth94pFd<b&>mc%eI/J6>DV:+l8:lH!jk=a>FmBiK%H<eIwkX5HJ5<^NLBh+p%^+l151Lcd5D4
8nPGQm D@AM/R+m:DHeHk%*=qGC*QZWnPXaQRjpLliEkN#h<?Xh^N\Hm^8h>:D4<6i+EQC!kC:DL1i:Xi+6+p6M
Sjw&$? nVd^wtLiPk8AIwRFtTjlEillE+G$dChY<TIZjiba$wyHFKnJk:cVn\uu$k1wD%DB5@Qe$i>eKQlPMWL:
:ypDpK 8EPLymHj=y<KRpZA6jW9PFe=@:n<84L@4c$W&kw=C@:+RiIBM5Sq16XCG6R^8ue9RmmE$:RTT<9mSDTy
L/Z5&y I=FYW#pZZ5S=MSI&H1G6LN%$mDa>el+>n1:$SXE#TS#n4Q\pKZTC8$e9:Pu%8&X4WW9eQ?b8:1p@cmeX
1PEPHl awAFIWjGj/?QlCPXZGTKH6EQliABAV5/BE/Ri@b1L$a/jXb/V*/S<9q&SPQ$Yeqpaq=^+:KcRYV\Zcj+
CbD1^p W4Z?=m:@l@^hY*%1qAQ>u5tSme5qt?c>1TVncRiXw^i!tJhZ9p/hZyQn+yhpjJ5Qpi>SkNMe\Hik:wRM
kllNw8 mupYPZ=%9K&!5WIYNXi:Fj$4ucp69@/$8Bj#nQP&Q!\$IQduwSM@b#/Mpk&=:%T6KW%+FNMQ::wL*5hR
y>^V9@ E^bX4+bDhyFSa&c#9w$d!mA^hQ5D?BPQW5b=d5q$cPB$=cF5K/E5Vt<yyQ*Tl^bF\IMqAR\m:a:@bpCy
q81+4! 9^HEFWSR!=EaC6ACpRPeklVmQ6P%/BQ>JR/$%=HJpZWSN?VclV$V8CJ?c/^RIdkMm=TQmN4QH@&#9NR5
8A?%Tm DL+=$akRAWlI9QHAqL@ywAdlb/PnnXTF9KPE5mRlLZ+\pWQX%#uRlFC\/tbPHi+My=XN+ISV<p$=1?yG
6N!t!m +pw*:\iHyCWV^akRaeQ#+!IqPlK!lwDaAC&\A@hqmI=DK99D\bdq4Y%h8/*nRB4QpCFcE%::LiD:L!M%
+>mAIM 4MXM/6Z@KpY#behc6EH4a^9/@*D*#%F&j5*CKL4cb6y&Pt$ndX6y&:b6G$td/W:d6y&&dcX6a=&X*@8?
1=>>p6 ?>9:8\jn*HH@85?VimaK5/ytXe&=^8k^Eke&iQLmI/>\FBPm!DXa8h#L8y4HQ@AN>?FHGe/Y>q*R:MGX
Kh5<m& <11DaF^SwK#\>6maYSG4em+TbR%LSJTttE!VV+*VBJ6i$P$8pXR!4dqD*McaAiTtHd*FqWm@dd*m@u4B
HYFQIV eiZ4>AqQRSMlnK5qFD\4apip+cmmNQT/W94wu\Ren?AWe>$cDCl!iD?JCJ:II<J^JZY<H/J>QAZ%%HCl
Glkd?@ Ii%515e=m*MDCY$<a/bGcNiB!wkbW@QS^I/n:$m&><1Zu!+1Y/Di@\mlJ+QFRWn*cKe$5itwN:8+P48w
lnbWK> j=u=JQjb9n%Sm5T!h#uJTFmML5en5WpdD:b5IRNSCac$D%d6t6dSnATLJZH>GcNjJA/b@QQkZL9ReFpK
5P*16b Y%8CXwZA\\%=PBL8hP@5l>p5i*%1wT!HT*mu!l$LTZQ\=*X<:4j\Ci#QV>Gd!j$FANQyEIY6!q6pYb>^
HM$1NN e?k?adlt*V\W#Y?H@aQVhHA+I15+*\+Nl9@Iny?=QmL&Pm<?K%qR/eH8IJpt$Y=Q!!wLIj<!JNw>dnt?
V:+G?u CbEWP9?D^:SZVyDyW^Z6^=5qn=H!5$=/tC@kVYb?/J/&HHMF$d1pNc>nY5t5MJj>a?yD\w4cMC\!?!Hp
hi/P%n e6XdZGVZ/=du%%QCVj?<ES%*%!mDkPHPReR?*RTb:pLjk:mul&6DiuCyZS!JT8@td%yw!ndlTjH4B^G1
mK/@/* /K^P^C5a%4*1+:%eElW?l*tt:Yu1$R&At<YStMGHDYa\MM>>PDh&K@8d$L6b=R9595N?*=&l>&E>pP*#
MhGaFl :G!<=4#Al*jhXZ4MI*TW1KP&$^l&Md8Hl@DAuFHH86$Lj*9#I@:$K#J4pLFA1ShLTEKl=D5C6$jMMCQ/
QBV#W? <=p1C1apX=*tXuphe4YVBYu\@P<=%hkWuEdkWlk=8:@mi#a$6LcBFh*Y>E/G/Nj\@pi=V^d*YaK<A8h@
D/ptBH ZlpGC$1Ja:6SI^du!h\wcj:kqwXj#h1wAu@bGj@K@ddh\&nCZlBh%ZM6j!6\p6&eJ#FtCWMSQ1\#!<hD
NVR8%Z wA\DR$j!Y1^46wCjE:&%MicC6ARWnu@M:==kH\ZZHCba+YN5q$9wb5RJTak=lSuW<J9V&KD<ZDWd<dCV
BPelI* $j5&<jN&W^#/VHN#Z>#iLHG#%nXMYVMiHYMP<Mp4mQ>+GPLbi:pqPpidEBE+/n!&$laLFAh@EZQk*Q8J
=K1YdD Du+WAI%Q#lVVL!X/EBbmHAF#^Za++m%l@u*4E4wb@VcTZ8bIB1uIk/CjB6eE$m1nl:V/JtGiKc#Ce?Fu
$bnl<l #6GI@&/YBi\cb9CybBj8bq!u5\u/8lw=QNbB==Hjj8CJ8IVmnl9tl#j<>$BeqtVK?Tnyja9DDNd%ETdp
$q1k<5 >Nhn>^?Ti/TtVPHkhu68I1TEQ+kK#SJY\*WHHDbGFVt6qFJqa&JPKcY#<a9ZVnT#IHR8ccNnGLeMTVZ=
l8%eh$ G=>Z5KRH5Z:Y91X>LS^jcad?h5S!b1#A46\E%4THLLlDGE+>#1+Q4%P/dABQ<P&ABEI!F/&%:NjI%<8=
mtY6%h MHQ<T#</mhlZ^SH^Jn!e1n?QKMdimBNaam:BMN&ttti1C&@l\lAK#\YIASuSD1:ZpFp\4CQ/Z8eh9/QI
nStaia 6NXV?JZeD?54b^=YHbu6aAR?&YaylR+&LcWP6K:MH9*&<pWP!ut?K<c8eWVjJLZjYA%#tCy>i^j!u8tI
SAFwI9 ?pW/:#4iTF$5#8miPQVnjb*5<un:pGD&YG4<HA&YWhbVV5XYK6iJ%GaHpkX5?4%&^ak6#11q=RaNh+Yb
ADNQBh iAL=@A?l^RmalLwmE*emCi<iqc?$W^EaQ886^lNyiP#hFj<EhjFtISMQlaVYYbRC5bPa1X<c6%#1y<Ry
*Wa1T1 q::q\@lE^Z^V\Dm8RGWd!@b=BkS4+aDdVYL?8a%uHuqAkWGLRWnN/V5S4!n/8Dl$j=&Y^cj$JY>w1Sy$
4lcw$< +X$5#weE+/t%nqi#P\Jp:J^jq%T+aK*>8jlNSu9*TdP:VF1^JIT?EKS=Rtda?!J99b44\ijZBH^4>Jm@
BMicW: T8CTMA&M<S8ehAatDe%^h4:Lk\%mtX8%\XE?C&?&?MBw%4dkn4jGF&lSuIMFE?JLV8$9\*?D4\6BmAWm
1cFDmE >j<\AdNp^mSn$ZIt+/C6hQyC6G&?/Zt%&T</lSkL/<8y$dhK9$>9N!N*=&MMpT$ZhI4F$<JE+Vc#45?/
&+$h5\ >6D$nJh6QF=*Dj5$LFI\Sq!j84E$ja#qQLaVl<c=K#M8wj^>YkDG9Yd6w!VltRQj*d#X\^KF8w5WR9Ic
dNINF% Ddd^QE4C1CydG4Na*E94#+RLMjVDlw58WWm&anm^S?#M?Wk=pYlJRYSw^&?tYMQlIjqnZ?e?*aj9#AQK
=HjJ4: F#XD&jkYkbnKjHZnB/+!Z<Xkb^$Fjb^HtMlq!^%LT<F+^5I:X+W?i/G^lMBQB=%<qW^&q8^:mucqFjw8
-ATdI6 000f8072fea001202b4 Page 469 of binaries2.zip
JjT$@$ 6QhJjNuMh+@!ai<yR>w&paZJ@Z5A&KXYBP!MVd^DynlidXl=6wHQnZ88FtF@l:ZckA&=Dh6Mi8DQdMBS
\bnpJb +$S#/C<9thk&1aGu61&>L=n#EDuKl<<@QXAl/%w\9Dd$$*PZ*q4pl$u8uuaVN\t@\NjGJciS@9KJG#Xy
JZ\a=A F?L&IkmHkLHJR5KeCKwuFIL*hCukKyp:ulIaYleWtYkdM%:A5i/AIuPVjLYnwI\hRHCcLYQwMK#lwMp6
Yd4iBS XkyVb^=n#4p?&F=&ahbq=YDT95p+!iI^pElGYMEbV9AWIHl+^WdhA&@lC9/?F9/=8h<e/htIX%/kbkj8
qldP8D D+Y5qMT9B6&PLF9uH\W!pLdC8/hCW+G@9?B#tY>AVBi/iK@?qP/@?G!&Qa!K/K^LbLAw=4dP1>iTS6ep
5hwYd+ nbM\JIVD*p&tpqw6E>D+Y=j1PbHuT$GR*IMH%T>64><p!+SZC^=6ZGXlc6e?WGLBa=t=w:Z5A*NW?^AZ
BJZZCL &u@+#DDyb\*yn%FbTcHE^Yq/4D>D!JXD\FF\RLBG\Cl+P6DE=it\lB5^8I&am8p+WKm+dV#b*Na@:#FR
n:N$C> Nb6w&Gl$nQ!T@Q%Rw6VE:j1#F+dFYAiDFMakLKR45QaNu5iiyY+nnMZ4AJ\?+dAl&PYhVVDcjH<V5>\/
9t$KPn SQK\Y$D#=K4l!5G#pL<I4$+ic^?A!InFi11@i?Ra\1*HnyRNX5Pn>MhBaA\/+VE+NQ?GV44P5WFdN6Pm
5XM*E& etnQ6DZ/ce^nktJ?hRtJL8>1LKlT@wFX:*&X*XH4E=qM8l19YFS#l6/?VII/nBHCLmG%ZVjB?R@JdXdA
MaIK56 nV/1w<$14kchZaNWkk*V:8@ik8a@SwZI4DpyyP4l!aaCBcV5RhEMJ4Cdq@65\Y+mi=HpwXBW#1kHCa8$
ld$W9I =Ik+$T^48kjc*CW?@ab=>&Et1i^w?=YT&=QIw1p\FBCQp/!8EqbK<D8%j*K!VinHY$dF+@ERhZ#uawYV
!4$GZ& W9Au/k1\hu+$nX>H5>!^aT*Ab4V@bP6e69RtWXXtFe8Q:ejETN6mKuRGy1hPjGL=6QNtLN+ZRA%FINBh
@DBqFP wRQ?TcKFMm4wl@GQQ$qj^yE%JPtNYK%I8yIcb@D/mtb?k+hcT1+WpdE4/Jb@MCwXbVl?:V$wd=e/SAlH
P15pH% TlDZl=D8\?aL5j\>*=WuZF9Kt$eIThcw@<A>cP\n$Z8ta>D$84VTjecT9ubG>aYEhGS<c@Sd>dh1d>KV
IP8ckk c8ER^Hau/dNL<MYwQWFw!cyI:n+%4AuXLHBNFnhhDa^q>u/y4?!uaTnNA/n/i5@I:*m6\ZRw/hHZ*#hu
e@qPDl ap#&qBDnwAiR8BV/CVQLWNWICLFj\WX$\pJ9WjDm/i45ep*\Dyh<IySSR+ckp1^a>@dVBpYD8eFJlwcP
^&nw<> YjkQ%WeblI=GWL4:$buI+a9tV#EhPDN!CwaS!@nHDBZN66wy#<P/*An9/QdV#PmYL$&a9\V4S^M>m6Tn
?w%dQP Z$N/F^?1C#41q6PPLJtT^=je+^wGWh>P!ICn*pR=%mJVy!D6AXw8IZh4tFpklecnMK59R59VElQmjmiu
p=BXPV e%RZBVc&XcIa$@d$1<!ElSDbGTtd>ARYMLB+/4HAcYu9Ty1/>?FWlNnKQ=*5SL@eleGZaHB!wTNAN5Aq
JIH+iP lH4uG/*Fa1n5=&ZC5LQ%EWaXQF#SHYIncM8#m6&cCYPl*j@TC1#*>^tCyd@QVMM4R1bi<XKDQ9K$ljVp
Db5VIQ 4!%Rl@$pI\SFbQkJCWPyRqjH<dJl\9HJPB5<ZPA?@>VVM>:51!XCh^Z8jjK\c&jS=/*bBWkyBk#e9q11
%n*ib: RKKlel6*wwn#\&V96bkcqX@1<4ll9$<kVJ8ylt%m6ZC@jYH:cw:tGtdn9tGRiR>YLZPbI<BBb?<\I>Hd
8+$N/K YAHQ/bm9mw#MY?9*QW=6?pjyP6LuT!b^<uQjR!qk:ph=8^db6?!bIpRl4!?CdIIM?9eA6&=ibE%c:WE?
1qS5MB djap<A!NdDm6a9%jAWtlb?1?GiZZ1AW!cEW<LCmE!Btu4*En<bca>b#DAMwh%k<B9c@W9qMm:D6?wm+C
j#:>TT 4am!k\S1*NmN@SlE9=a^<T$epp\yw:n:\dTuNkSeYG4L6#5hj@6dDpN4$$u!d$q@6&89^$P^JBc+BX+N
kh>dpl PY*$^CS+I4deImAZtSEmXapwqhN+1S#>XD\h6GhTI>qNI@p/tQT:\>WG++:6<pRJd>Xj15KKCR@jC@md
Q\YKnG &Cm!\h&4Vhm<ynDB#VH?6DSly+^85MpG\V:Z=FV+6=uJn#kF=/lK\1pL\hER6Nh%94FANq=/5C=%yR8N
P9h!Z+ Lu9EQ>BmSe!pH!/y>KJMC<ZNBh?DGD:wR^1<^^8$lLMYu&9pb<neB6Gq$aJ1PTKFn1bI5SSu\CJbHtH<
GHeTRk 6b4\FMP6D4+F#iBpmV^=B=M$JCmZ#umKaGKPGV\Y\>1X4?9dmNuDYTDE=iQPLD1FJpy@yq<aCXu/Yb>E
Di!M@V dZ<8I@9<lwRd%ZwmR?4Hd#DSH<ElCwiwEkW>%lQqLbJQG:e*ak6GRBA\tTWaXHnCm%ehBX@Z:Va!MmRK
aYK/1% \=FnCl&@V1Z<^CMYBW>eN@WX!pT*M#a9pWuQ/E*WMDNmQibJ9IH$*baP1^K=B&L&88Z1#GA5yu>mbJy*
PQIA#F S1Ii+&!n?5ymDMj+&SGX51X9QkatEG##>q^aN@#6lN&Tm$&/eG^bjBENPaK!1A/H=itYQqM#Cc=kPEj\
HEVQZ1 $kA%Wc$%mkcB/<hulkF4M%&MdlwA%>XJP5#8ej5ByePw$/:YiIV=BT/HNaMVTwa%&JuihbARMwBBFI/S
%$>@q> el:+Vc\F5TE=D6#eMp<dbi4>i&lDMpawlSdyK4p5YMPk$>!l?$<d>5JB#9E^tR\hC&L18b%!ITb^TV^k
Z<!>b9 Kd<nSh5G\1wX!8&6G8*!G?p%K!/6iE==ST5LHH:lVX4dleGIh4HFSH%djZ+6Jn=NjVCJN@W#*pkd9p:*
T4!TQD >b4%VdTA<#p/tNwCL@Wn:1bidTd<i=P$R9T/\YC%8EN<SSA?tGdh^k@8*iI#JVJb8nP\**w%Bm\wPXR\
b<9JCQ I:L$<ul$PayXu\kPAkET+6q@ZqM4>&S>%tlKFm#:a44Adkn%a:L9<NCR&H@J6yq&5G#BHpE^@RAZ&=@X
+yX^+/ H4%M=^4up9*ni^WjZBh^bY4GEH*C4Ft8SZnJQ\6LWb!ZkSBFWy&?>PXVFBpb:PL+HaFBJXt^>Ncj*b<F
LuaWmJ nKJTieHQ^e#\D+LY+iV?ic91laGEN*E\I$K:u#YmtP*A&Gu5!#Zl8VMqJ4HlnJRTB#wVj%^>^//J?\$>
:@le>> iQXhlhY*k/amT\#8yRYMtE&ZcH1ecS$1J+tb+i95lSZbA*dD*yMQ/i<W*^mdSmL&+e:Ee%V9^Kydq5Q9
1KXTSB M*VLE/Y<kk/1LqCIpWCl*Ql/AwWp9@Jy5/My%w?bqeLmEVy!deKc@HkqN+4+!uwnSJF\H5%mKW&T^A6V
YG=>@/ tTGC>!>C6JdR?1@SP8J:ZYqV>\XFppNKFBI&^=JDTMAt!jaj+4NctBi:Lh@APjRpbtlRybWeSqXea@>E
cLdBZ& MEXnZ>HXVl^?lS+u5D@#hR9I?CVC1etPhWtQKCyM@JXi9nDVHDL8eZJSTyI&AP8umKT:ihM$yFKRyYGb
q^6^:w wSuB+CM&pq&JAnTakMeE<XnB>5<#1iE@+4%+$HZS1A8<dwkYLiRi?eA#+VtqIX6%&ITeR=q?Rh*lyaPw
YIY\$D i6V1>A@uW?TjC$=lQ6&9ujnl>WTt:IVFHZ&FLFBG>@VyB\4tB\*cieQm!k>ZKZkmAikp1XkX6QdCm88M
A^VWH% @ut!=$N<ElKK*XEuVRJF&<T@JJiRFLCpT8T^WMW#e>he+&EK#bPJD$j5<lG:\Hn8PRlG1b&u<t8nR?6I
&M*E!p jn/Xj=4?=twFNYV5puXLcye^B$HQaXDR$cy/1@!w&TySMT<qN&qFHh8yL6R$ly$iMEhGQXEYVapttANR
aLpj&S DA&#I=9eSF@=wuE$d\I*MSta9Lil5dJ?RX&I#@tF<=BQP8QLG*dAt@a\:9\i>R1ZaE64TVkLl<@EB9n*
Sq\>MP #b=\^iaB?D<4!#duMM@j>MH$lhbbKD6:qKjNJj+wXZHdM8yV@ayKZ$GPW^/Xui!HFBbA$^cq4i#!eE/S
6/VEdV JB4T4iXhE4IFeu^=l\?ZAWn^tK:^@$IwAcL!p\:<YGJA5W!bVm49mb%#F9t$pteL:V1m@I^py<Va*y*F
F+b/NA GnkR>ARnuVCH\Jm9qG:S=jXbJNn*NKCC@bH#Vm4m?uk4#iSB#iK/CIK*8G>4jZ4:+ZY9It/<Z!MMI$+?
!V&&%9 k=yTGn*mL1TN>MaPR6!t?#Vwc&pCV!tcMdyL<Inm$T?4X=EjAVk\icH8d#\@a&qh:c8YnVFSl!1R/adQ
+wDcb/ h5%+QASX#+8J8?&QD4Anb:R$tqJ+kc$RPF\F8*PFR<kweR4E>X\Vb^J$ZKnCXiE%6D<:FndiY^#Sj91^
5ae@DZ *I$=V>4AJ4IG4HIm%<$/G?hV%$5btCh=?qL<8Y*G98Zd@kIBF%8+<yCEltu4GdtcM@JF#J^^9jFd/*Eb
HFH%IR GPeI=L+SD4%:t9XZ\$FC<bAAp<!aeMqZ?XSu/HVcV&>AZWdVFTR1%p!hb#qH?t>Iba8%<\!9m+/TFn8e
tcu5Z1 wa>5WMP\!=XlkB=@G*!Q\>Q8V+$4iF?e4>YWVAel#QM:FApe*Ak&t6^@%1PLZFa5mFyaH84W5$T*GM&N
%IBTZe K%lC&1A^/ZQ&b&SjQ@*ip6$qn$K%bTDdk9utZwcN?M=y@Zy=!jF>Q:i@RZ+hREh#4QBkTE>mtA1S4$ZX
NEdjp1 qn/+$=&!bH*H/knJqZD91wdITp+P+aX8wDI*c<i1K%>JFceYNE<8Ab1>LFIMbc=9=9a4F/bLq+&C/KX5
kj\M:D 4c+8%=hM?TSI<A#DeS%Q5Xnp&jF&#%WbL=EHW<DS?y9ktC#K&mGE#lB?@QNYEH=Q!KNDC#Ajqc@AdhYy
/VmCbW S*cmqT64&\*m%8=ueyw&>Ei==!bMMI1MjCw5em&y:m5SH+*udC\*X5V+JST:IS@8!Fn1*ymu<1Qw+9%K
cW?lNM D?!8CA/dT<9XVFm@KE<1PbaWVilt*mbRmlqqJn&w&DG!4*jeJH@9>IZKIEG!:e9NyGV+upFb*RpPT8%H
?J>Lyl C\SQ*95*L4R^:T$uy#=C5?ZGKLhJM#p$!Xk:DPa:Y>dE#nh5eQHYwR8tn^bZ8^:&eC1Wl#\:%dEIqCLq
At^W=% iTIeH1FjQ9lciu8/CRpYNV#nh:@1uY\PVdFbp*j*u=A9#i&eV5QwVSia\b1en!te:86uIk+X4CnWq<YH
qldAuL %1IG#c8wd:$I81L*$>TE94V*%pqmQ!mPKb!N<^1@VlN%KJL>cwq^&F8<u:dm+%4jtMq:MS5t^yZhnmZj
%eiZ^L h6!*1B1AI\8G6:cR!hR+KI$hVaPNSj$meh=@@BXa9MK!Hp!L=bD&jcEW&Tk\Sjq+NP6XepH!#::CSHK/
QA%Dp! d$NH\ZLPNnN:6ITXWJt??FbmuZwG^9nZd?5pwP8?R#=49J9NTATmh=$9S<kP*Dh&uMF4ycb94<1wjmRE
by@Ynq uMF:jMC4X1!wY$TNQy=%A9+QY$YT5Q*H#&5<*!hwpymeC8m=4K^qabti^m>W!$p@n\Lhd@dYuXCG5T*D
RSD4RZ Cd^9y9$NX5TZ>Ad4ut&+mNt+Vh:k8GlycSJ?8Cw&BZiwSqIlbL++?5Ep9TVSVpe+d9RM8FBC+IR!86S5
KL8>41 ?*&1X&Iya@9eADqcI%y^Y9I!966!5h:6YXZ&$%F5nm*uPQ=upkWb*XT*1JAb#kWuKpWlR9B++5&tT4q1
&@>E\L i*\w6YtJbSBBkq@TZSqlepG<lE*M&M9\YjB5Fh8e\/?%>=6LwjJlHZCK&TlF&V5KZKLk$!cMI^%6hHNI
?Ap?#N C+wpRJD:F#Em?YA8ql>9S=hw#>yN5i?wMR^maj=#<LM:P:*kFiTlK*PW*RTPq1EVQI^=8DCVIdG+DYD%
-AR?BW 00063b6b613001202b4 Page 470 of binaries2.zip
IaWImp VE4y6JmlN@FQl9i$EjE$$%ADC<tHW&P6=G4T*6RanZ#:qV>?$@icZ%u/^#<#i16Y#@CwIi*9<eYYqM!1
Q*VKmi Q?$JHA8I5:$k8!?@ep/^e4a$=CX&V$pLmu#iJ:NX4?n^9DMc4F\+MmJh$=&qHPK?\tYb?PBTVFd:Si5i
Ln5YVY =jZV$$PI5^uQ1EHT6mldAiI#$!?FZI5hQh?jhAZMXZ/B4mlW1bhF8*1y=+q#9:>Cq4E=Cm#CIq$DFhc#
@nt^hb ycbQ:PWFP^%F5E6a9S8%=ATMP9I5w*Z+8CSM9q>eW^jiyW\>@mE+pcGpDB&:/QNjbHyt64P\/J!M!1B=
SGSyDi LiaypiNPbY@%e/VN14RS+CpYQByaKw!qac8<Rp1pynGGR@WYI1AD\>XZc4dF4?m/tGat9hNcGcbIwWJS
bKN>!q %c\P\eB8tDbyT$ak5ahBDiJiQy!!mK&NNQl?tc!bk*P?djRw/c4P@cGt%CC4\pB5EDYy?GXmHJ>S&nW#
A\JE4Z yL=YVn\wQ1*nKp<^*bab$h9Eyd5Zy\iZw8CYw1&c<$t^&n!?twmImc>Xli#wYLiKDQJY6KlCP+F>>Wjh
MPMjKX 4:^>4Gp9N=:W#^F#E%11+#PQ@5^eNWwwP4G>@jTpDY@bj9c!=N<+MY!b=Vbp9t^EtE#A&Lt*6hy>#ud%
d*e!eE +uI#8?PLuPj6D6#Hcc8u:KIJXKcAYi/JmF@nb9iR5?=AbYAdRt\J8mSVXpa1VFJ^X5eN/d#=W*:IIH*M
+M<ajI S5kPZTNCEtPt8j=Ce1G6uV%HN6<i@dtJ^>NIkeBmRAETtyZlC#+X$>Y4yX8nn8a^<A<$eD>IjDDj$JdX
V@kc#< =y8*GCEZ=t^$Sd/NhSVi%&88CK46WjGVQwnWWKjN/y<5$:DyF^YGG8<+R*8K&>?QVG<$#kRi@6Ci+HB*
pHLE=M Cce:\nmn^&Hdl1=jd?n$YQE^GiwE+<NEEHPjH#N\@H/6+IY4>CMtT*9/QQAS:&nJCG+l85nXe&?*NF8S
IP:aXN M<Dl8jl&8P6^R*QPlQkL$&#\Xn!$FNc1?S!XcIXhwSmmERuLEaMM4EQJdQlFpG/QMDBtJiPaE*tN9@Q=
hT#>P* E+tI@\HWS^t%EJ/m9&\SX$qic>6d/$\?8&P\!/*mkuGe++8\nBlN!+KTC%\PFN:u$TCq:h<1!VF$5BiE
Iw\V+K 5W&8Mm*upC#ybJJBi%9WDj=iZj5l4k?nA:L/%Q6C=Z@eYeY>tcDhCE></FkK$PNM?Ch>yuN#HG1h=cn6
Aj#NTK GnaL9=<k9@Sp49DXdN8&##JSm^HZClXA#Mj6bNDVBQ!bP$:PY@NiGDbQJ=V+RQZcLBdZ?DR!Y>Z$/?*b
45GH:L <E8!AZl>lS6F?#aj*>+REbwt8pRY9%IB6L6hb1dctS5H#1%h!BuaD&=Y\mEq+I8VB+TTtdHB8X8<*E#b
e+j=yY iIV:Sh%WbwRu&y4@A:J<jRS>q61%u!P*KyRG1#LlX::QeXc<ljGidl@pT4:d#ZEe4pjj/G$tul*SR^lD
Z4m6>\ !h5MDIJ9QN1!yR6>BXi*SHWSLZWc1tZt>R*cE%anZ5LiRw8qY%yb<@yP@*^5NhP%W&LG4DKdZ4:^4LHK
\P>4Lc Ww1\ml>n\8Yl+eTh$bbSVhu&:A=#mFGqMb#e8utbw8WKC*</QyBE+S9e4hK^#C6mlau/VT:c88DR+q@E
&+Ya>a l+9&5MRTh%iu&&%H1h*MT^@ZmlG8+!GVt&A5w=SZQPBd1/QCXtMbZ&jyQ&YI+@/uRQnynHnmljc#p:ce
jn/IcK 5YRFS$pNknMV/qEDKc\MYIQR+Dp:e9=lGPtI/TR>\l?y+$l#mwnh#<tSRGm9n=Cb=uKt5<uYVY4<W4B%
XqK4WP F=a@mHSQhY*ddWGdME\S9D:TCnjI?n>qZ\iHLWI8E<!jLJKFAw1ap\Mm9Gcea@\Kb#J5$BwM9*/R&EE8
8Tme!= WNdST4nVFni+Q!4C9e>^T!%YaqSI8@SCXP%\9R^l@<mA=&d6@jGdE5<H1+L?HCJZZY:5>wRpLXq+lYXR
q<=ltj plImMcp\qbCy\%VQdteW&jZ:W>i4$VuN\+PWFwH#JH+Plitapy^y&tjDSETdP&Hh1Be?8F^6X?MEium1
uhSIIe n5XwERb>hMN^ewCnbjAwSYGmha?>45t!S?GDd#C@lXQCKXawYK8=hlN&qMaA:nIMLDuT6Y&ECZw=8:K^
hDKT*# BC8qNTG=cWMR#klZ9=N=Q45cp*?8yVHuMXW@MRj:RGnVn@JK/emwcIX+N\@?tlpDyTuTdFJeC^E#mtZQ
9&SFXW pTGti/GVPJ!X1TmY*XAZlC@%F&dVYN#MR$R^Cy:dA>m^JXNIJYI@d+M<w/H=WCpSlX5C=SyRPhBt<=q5
?nHWwZ #>=@GtjK:P>Jn9wuV8&/bH9RG!GYI:Ihp*#nLjqSE=Yn/w^1QlA#4FWju5PWVnyVW1QHjR4HYq1$mYyh
F>!\J\ cIhYRiI^n>t\q9Xwk<T>ZR1QKwW9%cB<bY?J#GZ&FB5J/i4MRbqy\k$X/MLltySJ5&N:?CXcbhcm?Fb!
#NSF=X CHaEedG!$\uF4D%lVaY\5Bt*6P6#ui:BR9w&15b*:wmjpyFm1HdVGiKacG51l9JyWHIhcTIBqjR=eiR/
q<VhT+ 1T@=VZYRwp=CX9nkH@*c^NM>PR+PTE&nFCuRZ&PMwB>bGu4y?duD:IJaTLw^:J+:tIblbMa*h/ADeB81
FLPX:a l%KBa\PyZ*=iM+Clq9FkJ$#mQ<tFQnTZi*bd=a^w>:AJZe:^QSkt1etlqYB<PQB9qMZwTLQC@+RG1@/I
Ii$/:b &%8BaBaKYR$5R4j1QScqjICH$Btb!qbAbMyB#me<yX:$b^QZMW>AIRu*^V>IiejSkN/%Sh?In1qXV:#D
leDeB6 uEMYt5$JY$t/utnaWPawH$%Q+1jLFX\bC5DaG6>#jqG=TQFj#$awaVY=Ypi!&E!?jTGA9#DMKdddjtZ<
jWnVQR E1a>Jb18*G9#l9CJBFqb<$1XVB+*n54GGmEMycW^>utiNNaVAba4>V*t^MDaXdwS*Nhbmt8YFY@T>nN8
p\6b&< >lyn8XkyccDM=5eIdb::M@KLLbjTBRYpN9VZ&\wNuTmN@JV+a>lwYC<chq5%=e=q&cRtl9X8m$S!>JG&
Qa6QVp jZb1YXFTIq<MXy<$/*bEGDIc5dp?SZm^j88!bd@Ty5\TY^JuP1XD1El61y\4>@*Z\d8X>p*e4#PSu%8\
G9kYR5 El8&nFN@ilPhLTZPYt9LQF^XW?E\JiRREc>PplcpX1a4YJJNGS1iYnkny%pyd!\*@$w$/Q6NyGRaR\N+
Apw*SQ +jKSyDM+/WyBI>my/>Zm4yRXZM!>+<\:pWt<@wcRtYT<NdnwSllSXIV\9yn^cNe:>6XyR>J5bTXiJREC
cAJ=H5 p:a=P#!DtD8:*jlN@^nHGbqIymNAmeCi^Hb\@u8$thb:!=6RSFqP+Je$Bd#i5YntGdjp6XyC5WwE$9&X
5=LWBQ Pa#=iS#KMM>KI*a$=IQt?d*91P4jKQ!lK=nNZH+#VH^!H+NcjhHki>L=dh*Rm1TX%yLGCq=XVuYcT<lQ
T!N:?4 QTDCqW9G!H#XwyepM86bAe&&/TV5N5M@WG:NnF%SXlCPZa!Scy:<wDBtS&=L<cN=8CS/JkHXauy<Fy/5
YYQjRP I\*\A%i^y:YXit&AiX6YMSn:eGydZpLyKC4pILJ?d@H6E^BN=qw*FP%neJGJNcJlu\8CwRA&4S?Lmy59
SB+>=y kDtXHXd/adP+9QbkH=jq%V9=44Rqe4KYZ9lTthXZV4MIL<<kDu@*BZyud=$V6%QqQHM@&c:kJ#ZY%HJ:
HH*^!: EXLkbI\nqlKcaVwq4$!*$@LA#nYBC58?%wYVh@KFH6Ia^Xq%H:MNIdMC$jt1RIw5yNMh86Xd<1kE5JWL
/5q1tK iDbk8BLW%mVSNKlBcaDFcTqmGHdLW^FMEp#qal$J=8IMa@S=XaI=B?D1p6&aZ6MRSYHtl*RE&XZNYB4u
^Qp&p@ FLG:5XNtaSmY!9Hu*Ma=lW+m@mG+mdaVE!:@n*9ujC\/?\VmVnZ#mawe+CG/uIhyS9McDa*<4bS^?BDn
iXmV%J $?ia>Fqw@1KQa$WS<B>TCQ/%yVJ9cDBjJ9HC9F>ce&XebW%aXVwcpyK:nmpJCeB%P%P?S\bDjl>4+pPk
dEli6$ WZk?%J:=jKER/M#>K:\8Bbt4Ze@PEpa!c^p/y=BuCptub#BNkmtMn+ma@9CHmaV4pwcC:b<?kV<#9<GV
Jn^Tt# ?DF?p/uVN?n=NmHkD&T\TJM#K1i#wpkKB#iwnJMLVNnPG$\66&lpHQPBi\lK:jFEIh&j^qSV/%qwjmQm
KHdTN> 5#Mlctn+Fm<l14@piBdYNc:kGCapRn\QN6Qq$<uy!ciA*5E/VWE^?VIZ!$jK<T6L/mX\iG<n\y@K4XN:
pPL46K i9K!GI/Hi!nInK=q%@*!c?X\?5=IG6$^F1@Wu$<4b4KSub/BWNTZSedk&ubD#Vw4DeuNlGy!$AeC:nm@
ZZZKda u:Mpn:VZ8+?6C<1JATujd=/*Y@DYepWbMyBpQN9NNjCAnT1addLaPRct&Vw&TBp^uCpDShCTN>NYqKw6
FeKmjL %?bjX6R%>NQLj=h6\Y:k+@m&mhM5=tNMR$?LtiGJ1!6F/4An>\ia8$JTch@1*?I!FQuN=SMWj:e\eY\6
p?W&&S C5jREeq4%%ZX+Q&\R&@=^t\dcP6qEC/WnM6$H4RGy^SE4a#L*V8DH/kp4qLK<1tBICd@!jj<\%!BPbFG
hKE?JL TVpThWk?tH$4MRDB4wCG4=<1e*EwMbJwb%1u!c^MX8F<DP/X:YF<Pa\j%YYCeAtj@nimYXlbe<LLi<uc
uZ*T$A dVS^QG:1=j/:MB5%PZR+/=eq:Sy^4X<@LLJj!N5NG5i#9*>&8/&^uVAV5nmjlK@VJaymHTS&X=6\Hp=P
C+t/5N q&^XKhQemck@cDtPVMVn4$+Bjtb?&B6y#*lF#=#EeP4%\/nJ8ElpJZkRA@9!\/@9W^\=*NQ%lEnhWkhy
aM%%aJ ZbRS#eD*qFqh!</R>E$1j$cy@NkwQGY4P9%XG+WWJ*Hh/u8i5=4iu!&W<uLJKIY+IjZi9KX8tjk%+<FF
/Yb9eX KZJ/B&bMXqBab1J%MMqQdM\WXlk\1%qw8^p>SJBZn#>\Kj%M%T&utnZCDFWGlqVQby8CJI=w%J#\LeF1
*aX1yX #%#GQ/DDLhWud*jD/haM<ZH$wLKctbwQ??wa#hQAKQi\XB1c6X#RF=@tEX9tFadVmh!h=byGd1VlJBJC
>JplyJ ^FN6dH<Bm!9>LWmQFu:=#m&c#A#=i>paP69$YItR^B=$?GiT?5bIjN*jt4i:6WN\\e+\hq/B&5^En@BX
Eh:jy* cnk?m&b*$+u@H1T:4mbq=G>y@FpH#?!*i9q*4iWjuD6c5nu#DY5LJ4l\J%@DV@HEbu<wN4/aj&M8TdS=
>APmpN 1\*4@LHpJFD\MWmaETWjn$jBw6p5nIjcK//Pae+1nneSJDY#bnNGt^J#R%H/R!:dqMt+!SyI6XHVQyRe
*CQiMw 8>&Q$G+t1AGt\le4FL?9^M\bl^45m55uC?@q>a*PKTjjFt+enJ8AQymb:6&P?!mR/5lkTD+k9VkKI9Am
<wq@wp =iRwBdypTX9bN9h\$Cqn5WVN>FJ!DA5ZVmeBZ4j\1:yI\kZH4?MK=^ALQ8EG:blyw?*D+P/>bQS&uGSG
T8VcTN @RpN\R=6eX:ML&<6bG5ub!6K*tKmen+ylJk!cjhJJI*TE^Dhc=\?QjVyCI4MJb?w#mC!CA>!JmT=^wPE
4eA=Z^ yp\:+L&!KLnHEBq?$A8!iQjGXeJ@+nQ+ZSeKD\%yLQmhQ5JY#e&#F\w=nR<tnat%&V&jB5ATn&nMlkDq
&he<IB L&Gw&hD@1S?d$P>6cKPMqnHE\HN9EEdkFBI8@Gn1WX%leFHaGc*mEnNwQZ$ETjFuKS^4?uh*C@?e+e>b
kB^PtV iV&WIqRD8$Ym^Vt&Q%W=A>Nb>j5%ceaHy1c!CjGI?wB4?:$bG+QaPhTIc?tQYL^qw+lqtHnHI&aMJ1Jt
a:/VM$ :WZG$+1uB*55bS+@AGdK^nGqyp^AiLV/Z:@8W8J#pMY&&8uiqX9AX<wqlck^Tew@5*\d\b6#91d4?9^=
-AaBjG 000e64e8ab1001202b4 Page 471 of binaries2.zip
w*RdTp PElkLt%ekuw:\>R+htEER<L/:HNby5@FcI^SHn!=1qWNMYQF+M#Yk=?w4YQKE$=5FGSkQ$:nuYMLMmQB
%Hk&u5 lJA4an64Ee>>CAVY\AA+h<LCy@M=a$VH/RkS<t#ibAVF>8jSjV#Lk>!&Pm\FJbEdeWq:<%iFWCR!^?<<
dimRdE %!*4FqaK+hMiQq*t/Lk/JjPG\=NI<1T4=/yE@15JP4SP#P1Jc8iZ@EKZW:=cN%H#<c9aQAbjun?$&%JZ
Bp&R=Q #ndKG>*!DLEm9GCG<n6::KDyl*$Tm9mA5FAQ$!LHSAjLX5R/pJGRmcX*uc+#4>*p6bww6qw=k%9^k$j8
PcW&#+ %=Iu&W<cda^?q@NiKQbJpG@^hT+GW=NHGn>yHqTD>8=JwaAB16Z9!?Ze#l+N\Da*w9=XjnL#@a*l5ljq
A!njBD R#kB**uFT1mw$=\j6TJj8S\PtjlQ8!dBk\hhy@nLN8a!!Ljpi%=+8tGL@T+*VEIF1VajZ\*I*h64mAyj
$*yZG: F5pZtwkIE%<Lm4h51*$ybENFNn6\KL^EmlCJp#TIFmm@DI\@mE4!yJd!<@hj:njX<B*&cnA!%KR!h?b!
CbPNce FE1!9d@CGhJSlmRt$^EPhk*895Qw%#SlSELAGD=#IT@DC>+MBFynG:$VG+&I1DcL%aPVNS8hcbnX9N>&
XGG:9C 8Tml6#cG*bepcNn>kw#m+P8y$bie5Zn%nR:8MQ\81TI?:G8\h?AtQ:R<VdujJ^bFiF?lZ!4DdRV=T>^G
a49d=H D^pLFk4&KScJ5@AMhR+bKdkjpl?1d6FI&?pWuKwJM6M$a#DARnPeA%LeBmt4W=#?mY$=X\D\ju9&PLp!
S8Fj$k lq4&VM:AJR#\pL1+QPnPieK^8%AjB*96le4uLJC6beKiXZC9\*?5jS$E6n=&5*dCGF<GDuj8wP^y4PqW
nZC$L1 R@KjG>Yk*nC!>MY*yc#n8u>d*$FbhP!+?LW%IF=t?dpFakm@e:+LDKE>NV:JmIGbe@jmcVQ6m!=mePZG
yARq:i Xj9F8#8Y#PL8#mG^DDaQl/\mypG6Ib9i5d4!I!w\INe8%n\&ZhIMAbp8k1^kXYb\9Wdkp6nGl/e:PZQY
T%8Eau ^@il9XXqJ+PAaFL?%I$ad\inJ/1FMm5+M$V><9$XG+*n<b1bEEFY4B89K!IAV!!+iQZS+G6jnLZVq?\k
ku\/pI 6qS8Fw:!/Xk\XmaYXcmE8H*#$l%%qYF%Mwe#L^NZ?/<!yXJ8#wYAG?NqMuKChES#@+$+u\:4:Ahl8PWu
Nb@9u/ GYp6GB\5:eKaV?R\JLmGuh:uCI\p9$%+hkj<8VHpT5:F@K@LD%Et^iRnF?RC$hMH&$uMpLP4G+AjR8+I
1I%nSG SFBDPtJ>E4>+#QRt/%KHawpG%>4hb*CRN:K&DYM<@8n&^Ka#V<XVX/S<N@QtEny:#>q^:TnmK:m<B@48
<nTyqd P=/BD&ui$K*4dLS+R\!R&Z@9<LyLI9RG/t=c$dInE@Hk&G:=D%:md%#$/el?**4AIWt4:ciuA:#KWGEn
?cjeQY WD??ATA8tNmB*Y8CD9*d=qqii$NcL1\V*C6N$@SJCJQQH:^ThwV//ESEKP85DX\i#Xh9%T#am4$CHTdD
pe/*LY DhB^Zw@nQWqaHjhENR\:JkM&Y<FQ>ttCp$k>pm:MytQH4d@=95?FDG<iGDE9Z<<qF6BHDGG>eN*GKdTN
qXYyDq M#*K@jnE9HbYeB5+>R#^+jpLW^M!>uGENbl9XIqiZ?j+:QuI&cWKS18S++QVhcS&%S5X?$ZRP@YiVm!6
/B+1:L dI*Y%Fm5bCWVcdtKSC:4ENBeBQ=!NE?FYj>$#VAkq^>^y=juXw^cGE4@S^<F8>IF\R#@LLT?!Y*<DbKC
4I8dIC hQGXbJqtnc9=mktDmCmmXm@5bw94u4Ci5@tLj8mnV:#cBNJqB6#Yh@mD?m64+/S!<naSayV#^cHqNYLq
PtcQdm H=LqK@t6^wXVcDX%1D=Vc!pmyZdyIe/$Wm&:LVB<9ab$/9N:BK?&LK64EeN?E$mW\SBNY+6NY&RYjKkB
aJYb:m M$BE!N!hw>#HNC%G^BwP??X*+VITNiqJ%*m@%=en*$<LEXiDpkFa8$iL&?EdQF>tJh8+9V9cBtadB>SH
p#=dY/ >*!:+Z<j/N+QC:&wiHZLuSDL=KGYF:kRF$>&LE*@Ih4?<!c+@BXwDnp8%%tw^KWQBl:*w=MJKXEmTFF4
=Fp>L& Fj?p8%PTYuX>1?n%^<YMR\ZcA:H>iedc\\*K\5liJmL$qVC@Y8=!$d*P>$knBuNuwQN>i@Q>=CX8FAJn
>ee^jk 5@?q^%9:$@98X^tq=c:WQmGJbuhDVGG%:/tB4!%AwbwtVAGwWM\/p+>ZipdC8m?=+WG9AjwBdB>hdXJQ
:FTnQ1 c69SFGAhtNW$6qth\QYcFHVB=b458AilLZAu/$B?lbHMk?l4p6=\:1h>iWyNlnalG66l!Sw@Vk?>a$QY
ai8uhC kE*E\Q&?^#VL/:E411A8#p\+SjwB&T+V!b4Ceqw\w8yZ5\:+AhRPPeYG#!%ZntL98#RGtkTT@eKn8=#i
ATbYWE t^/FtF<H<FamhhX!yDT?m\TiIleHl\9Yal9Mw8^+MCVh5<aC5^lIh>>w>B9j&%SKJj?+qH:dYdV<Xmmh
@GX*qH VKNT+9A1^?B88jPRwbuNM%Tbu:Hp6?*AX5ldL?E$Ja6ZWtW4jTtBHc5Vn?:qn#Z9/NHc\l6L6DV\jpGM
>&<ZtB Wuw%ZSHIn/piTi\nwR5wn1TL98dKp9?Myu@ay!Y+w%%=#bWPcEt/tE4TEJBe<4JH!QPwFwlW**FwZ==&
aEbGp/ :FCIQhjn4G=bN:uNekkh9kywQlJGY*w6L8XcN!Hl%h:^aw$j*49mT?+D9MHuIwVi6?k4=:?%MjLK6RIb
Xh*CXw W<iKAEVyQh6I1cmKZGwuwT6QKl=?Td8P@Dy&uQm^R*5iJXjZ@MP=%%#JtVXBF+^ad@hh>Ci?I65EZ*@n
*Na$@u IZQm^@D!&uH/:VqG/wX5kE88L>RRqD<M?F\!\p<*Lpc+#95PL>C!J=p@6Gi=Q66<1>Z+Phi\KZHa16MF
KbQ5Cl t/H&\8^d*c:#8hEm54ECw!*GP=N8Sp*C4F+=ieCLZS>TAK@<!Xi9&y$lF/ncH%FS=IZR8XimSw5bm6YH
$a*P^! 5M$<Z</iMYFYQ@>/aCI!W1qb5YnNJ#QZp?H!S164D^H+8XK6ZFl#wdNb8#IT$:=edSai!hT6nR^#5>:l
9D6GFL y?%R#9T!h9lmW%q?w4NYy%:%!QG>:\/:^1iF$KJ1mPC:N>?P*Yy%<qB<AZWNyZI4\aY!ic6Bq4IF1$/G
+QMIVZ <RY4S4$>%dK%*bY:6tdFG/*GD!1E!e\=:%!=nmM=66uKDdkVT\YZ%NCVAc<H%\@&58MS!*iGEu&c^6GV
+=1Y&H ?T9pe6ZwRpi4G4b!jIWNlqP@uHVX5p&:e6Y!n$5eIbpLXc5Y#L8MZAuiV?Bi/ZBjBY#L9m?B>^&m@1l1
L4i5eR %Ce?y8\5Xiq\B6>MXGq$qT=eQRq:Z8A^@$Cq$h5<P#yI1Q:q@cNFq^mJVmyiE$DR49cN\b\%jd!&a>K<
<QRKli +Ad@pVjIh$Ht^\XDwJ&uB?56i$j<#muBbYuTNwKZiwaHea*nNn1!&TimQmb!i65bWS^w#cnAQb%dIe<X
e1PYkJ &*amJRm#Kh>=Rw=lTnGXXt/@Ptij><a=X5n!1AV=@t8QJpF64n!itVtt<@+/+5eQJ4ec:1BuuHAublMT
=cMa>X yM&uD1Y%*TP5#+8T1Au!ZRLE<eN\Ye+\Hk@^<S89LS4:Zlw6*QNT%TbPLhe>=+qC$J@cltq@jG&%QHdm
YWi&tS V:j&BAle4mTR^/h&9l!EHREk$JlkTZK=HAV=wTRiX/5<EnJtHT^!u/<S46D9plMB!Z4&ZkhHF>XRC6/?
ye/+=D NbklKI!DWy>!SMEQMGA@dPTmJTc94ihNC!tJ9XkFC>>&CkipN=*kjBnN64idN!<$/N//S8>Dm*>wVu:?
X6>PR6 FNu*&V$I$#%/eQiqQZ1R^6=!%=E4&CIw\c4j\LkeTiDV8Fi<PS+d?bQhnYLEnnnmc##F:Sq8XBn!&+Kq
J<PW\D KuIKK>W1yJL@T^m&p?LVnSMdSmDt^uaHnwpCFSwVqBYcJBL1n?8ElXkh/eIlIZq68tZ56D&TcuduL@Fy
wR5&1S eE494iG%A:6=15TdY+PVCwP:iR?:i^Mt$@b:%pEwu^Bwa^!=\yHKn4V>MHWPcd>>ipD*/QiWS%Wup:J#
V\IX*5 kKLyJIQ+%8=K?#I:?l+dEK*a&tYd?X9j@I*1GXHkBeYunE&tXedHXD1bR1&I?Ky#8G@HwWXK=1qDn<Fa
ET5:kn >*/G\%EFhmZ$iYnKZJA%1CBYW9DVSdkTT%iBpklTiKF+98&R:NhR+b@yXkXKJTw$tQBlu*K&@*akB9<P
:1^LGb YBjk\+*?DlG@YYGmRMG=\wiK>A1KmaPI=/*a<iI4RJ>a$Pnl+P>W1KQ&+>>S!i99k6pVh4Vqd9i^iXn$
TVYJ+1 D*%G^GeVmYaKN=S\TV?Np>A?&M9A\b$VtBVTDyB5dPkTL:<<qtVEVwDb#&p4MMYwBaT44NH4n1qB*56l
G:%6^Y MQ6A9C?k5y5uZ5btpT!!u44\bKbEWX8elucLWP@I:<:V=V+8*lBwc#+%Fti$i?*^Fmel6i?Tt&h\RCA8
Ec9=^h eP&>+Q!&pC#B?QT>Z>D=!8eK=j%nPtuj:i&Q:%:*+<iHM?nHRt=amb@!PVD:n&ih??%%$ehutDNi+CF%
969%n: J?hni9D#/<5d!6aqj!4^yZd<FmFh<W$jJQEV4e<?pZ@8:e=d<jQN!&h%j!wddn&8hj68ipTjFV\BkYV@
k4mI6a 9b>wd<@#GcZ\WLpeu+/tuqAXqTC&64E@+GF8w>>kmjp:d=@u?V%lkS8eS@N?d6%H6$$hJ?Hh@Md/p\Sd
%T8cA8 &TK=RPey>@y%+JFA4?h8AnYHj&/i<ySAd8=WY@kY*N84>KhYwICw#%u#:cd@:?4d=/tYT@:y&\j+i&V@
DqDypp #SLub>=Z%1pGu>j#P*=jRXaXnQ8tFtXyi8FytjPdXm6^@+QeL#ah!qN@?QpiS=AFL:6E6AIS8y+@hRGF
LHBHhe ZwFV*Y>H\S?i9KPuW#XbS<jNAyj?*B<\P%Amy\@^*Ziwu+:n8/jw8&<PBMa&nL+Aq/^B6ht<hBq9\t#l
ae6\F$ ZmC=/By9!dhm$T9d@GDlc\/h4*QyK9?4bpZkT/Zb*G4WlFp#1Hy:*=9Xd$FMbT@K41IITJ1@W*$/JV?/
IkZGJR dB6=j9\/i5l*B:bwVc4j6iwk+#kjB<cLhG>+h?I?TB\>ETij4t6Y:+=P?wm<eVi!6mZJ<5Zw>HGARNW8
Ze>hhd @wRYe@+q?\A?T8XdjnJpTch5TbN&/V*#=+1ueG&/CSQ$F=6/1Q+&P!S*8Y9$l?hqla=6BT1?w*ABMJ?8
iGVS8b @l5X+5PGWyZpdV9n=%#qZ+^M/9:e:*:X1<6:$L:9c<b*4<h=:Q1=um>9@Qj/8+>dp*L?tjej@9/Qn!&h
t4#HVM Y*%Q:Q/$SSFX$+<=89dX>*wFh4+u&H%Q?kk:Qw^9@:V?:cFZ*ZdC#:k\&+!lL!Z/L!DM?%YZ^XIG%K5V
pDl<I$ 69A#!59q$/lB6?dd&=>PH<c=l!j>X%L@+<ib:8h:IlVELNeQS6?*@X5@j@<H:CjRitjWAPbk:AJMdq@%
S<%c6B p4Xe9bTQc8*uq<eHXA@i*QwXL$S=d<&Dh+^FaAyHlmyK6&GdkMC1b:N95c\CpBh/@i&JBEAXDVbNwEAw
ya4TKD pAEW@jI?jahT+15c>+#:bX*I?LWC9*+^69W$t?F/IPcJ+Hy\FN#Gn*jZQ%Bh/ynatX4#FT/\?@dVLP1d
mWi8Z* E=%F^J5jN&p=N@WH:dNS:Hu6bjuiX>?nm^eVqC/yt?:8LiLHX^L:<<Vp&@i*X?=C+n4un/tpm<9A1W#>
\PCFY5 4Yj=DAJitPQ4j>/=P<!9L5h#^jLbZ%&8DI9>9X!P5<$X^C?!=ZP/::@/iQ$d=?NKY8dnqe*Q><@Wi=8Q
=pbKEq q+?Z9%$8WT+B^L>+n?>j@pY5WACctJ849V8iQ\:#<p6>Ne#=m\:\eqpWhFA9qpPp/mmC$@G^e#9>MTTd
-AP!EB 000d64bd2dd001202b4 Page 472 of binaries2.zip
S9Ni\E Iq\61@4$EX&5MNdDJ=@NSEY^b<j/AG!<Q4$:Z95RINA+uu</aqG?cuNbp&\+u5Qmn^@G?tw$LK6^#qZ:
FI&?^t wmN:HQnmM9L=BElPp16Mpq9iu\==CT$pkMAlc@k94a&B<6tD>@uH<&iEZ>QNn:iLFTDcVG@H5\M*iKGP
iw%&:D V:mWV@>+*54@^GK8^ATTR9cb+I&tbX&+b^ZK*SwR1l%eq/%j8GwTq5=cIHkXL>V+C#h4T#D?Q1Bc88?G
wqtb^C 9WN5DK@*=qu8bIP<iyb5i&dHT:C<ZK?TIMXN+&*Ew1TMemk+4P!ik?^p=W@SeIp@J9GTLA@B^$\t=LJ!
<EdHB% %ny\&4YePP5$y\qQ$@uB=M5:JpnMiH>=^?q$iDA\=y+!Sm?9lXm*DWSFIqe#M*e#>+kIN$?L<IlMn\#*
@\=%Aa VAe>1SES/S:t=i:tbeZ8GStqyiMbbbtq/ipiFc%tJWXt/YtipSFSEbEi/iZqcb:l:YXlFb*yqiMhHSW%
^=AAeR HY$h:S$hiiZl:i&6a^Z6FiY6Wc*q=i%qbY$bFiXq/ipSEX+b=iqy/cDFI6^BK=8y/1dia&nBukbPWDu>
5Gj:Z# /T/RT6J#DMppp@5N^=L8YCBlnw&>y&ypJpjmy1Pm^V%HqMt+X6W9^:Kky&mJZMIh1<R9I<XepySqed&L
5KYZPF 1nAeI^tEHd&eXtw?MW=AX:IyK9G=babQZNNQneqyujYHl5a&&:iGNcb!VJeY^JyRNywp+Z\YSKD1cw#8
jJ>/&y b:MRJRcCEia6bnQ>FlN8$@*/H%9WZQQHei@h#J&etwEWN!dj=BnaSMKipRuwM$ludC9NII*\Mnb4S!F9
eCXCL+ aVY#t8XM/u?I$VAPwN+8k8>w6w9K<ZLFlQIJDZE^:pQ$L6YTJW9XE=Tmd!5SYQB\tc+*Jme61uP=yY&d
@4qIcJ hXh1JqTdS@$c@$dFqGtpHDH9?D&C?AeMB^INPF/B@KHwi5&/cCZZBny?Ih6wI%jHIc9?uL>TLB8416?e
Bq5Yqk nQNl\@lTnAayG9tRhRqX6IZF+qi&+:RV$eY/Mj/K>W&nP@%VdBNY4TPV@V*tetM<C!hl#QQcnQRIy$mT
68STn& JF?Da4Xk9^Ip\NtehJbl&RlC4N!9jqR8nLnkT9*5TY9eKHC6:$mR*MIbHN<1/X=^1X4y1Z%>uKF%1T!=
cFl^B4 chG6I^5nIFhDeZR@CkJ?y@M85DA:RW#TblGaYTK#9l6#>YdGqk/KRJ/yKhwX\C%KCe/!TGBTR#1a@ZVa
<e#whE j\wtCHihQYeBGlTJWLDX9+eL$NkyQ/VTm/e4K$Va$ac$ne=u/WticeVN$TdZEAi#T@kYCl#b>k!NDw*K
M9DQIZ pGbaY#8yYD/>@e:LXSE:qWVQX=VIeqby+9BI@^=6n:wBY&FC8cnI#XDZGn@RXF8SVL#5nDeknbKT9mQH
R4/hHy RyC%S#>!1t#m1$i^8pQpX$eSw/b?CCYZd*qjt%bWp?L#d8Zy!bbT4<R4Twbn!5:5mKeku$VMFM&RIb5\
eNtdHL S=c6SjY>SZAXb&NQa<Jw6=TTwtWF#nuhN*d1h$F5PdNRpRw<#\>!:lh\y1BpGn5ct?8mbi4/?y+h6qyN
!d$:R< GjpeGb&#9AaiuWihA=YT#BLJB$6b=Rwu8F?j+B%aSbV4B&1?CY*W5?NE!k+\W><IJ?9nb@<REKBt8+pi
YQt:YG #b\a>a%Y8i:GT$\?pmk=R>+J1G1mYNKWJF!*lRK9BW>Mc$W!cXV>QqpCqWIY^4HLaDa1G=JAZnjuqtGS
DmWmyW NTdnCb/68=cSLSwY9&Bp^I+*JP6ZJcRyNPw@MZ4$bXLtE#c/aaI5J>l8emVS?5YI/NeF!mV4Ztkn*DA:
8JMlF? PTGS/c5/#^X8nlX+!mm9!JB*N8\j%ZEnLPSb9X^FYPtGKVCNcW5&:?KpM*@EabS?bVqGaCpES*?jWMbK
!5M4ej 4Kim<8cP5+#GDIyNbFK&Sqyeq=ZuMqc@J/je@yWp!Z#+PTF^a^EJk6VSTPpAG8/=#XuPhwebZ!+/EawC
Z1J5l> qc>*DjQ4VJ<R+S!<dm4DTaCFth8=4TbH!bZ%H1Gim<h!+#Ptbb*uEI=FC9PBmp5GD*eS8&tK#TC4bca&
I%4Rpj &W=Bt<9i%=QwT8JK%L*6<965Kp#C#$Vpu<dwWt!mPe#phMq%eY+G6>R4KD1RG=#%FHjQ=AdnQIJ/bXi+
NeiJ4p Mkb&d8aF?Qw#%bC<TibEYp<wEmqH!&NiTA6$w<\1SWht$iJ\pVmlI9wXuhnLk+Yk946mMST+jt&MJFBe
4>H/kW KHRI^*qeLpQDm$RG%F*kPP\QT=6b#HM*@LI+W%@ILy!QJ%cH>4aNpnacaM@T58Y$ET!FNL$d#LC5$q+p
cdJdQ? =tKXc*A+Lt8lECe9^Y$\8l5Ttt4SqW+wNjCqRaS6?wK+8l=LGpNkjHPa$^>MV/k%#/R9F%dALZqWT$dk
?/5?5S JySIunEh4yWP#n+l%mmYQ>mLmB+:dn4WPbkb4i&eZu5<?*YY#V&MYWaVn%R/kY6C$k$@:IaBk!?XdS&!
i^n8WI HS54=iJLS!GP:dmbHn=1Q=E:*EGY9Bk:P*qDd^>NC4W/RnyYBZebGY\XNI*y6:Caq+q?EWDLayGubeNQ
XEc5h# Yiy:48ME#iWGDcp!tZpX!YJXDy5\t@XbX^\%>un!hAZl1@$McAuNWFwnF16#bba88LD&FqeH%ydQHBuB
/$8H%I <5T4Tk:WC+#k%#PBE#8pCR?GQbTB!$WnBk6cT=qRk%ZG!8GIjYZJDcw@qeFw4t?5nbMGnH:u<>D%5m\9
I8a^yI G1R:tI#ZVKThGMH!y?YH^i6Z1&W>YNL8\caWRDcV%$yQ4%t4t+<jliXSc<mPuYe\:c$?$5tjkeey48BW
?/XKC! bBuKbm91581t1#4p\*KNJSaV@kRLV9GATYjnFW<*Fc4#dQlSFa<YlpM@qqRl*tS*Qm=mlEQZLkW9Q?Cm
JBENV9 mu::?@VJ!PZ1RiXIYXp^T:mWaH@w6K/>*aJncE&%ZhlpXwVH!CiW8bb88PkVD^cbQtZZD^&hm8TyPDQQ
E&M6kj $ISB4KN=!^M!h1+GM6N/I%WcjbwnEq9\^SpeCTG*C!R%diYeEl?M\<qM/X<%Mek6YmbFK9PmDZSF$RZm
j4\aiJ eStmlM!N$PNe4D>ckpIY^QH4<!BYyY6=lMGp&cPKi<$RklFdI5+l*NIDWjMGqNEuPwpYpHh?hDk5Gk&\
juDlLw 6buVhJk6MNlG8\X?N>MllJJ1hZ&c^mpT+p%SGDYXHqe?H!*l:pHRq^\!YGwQ64qa@LYh9nN=XB4JGTVk
/MN:5+ 88iA6emkq9Z$S1lbDD>aKM9*uI!%PDT\*QD#ZL+!M*JnN1hNW+:/Jn$nn\bu+w>KJa!8#VXT$HiDu!!P
<8<Z?w Gp&^CD#6E5uSuJVJ?NA5BFkX<p!Wdic!iKt8&1Iw9:<lH4iE%iiMyiR\H+K=l<5y@4uCLYM@pIK1:uP+
cVIj>% ?FuCQpKw+@Ty5ZhM*tSG$pqKyVnTmqmqtI/*#CL+jMnC/\8#qtPa?wBRk%^yGV5WZG8/S=^p*9YYW/KE
^BR^T% 5%qn$9&95>PwtD@*J#6bF\l6DqI%@IYqm</KA+NPa+MLCBpmBY\%JWIQZ6@nTIwSCqHDWI!Rl?DBI*XC
&GERP> a5a?:Rwq?C^K/e8InhqZRD$+ZD5yY:ZMybAkN9lI&#Gk&quXYGqFwmbPYDtuJ<HY$ct^\#iaL>9na*A4
&Y$dFK tP%u&<9PAF+p%VWm>lAZ6dZcI+K6w5ZwkuuRCwjKYDSF#lLqA\8K=aq?EBa$IM<S:K+D\=8@Y6=mNBwX
*&C5<+ JSXyeL54VEFlB@>cXC8X@VHXwH4AHEdNtPnb=/+ViL%Bc6^:qPZV>#9jcJ6X/4AZ6>++^#I5kb51:l9W
:/R&<= XS#ZmaM$B$IDGYq=QASPbCID\eHEaIK!Ky=>4hCiueiep\lHQ@Y6T^dPb/!\tpDLw9ZDM9waDDuX#t^B
9@jhR^ qSbul$*L<\m6!DkZ:wwD1$?^9EeRWiN&TJHHpkIl5X\WN6cu<4=!WuQ$BMyV/C8n4Ht*JmujwlR<4JQA
E8K#yN $@+\bXyH5G*$<9NKbqm5E:LNI@Ec+VbjSEA4qCJNP&>1W:L6@RtbZ!H>Xb4#&+VV:d!*a1BGCCd&mjak
A$ttWS uRWyJLBib+aqNZQD$^!jp94EmM&Z+&=6kG+%XpY$IKYL6J:q=nk%/!a/uL*nN%jHa&plcnJGWccKwmaj
:G6IqS t\VY19N$$>jbwFRpI!+wtjS:jwj/5>p^^QpCVqK*lWyNwlDChNDSKE*X^n^LI&w:SDQypqb%\Za#R%jq
ec\\DS bV+$tqMwR<LuqFahDN*#hC?ytSMeDu%!e?n^ME6j?a8W9R1K5kF!ND5%w:+8Z@\*qtV/*LkJ&>#KP85u
5ce+8P bhS>p1Ea*:=QXPwnR9II\!k\yu+P=nY*b4<ej<P4bCl+8ARujENwmTDFI%u>kd\+tRk%<8!SewF4M^ck
@CwVA& Xu%j#D8&YE#Ec*IaVtFXTIZ?&^WhS*+TMaL1JCHmw8W=4<bKNJ\F:q8&pyiAM#iRV@SV@MRwCyetC4QZ
XiyP85 /L=4=miHuEa+dBmlFSZSmK6*G>G=wJCa$iIb!*+G+E#hJj*l:b\ey<<Bh?p?bXRTR6H?iimATP^kuW5/
?:k&wu XV&QCt+PZ&GSuldG&M!S#^VhQH#p=!VyhCV1A=cM8iW5uJRlWRXQRwkE>JRHq&Y+\1ZE!I*I:?^bMZF%
uMuWK@ q8kaT<dcn8nyD%apN^Tm=LkES$Mb*5wXwY!d$FS$C#RYL>^q1$N=9<HV/!Xj>mVlM8:^5yQ99569d%^C
n&1i8m ##1LaaGL*W6h$QXtZ>iTF#M=je9L/iKiRjqb!jatid*HI$jS@$uHS<SMY@X&&mVwiG49EZQF/DNB%HiI
R*X&dL imuYipT$*eFTihKu>MSh>$RK1I*G>yDJ9NY\6DCj&6ek=\w=y8ETYde>%<bS$4=j=Fd4PhuCWDk&1Gtd
G?1Z%V NnEFKSSI&DuGNl9Id?56w:@!R?>@uLyYFqD+EM*p<*XID5<tSlPS8#\<K!5GP^mK=$#LIIiVN=95d1GV
&5ki#+ J\^@N5SqViXh<@Iwp!luq?EK!#A=b!1T=IMIK^C4&J/:aStMdPL?/nmM/F5H++:W9L%4?+q@Et!FwyGH
5mRY4& Iik:\cP$c>+i8$ELX#5@w4hJjAS@^B//94?>ii>&$c?Xw6=Enm4dIYPD?II:aCQt/!a$lVZd4H*?aSZa
\bk$uj kiB&Rw//ANp&%jE$=>ijN8j$X##?ppaXV$weny>5M!nZtlp&!VI@Weumde@1^8lduVbKp8Qy\:M+:1$P
dQhbyy <WH8KhGXIiXB++t91!LNj:^NkJ&hu<&huE:1m@>$dIV=1R:XFHESNebc$!?muiQq1@9#BSuY8VplJB#4
KPqc$5 LI@5>=hmZMTG#5:YX+^+/WSp!hJ<P#%FE&i1Jn8uRW+/w=iPimKNGc9q&uQ/q*ceGVJKjPHc^LLSL>K6
*<ludm &Fku>S!JaKelYH^%HCuZnbKj5=VqeRmYCN:m*PTXX:C^>pke6BMMEdqPw/LD*Ew@X$ZmlXJhkE@*pZ@#
y6WwaX =@9/ZRe@WqciNt4<5/nE1dG4K^w/:yk<i&9Y$!*NBLhWKk#/Sm@G?5MBLE&ACNFLb/lM!d#paE6LbpJk
Deqcce <RGH$=FT&w=B\y4%jEZEdP6<YyE8>6e=^<>\@P!>S$%Nk6MJyKPYbdCIlJVy9pyEjG\ql/1IB15T8>V#
qTwkE* 9lJKEQHyVCh&E5RiNFkHX@F^&dC:eV&qS%Wnh?F1ydA9Xd?mk!ehbBIT65KPlLMn*S:PmTmm9<VNCVtY
=j8XK^ 8eq@#?T/W4B$y/nbYd:d1RJd?&c1nwDac&KSGdMwwjaXGtM:>ISk\d=Q^w86\eW/R65YqJ&lX4D$9ddl
ME&Z?/ %1<b<BPSqp&taQZ>Td<<45V66FZyP#mEJ/D9hcMAqwN+^bDV1@npGNR//JY/1NEie*J$5?@lebC&KSRD
%pR#b< E^W1SyK+W:CMCF<CWJX5/6n%km=e5a=&1R5Hk9Awi?%+5Su^<nSPWi6nbSL:5^mR!Q5KFT%c/Z?16lwj
-AEWtl 000cdce3ced001202b4 Page 473 of binaries2.zip
95anEd l&4nXiI6EVyJIdGICAiuFtn&:JmR#DCA4%S?H>SAWBQk6wqVXZ#*bZb:a/k#1Sq%/i6*C:iXTl4T+SAR
n+hV6^ yNH>\i4WD1YAuImpM45<lWP*jL@5JtTkIm>=yw:=c!:DeJa$G9pk%489lGF+56HMWSb%8we=Z=!wtw&:
FJenCd jA1J#B4BMyXh6&Ltt?Xa9um?h1y8#jL<MWPqK9wG6?P/*Z=kCID:WPw6TdieI5JcYGKt1wCmSGFdSPKh
JJ&*Pi Yk1TCm5k@6XTClK1S:mGqQ#n^ScH&F9=J<w%??iqJDba9:*np\LkN+tRE4#9b%KptIEXW@etMXG#@lbC
u+u!+C y6pWANwF!<wmH&mKH#HW1KRma5VLMC?CpDSP+tG%?8%teRGA1L5iql4t@cA@ld>mj5DCHw$ca9%1E5hc
ae#QKE nWt=&lHWnCRXBWSlcInCKj>1JJ$JlYZ:XSe@hnCVW\GyCebtMmwPkVCKl\G6AWqG\p^lWVaLGCMdMWtw
/8ah45 ?SJ?c1+plkZk@TEa1amYFC*GVBG?Z+:$W<y+Z=ph?<:\GFNe=n/Cty/MRkkyn/cB1tp<qlJHj^HGDV1T
6?El+l #SD\T$Te&1JiqHwtEGFQK!+qYmlpHGb@SkP?AXd@@jAS%!SWm^4qtQ:c/R+/=N&Yw1Fp:qeW9bR>Fjm?
#i#IMi !HhKaH>pu9m1dNJQ^DIXEmXLMnV+cj!:VmlB/dI?1YjFaNmTPyN8Mwku+@/p?GWNE>Z<1By5h*DbhCd+
V8ekC! cC1<@Z^e?y@Ccn@TdEbL6GSMW9\cH1:kVX&q<RkcS<ZSB<qlM%kCpW\6/cnBKRyVdpuJFeVCe99WE!1k
@+FyPM +cW#KR&PcEyqS<%\>P8^IFn1LYjE\#/:SnTp+XwImZw+pImJS@TKjhFhpQI4PSAPHL8kyj^hTqQBbh@D
Dj<K^G !%=T\$cyH!>ttunej#/#Jy>EISEXJWeG/iSQ%e!5m>VeYuZPFpF1:j%%emmy\cj:4JGd@MeEHlNMYAi5
^/eN^t 89/1DAR>iKSkwLBpFD\F9XkTFkpCGhNKbiIc&%jF=J@TMlcK%RdjA4M&MC%/@DANpT6WXMGA+l:Vj<BD
dDR?wy &NYtpt?:e>nSF6HaDJDjWC+?#K@aDMk^$%DSA8ZT$F\%Hcn:Q:\1I5q:@MYAN*WuW9Vaq#9Huh%:d*#h
:G6%iI %p<8T8@*8h*EQ%>nkQPhE%8/BD6=<DmJGKSk8DhKE&LEyw#bG1m5KX1RTI$1FK1lqJyMA%?b&A\@kDN*
6L%*ZH Wk9=DX\!\6@lMNSC+Wl/TC*RhT6WM1nL^qMn?tpk$%^WR?ELedR^<\R%eYtXRkbTcX/:C#>1<XlW\=5C
&RD:*K GuG5?kI11A/F%YJ^XKTV*nGXTkL4R8wwyVR64EaDK4:>VAanuqTlwW=GqqLeGk%I\BTZlVa=VmwAM?n=
&Baiq> Dpd%K>I&JIPYLBp#KXA<lt^d8PANiQ9ui&$wMmk$\Jp6?kI?wL:ShH<Z^$SQyMtQ@8dtw1aFQqL^k<$Z
<J@Pli tCM@WKmtpy>dcBd%8!IYQR@1yicukBcANAnnc?4XV>wZ4^5dR\B%E&mj\$KSMVL&bWNIqkbLjiiJ<QID
tpIL*m Z$&A^MaK<:k+ZWQ>n+ZZw*nT4QIjLDIBDeq6PeL>XSTcWwbp$yIj<hX99%ywdeFYj\i?5i9%j:GAE1:>
<<S1JB Dw/l19>D=T56HR+!1X>/kHSd>GNb**h^tn^J</9eAnB1XLIkikJBacq>?B?G*TESiAH58B#\ldCw8YFR
V&+J/t Py?QyY/BYcqMPbXWGPpe$SR1JGR1%AaB1Tii+Bly>n6$RBYkVe4KF?48pP>*8l<q<G>MZeT6bc<B?A/e
ScA#a4 I&j&V@mmKKT&n*yWl?<!F+!HN%p9kye/D\EpCm@R?uWA\*wMAWEEC\XVwLuGkV!ya@RbYE/QN/dHe&iA
RVm=%\ #CV/:T9AVdAL>@p>\DIK@epDNK^!aR\Sun$DNPiulyFMt#aw?aDuIVL:V+jP=1QBlpATeHkDKuCEw&YR
8QajPJ j1K&4SyB@5:ZRH<q1cTYw&u@CWH+J!%X!uJGLKjnaw\MRua&m^TCnuZIRNDRWeM\Rw=iwR/JGR<lZLIT
VYBu!< J1/B1E+!YB>VmRM%MK#F6IbwlLb&h&<yl9pH4Ipe^wVYm/DLk+8Pn/h4Qw^R9C#/1+JGBX/DahD^68aZ
e+CpV< y*JJE58#a@AY\/Q+4:ZbPFWbZ?y^>5#QwCHm^m\&eaCYCdc\\@mI*@4A#$Q@SDpL4w\^d5DJ6=8!KSED
%*W:%Z yA@GwEK$tdPBiKuKka>@9tdBGiLLVhL>XEFVPE85h?E++lYCHp!ANJ@MREN#1Xqc\TCFRQcibZyRTw$/
M8nVZ8 ej=WaT/Gw:!=N=mLaYu99e==\M1ZwLaeiFcD^w%W#CnVCXF/1i=!u/H!tRGta1eKPVT9Q$:VY/mmeP?=
i1ac&$ 8b*wD\#qHLp&C*9T>q59mk5T>tGMdIeDJ6eQDklXQ%VQTpDXY:kMV@>TaNILRcehnk=chd<JGFk\jI9&
:QISkn DP1jd$NSTP+PdnIy5PY^l/q^MQY:i\<SL8wbn\V?^8y4Pu!%Mq+CZu?$lpKPhE=<*u^/#+S5TH&9k4W+
#DwMHF nM=C</!e<j1%B5mXcdK?<Rl11#A4y>al!HaTJeeJYDikjq5kkY$aRPpcIWbc^i6$mEkJ/$h5F5:FCamI
5S!*n4 T/DlE/hiAui*<L4&9R>dp6FADn9dP\VdNIDDPP8X\cuh4Yap\CTdBIVSnY+$p$PpRZ5d%KAimE>le!pQ
k5A>IX TLE5AhwN14Ae<D<yep+\Iy%tJH*i+9MA>/A\ju\j>h!&Nh^MjwCKn:MJ%%hAYet=PJ>>:<P@>qbV:hN9
M>Z5e^ uit>>R/am:Cb@EF#nhAP%B:!+y8&k8CFTu\!q$e\4#*!M+S#jT*$/d=iM4$IkC5VibL=+!=pRqmyZ*$$
@FGJ>e N1G8G4+uQ/ECFh#>S*X5A8L+yJud:m$qbJ$iRYY&^@FR?jZuBHSlaRm+kDJ9ip^p\$:><9:diNYKa*9M
j&p$8/ qD+ZTmbpwFK&#cRDZeb\Ed#S=#Pj54%tYNG^XYF!9lkH#!hDWpi$/Th!$66/w@GDEH/jD8+uw@q/WSG/
d!hI%Y hj%DiuFCMJRj$D6iJIhSna5YaRi^puK6jVytjw+\<@*t9Jk^EEqdk4J?%Qty9JnLuy9kV+dHGHV8=W8#
XZM1Rn \CCw4^/$81c?N/I6G#u8%^nuZjl6ByMceq&GCm8hqhE=I/pNX$S<Pi8WLnX*h&6XnQJytZ^wG<Z%aVT=
I>Ib#\ a+eJZWTyDwL#ql^/8yyca4S^HAG$I:M+wd$muiVd&EKHlGmS=EeyyYRY:Q%KXSyE4A66yw!<\up5b*@A
&5qQBB t%I::4/Tn^%Wmd/nHjF6YpDImVq>XVGj8uFlDe/B<XK8L\/eFH*BiFu=%LNZtRQ?W6=JY:bXAkaMNIc#
9hK6eF Q?\mdlqFF5Li?FS1cqu:AViZ#RB**+jG6h$@HNY1ytET4Wc1IRN%8!lynyLNXZyXHcK8P>DlV#q6Qt@a
GcI:Mm >8jP@N\?=LSK5jk4?uZW6I=<q?q8=?%:mq6#4=hk/uZWe*1@/!*Lm#i#KPZtM=A@/Q%%TZtF^89JQ9@=
ycV@EM He8wLXik8<=XD$#V@hJ</4t\Pj*u+YD8:hhDl5iC<hVd?e+@h$19nN:p<C=KCKp<BM1d>RQ>8p9%4T>9
yELJJ8 4aQG>Smq!#bVLwK/^yH#&&%tjkR:DFVm*tE14%C>+a!yb<@:Lu/IQy^6+Dpuy9w=I%@%SwIEJ/+?WKP/
h5%<bV @JMR8ew:e:H<QB!84/+Z5e$b/?kijJpND&c^989CX4!lYH1=6MaE<&ych%wACqh$=^@4e!cne\9ySFSq
<QuwGl wteB+@Q%eTIbykw8:a9C&/ZbiLw$PYFmESyV\MtlqcZ8/d8dVjdCFMcqFTC^ui%q>!9W<S%*/#LSk#8>
mXHt/w DR>JXF8K&bT41#it@5I^WL8Kd?t4ueLi#?9\@i!MZISa&:C16i!4?e>Dh&j9\LHqX/GV^p#*:$Phd>F?
\m\:6T c=9FC$B?#1J9@1tLh<@?V5=j&:I!a8M@cP&X=m?:J\68yYW/Ht/tVnb9BuMLqP=D4*\\=\jE*a6Vy@@A
w8lVHL XX!d:\MXbQY>86LK*49dP&+::IHHd=hiu:$!e1YL?6K!9VcHS^>8#mu>elhi*Z!<=ZL^WYkukj:jF<?K
E1Y!AW @*^MAd&J>#k8d*V>py5EGM@i8+b9>%cB@P\e1hm^Q#?&tq@eu\u<:QSZ^l!I\%L:NHyMWlFmJuR?=*@E
*c<%Nl lS=*ERS$&S@J/N=/85@+ZEyhpV%9icDp%NNByDMw<ZEdWQZyw*wjG?C=hKt$LB><nWKHHEuN^l9A+n8Q
+9tPCa y>PN#HYZtb>>8/YMuq#!jDq&R^@VY%jdhn==1V?j#Du$BJ>5dw/cWPnPRSuLuq$N\QRqWjBC#LM\DjKV
F5Z=5y 9XI+9u5^6CCB%VRR5p4d+LCM?a!%T%T&8hWF?cnK#Y*#Bn=/GRne?K!1*H9y9juaQj9dtthl/BneM\!*
Jc\Zwm :LL5SZMFCehW#:+H=Z%?!86<T<%QVM<8ZQ5Y:MJNEHGMK1%$Du$MQy9hEp+N#!yZQ9NB@SjVdqHLePSk
5u<qAa Y*kJkmQHY8D>^MamYN\dV^dM#MXFl$#tYA/b?=@6=&?NSFCZ^QEnHY*mS>AuD:hkD!<QD=i@P@iLcY+l
P>DiQ+ ^$=QG:a<YL=*>Qd5dDpS!=T%?t+Kj#^8a6*/D<yjQNWYQlq$hjb%y*b$>5pD^/T8?m1dA!&d&*y>:=/^
%hXT=Q Jc?d5S?=NGC*Nm!dt=ib\^d5GJX:Pyc*8*dZj!6AJAe/QZq6HAY<<L*\cqhk#QV8/^jnBFN!ayw>JkeG
/H\NSJ =SI?#9y/?:$/?&XQ\5tZX:1N8AhXZnMwZVhZ@>R/q*FBYMjQ:Pi%*4<p61??5Ghm4Lc@$4j!TH*nq#pj
dQk<EF D@F\j=PIyH46/&:h%X4j$6e9hw4!$$NcI6Lwj%w:4jy1u/jXm>uG/#$ybu5I:=NFJDc^hwuGM!pP?dP!
^$/HW< cdHypTG^c>@k\udLu9FTTREC@PG6/6dKh8*$NIeM$#6HdFb1!L*hN*mRy9#hG#AJM&iHD!E>$h1X:MiM
ZG6:&n tWN@5dypdY%9@@J\<LTRWtNql4p@@:I&S?QZjd4&&8P&N*DN!QWtk+L%CH$c:l?1/YcG&K4nQ6YC4j:t
VGV@cW 9jclP6FM@q&>P?HXi/VLj8qH>kj$QKTKeX#%#\Z5Jmca=#/BTbn#>lECNkN^:Pd?G?>yV<CNkAN5#TQ@
m?wbG% SjdIi>\d<jdc:G@mQ=>9u%FC##XZ8:D:HQn%y?dmJE>&HN:maV1e^MLdt@QaDL&hjGc<*WYj%^SWy$I9
FZiN#G cFDIL@\ENGLq6\aZNd!:Akni?8&A9!1HYEM81=+JbMEY*46CdYXPM\h!QZm>M<5dLl<?1n&%t>e8Pjb8
G:b5X8 jQY8&u?$QK1u+ZA?dY>8Z5@%:t:wPSL4G9D*hZh&:Gy6dty6/NYlIGZE491ydp\e+h$5kH+VwDX9THWR
H%Ne\= \XS6cd=\i9Za$QL/uutLZnL+qDjMd8l9/t!eQYB#CG/>11^hedNWF#&V@ju+$PBupL9d?9T>%S/cw>>u
Kbl?S& mdHQiREcmNAJGIyi+>#Ed4d9&uc1/Pm^Q:Bw9epL>6<:e8DYw+6CB?6i?@6HNwNLKPE8&aXdlG&e#Xp<
4X:*%^ XXRSuG@+NN$dD<MuB\Hln5/B*bh?i<%4IXhe!=#NW<&qBTQhdd$Hyk899GCN1##^Nllki@H#N8D%Vl<6
:HVkC+ uF8aaC:?ejW#bKARbIm*dlIaaPZc8??aPFwn4n\/C=@bIWAKV@XAiu!AESuWL>?QA?88kTW85/9ZNH9X
8QEc:E iQZ$h1W=ICJ<5h#S&T18KH>\j:&kZ>laP<$mw4F9<ap>QQK5Zq4y&8bjP6*T%!pacm\4Y#46BZK1H/>$
#e/MY< 6S@w*VB8PZ+@$N@t:?u5>S%8QiDj%*hp9HC\>@AJZ>bSZ#4iZ6@R$>q$18GK*DRwTm/Bk#m&e>jDZJZ*

-A6%KG 000892cb180001202b4 Page 474 of binaries2.zip
p%>uVh wj/#9ep6Aj%^<jLPV+#wYPlY>u/DTqXCWPQF<\tY:Hib^uQ8??1T4\^/N#WS8W95WZZZqaq>F@*lce@=
SBM/j% bT5ZSZ#d^5kXtJq<RdldTuQHlph:y!&Ru9:mhPTPW\<t?8Em5ieNCWn44*iM*&&@8*:^YHuVk6<BjjL$
hJT/^K GlRPIy+6i>SnPFL!dca%*Ad48ute*LeXG%qH/4u&!ZhL6i*EFiP<R>n*LTbT**S?/=VP8X$8i>Qd$Le9
G#pm95 M!j@+#+!YdHE1Q$HSbit1AM+T/wY%L>KLHGRQZJ5baBTYQ#^4dFulbFjdi=aji1HDb*TZRXm<6dnQJ?W
<J+EVK HuHkcC#6<NWN#K^nQP&JS^jP:SMj6\:jya9uG#^/hWh5/u#!ISlK9Vd6/Ynk>i@D:Xim?Ywb^P8nphLp
u&\#Vh J\#>=iVal?1u8p::*p*@L^4ADN?Rc8h:!6Zp/=iQ8+wKV!!uh9*?Z^%F9l8D<y@<Ww>8HYKiYbD/=p*5
@pRP+1 9&ywZYd8njR%pt6I<9Dw&FB4Nu6\cj5TL^$d&m$6iddwAK++q@WpB+\hHZ/q>4!pcdD:RDm$t5!n5>6$
#ER&>h w!BkjI@EX>di*QH@ju1!#6mt5EBl/#iGeQ*>BJ$XTDYMeQ9>Gy%ncbZI:!MM8$1GIudVAcH9Ih>?yi<n
HX:mp6 ei#y15$Q/:W^hPun@WMe&>%n/n$^Dht?j\YZFPD9XlZ?I#:pbXllN4pBPm9BFpXQ*R<mEyL*FE+Ql\EP
jbJRh4 W99/49HVkej&jlLT<PnP:=eA+Dil>#ZjkTweQmPlQVjtA*&Iq!Sp/Hyw>VS+!PA**59Z=Q8lCky5Fw=9
G1BeyP 4RZc/Anh^P&$5@mDFPkqS4@jIH!hlMaQu=^1\>:&k<?8bJJQpT/TWP+TcRq5<wYi*L=%>kbJCwmFXMj+
JilQZl c$5W$%J:lAR9d*5q6a9pTQLqPu/Snd?QlLt?@Iml&u5SDh/<B&KlBZ<ECX$:<J*SC*:5pB\@a*Fy:Z\+
Fijy^6 CZ%@=!qES<t%jKn=mRcbaPd\11H6^BpT#QQ+RWi@kpGZ%LiNy9Dc!1WuSS!TkHC>5TNF@9myyc?Z@IDC
l%1Np< uJ<8lpH#$!nPFK6:PaZX8^9&</e&Ct5eQTX!1+Z/I*TPITtBt5TKM*+n<eCi$4/HVHVJLbuFF/d8A9Nj
6/C/wR 5X8Y1Z*HVTGTc:=Ah+T16iMpn1PFl=4&!1yS@AH:PTeypn$9CYEK>Ci/JJV4:bjp6M18H8nNwGKL6ZhB
Q8#Mh: #8<Q\?jGLkLt%it9:edQG%MmdHGL+e@IqYd$nI1BuinR4@:8X:dcj9c1#i<jVX9%q^#+i:a#y$$j*>4q
X#>#>! P1@mqZh$JcSwm>im!#M:EKn%MM>ZyddYQHm#MC:bicLu>V$+t^?$k@M8dVuX+^@h>XVjJ>=u9aKdY:=5
Q5^l:G *VS5jmaG8/mGQu^?PIZRHAThca\P%ZT<*t94lHdQ@H!Vth/@P!VChZKR^5+9wQR8nlI>+4H1l?W?eSQ+
Z<$&CD u4kj<G#aZXw@y9EY4&Y8#V>bdlWHTFEpTabD&j*>H$DXtl19a+/?L6=Z&1>6Vn=9QuaTZuakQ?>eiumk
MFed8h jIZwAkAk?u5AaD$Am!LF:RR!ahXYW^aeB4D\LX%<?@VBVhd$aHSMPl*86nWyWWlS8t@#1aY^TXKtGiP$
V!kcVK #HnWY#m@taubmNq9P^CptVlaB#Q#pYqTBSjSwI^a=NC%KVXHDSbW%M!1JKlMh*9*9L*$/KSb$u<j>pZM
XXXeYj YAkcW+cSDha$JyItmWd$mbuc#=FtP8INZb<GS8WQ%y//$=CEm8b@1hBJRwW9NV1%NXEbS%j^Gw=DuMm9
eyL:#> =/?u#w4KY#9F8$tTAtlAb&qTSbyS4#Y4MbpIEwi#EtFYYC@!&j=e\8ApNFd4K+!JmIKl!TNnCM#SjC4X
QQkp9^ &CjVclqmn#FBRJ&$NYLV$wt8&kA4\&LB:AkNNCndwNIbk:JAdJI##?EqcppM>DnCMHSP&&CPKm?T4hZC
#pViF: &aRGII5%mY4c5MkR1E1ijna#V%$ab&>4QWVRm1b$b4IWTqSEFdSC&#FJ4@lSnM5cIWTmE8NHe=yKaY1$
I&nA5X j#@b@PWYAw@R6l?!9DEXVeX6mMpWQhB:tD/tADPJbeNnn:8FnHtJQHdBLbYqcb<?GLK&%uKjt&IePbqX
T>dyPW hE#nl&w=bS!45&d$#en9/?eh9bRlSLPqhAcTnWAmp1b#=G?%ehIdpmalFJI=%!MHtV1tcW5a6@&4cl\T
l5H?cm 5L!SwqG:WlAB^w%lBhRZPK5^K/la+4jN%inqqWM?:14cXA+IFR#4AR:SENInmWyYK?JV:4F%Z@A6Ey1#
PXl:=Y uAw\u=<aiBjNd5Yba<e$#nYTwSBVlSGkppX?^:FcY?&LJNH^V41mD^1ZK&p/nila%jY5Ba:WJ\E8TCVB
W>wEyL DQ&nT=MH<%JdtW$8K=immS\Hc5i$t<p^hYy$KMl$p$\TnBKK^J6L8HN+HV/VMynlnD<W8P8aNk=ba<FB
Y#jj/J I/Twa/n1NEFk5T\IwpYVa?LFYLPHTSptTR=@9S?j1Q/qa<i:8p=dkDe9yqK8N6J$E!G/Bwj+w+ByV/tJ
NnI5PA lWHNjYmQaJl4bG?w=dcKTZ/>awW$me+CIqp+tuLM%P^<!a+eM&p$*5ebN<W+&&Z6i1QqLM>tQF6aa\$*
E&pEHQ AZ+qMWYE<n6yinQ6EEYmddL:YFpe<?4q\5XMyy=h9T^P^WnG&jy$Y%R#e?WeD>:aT5u1iCdthjtR%6Dy
&P+1\D ^yRHK$h#Iu/la?CuW$X!nVXDc\=^qwV&eB\YlaTS#1GY*&Py>q%6S+Vnb9$neai\eXdGB1\J%ttNPec+
qWDjQm qW5WGu@W88t94SpJV4>?iD!jyu\dq!HcVqyheMR&+CquyX>m4:Sp+E/lnh6QaW:8ZDPJJ*^=Zw$F&&XC
$PqFPc \Dw9n^DBJF5W=/$!eX!qbXnS&l!95J4p#&F&*NIh=F$5W!Hl8FFdWENK14SXe$@eCVQGNGuYuqDZ#m=m
e^Bici Z9QLqPuKRSm=nwE6S^lJM5wjel+/Vb!6+%adNn9A&<6\4Lbn%%Y*4aZwc?NMD@1bXVTGlaBk#F9#HE>V
D4e&5Q clJ$KP=%WMYN8YiNj+VlIW1Z%Z5B%VjMZE%1+E!K&#a$5Y@&T:#Y5&1F/q#NGDjLB=^YXe#EP!5w6y?*
KaZaK% Nt4bBuanc>&ce\?Za5Vy>VT^<t#9Y4X%DeF$DIyF<:eHE/c<4iwBqLyP9*5?i$8Lpy$C\iKi%+LH9uY<
EZu6#\ T%P9%HJQ$TCj8l$6<+L^mN*%?KVbaS&$+Ltcw+/!6nQ@k^yZbTKbPEXLuhblY5iA/b:qaR^*+@499aZ6
YHH^*G QmlNuyMt5@F8klQcd/m@a&R\t8wMbm:h1uqN9hkL+q1yiInEJR84=C?5tMiY&LpYXWLEbCnRySL#LuF5
cI5#Cw wmhdYydHB!9M1<Tq$P9P>:m1#DV\jiR/nikppTHleEte=dp^6bt9a%at/>Qc:amySlp@M?I5DK:Q6nwP
nZnq9X ZcYmny4B!8dQ:M86q^S#Hia\^$+^J$E/1VW:iP8$i#h@9TEu6+$aM/!c/N*Rc+/4nTtRmJjjBye6ZD%*
uI%N6M *eR:qGD9@MYC$%nCT56$=nMZ1#8!+V4F^!%PAR=KT?8CIW/8Dhed54yiSI9itLJDyMZcW*H&PF=98SCN
B\!Nl6 i9e+l5+1P%whJ*K/mDW%cZJKe<u^DdQt^j1D^Ty6tmYjnE*ZCiNB%\m%jhN^C<jk:SnV1k=#&une^pqJ
e%:mYY i1$S>>mJI>4a*baL9DZ+Mb5Rm*KJpiEle&@<GQe@B$:>/dH8PYQnil:dL%q$mJ*YR9FRGd^lP6ah9/jm
L%$T$= ?F!QV*Zc^5kJnZM#X#w5X5<1Tyyw$*F8cEXC8LQ5T=b+*Pi<XwSc\\peP?KiF6WbeX5X/Z<t6!VaSch6
eR/!1M 5B>^u4Aj8eeVPHZ6bGyHiSh@*dTuVeW:ba11KB5eR<CQV66t#by!%w+>VY<hHb!#^hI#Jdl$L$@ZJdB8
AbX=e< acDZa/WkW98#!6:&GN6qn*</uFYMaTZJ99S%tLD!?uEl&qNnTM*WtLD\=AB1$?iR9Vy&$Zyu:=jWwP4R
?k$S9k #$PC#ecP4kpVTa%^uC*p8S:Vkkb#=qldn/qm:@8bd5nBcL1C\WiiuPLwyMaai!6/6YWNk@*j@ZnK4Qb4
hVTwP# 6ePd@C*Qt+w>/&aT#BNH6X*>?Fw#R5aMdk9qKcGc?BZ8nSyHBK@t8yPH@BE/&JSlP=QP?HJG6YWdTGt6
8dTQBV qcQmSqq1dKaSW/+Vy+R9^l/Z<t#YbBe/q5QJaibwa5HMDS\1\\^a*NnkB?^J#9k#N>c=Pa&ZjGc6<E\d
huMTC@ J1aK&yQ%B\G6V4!aa+nG&kMtyqV+6p+EB?/8Y>&$^@iI1@%$FiQj!^/#p65S9Ct&QYpJ#YydIZyn+k!#
n=Qt%m 1ktYkt@i6:TPN$PlNBpTYiQa\*TdJKQnpqiTq8$h>EVXVua#9#N*XNY<&*FPbbtuaWc*@uAtcwbY$%qP
%@G@qm LtFCqFI#%yc#&&p\+\=a+t<c:&I?>@X5QA1mlp8/Y8V1mILRyKk6y%lwDBQ*DD9a/WD1V&QN8q:!ZhL^
>FX!8h Y=@\m5HFN^Lj5$C4a5XqpE1Aw%t*P^^eN\pjdLIY>^yTn<h@:BRkXcN9Ym^*meJpbeGu#qwhe6^pM9qh
im1\n8 /\qN4+4N$jnuwt9V5EHWyIubNL1DcX\uPTaKHYh&&=qt5HYeDBey>Kb=>Vc!=PZy/SJ<j5maC5yWy#TV
+<q=IM \pp*cTXX!!lume/$>a^I8w+B/nA#c1@/cK>hJ/y9nbKB^y!WcaR<TVw&*VIJd<&1un8JE*/WYiPW<nF/
dlWY9W PPJ=M*5IW@1k$eTtX4*YPn$b!bmXl6K5*EEtPVaSy++&#ZkyjV#6>Kqna\me&hbEW@nMaqmVuBYuwyty
X<lLGc cLp>%mqPKAKC/Zpy%t59%&:VAX*Mdk&e8dQY!iyMm&dNNn&wHJ85%uGe:Dwt8HbQn@a::cc9>e//D4/&
h8c#GQ 4Vcb=Ck6He6aWDP8lc%b:YB?4c$#YXQj+QViW6YCeajQ@SLV4%w%Pk^XqbmChEZh=MdEPFdetGnu&INR
th!qq8 aVXp+i4NB?:a*jjLKqe4t6bw6S/5Z81tPu1u>Ed6CCc#Y%!p59c$::9:a9%dYyQYSNd*N>pV?PIHR+QV
lI8KT+ TVVMI:8>C=#McZR^c*bm/Xb%hGq\bJ<C6!4d^<*&Z8%%@yTb/B^ERkYtceZbuXt6@/cqe6S$+nmydTa*
BI^!Zy hIdA%Pjn9nhj>QX6HZJcTY8&SciM\CGVHDjV/Spl5Eu@cW&d=cmBEA&l>D#GMHH+8Dh!1ph=e*FKVkiX
aWQ5JM =YRNIk>Fe&dTmXad8tl5XS6\>QE%Ga*%ZPLc/<?YAG>c8//!DhEMVN9VVI#BVSGN\qTD$ibkGdTTp8CM
l=RqVJ hjReQly*Vaa4&#mQ^GY&HcJyh4hSSK^Ap#F6&#BNnnlRLTc$J8K888#@Pluy6IVHRC@?DY6n&Cbik&ww
a*9B6K 9+:b4VbG#VCqFT&8h5k+u5D6KZbGuYBmLG1dlqI:^qqdC?MLND*PBT%6im6d#Gw<4iMS<:y4%mGW<$Te
1DZmJC pq$^RhyG^8nE1VG?aG%C*KEE1aW/X8b=AZ5X%\X@?udL!=KhEySP1>N=4Li/A#YXX41ypTtpW/9NjiZ>
G4k:9E 4Y+ZI<E$yj9p1%N6c<cWSu#&KcbajtM1cT^Nj+64QTe&\ctQEVPP//Rjd&NYW%QhtI@u<YyaSITJ=5ku
^Bpm4^ Smdd^m#h$?mhSi>6@I9*<$XRSJ=y+8#y&GGc@PmwcV9A*/Q\%B/1H@e/$k5t^w?/nZXM6<a:ZSyY>9:h
hFb*5/ y>W&VN>K&?^5ZYX&Qac#qBQ^5L8Z:i#cMeyIMFSja/8V1F&*&Y<>PD^$qN!&!S4*DYuS<ZbIt*=>eMu*
mTFkWY &edVMSNG:hAbIn*6Gt?9muYJS^>9$^l^#c<dl698kInZ6Sq*<acPZ5d5b:TY#:At^5RTi^Zi/TXac#Z*
-A9!qi 000e4392de0001202b4 Page 475 of binaries2.zip
FICQn* Kb@1K1@H:jnJ$^K#E6qI:alaVNy%8>4d?uZZaw#>F6IYeZ>F=Tmj8:=Z=VBB1WE?daPMtwVYI8Gy>5I6
&+K/PH kZF#XV68!\hS$$LtI9h>nNF^yeP1/em+KKQ^?pLlca=/n416ibjhh5X\LuH!TIj88>*mLcHVCNuI^Kk\
/nm!*P Y@MGV69qmQheFjNtZWjI+iY\$+1i8:@h%@$qPkndTG*dwNGLp*n8LhjVy444+Vu!TetnB+@XeiM1St<C
KMuP/h k!?tqBjC1I/hc1+^Qw+duj#enjGNb=1yj4SmQ6XXMuE6*mYTcQce1ATdpXt*dY8ZCXMEY?uN+#$>qPI6
lJKFGu y#F^?<a+!Rc^huS:qj8^a+:ZZci/Y4iN<W=el!Qk8^P8PX!eHd<uDW\1Wyth8BjZ1Vqde$:iZ=!4YHQ1
B<PNyl %4c$Mnq^iX$5qRM$dXNPY@cCGG=h%*$tY??8J@dpJ4d5Lq$HnE<>*jZ1SI*VY#4HI+^nuh4&*Ihcuy:*
/eQkaI /uFiN>!%$ne9<hQ&A>1n9Z%<dK+uPc9h1*DL1$/:YC5Q#b4d=6W*HdWLatHZ:Qd6a$RuHL588aw=1+uq
Pcqq5I hEhhV\@%Ybw9de!$j?J?Y^&4HGc11QL%<>dLmut==LZniK<4$L664ThcnHQh^qWeW&<>aW+i>>^+mbi\
<VwCn# %#5>bXa@bXDZ@nt?/PlhaVDCce/:KEKd5Sjj#F+W=/#Qdh$^iD4e=W#?!ZXp!FkC9J>?<%a%M=Pw816^
k**d4q !PMIQ&bV9dj#MXFn!LTajRTn/ZaTb:F6T?PYMPdDjc@YRV*+PL:C:Bd9XM<^a#Vy/&d=p4Q%bP6!=8HZ
Z+i5wR >1E4i/Iq*hmBe9ZiEVhh^/G>#wP>c8$!=Qiq614GejequynjJ?$X6S%qC$:*Ha<ib:!8\=Y8BLe?%Zye
lFCTdh R*5eQJ5hE&w\qieXSj$Tnp6Pny^HC^XHeZY69i*8%X\Qb6!PTjcAa1ABmlDaFTw@APbZ?K<R\DE1AKba
5di8%? CNaHqy^aNA<ABICV9\mTRPaYBmkCApkE\XuK\RJP$I\A1F>mKEkAQdJm%$yYaHBk8m^IReb\:MbqCWFC
ycmZqB CM5TADIKXqXTH6RZCnZA+1J4W%d5c1mu\m@t%NnM!1LKqtuy*kZy9c^ca8c/Jt>wl?MkQM5t>yaC<9T+
k#4dZc QPWmeDd&t&+=Khm^PBy%FSW$A4@9^CTmu=5JqQSwwcKe>:TZE\y+:Zd$FnG?jCetY^I%T4+?hX=WTab@
M1GMLu *H?kSZ:*ch&61cq>4%>u>tT@hB+IXmd8>AqGa:/:ia4N5N<e^6Wbh:\jn1k%mh@5#DnpiqMQc%9/a%W6
HaSXjc X<YjhSW:%H14M:cy?>J6amjm6\!Y+LG9ViSSnW#*&VN6Q>Pt=!nqTbwGhueH#KBqnEtKwPa+$WRLQJCR
*ic$@q 4WP>$L4t!h*6nY9BD@t5S$N/MEX+IKp%H5KTTawCIM&TH!L4p%KLlTPYbBlpG^MjaSqBHSFtja>NpiFl
%8Vm=k WpEl@QLc/1CQpNCHm<85XtmdKXYhQ$lBp<KM6c>m=6SB/pRW$KkZ>E8mV*&kPw/j@i/w#*\8X>/Z:pu=
RBl*^K A+1CXFVnB#$bIaqGEmRytwNwLV*1eTBAM6AEEy%ECBKMlt\k?b5kL9nICWpI1nDeN%GY1CB$aWjIYmFT
:^\aIR MBdTZSy\!G@>h$ppCXJR18AAVDJNM5E@NB4wecYa$FIW/EFaQVV=w&RWJ#q\%N>Jb?mEnPnJS8E$chBR
PDIW=n I/VIDV#Rbin!T4mp+LXna6aVatZ4KD*=KFCD9l1THqNC444A6\&t/F^Vc1VWyhPXTyL<EhMRXT\ST<Tp
lJc^w4 E$TDJppmqHVRNw&EybCCRmMd^WEuw5CLVyK5pXJE^PuHkNLeq9E$VaRj%KlHEEPQ^pWyyTTyC!NJ\yKm
qY%abk MKqV1R98m$<p@9D@HRIAe+F$eZ>EbWaqX@^Ta5TP><ciV/:9hMGj5E5/TRCLDA5DCi5ICcEBl!Ip*RPZ
qeYcbN D!=WEpiCA+9&IDwW+cj$lNauGFbDHku\TpD4lS5T>qbwEH6nyB*kE<!h+A9=Mn+&QeAuFl@4Y@q=*w4Q
6y%B4M Rc8#9NQ4jZQJ/#n+tmkceW=kW?u8#G>1+$PlQ+:b9=ButKuIQ*ZI+=!F8jb8=:1tMA+LDT!eLkAK8lkc
JWa5e< ujS88$e/Mk/LSJSLlTkEDa8yHa&pAMdS8I?#eC?IQ!JEp/!qRp/hy8&X?M9eTHBe&>W&Ku1BaRN%\4ZY
/*pk%i DD#=AA5Q4maMYw1wld>k>dGFm#mYdC=W+k?$tV\b+8AZ<uL>+Pe1pVe?@&!qc\iC<KZ=LQ/NwJYHb/1j
4W$:+m =jAIFHc1WN@*L8n%DnW<V&NnjVX54<68=+hi6Vw6/=L*b*^AV1/88Hde:ceAYG5qmuQNER:BD9En8k/y
5byWnW ta&lHhmGP8$#F>a\:=eB4HwFYjNJ\B@wDGwI/kAL!LAMG4KYeA>wqPAF$/LIRtAQEBAAjA*wS4CaQQl:
Gw1bJk RP\IBZMie#yp+AkEhn/%A:T?Iuk/makhRJIkAl5*Gq4aRXGHkA\knEPBFS\B>TpFVLaYWMb6ANp#Da=1
@M1TjR J+kc6k<IwRqEDi&JIFMpkR&AbMeAmAJRI!AWDYAnISRDAkFpYPCp/JBMiSDjlEQCyGDXSpVp<<HScZ4J
pI$1lH IEXk=ayIt/#SNA&nqiYTm/dutKFMa$WkFH5RE5VV+YKlYGA+tywK6AN@c9$K!94?*qQnMIAVn!mt4p4W
8:q#tX Al\B@\ljqWIuF$IXBP!kwkL8AACaZ4CA4^GwAKMSkERjQ?yZmTmmjCQcZTQmtt#Pda\Kn?B\nlpMe>w4
N5ADIw WV?qCm>%RQmP6EIDl6a>F/^/\kl+LatdA5T?E\WVCVnaiBJA/C!\$JMWl*^RKNSVEBCMG6e@MJ5tES+i
Q>eK&Z 4^XQ^C9\T+\CDL+GAIAAkFaNAAC8RI$kAGAKF$GeB\9^<\pA\AEApAMA1\ERQRBEpiI*Ae<1>mSW5CA\
R=&m=! ACRWmBDep<l9=KPQ<XuT1jy$G^\AaQ\<mmY?AAaGC\=4M^lAR9?q8w#@tSnVnSH<6^R:t+Lp\<b+iwK:
P$>W&p Vh6SdwY@\I>ZSF?acZPKPuhhyqQBE#FJ1t^\X?#%1/p=u/M\JbF6N5EZHbw*<@EJ@/p:aP/d>wj#%NyX
^YyBl5 ?NJ!4u?MP/i@u9Q6\?6:P8bL+iCpDe?6Q^@B&=D:!?PD</K@i*j@=c5^9>IAj>j$c=jI>Y5*>=JA>:8j
AkXTiZ d=i@\CQAABL5CWpSAGBmD+C+RXTE8aAwjRj:I@A#KADkk/RmpKEI<DhRBkB<lc5jh\MAMH5F^dh:T/<B
iBct4J MQh#W*>RBAG9Fd+jP:i>#$kYMGjEyCnL+B=kV*5Qj5FcAJnXV%$wphYeh%mKkI@qZyXZAk?W%bwkB\Ak
#hJNXJ :\Ym9?ABAI:!5Pij<\bW99J*HIRSEHnJtQ<R8K9&iRii^D8@wARH9kD9&AZjG\IAiTTwIBedWtMBECDA
jyXVXw PSS%eJuRIlwwEI\nL5mG\Ahli^b@F1W#=IFhk\:J@n9H/%^b@/6*ljj+G\8\h>BY@kD?<S@!5:<AFkL#
H\>dK? <1/AKbBk$\EAHqS<culWeINijCaGbGa\!SF$1N+i>$@paMEAj%NA!IWeABHEC8D6Li\BaGqQ#5yEp6AH
$JWWn& RAV@^GBS#MPYN\VAuEFK+kCP^iADBKhuA!HKE^=<kn=E<&A^BYGF:\R^%NNIiP+\mCCY4+nCT&?kTRC>
Kpt^D@ JJAAReGjAEBANBl+1KRp@A<TEpXBJWqTaW6bVbXBbqp%DNBHGYQRWPQ9S^aABRaPH!n+BawpD\M<+B55
\Tuh4I !T?MwIB9<EKTwJp!G1m@\+S9<IKR@#TBpJnkiYAA%G<ASWkAABaV@P?e=JeaD^NwYkyt$G$BFnV:>^5A
wcGj$* C\d+%^epXDEEEABTC9L9X@S9B%a\BCBIAiwI=tGCwcKB=\tCA$B1p+DVmeEqaklHAQJRwJmQn/?QV?FN
I8KDIc ta1Di/?9k>lm1SJt&hLRnpNY<h>:pbpAnK@?N:>lbc&4Vq?jpyA:du8R&=keI*cTN4I?&N<TSJ:B8y?B
1+in/! ^XjED@:kXQ=FWA49\CWk<QmZ5EAQZP+DZDaRYSmak@CSBZ^>I?ATyCbNX%WXFBWXappAaC5/td1+iJJI
V^$#t1 &N8dpID/b1bPyudGy5/A@@Z<VX8N@\^15KF?%#pnN+G/mAABACEaLqk6BAAIi5AA\DjkpaLuZ:twAA^F
&V@\NZ CWXDE%6L8@<Lwj@\A<A<@p58kHT@BpDY/RCmhnB*pAH:S?b@5GBEAFplYXAL?Bj<<^Bq!deB<1S6G>nM
lwWb=p aPZd+DtpBe%1lM*qK/GT=N5RISF6kj?uPwD?tbnKGh5:iB1DA@/juu>d?w<Gi9K8<t1k&kQnB!bNZ&qq
KQRcyR SRBc1W!AF^Ba!5ZIC\DJpt<np8WHCK8Ze1uEM<E\EM9@l\NS&4a/!^^H8Ln$tX4@4+aW/D\&ANkGFtHd
q#$WH6 BmcXiG4>@%A!$bj*MQiAmj:Lm6K:@<\L$Q<CTRj<:@bDQkXC$9CCikRAImD\Z*=HB6u5<H@q<j>9@E:F
B5R^Nt e@d@%8@@t\:@%ju@Z:<uAD+yi#1:tN1TmN9dtJk/pWmB?9?:<@>uHyZ^/9:dTmRAI\AJ>AQn=:@#CJR<
c9n4PA \Fpq%*@JSSN!eDA%hDIE?a?EYplSWiVL@+i#pQ/:*DyKdh!@APwm@/@<BPRC\EA:?\T<mtu/Q=e4?@<5
+ME\CX F?M9kLww@$&8FiD/Z*Kl&@:KdY@9tkBSQLXj@aeQhN#@*Y:?kH@bu\KCC\AAE!TZikMAEC+FADTNRDlR
ScZA=u iZXKA4XRwQaE%EIDAM:CIMkA\h%@p\WDAHkiBQ!68kA9QlApk?D!9?HlAGDt<KAYH6RckcANAGcB<X<Y
pAA!4R kc5\A5AN?\C\%N>ANAkA8C%+EBkB+E?V@+5G@6IKAH@6H@A*V^Bb:WA\BEBp=@?*jCRAIphV\F@jIuIm
la$mj! @*5PBhR*A@#@=Qpda?\WAAAdCMDt^e?QiVJ9ZuINI>%/E!EH1F\Cm%W@6+cPV/EcjBPlhAyEp4J#hnG$
Vq*8AT 5VF%auA&NTSlpj%m/@!*96tc@#9Q&9@8CRkW@&@!dBPA!DWPAHA<MSnWWE?:TL@1!>18b+Wy\bP6Z#C/
pbR#5Q R:P^4j@Yy>cHnJnY1h\:=Y&e^aIZtmG8lR#u?HDuPPat+R<&LDXn/yiA\j:q$hSqGSaIH@=^Cjm\iX@e
HQ@KRu clJNR<WZhue\C!ENhGm5u@Th?ytC>w9VaNe=9XiRdZhq#cA<qKi+?$mBlQ&=/*qE4jTjnAJFCac!tBCJ
/ycDc! mymeIwt+qK\amd!RuBkT$4<WlkRD@^54@/RVHWASACG9B6!qB?$TeB@$SRZiphkBaB$AVNRA<Pp1+B&>
Zl8ip! IQAKqlyEDGe8?liDcEECmkJnwu?wwH8wAZC:5C!wTaJ%FkB\e%kt*5yuA\A+$j?TRRcTCSwl=nE+AEAa
$%Ku%p !L<acSC6&d>y\Y/E:aAuppeC9DRkKtwRNbWh<I:CDunqBjnKAD\S8kCiWeP/\dnAP!GR!JGJwm@@<!dR
c^Abtu MRDQV19&+p!F!WVJ\4BtaL?AIl9MnGA>DDR/BwBBm\HRTcAPJhh/jw5$@:aiAK&EI*RPAQ8j@Ah^IDw+
K<9YC1 B8m>iFMjaRqJmi*+k!yVQBKblGG5bc#qXcH@JmHIAABaBK%H>Se4HYaF@yeC>E/DJCD>N#wAWA6EYTE5
:eYb\D Lmu8kLlhSTKVPQ^9T6C4NAq<A>Gn@k>/GwN@%9+V:+C<W&XK<J@XRZRw@+MP*EAF6D:F@<u/cQ?h:tQX
h1ycaB kP:@huYM@$FhRR?/WMy8<d+JM\D*JP&Ai@@iP%SGACMDeB>W9FWWLkGIj&hSRSR%%ABae?l@>w:nQ=Rc
=DVFdd AcBI&c?yAmCc@A6D<B?M>u>lnQ?FAZeA@PhwpD\C+ID&G=bKh8pCkGkAm@1ZC:WY6Zue/E=&C?jjhMC:
-AcjEw 0008c56a516001202b4 Page 476 of binaries2.zip
+1lq^$ 9*VC^a!<Ik1ma1BDC/KEtF1jSAW^RXqI%5NMn$R&V^wENCR1JNRATQCA9\eAu!D\AdaKAAC?P=lM&\Ej
MR%MN! uAA5ABK\u$SWp5KjGSFIXCR6AMkkT?@p&>+lRXw!AB>AEmn?%TNVIbHJa\ABMel1bQqKRNJ@hAEA9qAD
wR9Qe9 LACRIJ*iJI<keEDbAk6<?/5#Q!1%HjBN+k\I@G5JL!<11REHK5GPbK*EuwIJiPj@m&@#8MuRZ+qM+cBX
@ZHkyq i@:nKiuKn&$#uL>HNSTSjB8%B1*k^:b$kEc<GcVDn@>+>C?NPVIn@ee&mEJeGDVTmQ@Hj!Bhmj@qb=Be
++1l%b aR^lPkCaH:kBASQM41R!\Aq5X5IF\AcGG$ANAHpJBneAB/AmkTkBIDLi>AH#A^k+TaQ&#l\b=B8achBi
AHn<hQ k8JApCu5:<kLDJWNF4BVTaJkLp$NyS!!HIaa>4j/t8B^RIQ\EKC/<haTaA4!=M\F<A$%@J8I\b?LGPWR
F%bHd^ K8mLcANWJklwRRD\::=kl?MA9wu<=YkJMQt#H946:?4E^lEk?=@?!*+GAIa=%6?aI8u+i^cCckwm&V<>
#&wtIM A+^@#+IB5Q+#C+d<H#=mBkAJI\PAAAR+IMAAATwIEEEA8ucllQ\:\6+e\NAbAPS:JewBj:WG?a9ZD$DH
cJM@w* AKD\AHkBRFWJ6L5AHJD*MCn?4kYTKRBklBe8NlBqCJh9R*:y1RK?WRHPTpD?mTaS^EN%AYBRA<D?%n\e
<Kt=u^ WAFeDhpM@e8VELyh:kB&DFynKIAEHERdT!K+1MnXD<IS%MTaNG!>@V$=RZu+d/8BX1AaA\kZk?I$CkT@
4DRbJQ =h5?&Q:tIclc*lpR@hWaiL>uwT\I<mED1GdL#@VP>DILA1&?kjCIhkAW+J*^1kMAqLHHwG\+AWq+?bjX
IyYFR\ mJ8K<j@&C?^@@AKcZj<d:j@hX*<==N8RnED#1D:E+\#A6*XRuZaAP@?Zq^+aGIA9Vpm:%iDlwC5F<Cni
k!t<&X mYR#<J>V=IwM=PZbRNZAYXC$$A5B#$D=m$n6<@hiSmML!q>apGTkeDFIhk>IN5lmJ5A@tZjC?LiF@1j1
eP/Aq9 uIHk/1<&@:GiBPa\AlS>5I!k!?THQImQSHaL<P@<AF/AKC:?/k&!A/Aa:$DeA?ItFAR?k8!p@4e>@<TB
$Z%I+F jB9C*d@6yQnQ*F>iEJ@ZZ#9@<i4n9?QkmaIBiPGA6F$GH9TQlXEPJNNBwQtd9^E*A<y#=Rl/TiDdaeSM
Z6n\Lc FRDuZ#HnBeAD<XPDjPWC<AG+@a$hnH>uHk+whmn?uwWGFmR!wH*BpSSE^htSSMX^\ppTV^LdLRFF$hN$
n4hh\C kNANLAALhX&ECBSBb8k+K!VRl=JLQiDRAJnYAiMlk/>YYJATkAAH5E5L=RCRaT6KW<A*WJbm5BGT!Cd&
4+KSCm +T#nLC9D+C#@c@b@<Ed>6<kCSVnM*+1ADMy6hDMC$K:BA>?E#RWa@6tdN$bE$N+5<lM#\SnwWhq?dNQ>
X$1Q=\ W*hwGAD\ByL$a5C*DqC<t$DTm+N1H<lTMlqR:YRA:hed1LLcAhDqE+VX@$5TAplTDD?^6ISP9DppTB=!
&a5\8V Bwl*BXRQyEQNGl\AwB#j@4hP5!AQe9*%FYkhSPHQ<t&95B\AcSGXiNBbA&EAkLkC!h9?1^uPJn%IJ?A!
k8\$dj R!mwd@CZS9E@NPMpa9RYAHVkPwtaeAuw>BinAy%XmMGki#8!Cim&5Z\NwmpB#X1A+lGCR5aH\ACKe>Ce
^8a8EN AWn&+V?!k$DbmJER#lAA58\\wR1$Imni!KESBREtj*Q9u@9NE+nDTNIDkAZmP9uLlSZ!X+6@<Q@TR^S$
qFE^X$ pl/A5AekK5!@XKBV^A8WmRe%DEDkj<pB*Z$k<ElAYKE@aKm%A<b/%QBy$Yql\5Yk5++B8C:ydAFklCRS
%hwpI= E/AGaIFmZ94jc&D>c\*\dSJ+/ADR4$\\EpGT@/N#/+GK/n4#>\*D#DmbpMtEWEJaiTEECeIMEt86AS#G
i$bFYA Rec*:wRM%JC5J++CM>EkVBE65S\#mWbe6aXNPcu4eT$lYePppdL5%yybV\/^%l1V+$HZip#Ya%N4$1^N
k>iiG5 YNdRqC4P*h>**=5@tt&:ZVn99j98@i=*9@9hi:@9>>*:BuEW=@up6Y+#lCqh+C\SiZJNEVSk&Eb$Jn5#
5G/MZw <PukI6HQpbFlj1Y^6#qdDj>EL#IY5LkthhAD9=K9!A*kmhVyj1AuMT?!N\q:<<Ww9E<:%dc16i<iV/th
!qwb!4 /L@1WdGmM%M$MJP1AX$&%tm&nBE>QePp>NpPW#\6ycRb$wLZyLAP=<E9i8&m!9%$9%yC*wtj^@w<c>@6
%Y164i nZ:qqGwZS<NwLietTR8Vppy:d=J$/lbJ4/hKK4Wyhn/>#9pZ!V5l=D%L<9+lSJL+M>TY<69+YhK8?uc/
TS99M$ u!V:Tw/R?i1685*5VE4MQ4qJ+18*TH\6XYJ&=Q<11!NVcJWpJV65lubjX@tj:kjH@HmdYtt!9S9c4Kj&
QXl*Xc q4?FPcZlQ?h?yQjk?5WE9/L$BNnM@n<%8/?*Jtc*H4*WpYZIuW:m^DREYQD4nyW@h^9#nF@&=NjHK8A=
QAV!HF qp?\MS/*eVti*$kt5miRP+i$iGhuFXN1wWhZbRQjX>4KhQ^R>cjMAB8?B#HG>yBl$E<W\p=%\yLq!5Q<
B#4#$^ WKL&A1%&NpyZaC*y?WKk4*G@wqE1AmiJTGjJBF?Wj%:>S&=t$Ib:h6ACP=9J%?Ci#RMm$twVWmlwQThp
Tmd@A= H9R9@/W%4EwjP$8a4XBDHq9kT+w#aVHd=QTQhmkQthm/=wd?iuA8#p#p?Bcpd&bhVEXi5W6A*JuN=dI>
d%m>nb h8tnHcWdVC^&$dhEGa=hDPn4c@\jKQda^ZWYyTck<&*#%RCbuWD/tG?dj!\pnY\LGLwqqZ8W8GCXWC8F
#wiQC# cMZZ4&\NbACN=RaBImtip<LK%uYMZXEqWYqCnXmF?^^y$N$A4u*\Blui1GpucbC<d+BJHw*Hwp4C$C5W
tIb=VE R:BeyJn\SVuR!MyTV&!tpqCDwZwmhmW$T^$h%IWi8be*?uMEdTNwD$DnK\ZYPiB#i5aG:Gl%G4Q5A%#u
D&5^Fe eF*F?!XeK+D*Q>cp!A:aFWPkGQMuH>j5QEI?FnG#dmN=WY6/5bld5a+1B94b*ik6&%ucDbT&G=/Nilem
G4XGGY H/j&#9lGwuj4SE?KlZRqpG+VyC5V$t%TySPY8DNw&L#\k/%?@iauQ6k1jG<G5JHpTQhGDbjIa\bI4u!$
XTSu?V WE\6WVut%t^9u=AtA@PW^j^q^mSK=u9l%W%XpQpj*kM@I*EnqGZwD%XlQAdlqa*kNIn4LY<$@YyFu4IW
#@R^S: K>iAMX\IVHuAR%eZ1%DLQ<@F/n<\$uc#SbE!RquEC>4=GHSD^G?^EY$MX#DLMP&W<CGlA:NqtQc^?B5J
9beIYE Y*RYjtVp=hqFH6tC?RX@\k=nHEj+ID#k^+nH5l!YBDh@BXPY1nPF9SmZDY&P$E1<?4\t&d?161iC?K@D
@5DSAn jMwI&wEM4kDh6QG>ty&bwV8DQd5?wjHMDqSBn?bFX4@BNe#*dtc+:+>dFM\Cmk9*p/!Zh<C&YldD&9C>
&IkERV m#E1M?51^D!RLWE>EE<i:M$94S<tEKmK1AnyYbK&C85YZNHZ<>A5>Y?KiyDSwMqmRj?P\db?nyLQRZGd
yy@R=q mEqX/<ylZV>ZhX?lcuA9%dX?Ejh4<BE&S\pRMZH$Eei/*pCuRMJAZZj16b\%!Rl+hJlQ6GhR/S%FXI4+
Ima&XD $R%4iyenW&9*?aViT?J?TjP^*%Pji<NAAAeWJ4R?:VewL:R^ZpmcmPM+56dGlb6bwS4@\$LZjG:mjqQ$
W!5?c> *tb>#q#Pj@^8<^V5tiR98btC$Knji8VikLuw=:+iw9L4Gujn?iuFHy<lctkil$hI6PE\dtG?H1BkIHXa
cI/^IE PqQL%hSN/=CiIpFC/RQ&JPIX/NJc5H\Lt%*M$n/?R#d/SLVZLY?T@88H^Yu%L=BEHe^tP:P4TDIXA^iq
i4b!$P BW5Y&*pMh5HknXKIPLcXIyck^YweT<<c8\A5/>i::9X6Q:!4?b\@G*NFWLJQSGpQ$cLpE@JVYQ<&u^N^
e8ZNX< w&yV#m?j!J*tF%Kp!%b*VK^Yu^Q^&p^H*6Emy185=4E85n9d6:A1&nt#bJX%5YBuL8dH9nVb?BHFSFdb
>Th=JE YY#>:PAY/dMj\Z4*BG^!8wnWM+8e&X99eVQJ:\bjjVjLVj8Xh:h#E%6kKEpLYZ<%9H64uLLRKS59:RC*
/HXY9! ZWXP&hK*/*Ja=&ST$FS+*K<9QF=+@M%*%$#:*Ihl:Xwa*^T*PjpPy5>9b/d=Dtld?unH9+@yJGb$T*YT
p@L/GK >b=SZa9lSh&qI8@Gj5q&#/?Y&i:^XI9uuS<N8X$GF=M9S<LQ^jh*<lcKcEHXVhZt9JQR?8#lY&QW&EL:
mABF5Y <E*^/R#!nt/Sj98n?y+T4HZEc5P/:TJY?&=I9lA8%QaV*/hadVe5lE^^a/AB?l#6ptWDcj\@^$&5EN4y
m&kWXi T<>Q?#B!ltLY*IL14C6M&tPL=^:68Vp@1t@V9@q8<+ip%R:=SYhb>aWhiH@D@&TZVHu1KNNMmF*<a:^y
HBEP=k d9!F@AjntMn%Y8Tcb#$@QNR&FI9aItYS>%#jn*^:1G/kTin#qQ#IQQTMbR>IqW:a9mjqXR&>*9FH*@d4
wCXcEi /6=Y!??nelqWXybNc?Y?S%tB/!qYk1nJ4pkB@aDP4^6IR&&d&FMbapZiJ@NZpe#i$+pYLGnlV6BpkMaE
h5jclP tq!mYhq:C$X&CwZ>T^RbLF9RqRmJ:AN8WF8J1k=Wen9V!\=tekWnE@K18pi<+:T/H*@EWXHj+L5jH6Ee
IyP%RD GTD=ZHjKieF<^EF%bhuq$H\\c>T=^lbm>hXBk#Z:>Jn@C%yXbA6p+k58@HYHMSH998GNet>XZtCy<N5u
hb=jbp !D8W%9G#<N<bjL!!t$u<A6I&jlG?jGSAX<WC6E>yB8a:4@IRj658?BSS%B!*SQ^=ttGXhWCdV^HcZLpn
H18*In nnWHb<XZ9wNt1AW#%PR*E:WQ%5^qjSQ9c!dnl&6<8+bqdjASt!H^h4S$VEm:V/CMR$LYQjCWk+K:SeP1
$N=TQt lGT49p!Hi^a@lZ5PQ\MEc8anyR*<AFJ/@uyqK/mHBbjd1^nlm#ktFZ8iAqGL9dEMj!6=HuPAdKnam<^%
4><$&/ GCnHiF^6QXAu!yhTiYM9:St$mn$D4A&d&C$Rea9aK:CI%a<Xj5NQ!IjtGc\acE:*:^8tXY+4X:c*>Rqy
yVQl!% ^lKcM<J#e1wJ4=&VX<HT\DtL8IPn%S6NG/b>J4K>m?%^&<IZcTlNF41bViNH@GhPCu#GS+DqG/C*Kune
=<WmHu qHHeVn+N!MyC@abX5T*:LVMWLC>X?J:KY8l&KV<EYRcE%p!LtFID:8u?L8YH#N8WD<=#&a4F#DZHaZaa
/V4Yl+ +CQtMt>etpYEKLKA9SZR?ywKBP%nm%pi#ck+6W?n6mTwe=G:CNeC#>P5mu\Pwcad=>Z!59Tpy?VVbF9J
ku=\Ay 4=F@LcAbSQ8ANEy:aA<6tCP=>4uMYnKZYVc#SZNbihi#J?c!8!8jbk9=6D<HbTcW/WXbtTnLSNpCwP5K
DnZdHQ PpN!tBeZW@!t:>QmN:MYyR=A4>Qi/K#6D<CGKP/G*pC&GA$D$XQ:N$a&CS#4Z&y^5%qBA?/GkA$#!E!q
tR@K49 Z\\9wFKL9\n==pDY+uTWGNY!@=+RbVc@ShuidqlReVDt%&%C/!J!LJTN+<QwwamdnV4:V1DJCt&QmMwN
Lu>AuS FN5ct+Z*Qc@FYke$HXpK:TLiMtEh!jKTSXb=TSF<5J!&Mq#k*NLkIQSeVu#%@ZH<y8Fut4<!%1cQKL#S
=umXIB **\I4LRNCFY?KS4@&B9>bGXqVi^I1V6&4qTJHZdba&PIdR+Mtwmj!w8NRd+Pbbk9cK4A/Ga=K8nIF#*Z
nFYEnh E\bqH&k6&#V1F^&*PT!8PY1:MY5C9!$Eq^J\1Y4!^LqITT:>>q$PC<$^6h/N<%1>*GAPwWPD8:IG5>wN
-AEM$I 000a0837fc7001202b4 Page 477 of binaries2.zip
&cT?H* i/HE:XXnL!VWw<*bYL5KLm@1?8Ie4/?5aECl8!pG#=&PdW>?QpD/LD4m^6?D*ZSuile\K/=bLqki%^9\
9T!AI4 $Ap4=#DCAtc=/4=55j/K:P@LRPwW9WT^Fq/qE+HG*1BbTGi8au/VTLE1Sn#KkPqVETH5b:b/55k!VTZM
hJCy^M \QVBjGk85Z>\+^41qVD*?B85+9SBjpVM9Z!54LqM6@k8da>lY6B+RiQVcBCFBc#kq\=?J6Ie8>VaK&K!
W68XW! FJ8yY8:p:1w*P9&l8pM1@EaJ<b/i%C^mXP<F^1H>cVNK>JVDujSll6^AP!YiXpE>kDat4GG8jYSB*1!T
Zu>1>5 >lPm\p<hRd\=SqyR$cSHyAj5+4S1YP#Rn:1C=G5E^#b?CB^yNIe>/>qPdXbE+?Xad\jID>kSe<Y>Y6IL
eJ!mad @cH1n*1+/y5>HNF>9a=qQRk/X4b!^+Mi/KTX=e4LKdJQjpbCb*$aJVM5LI$NI89d%^YFqZ:64G9&HMIM
!:46qk ynpNVB?T^u@I>IZl4^F!!HI>#c^mQ=u>CW=!C1h<qXNlj+mQ>+PVca/V/XXiZ+QQ9=pdaXS%N$uPHHtD
t>u?Gy /b5aC&NET+V?MKK@#!C@JZ^KY!Ij>8?L5+u<FjBu$**\b9CHW$waM4#9h>p^?t<N<!q+^qw?qck=ldEu
J4<&b^ K?lN%M+8\pwSpwL/RWk1N@n/cZ!V@quMemGn*/=K8eaey@KLKJE9dP\q@>hKHPp$#RK$adH&%CPGWHC%
<8h&FA u1A?J@#>XPLepNaJ/85&&%pJJC+&:P%SZwAiDdRD^M+YyS@c%1\4Tm65bbcjuA$YX*@?FJj%YCj/j^=4
6K?Y8^ #qX/&5&!MS>q6N>J@bAd1mi:PGcAZ6Ntl6a:*Kq9!qbwl@p*J@Zlnj=8b$Yi5D@N1Z4@*W6c4lj+j+1\
w/uKXw k4Jh%K&CV=+?QM!uwXp*u+aquBd=leuSkcjwy>*>1W<$HtacwhPRS+#<>C$4GKkHpd>FccWhiAYTCu+i
>u!DQd 9F8S+9+1PdMQ8Twccm<GlT%wFc5ca!t*$4qIZY>ThuYEy$JXihV*XJ\q^qGelBD9IQE8W?8S9WKh\iT5
:<$PWT KG\wAG4:<d56F46=@!=jD+*yD@4E:8tZWB8\m!ZB5VF?#5Q:W4Cmm%Cc/NhC&WB#>ZR@=c!Q#*4=Ra!m
k/SXEj YHq+K>JYkLBmmHYtTkn:JlFcen/T=kVZM6Jd$Kd&jhbk%WKhVB+A9wY$cqZ=icPjX%Vq\Vbp*cwXq6BK
X8tb<< IC9i<&dmt!Gd?*d=\u/DPkdwjZ#h#tljt/lnyJ+XF#F>Z=<9LCKd5Hy&:m4qJ*C>k?5p4uhhB@t^^N=#
JTB:bI aq>uN9AB6Gn#G*/bPV9#@iM@ic@=C/5^>b!iXk!hZ!$AbhpTl<qSCn+H&b1FVHql9bQ+LJ61=F8a9/VC
Q^SmGN iMH6Pj/hu*1Y%u:GV=\:V6S=h#tEujTEIFYWQ=>Fb^eb96yD6Y*n@\GJWp@E%bkn:4@+6yV<6JV<%um?
N<S4Gn yR$&#SR\XZ@G>5wt9\*9P8%>EP?J4#L+yFLKL\Zpi!u88RSLQluTDjRy#pCGye*I?NVKMVi:%<q@dT*q
P\PcX$ 9+:4GP&eWFmAVqyNJH<b@EdjW<^YZ51XF>j#yT</QY>9uaEuqiA=/mL*c9XmRC/9PT4e!^?yZX\lVR*q
MjijJ# KV<Iq4qiw:V4NW<Z==H8wqXae:qmu8/^:+:eLW:Da=G@X*B99?1\SLdGQej%wnnTBe1%$I+=&kLtnPX/
jnaTXY w%j*lLL6acV%TP<P/Tl>@TnT+hBtpT=C8lNILHi8l=>cMlHV#%*G#:m?n#m#=yE/X=ApY@E#h@1!mi6H
@/GbLi =jZ<qNm64KD9#IC6DCyGkA?wi6nJa@Dkahwn%4EdS?G%Rc%/&S6wd@K+bXk6wVPXJqPCLylKy<w&/W9Y
PbLlqi n8@pVy/5>F&91y/+Qqn18d+I#/JBa=u>8qjuDIjyuHTL6Fu!A=6hd/S>6i5BYLiD#FZECp6aLuJw4=C$
Id+JKQ wmMKqD!lqy<LH>:cuAp<bR%aH8:tF/pQcWj<85&Tpl=pdD?X+QtTak^c=5$\Tbeb$6$*q4au%E#:XLlm
YXjEqe RlhA^:FSd#S>$n=MP:C^We</blDnNW4!S/+whn+K^Iawt^?P>ct>mP%&Dehie4ZF?1H>#THnwF@XaX4F
1t*5k5 @PHa*kjca1<#HidkpTXZtEFEcEjWHZR@:E*c5ekWwjuJQXVH+8Tu+bFM/ME+n@p6q9Z<F#\Y$L9YE#@h
&=AAW8 y>w=b!p@Fhe1S1^QdW%*/tEjj<@%je\<Fy>=e%j^e@cD@N#RB6R=B+TaVY?S8?p6pm@8#+u:@bbYYqtI
aEEwF! eNdBMypD#Zd/19WqiJjhlW:L>&lQQFCuIIb/Y8tYVHMF>nTEFq+M?:NDV%\ML$QQq9^Y>C=VaDW/T#iT
/w@BNe uN:wNbh>J%B1KV?n99>8AetL8bPyGAK#Td?Pa5\>Y\4FqEblW>D9kA9c:!ehjhGqPBGSq=i8A$w:Jp/9
m8mIDD SwP\D#NY4F8V4m*G?SG@Sb!&9CZ8mE6+Q=%JicQTCDVWtD!Q8#HynZ/&BZY4MG=h8Dye\Wl@=cwaXlA9
?lH5WQ \=m&aT^Zlp#^5bSCqY&^QnwQmd%E=!G^!<Cu^TG4@Q/nJ@lM&j9I&Z>#D8dEZk6pnL*cqEtnHu5XNC?Q
FA&C:P n&Fq:k*yB?!YajyYM:a*tIqWjW$%WtbKWX:A<Dnw@VL1=<XiDin4<idDyjKS9cjH:8^t@^S:XeY=5j&+
4*RX$J L6Q=IXdiJL%Dl<5XJ&p\\Nk\cTyGy^C911edMT9Ti$T/LycJ>G:$PdVpM*+=yFiq6:/9>nC&@/aiZwbq
IVLc?R 8bnE#SMG/PR!^Vm^n@plP6@TeHMIV*WQ=#dTulm%R6EGuaHSCkmyK+Bm9wV$P4E#F&WGLcKN$aqyXTu1
?88:Q< %&Lq>ue#SJ4ebijMWu9\D+m%c@u:kR#a?R6BjdjpL?:Y?R6SAwVWuidQSip+Wu4+mFy?Acq$9\tym\Fh
hD!BNF 6\E^wG&^khaJ?kEjyhQX>jw6bdWPp@4?1ZiwnqKRm<i9!C:+>RwJFm!Cu4PM!FSDd<1*P!Q1#Q*>PNdZ
>bDX=> Ge#W:/4Q*+@BB=@ChWdB81NIV/!&4ek=X:ti9<iQI^w<Kudp:kLFSXF?ESL5dP#XPEehS4T=$b+uG@5P
w<IK+9 <t5htcQlhwFaJh9eYu/N?A%6eM&BhhJS^BMJKZqBSEu<GJCSKCPMNQSNX=DiCMqF6t&SL1/!%DIJ!FeC
#S9#KK <n*ytkN4e5=S^DaQZXL!A4t1hcA<?An4$C8yhmLX!qPQ4^^P>R@$jhiXE%5apP1yl6/tdLS*C9PqGe?V
%XAyuW bKYF4aayll$9=S?M>ATXl&9=B<Sbp@<cTa94c8R:hB>/tY1ZWe\B@F#tBBa^J9tMI\?Yi%yRDwbaMqKY
A/@WH> +eNjum&dE8>$myIw>WbnR\wDkt\CatlPSQpW!+y>Nw1!41^W9=ZW8il:Nq\h>KY^1<85@CN/#idnKuAF
I#EL>8 Qe@R>!tih1d*QAbJyj^F5LI@6nJ=QY9%>pYt<H+!1Kee:<dHi^$XV>V+HwGhGTl+nN:e%R*X>Ca@J6jq
%&:+R\ h<$!Fjn<GiZuA?d!HL@Phe?n:@Cbj*5uMBF=JjKKwQdXLFiyB^/R/!+=C&:*G<1#j\HiYJ@VpXi<G?XX
S48<wj =hu#5$ecH*8HZ%Ne\bl*Wy:S<9cp=F*V<q^6=4:1>ab^b@Wp$=Xb1R!cemBi4&d/jAj<:C4$/#eX4IAX
taTE^G Tl:Z5b<Y5YLJW*Qmb&jhHyjLNjd&?QNaASZ=iYn=T:Zt$e<q>1F<>=<w:=cqQ$NS<tjKLWpPTulh49Le
=G\GlS Pw5::H+PJVL8G>%lyLJE#pcWtWYJAdpd:iLLw6F\p!Ej5>G:ecSunTZ<65hb#q^Pn>P:edSuVa=hyCuZ
Fe$eS= W%9FQLZjjd9M/Kp6N*w*ppa8:dn$h/CcD4<>%qPihuVMu8cyQVZt1V*V$&J/<jp%it1#*8t@VLPI:eE%
Fk>>yB ^DBB<N!BT%d*VTKV:ID&nG4QW>4#m91WbP*y%J=46Pj#/qNZwV**$R4C5%N>Ck!Nb$+SaiuIbMGM?yVD
h$AqhY &uPQ?1VbdR&Lu?KJu?P^86j1HnR9@1m<nPuF:#V\>@y6*>#@88=bi?V!eBGe!LQAIPqMb/B9<+>FtdF?
qT8:ac hi9cq4bPJyY#&>%8Ghu&N?$hG#1cEn<8KGhja$?!N/Y^?Bj:>IX6nu96l1jh:S9Z6Lb$9C:Z6:RG=J18
PBel1u $P1&=yaPXpa4dyN^!XN4t%aH&@@jQ/K\cE?>%t=c<1e:&11P@^q814hWD=YAjL=>*5P+=CZ6wYe/%kcj
RQPAY: /yVujj*4<$y^t!@ZQ:N?hX6uT^MKP$J&8d1%XjaS!Rdb%:KlyYNVT:M>SaL+Z#e#*9i6n9c&wB^c9YHD
Qm8T?V 6>w:t8Z&Dnt\64XFZ46Bdq/>juY\yjtPY>:9ck?%hK#8ZN9iJnjS#*ScY=EucFc*h4T5du=Gd8qc8/F#
jW/Y$> k:pbGyXdPn4cP&cJbGBnc/6bXc4e$L+I:beqNCJ?aWSj%MX@EbQ!&!SBwbWuj@IEqWn$G%\blZ&M#jI\
^L:we* bm6kdM=X^y\TFah^h+KQDP:YYXZhu45iCnR@<FDA6?!l\DJ/$n9qW#uSEV*XE@YJD@En95Tj&1H&1N*+
lbu$SQ n*w\k%ncl+DytLh*VDPYN+N=HtQ5YW:>CW8AjGtej&npjQIP#1j#PJ>b#Hu5YZTEu9SP?XSPhESQ>WS>
T^l=iE +pQ<mC@^y*cw9WV:LNhhZ%NP!qm&^H8@K6JTZ<*T8HA5k>YlQ$ipMWq!8<WWN6L91hVKC#SNQ!yX5ldy
66XM8V Gd*8pd@YbtEhY!b6&yFX*caPuh#i%LT^w/PqibH<bJqh&A6%dIJTH98&>Lni5ESMA1%&Pe8Y!nWS:&M&
\1u?l% >4jTml*jmQ#bGh88V1nd@:h=i@5*:QX&8Y=%J%c%jQ>ZT?b>>c5q<^jP@^8$5JN<FtQp^^knn<Ra@b/B
4&5\Ab /eR>Vh\qeYj%!=/w+d#y/dZNLE#S5eVe!&5dJdcyyYMDp>a&hc/SGJ&AT1^byFZqC6YGZX:*elc8Z8=4
wh$Ya^ pCTl+4B:YeN!1JZ8#Lh<R/j$yh>Iybtt^^:IytGTVnKdKmjd1$4KD1m!5qFXV9aYTWi@RBQ!MZcNJARZ
n<NTN1 A<tIy$%I!cVbJCii^TRyuk8c%ZiZK1*pXciC>ITRGJCKbMc#R=$a$lcTtEuTVyIb:+M$V+5T=wB#E@pC
5I%J*^ La%<6WnH?WLGT6V%!DpM>W4XcHKi!$y&JPu6y>RW4XQH85SEbI+8%ecK@QiT/VJhuA@T*Tu=^?NytbYh
C#*FDQ T?dQY^F9C?thKu?S:p&t!:<u/AZQ<u>J!j>bT9=+p8hD=yR$@R1R#c44cF@Z$6Vb*lHZ!@<AWE5DBBRA
<L\5Yb AkAIAJ6XdTXAVV<e\S5AAAC5AABCAAAAa&^ybY=$e!>\b*A9dYFnL&q8e*SldG\9TY=#hGF5dEFpdYq8
@wZwEB IFJqe&>%etNqL$q8e*SldG^BbG%ydm=\etw8atq8:F$LiB9Xqd+#ptZH#5N&AkpJwWwCJBC\R+mDMa@E
p=QSA^ pi*E\a=X&+qDwE%pciIwpTY6JAiHb/C9qNKY5m&WFub=qWhyTcAqRGtZAKYEL6CWLa>&h>t\6F&?n!*N
qFPILW 58^Z?8*Zb5<@>$kinYbGMlcRnZW@#<\@e+@8*Lu*uHQ@e&e<I/4dw<qWIBJyDk&Gw*Z^^Fa^86Vb/W@+
%$8LE# ?6ydFeP^?:hk9Z5+MijBZ%@=65$Q4:=/X$mIaC\YwS&ZEMwCIi/m=V6?IV\#/Fm#ww+W/w8F6L=AIlGP
C6dPML Jd#?SG!4Fp!JebkWphAGcH5mLTwjc$Z:lTPSF61GcZG4Da>/cj5qY54KX&yw1P@S+pq%^wbw?#\6=ctY
wIZP6@ eIC&@$XLSWnHTnZlCRTyQ=SFlC5J^kn*EK//SMy5J#!Sn*?N<KVl%KS&\k<Su4^hm>K=qJeIV>EmYyD\

-AYIk> 000a284379e001202b4 Page 478 of binaries2.zip
GFX#P5 j^P8JuG15#1FeA*nB5K%<q#1laTu61i$ReJZEJ/Ym5YdCh>K?Bm6PcISjw4\5dFwM?VjID\>JI@@ljCM
Z\Xa^& mJck<:ytE#=8PFXJ:iE/u@DMWMXKpuF6JD^LT:XRQX*ZED/?X^8G@B&Eb/i1P8qcZE<TQtFkek9pWj+u
FynwGF llJBaNVjP=RaIP\?l9Ae81chlJeRul5NccVB:uYE=+YVcGa*&8hE6iHhQaT@Rjkp&WZ8H>D1bMc9$Gw?
4#F8nL a=T@RPK!Gq1hk9MSZp#dW#eGA$uCcQ?Fc5Pd%Chq5JZVlPh*?\mnj$?Z?qB&H?E/Lte@4i1qQyV>P?FF
B*:X?% Wl<<H5JuTH*\+J!LyV=+XlM?W?1DB+c:SP1DB?W*!D:!*E6+1i^*D@4mLKpQuwPEG@u+aeJuT*$wQ+F\
Bb5mV+ p>TH<tYE#=H/WQ+y\8hKHTm@qQB=nL>J?H^=49IjEX+t>cH<%+TZT*$w@%@+BNu?FdMI4=D/WNEE>!D%
b&%RHD wYI>+ScyD^YZ\VcpQqTk@DcyD^X:Cc?W?qD^K8FXWl<1*mjeL9XlA9ym6hTHCdCFC/R?VFlD8EQ1\+SB
e9FLY5 iD>c4mj<Bhwmn>y+\9&$:hJ6XW^+kdb?&BLlQ>L&p>LZXW/mdVh5lnDKS^@VPT6SZm>5kDD5jC%$ujDu
48j>ip cL6P&u#qZdV6k^+Vjy1&/!9%Q1*<LYG!JVjbeSX<\+ck6=i8yiwVlC?KyPAc15/n%eWDk%1WMP#mW/In
eR@B6m *E@+T5KjZ6y+AYS8w>ZGSM1:qDDythkWm*yZEj+*\kHb@qY\8*=@IEq>PlG?J1lhm88emQJD>NNG\leS
w^XdCu %6R=8><mjDul#aRQEabhD#BGZ&^l@DL<q#yuD%\M:GI4+hjI^hRT*pca>H4TcaRnnNG8k+\VlKPM9$++
8<SF9* ^ll?Ke+a=j<N+*eJJ!TiQJF\p9GylFQ!9JNJQ<RRa>nFh5LWDyP@TQkThitXeeL*EB+YH8%jCQ?W<I+k
9*@p!< DcYEaZiZ4nnwI@8a+mb<&c1D:eD#CF??=tAZMQ#&Fd$H%\KVQwp4N^!<CQm#lK@chDAADB?%e@QBAiBu
5hEp:\ MGnK>y?C<1?S@kh8Y*^G?y>1<p@m5:&BBPqP>R4Cu\8t9PRH16EZu?@SWmSWDd9:k4eHPqMN8>mq>RR&
lI%>mi E*/E<Biq@/u?JY&9qj/u?u<\qpn@W$P/KK/V@1jtdMJjq9/uB94+Fiq@cqD?X/Z@1dpJ>mH>V<&DlL<t
9yIduH @W@NL\njIQ%Q#V8E@%d/u%4a^hiq@/tFQ@8G>At%HaS9qH/tFwy<p@R@6dC:d@L^d^P?Yj1jYw^**=L?
$$i8KL y^a/@G*yj&w^N6$mjW:6t+S9bR^>?#6=41pXlQ>i?y?y8N:dyQ?bCy>>8:#G1jA=h#CG#h:JGQ:uL5cw
kHQRkI =*ea:/DX*a!9yhW>nG?p%d&MWij:GKQP*&Z<K#A1^4@q5S#+#:V/95VVWPeHGE<D>&IMu4CHMedeB^t*
EV#^YL $iwl^66w>RQGZ/dXD^pn@&HG5J&>nQ>E1$epQka<:XHGGHMja@^yY9&I<XY$iy\^&8uHnJ?q%W<aw!@?
&cJyXD RiJn!&n%BGPMtj5ap?&JJ^uDZy=mjB&6utcM/@5ya+!###BGuZ<t<ZV\lGeb\%@6b:!BX5<^^6n^e<d\
b\t\Kn X@@I?AutV<C\pSea@+=YL#JG9@^C+luq6D4AiCc6j5paj8aq^n=c@SNnnAt@PpK=J?yFjtlG9#:$aH@9
ET56^9 Q\?c@#I<XjJVF$kPTIpeG$Y=??F*L$+9c5QQ>/pNL!>uLuSIdZk>/+VI#%ey?9$tlq/%+XYMChB6P8at
M@d>YA t+BbaF?>N9CqiXTbc/DHb^&:n/1uKI4Au?DciSXb:WpCWRj9mM4841=i+@qeK:9Z?lt:!*6m+AXJCLi%
WSyc>G h!AG1nVpX:4<dZBeL5/d!N51*p+!!K1VPkNBL\*GmWAmLE5$=Jc=qnb8M=#F>jL^l\Lch9J8M*<eC<ZI
ClCj@q 5<u%Vkk@yiewcQ84\Mq!%==MZKWwlk+V=YkTSV>GK:em&$nKKMyIMJdWi%eSM&!:bcI5pHl>huTydR+Q
heW/%u t!Mce/J/V%ph&B:\SRLJyJc5&^yItEW&6Q8>uZ$d@PpT/M?Nb8HCdwFul$iHJ<eIkSEAuy\>PD#*VY!>
GGXhTi *&LL9bP6@C:&&ui#yh@DH9w?>5n*5\j?Qu9e*i^ld&c4Q<BY@lJdNWblYHkLS&4uT^c4c?qK5E?\aLBe
LW6+1e 5E?\V4BN5E^tq&8aVj1bQZa#Y?^qhklY8I\b+Z4JAMWGnlBQ+1ln9l#X^V!PNlBq\APBGe=FhKFHFakt
e&1&TD bBSSn/kB$RKmBERHmAwRDTAKkAYB>e6wTIAFaDR<B<\iLAbKJ1R1Zk$YBJaD6kKYAuaCqkRYBHaCXkI&
MZHMMS AldC:PNcnq!9$>tFbBXjqT^dIPK<AY\KnAFMAR\B#MDwaaR$i+W>#\VJ9pZXmHaJML=Jpu$LSKZXpu$L
jRX\$6 MM&ypu$LSH9HT9c6/@q^:NHk^YhJ>m%tT$<DXm#/\aLB45Gi\aLBj5F/\d:B45F/\Za=T5e<C$\cES$m
XMB\^Y mTlaK>k1YC4aKh6bTtjy^EVBRME<heayS?NHiQS>nEj#l*uWjb^H&Rh=NQ<Jn/=Q<Gn/JI?iV@Nw?R!Q
Y6l#X6 n5@!cQken*=kBTiMhylaEWmGEZuEI9&^aY@uECKQ6uAmtTLKmeknJbwChdGlFCIQd@6kQIbRk!KQVu?j
N*1l=R eZeFia$aIk<6ElihjX=j9Y@lRmua=$ZpEanwi>&IQF4d5u>14AE<b^Q9ENbQVSLBeEdC:@ibjwMnl8yl
knQ>dP N%MF*8E1aI?Y=8TkYP@4ct5#@5SRLi!tK$Fa4$RQeiRh8M^pZhC+p$ktk1I>t6ITt\NBDjFbb!C%Sh@&
GDRan9 hHm:l/Ky<KCGR6KHjHXbi\5Zn8\Hkq$>hbGSI1l=9G&BBW9C>a&lW?yMbXKtwe!M/EcnKE4Q#eq89ddt
ctjcKn Z6HW1XGW:P&m/$^jN^*Y4>9WF/bYMXe$/?\>:X%4%>eb/!tQyK@Z$M@G=nbYRVVya^GQT%yCNnh?pDXW
AI</eR BWuy>C5IS%M^Y4E$Y4SdT<ylu:yNd&AwHR*h$Y&W:^6KytKD*k8$HbjEE1GpcA/TaJK$JdWqKSCacdCD
CWG1Pt XCweHWmTYWR$d&ekH6j*Xk!FI!F9/*A1RYFZm>a@NDCkJd#!N\Ku\B#wTk4hkX9CTa!Pk@&wqPH<kPu=
4mZh%n Wct996lkQA\y8h5ZTEV%$@ucPtE5dd%?1q%Wm+n&dt>ZuQRkjCpJ5*yuj5#:tX?V&a%pWm9kWyJw6jlA
FN?8PI 9FMd4A8KWm1qWl1Z/ZVtl$b81DLHuM9<5+y==##tw6Pab=a^Q/6pjmta1!%qjupie?nF#EMdtP56a?+/
#>/D9G udt$m@qhC@Qa+=uV#tDihnL#ZDh#+%uMl&e!=#tPijMC=yXVtF6YM*>j\h^!K9Q/G8chQkN*ZGLk+dWj
MmMh=/ aj8:8Q&\4bC*+GLd#EL8py/P?<R^e!WtJVBBwe>@+L:FCH9:RGpbyYc@9$PjZ*C*hK^eH>\YDwGZ>QWR
I^Ry<6 Hb55qK#Jl:!X%NhK=w=uY5pX^YL?wQBC/:J?:6d^/VCZ\+hj:!ky^*m%CX&4$81tbm6hRZ1%iBT@KWSd
PAYW=9 S/c&*AX16?PMKXqPbdG<B=a!Ge:dy?Yb+ech&c=X4qet1JhbZmYZ45:be=CJRdw>RS=e/y#dD#CJeBNi
=4cRT^ ^GTDmMPyKb=W<:A<J5uK%Vq*XQMpVaZ\@MinQNE!\VCbtY+QVFJXpd!jJ=etC5?d?*qTeBLL:GXmIZm!
RJ&mGV bA4Ja:L4Xb$eiQ/IP8M&Ve%Xl#&a#MG6^61*=aZ@YSIG%%jw<uDPcjJcqPPaNPC!V&H!AA#TM>*%#9=#
R%1De5 MjWL<pLuP5CQbB\uJ\?Xm*VTW1dLS=uIAF@PyAj+Py*$iGbVV!k*M5ElR1Q5%ptQWpQpSeGEpHe8JeK@
/lKwY= GZuWRZqQd@eVaBY1l\pd81TG!R$SJHYPVuKWT<KE$S<u9/**kdy5=FEHhd&W9b9!%c$nn#1w1Piyna5c
<mkDb/ /X4XZVwy*Q5in1Q>V#6<?E>$niy6VCyJD>THtinSFc8a?K4H4RVC#<qHHZDLRH%hpn:*IeJ@aLKIu@?X
=&>/9% TTdWcDIVNPBbVCTBF#LbBD=dJ=q:*%8PTZ#wGhYHCKS4HbNdIuc8jmc=%G/8JJNh8ndZqW^amh!/4tZm
b1mwRN T6jk8ypJLLYD/%+t4qRu%&/&FD1*/#EttcnD#=l5A4@CBBQ+>$^8BV?t$54+ME<8q>IHVYYKKIKj@Z?j
#Gd@/V !9uG#^mK&Lk^tR4w1$V1a?6Kq?ETFPj^4EDBhAPJ*Qt@Wm1qebVpdiq^HWE4VTW%KKWJRy%1hYNyFKpq
ninJwI NnR\&6<+yicY#nXVh?pD&VTLiP9DTP+QNlqVTuqJXPJn@ZeHjT/pep*Zt8dP%44Y>c%nmQM9!%Gbw*hK
E^V:VA w/Kp9Nc5QH<Lb&cR=TVEV6ut/@h>?K1PM?jXp1Nac!&i*&p!Q>XkJbQ%yIPXkQuyB!5b$^MSFlJbV$qa
^@i=Hp CSmjqLDL#*y/\p/II#1::QSVFyd6qj*pld%I=upKT^H=lIbXX6c#GqaCiIAT>&@mR!u:jKhL$AZYhX4t
BT9Xa> !clZ*mPT#+=aTbpjIZGReY\G9>@u&KHI#>8lEHLwWGV:Y>95<^^cTn:?=hARYe@KYAu$lcQhQtiS+ecq
lpFPC8 nw&AjIj4R*d/Gun4%Y&6A@<+p9QAZB/Dl+TD8TQd&hkl+YV1!He\hGVdt*p/%$Eu$mKYLbdP6P=#9ZYe
w6eJtZ #H6E\Ec4hRE4$$cGk&En&>/5M:u&%da&ciVpM&nIPJ8#ReLl58%NPb&dy>N5#VmhtY9EtS#dhuE\aGR:
iXSjSL tC?!Ha$ZA9ctt</%9TKn&ia<5&yqyCaJ5=Gc5m&M%CTSa/TtjLPSt4JNSt1Sc?=9C=GS%4HIhGmhHCP%
C!>VP> FDB11%pka/TtDLPSt4JNSt1Xc%>6k=Gcem!N%CSnacVYEk/ZdVJTm>\<ubb6yBcbdKSYPdd6anbTW:db
HmW+=t TE*b8Wb1EnAb1WY8:SYbnDV:MjI<I/tXpb1!uWhTT!M%=V8MyBbGcyH4+JS#nhRm$/F%uEbTc!M%C%mN
%=8@J* yFbGc51&H$t6nNR1P&ep6VXTp+##TGynyGaJ&=HW#pk6SG\:#Zwp6VDT*F!:phVKTE*bnmPylbFc=Nyi
*>S8hS pd&S6nZ*=nFTTDkaKdKhnSRTVpcKjAenSdc>pcb#Hjw:LYLbP8qMl>b^M6ISAS66%RY5nBRbDpcKdH5n
GL?l/d #iVcX>9cTJGV#$kl+&!pBktH!:a*$uS8up/#NhJ$b1/SbuJ5&<ZBTJH6aKVIhnSTCNkdcV4Z>w1MStwX
!<PnqV lidEuXcSbt=5tSNNt8NH!+nSFCPcw$KLPNAm<nQEinuSuVti!+uknDGdhbStFbhbSYLt&M5!&nLFX<cI
JK$aW4 !l^D=WSNPZGT%V>Q=jTuyXBYB%6KtH9eWmldBT^F5uVCW5KwJLaCYa%wK<Y6cy8jdq44l56YNAibVJhd
Ia9CXu !$lX6M#L$p%LCcP!&k5+ZplcuT$#e@ZdW5!5<E=C#5%lNAqdkj#hc#Ac&*^apZ&tW=Nq&btqSJdlbb^G
D8E%n5 S!A/MBRa$DJHYtLBLAQP@ShDey!b@\c$tNw\V&cp>%8Hk^yyVm!cNQ#Y+PnNM^tqXE1qhMTtC9&?IQ:Z
&ejZia 4Y\=Hw$9QiI$:lN8MB?t6D#>!F6V=nEu::4&uqd9Km$R$lLJpy/ML*$R<n%AyA>IpZB@5mt?PhI$GAmY
dPmln< NGGe/wQLRl?C5eHBYLTpE8NSH>#\EB#c>R#F<Vcey9Sw5Vac*p=dm6NK+<h++R<81R>cKlG:SE65T*y:
ww5Wby WwFwKJAI<e99hnVy4^p1ceI+$RiqMH%a8LCpEiNCH%TL<aL&TkQEPNWHK@/RiW%1TS*GuV/WYilD1aHG
-AVZdV 00058849f83001202b4 Page 479 of binaries2.zip
wTBHHa 4#=+hH$wNWqJH=Bi?M@>yA<Xc&JS#jpH?G#SYM>K&mjp4VcH@@&9pj@FNLc$mbdtiD^TnHJ<Zhjq@b@6
9wCBNS #n+9L5^S^lhJJw6S#816me%%6I#q814%e@qcm6E?*V*h9tKW$>8/94i8j+8nZNbLnt&TZ5/Y%PBaP%<9
qyI>%D b/6#d^VTZ*w=iY\HL&ZPq@AP>:H1D!^\R#niXk\>DMYCR<Zw>&L<C@et*6aF<R:<5X&ZZ5/q+jla&!j9
8n>/?R 1$=tHYti44P#a$W?PhNL!K&9*N@SXyS!m8Tl8qc5#t<=&Y>V6:dTI>HVBjNc<5md+B*LYdm\PPWEm%Tj
/<DDC4 iLHKmSiqHG$+Q6c?q!QV&Q14Pq%PQG<=lyj?P>RuHpkYy=#kq4Fe%$=DPW/cYHk=<cG^ZNjPIw:einqJ
L+lETZ @V8Wa$yH&wmd*BLy#!hu?6TEbW1tlwyTnn=!/>@%?iDJu^t=>WeH4aZKn:TS?+ketaykPS?qylcTyGaa
/e#HC! uq<>&nkhQ9=SDE=uZ<:SHHWY!5X5Y&iWZC^9PeEm%Thi4HLmSTuuw?bmN9WbQSi#9:DSedF<=SVI^Y!K
KD?ymC GVWZ!%6PwX#M81Dme:E<HEB?u<w^+iNX?e/X<+G4w+@V&T4mKDthk<WZmhQ=<4^^66dZ5dbu4C&+@Ame
yeK9tA STuY:MjSQh5Rejc<Q1@?he&S@?&^<XBH&1^FTN5<Xy&Y=a#NA15LHHEL4p>y>5P=uFS!#P*eF+/i8hl4
9y%AV= ?Li$uE+hqWeadq^cFI?R6=^kpiwVL%a=<cKW5&X5:V^/4tyjwhFbV4=!C4Ret&JGdVq=!!tW1%wZNMJX
^cGI^l <?1l@6?miV%hRp9t5hJ8LetD6@l\PbSiDn/PYlknehBwKmjY9>YyuK:?4ZuL+d6\?D>hc^e%eSV*:q8e
wk@5Hl &teW>?+h!!qp%mJjFFQ$Ya5^*m9QiJdC:yW:65@HeK@e6n:k<1P+X?=+ZaXEb+Z$8&+=lh*nd5qu:\Zi
/hyPdB +*a8y@VG=uGjPu9cY&9$#&>H6bT*hVkimTXG?&GZhp*?4E+d%pw6Pk/Vy:=!cHX:4*lk=l==RBHKA@P1
I4/*+^ =bPK=/\TwttX<5D$jew6ZY>6B5$=Zqp61nyd%/\X18nH?#nw&Ph:i49u$j+Nju<MHGX9h#mEi#FQBdRW
8Hu/aj 6PyF!5iw<J8&TAD!9?@6%P@X9B6Q/FH!Z@G@hWJSKq5TMjKM!q!*aaB%l@WQ&t*W<Xd>1:q*M8HD^>Di
@Hct+b %?6<G9/DV@>RuXD1^AK9WD/y+>Q^5VSqF<9V\KI<^Hm%EFWQyAe@kj@t<P8jXXJKZ+KaN6@Z%hI/*#8@
cC?eAl ydt*tVd?hq@9@QHWAK/TY$ku*SlWBh<c=a@ka6Ry6e9+Vq6T1ZlVjV*mn44pWLR8GB85n!hmwcFkKqt@
uNbHNi NdT6@w!/M?wy:p*YB?Ll?1QTLQR9YX\aT!aDmZAk&6TmJdiqauF9Y!\T$lJN@Mw4:&c=t>1mnd\F1/R?
LqD*9w S=q:LKXTK1W</SmtD<Z=HyG:bMCqNA16E/JY+PQXp6p9+ht#B9*hejmR6j^5?%u!+?TmphZmdQ+<i^Q9
%@P$9: u<Q!=@Iu&e<VE@Z6?c!Q!*m:uPYdid8CQ<Q8+@P$aK9IPGP&11Rble6PR^HZ%w@IKbaKVKCKNteWIIhc
hhiu#+ 6^akl:m:4RA=9Z:I%6?pM*a=6P/CEVtZneG1W&lXR*KL?A$?6Z#<R1F@9F:HX!Ck%Z?w1Li!HD:5nw@I
^/VqEd <<j4%VhwNb*^Z/m<GXLPNX9In>h:CiND/DN*KqjlPPambmuKK+i+9PPF==*u/jkhiu@PL48a<JNC@*n>
MNY4?w pl<1m85N!Kq#:nlA:k<Z+%Zu:#6IiK:IjL#i*WLuuT9Le+eEQq=jDj%\j+d\mYi?y49P&&q%W1bhlDmb
ZDleCb b$lRj\4Rq@<4aS^jkHMyTyqZq%Qu$uuK<JH&W<?pSHmD\Mj4!>c8Jd!D!n6Nqqh&p<CH*!6&:TK<q*Dh
\Q=\p@ #bRIH=D>>9nn/jb:uyIRH4VjGYL!P?<RdmT<?G&1kKJ+%pEPL<&t+#6kd@m+E?EdaZN+HVLlQZViydI<
YeX+%M #+8\Qh^\I9\H&B@8Q\qSDn$>Y%EmMV=9E?+q$9ELhF8pHeKaKV1*<RLSViZ=IVj!MM*8%>R=8\@T<la6
i+YB8T l>KLw8#Y?$%6iHujNu\jV:m8X^6iF=V*9nyuD@%tn/C<Va1!y%4&&=+b6P!*Y$l8Q<8qn*pLqLNcZmP=
/C/w!! %%mP?uHQI1=VI!*LcXqFm=?Y>TT*!XBi*FDGMG>*$9J@nb^hTFSBFMj9jtCYc%1B49cqJ4WQctkKBn*$
X>n6jd FGIF8$FBWMH&Ek6:LhnN:CZMy^+p<t6h6$!N$8$Lp!kCk*!\D!^V6?#Bwyd!wT<CIR45yj?be:l*>^LX
pbX$>< \k!HH<N@b5/eM:M:>?wb6D5u:cIw@Tl^qF5w>%DG@nC?chXu#Y^TetK:9iaD/TiywF%T&mZ@X9:XD1HR
WLN@Ni V1tnl<KYu$R&D:cKbuDL\:Hqi:BY^B9TiXceal+<pM=ZJPk^Ci5:Qy1<BH8DW@SViWGCeyH%W*t@q@/b
W^<ebE k^=Y:+Yu:D>bqBjN+KF$up&=W/THR=d&L1<=#qV>%bmZ9W\@F4L\hekb?^w>jMR!VqeL1q#$G$nZZ*8K
l8@HEM >nw>HD^1/ViGc5!:K^VYHD:!*Z4tSbSVyiwP%yG^Ty%#/qP<AhW!=kj!Xc+^L$jX#4#48DwHtV>AXc?+
4d=>w5 jTKp#pZ%<ZTd?9N$X>5w@q>1/5<6\D:B9Q181b>QjVW^4/p#>B$S8p<?Kj:^Gj4PQNwLP!XP/p#>mXua
+qb6:G Ze!4NFQ@/%QaEiH6l4+#RH6y6/\n:bPFm8i<8\<:!6!H>uqn#Ehy:D$!*%H5Z!:t?*+C^PT&BP6d8w*=
/#PH$+ cb\N&uutG#8\VE8aH*RDZJB?/b:h#d!L9uH$!nw&GjQKGcE*Lm=K?%ccNQNK<t$j<+4H$M>k94mdAquc
aQT>C@ 9/K%a^=E4tpD\tPtny@8/!<^*#\JuVut6SHn@q*Ly4!V?h+ylH%b@E@ueBZ#AM*4C9QY5<knL@P>\\CD
BX<=F@ Mm@ThDI9Jy$lmYhcq<QMu@!CHSj?ue+I=l/eihyXmae!GlV#/lua%+S9yd^k@8$l:P5T@&&tQ<6@\L:B
\!d9na jBQ=ab#=?>8\d$1e9IEjbF&GykDp?eEYGp?eiTQF@:Dw$#yZMF?k6bMuLG%9phjm6@*p=^HtHb?lu/8+
p4e9$q ?^Qq*VQtua9I@=YKF?!eB=lpH5Z=cM>W*Pcn<@$=<^m?:#na@>4kI+AyGR@qRkt*4!&FQT%^i+n&E?a6
Yk4p*5 FQM#\l8M?NeGZ5NPMP@haiTS>wZi<unB9HLI!CNdV#*5q>I9nVhV>\e6?*pj=XTu:9?@9:j=DXBLA\RW
e4R%&C AAIACACyXY$qpXQ\M5I5AACAnAIAH\AAAGN5cYX8hHM9eGh\L&%la!>ChYq5bDa\LuB!cm=mcY:6QRq+
&HLZY5 FFZT*ZMqE5ELBBXpQEE=SEZEkDwlB\RVM*IIkqiPAaKVbM\pm5em49eJH18m489BK1=+5h///415+4%i
NI\lX: 1/8:1K#/!?1KIy/L<qj%1?u*81h:byKbIGG1<qYty9yN>i9ZXjYPjqY6Fa%4d+\&nBw^QNa/X?5EXFiH
hLSM5Q Y$8uXbd4p8Y==E4<8H@\1d?=@/t>1%^?iQdbZ^/4cjW6LXH++6W$jdDtcb/wiXycNc%@EL+Q%V%TcGqL
*DSL>k R&ScdY64a$64MN#cMnhT*/dqGVRCL6C$\E8cXyn+*li\Q?BP*1<Q8FpW$*eAlQd4/>G$j9Shc>AKnIMS
S=1:W\ #YN<#5IYQ&5nppu@@jknLi<lpM\!YpZZDaV@BdyB/McS^h4b5\BR@iFdj%i^Y!e?1&94J$S1G!K6<iF#
yl5be& HE5t*\Pj>dk8T*myZpuHnb4/kjD1h6t%w9mptywy/1Gmm511eySHu^:/>NKun#:>>Btk#\L/LKVQ4im#
4FNqSF B*$YuhFm?$8lk^awJARAn/EhB*k<+AtA$\FuAy=wZI?t%RFPk:1nq5?AV#mDXt@wQ?w?/4&t#RdEF9<d
GkdcMK +G6pS?n/VkJEZ>RE&A#aAukM+L8AMeCVRS:iAjBQYl#\NMDVAe<AQBP\HZAi+K<A=?PFAIKV$6GiVwZQ
NL%&5b kLBj:Y#AZ\PiA*k8+HtA4\P?AZk?+AYAF\JiBHk^+CYAq\KiA9ki+GYAq+M<6PmFkI5A@\n+APCDkA<B
d*t<Qm *k8+HQBl\EeAH\Y<B*=VlH+bQqELH\N<HQAJ\D<BQku+FPDjAh<GjB4\#+DQAQ+FeAZkZ\GjBd\Q<F?A
8TK5N! #\G8BHp>+jN=\BeA4\G<F9A/\MYA&Bu<B9B/\B5Ad\T<Au/D6@S1?N\KQu<LiBQk:\DSn>$CiC9kt+B9
JPNe#y Ah+G8AV\>+C*A>+B8BV\V5C4AQ<J?AjA8$BiD@leBuk*+L<BQ\L<GQAV\QeBX\Q?H?CukG5AX<F9i5Hu
D<V#k% l@C=DZ#?B@A#\M<B@\9+BiBcPLah+QbAj\u+FiA/\K<B%\N?A@k6+AiA@\Q<D9B:KL<6jQ+A?CQ=XhTB
4PL?+Y AqJuuT\c4^@4ZCS6&jAT&KbaL/\V!wH#c*l?>Pi>Aj5A:pl>RD@D:$A@ALk#+C:WL?\P8AjkuwB:Ai+K
bMB/:P 8B9k*wCDAAeDDkDeAAl>l9aV+D/A?\IPAS\KPA^\PCD$P>4LkQ5BnkDeH@AA\AMBS\IiBDkR<B*AWaAH
^Tb*eR A@+MPB4\EMDDAWPAJaDnAMeAHwbhP&AbaDqkMTDc@/Hp!!wA^\NPAK\EuAl+BPA4kK<C+8CmG9BI\B4A
a5qRAh MPBS/NRA^\L?A*A!+BVlH:YykEeD96nJV8EE8p@d$V&cVPhKuHhZc5iB%K:HpZ?cyy^:P4X9w9**wi8a
1G$?b6 RNh*JQtuSL5u&u59&@*$WN5jSG%eVNh<GLZ#PG4ZC6KVj1RdhcSH9WnHlyBP?eqHc1S#jWm*c5q9NyDP
ut<mFe #ma>&+X$6VjyeaD<eCHhm+Qy9w<S>>QR^&QJy<+R><VRmSLTkZLT!%F$#!5XHS6J>:&chHI*5y66!ZaK
q!^Y5c 1E?w:>IlAX#>X6YS%6tSaE%:J+ijl\PWlMNXln4/!14GV/<@1dEBS:VVJwhLqeGFMkw^SmJ\6:ibYH6K
D%*CXp dYt$Nl/Q^IjQ4Y&%!==SGR=YV=5SJm@mMZ:q!dBmq5GMYRGh>M^L>>n8\^K?1!5A:T\wL5L$naq/Jj!h
I!6R#? SudmJdyeGTZNyQy1%H<uBuVuW9$%/uhwcGH$cX5S9WK=49eW*:^Pn8CMy8yJ>I=pV$kQJj6BPpR/m9SW
WwPCc8 <l6IN=ENIu$B&S@TN=A>Ij$A&TDT#=ENI@$&&TZTu%FdJJynJ/L:pK$nQbS5FipR&THTp<qHIV&djBjT
DE#SPq b=D@R9yT<thI*$^&l@S!<pXI@+X<E6J9pG>C?qQ!YWl@S:cN6/1AjB@TP=MQSHwa?WKpS=PQSL1TjBVT
B<b&!k M<u?pV/J:n*Tb=K9SHwS?W!pd!jjmjSD=E?RjyH<C6L9pl>F?lQ!NWl@T:+XXc1A@BLT@em*IV&EjC@T
hXmC=l a<njIV&S@DHTM<kHIl$uH+*$SiRZpd/X@DdTn=JjSQyX<8XIj$T?E8tj!d?nmt>Q@lQyRiV#pV/e:AHy
ljnWjt chRQID&d@C9T9/J?B?t4!iemjTj%SWk@Sd+Z/Ziw4$L/c@LHcF1F%G<l9V9=j/SHWh?I>Hn1I=E?q9yN
1!WLXB yF8yH$Z/R8wZpL/b?p!pH/T?E?uu1V>FilZ%y$m9w:+F#h6LjR#TjepZIL$Q>WFIF%Q@nQSE/n?RQwH/
5\wn^p icTd1W>Din:%lWljRj$w$p6p9%N\L@YVTD<6?>PC%/pQSZw%>cFIj$%>Qd1lAy1LID&A=mSID/P=ChLn
YI?>VK cI/C>FE$X$H/PJ1#IN%Ee^ip==Q9R*1ltMMa>K$$n$F/Pe%upQ/#tLMa>G5$y$H/Q#V@TLnIW+uimia<
-A&&w% 000638129e2001202b4 Page 480 of binaries2.zip
&L*EZ* TI?kPSHTFVR*Ruwt#bGRd1i=E6IZ$X\J/b6w#wV$R#S*R9wXtnMl9a4tVpm9y#pW88pmtp5lHTV@n9Rw
T?TpeD tq5lZWN#K/Vu$l\L/dNw4wZ$ayy#IZ$*#d&RjyLtaEm@RZM^yNjRZA#ynYJPbuSdjYqil9SRty<lHSL#
TVccJe HwPiT9MmyPM$l$H/enEuM8lqNG>CimZN1=D?N<&9pQ/J=quaLjYu?SdTB>F<C?pctuelHcZ=F>IZWj?H
/KqVDu >E$$@$L/Wb1HIj$Y#eiRZp9#M8#&i6D<DPuBND>DikLN$=C8w@pc$tjV9A*y/&u?l9S>NI>D?kYc#!H>
AlNSkW Me*uE6*1ZWRQwLph$kjVHA@y5JnjG9Set9<mjT:%/$njIPc?B9$k#a?Sjyut#$l@SQNwyH?p?VS&=*%w
^D!<Aa Zw*$9nT9SnyE<&8pn/F=N6K6NL>G?l!cb!N>Qe&*pX=P<&/pX>L<G?u*cS/P>A<$D<hlSB?cn!M>lPdq
6kWtNk TFjR@B#ytVS&Rd1J=86Iu$Q#h1T9y*p:$9iL?d6B9$B#iKR@wLp<$6@I?hJ&SVRQSHwA#RiS*y@tbEmZ
5=J%ie $>\M/iNyuRZyW&t>BiqLcM$D/h@S&kjTn>CeH?uZcP/Q>Fycq<BlW$>cu$B/EM$*pT/l?S:T$&uhB8p&
Z?V9wX G5MljRt6FTB>B/%lIL%T4AMa>Mi$VwD$D#Tu^!FcD:FGaNC:$nwC$mNwuRHyEqy9RQwwYuhAilc6Q!Dh
$!<c8# V85QTJ>H/^BIZ$j4EWnjSi5RTD>E/^FIQ$j4Epn@k>aupF=D/^SI@!nYK^B/>/L%C1V*yHWLyEjTYBdy
V!AuED Tq4HRHw/4Yek*WD4Gpm*$jwG$8jS?kdT%+l%DwP?p>a/pH/W%n!RZpq4Ipm@R&5NTK?q>Rae=uyy4RDy
t\?yZV :YkNAPq>=bC@V!tN8bE?t6d+pG/nhV/pL/R%P1T9wdW*yP?q>VipX>LcGhL9$VwW$n@RYlRP6j9TPlLT
yuRkcc ?>G/GhKVcP$M/Tm6i!G>kNcRpQ+h4TMl@WhcA$L/#&IN!cDjydWpyL?kNj4NHd\$J<LQR9Fk=/^Duhb1
aG%pRS GjIe\I4<6eNd&4N+SGi8p&n/k8qQb%<qqGh?tcw9$4j!uGFd*FtR+%d\yZ?k\>DlBhkV+t&%4d@w5%>h
Pt^<RT K^D>pN:>L!cR=4HnL::?=^WuL>ye/8MVJ!=KjQiLTmD6<TltV:51mp9d+&$6VeEnI1ih&6LcEDj=JjZ%
m$QlaZ pZk<GK=6t!PbW&ydb$jckyMndY&N#dMq9/I^GkqY%<bmF1:^GT!j%>bcK=tnSl<S^L$T+!QNFq=ba^#Z
8*Q/lA nb91wyFY!+G1^8cVdK#E@k4#G9a4HVIEyDdFG6XjC@c$&6btT:XKK/yBmQt%eqK\J6dY&NS+89JVZMkP
n+q#Y\ X6W&#&/9uS&^et9c&&L6dXci9WLILG8yV?JZ%>dZVA/KFjy\dZMpcl+Jl$8VtkX=n5&CB&#Nk1^\iaZ%
J6q5tI 8?*5\C8JN>qPQCq!iuLLVY65uqTc#J+*iqSTJbFu1\8!E8iGe!cyGQI5/wWM8&wl#/yY!LGwFDJWhWy<
1i\GQy 6:Sbkpq%VH!%%M?1QyJq1w:BEt1DyEXqpGFXF=ND1tJ?X$>1X^HpJc5HeqZXTH^Q8pSFJSJjWS%MYntL
bSuqXt SR&RaXEBbNl8Q:LWY=@+4y#Qh59LIuZ65=*88#lk9@tC//AB+pCTGkm&ZSeE%/aRptq9MuqEZwjpJX>M
T\\CmC pyKwjFXVmG?1m@l8%^uBVXIelT&%S&Et%e6Bn<RBS&WTl&\cJbuPdYVXLepnBXMa>n4aXW%\:jwt8MqK
@1cDHS J@k&#bNMi=XWHaTtV%I@=Fp$D^q&yWPiXh?Ra%E%bKlcq9l8cd\Ep!1b?G1yu%YnJM6WJwMq>AlJm\wl
6=?$&V \/w>JweW^@!8u6T8L5lL%lVp1p1T?J=$may1JL/mXym$elcLLmDDwkdI5GpA56Tdu@m8uM>&!=*hnuuA
W81#W@ j9Ph*a==IEpNHN!P!dWylI9d5S!S%=H5h8VFJCtJw>8SjFNhHN!P!W%TuGT*a&Wt%e6Bn>#enuuIyqE8
CtRZc> d5h!^N=GmwIq8^&XcXE%B:hneyPXL6u6YJn&K1p/YBKNBw>5cS:t4InYw^b66B/!1/V%1FW94ee5!tp>
liPlDt yGyw<lHLLWk?VBihjMDq!1%c/*VRXF*dRcG@X1bFmc&H4J45eI#W&iGIe>Z6mt$>t1#h%8P1mmejThHI
\@NDw$ m4IuH$CNh?A/%6Cm?>bDFkP\H4JbkjYkck4JS^^4dVeKh+N\MRb*R*A#AleDeFd?FI491QVPC8?1:K/K
aT*CYE u1VpLk48y6#Pm8&m%P+KuW1buSW=lSI:KuC!<nw44w9T8mm51:I/K/1npma4KH$GDb&1cw#VNKp&Zq<d
J%wjat 6e/CmJe<&uewdDqkGhLbC!8<=A:hwdC#bJ5d5Q*M<cmDcn4>#9p*^1T>yTXc$h4T*Fdi*GAj=V5eM\de
hEMjtX nt#Zu>k/S8eC1R+/Pb$ph?QpcJJhVJJ#5d5XS+hme!X&J?LkQl\el?I!py^F5y8\P+kp%?DpFJ#hkh$S
5QJcJ> PLwAt@G4bt<*?CSVV#J!B@P&G:dNyP&>na6cFl61Mn9TGlS*Y!\^VRp4JXBR?d#/CDS9T*Qe46EP9/jP
=AI&B4 TBWm@W8TJNS@8^Bn\tu?QnGyej1ye!ZphEWXp1ITXw8!m:MNNW&b!h&:w&B*wW+CW\6#EtMX+Q=VB#iY
J/CSeW =MD!G&m^X16wdI&n+=9hFGq8$+4FW>G1^4ykbXP5ydW6mF/uPn^N@V18Nly6cYpPVwlEa%4%6KB\X*kE
9cByjm dFpD\%eLk$YaX1GyW%P4Tpq>EDYD4=QLnnBmQk&Qp@l=5K^<*NV^YN4+BW19Ly<<KSJ9cY?6n^nqlc5e
uhA9M\ B8!\Xl^44!6YGWDDd/\HVWbqe&Pd+Cw!+>yE<LZB^Fjnt5cH//PN$F:RV5aym+6d/8aY1&^S+YT?A<65
Ft<tD% EMhDiLI&<Gh^/+pMFl=P+6lpGY\uHkw?KZKcVT=!LGKJabPAZAhY+y/KR<CMSh6uN#bdV!F+=i$NLc&%
CFm!Fa #q\+**BLY>pPqw$d:*=eKAk\RcHd<daKJSwj41d9^8Wy^/tSE%>Syay6*?q4RlKMCjC4ITnYGAEhKdb!
1p>YbR Lh?wub\Kt8%ELPQeTRYyB9Kdt$V#ELBtNVa*SFwh1tp>aGepmZa+c8Hc1t\>aGippK:Y*c^%+9+16dZY
K?%TiP $%dAI5GwtXyAPiD\e*p9Gy45Kt8\p5>15J%+q5wdHBRecc4F#5k1tymYZ$miVVkhTGKahc?HRW>pZl6h
98++wS bWJj4X!:5=EHZeR+q6Wt6VhQtV!=94W^%1byaQMSLYtp4a/!:TN5l$jGmbG%9h?Zjd:N+QenJ<KRVeTa
NnlYh* 8T$8Ec?$w^K9NEDbJ#SWmXecw?#NtKDEK$%X66khw<R4#XH&QWTXiKX&Gc>p:M&u@a4G*uuc4&n5V/j>
DQq$HI m5cieh19cP!@y9&K^y=w&1>w:FNP:Fh<S5a4Gj8FKX:J&H6L<W4G9qiKX#L&nXK<p4Fup?KX>N+!Zpuj
#>94wb Tea4/WNp9JI?X5a4/hW!ZptQ!Hkqjb/MX>K9p9FK?y$!Zpq@TMa4/T6q9JL?9w^Z$4?Y<W4G6k/KX@L$
R#DcbV p9FKuwE!Z5q#pI^Z<p!R<W1iw&Y<p1hi^m6=Vyd^Ty+LbL!Tb+tMX@K5pQFKu9hq9JJu4a^Z<9!5^C9%
/cS<$# p9FK*kE!Z5tI1/J+Ji<lMq:JP%:GK*tQp@FK*ymMX@JiI8PX9I6q9JL*Zlt9=H%G^m6=@!Znqd^jKQFK
/\ld/I BVJi!VhA^m5bMXMW4?T4p9FK9wmMX@KhIiPXjI6q9JJ9ma^Z<n$w+=X<j=Z^T4:*bL!T:^Mb4?SdL?PX
NDb>W# @D+b4?V9K?PX@H9KiCZ@GBt9=K?S<W4?Ylt9=I@JiCZ@YVJi!Z?XnFj!L=Q^T9+@!Zkq@^5!Z5t@S5a4
&i\&h^ GT/A+yWCP<6+yeBRGc<WKJH^TwF1Gc<WPFLGK\Wt!*mqRL&MX\4EbL^TaIGMX\yeL8PXAnjIiKZAZVJi
byhCI8 !anJctRZ:\K<Ehwb@Pu*B16:j&qjL9mWZP\CV6hdK:8E$<hN?*K\whiV9E5+m=GGL+uuaaXLc9G\y6Nj
Fc?F4> upQ9RcW%biYDkwQKT1cW\Ei+5uVKwH#VlqT=tyRMT$ymBw<*+ek$LX*tJWpwJRwTA@wCt6pFqYeaDA^=
iC*5ik BLn?pie4BHw^1\ED#^j!H5w111b5X>ueFtq6n4RF!?jFwm&6HS$SbQq#l8+PI$cMRD*K?*a\pyuyHHLL
>RXy%Y \MDR*WcCHtP=\B9C>RYiIZBuB4kSkDSDL\cIN6dFm&P#a@WNJ^W*%hc#m8TlQwSElqj&D/\QCZ$\u9u$
ZaiQbX PLLt!JL1<8Hq$<8hj^DCj#:/S=@JYZH5:\*ky$q&/HlY=t#i@>D%?ce:qDNcV:SB1tew/h@^<E9thMF#
yG@d/8 >QCwdT&i/y=+@%N:H\H%jJ^XQG?l!P85F%YcN4cFt!h9aY8j1%=EquD#=C*$>L9w^ecN#<:k=5qd/BX\
nHb+Ad $w5b6:/\eiQ@k6\<iR9dFLn1^dIAN$@i\k/F#9*IkS5*Z4?at!hQkb<KMNmAu\w\PPqDmJ<KMGm&y\K<
ZaJq?K %=\l#<EM#5>jl<B>AwN+\5a:I@p%NdVA+DB5aMkP?DW%PRWPnuF%=N$ptJ/D4ku!Q8m/P!bY!PGYP8=k
q/^/hV Eh#iP%ckm<Ah<b$HcAnb:Bn$<XA9L+b/c1Sd%?<TVb*#a55bhubwN&\G=bRpIn!wbiCId+aeAEh<t>/X
$ky%8Y I:+bGBm/GjDiLkcHtVu9:YK\/$PI>*a^cL!*m+FBBZ#BT=+:BP+VGL4QqkBN/$#&DH6GE6j5EyVVaX8Q
Eh1&8Q u4AP=?X=n%m*:=NBPe^QMTCDe9mWdjeM!8Gn+EEbqMNuyeM!KIi=LA:IwB#PNk@PwB#t*RluWA=#e$#N
T:4#R4 wB!?p&lG8uIMDA\=AI>YaM\JW94n/8y\%nMF/Dw$<a4pFBPQ*1K@!R=PBC!J^cK=pFNce?qJ/eyXV\9m
$uF?6Q lcW5W^1N^*Mlb?Le%quDAdP=4t&Ne=YY=cJ>Jp&iXJwLPXQKy$<bZneubVuLC&>h\JA#y/$yttZ:GHLt
/V!hM# y4+dth\9R$:V4K#N%JCV^kd^6d@yAMhJ8hDDGa&^mq#IcYmyd<?F@4VGY?6#IRhliD&PM:P:LpPP\#m%
YI6ISD p*K!%pND#8tN5Y#4I>=Pu&L>cPjN#aNZX%iNT%jP>1J6=!5QX%ZpSE/PQG@N8IuyLhu/^uBHCFi%%G&^
\iJy\d QWF>Yk<q*=1iW5/RIdtSW=?n?5S!JTiYE#tSidGe>HB#546jb5<h1=?Vnb\Fmy^Wh#=nPVuw8R$=<WnY
kF5XuY WctdY+<du^NN/*@C=SXy@Xm<4V$uew!iElwyt?5KJ?Sp&Wkutn&85XHZ8XDB=6dndya>RR+5eFN1jCak
aM49q? NCMeLuWdm@Z4=tM^%=i?hZA5=m=uT=+Fb#4&TjF19R/NjhLK1e>SjYK=plQLmb^NQjb^1W?H^#+8enw<
E8FK^h >ppuJ&hnu#S>d4m$JN/W85#$$y1$jkQLXKV^HN%<DPY1$S$eR/X<KYe8^qC$IqHYW8@T^Y*hkjZb5qV%
m9lTV1 /eD/dEw=tjRE/VR?=#*Byq$QVhp?9<A/yt6>Rl%d^$^=Zbqaemd*9RQ4n&Zy:C9D>d/We1a%Nl>+RHDi
eEdAVu /FF8a<^iHSy4kKCenDZT!1uQWZ%m8bIV!+telpnYn^I/NNb\1W?H^^w8enw<%pkuy#Z6jRiFV8&llb^I
>DYJNq !6+AlWVm%A%1t&AhIhyaq?FeJ+WGkb!Y84ty=NVW#W$9l?NSuYH#T$iSYjaEGbHNY&&T:$i8Euyp>V+u
a+^ClL Gc*w#ZC@tnjD@Y4iDQi4iVQe4?dNeL?cN<Q>c6+M>/6=M>!9=5%\9=w*\@%1Z6/9^5C\KV$!:%hLIaj*

-A!*WS 0005d377639001202b4 Page 481 of binaries2.zip
%9&lWi 1/X8H>/9^99X5yHD?>X+9%4ZiuDi4<d:%hK8k@F?6i#p<H+%*1@YTVt<Z!%N@<Z:%ZLSE@B?6i+*F8Q>
dDhZ+m cy6m:MQ:%dKV\@9XiL>c>^yD<Z/%JPD>c8:A?>X+9^49X<6TD8>Z!<Xak@i4yb94hQ%?NZ/yqAq=@%Iy
a1e9i$ j1&TAj#CJAS?/XGZ\&d!$mQ#hV1<h#u9kh?q\=A%<L6$!Lu!8*RaGBm/u?j/Sh=?!c>c#+MXlt:!19YP
<wh#5l 9dPW%>AI?MZ5/Y$k$?#:tuZ5mG?\/y@T+@Dd#^m5uVm@@a\lTS>C@Qa#Bw*jj5dAwAJwjqtp4u%&Hn5E
S>mN96 :lMaN5heQduLNPQu&+8RYjIn*kql/yR/ZW>c8JSJwnlLqNPKTAjjV=lXN1k8Z:uieqcy#V6WwQuYF++I
hBTXDR GQ<=l$^1Pb^DJuZ:eA+b#mGVnS#PIeM=bL4Yk*MPGe+lp$LnPahML8S\DluPIhNJPb^DJp*@^Vqpe6EV
VGAeMS eA/b:neY+^\!t&L5\#qp5yQDPYR+l$#*GpN^Dypp+B\!:5A=bDmHDPiR!XIP==DJ^XmDe<mpt?9\P<<a
b4Y/yS 8l\+d\BD%5B=A\S\*kAGBwd8B#kT%M$wXA>HFDBawqA=/yD%RXPmD46LQwkEyI:BV*iea!\b<l^Kw6Ek
pBIyIp &MC\9A&$=BESA\Iu%P$C&C\T/9J18N9amHN1hRw+y%dcE9ceYq6!BL6:9nCPdSjNLVPcb/w@iimLP^mV
AI\u!S #d%c*kM@+&ZIG9kb4>qJ<VNiBkcGdkd<nJjBaaLL#*kb:QwR+5!!DA#GW<?<Vm*La\RGlM#TntcV@>Fu
W$#IB& t&Z4c6p8#k\y$+Dmu&ZX&j&LV%#F6l+>aTuP!>W?<d5?GbV#\5iADMylY?&iRVq<4nAwk*J+h+hqWA=G
!c^tW/ BNwBGbVDtedBGbVdCn:CGbV4AS>VM!lZBB<#$yXnaGDIAZC?&bS!PN>5/9dljLPed#adPb^9q9QNh1$H
qT!L6+ =*!#uG<&leb#96qe!PF<5=^96yN!PN>5t9/L<<*twmjkjLQhd!#G?Ya*^hmH<<%tJ+j##ZK?&i+%l8J<
N$DK+/ 5$uA?YdhkjQNe4=b#nidyS#PN=8L5Rdut$$*%?u/jLQ<YtIE#mDSBdBbbJB\i5Z$q9QYaa+phwd8pk8N
H<pjJX <*l$EnmQS*wd&P##iLlu*=ByJ>Sh^:^=%EELPQeER<iAe$<\bA&ei+L/Me+>\eDA$B*HnnuKw5i=<q^u
E#u1kt bt=Bt6S5GWW4?nPMX9SuGK*w##Bc$b>l6KI@\&lFj+dSm9+Mw^Z>GWa4?nPMX9S#6CID\/cEIw@\kec1
eC*A!W ^Hb&J>qD?Yw\64iZ&N4P&MHP&MdP/GXu>FabH8F4nS=6S<C?m1QY?kH8yDJ&B6^FbjT*M*bRL<EnHLR@
hYajhd edG:1mZ^akecDPXmk&wJ9NnhuIYLt95T\4HpHtyJqLYu!5DV:&W@@h:1/i*CWZBBR9lk8@B>:ML*6R5j
1e/6&k +mw<eb8</p?G1k!Q/GEKE4IcXXqau@*5>Sql4<@?4k&ZZp5<+6SGhR+EHKuKPkl\XK1GR>*8mX>GA^/m
LFmHI? @lVViI^SGYMBD%Wbl\Eiu4LtPEI4WW9kq6^TqaF:a56XBt/SGc<!J8CCn51aCHmE!5B>^>Z1SS+JYKQe
ja8klt u1$T1whZiyV/W?^TJ>uXiLJhP/cpc5Ei1q+j4j+W##dNLt8/Kk6Qj$\1w!qK*NtbkMi1Ja<DQD/X%lb=
K:/F6d Hd&Zd9hi&1d!Z6/8>F=iS??q&:&Z%mu9=i&p>>L6*56FiKi<q&:*Zq1u9JjZ$Z6yHjhii1i$^N6=:?Zh
I9B<FR $4!Zb9hiR1<#<X=/Y8@qwu1h<q/c*Z8=*B+H:/Zd9bhL+^j=Ml6:yjhiit/<q/<49be95:FZi8@qhLE?
:kC>LI S??qh*#5yVpLh@Bii5jHZy*#Z4:M9JjiSYM9u/Q*$8*i!/Zl8yQ*$n989eSFht45yYjm9Z!P*p998Qh!
T9G*G+ Eb:J&M9Ni@p:/d*$Lly:?d9Ti@p:/d*$VMbi@5#GZu1u9Je@5:GZ*pZi!>@J5biiG?@q::#*<uj#5bii
HaTQdQ mjj!P*w99iM#S=eY#GV5yZjKi@t#<F/eyT8qHM:Tqdy>PE5Zb?uKSk=u/iI5ZX*4\VqLF&jyT1H^uKW4
MNncN? F*I+T^hu/i1pHM:Tqcd@+m^h8ikJPE6Z>^8Lebc8VVH&+T^h&eulLF&eyc6:ncE+T%eTeJa8h?A5Zb!q
::mCkj m:N$bTtH5*Vqa1#BYd4T#ZY/Qp5Z9!ic\Rd<utkGJ*$IGi?J:1y*kG:C>*=!9l?GZAD&q9%hn*L?T\Tu
<>\ED& LIph!$%u##bt#FPERJEhyejWePZ\YG6pX8M<LaZ9Re9j$u@u!WWn8d<FtaGlW*/TkaF%mIF%mIF%mCG@
FiK1*% kh<J$AY\Yd\VwPNbp#qmK/Wen6lK*V+e5eWSY>uI+ak6n6n1Yk@PEX5e5bXC+#qmK^h!PGKLI:a/Kaen
MS1TkP 66L$Z^!^qa8ikCP&86>anCP&N5Zal!P&5yQDEX5e5hY>^qAe5bWEHLHqDl!^^SFdHLGXyS!P&M4FYIMn
I9hCP* 66LNhdw?a16A$+\u^1tiAnA\dMFREw*th\N\qCcD$SiI+I/5>+@><y8u?P*^#8BQH$YtSwqSBBhM4ZIS
=L^lS# L=dPC!u^bB+aLPu$q?jRi%ByVXu=wPCk5yIyJjAS4m!hMmmjGmD>HtqjD4VEp:!Q66P>cT:jYe\Y\JCV
#uihaZ VytBIT?kn//u5Sn&1R#5W^pae8qVj?pn+lXthiJXX%w>4RE$mHi1cSGcS<\T:>uTbyPpPebuVyJdIPSp
YY&qL5 Vb/nR8*A/#q=D&WXXXP&1&^8m:R&S>1C=jNm$bdYnn/4!9LuDN$hSw\akZ4EI%>M81j#?JiBkcF:#hub
A1jEND c#H\&k$DR&dRy^Qn9N\?DhX#>nTWX$aa5wXMemS=eyWnKbQ>>JQct/hMuq#j&ll#*=cVN6hTH</%^LtY
pc95SS *CBZWccbcC4udEwNuLMy6S\E#6tWwk#udMyYD8h5&t^/FM:b^DtduI+9$Dlu$/d1eVquW=4?K%*PypLP
Y4M!AF &dRJ=^ce?/u:nip+>>PtGEN^:1j5=HD8J<:>%L*Gaq6P:1iiuQ6ym%&j=S^TYimQaaGeR!y4Pb^DKmhn
9&1/\^ F5+l=YaX?b6Dm9jpMRk>aGBkTA<!uyJ6lwE>J\MDi$+G>y\MDP\=Ghl#MnB5Zy=VC:/ncj&$yumd:cuH
$6+Hmw %wM%4ieC+N5i19tGAmK@&ewj@R/t6BF!9J>Kjkn+AW*IWjtF!#B5TelS?V1eX^5M@Ea4j/iqWH=wW!^8
9FJn+K +<</W>N/LY61t&&V4+iqHBYYV5iW\W%6^y+lJjc8/D4+6\D+eT9j<#h5yKc&8K*<%9*k*:bR9qF#mPF4
Gl!LE* cw8&YQp/Jq:cGXM\cah@h#@R8\4?eh6D?+RE9@K*\Bkw?FWdkL?%+D<$Fi5k?HhD@Ze>RQDu+6Qq*Wn?
Y&1jmd qaAFku@in5Daui1@GQ:%I@pLkh/D?FmHHwK@C>b6V?I@D9>/Cj+i\+DiT@B*iSQpB\V@BLmu&6=W@p9+
56L5hn N%d\B&NbT8V4HT4quQ<\*k9B:@<8!HqZ<EPuAGMjKw@y&8q/Q<P/:!9+qehD?i$Fj@ZN\KAuKEWwn>1l
aAy*Vn <YKkl\4?=EK+9&HB9\jcWB5t?NPl*Z!Q$jX?Dw#lk6<D>FC4E@\%j\J/Q/wQQnH6Ljk%B\A>k9k#bL8F
N+KXt\ SkP>9?D9?kD<i$H\Q*kP/!d+FhBYP4X@4^?AecDkn<h&Y!4+d*$Q>Em/LyR@ZQCQiRZwk\S@ak#ct64u
k*kR/m k?iBRW<8J1Di:p:*@YTkD/b/N1B?C9/F&G/n1j^n<P>K\d<I/*!I+NhQMp=m<Gi>DVTq#*?%WLEZ4>Vu
IZZe<6 kc1>KQ!1M^X:WjlB%X/<L9cm<L$dyL&M^PhLa\T@jdC$q%HX1H8Cj<aecT>F?Pn8WMF@5%Dc!#+>kHGa
\^6k6H +J@hJ8*q8Q<Ck@J$D=\9:cZyCw&miPG?>JL*9jknwE8Ij/HW</N^M!*6Ij#%GhJiQFl*il:ZwNlL?ZqA
!PuM^! $^/@!mwyb#D1D\WXu*P&6Jj>5I*wTZ:XnhJihpD>H$@*ebt$q:hSH!dRib?W>qJ<C==R<Bj>cN4LaS6R
jwwZ1W V!aK@nWVyd*E\Ga%&6peGT46=bZXYBG1#>QTZk:CN1+t@y8!*SwGAH&p+J<*W>4La?k#ckV@@L&p9W!?
18Z?cN VVMjD%=\1LTZb*eC?mm1#?ZTZ5=/EilJXQ=ncT@jQI1PRjA9?p4c!:mZkcdMTjW*Tu6bnGYtC9:FP$l:
hl><TP Yh\H/KPJ@*6yL\N:An%N8PGVuqD5Sap+D\=Y:EZlS==Y:EW69%T^F=?L9cl!QyD&<nFi/*VB9<Eu:YWC
iE^cJW &9w^ku>LtdTZ\%DPDFH@uc8p9i!CdVtV4ui66Je>#\LG5aJ@!djTZqdemS$c*jhX<4/@jnZR^\9?yd&p
1RE#hi u4hm8=%A@Q:TZ8IaH*?m+F?&8:TZ9hAYcZQPbehLPiX+9jV5?LKw6JeQL<AdK@kLK/T>4L$MDWL\Z&/R
ndLd>R >9I5&l%6mL>nk:TZq%AHcE@C>^Y!j<G?YKQamb?8pjd!?XWcbtEW==$p:YX@9Je$Hqu+kLTZZ:<END&#
=mKHhw Z4lT6666&AjTD4KF4$6:iR*4TPP!F!?Y>9In>nt$!@CP5LTZ/:BQy@Hcwl8q9h#%DNA6k4?8&LTZ\#ck
Sj>*BI nhJinpW9TH9bCi@n!VTPGm:6=b8@AE*n^=h8qja!F&&j>lm<ew1$q$GwI&JLkd=p4tI9jpYjN!n&I9q/
u>Wj5w \Y4FZyV!\WeWi@G:&I9CZ*1a6JeFV&DHI8RZi1T>QHMceE+S@F:nyL$59AE+y\y?:AqyL$ZIwRTd/!8p
\^^nKA 9i!BPu5c/h6IcT@LRie%&m/%/HN=*+?/CD5$K1@$C+W+%nlV<L?yq9c!F8@F4/mhu=d&<lV$Hhy<\j>&
HG*Y:! 5yS#L@4l5+ljK?*q&8<$5e$E=Y!R>9Il?8c#^jZ&9Xnc!%=@^a=P<Q9hKP*qei^@#^H<$jPq9jVD<i&=
$u4:L+ ku@wK>Ji9KmH=\t?J!#6=ZpeV==Q@PZTZu/@Hl$<6a<!Hm9GQ9bCK9?56JemqHPS+H5ZTZ9=\<jw&AVj
dnbhiA 6%Vc!$QaJ%<m?Q/\6Ji?q/KnI9=<&d@$\t8>nQV#atp9n/JNZ$:<bhJiZ5V^\$LB:*&p6Jj6pF=E@A?p
NGq?iQ 9a#Fi*8FXb<Ni\pp/:qlL=K9n=?q&I6T9pkhn\Xe:MXJQ5wyeDq9kZLi<=Z#K8Y4QqjPY?B!ZpZPuhCG
HLF+D? 9mid+4b=qu:QaIW9^+*/<p<W98\j>aiZKH#FD*nSulcE1?J6MD:E5j>L=E>YG9YM6<Y5:XB%u<JZ/qu\
=Epw8+ lPqQRpX4<b+K@nnRS><I\S?Miu+X6e@6yn<JZau#6c5F@+p/$=?EVpeh@I*k>>qZ?yPZ*5eBt8D98L@$
1w/&Cn J!@nQdmY?1p^$m=iZRj$hXT?W91B=*HP6=n+$/R@?jq8+F^Qh9&K/W>CN?C>8+H<\HGtuNBMuHjjKQnX
FK&&!C !$%@EtyDY@k66e@jVZ<T8kHuL#eJ@6ShVZ<TtwS>>i<E@?kSyn<JZaQ?<&dm%=u?JDRN=:C*CQ:M=hKj
q@kaEZ 4Q+jeG+X@J%/tQ+phA1$8Zad%j<p$=?EDpS@6aV+b=u6FmyC?9epJ&4/p%Ay69@6kq>#1iqQR8jjkS&9
Ib\QQD +Fe<I9*Jp>k?T&qbawu$J>@m9P>P+4<8@epKuCQ?RjAu4VL>Til1HG9hJjnGeFd+p>BaZKNaS9^6VZ<T
6ljtu# &l*d=t:m*&4/p=A^X4&H?J<4iw96h1@ku^mXiq8E9:%Q<B68qH4dmGP#?\X@ZY@bD/:CQuP=+E<JtHwd
ZVLX*X 8lu:mn<K@6!qy6/GD5X?=\HTl=/!@c@FMjPDXQ=y1Y?H+BnuIeG@@A8y6$>k*S?t<w4iF8Pe:BEcu@hR
-An+K6 0000f41422e001202b4 Page 482 of binaries2.zip
d@MwFj =PBe?XHBZ:li>wNjah5<S8Z:Td&N+%4L++J@:jXTd:hGZZlC<K>dJ99BD*AM?!jm4=J/P\u:pCeF@/dl
^6\9+q y6/G6pij?SThh$@bD>/F@8%y\d@mFhpQ9wn?=M>W@u^y:$?l4V>D=XhL9V*wNcD@R56F!&R@?ADc^A4B
i6JX=y 9&1F%N8@w%:>XjC9nyy/G@wX#p&jJj:%Wt<j^nw<J@nZ*C:%>tV$A!8J9%L1:SIeMD%Q@Hip*5=Hj@8C
8FZet< +N@/1hVda*G8@/Lk@^9u1cMNjwEQ@jDL%A:wS*5c@MD:d?FAl54@Yyb@FNhCZ1Z!6=nqC\=G8@5dqZ@M
+m9nG/ LB>al@4<GyY@S<4@CieR4%Q=hXJ?V^!Q9WHn&=CW9\nH<&<K@pj:!9J%iH@jIu/hLN?G%@J*+4jI?u!F
hc<QDe Q9l6+6<l!$@AMhw:k9<?6Ltu#PD4k@Gc@pHqH#D=YlPPV>+X@E??q@#=iM@jE@\%a!X@DN48Q\Z@5\YT
MAdj&@ j^nc*L<E@:<4JQ<F6LXXD8PHRyj^k?V4H:/mnB?W<4:?!9ml$GZ<wMm=h1:y*@#@RJ@$98C@i:Zy*@^4
*Th*TZ $Ka@EM8b&%ca@m*\FF:4l+I@BuSt+CVB9^%%j:YRe>5Byu<L*I=46Q?t?%=6?4jABNVXn/k?==y&GukE
SSyN18 jhnHk4>1litZAuYwI=>RP$n@=9<G%%:?n<1@d91*\K8+^9py*Ze=9\+ekY5dc\V@!$LV9\Y1eQ##H/4Q
S:<l!l =cb@C<#H8u$t4ujR8/b@C:!B+<@QSjt9Xy9?LZAEq9?9KD@+e>P@Bby^99CF+A<jc@1*\M$+LqyL>i^9
uSw$X> ?4hAPi45q+K@i4*y*\I9aCj*FbYjL>66Q94XhWL?nyNM@^a\?9G9Bd>9j>P@?XilHc$Z@H+nVj<YPBl%
Z:X\lP /B8!*$LV9\XGan@:LbZ@y?ujA6jkHP+:\h@=W>P@BcJ+*:<uPcNM@^aamY6WQ+n!8@R\@X6kDK+l@Wn<
>D#Sj4 G$*@=q?De+*@Cj:w>cah?hiknt!k>bt^!9lV/4quF>AZV/FS*8QBeiNQkn<A:wNZ*C>>j=^#@C#+8\XN
PCG=nV 8>BZwV=5JH/^KWjji+D=TNY#^#kyb@h*E8?X$D^:6$p=:VmGFGN$#\HjTnpu4MGJq?CQ@FuK/a><H<t=
n96>am ZM1JV5AJq8DQ8FnK?WbHY^D<a/?WeudakDbIeybKPi9RNpWdiW=aIiZe6#*\6^L<&yipuJ?l:>J:pJ^u
J\CDeG yJ#>\Gj1SaLj<LPWe\HWZh>c<GeHVDtiR8V*JDu@qHKG@AEZEkS@:tkyb$wJ<LeS@GlI%8e4GB91&=Ke
/%i%6+ d=Z:BjMWjV8c9&D:F#dX&q:+/^tE9^9dXB8#</9MjtVH@WcknSQ@ZLMj&ZF1Z?D95PpjW9+@WE5DBBRA
\l+nQC AkAIAHqYdTY66AG94REAAIADAAA!AAAAdGqme!>\bt\9dYFnL*B9h&X!eG^lduR9R$hBWHJ9b*Jqe*NE
k5!%5B cYF5d&e8eHB9am=mcY/XW>%KApEWQ49cD\d1SWlEpETREC!lRXJl418FpN5TkuT=/<ytdL9LnqHRqWG9
SIu?Tc $LXQWNF#CD=B$BPpEEEZpy*bH$XD1A>t#9qt==#>=5\bmAqH9GTdtq$nJF?ZhXQnLM6W+K?\mX$6XaRp
YyE@X& M:HP>y<&:q4QuR>8TtC#iZbJLR%pSdR++HGA/AJ<9*jj*G*w>RB\%cWL!jVPhm4FqR5qmT?K=aLIm$KB
T!pSIl EJuWVaMRkaXeWiRQENME9/V*Qu&JdSj>n5Mndb?*i^P<M<GhDWM?ePWNPcL#t$eGa?m%QEE^TEAWDIdA
cd+jeG #EmqFeIyP8K9D6AJAT9qbF5SbAN4FkbYNT%h54Y<1X!w?H%hW*Z6%kKay*ialc#@Q=1FYl1y%DVm:e?R
$DB%w% ^p%DpK$Ge\JS^4@FpDhkMK#<CE\eaI/GaMt>LGqLpY&1m\qCiC#L=yR5KpnW?C15K*L8uItHSV?iYeIy
CeW/N& MawQ*I?y\DQPapT%ypQNWApPd4Kdkq<bYH%Ad\WMCFTKal:>6hP/iw!Y8/+&cI%&Jeuy>$NcNS@w$?y#
WAi:MQ uw<ultZQ*$K#:@TD@&:m:5Q=L/j>?RNRT\MEFAACAAkAiqb6JXhk5F!XBRAAkBRAAC+AAAB5cYJ#L*Bt
/#BE4^ dC>6aYM9eG>*bZJ\dGF8hC>DX&F!dtq8b$F5bZJ$LuB\d&I8atq8#XlhV^^XGH/Hyi!HLF8\Wa^NtImc
NemF1I RyBAS&!4WW1Zn>DTdWM^yDeL!#ClY=chhZdRK4c:yBy:yjG89<ALW&Q5H*AN^C6nVL!RNCHlB^mDX!\J
ZiVSV$ &iQ=uK?h&dXNc*!db&e+#@5<=#*9thu8DHRq=#NGQy6jGe6ylnqaKPlL<DllFA*%<u#!6PRbj@/::$?E
%mpkk& d@>\@@*ZAwTdt>@<TI=E&HWJwBNDYwyH+%HNMKL9!pqD!=ncnL/TXVP=ec&wG6tC1d?e%QNF$%lZVh&a
ulJEe< $>aK<l9D!9DIt<N9uVp*Mun46GEZlN*ik>@4=!XqmSKum*q#\nBP!ZlK8W@8m$inG^mZM?1Mqqp6L5^1
YC4=L/ c>4cptcMVbACV5utDe&1^BmRX/%E@&KN5X^PX?e?LtkDM1=1My9VF8nbVDc9LjT>k/jCbd\Cy?A+jC%>
KA*6M< C%aQ+*^QbLwyR#E<hN^i\T+N&ntEREKwHEKwE1/l9eSScd@u#=Z1/QdWWYq:1wdGy%DND?jDQVXw+&kh
yD+5uY 4RERqDkRk$S^y#XWG&$JH@WkXE$k6B>GcI@MS?c%=5bnlCM=w\khqSC1wcea^I@+it8kQbDKAKEKR>5m
T&y$JK R@5RR*e*\E9*AbSjGNTjGdc&KKT:Q=WJR1FKlcA6XFq5p<1L:XJ=1B%k1J5+TPZ8wXCquYBSK6Mb!G!m
Cn\YW5 Lt9?<B=Day?ly<w\i5SkhShb?!d/J*ww?ml/Kjwyi84ZX>IDem!Z9Kmki!Wa9ZeHi8=>Cwu!LRlVFCBW
wjkRTS @tB*m^:bihI?@+Mi9>mH$Pdjj&%6:pPaI:G=B#%jqcG$mih!+9<RAK*m=1l/8c44:1?mZp?+EnC>\\L6
6YLJ61 mHApPGnFJ$HRcAhFItu<mX\JF1$k!mMq:W!\cMIJ&FNa6B?QE\Th>8XZEiNS=L@kFR+@uw^HPAm@T:6p
Jy&#jF <=Vnkjuh6EJc:iAnV9=St4u+<:VSDjmIwIQ+THPi4VGRX=4\9EXB9NKEF^$YQPtHn^##XdSnG!CF5p+c
JuwW\9 SIKT^wHTNB\$YApp&KiL6lK<5i1+RS4TJGG%Ln\*KA1<\X8>@>YVL+aG<RClB\*wA&J?$Em?5NDAAM6n
S1>DP1 5RaGYB/LBS6RiRMDKk<&IQISlEcCDIme4D@AkBej8AR/P?Q>DFn^nQe#aMX#96:AYu6AD@ncBi<%+HKL
?AJJMC >^y\8e&:DaVe=6$GR5:/X&hk!Xu@/\\5PSpXb:cBLeeGI:Ga%<Alh+a\eMu6?T$Dy>^iu&ZkqL6=b8Cc
=H1SMt *iXQDX^!d&AD=F?<MGkcB$%w<l%Rc^dmt:E^H*tG9KK+?H+cV4:t+DFFN1/@@>CZb/\#AZM&d>F&k4M?
e5+I/\ B&$q8HnZnXZH>*6+t8DpkY!HBjDl/!h+QN:!l&jw#/y*<w4TWC@&DkL/\/<?=m<clPYYj>yH:>\jH:/j
9tpd^j !RQ+jpHV/$>S:A8Q^?Gl+@4l:KE#*Nh*p@54@iR<@j&S4n%ypAh:cG&=e1p6tet4Ym=$ZT8&yHR<@AIe
<6TK$* A>nw\Iln+Aj1nW/ML9\A6R$6!*wlS=//>cYd!#n*%bZq*MwGjkaE<n4pQJ!*H#XIWIiPJY&q!QQQFM%d
ce<^VW Jl=LTBM\JNHAw!tMGQ5qW9>dSJL^B=ijLc\Zd>Dm^8AEqSIR!TXdH94eJT>A9V:8%E5ZQj4Q/9RT%=@L
etNk9w 1tcPNpZG@<S:mBjJ1\l*?dRqVJ<pu<e<By%NDiKNDd1cGuS+DLV<elFn$Q51/hn6D*<d?BWQuaSH$Hd%
&BN#!5 Ku&^>jd<hGweH!hu5<5#?Dn:pY1T<jS$M6WLLZA#1?dP+8PZ%?bti@H+R:dk^F&?iG6!jH+Tn&j=PduV
$Vyj5D Z8jub<p<9NRL>DWWY@eXkJaLQPe/*w=Ju1MClC@!HL\y#/X+#me!JGd4Z\j>?:?m%$!>IE?4i4+>tXp*
FPD6X> 5*1i@lFN/cdG#ywq^C?5t!aiue8cPc$IV#@?AXBLA\RWAAIACAB/Xt$qnYA%weeBAAAABAAANAAAAG^y
Dk=jh! auM9eGb5L&%la!>\d*hqeuB5aY=$L%BGVE%la$N%e*S9dWN5aZN#bZM8eHB9am=mcY=npAl\<@FNVHa8
b$C>+< LT:J#*ZPTT\8Vm*YK!nIV&IkDlRXF!Z:ln5dMcKJM\89h&c5Z8<5!a=Da&Nn1A1IBtqp8kGpkbnB&p%Z
HyJ&VY wiwVb/&J9&$=#=?Zl>\jZhi#=4ueYYy5<mP1*9LIEt+nC*M#T#P>EFjjAEhQ9^BZQ$e@b>jm+5Vm#Q!<
<8V*pn +tJuJkauV#>Hi!DA=iBNF6c@aE:pmdqb>jCWt+>H8@uPn=PPh9#jiVL:&j1jt>y?^41EStihcX:@P!:F
pd@BIy KZ*!>9P4#n8#M1i69?be8:N9\%ZtYe%ZBKh&?yT4ZYTc<F=m<<!H@898S4#?Zjdj=qhR>%Nn^dCmR^4@
JhBMFY Q#qZ%jAj<Xc=Q1j/G$@aknc^1w:hK/&@P4y5*=%WK?tbc5$64R*$h!5Da*=TXk4RRjJqBTYyHM+Btepq
ydIWpT yWYyRAER1\CIGd!BpIElKVY>GKyWy!m%PIjjTV>eIeDVPWRlKLXa\hMFHJ!MARHR!BMABT%IG1yHD/SH
HkmH=/ $ER*KdPEBF*/IF%CltbpcVMm%VcF#L!TMk/k$6Tm56RW5BKEakWky4c/%L!WamDYI%eZVkuWhM&e^=mk
8=VlEJ !Ahp!VAaMVA+l$RGANqeDA&IhIpe:@RDAFBLA\RWAAIACAB>Xt$qlG5DQh5BAAAAA\AAKRAAAG^yauM9
tRH@9G eGb5L&%la!>%hGq5cZSybZM9VYFnSZJ!d*J#LuJ#etM8atq8qXJBc>SAFB=4m1=4F*dXX1YHkEhyyT&X
LEY*&R CkZJ^1\Ett^IW6CV^M#LMt\!M<^M8m=/KVdiBEH\+J<R9Ptj<Nh+KZ6\p8%/YCnw\QAi**#ji>@MQNV^
C$Byey p6RSkkt=LcSI$j?8MA46b/\eLiM4L:/6*@^h:$8Ey/i*:6Z^Tp*i%FF9hAkm5I%Q9/=Z=!ekIy+Rcu\&
Nl9ii& &6Y=LL^Enm*b*n%+54i*9^$:ZtC=j8#+qt<:GMTIWc1p9aL/4t<>%i5!\><QD8<5LEckByCwW5DXD#>c
LpAkAV %T^S@Amwjk:n:GG9tw%KpMyu!5y#NkHe+B@d%R#Laa/n1XSRGGe@NhGHmY6:kYAnAXL1tK/?9:bj#TLZ
W/DMGL C+/e+Huk?Hd+Mwn:^+PBE::cih^*a>eQn8P?99hh%P$TiyLpBJ5<EWpBCpRLE#p&5#LQP$%GtVI#XqLe
wGyLF\ el<NVck@4LeRWT&bR&5b!cHlMk=$9cV\lpP1AJ6A<SdL684#&\6hZap#TSSl6QNZ&ZVbcJwTcW+EWYB!
1BM96% \XSVy>*ReycPhh=\=ut4\X?Ze64DJe>JttlXnhZi8l^ERcVWdiVe=<bF&YX<nbZcitaYWDA^Zb/N%T>j
6$hDcL *>$ZP66E8\lFejlA=#jiewVMm:>6DTN#Q5#@P4>@AFBLA\RWAAIACACBXt$qe^Tl%VICAACAB\AALAAA
X?ei$> AG^yauM9eGb5L&%la!>%hGq5cZSybZM9X&F!dtq8b$F5bZJ$LuJ#etM8atq8a^AMV!#K!<^Lh<^JLT4S
kJ=jKS K!w8TtakCRRFB#t:=JitM/KJ5<%d4@Lk@Ac*R*N\cG^5jQaVSIM$51a\MLAAMcMXP!?LEK5RC$:IbYJ1
D$C:Nc bGG1F?L1G&DKBNVy=PuucA<ECHM^SXDBB46DF!A5qkPe9FAw#MuLKM+5A5R5RAp^BnEYeSAJk5#CIMk1
-A=tSP 000424dd037001202b4 Page 483 of binaries2.zip
tJM<aG !CLEKMwyBPMlSLG\BJub\c+X+?JmEYMSalNpE&VlbGJqaiLkA98Bp+PQVaBNkEYIR\lwG^?nKtMh+$tt
jB#KYw d&yZRpMN8FBE4tKIZMMR8R+XWYKA^EEHw\dDHMaeFmb@d#Cjk<GBwaK^wIMy#kDIW$NV^icetJietkNZ
yFbyL# YRNZcedAlNY<DwadRL+ECV1SXeJ$I:5PwVPL\#pn5Tk=Q#GHkW#A\\BJXC\MLGAYE&11SPHS\nbGuLcX
tTX/h# Wh$&blSb?64MmEMq15&IXHwDI>*ilI1awKWY=5nWakdW6PKZn!Y6wP8D1aLyRymD11?M*VpnM#p^Qb?B
%Cn+n* :9E\WDcnq4HMM^?#1JaBlYRa?SmaHH&CRllaGcSeQEN<kHTTm+>:BJBiyZcFkWEB1q@6KkM#pC$Ebq>n
VY#:+Z +AK!XeD5/\\mC1D<DtLjaJBVaGC/A&djbFAF56?B&Xj?@\i1<aCaA&duRe\B5&hA#AG#L$HMAdElHqP:
AjSIep CYbd\M\B8y+Hbk/RZRW#B<l?AVMHtAtVaPaAA/kAbk/R@R1eSj&>wiWSy:?*AyRFwSTAW5BEw?CZ#?cZ
Fa4jM9 4\BQQ4REAFBLA\RWAAIACACSXt$q6DID<Z!mAACAWRaAIkAAAG^yauM9eGh\a&S4L&%la!>5cYI9WEhR
^QTMc9 e&S4LuB!cm=mcY:5*Rh<XFZ&\QF:dkwR8wCK/$yEEKREyCkCAmEkBAmMJFV@CCEMHSITmmlXilHBn1:/
y11Xue Z<6j*dYk1+m>/%4YZi81&NdG11C!N1#b**u9VnKbFJIRqV?b=?jL!!TVteq:==*::u*uQp%CaEAkd>KM
mdQGF+ yJ#e/ca!T%ycIDhqXGy@Kj^YjPAHZh*&ZIe>h?Veeu5y9:l<?R9<Vqb&>p\i^Bkn4W%</$>NjJ6G^l#@
JEMF1^ d^=jLdd\SXP!J\XHbidtV59PVR#pbp<Qb5$%%Y1JE=PjH*1Ru!?//JjHTMFG&44XtN:=?y<SW!5?LZ6&
BVMNcM bqb&Yc<bc%1dBHuWLm6aS!!<hJ!yuV=6X5:MaGLjaDDHXM6FnER*k4F/uDc?&!T+^\p%enK#btSPCbd&
G*+WcM C:Zh#=Q!F5+1/ih%$^jt#R*PTytbtbeZ#C9?<@m?<&bQtlp5a:?IS@<qVp%eb6Lb$/44*muuMna%pDkw
&$*!l^ iYT!1y<YuJ8d9TCaP!M9eXDt@M#E>PdDE$?Rn668qI/V?+\aqnl<+FVVInFh@?*d1qqQI$Q9Micw?AdN
lP=\19 BypymTPGGTuHG<cIy#BLpZYpCtI^ymAP1?L+y5$cEBk!dYJmIJCTtNIlyY*dyL8KQ1iQ@>H>j>^/lG!Y
m#MF&\ Y9ce5GjXKZ#F<4&9>/<6<5$YHcy=nIyyc%9d#&It/GuB$hec5/MF*@#K#$D6&Qahnjh+%9ch&*jP&5=1
y5e:Tk %p:*NV?+D6iLu:WdGmuMEib/dLNi>EmV$PMa:?^Dnk=LJ6+VcBLLC4<!jm/^B<E&%D<4\c%4/qqaj9/4
LPbBhJ Y!KjXCicD/PL5b@:aZL!P<b$e+@6M/cG>:Nu@iSpu>PuLQXPRI9>G?@caHj\mHFj%NC$:=?tmkcd*\a$
ClueuD >VQ6\GDtyGB8Z4@k^HqV/H\EJ$<:K!\6S8VQYAp6@tM>^l?L>h8TypdCGlj9QW*wQh$^H1ju#$acij<&
RDGT=D %MM>>Fpn*9Jb@n&/nE*%!@+<Vp\XNI&HRQw*6hKC8XPCmeQtXdKV%=5qPSAa+kXCdL<lA$bu#bk&Tj8N
\qqe#b w>IDKeb9A&#=Zm8&aK?W*T1WeZ!W$9IZni4\KC=w6TRWtdXMdEP@y</^e%K*\h=^W:GNpnMqb*Di%JpV
4ckY16 1&w@/Wa8iFD<XCnmLKhKqtKun94\MH?:5FFT5uPDqhk\@<?Z%KGyGiQ>dXC=F^mjN#e#6@LDKSu>l/eh
y/iXYw $Q94dm\lJ=h^SP*@$K*lD14R^5t1^IjV:YIPeL8ENp=q*4?t6#&5mT/Sy/&XQ=PwWP4*S!GpYB:V4\wc
AuBDj# p*484Mj:N&FEIDZmM=Ve=a9w>HG!qbcbNT\>pT!YPGVc:BuB*Pl?nm:XccueTe$lhh+4*d9u#J9aQSwL
mw8PHR $j:QL>4@KS#1K6yhn9QHcw8ik6uH<RTiLGl+G^hyiE61:@dZlR@9:MRXP@G4qp86kpHwA?1Sid9h!LLS
Z8Q84G !*/NHy+51?K6EHuiu9edu:hZ=9$4E5!8*!MTE%P<>/@DXjZ<#pMkpFJ!/%nX9j4!@=Xl$XFmV/Y?9@t1
m^1:$X b/jeyVb@@@tnNkj^@w9<&BH6RPph<dBiXYpQAt=A8N1u?Mc6Wwd%/><15XY@=I^pXwHWqI^Y%YpD^B=I
*\I&*B ww\8yVS&B#l/X!Wu4JWhA@tXV*5%H>u\!I6ty&l&Ct8&EwaPG=1e%n?y@?n?JV?uV$EcK/5IyCI6d@Tc
d$A!?6 u:jEm:6YLEW9IS5y/E^?:=<WG?6PVtJhl#Zi:<cctyyApIDci4$bhXEjDhARS/KycNGpMe&RmGQSHMil
Z6ZZ%y BX4miLSCc=!ANtmH>plCB*SEJ*SGX=!Md8mBunkX9hAdjbCM98mH$#AAA=GKRSmMIWlDAKhnPNKSIh4@
A6KZ9b MtapStE$^tA5#5A+VMBE4cnFJAR^BXM^DhM^A#M^G>uI\S#pIk>#MR@#5RBuaTHP^nqalMXak1Xal8Xa
T&SKPp kbXalhXak:Xal@ZakM&+EBjlK6!MY:EN6?M8dMjh&IH:<AC$T9lF9I#Z<D4i\E/<m\@^d*!MV:Adi@Ab
qH1^QW >8JLjIX95R@j+Wj<lH!Z@DZ/mC5lywTaEtJKmCelumSB1#>BQEp>EE@TRG8La9p>epAM+lCQG1mJYplA
c/\d!L dhSBZhSHA@B:=pk$^VFwlpRem?bwkba+H1*RGmikVc^j@NRiTimklXDwlM:wmyQSDV*RE/imF*1nD=LS
NtmL#! F@%\GkbkIFI^CIM^BGpI+HRMS#w!MAInMR1nMRbneRdGaRItIk8VEMRWVMW$VMeM#MS5bCMHe=CLQM#F
Eh\\aG QM#HAy!FlVkd=&ASFtMJqtIbqtMFXtIXXtMN%tI>NtAnN8F<dMaYZIK68B#Z+R:emi&+G@jljn!AB@FI
G1==AA 4F>*<lyi^$/<k*j^L:!HZhmN#@EF>8JLjIY95R@j+\j<nH!>1A*mTGJBHAq^JMTSEEhCDAp^JMTREENC
^^hLVA DHt^h^kcwRpP^=EHYYGq@BLQL#nNhGPGW6E4ipX4pmIGJWQNVdSBnm:SRhqDc%B&@\pm@JyE\dC5nTtc
^P*%:u jKJnGIj1GEdF/@eK^?uL&@1Wh8HNW%ADwuMRwnWk$cZ/LWS?>h+A$S1R/KJLmShWE\w91FdZ:SJHu:nk
ncE1MY kt4JV#pwL1lY4FNc&e5uETeiJbVaFD<:PbAcunyT?eLd5LN4%*jj**TKakZl@B%m@W5+MalDQG1kJt4y
aNmK=y CD=1w\:1wl:1w\Ec+nA$SlP$RE8$RX8$R*5pwRM/+pS$Rth$RXielG++Bh*SA#*SC:&SnBV$\\AMSCwG
?*bT*q aVCGIA%DEeB\yCMDI#ATw#Aca#AY+*At^tMCMnESYbmEICbnC1bmPtalG#tak%#M^V#M^\KelaW+B+8\
5+lJwY GE8\FM8\HPhmBXbmFXbnDhbmHhbnA#dmQG#Cbt#BBdkRF?FmZIJLeSY8^p*Yu=J=B?:EZdkH>?I?*I?H
Qmn!IW <Ali\c6+DY@mLd!Nh@ABQ5b8:MFu?AJ:<S><nY?^D#@kS@!EjP5hH$JMCVEq5TC8lJkTaw1?6SHmTaku
hTbk*a Ib/EiBLmTakqIbcp<aGWj%jN=Td9e*mjy+\8VGHH+?AdJJR1#+9F/^mNPb!Q@Xh9u1P^V>P?tlIuPeb=
Bdh=9\ /:?=YeDQ?#Np:h@>nY@@+d:@kq8@/F:9Jjj+bjh/4:nZj>Y>*n@h/:@t%1@:ZW4:l98>ui:**6V^J6b9
yQHkcR GVi*<TDdW:ae:%hXF%GL:<NdeA&8NY/TN/:CH@F@8AE*+pw?:J85@=j%Y/^9a4$e<#AjC*A8*@<V/^k*
Tcm6hF Zj9Q8Nt>^/&+Dh8kN/?=t8i\H+X>Jt?DjTY/j:M\CZw!NqqHMcBuHX4nNSZVeCdQjb%%J85*YE>u9SV$
a9wFjd :CWQe>%w*R#YdC+=nc@%jnl/9+#b$N8*/B$6=pBHA!d\uAEamJ$/IwhB1Ij/cGB$k15S>4uW%h^k9Gt9
EHGP*! =Cq!GjT?P5T$jG!<KjB!HndljG\GS+peajSmkp/5NZIWjth$i4!S*?MaNEN6JPJajILtPA+uwA*cwl%c
bAQ^aE i9j%MhIiTimk>#jAy&mF*imILdkAF?ImuIlP/I\8/I1VeDK/+SVRS=Ln$RM>5RiuwlhGalSGa\!Ga\VG
u+W#6< +k#<D$:Hb<nA=^mHm*EJL5Xq$Q*HjlZh:4wQ&d@Cjlj&8:Djlj$8:G>JB@6e&Pj!BZR@/^nqe@kdu5jj
$bSZW/ <Xinp+CN?Rhi\I6+m8i?^@wb%8?#jwu%K1#GG1#qi!?#Hw\ljQ$KZ5W@<Sw$9nT&mAj#NM>J\%B<kGEI
u\LLc? <H$it&Hc\Rb@6!FtDM<#dBiV45P4IJcM9n:d!dD>DN9Q5Q$M&<?\*R#d#dDhDN9J<FqMI#&LSBM@8^4m
:m%5:: #lB9l9k^S?ybIl1EuR<*h%pp*l@4MkPNQ?<<%n89>?>GRM\ca5+Re>=EcYLPEHPGtDQE6$u$YkXnn9Z/
\+Gy<& TN:+9JjjmEhDjBnm\=9DVu\a+5aRN$d:$5TIIWaM<YTIW$NeGp%Q^KIlbk$^c#m8DQFp6PyF#$9%Nl^/
Tb8JK+ y\qm!9VTkZiZ8=LSF<Tu$iEKa6Z$A#F9mHqD4B6m*ZB5Ga+6\:FqPLdMPt!E*wcBYDjE8tHjC99ddGDN
wA%Q4A Qnac?&SBIReIPWDIAdKI:^PZ=q95A@FymE>DjJ168B^Z+A>an?@\Qd?uecI*+9wSh&MH:5G>?A9$blu*
tC15JD +Z+<kD9+uZha*<Z/ZhaQ5q+Btq6bmLP^p8<@lJ@\M^:GI*kWn?F^QIEueTj!ZSQ@L*eKwuGk#Vi9b*k>
\\pFWp w^qj^**J!Wd@#5XaA5&NG8Pc4#ZPNYj!M!EjC9qR!Iim#!N*C96AhQ8V++*thV/#$e@JMYR+lk#HpNHe
dN*DWd #@+V>y>\#An:WHRjpt@qK4*ZGLT>wC$S61hwG$JdI:R%Rq5ndGj=EG^n?Rm$QeL^LB#H\uE5HMhCG!T$
e=n*DX RWIdJN4tcQ6C8!K$K$K:I4R4R45m:C8ldSHcF6pF*i//Q>lGS9PA=kCPZcN6q?+H*6j\uwduG6w%&e8c
#y#=89 @TV@ac*=uLkT>46wDGq<ph9N%@kG=GbD4nZpYWN?NPR:R/+#=ClDY&d$6Zkh?bK%?w19mSElSwVaEGJD
ueH4qj NB/IHTFGSGPC@T@5Y!GtlQ$9:H>l@\9:Z>n@\9+Z>4>wZmQjmiap#Y*Et=D:lJ\w=ES=98K>@&m^qJh#
teRR^& Kn>i<C8WYB=M>&+wI%1p*K<kwX6A4IuilP?*HS1QdwTD<mb<aXQ=wnjlK<<T9Rqj!Rp=ilP?k!uh64ZZ
ZPqu:n ^1VGjKQ>YueV98l$maKq&p?ZKDw1GN/QD@Z9I@9uwj=>QhiZZ?H/cF6eH:qB&BlC=NlC?JlCciMDmY=e
^BT5>k wLu4+:h\@j#\Q9&e5Q=?bH<>%N<@$jZ6P+iNIWTPLaTQKbR&QyDm^kZ/?@%Md*^lwB6uGiVGWIc+ebnI
/Y@BXZ <bu\ebu!nMie/eajJ@lnnh++bPV+bQm+=HR*BnEn4M?>%QYdN:6^^@B^TNiH%9/+N^/=!S?#<Q4Z/>%a
6qTDFN ^%w*S4uP::>:a^%#\@4qC$4w?!@!?@DiYMlFdy!n4QGNK>&a:>Z??K+*H9#H5DHl<5bik#Lm4Gpq+!5<
A8LC!Y 4u/LtQ16+&uGj5c8<<Jm1LSaYPLmMV\G\9h@cVtuwe5QS:un9J$:^8c/8F/&u@Gl6T=8%:8+*qnC?F*+
RphNy: 8F$wX4iYEJPliL\t:D4F>SHZKG:!4#<W8?=\/+FPBNAdBhaJ9%HkM^XQ/wjAnRI4Q$JT?R>S5S8%qXbW
-A><*B 0004a416707001202b4 Page 484 of binaries2.zip
Nj*%AT Y4R\NLb+X/8ki5LW%@/C/:kqVe@MLctdpVb1dMDXW^T?Ta\:cpKbMn+mY>b%GdPiP$4Y8Knj<m8$$uu8
/FACi9 CK=IK*&w66DYbdn/EXq56e6EZjcVhhiFbhyeq<XCLjXGq>uY8!!=\YZuVT=Dl:JpbIaPuT&eY<pY8>Lb
^/a$iw pcDXi/VEw\b1wlaTWB6%WBj%WB<N$BCHwVGcwAXcwk*cwl*cI\pheTI/wVP/wC6PRniek8:wkb:wlh=I
eC!I%C Sk4/aRAGIlYDMBlDpIclCGA+$yGBESmJWSmNMSmLeVkV+#EBtbmILE^CEJM^BXM^HdPRnS#MRT:tal:t
8/hGIk a\HP\pKek$XanCXcNIJqYI=#5RI45R145Rb45R:45REdeS+&aVP&+AJemI6\CT:FbdkeX?AQ8BLZ+Z4e
yVBEZ& l8*akZ6^H^:C\*kEn?IJQIY*<Ddi^Rj+EB>lF*bnL::C%@kG?@Ah95hQ!I@^:#JKDEp5+pAeCZEp^JAR
EHZ>n$ R$IMCVEp^I<RQ$L<TCMRQ$L<!PE+Ap%^XI^iGV@+cnSK9EX8*TK*!K%?*hSD+lc=XXpNJXwH/k?YyYXt
wC4GXD layAy=d#TptM8=ydbM^NPpX9XX651YGm6!E?XBhZm?:juP*Z/WtXQ%8E>dt1!!*%JH4u5ilkhTtHc4S\
kEw<1L ^JnwdQcCZQIL%/lW<p!6\uiN4%k6VHqt\Bj?Z*^+j5%R$QmL%4H8eLY\b:wc&4G8FucmX>&8qi%c%c+X
HHXnFu :X+hwhc@c1%8Ra&k%l:i+>j\c6&l%tLdS%*6e#?@*6W?:Ni<&phe9ja19u+I:&EZQ5CHiB<j?ZX<Zk*k
iZjuN& cc+YVphHu8Xui8@mn^GHiI\Bu>iiAV/:HRj?Dn5i@E$&E@y*bGE!ywA#an5L&iD96QTh:HVRk6qyj1&\
#GMmeG :iS1CLj!hYj$SAi@l6l&<Y5L:ct849AKX$N+tX>ncI@*/\:65Wl$>ajZ8D4wc@%ccM5&5\?/P5V4Zb%l
HSpHt1 9q@n49Z6Zp*/P*:Nyqhu?b=jS?#X@*:w/lX*8h49n%&>>1i8>u1Q1+H?*NW6:@Z4C4WiWQ?Hc@I%95G*
%Dnypn &Ai6K@$PQ:l/:b@\M=?9D#4/Nc#&SM^&6hT8J6G4M#?j:@N?6m:1wV+cwCHt+VA$RtM$ke:aPAJH?uYH
/ap8pZ 6wc4QZ#WBd+N1#<5wjbR\>j8eQYL&%&>+w+T/l5j+HtjS6R1S6Ryltw>djP\i5?ZiN\G^KlhkbZRiPaa
Lk56h+ 6l1#C$E5Yw%ynYhm$/+H&<T!VT#d^J/NVhB65^qd$Bb5Y$5MYN*@dEi4ecd^SN^anVNm!SJLtm96Im\G
d645XG eYW%ywlF1#GueWW<YiLJEp8Y?LHEn!X?:A%wn^6^E@/EyWnCE9\bN?MY*I4d5A&*+\/$A*ub@kX*kt%5
kI!^wF q+Q6dDpYLei!=bm&HJPY+>MP\ECpalAGk#dEytEwlmGA$#Ee/enACI#EKM#EcJBQLQuDuw5VeBJPS4K4
iQ6GC< $S@9c9uQeDZ/YY+PkI:M98>GFjX#h<j9eDS?D</IdG6@jwWqLt\iepEdab9mKJAMdXj$RDMel&QeHI4I
qY=*ul &6>649:*F9?ihXwHdG8nF?1k6/5J96QXBh>iYA95%jN1QLSAT*>?lI%q@TQ4BL?&Y?8n6Vdc1&h?*b>j
Z=e^$S wuNC4M+^$D4jy>$emS=895pej$/FN=wc=$dX8:kShS%Bj>!N5whG$5NH&bQ<pZdL/%4!mN*6#b4TtXI/
YT9Sac T<19KZdZ=K#P9juCZXX\>eXidZENh+XA@$iPHJ<FNe4jinP9@Ny&X:5i1q8*i9XK9i9N\m15P<<99Ma4
P^4$PN wbc&1VhD!/<^4?&8bn#kSyB*?a%wcL/Q#69\S1LD=lN=<#lCe#mtF<+*$c5TPyhDc@J%yF44<uY$Yt9#
1KqFIW 9Z9nQ?dZyZ8n%1E4F#j+X#X$*yB*SiR^N*>I6<GD@9\lua@n%h<@+c/iQPY8yD#y#>@^/8#%t8AH4ubh
&&nK:V 4&BwddjYk?>^e*D1?Qjt>?4A/=a\D$m9$yAn9h4?S9:XBG>8#HA*b!ZDu^ine%F$uwnPmTtaW*K^8&Lm
RScAct 4n4w9CZ:mS96:?NjchF=AX/h@=Z8HEFH@N@\S@^%*wB*ycY=j?XA=@Hw*Jd@6ueqkFEY%@@:Ny8RpADl
biblF# qE8NmmeRESA^IlKTeCbpVRJBQGCVLGRl^:1deItAkne1*9hXc?9X/6>/c^Y6%6aic86b:>yc4Wi%%1NX
4<?>6a !@?>tdjjjL9:jd59:E1DthG*:*$#Q!dj<d/b?h:Mi+P?LMKH=X!ceSlP5\1Z$c#CMVV4e#*NG1!pYauD
j>8X@G caalPtM!kta*>mA@1mp$$#GTbqN&y^tu/VTn5+ltjF/n&a$Kt6XBH^#$i<D%>*?uGa@ZcRbmtb\lE4+H
SaCdaM /&uG/l\=M+J?Gy+HcKaJb%JiJh?dTnpDI5c6/L9\Rh^MWDQNBkXyS8ltPj5qjHc1=T\N?94kdJV\:byN
V@nJlL QmDXNQPC++?j$<#YRVTnNINtZn+pZ:hN=K9lw>t4Int#lV=\atb4A<$eNe1bKQT95td/Y1T9l=lq\uj8
AcuL@h YVqnlL+Vama6jp/@I<tMGM%KiS+mu:XTtwq:pZ#\&tptKn4DlLNGd<mbN@TQE:PDF$k@MDEVF=%l<$6j
^Fk\yH L?FZhSdNKGLjiy>6n9+It1H1=#J4ib@\=BS?ay+@CC>P>PBE:$*l??hB@^Q$pjtXYn<m@PkGT#<=>BH$
uG8<pL 9MV#q@Q<t9^Ym1VQHM/5Yn=#w<lQdn@!meM&BMi/IdHuSw^QuRj%<q*!4dQ:%I&VQuMi8Hei$GWQ6yiw
M!*wGK #>lju=mS4!ah?Pw:TN$m<JYnjdh@*PaNw$j*SQ98RG5qVZV@nhn:$F%mnYVI=#1%lTB?L5t??D@%66uS
1nb1bC b5P?im8HSuLS6Th=S8^19WJ1\j5dmY6S916Xw9c%J^Gn//6E9!@4V?LZqpVZDA$\uNinVDc?^?6QM9mi
>4:aZ1 PZuM:5l5TH@dP%6p1DXil>n//#y/dka>t?m/5*QwYSy$L*JJj5Bt<95D9biG@MIR:/hBZ&HpbCG?K91R
AMqp*$ QJdiYWN?Sa9*%yBj=XFQeDG!:E@!^cSLl9^TF8?#IT$<+4$&=Ni6iL<N<qIhanNP:pd!H9ViG>ITIN=@
B<eZhK R%wWSD6kTP8icA<MccYJd5PNqldSQlnTKmLcCaNG>u8T@A#hZ$NcHEZ:kjK*%I:k4h?N&lPWD/b&BiWK
bS#M*5 cq>RQwdcGbVd1d%B?VJ1h%C?n>wjqF?thknqj%F:lI?&pNwpqI8ydWJ=N4XSKDhTY+Z!it1#WL/G>AQq
tMu&?= l/pNR@qXc56R@ni%cck/R/q6R*pm6ZEw?/m6R*pF9j5wu$Q6H<w*WV8I<nb1D%F?k>yFqL?l>lFXe\C%
l58B^J p!mQyjaT=c4wt\Z!Mtw@WX=Q:TnKX%B:m9I>%K/m@B!%4!l@R8$51u+jct>S*yQcZbTuWj8L<uHWD1N<
AyN*jZ E4ZHKF>G:VLK>%L:nQIj1b%G?S@WZ8P4%b9cdbRQw9ad=ZJ1^%FiVP$=!mjVi+9!XhT?w@^@%M/n@D61
L*yFKK :%H?tNy>jHZ#1Q%H?WD1B%A8w@+A=WZWL/DeTj$D!lhRQ+H!V/m@RQtZ%G?k@B4%H!l@V9$INlMF%J?k
LHnS$h 9Dj%K!kjS9$L!phVQ+N!kQwdqNhT9+Q!lhV@wH\4>WMwQ$n>Ee4QW4?E<kjWQ$Ydy#cTl%N:l*I^>Wpw
bBP^EY H$X>E<y%%C?l9J#/iyR*Wy?E<lZWL/F<B@XNKQ?K?ncW*/R?D8ZQ1e@CJ4I*>X$wn/I?DPZJ%JilZEX>
\kX<&$ G5wB/66RQyu/YJVQyd+Y=S8y#$Z=EiwHWj+n>bpwj$S>y!F*\BDnJyRHWF?N<9+$qpL=TP1VWc/qjl9q
WawWHt bhR@w:!c?k!W6%D@njK%%KinjAj%*!k@T9$:!5>V*+@!P#S&R@p#Gnhk6=FD+#1Wl%Hjn9Iw/8NSQyV/
a1jE!+ iyVuWy?Q<4HW>/MewnEA!l6wLID!PVRtRNutVhD*htY>/96#Gm8k@B!NGXD?M+$hWQ/C^lDa9iXT*+u!
mdnE6@ MByZwH\knT%Rup4nC=T4cJ!B<9E$*pA=SPMPqDjS?AQq<&kek9J%NB=B?S+cq/D<JI%QWQ+VYR^Sjq>c
#m4Xqc KIV<8dSwaC4MqqaBIR?SqpEl:!?6+pI8J/5i!mjRVB:KJ=FFBPXLyRXF!HjKtWEl@=4GECn@nYd<WN=P
>FC4CR %p:5@wjK&V<lV!R44jntqNbSIViSBSVq>YVFSQpcGn?ljC?Nw%B?u5bVKH>I+!weZyl1jDXk8LT8Cupm
jTVuL> YX^SuphYHyRdyPXe!BG!Q1N<ly^XFQIXetbV!LjT#CnKD=JFC8Xu!H1G<l6pSWQ=a&q6^VVRyDEY!wQI
@h^4>y Pw4!utRqSZpeYW6SumE6b$JiRNbFqFiR%Sdq6YT>Sjq$55cmjKt$WA4=^&RFSjq?5ucm@H8!91H<NqqF
eyXp</ Wj=TY8DFWyJ<5yTm9Ii$XAq=HM&8wD^VY1&F9JA5%mk9q>a4IY<k1##KF>Q+E8Wd!M1N<6%ppWZ=6&SJ
<8q5#6 SjpNcipW<8jTGw=yeA:NjKA<mGaqWN/QbmSRQy^tJXC8yNpJqQ$$T+F!SM=TCHp##XTkjCuNYKB<8=!=
c$tqi@ EQLnNH8B<w5$m+H!*&p&A?X9cXaDl:B>=P!GpEjTiB4qMVT:kjJ5t8XAicpc<k<=%dDe8IheSdMhKQ>M
45^6!w #t+I?deW%R#q6&kYA8X@!XpIVL9%w6pIqHinmGaw:$e#E!lQwypIqH%!^pHI!?VMk=BQpVMQR4=C#pAI
P:LR:P ?W+=E!HpZ<wbCTG@LYetlQ\F#XDk<L&A9mXR*qhcYwW<XXyelX^NqqiWq$4L1=BQqSbaIX<6LdFC9qhc
RZ8T4h bIZ<Y&tbFjLjyIXY!N>IT!&taZ&q^XdIw/VqX5lHTM86pG9Ikw9!CtuFFjIy$yw4=E8qXXjI6$944yCj
q1<Q8% qqbiIj>XYu5^De<m1!@Ki$1L4=BLyPXZ!HZTAm#pmLRAC*pLjZil@CNyESd!L/SqYMl9TR8^pD?ZqtJM
iMwT!M I\yySlDqeYSqS*pi#hck*EK#A!mjLtjFlH\V#a/l@Am6/ED=iX4^kjLHekaT$<k<PSMy=FE$Y+N!KXu!
HcV>Tn WV/Yb4qR:yC#ZpI?n&ajWQ+S#TKk@BBFeWL=GdpKSMl@walRKH<4X=hk&u$IShlD?YD/SpX=qy!hEQIT
cQPIw1 PiMm=E+=A!Qp5&lYB8X4cbaH=d9p4I?Rj!queaV<C5*twQ\?SYFD?T8cbeNQ#X\=E!jpInpnJ?SD=e!e
eA&T/Y pK6wlk:qSnq:J?VXe8bC!F6whl9qt?S56=D9q!6$lQ^dPTM8=Hjp/l$l@$jPqtQcM$?8:BH!HuItZemV
weZLHh =cwjIj9wi^:qb4u!S<n4=E!:pC?S1+KEjLPelSj!@VV#m9J9=a!4pN?YM/>C@pLP\A1VSl<=E!9p9Tmm
!^EaaR H5wVcVaY=Xp$I+9!Rnp4K?Rk#e1m*CquZ+S<6y\JF@L%etbe!Q>HM$+w@%LPKA4=Nbw%R@pn8TJJ!N@K
$wQQGt %W8a>8yL5=$wD/hbWbRupL$D=Tw=a!npBy4SR:qD#m+K?W!cbWV=PnunK8V:%T1+9b/SM*^Cjw>t$XD?
aLT!9H n=#%\:S*Z=4>R@qA8aJK!DNwhSVKC?X1K!E*W=SBqNjIXXSCQqi8SBD!DZI%n=B@SyHGWQ/qZN$n=Njp
hMWlyn Tkkl@$88?MG$V&?=tpHIi<uXDEI?R1+mEuK>ZQWp=BQJNwV!F4tTTMm*!lXZR6+tX%kJ?Zt=wp4I:<8X
b5dM!/ YJl\N#?V^9?nhyi44+R<Tc:CEuKNZIpq=Bc=pp9Iy<tXY$K?S1:TE9KDeyYYpJ?V1:YE@L=e5aWJh&<#
TpVeXq cj!@:==!%bcR^<9XY$KiK%iMCDpwX++I?VT=kpVIN<mXJEJ?kG^pKL<wX=MI?TP=\kRV:qyw$9l@9&F!
-A1$VF 00070688c90001202b4 Page 485 of binaries2.zip
kiG@4I XatR^<9XKEKiK%icCHtyZHEm=QWWlR:qT?T1FCH@SK/kE9JnemYXpQ<kX%RJ?X&=5p4IZ<pXXyn&#=M4
yTXS1: 4aR<VK/+EuK^ZHpq=CQqCm\lX<tXZpJiIqh:CVpmX*wJid%e<TZp<<qYmQJNelYapB?R1<GE@D8=Kp#I
jhytke 4<9XaWL?y%\qlkq*iVSy@H>AH:pKVMm:!>XkRm/Y1<KEjJSeHTdpG4qKVMkNK14hATjKXYNCQpY8HlQ!
Cb^Lib XZIFtbB@JqiTCjt*FApT=jewGmVK*%ApS#RL>1cwmCn9R=ESWb=ChqKW1!umLM16FHWY=hQq/mAlZ$ES
lCB/V: eqG?n/Lpw9\d8byR!K>RNEmW@$pSIhEe&W?8MlV!jlT=FPXbFL$W=iQp/pMlL=i4EIY<Tc=GFQJ%eqYm
eRja#G pP?S1^PF@KJeyTnpV?S1SW!n9ZLXwyD*pc5ZlX\1X#EK?Sm=tqHI/?T1SmFjLFe*C9qHFEES=X>RFEYW
&Fc&lT Z!H:M549!>YQ*VByy\a4cceG:hTR&iu98D&=HKi4W\W+mk>1FB>$J6PlE$=MMZ*hp\IeZWlVCt+BnbJN
Eutb#n di<1Aa:?S!6llA$JQTt!MMRnWA=RL/BewD!k*pD=RAXAjaD/A9ZLq9dt@pADkAaBDRacBdR9$EFAw+HG
+QRK^^ AI$FKka/GGke$CFA++EtAE$EPlSwE6BpwMPBTwCPAJwCNBZwKKBTwDKke1CbRLPAbkQNAbwLXAqWBVRQ
EqTc1q !AhWA%RLXAe$H&kBWD*RR1BnkBaBHR>$A6BmwCXAj1AGwEckJ1AA$FKkbWDNRM8BYwHckWJAJ\KFkV1A
#QA!h\ PwFYA1$CYk&$B8kpwHXAJ\P6B>wA6BHwFKBVkVaBdRa/Dil$wDPA#kR/C?l5wHPA6kChC*Ri$FckC+A8
w8>$9w BLwI/GKkT+A8BdwM/F1k/+B8AdwV/C/k8+H8AZwA/EGkl+AiBuwWcB9R<$A9AL$E>C4Rc$C9A:$B>A:R
MpCnEj i$AjAH$I>BHRQ+A?AjwW/F>AZ\B>CjRjwK?B9kH/L>D&dGl5kWC9VNA4$\5EitYCZytkX!dwqAp/baJP
$+q*8A tcBVJ8mWCjypkn+J5&FZAm8JidEeZ&jDmkC?uu%t#K/5\E&8mS>N9Ib+LjE/+9PJ*$X<AjF/+k8JH$N<
yI/@l\ EjFnb>dMJ<8Q$he:9!PIdW+&FVaRd!ViSD^AjJu6H@j4:R8GApXq+VWldHK<BGptHmT?uQkK&#<6#BQ@
9RqmKV hEbRSHHNIWRL<Vdm:eSD^E<pH4dX%D>j%PV#l!Nmd<4wYWTIh^D9JL:T>t<H=Iy@Y^9EF6yDkFZEX>8A
B#&J?@ A?Zy%kXY++ZtEtIN<dZEV!K?n9nJ^NeV*$B<w/*tRjIi+qPI&P:EKeR*Eh>M@DVmy^M@\%dX1J!b+jdP
T*cAdZ WEShm=qQ9KD*DS6LwY@j6Zjnh94**i/K%Q*HwC*EccIlmEP#dH>^i&ec!&8@S*5*y%GFYKZ<9%!1uJ*/
E+j@QR Th1jFN%FGKw8*Qchu>6*5^I*J?pdZJRnIep&La=h4?<R5WXFp@QcF9X/JKh@4dep%1tHy?nC@/K!H8kC
tZcVkS Ih5h9TY^V6LcScFHy+u6Yc&=jb%/cEJq&A=ytl#<cH*R?lDXB^QHn9Qc&\JG$cVJe@ZaWceitEydYuy/
$qVF\B k/D:BJ&M6ILNYpHJ>C!WuwZ1h4NRikGGVny^$tC#c??KDnn#HcS8EuBGJ&iN:&+#^p=dB^k$>YTa>jlG
8hVBRB +@i?=aZtXqWWq?yQcy#Gcb#GhZjeh^>CQH+6e9LRY4Fl8I\5&S^Lh?B5y#FWd$NFDlyp1MlBI&$D4*G&
5p^VF# j##SWG5TeFq\NHIRLkPPh8i+*DecPelu1MlB8K\*GnuwPEN6#+^LiMq#YC#LJe>l5j!YQIjFpq^c$CPY
hQbdFL $bLu5FmTT=:Danp6iR/LbdQpPT!YAyLu5IltRJ:D\88jQIiFb#%=Dk59hjIeFl:q=Dp5QLnJe%l+VJQu
/INKN4 5QBYJ5>l+TqMu5QCa=e<l+YHdBHJ8CCEQIiFS!h=Dk5QT9IeF6/F=Dp5%4CR=:D\kCQQaiG=Sw+P\n8M
F@>::C %EJ+byHu5QB+I5>l+YFEW>jCA+k<l+WuDupPC<<c<l\Yum@pPa!^9cPSk#D8eDS!EMdunpaP\nnI$elB
D4\GPy GI<=GnuIE>&b#=C^q1PSk#AihDS!EMb@npaP\nnQ$elBIqwVYR+^%uw$elDGCa>GD5Ka&>HIRSlQP^w=
#n*6X6 CPNmS!MHae#4cPRknF5hnS!EMicnpaM\luE$elDG<+^GD5Ia<>HIRS:$DJyli:uIe#kL>bR<l:NRL<l#
cc5=W\ PA99QZpPb$$$4MlBYjk*!ZM+C=jDp?h\Fm=^J<@lLF#KVy:DYSHDml!Wle9M!ZM+C=iup?h\Fm+jJ<@l
VGbhS1 LF\GT=:DYinNS=:DYZm>=Dte>X9Dml!Wlb=m=DteljyAu5Nb/CFFu5Nb1AQpPi#6dXmSk:#+DyHu5Bj%
G8XPb* q#!H9ck:=Du5^ii&lGT<b?R=:K$^4MlBZ5TT=:AZq?cV=:AZq>PV=:AZu#X=Du9S4aI<l:&+lJ+Mmh+j
D$ZH&B GXdpIC>iP*pPi@Hc!ZQam<?cdQJi>I\n#&E9Zn6=Du9^YbQu5Hi:aWWP!5b&nn!H5%H@cVw4G>>y<l#P
Z6/wyn ^uiLPwV5\\$4eqA&/k==Dw9IYiR=uI**n#!H5@F<!ZM+G?5n#?F5jP/$Nm\du#6=DtinuyQueDc&hiR=
hH55Y6 uI*6AHpPb@@C5CIHbcM*IupPb?P%p?h\Nu4lpih\Nu4Jpih\NpcqIM@lHG#Z!ZM+B/?hQIh#5A$n#?Ee
5eI?hw dD@Ie#nuCMPKHJTD:\S=D8ikDyLueA+?e@Ie#5H:Vb:DPZl>=Dtek*YV=*AP8p?R=*AP8pTR=*APi4tT
/H^CA1 =*APiy8T=*APiuTT=*DP<+aXPTnuLePKHJTDZwVpPb!DWV9Ie:kZ>uZpPh\L?^u!HP/F:#l=D9jCNyk<
Ae$X>W l*6l&$ci\:*tGFdpIBFB:H1TWW@Je:kZQq9!HP/F>=W<l$XpMZL#/IX6P*pP>$LQYjIe:wZ>F*pP>$JQ
ly+%JD W9Ie:9YcaWWP/wZQqD!Hi&HEE9Ie#5Z?m#!He@G/!HM+F*Yaq5uu+uMp#?FejI:pPb!LdTy=D8imQyQu
?b@<8c eC/&JiR=uL9W5CIH=cK?p?h\L8wSiR:u+uMt#?Fe9F:!HBcS#5l#PBj9H*pP=&J>=Dtem%/>=Dtem#yM
mdnKIc u5P=iL*pPb!L%$8i\#kuEI$eqIjZT=:DiZm>=Dtel*$ciR:u+ZYS=*Ai6q9pPb!H:Rh=D8ihdqmSk@L\
CIIW%W ibLueB/iP*pPm+ly=Dtel=\<l@QRT=e<l@QR8=a<l@QRw=a<l@QRw=a<l@P\HTdQ+h++hmQQ+h=+LiR=
abell5 *B9:Z@Ie:w*>PZpP>#:K5CIH>ea&l#!Hi&N:T=:D9dHNI<@l*6mYpPh\d*#9!HP+N#+n<l#8njyIu5P>
mp4Zq5 WZjIe:k*Zn6=D9jG/!QQ+h:+:>+mGh<%<l#8nhF!!HM+H>5Y<l#P^@/WQIj#S^lY=KB<HPPR=*A?Qm@!
m9@EpE HBdS*Ml#PB@:V@Ie#5h&qV!H<@Hbpih\Qq+niR:uu&qapaQ!5Y$k#?F<jKdpPb!Q:\S=D8in@yLueD:1
@9cLJj EZpP=?N#I<@ljL^i<l#P^*Pp!EH=YE/Sk@K^ZcZIRRX+:SR=1ADHp^R=1KDI5CIHFiDanTIHFiB+mmIH
>$1R5Q FiC+lmIHFiAalCIHFYDjTy<8BeiyIZ@BWlW=1CCmIkhlyLqw=KCC5%ZpwILLXPTkk86X=KCC&%VpwIL:
AQdF/6 XPTkkphX=KCC*/nIRRW915lBBZ>YpaMKQqcSk\1?XyGDeN+8GnpII>bFF@V*&X%FD8y#pIwe%Pe\FVtw
1C9N1# #%E1eqCjPTy!WJ>/FVtwV+PKHNTuVWWP/4NGSR:15%qFD8y#9wwe%Ph1FVtw#!$1eqCji%VpwD/Q1elB
%$cwK: jZ/uIkj%iXqFD5IwiNHIRZ$?XyGD?u!yIkj%NXZpwL:=KuJR*!E1eqDj9XZpwL=nXPTk9yNX=KC?FTy!
JdJAkw WN?nXiRknJwZnS#W6%qFD84dwTIH>V%FSR:18$XFD8y:8awe%Qh/FVtw:$>W=KC?D/uIRZ%@4!IH>Z%X
wn5dK@ SR:1?#eXPcn9b!y!WL@iKuJR9@+1eqC@ETy!EEdbm$aP/nhFSR:1N$hFD81*WEWP/4hWSR:1F%cSk@y6
&XmbWY XJGD?t%XpaQ/*cRmB@X:WEWP/9i$ml#W:&$XPcnjS!y!WKGyIkeX>qiSk\4*XbGDCmi1!EGFFTy!WGG6
BGQX!+ ml^WGFTSk\yZ1<lBlb6W=KDCm%VpwMIdXPTk\46X=KDCJ%ZpwMJZXiTk\uhW=KDCn%VpwQ+iFVtw@\AX
d\CBi! Pcn@umy!WQ>JKuJR@!NX=KD?%Ty!WQ@nXPTk@lEXPcn@YlW=1Q<YFVtw@:W1eqD@B%VpwQ=Q15lB@X>X
tTyhmY paQ/9/emB@Z@ZEWPG8BSpaMGDFKSk\d54TIHDTlYpaMGVFGSk\dMXJGDB5^ZpaMGNKuIRRQcXPTkATiy
DJCLB1 !EEDN1uIRRP&15lBA*/pIkeN8EhFDl4\qIweNPB=FVqw\P51e6CAh%ZpwAGj1<lBA@/4IkeN:KMmB\$e
k$T\K5 ymIHDV^RiSRNQFSFD5JIk6HIRRQu1<lBA@$1e6DAmIweNQAMFVqw+FW1e6DAY%ZpwIGQ1elBA@?wIkeN
K5V/lQ @FBFDl4pXbGDBk%VpaMGFc9IRaQKXiTkRR$1e6CkqTy!$KD#XiTkRdi1!EGDuqcSk\b>4CIH+Z1QcPTk
9JL?cG \Z8w!EGD^/9IRaQu1MlBk^6X=KDB/%ZpwMGZ1<lBk@>QSR+c@LTKHDV+HSW=cQC@XiTkIRNX=KAla%Zp
FZ51eK wCE#XPTkIa6X=KAl/%ZpwCEZ1<lBR?=WpaPG@FJFDl4!4wwe6F8Pml!$&:+1e6B8yTy!$G=?FVqISQGn
EV&\t4 <j>8Q%CSk*b:VEWPEyH:cQ!@&:e1e6DR*XZpwKFVXPTkweiy!EFDX/uIRWQQX=GDl9=ISR+c?wmKHDV$
W>=eB4 BSW=cPlHKuLRMK?KHDS5yIweNG!mml\$dI/KHDT5WWWPGucTml\$:GIXPWlE/KQ^@:Bj1<lB\>=YpaPG
WWXyiS @X6FDl4iZ$WPGu/Aml\$9FSFDl1?TEWPE6H/cQ\@@C\XPYn+D%ZpwPGQ1MlB\%>YpaPG@%NFDlySwCIH
*L!!^e nhlZSR+cebTKHDSmwaweNKJNSR+cedcKHCRm>>H+j<R9XPTkEY?4!EEn9qcSk$aPX=GDSp=YpaNGLqCS
tJ\h8Q k$c8WyGDSq/tIkiN9E>FDl4=wwweNQI#FVqw>\E1e6D8a%ZpwN$4XiTk*bi4!EG:u/pmB?*?a^W=cQiu
bK\ed$ XPTk*h>VpaQ&/K$mB?$^YpWP&tP&ml!$^%IXPYmQ$%VpwD%8XJGD>ulMSR:c+!$XPRmHi6HIRZ984mIH
A#Vp<R :Ztp*D>S!MjKjSTF9Fd8y!npK?T?mpJ?RP/6KPSZ=F/LR9=K:4iI1Ym\*ANP!BQp@w6C4mJdLew6eu>I
#aW8?q IY?^dSB\5?Zhb^V>R8/jKPR@!:$!lj^98e<ey4*!=Xw:Ia?Ti&kK8XV8^Tnp+/%6Rw&>%5u><aS<KhtL
1#hZQh Wd=X:u5u=F@L9i?E@Hi=F!Tt9R9quyBC*q98DTupTZKQTCFZ!d$mlh\p>+5W<n1=d/TRL=H:S\4=S4JV
!@ul&> w@!k*E>T!M@IjTYF@I:eZ%LIZ<l>@nD6p!@*?^Q!:uKjRCFQpQ5FC9pw8Y?kpPjTLkRw#!idPM4Neq>Q
AlFZpb IY?Y?*\K?Y1=q/TR:=d:CA4=Yduuu=DjqH9@CjpL8XewyqH>=X/FRl+n>!\W<lT!9/N<6N!dW5lB8cip
eG6t^6 pM?Ri#eK?Sc=B/TRj!Z*jlV!?*L@Wp#:=5q>QaW<T8:6KiST8i?ypE<kY#@KHZLQW!GjI@hKFQJNey>G
-Aq@c< 0000b025cd8001202b4 Page 486 of binaries2.zip
S<//iC Ij?PhtqA?X&=q!Pt@R4p*w=C*y9tDFA?W8/*KGTj*F>X!MjJjXYFHJH:Kk4=HLt*wyB9qh=KRu=c:lEy
EE&JRR =L@TQASPyjTTi%aKiS?=h/YRT?RiqpJiIQi!FHKH*M>T!F9q9ybC9q*8d!upZ<q>LwZ<96#9E6MBPZLj
N#uwn! T!H9SjMjKE?S?&AK8X:8l!upMP%mkjL=eu>MIh<m><pW<8N!9$\l9!u*#SV!6*L@VE\Hn1D=FbRQq@6y
R:lYXu Cut?*FNV!P%!n%\lu!u*!lZ!DZLQZCE@LQjPFjKj=B//R9/**E5Z$$HD=J//Rm/Yi?5K8bLthXB8qu96
TTk$1< CutV*HNZ!NjIjZcF@IDed%jIj=B:<k4=H*J9Zp!nQZKQZmEQqu9!Cup@8W?9pKjSHBLKnZIjWTG9pZ9:
nunLYm C9p!8Yi6pH<1>@5X<t@pQt^C@19cT&*$y*J9WCF@L9eK^VVGI@eLFZI?#XilQFL8E!9pR&pHEyV4=Z/^
AJuuH@ Rq+n>+\X<qX!d%klQ!#*iSZ!1*K@X!H@S?::mtu5TLq91=Cu!L%eld^I:6M1=LX!n%alZ!**V^Z!#&p8
dE/Ea? DiXZ=D/&R9=C:tPL1ZmI*M6Y!IjJQY&F9ED8dT9pXZKQY!FjK9i/FjL>e5>dId>Me*Wwj!u*\MX$<G=!
>hwyGE H%\lV=V:+R1=X8/LK?T\*B>Z!BjV#m$w@$#8qT9pF?Ti8WL?VP/hK/c!B<w>hIW<Wi/qK?Tn=b//Rk:L
BNS:=I 9ZYFjKHea%jIQ/M=SbTjq@95C9pL8h<8ypPG!u%*lX\m>><Xe4*el%jI1?S?9EK?R8:LK?RH=Q/<R9+V
#5k?EB #Xtm@B?=Z!?t<eQq94%CL1GhcqA?V8:lK?V%em>jIX<u>@RX<nc=u/?R*=L:?ky=8>#jF>PEQiR?9$Ki
Z\=9Ea K9j:FjJm8i?9pNjL@Z?FjB*Ny/L<tN\HYMl@q95Bm!WDYZJjaCH9K@eGFuIF:hPIewQew%uIIhy%B?Y#
%Jc5mA =d:ZR4=a:l<y=N9p*4^CjyD&\WV=cdqH6yD@KQeLF@L:NNiL<yh!V*FMl?dKjeiFQF#8+T4p$ZJQX!FQ
\1:j9c wd%XWc/Ti#EK8ad&4$Y=pjddSVpm>*pW<pdc8^dq4ZK9ZCFjT*9hwu\d#V&n@BD6w+9!$:VnEM19!D%6
WL5@1D lj!P*K>T!J@IQT8F@I*e8^LVyD=!D$5lD/Y>LFE8w9$5WS=D<>\wH!:*dSj!DLq@8=B4=D:8Rt/p@h^S
=:8&t1 d1Q>jXFiT@6Swu!K*H6T!F9qHySC9q48STup@/M>KXF?YP:uL8Sj!d*elj!!*N>h!B@SHD\8F<mtubhR
tF:Z!h Hmd*kSj!BLpj5bBu!Q*ild!R>1yF8Xu8:!*pXZL9amFjJQenF@IQ=N:GR5a^/n?M:%6!n^Sm&6d\/NSn
Rb@1>D W@tM!44?5>5/A8G&REhS^iyRT*8+1!/:cj=#uZd%NG:ePNTnHu<jhJ^tK@Z+PM*h#/&n?=%SdHAbn*ae
/&iWJX %$pHq>HJSS>MHj6iy8>DeE<>SNJJy8+Rb^>=NNa?N:a+Gp9STI4GWVTKwnEWncBw@ETnJ^w:$emJ^p$$
d*J8&! c1I^E+&acL^Ew!WcK:ebmh9C@??Td/c95YtF#%hYW6EW:GkQ&#Jt6Lh%&M6Zh+V>EX6GqZ>b5LGw#B<1
paj^6i Kt9^S!JFbi&6wYBLIP\IwdBkVpZwCShw6Q?y&VXF%cGPaG6\de\@tiNj/ZhA%\jdc51e@941!bMk8!p\
c9N*>d M>AYq=6\NymbYLQQH&u$6#lXVTZ%@uBd5G&b@c:W6uiGG\P%@1WB1DC\%Q=9bQ%FCVi!4DQT$h=cNDi\
Kuniyk bqX:8MqiW64aGIA:/@N*NN8#y*eGY=wT/<H\c+uZm:uq\Rk<wWB4R?^X&PK%^Yat*w1!k<6Gn*c/E:LA
bb=bDq +WcW#cmC18#Z:!6#PD*MhVp>Y!nm&E^j^a#+uMSu=!54ndVC4Y5L6Nm!c\J4uc/m#l>iF8kw1k%$hMSh
9yDZ?l BkdVL/4!l$K^?TJTdMI:I*NnZ^^C^n$5tb9/Fa4H^h?Q?QKEG!EB#t?WLHN?4YTb&:5qT^%jMFZpjK/P
m!t^kM 4=w5eu*jawwVhW$Y8:==>K>hZn>b/9wP!tLuF%GYPd?N55#^qXSF#w19!y*9wPMdTyjl<y4cT>*8Z@\L
#YM1%t T:jN/c%XSet8\Pu>XTW^L:E6&$W%HF>uYid<V55!%^idZ6Za6=6WSPSYBmMhmi<blpmZ@8D^La6dGh#V
a*i8LB bCytFV8wtFZtjBXY5XMdbSW/1KhXq1miMWWPD#itQPdl^yVEQpX%C=#WM/+$Vn%X1X$>4X!Hl5$1T@qE
\/q1F* EuW:ymnb=Tjwhp!J$8*adPi:+1DdXqtMd481p4MT8c1Qm?I+1+!n54m4mbPCPK1Gt%K+1WP<Inm4RJKH
>$=>w$ :@na*S?+$/NPiMmPn>j=\Vw@W9eP!Lu4eY*ZZFw$=$:K5Z6!:=me8mVH#5m6G*L4kPK:H8jlTyLY%:GZ
5R#Iah e8?juH1tlD:J5Vh!:wiei!CuIZ*CaN=y$Jp+*E\a:MeQ<^$H?HFD?@lB9eN\*tEkd^9CJ*!TPZh*<YN<
?dQM\y ^>F>*LniQ1KQH<5unPLn^?>\ep=NaWI4/NRAJ4b>Ce%ijI9u&NnF6ZQ^Vb^D/?dR5Nuc6IVt#Lpqm&@E
FuD>>R HN898KdL*t4FN%kJdbX#M+X:a:k&XcLR5dpTJY=Nqml$d4bEpYQVJW1etm?4\QHN6$4n*u+4Q@/Fq^j5
PbTIjE *J#b!lKcNFpY&/!JQMitVbT+N&?m&KtJ5\4eL>cl1dQ!:e&h!uT/A+:NummJWbQTqyaE:eC<GKZAnHlh
t4PW:K \L^aFeCetCiQGjaHHn&P8jSwJq%^>DB/ViL<al?t!4KiwemTn\:FtCiGGapQCuQ6#!h/uHB861eSQeTH
9j?9#h aMt&<+!==bkSe/jl\*#C?IS:LZNn:4dMm4@jMnj&n58<tH585?^*ZiZEZJ9Ky16VGhF4wnPP9j9&VP9?
^G5Q5H W/b<A9Ik=luI4MTuIQQ6#$HqPJ!6:XtwDH\c61Pae+>=InLL+buEtW^py6%TwuJm@44hLpJ@L<+eEyMd
H16&mL $%EuGE/eVJRPy6J+I&teiVViMB4VImV?!aSC=%a^<TSWYh#b^Ba+NYQ&<^QhYN^y&jJmP6!+p<A5?>?P
>+GP1m H65/V@6jk6i^1L^m?9!bV1$hqeT*ibV6$QJSTWL:S@u^4TBq^:YF66#+X5hYyNwiY/dDXTY$pVEF>ya!
amZZ=h YtC%q=RS*&yT6tQdTYZ^#!/l^PH9^4Y/6q!Z8^DdA65!1S&&=!Veq@k&tdLn?$DKn6M^XYDZ6NnelDPL
9ceqp1 %:1&>4c^:y1uTlP$V^W=ccA1VhSCXbckmcwwZl6nT^KiSY!^:cynC%!8QFE:+\6nNMXY1LSWbTbw1my!
N5N@yJ %qbX:1T^CcW8=^K98dEqTi=auAdHFpT%PC:Z<V+tcLM1T6BwXiTk%cw\Z4NnT^#Q&1tHei5nHQ5Hy::B
5a?AMM 8Xc*Q58yl*D?F@EFmj<m5YNJQQPa#HnVW6\d:/SnVy4q<F#mu$deM$lwY=\MF>H<lQdE!aAS#W>5R^IM
%A4i*P GhHM?HdD$cBlL:DyWL^l\:1G^QdB\eBlbc5&IeHREe%$dkieSq=^?Rq@Lj/6h#TT&A9m46j?n5edVG^=
\1eRem 5i>%k8Ept8u\L5iQCi%=eieT>+:JmeV1#w=Ry?$+AdCk!wmhiqV@\tp?MmaZ@1*%u6n@dY^tkl*Y>t@n
A55h:R @%uC9$k+TVHMhDySXiA+RLdXI?XKj>8!V9?!kJXV*6:wey%&1M1&+&P9#eLHbMjlE/G8b/E8IPFM4CL:
qEpdE& 9<QYJBb8=hBN5+:n@+t>G9tBE%8SLa?158Wp@5P+5/JSXMK=&jQXGhy#uT8J4%=%a+q@I1:M>tjmT6\4
XZ9Fhi nQ>#mdwWp&9:E\u9u#$#+b+ZPe>B&M5TnRyF#nMS>nIHA$PS\*!E9TDB&FDpMm5SZ&n@tC=KuJ8I8W+H
aVVm9Z I$TS+\^FVJHNIFHpME>lL*A^VlR=n!we!l#QIMG$WiR!$SFj/HB9aw\hSap#HuH=eacQIwh=D*8Bp^Gp
C&a1BA KHEkFJ@9eJ:&Vtd%/6WJPwy=Md1JGjE/mZt^8wk=MV1IGZdhm^:H*NhwJy%u>DDt@GJ%T&XbV%SpTX%C
5^Ewdy MWcHMCNSh#A*Zth5iVE%&*Wpiy^\DVchmB/mLqm!:Zymun%t^D^##Il:%ylqj<dSa>9jT#B%FVu%bRpq
lcewIQ >9c@!KG@n!?I/>qKSMt!RLlI1wied/9#&YcZ<MR1XneG+Ht$6$Zmb@pe@n$%e@bKqNwt%GV%#9E%1Rq=
ZMLAWk 1/ca:\Guty\1mj**!T>HhPS8q!VubBI8!#K=JhTK*Zq<beKwd>WS@iJI?Kj&^^bjSW^uaqWX*#++uR%%
S^\uVX &k:uFDY*&e@Mbt%^4E^%!$+X&1\uMbZGj8R/X8!pq>buXE^q49wyB#?Ph!:?unqZwJNPP9ZMbK%jNC1D
=%=>n: DYF@PBmIGGZqe+9tBXbFihHaw54&XWYXkbZaE<!wNKaHq<*4dDZKk1Ft/NC^+\@D<M8a=a<$G:MCLTHI
NMVccl lPFbBH@Ky^8?#waXkVXGnd?61d*XtN<SlE1CwWBSYZlN1EPKPDTVp5<jn1BlD8Zc+DIy%AXYE^D@heTw
>Hlpl5 11$518q5k#FVAE/<GE=ebJWXS+<cwY%4d\pWS#w/G!LFnWaXDA\^Z\R6YPy9DPBBcFtw4B$!XueAAk+1
FmHKnu &lyl^EJ!PN\inyC<M6CtILYhDYF=MCQk:?mEC=hH%cJF^VYn<ulBXcC%14%JH5k:NTMRcG4\N//RiZm*
?cbJTd yFT:y4W%$BEPNpwabLd/k&*A+NuAmay4FljSmQeJ^BDKNaGIYP>MSdXRAR\Bba*\6/WkPkWRG>4ED>!\
H4p\ke XmGEAN\lJPk^/K<%6C**N:a*BIZaEqntd+qCY\NCmkSBA+R$ad!5L54dkl%SMSS1yG584c$:qM/mwucC
ZClFe* qGcZX=SKchH561W6@k//*%ZqBK&b:c8wKn>p$nm/NdMIZ64Y%6=l\ci9/RnMtD&nt9=T5#<M+*y/Kqa&
m>TeVM *m#dWW6khY#bQH>4RN$9#KEDib@qAa!\I&Z?^td%#!kj6FEh\e$jD<w8D?4kjyY4K+55W@?&J4DW?l9S
AF&Ep8 ^!4@9K?>9aZ8RN8!11m?ka\9lDyaaT5IB%i1k<+GT/+J?Eu6/5KSD88j%IW:w:ybH9CHY>9D/4#Ky$5b
E1Ijy: 4tF&S!B5HaD&YZKX9<&T+d9Kp8iHt1!4mNa#9\*ilikB45YQKBE8ue/m66T/b^W6M=XeP#h/b15DVXa&
=hMCRE upI\$1nPISSwnN:MFRFwK?lQ4PlRL!HeF89j%>TY#t#yDFkHXwH%V&9ctmyY1q9jbJ%yDdbeqtl@XE&%
IJddPF <E/VF4c*La*i*pbWD/9J5B?5XDi>dp$$G<=AaiBAZS1&CGHXnLT*4dRP<Ky>e!9wR8hYYAYq/6tCGIa@
Y8!ymP Sj?/yp#>eR56>?mPQy=IcjRP%@mdk15uVdRKykjy<cN/\h6I4X\kHF!/y5bQS?Gqc/!:mi&d>Xek%*aX
m/jtuN 4TH4wB\WImyDm&DJqWHRR#?hPdd@eNL$bBbND*cRQm&Cj/+cpWX%+WD$nT=6cy4XSJe%9ZPy:a?H%6n?
:&AVM< ?My=uT$6q9ycBZQcw%hdG&wJh5mt&PaHRIjS@e%Dne&nS%NiLVSGwBLlTDm1C%cuI4+Ec6H:6nMpG&%1
nhDyqC upPYZBu\4+naM*#?n5dtRE^YZhkjmtdATdiH%<nKwKitZEKI?!k4^N!nP+PNK=4C@qYYF5A6DnVJh:pp
%jJM6h bl^RNL5%%B:8\E<Pa:1@ycY>9c$IP*cn14=IGnP\yCc\%yDYAYNlYjYMGjb@=c8IPT^^9H@SV%#4Y>hR
C\^hwJ AQlHcCAyKRq%N5V@/:lM/9#SEHQA^PDm!W$HmpGAleID&$Xl6XY??ynD/GYJ%Z41%PQQ\PFaulENMKSX
-AdnX! 000398889c2001202b4 Page 487 of binaries2.zip
dCR+Qe J?a5wE8eNHueiP#Q=GpTbwdjn5KmY1!BlnWTbBXX%e5MKlZ=>p>!@D+$bkTl8T?1DT^4ljGKWiI9d8@5
EV<^/A \J*X5D&G9mdaEa!?HHIwbt9H^QHC\^ejelltLG&JGShle&F4pX1CWL%>4CS#^FnQutGNRcAQL&@9dIn&
YlV+XE qRCW1mj@qNW:TBEdSVyLGH*c8w:b6y:dL5hhYt%HW#\C#%$&=VN1R+8Z6weCddGF<G<kR*\jS^Y%8L!!
>>4McH WtpFjDVnkdB#IR/GZ1Rlh4%CXHZDe95l@CM!$iGS:W<81J6i1d4ee15FkyhbuDw<<J1/!8LK&hPN$9IF
eTyWqQ yd:bML#Ck:JTu?T#=6dY#T&8un:HKK88K184nJbZX=XZ#qRHXhZqFSIFpHLKL=>RZqMqyhL1?jQl#\8=
Sc>qG9 9Kc$Zpw#Kp8Q1b=jJ\<1+Y@Pq1IQ<1XWY#%@u9^uM<yq+e#!/DuP4C!h9=Cp?bR*8/y$b5Y5Tl<hXFH&
cLk#*m *I1ciSZSe/?5Lm**XhVMpAiLKLhKZZ#X#K1//LqW?Ywp4!$6m>bYXX6YQY<GmjY%%YX#lV!9HAch>M@t
t5=F^N XhTy?1w4K=SWP4>PHeA>nI1?t8yw91>m*5#w!j4Kb$qiMc?8Ry=KVYt61l5PwyYAYB9>?#Y?5uuqNbba
<Q&j^D P#E1%6SJ5dc5bq=6/aIKiXBSN><Z@ci%5!w1w*?>hq/X!9hX%=VVKhk8du=NbXZ%QCuYX6SEe/NQG\YX
GaSJec NWFIC<14!1jLe%=RWXM:t@:=klu%>K@4K/d:1t8qZ6VQunhljK&9Muw\G&=6XK/1mpy\e6WYyLc8^m1w
^+&iPl 1=pj4cl&@PJw@jnMLFpYq</4uX&&eQIpeWCn/?u64R*&ymct8jKF&%jVT?S96L:nWMd9PJTh?lSwR&Y&
JRiI<c MkdGY9Dp<K&#FWaqHhFPM#4TqWj1bSh>puYEuaaaN!&4YE$jKdY1cdNPJmL:54nn8A+9a86#+nIh@!Xi
EFdS*C q5\SLbwWa+e6<t8E=pXm9wDm<&AI/A?9mVdHeR*9:Pycj&5w&5lZB65CFY%NPGANlD8m4VHq!pNw:?F4
4q#ALD 9RW@^IWw^$J$DNeDQX:5pRNkln?epBEDK\/Fq^6mBpR<\=L&l8Wq<Z@PqmtP5Ze8QVV8Z$Bt/cH1*$lM
GVa9J= dKp1tPn\n!jG@iPJ5cXYAX\EnA*CmVZEZ=$NuAkVCHlpbb*lmQWCqAemK#4cw$QQwL?qjXt$BL+qA&H/
j8Dc&M IlXDTQlTCadd&/l<h1MRSWp$<KM51R1$hSJwH4+e\Wa/k6eR=?TEi5!Hj+PjEmH^T5EI8K*JH&/KG4Zy
%46p8Z A%ybL$BFk9+&1V5SiL*w9b=Scd*NhqXQjBqE\#AnPlmbZtb>C:aEG/&99qtB%bbmY/NwPJ\bd8?MDy/q
m+iSDX nLiFQmTE*W5Na&IMRLKT1tZ$$RHjAc*BeF!S>WXy=alSl>MXLSkjp^h*GG$EE4QneqSDkAYh$Zi&JMd+
mh\tdF XSJwc$SnZIu>k<YicR**+nLJGGc4N!AiWauhlBd#d<mYFu5t6l5bY^BnXC5S6dTZlPBVYeAESNubw8YN
@&X!pn \wyY+tlam&Kc+iP$SBulTy4EXFLmN%wW*^BeBt%@mVCnJiTSXT$lQ&ypT!lRN4iEI55Eq%AT6ek=@Sql
u1Fw<u wE5wmN44Ek1p^mXeS6TKq*knw:c<^BI!:TWYpKZQKmAneWt5/T@?iWk:aH!8*TkaZ!a6lDc%cSaG/JJa
D>&d@9 t/Fn8e&K/Fm8:I1P^eu?1e*&/F!84JG8@#=1u*REKI8qa:HNdPqc9?8@XcbN^*Jq:HR56yp@ue>eGESL
DW\9ll XkVYSPSQnAE$N6?!lTbpp%p$MZ?FM%\cT^Q#lh$$Ib6M1LH=!ywcu!<N1%b8W$NJnJE%45A!8MdqK?N4
+Hcn!l awE$^CbYbLjkJQ\ncdFN#HjDT$68ZH:W1l8Z4T!<hB@EJE?J*c\dZ&DbiBMKlME*Q6ht@a$9W1bkl^I!
+d!TV% XeTZKCN^jIt!GCiWSM*H<RZKq8^R+9^Q/G>V/^WYFyiTGB8!:Y&^ine!Kn5XKT8#W/p!P#8Z4uRy5Stt
H4@j:l ua1Xyh1qNH4*:Z&%%j9d4Np8AM9A:X!8dN:P=babQKb+KX^Vme$\:qbIyuLHatp<h!^T=uVHa59A:ql1
44Xt$Z th\hT=WSQ1a+JCbJT?!Gibh!bc^*AhkM?G+I!/kjA+kEq=ZEYQthTm&#j$\lnnyLamaCHI861RHHWt8!
XeV<ii \LFWVS<+F65tFB#Lw%MM#wX1$5G=QDwN+V^k6YatuI86!R4uanX@+X!8ynTe!^NG!:HFNQHlZBmhC+ph
Mw%MAt w>96AA:Nt>*W:Fae6V\:nP$5!*Fmh&XbpX%HPHK/%cGdSaN4Cd\+JVHYyhn45ltcTl1FtRt?1W5TLiBP
@uq:LE lXFniN!jn4ejPjYyXBIPLA85DyZa:Wd&$$QnWWteIeq^5GY#&4kBap$>Me&c5NVE=EVd>@k<?YYdpC%N
EM+$ND /\ubbQ/P!a@Sw&lB:AuEGy&5dL6b!e1$GhN6nY*WNGlq&ieLw4hXVW4E=pVuJpy5C!6KdHN5JhdKC*G4
tqlkqB T&L5GqcYk*ZD+aNLtC<e<wW%\&Geayp&4L<nDS!^Pt$bN=!!!e+S>%%wN*8W^Jp=Tl\6GYKc!?H656aZ
Td+=/$ qhA$Xwq6q5NYKlh*ktcZ^E\QPCKW5ht^&G+#h\VaVPPJ*<PV^$&aQKuSdhSYXX6iZi6YcN&M?EwQtiV+
=PGATe /i&TDX@p5mS/^+lLu:VEXXC&i^?:IIwK^F!m9=EmJbdEL=PmqijRL:i&R\&$cCw&N&aJXWumuHeJ@JT+
a<jiL< YViCLyaH8YkwYRPXyDm/pMd=Keq&!jH!:hPBeM1N6n<Ra#wXbW%S6\=4#6+l&=1?h!m##iR:qF1V?wpu
GPVL*A w5!&DtYYFhilLNcwt\m\&ZkhCm*#ZYKSNbGTWGR6WE555t#IDpZKyJ^aGLW\J=dRkkiHAtYJVm!$G/aV
eVYpbe T?&LJBJL:Y98Ep66nZ%CYZSJSq!J5w!nlR#j4<V8%/HA?5y!LmKqh!tNh4+P^dFn8hl!^=PJ/=HnTtM/
V&5CZl =4k!i@<eX&V4y8NKauy4Kp956J$K4L+:Ytn4\qYY%bP4LP4RKePlZ+<4ei#ia!HWM<h1R6^MSP\b1B/Z
R@=li+ &4lIwDGCnY/JjcdB/h>IXdD=T/D@VZSP5F^MCpaQauLq#Fm</qnhtqNjG4NR\SES5%VBDcHYL#kndA5b
Y^el%S HAF1IaJn5b4$h!6YK\HeENGbjielSZTK*dqWVe8:DYnWuLp#\nbJL95%DJEYHY*=jA:nLh9hw@Wn#wX1
#*8<pW Waud\:HYp#kC%MIT=&LdclNukLWE^dua9m:FGcEY1#mZY!6auI9X5ldH<8lcF&i>5=c>8BVQV/bXMR6p
NWYqBE ZBBX!T1IYV*nnFmW:N>ZyZl*:a69uAG$I5i=$LbM^\Xk4h%^KXeLil\B>qW?#kD:$l?*N%86>uFG&JeA
FD*J66 PTKm/+KeC>XmIej!tBXEdwmpna>>4bE#RC%Aem&uXWq8=hGqT5=jZQd%T<+I?/Itb+S6hbM#\Ldp!SGR
tK=QMF /pt4%W?8^SQem&*4yJ#Lda8uuAHYmm4uF6/&#M16p%B44>\R%wI5%*/tLqqnHdNG!/Wn5lb88bVZSSh6
d5?a+y LV^$*PHwEbSw<:KX+Mmw14VMcbbib6NCyqB+iZFkhelc&BR>F6QH+^$uqiNZYD\h9&wmNwQGSdae8S=W
&l8D#G jAjdZKhql5$jjF=:Y>S6&id^uBBT^?/6H8?yH88qH8PlH8@lGihyH8hq4n\@+!PP&kMwJRRP6RXTmwaH
P9kY*? 6j6RK%j\?EC<>8BGCaFwdWGP4NyWPIWa:*G:=:mV5/4hqh#tSt=@YnG49?X^+mwl!HSeTmj#u+:QT%kw
?ETwlC cEedDSH@$5DEeeYVJ1?aGJSnb<yC$$cL>DcdZ85?d&k9m@8ZJaHX?Hu5d^FjDKK\BK*NedDaW&le&my!
#Z#QLp Pd5:Iuuai$E!EL*uXe<44cww4qla+a!bJnjLqD@E==6d#V#QTjFdlyu\9/t*DhNJJ=%&4bTHt<FB$#ZI
b&1lq< !lG:<Z4i8T9$p#5Nw@y<ja6/dL4Qp/kZj=F/$b14d$?QVjhtJi4FZ$E9dnYMp/:Y6/jHyki<mZ4^u6TL
ZXaEq: FTjy&>Nn$/?#E@Zmd:IjYhJZ*=+it=:P5i<XL9VC?Q*@LY4=!DAGQK=9V$>N=lG=4u1^/ql>j*15Zp#J
H/Fa@! e>GL:h8jY1L9V+@Xm$l9b:*+GQSCn#6:cII^y\upAewC!kdKAiwFqA8WB>RdKB?wAKkQWF?kjpCFRQ&B
nc/&&6 B8C+FYk\$CmkjaEPAlwNNAbwLFA^$MFA++APASwQNAFwI6ClRJPAJkMhDqRChAVRFKCyREeBqRKXAbWD
uL=<Ma #RTcBVRdcA:RZKBKwC1kiWA?wB1kY1A/wQqAC+D1kSaCHRP$CPl+wBPAFkM6AjIDNRA%AnWBBaCYAm$D
\SdlD6 ckbcD6RK%A+WAnwSKA#WAhRJ6BJwFhB1wDXAJ\G6A#wbcD*RB1CNRKeAuR1$CYk#$GqAy\PhAZRt$FqA
+MpCYA b\PhA:RF/F!k<+C&Aq$AhCHRSWAZA%$ChCuRbWDZAq$HhA9RuWB*Ah$NhA@RA$AQAn$E>DDRw$DdkJ+H
BDWh!i ikHwJcBZkX+Dil*wDcB*kN+D?kDwR/CQkQ+B>AuRy$D@A9wC/E8k@\B>DjRN$H?B6tedJ8mXCZyqkq/b
y@8e<8 ZmDRK^Q$!kT>MpGuVNAyE*VKBJ$!RchM$CeV>MpEjVIHh5NZbVDNZcFNL\j?k:eE98S:RV61q8mGyGj*
j!HTLX 4WDdIW&VB&aJyNDTF1$YQX\jDJ^DF@wkq9k&caZw<j1RSi%DKB^e1hXB/+M*1k<a5E!uH1<Q&XIj6Dyw
&Lbb$D jSD/pIMnmJK1REi+jXWk9CJm^X\4pk6%%&k%/XHjF/dWB:Fe8da#lQFy<akCRYyq/Gu/+HHRB:YEZ>?1
dahd&H u1aQYR:/wG>R#>WH4>AHjW8$Qpl>!Bd/aB>R?yD:Y9^681Hwkj1RI\:&4/t844Mnhy6bM>>H<6A<K%kG
CZ=N=Z @65b5!54QIdS!+aap1h&HIM1JeIeREk/Nt+lutZ:q+Q:TJe!>c?#EJXqGJeT9=L+=db@bjcS:t%^@<1n
*4=:ty #5=DQN9&4#!>w48lGWa@Kl>MjBD^ZPK>mSeR:$M<u*lj+6F/:mF?N@FC+uuE:!J?mi%<5ka/:ewGh=d8
DY\YAc Z@Rc/D/c$d@Xu+:ytp$/S>N41*6a6wmlaZ6iD>6K??VRFt:RQ%D^e8KZEd?WiK96u?&bFX1KJ?m^=SXq
9R\>># 6jwdDZYlL^B@pjnL^F<n@n4^N+m@Tj\9^N?*%d%Znk!DkhZd59j&anALR#&5D+q@SQ^n+y<R@=V+Q+q@
i&t9%9 V9^LY/Z:bIjmd6lZ^L<t@k*^:ZT:5+tVcylS%jnYXt6&Dt&\y#S1FQF>/b>Fd>^B^EeVH$N<LQFm+kjV
JdmLI: ?*Cb:e@p=NAGj8yFGEj<EPLndjBi8hbGj?y!J>kA8X/^AcDTnwuED/YVJlW$J6u?WX+PdSmw*w4J^A<u
*@F1pP ZpL<CPJVmE?qck$/jw#+WeRjJZ+h<XLmbeVLme?$uW=94>m+WL&!5+k@SH\&<VuE=^K9JF=FjB=^H@F4
CIB%Im me?*@dH<dLqBw9y4D^C9IX=L9I:+A8L%^BeTQ+d+I8IQ$1*yc@64BVt$EcQXDyuS>86++meRZ$^<CZE@
?KWu5m <Rdmh^J9JN=EQEB<KjFq^J66y>HZK*cABC&u\udmIiIuEk<V::D>+*/>dV6HKpZ4JL/T?C4m1&*@6DBQ
GQq5Jj :VTyiye%^E<m9w:+!eVZE>>k1/q@9u&uTuWYG+tjR9^W+y65@*bA44Y#yiy8NlM@#RaetKh&9qS6%8uE
PaTENp #!B?J9G#mJ>N@B#mY+mjc/6=WG@dVy41Vy^HjC9^C+ljTQ\m+ljd1l1XI!MH1t5^w>%R4k!jb5:6jYdS
-Ad\9I 000a68737d6001202b4 Page 488 of binaries2.zip
?kB%t? $qBnm#<TCT=h+#*q&mFunqwbDJm=n!&lT1b=#***&h8&1%GEy$?P@AP$91#hcb%bL!QSHX<uuZyR5uaH
CmC8LE /4pjJH4PT*?V>4!9d#&dw=Pi#hHJVS@$dI=PinbHJ#h>$LM=P5ZP=9R!bPlCi!^DuZV1RWq6?>^nG\R>
8BCqVi S6BJSK*L>li*h*d5iBXHRT4%?TyB1Va8*Jn?KYF>%wFnuFB#a+d9k6iy9>Ry9dS+eRS*X9:j6uI/8y=#
91thZY !p:>*69jc*4uaQm+eN6*@>S5LaA*A/?m^<k!ith5GJ*nuG$W$JpYKPN5edN4LeucH!nQ1\1Eq\YK1ui$
c=@1yy ZdciHV1pi<54b!=5ZBF5\8nb>dY?MqPi\^CQGS$LbMZ<@c^44SQBCNC:MZBaMFVlam@Sl5M4HibTZ/+N
?^Ddj! B@yyDGjk<GtMaQ^h?Pa^SnJ\&F:5:wK#Z!>Gi>&DWS@1*b+MZD/\I5djLRC&F/P?Q5D&b8D/AS9F\BWC
6HXL<t &=iB/\>5Q\b8KLC^DN\\aMWM*B:AJnB\i\Kd!MAXAV8Wkh5L&CRGdt>kl#F\?\Cd#MCNAua+A:e95BIG
@WBylm dn>kS#B\?\Pd\5AhAP^IB8=AaFMb8IP\WYQk^8DHHRM*F6l$B1+aYBpDh#C\ekb8HLAKBt+<5JpM*ASk
h5$EG# 5^m+R+HNaiAPA%dJ\E$GX5ZAHRHM^<BNAZa$A*ep5BwGdm1\YkaP^^q%DN\$@Bbl+E1BLYDkeB%kQRNZ
@!ACPT D8\aBt+G5GMbPDS+HMjA#RJ&QAM*G>kJDN\e@CBk+PaCY<LA\cnW<DN\XeAcGDlek^bk+I+G6yTB1\G&
\YJyAl nIG4BhdM\PHK?!ADN^@aekb8AdAXDF\>5BaGdmG\Xkd8GGB6DN\maP$MHEc^DDF\^\MLM*BLkHW!eLnZ
jK!ty& !mwGD6i>4&dktwC6aiB\Pi6cBk:Zmc%n+QAL=YRGLkl5QRP*HNkGBt+F5I$MHK+hQwYBR\iAVR^eP:DN
@Leu5y DF\I&GpM*IuAVtjkeIdqDAaPX>ii!eDlh?FbDF\u5LMb8JZA#tHk$DFtC\P*G6m=DB\8WD?QkX5L:H\G
^YeJ&m Dm&FY^t+heA8aPBPBualA:ei&EWM*AbkF#N\cG&=lIE:BhmqDN\taJe#eJ8BZeHAuRd5Tkd8hGBZMZBu
Ib?qjl AL8ckV5V&QX8PJ5B=T^k##B\b\N:qwE:B>l#DN^YaLe^eBeBi=tB8^laNRPHh?l6B8=&aB<!eD?F*+pM
ia=u?D *J*Autjk@k@aC\#eQjD4>6%w&wS:+Ze1A*ej@Ja!eQjD:*RG:mH+ue9A@S^?K^t+=+D>kIH:A:AdGdnu
@4pBNP kh*E\L$M9!5a8Fjk>#AG:p@\P=tBi^ZaAR#eY<B?#MD>FhlBDN^:\F=u+N+H>peG:8@A*tLkQkV&ARQ*
5H\&?S EdA*GLmQkd*G\H$K:CMG:nNkd#J\@\L&CkQ*JdA^DN^Z\G=l+Q+NdDRD>^>k%!te%\**Dj^&MP4:Fu+:
Ljq4u% Gdn6<L5tNR=Fe!$Dl/d=p^k+>GNi^<DBnVDZM*Aa=HpDA+edVY^p+HDnkXMbPA^E9+tB\<Dpt^t+jMQ\
h<j11W *M@AFRD8RRc8L?AiaiD/Ai=lB1+ReI#&\P\Q8I@e=q*W6JGJD#kLKB5w^!9nDieC=ZuS9hW\<wEKkQwA
w>yTMc >RM1BPwQNBSwGNAiRH5CFRH6=WZHceMaBdR9$H=A?\MhAHRk$EFAa+DGAlWDHR\$Dtk<$ATkR+EPA=wM
#V?kIw hAVRFKAnkcaCHiXF*#@DKAYcDqRPNANwJ6A5wNqAe+DtAqWCXRH=kI+G1kG1BcwDtk?$AKkicCHRMWCL
paL:EM kI+FPl=wCXADWCNRE%AAcBqRM%ARcDuRC1AYwDckh1AR$IqAacAIWAhRJ>BKwFXA1+HYAK$FPkqwHhDJ
HhY%SC RP8BNkB6BDwFcBQRb1DVkE+HPkQwVKC#ke+B&kJ$H6D=RF8BLkC/FPkKwC8Bjkl$F>DhRQeC*Rj$ENDD
&<8b1T RD<HikVwMcBjAL$M>A4R1$B9A4$F>DdRu+H?B9Rl$D?AQkH/FPk#wH<BjR:$FhB@kL+G?m@Rhy^pBRI>
CT\?aB M4%AwEet/JEJitTCHytkR!dwpAp/bIIPtcBDJ8mRPRBwINBkwCE/T4!PE6@Nw5RLLn<kDht#^4TmIki:
8A\GQH =t!e9#d6:c6i@1MV4u$wKE#qhn=M4yBJL/HS8VRWc5qEQXXXqhNV+T1DDWY#Y>FVCK@MGXQq1=!SpZ41
L$AayL !<w#eX$%6VXqtcmu4tJlZZFD5^HC!Cci1!hdL@*NS#+4Hu46&p?t?%6c&69dmnBamiGdh+CQ!4h9*@/6
y/dtC< ^*ea4q&R>VRt@*6X>WXqB=iNH8%?h/L%nB/htZwcM*R?wW#XE<yIQaHXwZTj9ckuqQJ=?j!SSu>LplPT
tF:6X? >jkntctu5Vth?:QSXp<!DYLZp<IQyCc\quijI$b#59eLV1M$$t1$tTePZSJ!id<YqqYudH<RM!NFC>VW
BEQac* *6mbmZanHAp*b1KiTHNLR!1e4&JG!ua%$6GbpZw\FeNNT8i/<QqSV?u8WnS<F?<y+ew!$qP/%=Plu4J/
J#m98? ?y!mXLk1Z**K<>tqi%#Z1?ymn=8!u5aMuW<wW@YEMqJQyu4e=9TiX&GZi&:*C?6c#=&1HtdQ:XJNq*98
a:/5?^ XQXp4PePLDN8QuIn91h+:CpPB=P>6%qRMS^9\=:eA?@6>/DHhZ*\Zi^^p:^lGiy^/+N6E<aZ4b+<!cZH
ccb6*1 #i>Tm\u%bKVFVFqQKEQu\&#yW6ZDjbNh/8u!t=!1uuDKHkYii@KiYhaVmBlJ*q!5JBAlbVYei>^McKyX
iwJPi! V$8\kVqCT9LEwJ:&l8ZJ/1q8YJ/!u4!1FFEEB=bX#1?FT\<5ddq^t:mDR>cNc>:?=VV#C#kiM4HIGFL^
eWT#w> nZGq?hVt!Vh?ak#=?C@YHj+Cn!eYiSc?<?E$Mea5t=YJ8!jG19kwpy!Q$^lVue@#8hbaNRQ%mDFtmu1e
ddW=TL ^yn^>dBc1DL==1VWiG!lpy&QR%@1jD/N^8mM%NMTTZXhGCt#CCQ6Bq5TqHGn4eZM#QqAm=tJi8C%!Mna
Q$445: MM&YybA=^tVZE#K\CW>&j^LGlw:*B<iaGcpuSe?W+4&I/=q&?Lqd>ZSE$t:H<8j+X@1V6d%>lbWke6Z6
PhF<GF Jw%C+R^HYcXDQuV>R5bS1PndaBS1YRp!WE>bC*Tm^TKp4Y6jCueR4<8I&4PYPQTq+85?A?en95w#WE@$
:AeJmW 1%#PhQC?!yi+jbW*h:T&GM!ie9CtJ?J:T18i=ZkZndV8M*$NJj%1\c<l4ClbQa6t?/CHY=8$H5:=mK?l
kG6mqV DD\9<VYWkZ4EGI4WPb*4E9ZA:VHT9D<mEqG!bFbX?hKPV!VGampMqMaIdcH5&SdKbCttLW\/C6WYTt&l
aH@1Q9 %BdK^HyCuiqe%*hm/W\#cW9u#4F$!y=dlES^B9Z1dn%*6?!bM9Dt:E^NbhuFW8$KMpK9#>w%%&j6%LGa
eyKX=c Zy?XZn$:i!#ten=hH+9%$HXi:LGae$YbH+8qGAQI>YJJp%+96t86F$5%iY$Wh5@b/<aMuW<*t\X9V8<?
V4a^jJ h:*qhV?l44Y<1i4yb4Q::JdZ8TLX<tb\qWCTFL6K+L66EWR>*YmXRK1yK1N@h@8&KK9i5mLqF^Qb=JMq
*@9iG? MiiXkZ4tLA<9LRbK=:wK9?@jKGL8LL*:E#N*q5d#!6TaV5!hycp@$:CiaGlGJ9T\8+*ySA5XuaNL+:yE
/b9dCM QVkHq?d>IW^=i/NLi%jRlbcqQFqQ$IYYJYp>uDe=qcd8+t>!$99#Q*mVZe?um&>!$89m9IGe=>/FN:A<
h9DGPi %emG?Rat4eenk&%QMtYw$T!*TN5i?j>llDPV+KDAM%ulVDeeP8$j:9J*<&!+HQk6aiB/\i<S>Pi!+mP^
Zn5t\F &HAaIiRe\utVuB>GCNuC\GGEpHMb8H\+QI?BK+DD<^t+QuC+qaH4C+eZMHD>+QBCBk/cC@MmB1+@HF:M
%Qd>i? \A&A\$5a8EH\P+Z$\EmCG\!Hq#L1G\YHq#F\?<Ll=R#eRZB+DRMHZ*Qt6R#eGDm<nwEdC:>HMuDFeHk>
XXeV85 A*e\@E=q+MdB+R$M*CF\?AMGdn\e*5nAVaDDH#J\E?H\Jkd8WDn<ERMHZ&9tn^t+!ZB+C\N*PB#i!5CX
6p^!Et \PF6DN\SeHk:A#eFDu@C\E&F\#5a8KQk>!kG4lRP@+?Bk@GX?VMGD4:M#L5b8Ju\P+&Bt\YH>#J\5?H\
N#MiQm Qkb8Dl#i#<DNleMHGDneD?XBB1+KDl>m+PdB+eMMuA<PH&Hkc8B\G\NZC+iQMZB%eQk+A#ejDu@B\C&A
Ql9HL= \!ea8Hw+jJKBY\mH9&VknwHDy^m+SZD+K\d8iDn<NRN*Al\?#eA6l5QjMHA\jDX@!<DBJ+V=P\c8AR=@
IcY/!E #<DB/NX<lwF4k5NuGdkAHD:H\C&F\#<\eM9k<I<MHH#5te<#eM9l6=TBc+ZDF^m+hnl<maGDd\u#bRd8
J*yl&< SDl<laGD4$D#V\^eB^!?^5B%\8H4DN^KPH!DkX5Fl&<!eK9l<C$Gdk$e95*AuRTH:#B\/?D\L\#e!ZD+
\cy8N/ X\b8QS!?!<B6kMP@MZAd+jA>B8+WPH!jkV5XD9@P\G&C\\<a8M%\?CEDh^wej5VAuR/HH#N\b<DlQ^m+
>W1Wyj M?H\E\d8LDn<qIE:G\:@!eChA+ijMZBd+QBjDN!=eQk=A*ei?q+\eF9l<C5G:kI+@DeDh!Ee@wiB8\kP
P5LuZn 9&dkLwdDd^m+T?D\Y#ie#j=!KS#?q+G:DA/*M*B\Bl/Vkd5Pjn$M*C*\P>*NutQD*Rt@Ya#/:5JknR#e
Q?%4M^ *jCd\<DhA:?>GLkH+DiZkZ5Rj9Ma8Ijk6#eD>#D<=nN\n<J9H\d8Mjk6aPBikN>!K9ap\d$I9^WM*M9\
yI8bFj P=PBi\%?=#J\4<N9JRQ*B9^YMZB9\8<<B8+9<F9D\L$Q9@WM*Ij\8+mB?\l?n&ZkQwdj+^m+V?D*iAd8
YWQqNi W@k>kaH:J@\8b8A?l><GB8=L?G%m+L/C*\AD>#Z<LtQk9wHjbkd8Y@kNMuDd+Zh=cl!KulWMHN4S>$4>
yV%y98 @1Kl&:M*A?iF**$aPLT*6#DPD?*w?#L1!+Zj@Sm+QQnhu+HDCNy6nQQDCN46nQ4/\G?IWS>G&u/AWS>G
QG\%^\ &u/IkeMI&w<!eAQk>?h8>t\dD8*iH#L1G\!@69FyX4y@X?N&Ap:5?=wnhyMXEhS^lFXm/NTVE!4HhplT
TLHemt d$AjIIYY6tm%/PH/RMMM$IhI5#<ecNIK$iQ%Ia9cl%A+8FK4k>aHd%RjPl8$Ptl>MLKqQtl%$Qwk>CEH
^Hqb$% S^AqXaGPeQ81RHlFyKm&\>@Y=A<*FXWGG<L?<B16Jn*1?<KW?mCe&Y5:R?mZkpi#A9/tRDmmqcGu/aQH
cqyR=\ RS>p!^AMcHZwij1R=cAQ?kd%ZH*\Cu*R6$V4k>THdKEQ>kGqD:t9^h?tG+wi1A<=Yl>$588D>yBN4^:6
$NN<$# Ib55cR@b>J:ZNEN:!Kc5S<:Rb^6!ln=H#>D4yGjwhZLTB<Pcwhe#5qwjatjw>STe%kjDt1HZ/1D%\V=D
>pHN^c 4%h$cZ*RM@R/JZ^j/Bq/ujRM9W=8?1Bu/HZTM@R/8ipD#6AZFKdc4tc+*1%t%>!6J6p8wjG:1D466K=*
ja1#WH 1>G:%TTyy&j9XyP=ZYccp:&u6M6MY*T*Y1j*XP<!5&96MqPac6Qj+Z4Q*=/>=?>P:du%u4@y%cQ*@N&%
ia%#WI >9#N=F/>6P<>Hu8K\<Fp:&$YXI#:*tNQn99ij\>/*F%t4>:CXB8:=ZjQjh&/&Z=5*Y*j5p#8N=dp#a*h
Z<A!VH d<!=^<&Eyq4%hKQ>^9K1!yJ8N&aMLK8eZ\8ZHqnce8M&eRiH4B9Z9Q*LciaZeD^payE^yPId+$4#1e&V
yw1IM8 d@#EGQL^Z/\:@AWiV!#!LH#u\&qmnFp&K^N*V+^X<XEpPS?uMca/u?h#4dF1B8wSa<\W>VmNMiQ4adXR
-AEYaj 000f9b5aede001202b4 Page 489 of binaries2.zip
PRF9Pt bjLNTcu^&EIqP^?H96V=jB1N$Styy!YT/4y\%Y>SYZ64KNmTwI\ddT%tb5+HY5^M%AP9SWdGltt&LIZM
y#+&A\ MTc:uyCBVZm!?=M\NuT<Q#nG#Ek>KZ1tFP>FZM?$\<@h11enpua:qy>11<i?\pwR8iy&p$cleIcn4NIl
/=+d5X H:y?IiMwXQS6MA1%4ARb1Eh+mWTZ=:9$yXG@q1k>c+qDZ!1?:nN\Q8K4QAQ%^HmdML@Kq:l>qR69E&bQ
$b?/*n PZnVE@E>yXXQ%N5pnj6MZ$NJ9%4\c\k4TqcQ<DbBh+w$u:9+G54A<^JjR^twS+!lw6+tcX!Z1Ai>VhK<
6Gtw@9 Q@Qc&\JJt\!#15wZV4jhEYP^FAbKa+T&WQb5C&Y!^Qc<$^bKdcHWFp1Hi4n:5V6Z>J%aP6NM&6K=e!!h
#MuQqN 58i8CwTZ8R\XiuY*u46d>p\biHN&y1c!:GIyquu6<tP/H49Pc/iP^jR/4@V1$i8<h1%%Z8!^tHNFtS?L
9PPjyN ySkD!QXmTbNiL:b44ShLNZq6FHdQ&i9GDJ%QN=5Fd$:9Qui>=ZW@wc/%9Ku1/Yc#??!Y%:pm%jJteJXA
HlJM\E plT:T8C:dSFEQh%wqWC11T1nj*j:68lCbLTptC=ESp8KtdM<9LRaKJ*4K9!?j/Q5*El61ehmP#hTt&9=
5n\W>n NKNLphy&KV8hcKF$#MW$/6E^F*ZM^ZTii^ji\J$Ve>EDR!CV@89lchD?bhZqFj5Z:X>iYqeK#Di:4G:@
Dq#*&Q uuRDeAYa%AQQ6Gl<QWPuuy^m+t@1iAhcH\^d9KSi6Iw1&hwtuZV/H1jTqycm69c&5iWX$?jQ:JpNk8+V
\lQla+ hDKMdNQRZ^CGpRh*\q@e*6t^+%WeBWpciM&NC#itj$yau*W\*>^1=uqPmu8HN&d+LukMGV/Qn$:S!JmC
FFE>Ii VEN@y8wpYl9DiBHwJcBZkX+Dil*wDcB*kN+D?kDwR/CQkQ+B>AuRy$D@A9wC/E8k@\B>DjRN$H?B6tiD
%GnA5P tkF=kLKA9EDbRDqA9aB!kZwD=RMXAQWB/k6WCNVjVl&G%&up4FN/cjHmTIe@*QG@QAZ+/nHNhJ?u8I:@
^K+WI5 =eZpcq*c\c+I^#qb/6t*L/?9>bWbjcW/TM*wQh<*8#kWDm\N4ud@mJbhtTi&q/N8Lk8DnS4GWI<FnFE&
+\jbTt M?6cKYSlEG9DGK=\YVFnES5PQ6YN/^VP/%ajK5aI^6?Fea=^QRQZG>lIBm+j&J+MZAG\*St+Q5D&aPD/
6<<4M/ Am6m+QwB&+8B\:tW9St+@5D&biAGAB9F\A$C6l<DN^naDR\e89mNbiD&BXdM\B$EdAIDl$6hJnJ\a+Ah
?:jGjh !5CNBVcJkT5GhlkDN\:a+R#eIeBKGLn^\I=k+CaAt<LAVRS&JAN*KLCyDB\8WVtKkWM*#FIG:uBk$^p+
*lt+h* 6CtWMZBHAC6u+KaA1&DkykKd!eDlF>W5B1+W&B\GDmiXK^p+ZI=T^eClLe4H\GGRpKMb8NuAclm+PeB1
hkb\t9 GVl$*Kqn+HCb$*\G4k4aAkb8H4B/Bk:ZlS*D\NWAP=cB1\X&HANZB?^+Bt+?5N5a8AZAVtDk/uFW!5A6
PiCuaa BLcEkV5GtJ?BY\T5kaE:HqmAkV5B&FIGdnG\bR#eEtDNDB!8t\k!eLnIeDpDl%Q&K^m+JtA6DB#/4:W!
^e=W/H eLlp4w&BR^jGhkaPX:mEGDleNBqt+HA^jmeD%\=5FRPHC!lYM*AuAq9D\PEE&FwGDn@:%nF\8H#5bAb8
qaHaM! JdD%DN\1aB5aPQ^!&enA4RF&CkPHF5hNDN\/aJ5b8JPBuedA4Rh&PkP*AhkbDB^cT5>p+E+BhlaDh!1\
yl++pB 5^t+VeDPaiA&A>9C\J$G:F\G:uSk=#F\b\A:u+E:E>lYB8+5aBe\eGeD8=CBP\jaSR#eFtAZM*DuA48E
ZZZ6D< kV5Q&KWM*Fbkq#N\F\C:kwG:ENmXDN^F\K=m+C+GhnWDh!t\J%#5Eha@k6#LkD*yXy<Nh#t\Z#L18^La
HQkjJh 4^m+1+A>\@m:X\N:qwG:B6l#DN\Qkd*M\N$E4J1B8\Qa&\#e9eA?bPD8l<PJDN!D\J=u+B+C>kID>!ke
QN&eeP H5uAdaQD1R#ea*Ba!5A>DwjVGdku+ZA8A@eWHFa!eK<D?\ED>\c\G^t+6+Dh^MD>BR=ZMHB@leQDGLl*
cJFN48 +ZA!A@e*aAe\eBmK/<eM*KjADtLk@kZ5hRd8e&B@bPC?AQaYA@eX5A<a8H<Di+PB?\?\%^m+d+F>^MDl
HwuASt ^wh9y5aJ<SWGDl9cMR\eGy^9aiB\<@jSDF\9PP^k+HLl5JPB/\&Hc^m+jDle!<AX\PFJDF\jPF#H\QYD
F16ILd \@WMZCEedtDk?8P5Q\M*EA=QbiAG\iEtBt+\HG=t+Iaal8h?Bt+*\D*I\A$D*CMM*HDAQe#AnRAe+#$*
Gwj!Ph S\L8H/uHJi!@1*E:AYe:>5ltW$#u=>DEKe=y+Z\X#wHljBVPNiE<E5:>+D\S#8*k>^X?E?H+G5j5<B/J
l:!kaj PS1ej\HhNudD?V&kaVl@l*N8PE?Ge%5+d+X#aVk9lZNPPJ<E6I<l=&S\9tW@IQSL\KD*B^y!dkZuVhCq
SVQqj1 BPhFeM+D=#MPN8S<Be=F+D\D#mHk@ADc@6G8j=kl:jFwc$e:P64In#TpDS#6&>MMcd@G5DFwu$dde\WR
aNqKEh P6TkjSq6^&kZSy59&uQSXw6&YLT^Xl9Tlu1$IY&pcQ>E&!dcLhEtmjbG6CYmuSB6kMimjhTRhn/$+cF>
*mX61B Dt%9cFhDt^uc\>DYlZa56FGl@Rq6T$FD&w:RTR^>wNA?%GcIBTJm#lQu#@DdH4@d<b5e9&j^&\nuK>BG
SY$Wqd lQaj6P*k>!dcS6D8kVae@B:Dd##<Z5X9\9MN?c&Jhl9<qpT:DH:dwh$F9<*^8^66IikBlLaP6GPknRL6
V4uTjb D@mNn>>Qq^n!?\m@jjC:=kyDj4jkN\q?d?C*BH=JZah#1#lQl&NAHC<T^&<I@D:+Ea/XkG:GQlZwX4RF
&wA6My A>$P>BPku\w6#bH*\I9*RT@T:QEy^yFDdISiWlJc&1LXwwj4k^F%>AJ%CAhZcu*R?yAX%ajPB1$PYl>k
qDl8wA :C9$Rc8D%kilD>qTH!LN@uCkTc6En>iHHPEaZBZwCLi9CwSZSIy1P@^6Vj=\W%Fq5CH5D/@SP6Kn9m>M
w:Mj>+ 1R<mRt=6b\mDZiHS4IC@KSCPcGZwcj4kehAH&VIEA%whiy+?bDuwk:=BQXej9D1\mE+&jenYZ4+/mTVu
qL+#6* MZDiVe>n/BVjV8l=DJ$e=nG$ZW44R?\<ly:Z$9ykYQMaimJD/+N>HpP4k>aHQa?lW<L*lb:H$EuQa?np
NI&Z1< yk>/HpMuQa?lp=5?bA6>5A<wjel>Lj+&*XD$RH*I?e:4#$+hjhkiZbkm@<I@Zdn68:<S6nnEi6MbK@Z+
4t//lq VYi<GhABD+#Fitj5hjIaS8>=%jNK1!1KK^bYPPPt!XPZQ<RVa&6@u/?6!/FT>h*wMZeDA!1lST*^X&<^
l?hZ#K ybQ:CEb9McXV4AW&^:ue/CYe>+Z@9tuEBh5*dY:><c&8HuH1bKT%j<R@kV/njTR?6?$q<hX*8b>EqGDR
W@nDqj MCVVbA:GZ:&bt$+>QiFtdn=jYe?>AZw$4yM%^NJJJ=%TyMGt/V4C^GCGMQI#56A5D\TnQkNGjRcM?w\<
jauS9L IBn=GVD!M&Dpb<DI#+CSu>EQCEb@Bw#&nAFAk+AGA+$C&ljwIKDSRGPA^kIXA^$MNA:wEKD^RBPAJkIh
#q4&AE CnRJcDLR+WAqREeAVRGcCuRWWCqRGXA=$E!kYWC#kiaA#RY1BKwCtkjpA/wB1kY1A=wQ6ACwHtkl$DFA
^Be/uq m+CPB#wBcDHREmA@WANRI%AVWABwKhA!wGck=WC6RP%AIcAVkeJAHWChRC8BXkG6BqwDhBLRP1CVkhaD
B66@^d dRDcCHRK$KqAt+A&A=$GhD4RGWBuAy$FhDdRPWBdkM+FPk>wK>AFRBeCZRS$MhAqRJeCZRb$DhC%RNeB
eX>lS^ *RJ$J>BhRHeD*RQ$ANCDRA<BQR#$KNA&wPiBZpn^yjEZwL<C9R9$N@4!iB@w:>*%C!RVbHmMZ8JdI&pj
X$kFAR XFZqT@5LBG%KewFGp1?cwZI?LL&$BMiQwXBLJ81y111eukyZGY\wt6&Kc$:\$y\^Xd:KGStyy:/5QBQZ
ta5+\& XV%>VqE1ZJY9Q8Z=%NVYqGZmjPw1F6aXN#Ru^W**6:T$6:eX#R1$lN\\wy:GFNhXZ%S&eNuw$i=ZFc%u
pAQZk$ >PnM%NPawjMJbc1iWEd1Cc\Pyj95SV*N/V&9\tk>wedthP4bcK5u&bNu%=Pm#c\J4PZhu$lkYd4*8ct>
utdaK> 5VMV:&p+Et:MSD&S=ycGXDlj^a!W:W?pw#Mn>YA1ly8W#uZ=4B/8KlBi=6Kq>8y8QX!*dME#<Pd5VE*q
ywq@t> JKpbQq@b>*Z5+&18/?La^:&iDI%>h8p^T^KncJjGLCu4ce#R?aR!XW<wI@Z5:DGL!@q$ie#mWp?Z^!!y
^pjF6M /5uatCXFZ?p4K+&$J5e5LK6P&Y+kbpcKqtMZH@8+cuRZ^#=Jy%M!MjcyD:bNGF?$i9Ip6^/85E56HXTW
LC9^GM pba8bV&NGV1jWKd1CYYpu8d$:4N1wXLY+@NHG9$6TW=I%8PQbKaibw9yWp&ZY<!W>aR/$:p8%jKt%EN+
PLZ1qe \bKQZGR>kcV*GT5JSKlSML:dFpHW$^J5aI:<ptk$%NQi5D^bQhWN!%QYM<i@$y>$ReYk:naGL/9i5mLq
#I#t=5 q$X>EX=aWp^bT!TTmZ4tLA<9LRbK=:wK9?>n?icP%ya$:+?wb*u!y<F=Z1Ki%1Zy*1KMnR$Z#jaXbWIQ
Guq9yw F\XDM#JSV*edG+1Y44HFu?^6=X!Z1Gi=Q=#8@cF/$6bDWe@caCnh<!FMiZ8nT#6i$IWY5#^bD>iFFnNy
=JHhGc Qb\YK6Yd5+8*WEu9#@?kbZE>u&qhc%tTZliuSiA<>!/$CPYySt#MN#B=QdmPY/>K\m*uWnq+ypy&B>CF
WwZN#B G>M@Jb6dy?HkCtTRp&ptW\GyRwGK^8L!+btwM6:WEJ&/tla9nuV+\^*@!%MRnl%=ak/51HyH*\@4*eBX
<5#dTT Zh:!!ypLG%eEt*#l>8Z%6d+!hG5#+>8lZuIBtJu8*j6j*5Je4eHPue+8+$+9k^Q^puc?X=cZu8=<u%yu
HREPQ* 95>8!444%$puVww8e>h9nE+//VhGJ=&?1#it=^p8a8JVjQhGDI!QEZ84SeRMpS5%b<!iN:685Y?t4:Fy
ew:@Nd Shh9K6^Va<j9cX%FVhXm<dPDj#<*?ytkW<LHH6>MkBb*n%$#w!1Ty&?6$/*6l=MabVlqEwk+VaLmXFFX
:N\%NR @TK=RkXhR9HiD9FES\qtX5\LtZW6QRZ=&Hbn+LBk1MKbdnn+*^ntWq?iDailh+a#eL&AZch\Z4i@m%dG
%e@i6E Ea##!\N&QRPHFwYSDF\?5D$b8AJk8#N\jaD6\eD%BXdE\QWD6leDl@Pji#N\@aH6!<ANADcKkS5EdD<G
\Rp94A dnC\G^m+WeDGMuD:Am6t+A+CNwGB\&X*E^t+MeAPbiDGAy9E\BWDP+!BP^nabAb8HLDDGdlDkJW\ePPB
QJqN%I HeHAVRA&laGdCP^IB8=RaFMbPF^Yh^RDN^qaKRN*PLDyDB^GRmqn+I+AX5:AVRFY\eBNBVcVkWQ4@!\G
N9@b$1 4lVaHAaPF+^WMuC+lK/Kkb5J#MjA#RJ&NAM*G%kNA#eHYC$Dl$==hR\eL5&e#<BXAX9A\M$DX5@A+Wnl
1u9VZy GAc8B6m^DF\65PMa8Dyk^#N\<+Hh^5A6AHaCA%iQu\+M*EJkT^m+a+D=GdlF\Bwa8PPBBSm+E+A6biAY
#&NFE4 A%9G\C$B%5#A+b1wIAPHC/PZM*C+HGeFA>eE4IYBR>@WXkaP%+&&MZDwu6#P\PHKpBADl\8>\\\ePlB%
?d/wT@ MuD6\Fa^eLk+cnWDh!K\NR\ejut5biD\C*$hA+hLXW>t+FaCY<@A4RK&kaFdDY\nA:eG&CpMHM:<dYLk
-Abbb$ 000d9e151db001202b4 Page 490 of binaries2.zip
Xy9mih %kHd#MChDP\$Bt+>5NMb8A*A#tDkNkI:p+E:BhlbDN!y\M=t+DaBP+iB&\^5C\N*G4B#GdnVkb*H\J$B
$4DqTC :H\G:p^kY^t+5+Bh\MChDi^CB8+eaBe^eF8AZe#AuR95Ekd8QGCZMuBdkX*P\F$A:AwG:pJkX#J\F\G:
9m@Wl? mwG:GNnXDN\q\J=^\%uYLdku\J=q+C+D>l\Dl&j\MkN*HdB1B8+YaG<#eHeC?=CB8\5PJ#J\h\N:uwG:
kYL\hh B>kLDN\DeHkpA@ekHE=q+B/C\%IG:tE+uM:AQR1He^t+dZBa!eA>D?\HDN\L\G=p+F+ChlMD>!we4tDk
eGi><j ZwQD\^m+%?F\MkQ*B4ADGLl*kQ&akZ5Q&EEM*AjAZtjkQkV&S\d8I&B9MZD@AQaBA@eJ5Dea8E?B9edA
mbGGBe @R9aS\#eF<DibPC?BQaKA@ejaGMa8K?B*eLAjRN5NAQ*Z#n5aPC&\&Fucy!a9%nD\HukeC$Dl/8BV&Lk
ha5kR& 9HC+nwHLkeQ%DF\9PN#A\PZmiqRG4neeu54A=eQlJkc8AA+*M*B>DMN#Q\QZF*AQMuCFkH8Eki5Q8Ieb
:pi*qq 8AGAa:#u=pDAjiR&Q:MDj%jnhkIPb/%TBwdWTcj9eWwcq/+uJA^*Z^L1dNA^:*Xm1a9etMnA6SbCh:V!
kqNKi& cH$R?8DXdaqPNu*Iq9wRcjcHA$%cJZ1<Q8BcP4Pt6K1wQBlbwjYlb?8DF@WBN:1$:R^j&?F9c@KHt?BV
#hRB:+ 6CH5D/@SP6J#>GEcmpIjlEGm6nPEAiXKXHAL4R\>VS<<D9wkY+bkRK6D#>PHLAh>$Diw=?1DX&?W4bNN
dEwR1E H:KniX+=d=X!Z5$4=/$ibPAGe?dX^BdCuHtZbBjV$$6E1BLQE$BQA9$T/Ktp>!!Fy&hj?cjpp?k>*#i:
%6:t$* PBRPLA&8VubcylmK^1RSeB/@E6=ql8jZMqcW=&ul>YX+jmQBu6>KDjV<Vqdn?d*\ynI<#<nkK==uKj<=
V/b\dD +u?k?9=I^<>VjT>R@T>TjT>S@T<Vj$X8CP@=E@&:X?uj9Tc<^k#Q/@V**mD<t%VQY+S@t<4@dL9I4pbQ
FRRn:8 TyY<%yd#ZeF/+#c1N/VDZK=WmtT?jWb$:b6Z6kN8Qu8=Nl#i^SGM?9D8ntVk<DSV?5==yY@jHw#/$Lh9
#PZElN V\aPjj8KGH<Z6ZE9Su*w&:e*A+e?i/MaPQVb&=iBR=?>@Sm+wac::=\hN<^\>=&#+@a\*H*u:Lk>DZjj
*>K4Dy PV88!HD*udQn>nLejij58L$Nh><=P\=>Ck>u+NCu5ITB&<>\>+t#+#Ba&BRG:kDD*TjPnn9ReQiJ5?QR
I\tVR! =@EwBk=>GW5bPQSquM:AwT>nGRPH9w#qDB#/Mqa\ePmnPJPBR^@FYR\e?l:PaiAPM>^>+8\+>D&5a8DR
G%kW:i X>DH\KG9+NEM*JGG8$?eHae?ldWMHQwW%nF\MPS$>at#+>D*eAEDl%6?%VN\/H6+DAPH\bTQbiDRS@E+
MHJV4V Bk=>FI>u+NBH<RRGDu$WF#N\8EBnCRPHQwy?Bk=>FB5aPQR>DDB\S^989t=&HQwwLtQk$Ei^taFDH<Wk
K*^8*< A+e?m55bPQSSZMHAwa>mC\PHQw16DB#/KLa^ePmn&M:AHY8+?:4beinLGGdkqln89t=&HQwW4tLk$Kh\
/e>:dB NRPHQwX4GDn$KX#L\KG9+DwGDu$FV&dkkwc:4=5hl#/FG^k+DHK#paHD?QtuMHB6l489t^&HQw1dGVn$
d4u%A+ WV!NkWMj^hMbPF^4iRaDl?Hu#&Vk$Jj^LAaPjSuQb8DRq@EeBk=>Gde\eQnNjT+Dl:/M=#F\GMH@jAaP
%Ceuq$ jS/*MuDw<*kBA+e?n^e!ePn#iBEDl#/QF#N\G\%*Z#e:Du$iL&Zk$Jj^ekaPjSt9aPDRq@FKBk=>Gc>m
=6Y#cH +NCZ<YwGDu$b*YLq&I%K/KQ+SKw%/q:yw@lpcq8j<FH<JcM?>D*<FRN*98H85&i@D9SSjJcBR^@F=^k+
B?><mT >AG<naG:\uD*:dQn4nVejj958B<c:4=>h6^hl469u^%*h^LjQn98Z5Qh6<?P8<>\>?&#+^:m?Qb=yT@i
MuC<1D XAd8=^#jQ5A>\9H6A>^nHN<?\Q&C+>5H8JeNlt<j+F+^GL=>Z8G#q>1*D*B9eu#:AQeY^:eQeG>#jQ5A
@KM@t@ >&iD+h5H8L<bDN<?4@VFP+mBR^?:%^p+>LH:I\PHQub9MZCjGR#jQ1@$^Z8Dkj9eaQn&Ai+4k?Hd==Y?
&<JeIC iG<!ePmL>\wD>%?D+h9uFV=&1Z*:KFV<cAaPbhiaeVbeF5eH$C6>:Dwb8B!PD/BZ?6m6biB!PV/AkM9n
kP*lWm ?AB/ya@hikc8kPMD/BW?h1q>AAHZn?MD/BW?h1q>AL*CB!8%D&B*u/5E*FCPD!DklkH8H/uGPV4yyJNP
IVhceI 8$#!GAYFe5&b#%jt+mR:4L66Zq^XXVp>Fe/&@dQ4B9XX95wbGctut&+/HMK>HV%ZV:c/1b8QjFa<>N1%
aNq*R6 u<S5/itdh+CQ!4h9*@/6^*ea#pLV69HJ@=/%udu4*auYp&^V>K:W$=ml<\qq1y=RS8wJ4A/q??#q69Ey
Z4tSQ* u^h6G?>?R4Iij!R#>VR&y*N@N641TcbB:Hw!5CY51ChmNCh:9?A$TmP6Sy6=+6AqIbj*c&Fbhe4&B#E#
8kJmmd W4SA*Y&#/Wl#T$M1uK>mS5y&NhLStbF/MBW*6ch%djn<CqPFp^m?m@iW48EC86lV86iVwb/!i91ewqT+
Ek!eWy Kq>>!9QbyZ9eJMEh86Vny1!uMWQuE<yWQcGM%JPyH4e=9ihX&PYi&@*C86b#y/1H&ZP:XNQqun6XQSu4
pEBaV$ 8RQLnJ8Q*In9KS=:m5QBbP>6FqRM^>8\J@jAi@5>/HFhH*\Zi>!p+YW!$8QYB>5tnC>cQZtTT+?d*/WY
$@cNwq E?4JTI8b5y=Rl5/H&hKq1wj:J49W$?W*PXW>+bR>Cn#*=D&#4CeRMbK<8XlJIELKcnn*8JuRXK8iqtAD
1j5ePS e+TW=IqBQi$N!=QXW>&\QGW>iXXq!YPiDT!4uF<Lq^=a&uLnNuEHl/\d%:#>!&utF*A<bGKSMcVmG?NK
IkGZbj </uNp&@<^Bn!<X?5P@\FHp<5<m^<=<Nyaw^bNm5Vh$?MXjFSJDpjy#GtPy@ue/&^ckd1EYQMFQW+nVHn
t5&M&: /&G%WGZ!#Wty<hlCJV5jl::W?Z\cnhEb1ceqp81/eL?5w4L&%qC\JWEbN>yc#M!eD:TatckHZw8MnA*V
dp1!pS dFpKtYNMhn$lA=9\bQeuaY#wiH>\nJtSiqL$VCuim:micaij8%XQS!V6hm\jh+qL%9d&FXcC!FY*t#RK
unjQD$ lVMebbWP?hD%C^qHwcJ9k%GwbTZIRD%qLhCJ\195V>KZ\l*E/#Km>1\qDu&y?L4Q\QtI4@IM%BQ>Kye#
Eb!!1l Hd!9<mX8Z?ZNHc$6B4PuHL#ymjmi$1yuPh=FI/*:VF>DTd>c<G5IK$yYD?=ZcBT9VXwQ=*#E%%AGuyj+
yBqd^H G5yAQYIMSi1e#uYJi8D&GGuiu*u6daGpVabbXiXLP#c6GI8qmue:Rq5wi:cFMqtKcR8VnpK%lXJdKLYF
6&Y!L9 M4GiWGe/%@YhYD4VVN4T8ZM5udLuF99CP+N/hdii8%9&VBq+e*cty4L5amtYb?*!a:wi8#=4y+:F>Q15
da/&*l >P4b&YM^q@Qy?qm5l/:#aw@FuC9K@Fk5^SlA4lhLt9S/5X%49Xm1!Y8n5H9PZnht/H!/&T^+e*4*8i56
BWAqQ& 4@5Jhc*qVXXQN=9hb:i<#lYyqniD1\TTyNlXA6>6m!D1/Wc4BFJNXSu>8>8*SXu%qlWy9=nIJy<5mVt9
%=kpLb DNR#b*q+cVFRP6hX?H*@SlF#b?uhu=m=5#TiX/dGhGL8LE*>tad%BEM#M1GH*Y%MJ%1w/B^eG6eq/5E=
ihkPmu 8DV9D&HK&^6h&48CL4R5=eq/km/$LEu4+d#J1VS%F*?Vp>/j@<Gd:Hw?ZZ!Vp%+Z=\*pQQe89IHq1Wa&
QZFc4L #De\bV$:??>y9hN/J\Ki//TV%kKhhPKp\ccyY$/hhA?1W>KE\$?=*a4Z+9QN4Yci=!RdKmPd%GkF%Etu
a4%#HJ 4uZiP8tpp^:8/yVBkdA6R1mJd6c+a4iw84Nn^!4eGj9:bepKamPdml!E>yKXy/Q=m^hHP9#mJ>#^Q*p5
Ic!Y%> &jC@9:k>&WP\d4SldyTEw>iF&:=:qeG@VQJ*6\?la<wnkyy/hTMj6KHcB$*:wLpq:aPtjhCe!6Z18?>^
XY+K?\ XKw$p@dX$4=c#9XwZ/*$NbYVW9y1DhY?Y6yZK&Yjw*&%$18u&@q1jY>naCj9K:XQE*jMwu&c$t9y6E@V
PcquV= D6Ynjb1$V%P/LaKwb%j!cS1pjb1$V%Qca@u8=6QWtudA$t:qG!Z1$d=SKi5D@Rtui*?wu4V%WNTnjdX&
#p4:#Q <M*b^X5w:VPV^uQ9Rw8\5*^thNJJy>SJL^:VTdieP8t$w!*u4y?<GZn4QWcY$V6nLSBR:*uX<$14Kww4
qu/SbV Fqc+D+SVi?>+DKMjnljFQm/BmNQ*Jw:K1?wZTYNk%9jyZ?kWy/M//V8T<w=<=&>tNQ$G&4tS1W/wN=Fi
&4A^<\ Bb&<H4$KY1?CV4<i9Rw/cV%/FZV!?/NZRi6X$N>bD/hZRci91b!pX$GuZa>iBc%ZRchdn%+F4XhB:%yn
H#?>=X H:$KP4&YV1?C*1F/>Cyw9Rw/*SbB%KNZRchSn%+F9R8P=jW1cNipX$Eu4$i$hHwXhC1MZkY>K:XRilX$
S#XP*Z G5?>C!*C#qpFuY9w%MNVXi*5m9/#&#wC+dbAS%HF/qBLi#nR^SWC5\Q!u^WHXkj$Hi&BKijk*y%#b6eb
1ZGydJ @!&>Ztcal8i@e\!=XP?IYabSM59#*/q*i1/dM&9$A5kcce+^<151=5$*QEbDuV?Me/Ku%>dX:AQHF@y<
ZhYC1q :jmXiY>N5At@*^:*B#yR1*+Q=hk4@GqGm^@^:>bXmi?:j&LETPD@ZSpIS\#V:F$idwiY$h#dc?6k9WGn
bYF$L4 D:DFRq=8:Ad5S9ypH\G@Z+q#H4N>P@!KyVSt5ZFApYEiLiT^^1H\i!dlwYM^:!IbLnH@y>HPV:iuP8u&
:tQVDY XKeM61hG<hbwi=yqVQ4E*y=tGcP9>##:?F6nBu^@&>N5ieFDQJaHWyd>Lyqb%$wlY/=V*a&B\+KlCti/
*e+j9k +iB@a=lLjZp&ZA/\+R^eL&DZKb#Z:i>mD#KCeZ+a>9b/Bk:9@pkGLl@auk^eAdDhGVnWnn$a8L:Amlm+
+m*W%W j5D&a8D\e*b9B1+@5H$bPH!:SnF\k+D6^<ANBuaDA#eK&FkGdq@<FGVkDkI&kaHDYbTJDN\aaIe!eGPB
9hb^V% VYLkmwEh^5AhDG\!A#eP&PEM*CHATlm+<hn\MuAVkE%l+CaCP=KBk=dTtM4A+T#JWR#ebGCqDN#lcIJm
+1^iVj +E4R9MdAHRG5uIGdA1!Ckb5KdCaDl=HJb#F\yeDtMHBw@/6p+HBGyI1Bt\uM^<BBu&<e#eDNSqMWA+ej
RVtRW= b:WMHK/^4GQkePR\u+G4A4cAkb5H4J/B\/uJa^m+GtDHMuC%\I=n+QB4:*kGdn/\&^k+@Cw?kaG4^%EZ
1Jk^*1 A:eRVa+M*DHA@A#eItANDN#^\AIM*AuAqnJ\PMJe^5ClidYbkWMVh=CB\^H#ekaP4c54GLktaC$MHI:M
X$YZ?l Y^p+HKG*MZA+5t>u+HB5H&LkeN+?#MDli4BPB1+h&CwGDt*h1^t+E+G6aiD\m*\6A+jLK6a^eDn#iDID
J!\t?M 6^Laikb8FdANDB#8qLKSkX5D:BRGDn%nN#F\/+B6b8BPBuacA:ei9%kb8A*A#tDkNkI:p+E:BhlbDN!y
4:81IG \M=t+DaBP+iB&\^5C\N*G4B#GdnVkb*H\J$B:H\GD4@P6#J\b\G:kIE:G>mFDN\=\C=m+LaA8=mBP^ja
&iL^Y! JR#eieA8biDRHuM=A*eB5C5a8A8BZeuAZRV5Kkd8atBZM*CZAH9GDSeXAHey5Geb8M8AQejAZRQ5JRaP
-AuDqP 000eaaf4ef1001202b4 Page 491 of binaries2.zip
:L#+FV #@SqB8+/aNWM*C*A*tdk:kV&IRN*F^^PbPD8B9a<A*eQ5Bea8Ajk<EkG:pE+uM4AQRTHyR#e\*A+uaF:
<L<<8< FA:uMuDd+LCTkZ5i&A<a8BjRA5uA9RV5Jkd8XVle\eC>BwiHMZC9\?FpB8+NaAe\eP<A?#ED>^/\k^m+
5A^uF& D+C>#5B>CP!QDN^H\N=m+Q+B:AMG:lNkd#B\u\J:naH:F:CQGLk9kL*J\H$J:BWG:n@A^nB\Z\P:laH:
pBdmeY B6lwB8/@eNnB\KHF9nM%V8!86+cB<<DlYkaP>@A:maH#\8E/Bm+HD6e#eL*keAMDq+6:/nF\9iH\XAa8
F6dcmJ H\+*MZAFeLmbki6nGJ::Gdm?kH8RkT5E*CMMZH@AQc^^G1h^G1h^P\hubWDP>8$+!=+<ch#P\itpp$+P
a:Zw+Q KSjiwB!^S1i*%^Cdjy5q?1:$/IThGdcy$/muK+EWY6yT$6ni&64iy4Yny?wD6lcpD/F\eKXYBK$QZu9:
BjZy^h 5AwnW&m6/Mu/pBh6H#wd6CJwjeDQb1EQ8tuR?wD/$A8?NM!T1pBH8H%XIL\mWqVd+Y>4<widmm1DDYF@
6\GZG* iI*Ypb/nD%:$SWB>ECG6^tJI1>4PEMcY$X4RR@WlZ?>qyJPqFD4yyFP1yHiB$$t*uD4y6KM6y!EMtj$=
T6:C&e /:pAN+C#uk6\A#u48RA*tLPiK@pp6\=8$8PVDt/mW>wyG6#E5+<Kd8IbHS9e^FMpk=8k&=<PF1YVdp>%
KeDFQQ i/yV<9dWY@!J%b=/D@QF6KjiMabwV*?9&%PhhH81&%PhW4cuPRj/4Qa$==A:a>4VuQ&YaH5/h5#*8D$%
:@V!MZ $W=kcpPjVn4y6C5q*ZLyyJNP88ZTTTihhQ48p$jjA6&Y//TVV4w6%&&=Vn4yyJN8!:6h$85Eiu\1u%Fb
>8FwIN q@a/kjV?8W/:ilw*dl#1pS+d/:G^Vn4yyEiCP8tSwB+J/yGkHku1yJNPP8t$m!b6N*c+I@*t?Fj/!%4<
mBh&+e pWkkW4#eu#DRY#VdX%SX9$n/nYVy:\8h>QiFV94:Ru>j/KTVVuw$4bMiVi8pS>M//hG$Hp*4yJNPP8uS
mq6q4% 6B=N//SH$#4y$dRiVi8pp$+/:dT^a$Flqd?^84dI=!541k!&4Wn5^aiX?pS<!4VTE1DTWKkqE@XWXXXP
\!juI1 V+Y4DDaW#Y:F4j:\!y\^Xd:KGStyy:/5QBQZXXNdW=cJi8w1F6aXN#RdwWkEu9DXp/%8/8anu^WQ9Zd6
LXF<uQ J>Q>LT*6:Y%F5\I6IeM*:\AjqY@j99%dn??\wWc$u5dpj/?191n5+LLSw>*9V4Ti$cM#W$>nl5+uqKq/
&/Lt\\ RltyJ:A/qP/#F@YEWn+9u#@T/G>JepK!Hu<pM@W$N1h#j#dc/pttRi^/Wu!p%AVY<8=#^GlP>u:BcbSG
mn8iX@ Yw$&<<TlT$I8:>jC581W:R>mb1Swkb4cG#5#$Y/EI?HGVNRVcY=yTIZ#Xe^I&c=GPnw#Wk?ta4lJ/X\Z
hwpiR! Qn@1KThNu89TW\:j^Z6K8LKM>JV8>YTwy/!iQ1ewFc:KX=@!jHdyH6j%144a+/c5y#FD=^QKXD&lnNTV
NqJnB? 1S/*Pd*uXhnqu69>\44Ye/i1l>q#8%VV=b+:XV$b/:pD!+!dn>!I:!pii+4D\YV9dSbWDMjd5Cj*\H9:
Q?*:*b Qil^ZS><F*9eJG>aluye5ZF:EY:e:6#n=uiy^aS/M6Jmy1\uqKH#adb$1i4l95p8>ZV=VW=XV#lqn\LQ
jw:Tph QZuQLP5JSI\pd!=YEwmR5l4PQY+tNNY1y!Za\B\lJZqmWE>:\@Jp>XR*LE>bV%/Xt#tH$5C!!9t%ePtB
>eWMn> yT$*dlN*eMm/ee*d9=^tjkHHR!aYGWM19nG8NJ@cQQuGV+\lH@@F85Nj+QHEI5@Ch#/eJ5cabdM!ejjE
ym*PQt YBWjSbL#eSyn19N=Q6ec1&ckHnHGVFGQ$^k#9l=YC%Wt*=!WGw<6XLL#eilLue?u$SmhpZycI1t8C&iq
neyXbj m<4cY$QBqkSq*Gl4MVN#Q6Bmb1KiJ4EVV@yn\#SdqpLtGJNhV<nAJn#b@WpaG#4iH^^nb1TiFD%Vm9em
9WLeE& 4tjc+ih8%hMSTd5h!<i%GMuc*4:CTlC=/ucVS1F\l1P5$mEj8u+l+!lW>G$\C4Y5BBtwy/\FPqF+qj%J
Kt<CS4 ?qK+k*lhS6Ti6eTlL^Xj>^p+H@FXuwF/wq@qe1cD>%Y?^P&49Ltn6eXk>yTDN#$S*%Nc>T#H8&mphb@y
#e5ekT c!nyX\6?DYFF!i4BXWFG<h1p>ZDPS*\NbiB=mc?lDNRn^qCp#8qeq/kHdw?S=9&b%>/YjDhB5/4Kq@dm
Qnp>kh GVEYT&GkNEbwC&ZQ6qAtT#F6ahJS1LbRck8q6qAt%lQ1VPi/9lNLb=yJY#y*n1XV>6^XkjA!q/FC4?:Y
mK$q<X e*jLumpDd<:P%FTYZT#F<1^hjp#Za>hu:hT^tF/jqX+>P*55=uI?ZS?L>hB%Z8!^tHNFtS?LySkD!QXm
6@yQP& TbNiL:b44ShLNZq6FHdQ&i9GDJ%QN=5Fd$:9Qui>=ZW@wc/%9Ku1/Yc#??!Y%:pm%jJteJXAplT:T8C:
Yew=+! dSFEQh%wqWC11T1nj*j:6mm4*4Im=SeV&iTVJVHuqaF/=m\QL!$GT8i/C4@9*!lm:m!>?^M#h=dG<<4W
D#RhGm tE:MucYyQ>P\utBwSmd$5L8N/WRLFb&DT?P/SD$+B=jt@TFMiZ8nT*6Z$IYYyV^bV>CFqmXyQb\*PbYt
+BJL&J :8J9e6L:<#>+p%*Qy+69e6L4+4!BuPjilVi\QNZIl9pGJ1%H4%QR/^Tm:+yiy=B&QZ1hkq/upH+>iy%C
\T^B*q Sm\$iy*Cnw/?>DwF9W:l8?&=>V1F>DYXp@R/ldV4$i5W>D1FhP9S/^V$PwY$^tIy^kB/uRJ*LKdZKcVZ
tG+V*C k86%Cn6Wn%/uwNeyyN5mmH4$PwW$/6H4FHdBd^T>V5E^VVQ$PkY>V5FXC@W/Bd%PIa*u*wW*eKi5W#A<
He/Rd\ S1>8NBM?XM?E/=u\uYb>%VQl/hZV:YdC9<e^QNNMi5ba#^n9R6?tQZHGiKmiMha#^mu:HD%nuF+>*Y:G
5hFuRk ?H8:a$n!9qLQ4HLHLHytNd&YV5?5:qA>itbX#/!t&!KIiucqthXBitbX#/!tQbd9dnP44YtHh?>YM:Tm
lH95bQ Hn%Dt:I?$J>\89iH/pqdD$W>i5b+B>?eZd!F$nQGcV#*L4RIP&jG&DV$*8</<ZdVH1=6&uw*:S&%TZdb
wHC=h5 $1N6&8tN::WZqN/X&!FyG*9/>YVKw1b*=W/:H4$46>/XP@%/hC!bnQVeiqh89T6*Yn&8*yW:9bbP:<46
=Sj&^? Xw@iqV6J$46!/%&=>c:eiqj8HclH:<16h?ZY8*L4Zdq%6G5h:XydKH8klVJb$n/?&pKyLbVy%KPnZY6L
y:w4ej =+=bP4Z9epb/Jl*6i6ed$&uj=b$^F6Q49NK4S/@#$6G8$^1LySkDcJ>5:qlM?&Tu%+J4u?\h1pj:bG8j
p/Ep^L :HSdBFGQnuchSn*cJ*5Z@EdS$c+h$#SD?%J4*&XZLhT?!>y*Pa*u*wW*eGhF8$:65#yM&#K%#/1&bi+m
QM1lTb 6p^6k>T?y6y&?J%aC4T9ch4%cF>V:Y8cjn%/JXhGit:6c/y>VhQ1edY9cZw6uja%hc6H?=wtTh4ZXQ8c
P!D9\Z cq>V:Y8/A@XwZ%Q6c/y>VdY91ja%%d/t&pLbA!&W!bL&NhWYTt&lVKei:Y81Lb$:b8uW91ab/bt$4?t8
q55<TE N/dV91a:a!!t%&iqX+@&NhY?yttN^XKMAdT9KZe5yu%N$&9B6c@yD6YnjW&%4&t/LaKwS@8cyqGQ>nZh
cVPbaG Bd>S6K?ya=ytcF>V:Y911wZc%%V:t1d^*L9\B8+eZ>Q8<l&kX<Q1%dD^Tc?G%c6l>YyaR/?G%c6l>Yya
QK<4lc 9SyY4+dX1&F:\G4awZw%4F+Nt:bNSK?G:cG4ad@H@9FyJ4%1XK<chc=H4^yNZ%Nb>1NW1$cH/qYni6Xw
peAFTi !n=H4^yN4==86&4$i^8NL*qj1XhZe5e5iuXqim&hZq&=R@Zw%bX/hYY/LaKwb%hcZVqI4/:W1!9VH56*
8i4/ap 6>YX4YqQFui4Xb1mH4%KM&X>wD@lhP<Q%bP&Hwy/>K4SHZ^#h9EYT1<cViP=h/FF&Dt4Sp%DJ=%$Ty$G
uw$C=d t!c>Mj1h$Wt*uD4y%MYYM@6T\^lu6Ea/+pcIb^Rd^qDMn^9G#llnGLta*^cdu:5@@B\A?eHaN@JR1H<!
$&$wZI %b@%umy+Bkdcw/l?i*:pb9nEwQ46?Td8RqAeC8P/:MhQW??/8RCNJnL@wYeM*N>N=q<Qat?bQ@a?!MmT
%p!$J> ?Xt*\w>Z=y?L/=C>qQ>VqV<bl+ZbqH<Z@J\6<+@>Eek=M6<:C@=Gl<\@?#Y<AVI@?&H+GTZ#:>\L=D#K
J5ecLX j\6?B5n<$>A1&y9!@\p@F<4<aT6B#yj=Pb9Xhj%<Au=*Wj:9+YiT#L<I:ZX>bH+99I+?M9?+dTD*yj#?
mi=T9T eJ+itV@@A5nwS<>4IQ\Mp9u*:$8jHJl@Ej\W6ZbEYtLcW@Py1?H<j6ZcEa4NN\/C=?:b&64S$l/du%8N
+NbuJB hRI?GJ99?+q/nwPu+L&m@FjX>j:8a=D*qjqH:/8i+%c<^@9J@N1D%jN/dk?R>/j<CT4@A:#uB%D?aiw=
HuC9#j 4qpE<wGW@#9%HG@<LYTR^Zy?1Z1P1*+B<lnKD/nu8BL%e!#q4%LQeeb^iI$!j$Gi81:*i+F<MPZZ18h+
hbDt*B KZ+QncQ<5>S#9PXdpA?l@E9Xe*\B5iNqj9*q/ntcE$GiRQj@b:du/LF89&ejPK<SG?p=it^jbuB>uw9y
M!<<un Ph4!e+P&=/n!#VA<w\G96Za5m*6@<?aDdE^4KBKM!Vh9kH8dP<%ZGip\nN59k=!b5mD@FNX8&P5==u==
TpdZPj Q1FI4Q+eX\u=&!njhy=>d:Fhd=c/*miQ5X&9!nj<!&*%&QJ#%>m8%=djhJD6@6n!<@H9Dlj**#\ThYG^
N?a<Y8 9N+#9+H&<%tb9?@L/qN#MLRjPRW!j^F?D59Qi@P>^\&nyEZtQ+*9D6u$?$B:aQcT?W><BSu$=bmQPnqW
A?4L!B =l>$P=+k6W9+V5u*^V\c>bCYTiZn?>XZ=l?PhbQJ5l?<N&cP%J>*H+IMYktZ@#:<VJH+H<G#MMk\W4C9
kA<Tnn 11eE:\P%>+X\:icjbH:D*!FnihSelD>$@4<BtY^HjRjkNe4<VWiBVQ%MReVTb:Mi4=jt5HMZ1?5!<V&q
:+q\X* @thAQj\<IjMjjSHphyp@eATen:\@^mh+LjSh98j8<HP#^N@&c=BQyQQy5Nwq<?c@wuqB=8@%Jn^*P9<:
Fdcc>S =tEHSjlj1?j?AF4c=XTQb?yQ%ZP@A66&cj$$d/%W#@&wH$QPT6t>@Q\6>h\QS/?BXdL?pS:%*H?Q>*\%
5NI^H/ @h%*%HP9\Db1Dh&j5>V>8S9@Llp?C14X<:wihieptd>:uu48d=\NGi6p@1AJ/4p*+#$+tj:8%/1iwhm*
KAFnFi 4Jj=?*!kuu5X%4GB>CyQQjenWEe&!9\S68h?!k>BQwYia!@%*BhkQ*+1%VQay5@\VI%NMu?Qj81==?A=
Q+ZQNJ d1du?/V%*M&^YMhyM4@whi8=G%@kQVth44hh>Wejan%u!Q#>VqdQ@bCFpHEtuieI>h^@l9y\qu#8J@kM
&PHFSI a<k&85>Haq<n<aj%X5@>8V4IPEjmP/G@Ldtd*uj<8%5p@wD6/4u@HMeT=>J=*1Ci??w@kZ\i*e<PhZ?G
%:JQ4K a=>#Q8Y9X<@4ZG^:654<<hhc#>*eCtM6+\LC*&+>h?PNm:E9w@#*XD%Z*AQ!SVJ@+l*Ye#j?le@wa5J@
GW65ey wb::lu%A9wV8b==/:k@m8*+yQej619>/C@8E!?k=DqVZ%RjcW8N!tV@ll>b#N@/P8uPF#D>!mH48q\?C
/14l/N nC6q@6Sm>d+ZjRV!XVJ@ZKq/*!Pw6%hVj*1:i8+Q+>npGyq@%Fi&@5X4Nj>b%$G:8Mh1/q>W99EDPK?5
-Aq8!J 000f9f41374001202b4 Page 492 of binaries2.zip
%lTt>6 A8yjdQpFE&#>m!%@#EP&ebR6j/<jY9ytdMi?+q1yQ?>ewjV6V+hC#uZ!jE=>YPud?VnY9X+PM$<>Y8ud
VpC\ya LcmHN<n/=+%S?uaK>1e@wHFhn6K*AI=Xd/V:NpE>q?j\Zj\l=de4QctAMaB^p<^j:FQ/6liPl*>E>#Pp
Q&kV/a &yu%PQd<MhX#514uP4!8t&Z?My>1b?:H98AY$5P#qd+>A???ec9M4&/^>M*+hCVI6^H?W6ZP*I%6\8$!
Rt5qE5 j>JD/44Ch+Q<E=t@@A*X#9\JjcB@K9NZ@EDy&&B<LujI@JaHqd:q+:nqV6LDF=Y?Qa6>#9@J@LbnqL+N
Q6m+\1 ^u6#q<#j>LSN*:KX9m&dal9Q1H^n$>>6+^qdj5H^Nu&#=h>$p&$<a<8jhJcqd%p4<H*@thT*d@^Y9=d%
4\mN9c /d&Re:jE**GNyY>bY@H>8pj1Y/<51%@LcpX>8%jmR\FL*:Jt+%n+Q91:N%4/qnWh:>9>qQ?S>X!!*pdM
c1:=!y A=V@ycWuYWhmi@/k#D?^^hK*4Pi^H*?I>E&%d%t@^n:&ae1j1?1y4RL==#J@\<&Y9tX6Sj%@lQD9Yj1Y
>:1wD9 NR4HEw?T99*i$4i5K@Eh*Wdn/1GY9tW>n8*Xa%VQMi1/19EbQT:#Y^55je9/N+=^jmH#V#uX$4i5cZnQ
Dj#Kk/ uyD=y%=y/X9YCZm9u1V91ZGY9tW>nD4%T=q@ZdGqd>=5QQ?ubQ/9:$E%IL*K5a&HZ<C?t@VKqq>\np$@
y6lSBC djq*FN9$LTji:ED/b5591:V$#Z5H65&@p9u*\Q96HTj!5>jm@jt%#H@kFW9j9B@nGPyy?X/MP^#c+jET
cRPCV@ 9<?jIie*Eu>DmcX9&V=5G*=LM#>jYj4t@R^%/uh$Qp86==J>EH=Q@b/?F\w6QjH?=TW$aMn<&^hb?ya>
$k6S99 Fd/%nYhqjuC%yY@bA@BiQWj%:GHXp**N5TD@Rid@eymqd>/95h@<I*&jQtdyY*ainEYN=&u&K&#yY@aT
6Z9TNI HQ8<RH@*dp9j9HjnQZ8S@8+ahX&V5K>+Tid@bItqd>un<j9/bbu@%GiY9up@Hk+b4<n<u+/!>C%:Kq:4
CL<th& u<l8M<ZT6?!?YQi4M9?4F!%>!>/Aj?5%tpuF>&P!#G@Ai@AX>ZhQY6?@&S?k^?Y@1h*G:+?>bj+&GHMc
yEGHPV @!E<nn5Kbj:>&A=<LjM4lq9j+>qldJ8@wd@:qjW>uu$868jj$9%<*n1juPqwM@k9%j<HhV+Zw1=8J@%=
6yXJA< &n1juLF@WJ?wam&YQJ?eEJ\d&htM&&/##miu:T*<qyj=y>?1#teLj8QV6?YTBiy<9wL4MtqMEDuaPy?e
Lp\mF/ R\=EA^/%l$?1<*uwP6SJ56eNXij#YSG?C#L@%qjW?Z!BjT9b4#bN6<+uy\H/bDM9>9$X:WN8+u56&khd
%/Ij/k j5F669al%#biYtl4H*Jh&khd@l%V4jald^4$9Tdb#d:J5h1H*J@Bh+$y:YdtR%hc:WQib6ASW>4N9Q%?
tNJd$F cdWQiXjBGNd5R#MGp/#&IY<pjK8cbDi:a+nXQ8T?Dh?QJ6uNIq85>!nQC*&+TZc#H=^n9hh=IYkd#Q/!
4K8XL# @5h?bLWQibhA9&MPpQlH@&1%D*qVwC<!B>LjZYnXp@5:iK@NRdKi^&?*&wje:YkVGE#Q/^G4jem:H9wK
MG#yjc e+nM@@$>X98R?\=<I=m:pV&p6/XZiVX><S&u@PtYZ8W6l8>be^mh#%K4Qet>?#DIH$:=c/*:pQ5/9F9t
P\myWX CHti=yFYi=J*AJ:QTJu@^PqYi=LZMRjp*YZ?p>hc:WuiH9B8tu9I@NbL4jap:!Rai=l:!9P<+\t4Qet:
BAn:N? AQ/YYWV+J!#>#@$J>MutZ6T9ZYQyj%+%nEHM9TZ?q#M5@e?:+t*I&Ij1ihjT@>!9+N/cw^#$Q<>F@&*=
yLEKqF Bd?^/d@K>@c:%/d@iT:/d<9@4Fuy@$nwW$^yF@Z<*:PY@8jX\JnFqHbSD%aj%j>XwD9t@tRY?1*T@@KZ
:@?1Fi !J+P?IeLLQ*QjR9/F@NA8n<9Y@1jh?Wc!DlIu5?&9hS#j\:%lP!q#?!t>QbF/MhNcT@%@H!k$9@V+S/d
L+ePQK a/u?V=V?u\%nQdPa:M^n%H5$F<duy4TZil+d1jV@V/CDJ6qLu/t\>D@*ZZl&=mFWV+tq@*pD+b9FqQdT
DE&#44 4G88W@y@N84pBMy@Tiq@iH?!yRJ:h+8q@*qdEZ<w=X?9&wF#+N/aepY5=@E9qQ=jm&Qh\&V?L^=W?n<c
1/lIJ^ ^=a!tpDY+A8W@96^:H1+^D<!VPu@IQkYN$5pj5nlq9:uQkR/dB=B?JqK@:jDGMCeR8h=1>L@T*A8+Elb
AB&SQl #>AKyj?Zu\@=W!u@JW9@<@D:^V!K:uMN@A^ynZTE+64ue+W?!*!d*pa86?Zd^u5DDqZ>?BD+DnKuph%k
hcADin m*Yi*k=wc<%TtZ@\ZP5<9djmGJk<=k++!#yQd!i$9Tc6Ah9*Ti9=t5jAh+hJ1&CQttw>Z:Q=NMm9pQuq
=:Zc>b I!&<<jaG!Ki%TY&XC9<L$CtV:NWX6%9ud<=BQcHaX?X%%9tdN<Ga&y\6<=e?ay&@PS*:pVqW#??6<#iQ
i#1@n$ \uGC>J9%i586<?qZB&NA5=L!%%uu$!@+PacMpM>4SL=%Q9*?l5>*H8YQ6e/u*\?*Ru+%=S>yuW?@^VBt
Z/IQWn NH&W@+^%Q9$?^udkcG4HQ4C%a:$h&n&*@ElM9lj:PK9h/?*T:1u<4JHD4HdQW\JnCdPG<mha:b:uLulH
:Rh59K #X1b9<@94HdQ$+#>ey*<Dt*a#Y4*QNP\u9pTQ&?F%i==&16yHlH!m^16h5>#Q5+N%hQ:FdVih<<&9J<L
nZq>@/ CZ?T%X==65Q*tutM#K<PY?&ib#HKm&T?V*$ZbJu9RQ/^XM>b1y+@\@ihiS#l::dcQW@>ayCQJ@^qX49u
<??:te ?cAV<p?R?VZu1i@R*cG6N8X<lLjQBp89QIF@R9+T!4@Q$m9QT*lhj14uE@ZhPky6lk$$V1lY*/$+FnQq
Jdb1ZX jESY4Xh>6@bHG&aV=j@Kc9e<qhBtt*I?I198Lc9h<=^+B8VL?am5?Yhc:b:uT:#@!!n@Z19h<<#B>%*P
H%ecHS S&VXQ&:y9?h1jL?ChH>86QR@1\><*=uLCj<ZT@<>G*E<IPen5lc86QVj<^h5D&p?a4>YY#6t$?jJPH+u
@$#+6P 9Z4lIS\+!Q^F<N&R:bN@h&@5j&tiw6<?%4!pb\tPm>1yuwt1uuZ\:E\=V?FhM5?1^*QqKbBQ<^RH&iy=
ZX84nH jnBP^FE>T%W>%:+H?ZKi\u9VcHW?p?@B8W/!5=&u/6q/M8S*Wn&ZY@XpVj+Z=M6=C8?6J/u#tRh6q$u#
HAN^dI FBN9W@X<B6>R=t11=&q%Qq6\DCDuKd^*@EdXe^KPd&ti+4AeXe?^MPa!V/J/eG\y=%8>\?Ad&yV#FN=:
V%c*F\ aL#yjXDtu\J>mmuuKd\qjT%<%6QaH5y=C8<DL%n+4J@m*L&ey@AiWcV1Z*5u!HKi\99I?c4?iy#npQMW
ukm+XG *q@MX9lD+h^NPW@ljiJalY@:B?VLiR494\e4@P/wD*Ki\99$@k4jk8&AuKj\@9=6li?H+=uV1j$ed>%Q
yQSdHT :==+j?R<ljib#/#:/i$d^IqHtj>Ctc4@<q5kZ<=VbAY?W9jueY!9#mc:at>X@*+jR4/ey@C?<1*Tu&j^
1M%KkB ?%VPW*nj4FL%*+:QSe=ViQ</VJ*@n&H5aMy=C8?:w=Xi@R*1MM?u@PQX?S<Fa!yV#qN+Q@mJiq=9+@iy
Q#8:Gu uKj\j4JMuj>#MBa\=V!F>>M%19/Zjkn=F%H?dc4?dB^j!ZpK:^hj1@49?n9p!*pK:>j*1Q49RN8SuKj\
NeQu=F j9PW8n<*RF6uZpd=@%d%Z@X4!Jj#FNti&i4?VIc&\cS=mpGQ1jHG/$$aK+4!@/*t@h?C5dhJ>8*1mR4j
CkI6JP C@9$L&k<$/n\W>CY@!ZbH*=4uj?B%?C+t8^S@5uY?S@+FH#:ttTQ?8^$/@\QQA4QS>1n#LcJ%9pj?D#$
LI#XaM hiajcV\J+%lQ49!:M%EjyD$1/<BZ+EjYd!#A:#8!S=X:%Q#F&jmhT@cweSi1iwdk?J#5Wa<@G1%u\@du
pew8H5 5b$li>Rij%V%dMZu>R4%!=FwQS8&9@Ju:C8yQh?t#telZL6J>mnjCc1i!?Cd$bV&KNNn19Py^i?c%&W>
!JptFF ^@=V%ZMLQ6<*1J:X1y/:$e:\J9W:Q%Qu<^DcE>/T?a6H1Z4P\:@:Nw$#>%Q%:IQ>/b?qZl%!pK4uQilV
y4>S?b eK!A?SQG1*4PlG5!bX#Y4K99n6c#aj94cHQ+1<SjN$=h%*l<L8@L@B5t1*4PS*9W*/ti>%R>>&G@?aHW
N4+am+ =+&#%ju<C5:B@FA8S>44^/1iw:D>?am?y&#QQSi?Re!QJZ:WK?y<4pH:$n>p@u=91?j?GI:#Q/F/S14#
F9wc=Z 8Sj9#/j$9ZC%/Jj>LZH4$<1^H:!:%i@kHjn@WE5DBBRAAkAIAJSYdTX*Z$t<KEwAAICAA\A#AAAAdGqm
>XdqY& e!>\b*BnbG59dYFnL&=qhHh9et65cYI9WEhRe&S4VtX$h&>!c$^yam=\etw8atq8:F\JjFVX9V=uJnQb
C<#uZ& k:mR8JLmAwwE%Iw<XGTHAApDCa8w+CT=lIGRCVPJkLcKK!/+9%bF1!m8#**Z%14F%&i6hc?%?t!4%d1>
m%PFRY clY6hZ9qjh?>*:&blICAC@bqdu:jtT<#p=6:##*uP@@@Qjh<b99a8Fm/aWG%$:w+tXw\KXFZ$bKcd#b>
P<6JSj 1/1KyWdN1B^n&><Ku@A&Z&=>a8Y&6/@8ZdGBQ##^^BjtGFPjVDd^V+!^@W!+Qt:CDYea5@QS?H$QG&4j
NESMmu /clpk#Mnupwqp1u!YCw=*/q9Nh%15?bia:@G9ZELtaI9@YdEtuZ4@F@Y4dQeTHi#\hFeewp^l/*nD@cd
Q^8w!c H/%KN5j4p^9db+:yb\45t6C!+HZ>\+8a\y4E\yaty*!p+:Tad4qba:PXkFaKjhn?*1C6FlT$RnV1pp5G
@X<h9^ D%uR=S?W6H>ipX//eL*Qm&8Yyq8hlcPc+8t$p%:@:/Mn&=wdty!N6F?$jVb@>wAwtt1<+6lEh:$/t:nN
66u\X# 1w!XV^k^jRVSw<yyVTWZP/pF/jIJ<YQm=VX>yyd9dRjhh4$hNHj+6MuqW<jQM*8W%:Ae&dj*IebY*&@M
eAtFd& V6F6ip<\niZVJ9MTh6C^VXM:9!%%<jcG6:B%$T=&EC@:NVVy<CbI:&cIiYcVV:c%>8>jeZjH:\#*D6$4
HFwbQ4 >D4Nutj#R<h%&NPlNlY/I@Tl8ePaGe8NQdFuy:w1#/nEMh:A:Y=#@h%nw=^H^C@&8wm:ab<tX@!QRJ=&
h81nnN #j*qm@hqB^ejl/JR9BFFpjmb:R*A*5#?L9+Wml:m:/HaSyZN9>N=lQ1n&Fc<C5X&+8!?&+8jl&IH<h6R
PEb*M& >BLu@p9FQ$SSymdCji<wQknFV8JVWi\5#tlqF@F#WP\1#8QjVj\bFL*F@/c/b4Y!Q4+u9niKQ8KXKHaZ
t&h:qM V/DaR*\Fmn*F8j?>^H?Fw1@+Y!n/caVuhh6duPi^n@m?KQ1Ln$C^4@k<FAQEq/NRlBi=D5XA<VWwBwu@
^YJ<+b AeX?+y?n&F<!!@>%kQlkFN<Zn/E+WJ#uNXn<bBRHmc>CMWV<RSV@J9+mm1HmH/E+&PP=dCPHmQQaD^Wj
\E:EYi m&KaPIJPe=n+D@$?A:+T^Rn^Y%GMFH?Mecp+/*P$^@P5?ka=&<6aehdBPQFJKMcL5&%Zmy?KawL+qTkt
NPBdb^ m6?JayL+E\!:^X>HWT*?V^TVQb:QNl5V=@qPEij^VlYjncJGuMNk4VkCeDNN@CwW$<X@ltKG?G>R#BS@
IS>>E/ DeZl+k\Xb&tebl</Ry^6+Wl^%5%S+6#jdHGP%HQEV$F^6QmqKPLm4Q</<ahS%I9@FpYD?B5wNHwZ@EQc
?jnbNE SCtl>nTK5!@PE&edV+m#9Tn>KYT>K5Iw=Q>9E8i4wwyC6yNt<R6SKP+6ZI%CIWHljTkYmV?KImZ?HA1F
-A+PKP 000b36befd8001202b4 Page 493 of binaries2.zip
IaZPEV H+Y5R&W$lY!*dS+9ww+iI$+6YT#PQ4SEuP%81Vn4<ql^jm=%L#wh^R@EEc/dH+yjk?J+eR!!=kV^J/Vn
S@!u94 =K<!Y^Njm?IplXHW>bQF1aYumFNLVlXu9#^NuQY=ZJ#Z@*S^%8Wb+9!jb+1#Q5<T9^#FCuG&kdQFH$J^
t%atiR n9nVKM+Xj^uFiiI<=9MXG9KaL^CuVq<wV5*:h*F1\I@Eie\@Fti:9pl<95a&e6d^JiI<^yZm%/K+XQ#u
9/RZ=N KC+Vj\HFV<Ty<=h:9AiQ:Ry^65>X+6T<K<YyAXiJ5^?5F8e^ZC*P<:lGuK@Zmn?A+n4^b%FeL<=5@Rb^
TS!/K: /9N@iH\dc6iN+6T8t<TyTViL5%@eI5:&hc5+/@5&eS:n:iL*K\+k=@Y/W@^NFHiJ<^kW99Vp&H&QPMjD
pJkC5V i<Zb@8<Vy/dhL$+>?/p+?@jQ^Nq9HlBuG@!=PK@Xk?I<y+jE8i?H^cu#9^Du?LJG@B$Wn+l@nPI@Qd+6
ji%9%e n@tZ+n#t@^Lu?QcwPQ954<Tyua?J<=l@LW+>iF!eji5*+t!dV+n#&n+y#tN@T9^=FE?L<#mj<dkd:n\4
5D=jp: #q?iE&ee<X6^%8*#+l#4jmjP>9?CPHZ8>?K5#^jF&c=jE8h%@t>^%5HL+u>C<Rj^6awFGZ/^@j>JuQHS
/IZn=M K?K56%jFic*@LM:^=#X^c844+6TQ9+m#4:\l#ud$ynn4/T%^:8>6eS:QP^:jkej#Q?LW*4?Ke!^:X=#n
l*Gy=: ?Z9mHP9?J5+^+Z%^/8WH+6TD6iL5E^?K5*+?Ete>@X&e?@6auGQ4Q##im@HMJ?KMH#<Xb#@>VJ\^!?jm
&p*Hcl nAY?EPi+?4@mHCQ?KW=h%K&iZqi*l@!>$Bj<@KjZ4^Y9p?P/YeZ@9ZCMX9F@KiJ81@m@FLG1Xj^jmnnP
I6CiCk K9+9la=b^j?q9Ntu?L<W+==X@F<KndiK@$8lY%d^j!u/6FZ<Z+1&blZ@q?I/YMZ@yVlZ1@m@DHGIXj^j
BcRb<# l4HJK9+9k/=c^j>q1B?4?L<M&t+X@=hldLTK@<9R61*m@#JeP/9+9\#>#m4?L$Pj5I4@!*D>4iL@HXFu
y49=/D hye6#P<8%:m\T8QATw$jX$u@4@dGH@heL6N=ZKQ4hK$$@*yh1^8p:#hK#&?Yj6<19d=h?u!yNPbJ%eXV
Yq^&VP $yQ:yLW@qddiJW%?RJ4/wKjydy*hw@y/TG*naiuwG4YQS/Tb9=SGQmyNjE\c?Lk$:&:y%:P1<?ipXT>J
$j%KPR Z%/Yu9^PP9SH/ek4uw/=%<c@L1>/:bH6pP*QdZh@qw/<L6%+R#4^quVlHiuAC>KAh*Xh*%N@Q$Z^#ttK
eb>aq* d=ayLnyhee&bZq#q65iV%BdQW9>cwXntHQY^e^Y*uK<+=WLFJV>THHKS+w+V%j<@XZ9?VH%>B?Y4yeyQ
lP=KcJ 6%Ni8/Q!$y&X@+cXw??l9D%jiZhWPZyiS6+jWl=iyB^&X?Y59bYnjp@=hS@qw<ZK!Z5wB^?1QP\R=X%D
FEK*VF qK<NW:+%ZHqhQ?YiqeyHK=SQ>qj8PWB=:X:Ka\ey4^!luG!We4A^!4pGK><c4=##APYaB!w*t1Je1Ec=
C>Zm<5 %YVqRNPW<$!WFqXLl&bIR>5Wp!?Yn5=WLL=WihA5=V%HK5?b4d!tTtQCB>K!6hJ@S#qKw*KT8HKblHKS
wdQGXD BX+8=Gyi9jT8Tdy>4GL<H$m:F!1&Q%==TXJ=!CLqHYuqGZWcd@+8#j^aa<8ELt+9+bydZPehi*8ZH:<@
Ac^PW< Zj%$:jkyn/*:1Q1b/4d^d=yBi!XXL>M%Np:L/B@9/#nu/#mQW**MX9$e1dye18N?Ri*>R<Wab/pQ?b1#
tF\=4m Xu*lj9YF$>V@LqJjQFuu</u/^Ce/6<<Wk%<8@Z^ItuSylud=jZcFNP$?6a6q81/H/*4QWQ5>Y#4Y1P9W
e:t$Nq yP9t/B4&qDb61:=ayd=:p94*eQZQHcSZ9lb>IP%:5yQ&Z!XhjE4/@HVGGHBNS:$Q6L/Z&9&Zcj/h$9P:
T/Qn=1 FZP@4LnL%=JMDhqFGq8hwRi9h>IEZ\@&q<:<Sj*85E/cW/le9$l/@1L/idH/dDKn#$>SY#=R:Z1\?9AI
T1D%!N >iQ^Glj/hSyQjM%JbimS&4@d=<hI=/#GpYM/>bXJ$tLFG8/ahaVG1YipYSN$9!bQ&l1X=8XtcPH#G4?Z
e#/5J6 b?n<JS4Q#qW8?=^m>H6%j&P8?uX#ln+eyHHlF^w:^&ueG69F&DXK+>eTceQi$6u?$5&@b8l4ledQR#W&
SEa6A+ D>Sa+Y96Cey@SueSy@Dc#LBiJT:X:<$l4&LSj1h/PTu&hwIdbc=ZSnm6py$1mZy%+M?$?9BtuN\c!uWu
PqRhSX JQ^Qm%Sy9YLna1Ph84dGywb+m#iS:<^NLMqW<k::$$!YN9*L>wpQ>#jd+Z4a+BDcn<Z4$6N!9D=>y*=9
NS$W/W nul>+Eb9!PV*i5#VHjp9VG^5w5tyceq=1Pj\J1jXmcYT>VhTDay^Bnn+Pl^<LDb1<&98MG\nanHtF56t
tiLHl: 4941X+L:C*=bj:cENdL5G=n5DHYey64a:NRG?%J\1d\ZE@Lt5Vmh:#a\NCH*SuW?WAAW5mEB^b^MAuwA
ctd6F$ &\DdA65B&\M:AL&AW1AM&BHaChkb&AZa%jK^AI\BRDuRB>kh&AQaE>kL/A9$A@aG>kH/A@5CA+AKaCA\
kI$N\\ CNkQ&B@+QuAkMBk+CBkCDAM1kRuASGATWA*MBGaBS\K#kV1kAZCA8WAnMA>IAQPBBWAV5AlIAYtkFYkD
:FNeT? FkNLyGPV$Z+*q46>&ii5@@H?HNh+Q+tQ1B9!Q*#CM+1w?^*uy@Q?N@!+M*nniD?^>><I:qV:$&+uhZ:n
dbn1w4 =M=9ZNnlnR$*JQ?@=G^+WnY:dip&b$//Nb:c1p<!&R&PN^%HtR+nSickEeKu@VdT>t%GN:Bj@u%$p!wu
D#Dy\% %imWV&=4*ZLXhpeB@88e$bQG#c^jpGnkR&M#cnC1=P1IK154c?h+A\=H!<&:d4l5b559Y?&a1XX#*GIL
B>E@q^ @*?PXN$GA#YKeLlD**THcVec:cKu:6D=1V<*ePlYjT>mdNi%MH%@VXCdq5cYmiq=VZZjj1jMmD^CuaeT
IS=%uB /%@bVB$PK=jmc^/j8q!*:yV>%+555+1d*TI&P*cd>1!yb:5E4=<\dTB4/nk!8q%$QFAJVAAtAyPAK1Ac
A5iM4? tA#EkCuAXKAG1AYtAhPBGeBM+HBkFuAEeBR\G=kDHA*EkV1kHtkAHGA8$AnMA+aDI+CS\ClkNDAGGA8M
\5It&Y A+aCB\PHAQ&A9aF>kQ:A95AAwAIaCP\HDAFckEXACpkDdeAJ\IuA!eCy\BuAYeAK+G#kHPBe+D#kjPAC
9ZP\<! +ELka8ATaCX\KZAbeDq\lZh9\J&5THcIpZpAjpm<%J@6<kQi4SEnS+MpiWN=iRm=4#Wh=dtdd69*HVX=
%XN1Gq >Jm?=Z%Hn/khkbha=cnc96&yA4K*M:dwhpaQQlC5J:M4=5hVud@C=+m4b5!KKjVJyk6j:VbSV5je!*c<
>EelW1 XNE8<#M9?\kp#y<lDG?F%JZ*+\MNSkA<LXc=kWE<M%c&&h5b@+>9b&!BmNkNLBBa9+HutQcyHZ?cQHMc
uPbM=w m%Na@9R*y/:<cS>PA@yVkQ=$Z?a$jiiy6c/t&Q*yNE/qbW/D<&bK=ySP=qRPy&@<1S8tk@:$N/iQ@Cp^
#Ze!KD Vwh^&wlVcQ=$iib$jia$jihy>5^yL$/SXTuRt1^=AE:QbW/#?>Q4@k91e^FRDW\Ga5AWaCyRA>VtiFML
eGpmDc $+Eb\E#keGAYeAS\JHAWMB8aA^\N^IF/wAF\kLqAI#AQTAD#kRXAE:ARcAdGA8PA<WAqMAGaCE\C1wDl
#H!V^> \AlkJDAIGAcpkDVRCy\ALANPBE+CVkFPA$+H#kSYABeDK+FLkb<Aq\NZAK8AK+G4kNZA%eA%\LZAneBN
TNPbY& \M*ALeC6\P*AHi=WT=h*h4dyjE?nG&c+^1=ZC>M:*k#=V6#b&hK^K=9B?%GN:X\V:VPWHZQ$nC?Xl:&@
==1GFY XbIZ5yt/u<*k5lqeSkaZmZM%*XjL8IIM:t9I4dbCB8jjJ!81m6iQh?INVmyhMY<nAyY=baQ5d!VK@6eM
@GMDT1 54@^VH&#:nX++$LYW1G:dXqLBV@c?Y=bKtVt+FqLlW*c5yaKHb9$h>XTwh48H*wphPeGLSY&!/nE$w\d
9TMy#= 1d$#I1k>Vj85%MCMP:MnVL8q\qVV9t!n\RTYC8/Nb:>tqyuAW5F>>FlL16#H!9$GeJNyj<#=jlNaK4mQ
WVR1nt A&6Jqj9+8Z<i9#iByaL:?L1YXLtQIG6Jqj5w9=bW8a@lc$tX8!SJT/4e=R%cW8W8H>KTK69dBJaKhp<V
5X&VBl YC4akTc\XLBDVGCyaIid\FLB6bCRyaKhckJLBZ8pCT\XdIMJLBX5$kTYC9a+E%k1&PWt5FT\K$^k1YA9
X!!:%c MwGqkq%qAp5Fi+MJLBZ5dTc\XLD*teBT\c+^kcYCjh\Eqk4&PSNaK6mZVYCyaF<#kcYCjh5Eqky&4Rp5
DVIc!T Fi\uJ4BWCEXMaKpRKncByWJwX^NaK4l&GLJWCA$#kcXC1NaEqkwl^\TYC1EqJ4BWCJ%4Ap8F$CwVYC1E
/%X6nb dnGByWLwLlNaKwRiNwGqkt8qIW8F$M5t5FRI9Y$CT+ZR8!b+#D#$pRp5FeISE%k1lLe*kcXCiDeVYC1E
*618*\ ?=nAW5G%=NC!q9ARE%k1lEid\FIlHDPByWJ+nkp5FeL%J4BWCC<!kcXCiIpJLBZC!$%k1SD?5Rp5FeK4
*%>nwY VYCyEL/>@d=utQWkT+W\q\@IWmHMyS/!XAn#5Z%bKuC&^dhW!PG%p/XCD1?6LBX!YMi!XMk=&kTYCnqe
R\FaX$ dmNLlS\8iVqcuQ%cqkw=ZM1kG&E=ZQwkT+YeX$^k1bDDN1dSP$JhpcXClH%Sn+&=hmHKDCP<@4JWmLAP
G$p5$N bKpRaZTlCCQCKEKYClHP^T81mHCJnm\XI8\:mu5nZMclpCDC9mBLBhhTSNqHqL1l<CP/q\p5FcJ5A:JW
K5B%JS mLK8bKpRbZ8WyWKW:WL**1K5a%p1SFpH5qTI<n&yi=VHLE8FKHXAqkySL4?SyWKW:X?YC6HHVYCyEPYT
1X%/cX EXp1SLp<TJaKWT:hpKXCqE6VbKtR!@PTyWI8?:w5FZLb%tTypM6/p1XCLw>Zqk1=ZDwqT+XeLmYTyWI8
=FRmmS n$&YC4uWhqp1=HIJnm\Xeup<5qVI=bI1YT4p?iMHPeeYYT4pWdNq1bBHjbYqRl+%TbaKic^#YT4p5e@J
kWWVGm WmGQ:XTYCut5T%p1=QG:5qVI+#kqT+W<c1\5FjLaltYypEe>pcXCH68GLBZ!Pj/5E1hP!%Ilj/kJLBZ!
BZq#Fn &d>q1bDQ>m=LlZ^iV%p1=QN+bKtR#&XV5qVI=*I5YT4pe>tWLBZ!1X&!XClk^eqTwYBuE%k18Qaw5qRw
PW9FTA wC:JW1GA@X8YCkX5%:JWKGAdpcXCAi6iqkwFQA>bKlV\e%p1FLB?FL+WeL!YyWIB?=E5FR1w6:JWKQne
DFdXN: BJaKld!?5qRwyMdKW1GR++p5FR1y\dJWKKVG!FKlpQWtT+XCZ8iH^jq@bKqR!KXQ5qRwbF?RyWLl&!c\
GB+JN? XClp&=PqAqey?JaKSa\hbKqR^Q+8T+WmZqNbKlSS+&Yy+N1n!FKlmBwnT+Wm>tNbKlT^:e6TwYmXCT\X
IYpGpm mqm95qRw+9HKW1GIT:yp1XDEJXm!XCnmMe6Twbl%KE8Fa5aZ5qRwb4?RyWL^KBNaKlS#dJGqRnG%YbaK
L$e=9q ^Y\D5qRwyqdJW1GajX&YC5Z5N:JWKGa:qcXCMc@=K?K5X%p1FD>nAp8Fa4+uT+XmL68WyWI^d%jIW1GE
%A?XF8 ?m>LlSL1pm\XT91a\FKllPeqT+WTnkY!XCnl8C%LlSKPtdJWKGHjq/XCCeeEYT1W<B^q1XDCe=TqRkq%
5&c*p/ SbaKJd^G5qRw8e+EqkwqdL?!XCnl>biqRku4WyaKJV\8YT1WMC/XyWIQ^4!!XPnS%\TYCn$a?<lTwRjH
-A\^kk 00036de4147001202b4 Page 494 of binaries2.zip
WPk#l1 <!?&KL9a$wpjQa9!XbIqh+y?c<:Vj*&4%Vd@HtVZ<@TdMpi@w*KVd&PP@wD&8N%*tF#9?aQMb\??:ju<
XaSXlJ 4djqbY@/hQi611b!VM@K=qau%i!$qw>b$6KWVDty#h6HyiQ>YaY#^MuYcDjewkML&mbW%yylA%:^bVa<
W8B+5b dQB\V&+Qlq+PHS<i65@:+WF*j%LPmH5ZP<EWXw&yukah418Ny=n^uqbVP*X*@H=BLJbplHdQ%ERDFZNN
tkJ4pT *Gqq1*wTu*NWiGq5W=#jj/P&m9QAbm*HPd#?<^kuqeaaX#A/qWSYc@9pbM!1=mVe$euN*HQt8!QRc6&@
ND^Vq4 &>tQW8!?uEV!#JJ5liqZd1^:S<IP+IlkV>j*iXb*mEQbC=Xb8Het6nRP5buL9#i?um@Q?M?Klwb:*:XD
d>ejCC 5\&\Y&>5DP8\DXj4!dcHdH6Ri?n$@HtZHlTMjc9m>bN4!tP^WiYVE5$LNuj<#&:b:X>:a<99jm8&P/mA
Y\68N! HV1$yc$8P*b$:!%:S/D4LjLq#/=tQy81=$a^A5><?J998^*MDdLQY&94>5>dj<iiEN&E:$Xp1lYeRWbc
wHqLYi VMhd#u=6^QRy<\%*RV6ZE9qL*4?FBi%i8iGPq@FMZ1id>X#PnLhMdP!pe5Vmyt%lwu/i\RiyiC4lyE*:
yndpIu P6W^#c&yySZ%Gi>W^SQNHh/a%yywTuh+y!KXV6W#!Hj@b$X>T<AuPjEF/e\*cqQ^F9?Ncti^YE%4K6He
C>aXMW !J&&NLbwJ/V/e>I1b!FI9C:i*JDp<eRdG4#T$SHZJb4=Vq$Lh6WKWy>e&BJQPYANVu&!\TP$4!NyV4FM
CEdcaV +\6y@8+$/^6PKyZpS*NVn8P?JJ#tlmd896Fyndi&yn#Y$P!>?9<dhG/m1hZS^<jEt>weHuemmYJl9D/b
FG5Se+ HyBwIW$&JPa8>WnK*Wt!^iFL!tq$q4m9m@CZ4T=L6#YSyHXmcTii1y>Hpp#^@dc=@MP&bu*<j?%hCb\W
&8diR@ ^hY9thqlPiWT=JSB=SB\F%ESX/K:LI5k8#C!ZMEDl6tBHbmhGYbtEVSSQPK6Mh+H*lii$bkan^^G+=*E
H<eD4M K&1?^EV>a4/a^CmJJt4W<NZ418t19t8bBuh*Z9%a18j%j%=*X:%/:>Yd/qj68SV>Z+8$4wuFE@AmYXP5
<+?BJ# $Ay%QJQPb%KJ1u!ljVZeXXN#a/T?m5yEqacmu^c%y\9J6pTSBC>nbiL4E+W<p^*t8m/p6:w+Y=mZVlRA
/n5#a+ tBEEF6&Fd&1pZC!h#>KddNlWTE9IIyqjRSLNRl\cy$b/Y=4?Sic%ASytnYSYLJZKbNKS8apWqbhqpj41
u^Kpb: ?5tV6VPLEmiBh%&Zd!QL/^jPtTN@K>yk@Kk:+jCJewuG<9FaTn8u9X@GBG%?j8:m^hHmeiQ58mmV>ZnL
Y5S+EL i4$y/qIyMmib!^em#at%dXRKTA&#*6J>V=<^u#SFq^p?F8?ej?A*AJ?pi+YQ>I@jK*!1abiju>neuMl6
eMZL5> VPVpZ4E@b$ituB!@Aqil#>8\McGNHic48%*XGiB+Vq#jGRDKRL5J4tAMaml/\ZlK&\EV?DXdlddGnwpk
>QLdYA FF9ZTDEV:FkJ59XE@b\tY!KZQl8$I=mQajwbSGLm\etXM%4&%<h6$#J&kw>juX=j^d<\J!b@^VAM/dBp
>#1Z?w :etjtB*^YT4:#ByY/m$?nK#h1BN6P>tJ1QPK$EFl!+?Tq!ZVB$$4!t#X:MbGGH&S&R&#ql!qHcW#/RQa
8!96^^ J=%B*p61<!=Tt@iTYm8AMK1^8jK58W!j4d^5L/DJye$*wbu+^cAqVG#FXRWZ$$Yk^eSRct/qF4KFtY</
dt!<@d @IWbq1>6?PDiF8=ume#Cl4e=8=*>PRi!dVMcVyQ/w1XmikJ<D#PyXXDA#WpYpwt<ATiwFE1X%iL/1A%Z
V5a@*X &^PYL^m9+HSP@^4>b:tEwPt\JdP6MEGn5IYLdi:aRnRAnZh1S>jk^n8WQ&8unZetj/culj18!?Xmt#YI
&LIJ\< tWblEkQ>8\IGhLu@q$/#C1?JXyRdK>qEEWQRhMKTn6Dl4PMJl%5\APk=PpAZN#dV\cqy^IlpqPmVciyk
6\C#t% eY58EY5BE/Ib<*SLMyc8#/Vlq<8p=nR#F6Ee6SW\!4pDB@atSS%h+eEBdj$<&cjVKNDhuLp?44Y8MH+C
p/!\1l @<qIAT@KHYNma9Ph4Qt!GwF*QHP9YX55teh>k14Eym!^&!=dP$G@9DBdwP*TtNRed9y=XnIh!&%i#H^@
6>/dAN 8T8iN<9G<>cjNBbp$kqPBe9L1jZ6?WKtLWL9t%/@JW@1+9FEQp<>9$J4u5BQ$\u\IR5F$L5E$t#V?Xp&
JB/<Fb 1*&c%b=M6WTwE=&L=auY&&5V8Rn:DtF?bD&h+>D9=QnHbdFetnFcHKYZTChTbN/mCD^qY@IpmwK:la&=
>le?p# n$1ptVie#MNT4LdXKZ/T*#ReWwiW%Z##d8bpe/:W/^dZl1e6e6Z<Xyt4%BS\YPVG*BQn+NSEYKa\E<h<
V$9LhF bQ%1@LQ?1QIZ#NdB%yI+&RyGj>=Mp!&9Bh&JA+1at=@>I8tWTe5yP/B>49/h!VyyZQ%wmp:BlpwdP^l8
4DRyu8 pkqc8Iq?PLEaj@I>*CVP>CIX\^#hLdZmh@+Y:<RK+4h1u+4qyWj+PM#FqyhDKTZLuqbKZNqeTya>9S5:
WpV8Rq 9nB=J^hmTa5n*Fhl&iWI%>Q:p/<\l^@Q\*M5*B&5AVGNmhP?cy!5nVYeX?enDuGIR=\1Dli#aTu#5qP=
9#W*ID 5d9Z\khe#IaFF:Nl\hjd5JSim1?*HXqMPSwkwTNZ9Y%+9i*IJSjD/&%n+RZw:9y/&/=jWClilDM9BbRu
$XK^V< APJN8a+upaiZ$?HFhHlBjZeupC>Gl5\91e9:1MML+icZ#<*:5e59u>Q?$q>AL?:VZu^J*i*qe\l@F9h5
mqq6E> N$dC?m^c8HC^aWy%%KIq$TIkBM5WKY*P9MaG&IcV%\FiB*ph+9YJ9D/c%=5pZ5FRhk*pyklK6F+>+yt&
?+1D+B 6k!pE8uB9:Kb%:%=*e44Q4#8!?9=Ey8iwdbaZPLSm>e>iZ$E4+8QWeTFJS/lMF8FTj8eu?*H/#%+*b@Z
jRm?hM M*k>kNiDiD&a%*9!imm9>?L%MF+Q=@WIZw@p>Tlin?d%*4\8*p?E%@9\iq>i:<j4ed\i#?5J9J:I/@%=
5i9ZwF QauZp*p>lheHTK%S$W85S1Z6^BFViX*F/:ZTN!yD:Ae+4e*DZBSkST/9e:#P<:4A/%6=jS89d=h+>km^
Q:RnV% !W&^Q/6=jTC9y$ENG%*^#@N+jTm9D?d%Id!iL9EP>>J@9JcieAP9<:#P<d1h%\YJR?>K@t5*EdLT!P5F
dh%?&u 9F:H/\T9%@M/^i9q9F:B/?N+jRK9X@P/lhhDyP9*CT%8lASY^WG+l6jJ\PQ94Rw<Nu>LMQlZLiEL@S\N
=aNjkZ @Z#b1tD\k=j+=%w+D^1%>+KFC?1cG1wcqnja1@BcRlVTNQ1>ND#kepJL/lEWWZ#D/S:nhB^eyXIBy?*=
%wy668 1IADt>NdARh&1a<CDt^ZZ\We&Lh?Cnm\kZ5w+MBP>qjAkT$hwIADi#6RARe&ibACD8#&aAWe&Qa>FZBk
6qmaj> ?+ew+MA@&E5BB#:EMAWe?BuDFZDkm+^R\IG@MqIBB#:NKAWe?D&nFZDkG?&6kAQ@ca\CDu!5mAIP@LC^
lbiGCB Cnn\%jbS\IE@6/<CDu!?@SS\+BiPW<CB*#lBARi?=WRFHQmj?!9k+GmTAk:<&MpKPQB%y!nk\B<?RAEH
6mkPA\ QuPXAk:</twFHQniW^X\+J<j1IADH*/cAk:<?+MEL8TEk#uA\Rw+tCeewuBhtE6MX?AH99?lCnmap^#t
^jGpV6 kA6LPJm*%CnkaG=#8AIP=n<#FZA\S^41%C:TAe!Qakw+tDPhI*BBJ*<D=qYj<p&D=y48:#RJB*P9!\T@
p:%c>I C1j4kyh<8eL>\S#8SkWe#QF8X5BBe6^:FHCRLQe?BS\p%:^jARhJI:?ukNQmJAw+TCn:5AIP+m!*K?Ak
JS&5^I *9KEAk:mNE<=nTQyAPcRV!9\k\T@#!nkIQu94Rw+YCG&VREHp@C:FHCRIQlFBS#Mu%=T\ME</YWFHMTc
CqX^FN ZqHARWLmX^X\pKD+NRWeLBh/ZREH1\Hj<FFPP#XPD5S=@YL9meFjcQAZG9!FBw6j9>DWNt*Zj/GyZSw%
C=QiHE @EJVP=>w9>Cp89E9NQ:F::m*dj<4VMe#PdAk&FEBiR<:6tB:/\P*nKEV1:1*WI4L65\NY8ZmPmwZhCK>
\!a46# +Wl5u4I6C$K!+<upa8MD&b?Ny!d@I&!i5m%LK/#/+u1tL*49\Pay&:I5dJYLG$A8h8!+4aDNW:dq$l:&
?&pGGj htRCIV$ZajPWciG:9=V$nmT<HpqKjD&!qHepi>w6nPlh&k8Z*cGE/V#cw^Yc/81d@Z#qYduI?Vw:%$/6
*&p4>c eC?XyP8QClL/e&MYj9bnISucPwEhP!J/i&uHl<B!G!$umJ\PBA8YMm1RJ:G5C&/jkpZ#Bap%NSRYLGXW
lhRqZ? SE4dM4aF?Nw\F4/!4>!Le&w&a\w&Z1\b:Y8cat8VeV%uwhQ=cC+S%=MHPwN+qpM4wKEqYenajuXPJt*@
^V#/*\ Dbc!$jFm>dF5SM5%JYW%hMN/QTFkZB:AtALTil=TZ:q>*=KB$SGmJ&Y$kT^LyljX8#LbNGP/!E=yj>1=
wyh<B$ JiC5&#P\W^Hu4nEu/4TBGHJ*&y\*JP!$PT<u!uR+de#Ica>^dkR=\/dhI^y#lnwm*L1SJ?/$c&I=8cn>
$YlYAQ cc?up%PR&y@X5yI/uHLyjVq*1e%=R#yVt@QtQK%&85CR86Y\9aFFV*tyKDj6bK8adHTT4VyT%ERiT5lL
5JmiM$ @:mwHli6+/=\*HYN1=y^%nCP!5Xb4:m1FHh6+1JIZHTI5@4\$B!PT5NbZ:m1Cqe6ac5kuHYDl%y\%An&
HPu5Qj !5BbD:mwAJjS:#:\uee<q\iNCntq^aanXuHR#^lFRThdL1!jMX%Wy^5FS!edlMbA6TS@F1ipNNCCKCYC
j+n^jJ Ln/XTWlMJ+TAmBNePHTCJV$%I:NaCe5F\d6MQ&hJa1%VHb:IqNlcEI5y4mYK=StNe1PVnVJnN?A6\>^P
==yS/5 uK^CbFEB=wF9P>^Nk>\<6G$G6M$\qkc9SZX486/tV<!>ah5Qyl/R&>:e/yd&64R$:\DNjC^5L&VdC&c1
^nIDAI 6SM%<6It8X9NJ5b<^6A5yw6bLmNj\I/%lYqhKtYSGKAbJAaIbwpBtqFmkGKRGCDIEqQ<dPmXIyH*T9Fn
puMHue <bt$?#NKnCAbu+JJDB\cJAaIe4Qyu?XLFJ5Nn1*mBXS#a$w$\&*Iaqn<dHqkTR!LH$EM>YQy#k^mCASL
&p+QVm ^u6:^T:PGLyTpM$hK5+a8%ZRDb$4!Jc5?@cK*ZlK!5S9Xi#TW^t:*u^Cd*uyBBMDRVAIk!DLItGmYt?n
V*ddNZ KB/CalWTee+5Kya#N4e6m+&S/6CIpkkbmTBIJw4qiR^CJelt$dIVKw5+&RtTXaR5\tMYG%8BMatKYWl5
aIidm4 ^MNGMCTS5AmDYR\5AmB*9Z&u&*Y*ZWid8>m&e$*hKuiw8T56uimpGW\VEZFCuwRa1SdBpmejeCp4V#M*
B#D@$: E^<DB::%p=*lmXneqTLS^kBF4G=LpYw&SBG#?!LV#Qw=auJnbJLqGT#GKYLn$8lp*WlFLK=NpYl4j!J&
/l6I&Z B6%E6%#NbI5m6t/SjML$9JJhmylhJIqt5E<Sm/6WJJypypmY=Wctti:FMQ*XjTV#JF5@ablkG/kYB>#E
hpai%R &acutb8Jn%t&db:W@JTtJ*S+Pp**NMdTc>6nc^Mt?8^M*P4+!XkLT9h#hFTSI1NMSp@HG8ttd%m^hqiQ
%Di6et YP@VRBWPY5Vm&<yE$/Q#&#L9T!SNXQW>mI!h*4Ayu6D&ZeyLZ4+NG!MD?/>CW=1@14uI?qiL*Y#=1tlb
N6+NlE M\QJJhQbGHY!HVM:NpaGnw<R5Y5BZhHKn^J^dAp5YHAJDSa5*Z5JDT/u^CW$YH1Sm5F&P@^&wHVZHipG
-Aqc!W 000cd2009ec001202b4 Page 495 of binaries2.zip
$^%a@b &&<iY#cqY?^Il*tL!4=k*mI5Jbhm*1Jbk*VXEyw%ayWld>G5@kP$9EZQp?/d6\lja:W9ZiW%%mCJk8>Q
1qABc8 eE>458iE?wY#G!bEJ5!8Y%^H1?m<?5WV!1pBP6<4#TGC^Vm:ke#^9?j6<kj8#d/q:V>A!N5<9h5:jN9^
#FaCT6 @?Xj?1PY%=?Rh*tKqV>^?9@^?5?e**9<<%<+9:>!@u@n@N:u@Q@P/\?$%HCEjMm@6=%@:^>5:*Z!V?%/
tW:Ihj 6W!$mH9YPu^%k:pXDl%jaTSJGX/DqlQcJp5+#<F=D5=#5Qk%#=q=YK$?#=qbh/NlunN#inT+a?cMMS>*
CKSplL +*qP=@PN@M5a/@^pId=6u@p=eQe?cNth*d&9W^VcWiFaXcc>lP^/?ycRJLCq8MFtKeW:$B@a+uM4>PY!
=i**Mu *deyFy?dmLXRSXQX/8b@G!t:iFQNnt*Fblm&=Lj$:*j$:$%6YLLyjdAY?GHtFJ^ME4c>R!%V=!kQKA>F
h4uQk? iRlkhnW5=X:+k6B!XklwE:Ca+++Ea:T?qBIZ\9k!99hkZepm!d&ZSPhXRdRq8at+#H=kF5F#L=emB!9l
FCK%wR ?Xh?la&A\ZH:E9cPCel#jn+jy$:n<5h*9eVmn>b&yi^@6P:+nqdhPbTL4hEbY1QC^&t=j/&Bm!tM:p\R
8:yGey MmEYj$1HH$8^Ze1:6BaK&b41/uY^ndG1jH8/Ky=y1<:tMm*6<WK?iq*L?8wD1\/5d5uE<>Y^dLK/G#aA
?hyPVD ckmnl5D&MM@:RX9CV=#cAm<+?IVQG:V#5J*&y@SwZym4XVA@u<tIbjV9Q#LlFQ4*8W!AH$4Ze+JYVneV
NLpR&# #nAVLnWVh1N<>IeZ?LXEn+q<%d1aJXK?aq+$$4S5SXTjQ*5$<C+@k>+Cik6a$F9\a?cNWSmM\uBbRP&I
^h!BAw BdWn6kLPKNGL^IIcAn$hLDmC!&IE+@\QC>EmmjBm#TFBjc&RRT\CQedyPHl^J8cEp@nX$11HAk=i%KqW
VDin<J \MHLQD$XeQA!V&<FHL#\$$eBB+H!9kw+iHGwu\IPZm:cR\EHL!D%X<DBT$wDFHD\I6NABS#E<Aey+PCF
I>k%iC 1MEKPImi:/tAk=j/lm4kF6F1mAK8tXb:KiDkBeFlC4kq6B18kF6K1^EKPQk%bcRCdnt6Smuk9p/4$R1+
qbX/bX FdVcY\F*LK*GKPCPw%XEAZe<4ea1+E/k%V+KPHlyhF<F*Cyc:ciAm>F1uAI8V15JC4kYYp%W\MFL6Q54
Xle?CN +PBq&ppKPHkJh:ICD6/Wt/KAT>L1AAZePqyXKiDk^:=1BS\pd=/1kG8n%aEK8DT6ymukN6D1IIELPiHk
RhmwPA %<K5Am=Q1\$KPFm*tXQA\a?8=\le$Mtiu$14#&CJqQahI:@VJN\YYq$t?FW+ZSi?e:qC?<FQ9ne1+M/p
?h*Khh %e$K8LNwhc5CDq+E9%$Bh^/66mukL1DXZR1+1&n%pAL8Gqw>4IC:qqbQKPC8w>ZVC4n4cjYMA8+GYn&q
PRY*m= IH<*$8wiBZ+*$iw?Bh#N6LyjARiJAd/ukL8XX5</QEha\6%G1?eWeLjV/upF*N&$iqHl@8/l%W5K8H6y
*PZ6E# >dICDlIh9KKA?!/6ZqZAQWC4%^S\pG#lhRZek:S/\<j^waVVCRH&d1VuNNlu*K=mDqpY@M+k>T<6^\Ml
TlDuBZ @?dj*/WbyV1e8<M^qKe&4\%I+Ayy#Abb^kpuR$?KE>+k!$y^5AIPMqhMX<BBhw6DFZCRAiM\B%!FlIM5
1QQc*h GVWK8C1ZCd=<ZRl#Hc:AD:J\#FVA#ZAJGMnhYiMTMJB^l:5EDGVeVJiAka!4hRpa!Lk/q+CBnJ9qEnCR
P9Y4cL ejW8ARMbN>5qaCDnGq\CBnJ8np9ARMah=SI\pHF#ZRIGMt/iT<BA^l*6EnCRejNhAka!46EqaCDntq\C
*RVG=$ BnJ8kW9ARMa6hApa!LmwT<BA^l*nEnCRea6eAka!46pqaCDnF45EDGVeEyiAka^d/lI\pHHLZAIGMt/=
X:b=&j T<BA^u*hJYAk+%c+BA^p*LE8ARMbh:^L\EDGuiATMJB^K%$CBnJ8qW9ARMdFZAIGMt/%T<BA^5XhAka!
1ahbht 45WqaCDnEm+BA^t*^mXkIPQY8kRMbF!4T<BA^tXWJ8TWt1ZXJ#Al%::nMCEQ5kCE=+R<!AIRulQ!IA6A
c@?!&9 *KmAc%ibpAhbaPEiBh^yKlQAIF5Tj4<C:q51E$CKP%hqRp=^=/6MJII5EHC:A8=Cqap:^X&pM6Gt8G?4
b9JY=M VQAy:tKXCV:FjWeqpEJ^q/kETIJ5=j=hC4m4XCdGFHi%!5R+!CcAL!9k4qYbGFQeXyYJebAFWq=V\N&k
pI@=Bw MnEP5pDKG/wVYT^a5GD=1pyaMZ+Rb6p+QSeIlFqewIeC:nCm5EAk#PIHQSX\S^CFBRJlql&$n\K8qmk5
QyZFYH EAm#?EE@Bh\5w4BAIM#mB@$XeLPJ\kKBMI5jDFVA#TEKC\VCLH+\YAE*q!k5EAm#?MFRBh#SSGGBRJnF
ZdK9Cq D@bT\DWTlRWCaSa@GK/AY$AWFkmEYj^kyAI8TlRYCISb@GC$At+SWXkkEGd^k#EK8MXEaaFAtMWQ^m4k
$iD!kl qlKFBRJlFn@aX\G*uCk5EAm#?ME+Bh!^SGGBRJk6uJmwkD8iKC\RCLQ+\TRF*E1m5EAk#PIHW^S\McK\
VMD!Z4 RCDM+khXC4k+WXkkEGd^k/pK8ASSYCARb9GDcR1+hWSlkWCaLZVIK8BkweMGBS\5hMky+Dc1^CMw:pSc
9%%p@h jRH^CP$:D9EIit/VTn\m#F+k9%!l@W=TmWhR*DhW+lFl6mDmXkZeFyX=jJk6aNmtkD6Vbj+db9Q#l^S\
KJ*tK6 q/nEI<J5*9&EA8=!qjkB^X&lEn?k8C6X+lblN6?@S+Hj%T4^wVCd:>?9kL6YJV+Wb9N>#\WCaddA+npF
:q>LiN HMRFuqjA*cITB\t#BR\9KiB8W+tDlNpClqeWeHiw^EEw:p/XPAnF*cWTB\t#lSMaB<GCBW6*myi5k:p!
dphA*t #INlnk9#X=md\4\V=yR\Z+T=IM##aA+H<#Pai<G<C8bMMB?C8R:Ma&CPA9MQtF9A9AHtBPD9k!<Qjn4+
GE\D#Z +PBjk?<MjnH+9PDQR1\D+lkRw+D+A<RYIG+AMRGa:$MMB8I4ED8B?A:Ed5B9Bb<W@E*\EeH@A><P@Dd\
CPt8dR !eDjAq<K@CV\keC@Ah<F@BL\PeCjAF<B@AC\<YC@\VcD*RYdC9aTdCHaPdBlaJ@A>wBhAb8l&RNab>SQ
K<9XPV Y$$$6kJ&w>H&6$ibK8hm&QSCp+ictnVd#L$G>tqNJXjZJNQ^XH6LAmYqnPRBatqP<6AYm!jVlW!?FTYm
TD1ktR uPSlyJM<$D<+SGpwL*pa=TaQ1^M=qIj!pwjSV9KRZb9Nb?L4E+W<mpRb!WPpKA@bNTu\GdD#!%5i?54!
PiQQd! EM?$6YZTKBJqLA@>8D^pe<tNSb5B=kId1V#qai?mQLSn!AHqAZdGq9RDCpVb!<NRYS/\beyiH5a\iRB#
ue=4Zt ki&C<pAGcb6&N<ZmC=5n#i*bdCbZ1PHd%>iRhHIn4YPymE:B$y*qwRI&6NVpIXHIbW=M=NduI<&FYLwq
WiD:Be qt8JNCbZ=&K=#TkD=TMQ6jB1tFW@$E?wEMyWHpI&<5A$R#KB+qB?<qDlcT?ctl5n>TkbbTIQQY#$R^SE
Qw8WpR I=1KyR5%SD>Eu:I5@MuiXB:/DtD!EI*YW/&RZy?\:G$*kt$EZqybSj@156tWH*!ctlyuiiGwkw9Mc\MJ
>+/CL8 l!i#^#SFG?j+\thb@Y\@ut6S</J/Q@k5dqm?8Gy%K<ut<>SH*DyD:@q6hjCGCRp&u:S>Xm!X!tVThKCu
HpMa/i 5mT/aGKWu/iC<YW\imlpn&N<+8:Zc%wY1c?8u##b8ZYKjCbQ>whQ*Kj:!j4FJ?5Lu<TtdKq>4@FyLc&@
ItHJ/^ BlV=bD*=SGQ=iC#q<tCMV!#9D=>+c!uQ6WZm+!cJ!u^!:8&#KHGTYu@qTc9dPKY*Wbh9I?uAltG45k:n
JDSL!n hHu>Rp<>Byk=Hy15JSN9>$Q@=QK=8B><<1&y%X/+cMMeV@&eL:V:\khKFY&pWy+L?w>d*Pp#=uhVm$8j
Ge4QnD #BiL/<#HJ+8:eNdSET>eW*Tb=@%$ce96?FRh6N!ijPI?*W@YL#=bZ@n5d596eD<h6>#PD>a^!?*FS>F!
uFT+yd P:Dy5PZ&+8Pd=W/5Jh91ctGe\8hkXT:yNt=DqDH>9AW5ibCP&&=keS$:9wMY%&YE?YS^q!ZVB$&LdJw^
:KHNHp *eHm>88R^1S<jNGauu!!Q6&Qw1d#+yMqGjywWSJ<>DhpBL#MHqwS89TIKBt^bD5>Zmp$AtN$DL$1Qd<F
FE8qib #qhWQdLhwFq<+cPwYS!i1<Pc^a6Q#6QCWVq$>^Rau$Ti8GkTaJLI<<FD:D$AQ$cP#miXZK*w5dqIEPYV
p+h?NB Yd*Pne@C%i5<?jS1ekyV<VK+9uFJM**$^J4WEa+TSmcFX9X>qppW5Wna5+Xc#ii6u?6H/&t?M*TF!@&a
d5C<%K jX+:mhh<b^@+cD/9B^?##?5+A4$$bn$dPb+TD^4V:Z=M66*=j8Jp5m><Wut9=$4F<9qIjca6t$^blHGL
8DN4Z% yMH>8S?1\j*kR+iFL:=1mbyqkKLQ1<\uT$CFK%kW%pCqY!a9Ql/Y!YNetC#VV9i:#1iRL%tQ>Vp/6nHt
n=4W!w yu9*$KIY?Y5HBLlZVIa&:KijHj1?++\h9GLN6qG9YI>c?MCuQpYNKB*KMShdTq5Ruw5W+&84dG!yFt*\
ZpRuXV +Z/$KIEQjIySA1$wSkqYPWWJYk66KcJwKaij$&K&qDwj&BnZ=Z=W&yuQ#q^uWVA:A$b8jFdMm%ILh=I4
dEbCb: H=Z:$YbuQ9TZNn9#ka@tR*F^L8Y=ND/$iWmJ:dMkp$/+@>Va%BVNqcy*NF@MI&BKStLE6L\nyt:FwA6h
CReYHN 9XCMtGLEFCPtXn:b>qKic=hEZp55GHuhQbFZb4tdE4t%D1=CbYi#*J*TM9p\eucuyC4F^V!YuZX=u/=5
Q?mC^V %=*6Xq<M%=&X^kjZuZY6hYjK9yk>I@>>MR<jkK%je!&+j1%44X@#CkTVkb*Ne6e99GC>y#@CI%=8Sa5w
lpJ#4H ?<Du/HY=NXZ$4=VuG6DhQRA6Mq%c?^km$!Z$q%<cW+6Mq!k@6eAutb*nl^^&Nw&ycclmlL8E=>L+RIT:
>PG@%d ^Qd^YnbEBuVPhWN^u?/up/$@cm&6uV98a#4jWMh<VC<?uY\hp:KQce>I?Jk?4wh!H/ZTi1lh/@6wjD4S
Nt?>4* imm8^Ybu+k+11t<HjJ@bd8*VAh@Hqa?K4?FqT:8+4?HcQq?B4?F+Q^*$NX!jT<XHWPu*D9kI5:*G8/KQ
<%@D*e +M=H:EE^8pLQAWt\qHGSenlX+l+WYG^!@8EiFCkQIA>:+S+WYCS=GIb:WGCS=GE+:pGB^Y/QG6!DA8YB
k*y%Bp +B+WYAn8RaHFWS=G+B+WYHAQCm\P<nAI>/DAa6$VFjikRHuR=GEI:pGB^bR#GQikRHuAQTm\&MpD:pGB
p??n?^ Bjik\PIpD:kHBSdbu?!Li%D+\kj*wMB*kW9qk?<C+^+WN8MW>/B\L:kHSTi$8JlS4T6bd5!wXlwj#KmG
mBS441 i%DkHlTqYF#ek/I$Vah:WP#We*Xa5?AiFF+iG?=Bai%%*IMC>/DAQTn5jXZek+IwYCdek\L*wCC+B\Z8
4IMp$& RaF:WPAiFBk^6a8a8lZek\Inylk^LaWQ:pGBphihm:#mHlT?YCdek/L4?ZT+B<Z8<MX\*XqyjHDhGi=B
&qhG$E WbI9=8ED+B+W14+a:pG^!!\*:pHSBV$A*IQC66RT*IMC>/D\^XjFQTk<jCnek&Juup9+tLkHBi=BadGV
I6/W6W 8AeF:pFSR4>*\EjaQZ6RBEuq:95qHPhiPQjC8SjP9d4@*A9Z@JVMB>j<+J1j$9uktl>jakC+=thuLVi8
#TaFcX ?eE%Q:9Ye8Pcu>IqXcZkty?T?iCcH%##W!wjZQPDc*=K<5W<jABe</Q1m*YbNV?i9+V9kd?E:<bj\9%/
-An5Z@ 0004a9cf69b001202b4 Page 496 of binaries2.zip
^JN+=+ n>8*Z>T:eTaPq+K@QPM9#!Z/9QnL5&&yJjnL5!ijukV&HP\B<?aKjZh#k1YMm=V6uVn6Zw\:#=YjQNB1
&PBHjB V!h=cI9Fp?qCJ6?KEqFP<nDEddh:iwnTWF:!MNSNHqauemkQ=TWQi#uJR*b6Ny?J4$<WeH?aeyKHEjJ8
aPtTc* >>Su\M+9d*uwI<6DQNQYqptnTJT4QFSAJELc#b4dDDAZ&Enq1S?GFiYlHWMPKA?E>Jj%A\yE&e9DAFpi
H<@Bd> 5GZKZl/GM*pAe+H6k9JAB695X199T=6Pd1S%LIW:%bdN@GK\=&:Y&F^qI\?%<N/%XV@RV/kR!qRiRnd!
GwbNLN \DSDMwHmWH:!WPFyL=1cG!Q%KBqqIk<>dQSDFERntw1qC#XEQ$Tj5m#<!TGa8eYhD&b8eY<j#N!CtX6K
LD#$%H /ZjM*NJbNB%td5HMLcZ#\e\6:ycy6Q:C#C&a8cY#YF#M*NJbLDhtdmqhWqWKbt+ytR>td5HMLcZ!\e\6
^jS=@J tLtqJF@M\\jA#C&19qn*!h!Ci=nkHma?<ME>VN#uBJlJBnQJ:FIjHDQJ&JbckyqpQQpE6B@G5bS:/aqN
=Lw48X WP=q>y#G^RQuyR8JZDySmDS5!1a!8WRHX<CW?HW5Zd%MuVwX=Kn5&\G6Kla5KtXIIICiKBdWuFm\:JVt
lHI5A= DFLXCaZN?y9uNYDVqHhyLST!NhZXEM?4!4iu1?Kb68y5L6QTHm@p1>i%4K<?5P4A/ybMQF<h!!c48/WN
%/S%hu RT8CBiWAC@1WYLB$*KjE&V1Y*XKC&AVYW8HD/A1TEPu6t@Ypj:$ZLF^R%>SR%dDeaaJb!&/h@ej4JaGL
i?X8#* A:&CJ=jJ5^G!pHId=ZT^ECFlYl$LPqVLhYX5mhP?cy#iKAE>F=h:+!EPealDZMh\Ehm+1kjwyCDyP<D4
y\RXSi BcMS?H=S%*!@KA8L*IJdb?nT5c*8a5%+N=?$*dC&MdykayTjy<L#bVB//DBC<Q$mjL@IqW>=9%@p**6B
6SIayV 4Y:nqL<ZqA=5GLa1/#BP<d&k49Xi$AC9NC$nME6LiYhy&c&YG:P$qMaH5:S$4T\6jtbZ&XbZC?MWQki4
@ZM*C\ ept*eS8mnPuuLYDJk*VehkPL&&Y!1\#\ilY*Z?h<E:iV9WGdJSu/cFETjQR*bMV%ENheEd4$mCkb5YR:
qI!lEk QX=yj4Q#GHyXiu+LuK?witT:RdQ+\1iV9ju1=^84Ly4E?Mc19Rjk^<nS?ZTmN%b:NhY:yuIqk?5dq#VV
iZqlNn S$?5TS*lKGFpWtlX*&ibSBGLlD%d1NX<*91=j4Ti=n6DX:nen>uu6bN+#Zj&ka@t<*4\Mj8<nmQRT&QY
%LATA$ 5=HnKjGkMh*8^&Vdui<uVmd:\miX>*w8iIe$Wy>y!!bVFtHeItq\j?/HcuA@?NBl+a89Y1JtGcDw<!4#
p+H!TC !SJR+RwYlVXR/bdJm+?HbjIaF!dL6NQ>49My=E9Ya*&<$tn9wWW6<6ePCHC9tA^6&E<@P@S>^^p:iMYc
bMY8P5 dcNi5S/%<IGQquPk?LK*k!$6b6W6^6hY&hlTLh4k\@%wWRIj?Bl!F!lGCXa=SRt$*AYKquL+PT%tT/u#
qRC6hu Kia8KKGh?i#MhSaF5#Nk=MbH!%$AL?iZ&P@c:M!H@6Jtb#:\$Z!wa8/CEy=L+\P=C$y5u>&Z\S@#YtQE
wHZXuV %D%m/qa\4#XGVDFmYkwj#G8Nphihm:^mZt6jLBQt6i=/Ql*t6h+h9lm8P!8ND/+:\:#YJjqmHn+A=4XY
:b1VWE >eY/#Qw%*E?^XD/+u!L8y:m#>%NLeD@F*dYjItd\>+pQb9D*\<jEDQ=Pw^R#?GMG@/:nc&AG@^L/9RM?
uRDZ!n \8:J+A?b&@9B/:SpXAWlR!E#T$$N\XLGBhI:\H9a6i\DqaictuTmeGIt6:+t%SLLWkNTp$#HW?$6CbTW
w%m8aE MyIHYk%^pwi&YD!bLtV!4TkS=TRQi#uJA@&DR=TG<yKHwY:!5D1SR*pwL*pa=mRQ&dZbjCc?QqHIw$mW
BGjX&n pV!MLMyDhp$KjAd5@QKYl#/!QMR#dY&bNIyEGe6DZ!+Q&X^!a>FtkLuASmyQiSliqIh&DDtkQECwY6IQ
L/JljN KBBqL\<DbZuAqmq:iSnB=AHMBdaL!kQbp\TyQLDF?5*6Yjk%8tb8I6cT!PX4TD1=phc^XETuaPuP<qBB
CX!8ME !GAtD+qCLuNmI4e?H&p8^NI65X^LyDG=PljLdWabKB>=1IYhAK#/kZ=ClXCt<lC!pRitGbIJFIj!p+eK
PwZV!F V*9S%N\a1WjJKBN=/GGnH/IkG6FWLF&wIjwl?ySq+W<P\Z*M5GBSKtL9Q!^a5KmQGB!VYLCkFePCyi8P
d!TuHC GN!6#\<?8F5jbp$1qR>tVeLh?t#GKi:Y=%=\6:=PcHE^>*SZ56!ai:w$Qyl:Guj4\>*/T4G+8F6jcbwP
59d6eX h?9d1ij15GdB*j1<QDde4e@c/:ldH?:Yl:9%&j818F5jWdBM8F5j:6bHeLe?*K$Qh?9D*jw\atwZMZW4
8?#!m: 8F5jSp\^aqwKH>!6D!P9P^h=^h*/jLFM8F6j%@QyeLi?*iGL+d1#$9nk8nQe4c<pZ<#DB<Dh?qS>Mh!6
hSF@@l d=hbd6!64\6/ALldu&&yJdldH?:Y=+89m49%ijlR8F9j#n!Z<DF^6#:e4e>mJ*G*Q6!64+S?:+CQ5H6&
1@yAml /!P@&E#IKNKYL=l/4jItR9y6wZTVcA$bT$kF$NNG?uCKJ^MyQYtp6>$BE5d+l>+V>LpjR*J?^q?tD*<P
$=y?SG p1R^@nI>AG9PK:K=^B4T/<ySSH>jQnAFymTMjnHMTaKe9yH?N+uSk\5IbPJn>B8l/Sk>hkQ\=QSjCV=>
I&%p5u Q/HHaWaQD1N@9Sq>/6eI$Za&lK@6w>>Q#*idwME+jd!+#=ZR!#$=jSL>:#^GQ@Nli6!L$^?Hi&X<Q8lH
BnH=eN aAeL4jRAuVtD+d@#QPlCVwh&:<jw4hAG@Vn>bQ4jjw^?+DJ/9Aiu\#MPa9SJ$Id>Pj$B?6<qnH:Bn:kc
bC^&T< kMiwF?%\$RW\H?d$C?q@i#L/FYeBV$aj>%Q/Z/T6pE<SR\/Dc@=Bd?&16pLYSB>LXW!k61&R!lnyw=?D
W$4JD1 i/D+yJE?/&VSum%Z$8Q^uH/18M@d:1ZHE#n>PhH9n<M%JuL/S/Ljt@=Cn@juqtG5+HQiw@BhVq<9?u*V
#9X=9n 5bVAjbPGhuE@na9w<SSP*!#w<$?p^\h\?nhF9+@+G>\Dw<<b4Qh:4*Y9WeJWSn@1ZNH9y$D:H<nyQ^Q>
eK$Yqd jmi$?VSP@=Zi:#%ji=IiH<Vy@^V>jn9I%MF<*FYIjn<bjlE+lNP9EP*\KC!q+nb::68m*#jA5^:K?@%D
1SdcS4 1h?DaykiSiX1+FVi:+JPyn\q>d6EH@$@W4>L>Q9w@jT>4K&\%1Rj>t?k5Cq6&Z#TTL@mc#CWw+*=At*@
TDm?B^ m!mB@#a+=t&lq&V<>K*$jw/n%<$d=Y$y9X:kaW/Z:=QKM^uB&tE&/EwYI\15y&N@Rm&nD\BjyaulX>Q?
!tt:R& /hGZ$a<FPXuA<JjReZV+dEd@/G^\qBl?d>yHkWyG9?NK+dCNkZE&nNGuZ$1Qn?F$pFM8u=hDu!#mhPnu
eZGjT+ QSn>QjD$tlp>R9XNwAinn:pEVDZHk\#MbQTJX>HnJb^?m8B#@&jRMI!?:#dK=:iMQkNpiSuHk/#!=@$I
YT?8SA >Mq!Sl<Q?ta%%+hk$:@P<XeJ8Z4>PnDXuH/QiK:#/8n^5b#QB94j#^t>+Sb/jB!nV\B>\69u/>BH^#Q/
*N#FBP SBmQ&^n>hMCi\QXQj/EHjk+!6=Jd$%@R:8d*j?kD\q!Q@b4w>!q@y<jMSR4<<tZS:?iCQ8Si>Vp:SL?@
e/bpn8 iS<qMP5d?NhA$i<u\A1AFwcj9EH$?=MkX@!u=uGum*:jCukid^9#pGmjw</p^*\%\dl4SH<hC91BP=hV
>$eaF8 j!Q/jeD9KIHd=!tdSL>jC**H9jq^&\TjKXjVa?=@H*!m/Qh:\Lb\9&DeY/Ljj:wZGH^Gu*cE/QeXh>Fn
wuy=FS :m>M1BQ>*lNpM<Qdibq+41QB9uQjb61Nw6?QA%8$khEQP%#$?@CS+KI^ip&#/QhSwFi=y*ZkH$T@d*&R
6MEp>l H9QJ%5!LSL>jNaIT?P^^G6ndcSy>*N%A&Mnw@/ZnP^#X/PNH9WAJJ*I:@mNh@+>:b!k>*5Vd:Wlhu+<j
kn:5a8 D4K&thEQ?4c8#<ejA:+Vh^/uH/Njh@\*Q/jHJ@QjEKcI/\/C6h4j+P%=9H:h<T5@yejj=P*\8dn8XcBn
YPPB/M V8H/e/!+:6tn/jGynH:GDuB=8N+PCd%*By#j\9YlSN@uJpu@T@Tb/!X>HnJ:t%#@T@TDY9V^XZuRC*\C
ueWL&5 D5Pa!qZFXEb@FP:lNEd@/TS>jFY8i=WTVth8&qT16@a?mhGjl9a@k?EQQ$kjZ=Y6%Beqb@L4d6ZHX!Y+
*A5cGP e8Sd9H&1hDt5jBl5/%q<9H^jH^iX&4k:t>GQ8EajZ=Xuk5$@l>GQ9FEjZ=Y9Rb8e!/<4>G4qk#C?#8Q+
QNl!Bw N@Z^XdpWd8l<Lk>u/PP4<kD+:kYMZ9iRLmiXu+P69=DS9>%Hq=QKQWEuZMVq=G8/uFR?>RRAPb@*>HFc
h+p@lY 8R^5!MX<J9i^Ln?XN+NP@k/@H!G*qY@AYL8E>*8NQ1+4L>1dHq@K/R6Ei//GiQ>qnL=pmn/8K+<CHye#
WiSe?n i85S?4m89QXqMP!Muq!1n?9KP8mnK:qjh:R?4m9j9yMiZ<Z^@>ZHhiY?#%DC%X!8bH?%R9k6M/kj*t<8
bFTWp/ q*>BJ=hSZ#G\tM8@SB@#8CVuE9%RPw+CM:teT@S>#^J!@n#+JNe\8X*\wt=HKq>?uXK8bjmuyk5=j\#t
>$6Ewq 5F5b@yE4hV6T8Rq<9i5a@y6*CDu@BG#y>h!8*TZp@Gc\?Vh\?lPmZ*+C%:!S>>h!Ib>9\n*j^PmujmVp
X<WnNG @DDR##j#j6\8=Q^5<BN8+Z:WFMFuAhniY*q<:VMl=#Nl4uEd>+e4lb^jCQdqh5/uS5n=p*A@h#D/6u8F
ct1IR4 uF<QM4KNn></Iih*kc#i!imy*pLPV\X=8+9L\#iEuDjA9P^8:4@%F*K?H?mGi#l>qJD#<&Fe*<9=jF?$
kA4>k9 =^Swt@5a@dFJR5/@BN@l8=#?kbD#F/G9:tj$H@eRey+E:AQ<@qNC#5jDYQ\iu^djL?Re%Ch=pP96BpuP
:5MdFZ \$LPq:<n?ieT9iIP!i<NT*L?pmVuEu:hREuPJj\y>\p=j^D$<@ib*H:<P!HuLWMw=ReM@>=tIihVaY\?
aEGp<8 yJFD+PeZ=j\#/N5jM9\L5+TeV\Ih<#C@:4NC#q<jVw<j+i*&C>E9>+K5Qe4^d\9=9A*c@DFG@?BdR5:Q
eHk6bt Bq@?S^#@kbD#\<Hu?nEjF=MEu?Xk**@C/B?iL?T<B9##u*ILiK&R<&uk&#:P/Ki@K8V<GPnDu#H/Q^JC
aASXkj #n<D*?AJ:qeeL8R<CV4kTc/9nlX!@kiaC@!e!$Na!QqWmCe<^i>@lm:uQWe?Va?j=9mEpQML\h+>\@u@
/NA6kN YLVul!Bn##L/V&1FuK?Fh$?ja@S@@$DI?jukH#:Q/J@<W5l=H8dtL@C+\hqC#t9il\AXw*@cL8T<m5/h
4!>^6\ !T@=jBQ5^mk/9<5c@awW/Nh>NH#\j4By9?J$LhdB/EiCDL:I^>%>?4\+PBH<l=j+@Z^Nu^eHb$A5+YXP
1RhTp& @+Hk@\k</!8<jb+S@G?AMja1w@@uNJ%@+G*k<Y6G9@hL\Z<<QNN4*L>/B*SnY>+eD/pKT*Syjyy/ZcJL
ZKw%QW h8jWBwp8nhN>jmdyl^+/Pjn>5!W@5Ijpy#$t?aET@yG#Jj*R\<Hjp?m@tKj4l?AX<L!95*:58X#*>+K9
A1!@4F kV=@k>H:u1Q4l?AHEKQ/Dd98S11j^@Vt:R>#6j>l@L@+W6eQ\V9AF9!Y??$X8u+InRd=?S*94:h$iR+%
TyZ9l5 km@/J4@Q8D/8k?iC:@b:hn<Rj?Q/IjkC^E:?\PmXBX$@lNyAy6:m%^$q?Q\Ran^9M@!k!*V>EQ\CjJ6*
-A15+C 00064a8569d001202b4 Page 497 of binaries2.zip
?RJ9+S PH/T4l?Cj\d>@:?e@@*/8A/?BYQ&n+!?b%wj%/HDb>Lnh#tj/j1+Dm*:F#*?E>j#q?4nP9k8^MD?n?Q4
VnJ@Vc >ZaIQkt!@YjP@*b>ZAe@A49GammBIi9$eS%Kk8@=F$aji4w?4wMj\:Q?qjj9IH%el\dC<h<ajc>J?4kP
9WJ#l: BeBHi=@Sl$@Z^%iwB64p:=!?ZI!9L&G5jeDy4YL<Zkj?=+ie@l>>jIZt\^^*P@h#V6Hpq8pNTV:9c>G9
8dptXX &#<MeiB@eQyb?uZ:9\K^tZ<!@1H4>P9&j\S<*a>+P%j4%?*@J=Ddn^q>^G#B@^&aK@!L$>eI@qjD9P#j
66h@hN uL=S=#>kFQk!u#D/!J/C@:tk>#:q>EW/j#IZjJ9QPL&k<!ij\b#^Q=^?y5/j4IX:@=#SS\*X?Y5?MQtC
:BSED@ $jin<+pA+>N#Lw!9L^u>ICwuISb9:Qp$?H4@=Z^YCZ\T=mI:GH%$X8A*H!:C?bHVBj/QhM\Y5?PP8%:k
uYB4^L G/p@GYC/L#D&EwF@i!=$CNMQ6@=i+F9AX?E/<jQBA4<G=lyMJ\at@Wnk9@E8nHFG4@1%\F<*Hkamw?@:
D\u!pM Qh%i>@^VHRk+8?/Xa*X:*jN^!nQA+9!B/ueF@=HWSkh/M@#q%FeJ>tV6uIG&a9H@$Hl/u!HGu@^\Q%CE
WIi1>W ZK+&/@1VHEyqPMDm@+HyD\5?t!BY\?L@\c$dBJ?JaI9:<@6@X@B=D@m#?H@\lq5Eu>>DVJLF@+M**X*p
=FtKH! e?1PL%yAkZE?@^X<D1c/MDCa+i@+WQByH\TKlD*ZtCb^Q=Ptk!Llq8I$\ijCW$GSMD=*jmL+LIR=<q/M
F#/Fck j9eP\Ye\#Cu+&/HZ9CH+4BkPCwDl9*8M+HM/?Lwn&Q&MGmuhD<#hSuI=d^S<>mtAIHM>NqjVG:GW/Zi^
5%ZW=e L@aFZ:e6y4Vt:@<BWE5DBBRAAkAIAJXYdTYdIT%8*mkAAIA^AkAnAAAAdGqme!>\b*BnbG59dYFnL$J%
wBn$9i cY^pRY^5W$SLLuB!cm=mcY:6HRq$FFY!i&b!EK=AQQAiQEBBAwIuwlJCA5GESK+kK/8VbCCBTVLPBAX&
>pIl$n XRVZA<Xd$EXZhBZ9&$XZZSeFZHjZC@GEhd*\96h:ZZY4?6j$@**Mpe!Akcq/4&b1/9hW@@/@/9@119?:
jQ+iEB 6b/n=nTFGpyCwatnn!$PS&by:aT11yyIcY%FtT=bumHj+>jhlS5@9YjcleQn@QHMM<i>4tu%4c$l?PHX
aRw&E1 NH%@#hQ:Me%V>IGt:XEI9\@XQXJwcY6D5DaRmVT%S9\%phbb\jw&Le8kFuA1+QGA$\AuAp+B@BZkCaDV
TG$\Cc AThA8$FdcyQl&\jj9\a<EjAp\ABkHYA>aANkEHAG+E#AS5BJkE&AwAJ/Du#QB5T?mRBGAdHB=\C&AJ+M
SaA>H& iA4k1aB#Ab9lQ:u\Had9QQmiB#kj<DiA9\W<DjB$\DMAF&DuA!+EZAVaCukY+P@k9@u\jVdkPaA*A>+C
#$VM!< iC9kdaA*AN+EiD9kHaB*A9+S@6MN9qjCh*j+9k9\Z+C9Aj+dhSD\H5B:Ai<D9B@\V+C4AB<AjBD\#+A*
!TbmPd An+E?DDI/RHjn\D?BZAN+F4AhaBQAQ+X<HHA9\E?Cjl*\EjlQ#*l?#H+B4*X@kEIt1&>Ajkt+D<Bu\J<
RI=>ED G9Ab\GeBu\NeD@k<+AdAF\BZA:+I?BLI/RZjL\P?A9ki+Q8AaBjcl+B9A:+L?BHk^+CjAL+F@?pN*?@A
d=uDnR h^F<j\4+GiDukF<A@kj\T<C9AL<G@Ad\Y<D9ADeDw5H?F@/:A*#@AQk@\CYAF\JiBHk^+HtAF\BiAuky
t!/yE9 +GYA=<J@85D*?jBhAN?ZA%+B8BS\GiCXkFeB@l=\PiDXkNeA@kF\MiC%kC9k9%*l?#4A/\FS>%CZWI>R
kWdhht H*ARRF*G<?A=8yI>wJ=n*&P@a=>lH&D:a>6lY&A:+QZ5CLkVDp8AP\Q&Ah\FeFhAQ&Bj\L$B>\HeHZA9
RE1R%+ \H$B>\Q5B:kd+I?Ai\L?BNkj<FZAnaCdAQeHQAB\APBA\AMBB\EYA\+GHAJ+EPAikEMBl\H?DHk\+CGA
GYwcbR I\CQAn\c<BnA\\GQBB\JYAI+C9A\$R\cDKa/E1YAw\HLAM5B^\CPBc\AHAh+LGAqn5/AS\CPB/!G@&Id
^&Y5Gq %AAiB*lw?+ajHhySl@dc8WW$Ij:iRX6$^cJXZdw&X\d1k1Hcywa&pk*nVe+A$Z*+i*F+<b*u9PVDjq^<
ple=G% \PLRPS6<&H6uaC5+Q*Nh#t%</AdCb==8ELww/TcK6Y=Xkj1^\WBDMBI6duT@BAjHb!*Z=SFiP1Gn*KlC
cLTeJ* DlBiZT&J%W*<^W>%!+9>>kkF#DP?hEQQ*MGuuFRu4h*/pMybhhI%9QdeYL<XpDJnC^tZ$aM$G<*caQRm
Q9nBdQ NVebScV4J1QR*tW^K<Dt??Zdlu4WK=VE:GGjWKe<WeMJ%hYVLH<y4/k5k<N#@WMPHAJ\+I#knPAId?>8
T8Tdk@ d\Tcn!+N6AXu6pdt?Te%B9%JNTSb8hW//QRi%#:T:H&pb/!Q$48GbPZ^S\?j4cN$^aS@Tb%J:*1l=q&1
TLY#*j kyGbRZ@%uA+/95eAqNVWXB1c+S6hPYb1@i!tB9Tqc!jYqGymkE1%hhTS$qA$d&4/=SkD>I:1X%?c=ajR
V1BIpc VH5k#eAH$!^dTDN>Ae*$8>BbiqF>8yFu5DQN?1W$p=dS#D1eb9@>cAdhq#!EMZS^^>A%nTChK1FbjnDN
q>R=?: @kNyhl>G*5H?=EGMyht=J*pcjy1JD^i#9PH>nKiS6byteJ%tdc<!c?ZTdJ>QH5pP=BtNIt@tTQKM8qDL
/@?M61 :pTiVB==Bu8pye$=8665tuWAHX<\9uy<TXXbehuWM9hnSyy?l5@<u1^j4Hj^@Ea=Kni^6@KL#uc?D61&
&1G>m? a?:RW:J6$NmeRHH4uDS8<M&^V6MZVF&RjlPkQQPH5@Q\Plbp8NZV<YwV?/=Gy=piNZVy=J1K+uApPKNy
?$8k/# 4ydkBQnZQF%*Q&Q1ePKJ$dcA<SH=bTI+9k\MZB=w+wKM8bK&t\p=H&@q/V@bqG@1D+\EQeeFVktWlkLS
$k*p/e cDBcQL<ydD>/YpYNj%#JqBKHq8/mnGTDqVq64PK:uWn#wEaSy>nk8JntL+&mRjqEQ$n#uEbSqqnZ9KNE
h1jL9I C*/pPX?nTFF*w9ilMR#yw&qiS4yYDqS/tIa%yH>HjkjT%>Lwl9S>NAen9bb<C/SjydpZ/e@I*<At!CH@
/pEmBj BPp>1F&RHp4?C6LqNGen@T9!W=CiI?h9#\ZpX!C>pu\KyB<q*\LyF<qjR9wn<k?\/ZQJy$F/N@J^pD/I
@M/4Hq @B/p^=EjlHR>?SyI6=FQk@V==PMkjSQ=aWk@Su+R$y9IS$Q/C@KS5M8:pj?GhF@TCcTHpY?HhAZ=Xpmj
/:YhSi SQ+h$1iTj+Z$^iV:Id&TjC?pH=cSD6>/<4GRjy6<L1T@JS<Q%T/jjD?ph!e@C8qm<9YRQma&CRJhHb9@
j%K&p4 kG/IVZ%AS&P#H6CLcI=Ditq54kQ/F9I:pd/j@E/p%=Ejm9Rt<p8S@w#<V#RJL>pM$pZpC!K>Q@tPTB>G
Em$SiK 9mdTyiV*IV&S@E1pG<njSHwP?b^Iu$5?J>JZWqRH/b6EqNtkH/AwNNL4KaKM>Q5mAt*M/B/KWmP>K$Y^
D$FPwt pV/Iw6qIn/GwN6J%FN%G?qTKdmP>lKLeTK?pcDjTj/WwN>LQ$hmB>H5W>ebl\p9Sd/V*wCk+$whSNB#y
VSBt:X Kw1KI>%I$ZGpV/MwPhIZWdRe/S5ycw:$I^R=S*1DmKAd>MeWSejl!WQShKS*FlF#k^=EEZYpT!kcn9RE
beiuZ$ EW$*/BpWeWh/LpZppV/QI9NIZ$WSi1V9yHEV/d>RyB:yy!qmn@RdFLqH?p8K&CQ>E$Z8eSn6TSF<yQin
RdqtS< TD:TS%BEH?p1m8\nQb$m@ElHKNKQ>JpW<Wh/CWZ?pd/GMkBI*$qbAKV@K4IBB9$<bRTRjw5!A$l@IcLQ
wZ4jFq CF%%mp+n9TQNE$n*E=Fyk^=P$Y8pK!t/njS$muIn*W#Sd1RZW6Rd/W5w/w*$hSV>S9y?mwIn@ViKjmQ>
E%&$>> QEZBpZ/dw8FIj$>Seb!K8qN$HPt?FCXH?mCKqmNhVqF#yChV>B#yAEZSpV/bw8qIL/TIP6KZmem/Rc?p
t<%?/$ /D4T1!nKn9R/pWE^/BhyVpZ/M<1I+DTbK:I4B8&uDA#Tl%PGB8q1!6RkHcTMDhILKHPD>BYW8WH/N54k
wQq^lN IL&YMnqI9$abHKR@yi\NV5<=qMXB8m>qe=A?p4I/TE?t:A:T5!uLk@VbqP%BinqqjbC?k@\GyNhRFkny
:?GJX# nbRJR9wLpSFC/FqAYTGp@bRhR9wRpRE!/GMyR+S$E&X$pD=LbIeM?u4KICH>KGYapH/XMp%Ij$pbJ*SB
\qC6>n iqQtCitBqHqC8w\!WEnZWTaK/VMwA+Z$=bS>R9w8!pIl@T#=TWl@RqpyhHG/WuaK/j$wT+Z$cMyYIV&h
WJW>YJ 5qbIS!q:ljRT!tIljVNq5yBiI#JcB9$GbdYR@m>q6>ChK1KMC6KDKLPChCqqYJCiSyp>yEPW+WN/IYZ/
1%hlJq pL/KMt>I*$abPKVZWTaP/VhE65!k9/F5G4y^QTkVl9R?=D5mjTSq&=A?n4J^TM?k4B#T<!p:l@SqqKXD
*t8wHk imXq/bB?mLJ%TK?u4B*T:%P&D8q9KY8H4tR*!6+l*a?!iEkjVhp<yKhRXk@yYbVhR*wSbjtRZp4bQ1SZ
^j!kT@ W6aQ/aew?+j$5=RBSH1#!ARc>A?WDWS*6mhqBbHit@^yyA?q4BnTNbVbR4yB89\:Lw4hckK>nLJRTN>I
jVERXN &Y1pH/YMNhK9WAac/a<y5+^8hFjKLmP>F&YLpS=EYWmp!!pVmjR$!m\m*Wmba1VQyH5AyJhV^ljy8!mV
@1><BQ m@R#qM%F?tQK!KL::1NMK>L>Kh8K>DGWQWZ/PJEh/^^RFck*qulw=W&ScJ6@auBte:CqVS58Rm!XVZZ?
i>ebb# m8b\c/VNj?nl^&yXNdZ1#%GBWKm%6eW@NlkKc%Y%@6LByRMHGmWVk9P%t4J!>iCctqL@/GDhuJukQ>iM
bLH:ud 1cq9tH%5eN:EaPTWaAVPa1\6GV+<QKh88LMR@m4?CWTmk:TTWEmDe<ZPE?hIPEIekNXKeBBX$%E%QJNb
d?ek@E JX8BKhlbGw>y!9JD/:uKA*b6W<8\wS4^m$hZX8K%$uWm%hLcM1nB?IY%nmb1*Gme^p%\RN\!=#W=D>DC
aP$G^& M$KmB1%%5+dDn>kbm$NNhT4V?I*hX*KIj*Vb1Mqn#EJkql\m@!PP5bdKkwNh@u!\:e<HY$9Nk6L!Ku>=
*uZS:# IPKWAAZA6$1lk=&HGWhk4+^9nVRHRka=5T*R$lCINBk@EnXy+9cp*y%e+hc6B6j=j+Q6=Ln&Zc^Et16@
GW6/?L @:K=deGYcFN4T>SjHt1IHKANq^#utRZDWVjLD?h=ZT6n5e?w^S/Ia%nC?NcYwFa/J>4Y&8!H6n1%NhIR
Tm5<XH %W41/+QS1L<t$Naa%TaFInPDPLm%6VY%#I#CYBeK?15C+dD^!^n@@HBNpWBWM$+\M^n^m@>w=bN1RElL
1&YW>G MMVyDId6EjK=CX#B6p=Ch+T18!ml/y&XWQYiT1l/pBK1H1GE1m8WWQWWySPtKcH1JmXWHXXC%ZNp1NwI
\jd4BV YbC4c6\!p/61*A:*XELi5b#cilt1Nt/h!FW%ZQem=jJmwi4hqXB%j!XWjbkMXi5nbclcu!^D%j19bclc
<Wu=A6 n<yR6d=Il14%m&YwY4>Jl14%P&TwY9?#DFZ4c&TwYq<9R>Z/<#JW4Z<kR>YiAlt1>9TVwY4QGBt1>6VL
SH/MTt WLXu6k^Xi^dIWLZualt1>q\nR>Yi?&Yw&9P\DFX:uyclc5>GGc4&jCFD%b:9bKncY!BD%h:hbcnci=kM
bK8n*/ XZ6Lbcnci:\MXZ5dbKnci:IMXZ9u!XC%h=pMXZ99q1F1:&wb19c?LEQX*k>p1N4uqcF1Z^<b19ahLEQX
-AkF+I 0008f5bdb01001202b4 Page 498 of binaries2.zip
AM1^Pn 98Np1Ny*kk^X?=yp1N4*G^t1N5L^FK4&4bClc6<DMqV6Y!ND%d+ubcnc>+wMXj9ipcF1*>e!XJ*nqcH1
Hh4w?h uEIb15:^!%D%NkqiGlQ\P%?5um@hp$h$BkjpJF<twT/DwCWKaPhVX&@^88uKkwq6yb=mb5V=i+VHZQHk
ZK%Ayq mbi$^:t>NFQH1Tu&u\FTTeZ#eZ\eH<jHbjI+V+4nu!jFee*D+^<j^<j^eh9IedFW&ZB:4Np55AThVc+>
/HtmM= ?t\YYMQRJ65Tn#c=S5cl6TE+J6lmba=8m8I/!?c/WDBmLcq5cyq6=<X&S<8LMbJ&yc*N+TcLAMG9DWSc
BWihaY 4LW4Lc<!WwG^*^WV@NZl61dty9u19+Gwu8kZm%JF?N\51kqE/\Mlq#NTkjPWtI6\ZL1SwHC>hC!^Z#4!
?8/R:I c54KdR^:Y\C#JNy54@CE+H!Z&6a&6W\whiHQQj^Rb&YScc<T<tI%MLM6D6&TJSdqpt!:h5pT1*yJ9pY@
5n\jd8 JF6XMC9Z$5#YI4wwK>Qq11^Kbm<\8%\yEGwtGSa>p&!uw5p!8/a=Tq#P1?1cqS8uFSS65#JS*Y\eS:6a
8A@pFV FE/!LSwu&VcXp\Y1#qt=nyyb6E=<?\%F1Y!KGnX#$$CH:4qyuXQjHJyt%#FZ:dLyqX&nZHVJSa5W@ZFw
wR8Vl$ n49P8GtLt=:aNeSXN&^cwi1DZSMeP8Dwjbh?6@i+4c<69Y\8mHD$4C!^>K>p&*6bqqn:Y9I6QT:bc4>d
:W!uAT 8bcY5^dS>XmbLqhq%Rh:khq*TwHRDet\cIlpP@XEq6t%^XHmeq=Xe/#ePK&kcJGXmdyp+#nc^cJZpt*S
ba^\6% L5t&/bk5WDZN!uZW#Kb%d94t$DR*HZN1q$P9:B4q1p5&LdL4n+9t8PmMwm$PQZHZEDjheNMK8#/+cwJN
6L:5*^ B>Vi6@i:w<ehji*T!@d?6jY5yW>LRmFHu!LQ$1jI5Qey<1^>ml^Lu!JD:hQad$6:^JlW9>lQT@&5jTyb
Z6!%VG b55dLNGuTF4/FBuPQpY89W<XupY!&1i^*+=4WQw$>lQ:%KTX/:H$KVI5jawMY=<mT?*V&G@qjLa?nVM:
ZD61t4 !BJ:@<cbHYTJw/@hbkjJ69X:9NuBYmT9^&X&WK:KwR@85+NTaP1G&?\k&c=/Eth&eJT+uNitPjFtB&8S
n4lD>: w^WWZZKbHT^em%/=#R/T:hR^q>uB!uZW#K=%=yJFX<&VyR:6p$X8GmlLuXww!^!cKI95&tk6ejTF6Xm=
1j:A/p ct6BuC6*c1i>$KIyT1HWW5q$cKw5e6hYYi/t5a:TPHY^c//%JEGL&VVaYlDVal9Z6S$h&m!LHBw6m%!$
5yh&/h YldcNh6c+qy4>#6/*A1LG*QDe^#ePAhQ1XLMS9&:ni8$c9Z95q=&EdaT>!bXSduhF5d+D9N$8#&M<b$t
P?edH* /dlNnDH6b8l/8/kYKF%m9&$$4<Fydm/*n!bdtynnNnLGhDe46>6JG>>^N45S8h=c1kY&/%XN^u/d1jC5
+KN?:L b8K+*a\^ZW#Dj68y<t^%eVeE?>JcJXJqL4K%Bm4K=6aHweq^=dG<QZaSa^Zk@qh=t&IZwN#XttK5N#X8
8HpG:X \6#EYAY+@^WhMQ6jDj@a@G9MSZQ:c=^LWF\9XW!mT:Bc8=6AbTc%CLWPiK/C*j4JHAM5\8L&X!hhK85S
d&Np>4 D%5bmY8\hE$j#m8N5lyRGVBuNJI!&MPH+$/R+e&Bi6cMLNeHjF\cn\?5D#F>$HG%m:FZ!c?+1\\MYRT+
18@Vlm <#HLB\TiE^n5n=dY?HtbtaBj<5GBbnh8D$>BnQ<A=Xl^Tm8B9Tt8<QZ!TtA?nw@n+:cX+#^cnjHEY=&u
@>R:/C :S*/q%cQL899:#?/bFIJjNXWqE:1u$$N\FFlBlhju1QCDC:/\FFlBw+KM#AwIJ@btLWDA5<JDQ#mJQQ&
tdy9WG 8n%9G?6<4&!J>:wtT>C@6MQ9&jHa&myDL=qK==%CPi%</\6Fin$iVYpZj4YVR$ueY=8l9hAyMpQ<aLb+
%bd4^: k!>HW\t!Qy4KHlBQlXKk>V&!Y@kqh+ujm:k>yQZd=%jdZn\wG!yVjt9T*w?>WqDZ+K^CD5/lBbbiE8:@
#EC5H: *9hMP&@l##<9Lii^I&8ll!iPZtlc+b9eQFpL9d^^>cLH>>\<YR6F94l/WVGAt!h4wVAu4u?^aG>8u1\F
\=ZST+ j&:e<cJ=A#hQ%pLj9Lnn^ZX>8Ht!Fw:In#6ihD&ht!hLkjM:Y\A+9>PJaX6=^$9tW8u^>$@FY^yki>$e
+cFh5B uTCqZXc?FHhQ?ZmZFS@H^@F^&<y^9LPG\YY8=J$%DC:/\D64GK\:c*lhtRqb9//5<!$T==X8B9BKN#Pm
H@An#< wHnG=6KuQNcRdIi1mSXq9Tyc&wKSqtCd9&^8PNRcci<i$a1k?F6^eG/RY#RdIb*hQd@<P6#&4X^Njy^6
%G+8d@ dc9JJ6\8X96tZ>nhuDa#6$\=<bQRQCKeu^i:pB^nJ*@CC/?11pq:j#?&lun#RIJuB9RSHb5iuASaEk/H
KjFH?A MmGu11y!XLLnKy91@BZN+hbIG%=cuQt\y4I<I*J1T$hu+411S+*#J=*Dc&1V%tjC^AtqtcnQyLKyp+44
==Lt>8 GlMiN!wRC4Y&69nHBpQliMeae81VZFi6Z:\>I?=X^iRMHJkbPjWb1p<+W*LCGbED@qt/jY@IcW!99\yn
uN4tul e5L%niuIYcDIThV#Ke6JMtbPCM=Q4Z&m\dRjM6HRYn<uE*acmWd1M!Eu&lm1T*beVXq=$9Eu&nauI*IR
NAtCF# m1GS$4t8GuPGM*^N>+Q!P65M%!qH<A^a#6dW%JV8mA*NWF/C6L*=QuEjp>=P*!i?uA#=Q68$#=LkajV6
6VPtn! <qtT!1uQWH*CtbIV#wme4i&#^KqQ8*&YPHLc:dMpp=M^u!ZJZGt<%T*^MXNL1=PPG*lMibKSa^9*jiJ1
*pDWQb hD6>u+T95emE:%Qd%DJ51F>=6b=D/h5%$wGknI^$TiZWb/k?+W#JCYhEVtN/:T^H1KS!/QYR<T5p=ATm
Z=S*&Y tbGV+wkbS$!:S<!pe5J#$4p8PjIt%WQnBbhJS>=IMGE:w=BkqAaFde8PCIceWFNhmy=jAw$GPc%%5^LJ
>i$8\E 1c/dqX\PS#5=&5uSVw=&e4TVw=$e:iSwJ$e:Ph4J$W/PhuK$p/PhHP*pcChHP#uc!hFPnub8H>HPdieq
:GE$u8 E>auTcT#:N6qW+w:=Mc1p@kS!9JYquA4LCbQ9lVey+6q9:#VJ88Bh>w\yA@<kK<6AQ!A4$+Mcd%ZIQ+Y
>l=\ay G<j$*d=*VHX$@+@$X*!tL^N:Z=Zy9@A4P^t!GSLt\:IB?GFWDGJK+GXRCiV\MmliByY?HF+GqXAPL+NK
l!:B&e *D/<DI1ZRY&^Ga/ZRcY91cpAL+NKY\+9k?JqWPuK+YXR9A^1&@J>iBqWimMhL+Q1pB^iB5ZLwNIhER\=
pGeT<I uYpbFGbAhjPXDB/PknNaZ5uAn?BujhCWS@B#yy\l!/EpFM4&AaHuBAcNZ<emIi6j^<K9htNIhB@B4*bn
BQAK\8 jhD+%Y+Mei+4?iXbB9DL5^B+\<$YkM/\+Wap*Hl4JkN9#YVITAmCF?5upMPL>Zt^j9y!iLF?Rnt<YD>^
^1^!L1 ?@BmjX/59<XtPF/5u:/ty8T8<&L>hPZ\au%i4J?8HF/5#+9%6!*jl^j4y#jT<YL>D5ul^j1<YD@hEeGR
5pT%Qm $:ui$KSA9MiFYl>\=cZ:Nq/&!=DhkQi8w+N%e&btc\Q\pn\GMa9ph1Ke&Y/eM?Pe&XcLQ*HPLD$=uT=u
?R%htm q84hZj\Lc>@hZVI=uT!Hq@Lhud8k#MjXPBjI8eA6NZN#LnB>VW$Fp8aCh?NeIPeCp<=huA6MV$/u!\Yt
?\<*D9 /w9F9:D&?YLJ=HT!*GVK9ym:wM#:apunbb#nVM$Z+^^uimM+=#k:JIh#uJ#nVHhEMPS$wl\u9k$waaK!
#BeHeZ X&i:6!m69tB&$n8tYn>iYMJnTpQScCdpnJ5XtXEMtM=%FY:9>!mNde&lNN9HpDM4eY?p$q?b<8u\SXuy
Pec6Sn /5>IqNMWL5?EHua&u<+awi4^SYQyZbel^?XFbi&Yp!hibJdP*tbnV?<98dGZZ/DuDnuJ>@G4?@SyD#&a
uM%!yJ *>VXY:^884Knu^@lbELYQ<Ky<:$S&/NyBiP4^=hWqSYZVT&LQ&YJB$d+#G@uW!4+MdeMLk4Gn:qqeNEH
WdnDlT j5\6R>bDTTmWPCC>@R<IQCe\cQ^w8qm+\umJ8m/tTu=RHWI*Ww^8XaH/5eFAR#ATnbQW$X%86?L@$qnn
1d6Kn+ MkGh+bF*aDG/&1qhnBX%@81PYw=yNTnYN:y!#NV/&W$NNbHYYdWVadd&cpcBSZ8MG1D6e5l^i=/t6ytR
eNdB^h w*n?d&4AAWwV5n=AtX^u$FZ#/81589&GNGGpQ?NuJB!jHP^peFE>Dua!8PkDQ*8hIN+DFW#9tcCHbMNk
WVHGGe Q4ttwnkeCe=wt15q8QHD9@P?&+S!iN<6::6NZ\:98$$wl@jh<4:dDkL98?X>6?=!iN>6?y1cC9C?&:Vq
DEJuXA <L=d*uid4l#ih<9:d6Q!^bL+AL#9NqXjnQjhyniC<::dD5uljdi<:#dhEeGR\@68$=DD?&/*\Z5W*uj4
KVGb+# CmM%*ui:>jdh<6+Pl8\G*N9B#$Ju!H4kVR%P+E$NuSy+W+M+K&>1!ALkVR*dPjCtl8R&\J5cNN/FT=B<
QTjccJ pVK:6F9TyYZHJ<MV9HX\W!??+?95da+X:+Xm5GpK:+XmeNEHuY@E69Ed5aS*&QuC+updXkI=9A&L6&Gq
KPVNYi L+i*aTYW\>8\iB6YB+G*ajE&LHe=9A$4jW%NBZkdX6y!iB5Yd<NKX\=9\?J6YGu=apq<AN/Gqcw9^68\
+w*HLM $l9BiS6Yl?V\Nm#ilyZ8mGDI+Y%acenldXnd+D$Kd<N!lbEcd<QmdXkMDF5HeB6YT&9LwIb5*a4F1:Ea
Mdc+&9 EHmn$BcAV4FSmDhGhBB+a$RKw<d&8^GCLaAl<WV+m=jE*dYRpaZ:9E\#wS^iy5uLNNPZ\<5$E<4lbb1<
jJCuiI VLPD\M5$ibtt8^^iyyt?y1aC9E\#dVt<VJPZcca4l=hy<nLN6H!^JD+AL>NM%Sjnbb4yniC<VLNDeumb
H5t^*n Jm@VVHhEMPV\M5$$=QA!#Y*\HwYZcd4CTI&ZcY/%bb1eltbkTAX&%GW1t+GB6aCBkWhPBl+=GSl+=GVk
%=PFPl pbPBkWhPBl+=GSl+=GVkpbPBkWhPBl+=GSkaEw&e<Y&J4atB^%RGlp!N1ebDG4Xn<VYpAJZ$e4\1k/6y
#/P8P& +?tBHhZ+enlNM^:hlHCe?B/^SNQ/cM*SN681$cK*NK*:A8Ddq4d1?&8cD@p6Xu:P#jC^Q@Cd4Q!?hjlC
$a>P+k N!Hj?::pD%lCepJYj4hD<cX$R4:KH:wE*&:Z*Gc55%dcIt<u?FkA@KmXu@5=jQmd&/K&+*Pjk+>CPL:J
K>CpPP 4W&d&$K6Xu:Pe@K/%QwM:1=yukPd\%Ed@/!iIH=6e>6M&*Zq4acQTHQWj6:<=?FnbE%q6A*EuR@$aaLj
K<Kndb ydhTj?YSK+iy:cD\<+e1:cD\e>>R46eV=*wXj5=*<LE4QkqG$%?jD9Vlkn<J#y5:$8B:S1$C^lGCQ?%y
W<cS%V +HeV@DdRDa&iFHn*Hb1&\/hC#9Iy\DlT<L9Dj@W<\Z@6aFSA1mhid^<lb?AEwI<m@kD+KBDHQ*wj$EeV
EmPt/R H@@dR@BZaB*y%aKFIEjQFZIm$#S/pBMen*6&S\n?mIiBLmH?/XLP8*eBVZ6:V*wX=G!p<?+LDFy*uu5B
!k+WN/ K1uk9+\MY6ji6S><%Au=i#\LND%Z1li8Y#/e=PC%$u4wwn:aGPL+whn9a$n?qjC^k?AZIZ<5<Y?Z:dAJ
e:%wpy ?:TC=EM:c&9F<h1iRI<V@AQA:uS1#&pLnjHBkIP\*&+Yel/db+\Zw9:u\pi^+N@@tnF?GNC+DNTD49jX
n%#@yc /+*^SPn#W9naY@A@<Snnm/ku/pcl+G@eXVM*l9R?GV+8Fj\@ZYKMQ\d$?A9YYjDj^^&CE$n@G^S:WjT#
-A$*aR 000eb2242d6001202b4 Page 499 of binaries2.zip
#$e%Ne !%DFL4!TZ:>M5R8FZ#BD5R8Fu*?9aljiPHcl!nuW6A9QEi8Bumn+5@+w:TIQbW+T@QDd$m/t:AYM!aK@
#AJdpW d4qyF==nD\HGFME@=VNyF!?kHhWKj5<<$!:$i:H>y%I:Q!H%+TQWl?PyjTca?8#^hEEDFj^=u=l&wZ?K
uLkP$q %@a4$y<?$m:!#kd/BL4iGmqu\H6AV^j<?X>K8*khdiHZyD?4yF$5l#dSVmR>*$@c^c=Iu!V+e%?VhuEF
mLcu\G 6mW6eJ?*w&pZ?uJ5V>yN%G8TcSj/*cmd6I/@X/QbDy:j+q#RIQl%>=q&wX?C+#A>iPK*V$8:/Q$6MGl9
4Rt1B4 !$F9T49+GY&Fum%!/nitZZlP8R$NR9BQi$jc^b9aDnV9Fb$n:iJ!HJhwF%PSX>4F/*k66M>u:4/tZZm/
!Z9mGJ w+:SjD69d>M8QA$+y6L8&c=4Fd6R>LQLT+yhKA@19QJH^T+Wjp?@aleKQ@>^^T=<ei^C+hijK8iL*/N8
u<?1DE pq>\#a@TL9dH5cXX<De9qZa^GB@yS*5jQ4^i&pWR=qd6bME@+\9VLn^%&D:py<^hJi%m@YCkcThG$T%T
j5&X&@ H+/C@&1$/Y*AjKuQ<:wCVj6JFu\u:iJl:MhV1Q%Dyq*w:%&HmpDujWdPF?@>CStCj@pG$!+<i!%AAaJ@
*%@>an =p@TL4=+C\%I<BeYTL9aAea8nS+48PkKcSe4LpKFJj:V$m+?S$@8NJIVpub^$?XAu$:<BZJ<iA%6/A#m
+mW9Gy L=d#^b:Ft6mRCLD$DtpZ^Yn9b\4?5uYtZZn/+^!?pPw#Z5+Z!%CZFku?DWhJ8*kAdie5Pu/ncSiiC4V*
XLWMcF *^H@6>I8QpGhP%9\X%bI8\m@C@R=yM@Ne4:+<DKk#!X>Z1Hala9iG91j+<KQY9qh9qH5TPHj&cnaSW+e
M4e:hQ 8%D+X#+k=+9<j\B>u8D@jDFWd\n%F+=nm+Xd:X$6:YIY?mHuC@/8%hKQ8k4=F%D:dJJ&aR\bT?m<//Wj
RueIu1 be\6F%I:@$@1\$W+h%^E^*<k>juB4+C?YQB9ip9/Wej*A5aqku@HPDqjhL$K?$n\d*=j!qtHQ66qk9@G
p/DkqS @ZK?iPAFNBTTe:byF=+S/PNeRj^LVd9RQ<B^iCu=p!PpZh!HjdGM?G*TL6bm*%^Je4/TjyRj&p1:m84=
/5WhG& nS\jFu\Q>P?yj?jK?iI^6K*qk9@YlhI8^8Pee:Zk*#XC#li4pZeN!etZhuE%>8$jSD>&iW4c^S>Rl/?q
RDwQE6 +\?XhqGdC@RK+p?Xh4Ee@aV4BH@nihI8hpMj+Z11#&a=Z^!Ia>RjZjR@N+:?K@!CuSV>X@md4qZ$Q#iP
aFc^K$ @p8?QumteZ!$LS#u9CG/d*Y4n<I9iFiyn<Lj>K^Tu:\+>XH+<%=V/1Q\::=G+T9&Y*T@&a>cGh4PS5G@
i?:RD# Bb?qYTH++>Dj*pV%^DHYJ@k4eC:?F=**XmquHb:nNeH@%&\yb##?>><$V=%u!6F*R^@1hbw*i$m>K9wB
GA#H5K DW8$<$/=W5/HPQi>TjilZYX>9pGj?T&/*nQNeWpLwK*9L8S$jeYe4:ZDWD@*wH+<%S!Z6P>9A5/iku<I
C1ZY<V nQi:uT9+$*Gi*W9\i@e^^!Z6jQRb@hSj8=unp4aR::*/Wu&KVZ9WFtH>>/dnl=unmja!?qD:CQqFi=un
GHlmbk pua=>8P?hH!JPT=yWZ\C<*:EQ$*KPSy>p*=C#k::tiPT68yB+NBVt#ihL?h4:Rc<>!j?/?c+yI*Fi@RD
inp9cF 1F@p8KRhnuQcAPJ4=4mp4eW/$4MHN6$q=?6h%\B>IQHZ!HaanL:\IFHQ+:1c+=I&Hi>Nm+u@4Dp8ca9^
B1?wuC YkeL@wV*#HFJt+@*<pPE@LhZTn*<AMi>k<V^E!<!^!Z6X9SJlyJ?qynnpnaBdY$a!ZuBHJi$mYl:B\5=
iJKPS/ p=id+=L&Iw/>l\n?qEHt8KSN@^yw5XhjD/?S:jaCn5u*p4+hJh96HY#:?\S@^WB=@KZaDp<V9%+ij^9&
hemC/P !#QpJ?e1+$b?uQEuQ<:+I@u/!wk!#8VHGYeW@68d=d!@+p6pWD8ec5::*4:ltIJw?4Td=L^@P>4YP>R?
w#?cDS Q=n&=i&HQ61:ku@Tjcb>iZjHijp>c4h^yu%=h<T?y6nV=na=*/*/D>AjmPMDD=q&+i&J?9al<b<$:e9d
NR^Zpb bYjkjCV+he?a>8Z6mtQd^+JjZ!D>/w>^:9mE?H%M?@Ltw!@$1iA*@EjP?=jlYQRb<Z<!:e5:AjtjC@/#
9I$NV$ t<%?>?bnnPRL\Z>8h^p@8j6PwQ<n?MGV=L!@GijML+p9&<E:Ci9=FjFQq@:\u*E4@6iCQ&PWcX@ijX+E
@yM=5M #niCQ*Pc>Ihj\Z9pd\Y@$TQ9E?@A?u>H@CGtjZtHaH&?F@^bI?T<9\^>/9<T@>itjZq?SF@yB?K*tQdq
CtN9tP :aQH@$@\nh6IaX>i4TjRQ%K@u/*Mc+w?#^=u/1j9QL\@9aH+Dcb??9/J:Ztn+F?\!NSQZ!H&%W1!m+Yt
95T5$e j91i&AWhS5F99h#WV>>m:I8dTb?Zt@4yP^julX8Ij=@bL:+q1G?*C9/qF=q/=Z5L>j<&+q>n/1h9IM+l
m<ab<h 6\9?bZ<$>hMZjARhRPK@L8Z$Rl@&V8J@a81u4\S>=45E@+1@tj4yM^:%jnj^N=n//X8DMeX:BH@yIcc?
hWABlT ?Y:A@41j?BZ!8u=E*jkV<Tic?8c4S^%aJjnLhnd%#biQQ95Dku@qaFQjjBim@n^I@JhNjjN6^nH+#+J@
6dbbnC Xa/yd::9WD<jE9#q9W^><^&Q89R\<aib?8d4l#4:CQFLVZ*#qYCM?m@Ej>HWN%>j%MNHBj@19cSiDeR&
4ip^4w ?!8N#&GyX+$aD%\6?I<ZTL&/C<iT^<m8D=B/6Sud:HGTj+VW1@E+q1\S@G6GT4*cCi8=q9lVbj9Q\HP8
%<GCih I*/h%IiQ5X?iIH=a/6W1GAP%9\u?H$/SiuWW?qBQE9>iKihVdIP@C@/VP$t>Gw/?\D@w?NXT4==B*?Gj
P11pME ^H>K/qX*nPe<JjnZFp8>MpIT#^J@qL\8L<y@n9mXW1?iRJ>$9iDj5EL1%bq+4@&<+N@+wNR4L<:yG\V@
Lit#5t :=>L9b1FhZ^B<Q?^y>T4C9R^Z^V<y\bI9Y4G5iRq/9hC1XjD5N>jy8M4yX+N\DnaK<V@6>T44>Euj%Z\
PEPL+K u\aj\JN9<HM@SH@kJ<H@CP#QP%V\d<h:6=>y9llm/tH8l4*MXI9?/h8tuL#n@lh::L&tj@/SKTi9H>1k
iu%>BM l?VIeVL*4CF+k!:+Z?$l=jR@A^km%1B@5=?We#Vet?w=JKjBqJM*<%?wa+L@jc&<46QuwG+L@k<u!88/
bMX&+> 5R5\<puP/Wy>^8ENyiD@hIt5V!uG@MX4Mn^+9^8V<>Dn/PCVuC6qjRyl96C:miP>@=S!BtJ>8k6?#kb=
8a&NwG ZV8n#>tD=N\4=R!iD+!i+9k8PXLPCZC5Zmn+Zd9L?4!NPd=ik6@nGCquPMbti^Q@iNp?N&J:Fkq?aWDY
l*<$R& =<V8/MkLj6FqW5=I<F*%HTqQkZ1i*^\IYjPaumKeH$a$B%!j&@S@WE5DBBRAAkAIAJhYdTY$jHTpHkEA
MDAMnp AIACAAA5AAAAdGqme!>\b*BnbG59dYFnL*NwaZJqbC>RS%BnbG6VcGF!bYR8euN!a!=mcY=nEA^\D$lP
//KZNN !R:PTC^KVhE4Km=KbmAJBAWHPd9pq/a#wwp#>1:Z?L=lW=y$LA/Nna*HF+EXk4A@pABlP?b*RFKGkaH=
Q6dat! I=APaYBk$RjTKWAc=K\eBkb8E*MVE!NV9SBZ*+D5$wJmZWNDE$NDk+1CCn&RD\1aGJ\<@S#6kRCZk#iq
9&mPw/ mj&CP4GLkjH@@@@@aI+AanaGJ1DIZ!CLBakNGITAJC5Rb$A%5$HbIFq&KJ5DmpF5HmDtlLIFkJkL!laB
8&ZTBy at+wY\K1LkQmW\b#^1AGwFpelu1tipby!id1MIdCTpNLT\5F9>TT<9!mdAZH+8L<=M#Ep6SmHRZQ9GR>
yl!qd: pBXwYnGCp=*@#APJPYCL:Bka!qKLmwEK8EDiXwCFB^Pade$\MAAAWE5DBBRAAkAIAJlYdTYawYXTLYwA
M4B+ti AAD@A\AtAAAAdGqme!>\b*BnbG59dYFnL*XyL%BHWHNpc%XJVGqmLuB!cm=mcY:5uAqeXYWc^5@L18CY
KJpqk$ T+qbwttwFhc$8YcIG<ktcJkdIq\XReAL8G?+qu9tty1&t$6K&hk$VVqtttqtVVu6i%NV%4SNW$*qQP@=
!=J#TH ukPHC&=b$<\QV4@@h^<R#n&e<!*9<=^#5?wt>Ww1!M#8H^PZNV\!*#9cP5M6Qn:JG=$c$$QK98Z@$&B>
/:pbu& &Z/w:+1TI<jPQeE9Fle@lnjL!M9L$X?^LGq6?d?*$@J@@*ZLCy8B4?8JZ>qPw@M!QcuyZt>Yune<!b5*
\idCJQ &yNScFYyLXC5+<ihL++jF>%WZmmqJ&uNG591iq#@5<T1GSTjq=8ipZi!jRba4c$R&iM*w@VXb<P8A/*R
<:BE\$ qK\^?Vti<G+iV:=XJVi^yQwpYH+/Vl985pL+hWl\juyGh9yI#+q?IbV@Hqp\eW^q@%+:bYJBwYhMhE=/
p9b%TE RaGuwPK@B*W4!5*M<b#pmP#?cRYtS$:K11yZ=VT*kVFJ+dFSN$RyhiM>lh/<<S=9hpF+dQ1+>QCWF5ul
+S*p6T diV!Hb9p<lHZ>$<MV?+>!twbu1J66+ltuT%J?INqNRt1%!#YGluiQ>GT$*lDj:Eyt=$\&<k9$Aj>T@9j
1BbG9a L#G84TA5j%n=\yPTw5Pn&$Xjepup\?X@=uy#/Kdlc*>bKnZ>J46?1qdbHp@9ji*Y4>\*Y:c4+u%W4E9q
LPRdc6 C:?Z@K?*:4c5%HtYhAu!Pc*ue^4T:TyVN6ldwuPN5E&^:EuB*8:RYaS/Q\mt@knW+K=4w1qJjcqPc>S^
#MGP<S PwNSb=hhaqtkM^j%hnS%1Q?Cym:%9>DWa+>6k8ae/89R%KhPR>PAYljil6Rd$VTmjkwN/!i@>>Ge^:Gq
9DLC=A j&6n/kk$ahT^cJyRi*m?XM>B$=S/M=wL1A>wAWH>AbytHKq/@5KyL$dVuLwZtldWip+8wq/EymZ%BnT6
WHFq>D 1DF6YBhVH$EVRj$^t6c5c@S/61HY9/M66a/GT/n%::1WY5@dbhSFcCKyF/QlCA1<D<*q%I?k8aL/PVT@
ll:He% w@+E#bXecIV>TdYiy/8y>ji8wa=Ge!*%nYncW?9C$+F/Hy1P%G9ShKLim1a#>Y+$ZcljRHMh>Z6w8qJ@
VQ:EP% =W\</LLcV/Pw>jy*w>b#GW&6:>thPl=ND?wBcHyTb/HySV$hVY@1JYlm1DH84Fn1l>D$wZ+CVS!%u5N+
iZM$*! /4jSJFB@\ZGwR$9HVSK%>yi?%HwPp1u:wWtl%4:Wn:waVZ@1hYl8wC=Bp$16a*pA6S:DnhVj/WyuhE$h
FMkV%M ^+Pw6j<Py6b#Q+Sc**<whT/cNPybcIbS4$CVV4$F#ZD1QYk!1F>Bp$u>KS4YLDX@RnPC%bKP?=HWPqbG
NjCBL/ WY6j!/LY/$aHF1J@S#c%@u5P>WR$LKhCF1LJyhb^^&w@SMe+C/KRQ/IbT@$<Gm@%P&lahIX<k+b?KqVH
CiJCEj jlG%#q9n1QWen1jYMVTBY99kSG1>QyPw>i@nElp/ljP!cl&uW/u%tKhS/%\/uZw9Gy1SWJ%Zm/q%nM!p
pb+%BI %tPi^hXZ=?@b%D1Q#1HYiYk86a:FihVc4&?m%86<M:Yi9@uWi8\L1QX%IdZ&!WZW&>A5yu+T#SL1X>E5
w#Itn1 yV/G=laY9LwYLcQY?jXYcy&4qqQ4YF>B4iN5JdZ&\XZWiu%YW?8^4cG?E<%6%D9S4KW?nGah6c=>//t@
u$!>ey SZP:$ZZ$HG/k%9XuI*Wd41P1hi#eTc*n<m=1:b6*W?8%8whcn@hic8&V>%E@mtaV6c=B>%Q4PNyM@TYc
/!D&u\ LWdZ%Vq\K:Y8Zh8whj=?kF4u8i*Wit\:1HW5qqD4iZ8RY1@=R>S/QubT/??^B1!4e@Z91ZZi&$Z>FyyH

-AWLS8 000f1201b9d001202b4 Page 500 of binaries2.zip
EtiPD5 1HY6@+QS>ZT<QE16c?Mj1ZZhiI^c=<k@Wi8+jy^c?>5V%N1QhqQ48j<#6j+hi/n%>Wu1w&n&W89c<bVS
MAdPJJ =&mh5w?/LY5k%V4QQE&6e>+Bcl*V#%B49#6I4ij+ELZ8+%q1Ha?H1VYeiM:w?q4ZHKHY6jy=cq%DZ1DY
nubmki /@IZcl*HL%J4u*&JY1@FWYw>^4>T/@8?VQ$ntqiMd1D%\/9WPpi>S1%4&89WPti@Rc*u?W%19b=9WY86
Kq:#H+ >ddSDdY?i+hc4?P:%H4i*1QY8iF>c8%VH%D4?@@N/Ea/>n?p9wI%1Gyh>@=P4jQm^>Vc>#?l%9N$#Gm:
>RFenB HQ!WYt8A#/l%V95H6e:4u%Q48Q?CY99Fq>V/:%<bjb:Ypq>Vc\*!V&yh4:/l%4u1Z>VcV:?q%tQ@#8nG
%8hHc> &9?@y>cc=N@W8kd?RK*#?w@WP8j>SK*unRFZ+@%qJZ>n>AZHSDdG*!15@<M\J\n4@#DWdML/Q\##9LD?
pKJID4 D<NaE>d@aXn#ljX@GNa$aj$jNy<iRDZtXGH>H+c^J1#@\>BjlQX@E+$1c%elW+c@XdBYNduKYIl!j:9d
/W^bXq :81cXTItLeN<ISlZknHW9MlaA*^6B\A!5iVy1R<jQ@+tc!F:Dh#ld=5=KXFHN>*8BSZdRPP*@LD@SMi#
j*WK1n wemR9=y@NAiDGW^i^p<pBVIjSVpm4:l@AuYI9P:?BkwRie*>nit?j?FH96@+8<<*bK::G*n:NMh+aycV
qyn>%T hjnGMPh+>InZu@VhWQVJ:d=H9MH%njL9Sl5e\6ecJuK@?t9jC^qeHaJXd>wH6Z?/M>%V*ui\5:#@#SSQ
e/>wZt ZAGQ:#kTX@b++tuqSL<hdGiZama$K$Ce4ZVQ>tpW>!p>=c?WdnQ^A$%Q/!L=ZmA@#JJ>!<%??Ec!M:ua
wkLSKD 5=>:/9kNbn<eV*1=&e?>e*9&\$<Mh+:+4Ge@j@9Wm5<JhHh#ahDRn<HCDR\1plpwDGCApMBCw!?LnIE5
aWttFe +FjSdK%lEV?IJt56R+WlDBHTGB1pM!SIw4Hb#EJqC$*MKB4?$VV+tR\Getn5e$&\aBe$I%nM=NE$4KN=
e&np*M 8=*GIb?tdTNN9yit9yAtjl^N8+it/REYSN6ypKdTkE?u+b=Iw%=Mw#&LuT4atHt:cJyNw:Kd^tRQDZeJ
1<GBL> #hXeG8&dcK#u$$k9bDn\pDFdh6H%MA*Y$#Rl#>B$:KXbPWT#ebltb^>N^lGcmlhwIq/pcVlKp@AWDeI4
j#qd^> NAT9MY^6!HD%ZIc!>St1NtcIY5<%L:b\#T@BZF$DGC:ZaknelCF4W+c1F#JE4e5A6R:D$^we5mEMqh?l
AXiQDn pZmQ^8ENGw+QcBk?NIdFLpdjamH/ER9\d%q\j<?l?E<Y/S@VMB!nRjmMl8B#ty\9VQF9F:Jj5iB9\<D%
dMm4/q Ekc54SnMZ5bk6S&D*Z<#9Q&B\iw8lmCLGZw+Ii6Tll&@a:l/FeQWc^mi6tekjAiDlB<bI6#NILR4k<<w
9GWVEh B1qhGHlGM?D5RMQRtYclB<**MlcT!&uAi:IkZeuR5#hD#qmGtuEMMV5^4LmZp<%>DCa8?pXZ*X1e:B1:
R9ZZdR u4Zw:WuQ>Hkn<:&iEXpV!6YPq4k4c*>uN9Q*L*eu%8<$%8=!yZtAYd^*qe&Pa8>GuCT?p5%i$aR4tk\:
>!#LMS =e@nB&9Gi:\nQiGJSV@#?a!8&KKTp8L5\\9wH6h4REb&X1a?<yGcplS>pwZeb:$66+:c\>lQuDQ5uGD?
&tBtLI yDpQXplCapJWjI@IHkN/XH=wy*e4MLDCeqRqN/jQZ?D1<>$>\+6GX8n+qjX=1/:itPcVAbGn$:&X*e?P
udWkcj V^&abJXi\q?=+<tJ?:\MW<QJW6CQ>dLY#cGm=\G4DNkFHkGQk5jBE&A*?DQaB\/Ak?AN<Cb+C^#Dj6Z8
$wWFJJ /u*$ABAEcwCcIASk*%IduAQ\H6IANATNRSlwB5JBC>AKZA\mRG6\KYkH4kBZk16Bi>ABhAThRGjRBWTB
BWjFRA :1AH/Aq/kh+kB5TCQmAPJIQ?IBWMAAQBIDAaDAFDRVwaDnJAJ9CAEYApGAXGk&!RA<cAZJAH<5Fa+AWF
ucHhRG wBAWkZFkQJkAJwJJaDKaB1cDGcAa#AT#\G\\B<\F<<BN+Ga\H!\AC<Em5Bk5AW9BLYAb8BW5B!9AT4AK
>^eGJP 4Ac*kdXmnQ=/eD9aADcCP<Fh+B=\L:kQdAL*k<%kC>kK6tq5wyY^%9Q?ytSE5Y@y6B<IRpE6WB<<By+E
ldA=pM i<FVaB<+CA/DI?Bh<B=+H*!B@RWA:EPCRA$RA4A@\j/pD1kLGwCGwBE+F#RB=+QtwAXwCTJAc>AG6AYS
cBNDSW +Ay\JdkcZA5/kp/kM?kC4kNhRVVwCZ1B*mAG^II?IA:Ek\VRD/TCG<FAMBkMAWNBGlkGMpAt<IASaBVI
nLKbRI A1NBNlkDepEi!AhnkSeWkEJRBMcB<YACtAktkeqkCykKywFmMBQMA4QBHDAZ#AM*kb9BjLAALATL\GK\
NnaPV\ BC\F6+Bq+Fc\HK\AK<E15B15AdiB6j:GFh$PNwCN+A=\J:kL*AQ8Bb9A@YA#&AK&kt*?y6>5B#95CM%W
&M#P#* RmYBJnI4aXXWEt!Z5dL6%=#$@XBkDDl=NqjBuiJZduVe+K@9V9F8w$:8Vp?h#YEjYi+nQtp&N=8*Rd>t
aJnluP %j$qK@F9VPW8l+$VFLkckc8S=?uCyt6WC9Vje5\nKALZKK*wnQdyE$N$Pu9y%KdRaa*n:hpbhJmn/CSS
mCCqM? ya8iWdkqRhW5eHtCu^FW+*KuiaSF>H*lJkZ8VVRcl+MV8Dp=cyIE9Sy/EjZK!19tBKyj%@MtYpYnkla+
m=I&m# a$FFL/m5BT=TWPGLZt5>YiwmJ=mVJ8PN!=TFhC$j$@&<V>j!GX*T&<byC</q*E@ueAhh:&4ia4!HLpLj
w&Y?1n /*G/&k>N@^C+W?q1ZL4A5R1eyPCeCh!nSNA^H1ZdZ&uewGkc$A<pA#l*$h>FHT%\%dIKaE!J*qLR<%4Q
NMi>Qc 8EFbA*ac%!h\+=wCc>G5ianwLRi+JSpP+IB%ZA1e8t\FeMCw!#FQGEe4D^wHKij+PL:HnEPXQ=W=aH$e
w<eJ&Q TiDAydpbh4Kd:q&Q<Tu&!*%$ZjldBT=N+M+E:p#k#kV8VPDPBK=Pa*8:8Ke46EiK+\#lCMZ6C9Zu+hkE
5tBeN5 Y44R@dqeu*R!/aBeV=i9=#DK8EGBw^M+P4t^#BpK*J*$MA=S+N+E4p%\#ALuJnF$jl&Na=NB^kFK4HGI
9p!bFe $5i+S=%/:Mi&eQ$F:p/T/CmjkL/BBZ\PE^56%@4TchJl!tc/VB!H/Q::A@!>k9iXD5bXm6/Pct>eyil^
VND4*i y=:EZYwj!4VM:a4hJuYTFCabi=k+8BPE:?t$j/A#*p\*ikFhL&?Stii?/Y@Rb?XSJqdNtDw$N?YD%Ae/
:Etcmm dlw\YT4p#FjASMN==GY8TZAE@W8$:<Q>Tk5#Fe5dVJ<!tIB<\mu&A/aZ@&Dc<A=9u::yTq^ib:K^\JZG
y*LK9q PIuRVmbWVt1%m$uRN1bp?W^LcnCy!Ty:hE/VJhpBqy1WSycAbYA%W/YFQ8tEp$w$MEtYuYI6M<tcQG#T
#EauWS FV5X8akJWTkVupatLSMhm&&a=4Zp?1y#Iu=Y5F@S6A:uXqa!CXq8Emb:4V$Q4:nPMyWyq5:#8PdTqG5F
G$:VI4 p!<=9!#>p68ail&C#nPQGR4Pl?A<Cc/n=J1WR*TiRh<R:R9N#G$/Pa?QSDkJu=QK4YCc%IyJ=uwttP8a
YShK8k b8wej1=JE/YSTXZ5Y*$BJy&W@TcyFJ^Z\VGLHnPPX\/c^FMPMYtecqJRibbyC8a1$jE*pw>ZJ9F^5GTt
k%aNAm pp^tBjPMDDSG*E+?ucR&qetin8&&VG4^e?I^Tc!$Lp5ABY8kdCy:SK9eP8#HPeTh+kW^%Ry&JZT%th4X
nI/!hw bS4wyIRNjBLp%LJn5SNl*!S+PMhMJ9@PEW^=jhNjJ@ZN<$q9^:EPtMS%*Wq1b*DeLGajDYX@C&G@9Jq>
iYYlmd iBnZket<LtNh!ih=HBPN?jliYCXJ=nKt=BiYu%j5XQRm#t?Z8lLCXq^nZP8HuTBj\lywmT6XuMCW@QKK
C6uM$H /+chF8c!>L1G<<AAX*4INeBPAL9+yIdhPH>HM^u5ibL$#>$QW%k@#jFJ4>*J>TLPIXG@\V$:h@c\#FZd
u#!M8/ :*CTE*V9+FQiFR@?di?KB@9iFR@?Ni?KX#9ycmh>Np:c#8?1a>!#muF@>XDYqjYj+5cE1eeiN^<aRV%m
SykDGL Q@\F4&R@FANQcN>Lka?!H^!DQ#V:*Y5?>AEjbcj><FHt?@9=?nV*h+BjQ<Q>HiV?D*F@#*L@l@u/uJpF
L>$h&A +jjN:#*Q**9BVN@\+REXcyh4K/qhY4F&CZZhpjT6ZbJ>:u/::*n:%m:88>iuW:8M+j45%QCF4DWt5G/b
:KI5B% #NyqG88clc^VcuIh1<E%hS=44KGe?Ci!^5u#8Y8:tQXLuM>hY/h&Ye1/^Qh84FP:>GFheyt4ntqb=w*6
yFl*ET @nPD>e6M49tP@^*H85:qj<9XLnt5$c=m@ZKD/<=u?@L?6X#6+6R6Wc/:uCi1ZSJap#t%T#H4q6t8&5Z*
caQadC 495T1@SnJd@J%5HXl=*?i@H@ce*6nL8V%h/X%h*8y\/Y58<tXNJ@t:41:k6PWH9H5$>G89y9K%j@hjy8
ka6hL6 Y%jh#j!t6P=8X%%:u>/YaZ<58XdQtDm>>hYR4=9M1^ZIX?H*E@tc^6j%jP*J%%=<:h$48V<@HYWF%hbQ
@L:Y8k utJS>cb:5?^*C?bi@jn1#>hn?1wqLjiT^K?H<?6l44$G%4/tjb?Ki$Z@HeLZ\ibXP9A%SX<%m8jZGj\/
de*5nk /#9b<*&+nqJ?W9buu<9Tyh!TGRNtuQ&%$j&XjqH^N4^q58%jhA6tdSPVENM9#XWRuep?$kwK$/&j@@?8
/9/FLC /NenPV:Ndu:t?#9Q!$t=:=*kwRy#h%Ju:$A:CV?nG#5X:KX&M<j\@iL&M6CP%5@8^p+Fi/pDkWj5e&Qu
LMIHnG #B:BCcn$EhQ1:c!&NB%K*6@$j\Mnt5KEutIp=w@M:%M\Ktj+j@@wZFPpP$T1u5\68@m5HwTX*5NHiTcY
&Y>b=5 :^JSJdiGEhGJ*Z6ElEh$n?wZlbiptPl?EXY4L=#JKlep#kek!n>lGY#tu$w@F%FbPZL/D/l1kcyFc+C=
!H&<8u cSRIRpE6WB<MBpQAQ4AjHADQk5QkPZAE9ASiB1?Ca?BV<Bu&GRK\L<G?yA/wB<+B&K<$BI%AGGkC#khN
$Ru6T\ RVlwDmJAc>AYZAamRV6\PdkKZA5/kE/kC?kKwpA*EA&/A!&?i+JaEA<TRCJIAu%BMpkB@WB@MAkMBeNA
y\>Ynb P5kAteADSwCSaDVIBnqkDMkFiTAjnAWFwBAWkZFkQJkAJwJJaDKaA1cCcYA/tAGK\W\\C<\G<<BN+Ga\
ZA81Mb H!\AC<Em5Bk5AW9BLYAb8BW5B!9AT4AK4Ab4\G%kLXkH%kiay&<&kI*kDuAZ8B9eA?+F>+FN+H/\BY\F
qQa9Ak D+D6aAewAR?Cl<BP<DD+9j%e6QGZ6@:ZB%q%$q\8cj+=D<tj&V^q@%1APNcu6D+QLJ*I%EPI8&^*Q4y/
h9Q<QD =JQm+<e@Z%B>6c45N51@a4?a4Q*C54#H1p>Qqh&!A!4&m!ttZ+SYj@T//t=VAm9&m/ttZ#V?594$XNq6
%TESH6 iyC:/nPj1y>VeuAlZn5h4V+>XZYV^eH8?eK?+!CLVN*=:6jX=/iKd8kW<ipbmTul=t=ld4dHY*%T14i1
+bjc:W 6KHuX@Gq\bKPHjPLlui5:k6XidQ9Ti8hhQMBq5BA<@>54RZ1/+Mh?yAH&A*&k/jBAjAMiA/<AF+Ej\Mj
F!$SLn kw?\4\CA@WkR1AFC>K+t\D/qD1kLGwCGwBE+F#RB=+QtwAXwCTJAc>AG6AYS+Ay\JdkcZK5QuIBPwDQw
<TLLmK A1+DZeH%wD9wBZ1DGBAL?wA+EA<TRCLwD\cAkYAR\N<4R$FcwD=Tdpp/!ARiMAKMBKMC>XPdqw\G&YAM
-A8Bmp 000dd48fd92001202b4 Page 501 of binaries2.zip
DTpl\H !AX=IB?MBX=RAAyBESkH^wMJaCKaBCaDiD1bC1cBanAV#AL@ci>L+KTw44&4btMdehmGHXyeWCEDKERe
MnlX*# JVLMAkM#MM+\km5$QRZV$NQhh9i\1FHe%!n8C!+wWWHScE#W=CYKmW?n^9i!S<*V=JtaXdP?^QeqQ9*P
+5Xdee 1Z8//qb%hjWb8<YB9uh?b?=T@:=Xhi?===//hi8eT+A8BdwM/HKkK+C8BLwK/G1kc+C?AHR6$HXA&+C8
TyIaWM B:wB/Eckt+B8B4wF/Fck&+B8B:wDcD9RZWB*q+6>CV8A:kY/D&ku$Q%AD\D6A6wN>BDR\$B:kB+BilVN
Hq</Pd =?E*A?XmDj^JdbBYNpJcc@*5*CZt^6/?<GKlZ&*ujk&eFwWFC/X1e<auEj4F=k^Lc^c:+bVY4EK^BiV<
MT<Ke: Qw6%yVY4eKCFDL8qcydQd!P#tPd#t?Z#&el5#@K/e%h&/FQiqj%^#1<&I&b>&B$lNYqdY**GbNa966i1
G4KMKV VbNYKQyNp!Iey&X?>+djc8%Q*&8t9*j#?&:V/=9N>Lh:?N$djm8H*::lh%>y&^Q!h&@yd#c>4PkGNQHN
i=NA&i GH:Vl6?\!jau$9atpLY&c8Ld6@R*t&tL68q9Nq%&m>S*t+^Xpd:cT:hDBbFc1FRLqjp5XK4qG^ZW<5&T
Mc/$/< +t+A6Z!nk9pk1D/T$E\N9G!w<=%hu/5+AN:b1dY<A*W6:=P*+/>YC>X1wXw6XK8F@TWM%C\ZNQQF%<//
I+$!/1 $uYL@bqH$#/CMF@IC5WQml@T@KC4B!F1p!^iN!8yeTydk!H^>Zm!yq9nQa?W8e/kP>N+FnRawD:GWKHa
X$!KlS A*K?&qct%mYLQk^N?=4G@+M:&=4h^pw<=l^hdE%iGw5ctu1*yWKSl4yIyNn%i9Xwy<K?<J15bT^::+?t
5S5ydH m<5%9e46l5IF/SjL8+QkWwM%5h+<9u+/AP!415@1QwHRL#/4K/ZqF:q$kPTKJb>:?#S9eKDm4!^!N/e<
$WH1IB p?WX!bL=t4b!:#/X8*&#A6q*J@Mj>%qQlDGjkAPmN<*6+=4?F9*?p*XIyF=dYpG>6qSm5hlDc$h#+:Dt
QXeAWH cMyISI%WwHF#QBJL>HWX1>pRQ/5^Nl81Sa5\XM\a*L8+idu&m+9c$6Nt!T?8ip^Mu!e5$4VcSTY@8GB%
IN%=\l !ji?>V@V<dPmCjymdWl4+>JPtI*YLA<t<AH\5w:q:ahC@wc&6lk??V*bH8:C#+&?FVST!FZ@AeeDEL@S
&p:>d? FApm@6jLY%FV$j/K$#jEH&+$Epta%ke*JGLwbuqKtjVG5C^5j1c%!p!9N#>j&tpi&Gy?59T@=nXQ@?kn
A9wDq% e1?MD5PQDAnZ+8k\Hh&hZ$H+?iVcHhPLNY*Iw?pHa>JhQkZXyD?eN4jCl8?<T*ZHL\a9Zdc$44Y^yuFq
F4T*L+ w@h9=q9QwGXYuQuk&@h#$<><uBJ+:EC4di\Ky&IJ#$NN5YnK?#idW+qk$9NRc*BhPBTwD<aDbq<F/tM>
N%QRWF <ZDETPRA$*5Gj^A8Glpl:$61dk<5m/jCQiF#5qTD:PNd\+y\6L*i@*w*#@$5AL1MlWa$/*GjP<HDjqjR
#t@Lb6 Fp!GklH@T!DMmtAmGw/8<?/Dnql9ItS$BNeceD1RI=:%mP5I?HSqjY<!Fi5JLDG&dIwq84\^hcGRAd*e
wuLZKa Fp^%i\MY>IanZZ=u\dhMjt%1tkpJJ*He>/#J%m4T1/y5l@$c9u=G@dSy@8$8IL:NZ6@Wm49iQX8:4h:*
BT/RpL J5&Z%4q8W64Vpi%\Y&NV>tN?uNhYZ=j5kY/MGlFQRL6^nu@:+IRH8qcHpWyqdcAt?HYkNSmQC\S^wFuc
@Bq4C1 Ep/t:Fj*tc^uHZE!uFYeeZ44mP8pX4tVMc%mB#5/Ty*>+#mW:lXHwhZi>q&=&M^%\Ga8?\C^qFZkFHNY
$M/pR# 5hn$I%d11SP6a\:ie=St8TPb#^!FJue=T#L8$eqJX4GVj>419Zw+w&?>inY#Q#N/$6&Hu4*u/nh*n*u$
M+CSB^ qWe9Tj&V$VQijiL8De>?eQYA*Qd8X5>wd&hLY#cYM64dQ8Jwhd9a*jd&EYeQ&PYPj4CL=h=\qn48&*tI
LnbbRT :6=btL=9/c/e9iR?aQYXhED$tF*k/Di:PLQ*:GN!H#yL5>!S%J@PR8^XX$uGQVy/&C=&>:NZD&j$4Xi9
Q@%55K b9buSp?/?>C#>%#>=8+^n::!/CYyj#J/^46Q*L*l&R?8HyDd*6*1Gi*6dPt/TCTnydHM$hJa+G=yLHP&
+bwX5M NJa+YlwL=JbP=^%*p!/p8$qu$*hkZy?#yi$m1/ZNI6HTtHT$NBbp6nTY!m&h#thet>VT/T!&6JYY46QS
dnWKcX $qnkumWCp81?4DeX:$&=T#MuILQ+qFb=TuK4%i+nDyH8PquGciRViFYhWcp>bPY1ZcYb\#=>GppR8E/Y
m5/N4t eeR^pF\u!#mNjAK914$cJ?D>yGRheD\jPWw#>AuH5^C$Ytch:6ye>Vl15J9CXa>>RK:NYbwltX$%i>Vy
SY8>Jl 45%Xn/MGp>Nh:T8XPecp/$^aJJ<yubjGq/5hbibyCWdZ>RdZGc:!lqkwp=>qdAdK^bRY%qu8?pWtNkPF
QyR%8h %?>EYTZE8Fdi@SP=twdkSmP\*EmmuM&R#a/DDmH6PPKY%w/DV4H6PPTR*++n5mDQPPCRtlqH1Z5#!4%9
C<<K$4 &Cu5Qa=bHPa<J5T@w<\^D#mPbE+In5Q!#JB^IQ9NTuNFSnqPGytFZm*ktEaeS^##miPIc/A=n5pnL8PA
5\\VSn %?X/n5HApeAXSnRbnpYVkcbIX?Kw:E?%Hqn9=%\QaNauZ\>5qthlD/V*$:EH$QN=PR9P?*p#C>k>a&TB
9BPSLJ 5hw>!*N*XtntuPeFhV&di$C<u>a>kD:Q:^=w#!j/LDl&t*5>>YiBPhaB5tEa@iK>X8AB>NaLQaDbNBMQ
hY!HhX 1Ki8pkZHcBi8DMm1nGdH54k^!+!jDiuYy4QlPLjpwXTRYtD?Z&epApJI!c6!!>5!%wm\CS5*l\\aMXm=
XDd/H4 9cVlWa&#A8?j&81J8\JyLeP1^1u?iXZtXa&#A8?jw5:m@1u=NGn>NK*Iih%>%tdQ&4likn?#8dQ\eMaq
\/<JVA 1HAAldIC:I<1$WyNp=8F&K@bH/@w$*!Fi!C*^u:@S4:9t^Cp@anyiKS$E=P$6Jh9aWk&9T@>M=46<S5N
G6CHC: 9caNt?LXy^*&hpk:*ZCu!CBKa*Pti^@*8k/lNBy64cV$jbw\<I9l1=w\>I9lB=w\?I9lh=w\@I9lR$$a
w?d/e@ AMddRP^\T1Ql&^GWd1S:\#V8TBqFcVV1Y$%yNN+:t6I*mZ&ubu1QJw#8m9&u\9m8&B51nP>m?4<$aaRZ
PlFW/n $*@TlDHihFNPwnVi*&SK+#pDqEcD9IhRGw*yV1E$G5k>qNK+/?a\T1Nl+<My9XwV^u\^nacHcT6qCh+L
?EX9jj :dMw8b:/D>QdNYHpF>PQcMLaL/c@wRqD\bn?L9W^y6@SlAFkVQ>FE+cAMa$GdYeT*&Gd#/I$65$^qMb#
5d5t\M Hp6yNAa<t>Jw/HePyZEH#&eynacan/Q$J8I6VPQ%H$@yi#XlXBnVn&9C8DCtu>PEpYFM9/aJa<Pa@yWt
+R6jL* nA=n?8?cbSm+4CI>4CCNjX=HcY!#BbVGi!LQiYXaS\Pqq^G9a^wNVDhSGuhILcR$:9liSGp$YN^McVV1
>D@+iH 9JnT6&9CTDPtH>CEwYhMa%?$Wly=jmtqpiiZWjy>VSlFVk@Fp!tNjhFP/ep$DnE>p*bLaS498=QTcLV=
WGAhS9 FE4nn1<XqEbiYpqyNLS<K1X^ZJ^GcS!uy%Q/CW$a%<d$6#SlbB9VQ>YEwY6M@#1>G\#Tj>PEEi/$?AlT
4SDPcC GtWMjaNWkdIlSGpeY%&WSy/qQa<Xe$m?aB4:lD=415D#$F/$C1\nVGtWQ?5ynZ!%khI+Lpmb4ECb$$Qy
EllaNp =#Xl*B4VQ>TEpY=M@$IVB5E^niQ>dE4@Q$$aCEhSmLI#TYtWTjRX\AAej:&W^t9iTGu5#$&WZp&!E6N+
tNTLBC :X5wniQ/HE1nEZGcAAde1RpD=JniwRuD*Jl?VBNG!VH>VW$aHMj$e!S@Mj%6VSnY^nTPua5wnj%%McZj
RuS4q9 $+VSdW!nM>%LKa%n/nLc&I#*i#tqWS=jRYtWe%hTG5jWXbVG<Zw%yZEeZENy=L59WB4:@FyKJ&mi\DSi
:kyqL8 %#bKI$>iV&peS#hR?t9\:$bK+@*iSPu@lH<*W^4q>m&W@kQ<8=ZT@+J@6+u$IJ#Vd1e$#kN*WB4q&ZbK
cY1V&Z +=m?p>LIi*hSG99<dpyn&>^DcV!?k>Iwl??q>Nhy@5Q$h/$hp>1k%?HjF!tN@Hc@TJ6V/RPW^nuqRW4n
4:&Q5w QLCL$6mi8!tN:jpRybHZH1a$68eiTtNdQpJyLKQhqwN^ZH?J$nkYH1M$!1ZHSZwI/lFjynVP6$>RG8i4
u:*mwu 4%D/YJ4ZMa*!>WqKw<^:m6I+hy?tNQL9%!mNQQJ%TtN:@^8qEj5NT9<I@u&V$n?Hj<>RGtZP5!JhmWJu
K&5>#q L/Y^V=?nNM1Yd%Ec?@jdqMd=+ZqKw##?h$1nHH1B$6miL%Icija:qMb?jwuTiK<9W@4:<P<XT9<G@u%Z
@?$T?N yA>CyiFXT8M+?k>Kw/:^u=VG>9\iyjE/9$@yS6KVMI*>@pNKw>#/EcXSB9!a$6nZ=DV>IPT:u%Ic?@M%
=9EKJt TtMd9$=y9Ne*KI&@?^tqeb:>L$4n*QRtKhYwA:=FchTDjp=y%Fq?RYt<@9?tNM/Vd%Mc=:SjWl4ul%>S
S<hTP\ G8ZAP=SG8jJ4T8Q+@k&qeW#<q6KQpd/IciTF*%Mc&@IQqMa/*1W$/nu9mjVBKNQ?TGupp#>SG1@=#=SG
RaVhQR 9iA9qMc=<c?W^4uwd=VGPaTepB?MM999qEbb?\>K+@Y@V?ph/S*TpMa^<j<wnZ#^V$ynG@!L$unPD!mN
INHm^J 86u@mZVXMNKQMa*/\EiWutc4@FZHyb>/IA&/n$:/j^ZMS#4y@%Wk$*VT@/9YC:eEbl4pt$:/j^ZMCV4y
=ZBA#& @%X\L#4y@%X\L#4y@%YQyZh:R^y+TTj>9\4+XCj>9\4/S!j>9?yD$8qS^ajnP8u@\$C?/cV@D<N4J9%@
M!Dw8k GPkPP8u@\+BQhNL@l<Ge1bQ?Q\#p9W:/@#DkE=*$@&HR#n4y@<Nk#Ptp@\<Dj6hJ@^<GjKGV@n<M?qMu
XCjRYC @S>Q1bQ?Q^!@X!Q>j#m&M?u@\$H*%Eu@H\=nW!j>j#nM:#4y@<M9\F*$qMd&JQ%@PF+#/j@DRVd4yQ<Q
GjTG$R B:tqp@+@HPTBV94@eBlDP8u@\+E*hNL@l&N:p9+@A6yaJ@%@^Fl/Z5L$$id?i=Gia?:LF&q5b>L@S<Da
k=\CXl %Eu@H\FnW!j>j\VwMn4y@!Nk96NJ@^<B</hP?9<ItE>$$9>HkK#XTj<jAjJEJ@%@BI^LujV@EeDLP8u@
S5WbYV I=EHTQ<jCj&kp@+@E1?b>Q?S!M?p@+<EjX\u@Z@pC9#wphKkM?1p@+>EHmd>j!VIE=*$@=HI6/V@n+R=
B@V%hm S!j>j?S*/ZpT$!DuhNL@S<Ia%Wu@H\Y<4=Q?Q\19p@V@WhDGP8u@w?CeP8u@w$AH%$u@H\W/1W:/@!nR
qwZ:eL $ZVT@$jltCL>j^VM&#4y@/Nk*6NJ@^<F5q<u@Z<W<kDy@/NA^8mp@%jDGNXJ@/<GQ6XJ@/?GQ6hJ@/?G
d4jYcX ?>bJ@/@GhmQ>9^19njV@c6A*hhL@1:G9Tj?9luqbJ@&@G8a:ujV@/qjw&S9VIL6$$9?4RY:yyQ?Ql9G1
S8qYj\ p@+@GuleJ@%@NH+BR94@cLkQujV@$SD4yQ?Q^nFP?9>w$AF%$9>H\:!tp@+@G8a%ujV@$ZkNyQ?QAhtk
@N%c1p p@+@B9yEJ@%@DPnSP8u@a$A*%Eu@H@M\4S%kG68j>Q<^IJ>%$9@H\J!mp@+@B8?S>Q?^IH6$$9@HIn?R
*WVjGS @n<Y?EIu@Z<5*K6P?9>amHZT@<iC@18V@n<Y^#:y@&NSjyL?Q^bqFPu@+$ywZRQVPN=J@^<*#4bdMA/9
-A\qTB 000049c965c001202b4 Page 502 of binaries2.zip
^me\cN kjV@eemVyQ?Q\#FP?9<+cE8h>Q>^$B+//j@n5M%J@^<H9>NJ@^>*8@Z%nnaP=T4y@?NRSyH?Q\:tVJ*$
KQ/KMA @@F+dcV@n<h4I@%@QI=q$9@HA!@4yQ?Ql@dYTj<jD>iqp@+@HtKh>Q@^wFQ4yQ?Qj=VYhDCN+=j$@@E+
biS<D# %=D?Q\HHLPu@E*BepQ+@AYTMV94@BP\n$9<uAK@yyQ>Q\LFA?9<E?J%P?9<E$Jh%$9<u+J^C?9<E$E%$
MlWYYy $9<u\J!9p@+@EibDujV@mVAQ/KV@V\Vb1bQ?Q^Fpk$:/@$Ren/V@V<S&IQ%@Il#ZTj?jmH^C?9>E=E@T
\?YlDK @!jm9Ed/@<V*cJ$Lq/8Rb$n@u+S#Giu@p*A8IQ%@Ew+S$9<uwY=A?9?p#%6jcttVeL!R@n<J=!#T@!il
wA/h$: HCD>j^LwhD4y@=N^RbL$@<p\N?1p@$@GibQ$@<q+:/V@V\c=wyQ?Q^uGyW:/@&TWtcV@V::W@HbeyG?t
mTdJTc >V6M*&h?R!:TZ#c@I^jy9ic*=CL>19p>8Wm@cZ=VL6L9t6?Xm@T@#G@L#SAwN:<9F?ul=njqIn*J@K=e
JZmGQA yGia*=cLhC&6IYJ/kjtN8Wk9Nd<#F?uV#Y@NSd4d@N=eyFQtN?emjcu=*dqId#P@QSjyP<*9#$Wc?Eku
J^LiQ+ @V<Adc?V@l>AHa#$@\Dw@n4y@\HRw*ZT@\Mw8$n@Q\VqJPu@l+B?wbQ?j<kCYkQFhKj=jd%IG?a*>u=B
P>4H:y jR>h>EF>D/%C*mH>QjVd6&>L9>I1ij9iQ#8?l*::ql*t>>Cw8S&w*$MZ=l%6YaF/SbjiIcwk8pc%l&wQ
d4i?9j 9@aRd!$i^/Y$AcmX>>&qcDad:&X/PmnNT\YqicqRTM*44b8@b&qid>$>$/F=9ZZDL$48Yd^w&mpH5PbX
wtJl+I TZJ%w69W1uCuIi$u$>Pt+C^XVjcbWY4tuF1e=Winn:d/9I!\qIy%E%\9$d>J=mk4T1\hda:yiJA$4?A=
k\PB=$ B&VB/XICD\^p+QAh$tAGD6<SXhp+QS5P*^<Na?D\be%wB8+ye\E%N\:Z1ea#eLl8NbGB\@Y1D^p+ZM6/
8Nb&Q+ tIHDhc:hDN^#=8Jjdl!8h$%t+HDNK<DA+S4aFAaP%=RPbiB\9ip\Bk:jSS@P\PF/*+nejI49VjYc*QXl
Pdb>8V BjwMB1+M*:E^eBZ+#w&B\@Z6&R#eIH\@^<AN^uh*DB!?5=9L\PE:kPMb8GH+jw?B\#Za##F\?M:yJAaP
HKbLXM %#:ub?GDektHc?aNnQ4\uY5nA#eb*^M!eAF<l<nA+Z8FyR\e9tMi!<Ahki<mGVl<b*<!A+j4!8$MHL/*
%aHk== PwYB\#Z*bkb8F4:ubPCP^ZikDB#1Da5b8Lu+ZyTBP^:jtVJ\?F+l!MDli/$%DN!J?B/Ykb8H:&kbPH#H
tm4tTa 8I/Bc<B*4\^eI:/ZbiD\Qj$kG%iYDah:B8IM*CJ<:<9ANiM:aed%+d9FJAPH:>=TDB#cqP=q+JdlP&Id
:!8DyF X=JqbRL*G?m9CT>/<B8u@L6R\4Zni%4GijE>$R$MHP+@&MdA+b/ct^m+$@ChL\PH:>=8biDP\HjFDN!b
KQXR%> ?B/bkeQ*tue\eQnihV8n*%dn8&u16%Y8j46W\8E?upYM<?Ii1&Mb8BD8!YHkeK<DR+@FQS@/HkaP>@a<
ma!*uX \5Dl?@6HGVl<py#K\PG?p1MaPN^#enRDl@6SynF\Qdm@laHDjT#VGVne+<LSV@E6Cpe@^d$^5^k+ZHjm
E\$<d^ /LG+y+dDj:njl1Q9>8K?PRaP>:ch\eDlHy:=DB\8BhR^eLn*y=/B\*%BHH$T>\\%MZC+d+mnN?GiIw/i
XRJCk& 5^Wmnl/Le\qHn<X>T1$MHP=l+8m:8L>yGRPH?!$MBk:*SZH$a6\:%<*AZaG4WR\e:4Zm/Nt+D+8nb?Mi
ljLSwa 4R+GD9h94YZkeG@Zekd8Yq!Xa?B\V>#yDB!?F?a<L?Bi5lWMHP+^=MlujJ9Dic+\9/%m+HD9G8h?ee<\
Mmu#MS y#>\#^6H48G?N5:<hkj8NYZk68N?MkaP>#F^?8M8*JQG\N&N?>Wa8H6\4biB&+H:*Bk+*HNY!eDlZ1&9
pEljFW MuC+^?>JBk:*8D@F\D&Ii?+aPN^Z!NGLh?Miakd8Ih\@#5Dlu68jMHB:eI<+A+h:EuWGD6j+Q<mFW$EF
&?Ia5G FXV+^ILc4XH$Ri*YWCH9pN/6<e:Li>M1VMp:Q\\+ht8<<?L*#H&!?PZBkdyd+=Q*HX#mKeYX^8kXqIhE
?>Z$X\ K^T:l$RQ%!\cyBQBSNlIcy*NAbHbw4W%6Yl65W%Gwm$TnKa$e&JeG\\b/B!:6cMqWF<D9/>J=>y:w/q\
HWRh#b n=E8Etjy/A+tnK/cSDIS$lwT\ZZ&Ei9WpMX>ZPFkJLa8YSPQ^>c+m5\j%$QbRmQXFp\t+>&JaNJatAm8
y\Ml/E da5qWnYl8HpRjyA8PmX5dBLFmjDGaMyaat^J65Zm9ZG#5DNyJJwdqkjZSA#MT/$l:TYDC\q%V=5tH&&P
#XI4nt lqN%$c:qS1KuJ1T=L$heLFWwZd^X$JpKS=Lml?%GKB\QG>GW+$hY1jQP4DPkw!+5ck&G#A8X$!%GeENT
yqy\\E LtkLypLhl1NwiTIaV^ikIiB$i1qwLEmh*B5PdilKBCGQ&ZancV1TTwy5S!1BXpklE%<Zy!9AJJ$dp/$G
TIG6cS NW%ua*SnPBGL>5D6aPW6hTG$KYpqN^whwWR5EnETwmmSCG/^W<*Ab<FWnI/qW5FRh:1*Ylapa5G8WDCb
M#uJ81 wy>KiY!ky4AS/VIQ%Ajn%mu4a#$>\YkZ@RS64\d6E>VHwmt+FnQhEE\F+V/NaI@IA5hCq?Mpc8YZB=Md
Z$ujBE #I##hA94/48N$Ia%5e*ydE>Ze!kYZhCdT6FXYGWh9iGWIb>&ab&:MwT%lniHw%Li@Jp::/#G+uJMJ<I>
EaSt!l MIwZYFjW%y95hq#P<uA1aplueR&jFuVKbCYMKDWjbl\>lHbCSeJIlGNh+XBRZI/nm#6TZjKqTw$5?MyM
RwWyhn \1BetInSHbkn%PTHDnlVeJ%lq:dGw4GFS1#HTCY&TKY>pXT+\+kawjTXteZY:cRVueJ!Ky&$E#y%E/R:
H?y*+! WpHS88pCG4BRAB$ZA=Y?QhkVF*paTh*lWBIS+XSanKSPpDI\4FIwP#ALa!GY&NK/#4!TVllp48Q6SnAK
I&j<R% HWTZC6q%$K+kh5*e<5dq^8cWQYk/MR5DPJ\!j%!dSaRHtu9m$IEBKNMYBCPSYC\cYGSEaHC9CAnL%ump
R4F5+D *VlHE/cZ6bZ%!=1c=F?%NV1#cY8^tu6E%>dGi>h+Zkj?#88wLE8hR6a!9b9=P#mWeZhwhd8%daWnt:+@
1pPdKM $!K*jR?&Q#d:A8\!1*Ke9qyZCIQiNI*X&JPeKA<$Ba?eHX+%6?5wcZ14mTjYP!/cGm*#d1^C//V!Wc5R
N@=8h: L<=%\Kw9ADiIywK%Y5>&$y4CmTRckq?HjcVXC4@wA1qlC=E=cd^EP$i65T^8SNFZIAu!?klPSFdB&wk4
At5eBT 8Z^L*KA5ntykV9E:uFicq>uyn4kSe8bkIuEYkGB\Fy!!jEGLZTKNMT^KX!=GX#wHV\Td4R^WcF$GTMqp
:*wyKd DGcPbKy*DhdR%BFj6VaG>\yydD+Z=%KB6^:k\dnYD%#Km/QRXF@elYLK>>a4#NK$8mBjyb&^tWk1$hJM
#AM$yG +d\4h/t#\K:JXcy%\CT=aW66^^cR@V&ByqkEd4#Y6lthiTLw&5cN\Dcp=jRE\^Fb@eQDmWRM^b<=F>4#
d=tiNG 5?BnpI<hSkIiZF%hpupIT#9mpTBMb^%Y<+1CinkhCpuQ$wbF49KtlGG+m64c4K6NL\RJ6144/kqdR\T8
RDPR&E u?dX#A8$Y6V#EJcKY6LuQRZ+CS9C8k=#BkMXTek\Y$i5d+%%BTMmu/H1&4NwS/wn8NGw:$&A@waDkTd:
iVZu<9 DkMGR=hDIXkSnudFN6HHE?aMCa<A%1^4q1R4kPcAGyQai>%!Blm$N4bt9RjZ8a6hJbIahBX4+85Pn*bL
+SZmMt bt@wyCiVJLN#XhL=BJK$bwmpNWMpJdqeV$d+/$CjEa1=w<Ae?QkW$pH>6RnWVXJ>*L>$=M%P:+RjYudZ
pS8hNQ #eyJp&5Kd/a5yXD<\9NXBCakpSS/PPZlctG8e8a<AE&kbLkLHDB#XwM+aE:@nR5/F&ytJ*te$y^NyINY
P%Qa5I Pe/ahZNe9+dC8nuP*\8eE&EilItPjw&ycC#/GbG#jnVdw@LbHyZQhmIeB?HtaX=QbNdp$T4!D#KlJ5y^
nN/R>W $*Sunt8qC<w<6X^*9YBaXEl:p>L\F<IW=4y%CTPbZCBWSa@T6Q^1MJIdW9npatdTE+?bkihmI&Ey8Cmb
%#nY=k lZbH^@HyIu%E#LTm9NYI>lJpcY<QcQ5l!5Hy$X%N?qGSHnY%VlClu=%6Mm=P*c/=9CWeNS1nZiq=&>V<
W@Wlph p*Ic<TIQ5HA\C14GSlKYNNPuu$llAFpDZbymAYMXT>4Nmqmmc\Xew9mlcMDGcCm^Jb=1MM!Ijt\KP9Vb
6PMSXR R$wPeGIM%ShcnMD4eT%IyJ@cub*WGp^%t@1pmLMyqJITFue4Aqu$ldk>e>WpNK^kiV!Xu4mwYyBnFGWV
TE@^e# q>uK#cJacIPSTky=C%j8XYd@*n1Rq1b!kaB%ScFN^KWtk6Ep#uF+KpeB1BqSqCa^%@VkNYZkVNaWC@Wt
u^Bwyp F$C*CyFd:<y*myp8cZi4^hZtk^h^i@4B#u:!E>PeYCdA^@9$*Pq/qKauY?6B8K+X:mT$RV!@Na8uSmkp
*G$DpK tF&AV@*+bGiZtGJj%C\XYti#!%A/lEQPH<Qnd6J%D98^&!=J@%B/TCe?dYpQhwXn$w&qL%De6H%6<q%d
<PEk/S #>jPE>ZF+$aR?qM5F/LCbG\$I5:d\EYVaBIuR%AMN!Zqa6Hayl!A&HXpncQEiZ<L/^4C!XApq8^NGM6B
T@hQ9M uat8m^n&MeeN&XpdpHqGFIab=@DwJ%^^5Wc>ZTk%1X&a$Z88hV:4EnGS91V$1w%WqK=S85d$itkG8:t%
NASbEq QSPW8SduEq$8NXHmK+6#yAdIaFVwH5hTX8hCEL/PXT=#Fe5/:yTR5u\$bY:GRIjCNEe5M>Wui?$Z=cuy
SJRehl !Mc>Wp#F8I/XmbbL#E:GPe>=!K:Cuy#Nn5Ki5^cbqnhm$4tMI?+lp*e/^TJun*l+5la>:dWYDQW4$MNT
WVE\T5 +JncXkP/hbPS&JA$HXmBQypI^^IbM4I99?pnZFLi?@k#Vjy$P*MmT^?S=:^$tjX\dSXa:\ZM=!L*E=H<
Wb*\+% ndm6EhSuY&nH:9ba#DebLHPcq:nJ?$m6+*Hc6iDn?Hch*+dyu&XYqFtT8ewpHcG&eT=iwbakb#J@:qtu
X=XplW a<FKi1mcNp$D8ZH5MS1X%#T$6Jmc9QinYec%bKwu&a=tQiB=9i:HT6tSw?bc*uD&p+@u4C!MpGbFjF>m
cmEnk6 elTJDXynp^jP^BG^+G:np/S4hwVZSdN#aEN9MJL>KJ^t4jhSZDm#D1VZt<\KRRuP?lN:MIu/wWG>5cIB
\!l8Mn q^1yVdHEB1<86k>qhyN>LE8^b?e/Dn8PuHJMJuP:!6I%blc:Tt\Yh^%\*XDYw%pQbLpEB\CPtRM4aC<A
eX<EZS +k&b+/5FJ!8c>mQTLP>YNB%T$HwVCy*4inPJ:<*Mte6WL#*$AIh<V1!9MVcdbjX+?qC1QRk@/MF*cp/B
b?iJ$! cyi:tdY#PjMh:5K&p*8N^Bb4+Ly@+*qAj9LL8Bh#TIF!G84PYttHASNV#QP\*DM98%uqbW&+<yT<cawC
/1<^wE !cZy$qnW$DJ<!M9?Z6$?Zb%?Y=$?l%%iAF&?Vq*?VG$@kBt8TS&?MN%PR!WHtGuuu=K*S>8Jy<NSy?\c
uDIn=T N5Q>1>Ri5l6Ze141GK5tc<5qk6jVYt8cW&TEY&=+!yl5WpTW9?\8p&c&VLTY+hjV=d6VBSZ/TTlqYmR1
BJ4Ea! bXwpKtXcJCyqYmR1>dhIJN?Hu$WmGihupWnGwaZ4eR\eY1*?pIFDm>aQM*Bw:Zw*A+iYkTa^eGn^b#ID
-A1#&i 0007b5d48f9001202b4 Page 503 of binaries2.zip
+yjTFK l@6QA\\e&l&d\5Clb=qDGVn$PuMaA+eicR=u+Q:ma$FI\ypYj&y!%+jiX:JcEJJ^FV+YlGVeRB<LRnJ8
5i\1Y/ 5I<FISp*^MiCpI!4>LEkJPPG?qkRpuEH?%kRpuEnjC\I!dmSQlcEbN\wH\6CM1:c^+KRnB9ua$FI^w**
mehS>9 5TAp+\:^5TAp+/d+YBCTeaj=YBCTedl6hT\Dh/TQBTEbh=TQBTEbh:TQBTEbX?NnRWnG#jK^ICVnn9Y^
IRRB%q ICVn=9laEJJ^^@qaEJJ^6V+YlGVeCV+YlGVemV+YlGVeQB<LRnL8e#+YlGVeTV+YlGSe9a<FISuZ=GNB
Hd$PTj TMa6>LEkJPQRw$<&C$I!46uHkyCMY?^nRWnGLjG^ICVnYu\5CMt+Xl<LRnJ81a<FISq*M5iCWKt\DQSV
GVHt>q $!Rq@5ay@:bK8PW?FwVp?qd+YBCTecj/YBCTecj=YBCTeYj+YBCTeYj/YBCTeYj=YBCTec6<LAnJ8NW?
?&Q+1^ FwSpZJBnRclWYQ!=m@w6/P1*T!Se!MiCpF^jq+<FISqu?FkRpuF4jT\I!dl8H\6CMm:5a$FI^1**5TAp
X>5Mu& +>Dm#%RGD4%PHeZAwTYjw^p+6PR#naGL?%kRpuFw!Ye/A+jjJHL$W%^*+Pmu?H*YLAaP9Yy^>Fn$8MZl
wa6%PQ Q:Vp\>F*N@6aEJJ^Y*\5CMp+6PR#u+FDT#=%DB^/B16u+NB4GEijSM6AVR\eY9Ll/E%w!ain=/AqH++i
5</wi* m#KJw<im>dNYBk+6?ZD$ZjS?6w!B8<LHkyCMR$5?HL*+Kl<LRnL8cl<LRnIPLjq\>G!$=MQS5>GDY\eD
Lb<#h> l>:h%nJ\cMquPRN*9a<FISq*k+<FIStHqu\+#\6w!YeFA*i#n\WlGaei/nnQFYnJl@Nekb:6PQh:8+<F
!XJZp: IStHH9E+et&:n\WlGZiZn\WlGZi*n\WlGZiQn\WlGdjD^+KRnL9Z^+KRnL9Q^+KRnN9ya$FI^6*9a$FI
daX1dn ^n*ka$FI^8*!5TAp+*d:YBCTeR@=YBCTeil%pKMZ:@G^ICVnH9G^ICVnH9Y^ICVn98SnRWnGQibnRWnG
Dd/DEu wZjED*LlXFBBBSW?>XD!5Z/q9Hlb\bV9JTnw$&=h$HKQcyjmD6&yXL^&^w#%\a*BttS96CaW/=pSV<T/
L@D!P9 ipPy=I#%ZS6t#K1bNcM4Fp4PCMdDM\:ABqAT\mpl!uXq:WbnthAeSYJW!XRXqE^%Dl+qRXRR%pEHtj=k
$tmNJu ^=Xy&kl!A/SCpe?4H*&EhlKJH<nWmkyF#\<nBV<p#W@LFW5WQV?ME9^kCwl\NBVy:VIWX^R^Q%RVQ/AJ
kYVaEw ph1R?YYT+wem=wjSMn@$BEPKGa1dH<aIjwmEqV/y?AGiN+it>ahEiGP6FqbMWiV!ac#kl/n+MF!JmYKZ
>>pkia D<P%E8RH!ZcIddhh5WcS<eN<$?WI<IQEDl&yIB4@:E4d>qhMWXV<WCL+\dSE$hEdS^N:tCN4^wwbmw$j
B>L/Mb Tn*+\ZIBw6ml/Qml#IMjXAMXL#?Wt@!ktpV^k?CHC8CH!1wM$%c8MNd$%bbuYA%WF+>HCqFQc&9Lkq\+
eBXG!X q>5W#>Dc%6JWpHyY%DeW+4:cP>44C%HQ<5cX!&9YhG9^bBJ$^D9uYn&@c^=cjNFKP5:=5<PQVN9TI>9w
BhIaJD PDDG@=Y$HVhGT>eV<n?j\\XNqmD1tVc6MQYECuR><WLXE!>IQYlnL<>k%lQQ&X?T\^m@iwLJ\6RV/5/u
B8Pu9# jdbK>jl^EL8iHH=j$a5T1=&VY4jj?CJQVFH>:DG4+%uGF:yy!uY8DFhPH1E4F8w6lN\\Li<YwJ=ph&SN
/:1<ed Ly#LI=XuRQe?lckHR\$$Wn:*lj%ZqYH#$SZG:ie#JXw<LMSMtd&iA5&W!^a5D8VC8Z!Jia@&@ZuG#ZyZ
M8>*Z@ jb^^e>aVK6D%^A6XV:\k>SS1^8*P4:?1?n^#b:?^95*e8iyl#6^b18u##J&4uwLN*Ma/dhi<4VlPMX>T
YwnkeQ p\n:nh6T1Bn!i*EtL+F^i\DM8Fp:9w<#45<IK>CMK&^md=::&T\#:yA?TW!wy!ATM&e><RJhD%QT=c1H
aIPwSE P=K#%NQupb!4upVPGRZ/*Z>tF9WaTe%u=GIqSyKaXjPieR9B1Xa>/C!My!H=>BnWE%8#*1?ibY9Y=/^u
4^E#W9 WG8&=S\KI?ydPn9k%w&%pb%:#Sc5Qt>t>$j9#>j@Aju1&RG689ED:R:>^W9t:9!#X9*HZ%p6@A@M#\/W
98&+1C 4Q#q8@NNHdN?WTFc#>SX5T6<45hL^:T9=$eDLX&%AQYaPtcPi4^$VHe>LAqXL$bPVw=HCiX*QS=#1jj%
8>w*t@ lLSyBcpup5^%Z=FkMtpdWM<mEWBmF8b/RGIYwl+aFkZSDjPWLFXMHbNhV%^DEi:ZQlt/wYj:wI=bpHy!
YqNt?: #E\=^wX4b94a@Y:Xp<4jyQ?R^eGNRV@bP>SeJWl8*/PVFkyZiJl%6Q4h4E@I1IYce^6wwha1RRH11a@A
?*Z1c8 JAyDPik#q$IL+u%y/jY5%S=#1jq$Z+D4Mb@KC%BQ?1ueDM!u<6Zbu51:W#$SnVqVn44+ijhMchYD*>#/
qF^QKX ZA?uuiqy!QiyBb?G5CK@ip=4dwMb:l#jinnZa#+NFcC@#KilA6Sn/qDE#9ueq%pQNI?Yb@8autF<Z<t%
4<DGyt 64aq<yW:ym/Ya+FTG/>YKI6:lhI9PGTl4^c1XmnXC1Xcwe!5J>/d#*%>Im8hiRc%$4q9Xn4F#N%1JNbq
CXldW4 WSWG>Lib8%@PVAWaPj8TW%u4ant&b?**Pq*S:5@cy:1a&y?XZ#*:YljLen%>%<YKhJ<ZY^j#41n\8qkP
!A^C/y HWD5F@MNc4@a@4XjLNhC5Dc59<*e>e88&bBVH/EXL:>k4mkZwJ:F/^N4c+D!8c?1A%$DMFit<&5j^<y$
XyQP5# H9%XKIqy4p#u!V@#5b=\9KpRjNnjJKaywhI4*Hueq%pQ4uDu&V/=68qwXj%#u$/wRNjV#@d:hPjZ#u*Z
6kSL+P MdNjWN>$#F#%>LN>VG\h$:5mY<e5+H+w@%E1:aj/bHWj5==?6B?KyFlDLJSFSFZ&Rjhy<G8jQ8k?99X\
>KaFWy hI%ee?q?4t9+65?uwG6p9b+?/l1?><ZSEVn>*kehwTHZiGj1CQ:%KC9$KnlC$X8lX!NCBVWm=DBR<WC^
j:9yB6 l+ctq8ZDt1MyI^E%WwHG#jFILGH$eZheun>ZaZ<QM&jPSD+1?ubRGwaKT5QIDDkk$F@u<b4\4%itwZW5
Pl6:/% #jRENBXwkJd&DcSyB&qw1XuVD1aFnGEcYtbF:#CcllKtE?kWwBXAy?JCANDyRGeAuRq$F6A1IF\L\?jn
M&%S^t LmDe=IX96ZB@Hm:NlIF\nR6ZwHCBBh<E^*A^AAmj**G=dmQRFmB<>D<Q/QNA=&6mGSHZIT8BlkCl6@ZB
HtpqbE RDeAZctl%^K^IHAl$LqAt+DP%6B:BZw5RC9%twai=HG9?qIN4SB4&nmk<WAVkCaCZR?$DGkT$GRkZDE=
KJH>^F BGkK$KEwYwCtA!HH+J:>\+GPAMK9ya<CPl4wImBehd$ECD*dj\aZFwA&A?Fm$E!kYWDHAB$LNB6wDqAW
/:/RaE /AIkZNuDXamXRMeB+Z=<NGb&A6CJRQPAQkh$Em*I+B+pjP8H1&kw>*B%bmERj1*aDLRaCHj%+S6aZLI<
@Aptd4 GShYkD1ALkc/FPk!wM8B4kC/C8l1wG8A9kC$Dcn8$&DiAb1?G1kNtFRHKkE1BTwHGkJWCVRe/Ctky+G?
P\ye!4 D9RM$LNAi+GiA*wB/CYkX+DiBHwL/PhA:$K>WJ<P>iqqRBXAA+EGAR$Gk44%k+CGAeE=>BFAI+HGAI$F
i/##y1 tk\WAJwChDnREWBVka+Etk+$A&kY$LFAe+DtAl$QXA6$A6CJRQPA/wAckB1BtwAYAm$CckbcDLRE1AYw
8XQ4Xw HckVcAZRT1DVkE+HPkQwVKC#kIJAc+BCRF%AB6BcwHXA*WD4kVaASaB/kKJAMcA+$NqACcApWA1wF&kn
!AGy/l $Cck#WBdkM+BPljwjKALkLaCZRl$EhDFRJeAZRy$GhDqRFeAZRq$FhDXRNeAjRHwY1D4kLaBZR>$A>CN
b?ql=F RDeB*R^$C>C6RLeB*RG$HilPwL8A:kc/B&kH$H%AP+H8B*wA/EGkZWC:kS+CiukAiwkj\Nlb1IIKB*BA
4AMLn& #t<\%9T8C^#b8DqqSJQlYDRbcIy$Ja+1nkawBeF4**t6FtmKSd1MSGB8#W^H8RwHhkA66/J6aX6L?PN9
RX6lER YD<Jk6nNyt>h8VZ@T<L/4E!u9p$jXHK8T+ZjY8BY!P+SXu>a8a6XRRXYIKjnbYJAXbVwNLn$WyjIEcFM
c1u59Z QHkQ#wLVJS\?*FdbPD$dDl?El#F\?BA@twHDB@pW+@4\ad?ZkZ5BH:Ab=*$SH<Ib8Jj\Ib&Bi^YmD^t+
*C+9K< @+DwaRd8Q!Hc#eDl^@KVGLkj+?ICA@ecLpA\eG@kAkWDl<abDtZk*5QFDRd8n:kApl8uD+b5DRMHjK@Q
GSjpPD aPCA:@YbDN^R!B:D\FXBhnaDN\!!e^k+GG@/b^t+pbCh!<CNk8#^DN^a!M=n+MbB>uMM*HnIu5VAVaD5
&<jI%V @N#!RA>A6wFS*!GRdYVkypJ&CRN*JGSdGLmnId8WkeMF9dEMZA%p&^m+GbA>taGdChq&Bt+&bE>l+I/D
HVNV*w dDMDh#^pV&ZkVwD5cR#eQMk8b8BAMhdQbQBXHYSZMiydANuXDF\>bIMMZANp%#B\nbANMZBNpP%m+BbD
X/$TBL hl$D%\4bKAP*FLI^Bk+Z^kjb8LJ58DdI^lt+p!F:NkQZD6pE+@w/IJ6p+JbDN5ZAhWK&q+FdChu#dX!J
RVwtm* y:wI8FQl<P9qP9*G!e<ZT4nVAZeh+:^uRjaGBt+%bLe^eEHI*5VAlTB:C\QZBhqdGVkD54e^eG5li#5D
nj<*?k 6\/!h#B\*bDh#8m*MB!?t@16&>X9q$1+>aBd^Dn9B5ki!<BFIH5mA>iDV?+MZBT!i^m+GGRjaiDmpH&W
8&/6:B kePZeFMbPH\BiBRDl!<Jn&dk<GZlNAb8I&VDDB!?WJ#P\PGLQw+im!<=PZw59kmh^eDl\lFH*<YZ1l#?
Q?n/:i \^i9HL*+jMl!?9eC!J:B\PGC%*\GDtXtHRPHL&V4GVl<Ge4SP@HFdlMDl!>WPjwX9uVq/EQ+py8n:?IL
t=l%BV ZI/?m!>=Y^p+jBHM$a9^bjE!B8=c!BwMHL/5=?nQ&!Dd#eBhD>uQMHC+waCnn?MGBI+?jlNEHR#e#SC6
/q<yb! biB8kYk=A*e4bDu!/ndIu5:A*R+S=:umDwlYMHDdIe8S#*hC^Hu?8A5m#9QH*SB^:9ei!HL/a\hEHLq&
46th1X L&R=<>6P!HL/>+8R@SIDh#>pPj*^AGRja?AilP#nDN\8!H/bkh5N&Tea8IelY<uA:aH5X^t+S!H:JAQ*
Xj6C%8 Jek?^eA>B6tuGdnHIiLw^X?G:EwG:kuIe9TD4$D&J\#eX!Fd!<A>CXthkZ5Kwk>!+XSRRRWXQ4Ek64um
mI<kSi ^6i^bdklXFe8aw5>TC=m#bty6ndi8$a^ShH#k+cd*p%?THaHE$cZawtm=+iSkl>MASGPlmK>ZadmmmLt
+1WS>L l%HED:Z^6bHcWK!uJ^bX@FDE@FA6<$NQMKTawdn=adVkl$la/bPKH<4\a$4TH^LlndXcYDFFpe8HMaIj
L#N6:a wpb1W!!^RatJayeQw:RT=IhYI=YIdVITG=KBNw#dI5FwT4FGpjHDjE\mQ$n5$JEKS48Cmc=AT*lNIyna
Th*++Y wymm1QmlSQCD?TX#S&<enaBmdyES:DIT/6QFw8PHWk>?EJIldCl&KD=?KQQkB>XA^e5Q=Ta@1CbS@CD+
Y4*SPR wRL+wdI1q!YW5e4F&9:ya5*Q6dZd>Zidq5ZX6uK^6u?=YFP8$j#4Kb^L5&/@<WW8#cJy%?li+$8=NN8@
i%h#1? ZJyX=jI\Q$+=tC>8B@Q:hMbXD8d#1$e=tN?@HM\Z$nH<4uqdeb^m91RtEjad6/XRMiV*+p^iA8Q&AJl^
-Al/&4 0002b4d1ca7001202b4 Page 504 of binaries2.zip
EVADYm >^9H<FY=jP5N/b?8>j1bT:#?=n18pC:jjEc8$?Yd>+^dCE/%/8qHL6<G6ia\dD8m91Y#A&:hYB9b8hh5
5HGiWb \i4#bub@>Q=<@S?R4=+h$KwdQ>D8$F?<bP:PQ&9Xj@!X%eL@\Q#5RMuKZ:+:*>R^/^eXw9XMZSY:\8h/
^<JAFb 9HSM?*y?NNDTXR6Rn/qn=1nHT<h$%<PTWQXm=PVpiJSRj6jnMbh/Z$>It%cRimLJZQiFV6kC>dGiiDmT
!WKMtQ \a^dJaqbtP5BmXtIitBaFER*#FP!XDF%VHa>eR%F8F@:bPmGu8&DPtbB/5p^M?WaF//b/YQ*8%XQKyt*
D+6FkK HB8T!@Q=WHPXILq>n$=cKF#lahdS/ui#QmGnFt4PdcCFY15EBcnHhN1b>ycabT=NP$JP4&i6>ylL#cj:
$:LH9/ Aq!Q?XSikHwe#n?bV?Y45#&Xt<+@tVQq1I8jh<?WXn%y==>=6DM>Djp?6iDVEFdpX+@y@BP>Y?db:?dV
?QE&hQ WAH/!*\cKpA>yk/Xh9/b^*&b>cD####db&p5c9m@pt66de9dAaGym?XawNVG1^ZK+q/l>A65S<l1lXK6
pm\Ib& WKwXTw>/+4*=*Neu56Kbb%A4uj6tyXQM*K%Gaq$YXYFAj=8=??ZMXICS5!<=qdW8q56S%Zm%Q&9@*J?%
I/M?PR V*W^6V<49*4&6T/Y=Z4/4w5X/V+96m:tZXHlhdEePwDaL?ad%H/^@Y8@YK/FaG%aj=8=/=hh5!GuQpI4
Jmmmml Zu:BZFE8RD&L%!jY%kDqe%>XB:wGaK=M=>e?nyZyQQ14WBLVZJuPp*@ta#*liFMl?LC@TW^VR1XZ8QP+
M9\XqP L:MiZPHP5*%!dhQS194uQy%Rkc/uu?**/e/9uj88a&c@wL:ytLu1/Yj:tNk/yuhF6w=b\Q%R@1NW&k@%
i4RKyA !iw?bn*>cD<WTdGGYCmLmK45k?:V+Ne?jhB>jP9l/B1==6L>ZNj\db>QRhjIin%>%DX<:+8nI*D/9R</
q!qNZS RpP8<e:WEZ#4KYj/SC%u?pR6>@iJKy@Z#!i1nQQ#mT4nYD=S!=p?WRG*X<98E%W?L@yE@bCB?+/Y*aiy
4*ADC? nEQj1d5b8Ji%:D=MbS#/SJ*M\Q%A!?:DXMd>TM98\%VG@X4L:5NW^9%G!?:DXMd>X598\%VCwZP/4D=M
<b/*kW bX!=n\>VGXjl+<NW^k*$<YE1+\d:?DCXeWN<jJnK8EwjH/a!d1mQD%Mbh:CQD%MbN<LHl/tMG?un\%VG
@&^NSN njL^aT4n1u%<tM1+eV+?VGZeiB<jynL8EB<jynJ8mw<QW^q*tI<QW^p*Xe98\%VGHiun\%VGHiZn\%VG
H1!<Hi Hi*n\%VG%jn+MJX^5*^<tM1+a*%<tM1+PV+?VGZeeV+?VGZe<V+?VGZeCV+?VGZemV+?VGZeQB<jynL8
9Cnek^ e#+?VGZeTV+?VGZejB<jynK8\eiH1a^d/PQDXMa6<9FlK8Pc6i\?VGZeal<jynJ8ma<QW^uZ+8QDXMc%
*WV@M: ?9k\qZFLjZ!a!4lqQn=MbX\:^+hy8jC^?q@wC>Q<nbPj6$1+Vl<jyuJ>K*%<tM1+$*^<tM1+$*%<tM1+
ZA<iFH M*%<tM1+5*^<tM1+XV+?VGZecl<jynI8/PQDXMc6+jk\LSe?Y??ljq9n/4hLJF!Zn\>V8V:D^+iynF94
/T1V@: +<NW^1*#<YE1+:y>jJnK8LCQD%Mb6>:Hl/tM\@YC1R\e96e:mwGLc6q>tM1+tJdhl/tMm@9+MJX^/I6%
yG<yi> PkPHV>5eQScjPDq/LC=C#YLkeJYNw?>8%LL:MJX^/LPXw^h9>9FlK8P&?Qk\qZH+$D/jkWPj4ZWMHQy5
>IHZ\@ 4Yjk$Ge4S?<<Z<98\%VGwa>Xnu/FQqa=?lD/YPZw8!mVPQw8?q>8biA8$:L:MJX^/LN%GRN*la<QW^tH
?cTi\! Qq5=?9NXQn=Mbh#XQn=MbS#/dPZw+?m#qcPQZ/6q>&E1+>Bu/%wGdy8Y*aiynL9i^+iynL9B^+iynEPj
nIXtep 4b#uC9Vb8wKB8>uHl/tMR=?6uPiQY:Z5Qp^q*G%chl?tM8=&H^?tMk=>6uLp&uajH/a!:m+jH/a!:t+j
?nu+FZ H/a!:l+jH/a!dwiQD%Mbh/?QD%Mbh=?QD%Mb6>QHl/tM8>@Hl/tMi<DHl/tM&?Zn\%VG:jd^aT4nH9L^
=Bt95? aT4nH6c!?#CXeZ6<jJnK8Eh<jJnK8Eh>jJnK8C@=?DCXea@=?DCXeim#>aNePBXWWEGF@Tawu/k18IL!
pkG*PN mc1CF#>w!mi1Cy4!mcyCXu=RQqFXWD=SXenGD<wu1k4KJ/wK&iTD<wt1k9KJ1wIuQ<^ZQqFX$JSQXBY!
G!>tlP <wQ!mc1C<wt1Rnb?WD=SXXA?Wc&kjKI1u/kF1Ej=SQY6S@qEXV=SM+Q!mhwQb$4qeYB@tuGX^+H</qEi
a@D@>P B=SQXPWVNb<bX@qE#W@TKb?w&iySQqF>k9KJ1u!mKy?w!mj1^/lH?WSXQqGXV%VqE%Z=SFW?WhWKbSG8
R<FLFj WQwF=SNX4XC1Fey</qE?WhXK=<hd/XR?WR5!M!tj1Q8jV1h<w8+LZW#6#<19H8WVXjqE#W5Z!/EDKJ?w
&L:9!C ZF%M?WV>^Gb8=SN%Q>RAqE>W##BjW#=SqW@Wk8m1!mh1Dl%K?WV>PQhq/=nKJ/4!mbw^V!1j1Mwucl:>
N+pFkD *kehab@+SNXK6AH>/E*+GQWtZL$J*&i44?yNiH:%>L5*+Rj\6#F=B9ZGYL$^*w>Y#+4^njEa>eba9VHP
?Ht81X PiiwN<d=%hQ9*lkj5Ja+@PhK>YcX1:Q5N&>Ye:=9GK4iN?#D>\&F?q18aP<6D8D9uZ%CMc@9=>^4MXL6
y1@BSk 6XB:LjLYuj9dZw8i9AX99>1#ahcn>t#p4A@+J=F9?%A>ijPlYW<B>yCwN:V:waSTd&n#/Qe?TIS><wb&
cnJuH/ kDAPZGF:?T/XD\?TeCWabeHyEk+QDGVk!mEc#MANRSdN+wXe^qXCNI!BG\:ScAd8KanGMZBQR#Tikj5/
=>bLM9 SBMb8Gek?yCBi^cml^t+9SD6b8Cik&kTA@eCSJMb8JekCnB\4$A$laF:E/JDGdm*ID1Mkj5=SIe#eP>C
HmME8G hpS8Q6XljPk%8i9DC9RbDF\bbGe!eBYRQacBG\nb&R\enHq>DkM*GLKjbiBkZPy#GdmDIH5<A#eM59Ma
i?a<!C PBnu?8ea8BGRQatBG\ub?Xu+wF#CnaHDDa#/^pK&paGdDNpqDB#Mq*wLA#eF5p5b8MMlG59AHRHbNkb8
d9cj4N KtSQb8CPlG\:A#eh51e\eDMk&<#A#aL51R#e5bA>naGdA>uFDN^e!K=m+I/H:GwG4lc!RRd8BMm8aiBP
a\k&I> lG!Ikb5H&T+G4k/!/^m+B5lGGdlG!MaaPNRDB>t+5t!+lbCNM*CLIH5&A>eM&RVn?lbDN5uALaF5mwF4
/iqAD4 kY\9A:eM58jd8JI5i1LiBwhjK>jyN$:=h/GEc\jeha##hpL&Bkb8BYT*MZA4IZ5VA*ecbG>l+E/H:K$M
\5YM5% *BtR9a&BP^P!6#N\b$H&Dkb8FYT*M@wNHn9$P/ujX4u/:XIJB+>??mLGihhA>qkGDy+/>BMb8C:IM9Sa
HSN+\i *aD5Hkb8LYRjaiDYRjbSBk+j$1e!eLmijSRDl?5bS#N\?Ek@naH4kY!aka6CNJ&Bm$HE$W@^&bPnu=+N
9TVj1b $T\GDqeNPHw5Qnq#?A>jl*D$*X:Ie9y*I&VQaPA&+hIDA:ebZ!\\eF6\?a1B\<WHnn==LpSNDN#=EHH$
L$u1mb yk9\SRID6^Wmnl/Le\qHn:$Iq#ka8I5l+8m:q?B4J\aPbKb8MHCZReVSm!?HdDeDh\XpQ<QAZRpSS<??
Wm9QL? Cyi5GLm4Iiyk+K/BcC$D>\XeJtVk4wW5S%=hB>uVGdl6EHGiF//HcAWDh\NpPjL=Swk+#^W*+ZIqA*e#
SHRkt! SJ#:9RY!uQ/+FTKPZL5N5y#=:R:Ie9y*P&T@^MDhCXqPj>\F&eea8L5l?#kDh\>p9<#A:aD5E\#ejbC6
nTe8EY bPB&R9c4DN#>pH&TkZ5A5p<^eA>C>tpGdlhpX#J\8!HLtjejk8^QGLmHIX9L\P&B4M:AQRLSB:q\K1mk
\m5i5D kk1jillw9w&4\HhTbbw&AmYY<8yc*EH!/t4PaLY%<h+%mmtKul<kGmu+IhphVBlhmmYKul>GCZ+\BWR+
*>E9t$ Gw4$hltKK+1aH<aRQ>VG%$b1R:GiuqlW<WMS<$P%#A<>\bBml8Ltl>GCH!JlyW<1jwDu#cFy@TES*qm4
w=Tb6& lSXVFLq<GC9+IY1pN5WTG=TaKHd=MF\4RZ=wNXKJ&Can5TEbcMP+LSKMylS4FBp@#Mep<wQEDl&yaLR4
jDdi*V tPkK6IVZJIKJLawymwwjTkR@tEb1Pu4n?F$9=lab\T+npXVMWG#<WP4BD$I!lA*FD5ZHD&Wi@KAc1Hn=
@e$:6l wh#pB>Wpml<EQ%RAQ%SY=VJ!N%db8N5@dh#=icN&i?68$:J+^%a&:9a9G*jKt>t?5yZZ:Vi?!FbiNP*N
>*KKL5 *G6<KX6=?=i69Kyey9DHKW9+^Y$Jj=@P8MwTju:%KJ@\?=hQ?EJc=6<%d!8PW<!Z%CVCj8P&FC1G@F/e
ejDNWF !W6k*B+AM?=?a=t@Kyh=&mH>$#y6Q:M1i!BdejWb8W+446+#dmE+%c1uH%q^HhSc:&9EXS6S*>LbwcHB
&ZimEl +enP9YaLXy<*5@8n>?j4@+B<>i!AX6*+kZcH@8Iqe*j?Yc9?+/?5F9+H=teHTqd?<6*=yw=b9/kR4Yj1
N55SVD 16kXQ6jnyYQc%@Pnkbc8YwB/VB$#S#%iP1c:HycE1lenJ!jHw+V!8^/Q8hV:ipLc6ILWE$ut8m?$!liw
G?TA56 n@ZE\=EMb6\1Te#CZA>I#ELWW!k:*HqKqm1tn5t8J//lCQh4u\#h$LN>WMe5TD$=b1ae+<I%M**5j4j1
18jp=+ TTZ#qtNDeluRHt18EmT*:>FJC+W4QM\/Y9%8%mhp%ELN8R&$WG8XwAD%tFbe$?a#5<!qcd8#/jY5%S=#
+t5%dE 1jq$Z+D4Mb@KC%CQ\^w5</q<hdcue6McLHPtHHZ^<?/b$1wudR$&n*cty!Hjy^b<G5KK@Pw^4eGm8hM<
IFVD!t ?>%<GmyAj=qQR\Yw^>Tl$6bk<:k95^/$By6u?@RnZ=*n%R1q<6YbLTljuY1FW1%R=qMQ%+8>h$Yj!Eyu
MDXY%y upG6hCwjyN:%KB?p?ZM1c%$5q\@TeYy@q9JBtuQ8W98#<16H:e@cN@8#&D1Wh$YF%/F!#N*KJ!yZl>y9
/D=yR8 >uuq>IA+VHqAXB+R<=/=?=5H^H:m8SDZMbZu\u*nKVCu>?e1=j%=H?:VKbnZb1/Ptj&C?1bn=11uu?$@
j$%DwJ a88a*lZbP1d!S9%J:&NT9p#*R%%D?VLNw>@:wCQ5E%?tYyt:RJq^##?5YyXMBZ&q?TeihG$Atih9Z61<
$%tN<q jFZd\4bp%+dP=yb\u=c6<V/$n*<j!^9dY%ib@#:t?Re1h9RM=byiJVXyk:Gt%@$!ML+891SRd!u/^upu
dKeqmD RcB$CckhP9$XiSk=6Z=bR?QW\NTG88X%ELW%%!?jYp\NWFaAHmnST4ZBBbKQyuj8\W8ZLc%4dc^yZNta
B$ty4c ZapRp&TbFZj1&@SBJihK1KHm*wVEHh#b%q\VV^l4\=8#u>8$Q1?XKqHtcBSwn+NSb#H*qS6J$EkVZyyl
4CMhMT /+4V&1\&>K&\n$e?/cA<W1nk\a#KI+WKdu:RqEeKFVVqpWKF4Q!kQFKwwD^T1JCNH=SHClYWS\wX55pH
LuVFbk =bFCBiYSRkXQjym9QFKwwCtQFCyp=RjqpWIF=bFClY#<wD^T1KA<WqlBicSRHmpKWI@/+6t*H8YSRutp
hIDbR: !A#KI$W@uCtX9dj>cebX>6:!1$jbi%MiKbSHmu^tZPYSIn>Jy#^TbK6HicV\CewnljJIwV^TKI<WH/Mi
K$$CTR =bFCicSRHmtWS\4qpWJ=yFA4qEY+R8pZqEeK6WKyXmn#1Wh=yFA4uS>9yXN=yCnI#KR<W8^@Py*!TLE9
-AjIc+ 0007ee74c89001202b4 Page 505 of binaries2.zip
uj&WDy hDG%Q!8@i6V?LPYS\t98Xl+y8D1W<pn^me&+!mQFjnl#K+<WYhe^qWeK=bGmAD1t<pmSR+hTHmp?#u*b
DSbGPm P1d!TKE<WtVMp<wnljJIpWi@>$FH&DeiKRb1KlS=cGl1YV/5Pbw!EqEnFYneHI@EEpajh!#p?ZMX>9e\
DX\ESP e?bM=KPmd+eTZhM^CAue$h!wYKP+R*e1Fc?hMRN%1=ypd:RtFP8bEW@E8uyD1iTM>X$db5!1tVWDhQ9p
+4McMd nGA<QPMAdADqnWaF\Re11KBC:nBK%=ZpXEFJVlXWWJJVBTW=XXBBTW+XqPSWRRWqPXXRpqMFFR+R!cqy
ybATXQ p>1ZLZP<QT=j&N/b*4NYM4m#Pi$FB:KDtyydGpHe:1B+MeWNFDhKQ=$$dIt^JYppNl1JREM+GIt6\=$*
*<+>jG =aVeTjEDFD>I<j$W*!jXNH4w5uk1HI5t1S+w1mDaZI1Qy:mY+lMwQyHmiXJ%a+c*BbQJiHemtDTpK^5w
lIZZWS wNwR?5qyFJ>B<XpW6%P<q8KXFLhIy=k+9D$a:a4%BB1C1cB>%TWE9ajm8/YjDK>1N$LliNmIy8\jqBF\
Q<+j#B CX%dJeZD1Z!hXMHa$tRZ:6k4yYM4KD/V+p+JY#da>umFQ=EPnSleF+<d\WR\G5JQb6NuTq@/CI4VX=a?
AHKT:& H1K+m?JlFB>J<ZTK$%i*l?KHKV/I+mMw9pP/yJHD/qy^S&QE/IHYCTI4RPpAR1bbaR*F%I>/tqeHW@\R
wij*D< ^h8qt18HLc#L4JqcYS>D<dEWn/X+B5XBm8hRQJumAMY#KJ=C<XTK:=T8aNV\nqSZ=mYpt#6>Kd8qu$\a
B%/8Ii %JpKS<Ky5Lt>Nh$Bq%N<BeXZWu\X^XhVjA*FZ/D+Yw19w*kd^hhVjAQFN%J<E<W*W*\L^dhTjJ6$yiQL
D8yR4/ /tMJ=KIJhLCd+9WWd/A+RuEQ^XGKa^VHKV/d+kVFTayVFQhT9JHmVSS9yukL^ihRjC:F=%N<AeXdKd/R
eEAtw6 +w5w9ynmT!m?qPLLyJ88LI&9^W&lJXLbRcW>Rh\LYEZ+\!p&KK/n8JuG>%MWQ$*^%?u+w=S@l8JuKh=L
C#JeaI <ZPEi+V!L%D<E5Y9TNe$6EK+W4dFnQat^Y>S@HP1:uVyb@ww!@XS+IlA8=GM>TbCJmitiZWp^d8wFlL=
<$Eu*P tp:q!!liSjFhFDhS9JDmShJbK\+TZ&4Vti*lu^+ycdGu9a6^1T&t&!mjFk?4yX4LD^I&jX!%qt9ctSTj
1qjINu IYI^9$DekZGbyy>K?SDq\@MH4NWtdNXK^y?w+j@b&wC84Y*V#jSl=9<J=9?S=9>K@D@8j:WBeDqAdRPk
dbpwnt eaBKkE1B!wGGAFWCDRh/C8lywK<DQRQ$LNBiwPiAZkB/CikXwDiB*kL/PhC:WC@Wy$N>ilqRBhBAwEFA
ICy:Bp k+Gkd9$kwGFAeA=>BNBIwDFAa+EtA\YAykAhDuRE$FTkI+GtA<$AtkX$LNAewLqA^\QXAy$AhCLRQKA/
h+JaVd wAckS1AtwIXAm+CckSaDLRF1AYwH/kScAdRT/DTk$+HPADwV/C!kINAcwBBRF=AB6BbwHXA*$H1kDWAS
!^ciMG wB/kKFAMKA=$NqACKAtWA8wF&km$CYk#$Bcke+DPBVwj/AKk4WAZAq$EhDHRJWCZAq$GhDuRFWBZAq$F
cFybX? hDZRNWBjALwY/D1kdWDZA>$AhCQRVWA*A>$ChC9RdWB*AG$H8lQwL1C:ki+B&kF$H>BPwQ8BHkB/EGkZ
G@V#Z: $G/kl+AiB6wD>Imt:jplCFt6J=q!dj<ePBtE#%awh&%Vu>AFw^:Lw!:F<B:+h!TWl=%QX6Y9c>ylXH@y
?69MmY d?$D*%$Ip!nXL=ej@ScMJcyjL6jS#uNNQGG5%Ww/t8%uN9$W?LhaqLjemNKV!uikDt1Y/<?em/1KKC>>
^y?lih CMYY\E@<L1cy@FG4ZH<J4b!XW@tZ+h>Xw9^h@H1mklTl?ZCPqKlu@A:N&yXh@lZ+h=kwu@<Pc4=W@lyP
kCYpZ1 8cJ<%J<kQbnKj\@@dlD%Q+T8wIcR*D4Q91@Y>%FIW9pL<P?#w9!\Gy\l1Q\DVI6/*45EydRwH\Du%$6E
=@j1dn ?c<:wiBk/q<<#$lS#/LjciKVAkmHjB:?BZyT!an#8jm9$F@nh@Yp+1:!\:+F:h#Tp+4EuPYnZ5R/AS>&
hclpR1 q4jhALh!W$>1uc9jS!?Ai1d*^JNlS*uy#$amQ:T%JFQA#9?DJ/V/j&4#t%#QMYhBQe@DibQP<^:!mHSj
5W*ISt yVbd%RJ@n6>K>&YZc!iMk*4&Wn%T?cmQyQ8T!1hCi=e$WD6I=hZa*8QMhm/hjnPpld59jR*$&&SNqHjh
Qjw1dY nTeW?DPQkL/5FPYSJ/DkSIG@EQC%EhFjj:pjT8aJ@N#deAwR?BH@BkYjE?Zn$PLHGIH@<9eljSIy?#l8
=K=4ZK ^dkwNZq1Q8F9R=+S=T99lZThKK>:AP19EPYnX$ABYSIJwQ*lE$Z>#@+9yPpdt*EQ&QY5^:FJ*\5*\FnR
YGDkSF *^Dq&@H:jNyqP?+$=G%S9lZdm4:>PPSX?LhG%Q<pny&FXB/\?Ld$a1!jdB&Q?+y%Z!ZjY\*ybqG?aA@<
X9YW:i i%:kL<j^8FmWL+KuWq&$V&p%nnY!J>V$LQ#dJeyZZRly?1:<pNtY@CqN+Sl5FiZN%$P@m?59?ec@wGCy
mZ:1E+ KK>6p9m6#Pc*%:8qeYTZc@QipQlYKn>pneS9WuuL=/S^J=XQtYH#&:!ypF+t#99*Ky9jN5@W4I@L85?\
!$AXb= ?K%5Gu+jj4J+jB>bbjFd/e%QRpt:\C<45jq6=ZXR$EHuDX9<XuwnZlP6DI\jajQd5&l>5bQ8/!/dV&d>
JZN\@6 GNKumHL<ICjNd:>Etd^CqB>@n<X9bSNR#1?p<#dd>b^\EcSQFiZSdy9jtt/Fk6NE?b\yN4?>9luTy%Q>
WWdAc4 Q:Q+4jRlqDFumQL/8M%96?K*ntjT>Tj5?@4S@$H/LFEiZ&D#&<cdIL%KqJ>hajQdI4#&%cI<Meut6*i\
GuG!FI :?q#4mX*&j^&C9IpjRGaiMHm6>L#pN@wT/GYTSK@qX95WLL$QIuj:HI6>RPJ*/V!w>wqjyQKR<hI<p$1
PiY^T6 4:@E+4i!uh?GhJe+:@4DLH+4H+J6RGc$#lq9<X9=Ry^4lE&Cpm5Q5@m6@IVHwIR5yY&hc9Fd?Ry5E@wA
8@#W#L d<p4F4?XjS@HHPphW$/*?1X<$p<kVX<<L9tq^Tjqa:H6/S9FC&55jm9dA&NbI*&udbDFd?ZVectDdIw5
bYcB&/ ?a6h#%EwA$kQ8tm&^Y@q#hhCRW!WL%^u<X9b9?M<V6>@ZVLW+4i!t%HGuE*%j&V^Y@u=iC:T!%45eXV&
%iImM\ 9XtRy1@SLwqd@FbikVKbQpm>hLdFd?XVWCimL&\9c:H+4Z\XuuMn*Y?n^Y>q*@$R$y5I@#<Y9=XZV+TC
=i8Vb$ #dJ/S*^X+X+tJL/T!5j>ViJQ1Z#VK^K@ihSn<y8M9<Zm6+wp!4e6w9^KFIM#Sjt%!IQ$ah>N:%9<X9ED
LY9iS* :Jh#Bd>>i=8tVd^QqE@:PbTeJ@BjtGu^Y<XVKDe?V?h>#PK*m66kLGnum@J4n:Q/yYI>/meZWHth^TeX
\N4l>P W%A**C4K:@!l^Y<XZ<E=@ELCL:Q+4YL6k<lRXH/%Ze@#iE<Zm@K:Z4j+4iKi4!EnEQ=&m><1LpV=e/pw
I+uA@* *%=1<X6F?BD5YFF?#^MY9%Y5@uhIZ$:%*G@j%$$wC/<k@I5Y9%XeeC5%QIRhX>9<>68ZWGeY=jj86Qm6
LAiTwc wl*H$NYm@L+qF4>XQIQ<ia$w*@t\^Y<X#*<SP+V+E@q$A8l:eTe@*Ij>j+!JQ&IA/4A*m9L:u\I^%YcY
$y5>=c H*:XdtREpk?GyiejH5G^iVQX<#A1W/L<d$>D?lbSDw>Kcd*/<Jh\jN%K=TP6<^:?H5=N6+u!6%?$#*9y
X?nXQH wXB\P=**a98<j$Eh:R/1y<p/:^F4$cL^hmw@*#:9<#ku*EuqX>9ujRj=/m+^9^@$J?8<S=!AbZjVjFhu
5u#Y9p ujiI6Vmt:/F/9tuj:<*I5#8w@P@Yia>amd4e9cJ<D@dSFLN<=P>^4D=A=VlZXwu!8%GHjXCWj?iH%uQN
Zwb*t% 1B1W!d5IQ>6/4lq%?l^I:/d!</*/S=&D59wlK6>l%@<!!4&HSjqLlq%@:M<IyQL*:j4Hah<?I5yj44P9
&cyqk1 @<h+V+>Tiem1j>SK4PNLXJ/$/l@=<mlIQ!dKZ!t*/%?L#%CQp%=6Z@@\AM1a?/ne99:lN&J/J=W@b6W@
Sk^ja+ @JDlpQ+m<euqX9*DL<D:8y@p=%yL:k%>D*Z&\<Z#$c1INe<P:eF?Q+LG:^PY*B9ckZ\!XiDQB*!6iD+h
1Xmmwd il#Ph$jTid>9!d&D#cKn/L^dLdq*5Q+GQ1BV?ZPYjBn/FPwlbAhm*C8Y9B4/M/^@P5&DTW98HZ\E<5Ju
8Jq#=L SQtl4%q!:?CBKLh41J:Z:Zy?P^dT>J*X&w558Vj$T<nDM\u@G$98DZ$P=:yb>H^1n>PlQ$Qh:XyS@t/h
&4H9$& NX/GjlQutP8wHXba+&Zw+#BHcN8wumbLjk+%Sh5^NL<<c+&nk!jn<>V%yQhP65dS$AcWJVjR?5q<T>+P
?H#y=m jRdq>4FW96^8#!T&\Y!T&?55iV9$XZ\GtmQG?+m9Y9J&/P@^?b*5Nh\=#bK*R<<FZW5:ny/@u4Lp:hBc
Q1wXZ/ <=yFQTNj6iV6$N>>FSXl+9Nq%u*yE%Ej?DKXZ&:hq@aN%FYiwQKdLQ:Zj9AtyL>C=W>c@K?jmY*<XXH?
hQw:BP &>EY@&6@\G6@p9A9YQ!9jR%q!%P$#AP@%WW>yh9\YjbyWZ+G/BYqaq&q:HnWQ:>G>i?&<GZ4eP:+85C9
!H>Y:i 8MjG4<i=+><E@uhj5@ElHKQjEQl@&&Lnk!nd9mu\9*@J9y:@?CeWQCQ\#%^6+?Pwp#<4!p>:*Md@CJ?^
d8JWlY >6I/YJZFu/Wj+n$>J@DQ*YZ^b?u*ei:?qml@+V&:@6t+h9S6YtiakW#Sp*T96+#@nFR84W5e>ayWLn$@
=<AQSd %u>SKyj$@D%QTQ4dAQ9=+4?Qpb+9:HL>ya?p=+5B$uuq=%t:9QS6+J?TScV9Tjk=nhL%TPX@?J$qD!8Z
$+?qZh a@8@Kc:uk#e5iXl=Q@L@Y?J/@uPAJR<4&*G8@4p+:@k*LHqaiTLP4d<R?NPj5?Sl=XW+q9?d=EcyJR<4
nP>:eI 9+=!>Y$1H&?N*$wh=:=jW9ulql!4QB6qqjDdyQ>+lCWQK%@F8jRhkj@L>ba<4B!Kc*8@yu1P6i8bn5<h
w@l%*1 9^HZ*@tlJR<4b?NeRY6lj*uXpwiX*$E><*epN$/!=FnqN@C<9!j</=beG9I:jKd@A=Y@b>*ZpA>^DL$4
D6ZN*\ #49mNW58Xa:G6u^QqK?<$=JLqZ6^I9tnKD@%K=be1l!JP61j1Q:*LdqWiSu!@=<F@4R#LLqW8SKjkj=C
ERPR%8 e8BWT<=WL5Vu!4@T?8Vlqy!yNFBZ@b8w=+^8T<=W6tMh@$Qq@:VpVPZA:$D/:/L<#AbL:yX9^#H*D&1*
@mK=c/ i!&=X*EJ!8D*CZ?iNc+HHI#a@^Zqb%%nni8K#?Ma@Z?m@Pq6%4m8YIX!=y?m@J8@5Mb%^eZ+VQp9eh:X
48Jba6 MAbLBky=iAu&:\im@CekM$6F@hy=8Kd^j#SQ:dLGlZa:#wMjm94*@6Y1S#@m9/DpI%H?4Z@c>X\?^q=Y
A*tMmY Q?M:hn%Zk5!pjS?qL$!*/^u:HX^dF8ZjtY*Xw$<FHXa9yi5ec>h#K#^*/ELYqL/!%4/9d?NcnbA%yc>G
DSB^KY :i6JIC>XWH5?a>YnD#^I9QdC<8@65K@uMJn#hdEPZ@1DZZa>N\E@/+Pwu6j5/>tEe+yal!@><S6&QaeD
H&SVKY Q?6mHd:$y&@d>d\N@K^ZWn%@6i9B5cDVP9^jn#QqY#Dmit>Tm@4dX*1Cjde9?j<BWE5DBBRAAkAIAJ6Y
j81Jmp dTY?c%YqEk<AAIBBAAA8AAAAdGqme!>\b*BnbG59dYFnL*XyL*N9hZJnbT>RS%B#bG6XTW^yam=\eG>m
-A$E^? 000508cd981001202b4 Page 506 of binaries2.zip
eFelTV LtJyd8%ei&\W^^u@>5:a^ll5nMNdajMtq8PAn!SkTA!e\TE&>wH6XKGJ+S=4??L#:dJ:6uFE\QRFDacE
bE$ckK JE&nT1YyqFaKVcNYjWqXp=w+VXWqT1wY1TlTXByXWSSXqhM@GwPw6><<>uq:i:a^FFWbcY:G<=9=:djj
WKDGnL jN?*M*N:l9JIa$SL>Hd5cE:GclSFn5H$p11y<b%jC6eK49dNj**6w$?:ju4t$+M=Bl+=E9<FKeuAne<D
SBC:wR %GGi$\VLZ^qj%X!@mbcV4BTZ<4K&j6PK5J#YMty@QCP4:XKjI6/%N4S&*hwN/#i59ViJpCWRkI+y?:yE
%T6\wL LENE^u9VJXdi@Dk9Z?dqH%q=c^W4:#nH!*FY4u/Dq*#<ui6+tidqRX+?^e5ZijqDZ9+cT+AqMJe1kY6R
DaA=ey %\5dydR$EPWRiEMN+c*h!pBTGmVAkuC+S+4*dyWQNKy!9!KAMM>wEHe$pB+N#T&NBk&Wa>+HIthGJRt/
pHFjVq Ql#W>hGmTj%C&iZD+/9?$V%S@%dn=eN9NW:1Da*/yFjiZLS1Eky=L1mjBCD=MM</!\LNl\1Cp@YBw584
+T$h!G hH&mVNjHm*V>A4pi8c==dY\nGPqV4?8ZD?9/yD/LmjASZ4eMSAeEH#:5#1Q/5eNRj?\R4Dy&EM1GD$AS
#94pie #RwEl@h@PEbLXk>d>d@R<8k+BI><>5?^I?NR^HQbpR8\/8qlPH\E4&ZQ%$PmhmAMA\SHYT:e^*LyGycZ
:Eeyu> LkXa>mJA/F&Y+&?#QDbG5@DX5<MpB+Pnw!RZBpj*FR4D?$1F+VYqAG8YEkbliPtc+Gky!j8EaZwFenXn
a4W6%a d5#4F%%k8Y!e=XWVLNhjb6t$MN&$ZePGDD5!dMt\J<PtDL9!5m&AAmNEVLm^CWeEthB9eTXHB+VQ5/Tj
MT6A1I N=K6k\$PiZR\aQ&<Zq#emb?/w+MJl*TK//FPi\eVJymS4W8a5BiPHR!+$^Q9%St8F%<LQMT#F$:cm*pt
puj<w# ?IhWT^bPMb+R@:A#SFS6\+96?AihnMWdy+4&\a5NPBhiuB>u>=kVD?ZB8ay!+cE<8KFlA!j/<BmP?IS?
LpSQ<6 *mLRR^T%\&B$CHXm$n6y55FkhmCJjVyk5+M:>hwe^BetHZ1#p56B>b\PZkCV?bKlFZ?<?C4mwbAD4/LJ
B>19JP np@ceIVInXXXZjVEGY49kJmFt:DX\T/jDVa:PHBH+M#C1%\+:YDHkW!HteED#::A>HCVH/+mQ=QinwhC
Z/?%Q9 98PN8aMe?8HY^@kNBiF\p:@Va:^>jn#\Kna<B%=q\NV?RmHL<Hm/iNFtQ^!>cE>P?<:nZ=$#^&u5/b!e
C*dE8P cdK6A+#p6a&\yXh%@XWj?HMTaD:*G:=*4\<BDm<y<THA+TWq8RuweB<CPn\*ASq?n/:jp+8ADCj*u+PA
#N@M&/ C=@#F8nXGi=F\ISu8BeBE=:n&RVt9ijRAd>*A*eV<PEt:mdk\!*eTYAM6*AukVGe/T?L\B#P>J>FaA+u
D5c*C< 4WdNI4CGI<E>JTX8A66\i#IIHMP6/=5E>8HY@bpE>8FPuBE+48:ky\TP+i/EBL1*<AbB*9S=Hln9wLbm
ZF/$Ve ^HJ@Zb?:M^4jtp^H%cFAm$\c=:V%ShWM1RWjpVTnc\WW^MJdYtK6VYK5Xet\9daRk$BCXqISbYBRnn&i
u^j@RM \NbN8HjHuZ9Fe<JyPC4RqP$e\uj\+=9&BybnW4jGiVap+=pW^WRRVa+qtPedpuQB^p!TMC$+\Z%c=pAt
%5uJE@ 94P6WhkGEXPRCPaTJ+FNC6EcZ1j$c#*pdtELXB4ZF%4^I&pND*:NMX\BCLR&Cb#lAe1APuM\FLka98=t
W>M/Vt KA^H$*EyBXI/wYG8IaekECRw%V*lA&HqF*4Q%46Na!WRMDTG^YheY&m*l4cM<!YlD?:L%lR@PinD/nyd
/6N>p> e#uLNt*h4<lKDHX^Xwld$5IeunqQ^XuY@Q:9Ta9\nCp*Ec1%@aAl%FbW*ECDyMYFZdDe%B^S@jJet4Pt
T<5>L? 5B!IY>6WWElcK$dNGlGm58KE@SaLhp4yj9LHPFNR&F6B6d+K19XX$Kb+V?\ApRMXXG=cyX6Bw#cPkLAj
bPFFLc \jbpJmZ=/GiyR#<*#EA@qSZH9ZRlHGY/cG%8nLlec$S+S1nP=X1BNVm&^:1il!=&cQHWRG6dZBWP\TYV
lKYQ?? y<VqGiZY1Ym&^kFct>9cBWLKlNReE$dBQyk\!e*VX>8ERjcEEdXp?h<tt@<%aT/dh6!#M<^^MW\q:1EZ
cnp8/D Y#EQF5Me<8S=5H%IMb=EWtR\RZ*W8Qd6A$yGKk6Hwy1t>KlSVh1YTJJuXTRmhWqwQ6AEqWD96+c/XcGd
5kAI@K WYtTlnn4nXBpQP&MH49/w!tCT8F$q!ESp<@w^ejtSAIL8K96nn#5NC>1Q4pnh#X?QPu4cu?ukSjhSYnu
I@TK8m kSe<#C54<Q=+T\J%qJVV$bTwS6MJ8W>MSDNSMctJcWqKTIpc5X$Y+*I1JeW#>l:XwyKTWMXmRla#QbLa
Sda@C? lX*p\YT/8&:?jJGpH+k:=RGJau%!Q*bpk%NDInc46F&L1=KWN4wVLat>$yBt/=tt@dA^JpjXSE&YqY:H
Y\DnjQ CSY+wbQI?6m$4ZR:5%Kcq$:%/e^b%m8^1ByS=Y=<4m<\YKm?W#q$u1CQR6jV*dAX\wSTXnMd&hZwaTPh
Y$!P#T 5NjLQtkm$qj:&5kD^EawX59CMc&Z<b#DSm1PF:XJKp=bZX/Y&@^bM6FM9%buZ!m$1RP1MNj&cNmiS=aS
H6lKuG ^#1DMGaN9&$1\/*=n%n#D&VIA>Paj<5PI>RPKWu\p*\5cIhbFkRjR!t=CWyBNLAq=$PNYJDk5mAi9:kF
@dK!YN 9ib4Rh4@*II&#5!CCnA/#/d=IJ$+&?c#?#w^u\=@<<p:uS8u:eyi94nSX=t?N5!naMeZWjCLKDmnKFkW
5%plH^ +t86TLiTbWEZlC>j\XK?IBPNhh9?d8:8myF!nuAPXFQ?I5^n66Z*Pc!i!h/c$C$cRDG6q\tP:SQjllWK
SPXK&Q :<Lny4\FQPjb<6l+h8G/4IhC:<FCStN>P=!QJ/8bcN=G95X$lP%p<um9bWTVjw=R5q8KJ=YpqM+aSQWt
!n@h@k $X&MmA1\PS>S<eQSXBLZ5ENbD=hqNlw%H$%BY@IJ!daVw65%Mw8w5$ib:9uR51q9%<m<t68%nl&bAYNm
^1qI\b $aAGKQk/:Mt%Ze5^IadSc#blDRMW$MliMQtIAc/ipkEG1EuqN5AAG8DJ/>WAN=pV9uw/BnmuR=QW/>9&
MhGJ+9 k1m8+T8\9RI@&!6A&#5$C:du9bY1^V!#l+mh=T58F4<6*YdGwGRaA%j?QD5DQ:y&MBSnG*uB:k?GJA<S
Hk+:L5 H14iW@\Ak?THubJR=V6+KnwW*BbL+uaXN<l51YA\u8bYWTd<CbdS^\MbNNh@c%=^9B5**6FERw!K8H9G
:?1lhM DVQdb/iTYpcW8$RyHXiH1PmmcpdTcnGlS49FbEd5ItKR@6VK&TnPaAXi&q^nt%N<pAb?^w>L9Sbi:ddw
CIbBFj M9$nC8<bInw+MK$bcnPQPnbVjW:y1KQm?MwIP:DAP?juD+y=WGT5^:cTA$6!ZwML/HJ#<ku6pEFNWe9#
>P9\yM A5L?m8Q#Hp\tJHKApW^*?:pF@N^?5#N&m\IZm=>d*K^E$^JKFmF*bLw!8TQJaDCCF#$tm\\tWK*XD4Zi
\+wFVt d9Vp=%9Y6ey^MSpAJekybDw#+iaGyCkFk/KW#Juj#K^9pVNTuSmPKy4aLMh:!iqVRl=M%+nYWb+tSqXJ
?8ejy& nGQ6L4SWLbqJDpk%q6pG*&Ft&^b^H>^T5#%#Xe^&=Qw*&^P#b4an5&K&I@uMq5ciywk^mX9IX!#pYBcX
Jyq6q$ Xt=PaIq>bWNRhtQ<K=bV@KmA<id%k/Ey?$HhXQ*k6*T1&=RWW6\Kh1pj<J91a?$+8@F?XeY=Vk&JtpRP
WLWS@d ZcWEPj<pLlEXNTYF5S*@4BHFHX*mpN\9Dmc%HlLb!Rq4ykh:IXw6K11pcTJPACL+iCD9qme#@SuJPE+X
@*pi:p bbZVm>G$nI*+b:I:nZbA&jP/e@jXh8hQnM&dy#9@Li@tLde:8#h9d4iE&ZQLBuM=GLG6VE9wPdAQ>j!\
6YSAA^ uP=K1u%SEn@1<44W&BW6pE45DFPKa:tD#X8#Ft#GylF5HmJc*wZYBttZqu$jPw55a^VJN#8+m1?#u$iR
HnRMdP Numjui9V>IRQI#@Z#^64jnL:#%^GEW=*bXH5N!uaF%a#iG!j9yy?#u&>+DV#>aa5Z/<+IdRLT/:A%?qG
p>4a:@ T89RXL!^S^&?*V@%nXTGnDe&W49da!u:Sw1Ch$>:E&@@#9W1BmB4Q:4e=SwhW#%w6&LaHyn9wPn!nYHd
qM!qkG &Q+Eu%:655G%K>Mhw?6Y+Vb/ZMu8qFl/?@TQAiBq=#FAC%WnYTueSA<S&ZRE<8!>S=c$!GJCM9hT=Nua
VGBtZB JjiuE==jm46D:<W4?d1SB41L$\l$8RQ+^SpG<D%5Gp!iT>MM+Fck&?MKhB>j!<*F8c8>G9phm%BN&SH1
>$Zcpi qN@takwS1uht#4@P^@uSjqX#ucj%+K&KMTpqD<=mWQm@e?TSK*dppXq^=JFbe8RV5?dIR>jKpW88\ddC
/@WM59 ?b9ekpW:N+hI@FkbmEES&ZLCA6m/P=qw^9Lj/JM1CuetHIuEePTdP:i%hKD?*65Sd4pF!*<q+/u%EAk5
uch%Ic D4e@kt8@RB%:wW\eyt>Hnkn#Ai:+Fc&jFBwAc8/u>ijkIEDbS:V?QL\E5HAQ4a@CL\EY9WL4b?F6@D^G
mu1V9l /$?VI>DcP&u>GiE*AJZ$6<Y+MQwWwCyN//iE@\De?\/6Q^9A9p51cj%dkeeAq1&u>SeCcJM4u1D%d\hi
%ZhAp< B:mSdpR4nlNXq:*LbX+F5LmF!^#H?l6e=yMw=+Ne=l@lJ?MbJYMZQeqqQw@%w%!&6Vn&JT:@>:B?ke8Q
>w\klS Mm:i#GRPLML/JT=#GPY<ue8Mm>aXQX#t:/Pe%X#tQ/N8&j$il+Ztc<pn>Q9iFd!hqQj!>lVi%\6MHpBh
S1E1wZ LV4F?/DMqh@qMyPjkS!m>VjJt==E%@VNX6SN+B8<V^Q/<%P<D<dHwyP<#%/Aie?!H*\LH?C>WJuL#dNX
X6R6c: 5TEbVeuhla$d651ySKB^k?8u#HQdM4Im:5Ch?X^m%4SYGw:&$>lFt@N%KDQj*Ban56K9LCR@wXcVeh#%
RZPR&D *<*CVZbLmhXm1=bS!YL!AbEFtIYWV!T9SPb51iT^mN<uE&F?G#>DaALbNqm5X*bLlVuCSG/$:*:F4BF=
wn^cMR +JWN%mNki8AC=^&=@uT@Xikl?A*pjbI5Y8@Yba%Si8m!t:%R%$Bi8e8HLN4XL?Fp5?<YjNyYiLTJ1%8m
yFZjAb jXLmVn@5lnaMp8S6Q\j1*b4*u!u<F%BLA\RWAAIACACdXt$q1t?ht%ALAACAJAAALkAAAG^yauM9eGh\
H?d\yA a&S4L&%la!>%cT>#d*X!a&W9WEhRe&S4XWqMcYI8euN!a!=mcY:6Yu%\G<WX*:Q5TLHqKHHmjJCAF/ky
NFKKtH =5M+EZRaPwN54NR+=ENaD5P$W>4#/YJhI>&yh/eEN:SS/MCIEkmlya\:uatu6DMREl4?Km$D$aSycVy&
mJ%:md p<J$tpJMM8q+pyalFY*nYLcp/>9hP>*JH+qJp^qk?lV=9h@894j99Z&:6=KC=we/Rqyp<<dP6XJQ5/1y
>XeQAE A9yp%BZ8ck<1!X=8W99%^m9@Zlq:>a$:q5/k8GNH@tZCmiI%B^G/G6=X4b4W^i9m8tSMq^I^TXR4B=1Y
:11YEe y>@e*JcMTE1H1G?wYiY@$:@T*>!>iq$Il=YpKwnNRmLB^=Si\nYE:8qe*^aAt5ulX@i9G#ShuLku1ZZK
nuq$AV 81nKjG#%\+^9qDjL!qc=e5<%u9VBd<CWudwa4@#b65Zy#QjYh4RFJW&IKXyTFd6Xmbh:a/I4jZSSPmMw
WImPHq EXFaJ<qTQBpQ<nwjq4+nXn:*9C?hIiliZw:ESLY:L\GNd%!X#t!t4YAh*Gk^Hc6EcJkT5uJbaZKZNeKk
-Ai:cL 000fcb1f491001202b4 Page 507 of binaries2.zip
!@8qDa BNLnhM\KiK<uHdRN@i*n5Wj8d6n%NyFVVHe?9C!/%*!VqHPqPYV!y+m&w$C1IiM:/e//^4k<cWkFMk$u
?>h16w jXu*tC69nRW?CAT#eWFKq?n>y%qH/I=KG6cm9CyGeE#1WZt%D$9^SE!Mm:K8aV$1+wlE/p*D5KyakRaX
qGqtkZ C$w<45k+1aE5pa4c^A5mFm$qbSQXa%86GZ<P$@b=$&qq&!4F9Xk:+E6^n**@eZmu8L$95/*G!JmYT6*W
+FZCeV ln6%%VhdDq\Zcu&6=<F:Z\5@jFj&nt#DTZjKG8SPNb\MbAQb:YQ5SYSHQ:XSpb4jmkhRCL*aG9K<iH@w
8%@nDK ywH/WQXAFjwpNm\@&wwC%#p*QQjL*B*8ln4*QK+C=e65FLed=BYAX$QSZiTK6Q<!=TPRct&>B%/6n:Rh
m^ERl\ Cn:d@t#4w+F=FX?wYFFS!a&SIaHW>k^>=eEQ?kwWZZu!a9*MD^eeW*Nc=4V+^n\iZ>y<n>q?&Q*PX/p:
1HaGSd NjtSaHtcbjBIh9>AJyQbiCK:*\5EQEQySNbd@h=HZm@kQ*^p+k@&We#/</!<Vp!JjC1qynd=&Q!?5jRi
pAt1mt I8RG$@%:kPi>/TiA?*d?Q9%Ej^d=$8pT:!i<H!B\qP99y?M6:59%:<p/:M:Kl>4lw=RhH^\m\uE+:+iB
eZG&D9 H&Y<N8MFjlVXp1jAJD=ENI<DJPQbLmQtlp&DnF&tQJCqk9l*pdWm*D8aQ\F=wB#m*\Nit9!IAZua+#$!
:WhNCy tCX&9aQW6G>wiDl44965/5EH>RCM%ANmuLWDl*yk@CMVj#BA8hq@KjXk#85dJEFRb\5H!@u\RVAF@ITS
VJlFRj <Yb>R!jiL^\bAn=5WQ:?//<ZBwi!^M=^Ft?iyAWwT>JBMLnEEq%iGhP5Bh1:q+RPeb*hT@qJ>A<u@?Zb
!X?=?! 9eaAZb#BD+m6X<:8w*\t:Mn16MSh>L+=<@FCcBS\IXeabZVkRI:m$VI</mAVk$w?=<V=*KV?jMGJuj1n
Hwk+bw PThh&L%bEVi:aiZGDiQW1XMnySbnbM$c\KjQtA*GG4TGDDnN5HGKhN5DmQI$iGVpnIqHSmk<dYJpuB+b
::#bnF eWBpuDq>GqAJk#<WGVQ=i*q!MA:pSDjjjH/5%DI?h8+ecZnAdBk@l=^+@GdTVZB8uGFC=&%<u5ETHn6@
&e?c9F upIVR\PlEpVnD%DK=WwPnJPKKQjRmV+%hXA1Xdd8BpjJa=T\^?M^QH:D4AMd5#1k&MM\1RPGtX8pDkk&
RS66>F +F@JZ/:W#Xw<jpLGyD%?Pe+Dny$HLCD8\AE@^X\b=l^pauwiPHE?N/p@Z*Bmy#:uh>IXPk<tGVM<ySY\
YM*H>A M&4+H:wk>kM&nVAM5we8P<Xp8N>cbk@4LtH@R+RAt=M!h@^q/&1W15VE5%@&T>$L1EDIAeeuJ9KPl5IE
Y<6VNB iSdNmA9F@ETlWC^cDeZSe/Qu^*IVSc5@D>aAG=Q/nXu&F^qhTlEk=^*<ycEZqEj=%F5:h8!AP@lLV*/C
yyk<@: P@l5:nw8Q:94?F$6>K:V+tylh^w@8>5ALPQYZejXWn8d8<:@81eS&>MIHV6&DCF4V^NI@nFM/Bl6A1>L
^lcTQT ?lVctMGb5WpEp$Kq@bhyV/MK1nZ:9%*8>1kp<L$K8qV!t4\K&S<e4=BXV*8WX\YFn*$GjQ&@%T6m>RaW
Jc58l? RSH8aEWRic!t8mjulVyC8E5WyISE9lbDmYyw9w1PjId:n*$\%D*nkyG$6=u$wk?=RWj95$8IuZaqFlMF
N?phlT HZj^epTJa@KFK6XaRVY!ZNGl<eP16ymw/nQ&@<nSj\96j+5:=Pl@dqFalI1PTuI99p@5\&FS*TK1!DH?
TmT#y# L&Znj*#S<iZ&u:@AiHQ@Z=E>SXeJnZP9PZ#bTXey^G6cI14!t8n$+nN:Iq$S1:R&8Zqq&Z61MeqiYP1X
Byl=y8 !XyP#8I114G/VPQy=c!c=W&TG8h%TbEhcqT4lYy6K>Qc6a^wBWXB:W6My*Mq%?mtciLiZWj<IdW:KidK
1/6c49 +&l=hiNKjGQn165c@W&84uCdK^kP8\KBRQ%/BY6tyncLjS4iyCVq!Fi/w!KBiK8pS>p*/y%B@E:n!ue^
p6n#p@ yEiIm8\:?ESyt8dcYyJ9Nq+u*>/Dh1C%8&\R@c=ieCa=wtBb$bqNMBGKmYTa49bl9yiZ=Pc1^yY*Nc=!
mEP+An k?9E6%4k!mde8I1m^+l^/l4%K<y4tMh^ThNIKG&SmESt+GQP>aHWNGQ/&\LXE*mb#N=D#WRkelYLetp\
1Cah%% CWXJ/nVRte$>ewqiRK*y9MC5K%6q$Dh@u!Bb%^Y5>PmRkI6M@uM!ic?1JBN5hwEaqYRNK#JaXZFeWWY&
5m%ieN 1uShL81YbtcHtb^%inV^Rmb@i9thuJI</>eh#dR$!\S1#R9Mu^46J&I>FNtWSt%uq^lZ6lC@LtmRSdlJ
W/J&Ze lYelGchc?nktccVM?@AYTau^85m&n^KVlD+5cn4jA\PmbyLb4%p$DnPAen9NZ?1P<n1GhTLLR@wFSXZJ
uV&h:b a:l5Q$:bVDYRNltGRSTH=>/jFNW?Im$M1awk5y^*mXw!yt8HQYFSn6BlRVEtWwZ1wKRSL$H$6MeWM9#\
X>?ZP1 6^#Bt<XCFqiTp!JWneBD&iA?JYu6<mm@lS\BjVmlTq6IDtmIhP>dmW$paR1BhbBRITM>ap#bi6h!c$p&
6Q%Sc1 p1%&I$p%HEmRk5cXVbN@9uah/6=*/^q!!/m<D5$N46*RAThwX:C#i!*\5^FB:$Fi:kjB6S$QIt@FDapE
imB8hk 4<NSjcm>9ZM9<D>Kkua>eqi<B@^&=HdhBj^P+D<Jh*hhD^?*^88iSAmnSZ>th!T$AGTD*akR^1n?cudZ
<S\<9b RdiA9IHhc>DhIC95DwM/Rh:F:mjwIbAQ545H&kd!Q>t#H?*GcQE&>mSDL&C$=Nj5GaZiAQqD>8SB^#Fc
iTq%/Y im$:>XEP=Fjb:e+\MFy\n9qG=RutG=H4PPadqh*MN!4ZM6?w9JD=S8Xq#De1N#DjmL!a!W>S?SjMN!1@
AYJI@6 #H!nM9NuN=GZd4VG&E>PK4>y&RH&L<5*YM$dLN>A@1w%L<mq8GChtm#:IH@hmlHp*Xa5IQ@YmkZpuBWL
Pu:Lby 4PG6X1=A=t&=46G&Z:jN6qu*J>8*lX?$jX9+ZZ88li@ce!%158hc6N*&j*GnHi@mZ>p=YXJ4=&TJaMi%
iB?p=t >G9&t1Ld&VeHNA>QE:HtN>V@=/n<P!4@qey9E:tT%tHNaT4VGG5G1W#Z1?ahK9@hu191Xn9&?W&&@cy9
tedYHd &@c4#6u&=@Vb>8eWdQ98Hdb>V=X6*@PE\*:e6n?*%4bj9eC&Z%N9&@e85?*ZZt*du*i6dh@uYL9=H:P<
ZDmk+b eV/wQjwn!@#TRa/D>L<N#N6AV!*NlDYP#!<LPpS+wMAl6PG?&>y=YSBn%ZdLI9clAIh%Zp>c&m8tc<R*
WiqZRk 48jna1Tyul!q8F5^Q$/a9R95C=4b5t#1hhZ58YcGc/p%?:V*V:P#99\!cEX98lnYXblSR@<FWE5BAlRD
pJKi1m FAACAAkAlqX6Ja*$>8wJbRAAAI$DACpAAAAAAAAAAAAAAKTBAAAAAGN5cYX8hHM9eGh\L&%la!>RS%B$
Iwj9MG d&>5e!>RS%B$d&>5e!=\etw8atq8WE5BAlRDFAACAAkAmXX6JYJ\wSYkJkAAAIIAADEAAAAAAAAAAAAA
Ku=D@M AKTBWGWAAGN5cYX8hHM9eGh\L&%la!>RS%B$d&>5e!>#d*X!a&W9WEhRhG>9dHM8eHB9am=mcY=RT\EC
A9MtHM FAMWAAIACACJXY$qnAEwYt5lARAA#\EAMRAAAAAAAAAAAAAAyIE@nAAAa&^ybY=$e!>\b*A9dYFnL%BH
4PPqJ^ WHS9d&^#L*N9hZJnbT>RS%B$d&>5e!=!e*JnLtJydqBLARIWA^RAAkAIAI6XdTYm&\S=XREAAIADAAA!
I#CFN\ AAAAAAAAAAAAAACpkjt6ARBndGqqduS#L*BueC>6aYM9W&lletXpL$NVcGF!bYSRet>uetX#e$Jlem=!
mBT1^! e*JnLtJydqBLARIWA^RAAkAIAI6XdTZ4M<hk@AAAAAACAAAwAAAAAAAAAAAAAACpkb/9ARBndGqqduS#
LHX%a= L*BueC>6aYM9W&lletXpL%BHWFB!bYb#LuJ#etM8atq8WE5BAlRDFAACAAkAm%X6JYJ<GXeAARAAkAIA
G1t!WX ACwAAAAAAAAAAAAAAKTB+LABAGN5cYX8hHM9eGh\L&%la!>VcGF!bYR9WEhRXtX!e&q9dm=!e*JnLtJy
<ZB%iF dqBLARIWA^RAAkAIAI^XdTX&+*Q94\EAAIADAAA&AAAAAAAAAAEAAACpkTm!ARBndGqqduS#L*BueC>6
V*c?LF aYM9W&lletXpL%Nyb&=lhHX!bXN$aZS%e$%qe*Nlb&W8euN!a!=mcY=RT\ECFAMWAAIACACNXY$q%ECK
Xm6bia Q&\CAAAABRAASkAAAAAAAAAAAAAAyIE46AEAa&^ybY=$e!>\b*A9dYFnL%NwaZJqbC>DWEhRSY=nd&Sq
DLKyMG epSqa&>pbZJ#L$NRS%BFdtN9bGX!SGXnd&Sqem=!e*JnLtJydqBLARIWA^RAAkAIAJBXdTXhc!e?N\EA
FF/bEj AIACAABTAAAAAAAAAAEAAACpkj8&ARBndGqqduS#L*BueC>6aYM9W&lletXpL$NTbZN$d*JqWG>!hEN9
D5W^Rk dG>!e$F$hGFncG%qduR9R%Jqe*S9etXRd*J$R&>5d*J#RZS$LuB\d&I8atq8WE5BAlRDFAACAAkAqXX6
G5N19n JY*1%q>IM\AAAF5CADeAAAAAAAAAAAAAAKTBw4kBAGN5cYX8hHM9eGh\L&%la!>VcGF!bYR9VWXVIFJq
KmNyM/ e&>%etNqL$%FW%Jqe&>%etNqLuB!cm=mcY=RT\ECFAMWAAIACACYXY$qtAN@:tpCAAAABAAAPRAAAAAA
dn@Kc# AAAAAAAAyIE@:AEAa&^ybY=$e!>\b*A9dYFnL%NwaZJqbC>VcG>*TY=yhEqnd&+9W&l9h$q8cZSJa&>8
m648F> LuJ#etM8atq8WE5BAlRDFAACAAkA1FX6JY=nKik6^\<AAGkcAC<AAAAAAAAAAAAAAKTB@?+BAGN5cYX8
L<DY&@ hHM9eGh\L&%la!>yduN$aY^5L&S9a*M9WEhRIDa8MCBNaY=%aY\8atq8WE5BAlRDFAACAAkA1XX6JVAB
%wQGQC **tMkAEAkH\CADeAAAAAAAAAAAAAAKTBidaSAGN5cYX8hHM9eGh\L&%la!>yduN$aY^5L&S9a*M9WEhR
n&Rt*m IEq8e*SldG^lhGq9dmBHhYqpbT=mcY=RT\ECFAMWAAIACADpT&+qkamyIBW+DACAeA\AKRAAAAAAAAAA
XdF!P^ AAAA:aFcN^MAa&^ybY=$e!>\b*A9dYFnL&q8e*SldG\9TY=#hGF5dGX!LuNqaT=mcY=RT\ECFAMWAAIA
kT88dG CACdXY$qRE$@HMEdAAAA4AAARkAAAAAAAAAAAAAAyIG&d^<Aa&^ybY=$e!>\b*A9dYFnL&q8e*SldG\9
udwhiI TY=#hGF5dEFpdYq8IFJqe&>%etNqL$q8e*SldG^BbG%ydm=\etw8atq8WE5BAlRDFAACAAkA1XX6JbFV
Ft=N9\ <DLCLAAAkI\CAB<AAAAAAAAAAAAAAKTB%+5jAGN5cYX8hHM9eGh\L&%la!>ChYq5bDa\LuB!cm=mcY=R
J9tL6w T\ECFAMWAAIACAB=Xt$q4dRB4/$BAACAA\AAMkAAAAAAAAAAAAAAyIHY8B<AdGqme!>\bt\9dYFnL*B9
%K<l\d h&X!eG^lduR9R$hBWHJ9b*Jqe*NEcYF5d&e8eHB9am=mcY=RT\ECFAMWAAIACAB/Xt$qX&C\ZJWFAACA
Y=w=<K FAAALkAAAAAAAAAAAAAAyIHV8l<AdGqme!>\bt\9dYFnL*B9h&X!eG^lduR9R%hlet=ydthBdGX!hC=\
@L&m&H eG>mLtJydqBLARIWA^RAAkAIAHyYdTYNaDYl^\EAAAAEAAA$AAAAAAAAAAAAAACpkdVAH\B5cYJ#L*Bt
-AB\hD 0015dfab792001202b4 Page 508 of binaries2.zip
!CiccK dC>6aYM9eG>*bZJ\dGF8hC>RSp^NaYNDhZN$d&%DdGF#e&X#LuB\d&I8atq8WE5BAlRDFAACAAkAjXb6
Z68Y5J JaS4A#*dARAAAAMAACpAAAAAAAAAARAAAKTB#eIjAG^yauM9eGb5L&%la!>%hGq5cZSybZM9VYFnSZJ!
8=QQi5 d*J#LuJ#etM8atq8WE5BAlRDFAACAAkAkXb6JZMWwhW!AkAAkAeAAC\AAAAAAAAAAAAAAKTB:<RjAG^y
=6%1cK auM9eGb5L&%la!>%hGq5cZSybZM9X&F!dtq8b$F5bZJ$LuJ#etM8atq8WE5BAlRDFAACAAkApXb6JdR!
6!:4BM A@F<wkAAkFEGACIAAAAAAAAAAAAAAKTBc<ejAG^yauM9eGh\a&S4L&%la!>5cYI9WEhRe&S4LuB!cm=m
$kM@Fn cY=RT\ECFAMWAAIACACWXt$qh%>J9ClKAACAkAMAM\AAAAAAAAAAAAAAyIEucmAAdGqme!>\b*BnbG59
yiFJpa dYFnL&=qhHh9et65cYI9WEhRe&S4VtX$h&>!c$^yam=\etw8atq8WE5BAlRDFAACAAkAqXb6Jb5lLY:i
cWALk@ KAAAkDECACMAAAAAAAAAAAAAAKTBwLRkAG^yauM9eGh\a&S4L&%la!>ChYq5bEF5dFNET!=\etw8atq8
J>lKcc WE5BAlRDFAACAAkAq%b6JdS<hKRiARAAkAIAAC\AAAAAAAAAAAAAAKTB9>$kAG^yauM9eGh\a&S4L&%l
dZ=$?J a!>#cGF!bYR9WEhRa&S4W&lletXpLuJ#etM8atq8WE5BAlRDFAACAAkAtFb6JbmlbXI6ckAAAQ<DACaA
Gt+i:= AAAAAAAAAAAAAKTBJ><kAG^yauM9eGh\a&S4L&%la!>%cT>RS%B#bG6XTW^yam=\etw8atq8WE5BAlRD
dYj?+E FAACAAkAt%b6Jd=4XcWTD\AAkEEAAC+AAAAAAAAAAAAAAKTBtEplAG^yauM9eGh\a&S4L&%la!>%cT>#
*^#5AE d*X!a&W9WEhRe&S4XWqMcYI8eHB9am=mcY=RT\ECFAMWAAIACACdXt$q1t?ht%ALAACAJAAALkAAAAAA
w@VB$A AAAAAAAAyIH&YCEAdGqme!>\b*BnbG59dYFnL*XyL*N9hZJnbT>RS%B#bG6XTW^yam=!e*JnLtJydqBL
ZjlTJ9 BRaAAAAAHAAeAFRKAACTbCEAAAB-
